summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.appveyor.yml2
-rw-r--r--.editorconfig2
-rw-r--r--.travis.yml3
-rw-r--r--AUTHORS.md5
-rw-r--r--CONTRIBUTING.md18
-rw-r--r--COPYRIGHT.txt49
-rw-r--r--DONORS.md129
-rw-r--r--LICENSE.txt4
-rw-r--r--SConstruct15
-rw-r--r--core/SCsub22
-rw-r--r--core/allocators.h4
-rw-r--r--core/array.cpp4
-rw-r--r--core/array.h4
-rw-r--r--core/bind/core_bind.cpp28
-rw-r--r--core/bind/core_bind.h7
-rw-r--r--core/class_db.cpp7
-rw-r--r--core/class_db.h4
-rw-r--r--core/color.cpp4
-rw-r--r--core/color.h4
-rw-r--r--core/command_queue_mt.cpp4
-rw-r--r--core/command_queue_mt.h4
-rw-r--r--core/compressed_translation.cpp6
-rw-r--r--core/compressed_translation.h4
-rw-r--r--core/core_string_names.cpp51
-rw-r--r--core/core_string_names.h4
-rw-r--r--core/cowdata.h65
-rw-r--r--core/dictionary.cpp13
-rw-r--r--core/dictionary.h5
-rw-r--r--core/dvector.cpp4
-rw-r--r--core/dvector.h16
-rw-r--r--core/engine.cpp4
-rw-r--r--core/engine.h4
-rw-r--r--core/error_list.h4
-rw-r--r--core/error_macros.cpp4
-rw-r--r--core/error_macros.h4
-rw-r--r--core/func_ref.cpp9
-rw-r--r--core/func_ref.h4
-rw-r--r--core/global_constants.cpp4
-rw-r--r--core/global_constants.h4
-rw-r--r--core/hash_map.h4
-rw-r--r--core/hashfuncs.h4
-rw-r--r--core/image.cpp16
-rw-r--r--core/image.h4
-rw-r--r--core/input_map.cpp4
-rw-r--r--core/input_map.h4
-rw-r--r--core/int_types.h4
-rw-r--r--core/io/compression.cpp10
-rw-r--r--core/io/compression.h4
-rw-r--r--core/io/config_file.cpp4
-rw-r--r--core/io/config_file.h4
-rw-r--r--core/io/file_access_buffered.cpp4
-rw-r--r--core/io/file_access_buffered.h4
-rw-r--r--core/io/file_access_buffered_fa.h4
-rw-r--r--core/io/file_access_compressed.cpp39
-rw-r--r--core/io/file_access_compressed.h4
-rw-r--r--core/io/file_access_encrypted.cpp4
-rw-r--r--core/io/file_access_encrypted.h4
-rw-r--r--core/io/file_access_memory.cpp4
-rw-r--r--core/io/file_access_memory.h4
-rw-r--r--core/io/file_access_network.cpp4
-rw-r--r--core/io/file_access_network.h4
-rw-r--r--core/io/file_access_pack.cpp4
-rw-r--r--core/io/file_access_pack.h4
-rw-r--r--core/io/file_access_zip.cpp93
-rw-r--r--core/io/file_access_zip.h4
-rw-r--r--core/io/http_client.cpp4
-rw-r--r--core/io/http_client.h4
-rw-r--r--core/io/image_loader.cpp41
-rw-r--r--core/io/image_loader.h18
-rw-r--r--core/io/ip.cpp4
-rw-r--r--core/io/ip.h4
-rw-r--r--core/io/ip_address.cpp4
-rw-r--r--core/io/ip_address.h4
-rw-r--r--core/io/json.cpp4
-rw-r--r--core/io/json.h4
-rw-r--r--core/io/logger.cpp17
-rw-r--r--core/io/logger.h4
-rw-r--r--core/io/marshalls.cpp9
-rw-r--r--core/io/marshalls.h4
-rw-r--r--core/io/multiplayer_api.cpp9
-rw-r--r--core/io/multiplayer_api.h4
-rw-r--r--core/io/net_socket.cpp4
-rw-r--r--core/io/net_socket.h4
-rw-r--r--core/io/networked_multiplayer_peer.cpp4
-rw-r--r--core/io/networked_multiplayer_peer.h4
-rw-r--r--core/io/packet_peer.cpp11
-rw-r--r--core/io/packet_peer.h4
-rw-r--r--core/io/packet_peer_udp.cpp17
-rw-r--r--core/io/packet_peer_udp.h4
-rw-r--r--core/io/pck_packer.cpp4
-rw-r--r--core/io/pck_packer.h4
-rw-r--r--core/io/resource_format_binary.cpp15
-rw-r--r--core/io/resource_format_binary.h7
-rw-r--r--core/io/resource_import.cpp4
-rw-r--r--core/io/resource_import.h6
-rw-r--r--core/io/resource_loader.cpp200
-rw-r--r--core/io/resource_loader.h33
-rw-r--r--core/io/resource_saver.cpp154
-rw-r--r--core/io/resource_saver.h31
-rw-r--r--core/io/stream_peer.cpp4
-rw-r--r--core/io/stream_peer.h4
-rw-r--r--core/io/stream_peer_ssl.cpp4
-rw-r--r--core/io/stream_peer_ssl.h4
-rw-r--r--core/io/stream_peer_tcp.cpp15
-rw-r--r--core/io/stream_peer_tcp.h4
-rw-r--r--core/io/tcp_server.cpp9
-rw-r--r--core/io/tcp_server.h4
-rw-r--r--core/io/translation_loader_po.cpp4
-rw-r--r--core/io/translation_loader_po.h5
-rw-r--r--core/io/xml_parser.cpp4
-rw-r--r--core/io/xml_parser.h4
-rw-r--r--core/io/zip_io.cpp4
-rw-r--r--core/io/zip_io.h4
-rw-r--r--core/list.h4
-rw-r--r--core/map.h4
-rw-r--r--core/math/a_star.cpp4
-rw-r--r--core/math/a_star.h4
-rw-r--r--core/math/aabb.cpp4
-rw-r--r--core/math/aabb.h4
-rw-r--r--core/math/audio_frame.cpp4
-rw-r--r--core/math/audio_frame.h4
-rw-r--r--core/math/bsp_tree.cpp4
-rw-r--r--core/math/bsp_tree.h4
-rw-r--r--core/math/camera_matrix.cpp4
-rw-r--r--core/math/camera_matrix.h4
-rw-r--r--core/math/delaunay.h4
-rw-r--r--core/math/expression.cpp18
-rw-r--r--core/math/expression.h8
-rw-r--r--core/math/face3.cpp4
-rw-r--r--core/math/face3.h4
-rw-r--r--core/math/geometry.cpp6
-rw-r--r--core/math/geometry.h36
-rw-r--r--core/math/math_defs.h8
-rw-r--r--core/math/math_fieldwise.cpp4
-rw-r--r--core/math/math_fieldwise.h4
-rw-r--r--core/math/math_funcs.cpp4
-rw-r--r--core/math/math_funcs.h4
-rw-r--r--core/math/matrix3.cpp4
-rw-r--r--core/math/matrix3.h4
-rw-r--r--core/math/octree.h4
-rw-r--r--core/math/plane.cpp4
-rw-r--r--core/math/plane.h9
-rw-r--r--core/math/quat.cpp4
-rw-r--r--core/math/quat.h32
-rw-r--r--core/math/quick_hull.cpp4
-rw-r--r--core/math/quick_hull.h4
-rw-r--r--core/math/random_number_generator.cpp7
-rw-r--r--core/math/random_number_generator.h11
-rw-r--r--core/math/random_pcg.cpp4
-rw-r--r--core/math/random_pcg.h8
-rw-r--r--core/math/rect2.cpp4
-rw-r--r--core/math/rect2.h4
-rw-r--r--core/math/transform.cpp4
-rw-r--r--core/math/transform.h4
-rw-r--r--core/math/transform_2d.cpp4
-rw-r--r--core/math/transform_2d.h4
-rw-r--r--core/math/triangle_mesh.cpp4
-rw-r--r--core/math/triangle_mesh.h4
-rw-r--r--core/math/triangulate.cpp4
-rw-r--r--core/math/triangulate.h4
-rw-r--r--core/math/vector2.cpp4
-rw-r--r--core/math/vector2.h4
-rw-r--r--core/math/vector3.cpp4
-rw-r--r--core/math/vector3.h4
-rw-r--r--core/message_queue.cpp16
-rw-r--r--core/message_queue.h8
-rw-r--r--core/method_bind.cpp4
-rw-r--r--core/method_bind.h4
-rw-r--r--core/method_ptrcall.h4
-rw-r--r--core/node_path.cpp4
-rw-r--r--core/node_path.h4
-rw-r--r--core/oa_hash_map.h4
-rw-r--r--core/object.cpp20
-rw-r--r--core/object.h5
-rw-r--r--core/ordered_hash_map.h4
-rw-r--r--core/os/copymem.h4
-rw-r--r--core/os/dir_access.cpp16
-rw-r--r--core/os/dir_access.h4
-rw-r--r--core/os/file_access.cpp9
-rw-r--r--core/os/file_access.h4
-rw-r--r--core/os/input.cpp4
-rw-r--r--core/os/input.h4
-rw-r--r--core/os/input_event.cpp4
-rw-r--r--core/os/input_event.h4
-rw-r--r--core/os/keyboard.cpp4
-rw-r--r--core/os/keyboard.h4
-rw-r--r--core/os/main_loop.cpp5
-rw-r--r--core/os/main_loop.h5
-rw-r--r--core/os/memory.cpp4
-rw-r--r--core/os/memory.h32
-rw-r--r--core/os/midi_driver.cpp4
-rw-r--r--core/os/midi_driver.h4
-rw-r--r--core/os/mutex.cpp4
-rw-r--r--core/os/mutex.h4
-rw-r--r--core/os/os.cpp7
-rw-r--r--core/os/os.h9
-rw-r--r--core/os/rw_lock.cpp4
-rw-r--r--core/os/rw_lock.h4
-rw-r--r--core/os/semaphore.cpp4
-rw-r--r--core/os/semaphore.h4
-rw-r--r--core/os/shell.cpp4
-rw-r--r--core/os/shell.h4
-rw-r--r--core/os/thread.cpp4
-rw-r--r--core/os/thread.h4
-rw-r--r--core/os/thread_dummy.cpp4
-rw-r--r--core/os/thread_dummy.h4
-rw-r--r--core/os/thread_safe.cpp4
-rw-r--r--core/os/thread_safe.h4
-rw-r--r--core/os/threaded_array_processor.h4
-rw-r--r--core/packed_data_container.cpp4
-rw-r--r--core/packed_data_container.h4
-rw-r--r--core/pair.h4
-rw-r--r--core/path_remap.cpp4
-rw-r--r--core/path_remap.h4
-rw-r--r--core/pool_allocator.cpp4
-rw-r--r--core/pool_allocator.h4
-rw-r--r--core/print_string.cpp4
-rw-r--r--core/print_string.h4
-rw-r--r--core/project_settings.cpp47
-rw-r--r--core/project_settings.h12
-rw-r--r--core/ref_ptr.cpp4
-rw-r--r--core/ref_ptr.h4
-rw-r--r--core/reference.cpp8
-rw-r--r--core/reference.h4
-rw-r--r--core/register_core_types.cpp50
-rw-r--r--core/register_core_types.h4
-rw-r--r--core/resource.cpp4
-rw-r--r--core/resource.h4
-rw-r--r--core/rid.cpp4
-rw-r--r--core/rid.h4
-rw-r--r--core/ring_buffer.h4
-rw-r--r--core/safe_refcount.cpp4
-rw-r--r--core/safe_refcount.h4
-rw-r--r--core/script_debugger_local.cpp4
-rw-r--r--core/script_debugger_local.h4
-rw-r--r--core/script_debugger_remote.cpp6
-rw-r--r--core/script_debugger_remote.h4
-rw-r--r--core/script_language.cpp23
-rw-r--r--core/script_language.h16
-rw-r--r--core/self_list.h4
-rw-r--r--core/set.h4
-rw-r--r--core/simple_type.h4
-rw-r--r--core/sort.h4
-rw-r--r--core/string_buffer.h4
-rw-r--r--core/string_builder.cpp4
-rw-r--r--core/string_builder.h4
-rw-r--r--core/string_db.cpp4
-rw-r--r--core/string_db.h4
-rw-r--r--core/translation.cpp4
-rw-r--r--core/translation.h4
-rw-r--r--core/type_info.h4
-rw-r--r--core/typedefs.h4
-rw-r--r--core/ucaps.h4
-rw-r--r--core/undo_redo.cpp30
-rw-r--r--core/undo_redo.h6
-rw-r--r--core/ustring.cpp30
-rw-r--r--core/ustring.h64
-rw-r--r--core/variant.cpp16
-rw-r--r--core/variant.h4
-rw-r--r--core/variant_call.cpp8
-rw-r--r--core/variant_construct_string.cpp4
-rw-r--r--core/variant_op.cpp8
-rw-r--r--core/variant_parser.cpp4
-rw-r--r--core/variant_parser.h7
-rw-r--r--core/vector.h77
-rw-r--r--core/version.h4
-rw-r--r--core/vmap.h4
-rw-r--r--core/vset.h4
-rw-r--r--doc/Doxyfile126
-rw-r--r--doc/Makefile2
-rw-r--r--doc/classes/@GDScript.xml54
-rw-r--r--doc/classes/@GlobalScope.xml2
-rw-r--r--doc/classes/ARVRAnchor.xml6
-rw-r--r--doc/classes/ARVRCamera.xml6
-rw-r--r--doc/classes/ARVRController.xml6
-rw-r--r--doc/classes/ARVRInterface.xml4
-rw-r--r--doc/classes/ARVROrigin.xml2
-rw-r--r--doc/classes/ARVRServer.xml2
-rw-r--r--doc/classes/AStar.xml43
-rw-r--r--doc/classes/AcceptDialog.xml2
-rw-r--r--doc/classes/AnimatedSprite.xml8
-rw-r--r--doc/classes/AnimatedSprite3D.xml2
-rw-r--r--doc/classes/Animation.xml4
-rw-r--r--doc/classes/AnimationNode.xml58
-rw-r--r--doc/classes/AnimationNodeBlendSpace2D.xml14
-rw-r--r--doc/classes/AnimationPlayer.xml6
-rw-r--r--doc/classes/AnimationTreePlayer.xml2
-rw-r--r--doc/classes/Area.xml28
-rw-r--r--doc/classes/Area2D.xml24
-rw-r--r--doc/classes/Array.xml8
-rw-r--r--doc/classes/ArrayMesh.xml6
-rw-r--r--doc/classes/AtlasTexture.xml2
-rw-r--r--doc/classes/AudioEffectDelay.xml2
-rw-r--r--doc/classes/AudioEffectReverb.xml2
-rw-r--r--doc/classes/AudioServer.xml25
-rw-r--r--doc/classes/AudioStream.xml2
-rw-r--r--doc/classes/AudioStreamPlayer.xml5
-rw-r--r--doc/classes/AudioStreamPlayer2D.xml5
-rw-r--r--doc/classes/AudioStreamPlayer3D.xml5
-rw-r--r--doc/classes/AudioStreamSample.xml3
-rw-r--r--doc/classes/BakedLightmap.xml2
-rw-r--r--doc/classes/BaseButton.xml15
-rw-r--r--doc/classes/Basis.xml1
-rw-r--r--doc/classes/BitMap.xml2
-rw-r--r--doc/classes/BitmapFont.xml2
-rw-r--r--doc/classes/ButtonGroup.xml13
-rw-r--r--doc/classes/CPUParticles.xml6
-rw-r--r--doc/classes/CPUParticles2D.xml6
-rw-r--r--doc/classes/Camera.xml2
-rw-r--r--doc/classes/Camera2D.xml24
-rw-r--r--doc/classes/CanvasItem.xml12
-rw-r--r--doc/classes/CenterContainer.xml2
-rw-r--r--doc/classes/CollisionObject.xml8
-rw-r--r--doc/classes/CollisionObject2D.xml6
-rw-r--r--doc/classes/CollisionPolygon2D.xml4
-rw-r--r--doc/classes/Color.xml43
-rw-r--r--doc/classes/ColorPicker.xml36
-rw-r--r--doc/classes/ColorPickerButton.xml2
-rw-r--r--doc/classes/Control.xml88
-rw-r--r--doc/classes/ConvexPolygonShape2D.xml2
-rw-r--r--doc/classes/Curve2D.xml34
-rw-r--r--doc/classes/Curve3D.xml48
-rw-r--r--doc/classes/Dictionary.xml11
-rw-r--r--doc/classes/DirectionalLight.xml8
-rw-r--r--doc/classes/DynamicFont.xml4
-rw-r--r--doc/classes/DynamicFontData.xml3
-rw-r--r--doc/classes/EditorFileDialog.xml4
-rw-r--r--doc/classes/EditorFileSystem.xml6
-rw-r--r--doc/classes/EditorImportPlugin.xml14
-rw-r--r--doc/classes/EditorInterface.xml2
-rw-r--r--doc/classes/EditorPlugin.xml30
-rw-r--r--doc/classes/EditorScenePostImport.xml2
-rw-r--r--doc/classes/EditorSpatialGizmo.xml2
-rw-r--r--doc/classes/EditorSpatialGizmoPlugin.xml175
-rw-r--r--doc/classes/Environment.xml14
-rw-r--r--doc/classes/File.xml4
-rw-r--r--doc/classes/FileDialog.xml2
-rw-r--r--doc/classes/GDNativeLibraryResourceLoader.xml15
-rw-r--r--doc/classes/GDNativeLibraryResourceSaver.xml15
-rw-r--r--doc/classes/Generic6DOFJoint.xml104
-rw-r--r--doc/classes/GeometryInstance.xml2
-rw-r--r--doc/classes/GradientTexture.xml2
-rw-r--r--doc/classes/GraphEdit.xml6
-rw-r--r--doc/classes/GraphNode.xml2
-rw-r--r--doc/classes/GridContainer.xml2
-rw-r--r--doc/classes/HTTPClient.xml18
-rw-r--r--doc/classes/HTTPRequest.xml10
-rw-r--r--doc/classes/HingeJoint.xml4
-rw-r--r--doc/classes/ImageTexture.xml13
-rw-r--r--doc/classes/InputEventAction.xml2
-rw-r--r--doc/classes/InputEventJoypadButton.xml2
-rw-r--r--doc/classes/InputEventKey.xml4
-rw-r--r--doc/classes/InputEventMouseButton.xml4
-rw-r--r--doc/classes/InputEventScreenTouch.xml2
-rw-r--r--doc/classes/InputMap.xml2
-rw-r--r--doc/classes/InterpolatedCamera.xml2
-rw-r--r--doc/classes/ItemList.xml4
-rw-r--r--doc/classes/JSONParseResult.xml2
-rw-r--r--doc/classes/Joint.xml10
-rw-r--r--doc/classes/Joint2D.xml2
-rw-r--r--doc/classes/KinematicBody.xml5
-rw-r--r--doc/classes/KinematicBody2D.xml6
-rw-r--r--doc/classes/Light.xml6
-rw-r--r--doc/classes/Light2D.xml20
-rw-r--r--doc/classes/LineEdit.xml40
-rw-r--r--doc/classes/MainLoop.xml2
-rw-r--r--doc/classes/MenuButton.xml5
-rw-r--r--doc/classes/MeshDataTool.xml6
-rw-r--r--doc/classes/MultiplayerAPI.xml2
-rw-r--r--doc/classes/Mutex.xml2
-rw-r--r--doc/classes/Navigation.xml2
-rw-r--r--doc/classes/Navigation2D.xml2
-rw-r--r--doc/classes/NavigationPolygon.xml8
-rw-r--r--doc/classes/NetworkedMultiplayerPeer.xml2
-rw-r--r--doc/classes/Node.xml6
-rw-r--r--doc/classes/Node2D.xml2
-rw-r--r--doc/classes/OS.xml49
-rw-r--r--doc/classes/Object.xml13
-rw-r--r--doc/classes/OccluderPolygon2D.xml2
-rw-r--r--doc/classes/OrientedPathFollow.xml40
-rw-r--r--doc/classes/PHashTranslation.xml1
-rw-r--r--doc/classes/PackedScene.xml4
-rw-r--r--doc/classes/ParallaxBackground.xml2
-rw-r--r--doc/classes/Particles.xml6
-rw-r--r--doc/classes/Particles2D.xml6
-rw-r--r--doc/classes/ParticlesMaterial.xml32
-rw-r--r--doc/classes/PathFollow.xml5
-rw-r--r--doc/classes/PathFollow2D.xml2
-rw-r--r--doc/classes/Physics2DDirectSpaceState.xml2
-rw-r--r--doc/classes/Physics2DServer.xml2
-rw-r--r--doc/classes/PhysicsDirectBodyState.xml2
-rw-r--r--doc/classes/PhysicsDirectSpaceState.xml4
-rw-r--r--doc/classes/PhysicsServer.xml38
-rw-r--r--doc/classes/Polygon2D.xml10
-rw-r--r--doc/classes/PoolByteArray.xml16
-rw-r--r--doc/classes/PoolColorArray.xml8
-rw-r--r--doc/classes/PoolIntArray.xml10
-rw-r--r--doc/classes/PoolRealArray.xml10
-rw-r--r--doc/classes/PoolStringArray.xml12
-rw-r--r--doc/classes/PoolVector2Array.xml10
-rw-r--r--doc/classes/PoolVector3Array.xml10
-rw-r--r--doc/classes/Popup.xml8
-rw-r--r--doc/classes/ProgressBar.xml2
-rw-r--r--doc/classes/ProjectSettings.xml28
-rw-r--r--doc/classes/Quat.xml1
-rw-r--r--doc/classes/RandomNumberGenerator.xml23
-rw-r--r--doc/classes/Range.xml8
-rw-r--r--doc/classes/RayCast.xml4
-rw-r--r--doc/classes/RayShape.xml2
-rw-r--r--doc/classes/RayShape2D.xml2
-rw-r--r--doc/classes/Rect2.xml2
-rw-r--r--doc/classes/RemoteTransform.xml8
-rw-r--r--doc/classes/RemoteTransform2D.xml8
-rw-r--r--doc/classes/ResourceFormatDDS.xml15
-rw-r--r--doc/classes/ResourceFormatImporter.xml15
-rw-r--r--doc/classes/ResourceFormatLoader.xml77
-rw-r--r--doc/classes/ResourceFormatLoaderBMFont.xml15
-rw-r--r--doc/classes/ResourceFormatLoaderBinary.xml15
-rw-r--r--doc/classes/ResourceFormatLoaderDynamicFont.xml15
-rw-r--r--doc/classes/ResourceFormatLoaderGDScript.xml15
-rw-r--r--doc/classes/ResourceFormatLoaderImage.xml15
-rw-r--r--doc/classes/ResourceFormatLoaderNativeScript.xml15
-rw-r--r--doc/classes/ResourceFormatLoaderShader.xml15
-rw-r--r--doc/classes/ResourceFormatLoaderStreamTexture.xml15
-rw-r--r--doc/classes/ResourceFormatLoaderText.xml15
-rw-r--r--doc/classes/ResourceFormatLoaderTextureLayered.xml15
-rw-r--r--doc/classes/ResourceFormatLoaderTheora.xml15
-rw-r--r--doc/classes/ResourceFormatLoaderWebm.xml15
-rw-r--r--doc/classes/ResourceFormatPKM.xml15
-rw-r--r--doc/classes/ResourceFormatPVR.xml15
-rw-r--r--doc/classes/ResourceFormatSaver.xml49
-rw-r--r--doc/classes/ResourceFormatSaverBinary.xml15
-rw-r--r--doc/classes/ResourceFormatSaverGDScript.xml15
-rw-r--r--doc/classes/ResourceFormatSaverNativeScript.xml15
-rw-r--r--doc/classes/ResourceFormatSaverShader.xml15
-rw-r--r--doc/classes/ResourceFormatSaverText.xml15
-rw-r--r--doc/classes/ResourceLoader.xml2
-rw-r--r--doc/classes/ResourceSaverPNG.xml15
-rw-r--r--doc/classes/RichTextLabel.xml10
-rw-r--r--doc/classes/RigidBody.xml14
-rw-r--r--doc/classes/RigidBody2D.xml10
-rw-r--r--doc/classes/SceneTree.xml14
-rw-r--r--doc/classes/ScriptCreateDialog.xml8
-rw-r--r--doc/classes/ScrollContainer.xml2
-rw-r--r--doc/classes/Semaphore.xml4
-rw-r--r--doc/classes/Shape2D.xml4
-rw-r--r--doc/classes/ShortCut.xml2
-rw-r--r--doc/classes/SkeletonIK.xml2
-rw-r--r--doc/classes/SliderJoint.xml2
-rw-r--r--doc/classes/Spatial.xml28
-rw-r--r--doc/classes/SpatialMaterial.xml52
-rw-r--r--doc/classes/SplitContainer.xml6
-rw-r--r--doc/classes/Sprite.xml10
-rw-r--r--doc/classes/Sprite3D.xml2
-rw-r--r--doc/classes/SpriteBase3D.xml12
-rw-r--r--doc/classes/SpriteFrames.xml6
-rw-r--r--doc/classes/StaticBody.xml4
-rw-r--r--doc/classes/StreamPeerTCP.xml6
-rw-r--r--doc/classes/String.xml25
-rw-r--r--doc/classes/StyleBoxFlat.xml37
-rw-r--r--doc/classes/TabContainer.xml2
-rw-r--r--doc/classes/Tabs.xml2
-rw-r--r--doc/classes/TextEdit.xml24
-rw-r--r--doc/classes/TextureButton.xml4
-rw-r--r--doc/classes/TextureProgress.xml2
-rw-r--r--doc/classes/TextureRect.xml2
-rw-r--r--doc/classes/Theme.xml6
-rw-r--r--doc/classes/TileMap.xml14
-rw-r--r--doc/classes/TileSet.xml183
-rw-r--r--doc/classes/Timer.xml10
-rw-r--r--doc/classes/ToolButton.xml4
-rw-r--r--doc/classes/TouchScreenButton.xml6
-rw-r--r--doc/classes/Translation.xml12
-rw-r--r--doc/classes/TranslationLoaderPO.xml15
-rw-r--r--doc/classes/TranslationServer.xml12
-rw-r--r--doc/classes/Tree.xml18
-rw-r--r--doc/classes/TreeItem.xml12
-rw-r--r--doc/classes/Tween.xml4
-rw-r--r--doc/classes/UndoRedo.xml3
-rw-r--r--doc/classes/Vector2.xml2
-rw-r--r--doc/classes/VehicleBody.xml4
-rw-r--r--doc/classes/VideoPlayer.xml6
-rw-r--r--doc/classes/Viewport.xml40
-rw-r--r--doc/classes/ViewportContainer.xml2
-rw-r--r--doc/classes/VisibilityEnabler.xml4
-rw-r--r--doc/classes/VisibilityEnabler2D.xml12
-rw-r--r--doc/classes/VisibilityNotifier.xml2
-rw-r--r--doc/classes/VisibilityNotifier2D.xml2
-rw-r--r--doc/classes/VisualServer.xml56
-rw-r--r--doc/classes/WindowDialog.xml2
-rw-r--r--doc/classes/WorldEnvironment.xml2
-rw-r--r--doc/classes/YSort.xml2
-rw-r--r--doc/classes/float.xml6
-rwxr-xr-xdoc/tools/makerst.py1066
-rw-r--r--drivers/alsa/audio_driver_alsa.cpp41
-rw-r--r--drivers/alsa/audio_driver_alsa.h4
-rw-r--r--drivers/alsamidi/alsa_midi.cpp4
-rw-r--r--drivers/alsamidi/alsa_midi.h4
-rw-r--r--drivers/convex_decomp/b2d_decompose.cpp4
-rw-r--r--drivers/convex_decomp/b2d_decompose.h4
-rw-r--r--drivers/coreaudio/audio_driver_coreaudio.cpp35
-rw-r--r--drivers/coreaudio/audio_driver_coreaudio.h4
-rw-r--r--drivers/coremidi/core_midi.cpp10
-rw-r--r--drivers/coremidi/core_midi.h4
-rw-r--r--drivers/dummy/audio_driver_dummy.h4
-rw-r--r--drivers/dummy/rasterizer_dummy.h10
-rw-r--r--drivers/dummy/texture_loader_dummy.cpp6
-rw-r--r--drivers/dummy/texture_loader_dummy.h7
-rw-r--r--drivers/gl_context/context_gl.cpp4
-rw-r--r--drivers/gl_context/context_gl.h4
-rw-r--r--drivers/gles2/rasterizer_canvas_gles2.cpp880
-rw-r--r--drivers/gles2/rasterizer_canvas_gles2.h26
-rw-r--r--drivers/gles2/rasterizer_gles2.cpp26
-rw-r--r--drivers/gles2/rasterizer_gles2.h4
-rw-r--r--drivers/gles2/rasterizer_scene_gles2.cpp87
-rw-r--r--drivers/gles2/rasterizer_scene_gles2.h61
-rw-r--r--drivers/gles2/rasterizer_storage_gles2.cpp214
-rw-r--r--drivers/gles2/rasterizer_storage_gles2.h185
-rw-r--r--drivers/gles2/shader_compiler_gles2.cpp25
-rw-r--r--drivers/gles2/shader_compiler_gles2.h4
-rw-r--r--drivers/gles2/shader_gles2.cpp38
-rw-r--r--drivers/gles2/shader_gles2.h4
-rw-r--r--drivers/gles2/shaders/SCsub2
-rw-r--r--drivers/gles2/shaders/canvas.glsl381
-rw-r--r--drivers/gles2/shaders/canvas_shadow.glsl41
-rw-r--r--drivers/gles2/shaders/copy.glsl12
-rw-r--r--drivers/gles2/shaders/cube_to_dp.glsl2
-rw-r--r--drivers/gles2/shaders/cubemap_filter.glsl2
-rw-r--r--drivers/gles2/shaders/lens_distorted.glsl18
-rw-r--r--drivers/gles2/shaders/scene.glsl23
-rw-r--r--drivers/gles3/rasterizer_canvas_gles3.cpp33
-rw-r--r--drivers/gles3/rasterizer_canvas_gles3.h4
-rw-r--r--drivers/gles3/rasterizer_gles3.cpp10
-rw-r--r--drivers/gles3/rasterizer_gles3.h4
-rw-r--r--drivers/gles3/rasterizer_scene_gles3.cpp55
-rw-r--r--drivers/gles3/rasterizer_scene_gles3.h172
-rw-r--r--drivers/gles3/rasterizer_storage_gles3.cpp62
-rw-r--r--drivers/gles3/rasterizer_storage_gles3.h238
-rw-r--r--drivers/gles3/shader_compiler_gles3.cpp26
-rw-r--r--drivers/gles3/shader_compiler_gles3.h4
-rw-r--r--drivers/gles3/shader_gles3.cpp4
-rw-r--r--drivers/gles3/shader_gles3.h4
-rw-r--r--drivers/gles3/shaders/canvas.glsl5
-rw-r--r--drivers/gles3/shaders/copy.glsl10
-rw-r--r--drivers/gles3/shaders/effect_blur.glsl3
-rw-r--r--drivers/gles3/shaders/scene.glsl95
-rw-r--r--drivers/png/image_loader_png.cpp4
-rw-r--r--drivers/png/image_loader_png.h4
-rw-r--r--drivers/png/resource_saver_png.cpp4
-rw-r--r--drivers/png/resource_saver_png.h5
-rw-r--r--drivers/pulseaudio/audio_driver_pulseaudio.cpp98
-rw-r--r--drivers/pulseaudio/audio_driver_pulseaudio.h4
-rw-r--r--drivers/register_driver_types.cpp15
-rw-r--r--drivers/register_driver_types.h4
-rw-r--r--drivers/rtaudio/audio_driver_rtaudio.cpp17
-rw-r--r--drivers/rtaudio/audio_driver_rtaudio.h4
-rw-r--r--drivers/unix/dir_access_unix.cpp15
-rw-r--r--drivers/unix/dir_access_unix.h4
-rw-r--r--drivers/unix/file_access_unix.cpp13
-rw-r--r--drivers/unix/file_access_unix.h4
-rw-r--r--drivers/unix/ip_unix.cpp12
-rw-r--r--drivers/unix/ip_unix.h4
-rw-r--r--drivers/unix/mutex_posix.cpp4
-rw-r--r--drivers/unix/mutex_posix.h4
-rw-r--r--drivers/unix/net_socket_posix.cpp12
-rw-r--r--drivers/unix/net_socket_posix.h4
-rw-r--r--drivers/unix/os_unix.cpp10
-rw-r--r--drivers/unix/os_unix.h5
-rw-r--r--drivers/unix/rw_lock_posix.cpp4
-rw-r--r--drivers/unix/rw_lock_posix.h4
-rw-r--r--drivers/unix/semaphore_posix.cpp4
-rw-r--r--drivers/unix/semaphore_posix.h4
-rw-r--r--drivers/unix/syslog_logger.cpp4
-rw-r--r--drivers/unix/syslog_logger.h4
-rw-r--r--drivers/unix/thread_posix.cpp4
-rw-r--r--drivers/unix/thread_posix.h4
-rw-r--r--drivers/wasapi/audio_driver_wasapi.cpp4
-rw-r--r--drivers/wasapi/audio_driver_wasapi.h26
-rw-r--r--drivers/windows/dir_access_windows.cpp4
-rw-r--r--drivers/windows/dir_access_windows.h4
-rw-r--r--drivers/windows/file_access_windows.cpp13
-rw-r--r--drivers/windows/file_access_windows.h4
-rw-r--r--drivers/windows/mutex_windows.cpp4
-rw-r--r--drivers/windows/mutex_windows.h4
-rw-r--r--drivers/windows/rw_lock_windows.cpp4
-rw-r--r--drivers/windows/rw_lock_windows.h4
-rw-r--r--drivers/windows/semaphore_windows.cpp4
-rw-r--r--drivers/windows/semaphore_windows.h4
-rw-r--r--drivers/windows/shell_windows.cpp4
-rw-r--r--drivers/windows/shell_windows.h4
-rw-r--r--drivers/windows/thread_windows.cpp9
-rw-r--r--drivers/windows/thread_windows.h4
-rw-r--r--drivers/winmidi/win_midi.cpp4
-rw-r--r--drivers/winmidi/win_midi.h4
-rw-r--r--drivers/xaudio2/audio_driver_xaudio2.cpp42
-rw-r--r--drivers/xaudio2/audio_driver_xaudio2.h4
-rw-r--r--editor/animation_bezier_editor.cpp7
-rw-r--r--editor/animation_bezier_editor.h4
-rw-r--r--editor/animation_track_editor.cpp20
-rw-r--r--editor/animation_track_editor.h4
-rw-r--r--editor/animation_track_editor_plugins.cpp4
-rw-r--r--editor/animation_track_editor_plugins.h4
-rw-r--r--editor/array_property_edit.cpp15
-rw-r--r--editor/array_property_edit.h4
-rw-r--r--editor/audio_stream_preview.cpp4
-rw-r--r--editor/audio_stream_preview.h4
-rw-r--r--editor/code_editor.cpp78
-rw-r--r--editor/code_editor.h12
-rw-r--r--editor/collada/collada.cpp4
-rw-r--r--editor/collada/collada.h45
-rw-r--r--editor/connections_dialog.cpp4
-rw-r--r--editor/connections_dialog.h4
-rw-r--r--editor/create_dialog.cpp13
-rw-r--r--editor/create_dialog.h4
-rw-r--r--editor/dependency_editor.cpp19
-rw-r--r--editor/dependency_editor.h6
-rw-r--r--editor/dictionary_property_edit.cpp4
-rw-r--r--editor/dictionary_property_edit.h4
-rw-r--r--editor/doc/doc_data.cpp4
-rw-r--r--editor/doc/doc_data.h4
-rw-r--r--editor/doc/doc_dump.cpp4
-rw-r--r--editor/doc/doc_dump.h4
-rw-r--r--editor/editor_about.cpp6
-rw-r--r--editor/editor_about.h4
-rw-r--r--editor/editor_asset_installer.cpp6
-rw-r--r--editor/editor_asset_installer.h4
-rw-r--r--editor/editor_audio_buses.cpp44
-rw-r--r--editor/editor_audio_buses.h8
-rw-r--r--editor/editor_autoload_settings.cpp4
-rw-r--r--editor/editor_autoload_settings.h4
-rw-r--r--editor/editor_data.cpp9
-rw-r--r--editor/editor_data.h4
-rw-r--r--editor/editor_dir_dialog.cpp4
-rw-r--r--editor/editor_dir_dialog.h4
-rw-r--r--editor/editor_export.cpp83
-rw-r--r--editor/editor_export.h31
-rw-r--r--editor/editor_file_dialog.cpp16
-rw-r--r--editor/editor_file_dialog.h5
-rw-r--r--editor/editor_file_system.cpp45
-rw-r--r--editor/editor_file_system.h7
-rw-r--r--editor/editor_folding.cpp113
-rw-r--r--editor/editor_folding.h35
-rw-r--r--editor/editor_fonts.cpp20
-rw-r--r--editor/editor_fonts.h4
-rw-r--r--editor/editor_help.cpp480
-rw-r--r--editor/editor_help.h93
-rw-r--r--editor/editor_help_search.cpp590
-rw-r--r--editor/editor_help_search.h155
-rw-r--r--editor/editor_inspector.cpp136
-rw-r--r--editor/editor_inspector.h16
-rw-r--r--editor/editor_log.cpp6
-rw-r--r--editor/editor_log.h4
-rw-r--r--editor/editor_name_dialog.cpp4
-rw-r--r--editor/editor_name_dialog.h4
-rw-r--r--editor/editor_node.cpp250
-rw-r--r--editor/editor_node.h22
-rw-r--r--editor/editor_path.cpp11
-rw-r--r--editor/editor_path.h4
-rw-r--r--editor/editor_plugin.cpp56
-rw-r--r--editor/editor_plugin.h11
-rw-r--r--editor/editor_plugin_settings.cpp6
-rw-r--r--editor/editor_plugin_settings.h4
-rw-r--r--editor/editor_profiler.cpp4
-rw-r--r--editor/editor_profiler.h4
-rw-r--r--editor/editor_properties.cpp129
-rw-r--r--editor/editor_properties.h27
-rw-r--r--editor/editor_properties_array_dict.cpp277
-rw-r--r--editor/editor_properties_array_dict.h12
-rw-r--r--editor/editor_resource_preview.cpp23
-rw-r--r--editor/editor_resource_preview.h6
-rw-r--r--editor/editor_run.cpp4
-rw-r--r--editor/editor_run.h4
-rw-r--r--editor/editor_run_native.cpp4
-rw-r--r--editor/editor_run_native.h4
-rw-r--r--editor/editor_run_script.cpp4
-rw-r--r--editor/editor_run_script.h4
-rw-r--r--editor/editor_scale.cpp4
-rw-r--r--editor/editor_scale.h4
-rw-r--r--editor/editor_sectioned_inspector.cpp19
-rw-r--r--editor/editor_sectioned_inspector.h4
-rw-r--r--editor/editor_settings.cpp163
-rw-r--r--editor/editor_settings.h36
-rw-r--r--editor/editor_spin_slider.cpp14
-rw-r--r--editor/editor_spin_slider.h5
-rw-r--r--editor/editor_sub_scene.cpp4
-rw-r--r--editor/editor_sub_scene.h4
-rw-r--r--editor/editor_themes.cpp30
-rw-r--r--editor/editor_themes.h4
-rw-r--r--editor/export_template_manager.cpp4
-rw-r--r--editor/export_template_manager.h4
-rw-r--r--editor/file_type_cache.cpp4
-rw-r--r--editor/file_type_cache.h4
-rw-r--r--editor/fileserver/editor_file_server.cpp4
-rw-r--r--editor/fileserver/editor_file_server.h4
-rw-r--r--editor/filesystem_dock.cpp73
-rw-r--r--editor/filesystem_dock.h18
-rw-r--r--editor/find_in_files.cpp13
-rw-r--r--editor/find_in_files.h5
-rw-r--r--editor/groups_editor.cpp6
-rw-r--r--editor/groups_editor.h4
-rw-r--r--editor/icons/icon_edit_internal.svg67
-rw-r--r--editor/icons/icon_editor_internal_handle.svg70
-rw-r--r--editor/icons/icon_oriented_path_follow.svg5
-rw-r--r--editor/icons/icon_remove_internal.svg67
-rw-r--r--editor/import/editor_import_collada.cpp11
-rw-r--r--editor/import/editor_import_collada.h4
-rw-r--r--editor/import/editor_import_plugin.cpp6
-rw-r--r--editor/import/editor_import_plugin.h4
-rw-r--r--editor/import/editor_scene_importer_gltf.cpp44
-rw-r--r--editor/import/editor_scene_importer_gltf.h32
-rw-r--r--editor/import/resource_importer_bitmask.cpp4
-rw-r--r--editor/import/resource_importer_bitmask.h6
-rw-r--r--editor/import/resource_importer_csv_translation.cpp4
-rw-r--r--editor/import/resource_importer_csv_translation.h4
-rw-r--r--editor/import/resource_importer_image.cpp4
-rw-r--r--editor/import/resource_importer_image.h4
-rw-r--r--editor/import/resource_importer_layered_texture.cpp4
-rw-r--r--editor/import/resource_importer_layered_texture.h4
-rw-r--r--editor/import/resource_importer_obj.cpp12
-rw-r--r--editor/import/resource_importer_obj.h4
-rw-r--r--editor/import/resource_importer_scene.cpp4
-rw-r--r--editor/import/resource_importer_scene.h4
-rw-r--r--editor/import/resource_importer_texture.cpp8
-rw-r--r--editor/import/resource_importer_texture.h4
-rw-r--r--editor/import/resource_importer_wav.cpp18
-rw-r--r--editor/import/resource_importer_wav.h4
-rw-r--r--editor/import_dock.cpp4
-rw-r--r--editor/import_dock.h4
-rw-r--r--editor/inspector_dock.cpp17
-rw-r--r--editor/inspector_dock.h4
-rw-r--r--editor/multi_node_edit.cpp4
-rw-r--r--editor/multi_node_edit.h4
-rw-r--r--editor/node_dock.cpp4
-rw-r--r--editor/node_dock.h4
-rw-r--r--editor/output_strings.cpp4
-rw-r--r--editor/output_strings.h4
-rw-r--r--editor/pane_drag.cpp4
-rw-r--r--editor/pane_drag.h4
-rw-r--r--editor/plugin_config_dialog.cpp4
-rw-r--r--editor/plugin_config_dialog.h4
-rw-r--r--editor/plugins/abstract_polygon_2d_editor.cpp58
-rw-r--r--editor/plugins/abstract_polygon_2d_editor.h10
-rw-r--r--editor/plugins/animation_blend_space_1d_editor.cpp9
-rw-r--r--editor/plugins/animation_blend_space_1d_editor.h4
-rw-r--r--editor/plugins/animation_blend_space_2d_editor.cpp32
-rw-r--r--editor/plugins/animation_blend_space_2d_editor.h7
-rw-r--r--editor/plugins/animation_blend_tree_editor_plugin.cpp45
-rw-r--r--editor/plugins/animation_blend_tree_editor_plugin.h10
-rw-r--r--editor/plugins/animation_player_editor_plugin.cpp4
-rw-r--r--editor/plugins/animation_player_editor_plugin.h4
-rw-r--r--editor/plugins/animation_state_machine_editor.cpp58
-rw-r--r--editor/plugins/animation_state_machine_editor.h5
-rw-r--r--editor/plugins/animation_tree_editor_plugin.cpp38
-rw-r--r--editor/plugins/animation_tree_editor_plugin.h4
-rw-r--r--editor/plugins/animation_tree_player_editor_plugin.cpp6
-rw-r--r--editor/plugins/animation_tree_player_editor_plugin.h6
-rw-r--r--editor/plugins/asset_library_editor_plugin.cpp4
-rw-r--r--editor/plugins/asset_library_editor_plugin.h4
-rw-r--r--editor/plugins/audio_stream_editor_plugin.cpp4
-rw-r--r--editor/plugins/audio_stream_editor_plugin.h4
-rw-r--r--editor/plugins/baked_lightmap_editor_plugin.cpp4
-rw-r--r--editor/plugins/baked_lightmap_editor_plugin.h4
-rw-r--r--editor/plugins/camera_editor_plugin.cpp4
-rw-r--r--editor/plugins/camera_editor_plugin.h4
-rw-r--r--editor/plugins/canvas_item_editor_plugin.cpp31
-rw-r--r--editor/plugins/canvas_item_editor_plugin.h4
-rw-r--r--editor/plugins/collision_polygon_2d_editor_plugin.cpp4
-rw-r--r--editor/plugins/collision_polygon_2d_editor_plugin.h4
-rw-r--r--editor/plugins/collision_polygon_editor_plugin.cpp8
-rw-r--r--editor/plugins/collision_polygon_editor_plugin.h4
-rw-r--r--editor/plugins/collision_shape_2d_editor_plugin.cpp4
-rw-r--r--editor/plugins/collision_shape_2d_editor_plugin.h4
-rw-r--r--editor/plugins/cpu_particles_editor_plugin.cpp4
-rw-r--r--editor/plugins/cpu_particles_editor_plugin.h4
-rw-r--r--editor/plugins/curve_editor_plugin.cpp4
-rw-r--r--editor/plugins/curve_editor_plugin.h4
-rw-r--r--editor/plugins/editor_preview_plugins.cpp7
-rw-r--r--editor/plugins/editor_preview_plugins.h4
-rw-r--r--editor/plugins/gi_probe_editor_plugin.cpp4
-rw-r--r--editor/plugins/gi_probe_editor_plugin.h4
-rw-r--r--editor/plugins/gradient_editor_plugin.cpp4
-rw-r--r--editor/plugins/gradient_editor_plugin.h4
-rw-r--r--editor/plugins/item_list_editor_plugin.cpp10
-rw-r--r--editor/plugins/item_list_editor_plugin.h4
-rw-r--r--editor/plugins/light_occluder_2d_editor_plugin.cpp428
-rw-r--r--editor/plugins/light_occluder_2d_editor_plugin.h77
-rw-r--r--editor/plugins/line_2d_editor_plugin.cpp4
-rw-r--r--editor/plugins/line_2d_editor_plugin.h4
-rw-r--r--editor/plugins/material_editor_plugin.cpp4
-rw-r--r--editor/plugins/material_editor_plugin.h4
-rw-r--r--editor/plugins/mesh_editor_plugin.cpp4
-rw-r--r--editor/plugins/mesh_editor_plugin.h4
-rw-r--r--editor/plugins/mesh_instance_editor_plugin.cpp4
-rw-r--r--editor/plugins/mesh_instance_editor_plugin.h4
-rw-r--r--editor/plugins/mesh_library_editor_plugin.cpp4
-rw-r--r--editor/plugins/mesh_library_editor_plugin.h4
-rw-r--r--editor/plugins/multimesh_editor_plugin.cpp4
-rw-r--r--editor/plugins/multimesh_editor_plugin.h4
-rw-r--r--editor/plugins/navigation_polygon_editor_plugin.cpp4
-rw-r--r--editor/plugins/navigation_polygon_editor_plugin.h4
-rw-r--r--editor/plugins/particles_2d_editor_plugin.cpp13
-rw-r--r--editor/plugins/particles_2d_editor_plugin.h4
-rw-r--r--editor/plugins/particles_editor_plugin.cpp13
-rw-r--r--editor/plugins/particles_editor_plugin.h4
-rw-r--r--editor/plugins/path_2d_editor_plugin.cpp98
-rw-r--r--editor/plugins/path_2d_editor_plugin.h6
-rw-r--r--editor/plugins/path_editor_plugin.cpp6
-rw-r--r--editor/plugins/path_editor_plugin.h6
-rw-r--r--editor/plugins/physical_bone_plugin.cpp4
-rw-r--r--editor/plugins/physical_bone_plugin.h4
-rw-r--r--editor/plugins/polygon_2d_editor_plugin.cpp750
-rw-r--r--editor/plugins/polygon_2d_editor_plugin.h28
-rw-r--r--editor/plugins/resource_preloader_editor_plugin.cpp4
-rw-r--r--editor/plugins/resource_preloader_editor_plugin.h4
-rw-r--r--editor/plugins/root_motion_editor_plugin.cpp6
-rw-r--r--editor/plugins/root_motion_editor_plugin.h4
-rw-r--r--editor/plugins/script_editor_plugin.cpp89
-rw-r--r--editor/plugins/script_editor_plugin.h9
-rw-r--r--editor/plugins/script_text_editor.cpp22
-rw-r--r--editor/plugins/script_text_editor.h5
-rw-r--r--editor/plugins/shader_editor_plugin.cpp23
-rw-r--r--editor/plugins/shader_editor_plugin.h8
-rw-r--r--editor/plugins/skeleton_2d_editor_plugin.cpp4
-rw-r--r--editor/plugins/skeleton_2d_editor_plugin.h4
-rw-r--r--editor/plugins/skeleton_editor_plugin.cpp4
-rw-r--r--editor/plugins/skeleton_editor_plugin.h4
-rw-r--r--editor/plugins/skeleton_ik_editor_plugin.cpp4
-rw-r--r--editor/plugins/skeleton_ik_editor_plugin.h4
-rw-r--r--editor/plugins/spatial_editor_plugin.cpp187
-rw-r--r--editor/plugins/spatial_editor_plugin.h32
-rw-r--r--editor/plugins/sprite_editor_plugin.cpp4
-rw-r--r--editor/plugins/sprite_editor_plugin.h4
-rw-r--r--editor/plugins/sprite_frames_editor_plugin.cpp6
-rw-r--r--editor/plugins/sprite_frames_editor_plugin.h4
-rw-r--r--editor/plugins/style_box_editor_plugin.cpp4
-rw-r--r--editor/plugins/style_box_editor_plugin.h4
-rw-r--r--editor/plugins/text_editor.cpp6
-rw-r--r--editor/plugins/text_editor.h4
-rw-r--r--editor/plugins/texture_editor_plugin.cpp4
-rw-r--r--editor/plugins/texture_editor_plugin.h4
-rw-r--r--editor/plugins/texture_region_editor_plugin.cpp155
-rw-r--r--editor/plugins/texture_region_editor_plugin.h15
-rw-r--r--editor/plugins/theme_editor_plugin.cpp4
-rw-r--r--editor/plugins/theme_editor_plugin.h4
-rw-r--r--editor/plugins/tile_map_editor_plugin.cpp46
-rw-r--r--editor/plugins/tile_map_editor_plugin.h12
-rw-r--r--editor/plugins/tile_set_editor_plugin.cpp1170
-rw-r--r--editor/plugins/tile_set_editor_plugin.h29
-rw-r--r--editor/plugins/visual_shader_editor_plugin.cpp47
-rw-r--r--editor/plugins/visual_shader_editor_plugin.h4
-rw-r--r--editor/progress_dialog.cpp9
-rw-r--r--editor/progress_dialog.h4
-rw-r--r--editor/project_export.cpp204
-rw-r--r--editor/project_export.h24
-rw-r--r--editor/project_manager.cpp228
-rw-r--r--editor/project_manager.h35
-rw-r--r--editor/project_settings_editor.cpp12
-rw-r--r--editor/project_settings_editor.h4
-rw-r--r--editor/property_editor.cpp4
-rw-r--r--editor/property_editor.h4
-rw-r--r--editor/property_selector.cpp4
-rw-r--r--editor/property_selector.h4
-rw-r--r--editor/pvrtc_compress.cpp4
-rw-r--r--editor/pvrtc_compress.h4
-rw-r--r--editor/quick_open.cpp4
-rw-r--r--editor/quick_open.h4
-rw-r--r--editor/register_exporters.h4
-rw-r--r--editor/rename_dialog.cpp4
-rw-r--r--editor/rename_dialog.h4
-rw-r--r--editor/reparent_dialog.cpp4
-rw-r--r--editor/reparent_dialog.h4
-rw-r--r--editor/run_settings_dialog.cpp4
-rw-r--r--editor/run_settings_dialog.h4
-rw-r--r--editor/scene_tree_dock.cpp59
-rw-r--r--editor/scene_tree_dock.h6
-rw-r--r--editor/scene_tree_editor.cpp8
-rw-r--r--editor/scene_tree_editor.h4
-rw-r--r--editor/script_create_dialog.cpp6
-rw-r--r--editor/script_create_dialog.h4
-rw-r--r--editor/script_editor_debugger.cpp10
-rw-r--r--editor/script_editor_debugger.h4
-rw-r--r--editor/settings_config_dialog.cpp11
-rw-r--r--editor/settings_config_dialog.h4
-rw-r--r--editor/spatial_editor_gizmos.cpp4
-rw-r--r--editor/spatial_editor_gizmos.h4
-rw-r--r--editor/translations/af.po1308
-rw-r--r--editor/translations/ar.po1484
-rw-r--r--editor/translations/bg.po1917
-rw-r--r--editor/translations/bn.po1531
-rw-r--r--editor/translations/ca.po1870
-rw-r--r--editor/translations/cs.po2255
-rw-r--r--editor/translations/da.po1664
-rw-r--r--editor/translations/de.po2494
-rw-r--r--editor/translations/de_CH.po1245
-rw-r--r--editor/translations/editor.pot1045
-rw-r--r--editor/translations/el.po1991
-rw-r--r--editor/translations/es.po2552
-rw-r--r--editor/translations/es_AR.po2510
-rw-r--r--editor/translations/et.po9237
-rwxr-xr-xeditor/translations/extract.py4
-rw-r--r--editor/translations/fa.po1400
-rw-r--r--editor/translations/fi.po2475
-rw-r--r--editor/translations/fr.po3927
-rw-r--r--editor/translations/he.po1364
-rw-r--r--editor/translations/hi.po1240
-rw-r--r--editor/translations/hr.po9244
-rw-r--r--editor/translations/hu.po1448
-rw-r--r--editor/translations/id.po1770
-rw-r--r--editor/translations/is.po1122
-rw-r--r--editor/translations/it.po1595
-rw-r--r--editor/translations/ja.po4122
-rw-r--r--editor/translations/ka.po1202
-rw-r--r--editor/translations/ko.po2754
-rw-r--r--editor/translations/lt.po1181
-rw-r--r--editor/translations/lv.po1325
-rw-r--r--editor/translations/ml.po9245
-rw-r--r--editor/translations/ms.po1057
-rw-r--r--editor/translations/nb.po1455
-rw-r--r--editor/translations/nl.po1811
-rw-r--r--editor/translations/pl.po2742
-rw-r--r--editor/translations/pr.po1224
-rw-r--r--editor/translations/pt_BR.po2278
-rw-r--r--editor/translations/pt_PT.po2568
-rw-r--r--editor/translations/ro.po1426
-rw-r--r--editor/translations/ru.po2461
-rw-r--r--editor/translations/si.po9253
-rw-r--r--editor/translations/sk.po1201
-rw-r--r--editor/translations/sl.po1416
-rw-r--r--editor/translations/sq.po9246
-rw-r--r--editor/translations/sr_Cyrl.po1437
-rw-r--r--editor/translations/sr_Latn.po1124
-rw-r--r--editor/translations/sv.po1436
-rw-r--r--editor/translations/ta.po1061
-rw-r--r--editor/translations/th.po1533
-rw-r--r--editor/translations/tr.po1555
-rw-r--r--editor/translations/uk.po2427
-rw-r--r--editor/translations/ur_PK.po1142
-rw-r--r--editor/translations/vi.po1771
-rw-r--r--editor/translations/zh_CN.po2440
-rw-r--r--editor/translations/zh_HK.po1339
-rw-r--r--editor/translations/zh_TW.po1325
-rw-r--r--gles_builders.py4
-rw-r--r--main/default_controller_mappings.h4
-rw-r--r--main/input_default.cpp14
-rw-r--r--main/input_default.h4
-rw-r--r--main/main.cpp36
-rw-r--r--main/main.h4
-rw-r--r--main/performance.cpp4
-rw-r--r--main/performance.h4
-rw-r--r--main/splash_editor.pngbin37619 -> 39571 bytes
-rw-r--r--main/tests/test_astar.cpp4
-rw-r--r--main/tests/test_astar.h4
-rw-r--r--main/tests/test_gdscript.cpp4
-rw-r--r--main/tests/test_gdscript.h4
-rw-r--r--main/tests/test_gui.cpp4
-rw-r--r--main/tests/test_gui.h4
-rw-r--r--main/tests/test_image.cpp4
-rw-r--r--main/tests/test_image.h4
-rw-r--r--main/tests/test_io.cpp133
-rw-r--r--main/tests/test_main.cpp11
-rw-r--r--main/tests/test_main.h4
-rw-r--r--main/tests/test_math.cpp27
-rw-r--r--main/tests/test_math.h4
-rw-r--r--main/tests/test_oa_hash_map.cpp6
-rw-r--r--main/tests/test_oa_hash_map.h4
-rw-r--r--main/tests/test_ordered_hash_map.cpp4
-rw-r--r--main/tests/test_ordered_hash_map.h4
-rw-r--r--main/tests/test_physics.cpp4
-rw-r--r--main/tests/test_physics.h4
-rw-r--r--main/tests/test_physics_2d.cpp4
-rw-r--r--main/tests/test_physics_2d.h4
-rw-r--r--main/tests/test_render.cpp4
-rw-r--r--main/tests/test_render.h4
-rw-r--r--main/tests/test_shader_lang.cpp6
-rw-r--r--main/tests/test_shader_lang.h4
-rw-r--r--main/tests/test_string.cpp108
-rw-r--r--main/tests/test_string.h4
-rw-r--r--main/timer_sync.cpp4
-rw-r--r--main/timer_sync.h4
-rw-r--r--methods.py28
-rw-r--r--misc/dist/document_icon.svg12
-rw-r--r--misc/dist/document_icons/gdscript.svg1
-rw-r--r--misc/dist/document_icons/gdscript_extra_small.svg1
-rw-r--r--misc/dist/document_icons/gdscript_small.svg1
-rw-r--r--misc/dist/document_icons/project.svg1
-rw-r--r--misc/dist/document_icons/project_extra_small.svg1
-rw-r--r--misc/dist/document_icons/project_small.svg1
-rw-r--r--misc/dist/document_icons/resource.svg1
-rw-r--r--misc/dist/document_icons/resource_extra_small.svg1
-rw-r--r--misc/dist/document_icons/resource_small.svg1
-rw-r--r--misc/dist/document_icons/scene.svg1
-rw-r--r--misc/dist/document_icons/scene_extra_small.svg1
-rw-r--r--misc/dist/document_icons/scene_small.svg1
-rw-r--r--misc/dist/ios_xcode/godot_ios/dummy.cpp30
-rw-r--r--misc/dist/linux/godot.64
-rw-r--r--misc/dist/linux/org.godotengine.Godot.appdata.xml2
-rwxr-xr-xmisc/dist/osx_tools.app/Contents/Info.plist63
-rw-r--r--misc/dist/osx_tools.app/Contents/Resources/Document.icnsbin143464 -> 0 bytes
-rw-r--r--misc/dist/osx_tools.app/Contents/Resources/GDScript.icnsbin0 -> 185973 bytes
-rw-r--r--misc/dist/osx_tools.app/Contents/Resources/Project.icnsbin0 -> 208221 bytes
-rw-r--r--misc/dist/osx_tools.app/Contents/Resources/Resource.icnsbin0 -> 176973 bytes
-rw-r--r--misc/dist/osx_tools.app/Contents/Resources/Scene.icnsbin0 -> 150612 bytes
-rw-r--r--misc/dist/uwp_template/Assets/SplashScreen.scale-100.pngbin10818 -> 10010 bytes
-rwxr-xr-x[-rw-r--r--]misc/scripts/fix_headers.py4
-rwxr-xr-xmisc/travis/scons-local-osx.sh18
-rw-r--r--modules/bmp/image_loader_bmp.cpp4
-rw-r--r--modules/bmp/image_loader_bmp.h4
-rw-r--r--modules/bmp/register_types.cpp4
-rw-r--r--modules/bmp/register_types.h4
-rw-r--r--modules/bullet/area_bullet.cpp4
-rw-r--r--modules/bullet/area_bullet.h4
-rw-r--r--modules/bullet/btRayShape.cpp4
-rw-r--r--modules/bullet/btRayShape.h4
-rw-r--r--modules/bullet/bullet_physics_server.cpp20
-rw-r--r--modules/bullet/bullet_physics_server.h7
-rw-r--r--modules/bullet/bullet_types_converter.cpp4
-rw-r--r--modules/bullet/bullet_types_converter.h4
-rw-r--r--modules/bullet/bullet_utilities.h4
-rw-r--r--modules/bullet/collision_object_bullet.cpp4
-rw-r--r--modules/bullet/collision_object_bullet.h4
-rw-r--r--modules/bullet/cone_twist_joint_bullet.cpp4
-rw-r--r--modules/bullet/cone_twist_joint_bullet.h4
-rw-r--r--modules/bullet/constraint_bullet.cpp4
-rw-r--r--modules/bullet/constraint_bullet.h4
-rw-r--r--modules/bullet/generic_6dof_joint_bullet.cpp12
-rw-r--r--modules/bullet/generic_6dof_joint_bullet.h7
-rw-r--r--modules/bullet/godot_collision_configuration.cpp4
-rw-r--r--modules/bullet/godot_collision_configuration.h4
-rw-r--r--modules/bullet/godot_collision_dispatcher.cpp4
-rw-r--r--modules/bullet/godot_collision_dispatcher.h4
-rw-r--r--modules/bullet/godot_motion_state.h4
-rw-r--r--modules/bullet/godot_ray_world_algorithm.cpp4
-rw-r--r--modules/bullet/godot_ray_world_algorithm.h4
-rw-r--r--modules/bullet/godot_result_callbacks.cpp13
-rw-r--r--modules/bullet/godot_result_callbacks.h4
-rw-r--r--modules/bullet/hinge_joint_bullet.cpp4
-rw-r--r--modules/bullet/hinge_joint_bullet.h4
-rw-r--r--modules/bullet/joint_bullet.cpp4
-rw-r--r--modules/bullet/joint_bullet.h4
-rw-r--r--modules/bullet/pin_joint_bullet.cpp4
-rw-r--r--modules/bullet/pin_joint_bullet.h4
-rw-r--r--modules/bullet/register_types.cpp4
-rw-r--r--modules/bullet/register_types.h4
-rw-r--r--modules/bullet/rid_bullet.h4
-rw-r--r--modules/bullet/rigid_body_bullet.cpp25
-rw-r--r--modules/bullet/rigid_body_bullet.h19
-rw-r--r--modules/bullet/shape_bullet.cpp61
-rw-r--r--modules/bullet/shape_bullet.h4
-rw-r--r--modules/bullet/shape_owner_bullet.cpp4
-rw-r--r--modules/bullet/shape_owner_bullet.h4
-rw-r--r--modules/bullet/slider_joint_bullet.cpp4
-rw-r--r--modules/bullet/slider_joint_bullet.h4
-rw-r--r--modules/bullet/soft_body_bullet.cpp4
-rw-r--r--modules/bullet/soft_body_bullet.h4
-rw-r--r--modules/bullet/space_bullet.cpp14
-rw-r--r--modules/bullet/space_bullet.h4
-rw-r--r--modules/csg/csg.cpp4
-rw-r--r--modules/csg/csg.h4
-rw-r--r--modules/csg/csg_gizmos.cpp6
-rw-r--r--modules/csg/csg_gizmos.h4
-rw-r--r--modules/csg/csg_shape.cpp167
-rw-r--r--modules/csg/csg_shape.h19
-rw-r--r--modules/csg/doc_classes/CSGCombiner.xml2
-rw-r--r--modules/csg/doc_classes/CSGMesh.xml2
-rw-r--r--modules/csg/doc_classes/CSGShape.xml48
-rw-r--r--modules/csg/register_types.cpp4
-rw-r--r--modules/csg/register_types.h4
-rw-r--r--modules/cvtt/image_compress_cvtt.cpp4
-rw-r--r--modules/cvtt/image_compress_cvtt.h4
-rw-r--r--modules/cvtt/register_types.cpp4
-rw-r--r--modules/cvtt/register_types.h4
-rw-r--r--modules/dds/register_types.cpp11
-rw-r--r--modules/dds/register_types.h4
-rw-r--r--modules/dds/texture_loader_dds.cpp4
-rw-r--r--modules/dds/texture_loader_dds.h5
-rw-r--r--modules/enet/doc_classes/NetworkedMultiplayerENet.xml2
-rw-r--r--modules/enet/networked_multiplayer_enet.cpp4
-rw-r--r--modules/enet/networked_multiplayer_enet.h4
-rw-r--r--modules/enet/register_types.cpp4
-rw-r--r--modules/enet/register_types.h4
-rw-r--r--modules/etc/SCsub5
-rw-r--r--modules/etc/image_etc.cpp4
-rw-r--r--modules/etc/image_etc.h4
-rw-r--r--modules/etc/register_types.cpp11
-rw-r--r--modules/etc/register_types.h4
-rw-r--r--modules/etc/texture_loader_pkm.cpp4
-rw-r--r--modules/etc/texture_loader_pkm.h5
-rw-r--r--modules/freetype/register_types.cpp4
-rw-r--r--modules/freetype/register_types.h4
-rw-r--r--modules/freetype/uwpdef.h4
-rw-r--r--modules/gdnative/SCsub1
-rw-r--r--modules/gdnative/android/android_gdn.cpp4
-rw-r--r--modules/gdnative/arvr/arvr_interface_gdnative.cpp4
-rw-r--r--modules/gdnative/arvr/arvr_interface_gdnative.h4
-rw-r--r--modules/gdnative/arvr/register_types.cpp4
-rw-r--r--modules/gdnative/arvr/register_types.h4
-rw-r--r--modules/gdnative/config.py2
-rw-r--r--modules/gdnative/doc_classes/PluginScript.xml7
-rw-r--r--modules/gdnative/doc_classes/ResourceFormatLoaderVideoStreamGDNative.xml15
-rw-r--r--modules/gdnative/doc_classes/VideoStreamGDNative.xml29
-rw-r--r--modules/gdnative/gdnative.cpp4
-rw-r--r--modules/gdnative/gdnative.h6
-rw-r--r--modules/gdnative/gdnative/aabb.cpp4
-rw-r--r--modules/gdnative/gdnative/array.cpp4
-rw-r--r--modules/gdnative/gdnative/basis.cpp4
-rw-r--r--modules/gdnative/gdnative/color.cpp4
-rw-r--r--modules/gdnative/gdnative/dictionary.cpp4
-rw-r--r--modules/gdnative/gdnative/gdnative.cpp4
-rw-r--r--modules/gdnative/gdnative/node_path.cpp4
-rw-r--r--modules/gdnative/gdnative/plane.cpp4
-rw-r--r--modules/gdnative/gdnative/pool_arrays.cpp4
-rw-r--r--modules/gdnative/gdnative/quat.cpp4
-rw-r--r--modules/gdnative/gdnative/rect2.cpp4
-rw-r--r--modules/gdnative/gdnative/rid.cpp4
-rw-r--r--modules/gdnative/gdnative/string.cpp6
-rw-r--r--modules/gdnative/gdnative/string_name.cpp4
-rw-r--r--modules/gdnative/gdnative/transform.cpp4
-rw-r--r--modules/gdnative/gdnative/transform2d.cpp4
-rw-r--r--modules/gdnative/gdnative/variant.cpp4
-rw-r--r--modules/gdnative/gdnative/vector2.cpp4
-rw-r--r--modules/gdnative/gdnative/vector3.cpp4
-rw-r--r--modules/gdnative/gdnative_api.json38
-rw-r--r--modules/gdnative/gdnative_builders.py26
-rw-r--r--modules/gdnative/gdnative_library_editor_plugin.cpp4
-rw-r--r--modules/gdnative/gdnative_library_editor_plugin.h4
-rw-r--r--modules/gdnative/gdnative_library_singleton_editor.cpp4
-rw-r--r--modules/gdnative/gdnative_library_singleton_editor.h4
-rw-r--r--modules/gdnative/include/android/godot_android.h4
-rw-r--r--modules/gdnative/include/arvr/godot_arvr.h4
-rw-r--r--modules/gdnative/include/gdnative/aabb.h4
-rw-r--r--modules/gdnative/include/gdnative/array.h4
-rw-r--r--modules/gdnative/include/gdnative/basis.h4
-rw-r--r--modules/gdnative/include/gdnative/color.h4
-rw-r--r--modules/gdnative/include/gdnative/dictionary.h4
-rw-r--r--modules/gdnative/include/gdnative/gdnative.h4
-rw-r--r--modules/gdnative/include/gdnative/node_path.h4
-rw-r--r--modules/gdnative/include/gdnative/plane.h4
-rw-r--r--modules/gdnative/include/gdnative/pool_arrays.h4
-rw-r--r--modules/gdnative/include/gdnative/quat.h4
-rw-r--r--modules/gdnative/include/gdnative/rect2.h4
-rw-r--r--modules/gdnative/include/gdnative/rid.h4
-rw-r--r--modules/gdnative/include/gdnative/string.h6
-rw-r--r--modules/gdnative/include/gdnative/string_name.h4
-rw-r--r--modules/gdnative/include/gdnative/transform.h4
-rw-r--r--modules/gdnative/include/gdnative/transform2d.h4
-rw-r--r--modules/gdnative/include/gdnative/variant.h4
-rw-r--r--modules/gdnative/include/gdnative/vector2.h4
-rw-r--r--modules/gdnative/include/gdnative/vector3.h4
-rw-r--r--modules/gdnative/include/nativescript/godot_nativescript.h4
-rw-r--r--modules/gdnative/include/net/godot_net.h4
-rw-r--r--modules/gdnative/include/pluginscript/godot_pluginscript.h4
-rw-r--r--modules/gdnative/include/videodecoder/godot_videodecoder.h (renamed from platform/android/dir_access_android.h)89
-rw-r--r--modules/gdnative/nativescript/api_generator.cpp4
-rw-r--r--modules/gdnative/nativescript/api_generator.h4
-rw-r--r--modules/gdnative/nativescript/godot_nativescript.cpp4
-rw-r--r--modules/gdnative/nativescript/nativescript.cpp8
-rw-r--r--modules/gdnative/nativescript/nativescript.h7
-rw-r--r--modules/gdnative/nativescript/register_types.cpp18
-rw-r--r--modules/gdnative/nativescript/register_types.h4
-rw-r--r--modules/gdnative/net/multiplayer_peer_gdnative.cpp4
-rw-r--r--modules/gdnative/net/multiplayer_peer_gdnative.h4
-rw-r--r--modules/gdnative/net/packet_peer_gdnative.cpp4
-rw-r--r--modules/gdnative/net/packet_peer_gdnative.h4
-rw-r--r--modules/gdnative/net/register_types.cpp4
-rw-r--r--modules/gdnative/net/register_types.h4
-rw-r--r--modules/gdnative/net/stream_peer_gdnative.cpp4
-rw-r--r--modules/gdnative/net/stream_peer_gdnative.h4
-rw-r--r--modules/gdnative/pluginscript/pluginscript_instance.cpp4
-rw-r--r--modules/gdnative/pluginscript/pluginscript_instance.h4
-rw-r--r--modules/gdnative/pluginscript/pluginscript_language.cpp10
-rw-r--r--modules/gdnative/pluginscript/pluginscript_language.h12
-rw-r--r--modules/gdnative/pluginscript/pluginscript_loader.cpp4
-rw-r--r--modules/gdnative/pluginscript/pluginscript_loader.h10
-rw-r--r--modules/gdnative/pluginscript/pluginscript_script.cpp90
-rw-r--r--modules/gdnative/pluginscript/pluginscript_script.h10
-rw-r--r--modules/gdnative/pluginscript/register_types.cpp4
-rw-r--r--modules/gdnative/pluginscript/register_types.h4
-rw-r--r--modules/gdnative/register_types.cpp24
-rw-r--r--modules/gdnative/register_types.h4
-rw-r--r--modules/gdnative/videodecoder/SCsub9
-rw-r--r--modules/gdnative/videodecoder/register_types.cpp (renamed from main/tests/test_io.h)25
-rw-r--r--modules/gdnative/videodecoder/register_types.h (renamed from platform/android/globals/global_defaults.h)5
-rw-r--r--modules/gdnative/videodecoder/video_stream_gdnative.cpp387
-rw-r--r--modules/gdnative/videodecoder/video_stream_gdnative.h208
-rw-r--r--modules/gdscript/editor/gdscript_highlighter.cpp4
-rw-r--r--modules/gdscript/editor/gdscript_highlighter.h4
-rw-r--r--modules/gdscript/gdscript.cpp83
-rw-r--r--modules/gdscript/gdscript.h13
-rw-r--r--modules/gdscript/gdscript_compiler.cpp30
-rw-r--r--modules/gdscript/gdscript_compiler.h14
-rw-r--r--modules/gdscript/gdscript_editor.cpp18
-rw-r--r--modules/gdscript/gdscript_function.cpp37
-rw-r--r--modules/gdscript/gdscript_function.h18
-rw-r--r--modules/gdscript/gdscript_functions.cpp21
-rw-r--r--modules/gdscript/gdscript_functions.h4
-rw-r--r--modules/gdscript/gdscript_parser.cpp117
-rw-r--r--modules/gdscript/gdscript_parser.h6
-rw-r--r--modules/gdscript/gdscript_tokenizer.cpp4
-rw-r--r--modules/gdscript/gdscript_tokenizer.h4
-rw-r--r--modules/gdscript/register_types.cpp88
-rw-r--r--modules/gdscript/register_types.h4
-rw-r--r--modules/gridmap/doc_classes/GridMap.xml8
-rw-r--r--modules/gridmap/grid_map.cpp4
-rw-r--r--modules/gridmap/grid_map.h4
-rw-r--r--modules/gridmap/grid_map_editor_plugin.cpp4
-rw-r--r--modules/gridmap/grid_map_editor_plugin.h4
-rw-r--r--modules/gridmap/register_types.cpp4
-rw-r--r--modules/gridmap/register_types.h4
-rw-r--r--modules/hdr/image_loader_hdr.cpp4
-rw-r--r--modules/hdr/image_loader_hdr.h4
-rw-r--r--modules/hdr/register_types.cpp4
-rw-r--r--modules/hdr/register_types.h4
-rw-r--r--modules/jpg/image_loader_jpegd.cpp4
-rw-r--r--modules/jpg/image_loader_jpegd.h4
-rw-r--r--modules/jpg/register_types.cpp4
-rw-r--r--modules/jpg/register_types.h4
-rwxr-xr-xmodules/mbedtls/register_types.cpp4
-rwxr-xr-xmodules/mbedtls/register_types.h4
-rwxr-xr-xmodules/mbedtls/stream_peer_mbed_tls.cpp6
-rwxr-xr-xmodules/mbedtls/stream_peer_mbed_tls.h6
-rw-r--r--modules/mobile_vr/mobile_vr_interface.cpp6
-rw-r--r--modules/mobile_vr/mobile_vr_interface.h6
-rw-r--r--modules/mobile_vr/register_types.cpp4
-rw-r--r--modules/mobile_vr/register_types.h4
-rw-r--r--modules/mono/SCsub28
-rw-r--r--modules/mono/config.py10
-rw-r--r--modules/mono/csharp_script.cpp637
-rw-r--r--modules/mono/csharp_script.h51
-rw-r--r--modules/mono/editor/GodotSharpTools/.gitignore2
-rw-r--r--modules/mono/editor/GodotSharpTools/Editor/GodotSharpExport.cs2
-rw-r--r--modules/mono/editor/bindings_generator.cpp31
-rw-r--r--modules/mono/editor/bindings_generator.h4
-rw-r--r--modules/mono/editor/csharp_project.cpp4
-rw-r--r--modules/mono/editor/csharp_project.h4
-rw-r--r--modules/mono/editor/dotnet_solution.cpp4
-rw-r--r--modules/mono/editor/dotnet_solution.h4
-rw-r--r--modules/mono/editor/godotsharp_builds.cpp7
-rw-r--r--modules/mono/editor/godotsharp_builds.h4
-rw-r--r--modules/mono/editor/godotsharp_editor.cpp25
-rw-r--r--modules/mono/editor/godotsharp_editor.h4
-rw-r--r--modules/mono/editor/godotsharp_export.cpp74
-rw-r--r--modules/mono/editor/godotsharp_export.h4
-rw-r--r--modules/mono/editor/mono_bottom_panel.cpp17
-rw-r--r--modules/mono/editor/mono_bottom_panel.h4
-rw-r--r--modules/mono/editor/mono_build_info.cpp4
-rw-r--r--modules/mono/editor/mono_build_info.h4
-rw-r--r--modules/mono/editor/monodevelop_instance.cpp4
-rw-r--r--modules/mono/editor/monodevelop_instance.h4
-rw-r--r--modules/mono/editor/script_class_parser.cpp131
-rw-r--r--modules/mono/editor/script_class_parser.h31
-rw-r--r--modules/mono/glue/Managed/Files/AABB.cs4
-rw-r--r--modules/mono/glue/Managed/Files/Basis.cs45
-rw-r--r--modules/mono/glue/Managed/Files/Color.cs23
-rw-r--r--modules/mono/glue/Managed/Files/Colors.cs303
-rw-r--r--modules/mono/glue/Managed/Files/Mathf.cs4
-rw-r--r--modules/mono/glue/Managed/Files/MathfEx.cs2
-rw-r--r--modules/mono/glue/Managed/Files/Plane.cs6
-rw-r--r--modules/mono/glue/Managed/Files/Quat.cs2
-rw-r--r--modules/mono/glue/Managed/Files/Rect2.cs4
-rw-r--r--modules/mono/glue/Managed/Files/StringExtensions.cs8
-rw-r--r--modules/mono/glue/Managed/Files/Transform.cs8
-rw-r--r--modules/mono/glue/Managed/Files/Transform2D.cs6
-rw-r--r--modules/mono/glue/Managed/Files/Vector2.cs4
-rw-r--r--modules/mono/glue/Managed/Files/Vector3.cs12
-rw-r--r--modules/mono/glue/Managed/Properties/AssemblyInfo.cs4
-rw-r--r--modules/mono/glue/base_object_glue.cpp24
-rw-r--r--modules/mono/glue/base_object_glue.h4
-rw-r--r--modules/mono/glue/collections_glue.cpp4
-rw-r--r--modules/mono/glue/collections_glue.h4
-rw-r--r--modules/mono/glue/gd_glue.cpp4
-rw-r--r--modules/mono/glue/gd_glue.h4
-rw-r--r--modules/mono/glue/glue_header.h4
-rw-r--r--modules/mono/glue/nodepath_glue.cpp4
-rw-r--r--modules/mono/glue/nodepath_glue.h4
-rw-r--r--modules/mono/glue/rid_glue.cpp4
-rw-r--r--modules/mono/glue/rid_glue.h4
-rw-r--r--modules/mono/glue/string_glue.cpp4
-rw-r--r--modules/mono/glue/string_glue.h4
-rw-r--r--modules/mono/godotsharp_defs.h4
-rw-r--r--modules/mono/godotsharp_dirs.cpp4
-rw-r--r--modules/mono/godotsharp_dirs.h4
-rw-r--r--modules/mono/mono_gc_handle.cpp4
-rw-r--r--modules/mono/mono_gc_handle.h4
-rw-r--r--modules/mono/mono_gd/gd_mono.cpp4
-rw-r--r--modules/mono/mono_gd/gd_mono.h4
-rw-r--r--modules/mono/mono_gd/gd_mono_assembly.cpp4
-rw-r--r--modules/mono/mono_gd/gd_mono_assembly.h4
-rw-r--r--modules/mono/mono_gd/gd_mono_class.cpp25
-rw-r--r--modules/mono/mono_gd/gd_mono_class.h11
-rw-r--r--modules/mono/mono_gd/gd_mono_class_member.h5
-rw-r--r--modules/mono/mono_gd/gd_mono_field.cpp8
-rw-r--r--modules/mono/mono_gd/gd_mono_field.h4
-rw-r--r--modules/mono/mono_gd/gd_mono_header.h4
-rw-r--r--modules/mono/mono_gd/gd_mono_internals.cpp4
-rw-r--r--modules/mono/mono_gd/gd_mono_internals.h4
-rw-r--r--modules/mono/mono_gd/gd_mono_log.cpp4
-rw-r--r--modules/mono/mono_gd/gd_mono_log.h4
-rw-r--r--modules/mono/mono_gd/gd_mono_marshal.cpp31
-rw-r--r--modules/mono/mono_gd/gd_mono_marshal.h4
-rw-r--r--modules/mono/mono_gd/gd_mono_method.cpp31
-rw-r--r--modules/mono/mono_gd/gd_mono_method.h9
-rw-r--r--modules/mono/mono_gd/gd_mono_property.cpp5
-rw-r--r--modules/mono/mono_gd/gd_mono_property.h5
-rw-r--r--modules/mono/mono_gd/gd_mono_utils.cpp8
-rw-r--r--modules/mono/mono_gd/gd_mono_utils.h95
-rw-r--r--modules/mono/register_types.cpp23
-rw-r--r--modules/mono/register_types.h4
-rw-r--r--modules/mono/signal_awaiter_utils.cpp12
-rw-r--r--modules/mono/signal_awaiter_utils.h4
-rw-r--r--modules/mono/utils/macros.h16
-rw-r--r--modules/mono/utils/mono_reg_utils.cpp4
-rw-r--r--modules/mono/utils/mono_reg_utils.h4
-rw-r--r--modules/mono/utils/mutex_utils.h (renamed from platform/android/globals/global_defaults.cpp)46
-rw-r--r--modules/mono/utils/osx_utils.cpp4
-rw-r--r--modules/mono/utils/osx_utils.h4
-rw-r--r--modules/mono/utils/path_utils.cpp4
-rw-r--r--modules/mono/utils/path_utils.h4
-rw-r--r--modules/mono/utils/string_utils.cpp4
-rw-r--r--modules/mono/utils/string_utils.h4
-rw-r--r--modules/mono/utils/thread_local.cpp4
-rw-r--r--modules/mono/utils/thread_local.h4
-rw-r--r--modules/ogg/register_types.cpp4
-rw-r--r--modules/ogg/register_types.h4
-rw-r--r--modules/opensimplex/noise_texture.cpp4
-rw-r--r--modules/opensimplex/noise_texture.h4
-rw-r--r--modules/opensimplex/open_simplex_noise.cpp4
-rw-r--r--modules/opensimplex/open_simplex_noise.h4
-rw-r--r--modules/opensimplex/register_types.cpp4
-rw-r--r--modules/opensimplex/register_types.h4
-rw-r--r--modules/opus/audio_stream_opus.cpp4
-rw-r--r--modules/opus/audio_stream_opus.h5
-rw-r--r--modules/opus/register_types.cpp6
-rw-r--r--modules/opus/register_types.h4
-rw-r--r--modules/opus/stub/register_types.cpp4
-rw-r--r--modules/opus/stub/register_types.h4
-rw-r--r--modules/pvr/register_types.cpp11
-rw-r--r--modules/pvr/register_types.h4
-rw-r--r--modules/pvr/texture_loader_pvr.cpp4
-rw-r--r--modules/pvr/texture_loader_pvr.h5
-rw-r--r--modules/recast/navigation_mesh_editor_plugin.cpp4
-rw-r--r--modules/recast/navigation_mesh_editor_plugin.h4
-rw-r--r--modules/recast/navigation_mesh_generator.cpp4
-rw-r--r--modules/recast/navigation_mesh_generator.h4
-rw-r--r--modules/recast/register_types.cpp4
-rw-r--r--modules/recast/register_types.h4
-rw-r--r--modules/regex/regex.cpp4
-rw-r--r--modules/regex/regex.h4
-rw-r--r--modules/regex/register_types.cpp4
-rw-r--r--modules/regex/register_types.h4
-rw-r--r--modules/register_module_types.h4
-rw-r--r--modules/squish/config.py2
-rw-r--r--modules/squish/image_compress_squish.cpp8
-rw-r--r--modules/squish/image_compress_squish.h6
-rw-r--r--modules/squish/register_types.cpp11
-rw-r--r--modules/squish/register_types.h6
-rw-r--r--modules/stb_vorbis/audio_stream_ogg_vorbis.cpp4
-rw-r--r--modules/stb_vorbis/audio_stream_ogg_vorbis.h4
-rw-r--r--modules/stb_vorbis/register_types.cpp4
-rw-r--r--modules/stb_vorbis/register_types.h4
-rw-r--r--modules/stb_vorbis/resource_importer_ogg_vorbis.cpp4
-rw-r--r--modules/stb_vorbis/resource_importer_ogg_vorbis.h4
-rw-r--r--modules/svg/image_loader_svg.cpp4
-rw-r--r--modules/svg/image_loader_svg.h4
-rw-r--r--modules/svg/register_types.cpp4
-rw-r--r--modules/svg/register_types.h4
-rw-r--r--modules/tga/image_loader_tga.cpp4
-rw-r--r--modules/tga/image_loader_tga.h4
-rw-r--r--modules/tga/register_types.cpp4
-rw-r--r--modules/tga/register_types.h4
-rw-r--r--modules/thekla_unwrap/register_types.cpp4
-rw-r--r--modules/thekla_unwrap/register_types.h4
-rw-r--r--modules/theora/register_types.cpp13
-rw-r--r--modules/theora/register_types.h4
-rw-r--r--modules/theora/video_stream_theora.cpp4
-rw-r--r--modules/theora/video_stream_theora.h5
-rw-r--r--modules/tinyexr/image_loader_tinyexr.cpp10
-rw-r--r--modules/tinyexr/image_loader_tinyexr.h4
-rw-r--r--modules/tinyexr/register_types.cpp4
-rw-r--r--modules/tinyexr/register_types.h4
-rw-r--r--modules/upnp/register_types.cpp4
-rw-r--r--modules/upnp/register_types.h4
-rw-r--r--modules/upnp/upnp.cpp4
-rw-r--r--modules/upnp/upnp.h4
-rw-r--r--modules/upnp/upnpdevice.cpp4
-rw-r--r--modules/upnp/upnpdevice.h4
-rw-r--r--modules/visual_script/doc_classes/VisualScriptBasicTypeConstant.xml2
-rw-r--r--modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml6
-rw-r--r--modules/visual_script/doc_classes/VisualScriptClassConstant.xml2
-rw-r--r--modules/visual_script/doc_classes/VisualScriptCondition.xml2
-rw-r--r--modules/visual_script/doc_classes/VisualScriptCustomNode.xml2
-rw-r--r--modules/visual_script/doc_classes/VisualScriptReturn.xml2
-rw-r--r--modules/visual_script/register_types.cpp4
-rw-r--r--modules/visual_script/register_types.h4
-rw-r--r--modules/visual_script/visual_script.cpp8
-rw-r--r--modules/visual_script/visual_script.h5
-rw-r--r--modules/visual_script/visual_script_builtin_funcs.cpp4
-rw-r--r--modules/visual_script/visual_script_builtin_funcs.h4
-rw-r--r--modules/visual_script/visual_script_editor.cpp7
-rw-r--r--modules/visual_script/visual_script_editor.h6
-rw-r--r--modules/visual_script/visual_script_expression.cpp4
-rw-r--r--modules/visual_script/visual_script_expression.h4
-rw-r--r--modules/visual_script/visual_script_flow_control.cpp4
-rw-r--r--modules/visual_script/visual_script_flow_control.h4
-rw-r--r--modules/visual_script/visual_script_func_nodes.cpp4
-rw-r--r--modules/visual_script/visual_script_func_nodes.h4
-rw-r--r--modules/visual_script/visual_script_nodes.cpp4
-rw-r--r--modules/visual_script/visual_script_nodes.h4
-rw-r--r--modules/visual_script/visual_script_property_selector.cpp4
-rw-r--r--modules/visual_script/visual_script_property_selector.h4
-rw-r--r--modules/visual_script/visual_script_yield_nodes.cpp4
-rw-r--r--modules/visual_script/visual_script_yield_nodes.h4
-rw-r--r--modules/vorbis/audio_stream_ogg_vorbis.cpp4
-rw-r--r--modules/vorbis/audio_stream_ogg_vorbis.h5
-rw-r--r--modules/vorbis/register_types.cpp11
-rw-r--r--modules/vorbis/register_types.h4
-rw-r--r--modules/vorbis/stub/register_types.cpp4
-rw-r--r--modules/vorbis/stub/register_types.h4
-rw-r--r--modules/webm/libvpx/SCsub11
-rw-r--r--modules/webm/register_types.cpp13
-rw-r--r--modules/webm/register_types.h4
-rw-r--r--modules/webm/video_stream_webm.cpp4
-rw-r--r--modules/webm/video_stream_webm.h5
-rw-r--r--modules/webp/SCsub2
-rw-r--r--modules/webp/image_loader_webp.cpp4
-rw-r--r--modules/webp/image_loader_webp.h4
-rw-r--r--modules/webp/register_types.cpp4
-rw-r--r--modules/webp/register_types.h4
-rw-r--r--modules/websocket/doc_classes/WebSocketClient.xml2
-rw-r--r--modules/websocket/doc_classes/WebSocketPeer.xml2
-rw-r--r--modules/websocket/emws_client.cpp9
-rw-r--r--modules/websocket/emws_client.h5
-rw-r--r--modules/websocket/emws_peer.cpp5
-rw-r--r--modules/websocket/emws_peer.h5
-rw-r--r--modules/websocket/emws_server.cpp5
-rw-r--r--modules/websocket/emws_server.h5
-rw-r--r--modules/websocket/lws_client.cpp5
-rw-r--r--modules/websocket/lws_client.h5
-rw-r--r--modules/websocket/lws_helper.cpp4
-rw-r--r--modules/websocket/lws_helper.h20
-rw-r--r--modules/websocket/lws_peer.cpp5
-rw-r--r--modules/websocket/lws_peer.h5
-rw-r--r--modules/websocket/lws_server.cpp5
-rw-r--r--modules/websocket/lws_server.h5
-rw-r--r--modules/websocket/packet_buffer.h4
-rw-r--r--modules/websocket/register_types.cpp5
-rw-r--r--modules/websocket/register_types.h5
-rw-r--r--modules/websocket/websocket_client.cpp5
-rw-r--r--modules/websocket/websocket_client.h5
-rw-r--r--modules/websocket/websocket_macros.h5
-rw-r--r--modules/websocket/websocket_multiplayer.cpp5
-rw-r--r--modules/websocket/websocket_multiplayer.h5
-rw-r--r--modules/websocket/websocket_peer.cpp5
-rw-r--r--modules/websocket/websocket_peer.h5
-rw-r--r--modules/websocket/websocket_server.cpp5
-rw-r--r--modules/websocket/websocket_server.h5
-rw-r--r--modules/xatlas_unwrap/register_types.cpp4
-rw-r--r--modules/xatlas_unwrap/register_types.h4
-rw-r--r--platform/android/AndroidManifest.xml.template22
-rw-r--r--platform/android/SCsub18
-rw-r--r--platform/android/android_native_app_glue.c437
-rw-r--r--platform/android/android_native_app_glue.h351
-rw-r--r--platform/android/audio_driver_jandroid.cpp8
-rw-r--r--platform/android/audio_driver_jandroid.h7
-rw-r--r--platform/android/audio_driver_opensl.cpp4
-rw-r--r--platform/android/audio_driver_opensl.h4
-rw-r--r--platform/android/build.gradle.template7
-rw-r--r--platform/android/detect.py27
-rw-r--r--platform/android/dir_access_android.cpp190
-rw-r--r--platform/android/dir_access_jandroid.cpp7
-rw-r--r--platform/android/dir_access_jandroid.h7
-rw-r--r--platform/android/export/export.cpp65
-rw-r--r--platform/android/export/export.h4
-rw-r--r--platform/android/file_access_android.cpp4
-rw-r--r--platform/android/file_access_android.h4
-rw-r--r--platform/android/file_access_jandroid.cpp8
-rw-r--r--platform/android/file_access_jandroid.h8
-rw-r--r--platform/android/godot_android.cpp937
-rw-r--r--platform/android/ifaddrs_android.cpp230
-rw-r--r--platform/android/java/README.md47
-rw-r--r--platform/android/java/gradle/wrapper/gradle-wrapper.jarbin53636 -> 54329 bytes
-rw-r--r--platform/android/java/gradle/wrapper/gradle-wrapper.properties3
-rwxr-xr-xplatform/android/java/gradlew72
-rw-r--r--platform/android/java/gradlew.bat174
-rw-r--r--platform/android/java/res/drawable-hdpi/notify_panel_notification_icon_bg.pngbin462 -> 1843 bytes
-rw-r--r--platform/android/java/res/drawable-mdpi/notify_panel_notification_icon_bg.pngbin127 -> 718 bytes
-rw-r--r--platform/android/java/res/drawable-nodpi/icon.png (renamed from platform/android/java/res/drawable/icon.png)bin7569 -> 7569 bytes
-rw-r--r--platform/android/java/res/drawable-xhdpi/notify_panel_notification_icon_bg.pngbin0 -> 462 bytes
-rw-r--r--platform/android/java/res/drawable-xxhdpi/notify_panel_notification_icon_bg.pngbin0 -> 2830 bytes
-rw-r--r--platform/android/java/res/layout/downloading_expansion.xml47
-rw-r--r--platform/android/java/res/layout/status_bar_ongoing_event_progress_bar.xml30
-rw-r--r--platform/android/java/res/values-ko/strings.xml2
-rw-r--r--platform/android/java/res/values-v11/styles.xml6
-rw-r--r--platform/android/java/res/values-v9/styles.xml5
-rw-r--r--platform/android/java/res/values/strings.xml2
-rw-r--r--platform/android/java/src/com/android/vending/licensing/AESObfuscator.java110
-rw-r--r--platform/android/java/src/com/android/vending/licensing/APKExpansionPolicy.java397
-rw-r--r--platform/android/java/src/com/android/vending/licensing/ILicenseResultListener.java115
-rw-r--r--platform/android/java/src/com/android/vending/licensing/ILicensingService.java115
-rw-r--r--platform/android/java/src/com/android/vending/licensing/LicenseChecker.java351
-rw-r--r--platform/android/java/src/com/android/vending/licensing/LicenseValidator.java224
-rw-r--r--platform/android/java/src/com/android/vending/licensing/PreferenceObfuscator.java77
-rw-r--r--platform/android/java/src/com/android/vending/licensing/ResponseData.java79
-rw-r--r--platform/android/java/src/com/android/vending/licensing/ServerManagedPolicy.java276
-rw-r--r--platform/android/java/src/com/android/vending/licensing/util/Base64.java570
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/Constants.java177
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/DownloadProgressInfo.java80
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderClientMarshaller.java317
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderServiceMarshaller.java270
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/Helpers.java486
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/IDownloaderClient.java62
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/IDownloaderService.java32
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/IStub.java6
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/SystemFacade.java169
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/impl/AndroidHttpClient.java536
-rwxr-xr-xplatform/android/java/src/com/google/android/vending/expansion/downloader/impl/CustomIntentService.java131
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/impl/CustomNotificationFactory.java30
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadInfo.java112
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadNotification.java352
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadThread.java1530
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloaderService.java1941
-rwxr-xr-xplatform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadsDB.java887
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/impl/HttpDateTime.java295
-rw-r--r--platform/android/java/src/com/google/android/vending/expansion/downloader/impl/V14CustomNotification.java101
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/AESObfuscator.java110
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/APKExpansionPolicy.java413
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/DeviceLimiter.java (renamed from platform/android/java/src/com/android/vending/licensing/DeviceLimiter.java)4
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/ILicenseResultListener.aidl (renamed from platform/android/java/src/com/android/vending/licensing/ILicenseResultListener.aidl)0
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/ILicenseResultListener.java100
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/ILicensingService.aidl (renamed from platform/android/java/src/com/android/vending/licensing/ILicensingService.aidl)0
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/ILicensingService.java100
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/LicenseChecker.java387
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/LicenseCheckerCallback.java (renamed from platform/android/java/src/com/android/vending/licensing/LicenseCheckerCallback.java)30
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/LicenseValidator.java232
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/NullDeviceLimiter.java (renamed from platform/android/java/src/com/android/vending/licensing/NullDeviceLimiter.java)6
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/Obfuscator.java (renamed from platform/android/java/src/com/android/vending/licensing/Obfuscator.java)16
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/Policy.java (renamed from platform/android/java/src/com/android/vending/licensing/Policy.java)30
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/PreferenceObfuscator.java78
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/ResponseData.java80
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/ServerManagedPolicy.java299
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/StrictPolicy.java (renamed from platform/android/java/src/com/android/vending/licensing/StrictPolicy.java)66
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/ValidationException.java (renamed from platform/android/java/src/com/android/vending/licensing/ValidationException.java)14
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/util/Base64.java556
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/util/Base64DecoderException.java (renamed from platform/android/java/src/com/android/vending/licensing/util/Base64DecoderException.java)14
-rw-r--r--platform/android/java/src/com/google/android/vending/licensing/util/URIQueryDecoder.java60
-rw-r--r--platform/android/java/src/org/godotengine/godot/Dictionary.java4
-rw-r--r--platform/android/java/src/org/godotengine/godot/Godot.java178
-rw-r--r--platform/android/java/src/org/godotengine/godot/GodotDownloaderAlarmReceiver.java4
-rw-r--r--platform/android/java/src/org/godotengine/godot/GodotDownloaderService.java4
-rw-r--r--platform/android/java/src/org/godotengine/godot/GodotIO.java42
-rw-r--r--platform/android/java/src/org/godotengine/godot/GodotLib.java4
-rw-r--r--platform/android/java/src/org/godotengine/godot/GodotPaymentV3.java4
-rw-r--r--platform/android/java/src/org/godotengine/godot/GodotView.java63
-rw-r--r--platform/android/java/src/org/godotengine/godot/input/GodotEditText.java76
-rw-r--r--platform/android/java/src/org/godotengine/godot/input/GodotTextInputWrapper.java4
-rw-r--r--platform/android/java/src/org/godotengine/godot/input/InputManagerCompat.java7
-rw-r--r--platform/android/java/src/org/godotengine/godot/input/InputManagerV9.java209
-rw-r--r--platform/android/java/src/org/godotengine/godot/payments/ConsumeTask.java92
-rw-r--r--platform/android/java/src/org/godotengine/godot/payments/GenericConsumeTask.java79
-rw-r--r--platform/android/java/src/org/godotengine/godot/payments/HandlePurchaseTask.java4
-rw-r--r--platform/android/java/src/org/godotengine/godot/payments/PaymentsCache.java8
-rw-r--r--platform/android/java/src/org/godotengine/godot/payments/PaymentsManager.java8
-rw-r--r--platform/android/java/src/org/godotengine/godot/payments/PurchaseTask.java4
-rw-r--r--platform/android/java/src/org/godotengine/godot/payments/ReleaseAllConsumablesTask.java86
-rw-r--r--platform/android/java/src/org/godotengine/godot/payments/ValidateTask.java133
-rw-r--r--platform/android/java/src/org/godotengine/godot/utils/Crypt.java4
-rw-r--r--platform/android/java/src/org/godotengine/godot/utils/CustomSSLSocketFactory.java6
-rw-r--r--platform/android/java/src/org/godotengine/godot/utils/HttpRequester.java10
-rw-r--r--platform/android/java/src/org/godotengine/godot/utils/RequestParams.java6
-rw-r--r--platform/android/java_class_wrapper.cpp4
-rw-r--r--platform/android/java_class_wrapper.h4
-rw-r--r--platform/android/java_glue.cpp13
-rw-r--r--platform/android/java_glue.h7
-rw-r--r--platform/android/os_android.cpp23
-rw-r--r--platform/android/os_android.h10
-rw-r--r--platform/android/platform_config.h4
-rw-r--r--platform/android/power_android.cpp6
-rw-r--r--platform/android/power_android.h4
-rwxr-xr-xplatform/android/sign.sh9
-rw-r--r--platform/android/thread_jandroid.cpp4
-rw-r--r--platform/android/thread_jandroid.h4
-rw-r--r--platform/haiku/audio_driver_media_kit.cpp4
-rw-r--r--platform/haiku/audio_driver_media_kit.h4
-rw-r--r--platform/haiku/context_gl_haiku.cpp4
-rw-r--r--platform/haiku/context_gl_haiku.h4
-rw-r--r--platform/haiku/detect.py4
-rw-r--r--platform/haiku/godot_haiku.cpp4
-rw-r--r--platform/haiku/haiku_application.cpp4
-rw-r--r--platform/haiku/haiku_application.h4
-rw-r--r--platform/haiku/haiku_direct_window.cpp4
-rw-r--r--platform/haiku/haiku_direct_window.h4
-rw-r--r--platform/haiku/haiku_gl_view.cpp4
-rw-r--r--platform/haiku/haiku_gl_view.h4
-rw-r--r--platform/haiku/key_mapping_haiku.cpp4
-rw-r--r--platform/haiku/key_mapping_haiku.h4
-rw-r--r--platform/haiku/os_haiku.cpp4
-rw-r--r--platform/haiku/os_haiku.h4
-rw-r--r--platform/haiku/platform_config.h4
-rw-r--r--platform/iphone/SCsub2
-rw-r--r--platform/iphone/app_delegate.h4
-rw-r--r--platform/iphone/app_delegate.mm4
-rw-r--r--platform/iphone/detect.py35
-rw-r--r--platform/iphone/export/export.cpp112
-rw-r--r--platform/iphone/export/export.h4
-rw-r--r--platform/iphone/game_center.h4
-rw-r--r--platform/iphone/game_center.mm4
-rw-r--r--platform/iphone/gl_view.h4
-rw-r--r--platform/iphone/gl_view.mm18
-rw-r--r--platform/iphone/globals/global_defaults.cpp35
-rw-r--r--platform/iphone/globals/global_defaults.h31
-rw-r--r--platform/iphone/godot_iphone.cpp4
-rw-r--r--platform/iphone/icloud.h4
-rw-r--r--platform/iphone/icloud.mm4
-rw-r--r--platform/iphone/in_app_store.h4
-rw-r--r--platform/iphone/in_app_store.mm4
-rw-r--r--platform/iphone/ios.h4
-rw-r--r--platform/iphone/ios.mm4
-rw-r--r--platform/iphone/main.m4
-rw-r--r--platform/iphone/os_iphone.cpp61
-rw-r--r--platform/iphone/os_iphone.h4
-rw-r--r--platform/iphone/platform_config.h4
-rw-r--r--platform/iphone/platform_refcount.h4
-rw-r--r--platform/iphone/power_iphone.cpp4
-rw-r--r--platform/iphone/power_iphone.h4
-rw-r--r--platform/iphone/sem_iphone.cpp4
-rw-r--r--platform/iphone/sem_iphone.h4
-rw-r--r--platform/iphone/view_controller.h4
-rw-r--r--platform/iphone/view_controller.mm4
-rw-r--r--platform/javascript/api/api.cpp4
-rw-r--r--platform/javascript/api/api.h4
-rw-r--r--platform/javascript/api/javascript_eval.h4
-rw-r--r--platform/javascript/audio_driver_javascript.cpp108
-rw-r--r--platform/javascript/audio_driver_javascript.h11
-rw-r--r--platform/javascript/detect.py1
-rw-r--r--platform/javascript/dom_keys.inc4
-rw-r--r--platform/javascript/export/export.cpp4
-rw-r--r--platform/javascript/export/export.h4
-rw-r--r--platform/javascript/http_client.h.inc4
-rw-r--r--platform/javascript/http_client_javascript.cpp4
-rw-r--r--platform/javascript/http_request.h4
-rw-r--r--platform/javascript/http_request.js2
-rw-r--r--platform/javascript/javascript_eval.cpp4
-rw-r--r--platform/javascript/javascript_main.cpp4
-rw-r--r--platform/javascript/os_javascript.cpp162
-rw-r--r--platform/javascript/os_javascript.h9
-rw-r--r--platform/javascript/platform_config.h4
-rw-r--r--platform/osx/crash_handler_osx.h4
-rw-r--r--platform/osx/crash_handler_osx.mm4
-rw-r--r--platform/osx/detect.py14
-rw-r--r--platform/osx/dir_access_osx.h4
-rw-r--r--platform/osx/dir_access_osx.mm4
-rw-r--r--platform/osx/export/export.cpp170
-rw-r--r--platform/osx/export/export.h4
-rw-r--r--platform/osx/godot_main_osx.mm4
-rw-r--r--platform/osx/joypad_osx.cpp4
-rw-r--r--platform/osx/joypad_osx.h4
-rw-r--r--platform/osx/os_osx.h11
-rw-r--r--platform/osx/os_osx.mm74
-rw-r--r--platform/osx/platform_config.h4
-rw-r--r--platform/osx/power_osx.cpp4
-rw-r--r--platform/osx/power_osx.h4
-rw-r--r--platform/osx/sem_osx.cpp4
-rw-r--r--platform/osx/sem_osx.h4
-rw-r--r--platform/register_platform_apis.h4
-rw-r--r--platform/server/detect.py4
-rw-r--r--platform/server/godot_server.cpp4
-rw-r--r--platform/server/os_server.cpp10
-rw-r--r--platform/server/os_server.h7
-rw-r--r--platform/server/platform_config.h4
-rw-r--r--platform/uwp/app.cpp4
-rw-r--r--platform/uwp/app.h4
-rw-r--r--platform/uwp/export/export.cpp6
-rw-r--r--platform/uwp/export/export.h4
-rw-r--r--platform/uwp/gl_context_egl.cpp4
-rw-r--r--platform/uwp/gl_context_egl.h4
-rw-r--r--platform/uwp/joypad_uwp.cpp4
-rw-r--r--platform/uwp/joypad_uwp.h4
-rw-r--r--platform/uwp/os_uwp.cpp4
-rw-r--r--platform/uwp/os_uwp.h4
-rw-r--r--platform/uwp/platform_config.h4
-rw-r--r--platform/uwp/power_uwp.cpp4
-rw-r--r--platform/uwp/power_uwp.h4
-rw-r--r--platform/uwp/thread_uwp.cpp4
-rw-r--r--platform/uwp/thread_uwp.h4
-rw-r--r--platform/windows/context_gl_win.cpp4
-rw-r--r--platform/windows/context_gl_win.h4
-rw-r--r--platform/windows/crash_handler_win.cpp4
-rw-r--r--platform/windows/crash_handler_win.h4
-rw-r--r--platform/windows/ctxgl_procaddr.cpp4
-rw-r--r--platform/windows/ctxgl_procaddr.h4
-rw-r--r--platform/windows/detect.py8
-rw-r--r--platform/windows/export/export.cpp4
-rw-r--r--platform/windows/export/export.h4
-rw-r--r--platform/windows/godot_win.cpp4
-rw-r--r--platform/windows/joypad.cpp4
-rw-r--r--platform/windows/joypad.h4
-rw-r--r--platform/windows/key_mapping_win.cpp4
-rw-r--r--platform/windows/key_mapping_win.h4
-rw-r--r--platform/windows/lang_table.h4
-rw-r--r--platform/windows/os_windows.cpp80
-rw-r--r--platform/windows/os_windows.h6
-rw-r--r--platform/windows/platform_config.h4
-rw-r--r--platform/windows/power_windows.cpp4
-rw-r--r--platform/windows/power_windows.h4
-rw-r--r--platform/windows/windows_terminal_logger.cpp4
-rw-r--r--platform/windows/windows_terminal_logger.h4
-rw-r--r--platform/x11/context_gl_x11.cpp4
-rw-r--r--platform/x11/context_gl_x11.h4
-rw-r--r--platform/x11/crash_handler_x11.cpp4
-rw-r--r--platform/x11/crash_handler_x11.h4
-rw-r--r--platform/x11/detect.py17
-rw-r--r--platform/x11/export/export.cpp4
-rw-r--r--platform/x11/export/export.h4
-rw-r--r--platform/x11/godot_x11.cpp4
-rw-r--r--platform/x11/joypad_linux.cpp4
-rw-r--r--platform/x11/joypad_linux.h4
-rw-r--r--platform/x11/key_mapping_x11.cpp4
-rw-r--r--platform/x11/key_mapping_x11.h4
-rw-r--r--platform/x11/os_x11.cpp483
-rw-r--r--platform/x11/os_x11.h31
-rw-r--r--platform/x11/platform_config.h4
-rw-r--r--platform/x11/power_x11.cpp4
-rw-r--r--platform/x11/power_x11.h4
-rw-r--r--scene/2d/animated_sprite.cpp8
-rw-r--r--scene/2d/animated_sprite.h4
-rw-r--r--scene/2d/area_2d.cpp8
-rw-r--r--scene/2d/area_2d.h4
-rw-r--r--scene/2d/audio_stream_player_2d.cpp4
-rw-r--r--scene/2d/audio_stream_player_2d.h4
-rw-r--r--scene/2d/back_buffer_copy.cpp4
-rw-r--r--scene/2d/back_buffer_copy.h4
-rw-r--r--scene/2d/camera_2d.cpp52
-rw-r--r--scene/2d/camera_2d.h16
-rw-r--r--scene/2d/canvas_item.cpp22
-rw-r--r--scene/2d/canvas_item.h6
-rw-r--r--scene/2d/canvas_modulate.cpp4
-rw-r--r--scene/2d/canvas_modulate.h4
-rw-r--r--scene/2d/collision_object_2d.cpp4
-rw-r--r--scene/2d/collision_object_2d.h4
-rw-r--r--scene/2d/collision_polygon_2d.cpp4
-rw-r--r--scene/2d/collision_polygon_2d.h4
-rw-r--r--scene/2d/collision_shape_2d.cpp4
-rw-r--r--scene/2d/collision_shape_2d.h4
-rw-r--r--scene/2d/cpu_particles_2d.cpp14
-rw-r--r--scene/2d/cpu_particles_2d.h4
-rw-r--r--scene/2d/joints_2d.cpp4
-rw-r--r--scene/2d/joints_2d.h4
-rw-r--r--scene/2d/light_2d.cpp6
-rw-r--r--scene/2d/light_2d.h4
-rw-r--r--scene/2d/light_occluder_2d.cpp4
-rw-r--r--scene/2d/light_occluder_2d.h4
-rw-r--r--scene/2d/line_2d.cpp4
-rw-r--r--scene/2d/line_2d.h4
-rw-r--r--scene/2d/line_builder.cpp8
-rw-r--r--scene/2d/line_builder.h4
-rw-r--r--scene/2d/mesh_instance_2d.cpp4
-rw-r--r--scene/2d/mesh_instance_2d.h4
-rw-r--r--scene/2d/navigation2d.cpp4
-rw-r--r--scene/2d/navigation2d.h4
-rw-r--r--scene/2d/navigation_polygon.cpp14
-rw-r--r--scene/2d/navigation_polygon.h4
-rw-r--r--scene/2d/node_2d.cpp4
-rw-r--r--scene/2d/node_2d.h4
-rw-r--r--scene/2d/parallax_background.cpp8
-rw-r--r--scene/2d/parallax_background.h4
-rw-r--r--scene/2d/parallax_layer.cpp4
-rw-r--r--scene/2d/parallax_layer.h4
-rw-r--r--scene/2d/particles_2d.cpp4
-rw-r--r--scene/2d/particles_2d.h4
-rw-r--r--scene/2d/path_2d.cpp10
-rw-r--r--scene/2d/path_2d.h4
-rw-r--r--scene/2d/path_texture.cpp4
-rw-r--r--scene/2d/path_texture.h4
-rw-r--r--scene/2d/physics_body_2d.cpp26
-rw-r--r--scene/2d/physics_body_2d.h4
-rw-r--r--scene/2d/polygon_2d.cpp317
-rw-r--r--scene/2d/polygon_2d.h14
-rw-r--r--scene/2d/position_2d.cpp4
-rw-r--r--scene/2d/position_2d.h4
-rw-r--r--scene/2d/ray_cast_2d.cpp4
-rw-r--r--scene/2d/ray_cast_2d.h4
-rw-r--r--scene/2d/remote_transform_2d.cpp4
-rw-r--r--scene/2d/remote_transform_2d.h4
-rw-r--r--scene/2d/screen_button.cpp4
-rw-r--r--scene/2d/screen_button.h4
-rw-r--r--scene/2d/skeleton_2d.cpp4
-rw-r--r--scene/2d/skeleton_2d.h4
-rw-r--r--scene/2d/sprite.cpp4
-rw-r--r--scene/2d/sprite.h4
-rw-r--r--scene/2d/tile_map.cpp21
-rw-r--r--scene/2d/tile_map.h4
-rw-r--r--scene/2d/visibility_notifier_2d.cpp6
-rw-r--r--scene/2d/visibility_notifier_2d.h4
-rw-r--r--scene/2d/y_sort.cpp4
-rw-r--r--scene/2d/y_sort.h4
-rw-r--r--scene/3d/area.cpp9
-rw-r--r--scene/3d/area.h4
-rw-r--r--scene/3d/arvr_nodes.cpp6
-rw-r--r--scene/3d/arvr_nodes.h4
-rw-r--r--scene/3d/audio_stream_player_3d.cpp11
-rw-r--r--scene/3d/audio_stream_player_3d.h4
-rw-r--r--scene/3d/baked_lightmap.cpp4
-rw-r--r--scene/3d/baked_lightmap.h4
-rw-r--r--scene/3d/bone_attachment.cpp4
-rw-r--r--scene/3d/bone_attachment.h4
-rw-r--r--scene/3d/camera.cpp4
-rw-r--r--scene/3d/camera.h4
-rw-r--r--scene/3d/collision_object.cpp4
-rw-r--r--scene/3d/collision_object.h4
-rw-r--r--scene/3d/collision_polygon.cpp4
-rw-r--r--scene/3d/collision_polygon.h4
-rw-r--r--scene/3d/collision_shape.cpp4
-rw-r--r--scene/3d/collision_shape.h4
-rw-r--r--scene/3d/cpu_particles.cpp37
-rw-r--r--scene/3d/cpu_particles.h4
-rw-r--r--scene/3d/gi_probe.cpp4
-rw-r--r--scene/3d/gi_probe.h4
-rw-r--r--scene/3d/immediate_geometry.cpp4
-rw-r--r--scene/3d/immediate_geometry.h4
-rw-r--r--scene/3d/interpolated_camera.cpp4
-rw-r--r--scene/3d/interpolated_camera.h4
-rw-r--r--scene/3d/light.cpp4
-rw-r--r--scene/3d/light.h4
-rw-r--r--scene/3d/listener.cpp4
-rw-r--r--scene/3d/listener.h6
-rw-r--r--scene/3d/mesh_instance.cpp6
-rw-r--r--scene/3d/mesh_instance.h4
-rw-r--r--scene/3d/multimesh_instance.cpp4
-rw-r--r--scene/3d/multimesh_instance.h4
-rw-r--r--scene/3d/navigation.cpp4
-rw-r--r--scene/3d/navigation.h4
-rw-r--r--scene/3d/navigation_mesh.cpp4
-rw-r--r--scene/3d/navigation_mesh.h4
-rw-r--r--scene/3d/particles.cpp4
-rw-r--r--scene/3d/particles.h4
-rw-r--r--scene/3d/path.cpp310
-rw-r--r--scene/3d/path.h52
-rw-r--r--scene/3d/physics_body.cpp76
-rw-r--r--scene/3d/physics_body.h22
-rw-r--r--scene/3d/physics_joint.cpp21
-rw-r--r--scene/3d/physics_joint.h11
-rw-r--r--scene/3d/portal.cpp4
-rw-r--r--scene/3d/portal.h4
-rw-r--r--scene/3d/position_3d.cpp4
-rw-r--r--scene/3d/position_3d.h4
-rw-r--r--scene/3d/proximity_group.cpp4
-rw-r--r--scene/3d/proximity_group.h4
-rw-r--r--scene/3d/ray_cast.cpp4
-rw-r--r--scene/3d/ray_cast.h4
-rw-r--r--scene/3d/reflection_probe.cpp4
-rw-r--r--scene/3d/reflection_probe.h4
-rw-r--r--scene/3d/remote_transform.cpp40
-rw-r--r--scene/3d/remote_transform.h4
-rw-r--r--scene/3d/room_instance.cpp4
-rw-r--r--scene/3d/room_instance.h4
-rw-r--r--scene/3d/scenario_fx.cpp4
-rw-r--r--scene/3d/scenario_fx.h4
-rw-r--r--scene/3d/skeleton.cpp4
-rw-r--r--scene/3d/skeleton.h4
-rw-r--r--scene/3d/soft_body.cpp6
-rw-r--r--scene/3d/soft_body.h4
-rw-r--r--scene/3d/spatial.cpp7
-rw-r--r--scene/3d/spatial.h4
-rw-r--r--scene/3d/spatial_velocity_tracker.cpp4
-rw-r--r--scene/3d/spatial_velocity_tracker.h4
-rw-r--r--scene/3d/spring_arm.cpp4
-rw-r--r--scene/3d/spring_arm.h4
-rw-r--r--scene/3d/sprite_3d.cpp20
-rw-r--r--scene/3d/sprite_3d.h4
-rw-r--r--scene/3d/vehicle_body.cpp4
-rw-r--r--scene/3d/vehicle_body.h4
-rw-r--r--scene/3d/visibility_notifier.cpp6
-rw-r--r--scene/3d/visibility_notifier.h4
-rw-r--r--scene/3d/visual_instance.cpp4
-rw-r--r--scene/3d/visual_instance.h4
-rw-r--r--scene/3d/voxel_light_baker.cpp9
-rw-r--r--scene/3d/voxel_light_baker.h4
-rw-r--r--scene/animation/animation_blend_space_1d.cpp6
-rw-r--r--scene/animation/animation_blend_space_1d.h4
-rw-r--r--scene/animation/animation_blend_space_2d.cpp229
-rw-r--r--scene/animation/animation_blend_space_2d.h20
-rw-r--r--scene/animation/animation_blend_tree.cpp9
-rw-r--r--scene/animation/animation_blend_tree.h4
-rw-r--r--scene/animation/animation_cache.cpp4
-rw-r--r--scene/animation/animation_cache.h4
-rw-r--r--scene/animation/animation_node_state_machine.cpp7
-rw-r--r--scene/animation/animation_node_state_machine.h4
-rw-r--r--scene/animation/animation_player.cpp19
-rw-r--r--scene/animation/animation_player.h5
-rw-r--r--scene/animation/animation_tree.cpp38
-rw-r--r--scene/animation/animation_tree.h4
-rw-r--r--scene/animation/animation_tree_player.cpp14
-rw-r--r--scene/animation/animation_tree_player.h6
-rw-r--r--scene/animation/root_motion_view.cpp4
-rw-r--r--scene/animation/root_motion_view.h4
-rw-r--r--scene/animation/skeleton_ik.cpp26
-rw-r--r--scene/animation/skeleton_ik.h10
-rw-r--r--scene/animation/tween.cpp4
-rw-r--r--scene/animation/tween.h4
-rw-r--r--scene/audio/audio_player.cpp4
-rw-r--r--scene/audio/audio_player.h4
-rw-r--r--scene/gui/base_button.cpp31
-rw-r--r--scene/gui/base_button.h9
-rw-r--r--scene/gui/box_container.cpp4
-rw-r--r--scene/gui/box_container.h4
-rw-r--r--scene/gui/button.cpp4
-rw-r--r--scene/gui/button.h4
-rw-r--r--scene/gui/center_container.cpp4
-rw-r--r--scene/gui/center_container.h4
-rw-r--r--scene/gui/check_box.cpp4
-rw-r--r--scene/gui/check_box.h4
-rw-r--r--scene/gui/check_button.cpp4
-rw-r--r--scene/gui/check_button.h4
-rw-r--r--scene/gui/color_picker.cpp63
-rw-r--r--scene/gui/color_picker.h7
-rw-r--r--scene/gui/color_rect.cpp4
-rw-r--r--scene/gui/color_rect.h4
-rw-r--r--scene/gui/container.cpp5
-rw-r--r--scene/gui/container.h4
-rw-r--r--scene/gui/control.cpp22
-rw-r--r--scene/gui/control.h4
-rw-r--r--scene/gui/dialogs.cpp4
-rw-r--r--scene/gui/dialogs.h4
-rw-r--r--scene/gui/file_dialog.cpp7
-rw-r--r--scene/gui/file_dialog.h4
-rw-r--r--scene/gui/gradient_edit.cpp4
-rw-r--r--scene/gui/gradient_edit.h4
-rw-r--r--scene/gui/graph_edit.cpp20
-rw-r--r--scene/gui/graph_edit.h4
-rw-r--r--scene/gui/graph_node.cpp4
-rw-r--r--scene/gui/graph_node.h4
-rw-r--r--scene/gui/grid_container.cpp4
-rw-r--r--scene/gui/grid_container.h4
-rw-r--r--scene/gui/item_list.cpp4
-rw-r--r--scene/gui/item_list.h4
-rw-r--r--scene/gui/label.cpp10
-rw-r--r--scene/gui/label.h4
-rw-r--r--scene/gui/line_edit.cpp30
-rw-r--r--scene/gui/line_edit.h5
-rw-r--r--scene/gui/link_button.cpp4
-rw-r--r--scene/gui/link_button.h4
-rw-r--r--scene/gui/margin_container.cpp4
-rw-r--r--scene/gui/margin_container.h4
-rw-r--r--scene/gui/menu_button.cpp23
-rw-r--r--scene/gui/menu_button.h7
-rw-r--r--scene/gui/nine_patch_rect.cpp4
-rw-r--r--scene/gui/nine_patch_rect.h4
-rw-r--r--scene/gui/option_button.cpp4
-rw-r--r--scene/gui/option_button.h4
-rw-r--r--scene/gui/panel.cpp4
-rw-r--r--scene/gui/panel.h4
-rw-r--r--scene/gui/panel_container.cpp4
-rw-r--r--scene/gui/panel_container.h4
-rw-r--r--scene/gui/popup.cpp10
-rw-r--r--scene/gui/popup.h4
-rw-r--r--scene/gui/popup_menu.cpp6
-rw-r--r--scene/gui/popup_menu.h4
-rw-r--r--scene/gui/progress_bar.cpp4
-rw-r--r--scene/gui/progress_bar.h4
-rw-r--r--scene/gui/range.cpp4
-rw-r--r--scene/gui/range.h4
-rw-r--r--scene/gui/reference_rect.cpp4
-rw-r--r--scene/gui/reference_rect.h4
-rw-r--r--scene/gui/rich_text_label.cpp42
-rw-r--r--scene/gui/rich_text_label.h5
-rw-r--r--scene/gui/scroll_bar.cpp6
-rw-r--r--scene/gui/scroll_bar.h4
-rw-r--r--scene/gui/scroll_container.cpp5
-rw-r--r--scene/gui/scroll_container.h4
-rw-r--r--scene/gui/separator.cpp4
-rw-r--r--scene/gui/separator.h4
-rw-r--r--scene/gui/shortcut.cpp4
-rw-r--r--scene/gui/shortcut.h4
-rw-r--r--scene/gui/slider.cpp4
-rw-r--r--scene/gui/slider.h4
-rw-r--r--scene/gui/spin_box.cpp38
-rw-r--r--scene/gui/spin_box.h8
-rw-r--r--scene/gui/split_container.cpp53
-rw-r--r--scene/gui/split_container.h8
-rw-r--r--scene/gui/tab_container.cpp4
-rw-r--r--scene/gui/tab_container.h4
-rw-r--r--scene/gui/tabs.cpp10
-rw-r--r--scene/gui/tabs.h4
-rw-r--r--scene/gui/text_edit.cpp73
-rw-r--r--scene/gui/text_edit.h9
-rw-r--r--scene/gui/texture_button.cpp4
-rw-r--r--scene/gui/texture_button.h4
-rw-r--r--scene/gui/texture_progress.cpp4
-rw-r--r--scene/gui/texture_progress.h4
-rw-r--r--scene/gui/texture_rect.cpp4
-rw-r--r--scene/gui/texture_rect.h4
-rw-r--r--scene/gui/tool_button.cpp4
-rw-r--r--scene/gui/tool_button.h4
-rw-r--r--scene/gui/tree.cpp42
-rw-r--r--scene/gui/tree.h8
-rw-r--r--scene/gui/video_player.cpp4
-rw-r--r--scene/gui/video_player.h4
-rw-r--r--scene/gui/viewport_container.cpp4
-rw-r--r--scene/gui/viewport_container.h4
-rw-r--r--scene/main/canvas_layer.cpp4
-rw-r--r--scene/main/canvas_layer.h4
-rw-r--r--scene/main/http_request.cpp7
-rw-r--r--scene/main/http_request.h4
-rw-r--r--scene/main/instance_placeholder.cpp4
-rw-r--r--scene/main/instance_placeholder.h4
-rw-r--r--scene/main/node.cpp134
-rw-r--r--scene/main/node.h6
-rw-r--r--scene/main/resource_preloader.cpp4
-rw-r--r--scene/main/resource_preloader.h4
-rw-r--r--scene/main/scene_tree.cpp5
-rw-r--r--scene/main/scene_tree.h4
-rwxr-xr-xscene/main/timer.cpp4
-rwxr-xr-xscene/main/timer.h4
-rw-r--r--scene/main/viewport.cpp151
-rw-r--r--scene/main/viewport.h10
-rw-r--r--scene/register_scene_types.cpp82
-rw-r--r--scene/register_scene_types.h4
-rw-r--r--scene/resources/animation.cpp6
-rw-r--r--scene/resources/animation.h4
-rw-r--r--scene/resources/audio_stream_sample.cpp11
-rw-r--r--scene/resources/audio_stream_sample.h7
-rw-r--r--scene/resources/bit_mask.cpp10
-rw-r--r--scene/resources/bit_mask.h4
-rw-r--r--scene/resources/bounds.cpp4
-rw-r--r--scene/resources/bounds.h4
-rw-r--r--scene/resources/box_shape.cpp4
-rw-r--r--scene/resources/box_shape.h4
-rw-r--r--scene/resources/canvas.cpp4
-rw-r--r--scene/resources/canvas.h4
-rw-r--r--scene/resources/capsule_shape.cpp4
-rw-r--r--scene/resources/capsule_shape.h4
-rw-r--r--scene/resources/capsule_shape_2d.cpp4
-rw-r--r--scene/resources/capsule_shape_2d.h4
-rw-r--r--scene/resources/circle_shape_2d.cpp4
-rw-r--r--scene/resources/circle_shape_2d.h4
-rw-r--r--scene/resources/color_ramp.cpp4
-rw-r--r--scene/resources/color_ramp.h4
-rw-r--r--scene/resources/concave_polygon_shape.cpp4
-rw-r--r--scene/resources/concave_polygon_shape.h4
-rw-r--r--scene/resources/concave_polygon_shape_2d.cpp4
-rw-r--r--scene/resources/concave_polygon_shape_2d.h4
-rw-r--r--scene/resources/convex_polygon_shape.cpp4
-rw-r--r--scene/resources/convex_polygon_shape.h4
-rw-r--r--scene/resources/convex_polygon_shape_2d.cpp4
-rw-r--r--scene/resources/convex_polygon_shape_2d.h4
-rw-r--r--scene/resources/curve.cpp36
-rw-r--r--scene/resources/curve.h4
-rw-r--r--scene/resources/cylinder_shape.cpp4
-rw-r--r--scene/resources/cylinder_shape.h4
-rw-r--r--scene/resources/default_theme/default_theme.cpp9
-rw-r--r--scene/resources/default_theme/default_theme.h4
-rw-r--r--scene/resources/dynamic_font.cpp40
-rw-r--r--scene/resources/dynamic_font.h9
-rw-r--r--scene/resources/dynamic_font_stb.cpp4
-rw-r--r--scene/resources/dynamic_font_stb.h5
-rw-r--r--scene/resources/environment.cpp112
-rw-r--r--scene/resources/environment.h15
-rw-r--r--scene/resources/font.cpp4
-rw-r--r--scene/resources/font.h5
-rw-r--r--scene/resources/material.cpp67
-rw-r--r--scene/resources/material.h6
-rw-r--r--scene/resources/mesh.cpp5
-rw-r--r--scene/resources/mesh.h4
-rw-r--r--scene/resources/mesh_data_tool.cpp4
-rw-r--r--scene/resources/mesh_data_tool.h4
-rw-r--r--scene/resources/mesh_library.cpp4
-rw-r--r--scene/resources/mesh_library.h4
-rw-r--r--scene/resources/multimesh.cpp4
-rw-r--r--scene/resources/multimesh.h4
-rw-r--r--scene/resources/packed_scene.cpp4
-rw-r--r--scene/resources/packed_scene.h4
-rw-r--r--scene/resources/particles_material.cpp21
-rw-r--r--scene/resources/particles_material.h6
-rw-r--r--scene/resources/physics_material.cpp4
-rw-r--r--scene/resources/physics_material.h4
-rw-r--r--scene/resources/plane_shape.cpp4
-rw-r--r--scene/resources/plane_shape.h4
-rw-r--r--scene/resources/polygon_path_finder.cpp4
-rw-r--r--scene/resources/polygon_path_finder.h4
-rw-r--r--scene/resources/primitive_meshes.cpp44
-rw-r--r--scene/resources/primitive_meshes.h4
-rw-r--r--scene/resources/ray_shape.cpp4
-rw-r--r--scene/resources/ray_shape.h4
-rw-r--r--scene/resources/rectangle_shape_2d.cpp4
-rw-r--r--scene/resources/rectangle_shape_2d.h4
-rw-r--r--scene/resources/room.cpp4
-rw-r--r--scene/resources/room.h4
-rw-r--r--scene/resources/scene_format_text.cpp4
-rw-r--r--scene/resources/scene_format_text.h7
-rw-r--r--scene/resources/segment_shape_2d.cpp4
-rw-r--r--scene/resources/segment_shape_2d.h4
-rw-r--r--scene/resources/shader.cpp4
-rw-r--r--scene/resources/shader.h6
-rw-r--r--scene/resources/shape.cpp4
-rw-r--r--scene/resources/shape.h4
-rw-r--r--scene/resources/shape_2d.cpp20
-rw-r--r--scene/resources/shape_2d.h8
-rw-r--r--scene/resources/shape_line_2d.cpp4
-rw-r--r--scene/resources/shape_line_2d.h4
-rw-r--r--scene/resources/sky_box.cpp4
-rw-r--r--scene/resources/sky_box.h4
-rw-r--r--scene/resources/space_2d.cpp4
-rw-r--r--scene/resources/space_2d.h4
-rw-r--r--scene/resources/sphere_shape.cpp4
-rw-r--r--scene/resources/sphere_shape.h4
-rw-r--r--scene/resources/style_box.cpp4
-rw-r--r--scene/resources/style_box.h4
-rw-r--r--scene/resources/surface_tool.cpp108
-rw-r--r--scene/resources/surface_tool.h5
-rw-r--r--scene/resources/text_file.cpp4
-rw-r--r--scene/resources/text_file.h4
-rw-r--r--scene/resources/texture.cpp51
-rw-r--r--scene/resources/texture.h7
-rw-r--r--scene/resources/theme.cpp559
-rw-r--r--scene/resources/theme.h19
-rw-r--r--scene/resources/tile_set.cpp74
-rw-r--r--scene/resources/tile_set.h9
-rw-r--r--scene/resources/video_stream.cpp4
-rw-r--r--scene/resources/video_stream.h4
-rw-r--r--scene/resources/visual_shader.cpp4
-rw-r--r--scene/resources/visual_shader.h4
-rw-r--r--scene/resources/visual_shader_nodes.cpp4
-rw-r--r--scene/resources/visual_shader_nodes.h4
-rw-r--r--scene/resources/world.cpp4
-rw-r--r--scene/resources/world.h4
-rw-r--r--scene/resources/world_2d.cpp4
-rw-r--r--scene/resources/world_2d.h4
-rw-r--r--scene/scene_string_names.cpp4
-rw-r--r--scene/scene_string_names.h4
-rw-r--r--servers/arvr/arvr_interface.cpp4
-rw-r--r--servers/arvr/arvr_interface.h4
-rw-r--r--servers/arvr/arvr_positional_tracker.cpp4
-rw-r--r--servers/arvr/arvr_positional_tracker.h4
-rw-r--r--servers/arvr_server.cpp4
-rw-r--r--servers/arvr_server.h4
-rw-r--r--servers/audio/audio_driver_dummy.cpp4
-rw-r--r--servers/audio/audio_driver_dummy.h4
-rw-r--r--servers/audio/audio_effect.cpp4
-rw-r--r--servers/audio/audio_effect.h4
-rw-r--r--servers/audio/audio_filter_sw.cpp4
-rw-r--r--servers/audio/audio_filter_sw.h4
-rw-r--r--servers/audio/audio_rb_resampler.cpp36
-rw-r--r--servers/audio/audio_rb_resampler.h4
-rw-r--r--servers/audio/audio_stream.cpp11
-rw-r--r--servers/audio/audio_stream.h4
-rw-r--r--servers/audio/effects/audio_effect_amplify.cpp4
-rw-r--r--servers/audio/effects/audio_effect_amplify.h4
-rw-r--r--servers/audio/effects/audio_effect_chorus.cpp4
-rw-r--r--servers/audio/effects/audio_effect_chorus.h4
-rw-r--r--servers/audio/effects/audio_effect_compressor.cpp4
-rw-r--r--servers/audio/effects/audio_effect_compressor.h4
-rw-r--r--servers/audio/effects/audio_effect_delay.cpp4
-rw-r--r--servers/audio/effects/audio_effect_delay.h4
-rw-r--r--servers/audio/effects/audio_effect_distortion.cpp4
-rw-r--r--servers/audio/effects/audio_effect_distortion.h4
-rw-r--r--servers/audio/effects/audio_effect_eq.cpp4
-rw-r--r--servers/audio/effects/audio_effect_eq.h4
-rw-r--r--servers/audio/effects/audio_effect_filter.cpp4
-rw-r--r--servers/audio/effects/audio_effect_filter.h4
-rw-r--r--servers/audio/effects/audio_effect_limiter.cpp4
-rw-r--r--servers/audio/effects/audio_effect_limiter.h4
-rw-r--r--servers/audio/effects/audio_effect_panner.cpp4
-rw-r--r--servers/audio/effects/audio_effect_panner.h4
-rw-r--r--servers/audio/effects/audio_effect_phaser.cpp4
-rw-r--r--servers/audio/effects/audio_effect_phaser.h4
-rw-r--r--servers/audio/effects/audio_effect_pitch_shift.cpp4
-rw-r--r--servers/audio/effects/audio_effect_pitch_shift.h4
-rw-r--r--servers/audio/effects/audio_effect_record.cpp67
-rw-r--r--servers/audio/effects/audio_effect_record.h8
-rw-r--r--servers/audio/effects/audio_effect_reverb.cpp4
-rw-r--r--servers/audio/effects/audio_effect_reverb.h4
-rw-r--r--servers/audio/effects/audio_effect_stereo_enhance.cpp4
-rw-r--r--servers/audio/effects/audio_effect_stereo_enhance.h4
-rw-r--r--servers/audio/effects/eq.cpp4
-rw-r--r--servers/audio/effects/eq.h4
-rw-r--r--servers/audio/effects/reverb.cpp4
-rw-r--r--servers/audio/effects/reverb.h4
-rw-r--r--servers/audio/reverb_sw.cpp4
-rw-r--r--servers/audio/reverb_sw.h4
-rw-r--r--servers/audio/voice_rb_sw.h4
-rw-r--r--servers/audio_server.cpp37
-rw-r--r--servers/audio_server.h10
-rw-r--r--servers/physics/area_pair_sw.cpp4
-rw-r--r--servers/physics/area_pair_sw.h4
-rw-r--r--servers/physics/area_sw.cpp4
-rw-r--r--servers/physics/area_sw.h4
-rw-r--r--servers/physics/body_pair_sw.cpp4
-rw-r--r--servers/physics/body_pair_sw.h4
-rw-r--r--servers/physics/body_sw.cpp8
-rw-r--r--servers/physics/body_sw.h4
-rw-r--r--servers/physics/broad_phase_basic.cpp4
-rw-r--r--servers/physics/broad_phase_basic.h4
-rw-r--r--servers/physics/broad_phase_octree.cpp4
-rw-r--r--servers/physics/broad_phase_octree.h4
-rw-r--r--servers/physics/broad_phase_sw.cpp4
-rw-r--r--servers/physics/broad_phase_sw.h4
-rw-r--r--servers/physics/collision_object_sw.cpp4
-rw-r--r--servers/physics/collision_object_sw.h8
-rw-r--r--servers/physics/collision_solver_sat.cpp4
-rw-r--r--servers/physics/collision_solver_sat.h4
-rw-r--r--servers/physics/collision_solver_sw.cpp4
-rw-r--r--servers/physics/collision_solver_sw.h4
-rw-r--r--servers/physics/constraint_sw.h4
-rw-r--r--servers/physics/gjk_epa.cpp4
-rw-r--r--servers/physics/gjk_epa.h4
-rw-r--r--servers/physics/joints/cone_twist_joint_sw.cpp4
-rw-r--r--servers/physics/joints/cone_twist_joint_sw.h4
-rw-r--r--servers/physics/joints/generic_6dof_joint_sw.cpp4
-rw-r--r--servers/physics/joints/generic_6dof_joint_sw.h4
-rw-r--r--servers/physics/joints/hinge_joint_sw.cpp4
-rw-r--r--servers/physics/joints/hinge_joint_sw.h4
-rw-r--r--servers/physics/joints/jacobian_entry_sw.h4
-rw-r--r--servers/physics/joints/pin_joint_sw.cpp4
-rw-r--r--servers/physics/joints/pin_joint_sw.h4
-rw-r--r--servers/physics/joints/slider_joint_sw.cpp4
-rw-r--r--servers/physics/joints/slider_joint_sw.h4
-rw-r--r--servers/physics/joints_sw.h4
-rw-r--r--servers/physics/physics_server_sw.cpp4
-rw-r--r--servers/physics/physics_server_sw.h7
-rw-r--r--servers/physics/shape_sw.cpp4
-rw-r--r--servers/physics/shape_sw.h4
-rw-r--r--servers/physics/space_sw.cpp4
-rw-r--r--servers/physics/space_sw.h4
-rw-r--r--servers/physics/step_sw.cpp4
-rw-r--r--servers/physics/step_sw.h4
-rw-r--r--servers/physics_2d/area_2d_sw.cpp4
-rw-r--r--servers/physics_2d/area_2d_sw.h4
-rw-r--r--servers/physics_2d/area_pair_2d_sw.cpp4
-rw-r--r--servers/physics_2d/area_pair_2d_sw.h4
-rw-r--r--servers/physics_2d/body_2d_sw.cpp8
-rw-r--r--servers/physics_2d/body_2d_sw.h4
-rw-r--r--servers/physics_2d/body_pair_2d_sw.cpp4
-rw-r--r--servers/physics_2d/body_pair_2d_sw.h4
-rw-r--r--servers/physics_2d/broad_phase_2d_basic.cpp4
-rw-r--r--servers/physics_2d/broad_phase_2d_basic.h4
-rw-r--r--servers/physics_2d/broad_phase_2d_hash_grid.cpp4
-rw-r--r--servers/physics_2d/broad_phase_2d_hash_grid.h4
-rw-r--r--servers/physics_2d/broad_phase_2d_sw.cpp4
-rw-r--r--servers/physics_2d/broad_phase_2d_sw.h4
-rw-r--r--servers/physics_2d/collision_object_2d_sw.cpp4
-rw-r--r--servers/physics_2d/collision_object_2d_sw.h8
-rw-r--r--servers/physics_2d/collision_solver_2d_sat.cpp4
-rw-r--r--servers/physics_2d/collision_solver_2d_sat.h4
-rw-r--r--servers/physics_2d/collision_solver_2d_sw.cpp4
-rw-r--r--servers/physics_2d/collision_solver_2d_sw.h4
-rw-r--r--servers/physics_2d/constraint_2d_sw.h4
-rw-r--r--servers/physics_2d/joints_2d_sw.cpp4
-rw-r--r--servers/physics_2d/joints_2d_sw.h4
-rw-r--r--servers/physics_2d/physics_2d_server_sw.cpp5
-rw-r--r--servers/physics_2d/physics_2d_server_sw.h4
-rw-r--r--servers/physics_2d/physics_2d_server_wrap_mt.cpp4
-rw-r--r--servers/physics_2d/physics_2d_server_wrap_mt.h4
-rw-r--r--servers/physics_2d/shape_2d_sw.cpp4
-rw-r--r--servers/physics_2d/shape_2d_sw.h4
-rw-r--r--servers/physics_2d/space_2d_sw.cpp4
-rw-r--r--servers/physics_2d/space_2d_sw.h4
-rw-r--r--servers/physics_2d/step_2d_sw.cpp4
-rw-r--r--servers/physics_2d/step_2d_sw.h4
-rw-r--r--servers/physics_2d_server.cpp4
-rw-r--r--servers/physics_2d_server.h4
-rw-r--r--servers/physics_server.cpp4
-rw-r--r--servers/physics_server.h7
-rw-r--r--servers/register_server_types.cpp4
-rw-r--r--servers/register_server_types.h4
-rw-r--r--servers/server_wrap_mt_common.h4
-rw-r--r--servers/visual/rasterizer.cpp4
-rw-r--r--servers/visual/rasterizer.h11
-rw-r--r--servers/visual/shader_language.cpp25
-rw-r--r--servers/visual/shader_language.h6
-rw-r--r--servers/visual/shader_types.cpp10
-rw-r--r--servers/visual/shader_types.h4
-rw-r--r--servers/visual/visual_server_canvas.cpp35
-rw-r--r--servers/visual/visual_server_canvas.h4
-rw-r--r--servers/visual/visual_server_global.cpp4
-rw-r--r--servers/visual/visual_server_global.h4
-rw-r--r--servers/visual/visual_server_light_baker.cpp4
-rw-r--r--servers/visual/visual_server_light_baker.h4
-rw-r--r--servers/visual/visual_server_raster.cpp4
-rw-r--r--servers/visual/visual_server_raster.h7
-rw-r--r--servers/visual/visual_server_scene.cpp15
-rw-r--r--servers/visual/visual_server_scene.h4
-rw-r--r--servers/visual/visual_server_viewport.cpp4
-rw-r--r--servers/visual/visual_server_viewport.h4
-rw-r--r--servers/visual/visual_server_wrap_mt.cpp4
-rw-r--r--servers/visual/visual_server_wrap_mt.h7
-rw-r--r--servers/visual_server.cpp14
-rw-r--r--servers/visual_server.h9
-rw-r--r--thirdparty/README.md33
-rw-r--r--thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3BroadphaseCallback.h16
-rw-r--r--thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvh.cpp1393
-rw-r--r--thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvh.h1463
-rw-r--r--thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvhBroadphase.cpp822
-rw-r--r--thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvhBroadphase.h195
-rw-r--r--thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3OverlappingPair.h44
-rw-r--r--thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3OverlappingPairCache.cpp301
-rw-r--r--thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3OverlappingPairCache.h355
-rw-r--r--thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/shared/b3Aabb.h51
-rw-r--r--thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3Config.h40
-rw-r--r--thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3Contact4.h33
-rw-r--r--thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3ConvexUtility.cpp314
-rw-r--r--thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3ConvexUtility.h39
-rw-r--r--thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3CpuNarrowPhase.cpp190
-rw-r--r--thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3CpuNarrowPhase.h61
-rw-r--r--thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3RaycastInfo.h21
-rw-r--r--thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3RigidBodyCL.h8
-rw-r--r--thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3BvhSubtreeInfoData.h13
-rw-r--r--thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3BvhTraversal.h103
-rw-r--r--thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ClipFaces.h219
-rw-r--r--thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3Collidable.h53
-rw-r--r--thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3Contact4Data.h26
-rw-r--r--thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ContactConvexConvexSAT.h478
-rw-r--r--thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ContactSphereSphere.h143
-rw-r--r--thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ConvexPolyhedronData.h22
-rw-r--r--thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3FindConcaveSatAxis.h935
-rw-r--r--thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3FindSeparatingAxis.h149
-rw-r--r--thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3MprPenetration.h1232
-rw-r--r--thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3NewContactReduction.h291
-rw-r--r--thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3QuantizedBvhNodeData.h52
-rw-r--r--thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ReduceContacts.h162
-rw-r--r--thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h23
-rw-r--r--thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3UpdateAabbs.h29
-rw-r--r--thirdparty/bullet/Bullet3Common/b3AlignedAllocator.cpp161
-rw-r--r--thirdparty/bullet/Bullet3Common/b3AlignedAllocator.h99
-rw-r--r--thirdparty/bullet/Bullet3Common/b3AlignedObjectArray.h681
-rw-r--r--thirdparty/bullet/Bullet3Common/b3CommandLineArgs.h77
-rw-r--r--thirdparty/bullet/Bullet3Common/b3FileUtils.h85
-rw-r--r--thirdparty/bullet/Bullet3Common/b3HashMap.h252
-rw-r--r--thirdparty/bullet/Bullet3Common/b3Logging.cpp87
-rw-r--r--thirdparty/bullet/Bullet3Common/b3Logging.h107
-rw-r--r--thirdparty/bullet/Bullet3Common/b3Matrix3x3.h1446
-rw-r--r--thirdparty/bullet/Bullet3Common/b3MinMax.h32
-rw-r--r--thirdparty/bullet/Bullet3Common/b3PoolAllocator.h82
-rw-r--r--thirdparty/bullet/Bullet3Common/b3QuadWord.h243
-rw-r--r--thirdparty/bullet/Bullet3Common/b3Quaternion.h841
-rw-r--r--thirdparty/bullet/Bullet3Common/b3Random.h14
-rw-r--r--thirdparty/bullet/Bullet3Common/b3ResizablePool.h65
-rw-r--r--thirdparty/bullet/Bullet3Common/b3Scalar.h732
-rw-r--r--thirdparty/bullet/Bullet3Common/b3StackAlloc.h96
-rw-r--r--thirdparty/bullet/Bullet3Common/b3Transform.h206
-rw-r--r--thirdparty/bullet/Bullet3Common/b3TransformUtil.h146
-rw-r--r--thirdparty/bullet/Bullet3Common/b3Vector3.cpp2986
-rw-r--r--thirdparty/bullet/Bullet3Common/b3Vector3.h857
-rw-r--r--thirdparty/bullet/Bullet3Common/shared/b3Float4.h137
-rw-r--r--thirdparty/bullet/Bullet3Common/shared/b3Int2.h15
-rw-r--r--thirdparty/bullet/Bullet3Common/shared/b3Int4.h33
-rw-r--r--thirdparty/bullet/Bullet3Common/shared/b3Mat3x3.h108
-rw-r--r--thirdparty/bullet/Bullet3Common/shared/b3PlatformDefinitions.h10
-rw-r--r--thirdparty/bullet/Bullet3Common/shared/b3Quat.h71
-rw-r--r--thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3ContactSolverInfo.h172
-rw-r--r--thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3FixedConstraint.cpp103
-rw-r--r--thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3FixedConstraint.h19
-rw-r--r--thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3Generic6DofConstraint.cpp576
-rw-r--r--thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3Generic6DofConstraint.h567
-rw-r--r--thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3JacobianEntry.h103
-rw-r--r--thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3PgsJacobiSolver.cpp1381
-rw-r--r--thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3PgsJacobiSolver.h144
-rw-r--r--thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3Point2PointConstraint.cpp151
-rw-r--r--thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3Point2PointConstraint.h96
-rw-r--r--thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3SolverBody.h187
-rw-r--r--thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3SolverConstraint.h59
-rw-r--r--thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3TypedConstraint.cpp58
-rw-r--r--thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3TypedConstraint.h210
-rw-r--r--thirdparty/bullet/Bullet3Dynamics/b3CpuRigidBodyPipeline.cpp317
-rw-r--r--thirdparty/bullet/Bullet3Dynamics/b3CpuRigidBodyPipeline.h49
-rw-r--r--thirdparty/bullet/Bullet3Dynamics/shared/b3ContactConstraint4.h19
-rw-r--r--thirdparty/bullet/Bullet3Dynamics/shared/b3ConvertConstraint4.h133
-rw-r--r--thirdparty/bullet/Bullet3Dynamics/shared/b3Inertia.h3
-rw-r--r--thirdparty/bullet/Bullet3Dynamics/shared/b3IntegrateTransforms.h53
-rw-r--r--thirdparty/bullet/Bullet3Geometry/b3AabbUtil.h189
-rw-r--r--thirdparty/bullet/Bullet3Geometry/b3ConvexHullComputer.cpp1554
-rw-r--r--thirdparty/bullet/Bullet3Geometry/b3ConvexHullComputer.h102
-rw-r--r--thirdparty/bullet/Bullet3Geometry/b3GeometryUtil.cpp113
-rw-r--r--thirdparty/bullet/Bullet3Geometry/b3GeometryUtil.h22
-rw-r--r--thirdparty/bullet/Bullet3Geometry/b3GrahamScan2dConvexHull.h63
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuBroadphaseInterface.h28
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.cpp253
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.h68
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.cpp540
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.h68
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.cpp44
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.h24
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.cpp918
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.h146
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3SapAabb.h9
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/gridBroadphaseKernels.h395
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/parallelLinearBvhKernels.h1455
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/sapKernels.h681
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/Initialize/b3OpenCLInclude.h23
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/Initialize/b3OpenCLUtils.cpp590
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/Initialize/b3OpenCLUtils.h140
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3BvhInfo.h17
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ContactCache.cpp7
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ContactCache.h34
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ConvexHullContact.cpp4985
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ConvexHullContact.h148
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ConvexPolyhedronCL.h4
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3GjkEpa.cpp1562
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3GjkEpa.h49
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3OptimizedBvh.cpp296
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3OptimizedBvh.h29
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3QuantizedBvh.cpp551
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3QuantizedBvh.h369
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3StridingMeshInterface.cpp229
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3StridingMeshInterface.h203
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3SupportMappings.h34
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleCallback.cpp4
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleCallback.h9
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleIndexVertexArray.cpp41
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleIndexVertexArray.h113
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3VectorFloat4.h3
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3VoronoiSimplexSolver.cpp493
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3VoronoiSimplexSolver.h149
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/bvhTraversal.h513
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/mprKernels.h2889
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/primitiveContacts.h2575
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/satClipHullContacts.h4195
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/satConcaveKernels.h2911
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/satKernels.h4205
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3BoundSearchCL.cpp162
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3BoundSearchCL.h55
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3BufferInfoCL.h7
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3FillCL.cpp83
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3FillCL.h63
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3LauncherCL.cpp376
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3LauncherCL.h165
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h174
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanCL.cpp84
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanCL.h14
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanFloat4CL.cpp86
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanFloat4CL.h12
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3RadixSort32CL.cpp730
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3RadixSort32CL.h103
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/BoundSearchKernelsCL.h171
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/CopyKernelsCL.h261
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/FillKernelsCL.h179
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/PrefixScanKernelsCL.h255
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/PrefixScanKernelsFloat4CL.h255
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/RadixSort32KernelsCL.h1817
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/Raycast/b3GpuRaycast.cpp259
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/Raycast/b3GpuRaycast.h22
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/Raycast/kernels/rayCastKernels.h759
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuConstraint4.h11
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuGenericConstraint.cpp75
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuGenericConstraint.h64
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuJacobiContactSolver.cpp639
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuJacobiContactSolver.h22
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuNarrowPhase.cpp732
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuNarrowPhase.h72
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuNarrowPhaseInternalData.h74
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsConstraintSolver.cpp692
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsConstraintSolver.h50
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsContactSolver.cpp1251
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsContactSolver.h30
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.cpp351
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.h42
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipelineInternalData.h39
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuSolverBody.h120
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuSolverConstraint.h63
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/b3Solver.cpp835
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/b3Solver.h126
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/batchingKernels.h773
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/batchingKernelsNew.h579
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/integrateKernel.h863
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/jointSolver.h1439
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/solveContact.h783
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/solveFriction.h839
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/solverSetup.h1403
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/solverSetup2.h1199
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/solverUtils.h1815
-rw-r--r--thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/updateAabbsKernel.h963
-rw-r--r--thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/autogenerated/bullet2.h1994
-rw-r--r--thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3BulletFile.cpp253
-rw-r--r--thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3BulletFile.h69
-rw-r--r--thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Chunk.cpp12
-rw-r--r--thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Chunk.h130
-rw-r--r--thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Common.h33
-rw-r--r--thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3DNA.cpp355
-rw-r--r--thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3DNA.h141
-rw-r--r--thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Defines.h199
-rw-r--r--thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3File.cpp990
-rw-r--r--thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3File.h253
-rw-r--r--thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Serializer.cpp18970
-rw-r--r--thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Serializer.h808
-rw-r--r--thirdparty/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3.cpp12
-rw-r--r--thirdparty/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3.h8
-rw-r--r--thirdparty/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3Internal.h528
-rw-r--r--thirdparty/bullet/BulletCollision/BroadphaseCollision/btBroadphaseInterface.h53
-rw-r--r--thirdparty/bullet/BulletCollision/BroadphaseCollision/btBroadphaseProxy.cpp2
-rw-r--r--thirdparty/bullet/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h193
-rw-r--r--thirdparty/bullet/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.cpp1
-rw-r--r--thirdparty/bullet/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h42
-rw-r--r--thirdparty/bullet/BulletCollision/BroadphaseCollision/btDbvt.cpp1395
-rw-r--r--thirdparty/bullet/BulletCollision/BroadphaseCollision/btDbvt.h1517
-rw-r--r--thirdparty/bullet/BulletCollision/BroadphaseCollision/btDbvtBroadphase.cpp855
-rw-r--r--thirdparty/bullet/BulletCollision/BroadphaseCollision/btDbvtBroadphase.h148
-rw-r--r--thirdparty/bullet/BulletCollision/BroadphaseCollision/btDispatcher.cpp2
-rw-r--r--thirdparty/bullet/BulletCollision/BroadphaseCollision/btDispatcher.h87
-rw-r--r--thirdparty/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp384
-rw-r--r--thirdparty/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h348
-rw-r--r--thirdparty/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCallback.h16
-rw-r--r--thirdparty/bullet/BulletCollision/BroadphaseCollision/btQuantizedBvh.cpp594
-rw-r--r--thirdparty/bullet/BulletCollision/BroadphaseCollision/btQuantizedBvh.h336
-rw-r--r--thirdparty/bullet/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp147
-rw-r--r--thirdparty/bullet/BulletCollision/BroadphaseCollision/btSimpleBroadphase.h107
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/SphereTriangleDetector.cpp148
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/SphereTriangleDetector.h24
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.cpp28
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h12
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.cpp106
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.h25
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.cpp30
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.h25
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btBoxBoxDetector.cpp1225
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btBoxBoxDetector.h12
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionConfiguration.h12
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionCreateFunc.h10
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp188
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcher.h88
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.cpp236
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.h16
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionObject.cpp79
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionObject.h372
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h26
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionWorld.cpp1390
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionWorld.h344
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionWorldImporter.cpp812
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionWorldImporter.h98
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp231
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h45
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btCompoundCompoundCollisionAlgorithm.cpp306
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btCompoundCompoundCollisionAlgorithm.h45
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.cpp99
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.h49
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp183
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h74
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp979
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h46
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.cpp96
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.h46
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.cpp219
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h87
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.cpp8
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h18
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btGhostObject.cpp97
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btGhostObject.h79
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btHashedSimplePairCache.cpp85
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btHashedSimplePairCache.h99
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp750
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h18
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btManifoldResult.cpp182
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btManifoldResult.h90
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp264
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btSimulationIslandManager.h38
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.cpp89
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.h38
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.cpp36
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h26
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.cpp32
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h30
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btUnionFind.cpp50
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionDispatch/btUnionFind.h172
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btBox2dShape.cpp25
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btBox2dShape.h349
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btBoxShape.cpp30
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btBoxShape.h317
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp328
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h81
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btCapsuleShape.cpp81
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btCapsuleShape.h109
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btCollisionMargin.h7
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btCollisionShape.cpp57
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btCollisionShape.h89
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btCompoundShape.cpp192
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btCompoundShape.h97
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btConcaveShape.cpp3
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btConcaveShape.h20
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btConeShape.cpp107
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btConeShape.h141
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btConvex2dShape.cpp46
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btConvex2dShape.h55
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btConvexHullShape.cpp150
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btConvexHullShape.h61
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btConvexInternalShape.cpp124
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btConvexInternalShape.h123
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btConvexPointCloudShape.cpp94
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btConvexPointCloudShape.h46
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btConvexPolyhedron.cpp187
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btConvexPolyhedron.h45
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btConvexShape.cpp631
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btConvexShape.h56
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp312
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h55
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btCylinderShape.cpp203
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btCylinderShape.h131
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btEmptyShape.cpp18
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btEmptyShape.h31
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp286
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h87
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btMaterial.h21
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btMiniSDF.cpp540
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btMiniSDF.h37
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btMinkowskiSumShape.cpp50
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btMinkowskiSumShape.h45
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btMultiSphereShape.cpp134
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btMultiSphereShape.h56
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.cpp40
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.h150
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btOptimizedBvh.cpp296
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btOptimizedBvh.h29
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btPolyhedralConvexShape.cpp382
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btPolyhedralConvexShape.h75
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.cpp62
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h53
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btSdfCollisionShape.cpp35
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btSdfCollisionShape.h19
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btShapeHull.cpp670
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btShapeHull.h23
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btSphereShape.cpp36
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btSphereShape.h37
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btStaticPlaneShape.cpp58
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btStaticPlaneShape.h72
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp370
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btStridingMeshInterface.h167
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btTetrahedronShape.cpp177
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btTetrahedronShape.h45
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleBuffer.cpp25
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleBuffer.h32
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleCallback.cpp4
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleCallback.h9
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp41
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h113
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.cpp82
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.h77
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleInfoMap.h122
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleMesh.cpp92
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleMesh.h65
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp106
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleMeshShape.h36
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleShape.h125
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btUniformScalingShape.cpp118
-rw-r--r--thirdparty/bullet/BulletCollision/CollisionShapes/btUniformScalingShape.h61
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/btBoxCollision.h471
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/btClipPolygon.h139
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/btCompoundFromGimpact.h162
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/btContactProcessing.cpp122
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/btContactProcessing.h20
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/btContactProcessingStructs.h92
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/btGImpactBvh.cpp286
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/btGImpactBvh.h109
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/btGImpactBvhStructs.h35
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.cpp636
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h246
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/btGImpactMassUtil.h34
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/btGImpactQuantizedBvh.cpp304
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/btGImpactQuantizedBvh.h121
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/btGImpactQuantizedBvhStructs.h28
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/btGImpactShape.cpp198
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/btGImpactShape.h669
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/btGenericPoolAllocator.cpp125
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/btGenericPoolAllocator.h50
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/btGeometryOperations.h224
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/btQuantization.h43
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/btTriangleShapeEx.cpp265
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/btTriangleShapeEx.h73
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/gim_array.h336
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/gim_basic_geometry_operations.h542
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/gim_bitset.h50
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/gim_box_collision.h397
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/gim_box_set.cpp88
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/gim_box_set.h275
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/gim_clip_polygon.h181
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/gim_contact.cpp74
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/gim_contact.h126
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/gim_geom_types.h7
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/gim_geometry.h2
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/gim_hash_table.h1385
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/gim_linear_math.h2269
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/gim_math.h111
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/gim_memory.cpp69
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/gim_memory.h171
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/gim_radixsort.h214
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/gim_tri_collision.cpp321
-rw-r--r--thirdparty/bullet/BulletCollision/Gimpact/gim_tri_collision.h274
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btComputeGjkEpaPenetration.h633
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp125
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.h34
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btConvexCast.h71
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h21
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h57
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkCollisionDescription.h32
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.cpp76
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h26
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpa2.cpp1703
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpa2.h62
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpa3.h1824
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.cpp23
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h29
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp494
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h52
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h277
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.cpp253
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h18
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btMprPenetration.h1160
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp218
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h125
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btPointCollector.h24
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.cpp354
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.h17
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp135
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h45
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h19
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp118
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h23
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.cpp493
-rw-r--r--thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h154
-rw-r--r--thirdparty/bullet/BulletDynamics/Character/btCharacterControllerInterface.h33
-rw-r--r--thirdparty/bullet/BulletDynamics/Character/btKinematicCharacterController.cpp364
-rw-r--r--thirdparty/bullet/BulletDynamics/Character/btKinematicCharacterController.h114
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btBatchedConstraints.cpp1794
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btBatchedConstraints.h70
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp604
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h266
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btConstraintSolver.h32
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btContactConstraint.cpp136
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btContactConstraint.h30
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btContactSolverInfo.h189
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btFixedConstraint.cpp19
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btFixedConstraint.h11
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btGearConstraint.cpp28
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btGearConstraint.h94
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp708
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h664
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.cpp640
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.h533
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.cpp64
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h96
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btHinge2Constraint.cpp29
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btHinge2Constraint.h27
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp683
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btHingeConstraint.h415
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btJacobianEntry.h103
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btNNCGConstraintSolver.cpp262
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btNNCGConstraintSolver.h35
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.cpp184
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h131
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp1755
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h187
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolverMt.cpp2555
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolverMt.h168
-rwxr-xr-xthirdparty/bullet/BulletDynamics/ConstraintSolver/btSliderConstraint.cpp640
-rwxr-xr-xthirdparty/bullet/BulletDynamics/ConstraintSolver/btSliderConstraint.h213
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.cpp170
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.h88
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btSolverBody.h191
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btSolverConstraint.h70
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btTypedConstraint.cpp102
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btTypedConstraint.h225
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btUniversalConstraint.cpp43
-rw-r--r--thirdparty/bullet/BulletDynamics/ConstraintSolver/btUniversalConstraint.h30
-rw-r--r--thirdparty/bullet/BulletDynamics/Dynamics/btActionInterface.h11
-rw-r--r--thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp1021
-rw-r--r--thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h159
-rw-r--r--thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorldMt.cpp289
-rw-r--r--thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorldMt.h143
-rw-r--r--thirdparty/bullet/BulletDynamics/Dynamics/btDynamicsWorld.h200
-rw-r--r--thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.cpp263
-rw-r--r--thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.h504
-rw-r--r--thirdparty/bullet/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp114
-rw-r--r--thirdparty/bullet/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h57
-rw-r--r--thirdparty/bullet/BulletDynamics/Dynamics/btSimulationIslandManagerMt.cpp1023
-rw-r--r--thirdparty/bullet/BulletDynamics/Dynamics/btSimulationIslandManagerMt.h128
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBody.cpp2058
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBody.h946
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyConstraint.cpp670
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyConstraint.h167
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyConstraintSolver.cpp1399
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyConstraintSolver.h113
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyDynamicsWorld.cpp861
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyDynamicsWorld.h65
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyFixedConstraint.cpp184
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyFixedConstraint.h81
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyGearConstraint.cpp86
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyGearConstraint.h90
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyJointFeedback.h6
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyJointLimitConstraint.cpp94
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyJointLimitConstraint.h13
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyJointMotor.cpp101
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyJointMotor.h46
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyLink.h191
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyLinkCollider.h61
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyPoint2Point.cpp113
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyPoint2Point.h30
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodySliderConstraint.cpp221
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodySliderConstraint.h103
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodySolverConstraint.h82
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodySphericalJointMotor.cpp172
-rw-r--r--thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodySphericalJointMotor.h77
-rw-r--r--thirdparty/bullet/BulletDynamics/MLCPSolvers/btDantzigLCP.cpp3526
-rw-r--r--thirdparty/bullet/BulletDynamics/MLCPSolvers/btDantzigLCP.h12
-rw-r--r--thirdparty/bullet/BulletDynamics/MLCPSolvers/btDantzigSolver.h32
-rw-r--r--thirdparty/bullet/BulletDynamics/MLCPSolvers/btLemkeAlgorithm.cpp482
-rw-r--r--thirdparty/bullet/BulletDynamics/MLCPSolvers/btLemkeAlgorithm.h82
-rw-r--r--thirdparty/bullet/BulletDynamics/MLCPSolvers/btLemkeSolver.h472
-rw-r--r--thirdparty/bullet/BulletDynamics/MLCPSolvers/btMLCPSolver.cpp395
-rw-r--r--thirdparty/bullet/BulletDynamics/MLCPSolvers/btMLCPSolver.h40
-rw-r--r--thirdparty/bullet/BulletDynamics/MLCPSolvers/btMLCPSolverInterface.h4
-rw-r--r--thirdparty/bullet/BulletDynamics/MLCPSolvers/btPATHSolver.h61
-rw-r--r--thirdparty/bullet/BulletDynamics/MLCPSolvers/btSolveProjectedGaussSeidel.h65
-rw-r--r--thirdparty/bullet/BulletDynamics/Vehicle/btRaycastVehicle.cpp554
-rw-r--r--thirdparty/bullet/BulletDynamics/Vehicle/btRaycastVehicle.h158
-rw-r--r--thirdparty/bullet/BulletDynamics/Vehicle/btVehicleRaycaster.h20
-rw-r--r--thirdparty/bullet/BulletDynamics/Vehicle/btWheelInfo.cpp21
-rw-r--r--thirdparty/bullet/BulletDynamics/Vehicle/btWheelInfo.h107
-rw-r--r--thirdparty/bullet/BulletInverseDynamics/IDConfig.hpp26
-rw-r--r--thirdparty/bullet/BulletInverseDynamics/IDConfigBuiltin.hpp19
-rw-r--r--thirdparty/bullet/BulletInverseDynamics/IDConfigEigen.hpp3
-rw-r--r--thirdparty/bullet/BulletInverseDynamics/IDErrorMessages.hpp18
-rw-r--r--thirdparty/bullet/BulletInverseDynamics/IDMath.cpp351
-rw-r--r--thirdparty/bullet/BulletInverseDynamics/IDMath.hpp15
-rw-r--r--thirdparty/bullet/BulletInverseDynamics/MultiBodyTree.cpp345
-rw-r--r--thirdparty/bullet/BulletInverseDynamics/MultiBodyTree.hpp94
-rw-r--r--thirdparty/bullet/BulletInverseDynamics/details/IDEigenInterface.hpp23
-rw-r--r--thirdparty/bullet/BulletInverseDynamics/details/IDLinearMathInterface.hpp156
-rw-r--r--thirdparty/bullet/BulletInverseDynamics/details/IDMatVec.hpp324
-rw-r--r--thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeImpl.cpp933
-rw-r--r--thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeImpl.hpp93
-rw-r--r--thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeInitCache.cpp60
-rw-r--r--thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeInitCache.hpp14
-rw-r--r--thirdparty/bullet/BulletSoftBody/btDefaultSoftBodySolver.cpp69
-rw-r--r--thirdparty/bullet/BulletSoftBody/btDefaultSoftBodySolver.h27
-rw-r--r--thirdparty/bullet/BulletSoftBody/btSoftBody.cpp3766
-rw-r--r--thirdparty/bullet/BulletSoftBody/btSoftBody.h1474
-rw-r--r--thirdparty/bullet/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.cpp198
-rw-r--r--thirdparty/bullet/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.h70
-rw-r--r--thirdparty/bullet/BulletSoftBody/btSoftBodyData.h311
-rw-r--r--thirdparty/bullet/BulletSoftBody/btSoftBodyHelpers.cpp1282
-rw-r--r--thirdparty/bullet/BulletSoftBody/btSoftBodyHelpers.h231
-rw-r--r--thirdparty/bullet/BulletSoftBody/btSoftBodyInternals.h1086
-rw-r--r--thirdparty/bullet/BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.cpp73
-rw-r--r--thirdparty/bullet/BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.h21
-rw-r--r--thirdparty/bullet/BulletSoftBody/btSoftBodySolverVertexBuffer.h13
-rw-r--r--thirdparty/bullet/BulletSoftBody/btSoftBodySolvers.h34
-rw-r--r--thirdparty/bullet/BulletSoftBody/btSoftMultiBodyDynamicsWorld.cpp241
-rw-r--r--thirdparty/bullet/BulletSoftBody/btSoftMultiBodyDynamicsWorld.h67
-rw-r--r--thirdparty/bullet/BulletSoftBody/btSoftRigidCollisionAlgorithm.cpp35
-rw-r--r--thirdparty/bullet/BulletSoftBody/btSoftRigidCollisionAlgorithm.h28
-rw-r--r--thirdparty/bullet/BulletSoftBody/btSoftRigidDynamicsWorld.cpp241
-rw-r--r--thirdparty/bullet/BulletSoftBody/btSoftRigidDynamicsWorld.h67
-rw-r--r--thirdparty/bullet/BulletSoftBody/btSoftSoftCollisionAlgorithm.cpp12
-rw-r--r--thirdparty/bullet/BulletSoftBody/btSoftSoftCollisionAlgorithm.h28
-rw-r--r--thirdparty/bullet/BulletSoftBody/btSparseSDF.h378
-rw-r--r--thirdparty/bullet/LinearMath/TaskScheduler/btTaskScheduler.cpp1406
-rw-r--r--thirdparty/bullet/LinearMath/TaskScheduler/btThreadSupportInterface.h76
-rw-r--r--thirdparty/bullet/LinearMath/TaskScheduler/btThreadSupportPosix.cpp458
-rw-r--r--thirdparty/bullet/LinearMath/TaskScheduler/btThreadSupportWin32.cpp700
-rw-r--r--thirdparty/bullet/LinearMath/btAabbUtil2.h175
-rw-r--r--thirdparty/bullet/LinearMath/btAlignedAllocator.cpp266
-rw-r--r--thirdparty/bullet/LinearMath/btAlignedAllocator.h100
-rw-r--r--thirdparty/bullet/LinearMath/btAlignedObjectArray.h653
-rw-r--r--thirdparty/bullet/LinearMath/btConvexHull.cpp951
-rw-r--r--thirdparty/bullet/LinearMath/btConvexHull.h180
-rw-r--r--thirdparty/bullet/LinearMath/btConvexHullComputer.cpp1574
-rw-r--r--thirdparty/bullet/LinearMath/btConvexHullComputer.h102
-rw-r--r--thirdparty/bullet/LinearMath/btCpuFeatureUtility.h38
-rw-r--r--thirdparty/bullet/LinearMath/btDefaultMotionState.h28
-rw-r--r--thirdparty/bullet/LinearMath/btGeometryUtil.cpp113
-rw-r--r--thirdparty/bullet/LinearMath/btGeometryUtil.h22
-rw-r--r--thirdparty/bullet/LinearMath/btGrahamScan2dConvexHull.h91
-rw-r--r--thirdparty/bullet/LinearMath/btHashMap.h248
-rw-r--r--thirdparty/bullet/LinearMath/btIDebugDraw.h340
-rw-r--r--thirdparty/bullet/LinearMath/btList.h92
-rw-r--r--thirdparty/bullet/LinearMath/btMatrix3x3.h1472
-rw-r--r--thirdparty/bullet/LinearMath/btMatrixX.h387
-rw-r--r--thirdparty/bullet/LinearMath/btMinMax.h32
-rw-r--r--thirdparty/bullet/LinearMath/btMotionState.h26
-rw-r--r--thirdparty/bullet/LinearMath/btPolarDecomposition.cpp144
-rw-r--r--thirdparty/bullet/LinearMath/btPolarDecomposition.h29
-rw-r--r--thirdparty/bullet/LinearMath/btPoolAllocator.h98
-rw-r--r--thirdparty/bullet/LinearMath/btQuadWord.h244
-rw-r--r--thirdparty/bullet/LinearMath/btQuaternion.h895
-rw-r--r--thirdparty/bullet/LinearMath/btQuickprof.cpp617
-rw-r--r--thirdparty/bullet/LinearMath/btQuickprof.h208
-rw-r--r--thirdparty/bullet/LinearMath/btRandom.h13
-rw-r--r--thirdparty/bullet/LinearMath/btScalar.h18
-rw-r--r--thirdparty/bullet/LinearMath/btSerializer.cpp3
-rw-r--r--thirdparty/bullet/LinearMath/btSerializer.h1195
-rw-r--r--thirdparty/bullet/LinearMath/btSerializer64.cpp2
-rw-r--r--thirdparty/bullet/LinearMath/btSpatialAlgebra.h248
-rw-r--r--thirdparty/bullet/LinearMath/btStackAlloc.h96
-rw-r--r--thirdparty/bullet/LinearMath/btThreads.cpp941
-rw-r--r--thirdparty/bullet/LinearMath/btThreads.h97
-rw-r--r--thirdparty/bullet/LinearMath/btTransform.h207
-rw-r--r--thirdparty/bullet/LinearMath/btTransformUtil.h158
-rw-r--r--thirdparty/bullet/LinearMath/btVector3.cpp3038
-rw-r--r--thirdparty/bullet/LinearMath/btVector3.h1069
-rw-r--r--thirdparty/bullet/btBulletCollisionCommon.h4
-rw-r--r--thirdparty/bullet/btBulletDynamicsCommon.h10
-rw-r--r--thirdparty/bullet/clew/clew.c582
-rw-r--r--thirdparty/bullet/clew/clew.h4597
-rw-r--r--thirdparty/certs/ca-certificates.crt207
-rw-r--r--thirdparty/enet/enet/godot.h4
-rw-r--r--thirdparty/enet/godot.cpp68
-rw-r--r--thirdparty/freetype/include/freetype/config/ftoption.h4
-rw-r--r--thirdparty/glad/glad.c1533
-rw-r--r--thirdparty/glad/glad/glad.h87
-rw-r--r--thirdparty/libvpx/third_party/android/cpu-features.c (renamed from platform/android/cpu-features.c)334
-rw-r--r--thirdparty/libvpx/third_party/android/cpu-features.h (renamed from platform/android/cpu-features.h)123
-rw-r--r--thirdparty/libwebp/src/dec/alphai_dec.h2
-rw-r--r--thirdparty/libwebp/src/dec/buffer_dec.c3
-rw-r--r--thirdparty/libwebp/src/dec/common_dec.h2
-rw-r--r--thirdparty/libwebp/src/dec/frame_dec.c9
-rw-r--r--thirdparty/libwebp/src/dec/idec_dec.c25
-rw-r--r--thirdparty/libwebp/src/dec/vp8_dec.h2
-rw-r--r--thirdparty/libwebp/src/dec/vp8i_dec.h4
-rw-r--r--thirdparty/libwebp/src/dec/vp8l_dec.c103
-rw-r--r--thirdparty/libwebp/src/dec/vp8li_dec.h2
-rw-r--r--thirdparty/libwebp/src/dec/webpi_dec.h2
-rw-r--r--thirdparty/libwebp/src/demux/demux.c2
-rw-r--r--thirdparty/libwebp/src/dsp/dsp.h6
-rw-r--r--thirdparty/libwebp/src/dsp/enc.c6
-rw-r--r--thirdparty/libwebp/src/dsp/enc_avx2.c21
-rw-r--r--thirdparty/libwebp/src/dsp/lossless.c2
-rw-r--r--thirdparty/libwebp/src/dsp/lossless.h14
-rw-r--r--thirdparty/libwebp/src/dsp/lossless_enc.c86
-rw-r--r--thirdparty/libwebp/src/dsp/lossless_enc_mips32.c79
-rw-r--r--thirdparty/libwebp/src/dsp/lossless_enc_sse2.c44
-rw-r--r--thirdparty/libwebp/src/dsp/msa_macro.h2
-rw-r--r--thirdparty/libwebp/src/dsp/rescaler.c4
-rw-r--r--thirdparty/libwebp/src/dsp/rescaler_mips32.c4
-rw-r--r--thirdparty/libwebp/src/dsp/rescaler_mips_dsp_r2.c10
-rw-r--r--thirdparty/libwebp/src/dsp/rescaler_msa.c7
-rw-r--r--thirdparty/libwebp/src/dsp/rescaler_neon.c18
-rw-r--r--thirdparty/libwebp/src/dsp/rescaler_sse2.c35
-rw-r--r--thirdparty/libwebp/src/dsp/yuv.h2
-rw-r--r--thirdparty/libwebp/src/enc/analysis_enc.c2
-rw-r--r--thirdparty/libwebp/src/enc/backward_references_cost_enc.c2
-rw-r--r--thirdparty/libwebp/src/enc/backward_references_enc.c1
-rw-r--r--thirdparty/libwebp/src/enc/cost_enc.h2
-rw-r--r--thirdparty/libwebp/src/enc/delta_palettization_enc.c455
-rw-r--r--thirdparty/libwebp/src/enc/delta_palettization_enc.h25
-rw-r--r--thirdparty/libwebp/src/enc/histogram_enc.c196
-rw-r--r--thirdparty/libwebp/src/enc/histogram_enc.h10
-rw-r--r--thirdparty/libwebp/src/enc/iterator_enc.c2
-rw-r--r--thirdparty/libwebp/src/enc/picture_tools_enc.c41
-rw-r--r--thirdparty/libwebp/src/enc/vp8i_enc.h6
-rw-r--r--thirdparty/libwebp/src/enc/vp8l_enc.c17
-rw-r--r--thirdparty/libwebp/src/enc/vp8li_enc.h2
-rw-r--r--thirdparty/libwebp/src/mux/animi.h2
-rw-r--r--thirdparty/libwebp/src/mux/muxedit.c18
-rw-r--r--thirdparty/libwebp/src/mux/muxi.h18
-rw-r--r--thirdparty/libwebp/src/mux/muxinternal.c53
-rw-r--r--thirdparty/libwebp/src/mux/muxread.c61
-rw-r--r--thirdparty/libwebp/src/utils/bit_reader_inl_utils.h2
-rw-r--r--thirdparty/libwebp/src/utils/bit_reader_utils.h2
-rw-r--r--thirdparty/libwebp/src/utils/bit_writer_utils.h2
-rw-r--r--thirdparty/libwebp/src/utils/filters_utils.h2
-rw-r--r--thirdparty/libwebp/src/utils/quant_levels_dec_utils.c8
-rw-r--r--thirdparty/libwebp/src/utils/quant_levels_dec_utils.h2
-rw-r--r--thirdparty/libwebp/src/utils/quant_levels_utils.h2
-rw-r--r--thirdparty/libwebp/src/utils/random_utils.h2
-rw-r--r--thirdparty/libwebp/src/utils/rescaler_utils.h2
-rw-r--r--thirdparty/libwebp/src/utils/thread_utils.h2
-rw-r--r--thirdparty/libwebp/src/utils/utils.h2
-rw-r--r--thirdparty/libwebp/src/webp/decode.h2
-rw-r--r--thirdparty/libwebp/src/webp/demux.h2
-rw-r--r--thirdparty/libwebp/src/webp/encode.h2
-rw-r--r--thirdparty/libwebp/src/webp/format_constants.h2
-rw-r--r--thirdparty/libwebp/src/webp/mux.h2
-rw-r--r--thirdparty/libwebp/src/webp/mux_types.h2
-rw-r--r--thirdparty/libwebp/src/webp/types.h2
-rw-r--r--thirdparty/mbedtls/include/mbedtls/config.h14
-rw-r--r--thirdparty/misc/ifaddrs-android.cc221
-rw-r--r--thirdparty/misc/ifaddrs-android.h (renamed from platform/android/ifaddrs_android.h)14
-rw-r--r--thirdparty/squish/Add-Decompress-Bc5-to-Squish.patch143
-rw-r--r--thirdparty/squish/colourblock.cpp89
-rw-r--r--thirdparty/squish/godot-changes.patch102
-rw-r--r--thirdparty/tinyexr/tinyexr.h253
-rw-r--r--thirdparty/zstd/1314.diff13
-rw-r--r--thirdparty/zstd/common/bitstream.h48
-rw-r--r--thirdparty/zstd/common/compiler.h49
-rw-r--r--thirdparty/zstd/common/cpu.h5
-rw-r--r--thirdparty/zstd/common/debug.c44
-rw-r--r--thirdparty/zstd/common/debug.h134
-rw-r--r--thirdparty/zstd/common/entropy_common.c17
-rw-r--r--thirdparty/zstd/common/error_private.c6
-rw-r--r--thirdparty/zstd/common/fse.h90
-rw-r--r--thirdparty/zstd/common/fse_decompress.c2
-rw-r--r--thirdparty/zstd/common/huf.h85
-rw-r--r--thirdparty/zstd/common/mem.h22
-rw-r--r--thirdparty/zstd/common/pool.c123
-rw-r--r--thirdparty/zstd/common/pool.h48
-rw-r--r--thirdparty/zstd/common/xxhash.c1
-rw-r--r--thirdparty/zstd/common/zstd_common.c9
-rw-r--r--thirdparty/zstd/common/zstd_errors.h1
-rw-r--r--thirdparty/zstd/common/zstd_internal.h58
-rw-r--r--thirdparty/zstd/compress/fse_compress.c296
-rw-r--r--thirdparty/zstd/compress/hist.c203
-rw-r--r--thirdparty/zstd/compress/hist.h95
-rw-r--r--thirdparty/zstd/compress/huf_compress.c84
-rw-r--r--thirdparty/zstd/compress/zstd_compress.c2141
-rw-r--r--thirdparty/zstd/compress/zstd_compress_internal.h243
-rw-r--r--thirdparty/zstd/compress/zstd_double_fast.c362
-rw-r--r--thirdparty/zstd/compress/zstd_double_fast.h10
-rw-r--r--thirdparty/zstd/compress/zstd_fast.c292
-rw-r--r--thirdparty/zstd/compress/zstd_fast.h10
-rw-r--r--thirdparty/zstd/compress/zstd_lazy.c554
-rw-r--r--thirdparty/zstd/compress/zstd_lazy.h33
-rw-r--r--thirdparty/zstd/compress/zstd_ldm.c128
-rw-r--r--thirdparty/zstd/compress/zstd_ldm.h12
-rw-r--r--thirdparty/zstd/compress/zstd_opt.c910
-rw-r--r--thirdparty/zstd/compress/zstd_opt.h28
-rw-r--r--thirdparty/zstd/compress/zstdmt_compress.c584
-rw-r--r--thirdparty/zstd/compress/zstdmt_compress.h60
-rw-r--r--thirdparty/zstd/decompress/huf_decompress.c868
-rw-r--r--thirdparty/zstd/decompress/zstd_ddict.c240
-rw-r--r--thirdparty/zstd/decompress/zstd_ddict.h44
-rw-r--r--thirdparty/zstd/decompress/zstd_decompress.c2017
-rw-r--r--thirdparty/zstd/decompress/zstd_decompress_block.c1307
-rw-r--r--thirdparty/zstd/decompress/zstd_decompress_block.h59
-rw-r--r--thirdparty/zstd/decompress/zstd_decompress_internal.h168
-rw-r--r--thirdparty/zstd/zstd.h1631
-rw-r--r--version.py2
3021 files changed, 252941 insertions, 168007 deletions
diff --git a/.appveyor.yml b/.appveyor.yml
index 567da9cd5d..bd4a7b0ca8 100644
--- a/.appveyor.yml
+++ b/.appveyor.yml
@@ -18,7 +18,7 @@ cache:
install:
- SET "PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%"
- pip install -U wheel # needed for pip install scons to work, otherwise a flag is missing
- - pip install scons
+ - pip install scons==3.0.1
- if defined VS call "%VS%" %ARCH% # if defined - so we can also use mingw
before_build:
diff --git a/.editorconfig b/.editorconfig
index d4b7fbb471..ab03b8421c 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -9,7 +9,7 @@ insert_final_newline = true
[*.{cpp,hpp,c,h,mm}]
trim_trailing_whitespace = true
-[*.{py,cs}]
+[{*.{py,cs},SCsub}]
indent_style = space
indent_size = 4
diff --git a/.travis.yml b/.travis.yml
index a8bc8289e4..c3302cf806 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -87,7 +87,8 @@ install:
misc/travis/android-tools-linux.sh;
fi
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then
- misc/travis/scons-local-osx.sh;
+ pip install --user scons;
+ export PATH=${PATH}:/Users/travis/Library/Python/2.7/bin;
fi
- if [ "$TRAVIS_OS_NAME" = "osx" ] && [ "$PLATFORM" = "android" ]; then
misc/travis/android-tools-osx.sh;
diff --git a/AUTHORS.md b/AUTHORS.md
index 2f109aff6e..7859a3cd37 100644
--- a/AUTHORS.md
+++ b/AUTHORS.md
@@ -33,6 +33,7 @@ name is available.
Alket Rexhepi (alketii)
Andrea Catania (AndreaCatania)
Andreas Haas (Hinsbart)
+ Andrii Doroshenko (Xrayez)
Andy Moss (MillionOstrich)
Anton Yabchinskiy (a12n)
Aren Villanueva (kurikaesu)
@@ -46,13 +47,16 @@ name is available.
bruvzg
Carl Olsson (not-surt)
Chris Bradfield (cbscribe)
+ Clay John (clayjohn)
Dana Olson (adolson)
Daniel J. Ramirez (djrm)
+ Dharkael (lupoDharkael)
Dmitry Koteroff (Krakean)
DualMatrix
Emmanuel Leblond (touilleMan)
Eric Lasota (elasota)
est31
+ Fabian Mathews (supagu)
Fabio Alessandrelli (Faless)
Ferenc Arn (tagcup)
Franklin Sobrinho (TheHX)
@@ -123,6 +127,7 @@ name is available.
Theo Hallenius (TheoXD)
Thomas Herzog (karroffel)
Timo (toger5)
+ Timo Schwarzer (timoschwarzer)
Vinzenz Feenstra (vinzenz)
박한얼 (volzhs)
V. Vamsi Krishna (vkbsb)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index a8e4650710..04e42d14b6 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -59,7 +59,8 @@ by drag and dropping the file in the GitHub edition field.
If you want to add new engine functionalities, please make sure that:
-* This functionality is desired.
+* This functionality is desired, which means that it solves a common use case
+ that several users will need in their real-life projects.
* You talked to other developers on how to implement it best (on either
communication channel, and maybe in a GitHub issue first before making your
PR).
@@ -70,10 +71,18 @@ Similar rules can be applied when contributing bug fixes - it's always best to
discuss the implementation in the bug report first if you are not 100% about
what would be the best fix.
+[This blog post](https://godotengine.org/article/will-your-contribution-be-merged-heres-how-tell)
+outlines the process used by core developers when assessing PRs. We strongly
+recommend that you have a look at it to know what's important to take into
+account for a PR to be considered for merging.
+
In addition to the following tips, also take a look at the
[Engine development guide](https://docs.godotengine.org/en/latest/development/cpp/)
for an introduction to developing on Godot.
+The [Contributing docs](http://docs.godotengine.org/en/latest/community/contributing/index.html)
+also have important information on the PR workflow and the code style we use.
+
#### Be nice to the git history
Try to make simple PRs that handle one specific topic. Just like for reporting
@@ -93,6 +102,9 @@ Internet).
This git style guide has some good practices to have in mind:
[Git Style Guide](https://github.com/agis-/git-style-guide)
+See our [PR workflow](http://docs.godotengine.org/en/latest/community/contributing/pr_workflow.html)
+documentation for tips on using Git, amending commits and rebasing branches.
+
#### Format your commit logs with readability in mind
The way you format your commit logs is quite important to ensure that the
@@ -138,6 +150,10 @@ Weblate](https://hosted.weblate.org/projects/godot-engine/godot), an open
source and web-based translation platform. Please refer to the [translation
readme](editor/translations/README.md) for more information.
+You can also help translate [Godot's
+documentation](https://hosted.weblate.org/projects/godot-engine/godot-docs/)
+on Weblate.
+
## Communicating with developers
The Godot Engine community has [many communication
diff --git a/COPYRIGHT.txt b/COPYRIGHT.txt
index 894cd1a53a..17141df66f 100644
--- a/COPYRIGHT.txt
+++ b/COPYRIGHT.txt
@@ -43,8 +43,8 @@ Source: https://github.com/godotengine/godot
Files: *
Comment: Godot Engine
-Copyright: 2007-2018, Juan Linietsky, Ariel Manzur.
- 2014-2018, Godot Engine contributors.
+Copyright: 2007-2019, Juan Linietsky, Ariel Manzur.
+ 2014-2019, Godot Engine contributors.
License: Expat
Files: ./icon.png
@@ -55,31 +55,16 @@ Comment: Godot Engine logo
Copyright: 2017, Andrea Calabró
License: CC-BY-3.0
-Files: ./platform/android/android_native_app_glue.c
- ./platform/android/android_native_app_glue.h
- ./platform/android/java/aidl/com/android/vending/billing/IInAppBillingService.aidl
+Files: ./platform/android/java/aidl/com/android/vending/billing/IInAppBillingService.aidl
./platform/android/java/res/layout/status_bar_ongoing_event_progress_bar.xml
- ./platform/android/java/src/com/android/vending/licensing/*
./platform/android/java/src/com/google/android/vending/expansion/downloader/*
+ ./platform/android/java/src/com/google/android/vending/licensing/*
./platform/android/java/src/org/godotengine/godot/input/InputManagerCompat.java
./platform/android/java/src/org/godotengine/godot/input/InputManagerV16.java
- ./platform/android/java/src/org/godotengine/godot/input/InputManagerV9.java
Comment: The Android Open Source Project
Copyright: 2008-2013, The Android Open Source Project
License: Apache-2.0
-Files: ./platform/android/cpu-features.c
- ./platform/android/cpu-features.h
-Comment: The Android Open Source Project
-Copyright: 2010, The Android Open Source Project
-License: BSD-2-clause
-
-Files: ./platform/android/ifaddrs_android.cpp
- ./platform/android/ifaddrs_android.h
-Comment: The Android Open Source Project
-Copyright: 2012-2013, Google Inc.
-License: BSD-3-clause
-
Files: ./platform/android/java/src/com/android/vending/licensing/util/Base64.java
./platform/android/java/src/com/android/vending/licensing/util/Base64DecoderException.java
Comment: The Android Open Source Project
@@ -92,8 +77,8 @@ Files: ./platform/android/power_android.cpp
./platform/x11/power_x11.cpp
Comment: Simple DirectMedia Layer
Copyright: 1997-2017, Sam Lantinga
- 2007-2018, Juan Linietsky, Ariel Manzur.
- 2014-2018, Godot Engine contributors.
+ 2007-2019, Juan Linietsky, Ariel Manzur.
+ 2014-2019, Godot Engine contributors.
License: Expat and Zlib
Files: ./scene/animation/tween_interpolaters.cpp
@@ -113,16 +98,16 @@ Files: ./servers/physics/gjk_epa.cpp
./servers/physics/joints/slider_joint_sw.h
Comment: Bullet Continuous Collision Detection and Physics Library
Copyright: 2003-2008, Erwin Coumans
- 2007-2018, Juan Linietsky, Ariel Manzur.
- 2014-2018, Godot Engine contributors.
+ 2007-2019, Juan Linietsky, Ariel Manzur.
+ 2014-2019, Godot Engine contributors.
License: Expat and Zlib
Files: ./servers/physics/joints/cone_twist_joint_sw.cpp
./servers/physics/joints/cone_twist_joint_sw.h
Comment: Bullet Continuous Collision Detection and Physics Library
Copyright: 2007, Starbreeze Studios
- 2007-2018, Juan Linietsky, Ariel Manzur.
- 2014-2018, Godot Engine contributors.
+ 2007-2019, Juan Linietsky, Ariel Manzur.
+ 2014-2019, Godot Engine contributors.
License: Expat and Zlib
Files: ./thirdparty/b2d_convexdecomp/
@@ -225,6 +210,12 @@ Comment: The WebM Project
Copyright: 2010, The WebM Project authors.
License: BSD-3-clause
+Files: ./thirdparty/libvpx/third_party/android/cpu-features.c
+ ./thirdparty/libvpx/third_party/android/cpu-features.h
+Comment: The Android Open Source Project
+Copyright: 2010, The Android Open Source Project
+License: BSD-2-clause
+
Files: ./thirdparty/libwebp/
Comment: WebP codec
Copyright: 2010, Google Inc.
@@ -295,6 +286,12 @@ Comment: hq2x implementation
Copyright: 2016, Bruno Ribeiro
License: Apache-2.0
+Files: ./thirdparty/misc/ifaddrs-android.cc
+ ./thirdparty/misc/ifaddrs-android.h
+Comment: libjingle
+Copyright: 2012-2013, Google Inc.
+License: BSD-3-clause
+
Files: ./thirdparty/misc/md5.cpp
./thirdparty/misc/md5.h
Comment: MD5 Message Digest Algorithm
@@ -382,7 +379,7 @@ License: Expat
Files: ./thirdparty/tinyexr/
Comment: TinyEXR
-Copyright: 2014-2017, Syoyo Fujita
+Copyright: 2014-2018, Syoyo Fujita
2002, Industrial Light & Magic, a division of Lucas Digital Ltd. LLC
License: BSD-3-clause
diff --git a/DONORS.md b/DONORS.md
index 2c9bb1eb73..fc7ece5e7a 100644
--- a/DONORS.md
+++ b/DONORS.md
@@ -22,38 +22,50 @@ generous deed immortalized in the next stable release of Godot Engine.
## Mini sponsors
+ Alan Beauchamp
Andrew Dunai
+ Arda Erol
Brandon Lamb
Christian Uldall Pedersen
Christoph Woinke
- David Graham
+ Edward Flick
GameDev.net
Hein-Pieter van Braam
- iDev.Network Studios
Jamal Alyafei
+ Javary Games
+ Jay Sistar
+ Justin Arnold
+ Kyle Szklenski
Leona Eden
Matthieu Huvé
+ Maxim Karsten
Mike King
Nathan Warden
Neal Gompa (Conan Kudo)
Patrick Aarstad
+ Pers
+ "Rainway "
Ruslan Mustakov
Slobodan Milnovic
+ StarFlare Software
Stephan Lanfermann
Stoney Meyerhoeffer
thechris
- Thomas Mathews
VilliHaukka
## Gold donors
Asdf
cheese65536
+ David Gehrig
+ Edward E
K9Kraken
Manuele Finocchiaro
Nathanael Beisiegel
Officine Pixel S.n.c.
Retro Village
+ Valorware
+ Zashi
Zaven Muradyan
13MHz
@@ -61,20 +73,26 @@ generous deed immortalized in the next stable release of Godot Engine.
Andreas Schüle
Austen McRae
Daniel Lynn
- David Gehrig
+ David Giardi
Florian Breisch
Gary Oberbrunner
+ Gero
Jay Horton
Johannes Wuensch
+ Jon Woodward
Joshua Lesperance
+ Justo Delgado Baudí
Krzysztof Dluzniewski
- Kyle Szklenski
- Mohammad Taleb
Moonwards
+ Mored1984
+ Not Invader Zim
+ paul gruenbacher
Paul LaMotte
- Ranoller
+ Rob Messick
Sergey
Svenne Krap
+ William Wold
+ Wyatt Goodin
Xananax
BanjoNode2D
@@ -84,14 +102,15 @@ generous deed immortalized in the next stable release of Godot Engine.
Conrad Curry
Craig Smith
Daniel Egger
- David Churchill
Dean Harmon
+ Ivan Trombley
+ Joan Fons
John
- Justo Delgado Baudí
- KTL
+ Krzysztof Jankowski
Laurence Bannister
+ Lucas Ferreira Franca
Markus Wiesner
- paul gruenbacher
+ Nathan Lundquist
Rami
Robert Willes
Robin Arys
@@ -105,56 +124,68 @@ generous deed immortalized in the next stable release of Godot Engine.
Alessandra Pereyra
Alexey Dyadchenko
Amanda Haldy
+ Benjamin W Flint
Chau Siu Hung
Chris Brown
+ Chris Goddard
Chris Petrich
+ Christian Leth Jeppesen
Cody Parker
+ ComicSads
D
Deadly Lampshade
E.G.
Eric
Eric Monson
Ethan Bennis
- Fidget Sinner
+ Eugenio Hugo Salgüero Jáñez
+ Eulogio Enamorado Pallares
flesk
- G Barnes
- Gero
GGGames.org
Giovanni Solimeno
Guilherme Felipe de C. G. da Silva
- Hasen Judy
Heath Hayes
+ Hysteria
Jeppe Zapp
- joe513
+ Jose Malheiro
+ Juan T Chen
Juraj Móza
- Justin Arnold
+ Klavdij Voncina
Leandro Voltolino
+ Lukáš Rendvanský
Marius Kamm
+ Martin Eigel
Marvin
- Nahuel Sacchetti
+ Max R.R. Collada
Nick Nikitin
- Pablo Cholaky
+ Oliver Dick
+ oziatek
Pete Goodwin
+ Ranoller
ray-tracer
Ruben Soares Luis
+ Samuel Judd
Sofox
Stoned Xander
- Trent McPheron
+ Tobias Bocanegra
WytRabbit
+ Xavier Fumado Beltran
Zachariah Gibbons
## Silver donors
1D_Inc
+ 2drealms
+ Adam Brunnmeier
Adam Carr
Adam Smeltzer
Adisibio
Alder Stefano
Alessandro Senese
+ Alexander Gillberg
Alexander Koppe
- Anders Jensen-Urstad
+ Andreas Krampitz
Anthony Bongiovanni
- Arda Erol
Arthur S. Muszynski
Artur Barichello
Aubrey Falconer
@@ -163,12 +194,12 @@ generous deed immortalized in the next stable release of Godot Engine.
Bastian Böhm
Benedikt
Ben Vercammen
+ Bernd Jänichen
Blair Allen
Brandon
Bryan Stevenson
Carl Winder
Carwyn Edwards
- Casey Foote
Chris Chapin
Christian Baune
Christian Winter
@@ -176,42 +207,44 @@ generous deed immortalized in the next stable release of Godot Engine.
Daniel Johnson
Daniel Kaplan
DanielMaximiano
- David
David Cravens
David May
- Disktra
Dominik Wetzel
- Duy Kevin Nguyen
+ DOXA
Edward Herbert
- Elias Nykrem
+ Elmeri '- Duy Kevin Nguyen
Eric Martini
+ Eric McCarthy
Eric Williams
- Eugenio Hugo Salgüero Jáñez
Fabian Becker
fengjiongmax
Foomf
G3Dev sàrl
George Lesica
Gerrit Großkopf
- Gilberto K. Otubo
+ Grant Clarke
Greg Olson
Guldoman
+ Haley Aycock
Heribert Hirth
Hunter Jones
ialex32x
- Jahn Johansen
+ Igor Buzatovic
Jaime Ruiz-Borau Vizárraga
Jako Danar
Jeff Hungerford
+ Jeremy Kahn
+ Joao Senerchia
Joel Fivat
Johan Lindberg
Jonas Rudlang
Jonas Yamazaki
+ Jonathan G
Jonathan Martin
Jonathan Nieto
+ Jonathon
Jon Bonazza
Jon Sully
- Jose Malheiro
Josh 'Cheeseness' Bush
Juanfran
Juan Negrier
@@ -220,20 +253,20 @@ generous deed immortalized in the next stable release of Godot Engine.
Justin Luk
KC Chan
Kevin Boyer
- Kevin Kamper Meejach Petersen
- Klavdij Voncina
- Krzysztof Jankowski
- Krzysztof Sierszecki
+ Kevin van Rooijen
+ Klagsam
KsyTek Games
+ Kuan Cheang
+ kycho
Linus Lind Lundgren
- Loreshaper Games
Luis Moraes
Macil
magodev
+ Major Haul
Malcolm
- Martin Eigel
+ Markus Michael Egger
+ Matthias Grandis
Matt Welke
- Max R.R. Collada
Maxwell
Mertcan Mermerkaya
mhilbrunner
@@ -251,12 +284,10 @@ generous deed immortalized in the next stable release of Godot Engine.
Niclas Eriksen
Nicolás Montaña
Nicolas SAN AGUSTIN
- Nik
- Noi Sek
+ nitenook
Pan Ip
Pascal Grüter
Patrick Nafarrete
- Paul E Hansen
Paul Gieske
Paul Mason
Paweł Kowal
@@ -265,29 +296,41 @@ generous deed immortalized in the next stable release of Godot Engine.
Pietro Vertechi
Piotr Kaczmarski
Prokhorenko Leonid
+ Psyagnostic
+ Rafael
+ rayos
Rémi Verschelde
+ Ricardo Alcantara
Richman Stewart
Roger Burgess
Roger Smith
+ Roland RzÄ…sa
Roman Tinkov
Sasori Olkof
+ Sebastian Michailidis
+ Shane Spoor
Sootstone
Theo Cranmore
+ Théo Hay
Thibault Barbaroux
Thomas Bell
Thomas Holmes
Thomas Kurz
tiansheng li
Tim
+ Tim Drumheller
Tom Larrow
- Trym Nilsen
- Tyggve Sollid
+ Troy Austin
+ Tryggve Sollid
Tyler Stafos
UltyX
Vaiktorg
Victor
Viktor Ferenczi
+ Vladimir Soukup
waka nya
+ William Gervasio
+ William Hogben
Wout Standaert
## Bronze donors
diff --git a/LICENSE.txt b/LICENSE.txt
index c7ad3ddaa3..11b3b89c8e 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -1,5 +1,5 @@
-Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/SConstruct b/SConstruct
index 628aac42af..57fa305a15 100644
--- a/SConstruct
+++ b/SConstruct
@@ -21,7 +21,6 @@ active_platforms = []
active_platform_ids = []
platform_exporters = []
platform_apis = []
-global_defaults = []
for x in sorted(glob.glob("platform/*")):
if (not os.path.isdir(x) or not os.path.exists(x + "/detect.py")):
@@ -35,8 +34,6 @@ for x in sorted(glob.glob("platform/*")):
platform_exporters.append(x[9:])
if (os.path.exists(x + "/api/api.cpp")):
platform_apis.append(x[9:])
- if (os.path.exists(x + "/globals/global_defaults.cpp")):
- global_defaults.append(x[9:])
if (detect.is_active()):
active_platforms.append(detect.get_name())
active_platform_ids.append(x)
@@ -68,7 +65,6 @@ if 'TERM' in os.environ:
env_base['ENV']['TERM'] = os.environ['TERM']
env_base.AppendENVPath('PATH', os.getenv('PATH'))
env_base.AppendENVPath('PKG_CONFIG_PATH', os.getenv('PKG_CONFIG_PATH'))
-env_base.global_defaults = global_defaults
env_base.android_maven_repos = []
env_base.android_flat_dirs = []
env_base.android_dependencies = []
@@ -168,7 +164,7 @@ opts.Add('extra_suffix', "Custom extra suffix added to the base filename of all
opts.Add(BoolVariable('vsproj', "Generate a Visual Studio solution", False))
opts.Add(EnumVariable('macports_clang', "Build using Clang from MacPorts", 'no', ('no', '5.0', 'devel')))
opts.Add(BoolVariable('disable_3d', "Disable 3D nodes for a smaller executable", False))
-opts.Add(BoolVariable('disable_advanced_gui', "Disable advanced 3D GUI nodes and behaviors", False))
+opts.Add(BoolVariable('disable_advanced_gui', "Disable advanced GUI nodes and behaviors", False))
opts.Add(BoolVariable('no_editor_splash', "Don't use the custom splash screen for the editor", False))
opts.Add('system_certs_path', "Use this path as SSL certificates default for editor (for package maintainers)", '')
@@ -425,8 +421,13 @@ if selected_platform in platform_list:
# (SH)LIBSUFFIX will be used for our own built libraries
# LIBSUFFIXES contains LIBSUFFIX and SHLIBSUFFIX by default,
# so we need to append the default suffixes to keep the ability
- # to link against thirdparty libraries (.a, .so, .dll, etc.).
- env["LIBSUFFIXES"] += [env["LIBSUFFIX"], env["SHLIBSUFFIX"]]
+ # to link against thirdparty libraries (.a, .so, .lib, etc.).
+ if os.name == "nt":
+ # On Windows, only static libraries and import libraries can be
+ # statically linked - both using .lib extension
+ env["LIBSUFFIXES"] += [env["LIBSUFFIX"]]
+ else:
+ env["LIBSUFFIXES"] += [env["LIBSUFFIX"], env["SHLIBSUFFIX"]]
env["LIBSUFFIX"] = suffix + env["LIBSUFFIX"]
env["SHLIBSUFFIX"] = suffix + env["SHLIBSUFFIX"]
diff --git a/core/SCsub b/core/SCsub
index c6d0b7e5b1..00d0bcac24 100644
--- a/core/SCsub
+++ b/core/SCsub
@@ -8,22 +8,6 @@ from platform_methods import run_in_subprocess
env.core_sources = []
-# Generate global defaults
-gd_call = ""
-gd_inc = ""
-
-for x in env.global_defaults:
- env.core_sources.append("#platform/" + x + "/globals/global_defaults.cpp")
- gd_inc += '#include "platform/' + x + '/globals/global_defaults.h"\n'
- gd_call += "\tregister_" + x + "_global_defaults();\n"
-
-gd_cpp = '#include "core/project_settings.h"\n'
-gd_cpp += gd_inc
-gd_cpp += "void ProjectSettings::register_global_defaults() {\n" + gd_call + "\n}\n"
-
-with open("global_defaults.gen.cpp", "w") as f:
- f.write(gd_cpp)
-
# Generate AES256 script encryption key
import os
@@ -119,6 +103,7 @@ env_thirdparty.add_source_files(env.core_sources, thirdparty_minizip_sources)
if env['builtin_zstd']:
thirdparty_zstd_dir = "#thirdparty/zstd/"
thirdparty_zstd_sources = [
+ "common/debug.c",
"common/entropy_common.c",
"common/error_private.c",
"common/fse_decompress.c",
@@ -127,15 +112,18 @@ if env['builtin_zstd']:
"common/xxhash.c",
"common/zstd_common.c",
"compress/fse_compress.c",
+ "compress/hist.c",
"compress/huf_compress.c",
"compress/zstd_compress.c",
"compress/zstd_double_fast.c",
"compress/zstd_fast.c",
"compress/zstd_lazy.c",
"compress/zstd_ldm.c",
- "compress/zstdmt_compress.c",
"compress/zstd_opt.c",
+ "compress/zstdmt_compress.c",
"decompress/huf_decompress.c",
+ "decompress/zstd_ddict.c",
+ "decompress/zstd_decompress_block.c",
"decompress/zstd_decompress.c",
]
thirdparty_zstd_sources = [thirdparty_zstd_dir + file for file in thirdparty_zstd_sources]
diff --git a/core/allocators.h b/core/allocators.h
index 840b117958..8d4af7a9fb 100644
--- a/core/allocators.h
+++ b/core/allocators.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/array.cpp b/core/array.cpp
index 9708452850..649e610a69 100644
--- a/core/array.cpp
+++ b/core/array.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/array.h b/core/array.h
index fa5113a376..6158db4065 100644
--- a/core/array.h
+++ b/core/array.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/bind/core_bind.cpp b/core/bind/core_bind.cpp
index 0032c43179..e81468e888 100644
--- a/core/bind/core_bind.cpp
+++ b/core/bind/core_bind.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -132,7 +132,7 @@ bool _ResourceLoader::exists(const String &p_path, const String &p_type_hint) {
void _ResourceLoader::_bind_methods() {
ClassDB::bind_method(D_METHOD("load_interactive", "path", "type_hint"), &_ResourceLoader::load_interactive, DEFVAL(""));
- ClassDB::bind_method(D_METHOD("load", "path", "type_hint", "p_no_cache"), &_ResourceLoader::load, DEFVAL(""), DEFVAL(false));
+ ClassDB::bind_method(D_METHOD("load", "path", "type_hint", "no_cache"), &_ResourceLoader::load, DEFVAL(""), DEFVAL(false));
ClassDB::bind_method(D_METHOD("get_recognized_extensions_for_type", "type"), &_ResourceLoader::get_recognized_extensions_for_type);
ClassDB::bind_method(D_METHOD("set_abort_on_missing_resources", "abort"), &_ResourceLoader::set_abort_on_missing_resources);
ClassDB::bind_method(D_METHOD("get_dependencies", "path"), &_ResourceLoader::get_dependencies);
@@ -378,12 +378,20 @@ bool _OS::get_borderless_window() const {
void _OS::set_ime_active(const bool p_active) {
- return OS::get_singleton()->set_ime_active(p_active);
+ OS::get_singleton()->set_ime_active(p_active);
}
void _OS::set_ime_position(const Point2 &p_pos) {
- return OS::get_singleton()->set_ime_position(p_pos);
+ OS::get_singleton()->set_ime_position(p_pos);
+}
+
+Point2 _OS::get_ime_selection() const {
+ return OS::get_singleton()->get_ime_selection();
+}
+
+String _OS::get_ime_text() const {
+ return OS::get_singleton()->get_ime_text();
}
void _OS::set_use_file_access_save_and_swap(bool p_enable) {
@@ -819,6 +827,10 @@ uint64_t _OS::get_system_time_secs() const {
return OS::get_singleton()->get_system_time_secs();
}
+uint64_t _OS::get_system_time_msecs() const {
+ return OS::get_singleton()->get_system_time_msecs();
+}
+
void _OS::delay_usec(uint32_t p_usec) const {
OS::get_singleton()->delay_usec(p_usec);
@@ -1134,7 +1146,10 @@ void _OS::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_window_per_pixel_transparency_enabled"), &_OS::get_window_per_pixel_transparency_enabled);
ClassDB::bind_method(D_METHOD("set_window_per_pixel_transparency_enabled", "enabled"), &_OS::set_window_per_pixel_transparency_enabled);
+ ClassDB::bind_method(D_METHOD("set_ime_active", "active"), &_OS::set_ime_active);
ClassDB::bind_method(D_METHOD("set_ime_position", "position"), &_OS::set_ime_position);
+ ClassDB::bind_method(D_METHOD("get_ime_selection"), &_OS::get_ime_selection);
+ ClassDB::bind_method(D_METHOD("get_ime_text"), &_OS::get_ime_text);
ClassDB::bind_method(D_METHOD("set_screen_orientation", "orientation"), &_OS::set_screen_orientation);
ClassDB::bind_method(D_METHOD("get_screen_orientation"), &_OS::get_screen_orientation);
@@ -1171,6 +1186,7 @@ void _OS::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_datetime_from_unix_time", "unix_time_val"), &_OS::get_datetime_from_unix_time);
ClassDB::bind_method(D_METHOD("get_unix_time_from_datetime", "datetime"), &_OS::get_unix_time_from_datetime);
ClassDB::bind_method(D_METHOD("get_system_time_secs"), &_OS::get_system_time_secs);
+ ClassDB::bind_method(D_METHOD("get_system_time_msecs"), &_OS::get_system_time_msecs);
ClassDB::bind_method(D_METHOD("set_icon", "icon"), &_OS::set_icon);
@@ -2407,7 +2423,7 @@ void _Thread::_start_func(void *ud) {
} break;
case Variant::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS: {
- reason = "Too Many Arguments";
+ reason = "Too Few Arguments";
} break;
case Variant::CallError::CALL_ERROR_INVALID_METHOD: {
diff --git a/core/bind/core_bind.h b/core/bind/core_bind.h
index 720b14bf56..a4b4629037 100644
--- a/core/bind/core_bind.h
+++ b/core/bind/core_bind.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -195,6 +195,8 @@ public:
virtual void set_ime_active(const bool p_active);
virtual void set_ime_position(const Point2 &p_pos);
+ virtual Point2 get_ime_selection() const;
+ virtual String get_ime_text() const;
Error native_video_play(String p_path, float p_volume, String p_audio_track, String p_subtitle_track);
bool native_video_is_playing();
@@ -279,6 +281,7 @@ public:
Dictionary get_time_zone_info() const;
uint64_t get_unix_time() const;
uint64_t get_system_time_secs() const;
+ uint64_t get_system_time_msecs() const;
int get_static_memory_usage() const;
int get_static_memory_peak_usage() const;
diff --git a/core/class_db.cpp b/core/class_db.cpp
index 6565d242a2..219bdbddd8 100644
--- a/core/class_db.cpp
+++ b/core/class_db.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -936,9 +936,8 @@ void ClassDB::add_property(StringName p_class, const PropertyInfo &p_pinfo, cons
}
#ifdef DEBUG_METHODS_ENABLED
-
if (type->property_setget.has(p_pinfo.name)) {
- ERR_EXPLAIN("Object already has property: " + p_class);
+ ERR_EXPLAIN("Object " + p_class + " already has property: " + p_pinfo.name);
ERR_FAIL();
}
#endif
diff --git a/core/class_db.h b/core/class_db.h
index 75f9e8d6a7..321682d76b 100644
--- a/core/class_db.h
+++ b/core/class_db.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/color.cpp b/core/color.cpp
index ac314417ec..efd2941b47 100644
--- a/core/color.cpp
+++ b/core/color.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/color.h b/core/color.h
index d6ad5f91c5..b2148e1357 100644
--- a/core/color.h
+++ b/core/color.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/command_queue_mt.cpp b/core/command_queue_mt.cpp
index 1b3a74bd0d..36d4b0a32f 100644
--- a/core/command_queue_mt.cpp
+++ b/core/command_queue_mt.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/command_queue_mt.h b/core/command_queue_mt.h
index 5911cf5006..3fd660a3db 100644
--- a/core/command_queue_mt.h
+++ b/core/command_queue_mt.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/compressed_translation.cpp b/core/compressed_translation.cpp
index 7dd5308fab..f102721470 100644
--- a/core/compressed_translation.cpp
+++ b/core/compressed_translation.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -83,7 +83,7 @@ void PHashTranslation::generate(const Ref<Translation> &p_from) {
if (ps.orig_len != 0) {
CharString dst_s;
dst_s.resize(src_s.size());
- int ret = smaz_compress(src_s.get_data(), src_s.size(), &dst_s[0], src_s.size());
+ int ret = smaz_compress(src_s.get_data(), src_s.size(), dst_s.ptrw(), src_s.size());
if (ret >= src_s.size()) {
//if compressed is larger than original, just use original
ps.orig_len = src_s.size();
diff --git a/core/compressed_translation.h b/core/compressed_translation.h
index b3d193b478..0b49907a68 100644
--- a/core/compressed_translation.h
+++ b/core/compressed_translation.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/core_string_names.cpp b/core/core_string_names.cpp
index ba596f7f16..1b59508abf 100644
--- a/core/core_string_names.cpp
+++ b/core/core_string_names.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -47,28 +47,27 @@ CoreStringNames::CoreStringNames() :
#ifdef TOOLS_ENABLED
_sections_unfolded(StaticCString::create("_sections_unfolded")),
#endif
- _custom_features(StaticCString::create("_custom_features")) {
-
- x = StaticCString::create("x");
- y = StaticCString::create("y");
- z = StaticCString::create("z");
- w = StaticCString::create("w");
- r = StaticCString::create("r");
- g = StaticCString::create("g");
- b = StaticCString::create("b");
- a = StaticCString::create("a");
- position = StaticCString::create("position");
- size = StaticCString::create("size");
- end = StaticCString::create("end");
- basis = StaticCString::create("basis");
- origin = StaticCString::create("origin");
- normal = StaticCString::create("normal");
- d = StaticCString::create("d");
- h = StaticCString::create("h");
- s = StaticCString::create("s");
- v = StaticCString::create("v");
- r8 = StaticCString::create("r8");
- g8 = StaticCString::create("g8");
- b8 = StaticCString::create("b8");
- a8 = StaticCString::create("a8");
+ _custom_features(StaticCString::create("_custom_features")),
+ x(StaticCString::create("x")),
+ y(StaticCString::create("y")),
+ z(StaticCString::create("z")),
+ w(StaticCString::create("w")),
+ r(StaticCString::create("r")),
+ g(StaticCString::create("g")),
+ b(StaticCString::create("b")),
+ a(StaticCString::create("a")),
+ position(StaticCString::create("position")),
+ size(StaticCString::create("size")),
+ end(StaticCString::create("end")),
+ basis(StaticCString::create("basis")),
+ origin(StaticCString::create("origin")),
+ normal(StaticCString::create("normal")),
+ d(StaticCString::create("d")),
+ h(StaticCString::create("h")),
+ s(StaticCString::create("s")),
+ v(StaticCString::create("v")),
+ r8(StaticCString::create("r8")),
+ g8(StaticCString::create("g8")),
+ b8(StaticCString::create("b8")),
+ a8(StaticCString::create("a8")) {
}
diff --git a/core/core_string_names.h b/core/core_string_names.h
index 3fdb240408..1a837cdc2e 100644
--- a/core/core_string_names.h
+++ b/core/core_string_names.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/cowdata.h b/core/cowdata.h
index 54ece4c856..3e40ad0f4b 100644
--- a/core/cowdata.h
+++ b/core/cowdata.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -31,6 +31,8 @@
#ifndef COWDATA_H_
#define COWDATA_H_
+#include <string.h>
+
#include "core/os/memory.h"
#include "core/safe_refcount.h"
@@ -177,6 +179,8 @@ public:
return OK;
};
+ int find(const T &p_val, int p_from = 0) const;
+
_FORCE_INLINE_ CowData();
_FORCE_INLINE_ ~CowData();
_FORCE_INLINE_ CowData(CowData<T> &p_from) { _ref(p_from); };
@@ -194,12 +198,14 @@ void CowData<T>::_unref(void *p_data) {
return; // still in use
// clean up
- uint32_t *count = _get_size();
- T *data = (T *)(count + 1);
+ if (!__has_trivial_destructor(T)) {
+ uint32_t *count = _get_size();
+ T *data = (T *)(count + 1);
- for (uint32_t i = 0; i < *count; ++i) {
- // call destructors
- data[i].~T();
+ for (uint32_t i = 0; i < *count; ++i) {
+ // call destructors
+ data[i].~T();
+ }
}
// free mem
@@ -226,9 +232,13 @@ void CowData<T>::_copy_on_write() {
T *_data = (T *)(mem_new);
// initialize new elements
- for (uint32_t i = 0; i < current_size; i++) {
+ if (__has_trivial_copy(T)) {
+ memcpy(mem_new, _ptr, current_size * sizeof(T));
- memnew_placement(&_data[i], T(_get_data()[i]));
+ } else {
+ for (uint32_t i = 0; i < current_size; i++) {
+ memnew_placement(&_data[i], T(_get_data()[i]));
+ }
}
_unref(_ptr);
@@ -275,22 +285,25 @@ Error CowData<T>::resize(int p_size) {
}
// construct the newly created elements
- T *elems = _get_data();
- for (int i = *_get_size(); i < p_size; i++) {
+ if (!__has_trivial_constructor(T)) {
+ T *elems = _get_data();
- memnew_placement(&elems[i], T);
+ for (int i = *_get_size(); i < p_size; i++) {
+ memnew_placement(&elems[i], T);
+ }
}
*_get_size() = p_size;
} else if (p_size < size()) {
- // deinitialize no longer needed elements
- for (uint32_t i = p_size; i < *_get_size(); i++) {
-
- T *t = &_get_data()[i];
- t->~T();
+ if (!__has_trivial_destructor(T)) {
+ // deinitialize no longer needed elements
+ for (uint32_t i = p_size; i < *_get_size(); i++) {
+ T *t = &_get_data()[i];
+ t->~T();
+ }
}
void *_ptrnew = (T *)Memory::realloc_static(_ptr, alloc_size, true);
@@ -305,6 +318,24 @@ Error CowData<T>::resize(int p_size) {
}
template <class T>
+int CowData<T>::find(const T &p_val, int p_from) const {
+ int ret = -1;
+
+ if (p_from < 0 || size() == 0) {
+ return ret;
+ }
+
+ for (int i = p_from; i < size(); i++) {
+ if (get(i) == p_val) {
+ ret = i;
+ break;
+ }
+ }
+
+ return ret;
+}
+
+template <class T>
void CowData<T>::_ref(const CowData *p_from) {
_ref(*p_from);
}
diff --git a/core/dictionary.cpp b/core/dictionary.cpp
index ccbdff3816..bea0997cc9 100644
--- a/core/dictionary.cpp
+++ b/core/dictionary.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -112,6 +112,15 @@ Variant Dictionary::get_valid(const Variant &p_key) const {
return E.get();
}
+Variant Dictionary::get(const Variant &p_key, const Variant &p_default) const {
+ const Variant *result = getptr(p_key);
+ if (!result) {
+ return p_default;
+ }
+
+ return *result;
+}
+
int Dictionary::size() const {
return _p->variant_map.size();
diff --git a/core/dictionary.h b/core/dictionary.h
index d3b98c2f63..eab7354cef 100644
--- a/core/dictionary.h
+++ b/core/dictionary.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -58,6 +58,7 @@ public:
Variant *getptr(const Variant &p_key);
Variant get_valid(const Variant &p_key) const;
+ Variant get(const Variant &p_key, const Variant &p_default) const;
int size() const;
bool empty() const;
diff --git a/core/dvector.cpp b/core/dvector.cpp
index b679df55ad..592c3c053d 100644
--- a/core/dvector.cpp
+++ b/core/dvector.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/dvector.h b/core/dvector.h
index 2830c57ec0..fc962b4940 100644
--- a/core/dvector.h
+++ b/core/dvector.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -56,12 +56,12 @@ struct MemoryPool {
Alloc *free_list;
- Alloc() {
- mem = NULL;
- lock = 0;
- pool_id = POOL_ALLOCATOR_INVALID_ID;
- size = 0;
- free_list = NULL;
+ Alloc() :
+ lock(0),
+ mem(NULL),
+ pool_id(POOL_ALLOCATOR_INVALID_ID),
+ size(0),
+ free_list(NULL) {
}
};
diff --git a/core/engine.cpp b/core/engine.cpp
index fceb602dcf..4dba41853d 100644
--- a/core/engine.cpp
+++ b/core/engine.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/engine.h b/core/engine.h
index 82b1e5d681..15665fee29 100644
--- a/core/engine.h
+++ b/core/engine.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/error_list.h b/core/error_list.h
index 6b9cd0016b..304861da4e 100644
--- a/core/error_list.h
+++ b/core/error_list.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/error_macros.cpp b/core/error_macros.cpp
index c1a0dd0dfc..0e8e4a9bb4 100644
--- a/core/error_macros.cpp
+++ b/core/error_macros.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/error_macros.h b/core/error_macros.h
index 8cec18d24f..60a0e8a7dc 100644
--- a/core/error_macros.h
+++ b/core/error_macros.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/func_ref.cpp b/core/func_ref.cpp
index c707f1c4cb..4a965473d9 100644
--- a/core/func_ref.cpp
+++ b/core/func_ref.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -69,7 +69,6 @@ void FuncRef::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_function", "name"), &FuncRef::set_function);
}
-FuncRef::FuncRef() {
-
- id = 0;
+FuncRef::FuncRef() :
+ id(0) {
}
diff --git a/core/func_ref.h b/core/func_ref.h
index 930c376abf..339279fdba 100644
--- a/core/func_ref.h
+++ b/core/func_ref.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/global_constants.cpp b/core/global_constants.cpp
index 7e9b8b393c..fb90403226 100644
--- a/core/global_constants.cpp
+++ b/core/global_constants.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/global_constants.h b/core/global_constants.h
index 48f16934a3..47c1a4dafc 100644
--- a/core/global_constants.h
+++ b/core/global_constants.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/hash_map.h b/core/hash_map.h
index 3869cd3c36..44459a3080 100644
--- a/core/hash_map.h
+++ b/core/hash_map.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/hashfuncs.h b/core/hashfuncs.h
index 457cfadc9c..811ce6264e 100644
--- a/core/hashfuncs.h
+++ b/core/hashfuncs.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/image.cpp b/core/image.cpp
index 698a0b0b98..4fc3b4becb 100644
--- a/core/image.cpp
+++ b/core/image.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -1931,7 +1931,8 @@ void Image::blit_rect(const Ref<Image> &p_src, const Rect2 &p_src_rect, const Po
if (clipped_src_rect.size.x <= 0 || clipped_src_rect.size.y <= 0)
return;
- Rect2i dest_rect = Rect2i(0, 0, width, height).clip(Rect2i(p_dest, clipped_src_rect.size));
+ Point2 src_underscan = Point2(MIN(0, p_src_rect.position.x), MIN(0, p_src_rect.position.y));
+ Rect2i dest_rect = Rect2i(0, 0, width, height).clip(Rect2i(p_dest - src_underscan, clipped_src_rect.size));
PoolVector<uint8_t>::Write wp = data.write();
uint8_t *dst_data_ptr = wp.ptr();
@@ -1985,7 +1986,8 @@ void Image::blit_rect_mask(const Ref<Image> &p_src, const Ref<Image> &p_mask, co
if (clipped_src_rect.size.x <= 0 || clipped_src_rect.size.y <= 0)
return;
- Rect2i dest_rect = Rect2i(0, 0, width, height).clip(Rect2i(p_dest, clipped_src_rect.size));
+ Point2 src_underscan = Point2(MIN(0, p_src_rect.position.x), MIN(0, p_src_rect.position.y));
+ Rect2i dest_rect = Rect2i(0, 0, width, height).clip(Rect2i(p_dest - src_underscan, clipped_src_rect.size));
PoolVector<uint8_t>::Write wp = data.write();
uint8_t *dst_data_ptr = wp.ptr();
@@ -2042,7 +2044,8 @@ void Image::blend_rect(const Ref<Image> &p_src, const Rect2 &p_src_rect, const P
if (clipped_src_rect.size.x <= 0 || clipped_src_rect.size.y <= 0)
return;
- Rect2i dest_rect = Rect2i(0, 0, width, height).clip(Rect2i(p_dest, clipped_src_rect.size));
+ Point2 src_underscan = Point2(MIN(0, p_src_rect.position.x), MIN(0, p_src_rect.position.y));
+ Rect2i dest_rect = Rect2i(0, 0, width, height).clip(Rect2i(p_dest - src_underscan, clipped_src_rect.size));
lock();
Ref<Image> img = p_src;
@@ -2096,7 +2099,8 @@ void Image::blend_rect_mask(const Ref<Image> &p_src, const Ref<Image> &p_mask, c
if (clipped_src_rect.size.x <= 0 || clipped_src_rect.size.y <= 0)
return;
- Rect2i dest_rect = Rect2i(0, 0, width, height).clip(Rect2i(p_dest, clipped_src_rect.size));
+ Point2 src_underscan = Point2(MIN(0, p_src_rect.position.x), MIN(0, p_src_rect.position.y));
+ Rect2i dest_rect = Rect2i(0, 0, width, height).clip(Rect2i(p_dest - src_underscan, clipped_src_rect.size));
lock();
Ref<Image> img = p_src;
diff --git a/core/image.h b/core/image.h
index 0770eb953e..3604580e98 100644
--- a/core/image.h
+++ b/core/image.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/input_map.cpp b/core/input_map.cpp
index b88d99470a..15f68f9c2a 100644
--- a/core/input_map.cpp
+++ b/core/input_map.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/input_map.h b/core/input_map.h
index 8f286277d1..895fd26928 100644
--- a/core/input_map.h
+++ b/core/input_map.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/int_types.h b/core/int_types.h
index e2b70d58fc..891b6172fa 100644
--- a/core/int_types.h
+++ b/core/int_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/compression.cpp b/core/io/compression.cpp
index 3c0b6541bd..a113f3b61b 100644
--- a/core/io/compression.cpp
+++ b/core/io/compression.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -81,10 +81,10 @@ int Compression::compress(uint8_t *p_dst, const uint8_t *p_src, int p_src_size,
} break;
case MODE_ZSTD: {
ZSTD_CCtx *cctx = ZSTD_createCCtx();
- ZSTD_CCtx_setParameter(cctx, ZSTD_p_compressionLevel, zstd_level);
+ ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, zstd_level);
if (zstd_long_distance_matching) {
- ZSTD_CCtx_setParameter(cctx, ZSTD_p_enableLongDistanceMatching, 1);
- ZSTD_CCtx_setParameter(cctx, ZSTD_p_windowLog, zstd_window_log_size);
+ ZSTD_CCtx_setParameter(cctx, ZSTD_c_enableLongDistanceMatching, 1);
+ ZSTD_CCtx_setParameter(cctx, ZSTD_c_windowLog, zstd_window_log_size);
}
int max_dst_size = get_max_compressed_buffer_size(p_src_size, MODE_ZSTD);
int ret = ZSTD_compressCCtx(cctx, p_dst, max_dst_size, p_src, p_src_size, zstd_level);
diff --git a/core/io/compression.h b/core/io/compression.h
index 2f770e6aee..883dbf3a99 100644
--- a/core/io/compression.h
+++ b/core/io/compression.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/config_file.cpp b/core/io/config_file.cpp
index e2bc0f5d8f..414742deeb 100644
--- a/core/io/config_file.cpp
+++ b/core/io/config_file.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/config_file.h b/core/io/config_file.h
index 2bc439d413..36e5c0ca7d 100644
--- a/core/io/config_file.h
+++ b/core/io/config_file.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/file_access_buffered.cpp b/core/io/file_access_buffered.cpp
index d44c8a9585..83ff532aa4 100644
--- a/core/io/file_access_buffered.cpp
+++ b/core/io/file_access_buffered.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/file_access_buffered.h b/core/io/file_access_buffered.h
index a36a9a4603..756045a674 100644
--- a/core/io/file_access_buffered.h
+++ b/core/io/file_access_buffered.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/file_access_buffered_fa.h b/core/io/file_access_buffered_fa.h
index 493fa1c243..5180f2344f 100644
--- a/core/io/file_access_buffered_fa.h
+++ b/core/io/file_access_buffered_fa.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/file_access_compressed.cpp b/core/io/file_access_compressed.cpp
index 645d97ae7e..b268d5c710 100644
--- a/core/io/file_access_compressed.cpp
+++ b/core/io/file_access_compressed.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -373,24 +373,23 @@ uint64_t FileAccessCompressed::_get_modified_time(const String &p_file) {
return 0;
}
-FileAccessCompressed::FileAccessCompressed() {
-
- f = NULL;
- magic = "GCMP";
- cmode = Compression::MODE_ZSTD;
- writing = false;
- write_ptr = 0;
- write_buffer_size = 0;
- write_max = 0;
- block_size = 0;
- read_eof = false;
- at_end = false;
- read_total = 0;
- read_ptr = NULL;
- read_block = 0;
- read_block_count = 0;
- read_block_size = 0;
- read_pos = 0;
+FileAccessCompressed::FileAccessCompressed() :
+ cmode(Compression::MODE_ZSTD),
+ writing(false),
+ write_ptr(0),
+ write_buffer_size(0),
+ write_max(0),
+ block_size(0),
+ read_eof(false),
+ at_end(false),
+ read_ptr(NULL),
+ read_block(0),
+ read_block_count(0),
+ read_block_size(0),
+ read_pos(0),
+ read_total(0),
+ magic("GCMP"),
+ f(NULL) {
}
FileAccessCompressed::~FileAccessCompressed() {
diff --git a/core/io/file_access_compressed.h b/core/io/file_access_compressed.h
index 5be42a6d32..f408b1bc29 100644
--- a/core/io/file_access_compressed.h
+++ b/core/io/file_access_compressed.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/file_access_encrypted.cpp b/core/io/file_access_encrypted.cpp
index 28bf55b962..6ad68dd74d 100644
--- a/core/io/file_access_encrypted.cpp
+++ b/core/io/file_access_encrypted.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/file_access_encrypted.h b/core/io/file_access_encrypted.h
index 873dbfa7e8..e77d62a9f4 100644
--- a/core/io/file_access_encrypted.h
+++ b/core/io/file_access_encrypted.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/file_access_memory.cpp b/core/io/file_access_memory.cpp
index 4c2aa4294d..fbcf5b8021 100644
--- a/core/io/file_access_memory.cpp
+++ b/core/io/file_access_memory.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/file_access_memory.h b/core/io/file_access_memory.h
index e474fb0d05..73952133c1 100644
--- a/core/io/file_access_memory.h
+++ b/core/io/file_access_memory.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/file_access_network.cpp b/core/io/file_access_network.cpp
index b9544ac166..501a21a50d 100644
--- a/core/io/file_access_network.cpp
+++ b/core/io/file_access_network.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/file_access_network.h b/core/io/file_access_network.h
index c929e8446d..5bbf7588c7 100644
--- a/core/io/file_access_network.h
+++ b/core/io/file_access_network.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/file_access_pack.cpp b/core/io/file_access_pack.cpp
index 3823285792..43fedc5238 100644
--- a/core/io/file_access_pack.cpp
+++ b/core/io/file_access_pack.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/file_access_pack.h b/core/io/file_access_pack.h
index 9e31bcf88a..04610bed57 100644
--- a/core/io/file_access_pack.h
+++ b/core/io/file_access_pack.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/file_access_zip.cpp b/core/io/file_access_zip.cpp
index 7b6385c3ff..66b911e83c 100644
--- a/core/io/file_access_zip.cpp
+++ b/core/io/file_access_zip.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -43,31 +43,31 @@ static void *godot_open(void *data, const char *p_fname, int mode) {
if (mode & ZLIB_FILEFUNC_MODE_WRITE) {
return NULL;
- };
+ }
FileAccess *f = (FileAccess *)data;
f->open(p_fname, FileAccess::READ);
return f->is_open() ? data : NULL;
-};
+}
static uLong godot_read(void *data, void *fdata, void *buf, uLong size) {
FileAccess *f = (FileAccess *)data;
f->get_buffer((uint8_t *)buf, size);
return size;
-};
+}
static uLong godot_write(voidpf opaque, voidpf stream, const void *buf, uLong size) {
return 0;
-};
+}
static long godot_tell(voidpf opaque, voidpf stream) {
FileAccess *f = (FileAccess *)opaque;
return f->get_position();
-};
+}
static long godot_seek(voidpf opaque, voidpf stream, uLong offset, int origin) {
@@ -84,36 +84,36 @@ static long godot_seek(voidpf opaque, voidpf stream, uLong offset, int origin) {
break;
default:
break;
- };
+ }
f->seek(pos);
return 0;
-};
+}
static int godot_close(voidpf opaque, voidpf stream) {
FileAccess *f = (FileAccess *)opaque;
f->close();
return 0;
-};
+}
static int godot_testerror(voidpf opaque, voidpf stream) {
FileAccess *f = (FileAccess *)opaque;
return f->get_error() != OK ? 1 : 0;
-};
+}
static voidpf godot_alloc(voidpf opaque, uInt items, uInt size) {
return memalloc(items * size);
-};
+}
static void godot_free(voidpf opaque, voidpf address) {
memfree(address);
-};
+}
-}; // extern "C"
+} // extern "C"
void ZipArchive::close_handle(unzFile p_file) const {
@@ -122,7 +122,7 @@ void ZipArchive::close_handle(unzFile p_file) const {
unzCloseCurrentFile(p_file);
unzClose(p_file);
memdelete(f);
-};
+}
unzFile ZipArchive::get_file_handle(String p_file) const {
@@ -155,10 +155,10 @@ unzFile ZipArchive::get_file_handle(String p_file) const {
unzClose(pkg);
ERR_FAIL_V(NULL);
- };
+ }
return pkg;
-};
+}
bool ZipArchive::try_open_pack(const String &p_path) {
@@ -215,36 +215,36 @@ bool ZipArchive::try_open_pack(const String &p_path) {
if ((i + 1) < gi.number_entry) {
unzGoToNextFile(zfile);
- };
- };
+ }
+ }
return true;
-};
+}
bool ZipArchive::file_exists(String p_name) const {
return files.has(p_name);
-};
+}
FileAccess *ZipArchive::get_file(const String &p_path, PackedData::PackedFile *p_file) {
return memnew(FileAccessZip(p_path, *p_file));
-};
+}
ZipArchive *ZipArchive::get_singleton() {
if (instance == NULL) {
instance = memnew(ZipArchive);
- };
+ }
return instance;
-};
+}
ZipArchive::ZipArchive() {
instance = this;
//fa_create_func = FileAccess::get_create_func();
-};
+}
ZipArchive::~ZipArchive() {
@@ -253,10 +253,10 @@ ZipArchive::~ZipArchive() {
FileAccess *f = (FileAccess *)unzGetOpaque(packages[i].zfile);
unzClose(packages[i].zfile);
memdelete(f);
- };
+ }
packages.clear();
-};
+}
Error FileAccessZip::_open(const String &p_path, int p_mode_flags) {
@@ -272,7 +272,7 @@ Error FileAccessZip::_open(const String &p_path, int p_mode_flags) {
ERR_FAIL_COND_V(err != UNZ_OK, FAILED);
return OK;
-};
+}
void FileAccessZip::close() {
@@ -283,50 +283,50 @@ void FileAccessZip::close() {
ERR_FAIL_COND(!arch);
arch->close_handle(zfile);
zfile = NULL;
-};
+}
bool FileAccessZip::is_open() const {
return zfile != NULL;
-};
+}
void FileAccessZip::seek(size_t p_position) {
ERR_FAIL_COND(!zfile);
unzSeekCurrentFile(zfile, p_position);
-};
+}
void FileAccessZip::seek_end(int64_t p_position) {
ERR_FAIL_COND(!zfile);
unzSeekCurrentFile(zfile, get_len() + p_position);
-};
+}
size_t FileAccessZip::get_position() const {
ERR_FAIL_COND_V(!zfile, 0);
return unztell(zfile);
-};
+}
size_t FileAccessZip::get_len() const {
ERR_FAIL_COND_V(!zfile, 0);
return file_info.uncompressed_size;
-};
+}
bool FileAccessZip::eof_reached() const {
ERR_FAIL_COND_V(!zfile, true);
return at_eof;
-};
+}
uint8_t FileAccessZip::get_8() const {
uint8_t ret = 0;
get_buffer(&ret, 1);
return ret;
-};
+}
int FileAccessZip::get_buffer(uint8_t *p_dst, int p_length) const {
@@ -339,20 +339,20 @@ int FileAccessZip::get_buffer(uint8_t *p_dst, int p_length) const {
if (read < p_length)
at_eof = true;
return read;
-};
+}
Error FileAccessZip::get_error() const {
if (!zfile) {
return ERR_UNCONFIGURED;
- };
+ }
if (eof_reached()) {
return ERR_FILE_EOF;
- };
+ }
return OK;
-};
+}
void FileAccessZip::flush() {
@@ -362,22 +362,21 @@ void FileAccessZip::flush() {
void FileAccessZip::store_8(uint8_t p_dest) {
ERR_FAIL();
-};
+}
bool FileAccessZip::file_exists(const String &p_name) {
return false;
-};
-
-FileAccessZip::FileAccessZip(const String &p_path, const PackedData::PackedFile &p_file) {
+}
- zfile = NULL;
+FileAccessZip::FileAccessZip(const String &p_path, const PackedData::PackedFile &p_file) :
+ zfile(NULL) {
_open(p_path, FileAccess::READ);
-};
+}
FileAccessZip::~FileAccessZip() {
close();
-};
+}
#endif
diff --git a/core/io/file_access_zip.h b/core/io/file_access_zip.h
index 9bb1ad221a..fc8f85c07b 100644
--- a/core/io/file_access_zip.h
+++ b/core/io/file_access_zip.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/http_client.cpp b/core/io/http_client.cpp
index 36dd688e77..b3fd814870 100644
--- a/core/io/http_client.cpp
+++ b/core/io/http_client.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/http_client.h b/core/io/http_client.h
index 9e674e4c1d..1ad44d5f01 100644
--- a/core/io/http_client.h
+++ b/core/io/http_client.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/image_loader.cpp b/core/io/image_loader.cpp
index 3ae9ff676c..a5a0738140 100644
--- a/core/io/image_loader.cpp
+++ b/core/io/image_loader.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -60,7 +60,7 @@ Error ImageLoader::load_image(String p_file, Ref<Image> p_image, FileAccess *p_c
String extension = p_file.get_extension();
- for (int i = 0; i < loader_count; i++) {
+ for (int i = 0; i < loader.size(); i++) {
if (!loader[i]->recognize(extension))
continue;
@@ -83,30 +83,45 @@ Error ImageLoader::load_image(String p_file, Ref<Image> p_image, FileAccess *p_c
void ImageLoader::get_recognized_extensions(List<String> *p_extensions) {
- for (int i = 0; i < loader_count; i++) {
+ for (int i = 0; i < loader.size(); i++) {
loader[i]->get_recognized_extensions(p_extensions);
}
}
-bool ImageLoader::recognize(const String &p_extension) {
+ImageFormatLoader *ImageLoader::recognize(const String &p_extension) {
- for (int i = 0; i < loader_count; i++) {
+ for (int i = 0; i < loader.size(); i++) {
if (loader[i]->recognize(p_extension))
- return true;
+ return loader[i];
}
- return false;
+ return NULL;
}
-ImageFormatLoader *ImageLoader::loader[MAX_LOADERS];
-int ImageLoader::loader_count = 0;
+Vector<ImageFormatLoader *> ImageLoader::loader;
void ImageLoader::add_image_format_loader(ImageFormatLoader *p_loader) {
- ERR_FAIL_COND(loader_count >= MAX_LOADERS);
- loader[loader_count++] = p_loader;
+ loader.push_back(p_loader);
+}
+
+void ImageLoader::remove_image_format_loader(ImageFormatLoader *p_loader) {
+
+ loader.erase(p_loader);
+}
+
+const Vector<ImageFormatLoader *> &ImageLoader::get_image_format_loaders() {
+
+ return loader;
+}
+
+void ImageLoader::cleanup() {
+
+ while (loader.size()) {
+ remove_image_format_loader(loader[0]);
+ }
}
/////////////////
@@ -137,7 +152,7 @@ RES ResourceFormatLoaderImage::load(const String &p_path, const String &p_origin
int idx = -1;
- for (int i = 0; i < ImageLoader::loader_count; i++) {
+ for (int i = 0; i < ImageLoader::loader.size(); i++) {
if (ImageLoader::loader[i]->recognize(extension)) {
idx = i;
break;
diff --git a/core/io/image_loader.h b/core/io/image_loader.h
index d95a483c0d..95c562b7a9 100644
--- a/core/io/image_loader.h
+++ b/core/io/image_loader.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -70,23 +70,25 @@ public:
class ImageLoader {
- enum {
- MAX_LOADERS = 32
- };
+ static Vector<ImageFormatLoader *> loader;
friend class ResourceFormatLoaderImage;
- static ImageFormatLoader *loader[MAX_LOADERS];
- static int loader_count;
protected:
public:
static Error load_image(String p_file, Ref<Image> p_image, FileAccess *p_custom = NULL, bool p_force_linear = false, float p_scale = 1.0);
static void get_recognized_extensions(List<String> *p_extensions);
- static bool recognize(const String &p_extension);
+ static ImageFormatLoader *recognize(const String &p_extension);
static void add_image_format_loader(ImageFormatLoader *p_loader);
+ static void remove_image_format_loader(ImageFormatLoader *p_loader);
+
+ static const Vector<ImageFormatLoader *> &get_image_format_loaders();
+
+ static void cleanup();
};
class ResourceFormatLoaderImage : public ResourceFormatLoader {
+ GDCLASS(ResourceFormatLoaderImage, ResourceFormatLoader)
public:
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
virtual void get_recognized_extensions(List<String> *p_extensions) const;
diff --git a/core/io/ip.cpp b/core/io/ip.cpp
index f56e850796..420e48f839 100644
--- a/core/io/ip.cpp
+++ b/core/io/ip.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/ip.h b/core/io/ip.h
index 967f04a4bd..ead71ebb54 100644
--- a/core/io/ip.h
+++ b/core/io/ip.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/ip_address.cpp b/core/io/ip_address.cpp
index 194d1af6bf..763a5fbb9a 100644
--- a/core/io/ip_address.cpp
+++ b/core/io/ip_address.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/ip_address.h b/core/io/ip_address.h
index 607ce81ef4..3a5f87b617 100644
--- a/core/io/ip_address.h
+++ b/core/io/ip_address.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/json.cpp b/core/io/json.cpp
index 26e18828e5..c211ca2ed4 100644
--- a/core/io/json.cpp
+++ b/core/io/json.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/json.h b/core/io/json.h
index af6c463331..7c6877c2cc 100644
--- a/core/io/json.h
+++ b/core/io/json.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/logger.cpp b/core/io/logger.cpp
index 01755c8ee9..eeb82bfce4 100644
--- a/core/io/logger.cpp
+++ b/core/io/logger.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -179,11 +179,10 @@ void RotatedFileLogger::rotate_file() {
file = FileAccess::open(base_path, FileAccess::WRITE);
}
-RotatedFileLogger::RotatedFileLogger(const String &p_base_path, int p_max_files) {
- file = NULL;
- base_path = p_base_path.simplify_path();
- max_files = p_max_files > 0 ? p_max_files : 1;
-
+RotatedFileLogger::RotatedFileLogger(const String &p_base_path, int p_max_files) :
+ base_path(p_base_path.simplify_path()),
+ max_files(p_max_files > 0 ? p_max_files : 1),
+ file(NULL) {
rotate_file();
}
@@ -240,8 +239,8 @@ void StdLogger::logv(const char *p_format, va_list p_list, bool p_err) {
StdLogger::~StdLogger() {}
-CompositeLogger::CompositeLogger(Vector<Logger *> p_loggers) {
- loggers = p_loggers;
+CompositeLogger::CompositeLogger(Vector<Logger *> p_loggers) :
+ loggers(p_loggers) {
}
void CompositeLogger::logv(const char *p_format, va_list p_list, bool p_err) {
diff --git a/core/io/logger.h b/core/io/logger.h
index d32b43b030..0b871a13de 100644
--- a/core/io/logger.h
+++ b/core/io/logger.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/marshalls.cpp b/core/io/marshalls.cpp
index 6338cee39d..eec1c55744 100644
--- a/core/io/marshalls.cpp
+++ b/core/io/marshalls.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -55,9 +55,8 @@ ObjectID EncodedObjectAsID::get_object_id() const {
return id;
}
-EncodedObjectAsID::EncodedObjectAsID() {
-
- id = 0;
+EncodedObjectAsID::EncodedObjectAsID() :
+ id(0) {
}
#define ENCODE_MASK 0xFF
diff --git a/core/io/marshalls.h b/core/io/marshalls.h
index 1284520945..11c4b2c98e 100644
--- a/core/io/marshalls.h
+++ b/core/io/marshalls.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/multiplayer_api.cpp b/core/io/multiplayer_api.cpp
index b3f0a76a80..7680d47620 100644
--- a/core/io/multiplayer_api.cpp
+++ b/core/io/multiplayer_api.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -122,6 +122,7 @@ void MultiplayerAPI::clear() {
connected_peers.clear();
path_get_cache.clear();
path_send_cache.clear();
+ packet_cache.clear();
last_send_cache_id = 1;
}
@@ -131,6 +132,8 @@ void MultiplayerAPI::set_root_node(Node *p_node) {
void MultiplayerAPI::set_network_peer(const Ref<NetworkedMultiplayerPeer> &p_peer) {
+ if (p_peer == network_peer) return; // Nothing to do
+
if (network_peer.is_valid()) {
network_peer->disconnect("peer_connected", this, "_add_peer");
network_peer->disconnect("peer_disconnected", this, "_del_peer");
@@ -857,6 +860,8 @@ void MultiplayerAPI::_bind_methods() {
}
MultiplayerAPI::MultiplayerAPI() {
+ rpc_sender_id = 0;
+ root_node = NULL;
clear();
}
diff --git a/core/io/multiplayer_api.h b/core/io/multiplayer_api.h
index c86e76e91a..a9cf77aaba 100644
--- a/core/io/multiplayer_api.h
+++ b/core/io/multiplayer_api.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/net_socket.cpp b/core/io/net_socket.cpp
index 10bcf62eda..08580356a7 100644
--- a/core/io/net_socket.cpp
+++ b/core/io/net_socket.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/net_socket.h b/core/io/net_socket.h
index 0665bec9fd..94e7ef6f75 100644
--- a/core/io/net_socket.h
+++ b/core/io/net_socket.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/networked_multiplayer_peer.cpp b/core/io/networked_multiplayer_peer.cpp
index 6354eef8b5..b5469e6e88 100644
--- a/core/io/networked_multiplayer_peer.cpp
+++ b/core/io/networked_multiplayer_peer.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/networked_multiplayer_peer.h b/core/io/networked_multiplayer_peer.h
index 8e83c528a0..91752fdc7e 100644
--- a/core/io/networked_multiplayer_peer.h
+++ b/core/io/networked_multiplayer_peer.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/packet_peer.cpp b/core/io/packet_peer.cpp
index b6dd4eaf6f..3aa1fcfd8f 100644
--- a/core/io/packet_peer.cpp
+++ b/core/io/packet_peer.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -35,10 +35,9 @@
/* helpers / binders */
-PacketPeer::PacketPeer() {
-
- allow_object_decoding = false;
- last_get_error = OK;
+PacketPeer::PacketPeer() :
+ last_get_error(OK),
+ allow_object_decoding(false) {
}
void PacketPeer::set_allow_object_decoding(bool p_enable) {
diff --git a/core/io/packet_peer.h b/core/io/packet_peer.h
index a6559df460..48c50eb76b 100644
--- a/core/io/packet_peer.h
+++ b/core/io/packet_peer.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/packet_peer_udp.cpp b/core/io/packet_peer_udp.cpp
index d33ba6f855..5912b8df94 100644
--- a/core/io/packet_peer_udp.cpp
+++ b/core/io/packet_peer_udp.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -239,13 +239,12 @@ void PacketPeerUDP::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_dest_address", "host", "port"), &PacketPeerUDP::_set_dest_address);
}
-PacketPeerUDP::PacketPeerUDP() {
-
- _sock = Ref<NetSocket>(NetSocket::create());
- blocking = true;
- packet_port = 0;
- queue_count = 0;
- peer_port = 0;
+PacketPeerUDP::PacketPeerUDP() :
+ packet_port(0),
+ queue_count(0),
+ peer_port(0),
+ blocking(true),
+ _sock(Ref<NetSocket>(NetSocket::create())) {
rb.resize(16);
}
diff --git a/core/io/packet_peer_udp.h b/core/io/packet_peer_udp.h
index 4366b0eb82..0593137604 100644
--- a/core/io/packet_peer_udp.h
+++ b/core/io/packet_peer_udp.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/pck_packer.cpp b/core/io/pck_packer.cpp
index 3df8c01760..36bd429bc0 100644
--- a/core/io/pck_packer.cpp
+++ b/core/io/pck_packer.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/pck_packer.h b/core/io/pck_packer.h
index 4fcf9a8822..4df495b11f 100644
--- a/core/io/pck_packer.h
+++ b/core/io/pck_packer.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/resource_format_binary.cpp b/core/io/resource_format_binary.cpp
index 6f3a8c3d2e..e27dea37d6 100644
--- a/core/io/resource_format_binary.cpp
+++ b/core/io/resource_format_binary.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -970,12 +970,11 @@ String ResourceInteractiveLoaderBinary::recognize(FileAccess *p_f) {
return type;
}
-ResourceInteractiveLoaderBinary::ResourceInteractiveLoaderBinary() {
-
- f = NULL;
- stage = 0;
- error = OK;
- translation_remapped = false;
+ResourceInteractiveLoaderBinary::ResourceInteractiveLoaderBinary() :
+ translation_remapped(false),
+ f(NULL),
+ error(OK),
+ stage(0) {
}
ResourceInteractiveLoaderBinary::~ResourceInteractiveLoaderBinary() {
diff --git a/core/io/resource_format_binary.h b/core/io/resource_format_binary.h
index 513252055f..8f2c48e745 100644
--- a/core/io/resource_format_binary.h
+++ b/core/io/resource_format_binary.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -100,6 +100,7 @@ public:
};
class ResourceFormatLoaderBinary : public ResourceFormatLoader {
+ GDCLASS(ResourceFormatLoaderBinary, ResourceFormatLoader)
public:
virtual Ref<ResourceInteractiveLoader> load_interactive(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
virtual void get_recognized_extensions_for_type(const String &p_type, List<String> *p_extensions) const;
@@ -152,7 +153,7 @@ public:
};
class ResourceFormatSaverBinary : public ResourceFormatSaver {
-
+ GDCLASS(ResourceFormatSaverBinary, ResourceFormatSaver)
public:
static ResourceFormatSaverBinary *singleton;
virtual Error save(const String &p_path, const RES &p_resource, uint32_t p_flags = 0);
diff --git a/core/io/resource_import.cpp b/core/io/resource_import.cpp
index ffea43b6bf..63dc0b6a26 100644
--- a/core/io/resource_import.cpp
+++ b/core/io/resource_import.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/resource_import.h b/core/io/resource_import.h
index 53718bd789..96dd7983e6 100644
--- a/core/io/resource_import.h
+++ b/core/io/resource_import.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -37,6 +37,8 @@ class ResourceImporter;
class ResourceFormatImporter : public ResourceFormatLoader {
+ GDCLASS(ResourceFormatImporter, ResourceFormatLoader)
+
struct PathAndType {
String path;
String type;
diff --git a/core/io/resource_loader.cpp b/core/io/resource_loader.cpp
index 71b01aa94a..b8bc24c1de 100644
--- a/core/io/resource_loader.cpp
+++ b/core/io/resource_loader.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -39,7 +39,7 @@
#include "core/translation.h"
#include "core/variant_parser.h"
-ResourceFormatLoader *ResourceLoader::loader[MAX_LOADERS];
+Ref<ResourceFormatLoader> ResourceLoader::loader[ResourceLoader::MAX_LOADERS];
int ResourceLoader::loader_count = 0;
@@ -73,6 +73,25 @@ bool ResourceFormatLoader::recognize_path(const String &p_path, const String &p_
return false;
}
+bool ResourceFormatLoader::handles_type(const String &p_type) const {
+
+ if (get_script_instance() && get_script_instance()->has_method("handles_type")) {
+ // I guess custom loaders for custom resources should use "Resource"
+ return get_script_instance()->call("handles_type", p_type);
+ }
+
+ return false;
+}
+
+String ResourceFormatLoader::get_resource_type(const String &p_path) const {
+
+ if (get_script_instance() && get_script_instance()->has_method("get_resource_type")) {
+ return get_script_instance()->call("get_resource_type", p_path);
+ }
+
+ return "";
+}
+
void ResourceFormatLoader::get_recognized_extensions_for_type(const String &p_type, List<String> *p_extensions) const {
if (p_type == "" || handles_type(p_type))
@@ -129,9 +148,37 @@ bool ResourceFormatLoader::exists(const String &p_path) const {
return FileAccess::exists(p_path); //by default just check file
}
+void ResourceFormatLoader::get_recognized_extensions(List<String> *p_extensions) const {
+
+ if (get_script_instance() && get_script_instance()->has_method("get_recognized_extensions")) {
+ PoolStringArray exts = get_script_instance()->call("get_recognized_extensions");
+
+ {
+ PoolStringArray::Read r = exts.read();
+ for (int i = 0; i < exts.size(); ++i) {
+ p_extensions->push_back(r[i]);
+ }
+ }
+ }
+}
+
RES ResourceFormatLoader::load(const String &p_path, const String &p_original_path, Error *r_error) {
- String path = p_path;
+ if (get_script_instance() && get_script_instance()->has_method("load")) {
+ Variant res = get_script_instance()->call("load", p_path, p_original_path);
+
+ if (res.get_type() == Variant::INT) {
+
+ if (r_error)
+ *r_error = (Error)res.operator int64_t();
+
+ } else {
+
+ if (r_error)
+ *r_error = OK;
+ return res;
+ }
+ }
//or this must be implemented
Ref<ResourceInteractiveLoader> ril = load_interactive(p_path, p_original_path, r_error);
@@ -160,7 +207,47 @@ RES ResourceFormatLoader::load(const String &p_path, const String &p_original_pa
void ResourceFormatLoader::get_dependencies(const String &p_path, List<String> *p_dependencies, bool p_add_types) {
- //do nothing by default
+ if (get_script_instance() && get_script_instance()->has_method("get_dependencies")) {
+ PoolStringArray deps = get_script_instance()->call("get_dependencies", p_path, p_add_types);
+
+ {
+ PoolStringArray::Read r = deps.read();
+ for (int i = 0; i < deps.size(); ++i) {
+ p_dependencies->push_back(r[i]);
+ }
+ }
+ }
+}
+
+Error ResourceFormatLoader::rename_dependencies(const String &p_path, const Map<String, String> &p_map) {
+
+ if (get_script_instance() && get_script_instance()->has_method("rename_dependencies")) {
+
+ Dictionary deps_dict;
+ for (Map<String, String>::Element *E = p_map.front(); E; E = E->next()) {
+ deps_dict[E->key()] = E->value();
+ }
+
+ int64_t res = get_script_instance()->call("rename_dependencies", deps_dict);
+ return (Error)res;
+ }
+
+ return OK;
+}
+
+void ResourceFormatLoader::_bind_methods() {
+
+ {
+ MethodInfo info = MethodInfo(Variant::NIL, "load", PropertyInfo(Variant::STRING, "path"), PropertyInfo(Variant::STRING, "original_path"));
+ info.return_val.usage |= PROPERTY_USAGE_NIL_IS_VARIANT;
+ ClassDB::add_virtual_method(get_class_static(), info);
+ }
+
+ ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::POOL_STRING_ARRAY, "get_recognized_extensions"));
+ ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "handles_type", PropertyInfo(Variant::STRING, "typename")));
+ ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::STRING, "get_resource_type", PropertyInfo(Variant::STRING, "path")));
+ ClassDB::add_virtual_method(get_class_static(), MethodInfo("get_dependencies", PropertyInfo(Variant::STRING, "path"), PropertyInfo(Variant::STRING, "add_types")));
+ ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::INT, "rename_dependencies", PropertyInfo(Variant::STRING, "path"), PropertyInfo(Variant::STRING, "renames")));
}
///////////////////////////////////
@@ -348,9 +435,11 @@ Ref<ResourceInteractiveLoader> ResourceLoader::load_interactive(const String &p_
return Ref<ResourceInteractiveLoader>();
}
-void ResourceLoader::add_resource_format_loader(ResourceFormatLoader *p_format_loader, bool p_at_front) {
+void ResourceLoader::add_resource_format_loader(Ref<ResourceFormatLoader> p_format_loader, bool p_at_front) {
+ ERR_FAIL_COND(p_format_loader.is_null());
ERR_FAIL_COND(loader_count >= MAX_LOADERS);
+
if (p_at_front) {
for (int i = loader_count; i > 0; i--) {
loader[i] = loader[i - 1];
@@ -362,6 +451,27 @@ void ResourceLoader::add_resource_format_loader(ResourceFormatLoader *p_format_l
}
}
+void ResourceLoader::remove_resource_format_loader(Ref<ResourceFormatLoader> p_format_loader) {
+
+ ERR_FAIL_COND(p_format_loader.is_null());
+
+ // Find loader
+ int i = 0;
+ for (; i < loader_count; ++i) {
+ if (loader[i] == p_format_loader)
+ break;
+ }
+
+ ERR_FAIL_COND(i >= loader_count); // Not found
+
+ // Shift next loaders up
+ for (; i < loader_count - 1; ++i) {
+ loader[i] = loader[i + 1];
+ }
+ loader[loader_count - 1].unref();
+ --loader_count;
+}
+
int ResourceLoader::get_import_order(const String &p_path) {
String path = _path_remap(p_path);
@@ -645,6 +755,84 @@ void ResourceLoader::set_load_callback(ResourceLoadedCallback p_callback) {
ResourceLoadedCallback ResourceLoader::_loaded_callback = NULL;
+Ref<ResourceFormatLoader> ResourceLoader::_find_custom_resource_format_loader(String path) {
+ for (int i = 0; i < loader_count; ++i) {
+ if (loader[i]->get_script_instance() && loader[i]->get_script_instance()->get_script()->get_path() == path) {
+ return loader[i];
+ }
+ }
+ return Ref<ResourceFormatLoader>();
+}
+
+bool ResourceLoader::add_custom_resource_format_loader(String script_path) {
+
+ if (_find_custom_resource_format_loader(script_path).is_valid())
+ return false;
+
+ Ref<Resource> res = ResourceLoader::load(script_path);
+ ERR_FAIL_COND_V(res.is_null(), false);
+ ERR_FAIL_COND_V(!res->is_class("Script"), false);
+
+ Ref<Script> s = res;
+ StringName ibt = s->get_instance_base_type();
+ bool valid_type = ClassDB::is_parent_class(ibt, "ResourceFormatLoader");
+ ERR_EXPLAIN("Script does not inherit a CustomResourceLoader: " + script_path);
+ ERR_FAIL_COND_V(!valid_type, false);
+
+ Object *obj = ClassDB::instance(ibt);
+
+ ERR_EXPLAIN("Cannot instance script as custom resource loader, expected 'ResourceFormatLoader' inheritance, got: " + String(ibt));
+ ERR_FAIL_COND_V(obj == NULL, false);
+
+ ResourceFormatLoader *crl = NULL;
+ crl = Object::cast_to<ResourceFormatLoader>(obj);
+ crl->set_script(s.get_ref_ptr());
+ ResourceLoader::add_resource_format_loader(crl);
+
+ return true;
+}
+
+void ResourceLoader::remove_custom_resource_format_loader(String script_path) {
+
+ Ref<ResourceFormatLoader> loader = _find_custom_resource_format_loader(script_path);
+ if (loader.is_valid())
+ remove_resource_format_loader(loader);
+}
+
+void ResourceLoader::add_custom_loaders() {
+ // Custom loaders registration exploits global class names
+
+ String custom_loader_base_class = ResourceFormatLoader::get_class_static();
+
+ List<StringName> global_classes;
+ ScriptServer::get_global_class_list(&global_classes);
+
+ for (List<StringName>::Element *E = global_classes.front(); E; E = E->next()) {
+
+ StringName class_name = E->get();
+ StringName base_class = ScriptServer::get_global_class_base(class_name);
+
+ if (base_class == custom_loader_base_class) {
+ String path = ScriptServer::get_global_class_path(class_name);
+ add_custom_resource_format_loader(path);
+ }
+ }
+}
+
+void ResourceLoader::remove_custom_loaders() {
+
+ Vector<Ref<ResourceFormatLoader> > custom_loaders;
+ for (int i = 0; i < loader_count; ++i) {
+ if (loader[i]->get_script_instance()) {
+ custom_loaders.push_back(loader[i]);
+ }
+ }
+
+ for (int i = 0; i < custom_loaders.size(); ++i) {
+ remove_resource_format_loader(custom_loaders[i]);
+ }
+}
+
ResourceLoadErrorNotify ResourceLoader::err_notify = NULL;
void *ResourceLoader::err_notify_ud = NULL;
diff --git a/core/io/resource_loader.h b/core/io/resource_loader.h
index 7ade4a2dfc..6c0e9d5554 100644
--- a/core/io/resource_loader.h
+++ b/core/io/resource_loader.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -56,18 +56,24 @@ public:
ResourceInteractiveLoader() {}
};
-class ResourceFormatLoader {
+class ResourceFormatLoader : public Reference {
+
+ GDCLASS(ResourceFormatLoader, Reference)
+
+protected:
+ static void _bind_methods();
+
public:
virtual Ref<ResourceInteractiveLoader> load_interactive(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
virtual bool exists(const String &p_path) const;
- virtual void get_recognized_extensions(List<String> *p_extensions) const = 0;
+ virtual void get_recognized_extensions(List<String> *p_extensions) const;
virtual void get_recognized_extensions_for_type(const String &p_type, List<String> *p_extensions) const;
virtual bool recognize_path(const String &p_path, const String &p_for_type = String()) const;
- virtual bool handles_type(const String &p_type) const = 0;
- virtual String get_resource_type(const String &p_path) const = 0;
+ virtual bool handles_type(const String &p_type) const;
+ virtual String get_resource_type(const String &p_path) const;
virtual void get_dependencies(const String &p_path, List<String> *p_dependencies, bool p_add_types = false);
- virtual Error rename_dependencies(const String &p_path, const Map<String, String> &p_map) { return OK; }
+ virtual Error rename_dependencies(const String &p_path, const Map<String, String> &p_map);
virtual bool is_import_valid(const String &p_path) const { return true; }
virtual int get_import_order(const String &p_path) const { return 0; }
@@ -86,7 +92,7 @@ class ResourceLoader {
MAX_LOADERS = 64
};
- static ResourceFormatLoader *loader[MAX_LOADERS];
+ static Ref<ResourceFormatLoader> loader[MAX_LOADERS];
static int loader_count;
static bool timestamp_on_load;
@@ -109,13 +115,16 @@ class ResourceLoader {
static ResourceLoadedCallback _loaded_callback;
+ static Ref<ResourceFormatLoader> _find_custom_resource_format_loader(String path);
+
public:
static Ref<ResourceInteractiveLoader> load_interactive(const String &p_path, const String &p_type_hint = "", bool p_no_cache = false, Error *r_error = NULL);
static RES load(const String &p_path, const String &p_type_hint = "", bool p_no_cache = false, Error *r_error = NULL);
static bool exists(const String &p_path, const String &p_type_hint = "");
static void get_recognized_extensions_for_type(const String &p_type, List<String> *p_extensions);
- static void add_resource_format_loader(ResourceFormatLoader *p_format_loader, bool p_at_front = false);
+ static void add_resource_format_loader(Ref<ResourceFormatLoader> p_format_loader, bool p_at_front = false);
+ static void remove_resource_format_loader(Ref<ResourceFormatLoader> p_format_loader);
static String get_resource_type(const String &p_path);
static void get_dependencies(const String &p_path, List<String> *p_dependencies, bool p_add_types = false);
static Error rename_dependencies(const String &p_path, const Map<String, String> &p_map);
@@ -123,6 +132,7 @@ public:
static int get_import_order(const String &p_path);
static void set_timestamp_on_load(bool p_timestamp) { timestamp_on_load = p_timestamp; }
+ static bool get_timestamp_on_load() { return timestamp_on_load; }
static void notify_load_error(const String &p_err) {
if (err_notify) err_notify(err_notify_ud, p_err);
@@ -155,6 +165,11 @@ public:
static void set_load_callback(ResourceLoadedCallback p_callback);
static ResourceLoaderImport import;
+
+ static bool add_custom_resource_format_loader(String script_path);
+ static void remove_custom_resource_format_loader(String script_path);
+ static void add_custom_loaders();
+ static void remove_custom_loaders();
};
#endif
diff --git a/core/io/resource_saver.cpp b/core/io/resource_saver.cpp
index 097e81e308..279788796c 100644
--- a/core/io/resource_saver.cpp
+++ b/core/io/resource_saver.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -29,18 +29,62 @@
/*************************************************************************/
#include "resource_saver.h"
-
#include "core/io/resource_loader.h"
#include "core/os/file_access.h"
#include "core/project_settings.h"
#include "core/script_language.h"
-ResourceFormatSaver *ResourceSaver::saver[MAX_SAVERS];
+Ref<ResourceFormatSaver> ResourceSaver::saver[MAX_SAVERS];
int ResourceSaver::saver_count = 0;
bool ResourceSaver::timestamp_on_save = false;
ResourceSavedCallback ResourceSaver::save_callback = 0;
+Error ResourceFormatSaver::save(const String &p_path, const RES &p_resource, uint32_t p_flags) {
+
+ if (get_script_instance() && get_script_instance()->has_method("save")) {
+ return (Error)get_script_instance()->call("save", p_path, p_resource, p_flags).operator int64_t();
+ }
+
+ return ERR_METHOD_NOT_FOUND;
+}
+
+bool ResourceFormatSaver::recognize(const RES &p_resource) const {
+
+ if (get_script_instance() && get_script_instance()->has_method("recognize")) {
+ return get_script_instance()->call("recognize", p_resource);
+ }
+
+ return false;
+}
+
+void ResourceFormatSaver::get_recognized_extensions(const RES &p_resource, List<String> *p_extensions) const {
+
+ if (get_script_instance() && get_script_instance()->has_method("get_recognized_extensions")) {
+ PoolStringArray exts = get_script_instance()->call("get_recognized_extensions", p_resource);
+
+ {
+ PoolStringArray::Read r = exts.read();
+ for (int i = 0; i < exts.size(); ++i) {
+ p_extensions->push_back(r[i]);
+ }
+ }
+ }
+}
+
+void ResourceFormatSaver::_bind_methods() {
+
+ {
+ PropertyInfo arg0 = PropertyInfo(Variant::STRING, "path");
+ PropertyInfo arg1 = PropertyInfo(Variant::OBJECT, "resource", PROPERTY_HINT_RESOURCE_TYPE, "Resource");
+ PropertyInfo arg2 = PropertyInfo(Variant::INT, "flags");
+ ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::INT, "save", arg0, arg1, arg2));
+ }
+
+ ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::POOL_STRING_ARRAY, "get_recognized_extensions", PropertyInfo(Variant::OBJECT, "resource", PROPERTY_HINT_RESOURCE_TYPE, "Resource")));
+ ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "recognize", PropertyInfo(Variant::OBJECT, "resource", PROPERTY_HINT_RESOURCE_TYPE, "Resource")));
+}
+
Error ResourceSaver::save(const String &p_path, const RES &p_resource, uint32_t p_flags) {
String extension = p_path.get_extension();
@@ -113,8 +157,9 @@ void ResourceSaver::get_recognized_extensions(const RES &p_resource, List<String
}
}
-void ResourceSaver::add_resource_format_saver(ResourceFormatSaver *p_format_saver, bool p_at_front) {
+void ResourceSaver::add_resource_format_saver(Ref<ResourceFormatSaver> p_format_saver, bool p_at_front) {
+ ERR_FAIL_COND(p_format_saver.is_null());
ERR_FAIL_COND(saver_count >= MAX_SAVERS);
if (p_at_front) {
@@ -127,3 +172,102 @@ void ResourceSaver::add_resource_format_saver(ResourceFormatSaver *p_format_save
saver[saver_count++] = p_format_saver;
}
}
+
+void ResourceSaver::remove_resource_format_saver(Ref<ResourceFormatSaver> p_format_saver) {
+
+ ERR_FAIL_COND(p_format_saver.is_null());
+
+ // Find saver
+ int i = 0;
+ for (; i < saver_count; ++i) {
+ if (saver[i] == p_format_saver)
+ break;
+ }
+
+ ERR_FAIL_COND(i >= saver_count); // Not found
+
+ // Shift next savers up
+ for (; i < saver_count - 1; ++i) {
+ saver[i] = saver[i + 1];
+ }
+ saver[saver_count - 1].unref();
+ --saver_count;
+}
+
+Ref<ResourceFormatSaver> ResourceSaver::_find_custom_resource_format_saver(String path) {
+ for (int i = 0; i < saver_count; ++i) {
+ if (saver[i]->get_script_instance() && saver[i]->get_script_instance()->get_script()->get_path() == path) {
+ return saver[i];
+ }
+ }
+ return Ref<ResourceFormatSaver>();
+}
+
+bool ResourceSaver::add_custom_resource_format_saver(String script_path) {
+
+ if (_find_custom_resource_format_saver(script_path).is_valid())
+ return false;
+
+ Ref<Resource> res = ResourceLoader::load(script_path);
+ ERR_FAIL_COND_V(res.is_null(), false);
+ ERR_FAIL_COND_V(!res->is_class("Script"), false);
+
+ Ref<Script> s = res;
+ StringName ibt = s->get_instance_base_type();
+ bool valid_type = ClassDB::is_parent_class(ibt, "ResourceFormatSaver");
+ ERR_EXPLAIN("Script does not inherit a CustomResourceSaver: " + script_path);
+ ERR_FAIL_COND_V(!valid_type, false);
+
+ Object *obj = ClassDB::instance(ibt);
+
+ ERR_EXPLAIN("Cannot instance script as custom resource saver, expected 'ResourceFormatSaver' inheritance, got: " + String(ibt));
+ ERR_FAIL_COND_V(obj == NULL, false);
+
+ ResourceFormatSaver *crl = NULL;
+ crl = Object::cast_to<ResourceFormatSaver>(obj);
+ crl->set_script(s.get_ref_ptr());
+ ResourceSaver::add_resource_format_saver(crl);
+
+ return true;
+}
+
+void ResourceSaver::remove_custom_resource_format_saver(String script_path) {
+
+ Ref<ResourceFormatSaver> saver = _find_custom_resource_format_saver(script_path);
+ if (saver.is_valid())
+ remove_resource_format_saver(saver);
+}
+
+void ResourceSaver::add_custom_savers() {
+ // Custom resource savers exploits global class names
+
+ String custom_saver_base_class = ResourceFormatSaver::get_class_static();
+
+ List<StringName> global_classes;
+ ScriptServer::get_global_class_list(&global_classes);
+
+ for (List<StringName>::Element *E = global_classes.front(); E; E = E->next()) {
+
+ StringName class_name = E->get();
+ StringName base_class = ScriptServer::get_global_class_base(class_name);
+
+ if (base_class == custom_saver_base_class) {
+ String path = ScriptServer::get_global_class_path(class_name);
+ add_custom_resource_format_saver(path);
+ }
+ }
+}
+
+void ResourceSaver::remove_custom_savers() {
+
+ Vector<Ref<ResourceFormatSaver> > custom_savers;
+ for (int i = 0; i < saver_count; ++i) {
+ if (saver[i]->get_script_instance()) {
+ custom_savers.push_back(saver[i]);
+ }
+ }
+
+ for (int i = 0; i < custom_savers.size(); ++i) {
+ remove_resource_format_saver(custom_savers[i]);
+ }
+}
diff --git a/core/io/resource_saver.h b/core/io/resource_saver.h
index 6134d9db57..7df3bfb1f8 100644
--- a/core/io/resource_saver.h
+++ b/core/io/resource_saver.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -37,11 +37,16 @@
@author Juan Linietsky <reduzio@gmail.com>
*/
-class ResourceFormatSaver {
+class ResourceFormatSaver : public Reference {
+ GDCLASS(ResourceFormatSaver, Reference)
+
+protected:
+ static void _bind_methods();
+
public:
- virtual Error save(const String &p_path, const RES &p_resource, uint32_t p_flags = 0) = 0;
- virtual bool recognize(const RES &p_resource) const = 0;
- virtual void get_recognized_extensions(const RES &p_resource, List<String> *p_extensions) const = 0;
+ virtual Error save(const String &p_path, const RES &p_resource, uint32_t p_flags = 0);
+ virtual bool recognize(const RES &p_resource) const;
+ virtual void get_recognized_extensions(const RES &p_resource, List<String> *p_extensions) const;
virtual ~ResourceFormatSaver() {}
};
@@ -54,11 +59,13 @@ class ResourceSaver {
MAX_SAVERS = 64
};
- static ResourceFormatSaver *saver[MAX_SAVERS];
+ static Ref<ResourceFormatSaver> saver[MAX_SAVERS];
static int saver_count;
static bool timestamp_on_save;
static ResourceSavedCallback save_callback;
+ static Ref<ResourceFormatSaver> _find_custom_resource_format_saver(String path);
+
public:
enum SaverFlags {
@@ -73,10 +80,18 @@ public:
static Error save(const String &p_path, const RES &p_resource, uint32_t p_flags = 0);
static void get_recognized_extensions(const RES &p_resource, List<String> *p_extensions);
- static void add_resource_format_saver(ResourceFormatSaver *p_format_saver, bool p_at_front = false);
+ static void add_resource_format_saver(Ref<ResourceFormatSaver> p_format_saver, bool p_at_front = false);
+ static void remove_resource_format_saver(Ref<ResourceFormatSaver> p_format_saver);
static void set_timestamp_on_save(bool p_timestamp) { timestamp_on_save = p_timestamp; }
+ static bool get_timestamp_on_save() { return timestamp_on_save; }
+
static void set_save_callback(ResourceSavedCallback p_callback);
+
+ static bool add_custom_resource_format_saver(String script_path);
+ static void remove_custom_resource_format_saver(String script_path);
+ static void add_custom_savers();
+ static void remove_custom_savers();
};
#endif
diff --git a/core/io/stream_peer.cpp b/core/io/stream_peer.cpp
index 3f608b720c..3042c0f60a 100644
--- a/core/io/stream_peer.cpp
+++ b/core/io/stream_peer.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/stream_peer.h b/core/io/stream_peer.h
index f189960cbd..059ccd016c 100644
--- a/core/io/stream_peer.h
+++ b/core/io/stream_peer.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/stream_peer_ssl.cpp b/core/io/stream_peer_ssl.cpp
index 138f91301e..254ae84bf5 100644
--- a/core/io/stream_peer_ssl.cpp
+++ b/core/io/stream_peer_ssl.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/stream_peer_ssl.h b/core/io/stream_peer_ssl.h
index 8ce36d7e7d..482576c4c6 100644
--- a/core/io/stream_peer_ssl.h
+++ b/core/io/stream_peer_ssl.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/stream_peer_tcp.cpp b/core/io/stream_peer_tcp.cpp
index 28561e8cbc..45f3e46e35 100644
--- a/core/io/stream_peer_tcp.cpp
+++ b/core/io/stream_peer_tcp.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -349,12 +349,11 @@ void StreamPeerTCP::_bind_methods() {
BIND_ENUM_CONSTANT(STATUS_ERROR);
}
-StreamPeerTCP::StreamPeerTCP() {
-
- _sock = Ref<NetSocket>(NetSocket::create());
- status = STATUS_NONE;
- peer_host = IP_Address();
- peer_port = 0;
+StreamPeerTCP::StreamPeerTCP() :
+ _sock(Ref<NetSocket>(NetSocket::create())),
+ status(STATUS_NONE),
+ peer_host(IP_Address()),
+ peer_port(0) {
}
StreamPeerTCP::~StreamPeerTCP() {
diff --git a/core/io/stream_peer_tcp.h b/core/io/stream_peer_tcp.h
index de364915cd..1ca39375aa 100644
--- a/core/io/stream_peer_tcp.h
+++ b/core/io/stream_peer_tcp.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/tcp_server.cpp b/core/io/tcp_server.cpp
index b8194cb17f..6599c4eb5b 100644
--- a/core/io/tcp_server.cpp
+++ b/core/io/tcp_server.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -116,9 +116,8 @@ void TCP_Server::stop() {
}
}
-TCP_Server::TCP_Server() {
-
- _sock = Ref<NetSocket>(NetSocket::create());
+TCP_Server::TCP_Server() :
+ _sock(Ref<NetSocket>(NetSocket::create())) {
}
TCP_Server::~TCP_Server() {
diff --git a/core/io/tcp_server.h b/core/io/tcp_server.h
index 4c89197d9a..538db175ad 100644
--- a/core/io/tcp_server.h
+++ b/core/io/tcp_server.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/translation_loader_po.cpp b/core/io/translation_loader_po.cpp
index 830c2b6694..67a0a905bd 100644
--- a/core/io/translation_loader_po.cpp
+++ b/core/io/translation_loader_po.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/translation_loader_po.h b/core/io/translation_loader_po.h
index 670a9fdd7e..d5fd264385 100644
--- a/core/io/translation_loader_po.h
+++ b/core/io/translation_loader_po.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -36,6 +36,7 @@
#include "core/translation.h"
class TranslationLoaderPO : public ResourceFormatLoader {
+ GDCLASS(TranslationLoaderPO, ResourceFormatLoader)
public:
static RES load_translation(FileAccess *f, Error *r_error, const String &p_path = String());
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
diff --git a/core/io/xml_parser.cpp b/core/io/xml_parser.cpp
index 8c0cbd6e55..4638ddcc09 100644
--- a/core/io/xml_parser.cpp
+++ b/core/io/xml_parser.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/xml_parser.h b/core/io/xml_parser.h
index bbc7671a0e..0df2d74ab4 100644
--- a/core/io/xml_parser.h
+++ b/core/io/xml_parser.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/zip_io.cpp b/core/io/zip_io.cpp
index b7f841b66f..8f3e0b49ec 100644
--- a/core/io/zip_io.cpp
+++ b/core/io/zip_io.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/io/zip_io.h b/core/io/zip_io.h
index bba7d67332..fb63878a4c 100644
--- a/core/io/zip_io.h
+++ b/core/io/zip_io.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/list.h b/core/list.h
index 281f253a59..dd4ea3bd89 100644
--- a/core/list.h
+++ b/core/list.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/map.h b/core/map.h
index cab8965bb3..a701ba36f7 100644
--- a/core/map.h
+++ b/core/map.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/a_star.cpp b/core/math/a_star.cpp
index 451c45cade..a0556ae839 100644
--- a/core/math/a_star.cpp
+++ b/core/math/a_star.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/a_star.h b/core/math/a_star.h
index d2ef765006..d094bc4863 100644
--- a/core/math/a_star.h
+++ b/core/math/a_star.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/aabb.cpp b/core/math/aabb.cpp
index d0cb2b5195..a4eb1fe2a5 100644
--- a/core/math/aabb.cpp
+++ b/core/math/aabb.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/aabb.h b/core/math/aabb.h
index 0b03b7d314..52e5ed3626 100644
--- a/core/math/aabb.h
+++ b/core/math/aabb.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/audio_frame.cpp b/core/math/audio_frame.cpp
index eff817bbaa..2496a70890 100644
--- a/core/math/audio_frame.cpp
+++ b/core/math/audio_frame.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/audio_frame.h b/core/math/audio_frame.h
index fde26e8056..f970c510e0 100644
--- a/core/math/audio_frame.h
+++ b/core/math/audio_frame.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/bsp_tree.cpp b/core/math/bsp_tree.cpp
index 6ffc963783..d7e6e82cd9 100644
--- a/core/math/bsp_tree.cpp
+++ b/core/math/bsp_tree.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/bsp_tree.h b/core/math/bsp_tree.h
index b06e6b8539..0af532a2d5 100644
--- a/core/math/bsp_tree.h
+++ b/core/math/bsp_tree.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/camera_matrix.cpp b/core/math/camera_matrix.cpp
index 3a082d5720..caf08c7379 100644
--- a/core/math/camera_matrix.cpp
+++ b/core/math/camera_matrix.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/camera_matrix.h b/core/math/camera_matrix.h
index bd20908ad9..015588a8cb 100644
--- a/core/math/camera_matrix.h
+++ b/core/math/camera_matrix.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/delaunay.h b/core/math/delaunay.h
index 9c5eef9069..bd0cf97937 100644
--- a/core/math/delaunay.h
+++ b/core/math/delaunay.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/expression.cpp b/core/math/expression.cpp
index 0cfb54234c..61e5154f44 100644
--- a/core/math/expression.cpp
+++ b/core/math/expression.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -2157,13 +2157,13 @@ void Expression::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_error_text"), &Expression::get_error_text);
}
-Expression::Expression() {
- output_type = Variant::NIL;
- error_set = true;
- root = NULL;
- nodes = NULL;
- sequenced = false;
- execution_error = false;
+Expression::Expression() :
+ output_type(Variant::NIL),
+ sequenced(false),
+ error_set(true),
+ root(NULL),
+ nodes(NULL),
+ execution_error(false) {
}
Expression::~Expression() {
diff --git a/core/math/expression.h b/core/math/expression.h
index ac2416d0dd..fa0878c93c 100644
--- a/core/math/expression.h
+++ b/core/math/expression.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -116,7 +116,9 @@ private:
Variant::Type type;
String name;
- Input() { type = Variant::NIL; }
+ Input() :
+ type(Variant::NIL) {
+ }
};
Vector<Input> inputs;
diff --git a/core/math/face3.cpp b/core/math/face3.cpp
index 8366137131..ab09142b2d 100644
--- a/core/math/face3.cpp
+++ b/core/math/face3.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/face3.h b/core/math/face3.h
index b41daf04d4..1a00851eab 100644
--- a/core/math/face3.h
+++ b/core/math/face3.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/geometry.cpp b/core/math/geometry.cpp
index be5e40e4e6..12c88f43b3 100644
--- a/core/math/geometry.cpp
+++ b/core/math/geometry.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -32,6 +32,7 @@
#include "core/print_string.h"
+/* this implementation is very inefficient, commenting unless bugs happen. See the other one.
bool Geometry::is_point_in_polygon(const Vector2 &p_point, const Vector<Vector2> &p_polygon) {
Vector<int> indices = Geometry::triangulate_polygon(p_polygon);
@@ -42,6 +43,7 @@ bool Geometry::is_point_in_polygon(const Vector2 &p_point, const Vector<Vector2>
}
return false;
}
+*/
void Geometry::MeshData::optimize_vertices() {
diff --git a/core/math/geometry.h b/core/math/geometry.h
index df63f0dabe..29493516b8 100644
--- a/core/math/geometry.h
+++ b/core/math/geometry.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -514,7 +514,7 @@ public:
return (cn.cross(an) > 0) == orientation;
}
- static bool is_point_in_polygon(const Vector2 &p_point, const Vector<Vector2> &p_polygon);
+ //static bool is_point_in_polygon(const Vector2 &p_point, const Vector<Vector2> &p_polygon);
static Vector2 get_closest_point_to_segment_uncapped_2d(const Vector2 &p_point, const Vector2 *p_segment) {
@@ -815,6 +815,36 @@ public:
return sum > 0.0f;
}
+ /* alternate implementation that should be faster */
+ static bool is_point_in_polygon(const Vector2 &p_point, const Vector<Vector2> &p_polygon) {
+ int c = p_polygon.size();
+ if (c < 3)
+ return false;
+ const Vector2 *p = p_polygon.ptr();
+ Vector2 further_away(-1e20, -1e20);
+ Vector2 further_away_opposite(1e20, 1e20);
+
+ for (int i = 0; i < c; i++) {
+ further_away.x = MAX(p[i].x, further_away.x);
+ further_away.y = MAX(p[i].y, further_away.y);
+ further_away_opposite.x = MIN(p[i].x, further_away_opposite.x);
+ further_away_opposite.y = MIN(p[i].y, further_away_opposite.y);
+ }
+
+ further_away += (further_away - further_away_opposite) * Vector2(1.221313, 1.512312); // make point outside that wont intersect with points in segment from p_point
+
+ int intersections = 0;
+ for (int i = 0; i < c; i++) {
+ const Vector2 &v1 = p[i];
+ const Vector2 &v2 = p[(i + 1) % c];
+ if (segment_intersects_segment_2d(v1, v2, p_point, further_away, NULL)) {
+ intersections++;
+ }
+ }
+
+ return (intersections & 1);
+ }
+
static PoolVector<PoolVector<Face3> > separate_objects(PoolVector<Face3> p_array);
static PoolVector<Face3> wrap_geometry(PoolVector<Face3> p_array, real_t *p_error = NULL); ///< create a "wrap" that encloses the given geometry
diff --git a/core/math/math_defs.h b/core/math/math_defs.h
index a5feee6eb5..48533ba659 100644
--- a/core/math/math_defs.h
+++ b/core/math/math_defs.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -93,9 +93,9 @@ enum Corner {
};
/**
- * The "Real" type is an abstract type used for real numbers, such as 1.5,
+ * The "Real" type is an abstract type used for real numbers, such as 1.5,
* in contrast to integer numbers. Precision can be controlled with the
- * presence or absence of the REAL_T_IS_DOUBLE define.
+ * presence or absence of the REAL_T_IS_DOUBLE define.
*/
#ifdef REAL_T_IS_DOUBLE
typedef double real_t;
diff --git a/core/math/math_fieldwise.cpp b/core/math/math_fieldwise.cpp
index 20b2341ab0..f65f504f4c 100644
--- a/core/math/math_fieldwise.cpp
+++ b/core/math/math_fieldwise.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/math_fieldwise.h b/core/math/math_fieldwise.h
index 0e7cc3ea4a..c245928f56 100644
--- a/core/math/math_fieldwise.h
+++ b/core/math/math_fieldwise.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/math_funcs.cpp b/core/math/math_funcs.cpp
index 06355d15ed..5b5fd8e283 100644
--- a/core/math/math_funcs.cpp
+++ b/core/math/math_funcs.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/math_funcs.h b/core/math/math_funcs.h
index f9d89d5d5a..ea0bfd88cc 100644
--- a/core/math/math_funcs.h
+++ b/core/math/math_funcs.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/matrix3.cpp b/core/math/matrix3.cpp
index 925a7b3f1e..0aa67078fb 100644
--- a/core/math/matrix3.cpp
+++ b/core/math/matrix3.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/matrix3.h b/core/math/matrix3.h
index 35bf75bbe4..e7d6ab4522 100644
--- a/core/math/matrix3.h
+++ b/core/math/matrix3.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/octree.h b/core/math/octree.h
index cd89743a5a..36a77663f4 100644
--- a/core/math/octree.h
+++ b/core/math/octree.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/plane.cpp b/core/math/plane.cpp
index 3c597d57f8..cd3cbce300 100644
--- a/core/math/plane.cpp
+++ b/core/math/plane.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/plane.h b/core/math/plane.h
index 4eedebb79e..1c6e4b816b 100644
--- a/core/math/plane.h
+++ b/core/math/plane.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -74,10 +74,11 @@ public:
_FORCE_INLINE_ bool operator!=(const Plane &p_plane) const;
operator String() const;
- _FORCE_INLINE_ Plane() { d = 0; }
+ _FORCE_INLINE_ Plane() :
+ d(0) {}
_FORCE_INLINE_ Plane(real_t p_a, real_t p_b, real_t p_c, real_t p_d) :
normal(p_a, p_b, p_c),
- d(p_d){};
+ d(p_d) {}
_FORCE_INLINE_ Plane(const Vector3 &p_normal, real_t p_d);
_FORCE_INLINE_ Plane(const Vector3 &p_point, const Vector3 &p_normal);
diff --git a/core/math/quat.cpp b/core/math/quat.cpp
index 791e84f089..c1e45f36f0 100644
--- a/core/math/quat.cpp
+++ b/core/math/quat.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/quat.h b/core/math/quat.h
index c4f9b3a732..7d71ec03e8 100644
--- a/core/math/quat.h
+++ b/core/math/quat.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -115,20 +115,20 @@ public:
z = p_z;
w = p_w;
}
- inline Quat(real_t p_x, real_t p_y, real_t p_z, real_t p_w) {
- x = p_x;
- y = p_y;
- z = p_z;
- w = p_w;
+ inline Quat(real_t p_x, real_t p_y, real_t p_z, real_t p_w) :
+ x(p_x),
+ y(p_y),
+ z(p_z),
+ w(p_w) {
}
Quat(const Vector3 &axis, const real_t &angle) { set_axis_angle(axis, angle); }
Quat(const Vector3 &euler) { set_euler(euler); }
- Quat(const Quat &q) {
- x = q.x;
- y = q.y;
- z = q.z;
- w = q.w;
+ Quat(const Quat &q) :
+ x(q.x),
+ y(q.y),
+ z(q.z),
+ w(q.w) {
}
Quat(const Vector3 &v0, const Vector3 &v1) // shortest arc
@@ -153,9 +153,11 @@ public:
}
}
- inline Quat() {
- x = y = z = 0;
- w = 1;
+ inline Quat() :
+ x(0),
+ y(0),
+ z(0),
+ w(1) {
}
};
diff --git a/core/math/quick_hull.cpp b/core/math/quick_hull.cpp
index 23823b339a..1aa345db1f 100644
--- a/core/math/quick_hull.cpp
+++ b/core/math/quick_hull.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/quick_hull.h b/core/math/quick_hull.h
index 0ac2758323..2e659cab6e 100644
--- a/core/math/quick_hull.h
+++ b/core/math/quick_hull.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/random_number_generator.cpp b/core/math/random_number_generator.cpp
index e4ec0dac99..fccc0f72fe 100644
--- a/core/math/random_number_generator.cpp
+++ b/core/math/random_number_generator.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -40,6 +40,7 @@ void RandomNumberGenerator::_bind_methods() {
ClassDB::bind_method(D_METHOD("randi"), &RandomNumberGenerator::randi);
ClassDB::bind_method(D_METHOD("randf"), &RandomNumberGenerator::randf);
- ClassDB::bind_method(D_METHOD("rand_range", "from", "to"), &RandomNumberGenerator::rand_range);
+ ClassDB::bind_method(D_METHOD("randf_range", "from", "to"), &RandomNumberGenerator::randf_range);
+ ClassDB::bind_method(D_METHOD("randi_range", "from", "to"), &RandomNumberGenerator::randi_range);
ClassDB::bind_method(D_METHOD("randomize"), &RandomNumberGenerator::randomize);
}
diff --git a/core/math/random_number_generator.h b/core/math/random_number_generator.h
index 557863fdbd..66c77b8ccf 100644
--- a/core/math/random_number_generator.h
+++ b/core/math/random_number_generator.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -53,7 +53,12 @@ public:
_FORCE_INLINE_ real_t randf() { return randbase.randf(); }
- _FORCE_INLINE_ real_t rand_range(real_t from, real_t to) { return randbase.random(from, to); }
+ _FORCE_INLINE_ real_t randf_range(real_t from, real_t to) { return randbase.random(from, to); }
+
+ _FORCE_INLINE_ int randi_range(int from, int to) {
+ unsigned int ret = randbase.rand();
+ return ret % (to - from + 1) + from;
+ }
RandomNumberGenerator();
};
diff --git a/core/math/random_pcg.cpp b/core/math/random_pcg.cpp
index 16899f79da..8bbcca88fe 100644
--- a/core/math/random_pcg.cpp
+++ b/core/math/random_pcg.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/random_pcg.h b/core/math/random_pcg.h
index 4a43c36ede..d594d16b98 100644
--- a/core/math/random_pcg.h
+++ b/core/math/random_pcg.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -50,8 +50,8 @@ public:
void randomize();
_FORCE_INLINE_ uint32_t rand() { return pcg32_random_r(&pcg); }
- _FORCE_INLINE_ double randf() { return (double)rand() / (double)RANDOM_MAX; }
- _FORCE_INLINE_ float randd() { return (float)rand() / (float)RANDOM_MAX; }
+ _FORCE_INLINE_ double randd() { return (double)rand() / (double)RANDOM_MAX; }
+ _FORCE_INLINE_ float randf() { return (float)rand() / (float)RANDOM_MAX; }
double random(double from, double to);
float random(float from, float to);
diff --git a/core/math/rect2.cpp b/core/math/rect2.cpp
index 24c1c8c984..fea128afbd 100644
--- a/core/math/rect2.cpp
+++ b/core/math/rect2.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/rect2.h b/core/math/rect2.h
index 96c0e177d3..901d372132 100644
--- a/core/math/rect2.h
+++ b/core/math/rect2.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/transform.cpp b/core/math/transform.cpp
index 75257a6e60..7ff7cac914 100644
--- a/core/math/transform.cpp
+++ b/core/math/transform.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/transform.h b/core/math/transform.h
index 97c8bf9ab0..9b323a6f0f 100644
--- a/core/math/transform.h
+++ b/core/math/transform.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/transform_2d.cpp b/core/math/transform_2d.cpp
index 4bb763c879..295e60babb 100644
--- a/core/math/transform_2d.cpp
+++ b/core/math/transform_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/transform_2d.h b/core/math/transform_2d.h
index c8fc3c39e3..507e6a16eb 100644
--- a/core/math/transform_2d.h
+++ b/core/math/transform_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/triangle_mesh.cpp b/core/math/triangle_mesh.cpp
index 6b8dc5eeb3..cdf3d16b72 100644
--- a/core/math/triangle_mesh.cpp
+++ b/core/math/triangle_mesh.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/triangle_mesh.h b/core/math/triangle_mesh.h
index e5f181fba7..ee7bf0f6b5 100644
--- a/core/math/triangle_mesh.h
+++ b/core/math/triangle_mesh.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/triangulate.cpp b/core/math/triangulate.cpp
index 69ffc95946..be409e62a7 100644
--- a/core/math/triangulate.cpp
+++ b/core/math/triangulate.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/triangulate.h b/core/math/triangulate.h
index 2b0557ee55..2437e2b0f0 100644
--- a/core/math/triangulate.h
+++ b/core/math/triangulate.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/vector2.cpp b/core/math/vector2.cpp
index 7c6f056f09..e580057950 100644
--- a/core/math/vector2.cpp
+++ b/core/math/vector2.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/vector2.h b/core/math/vector2.h
index e5e555597d..a20326f667 100644
--- a/core/math/vector2.h
+++ b/core/math/vector2.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/vector3.cpp b/core/math/vector3.cpp
index 5dbb01493d..b2e89ac7b8 100644
--- a/core/math/vector3.cpp
+++ b/core/math/vector3.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/math/vector3.h b/core/math/vector3.h
index 16feba6a0c..b0eef35635 100644
--- a/core/math/vector3.h
+++ b/core/math/vector3.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/message_queue.cpp b/core/message_queue.cpp
index abfc73407a..c57bd4081c 100644
--- a/core/message_queue.cpp
+++ b/core/message_queue.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -209,9 +209,9 @@ void MessageQueue::statistics() {
} break;
}
+ } else {
//object was deleted
print_line("Object was deleted while awaiting a callback");
- } else {
null_count++;
}
@@ -271,6 +271,9 @@ void MessageQueue::flush() {
//using reverse locking strategy
_THREAD_SAFE_LOCK_
+ ERR_FAIL_COND(flushing); //already flushing, you did something odd
+ flushing = true;
+
while (read_pos < buffer_end) {
//lock on each iteration, so a call can re-add itself to the message queue
@@ -327,13 +330,20 @@ void MessageQueue::flush() {
}
buffer_end = 0; // reset buffer
+ flushing = false;
_THREAD_SAFE_UNLOCK_
}
+bool MessageQueue::is_flushing() const {
+
+ return flushing;
+}
+
MessageQueue::MessageQueue() {
ERR_FAIL_COND(singleton != NULL);
singleton = this;
+ flushing = false;
buffer_end = 0;
buffer_max_used = 0;
diff --git a/core/message_queue.h b/core/message_queue.h
index 2083bb0639..2515eb4a98 100644
--- a/core/message_queue.h
+++ b/core/message_queue.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -72,6 +72,8 @@ class MessageQueue {
static MessageQueue *singleton;
+ bool flushing;
+
public:
static MessageQueue *get_singleton();
@@ -87,6 +89,8 @@ public:
void statistics();
void flush();
+ bool is_flushing() const;
+
int get_max_buffer_usage() const;
MessageQueue();
diff --git a/core/method_bind.cpp b/core/method_bind.cpp
index fa5b88b5ac..72b0030ce8 100644
--- a/core/method_bind.cpp
+++ b/core/method_bind.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/method_bind.h b/core/method_bind.h
index 7788de919c..5ea8adb7e0 100644
--- a/core/method_bind.h
+++ b/core/method_bind.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/method_ptrcall.h b/core/method_ptrcall.h
index b706e65d53..e06081d24a 100644
--- a/core/method_ptrcall.h
+++ b/core/method_ptrcall.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/node_path.cpp b/core/node_path.cpp
index 91e2aa5f4e..07ff765516 100644
--- a/core/node_path.cpp
+++ b/core/node_path.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/node_path.h b/core/node_path.h
index 4a72d4a4d5..17b1435723 100644
--- a/core/node_path.h
+++ b/core/node_path.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/oa_hash_map.h b/core/oa_hash_map.h
index 9840442519..e52d36a859 100644
--- a/core/oa_hash_map.h
+++ b/core/oa_hash_map.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/object.cpp b/core/object.cpp
index ea77090a45..682586a7ab 100644
--- a/core/object.cpp
+++ b/core/object.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -1443,8 +1443,20 @@ Error Object::connect(const StringName &p_signal, Object *p_to_object, const Str
if (!s) {
bool signal_is_valid = ClassDB::has_signal(get_class_name(), p_signal);
//check in script
- if (!signal_is_valid && !script.is_null() && Ref<Script>(script)->has_script_signal(p_signal))
- signal_is_valid = true;
+ if (!signal_is_valid && !script.is_null()) {
+
+ if (Ref<Script>(script)->has_script_signal(p_signal)) {
+ signal_is_valid = true;
+ }
+#ifdef TOOLS_ENABLED
+ else {
+ //allow connecting signals anyway if script is invalid, see issue #17070
+ if (!Ref<Script>(script)->is_valid()) {
+ signal_is_valid = true;
+ }
+ }
+#endif
+ }
if (!signal_is_valid) {
ERR_EXPLAIN("In Object of type '" + String(get_class()) + "': Attempt to connect nonexistent signal '" + p_signal + "' to method '" + p_to_object->get_class() + "." + p_to_method + "'");
diff --git a/core/object.h b/core/object.h
index 88a98dacbe..a5bb6dea5d 100644
--- a/core/object.h
+++ b/core/object.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -118,6 +118,7 @@ enum PropertyUsageFlags {
PROPERTY_USAGE_INTERNAL = 1 << 20,
PROPERTY_USAGE_DO_NOT_SHARE_ON_DUPLICATE = 1 << 21, // If the object is duplicated also this property will be duplicated
PROPERTY_USAGE_HIGH_END_GFX = 1 << 22,
+ PROPERTY_USAGE_NODE_PATH_FROM_SCENE_ROOT = 1 << 23,
PROPERTY_USAGE_DEFAULT = PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_NETWORK,
PROPERTY_USAGE_DEFAULT_INTL = PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_NETWORK | PROPERTY_USAGE_INTERNATIONALIZED,
diff --git a/core/ordered_hash_map.h b/core/ordered_hash_map.h
index 092bf314d0..09d43d6797 100644
--- a/core/ordered_hash_map.h
+++ b/core/ordered_hash_map.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/copymem.h b/core/os/copymem.h
index 999c770e85..cc68983d4d 100644
--- a/core/os/copymem.h
+++ b/core/os/copymem.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/dir_access.cpp b/core/os/dir_access.cpp
index daa3eacd5f..2c1c655175 100644
--- a/core/os/dir_access.cpp
+++ b/core/os/dir_access.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -349,9 +349,9 @@ class DirChanger {
String original_dir;
public:
- DirChanger(DirAccess *p_da, String p_dir) {
- da = p_da;
- original_dir = p_da->get_current_dir();
+ DirChanger(DirAccess *p_da, String p_dir) :
+ da(p_da),
+ original_dir(p_da->get_current_dir()) {
p_da->change_dir(p_dir);
}
@@ -431,8 +431,12 @@ Error DirAccess::copy_dir(String p_from, String p_to, int p_chmod_flags) {
ERR_FAIL_COND_V(err, err);
}
+ if (!p_to.ends_with("/")) {
+ p_to = p_to + "/";
+ }
+
DirChanger dir_changer(this, p_from);
- Error err = _copy_dir(target_da, p_to + "/", p_chmod_flags);
+ Error err = _copy_dir(target_da, p_to, p_chmod_flags);
memdelete(target_da);
return err;
diff --git a/core/os/dir_access.h b/core/os/dir_access.h
index 773f0bcd41..16358fbc57 100644
--- a/core/os/dir_access.h
+++ b/core/os/dir_access.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/file_access.cpp b/core/os/file_access.cpp
index 8f4fae9eb1..d1f8236898 100644
--- a/core/os/file_access.cpp
+++ b/core/os/file_access.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -353,7 +353,8 @@ Vector<String> FileAccess::get_csv_line(const String &p_delim) const {
String l;
int qc = 0;
do {
- ERR_FAIL_COND_V(eof_reached(), Vector<String>());
+ if (eof_reached())
+ break;
l += get_line() + "\n";
qc = 0;
@@ -534,7 +535,7 @@ void FileAccess::store_csv_line(const Vector<String> &p_values, const String &p_
for (int i = 0; i < size; ++i) {
String value = p_values[i];
- if (value.find("\"") != -1 || value.find(p_delim) != -1 || value.find("\n")) {
+ if (value.find("\"") != -1 || value.find(p_delim) != -1 || value.find("\n") != -1) {
value = "\"" + value.replace("\"", "\"\"") + "\"";
}
if (i < size - 1) {
diff --git a/core/os/file_access.h b/core/os/file_access.h
index f1f3005dd9..7bfbf6e7f0 100644
--- a/core/os/file_access.h
+++ b/core/os/file_access.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/input.cpp b/core/os/input.cpp
index 3b895b16b4..cf11ba3c6d 100644
--- a/core/os/input.cpp
+++ b/core/os/input.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/input.h b/core/os/input.h
index dc2c213db2..b354acd961 100644
--- a/core/os/input.h
+++ b/core/os/input.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/input_event.cpp b/core/os/input_event.cpp
index 5bbdd7efb2..1e0e83c8d2 100644
--- a/core/os/input_event.cpp
+++ b/core/os/input_event.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/input_event.h b/core/os/input_event.h
index 789d19c5b2..db31055b5f 100644
--- a/core/os/input_event.h
+++ b/core/os/input_event.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/keyboard.cpp b/core/os/keyboard.cpp
index abc579c58d..311025a5fd 100644
--- a/core/os/keyboard.cpp
+++ b/core/os/keyboard.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/keyboard.h b/core/os/keyboard.h
index 17bf5eaa48..58a0807579 100644
--- a/core/os/keyboard.h
+++ b/core/os/keyboard.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/main_loop.cpp b/core/os/main_loop.cpp
index 0945cdd512..895ce14ae9 100644
--- a/core/os/main_loop.cpp
+++ b/core/os/main_loop.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -60,6 +60,7 @@ void MainLoop::_bind_methods() {
BIND_CONSTANT(NOTIFICATION_TRANSLATION_CHANGED);
BIND_CONSTANT(NOTIFICATION_WM_ABOUT);
BIND_CONSTANT(NOTIFICATION_CRASH);
+ BIND_CONSTANT(NOTIFICATION_OS_IME_UPDATE);
};
void MainLoop::set_init_script(const Ref<Script> &p_init_script) {
diff --git a/core/os/main_loop.h b/core/os/main_loop.h
index 43f74302a8..bfdf92acfa 100644
--- a/core/os/main_loop.h
+++ b/core/os/main_loop.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -65,6 +65,7 @@ public:
NOTIFICATION_TRANSLATION_CHANGED = 90,
NOTIFICATION_WM_ABOUT = 91,
NOTIFICATION_CRASH = 92,
+ NOTIFICATION_OS_IME_UPDATE = 93,
};
virtual void input_event(const Ref<InputEvent> &p_event);
diff --git a/core/os/memory.cpp b/core/os/memory.cpp
index f25e40ef78..d1de51f3db 100644
--- a/core/os/memory.cpp
+++ b/core/os/memory.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/memory.h b/core/os/memory.h
index 3501c3f14e..f3ca9fc614 100644
--- a/core/os/memory.h
+++ b/core/os/memory.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -116,7 +116,9 @@ void memdelete(T *p_class) {
if (!predelete_handler(p_class))
return; // doesn't want to be deleted
- p_class->~T();
+ if (!__has_trivial_destructor(T))
+ p_class->~T();
+
Memory::free_static(p_class, false);
}
@@ -125,7 +127,9 @@ void memdelete_allocator(T *p_class) {
if (!predelete_handler(p_class))
return; // doesn't want to be deleted
- p_class->~T();
+ if (!__has_trivial_destructor(T))
+ p_class->~T();
+
A::free(p_class);
}
@@ -150,11 +154,13 @@ T *memnew_arr_template(size_t p_elements, const char *p_descr = "") {
ERR_FAIL_COND_V(!mem, failptr);
*(mem - 1) = p_elements;
- T *elems = (T *)mem;
+ if (!__has_trivial_constructor(T)) {
+ T *elems = (T *)mem;
- /* call operator new */
- for (size_t i = 0; i < p_elements; i++) {
- new (&elems[i], sizeof(T), p_descr) T;
+ /* call operator new */
+ for (size_t i = 0; i < p_elements; i++) {
+ new (&elems[i], sizeof(T), p_descr) T;
+ }
}
return (T *)mem;
@@ -177,12 +183,14 @@ void memdelete_arr(T *p_class) {
uint64_t *ptr = (uint64_t *)p_class;
- uint64_t elem_count = *(ptr - 1);
+ if (!__has_trivial_destructor(T)) {
+ uint64_t elem_count = *(ptr - 1);
- for (uint64_t i = 0; i < elem_count; i++) {
+ for (uint64_t i = 0; i < elem_count; i++) {
+ p_class[i].~T();
+ }
+ }
- p_class[i].~T();
- };
Memory::free_static(ptr, true);
}
diff --git a/core/os/midi_driver.cpp b/core/os/midi_driver.cpp
index 2b20a708ed..0d7ad23d68 100644
--- a/core/os/midi_driver.cpp
+++ b/core/os/midi_driver.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/midi_driver.h b/core/os/midi_driver.h
index ceb4e71d66..e0e5e2be67 100644
--- a/core/os/midi_driver.h
+++ b/core/os/midi_driver.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/mutex.cpp b/core/os/mutex.cpp
index 0c01b06bd6..1ae7e1f877 100644
--- a/core/os/mutex.cpp
+++ b/core/os/mutex.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/mutex.h b/core/os/mutex.h
index 788cc00397..17367f32f2 100644
--- a/core/os/mutex.h
+++ b/core/os/mutex.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/os.cpp b/core/os/os.cpp
index 7547b6a042..1f967030e7 100644
--- a/core/os/os.cpp
+++ b/core/os/os.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -61,6 +61,9 @@ uint64_t OS::get_unix_time() const {
uint64_t OS::get_system_time_secs() const {
return 0;
}
+uint64_t OS::get_system_time_msecs() const {
+ return 0;
+}
void OS::debug_break(){
// something
diff --git a/core/os/os.h b/core/os/os.h
index 7786ffb26e..36d4e5a8c1 100644
--- a/core/os/os.h
+++ b/core/os/os.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -242,7 +242,8 @@ public:
virtual void set_ime_active(const bool p_active) {}
virtual void set_ime_position(const Point2 &p_pos) {}
- virtual void set_ime_intermediate_text_callback(ImeCallback p_callback, void *p_inp) {}
+ virtual Point2 get_ime_selection() const { return Point2(); }
+ virtual String get_ime_text() const { return String(); }
virtual Error open_dynamic_library(const String p_path, void *&p_library_handle, bool p_also_set_library_path = false) { return ERR_UNAVAILABLE; }
virtual Error close_dynamic_library(void *p_library_handle) { return ERR_UNAVAILABLE; }
@@ -327,6 +328,7 @@ public:
virtual TimeZoneInfo get_time_zone_info() const = 0;
virtual uint64_t get_unix_time() const;
virtual uint64_t get_system_time_secs() const;
+ virtual uint64_t get_system_time_msecs() const;
virtual void delay_usec(uint32_t p_usec) const = 0;
virtual uint64_t get_ticks_usec() const = 0;
@@ -480,6 +482,7 @@ public:
enum EngineContext {
CONTEXT_EDITOR,
CONTEXT_PROJECTMAN,
+ CONTEXT_ENGINE,
};
virtual void set_context(int p_context);
diff --git a/core/os/rw_lock.cpp b/core/os/rw_lock.cpp
index 5e51a1dbce..b70d5d73a0 100644
--- a/core/os/rw_lock.cpp
+++ b/core/os/rw_lock.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/rw_lock.h b/core/os/rw_lock.h
index 4333d9a016..8632e84e61 100644
--- a/core/os/rw_lock.h
+++ b/core/os/rw_lock.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/semaphore.cpp b/core/os/semaphore.cpp
index 448d17dd14..5d3100760d 100644
--- a/core/os/semaphore.cpp
+++ b/core/os/semaphore.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/semaphore.h b/core/os/semaphore.h
index 6cec06ea28..ccbba0dacd 100644
--- a/core/os/semaphore.h
+++ b/core/os/semaphore.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/shell.cpp b/core/os/shell.cpp
index 32649a0667..a859241cb6 100644
--- a/core/os/shell.cpp
+++ b/core/os/shell.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/shell.h b/core/os/shell.h
index 146c35cbc8..c1bd995b5b 100644
--- a/core/os/shell.h
+++ b/core/os/shell.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/thread.cpp b/core/os/thread.cpp
index 250cf80a37..e00d20a9fe 100644
--- a/core/os/thread.cpp
+++ b/core/os/thread.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/thread.h b/core/os/thread.h
index 97e97652a5..e7a6e8cb1f 100644
--- a/core/os/thread.h
+++ b/core/os/thread.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/thread_dummy.cpp b/core/os/thread_dummy.cpp
index 9e0adf9994..63f724f81c 100644
--- a/core/os/thread_dummy.cpp
+++ b/core/os/thread_dummy.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/thread_dummy.h b/core/os/thread_dummy.h
index 6f46a4a20c..4a7785484b 100644
--- a/core/os/thread_dummy.h
+++ b/core/os/thread_dummy.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/thread_safe.cpp b/core/os/thread_safe.cpp
index 3fe039e1b6..9eecd1c3dd 100644
--- a/core/os/thread_safe.cpp
+++ b/core/os/thread_safe.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/thread_safe.h b/core/os/thread_safe.h
index a17ceeed1d..ddbf17da7f 100644
--- a/core/os/thread_safe.h
+++ b/core/os/thread_safe.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/os/threaded_array_processor.h b/core/os/threaded_array_processor.h
index 89c3b7cec3..58c8773d7f 100644
--- a/core/os/threaded_array_processor.h
+++ b/core/os/threaded_array_processor.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/packed_data_container.cpp b/core/packed_data_container.cpp
index e4ca8fafa5..6c17f42b13 100644
--- a/core/packed_data_container.cpp
+++ b/core/packed_data_container.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/packed_data_container.h b/core/packed_data_container.h
index 0e1dff1f70..25c83548be 100644
--- a/core/packed_data_container.h
+++ b/core/packed_data_container.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/pair.h b/core/pair.h
index 1d35ae1b6c..cb661160b5 100644
--- a/core/pair.h
+++ b/core/pair.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/path_remap.cpp b/core/path_remap.cpp
index 80308d72c0..548c9c85d7 100644
--- a/core/path_remap.cpp
+++ b/core/path_remap.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/path_remap.h b/core/path_remap.h
index 5e25628aeb..3829fa5a1f 100644
--- a/core/path_remap.h
+++ b/core/path_remap.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/pool_allocator.cpp b/core/pool_allocator.cpp
index 6997c993f4..a283d8db1d 100644
--- a/core/pool_allocator.cpp
+++ b/core/pool_allocator.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/pool_allocator.h b/core/pool_allocator.h
index 12e2b597db..282e0bd634 100644
--- a/core/pool_allocator.h
+++ b/core/pool_allocator.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/print_string.cpp b/core/print_string.cpp
index f53d50e078..d91d49f53b 100644
--- a/core/print_string.cpp
+++ b/core/print_string.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/print_string.h b/core/print_string.h
index 8f4fbb1f7b..6fcffd417b 100644
--- a/core/print_string.h
+++ b/core/print_string.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/project_settings.cpp b/core/project_settings.cpp
index 407bb78375..8d05d7cc74 100644
--- a/core/project_settings.cpp
+++ b/core/project_settings.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -43,8 +43,6 @@
#include <zlib.h>
-#define FORMAT_VERSION 4
-
ProjectSettings *ProjectSettings::singleton = NULL;
ProjectSettings *ProjectSettings::get_singleton() {
@@ -271,9 +269,9 @@ bool ProjectSettings::_load_resource_pack(const String &p_pack) {
return true;
}
-void ProjectSettings::_convert_to_last_version() {
- if (!has_setting("config_version") || (int)get_setting("config_version") <= 3) {
+void ProjectSettings::_convert_to_last_version(int p_from_version) {
+ if (p_from_version <= 3) {
// Converts the actions from array to dictionary (array of events to dictionary with deadzone + events)
for (Map<StringName, ProjectSettings::VariantContainer>::Element *E = props.front(); E; E = E->next()) {
Variant value = E->get().variant;
@@ -307,7 +305,7 @@ void ProjectSettings::_convert_to_last_version() {
* If a project file is found, load it or fail.
* If nothing was found, error out.
*/
-Error ProjectSettings::setup(const String &p_path, const String &p_main_pack, bool p_upwards) {
+Error ProjectSettings::_setup(const String &p_path, const String &p_main_pack, bool p_upwards) {
// If looking for files in a network client, use it directly
@@ -396,7 +394,6 @@ Error ProjectSettings::setup(const String &p_path, const String &p_main_pack, bo
// Optional, we don't mind if it fails
_load_settings_text("res://override.cfg");
}
-
return err;
}
@@ -443,13 +440,21 @@ Error ProjectSettings::setup(const String &p_path, const String &p_main_pack, bo
if (resource_path.length() && resource_path[resource_path.length() - 1] == '/')
resource_path = resource_path.substr(0, resource_path.length() - 1); // chop end
- // If we're loading a project.godot from source code, we can operate some
- // ProjectSettings conversions if need be.
- _convert_to_last_version();
-
return OK;
}
+Error ProjectSettings::setup(const String &p_path, const String &p_main_pack, bool p_upwards) {
+ Error err = _setup(p_path, p_main_pack, p_upwards);
+ if (err == OK) {
+ String custom_settings = GLOBAL_DEF("application/config/project_settings_override", "");
+ if (custom_settings != "") {
+ _load_settings_text(custom_settings);
+ }
+ }
+
+ return err;
+}
+
bool ProjectSettings::has_setting(String p_var) const {
_THREAD_SAFE_METHOD_
@@ -525,8 +530,8 @@ Error ProjectSettings::_load_settings_text(const String p_path) {
int lines = 0;
String error_text;
-
String section;
+ int config_version = 0;
while (true) {
@@ -537,6 +542,9 @@ Error ProjectSettings::_load_settings_text(const String p_path) {
err = VariantParser::parse_tag_assign_eof(&stream, lines, error_text, next_tag, assign, value, NULL, true);
if (err == ERR_FILE_EOF) {
memdelete(f);
+ // If we're loading a project.godot from source code, we can operate some
+ // ProjectSettings conversions if need be.
+ _convert_to_last_version(config_version);
return OK;
} else if (err != OK) {
ERR_PRINTS("Error parsing " + p_path + " at line " + itos(lines) + ": " + error_text + " File might be corrupted.");
@@ -546,13 +554,13 @@ Error ProjectSettings::_load_settings_text(const String p_path) {
if (assign != String()) {
if (section == String() && assign == "config_version") {
- int config_version = value;
- if (config_version > FORMAT_VERSION) {
+ config_version = value;
+ if (config_version > CONFIG_VERSION) {
memdelete(f);
- ERR_FAIL_COND_V(config_version > FORMAT_VERSION, ERR_FILE_CANT_OPEN);
+ ERR_EXPLAIN(vformat("Can't open project at '%s', its `config_version` (%d) is from a more recent and incompatible version of the engine. Expected config version: %d.", p_path, config_version, CONFIG_VERSION));
+ ERR_FAIL_COND_V(config_version > CONFIG_VERSION, ERR_FILE_CANT_OPEN);
}
} else {
- // config_version is checked and dropped
if (section == String()) {
set(assign, value);
} else {
@@ -728,7 +736,7 @@ Error ProjectSettings::_save_settings_text(const String &p_file, const Map<Strin
file->store_line("; param=value ; assign values to parameters");
file->store_line("");
- file->store_string("config_version=" + itos(FORMAT_VERSION) + "\n");
+ file->store_string("config_version=" + itos(CONFIG_VERSION) + "\n");
if (p_custom_features != String())
file->store_string("custom_features=\"" + p_custom_features + "\"\n");
file->store_string("\n");
@@ -995,6 +1003,7 @@ ProjectSettings::ProjectSettings() {
GLOBAL_DEF("application/run/disable_stderr", false);
GLOBAL_DEF("application/config/use_custom_user_dir", false);
GLOBAL_DEF("application/config/custom_user_dir_name", "");
+ GLOBAL_DEF("application/config/project_settings_override", "");
action = Dictionary();
action["deadzone"] = Variant(0.5f);
@@ -1154,8 +1163,6 @@ ProjectSettings::ProjectSettings() {
GLOBAL_DEF("input/ui_end", action);
input_presets.push_back("input/ui_end");
- //GLOBAL_DEF("display/window/handheld/orientation", "landscape");
-
custom_prop_info["display/window/handheld/orientation"] = PropertyInfo(Variant::STRING, "display/window/handheld/orientation", PROPERTY_HINT_ENUM, "landscape,portrait,reverse_landscape,reverse_portrait,sensor_landscape,sensor_portrait,sensor");
custom_prop_info["rendering/threads/thread_model"] = PropertyInfo(Variant::INT, "rendering/threads/thread_model", PROPERTY_HINT_ENUM, "Single-Unsafe,Single-Safe,Multi-Threaded");
custom_prop_info["physics/2d/thread_model"] = PropertyInfo(Variant::INT, "physics/2d/thread_model", PROPERTY_HINT_ENUM, "Single-Unsafe,Single-Safe,Multi-Threaded");
diff --git a/core/project_settings.h b/core/project_settings.h
index 611355f2ef..0ff18ab3f5 100644
--- a/core/project_settings.h
+++ b/core/project_settings.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -106,16 +106,20 @@ protected:
Error _save_custom_bnd(const String &p_file);
- void _convert_to_last_version();
+ void _convert_to_last_version(int p_from_version);
bool _load_resource_pack(const String &p_pack);
void _add_property_info_bind(const Dictionary &p_info);
+ Error _setup(const String &p_path, const String &p_main_pack, bool p_upwards = false);
+
protected:
static void _bind_methods();
public:
+ static const int CONFIG_VERSION = 4;
+
void set_setting(const String &p_setting, const Variant &p_value);
Variant get_setting(const String &p_setting) const;
@@ -150,8 +154,6 @@ public:
void set_disable_feature_overrides(bool p_disable);
- void register_global_defaults();
-
bool is_using_datapack() const;
void set_registering_order(bool p_enable);
diff --git a/core/ref_ptr.cpp b/core/ref_ptr.cpp
index 7f0cc0cd75..961f143e5c 100644
--- a/core/ref_ptr.cpp
+++ b/core/ref_ptr.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/ref_ptr.h b/core/ref_ptr.h
index 3f15c680b8..f745ababa1 100644
--- a/core/ref_ptr.h
+++ b/core/ref_ptr.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/reference.cpp b/core/reference.cpp
index b79ad0bf3d..7b5145184a 100644
--- a/core/reference.cpp
+++ b/core/reference.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -139,8 +139,8 @@ void WeakRef::set_ref(const REF &p_ref) {
ref = p_ref.is_valid() ? p_ref->get_instance_id() : 0;
}
-WeakRef::WeakRef() {
- ref = 0;
+WeakRef::WeakRef() :
+ ref(0) {
}
void WeakRef::_bind_methods() {
diff --git a/core/reference.h b/core/reference.h
index 4c607fed87..f3fcc922c7 100644
--- a/core/reference.h
+++ b/core/reference.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/register_core_types.cpp b/core/register_core_types.cpp
index 6b776cb0b1..666384b093 100644
--- a/core/register_core_types.cpp
+++ b/core/register_core_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -65,11 +65,11 @@
#include "core/translation.h"
#include "core/undo_redo.h"
-static ResourceFormatSaverBinary *resource_saver_binary = NULL;
-static ResourceFormatLoaderBinary *resource_loader_binary = NULL;
-static ResourceFormatImporter *resource_format_importer = NULL;
-
-static ResourceFormatLoaderImage *resource_format_image = NULL;
+static Ref<ResourceFormatSaverBinary> resource_saver_binary;
+static Ref<ResourceFormatLoaderBinary> resource_loader_binary;
+static Ref<ResourceFormatImporter> resource_format_importer;
+static Ref<ResourceFormatLoaderImage> resource_format_image;
+static Ref<TranslationLoaderPO> resource_format_po;
static _ResourceLoader *_resource_loader = NULL;
static _ResourceSaver *_resource_saver = NULL;
@@ -77,7 +77,6 @@ static _OS *_os = NULL;
static _Engine *_engine = NULL;
static _ClassDB *_classdb = NULL;
static _Marshalls *_marshalls = NULL;
-static TranslationLoaderPO *resource_format_po = NULL;
static _JSON *_json = NULL;
static IP *ip = NULL;
@@ -106,18 +105,18 @@ void register_core_types() {
CoreStringNames::create();
- resource_format_po = memnew(TranslationLoaderPO);
+ resource_format_po.instance();
ResourceLoader::add_resource_format_loader(resource_format_po);
- resource_saver_binary = memnew(ResourceFormatSaverBinary);
+ resource_saver_binary.instance();
ResourceSaver::add_resource_format_saver(resource_saver_binary);
- resource_loader_binary = memnew(ResourceFormatLoaderBinary);
+ resource_loader_binary.instance();
ResourceLoader::add_resource_format_loader(resource_loader_binary);
- resource_format_importer = memnew(ResourceFormatImporter);
+ resource_format_importer.instance();
ResourceLoader::add_resource_format_loader(resource_format_importer);
- resource_format_image = memnew(ResourceFormatLoaderImage);
+ resource_format_image.instance();
ResourceLoader::add_resource_format_loader(resource_format_image);
ClassDB::register_class<Object>();
@@ -165,6 +164,9 @@ void register_core_types() {
ClassDB::register_virtual_class<ResourceInteractiveLoader>();
+ ClassDB::register_class<ResourceFormatLoader>();
+ ClassDB::register_class<ResourceFormatSaver>();
+
ClassDB::register_class<_File>();
ClassDB::register_class<_Directory>();
ClassDB::register_class<_Thread>();
@@ -248,16 +250,20 @@ void unregister_core_types() {
memdelete(_geometry);
- if (resource_format_image)
- memdelete(resource_format_image);
- if (resource_saver_binary)
- memdelete(resource_saver_binary);
- if (resource_loader_binary)
- memdelete(resource_loader_binary);
- if (resource_format_importer)
- memdelete(resource_format_importer);
+ ResourceLoader::remove_resource_format_loader(resource_format_image);
+ resource_format_image.unref();
+
+ ResourceSaver::remove_resource_format_saver(resource_saver_binary);
+ resource_saver_binary.unref();
+
+ ResourceLoader::remove_resource_format_loader(resource_loader_binary);
+ resource_loader_binary.unref();
+
+ ResourceLoader::remove_resource_format_loader(resource_format_importer);
+ resource_format_importer.unref();
- memdelete(resource_format_po);
+ ResourceLoader::remove_resource_format_loader(resource_format_po);
+ resource_format_po.unref();
if (ip)
memdelete(ip);
diff --git a/core/register_core_types.h b/core/register_core_types.h
index 201da5cd07..b5a6aa985b 100644
--- a/core/register_core_types.h
+++ b/core/register_core_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/resource.cpp b/core/resource.cpp
index a76e16232e..74c93cd790 100644
--- a/core/resource.cpp
+++ b/core/resource.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/resource.h b/core/resource.h
index b2812c11e1..a4d9e998ac 100644
--- a/core/resource.h
+++ b/core/resource.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/rid.cpp b/core/rid.cpp
index 9661af9271..73cf7f24bb 100644
--- a/core/rid.cpp
+++ b/core/rid.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/rid.h b/core/rid.h
index 81d5b45d21..c7a71a03a0 100644
--- a/core/rid.h
+++ b/core/rid.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/ring_buffer.h b/core/ring_buffer.h
index 54486f8cad..e10cb8b5f8 100644
--- a/core/ring_buffer.h
+++ b/core/ring_buffer.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/safe_refcount.cpp b/core/safe_refcount.cpp
index 692ff722f3..8b0b3c3151 100644
--- a/core/safe_refcount.cpp
+++ b/core/safe_refcount.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/safe_refcount.h b/core/safe_refcount.h
index 940d31b2cb..f6b8f80271 100644
--- a/core/safe_refcount.h
+++ b/core/safe_refcount.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/script_debugger_local.cpp b/core/script_debugger_local.cpp
index 7093c3ebdb..ac4dafcf59 100644
--- a/core/script_debugger_local.cpp
+++ b/core/script_debugger_local.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/script_debugger_local.h b/core/script_debugger_local.h
index 1f7b5c590c..19151d4cb0 100644
--- a/core/script_debugger_local.h
+++ b/core/script_debugger_local.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/script_debugger_remote.cpp b/core/script_debugger_remote.cpp
index 621a94ab1a..ee6133f374 100644
--- a/core/script_debugger_remote.cpp
+++ b/core/script_debugger_remote.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -108,7 +108,7 @@ void ScriptDebuggerRemote::_put_variable(const String &p_name, const Variant &p_
}
int len = 0;
- Error err = encode_variant(var, NULL, len);
+ Error err = encode_variant(var, NULL, len, true);
if (err != OK)
ERR_PRINT("Failed to encode variant");
diff --git a/core/script_debugger_remote.h b/core/script_debugger_remote.h
index 5cd3a23a37..7afc90428d 100644
--- a/core/script_debugger_remote.h
+++ b/core/script_debugger_remote.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/script_language.cpp b/core/script_language.cpp
index 496521486e..632fa3b336 100644
--- a/core/script_language.cpp
+++ b/core/script_language.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -376,7 +376,7 @@ ScriptDebugger::ScriptDebugger() {
bool PlaceHolderScriptInstance::set(const StringName &p_name, const Variant &p_value) {
- if (build_failed)
+ if (script->is_placeholder_fallback_enabled())
return false;
if (values.has(p_name)) {
@@ -407,7 +407,7 @@ bool PlaceHolderScriptInstance::get(const StringName &p_name, Variant &r_ret) co
return true;
}
- if (!build_failed) {
+ if (!script->is_placeholder_fallback_enabled()) {
Variant defval;
if (script->get_property_default_value(p_name, defval)) {
r_ret = defval;
@@ -420,7 +420,7 @@ bool PlaceHolderScriptInstance::get(const StringName &p_name, Variant &r_ret) co
void PlaceHolderScriptInstance::get_property_list(List<PropertyInfo> *p_properties) const {
- if (build_failed) {
+ if (script->is_placeholder_fallback_enabled()) {
for (const List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) {
p_properties->push_back(E->get());
}
@@ -450,7 +450,7 @@ Variant::Type PlaceHolderScriptInstance::get_property_type(const StringName &p_n
void PlaceHolderScriptInstance::get_method_list(List<MethodInfo> *p_list) const {
- if (build_failed)
+ if (script->is_placeholder_fallback_enabled())
return;
if (script.is_valid()) {
@@ -459,7 +459,7 @@ void PlaceHolderScriptInstance::get_method_list(List<MethodInfo> *p_list) const
}
bool PlaceHolderScriptInstance::has_method(const StringName &p_method) const {
- if (build_failed)
+ if (script->is_placeholder_fallback_enabled())
return false;
if (script.is_valid()) {
@@ -470,8 +470,6 @@ bool PlaceHolderScriptInstance::has_method(const StringName &p_method) const {
void PlaceHolderScriptInstance::update(const List<PropertyInfo> &p_properties, const Map<StringName, Variant> &p_values) {
- build_failed = false;
-
Set<StringName> new_values;
for (const List<PropertyInfo>::Element *E = p_properties.front(); E; E = E->next()) {
@@ -517,7 +515,7 @@ void PlaceHolderScriptInstance::update(const List<PropertyInfo> &p_properties, c
void PlaceHolderScriptInstance::property_set_fallback(const StringName &p_name, const Variant &p_value, bool *r_valid) {
- if (build_failed) {
+ if (script->is_placeholder_fallback_enabled()) {
Map<StringName, Variant>::Element *E = values.find(p_name);
if (E) {
@@ -544,7 +542,7 @@ void PlaceHolderScriptInstance::property_set_fallback(const StringName &p_name,
Variant PlaceHolderScriptInstance::property_get_fallback(const StringName &p_name, bool *r_valid) {
- if (build_failed) {
+ if (script->is_placeholder_fallback_enabled()) {
const Map<StringName, Variant>::Element *E = values.find(p_name);
if (E) {
@@ -563,8 +561,7 @@ Variant PlaceHolderScriptInstance::property_get_fallback(const StringName &p_nam
PlaceHolderScriptInstance::PlaceHolderScriptInstance(ScriptLanguage *p_language, Ref<Script> p_script, Object *p_owner) :
owner(p_owner),
language(p_language),
- script(p_script),
- build_failed(false) {
+ script(p_script) {
}
PlaceHolderScriptInstance::~PlaceHolderScriptInstance() {
diff --git a/core/script_language.h b/core/script_language.h
index bcd9c2c5ea..b0f12dc291 100644
--- a/core/script_language.h
+++ b/core/script_language.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -128,6 +128,7 @@ public:
virtual MethodInfo get_method_info(const StringName &p_method) const = 0;
virtual bool is_tool() const = 0;
+ virtual bool is_valid() const = 0;
virtual ScriptLanguage *get_language() const = 0;
@@ -145,6 +146,8 @@ public:
virtual void get_constants(Map<StringName, Variant> *p_constants) {}
virtual void get_members(Set<StringName> *p_constants) {}
+ virtual bool is_placeholder_fallback_enabled() const { return false; }
+
Script() {}
};
@@ -333,8 +336,6 @@ class PlaceHolderScriptInstance : public ScriptInstance {
ScriptLanguage *language;
Ref<Script> script;
- bool build_failed;
-
public:
virtual bool set(const StringName &p_name, const Variant &p_value);
virtual bool get(const StringName &p_name, Variant &r_ret) const;
@@ -360,13 +361,10 @@ public:
void update(const List<PropertyInfo> &p_properties, const Map<StringName, Variant> &p_values); //likely changed in editor
- void set_build_failed(bool p_build_failed) { build_failed = p_build_failed; }
- bool get_build_failed() const { return build_failed; }
-
virtual bool is_placeholder() const { return true; }
- virtual void property_set_fallback(const StringName &p_name, const Variant &p_value, bool *r_valid);
- virtual Variant property_get_fallback(const StringName &p_name, bool *r_valid);
+ virtual void property_set_fallback(const StringName &p_name, const Variant &p_value, bool *r_valid = NULL);
+ virtual Variant property_get_fallback(const StringName &p_name, bool *r_valid = NULL);
virtual MultiplayerAPI::RPCMode get_rpc_mode(const StringName &p_method) const { return MultiplayerAPI::RPC_MODE_DISABLED; }
virtual MultiplayerAPI::RPCMode get_rset_mode(const StringName &p_variable) const { return MultiplayerAPI::RPC_MODE_DISABLED; }
diff --git a/core/self_list.h b/core/self_list.h
index 9a4ecdeef9..314d440977 100644
--- a/core/self_list.h
+++ b/core/self_list.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/set.h b/core/set.h
index 59aa54128e..81250068af 100644
--- a/core/set.h
+++ b/core/set.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/simple_type.h b/core/simple_type.h
index a645d03181..d5aa47d54f 100644
--- a/core/simple_type.h
+++ b/core/simple_type.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/sort.h b/core/sort.h
index e112304d1b..4da7c323c7 100644
--- a/core/sort.h
+++ b/core/sort.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/string_buffer.h b/core/string_buffer.h
index 38dce5e6bf..835991bc87 100644
--- a/core/string_buffer.h
+++ b/core/string_buffer.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/string_builder.cpp b/core/string_builder.cpp
index 8ab7e0ea8f..35526e0d70 100644
--- a/core/string_builder.cpp
+++ b/core/string_builder.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/string_builder.h b/core/string_builder.h
index 596b3bf730..40d70e8f45 100644
--- a/core/string_builder.h
+++ b/core/string_builder.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/string_db.cpp b/core/string_db.cpp
index a798df8795..c776c56023 100644
--- a/core/string_db.cpp
+++ b/core/string_db.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/string_db.h b/core/string_db.h
index 46bb77df93..06b24c28da 100644
--- a/core/string_db.h
+++ b/core/string_db.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/translation.cpp b/core/translation.cpp
index 25e67e9b96..a402df3eea 100644
--- a/core/translation.cpp
+++ b/core/translation.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/translation.h b/core/translation.h
index be626f4eb9..b12bad0d72 100644
--- a/core/translation.h
+++ b/core/translation.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/type_info.h b/core/type_info.h
index bf497f1e5f..c38688fea1 100644
--- a/core/type_info.h
+++ b/core/type_info.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/typedefs.h b/core/typedefs.h
index 5c15da9c2d..0005e5e6ee 100644
--- a/core/typedefs.h
+++ b/core/typedefs.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/ucaps.h b/core/ucaps.h
index 95bac1aac6..5dd81296dd 100644
--- a/core/ucaps.h
+++ b/core/ucaps.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/undo_redo.cpp b/core/undo_redo.cpp
index 6f7c8ea08a..6bc882eaec 100644
--- a/core/undo_redo.cpp
+++ b/core/undo_redo.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -268,7 +268,24 @@ void UndoRedo::_process_operation_list(List<Operation>::Element *E) {
case Operation::TYPE_METHOD: {
- obj->call(op.name, VARIANT_ARGS_FROM_ARRAY(op.args));
+ Vector<const Variant *> argptrs;
+ argptrs.resize(VARIANT_ARG_MAX);
+ int argc = 0;
+
+ for (int i = 0; i < VARIANT_ARG_MAX; i++) {
+ if (op.args[i].get_type() == Variant::NIL) {
+ break;
+ }
+ argptrs.write[i] = &op.args[i];
+ argc++;
+ }
+ argptrs.resize(argc);
+
+ Variant::CallError ce;
+ obj->call(op.name, (const Variant **)argptrs.ptr(), argc, ce);
+ if (ce.error != Variant::CallError::CALL_OK) {
+ ERR_PRINTS("Error calling method from signal '" + String(op.name) + "': " + Variant::get_call_error_text(obj, op.name, (const Variant **)argptrs.ptr(), argc, ce));
+ }
#ifdef TOOLS_ENABLED
Resource *res = Object::cast_to<Resource>(obj);
if (res)
@@ -325,7 +342,7 @@ bool UndoRedo::undo() {
return true;
}
-void UndoRedo::clear_history() {
+void UndoRedo::clear_history(bool p_increase_version) {
ERR_FAIL_COND(action_level > 0);
_discard_redo();
@@ -333,7 +350,8 @@ void UndoRedo::clear_history() {
while (actions.size())
_pop_history_tail();
- version++;
+ if (p_increase_version)
+ version++;
}
String UndoRedo::get_current_action_name() const {
@@ -493,7 +511,7 @@ void UndoRedo::_bind_methods() {
ClassDB::bind_method(D_METHOD("add_undo_property", "object", "property", "value"), &UndoRedo::add_undo_property);
ClassDB::bind_method(D_METHOD("add_do_reference", "object"), &UndoRedo::add_do_reference);
ClassDB::bind_method(D_METHOD("add_undo_reference", "object"), &UndoRedo::add_undo_reference);
- ClassDB::bind_method(D_METHOD("clear_history"), &UndoRedo::clear_history);
+ ClassDB::bind_method(D_METHOD("clear_history", "increase_version"), &UndoRedo::clear_history, DEFVAL(true));
ClassDB::bind_method(D_METHOD("get_current_action_name"), &UndoRedo::get_current_action_name);
ClassDB::bind_method(D_METHOD("get_version"), &UndoRedo::get_version);
ClassDB::bind_method(D_METHOD("redo"), &UndoRedo::redo);
diff --git a/core/undo_redo.h b/core/undo_redo.h
index 22dcd60472..4ee64dbfcf 100644
--- a/core/undo_redo.h
+++ b/core/undo_redo.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -112,7 +112,7 @@ public:
bool redo();
bool undo();
String get_current_action_name() const;
- void clear_history();
+ void clear_history(bool p_increase_version = true);
uint64_t get_version() const;
diff --git a/core/ustring.cpp b/core/ustring.cpp
index 3f017fa985..c1888c87a7 100644
--- a/core/ustring.cpp
+++ b/core/ustring.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -58,6 +58,9 @@
#define IS_DIGIT(m_d) ((m_d) >= '0' && (m_d) <= '9')
#define IS_HEX_DIGIT(m_d) (((m_d) >= '0' && (m_d) <= '9') || ((m_d) >= 'a' && (m_d) <= 'f') || ((m_d) >= 'A' && (m_d) <= 'F'))
+const char CharString::_null = 0;
+const CharType String::_null = 0;
+
bool is_symbol(CharType c) {
return c != '_' && ((c >= '!' && c <= '/') || (c >= ':' && c <= '@') || (c >= '[' && c <= '`') || (c >= '{' && c <= '~') || c == '\t' || c == ' ');
}
@@ -179,7 +182,7 @@ void String::copy_from_unchecked(const CharType *p_char, const int p_length) {
resize(p_length + 1);
set(p_length, 0);
- CharType *dst = &operator[](0);
+ CharType *dst = ptrw();
for (int i = 0; i < p_length; i++) {
dst[i] = p_char[i];
@@ -250,7 +253,7 @@ String &String::operator+=(const String &p_str) {
resize(length() + p_str.size());
const CharType *src = p_str.c_str();
- CharType *dst = &operator[](0);
+ CharType *dst = ptrw();
set(length(), 0);
@@ -289,7 +292,7 @@ String &String::operator+=(const char *p_str) {
resize(from + src_len + 1);
- CharType *dst = &operator[](0);
+ CharType *dst = ptrw();
set(length(), 0);
@@ -1431,7 +1434,7 @@ bool String::parse_utf8(const char *p_utf8, int p_len) {
}
resize(str_size + 1);
- CharType *dst = &operator[](0);
+ CharType *dst = ptrw();
dst[str_size] = 0;
while (cstr_size) {
@@ -2390,6 +2393,10 @@ int String::find(const char *p_str, int p_from) const {
return -1;
}
+int String::find_char(CharType p_char, int p_from) const {
+ return _cowdata.find(p_char, p_from);
+}
+
int String::findmk(const Vector<String> &p_keys, int p_from, int *r_key) const {
if (p_from < 0)
@@ -3060,7 +3067,7 @@ String String::lstrip(const String &p_chars) const {
for (beg = 0; beg < len; beg++) {
- if (p_chars.find(&ptr()[beg]) == -1)
+ if (p_chars.find_char(get(beg)) == -1)
break;
}
@@ -3077,7 +3084,7 @@ String String::rstrip(const String &p_chars) const {
for (end = len - 1; end >= 0; end--) {
- if (p_chars.find(&ptr()[end]) == -1)
+ if (p_chars.find_char(get(end)) == -1)
break;
}
@@ -3476,7 +3483,7 @@ String String::xml_unescape() const {
if (len == 0)
return String();
str.resize(len + 1);
- _xml_unescape(c_str(), l, &str[0]);
+ _xml_unescape(c_str(), l, str.ptrw());
str[len] = 0;
return str;
}
@@ -3578,9 +3585,12 @@ bool String::is_valid_integer() const {
bool String::is_valid_hex_number(bool p_with_prefix) const {
- int from = 0;
int len = length();
+ if (len == 0)
+ return false;
+
+ int from = 0;
if (len != 1 && (operator[](0) == '+' || operator[](0) == '-'))
from++;
diff --git a/core/ustring.h b/core/ustring.h
index d2766ec7a3..5ec5c79e2d 100644
--- a/core/ustring.h
+++ b/core/ustring.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -40,9 +40,44 @@
@author Juan Linietsky <reduzio@gmail.com>
*/
+template <class T>
+class CharProxy {
+ friend class CharString;
+ friend class String;
+
+ const int _index;
+ CowData<T> &_cowdata;
+ static const T _null = 0;
+
+ _FORCE_INLINE_ CharProxy(const int &p_index, CowData<T> &cowdata) :
+ _index(p_index),
+ _cowdata(cowdata) {}
+
+public:
+ _FORCE_INLINE_ operator T() const {
+ if (unlikely(_index == _cowdata.size()))
+ return _null;
+
+ return _cowdata.get(_index);
+ }
+
+ _FORCE_INLINE_ const T *operator&() const {
+ return _cowdata.ptr() + _index;
+ }
+
+ _FORCE_INLINE_ void operator=(const T &other) const {
+ _cowdata.set(_index, other);
+ }
+
+ _FORCE_INLINE_ void operator=(const CharProxy<T> &other) const {
+ _cowdata.set(_index, other.operator T());
+ }
+};
+
class CharString {
CowData<char> _cowdata;
+ static const char _null;
public:
_FORCE_INLINE_ char *ptrw() { return _cowdata.ptrw(); }
@@ -53,8 +88,13 @@ public:
_FORCE_INLINE_ char get(int p_index) { return _cowdata.get(p_index); }
_FORCE_INLINE_ const char get(int p_index) const { return _cowdata.get(p_index); }
_FORCE_INLINE_ void set(int p_index, const char &p_elem) { _cowdata.set(p_index, p_elem); }
- _FORCE_INLINE_ char &operator[](int p_index) { return _cowdata.get_m(p_index); }
- _FORCE_INLINE_ const char &operator[](int p_index) const { return _cowdata.get(p_index); }
+ _FORCE_INLINE_ const char &operator[](int p_index) const {
+ if (unlikely(p_index == _cowdata.size()))
+ return _null;
+
+ return _cowdata.get(p_index);
+ }
+ _FORCE_INLINE_ CharProxy<char> operator[](int p_index) { return CharProxy<char>(p_index, _cowdata); }
_FORCE_INLINE_ CharString() {}
_FORCE_INLINE_ CharString(const CharString &p_str) { _cowdata._ref(p_str._cowdata); }
@@ -63,7 +103,7 @@ public:
CharString &operator+=(char p_char);
int length() const { return size() ? size() - 1 : 0; }
const char *get_data() const;
- operator const char *() { return get_data(); };
+ operator const char *() const { return get_data(); };
};
typedef wchar_t CharType;
@@ -82,6 +122,7 @@ struct StrRange {
class String {
CowData<CharType> _cowdata;
+ static const CharType _null;
void copy_from(const char *p_cstr);
void copy_from(const CharType *p_cstr, const int p_clip_to = -1);
@@ -107,8 +148,14 @@ public:
_FORCE_INLINE_ void set(int p_index, const CharType &p_elem) { _cowdata.set(p_index, p_elem); }
_FORCE_INLINE_ int size() const { return _cowdata.size(); }
Error resize(int p_size) { return _cowdata.resize(p_size); }
- _FORCE_INLINE_ CharType &operator[](int p_index) { return _cowdata.get_m(p_index); }
- _FORCE_INLINE_ const CharType &operator[](int p_index) const { return _cowdata.get(p_index); }
+
+ _FORCE_INLINE_ const CharType &operator[](int p_index) const {
+ if (unlikely(p_index == _cowdata.size()))
+ return _null;
+
+ return _cowdata.get(p_index);
+ }
+ _FORCE_INLINE_ CharProxy<CharType> operator[](int p_index) { return CharProxy<CharType>(p_index, _cowdata); }
bool operator==(const String &p_str) const;
bool operator!=(const String &p_str) const;
@@ -149,7 +196,8 @@ public:
/* complex helpers */
String substr(int p_from, int p_chars) const;
int find(const String &p_str, int p_from = 0) const; ///< return <0 if failed
- int find(const char *p_str, int p_from) const; ///< return <0 if failed
+ int find(const char *p_str, int p_from = 0) const; ///< return <0 if failed
+ int find_char(CharType p_char, int p_from = 0) const; ///< return <0 if failed
int find_last(const String &p_str) const; ///< return <0 if failed
int findn(const String &p_str, int p_from = 0) const; ///< return <0 if failed, case insensitive
int rfind(const String &p_str, int p_from = -1) const; ///< return <0 if failed
diff --git a/core/variant.cpp b/core/variant.cpp
index edbe66ba31..8b2051add7 100644
--- a/core/variant.cpp
+++ b/core/variant.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -1662,7 +1662,17 @@ Variant::operator Transform() const {
return Transform(*_data._basis, Vector3());
else if (type == QUAT)
return Transform(Basis(*reinterpret_cast<const Quat *>(_data._mem)), Vector3());
- else
+ else if (type == TRANSFORM2D) {
+ const Transform2D &t = *_data._transform2d;
+ Transform m;
+ m.basis.elements[0][0] = t.elements[0][0];
+ m.basis.elements[1][0] = t.elements[0][1];
+ m.basis.elements[0][1] = t.elements[1][0];
+ m.basis.elements[1][1] = t.elements[1][1];
+ m.origin[0] = t.elements[2][0];
+ m.origin[1] = t.elements[2][1];
+ return m;
+ } else
return Transform();
}
diff --git a/core/variant.h b/core/variant.h
index 8953217760..0377c78ea8 100644
--- a/core/variant.h
+++ b/core/variant.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/variant_call.cpp b/core/variant_call.cpp
index 8e363cd535..f6f4569dfa 100644
--- a/core/variant_call.cpp
+++ b/core/variant_call.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -291,6 +291,7 @@ struct _VariantCall {
VCALL_LOCALMEM0R(String, is_valid_identifier);
VCALL_LOCALMEM0R(String, is_valid_integer);
VCALL_LOCALMEM0R(String, is_valid_float);
+ VCALL_LOCALMEM1R(String, is_valid_hex_number);
VCALL_LOCALMEM0R(String, is_valid_html_color);
VCALL_LOCALMEM0R(String, is_valid_ip_address);
VCALL_LOCALMEM0R(String, to_int);
@@ -484,6 +485,7 @@ struct _VariantCall {
VCALL_LOCALMEM0R(Dictionary, keys);
VCALL_LOCALMEM0R(Dictionary, values);
VCALL_LOCALMEM1R(Dictionary, duplicate);
+ VCALL_LOCALMEM2R(Dictionary, get);
VCALL_LOCALMEM2(Array, set);
VCALL_LOCALMEM1R(Array, get);
@@ -1533,6 +1535,7 @@ void register_variant_methods() {
ADDFUNC0R(STRING, BOOL, String, is_valid_identifier, varray());
ADDFUNC0R(STRING, BOOL, String, is_valid_integer, varray());
ADDFUNC0R(STRING, BOOL, String, is_valid_float, varray());
+ ADDFUNC1R(STRING, BOOL, String, is_valid_hex_number, BOOL, "with_prefix", varray(false));
ADDFUNC0R(STRING, BOOL, String, is_valid_html_color, varray());
ADDFUNC0R(STRING, BOOL, String, is_valid_ip_address, varray());
ADDFUNC0R(STRING, INT, String, to_int, varray());
@@ -1677,6 +1680,7 @@ void register_variant_methods() {
ADDFUNC0R(DICTIONARY, ARRAY, Dictionary, keys, varray());
ADDFUNC0R(DICTIONARY, ARRAY, Dictionary, values, varray());
ADDFUNC1R(DICTIONARY, DICTIONARY, Dictionary, duplicate, BOOL, "deep", varray(false));
+ ADDFUNC2R(DICTIONARY, NIL, Dictionary, get, NIL, "key", NIL, "default", varray(Variant()));
ADDFUNC0R(ARRAY, INT, Array, size, varray());
ADDFUNC0R(ARRAY, BOOL, Array, empty, varray());
diff --git a/core/variant_construct_string.cpp b/core/variant_construct_string.cpp
index 2250c03f3d..2cb7481634 100644
--- a/core/variant_construct_string.cpp
+++ b/core/variant_construct_string.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/variant_op.cpp b/core/variant_op.cpp
index d193858966..93654d3389 100644
--- a/core/variant_op.cpp
+++ b/core/variant_op.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -2149,7 +2149,7 @@ void Variant::set(const Variant &p_index, const Variant &p_value, bool *r_valid)
int idx = p_index;
if (idx < 0)
idx += 4;
- if (idx >= 0 || idx < 4) {
+ if (idx >= 0 && idx < 4) {
Color *v = reinterpret_cast<Color *>(_data._mem);
(*v)[idx] = p_value;
valid = true;
@@ -2524,7 +2524,7 @@ Variant Variant::get(const Variant &p_index, bool *r_valid) const {
int idx = p_index;
if (idx < 0)
idx += 4;
- if (idx >= 0 || idx < 4) {
+ if (idx >= 0 && idx < 4) {
const Color *v = reinterpret_cast<const Color *>(_data._mem);
valid = true;
return (*v)[idx];
diff --git a/core/variant_parser.cpp b/core/variant_parser.cpp
index 3d5ae74e92..84fb85e812 100644
--- a/core/variant_parser.cpp
+++ b/core/variant_parser.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/variant_parser.h b/core/variant_parser.h
index 531c1d59cd..ac4c96a8de 100644
--- a/core/variant_parser.h
+++ b/core/variant_parser.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -45,7 +45,8 @@ public:
CharType saved;
- Stream() { saved = 0; }
+ Stream() :
+ saved(0) {}
virtual ~Stream() {}
};
diff --git a/core/vector.h b/core/vector.h
index 38a1082407..90b3d90826 100644
--- a/core/vector.h
+++ b/core/vector.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -44,17 +44,11 @@
template <class T>
class VectorWriteProxy {
- friend class Vector<T>;
- CowData<T> *_parent;
-
- _FORCE_INLINE_ VectorWriteProxy(CowData<T> *parent) :
- _parent(parent){};
-
public:
_FORCE_INLINE_ T &operator[](int p_index) {
- CRASH_BAD_INDEX(p_index, _parent->size());
+ CRASH_BAD_INDEX(p_index, ((Vector<T> *)(this))->_cowdata.size());
- return _parent->ptrw()[p_index];
+ return ((Vector<T> *)(this))->_cowdata.ptrw()[p_index];
}
};
@@ -62,39 +56,42 @@ template <class T>
class Vector {
friend class VectorWriteProxy<T>;
- CowData<T> *_cowdata;
-
public:
VectorWriteProxy<T> write;
+private:
+ CowData<T> _cowdata;
+
+public:
bool push_back(const T &p_elem);
- void remove(int p_index) { _cowdata->remove(p_index); }
+ void remove(int p_index) { _cowdata.remove(p_index); }
void erase(const T &p_val) {
int idx = find(p_val);
if (idx >= 0) remove(idx);
};
void invert();
- _FORCE_INLINE_ T *ptrw() { return _cowdata->ptrw(); }
- _FORCE_INLINE_ const T *ptr() const { return _cowdata->ptr(); }
+ _FORCE_INLINE_ T *ptrw() { return _cowdata.ptrw(); }
+ _FORCE_INLINE_ const T *ptr() const { return _cowdata.ptr(); }
_FORCE_INLINE_ void clear() { resize(0); }
- _FORCE_INLINE_ bool empty() const { return _cowdata->empty(); }
+ _FORCE_INLINE_ bool empty() const { return _cowdata.empty(); }
- _FORCE_INLINE_ T get(int p_index) { return _cowdata->get(p_index); }
- _FORCE_INLINE_ const T get(int p_index) const { return _cowdata->get(p_index); }
- _FORCE_INLINE_ void set(int p_index, const T &p_elem) { _cowdata->set(p_index, p_elem); }
- _FORCE_INLINE_ int size() const { return _cowdata->size(); }
- Error resize(int p_size) { return _cowdata->resize(p_size); }
- _FORCE_INLINE_ const T &operator[](int p_index) const { return _cowdata->get(p_index); }
- Error insert(int p_pos, const T &p_val) { return _cowdata->insert(p_pos, p_val); }
+ _FORCE_INLINE_ T get(int p_index) { return _cowdata.get(p_index); }
+ _FORCE_INLINE_ const T get(int p_index) const { return _cowdata.get(p_index); }
+ _FORCE_INLINE_ void set(int p_index, const T &p_elem) { _cowdata.set(p_index, p_elem); }
+ _FORCE_INLINE_ int size() const { return _cowdata.size(); }
+ Error resize(int p_size) { return _cowdata.resize(p_size); }
+ _FORCE_INLINE_ const T &operator[](int p_index) const { return _cowdata.get(p_index); }
+ Error insert(int p_pos, const T &p_val) { return _cowdata.insert(p_pos, p_val); }
+ int find(const T &p_val, int p_from = 0) const { return _cowdata.find(p_val, p_from); }
void append_array(const Vector<T> &p_other);
template <class C>
void sort_custom() {
- int len = _cowdata->size();
+ int len = _cowdata.size();
if (len == 0)
return;
@@ -110,7 +107,7 @@ public:
void ordered_insert(const T &p_val) {
int i;
- for (i = 0; i < _cowdata->size(); i++) {
+ for (i = 0; i < _cowdata.size(); i++) {
if (p_val < operator[](i)) {
break;
@@ -119,36 +116,14 @@ public:
insert(i, p_val);
}
- int find(const T &p_val, int p_from = 0) const {
- int ret = -1;
- if (p_from < 0 || size() == 0)
- return ret;
-
- for (int i = p_from; i < size(); i++) {
-
- if (ptr()[i] == p_val) {
- ret = i;
- break;
- };
- };
-
- return ret;
- }
-
- _FORCE_INLINE_ Vector() :
- _cowdata(new CowData<T>()),
- write(VectorWriteProxy<T>(_cowdata)) {}
- _FORCE_INLINE_ Vector(const Vector &p_from) :
- _cowdata(new CowData<T>()),
- write(VectorWriteProxy<T>(_cowdata)) { _cowdata->_ref(p_from._cowdata); }
+ _FORCE_INLINE_ Vector() {}
+ _FORCE_INLINE_ Vector(const Vector &p_from) { _cowdata._ref(p_from._cowdata); }
inline Vector &operator=(const Vector &p_from) {
- _cowdata->_ref(p_from._cowdata);
+ _cowdata._ref(p_from._cowdata);
return *this;
}
- _FORCE_INLINE_ ~Vector() {
- delete _cowdata;
- }
+ _FORCE_INLINE_ ~Vector() {}
};
template <class T>
diff --git a/core/version.h b/core/version.h
index 2a3a282d82..46eecf6125 100644
--- a/core/version.h
+++ b/core/version.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/vmap.h b/core/vmap.h
index 5f6d8190c6..f46ed70a0f 100644
--- a/core/vmap.h
+++ b/core/vmap.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/core/vset.h b/core/vset.h
index 9ec329b45f..678ec507ba 100644
--- a/core/vset.h
+++ b/core/vset.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/doc/Doxyfile b/doc/Doxyfile
index c1904f17c9..a7aa204741 100644
--- a/doc/Doxyfile
+++ b/doc/Doxyfile
@@ -38,7 +38,7 @@ PROJECT_NAME = Godot
# could be handy for archiving the generated documentation or if some version
# control system is used.
-PROJECT_NUMBER =
+PROJECT_NUMBER =
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
@@ -162,7 +162,7 @@ FULL_PATH_NAMES = YES
# will be relative from the directory where doxygen is started.
# This tag requires that the tag FULL_PATH_NAMES is set to YES.
-STRIP_FROM_PATH =
+STRIP_FROM_PATH =
# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
# path mentioned in the documentation of a class, which tells the reader which
@@ -171,7 +171,7 @@ STRIP_FROM_PATH =
# specify the list of include paths that are normally passed to the compiler
# using the -I flag.
-STRIP_FROM_INC_PATH =
+STRIP_FROM_INC_PATH =
# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
# less readable) file names. This can be useful is your file systems doesn't
@@ -238,13 +238,13 @@ TAB_SIZE = 4
# "Side Effects:". You can put \n's in the value part of an alias to insert
# newlines.
-ALIASES =
+ALIASES =
# This tag can be used to specify a number of word-keyword mappings (TCL only).
# A mapping has the form "name=value". For example adding "class=itcl::class"
# will allow you to use the command class in the itcl::class meaning.
-TCL_SUBST =
+TCL_SUBST =
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
# only. Doxygen will then generate output that is more tailored for C. For
@@ -291,7 +291,7 @@ OPTIMIZE_OUTPUT_VHDL = NO
# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
# the files are not read by doxygen.
-EXTENSION_MAPPING =
+EXTENSION_MAPPING =
# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
# according to the Markdown format, which allows for more readable
@@ -632,7 +632,7 @@ GENERATE_DEPRECATEDLIST= YES
# sections, marked by \if <section_label> ... \endif and \cond <section_label>
# ... \endcond blocks.
-ENABLED_SECTIONS =
+ENABLED_SECTIONS =
# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
# initial value of a variable or macro / define can have for it to appear in the
@@ -674,7 +674,7 @@ SHOW_NAMESPACES = YES
# by doxygen. Whatever the program writes to standard output is used as the file
# version. For an example see the documentation.
-FILE_VERSION_FILTER =
+FILE_VERSION_FILTER =
# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
# by doxygen. The layout file controls the global structure of the generated
@@ -687,7 +687,7 @@ FILE_VERSION_FILTER =
# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
# tag is left empty.
-LAYOUT_FILE =
+LAYOUT_FILE =
# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
# the reference definitions. This must be a list of .bib files. The .bib
@@ -697,7 +697,7 @@ LAYOUT_FILE =
# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
# search path. See also \cite for info how to create references.
-CITE_BIB_FILES =
+CITE_BIB_FILES =
#---------------------------------------------------------------------------
# Configuration options related to warning and progress messages
@@ -756,7 +756,7 @@ WARN_FORMAT = "$file:$line: $text"
# messages should be written. If left blank the output is written to standard
# error (stderr).
-WARN_LOGFILE =
+WARN_LOGFILE =
#---------------------------------------------------------------------------
# Configuration options related to the input files
@@ -844,7 +844,7 @@ RECURSIVE = YES
# Note that relative paths are relative to the directory from which doxygen is
# run.
-EXCLUDE =
+EXCLUDE =
# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
# directories that are symbolic links (a Unix file system feature) are excluded
@@ -860,7 +860,7 @@ EXCLUDE_SYMLINKS = NO
# Note that the wildcards are matched against the file with absolute path, so to
# exclude all test directories for example use the pattern */test/*
-EXCLUDE_PATTERNS =
+EXCLUDE_PATTERNS =
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
# (namespaces, classes, functions, etc.) that should be excluded from the
@@ -871,13 +871,13 @@ EXCLUDE_PATTERNS =
# Note that the wildcards are matched against the file with absolute path, so to
# exclude all test directories use the pattern */test/*
-EXCLUDE_SYMBOLS =
+EXCLUDE_SYMBOLS =
# The EXAMPLE_PATH tag can be used to specify one or more files or directories
# that contain example code fragments that are included (see the \include
# command).
-EXAMPLE_PATH =
+EXAMPLE_PATH =
# If the value of the EXAMPLE_PATH tag contains directories, you can use the
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
@@ -897,7 +897,7 @@ EXAMPLE_RECURSIVE = NO
# that contain images that are to be included in the documentation (see the
# \image command).
-IMAGE_PATH =
+IMAGE_PATH =
# The INPUT_FILTER tag can be used to specify a program that doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
@@ -914,7 +914,7 @@ IMAGE_PATH =
# code is scanned, but not when the output code is generated. If lines are added
# or removed, the anchors will not be placed correctly.
-INPUT_FILTER =
+INPUT_FILTER =
# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
# basis. Doxygen will compare the file name with each pattern and apply the
@@ -923,7 +923,7 @@ INPUT_FILTER =
# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
# patterns match the file name, INPUT_FILTER is applied.
-FILTER_PATTERNS =
+FILTER_PATTERNS =
# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
# INPUT_FILTER) will also be used to filter the input files that are used for
@@ -938,7 +938,7 @@ FILTER_SOURCE_FILES = NO
# *.ext= (so without naming a filter).
# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
-FILTER_SOURCE_PATTERNS =
+FILTER_SOURCE_PATTERNS =
# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
# is part of the input, its contents will be placed on the main page
@@ -1050,7 +1050,7 @@ CLANG_ASSISTED_PARSING = NO
# specified with INPUT and INCLUDE_PATH.
# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
-CLANG_OPTIONS =
+CLANG_OPTIONS =
#---------------------------------------------------------------------------
# Configuration options related to the alphabetical class index
@@ -1076,7 +1076,7 @@ COLS_IN_ALPHA_INDEX = 5
# while generating the index headers.
# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-IGNORE_PREFIX =
+IGNORE_PREFIX =
#---------------------------------------------------------------------------
# Configuration options related to the HTML output
@@ -1120,7 +1120,7 @@ HTML_FILE_EXTENSION = .html
# of the possible markers and block names see the documentation.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_HEADER =
+HTML_HEADER =
# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
# generated HTML page. If the tag is left blank doxygen will generate a standard
@@ -1130,7 +1130,7 @@ HTML_HEADER =
# that doxygen normally uses.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_FOOTER =
+HTML_FOOTER =
# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
# sheet that is used by each HTML page. It can be used to fine-tune the look of
@@ -1142,7 +1142,7 @@ HTML_FOOTER =
# obsolete.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_STYLESHEET =
+HTML_STYLESHEET =
# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
# cascading style sheets that are included after the standard style sheets
@@ -1155,7 +1155,7 @@ HTML_STYLESHEET =
# list). For an example see the documentation.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_EXTRA_STYLESHEET =
+HTML_EXTRA_STYLESHEET =
# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
# other source files which should be copied to the HTML output directory. Note
@@ -1165,7 +1165,7 @@ HTML_EXTRA_STYLESHEET =
# files will be copied as-is; there are no commands or markers available.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_EXTRA_FILES =
+HTML_EXTRA_FILES =
# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
# will adjust the colors in the style sheet and background images according to
@@ -1293,7 +1293,7 @@ GENERATE_HTMLHELP = NO
# written to the html output directory.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-CHM_FILE =
+CHM_FILE =
# The HHC_LOCATION tag can be used to specify the location (absolute path
# including file name) of the HTML help compiler (hhc.exe). If non-empty,
@@ -1301,7 +1301,7 @@ CHM_FILE =
# The file has to be specified with full path.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-HHC_LOCATION =
+HHC_LOCATION =
# The GENERATE_CHI flag controls if a separate .chi index file is generated
# (YES) or that it should be included in the master .chm file (NO).
@@ -1314,7 +1314,7 @@ GENERATE_CHI = NO
# and project file content.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-CHM_INDEX_ENCODING =
+CHM_INDEX_ENCODING =
# The BINARY_TOC flag controls whether a binary table of contents is generated
# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
@@ -1345,7 +1345,7 @@ GENERATE_QHP = NO
# the HTML output folder.
# This tag requires that the tag GENERATE_QHP is set to YES.
-QCH_FILE =
+QCH_FILE =
# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
# Project output. For more information please see Qt Help Project / Namespace
@@ -1370,7 +1370,7 @@ QHP_VIRTUAL_FOLDER = doc
# filters).
# This tag requires that the tag GENERATE_QHP is set to YES.
-QHP_CUST_FILTER_NAME =
+QHP_CUST_FILTER_NAME =
# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
# custom filter to add. For more information please see Qt Help Project / Custom
@@ -1378,21 +1378,21 @@ QHP_CUST_FILTER_NAME =
# filters).
# This tag requires that the tag GENERATE_QHP is set to YES.
-QHP_CUST_FILTER_ATTRS =
+QHP_CUST_FILTER_ATTRS =
# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
# project's filter section matches. Qt Help Project / Filter Attributes (see:
# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
# This tag requires that the tag GENERATE_QHP is set to YES.
-QHP_SECT_FILTER_ATTRS =
+QHP_SECT_FILTER_ATTRS =
# The QHG_LOCATION tag can be used to specify the location of Qt's
# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
# generated .qhp file.
# This tag requires that the tag GENERATE_QHP is set to YES.
-QHG_LOCATION =
+QHG_LOCATION =
# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
# generated, together with the HTML files, they form an Eclipse help plugin. To
@@ -1525,7 +1525,7 @@ MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
# This tag requires that the tag USE_MATHJAX is set to YES.
-MATHJAX_EXTENSIONS =
+MATHJAX_EXTENSIONS =
# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
# of code that will be used on startup of the MathJax code. See the MathJax site
@@ -1533,7 +1533,7 @@ MATHJAX_EXTENSIONS =
# example see the documentation.
# This tag requires that the tag USE_MATHJAX is set to YES.
-MATHJAX_CODEFILE =
+MATHJAX_CODEFILE =
# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
# the HTML output. The underlying search engine uses javascript and DHTML and
@@ -1593,7 +1593,7 @@ EXTERNAL_SEARCH = NO
# Searching" for details.
# This tag requires that the tag SEARCHENGINE is set to YES.
-SEARCHENGINE_URL =
+SEARCHENGINE_URL =
# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
# search data is written to a file for indexing by an external tool. With the
@@ -1609,7 +1609,7 @@ SEARCHDATA_FILE = searchdata.xml
# projects and redirect the results back to the right project.
# This tag requires that the tag SEARCHENGINE is set to YES.
-EXTERNAL_SEARCH_ID =
+EXTERNAL_SEARCH_ID =
# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
# projects other than the one defined by this configuration file, but that are
@@ -1619,7 +1619,7 @@ EXTERNAL_SEARCH_ID =
# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
# This tag requires that the tag SEARCHENGINE is set to YES.
-EXTRA_SEARCH_MAPPINGS =
+EXTRA_SEARCH_MAPPINGS =
#---------------------------------------------------------------------------
# Configuration options related to the LaTeX output
@@ -1680,7 +1680,7 @@ PAPER_TYPE = a4
# If left blank no extra packages will be included.
# This tag requires that the tag GENERATE_LATEX is set to YES.
-EXTRA_PACKAGES =
+EXTRA_PACKAGES =
# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
# generated LaTeX document. The header should contain everything until the first
@@ -1696,7 +1696,7 @@ EXTRA_PACKAGES =
# to HTML_HEADER.
# This tag requires that the tag GENERATE_LATEX is set to YES.
-LATEX_HEADER =
+LATEX_HEADER =
# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
# generated LaTeX document. The footer should contain everything after the last
@@ -1707,7 +1707,7 @@ LATEX_HEADER =
# Note: Only use a user-defined footer if you know what you are doing!
# This tag requires that the tag GENERATE_LATEX is set to YES.
-LATEX_FOOTER =
+LATEX_FOOTER =
# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
# LaTeX style sheets that are included after the standard style sheets created
@@ -1718,7 +1718,7 @@ LATEX_FOOTER =
# list).
# This tag requires that the tag GENERATE_LATEX is set to YES.
-LATEX_EXTRA_STYLESHEET =
+LATEX_EXTRA_STYLESHEET =
# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
# other source files which should be copied to the LATEX_OUTPUT output
@@ -1726,7 +1726,7 @@ LATEX_EXTRA_STYLESHEET =
# markers available.
# This tag requires that the tag GENERATE_LATEX is set to YES.
-LATEX_EXTRA_FILES =
+LATEX_EXTRA_FILES =
# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
@@ -1826,14 +1826,14 @@ RTF_HYPERLINKS = NO
# default style sheet that doxygen normally uses.
# This tag requires that the tag GENERATE_RTF is set to YES.
-RTF_STYLESHEET_FILE =
+RTF_STYLESHEET_FILE =
# Set optional variables used in the generation of an RTF document. Syntax is
# similar to doxygen's config file. A template extensions file can be generated
# using doxygen -e rtf extensionFile.
# This tag requires that the tag GENERATE_RTF is set to YES.
-RTF_EXTENSIONS_FILE =
+RTF_EXTENSIONS_FILE =
# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
# with syntax highlighting in the RTF output.
@@ -1878,7 +1878,7 @@ MAN_EXTENSION = .3
# MAN_EXTENSION with the initial . removed.
# This tag requires that the tag GENERATE_MAN is set to YES.
-MAN_SUBDIR =
+MAN_SUBDIR =
# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
# will generate one additional man file for each entity documented in the real
@@ -1991,7 +1991,7 @@ PERLMOD_PRETTY = YES
# overwrite each other's variables.
# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-PERLMOD_MAKEVAR_PREFIX =
+PERLMOD_MAKEVAR_PREFIX =
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
@@ -2032,7 +2032,7 @@ SEARCH_INCLUDES = YES
# preprocessor.
# This tag requires that the tag SEARCH_INCLUDES is set to YES.
-INCLUDE_PATH =
+INCLUDE_PATH =
# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
# patterns (like *.h and *.hpp) to filter out the header-files in the
@@ -2040,7 +2040,7 @@ INCLUDE_PATH =
# used.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-INCLUDE_FILE_PATTERNS =
+INCLUDE_FILE_PATTERNS =
# The PREDEFINED tag can be used to specify one or more macro names that are
# defined before the preprocessor is started (similar to the -D option of e.g.
@@ -2050,7 +2050,7 @@ INCLUDE_FILE_PATTERNS =
# recursively expanded use the := operator instead of the = operator.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-PREDEFINED =
+PREDEFINED =
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
# tag can be used to specify a list of macro names that should be expanded. The
@@ -2059,7 +2059,7 @@ PREDEFINED =
# definition found in the source code.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-EXPAND_AS_DEFINED =
+EXPAND_AS_DEFINED =
# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
# remove all references to function-like macros that are alone on a line, have
@@ -2088,13 +2088,13 @@ SKIP_FUNCTION_MACROS = YES
# the path). If a tag file is not located in the directory in which doxygen is
# run, you must also specify the path to the tagfile here.
-TAGFILES =
+TAGFILES =
# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
# tag file that is based on the input files it reads. See section "Linking to
# external documentation" for more information about the usage of tag files.
-GENERATE_TAGFILE =
+GENERATE_TAGFILE =
# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
# the class index. If set to NO, only the inherited external classes will be
@@ -2143,14 +2143,14 @@ CLASS_DIAGRAMS = YES
# the mscgen tool resides. If left empty the tool is assumed to be found in the
# default search path.
-MSCGEN_PATH =
+MSCGEN_PATH =
# You can include diagrams made with dia in doxygen documentation. Doxygen will
# then run dia to produce the diagram and insert it in the documentation. The
# DIA_PATH tag allows you to specify the directory where the dia binary resides.
# If left empty dia is assumed to be found in the default search path.
-DIA_PATH =
+DIA_PATH =
# If set to YES the inheritance and collaboration graphs will hide inheritance
# and usage relations if the target is undocumented or is not a class.
@@ -2199,7 +2199,7 @@ DOT_FONTSIZE = 10
# the path where dot can find it using this tag.
# This tag requires that the tag HAVE_DOT is set to YES.
-DOT_FONTPATH =
+DOT_FONTPATH =
# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
# each documented class showing the direct and indirect inheritance relations.
@@ -2337,26 +2337,26 @@ INTERACTIVE_SVG = NO
# found. If left blank, it is assumed the dot tool can be found in the path.
# This tag requires that the tag HAVE_DOT is set to YES.
-DOT_PATH =
+DOT_PATH =
# The DOTFILE_DIRS tag can be used to specify one or more directories that
# contain dot files that are included in the documentation (see the \dotfile
# command).
# This tag requires that the tag HAVE_DOT is set to YES.
-DOTFILE_DIRS =
+DOTFILE_DIRS =
# The MSCFILE_DIRS tag can be used to specify one or more directories that
# contain msc files that are included in the documentation (see the \mscfile
# command).
-MSCFILE_DIRS =
+MSCFILE_DIRS =
# The DIAFILE_DIRS tag can be used to specify one or more directories that
# contain dia files that are included in the documentation (see the \diafile
# command).
-DIAFILE_DIRS =
+DIAFILE_DIRS =
# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
# path where java can find the plantuml.jar file. If left blank, it is assumed
@@ -2364,12 +2364,12 @@ DIAFILE_DIRS =
# generate a warning when it encounters a \startuml command in this case and
# will not generate output for the diagram.
-PLANTUML_JAR_PATH =
+PLANTUML_JAR_PATH =
# When using plantuml, the specified paths are searched for files specified by
# the !include statement in a plantuml block.
-PLANTUML_INCLUDE_PATH =
+PLANTUML_INCLUDE_PATH =
# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
# that will be shown in the graph. If the number of nodes in a graph becomes
diff --git a/doc/Makefile b/doc/Makefile
index 2f9fefe794..7f3f7ea939 100644
--- a/doc/Makefile
+++ b/doc/Makefile
@@ -24,5 +24,5 @@ rst:
rm -rf $(OUTPUTDIR)/rst
mkdir -p $(OUTPUTDIR)/rst
pushd $(OUTPUTDIR)/rst
- python $(TOOLSDIR)/makerst.py $(CLASSES)
+ python3 $(TOOLSDIR)/makerst.py $(CLASSES)
popd
diff --git a/doc/classes/@GDScript.xml b/doc/classes/@GDScript.xml
index 20ec9141c6..072eec800f 100644
--- a/doc/classes/@GDScript.xml
+++ b/doc/classes/@GDScript.xml
@@ -127,7 +127,7 @@
<description>
Returns the arc tangent of [code]y/x[/code] in radians. Use to get the angle of tangent [code]y/x[/code]. To compute the value, the method takes into account the sign of both arguments in order to determine the quadrant.
[codeblock]
- a = atan(0,-1) # a is 3.141593
+ a = atan(0, -1) # a is 3.141593
[/codeblock]
</description>
</method>
@@ -175,7 +175,7 @@
# a is 'A'
a = char(65)
# a is 'a'
- a = char(65+32)
+ a = char(65 + 32)
[/codeblock]
</description>
</method>
@@ -230,7 +230,7 @@
Returns the cosine of angle [code]s[/code] in radians.
[codeblock]
# prints 1 and -1
- print(cos(PI*2))
+ print(cos(PI * 2))
print(cos(PI))
[/codeblock]
</description>
@@ -415,6 +415,21 @@
<return type="Array">
</return>
<description>
+ Returns an array of dictionaries representing the current call stack.
+ [codeblock]
+ func _ready():
+ foo()
+
+ func foo():
+ bar()
+
+ func bar():
+ print(get_stack())
+ [/codeblock]
+ would print
+ [codeblock]
+ [{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]
+ [/codeblock]
</description>
</method>
<method name="hash">
@@ -488,7 +503,7 @@
<argument index="0" name="s" type="float">
</argument>
<description>
- Returns True/False whether [code]s[/code] is an infinity value (either positive infinity or negative infinity).
+ Returns whether [code]s[/code] is an infinity value (either positive infinity or negative infinity).
</description>
</method>
<method name="is_instance_valid">
@@ -497,6 +512,7 @@
<argument index="0" name="instance" type="Object">
</argument>
<description>
+ Returns whether [code]instance[/code] is a valid object (e.g. has not been deleted from memory).
</description>
</method>
<method name="is_nan">
@@ -505,7 +521,7 @@
<argument index="0" name="s" type="float">
</argument>
<description>
- Returns True/False whether [code]s[/code] is a NaN (Not-A-Number) value.
+ Returns whether [code]s[/code] is a NaN (Not-A-Number) value.
</description>
</method>
<method name="len">
@@ -523,7 +539,7 @@
</description>
</method>
<method name="lerp">
- <return type="float">
+ <return type="Variant">
</return>
<argument index="0" name="from" type="Variant">
</argument>
@@ -533,8 +549,11 @@
</argument>
<description>
Linearly interpolates between two values by a normalized value.
+ If the [code]from[/code] and [code]to[/code] arguments are of type [int] or [float], the return value is a [float].
+ If both are of the same vector type ([Vector2], [Vector3] or [Color]), the return value will be of the same type ([code]lerp[/code] then calls the vector type's [code]linear_interpolate[/code] method).
[codeblock]
- lerp(1, 3, 0.5) # returns 2
+ lerp(0, 4, 0.75) # returns 3.0
+ lerp(Vector2(1, 5), Vector2(3, 2), 0.5) # returns Vector2(2, 3.5)
[/codeblock]
</description>
</method>
@@ -584,7 +603,7 @@
<description>
Returns the maximum of two values.
[codeblock]
- max(1,2) # returns 2
+ max(1, 2) # returns 2
max(-3.99, -4) # returns -3.99
[/codeblock]
</description>
@@ -599,7 +618,7 @@
<description>
Returns the minimum of two values.
[codeblock]
- min(1,2) # returns 1
+ min(1, 2) # returns 1
min(-3.99, -4) # returns -4
[/codeblock]
</description>
@@ -657,7 +676,7 @@
<description>
Returns the result of [code]x[/code] raised to the power of [code]y[/code].
[codeblock]
- pow(2,5) # returns 32
+ pow(2, 5) # returns 32
[/codeblock]
</description>
</method>
@@ -681,8 +700,8 @@
<description>
Converts one or more arguments to strings in the best way possible and prints them to the console.
[codeblock]
- a = [1,2,3]
- print("a","b",a) # prints ab[1, 2, 3]
+ a = [1, 2, 3]
+ print("a", "b", a) # prints ab[1, 2, 3]
[/codeblock]
</description>
</method>
@@ -690,6 +709,7 @@
<return type="void">
</return>
<description>
+ Like [method print], but prints only when used in debug mode.
</description>
</method>
<method name="print_stack">
@@ -751,6 +771,10 @@
<argument index="0" name="message" type="String">
</argument>
<description>
+ Pushes an error message to Godot's built-in debugger and to the OS terminal.
+ [codeblock]
+ push_error("test error") # prints "test error" to debugger and terminal as error call
+ [/codeblock]
</description>
</method>
<method name="push_warning">
@@ -759,6 +783,10 @@
<argument index="0" name="message" type="String">
</argument>
<description>
+ Pushes a warning message to Godot's built-in debugger and to the OS terminal.
+ [codeblock]
+ push_warning("test warning") # prints "test warning" to debugger and terminal as warning call
+ [/codeblock]
</description>
</method>
<method name="rad2deg">
@@ -1001,7 +1029,7 @@
<description>
Returns the tangent of angle [code]s[/code] in radians.
[codeblock]
- tan( deg2rad(45) ) # returns 1
+ tan(deg2rad(45)) # returns 1
[/codeblock]
</description>
</method>
diff --git a/doc/classes/@GlobalScope.xml b/doc/classes/@GlobalScope.xml
index e05af0f1ac..ba2eb35f8c 100644
--- a/doc/classes/@GlobalScope.xml
+++ b/doc/classes/@GlobalScope.xml
@@ -29,8 +29,6 @@
<member name="Geometry" type="Geometry" setter="" getter="">
[Geometry] singleton
</member>
- <member name="GodotSharp" type="GodotSharp" setter="" getter="">
- </member>
<member name="IP" type="IP" setter="" getter="">
[IP] singleton
</member>
diff --git a/doc/classes/ARVRAnchor.xml b/doc/classes/ARVRAnchor.xml
index fa93d9668c..5b9188b171 100644
--- a/doc/classes/ARVRAnchor.xml
+++ b/doc/classes/ARVRAnchor.xml
@@ -5,8 +5,8 @@
</brief_description>
<description>
The ARVR Anchor point is a spatial node that maps a real world location identified by the AR platform to a position within the game world. For example, as long as plane detection in ARKit is on, ARKit will identify and update the position of planes (tables, floors, etc) and create anchors for them.
- This node is mapped to one of the anchors through its unique id. When you receive a signal that a new anchor is available you should add this node to your scene for that anchor. You can predefine nodes and set the id and the nodes will simply remain on 0,0,0 until a plane is recognised.
- Keep in mind that as long as plane detection is enable the size, placing and orientation of an anchor will be updates as the detection logic learns more about the real world out there especially if only part of the surface is in view.
+ This node is mapped to one of the anchors through its unique id. When you receive a signal that a new anchor is available, you should add this node to your scene for that anchor. You can predefine nodes and set the id and the nodes will simply remain on 0,0,0 until a plane is recognised.
+ Keep in mind that, as long as plane detection is enabled, the size, placing and orientation of an anchor will be updated as the detection logic learns more about the real world out there especially if only part of the surface is in view.
</description>
<tutorials>
</tutorials>
@@ -31,7 +31,7 @@
<return type="Plane">
</return>
<description>
- Returns a plane aligned with our anchor, handy for intersection testing
+ Returns a plane aligned with our anchor; handy for intersection testing.
</description>
</method>
<method name="get_size" qualifiers="const">
diff --git a/doc/classes/ARVRCamera.xml b/doc/classes/ARVRCamera.xml
index e74b435e11..aca8282a7c 100644
--- a/doc/classes/ARVRCamera.xml
+++ b/doc/classes/ARVRCamera.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="ARVRCamera" inherits="Camera" category="Core" version="3.1">
<brief_description>
- A camera node with a few overrules for AR/VR applied such as location tracking.
+ A camera node with a few overrules for AR/VR applied, such as location tracking.
</brief_description>
<description>
- This is a helper spatial node for our camera, note that if stereoscopic rendering is applicable (VR-HMD) most of the camera properties are ignored as the HMD information overrides them. The only properties that can be trusted are the near and far planes.
- The position and orientation of this node is automatically updated by the ARVR Server to represent the location of the HMD if such tracking is available and can thus be used by game logic. Note that in contrast to the ARVR Controller the render thread has access to the most up to date tracking data of the HMD and the location of the ARVRCamera can lag a few milliseconds behind what is used for rendering as a result.
+ This is a helper spatial node for our camera; note that, if stereoscopic rendering is applicable (VR-HMD), most of the camera properties are ignored, as the HMD information overrides them. The only properties that can be trusted are the near and far planes.
+ The position and orientation of this node is automatically updated by the ARVR Server to represent the location of the HMD if such tracking is available and can thus be used by game logic. Note that, in contrast to the ARVR Controller, the render thread has access to the most up-to-date tracking data of the HMD and the location of the ARVRCamera can lag a few milliseconds behind what is used for rendering as a result.
</description>
<tutorials>
</tutorials>
diff --git a/doc/classes/ARVRController.xml b/doc/classes/ARVRController.xml
index d3d6fce537..ccb55375d2 100644
--- a/doc/classes/ARVRController.xml
+++ b/doc/classes/ARVRController.xml
@@ -4,8 +4,8 @@
A spatial node representing a spatially tracked controller.
</brief_description>
<description>
- This is a helper spatial node that is linked to the tracking of controllers. It also offers several handy pass throughs to the state of buttons and such on the controllers.
- Controllers are linked by their id. You can create controller nodes before the controllers are available. Say your game always uses two controllers (one for each hand) you can predefine the controllers with id 1 and 2 and they will become active as soon as the controllers are identified. If you expect additional controllers to be used you should react to the signals and add ARVRController nodes to your scene.
+ This is a helper spatial node that is linked to the tracking of controllers. It also offers several handy passthroughs to the state of buttons and such on the controllers.
+ Controllers are linked by their id. You can create controller nodes before the controllers are available. Say your game always uses two controllers (one for each hand) you can predefine the controllers with id 1 and 2 and they will become active as soon as the controllers are identified. If you expect additional controllers to be used, you should react to the signals and add ARVRController nodes to your scene.
The position of the controller node is automatically updated by the ARVR Server. This makes this node ideal to add child nodes to visualise the controller.
</description>
<tutorials>
@@ -64,7 +64,7 @@
<member name="controller_id" type="int" setter="set_controller_id" getter="get_controller_id">
The controller's id.
A controller id of 0 is unbound and will always result in an inactive node. Controller id 1 is reserved for the first controller that identifies itself as the left hand controller and id 2 is reserved for the first controller that identifies itself as the right hand controller.
- For any other controller that the [ARVRServer] detects we continue with controller id 3.
+ For any other controller that the [ARVRServer] detects, we continue with controller id 3.
When a controller is turned off, its slot is freed. This ensures controllers will keep the same id even when controllers with lower ids are turned off.
</member>
<member name="rumble" type="float" setter="set_rumble" getter="get_rumble">
diff --git a/doc/classes/ARVRInterface.xml b/doc/classes/ARVRInterface.xml
index 413370ed0b..bf72902410 100644
--- a/doc/classes/ARVRInterface.xml
+++ b/doc/classes/ARVRInterface.xml
@@ -45,8 +45,8 @@
</return>
<description>
Call this to initialize this interface. The first interface that is initialized is identified as the primary interface and it will be used for rendering output.
- After initializing the interface you want to use you then need to enable the AR/VR mode of a viewport and rendering should commence.
- Note that you must enable the AR/VR mode on the main viewport for any device that uses the main output of Godot such as for mobile VR.
+ After initializing the interface you want to use you then need to enable the AR/VR mode of a viewport and rendering should commence.
+ Note that you must enable the AR/VR mode on the main viewport for any device that uses the main output of Godot such as for mobile VR.
If you do this for a platform that handles its own output (such as OpenVR) Godot will show just one eye without distortion on screen. Alternatively you can add a separate viewport node to your scene and enable AR/VR on that viewport and it will be used to output to the HMD leaving you free to do anything you like in the main window such as using a separate camera as a spectator camera or render out something completely different.
While currently not used you can activate additional interfaces, you may wish to do this if you want to track controllers from other platforms. However at this point in time only one interface can render to an HMD.
</description>
diff --git a/doc/classes/ARVROrigin.xml b/doc/classes/ARVROrigin.xml
index 80626338f2..55062ba3ae 100644
--- a/doc/classes/ARVROrigin.xml
+++ b/doc/classes/ARVROrigin.xml
@@ -6,7 +6,7 @@
<description>
This is a special node within the AR/VR system that maps the physical location of the center of our tracking space to the virtual location within our game world.
There should be only one of these nodes in your scene and you must have one. All the ARVRCamera, ARVRController and ARVRAnchor nodes should be direct children of this node for spatial tracking to work correctly.
- It is the position of this node that you update when you're character needs to move through your game world while we're not moving in the real world. Movement in the real world is always in relation to this origin point.
+ It is the position of this node that you update when your character needs to move through your game world while we're not moving in the real world. Movement in the real world is always in relation to this origin point.
So say that your character is driving a car, the ARVROrigin node should be a child node of this car. If you implement a teleport system to move your character, you change the position of this node. Etc.
</description>
<tutorials>
diff --git a/doc/classes/ARVRServer.xml b/doc/classes/ARVRServer.xml
index a7d3e46684..e089360c46 100644
--- a/doc/classes/ARVRServer.xml
+++ b/doc/classes/ARVRServer.xml
@@ -56,7 +56,7 @@
<return type="int">
</return>
<description>
- Get the number of interfaces currently registered with the AR/VR server. If you're game supports multiple AR/VR platforms you can look through the available interface and either present the user with a selection or simply try an initialize each interface and use the first one that returns true.
+ Get the number of interfaces currently registered with the AR/VR server. If your game supports multiple AR/VR platforms, you can look through the available interface, and either present the user with a selection or simply try an initialize each interface and use the first one that returns true.
</description>
</method>
<method name="get_interfaces" qualifiers="const">
diff --git a/doc/classes/AStar.xml b/doc/classes/AStar.xml
index 482566ee9f..e1b79a2a3e 100644
--- a/doc/classes/AStar.xml
+++ b/doc/classes/AStar.xml
@@ -47,8 +47,7 @@
Adds a new point at the given position with the given identifier. The algorithm prefers points with lower [code]weight_scale[/code] to form a path. The [code]id[/code] must be 0 or larger, and the [code]weight_scale[/code] must be 1 or larger.
[codeblock]
var as = AStar.new()
-
- as.add_point(1, Vector3(1,0,0), 4) # Adds the point (1,0,0) with weight_scale=4 and id=1
+ as.add_point(1, Vector3(1, 0, 0), 4) # Adds the point (1, 0, 0) with weight_scale 4 and id 1
[/codeblock]
If there already exists a point for the given id, its position and weight scale are updated to the given values.
</description>
@@ -81,15 +80,12 @@
<argument index="2" name="bidirectional" type="bool" default="true">
</argument>
<description>
- Creates a segment between the given points.
+ Creates a segment between the given points. If [code]bidirectional[/code] is [code]false[/code], only movement from [code]id[/code] to [code]to_id[/code] is allowed, not the reverse direction.
[codeblock]
var as = AStar.new()
-
- as.add_point(1, Vector3(1,1,0))
- as.add_point(2, Vector3(0,5,0))
-
- as.connect_points(1, 2, false) # If bidirectional=false it's only possible to go from point 1 to point 2
- # and not from point 2 to point 1.
+ as.add_point(1, Vector3(1, 1, 0))
+ as.add_point(2, Vector3(0, 5, 0))
+ as.connect_points(1, 2, false)
[/codeblock]
</description>
</method>
@@ -129,15 +125,12 @@
Returns the closest position to [code]to_position[/code] that resides inside a segment between two connected points.
[codeblock]
var as = AStar.new()
-
- as.add_point(1, Vector3(0,0,0))
- as.add_point(2, Vector3(0,5,0))
-
+ as.add_point(1, Vector3(0, 0, 0))
+ as.add_point(2, Vector3(0, 5, 0))
as.connect_points(1, 2)
-
- var res = as.get_closest_position_in_segment(Vector3(3,3,0)) # returns (0, 3, 0)
+ var res = as.get_closest_position_in_segment(Vector3(3, 3, 0)) # returns (0, 3, 0)
[/codeblock]
- The result is in the segment that goes from [code]y=0[/code] to [code]y=5[/code]. It's the closest position in the segment to the given point.
+ The result is in the segment that goes from [code]y = 0[/code] to [code]y = 5[/code]. It's the closest position in the segment to the given point.
</description>
</method>
<method name="get_id_path">
@@ -151,11 +144,10 @@
Returns an array with the ids of the points that form the path found by AStar between the given points. The array is ordered from the starting point to the ending point of the path.
[codeblock]
var as = AStar.new()
-
- as.add_point(1, Vector3(0,0,0))
- as.add_point(2, Vector3(0,1,0), 1) # default weight is 1
- as.add_point(3, Vector3(1,1,0))
- as.add_point(4, Vector3(2,0,0))
+ as.add_point(1, Vector3(0, 0, 0))
+ as.add_point(2, Vector3(0, 1, 0), 1) # default weight is 1
+ as.add_point(3, Vector3(1, 1, 0))
+ as.add_point(4, Vector3(2, 0, 0))
as.connect_points(1, 2, false)
as.connect_points(2, 3, false)
@@ -177,11 +169,10 @@
Returns an array with the ids of the points that form the connect with the given point.
[codeblock]
var as = AStar.new()
-
- as.add_point(1, Vector3(0,0,0))
- as.add_point(2, Vector3(0,1,0))
- as.add_point(3, Vector3(1,1,0))
- as.add_point(4, Vector3(2,0,0))
+ as.add_point(1, Vector3(0, 0, 0))
+ as.add_point(2, Vector3(0, 1, 0))
+ as.add_point(3, Vector3(1, 1, 0))
+ as.add_point(4, Vector3(2, 0, 0))
as.connect_points(1, 2, true)
as.connect_points(1, 3, true)
diff --git a/doc/classes/AcceptDialog.xml b/doc/classes/AcceptDialog.xml
index 7e871d68cb..fc27bdbb81 100644
--- a/doc/classes/AcceptDialog.xml
+++ b/doc/classes/AcceptDialog.xml
@@ -60,7 +60,7 @@
</methods>
<members>
<member name="dialog_hide_on_ok" type="bool" setter="set_hide_on_ok" getter="get_hide_on_ok">
- If [code]true[/code] the dialog is hidden when the OK button is pressed. You can set it to [code]false[/code] if you want to do e.g. input validation when receiving the [signal confirmed] signal, and handle hiding the dialog in your own logic. Default value: [code]true[/code].
+ If [code]true[/code], the dialog is hidden when the OK button is pressed. You can set it to [code]false[/code] if you want to do e.g. input validation when receiving the [signal confirmed] signal, and handle hiding the dialog in your own logic. Default value: [code]true[/code].
Note: Some nodes derived from this class can have a different default value, and potentially their own built-in logic overriding this setting. For example [FileDialog] defaults to [code]false[/code], and has its own input validation code that is called when you press OK, which eventually hides the dialog if the input is valid. As such this property can't be used in [FileDialog] to disable hiding the dialog when pressing OK.
</member>
<member name="dialog_text" type="String" setter="set_text" getter="get_text">
diff --git a/doc/classes/AnimatedSprite.xml b/doc/classes/AnimatedSprite.xml
index a41ed0e689..7f9167c49a 100644
--- a/doc/classes/AnimatedSprite.xml
+++ b/doc/classes/AnimatedSprite.xml
@@ -40,13 +40,13 @@
The current animation from the [code]frames[/code] resource. If this value changes, the [code]frame[/code] counter is reset.
</member>
<member name="centered" type="bool" setter="set_centered" getter="is_centered">
- If [code]true[/code] texture will be centered. Default value: [code]true[/code].
+ If [code]true[/code], texture will be centered. Default value: [code]true[/code].
</member>
<member name="flip_h" type="bool" setter="set_flip_h" getter="is_flipped_h">
- If [code]true[/code] texture is flipped horizontally. Default value: [code]false[/code].
+ If [code]true[/code], texture is flipped horizontally. Default value: [code]false[/code].
</member>
<member name="flip_v" type="bool" setter="set_flip_v" getter="is_flipped_v">
- If [code]true[/code] texture is flipped vertically. Default value: [code]false[/code].
+ If [code]true[/code], texture is flipped vertically. Default value: [code]false[/code].
</member>
<member name="frame" type="int" setter="set_frame" getter="get_frame">
The displayed animation frame's index.
@@ -58,7 +58,7 @@
The texture's drawing offset.
</member>
<member name="playing" type="bool" setter="_set_playing" getter="_is_playing">
- If [code]true[/code] the [member animation] is currently playing.
+ If [code]true[/code], the [member animation] is currently playing.
</member>
<member name="speed_scale" type="float" setter="set_speed_scale" getter="get_speed_scale">
</member>
diff --git a/doc/classes/AnimatedSprite3D.xml b/doc/classes/AnimatedSprite3D.xml
index 733d565676..dcc44e2df4 100644
--- a/doc/classes/AnimatedSprite3D.xml
+++ b/doc/classes/AnimatedSprite3D.xml
@@ -46,7 +46,7 @@
The [SpriteFrames] resource containing the animation(s).
</member>
<member name="playing" type="bool" setter="_set_playing" getter="_is_playing">
- If [code]true[/code] the [member animation] is currently playing.
+ If [code]true[/code], the [member animation] is currently playing.
</member>
</members>
<signals>
diff --git a/doc/classes/Animation.xml b/doc/classes/Animation.xml
index f189e6451d..a7cae709a4 100644
--- a/doc/classes/Animation.xml
+++ b/doc/classes/Animation.xml
@@ -7,7 +7,7 @@
An Animation resource contains data used to animate everything in the engine. Animations are divided into tracks, and each track must be linked to a node. The state of that node can be changed through time, by adding timed keys (events) to the track.
[codeblock]
# This creates an animation that makes the node "Enemy" move to the right by
- # 100 pixels in 1 second.
+ # 100 pixels in 1 second.
var animation = Animation.new()
var track_index = animation.add_track(Animation.TYPE_VALUE)
animation.track_set_path(track_index, "Enemy:position.x")
@@ -513,7 +513,7 @@
<argument index="1" name="interpolation" type="bool">
</argument>
<description>
- If [code]true[/code] the track at [code]idx[/code] wraps the interpolation loop.
+ If [code]true[/code], the track at [code]idx[/code] wraps the interpolation loop.
</description>
</method>
<method name="track_set_interpolation_type">
diff --git a/doc/classes/AnimationNode.xml b/doc/classes/AnimationNode.xml
index d9bad150df..a98facf541 100644
--- a/doc/classes/AnimationNode.xml
+++ b/doc/classes/AnimationNode.xml
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="AnimationNode" inherits="Resource" category="Core" version="3.1">
<brief_description>
+ Base resource for [AnimationTree] nodes.
</brief_description>
<description>
+ Base resource for [AnimationTree] nodes. In general it's not used directly but you can create custom ones with custom blending formulas.
+ Inherit this when creating nodes mainly for use in [AnimationNodeBlendTree], otherwise [AnimationRootNode] should be used instead.
</description>
<tutorials>
</tutorials>
@@ -15,6 +18,7 @@
<argument index="0" name="name" type="String">
</argument>
<description>
+ Add an input to the node. This is only useful for nodes created for use in an [AnimationNodeBlendTree]
</description>
</method>
<method name="blend_animation">
@@ -31,6 +35,7 @@
<argument index="4" name="blend" type="float">
</argument>
<description>
+ Blend an animation by "blend" amount (name must be valid in the linked [AnimationPlayer]). A time and delta mas be passed, as well as whether seek happened.
</description>
</method>
<method name="blend_input">
@@ -49,6 +54,7 @@
<argument index="5" name="optimize" type="bool" default="true">
</argument>
<description>
+ Blend an input. This is only useful for nodes created for an [AnimationNodeBlendTree]. Time is a delta, unless "seek" is true, in which case it is absolute. A filter mode may be optionally passed.
</description>
</method>
<method name="blend_node">
@@ -69,18 +75,37 @@
<argument index="6" name="optimize" type="bool" default="true">
</argument>
<description>
+ Blend another animaiton node (in case this node contains children animation nodes). This function is only useful if you inherit from [AnimationRootNode] instead, else editors will not display your node for addition.
</description>
</method>
<method name="get_caption" qualifiers="virtual">
<return type="String">
</return>
<description>
+ Get the text caption for this node (used by some editors)
+ </description>
+ </method>
+ <method name="get_child_by_name" qualifiers="virtual">
+ <return type="Object">
+ </return>
+ <argument index="0" name="name" type="String">
+ </argument>
+ <description>
+ Get the a child node by index (used by editors inheriting from [AnimationRootNode]).
+ </description>
+ </method>
+ <method name="get_child_nodes" qualifiers="virtual">
+ <return type="Dictionary">
+ </return>
+ <description>
+ Get all children nodes, in order as a name:node dictionary. Only useful when inheriting [AnimationRootNode].
</description>
</method>
<method name="get_input_count" qualifiers="const">
<return type="int">
</return>
<description>
+ Amount of inputs in this node, only useful for nodes that go into [AnimationNodeBlendTree].
</description>
</method>
<method name="get_input_name">
@@ -89,6 +114,7 @@
<argument index="0" name="input" type="int">
</argument>
<description>
+ Get the name of an input by index.
</description>
</method>
<method name="get_parameter" qualifiers="const">
@@ -97,12 +123,30 @@
<argument index="0" name="name" type="String">
</argument>
<description>
+ Get the value of a parameter. Parameters are custom local memory used for your nodes, given a resource can be reused in multiple trees.
+ </description>
+ </method>
+ <method name="get_parameter_default_value" qualifiers="virtual">
+ <return type="Variant">
+ </return>
+ <argument index="0" name="name" type="String">
+ </argument>
+ <description>
+ Get the default value of a parameter. Parameters are custom local memory used for your nodes, given a resource can be reused in multiple trees.
+ </description>
+ </method>
+ <method name="get_parameter_list" qualifiers="virtual">
+ <return type="Array">
+ </return>
+ <description>
+ Get the property information for parameter. Parameters are custom local memory used for your nodes, given a resource can be reused in multiple trees. Format is similar to [method Object.get_property_list].
</description>
</method>
<method name="has_filter" qualifiers="virtual">
<return type="String">
</return>
<description>
+ Return true whether you want the blend tree editor to display filter editing on this node.
</description>
</method>
<method name="is_path_filtered" qualifiers="const">
@@ -111,6 +155,7 @@
<argument index="0" name="path" type="NodePath">
</argument>
<description>
+ Return true wether a given path is filtered.
</description>
</method>
<method name="process" qualifiers="virtual">
@@ -121,6 +166,10 @@
<argument index="1" name="seek" type="bool">
</argument>
<description>
+ Called when a custom node is processed. The argument "time" is relative, unless "seek" is true (in which case it is absolute).
+ Here, call the [method blend_input], [method blend_node] or [method blend_animation] functions.
+ You can also use [method get_parameter] and [method set_parameter] to modify local memory.
+ This function returns the time left for the current animation to finish (if unsure, just pass the value from the main blend being called).
</description>
</method>
<method name="remove_input">
@@ -129,6 +178,7 @@
<argument index="0" name="index" type="int">
</argument>
<description>
+ Remove an input, call this only when inactive.
</description>
</method>
<method name="set_filter_path">
@@ -139,6 +189,7 @@
<argument index="1" name="enable" type="bool">
</argument>
<description>
+ Add/Remove a path for the filter.
</description>
</method>
<method name="set_parameter">
@@ -149,16 +200,19 @@
<argument index="1" name="value" type="Variant">
</argument>
<description>
+ Set a custom parameter. These are used as local storage, because resources can be reused across the tree or scenes.
</description>
</method>
</methods>
<members>
<member name="filter_enabled" type="bool" setter="set_filter_enabled" getter="is_filter_enabled">
+ Return whether filtering is enabled.
</member>
</members>
<signals>
<signal name="removed_from_graph">
<description>
+ Called when the node was removed from the graph.
</description>
</signal>
<signal name="tree_changed">
@@ -168,12 +222,16 @@
</signals>
<constants>
<constant name="FILTER_IGNORE" value="0" enum="FilterAction">
+ Do not use filtering.
</constant>
<constant name="FILTER_PASS" value="1" enum="FilterAction">
+ Paths matching the filter will be allowed to pass.
</constant>
<constant name="FILTER_STOP" value="2" enum="FilterAction">
+ Paths matching the filter will be discarded.
</constant>
<constant name="FILTER_BLEND" value="3" enum="FilterAction">
+ Paths matching the filter will be blended (by the blend value).
</constant>
</constants>
</class>
diff --git a/doc/classes/AnimationNodeBlendSpace2D.xml b/doc/classes/AnimationNodeBlendSpace2D.xml
index 39d780b6ef..b205c01468 100644
--- a/doc/classes/AnimationNodeBlendSpace2D.xml
+++ b/doc/classes/AnimationNodeBlendSpace2D.xml
@@ -113,6 +113,8 @@
<members>
<member name="auto_triangles" type="bool" setter="set_auto_triangles" getter="get_auto_triangles">
</member>
+ <member name="blend_mode" type="int" setter="set_blend_mode" getter="get_blend_mode" enum="AnimationNodeBlendSpace2D.BlendMode">
+ </member>
<member name="max_space" type="Vector2" setter="set_max_space" getter="get_max_space">
</member>
<member name="min_space" type="Vector2" setter="set_min_space" getter="get_min_space">
@@ -124,6 +126,18 @@
<member name="y_label" type="String" setter="set_y_label" getter="get_y_label">
</member>
</members>
+ <signals>
+ <signal name="triangles_updated">
+ <description>
+ </description>
+ </signal>
+ </signals>
<constants>
+ <constant name="BLEND_MODE_INTERPOLATED" value="0" enum="BlendMode">
+ </constant>
+ <constant name="BLEND_MODE_DISCRETE" value="1" enum="BlendMode">
+ </constant>
+ <constant name="BLEND_MODE_DISCRETE_CARRY" value="2" enum="BlendMode">
+ </constant>
</constants>
</class>
diff --git a/doc/classes/AnimationPlayer.xml b/doc/classes/AnimationPlayer.xml
index 3b3638a4f3..499da4b8a3 100644
--- a/doc/classes/AnimationPlayer.xml
+++ b/doc/classes/AnimationPlayer.xml
@@ -110,6 +110,12 @@
Get the actual playing speed of current animation or 0 if not playing. This speed is the [code]playback_speed[/code] property multiplied by [code]custom_speed[/code] argument specified when calling the [code]play[/code] method.
</description>
</method>
+ <method name="get_queue">
+ <return type="PoolStringArray">
+ </return>
+ <description>
+ </description>
+ </method>
<method name="has_animation" qualifiers="const">
<return type="bool">
</return>
diff --git a/doc/classes/AnimationTreePlayer.xml b/doc/classes/AnimationTreePlayer.xml
index a081c64f6d..b0b58fc7bd 100644
--- a/doc/classes/AnimationTreePlayer.xml
+++ b/doc/classes/AnimationTreePlayer.xml
@@ -607,7 +607,7 @@
</methods>
<members>
<member name="active" type="bool" setter="set_active" getter="is_active">
- If [code]true[/code] the [code]AnimationTreePlayer[/code] is able to play animations. Default value: [code]false[/code].
+ If [code]true[/code], the [code]AnimationTreePlayer[/code] is able to play animations. Default value: [code]false[/code].
</member>
<member name="base_path" type="NodePath" setter="set_base_path" getter="get_base_path">
The node from which to relatively access other nodes. Default value: [code]".."[/code].
diff --git a/doc/classes/Area.xml b/doc/classes/Area.xml
index 970d09a2ac..a538fe9935 100644
--- a/doc/classes/Area.xml
+++ b/doc/classes/Area.xml
@@ -49,7 +49,7 @@
<argument index="0" name="area" type="Node">
</argument>
<description>
- If [code]true[/code] the given area overlaps the Area. Note that the result of this test is not immediate after moving objects. For performance, list of overlaps is updated once per frame and before the physics step. Consider using signals instead.
+ If [code]true[/code], the given area overlaps the Area. Note that the result of this test is not immediate after moving objects. For performance, list of overlaps is updated once per frame and before the physics step. Consider using signals instead.
</description>
</method>
<method name="overlaps_body" qualifiers="const">
@@ -58,7 +58,7 @@
<argument index="0" name="body" type="Node">
</argument>
<description>
- If [code]true[/code] the given body overlaps the Area. Note that the result of this test is not immediate after moving objects. For performance, list of overlaps is updated once per frame and before the physics step. Consider using signals instead.
+ If [code]true[/code], the given body overlaps the Area. Note that the result of this test is not immediate after moving objects. For performance, list of overlaps is updated once per frame and before the physics step. Consider using signals instead.
</description>
</method>
<method name="set_collision_layer_bit">
@@ -69,7 +69,7 @@
<argument index="1" name="value" type="bool">
</argument>
<description>
- Set/clear individual bits on the layer mask. This simplifies editing this [code]Area[code]'s layers.
+ Set/clear individual bits on the layer mask. This simplifies editing this [code]Area[/code]'s layers.
</description>
</method>
<method name="set_collision_mask_bit">
@@ -92,10 +92,10 @@
The name of the area's audio bus.
</member>
<member name="audio_bus_override" type="bool" setter="set_audio_bus_override" getter="is_overriding_audio_bus">
- If [code]true[/code] the area's audio bus overrides the default audio bus. Default value: [code]false[/code].
+ If [code]true[/code], the area's audio bus overrides the default audio bus. Default value: [code]false[/code].
</member>
<member name="collision_layer" type="int" setter="set_collision_layer" getter="get_collision_layer">
- The area's physics layer(s). Collidable objects can exist in any of 32 different layers. A contact is detected if object A is in any of the layers that object B scans, or object B is in any layers that object A scans. See also [code]collision_mask[/code].
+ The area's physics layer(s). Collidable objects can exist in any of 32 different layers. A contact is detected if object A is in any of the layers that object B scans, or object B is in any layers that object A scans. See also [member collision_mask].
</member>
<member name="collision_mask" type="int" setter="set_collision_mask" getter="get_collision_mask">
The physics layers this area scans to determine collision detection.
@@ -107,19 +107,19 @@
The falloff factor for point gravity. The greater the value, the faster gravity decreases with distance.
</member>
<member name="gravity_point" type="bool" setter="set_gravity_is_point" getter="is_gravity_a_point">
- If [code]true[/code] gravity is calculated from a point (set via [code]gravity_vec[/code]). Also see [code]space_override[/code]. Default value: [code]false[/code].
+ If [code]true[/code], gravity is calculated from a point (set via [member gravity_vec]). Also see [member space_override]. Default value: [code]false[/code].
</member>
<member name="gravity_vec" type="Vector3" setter="set_gravity_vector" getter="get_gravity_vector">
- The area's gravity vector (not normalized). If gravity is a point (see [method is_gravity_a_point]), this will be the point of attraction.
+ The area's gravity vector (not normalized). If gravity is a point (see [member gravity_point]), this will be the point of attraction.
</member>
<member name="linear_damp" type="float" setter="set_linear_damp" getter="get_linear_damp">
The rate at which objects stop moving in this area. Represents the linear velocity lost per second. Values range from [code]0[/code] (no damping) to [code]1[/code] (full damping).
</member>
<member name="monitorable" type="bool" setter="set_monitorable" getter="is_monitorable">
- If [code]true[/code] other monitoring areas can detect this area. Default value: [code]true[/code].
+ If [code]true[/code], other monitoring areas can detect this area. Default value: [code]true[/code].
</member>
<member name="monitoring" type="bool" setter="set_monitoring" getter="is_monitoring">
- If [code]true[/code] the area detects bodies or areas entering and exiting it. Default value: [code]true[/code].
+ If [code]true[/code], the area detects bodies or areas entering and exiting it. Default value: [code]true[/code].
</member>
<member name="priority" type="float" setter="set_priority" getter="get_priority">
The area's priority. Higher priority areas are processed first. Default value: 0.
@@ -128,7 +128,7 @@
The degree to which this area applies reverb to its associated audio. Ranges from [code]0[/code] to [code]1[/code] with [code]0.1[/code] precision.
</member>
<member name="reverb_bus_enable" type="bool" setter="set_use_reverb_bus" getter="is_using_reverb_bus">
- If [code]true[/code] the area applies reverb to its associated audio.
+ If [code]true[/code], the area applies reverb to its associated audio.
</member>
<member name="reverb_bus_name" type="String" setter="set_reverb_bus" getter="get_reverb_bus">
The reverb bus name to use for this area's associated audio.
@@ -137,7 +137,7 @@
The degree to which this area's reverb is a uniform effect. Ranges from [code]0[/code] to [code]1[/code] with [code]0.1[/code] precision.
</member>
<member name="space_override" type="int" setter="set_space_override_mode" getter="get_space_override_mode" enum="Area.SpaceOverride">
- Override mode for gravity and damping calculations within this area. See the SPACE_OVERRIDE_* constants for values.
+ Override mode for gravity and damping calculations within this area. See [enum Area.SpaceOverride] for possible values.
</member>
</members>
<signals>
@@ -227,16 +227,16 @@
This area does not affect gravity/damping.
</constant>
<constant name="SPACE_OVERRIDE_COMBINE" value="1" enum="SpaceOverride">
- This area adds its gravity/damping values to whatever has been calculated so far (in [code]priority[/code] order).
+ This area adds its gravity/damping values to whatever has been calculated so far (in [member priority] order).
</constant>
<constant name="SPACE_OVERRIDE_COMBINE_REPLACE" value="2" enum="SpaceOverride">
- This area adds its gravity/damping values to whatever has been calculated so far (in [code]priority[/code] order), ignoring any lower priority areas.
+ This area adds its gravity/damping values to whatever has been calculated so far (in [member priority] order), ignoring any lower priority areas.
</constant>
<constant name="SPACE_OVERRIDE_REPLACE" value="3" enum="SpaceOverride">
This area replaces any gravity/damping, even the defaults, ignoring any lower priority areas.
</constant>
<constant name="SPACE_OVERRIDE_REPLACE_COMBINE" value="4" enum="SpaceOverride">
- This area replaces any gravity/damping calculated so far (in [code]priority[/code] order), but keeps calculating the rest of the areas.
+ This area replaces any gravity/damping calculated so far (in [member priority] order), but keeps calculating the rest of the areas.
</constant>
</constants>
</class>
diff --git a/doc/classes/Area2D.xml b/doc/classes/Area2D.xml
index b77a931201..7980fe79ba 100644
--- a/doc/classes/Area2D.xml
+++ b/doc/classes/Area2D.xml
@@ -49,7 +49,7 @@
<argument index="0" name="area" type="Node">
</argument>
<description>
- If [code]true[/code] the given area overlaps the Area2D. Note that the result of this test is not immediate after moving objects. For performance, list of overlaps is updated once per frame and before the physics step. Consider using signals instead.
+ If [code]true[/code], the given area overlaps the Area2D. Note that the result of this test is not immediate after moving objects. For performance, list of overlaps is updated once per frame and before the physics step. Consider using signals instead.
</description>
</method>
<method name="overlaps_body" qualifiers="const">
@@ -58,7 +58,7 @@
<argument index="0" name="body" type="Node">
</argument>
<description>
- If [code]true[/code] the given body overlaps the Area2D. Note that the result of this test is not immediate after moving objects. For performance, list of overlaps is updated once per frame and before the physics step. Consider using signals instead.
+ If [code]true[/code], the given body overlaps the Area2D. Note that the result of this test is not immediate after moving objects. For performance, list of overlaps is updated once per frame and before the physics step. Consider using signals instead.
</description>
</method>
<method name="set_collision_layer_bit">
@@ -92,10 +92,10 @@
The name of the area's audio bus.
</member>
<member name="audio_bus_override" type="bool" setter="set_audio_bus_override" getter="is_overriding_audio_bus">
- If [code]true[/code] the area's audio bus overrides the default audio bus. Default value: [code]false[/code].
+ If [code]true[/code], the area's audio bus overrides the default audio bus. Default value: [code]false[/code].
</member>
<member name="collision_layer" type="int" setter="set_collision_layer" getter="get_collision_layer">
- The area's physics layer(s). Collidable objects can exist in any of 32 different layers. A contact is detected if object A is in any of the layers that object B scans, or object B is in any layers that object A scans. See also [code]collision_mask[/code].
+ The area's physics layer(s). Collidable objects can exist in any of 32 different layers. A contact is detected if object A is in any of the layers that object B scans, or object B is in any layers that object A scans. See also [member collision_mask].
</member>
<member name="collision_mask" type="int" setter="set_collision_mask" getter="get_collision_mask">
The physics layers this area scans to determine collision detection.
@@ -107,25 +107,25 @@
The falloff factor for point gravity. The greater the value, the faster gravity decreases with distance.
</member>
<member name="gravity_point" type="bool" setter="set_gravity_is_point" getter="is_gravity_a_point">
- If [code]true[/code] gravity is calculated from a point (set via [code]gravity_vec[/code]). Also see [code]space_override[/code]. Default value: [code]false[/code].
+ If [code]true[/code], gravity is calculated from a point (set via [member gravity_vec]). Also see [member space_override]. Default value: [code]false[/code].
</member>
<member name="gravity_vec" type="Vector2" setter="set_gravity_vector" getter="get_gravity_vector">
- The area's gravity vector (not normalized). If gravity is a point (see [method is_gravity_a_point]), this will be the point of attraction.
+ The area's gravity vector (not normalized). If gravity is a point (see [member gravity_point]), this will be the point of attraction.
</member>
<member name="linear_damp" type="float" setter="set_linear_damp" getter="get_linear_damp">
The rate at which objects stop moving in this area. Represents the linear velocity lost per second. Values range from [code]0[/code] (no damping) to [code]1[/code] (full damping).
</member>
<member name="monitorable" type="bool" setter="set_monitorable" getter="is_monitorable">
- If [code]true[/code] other monitoring areas can detect this area. Default value: [code]true[/code].
+ If [code]true[/code], other monitoring areas can detect this area. Default value: [code]true[/code].
</member>
<member name="monitoring" type="bool" setter="set_monitoring" getter="is_monitoring">
- If [code]true[/code] the area detects bodies or areas entering and exiting it. Default value: [code]true[/code].
+ If [code]true[/code], the area detects bodies or areas entering and exiting it. Default value: [code]true[/code].
</member>
<member name="priority" type="float" setter="set_priority" getter="get_priority">
The area's priority. Higher priority areas are processed first. Default value: 0.
</member>
<member name="space_override" type="int" setter="set_space_override_mode" getter="get_space_override_mode" enum="Area2D.SpaceOverride">
- Override mode for gravity and damping calculations within this area. See the SPACE_OVERRIDE_* constants for values.
+ Override mode for gravity and damping calculations within this area. See [enum Area2D.SpaceOverride] for possible values.
</member>
</members>
<signals>
@@ -215,16 +215,16 @@
This area does not affect gravity/damping.
</constant>
<constant name="SPACE_OVERRIDE_COMBINE" value="1" enum="SpaceOverride">
- This area adds its gravity/damping values to whatever has been calculated so far (in [code]priority[/code] order).
+ This area adds its gravity/damping values to whatever has been calculated so far (in [member priority] order).
</constant>
<constant name="SPACE_OVERRIDE_COMBINE_REPLACE" value="2" enum="SpaceOverride">
- This area adds its gravity/damping values to whatever has been calculated so far (in [code]priority[/code] order), ignoring any lower priority areas.
+ This area adds its gravity/damping values to whatever has been calculated so far (in [member priority] order), ignoring any lower priority areas.
</constant>
<constant name="SPACE_OVERRIDE_REPLACE" value="3" enum="SpaceOverride">
This area replaces any gravity/damping, even the defaults, ignoring any lower priority areas.
</constant>
<constant name="SPACE_OVERRIDE_REPLACE_COMBINE" value="4" enum="SpaceOverride">
- This area replaces any gravity/damping calculated so far (in [code]priority[/code] order), but keeps calculating the rest of the areas.
+ This area replaces any gravity/damping calculated so far (in [member priority] order), but keeps calculating the rest of the areas.
</constant>
</constants>
</class>
diff --git a/doc/classes/Array.xml b/doc/classes/Array.xml
index b013b3c4ae..6bd0ef3421 100644
--- a/doc/classes/Array.xml
+++ b/doc/classes/Array.xml
@@ -196,10 +196,10 @@
<description>
Return true if the array contains given value.
[codeblock]
- [ "inside", 7 ].has("inside") == true
- [ "inside", 7 ].has("outside") == false
- [ "inside", 7 ].has(7) == true
- [ "inside", 7 ].has("7") == false
+ ["inside", 7].has("inside") == true
+ ["inside", 7].has("outside") == false
+ ["inside", 7].has(7) == true
+ ["inside", 7].has("7") == false
[/codeblock]
</description>
</method>
diff --git a/doc/classes/ArrayMesh.xml b/doc/classes/ArrayMesh.xml
index 7806cf4ce4..bcb9b4f6da 100644
--- a/doc/classes/ArrayMesh.xml
+++ b/doc/classes/ArrayMesh.xml
@@ -6,9 +6,9 @@
The [code]ArrayMesh[/code] is used to construct a [Mesh] by specifying the attributes as arrays. The most basic example is the creation of a single triangle
[codeblock]
var vertices = PoolVector3Array()
- vertices.push_back(Vector3(0,1,0))
- vertices.push_back(Vector3(1,0,0))
- vertices.push_back(Vector3(0,0,1))
+ vertices.push_back(Vector3(0, 1, 0))
+ vertices.push_back(Vector3(1, 0, 0))
+ vertices.push_back(Vector3(0, 0, 1))
# Initialize the ArrayMesh.
var arr_mesh = ArrayMesh.new()
var arrays = []
diff --git a/doc/classes/AtlasTexture.xml b/doc/classes/AtlasTexture.xml
index 409c40e809..3f5eb892af 100644
--- a/doc/classes/AtlasTexture.xml
+++ b/doc/classes/AtlasTexture.xml
@@ -18,7 +18,7 @@
The texture that contains the atlas. Can be any [Texture] subtype.
</member>
<member name="filter_clip" type="bool" setter="set_filter_clip" getter="has_filter_clip">
- If [code]true[/code] clips the area outside of the region to avoid bleeding of the surrounding texture pixels.
+ If [code]true[/code], clips the area outside of the region to avoid bleeding of the surrounding texture pixels.
</member>
<member name="margin" type="Rect2" setter="set_margin" getter="get_margin">
The margin around the region. The [Rect2]'s 'size' parameter ('w' and 'h' in the editor) resizes the texture so it fits within the margin.
diff --git a/doc/classes/AudioEffectDelay.xml b/doc/classes/AudioEffectDelay.xml
index 7c9d11111c..872b94a0cd 100644
--- a/doc/classes/AudioEffectDelay.xml
+++ b/doc/classes/AudioEffectDelay.xml
@@ -18,7 +18,7 @@
Output percent of original sound. At 0, only delayed sounds are output. Value can range from 0 to 1. Default value: [code]1[/code].
</member>
<member name="feedback/active" type="bool" setter="set_feedback_active" getter="is_feedback_active">
- If [code]true[/code] feedback is enabled. Default value: [code]false[/code].
+ If [code]true[/code], feedback is enabled. Default value: [code]false[/code].
</member>
<member name="feedback/delay_ms" type="float" setter="set_feedback_delay_ms" getter="get_feedback_delay_ms">
Feedback delay time in milliseconds. Default value: [code]340[/code].
diff --git a/doc/classes/AudioEffectReverb.xml b/doc/classes/AudioEffectReverb.xml
index 87c622e3bb..008c644466 100644
--- a/doc/classes/AudioEffectReverb.xml
+++ b/doc/classes/AudioEffectReverb.xml
@@ -15,7 +15,7 @@
</methods>
<members>
<member name="damping" type="float" setter="set_damping" getter="get_damping">
- Defines how reflective the imaginary room's walls are. Value can range from 0 to 1. Default value: [code]1[/code].
+ Defines how reflective the imaginary room's walls are. Value can range from 0 to 1. Default value: [code]1[/code].
</member>
<member name="dry" type="float" setter="set_dry" getter="get_dry">
Output percent of original sound. At 0, only modified sound is outputted. Value can range from 0 to 1. Default value: [code]1[/code].
diff --git a/doc/classes/AudioServer.xml b/doc/classes/AudioServer.xml
index 3ae5454e65..96f02137cf 100644
--- a/doc/classes/AudioServer.xml
+++ b/doc/classes/AudioServer.xml
@@ -61,6 +61,15 @@
Generates an [AudioBusLayout] using the available busses and effects.
</description>
</method>
+ <method name="get_bus_channels" qualifiers="const">
+ <return type="int">
+ </return>
+ <argument index="0" name="bus_idx" type="int">
+ </argument>
+ <description>
+ Returns the amount of channels of the bus at index [code]bus_idx[/code].
+ </description>
+ </method>
<method name="get_bus_count" qualifiers="const">
<return type="int">
</return>
@@ -178,7 +187,7 @@
<argument index="0" name="bus_idx" type="int">
</argument>
<description>
- If [code]true[/code] the bus at index [code]bus_idx[/code] is bypassing effects.
+ If [code]true[/code], the bus at index [code]bus_idx[/code] is bypassing effects.
</description>
</method>
<method name="is_bus_effect_enabled" qualifiers="const">
@@ -189,7 +198,7 @@
<argument index="1" name="effect_idx" type="int">
</argument>
<description>
- If [code]true[/code] the effect at index [code]effect_idx[/code] on the bus at index [code]bus_idx[/code] is enabled.
+ If [code]true[/code], the effect at index [code]effect_idx[/code] on the bus at index [code]bus_idx[/code] is enabled.
</description>
</method>
<method name="is_bus_mute" qualifiers="const">
@@ -198,7 +207,7 @@
<argument index="0" name="bus_idx" type="int">
</argument>
<description>
- If [code]true[/code] the bus at index [code]bus_idx[/code] is muted.
+ If [code]true[/code], the bus at index [code]bus_idx[/code] is muted.
</description>
</method>
<method name="is_bus_solo" qualifiers="const">
@@ -207,7 +216,7 @@
<argument index="0" name="bus_idx" type="int">
</argument>
<description>
- If [code]true[/code] the bus at index [code]bus_idx[/code] is in solo mode.
+ If [code]true[/code], the bus at index [code]bus_idx[/code] is in solo mode.
</description>
</method>
<method name="lock">
@@ -256,7 +265,7 @@
<argument index="1" name="enable" type="bool">
</argument>
<description>
- If [code]true[/code] the bus at index [code]bus_idx[/code] is bypassing effects.
+ If [code]true[/code], the bus at index [code]bus_idx[/code] is bypassing effects.
</description>
</method>
<method name="set_bus_count">
@@ -278,7 +287,7 @@
<argument index="2" name="enabled" type="bool">
</argument>
<description>
- If [code]true[/code] the effect at index [code]effect_idx[/code] on the bus at index [code]bus_idx[/code] is enabled.
+ If [code]true[/code], the effect at index [code]effect_idx[/code] on the bus at index [code]bus_idx[/code] is enabled.
</description>
</method>
<method name="set_bus_layout">
@@ -298,7 +307,7 @@
<argument index="1" name="enable" type="bool">
</argument>
<description>
- If [code]true[/code] the bus at index [code]bus_idx[/code] is muted.
+ If [code]true[/code], the bus at index [code]bus_idx[/code] is muted.
</description>
</method>
<method name="set_bus_name">
@@ -331,7 +340,7 @@
<argument index="1" name="enable" type="bool">
</argument>
<description>
- If [code]true[/code] the bus at index [code]bus_idx[/code] is in solo mode.
+ If [code]true[/code], the bus at index [code]bus_idx[/code] is in solo mode.
</description>
</method>
<method name="set_bus_volume_db">
diff --git a/doc/classes/AudioStream.xml b/doc/classes/AudioStream.xml
index 96ce53b14f..c0a16adda9 100644
--- a/doc/classes/AudioStream.xml
+++ b/doc/classes/AudioStream.xml
@@ -4,7 +4,7 @@
Base class for audio streams.
</brief_description>
<description>
- Base class for audio streams. Audio streams are used for music playback, or other types of streamed sounds that don't fit or require more flexibility than a [Sample].
+ Base class for audio streams. Audio streams are used for sound effects and music playback, and support WAV (via [AudioStreamSample]) and OGG (via [AudioStreamOGGVorbis]) file formats.
</description>
<tutorials>
<link>https://docs.godotengine.org/en/latest/tutorials/audio/audio_streams.html</link>
diff --git a/doc/classes/AudioStreamPlayer.xml b/doc/classes/AudioStreamPlayer.xml
index be4e4f137a..e880fc1323 100644
--- a/doc/classes/AudioStreamPlayer.xml
+++ b/doc/classes/AudioStreamPlayer.xml
@@ -7,7 +7,6 @@
Plays background audio.
</description>
<tutorials>
- <link>https://docs.godotengine.org/en/latest/learning/features/audio/index.html</link>
<link>https://docs.godotengine.org/en/latest/tutorials/audio/audio_streams.html</link>
</tutorials>
<demos>
@@ -48,7 +47,7 @@
</methods>
<members>
<member name="autoplay" type="bool" setter="set_autoplay" getter="is_autoplay_enabled">
- If [code]true[/code] audio plays when added to scene tree. Default value: [code]false[/code].
+ If [code]true[/code], audio plays when added to scene tree. Default value: [code]false[/code].
</member>
<member name="bus" type="String" setter="set_bus" getter="get_bus">
Bus on which this audio is playing.
@@ -60,7 +59,7 @@
Changes the pitch and the tempo of the audio.
</member>
<member name="playing" type="bool" setter="_set_playing" getter="is_playing">
- If [code]true[/code] audio is playing.
+ If [code]true[/code], audio is playing.
</member>
<member name="stream" type="AudioStream" setter="set_stream" getter="get_stream">
The [AudioStream] object to be played.
diff --git a/doc/classes/AudioStreamPlayer2D.xml b/doc/classes/AudioStreamPlayer2D.xml
index 3b81894c14..28754f8695 100644
--- a/doc/classes/AudioStreamPlayer2D.xml
+++ b/doc/classes/AudioStreamPlayer2D.xml
@@ -7,7 +7,6 @@
Plays audio that dampens with distance from screen center.
</description>
<tutorials>
- <link>https://docs.godotengine.org/en/latest/learning/features/audio/index.html</link>
<link>https://docs.godotengine.org/en/latest/tutorials/audio/audio_streams.html</link>
</tutorials>
<demos>
@@ -54,7 +53,7 @@
Dampens audio over distance with this as an exponent.
</member>
<member name="autoplay" type="bool" setter="set_autoplay" getter="is_autoplay_enabled">
- If [code]true[/code] audio plays when added to scene tree. Default value: [code]false[/code].
+ If [code]true[/code], audio plays when added to scene tree. Default value: [code]false[/code].
</member>
<member name="bus" type="String" setter="set_bus" getter="get_bus">
Bus on which this audio is playing.
@@ -66,7 +65,7 @@
Changes the pitch and the tempo of the audio.
</member>
<member name="playing" type="bool" setter="_set_playing" getter="is_playing">
- If [code]true[/code] audio is playing.
+ If [code]true[/code], audio is playing.
</member>
<member name="stream" type="AudioStream" setter="set_stream" getter="get_stream">
The [AudioStream] object to be played.
diff --git a/doc/classes/AudioStreamPlayer3D.xml b/doc/classes/AudioStreamPlayer3D.xml
index 5841f1f6dc..a0260d8261 100644
--- a/doc/classes/AudioStreamPlayer3D.xml
+++ b/doc/classes/AudioStreamPlayer3D.xml
@@ -7,7 +7,6 @@
Plays a sound effect with directed sound effects, dampens with distance if needed, generates effect of hearable position in space.
</description>
<tutorials>
- <link>https://docs.godotengine.org/en/latest/learning/features/audio/index.html</link>
<link>https://docs.godotengine.org/en/latest/tutorials/audio/audio_streams.html</link>
</tutorials>
<demos>
@@ -60,7 +59,7 @@
Decides if audio should get quieter with distance linearly, quadratically or logarithmically.
</member>
<member name="autoplay" type="bool" setter="set_autoplay" getter="is_autoplay_enabled">
- If [code]true[/code] audio plays when added to scene tree. Default value: [code]false[/code].
+ If [code]true[/code], audio plays when added to scene tree. Default value: [code]false[/code].
</member>
<member name="bus" type="String" setter="set_bus" getter="get_bus">
Bus on which this audio is playing.
@@ -72,7 +71,7 @@
The angle in which the audio reaches cameras undampened.
</member>
<member name="emission_angle_enabled" type="bool" setter="set_emission_angle_enabled" getter="is_emission_angle_enabled">
- If [code]true[/code] the audio should be dampened according to the direction of the sound.
+ If [code]true[/code], the audio should be dampened according to the direction of the sound.
</member>
<member name="emission_angle_filter_attenuation_db" type="float" setter="set_emission_angle_filter_attenuation_db" getter="get_emission_angle_filter_attenuation_db">
dampens audio if camera is outside of 'emission_angle_degrees' and 'emission_angle_enabled' is set by this factor, in dB.
diff --git a/doc/classes/AudioStreamSample.xml b/doc/classes/AudioStreamSample.xml
index 9e56cc6016..77d5f14ab7 100644
--- a/doc/classes/AudioStreamSample.xml
+++ b/doc/classes/AudioStreamSample.xml
@@ -62,5 +62,8 @@
<constant name="LOOP_PING_PONG" value="2" enum="LoopMode">
Audio loops the data between loop_begin and loop_end playing back and forth.
</constant>
+ <constant name="LOOP_BACKWARD" value="3" enum="LoopMode">
+ Audio loops the data between loop_begin and loop_end playing backward only.
+ </constant>
</constants>
</class>
diff --git a/doc/classes/BakedLightmap.xml b/doc/classes/BakedLightmap.xml
index 8e27dc8d5d..d376bf667f 100644
--- a/doc/classes/BakedLightmap.xml
+++ b/doc/classes/BakedLightmap.xml
@@ -39,7 +39,7 @@
Size of affected area.
</member>
<member name="bake_hdr" type="bool" setter="set_hdr" getter="is_hdr">
- If [code]true[/code] lightmap can capture light values greater than [code]1.0[/code]. Turning this off will result in a smaller lightmap. Default value:[code]false[/code].
+ If [code]true[/code], lightmap can capture light values greater than [code]1.0[/code]. Turning this off will result in a smaller lightmap. Default value:[code]false[/code].
</member>
<member name="bake_mode" type="int" setter="set_bake_mode" getter="get_bake_mode" enum="BakedLightmap.BakeMode">
Lightmapping mode. See [enum BakeMode].
diff --git a/doc/classes/BaseButton.xml b/doc/classes/BaseButton.xml
index 3364770280..ff3e22ba26 100644
--- a/doc/classes/BaseButton.xml
+++ b/doc/classes/BaseButton.xml
@@ -51,22 +51,25 @@
To allow both left-click and right-click, set this to 3, because it's BUTTON_MASK_LEFT | BUTTON_MASK_RIGHT.
</member>
<member name="disabled" type="bool" setter="set_disabled" getter="is_disabled">
- If [code]true[/code] the button is in disabled state and can't be clicked or toggled.
+ If [code]true[/code], the button is in disabled state and can't be clicked or toggled.
</member>
<member name="enabled_focus_mode" type="int" setter="set_enabled_focus_mode" getter="get_enabled_focus_mode" enum="Control.FocusMode">
- Focus access mode to use when switching between enabled/disabled (see [method Control.set_focus_mode] and [member disabled]).
+ Focus access mode to use when switching between enabled/disabled (see [member Control.focus_mode] and [member disabled]).
</member>
<member name="group" type="ButtonGroup" setter="set_button_group" getter="get_button_group">
[ButtonGroup] associated to the button.
</member>
<member name="pressed" type="bool" setter="set_pressed" getter="is_pressed">
- If [code]true[/code] the button's state is pressed. Means the button is pressed down or toggled (if toggle_mode is active).
+ If [code]true[/code], the button's state is pressed. Means the button is pressed down or toggled (if toggle_mode is active).
</member>
<member name="shortcut" type="ShortCut" setter="set_shortcut" getter="get_shortcut">
- [Shortcut] associated to the button.
+ [ShortCut] associated to the button.
+ </member>
+ <member name="shortcut_in_tooltip" type="bool" setter="set_shortcut_in_tooltip" getter="is_shortcut_in_tooltip_enabled">
+ If [code]true[/code], the button will add information about its shortcut in the tooltip.
</member>
<member name="toggle_mode" type="bool" setter="set_toggle_mode" getter="is_toggle_mode">
- If [code]true[/code] the button is in toggle mode. Makes the button flip state between pressed and unpressed each time its area is clicked.
+ If [code]true[/code], the button is in toggle mode. Makes the button flip state between pressed and unpressed each time its area is clicked.
</member>
</members>
<signals>
@@ -89,7 +92,7 @@
<argument index="0" name="button_pressed" type="bool">
</argument>
<description>
- This signal is emitted when the button was just toggled between pressed and normal states (only if toggle_mode is active). The new state is contained in the [i]pressed[/i] argument.
+ This signal is emitted when the button was just toggled between pressed and normal states (only if toggle_mode is active). The new state is contained in the [i]button_pressed[/i] argument.
</description>
</signal>
</signals>
diff --git a/doc/classes/Basis.xml b/doc/classes/Basis.xml
index 95f6346321..b96daed6fc 100644
--- a/doc/classes/Basis.xml
+++ b/doc/classes/Basis.xml
@@ -9,7 +9,6 @@
</description>
<tutorials>
<link>https://docs.godotengine.org/en/latest/tutorials/3d/using_transforms.html</link>
- <link>https://docs.godotengine.org/en/latest/tutorials/math/rotations.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/BitMap.xml b/doc/classes/BitMap.xml
index 7fe6a2acef..4b7f8007ca 100644
--- a/doc/classes/BitMap.xml
+++ b/doc/classes/BitMap.xml
@@ -88,7 +88,7 @@
<method name="set_bit_rect">
<return type="void">
</return>
- <argument index="0" name="p_rect" type="Rect2">
+ <argument index="0" name="rect" type="Rect2">
</argument>
<argument index="1" name="bit" type="bool">
</argument>
diff --git a/doc/classes/BitmapFont.xml b/doc/classes/BitmapFont.xml
index c943caf636..8ed563be5b 100644
--- a/doc/classes/BitmapFont.xml
+++ b/doc/classes/BitmapFont.xml
@@ -110,7 +110,7 @@
Ascent (number of pixels above the baseline).
</member>
<member name="distance_field" type="bool" setter="set_distance_field_hint" getter="is_distance_field_hint">
- If [code]true[/code] distance field hint is enabled.
+ If [code]true[/code], distance field hint is enabled.
</member>
<member name="fallback" type="BitmapFont" setter="set_fallback" getter="get_fallback">
The fallback font.
diff --git a/doc/classes/ButtonGroup.xml b/doc/classes/ButtonGroup.xml
index e839c3e750..6273c8f83f 100644
--- a/doc/classes/ButtonGroup.xml
+++ b/doc/classes/ButtonGroup.xml
@@ -12,18 +12,21 @@
<demos>
</demos>
<methods>
+ <method name="get_buttons">
+ <return type="Array">
+ </return>
+ <description>
+ Returns an [Array] of [Button]s who have this as their [code]ButtonGroup[/code] (see [member BaseButton.group]).
+ </description>
+ </method>
<method name="get_pressed_button">
<return type="BaseButton">
</return>
<description>
- Return the pressed button.
+ Returns the current pressed button.
</description>
</method>
</methods>
<constants>
</constants>
- <theme_items>
- <theme_item name="panel" type="StyleBox">
- </theme_item>
- </theme_items>
</class>
diff --git a/doc/classes/CPUParticles.xml b/doc/classes/CPUParticles.xml
index c778cd56b3..2073ca0664 100644
--- a/doc/classes/CPUParticles.xml
+++ b/doc/classes/CPUParticles.xml
@@ -127,11 +127,11 @@
</member>
<member name="randomness" type="float" setter="set_randomness_ratio" getter="get_randomness_ratio">
</member>
- <member name="scale" type="float" setter="set_param" getter="get_param">
+ <member name="scale_amount" type="float" setter="set_param" getter="get_param">
</member>
- <member name="scale_curve" type="Curve" setter="set_param_curve" getter="get_param_curve">
+ <member name="scale_amount_curve" type="Curve" setter="set_param_curve" getter="get_param_curve">
</member>
- <member name="scale_random" type="float" setter="set_param_randomness" getter="get_param_randomness">
+ <member name="scale_amount_random" type="float" setter="set_param_randomness" getter="get_param_randomness">
</member>
<member name="speed_scale" type="float" setter="set_speed_scale" getter="get_speed_scale">
</member>
diff --git a/doc/classes/CPUParticles2D.xml b/doc/classes/CPUParticles2D.xml
index bae725d47c..12a176589c 100644
--- a/doc/classes/CPUParticles2D.xml
+++ b/doc/classes/CPUParticles2D.xml
@@ -123,11 +123,11 @@
</member>
<member name="randomness" type="float" setter="set_randomness_ratio" getter="get_randomness_ratio">
</member>
- <member name="scale" type="float" setter="set_param" getter="get_param">
+ <member name="scale_amount" type="float" setter="set_param" getter="get_param">
</member>
- <member name="scale_curve" type="Curve" setter="set_param_curve" getter="get_param_curve">
+ <member name="scale_amount_curve" type="Curve" setter="set_param_curve" getter="get_param_curve">
</member>
- <member name="scale_random" type="float" setter="set_param_randomness" getter="get_param_randomness">
+ <member name="scale_amount_random" type="float" setter="set_param_randomness" getter="get_param_randomness">
</member>
<member name="speed_scale" type="float" setter="set_speed_scale" getter="get_speed_scale">
</member>
diff --git a/doc/classes/Camera.xml b/doc/classes/Camera.xml
index c7eb365891..f4b1bc1519 100644
--- a/doc/classes/Camera.xml
+++ b/doc/classes/Camera.xml
@@ -138,7 +138,7 @@
The culling mask that describes which 3D render layers are rendered by this camera.
</member>
<member name="current" type="bool" setter="set_current" getter="is_current">
- If [code]true[/code] the ancestor [Viewport] is currently using this Camera. Default value: [code]false[/code].
+ If [code]true[/code], the ancestor [Viewport] is currently using this Camera. Default value: [code]false[/code].
</member>
<member name="doppler_tracking" type="int" setter="set_doppler_tracking" getter="get_doppler_tracking" enum="Camera.DopplerTracking">
If not [code]DOPPLER_TRACKING_DISABLED[/code] this Camera will simulate the Doppler effect for objects changed in particular [code]_process[/code] methods. Default value: [code]DOPPLER_TRACKING_DISABLED[/code].
diff --git a/doc/classes/Camera2D.xml b/doc/classes/Camera2D.xml
index 39cc1b84b3..fa907dd648 100644
--- a/doc/classes/Camera2D.xml
+++ b/doc/classes/Camera2D.xml
@@ -68,7 +68,7 @@
The Camera2D's anchor point. See [code]ANCHOR_MODE_*[/code] constants.
</member>
<member name="current" type="bool" setter="_set_current" getter="is_current">
- If [code]true[/code] the camera is the active camera for the current scene. Only one camera can be current, so setting a different camera [code]current[/code] will disable this one.
+ If [code]true[/code], the camera is the active camera for the current scene. Only one camera can be current, so setting a different camera [code]current[/code] will disable this one.
</member>
<member name="custom_viewport" type="Node" setter="set_custom_viewport" getter="get_custom_viewport">
The custom [Viewport] node attached to the [code]Camera2D[/code]. If null or not a [Viewport], uses the default viewport instead.
@@ -77,7 +77,7 @@
Bottom margin needed to drag the camera. A value of [code]1[/code] makes the camera move only when reaching the edge of the screen.
</member>
<member name="drag_margin_h_enabled" type="bool" setter="set_h_drag_enabled" getter="is_h_drag_enabled">
- If [code]true[/code] the camera only moves when reaching the horizontal drag margins. If [code]false[/code] the camera moves horizontally regardless of margins. Default value: [code]true[/code].
+ If [code]true[/code], the camera only moves when reaching the horizontal drag margins. If [code]false[/code], the camera moves horizontally regardless of margins. Default value: [code]true[/code].
</member>
<member name="drag_margin_left" type="float" setter="set_drag_margin" getter="get_drag_margin">
Left margin needed to drag the camera. A value of [code]1[/code] makes the camera move only when reaching the edge of the screen.
@@ -89,16 +89,16 @@
Top margin needed to drag the camera. A value of [code]1[/code] makes the camera move only when reaching the edge of the screen.
</member>
<member name="drag_margin_v_enabled" type="bool" setter="set_v_drag_enabled" getter="is_v_drag_enabled">
- If [code]true[/code] the camera only moves when reaching the vertical drag margins. If [code]false[/code] the camera moves vertically regardless of margins. Default value: [code]true[/code].
+ If [code]true[/code], the camera only moves when reaching the vertical drag margins. If [code]false[/code], the camera moves vertically regardless of margins. Default value: [code]true[/code].
</member>
<member name="editor_draw_drag_margin" type="bool" setter="set_margin_drawing_enabled" getter="is_margin_drawing_enabled">
- If [code]true[/code] draws the camera's drag margin rectangle in the editor. Default value: [code]false[/code]
+ If [code]true[/code], draws the camera's drag margin rectangle in the editor. Default value: [code]false[/code]
</member>
<member name="editor_draw_limits" type="bool" setter="set_limit_drawing_enabled" getter="is_limit_drawing_enabled">
- If [code]true[/code] draws the camera's limits rectangle in the editor. Default value: [code]true[/code]
+ If [code]true[/code], draws the camera's limits rectangle in the editor. Default value: [code]true[/code]
</member>
<member name="editor_draw_screen" type="bool" setter="set_screen_drawing_enabled" getter="is_screen_drawing_enabled">
- If [code]true[/code] draws the camera's screen rectangle in the editor. Default value: [code]false[/code]
+ If [code]true[/code], draws the camera's screen rectangle in the editor. Default value: [code]false[/code]
</member>
<member name="limit_bottom" type="int" setter="set_limit" getter="get_limit">
Bottom scroll limit in pixels. The camera stops moving when reaching this value.
@@ -110,7 +110,7 @@
Right scroll limit in pixels. The camera stops moving when reaching this value.
</member>
<member name="limit_smoothed" type="bool" setter="set_limit_smoothing_enabled" getter="is_limit_smoothing_enabled">
- If [code]true[/code] the camera smoothly stops when reaches its limits. Default value: [code]false[/code]
+ If [code]true[/code], the camera smoothly stops when reaches its limits. Default value: [code]false[/code]
</member>
<member name="limit_top" type="int" setter="set_limit" getter="get_limit">
Top scroll limit in pixels. The camera stops moving when reaching this value.
@@ -124,11 +124,13 @@
<member name="offset_v" type="float" setter="set_v_offset" getter="get_v_offset">
The vertical offset of the camera, relative to the drag margins. Default value: [code]0[/code]
</member>
+ <member name="process_mode" type="int" setter="set_process_mode" getter="get_process_mode" enum="Camera2D.Camera2DProcessMode">
+ </member>
<member name="rotating" type="bool" setter="set_rotating" getter="is_rotating">
- If [code]true[/code] the camera rotates with the target. Default value: [code]false[/code]
+ If [code]true[/code], the camera rotates with the target. Default value: [code]false[/code]
</member>
<member name="smoothing_enabled" type="bool" setter="set_enable_follow_smoothing" getter="is_follow_smoothing_enabled">
- If [code]true[/code] the camera smoothly moves towards the target at [member smoothing_speed]. Default value: [code]false[/code]
+ If [code]true[/code], the camera smoothly moves towards the target at [member smoothing_speed]. Default value: [code]false[/code]
</member>
<member name="smoothing_speed" type="float" setter="set_follow_smoothing" getter="get_follow_smoothing">
Speed in pixels per second of the camera's smoothing effect when [member smoothing_enabled] is [code]true[/code]
@@ -144,5 +146,9 @@
<constant name="ANCHOR_MODE_DRAG_CENTER" value="1" enum="AnchorMode">
The camera's position takes into account vertical/horizontal offsets and the screen size.
</constant>
+ <constant name="CAMERA2D_PROCESS_PHYSICS" value="0" enum="Camera2DProcessMode">
+ </constant>
+ <constant name="CAMERA2D_PROCESS_IDLE" value="1" enum="Camera2DProcessMode">
+ </constant>
</constants>
</class>
diff --git a/doc/classes/CanvasItem.xml b/doc/classes/CanvasItem.xml
index 4bae656740..0ec28f93a7 100644
--- a/doc/classes/CanvasItem.xml
+++ b/doc/classes/CanvasItem.xml
@@ -135,7 +135,7 @@
<method name="draw_multimesh">
<return type="void">
</return>
- <argument index="0" name="mesh" type="Mesh">
+ <argument index="0" name="multimesh" type="MultiMesh">
</argument>
<argument index="1" name="texture" type="Texture">
</argument>
@@ -497,7 +497,7 @@
<return type="void">
</return>
<description>
- Show the CanvasItem currently hidden.
+ Show the CanvasItem currently hidden. For controls that inherit [Popup], the correct way to make them visible is to call one of the multiple popup*() functions instead.
</description>
</method>
<method name="update">
@@ -522,16 +522,16 @@
The color applied to textures on this [code]CanvasItem[/code]. This is not inherited by children [code]CanvasItem[/code]s. Default value: [code]Color(1, 1, 1, 1)[/code] (opaque "white")..
</member>
<member name="show_behind_parent" type="bool" setter="set_draw_behind_parent" getter="is_draw_behind_parent_enabled">
- If [code]true[/code] the object draws behind its parent. Default value: [code]false[/code].
+ If [code]true[/code], the object draws behind its parent. Default value: [code]false[/code].
</member>
<member name="show_on_top" type="bool" setter="_set_on_top" getter="_is_on_top">
- If [code]true[/code] the object draws on top of its parent. Default value: [code]true[/code].
+ If [code]true[/code], the object draws on top of its parent. Default value: [code]true[/code].
</member>
<member name="use_parent_material" type="bool" setter="set_use_parent_material" getter="get_use_parent_material">
- If [code]true[/code] the parent [code]CanvasItem[/code]'s [member material] property is used as this one's material. Default value: [code]false[/code].
+ If [code]true[/code], the parent [code]CanvasItem[/code]'s [member material] property is used as this one's material. Default value: [code]false[/code].
</member>
<member name="visible" type="bool" setter="set_visible" getter="is_visible">
- If [code]true[/code] this [code]CanvasItem[/code] is drawn. Default value: [code]true[/code].
+ If [code]true[/code], this [code]CanvasItem[/code] is drawn. Default value: [code]true[/code]. For controls that inherit [Popup], the correct way to make them visible is to call one of the multiple popup*() functions instead.
</member>
</members>
<signals>
diff --git a/doc/classes/CenterContainer.xml b/doc/classes/CenterContainer.xml
index 41c8cf7100..93c4208765 100644
--- a/doc/classes/CenterContainer.xml
+++ b/doc/classes/CenterContainer.xml
@@ -14,7 +14,7 @@
</methods>
<members>
<member name="use_top_left" type="bool" setter="set_use_top_left" getter="is_using_top_left">
- If [code]true[/code] centers children relative to the [code]CenterContainer[/code]'s top left corner. Default value: [code]false[/code].
+ If [code]true[/code], centers children relative to the [code]CenterContainer[/code]'s top left corner. Default value: [code]false[/code].
</member>
</members>
<constants>
diff --git a/doc/classes/CollisionObject.xml b/doc/classes/CollisionObject.xml
index 5e4e740498..f702fbadbb 100644
--- a/doc/classes/CollisionObject.xml
+++ b/doc/classes/CollisionObject.xml
@@ -57,7 +57,7 @@
<argument index="0" name="owner_id" type="int">
</argument>
<description>
- If [code]true[/code] the shape owner and its shapes are disabled.
+ If [code]true[/code], the shape owner and its shapes are disabled.
</description>
</method>
<method name="remove_shape_owner">
@@ -166,7 +166,7 @@
<argument index="1" name="disabled" type="bool">
</argument>
<description>
- If [code]true[/code] disables the given shape owner.
+ If [code]true[/code], disables the given shape owner.
</description>
</method>
<method name="shape_owner_set_transform">
@@ -183,10 +183,10 @@
</methods>
<members>
<member name="input_capture_on_drag" type="bool" setter="set_capture_input_on_drag" getter="get_capture_input_on_drag">
- If [code]true[/code] the [code]CollisionObject[/code] will continue to receive input events as the mouse is dragged across its shapes. Default value: [code]false[/code].
+ If [code]true[/code], the [code]CollisionObject[/code] will continue to receive input events as the mouse is dragged across its shapes. Default value: [code]false[/code].
</member>
<member name="input_ray_pickable" type="bool" setter="set_ray_pickable" getter="is_ray_pickable">
- If [code]true[/code] the [CollisionObject]'s shapes will respond to [RayCast]s. Default value: [code]true[/code].
+ If [code]true[/code], the [CollisionObject]'s shapes will respond to [RayCast]s. Default value: [code]true[/code].
</member>
</members>
<signals>
diff --git a/doc/classes/CollisionObject2D.xml b/doc/classes/CollisionObject2D.xml
index b507204f0d..48a198b248 100644
--- a/doc/classes/CollisionObject2D.xml
+++ b/doc/classes/CollisionObject2D.xml
@@ -53,7 +53,7 @@
<argument index="0" name="owner_id" type="int">
</argument>
<description>
- If [code]true[/code] the shape owner and its shapes are disabled.
+ If [code]true[/code], the shape owner and its shapes are disabled.
</description>
</method>
<method name="is_shape_owner_one_way_collision_enabled" qualifiers="const">
@@ -171,7 +171,7 @@
<argument index="1" name="disabled" type="bool">
</argument>
<description>
- If [code]true[/code] disables the given shape owner.
+ If [code]true[/code], disables the given shape owner.
</description>
</method>
<method name="shape_owner_set_one_way_collision">
@@ -199,7 +199,7 @@
</methods>
<members>
<member name="input_pickable" type="bool" setter="set_pickable" getter="is_pickable">
- If [code]true[/code] this object is pickable. A pickable object can detect the mouse pointer entering/leaving, and if the mouse is inside it, report input events.
+ If [code]true[/code], this object is pickable. A pickable object can detect the mouse pointer entering/leaving, and if the mouse is inside it, report input events.
</member>
</members>
<signals>
diff --git a/doc/classes/CollisionPolygon2D.xml b/doc/classes/CollisionPolygon2D.xml
index 5b940e7ff1..f63adbf71a 100644
--- a/doc/classes/CollisionPolygon2D.xml
+++ b/doc/classes/CollisionPolygon2D.xml
@@ -17,10 +17,10 @@
Collision build mode. Use one of the [code]BUILD_*[/code] constants. Default value: [code]BUILD_SOLIDS[/code].
</member>
<member name="disabled" type="bool" setter="set_disabled" getter="is_disabled">
- If [code]true[/code] no collisions will be detected.
+ If [code]true[/code], no collisions will be detected.
</member>
<member name="one_way_collision" type="bool" setter="set_one_way_collision" getter="is_one_way_collision_enabled">
- If [code]true[/code] only edges that face up, relative to CollisionPolygon2D's rotation, will collide with other objects.
+ If [code]true[/code], only edges that face up, relative to CollisionPolygon2D's rotation, will collide with other objects.
</member>
<member name="polygon" type="PoolVector2Array" setter="set_polygon" getter="get_polygon">
The polygon's list of vertices. The final point will be connected to the first.
diff --git a/doc/classes/Color.xml b/doc/classes/Color.xml
index 82a10fbaa4..68f5734491 100644
--- a/doc/classes/Color.xml
+++ b/doc/classes/Color.xml
@@ -19,11 +19,6 @@
</argument>
<description>
Constructs a color from an HTML hexadecimal color string in ARGB or RGB format. See also [method @GDScript.ColorN].
- The following string formats are supported:
- [code]"#ff00ff00"[/code] - ARGB format with '#'
- [code]"ff00ff00"[/code] - ARGB format
- [code]"#ff00ff"[/code] - RGB format with '#'
- [code]"ff00ff"[/code] - RGB format
[codeblock]
# Each of the following creates the same color RGBA(178, 217, 10, 255)
var c1 = Color("#ffb2d90a") # ARGB format with '#'
@@ -57,7 +52,7 @@
<description>
Constructs a color from an RGB profile using values between 0 and 1. Alpha will always be 1.
[codeblock]
- var c = Color(0.2, 1.0, .7) # Equivalent to RGBA(51, 255, 178, 255)
+ var c = Color(0.2, 1.0, 0.7) # Equivalent to RGBA(51, 255, 178, 255)
[/codeblock]
</description>
</method>
@@ -75,7 +70,7 @@
<description>
Constructs a color from an RGBA profile using values between 0 and 1.
[codeblock]
- var c = Color(0.2, 1.0, .7, .8) # Equivalent to RGBA(51, 255, 178, 204)
+ var c = Color(0.2, 1.0, 0.7, 0.8) # Equivalent to RGBA(51, 255, 178, 204)
[/codeblock]
</description>
</method>
@@ -88,8 +83,8 @@
Returns a new color resulting from blending this color over another. If the color is opaque, the result is also opaque. The second color may have a range of alpha values.
[codeblock]
var bg = Color(0.0, 1.0, 0.0, 0.5) # Green with alpha of 50%
- var fg = Color(1.0, 0.0, 0.0, .5) # Red with alpha of 50%
- var blendedColor = bg.blend(fg) # Brown with alpha of 75%
+ var fg = Color(1.0, 0.0, 0.0, 0.5) # Red with alpha of 50%
+ var blended_color = bg.blend(fg) # Brown with alpha of 75%
[/codeblock]
</description>
</method>
@@ -99,8 +94,8 @@
<description>
Returns the most contrasting color.
[codeblock]
- var c = Color(.3, .4, .9)
- var contrastedColor = c.contrasted() # Equivalent to RGBA(204, 229, 102, 255)
+ var c = Color(0.3, 0.4, 0.9)
+ var contrasted_color = c.contrasted() # Equivalent to RGBA(204, 229, 102, 255)
[/codeblock]
</description>
</method>
@@ -110,7 +105,7 @@
<argument index="0" name="amount" type="float">
</argument>
<description>
- Returns a new color resulting from making this color darker by the specified percentage (0-1).
+ Returns a new color resulting from making this color darker by the specified percentage (ratio from 0 to 1).
[codeblock]
var green = Color(0.0, 1.0, 0.0)
var darkgreen = green.darkened(0.2) # 20% darker than regular green
@@ -140,7 +135,7 @@
</return>
<description>
Returns the color's grayscale representation.
- The gray is calculated by [code](r + g + b) / 3[/code].
+ The gray value is calculated as [code](r + g + b) / 3[/code].
[codeblock]
var c = Color(0.2, 0.45, 0.82)
var gray = c.gray() # a value of 0.466667
@@ -153,8 +148,8 @@
<description>
Returns the inverted color [code](1 - r, 1 - g, 1 - b, 1 - a)[/code].
[codeblock]
- var c = Color(.3, .4, .9)
- var invertedColor = c.inverted() # a color of an RGBA(178, 153, 26, 255)
+ var c = Color(0.3, 0.4, 0.9)
+ var inverted_color = c.inverted() # a color of an RGBA(178, 153, 26, 255)
[/codeblock]
</description>
</method>
@@ -164,7 +159,7 @@
<argument index="0" name="amount" type="float">
</argument>
<description>
- Returns a new color resulting from making this color lighter by the specified percentage (0-1).
+ Returns a new color resulting from making this color lighter by the specified percentage (ratio from 0 to 1).
[codeblock]
var green = Color(0.0, 1.0, 0.0)
var lightgreen = green.lightened(0.2) # 20% lighter than regular green
@@ -179,7 +174,7 @@
<argument index="1" name="t" type="float">
</argument>
<description>
- Returns the linear interpolation with another color. The value t is between 0 and 1.
+ Returns the linear interpolation with another color. The interpolation factor [code]t[/code] is between 0 and 1.
[codeblock]
var c1 = Color(1.0, 0.0, 0.0)
var c2 = Color(0.0, 1.0, 0.0)
@@ -193,7 +188,7 @@
<description>
Returns the color's 32-bit integer in ABGR format (each byte represents a component of the ABGR profile). ABGR is the reversed version of the default format.
[codeblock]
- var c = Color(1, .5, .2)
+ var c = Color(1, 0.5, 0.2)
print(c.to_abgr32()) # Prints 4281565439
[/codeblock]
</description>
@@ -204,7 +199,7 @@
<description>
Returns the color's 64-bit integer in ABGR format (each word represents a component of the ABGR profile). ABGR is the reversed version of the default format.
[codeblock]
- var c = Color(1, .5, .2)
+ var c = Color(1, 0.5, 0.2)
print(c.to_abgr64()) # Prints -225178692812801
[/codeblock]
</description>
@@ -215,7 +210,7 @@
<description>
Returns the color's 32-bit integer in ARGB format (each byte represents a component of the ARGB profile). ARGB is more compatible with DirectX.
[codeblock]
- var c = Color(1, .5, .2)
+ var c = Color(1, 0.5, 0.2)
print(c.to_argb32()) # Prints 4294934323
[/codeblock]
</description>
@@ -226,7 +221,7 @@
<description>
Returns the color's 64-bit integer in ARGB format (each word represents a component of the ARGB profile). ARGB is more compatible with DirectX.
[codeblock]
- var c = Color(1, .5, .2)
+ var c = Color(1, 0.5, 0.2)
print(c.to_argb64()) # Prints -2147470541
[/codeblock]
</description>
@@ -240,7 +235,7 @@
Returns the color's HTML hexadecimal color string in ARGB format (ex: [code]ff34f822[/code]).
Setting [code]with_alpha[/code] to [code]false[/code] excludes alpha from the hexadecimal string.
[codeblock]
- var c = Color(1, 1, 1, .5)
+ var c = Color(1, 1, 1, 0.5)
var s1 = c.to_html() # Results "7fffffff"
var s2 = c.to_html(false) # Results 'ffffff'
[/codeblock]
@@ -252,7 +247,7 @@
<description>
Returns the color's 32-bit integer in RGBA format (each byte represents a component of the RGBA profile). RGBA is Godot's default format.
[codeblock]
- var c = Color(1, .5, .2)
+ var c = Color(1, 0.5, 0.2)
print(c.to_rgba32()) # Prints 4286526463
[/codeblock]
</description>
@@ -263,7 +258,7 @@
<description>
Returns the color's 64-bit integer in RGBA format (each word represents a component of the RGBA profile). RGBA is Godot's default format.
[codeblock]
- var c = Color(1, .5, .2)
+ var c = Color(1, 0.5, 0.2)
print(c.to_rgba64()) # Prints -140736629309441
[/codeblock]
</description>
diff --git a/doc/classes/ColorPicker.xml b/doc/classes/ColorPicker.xml
index 554e6b5632..dfe0492d0b 100644
--- a/doc/classes/ColorPicker.xml
+++ b/doc/classes/ColorPicker.xml
@@ -20,19 +20,35 @@
Adds the given color to a list of color presets. The presets are displayed in the color picker and the user will be able to select them. Note: the presets list is only for [i]this[/i] color picker.
</description>
</method>
+ <method name="erase_preset">
+ <return type="void">
+ </return>
+ <argument index="0" name="color" type="Color">
+ </argument>
+ <description>
+ Remove the given color from the list of color presets of this color picker.
+ </description>
+ </method>
+ <method name="get_presets" qualifiers="const">
+ <return type="PoolColorArray">
+ </return>
+ <description>
+ Return the list of colors in the presets of the color picker.
+ </description>
+ </method>
</methods>
<members>
<member name="color" type="Color" setter="set_pick_color" getter="get_pick_color">
The currently selected color.
</member>
<member name="deferred_mode" type="bool" setter="set_deferred_mode" getter="is_deferred_mode">
- If [code]true[/code] the color will apply only after the user releases the mouse button, otherwise it will apply immediately even in mouse motion event (which can cause performance issues).
+ If [code]true[/code], the color will apply only after the user releases the mouse button, otherwise it will apply immediately even in mouse motion event (which can cause performance issues).
</member>
<member name="edit_alpha" type="bool" setter="set_edit_alpha" getter="is_editing_alpha">
- If [code]true[/code] shows an alpha channel slider (transparency).
+ If [code]true[/code], shows an alpha channel slider (transparency).
</member>
<member name="raw_mode" type="bool" setter="set_raw_mode" getter="is_raw_mode">
- If [code]true[/code] allows the color R, G, B component values to go beyond 1.0, which can be used for certain special operations that require it (like tinting without darkening or rendering sprites in HDR).
+ If [code]true[/code], allows the color R, G, B component values to go beyond 1.0, which can be used for certain special operations that require it (like tinting without darkening or rendering sprites in HDR).
</member>
</members>
<signals>
@@ -43,6 +59,20 @@
Emitted when the color is changed.
</description>
</signal>
+ <signal name="preset_added">
+ <argument index="0" name="color" type="Color">
+ </argument>
+ <description>
+ Emitted when a preset is added.
+ </description>
+ </signal>
+ <signal name="preset_removed">
+ <argument index="0" name="color" type="Color">
+ </argument>
+ <description>
+ Emitted when a preset is removed.
+ </description>
+ </signal>
</signals>
<constants>
</constants>
diff --git a/doc/classes/ColorPickerButton.xml b/doc/classes/ColorPickerButton.xml
index 8bc6d05bd4..e1a6290161 100644
--- a/doc/classes/ColorPickerButton.xml
+++ b/doc/classes/ColorPickerButton.xml
@@ -31,7 +31,7 @@
The currently selected color.
</member>
<member name="edit_alpha" type="bool" setter="set_edit_alpha" getter="is_editing_alpha">
- If [code]true[/code] the alpha channel in the displayed [ColorPicker] will be visible. Default value: [code]true[/code].
+ If [code]true[/code], the alpha channel in the displayed [ColorPicker] will be visible. Default value: [code]true[/code].
</member>
</members>
<signals>
diff --git a/doc/classes/Control.xml b/doc/classes/Control.xml
index 76a475e49d..f067b50c72 100644
--- a/doc/classes/Control.xml
+++ b/doc/classes/Control.xml
@@ -120,7 +120,7 @@
<argument index="1" name="stylebox" type="StyleBox">
</argument>
<description>
- Overrides the [code]name[/code] [Stylebox] in the [member theme] resource the node uses. If [code]stylebox[/code] is empty, Godot clears the override.
+ Overrides the [code]name[/code] [StyleBox] in the [member theme] resource the node uses. If [code]stylebox[/code] is empty, Godot clears the override.
</description>
</method>
<method name="can_drop_data" qualifiers="virtual">
@@ -340,7 +340,7 @@
<return type="void">
</return>
<description>
- Steal the focus from another control and become the focused control (see [method set_focus_mode]).
+ Steal the focus from another control and become the focused control (see [member focus_mode]).
</description>
</method>
<method name="has_color" qualifiers="const">
@@ -617,65 +617,74 @@
</methods>
<members>
<member name="anchor_bottom" type="float" setter="_set_anchor" getter="get_anchor">
- Anchors the bottom edge of the node to the origin, the center, or the end of its parent container. It changes how the bottom margin updates when the node moves or changes size. Use one of the [code]ANCHOR_*[/code] constants. Default value: [code]ANCHOR_BEGIN[/code].
+ Anchors the bottom edge of the node to the origin, the center, or the end of its parent control. It changes how the bottom margin updates when the node moves or changes size. You can use one of the [code]ANCHOR_*[/code] constants for convenience. Default value: [code]ANCHOR_BEGIN[/code].
</member>
<member name="anchor_left" type="float" setter="_set_anchor" getter="get_anchor">
- Anchors the left edge of the node to the origin, the center or the end of its parent container. It changes how the left margin updates when the node moves or changes size. Use one of the [code]ANCHOR_*[/code] constants. Default value: [code]ANCHOR_BEGIN[/code].
+ Anchors the left edge of the node to the origin, the center or the end of its parent control. It changes how the left margin updates when the node moves or changes size. You can use one of the [code]ANCHOR_*[/code] constants for convenience.Default value: [code]ANCHOR_BEGIN[/code].
</member>
<member name="anchor_right" type="float" setter="_set_anchor" getter="get_anchor">
- Anchors the right edge of the node to the origin, the center or the end of its parent container. It changes how the right margin updates when the node moves or changes size. Use one of the [code]ANCHOR_*[/code] constants. Default value: [code]ANCHOR_BEGIN[/code].
+ Anchors the right edge of the node to the origin, the center or the end of its parent control. It changes how the right margin updates when the node moves or changes size. You can use one of the [code]ANCHOR_*[/code] constants for convenience. Default value: [code]ANCHOR_BEGIN[/code].
</member>
<member name="anchor_top" type="float" setter="_set_anchor" getter="get_anchor">
- Anchors the top edge of the node to the origin, the center or the end of its parent container. It changes how the top margin updates when the node moves or changes size. Use one of the [code]ANCHOR_*[/code] constants. Default value: [code]ANCHOR_BEGIN[/code].
+ Anchors the top edge of the node to the origin, the center or the end of its parent control. It changes how the top margin updates when the node moves or changes size. You can use one of the [code]ANCHOR_*[/code] constants for convenience. Default value: [code]ANCHOR_BEGIN[/code].
</member>
<member name="focus_mode" type="int" setter="set_focus_mode" getter="get_focus_mode" enum="Control.FocusMode">
The focus access mode for the control (None, Click or All). Only one Control can be focused at the same time, and it will receive keyboard signals.
</member>
<member name="focus_neighbour_bottom" type="NodePath" setter="set_focus_neighbour" getter="get_focus_neighbour">
- Tells Godot which node it should give keyboard focus to if the user presses Tab, the down arrow on the keyboard, or down on a gamepad. The node must be a [code]Control[/code]. If this property is not set, Godot will give focus to the closest [code]Control[/code] to the bottom of this one.
- If the user presses Tab, Godot will give focus to the closest node to the right first, then to the bottom. If the user presses Shift+Tab, Godot will look to the left of the node, then above it.
+ Tells Godot which node it should give keyboard focus to if the user presses the down arrow on the keyboard or down on a gamepad by default. You can change the key by editing the [code]ui_down[/code] input action. The node must be a [code]Control[/code]. If this property is not set, Godot will give focus to the closest [code]Control[/code] to the bottom of this one.
</member>
<member name="focus_neighbour_left" type="NodePath" setter="set_focus_neighbour" getter="get_focus_neighbour">
- Tells Godot which node it should give keyboard focus to if the user presses Shift+Tab, the left arrow on the keyboard or left on a gamepad. The node must be a [code]Control[/code]. If this property is not set, Godot will give focus to the closest [code]Control[/code] to the left of this one.
+ Tells Godot which node it should give keyboard focus to if the user presses the left arrow on the keyboard or left on a gamepad by default. You can change the key by editing the [code]ui_left[/code] input action. The node must be a [code]Control[/code]. If this property is not set, Godot will give focus to the closest [code]Control[/code] to the left of this one.
</member>
<member name="focus_neighbour_right" type="NodePath" setter="set_focus_neighbour" getter="get_focus_neighbour">
- Tells Godot which node it should give keyboard focus to if the user presses Tab, the right arrow on the keyboard or right on a gamepad. The node must be a [code]Control[/code]. If this property is not set, Godot will give focus to the closest [code]Control[/code] to the bottom of this one.
+ Tells Godot which node it should give keyboard focus to if the user presses the right arrow on the keyboard or right on a gamepad by default. You can change the key by editing the [code]ui_right[/code] input action. The node must be a [code]Control[/code]. If this property is not set, Godot will give focus to the closest [code]Control[/code] to the bottom of this one.
</member>
<member name="focus_neighbour_top" type="NodePath" setter="set_focus_neighbour" getter="get_focus_neighbour">
- Tells Godot which node it should give keyboard focus to if the user presses Shift+Tab, the top arrow on the keyboard or top on a gamepad. The node must be a [code]Control[/code]. If this property is not set, Godot will give focus to the closest [code]Control[/code] to the bottom of this one.
+ Tells Godot which node it should give keyboard focus to if the user presses the top arrow on the keyboard or top on a gamepad by default. You can change the key by editing the [code]ui_top[/code] input action. The node must be a [code]Control[/code]. If this property is not set, Godot will give focus to the closest [code]Control[/code] to the bottom of this one.
</member>
<member name="focus_next" type="NodePath" setter="set_focus_next" getter="get_focus_next">
+ Tells Godot which node it should give keyboard focus to if the user presses Tab on a keyboard by default. You can change the key by editing the [code]ui_focus_next[/code] input action.
+ If this property is not set, Godot will select a "best guess" based on surrounding nodes in the scene tree.
</member>
<member name="focus_previous" type="NodePath" setter="set_focus_previous" getter="get_focus_previous">
+ Tells Godot which node it should give keyboard focus to if the user presses Shift+Tab on a keyboard by default. You can change the key by editing the [code]ui_focus_prev[/code] input action.
+ If this property is not set, Godot will select a "best guess" based on surrounding nodes in the scene tree.
</member>
<member name="grow_horizontal" type="int" setter="set_h_grow_direction" getter="get_h_grow_direction" enum="Control.GrowDirection">
+ Controls the direction on the horizontal axis in which the control should grow if its horizontal minimum size is changed to be greater than its current size, as the control always has to be at least the minimum size.
</member>
<member name="grow_vertical" type="int" setter="set_v_grow_direction" getter="get_v_grow_direction" enum="Control.GrowDirection">
+ Controls the direction on the vertical axis in which the control should grow if its vertical minimum size is changed to be greater than its current size, as the control always has to be at least the minimum size.
</member>
<member name="hint_tooltip" type="String" setter="set_tooltip" getter="_get_tooltip">
Changes the tooltip text. The tooltip appears when the user's mouse cursor stays idle over this control for a few moments.
</member>
<member name="margin_bottom" type="float" setter="set_margin" getter="get_margin">
- Distance between the node's bottom edge and its parent container, based on [member anchor_bottom].
- Margins are often controlled by one or multiple parent [Container] nodes. Margins update automatically when you move or resize the node.
+ Distance between the node's bottom edge and its parent control, based on [member anchor_bottom].
+ Margins are often controlled by one or multiple parent [Container] nodes, so you should not modify them manually if your node is a direct child of a [Container]. Margins update automatically when you move or resize the node.
</member>
<member name="margin_left" type="float" setter="set_margin" getter="get_margin">
- Distance between the node's left edge and its parent container, based on [member anchor_left].
+ Distance between the node's left edge and its parent control, based on [member anchor_left].
+ Margins are often controlled by one or multiple parent [Container] nodes, so you should not modify them manually if your node is a direct child of a [Container]. Margins update automatically when you move or resize the node.
</member>
<member name="margin_right" type="float" setter="set_margin" getter="get_margin">
- Distance between the node's right edge and its parent container, based on [member anchor_right].
+ Distance between the node's right edge and its parent control, based on [member anchor_right].
+ Margins are often controlled by one or multiple parent [Container] nodes, so you should not modify them manually if your node is a direct child of a [Container]. Margins update automatically when you move or resize the node.
</member>
<member name="margin_top" type="float" setter="set_margin" getter="get_margin">
- Distance between the node's top edge and its parent container, based on [member anchor_top].
+ Distance between the node's top edge and its parent control, based on [member anchor_top].
+ Margins are often controlled by one or multiple parent [Container] nodes, so you should not modify them manually if your node is a direct child of a [Container]. Margins update automatically when you move or resize the node.
</member>
<member name="mouse_default_cursor_shape" type="int" setter="set_default_cursor_shape" getter="get_default_cursor_shape" enum="Control.CursorShape">
The default cursor shape for this control. Useful for Godot plugins and applications or games that use the system's mouse cursors.
[b]Note:[/b] On Linux, shapes may vary depending on the cursor theme of the system.
</member>
<member name="mouse_filter" type="int" setter="set_mouse_filter" getter="get_mouse_filter" enum="Control.MouseFilter">
- Controls whether the control will be able to receive mouse button input events through [method _gui_input] and how these events should be handled. Use one of the [code]MOUSE_FILTER_*[/code] constants. See the constants to learn what each does.
+ Controls whether the control will be able to receive mouse button input events through [method _gui_input] and how these events should be handled. See the constants to learn what each does.
</member>
<member name="rect_clip_content" type="bool" setter="set_clip_contents" getter="is_clipping_contents">
+ Enables whether rendering of children should be clipped to this control's rectangle. If true, parts of a child which would be visibly outside of this control's rectangle will not be rendered.
</member>
<member name="rect_global_position" type="Vector2" setter="set_global_position" getter="get_global_position">
The node's global position, relative to the world (usually to the top-left corner of the window).
@@ -786,17 +795,19 @@
Sent when the node loses focus.
</constant>
<constant name="NOTIFICATION_THEME_CHANGED" value="45">
- Sent when the node's [member theme] changes, right before Godot redraws the control. Happens when you call one of the [code]add_*_override[/code]
+ Sent when the node's [member theme] changes, right before Godot redraws the control. Happens when you call one of the [code]add_*_override[/code] methods.
</constant>
<constant name="NOTIFICATION_MODAL_CLOSE" value="46">
- Sent when an open modal dialog closes. See [member show_modal].
+ Sent when an open modal dialog closes. See [method show_modal].
</constant>
<constant name="NOTIFICATION_SCROLL_BEGIN" value="47">
+ Sent when this node is inside a [ScrollContainer] which has begun being scrolled.
</constant>
<constant name="NOTIFICATION_SCROLL_END" value="48">
+ Sent when this node is inside a [ScrollContainer] which has stopped being scrolled.
</constant>
<constant name="CURSOR_ARROW" value="0" enum="CursorShape">
- Show the system's arrow mouse cursor when the user hovers the node. Use with [method set_default_cursor_shape].
+ Show the system's arrow mouse cursor when the user hovers the node. Use with [member mouse_default_cursor_shape].
</constant>
<constant name="CURSOR_IBEAM" value="1" enum="CursorShape">
Show the system's I-beam mouse cursor when the user hovers the node. The I-beam pointer has a shape similar to "I". It tells the user they can highlight or insert text.
@@ -847,52 +858,52 @@
Show the system's help mouse cursor when the user hovers the node, a question mark.
</constant>
<constant name="PRESET_TOP_LEFT" value="0" enum="LayoutPreset">
- Snap all 4 anchors to the top-left of the parent container's bounds. Use with [method set_anchors_preset].
+ Snap all 4 anchors to the top-left of the parent control's bounds. Use with [method set_anchors_preset].
</constant>
<constant name="PRESET_TOP_RIGHT" value="1" enum="LayoutPreset">
- Snap all 4 anchors to the top-right of the parent container's bounds. Use with [method set_anchors_preset].
+ Snap all 4 anchors to the top-right of the parent control's bounds. Use with [method set_anchors_preset].
</constant>
<constant name="PRESET_BOTTOM_LEFT" value="2" enum="LayoutPreset">
- Snap all 4 anchors to the bottom-left of the parent container's bounds. Use with [method set_anchors_preset].
+ Snap all 4 anchors to the bottom-left of the parent control's bounds. Use with [method set_anchors_preset].
</constant>
<constant name="PRESET_BOTTOM_RIGHT" value="3" enum="LayoutPreset">
- Snap all 4 anchors to the bottom-right of the parent container's bounds. Use with [method set_anchors_preset].
+ Snap all 4 anchors to the bottom-right of the parent control's bounds. Use with [method set_anchors_preset].
</constant>
<constant name="PRESET_CENTER_LEFT" value="4" enum="LayoutPreset">
- Snap all 4 anchors to the center of the left edge of the parent container's bounds. Use with [method set_anchors_preset].
+ Snap all 4 anchors to the center of the left edge of the parent control's bounds. Use with [method set_anchors_preset].
</constant>
<constant name="PRESET_CENTER_TOP" value="5" enum="LayoutPreset">
- Snap all 4 anchors to the center of the top edge of the parent container's bounds. Use with [method set_anchors_preset].
+ Snap all 4 anchors to the center of the top edge of the parent control's bounds. Use with [method set_anchors_preset].
</constant>
<constant name="PRESET_CENTER_RIGHT" value="6" enum="LayoutPreset">
- Snap all 4 anchors to the center of the right edge of the parent container's bounds. Use with [method set_anchors_preset].
+ Snap all 4 anchors to the center of the right edge of the parent control's bounds. Use with [method set_anchors_preset].
</constant>
<constant name="PRESET_CENTER_BOTTOM" value="7" enum="LayoutPreset">
- Snap all 4 anchors to the center of the bottom edge of the parent container's bounds. Use with [method set_anchors_preset].
+ Snap all 4 anchors to the center of the bottom edge of the parent control's bounds. Use with [method set_anchors_preset].
</constant>
<constant name="PRESET_CENTER" value="8" enum="LayoutPreset">
- Snap all 4 anchors to the center of the parent container's bounds. Use with [method set_anchors_preset].
+ Snap all 4 anchors to the center of the parent control's bounds. Use with [method set_anchors_preset].
</constant>
<constant name="PRESET_LEFT_WIDE" value="9" enum="LayoutPreset">
- Snap all 4 anchors to the left edge of the parent container. The left margin becomes relative to the left edge and the top margin relative to the top left corner of the node's parent. Use with [method set_anchors_preset].
+ Snap all 4 anchors to the left edge of the parent control. The left margin becomes relative to the left edge and the top margin relative to the top left corner of the node's parent. Use with [method set_anchors_preset].
</constant>
<constant name="PRESET_TOP_WIDE" value="10" enum="LayoutPreset">
- Snap all 4 anchors to the top edge of the parent container. The left margin becomes relative to the top left corner, the top margin relative to the top edge, and the right margin relative to the top right corner of the node's parent. Use with [method set_anchors_preset].
+ Snap all 4 anchors to the top edge of the parent control. The left margin becomes relative to the top left corner, the top margin relative to the top edge, and the right margin relative to the top right corner of the node's parent. Use with [method set_anchors_preset].
</constant>
<constant name="PRESET_RIGHT_WIDE" value="11" enum="LayoutPreset">
- Snap all 4 anchors to the right edge of the parent container. The right margin becomes relative to the right edge and the top margin relative to the top right corner of the node's parent. Use with [method set_anchors_preset].
+ Snap all 4 anchors to the right edge of the parent control. The right margin becomes relative to the right edge and the top margin relative to the top right corner of the node's parent. Use with [method set_anchors_preset].
</constant>
<constant name="PRESET_BOTTOM_WIDE" value="12" enum="LayoutPreset">
- Snap all 4 anchors to the bottom edge of the parent container. The left margin becomes relative to the bottom left corner, the bottom margin relative to the bottom edge, and the right margin relative to the bottom right corner of the node's parent. Use with [method set_anchors_preset].
+ Snap all 4 anchors to the bottom edge of the parent control. The left margin becomes relative to the bottom left corner, the bottom margin relative to the bottom edge, and the right margin relative to the bottom right corner of the node's parent. Use with [method set_anchors_preset].
</constant>
<constant name="PRESET_VCENTER_WIDE" value="13" enum="LayoutPreset">
- Snap all 4 anchors to a vertical line that cuts the parent container in half. Use with [method set_anchors_preset].
+ Snap all 4 anchors to a vertical line that cuts the parent control in half. Use with [method set_anchors_preset].
</constant>
<constant name="PRESET_HCENTER_WIDE" value="14" enum="LayoutPreset">
- Snap all 4 anchors to a horizontal line that cuts the parent container in half. Use with [method set_anchors_preset].
+ Snap all 4 anchors to a horizontal line that cuts the parent control in half. Use with [method set_anchors_preset].
</constant>
<constant name="PRESET_WIDE" value="15" enum="LayoutPreset">
- Snap all 4 anchors to the respective corners of the parent container. Set all 4 margins to 0 after you applied this preset and the [code]Control[/code] will fit its parent container. Use with [method set_anchors_preset].
+ Snap all 4 anchors to the respective corners of the parent control. Set all 4 margins to 0 after you applied this preset and the [code]Control[/code] will fit its parent control. This is equivalent to to the "Full Rect" layout option in the editor. Use with [method set_anchors_preset].
</constant>
<constant name="PRESET_MODE_MINSIZE" value="0" enum="LayoutPresetMode">
</constant>
@@ -921,16 +932,19 @@
The control will receive mouse button input events through [method _gui_input] if clicked on. These events are automatically marked as handled and they will not propagate further to other controls.
</constant>
<constant name="MOUSE_FILTER_PASS" value="1" enum="MouseFilter">
- The control will receive mouse button input events through [method _gui_input] if clicked on. If this control does not handle the event, the parent control (if any) will be considered for a mouse click, and so on until there is no more parent control to potentially handle it. Even if no control handled it at all, the event will still be handled automatically.
+ The control will receive mouse button input events through [method _gui_input] if clicked on. If this control does not handle the event, the parent control (if any) will be considered for a mouse click, and so on until there is no more parent control to potentially handle it. Even if no control handled it at all, the event will still be handled automatically, so unhandled input will not be fired.
</constant>
<constant name="MOUSE_FILTER_IGNORE" value="2" enum="MouseFilter">
The control will not receive mouse button input events through [method _gui_input] and will not block other controls from receiving these events. These events will also not be handled automatically.
</constant>
<constant name="GROW_DIRECTION_BEGIN" value="0" enum="GrowDirection">
+ The control will grow to the left or top to make up if its minimum size is changed to be greater than its current size on the respective axis.
</constant>
<constant name="GROW_DIRECTION_END" value="1" enum="GrowDirection">
+ The control wil grow to the right or bottom to make up if its minimum size is changed to be greater than its current size on the respective axis.
</constant>
<constant name="GROW_DIRECTION_BOTH" value="2" enum="GrowDirection">
+ The control wil grow in both directions equally to make up if its minimum size is changed to be greater than its current size.
</constant>
<constant name="ANCHOR_BEGIN" value="0" enum="Anchor">
Snaps one of the 4 anchor's sides to the origin of the node's [code]Rect[/code], in the top left. Use it with one of the [code]anchor_*[/code] member variables, like [member anchor_left]. To change all 4 anchors at once, use [method set_anchors_preset].
diff --git a/doc/classes/ConvexPolygonShape2D.xml b/doc/classes/ConvexPolygonShape2D.xml
index 6b31149c2f..8210e7dc9c 100644
--- a/doc/classes/ConvexPolygonShape2D.xml
+++ b/doc/classes/ConvexPolygonShape2D.xml
@@ -18,7 +18,7 @@
<argument index="0" name="point_cloud" type="PoolVector2Array">
</argument>
<description>
- Currently, this method does nothing.
+ Based on the set of points provided, this creates and assigns the [member points] property using the convex hull algorithm. Removing all unneeded points. See [method Geometry.convex_hull_2d] for details.
</description>
</method>
</methods>
diff --git a/doc/classes/Curve2D.xml b/doc/classes/Curve2D.xml
index ab9b27542c..dd80ec8e8f 100644
--- a/doc/classes/Curve2D.xml
+++ b/doc/classes/Curve2D.xml
@@ -24,8 +24,8 @@
<argument index="3" name="at_position" type="int" default="-1">
</argument>
<description>
- Adds a point to a curve, at "position", with control points "in" and "out".
- If "at_position" is given, the point is inserted before the point number "at_position", moving that point (and every point after) after the inserted point. If "at_position" is not given, or is an illegal value (at_position &lt;0 or at_position &gt;= [method get_point_count]), the point will be appended at the end of the point list.
+ Adds a point to a curve, at [code]position[/code], with control points [code]in[/code] and [code]out[/code].
+ If [code]at_position[/code] is given, the point is inserted before the point number [code]at_position[/code], moving that point (and every point after) after the inserted point. If [code]at_position[/code] is not given, or is an illegal value ([code]at_position &lt;0[/code] or [code]at_position &gt;= [method get_point_count][/code]), the point will be appended at the end of the point list.
</description>
</method>
<method name="clear_points">
@@ -39,7 +39,7 @@
<return type="float">
</return>
<description>
- Returns the total length of the curve, based on the cached points. Given enough density (see [method set_bake_interval]), it should be approximate enough.
+ Returns the total length of the curve, based on the cached points. Given enough density (see [member bake_interval]), it should be approximate enough.
</description>
</method>
<method name="get_baked_points" qualifiers="const">
@@ -82,7 +82,7 @@
<argument index="0" name="idx" type="int">
</argument>
<description>
- Returns the position of the control point leading to the vertex "idx". If the index is out of bounds, the function sends an error to the console, and returns (0, 0).
+ Returns the position of the control point leading to the vertex [code]idx[/code]. If the index is out of bounds, the function sends an error to the console, and returns [code](0, 0)[/code].
</description>
</method>
<method name="get_point_out" qualifiers="const">
@@ -91,7 +91,7 @@
<argument index="0" name="idx" type="int">
</argument>
<description>
- Returns the position of the control point leading out of the vertex "idx". If the index is out of bounds, the function sends an error to the console, and returns (0, 0).
+ Returns the position of the control point leading out of the vertex [code]idx[/code]. If the index is out of bounds, the function sends an error to the console, and returns [code](0, 0)[/code].
</description>
</method>
<method name="get_point_position" qualifiers="const">
@@ -100,7 +100,7 @@
<argument index="0" name="idx" type="int">
</argument>
<description>
- Returns the position of the vertex "idx". If the index is out of bounds, the function sends an error to the console, and returns (0, 0).
+ Returns the position of the vertex [code]idx[/code]. If the index is out of bounds, the function sends an error to the console, and returns [code](0, 0)[/code].
</description>
</method>
<method name="interpolate" qualifiers="const">
@@ -111,8 +111,8 @@
<argument index="1" name="t" type="float">
</argument>
<description>
- Returns the position between the vertex "idx" and the vertex "idx"+1, where "t" controls if the point is the first vertex (t = 0.0), the last vertex (t = 1.0), or in between. Values of "t" outside the range (0.0 &gt;= t &lt;=1) give strange, but predictable results.
- If "idx" is out of bounds it is truncated to the first or last vertex, and "t" is ignored. If the curve has no points, the function sends an error to the console, and returns (0, 0).
+ Returns the position between the vertex [code]idx[/code] and the vertex [code]idx + 1[/code], where [code]t[/code] controls if the point is the first vertex ([code]t = 0.0[/code]), the last vertex ([code]t = 1.0[/code]), or in between. Values of [code]t[/code] outside the range ([code]0.0 &gt;= t &lt;=1[/code]) give strange, but predictable results.
+ If [code]idx[/code] is out of bounds it is truncated to the first or last vertex, and [code]t[/code] is ignored. If the curve has no points, the function sends an error to the console, and returns [code](0, 0)[/code].
</description>
</method>
<method name="interpolate_baked" qualifiers="const">
@@ -123,8 +123,8 @@
<argument index="1" name="cubic" type="bool" default="false">
</argument>
<description>
- Returns a point within the curve at position "offset", where "offset" is measured as a pixel distance along the curve.
- To do that, it finds the two cached points where the "offset" lies between, then interpolates the values. This interpolation is cubic if "cubic" is set to true, or linear if set to false.
+ Returns a point within the curve at position [code]offset[/code], where [code]offset[/code] is measured as a pixel distance along the curve.
+ To do that, it finds the two cached points where the [code]offset[/code] lies between, then interpolates the values. This interpolation is cubic if [code]cubic[/code] is set to true, or linear if set to false.
Cubic interpolation tends to follow the curves better, but linear is faster (and often, precise enough).
</description>
</method>
@@ -134,7 +134,7 @@
<argument index="0" name="fofs" type="float">
</argument>
<description>
- Returns the position at the vertex "fofs". It calls [method interpolate] using the integer part of fofs as "idx", and its fractional part as "t".
+ Returns the position at the vertex [code]fofs[/code]. It calls [method interpolate] using the integer part of [code]fofs[/code] as [code]idx[/code], and its fractional part as [code]t[/code].
</description>
</method>
<method name="remove_point">
@@ -143,7 +143,7 @@
<argument index="0" name="idx" type="int">
</argument>
<description>
- Deletes the point "idx" from the curve. Sends an error to the console if "idx" is out of bounds.
+ Deletes the point [code]idx[/code] from the curve. Sends an error to the console if [code]idx[/code] is out of bounds.
</description>
</method>
<method name="set_point_in">
@@ -154,7 +154,7 @@
<argument index="1" name="position" type="Vector2">
</argument>
<description>
- Sets the position of the control point leading to the vertex "idx". If the index is out of bounds, the function sends an error to the console.
+ Sets the position of the control point leading to the vertex [code]idx[/code]. If the index is out of bounds, the function sends an error to the console.
</description>
</method>
<method name="set_point_out">
@@ -165,7 +165,7 @@
<argument index="1" name="position" type="Vector2">
</argument>
<description>
- Sets the position of the control point leading out of the vertex "idx". If the index is out of bounds, the function sends an error to the console.
+ Sets the position of the control point leading out of the vertex [code]idx[/code]. If the index is out of bounds, the function sends an error to the console.
</description>
</method>
<method name="set_point_position">
@@ -176,7 +176,7 @@
<argument index="1" name="position" type="Vector2">
</argument>
<description>
- Sets the position for the vertex "idx". If the index is out of bounds, the function sends an error to the console.
+ Sets the position for the vertex [code]idx[/code]. If the index is out of bounds, the function sends an error to the console.
</description>
</method>
<method name="tessellate" qualifiers="const">
@@ -189,8 +189,8 @@
<description>
Returns a list of points along the curve, with a curvature controlled point density. That is, the curvier parts will have more points than the straighter parts.
This approximation makes straight segments between each point, then subdivides those segments until the resulting shape is similar enough.
- "max_stages" controls how many subdivisions a curve segment may face before it is considered approximate enough. Each subdivision splits the segment in half, so the default 5 stages may mean up to 32 subdivisions per curve segment. Increase with care!
- "tolerance_degrees" controls how many degrees the midpoint of a segment may deviate from the real curve, before the segment has to be subdivided.
+ [code]max_stages[/code] controls how many subdivisions a curve segment may face before it is considered approximate enough. Each subdivision splits the segment in half, so the default 5 stages may mean up to 32 subdivisions per curve segment. Increase with care!
+ [code]tolerance_degrees[/code] controls how many degrees the midpoint of a segment may deviate from the real curve, before the segment has to be subdivided.
</description>
</method>
</methods>
diff --git a/doc/classes/Curve3D.xml b/doc/classes/Curve3D.xml
index c3ee309f0b..e9ee1c6974 100644
--- a/doc/classes/Curve3D.xml
+++ b/doc/classes/Curve3D.xml
@@ -24,8 +24,8 @@
<argument index="3" name="at_position" type="int" default="-1">
</argument>
<description>
- Adds a point to a curve, at "position", with control points "in" and "out".
- If "at_position" is given, the point is inserted before the point number "at_position", moving that point (and every point after) after the inserted point. If "at_position" is not given, or is an illegal value (at_position &lt;0 or at_position &gt;= [method get_point_count]), the point will be appended at the end of the point list.
+ Adds a point to a curve, at [code]position[/code], with control points [code]in[/code] and [code]out[/code].
+ If [code]at_position[/code] is given, the point is inserted before the point number [code]at_position[/code], moving that point (and every point after) after the inserted point. If [code]at_position[/code] is not given, or is an illegal value ([code]at_position &lt;0[/code] or [code]at_position &gt;= [method get_point_count][/code]), the point will be appended at the end of the point list.
</description>
</method>
<method name="clear_points">
@@ -39,7 +39,7 @@
<return type="float">
</return>
<description>
- Returns the total length of the curve, based on the cached points. Given enough density (see [method set_bake_interval]), it should be approximate enough.
+ Returns the total length of the curve, based on the cached points. Given enough density (see [member bake_interval]), it should be approximate enough.
</description>
</method>
<method name="get_baked_points" qualifiers="const">
@@ -53,7 +53,7 @@
<return type="PoolRealArray">
</return>
<description>
- Returns the cache of tilts as a [RealArray].
+ Returns the cache of tilts as a [PoolRealArray].
</description>
</method>
<method name="get_baked_up_vectors" qualifiers="const">
@@ -70,7 +70,7 @@
<argument index="0" name="to_point" type="Vector3">
</argument>
<description>
- Returns the closest offset to [code]to_point[/code]. This offset is meant to be used in one of the interpolate_baked* methods.
+ Returns the closest offset to [code]to_point[/code]. This offset is meant to be used in [method interpolate_baked] or [method interpolate_baked_up_vector].
[code]to_point[/code] must be in this curve's local space.
</description>
</method>
@@ -97,7 +97,7 @@
<argument index="0" name="idx" type="int">
</argument>
<description>
- Returns the position of the control point leading to the vertex "idx". If the index is out of bounds, the function sends an error to the console, and returns (0, 0, 0).
+ Returns the position of the control point leading to the vertex [code]idx[/code]. If the index is out of bounds, the function sends an error to the console, and returns [code](0, 0, 0)[/code].
</description>
</method>
<method name="get_point_out" qualifiers="const">
@@ -106,7 +106,7 @@
<argument index="0" name="idx" type="int">
</argument>
<description>
- Returns the position of the control point leading out of the vertex "idx". If the index is out of bounds, the function sends an error to the console, and returns (0, 0, 0).
+ Returns the position of the control point leading out of the vertex [code]idx[/code]. If the index is out of bounds, the function sends an error to the console, and returns [code](0, 0, 0)[/code].
</description>
</method>
<method name="get_point_position" qualifiers="const">
@@ -115,7 +115,7 @@
<argument index="0" name="idx" type="int">
</argument>
<description>
- Returns the position of the vertex "idx". If the index is out of bounds, the function sends an error to the console, and returns (0, 0, 0).
+ Returns the position of the vertex [code]idx[/code]. If the index is out of bounds, the function sends an error to the console, and returns [code](0, 0, 0)[/code].
</description>
</method>
<method name="get_point_tilt" qualifiers="const">
@@ -124,7 +124,7 @@
<argument index="0" name="idx" type="int">
</argument>
<description>
- Returns the tilt angle in radians for the point "idx". If the index is out of bounds, the function sends an error to the console, and returns 0.
+ Returns the tilt angle in radians for the point [code]idx[/code]. If the index is out of bounds, the function sends an error to the console, and returns [code]0[/code].
</description>
</method>
<method name="interpolate" qualifiers="const">
@@ -135,8 +135,8 @@
<argument index="1" name="t" type="float">
</argument>
<description>
- Returns the position between the vertex "idx" and the vertex "idx"+1, where "t" controls if the point is the first vertex (t = 0.0), the last vertex (t = 1.0), or in between. Values of "t" outside the range (0.0 &gt;= t &lt;=1) give strange, but predictable results.
- If "idx" is out of bounds it is truncated to the first or last vertex, and "t" is ignored. If the curve has no points, the function sends an error to the console, and returns (0, 0, 0).
+ Returns the position between the vertex [code]idx[/code] and the vertex [code]idx + 1[/code], where [code]t[/code] controls if the point is the first vertex ([code]t = 0.0[/code]), the last vertex ([code]t = 1.0[/code]), or in between. Values of [code]t[/code] outside the range ([code]0.0 &gt;= t &lt;=1[/code]) give strange, but predictable results.
+ If [code]idx[/code] is out of bounds it is truncated to the first or last vertex, and [code]t[/code] is ignored. If the curve has no points, the function sends an error to the console, and returns [code](0, 0, 0)[/code].
</description>
</method>
<method name="interpolate_baked" qualifiers="const">
@@ -147,8 +147,8 @@
<argument index="1" name="cubic" type="bool" default="false">
</argument>
<description>
- Returns a point within the curve at position "offset", where "offset" is measured as a distance in 3D units along the curve.
- To do that, it finds the two cached points where the "offset" lies between, then interpolates the values. This interpolation is cubic if "cubic" is set to true, or linear if set to false.
+ Returns a point within the curve at position [code]offset[/code], where [code]offset[/code] is measured as a pixel distance along the curve.
+ To do that, it finds the two cached points where the [code]offset[/code] lies between, then interpolates the values. This interpolation is cubic if [code]cubic[/code] is set to true, or linear if set to false.
Cubic interpolation tends to follow the curves better, but linear is faster (and often, precise enough).
</description>
</method>
@@ -162,7 +162,7 @@
<description>
Returns an up vector within the curve at position [code]offset[/code], where [code]offset[/code] is measured as a distance in 3D units along the curve.
To do that, it finds the two cached up vectors where the [code]offset[/code] lies between, then interpolates the values. If [code]apply_tilt[/code] is [code]true[/code], an interpolated tilt is applied to the interpolated up vector.
- If the curve has no up vectors, the function sends an error to the console, and returns (0, 1, 0).
+ If the curve has no up vectors, the function sends an error to the console, and returns [code](0, 1, 0)[/code].
</description>
</method>
<method name="interpolatef" qualifiers="const">
@@ -171,7 +171,7 @@
<argument index="0" name="fofs" type="float">
</argument>
<description>
- Returns the position at the vertex "fofs". It calls [method interpolate] using the integer part of fofs as "idx", and its fractional part as "t".
+ Returns the position at the vertex [code]fofs[/code]. It calls [method interpolate] using the integer part of [code]fofs[/code] as [code]idx[/code], and its fractional part as [code]t[/code].
</description>
</method>
<method name="remove_point">
@@ -180,7 +180,7 @@
<argument index="0" name="idx" type="int">
</argument>
<description>
- Deletes the point "idx" from the curve. Sends an error to the console if "idx" is out of bounds.
+ Deletes the point [code]idx[/code] from the curve. Sends an error to the console if [code]idx[/code] is out of bounds.
</description>
</method>
<method name="set_point_in">
@@ -191,7 +191,7 @@
<argument index="1" name="position" type="Vector3">
</argument>
<description>
- Sets the position of the control point leading to the vertex "idx". If the index is out of bounds, the function sends an error to the console.
+ Sets the position of the control point leading to the vertex [code]idx[/code]. If the index is out of bounds, the function sends an error to the console.
</description>
</method>
<method name="set_point_out">
@@ -202,7 +202,7 @@
<argument index="1" name="position" type="Vector3">
</argument>
<description>
- Sets the position of the control point leading out of the vertex "idx". If the index is out of bounds, the function sends an error to the console.
+ Sets the position of the control point leading out of the vertex [code]idx[/code]. If the index is out of bounds, the function sends an error to the console.
</description>
</method>
<method name="set_point_position">
@@ -213,7 +213,7 @@
<argument index="1" name="position" type="Vector3">
</argument>
<description>
- Sets the position for the vertex "idx". If the index is out of bounds, the function sends an error to the console.
+ Sets the position for the vertex [code]idx[/code]. If the index is out of bounds, the function sends an error to the console.
</description>
</method>
<method name="set_point_tilt">
@@ -224,8 +224,8 @@
<argument index="1" name="tilt" type="float">
</argument>
<description>
- Sets the tilt angle in radians for the point "idx". If the index is out of bounds, the function sends an error to the console.
- The tilt controls the rotation along the look-at axis an object traveling the path would have. In the case of a curve controlling a [PathFollow] or [OrientedPathFollow], this tilt is an offset over the natural tilt the [PathFollow] or [OrientedPathFollow] calculates.
+ Sets the tilt angle in radians for the point [code]idx[/code]. If the index is out of bounds, the function sends an error to the console.
+ The tilt controls the rotation along the look-at axis an object traveling the path would have. In the case of a curve controlling a [PathFollow], this tilt is an offset over the natural tilt the [PathFollow] calculates.
</description>
</method>
<method name="tessellate" qualifiers="const">
@@ -238,8 +238,8 @@
<description>
Returns a list of points along the curve, with a curvature controlled point density. That is, the curvier parts will have more points than the straighter parts.
This approximation makes straight segments between each point, then subdivides those segments until the resulting shape is similar enough.
- "max_stages" controls how many subdivisions a curve segment may face before it is considered approximate enough. Each subdivision splits the segment in half, so the default 5 stages may mean up to 32 subdivisions per curve segment. Increase with care!
- "tolerance_degrees" controls how many degrees the midpoint of a segment may deviate from the real curve, before the segment has to be subdivided.
+ [code]max_stages[/code] controls how many subdivisions a curve segment may face before it is considered approximate enough. Each subdivision splits the segment in half, so the default 5 stages may mean up to 32 subdivisions per curve segment. Increase with care!
+ [code]tolerance_degrees[/code] controls how many degrees the midpoint of a segment may deviate from the real curve, before the segment has to be subdivided.
</description>
</method>
</methods>
@@ -248,7 +248,7 @@
The distance in meters between two adjacent cached points. Changing it forces the cache to be recomputed the next time the [method get_baked_points] or [method get_baked_length] function is called. The smaller the distance, the more points in the cache and the more memory it will consume, so use with care.
</member>
<member name="up_vector_enabled" type="bool" setter="set_up_vector_enabled" getter="is_up_vector_enabled">
- If [code]true[/code], the curve will bake up vectors used for orientation. See [OrientedPathFollow]. Changing it forces the cache to be recomputed.
+ If [code]true[/code], the curve will bake up vectors used for orientation. This is used when a [member PathFollow.rotation_mode] is set to [code]ROTATION_ORIENTED[/code], see [PathFollow] for details. Changing it forces the cache to be recomputed.
</member>
</members>
<constants>
diff --git a/doc/classes/Dictionary.xml b/doc/classes/Dictionary.xml
index 06c996e13e..a9e2a38dcf 100644
--- a/doc/classes/Dictionary.xml
+++ b/doc/classes/Dictionary.xml
@@ -41,6 +41,17 @@
Erase a dictionary key/value pair by key.
</description>
</method>
+ <method name="get">
+ <return type="Variant">
+ </return>
+ <argument index="0" name="key" type="Variant">
+ </argument>
+ <argument index="1" name="default" type="Variant" default="Null">
+ </argument>
+ <description>
+ Returns the current value for the specified key in the [code]Dictionary[/code]. If the key does not exist, the method returns the value of the optional default argument, or Null if it is omitted.
+ </description>
+ </method>
<method name="has">
<return type="bool">
</return>
diff --git a/doc/classes/DirectionalLight.xml b/doc/classes/DirectionalLight.xml
index 86c8f2f03a..4a2802ffa4 100644
--- a/doc/classes/DirectionalLight.xml
+++ b/doc/classes/DirectionalLight.xml
@@ -18,7 +18,7 @@
Amount of extra bias for shadow splits that are far away. If self shadowing occurs only on the splits far away, this value can fix them.
</member>
<member name="directional_shadow_blend_splits" type="bool" setter="set_blend_splits" getter="is_blend_splits_enabled">
- If [code]true[/code] shadow detail is sacrificed in exchange for smoother transitions between splits. Default value:[code]false[/code].
+ If [code]true[/code], shadow detail is sacrificed in exchange for smoother transitions between splits. Default value:[code]false[/code].
</member>
<member name="directional_shadow_depth_range" type="int" setter="set_shadow_depth_range" getter="get_shadow_depth_range" enum="DirectionalLight.ShadowDepthRange">
Optimizes shadow rendering for detail versus movement. See [enum ShadowDepthRange].
@@ -33,13 +33,13 @@
Can be used to fix special cases of self shadowing when objects are perpendicular to the light.
</member>
<member name="directional_shadow_split_1" type="float" setter="set_param" getter="get_param">
- The distance from camera to shadow split 1. Relative to [member directional_shadow_max_distance]. Only used in [enum directional_shadow_mode] SHADOW_PARALLEL_*_SPLITS.
+ The distance from camera to shadow split 1. Relative to [member directional_shadow_max_distance]. Only used when [member directional_shadow_mode] is one of the [code]SHADOW_PARALLEL_*_SPLITS[/code] constants.
</member>
<member name="directional_shadow_split_2" type="float" setter="set_param" getter="get_param">
- The distance from shadow split 1 to split 2. Relative to [member directional_shadow_max_distance]. Only used in [enum directional_shadow_mode] SHADOW_PARALLEL_*_SPLITS.
+ The distance from shadow split 1 to split 2. Relative to [member directional_shadow_max_distance]. Only used when [member directional_shadow_mode] is [code]SHADOW_PARALLEL_3_SPLITS[/code] or [code]SHADOW_PARALLEL_4_SPLITS[/code].
</member>
<member name="directional_shadow_split_3" type="float" setter="set_param" getter="get_param">
- The distance from shadow split 2 to split 3. Relative to [member directional_shadow_max_distance]. Only used in [enum directional_shadow_mode] SHADOW_PARALLEL_4_SPLITS.
+ The distance from shadow split 2 to split 3. Relative to [member directional_shadow_max_distance]. Only used when [member directional_shadow_mode] is [code]SHADOW_PARALLEL_4_SPLITS[/code].
</member>
</members>
<constants>
diff --git a/doc/classes/DynamicFont.xml b/doc/classes/DynamicFont.xml
index 2e2904c16c..249d0955f2 100644
--- a/doc/classes/DynamicFont.xml
+++ b/doc/classes/DynamicFont.xml
@@ -81,10 +81,10 @@
The font size.
</member>
<member name="use_filter" type="bool" setter="set_use_filter" getter="get_use_filter">
- If [code]true[/code] filtering is used.
+ If [code]true[/code], filtering is used.
</member>
<member name="use_mipmaps" type="bool" setter="set_use_mipmaps" getter="get_use_mipmaps">
- If [code]true[/code] mipmapping is used.
+ If [code]true[/code], mipmapping is used.
</member>
</members>
<constants>
diff --git a/doc/classes/DynamicFontData.xml b/doc/classes/DynamicFontData.xml
index 7b34d02316..5fcccf7db9 100644
--- a/doc/classes/DynamicFontData.xml
+++ b/doc/classes/DynamicFontData.xml
@@ -13,6 +13,9 @@
<methods>
</methods>
<members>
+ <member name="antialiased" type="bool" setter="set_antialiased" getter="is_antialiased">
+ Controls whether the font should be rendered with anti-aliasing.
+ </member>
<member name="font_path" type="String" setter="set_font_path" getter="get_font_path">
The path to the vector font file.
</member>
diff --git a/doc/classes/EditorFileDialog.xml b/doc/classes/EditorFileDialog.xml
index fed9e264db..fc5a26fc33 100644
--- a/doc/classes/EditorFileDialog.xml
+++ b/doc/classes/EditorFileDialog.xml
@@ -55,7 +55,7 @@
The file system path in the address bar.
</member>
<member name="disable_overwrite_warning" type="bool" setter="set_disable_overwrite_warning" getter="is_overwrite_warning_disabled">
- If [code]true[/code] the [code]EditorFileDialog[/code] will not warn the user before overwriting files.
+ If [code]true[/code], the [code]EditorFileDialog[/code] will not warn the user before overwriting files.
</member>
<member name="display_mode" type="int" setter="set_display_mode" getter="get_display_mode" enum="EditorFileDialog.DisplayMode">
The view format in which the [code]EditorFileDialog[/code] displays resources to the user.
@@ -64,7 +64,7 @@
The purpose of the [code]EditorFileDialog[/code]. Changes allowed behaviors.
</member>
<member name="show_hidden_files" type="bool" setter="set_show_hidden_files" getter="is_showing_hidden_files">
- If [code]true[/code] hidden files and directories will be visible in the [code]EditorFileDialog[/code].
+ If [code]true[/code], hidden files and directories will be visible in the [code]EditorFileDialog[/code].
</member>
</members>
<signals>
diff --git a/doc/classes/EditorFileSystem.xml b/doc/classes/EditorFileSystem.xml
index 5a8b506f9e..91e5bd81c3 100644
--- a/doc/classes/EditorFileSystem.xml
+++ b/doc/classes/EditorFileSystem.xml
@@ -93,6 +93,12 @@
Remitted if a resource is reimported.
</description>
</signal>
+ <signal name="resources_reload">
+ <argument index="0" name="resources" type="PoolStringArray">
+ </argument>
+ <description>
+ </description>
+ </signal>
<signal name="sources_changed">
<argument index="0" name="exist" type="bool">
</argument>
diff --git a/doc/classes/EditorImportPlugin.xml b/doc/classes/EditorImportPlugin.xml
index 24201c39b9..9005d4a765 100644
--- a/doc/classes/EditorImportPlugin.xml
+++ b/doc/classes/EditorImportPlugin.xml
@@ -5,7 +5,7 @@
</brief_description>
<description>
EditorImportPlugins provide a way to extend the editor's resource import functionality. Use them to import resources from custom files or to provide alternatives to the editor's existing importers. Register your [EditorPlugin] with [method EditorPlugin.add_import_plugin].
- EditorImportPlugins work by associating with specific file extensions and a resource type. See [method get_recognized_extension] and [method get_resource_type]). They may optionally specify some import presets that affect the import process. EditorImportPlugins are responsible for creating the resources and saving them in the [code].import[/code] directory.
+ EditorImportPlugins work by associating with specific file extensions and a resource type. See [method get_recognized_extensions] and [method get_resource_type]). They may optionally specify some import presets that affect the import process. EditorImportPlugins are responsible for creating the resources and saving them in the [code].import[/code] directory.
Below is an example EditorImportPlugin that imports a [Mesh] from a file with the extension ".special" or ".spec":
[codeblock]
tool
@@ -35,7 +35,7 @@
func get_import_options(i):
return [{"name": "my_option", "default_value": false}]
- func import(source_file, save_path, options, r_platform_variants, r_gen_files):
+ func import(source_file, save_path, options, platform_variants, gen_files):
var file = File.new()
if file.open(source_file, File.READ) != OK:
return FAILED
@@ -60,7 +60,7 @@
<argument index="0" name="preset" type="int">
</argument>
<description>
- Get the options and default values for the preset at this index. Returns an Array of Dictionaries with the following keys: "name", "default_value", "property_hint" (optional), "hint_string" (optional), "usage" (optional).
+ Get the options and default values for the preset at this index. Returns an Array of Dictionaries with the following keys: [code]name[/code], [code]default_value[/code], [code]property_hint[/code] (optional), [code]hint_string[/code] (optional), [code]usage[/code] (optional).
</description>
</method>
<method name="get_import_order" qualifiers="virtual">
@@ -114,14 +114,14 @@
<return type="Array">
</return>
<description>
- Get the list of file extensions to associate with this loader (case insensitive). e.g. ["obj"].
+ Get the list of file extensions to associate with this loader (case insensitive). e.g. [code]["obj"][/code].
</description>
</method>
<method name="get_resource_type" qualifiers="virtual">
<return type="String">
</return>
<description>
- Get the Godot resource type associated with this loader. e.g. "Mesh" or "Animation".
+ Get the Godot resource type associated with this loader. e.g. [code]"Mesh"[/code] or [code]"Animation"[/code].
</description>
</method>
<method name="get_save_extension" qualifiers="virtual">
@@ -147,9 +147,9 @@
</argument>
<argument index="2" name="options" type="Dictionary">
</argument>
- <argument index="3" name="r_platform_variants" type="Array">
+ <argument index="3" name="platform_variants" type="Array">
</argument>
- <argument index="4" name="r_gen_files" type="Array">
+ <argument index="4" name="gen_files" type="Array">
</argument>
<description>
</description>
diff --git a/doc/classes/EditorInterface.xml b/doc/classes/EditorInterface.xml
index f073c5e40b..c7b81d7c75 100644
--- a/doc/classes/EditorInterface.xml
+++ b/doc/classes/EditorInterface.xml
@@ -159,7 +159,7 @@
<method name="select_file">
<return type="void">
</return>
- <argument index="0" name="p_file" type="String">
+ <argument index="0" name="file" type="String">
</argument>
<description>
</description>
diff --git a/doc/classes/EditorPlugin.xml b/doc/classes/EditorPlugin.xml
index feaa24b0ab..bcf6d3009c 100644
--- a/doc/classes/EditorPlugin.xml
+++ b/doc/classes/EditorPlugin.xml
@@ -7,7 +7,7 @@
Plugins are used by the editor to extend functionality. The most common types of plugins are those which edit a given node or resource type, import plugins and export plugins. Also see [EditorScript] to add functions to the editor.
</description>
<tutorials>
- <link>https://docs.godotengine.org/en/latest/development/plugins/index.html</link>
+ <link>https://docs.godotengine.org/en/latest/tutorials/plugins/editor/index.html</link>
</tutorials>
<demos>
</demos>
@@ -110,6 +110,14 @@
<description>
</description>
</method>
+ <method name="add_spatial_gizmo_plugin">
+ <return type="void">
+ </return>
+ <argument index="0" name="plugin" type="EditorSpatialGizmoPlugin">
+ </argument>
+ <description>
+ </description>
+ </method>
<method name="add_tool_menu_item">
<return type="void">
</return>
@@ -157,6 +165,12 @@
Clear all the state and reset the object being edited to zero. This ensures your plugin does not keep editing a currently existing node, or a node from the wrong scene.
</description>
</method>
+ <method name="disable_plugin" qualifiers="virtual">
+ <return type="void">
+ </return>
+ <description>
+ </description>
+ </method>
<method name="edit" qualifiers="virtual">
<return type="void">
</return>
@@ -166,6 +180,12 @@
This function is used for plugins that edit specific object types (nodes or resources). It requests the editor to edit the given object.
</description>
</method>
+ <method name="enable_plugin" qualifiers="virtual">
+ <return type="void">
+ </return>
+ <description>
+ </description>
+ </method>
<method name="forward_canvas_draw_over_viewport" qualifiers="virtual">
<return type="void">
</return>
@@ -394,6 +414,14 @@
<description>
</description>
</method>
+ <method name="remove_spatial_gizmo_plugin">
+ <return type="void">
+ </return>
+ <argument index="0" name="plugin" type="EditorSpatialGizmoPlugin">
+ </argument>
+ <description>
+ </description>
+ </method>
<method name="remove_tool_menu_item">
<return type="void">
</return>
diff --git a/doc/classes/EditorScenePostImport.xml b/doc/classes/EditorScenePostImport.xml
index 0c5de68d98..e69f3b0119 100644
--- a/doc/classes/EditorScenePostImport.xml
+++ b/doc/classes/EditorScenePostImport.xml
@@ -20,7 +20,7 @@
func iterate(node):
if node != null:
- node.name = "modified_"+node.name
+ node.name = "modified_" + node.name
for child in node.get_children():
iterate(child)
[/codeblock]
diff --git a/doc/classes/EditorSpatialGizmo.xml b/doc/classes/EditorSpatialGizmo.xml
index 2081ae7a4d..c3ecd3c3b7 100644
--- a/doc/classes/EditorSpatialGizmo.xml
+++ b/doc/classes/EditorSpatialGizmo.xml
@@ -4,7 +4,7 @@
Custom gizmo for editing Spatial objects.
</brief_description>
<description>
- Custom gizmo that is used for providing custom visualization and editing (handles) for 3D Spatial objects. These are created by [method EditorPlugin.create_spatial_gizmo].
+ Custom gizmo that is used for providing custom visualization and editing (handles) for 3D Spatial objects. These are created by [method EditorSpatialGizmoPlugin.create_gizmo].
</description>
<tutorials>
</tutorials>
diff --git a/doc/classes/EditorSpatialGizmoPlugin.xml b/doc/classes/EditorSpatialGizmoPlugin.xml
new file mode 100644
index 0000000000..521ec748b3
--- /dev/null
+++ b/doc/classes/EditorSpatialGizmoPlugin.xml
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="EditorSpatialGizmoPlugin" inherits="Resource" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ <method name="add_material">
+ <return type="void">
+ </return>
+ <argument index="0" name="name" type="String">
+ </argument>
+ <argument index="1" name="material" type="SpatialMaterial">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="can_be_hidden" qualifiers="virtual">
+ <return type="bool">
+ </return>
+ <description>
+ </description>
+ </method>
+ <method name="commit_handle" qualifiers="virtual">
+ <return type="void">
+ </return>
+ <argument index="0" name="gizmo" type="EditorSpatialGizmo">
+ </argument>
+ <argument index="1" name="index" type="int">
+ </argument>
+ <argument index="2" name="restore" type="Variant">
+ </argument>
+ <argument index="3" name="cancel" type="bool" default="false">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="create_gizmo" qualifiers="virtual">
+ <return type="EditorSpatialGizmo">
+ </return>
+ <argument index="0" name="spatial" type="Spatial">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="create_handle_material">
+ <return type="void">
+ </return>
+ <argument index="0" name="name" type="String">
+ </argument>
+ <argument index="1" name="billboard" type="bool" default="false">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="create_icon_material">
+ <return type="void">
+ </return>
+ <argument index="0" name="name" type="String">
+ </argument>
+ <argument index="1" name="texture" type="Texture">
+ </argument>
+ <argument index="2" name="on_top" type="bool" default="false">
+ </argument>
+ <argument index="3" name="color" type="Color" default="Color( 1, 1, 1, 1 )">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="create_material">
+ <return type="void">
+ </return>
+ <argument index="0" name="name" type="String">
+ </argument>
+ <argument index="1" name="color" type="Color">
+ </argument>
+ <argument index="2" name="billboard" type="bool" default="false">
+ </argument>
+ <argument index="3" name="on_top" type="bool" default="false">
+ </argument>
+ <argument index="4" name="use_vertex_color" type="bool" default="false">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="get_handle_name" qualifiers="virtual">
+ <return type="String">
+ </return>
+ <argument index="0" name="gizmo" type="EditorSpatialGizmo">
+ </argument>
+ <argument index="1" name="index" type="int">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="get_handle_value" qualifiers="virtual">
+ <return type="Variant">
+ </return>
+ <argument index="0" name="gizmo" type="EditorSpatialGizmo">
+ </argument>
+ <argument index="1" name="index" type="int">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="get_material">
+ <return type="SpatialMaterial">
+ </return>
+ <argument index="0" name="name" type="String">
+ </argument>
+ <argument index="1" name="gizmo" type="EditorSpatialGizmo">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="get_name" qualifiers="virtual">
+ <return type="String">
+ </return>
+ <description>
+ </description>
+ </method>
+ <method name="has_gizmo" qualifiers="virtual">
+ <return type="bool">
+ </return>
+ <argument index="0" name="spatial" type="Spatial">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="is_gizmo_handle_highlighted" qualifiers="virtual">
+ <return type="bool">
+ </return>
+ <argument index="0" name="gizmo" type="EditorSpatialGizmo">
+ </argument>
+ <argument index="1" name="index" type="int">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="is_selectable_when_hidden" qualifiers="virtual">
+ <return type="bool">
+ </return>
+ <description>
+ </description>
+ </method>
+ <method name="redraw" qualifiers="virtual">
+ <return type="void">
+ </return>
+ <argument index="0" name="gizmo" type="EditorSpatialGizmo">
+ </argument>
+ <description>
+ </description>
+ </method>
+ <method name="set_handle" qualifiers="virtual">
+ <return type="void">
+ </return>
+ <argument index="0" name="gizmo" type="EditorSpatialGizmo">
+ </argument>
+ <argument index="1" name="index" type="int">
+ </argument>
+ <argument index="2" name="camera" type="Camera">
+ </argument>
+ <argument index="3" name="point" type="Vector2">
+ </argument>
+ <description>
+ </description>
+ </method>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/Environment.xml b/doc/classes/Environment.xml
index 4c2c83e55f..ced9ab7269 100644
--- a/doc/classes/Environment.xml
+++ b/doc/classes/Environment.xml
@@ -5,7 +5,6 @@
</brief_description>
<description>
Resource for environment nodes (like [WorldEnvironment]) that define multiple environment operations (such as background [Sky] or [Color], ambient light, fog, depth-of-field...). These parameters affect the final render of the scene. The order of these operations is:
-
- DOF Blur
- Motion Blur
- Bloom
@@ -78,6 +77,15 @@
<member name="background_sky_custom_fov" type="float" setter="set_sky_custom_fov" getter="get_sky_custom_fov">
[Sky] resource's custom field of view.
</member>
+ <member name="background_sky_orientation" type="Basis" setter="set_sky_orientation" getter="get_sky_orientation">
+ [Sky] resource's rotation expressed as a [Basis]
+ </member>
+ <member name="background_sky_rotation" type="Vector3" setter="set_sky_rotation" getter="get_sky_rotation">
+ [Sky] resource's rotation expressed as euler angles in radians
+ </member>
+ <member name="background_sky_rotation_degrees" type="Vector3" setter="set_sky_rotation_degrees" getter="get_sky_rotation_degrees">
+ [Sky] resource's rotation expressed as euler angles in degrees
+ </member>
<member name="dof_blur_far_amount" type="float" setter="set_dof_blur_far_amount" getter="get_dof_blur_far_amount">
Amount of far blur.
</member>
@@ -120,6 +128,8 @@
<member name="fog_depth_enabled" type="bool" setter="set_fog_depth_enabled" getter="is_fog_depth_enabled">
Enables the fog depth.
</member>
+ <member name="fog_depth_end" type="float" setter="set_fog_depth_end" getter="get_fog_depth_end">
+ </member>
<member name="fog_enabled" type="bool" setter="set_fog_enabled" getter="is_fog_enabled">
Enables the fog. Needs fog_height_enabled and/or for_depth_enabled to actually display fog.
</member>
@@ -158,6 +168,8 @@
<member name="glow_enabled" type="bool" setter="set_glow_enabled" getter="is_glow_enabled">
Enables glow rendering.
</member>
+ <member name="glow_hdr_luminance_cap" type="float" setter="set_glow_hdr_luminance_cap" getter="get_glow_hdr_luminance_cap">
+ </member>
<member name="glow_hdr_scale" type="float" setter="set_glow_hdr_bleed_scale" getter="get_glow_hdr_bleed_scale">
Bleed scale of the HDR glow.
</member>
diff --git a/doc/classes/File.xml b/doc/classes/File.xml
index 1745389833..1967349546 100644
--- a/doc/classes/File.xml
+++ b/doc/classes/File.xml
@@ -330,7 +330,7 @@
<method name="store_csv_line">
<return type="void">
</return>
- <argument index="0" name="values" type="PoolStringArray" default="&quot;,&quot;">
+ <argument index="0" name="values" type="PoolStringArray">
</argument>
<argument index="1" name="delim" type="String" default="&quot;,&quot;">
</argument>
@@ -404,7 +404,7 @@
</methods>
<members>
<member name="endian_swap" type="bool" setter="set_endian_swap" getter="get_endian_swap">
- If [code]true[/code] the file's endianness is swapped. Use this if you're dealing with files written in big endian machines.
+ If [code]true[/code], the file's endianness is swapped. Use this if you're dealing with files written in big endian machines.
Note that this is about the file format, not CPU type. This is always reset to [code]false[/code] whenever you open the file.
</member>
</members>
diff --git a/doc/classes/FileDialog.xml b/doc/classes/FileDialog.xml
index 29aa26b67f..0af645975a 100644
--- a/doc/classes/FileDialog.xml
+++ b/doc/classes/FileDialog.xml
@@ -76,7 +76,7 @@
Set dialog to open or save mode, changes selection behavior. See enum [code]Mode[/code] constants.
</member>
<member name="mode_overrides_title" type="bool" setter="set_mode_overrides_title" getter="is_mode_overriding_title">
- If [code]true[/code], changing the [code]Mode[/code] property will set the window title accordingly (e. g. setting mode to [code]MODE_OPEN_FILE[/code] will change the window title to "Open a File").
+ If [code]true[/code], changing the [code]Mode[/code] property will set the window title accordingly (e.g. setting mode to [code]MODE_OPEN_FILE[/code] will change the window title to "Open a File").
</member>
<member name="show_hidden_files" type="bool" setter="set_show_hidden_files" getter="is_showing_hidden_files">
If [code]true[/code], the dialog will show hidden files.
diff --git a/doc/classes/GDNativeLibraryResourceLoader.xml b/doc/classes/GDNativeLibraryResourceLoader.xml
new file mode 100644
index 0000000000..865381667d
--- /dev/null
+++ b/doc/classes/GDNativeLibraryResourceLoader.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="GDNativeLibraryResourceLoader" inherits="ResourceFormatLoader" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/GDNativeLibraryResourceSaver.xml b/doc/classes/GDNativeLibraryResourceSaver.xml
new file mode 100644
index 0000000000..39f423d762
--- /dev/null
+++ b/doc/classes/GDNativeLibraryResourceSaver.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="GDNativeLibraryResourceSaver" inherits="ResourceFormatSaver" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/Generic6DOFJoint.xml b/doc/classes/Generic6DOFJoint.xml
index 0863ead4ec..95f9a76662 100644
--- a/doc/classes/Generic6DOFJoint.xml
+++ b/doc/classes/Generic6DOFJoint.xml
@@ -18,7 +18,7 @@
The lower, the longer an impulse from one side takes to travel to the other side.
</member>
<member name="angular_limit_x/enabled" type="bool" setter="set_flag_x" getter="get_flag_x">
- If [code]true[/code] rotation across the x-axis is limited.
+ If [code]true[/code], rotation across the x-axis is limited.
</member>
<member name="angular_limit_x/erp" type="float" setter="set_param_x" getter="get_param_x">
When rotating across x-axis, this error tolerance factor defines how much the correction gets slowed down. The lower, the slower.
@@ -42,7 +42,7 @@
The amount of rotational damping across the y-axis. The lower, the more dampening occurs.
</member>
<member name="angular_limit_y/enabled" type="bool" setter="set_flag_y" getter="get_flag_y">
- If [code]true[/code] rotation across the y-axis is limited.
+ If [code]true[/code], rotation across the y-axis is limited.
</member>
<member name="angular_limit_y/erp" type="float" setter="set_param_y" getter="get_param_y">
When rotating across y-axis, this error tolerance factor defines how much the correction gets slowed down. The lower, the slower.
@@ -66,7 +66,7 @@
The amount of rotational damping across the z-axis. The lower, the more dampening occurs.
</member>
<member name="angular_limit_z/enabled" type="bool" setter="set_flag_z" getter="get_flag_z">
- If [code]true[/code] rotation across the z-axis is limited.
+ If [code]true[/code], rotation across the z-axis is limited.
</member>
<member name="angular_limit_z/erp" type="float" setter="set_param_z" getter="get_param_z">
When rotating across z-axis, this error tolerance factor defines how much the correction gets slowed down. The lower, the slower.
@@ -87,7 +87,7 @@
The minimum rotation in positive direction to break loose and rotate around the z-axis.
</member>
<member name="angular_motor_x/enabled" type="bool" setter="set_flag_x" getter="get_flag_x">
- If [code]true[/code] a rotating motor at the x-axis is enabled.
+ If [code]true[/code], a rotating motor at the x-axis is enabled.
</member>
<member name="angular_motor_x/force_limit" type="float" setter="set_param_x" getter="get_param_x">
Maximum acceleration for the motor at the x-axis.
@@ -96,7 +96,7 @@
Target speed for the motor at the x-axis.
</member>
<member name="angular_motor_y/enabled" type="bool" setter="set_flag_y" getter="get_flag_y">
- If [code]true[/code] a rotating motor at the y-axis is enabled.
+ If [code]true[/code], a rotating motor at the y-axis is enabled.
</member>
<member name="angular_motor_y/force_limit" type="float" setter="set_param_y" getter="get_param_y">
Maximum acceleration for the motor at the y-axis.
@@ -105,7 +105,7 @@
Target speed for the motor at the y-axis.
</member>
<member name="angular_motor_z/enabled" type="bool" setter="set_flag_z" getter="get_flag_z">
- If [code]true[/code] a rotating motor at the z-axis is enabled.
+ If [code]true[/code], a rotating motor at the z-axis is enabled.
</member>
<member name="angular_motor_z/force_limit" type="float" setter="set_param_z" getter="get_param_z">
Maximum acceleration for the motor at the z-axis.
@@ -113,11 +113,35 @@
<member name="angular_motor_z/target_velocity" type="float" setter="set_param_z" getter="get_param_z">
Target speed for the motor at the z-axis.
</member>
+ <member name="angular_spring_x/damping" type="float" setter="set_param_x" getter="get_param_x">
+ </member>
+ <member name="angular_spring_x/enabled" type="bool" setter="set_flag_x" getter="get_flag_x">
+ </member>
+ <member name="angular_spring_x/equilibrium_point" type="float" setter="set_param_x" getter="get_param_x">
+ </member>
+ <member name="angular_spring_x/stiffness" type="float" setter="set_param_x" getter="get_param_x">
+ </member>
+ <member name="angular_spring_y/damping" type="float" setter="set_param_y" getter="get_param_y">
+ </member>
+ <member name="angular_spring_y/enabled" type="bool" setter="set_flag_y" getter="get_flag_y">
+ </member>
+ <member name="angular_spring_y/equilibrium_point" type="float" setter="set_param_y" getter="get_param_y">
+ </member>
+ <member name="angular_spring_y/stiffness" type="float" setter="set_param_y" getter="get_param_y">
+ </member>
+ <member name="angular_spring_z/damping" type="float" setter="set_param_z" getter="get_param_z">
+ </member>
+ <member name="angular_spring_z/enabled" type="bool" setter="set_flag_z" getter="get_flag_z">
+ </member>
+ <member name="angular_spring_z/equilibrium_point" type="float" setter="set_param_z" getter="get_param_z">
+ </member>
+ <member name="angular_spring_z/stiffness" type="float" setter="set_param_z" getter="get_param_z">
+ </member>
<member name="linear_limit_x/damping" type="float" setter="set_param_x" getter="get_param_x">
The amount of damping that happens at the x-motion.
</member>
<member name="linear_limit_x/enabled" type="bool" setter="set_flag_x" getter="get_flag_x">
- If [code]true[/code] the linear motion across the x-axis is limited.
+ If [code]true[/code], the linear motion across the x-axis is limited.
</member>
<member name="linear_limit_x/lower_distance" type="float" setter="set_param_x" getter="get_param_x">
The minimum difference between the pivot points' x-axis.
@@ -135,7 +159,7 @@
The amount of damping that happens at the y-motion.
</member>
<member name="linear_limit_y/enabled" type="bool" setter="set_flag_y" getter="get_flag_y">
- If [code]true[/code] the linear motion across the y-axis is limited.
+ If [code]true[/code], the linear motion across the y-axis is limited.
</member>
<member name="linear_limit_y/lower_distance" type="float" setter="set_param_y" getter="get_param_y">
The minimum difference between the pivot points' y-axis.
@@ -153,7 +177,7 @@
The amount of damping that happens at the z-motion.
</member>
<member name="linear_limit_z/enabled" type="bool" setter="set_flag_z" getter="get_flag_z">
- If [code]true[/code] the linear motion across the z-axis is limited.
+ If [code]true[/code], the linear motion across the z-axis is limited.
</member>
<member name="linear_limit_z/lower_distance" type="float" setter="set_param_z" getter="get_param_z">
The minimum difference between the pivot points' z-axis.
@@ -168,7 +192,7 @@
The maximum difference between the pivot points' z-axis.
</member>
<member name="linear_motor_x/enabled" type="bool" setter="set_flag_x" getter="get_flag_x">
- If [code]true[/code] then there is a linear motor on the x-axis. It will attempt to reach the target velocity while staying within the force limits.
+ If [code]true[/code], then there is a linear motor on the x-axis. It will attempt to reach the target velocity while staying within the force limits.
</member>
<member name="linear_motor_x/force_limit" type="float" setter="set_param_x" getter="get_param_x">
The maximum force the linear motor can apply on the x-axis while trying to reach the target velocity.
@@ -177,7 +201,7 @@
The speed that the linear motor will attempt to reach on the x-axis.
</member>
<member name="linear_motor_y/enabled" type="bool" setter="set_flag_y" getter="get_flag_y">
- If [code]true[/code] then there is a linear motor on the y-axis. It will attempt to reach the target velocity while staying within the force limits.
+ If [code]true[/code], then there is a linear motor on the y-axis. It will attempt to reach the target velocity while staying within the force limits.
</member>
<member name="linear_motor_y/force_limit" type="float" setter="set_param_y" getter="get_param_y">
The maximum force the linear motor can apply on the y-axis while trying to reach the target velocity.
@@ -186,7 +210,7 @@
The speed that the linear motor will attempt to reach on the y-axis.
</member>
<member name="linear_motor_z/enabled" type="bool" setter="set_flag_z" getter="get_flag_z">
- If [code]true[/code] then there is a linear motor on the z-axis. It will attempt to reach the target velocity while staying within the force limits.
+ If [code]true[/code], then there is a linear motor on the z-axis. It will attempt to reach the target velocity while staying within the force limits.
</member>
<member name="linear_motor_z/force_limit" type="float" setter="set_param_z" getter="get_param_z">
The maximum force the linear motor can apply on the z-axis while trying to reach the target velocity.
@@ -194,6 +218,32 @@
<member name="linear_motor_z/target_velocity" type="float" setter="set_param_z" getter="get_param_z">
The speed that the linear motor will attempt to reach on the z-axis.
</member>
+ <member name="linear_spring_x/damping" type="float" setter="set_param_x" getter="get_param_x">
+ </member>
+ <member name="linear_spring_x/enabled" type="bool" setter="set_flag_x" getter="get_flag_x">
+ </member>
+ <member name="linear_spring_x/equilibrium_point" type="float" setter="set_param_x" getter="get_param_x">
+ </member>
+ <member name="linear_spring_x/stiffness" type="float" setter="set_param_x" getter="get_param_x">
+ </member>
+ <member name="linear_spring_y/damping" type="float" setter="set_param_y" getter="get_param_y">
+ </member>
+ <member name="linear_spring_y/enabled" type="bool" setter="set_flag_y" getter="get_flag_y">
+ </member>
+ <member name="linear_spring_y/equilibrium_point" type="float" setter="set_param_y" getter="get_param_y">
+ </member>
+ <member name="linear_spring_y/stiffness" type="float" setter="set_param_y" getter="get_param_y">
+ </member>
+ <member name="linear_spring_z/damping" type="float" setter="set_param_z" getter="get_param_z">
+ </member>
+ <member name="linear_spring_z/enabled" type="bool" setter="set_flag_z" getter="get_flag_z">
+ </member>
+ <member name="linear_spring_z/equilibrium_point" type="float" setter="set_param_z" getter="get_param_z">
+ </member>
+ <member name="linear_spring_z/stiffness" type="float" setter="set_param_z" getter="get_param_z">
+ </member>
+ <member name="precision" type="int" setter="set_precision" getter="get_precision">
+ </member>
</members>
<constants>
<constant name="PARAM_LINEAR_LOWER_LIMIT" value="0" enum="Param">
@@ -217,34 +267,34 @@
<constant name="PARAM_LINEAR_MOTOR_FORCE_LIMIT" value="6" enum="Param">
The maximum force the linear motor will apply while trying to reach the velocity target.
</constant>
- <constant name="PARAM_ANGULAR_LOWER_LIMIT" value="7" enum="Param">
+ <constant name="PARAM_ANGULAR_LOWER_LIMIT" value="10" enum="Param">
The minimum rotation in negative direction to break loose and rotate around the axes.
</constant>
- <constant name="PARAM_ANGULAR_UPPER_LIMIT" value="8" enum="Param">
+ <constant name="PARAM_ANGULAR_UPPER_LIMIT" value="11" enum="Param">
The minimum rotation in positive direction to break loose and rotate around the axes.
</constant>
- <constant name="PARAM_ANGULAR_LIMIT_SOFTNESS" value="9" enum="Param">
+ <constant name="PARAM_ANGULAR_LIMIT_SOFTNESS" value="12" enum="Param">
The speed of all rotations across the axes.
</constant>
- <constant name="PARAM_ANGULAR_DAMPING" value="10" enum="Param">
+ <constant name="PARAM_ANGULAR_DAMPING" value="13" enum="Param">
The amount of rotational damping across the axes. The lower, the more dampening occurs.
</constant>
- <constant name="PARAM_ANGULAR_RESTITUTION" value="11" enum="Param">
+ <constant name="PARAM_ANGULAR_RESTITUTION" value="14" enum="Param">
The amount of rotational restitution across the axes. The lower, the more restitution occurs.
</constant>
- <constant name="PARAM_ANGULAR_FORCE_LIMIT" value="12" enum="Param">
+ <constant name="PARAM_ANGULAR_FORCE_LIMIT" value="15" enum="Param">
The maximum amount of force that can occur, when rotating around the axes.
</constant>
- <constant name="PARAM_ANGULAR_ERP" value="13" enum="Param">
+ <constant name="PARAM_ANGULAR_ERP" value="16" enum="Param">
When rotating across the axes, this error tolerance factor defines how much the correction gets slowed down. The lower, the slower.
</constant>
- <constant name="PARAM_ANGULAR_MOTOR_TARGET_VELOCITY" value="14" enum="Param">
+ <constant name="PARAM_ANGULAR_MOTOR_TARGET_VELOCITY" value="17" enum="Param">
Target speed for the motor at the axes.
</constant>
- <constant name="PARAM_ANGULAR_MOTOR_FORCE_LIMIT" value="15" enum="Param">
+ <constant name="PARAM_ANGULAR_MOTOR_FORCE_LIMIT" value="18" enum="Param">
Maximum acceleration for the motor at the axes.
</constant>
- <constant name="PARAM_MAX" value="16" enum="Param">
+ <constant name="PARAM_MAX" value="22" enum="Param">
End flag of PARAM_* constants, used internally.
</constant>
<constant name="FLAG_ENABLE_LINEAR_LIMIT" value="0" enum="Flag">
@@ -253,12 +303,16 @@
<constant name="FLAG_ENABLE_ANGULAR_LIMIT" value="1" enum="Flag">
If [code]set[/code] there is rotational motion possible.
</constant>
- <constant name="FLAG_ENABLE_MOTOR" value="2" enum="Flag">
+ <constant name="FLAG_ENABLE_LINEAR_SPRING" value="3" enum="Flag">
+ </constant>
+ <constant name="FLAG_ENABLE_ANGULAR_SPRING" value="2" enum="Flag">
+ </constant>
+ <constant name="FLAG_ENABLE_MOTOR" value="4" enum="Flag">
If [code]set[/code] there is a rotational motor across these axes.
</constant>
- <constant name="FLAG_ENABLE_LINEAR_MOTOR" value="3" enum="Flag">
+ <constant name="FLAG_ENABLE_LINEAR_MOTOR" value="5" enum="Flag">
</constant>
- <constant name="FLAG_MAX" value="4" enum="Flag">
+ <constant name="FLAG_MAX" value="6" enum="Flag">
End flag of FLAG_* constants, used internally.
</constant>
</constants>
diff --git a/doc/classes/GeometryInstance.xml b/doc/classes/GeometryInstance.xml
index 8831805dde..d6267044f7 100644
--- a/doc/classes/GeometryInstance.xml
+++ b/doc/classes/GeometryInstance.xml
@@ -36,7 +36,7 @@
If there is a material in material_override, it will be used instead of any material set in any material slot of the mesh.
</member>
<member name="use_in_baked_light" type="bool" setter="set_flag" getter="get_flag">
- If [code]true[/code] this GeometryInstance will be used when baking lights using a [GIProbe] and/or any other form of baked lighting.
+ If [code]true[/code], this GeometryInstance will be used when baking lights using a [GIProbe] and/or any other form of baked lighting.
</member>
</members>
<constants>
diff --git a/doc/classes/GradientTexture.xml b/doc/classes/GradientTexture.xml
index 9d2465e23d..d064e15e17 100644
--- a/doc/classes/GradientTexture.xml
+++ b/doc/classes/GradientTexture.xml
@@ -4,7 +4,7 @@
Gradient filled texture.
</brief_description>
<description>
- Uses a [Gradient] to fill the texture data, the gradient will be filled from left to right using colors obtained from the gradient, this means that the texture does not necessarily represent an exact copy of the gradient, but instead an interpolation of samples obtained from the gradient at fixed steps (see [method set_width]).
+ Uses a [Gradient] to fill the texture data, the gradient will be filled from left to right using colors obtained from the gradient, this means that the texture does not necessarily represent an exact copy of the gradient, but instead an interpolation of samples obtained from the gradient at fixed steps (see [member width]).
</description>
<tutorials>
</tutorials>
diff --git a/doc/classes/GraphEdit.xml b/doc/classes/GraphEdit.xml
index ce0b619d67..715c23d869 100644
--- a/doc/classes/GraphEdit.xml
+++ b/doc/classes/GraphEdit.xml
@@ -5,7 +5,7 @@
</brief_description>
<description>
GraphEdit manages the showing of GraphNodes it contains, as well as connections and disconnections between them. Signals are sent for each of these two events. Disconnection between GraphNodes slots is disabled by default.
- It is greatly advised to enable low processor usage mode (see [method OS.set_low_processor_usage_mode]) when using GraphEdits.
+ It is greatly advised to enable low processor usage mode (see [member OS.low_processor_usage_mode]) when using GraphEdits.
</description>
<tutorials>
</tutorials>
@@ -82,7 +82,7 @@
<return type="Array">
</return>
<description>
- Return an Array containing the list of connections. A connection consists in a structure of the form {from_slot: 0, from: "GraphNode name 0", to_slot: 1, to: "GraphNode name 1" }
+ Return an Array containing the list of connections. A connection consists in a structure of the form {from_port: 0, from: "GraphNode name 0", to_port: 1, to: "GraphNode name 1" }
</description>
</method>
<method name="get_zoom_hbox">
@@ -254,7 +254,7 @@
</description>
</signal>
<signal name="popup_request">
- <argument index="0" name="p_position" type="Vector2">
+ <argument index="0" name="position" type="Vector2">
</argument>
<description>
Signal sent when a popup is requested. Happens on right-clicking in the GraphEdit. 'p_position' is the position of the mouse pointer when the signal is sent.
diff --git a/doc/classes/GraphNode.xml b/doc/classes/GraphNode.xml
index 4c39720d69..6e09926c11 100644
--- a/doc/classes/GraphNode.xml
+++ b/doc/classes/GraphNode.xml
@@ -236,6 +236,8 @@
</theme_item>
<theme_item name="close" type="Texture">
</theme_item>
+ <theme_item name="close_color" type="Color">
+ </theme_item>
<theme_item name="close_offset" type="int">
</theme_item>
<theme_item name="comment" type="StyleBox">
diff --git a/doc/classes/GridContainer.xml b/doc/classes/GridContainer.xml
index 346ab9d357..a304f34ed2 100644
--- a/doc/classes/GridContainer.xml
+++ b/doc/classes/GridContainer.xml
@@ -4,7 +4,7 @@
Grid container used to arrange elements in a grid like layout.
</brief_description>
<description>
- Grid container will arrange its children in a grid like structure, the grid columns are specified using the [method set_columns] method and the number of rows will be equal to the number of children in the container divided by the number of columns, for example: if the container has 5 children, and 2 columns, there will be 3 rows in the container. Notice that grid layout will preserve the columns and rows for every size of the container.
+ Grid container will arrange its children in a grid like structure, the grid columns are specified using the [member columns] property and the number of rows will be equal to the number of children in the container divided by the number of columns, for example: if the container has 5 children, and 2 columns, there will be 3 rows in the container. Notice that grid layout will preserve the columns and rows for every size of the container.
</description>
<tutorials>
</tutorials>
diff --git a/doc/classes/HTTPClient.xml b/doc/classes/HTTPClient.xml
index 2f21505757..5436e2b1eb 100644
--- a/doc/classes/HTTPClient.xml
+++ b/doc/classes/HTTPClient.xml
@@ -82,14 +82,14 @@
<return type="bool">
</return>
<description>
- If [code]true[/code] this [code]HTTPClient[/code] has a response available.
+ If [code]true[/code], this [code]HTTPClient[/code] has a response available.
</description>
</method>
<method name="is_response_chunked" qualifiers="const">
<return type="bool">
</return>
<description>
- If [code]true[/code] this [code]HTTPClient[/code] has a response that is chunked.
+ If [code]true[/code], this [code]HTTPClient[/code] has a response that is chunked.
</description>
</method>
<method name="poll">
@@ -108,14 +108,14 @@
Generates a GET/POST application/x-www-form-urlencoded style query string from a provided dictionary, e.g.:
[codeblock]
var fields = {"username": "user", "password": "pass"}
- String queryString = httpClient.query_string_from_dict(fields)
- returns:= "username=user&amp;password=pass"
+ String query_string = http_client.query_string_from_dict(fields)
+ # returns: "username=user&amp;password=pass"
[/codeblock]
Furthermore, if a key has a null value, only the key itself is added, without equal sign and value. If the value is an array, for each value in it a pair with the same key is added.
[codeblock]
var fields = {"single": 123, "not_valued": null, "multiple": [22, 33, 44]}
- String queryString = httpClient.query_string_from_dict(fields)
- returns:= "single=123&amp;not_valued&amp;multiple=22&amp;multiple=33&amp;multiple=44"
+ String query_string = http_client.query_string_from_dict(fields)
+ # returns: "single=123&amp;not_valued&amp;multiple=22&amp;multiple=33&amp;multiple=44"
[/codeblock]
</description>
</method>
@@ -143,9 +143,9 @@
To create a POST request with query strings to push to the server, do:
[codeblock]
var fields = {"username" : "user", "password" : "pass"}
- var queryString = httpClient.query_string_from_dict(fields)
- var headers = ["Content-Type: application/x-www-form-urlencoded", "Content-Length: " + str(queryString.length())]
- var result = httpClient.request(httpClient.METHOD_POST, "index.php", headers, queryString)
+ var query_string = http_client.query_string_from_dict(fields)
+ var headers = ["Content-Type: application/x-www-form-urlencoded", "Content-Length: " + str(query_string.length())]
+ var result = http_client.request(http_client.METHOD_POST, "index.php", headers, query_string)
[/codeblock]
</description>
</method>
diff --git a/doc/classes/HTTPRequest.xml b/doc/classes/HTTPRequest.xml
index 3916eb2b5b..3271fef8e3 100644
--- a/doc/classes/HTTPRequest.xml
+++ b/doc/classes/HTTPRequest.xml
@@ -71,7 +71,7 @@
Maximum number of allowed redirects.
</member>
<member name="use_threads" type="bool" setter="set_use_threads" getter="is_using_threads">
- If [code]true[/code] multithreading is used to improve performance.
+ If [code]true[/code], multithreading is used to improve performance.
</member>
</members>
<signals>
@@ -102,16 +102,16 @@
Request failed while resolving.
</constant>
<constant name="RESULT_CONNECTION_ERROR" value="4" enum="Result">
- Request failed due to connection(read/write) error.
+ Request failed due to connection (read/write) error.
</constant>
<constant name="RESULT_SSL_HANDSHAKE_ERROR" value="5" enum="Result">
Request failed on SSL handshake.
</constant>
<constant name="RESULT_NO_RESPONSE" value="6" enum="Result">
- Request does not have a response(yet).
+ Request does not have a response (yet).
</constant>
<constant name="RESULT_BODY_SIZE_LIMIT_EXCEEDED" value="7" enum="Result">
- Request exceeded its maximum size limit, see [method set_body_size_limit].
+ Request exceeded its maximum size limit, see [member body_size_limit].
</constant>
<constant name="RESULT_REQUEST_FAILED" value="8" enum="Result">
Request failed. (Unused)
@@ -123,7 +123,7 @@
HTTPRequest couldn't write to the download file.
</constant>
<constant name="RESULT_REDIRECT_LIMIT_REACHED" value="11" enum="Result">
- Request reached its maximum redirect limit, see [method set_max_redirects].
+ Request reached its maximum redirect limit, see [member max_redirects].
</constant>
</constants>
</class>
diff --git a/doc/classes/HingeJoint.xml b/doc/classes/HingeJoint.xml
index 3c5719056b..41d3b2311d 100644
--- a/doc/classes/HingeJoint.xml
+++ b/doc/classes/HingeJoint.xml
@@ -17,7 +17,7 @@
The speed with which the rotation across the axis perpendicular to the hinge gets corrected.
</member>
<member name="angular_limit/enable" type="bool" setter="set_flag" getter="get_flag">
- If [code]true[/code] the hinges maximum and minimum rotation, defined by [member angular_limit/lower] and [member angular_limit/upper] has effects.
+ If [code]true[/code], the hinges maximum and minimum rotation, defined by [member angular_limit/lower] and [member angular_limit/upper] has effects.
</member>
<member name="angular_limit/lower" type="float" setter="_set_lower_limit" getter="_get_lower_limit">
The minimum rotation. only active if [member angular_limit/enable] is [code]true[/code].
@@ -71,7 +71,7 @@
End flag of PARAM_* constants, used internally.
</constant>
<constant name="FLAG_USE_LIMIT" value="0" enum="Flag">
- If [code]true[/code] the hinges maximum and minimum rotation, defined by [member angular_limit/lower] and [member angular_limit/upper] has effects.
+ If [code]true[/code], the hinges maximum and minimum rotation, defined by [member angular_limit/lower] and [member angular_limit/upper] has effects.
</constant>
<constant name="FLAG_ENABLE_MOTOR" value="1" enum="Flag">
When activated, a motor turns the hinge.
diff --git a/doc/classes/ImageTexture.xml b/doc/classes/ImageTexture.xml
index 5c57899468..579886c771 100644
--- a/doc/classes/ImageTexture.xml
+++ b/doc/classes/ImageTexture.xml
@@ -23,9 +23,8 @@
<argument index="3" name="flags" type="int" default="7">
</argument>
<description>
- Create a new [code]ImageTexture[/code] with "width" and "height".
- "format" one of [Image].FORMAT_*.
- "flags" one or more of [Texture].FLAG_*.
+ Create a new [code]ImageTexture[/code] with [code]width[/code] and [code]height[/code].
+ [code]format[/code] is a value from [enum Image.Format], [code]flags[/code] is any combination of [enum Texture.Flags].
</description>
</method>
<method name="create_from_image">
@@ -36,14 +35,14 @@
<argument index="1" name="flags" type="int" default="7">
</argument>
<description>
- Create a new [code]ImageTexture[/code] from an [Image] with "flags" from [Texture].FLAG_*. An sRGB to linear color space conversion can take place, according to [Image].FORMAT_*.
+ Create a new [code]ImageTexture[/code] from an [Image] with [code]flags[/code] from [enum Texture.Flags]. An sRGB to linear color space conversion can take place, according to [enum Image.Format].
</description>
</method>
<method name="get_format" qualifiers="const">
<return type="int" enum="Image.Format">
</return>
<description>
- Return the format of the [code]ImageTexture[/code], one of [Image].FORMAT_*.
+ Return the format of the [code]ImageTexture[/code], one of [enum Image.Format].
</description>
</method>
<method name="load">
@@ -76,7 +75,7 @@
</methods>
<members>
<member name="lossy_quality" type="float" setter="set_lossy_storage_quality" getter="get_lossy_storage_quality">
- The storage quality for [code]ImageTexture[/code].STORAGE_COMPRESS_LOSSY.
+ The storage quality for [code]STORAGE_COMPRESS_LOSSY[/code].
</member>
<member name="storage" type="int" setter="set_storage" getter="get_storage" enum="ImageTexture.Storage">
The storage type (raw, lossy, or compressed).
@@ -87,7 +86,7 @@
[Image] data is stored raw and unaltered.
</constant>
<constant name="STORAGE_COMPRESS_LOSSY" value="1" enum="Storage">
- [Image] data is compressed with a lossy algorithm. You can set the storage quality with [method set_lossy_storage_quality].
+ [Image] data is compressed with a lossy algorithm. You can set the storage quality with [member lossy_quality].
</constant>
<constant name="STORAGE_COMPRESS_LOSSLESS" value="2" enum="Storage">
[Image] data is compressed with a lossless algorithm.
diff --git a/doc/classes/InputEventAction.xml b/doc/classes/InputEventAction.xml
index 8a10dc6ab9..bd0d774180 100644
--- a/doc/classes/InputEventAction.xml
+++ b/doc/classes/InputEventAction.xml
@@ -18,7 +18,7 @@
The action's name. Actions are accessed via this [String].
</member>
<member name="pressed" type="bool" setter="set_pressed" getter="is_pressed">
- If [code]true[/code] the action's state is pressed. If [code]false[/code] the action's state is released.
+ If [code]true[/code], the action's state is pressed. If [code]false[/code], the action's state is released.
</member>
</members>
<constants>
diff --git a/doc/classes/InputEventJoypadButton.xml b/doc/classes/InputEventJoypadButton.xml
index 18e33c2131..1875ea508a 100644
--- a/doc/classes/InputEventJoypadButton.xml
+++ b/doc/classes/InputEventJoypadButton.xml
@@ -18,7 +18,7 @@
Button identifier. One of the [code]JOY_BUTTON_*[/code] constants from [@GlobalScope].
</member>
<member name="pressed" type="bool" setter="set_pressed" getter="is_pressed">
- If [code]true[/code] the button's state is pressed. If [code]false[/code] the button's state is released.
+ If [code]true[/code], the button's state is pressed. If [code]false[/code], the button's state is released.
</member>
<member name="pressure" type="float" setter="set_pressure" getter="get_pressure">
Represents the pressure the user puts on the button with his finger, if the controller supports it. Ranges from [code]0[/code] to [code]1[/code].
diff --git a/doc/classes/InputEventKey.xml b/doc/classes/InputEventKey.xml
index 0118fda2df..4d8a2f6242 100644
--- a/doc/classes/InputEventKey.xml
+++ b/doc/classes/InputEventKey.xml
@@ -22,10 +22,10 @@
</methods>
<members>
<member name="echo" type="bool" setter="set_echo" getter="is_echo">
- If [code]true[/code] the key was already pressed before this event. It means the user is holding the key down.
+ If [code]true[/code], the key was already pressed before this event. It means the user is holding the key down.
</member>
<member name="pressed" type="bool" setter="set_pressed" getter="is_pressed">
- If [code]true[/code] the key's state is pressed. If [code]false[/code] the key's state is released.
+ If [code]true[/code], the key's state is pressed. If [code]false[/code], the key's state is released.
</member>
<member name="scancode" type="int" setter="set_scancode" getter="get_scancode">
Key scancode, one of the [code]KEY_*[/code] constants in [@GlobalScope].
diff --git a/doc/classes/InputEventMouseButton.xml b/doc/classes/InputEventMouseButton.xml
index 1342c7bf7e..8603a4f673 100644
--- a/doc/classes/InputEventMouseButton.xml
+++ b/doc/classes/InputEventMouseButton.xml
@@ -18,13 +18,13 @@
Mouse button identifier, one of the BUTTON_* or BUTTON_WHEEL_* constants in [@GlobalScope].
</member>
<member name="doubleclick" type="bool" setter="set_doubleclick" getter="is_doubleclick">
- If [code]true[/code] the mouse button's state is a double-click.
+ If [code]true[/code], the mouse button's state is a double-click.
</member>
<member name="factor" type="float" setter="set_factor" getter="get_factor">
Magnitude. Amount (or delta) of the event. Used for scroll events, indicates scroll amount (vertically or horizontally). Only supported on some platforms, sensitivity varies by platform. May be 0 if not supported.
</member>
<member name="pressed" type="bool" setter="set_pressed" getter="is_pressed">
- If [code]true[/code] the mouse button's state is pressed. If [code]false[/code] the mouse button's state is released.
+ If [code]true[/code], the mouse button's state is pressed. If [code]false[/code], the mouse button's state is released.
</member>
</members>
<constants>
diff --git a/doc/classes/InputEventScreenTouch.xml b/doc/classes/InputEventScreenTouch.xml
index 55f04cdd94..8b1b9cae9f 100644
--- a/doc/classes/InputEventScreenTouch.xml
+++ b/doc/classes/InputEventScreenTouch.xml
@@ -22,7 +22,7 @@
Touch position.
</member>
<member name="pressed" type="bool" setter="set_pressed" getter="is_pressed">
- If [code]true[/code] the touch's state is pressed. If [code]false[/code] the touch's state is released.
+ If [code]true[/code], the touch's state is pressed. If [code]false[/code], the touch's state is released.
</member>
</members>
<constants>
diff --git a/doc/classes/InputMap.xml b/doc/classes/InputMap.xml
index 8c25f851db..3779aa399f 100644
--- a/doc/classes/InputMap.xml
+++ b/doc/classes/InputMap.xml
@@ -93,7 +93,7 @@
<argument index="1" name="action" type="String">
</argument>
<description>
- Returns [true] if the given event is part of an existing action. This method ignores keyboard modifiers if the given [InputEvent] is not pressed (for proper release detection). See [method action_has_event] if you don't want this behavior.
+ Returns [code]true[/code] if the given event is part of an existing action. This method ignores keyboard modifiers if the given [InputEvent] is not pressed (for proper release detection). See [method action_has_event] if you don't want this behavior.
</description>
</method>
<method name="get_action_list">
diff --git a/doc/classes/InterpolatedCamera.xml b/doc/classes/InterpolatedCamera.xml
index 1ac7b5107e..fdb4361091 100644
--- a/doc/classes/InterpolatedCamera.xml
+++ b/doc/classes/InterpolatedCamera.xml
@@ -24,7 +24,7 @@
</methods>
<members>
<member name="enabled" type="bool" setter="set_interpolation_enabled" getter="is_interpolation_enabled">
- If [code]true[/code] and a target is set, the camera will move automatically.
+ If [code]true[/code], and a target is set, the camera will move automatically.
</member>
<member name="speed" type="float" setter="set_speed" getter="get_speed">
How quickly the camera moves toward its target. Higher values will result in tighter camera motion.
diff --git a/doc/classes/ItemList.xml b/doc/classes/ItemList.xml
index 0b8ede92d5..4df8a14804 100644
--- a/doc/classes/ItemList.xml
+++ b/doc/classes/ItemList.xml
@@ -388,10 +388,10 @@
</methods>
<members>
<member name="allow_reselect" type="bool" setter="set_allow_reselect" getter="get_allow_reselect">
- If [code]true[/code] the currently selected item may be selected again.
+ If [code]true[/code], the currently selected item may be selected again.
</member>
<member name="allow_rmb_select" type="bool" setter="set_allow_rmb_select" getter="get_allow_rmb_select">
- If [code]true[/code] a right mouse button click can select items.
+ If [code]true[/code], a right mouse button click can select items.
</member>
<member name="auto_height" type="bool" setter="set_auto_height" getter="has_auto_height">
</member>
diff --git a/doc/classes/JSONParseResult.xml b/doc/classes/JSONParseResult.xml
index a9162e2d95..4d2987cc04 100644
--- a/doc/classes/JSONParseResult.xml
+++ b/doc/classes/JSONParseResult.xml
@@ -24,7 +24,7 @@
</member>
<member name="result" type="Variant" setter="set_result" getter="get_result">
A [Variant] containing the parsed JSON. Use typeof() to check if it is what you expect. For example, if JSON source starts with curly braces ([code]{}[/code]) a [Dictionary] will be returned, if JSON source starts with braces ([code][][/code]) an [Array] will be returned.
- [i]Be aware that the JSON specification does not define integer or float types, but only a number type. Therefore, parsing a JSON text will convert all numerical values to float types.
+ [i]Be aware that the JSON specification does not define integer or float types, but only a number type. Therefore, parsing a JSON text will convert all numerical values to float types.[/i]
Note that JSON objects do not preserve key order like Godot dictionaries, thus you should not rely on keys being in a certain order if a dictionary is constructed from JSON. In contrast, JSON arrays retain the order of their elements:[/i]
[codeblock]
var p = JSON.parse('["hello", "world", "!"]')
diff --git a/doc/classes/Joint.xml b/doc/classes/Joint.xml
index 8cafdbdbf3..32fdb31a99 100644
--- a/doc/classes/Joint.xml
+++ b/doc/classes/Joint.xml
@@ -4,7 +4,7 @@
Base class for all 3D joints
</brief_description>
<description>
- All 3D joints link two nodes, has a priority, and can decide if the two bodies of the nodes should be able to collide with each other
+ Joints are used to bind together two physics bodies. They have a solver priority and can define if the bodies of the two attached nodes should be able to collide with each other.
</description>
<tutorials>
</tutorials>
@@ -14,16 +14,16 @@
</methods>
<members>
<member name="collision/exclude_nodes" type="bool" setter="set_exclude_nodes_from_collision" getter="get_exclude_nodes_from_collision">
- If [code]true[/code] the two bodies of the nodes are not able to collide with each other.
+ If [code]true[/code], the two bodies of the nodes are not able to collide with each other.
</member>
<member name="nodes/node_a" type="NodePath" setter="set_node_a" getter="get_node_a">
- The [Node], the first side of the Joint attaches to.
+ The node attached to the first side (A) of the joint.
</member>
<member name="nodes/node_b" type="NodePath" setter="set_node_b" getter="get_node_b">
- The [Node], the second side of the Joint attaches to.
+ The node attached to the second side (B) of the joint.
</member>
<member name="solver/priority" type="int" setter="set_solver_priority" getter="get_solver_priority">
- The order in which the solver is executed compared to the other [Joints], the lower, the earlier.
+ The priority used to define which solver is executed first for multiple joints. The lower the value, the higher the priority.
</member>
</members>
<constants>
diff --git a/doc/classes/Joint2D.xml b/doc/classes/Joint2D.xml
index 8247997927..641765e671 100644
--- a/doc/classes/Joint2D.xml
+++ b/doc/classes/Joint2D.xml
@@ -17,7 +17,7 @@
When [member node_a] and [member node_b] move in different directions the [code]bias[/code] controls how fast the joint pulls them back to their original position. The lower the [code]bias[/code] the more the two bodies can pull on the joint. Default value: [code]0[/code]
</member>
<member name="disable_collision" type="bool" setter="set_exclude_nodes_from_collision" getter="get_exclude_nodes_from_collision">
- If [code]true[/code] [member node_a] and [member node_b] can collide. Default value: [code]false[/code].
+ If [code]true[/code], [member node_a] and [member node_b] can collide. Default value: [code]false[/code].
</member>
<member name="node_a" type="NodePath" setter="set_node_a" getter="get_node_a">
The first body attached to the joint. Must derive from [PhysicsBody2D].
diff --git a/doc/classes/KinematicBody.xml b/doc/classes/KinematicBody.xml
index df8fb251ba..ad41f48ddd 100644
--- a/doc/classes/KinematicBody.xml
+++ b/doc/classes/KinematicBody.xml
@@ -89,7 +89,7 @@
</argument>
<description>
Moves the body along a vector. If the body collides with another, it will slide along the other body rather than stop immediately. If the other body is a [code]KinematicBody[/code] or [RigidBody], it will also be affected by the motion of the other body. You can use this to make moving or rotating platforms, or to make nodes push other nodes.
- [code]linear_velocity[/code] is a value in pixels per second. Unlike in for example [method move_and_collide], you should [i]not[/i] multiply it with [code]delta[/code] — this is done by the method.
+ [code]linear_velocity[/code] is a value in pixels per second. Unlike in for example [method move_and_collide], you should [i]not[/i] multiply it by [code]delta[/code] — this is done by the method.
[code]floor_normal[/code] is the up direction, used to determine what is a wall and what is a floor or a ceiling. If set to the default value of [code]Vector3(0, 0, 0)[/code], everything is considered a wall. This is useful for topdown games.
[i]TODO: Update for new stop_on_slode argument.[/i] If the body is standing on a slope and the horizontal speed (relative to the floor's speed) goes below [code]slope_stop_min_velocity[/code], the body will stop completely. This prevents the body from sliding down slopes when you include gravity in [code]linear_velocity[/code]. When set to lower values, the body will not be able to stand still on steep slopes.
If the body collides, it will change direction a maximum of [code]max_slides[/code] times before it stops.
@@ -138,10 +138,13 @@
If the body is at least this close to another body, this body will consider them to be colliding.
</member>
<member name="move_lock_x" type="bool" setter="set_axis_lock" getter="get_axis_lock">
+ Lock the body's movement in the x-axis.
</member>
<member name="move_lock_y" type="bool" setter="set_axis_lock" getter="get_axis_lock">
+ Lock the body's movement in the y-axis.
</member>
<member name="move_lock_z" type="bool" setter="set_axis_lock" getter="get_axis_lock">
+ Lock the body's movement in the z-axis.
</member>
</members>
<constants>
diff --git a/doc/classes/KinematicBody2D.xml b/doc/classes/KinematicBody2D.xml
index 8a644447ca..986010f832 100644
--- a/doc/classes/KinematicBody2D.xml
+++ b/doc/classes/KinematicBody2D.xml
@@ -89,12 +89,12 @@
</argument>
<description>
Moves the body along a vector. If the body collides with another, it will slide along the other body rather than stop immediately. If the other body is a [code]KinematicBody2D[/code] or [RigidBody2D], it will also be affected by the motion of the other body. You can use this to make moving or rotating platforms, or to make nodes push other nodes.
- [code]linear_velocity[/code] is a value in pixels per second. Unlike in for example [method move_and_collide], you should [i]not[/i] multiply it with [code]delta[/code] — this is done by the method.
+ [code]linear_velocity[/code] is a value in pixels per second. Unlike in for example [method move_and_collide], you should [i]not[/i] multiply it by [code]delta[/code] — this is done by the method.
[code]floor_normal[/code] is the up direction, used to determine what is a wall and what is a floor or a ceiling. If set to the default value of [code]Vector2(0, 0)[/code], everything is considered a wall. This is useful for topdown games.
[i]TODO: Update for stop_on_slope argument.[/i] If the body is standing on a slope and the horizontal speed (relative to the floor's speed) goes below [code]slope_stop_min_velocity[/code], the body will stop completely. This prevents the body from sliding down slopes when you include gravity in [code]linear_velocity[/code]. When set to lower values, the body will not be able to stand still on steep slopes.
If the body collides, it will change direction a maximum of [code]max_slides[/code] times before it stops.
[code]floor_max_angle[/code] is the maximum angle (in radians) where a slope is still considered a floor (or a ceiling), rather than a wall. The default value equals 45 degrees.
- Returns the movement that remained when the body stopped. To get more detailed information about collisions that occurred, use [method get_slide_collision].
+ Returns the [code]linear_velocity[/code] vector, rotated and/or scaled if a slide collision occurred. To get more detailed information about collisions that occurred, use [method get_slide_collision].
</description>
</method>
<method name="move_and_slide_with_snap">
@@ -138,7 +138,7 @@
If the body is at least this close to another body, this body will consider them to be colliding.
</member>
<member name="motion/sync_to_physics" type="bool" setter="set_sync_to_physics" getter="is_sync_to_physics_enabled">
- If [code]true[/code] the body's movement will be synchronized to the physics frame. This is useful when animating movement via [AnimationPlayer], for example on moving platforms.
+ If [code]true[/code], the body's movement will be synchronized to the physics frame. This is useful when animating movement via [AnimationPlayer], for example on moving platforms.
</member>
</members>
<constants>
diff --git a/doc/classes/Light.xml b/doc/classes/Light.xml
index cf873e5b28..a7b0d86a7a 100644
--- a/doc/classes/Light.xml
+++ b/doc/classes/Light.xml
@@ -15,7 +15,7 @@
</methods>
<members>
<member name="editor_only" type="bool" setter="set_editor_only" getter="is_editor_only">
- If [code]true[/code] the light only appears in the editor and will not be visible at runtime. Default value:[code]false[/code].
+ If [code]true[/code], the light only appears in the editor and will not be visible at runtime. Default value:[code]false[/code].
</member>
<member name="light_bake_mode" type="int" setter="set_bake_mode" getter="get_bake_mode" enum="Light.BakeMode">
The light's bake mode. See [enum BakeMode].
@@ -33,7 +33,7 @@
Secondary multiplier used with indirect light (light bounces). This works in baked light or GIProbe.
</member>
<member name="light_negative" type="bool" setter="set_negative" getter="is_negative">
- If [code]true[/code] the light's effect is reversed, darkening areas and casting bright shadows. Default value: [code]false[/code].
+ If [code]true[/code], the light's effect is reversed, darkening areas and casting bright shadows. Default value: [code]false[/code].
</member>
<member name="light_specular" type="float" setter="set_param" getter="get_param">
The intensity of the specular blob in objects affected by the light. At [code]0[/code] the light becomes a pure diffuse light.
@@ -48,7 +48,7 @@
Attempts to reduce [member shadow_bias] gap.
</member>
<member name="shadow_enabled" type="bool" setter="set_shadow" getter="has_shadow">
- If [code]true[/code] the light will cast shadows. Default value: [code]false[/code].
+ If [code]true[/code], the light will cast shadows. Default value: [code]false[/code].
</member>
<member name="shadow_reverse_cull_face" type="bool" setter="set_shadow_reverse_cull_face" getter="get_shadow_reverse_cull_face">
</member>
diff --git a/doc/classes/Light2D.xml b/doc/classes/Light2D.xml
index f3903ffeae..0d754f1d4e 100644
--- a/doc/classes/Light2D.xml
+++ b/doc/classes/Light2D.xml
@@ -17,10 +17,10 @@
The Light2D's [Color].
</member>
<member name="editor_only" type="bool" setter="set_editor_only" getter="is_editor_only">
- If [code]true[/code] Light2D will only appear when editing the scene. Default value: [code]false[/code].
+ If [code]true[/code], Light2D will only appear when editing the scene. Default value: [code]false[/code].
</member>
<member name="enabled" type="bool" setter="set_enabled" getter="is_enabled">
- If [code]true[/code] Light2D will emit light. Default value: [code]true[/code].
+ If [code]true[/code], Light2D will emit light. Default value: [code]true[/code].
</member>
<member name="energy" type="float" setter="set_energy" getter="get_energy">
The Light2D's energy value. The larger the value, the stronger the light.
@@ -56,10 +56,10 @@
[Color] of shadows cast by the Light2D.
</member>
<member name="shadow_enabled" type="bool" setter="set_shadow_enabled" getter="is_shadow_enabled">
- If [code]true[/code] the Light2D will cast shadows. Default value: [code]false[/code].
+ If [code]true[/code], the Light2D will cast shadows. Default value: [code]false[/code].
</member>
<member name="shadow_filter" type="int" setter="set_shadow_filter" getter="get_shadow_filter" enum="Light2D.ShadowFilter">
- Shadow filter type. Use SHADOW_FILTER_* constants to set [code]shadow_filter[/code]. Default value: [code]None[/code].
+ Shadow filter type. Use [enum Light2D.ShadowFilter] constants as values. Default value: [code]SHADOW_FILTER_NONE[/code].
</member>
<member name="shadow_filter_smooth" type="float" setter="set_shadow_smooth" getter="get_shadow_smooth">
Smoothing value for shadows.
@@ -91,22 +91,22 @@
The light texture of the Light2D is used as a mask, hiding or revealing parts of the screen underneath depending on the value of each pixel of the light (mask) texture.
</constant>
<constant name="SHADOW_FILTER_NONE" value="0" enum="ShadowFilter">
- No filter applies to the shadow map. See [method shadow_filter].
+ No filter applies to the shadow map. See [member shadow_filter].
</constant>
<constant name="SHADOW_FILTER_PCF3" value="1" enum="ShadowFilter">
- Percentage closer filtering (3 samples) applies to the shadow map. See [method shadow_filter].
+ Percentage closer filtering (3 samples) applies to the shadow map. See [member shadow_filter].
</constant>
<constant name="SHADOW_FILTER_PCF5" value="2" enum="ShadowFilter">
- Percentage closer filtering (5 samples) applies to the shadow map. See [method shadow_filter].
+ Percentage closer filtering (5 samples) applies to the shadow map. See [member shadow_filter].
</constant>
<constant name="SHADOW_FILTER_PCF7" value="3" enum="ShadowFilter">
- Percentage closer filtering (7 samples) applies to the shadow map. See [method shadow_filter].
+ Percentage closer filtering (7 samples) applies to the shadow map. See [member shadow_filter].
</constant>
<constant name="SHADOW_FILTER_PCF9" value="4" enum="ShadowFilter">
- Percentage closer filtering (9 samples) applies to the shadow map. See [method shadow_filter].
+ Percentage closer filtering (9 samples) applies to the shadow map. See [member shadow_filter].
</constant>
<constant name="SHADOW_FILTER_PCF13" value="5" enum="ShadowFilter">
- Percentage closer filtering (13 samples) applies to the shadow map. See [method shadow_filter].
+ Percentage closer filtering (13 samples) applies to the shadow map. See [member shadow_filter].
</constant>
</constants>
</class>
diff --git a/doc/classes/LineEdit.xml b/doc/classes/LineEdit.xml
index f842dd8311..1e1ffd71b5 100644
--- a/doc/classes/LineEdit.xml
+++ b/doc/classes/LineEdit.xml
@@ -24,7 +24,7 @@
<return type="void">
</return>
<description>
- Erases the [LineEdit] text.
+ Erases the [code]LineEdit[/code] text.
</description>
</method>
<method name="deselect">
@@ -38,7 +38,7 @@
<return type="PopupMenu">
</return>
<description>
- Returns the [PopupMenu] of this [code]LineEdit[/code]. By default, this menu is displayed when right-clicking on the [LineEdit].
+ Returns the [PopupMenu] of this [code]LineEdit[/code]. By default, this menu is displayed when right-clicking on the [code]LineEdit[/code].
</description>
</method>
<method name="menu_option">
@@ -58,7 +58,7 @@
<argument index="1" name="to" type="int" default="-1">
</argument>
<description>
- Selects characters inside [LineEdit] between [code]from[/code] and [code]to[/code]. By default [code]from[/code] is at the beginning and [code]to[/code] at the end.
+ Selects characters inside [code]LineEdit[/code] between [code]from[/code] and [code]to[/code]. By default [code]from[/code] is at the beginning and [code]to[/code] at the end.
[codeblock]
text = "Welcome"
select() # Welcome
@@ -80,7 +80,7 @@
Text alignment as defined in the ALIGN_* enum.
</member>
<member name="caret_blink" type="bool" setter="cursor_set_blink_enabled" getter="cursor_get_blink_enabled">
- If [code]true[/code] the caret (visual cursor) blinks.
+ If [code]true[/code], the caret (visual cursor) blinks.
</member>
<member name="caret_blink_speed" type="float" setter="cursor_set_blink_speed" getter="cursor_get_blink_speed">
Duration (in seconds) of a caret's blinking cycle.
@@ -89,28 +89,28 @@
The cursor's position inside the [code]LineEdit[/code]. When set, the text may scroll to accommodate it.
</member>
<member name="clear_button_enabled" type="bool" setter="set_clear_button_enabled" getter="is_clear_button_enabled">
- If [code]true[/code] the [code]LineEdit[/code] will show a clear button if [code]text[/code] is not empty.
+ If [code]true[/code], the [code]LineEdit[/code] will show a clear button if [code]text[/code] is not empty.
</member>
<member name="context_menu_enabled" type="bool" setter="set_context_menu_enabled" getter="is_context_menu_enabled">
- If [code]true[/code] the context menu will appear when right clicked.
+ If [code]true[/code], the context menu will appear when right clicked.
</member>
<member name="editable" type="bool" setter="set_editable" getter="is_editable">
- If [code]false[/code] existing text cannot be modified and new text cannot be added.
+ If [code]false[/code], existing text cannot be modified and new text cannot be added.
</member>
<member name="expand_to_text_length" type="bool" setter="set_expand_to_text_length" getter="get_expand_to_text_length">
- If [code]true[/code] the [LineEdit] width will increase to stay longer than the [member text]. It will [b]not[/b] compress if the [member text] is shortened.
+ If [code]true[/code], the [code]LineEdit[/code] width will increase to stay longer than the [member text]. It will [b]not[/b] compress if the [member text] is shortened.
</member>
<member name="focus_mode" type="int" setter="set_focus_mode" getter="get_focus_mode" enum="Control.FocusMode">
- Defines how the [LineEdit] can grab focus (Keyboard and mouse, only keyboard, or none). See [code]enum FocusMode[/code] in [Control] for details.
+ Defines how the [code]LineEdit[/code] can grab focus (Keyboard and mouse, only keyboard, or none). See [code]enum FocusMode[/code] in [Control] for details.
</member>
<member name="max_length" type="int" setter="set_max_length" getter="get_max_length">
- Maximum amount of characters that can be entered inside the [LineEdit]. If [code]0[/code], there is no limit.
+ Maximum amount of characters that can be entered inside the [code]LineEdit[/code]. If [code]0[/code], there is no limit.
</member>
<member name="placeholder_alpha" type="float" setter="set_placeholder_alpha" getter="get_placeholder_alpha">
Opacity of the [member placeholder_text]. From [code]0[/code] to [code]1[/code].
</member>
<member name="placeholder_text" type="String" setter="set_placeholder" getter="get_placeholder">
- Text shown when the [LineEdit] is empty. It is [b]not[/b] the [LineEdit]'s default value (see [member text]).
+ Text shown when the [code]LineEdit[/code] is empty. It is [b]not[/b] the [code]LineEdit[/code]'s default value (see [member text]).
</member>
<member name="secret" type="bool" setter="set_secret" getter="is_secret">
If [code]true[/code], every character is replaced with the secret character (see [member secret_character]).
@@ -119,7 +119,7 @@
The character to use to mask secret input (defaults to "*"). Only a single character can be used as the secret character.
</member>
<member name="text" type="String" setter="set_text" getter="get_text">
- String value of the [LineEdit].
+ String value of the [code]LineEdit[/code].
</member>
</members>
<signals>
@@ -134,25 +134,25 @@
<argument index="0" name="new_text" type="String">
</argument>
<description>
- Emitted when the user presses KEY_ENTER on the [code]LineEdit[/code].
+ Emitted when the user presses [code]KEY_ENTER[/code] on the [code]LineEdit[/code].
</description>
</signal>
</signals>
<constants>
<constant name="ALIGN_LEFT" value="0" enum="Align">
- Aligns the text on the left hand side of the [LineEdit].
+ Aligns the text on the left hand side of the [code]LineEdit[/code].
</constant>
<constant name="ALIGN_CENTER" value="1" enum="Align">
- Centers the text in the middle of the [LineEdit].
+ Centers the text in the middle of the [code]LineEdit[/code].
</constant>
<constant name="ALIGN_RIGHT" value="2" enum="Align">
- Aligns the text on the right hand side of the [LineEdit].
+ Aligns the text on the right hand side of the [code]LineEdit[/code].
</constant>
<constant name="ALIGN_FILL" value="3" enum="Align">
- Stretches whitespaces to fit the [LineEdit]'s width.
+ Stretches whitespaces to fit the [code]LineEdit[/code]'s width.
</constant>
<constant name="MENU_CUT" value="0" enum="MenuItems">
- Cuts (Copies and clears) the selected text.
+ Cuts (copies and clears) the selected text.
</constant>
<constant name="MENU_COPY" value="1" enum="MenuItems">
Copies the selected text.
@@ -161,10 +161,10 @@
Pastes the clipboard text over the selected text (or at the cursor's position).
</constant>
<constant name="MENU_CLEAR" value="3" enum="MenuItems">
- Erases the whole [Linedit] text.
+ Erases the whole [code]LineEdit[/code] text.
</constant>
<constant name="MENU_SELECT_ALL" value="4" enum="MenuItems">
- Selects the whole [Linedit] text.
+ Selects the whole [code]LineEdit[/code] text.
</constant>
<constant name="MENU_UNDO" value="5" enum="MenuItems">
Undoes the previous action.
diff --git a/doc/classes/MainLoop.xml b/doc/classes/MainLoop.xml
index ad763e6532..01836cff95 100644
--- a/doc/classes/MainLoop.xml
+++ b/doc/classes/MainLoop.xml
@@ -136,5 +136,7 @@
</constant>
<constant name="NOTIFICATION_CRASH" value="92">
</constant>
+ <constant name="NOTIFICATION_OS_IME_UPDATE" value="93">
+ </constant>
</constants>
</class>
diff --git a/doc/classes/MenuButton.xml b/doc/classes/MenuButton.xml
index c9a8d3ce7a..636edd504b 100644
--- a/doc/classes/MenuButton.xml
+++ b/doc/classes/MenuButton.xml
@@ -27,6 +27,11 @@
</description>
</method>
</methods>
+ <members>
+ <member name="switch_on_hover" type="bool" setter="set_switch_on_hover" getter="is_switch_on_hover">
+ If [code]true[/code], when the cursor hovers above another MenuButton within the same parent which also has [code]switch_on_hover[/code] enabled, it will close the current MenuButton and open the other one.
+ </member>
+ </members>
<signals>
<signal name="about_to_show">
<description>
diff --git a/doc/classes/MeshDataTool.xml b/doc/classes/MeshDataTool.xml
index c90dba1561..7bd98323c7 100644
--- a/doc/classes/MeshDataTool.xml
+++ b/doc/classes/MeshDataTool.xml
@@ -11,9 +11,9 @@
var mdt = MeshDataTool.new()
mdt.create_from_surface(mesh, 0)
for i in range(mdt.get_vertex_count()):
- var vertex = mdt.get_vertex(i)
- ...
- mdt.set_vertex(i, vertex)
+ var vertex = mdt.get_vertex(i)
+ ...
+ mdt.set_vertex(i, vertex)
mesh.surface_remove(0)
mdt.commit_to_surface(mesh)
[/codeblock]
diff --git a/doc/classes/MultiplayerAPI.xml b/doc/classes/MultiplayerAPI.xml
index d8d7d9acfc..f3e26a3bcb 100644
--- a/doc/classes/MultiplayerAPI.xml
+++ b/doc/classes/MultiplayerAPI.xml
@@ -93,7 +93,7 @@
The peer object to handle the RPC system (effectively enabling networking when set). Depending on the peer itself, the MultiplayerAPI will become a network server (check with [method is_network_server]) and will set root node's network mode to master (see NETWORK_MODE_* constants in [Node]), or it will become a regular peer with root node set to puppet. All child nodes are set to inherit the network mode by default. Handling of networking-related events (connection, disconnection, new clients) is done by connecting to MultiplayerAPI's signals.
</member>
<member name="refuse_new_network_connections" type="bool" setter="set_refuse_new_network_connections" getter="is_refusing_new_network_connections">
- If [code]true[/code] the MultiplayerAPI's [member network_peer] refuses new incoming connections.
+ If [code]true[/code], the MultiplayerAPI's [member network_peer] refuses new incoming connections.
</member>
</members>
<signals>
diff --git a/doc/classes/Mutex.xml b/doc/classes/Mutex.xml
index 8f2751af98..718b3b04b2 100644
--- a/doc/classes/Mutex.xml
+++ b/doc/classes/Mutex.xml
@@ -22,7 +22,7 @@
<return type="int" enum="Error">
</return>
<description>
- Try locking this [code]Mutex[/code], does not block. Returns [OK] on success, [ERR_BUSY] otherwise.
+ Try locking this [code]Mutex[/code], does not block. Returns [code]OK[/code] on success, [code]ERR_BUSY[/code] otherwise.
</description>
</method>
<method name="unlock">
diff --git a/doc/classes/Navigation.xml b/doc/classes/Navigation.xml
index 08f22d49d3..9d830168d3 100644
--- a/doc/classes/Navigation.xml
+++ b/doc/classes/Navigation.xml
@@ -35,7 +35,7 @@
<argument index="0" name="to_point" type="Vector3">
</argument>
<description>
- Returns the owner of the [NavigationMesh] which contains the navigation point closest to the point given. This is usually a [NavigtionMeshInstance]. For meshes added via [method navmesh_add], returns the owner that was given (or [code]null[/code] if the [code]owner[/code] parameter was omitted).
+ Returns the owner of the [NavigationMesh] which contains the navigation point closest to the point given. This is usually a [NavigationMeshInstance]. For meshes added via [method navmesh_add], returns the owner that was given (or [code]null[/code] if the [code]owner[/code] parameter was omitted).
</description>
</method>
<method name="get_closest_point_to_segment">
diff --git a/doc/classes/Navigation2D.xml b/doc/classes/Navigation2D.xml
index 364da55f99..4982c6f87d 100644
--- a/doc/classes/Navigation2D.xml
+++ b/doc/classes/Navigation2D.xml
@@ -26,7 +26,7 @@
<argument index="0" name="to_point" type="Vector2">
</argument>
<description>
- Returns the owner of the [NavigationPolygon] which contains the navigation point closest to the point given. This is usually a [NavigtionPolygonInstance]. For polygons added via [method navpoly_add], returns the owner that was given (or [code]null[/code] if the [code]owner[/code] parameter was omitted).
+ Returns the owner of the [NavigationPolygon] which contains the navigation point closest to the point given. This is usually a [NavigationPolygonInstance]. For polygons added via [method navpoly_add], returns the owner that was given (or [code]null[/code] if the [code]owner[/code] parameter was omitted).
</description>
</method>
<method name="get_simple_path">
diff --git a/doc/classes/NavigationPolygon.xml b/doc/classes/NavigationPolygon.xml
index 4ede80b98c..53389d6599 100644
--- a/doc/classes/NavigationPolygon.xml
+++ b/doc/classes/NavigationPolygon.xml
@@ -6,22 +6,22 @@
<description>
There are two ways to create polygons. Either by using the [method add_outline] method or using the [method add_polygon] method.
Using [method add_outline]:
- [code]
+ [codeblock]
var polygon = NavigationPolygon.new()
var outline = PoolVector2Array([Vector2(0, 0), Vector2(0, 50), Vector2(50, 50), Vector2(50, 0)])
polygon.add_outline(outline)
polygon.make_polygons_from_outlines()
$NavigationPolygonInstance.navpoly = polygon
- [/code]
+ [/codeblock]
Using [method add_polygon] and indices of the vertices array.
- [code]
+ [codeblock]
var polygon = NavigationPolygon.new()
var vertices = PoolVector2Array([Vector2(0, 0), Vector2(0, 50), Vector2(50, 50), Vector2(50, 0)])
polygon.set_vertices(vertices)
var indices = PoolIntArray(0, 3, 1)
polygon.add_polygon(indices)
$NavigationPolygonInstance.navpoly = polygon
- [/code]
+ [/codeblock]
</description>
<tutorials>
</tutorials>
diff --git a/doc/classes/NetworkedMultiplayerPeer.xml b/doc/classes/NetworkedMultiplayerPeer.xml
index 990f928b25..42f08b36af 100644
--- a/doc/classes/NetworkedMultiplayerPeer.xml
+++ b/doc/classes/NetworkedMultiplayerPeer.xml
@@ -53,7 +53,7 @@
</methods>
<members>
<member name="refuse_new_connections" type="bool" setter="set_refuse_new_connections" getter="is_refusing_new_connections">
- If [code]true[/code] this [code]NetworkedMultiplayerPeer[/code] refuses new connections. Default value: [code]false[/code].
+ If [code]true[/code], this [code]NetworkedMultiplayerPeer[/code] refuses new connections. Default value: [code]false[/code].
</member>
<member name="transfer_mode" type="int" setter="set_transfer_mode" getter="get_transfer_mode" enum="NetworkedMultiplayerPeer.TransferMode">
The manner in which to send packets to the [code]target_peer[/code]. See [enum TransferMode].
diff --git a/doc/classes/Node.xml b/doc/classes/Node.xml
index dcdb6d0500..02a8ee8e75 100644
--- a/doc/classes/Node.xml
+++ b/doc/classes/Node.xml
@@ -11,7 +11,7 @@
This means that when adding a node to the scene tree, the following order will be used for the callbacks: [method _enter_tree] of the parent, [method _enter_tree] of the children, [method _ready] of the children and finally [method _ready] of the parent (recursively for the entire scene tree).
[b]Processing:[/b] Nodes can override the "process" state, so that they receive a callback on each frame requesting them to process (do something). Normal processing (callback [method _process], toggled with [method set_process]) happens as fast as possible and is dependent on the frame rate, so the processing time [i]delta[/i] is passed as an argument. Physics processing (callback [method _physics_process], toggled with [method set_physics_process]) happens a fixed number of times per second (60 by default) and is useful for code related to the physics engine.
Nodes can also process input events. When present, the [method _input] function will be called for each input that the program receives. In many cases, this can be overkill (unless used for simple projects), and the [method _unhandled_input] function might be preferred; it is called when the input event was not handled by anyone else (typically, GUI [Control] nodes), ensuring that the node only receives the events that were meant for it.
- To keep track of the scene hierarchy (especially when instancing scenes into other scenes), an "owner" can be set for the node with [method set_owner]. This keeps track of who instanced what. This is mostly useful when writing editors and tools, though.
+ To keep track of the scene hierarchy (especially when instancing scenes into other scenes), an "owner" can be set for the node with the [member owner] property. This keeps track of who instanced what. This is mostly useful when writing editors and tools, though.
Finally, when a node is freed with [method Object.free] or [method queue_free], it will also free all its children.
[b]Groups:[/b] Nodes can be added to as many groups as you want to be easy to manage, you could create groups like "enemies" or "collectables" for example, depending on your game. See [method add_to_group], [method is_in_group] and [method remove_from_group]. You can then retrieve all nodes in these groups, iterate them and even call methods on groups via the methods on [SceneTree].
[b]Networking with nodes:[/b] After connecting to a server (or making one, see [NetworkedMultiplayerENet]) it is possible to use the built-in RPC (remote procedure call) system to communicate over the network. By calling [method rpc] with a method name, it will be called locally and in all connected peers (peers = clients and the server that accepts connections). To identify which node receives the RPC call Godot will use its [NodePath] (make sure node names are the same on all peers). Also take a look at the high-level networking tutorial and corresponding demos.
@@ -152,7 +152,7 @@
<return type="bool">
</return>
<description>
- Returns [code]true[/code] if the node can process while the scene tree is paused (see [method set_pause_mode]). Always returns [code]true[/code] if the scene tree is not paused, and [code]false[/code] if the node is not in the tree. FIXME: Why FAIL_COND?
+ Returns [code]true[/code] if the node can process while the scene tree is paused (see [member pause_mode]). Always returns [code]true[/code] if the scene tree is not paused, and [code]false[/code] if the node is not in the tree.
</description>
</method>
<method name="duplicate" qualifiers="const">
@@ -162,7 +162,7 @@
</argument>
<description>
Duplicates the node, returning a new node.
- You can fine-tune the behavior using the [code]flags[/code]. See DUPLICATE_* constants.
+ You can fine-tune the behavior using the [code]flags[/code] (see [enum Node.DuplicateFlags]).
</description>
</method>
<method name="find_node" qualifiers="const">
diff --git a/doc/classes/Node2D.xml b/doc/classes/Node2D.xml
index e955f6bb7d..80f9329402 100644
--- a/doc/classes/Node2D.xml
+++ b/doc/classes/Node2D.xml
@@ -148,7 +148,7 @@
Local [Transform2D].
</member>
<member name="z_as_relative" type="bool" setter="set_z_as_relative" getter="is_z_relative">
- If [code]true[/code] the node's Z-index is relative to its parent's Z-index. If this node's Z-index is 2 and its parent's effective Z-index is 3, then this node's effective Z-index will be 2 + 3 = 5.
+ If [code]true[/code], the node's Z-index is relative to its parent's Z-index. If this node's Z-index is 2 and its parent's effective Z-index is 3, then this node's effective Z-index will be 2 + 3 = 5.
</member>
<member name="z_index" type="int" setter="set_z_index" getter="get_z_index">
Z-index. Controls the order in which the nodes render. A node with a higher Z-index will display in front of others.
diff --git a/doc/classes/OS.xml b/doc/classes/OS.xml
index e218949757..f6ad71b6e2 100644
--- a/doc/classes/OS.xml
+++ b/doc/classes/OS.xml
@@ -210,6 +210,20 @@
Returns the path to the current engine executable.
</description>
</method>
+ <method name="get_ime_selection" qualifiers="const">
+ <return type="Vector2">
+ </return>
+ <description>
+ Returns IME selection range.
+ </description>
+ </method>
+ <method name="get_ime_text" qualifiers="const">
+ <return type="String">
+ </return>
+ <description>
+ Returns IME intermediate text.
+ </description>
+ </method>
<method name="get_latin_keyboard_variant" qualifiers="const">
<return type="String">
</return>
@@ -357,7 +371,14 @@
<argument index="0" name="dir" type="int" enum="OS.SystemDir">
</argument>
<description>
- Returns the actual path to commonly used folders across different platforms. Available locations are specified in [OS.SystemDir].
+ Returns the actual path to commonly used folders across different platforms. Available locations are specified in [enum OS.SystemDir].
+ </description>
+ </method>
+ <method name="get_system_time_msecs" qualifiers="const">
+ <return type="int">
+ </return>
+ <description>
+ Returns the epoch time of the operating system in milliseconds.
</description>
</method>
<method name="get_system_time_secs" qualifiers="const">
@@ -663,12 +684,22 @@
Sets the game's icon.
</description>
</method>
+ <method name="set_ime_active">
+ <return type="void">
+ </return>
+ <argument index="0" name="active" type="bool">
+ </argument>
+ <description>
+ Sets whether IME input mode should be enabled.
+ </description>
+ </method>
<method name="set_ime_position">
<return type="void">
</return>
<argument index="0" name="position" type="Vector2">
</argument>
<description>
+ Sets position of IME suggestion list popup (in window coordinates).
</description>
</method>
<method name="set_thread_name">
@@ -715,7 +746,7 @@
<description>
Requests the OS to open a resource with the most appropriate program. For example.
[code]OS.shell_open("C:\\Users\name\Downloads")[/code] on Windows opens the file explorer at the downloads folders of the user.
- [code]OS.shell_open("http://godotengine.org")[/code] opens the default web browser on the official Godot website.
+ [code]OS.shell_open("https://godotengine.org")[/code] opens the default web browser on the official Godot website.
</description>
</method>
<method name="show_virtual_keyboard">
@@ -739,28 +770,28 @@
The exit code passed to the OS when the main loop exits.
</member>
<member name="keep_screen_on" type="bool" setter="set_keep_screen_on" getter="is_keep_screen_on">
- If [code]true[/code] the engine tries to keep the screen on while the game is running. Useful on mobile.
+ If [code]true[/code], the engine tries to keep the screen on while the game is running. Useful on mobile.
</member>
<member name="low_processor_usage_mode" type="bool" setter="set_low_processor_usage_mode" getter="is_in_low_processor_usage_mode">
- If [code]true[/code] the engine optimizes for low processor usage by only refreshing the screen if needed. Can improve battery consumption on mobile.
+ If [code]true[/code], the engine optimizes for low processor usage by only refreshing the screen if needed. Can improve battery consumption on mobile.
</member>
<member name="screen_orientation" type="int" setter="set_screen_orientation" getter="get_screen_orientation" enum="_OS.ScreenOrientation">
The current screen orientation.
</member>
<member name="vsync_enabled" type="bool" setter="set_use_vsync" getter="is_vsync_enabled">
- If [code]true[/code] vertical synchronization (Vsync) is enabled.
+ If [code]true[/code], vertical synchronization (Vsync) is enabled.
</member>
<member name="window_borderless" type="bool" setter="set_borderless_window" getter="get_borderless_window">
- If [code]true[/code] removes the window frame.
+ If [code]true[/code], removes the window frame.
</member>
<member name="window_fullscreen" type="bool" setter="set_window_fullscreen" getter="is_window_fullscreen">
- If [code]true[/code] the window is fullscreen.
+ If [code]true[/code], the window is fullscreen.
</member>
<member name="window_maximized" type="bool" setter="set_window_maximized" getter="is_window_maximized">
- If [code]true[/code] the window is maximized.
+ If [code]true[/code], the window is maximized.
</member>
<member name="window_minimized" type="bool" setter="set_window_minimized" getter="is_window_minimized">
- If [code]true[/code] the window is minimized.
+ If [code]true[/code], the window is minimized.
</member>
<member name="window_per_pixel_transparency_enabled" type="bool" setter="set_window_per_pixel_transparency_enabled" getter="get_window_per_pixel_transparency_enabled">
</member>
diff --git a/doc/classes/Object.xml b/doc/classes/Object.xml
index fcd105d66b..76cbe5eebd 100644
--- a/doc/classes/Object.xml
+++ b/doc/classes/Object.xml
@@ -4,7 +4,8 @@
Base class for all non built-in types.
</brief_description>
<description>
- Base class for all non built-in types. Everything not a built-in type starts the inheritance chain from this class.
+ Base class for all non built-in types. Everything which is not a built-in type starts the inheritance chain from this class.
+ Objects can be constructed from scripting languages, using [code]Object.new()[/code] in GDScript, [code]new Object[/code] in C#, or the "Construct Object" node in VisualScript.
Objects do not manage memory, if inheriting from one the object will most likely have to be deleted manually (call the [method free] function from the script or delete from C++).
Some derivatives add memory management, such as [Reference] (which keeps a reference count and deletes itself automatically when no longer referenced) and [Node], which deletes the children tree when deleted.
Objects export properties, which are mainly useful for storage and editing, but not really so much in programming. Properties are exported in [method _get_property_list] and handled in [method _get] and [method _set]. However, scripting languages and C++ have simpler means to export them.
@@ -348,6 +349,16 @@
If set to true, signal emission is blocked.
</description>
</method>
+ <method name="set_deferred">
+ <return type="void">
+ </return>
+ <argument index="0" name="property" type="String">
+ </argument>
+ <argument index="1" name="value" type="Variant">
+ </argument>
+ <description>
+ </description>
+ </method>
<method name="set_indexed">
<return type="void">
</return>
diff --git a/doc/classes/OccluderPolygon2D.xml b/doc/classes/OccluderPolygon2D.xml
index e8d6b54f27..58ad268f05 100644
--- a/doc/classes/OccluderPolygon2D.xml
+++ b/doc/classes/OccluderPolygon2D.xml
@@ -14,7 +14,7 @@
</methods>
<members>
<member name="closed" type="bool" setter="set_closed" getter="is_closed">
- If [code]true[/code] closes the polygon. A closed OccluderPolygon2D occludes the light coming from any direction. An opened OccluderPolygon2D occludes the light only at its outline's direction. Default value [code]true[/code].
+ If [code]true[/code], closes the polygon. A closed OccluderPolygon2D occludes the light coming from any direction. An opened OccluderPolygon2D occludes the light only at its outline's direction. Default value [code]true[/code].
</member>
<member name="cull_mode" type="int" setter="set_cull_mode" getter="get_cull_mode" enum="OccluderPolygon2D.CullMode">
Set the direction of the occlusion culling when not [code]CULL_DISABLED[/code]. Default value [code]DISABLED[/code].
diff --git a/doc/classes/OrientedPathFollow.xml b/doc/classes/OrientedPathFollow.xml
deleted file mode 100644
index 85d60936ad..0000000000
--- a/doc/classes/OrientedPathFollow.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<class name="OrientedPathFollow" inherits="Spatial" category="Core" version="3.1">
- <brief_description>
- Oriented point sampler for a [Path].
- </brief_description>
- <description>
- This node behaves like [PathFollow], except it uses its parent [Path] up vector information to enforce orientation.
- Make sure to check if the curve of this node's parent [Path] has up vectors enabled. See [PathFollow] and [Curve3D] for further information.
- </description>
- <tutorials>
- </tutorials>
- <demos>
- </demos>
- <methods>
- </methods>
- <members>
- <member name="cubic_interp" type="bool" setter="set_cubic_interpolation" getter="get_cubic_interpolation">
- If [code]true[/code] the position between two cached points is interpolated cubically, and linearly otherwise.
- The points along the [Curve3D] of the [Path] are precomputed before use, for faster calculations. The point at the requested offset is then calculated interpolating between two adjacent cached points. This may present a problem if the curve makes sharp turns, as the cached points may not follow the curve closely enough.
- There are two answers to this problem: Either increase the number of cached points and increase memory consumption, or make a cubic interpolation between two points at the cost of (slightly) slower calculations.
- </member>
- <member name="h_offset" type="float" setter="set_h_offset" getter="get_h_offset">
- The node's offset along the curve.
- </member>
- <member name="loop" type="bool" setter="set_loop" getter="has_loop">
- If [code]true[/code], any offset outside the path's length will wrap around, instead of stopping at the ends. Use it for cyclic paths.
- </member>
- <member name="offset" type="float" setter="set_offset" getter="get_offset">
- The distance from the first vertex, measured in 3D units along the path. This sets this node's position to a point within the path.
- </member>
- <member name="unit_offset" type="float" setter="set_unit_offset" getter="get_unit_offset">
- The distance from the first vertex, considering 0.0 as the first vertex and 1.0 as the last. This is just another way of expressing the offset within the path, as the offset supplied is multiplied internally by the path's length.
- </member>
- <member name="v_offset" type="float" setter="set_v_offset" getter="get_v_offset">
- The node's offset perpendicular to the curve.
- </member>
- </members>
- <constants>
- </constants>
-</class>
diff --git a/doc/classes/PHashTranslation.xml b/doc/classes/PHashTranslation.xml
index 18c72a0576..e5745375b0 100644
--- a/doc/classes/PHashTranslation.xml
+++ b/doc/classes/PHashTranslation.xml
@@ -17,6 +17,7 @@
<argument index="0" name="from" type="Translation">
</argument>
<description>
+ Generates and sets an optimized translation from the given [Translation] resource.
</description>
</method>
</methods>
diff --git a/doc/classes/PackedScene.xml b/doc/classes/PackedScene.xml
index 7dea004b90..432ca4b23f 100644
--- a/doc/classes/PackedScene.xml
+++ b/doc/classes/PackedScene.xml
@@ -18,7 +18,7 @@
node.add_child(rigid)
# change owner of rigid, but not of collision
- rigid.set_owner(node)
+ rigid.owner = node
var scene = PackedScene.new()
# only node and rigid are now packed
@@ -61,7 +61,7 @@
<argument index="0" name="path" type="Node">
</argument>
<description>
- Pack will ignore any sub-nodes not owned by given node. See [method Node.set_owner].
+ Pack will ignore any sub-nodes not owned by given node. See [member Node.owner].
</description>
</method>
</methods>
diff --git a/doc/classes/ParallaxBackground.xml b/doc/classes/ParallaxBackground.xml
index 2409b7a1c1..81795df87f 100644
--- a/doc/classes/ParallaxBackground.xml
+++ b/doc/classes/ParallaxBackground.xml
@@ -20,7 +20,7 @@
Base motion scale of all [ParallaxLayer] children.
</member>
<member name="scroll_ignore_camera_zoom" type="bool" setter="set_ignore_camera_zoom" getter="is_ignore_camera_zoom">
- If [code]true[/code] elements in [ParallaxLayer] child aren't affected by the zoom level of the camera.
+ If [code]true[/code], elements in [ParallaxLayer] child aren't affected by the zoom level of the camera.
</member>
<member name="scroll_limit_begin" type="Vector2" setter="set_limit_begin" getter="get_limit_begin">
Top left limits for scrolling to begin. If the camera is outside of this limit the background will stop scrolling. Must be lower than [member scroll_limit_end] to work.
diff --git a/doc/classes/Particles.xml b/doc/classes/Particles.xml
index 2e30750bf9..b6e31d3576 100644
--- a/doc/classes/Particles.xml
+++ b/doc/classes/Particles.xml
@@ -49,7 +49,7 @@
The number of draw passes when rendering particles.
</member>
<member name="emitting" type="bool" setter="set_emitting" getter="is_emitting">
- If [code]true[/code] particles are being emitted. Default value: [code]true[/code].
+ If [code]true[/code], particles are being emitted. Default value: [code]true[/code].
</member>
<member name="explosiveness" type="float" setter="set_explosiveness_ratio" getter="get_explosiveness_ratio">
Time ratio between each emission. If [code]0[/code] particles are emitted continuously. If [code]1[/code] all particles are emitted simultaneously. Default value: [code]0[/code].
@@ -62,10 +62,10 @@
Amount of time each particle will exist. Default value: [code]1[/code].
</member>
<member name="local_coords" type="bool" setter="set_use_local_coordinates" getter="get_use_local_coordinates">
- If [code]true[/code] particles use the parent node's coordinate space. If [code]false[/code] they use global coordinates. Default value: [code]true[/code].
+ If [code]true[/code], particles use the parent node's coordinate space. If [code]false[/code], they use global coordinates. Default value: [code]true[/code].
</member>
<member name="one_shot" type="bool" setter="set_one_shot" getter="get_one_shot">
- If [code]true[/code] only [code]amount[/code] particles will be emitted. Default value: [code]false[/code].
+ If [code]true[/code], only [code]amount[/code] particles will be emitted. Default value: [code]false[/code].
</member>
<member name="preprocess" type="float" setter="set_pre_process_time" getter="get_pre_process_time">
Amount of time to preprocess the particles before animation starts. Lets you start the animation some time after particles have started emitting.
diff --git a/doc/classes/Particles2D.xml b/doc/classes/Particles2D.xml
index 6416e409a3..a6d23ed0f2 100644
--- a/doc/classes/Particles2D.xml
+++ b/doc/classes/Particles2D.xml
@@ -33,7 +33,7 @@
Particle draw order. Uses [code]DRAW_ORDER_*[/code] values. Default value: [code]DRAW_ORDER_INDEX[/code].
</member>
<member name="emitting" type="bool" setter="set_emitting" getter="is_emitting">
- If [code]true[/code] particles are being emitted. Default value: [code]true[/code].
+ If [code]true[/code], particles are being emitted. Default value: [code]true[/code].
</member>
<member name="explosiveness" type="float" setter="set_explosiveness_ratio" getter="get_explosiveness_ratio">
How rapidly particles in an emission cycle are emitted. If greater than [code]0[/code], there will be a gap in emissions before the next cycle begins. Default value: [code]0[/code].
@@ -46,12 +46,12 @@
Amount of time each particle will exist. Default value: [code]1[/code].
</member>
<member name="local_coords" type="bool" setter="set_use_local_coordinates" getter="get_use_local_coordinates">
- If [code]true[/code] particles use the parent node's coordinate space. If [code]false[/code] they use global coordinates. Default value: [code]true[/code].
+ If [code]true[/code], particles use the parent node's coordinate space. If [code]false[/code], they use global coordinates. Default value: [code]true[/code].
</member>
<member name="normal_map" type="Texture" setter="set_normal_map" getter="get_normal_map">
</member>
<member name="one_shot" type="bool" setter="set_one_shot" getter="get_one_shot">
- If [code]true[/code] only one emission cycle occurs. If set [code]true[/code] during a cycle, emission will stop at the cycle's end. Default value: [code]false[/code].
+ If [code]true[/code], only one emission cycle occurs. If set [code]true[/code] during a cycle, emission will stop at the cycle's end. Default value: [code]false[/code].
</member>
<member name="preprocess" type="float" setter="set_pre_process_time" getter="get_pre_process_time">
Particle system starts as if it had already run for this many seconds.
diff --git a/doc/classes/ParticlesMaterial.xml b/doc/classes/ParticlesMaterial.xml
index 2904d4c578..89913d9e0d 100644
--- a/doc/classes/ParticlesMaterial.xml
+++ b/doc/classes/ParticlesMaterial.xml
@@ -6,6 +6,7 @@
<description>
ParticlesMaterial defines particle properties and behavior. It is used in the [code]process_material[/code] of [Particles] and [Particles2D] emitter nodes.
Some of this material's properties are applied to each particle when emitted, while others can have a [CurveTexture] applied to vary values over the lifetime of the particle.
+ When a randomness ratio is applied to a property it is used to scale that property by a random amount. The random ratio is used to interpolate between [code]1.0[/code] and a random number less than one, the result is multiplied by the property to obtain the randomized property. For example a random ratio of [code]0.4[/code] would scale the original property between [code]0.4-1.0[/code] of its original value.
</description>
<tutorials>
</tutorials>
@@ -15,7 +16,8 @@
</methods>
<members>
<member name="angle" type="float" setter="set_param" getter="get_param">
- Initial rotation applied to each particle.
+ Initial rotation applied to each particle, in degrees.
+ Only applied when [member flag_disable_z] or [member flag_rotate_y] are [code]true[/code] or the [SpatialMaterial] being used to draw the particle is using [code]BillboardMode.BILLBOARD_PARTICLES[/code].
</member>
<member name="angle_curve" type="Texture" setter="set_param_texture" getter="get_param_texture">
Each particle's rotation will be animated along this [CurveTexture].
@@ -24,7 +26,8 @@
Rotation randomness ratio. Default value: [code]0[/code].
</member>
<member name="angular_velocity" type="float" setter="set_param" getter="get_param">
- Initial angular velocity applied to each particle.
+ Initial angular velocity applied to each particle. Sets the speed of rotation of the particle.
+ Only applied when [member flag_disable_z] or [member flag_rotate_y] are [code]true[/code] or the [SpatialMaterial] being used to draw the particle is using [code]BillboardMode.BILLBOARD_PARTICLES[/code].
</member>
<member name="angular_velocity_curve" type="Texture" setter="set_param_texture" getter="get_param_texture">
Each particle's angular velocity will vary along this [CurveTexture].
@@ -51,7 +54,7 @@
Animation speed randomness ratio. Default value: [code]0[/code].
</member>
<member name="color" type="Color" setter="set_color" getter="get_color">
- Each particle's initial color. If the [Particle2D]'s [code]texture[/code] is defined, it will be multiplied by this color.
+ Each particle's initial color. If the [Particles2D]'s [code]texture[/code] is defined, it will be multiplied by this color. To have particle display color in a [SpatialMaterial] make sure to set [member SpatialMaterial.vertex_color_use_as_albedo] to [code]true[/code].
</member>
<member name="color_ramp" type="Texture" setter="set_color_ramp" getter="get_color_ramp">
Each particle's color will vary along this [GradientTexture].
@@ -69,13 +72,16 @@
The box's extents if [code]emission_shape[/code] is set to [code]EMISSION_SHAPE_BOX[/code].
</member>
<member name="emission_color_texture" type="Texture" setter="set_emission_color_texture" getter="get_emission_color_texture">
+ Particle color will be modulated by color determined by sampling this texture at the same point as the [member emission_point_texture].
</member>
<member name="emission_normal_texture" type="Texture" setter="set_emission_normal_texture" getter="get_emission_normal_texture">
+ Particle velocity and rotation will be set by sampling this texture at the same point as the [member emission_point_texture]. Used only in [code]EMISSION_SHAPE_DIRECTED[/code]. Can be created automatically from mesh or node by selecting "Create Emission Points from Mesh/Node" under the "Particles" tool in the toolbar.
</member>
<member name="emission_point_count" type="int" setter="set_emission_point_count" getter="get_emission_point_count">
The number of emission points if [code]emission_shape[/code] is set to [code]EMISSION_SHAPE_POINTS[/code] or [code]EMISSION_SHAPE_DIRECTED_POINTS[/code].
</member>
<member name="emission_point_texture" type="Texture" setter="set_emission_point_texture" getter="get_emission_point_texture">
+ Particles will be emitted at positions determined by sampling this texture at a random position. Used with [code]EMISSION_SHAPE_POINTS[/code] and [code]EMISSION_SHAPE_DIRECTED_POINTS[/code]. Can be created automatically from mesh or node by selecting "Create Emission Points from Mesh/Node" under the "Particles" tool in the toolbar.
</member>
<member name="emission_shape" type="int" setter="set_emission_shape" getter="get_emission_shape" enum="ParticlesMaterial.EmissionShape">
Particles will be emitted inside this region. Use [code]EMISSION_SHAPE_*[/code] constants for values. Default value: [code]EMISSION_SHAPE_POINT[/code].
@@ -84,13 +90,16 @@
The sphere's radius if [code]emission_shape[/code] is set to [code]EMISSION_SHAPE_SPHERE[/code].
</member>
<member name="flag_align_y" type="bool" setter="set_flag" getter="get_flag">
+ Align y-axis of particle with the direction of its velocity.
</member>
<member name="flag_disable_z" type="bool" setter="set_flag" getter="get_flag">
- If [code]true[/code] particles will not move on the z axis. Default value: [code]true[/code] for [Particles2D], [code]false[/code] for [Particles].
+ If [code]true[/code], particles will not move on the z axis. Default value: [code]true[/code] for [Particles2D], [code]false[/code] for [Particles].
</member>
<member name="flag_rotate_y" type="bool" setter="set_flag" getter="get_flag">
+ If [code]true[/code], particles rotate around y-axis by [member angle].
</member>
<member name="flatness" type="float" setter="set_flatness" getter="get_flatness">
+ Amount of [member spread] in Y/Z plane. A value of [code]1[/code] restricts particles to X/Z plane. Default [code]0[/code].
</member>
<member name="gravity" type="Vector3" setter="set_gravity" getter="get_gravity">
Gravity applied to every particle. Default value: [code](0, 98, 0)[/code].
@@ -105,13 +114,13 @@
Hue variation randomness ratio. Default value: [code]0[/code].
</member>
<member name="initial_velocity" type="float" setter="set_param" getter="get_param">
- Initial velocity for each particle.
+ Initial velocity magnitude for each particle. Direction comes from [member spread].
</member>
<member name="initial_velocity_random" type="float" setter="set_param_randomness" getter="get_param_randomness">
Initial velocity randomness ratio. Default value: [code]0[/code].
</member>
<member name="linear_accel" type="float" setter="set_param" getter="get_param">
- Linear acceleration applied to each particle.
+ Linear acceleration applied to each particle. Acceleration increases velocity magnitude each frame without affecting direction.
</member>
<member name="linear_accel_curve" type="Texture" setter="set_param_texture" getter="get_param_texture">
Each particle's linear acceleration will vary along this [CurveTexture].
@@ -120,7 +129,8 @@
Linear acceleration randomness ratio. Default value: [code]0[/code].
</member>
<member name="orbit_velocity" type="float" setter="set_param" getter="get_param">
- Orbital velocity applied to each particle.
+ Orbital velocity applied to each particle. Makes the particles circle around origin. Specified in number of full rotations around origin per second.
+ Only available when [member flag_disable_z] is [code]true[/code].
</member>
<member name="orbit_velocity_curve" type="Texture" setter="set_param_texture" getter="get_param_texture">
Each particle's orbital velocity will vary along this [CurveTexture].
@@ -129,7 +139,7 @@
Orbital velocity randomness ratio. Default value: [code]0[/code].
</member>
<member name="radial_accel" type="float" setter="set_param" getter="get_param">
- Radial acceleration applied to each particle.
+ Radial acceleration applied to each particle. Makes particle accelerate away from origin.
</member>
<member name="radial_accel_curve" type="Texture" setter="set_param_texture" getter="get_param_texture">
Each particle's radial acceleration will vary along this [CurveTexture].
@@ -147,10 +157,10 @@
Scale randomness ratio. Default value: [code]0[/code].
</member>
<member name="spread" type="float" setter="set_spread" getter="get_spread">
- Each particle's initial direction range from [code]+spread[/code] to [code]-spread[/code] degrees. Default value: [code]45[/code].
+ Each particle's initial direction range from [code]+spread[/code] to [code]-spread[/code] degrees. Default value: [code]45[/code]. Applied to X/Z plane and Y/Z planes.
</member>
<member name="tangential_accel" type="float" setter="set_param" getter="get_param">
- Tangential acceleration applied to each particle. Tangential acceleration is perpendicular to the particle's velocity.
+ Tangential acceleration applied to each particle. Tangential acceleration is perpendicular to the particle's velocity giving the particles a swirling motion.
</member>
<member name="tangential_accel_curve" type="Texture" setter="set_param_texture" getter="get_param_texture">
Each particle's tangential acceleration will vary along this [CurveTexture].
@@ -225,8 +235,10 @@
Particles will be emitted in the volume of a box.
</constant>
<constant name="EMISSION_SHAPE_POINTS" value="3" enum="EmissionShape">
+ Particles will be emitted at a position determined by sampling a random point on the [member emission_point_texture]. Particle color will be modulated by [member emission_color_texture].
</constant>
<constant name="EMISSION_SHAPE_DIRECTED_POINTS" value="4" enum="EmissionShape">
+ Particles will be emitted at a position determined by sampling a random point on the [member emission_point_texture]. Particle velocity and rotation will be set based on [member emission_normal_texture]. Particle color will be modulated by [member emission_color_texture].
</constant>
</constants>
</class>
diff --git a/doc/classes/PathFollow.xml b/doc/classes/PathFollow.xml
index 650fed7ec6..da4782a7c3 100644
--- a/doc/classes/PathFollow.xml
+++ b/doc/classes/PathFollow.xml
@@ -15,7 +15,7 @@
</methods>
<members>
<member name="cubic_interp" type="bool" setter="set_cubic_interpolation" getter="get_cubic_interpolation">
- If [code]true[/code] the position between two cached points is interpolated cubically, and linearly otherwise.
+ If [code]true[/code], the position between two cached points is interpolated cubically, and linearly otherwise.
The points along the [Curve3D] of the [Path] are precomputed before use, for faster calculations. The point at the requested offset is then calculated interpolating between two adjacent cached points. This may present a problem if the curve makes sharp turns, as the cached points may not follow the curve closely enough.
There are two answers to this problem: Either increase the number of cached points and increase memory consumption, or make a cubic interpolation between two points at the cost of (slightly) slower calculations.
</member>
@@ -51,5 +51,8 @@
<constant name="ROTATION_XYZ" value="3" enum="RotationMode">
Allows the PathFollow to rotate in any axis.
</constant>
+ <constant name="ROTATION_ORIENTED" value="4" enum="RotationMode">
+ Uses the up vector information in a [Curve3D] to enforce orientation. This rotation mode requires the [Path]'s [member Curve3D.up_vector_enabled] property to be set to [code]true[/code].
+ </constant>
</constants>
</class>
diff --git a/doc/classes/PathFollow2D.xml b/doc/classes/PathFollow2D.xml
index 515c921d0d..a31652b7f9 100644
--- a/doc/classes/PathFollow2D.xml
+++ b/doc/classes/PathFollow2D.xml
@@ -15,7 +15,7 @@
</methods>
<members>
<member name="cubic_interp" type="bool" setter="set_cubic_interpolation" getter="get_cubic_interpolation">
- If [code]true[/code] the position between two cached points is interpolated cubically, and linearly otherwise.
+ If [code]true[/code], the position between two cached points is interpolated cubically, and linearly otherwise.
The points along the [Curve2D] of the [Path2D] are precomputed before use, for faster calculations. The point at the requested offset is then calculated interpolating between two adjacent cached points. This may present a problem if the curve makes sharp turns, as the cached points may not follow the curve closely enough.
There are two answers to this problem: Either increase the number of cached points and increase memory consumption, or make a cubic interpolation between two points at the cost of (slightly) slower calculations.
</member>
diff --git a/doc/classes/Physics2DDirectSpaceState.xml b/doc/classes/Physics2DDirectSpaceState.xml
index 81db70f435..1bffea0c09 100644
--- a/doc/classes/Physics2DDirectSpaceState.xml
+++ b/doc/classes/Physics2DDirectSpaceState.xml
@@ -18,7 +18,7 @@
<argument index="0" name="shape" type="Physics2DShapeQueryParameters">
</argument>
<description>
- Checks how far the shape can travel toward a point. Note that both the shape and the motion are supplied through a [Physics2DShapeQueryParameters] object. The method will return an array with two floats between 0 and 1, both representing a fraction of [code]motion[/code]. The first is how far the shape can move without triggering a collision, and the second is the point at which a collision will occur. If no collision is detected, the returned array will be [1, 1].
+ Checks how far the shape can travel toward a point. Note that both the shape and the motion are supplied through a [Physics2DShapeQueryParameters] object. The method will return an array with two floats between 0 and 1, both representing a fraction of [code]motion[/code]. The first is how far the shape can move without triggering a collision, and the second is the point at which a collision will occur. If no collision is detected, the returned array will be [code][1, 1][/code].
If the shape can not move, the array will be empty.
</description>
</method>
diff --git a/doc/classes/Physics2DServer.xml b/doc/classes/Physics2DServer.xml
index 84e15d3b26..cd887ff950 100644
--- a/doc/classes/Physics2DServer.xml
+++ b/doc/classes/Physics2DServer.xml
@@ -1128,7 +1128,7 @@
This is the constant for creating capsule shapes. A capsule shape is defined by a radius and a length. It can be used for intersections and inside/outside checks.
</constant>
<constant name="SHAPE_CONVEX_POLYGON" value="6" enum="ShapeType">
- This is the constant for creating convex polygon shapes. A polygon is defined by a list of points. It can be used for intersections and inside/outside checks. Unlike the method [method CollisionPolygon2D.set_polygon], polygons modified with [method shape_set_data] do not verify that the points supplied form is a convex polygon.
+ This is the constant for creating convex polygon shapes. A polygon is defined by a list of points. It can be used for intersections and inside/outside checks. Unlike the [member CollisionPolygon2D.polygon] property, polygons modified with [method shape_set_data] do not verify that the points supplied form is a convex polygon.
</constant>
<constant name="SHAPE_CONCAVE_POLYGON" value="7" enum="ShapeType">
This is the constant for creating concave polygon shapes. A polygon is defined by a list of points. It can be used for intersections checks, but not for inside/outside checks.
diff --git a/doc/classes/PhysicsDirectBodyState.xml b/doc/classes/PhysicsDirectBodyState.xml
index 2f3501ae5d..2b4125aef4 100644
--- a/doc/classes/PhysicsDirectBodyState.xml
+++ b/doc/classes/PhysicsDirectBodyState.xml
@@ -46,7 +46,7 @@
</argument>
<description>
Applies a single directional impulse without affecting rotation.
- This is equivalent to ``apply_impulse(Vector3(0,0,0), impulse)``.
+ This is equivalent to [code]apply_impulse(Vector3(0, 0, 0), impulse)[/code].
</description>
</method>
<method name="apply_impulse">
diff --git a/doc/classes/PhysicsDirectSpaceState.xml b/doc/classes/PhysicsDirectSpaceState.xml
index 350a9ed3ce..c4dc103b72 100644
--- a/doc/classes/PhysicsDirectSpaceState.xml
+++ b/doc/classes/PhysicsDirectSpaceState.xml
@@ -20,8 +20,8 @@
<argument index="1" name="motion" type="Vector3">
</argument>
<description>
- Checks whether the shape can travel to a point. The method will return an array with two floats between 0 and 1, both representing a fraction of [code]motion[/code]. The first is how far the shape can move without triggering a collision, and the second is the point at which a collision will occur. If no collision is detected, the returned array will be [1, 1].
- If the shape can not move, the returned array will be [0, 0].
+ Checks whether the shape can travel to a point. The method will return an array with two floats between 0 and 1, both representing a fraction of [code]motion[/code]. The first is how far the shape can move without triggering a collision, and the second is the point at which a collision will occur. If no collision is detected, the returned array will be [code][1, 1][/code].
+ If the shape can not move, the returned array will be [code][0, 0][/code].
</description>
</method>
<method name="collide_shape">
diff --git a/doc/classes/PhysicsServer.xml b/doc/classes/PhysicsServer.xml
index c836414dd2..e3ed43e7bc 100644
--- a/doc/classes/PhysicsServer.xml
+++ b/doc/classes/PhysicsServer.xml
@@ -135,7 +135,7 @@
<argument index="0" name="area" type="RID">
</argument>
<description>
- If [code]true[/code] area collides with rays.
+ If [code]true[/code], area collides with rays.
</description>
</method>
<method name="area_remove_shape">
@@ -556,7 +556,7 @@
<argument index="0" name="body" type="RID">
</argument>
<description>
- If [code]true[/code] the continuous collision detection mode is enabled.
+ If [code]true[/code], the continuous collision detection mode is enabled.
</description>
</method>
<method name="body_is_omitting_force_integration" qualifiers="const">
@@ -574,7 +574,7 @@
<argument index="0" name="body" type="RID">
</argument>
<description>
- If [code]true[/code] the body can be detected by rays
+ If [code]true[/code], the body can be detected by rays
</description>
</method>
<method name="body_remove_collision_exception">
@@ -653,7 +653,7 @@
<argument index="1" name="enable" type="bool">
</argument>
<description>
- If [code]true[/code] the continuous collision detection mode is enabled.
+ If [code]true[/code], the continuous collision detection mode is enabled.
Continuous collision detection tries to predict where a moving body will collide, instead of moving it and correcting its movement if it collided.
</description>
</method>
@@ -773,7 +773,7 @@
<argument index="1" name="space" type="RID">
</argument>
<description>
- Assigns a space to the body (see [method create_space]).
+ Assigns a space to the body (see [method space_create]).
</description>
</method>
<method name="body_set_state">
@@ -884,7 +884,7 @@
<argument index="0" name="process_info" type="int" enum="PhysicsServer.ProcessInfo">
</argument>
<description>
- Returns an Info defined by the [ProcessInfo] input given.
+ Returns an Info defined by the [enum PhysicsServer.ProcessInfo] input given.
</description>
</method>
<method name="hinge_joint_get_flag" qualifiers="const">
@@ -1286,10 +1286,10 @@
Maximum acceleration for the motor.
</constant>
<constant name="HINGE_JOINT_FLAG_USE_LIMIT" value="0" enum="HingeJointFlag">
- If [code]true[/code] the Hinge has a maximum and a minimum rotation.
+ If [code]true[/code], the Hinge has a maximum and a minimum rotation.
</constant>
<constant name="HINGE_JOINT_FLAG_ENABLE_MOTOR" value="1" enum="HingeJointFlag">
- If [code]true[/code] a motor turns the Hinge
+ If [code]true[/code], a motor turns the Hinge
</constant>
<constant name="SLIDER_JOINT_LINEAR_LIMIT_UPPER" value="0" enum="SliderJointParam">
The maximum difference between the pivot points on their x-axis before damping happens.
@@ -1401,31 +1401,31 @@
<constant name="G6DOF_JOINT_LINEAR_MOTOR_FORCE_LIMIT" value="6" enum="G6DOFJointAxisParam">
The maximum force that the linear motor can apply while trying to reach the target velocity.
</constant>
- <constant name="G6DOF_JOINT_ANGULAR_LOWER_LIMIT" value="7" enum="G6DOFJointAxisParam">
+ <constant name="G6DOF_JOINT_ANGULAR_LOWER_LIMIT" value="10" enum="G6DOFJointAxisParam">
The minimum rotation in negative direction to break loose and rotate around the axes.
</constant>
- <constant name="G6DOF_JOINT_ANGULAR_UPPER_LIMIT" value="8" enum="G6DOFJointAxisParam">
+ <constant name="G6DOF_JOINT_ANGULAR_UPPER_LIMIT" value="11" enum="G6DOFJointAxisParam">
The minimum rotation in positive direction to break loose and rotate around the axes.
</constant>
- <constant name="G6DOF_JOINT_ANGULAR_LIMIT_SOFTNESS" value="9" enum="G6DOFJointAxisParam">
+ <constant name="G6DOF_JOINT_ANGULAR_LIMIT_SOFTNESS" value="12" enum="G6DOFJointAxisParam">
A factor that gets multiplied onto all rotations across the axes.
</constant>
- <constant name="G6DOF_JOINT_ANGULAR_DAMPING" value="10" enum="G6DOFJointAxisParam">
+ <constant name="G6DOF_JOINT_ANGULAR_DAMPING" value="13" enum="G6DOFJointAxisParam">
The amount of rotational damping across the axes. The lower, the more dampening occurs.
</constant>
- <constant name="G6DOF_JOINT_ANGULAR_RESTITUTION" value="11" enum="G6DOFJointAxisParam">
+ <constant name="G6DOF_JOINT_ANGULAR_RESTITUTION" value="14" enum="G6DOFJointAxisParam">
The amount of rotational restitution across the axes. The lower, the more restitution occurs.
</constant>
- <constant name="G6DOF_JOINT_ANGULAR_FORCE_LIMIT" value="12" enum="G6DOFJointAxisParam">
+ <constant name="G6DOF_JOINT_ANGULAR_FORCE_LIMIT" value="15" enum="G6DOFJointAxisParam">
The maximum amount of force that can occur, when rotating around the axes.
</constant>
- <constant name="G6DOF_JOINT_ANGULAR_ERP" value="13" enum="G6DOFJointAxisParam">
+ <constant name="G6DOF_JOINT_ANGULAR_ERP" value="16" enum="G6DOFJointAxisParam">
When correcting the crossing of limits in rotation across the axes, this error tolerance factor defines how much the correction gets slowed down. The lower, the slower.
</constant>
- <constant name="G6DOF_JOINT_ANGULAR_MOTOR_TARGET_VELOCITY" value="14" enum="G6DOFJointAxisParam">
+ <constant name="G6DOF_JOINT_ANGULAR_MOTOR_TARGET_VELOCITY" value="17" enum="G6DOFJointAxisParam">
Target speed for the motor at the axes.
</constant>
- <constant name="G6DOF_JOINT_ANGULAR_MOTOR_FORCE_LIMIT" value="15" enum="G6DOFJointAxisParam">
+ <constant name="G6DOF_JOINT_ANGULAR_MOTOR_FORCE_LIMIT" value="18" enum="G6DOFJointAxisParam">
Maximum acceleration for the motor at the axes.
</constant>
<constant name="G6DOF_JOINT_FLAG_ENABLE_LINEAR_LIMIT" value="0" enum="G6DOFJointAxisFlag">
@@ -1434,10 +1434,10 @@
<constant name="G6DOF_JOINT_FLAG_ENABLE_ANGULAR_LIMIT" value="1" enum="G6DOFJointAxisFlag">
If [code]set[/code] there is rotational motion possible.
</constant>
- <constant name="G6DOF_JOINT_FLAG_ENABLE_MOTOR" value="2" enum="G6DOFJointAxisFlag">
+ <constant name="G6DOF_JOINT_FLAG_ENABLE_MOTOR" value="4" enum="G6DOFJointAxisFlag">
If [code]set[/code] there is a rotational motor across these axes.
</constant>
- <constant name="G6DOF_JOINT_FLAG_ENABLE_LINEAR_MOTOR" value="3" enum="G6DOFJointAxisFlag">
+ <constant name="G6DOF_JOINT_FLAG_ENABLE_LINEAR_MOTOR" value="5" enum="G6DOFJointAxisFlag">
If [code]set[/code] there is a linear motor on this axis that targets a specific velocity.
</constant>
<constant name="SHAPE_PLANE" value="0" enum="ShapeType">
diff --git a/doc/classes/Polygon2D.xml b/doc/classes/Polygon2D.xml
index bf4519fd0a..9803837e5d 100644
--- a/doc/classes/Polygon2D.xml
+++ b/doc/classes/Polygon2D.xml
@@ -80,18 +80,20 @@
</methods>
<members>
<member name="antialiased" type="bool" setter="set_antialiased" getter="get_antialiased">
- If [code]true[/code] polygon edges will be anti-aliased. Default value: [code]false[/code].
+ If [code]true[/code], polygon edges will be anti-aliased. Default value: [code]false[/code].
</member>
<member name="bones" type="Array" setter="_set_bones" getter="_get_bones">
</member>
<member name="color" type="Color" setter="set_color" getter="get_color">
The polygon's fill color. If [code]texture[/code] is defined, it will be multiplied by this color. It will also be the default color for vertices not set in [code]vertex_colors[/code].
</member>
+ <member name="internal_vertex_count" type="int" setter="set_internal_vertex_count" getter="get_internal_vertex_count">
+ </member>
<member name="invert_border" type="float" setter="set_invert_border" getter="get_invert_border">
Added padding applied to the bounding box when using [code]invert[/code]. Setting this value too small may result in a "Bad Polygon" error. Default value: [code]100[/code].
</member>
<member name="invert_enable" type="bool" setter="set_invert" getter="get_invert">
- If [code]true[/code] polygon will be inverted, containing the area outside the defined points and extending to the [code]invert_border[/code]. Default value: [code]false[/code].
+ If [code]true[/code], polygon will be inverted, containing the area outside the defined points and extending to the [code]invert_border[/code]. Default value: [code]false[/code].
</member>
<member name="offset" type="Vector2" setter="set_offset" getter="get_offset">
The offset applied to each vertex.
@@ -99,9 +101,9 @@
<member name="polygon" type="PoolVector2Array" setter="set_polygon" getter="get_polygon">
The polygon's list of vertices. The final point will be connected to the first.
</member>
- <member name="skeleton" type="NodePath" setter="set_skeleton" getter="get_skeleton">
+ <member name="polygons" type="Array" setter="set_polygons" getter="get_polygons">
</member>
- <member name="splits" type="PoolIntArray" setter="set_splits" getter="get_splits">
+ <member name="skeleton" type="NodePath" setter="set_skeleton" getter="get_skeleton">
</member>
<member name="texture" type="Texture" setter="set_texture" getter="get_texture">
The polygon's fill texture. Use [code]uv[/code] to set texture coordinates.
diff --git a/doc/classes/PoolByteArray.xml b/doc/classes/PoolByteArray.xml
index ae722b1053..83a138be97 100644
--- a/doc/classes/PoolByteArray.xml
+++ b/doc/classes/PoolByteArray.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="PoolByteArray" category="Built-In Types" version="3.1">
<brief_description>
- Raw byte array.
+ A pooled [Array] of bytes.
</brief_description>
<description>
- Raw byte array. Contains bytes. Optimized for memory usage, can't fragment the memory. Note that this type is passed by value and not by reference.
+ An [Array] specifically designed to hold bytes. Optimized for memory usage, does not fragment the memory. Note that this type is passed by value and not by reference.
</description>
<tutorials>
</tutorials>
@@ -17,7 +17,7 @@
<argument index="0" name="from" type="Array">
</argument>
<description>
- Create from a generic array.
+ Construct a new [code]PoolByteArray[/code]. Optionally, you can pass in a generic [Array] that will be converted.
</description>
</method>
<method name="append">
@@ -40,7 +40,7 @@
<argument index="0" name="compression_mode" type="int" default="0">
</argument>
<description>
- Returns a new [code]PoolByteArray[/code] with the data compressed. Set the compression mode using one of [File]'s COMPRESS_* constants.
+ Returns a new [code]PoolByteArray[/code] with the data compressed. Set the compression mode using one of [enum File.CompressionMode]'s constants.
</description>
</method>
<method name="decompress">
@@ -51,21 +51,21 @@
<argument index="1" name="compression_mode" type="int" default="0">
</argument>
<description>
- Returns a new [code]PoolByteArray[/code] with the data decompressed. Set buffer_size to the size of the uncompressed data. Set the compression mode using one of [File]'s COMPRESS_* constants.
+ Returns a new [code]PoolByteArray[/code] with the data decompressed. Set [code]buffer_size[/code] to the size of the uncompressed data. Set the compression mode using one of [enum File.CompressionMode]'s constants.
</description>
</method>
<method name="get_string_from_ascii">
<return type="String">
</return>
<description>
- Returns a copy of the array's contents as [String]. Fast alternative to [method PoolByteArray.get_string_from_utf8] if the content is ASCII-only. Unlike the UTF-8 function this function maps every byte to a character in the array. Multibyte sequences will not be interpreted correctly. For parsing user input always use [method PoolByteArray.get_string_from_utf8].
+ Returns a copy of the array's contents as [String]. Fast alternative to [method get_string_from_utf8] if the content is ASCII-only. Unlike the UTF-8 function this function maps every byte to a character in the array. Multibyte sequences will not be interpreted correctly. For parsing user input always use [method get_string_from_utf8].
</description>
</method>
<method name="get_string_from_utf8">
<return type="String">
</return>
<description>
- Returns a copy of the array's contents as [String]. Slower than [method PoolByteArray.get_string_from_ascii] but supports UTF-8 encoded data. Use this function if you are unsure about the source of the data. For user input this function should always be preferred.
+ Returns a copy of the array's contents as [String]. Slower than [method get_string_from_ascii] but supports UTF-8 encoded data. Use this function if you are unsure about the source of the data. For user input this function should always be preferred.
</description>
</method>
<method name="insert">
@@ -76,7 +76,7 @@
<argument index="1" name="byte" type="int">
</argument>
<description>
- Insert a new element at a given position in the array. The position must be valid, or at the end of the array (pos==size()).
+ Insert a new element at a given position in the array. The position must be valid, or at the end of the array ([code]idx == size()[/code]).
</description>
</method>
<method name="invert">
diff --git a/doc/classes/PoolColorArray.xml b/doc/classes/PoolColorArray.xml
index 021d5f5089..9fdd1090ae 100644
--- a/doc/classes/PoolColorArray.xml
+++ b/doc/classes/PoolColorArray.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="PoolColorArray" category="Built-In Types" version="3.1">
<brief_description>
- Array of Colors
+ A pooled [Array] of [Color].
</brief_description>
<description>
- Array of Color, Contains colors. Optimized for memory usage, can't fragment the memory. Note that this type is passed by value and not by reference.
+ An [Array] specifically designed to hold [Color]. Optimized for memory usage, does not fragment the memory. Note that this type is passed by value and not by reference.
</description>
<tutorials>
</tutorials>
@@ -17,7 +17,7 @@
<argument index="0" name="from" type="Array">
</argument>
<description>
- Create from a generic array.
+ Construct a new [code]PoolColorArray[/code]. Optionally, you can pass in a generic [Array] that will be converted.
</description>
</method>
<method name="append">
@@ -42,7 +42,7 @@
<argument index="1" name="color" type="Color">
</argument>
<description>
- Insert a new element at a given position in the array. The position must be valid, or at the end of the array (pos==size()).
+ Insert a new element at a given position in the array. The position must be valid, or at the end of the array ([code]idx == size()[/code]).
</description>
</method>
<method name="invert">
diff --git a/doc/classes/PoolIntArray.xml b/doc/classes/PoolIntArray.xml
index 347dcb09f2..a8808284b5 100644
--- a/doc/classes/PoolIntArray.xml
+++ b/doc/classes/PoolIntArray.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="PoolIntArray" category="Built-In Types" version="3.1">
<brief_description>
- Integer Array.
+ A pooled [Array] of integers ([int]).
</brief_description>
<description>
- Integer Array. Contains integers. Optimized for memory usage, can't fragment the memory. Note that this type is passed by value and not by reference.
+ An [Array] specifically designed to hold integer values ([int]). Optimized for memory usage, does not fragment the memory. Note that this type is passed by value and not by reference.
</description>
<tutorials>
</tutorials>
@@ -17,7 +17,7 @@
<argument index="0" name="from" type="Array">
</argument>
<description>
- Create from a generic array.
+ Construct a new [code]PoolIntArray[/code]. Optionally, you can pass in a generic [Array] that will be converted.
</description>
</method>
<method name="append">
@@ -31,7 +31,7 @@
<argument index="0" name="array" type="PoolIntArray">
</argument>
<description>
- Append an [code]PoolIntArray[/code] at the end of this array.
+ Append a [code]PoolIntArray[/code] at the end of this array.
</description>
</method>
<method name="insert">
@@ -42,7 +42,7 @@
<argument index="1" name="integer" type="int">
</argument>
<description>
- Insert a new int at a given position in the array. The position must be valid, or at the end of the array (pos==size()).
+ Insert a new int at a given position in the array. The position must be valid, or at the end of the array ([code]idx == size()[/code]).
</description>
</method>
<method name="invert">
diff --git a/doc/classes/PoolRealArray.xml b/doc/classes/PoolRealArray.xml
index c0c6ef8700..3eb485ce12 100644
--- a/doc/classes/PoolRealArray.xml
+++ b/doc/classes/PoolRealArray.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="PoolRealArray" category="Built-In Types" version="3.1">
<brief_description>
- Real Array.
+ A pooled [Array] of reals ([float]).
</brief_description>
<description>
- Real Array. Array of floating point values. Can only contain floats. Optimized for memory usage, can't fragment the memory. Note that this type is passed by value and not by reference.
+ An [Array] specifically designed to hold floating point values ([float]). Optimized for memory usage, does not fragment the memory. Note that this type is passed by value and not by reference.
</description>
<tutorials>
</tutorials>
@@ -17,7 +17,7 @@
<argument index="0" name="from" type="Array">
</argument>
<description>
- Create from a generic array.
+ Construct a new [code]PoolRealArray[/code]. Optionally, you can pass in a generic [Array] that will be converted.
</description>
</method>
<method name="append">
@@ -31,7 +31,7 @@
<argument index="0" name="array" type="PoolRealArray">
</argument>
<description>
- Append an [RealArray] at the end of this array.
+ Append a [code]PoolRealArray[/code] at the end of this array.
</description>
</method>
<method name="insert">
@@ -42,7 +42,7 @@
<argument index="1" name="value" type="float">
</argument>
<description>
- Insert a new element at a given position in the array. The position must be valid, or at the end of the array (pos==size()).
+ Insert a new element at a given position in the array. The position must be valid, or at the end of the array ([code]idx == size()[/code]).
</description>
</method>
<method name="invert">
diff --git a/doc/classes/PoolStringArray.xml b/doc/classes/PoolStringArray.xml
index 8b3ac4c16a..a02c6c1bdb 100644
--- a/doc/classes/PoolStringArray.xml
+++ b/doc/classes/PoolStringArray.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="PoolStringArray" category="Built-In Types" version="3.1">
<brief_description>
- String Array.
+ A pooled [Array] of [String].
</brief_description>
<description>
- String Array. Array of strings. Can only contain strings. Optimized for memory usage, can't fragment the memory. Note that this type is passed by value and not by reference.
+ An [Array] specifically designed to hold [String]. Optimized for memory usage, does not fragment the memory. Note that this type is passed by value and not by reference.
</description>
<tutorials>
</tutorials>
@@ -17,7 +17,7 @@
<argument index="0" name="from" type="Array">
</argument>
<description>
- Create from a generic array.
+ Construct a new [code]PoolStringArray[/code]. Optionally, you can pass in a generic [Array] that will be converted.
</description>
</method>
<method name="append">
@@ -31,7 +31,7 @@
<argument index="0" name="array" type="PoolStringArray">
</argument>
<description>
- Append an [StringArray] at the end of this array.
+ Append a [code]PoolStringArray[/code] at the end of this array.
</description>
</method>
<method name="insert">
@@ -42,7 +42,7 @@
<argument index="1" name="string" type="String">
</argument>
<description>
- Insert a new element at a given position in the array. The position must be valid, or at the end of the array (pos==size()).
+ Insert a new element at a given position in the array. The position must be valid, or at the end of the array ([code]idx == size()[/code]).
</description>
</method>
<method name="invert">
@@ -56,7 +56,7 @@
<argument index="0" name="delimiter" type="String">
</argument>
<description>
- Returns a [String] with each element of the array joined with the delimiter.
+ Returns a [String] with each element of the array joined with the given [code]delimiter[/code].
</description>
</method>
<method name="push_back">
diff --git a/doc/classes/PoolVector2Array.xml b/doc/classes/PoolVector2Array.xml
index ecf8f5a6ba..39d89c2ebd 100644
--- a/doc/classes/PoolVector2Array.xml
+++ b/doc/classes/PoolVector2Array.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="PoolVector2Array" category="Built-In Types" version="3.1">
<brief_description>
- An Array of Vector2.
+ A pooled [Array] of [Vector2].
</brief_description>
<description>
- An Array specifically designed to hold Vector2. Note that this type is passed by value and not by reference.
+ An [Array] specifically designed to hold [Vector2]. Optimized for memory usage, does not fragment the memory. Note that this type is passed by value and not by reference.
</description>
<tutorials>
</tutorials>
@@ -17,7 +17,7 @@
<argument index="0" name="from" type="Array">
</argument>
<description>
- Construct a new [code]PoolVector2Array[/code]. Optionally, you can pass in an Array that will be converted.
+ Construct a new [code]PoolVector2Array[/code]. Optionally, you can pass in a generic [Array] that will be converted.
</description>
</method>
<method name="append">
@@ -31,7 +31,7 @@
<argument index="0" name="array" type="PoolVector2Array">
</argument>
<description>
- Append an [code]PoolVector2Array[/code] at the end of this array.
+ Append a [code]PoolVector2Array[/code] at the end of this array.
</description>
</method>
<method name="insert">
@@ -42,7 +42,7 @@
<argument index="1" name="vector2" type="Vector2">
</argument>
<description>
- Insert a new element at a given position in the array. The position must be valid, or at the end of the array (pos==size()).
+ Insert a new element at a given position in the array. The position must be valid, or at the end of the array ([code]idx == size()[/code]).
</description>
</method>
<method name="invert">
diff --git a/doc/classes/PoolVector3Array.xml b/doc/classes/PoolVector3Array.xml
index 456b54d209..3f77e737f6 100644
--- a/doc/classes/PoolVector3Array.xml
+++ b/doc/classes/PoolVector3Array.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="PoolVector3Array" category="Built-In Types" version="3.1">
<brief_description>
- An Array of Vector3.
+ A pooled [Array] of [Vector3].
</brief_description>
<description>
- An Array specifically designed to hold Vector3. Note that this type is passed by value and not by reference.
+ An [Array] specifically designed to hold [Vector3]. Optimized for memory usage, does not fragment the memory. Note that this type is passed by value and not by reference.
</description>
<tutorials>
</tutorials>
@@ -17,7 +17,7 @@
<argument index="0" name="from" type="Array">
</argument>
<description>
- Construct a new PoolVector3Array. Optionally, you can pass in an Array that will be converted.
+ Construct a new [code]PoolVector3Array[/code]. Optionally, you can pass in a generic [Array] that will be converted.
</description>
</method>
<method name="append">
@@ -31,7 +31,7 @@
<argument index="0" name="array" type="PoolVector3Array">
</argument>
<description>
- Append an [code]PoolVector3Array[/code] at the end of this array.
+ Append a [code]PoolVector3Array[/code] at the end of this array.
</description>
</method>
<method name="insert">
@@ -42,7 +42,7 @@
<argument index="1" name="vector3" type="Vector3">
</argument>
<description>
- Insert a new element at a given position in the array. The position must be valid, or at the end of the array (pos==size()).
+ Insert a new element at a given position in the array. The position must be valid, or at the end of the array ([code]idx == size()[/code]).
</description>
</method>
<method name="invert">
diff --git a/doc/classes/Popup.xml b/doc/classes/Popup.xml
index ae5bce5d7d..be6e8b6ef1 100644
--- a/doc/classes/Popup.xml
+++ b/doc/classes/Popup.xml
@@ -26,7 +26,7 @@
<argument index="0" name="size" type="Vector2" default="Vector2( 0, 0 )">
</argument>
<description>
- Popup (show the control in modal form) in the center of the screen, at the current size, or at a size determined by "size".
+ Popup (show the control in modal form) in the center of the screen relative to its current canvas transform, at the current size, or at a size determined by "size".
</description>
</method>
<method name="popup_centered_minsize">
@@ -35,7 +35,7 @@
<argument index="0" name="minsize" type="Vector2" default="Vector2( 0, 0 )">
</argument>
<description>
- Popup (show the control in modal form) in the center of the screen, ensuring the size is never smaller than [code]minsize[/code].
+ Popup (show the control in modal form) in the center of the screen relative to the current canvas transform, ensuring the size is never smaller than [code]minsize[/code].
</description>
</method>
<method name="popup_centered_ratio">
@@ -44,13 +44,13 @@
<argument index="0" name="ratio" type="float" default="0.75">
</argument>
<description>
- Popup (show the control in modal form) in the center of the screen, scaled at a ratio of size of the screen.
+ Popup (show the control in modal form) in the center of the screen relative to the current canvas transform, scaled at a ratio of size of the screen.
</description>
</method>
</methods>
<members>
<member name="popup_exclusive" type="bool" setter="set_exclusive" getter="is_exclusive">
- If [code]true[/code] the popup will not be hidden when a click event occurs outside of it, or when it receives the [code]ui_cancel[/code] action event.
+ If [code]true[/code], the popup will not be hidden when a click event occurs outside of it, or when it receives the [code]ui_cancel[/code] action event.
</member>
</members>
<signals>
diff --git a/doc/classes/ProgressBar.xml b/doc/classes/ProgressBar.xml
index 0f03b7b80a..8d6e77751d 100644
--- a/doc/classes/ProgressBar.xml
+++ b/doc/classes/ProgressBar.xml
@@ -14,7 +14,7 @@
</methods>
<members>
<member name="percent_visible" type="bool" setter="set_percent_visible" getter="is_percent_visible">
- If [code]true[/code] the fill percentage is displayed on the bar. Default value: [code]true[/code].
+ If [code]true[/code], the fill percentage is displayed on the bar. Default value: [code]true[/code].
</member>
</members>
<constants>
diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml
index 9706ea4e60..6b53615535 100644
--- a/doc/classes/ProjectSettings.xml
+++ b/doc/classes/ProjectSettings.xml
@@ -172,8 +172,8 @@
Path to an image used for boot splash.
</member>
<member name="application/config/custom_user_dir_name" type="String" setter="" getter="">
- This directory is used for storing persistent data (user:// filesystem). If a custom name is set, then system paths will be used to store this on Desktop (AppData on Windows, user ~/.config on Unixes, etc), else the Godot config folder is used. This name needs to be unique, and it's recommended to set it to something before publishing.
- the "use_custom_user_dir" setting must be enabled for this to take effect.
+ This user directory is used for storing persistent data ([code]user://[/code] filesystem). By default (no custom name defined), [code]user://[/code] resolves to a project-specific folder in Godot's own configuration folder (see [method OS.get_user_data_dir]). If a custom directory name is defined, this name will be used instead and appended to the system-specific user data directory (same parent folder as the Godot configuration folder documented in [method OS.get_user_data_dir]).
+ The [member application/config/use_custom_user_dir] setting must be enabled for this to take effect.
</member>
<member name="application/config/icon" type="String" setter="" getter="">
Icon used for the project, set when project loads. Exporters will use this icon when possible to.
@@ -181,8 +181,11 @@
<member name="application/config/name" type="String" setter="" getter="">
Name of the project. It is used from both project manager and by the exporters. Overriding this as name.locale allows setting it in multiple languages.
</member>
+ <member name="application/config/project_settings_override" type="String" setter="" getter="">
+ Specifies a file to override project settings. For example: [code]user://custom_settings.cfg[/code].
+ </member>
<member name="application/config/use_custom_user_dir" type="bool" setter="" getter="">
- Allow the project to save to its own custom user dir (in AppData on windows or ~/.config on unixes). This setting only works for desktop exporters. A name must be set in the "custom_user_dir_name" setting for this to take effect.
+ Allow the project to save to its own custom user dir (see [member application/config/custom_user_dir_name]). This setting only works for desktop platforms. A name must be set in the [member application/config/custom_user_dir_name] setting for this to take effect.
</member>
<member name="application/run/disable_stderr" type="bool" setter="" getter="">
Disable printing to stderr on exported build.
@@ -210,6 +213,9 @@
</member>
<member name="audio/driver" type="String" setter="" getter="">
</member>
+ <member name="audio/enable_audio_input" type="bool" setter="" getter="">
+ This option should be enabled if project works with microphone.
+ </member>
<member name="audio/mix_rate" type="int" setter="" getter="">
Mix rate used for audio. In general, it's better to not touch this and leave it to the host operating system.
</member>
@@ -577,10 +583,10 @@
Log all output to a file.
</member>
<member name="logging/file_logging/log_path" type="String" setter="" getter="">
- Path to logs withint he project. Using an user:// based path is recommended.
+ Path to logs withint he project. Using an [code]user://[/code] based path is recommended.
</member>
<member name="logging/file_logging/max_log_files" type="int" setter="" getter="">
- Amount of log files (used for rotation)/
+ Amount of log files (used for rotation).
</member>
<member name="memory/limits/message_queue/max_size_kb" type="int" setter="" getter="">
Godot uses a message queue to defer some function calls. If you run out of space on it (you will see an error), you can increase the size here.
@@ -588,14 +594,6 @@
<member name="memory/limits/multithreaded_server/rid_pool_prealloc" type="int" setter="" getter="">
This is used by servers when used in multi threading mode (servers and visual). RIDs are preallocated to avoid stalling the server requesting them on threads. If servers get stalled too often when loading resources in a thread, increase this number.
</member>
- <member name="mono/debugger_agent/port" type="int" setter="" getter="">
- </member>
- <member name="mono/debugger_agent/wait_for_debugger" type="bool" setter="" getter="">
- </member>
- <member name="mono/debugger_agent/wait_timeout" type="int" setter="" getter="">
- </member>
- <member name="mono/export/include_scripts_content" type="bool" setter="" getter="">
- </member>
<member name="network/limits/debugger_stdout/max_chars_per_second" type="int" setter="" getter="">
Maximum amount of characters allowed to send as output from the debugger. Over this value, content is dropped. This helps not to stall the debugger connection.
</member>
@@ -672,6 +670,10 @@
<member name="rendering/limits/time/time_rollover_secs" type="float" setter="" getter="">
Shaders have a time variable that constantly increases. At some point it needs to be rolled back to zero to avoid numerical errors on shader animations. This setting specifies when.
</member>
+ <member name="rendering/quality/2d/gles2_use_nvidia_rect_flicker_workaround" type="bool" setter="" getter="">
+ Some Nvidia GPU drivers have a bug, which produces flickering issues for the [code]draw_rect[/code] method, especially as used in [TileMap]. Refer to https://github.com/godotengine/godot/issues/9913 for details.
+ If [code]true[/code], this option enables a "safe" code path for such Nvidia GPUs, at the cost of performance. This option only impacts the GLES2 rendering backend (so the bug stays if you use GLES3), and only desktop platforms. Default value: [code]false[/code].
+ </member>
<member name="rendering/quality/2d/use_pixel_snap" type="bool" setter="" getter="">
Force snapping of polygons to pixels in 2D rendering. May help in some pixel art styles.
</member>
diff --git a/doc/classes/Quat.xml b/doc/classes/Quat.xml
index 468839dfba..990dcc7a91 100644
--- a/doc/classes/Quat.xml
+++ b/doc/classes/Quat.xml
@@ -10,7 +10,6 @@
</description>
<tutorials>
<link>https://docs.godotengine.org/en/latest/tutorials/3d/using_transforms.html#interpolating-with-quaternions</link>
- <link>https://docs.godotengine.org/en/latest/tutorials/math/rotations.html</link>
</tutorials>
<demos>
</demos>
diff --git a/doc/classes/RandomNumberGenerator.xml b/doc/classes/RandomNumberGenerator.xml
index aee9654561..5badfba923 100644
--- a/doc/classes/RandomNumberGenerator.xml
+++ b/doc/classes/RandomNumberGenerator.xml
@@ -10,7 +10,14 @@
<demos>
</demos>
<methods>
- <method name="rand_range">
+ <method name="randf">
+ <return type="float">
+ </return>
+ <description>
+ Generates pseudo-random float between '0.0' and '1.0'.
+ </description>
+ </method>
+ <method name="randf_range">
<return type="float">
</return>
<argument index="0" name="from" type="float">
@@ -21,18 +28,22 @@
Generates pseudo-random float between [code]from[/code] and [code]to[/code].
</description>
</method>
- <method name="randf">
- <return type="float">
+ <method name="randi">
+ <return type="int">
</return>
<description>
- Generates pseudo-random float between '0.0' and '1.0'.
+ Generates pseudo-random 32-bit unsigned integer between '0' and '4294967295'.
</description>
</method>
- <method name="randi">
+ <method name="randi_range">
<return type="int">
</return>
+ <argument index="0" name="from" type="int">
+ </argument>
+ <argument index="1" name="to" type="int">
+ </argument>
<description>
- Generates pseudo-random 32-bit integer between '0' and '4294967295'.
+ Generates pseudo-random 32-bit signed integer between [code]from[/code] and [code]to[/code](inclusive).
</description>
</method>
<method name="randomize">
diff --git a/doc/classes/Range.xml b/doc/classes/Range.xml
index 46a6132b94..0dc02a68da 100644
--- a/doc/classes/Range.xml
+++ b/doc/classes/Range.xml
@@ -30,13 +30,13 @@
</methods>
<members>
<member name="allow_greater" type="bool" setter="set_allow_greater" getter="is_greater_allowed">
- If [code]true[/code] [member value] may be greater than [member max_value]. Default value: [code]false[/code].
+ If [code]true[/code], [member value] may be greater than [member max_value]. Default value: [code]false[/code].
</member>
<member name="allow_lesser" type="bool" setter="set_allow_lesser" getter="is_lesser_allowed">
- If [code]true[/code] [member value] may be less than [member min_value]. Default value: [code]false[/code].
+ If [code]true[/code], [member value] may be less than [member min_value]. Default value: [code]false[/code].
</member>
<member name="exp_edit" type="bool" setter="set_exp_ratio" getter="is_ratio_exp">
- If [code]true[/code] and [code]min_value[/code] is greater than 0, [code]value[/code] will be represented exponentially rather than linearly.
+ If [code]true[/code], and [code]min_value[/code] is greater than 0, [code]value[/code] will be represented exponentially rather than linearly.
</member>
<member name="max_value" type="float" setter="set_max" getter="get_max">
Maximum value. Range is clamped if [code]value[/code] is greater than [code]max_value[/code]. Default value: [code]100[/code].
@@ -51,7 +51,7 @@
The value mapped between 0 and 1.
</member>
<member name="rounded" type="bool" setter="set_use_rounded_values" getter="is_using_rounded_values">
- If [code]true[/code] [code]value[/code] will always be rounded to the nearest integer. Default value: [code]false[/code].
+ If [code]true[/code], [code]value[/code] will always be rounded to the nearest integer. Default value: [code]false[/code].
</member>
<member name="step" type="float" setter="set_step" getter="get_step">
If greater than 0, [code]value[/code] will always be rounded to a multiple of [code]step[/code]. If [code]rounded[/code] is also [code]true[/code], [code]value[/code] will first be rounded to a multiple of [code]step[/code] then rounded to the nearest integer.
diff --git a/doc/classes/RayCast.xml b/doc/classes/RayCast.xml
index 84c83d1282..61f2737c01 100644
--- a/doc/classes/RayCast.xml
+++ b/doc/classes/RayCast.xml
@@ -136,10 +136,10 @@
The ray's collision mask. Only objects in at least one collision layer enabled in the mask will be detected.
</member>
<member name="enabled" type="bool" setter="set_enabled" getter="is_enabled">
- If [code]true[/code] collisions will be reported. Default value: [code]false[/code].
+ If [code]true[/code], collisions will be reported. Default value: [code]false[/code].
</member>
<member name="exclude_parent" type="bool" setter="set_exclude_parent_body" getter="get_exclude_parent_body">
- If [code]true[/code] collisions will be ignored for this RayCast's immediate parent. Default value: [code]true[/code].
+ If [code]true[/code], collisions will be ignored for this RayCast's immediate parent. Default value: [code]true[/code].
</member>
</members>
<constants>
diff --git a/doc/classes/RayShape.xml b/doc/classes/RayShape.xml
index e03541011d..50d324f72c 100644
--- a/doc/classes/RayShape.xml
+++ b/doc/classes/RayShape.xml
@@ -17,7 +17,7 @@
The ray's length.
</member>
<member name="slips_on_slope" type="bool" setter="set_slips_on_slope" getter="get_slips_on_slope">
- If [code]true[/code] allow the shape to return the correct normal. Default value: [code]false[/code].
+ If [code]true[/code], allow the shape to return the correct normal. Default value: [code]false[/code].
</member>
</members>
<constants>
diff --git a/doc/classes/RayShape2D.xml b/doc/classes/RayShape2D.xml
index 37cfe4f2d3..2fdc1930fb 100644
--- a/doc/classes/RayShape2D.xml
+++ b/doc/classes/RayShape2D.xml
@@ -17,7 +17,7 @@
The ray's length.
</member>
<member name="slips_on_slope" type="bool" setter="set_slips_on_slope" getter="get_slips_on_slope">
- If [code]true[/code] allow the shape to return the correct normal. Default value: [code]false[/code].
+ If [code]true[/code], allow the shape to return the correct normal. Default value: [code]false[/code].
</member>
</members>
<constants>
diff --git a/doc/classes/Rect2.xml b/doc/classes/Rect2.xml
index 1392e53f8d..45bfd16cb8 100644
--- a/doc/classes/Rect2.xml
+++ b/doc/classes/Rect2.xml
@@ -111,7 +111,7 @@
<argument index="1" name="by" type="float">
</argument>
<description>
- Returns a copy of the [code]Rect2[/code] grown a given amount of units towards the [Margin] direction.
+ Returns a copy of the [code]Rect2[/code] grown a given amount of units towards the [enum Margin] direction.
</description>
</method>
<method name="has_no_area">
diff --git a/doc/classes/RemoteTransform.xml b/doc/classes/RemoteTransform.xml
index 1a5d1eb907..3df94bdfca 100644
--- a/doc/classes/RemoteTransform.xml
+++ b/doc/classes/RemoteTransform.xml
@@ -18,16 +18,16 @@
The [NodePath] to the remote node, relative to the RemoteTransform's position in the scene.
</member>
<member name="update_position" type="bool" setter="set_update_position" getter="get_update_position">
- If [code]true[/code] the remote node's position is updated. Default value: [code]true[/code].
+ If [code]true[/code], the remote node's position is updated. Default value: [code]true[/code].
</member>
<member name="update_rotation" type="bool" setter="set_update_rotation" getter="get_update_rotation">
- If [code]true[/code] the remote node's rotation is updated. Default value: [code]true[/code].
+ If [code]true[/code], the remote node's rotation is updated. Default value: [code]true[/code].
</member>
<member name="update_scale" type="bool" setter="set_update_scale" getter="get_update_scale">
- If [code]true[/code] the remote node's scale is updated. Default value: [code]true[/code].
+ If [code]true[/code], the remote node's scale is updated. Default value: [code]true[/code].
</member>
<member name="use_global_coordinates" type="bool" setter="set_use_global_coordinates" getter="get_use_global_coordinates">
- If [code]true[/code] global coordinates are used. If [code]false[/code] local coordinates are used. Default value: [code]true[/code].
+ If [code]true[/code], global coordinates are used. If [code]false[/code], local coordinates are used. Default value: [code]true[/code].
</member>
</members>
<constants>
diff --git a/doc/classes/RemoteTransform2D.xml b/doc/classes/RemoteTransform2D.xml
index d83ec9f6b1..cf0e6c6199 100644
--- a/doc/classes/RemoteTransform2D.xml
+++ b/doc/classes/RemoteTransform2D.xml
@@ -18,16 +18,16 @@
The [NodePath] to the remote node, relative to the RemoteTransform2D's position in the scene.
</member>
<member name="update_position" type="bool" setter="set_update_position" getter="get_update_position">
- If [code]true[/code] the remote node's position is updated. Default value: [code]true[/code].
+ If [code]true[/code], the remote node's position is updated. Default value: [code]true[/code].
</member>
<member name="update_rotation" type="bool" setter="set_update_rotation" getter="get_update_rotation">
- If [code]true[/code] the remote node's rotation is updated. Default value: [code]true[/code].
+ If [code]true[/code], the remote node's rotation is updated. Default value: [code]true[/code].
</member>
<member name="update_scale" type="bool" setter="set_update_scale" getter="get_update_scale">
- If [code]true[/code] the remote node's scale is updated. Default value: [code]true[/code].
+ If [code]true[/code], the remote node's scale is updated. Default value: [code]true[/code].
</member>
<member name="use_global_coordinates" type="bool" setter="set_use_global_coordinates" getter="get_use_global_coordinates">
- If [code]true[/code] global coordinates are used. If [code]false[/code] local coordinates are used. Default value: [code]true[/code].
+ If [code]true[/code], global coordinates are used. If [code]false[/code], local coordinates are used. Default value: [code]true[/code].
</member>
</members>
<constants>
diff --git a/doc/classes/ResourceFormatDDS.xml b/doc/classes/ResourceFormatDDS.xml
new file mode 100644
index 0000000000..e237dfc6a5
--- /dev/null
+++ b/doc/classes/ResourceFormatDDS.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatDDS" inherits="ResourceFormatLoader" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/ResourceFormatImporter.xml b/doc/classes/ResourceFormatImporter.xml
new file mode 100644
index 0000000000..fa5b44fa18
--- /dev/null
+++ b/doc/classes/ResourceFormatImporter.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatImporter" inherits="ResourceFormatLoader" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/ResourceFormatLoader.xml b/doc/classes/ResourceFormatLoader.xml
new file mode 100644
index 0000000000..97547a607a
--- /dev/null
+++ b/doc/classes/ResourceFormatLoader.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatLoader" inherits="Reference" category="Core" version="3.1">
+ <brief_description>
+ Loads a specific resource type from a file.
+ </brief_description>
+ <description>
+ Godot loads resources in the editor or in exported games using ResourceFormatLoaders. They get queried when you call [code]load[/code], or when a resource with internal dependencies is loaded. Each file type may load as a different resource type, so multiple ResourceFormatLoader are registered in the engine.
+ Extending this class allows you to define your own. You should give it a global class name with [code]class_name[/code] for it to be registered. You may as well implement a [ResourceFormatSaver].
+ Note: You can also extend [EditorImportPlugin] if the resource type you need exists but Godot is unable to load its format. Choosing one way over another depends if the format is suitable or not for the final exported game. Example: it's better to import .PNG textures as .STEX first, so they can be loaded with better efficiency on the graphics card.
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ <method name="get_dependencies" qualifiers="virtual">
+ <return type="void">
+ </return>
+ <argument index="0" name="path" type="String">
+ </argument>
+ <argument index="1" name="add_types" type="String">
+ </argument>
+ <description>
+ If implemented, gets the dependencies of a given resource. If [code]add_types[/code] is [code]true[/code], paths should be appended [code]::TypeName[/code], where [code]TypeName[/code] is the class name of the dependency. Note that custom resource types defined by scripts aren't known by the [ClassDB], so you might just return [code]Resource[/code] for them.
+ </description>
+ </method>
+ <method name="get_recognized_extensions" qualifiers="virtual">
+ <return type="PoolStringArray">
+ </return>
+ <description>
+ Gets the list of extensions for files this loader is able to read.
+ </description>
+ </method>
+ <method name="get_resource_type" qualifiers="virtual">
+ <return type="String">
+ </return>
+ <argument index="0" name="path" type="String">
+ </argument>
+ <description>
+ Gets the class name of the resource associated with the given path. If the loader cannot handle it, it should return [code]""[/code]. Note that custom resource types defined by scripts aren't known by the [ClassDB], so you might just return [code]"Resource"[/code] for them.
+ </description>
+ </method>
+ <method name="handles_type" qualifiers="virtual">
+ <return type="bool">
+ </return>
+ <argument index="0" name="typename" type="String">
+ </argument>
+ <description>
+ Tells which resource class this loader can load. Note that custom resource types defined by scripts aren't known by the [ClassDB], so you might just handle [code]"Resource"[/code] for them.
+ </description>
+ </method>
+ <method name="load" qualifiers="virtual">
+ <return type="Variant">
+ </return>
+ <argument index="0" name="path" type="String">
+ </argument>
+ <argument index="1" name="original_path" type="String">
+ </argument>
+ <description>
+ Loads a resource when the engine finds this loader to be compatible. If the loaded resource is the result of an import, [code]original_path[/code] will target the source file. Returns a resource object if succeeded, or an [code]ERR_*[/code] constant listed in [@GlobalScope] if it failed.
+ </description>
+ </method>
+ <method name="rename_dependencies" qualifiers="virtual">
+ <return type="int">
+ </return>
+ <argument index="0" name="path" type="String">
+ </argument>
+ <argument index="1" name="renames" type="String">
+ </argument>
+ <description>
+ If implemented, renames dependencies within the given resource and saves it. [code]renames[/code] is a dictionary [code]{ String =&gt; String }[/code] mapping old dependency paths to new paths. Returns [code]OK[/code] on success, or an [code]ERR_*[/code] constant listed in [@GlobalScope] in case of failure.
+ </description>
+ </method>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/ResourceFormatLoaderBMFont.xml b/doc/classes/ResourceFormatLoaderBMFont.xml
new file mode 100644
index 0000000000..1e999353f8
--- /dev/null
+++ b/doc/classes/ResourceFormatLoaderBMFont.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatLoaderBMFont" inherits="ResourceFormatLoader" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/ResourceFormatLoaderBinary.xml b/doc/classes/ResourceFormatLoaderBinary.xml
new file mode 100644
index 0000000000..3c768851e2
--- /dev/null
+++ b/doc/classes/ResourceFormatLoaderBinary.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatLoaderBinary" inherits="ResourceFormatLoader" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/ResourceFormatLoaderDynamicFont.xml b/doc/classes/ResourceFormatLoaderDynamicFont.xml
new file mode 100644
index 0000000000..4cd5c9b2a6
--- /dev/null
+++ b/doc/classes/ResourceFormatLoaderDynamicFont.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatLoaderDynamicFont" inherits="ResourceFormatLoader" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/ResourceFormatLoaderGDScript.xml b/doc/classes/ResourceFormatLoaderGDScript.xml
new file mode 100644
index 0000000000..b661e4746a
--- /dev/null
+++ b/doc/classes/ResourceFormatLoaderGDScript.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatLoaderGDScript" inherits="ResourceFormatLoader" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/ResourceFormatLoaderImage.xml b/doc/classes/ResourceFormatLoaderImage.xml
new file mode 100644
index 0000000000..5f7e55af28
--- /dev/null
+++ b/doc/classes/ResourceFormatLoaderImage.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatLoaderImage" inherits="ResourceFormatLoader" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/ResourceFormatLoaderNativeScript.xml b/doc/classes/ResourceFormatLoaderNativeScript.xml
new file mode 100644
index 0000000000..496602e7dd
--- /dev/null
+++ b/doc/classes/ResourceFormatLoaderNativeScript.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatLoaderNativeScript" inherits="ResourceFormatLoader" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/ResourceFormatLoaderShader.xml b/doc/classes/ResourceFormatLoaderShader.xml
new file mode 100644
index 0000000000..0948810532
--- /dev/null
+++ b/doc/classes/ResourceFormatLoaderShader.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatLoaderShader" inherits="ResourceFormatLoader" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/ResourceFormatLoaderStreamTexture.xml b/doc/classes/ResourceFormatLoaderStreamTexture.xml
new file mode 100644
index 0000000000..34843f9e1a
--- /dev/null
+++ b/doc/classes/ResourceFormatLoaderStreamTexture.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatLoaderStreamTexture" inherits="ResourceFormatLoader" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/ResourceFormatLoaderText.xml b/doc/classes/ResourceFormatLoaderText.xml
new file mode 100644
index 0000000000..db3b28f233
--- /dev/null
+++ b/doc/classes/ResourceFormatLoaderText.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatLoaderText" inherits="ResourceFormatLoader" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/ResourceFormatLoaderTextureLayered.xml b/doc/classes/ResourceFormatLoaderTextureLayered.xml
new file mode 100644
index 0000000000..cd31f35e49
--- /dev/null
+++ b/doc/classes/ResourceFormatLoaderTextureLayered.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatLoaderTextureLayered" inherits="ResourceFormatLoader" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/ResourceFormatLoaderTheora.xml b/doc/classes/ResourceFormatLoaderTheora.xml
new file mode 100644
index 0000000000..dff7e2f3dc
--- /dev/null
+++ b/doc/classes/ResourceFormatLoaderTheora.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatLoaderTheora" inherits="ResourceFormatLoader" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/ResourceFormatLoaderWebm.xml b/doc/classes/ResourceFormatLoaderWebm.xml
new file mode 100644
index 0000000000..f2b403161e
--- /dev/null
+++ b/doc/classes/ResourceFormatLoaderWebm.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatLoaderWebm" inherits="ResourceFormatLoader" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/ResourceFormatPKM.xml b/doc/classes/ResourceFormatPKM.xml
new file mode 100644
index 0000000000..aa511823d3
--- /dev/null
+++ b/doc/classes/ResourceFormatPKM.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatPKM" inherits="ResourceFormatLoader" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/ResourceFormatPVR.xml b/doc/classes/ResourceFormatPVR.xml
new file mode 100644
index 0000000000..4f3b4f670f
--- /dev/null
+++ b/doc/classes/ResourceFormatPVR.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatPVR" inherits="ResourceFormatLoader" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/ResourceFormatSaver.xml b/doc/classes/ResourceFormatSaver.xml
new file mode 100644
index 0000000000..d50027ef8e
--- /dev/null
+++ b/doc/classes/ResourceFormatSaver.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatSaver" inherits="Reference" category="Core" version="3.1">
+ <brief_description>
+ Saves a specific resource type to a file.
+ </brief_description>
+ <description>
+ The engine can save resources when you do it from the editor, or when you call [method ResourceSaver.save]. This is accomplished with multiple [code]ResourceFormatSaver[/code]s, each handling its own format.
+ By default, Godot saves resources as [code].tres[/code], [code].res[/code] or another built-in format, but you can choose to create your own format by extending this class. You should give it a global class name with [code]class_name[/code] for it to be registered. You may as well implement a [ResourceFormatLoader].
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ <method name="get_recognized_extensions" qualifiers="virtual">
+ <return type="PoolStringArray">
+ </return>
+ <argument index="0" name="resource" type="Resource">
+ </argument>
+ <description>
+ Gets the list of extensions for files this saver is able to write.
+ </description>
+ </method>
+ <method name="recognize" qualifiers="virtual">
+ <return type="bool">
+ </return>
+ <argument index="0" name="resource" type="Resource">
+ </argument>
+ <description>
+ Returns true if the given resource object can be saved by this saver.
+ </description>
+ </method>
+ <method name="save" qualifiers="virtual">
+ <return type="int">
+ </return>
+ <argument index="0" name="path" type="String">
+ </argument>
+ <argument index="1" name="resource" type="Resource">
+ </argument>
+ <argument index="2" name="flags" type="int">
+ </argument>
+ <description>
+ Saves the given resource object to a file. [code]flags[/code] is a bitmask composed with [code]FLAG_*[/code] constants defined in [ResourceSaver]. Returns [code]OK[/code] on success, or an [code]ERR_*[/code] constant listed in [@GlobalScope] if it failed.
+ </description>
+ </method>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/ResourceFormatSaverBinary.xml b/doc/classes/ResourceFormatSaverBinary.xml
new file mode 100644
index 0000000000..7afec9ba23
--- /dev/null
+++ b/doc/classes/ResourceFormatSaverBinary.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatSaverBinary" inherits="ResourceFormatSaver" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/ResourceFormatSaverGDScript.xml b/doc/classes/ResourceFormatSaverGDScript.xml
new file mode 100644
index 0000000000..27964c7c9b
--- /dev/null
+++ b/doc/classes/ResourceFormatSaverGDScript.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatSaverGDScript" inherits="ResourceFormatSaver" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/ResourceFormatSaverNativeScript.xml b/doc/classes/ResourceFormatSaverNativeScript.xml
new file mode 100644
index 0000000000..9f8c0ccc78
--- /dev/null
+++ b/doc/classes/ResourceFormatSaverNativeScript.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatSaverNativeScript" inherits="ResourceFormatSaver" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/ResourceFormatSaverShader.xml b/doc/classes/ResourceFormatSaverShader.xml
new file mode 100644
index 0000000000..cdc512dfea
--- /dev/null
+++ b/doc/classes/ResourceFormatSaverShader.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatSaverShader" inherits="ResourceFormatSaver" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/ResourceFormatSaverText.xml b/doc/classes/ResourceFormatSaverText.xml
new file mode 100644
index 0000000000..6ae4ff4a2c
--- /dev/null
+++ b/doc/classes/ResourceFormatSaverText.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatSaverText" inherits="ResourceFormatSaver" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/ResourceLoader.xml b/doc/classes/ResourceLoader.xml
index ae900e34ef..926bd63de2 100644
--- a/doc/classes/ResourceLoader.xml
+++ b/doc/classes/ResourceLoader.xml
@@ -61,7 +61,7 @@
</argument>
<argument index="1" name="type_hint" type="String" default="&quot;&quot;">
</argument>
- <argument index="2" name="p_no_cache" type="bool" default="false">
+ <argument index="2" name="no_cache" type="bool" default="false">
</argument>
<description>
</description>
diff --git a/doc/classes/ResourceSaverPNG.xml b/doc/classes/ResourceSaverPNG.xml
new file mode 100644
index 0000000000..a161a4de5f
--- /dev/null
+++ b/doc/classes/ResourceSaverPNG.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceSaverPNG" inherits="ResourceFormatSaver" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/RichTextLabel.xml b/doc/classes/RichTextLabel.xml
index 145ce7537b..dcfb980e21 100644
--- a/doc/classes/RichTextLabel.xml
+++ b/doc/classes/RichTextLabel.xml
@@ -118,7 +118,7 @@
<return type="void">
</return>
<description>
- Adds a [code][cell][/code] tag to the tag stack. Must be inside a [table] tag. See [method push_table] for details.
+ Adds a [code][cell][/code] tag to the tag stack. Must be inside a [code][table][/code] tag. See [method push_table] for details.
</description>
</method>
<method name="push_color">
@@ -225,16 +225,16 @@
</methods>
<members>
<member name="bbcode_enabled" type="bool" setter="set_use_bbcode" getter="is_using_bbcode">
- If [code]true[/code] the label uses BBCode formatting. Default value: [code]false[/code].
+ If [code]true[/code], the label uses BBCode formatting. Default value: [code]false[/code].
</member>
<member name="bbcode_text" type="String" setter="set_bbcode" getter="get_bbcode">
The label's text in BBCode format. Is not representative of manual modifications to the internal tag stack. Erases changes made by other methods when edited.
</member>
<member name="meta_underlined" type="bool" setter="set_meta_underline" getter="is_meta_underlined">
- If [code]true[/code], the label underlines meta tags such as [url]{text}[/url]. Default value: [code]true[/code].
+ If [code]true[/code], the label underlines meta tags such as [code][url]{text}[/url][/code]. Default value: [code]true[/code].
</member>
<member name="override_selected_font_color" type="bool" setter="set_override_selected_font_color" getter="is_overriding_selected_font_color">
- If [code]true[/code] the label uses the custom font color. Default value: [code]false[/code].
+ If [code]true[/code], the label uses the custom font color. Default value: [code]false[/code].
</member>
<member name="percent_visible" type="float" setter="set_percent_visible" getter="get_percent_visible">
The text's visibility, as a [float] between 0.0 and 1.0.
@@ -264,7 +264,7 @@
<argument index="0" name="meta" type="Nil">
</argument>
<description>
- Triggered when the user clicks on content between [url] tags. If the meta is defined in text, e.g. [code][url={"data"="hi"}]hi[/url][/code], then the parameter for this signal will be a [String] type. If a particular type or an object is desired, the [method push_meta] method must be used to manually insert the data into the tag stack.
+ Triggered when the user clicks on content between [code][url][/code] tags. If the meta is defined in text, e.g. [code][url={"data"="hi"}]hi[/url][/code], then the parameter for this signal will be a [String] type. If a particular type or an object is desired, the [method push_meta] method must be used to manually insert the data into the tag stack.
</description>
</signal>
<signal name="meta_hover_ended">
diff --git a/doc/classes/RigidBody.xml b/doc/classes/RigidBody.xml
index 4ff332402b..3f28156915 100644
--- a/doc/classes/RigidBody.xml
+++ b/doc/classes/RigidBody.xml
@@ -21,7 +21,7 @@
<argument index="0" name="state" type="PhysicsDirectBodyState">
</argument>
<description>
- Called during physics processing, allowing you to read and safely modify the simulation state for the object. By default it works in addition to the usual physics behavior, but [method set_use_custom_integrator] allows you to disable the default behavior and do fully custom force integration for a body.
+ Called during physics processing, allowing you to read and safely modify the simulation state for the object. By default, it works in addition to the usual physics behavior, but the [member custom_integrator] property allows you to disable the default behavior and do fully custom force integration for a body.
</description>
</method>
<method name="add_central_force">
@@ -88,7 +88,7 @@
<return type="Array">
</return>
<description>
- Return a list of the bodies colliding with this one. By default, number of max contacts reported is at 0 , see [method set_max_contacts_reported] to increase it. Note that the result of this test is not immediate after moving objects. For performance, list of collisions is updated once per frame and before the physics step. Consider using signals instead.
+ Return a list of the bodies colliding with this one. By default, number of max contacts reported is at 0, see the [member contacts_reported] property to increase it. Note that the result of this test is not immediate after moving objects. For performance, list of collisions is updated once per frame and before the physics step. Consider using signals instead.
</description>
</method>
<method name="set_axis_velocity">
@@ -130,20 +130,20 @@
RigidBody's bounciness.
</member>
<member name="can_sleep" type="bool" setter="set_can_sleep" getter="is_able_to_sleep">
- If [code]true[/code] the RigidBody will not calculate forces and will act as a static body while there is no movement. It will wake up when forces are applied through other collisions or when the [code]apply_impulse[/code] method is used.
+ If [code]true[/code], the RigidBody will not calculate forces and will act as a static body while there is no movement. It will wake up when forces are applied through other collisions or when the [code]apply_impulse[/code] method is used.
</member>
<member name="contact_monitor" type="bool" setter="set_contact_monitor" getter="is_contact_monitor_enabled">
- If [code]true[/code] the RigidBody will emit signals when it collides with another RigidBody.
+ If [code]true[/code], the RigidBody will emit signals when it collides with another RigidBody.
</member>
<member name="contacts_reported" type="int" setter="set_max_contacts_reported" getter="get_max_contacts_reported">
The maximum contacts to report. Bodies can keep a log of the contacts with other bodies, this is enabled by setting the maximum amount of contacts reported to a number greater than 0.
</member>
<member name="continuous_cd" type="bool" setter="set_use_continuous_collision_detection" getter="is_using_continuous_collision_detection">
- If [code]true[/code] continuous collision detection is used.
+ If [code]true[/code], continuous collision detection is used.
Continuous collision detection tries to predict where a moving body will collide, instead of moving it and correcting its movement if it collided. Continuous collision detection is more precise, and misses less impacts by small, fast-moving objects. Not using continuous collision detection is faster to compute, but can miss small, fast-moving objects.
</member>
<member name="custom_integrator" type="bool" setter="set_use_custom_integrator" getter="is_using_custom_integrator">
- If [code]true[/code] internal force integration will be disabled (like gravity or air friction) for this body. Other than collision response, the body will only move as determined by the [method _integrate_forces] function, if defined.
+ If [code]true[/code], internal force integration will be disabled (like gravity or air friction) for this body. Other than collision response, the body will only move as determined by the [method _integrate_forces] function, if defined.
</member>
<member name="friction" type="float" setter="set_friction" getter="get_friction">
The body's friction, from 0 (frictionless) to 1 (max friction).
@@ -166,7 +166,7 @@
<member name="physics_material_override" type="PhysicsMaterial" setter="set_physics_material_override" getter="get_physics_material_override">
</member>
<member name="sleeping" type="bool" setter="set_sleeping" getter="is_sleeping">
- If [code]true[/code] the body is sleeping and will not calculate forces until woken up by a collision or the [code]apply_impulse[/code] method.
+ If [code]true[/code], the body is sleeping and will not calculate forces until woken up by a collision or the [code]apply_impulse[/code] method.
</member>
<member name="weight" type="float" setter="set_weight" getter="get_weight">
The body's weight based on its mass and the global 3D gravity. Global values are set in "Project &gt; Project Settings &gt; Physics &gt; 3d".
diff --git a/doc/classes/RigidBody2D.xml b/doc/classes/RigidBody2D.xml
index 079440ab8b..68e78ba5d4 100644
--- a/doc/classes/RigidBody2D.xml
+++ b/doc/classes/RigidBody2D.xml
@@ -20,7 +20,7 @@
<argument index="0" name="state" type="Physics2DDirectBodyState">
</argument>
<description>
- Allows you to read and safely modify the simulation state for the object. Use this instead of [Node._physics_process] if you need to directly change the body's [code]position[/code] or other physics properties. By default it works in addition to the usual physics behavior, but [member custom_integrator] allows you to disable the default behavior and write custom force integration for a body.
+ Allows you to read and safely modify the simulation state for the object. Use this instead of [method Node._physics_process] if you need to directly change the body's [code]position[/code] or other physics properties. By default, it works in addition to the usual physics behavior, but [member custom_integrator] allows you to disable the default behavior and write custom force integration for a body.
</description>
</method>
<method name="add_central_force">
@@ -130,10 +130,10 @@
The body's bounciness. Default value: [code]0[/code].
</member>
<member name="can_sleep" type="bool" setter="set_can_sleep" getter="is_able_to_sleep">
- If [code]true[/code] the body will not calculate forces and will act as a static body if there is no movement. The body will wake up when other forces are applied via collisions or by using [method apply_impulse] or [method add_force]. Default value: [code]true[/code].
+ If [code]true[/code], the body will not calculate forces and will act as a static body if there is no movement. The body will wake up when other forces are applied via collisions or by using [method apply_impulse] or [method add_force]. Default value: [code]true[/code].
</member>
<member name="contact_monitor" type="bool" setter="set_contact_monitor" getter="is_contact_monitor_enabled">
- If [code]true[/code] the body will emit signals when it collides with another RigidBody2D. See also [member contacts_reported]. Default value: [code]false[/code].
+ If [code]true[/code], the body will emit signals when it collides with another RigidBody2D. See also [member contacts_reported]. Default value: [code]false[/code].
</member>
<member name="contacts_reported" type="int" setter="set_max_contacts_reported" getter="get_max_contacts_reported">
The maximum number of contacts to report. Default value: [code]0[/code].
@@ -143,7 +143,7 @@
Continuous collision detection tries to predict where a moving body will collide instead of moving it and correcting its movement after collision. Continuous collision detection is slower, but more precise and misses fewer collisions with small, fast-moving objects. Raycasting and shapecasting methods are available. See [code]CCD_MODE_[/code] constants for details.
</member>
<member name="custom_integrator" type="bool" setter="set_use_custom_integrator" getter="is_using_custom_integrator">
- If [code]true[/code] internal force integration is disabled for this body. Aside from collision response, the body will only move as determined by the [method _integrate_forces] function.
+ If [code]true[/code], internal force integration is disabled for this body. Aside from collision response, the body will only move as determined by the [method _integrate_forces] function.
</member>
<member name="friction" type="float" setter="set_friction" getter="get_friction">
The body's friction. Values range from [code]0[/code] (frictionless) to [code]1[/code] (maximum friction). Default value: [code]1[/code].
@@ -169,7 +169,7 @@
<member name="physics_material_override" type="PhysicsMaterial" setter="set_physics_material_override" getter="get_physics_material_override">
</member>
<member name="sleeping" type="bool" setter="set_sleeping" getter="is_sleeping">
- If [code]true[/code] the body is sleeping and will not calculate forces until woken up by a collision or by using [method apply_impulse] or [method add_force].
+ If [code]true[/code], the body is sleeping and will not calculate forces until woken up by a collision or by using [method apply_impulse] or [method add_force].
</member>
<member name="weight" type="float" setter="set_weight" getter="get_weight">
The body's weight based on its mass and the "Default Gravity" value in "Project &gt; Project Settings &gt; Physics &gt; 2d".
diff --git a/doc/classes/SceneTree.xml b/doc/classes/SceneTree.xml
index dd94ee66d2..f39d221d89 100644
--- a/doc/classes/SceneTree.xml
+++ b/doc/classes/SceneTree.xml
@@ -192,7 +192,7 @@
<argument index="0" name="enabled" type="bool">
</argument>
<description>
- If [code]true[/code] the application automatically accepts quitting.
+ If [code]true[/code], the application automatically accepts quitting.
</description>
</method>
<method name="set_group">
@@ -236,7 +236,7 @@
<argument index="0" name="enabled" type="bool">
</argument>
<description>
- If [code]true[/code] the application quits automatically on going back (e.g. on Android).
+ If [code]true[/code], the application quits automatically on going back (e.g. on Android).
</description>
</method>
<method name="set_screen_stretch">
@@ -270,27 +270,27 @@
The default [MultiplayerAPI] instance for this SceneTree.
</member>
<member name="multiplayer_poll" type="bool" setter="set_multiplayer_poll_enabled" getter="is_multiplayer_poll_enabled">
- If [code]true[/code] (default) enable the automatic polling of the [MultiplayerAPI] for this SceneTree during [signal idle_frame].
+ If [code]true[/code], (default) enable the automatic polling of the [MultiplayerAPI] for this SceneTree during [signal idle_frame].
When [code]false[/code] you need to manually call [method MultiplayerAPI.poll] for processing network packets and delivering RPCs/RSETs. This allows to run RPCs/RSETs in a different loop (e.g. physics, thread, specific time step) and for manual [Mutex] protection when accessing the [MultiplayerAPI] from threads.
</member>
<member name="network_peer" type="NetworkedMultiplayerPeer" setter="set_network_peer" getter="get_network_peer">
- The peer object to handle the RPC system (effectively enabling networking when set). Depending on the peer itself, the SceneTree will become a network server (check with [method is_network_server()]) and will set root node's network mode to master (see NETWORK_MODE_* constants in [Node]), or it will become a regular peer with root node set to puppet. All child nodes are set to inherit the network mode by default. Handling of networking-related events (connection, disconnection, new clients) is done by connecting to SceneTree's signals.
+ The peer object to handle the RPC system (effectively enabling networking when set). Depending on the peer itself, the SceneTree will become a network server (check with [method is_network_server]) and will set root node's network mode to master (see NETWORK_MODE_* constants in [Node]), or it will become a regular peer with root node set to puppet. All child nodes are set to inherit the network mode by default. Handling of networking-related events (connection, disconnection, new clients) is done by connecting to SceneTree's signals.
</member>
<member name="paused" type="bool" setter="set_pause" getter="is_paused">
- If [code]true[/code] the SceneTree is paused.
+ If [code]true[/code], the SceneTree is paused.
Doing so will have the following behavior:
* 2D and 3D physics will be stopped.
* _process and _physics_process will not be called anymore in nodes.
* _input and _input_event will not be called anymore either.
</member>
<member name="refuse_new_network_connections" type="bool" setter="set_refuse_new_network_connections" getter="is_refusing_new_network_connections">
- If [code]true[/code] the SceneTree's [member network_peer] refuses new incoming connections.
+ If [code]true[/code], the SceneTree's [member network_peer] refuses new incoming connections.
</member>
<member name="root" type="Viewport" setter="" getter="get_root">
The SceneTree's [Viewport].
</member>
<member name="use_font_oversampling" type="bool" setter="set_use_font_oversampling" getter="is_using_font_oversampling">
- If [code]true[/code] font oversampling is used.
+ If [code]true[/code], font oversampling is used.
</member>
</members>
<signals>
diff --git a/doc/classes/ScriptCreateDialog.xml b/doc/classes/ScriptCreateDialog.xml
index 67ce9a8e87..2e24a2626b 100644
--- a/doc/classes/ScriptCreateDialog.xml
+++ b/doc/classes/ScriptCreateDialog.xml
@@ -4,12 +4,12 @@
The Editor's popup dialog for creating new [Script] files.
</brief_description>
<description>
- The ScriptCreateDialog creates script files according to a given template for a given scripting language. The standard use is to configure its fields prior to calling a [method popup]() method.
+ The [code]ScriptCreateDialog[/code] creates script files according to a given template for a given scripting language. The standard use is to configure its fields prior to calling one of the [method Popup.popup] methods.
[codeblock]
func _ready():
- dialog.config("Node", "res://new_node.gd") # for in-engine types
- dialog.config("\"res://base_node.gd\"", "res://derived_node.gd") # for script types
- dialog.popup_centered()
+ dialog.config("Node", "res://new_node.gd") # for in-engine types
+ dialog.config("\"res://base_node.gd\"", "res://derived_node.gd") # for script types
+ dialog.popup_centered()
[/codeblock]
</description>
<tutorials>
diff --git a/doc/classes/ScrollContainer.xml b/doc/classes/ScrollContainer.xml
index d310561233..0b427fc089 100644
--- a/doc/classes/ScrollContainer.xml
+++ b/doc/classes/ScrollContainer.xml
@@ -4,7 +4,7 @@
A helper node for displaying scrollable elements (e.g. lists).
</brief_description>
<description>
- A ScrollContainer node with a [Control] child and scrollbar child ([HScrollbar], [VScrollBar], or both) will only draw the Control within the ScrollContainer area. Scrollbars will automatically be drawn at the right (for vertical) or bottom (for horizontal) and will enable dragging to move the viewable Control (and its children) within the ScrollContainer. Scrollbars will also automatically resize the grabber based on the minimum_size of the Control relative to the ScrollContainer. Works great with a [Panel] control. You can set EXPAND on children size flags, so they will upscale to ScrollContainer size if ScrollContainer size is bigger (scroll is invisible for chosen dimension).
+ A ScrollContainer node with a [Control] child and scrollbar child ([HScrollBar], [VScrollBar], or both) will only draw the Control within the ScrollContainer area. Scrollbars will automatically be drawn at the right (for vertical) or bottom (for horizontal) and will enable dragging to move the viewable Control (and its children) within the ScrollContainer. Scrollbars will also automatically resize the grabber based on the minimum_size of the Control relative to the ScrollContainer. Works great with a [Panel] control. You can set EXPAND on children size flags, so they will upscale to ScrollContainer size if ScrollContainer size is bigger (scroll is invisible for chosen dimension).
</description>
<tutorials>
</tutorials>
diff --git a/doc/classes/Semaphore.xml b/doc/classes/Semaphore.xml
index f3a37b78e1..5f46b949aa 100644
--- a/doc/classes/Semaphore.xml
+++ b/doc/classes/Semaphore.xml
@@ -15,14 +15,14 @@
<return type="int" enum="Error">
</return>
<description>
- Lowers the [code]Semaphore[/code], allowing one more thread in. Returns [OK] on success, [ERR_BUSY] otherwise.
+ Lowers the [code]Semaphore[/code], allowing one more thread in. Returns [code]OK[/code] on success, [code]ERR_BUSY[/code] otherwise.
</description>
</method>
<method name="wait">
<return type="int" enum="Error">
</return>
<description>
- Tries to wait for the [code]Semaphore[/code], if its value is zero, blocks until non-zero. Returns [OK] on success, [ERR_BUSY] otherwise.
+ Tries to wait for the [code]Semaphore[/code], if its value is zero, blocks until non-zero. Returns [code]OK[/code] on success, [code]ERR_BUSY[/code] otherwise.
</description>
</method>
</methods>
diff --git a/doc/classes/Shape2D.xml b/doc/classes/Shape2D.xml
index 96b8a77d9e..fc773faf5e 100644
--- a/doc/classes/Shape2D.xml
+++ b/doc/classes/Shape2D.xml
@@ -27,7 +27,7 @@
</description>
</method>
<method name="collide_and_get_contacts">
- <return type="Variant">
+ <return type="Array">
</return>
<argument index="0" name="local_xform" type="Transform2D">
</argument>
@@ -59,7 +59,7 @@
</description>
</method>
<method name="collide_with_motion_and_get_contacts">
- <return type="Variant">
+ <return type="Array">
</return>
<argument index="0" name="local_xform" type="Transform2D">
</argument>
diff --git a/doc/classes/ShortCut.xml b/doc/classes/ShortCut.xml
index 1b5fc035c2..b3bb364e54 100644
--- a/doc/classes/ShortCut.xml
+++ b/doc/classes/ShortCut.xml
@@ -32,7 +32,7 @@
<return type="bool">
</return>
<description>
- If [code]true[/code] this shortcut is valid.
+ If [code]true[/code], this shortcut is valid.
</description>
</method>
</methods>
diff --git a/doc/classes/SkeletonIK.xml b/doc/classes/SkeletonIK.xml
index 50246f1b18..e720ff8f52 100644
--- a/doc/classes/SkeletonIK.xml
+++ b/doc/classes/SkeletonIK.xml
@@ -45,6 +45,8 @@
</member>
<member name="min_distance" type="float" setter="set_min_distance" getter="get_min_distance">
</member>
+ <member name="override_tip_basis" type="bool" setter="set_override_tip_basis" getter="is_override_tip_basis">
+ </member>
<member name="root_bone" type="String" setter="set_root_bone" getter="get_root_bone">
</member>
<member name="target" type="Transform" setter="set_target_transform" getter="get_target_transform">
diff --git a/doc/classes/SliderJoint.xml b/doc/classes/SliderJoint.xml
index edb8e6d562..b3d59d6b75 100644
--- a/doc/classes/SliderJoint.xml
+++ b/doc/classes/SliderJoint.xml
@@ -4,7 +4,7 @@
Piston kind of slider between two bodies in 3D.
</brief_description>
<description>
- Slides across the x-axis of the [Pivot] object.
+ Slides across the x-axis of the pivot object.
</description>
<tutorials>
</tutorials>
diff --git a/doc/classes/Spatial.xml b/doc/classes/Spatial.xml
index 6f9d779737..518a942cc2 100644
--- a/doc/classes/Spatial.xml
+++ b/doc/classes/Spatial.xml
@@ -4,8 +4,8 @@
Most basic 3D game object, parent of all 3D related nodes.
</brief_description>
<description>
- Most basic 3D game object, with a 3D [Transform] and visibility settings. All other 3D game objects inherit from Spatial. Use Spatial as a parent node to move, scale, rotate and show/hide children in a 3D project.
- Affine operations (rotate, scale, translate) happen in parent's local coordinate system, unless the Spatial object is set as top level. Affine operations in this coordinate system correspond to direct affine operations on the Spatial's transform. The word local below refers to this coordinate system. The coordinate system that is attached to the Spatial object itself is referred to as object-local coordinate system.
+ Most basic 3D game object, with a 3D [Transform] and visibility settings. All other 3D game objects inherit from Spatial. Use [code]Spatial[/code] as a parent node to move, scale, rotate and show/hide children in a 3D project.
+ Affine operations (rotate, scale, translate) happen in parent's local coordinate system, unless the [code]Spatial[/code] object is set as top level. Affine operations in this coordinate system correspond to direct affine operations on the [code]Spatial[/code]'s transform. The word local below refers to this coordinate system. The coordinate system that is attached to the [code]Spatial[/code] object itself is referred to as object-local coordinate system.
</description>
<tutorials>
<link>https://docs.godotengine.org/en/latest/tutorials/3d/introduction_to_3d.html</link>
@@ -30,7 +30,7 @@
<return type="World">
</return>
<description>
- Returns the current [World] resource this Spatial node is registered to.
+ Returns the current [World] resource this [code]Spatial[/code] node is registered to.
</description>
</method>
<method name="global_rotate">
@@ -65,14 +65,14 @@
<return type="void">
</return>
<description>
- Disables rendering of this node. Change Spatial Visible property to false.
+ Disables rendering of this node. Changes [member visible] to [code]false[/code].
</description>
</method>
<method name="is_local_transform_notification_enabled" qualifiers="const">
<return type="bool">
</return>
<description>
- Returns whether node notifies about its local transformation changes. Spatial will not propagate this by default.
+ Returns whether node notifies about its local transformation changes. [code]Spatial[/code] will not propagate this by default.
</description>
</method>
<method name="is_scale_disabled" qualifiers="const">
@@ -92,7 +92,7 @@
<return type="bool">
</return>
<description>
- Returns whether the node notifies about its global and local transformation changes. Spatial will not propagate this by default.
+ Returns whether the node notifies about its global and local transformation changes. [code]Spatial[/code] will not propagate this by default.
</description>
</method>
<method name="is_visible_in_tree" qualifiers="const">
@@ -132,7 +132,7 @@
<return type="void">
</return>
<description>
- Resets this node's transformations (like scale, skew and taper) preserving its rotation and translation by performing Gram-Schmidt orthonormalization on this node's [Transform3D].
+ Resets this node's transformations (like scale, skew and taper) preserving its rotation and translation by performing Gram-Schmidt orthonormalization on this node's [Transform].
</description>
</method>
<method name="rotate">
@@ -214,7 +214,7 @@
<return type="void">
</return>
<description>
- Reset all transformations for this node. Set its [Transform3D] to identity matrix.
+ Reset all transformations for this node. Set its [Transform] to identity matrix.
</description>
</method>
<method name="set_ignore_transform_notification">
@@ -232,7 +232,7 @@
<argument index="0" name="enable" type="bool">
</argument>
<description>
- Set whether the node notifies about its local transformation changes. Spatial will not propagate this by default.
+ Set whether the node notifies about its local transformation changes. [code]Spatial[/code] will not propagate this by default.
</description>
</method>
<method name="set_notify_transform">
@@ -241,14 +241,14 @@
<argument index="0" name="enable" type="bool">
</argument>
<description>
- Set whether the node notifies about its global and local transformation changes. Spatial will not propagate this by default.
+ Set whether the node notifies about its global and local transformation changes. [code]Spatial[/code] will not propagate this by default.
</description>
</method>
<method name="show">
<return type="void">
</return>
<description>
- Enables rendering of this node. Change Spatial Visible property to "True".
+ Enables rendering of this node. Changes [member visible] to [code]true[/code].
</description>
</method>
<method name="to_global" qualifiers="const">
@@ -296,7 +296,7 @@
</methods>
<members>
<member name="gizmo" type="SpatialGizmo" setter="set_gizmo" getter="get_gizmo">
- The SpatialGizmo for this node. Used for example in [EditorSpatialGizmo] as custom visualization and editing handles in Editor.
+ The [SpatialGizmo] for this node. Used for example in [EditorSpatialGizmo] as custom visualization and editing handles in Editor.
</member>
<member name="global_transform" type="Transform" setter="set_global_transform" getter="get_global_transform">
World space (global) [Transform] of this node.
@@ -318,7 +318,7 @@
Local translation of this node.
</member>
<member name="visible" type="bool" setter="set_visible" getter="is_visible">
- If [code]true[/code] this node is drawn. Default value: [code]true[/code].
+ If [code]true[/code], this node is drawn. Default value: [code]true[/code].
</member>
</members>
<signals>
@@ -331,7 +331,7 @@
<constants>
<constant name="NOTIFICATION_TRANSFORM_CHANGED" value="29">
Spatial nodes receives this notification when their global transform changes. This means that either the current or a parent node changed its transform.
- In order for NOTIFICATION_TRANSFORM_CHANGED to work user first needs to ask for it, with set_notify_transform(true).
+ In order for [code]NOTIFICATION_TRANSFORM_CHANGED[/code] to work, users first need to ask for it, with [method set_notify_transform].
</constant>
<constant name="NOTIFICATION_ENTER_WORLD" value="41">
Spatial nodes receives this notification when they are registered to new [World] resource.
diff --git a/doc/classes/SpatialMaterial.xml b/doc/classes/SpatialMaterial.xml
index 392a550ee4..62a34821fe 100644
--- a/doc/classes/SpatialMaterial.xml
+++ b/doc/classes/SpatialMaterial.xml
@@ -23,12 +23,12 @@
The strength of the anisotropy effect.
</member>
<member name="anisotropy_enabled" type="bool" setter="set_feature" getter="get_feature">
- If [code]true[/code] anisotropy is enabled. Changes the shape of the specular blob and aligns it to tangent space. Default value: [code]false[/code].
+ If [code]true[/code], anisotropy is enabled. Changes the shape of the specular blob and aligns it to tangent space. Default value: [code]false[/code].
</member>
<member name="anisotropy_flowmap" type="Texture" setter="set_texture" getter="get_texture">
</member>
<member name="ao_enabled" type="bool" setter="set_feature" getter="get_feature">
- If [code]true[/code] ambient occlusion is enabled.
+ If [code]true[/code], ambient occlusion is enabled.
</member>
<member name="ao_light_affect" type="float" setter="set_ao_light_affect" getter="get_ao_light_affect">
</member>
@@ -41,7 +41,7 @@
<member name="clearcoat" type="float" setter="set_clearcoat" getter="get_clearcoat">
</member>
<member name="clearcoat_enabled" type="bool" setter="set_feature" getter="get_feature">
- If [code]true[/code] clearcoat rendering is enabled. Adds a secondary transparent pass to the material. Default value: [code]false[/code].
+ If [code]true[/code], clearcoat rendering is enabled. Adds a secondary transparent pass to the material. Default value: [code]false[/code].
</member>
<member name="clearcoat_gloss" type="float" setter="set_clearcoat_gloss" getter="get_clearcoat_gloss">
</member>
@@ -50,7 +50,11 @@
<member name="depth_deep_parallax" type="bool" setter="set_depth_deep_parallax" getter="is_depth_deep_parallax_enabled">
</member>
<member name="depth_enabled" type="bool" setter="set_feature" getter="get_feature">
- If [code]true[/code] Depth mapping is enabled. See also [member normal_enabled].
+ If [code]true[/code], Depth mapping is enabled. See also [member normal_enabled].
+ </member>
+ <member name="depth_flip_binormal" type="bool" setter="set_depth_deep_parallax_flip_binormal" getter="get_depth_deep_parallax_flip_binormal">
+ </member>
+ <member name="depth_flip_tangent" type="bool" setter="set_depth_deep_parallax_flip_tangent" getter="get_depth_deep_parallax_flip_tangent">
</member>
<member name="depth_max_layers" type="int" setter="set_depth_deep_parallax_max_layers" getter="get_depth_deep_parallax_max_layers">
</member>
@@ -82,7 +86,7 @@
The emitted light's color. See [member emission_enabled].
</member>
<member name="emission_enabled" type="bool" setter="set_feature" getter="get_feature">
- If [code]true[/code] the body emits light.
+ If [code]true[/code], the body emits light.
</member>
<member name="emission_energy" type="float" setter="set_emission_energy" getter="get_emission_energy">
The emitted light's strength. See [member emission_enabled].
@@ -96,33 +100,33 @@
<member name="flags_albedo_tex_force_srgb" type="bool" setter="set_flag" getter="get_flag">
</member>
<member name="flags_disable_ambient_light" type="bool" setter="set_flag" getter="get_flag">
- If [code]true[/code] the object receives no ambient light. Default value: [code]false[/code].
+ If [code]true[/code], the object receives no ambient light. Default value: [code]false[/code].
</member>
<member name="flags_do_not_receive_shadows" type="bool" setter="set_flag" getter="get_flag">
- If [code]true[/code] the object receives no shadow that would otherwise be cast onto it. Default value: [code]false[/code].
+ If [code]true[/code], the object receives no shadow that would otherwise be cast onto it. Default value: [code]false[/code].
</member>
<member name="flags_ensure_correct_normals" type="bool" setter="set_flag" getter="get_flag">
</member>
<member name="flags_fixed_size" type="bool" setter="set_flag" getter="get_flag">
- If [code]true[/code] the object is rendered at the same size regardless of distance. Default value: [code]false[/code].
+ If [code]true[/code], the object is rendered at the same size regardless of distance. Default value: [code]false[/code].
</member>
<member name="flags_no_depth_test" type="bool" setter="set_flag" getter="get_flag">
- If [code]true[/code] depth testing is disabled and the object will be drawn in render order.
+ If [code]true[/code], depth testing is disabled and the object will be drawn in render order.
</member>
<member name="flags_transparent" type="bool" setter="set_feature" getter="get_feature">
- If [code]true[/code] transparency is enabled on the body. Default value: [code]false[/code]. See also [member params_blend_mode].
+ If [code]true[/code], transparency is enabled on the body. Default value: [code]false[/code]. See also [member params_blend_mode].
</member>
<member name="flags_unshaded" type="bool" setter="set_flag" getter="get_flag">
- If [code]true[/code] the object is unaffected by lighting. Default value: [code]false[/code].
+ If [code]true[/code], the object is unaffected by lighting. Default value: [code]false[/code].
</member>
<member name="flags_use_point_size" type="bool" setter="set_flag" getter="get_flag">
- If [code]true[/code] render point size can be changed. Note: this is only effective for objects whose geometry is point-based rather than triangle-based. See also [member params_point_size].
+ If [code]true[/code], render point size can be changed. Note: this is only effective for objects whose geometry is point-based rather than triangle-based. See also [member params_point_size].
</member>
<member name="flags_vertex_lighting" type="bool" setter="set_flag" getter="get_flag">
- If [code]true[/code] lighting is calculated per vertex rather than per pixel. This may increase performance on low-end devices. Default value: [code]false[/code].
+ If [code]true[/code], lighting is calculated per vertex rather than per pixel. This may increase performance on low-end devices. Default value: [code]false[/code].
</member>
<member name="flags_world_triplanar" type="bool" setter="set_flag" getter="get_flag">
- If [code]true[/code] triplanar mapping is calculated in world space rather than object local space. See also [member uv1_triplanar]. Default value: [code]false[/code].
+ If [code]true[/code], triplanar mapping is calculated in world space rather than object local space. See also [member uv1_triplanar]. Default value: [code]false[/code].
</member>
<member name="metallic" type="float" setter="set_metallic" getter="get_metallic">
The reflectivity of the object's surface. The higher the value the more light is reflected.
@@ -135,7 +139,7 @@
<member name="metallic_texture_channel" type="int" setter="set_metallic_texture_channel" getter="get_metallic_texture_channel" enum="SpatialMaterial.TextureChannel">
</member>
<member name="normal_enabled" type="bool" setter="set_feature" getter="get_feature">
- If [code]true[/code] normal mapping is enabled.
+ If [code]true[/code], normal mapping is enabled.
</member>
<member name="normal_scale" type="float" setter="set_normal_scale" getter="get_normal_scale">
The strength of the normal map's effect.
@@ -162,7 +166,7 @@
The algorithm used for diffuse light scattering. See [enum DiffuseMode].
</member>
<member name="params_grow" type="bool" setter="set_grow_enabled" getter="is_grow_enabled">
- If [code]true[/code] enables the vertex grow setting. See [member params_grow_amount].
+ If [code]true[/code], enables the vertex grow setting. See [member params_grow_amount].
</member>
<member name="params_grow_amount" type="float" setter="set_grow" getter="get_grow">
Grows object vertices in the direction of their normals.
@@ -181,7 +185,7 @@
The number of horizontal frames in the particle spritesheet. Only enabled when using [code]BillboardMode.BILLBOARD_PARTICLES[/code]. See [member params_billboard_mode].
</member>
<member name="particles_anim_loop" type="bool" setter="set_particles_anim_loop" getter="get_particles_anim_loop">
- If [code]true[/code] particle animations are looped. Only enabled when using [code]BillboardMode.BILLBOARD_PARTICLES[/code]. See [member params_billboard_mode].
+ If [code]true[/code], particle animations are looped. Only enabled when using [code]BillboardMode.BILLBOARD_PARTICLES[/code]. See [member params_billboard_mode].
</member>
<member name="particles_anim_v_frames" type="int" setter="set_particles_anim_v_frames" getter="get_particles_anim_v_frames">
The number of vertical frames in the particle spritesheet. Only enabled when using [code]BillboardMode.BILLBOARD_PARTICLES[/code]. See [member params_billboard_mode].
@@ -189,10 +193,10 @@
<member name="proximity_fade_distance" type="float" setter="set_proximity_fade_distance" getter="get_proximity_fade_distance">
</member>
<member name="proximity_fade_enable" type="bool" setter="set_proximity_fade" getter="is_proximity_fade_enabled">
- If [code]true[/code] the proximity and distance fade effect is enabled. Default value: [code]false[/code].
+ If [code]true[/code], the proximity and distance fade effect is enabled. Default value: [code]false[/code].
</member>
<member name="refraction_enabled" type="bool" setter="set_feature" getter="get_feature">
- If [code]true[/code] the refraction effect is enabled. Distorts transparency based on light from behind the object. Default value: [code]false[/code].
+ If [code]true[/code], the refraction effect is enabled. Distorts transparency based on light from behind the object. Default value: [code]false[/code].
</member>
<member name="refraction_scale" type="float" setter="set_refraction" getter="get_refraction">
The strength of the refraction effect.
@@ -204,7 +208,7 @@
<member name="rim" type="float" setter="set_rim" getter="get_rim">
</member>
<member name="rim_enabled" type="bool" setter="set_feature" getter="get_feature">
- If [code]true[/code] rim effect is enabled. Default value: [code]false[/code].
+ If [code]true[/code], rim effect is enabled. Default value: [code]false[/code].
</member>
<member name="rim_texture" type="Texture" setter="set_texture" getter="get_texture">
</member>
@@ -219,7 +223,7 @@
<member name="roughness_texture_channel" type="int" setter="set_roughness_texture_channel" getter="get_roughness_texture_channel" enum="SpatialMaterial.TextureChannel">
</member>
<member name="subsurf_scatter_enabled" type="bool" setter="set_feature" getter="get_feature">
- If [code]true[/code] subsurface scattering is enabled. Emulates light that penetrates an object's surface, is scattered, and then emerges.
+ If [code]true[/code], subsurface scattering is enabled. Emulates light that penetrates an object's surface, is scattered, and then emerges.
</member>
<member name="subsurf_scatter_strength" type="float" setter="set_subsurface_scattering_strength" getter="get_subsurface_scattering_strength">
The strength of the subsurface scattering effect.
@@ -230,7 +234,7 @@
The color used by the transmission effect. Represents the light passing through an object.
</member>
<member name="transmission_enabled" type="bool" setter="set_feature" getter="get_feature">
- If [code]true[/code] the transmission effect is enabled. Default value: [code]false[/code].
+ If [code]true[/code], the transmission effect is enabled. Default value: [code]false[/code].
</member>
<member name="transmission_texture" type="Texture" setter="set_texture" getter="get_texture">
</member>
@@ -251,10 +255,10 @@
<member name="uv2_triplanar_sharpness" type="float" setter="set_uv2_triplanar_blend_sharpness" getter="get_uv2_triplanar_blend_sharpness">
</member>
<member name="vertex_color_is_srgb" type="bool" setter="set_flag" getter="get_flag">
- If [code]true[/code] the model's vertex colors are processed as sRGB mode. Default value: [code]false[/code].
+ If [code]true[/code], the model's vertex colors are processed as sRGB mode. Default value: [code]false[/code].
</member>
<member name="vertex_color_use_as_albedo" type="bool" setter="set_flag" getter="get_flag">
- If [code]true[/code] the vertex color is used as albedo color. Default value: [code]false[/code].
+ If [code]true[/code], the vertex color is used as albedo color. Default value: [code]false[/code].
</member>
</members>
<constants>
diff --git a/doc/classes/SplitContainer.xml b/doc/classes/SplitContainer.xml
index d56da68448..6370c40aba 100644
--- a/doc/classes/SplitContainer.xml
+++ b/doc/classes/SplitContainer.xml
@@ -11,6 +11,12 @@
<demos>
</demos>
<methods>
+ <method name="clamp_split_offset">
+ <return type="void">
+ </return>
+ <description>
+ </description>
+ </method>
</methods>
<members>
<member name="collapsed" type="bool" setter="set_collapsed" getter="is_collapsed">
diff --git a/doc/classes/Sprite.xml b/doc/classes/Sprite.xml
index 52650c7300..d1cdbffc6c 100644
--- a/doc/classes/Sprite.xml
+++ b/doc/classes/Sprite.xml
@@ -29,13 +29,13 @@
</methods>
<members>
<member name="centered" type="bool" setter="set_centered" getter="is_centered">
- If [code]true[/code] texture is centered. Default value: [code]true[/code].
+ If [code]true[/code], texture is centered. Default value: [code]true[/code].
</member>
<member name="flip_h" type="bool" setter="set_flip_h" getter="is_flipped_h">
- If [code]true[/code] texture is flipped horizontally. Default value: [code]false[/code].
+ If [code]true[/code], texture is flipped horizontally. Default value: [code]false[/code].
</member>
<member name="flip_v" type="bool" setter="set_flip_v" getter="is_flipped_v">
- If [code]true[/code] texture is flipped vertically. Default value: [code]false[/code].
+ If [code]true[/code], texture is flipped vertically. Default value: [code]false[/code].
</member>
<member name="frame" type="int" setter="set_frame" getter="get_frame">
Current frame to display from sprite sheet. [member vframes] or [member hframes] must be greater than 1.
@@ -50,10 +50,10 @@
The texture's drawing offset.
</member>
<member name="region_enabled" type="bool" setter="set_region" getter="is_region">
- If [code]true[/code] texture is cut from a larger atlas texture. See [code]region_rect[/code]. Default value: [code]false[/code].
+ If [code]true[/code], texture is cut from a larger atlas texture. See [code]region_rect[/code]. Default value: [code]false[/code].
</member>
<member name="region_filter_clip" type="bool" setter="set_region_filter_clip" getter="is_region_filter_clip_enabled">
- If [code]true[/code] the outermost pixels get blurred out.
+ If [code]true[/code], the outermost pixels get blurred out.
</member>
<member name="region_rect" type="Rect2" setter="set_region_rect" getter="get_region_rect">
The region of the atlas texture to display. [member region_enabled] must be [code]true[/code].
diff --git a/doc/classes/Sprite3D.xml b/doc/classes/Sprite3D.xml
index 2a65246dde..f43fa34785 100644
--- a/doc/classes/Sprite3D.xml
+++ b/doc/classes/Sprite3D.xml
@@ -20,7 +20,7 @@
The number of columns in the sprite sheet.
</member>
<member name="region_enabled" type="bool" setter="set_region" getter="is_region">
- If [code]true[/code] texture will be cut from a larger atlas texture. See [member region_rect]. Default value: [code]false[/code].
+ If [code]true[/code], texture will be cut from a larger atlas texture. See [member region_rect]. Default value: [code]false[/code].
</member>
<member name="region_rect" type="Rect2" setter="set_region_rect" getter="get_region_rect">
The region of the atlas texture to display. [member region_enabled] must be [code]true[/code].
diff --git a/doc/classes/SpriteBase3D.xml b/doc/classes/SpriteBase3D.xml
index fd4b583928..12d58808d5 100644
--- a/doc/classes/SpriteBase3D.xml
+++ b/doc/classes/SpriteBase3D.xml
@@ -31,16 +31,16 @@
The direction in which the front of the texture faces.
</member>
<member name="centered" type="bool" setter="set_centered" getter="is_centered">
- If [code]true[/code] texture will be centered. Default value: [code]true[/code].
+ If [code]true[/code], texture will be centered. Default value: [code]true[/code].
</member>
<member name="double_sided" type="bool" setter="set_draw_flag" getter="get_draw_flag">
- If [code]true[/code] texture can be seen from the back as well, if [code]false[/code], it is invisible when looking at it from behind. Default value: [code]true[/code].
+ If [code]true[/code], texture can be seen from the back as well, if [code]false[/code], it is invisible when looking at it from behind. Default value: [code]true[/code].
</member>
<member name="flip_h" type="bool" setter="set_flip_h" getter="is_flipped_h">
- If [code]true[/code] texture is flipped horizontally. Default value: [code]false[/code].
+ If [code]true[/code], texture is flipped horizontally. Default value: [code]false[/code].
</member>
<member name="flip_v" type="bool" setter="set_flip_v" getter="is_flipped_v">
- If [code]true[/code] texture is flipped vertically. Default value: [code]false[/code].
+ If [code]true[/code], texture is flipped vertically. Default value: [code]false[/code].
</member>
<member name="modulate" type="Color" setter="set_modulate" getter="get_modulate">
A color value that gets multiplied on, could be used for mood-coloring or to simulate the color of light.
@@ -55,10 +55,10 @@
The size of one pixel's width on the Sprite to scale it in 3D.
</member>
<member name="shaded" type="bool" setter="set_draw_flag" getter="get_draw_flag">
- If [code]true[/code] the [Light] in the [Environment] has effects on the Sprite. Default value: [code]false[/code].
+ If [code]true[/code], the [Light] in the [Environment] has effects on the Sprite. Default value: [code]false[/code].
</member>
<member name="transparent" type="bool" setter="set_draw_flag" getter="get_draw_flag">
- If [code]true[/code] the texture's transparency and the opacity are used to make those parts of the Sprite invisible. Default value: [code]true[/code].
+ If [code]true[/code], the texture's transparency and the opacity are used to make those parts of the Sprite invisible. Default value: [code]true[/code].
</member>
</members>
<constants>
diff --git a/doc/classes/SpriteFrames.xml b/doc/classes/SpriteFrames.xml
index 0e11d797e4..e261b2112f 100644
--- a/doc/classes/SpriteFrames.xml
+++ b/doc/classes/SpriteFrames.xml
@@ -55,7 +55,7 @@
<argument index="0" name="anim" type="String">
</argument>
<description>
- If [code]true[/code] the given animation will loop.
+ If [code]true[/code], the given animation will loop.
</description>
</method>
<method name="get_animation_names" qualifiers="const">
@@ -100,7 +100,7 @@
<argument index="0" name="anim" type="String">
</argument>
<description>
- If [code]true[/code] the named animation exists.
+ If [code]true[/code], the named animation exists.
</description>
</method>
<method name="remove_animation">
@@ -142,7 +142,7 @@
<argument index="1" name="loop" type="bool">
</argument>
<description>
- If [code]true[/code] the animation will loop.
+ If [code]true[/code], the animation will loop.
</description>
</method>
<method name="set_animation_speed">
diff --git a/doc/classes/StaticBody.xml b/doc/classes/StaticBody.xml
index 442a520e30..01f5b07329 100644
--- a/doc/classes/StaticBody.xml
+++ b/doc/classes/StaticBody.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="StaticBody" inherits="PhysicsBody" category="Core" version="3.1">
<brief_description>
- Static body for 3D Physics.
+ Static body for 3D physics.
</brief_description>
<description>
- Static body for 3D Physics. A static body is a simple body that is not intended to move. They don't consume any CPU resources in contrast to a [RigidBody3D] so they are great for scenario collision.
+ Static body for 3D physics. A static body is a simple body that is not intended to move. They don't consume any CPU resources in contrast to a [RigidBody] so they are great for scenario collision.
A static body can also be animated by using simulated motion mode. This is useful for implementing functionalities such as moving platforms. When this mode is active the body can be animated and automatically computes linear and angular velocity to apply in that frame and to influence other bodies.
Alternatively, a constant linear or angular velocity can be set for the static body, so even if it doesn't move, it affects other bodies as if it was moving (this is useful for simulating conveyor belts or conveyor wheels).
</description>
diff --git a/doc/classes/StreamPeerTCP.xml b/doc/classes/StreamPeerTCP.xml
index 9a0fceddab..18324d9043 100644
--- a/doc/classes/StreamPeerTCP.xml
+++ b/doc/classes/StreamPeerTCP.xml
@@ -19,7 +19,7 @@
<argument index="1" name="port" type="int">
</argument>
<description>
- Connect to the specified host:port pair. A hostname will be resolved if valid. Returns [OK] on success or [FAILED] on failure.
+ Connect to the specified host:port pair. A hostname will be resolved if valid. Returns [code]OK[/code] on success or [code]FAILED[/code] on failure.
</description>
</method>
<method name="disconnect_from_host">
@@ -47,14 +47,14 @@
<return type="int" enum="StreamPeerTCP.Status">
</return>
<description>
- Return the status of the connection, one of STATUS_* enum.
+ Return the status of the connection, see [enum StreamPeerTCP.Status].
</description>
</method>
<method name="is_connected_to_host" qualifiers="const">
<return type="bool">
</return>
<description>
- Returns [code]true[/code] if this peer is currently connected to a host, [code]false[code] otherwise.
+ Returns [code]true[/code] if this peer is currently connected to a host, [code]false[/code] otherwise.
</description>
</method>
<method name="set_no_delay">
diff --git a/doc/classes/String.xml b/doc/classes/String.xml
index 536165487d..6ac47a89c2 100644
--- a/doc/classes/String.xml
+++ b/doc/classes/String.xml
@@ -439,6 +439,15 @@
Returns [code]true[/code] if this string contains a valid float.
</description>
</method>
+ <method name="is_valid_hex_number">
+ <return type="bool">
+ </return>
+ <argument index="0" name="with_prefix" type="bool" default="False">
+ </argument>
+ <description>
+ Returns [code]true[/code] if this string contains a valid hexadecimal number. If [code]with_prefix[/code] is [code]true[/code], then a validity of the hexadecimal number is determined by [code]0x[/code] prefix, for instance: [code]0xDEADC0DE[/code].
+ </description>
+ </method>
<method name="is_valid_html_color">
<return type="bool">
</return>
@@ -450,7 +459,7 @@
<return type="bool">
</return>
<description>
- Returns [code]true[/code] if this string is a valid identifier. A valid identifier may contain only letters, digits and underscores (_) and the first character may not be a digit.
+ Returns [code]true[/code] if this string is a valid identifier. A valid identifier may contain only letters, digits and underscores ([code]_[/code]) and the first character may not be a digit.
</description>
</method>
<method name="is_valid_integer">
@@ -505,7 +514,7 @@
<argument index="0" name="expr" type="String">
</argument>
<description>
- Does a simple expression match, where '*' matches zero or more arbitrary characters and '?' matches any single character except '.'.
+ Does a simple expression match, where [code]*[/code] matches zero or more arbitrary characters and [code]?[/code] matches any single character except '.'.
</description>
</method>
<method name="matchn">
@@ -514,7 +523,7 @@
<argument index="0" name="expr" type="String">
</argument>
<description>
- Does a simple case insensitive expression match, using ? and * wildcards (see [method match]).
+ Does a simple case insensitive expression match, using [code]?[/code] and [code]*[/code] wildcards (see [method match]).
</description>
</method>
<method name="md5_buffer">
@@ -654,7 +663,7 @@
</argument>
<description>
Splits the string by a [code]divisor[/code] string and returns an array of the substrings, starting from right.
- [b]Example:[/b] "One,Two,Three" will return ["One","Two","Three"] if split by ",".
+ [b]Example:[/b] [code]"One,Two,Three"[/code] will return [code]["One","Two","Three"][/code] if split by [code]","[/code].
If [code]maxsplit[/code] is specified, then it is number of splits to do, default is 0 which splits all the items.
</description>
</method>
@@ -701,7 +710,7 @@
</argument>
<description>
Splits the string by a divisor string and returns an array of the substrings.
- [b]Example:[/b] "One,Two,Three" will return ["One","Two","Three"] if split by ",".
+ [b]Example:[/b] [code]"One,Two,Three"[/code] will return [code]["One","Two","Three"][/code] if split by [code]","[/code].
If [code]maxsplit[/code] is given, at most maxsplit number of splits occur, and the remainder of the string is returned as the final element of the list (thus, the list will have at most maxsplit+1 elements)
</description>
</method>
@@ -714,7 +723,7 @@
</argument>
<description>
Splits the string in floats by using a divisor string and returns an array of the substrings.
- [b]Example:[/b] "1,2.5,3" will return [1,2.5,3] if split by ",".
+ [b]Example:[/b] [code]"1,2.5,3"[/code] will return [code][1,2.5,3][/code] if split by [code]","[/code].
</description>
</method>
<method name="strip_edges">
@@ -743,7 +752,7 @@
<return type="PoolByteArray">
</return>
<description>
- Converts the String (which is a character array) to [PoolByteArray] (which is an array of bytes). The conversion is sped up in comparison to to_utf8() with the assumption that all the characters the String contains are only ASCII characters.
+ Converts the String (which is a character array) to [PoolByteArray] (which is an array of bytes). The conversion is sped up in comparison to [method to_utf8] with the assumption that all the characters the String contains are only ASCII characters.
</description>
</method>
<method name="to_float">
@@ -778,7 +787,7 @@
<return type="PoolByteArray">
</return>
<description>
- Converts the String (which is an array of characters) to [PoolByteArray] (which is an array of bytes). The conversion is a bit slower than to_ascii(), but supports all UTF-8 characters. Therefore, you should prefer this function over to_ascii().
+ Converts the String (which is an array of characters) to [PoolByteArray] (which is an array of bytes). The conversion is a bit slower than [method to_ascii], but supports all UTF-8 characters. Therefore, you should prefer this function over [method to_ascii].
</description>
</method>
<method name="trim_prefix">
diff --git a/doc/classes/StyleBoxFlat.xml b/doc/classes/StyleBoxFlat.xml
index 641d6214a4..a162aa02b0 100644
--- a/doc/classes/StyleBoxFlat.xml
+++ b/doc/classes/StyleBoxFlat.xml
@@ -5,22 +5,21 @@
</brief_description>
<description>
This stylebox can be used to achieve all kinds of looks without the need of a texture. Those properties are customizable:
- - Color
- - Border width (individual width for each border)
- - Rounded corners (individual radius for each corner)
- - Shadow
- About corner radius:
- Setting corner radius to high values is allowed. As soon as corners would overlap the stylebox will switch to a relative system. Example:
- [codeblock]
- height = 30
- corner_radius_top_left = 50
- corner_radius_bottom_left = 100
- [/codeblock]
- The relative system now would take the 1:2 ratio of the two left corners to calculate the actual corner width. Both corners added will [b]never[/b] be more than the height. Result:
- [codeblock]
- corner_radius_top_left: 10
- corner_radius_bottom_left: 20
- [/codeblock]
+ - Color
+ - Border width (individual width for each border)
+ - Rounded corners (individual radius for each corner)
+ - Shadow
+ Setting corner radius to high values is allowed. As soon as corners would overlap the stylebox will switch to a relative system. Example:
+ [codeblock]
+ height = 30
+ corner_radius_top_left = 50
+ corner_radius_bottom_left = 100
+ [/codeblock]
+ The relative system now would take the 1:2 ratio of the two left corners to calculate the actual corner width. Both corners added will [b]never[/b] be more than the height. Result:
+ [codeblock]
+ corner_radius_top_left: 10
+ corner_radius_bottom_left: 20
+ [/codeblock]
</description>
<tutorials>
</tutorials>
@@ -115,9 +114,9 @@
Border width for the top border.
</member>
<member name="corner_detail" type="int" setter="set_corner_detail" getter="get_corner_detail">
- This sets the amount of vertices used for each corner. Higher values result in rounder corners but take more processing power to compute. When choosing a value you should take the corner radius ([method set_corner_radius]) into account.
- For corner radius smaller than 10: 4-5 should be enough
- For corner radius smaller than 30: 8-12 should be enough ...
+ This sets the amount of vertices used for each corner. Higher values result in rounder corners but take more processing power to compute. When choosing a value you should take the corner radius ([method set_corner_radius_all]) into account.
+ For corner radius smaller than 10, 4-5 should be enough.
+ For corner radius smaller than 30, 8-12 should be enough.
</member>
<member name="corner_radius_bottom_left" type="int" setter="set_corner_radius" getter="get_corner_radius">
The corner radius of the bottom left corner. When set to 0 the corner is not rounded.
diff --git a/doc/classes/TabContainer.xml b/doc/classes/TabContainer.xml
index f17c10b31e..04285b62df 100644
--- a/doc/classes/TabContainer.xml
+++ b/doc/classes/TabContainer.xml
@@ -148,7 +148,7 @@
The alignment of all tabs in the tab container. See the [code]ALIGN_*[/code] constants for details.
</member>
<member name="tabs_visible" type="bool" setter="set_tabs_visible" getter="are_tabs_visible">
- If [code]true[/code] tabs are visible. If [code]false[/code] tabs' content and titles are hidden. Default value: [code]true[/code].
+ If [code]true[/code], tabs are visible. If [code]false[/code], tabs' content and titles are hidden. Default value: [code]true[/code].
</member>
</members>
<signals>
diff --git a/doc/classes/Tabs.xml b/doc/classes/Tabs.xml
index 350b49513d..de57250d8b 100644
--- a/doc/classes/Tabs.xml
+++ b/doc/classes/Tabs.xml
@@ -126,7 +126,7 @@
<argument index="0" name="enabled" type="bool">
</argument>
<description>
- If [code]true[/code] enables selecting a tab with right mouse button.
+ If [code]true[/code], enables selecting a tab with right mouse button.
</description>
</method>
<method name="set_tab_disabled">
diff --git a/doc/classes/TextEdit.xml b/doc/classes/TextEdit.xml
index a958c3fcfa..e237cfa220 100644
--- a/doc/classes/TextEdit.xml
+++ b/doc/classes/TextEdit.xml
@@ -359,39 +359,39 @@
</methods>
<members>
<member name="breakpoint_gutter" type="bool" setter="set_breakpoint_gutter_enabled" getter="is_breakpoint_gutter_enabled">
- If [code]true[/code] the breakpoint gutter is visible.
+ If [code]true[/code], the breakpoint gutter is visible.
</member>
<member name="caret_blink" type="bool" setter="cursor_set_blink_enabled" getter="cursor_get_blink_enabled">
- If [code]true[/code] the caret (visual cursor) blinks.
+ If [code]true[/code], the caret (visual cursor) blinks.
</member>
<member name="caret_blink_speed" type="float" setter="cursor_set_blink_speed" getter="cursor_get_blink_speed">
Duration (in seconds) of a caret's blinking cycle.
</member>
<member name="caret_block_mode" type="bool" setter="cursor_set_block_mode" getter="cursor_is_block_mode">
- If [code]true[/code] the caret displays as a rectangle.
- If [code]false[/code] the caret displays as a bar.
+ If [code]true[/code], the caret displays as a rectangle.
+ If [code]false[/code], the caret displays as a bar.
</member>
<member name="caret_moving_by_right_click" type="bool" setter="set_right_click_moves_caret" getter="is_right_click_moving_caret">
- If [code]true[/code] a right click moves the cursor at the mouse position before displaying the context menu.
- If [code]false[/code] the context menu disregards mouse location.
+ If [code]true[/code], a right click moves the cursor at the mouse position before displaying the context menu.
+ If [code]false[/code], the context menu disregards mouse location.
</member>
<member name="context_menu_enabled" type="bool" setter="set_context_menu_enabled" getter="is_context_menu_enabled">
- If [code]true[/code] a right click displays the context menu.
+ If [code]true[/code], a right click displays the context menu.
</member>
<member name="hiding_enabled" type="int" setter="set_hiding_enabled" getter="is_hiding_enabled">
</member>
<member name="highlight_all_occurrences" type="bool" setter="set_highlight_all_occurrences" getter="is_highlight_all_occurrences_enabled">
</member>
<member name="highlight_current_line" type="bool" setter="set_highlight_current_line" getter="is_highlight_current_line_enabled">
- If [code]true[/code] the line containing the cursor is highlighted.
+ If [code]true[/code], the line containing the cursor is highlighted.
</member>
<member name="override_selected_font_color" type="bool" setter="set_override_selected_font_color" getter="is_overriding_selected_font_color">
</member>
<member name="readonly" type="bool" setter="set_readonly" getter="is_readonly">
- If [code]true[/code] read-only mode is enabled. Existing text cannot be modified and new text cannot be added.
+ If [code]true[/code], read-only mode is enabled. Existing text cannot be modified and new text cannot be added.
</member>
<member name="show_line_numbers" type="bool" setter="set_show_line_numbers" getter="is_show_line_numbers_enabled">
- If [code]true[/code] line numbers are displayed to the left of the text.
+ If [code]true[/code], line numbers are displayed to the left of the text.
</member>
<member name="smooth_scrolling" type="bool" setter="set_smooth_scroll_enable" getter="is_smooth_scroll_enabled">
</member>
@@ -467,7 +467,9 @@
<constant name="MENU_UNDO" value="5" enum="MenuItems">
Undoes the previous action.
</constant>
- <constant name="MENU_MAX" value="6" enum="MenuItems">
+ <constant name="MENU_REDO" value="6" enum="MenuItems">
+ </constant>
+ <constant name="MENU_MAX" value="7" enum="MenuItems">
</constant>
</constants>
<theme_items>
diff --git a/doc/classes/TextureButton.xml b/doc/classes/TextureButton.xml
index 7e54ab9fe8..b25c69c680 100644
--- a/doc/classes/TextureButton.xml
+++ b/doc/classes/TextureButton.xml
@@ -15,13 +15,13 @@
</methods>
<members>
<member name="expand" type="bool" setter="set_expand" getter="get_expand">
- If [code]true[/code] the texture stretches to the edges of the node's bounding rectangle using the [member stretch_mode]. If [code]false[/code] the texture will not scale with the node. Default value: [code]false[/code].
+ If [code]true[/code], the texture stretches to the edges of the node's bounding rectangle using the [member stretch_mode]. If [code]false[/code], the texture will not scale with the node. Default value: [code]false[/code].
</member>
<member name="stretch_mode" type="int" setter="set_stretch_mode" getter="get_stretch_mode" enum="TextureButton.StretchMode">
Controls the texture's behavior when you resize the node's bounding rectangle, [b]only if[/b] [member expand] is [code]true[/code]. Set it to one of the [code]STRETCH_*[/code] constants. See the constants to learn more.
</member>
<member name="texture_click_mask" type="BitMap" setter="set_click_mask" getter="get_click_mask">
- Pure black and white [Bitmap] image to use for click detection. On the mask, white pixels represent the button's clickable area. Use it to create buttons with curved shapes.
+ Pure black and white [BitMap] image to use for click detection. On the mask, white pixels represent the button's clickable area. Use it to create buttons with curved shapes.
</member>
<member name="texture_disabled" type="Texture" setter="set_disabled_texture" getter="get_disabled_texture">
Texture to display when the node is disabled. See [member BaseButton.disabled].
diff --git a/doc/classes/TextureProgress.xml b/doc/classes/TextureProgress.xml
index 3cbaf0429c..a98a2e9f74 100644
--- a/doc/classes/TextureProgress.xml
+++ b/doc/classes/TextureProgress.xml
@@ -17,7 +17,7 @@
The fill direction. Uses FILL_* constants.
</member>
<member name="nine_patch_stretch" type="bool" setter="set_nine_patch_stretch" getter="get_nine_patch_stretch">
- If [code]true[/code] Godot treats the bar's textures like [NinePatchRect]. Use [code]stretch_margin_*[/code], like [member stretch_margin_bottom], to set up the nine patch's 3x3 grid. Default value: [code]false[/code].
+ If [code]true[/code], Godot treats the bar's textures like [NinePatchRect]. Use [code]stretch_margin_*[/code], like [member stretch_margin_bottom], to set up the nine patch's 3x3 grid. Default value: [code]false[/code].
</member>
<member name="radial_center_offset" type="Vector2" setter="set_radial_center_offset" getter="get_radial_center_offset">
Offsets [member texture_progress] if [member fill_mode] is [code]FILL_CLOCKWISE[/code] or [code]FILL_COUNTER_CLOCKWISE[/code].
diff --git a/doc/classes/TextureRect.xml b/doc/classes/TextureRect.xml
index 95afc5d281..78065afcc9 100644
--- a/doc/classes/TextureRect.xml
+++ b/doc/classes/TextureRect.xml
@@ -14,7 +14,7 @@
</methods>
<members>
<member name="expand" type="bool" setter="set_expand" getter="has_expand">
- If [code]true[/code] the texture scales to fit its bounding rectangle. Default value: [code]false[/code].
+ If [code]true[/code], the texture scales to fit its bounding rectangle. Default value: [code]false[/code].
</member>
<member name="stretch_mode" type="int" setter="set_stretch_mode" getter="get_stretch_mode" enum="TextureRect.StretchMode">
Controls the texture's behavior when resizing the node's bounding rectangle. See [enum StretchMode].
diff --git a/doc/classes/Theme.xml b/doc/classes/Theme.xml
index fe43b54d5e..8c6acd2c51 100644
--- a/doc/classes/Theme.xml
+++ b/doc/classes/Theme.xml
@@ -12,6 +12,12 @@
<demos>
</demos>
<methods>
+ <method name="clear">
+ <return type="void">
+ </return>
+ <description>
+ </description>
+ </method>
<method name="clear_color">
<return type="void">
</return>
diff --git a/doc/classes/TileMap.xml b/doc/classes/TileMap.xml
index 7034d75473..fb5a733ccd 100644
--- a/doc/classes/TileMap.xml
+++ b/doc/classes/TileMap.xml
@@ -37,6 +37,16 @@
Returns the tile index of the given cell.
</description>
</method>
+ <method name="get_cell_autotile_coord" qualifiers="const">
+ <return type="Vector2">
+ </return>
+ <argument index="0" name="x" type="int">
+ </argument>
+ <argument index="1" name="y" type="int">
+ </argument>
+ <description>
+ </description>
+ </method>
<method name="get_cellv" qualifiers="const">
<return type="int">
</return>
@@ -257,7 +267,7 @@
Position for tile origin. Uses TILE_ORIGIN_* constants. Default value: TILE_ORIGIN_TOP_LEFT.
</member>
<member name="cell_y_sort" type="bool" setter="set_y_sort_mode" getter="is_y_sort_mode_enabled">
- If [code]true[/code] the TileMap's children will be drawn in order of their Y coordinate. Default value: [code]false[/code].
+ If [code]true[/code], the TileMap's children will be drawn in order of their Y coordinate. Default value: [code]false[/code].
</member>
<member name="collision_bounce" type="float" setter="set_collision_bounce" getter="get_collision_bounce">
Bounce value for static body collisions (see [code]collision_use_kinematic[/code]). Default value: 0.
@@ -272,7 +282,7 @@
The collision mask(s) for all colliders in the TileMap.
</member>
<member name="collision_use_kinematic" type="bool" setter="set_collision_use_kinematic" getter="get_collision_use_kinematic">
- If [code]true[/code] TileMap collisions will be handled as a kinematic body. If [code]false[/code] collisions will be handled as static body. Default value: [code]false[/code].
+ If [code]true[/code], TileMap collisions will be handled as a kinematic body. If [code]false[/code], collisions will be handled as static body. Default value: [code]false[/code].
</member>
<member name="mode" type="int" setter="set_mode" getter="get_mode" enum="TileMap.Mode">
The TileMap orientation mode. Uses MODE_* constants. Default value: MODE_SQUARE.
diff --git a/doc/classes/TileSet.xml b/doc/classes/TileSet.xml
index ffd15e8d8b..9e31f7e1b1 100644
--- a/doc/classes/TileSet.xml
+++ b/doc/classes/TileSet.xml
@@ -36,12 +36,66 @@
<description>
</description>
</method>
+ <method name="autotile_clear_bitmask_map">
+ <return type="void">
+ </return>
+ <argument index="0" name="id" type="int">
+ </argument>
+ <description>
+ Clears all bitmask info of the autotile.
+ </description>
+ </method>
+ <method name="autotile_get_bitmask">
+ <return type="int">
+ </return>
+ <argument index="0" name="id" type="int">
+ </argument>
+ <argument index="1" name="coord" type="Vector2">
+ </argument>
+ <description>
+ Returns the bitmask of the subtile from an autotile given its coordinates.
+ The value is the sum of the values in [enum TileSet.AutotileBindings] present in the subtile (e.g. a value of 5 means the bitmask has bindings in both the top left and top right).
+ </description>
+ </method>
<method name="autotile_get_bitmask_mode" qualifiers="const">
<return type="int" enum="TileSet.BitmaskMode">
</return>
<argument index="0" name="id" type="int">
</argument>
<description>
+ Returns the [enum TileSet.BitmaskMode] of the autotile.
+ </description>
+ </method>
+ <method name="autotile_get_icon_coordinate" qualifiers="const">
+ <return type="Vector2">
+ </return>
+ <argument index="0" name="id" type="int">
+ </argument>
+ <description>
+ Returns the subtile that's being used as an icon in an atlas/autotile given its coordinates.
+ The subtile defined as the icon will be used as a fallback when the atlas/autotile's bitmask info is incomplete. It will also be used to represent it in the TileSet editor.
+ </description>
+ </method>
+ <method name="autotile_get_light_occluder" qualifiers="const">
+ <return type="OccluderPolygon2D">
+ </return>
+ <argument index="0" name="id" type="int">
+ </argument>
+ <argument index="1" name="coord" type="Vector2">
+ </argument>
+ <description>
+ Returns the light occluder of the subtile from an atlas/autotile given its coordinates.
+ </description>
+ </method>
+ <method name="autotile_get_navigation_polygon" qualifiers="const">
+ <return type="NavigationPolygon">
+ </return>
+ <argument index="0" name="id" type="int">
+ </argument>
+ <argument index="1" name="coord" type="Vector2">
+ </argument>
+ <description>
+ Returns the navigation polygon of the subtile from an atlas/autotile given its coordinates.
</description>
</method>
<method name="autotile_get_size" qualifiers="const">
@@ -50,6 +104,53 @@
<argument index="0" name="id" type="int">
</argument>
<description>
+ Returns the size of the subtiles in an atlas/autotile.
+ </description>
+ </method>
+ <method name="autotile_get_spacing" qualifiers="const">
+ <return type="int">
+ </return>
+ <argument index="0" name="id" type="int">
+ </argument>
+ <description>
+ Returns the spacing between subtiles of the atlas/autotile.
+ </description>
+ </method>
+ <method name="autotile_get_subtile_priority">
+ <return type="int">
+ </return>
+ <argument index="0" name="id" type="int">
+ </argument>
+ <argument index="1" name="coord" type="Vector2">
+ </argument>
+ <description>
+ Returns the priority of the subtile from an autotile given its coordinates.
+ When more than one subtile has the same bitmask value, one of them will be picked randomly for drawing. Its priority will define how often it will be picked.
+ </description>
+ </method>
+ <method name="autotile_get_z_index">
+ <return type="int">
+ </return>
+ <argument index="0" name="id" type="int">
+ </argument>
+ <argument index="1" name="coord" type="Vector2">
+ </argument>
+ <description>
+ Returns the drawing index of the subtile from an atlas/autotile given its coordinates.
+ </description>
+ </method>
+ <method name="autotile_set_bitmask">
+ <return type="void">
+ </return>
+ <argument index="0" name="id" type="int">
+ </argument>
+ <argument index="1" name="bitmask" type="Vector2">
+ </argument>
+ <argument index="2" name="flag" type="int">
+ </argument>
+ <description>
+ Sets the bitmask of the subtile from an autotile given its coordinates.
+ The value is the sum of the values in [enum TileSet.AutotileBindings] present in the subtile (e.g. a value of 5 means the bitmask has bindings in both the top left and top right).
</description>
</method>
<method name="autotile_set_bitmask_mode">
@@ -60,6 +161,45 @@
<argument index="1" name="mode" type="int" enum="TileSet.BitmaskMode">
</argument>
<description>
+ Sets the [enum TileSet.BitmaskMode] of the autotile.
+ </description>
+ </method>
+ <method name="autotile_set_icon_coordinate">
+ <return type="void">
+ </return>
+ <argument index="0" name="id" type="int">
+ </argument>
+ <argument index="1" name="coord" type="Vector2">
+ </argument>
+ <description>
+ Sets the subtile that will be used as an icon in an atlas/autotile given its coordinates.
+ The subtile defined as the icon will be used as a fallback when the atlas/autotile's bitmask info is incomplete. It will also be used to represent it in the TileSet editor.
+ </description>
+ </method>
+ <method name="autotile_set_light_occluder">
+ <return type="void">
+ </return>
+ <argument index="0" name="id" type="int">
+ </argument>
+ <argument index="1" name="light_occluder" type="OccluderPolygon2D">
+ </argument>
+ <argument index="2" name="coord" type="Vector2">
+ </argument>
+ <description>
+ Sets the light occluder of the subtile from an atlas/autotile given its coordinates.
+ </description>
+ </method>
+ <method name="autotile_set_navigation_polygon">
+ <return type="void">
+ </return>
+ <argument index="0" name="id" type="int">
+ </argument>
+ <argument index="1" name="navigation_polygon" type="NavigationPolygon">
+ </argument>
+ <argument index="2" name="coord" type="Vector2">
+ </argument>
+ <description>
+ Sets the navigation polygon of the subtile from an atlas/autotile given its coordinates.
</description>
</method>
<method name="autotile_set_size">
@@ -70,6 +210,45 @@
<argument index="1" name="size" type="Vector2">
</argument>
<description>
+ Sets the size of the subtiles in an atlas/autotile.
+ </description>
+ </method>
+ <method name="autotile_set_spacing">
+ <return type="void">
+ </return>
+ <argument index="0" name="id" type="int">
+ </argument>
+ <argument index="1" name="spacing" type="int">
+ </argument>
+ <description>
+ Sets the spacing between subtiles of the atlas/autotile.
+ </description>
+ </method>
+ <method name="autotile_set_subtile_priority">
+ <return type="void">
+ </return>
+ <argument index="0" name="id" type="int">
+ </argument>
+ <argument index="1" name="coord" type="Vector2">
+ </argument>
+ <argument index="2" name="priority" type="int">
+ </argument>
+ <description>
+ Sets the priority of the subtile from an autotile given its coordinates.
+ When more than one subtile has the same bitmask value, one of them will be picked randomly for drawing. Its priority will define how often it will be picked.
+ </description>
+ </method>
+ <method name="autotile_set_z_index">
+ <return type="void">
+ </return>
+ <argument index="0" name="id" type="int">
+ </argument>
+ <argument index="1" name="coord" type="Vector2">
+ </argument>
+ <argument index="2" name="z_index" type="int">
+ </argument>
+ <description>
+ Sets the drawing index of the subtile from an atlas/autotile given its coordinates.
</description>
</method>
<method name="clear">
@@ -304,7 +483,7 @@
<argument index="0" name="id" type="int">
</argument>
<description>
- Returns the tile's [enum TileMode].
+ Returns the tile's [enum TileSet.TileMode].
</description>
</method>
<method name="tile_get_z_index" qualifiers="const">
@@ -508,7 +687,7 @@
<argument index="1" name="tilemode" type="int" enum="TileSet.TileMode">
</argument>
<description>
- Sets the tile's [enum TileMode].
+ Sets the tile's [enum TileSet.TileMode].
</description>
</method>
<method name="tile_set_z_index">
diff --git a/doc/classes/Timer.xml b/doc/classes/Timer.xml
index 65d638c4c0..ae0a3ad148 100644
--- a/doc/classes/Timer.xml
+++ b/doc/classes/Timer.xml
@@ -24,8 +24,8 @@
<argument index="0" name="time_sec" type="float" default="-1">
</argument>
<description>
- Starts the timer. Sets [code]wait_time[/code] to [code]time_sec[/code] if [code]time_sec[/code] &gt; 0. This also resets the remaining time to [code]wait_time[/code].
- Note: this method will not resume a paused timer. See [method set_paused].
+ Starts the timer. Sets [code]wait_time[/code] to [code]time_sec[/code] if [code]time_sec &gt; 0[/code]. This also resets the remaining time to [code]wait_time[/code].
+ Note: this method will not resume a paused timer. See [member paused].
</description>
</method>
<method name="stop">
@@ -38,13 +38,13 @@
</methods>
<members>
<member name="autostart" type="bool" setter="set_autostart" getter="has_autostart">
- If [code]true[/code] the timer will automatically start when entering the scene tree. Default value: [code]false[/code].
+ If [code]true[/code], the timer will automatically start when entering the scene tree. Default value: [code]false[/code].
</member>
<member name="one_shot" type="bool" setter="set_one_shot" getter="is_one_shot">
- If [code]true[/code] the timer will stop when reaching 0. If [code]false[/code] it will restart. Default value: [code]false[/code].
+ If [code]true[/code], the timer will stop when reaching 0. If [code]false[/code], it will restart. Default value: [code]false[/code].
</member>
<member name="paused" type="bool" setter="set_paused" getter="is_paused">
- If [code]true[/code] the timer is paused and will not process until it is unpaused again, even if [method start] is called.
+ If [code]true[/code], the timer is paused and will not process until it is unpaused again, even if [method start] is called.
</member>
<member name="process_mode" type="int" setter="set_timer_process_mode" getter="get_timer_process_mode" enum="Timer.TimerProcessMode">
Processing mode. See [enum TimerProcessMode].
diff --git a/doc/classes/ToolButton.xml b/doc/classes/ToolButton.xml
index d8db95a854..b52e1d39dc 100644
--- a/doc/classes/ToolButton.xml
+++ b/doc/classes/ToolButton.xml
@@ -4,10 +4,10 @@
Flat button helper class.
</brief_description>
<description>
- This is a helper class to generate a flat [Button] (see [method Button.set_flat]), creating a ToolButton is equivalent to:
+ This is a helper class to generate a flat [Button] (see [member Button.flat]), creating a [code]ToolButton[/code] is equivalent to:
[codeblock]
var btn = Button.new()
- btn.set_flat(true)
+ btn.flat = true
[/codeblock]
</description>
<tutorials>
diff --git a/doc/classes/TouchScreenButton.xml b/doc/classes/TouchScreenButton.xml
index 1b37ce95ba..6cc688d3c5 100644
--- a/doc/classes/TouchScreenButton.xml
+++ b/doc/classes/TouchScreenButton.xml
@@ -30,7 +30,7 @@
The button's texture for the normal state.
</member>
<member name="passby_press" type="bool" setter="set_passby_press" getter="is_passby_press_enabled">
- If [code]true[/code] passby presses are enabled.
+ If [code]true[/code], passby presses are enabled.
</member>
<member name="pressed" type="Texture" setter="set_texture_pressed" getter="get_texture_pressed">
The button's texture for the pressed state.
@@ -39,10 +39,10 @@
The button's shape.
</member>
<member name="shape_centered" type="bool" setter="set_shape_centered" getter="is_shape_centered">
- If [code]true[/code] the button's shape is centered.
+ If [code]true[/code], the button's shape is centered.
</member>
<member name="shape_visible" type="bool" setter="set_shape_visible" getter="is_shape_visible">
- If [code]true[/code] the button's shape is visible.
+ If [code]true[/code], the button's shape is visible.
</member>
<member name="visibility_mode" type="int" setter="set_visibility_mode" getter="get_visibility_mode" enum="TouchScreenButton.VisibilityMode">
The button's visibility mode. See [code]VISIBILITY_*[/code] constants.
diff --git a/doc/classes/Translation.xml b/doc/classes/Translation.xml
index c4e9dbfb70..b57f8f3556 100644
--- a/doc/classes/Translation.xml
+++ b/doc/classes/Translation.xml
@@ -7,6 +7,8 @@
Translations are resources that can be loaded/unloaded on demand. They map a string to another string.
</description>
<tutorials>
+ <link>https://docs.godotengine.org/en/stable/tutorials/i18n/internationalizing_games.html</link>
+ <link>https://docs.godotengine.org/en/stable/tutorials/i18n/locales.html</link>
</tutorials>
<demos>
</demos>
@@ -19,7 +21,7 @@
<argument index="1" name="xlated_message" type="String">
</argument>
<description>
- Add a message for translation.
+ Adds a message if nonexistent, followed by its translation.
</description>
</method>
<method name="erase_message">
@@ -28,7 +30,7 @@
<argument index="0" name="src_message" type="String">
</argument>
<description>
- Erase a message.
+ Erases a message.
</description>
</method>
<method name="get_message" qualifiers="const">
@@ -37,25 +39,27 @@
<argument index="0" name="src_message" type="String">
</argument>
<description>
- Return a message for translation.
+ Returns a message's translation.
</description>
</method>
<method name="get_message_count" qualifiers="const">
<return type="int">
</return>
<description>
+ Returns the number of existing messages.
</description>
</method>
<method name="get_message_list" qualifiers="const">
<return type="PoolStringArray">
</return>
<description>
- Return all the messages (keys).
+ Returns all the messages (keys).
</description>
</method>
</methods>
<members>
<member name="locale" type="String" setter="set_locale" getter="get_locale">
+ The locale of the translation.
</member>
</members>
<constants>
diff --git a/doc/classes/TranslationLoaderPO.xml b/doc/classes/TranslationLoaderPO.xml
new file mode 100644
index 0000000000..58cf2f6572
--- /dev/null
+++ b/doc/classes/TranslationLoaderPO.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="TranslationLoaderPO" inherits="ResourceFormatLoader" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/TranslationServer.xml b/doc/classes/TranslationServer.xml
index 52d2b2cc47..c2c400ccd5 100644
--- a/doc/classes/TranslationServer.xml
+++ b/doc/classes/TranslationServer.xml
@@ -1,11 +1,14 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="TranslationServer" inherits="Object" category="Core" version="3.1">
<brief_description>
- Server that manages all translations. Translations can be set to it and removed from it.
+ Server that manages all translations.
</brief_description>
<description>
+ Server that manages all translations. Translations can be set to it and removed from it.
</description>
<tutorials>
+ <link>https://docs.godotengine.org/en/stable/tutorials/i18n/internationalizing_games.html</link>
+ <link>https://docs.godotengine.org/en/stable/tutorials/i18n/locales.html</link>
</tutorials>
<demos>
</demos>
@@ -16,18 +19,21 @@
<argument index="0" name="translation" type="Translation">
</argument>
<description>
+ Adds a [Translation] resource.
</description>
</method>
<method name="clear">
<return type="void">
</return>
<description>
+ Clears the server from all translations.
</description>
</method>
<method name="get_locale" qualifiers="const">
<return type="String">
</return>
<description>
+ Returns the current locale of the game.
</description>
</method>
<method name="get_locale_name" qualifiers="const">
@@ -36,6 +42,7 @@
<argument index="0" name="locale" type="String">
</argument>
<description>
+ Returns a locale's language and its variant (e.g. "en_US" would return "English (United States)").
</description>
</method>
<method name="remove_translation">
@@ -44,6 +51,7 @@
<argument index="0" name="translation" type="Translation">
</argument>
<description>
+ Removes the given translation from the server.
</description>
</method>
<method name="set_locale">
@@ -52,6 +60,7 @@
<argument index="0" name="locale" type="String">
</argument>
<description>
+ Sets the locale of the game.
</description>
</method>
<method name="translate" qualifiers="const">
@@ -60,6 +69,7 @@
<argument index="0" name="message" type="String">
</argument>
<description>
+ Returns the current locale's translation for the given message (key).
</description>
</method>
</methods>
diff --git a/doc/classes/Tree.xml b/doc/classes/Tree.xml
index 8051062fc4..d4a11247dc 100644
--- a/doc/classes/Tree.xml
+++ b/doc/classes/Tree.xml
@@ -184,7 +184,7 @@
<argument index="1" name="expand" type="bool">
</argument>
<description>
- If [code]true[/code] the column will have the "Expand" flag of [Control].
+ If [code]true[/code], the column will have the "Expand" flag of [Control].
</description>
</method>
<method name="set_column_min_width">
@@ -215,16 +215,16 @@
<argument index="0" name="visible" type="bool">
</argument>
<description>
- If [code]true[/code] column titles are visible.
+ If [code]true[/code], column titles are visible.
</description>
</method>
</methods>
<members>
<member name="allow_reselect" type="bool" setter="set_allow_reselect" getter="get_allow_reselect">
- If [code]true[/code] the currently selected cell may be selected again.
+ If [code]true[/code], the currently selected cell may be selected again.
</member>
<member name="allow_rmb_select" type="bool" setter="set_allow_rmb_select" getter="get_allow_rmb_select">
- If [code]true[/code] a right mouse button click can select items.
+ If [code]true[/code], a right mouse button click can select items.
</member>
<member name="columns" type="int" setter="set_columns" getter="get_columns">
The amount of columns.
@@ -233,10 +233,10 @@
The drop mode as an OR combination of flags. See [code]DROP_MODE_*[/code] constants. Once dropping is done, reverts to [code]DROP_MODE_DISABLED[/code]. Setting this during [method Control.can_drop_data] is recommended.
</member>
<member name="hide_folding" type="bool" setter="set_hide_folding" getter="is_folding_hidden">
- If [code]true[/code] the folding arrow is hidden.
+ If [code]true[/code], the folding arrow is hidden.
</member>
<member name="hide_root" type="bool" setter="set_hide_root" getter="is_root_hidden">
- If [code]true[/code] the tree's root is hidden.
+ If [code]true[/code], the tree's root is hidden.
</member>
<member name="select_mode" type="int" setter="set_select_mode" getter="get_select_mode" enum="Tree.SelectMode">
Allow single or multiple selection. See the [code]SELECT_*[/code] constants.
@@ -315,12 +315,12 @@
<argument index="0" name="position" type="Vector2">
</argument>
<description>
- Emitted when an item is selected with right mouse button.
+ Emitted when an item is selected with the right mouse button.
</description>
</signal>
<signal name="item_selected">
<description>
- Emitted when an item is selected with right mouse button.
+ Emitted when an item is selected.
</description>
</signal>
<signal name="multi_selected">
@@ -384,6 +384,8 @@
</theme_item>
<theme_item name="custom_button_pressed" type="StyleBox">
</theme_item>
+ <theme_item name="draw_guides" type="int">
+ </theme_item>
<theme_item name="draw_relationship_lines" type="int">
</theme_item>
<theme_item name="drop_position_color" type="Color">
diff --git a/doc/classes/TreeItem.xml b/doc/classes/TreeItem.xml
index b4227b34be..209e5a8bd0 100644
--- a/doc/classes/TreeItem.xml
+++ b/doc/classes/TreeItem.xml
@@ -352,7 +352,7 @@
<argument index="1" name="checked" type="bool">
</argument>
<description>
- If [code]true[/code] the column [code]column[/code] is checked.
+ If [code]true[/code], the column [code]column[/code] is checked.
</description>
</method>
<method name="set_custom_as_button">
@@ -411,7 +411,7 @@
<argument index="1" name="enabled" type="bool">
</argument>
<description>
- If [code]true[/code] column [code]column[/code] is editable.
+ If [code]true[/code], column [code]column[/code] is editable.
</description>
</method>
<method name="set_expand_right">
@@ -422,7 +422,7 @@
<argument index="1" name="enable" type="bool">
</argument>
<description>
- If [code]true[/code] column [code]column[/code] is expanded to the right.
+ If [code]true[/code], column [code]column[/code] is expanded to the right.
</description>
</method>
<method name="set_icon">
@@ -502,7 +502,7 @@
<argument index="1" name="selectable" type="bool">
</argument>
<description>
- If [code]true[/code] the given column is selectable.
+ If [code]true[/code], the given column is selectable.
</description>
</method>
<method name="set_text">
@@ -540,13 +540,13 @@
</methods>
<members>
<member name="collapsed" type="bool" setter="set_collapsed" getter="is_collapsed">
- If [code]true[/code] the TreeItem is collapsed.
+ If [code]true[/code], the TreeItem is collapsed.
</member>
<member name="custom_minimum_height" type="int" setter="set_custom_minimum_height" getter="get_custom_minimum_height">
The custom minimum height.
</member>
<member name="disable_folding" type="bool" setter="set_disable_folding" getter="is_folding_disabled">
- If [code]true[/code] folding is disabled for this TreeItem.
+ If [code]true[/code], folding is disabled for this TreeItem.
</member>
</members>
<constants>
diff --git a/doc/classes/Tween.xml b/doc/classes/Tween.xml
index e792835605..c3af586b21 100644
--- a/doc/classes/Tween.xml
+++ b/doc/classes/Tween.xml
@@ -340,13 +340,13 @@
</methods>
<members>
<member name="playback_process_mode" type="int" setter="set_tween_process_mode" getter="get_tween_process_mode" enum="Tween.TweenProcessMode">
- The tween's animation process thread. See [enum TweenProcessMode]. Default value: [enum TWEEN_PROCESS_IDLE].
+ The tween's animation process thread. See [enum TweenProcessMode]. Default value: [constant TWEEN_PROCESS_IDLE].
</member>
<member name="playback_speed" type="float" setter="set_speed_scale" getter="get_speed_scale">
The tween's speed multiplier. For example, set it to [code]1.0[/code] for normal speed, [code]2.0[/code] for two times normal speed, or [code]0.5[/code] for half of the normal speed. A value of [code]0[/code] pauses the animation, but see also [method set_active] or [method stop_all] for this.
</member>
<member name="repeat" type="bool" setter="set_repeat" getter="is_repeat">
- If [code]true[/code] the tween loops.
+ If [code]true[/code], the tween loops.
</member>
</members>
<signals>
diff --git a/doc/classes/UndoRedo.xml b/doc/classes/UndoRedo.xml
index 0ea5c6e005..93806ac326 100644
--- a/doc/classes/UndoRedo.xml
+++ b/doc/classes/UndoRedo.xml
@@ -102,8 +102,11 @@
<method name="clear_history">
<return type="void">
</return>
+ <argument index="0" name="increase_version" type="bool" default="true">
+ </argument>
<description>
Clear the undo/redo history and associated references.
+ Passing [code]false[/code] to [code]increase_version[/code] will prevent the version number to be increased from this.
</description>
</method>
<method name="commit_action">
diff --git a/doc/classes/Vector2.xml b/doc/classes/Vector2.xml
index 006a843c32..1770dec80d 100644
--- a/doc/classes/Vector2.xml
+++ b/doc/classes/Vector2.xml
@@ -164,7 +164,7 @@
<return type="float">
</return>
<description>
- Returns the vector's length squared. Prefer this function over [member length] if you need to sort vectors or need the squared length for some formula.
+ Returns the vector's length squared. Prefer this method over [method length] if you need to sort vectors or need the squared length for some formula.
</description>
</method>
<method name="linear_interpolate">
diff --git a/doc/classes/VehicleBody.xml b/doc/classes/VehicleBody.xml
index 3ce0cadde9..53a47ec7d6 100644
--- a/doc/classes/VehicleBody.xml
+++ b/doc/classes/VehicleBody.xml
@@ -18,11 +18,11 @@
Slows down the vehicle by applying a braking force. The vehicle is only slowed down if the wheels are in contact with a surface. The force you need to apply to adequately slow down your vehicle depends on the [member RigidBody.mass] of the vehicle. For a vehicle with a mass set to 1000, try a value in the 25 - 30 range for hard braking.
</member>
<member name="engine_force" type="float" setter="set_engine_force" getter="get_engine_force">
- Accelerates the vehicle by applying an engine force. The vehicle is only speed up if the wheels that have [member VehicleWheel.set_use_as_traction] set to true and are in contact with a surface. The [member RigidBody.mass] of the vehicle has an effect on the acceleration of the vehicle. For a vehicle with a mass set to 1000, try a value in the 25 - 50 range for acceleration. Note that the simulation does not take the effect of gears into account, you will need to add logic for this if you wish to simulate gears.
+ Accelerates the vehicle by applying an engine force. The vehicle is only speed up if the wheels that have [member VehicleWheel.use_as_traction] set to true and are in contact with a surface. The [member RigidBody.mass] of the vehicle has an effect on the acceleration of the vehicle. For a vehicle with a mass set to 1000, try a value in the 25 - 50 range for acceleration. Note that the simulation does not take the effect of gears into account, you will need to add logic for this if you wish to simulate gears.
A negative value will result in the vehicle reversing.
</member>
<member name="steering" type="float" setter="set_steering" getter="get_steering">
- The steering angle for the vehicle. Setting this to a non-zero value will result in the vehicle turning when it's moving. Wheels that have [member VehicleWheel.set_use_as_steering] set to true will automatically be rotated.
+ The steering angle for the vehicle. Setting this to a non-zero value will result in the vehicle turning when it's moving. Wheels that have [member VehicleWheel.use_as_steering] set to true will automatically be rotated.
</member>
</members>
<constants>
diff --git a/doc/classes/VideoPlayer.xml b/doc/classes/VideoPlayer.xml
index 9ffa3aa52b..c4c129b0f6 100644
--- a/doc/classes/VideoPlayer.xml
+++ b/doc/classes/VideoPlayer.xml
@@ -52,7 +52,7 @@
The embedded audio track to play.
</member>
<member name="autoplay" type="bool" setter="set_autoplay" getter="has_autoplay">
- If [code]true[/code] playback starts when the scene loads. Default value: [code]false[/code].
+ If [code]true[/code], playback starts when the scene loads. Default value: [code]false[/code].
</member>
<member name="buffering_msec" type="int" setter="set_buffering_msec" getter="get_buffering_msec">
Amount of time in milliseconds to store in buffer while playing.
@@ -61,10 +61,10 @@
Audio bus to use for sound playback.
</member>
<member name="expand" type="bool" setter="set_expand" getter="has_expand">
- If [code]true[/code] the video scales to the control size. Default value: [code]true[/code].
+ If [code]true[/code], the video scales to the control size. Default value: [code]true[/code].
</member>
<member name="paused" type="bool" setter="set_paused" getter="is_paused">
- If [code]true[/code] the video is paused.
+ If [code]true[/code], the video is paused.
</member>
<member name="stream" type="VideoStream" setter="set_stream" getter="get_stream">
</member>
diff --git a/doc/classes/Viewport.xml b/doc/classes/Viewport.xml
index 2cdd8c407f..880dc43c90 100644
--- a/doc/classes/Viewport.xml
+++ b/doc/classes/Viewport.xml
@@ -125,6 +125,12 @@
<description>
</description>
</method>
+ <method name="is_input_handled" qualifiers="const">
+ <return type="bool">
+ </return>
+ <description>
+ </description>
+ </method>
<method name="is_size_override_enabled" qualifiers="const">
<return type="bool">
</return>
@@ -147,6 +153,12 @@
<description>
</description>
</method>
+ <method name="set_input_as_handled">
+ <return type="void">
+ </return>
+ <description>
+ </description>
+ </method>
<method name="set_size_override">
<return type="void">
</return>
@@ -166,7 +178,7 @@
<argument index="0" name="enabled" type="bool">
</argument>
<description>
- If [code]true[/code] the size override affects stretch as well.
+ If [code]true[/code], the size override affects stretch as well.
</description>
</method>
<method name="unhandled_input">
@@ -196,13 +208,13 @@
</methods>
<members>
<member name="arvr" type="bool" setter="set_use_arvr" getter="use_arvr">
- If [code]true[/code] the viewport will be used in AR/VR process. Default value: [code]false[/code].
+ If [code]true[/code], the viewport will be used in AR/VR process. Default value: [code]false[/code].
</member>
<member name="audio_listener_enable_2d" type="bool" setter="set_as_audio_listener_2d" getter="is_audio_listener_2d">
- If [code]true[/code] the viewport will process 2D audio streams. Default value: [code]false[/code].
+ If [code]true[/code], the viewport will process 2D audio streams. Default value: [code]false[/code].
</member>
<member name="audio_listener_enable_3d" type="bool" setter="set_as_audio_listener" getter="is_audio_listener">
- If [code]true[/code] the viewport will process 3D audio streams. Default value: [code]false[/code].
+ If [code]true[/code], the viewport will process 3D audio streams. Default value: [code]false[/code].
</member>
<member name="canvas_transform" type="Transform2D" setter="set_canvas_transform" getter="get_canvas_transform">
The canvas transform of the viewport, useful for changing the on-screen positions of all child [CanvasItem]s. This is relative to the global canvas transform of the viewport.
@@ -211,31 +223,33 @@
The overlay mode for test rendered geometry in debug purposes. Default value: [code]DEBUG_DRAW_DISABLED[/code].
</member>
<member name="disable_3d" type="bool" setter="set_disable_3d" getter="is_3d_disabled">
- If [code]true[/code] the viewport will disable 3D rendering. For actual disabling use [code]usage[/code]. Default value: [code]false[/code].
+ If [code]true[/code], the viewport will disable 3D rendering. For actual disabling use [code]usage[/code]. Default value: [code]false[/code].
</member>
<member name="global_canvas_transform" type="Transform2D" setter="set_global_canvas_transform" getter="get_global_canvas_transform">
The global canvas transform of the viewport. The canvas transform is relative to this.
</member>
<member name="gui_disable_input" type="bool" setter="set_disable_input" getter="is_input_disabled">
- If [code]true[/code] the viewport will not receive input event. Default value: [code]false[/code].
+ If [code]true[/code], the viewport will not receive input event. Default value: [code]false[/code].
</member>
<member name="gui_snap_controls_to_pixels" type="bool" setter="set_snap_controls_to_pixels" getter="is_snap_controls_to_pixels_enabled">
- If [code]true[/code] the GUI controls on the viewport will lay pixel perfectly. Default value: [code]true[/code].
+ If [code]true[/code], the GUI controls on the viewport will lay pixel perfectly. Default value: [code]true[/code].
+ </member>
+ <member name="handle_input_locally" type="bool" setter="set_handle_input_locally" getter="is_handling_input_locally">
</member>
<member name="hdr" type="bool" setter="set_hdr" getter="get_hdr">
- If [code]true[/code] the viewport rendering will receive benefits from High Dynamic Range algorithm. Default value: [code]true[/code].
+ If [code]true[/code], the viewport rendering will receive benefits from High Dynamic Range algorithm. Default value: [code]true[/code].
</member>
<member name="keep_3d_linear" type="bool" setter="set_keep_3d_linear" getter="get_keep_3d_linear">
- If [code]true[/code] the result after 3D rendering will not have a linear to sRGB color conversion applied. This is important when the viewport is used as a render target where the result is used as a texture on a 3D object rendered in another viewport. It is also important if the viewport is used to create data that is not color based (noise, heightmaps, pickmaps, etc.). Do not enable this when the viewport is used as a texture on a 2D object or if the viewport is your final output.
+ If [code]true[/code], the result after 3D rendering will not have a linear to sRGB color conversion applied. This is important when the viewport is used as a render target where the result is used as a texture on a 3D object rendered in another viewport. It is also important if the viewport is used to create data that is not color based (noise, heightmaps, pickmaps, etc.). Do not enable this when the viewport is used as a texture on a 2D object or if the viewport is your final output.
</member>
<member name="msaa" type="int" setter="set_msaa" getter="get_msaa" enum="Viewport.MSAA">
The multisample anti-aliasing mode. Default value: [code]MSAA_DISABLED[/code].
</member>
<member name="own_world" type="bool" setter="set_use_own_world" getter="is_using_own_world">
- If [code]true[/code] the viewport will use [World] defined in [code]world[/code] property. Default value: [code]false[/code].
+ If [code]true[/code], the viewport will use [World] defined in [code]world[/code] property. Default value: [code]false[/code].
</member>
<member name="physics_object_picking" type="bool" setter="set_physics_object_picking" getter="get_physics_object_picking">
- If [code]true[/code] the objects rendered by viewport become subjects of mouse picking process. Default value: [code]false[/code].
+ If [code]true[/code], the objects rendered by viewport become subjects of mouse picking process. Default value: [code]false[/code].
</member>
<member name="render_target_clear_mode" type="int" setter="set_clear_mode" getter="get_clear_mode" enum="Viewport.ClearMode">
The clear mode when viewport used as a render target. Default value: [code]CLEAR_MODE_ALWAYS[/code].
@@ -244,7 +258,7 @@
The update mode when viewport used as a render target. Default value: [code]UPDATE_WHEN_VISIBLE[/code].
</member>
<member name="render_target_v_flip" type="bool" setter="set_vflip" getter="get_vflip">
- If [code]true[/code] the result of rendering will be flipped vertically. Default value: [code]false[/code].
+ If [code]true[/code], the result of rendering will be flipped vertically. Default value: [code]false[/code].
</member>
<member name="shadow_atlas_quad_0" type="int" setter="set_shadow_atlas_quadrant_subdiv" getter="get_shadow_atlas_quadrant_subdiv" enum="Viewport.ShadowAtlasQuadrantSubdiv">
The subdivision amount of first quadrant on shadow atlas. Default value: [code]SHADOW_ATLAS_QUADRANT_SUBDIV_4[/code].
@@ -265,7 +279,7 @@
The width and height of viewport.
</member>
<member name="transparent_bg" type="bool" setter="set_transparent_background" getter="has_transparent_background">
- If [code]true[/code] the viewport should render its background as transparent. Default value: [code]false[/code].
+ If [code]true[/code], the viewport should render its background as transparent. Default value: [code]false[/code].
</member>
<member name="usage" type="int" setter="set_usage" getter="get_usage" enum="Viewport.Usage">
The rendering mode of viewport. Default value: [code]USAGE_3D[/code].
diff --git a/doc/classes/ViewportContainer.xml b/doc/classes/ViewportContainer.xml
index dde429440d..e022b8fa90 100644
--- a/doc/classes/ViewportContainer.xml
+++ b/doc/classes/ViewportContainer.xml
@@ -14,7 +14,7 @@
</methods>
<members>
<member name="stretch" type="bool" setter="set_stretch" getter="is_stretch_enabled">
- If [code]true[/code] the viewport will be scaled to the control's size. Default value:[code]false[/code].
+ If [code]true[/code], the viewport will be scaled to the control's size. Default value:[code]false[/code].
</member>
<member name="stretch_shrink" type="int" setter="set_stretch_shrink" getter="get_stretch_shrink">
</member>
diff --git a/doc/classes/VisibilityEnabler.xml b/doc/classes/VisibilityEnabler.xml
index 5f0a4ef0f4..fc6ceac5de 100644
--- a/doc/classes/VisibilityEnabler.xml
+++ b/doc/classes/VisibilityEnabler.xml
@@ -14,10 +14,10 @@
</methods>
<members>
<member name="freeze_bodies" type="bool" setter="set_enabler" getter="is_enabler_enabled">
- If [code]true[/code] [RigidBody] nodes will be paused.
+ If [code]true[/code], [RigidBody] nodes will be paused.
</member>
<member name="pause_animations" type="bool" setter="set_enabler" getter="is_enabler_enabled">
- If [code]true[/code] [AnimationPlayer] nodes will be paused.
+ If [code]true[/code], [AnimationPlayer] nodes will be paused.
</member>
</members>
<constants>
diff --git a/doc/classes/VisibilityEnabler2D.xml b/doc/classes/VisibilityEnabler2D.xml
index eab9bd1991..8d393fc138 100644
--- a/doc/classes/VisibilityEnabler2D.xml
+++ b/doc/classes/VisibilityEnabler2D.xml
@@ -14,22 +14,22 @@
</methods>
<members>
<member name="freeze_bodies" type="bool" setter="set_enabler" getter="is_enabler_enabled">
- If [code]true[/code] [RigidBody2D] nodes will be paused.
+ If [code]true[/code], [RigidBody2D] nodes will be paused.
</member>
<member name="pause_animated_sprites" type="bool" setter="set_enabler" getter="is_enabler_enabled">
- If [code]true[/code] [AnimatedSprite] nodes will be paused.
+ If [code]true[/code], [AnimatedSprite] nodes will be paused.
</member>
<member name="pause_animations" type="bool" setter="set_enabler" getter="is_enabler_enabled">
- If [code]true[/code] [AnimationPlayer] nodes will be paused.
+ If [code]true[/code], [AnimationPlayer] nodes will be paused.
</member>
<member name="pause_particles" type="bool" setter="set_enabler" getter="is_enabler_enabled">
- If [code]true[/code] [Particles2D] nodes will be paused.
+ If [code]true[/code], [Particles2D] nodes will be paused.
</member>
<member name="physics_process_parent" type="bool" setter="set_enabler" getter="is_enabler_enabled">
- If [code]true[/code] the parent's [method Node._physics_process] will be stopped.
+ If [code]true[/code], the parent's [method Node._physics_process] will be stopped.
</member>
<member name="process_parent" type="bool" setter="set_enabler" getter="is_enabler_enabled">
- If [code]true[/code] the parent's [method Node._process] will be stopped.
+ If [code]true[/code], the parent's [method Node._process] will be stopped.
</member>
</members>
<constants>
diff --git a/doc/classes/VisibilityNotifier.xml b/doc/classes/VisibilityNotifier.xml
index 95da708420..16329d1d0d 100644
--- a/doc/classes/VisibilityNotifier.xml
+++ b/doc/classes/VisibilityNotifier.xml
@@ -15,7 +15,7 @@
<return type="bool">
</return>
<description>
- If [code]true[/code] the bounding box is on the screen.
+ If [code]true[/code], the bounding box is on the screen.
</description>
</method>
</methods>
diff --git a/doc/classes/VisibilityNotifier2D.xml b/doc/classes/VisibilityNotifier2D.xml
index aaaa9b63bb..c60591cce6 100644
--- a/doc/classes/VisibilityNotifier2D.xml
+++ b/doc/classes/VisibilityNotifier2D.xml
@@ -15,7 +15,7 @@
<return type="bool">
</return>
<description>
- If [code]true[/code] the bounding rectangle is on the screen.
+ If [code]true[/code], the bounding rectangle is on the screen.
</description>
</method>
</methods>
diff --git a/doc/classes/VisualServer.xml b/doc/classes/VisualServer.xml
index 46a06d63d4..26a6bae48c 100644
--- a/doc/classes/VisualServer.xml
+++ b/doc/classes/VisualServer.xml
@@ -1113,11 +1113,13 @@
</argument>
<argument index="2" name="depth_begin" type="float">
</argument>
- <argument index="3" name="depth_curve" type="float">
+ <argument index="3" name="depth_end" type="float">
</argument>
- <argument index="4" name="transmit" type="bool">
+ <argument index="4" name="depth_curve" type="float">
</argument>
- <argument index="5" name="transmit_curve" type="float">
+ <argument index="5" name="transmit" type="bool">
+ </argument>
+ <argument index="6" name="transmit_curve" type="float">
</argument>
<description>
</description>
@@ -1159,7 +1161,9 @@
</argument>
<argument index="8" name="hdr_bleed_scale" type="float">
</argument>
- <argument index="9" name="bicubic_upscale" type="bool">
+ <argument index="9" name="hdr_luminance_cap" type="float">
+ </argument>
+ <argument index="10" name="bicubic_upscale" type="bool">
</argument>
<description>
</description>
@@ -1184,6 +1188,16 @@
<description>
</description>
</method>
+ <method name="environment_set_sky_orientation">
+ <return type="void">
+ </return>
+ <argument index="0" name="env" type="RID">
+ </argument>
+ <argument index="1" name="orientation" type="Basis">
+ </argument>
+ <description>
+ </description>
+ </method>
<method name="environment_set_ssao">
<return type="void">
</return>
@@ -3099,7 +3113,7 @@
</return>
<argument index="0" name="scenario" type="RID">
</argument>
- <argument index="1" name="p_size" type="int">
+ <argument index="1" name="size" type="int">
</argument>
<argument index="2" name="subdiv" type="int">
</argument>
@@ -3490,7 +3504,7 @@
<argument index="0" name="shrink" type="bool">
</argument>
<description>
- If [code]true[/code] sets internal processes to shrink all image data to half the size.
+ If [code]true[/code], sets internal processes to shrink all image data to half the size.
</description>
</method>
<method name="texture_set_size_override">
@@ -3513,7 +3527,7 @@
<argument index="0" name="enable" type="bool">
</argument>
<description>
- If [code]true[/code] the image will be stored in the texture's images array if overwritten.
+ If [code]true[/code], the image will be stored in the texture's images array if overwritten.
</description>
</method>
<method name="viewport_attach_camera">
@@ -3606,7 +3620,7 @@
<argument index="1" name="active" type="bool">
</argument>
<description>
- If [code]true[/code] sets the viewport active, else sets it inactive.
+ If [code]true[/code], sets the viewport active, else sets it inactive.
</description>
</method>
<method name="viewport_set_canvas_stacking">
@@ -3646,7 +3660,7 @@
<argument index="1" name="clear_mode" type="int" enum="VisualServer.ViewportClearMode">
</argument>
<description>
- Sets the clear mode of a viewport. See VIEWPORT_CLEAR_MODE_* constants for options.
+ Sets the clear mode of a viewport. See [enum VisualServer.ViewportClearMode] for options.
</description>
</method>
<method name="viewport_set_debug_draw">
@@ -3657,7 +3671,7 @@
<argument index="1" name="draw" type="int" enum="VisualServer.ViewportDebugDraw">
</argument>
<description>
- Sets the debug draw mode of a viewport. See VIEWPORT_DEBUG_DRAW_* constants for options.
+ Sets the debug draw mode of a viewport. See [enum VisualServer.ViewportDebugDraw] for options.
</description>
</method>
<method name="viewport_set_disable_3d">
@@ -3668,7 +3682,7 @@
<argument index="1" name="disabled" type="bool">
</argument>
<description>
- If [code]true[/code] a viewport's 3D rendering is disabled.
+ If [code]true[/code], a viewport's 3D rendering is disabled.
</description>
</method>
<method name="viewport_set_disable_environment">
@@ -3679,7 +3693,7 @@
<argument index="1" name="disabled" type="bool">
</argument>
<description>
- If [code]true[/code] rendering of a viewport's environment is disabled.
+ If [code]true[/code], rendering of a viewport's environment is disabled.
</description>
</method>
<method name="viewport_set_global_canvas_transform">
@@ -3701,7 +3715,7 @@
<argument index="1" name="enabled" type="bool">
</argument>
<description>
- If [code]true[/code] the viewport renders to hdr.
+ If [code]true[/code], the viewport renders to hdr.
</description>
</method>
<method name="viewport_set_hide_canvas">
@@ -3712,7 +3726,7 @@
<argument index="1" name="hidden" type="bool">
</argument>
<description>
- If [code]true[/code] the viewport's canvas is not rendered.
+ If [code]true[/code], the viewport's canvas is not rendered.
</description>
</method>
<method name="viewport_set_hide_scenario">
@@ -3804,7 +3818,7 @@
<argument index="1" name="enabled" type="bool">
</argument>
<description>
- If [code]true[/code] the viewport renders its background as transparent.
+ If [code]true[/code], the viewport renders its background as transparent.
</description>
</method>
<method name="viewport_set_update_mode">
@@ -3837,7 +3851,7 @@
<argument index="1" name="use_arvr" type="bool">
</argument>
<description>
- If [code]true[/code] the viewport uses augmented or virtual reality technologies. See [ARVRInterface].
+ If [code]true[/code], the viewport uses augmented or virtual reality technologies. See [ARVRInterface].
</description>
</method>
<method name="viewport_set_vflip">
@@ -3848,7 +3862,7 @@
<argument index="1" name="enabled" type="bool">
</argument>
<description>
- If [code]true[/code] the viewport's rendering is flipped vertically.
+ If [code]true[/code], the viewport's rendering is flipped vertically.
</description>
</method>
</methods>
@@ -4146,7 +4160,7 @@
The viewport is never cleared before drawing.
</constant>
<constant name="VIEWPORT_CLEAR_ONLY_NEXT_FRAME" value="2" enum="ViewportClearMode">
- The viewport is cleared once, then the clear mode is set to [VIEWPORT_CLEAR_NEVER].
+ The viewport is cleared once, then the clear mode is set to [code]VIEWPORT_CLEAR_NEVER[/code].
</constant>
<constant name="VIEWPORT_MSAA_DISABLED" value="0" enum="ViewportMSAA">
Multisample antialiasing is disabled.
@@ -4339,6 +4353,12 @@
</constant>
<constant name="MULTIMESH_COLOR_FLOAT" value="2" enum="MultimeshColorFormat">
</constant>
+ <constant name="MULTIMESH_CUSTOM_DATA_NONE" value="0" enum="MultimeshCustomDataFormat">
+ </constant>
+ <constant name="MULTIMESH_CUSTOM_DATA_8BIT" value="1" enum="MultimeshCustomDataFormat">
+ </constant>
+ <constant name="MULTIMESH_CUSTOM_DATA_FLOAT" value="2" enum="MultimeshCustomDataFormat">
+ </constant>
<constant name="REFLECTION_PROBE_UPDATE_ONCE" value="0" enum="ReflectionProbeUpdateMode">
</constant>
<constant name="REFLECTION_PROBE_UPDATE_ALWAYS" value="1" enum="ReflectionProbeUpdateMode">
diff --git a/doc/classes/WindowDialog.xml b/doc/classes/WindowDialog.xml
index f7f2d10fcd..51931444fc 100644
--- a/doc/classes/WindowDialog.xml
+++ b/doc/classes/WindowDialog.xml
@@ -21,7 +21,7 @@
</methods>
<members>
<member name="resizable" type="bool" setter="set_resizable" getter="get_resizable">
- If [code]true[/code] the user can resize the window. Default value: [code]false[/code].
+ If [code]true[/code], the user can resize the window. Default value: [code]false[/code].
</member>
<member name="window_title" type="String" setter="set_title" getter="get_title">
The text displayed in the window's title bar.
diff --git a/doc/classes/WorldEnvironment.xml b/doc/classes/WorldEnvironment.xml
index 45e1af4e42..8c212502d6 100644
--- a/doc/classes/WorldEnvironment.xml
+++ b/doc/classes/WorldEnvironment.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="WorldEnvironment" inherits="Node" category="Core" version="3.1">
<brief_description>
- Default environment properties for the entire scene (post-processing effects, lightning and background settings).
+ Default environment properties for the entire scene (post-processing effects, lighting and background settings).
</brief_description>
<description>
The [code]WorldEnvironment[/code] node is used to configure the default [Environment] for the scene.
diff --git a/doc/classes/YSort.xml b/doc/classes/YSort.xml
index 45ae8645b1..e9233ff079 100644
--- a/doc/classes/YSort.xml
+++ b/doc/classes/YSort.xml
@@ -14,7 +14,7 @@
</methods>
<members>
<member name="sort_enabled" type="bool" setter="set_sort_enabled" getter="is_sort_enabled">
- If [code]true[/code] child nodes are sorted, otherwise sorting is disabled. Default: [code]true[/code].
+ If [code]true[/code], child nodes are sorted, otherwise sorting is disabled. Default: [code]true[/code].
</member>
</members>
<constants>
diff --git a/doc/classes/float.xml b/doc/classes/float.xml
index 0c5536b5fe..7297f5bf94 100644
--- a/doc/classes/float.xml
+++ b/doc/classes/float.xml
@@ -17,7 +17,7 @@
<argument index="0" name="from" type="bool">
</argument>
<description>
- Cast a [bool] value to a floating point value, [code]float(true)[/code] will be equals to 1.0 and [code]float(false)[/code] will be equals to 0.0.
+ Cast a [bool] value to a floating point value, [code]float(true)[/code] will be equal to 1.0 and [code]float(false)[/code] will be equal to 0.0.
</description>
</method>
<method name="float">
@@ -26,7 +26,7 @@
<argument index="0" name="from" type="int">
</argument>
<description>
- Cast an [int] value to a floating point value, [code]float(1)[/code] will be equals to 1.0.
+ Cast an [int] value to a floating point value, [code]float(1)[/code] will be equal to 1.0.
</description>
</method>
<method name="float">
@@ -35,7 +35,7 @@
<argument index="0" name="from" type="String">
</argument>
<description>
- Cast a [String] value to a floating point value. This method accepts float value strings like [code] '1.23' [/code] and exponential notation strings for its parameter so calling [code] float('1e3') [/code] will return 1000.0 and calling [code] float('1e-3') [/code] will return 0.001.
+ Cast a [String] value to a floating point value. This method accepts float value strings like [code]"1.23"[/code] and exponential notation strings for its parameter so calling [code]float("1e3")[/code] will return 1000.0 and calling [code]float("1e-3")[/code] will return 0.001.
</description>
</method>
</methods>
diff --git a/doc/tools/makerst.py b/doc/tools/makerst.py
index 7b7cc52547..22c0b5d1fd 100755
--- a/doc/tools/makerst.py
+++ b/doc/tools/makerst.py
@@ -1,73 +1,563 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
+#!/usr/bin/env python3
-import codecs
+import argparse
import sys
import os
import re
import xml.etree.ElementTree as ET
+from collections import defaultdict, OrderedDict
-input_list = []
-cur_file = ""
+# Uncomment to do type checks. I have it commented out so it works below Python 3.5
+#from typing import List, Dict, TextIO, Tuple, Iterable, Optional, DefaultDict, Any, Union
# http(s)://docs.godotengine.org/<langcode>/<tag>/path/to/page.html(#fragment-tag)
-godot_docs_pattern = re.compile('^http(?:s)?:\/\/docs\.godotengine\.org\/(?:[a-zA-Z0-9\.\-_]*)\/(?:[a-zA-Z0-9\.\-_]*)\/(.*)\.html(#.*)?$')
+GODOT_DOCS_PATTERN = re.compile(r'^http(?:s)?://docs\.godotengine\.org/(?:[a-zA-Z0-9.\-_]*)/(?:[a-zA-Z0-9.\-_]*)/(.*)\.html(#.*)?$')
-for arg in sys.argv[1:]:
- if arg.endswith(os.sep):
- arg = arg[:-1]
- input_list.append(arg)
-if len(input_list) < 1:
- print('usage: makerst.py <path to folders> and/or <path to .xml files> (order of arguments irrelevant)')
- print('example: makerst.py "../../modules/" "../classes" path_to/some_class.xml')
- sys.exit(0)
+def print_error(error, state): # type: (str, State) -> None
+ print(error)
+ state.errored = True
-def validate_tag(elem, tag):
- if elem.tag != tag:
- print("Tag mismatch, expected '" + tag + "', got " + elem.tag)
- sys.exit(255)
+class TypeName:
+ def __init__(self, type_name, enum=None): # type: (str, Optional[str]) -> None
+ self.type_name = type_name
+ self.enum = enum
+ def to_rst(self, state): # type: ("State") -> str
+ if self.enum is not None:
+ return make_enum(self.enum, state)
+ elif self.type_name == "void":
+ return "void"
+ else:
+ return make_type(self.type_name, state)
+
+ @classmethod
+ def from_element(cls, element): # type: (ET.Element) -> "TypeName"
+ return cls(element.attrib["type"], element.get("enum"))
+
+
+class PropertyDef:
+ def __init__(self, name, type_name, setter, getter, text): # type: (str, TypeName, Optional[str], Optional[str], Optional[str]) -> None
+ self.name = name
+ self.type_name = type_name
+ self.setter = setter
+ self.getter = getter
+ self.text = text
+
+class ParameterDef:
+ def __init__(self, name, type_name, default_value): # type: (str, TypeName, Optional[str]) -> None
+ self.name = name
+ self.type_name = type_name
+ self.default_value = default_value
+
+
+class SignalDef:
+ def __init__(self, name, parameters, description): # type: (str, List[ParameterDef], Optional[str]) -> None
+ self.name = name
+ self.parameters = parameters
+ self.description = description
+
+
+class MethodDef:
+ def __init__(self, name, return_type, parameters, description, qualifiers): # type: (str, TypeName, List[ParameterDef], Optional[str], Optional[str]) -> None
+ self.name = name
+ self.return_type = return_type
+ self.parameters = parameters
+ self.description = description
+ self.qualifiers = qualifiers
+
+
+class ConstantDef:
+ def __init__(self, name, value, text): # type: (str, str, Optional[str]) -> None
+ self.name = name
+ self.value = value
+ self.text = text
+
+
+class EnumDef:
+ def __init__(self, name): # type: (str) -> None
+ self.name = name
+ self.values = OrderedDict() # type: OrderedDict[str, ConstantDef]
+
+
+class ThemeItemDef:
+ def __init__(self, name, type_name): # type: (str, TypeName) -> None
+ self.name = name
+ self.type_name = type_name
+
+
+class ClassDef:
+ def __init__(self, name): # type: (str) -> None
+ self.name = name
+ self.constants = OrderedDict() # type: OrderedDict[str, ConstantDef]
+ self.enums = OrderedDict() # type: OrderedDict[str, EnumDef]
+ self.properties = OrderedDict() # type: OrderedDict[str, PropertyDef]
+ self.methods = OrderedDict() # type: OrderedDict[str, List[MethodDef]]
+ self.signals = OrderedDict() # type: OrderedDict[str, SignalDef]
+ self.inherits = None # type: Optional[str]
+ self.category = None # type: Optional[str]
+ self.brief_description = None # type: Optional[str]
+ self.description = None # type: Optional[str]
+ self.theme_items = None # type: Optional[OrderedDict[str, List[ThemeItemDef]]]
+ self.tutorials = [] # type: List[str]
+
+
+class State:
+ def __init__(self): # type: () -> None
+ # Has any error been reported?
+ self.errored = False
+ self.classes = OrderedDict() # type: OrderedDict[str, ClassDef]
+ self.current_class = "" # type: str
+
+ def parse_class(self, class_root): # type: (ET.Element) -> None
+ class_name = class_root.attrib["name"]
+
+ class_def = ClassDef(class_name)
+ self.classes[class_name] = class_def
+
+ inherits = class_root.get("inherits")
+ if inherits is not None:
+ class_def.inherits = inherits
+
+ category = class_root.get("category")
+ if category is not None:
+ class_def.category = category
+
+ brief_desc = class_root.find("brief_description")
+ if brief_desc is not None and brief_desc.text:
+ class_def.brief_description = brief_desc.text
+
+ desc = class_root.find("description")
+ if desc is not None and desc.text:
+ class_def.description = desc.text
+
+ properties = class_root.find("members")
+ if properties is not None:
+ for property in properties:
+ assert property.tag == "member"
+
+ property_name = property.attrib["name"]
+ if property_name in class_def.properties:
+ print_error("Duplicate property '{}', file: {}".format(property_name, class_name), self)
+ continue
+
+ type_name = TypeName.from_element(property)
+ setter = property.get("setter") or None # Use or None so '' gets turned into None.
+ getter = property.get("getter") or None
+
+ property_def = PropertyDef(property_name, type_name, setter, getter, property.text)
+ class_def.properties[property_name] = property_def
+
+ methods = class_root.find("methods")
+ if methods is not None:
+ for method in methods:
+ assert method.tag == "method"
+
+ method_name = method.attrib["name"]
+ qualifiers = method.get("qualifiers")
+
+ return_element = method.find("return")
+ if return_element is not None:
+ return_type = TypeName.from_element(return_element)
+
+ else:
+ return_type = TypeName("void")
+
+ params = parse_arguments(method)
+
+ desc_element = method.find("description")
+ method_desc = None
+ if desc_element is not None:
+ method_desc = desc_element.text
+
+ method_def = MethodDef(method_name, return_type, params, method_desc, qualifiers)
+ if method_name not in class_def.methods:
+ class_def.methods[method_name] = []
+
+ class_def.methods[method_name].append(method_def)
+
+ constants = class_root.find("constants")
+ if constants is not None:
+ for constant in constants:
+ assert constant.tag == "constant"
+
+ constant_name = constant.attrib["name"]
+ value = constant.attrib["value"]
+ enum = constant.get("enum")
+ constant_def = ConstantDef(constant_name, value, constant.text)
+ if enum is None:
+ if constant_name in class_def.constants:
+ print_error("Duplicate constant '{}', file: {}".format(constant_name, class_name), self)
+ continue
+
+ class_def.constants[constant_name] = constant_def
+
+ else:
+ if enum in class_def.enums:
+ enum_def = class_def.enums[enum]
+
+ else:
+ enum_def = EnumDef(enum)
+ class_def.enums[enum] = enum_def
+
+ enum_def.values[constant_name] = constant_def
+
+ signals = class_root.find("signals")
+ if signals is not None:
+ for signal in signals:
+ assert signal.tag == "signal"
+
+ signal_name = signal.attrib["name"]
+
+ if signal_name in class_def.signals:
+ print_error("Duplicate signal '{}', file: {}".format(signal_name, class_name), self)
+ continue
+
+ params = parse_arguments(signal)
+
+ desc_element = signal.find("description")
+ signal_desc = None
+ if desc_element is not None:
+ signal_desc = desc_element.text
+
+ signal_def = SignalDef(signal_name, params, signal_desc)
+ class_def.signals[signal_name] = signal_def
+
+ theme_items = class_root.find("theme_items")
+ if theme_items is not None:
+ class_def.theme_items = OrderedDict()
+ for theme_item in theme_items:
+ assert theme_item.tag == "theme_item"
+
+ theme_item_name = theme_item.attrib["name"]
+ theme_item_def = ThemeItemDef(theme_item_name, TypeName.from_element(theme_item))
+ if theme_item_name not in class_def.theme_items:
+ class_def.theme_items[theme_item_name] = []
+ class_def.theme_items[theme_item_name].append(theme_item_def)
+
+ tutorials = class_root.find("tutorials")
+ if tutorials is not None:
+ for link in tutorials:
+ assert link.tag == "link"
+
+ if link.text is not None:
+ class_def.tutorials.append(link.text)
+
+
+
+ def sort_classes(self): # type: () -> None
+ self.classes = OrderedDict(sorted(self.classes.items(), key=lambda t: t[0]))
+
+
+def parse_arguments(root): # type: (ET.Element) -> List[ParameterDef]
+ param_elements = root.findall("argument")
+ params = [None] * len(param_elements) # type: Any
+ for param_element in param_elements:
+ param_name = param_element.attrib["name"]
+ index = int(param_element.attrib["index"])
+ type_name = TypeName.from_element(param_element)
+ default = param_element.get("default")
+
+ params[index] = ParameterDef(param_name, type_name, default)
+
+ cast = params # type: List[ParameterDef]
+
+ return cast
+
+
+def main(): # type: () -> None
+ parser = argparse.ArgumentParser()
+ parser.add_argument("path", nargs="+", help="A path to an XML file or a directory containing XML files to parse.")
+ group = parser.add_mutually_exclusive_group()
+ group.add_argument("--output", "-o", default=".", help="The directory to save output .rst files in.")
+ group.add_argument("--dry-run", action="store_true", help="If passed, no output will be generated and XML files are only checked for errors.")
+ args = parser.parse_args()
+
+ file_list = [] # type: List[str]
+
+ for path in args.path:
+ # Cut off trailing slashes so os.path.basename doesn't choke.
+ if path.endswith(os.sep):
+ path = path[:-1]
+
+ if os.path.basename(path) == 'modules':
+ for subdir, dirs, _ in os.walk(path):
+ if 'doc_classes' in dirs:
+ doc_dir = os.path.join(subdir, 'doc_classes')
+ class_file_names = (f for f in os.listdir(doc_dir) if f.endswith('.xml'))
+ file_list += (os.path.join(doc_dir, f) for f in class_file_names)
+
+ elif os.path.isdir(path):
+ file_list += (os.path.join(path, f) for f in os.listdir(path) if f.endswith('.xml'))
+
+ elif os.path.isfile(path):
+ if not path.endswith(".xml"):
+ print("Got non-.xml file '{}' in input, skipping.".format(path))
+ continue
+
+ file_list.append(path)
+
+ classes = {} # type: Dict[str, ET.Element]
+ state = State()
+
+ for cur_file in file_list:
+ try:
+ tree = ET.parse(cur_file)
+ except ET.ParseError as e:
+ print_error("Parse error reading file '{}': {}".format(cur_file, e), state)
+ continue
+ doc = tree.getroot()
+
+ if 'version' not in doc.attrib:
+ print_error("Version missing from 'doc', file: {}".format(cur_file), state)
+ continue
+
+ name = doc.attrib["name"]
+ if name in classes:
+ print_error("Duplicate class '{}'".format(name), state)
+ continue
+
+ classes[name] = doc
+
+ for name, data in classes.items():
+ try:
+ state.parse_class(data)
+ except Exception as e:
+ print_error("Exception while parsing class '{}': {}".format(name, e), state)
+
+ state.sort_classes()
+
+ for class_name, class_def in state.classes.items():
+ state.current_class = class_name
+ make_rst_class(class_def, state, args.dry_run, args.output)
+
+ if state.errored:
+ exit(1)
+
+def make_rst_class(class_def, state, dry_run, output_dir): # type: (ClassDef, State, bool, str) -> None
+ class_name = class_def.name
+
+ if dry_run:
+ f = open(os.devnull, "w")
+ else:
+ f = open(os.path.join(output_dir, "class_" + class_name.lower() + '.rst'), 'w', encoding='utf-8')
+
+ # Warn contributors not to edit this file directly
+ f.write(".. Generated automatically by doc/tools/makerst.py in Godot's source tree.\n")
+ f.write(".. DO NOT EDIT THIS FILE, but the " + class_name + ".xml source instead.\n")
+ f.write(".. The source is found in doc/classes or modules/<name>/doc_classes.\n\n")
+
+ f.write(".. _class_" + class_name + ":\n\n")
+ f.write(make_heading(class_name, '='))
+
+ # Inheritance tree
+ # Ascendants
+ if class_def.inherits:
+ inh = class_def.inherits.strip()
+ f.write('**Inherits:** ')
+ first = True
+ while inh in state.classes:
+ if not first:
+ f.write(" **<** ")
+ else:
+ first = False
+
+ f.write(make_type(inh, state))
+ inode = state.classes[inh].inherits
+ if inode:
+ inh = inode.strip()
+ else:
+ break
+ f.write("\n\n")
+
+ # Descendents
+ inherited = []
+ for c in state.classes.values():
+ if c.inherits and c.inherits.strip() == class_name:
+ inherited.append(c.name)
+
+ if len(inherited):
+ f.write('**Inherited By:** ')
+ for i, child in enumerate(inherited):
+ if i > 0:
+ f.write(", ")
+ f.write(make_type(child, state))
+ f.write("\n\n")
+
+ # Category
+ if class_def.category is not None:
+ f.write('**Category:** ' + class_def.category.strip() + "\n\n")
+
+ # Brief description
+ f.write(make_heading('Brief Description', '-'))
+ if class_def.brief_description is not None:
+ f.write(rstize_text(class_def.brief_description.strip(), state) + "\n\n")
+
+ # Properties overview
+ if len(class_def.properties) > 0:
+ f.write(make_heading('Properties', '-'))
+ ml = [] # type: List[Tuple[str, str]]
+ for property_def in class_def.properties.values():
+ type_rst = property_def.type_name.to_rst(state)
+ ref = ":ref:`{0}<class_{1}_property_{0}>`".format(property_def.name, class_name)
+ ml.append((type_rst, ref))
+ format_table(f, ml)
+
+ # Methods overview
+ if len(class_def.methods) > 0:
+ f.write(make_heading('Methods', '-'))
+ ml = []
+ for method_list in class_def.methods.values():
+ for m in method_list:
+ ml.append(make_method_signature(class_def, m, True, state))
+ format_table(f, ml)
-class_names = []
-classes = {}
+ # Theme properties
+ if class_def.theme_items is not None and len(class_def.theme_items) > 0:
+ f.write(make_heading('Theme Properties', '-'))
+ ml = []
+ for theme_item_list in class_def.theme_items.values():
+ for theme_item in theme_item_list:
+ ml.append((theme_item.type_name.to_rst(state), theme_item.name))
+ format_table(f, ml)
+
+ # Signals
+ if len(class_def.signals) > 0:
+ f.write(make_heading('Signals', '-'))
+ for signal in class_def.signals.values():
+ #f.write(".. _class_{}_{}:\n\n".format(class_name, signal.name))
+ f.write(".. _class_{}_signal_{}:\n\n".format(class_name, signal.name))
+ _, signature = make_method_signature(class_def, signal, False, state)
+ f.write("- {}\n\n".format(signature))
+
+ if signal.description is None or signal.description.strip() == '':
+ continue
+ f.write(rstize_text(signal.description.strip(), state))
+ f.write("\n\n")
+
+ # Enums
+ if len(class_def.enums) > 0:
+ f.write(make_heading('Enumerations', '-'))
+ for e in class_def.enums.values():
+ f.write(".. _enum_{}_{}:\n\n".format(class_name, e.name))
+ # Sphinx seems to divide the bullet list into individual <ul> tags if we weave the labels into it.
+ # As such I'll put them all above the list. Won't be perfect but better than making the list visually broken.
+ # As to why I'm not modifying the reference parser to directly link to the _enum label:
+ # If somebody gets annoyed enough to fix it, all existing references will magically improve.
+ for value in e.values.values():
+ f.write(".. _class_{}_constant_{}:\n\n".format(class_name, value.name))
+
+ f.write("enum **{}**:\n\n".format(e.name))
+ for value in e.values.values():
+ f.write("- **{}** = **{}**".format(value.name, value.value))
+ if value.text is not None and value.text.strip() != '':
+ f.write(' --- ' + rstize_text(value.text.strip(), state))
+ f.write('\n\n')
+
+ # Constants
+ if len(class_def.constants) > 0:
+ f.write(make_heading('Constants', '-'))
+ # Sphinx seems to divide the bullet list into individual <ul> tags if we weave the labels into it.
+ # As such I'll put them all above the list. Won't be perfect but better than making the list visually broken.
+ for constant in class_def.constants.values():
+ f.write(".. _class_{}_constant_{}:\n\n".format(class_name, constant.name))
+
+ for constant in class_def.constants.values():
+ f.write("- **{}** = **{}**".format(constant.name, constant.value))
+ if constant.text is not None and constant.text.strip() != '':
+ f.write(' --- ' + rstize_text(constant.text.strip(), state))
+ f.write('\n\n')
+
+ # Class description
+ if class_def.description is not None and class_def.description.strip() != '':
+ f.write(make_heading('Description', '-'))
+ f.write(rstize_text(class_def.description.strip(), state) + "\n\n")
+
+ # Online tutorials
+ if len(class_def.tutorials) > 0:
+ f.write(make_heading('Tutorials', '-'))
+ for t in class_def.tutorials:
+ link = t.strip()
+ match = GODOT_DOCS_PATTERN.search(link)
+ if match:
+ groups = match.groups()
+ if match.lastindex == 2:
+ # Doc reference with fragment identifier: emit direct link to section with reference to page, for example:
+ # `#calling-javascript-from-script in Exporting For Web`
+ f.write("- `" + groups[1] + " <../" + groups[0] + ".html" + groups[1] + ">`_ in :doc:`../" + groups[0] + "`\n\n")
+ # Commented out alternative: Instead just emit:
+ # `Subsection in Exporting For Web`
+ # f.write("- `Subsection <../" + groups[0] + ".html" + groups[1] + ">`_ in :doc:`../" + groups[0] + "`\n\n")
+ elif match.lastindex == 1:
+ # Doc reference, for example:
+ # `Math`
+ f.write("- :doc:`../" + groups[0] + "`\n\n")
+ else:
+ # External link, for example:
+ # `http://enet.bespin.org/usergroup0.html`
+ f.write("- `" + link + " <" + link + ">`_\n\n")
+ # Property descriptions
+ if len(class_def.properties) > 0:
+ f.write(make_heading('Property Descriptions', '-'))
+ for property_def in class_def.properties.values():
+ #f.write(".. _class_{}_{}:\n\n".format(class_name, property_def.name))
+ f.write(".. _class_{}_property_{}:\n\n".format(class_name, property_def.name))
+ f.write('- {} **{}**\n\n'.format(property_def.type_name.to_rst(state), property_def.name))
+
+ setget = []
+ if property_def.setter is not None and not property_def.setter.startswith("_"):
+ setget.append(("*Setter*", property_def.setter + '(value)'))
+ if property_def.getter is not None and not property_def.getter.startswith("_"):
+ setget.append(('*Getter*', property_def.getter + '()'))
+
+ if len(setget) > 0:
+ format_table(f, setget)
+
+ if property_def.text is not None and property_def.text.strip() != '':
+ f.write(rstize_text(property_def.text.strip(), state))
+ f.write('\n\n')
-def ul_string(str, ul):
- str += "\n"
- for i in range(len(str) - 1):
- str += ul
- str += "\n"
- return str
+ # Method descriptions
+ if len(class_def.methods) > 0:
+ f.write(make_heading('Method Descriptions', '-'))
+ for method_list in class_def.methods.values():
+ for i, m in enumerate(method_list):
+ if i == 0:
+ #f.write(".. _class_{}_{}:\n\n".format(class_name, m.name))
+ f.write(".. _class_{}_method_{}:\n\n".format(class_name, m.name))
+ ret_type, signature = make_method_signature(class_def, m, False, state)
+ f.write("- {} {}\n\n".format(ret_type, signature))
+
+ if m.description is None or m.description.strip() == '':
+ continue
+ f.write(rstize_text(m.description.strip(), state))
+ f.write("\n\n")
-def make_class_list(class_list, columns):
- f = codecs.open('class_list.rst', 'wb', 'utf-8')
- prev = 0
- col_max = len(class_list) / columns + 1
+def make_class_list(class_list, columns): # type: (List[str], int) -> None
+ # This function is no longer used.
+ f = open('class_list.rst', 'w', encoding='utf-8')
+ col_max = len(class_list) // columns + 1
print(('col max is ', col_max))
- col_count = 0
- row_count = 0
- last_initial = ''
- fit_columns = []
+ fit_columns = [] # type: List[List[str]]
- for n in range(0, columns):
- fit_columns += [[]]
+ for _ in range(0, columns):
+ fit_columns.append([])
- indexers = []
+ indexers = [] # type List[str]
last_initial = ''
- idx = 0
- for n in class_list:
- col = idx / col_max
+ for idx, name in enumerate(class_list):
+ col = idx // col_max
if col >= columns:
col = columns - 1
- fit_columns[col] += [n]
+ fit_columns[col].append(name)
idx += 1
- if n[:1] != last_initial:
- indexers += [n]
- last_initial = n[:1]
+ if name[:1] != last_initial:
+ indexers.append(name)
+ last_initial = name[:1]
row_max = 0
f.write("\n")
@@ -111,7 +601,7 @@ def make_class_list(class_list, columns):
f.close()
-def rstize_text(text, cclass):
+def rstize_text(text, state): # type: (str, State) -> str
# Linebreak + tabs in the XML should become two line breaks unless in a "codeblock"
pos = 0
while True:
@@ -128,7 +618,8 @@ def rstize_text(text, cclass):
if post_text.startswith("[codeblock]"):
end_pos = post_text.find("[/codeblock]")
if end_pos == -1:
- sys.exit("ERROR! [codeblock] without a closing tag!")
+ print_error("[codeblock] without a closing tag, file: {}".format(state.current_class), state)
+ return ""
code_text = post_text[len("[codeblock]"):end_pos]
post_text = post_text[end_pos:]
@@ -194,6 +685,7 @@ def rstize_text(text, cclass):
# Handle [tags]
inside_code = False
pos = 0
+ tag_depth = 0
while True:
pos = text.find('[', pos)
if pos == -1:
@@ -209,53 +701,100 @@ def rstize_text(text, cclass):
escape_post = False
- if tag_text in class_names:
- tag_text = make_type(tag_text)
+ if tag_text in state.classes:
+ tag_text = make_type(tag_text, state)
escape_post = True
else: # command
cmd = tag_text
space_pos = tag_text.find(' ')
if cmd == '/codeblock':
tag_text = ''
+ tag_depth -= 1
inside_code = False
# Strip newline if the tag was alone on one
if pre_text[-1] == '\n':
pre_text = pre_text[:-1]
elif cmd == '/code':
tag_text = '``'
+ tag_depth -= 1
inside_code = False
escape_post = True
elif inside_code:
tag_text = '[' + tag_text + ']'
elif cmd.find('html') == 0:
- cmd = tag_text[:space_pos]
param = tag_text[space_pos + 1:]
tag_text = param
- elif cmd.find('method') == 0 or cmd.find('member') == 0 or cmd.find('signal') == 0:
- cmd = tag_text[:space_pos]
+ elif cmd.startswith('method') or cmd.startswith('member') or cmd.startswith('signal') or cmd.startswith('constant'):
param = tag_text[space_pos + 1:]
if param.find('.') != -1:
ss = param.split('.')
if len(ss) > 2:
- sys.exit("Bad reference: '" + param + "' in file: " + cur_file)
- (class_param, method_param) = ss
- tag_text = ':ref:`' + class_param + '.' + method_param + '<class_' + class_param + '_' + method_param + '>`'
+ print_error("Bad reference: '{}', file: {}".format(param, state.current_class), state)
+ class_param, method_param = ss
+
+ else:
+ class_param = state.current_class
+ method_param = param
+
+ ref_type = ""
+ if class_param in state.classes:
+ class_def = state.classes[class_param]
+ if cmd.startswith("method"):
+ if method_param not in class_def.methods:
+ print_error("Unresolved method '{}', file: {}".format(param, state.current_class), state)
+ ref_type = "_method"
+
+ elif cmd.startswith("member"):
+ if method_param not in class_def.properties:
+ print_error("Unresolved member '{}', file: {}".format(param, state.current_class), state)
+ ref_type = "_property"
+
+ elif cmd.startswith("signal"):
+ if method_param not in class_def.signals:
+ print_error("Unresolved signal '{}', file: {}".format(param, state.current_class), state)
+ ref_type = "_signal"
+
+ elif cmd.startswith("constant"):
+ found = False
+ if method_param in class_def.constants:
+ found = True
+
+ else:
+ for enum in class_def.enums.values():
+ if method_param in enum.values:
+ found = True
+ break
+
+ if not found:
+ print_error("Unresolved constant '{}', file: {}".format(param, state.current_class), state)
+ ref_type = "_constant"
+
else:
- tag_text = ':ref:`' + param + '<class_' + cclass + "_" + param + '>`'
+ print_error("Unresolved type reference '{}' in method reference '{}', file: {}".format(class_param, param, state.current_class), state)
+
+ repl_text = method_param
+ if class_param != state.current_class:
+ repl_text = "{}.{}".format(class_param, method_param)
+ tag_text = ':ref:`{}<class_{}{}_{}>`'.format(repl_text, class_param, ref_type, method_param)
escape_post = True
elif cmd.find('image=') == 0:
tag_text = "" # '![](' + cmd[6:] + ')'
elif cmd.find('url=') == 0:
tag_text = ':ref:`' + cmd[4:] + '<' + cmd[4:] + ">`"
+ tag_depth += 1
elif cmd == '/url':
tag_text = ''
+ tag_depth -= 1
escape_post = True
elif cmd == 'center':
+ tag_depth += 1
tag_text = ''
elif cmd == '/center':
+ tag_depth -= 1
tag_text = ''
elif cmd == 'codeblock':
+ tag_depth += 1
tag_text = '\n::\n'
inside_code = True
elif cmd == 'br':
@@ -265,22 +804,35 @@ def rstize_text(text, cclass):
while post_text[0] == ' ':
post_text = post_text[1:]
elif cmd == 'i' or cmd == '/i':
+ if cmd == "/i":
+ tag_depth -= 1
+ else:
+ tag_depth += 1
tag_text = '*'
elif cmd == 'b' or cmd == '/b':
+ if cmd == "/b":
+ tag_depth -= 1
+ else:
+ tag_depth += 1
tag_text = '**'
elif cmd == 'u' or cmd == '/u':
+ if cmd == "/u":
+ tag_depth -= 1
+ else:
+ tag_depth += 1
tag_text = ''
elif cmd == 'code':
tag_text = '``'
+ tag_depth += 1
inside_code = True
elif cmd.startswith('enum '):
- tag_text = make_enum(cmd[5:])
+ tag_text = make_enum(cmd[5:], state)
else:
- tag_text = make_type(tag_text)
+ tag_text = make_type(tag_text, state)
escape_post = True
# Properly escape things like `[Node]s`
- if escape_post and post_text and post_text[0].isalnum(): # not punctuation, escape
+ if escape_post and post_text and (post_text[0].isalnum() or post_text[0] == "("): # not punctuation, escape
post_text = '\ ' + post_text
next_brac_pos = post_text.find('[', 0)
@@ -306,18 +858,21 @@ def rstize_text(text, cclass):
text = pre_text + tag_text + post_text
pos = len(pre_text) + len(tag_text)
+ if tag_depth > 0:
+ print_error("Tag depth mismatch: too many/little open/close tags, file: {}".format(state.current_class), state)
+
return text
-def format_table(f, pp):
+def format_table(f, pp): # type: (TextIO, Iterable[Tuple[str, ...]]) -> None
longest_t = 0
longest_s = 0
for s in pp:
sl = len(s[0])
- if (sl > longest_s):
+ if sl > longest_s:
longest_s = sl
tl = len(s[1])
- if (tl > longest_t):
+ if tl > longest_t:
longest_t = tl
sep = "+"
@@ -330,27 +885,25 @@ def format_table(f, pp):
f.write(sep)
for s in pp:
rt = s[0]
- while (len(rt) < longest_s):
+ while len(rt) < longest_s:
rt += " "
st = s[1]
- while (len(st) < longest_t):
+ while len(st) < longest_t:
st += " "
f.write("| " + rt + " | " + st + " |\n")
f.write(sep)
f.write('\n')
-def make_type(t):
- global class_names
- if t in class_names:
- return ':ref:`' + t + '<class_' + t + '>`'
+def make_type(t, state): # type: (str, State) -> str
+ if t in state.classes:
+ return ':ref:`{0}<class_{0}>`'.format(t)
+ print_error("Unresolved type '{}', file: {}".format(t, state.current_class), state)
return t
-def make_enum(t):
- global class_names
+def make_enum(t, state): # type: (str, State) -> str
p = t.find(".")
- # Global enums such as Error are relative to @GlobalScope.
if p >= 0:
c = t[0:p]
e = t[p + 1:]
@@ -359,362 +912,55 @@ def make_enum(t):
c = "@GlobalScope"
e = "Variant." + e
else:
- # Things in GlobalScope don't have a period.
- c = "@GlobalScope"
+ c = state.current_class
e = t
- if c in class_names:
- return ':ref:`' + e + '<enum_' + c + '_' + e + '>`'
+ if c in state.classes and e not in state.classes[c].enums:
+ c = "@GlobalScope"
+
+ if c in state.classes and e in state.classes[c].enums:
+ return ":ref:`{0}<enum_{1}_{0}>`".format(e, c)
+ print_error("Unresolved enum '{}', file: {}".format(t, state.current_class), state)
return t
-def make_method(
- f,
- cname,
- method_data,
- declare,
- event=False,
- pp=None
-):
- if (declare or pp is None):
- t = '- '
- else:
- t = ""
-
- ret_type = 'void'
- args = list(method_data)
- mdata = {}
- mdata['argidx'] = []
- for a in args:
- if a.tag == 'return':
- idx = -1
- elif a.tag == 'argument':
- idx = int(a.attrib['index'])
- else:
- continue
+def make_method_signature(class_def, method_def, make_ref, state): # type: (ClassDef, Union[MethodDef, SignalDef], bool, State) -> Tuple[str, str]
+ ret_type = " "
- mdata['argidx'].append(idx)
- mdata[idx] = a
-
- if not event:
- if -1 in mdata['argidx']:
- if 'enum' in mdata[-1].attrib:
- t += make_enum(mdata[-1].attrib['enum'])
- else:
- t += make_type(mdata[-1].attrib['type'])
- else:
- t += 'void'
- t += ' '
+ ref_type = "signal"
+ if isinstance(method_def, MethodDef):
+ ret_type = method_def.return_type.to_rst(state)
+ ref_type = "method"
- if declare or pp is None:
+ out = ""
- s = '**' + method_data.attrib['name'] + '** '
+ if make_ref:
+ out += ":ref:`{0}<class_{1}_{2}_{0}>` ".format(method_def.name, class_def.name, ref_type)
else:
- s = ':ref:`' + method_data.attrib['name'] + '<class_' + cname + "_" + method_data.attrib['name'] + '>` '
-
- s += '**(**'
- argfound = False
- for a in mdata['argidx']:
- arg = mdata[a]
- if a < 0:
- continue
- if a > 0:
- s += ', '
- else:
- s += ' '
+ out += "**{}** ".format(method_def.name)
- if 'enum' in arg.attrib:
- s += make_enum(arg.attrib['enum'])
+ out += '**(**'
+ for i, arg in enumerate(method_def.parameters):
+ if i > 0:
+ out += ', '
else:
- s += make_type(arg.attrib['type'])
- if 'name' in arg.attrib:
- s += ' ' + arg.attrib['name']
- else:
- s += ' arg' + str(a)
-
- if 'default' in arg.attrib:
- s += '=' + arg.attrib['default']
-
- s += ' **)**'
-
- if 'qualifiers' in method_data.attrib:
- s += ' ' + method_data.attrib['qualifiers']
-
- if (not declare):
- if (pp != None):
- pp.append((t, s))
- else:
- f.write("- " + t + " " + s + "\n")
- else:
- f.write(t + s + "\n")
-
-
-def make_properties(
- f,
- cname,
- prop_data,
- description=False,
- pp=None
-):
- t = ""
- if 'enum' in prop_data.attrib:
- t += make_enum(prop_data.attrib['enum'])
- else:
- t += make_type(prop_data.attrib['type'])
-
- if description:
- s = '**' + prop_data.attrib['name'] + '**'
- setget = []
- if 'setter' in prop_data.attrib and prop_data.attrib['setter'] != '' and not prop_data.attrib['setter'].startswith('_'):
- setget.append(("*Setter*", prop_data.attrib['setter'] + '(value)'))
- if 'getter' in prop_data.attrib and prop_data.attrib['getter'] != '' and not prop_data.attrib['getter'].startswith('_'):
- setget.append(('*Getter*', prop_data.attrib['getter'] + '()'))
- else:
- s = ':ref:`' + prop_data.attrib['name'] + '<class_' + cname + "_" + prop_data.attrib['name'] + '>`'
-
- if (pp != None):
- pp.append((t, s))
- elif description:
- f.write('- ' + t + ' ' + s + '\n\n')
- if len(setget) > 0:
- format_table(f, setget)
-
-
-def make_heading(title, underline):
- return title + '\n' + underline * len(title) + "\n\n"
-
-
-def make_rst_class(node):
- name = node.attrib['name']
-
- f = codecs.open("class_" + name.lower() + '.rst', 'wb', 'utf-8')
-
- # Warn contributors not to edit this file directly
- f.write(".. Generated automatically by doc/tools/makerst.py in Godot's source tree.\n")
- f.write(".. DO NOT EDIT THIS FILE, but the " + name + ".xml source instead.\n")
- f.write(".. The source is found in doc/classes or modules/<name>/doc_classes.\n\n")
-
- f.write(".. _class_" + name + ":\n\n")
- f.write(make_heading(name, '='))
-
- # Inheritance tree
- # Ascendents
- if 'inherits' in node.attrib:
- inh = node.attrib['inherits'].strip()
- f.write('**Inherits:** ')
- first = True
- while (inh in classes):
- if (not first):
- f.write(" **<** ")
- else:
- first = False
-
- f.write(make_type(inh))
- inode = classes[inh]
- if ('inherits' in inode.attrib):
- inh = inode.attrib['inherits'].strip()
- else:
- inh = None
- f.write("\n\n")
-
- # Descendents
- inherited = []
- for cn in classes:
- c = classes[cn]
- if 'inherits' in c.attrib:
- if (c.attrib['inherits'].strip() == name):
- inherited.append(c.attrib['name'])
- if (len(inherited)):
- f.write('**Inherited By:** ')
- for i in range(len(inherited)):
- if (i > 0):
- f.write(", ")
- f.write(make_type(inherited[i]))
- f.write("\n\n")
-
- # Category
- if 'category' in node.attrib:
- f.write('**Category:** ' + node.attrib['category'].strip() + "\n\n")
-
- # Brief description
- f.write(make_heading('Brief Description', '-'))
- briefd = node.find('brief_description')
- if briefd != None:
- f.write(rstize_text(briefd.text.strip(), name) + "\n\n")
-
- # Properties overview
- members = node.find('members')
- if members != None and len(list(members)) > 0:
- f.write(make_heading('Properties', '-'))
- ml = []
- for m in list(members):
- make_properties(f, name, m, False, ml)
- format_table(f, ml)
-
- # Methods overview
- methods = node.find('methods')
- if methods != None and len(list(methods)) > 0:
- f.write(make_heading('Methods', '-'))
- ml = []
- for m in list(methods):
- make_method(f, name, m, False, False, ml)
- format_table(f, ml)
-
- # Theme properties
- theme_items = node.find('theme_items')
- if theme_items != None and len(list(theme_items)) > 0:
- f.write(make_heading('Theme Properties', '-'))
- ml = []
- for m in list(theme_items):
- make_properties(f, name, m, False, ml)
- format_table(f, ml)
-
- # Signals
- events = node.find('signals')
- if events != None and len(list(events)) > 0:
- f.write(make_heading('Signals', '-'))
- for m in list(events):
- f.write(".. _class_" + name + "_" + m.attrib['name'] + ":\n\n")
- make_method(f, name, m, True, True)
- f.write('\n')
- d = m.find('description')
- if d is None or d.text.strip() == '':
- continue
- f.write(rstize_text(d.text.strip(), name))
- f.write("\n\n")
-
- # Constants and enums
- constants = node.find('constants')
- consts = []
- enum_names = set()
- enums = []
- if constants != None and len(list(constants)) > 0:
- for c in list(constants):
- if 'enum' in c.attrib:
- enum_names.add(c.attrib['enum'])
- enums.append(c)
- else:
- consts.append(c)
-
- # Enums
- if len(enum_names) > 0:
- f.write(make_heading('Enumerations', '-'))
- for e in enum_names:
- f.write(".. _enum_" + name + "_" + e + ":\n\n")
- f.write("enum **" + e + "**:\n\n")
- for c in enums:
- if c.attrib['enum'] != e:
- continue
- s = '- '
- s += '**' + c.attrib['name'] + '**'
- if 'value' in c.attrib:
- s += ' = **' + c.attrib['value'] + '**'
- if c.text.strip() != '':
- s += ' --- ' + rstize_text(c.text.strip(), name)
- f.write(s + '\n\n')
-
- # Constants
- if len(consts) > 0:
- f.write(make_heading('Constants', '-'))
- for c in list(consts):
- s = '- '
- s += '**' + c.attrib['name'] + '**'
- if 'value' in c.attrib:
- s += ' = **' + c.attrib['value'] + '**'
- if c.text.strip() != '':
- s += ' --- ' + rstize_text(c.text.strip(), name)
- f.write(s + '\n\n')
-
- # Class description
- descr = node.find('description')
- if descr != None and descr.text.strip() != '':
- f.write(make_heading('Description', '-'))
- f.write(rstize_text(descr.text.strip(), name) + "\n\n")
-
- # Online tutorials
- global godot_docs_pattern
- tutorials = node.find('tutorials')
- if tutorials != None and len(tutorials) > 0:
- f.write(make_heading('Tutorials', '-'))
- for t in tutorials:
- link = t.text.strip()
- match = godot_docs_pattern.search(link);
- if match:
- groups = match.groups()
- if match.lastindex == 2:
- # Doc reference with fragment identifier: emit direct link to section with reference to page, for example:
- # `#calling-javascript-from-script in Exporting For Web`
- f.write("- `" + groups[1] + " <../" + groups[0] + ".html" + groups[1] + ">`_ in :doc:`../" + groups[0] + "`\n\n")
- # Commented out alternative: Instead just emit:
- # `Subsection in Exporting For Web`
- # f.write("- `Subsection <../" + groups[0] + ".html" + groups[1] + ">`_ in :doc:`../" + groups[0] + "`\n\n")
- elif match.lastindex == 1:
- # Doc reference, for example:
- # `Math`
- f.write("- :doc:`../" + groups[0] + "`\n\n")
- else:
- # External link, for example:
- # `http://enet.bespin.org/usergroup0.html`
- f.write("- `" + link + " <" + link + ">`_\n\n")
-
- # Property descriptions
- members = node.find('members')
- if members != None and len(list(members)) > 0:
- f.write(make_heading('Property Descriptions', '-'))
- for m in list(members):
- f.write(".. _class_" + name + "_" + m.attrib['name'] + ":\n\n")
- make_properties(f, name, m, True)
- if m.text.strip() != '':
- f.write(rstize_text(m.text.strip(), name))
- f.write('\n\n')
-
- # Method descriptions
- methods = node.find('methods')
- if methods != None and len(list(methods)) > 0:
- f.write(make_heading('Method Descriptions', '-'))
- for m in list(methods):
- f.write(".. _class_" + name + "_" + m.attrib['name'] + ":\n\n")
- make_method(f, name, m, True)
- f.write('\n')
- d = m.find('description')
- if d is None or d.text.strip() == '':
- continue
- f.write(rstize_text(d.text.strip(), name))
- f.write("\n\n")
+ out += ' '
+ out += "{} {}".format(arg.type_name.to_rst(state), arg.name)
-file_list = []
+ if arg.default_value is not None:
+ out += '=' + arg.default_value
-for path in input_list:
- if os.path.basename(path) == 'modules':
- for subdir, dirs, _ in os.walk(path):
- if 'doc_classes' in dirs:
- doc_dir = os.path.join(subdir, 'doc_classes')
- class_file_names = [f for f in os.listdir(doc_dir) if f.endswith('.xml')]
- file_list += [os.path.join(doc_dir, f) for f in class_file_names]
- elif not os.path.isfile(path):
- file_list += [os.path.join(path, f) for f in os.listdir(path) if f.endswith('.xml')]
- elif os.path.isfile(path) and path.endswith('.xml'):
- file_list.append(path)
+ out += ' **)**'
-for cur_file in file_list:
- tree = ET.parse(cur_file)
- doc = tree.getroot()
+ if isinstance(method_def, MethodDef) and method_def.qualifiers is not None:
+ out += ' ' + method_def.qualifiers
- if 'version' not in doc.attrib:
- print("Version missing from 'doc'")
- sys.exit(255)
+ return ret_type, out
- version = doc.attrib['version']
- if doc.attrib['name'] in class_names:
- continue
- class_names.append(doc.attrib['name'])
- classes[doc.attrib['name']] = doc
-class_names.sort()
+def make_heading(title, underline): # type: (str, str) -> str
+ return title + '\n' + (underline * len(title)) + "\n\n"
-# Don't make class list for Sphinx, :toctree: handles it
-# make_class_list(class_names, 2)
-for cn in class_names:
- c = classes[cn]
- make_rst_class(c)
+if __name__ == '__main__':
+ main()
diff --git a/drivers/alsa/audio_driver_alsa.cpp b/drivers/alsa/audio_driver_alsa.cpp
index 50697b8834..0611d7d4e0 100644
--- a/drivers/alsa/audio_driver_alsa.cpp
+++ b/drivers/alsa/audio_driver_alsa.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -159,7 +159,7 @@ Error AudioDriverALSA::init() {
}
return err;
-};
+}
void AudioDriverALSA::thread_func(void *p_udata) {
@@ -232,25 +232,25 @@ void AudioDriverALSA::thread_func(void *p_udata) {
ad->stop_counting_ticks();
ad->unlock();
- };
+ }
ad->thread_exited = true;
-};
+}
void AudioDriverALSA::start() {
active = true;
-};
+}
int AudioDriverALSA::get_mix_rate() const {
return mix_rate;
-};
+}
AudioDriver::SpeakerMode AudioDriverALSA::get_speaker_mode() const {
return speaker_mode;
-};
+}
Array AudioDriverALSA::get_device_list() {
@@ -302,14 +302,14 @@ void AudioDriverALSA::lock() {
if (!thread || !mutex)
return;
mutex->lock();
-};
+}
void AudioDriverALSA::unlock() {
if (!thread || !mutex)
return;
mutex->unlock();
-};
+}
void AudioDriverALSA::finish_device() {
@@ -337,18 +337,15 @@ void AudioDriverALSA::finish() {
finish_device();
}
-AudioDriverALSA::AudioDriverALSA() {
-
- mutex = NULL;
- thread = NULL;
- pcm_handle = NULL;
-
- device_name = "Default";
- new_device = "Default";
-};
-
-AudioDriverALSA::~AudioDriverALSA(){
+AudioDriverALSA::AudioDriverALSA() :
+ thread(NULL),
+ mutex(NULL),
+ pcm_handle(NULL),
+ device_name("Default"),
+ new_device("Default") {
+}
-};
+AudioDriverALSA::~AudioDriverALSA() {
+}
#endif
diff --git a/drivers/alsa/audio_driver_alsa.h b/drivers/alsa/audio_driver_alsa.h
index e2a2325cf3..0079ffb6d9 100644
--- a/drivers/alsa/audio_driver_alsa.h
+++ b/drivers/alsa/audio_driver_alsa.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/alsamidi/alsa_midi.cpp b/drivers/alsamidi/alsa_midi.cpp
index 33ad7e3f17..cd90c8912b 100644
--- a/drivers/alsamidi/alsa_midi.cpp
+++ b/drivers/alsamidi/alsa_midi.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/alsamidi/alsa_midi.h b/drivers/alsamidi/alsa_midi.h
index 5741036166..054a7b474e 100644
--- a/drivers/alsamidi/alsa_midi.h
+++ b/drivers/alsamidi/alsa_midi.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/convex_decomp/b2d_decompose.cpp b/drivers/convex_decomp/b2d_decompose.cpp
index 14456144a6..7b16b6e752 100644
--- a/drivers/convex_decomp/b2d_decompose.cpp
+++ b/drivers/convex_decomp/b2d_decompose.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/convex_decomp/b2d_decompose.h b/drivers/convex_decomp/b2d_decompose.h
index f6b08b957c..e79f692852 100644
--- a/drivers/convex_decomp/b2d_decompose.h
+++ b/drivers/convex_decomp/b2d_decompose.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/coreaudio/audio_driver_coreaudio.cpp b/drivers/coreaudio/audio_driver_coreaudio.cpp
index 850b90d59b..97d16d3a6a 100644
--- a/drivers/coreaudio/audio_driver_coreaudio.cpp
+++ b/drivers/coreaudio/audio_driver_coreaudio.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -159,7 +159,10 @@ Error AudioDriverCoreAudio::init() {
result = AudioUnitInitialize(audio_unit);
ERR_FAIL_COND_V(result != noErr, FAILED);
- return capture_init();
+ if (GLOBAL_GET("audio/enable_audio_input")) {
+ return capture_init();
+ }
+ return OK;
}
OSStatus AudioDriverCoreAudio::output_callback(void *inRefCon,
@@ -684,22 +687,18 @@ String AudioDriverCoreAudio::capture_get_device() {
#endif
-AudioDriverCoreAudio::AudioDriverCoreAudio() {
- audio_unit = NULL;
- input_unit = NULL;
- active = false;
- mutex = NULL;
-
- mix_rate = 0;
- channels = 2;
- capture_channels = 2;
-
- buffer_frames = 0;
-
+AudioDriverCoreAudio::AudioDriverCoreAudio() :
+ audio_unit(NULL),
+ input_unit(NULL),
+ active(false),
+ mutex(NULL),
+ device_name("Default"),
+ capture_device_name("Default"),
+ mix_rate(0),
+ channels(2),
+ capture_channels(2),
+ buffer_frames(0) {
samples_in.clear();
-
- device_name = "Default";
- capture_device_name = "Default";
}
AudioDriverCoreAudio::~AudioDriverCoreAudio(){};
diff --git a/drivers/coreaudio/audio_driver_coreaudio.h b/drivers/coreaudio/audio_driver_coreaudio.h
index 474a9e43ae..f37d781cb6 100644
--- a/drivers/coreaudio/audio_driver_coreaudio.h
+++ b/drivers/coreaudio/audio_driver_coreaudio.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/coremidi/core_midi.cpp b/drivers/coremidi/core_midi.cpp
index 2ebbabaa38..7d3477213f 100644
--- a/drivers/coremidi/core_midi.cpp
+++ b/drivers/coremidi/core_midi.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -112,13 +112,11 @@ PoolStringArray MIDIDriverCoreMidi::get_connected_inputs() {
return list;
}
-MIDIDriverCoreMidi::MIDIDriverCoreMidi() {
-
- client = 0;
+MIDIDriverCoreMidi::MIDIDriverCoreMidi() :
+ client(0) {
}
MIDIDriverCoreMidi::~MIDIDriverCoreMidi() {
-
close();
}
diff --git a/drivers/coremidi/core_midi.h b/drivers/coremidi/core_midi.h
index ea6b0fcb06..7a10b5548e 100644
--- a/drivers/coremidi/core_midi.h
+++ b/drivers/coremidi/core_midi.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/dummy/audio_driver_dummy.h b/drivers/dummy/audio_driver_dummy.h
index b3f0fcee07..4f4d7f9bc4 100644
--- a/drivers/dummy/audio_driver_dummy.h
+++ b/drivers/dummy/audio_driver_dummy.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/dummy/rasterizer_dummy.h b/drivers/dummy/rasterizer_dummy.h
index bd3a36feef..ddc0dd5fa9 100644
--- a/drivers/dummy/rasterizer_dummy.h
+++ b/drivers/dummy/rasterizer_dummy.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -56,6 +56,7 @@ public:
void environment_set_background(RID p_env, VS::EnvironmentBG p_bg) {}
void environment_set_sky(RID p_env, RID p_sky) {}
void environment_set_sky_custom_fov(RID p_env, float p_scale) {}
+ void environment_set_sky_orientation(RID p_env, const Basis &p_orientation) {}
void environment_set_bg_color(RID p_env, const Color &p_color) {}
void environment_set_bg_energy(RID p_env, float p_energy) {}
void environment_set_canvas_max_layer(RID p_env, int p_max_layer) {}
@@ -63,7 +64,8 @@ public:
void environment_set_dof_blur_near(RID p_env, bool p_enable, float p_distance, float p_transition, float p_far_amount, VS::EnvironmentDOFBlurQuality p_quality) {}
void environment_set_dof_blur_far(RID p_env, bool p_enable, float p_distance, float p_transition, float p_far_amount, VS::EnvironmentDOFBlurQuality p_quality) {}
- void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, VS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, bool p_bicubic_upscale) {}
+ void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, VS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, bool p_bicubic_upscale) {}
+
void environment_set_fog(RID p_env, bool p_enable, float p_begin, float p_end, RID p_gradient_texture) {}
void environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_int, float p_fade_out, float p_depth_tolerance, bool p_roughness) {}
@@ -681,6 +683,8 @@ public:
int particles_get_draw_passes(RID p_particles) const { return 0; }
RID particles_get_draw_pass_mesh(RID p_particles, int p_pass) const { return RID(); }
+ virtual bool particles_is_inactive(RID p_particles) const { return false; }
+
/* RENDER TARGET */
RID render_target_create() { return RID(); }
diff --git a/drivers/dummy/texture_loader_dummy.cpp b/drivers/dummy/texture_loader_dummy.cpp
index 8153fbd10b..88d11fef2c 100644
--- a/drivers/dummy/texture_loader_dummy.cpp
+++ b/drivers/dummy/texture_loader_dummy.cpp
@@ -1,12 +1,12 @@
/*************************************************************************/
-/* texture_loader_dummy.cpp */
+/* texture_loader_dummy.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/dummy/texture_loader_dummy.h b/drivers/dummy/texture_loader_dummy.h
index f0a355ec12..3038bffc95 100644
--- a/drivers/dummy/texture_loader_dummy.h
+++ b/drivers/dummy/texture_loader_dummy.h
@@ -1,12 +1,12 @@
/*************************************************************************/
-/* texture_loader_dummy.h */
+/* texture_loader_dummy.h */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -35,6 +35,7 @@
#include "scene/resources/texture.h"
class ResourceFormatDummyTexture : public ResourceFormatLoader {
+ GDCLASS(ResourceFormatDummyTexture, ResourceFormatLoader)
public:
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
virtual void get_recognized_extensions(List<String> *p_extensions) const;
diff --git a/drivers/gl_context/context_gl.cpp b/drivers/gl_context/context_gl.cpp
index aa36658698..759ab6f3ec 100644
--- a/drivers/gl_context/context_gl.cpp
+++ b/drivers/gl_context/context_gl.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/gl_context/context_gl.h b/drivers/gl_context/context_gl.h
index 37f334454b..13141d795c 100644
--- a/drivers/gl_context/context_gl.h
+++ b/drivers/gl_context/context_gl.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/gles2/rasterizer_canvas_gles2.cpp b/drivers/gles2/rasterizer_canvas_gles2.cpp
index 9227c04e71..e6ec6fb4fd 100644
--- a/drivers/gles2/rasterizer_canvas_gles2.cpp
+++ b/drivers/gles2/rasterizer_canvas_gles2.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -67,6 +67,46 @@ void RasterizerCanvasGLES2::_set_uniforms() {
state.canvas_shader.set_uniform(CanvasShaderGLES2::SCREEN_PIXEL_SIZE, screen_pixel_size);
}
+
+ if (state.using_skeleton) {
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::SKELETON_TRANSFORM, state.skeleton_transform);
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::SKELETON_TRANSFORM_INVERSE, state.skeleton_transform_inverse);
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::SKELETON_TEXTURE_SIZE, state.skeleton_texture_size);
+ }
+
+ if (state.using_light) {
+
+ Light *light = state.using_light;
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::LIGHT_MATRIX, light->light_shader_xform);
+ Transform2D basis_inverse = light->light_shader_xform.affine_inverse().orthonormalized();
+ basis_inverse[2] = Vector2();
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::LIGHT_MATRIX_INVERSE, basis_inverse);
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::LIGHT_LOCAL_MATRIX, light->xform_cache.affine_inverse());
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::LIGHT_COLOR, light->color * light->energy);
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::LIGHT_POS, light->light_shader_pos);
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::LIGHT_HEIGHT, light->height);
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::LIGHT_OUTSIDE_ALPHA, light->mode == VS::CANVAS_LIGHT_MODE_MASK ? 1.0 : 0.0);
+
+ if (state.using_shadow) {
+ RasterizerStorageGLES2::CanvasLightShadow *cls = storage->canvas_light_shadow_owner.get(light->shadow_buffer);
+ glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 5);
+ glBindTexture(GL_TEXTURE_2D, cls->distance);
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::SHADOW_MATRIX, light->shadow_matrix_cache);
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::LIGHT_SHADOW_COLOR, light->shadow_color);
+
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::SHADOWPIXEL_SIZE, (1.0 / light->shadow_buffer_size) * (1.0 + light->shadow_smooth));
+ if (light->radius_cache == 0) {
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::SHADOW_GRADIENT, 0.0);
+ } else {
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::SHADOW_GRADIENT, light->shadow_gradient_length / (light->radius_cache * 1.1));
+ }
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::SHADOW_DISTANCE_MULT, light->radius_cache * 1.1);
+
+ /*canvas_shader.set_uniform(CanvasShaderGLES2::SHADOW_MATRIX,light->shadow_matrix_cache);
+ canvas_shader.set_uniform(CanvasShaderGLES2::SHADOW_ESM_MULTIPLIER,light->shadow_esm_mult);
+ canvas_shader.set_uniform(CanvasShaderGLES2::LIGHT_SHADOW_COLOR,light->shadow_color);*/
+ }
+ }
}
void RasterizerCanvasGLES2::canvas_begin() {
@@ -140,6 +180,7 @@ void RasterizerCanvasGLES2::canvas_end() {
}
state.using_texture_rect = false;
+ state.using_skeleton = false;
state.using_ninepatch = false;
}
@@ -186,13 +227,46 @@ RasterizerStorageGLES2::Texture *RasterizerCanvasGLES2::_bind_canvas_texture(con
glBindTexture(GL_TEXTURE_2D, storage->resources.white_tex);
}
- return tex_return;
-}
+ if (p_normal_map == state.current_normal) {
+ //do none
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::USE_DEFAULT_NORMAL, state.current_normal.is_valid());
-void RasterizerCanvasGLES2::_set_texture_rect_mode(bool p_enable, bool p_ninepatch) {
+ } else if (p_normal_map.is_valid()) {
+
+ RasterizerStorageGLES2::Texture *normal_map = storage->texture_owner.getornull(p_normal_map);
+
+ if (!normal_map) {
+ state.current_normal = RID();
+ glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 2);
+ glBindTexture(GL_TEXTURE_2D, storage->resources.normal_tex);
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::USE_DEFAULT_NORMAL, false);
+
+ } else {
+
+ normal_map = normal_map->get_ptr();
+
+ if (normal_map->redraw_if_visible) { //check before proxy, because this is usually used with proxies
+ VisualServerRaster::redraw_request();
+ }
+
+ glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 2);
+ glBindTexture(GL_TEXTURE_2D, normal_map->tex_id);
+ state.current_normal = p_normal_map;
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::USE_DEFAULT_NORMAL, true);
+ }
+
+ } else {
+
+ state.current_normal = RID();
+ glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 2);
+ glBindTexture(GL_TEXTURE_2D, storage->resources.normal_tex);
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::USE_DEFAULT_NORMAL, false);
+ }
+
+ return tex_return;
}
-void RasterizerCanvasGLES2::_draw_polygon(const int *p_indices, int p_index_count, int p_vertex_count, const Vector2 *p_vertices, const Vector2 *p_uvs, const Color *p_colors, bool p_singlecolor) {
+void RasterizerCanvasGLES2::_draw_polygon(const int *p_indices, int p_index_count, int p_vertex_count, const Vector2 *p_vertices, const Vector2 *p_uvs, const Color *p_colors, bool p_singlecolor, const float *p_weights, const int *p_bones) {
glBindBuffer(GL_ARRAY_BUFFER, data.polygon_buffer);
@@ -226,6 +300,22 @@ void RasterizerCanvasGLES2::_draw_polygon(const int *p_indices, int p_index_coun
glDisableVertexAttribArray(VS::ARRAY_TEX_UV);
}
+ if (p_weights && p_bones) {
+ glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(float) * 4 * p_vertex_count, p_weights);
+ glEnableVertexAttribArray(VS::ARRAY_WEIGHTS);
+ glVertexAttribPointer(VS::ARRAY_WEIGHTS, 4, GL_FLOAT, GL_FALSE, sizeof(float) * 4, ((uint8_t *)0) + buffer_ofs);
+ buffer_ofs += sizeof(float) * 4 * p_vertex_count;
+
+ glBufferSubData(GL_ARRAY_BUFFER, buffer_ofs, sizeof(int) * 4 * p_vertex_count, p_bones);
+ glEnableVertexAttribArray(VS::ARRAY_BONES);
+ glVertexAttribPointer(VS::ARRAY_BONES, 4, GL_UNSIGNED_INT, GL_FALSE, sizeof(int) * 4, ((uint8_t *)0) + buffer_ofs);
+ buffer_ofs += sizeof(int) * 4 * p_vertex_count;
+
+ } else {
+ glDisableVertexAttribArray(VS::ARRAY_WEIGHTS);
+ glDisableVertexAttribArray(VS::ARRAY_BONES);
+ }
+
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.polygon_index_buffer);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(int) * p_index_count, p_indices);
@@ -334,6 +424,16 @@ void RasterizerCanvasGLES2::_draw_gui_primitive(int p_points, const Vector2 *p_v
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
+static const GLenum gl_primitive[] = {
+ GL_POINTS,
+ GL_LINES,
+ GL_LINE_STRIP,
+ GL_LINE_LOOP,
+ GL_TRIANGLES,
+ GL_TRIANGLE_STRIP,
+ GL_TRIANGLE_FAN
+};
+
void RasterizerCanvasGLES2::_canvas_item_render_commands(Item *p_item, Item *current_clip, bool &reclip, RasterizerStorageGLES2::Material *p_material) {
int command_count = p_item->commands.size();
@@ -350,7 +450,6 @@ void RasterizerCanvasGLES2::_canvas_item_render_commands(Item *p_item, Item *cur
Item::CommandLine *line = static_cast<Item::CommandLine *>(command);
state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_TEXTURE_RECT, false);
- state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_UV_ATTRIBUTE, false);
if (state.canvas_shader.bind()) {
_set_uniforms();
state.canvas_shader.use_material((void *)p_material);
@@ -391,85 +490,164 @@ void RasterizerCanvasGLES2::_canvas_item_render_commands(Item *p_item, Item *cur
glDisableVertexAttribArray(VS::ARRAY_COLOR);
glVertexAttrib4fv(VS::ARRAY_COLOR, r->modulate.components);
- _bind_quad_buffer();
-
- state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_TEXTURE_RECT, true);
- state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_UV_ATTRIBUTE, false);
- if (state.canvas_shader.bind()) {
- _set_uniforms();
- state.canvas_shader.use_material((void *)p_material);
- }
-
- RasterizerStorageGLES2::Texture *tex = _bind_canvas_texture(r->texture, r->normal_map);
+ // On some widespread Nvidia cards, the normal draw method can produce some
+ // flickering in draw_rect and especially TileMap rendering (tiles randomly flicker).
+ // See GH-9913.
+ // To work it around, we use a simpler draw method which does not flicker, but gives
+ // a non negligible performance hit, so it's opt-in (GH-24466).
+ if (use_nvidia_rect_workaround) {
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_TEXTURE_RECT, false);
+
+ if (state.canvas_shader.bind()) {
+ _set_uniforms();
+ state.canvas_shader.use_material((void *)p_material);
+ }
- if (!tex) {
- Rect2 dst_rect = Rect2(r->rect.position, r->rect.size);
+ Vector2 points[4] = {
+ r->rect.position,
+ r->rect.position + Vector2(r->rect.size.x, 0.0),
+ r->rect.position + r->rect.size,
+ r->rect.position + Vector2(0.0, r->rect.size.y),
+ };
- if (dst_rect.size.width < 0) {
- dst_rect.position.x += dst_rect.size.width;
- dst_rect.size.width *= -1;
+ if (r->rect.size.x < 0) {
+ SWAP(points[0], points[1]);
+ SWAP(points[2], points[3]);
}
- if (dst_rect.size.height < 0) {
- dst_rect.position.y += dst_rect.size.height;
- dst_rect.size.height *= -1;
+ if (r->rect.size.y < 0) {
+ SWAP(points[0], points[3]);
+ SWAP(points[1], points[2]);
}
- state.canvas_shader.set_uniform(CanvasShaderGLES2::DST_RECT, Color(dst_rect.position.x, dst_rect.position.y, dst_rect.size.x, dst_rect.size.y));
- state.canvas_shader.set_uniform(CanvasShaderGLES2::SRC_RECT, Color(0, 0, 1, 1));
+ RasterizerStorageGLES2::Texture *texture = _bind_canvas_texture(r->texture, r->normal_map);
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
- } else {
+ if (texture) {
+ Size2 texpixel_size(1.0 / texture->width, 1.0 / texture->height);
- bool untile = false;
+ Rect2 src_rect = (r->flags & CANVAS_RECT_REGION) ? Rect2(r->source.position * texpixel_size, r->source.size * texpixel_size) : Rect2(0, 0, 1, 1);
- if (r->flags & CANVAS_RECT_TILE && !(tex->flags & VS::TEXTURE_FLAG_REPEAT)) {
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- untile = true;
- }
+ Vector2 uvs[4] = {
+ src_rect.position,
+ src_rect.position + Vector2(src_rect.size.x, 0.0),
+ src_rect.position + src_rect.size,
+ src_rect.position + Vector2(0.0, src_rect.size.y),
+ };
- Size2 texpixel_size(1.0 / tex->width, 1.0 / tex->height);
- Rect2 src_rect = (r->flags & CANVAS_RECT_REGION) ? Rect2(r->source.position * texpixel_size, r->source.size * texpixel_size) : Rect2(0, 0, 1, 1);
+ if (r->flags & CANVAS_RECT_TRANSPOSE) {
+ SWAP(uvs[1], uvs[3]);
+ }
- Rect2 dst_rect = Rect2(r->rect.position, r->rect.size);
+ if (r->flags & CANVAS_RECT_FLIP_H) {
+ SWAP(uvs[0], uvs[1]);
+ SWAP(uvs[2], uvs[3]);
+ }
+ if (r->flags & CANVAS_RECT_FLIP_V) {
+ SWAP(uvs[0], uvs[3]);
+ SWAP(uvs[1], uvs[2]);
+ }
- if (dst_rect.size.width < 0) {
- dst_rect.position.x += dst_rect.size.width;
- dst_rect.size.width *= -1;
- }
- if (dst_rect.size.height < 0) {
- dst_rect.position.y += dst_rect.size.height;
- dst_rect.size.height *= -1;
- }
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::COLOR_TEXPIXEL_SIZE, texpixel_size);
- if (r->flags & CANVAS_RECT_FLIP_H) {
- src_rect.size.x *= -1;
- }
+ bool untile = false;
- if (r->flags & CANVAS_RECT_FLIP_V) {
- src_rect.size.y *= -1;
+ if (r->flags & CANVAS_RECT_TILE && !(texture->flags & VS::TEXTURE_FLAG_REPEAT)) {
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ untile = true;
+ }
+
+ _draw_gui_primitive(4, points, NULL, uvs);
+
+ if (untile) {
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ }
+ } else {
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::COLOR_TEXPIXEL_SIZE, Vector2());
+ _draw_gui_primitive(4, points, NULL, NULL);
}
- if (r->flags & CANVAS_RECT_TRANSPOSE) {
- dst_rect.size.x *= -1; // Encoding in the dst_rect.z uniform
+ } else {
+ // This branch is better for performance, but can produce flicker on Nvidia, see above comment.
+ _bind_quad_buffer();
+
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_TEXTURE_RECT, true);
+
+ if (state.canvas_shader.bind()) {
+ _set_uniforms();
+ state.canvas_shader.use_material((void *)p_material);
}
- state.canvas_shader.set_uniform(CanvasShaderGLES2::COLOR_TEXPIXEL_SIZE, texpixel_size);
+ RasterizerStorageGLES2::Texture *tex = _bind_canvas_texture(r->texture, r->normal_map);
- state.canvas_shader.set_uniform(CanvasShaderGLES2::DST_RECT, Color(dst_rect.position.x, dst_rect.position.y, dst_rect.size.x, dst_rect.size.y));
- state.canvas_shader.set_uniform(CanvasShaderGLES2::SRC_RECT, Color(src_rect.position.x, src_rect.position.y, src_rect.size.x, src_rect.size.y));
+ if (!tex) {
+ Rect2 dst_rect = Rect2(r->rect.position, r->rect.size);
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+ if (dst_rect.size.width < 0) {
+ dst_rect.position.x += dst_rect.size.width;
+ dst_rect.size.width *= -1;
+ }
+ if (dst_rect.size.height < 0) {
+ dst_rect.position.y += dst_rect.size.height;
+ dst_rect.size.height *= -1;
+ }
- if (untile) {
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- }
- }
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::DST_RECT, Color(dst_rect.position.x, dst_rect.position.y, dst_rect.size.x, dst_rect.size.y));
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::SRC_RECT, Color(0, 0, 1, 1));
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+ glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+ } else {
+
+ bool untile = false;
+
+ if (r->flags & CANVAS_RECT_TILE && !(tex->flags & VS::TEXTURE_FLAG_REPEAT)) {
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ untile = true;
+ }
+
+ Size2 texpixel_size(1.0 / tex->width, 1.0 / tex->height);
+ Rect2 src_rect = (r->flags & CANVAS_RECT_REGION) ? Rect2(r->source.position * texpixel_size, r->source.size * texpixel_size) : Rect2(0, 0, 1, 1);
+
+ Rect2 dst_rect = Rect2(r->rect.position, r->rect.size);
+
+ if (dst_rect.size.width < 0) {
+ dst_rect.position.x += dst_rect.size.width;
+ dst_rect.size.width *= -1;
+ }
+ if (dst_rect.size.height < 0) {
+ dst_rect.position.y += dst_rect.size.height;
+ dst_rect.size.height *= -1;
+ }
+
+ if (r->flags & CANVAS_RECT_FLIP_H) {
+ src_rect.size.x *= -1;
+ }
+
+ if (r->flags & CANVAS_RECT_FLIP_V) {
+ src_rect.size.y *= -1;
+ }
+ if (r->flags & CANVAS_RECT_TRANSPOSE) {
+ dst_rect.size.x *= -1; // Encoding in the dst_rect.z uniform
+ }
+
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::COLOR_TEXPIXEL_SIZE, texpixel_size);
+
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::DST_RECT, Color(dst_rect.position.x, dst_rect.position.y, dst_rect.size.x, dst_rect.size.y));
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::SRC_RECT, Color(src_rect.position.x, src_rect.position.y, src_rect.size.x, src_rect.size.y));
+
+ glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+
+ if (untile) {
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ }
+ }
+
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+ }
} break;
case Item::Command::TYPE_NINEPATCH: {
@@ -477,7 +655,6 @@ void RasterizerCanvasGLES2::_canvas_item_render_commands(Item *p_item, Item *cur
Item::CommandNinePatch *np = static_cast<Item::CommandNinePatch *>(command);
state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_TEXTURE_RECT, false);
- state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_UV_ATTRIBUTE, true);
if (state.canvas_shader.bind()) {
_set_uniforms();
state.canvas_shader.use_material((void *)p_material);
@@ -641,7 +818,6 @@ void RasterizerCanvasGLES2::_canvas_item_render_commands(Item *p_item, Item *cur
Item::CommandCircle *circle = static_cast<Item::CommandCircle *>(command);
state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_TEXTURE_RECT, false);
- state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_UV_ATTRIBUTE, false);
if (state.canvas_shader.bind()) {
_set_uniforms();
@@ -672,7 +848,6 @@ void RasterizerCanvasGLES2::_canvas_item_render_commands(Item *p_item, Item *cur
Item::CommandPolygon *polygon = static_cast<Item::CommandPolygon *>(command);
state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_TEXTURE_RECT, false);
- state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_UV_ATTRIBUTE, true);
if (state.canvas_shader.bind()) {
_set_uniforms();
@@ -686,14 +861,194 @@ void RasterizerCanvasGLES2::_canvas_item_render_commands(Item *p_item, Item *cur
state.canvas_shader.set_uniform(CanvasShaderGLES2::COLOR_TEXPIXEL_SIZE, texpixel_size);
}
- _draw_polygon(polygon->indices.ptr(), polygon->count, polygon->points.size(), polygon->points.ptr(), polygon->uvs.ptr(), polygon->colors.ptr(), polygon->colors.size() == 1);
+ _draw_polygon(polygon->indices.ptr(), polygon->count, polygon->points.size(), polygon->points.ptr(), polygon->uvs.ptr(), polygon->colors.ptr(), polygon->colors.size() == 1, polygon->weights.ptr(), polygon->bones.ptr());
} break;
+ case Item::Command::TYPE_MESH: {
+
+ Item::CommandMesh *mesh = static_cast<Item::CommandMesh *>(command);
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_TEXTURE_RECT, false);
+
+ if (state.canvas_shader.bind()) {
+ _set_uniforms();
+ state.canvas_shader.use_material((void *)p_material);
+ }
+
+ RasterizerStorageGLES2::Texture *texture = _bind_canvas_texture(mesh->texture, mesh->normal_map);
+
+ if (texture) {
+ Size2 texpixel_size(1.0 / texture->width, 1.0 / texture->height);
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::COLOR_TEXPIXEL_SIZE, texpixel_size);
+ }
+
+ RasterizerStorageGLES2::Mesh *mesh_data = storage->mesh_owner.getornull(mesh->mesh);
+ if (mesh_data) {
+
+ for (int j = 0; j < mesh_data->surfaces.size(); j++) {
+ RasterizerStorageGLES2::Surface *s = mesh_data->surfaces[j];
+ // materials are ignored in 2D meshes, could be added but many things (ie, lighting mode, reading from screen, etc) would break as they are not meant be set up at this point of drawing
+
+ glBindBuffer(GL_ARRAY_BUFFER, s->vertex_id);
+
+ if (s->index_array_len > 0) {
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, s->index_id);
+ }
+
+ for (int i = 0; i < VS::ARRAY_MAX - 1; i++) {
+ if (s->attribs[i].enabled) {
+ glEnableVertexAttribArray(i);
+ glVertexAttribPointer(s->attribs[i].index, s->attribs[i].size, s->attribs[i].type, s->attribs[i].normalized, s->attribs[i].stride, (uint8_t *)0 + s->attribs[i].offset);
+ } else {
+ glDisableVertexAttribArray(i);
+ switch (i) {
+ case VS::ARRAY_NORMAL: {
+ glVertexAttrib4f(VS::ARRAY_NORMAL, 0.0, 0.0, 1, 1);
+ } break;
+ case VS::ARRAY_COLOR: {
+ glVertexAttrib4f(VS::ARRAY_COLOR, 1, 1, 1, 1);
+
+ } break;
+ default: {}
+ }
+ }
+ }
+
+ if (s->index_array_len > 0) {
+ glDrawElements(gl_primitive[s->primitive], s->index_array_len, (s->array_len >= (1 << 16)) ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT, 0);
+ } else {
+ glDrawArrays(gl_primitive[s->primitive], 0, s->array_len);
+ }
+ }
+
+ for (int i = 1; i < VS::ARRAY_MAX - 1; i++) {
+ glDisableVertexAttribArray(i);
+ }
+ }
+
+ } break;
+ case Item::Command::TYPE_MULTIMESH: {
+ Item::CommandMultiMesh *mmesh = static_cast<Item::CommandMultiMesh *>(command);
+
+ RasterizerStorageGLES2::MultiMesh *multi_mesh = storage->multimesh_owner.getornull(mmesh->multimesh);
+
+ if (!multi_mesh)
+ break;
+
+ RasterizerStorageGLES2::Mesh *mesh_data = storage->mesh_owner.getornull(multi_mesh->mesh);
+
+ if (!mesh_data)
+ break;
+
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_INSTANCE_CUSTOM, multi_mesh->custom_data_format != VS::MULTIMESH_CUSTOM_DATA_NONE);
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_INSTANCING, true);
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_TEXTURE_RECT, false);
+
+ if (state.canvas_shader.bind()) {
+ _set_uniforms();
+ state.canvas_shader.use_material((void *)p_material);
+ }
+
+ RasterizerStorageGLES2::Texture *texture = _bind_canvas_texture(mmesh->texture, mmesh->normal_map);
+
+ if (texture) {
+ Size2 texpixel_size(1.0 / texture->width, 1.0 / texture->height);
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::COLOR_TEXPIXEL_SIZE, texpixel_size);
+ }
+
+ //reset shader and force rebind
+
+ int amount = MIN(multi_mesh->size, multi_mesh->visible_instances);
+
+ if (amount == -1) {
+ amount = multi_mesh->size;
+ }
+
+ int stride = multi_mesh->color_floats + multi_mesh->custom_data_floats + multi_mesh->xform_floats;
+
+ int color_ofs = multi_mesh->xform_floats;
+ int custom_data_ofs = color_ofs + multi_mesh->color_floats;
+
+ // drawing
+
+ const float *base_buffer = multi_mesh->data.ptr();
+
+ for (int j = 0; j < mesh_data->surfaces.size(); j++) {
+ RasterizerStorageGLES2::Surface *s = mesh_data->surfaces[j];
+ // materials are ignored in 2D meshes, could be added but many things (ie, lighting mode, reading from screen, etc) would break as they are not meant be set up at this point of drawing
+
+ //bind buffers for mesh surface
+ glBindBuffer(GL_ARRAY_BUFFER, s->vertex_id);
+
+ if (s->index_array_len > 0) {
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, s->index_id);
+ }
+
+ for (int i = 0; i < VS::ARRAY_MAX - 1; i++) {
+ if (s->attribs[i].enabled) {
+ glEnableVertexAttribArray(i);
+ glVertexAttribPointer(s->attribs[i].index, s->attribs[i].size, s->attribs[i].type, s->attribs[i].normalized, s->attribs[i].stride, (uint8_t *)0 + s->attribs[i].offset);
+ } else {
+ glDisableVertexAttribArray(i);
+ switch (i) {
+ case VS::ARRAY_NORMAL: {
+ glVertexAttrib4f(VS::ARRAY_NORMAL, 0.0, 0.0, 1, 1);
+ } break;
+ case VS::ARRAY_COLOR: {
+ glVertexAttrib4f(VS::ARRAY_COLOR, 1, 1, 1, 1);
+
+ } break;
+ default: {}
+ }
+ }
+ }
+
+ for (int i = 0; i < amount; i++) {
+ const float *buffer = base_buffer + i * stride;
+
+ {
+
+ glVertexAttrib4fv(INSTANCE_ATTRIB_BASE + 0, &buffer[0]);
+ glVertexAttrib4fv(INSTANCE_ATTRIB_BASE + 1, &buffer[4]);
+ if (multi_mesh->transform_format == VS::MULTIMESH_TRANSFORM_3D) {
+ glVertexAttrib4fv(INSTANCE_ATTRIB_BASE + 2, &buffer[8]);
+ } else {
+ glVertexAttrib4f(INSTANCE_ATTRIB_BASE + 2, 0.0, 0.0, 1.0, 0.0);
+ }
+ }
+
+ if (multi_mesh->color_floats) {
+ if (multi_mesh->color_format == VS::MULTIMESH_COLOR_8BIT) {
+ uint8_t *color_data = (uint8_t *)(buffer + color_ofs);
+ glVertexAttrib4f(INSTANCE_ATTRIB_BASE + 3, color_data[0] / 255.0, color_data[1] / 255.0, color_data[2] / 255.0, color_data[3] / 255.0);
+ } else {
+ glVertexAttrib4fv(INSTANCE_ATTRIB_BASE + 3, buffer + color_ofs);
+ }
+ }
+ if (multi_mesh->custom_data_floats) {
+ if (multi_mesh->custom_data_format == VS::MULTIMESH_CUSTOM_DATA_8BIT) {
+ uint8_t *custom_data = (uint8_t *)(buffer + custom_data_ofs);
+ glVertexAttrib4f(INSTANCE_ATTRIB_BASE + 4, custom_data[0] / 255.0, custom_data[1] / 255.0, custom_data[2] / 255.0, custom_data[3] / 255.0);
+ } else {
+ glVertexAttrib4fv(INSTANCE_ATTRIB_BASE + 4, buffer + custom_data_ofs);
+ }
+ }
+
+ if (s->index_array_len > 0) {
+ glDrawElements(gl_primitive[s->primitive], s->index_array_len, (s->array_len >= (1 << 16)) ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT, 0);
+ } else {
+ glDrawArrays(gl_primitive[s->primitive], 0, s->array_len);
+ }
+ }
+ }
+
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_INSTANCE_CUSTOM, false);
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_INSTANCING, false);
+
+ } break;
case Item::Command::TYPE_POLYLINE: {
Item::CommandPolyLine *pline = static_cast<Item::CommandPolyLine *>(command);
state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_TEXTURE_RECT, false);
- state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_UV_ATTRIBUTE, false);
if (state.canvas_shader.bind()) {
_set_uniforms();
@@ -726,7 +1081,6 @@ void RasterizerCanvasGLES2::_canvas_item_render_commands(Item *p_item, Item *cur
Item::CommandPrimitive *primitive = static_cast<Item::CommandPrimitive *>(command);
state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_TEXTURE_RECT, false);
- state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_UV_ATTRIBUTE, true);
if (state.canvas_shader.bind()) {
_set_uniforms();
@@ -810,6 +1164,8 @@ void RasterizerCanvasGLES2::canvas_render_items(Item *p_item_list, int p_z, cons
RasterizerStorageGLES2::Shader *shader_cache = NULL;
bool rebind_shader = true;
+ bool prev_use_skeleton = false;
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_SKELETON, false);
state.current_tex = RID();
state.current_tex_ptr = NULL;
@@ -851,6 +1207,37 @@ void RasterizerCanvasGLES2::canvas_render_items(Item *p_item_list, int p_z, cons
}
}
+ RasterizerStorageGLES2::Skeleton *skeleton = NULL;
+
+ {
+ //skeleton handling
+ if (ci->skeleton.is_valid() && storage->skeleton_owner.owns(ci->skeleton)) {
+ skeleton = storage->skeleton_owner.get(ci->skeleton);
+ if (!skeleton->use_2d) {
+ skeleton = NULL;
+ } else {
+ state.skeleton_transform = p_base_transform * skeleton->base_transform_2d;
+ state.skeleton_transform_inverse = state.skeleton_transform.affine_inverse();
+ state.skeleton_texture_size = Vector2(skeleton->size * 2, 0);
+ }
+ }
+
+ bool use_skeleton = skeleton != NULL;
+ if (prev_use_skeleton != use_skeleton) {
+ rebind_shader = true;
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_SKELETON, use_skeleton);
+ prev_use_skeleton = use_skeleton;
+ }
+
+ if (skeleton) {
+ glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 3);
+ glBindTexture(GL_TEXTURE_2D, skeleton->tex_id);
+ state.using_skeleton = true;
+ } else {
+ state.using_skeleton = false;
+ }
+ }
+
Item *material_owner = ci->material_owner ? ci->material_owner : ci;
RID material = material_owner->material;
@@ -917,6 +1304,14 @@ void RasterizerCanvasGLES2::canvas_render_items(Item *p_item_list, int p_z, cons
t = t->get_ptr();
+#ifdef TOOLS_ENABLED
+ if (t->detect_normal && texture_hints[i] == ShaderLanguage::ShaderNode::Uniform::HINT_NORMAL) {
+ t->detect_normal(t->detect_normal_ud);
+ }
+#endif
+ if (t->render_target)
+ t->render_target->used_in_frame = true;
+
if (t->redraw_if_visible) {
VisualServerRaster::redraw_request();
}
@@ -938,7 +1333,7 @@ void RasterizerCanvasGLES2::canvas_render_items(Item *p_item_list, int p_z, cons
}
int blend_mode = shader_cache ? shader_cache->canvas_item.blend_mode : RasterizerStorageGLES2::Shader::CanvasItem::BLEND_MODE_MIX;
- bool unshaded = (shader_cache && blend_mode != RasterizerStorageGLES2::Shader::CanvasItem::BLEND_MODE_MIX);
+ bool unshaded = shader_cache && (shader_cache->canvas_item.light_mode == RasterizerStorageGLES2::Shader::CanvasItem::LIGHT_MODE_UNSHADED || (blend_mode != RasterizerStorageGLES2::Shader::CanvasItem::BLEND_MODE_MIX && blend_mode != RasterizerStorageGLES2::Shader::CanvasItem::BLEND_MODE_PMALPHA));
bool reclip = false;
if (last_blend_mode != blend_mode) {
@@ -950,28 +1345,44 @@ void RasterizerCanvasGLES2::canvas_render_items(Item *p_item_list, int p_z, cons
if (storage->frame.current_rt && storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT]) {
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
} else {
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE);
}
} break;
case RasterizerStorageGLES2::Shader::CanvasItem::BLEND_MODE_ADD: {
glBlendEquation(GL_FUNC_ADD);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+ if (storage->frame.current_rt && storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT]) {
+ glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE, GL_SRC_ALPHA, GL_ONE);
+ } else {
+ glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE, GL_ZERO, GL_ONE);
+ }
} break;
case RasterizerStorageGLES2::Shader::CanvasItem::BLEND_MODE_SUB: {
glBlendEquation(GL_FUNC_REVERSE_SUBTRACT);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+ if (storage->frame.current_rt && storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT]) {
+ glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE, GL_SRC_ALPHA, GL_ONE);
+ } else {
+ glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE, GL_ZERO, GL_ONE);
+ }
} break;
case RasterizerStorageGLES2::Shader::CanvasItem::BLEND_MODE_MUL: {
glBlendEquation(GL_FUNC_ADD);
- glBlendFunc(GL_DST_COLOR, GL_ZERO);
+ if (storage->frame.current_rt && storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT]) {
+ glBlendFuncSeparate(GL_DST_COLOR, GL_ZERO, GL_DST_ALPHA, GL_ZERO);
+ } else {
+ glBlendFuncSeparate(GL_DST_COLOR, GL_ZERO, GL_ZERO, GL_ONE);
+ }
} break;
case RasterizerStorageGLES2::Shader::CanvasItem::BLEND_MODE_PMALPHA: {
glBlendEquation(GL_FUNC_ADD);
- glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+ if (storage->frame.current_rt && storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT]) {
+ glBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+ } else {
+ glBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE);
+ }
} break;
}
}
@@ -983,10 +1394,134 @@ void RasterizerCanvasGLES2::canvas_render_items(Item *p_item_list, int p_z, cons
_set_uniforms();
- _canvas_item_render_commands(p_item_list, NULL, reclip, material_ptr);
+ if (unshaded || (state.uniforms.final_modulate.a > 0.001 && (!shader_cache || shader_cache->canvas_item.light_mode != RasterizerStorageGLES2::Shader::CanvasItem::LIGHT_MODE_LIGHT_ONLY) && !ci->light_masked))
+ _canvas_item_render_commands(p_item_list, NULL, reclip, material_ptr);
rebind_shader = true; // hacked in for now.
+ if ((blend_mode == RasterizerStorageGLES2::Shader::CanvasItem::BLEND_MODE_MIX || blend_mode == RasterizerStorageGLES2::Shader::CanvasItem::BLEND_MODE_PMALPHA) && p_light && !unshaded) {
+
+ Light *light = p_light;
+ bool light_used = false;
+ VS::CanvasLightMode mode = VS::CANVAS_LIGHT_MODE_ADD;
+ state.uniforms.final_modulate = ci->final_modulate; // remove the canvas modulate
+
+ while (light) {
+
+ if (ci->light_mask & light->item_mask && p_z >= light->z_min && p_z <= light->z_max && ci->global_rect_cache.intersects_transformed(light->xform_cache, light->rect_cache)) {
+
+ //intersects this light
+
+ if (!light_used || mode != light->mode) {
+
+ mode = light->mode;
+
+ switch (mode) {
+
+ case VS::CANVAS_LIGHT_MODE_ADD: {
+ glBlendEquation(GL_FUNC_ADD);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+
+ } break;
+ case VS::CANVAS_LIGHT_MODE_SUB: {
+ glBlendEquation(GL_FUNC_REVERSE_SUBTRACT);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+ } break;
+ case VS::CANVAS_LIGHT_MODE_MIX:
+ case VS::CANVAS_LIGHT_MODE_MASK: {
+ glBlendEquation(GL_FUNC_ADD);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ } break;
+ }
+ }
+
+ if (!light_used) {
+
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_LIGHTING, true);
+ light_used = true;
+ }
+
+ bool has_shadow = light->shadow_buffer.is_valid() && ci->light_mask & light->item_shadow_mask;
+
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_SHADOWS, has_shadow);
+ if (has_shadow) {
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::SHADOW_USE_GRADIENT, light->shadow_gradient_length > 0);
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::SHADOW_FILTER_NEAREST, light->shadow_filter == VS::CANVAS_LIGHT_FILTER_NONE);
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::SHADOW_FILTER_PCF3, light->shadow_filter == VS::CANVAS_LIGHT_FILTER_PCF3);
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::SHADOW_FILTER_PCF5, light->shadow_filter == VS::CANVAS_LIGHT_FILTER_PCF5);
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::SHADOW_FILTER_PCF7, light->shadow_filter == VS::CANVAS_LIGHT_FILTER_PCF7);
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::SHADOW_FILTER_PCF9, light->shadow_filter == VS::CANVAS_LIGHT_FILTER_PCF9);
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::SHADOW_FILTER_PCF13, light->shadow_filter == VS::CANVAS_LIGHT_FILTER_PCF13);
+ }
+
+ state.canvas_shader.bind();
+ state.using_light = light;
+ state.using_shadow = has_shadow;
+
+ //always re-set uniforms, since light parameters changed
+ _set_uniforms();
+
+ glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - 4);
+ RasterizerStorageGLES2::Texture *t = storage->texture_owner.getornull(light->texture);
+ if (!t) {
+ glBindTexture(GL_TEXTURE_2D, storage->resources.white_tex);
+ } else {
+ t = t->get_ptr();
+
+ glBindTexture(t->target, t->tex_id);
+ }
+
+ glActiveTexture(GL_TEXTURE0);
+ _canvas_item_render_commands(p_item_list, NULL, reclip, material_ptr); //redraw using light
+
+ state.using_light = NULL;
+ }
+
+ light = light->next_ptr;
+ }
+
+ if (light_used) {
+
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_LIGHTING, false);
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_SHADOWS, false);
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::SHADOW_FILTER_NEAREST, false);
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::SHADOW_FILTER_PCF3, false);
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::SHADOW_FILTER_PCF5, false);
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::SHADOW_FILTER_PCF7, false);
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::SHADOW_FILTER_PCF9, false);
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::SHADOW_FILTER_PCF13, false);
+
+ state.canvas_shader.bind();
+
+ last_blend_mode = -1;
+
+ /*
+ //this is set again, so it should not be needed anyway?
+ state.canvas_item_modulate = unshaded ? ci->final_modulate : Color(
+ ci->final_modulate.r * p_modulate.r,
+ ci->final_modulate.g * p_modulate.g,
+ ci->final_modulate.b * p_modulate.b,
+ ci->final_modulate.a * p_modulate.a );
+
+
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::MODELVIEW_MATRIX,state.final_transform);
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::EXTRA_MATRIX,Transform2D());
+ state.canvas_shader.set_uniform(CanvasShaderGLES2::FINAL_MODULATE,state.canvas_item_modulate);
+
+ glBlendEquation(GL_FUNC_ADD);
+
+ if (storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT]) {
+ glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+ } else {
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ //@TODO RESET canvas_blend_mode
+ */
+ }
+ }
+
if (reclip) {
glEnable(GL_SCISSOR_TEST);
int y = storage->frame.current_rt->height - (current_clip->final_clip_rect.position.y + current_clip->final_clip_rect.size.y);
@@ -1001,14 +1536,129 @@ void RasterizerCanvasGLES2::canvas_render_items(Item *p_item_list, int p_z, cons
if (current_clip) {
glDisable(GL_SCISSOR_TEST);
}
+
+ state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_SKELETON, false);
}
void RasterizerCanvasGLES2::canvas_debug_viewport_shadows(Light *p_lights_with_shadow) {
}
void RasterizerCanvasGLES2::canvas_light_shadow_buffer_update(RID p_buffer, const Transform2D &p_light_xform, int p_light_mask, float p_near, float p_far, LightOccluderInstance *p_occluders, CameraMatrix *p_xform_cache) {
-}
+ RasterizerStorageGLES2::CanvasLightShadow *cls = storage->canvas_light_shadow_owner.get(p_buffer);
+ ERR_FAIL_COND(!cls);
+
+ glDisable(GL_BLEND);
+ glDisable(GL_SCISSOR_TEST);
+ glDisable(GL_DITHER);
+ glDisable(GL_CULL_FACE);
+ glDepthFunc(GL_LEQUAL);
+ glEnable(GL_DEPTH_TEST);
+ glDepthMask(true);
+
+ glBindFramebuffer(GL_FRAMEBUFFER, cls->fbo);
+
+ state.canvas_shadow_shader.set_conditional(CanvasShadowShaderGLES2::USE_RGBA_SHADOWS, storage->config.use_rgba_2d_shadows);
+ state.canvas_shadow_shader.bind();
+
+ glViewport(0, 0, cls->size, cls->height);
+ glClearDepth(1.0f);
+ glClearColor(1, 1, 1, 1);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ VS::CanvasOccluderPolygonCullMode cull = VS::CANVAS_OCCLUDER_POLYGON_CULL_DISABLED;
+
+ for (int i = 0; i < 4; i++) {
+
+ //make sure it remains orthogonal, makes easy to read angle later
+
+ Transform light;
+ light.origin[0] = p_light_xform[2][0];
+ light.origin[1] = p_light_xform[2][1];
+ light.basis[0][0] = p_light_xform[0][0];
+ light.basis[0][1] = p_light_xform[1][0];
+ light.basis[1][0] = p_light_xform[0][1];
+ light.basis[1][1] = p_light_xform[1][1];
+
+ //light.basis.scale(Vector3(to_light.elements[0].length(),to_light.elements[1].length(),1));
+
+ //p_near=1;
+ CameraMatrix projection;
+ {
+ real_t fov = 90;
+ real_t nearp = p_near;
+ real_t farp = p_far;
+ real_t aspect = 1.0;
+
+ real_t ymax = nearp * Math::tan(Math::deg2rad(fov * 0.5));
+ real_t ymin = -ymax;
+ real_t xmin = ymin * aspect;
+ real_t xmax = ymax * aspect;
+
+ projection.set_frustum(xmin, xmax, ymin, ymax, nearp, farp);
+ }
+
+ Vector3 cam_target = Basis(Vector3(0, 0, Math_PI * 2 * (i / 4.0))).xform(Vector3(0, 1, 0));
+ projection = projection * CameraMatrix(Transform().looking_at(cam_target, Vector3(0, 0, -1)).affine_inverse());
+
+ state.canvas_shadow_shader.set_uniform(CanvasShadowShaderGLES2::PROJECTION_MATRIX, projection);
+ state.canvas_shadow_shader.set_uniform(CanvasShadowShaderGLES2::LIGHT_MATRIX, light);
+ state.canvas_shadow_shader.set_uniform(CanvasShadowShaderGLES2::DISTANCE_NORM, 1.0 / p_far);
+
+ if (i == 0)
+ *p_xform_cache = projection;
+
+ glViewport(0, (cls->height / 4) * i, cls->size, cls->height / 4);
+
+ LightOccluderInstance *instance = p_occluders;
+
+ while (instance) {
+
+ RasterizerStorageGLES2::CanvasOccluder *cc = storage->canvas_occluder_owner.get(instance->polygon_buffer);
+ if (!cc || cc->len == 0 || !(p_light_mask & instance->light_mask)) {
+
+ instance = instance->next;
+ continue;
+ }
+
+ state.canvas_shadow_shader.set_uniform(CanvasShadowShaderGLES2::WORLD_MATRIX, instance->xform_cache);
+ if (cull != instance->cull_cache) {
+
+ cull = instance->cull_cache;
+ switch (cull) {
+ case VS::CANVAS_OCCLUDER_POLYGON_CULL_DISABLED: {
+
+ glDisable(GL_CULL_FACE);
+
+ } break;
+ case VS::CANVAS_OCCLUDER_POLYGON_CULL_CLOCKWISE: {
+
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_FRONT);
+ } break;
+ case VS::CANVAS_OCCLUDER_POLYGON_CULL_COUNTER_CLOCKWISE: {
+
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+
+ } break;
+ }
+ }
+
+ glBindBuffer(GL_ARRAY_BUFFER, cc->vertex_id);
+ glEnableVertexAttribArray(VS::ARRAY_VERTEX);
+ glVertexAttribPointer(VS::ARRAY_VERTEX, 3, GL_FLOAT, false, 0, 0);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cc->index_id);
+
+ glDrawElements(GL_TRIANGLES, cc->len * 3, GL_UNSIGNED_SHORT, 0);
+
+ instance = instance->next;
+ }
+ }
+
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+}
void RasterizerCanvasGLES2::reset_canvas() {
glDisable(GL_CULL_FACE);
@@ -1024,7 +1674,7 @@ void RasterizerCanvasGLES2::reset_canvas() {
}
// bind the back buffer to a texture so shaders can use it.
- // It should probably use texture unit -3 (as GLES3 does as well) but currently that's buggy.
+ // It should probably use texture unit -3 (as GLES2 does as well) but currently that's buggy.
// keeping this for now as there's nothing else that uses texture unit 2
// TODO ^
if (storage->frame.current_rt) {
@@ -1087,6 +1737,64 @@ void RasterizerCanvasGLES2::draw_lens_distortion_rect(const Rect2 &p_rect, float
}
void RasterizerCanvasGLES2::draw_window_margins(int *black_margin, RID *black_image) {
+
+ Vector2 window_size = OS::get_singleton()->get_window_size();
+ int window_h = window_size.height;
+ int window_w = window_size.width;
+
+ glBindFramebuffer(GL_FRAMEBUFFER, storage->system_fbo);
+ glViewport(0, 0, window_size.width, window_size.height);
+ canvas_begin();
+
+ if (black_image[MARGIN_LEFT].is_valid()) {
+ _bind_canvas_texture(black_image[MARGIN_LEFT], RID());
+ Size2 sz(storage->texture_get_width(black_image[MARGIN_LEFT]), storage->texture_get_height(black_image[MARGIN_LEFT]));
+ draw_generic_textured_rect(Rect2(0, 0, black_margin[MARGIN_LEFT], window_h), Rect2(0, 0, sz.x, sz.y));
+ } else if (black_margin[MARGIN_LEFT]) {
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D, storage->resources.black_tex);
+
+ draw_generic_textured_rect(Rect2(0, 0, black_margin[MARGIN_LEFT], window_h), Rect2(0, 0, 1, 1));
+ }
+
+ if (black_image[MARGIN_RIGHT].is_valid()) {
+ _bind_canvas_texture(black_image[MARGIN_RIGHT], RID());
+ Size2 sz(storage->texture_get_width(black_image[MARGIN_RIGHT]), storage->texture_get_height(black_image[MARGIN_RIGHT]));
+ draw_generic_textured_rect(Rect2(window_w - black_margin[MARGIN_RIGHT], 0, black_margin[MARGIN_RIGHT], window_h), Rect2(0, 0, sz.x, sz.y));
+ } else if (black_margin[MARGIN_RIGHT]) {
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D, storage->resources.black_tex);
+
+ draw_generic_textured_rect(Rect2(window_w - black_margin[MARGIN_RIGHT], 0, black_margin[MARGIN_RIGHT], window_h), Rect2(0, 0, 1, 1));
+ }
+
+ if (black_image[MARGIN_TOP].is_valid()) {
+ _bind_canvas_texture(black_image[MARGIN_TOP], RID());
+
+ Size2 sz(storage->texture_get_width(black_image[MARGIN_TOP]), storage->texture_get_height(black_image[MARGIN_TOP]));
+ draw_generic_textured_rect(Rect2(0, 0, window_w, black_margin[MARGIN_TOP]), Rect2(0, 0, sz.x, sz.y));
+
+ } else if (black_margin[MARGIN_TOP]) {
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D, storage->resources.black_tex);
+
+ draw_generic_textured_rect(Rect2(0, 0, window_w, black_margin[MARGIN_TOP]), Rect2(0, 0, 1, 1));
+ }
+
+ if (black_image[MARGIN_BOTTOM].is_valid()) {
+
+ _bind_canvas_texture(black_image[MARGIN_BOTTOM], RID());
+
+ Size2 sz(storage->texture_get_width(black_image[MARGIN_BOTTOM]), storage->texture_get_height(black_image[MARGIN_BOTTOM]));
+ draw_generic_textured_rect(Rect2(0, window_h - black_margin[MARGIN_BOTTOM], window_w, black_margin[MARGIN_BOTTOM]), Rect2(0, 0, sz.x, sz.y));
+
+ } else if (black_margin[MARGIN_BOTTOM]) {
+
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D, storage->resources.black_tex);
+
+ draw_generic_textured_rect(Rect2(0, window_h - black_margin[MARGIN_BOTTOM], window_w, black_margin[MARGIN_BOTTOM]), Rect2(0, 0, 1, 1));
+ }
}
void RasterizerCanvasGLES2::initialize() {
@@ -1122,8 +1830,8 @@ void RasterizerCanvasGLES2::initialize() {
glBindBuffer(GL_ARRAY_BUFFER, 0);
- uint32_t index_size = GLOBAL_DEF("rendering/limits/buffers/canvas_polygon_index_size_kb", 128);
- ProjectSettings::get_singleton()->set_custom_property_info("rendering/limits/buffers/canvas_polygon_index_size_kb", PropertyInfo(Variant::INT, "rendering/limits/buffers/canvas_polygon_index_size_kb", PROPERTY_HINT_RANGE, "0,256,1,or_greater"));
+ uint32_t index_size = GLOBAL_DEF("rendering/limits/buffers/canvas_polygon_index_buffer_size_kb", 128);
+ ProjectSettings::get_singleton()->set_custom_property_info("rendering/limits/buffers/canvas_polygon_index_buffer_size_kb", PropertyInfo(Variant::INT, "rendering/limits/buffers/canvas_polygon_index_buffer_size_kb", PROPERTY_HINT_RANGE, "0,256,1,or_greater"));
index_size *= 1024; // kb
glGenBuffers(1, &data.polygon_index_buffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.polygon_index_buffer);
@@ -1194,6 +1902,8 @@ void RasterizerCanvasGLES2::initialize() {
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
+ state.canvas_shadow_shader.init();
+
state.canvas_shader.init();
state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_TEXTURE_RECT, true);
@@ -1203,10 +1913,18 @@ void RasterizerCanvasGLES2::initialize() {
state.lens_shader.init();
state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_PIXEL_SNAP, GLOBAL_DEF("rendering/quality/2d/use_pixel_snap", false));
+
+ state.using_light = NULL;
}
void RasterizerCanvasGLES2::finalize() {
}
RasterizerCanvasGLES2::RasterizerCanvasGLES2() {
+#ifdef GLES_OVER_GL
+ use_nvidia_rect_workaround = GLOBAL_GET("rendering/quality/2d/gles2_use_nvidia_rect_flicker_workaround");
+#else
+ // Not needed (a priori) on GLES devices
+ use_nvidia_rect_workaround = false;
+#endif
}
diff --git a/drivers/gles2/rasterizer_canvas_gles2.h b/drivers/gles2/rasterizer_canvas_gles2.h
index cf1c239b6e..221427198a 100644
--- a/drivers/gles2/rasterizer_canvas_gles2.h
+++ b/drivers/gles2/rasterizer_canvas_gles2.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#ifndef RASTERIZERCANVASGLES2_H
#define RASTERIZERCANVASGLES2_H
@@ -36,12 +37,16 @@
#include "shaders/canvas.glsl.gen.h"
#include "shaders/lens_distorted.glsl.gen.h"
-// #include "shaders/canvas_shadow.glsl.gen.h"
+#include "shaders/canvas_shadow.glsl.gen.h"
class RasterizerSceneGLES2;
class RasterizerCanvasGLES2 : public RasterizerCanvas {
public:
+ enum {
+ INSTANCE_ATTRIB_BASE = 8,
+ };
+
struct Uniforms {
Transform projection_matrix;
@@ -70,17 +75,24 @@ public:
Uniforms uniforms;
bool canvas_texscreen_used;
CanvasShaderGLES2 canvas_shader;
- // CanvasShadowShaderGLES3 canvas_shadow_shader;
+ CanvasShadowShaderGLES2 canvas_shadow_shader;
LensDistortedShaderGLES2 lens_shader;
bool using_texture_rect;
bool using_ninepatch;
+ bool using_skeleton;
+
+ Transform2D skeleton_transform;
+ Transform2D skeleton_transform_inverse;
+ Vector2i skeleton_texture_size;
RID current_tex;
RID current_normal;
RasterizerStorageGLES2::Texture *current_tex_ptr;
Transform vp;
+ Light *using_light;
+ bool using_shadow;
} state;
@@ -90,6 +102,8 @@ public:
RasterizerStorageGLES2 *storage;
+ bool use_nvidia_rect_workaround;
+
virtual RID light_internal_create();
virtual void light_internal_update(RID p_rid, Light *p_light);
virtual void light_internal_free(RID p_rid);
@@ -99,10 +113,8 @@ public:
virtual void canvas_begin();
virtual void canvas_end();
- _FORCE_INLINE_ void _set_texture_rect_mode(bool p_enable, bool p_ninepatch = false);
-
_FORCE_INLINE_ void _draw_gui_primitive(int p_points, const Vector2 *p_vertices, const Color *p_colors, const Vector2 *p_uvs);
- _FORCE_INLINE_ void _draw_polygon(const int *p_indices, int p_index_count, int p_vertex_count, const Vector2 *p_vertices, const Vector2 *p_uvs, const Color *p_colors, bool p_singlecolor);
+ _FORCE_INLINE_ void _draw_polygon(const int *p_indices, int p_index_count, int p_vertex_count, const Vector2 *p_vertices, const Vector2 *p_uvs, const Color *p_colors, bool p_singlecolor, const float *p_weights = NULL, const int *p_bones = NULL);
_FORCE_INLINE_ void _draw_generic(GLuint p_primitive, int p_vertex_count, const Vector2 *p_vertices, const Vector2 *p_uvs, const Color *p_colors, bool p_singlecolor);
_FORCE_INLINE_ void _canvas_item_render_commands(Item *p_item, Item *current_clip, bool &reclip, RasterizerStorageGLES2::Material *p_material);
diff --git a/drivers/gles2/rasterizer_gles2.cpp b/drivers/gles2/rasterizer_gles2.cpp
index 175587b1bb..71b826d689 100644
--- a/drivers/gles2/rasterizer_gles2.cpp
+++ b/drivers/gles2/rasterizer_gles2.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -58,14 +58,21 @@
#define _EXT_DEBUG_SEVERITY_LOW_ARB 0x9148
#define _EXT_DEBUG_OUTPUT 0x92E0
-#if (defined WINDOWS_ENABLED) && !(defined UWP_ENABLED)
+#ifndef GLAPIENTRY
+#if defined(WINDOWS_ENABLED) && !defined(UWP_ENABLED)
#define GLAPIENTRY APIENTRY
#else
#define GLAPIENTRY
#endif
+#endif
-#if !defined(GLES_OVER_GL) && !defined(IPHONE_ENABLED)
-// Used for debugging on mobile, but not iOS as EGL is not available
+#ifndef IPHONE_ENABLED
+// We include EGL below to get debug callback on GLES2 platforms,
+// but EGL is not available on iOS.
+#define CAN_DEBUG
+#endif
+
+#if !defined(GLES_OVER_GL) && defined(CAN_DEBUG)
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <GLES2/gl2platform.h>
@@ -78,7 +85,7 @@
#define strcpy strcpy_s
#endif
-#ifndef IPHONE_ENABLED
+#ifdef CAN_DEBUG
static void GLAPIENTRY _gl_debug_print(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const GLvoid *userParam) {
if (type == _EXT_DEBUG_TYPE_OTHER_ARB)
@@ -126,7 +133,7 @@ static void GLAPIENTRY _gl_debug_print(GLenum source, GLenum type, GLuint id, GL
ERR_PRINTS(output);
}
-#endif // IPHONE_ENABLED
+#endif // CAN_DEBUG
typedef void (*DEBUGPROCARB)(GLenum source,
GLenum type,
@@ -220,6 +227,7 @@ void RasterizerGLES2::initialize() {
#endif // GLAD_ENABLED
// For debugging
+#ifdef CAN_DEBUG
#ifdef GLES_OVER_GL
if (OS::get_singleton()->is_stdout_verbose() && GLAD_GL_ARB_debug_output) {
glDebugMessageControlARB(_EXT_DEBUG_SOURCE_API_ARB, _EXT_DEBUG_TYPE_ERROR_ARB, _EXT_DEBUG_SEVERITY_HIGH_ARB, 0, NULL, GL_TRUE);
@@ -235,7 +243,6 @@ void RasterizerGLES2::initialize() {
*/
}
#else
-#ifndef IPHONE_ENABLED
if (OS::get_singleton()->is_stdout_verbose()) {
DebugMessageCallbackARB callback = (DebugMessageCallbackARB)eglGetProcAddress("glDebugMessageCallback");
if (!callback) {
@@ -250,8 +257,8 @@ void RasterizerGLES2::initialize() {
glEnable(_EXT_DEBUG_OUTPUT);
}
}
-#endif // !IPHONE_ENABLED
#endif // GLES_OVER_GL
+#endif // CAN_DEBUG
const GLubyte *renderer = glGetString(GL_RENDERER);
print_line("OpenGL ES 2.0 Renderer: " + String((const char *)renderer));
@@ -395,7 +402,6 @@ void RasterizerGLES2::blit_render_target_to_screen(RID p_render_target, const Re
ERR_FAIL_COND(!rt);
canvas->state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_TEXTURE_RECT, true);
- canvas->state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_UV_ATTRIBUTE, false);
canvas->state.canvas_shader.set_custom_shader(0);
canvas->state.canvas_shader.bind();
diff --git a/drivers/gles2/rasterizer_gles2.h b/drivers/gles2/rasterizer_gles2.h
index 97f8ee7c1c..ed4eeb84d2 100644
--- a/drivers/gles2/rasterizer_gles2.h
+++ b/drivers/gles2/rasterizer_gles2.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/gles2/rasterizer_scene_gles2.cpp b/drivers/gles2/rasterizer_scene_gles2.cpp
index 6eafdb0e1c..e4783e907b 100644
--- a/drivers/gles2/rasterizer_scene_gles2.cpp
+++ b/drivers/gles2/rasterizer_scene_gles2.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -668,6 +668,13 @@ void RasterizerSceneGLES2::environment_set_sky_custom_fov(RID p_env, float p_sca
env->sky_custom_fov = p_scale;
}
+void RasterizerSceneGLES2::environment_set_sky_orientation(RID p_env, const Basis &p_orientation) {
+ Environment *env = environment_owner.getornull(p_env);
+ ERR_FAIL_COND(!env);
+
+ env->sky_orientation = p_orientation;
+}
+
void RasterizerSceneGLES2::environment_set_bg_color(RID p_env, const Color &p_color) {
Environment *env = environment_owner.getornull(p_env);
ERR_FAIL_COND(!env);
@@ -708,7 +715,7 @@ void RasterizerSceneGLES2::environment_set_dof_blur_near(RID p_env, bool p_enabl
ERR_FAIL_COND(!env);
}
-void RasterizerSceneGLES2::environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, VS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, bool p_bicubic_upscale) {
+void RasterizerSceneGLES2::environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, VS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, bool p_bicubic_upscale) {
Environment *env = environment_owner.getornull(p_env);
ERR_FAIL_COND(!env);
}
@@ -1238,6 +1245,24 @@ bool RasterizerSceneGLES2::_setup_material(RasterizerStorageGLES2::Material *p_m
t = t->get_ptr();
+ if (t->redraw_if_visible) { //must check before proxy because this is often used with proxies
+ VisualServerRaster::redraw_request();
+ }
+
+#ifdef TOOLS_ENABLED
+ if (t->detect_3d) {
+ t->detect_3d(t->detect_3d_ud);
+ }
+#endif
+
+#ifdef TOOLS_ENABLED
+ if (t->detect_normal && texture_hints[i] == ShaderLanguage::ShaderNode::Uniform::HINT_NORMAL) {
+ t->detect_normal(t->detect_normal_ud);
+ }
+#endif
+ if (t->render_target)
+ t->render_target->used_in_frame = true;
+
glBindTexture(t->target, t->tex_id);
if (i == 0) {
state.current_main_tex = t->tex_id;
@@ -2017,6 +2042,8 @@ void RasterizerSceneGLES2::_render_render_list(RenderList::Element **p_elements,
ShadowAtlas *shadow_atlas = shadow_atlas_owner.getornull(p_shadow_atlas);
+ Vector2 viewport_size = state.viewport_size;
+
Vector2 screen_pixel_size = state.screen_pixel_size;
bool use_radiance_map = false;
@@ -2281,7 +2308,13 @@ void RasterizerSceneGLES2::_render_render_list(RenderList::Element **p_elements,
}
} else {
if (use_radiance_map) {
- state.scene_shader.set_uniform(SceneShaderGLES2::RADIANCE_INVERSE_XFORM, p_view_transform);
+ if (p_env) {
+ Transform sky_orientation(p_env->sky_orientation, Vector3(0.0, 0.0, 0.0));
+ state.scene_shader.set_uniform(SceneShaderGLES2::RADIANCE_INVERSE_XFORM, sky_orientation.affine_inverse() * p_view_transform);
+ } else {
+ // would be a bit weird if we dont have this...
+ state.scene_shader.set_uniform(SceneShaderGLES2::RADIANCE_INVERSE_XFORM, p_view_transform);
+ }
}
if (p_env) {
@@ -2335,6 +2368,8 @@ void RasterizerSceneGLES2::_render_render_list(RenderList::Element **p_elements,
state.scene_shader.set_uniform(SceneShaderGLES2::TIME, storage->frame.time[0]);
+ state.scene_shader.set_uniform(SceneShaderGLES2::VIEWPORT_SIZE, viewport_size);
+
state.scene_shader.set_uniform(SceneShaderGLES2::SCREEN_PIXEL_SIZE, screen_pixel_size);
}
@@ -2389,7 +2424,7 @@ void RasterizerSceneGLES2::_render_render_list(RenderList::Element **p_elements,
state.scene_shader.set_conditional(SceneShaderGLES2::FOG_HEIGHT_ENABLED, false);
}
-void RasterizerSceneGLES2::_draw_sky(RasterizerStorageGLES2::Sky *p_sky, const CameraMatrix &p_projection, const Transform &p_transform, bool p_vflip, float p_custom_fov, float p_energy) {
+void RasterizerSceneGLES2::_draw_sky(RasterizerStorageGLES2::Sky *p_sky, const CameraMatrix &p_projection, const Transform &p_transform, bool p_vflip, float p_custom_fov, float p_energy, const Basis &p_sky_orientation) {
ERR_FAIL_COND(!p_sky);
RasterizerStorageGLES2::Texture *tex = storage->texture_owner.getornull(p_sky->panorama);
@@ -2469,6 +2504,10 @@ void RasterizerSceneGLES2::_draw_sky(RasterizerStorageGLES2::Sky *p_sky, const C
storage->shaders.copy.set_conditional(CopyShaderGLES2::USE_CUSTOM_ALPHA, false);
storage->shaders.copy.bind();
storage->shaders.copy.set_uniform(CopyShaderGLES2::MULTIPLIER, p_energy);
+
+ // don't know why but I always have problems setting a uniform mat3, so we're using a transform
+ storage->shaders.copy.set_uniform(CopyShaderGLES2::SKY_TRANSFORM, Transform(p_sky_orientation, Vector3(0.0, 0.0, 0.0)).affine_inverse());
+
if (asymmetrical) {
// pack the bits we need from our projection matrix
storage->shaders.copy.set_uniform(CopyShaderGLES2::ASYM_PROJ, camera.matrix[2][0], camera.matrix[0][0], camera.matrix[2][1], camera.matrix[1][1]);
@@ -2506,8 +2545,6 @@ void RasterizerSceneGLES2::render_scene(const Transform &p_cam_transform, const
}
current_fb = probe->fbo[p_reflection_probe_pass];
- state.screen_pixel_size.x = 1.0 / probe->probe_ptr->resolution;
- state.screen_pixel_size.y = 1.0 / probe->probe_ptr->resolution;
viewport_width = probe->probe_ptr->resolution;
viewport_height = probe->probe_ptr->resolution;
@@ -2518,11 +2555,16 @@ void RasterizerSceneGLES2::render_scene(const Transform &p_cam_transform, const
state.render_no_shadows = false;
current_fb = storage->frame.current_rt->fbo;
env = environment_owner.getornull(p_environment);
- state.screen_pixel_size.x = 1.0 / storage->frame.current_rt->width;
- state.screen_pixel_size.y = 1.0 / storage->frame.current_rt->height;
+
viewport_width = storage->frame.current_rt->width;
viewport_height = storage->frame.current_rt->height;
}
+
+ state.viewport_size.x = viewport_width;
+ state.viewport_size.y = viewport_height;
+ state.screen_pixel_size.x = 1.0 / viewport_width;
+ state.screen_pixel_size.y = 1.0 / viewport_height;
+
//push back the directional lights
if (p_light_cull_count) {
@@ -2587,9 +2629,30 @@ void RasterizerSceneGLES2::render_scene(const Transform &p_cam_transform, const
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ // clear color
- storage->frame.clear_request = false;
+ Color clear_color(0, 0, 0, 0);
+
+ if (storage->frame.current_rt && storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT]) {
+ clear_color = Color(0, 0, 0, 0);
+ storage->frame.clear_request = false;
+ } else if (!env || env->bg_mode == VS::ENV_BG_CLEAR_COLOR || env->bg_mode == VS::ENV_BG_SKY) {
+ if (storage->frame.clear_request) {
+ clear_color = storage->frame.clear_request_color;
+ storage->frame.clear_request = false;
+ }
+ } else if (env->bg_mode == VS::ENV_BG_CANVAS || env->bg_mode == VS::ENV_BG_COLOR || env->bg_mode == VS::ENV_BG_COLOR_SKY) {
+ clear_color = env->bg_color;
+ storage->frame.clear_request = false;
+ } else {
+ storage->frame.clear_request = false;
+ }
+
+ if (!env || env->bg_mode != VS::ENV_BG_KEEP) {
+ glClearColor(clear_color.r, clear_color.g, clear_color.b, clear_color.a);
+ }
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glVertexAttrib4f(VS::ARRAY_COLOR, 1, 1, 1, 1);
@@ -2620,7 +2683,7 @@ void RasterizerSceneGLES2::render_scene(const Transform &p_cam_transform, const
if (env && env->bg_mode == VS::ENV_BG_SKY && (!storage->frame.current_rt || !storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT])) {
if (sky && sky->panorama.is_valid()) {
- _draw_sky(sky, p_cam_projection, p_cam_transform, false, env->sky_custom_fov, env->bg_energy);
+ _draw_sky(sky, p_cam_projection, p_cam_transform, false, env->sky_custom_fov, env->bg_energy, env->sky_orientation);
}
}
diff --git a/drivers/gles2/rasterizer_scene_gles2.h b/drivers/gles2/rasterizer_scene_gles2.h
index 7d9920158f..42ac621e45 100644
--- a/drivers/gles2/rasterizer_scene_gles2.h
+++ b/drivers/gles2/rasterizer_scene_gles2.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -211,6 +211,8 @@ public:
bool render_no_shadows;
+ Vector2 viewport_size;
+
Vector2 screen_pixel_size;
} state;
@@ -342,6 +344,7 @@ public:
RID sky;
float sky_custom_fov;
+ Basis sky_orientation;
Color bg_color;
float bg_energy;
@@ -369,33 +372,28 @@ public:
float fog_height_max;
float fog_height_curve;
- Environment() {
- bg_mode = VS::ENV_BG_CLEAR_COLOR;
- sky_custom_fov = 0.0;
- bg_energy = 1.0;
- sky_ambient = 0;
- ambient_energy = 1.0;
- ambient_sky_contribution = 0.0;
- canvas_max_layer = 0;
-
- fog_enabled = false;
- fog_color = Color(0.5, 0.5, 0.5);
- fog_sun_color = Color(0.8, 0.8, 0.0);
- fog_sun_amount = 0;
-
- fog_depth_enabled = true;
-
- fog_depth_begin = 10;
- fog_depth_end = 0;
- fog_depth_curve = 1;
-
- fog_transmit_enabled = true;
- fog_transmit_curve = 1;
-
- fog_height_enabled = false;
- fog_height_min = 0;
- fog_height_max = 100;
- fog_height_curve = 1;
+ Environment() :
+ bg_mode(VS::ENV_BG_CLEAR_COLOR),
+ sky_custom_fov(0.0),
+ bg_energy(1.0),
+ sky_ambient(0),
+ ambient_energy(1.0),
+ ambient_sky_contribution(0.0),
+ canvas_max_layer(0),
+ fog_enabled(false),
+ fog_color(Color(0.5, 0.5, 0.5)),
+ fog_sun_color(Color(0.8, 0.8, 0.0)),
+ fog_sun_amount(0),
+ fog_depth_enabled(true),
+ fog_depth_begin(10),
+ fog_depth_end(0),
+ fog_depth_curve(1),
+ fog_transmit_enabled(true),
+ fog_transmit_curve(1),
+ fog_height_enabled(false),
+ fog_height_min(0),
+ fog_height_max(100),
+ fog_height_curve(1) {
}
};
@@ -406,6 +404,7 @@ public:
virtual void environment_set_background(RID p_env, VS::EnvironmentBG p_bg);
virtual void environment_set_sky(RID p_env, RID p_sky);
virtual void environment_set_sky_custom_fov(RID p_env, float p_scale);
+ virtual void environment_set_sky_orientation(RID p_env, const Basis &p_orientation);
virtual void environment_set_bg_color(RID p_env, const Color &p_color);
virtual void environment_set_bg_energy(RID p_env, float p_energy);
virtual void environment_set_canvas_max_layer(RID p_env, int p_max_layer);
@@ -413,7 +412,7 @@ public:
virtual void environment_set_dof_blur_near(RID p_env, bool p_enable, float p_distance, float p_transition, float p_amount, VS::EnvironmentDOFBlurQuality p_quality);
virtual void environment_set_dof_blur_far(RID p_env, bool p_enable, float p_distance, float p_transition, float p_amount, VS::EnvironmentDOFBlurQuality p_quality);
- virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, VS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, bool p_bicubic_upscale);
+ virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, VS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, bool p_bicubic_upscale);
virtual void environment_set_fog(RID p_env, bool p_enable, float p_begin, float p_end, RID p_gradient_texture);
virtual void environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_in, float p_fade_out, float p_depth_tolerance, bool p_roughness);
@@ -657,7 +656,7 @@ public:
bool p_alpha_pass,
bool p_shadow);
- void _draw_sky(RasterizerStorageGLES2::Sky *p_sky, const CameraMatrix &p_projection, const Transform &p_transform, bool p_vflip, float p_custom_fov, float p_energy);
+ void _draw_sky(RasterizerStorageGLES2::Sky *p_sky, const CameraMatrix &p_projection, const Transform &p_transform, bool p_vflip, float p_custom_fov, float p_energy, const Basis &p_sky_orientation);
_FORCE_INLINE_ bool _setup_material(RasterizerStorageGLES2::Material *p_material, bool p_reverse_cull, bool p_alpha_pass, Size2i p_skeleton_tex_size = Size2i(0, 0));
_FORCE_INLINE_ void _setup_geometry(RenderList::Element *p_element, RasterizerStorageGLES2::Skeleton *p_skeleton);
diff --git a/drivers/gles2/rasterizer_storage_gles2.cpp b/drivers/gles2/rasterizer_storage_gles2.cpp
index d646500a23..af698f3988 100644
--- a/drivers/gles2/rasterizer_storage_gles2.cpp
+++ b/drivers/gles2/rasterizer_storage_gles2.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -56,6 +56,8 @@ GLuint RasterizerStorageGLES2::system_fbo = 0;
#define _DEPTH_COMPONENT24_OES 0x81A6
+#define _RED_OES 0x1903
+
void RasterizerStorageGLES2::bind_quad_array() const {
glBindBuffer(GL_ARRAY_BUFFER, resources.quadie);
glVertexAttribPointer(VS::ARRAY_VERTEX, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 4, 0);
@@ -965,7 +967,7 @@ void RasterizerStorageGLES2::sky_set_texture(RID p_sky, RID p_panorama, int p_ra
// attachements for it, so we can fill them by issuing draw calls.
GLuint tmp_fb;
- int size = p_radiance_size;
+ int size = p_radiance_size / 4; //divide by four because its a cubemap (this is an approximation because GLES3 uses a dual paraboloid)
int lod = 0;
@@ -1138,6 +1140,7 @@ void RasterizerStorageGLES2::_update_shader(Shader *p_shader) const {
case VS::SHADER_CANVAS_ITEM: {
+ p_shader->canvas_item.light_mode = Shader::CanvasItem::LIGHT_MODE_NORMAL;
p_shader->canvas_item.blend_mode = Shader::CanvasItem::BLEND_MODE_MIX;
p_shader->canvas_item.uses_screen_texture = false;
@@ -1150,8 +1153,8 @@ void RasterizerStorageGLES2::_update_shader(Shader *p_shader) const {
shaders.actions_canvas.render_mode_values["blend_mul"] = Pair<int *, int>(&p_shader->canvas_item.blend_mode, Shader::CanvasItem::BLEND_MODE_MUL);
shaders.actions_canvas.render_mode_values["blend_premul_alpha"] = Pair<int *, int>(&p_shader->canvas_item.blend_mode, Shader::CanvasItem::BLEND_MODE_PMALPHA);
- // shaders.actions_canvas.render_mode_values["unshaded"] = Pair<int *, int>(&p_shader->canvas_item.light_mode, Shader::CanvasItem::LIGHT_MODE_UNSHADED);
- // shaders.actions_canvas.render_mode_values["light_only"] = Pair<int *, int>(&p_shader->canvas_item.light_mode, Shader::CanvasItem::LIGHT_MODE_LIGHT_ONLY);
+ shaders.actions_canvas.render_mode_values["unshaded"] = Pair<int *, int>(&p_shader->canvas_item.light_mode, Shader::CanvasItem::LIGHT_MODE_UNSHADED);
+ shaders.actions_canvas.render_mode_values["light_only"] = Pair<int *, int>(&p_shader->canvas_item.light_mode, Shader::CanvasItem::LIGHT_MODE_LIGHT_ONLY);
shaders.actions_canvas.usage_flag_pointers["SCREEN_UV"] = &p_shader->canvas_item.uses_screen_uv;
shaders.actions_canvas.usage_flag_pointers["SCREEN_PIXEL_SIZE"] = &p_shader->canvas_item.uses_screen_uv;
@@ -2938,9 +2941,9 @@ void RasterizerStorageGLES2::skeleton_allocate(RID p_skeleton, int p_bones, bool
glBindTexture(GL_TEXTURE_2D, skeleton->tex_id);
#ifdef GLES_OVER_GL
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, p_bones * 3, 1, 0, GL_RGBA, GL_FLOAT, NULL);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, p_bones * (skeleton->use_2d ? 2 : 3), 1, 0, GL_RGBA, GL_FLOAT, NULL);
#else
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, p_bones * 3, 1, 0, GL_RGBA, GL_FLOAT, NULL);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, p_bones * (skeleton->use_2d ? 2 : 3), 1, 0, GL_RGBA, GL_FLOAT, NULL);
#endif
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
@@ -3074,6 +3077,11 @@ Transform2D RasterizerStorageGLES2::skeleton_bone_get_transform_2d(RID p_skeleto
}
void RasterizerStorageGLES2::skeleton_set_base_transform_2d(RID p_skeleton, const Transform2D &p_base_transform) {
+
+ Skeleton *skeleton = skeleton_owner.getornull(p_skeleton);
+ ERR_FAIL_COND(!skeleton);
+
+ skeleton->base_transform_2d = p_base_transform;
}
void RasterizerStorageGLES2::_update_skeleton_transform_buffer(const PoolVector<float> &p_data, size_t p_size) {
@@ -3106,7 +3114,7 @@ void RasterizerStorageGLES2::update_dirty_skeletons() {
if (skeleton->size) {
glBindTexture(GL_TEXTURE_2D, skeleton->tex_id);
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, skeleton->size * 3, 1, GL_RGBA, GL_FLOAT, skeleton->bone_data.ptr());
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, skeleton->size * (skeleton->use_2d ? 2 : 3), 1, GL_RGBA, GL_FLOAT, skeleton->bone_data.ptr());
}
for (Set<RasterizerScene::InstanceBase *>::Element *E = skeleton->instances.front(); E; E = E->next()) {
@@ -3842,6 +3850,10 @@ RID RasterizerStorageGLES2::particles_get_draw_pass_mesh(RID p_particles, int p_
void RasterizerStorageGLES2::update_particles() {
}
+bool RasterizerStorageGLES2::particles_is_inactive(RID p_particles) const {
+ return true;
+}
+
////////
void RasterizerStorageGLES2::instance_add_skeleton(RID p_skeleton, RasterizerScene::InstanceBase *p_instance) {
@@ -4092,6 +4104,7 @@ RID RasterizerStorageGLES2::render_target_create() {
Texture *t = memnew(Texture);
+ t->type = VS::TEXTURE_TYPE_2D;
t->flags = 0;
t->width = 0;
t->height = 0;
@@ -4189,16 +4202,159 @@ void RasterizerStorageGLES2::render_target_set_msaa(RID p_render_target, VS::Vie
/* CANVAS SHADOW */
RID RasterizerStorageGLES2::canvas_light_shadow_buffer_create(int p_width) {
- return RID();
+
+ CanvasLightShadow *cls = memnew(CanvasLightShadow);
+
+ if (p_width > config.max_texture_size)
+ p_width = config.max_texture_size;
+
+ cls->size = p_width;
+ cls->height = 16;
+
+ glActiveTexture(GL_TEXTURE0);
+
+ glGenFramebuffers(1, &cls->fbo);
+ glBindFramebuffer(GL_FRAMEBUFFER, cls->fbo);
+
+ glGenRenderbuffers(1, &cls->depth);
+ glBindRenderbuffer(GL_RENDERBUFFER, cls->depth);
+ glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, cls->size, cls->height);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, cls->depth);
+ glBindRenderbuffer(GL_RENDERBUFFER, 0);
+
+ glGenTextures(1, &cls->distance);
+ glBindTexture(GL_TEXTURE_2D, cls->distance);
+ if (config.use_rgba_2d_shadows) {
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, cls->size, cls->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+ } else {
+#ifdef GLES_OVER_GL
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, cls->size, cls->height, 0, _RED_OES, GL_FLOAT, NULL);
+#else
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_FLOAT, cls->size, cls->height, 0, _RED_OES, GL_FLOAT, NULL);
+#endif
+ }
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, cls->distance, 0);
+
+ GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
+ //printf("errnum: %x\n",status);
+ glBindFramebuffer(GL_FRAMEBUFFER, RasterizerStorageGLES2::system_fbo);
+
+ if (status != GL_FRAMEBUFFER_COMPLETE) {
+ memdelete(cls);
+ ERR_FAIL_COND_V(status != GL_FRAMEBUFFER_COMPLETE, RID());
+ }
+
+ return canvas_light_shadow_owner.make_rid(cls);
}
/* LIGHT SHADOW MAPPING */
RID RasterizerStorageGLES2::canvas_light_occluder_create() {
- return RID();
+
+ CanvasOccluder *co = memnew(CanvasOccluder);
+ co->index_id = 0;
+ co->vertex_id = 0;
+ co->len = 0;
+
+ return canvas_occluder_owner.make_rid(co);
}
void RasterizerStorageGLES2::canvas_light_occluder_set_polylines(RID p_occluder, const PoolVector<Vector2> &p_lines) {
+
+ CanvasOccluder *co = canvas_occluder_owner.get(p_occluder);
+ ERR_FAIL_COND(!co);
+
+ co->lines = p_lines;
+
+ if (p_lines.size() != co->len) {
+
+ if (co->index_id)
+ glDeleteBuffers(1, &co->index_id);
+ if (co->vertex_id)
+ glDeleteBuffers(1, &co->vertex_id);
+
+ co->index_id = 0;
+ co->vertex_id = 0;
+ co->len = 0;
+ }
+
+ if (p_lines.size()) {
+
+ PoolVector<float> geometry;
+ PoolVector<uint16_t> indices;
+ int lc = p_lines.size();
+
+ geometry.resize(lc * 6);
+ indices.resize(lc * 3);
+
+ PoolVector<float>::Write vw = geometry.write();
+ PoolVector<uint16_t>::Write iw = indices.write();
+
+ PoolVector<Vector2>::Read lr = p_lines.read();
+
+ const int POLY_HEIGHT = 16384;
+
+ for (int i = 0; i < lc / 2; i++) {
+
+ vw[i * 12 + 0] = lr[i * 2 + 0].x;
+ vw[i * 12 + 1] = lr[i * 2 + 0].y;
+ vw[i * 12 + 2] = POLY_HEIGHT;
+
+ vw[i * 12 + 3] = lr[i * 2 + 1].x;
+ vw[i * 12 + 4] = lr[i * 2 + 1].y;
+ vw[i * 12 + 5] = POLY_HEIGHT;
+
+ vw[i * 12 + 6] = lr[i * 2 + 1].x;
+ vw[i * 12 + 7] = lr[i * 2 + 1].y;
+ vw[i * 12 + 8] = -POLY_HEIGHT;
+
+ vw[i * 12 + 9] = lr[i * 2 + 0].x;
+ vw[i * 12 + 10] = lr[i * 2 + 0].y;
+ vw[i * 12 + 11] = -POLY_HEIGHT;
+
+ iw[i * 6 + 0] = i * 4 + 0;
+ iw[i * 6 + 1] = i * 4 + 1;
+ iw[i * 6 + 2] = i * 4 + 2;
+
+ iw[i * 6 + 3] = i * 4 + 2;
+ iw[i * 6 + 4] = i * 4 + 3;
+ iw[i * 6 + 5] = i * 4 + 0;
+ }
+
+ //if same buffer len is being set, just use BufferSubData to avoid a pipeline flush
+
+ if (!co->vertex_id) {
+ glGenBuffers(1, &co->vertex_id);
+ glBindBuffer(GL_ARRAY_BUFFER, co->vertex_id);
+ glBufferData(GL_ARRAY_BUFFER, lc * 6 * sizeof(real_t), vw.ptr(), GL_STATIC_DRAW);
+ } else {
+
+ glBindBuffer(GL_ARRAY_BUFFER, co->vertex_id);
+ glBufferSubData(GL_ARRAY_BUFFER, 0, lc * 6 * sizeof(real_t), vw.ptr());
+ }
+
+ glBindBuffer(GL_ARRAY_BUFFER, 0); //unbind
+
+ if (!co->index_id) {
+
+ glGenBuffers(1, &co->index_id);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, co->index_id);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, lc * 3 * sizeof(uint16_t), iw.ptr(), GL_DYNAMIC_DRAW);
+ } else {
+
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, co->index_id);
+ glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, lc * 3 * sizeof(uint16_t), iw.ptr());
+ }
+
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); //unbind
+
+ co->len = lc;
+ }
}
VS::InstanceType RasterizerStorageGLES2::get_base_type(RID p_rid) const {
@@ -4411,6 +4567,30 @@ bool RasterizerStorageGLES2::free(RID p_rid) {
lightmap_capture_data_owner.free(p_rid);
memdelete(lightmap_capture);
return true;
+
+ } else if (canvas_occluder_owner.owns(p_rid)) {
+
+ CanvasOccluder *co = canvas_occluder_owner.get(p_rid);
+ if (co->index_id)
+ glDeleteBuffers(1, &co->index_id);
+ if (co->vertex_id)
+ glDeleteBuffers(1, &co->vertex_id);
+
+ canvas_occluder_owner.free(p_rid);
+ memdelete(co);
+
+ return true;
+
+ } else if (canvas_light_shadow_owner.owns(p_rid)) {
+
+ CanvasLightShadow *cls = canvas_light_shadow_owner.get(p_rid);
+ glDeleteFramebuffers(1, &cls->fbo);
+ glDeleteRenderbuffers(1, &cls->depth);
+ glDeleteTextures(1, &cls->distance);
+ canvas_light_shadow_owner.free(p_rid);
+ memdelete(cls);
+
+ return true;
} else {
return false;
}
@@ -4464,10 +4644,20 @@ void RasterizerStorageGLES2::initialize() {
config.keep_original_textures = false;
config.shrink_textures_x2 = false;
+#ifdef GLES_OVER_GL
+ config.float_texture_supported = true;
+ config.s3tc_supported = true;
+ config.etc1_supported = false;
+#else
config.float_texture_supported = config.extensions.has("GL_ARB_texture_float") || config.extensions.has("GL_OES_texture_float");
config.s3tc_supported = config.extensions.has("GL_EXT_texture_compression_s3tc");
config.etc1_supported = config.extensions.has("GL_OES_compressed_ETC1_RGB8_texture");
-
+#endif
+#ifdef GLES_OVER_GL
+ config.use_rgba_2d_shadows = false;
+#else
+ config.use_rgba_2d_shadows = !(config.float_texture_supported && config.extensions.has("GL_EXT_texture_rg"));
+#endif
frame.count = 0;
frame.delta = 0;
frame.current_rt = NULL;
@@ -4478,6 +4668,8 @@ void RasterizerStorageGLES2::initialize() {
shaders.copy.init();
shaders.cubemap_filter.init();
+ bool ggx_hq = GLOBAL_GET("rendering/quality/reflections/high_quality_ggx.mobile");
+ shaders.cubemap_filter.set_conditional(CubemapFilterShaderGLES2::LOW_QUALITY, !ggx_hq);
{
// quad for copying stuff
diff --git a/drivers/gles2/rasterizer_storage_gles2.h b/drivers/gles2/rasterizer_storage_gles2.h
index 59f911e880..6f3ea25cc9 100644
--- a/drivers/gles2/rasterizer_storage_gles2.h
+++ b/drivers/gles2/rasterizer_storage_gles2.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -76,6 +76,8 @@ public:
bool keep_original_textures;
bool force_vertex_shading;
+
+ bool use_rgba_2d_shadows;
} config;
struct Resources {
@@ -86,6 +88,7 @@ public:
GLuint aniso_tex;
GLuint radical_inverse_vdc_cache_tex;
+ bool use_rgba_2d_shadows;
GLuint quadie;
@@ -131,10 +134,9 @@ public:
}
} render, render_final, snap;
- Info() {
-
- texture_mem = 0;
- vertex_mem = 0;
+ Info() :
+ texture_mem(0),
+ vertex_mem(0) {
render.reset();
render_final.reset();
}
@@ -254,30 +256,32 @@ public:
VisualServer::TextureDetectCallback detect_normal;
void *detect_normal_ud;
- Texture() {
- alloc_width = 0;
- alloc_height = 0;
- target = 0;
-
- stored_cube_sides = 0;
- ignore_mipmaps = false;
- render_target = NULL;
- flags = width = height = 0;
- tex_id = 0;
- data_size = 0;
- format = Image::FORMAT_L8;
- active = false;
- compressed = false;
- total_data_size = 0;
- mipmaps = 0;
- detect_3d = NULL;
- detect_3d_ud = NULL;
- detect_srgb = NULL;
- detect_srgb_ud = NULL;
- detect_normal = NULL;
- detect_normal_ud = NULL;
- proxy = NULL;
- redraw_if_visible = false;
+ Texture() :
+ proxy(NULL),
+ flags(0),
+ width(0),
+ height(0),
+ alloc_width(0),
+ alloc_height(0),
+ format(Image::FORMAT_L8),
+ type(VS::TEXTURE_TYPE_2D),
+ target(0),
+ data_size(0),
+ total_data_size(0),
+ ignore_mipmaps(false),
+ compressed(false),
+ mipmaps(0),
+ active(false),
+ tex_id(0),
+ stored_cube_sides(0),
+ render_target(NULL),
+ redraw_if_visible(false),
+ detect_3d(NULL),
+ detect_3d_ud(NULL),
+ detect_srgb(NULL),
+ detect_srgb_ud(NULL),
+ detect_normal(NULL),
+ detect_normal_ud(NULL) {
}
_ALWAYS_INLINE_ Texture *get_ptr() {
@@ -400,7 +404,6 @@ public:
int blend_mode;
- /*
enum LightMode {
LIGHT_MODE_NORMAL,
LIGHT_MODE_UNSHADED,
@@ -408,7 +411,6 @@ public:
};
int light_mode;
- */
bool uses_screen_texture;
bool uses_screen_uv;
@@ -615,20 +617,15 @@ public:
int total_data_size;
- Surface() {
- array_byte_size = 0;
- index_array_byte_size = 0;
-
- array_len = 0;
- index_array_len = 0;
-
- mesh = NULL;
-
- primitive = VS::PRIMITIVE_POINTS;
-
- active = false;
-
- total_data_size = 0;
+ Surface() :
+ mesh(NULL),
+ array_len(0),
+ index_array_len(0),
+ array_byte_size(0),
+ index_array_byte_size(0),
+ primitive(VS::PRIMITIVE_POINTS),
+ active(false),
+ total_data_size(0) {
}
};
@@ -658,9 +655,9 @@ public:
}
}
- Mesh() {
- blend_shape_mode = VS::BLEND_SHAPE_MODE_NORMALIZED;
- blend_shape_count = 0;
+ Mesh() :
+ blend_shape_count(0),
+ blend_shape_mode(VS::BLEND_SHAPE_MODE_NORMALIZED) {
}
};
@@ -731,22 +728,18 @@ public:
bool dirty_data;
MultiMesh() :
+ size(0),
+ transform_format(VS::MULTIMESH_TRANSFORM_2D),
+ color_format(VS::MULTIMESH_COLOR_NONE),
+ custom_data_format(VS::MULTIMESH_CUSTOM_DATA_NONE),
update_list(this),
- mesh_list(this) {
- dirty_aabb = true;
- dirty_data = true;
-
- xform_floats = 0;
- color_floats = 0;
- custom_data_floats = 0;
-
- visible_instances = -1;
-
- size = 0;
-
- transform_format = VS::MULTIMESH_TRANSFORM_2D;
- color_format = VS::MULTIMESH_COLOR_NONE;
- custom_data_format = VS::MULTIMESH_CUSTOM_DATA_NONE;
+ mesh_list(this),
+ visible_instances(-1),
+ xform_floats(0),
+ color_floats(0),
+ custom_data_floats(0),
+ dirty_aabb(true),
+ dirty_data(true) {
}
};
@@ -846,11 +839,13 @@ public:
SelfList<Skeleton> update_list;
Set<RasterizerScene::InstanceBase *> instances;
+ Transform2D base_transform_2d;
+
Skeleton() :
+ use_2d(false),
+ size(0),
+ tex_id(0),
update_list(this) {
- tex_id = 0;
- size = 0;
- use_2d = false;
}
};
@@ -1090,6 +1085,8 @@ public:
virtual int particles_get_draw_passes(RID p_particles) const;
virtual RID particles_get_draw_pass_mesh(RID p_particles, int p_pass) const;
+ virtual bool particles_is_inactive(RID p_particles) const;
+
/* INSTANCE */
virtual void instance_add_skeleton(RID p_skeleton, RasterizerScene::InstanceBase *p_instance);
@@ -1119,11 +1116,11 @@ public:
GLuint color;
- Effect() {
- fbo = 0;
- width = 0;
- height = 0;
- color = 0;
+ Effect() :
+ fbo(0),
+ width(0),
+ height(0),
+ color(0) {
}
};
@@ -1138,22 +1135,17 @@ public:
RID texture;
- RenderTarget() {
- fbo = 0;
-
- color = 0;
- depth = 0;
-
- width = 0;
- height = 0;
-
- for (int i = 0; i < RENDER_TARGET_FLAG_MAX; i++) {
+ RenderTarget() :
+ fbo(0),
+ color(0),
+ depth(0),
+ width(0),
+ height(0),
+ used_in_frame(false),
+ msaa(VS::VIEWPORT_MSAA_DISABLED) {
+ for (int i = 0; i < RENDER_TARGET_FLAG_MAX; ++i) {
flags[i] = false;
}
-
- used_in_frame = false;
-
- msaa = VS::VIEWPORT_MSAA_DISABLED;
}
};
@@ -1173,10 +1165,31 @@ public:
/* CANVAS SHADOW */
+ struct CanvasLightShadow : public RID_Data {
+
+ int size;
+ int height;
+ GLuint fbo;
+ GLuint depth;
+ GLuint distance; //for older devices
+ };
+
+ RID_Owner<CanvasLightShadow> canvas_light_shadow_owner;
+
virtual RID canvas_light_shadow_buffer_create(int p_width);
/* LIGHT SHADOW MAPPING */
+ struct CanvasOccluder : public RID_Data {
+
+ GLuint vertex_id; // 0 means, unconfigured
+ GLuint index_id; // 0 means, unconfigured
+ PoolVector<Vector2> lines;
+ int len;
+ };
+
+ RID_Owner<CanvasOccluder> canvas_occluder_owner;
+
virtual RID canvas_light_occluder_create();
virtual void canvas_light_occluder_set_polylines(RID p_occluder, const PoolVector<Vector2> &p_lines);
diff --git a/drivers/gles2/shader_compiler_gles2.cpp b/drivers/gles2/shader_compiler_gles2.cpp
index 28c0274afa..bff031b93a 100644
--- a/drivers/gles2/shader_compiler_gles2.cpp
+++ b/drivers/gles2/shader_compiler_gles2.cpp
@@ -1,12 +1,12 @@
/*************************************************************************/
-/* shader_compiler_gles3.cpp */
+/* shader_compiler_gles2.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -86,10 +86,11 @@ static String _mkid(const String &p_id) {
static String f2sp0(float p_float) {
- if (int(p_float) == p_float)
- return itos(p_float) + ".0";
- else
- return rtoss(p_float);
+ String num = rtoss(p_float);
+ if (num.find(".") == -1 && num.find("e") == -1) {
+ num += ".0";
+ }
+ return num;
}
static String get_constant_text(SL::DataType p_type, const Vector<SL::ConstantNode::Value> &p_values) {
@@ -736,7 +737,7 @@ Error ShaderCompilerGLES2::compile(VS::ShaderMode p_mode, const String &p_code,
Vector<String> shader = p_code.split("\n");
for (int i = 0; i < shader.size(); i++) {
- print_line(itos(i) + " " + shader[i]);
+ print_line(itos(i + 1) + " " + shader[i]);
}
_err_print_error(NULL, p_path.utf8().get_data(), parser.get_error_line(), parser.get_error_text().utf8().get_data(), ERR_HANDLER_SHADER);
@@ -813,8 +814,8 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() {
/** SPATIAL SHADER **/
actions[VS::SHADER_SPATIAL].renames["WORLD_MATRIX"] = "world_transform";
- actions[VS::SHADER_SPATIAL].renames["INV_CAMERA_MATRIX"] = "camera_matrix";
- actions[VS::SHADER_SPATIAL].renames["CAMERA_MATRIX"] = "camera_inverse_matrix";
+ actions[VS::SHADER_SPATIAL].renames["INV_CAMERA_MATRIX"] = "camera_inverse_matrix";
+ actions[VS::SHADER_SPATIAL].renames["CAMERA_MATRIX"] = "camera_matrix";
actions[VS::SHADER_SPATIAL].renames["PROJECTION_MATRIX"] = "projection_matrix";
actions[VS::SHADER_SPATIAL].renames["INV_PROJECTION_MATRIX"] = "projection_inverse_matrix";
actions[VS::SHADER_SPATIAL].renames["MODELVIEW_MATRIX"] = "modelview";
@@ -823,6 +824,7 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() {
actions[VS::SHADER_SPATIAL].renames["NORMAL"] = "normal";
actions[VS::SHADER_SPATIAL].renames["TANGENT"] = "tangent";
actions[VS::SHADER_SPATIAL].renames["BINORMAL"] = "binormal";
+ actions[VS::SHADER_SPATIAL].renames["POSITION"] = "position";
actions[VS::SHADER_SPATIAL].renames["UV"] = "uv_interp";
actions[VS::SHADER_SPATIAL].renames["UV2"] = "uv2_interp";
actions[VS::SHADER_SPATIAL].renames["COLOR"] = "color_interp";
@@ -888,6 +890,7 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() {
actions[VS::SHADER_SPATIAL].usage_defines["COLOR"] = "#define ENABLE_COLOR_INTERP\n";
actions[VS::SHADER_SPATIAL].usage_defines["INSTANCE_CUSTOM"] = "#define ENABLE_INSTANCE_CUSTOM\n";
actions[VS::SHADER_SPATIAL].usage_defines["ALPHA_SCISSOR"] = "#define ALPHA_SCISSOR_USED\n";
+ actions[VS::SHADER_SPATIAL].usage_defines["POSITION"] = "#define OVERRIDE_POSITION\n";
actions[VS::SHADER_SPATIAL].usage_defines["SSS_STRENGTH"] = "#define ENABLE_SSS\n";
actions[VS::SHADER_SPATIAL].usage_defines["TRANSMISSION"] = "#define TRANSMISSION_USED\n";
@@ -930,7 +933,7 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() {
actions[VS::SHADER_PARTICLES].renames["COLOR"] = "out_color";
actions[VS::SHADER_PARTICLES].renames["VELOCITY"] = "out_velocity_active.xyz";
actions[VS::SHADER_PARTICLES].renames["MASS"] = "mass";
- actions[VS::SHADER_PARTICLES].renames["ACTIVE"] = "active";
+ actions[VS::SHADER_PARTICLES].renames["ACTIVE"] = "shader_active";
actions[VS::SHADER_PARTICLES].renames["RESTART"] = "restart";
actions[VS::SHADER_PARTICLES].renames["CUSTOM"] = "out_custom";
actions[VS::SHADER_PARTICLES].renames["TRANSFORM"] = "xform";
diff --git a/drivers/gles2/shader_compiler_gles2.h b/drivers/gles2/shader_compiler_gles2.h
index 5e9e295204..b8f50d6d1f 100644
--- a/drivers/gles2/shader_compiler_gles2.h
+++ b/drivers/gles2/shader_compiler_gles2.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/gles2/shader_gles2.cpp b/drivers/gles2/shader_gles2.cpp
index c5a67d4e75..65d4b63bb9 100644
--- a/drivers/gles2/shader_gles2.cpp
+++ b/drivers/gles2/shader_gles2.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -99,7 +99,7 @@ void ShaderGLES2::bind_uniforms() {
const Map<uint32_t, CameraMatrix>::Element *C = uniform_cameras.front();
while (C) {
- int idx = E->key();
+ int idx = C->key();
int location = version->uniform_location[idx];
if (location < 0) {
@@ -364,14 +364,14 @@ ShaderGLES2::Version *ShaderGLES2::get_current_version() {
strings.push_back(fragment_code1.get_data());
if (cc) {
- code_string = cc->fragment.ascii();
+ code_string = cc->light.ascii();
strings.push_back(code_string.get_data());
}
strings.push_back(fragment_code2.get_data());
if (cc) {
- code_string2 = cc->light.ascii();
+ code_string2 = cc->fragment.ascii();
strings.push_back(code_string2.get_data());
}
@@ -588,22 +588,24 @@ void ShaderGLES2::setup(
fragment_code0 = code.substr(0, cpos).ascii();
code = code.substr(cpos + globals_tag.length(), code.length());
- cpos = code.find(code_tag);
+ cpos = code.find(light_code_tag);
- if (cpos == -1) {
- fragment_code1 = code.ascii();
- } else {
+ String code2;
+
+ if (cpos != -1) {
fragment_code1 = code.substr(0, cpos).ascii();
- String code2 = code.substr(cpos + code_tag.length(), code.length());
-
- cpos = code2.find(light_code_tag);
- if (cpos == -1) {
- fragment_code2 = code2.ascii();
- } else {
- fragment_code2 = code2.substr(0, cpos).ascii();
- fragment_code3 = code2.substr(cpos + light_code_tag.length(), code2.length()).ascii();
- }
+ code2 = code.substr(cpos + light_code_tag.length(), code.length());
+ } else {
+ code2 = code;
+ }
+
+ cpos = code2.find(code_tag);
+ if (cpos == -1) {
+ fragment_code2 = code2.ascii();
+ } else {
+ fragment_code2 = code2.substr(0, cpos).ascii();
+ fragment_code3 = code2.substr(cpos + code_tag.length(), code2.length()).ascii();
}
}
}
diff --git a/drivers/gles2/shader_gles2.h b/drivers/gles2/shader_gles2.h
index 9160a7c265..468971471c 100644
--- a/drivers/gles2/shader_gles2.h
+++ b/drivers/gles2/shader_gles2.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/gles2/shaders/SCsub b/drivers/gles2/shaders/SCsub
index d959d3f740..085c43319c 100644
--- a/drivers/gles2/shaders/SCsub
+++ b/drivers/gles2/shaders/SCsub
@@ -6,7 +6,7 @@ if 'GLES2_GLSL' in env['BUILDERS']:
env.GLES2_GLSL('copy.glsl');
# env.GLES2_GLSL('resolve.glsl');
env.GLES2_GLSL('canvas.glsl');
-# env.GLES2_GLSL('canvas_shadow.glsl');
+ env.GLES2_GLSL('canvas_shadow.glsl');
env.GLES2_GLSL('scene.glsl');
env.GLES2_GLSL('cubemap_filter.glsl');
env.GLES2_GLSL('cube_to_dp.glsl');
diff --git a/drivers/gles2/shaders/canvas.glsl b/drivers/gles2/shaders/canvas.glsl
index 79d4eb2243..0de60d7421 100644
--- a/drivers/gles2/shaders/canvas.glsl
+++ b/drivers/gles2/shaders/canvas.glsl
@@ -2,6 +2,7 @@
[vertex]
#ifdef USE_GLES_OVER_GL
+#define lowp
#define mediump
#define highp
#else
@@ -11,12 +12,40 @@ precision mediump int;
uniform highp mat4 projection_matrix;
/* clang-format on */
+
+#include "stdlib.glsl"
+
uniform highp mat4 modelview_matrix;
uniform highp mat4 extra_matrix;
attribute highp vec2 vertex; // attrib:0
attribute vec4 color_attrib; // attrib:3
attribute vec2 uv_attrib; // attrib:4
+#ifdef USE_SKELETON
+attribute highp vec4 bone_indices; // attrib:6
+attribute highp vec4 bone_weights; // attrib:7
+#endif
+
+#ifdef USE_INSTANCING
+
+attribute highp vec4 instance_xform0; //attrib:8
+attribute highp vec4 instance_xform1; //attrib:9
+attribute highp vec4 instance_xform2; //attrib:10
+attribute highp vec4 instance_color; //attrib:11
+
+#ifdef USE_INSTANCE_CUSTOM
+attribute highp vec4 instance_custom_data; //attrib:12
+#endif
+
+#endif
+
+#ifdef USE_SKELETON
+uniform highp sampler2D skeleton_texture; // texunit:-3
+uniform highp ivec2 skeleton_texture_size;
+uniform highp mat4 skeleton_transform;
+uniform highp mat4 skeleton_transform_inverse;
+#endif
+
varying vec2 uv_interp;
varying vec4 color_interp;
@@ -31,6 +60,35 @@ uniform vec4 src_rect;
uniform highp float time;
+#ifdef USE_LIGHTING
+
+// light matrices
+uniform highp mat4 light_matrix;
+uniform highp mat4 light_matrix_inverse;
+uniform highp mat4 light_local_matrix;
+uniform highp mat4 shadow_matrix;
+uniform highp vec4 light_color;
+uniform highp vec4 light_shadow_color;
+uniform highp vec2 light_pos;
+uniform highp float shadowpixel_size;
+uniform highp float shadow_gradient;
+uniform highp float light_height;
+uniform highp float light_outside_alpha;
+uniform highp float shadow_distance_mult;
+
+varying vec4 light_uv_interp;
+varying vec2 transformed_light_uv;
+varying vec4 local_rot;
+
+#ifdef USE_SHADOWS
+varying highp vec2 pos;
+#endif
+
+const bool at_light_pass = true;
+#else
+const bool at_light_pass = false;
+#endif
+
/* clang-format off */
VERTEX_SHADER_GLOBALS
@@ -50,6 +108,16 @@ void main() {
vec4 color = color_attrib;
+#ifdef USE_INSTANCING
+ mat4 extra_matrix_instance = extra_matrix * transpose(mat4(instance_xform0, instance_xform1, instance_xform2, vec4(0.0, 0.0, 0.0, 1.0)));
+ color *= instance_color;
+ vec4 instance_custom = instance_custom_data;
+
+#else
+ mat4 extra_matrix_instance = extra_matrix;
+ vec4 instance_custom = vec4(0.0);
+#endif
+
#ifdef USE_TEXTURE_RECT
if (dst_rect.z < 0.0) { // Transpose is encoded as negative dst_rect.z
@@ -72,12 +140,7 @@ void main() {
#else
vec4 outvec = vec4(vertex.xy, 0.0, 1.0);
-#ifdef USE_UV_ATTRIBUTE
uv_interp = uv_attrib;
-#else
- uv_interp = vertex.xy;
-#endif
-
#endif
{
@@ -90,7 +153,7 @@ VERTEX_SHADER_CODE
}
#if !defined(SKIP_TRANSFORM_USED)
- outvec = extra_matrix * outvec;
+ outvec = extra_matrix_instance * outvec;
outvec = modelview_matrix * outvec;
#endif
@@ -100,13 +163,60 @@ VERTEX_SHADER_CODE
outvec.xy = floor(outvec + 0.5).xy;
#endif
+#ifdef USE_SKELETON
+
+ // look up transform from the "pose texture"
+ if (bone_weights != vec4(0.0)) {
+
+ highp mat4 bone_transform = mat4(0.0);
+
+ for (int i = 0; i < 4; i++) {
+ ivec2 tex_ofs = ivec2(int(bone_indices[i]) * 2, 0);
+
+ highp mat4 b = mat4(
+ texel2DFetch(skeleton_texture, skeleton_texture_size, tex_ofs + ivec2(0, 0)),
+ texel2DFetch(skeleton_texture, skeleton_texture_size, tex_ofs + ivec2(1, 0)),
+ vec4(0.0, 0.0, 1.0, 0.0),
+ vec4(0.0, 0.0, 0.0, 1.0));
+
+ bone_transform += b * bone_weights[i];
+ }
+
+ mat4 bone_matrix = skeleton_transform * transpose(bone_transform) * skeleton_transform_inverse;
+
+ outvec = bone_matrix * outvec;
+ }
+
+#endif
+
gl_Position = projection_matrix * outvec;
+
+#ifdef USE_LIGHTING
+
+ light_uv_interp.xy = (light_matrix * outvec).xy;
+ light_uv_interp.zw = (light_local_matrix * outvec).xy;
+
+ transformed_light_uv = (mat3(light_matrix_inverse) * vec3(light_uv_interp.zw, 0.0)).xy; //for normal mapping
+
+#ifdef USE_SHADOWS
+ pos = outvec.xy;
+#endif
+
+ local_rot.xy = normalize((modelview_matrix * (extra_matrix_instance * vec4(1.0, 0.0, 0.0, 0.0))).xy);
+ local_rot.zw = normalize((modelview_matrix * (extra_matrix_instance * vec4(0.0, 1.0, 0.0, 0.0))).xy);
+#ifdef USE_TEXTURE_RECT
+ local_rot.xy *= sign(src_rect.z);
+ local_rot.zw *= sign(src_rect.w);
+#endif
+
+#endif
}
/* clang-format off */
[fragment]
#ifdef USE_GLES_OVER_GL
+#define lowp
#define mediump
#define highp
#else
@@ -128,7 +238,7 @@ uniform vec4 final_modulate;
#ifdef SCREEN_TEXTURE_USED
-uniform sampler2D screen_texture; // texunit:-3
+uniform sampler2D screen_texture; // texunit:-4
#endif
@@ -138,6 +248,40 @@ uniform vec2 screen_pixel_size;
#endif
+#ifdef USE_LIGHTING
+
+uniform highp mat4 light_matrix;
+uniform highp mat4 light_local_matrix;
+uniform highp mat4 shadow_matrix;
+uniform highp vec4 light_color;
+uniform highp vec4 light_shadow_color;
+uniform highp vec2 light_pos;
+uniform highp float shadowpixel_size;
+uniform highp float shadow_gradient;
+uniform highp float light_height;
+uniform highp float light_outside_alpha;
+uniform highp float shadow_distance_mult;
+
+uniform lowp sampler2D light_texture; // texunit:-4
+varying vec4 light_uv_interp;
+varying vec2 transformed_light_uv;
+
+varying vec4 local_rot;
+
+#ifdef USE_SHADOWS
+
+uniform highp sampler2D shadow_texture; // texunit:-5
+varying highp vec2 pos;
+
+#endif
+
+const bool at_light_pass = true;
+#else
+const bool at_light_pass = false;
+#endif
+
+uniform bool use_default_normal;
+
/* clang-format off */
FRAGMENT_SHADER_GLOBALS
@@ -156,15 +300,236 @@ void main() {
#ifdef SCREEN_UV_USED
vec2 screen_uv = gl_FragCoord.xy * screen_pixel_size;
#endif
+
+ vec3 normal;
+
+#if defined(NORMAL_USED)
+
+ bool normal_used = true;
+#else
+ bool normal_used = false;
+#endif
+
+ if (use_default_normal) {
+ normal.xy = texture2D(normal_texture, uv_interp).xy * 2.0 - 1.0;
+ normal.z = sqrt(1.0 - dot(normal.xy, normal.xy));
+ normal_used = true;
+ } else {
+ normal = vec3(0.0, 0.0, 1.0);
+ }
+
{
+ float normal_depth = 1.0;
+
+#if defined(NORMALMAP_USED)
+ vec3 normal_map = vec3(0.0, 0.0, 1.0);
+ normal_used = true;
+#endif
+
/* clang-format off */
FRAGMENT_SHADER_CODE
/* clang-format on */
- }
+#if defined(NORMALMAP_USED)
+ normal = mix(vec3(0.0, 0.0, 1.0), normal_map * vec3(2.0, -2.0, 1.0) - vec3(1.0, -1.0, 0.0), normal_depth);
+#endif
+ }
color *= final_modulate;
+#ifdef USE_LIGHTING
+
+ vec2 light_vec = transformed_light_uv;
+
+ if (normal_used) {
+ normal.xy = mat2(local_rot.xy, local_rot.zw) * normal.xy;
+ }
+
+ float att = 1.0;
+
+ vec2 light_uv = light_uv_interp.xy;
+ vec4 light = texture2D(light_texture, light_uv);
+
+ if (any(lessThan(light_uv_interp.xy, vec2(0.0, 0.0))) || any(greaterThanEqual(light_uv_interp.xy, vec2(1.0, 1.0)))) {
+ color.a *= light_outside_alpha; //invisible
+
+ } else {
+ float real_light_height = light_height;
+ vec4 real_light_color = light_color;
+ vec4 real_light_shadow_color = light_shadow_color;
+
+#if defined(USE_LIGHT_SHADER_CODE)
+ //light is written by the light shader
+ light_compute(
+ light,
+ light_vec,
+ real_light_height,
+ real_light_color,
+ light_uv,
+ real_light_shadow_color,
+ normal,
+ uv,
+#if defined(SCREEN_UV_USED)
+ screen_uv,
+#endif
+ color);
+#endif
+
+ light *= real_light_color;
+
+ if (normal_used) {
+ vec3 light_normal = normalize(vec3(light_vec, -real_light_height));
+ light *= max(dot(-light_normal, normal), 0.0);
+ }
+
+ color *= light;
+
+#ifdef USE_SHADOWS
+ light_vec = light_uv_interp.zw; //for shadows
+ float angle_to_light = -atan(light_vec.x, light_vec.y);
+ float PI = 3.14159265358979323846264;
+ /*int i = int(mod(floor((angle_to_light+7.0*PI/6.0)/(4.0*PI/6.0))+1.0, 3.0)); // +1 pq os indices estao em ordem 2,0,1 nos arrays
+ float ang*/
+
+ float su, sz;
+
+ float abs_angle = abs(angle_to_light);
+ vec2 point;
+ float sh;
+ if (abs_angle < 45.0 * PI / 180.0) {
+ point = light_vec;
+ sh = 0.0 + (1.0 / 8.0);
+ } else if (abs_angle > 135.0 * PI / 180.0) {
+ point = -light_vec;
+ sh = 0.5 + (1.0 / 8.0);
+ } else if (angle_to_light > 0.0) {
+
+ point = vec2(light_vec.y, -light_vec.x);
+ sh = 0.25 + (1.0 / 8.0);
+ } else {
+
+ point = vec2(-light_vec.y, light_vec.x);
+ sh = 0.75 + (1.0 / 8.0);
+ }
+
+ highp vec4 s = shadow_matrix * vec4(point, 0.0, 1.0);
+ s.xyz /= s.w;
+ su = s.x * 0.5 + 0.5;
+ sz = s.z * 0.5 + 0.5;
+ //sz=lightlength(light_vec);
+
+ highp float shadow_attenuation = 0.0;
+
+#ifdef USE_RGBA_SHADOWS
+
+#define SHADOW_DEPTH(m_tex, m_uv) dot(texture2D((m_tex), (m_uv)), vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1))
+
+#else
+
+#define SHADOW_DEPTH(m_tex, m_uv) (texture2D((m_tex), (m_uv)).r)
+
+#endif
+
+#ifdef SHADOW_USE_GRADIENT
+
+#define SHADOW_TEST(m_ofs) \
+ { \
+ highp float sd = SHADOW_DEPTH(shadow_texture, vec2(m_ofs, sh)); \
+ shadow_attenuation += 1.0 - smoothstep(sd, sd + shadow_gradient, sz); \
+ }
+
+#else
+
+#define SHADOW_TEST(m_ofs) \
+ { \
+ highp float sd = SHADOW_DEPTH(shadow_texture, vec2(m_ofs, sh)); \
+ shadow_attenuation += step(sz, sd); \
+ }
+
+#endif
+
+#ifdef SHADOW_FILTER_NEAREST
+
+ SHADOW_TEST(su);
+
+#endif
+
+#ifdef SHADOW_FILTER_PCF3
+
+ SHADOW_TEST(su + shadowpixel_size);
+ SHADOW_TEST(su);
+ SHADOW_TEST(su - shadowpixel_size);
+ shadow_attenuation /= 3.0;
+
+#endif
+
+#ifdef SHADOW_FILTER_PCF5
+
+ SHADOW_TEST(su + shadowpixel_size * 2.0);
+ SHADOW_TEST(su + shadowpixel_size);
+ SHADOW_TEST(su);
+ SHADOW_TEST(su - shadowpixel_size);
+ SHADOW_TEST(su - shadowpixel_size * 2.0);
+ shadow_attenuation /= 5.0;
+
+#endif
+
+#ifdef SHADOW_FILTER_PCF7
+
+ SHADOW_TEST(su + shadowpixel_size * 3.0);
+ SHADOW_TEST(su + shadowpixel_size * 2.0);
+ SHADOW_TEST(su + shadowpixel_size);
+ SHADOW_TEST(su);
+ SHADOW_TEST(su - shadowpixel_size);
+ SHADOW_TEST(su - shadowpixel_size * 2.0);
+ SHADOW_TEST(su - shadowpixel_size * 3.0);
+ shadow_attenuation /= 7.0;
+
+#endif
+
+#ifdef SHADOW_FILTER_PCF9
+
+ SHADOW_TEST(su + shadowpixel_size * 4.0);
+ SHADOW_TEST(su + shadowpixel_size * 3.0);
+ SHADOW_TEST(su + shadowpixel_size * 2.0);
+ SHADOW_TEST(su + shadowpixel_size);
+ SHADOW_TEST(su);
+ SHADOW_TEST(su - shadowpixel_size);
+ SHADOW_TEST(su - shadowpixel_size * 2.0);
+ SHADOW_TEST(su - shadowpixel_size * 3.0);
+ SHADOW_TEST(su - shadowpixel_size * 4.0);
+ shadow_attenuation /= 9.0;
+
+#endif
+
+#ifdef SHADOW_FILTER_PCF13
+
+ SHADOW_TEST(su + shadowpixel_size * 6.0);
+ SHADOW_TEST(su + shadowpixel_size * 5.0);
+ SHADOW_TEST(su + shadowpixel_size * 4.0);
+ SHADOW_TEST(su + shadowpixel_size * 3.0);
+ SHADOW_TEST(su + shadowpixel_size * 2.0);
+ SHADOW_TEST(su + shadowpixel_size);
+ SHADOW_TEST(su);
+ SHADOW_TEST(su - shadowpixel_size);
+ SHADOW_TEST(su - shadowpixel_size * 2.0);
+ SHADOW_TEST(su - shadowpixel_size * 3.0);
+ SHADOW_TEST(su - shadowpixel_size * 4.0);
+ SHADOW_TEST(su - shadowpixel_size * 5.0);
+ SHADOW_TEST(su - shadowpixel_size * 6.0);
+ shadow_attenuation /= 13.0;
+
+#endif
+
+ //color *= shadow_attenuation;
+ color = mix(real_light_shadow_color, color, shadow_attenuation);
+//use shadows
+#endif
+ }
+
+//use lighting
+#endif
+
gl_FragColor = color;
}
diff --git a/drivers/gles2/shaders/canvas_shadow.glsl b/drivers/gles2/shaders/canvas_shadow.glsl
index e3c8140e31..d39212826e 100644
--- a/drivers/gles2/shaders/canvas_shadow.glsl
+++ b/drivers/gles2/shaders/canvas_shadow.glsl
@@ -1,15 +1,24 @@
/* clang-format off */
[vertex]
+#ifdef USE_GLES_OVER_GL
+#define lowp
+#define mediump
+#define highp
+#else
+precision highp float;
+precision highp int;
+#endif
+
+attribute highp vec3 vertex; // attrib:0
+
uniform highp mat4 projection_matrix;
/* clang-format on */
uniform highp mat4 light_matrix;
uniform highp mat4 world_matrix;
uniform highp float distance_norm;
-layout(location = 0) in highp vec3 vertex;
-
-out highp vec4 position_interp;
+varying highp vec4 position_interp;
void main() {
@@ -20,31 +29,29 @@ void main() {
/* clang-format off */
[fragment]
-in highp vec4 position_interp;
-/* clang-format on */
-
-#ifdef USE_RGBA_SHADOWS
-
-layout(location = 0) out lowp vec4 distance_buf;
-
+#ifdef USE_GLES_OVER_GL
+#define lowp
+#define mediump
+#define highp
#else
-
-layout(location = 0) out highp float distance_buf;
-
+precision mediump float;
+precision mediump int;
#endif
+varying highp vec4 position_interp;
+/* clang-format on */
+
void main() {
- highp float depth = ((position_interp.z / position_interp.w) + 1.0) * 0.5 + 0.0; //bias;
+ highp float depth = ((position_interp.z / position_interp.w) + 1.0) * 0.5 + 0.0; // bias
#ifdef USE_RGBA_SHADOWS
highp vec4 comp = fract(depth * vec4(256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0));
comp -= comp.xxyz * vec4(0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0);
- distance_buf = comp;
+ gl_FragColor = comp;
#else
- distance_buf = depth;
-
+ gl_FragColor = vec4(depth);
#endif
}
diff --git a/drivers/gles2/shaders/copy.glsl b/drivers/gles2/shaders/copy.glsl
index 0b8da4f875..f3c2a7eec4 100644
--- a/drivers/gles2/shaders/copy.glsl
+++ b/drivers/gles2/shaders/copy.glsl
@@ -2,6 +2,7 @@
[vertex]
#ifdef USE_GLES_OVER_GL
+#define lowp
#define mediump
#define highp
#else
@@ -56,6 +57,7 @@ void main() {
#define M_PI 3.14159265359
#ifdef USE_GLES_OVER_GL
+#define lowp
#define mediump
#define highp
#else
@@ -92,6 +94,7 @@ uniform float custom_alpha;
#endif
#if defined(USE_PANORAMA) || defined(USE_ASYM_PANO)
+uniform highp mat4 sky_transform;
vec4 texturePanorama(sampler2D pano, vec3 normal) {
@@ -113,7 +116,12 @@ void main() {
#ifdef USE_PANORAMA
- vec4 color = texturePanorama(source, normalize(cube_interp));
+ vec3 cube_normal = normalize(cube_interp);
+ cube_normal.z = -cube_normal.z;
+ cube_normal = mat3(sky_transform) * cube_normal;
+ cube_normal.z = -cube_normal.z;
+
+ vec4 color = texturePanorama(source, cube_normal);
#elif defined(USE_ASYM_PANO)
@@ -125,7 +133,7 @@ void main() {
cube_normal.z = -1000000.0;
cube_normal.x = (cube_normal.z * (-uv_interp.x - asym_proj.x)) / asym_proj.y;
cube_normal.y = (cube_normal.z * (-uv_interp.y - asym_proj.z)) / asym_proj.a;
- cube_normal = mat3(pano_transform) * cube_normal;
+ cube_normal = mat3(sky_transform) * mat3(pano_transform) * cube_normal;
cube_normal.z = -cube_normal.z;
vec4 color = texturePanorama(source, normalize(cube_normal.xyz));
diff --git a/drivers/gles2/shaders/cube_to_dp.glsl b/drivers/gles2/shaders/cube_to_dp.glsl
index 3d24c36336..cb4b3f6dec 100644
--- a/drivers/gles2/shaders/cube_to_dp.glsl
+++ b/drivers/gles2/shaders/cube_to_dp.glsl
@@ -2,6 +2,7 @@
[vertex]
#ifdef USE_GLES_OVER_GL
+#define lowp
#define mediump
#define highp
#else
@@ -25,6 +26,7 @@ void main() {
[fragment]
#ifdef USE_GLES_OVER_GL
+#define lowp
#define mediump
#define highp
#else
diff --git a/drivers/gles2/shaders/cubemap_filter.glsl b/drivers/gles2/shaders/cubemap_filter.glsl
index b1553c7cd5..06274a7698 100644
--- a/drivers/gles2/shaders/cubemap_filter.glsl
+++ b/drivers/gles2/shaders/cubemap_filter.glsl
@@ -2,6 +2,7 @@
[vertex]
#ifdef USE_GLES_OVER_GL
+#define lowp
#define mediump
#define highp
#else
@@ -32,6 +33,7 @@ void main() {
#endif
#ifdef USE_GLES_OVER_GL
+#define lowp
#define mediump
#define highp
#else
diff --git a/drivers/gles2/shaders/lens_distorted.glsl b/drivers/gles2/shaders/lens_distorted.glsl
index d541db9bf9..81898a75a5 100644
--- a/drivers/gles2/shaders/lens_distorted.glsl
+++ b/drivers/gles2/shaders/lens_distorted.glsl
@@ -1,6 +1,15 @@
/* clang-format off */
[vertex]
+#ifdef USE_GLES_OVER_GL
+#define lowp
+#define mediump
+#define highp
+#else
+precision highp float;
+precision highp int;
+#endif
+
attribute highp vec2 vertex; // attrib:0
/* clang-format on */
@@ -20,6 +29,15 @@ void main() {
/* clang-format off */
[fragment]
+#ifdef USE_GLES_OVER_GL
+#define lowp
+#define mediump
+#define highp
+#else
+precision mediump float;
+precision highp int;
+#endif
+
uniform sampler2D source; //texunit:0
/* clang-format on */
diff --git a/drivers/gles2/shaders/scene.glsl b/drivers/gles2/shaders/scene.glsl
index bc83b69b49..b2b9458ed2 100644
--- a/drivers/gles2/shaders/scene.glsl
+++ b/drivers/gles2/shaders/scene.glsl
@@ -2,6 +2,7 @@
[vertex]
#ifdef USE_GLES_OVER_GL
+#define lowp
#define mediump
#define highp
#else
@@ -84,7 +85,7 @@ uniform highp mat4 world_transform;
uniform highp float time;
-
+uniform highp vec2 viewport_size;
#ifdef RENDER_DEPTH
uniform float light_bias;
@@ -353,6 +354,10 @@ void main() {
uv2_interp = uv2_attrib;
#endif
+#ifdef OVERRIDE_POSITION
+ highp vec4 position;
+#endif
+
#if !defined(SKIP_TRANSFORM_USED) && defined(VERTEX_WORLD_COORDS_USED)
vertex = world_matrix * vertex;
normal = normalize((world_matrix * vec4(normal, 0.0)).xyz);
@@ -640,7 +645,12 @@ VERTEX_SHADER_CODE
#endif //fog
#endif //use vertex lighting
+
+#ifdef OVERRIDE_POSITION
+ gl_Position = position;
+#else
gl_Position = projection_matrix * vec4(vertex_interp, 1.0);
+#endif
}
/* clang-format off */
@@ -653,6 +663,7 @@ VERTEX_SHADER_CODE
#endif
#ifdef USE_GLES_OVER_GL
+#define lowp
#define mediump
#define highp
#else
@@ -679,6 +690,8 @@ uniform highp mat4 world_transform;
uniform highp float time;
+uniform highp vec2 viewport_size;
+
#if defined(SCREEN_UV_USED)
uniform vec2 screen_pixel_size;
#endif
@@ -1121,7 +1134,7 @@ LIGHT_SHADER_CODE
float NdotL = dot(N, L);
float cNdotL = max(NdotL, 0.0); // clamped NdotL
float NdotV = dot(N, V);
- float cNdotV = max(NdotV, 0.0);
+ float cNdotV = max(abs(NdotV), 1e-6);
#if defined(DIFFUSE_BURLEY) || defined(SPECULAR_BLINN) || defined(SPECULAR_SCHLICK_GGX) || defined(LIGHT_USE_CLEARCOAT)
vec3 H = normalize(V + L);
@@ -1250,7 +1263,7 @@ LIGHT_SHADER_CODE
float YdotH = dot(B, H);
float D = D_GGX_anisotropic(cNdotH, ax, ay, XdotH, YdotH, cNdotH);
//float G = G_GGX_anisotropic_2cos(cNdotL, ax, ay, XdotH, YdotH) * G_GGX_anisotropic_2cos(cNdotV, ax, ay, XdotH, YdotH);
- float G = V_GGX_anisotropic(ax, ay, dot(T, V), dot(T, L), dot(B, V), dot(B, L), cNdotV, cNdotL))
+ float G = V_GGX_anisotropic(ax, ay, dot(T, V), dot(T, L), dot(B, V), dot(B, L), cNdotV, cNdotL);
#else
float alpha = roughness * roughness;
@@ -1382,6 +1395,7 @@ void main() {
discard;
#endif
highp vec3 vertex = vertex_interp;
+ vec3 view = -normalize(vertex_interp);
vec3 albedo = vec3(1.0);
vec3 transmission = vec3(0.0);
float metallic = 0.0;
@@ -1455,7 +1469,7 @@ FRAGMENT_SHADER_CODE
vec3 diffuse_light = vec3(0.0, 0.0, 0.0);
vec3 ambient_light = vec3(0.0, 0.0, 0.0);
- vec3 eye_position = -normalize(vertex_interp);
+ vec3 eye_position = view;
#if defined(ALPHA_SCISSOR_USED)
if (alpha < alpha_scissor) {
@@ -1910,7 +1924,6 @@ FRAGMENT_SHADER_CODE
#ifdef USE_SHADOW
{
highp vec4 splane = shadow_coord;
- splane.xyz /= splane.w;
float shadow = sample_shadow(light_shadow_atlas, splane);
light_att *= shadow;
diff --git a/drivers/gles3/rasterizer_canvas_gles3.cpp b/drivers/gles3/rasterizer_canvas_gles3.cpp
index 4166cb8361..79fec63db0 100644
--- a/drivers/gles3/rasterizer_canvas_gles3.cpp
+++ b/drivers/gles3/rasterizer_canvas_gles3.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -158,7 +158,10 @@ void RasterizerCanvasGLES3::canvas_begin() {
state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_LIGHTING, false);
state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_SHADOWS, false);
state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_NEAREST, false);
+ state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF3, false);
state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF5, false);
+ state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF7, false);
+ state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF9, false);
state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF13, false);
state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_DISTANCE_FIELD, false);
state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_NINEPATCH, false);
@@ -862,7 +865,11 @@ void RasterizerCanvasGLES3::_canvas_item_render_commands(Item *p_item, Item *cur
state.canvas_shader.set_uniform(CanvasShaderGLES3::COLOR_TEXPIXEL_SIZE, texpixel_size);
}
- int amount = MAX(multi_mesh->size, multi_mesh->visible_instances);
+ int amount = MIN(multi_mesh->size, multi_mesh->visible_instances);
+
+ if (amount == -1) {
+ amount = multi_mesh->size;
+ }
for (int j = 0; j < mesh_data->surfaces.size(); j++) {
RasterizerStorageGLES3::Surface *s = mesh_data->surfaces[j];
@@ -1140,6 +1147,11 @@ void RasterizerCanvasGLES3::_canvas_item_render_commands(Item *p_item, Item *cur
void RasterizerCanvasGLES3::_copy_texscreen(const Rect2 &p_rect) {
+ if (storage->frame.current_rt->effects.mip_maps[0].sizes.size() == 0) {
+ ERR_EXPLAIN("Can't use screen texture copying in a render target configured without copy buffers");
+ ERR_FAIL();
+ }
+
glDisable(GL_BLEND);
state.canvas_texscreen_used = true;
@@ -1549,15 +1561,12 @@ void RasterizerCanvasGLES3::canvas_render_items(Item *p_item_list, int p_z, cons
state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_SHADOWS, has_shadow);
if (has_shadow) {
state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_USE_GRADIENT, light->shadow_gradient_length > 0);
- switch (light->shadow_filter) {
-
- case VS::CANVAS_LIGHT_FILTER_NONE: state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_NEAREST, true); break;
- case VS::CANVAS_LIGHT_FILTER_PCF3: state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF3, true); break;
- case VS::CANVAS_LIGHT_FILTER_PCF5: state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF5, true); break;
- case VS::CANVAS_LIGHT_FILTER_PCF7: state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF7, true); break;
- case VS::CANVAS_LIGHT_FILTER_PCF9: state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF9, true); break;
- case VS::CANVAS_LIGHT_FILTER_PCF13: state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF13, true); break;
- }
+ state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_NEAREST, light->shadow_filter == VS::CANVAS_LIGHT_FILTER_NONE);
+ state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF3, light->shadow_filter == VS::CANVAS_LIGHT_FILTER_PCF3);
+ state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF5, light->shadow_filter == VS::CANVAS_LIGHT_FILTER_PCF5);
+ state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF7, light->shadow_filter == VS::CANVAS_LIGHT_FILTER_PCF7);
+ state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF9, light->shadow_filter == VS::CANVAS_LIGHT_FILTER_PCF9);
+ state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF13, light->shadow_filter == VS::CANVAS_LIGHT_FILTER_PCF13);
}
bool light_rebind = state.canvas_shader.bind();
diff --git a/drivers/gles3/rasterizer_canvas_gles3.h b/drivers/gles3/rasterizer_canvas_gles3.h
index 3f306003b4..bf5ef30820 100644
--- a/drivers/gles3/rasterizer_canvas_gles3.h
+++ b/drivers/gles3/rasterizer_canvas_gles3.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/gles3/rasterizer_gles3.cpp b/drivers/gles3/rasterizer_gles3.cpp
index 41ce5e7c47..a4e042ae0e 100644
--- a/drivers/gles3/rasterizer_gles3.cpp
+++ b/drivers/gles3/rasterizer_gles3.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -79,12 +79,6 @@ RasterizerScene *RasterizerGLES3::get_scene() {
#ifdef GLAD_ENABLED
// Restricting to GLAD as only used in initialize() with GLAD_GL_ARB_debug_output
-#if (defined WINDOWS_ENABLED) && !(defined UWP_ENABLED)
-#define GLAPIENTRY APIENTRY
-#else
-#define GLAPIENTRY
-#endif
-
static void GLAPIENTRY _gl_debug_print(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const GLvoid *userParam) {
if (type == _EXT_DEBUG_TYPE_OTHER_ARB)
diff --git a/drivers/gles3/rasterizer_gles3.h b/drivers/gles3/rasterizer_gles3.h
index 477e0dfd48..7541c55c82 100644
--- a/drivers/gles3/rasterizer_gles3.h
+++ b/drivers/gles3/rasterizer_gles3.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp
index 0951b8f798..d1d063ad5b 100644
--- a/drivers/gles3/rasterizer_scene_gles3.cpp
+++ b/drivers/gles3/rasterizer_scene_gles3.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -791,6 +791,14 @@ void RasterizerSceneGLES3::environment_set_sky_custom_fov(RID p_env, float p_sca
env->sky_custom_fov = p_scale;
}
+void RasterizerSceneGLES3::environment_set_sky_orientation(RID p_env, const Basis &p_orientation) {
+
+ Environment *env = environment_owner.getornull(p_env);
+ ERR_FAIL_COND(!env);
+
+ env->sky_orientation = p_orientation;
+}
+
void RasterizerSceneGLES3::environment_set_bg_color(RID p_env, const Color &p_color) {
Environment *env = environment_owner.getornull(p_env);
@@ -846,7 +854,7 @@ void RasterizerSceneGLES3::environment_set_dof_blur_near(RID p_env, bool p_enabl
env->dof_blur_near_amount = p_amount;
env->dof_blur_near_quality = p_quality;
}
-void RasterizerSceneGLES3::environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, VS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, bool p_bicubic_upscale) {
+void RasterizerSceneGLES3::environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, VS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, bool p_bicubic_upscale) {
Environment *env = environment_owner.getornull(p_env);
ERR_FAIL_COND(!env);
@@ -859,6 +867,7 @@ void RasterizerSceneGLES3::environment_set_glow(RID p_env, bool p_enable, int p_
env->glow_blend_mode = p_blend_mode;
env->glow_hdr_bleed_threshold = p_hdr_bleed_threshold;
env->glow_hdr_bleed_scale = p_hdr_bleed_scale;
+ env->glow_hdr_luminance_cap = p_hdr_luminance_cap;
env->glow_bicubic_upscale = p_bicubic_upscale;
}
void RasterizerSceneGLES3::environment_set_fog(RID p_env, bool p_enable, float p_begin, float p_end, RID p_gradient_texture) {
@@ -1259,7 +1268,14 @@ bool RasterizerSceneGLES3::_setup_material(RasterizerStorageGLES3::Material *p_m
case ShaderLanguage::TYPE_ISAMPLER2DARRAY:
case ShaderLanguage::TYPE_USAMPLER2DARRAY:
case ShaderLanguage::TYPE_SAMPLER2DARRAY: {
+
+ target = GL_TEXTURE_2D_ARRAY;
+ tex = storage->resources.white_tex_array;
+
+ //switch (texture_hints[i]) {
// TODO
+ //}
+
} break;
default: {}
@@ -2426,7 +2442,7 @@ void RasterizerSceneGLES3::_add_geometry_with_material(RasterizerStorageGLES3::G
}
}
-void RasterizerSceneGLES3::_draw_sky(RasterizerStorageGLES3::Sky *p_sky, const CameraMatrix &p_projection, const Transform &p_transform, bool p_vflip, float p_custom_fov, float p_energy) {
+void RasterizerSceneGLES3::_draw_sky(RasterizerStorageGLES3::Sky *p_sky, const CameraMatrix &p_projection, const Transform &p_transform, bool p_vflip, float p_custom_fov, float p_energy, const Basis &p_sky_orientation) {
ERR_FAIL_COND(!p_sky);
@@ -2518,7 +2534,12 @@ void RasterizerSceneGLES3::_draw_sky(RasterizerStorageGLES3::Sky *p_sky, const C
storage->shaders.copy.set_conditional(CopyShaderGLES3::USE_PANORAMA, !asymmetrical);
storage->shaders.copy.set_conditional(CopyShaderGLES3::USE_MULTIPLIER, true);
storage->shaders.copy.bind();
+
storage->shaders.copy.set_uniform(CopyShaderGLES3::MULTIPLIER, p_energy);
+
+ // don't know why but I always have problems setting a uniform mat3, so we're using a transform
+ storage->shaders.copy.set_uniform(CopyShaderGLES3::SKY_TRANSFORM, Transform(p_sky_orientation, Vector3(0.0, 0.0, 0.0)).affine_inverse());
+
if (asymmetrical) {
// pack the bits we need from our projection matrix
storage->shaders.copy.set_uniform(CopyShaderGLES3::ASYM_PROJ, camera.matrix[2][0], camera.matrix[0][0], camera.matrix[2][1], camera.matrix[1][1]);
@@ -2537,6 +2558,7 @@ void RasterizerSceneGLES3::_draw_sky(RasterizerStorageGLES3::Sky *p_sky, const C
}
void RasterizerSceneGLES3::_setup_environment(Environment *env, const CameraMatrix &p_cam_projection, const Transform &p_cam_transform, bool p_no_fog) {
+ Transform sky_orientation;
//store camera into ubo
store_camera(p_cam_projection, state.ubo_data.projection_matrix);
@@ -2577,6 +2599,9 @@ void RasterizerSceneGLES3::_setup_environment(Environment *env, const CameraMatr
state.ubo_data.bg_color[2] = bg_color.b;
state.ubo_data.bg_color[3] = bg_color.a;
+ //use the inverse of our sky_orientation, we may need to skip this if we're using a reflection probe?
+ sky_orientation = Transform(env->sky_orientation, Vector3(0.0, 0.0, 0.0)).affine_inverse();
+
state.env_radiance_data.ambient_contribution = env->ambient_sky_contribution;
state.ubo_data.ambient_occlusion_affect_light = env->ssao_light_affect;
state.ubo_data.ambient_occlusion_affect_ssao = env->ssao_ao_channel_affect;
@@ -2645,13 +2670,18 @@ void RasterizerSceneGLES3::_setup_environment(Environment *env, const CameraMatr
//fill up environment
- store_transform(p_cam_transform, state.env_radiance_data.transform);
+ store_transform(sky_orientation * p_cam_transform, state.env_radiance_data.transform);
glBindBuffer(GL_UNIFORM_BUFFER, state.env_radiance_ubo);
glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(State::EnvironmentRadianceUBO), &state.env_radiance_data);
glBindBuffer(GL_UNIFORM_BUFFER, 0);
}
+// Drop -O3 for this function as it triggers a GCC bug up until at least GCC 8.2.1.
+// This refers to GH issue #19633.
+// The bug has been reported to the GCC project.
+#pragma GCC push_options
+#pragma GCC optimize ("-O2")
void RasterizerSceneGLES3::_setup_directional_light(int p_index, const Transform &p_camera_inverse_transform, bool p_use_shadows) {
LightInstance *li = directional_lights[p_index];
@@ -2769,6 +2799,7 @@ void RasterizerSceneGLES3::_setup_directional_light(int p_index, const Transform
glBindBufferBase(GL_UNIFORM_BUFFER, 3, state.directional_ubo);
}
+#pragma GCC pop_options
void RasterizerSceneGLES3::_setup_lights(RID *p_light_cull_result, int p_light_cull_count, const Transform &p_camera_inverse_transform, const CameraMatrix &p_camera_projection, RID p_shadow_atlas) {
@@ -3039,20 +3070,17 @@ void RasterizerSceneGLES3::_setup_reflections(RID *p_reflection_probe_cull_resul
reflection_ubo.ambient[3] = rpi->probe_ptr->interior_ambient_probe_contrib;
} else {
Color ambient_linear;
- // FIXME: contrib was retrieved but never used, is it meant to be set as ambient[3]? (GH-20361)
- //float contrib = 0;
if (p_env) {
ambient_linear = p_env->ambient_color.to_linear();
ambient_linear.r *= p_env->ambient_energy;
ambient_linear.g *= p_env->ambient_energy;
ambient_linear.b *= p_env->ambient_energy;
- //contrib = p_env->ambient_sky_contribution;
}
reflection_ubo.ambient[0] = ambient_linear.r;
reflection_ubo.ambient[1] = ambient_linear.g;
reflection_ubo.ambient[2] = ambient_linear.b;
- reflection_ubo.ambient[3] = 0;
+ reflection_ubo.ambient[3] = 0; //not used in exterior mode, since it just blends with regular ambient light
}
int cell_size = reflection_atlas->size / reflection_atlas->subdiv;
@@ -3599,7 +3627,7 @@ void RasterizerSceneGLES3::_post_process(Environment *env, const CameraMatrix &p
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
}
- if (!env || storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT]) {
+ if (!env || storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT] || storage->frame.current_rt->width < 4 || storage->frame.current_rt->height < 4) { //no post process on small render targets
//no environment or transparent render, simply return and convert to SRGB
glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->fbo);
glActiveTexture(GL_TEXTURE0);
@@ -3901,6 +3929,7 @@ void RasterizerSceneGLES3::_post_process(Environment *env, const CameraMatrix &p
state.effect_blur_shader.set_uniform(EffectBlurShaderGLES3::PIXEL_SIZE, Vector2(1.0 / vp_w, 1.0 / vp_h));
state.effect_blur_shader.set_uniform(EffectBlurShaderGLES3::LOD, float(i));
state.effect_blur_shader.set_uniform(EffectBlurShaderGLES3::GLOW_STRENGTH, env->glow_strength);
+ state.effect_blur_shader.set_uniform(EffectBlurShaderGLES3::LUMINANCE_CAP, env->glow_hdr_luminance_cap);
glActiveTexture(GL_TEXTURE0);
if (i == 0) {
@@ -4297,8 +4326,10 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
glClearBufferfv(GL_COLOR, 0, clear_color.components); // specular
}
+ VS::EnvironmentBG bg_mode = (!env || (probe && env->bg_mode == VS::ENV_BG_CANVAS)) ? VS::ENV_BG_CLEAR_COLOR : env->bg_mode; //if no environment, or canvas while rendering a probe (invalid use case), use color.
+
if (env) {
- switch (env->bg_mode) {
+ switch (bg_mode) {
case VS::ENV_BG_COLOR_SKY:
case VS::ENV_BG_SKY:
@@ -4388,7 +4419,7 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const
*/
if (sky && sky->panorama.is_valid())
- _draw_sky(sky, p_cam_projection, p_cam_transform, false, env->sky_custom_fov, env->bg_energy);
+ _draw_sky(sky, p_cam_projection, p_cam_transform, false, env->sky_custom_fov, env->bg_energy, env->sky_orientation);
}
//_render_list_forward(&alpha_render_list,camera_transform,camera_transform_inverse,camera_projection,false,fragment_lighting,true);
diff --git a/drivers/gles3/rasterizer_scene_gles3.h b/drivers/gles3/rasterizer_scene_gles3.h
index f3157d5a46..9772b5dd23 100644
--- a/drivers/gles3/rasterizer_scene_gles3.h
+++ b/drivers/gles3/rasterizer_scene_gles3.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -114,7 +114,7 @@ public:
TonemapShaderGLES3 tonemap_shader;
struct SceneDataUBO {
- //this is a std140 compatible struct. Please read the OpenGL 3.3 Specificaiton spec before doing any changes
+ //this is a std140 compatible struct. Please read the OpenGL 3.3 Specification spec before doing any changes
float projection_matrix[16];
float inv_projection_matrix[16];
float camera_inverse_matrix[16];
@@ -365,6 +365,7 @@ public:
RID sky;
float sky_custom_fov;
+ Basis sky_orientation;
Color bg_color;
float bg_energy;
@@ -404,6 +405,7 @@ public:
VS::EnvironmentGlowBlendMode glow_blend_mode;
float glow_hdr_bleed_threshold;
float glow_hdr_bleed_scale;
+ float glow_hdr_luminance_cap;
bool glow_bicubic_upscale;
VS::EnvironmentToneMapper tone_mapper;
@@ -449,88 +451,77 @@ public:
float fog_height_max;
float fog_height_curve;
- Environment() {
- bg_mode = VS::ENV_BG_CLEAR_COLOR;
- sky_custom_fov = 0.0;
- bg_energy = 1.0;
- sky_ambient = 0;
- ambient_energy = 1.0;
- ambient_sky_contribution = 0.0;
- canvas_max_layer = 0;
-
- ssr_enabled = false;
- ssr_max_steps = 64;
- ssr_fade_in = 0.15;
- ssr_fade_out = 2.0;
- ssr_depth_tolerance = 0.2;
- ssr_roughness = true;
-
- ssao_enabled = false;
- ssao_intensity = 1.0;
- ssao_radius = 1.0;
- ssao_intensity2 = 1.0;
- ssao_radius2 = 0.0;
- ssao_bias = 0.01;
- ssao_light_affect = 0;
- ssao_ao_channel_affect = 0;
- ssao_filter = VS::ENV_SSAO_BLUR_3x3;
- ssao_quality = VS::ENV_SSAO_QUALITY_LOW;
- ssao_bilateral_sharpness = 4;
-
- tone_mapper = VS::ENV_TONE_MAPPER_LINEAR;
- tone_mapper_exposure = 1.0;
- tone_mapper_exposure_white = 1.0;
- auto_exposure = false;
- auto_exposure_speed = 0.5;
- auto_exposure_min = 0.05;
- auto_exposure_max = 8;
- auto_exposure_grey = 0.4;
-
- glow_enabled = false;
- glow_levels = (1 << 2) | (1 << 4);
- glow_intensity = 0.8;
- glow_strength = 1.0;
- glow_bloom = 0.0;
- glow_blend_mode = VS::GLOW_BLEND_MODE_SOFTLIGHT;
- glow_hdr_bleed_threshold = 1.0;
- glow_hdr_bleed_scale = 2.0;
- glow_bicubic_upscale = false;
-
- dof_blur_far_enabled = false;
- dof_blur_far_distance = 10;
- dof_blur_far_transition = 5;
- dof_blur_far_amount = 0.1;
- dof_blur_far_quality = VS::ENV_DOF_BLUR_QUALITY_MEDIUM;
-
- dof_blur_near_enabled = false;
- dof_blur_near_distance = 2;
- dof_blur_near_transition = 1;
- dof_blur_near_amount = 0.1;
- dof_blur_near_quality = VS::ENV_DOF_BLUR_QUALITY_MEDIUM;
-
- adjustments_enabled = false;
- adjustments_brightness = 1.0;
- adjustments_contrast = 1.0;
- adjustments_saturation = 1.0;
-
- fog_enabled = false;
- fog_color = Color(0.5, 0.5, 0.5);
- fog_sun_color = Color(0.8, 0.8, 0.0);
- fog_sun_amount = 0;
-
- fog_depth_enabled = true;
-
- fog_depth_begin = 10;
- fog_depth_end = 0;
- fog_depth_curve = 1;
-
- fog_transmit_enabled = true;
- fog_transmit_curve = 1;
-
- fog_height_enabled = false;
- fog_height_min = 0;
- fog_height_max = 100;
- fog_height_curve = 1;
+ Environment() :
+ bg_mode(VS::ENV_BG_CLEAR_COLOR),
+ sky_custom_fov(0.0),
+ bg_energy(1.0),
+ sky_ambient(0),
+ ambient_energy(1.0),
+ ambient_sky_contribution(0.0),
+ canvas_max_layer(0),
+ ssr_enabled(false),
+ ssr_max_steps(64),
+ ssr_fade_in(0.15),
+ ssr_fade_out(2.0),
+ ssr_depth_tolerance(0.2),
+ ssr_roughness(true),
+ ssao_enabled(false),
+ ssao_intensity(1.0),
+ ssao_radius(1.0),
+ ssao_intensity2(1.0),
+ ssao_radius2(0.0),
+ ssao_bias(0.01),
+ ssao_light_affect(0),
+ ssao_ao_channel_affect(0),
+ ssao_quality(VS::ENV_SSAO_QUALITY_LOW),
+ ssao_bilateral_sharpness(4),
+ ssao_filter(VS::ENV_SSAO_BLUR_3x3),
+ glow_enabled(false),
+ glow_levels((1 << 2) | (1 << 4)),
+ glow_intensity(0.8),
+ glow_strength(1.0),
+ glow_bloom(0.0),
+ glow_blend_mode(VS::GLOW_BLEND_MODE_SOFTLIGHT),
+ glow_hdr_bleed_threshold(1.0),
+ glow_hdr_bleed_scale(2.0),
+ glow_hdr_luminance_cap(12.0),
+ glow_bicubic_upscale(false),
+ tone_mapper(VS::ENV_TONE_MAPPER_LINEAR),
+ tone_mapper_exposure(1.0),
+ tone_mapper_exposure_white(1.0),
+ auto_exposure(false),
+ auto_exposure_speed(0.5),
+ auto_exposure_min(0.05),
+ auto_exposure_max(8),
+ auto_exposure_grey(0.4),
+ dof_blur_far_enabled(false),
+ dof_blur_far_distance(10),
+ dof_blur_far_transition(5),
+ dof_blur_far_amount(0.1),
+ dof_blur_far_quality(VS::ENV_DOF_BLUR_QUALITY_MEDIUM),
+ dof_blur_near_enabled(false),
+ dof_blur_near_distance(2),
+ dof_blur_near_transition(1),
+ dof_blur_near_amount(0.1),
+ dof_blur_near_quality(VS::ENV_DOF_BLUR_QUALITY_MEDIUM),
+ adjustments_enabled(false),
+ adjustments_brightness(1.0),
+ adjustments_contrast(1.0),
+ adjustments_saturation(1.0),
+ fog_enabled(false),
+ fog_color(Color(0.5, 0.5, 0.5)),
+ fog_sun_color(Color(0.8, 0.8, 0.0)),
+ fog_sun_amount(0),
+ fog_depth_enabled(true),
+ fog_depth_begin(10),
+ fog_depth_end(0),
+ fog_depth_curve(1),
+ fog_transmit_enabled(true),
+ fog_transmit_curve(1),
+ fog_height_enabled(false),
+ fog_height_min(0),
+ fog_height_max(100),
+ fog_height_curve(1) {
}
};
@@ -541,6 +532,7 @@ public:
virtual void environment_set_background(RID p_env, VS::EnvironmentBG p_bg);
virtual void environment_set_sky(RID p_env, RID p_sky);
virtual void environment_set_sky_custom_fov(RID p_env, float p_scale);
+ virtual void environment_set_sky_orientation(RID p_env, const Basis &p_orientation);
virtual void environment_set_bg_color(RID p_env, const Color &p_color);
virtual void environment_set_bg_energy(RID p_env, float p_energy);
virtual void environment_set_canvas_max_layer(RID p_env, int p_max_layer);
@@ -548,7 +540,7 @@ public:
virtual void environment_set_dof_blur_near(RID p_env, bool p_enable, float p_distance, float p_transition, float p_amount, VS::EnvironmentDOFBlurQuality p_quality);
virtual void environment_set_dof_blur_far(RID p_env, bool p_enable, float p_distance, float p_transition, float p_amount, VS::EnvironmentDOFBlurQuality p_quality);
- virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, VS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, bool p_bicubic_upscale);
+ virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, VS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, bool p_bicubic_upscale);
virtual void environment_set_fog(RID p_env, bool p_enable, float p_begin, float p_end, RID p_gradient_texture);
virtual void environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_in, float p_fade_out, float p_depth_tolerance, bool p_roughness);
@@ -641,9 +633,9 @@ public:
Vector3 bounds;
Transform transform_to_data;
- GIProbeInstance() {
- probe = NULL;
- tex_cache = 0;
+ GIProbeInstance() :
+ probe(NULL),
+ tex_cache(0) {
}
};
@@ -833,7 +825,7 @@ public:
_FORCE_INLINE_ void _add_geometry_with_material(RasterizerStorageGLES3::Geometry *p_geometry, InstanceBase *p_instance, RasterizerStorageGLES3::GeometryOwner *p_owner, RasterizerStorageGLES3::Material *p_material, bool p_depth_pass, bool p_shadow_pass);
- void _draw_sky(RasterizerStorageGLES3::Sky *p_sky, const CameraMatrix &p_projection, const Transform &p_transform, bool p_vflip, float p_custom_fov, float p_energy);
+ void _draw_sky(RasterizerStorageGLES3::Sky *p_sky, const CameraMatrix &p_projection, const Transform &p_transform, bool p_vflip, float p_custom_fov, float p_energy, const Basis &p_sky_orientation);
void _setup_environment(Environment *env, const CameraMatrix &p_cam_projection, const Transform &p_cam_transform, bool p_no_fog = false);
void _setup_directional_light(int p_index, const Transform &p_camera_inverse_transform, bool p_use_shadows);
diff --git a/drivers/gles3/rasterizer_storage_gles3.cpp b/drivers/gles3/rasterizer_storage_gles3.cpp
index 64e04eec71..24673c8755 100644
--- a/drivers/gles3/rasterizer_storage_gles3.cpp
+++ b/drivers/gles3/rasterizer_storage_gles3.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -632,6 +632,25 @@ void RasterizerStorageGLES3::texture_allocate(RID p_texture, int p_width, int p_
p_flags &= ~VS::TEXTURE_FLAG_MIPMAPS; // no mipies for video
}
+#ifndef GLES_OVER_GL
+ switch (p_format) {
+ case Image::FORMAT_RF:
+ case Image::FORMAT_RGF:
+ case Image::FORMAT_RGBF:
+ case Image::FORMAT_RGBAF:
+ case Image::FORMAT_RH:
+ case Image::FORMAT_RGH:
+ case Image::FORMAT_RGBH:
+ case Image::FORMAT_RGBAH: {
+ if (!config.texture_float_linear_supported) {
+ // disable linear texture filtering when not supported for float format on some devices (issue #24295)
+ p_flags &= ~VS::TEXTURE_FLAG_FILTER;
+ }
+ } break;
+ default: {}
+ }
+#endif
+
Texture *texture = texture_owner.get(p_texture);
ERR_FAIL_COND(!texture);
texture->width = p_width;
@@ -874,8 +893,6 @@ void RasterizerStorageGLES3::texture_set_data(RID p_texture, const Ref<Image> &p
int size, ofs;
img->get_mipmap_offset_and_size(i, ofs, size);
- //print_line("mipmap: "+itos(i)+" size: "+itos(size)+" w: "+itos(mm_w)+", h: "+itos(mm_h));
-
if (texture->type == VS::TEXTURE_TYPE_2D || texture->type == VS::TEXTURE_TYPE_CUBEMAP) {
if (texture->compressed) {
@@ -1062,8 +1079,6 @@ Ref<Image> RasterizerStorageGLES3::texture_get_data(RID p_texture, int p_layer)
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
- //print_line("GET FORMAT: " + Image::get_format_name(texture->format) + " mipmaps: " + itos(texture->mipmaps));
-
for (int i = 0; i < texture->mipmaps; i++) {
int ofs = 0;
@@ -1142,8 +1157,6 @@ Ref<Image> RasterizerStorageGLES3::texture_get_data(RID p_texture, int p_layer)
glBindTexture(GL_TEXTURE_2D, temp_color_texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->alloc_width, texture->alloc_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
- print_line(itos(texture->alloc_width) + " xx " + itos(texture->alloc_height) + " -> " + itos(real_format));
-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, temp_color_texture, 0);
@@ -2001,7 +2014,8 @@ void RasterizerStorageGLES3::_update_shader(Shader *p_shader) const {
actions = &shaders.actions_particles;
actions->uniforms = &p_shader->uniforms;
} break;
- case VS::SHADER_MAX: break; // Can't happen, but silences warning
+ case VS::SHADER_MAX:
+ break; // Can't happen, but silences warning
}
Error err = shaders.compiler.compile(p_shader->mode, p_shader->code, actions, p_shader->path, gen_code);
@@ -2892,9 +2906,6 @@ void RasterizerStorageGLES3::_update_material(Material *material) {
if (E->get().order < 0)
continue; // texture, does not go here
- //if (material->shader->mode == VS::SHADER_PARTICLES) {
- // print_line("uniform " + String(E->key()) + " order " + itos(E->get().order) + " offset " + itos(material->shader->ubo_offsets[E->get().order]));
- //}
//regular uniform
uint8_t *data = &local_ubo[material->shader->ubo_offsets[E->get().order]];
@@ -3787,12 +3798,14 @@ AABB RasterizerStorageGLES3::mesh_get_aabb(RID p_mesh, RID p_skeleton) const {
Mesh *mesh = mesh_owner.get(p_mesh);
ERR_FAIL_COND_V(!mesh, AABB());
- if (mesh->custom_aabb != AABB())
+ if (mesh->custom_aabb != AABB()) {
return mesh->custom_aabb;
+ }
Skeleton *sk = NULL;
- if (p_skeleton.is_valid())
+ if (p_skeleton.is_valid()) {
sk = skeleton_owner.get(p_skeleton);
+ }
AABB aabb;
@@ -3831,6 +3844,7 @@ AABB RasterizerStorageGLES3::mesh_get_aabb(RID p_mesh, RID p_skeleton) const {
mtx.origin.y = texture[base_ofs + 3];
AABB baabb = mtx.xform(skbones[j]);
+
if (first) {
laabb = baabb;
first = false;
@@ -6450,6 +6464,13 @@ void RasterizerStorageGLES3::update_particles() {
glDisable(GL_RASTERIZER_DISCARD);
}
+bool RasterizerStorageGLES3::particles_is_inactive(RID p_particles) const {
+
+ const Particles *particles = particles_owner.getornull(p_particles);
+ ERR_FAIL_COND_V(!particles, false);
+ return !particles->emitting && particles->inactive;
+}
+
////////
void RasterizerStorageGLES3::instance_add_skeleton(RID p_skeleton, RasterizerScene::InstanceBase *p_instance) {
@@ -7018,6 +7039,7 @@ RID RasterizerStorageGLES3::render_target_create() {
Texture *t = memnew(Texture);
+ t->type = VS::TEXTURE_TYPE_2D;
t->flags = 0;
t->width = 0;
t->height = 0;
@@ -7668,11 +7690,13 @@ void RasterizerStorageGLES3::initialize() {
config.etc2_supported = false;
config.s3tc_supported = true;
config.rgtc_supported = true; //RGTC - core since OpenGL version 3.0
+ config.texture_float_linear_supported = true;
#else
config.etc2_supported = true;
config.hdr_supported = false;
config.s3tc_supported = config.extensions.has("GL_EXT_texture_compression_dxt1") || config.extensions.has("GL_EXT_texture_compression_s3tc") || config.extensions.has("WEBGL_compressed_texture_s3tc");
- config.rgtc_supported = config.extensions.has("GL_EXT_texture_compression_rgtc") || config.extensions.has("GL_ARB_texture_compression_rgtc");
+ config.rgtc_supported = config.extensions.has("GL_EXT_texture_compression_rgtc") || config.extensions.has("GL_ARB_texture_compression_rgtc") || config.extensions.has("EXT_texture_compression_rgtc");
+ config.texture_float_linear_supported = config.extensions.has("GL_OES_texture_float_linear");
#endif
config.pvrtc_supported = config.extensions.has("GL_IMG_texture_compression_pvrtc");
@@ -7752,6 +7776,14 @@ void RasterizerStorageGLES3::initialize() {
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
+
+ glGenTextures(1, &resources.white_tex_array);
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D_ARRAY, resources.white_tex_array);
+ glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGB, 8, 8, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
+ glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 8, 8, 1, GL_RGB, GL_UNSIGNED_BYTE, whitetexdata);
+ glGenerateMipmap(GL_TEXTURE_2D_ARRAY);
+ glBindTexture(GL_TEXTURE_2D, 0);
}
glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &config.max_texture_image_units);
diff --git a/drivers/gles3/rasterizer_storage_gles3.h b/drivers/gles3/rasterizer_storage_gles3.h
index 8c843e4d96..811f9c8d80 100644
--- a/drivers/gles3/rasterizer_storage_gles3.h
+++ b/drivers/gles3/rasterizer_storage_gles3.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -87,6 +87,8 @@ public:
bool srgb_decode_supported;
+ bool texture_float_linear_supported;
+
bool use_rgba_2d_shadows;
float anisotropic_level;
@@ -131,6 +133,7 @@ public:
GLuint aniso_tex;
GLuint white_tex_3d;
+ GLuint white_tex_array;
GLuint quadie;
GLuint quadie_array;
@@ -285,29 +288,31 @@ public:
VisualServer::TextureDetectCallback detect_normal;
void *detect_normal_ud;
- Texture() {
-
- using_srgb = false;
- stored_cube_sides = 0;
- ignore_mipmaps = false;
- render_target = NULL;
- flags = width = height = 0;
- tex_id = 0;
- data_size = 0;
- format = Image::FORMAT_L8;
- active = false;
- compressed = false;
- total_data_size = 0;
- target = GL_TEXTURE_2D;
- mipmaps = 0;
- detect_3d = NULL;
- detect_3d_ud = NULL;
- detect_srgb = NULL;
- detect_srgb_ud = NULL;
- detect_normal = NULL;
- detect_normal_ud = NULL;
- proxy = NULL;
- redraw_if_visible = false;
+ Texture() :
+ proxy(NULL),
+ flags(0),
+ width(0),
+ height(0),
+ format(Image::FORMAT_L8),
+ type(VS::TEXTURE_TYPE_2D),
+ target(GL_TEXTURE_2D),
+ data_size(0),
+ compressed(false),
+ total_data_size(0),
+ ignore_mipmaps(false),
+ mipmaps(0),
+ active(false),
+ tex_id(0),
+ using_srgb(false),
+ redraw_if_visible(false),
+ stored_cube_sides(0),
+ render_target(NULL),
+ detect_3d(NULL),
+ detect_3d_ud(NULL),
+ detect_srgb(NULL),
+ detect_srgb_ud(NULL),
+ detect_normal(NULL),
+ detect_normal_ud(NULL) {
}
_ALWAYS_INLINE_ Texture *get_ptr() {
@@ -553,16 +558,16 @@ public:
bool is_animated_cache;
Material() :
+ shader(NULL),
+ ubo_id(0),
+ ubo_size(0),
list(this),
- dirty_list(this) {
- can_cast_shadow_cache = false;
- is_animated_cache = false;
- shader = NULL;
- line_width = 1.0;
- ubo_id = 0;
- ubo_size = 0;
- last_pass = 0;
- render_priority = 0;
+ dirty_list(this),
+ line_width(1.0),
+ render_priority(0),
+ last_pass(0),
+ can_cast_shadow_cache(false),
+ is_animated_cache(false) {
}
};
@@ -661,27 +666,24 @@ public:
int total_data_size;
- Surface() {
-
- array_byte_size = 0;
- index_array_byte_size = 0;
- mesh = NULL;
- format = 0;
- array_id = 0;
- vertex_id = 0;
- index_id = 0;
- array_len = 0;
+ Surface() :
+ mesh(NULL),
+ format(0),
+ array_id(0),
+ vertex_id(0),
+ index_id(0),
+ index_wireframe_id(0),
+ array_wireframe_id(0),
+ instancing_array_wireframe_id(0),
+ index_wireframe_len(0),
+ array_len(0),
+ index_array_len(0),
+ array_byte_size(0),
+ index_array_byte_size(0),
+ primitive(VS::PRIMITIVE_POINTS),
+ active(false),
+ total_data_size(0) {
type = GEOMETRY_SURFACE;
- primitive = VS::PRIMITIVE_POINTS;
- index_array_len = 0;
- active = false;
-
- total_data_size = 0;
-
- index_wireframe_id = 0;
- array_wireframe_id = 0;
- instancing_array_wireframe_id = 0;
- index_wireframe_len = 0;
}
~Surface() {
@@ -708,11 +710,11 @@ public:
}
}
- Mesh() {
- blend_shape_mode = VS::BLEND_SHAPE_MODE_NORMALIZED;
- blend_shape_count = 0;
- last_pass = 0;
- active = false;
+ Mesh() :
+ active(false),
+ blend_shape_count(0),
+ blend_shape_mode(VS::BLEND_SHAPE_MODE_NORMALIZED),
+ last_pass(0) {
}
};
@@ -780,19 +782,19 @@ public:
bool dirty_data;
MultiMesh() :
+ size(0),
+ transform_format(VS::MULTIMESH_TRANSFORM_2D),
+ color_format(VS::MULTIMESH_COLOR_NONE),
+ custom_data_format(VS::MULTIMESH_CUSTOM_DATA_NONE),
update_list(this),
- mesh_list(this) {
- dirty_aabb = true;
- dirty_data = true;
- xform_floats = 0;
- color_floats = 0;
- custom_data_floats = 0;
- visible_instances = -1;
- size = 0;
- buffer = 0;
- transform_format = VS::MULTIMESH_TRANSFORM_2D;
- color_format = VS::MULTIMESH_COLOR_NONE;
- custom_data_format = VS::MULTIMESH_CUSTOM_DATA_NONE;
+ mesh_list(this),
+ buffer(0),
+ visible_instances(-1),
+ xform_floats(0),
+ color_floats(0),
+ custom_data_floats(0),
+ dirty_aabb(true),
+ dirty_data(true) {
}
};
@@ -889,11 +891,10 @@ public:
Transform2D base_transform_2d;
Skeleton() :
+ use_2d(false),
+ size(0),
+ texture(0),
update_list(this) {
- size = 0;
-
- use_2d = false;
- texture = 0;
}
};
@@ -1174,37 +1175,31 @@ public:
Transform emission_transform;
Particles() :
- particle_element(this) {
- cycle_number = 0;
- emitting = false;
- one_shot = false;
- amount = 0;
- lifetime = 1.0;
- pre_process_time = 0.0;
- explosiveness = 0.0;
- randomness = 0.0;
- use_local_coords = true;
- fixed_fps = 0;
- fractional_delta = false;
- frame_remainder = 0;
- histories_enabled = false;
- speed_scale = 1.0;
- random_seed = 0;
-
- restart_request = false;
-
- custom_aabb = AABB(Vector3(-4, -4, -4), Vector3(8, 8, 8));
-
- draw_order = VS::PARTICLES_DRAW_ORDER_INDEX;
+ inactive(true),
+ inactive_time(0.0),
+ emitting(false),
+ one_shot(false),
+ amount(0),
+ lifetime(1.0),
+ pre_process_time(0.0),
+ explosiveness(0.0),
+ randomness(0.0),
+ restart_request(false),
+ custom_aabb(AABB(Vector3(-4, -4, -4), Vector3(8, 8, 8))),
+ use_local_coords(true),
+ draw_order(VS::PARTICLES_DRAW_ORDER_INDEX),
+ histories_enabled(false),
+ particle_element(this),
+ prev_ticks(0),
+ random_seed(0),
+ cycle_number(0),
+ speed_scale(1.0),
+ fixed_fps(0),
+ fractional_delta(false),
+ frame_remainder(0),
+ clear(true) {
particle_buffers[0] = 0;
particle_buffers[1] = 0;
-
- prev_ticks = 0;
-
- clear = true;
- inactive = true;
- inactive_time = 0.0;
-
glGenBuffers(2, particle_buffers);
glGenVertexArrays(2, particle_vaos);
}
@@ -1261,6 +1256,8 @@ public:
virtual int particles_get_draw_passes(RID p_particles) const;
virtual RID particles_get_draw_pass_mesh(RID p_particles, int p_pass) const;
+ virtual bool particles_is_inactive(RID p_particles) const;
+
/* INSTANCE */
virtual void instance_add_skeleton(RID p_skeleton, RasterizerScene::InstanceBase *p_instance);
@@ -1307,9 +1304,9 @@ public:
GLuint color;
int levels;
- MipMaps() {
- color = 0;
- levels = 0;
+ MipMaps() :
+ color(0),
+ levels(0) {
}
};
@@ -1324,10 +1321,10 @@ public:
Vector<GLuint> depth_mipmap_fbos; //fbos for depth mipmapsla ver
- SSAO() {
+ SSAO() :
+ linear_depth(0) {
blur_fbo[0] = 0;
blur_fbo[1] = 0;
- linear_depth = 0;
}
} ssao;
@@ -1339,7 +1336,8 @@ public:
GLuint fbo;
GLuint color;
- Exposure() { fbo = 0; }
+ Exposure() :
+ fbo(0) {}
} exposure;
uint64_t last_exposure_tick;
@@ -1353,26 +1351,22 @@ public:
RID texture;
- RenderTarget() {
-
- msaa = VS::VIEWPORT_MSAA_DISABLED;
- width = 0;
- height = 0;
- depth = 0;
- fbo = 0;
+ RenderTarget() :
+ fbo(0),
+ depth(0),
+ last_exposure_tick(0),
+ width(0),
+ height(0),
+ used_in_frame(false),
+ msaa(VS::VIEWPORT_MSAA_DISABLED) {
exposure.fbo = 0;
buffers.fbo = 0;
- used_in_frame = false;
-
for (int i = 0; i < RENDER_TARGET_FLAG_MAX; i++) {
flags[i] = false;
}
flags[RENDER_TARGET_HDR] = true;
-
buffers.active = false;
buffers.effects_active = false;
-
- last_exposure_tick = 0;
}
};
diff --git a/drivers/gles3/shader_compiler_gles3.cpp b/drivers/gles3/shader_compiler_gles3.cpp
index fb6e168327..cda6dac506 100644
--- a/drivers/gles3/shader_compiler_gles3.cpp
+++ b/drivers/gles3/shader_compiler_gles3.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -133,8 +133,7 @@ static String _interpstr(SL::DataInterpolation p_interp) {
switch (p_interp) {
case SL::INTERPOLATION_FLAT: return "flat ";
- case SL::INTERPOLATION_NO_PERSPECTIVE: return "noperspective ";
- case SL::INTERPOLATION_SMOOTH: return "smooth ";
+ case SL::INTERPOLATION_SMOOTH: return "";
}
return "";
}
@@ -173,10 +172,11 @@ static String _mkid(const String &p_id) {
static String f2sp0(float p_float) {
- if (int(p_float) == p_float)
- return itos(p_float) + ".0";
- else
- return rtoss(p_float);
+ String num = rtoss(p_float);
+ if (num.find(".") == -1 && num.find("e") == -1) {
+ num += ".0";
+ }
+ return num;
}
static String get_constant_text(SL::DataType p_type, const Vector<SL::ConstantNode::Value> &p_values) {
@@ -229,7 +229,7 @@ static String get_constant_text(SL::DataType p_type, const Vector<SL::ConstantNo
text += ")";
return text;
} break;
- case SL::TYPE_FLOAT: return f2sp0(p_values[0].real) + "f";
+ case SL::TYPE_FLOAT: return f2sp0(p_values[0].real);
case SL::TYPE_VEC2:
case SL::TYPE_VEC3:
case SL::TYPE_VEC4: {
@@ -748,7 +748,7 @@ Error ShaderCompilerGLES3::compile(VS::ShaderMode p_mode, const String &p_code,
Vector<String> shader = p_code.split("\n");
for (int i = 0; i < shader.size(); i++) {
- print_line(itos(i) + " " + shader[i]);
+ print_line(itos(i + 1) + " " + shader[i]);
}
_err_print_error(NULL, p_path.utf8().get_data(), parser.get_error_line(), parser.get_error_text().utf8().get_data(), ERR_HANDLER_SHADER);
@@ -786,7 +786,7 @@ ShaderCompilerGLES3::ShaderCompilerGLES3() {
/** CANVAS ITEM SHADER **/
actions[VS::SHADER_CANVAS_ITEM].renames["VERTEX"] = "outvec.xy";
- actions[VS::SHADER_CANVAS_ITEM].renames["UV"] = "uv_interp";
+ actions[VS::SHADER_CANVAS_ITEM].renames["UV"] = "uv";
actions[VS::SHADER_CANVAS_ITEM].renames["POINT_SIZE"] = "gl_PointSize";
actions[VS::SHADER_CANVAS_ITEM].renames["WORLD_MATRIX"] = "modelview_matrix";
@@ -838,6 +838,7 @@ ShaderCompilerGLES3::ShaderCompilerGLES3() {
actions[VS::SHADER_SPATIAL].renames["NORMAL"] = "normal";
actions[VS::SHADER_SPATIAL].renames["TANGENT"] = "tangent";
actions[VS::SHADER_SPATIAL].renames["BINORMAL"] = "binormal";
+ actions[VS::SHADER_SPATIAL].renames["POSITION"] = "position";
actions[VS::SHADER_SPATIAL].renames["UV"] = "uv_interp";
actions[VS::SHADER_SPATIAL].renames["UV2"] = "uv2_interp";
actions[VS::SHADER_SPATIAL].renames["COLOR"] = "color_interp";
@@ -903,6 +904,7 @@ ShaderCompilerGLES3::ShaderCompilerGLES3() {
actions[VS::SHADER_SPATIAL].usage_defines["COLOR"] = "#define ENABLE_COLOR_INTERP\n";
actions[VS::SHADER_SPATIAL].usage_defines["INSTANCE_CUSTOM"] = "#define ENABLE_INSTANCE_CUSTOM\n";
actions[VS::SHADER_SPATIAL].usage_defines["ALPHA_SCISSOR"] = "#define ALPHA_SCISSOR_USED\n";
+ actions[VS::SHADER_SPATIAL].usage_defines["POSITION"] = "#define OVERRIDE_POSITION\n";
actions[VS::SHADER_SPATIAL].usage_defines["SSS_STRENGTH"] = "#define ENABLE_SSS\n";
actions[VS::SHADER_SPATIAL].usage_defines["TRANSMISSION"] = "#define TRANSMISSION_USED\n";
@@ -948,7 +950,7 @@ ShaderCompilerGLES3::ShaderCompilerGLES3() {
actions[VS::SHADER_PARTICLES].renames["COLOR"] = "out_color";
actions[VS::SHADER_PARTICLES].renames["VELOCITY"] = "out_velocity_active.xyz";
actions[VS::SHADER_PARTICLES].renames["MASS"] = "mass";
- actions[VS::SHADER_PARTICLES].renames["ACTIVE"] = "active";
+ actions[VS::SHADER_PARTICLES].renames["ACTIVE"] = "shader_active";
actions[VS::SHADER_PARTICLES].renames["RESTART"] = "restart";
actions[VS::SHADER_PARTICLES].renames["CUSTOM"] = "out_custom";
actions[VS::SHADER_PARTICLES].renames["TRANSFORM"] = "xform";
diff --git a/drivers/gles3/shader_compiler_gles3.h b/drivers/gles3/shader_compiler_gles3.h
index 1f903b8935..79f5c50f88 100644
--- a/drivers/gles3/shader_compiler_gles3.h
+++ b/drivers/gles3/shader_compiler_gles3.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/gles3/shader_gles3.cpp b/drivers/gles3/shader_gles3.cpp
index 404a9107ab..edc2a6c054 100644
--- a/drivers/gles3/shader_gles3.cpp
+++ b/drivers/gles3/shader_gles3.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/gles3/shader_gles3.h b/drivers/gles3/shader_gles3.h
index 0d360e8453..1f98f4883d 100644
--- a/drivers/gles3/shader_gles3.h
+++ b/drivers/gles3/shader_gles3.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/gles3/shaders/canvas.glsl b/drivers/gles3/shaders/canvas.glsl
index ef2319c332..974eff86f3 100644
--- a/drivers/gles3/shaders/canvas.glsl
+++ b/drivers/gles3/shaders/canvas.glsl
@@ -145,6 +145,8 @@ void main() {
#define extra_matrix extra_matrix_instance
+ //for compatibility with the fragment shader we need to use uv here
+ vec2 uv = uv_interp;
{
/* clang-format off */
@@ -153,6 +155,8 @@ VERTEX_SHADER_CODE
/* clang-format on */
}
+ uv_interp = uv;
+
#ifdef USE_NINEPATCH
pixel_size_interp = abs(dst_rect.zw) * vertex;
@@ -477,6 +481,7 @@ void main() {
#if defined(NORMALMAP_USED)
vec3 normal_map = vec3(0.0, 0.0, 1.0);
+ normal_used = true;
#endif
/* clang-format off */
diff --git a/drivers/gles3/shaders/copy.glsl b/drivers/gles3/shaders/copy.glsl
index a5637537d2..3b36bc7cc1 100644
--- a/drivers/gles3/shaders/copy.glsl
+++ b/drivers/gles3/shaders/copy.glsl
@@ -79,6 +79,7 @@ uniform float multiplier;
#endif
#if defined(USE_PANORAMA) || defined(USE_ASYM_PANO)
+uniform highp mat4 sky_transform;
vec4 texturePanorama(vec3 normal, sampler2D pano) {
@@ -121,7 +122,12 @@ void main() {
#ifdef USE_PANORAMA
- vec4 color = texturePanorama(normalize(cube_interp), source);
+ vec3 cube_normal = normalize(cube_interp);
+ cube_normal.z = -cube_normal.z;
+ cube_normal = mat3(sky_transform) * cube_normal;
+ cube_normal.z = -cube_normal.z;
+
+ vec4 color = texturePanorama(cube_normal, source);
#elif defined(USE_ASYM_PANO)
@@ -133,7 +139,7 @@ void main() {
cube_normal.z = -1000000.0;
cube_normal.x = (cube_normal.z * (-uv_interp.x - asym_proj.x)) / asym_proj.y;
cube_normal.y = (cube_normal.z * (-uv_interp.y - asym_proj.z)) / asym_proj.a;
- cube_normal = mat3(pano_transform) * cube_normal;
+ cube_normal = mat3(sky_transform) * mat3(pano_transform) * cube_normal;
cube_normal.z = -cube_normal.z;
vec4 color = texturePanorama(normalize(cube_normal.xyz), source);
diff --git a/drivers/gles3/shaders/effect_blur.glsl b/drivers/gles3/shaders/effect_blur.glsl
index b67d06bc10..fc15ca31b1 100644
--- a/drivers/gles3/shaders/effect_blur.glsl
+++ b/drivers/gles3/shaders/effect_blur.glsl
@@ -94,6 +94,7 @@ uniform sampler2D source_dof_original; //texunit:2
uniform float exposure;
uniform float white;
+uniform highp float luminance_cap;
#ifdef GLOW_USE_AUTO_EXPOSURE
@@ -271,7 +272,7 @@ void main() {
float luminance = max(frag_color.r, max(frag_color.g, frag_color.b));
float feedback = max(smoothstep(glow_hdr_threshold, glow_hdr_threshold + glow_hdr_scale, luminance), glow_bloom);
- frag_color *= feedback;
+ frag_color = min(frag_color * feedback, vec4(luminance_cap));
#endif
diff --git a/drivers/gles3/shaders/scene.glsl b/drivers/gles3/shaders/scene.glsl
index d4079c4b4f..86aac2801a 100644
--- a/drivers/gles3/shaders/scene.glsl
+++ b/drivers/gles3/shaders/scene.glsl
@@ -165,18 +165,68 @@ uniform int spot_light_count;
out vec4 diffuse_light_interp;
out vec4 specular_light_interp;
+
void light_compute(vec3 N, vec3 L, vec3 V, vec3 light_color, float roughness, inout vec3 diffuse, inout vec3 specular) {
- float dotNL = max(dot(N, L), 0.0);
- diffuse += dotNL * light_color / M_PI;
+
+ float NdotL = dot(N, L);
+ float cNdotL = max(NdotL, 0.0); // clamped NdotL
+ float NdotV = dot(N, V);
+ float cNdotV = max(NdotV, 0.0);
+
+#if defined(DIFFUSE_OREN_NAYAR)
+ vec3 diffuse_brdf_NL;
+#else
+ float diffuse_brdf_NL; // BRDF times N.L for calculating diffuse radiance
+#endif
+
+#if defined(DIFFUSE_LAMBERT_WRAP)
+ // energy conserving lambert wrap shader
+ diffuse_brdf_NL = max(0.0, (NdotL + roughness) / ((1.0 + roughness) * (1.0 + roughness)));
+
+#elif defined(DIFFUSE_OREN_NAYAR)
+
+ {
+ // see http://mimosa-pudica.net/improved-oren-nayar.html
+ float LdotV = dot(L, V);
+
+ float s = LdotV - NdotL * NdotV;
+ float t = mix(1.0, max(NdotL, NdotV), step(0.0, s));
+
+ float sigma2 = roughness * roughness; // TODO: this needs checking
+ vec3 A = 1.0 + sigma2 * (-0.5 / (sigma2 + 0.33) + 0.17 * diffuse_color / (sigma2 + 0.13));
+ float B = 0.45 * sigma2 / (sigma2 + 0.09);
+
+ diffuse_brdf_NL = cNdotL * (A + vec3(B) * s / t) * (1.0 / M_PI);
+ }
+#else
+ // lambert by default for everything else
+ diffuse_brdf_NL = cNdotL * (1.0 / M_PI);
+#endif
+
+ diffuse += light_color * diffuse_brdf_NL;
if (roughness > 0.0) {
+ // D
+ float specular_brdf_NL = 0.0;
+
+#if !defined(SPECULAR_DISABLED)
+ //normalized blinn always unless disabled
vec3 H = normalize(V + L);
- float dotNH = max(dot(N, H), 0.0);
- float intensity = (roughness >= 1.0 ? 1.0 : pow(dotNH, (1.0 - roughness) * 256.0));
- specular += light_color * intensity;
+ float cNdotH = max(dot(N, H), 0.0);
+ float cVdotH = max(dot(V, H), 0.0);
+ float cLdotH = max(dot(L, H), 0.0);
+ float shininess = exp2(15.0 * (1.0 - roughness) + 1.0) * 0.25;
+ float blinn = pow(cNdotH, shininess);
+ blinn *= (shininess + 8.0) * (1.0 / (8.0 * M_PI));
+ specular_brdf_NL = (blinn) / max(4.0 * cNdotV * cNdotL, 0.75);
+#endif
+
+ specular += specular_brdf_NL * light_color * (1.0 / M_PI);
}
+
+
}
void light_process_omni(int idx, vec3 vertex, vec3 eye_vec, vec3 normal, float roughness, inout vec3 diffuse, inout vec3 specular) {
@@ -306,6 +356,10 @@ void main() {
uv2_interp = uv2_attrib;
#endif
+#ifdef OVERRIDE_POSITION
+ highp vec4 position;
+#endif
+
#if defined(USE_INSTANCING) && defined(ENABLE_INSTANCE_CUSTOM)
vec4 instance_custom = instance_custom_data;
#else
@@ -461,7 +515,11 @@ VERTEX_SHADER_CODE
#endif //RENDER_DEPTH
+#ifdef OVERRIDE_POSITION
+ gl_Position = position;
+#else
gl_Position = projection_matrix * vec4(vertex_interp, 1.0);
+#endif
position_interp = gl_Position;
@@ -1504,7 +1562,7 @@ void gi_probe_compute(mediump sampler3D probe, mat4 probe_xform, vec3 bounds, ve
//irradiance
- vec3 irr_light = voxel_cone_trace(probe, cell_size, probe_pos, environment, blend_ambient, ref_vec, max(min_ref_tan, tan(roughness * 0.5 * M_PI)), max_distance, p_bias);
+ vec3 irr_light = voxel_cone_trace(probe, cell_size, probe_pos, environment, blend_ambient, ref_vec, max(min_ref_tan, tan(roughness * 0.5 * M_PI * 0.99)), max_distance, p_bias);
irr_light *= multiplier;
//irr_light=vec3(0.0);
@@ -1565,6 +1623,7 @@ void main() {
//lay out everything, whathever is unused is optimized away anyway
highp vec3 vertex = vertex_interp;
+ vec3 view = -normalize(vertex_interp);
vec3 albedo = vec3(1.0);
vec3 transmission = vec3(0.0);
float metallic = 0.0;
@@ -1585,24 +1644,24 @@ void main() {
float alpha = 1.0;
-#if defined(DO_SIDE_CHECK)
- float side = gl_FrontFacing ? 1.0 : -1.0;
-#else
- float side = 1.0;
-#endif
-
#if defined(ALPHA_SCISSOR_USED)
float alpha_scissor = 0.5;
#endif
#if defined(ENABLE_TANGENT_INTERP) || defined(ENABLE_NORMALMAP) || defined(LIGHT_USE_ANISOTROPY)
- vec3 binormal = normalize(binormal_interp) * side;
- vec3 tangent = normalize(tangent_interp) * side;
+ vec3 binormal = normalize(binormal_interp);
+ vec3 tangent = normalize(tangent_interp);
#else
vec3 binormal = vec3(0.0);
vec3 tangent = vec3(0.0);
#endif
- vec3 normal = normalize(normal_interp) * side;
+ vec3 normal = normalize(normal_interp);
+
+#if defined(DO_SIDE_CHECK)
+ if (!gl_FrontFacing) {
+ normal = -normal;
+ }
+#endif
#if defined(ENABLE_UV_INTERP)
vec2 uv = uv_interp;
@@ -1658,7 +1717,7 @@ FRAGMENT_SHADER_CODE
normalmap.xy = normalmap.xy * 2.0 - 1.0;
normalmap.z = sqrt(max(0.0, 1.0 - dot(normalmap.xy, normalmap.xy))); //always ignore Z, as it can be RG packed, Z may be pos/neg, etc.
- normal = normalize(mix(normal_interp, tangent * normalmap.x + binormal * normalmap.y + normal * normalmap.z, normaldepth)) * side;
+ normal = normalize(mix(normal, tangent * normalmap.x + binormal * normalmap.y + normal * normalmap.z, normaldepth));
#endif
@@ -1699,7 +1758,7 @@ FRAGMENT_SHADER_CODE
vec3 ambient_light;
vec3 env_reflection_light = vec3(0.0, 0.0, 0.0);
- vec3 eye_vec = -normalize(vertex_interp);
+ vec3 eye_vec = view;
#ifdef USE_RADIANCE_MAP
@@ -2027,7 +2086,7 @@ FRAGMENT_SHADER_CODE
//apply fog
if (fog_depth_enabled) {
- float fog_far = fog_depth_end > 0 ? fog_depth_end : z_far;
+ float fog_far = fog_depth_end > 0.0 ? fog_depth_end : z_far;
float fog_z = smoothstep(fog_depth_begin, fog_far, length(vertex));
diff --git a/drivers/png/image_loader_png.cpp b/drivers/png/image_loader_png.cpp
index a4ea889d3b..6d8185cdd8 100644
--- a/drivers/png/image_loader_png.cpp
+++ b/drivers/png/image_loader_png.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/png/image_loader_png.h b/drivers/png/image_loader_png.h
index 5dff7e3902..c3951979c3 100644
--- a/drivers/png/image_loader_png.h
+++ b/drivers/png/image_loader_png.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/png/resource_saver_png.cpp b/drivers/png/resource_saver_png.cpp
index c5729f70b2..9e8043cbea 100644
--- a/drivers/png/resource_saver_png.cpp
+++ b/drivers/png/resource_saver_png.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/png/resource_saver_png.h b/drivers/png/resource_saver_png.h
index 34950f6723..584ccd4908 100644
--- a/drivers/png/resource_saver_png.h
+++ b/drivers/png/resource_saver_png.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -35,6 +35,7 @@
#include "core/io/resource_saver.h"
class ResourceSaverPNG : public ResourceFormatSaver {
+ GDCLASS(ResourceSaverPNG, ResourceFormatSaver)
public:
static Error save_image(const String &p_path, const Ref<Image> &p_img);
diff --git a/drivers/pulseaudio/audio_driver_pulseaudio.cpp b/drivers/pulseaudio/audio_driver_pulseaudio.cpp
index 010f7bdb0a..0d98b7fbc0 100644
--- a/drivers/pulseaudio/audio_driver_pulseaudio.cpp
+++ b/drivers/pulseaudio/audio_driver_pulseaudio.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -316,6 +316,7 @@ void AudioDriverPulseAudio::thread_func(void *p_udata) {
AudioDriverPulseAudio *ad = (AudioDriverPulseAudio *)p_udata;
unsigned int write_ofs = 0;
size_t avail_bytes = 0;
+ uint32_t default_device_msec = OS::get_singleton()->get_ticks_msec();
while (!ad->exit_thread) {
@@ -374,7 +375,7 @@ void AudioDriverPulseAudio::thread_func(void *p_udata) {
const void *ptr = ad->samples_out.ptr();
ret = pa_stream_write(ad->pa_str, (char *)ptr + write_ofs, bytes_to_write, NULL, 0LL, PA_SEEK_RELATIVE);
if (ret != 0) {
- ERR_PRINT("pa_stream_write error");
+ ERR_PRINTS("PulseAudio: pa_stream_write error: " + String(pa_strerror(ret)));
} else {
avail_bytes -= bytes_to_write;
write_ofs += bytes_to_write;
@@ -401,6 +402,50 @@ void AudioDriverPulseAudio::thread_func(void *p_udata) {
break;
}
}
+
+ avail_bytes = 0;
+ write_ofs = 0;
+ }
+
+ // If we're using the default device check that the current device is still the default
+ if (ad->device_name == "Default") {
+
+ uint32_t msec = OS::get_singleton()->get_ticks_msec();
+ if (msec > (default_device_msec + 1000)) {
+ String old_default_device = ad->default_device;
+
+ default_device_msec = msec;
+
+ ad->pa_status = 0;
+ pa_operation *pa_op = pa_context_get_server_info(ad->pa_ctx, &AudioDriverPulseAudio::pa_server_info_cb, (void *)ad);
+ if (pa_op) {
+ while (ad->pa_status == 0) {
+ int ret = pa_mainloop_iterate(ad->pa_ml, 1, NULL);
+ if (ret < 0) {
+ ERR_PRINT("pa_mainloop_iterate error");
+ }
+ }
+
+ pa_operation_unref(pa_op);
+ } else {
+ ERR_PRINT("pa_context_get_server_info error");
+ }
+
+ if (old_default_device != ad->default_device) {
+ ad->finish_device();
+
+ Error err = ad->init_device();
+ if (err != OK) {
+ ERR_PRINT("PulseAudio: init_device error");
+ ad->active = false;
+ ad->exit_thread = true;
+ break;
+ }
+
+ avail_bytes = 0;
+ write_ofs = 0;
+ }
+ }
}
if (ad->pa_rec_str && pa_stream_get_state(ad->pa_rec_str) == PA_STREAM_READY) {
@@ -740,35 +785,28 @@ String AudioDriverPulseAudio::capture_get_device() {
return name;
}
-AudioDriverPulseAudio::AudioDriverPulseAudio() {
-
- pa_ml = NULL;
- pa_ctx = NULL;
- pa_str = NULL;
- pa_rec_str = NULL;
-
- mutex = NULL;
- thread = NULL;
-
- device_name = "Default";
- new_device = "Default";
- default_device = "";
-
+AudioDriverPulseAudio::AudioDriverPulseAudio() :
+ thread(NULL),
+ mutex(NULL),
+ pa_ml(NULL),
+ pa_ctx(NULL),
+ pa_str(NULL),
+ pa_rec_str(NULL),
+ device_name("Default"),
+ new_device("Default"),
+ default_device(""),
+ mix_rate(0),
+ buffer_frames(0),
+ pa_buffer_size(0),
+ channels(0),
+ pa_ready(0),
+ pa_status(0),
+ active(false),
+ thread_exited(false),
+ exit_thread(false),
+ latency(0) {
samples_in.clear();
samples_out.clear();
-
- mix_rate = 0;
- buffer_frames = 0;
- pa_buffer_size = 0;
- channels = 0;
- pa_ready = 0;
- pa_status = 0;
-
- active = false;
- thread_exited = false;
- exit_thread = false;
-
- latency = 0;
}
AudioDriverPulseAudio::~AudioDriverPulseAudio() {
diff --git a/drivers/pulseaudio/audio_driver_pulseaudio.h b/drivers/pulseaudio/audio_driver_pulseaudio.h
index d8bab841ff..caa09d6020 100644
--- a/drivers/pulseaudio/audio_driver_pulseaudio.h
+++ b/drivers/pulseaudio/audio_driver_pulseaudio.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/register_driver_types.cpp b/drivers/register_driver_types.cpp
index 9f5d9c1abf..20556d98af 100644
--- a/drivers/register_driver_types.cpp
+++ b/drivers/register_driver_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -42,15 +42,15 @@
#include "platform/windows/export/export.h"
#endif
-static ImageLoaderPNG *image_loader_png = NULL;
-static ResourceSaverPNG *resource_saver_png = NULL;
+static ImageLoaderPNG *image_loader_png;
+static Ref<ResourceSaverPNG> resource_saver_png;
void register_core_driver_types() {
image_loader_png = memnew(ImageLoaderPNG);
ImageLoader::add_image_format_loader(image_loader_png);
- resource_saver_png = memnew(ResourceSaverPNG);
+ resource_saver_png.instance();
ResourceSaver::add_resource_format_saver(resource_saver_png);
}
@@ -58,8 +58,9 @@ void unregister_core_driver_types() {
if (image_loader_png)
memdelete(image_loader_png);
- if (resource_saver_png)
- memdelete(resource_saver_png);
+
+ ResourceSaver::remove_resource_format_saver(resource_saver_png);
+ resource_saver_png.unref();
}
void register_driver_types() {
diff --git a/drivers/register_driver_types.h b/drivers/register_driver_types.h
index ddd1fac093..3fdf802c9f 100644
--- a/drivers/register_driver_types.h
+++ b/drivers/register_driver_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/rtaudio/audio_driver_rtaudio.cpp b/drivers/rtaudio/audio_driver_rtaudio.cpp
index bc6ceb1e7e..e45621d70f 100644
--- a/drivers/rtaudio/audio_driver_rtaudio.cpp
+++ b/drivers/rtaudio/audio_driver_rtaudio.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -194,13 +194,12 @@ void AudioDriverRtAudio::finish() {
}
}
-AudioDriverRtAudio::AudioDriverRtAudio() {
-
- active = false;
- mutex = NULL;
- dac = NULL;
- mix_rate = DEFAULT_MIX_RATE;
- speaker_mode = SPEAKER_MODE_STEREO;
+AudioDriverRtAudio::AudioDriverRtAudio() :
+ speaker_mode(SPEAKER_MODE_STEREO),
+ mutex(NULL),
+ dac(NULL),
+ mix_rate(DEFAULT_MIX_RATE),
+ active(false) {
}
#endif
diff --git a/drivers/rtaudio/audio_driver_rtaudio.h b/drivers/rtaudio/audio_driver_rtaudio.h
index 2a64652d5f..ac4eee4947 100644
--- a/drivers/rtaudio/audio_driver_rtaudio.h
+++ b/drivers/rtaudio/audio_driver_rtaudio.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/unix/dir_access_unix.cpp b/drivers/unix/dir_access_unix.cpp
index 929e67faa9..7284226ae7 100644
--- a/drivers/unix/dir_access_unix.cpp
+++ b/drivers/unix/dir_access_unix.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -328,6 +328,17 @@ Error DirAccessUnix::change_dir(String p_dir) {
return ERR_INVALID_PARAMETER;
}
+ String base = _get_root_path();
+ if (base != String() && !try_dir.begins_with(base)) {
+ ERR_FAIL_COND_V(getcwd(real_current_dir_name, 2048) == NULL, ERR_BUG);
+ String new_dir;
+ new_dir.parse_utf8(real_current_dir_name);
+
+ if (!new_dir.begins_with(base)) {
+ try_dir = current_dir; //revert
+ }
+ }
+
// the directory exists, so set current_dir to try_dir
current_dir = try_dir;
ERR_FAIL_COND_V(chdir(prev_dir.utf8().get_data()) != 0, ERR_BUG);
diff --git a/drivers/unix/dir_access_unix.h b/drivers/unix/dir_access_unix.h
index 26978930bd..4da7e42b64 100644
--- a/drivers/unix/dir_access_unix.h
+++ b/drivers/unix/dir_access_unix.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/unix/file_access_unix.cpp b/drivers/unix/file_access_unix.cpp
index 3b97b95f7c..072ffd96e7 100644
--- a/drivers/unix/file_access_unix.cpp
+++ b/drivers/unix/file_access_unix.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -309,11 +309,10 @@ FileAccess *FileAccessUnix::create_libc() {
CloseNotificationFunc FileAccessUnix::close_notification_func = NULL;
-FileAccessUnix::FileAccessUnix() {
-
- f = NULL;
- flags = 0;
- last_error = OK;
+FileAccessUnix::FileAccessUnix() :
+ f(NULL),
+ flags(0),
+ last_error(OK) {
}
FileAccessUnix::~FileAccessUnix() {
diff --git a/drivers/unix/file_access_unix.h b/drivers/unix/file_access_unix.h
index d4a4f8230c..6405589b4d 100644
--- a/drivers/unix/file_access_unix.h
+++ b/drivers/unix/file_access_unix.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/unix/ip_unix.cpp b/drivers/unix/ip_unix.cpp
index 949609bb9a..824ba7bb8a 100644
--- a/drivers/unix/ip_unix.cpp
+++ b/drivers/unix/ip_unix.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -55,10 +55,12 @@
#include <iphlpapi.h>
#endif // MINGW hack
#endif
-#else
+#else // UNIX
#include <netdb.h>
#ifdef ANDROID_ENABLED
-#include "platform/android/ifaddrs_android.h"
+// We could drop this file once we up our API level to 24,
+// where the NDK's ifaddrs.h supports to needed getifaddrs.
+#include "thirdparty/misc/ifaddrs-android.h"
#else
#ifdef __FreeBSD__
#include <sys/types.h>
@@ -201,7 +203,7 @@ void IP_Unix::get_local_addresses(List<IP_Address> *r_addresses) const {
#endif
-#else
+#else // UNIX
void IP_Unix::get_local_addresses(List<IP_Address> *r_addresses) const {
diff --git a/drivers/unix/ip_unix.h b/drivers/unix/ip_unix.h
index 83535045b1..e36535146e 100644
--- a/drivers/unix/ip_unix.h
+++ b/drivers/unix/ip_unix.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/unix/mutex_posix.cpp b/drivers/unix/mutex_posix.cpp
index e0004c5730..0640b57305 100644
--- a/drivers/unix/mutex_posix.cpp
+++ b/drivers/unix/mutex_posix.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/unix/mutex_posix.h b/drivers/unix/mutex_posix.h
index 80d85eee61..ee01ee629d 100644
--- a/drivers/unix/mutex_posix.h
+++ b/drivers/unix/mutex_posix.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/unix/net_socket_posix.cpp b/drivers/unix/net_socket_posix.cpp
index 833b17f122..6910abc64c 100644
--- a/drivers/unix/net_socket_posix.cpp
+++ b/drivers/unix/net_socket_posix.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -167,10 +167,10 @@ void NetSocketPosix::cleanup() {
#endif
}
-NetSocketPosix::NetSocketPosix() {
- _sock = SOCK_EMPTY;
- _ip_type = IP::TYPE_NONE;
- _is_stream = false;
+NetSocketPosix::NetSocketPosix() :
+ _sock(SOCK_EMPTY),
+ _ip_type(IP::TYPE_NONE),
+ _is_stream(false) {
}
NetSocketPosix::~NetSocketPosix() {
diff --git a/drivers/unix/net_socket_posix.h b/drivers/unix/net_socket_posix.h
index 010f2ea6e0..b7fb3fdc94 100644
--- a/drivers/unix/net_socket_posix.h
+++ b/drivers/unix/net_socket_posix.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/unix/os_unix.cpp b/drivers/unix/os_unix.cpp
index 279274734f..ce1c183242 100644
--- a/drivers/unix/os_unix.cpp
+++ b/drivers/unix/os_unix.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -202,6 +202,12 @@ uint64_t OS_Unix::get_system_time_secs() const {
return uint64_t(tv_now.tv_sec);
}
+uint64_t OS_Unix::get_system_time_msecs() const {
+ struct timeval tv_now;
+ gettimeofday(&tv_now, NULL);
+ return uint64_t(tv_now.tv_sec * 1000 + tv_now.tv_usec / 1000);
+}
+
OS::Date OS_Unix::get_date(bool utc) const {
time_t t = time(NULL);
diff --git a/drivers/unix/os_unix.h b/drivers/unix/os_unix.h
index b702454603..2a23da6f28 100644
--- a/drivers/unix/os_unix.h
+++ b/drivers/unix/os_unix.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -84,6 +84,7 @@ public:
virtual uint64_t get_unix_time() const;
virtual uint64_t get_system_time_secs() const;
+ virtual uint64_t get_system_time_msecs() const;
virtual void delay_usec(uint32_t p_usec) const;
virtual uint64_t get_ticks_usec() const;
diff --git a/drivers/unix/rw_lock_posix.cpp b/drivers/unix/rw_lock_posix.cpp
index 27b19c30d5..c146061704 100644
--- a/drivers/unix/rw_lock_posix.cpp
+++ b/drivers/unix/rw_lock_posix.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/unix/rw_lock_posix.h b/drivers/unix/rw_lock_posix.h
index 897b617f98..7cbe5c992f 100644
--- a/drivers/unix/rw_lock_posix.h
+++ b/drivers/unix/rw_lock_posix.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/unix/semaphore_posix.cpp b/drivers/unix/semaphore_posix.cpp
index 26c2aeab28..5aa51d77d1 100644
--- a/drivers/unix/semaphore_posix.cpp
+++ b/drivers/unix/semaphore_posix.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/unix/semaphore_posix.h b/drivers/unix/semaphore_posix.h
index 025b87c0d7..089f088d33 100644
--- a/drivers/unix/semaphore_posix.h
+++ b/drivers/unix/semaphore_posix.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/unix/syslog_logger.cpp b/drivers/unix/syslog_logger.cpp
index c7b4daf4ad..6e3a3c5f9a 100644
--- a/drivers/unix/syslog_logger.cpp
+++ b/drivers/unix/syslog_logger.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/unix/syslog_logger.h b/drivers/unix/syslog_logger.h
index 745264ab6f..5cfe3964f6 100644
--- a/drivers/unix/syslog_logger.h
+++ b/drivers/unix/syslog_logger.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/unix/thread_posix.cpp b/drivers/unix/thread_posix.cpp
index 54bbbf2dad..a81292d4a2 100644
--- a/drivers/unix/thread_posix.cpp
+++ b/drivers/unix/thread_posix.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/unix/thread_posix.h b/drivers/unix/thread_posix.h
index 20d103232e..d6b6267c49 100644
--- a/drivers/unix/thread_posix.h
+++ b/drivers/unix/thread_posix.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/wasapi/audio_driver_wasapi.cpp b/drivers/wasapi/audio_driver_wasapi.cpp
index 8665f701b1..38012f8f76 100644
--- a/drivers/wasapi/audio_driver_wasapi.cpp
+++ b/drivers/wasapi/audio_driver_wasapi.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/wasapi/audio_driver_wasapi.h b/drivers/wasapi/audio_driver_wasapi.h
index 3d94f3ba49..05a2c6faef 100644
--- a/drivers/wasapi/audio_driver_wasapi.h
+++ b/drivers/wasapi/audio_driver_wasapi.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -58,17 +58,17 @@ class AudioDriverWASAPI : public AudioDriver {
String device_name;
String new_device;
- AudioDeviceWASAPI() {
- audio_client = NULL;
- render_client = NULL;
- capture_client = NULL;
- active = false;
- format_tag = 0;
- bits_per_sample = 0;
- channels = 0;
- frame_size = 0;
- device_name = "Default";
- new_device = "Default";
+ AudioDeviceWASAPI() :
+ audio_client(NULL),
+ render_client(NULL),
+ capture_client(NULL),
+ active(false),
+ format_tag(0),
+ bits_per_sample(0),
+ channels(0),
+ frame_size(0),
+ device_name("Default"),
+ new_device("Default") {
}
};
diff --git a/drivers/windows/dir_access_windows.cpp b/drivers/windows/dir_access_windows.cpp
index 589e9e0870..c20f707684 100644
--- a/drivers/windows/dir_access_windows.cpp
+++ b/drivers/windows/dir_access_windows.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/windows/dir_access_windows.h b/drivers/windows/dir_access_windows.h
index 9f5d0b6d93..2e2d23f4e2 100644
--- a/drivers/windows/dir_access_windows.h
+++ b/drivers/windows/dir_access_windows.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/windows/file_access_windows.cpp b/drivers/windows/file_access_windows.cpp
index 2582478259..babb393dcb 100644
--- a/drivers/windows/file_access_windows.cpp
+++ b/drivers/windows/file_access_windows.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -307,11 +307,10 @@ uint64_t FileAccessWindows::_get_modified_time(const String &p_file) {
}
}
-FileAccessWindows::FileAccessWindows() {
-
- f = NULL;
- flags = 0;
- last_error = OK;
+FileAccessWindows::FileAccessWindows() :
+ f(NULL),
+ flags(0),
+ last_error(OK) {
}
FileAccessWindows::~FileAccessWindows() {
diff --git a/drivers/windows/file_access_windows.h b/drivers/windows/file_access_windows.h
index 6f985e68b4..c105eb5265 100644
--- a/drivers/windows/file_access_windows.h
+++ b/drivers/windows/file_access_windows.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/windows/mutex_windows.cpp b/drivers/windows/mutex_windows.cpp
index 9fc6485be3..cfb72293aa 100644
--- a/drivers/windows/mutex_windows.cpp
+++ b/drivers/windows/mutex_windows.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/windows/mutex_windows.h b/drivers/windows/mutex_windows.h
index 5c3a8eb331..6d3b641a26 100644
--- a/drivers/windows/mutex_windows.h
+++ b/drivers/windows/mutex_windows.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/windows/rw_lock_windows.cpp b/drivers/windows/rw_lock_windows.cpp
index ef00141928..40e424c4af 100644
--- a/drivers/windows/rw_lock_windows.cpp
+++ b/drivers/windows/rw_lock_windows.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/windows/rw_lock_windows.h b/drivers/windows/rw_lock_windows.h
index 742a0930d4..1e768728a0 100644
--- a/drivers/windows/rw_lock_windows.h
+++ b/drivers/windows/rw_lock_windows.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/windows/semaphore_windows.cpp b/drivers/windows/semaphore_windows.cpp
index 34dd387705..718bb81836 100644
--- a/drivers/windows/semaphore_windows.cpp
+++ b/drivers/windows/semaphore_windows.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/windows/semaphore_windows.h b/drivers/windows/semaphore_windows.h
index 1e2f9c152e..8adeffbb7f 100644
--- a/drivers/windows/semaphore_windows.h
+++ b/drivers/windows/semaphore_windows.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/windows/shell_windows.cpp b/drivers/windows/shell_windows.cpp
index 20e996d776..731d16d18d 100644
--- a/drivers/windows/shell_windows.cpp
+++ b/drivers/windows/shell_windows.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/windows/shell_windows.h b/drivers/windows/shell_windows.h
index 98972a9bb1..9e9edd2f62 100644
--- a/drivers/windows/shell_windows.h
+++ b/drivers/windows/shell_windows.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/windows/thread_windows.cpp b/drivers/windows/thread_windows.cpp
index 52dcfacdf8..1bcd5a10d4 100644
--- a/drivers/windows/thread_windows.cpp
+++ b/drivers/windows/thread_windows.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -93,9 +93,8 @@ void ThreadWindows::make_default() {
wait_to_finish_func = wait_to_finish_func_windows;
}
-ThreadWindows::ThreadWindows() {
-
- handle = NULL;
+ThreadWindows::ThreadWindows() :
+ handle(NULL) {
}
ThreadWindows::~ThreadWindows() {
diff --git a/drivers/windows/thread_windows.h b/drivers/windows/thread_windows.h
index 5d2838e54f..a74d4e46f3 100644
--- a/drivers/windows/thread_windows.h
+++ b/drivers/windows/thread_windows.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/winmidi/win_midi.cpp b/drivers/winmidi/win_midi.cpp
index 1d4bf1a1e2..26bba34661 100644
--- a/drivers/winmidi/win_midi.cpp
+++ b/drivers/winmidi/win_midi.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/winmidi/win_midi.h b/drivers/winmidi/win_midi.h
index 87a349d5d1..4341f7ca7e 100644
--- a/drivers/winmidi/win_midi.h
+++ b/drivers/winmidi/win_midi.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/drivers/xaudio2/audio_driver_xaudio2.cpp b/drivers/xaudio2/audio_driver_xaudio2.cpp
index 452a1105ca..d1f63f4866 100644
--- a/drivers/xaudio2/audio_driver_xaudio2.cpp
+++ b/drivers/xaudio2/audio_driver_xaudio2.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -91,7 +91,7 @@ Error AudioDriverXAudio2::init() {
thread = Thread::create(AudioDriverXAudio2::thread_func, this);
return OK;
-};
+}
void AudioDriverXAudio2::thread_func(void *p_udata) {
@@ -131,10 +131,10 @@ void AudioDriverXAudio2::thread_func(void *p_udata) {
WaitForSingleObject(ad->voice_callback.buffer_end_event, INFINITE);
}
}
- };
+ }
ad->thread_exited = true;
-};
+}
void AudioDriverXAudio2::start() {
@@ -144,17 +144,17 @@ void AudioDriverXAudio2::start() {
ERR_EXPLAIN("XAudio2 start error " + itos(hr));
ERR_FAIL();
}
-};
+}
int AudioDriverXAudio2::get_mix_rate() const {
return mix_rate;
-};
+}
AudioDriver::SpeakerMode AudioDriverXAudio2::get_speaker_mode() const {
return speaker_mode;
-};
+}
float AudioDriverXAudio2::get_latency() {
@@ -172,13 +172,13 @@ void AudioDriverXAudio2::lock() {
if (!thread || !mutex)
return;
mutex->lock();
-};
+}
void AudioDriverXAudio2::unlock() {
if (!thread || !mutex)
return;
mutex->unlock();
-};
+}
void AudioDriverXAudio2::finish() {
@@ -195,12 +195,12 @@ void AudioDriverXAudio2::finish() {
if (samples_in) {
memdelete_arr(samples_in);
- };
+ }
if (samples_out[0]) {
for (int i = 0; i < AUDIO_BUFFERS; i++) {
memdelete_arr(samples_out[i]);
}
- };
+ }
mastering_voice->DestroyVoice();
@@ -208,20 +208,18 @@ void AudioDriverXAudio2::finish() {
if (mutex)
memdelete(mutex);
thread = NULL;
-};
-
-AudioDriverXAudio2::AudioDriverXAudio2() {
+}
- mutex = NULL;
- thread = NULL;
+AudioDriverXAudio2::AudioDriverXAudio2() :
+ thread(NULL),
+ mutex(NULL),
+ current_buffer(0) {
wave_format = { 0 };
for (int i = 0; i < AUDIO_BUFFERS; i++) {
xaudio_buffer[i] = { 0 };
samples_out[i] = 0;
}
- current_buffer = 0;
-};
-
-AudioDriverXAudio2::~AudioDriverXAudio2(){
+}
-};
+AudioDriverXAudio2::~AudioDriverXAudio2() {
+}
diff --git a/drivers/xaudio2/audio_driver_xaudio2.h b/drivers/xaudio2/audio_driver_xaudio2.h
index 0867c56128..f2fdf63cde 100644
--- a/drivers/xaudio2/audio_driver_xaudio2.h
+++ b/drivers/xaudio2/audio_driver_xaudio2.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/animation_bezier_editor.cpp b/editor/animation_bezier_editor.cpp
index f0dc3ce305..565336701a 100644
--- a/editor/animation_bezier_editor.cpp
+++ b/editor/animation_bezier_editor.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -408,7 +408,8 @@ void AnimationBezierTrackEdit::_notification(int p_what) {
}
//draw edited curve
- _draw_track(track, accent);
+ const Color highlight = get_color("highlight_color", "Editor");
+ _draw_track(track, highlight);
}
//draw editor handles
diff --git a/editor/animation_bezier_editor.h b/editor/animation_bezier_editor.h
index 1c701cc8f4..66c818f09d 100644
--- a/editor/animation_bezier_editor.h
+++ b/editor/animation_bezier_editor.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp
index f65825e395..0ba45a596e 100644
--- a/editor/animation_track_editor.cpp
+++ b/editor/animation_track_editor.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -4053,18 +4053,10 @@ void AnimationTrackEditor::_move_selection_commit() {
undo_redo->add_undo_method(animation.ptr(), "track_insert_key", amr.track, amr.time, amr.key, amr.transition);
}
- // 6-(undo) reinsert overlapped keys
- for (List<_AnimMoveRestore>::Element *E = to_restore.front(); E; E = E->next()) {
-
- _AnimMoveRestore &amr = E->get();
- undo_redo->add_undo_method(animation.ptr(), "track_insert_key", amr.track, amr.time, amr.key, amr.transition);
- }
-
undo_redo->add_do_method(this, "_clear_selection_for_anim", animation);
undo_redo->add_undo_method(this, "_clear_selection_for_anim", animation);
// 7-reselect
-
for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) {
float oldpos = E->get().pos;
@@ -4535,18 +4527,10 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
undo_redo->add_undo_method(animation.ptr(), "track_insert_key", amr.track, amr.time, amr.key, amr.transition);
}
- // 6-(undo) reinsert overlapped keys
- for (List<_AnimMoveRestore>::Element *E = to_restore.front(); E; E = E->next()) {
-
- _AnimMoveRestore &amr = E->get();
- undo_redo->add_undo_method(animation.ptr(), "track_insert_key", amr.track, amr.time, amr.key, amr.transition);
- }
-
undo_redo->add_do_method(this, "_clear_selection_for_anim", animation);
undo_redo->add_undo_method(this, "_clear_selection_for_anim", animation);
// 7-reselect
-
for (Map<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) {
float oldpos = E->get().pos;
diff --git a/editor/animation_track_editor.h b/editor/animation_track_editor.h
index deefe6c6fd..47058839ba 100644
--- a/editor/animation_track_editor.h
+++ b/editor/animation_track_editor.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/animation_track_editor_plugins.cpp b/editor/animation_track_editor_plugins.cpp
index a0ce8dd0a6..8c2c2b7f38 100644
--- a/editor/animation_track_editor_plugins.cpp
+++ b/editor/animation_track_editor_plugins.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/animation_track_editor_plugins.h b/editor/animation_track_editor_plugins.h
index dd8ff7c8c9..a1ea7435b1 100644
--- a/editor/animation_track_editor_plugins.h
+++ b/editor/animation_track_editor_plugins.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/array_property_edit.cpp b/editor/array_property_edit.cpp
index a32a71262f..7a3edfde50 100644
--- a/editor/array_property_edit.cpp
+++ b/editor/array_property_edit.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -30,6 +30,7 @@
#include "array_property_edit.h"
+#include "core/io/marshalls.h"
#include "editor_node.h"
#define ITEMS_PER_PAGE 100
@@ -202,6 +203,11 @@ bool ArrayPropertyEdit::_get(const StringName &p_name, Variant &r_ret) const {
int idx = pn.get_slicec('/', 1).to_int();
bool valid;
r_ret = arr.get(idx, &valid);
+
+ if (r_ret.get_type() == Variant::OBJECT && Object::cast_to<EncodedObjectAsID>(r_ret)) {
+ r_ret = Object::cast_to<EncodedObjectAsID>(r_ret)->get_object_id();
+ }
+
return valid;
}
}
@@ -232,6 +238,11 @@ void ArrayPropertyEdit::_get_property_list(List<PropertyInfo> *p_list) const {
p_list->push_back(PropertyInfo(Variant::INT, "indices/" + itos(i + offset) + "_type", PROPERTY_HINT_ENUM, vtypes));
}
+ if (v.get_type() == Variant::OBJECT && Object::cast_to<EncodedObjectAsID>(v)) {
+ p_list->push_back(PropertyInfo(Variant::INT, "indices/" + itos(i + offset), PROPERTY_HINT_OBJECT_ID, "Object"));
+ continue;
+ }
+
if (is_typed || v.get_type() != Variant::NIL) {
PropertyInfo pi(v.get_type(), "indices/" + itos(i + offset));
if (subtype != Variant::NIL) {
diff --git a/editor/array_property_edit.h b/editor/array_property_edit.h
index fe0c4e23ae..b2a3564c8c 100644
--- a/editor/array_property_edit.h
+++ b/editor/array_property_edit.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/audio_stream_preview.cpp b/editor/audio_stream_preview.cpp
index 5a94d41aba..1ddd4552d3 100644
--- a/editor/audio_stream_preview.cpp
+++ b/editor/audio_stream_preview.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/audio_stream_preview.h b/editor/audio_stream_preview.h
index 1a8f2eaa15..3b8975e3aa 100644
--- a/editor/audio_stream_preview.h
+++ b/editor/audio_stream_preview.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp
index 3136b0f012..4ab9a72694 100644
--- a/editor/code_editor.cpp
+++ b/editor/code_editor.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -673,7 +673,7 @@ void CodeTextEditor::_reset_zoom() {
if (font.is_valid()) {
EditorSettings::get_singleton()->set("interface/editor/code_font_size", 14);
font->set_size(14);
- zoom_nb->set_text("100%");
+ font_size_nb->set_text("14 (100%)");
}
}
@@ -708,8 +708,7 @@ void CodeTextEditor::_text_changed() {
void CodeTextEditor::_code_complete_timer_timeout() {
if (!is_visible_in_tree())
return;
- if (enable_complete_timer)
- text_editor->query_code_comple();
+ text_editor->query_code_comple();
}
void CodeTextEditor::_complete_request() {
@@ -748,7 +747,7 @@ bool CodeTextEditor::_add_font_size(int p_delta) {
if (font.is_valid()) {
int new_size = CLAMP(font->get_size() + p_delta, 8 * EDSCALE, 96 * EDSCALE);
- zoom_nb->set_text(itos(100 * new_size / (14 * EDSCALE)) + "%");
+ font_size_nb->set_text(itos(new_size) + " (" + itos(100 * new_size / (14 * EDSCALE)) + "%)");
if (new_size != font->get_size()) {
EditorSettings::get_singleton()->set("interface/editor/code_font_size", new_size / EDSCALE);
@@ -1130,6 +1129,24 @@ void CodeTextEditor::set_edit_state(const Variant &p_state) {
void CodeTextEditor::set_error(const String &p_error) {
error->set_text(p_error);
+ if (p_error != "") {
+ error->set_default_cursor_shape(CURSOR_POINTING_HAND);
+ } else {
+ error->set_default_cursor_shape(CURSOR_ARROW);
+ }
+}
+
+void CodeTextEditor::set_error_pos(int p_line, int p_column) {
+ error_line = p_line;
+ error_column = p_column;
+}
+
+void CodeTextEditor::goto_error() {
+ if (error->get_text() != "") {
+ text_editor->cursor_set_line(error_line);
+ text_editor->cursor_set_column(error_column);
+ text_editor->center_viewport_to_cursor();
+ }
}
void CodeTextEditor::_update_font() {
@@ -1149,6 +1166,9 @@ void CodeTextEditor::_on_settings_change() {
_update_font();
+ font_size = EditorSettings::get_singleton()->get("interface/editor/code_font_size");
+ font_size_nb->set_text(itos(font_size) + " (" + itos(100 * font_size / (14 * EDSCALE)) + "%)");
+
// AUTO BRACE COMPLETION
text_editor->set_auto_brace_completion(
EDITOR_DEF("text_editor/completion/auto_brace_complete", true));
@@ -1156,8 +1176,6 @@ void CodeTextEditor::_on_settings_change() {
code_complete_timer->set_wait_time(
EDITOR_DEF("text_editor/completion/code_complete_delay", .3f));
- enable_complete_timer = EDITOR_DEF("text_editor/completion/enable_code_completion_delay", true);
-
// call hint settings
text_editor->set_callhint_settings(
EDITOR_DEF("text_editor/completion/put_callhint_tooltip_below_current_line", true),
@@ -1235,17 +1253,19 @@ CodeTextEditor::CodeTextEditor() {
code_complete_timer = memnew(Timer);
add_child(code_complete_timer);
code_complete_timer->set_one_shot(true);
- enable_complete_timer = EDITOR_DEF("text_editor/completion/enable_code_completion_delay", true);
-
code_complete_timer->set_wait_time(EDITOR_DEF("text_editor/completion/code_complete_delay", .3f));
+ error_line = 0;
+ error_column = 0;
+
error = memnew(Label);
status_bar->add_child(error);
error->set_autowrap(true);
error->set_valign(Label::VALIGN_CENTER);
+ error->set_h_size_flags(SIZE_EXPAND_FILL); //required for it to display, given now it's clipping contents, do not touch
error->add_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_color("error_color", "Editor"));
error->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("status_source", "EditorFonts"));
- error->set_h_size_flags(SIZE_EXPAND_FILL); //required for it to display, given now it's clipping contents, do not touch
+ error->set_mouse_filter(MOUSE_FILTER_STOP);
find_replace_bar->connect("error", error, "set_text");
status_bar->add_child(memnew(Label)); //to keep the height if the other labels are not visible
@@ -1273,23 +1293,23 @@ CodeTextEditor::CodeTextEditor() {
warning_count_label->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("status_source", "EditorFonts"));
warning_count_label->set_text("0");
- Label *zoom_txt = memnew(Label);
- status_bar->add_child(zoom_txt);
- zoom_txt->set_align(Label::ALIGN_RIGHT);
- zoom_txt->set_valign(Label::VALIGN_CENTER);
- zoom_txt->set_v_size_flags(SIZE_FILL);
- zoom_txt->set_text(TTR("Zoom:"));
- zoom_txt->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("status_source", "EditorFonts"));
-
- zoom_nb = memnew(Label);
- status_bar->add_child(zoom_nb);
- zoom_nb->set_valign(Label::VALIGN_CENTER);
- zoom_nb->set_v_size_flags(SIZE_FILL);
- zoom_nb->set_autowrap(true); // workaround to prevent resizing the label on each change, do not touch
- zoom_nb->set_clip_text(true); // workaround to prevent resizing the label on each change, do not touch
- zoom_nb->set_custom_minimum_size(Size2(60, 1) * EDSCALE);
- zoom_nb->set_align(Label::ALIGN_RIGHT);
- zoom_nb->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("status_source", "EditorFonts"));
+ Label *font_size_txt = memnew(Label);
+ status_bar->add_child(font_size_txt);
+ font_size_txt->set_align(Label::ALIGN_RIGHT);
+ font_size_txt->set_valign(Label::VALIGN_CENTER);
+ font_size_txt->set_v_size_flags(SIZE_FILL);
+ font_size_txt->set_text(TTR("Font Size:"));
+ font_size_txt->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("status_source", "EditorFonts"));
+
+ font_size_nb = memnew(Label);
+ status_bar->add_child(font_size_nb);
+ font_size_nb->set_valign(Label::VALIGN_CENTER);
+ font_size_nb->set_v_size_flags(SIZE_FILL);
+ font_size_nb->set_autowrap(true); // workaround to prevent resizing the label on each change, do not touch
+ font_size_nb->set_clip_text(true); // workaround to prevent resizing the label on each change, do not touch
+ font_size_nb->set_custom_minimum_size(Size2(100, 1) * EDSCALE);
+ font_size_nb->set_align(Label::ALIGN_RIGHT);
+ font_size_nb->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("status_source", "EditorFonts"));
Label *line_txt = memnew(Label);
status_bar->add_child(line_txt);
@@ -1345,7 +1365,7 @@ CodeTextEditor::CodeTextEditor() {
font_resize_val = 0;
font_size = EditorSettings::get_singleton()->get("interface/editor/code_font_size");
- zoom_nb->set_text(itos(100 * font_size / (14 * EDSCALE)) + "%");
+ font_size_nb->set_text(itos(font_size) + " (" + itos(100 * font_size / (14 * EDSCALE)) + "%)");
font_resize_timer = memnew(Timer);
add_child(font_resize_timer);
font_resize_timer->set_one_shot(true);
diff --git a/editor/code_editor.h b/editor/code_editor.h
index 2f9403843e..96fc5b79e5 100644
--- a/editor/code_editor.h
+++ b/editor/code_editor.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -147,17 +147,18 @@ class CodeTextEditor : public VBoxContainer {
Label *line_nb;
Label *col_nb;
- Label *zoom_nb;
+ Label *font_size_nb;
Label *info;
Timer *idle;
Timer *code_complete_timer;
- bool enable_complete_timer;
Timer *font_resize_timer;
int font_resize_val;
real_t font_size;
Label *error;
+ int error_line;
+ int error_column;
void _on_settings_change();
@@ -213,12 +214,15 @@ public:
void update_editor_settings();
void set_error(const String &p_error);
+ void set_error_pos(int p_line, int p_column);
void update_line_and_column() { _line_col_changed(); }
TextEdit *get_text_edit() { return text_editor; }
FindReplaceBar *get_find_replace_bar() { return find_replace_bar; }
+ Label *get_error_label() const { return error; }
Label *get_warning_label() const { return warning_label; }
Label *get_warning_count_label() const { return warning_count_label; }
virtual void apply_code() {}
+ void goto_error();
void set_code_complete_func(CodeTextEditorCodeCompleteFunc p_code_complete_func, void *p_ud);
diff --git a/editor/collada/collada.cpp b/editor/collada/collada.cpp
index fa7e37eb1f..d004e30fb8 100644
--- a/editor/collada/collada.cpp
+++ b/editor/collada/collada.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/collada/collada.h b/editor/collada/collada.h
index b777fa04c2..9ed62b46b7 100644
--- a/editor/collada/collada.h
+++ b/editor/collada/collada.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -110,14 +110,13 @@ public:
float z_near;
float z_far;
- CameraData() {
-
- mode = MODE_PERSPECTIVE;
- perspective.y_fov = 0;
+ CameraData() :
+ mode(MODE_PERSPECTIVE),
+ aspect(1),
+ z_near(0.1),
+ z_far(100) {
perspective.x_fov = 0;
- aspect = 1;
- z_near = 0.1;
- z_far = 100;
+ perspective.y_fov = 0;
}
};
@@ -141,16 +140,14 @@ public:
float spot_angle;
float spot_exp;
- LightData() {
-
- mode = MODE_AMBIENT;
- color = Color(1, 1, 1, 1);
- constant_att = 0;
- linear_att = 0;
- quad_att = 0;
-
- spot_angle = 45;
- spot_exp = 1;
+ LightData() :
+ mode(MODE_AMBIENT),
+ color(Color(1, 1, 1, 1)),
+ constant_att(0),
+ linear_att(0),
+ quad_att(0),
+ spot_angle(45),
+ spot_exp(1) {
}
};
@@ -580,11 +577,11 @@ public:
float animation_length;
- State() {
- unit_scale = 1.0;
- up_axis = Vector3::AXIS_Y;
- import_flags = 0;
- animation_length = 0;
+ State() :
+ import_flags(0),
+ unit_scale(1.0),
+ up_axis(Vector3::AXIS_Y),
+ animation_length(0) {
}
} state;
diff --git a/editor/connections_dialog.cpp b/editor/connections_dialog.cpp
index a1337268ba..7a5ebc5c00 100644
--- a/editor/connections_dialog.cpp
+++ b/editor/connections_dialog.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/connections_dialog.h b/editor/connections_dialog.h
index c2fd1f1d09..0e7e172ebb 100644
--- a/editor/connections_dialog.h
+++ b/editor/connections_dialog.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/create_dialog.cpp b/editor/create_dialog.cpp
index c4516c1f17..205bdc63b9 100644
--- a/editor/create_dialog.cpp
+++ b/editor/create_dialog.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -89,8 +89,9 @@ void CreateDialog::popup_create(bool p_dont_clear, bool p_replace_mode) {
_save_and_update_favorite_list();
// Restore valid window bounds or pop up at default size.
- if (EditorSettings::get_singleton()->has_setting("interface/dialogs/create_new_node_bounds")) {
- popup(EditorSettings::get_singleton()->get("interface/dialogs/create_new_node_bounds"));
+ Rect2 saved_size = EditorSettings::get_singleton()->get_project_metadata("dialog_bounds", "create_new_node", Rect2());
+ if (saved_size != Rect2()) {
+ popup(saved_size);
} else {
Size2 popup_size = Size2(900, 700) * editor_get_scale();
@@ -118,8 +119,10 @@ void CreateDialog::popup_create(bool p_dont_clear, bool p_replace_mode) {
if (enable_rl) {
search_options->add_constant_override("draw_relationship_lines", 1);
search_options->add_color_override("relationship_line_color", rl_color);
+ search_options->add_constant_override("draw_guides", 0);
} else {
search_options->add_constant_override("draw_relationship_lines", 0);
+ search_options->add_constant_override("draw_guides", 1);
}
is_replace_mode = p_replace_mode;
@@ -413,7 +416,7 @@ void CreateDialog::_notification(int p_what) {
}
} break;
case NOTIFICATION_POPUP_HIDE: {
- EditorSettings::get_singleton()->set("interface/dialogs/create_new_node_bounds", get_rect());
+ EditorSettings::get_singleton()->get_project_metadata("dialog_bounds", "create_new_node", get_rect());
} break;
}
}
diff --git a/editor/create_dialog.h b/editor/create_dialog.h
index 6df9eebc8c..2636e2ddef 100644
--- a/editor/create_dialog.h
+++ b/editor/create_dialog.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/dependency_editor.cpp b/editor/dependency_editor.cpp
index 99b6955160..f9f1e455f5 100644
--- a/editor/dependency_editor.cpp
+++ b/editor/dependency_editor.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -495,11 +495,19 @@ void DependencyRemoveDialog::ok_pressed() {
Resource *res = ResourceCache::get(files_to_delete[i]);
res->set_path("");
}
+
+ // If the file we are deleting is the main scene, clear its definition.
+ if (files_to_delete[i] == ProjectSettings::get_singleton()->get("application/run/main_scene")) {
+ ProjectSettings::get_singleton()->set("application/run/main_scene", "");
+ }
+
String path = OS::get_singleton()->get_resource_dir() + files_to_delete[i].replace_first("res://", "/");
print_verbose("Moving to trash: " + path);
Error err = OS::get_singleton()->move_to_trash(path);
if (err != OK) {
EditorNode::get_singleton()->add_io_error(TTR("Cannot remove:") + "\n" + files_to_delete[i] + "\n");
+ } else {
+ emit_signal("file_removed", files_to_delete[i]);
}
}
@@ -515,6 +523,8 @@ void DependencyRemoveDialog::ok_pressed() {
Error err = OS::get_singleton()->move_to_trash(path);
if (err != OK) {
EditorNode::get_singleton()->add_io_error(TTR("Cannot remove:") + "\n" + dirs_to_delete[i] + "\n");
+ } else {
+ emit_signal("folder_removed", dirs_to_delete[i]);
}
}
@@ -540,6 +550,11 @@ void DependencyRemoveDialog::ok_pressed() {
}
}
+void DependencyRemoveDialog::_bind_methods() {
+ ADD_SIGNAL(MethodInfo("file_removed", PropertyInfo(Variant::STRING, "file")));
+ ADD_SIGNAL(MethodInfo("folder_removed", PropertyInfo(Variant::STRING, "folder")));
+}
+
DependencyRemoveDialog::DependencyRemoveDialog() {
VBoxContainer *vb = memnew(VBoxContainer);
diff --git a/editor/dependency_editor.h b/editor/dependency_editor.h
index e46df4c837..23c3cc031c 100644
--- a/editor/dependency_editor.h
+++ b/editor/dependency_editor.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -126,6 +126,8 @@ class DependencyRemoveDialog : public ConfirmationDialog {
void ok_pressed();
+ static void _bind_methods();
+
public:
void show(const Vector<String> &p_folders, const Vector<String> &p_files);
DependencyRemoveDialog();
diff --git a/editor/dictionary_property_edit.cpp b/editor/dictionary_property_edit.cpp
index a87edfd00d..483f5ae2d0 100644
--- a/editor/dictionary_property_edit.cpp
+++ b/editor/dictionary_property_edit.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/dictionary_property_edit.h b/editor/dictionary_property_edit.h
index 83489fe7de..f6bd13785a 100644
--- a/editor/dictionary_property_edit.h
+++ b/editor/dictionary_property_edit.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/doc/doc_data.cpp b/editor/doc/doc_data.cpp
index 599f46d6d9..24a746d159 100644
--- a/editor/doc/doc_data.cpp
+++ b/editor/doc/doc_data.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/doc/doc_data.h b/editor/doc/doc_data.h
index 6633c123e6..8156acd3d0 100644
--- a/editor/doc/doc_data.h
+++ b/editor/doc/doc_data.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/doc/doc_dump.cpp b/editor/doc/doc_dump.cpp
index f1c337605e..1a68fe5bf2 100644
--- a/editor/doc/doc_dump.cpp
+++ b/editor/doc/doc_dump.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/doc/doc_dump.h b/editor/doc/doc_dump.h
index 99398b5d96..8e7f5e7b74 100644
--- a/editor/doc/doc_dump.h
+++ b/editor/doc/doc_dump.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_about.cpp b/editor/editor_about.cpp
index 14abaa835c..e9dd6d7199 100644
--- a/editor/editor_about.cpp
+++ b/editor/editor_about.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -136,7 +136,7 @@ EditorAbout::EditorAbout() {
Label *about_text = memnew(Label);
about_text->set_v_size_flags(Control::SIZE_SHRINK_CENTER);
about_text->set_text(VERSION_FULL_NAME + hash +
- String::utf8("\n\xc2\xa9 2007-2018 Juan Linietsky, Ariel Manzur.\n\xc2\xa9 2014-2018 ") +
+ String::utf8("\n\xc2\xa9 2007-2019 Juan Linietsky, Ariel Manzur.\n\xc2\xa9 2014-2019 ") +
TTR("Godot Engine contributors") + "\n");
hbc->add_child(about_text);
diff --git a/editor/editor_about.h b/editor/editor_about.h
index 71d1c95188..87e824083e 100644
--- a/editor/editor_about.h
+++ b/editor/editor_about.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_asset_installer.cpp b/editor/editor_asset_installer.cpp
index 6af45f26ae..12df91a501 100644
--- a/editor/editor_asset_installer.cpp
+++ b/editor/editor_asset_installer.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -304,7 +304,7 @@ void EditorAssetInstaller::ok_pressed() {
EditorNode::get_singleton()->show_warning(msg);
} else {
if (EditorNode::get_singleton() != NULL)
- EditorNode::get_singleton()->show_warning(TTR("Package Installed Successfully!"), TTR("Success!"));
+ EditorNode::get_singleton()->show_warning(TTR("Package installed successfully!"), TTR("Success!"));
}
EditorFileSystem::get_singleton()->scan_changes();
}
diff --git a/editor/editor_asset_installer.h b/editor/editor_asset_installer.h
index a80087861a..8687e0acdf 100644
--- a/editor/editor_asset_installer.h
+++ b/editor/editor_asset_installer.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_audio_buses.cpp b/editor/editor_audio_buses.cpp
index 6cd81626c7..5d0abef4b8 100644
--- a/editor/editor_audio_buses.cpp
+++ b/editor/editor_audio_buses.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -36,11 +36,35 @@
#include "filesystem_dock.h"
#include "servers/audio_server.h"
+void EditorAudioBus::_update_visible_channels() {
+
+ int i = 0;
+ for (; i < cc; i++) {
+
+ if (!channel[i].vu_l->is_visible()) {
+ channel[i].vu_l->show();
+ }
+ if (!channel[i].vu_r->is_visible()) {
+ channel[i].vu_r->show();
+ }
+ }
+
+ for (; i < CHANNELS_MAX; i++) {
+
+ if (channel[i].vu_l->is_visible()) {
+ channel[i].vu_l->hide();
+ }
+ if (channel[i].vu_r->is_visible()) {
+ channel[i].vu_r->hide();
+ }
+ }
+}
+
void EditorAudioBus::_notification(int p_what) {
if (p_what == NOTIFICATION_READY) {
- for (int i = 0; i < cc; i++) {
+ for (int i = 0; i < CHANNELS_MAX; i++) {
channel[i].vu_l->set_under_texture(get_icon("BusVuEmpty", "EditorIcons"));
channel[i].vu_l->set_progress_texture(get_icon("BusVuFull", "EditorIcons"));
channel[i].vu_r->set_under_texture(get_icon("BusVuEmpty", "EditorIcons"));
@@ -72,6 +96,11 @@ void EditorAudioBus::_notification(int p_what) {
if (p_what == NOTIFICATION_PROCESS) {
+ if (cc != AudioServer::get_singleton()->get_bus_channels(get_index())) {
+ cc = AudioServer::get_singleton()->get_bus_channels(get_index());
+ _update_visible_channels();
+ }
+
for (int i = 0; i < cc; i++) {
float real_peak[2] = { -100, -100 };
bool activity_found = false;
@@ -113,7 +142,7 @@ void EditorAudioBus::_notification(int p_what) {
if (p_what == NOTIFICATION_VISIBILITY_CHANGED) {
- for (int i = 0; i < 4; i++) {
+ for (int i = 0; i < CHANNELS_MAX; i++) {
channel[i].peak_l = -100;
channel[i].peak_r = -100;
channel[i].prev_active = true;
@@ -124,7 +153,7 @@ void EditorAudioBus::_notification(int p_what) {
if (p_what == NOTIFICATION_THEME_CHANGED) {
- for (int i = 0; i < cc; i++) {
+ for (int i = 0; i < CHANNELS_MAX; i++) {
channel[i].vu_l->set_under_texture(get_icon("BusVuEmpty", "EditorIcons"));
channel[i].vu_l->set_progress_texture(get_icon("BusVuFull", "EditorIcons"));
channel[i].vu_r->set_under_texture(get_icon("BusVuEmpty", "EditorIcons"));
@@ -709,9 +738,8 @@ EditorAudioBus::EditorAudioBus(EditorAudioBuses *p_buses, bool p_is_master) {
slider->connect("value_changed", this, "_volume_db_changed");
hb->add_child(slider);
- cc = AudioServer::get_singleton()->get_channel_count();
-
- for (int i = 0; i < cc; i++) {
+ cc = 0;
+ for (int i = 0; i < CHANNELS_MAX; i++) {
channel[i].vu_l = memnew(TextureProgress);
channel[i].vu_l->set_fill_mode(TextureProgress::FILL_BOTTOM_TO_TOP);
hb->add_child(channel[i].vu_l);
diff --git a/editor/editor_audio_buses.h b/editor/editor_audio_buses.h
index 4cdcb65d7b..37ff9b28dc 100644
--- a/editor/editor_audio_buses.h
+++ b/editor/editor_audio_buses.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -59,6 +59,7 @@ class EditorAudioBus : public PanelContainer {
VSlider *slider;
int cc;
+ static const int CHANNELS_MAX = 4;
struct {
bool prev_active;
@@ -68,7 +69,7 @@ class EditorAudioBus : public PanelContainer {
TextureProgress *vu_l;
TextureProgress *vu_r;
- } channel[4];
+ } channel[CHANNELS_MAX];
TextureRect *scale;
OptionButton *send;
@@ -102,6 +103,7 @@ class EditorAudioBus : public PanelContainer {
void _effect_selected();
void _delete_effect_pressed(int p_option);
void _effect_rmb(const Vector2 &p_pos);
+ void _update_visible_channels();
virtual Variant get_drag_data(const Point2 &p_point);
virtual bool can_drop_data(const Point2 &p_point, const Variant &p_data) const;
diff --git a/editor/editor_autoload_settings.cpp b/editor/editor_autoload_settings.cpp
index 64742ff74c..9534410590 100644
--- a/editor/editor_autoload_settings.cpp
+++ b/editor/editor_autoload_settings.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_autoload_settings.h b/editor/editor_autoload_settings.h
index 0b75faa009..45added56b 100644
--- a/editor/editor_autoload_settings.h
+++ b/editor/editor_autoload_settings.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_data.cpp b/editor/editor_data.cpp
index bd6ce797b5..b87b80dafd 100644
--- a/editor/editor_data.cpp
+++ b/editor/editor_data.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -857,11 +857,16 @@ bool EditorData::script_class_is_parent(const String &p_class, const String &p_i
if (!ScriptServer::is_global_class(p_class))
return false;
String base = script_class_get_base(p_class);
+ Ref<Script> script = ResourceLoader::load(ScriptServer::get_global_class_path(p_class), "Script");
+ Ref<Script> base_script = script->get_base_script();
+
while (p_inherits != base) {
if (ClassDB::class_exists(base)) {
return ClassDB::is_parent_class(base, p_inherits);
} else if (ScriptServer::is_global_class(base)) {
base = script_class_get_base(base);
+ } else if (base_script.is_valid()) {
+ return ClassDB::is_parent_class(base_script->get_instance_base_type(), p_inherits);
} else {
return false;
}
diff --git a/editor/editor_data.h b/editor/editor_data.h
index 87a76ee5ba..845878e070 100644
--- a/editor/editor_data.h
+++ b/editor/editor_data.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_dir_dialog.cpp b/editor/editor_dir_dialog.cpp
index 6f80b6bea4..e8cf730796 100644
--- a/editor/editor_dir_dialog.cpp
+++ b/editor/editor_dir_dialog.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_dir_dialog.h b/editor/editor_dir_dialog.h
index a9dc7accfe..e0b3d93206 100644
--- a/editor/editor_dir_dialog.h
+++ b/editor/editor_dir_dialog.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_export.cpp b/editor/editor_export.cpp
index 209a006a06..b36ed72125 100644
--- a/editor/editor_export.cpp
+++ b/editor/editor_export.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -222,11 +222,33 @@ String EditorExportPreset::get_custom_features() const {
return custom_features;
}
-EditorExportPreset::EditorExportPreset() {
+void EditorExportPreset::set_script_export_mode(int p_mode) {
- export_path = "";
- export_filter = EXPORT_ALL_RESOURCES;
- runnable = false;
+ script_mode = p_mode;
+ EditorExport::singleton->save_presets();
+}
+
+int EditorExportPreset::get_script_export_mode() const {
+
+ return script_mode;
+}
+
+void EditorExportPreset::set_script_encryption_key(const String &p_key) {
+
+ script_key = p_key;
+ EditorExport::singleton->save_presets();
+}
+
+String EditorExportPreset::get_script_encryption_key() const {
+
+ return script_key;
+}
+
+EditorExportPreset::EditorExportPreset() :
+ export_filter(EXPORT_ALL_RESOURCES),
+ export_path(""),
+ runnable(false),
+ script_mode(MODE_SCRIPT_COMPILED) {
}
///////////////////////////////////
@@ -475,6 +497,18 @@ void EditorExportPlatform::_edit_filter_list(Set<String> &r_list, const String &
memdelete(da);
}
+void EditorExportPlugin::set_export_preset(const Ref<EditorExportPreset> &p_preset) {
+
+ if (p_preset.is_valid()) {
+ export_preset = p_preset;
+ }
+}
+
+Ref<EditorExportPreset> EditorExportPlugin::get_export_preset() const {
+
+ return export_preset;
+}
+
void EditorExportPlugin::add_file(const String &p_path, const Vector<uint8_t> &p_file, bool p_remap) {
ExtraFile ef;
@@ -546,6 +580,13 @@ void EditorExportPlugin::_export_begin_script(const PoolVector<String> &p_featur
}
}
+void EditorExportPlugin::_export_end_script() {
+
+ if (get_script_instance()) {
+ get_script_instance()->call("_export_end");
+ }
+}
+
void EditorExportPlugin::_export_file(const String &p_path, const String &p_type, const Set<String> &p_features) {
}
@@ -587,6 +628,20 @@ EditorExportPlatform::FeatureContainers EditorExportPlatform::get_feature_contai
result.features.insert(E->get());
result.features_pv.push_back(E->get());
}
+
+ if (p_preset->get_custom_features() != String()) {
+
+ Vector<String> tmp_custom_list = p_preset->get_custom_features().split(",");
+
+ for (int i = 0; i < tmp_custom_list.size(); i++) {
+ String f = tmp_custom_list[i].strip_edges();
+ if (f != String()) {
+ result.features.insert(f);
+ result.features_pv.push_back(f);
+ }
+ }
+ }
+
return result;
}
@@ -606,6 +661,9 @@ EditorExportPlatform::ExportNotifier::ExportNotifier(EditorExportPlatform &p_pla
EditorExportPlatform::ExportNotifier::~ExportNotifier() {
Vector<Ref<EditorExportPlugin> > export_plugins = EditorExport::get_singleton()->get_export_plugins();
for (int i = 0; i < export_plugins.size(); i++) {
+ if (export_plugins[i]->get_script_instance()) {
+ export_plugins.write[i]->_export_end_script();
+ }
export_plugins.write[i]->_export_end();
}
}
@@ -635,6 +693,9 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
Vector<Ref<EditorExportPlugin> > export_plugins = EditorExport::get_singleton()->get_export_plugins();
for (int i = 0; i < export_plugins.size(); i++) {
+
+ export_plugins.write[i]->set_export_preset(p_preset);
+
if (p_so_func) {
for (int j = 0; j < export_plugins[i]->shared_objects.size(); j++) {
p_so_func(p_udata, export_plugins[i]->shared_objects[j]);
@@ -1025,6 +1086,7 @@ void EditorExport::_save() {
config->set_value(section, "platform", preset->get_platform()->get_name());
config->set_value(section, "runnable", preset->is_runnable());
config->set_value(section, "custom_features", preset->get_custom_features());
+
bool save_files = false;
switch (preset->get_export_filter()) {
case EditorExportPreset::EXPORT_ALL_RESOURCES: {
@@ -1048,6 +1110,8 @@ void EditorExport::_save() {
config->set_value(section, "exclude_filter", preset->get_exclude_filter());
config->set_value(section, "export_path", preset->get_export_path());
config->set_value(section, "patch_list", preset->get_patches());
+ config->set_value(section, "script_export_mode", preset->get_script_export_mode());
+ config->set_value(section, "script_encryption_key", preset->get_script_encryption_key());
String option_section = "preset." + itos(i) + ".options";
@@ -1210,6 +1274,13 @@ void EditorExport::load_config() {
preset->add_patch(patch_list[i]);
}
+ if (config->has_section_key(section, "script_export_mode")) {
+ preset->set_script_export_mode(config->get_value(section, "script_export_mode"));
+ }
+ if (config->has_section_key(section, "script_encryption_key")) {
+ preset->set_script_encryption_key(config->get_value(section, "script_encryption_key"));
+ }
+
String option_section = "preset." + itos(index) + ".options";
List<String> options;
diff --git a/editor/editor_export.h b/editor/editor_export.h
index 380b33cd17..c7c2b76327 100644
--- a/editor/editor_export.h
+++ b/editor/editor_export.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -52,6 +52,12 @@ public:
EXPORT_SELECTED_RESOURCES,
};
+ enum ScriptExportMode {
+ MODE_SCRIPT_TEXT,
+ MODE_SCRIPT_COMPILED,
+ MODE_SCRIPT_ENCRYPTED,
+ };
+
private:
Ref<EditorExportPlatform> platform;
ExportFilter export_filter;
@@ -75,6 +81,9 @@ private:
String custom_features;
+ int script_mode;
+ String script_key;
+
protected:
bool _set(const StringName &p_name, const Variant &p_value);
bool _get(const StringName &p_name, Variant &r_ret) const;
@@ -118,6 +127,12 @@ public:
void set_export_path(const String &p_path);
String get_export_path() const;
+ void set_script_export_mode(int p_mode);
+ int get_script_export_mode() const;
+
+ void set_script_encryption_key(const String &p_key);
+ String get_script_encryption_key() const;
+
const List<PropertyInfo> &get_properties() const { return properties; }
EditorExportPreset();
@@ -206,9 +221,9 @@ public:
PropertyInfo option;
Variant default_value;
- ExportOption(const PropertyInfo &p_info, const Variant &p_default) {
- option = p_info;
- default_value = p_default;
+ ExportOption(const PropertyInfo &p_info, const Variant &p_default) :
+ option(p_info),
+ default_value(p_default) {
}
ExportOption() {}
};
@@ -260,6 +275,8 @@ class EditorExportPlugin : public Reference {
friend class EditorExportPlatform;
+ Ref<EditorExportPreset> export_preset;
+
Vector<SharedObject> shared_objects;
struct ExtraFile {
String path;
@@ -291,8 +308,12 @@ class EditorExportPlugin : public Reference {
void _export_file_script(const String &p_path, const String &p_type, const PoolVector<String> &p_features);
void _export_begin_script(const PoolVector<String> &p_features, bool p_debug, const String &p_path, int p_flags);
+ void _export_end_script();
protected:
+ void set_export_preset(const Ref<EditorExportPreset> &p_preset);
+ Ref<EditorExportPreset> get_export_preset() const;
+
void add_file(const String &p_path, const Vector<uint8_t> &p_file, bool p_remap);
void add_shared_object(const String &p_path, const Vector<String> &tags);
diff --git a/editor/editor_file_dialog.cpp b/editor/editor_file_dialog.cpp
index b39f910182..765a330aaf 100644
--- a/editor/editor_file_dialog.cpp
+++ b/editor/editor_file_dialog.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -830,11 +830,12 @@ void EditorFileDialog::update_file_list() {
d["name"] = files.front()->get();
d["dir"] = false;
String fullpath = cdir.plus_file(files.front()->get());
+ d["path"] = fullpath;
+ item_list->set_item_metadata(item_list->get_item_count() - 1, d);
+
if (display_mode == DISPLAY_THUMBNAILS) {
EditorResourcePreview::get_singleton()->queue_resource_preview(fullpath, this, "_thumbnail_result", fullpath);
}
- d["path"] = fullpath;
- item_list->set_item_metadata(item_list->get_item_count() - 1, d);
if (file->get_text() == files.front()->get())
item_list->set_current(item_list->get_item_count() - 1);
@@ -1698,6 +1699,12 @@ EditorFileDialog::~EditorFileDialog() {
memdelete(dir_access);
}
+void EditorLineEditFileChooser::_notification(int p_what) {
+
+ if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED)
+ button->set_icon(get_icon("Folder", "EditorIcons"));
+}
+
void EditorLineEditFileChooser::_bind_methods() {
ClassDB::bind_method(D_METHOD("_browse"), &EditorLineEditFileChooser::_browse);
@@ -1724,7 +1731,6 @@ EditorLineEditFileChooser::EditorLineEditFileChooser() {
add_child(line_edit);
line_edit->set_h_size_flags(SIZE_EXPAND_FILL);
button = memnew(Button);
- button->set_text(" .. ");
add_child(button);
button->connect("pressed", this, "_browse");
dialog = memnew(EditorFileDialog);
diff --git a/editor/editor_file_dialog.h b/editor/editor_file_dialog.h
index 56cefb9a47..1b9b5f9812 100644
--- a/editor/editor_file_dialog.h
+++ b/editor/editor_file_dialog.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -254,6 +254,7 @@ class EditorLineEditFileChooser : public HBoxContainer {
void _browse();
protected:
+ void _notification(int p_what);
static void _bind_methods();
public:
diff --git a/editor/editor_file_system.cpp b/editor/editor_file_system.cpp
index a99c9656ba..5d8903a554 100644
--- a/editor/editor_file_system.cpp
+++ b/editor/editor_file_system.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -466,6 +466,7 @@ bool EditorFileSystem::_update_scan_actions() {
bool fs_changed = false;
Vector<String> reimports;
+ Vector<String> reloads;
for (List<ItemAction>::Element *E = scan_actions.front(); E; E = E->next()) {
@@ -545,12 +546,25 @@ bool EditorFileSystem::_update_scan_actions() {
fs_changed = true;
} break;
+ case ItemAction::ACTION_FILE_RELOAD: {
+
+ int idx = ia.dir->find_file_index(ia.file);
+ ERR_CONTINUE(idx == -1);
+ String full_path = ia.dir->get_file_path(idx);
+
+ reloads.push_back(full_path);
+
+ } break;
}
}
if (reimports.size()) {
reimport_files(reimports);
}
+
+ if (reloads.size()) {
+ emit_signal("resources_reload", reloads);
+ }
scan_actions.clear();
return fs_changed;
@@ -905,11 +919,11 @@ void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir, const
continue;
}
+ String path = cd.plus_file(p_dir->files[i]->file);
+
if (import_extensions.has(p_dir->files[i]->file.get_extension().to_lower())) {
//check here if file must be imported or not
- String path = cd.plus_file(p_dir->files[i]->file);
-
uint64_t mt = FileAccess::get_modified_time(path);
bool reimport = false;
@@ -936,6 +950,20 @@ void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir, const
ia.file = p_dir->files[i]->file;
scan_actions.push_back(ia);
}
+ } else if (ResourceCache::has(path)) { //test for potential reload
+
+ uint64_t mt = FileAccess::get_modified_time(path);
+
+ if (mt != p_dir->files[i]->modified_time) {
+
+ p_dir->files[i]->modified_time = mt; //save new time, but test for reload
+
+ ItemAction ia;
+ ia.action = ItemAction::ACTION_FILE_RELOAD;
+ ia.dir = p_dir;
+ ia.file = p_dir->files[i]->file;
+ scan_actions.push_back(ia);
+ }
}
}
@@ -1373,6 +1401,14 @@ void EditorFileSystem::update_script_classes() {
ScriptServer::save_global_classes();
EditorNode::get_editor_data().script_class_save_icon_paths();
+
+ // Rescan custom loaders and savers.
+ // Doing the following here because the `filesystem_changed` signal fires multiple times and isn't always followed by script classes update.
+ // So I thought it's better to do this when script classes really get updated
+ ResourceLoader::remove_custom_loaders();
+ ResourceLoader::add_custom_loaders();
+ ResourceSaver::remove_custom_savers();
+ ResourceSaver::add_custom_savers();
}
void EditorFileSystem::_queue_update_script_classes() {
@@ -1726,6 +1762,7 @@ void EditorFileSystem::_bind_methods() {
ADD_SIGNAL(MethodInfo("filesystem_changed"));
ADD_SIGNAL(MethodInfo("sources_changed", PropertyInfo(Variant::BOOL, "exist")));
ADD_SIGNAL(MethodInfo("resources_reimported", PropertyInfo(Variant::POOL_STRING_ARRAY, "resources")));
+ ADD_SIGNAL(MethodInfo("resources_reload", PropertyInfo(Variant::POOL_STRING_ARRAY, "resources")));
}
void EditorFileSystem::_update_extensions() {
diff --git a/editor/editor_file_system.h b/editor/editor_file_system.h
index f6eef2a152..c18957ae99 100644
--- a/editor/editor_file_system.h
+++ b/editor/editor_file_system.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -116,7 +116,8 @@ class EditorFileSystem : public Node {
ACTION_DIR_REMOVE,
ACTION_FILE_ADD,
ACTION_FILE_REMOVE,
- ACTION_FILE_TEST_REIMPORT
+ ACTION_FILE_TEST_REIMPORT,
+ ACTION_FILE_RELOAD
};
Action action;
diff --git a/editor/editor_folding.cpp b/editor/editor_folding.cpp
index 011fe20564..6ab41c641d 100644
--- a/editor/editor_folding.cpp
+++ b/editor/editor_folding.cpp
@@ -1,6 +1,37 @@
+/*************************************************************************/
+/* editor_folding.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
#include "editor_folding.h"
#include "core/os/file_access.h"
+#include "editor_inspector.h"
#include "editor_settings.h"
PoolVector<String> EditorFolding::_get_unfolds(const Object *p_object) {
@@ -171,5 +202,87 @@ bool EditorFolding::has_folding_data(const String &p_path) {
return FileAccess::exists(file);
}
+void EditorFolding::_do_object_unfolds(Object *p_object, Set<RES> &resources) {
+
+ List<PropertyInfo> plist;
+ p_object->get_property_list(&plist);
+ String group_base;
+ String group;
+
+ Set<String> unfold_group;
+
+ for (List<PropertyInfo>::Element *E = plist.front(); E; E = E->next()) {
+
+ if (E->get().usage & PROPERTY_USAGE_CATEGORY) {
+ group = "";
+ group_base = "";
+ }
+ if (E->get().usage & PROPERTY_USAGE_GROUP) {
+ group = E->get().name;
+ group_base = E->get().hint_string;
+ if (group_base.ends_with("_")) {
+ group_base = group_base.substr(0, group_base.length() - 1);
+ }
+ }
+
+ //can unfold
+ if (E->get().usage & PROPERTY_USAGE_EDITOR) {
+
+ if (group != "") { //group
+ if (group_base == String() || E->get().name.begins_with(group_base)) {
+ bool can_revert = EditorPropertyRevert::can_property_revert(p_object, E->get().name);
+ if (can_revert) {
+ unfold_group.insert(group);
+ }
+ }
+ } else { //path
+ int last = E->get().name.find_last("/");
+ if (last != -1) {
+ bool can_revert = EditorPropertyRevert::can_property_revert(p_object, E->get().name);
+ if (can_revert) {
+ unfold_group.insert(E->get().name.substr(0, last));
+ }
+ }
+ }
+ }
+
+ if (E->get().type == Variant::OBJECT) {
+ RES res = p_object->get(E->get().name);
+ if (res.is_valid() && !resources.has(res) && res->get_path() != String() && !res->get_path().is_resource_file()) {
+
+ resources.insert(res);
+ _do_object_unfolds(res.ptr(), resources);
+ }
+ }
+ }
+
+ for (Set<String>::Element *E = unfold_group.front(); E; E = E->next()) {
+ p_object->editor_set_section_unfold(E->get(), true);
+ }
+}
+
+void EditorFolding::_do_node_unfolds(Node *p_root, Node *p_node, Set<RES> &resources) {
+ if (p_root != p_node) {
+ if (!p_node->get_owner()) {
+ return; //not owned, bye
+ }
+ if (p_node->get_owner() != p_root && !p_root->is_editable_instance(p_node)) {
+ return;
+ }
+ }
+
+ _do_object_unfolds(p_node, resources);
+
+ for (int i = 0; i < p_node->get_child_count(); i++) {
+ _do_node_unfolds(p_root, p_node->get_child(i), resources);
+ }
+}
+
+void EditorFolding::unfold_scene(Node *p_scene) {
+
+ Set<RES> resources;
+ _do_node_unfolds(p_scene, p_scene, resources);
+}
+
EditorFolding::EditorFolding() {
}
diff --git a/editor/editor_folding.h b/editor/editor_folding.h
index cfd4b5466d..e4f7dbba80 100644
--- a/editor/editor_folding.h
+++ b/editor/editor_folding.h
@@ -1,3 +1,33 @@
+/*************************************************************************/
+/* editor_folding.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
#ifndef EDITOR_FOLDING_H
#define EDITOR_FOLDING_H
@@ -10,6 +40,9 @@ class EditorFolding {
void _fill_folds(const Node *p_root, const Node *p_node, Array &p_folds, Array &resource_folds, Set<RES> &resources);
+ void _do_object_unfolds(Object *p_object, Set<RES> &resources);
+ void _do_node_unfolds(Node *p_root, Node *p_node, Set<RES> &resources);
+
public:
void save_resource_folding(const RES &p_resource, const String &p_path);
void load_resource_folding(RES p_resource, const String &p_path);
@@ -17,6 +50,8 @@ public:
void save_scene_folding(const Node *p_scene, const String &p_path);
void load_scene_folding(Node *p_scene, const String &p_path);
+ void unfold_scene(Node *p_scene);
+
bool has_folding_data(const String &p_path);
EditorFolding();
diff --git a/editor/editor_fonts.cpp b/editor/editor_fonts.cpp
index 8b1818b595..d0e7cda6b6 100644
--- a/editor/editor_fonts.cpp
+++ b/editor/editor_fonts.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -93,12 +93,14 @@ void editor_register_fonts(Ref<Theme> p_theme) {
/* Custom font */
+ bool font_antialiased = (bool)EditorSettings::get_singleton()->get("interface/editor/main_font_antialiased");
DynamicFontData::Hinting font_hinting = (DynamicFontData::Hinting)(int)EditorSettings::get_singleton()->get("interface/editor/main_font_hinting");
String custom_font_path = EditorSettings::get_singleton()->get("interface/editor/main_font");
Ref<DynamicFontData> CustomFont;
if (custom_font_path.length() > 0 && dir->file_exists(custom_font_path)) {
CustomFont.instance();
+ CustomFont->set_antialiased(font_antialiased);
CustomFont->set_hinting(font_hinting);
CustomFont->set_font_path(custom_font_path);
CustomFont->set_force_autohinter(true); //just looks better..i think?
@@ -112,6 +114,7 @@ void editor_register_fonts(Ref<Theme> p_theme) {
Ref<DynamicFontData> CustomFontBold;
if (custom_font_path_bold.length() > 0 && dir->file_exists(custom_font_path_bold)) {
CustomFontBold.instance();
+ CustomFontBold->set_antialiased(font_antialiased);
CustomFontBold->set_hinting(font_hinting);
CustomFontBold->set_font_path(custom_font_path_bold);
CustomFontBold->set_force_autohinter(true); //just looks better..i think?
@@ -122,10 +125,12 @@ void editor_register_fonts(Ref<Theme> p_theme) {
/* Custom source code font */
String custom_font_path_source = EditorSettings::get_singleton()->get("interface/editor/code_font");
+ bool font_source_antialiased = (bool)EditorSettings::get_singleton()->get("interface/editor/code_font_antialiased");
DynamicFontData::Hinting font_source_hinting = (DynamicFontData::Hinting)(int)EditorSettings::get_singleton()->get("interface/editor/code_font_hinting");
Ref<DynamicFontData> CustomFontSource;
if (custom_font_path_source.length() > 0 && dir->file_exists(custom_font_path_source)) {
CustomFontSource.instance();
+ CustomFontSource->set_antialiased(font_source_antialiased);
CustomFontSource->set_hinting(font_source_hinting);
CustomFontSource->set_font_path(custom_font_path_source);
} else {
@@ -138,48 +143,56 @@ void editor_register_fonts(Ref<Theme> p_theme) {
Ref<DynamicFontData> DefaultFont;
DefaultFont.instance();
+ DefaultFont->set_antialiased(font_antialiased);
DefaultFont->set_hinting(font_hinting);
DefaultFont->set_font_ptr(_font_NotoSansUI_Regular, _font_NotoSansUI_Regular_size);
DefaultFont->set_force_autohinter(true); //just looks better..i think?
Ref<DynamicFontData> DefaultFontBold;
DefaultFontBold.instance();
- DefaultFont->set_hinting(font_hinting);
+ DefaultFontBold->set_antialiased(font_antialiased);
+ DefaultFontBold->set_hinting(font_hinting);
DefaultFontBold->set_font_ptr(_font_NotoSansUI_Bold, _font_NotoSansUI_Bold_size);
DefaultFontBold->set_force_autohinter(true); // just looks better..i think?
Ref<DynamicFontData> FontFallback;
FontFallback.instance();
+ FontFallback->set_antialiased(font_antialiased);
FontFallback->set_hinting(font_hinting);
FontFallback->set_font_ptr(_font_DroidSansFallback, _font_DroidSansFallback_size);
FontFallback->set_force_autohinter(true); //just looks better..i think?
Ref<DynamicFontData> FontJapanese;
FontJapanese.instance();
+ FontJapanese->set_antialiased(font_antialiased);
FontJapanese->set_hinting(font_hinting);
FontJapanese->set_font_ptr(_font_DroidSansJapanese, _font_DroidSansJapanese_size);
FontJapanese->set_force_autohinter(true); //just looks better..i think?
Ref<DynamicFontData> FontArabic;
FontArabic.instance();
+ FontArabic->set_antialiased(font_antialiased);
FontArabic->set_hinting(font_hinting);
FontArabic->set_font_ptr(_font_NotoNaskhArabicUI_Regular, _font_NotoNaskhArabicUI_Regular_size);
FontArabic->set_force_autohinter(true); //just looks better..i think?
Ref<DynamicFontData> FontHebrew;
FontHebrew.instance();
+ FontHebrew->set_antialiased(font_antialiased);
FontHebrew->set_hinting(font_hinting);
FontHebrew->set_font_ptr(_font_NotoSansHebrew_Regular, _font_NotoSansHebrew_Regular_size);
FontHebrew->set_force_autohinter(true); //just looks better..i think?
Ref<DynamicFontData> FontThai;
FontThai.instance();
+ FontThai->set_antialiased(font_antialiased);
FontThai->set_hinting(font_hinting);
FontThai->set_font_ptr(_font_NotoSansThaiUI_Regular, _font_NotoSansThaiUI_Regular_size);
FontThai->set_force_autohinter(true); //just looks better..i think?
Ref<DynamicFontData> FontHindi;
FontHindi.instance();
+ FontHindi->set_antialiased(font_antialiased);
FontHindi->set_hinting(font_hinting);
FontHindi->set_font_ptr(_font_NotoSansDevanagariUI_Regular, _font_NotoSansDevanagariUI_Regular_size);
FontHindi->set_force_autohinter(true); //just looks better..i think?
@@ -188,6 +201,7 @@ void editor_register_fonts(Ref<Theme> p_theme) {
Ref<DynamicFontData> dfmono;
dfmono.instance();
+ dfmono->set_antialiased(font_source_antialiased);
dfmono->set_hinting(font_source_hinting);
dfmono->set_font_ptr(_font_Hack_Regular, _font_Hack_Regular_size);
//dfd->set_force_autohinter(true); //just looks better..i think?
diff --git a/editor/editor_fonts.h b/editor/editor_fonts.h
index d079b41b82..d944683067 100644
--- a/editor/editor_fonts.h
+++ b/editor/editor_fonts.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp
index 3ee8d9c6c5..f8cee6883b 100644
--- a/editor/editor_help.cpp
+++ b/editor/editor_help.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -40,480 +40,6 @@
#define CONTRIBUTE2_URL "https://github.com/godotengine/godot-docs"
#define REQUEST_URL "https://github.com/godotengine/godot-docs/issues/new"
-void EditorHelpSearch::popup_dialog() {
-
- popup_centered(Size2(700, 600) * EDSCALE);
- if (search_box->get_text() != "") {
- search_box->select_all();
- _update_search();
- }
- search_box->grab_focus();
-}
-
-void EditorHelpSearch::popup_dialog(const String &p_term) {
-
- popup_centered(Size2(700, 600) * EDSCALE);
- if (p_term != "") {
- search_box->set_text(p_term);
- search_box->select_all();
- _update_search();
- } else {
- search_box->clear();
- }
- search_box->grab_focus();
-}
-
-void EditorHelpSearch::_text_changed(const String &p_newtext) {
-
- _update_search();
-}
-
-void EditorHelpSearch::_sbox_input(const Ref<InputEvent> &p_ie) {
-
- Ref<InputEventKey> k = p_ie;
-
- if (k.is_valid() && (k->get_scancode() == KEY_UP ||
- k->get_scancode() == KEY_DOWN ||
- k->get_scancode() == KEY_PAGEUP ||
- k->get_scancode() == KEY_PAGEDOWN)) {
-
- search_options->call("_gui_input", k);
- search_box->accept_event();
- }
-}
-
-void EditorHelpSearch::IncrementalSearch::phase1(Map<String, DocData::ClassDoc>::Element *E) {
-
- if (E->key().findn(term) != -1) {
-
- TreeItem *item = search_options->create_item(root);
- item->set_metadata(0, "class_name:" + E->key());
- item->set_text(0, E->key() + " (Class)");
- Ref<Texture> icon = EditorNode::get_singleton()->get_class_icon(E->key(), "Node");
- item->set_icon(0, icon);
- }
-}
-
-void EditorHelpSearch::IncrementalSearch::phase2(Map<String, DocData::ClassDoc>::Element *E) {
-
- DocData::ClassDoc &c = E->get();
-
- Ref<Texture> cicon = EditorNode::get_singleton()->get_class_icon(E->key(), "Node");
-
- for (int i = 0; i < c.methods.size(); i++) {
- if ((term.begins_with(".") && c.methods[i].name.begins_with(term.right(1))) || (term.ends_with("(") && c.methods[i].name.ends_with(term.left(term.length() - 1).strip_edges())) || (term.begins_with(".") && term.ends_with("(") && c.methods[i].name == term.substr(1, term.length() - 2).strip_edges()) || c.methods[i].name.findn(term) != -1) {
-
- TreeItem *item = search_options->create_item(root);
- item->set_metadata(0, "class_method:" + E->key() + ":" + c.methods[i].name);
- item->set_text(0, E->key() + "." + c.methods[i].name + " (Method)");
- item->set_icon(0, cicon);
- }
- }
-
- for (int i = 0; i < c.signals.size(); i++) {
-
- if (c.signals[i].name.findn(term) != -1) {
-
- TreeItem *item = search_options->create_item(root);
- item->set_metadata(0, "class_signal:" + E->key() + ":" + c.signals[i].name);
- item->set_text(0, E->key() + "." + c.signals[i].name + " (Signal)");
- item->set_icon(0, cicon);
- }
- }
-
- for (int i = 0; i < c.constants.size(); i++) {
-
- if (c.constants[i].name.findn(term) != -1) {
-
- TreeItem *item = search_options->create_item(root);
- item->set_metadata(0, "class_constant:" + E->key() + ":" + c.constants[i].name);
- item->set_text(0, E->key() + "." + c.constants[i].name + " (Constant)");
- item->set_icon(0, cicon);
- }
- }
-
- for (int i = 0; i < c.properties.size(); i++) {
-
- if (c.properties[i].name.findn(term) != -1) {
-
- TreeItem *item = search_options->create_item(root);
- item->set_metadata(0, "class_property:" + E->key() + ":" + c.properties[i].name);
- item->set_text(0, E->key() + "." + c.properties[i].name + " (Property)");
- item->set_icon(0, cicon);
- }
- }
-
- for (int i = 0; i < c.theme_properties.size(); i++) {
-
- if (c.theme_properties[i].name.findn(term) != -1) {
-
- TreeItem *item = search_options->create_item(root);
- item->set_metadata(0, "class_theme_item:" + E->key() + ":" + c.theme_properties[i].name);
- item->set_text(0, E->key() + "." + c.theme_properties[i].name + " (Theme Item)");
- item->set_icon(0, cicon);
- }
- }
-}
-
-bool EditorHelpSearch::IncrementalSearch::slice() {
-
- if (phase > 2)
- return true;
-
- if (iterator) {
-
- switch (phase) {
-
- case 1: {
- phase1(iterator);
- } break;
- case 2: {
- phase2(iterator);
- } break;
- default: {
- WARN_PRINT("illegal phase in IncrementalSearch");
- return true;
- }
- }
-
- iterator = iterator->next();
- } else {
-
- phase += 1;
- iterator = doc->class_list.front();
- }
-
- return false;
-}
-
-EditorHelpSearch::IncrementalSearch::IncrementalSearch(EditorHelpSearch *p_search, Tree *p_search_options, const String &p_term) :
- search(p_search),
- search_options(p_search_options) {
-
- def_icon = search->get_icon("Node", "EditorIcons");
- doc = EditorHelp::get_doc_data();
-
- term = p_term;
-
- root = search_options->create_item();
- phase = 0;
- iterator = 0;
-}
-
-bool EditorHelpSearch::IncrementalSearch::empty() const {
-
- return root->get_children() == NULL;
-}
-
-bool EditorHelpSearch::IncrementalSearch::work(uint64_t slot) {
-
- const uint64_t until = OS::get_singleton()->get_ticks_usec() + slot;
-
- while (!slice()) {
-
- if (OS::get_singleton()->get_ticks_usec() > until)
- return false;
- }
-
- return true;
-}
-
-void EditorHelpSearch::_update_search() {
- search_options->clear();
-
- String term = search_box->get_text();
- if (term.length() < 2)
- return;
-
- search = Ref<IncrementalSearch>(memnew(IncrementalSearch(this, search_options, term)));
- set_process(true);
-}
-
-void EditorHelpSearch::_confirmed() {
-
- TreeItem *ti = search_options->get_selected();
- if (!ti)
- return;
-
- String mdata = ti->get_metadata(0);
- EditorNode::get_singleton()->set_visible_editor(EditorNode::EDITOR_SCRIPT);
- emit_signal("go_to_help", mdata);
- // go to that
- hide();
-}
-
-void EditorHelpSearch::_notification(int p_what) {
-
- if (p_what == NOTIFICATION_ENTER_TREE) {
-
- //_update_icons
- search_box->set_right_icon(get_icon("Search", "EditorIcons"));
- search_box->set_clear_button_enabled(true);
-
- connect("confirmed", this, "_confirmed");
- _update_search();
- } else if (p_what == NOTIFICATION_EXIT_TREE) {
- disconnect("confirmed", this, "_confirmed");
- } else if (p_what == NOTIFICATION_VISIBILITY_CHANGED) {
-
- if (is_visible_in_tree()) {
-
- search_box->call_deferred("grab_focus"); // still not visible
- search_box->select_all();
- }
- } else if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) {
-
- //_update_icons
- search_box->set_right_icon(get_icon("Search", "EditorIcons"));
- search_box->set_clear_button_enabled(true);
- } else if (p_what == NOTIFICATION_PROCESS) {
-
- if (search.is_valid()) {
-
- if (search->work()) {
-
- get_ok()->set_disabled(search->empty());
- search = Ref<IncrementalSearch>();
- set_process(false);
- }
- } else {
-
- set_process(false);
- }
- }
-}
-
-void EditorHelpSearch::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("_text_changed"), &EditorHelpSearch::_text_changed);
- ClassDB::bind_method(D_METHOD("_confirmed"), &EditorHelpSearch::_confirmed);
- ClassDB::bind_method(D_METHOD("_sbox_input"), &EditorHelpSearch::_sbox_input);
- ClassDB::bind_method(D_METHOD("_update_search"), &EditorHelpSearch::_update_search);
-
- ADD_SIGNAL(MethodInfo("go_to_help"));
-}
-
-EditorHelpSearch::EditorHelpSearch() {
-
- VBoxContainer *vbc = memnew(VBoxContainer);
- add_child(vbc);
-
- search_box = memnew(LineEdit);
- vbc->add_child(search_box);
- search_box->connect("text_changed", this, "_text_changed");
- search_box->connect("gui_input", this, "_sbox_input");
- search_options = memnew(Tree);
- search_options->set_hide_root(true);
- vbc->add_margin_child(TTR("Matches:"), search_options, true);
- get_ok()->set_text(TTR("Open"));
- get_ok()->set_disabled(true);
- register_text_enter(search_box);
- set_hide_on_ok(false);
- search_options->connect("item_activated", this, "_confirmed");
- set_title(TTR("Search Help"));
-}
-
-/////////////////////////////////
-
-void EditorHelpIndex::add_type(const String &p_type, HashMap<String, TreeItem *> &p_types, TreeItem *p_root) {
-
- if (p_types.has(p_type))
- return;
-
- String inherits = EditorHelp::get_doc_data()->class_list[p_type].inherits;
-
- TreeItem *parent = p_root;
-
- if (inherits.length()) {
-
- if (!p_types.has(inherits)) {
-
- add_type(inherits, p_types, p_root);
- }
-
- if (p_types.has(inherits))
- parent = p_types[inherits];
- }
-
- TreeItem *item = class_list->create_item(parent);
- item->set_metadata(0, p_type);
- item->set_tooltip(0, EditorHelp::get_doc_data()->class_list[p_type].brief_description);
- item->set_text(0, p_type);
-
- Ref<Texture> icon = EditorNode::get_singleton()->get_class_icon(p_type);
- item->set_icon(0, icon);
-
- p_types[p_type] = item;
-}
-
-void EditorHelpIndex::_tree_item_selected() {
-
- TreeItem *s = class_list->get_selected();
- if (!s)
- return;
-
- EditorNode::get_singleton()->set_visible_editor(EditorNode::EDITOR_SCRIPT);
- emit_signal("open_class", s->get_text(0));
- hide();
-}
-
-void EditorHelpIndex::select_class(const String &p_class) {
-
- if (!tree_item_map.has(p_class))
- return;
- tree_item_map[p_class]->select(0);
- class_list->ensure_cursor_is_visible();
-}
-
-void EditorHelpIndex::popup_dialog() {
-
- popup_centered(Size2(500, 600) * EDSCALE);
-
- search_box->set_text("");
- _update_class_list();
-}
-
-void EditorHelpIndex::_notification(int p_what) {
-
- if (p_what == NOTIFICATION_ENTER_TREE) {
-
- //_update_icons
- search_box->set_right_icon(get_icon("Search", "EditorIcons"));
- search_box->set_clear_button_enabled(true);
- _update_class_list();
-
- connect("confirmed", this, "_tree_item_selected");
-
- } else if (p_what == NOTIFICATION_POST_POPUP) {
-
- search_box->call_deferred("grab_focus");
- } else if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) {
-
- //_update_icons
- search_box->set_right_icon(get_icon("Search", "EditorIcons"));
- search_box->set_clear_button_enabled(true);
-
- bool enable_rl = EditorSettings::get_singleton()->get("docks/scene_tree/draw_relationship_lines");
- Color rl_color = EditorSettings::get_singleton()->get("docks/scene_tree/relationship_line_color");
-
- if (enable_rl) {
- class_list->add_constant_override("draw_relationship_lines", 1);
- class_list->add_color_override("relationship_line_color", rl_color);
- } else {
- class_list->add_constant_override("draw_relationship_lines", 0);
- }
- }
-}
-
-void EditorHelpIndex::_text_changed(const String &p_text) {
-
- _update_class_list();
-}
-
-void EditorHelpIndex::_update_class_list() {
-
- class_list->clear();
- tree_item_map.clear();
- TreeItem *root = class_list->create_item();
-
- String filter = search_box->get_text().strip_edges();
- String to_select = "";
-
- for (Map<String, DocData::ClassDoc>::Element *E = EditorHelp::get_doc_data()->class_list.front(); E; E = E->next()) {
-
- if (filter == "") {
- add_type(E->key(), tree_item_map, root);
- } else {
-
- bool found = false;
- String type = E->key();
-
- while (type != "") {
- if (filter.is_subsequence_ofi(type)) {
-
- if (to_select.empty() || type.length() < to_select.length()) {
- to_select = type;
- }
-
- found = true;
- }
-
- type = EditorHelp::get_doc_data()->class_list[type].inherits;
- }
-
- if (found) {
- add_type(E->key(), tree_item_map, root);
- }
- }
- }
-
- if (tree_item_map.has(filter)) {
- select_class(filter);
- } else if (to_select != "") {
- select_class(to_select);
- }
-}
-
-void EditorHelpIndex::_sbox_input(const Ref<InputEvent> &p_ie) {
-
- Ref<InputEventKey> k = p_ie;
-
- if (k.is_valid() && (k->get_scancode() == KEY_UP ||
- k->get_scancode() == KEY_DOWN ||
- k->get_scancode() == KEY_PAGEUP ||
- k->get_scancode() == KEY_PAGEDOWN)) {
-
- class_list->call("_gui_input", k);
- search_box->accept_event();
- }
-}
-
-void EditorHelpIndex::_bind_methods() {
-
- ClassDB::bind_method("_tree_item_selected", &EditorHelpIndex::_tree_item_selected);
- ClassDB::bind_method("_text_changed", &EditorHelpIndex::_text_changed);
- ClassDB::bind_method("_sbox_input", &EditorHelpIndex::_sbox_input);
- ClassDB::bind_method("select_class", &EditorHelpIndex::select_class);
- ADD_SIGNAL(MethodInfo("open_class"));
-}
-
-EditorHelpIndex::EditorHelpIndex() {
-
- VBoxContainer *vbc = memnew(VBoxContainer);
- add_child(vbc);
-
- search_box = memnew(LineEdit);
- vbc->add_child(search_box);
- search_box->set_h_size_flags(SIZE_EXPAND_FILL);
-
- register_text_enter(search_box);
-
- search_box->connect("text_changed", this, "_text_changed");
- search_box->connect("gui_input", this, "_sbox_input");
-
- class_list = memnew(Tree);
- vbc->add_margin_child(TTR("Class List:") + " ", class_list, true);
- class_list->set_hide_root(true);
- class_list->set_v_size_flags(SIZE_EXPAND_FILL);
-
- class_list->connect("item_activated", this, "_tree_item_selected");
-
- bool enable_rl = EditorSettings::get_singleton()->get("docks/scene_tree/draw_relationship_lines");
- Color rl_color = EditorSettings::get_singleton()->get("docks/scene_tree/relationship_line_color");
-
- if (enable_rl) {
- class_list->add_constant_override("draw_relationship_lines", 1);
- class_list->add_color_override("relationship_line_color", rl_color);
- } else {
- class_list->add_constant_override("draw_relationship_lines", 0);
- }
-
- get_ok()->set_text(TTR("Open"));
- set_title(TTR("Search Classes"));
-}
-
-/////////////////////////////////
-
DocData *EditorHelp::doc = NULL;
void EditorHelp::_init_colors() {
@@ -1921,8 +1447,6 @@ EditorHelp::EditorHelp() {
EditorHelp::~EditorHelp() {
}
-/////////////
-
void EditorHelpBit::_go_to_help(String p_what) {
EditorNode::get_singleton()->set_visible_editor(EditorNode::EDITOR_SCRIPT);
diff --git a/editor/editor_help.h b/editor/editor_help.h
index 25db68b42d..133d98f81f 100644
--- a/editor/editor_help.h
+++ b/editor/editor_help.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -31,6 +31,8 @@
#ifndef EDITOR_HELP_H
#define EDITOR_HELP_H
+#include "editor/code_editor.h"
+#include "editor/doc/doc_data.h"
#include "editor/editor_plugin.h"
#include "scene/gui/menu_button.h"
#include "scene/gui/panel_container.h"
@@ -38,95 +40,9 @@
#include "scene/gui/split_container.h"
#include "scene/gui/tab_container.h"
#include "scene/gui/text_edit.h"
-#include "scene/gui/tree.h"
-
-#include "editor/code_editor.h"
-#include "editor/doc/doc_data.h"
#include "scene/main/timer.h"
-class EditorNode;
-
-class EditorHelpSearch : public ConfirmationDialog {
-
- GDCLASS(EditorHelpSearch, ConfirmationDialog)
-
- LineEdit *search_box;
- Tree *search_options;
- String base_type;
-
- class IncrementalSearch : public Reference {
- String term;
- TreeItem *root;
-
- EditorHelpSearch *search;
- Tree *search_options;
-
- DocData *doc;
- Ref<Texture> def_icon;
-
- int phase;
- Map<String, DocData::ClassDoc>::Element *iterator;
-
- void phase1(Map<String, DocData::ClassDoc>::Element *E);
- void phase2(Map<String, DocData::ClassDoc>::Element *E);
- bool slice();
-
- public:
- IncrementalSearch(EditorHelpSearch *p_search, Tree *p_search_options, const String &p_term);
-
- bool empty() const;
- bool work(uint64_t slot = 1000000 / 10);
- };
-
- Ref<IncrementalSearch> search;
-
- void _update_search();
-
- void _sbox_input(const Ref<InputEvent> &p_ie);
-
- void _confirmed();
- void _text_changed(const String &p_newtext);
-
-protected:
- void _notification(int p_what);
- static void _bind_methods();
-
-public:
- void popup_dialog();
- void popup_dialog(const String &p_term);
-
- EditorHelpSearch();
-};
-
-class EditorHelpIndex : public ConfirmationDialog {
- GDCLASS(EditorHelpIndex, ConfirmationDialog);
-
- LineEdit *search_box;
- Tree *class_list;
- HashMap<String, TreeItem *> tree_item_map;
-
- void _tree_item_selected();
- void _text_changed(const String &p_text);
- void _sbox_input(const Ref<InputEvent> &p_ie);
-
- void _update_class_list();
-
- void add_type(const String &p_type, HashMap<String, TreeItem *> &p_types, TreeItem *p_root);
-
-protected:
- void _notification(int p_what);
- static void _bind_methods();
-
-public:
- void select_class(const String &p_class);
-
- void popup_dialog();
-
- EditorHelpIndex();
-};
-
class FindBar : public HBoxContainer {
-
GDCLASS(FindBar, HBoxContainer);
LineEdit *search_text;
@@ -172,6 +88,7 @@ public:
};
class EditorHelp : public VBoxContainer {
+
GDCLASS(EditorHelp, VBoxContainer);
enum Page {
diff --git a/editor/editor_help_search.cpp b/editor/editor_help_search.cpp
new file mode 100644
index 0000000000..21cddc8ca4
--- /dev/null
+++ b/editor/editor_help_search.cpp
@@ -0,0 +1,590 @@
+/*************************************************************************/
+/* editor_help_search.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "editor_help_search.h"
+
+#include "core/os/keyboard.h"
+#include "editor_node.h"
+
+void EditorHelpSearch::_update_icons() {
+
+ search_box->set_right_icon(get_icon("Search", "EditorIcons"));
+ search_box->set_clear_button_enabled(true);
+ search_box->add_icon_override("right_icon", get_icon("Search", "EditorIcons"));
+ case_sensitive_button->set_icon(get_icon("MatchCase", "EditorIcons"));
+ hierarchy_button->set_icon(get_icon("ClassList", "EditorIcons"));
+
+ if (is_visible_in_tree())
+ _update_results();
+}
+
+void EditorHelpSearch::_load_settings() {
+
+ bool enable_rl = EditorSettings::get_singleton()->get("docks/scene_tree/draw_relationship_lines");
+ Color rl_color = EditorSettings::get_singleton()->get("docks/scene_tree/relationship_line_color");
+
+ if (enable_rl) {
+ results_tree->add_constant_override("draw_relationship_lines", 1);
+ results_tree->add_color_override("relationship_line_color", rl_color);
+ results_tree->add_constant_override("draw_guides", 0);
+ } else {
+ results_tree->add_constant_override("draw_relationship_lines", 0);
+ results_tree->add_constant_override("draw_guides", 1);
+ }
+}
+
+void EditorHelpSearch::_update_results() {
+
+ String term = search_box->get_text();
+
+ int search_flags = filter_combo->get_selected_id();
+ if (case_sensitive_button->is_pressed())
+ search_flags |= SEARCH_CASE_SENSITIVE;
+ if (hierarchy_button->is_pressed())
+ search_flags |= SEARCH_SHOW_HIERARCHY;
+
+ search = Ref<Runner>(memnew(Runner(this, results_tree, term, search_flags)));
+ set_process(true);
+}
+
+void EditorHelpSearch::_search_box_gui_input(const Ref<InputEvent> &p_event) {
+
+ // Redirect up and down navigational key events to the results list.
+ Ref<InputEventKey> key = p_event;
+ if (key.is_valid()) {
+ switch (key->get_scancode()) {
+ case KEY_UP:
+ case KEY_DOWN:
+ case KEY_PAGEUP:
+ case KEY_PAGEDOWN: {
+ results_tree->call("_gui_input", key);
+ search_box->accept_event();
+ } break;
+ }
+ }
+}
+
+void EditorHelpSearch::_search_box_text_changed(const String &p_text) {
+
+ _update_results();
+}
+
+void EditorHelpSearch::_filter_combo_item_selected(int p_option) {
+
+ _update_results();
+}
+
+void EditorHelpSearch::_confirmed() {
+
+ TreeItem *item = results_tree->get_selected();
+ if (!item)
+ return;
+
+ // Activate the script editor and emit the signal with the documentation link to display.
+ EditorNode::get_singleton()->set_visible_editor(EditorNode::EDITOR_SCRIPT);
+
+ emit_signal("go_to_help", item->get_metadata(0));
+
+ hide();
+}
+
+void EditorHelpSearch::_notification(int p_what) {
+
+ switch (p_what) {
+ case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
+
+ _load_settings();
+ _update_icons();
+ } break;
+ case NOTIFICATION_ENTER_TREE: {
+
+ connect("confirmed", this, "_confirmed");
+ _update_icons();
+ } break;
+ case NOTIFICATION_POPUP_HIDE: {
+
+ results_tree->call_deferred("clear"); // Wait for the Tree's mouse event propagation.
+ get_ok()->set_disabled(true);
+ EditorSettings::get_singleton()->set_project_metadata("dialog_bounds", "search_help", get_rect());
+ } break;
+ case NOTIFICATION_PROCESS: {
+
+ // Update background search.
+ if (search.is_valid()) {
+ if (search->work()) {
+ // Search done.
+
+ // Only point to the perfect match if it's a new search, and not just reopening a old one.
+ if (!old_search)
+ results_tree->ensure_cursor_is_visible();
+ else
+ old_search = false;
+
+ get_ok()->set_disabled(!results_tree->get_selected());
+
+ search = Ref<Runner>();
+ set_process(false);
+ }
+ } else {
+ set_process(false);
+ }
+ } break;
+ }
+}
+
+void EditorHelpSearch::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_update_results"), &EditorHelpSearch::_update_results);
+ ClassDB::bind_method(D_METHOD("_search_box_gui_input"), &EditorHelpSearch::_search_box_gui_input);
+ ClassDB::bind_method(D_METHOD("_search_box_text_changed"), &EditorHelpSearch::_search_box_text_changed);
+ ClassDB::bind_method(D_METHOD("_filter_combo_item_selected"), &EditorHelpSearch::_filter_combo_item_selected);
+ ClassDB::bind_method(D_METHOD("_confirmed"), &EditorHelpSearch::_confirmed);
+ ADD_SIGNAL(MethodInfo("go_to_help"));
+}
+
+void EditorHelpSearch::popup_dialog() {
+
+ popup_dialog(search_box->get_text());
+}
+
+void EditorHelpSearch::popup_dialog(const String &p_term) {
+
+ // Restore valid window bounds or pop up at default size.
+ Rect2 saved_size = EditorSettings::get_singleton()->get_project_metadata("dialog_bounds", "search_help", Rect2());
+ if (saved_size != Rect2())
+ popup(saved_size);
+ else
+ popup_centered_ratio(0.5F);
+
+ if (p_term == "") {
+ search_box->clear();
+ } else {
+ old_search = true;
+ search_box->set_text(p_term);
+ search_box->select_all();
+ }
+ search_box->grab_focus();
+ _update_results();
+}
+
+EditorHelpSearch::EditorHelpSearch() {
+
+ old_search = false;
+
+ set_hide_on_ok(false);
+ set_resizable(true);
+ set_title(TTR("Search Help"));
+
+ get_ok()->set_disabled(true);
+ get_ok()->set_text(TTR("Open"));
+
+ // Split search and results area.
+ VBoxContainer *vbox = memnew(VBoxContainer);
+ add_child(vbox);
+
+ // Create the search box and filter controls (at the top).
+ HBoxContainer *hbox = memnew(HBoxContainer);
+ vbox->add_child(hbox);
+
+ search_box = memnew(LineEdit);
+ search_box->set_custom_minimum_size(Size2(200, 0));
+ search_box->set_h_size_flags(SIZE_EXPAND_FILL);
+ search_box->connect("gui_input", this, "_search_box_gui_input");
+ search_box->connect("text_changed", this, "_search_box_text_changed");
+ register_text_enter(search_box);
+ hbox->add_child(search_box);
+
+ case_sensitive_button = memnew(ToolButton);
+ case_sensitive_button->set_tooltip("Case Sensitive");
+ case_sensitive_button->connect("pressed", this, "_update_results");
+ case_sensitive_button->set_toggle_mode(true);
+ case_sensitive_button->set_focus_mode(FOCUS_NONE);
+ hbox->add_child(case_sensitive_button);
+
+ hierarchy_button = memnew(ToolButton);
+ hierarchy_button->set_tooltip("Show Hierarchy");
+ hierarchy_button->connect("pressed", this, "_update_results");
+ hierarchy_button->set_toggle_mode(true);
+ hierarchy_button->set_pressed(true);
+ hierarchy_button->set_focus_mode(FOCUS_NONE);
+ hbox->add_child(hierarchy_button);
+
+ filter_combo = memnew(OptionButton);
+ filter_combo->set_custom_minimum_size(Size2(200, 0));
+ filter_combo->set_stretch_ratio(0); // Fixed width.
+ filter_combo->add_item(TTR("Display All"), SEARCH_ALL);
+ filter_combo->add_separator();
+ filter_combo->add_item(TTR("Classes Only"), SEARCH_CLASSES);
+ filter_combo->add_item(TTR("Methods Only"), SEARCH_METHODS);
+ filter_combo->add_item(TTR("Signals Only"), SEARCH_SIGNALS);
+ filter_combo->add_item(TTR("Constants Only"), SEARCH_CONSTANTS);
+ filter_combo->add_item(TTR("Properties Only"), SEARCH_PROPERTIES);
+ filter_combo->add_item(TTR("Theme Properties Only"), SEARCH_THEME_ITEMS);
+ filter_combo->connect("item_selected", this, "_filter_combo_item_selected");
+ hbox->add_child(filter_combo);
+
+ // Create the results tree.
+ results_tree = memnew(Tree);
+ results_tree->set_v_size_flags(SIZE_EXPAND_FILL);
+ results_tree->set_columns(2);
+ results_tree->set_column_title(0, TTR("Name"));
+ results_tree->set_column_title(1, TTR("Member Type"));
+ results_tree->set_column_expand(1, false);
+ results_tree->set_column_min_width(1, 150);
+ results_tree->set_custom_minimum_size(Size2(0, 100));
+ results_tree->set_hide_root(true);
+ results_tree->set_select_mode(Tree::SELECT_ROW);
+ results_tree->connect("item_activated", this, "_confirmed");
+ results_tree->connect("item_selected", get_ok(), "set_disabled", varray(false));
+ vbox->add_child(results_tree, true);
+
+ _load_settings();
+}
+
+bool EditorHelpSearch::Runner::_slice() {
+
+ bool phase_done = false;
+ switch (phase) {
+ case PHASE_MATCH_CLASSES_INIT:
+ phase_done = _phase_match_classes_init();
+ break;
+ case PHASE_MATCH_CLASSES:
+ phase_done = _phase_match_classes();
+ break;
+ case PHASE_CLASS_ITEMS_INIT:
+ phase_done = _phase_class_items_init();
+ break;
+ case PHASE_CLASS_ITEMS:
+ phase_done = _phase_class_items();
+ break;
+ case PHASE_MEMBER_ITEMS_INIT:
+ phase_done = _phase_member_items_init();
+ break;
+ case PHASE_MEMBER_ITEMS:
+ phase_done = _phase_member_items();
+ break;
+ case PHASE_SELECT_MATCH:
+ phase_done = _phase_select_match();
+ break;
+ case PHASE_MAX:
+ return true;
+ default:
+ WARN_PRINTS("Invalid or unhandled phase in EditorHelpSearch::Runner, aborting search.");
+ return true;
+ };
+
+ if (phase_done)
+ phase++;
+ return false;
+}
+
+bool EditorHelpSearch::Runner::_phase_match_classes_init() {
+
+ iterator_doc = EditorHelp::get_doc_data()->class_list.front();
+ matches.clear();
+ matched_item = NULL;
+
+ return true;
+}
+
+bool EditorHelpSearch::Runner::_phase_match_classes() {
+
+ DocData::ClassDoc &class_doc = iterator_doc->value();
+
+ matches[class_doc.name] = ClassMatch();
+ ClassMatch &match = matches[class_doc.name];
+
+ match.doc = &class_doc;
+
+ // Match class name.
+ if (search_flags & SEARCH_CLASSES)
+ match.name = term == "" || _match_string(term, class_doc.name);
+
+ // Match members if the term is long enough.
+ if (term.length() > 1) {
+ if (search_flags & SEARCH_METHODS)
+ for (int i = 0; i < class_doc.methods.size(); i++) {
+ String method_name = search_flags & SEARCH_CASE_SENSITIVE ? class_doc.methods[i].name : class_doc.methods[i].name.to_lower();
+ if (method_name.find(term) > -1 ||
+ (term.begins_with(".") && method_name.begins_with(term.right(1))) ||
+ (term.ends_with("(") && method_name.ends_with(term.left(term.length() - 1).strip_edges())) ||
+ (term.begins_with(".") && term.ends_with("(") && method_name == term.substr(1, term.length() - 2).strip_edges()))
+ match.methods.push_back(const_cast<DocData::MethodDoc *>(&class_doc.methods[i]));
+ }
+ if (search_flags & SEARCH_SIGNALS)
+ for (int i = 0; i < class_doc.signals.size(); i++)
+ if (_match_string(term, class_doc.signals[i].name))
+ match.signals.push_back(const_cast<DocData::MethodDoc *>(&class_doc.signals[i]));
+ if (search_flags & SEARCH_CONSTANTS)
+ for (int i = 0; i < class_doc.constants.size(); i++)
+ if (_match_string(term, class_doc.constants[i].name))
+ match.constants.push_back(const_cast<DocData::ConstantDoc *>(&class_doc.constants[i]));
+ if (search_flags & SEARCH_PROPERTIES)
+ for (int i = 0; i < class_doc.properties.size(); i++)
+ if (_match_string(term, class_doc.properties[i].name))
+ match.properties.push_back(const_cast<DocData::PropertyDoc *>(&class_doc.properties[i]));
+ if (search_flags & SEARCH_THEME_ITEMS)
+ for (int i = 0; i < class_doc.theme_properties.size(); i++)
+ if (_match_string(term, class_doc.theme_properties[i].name))
+ match.theme_properties.push_back(const_cast<DocData::PropertyDoc *>(&class_doc.theme_properties[i]));
+ }
+
+ iterator_doc = iterator_doc->next();
+ return !iterator_doc;
+}
+
+bool EditorHelpSearch::Runner::_phase_class_items_init() {
+
+ iterator_match = matches.front();
+
+ results_tree->clear();
+ root_item = results_tree->create_item();
+ class_items.clear();
+
+ return true;
+}
+
+bool EditorHelpSearch::Runner::_phase_class_items() {
+
+ ClassMatch &match = iterator_match->value();
+
+ if (search_flags & SEARCH_SHOW_HIERARCHY) {
+ if (match.required())
+ _create_class_hierarchy(match);
+ } else {
+ if (match.name)
+ _create_class_item(root_item, match.doc, false);
+ }
+
+ iterator_match = iterator_match->next();
+ return !iterator_match;
+}
+
+bool EditorHelpSearch::Runner::_phase_member_items_init() {
+
+ iterator_match = matches.front();
+
+ return true;
+}
+
+bool EditorHelpSearch::Runner::_phase_member_items() {
+
+ ClassMatch &match = iterator_match->value();
+
+ TreeItem *parent = search_flags & SEARCH_SHOW_HIERARCHY ? class_items[match.doc->name] : root_item;
+ for (int i = 0; i < match.methods.size(); i++)
+ _create_method_item(parent, match.doc, match.methods[i]);
+ for (int i = 0; i < match.signals.size(); i++)
+ _create_signal_item(parent, match.doc, match.signals[i]);
+ for (int i = 0; i < match.constants.size(); i++)
+ _create_constant_item(parent, match.doc, match.constants[i]);
+ for (int i = 0; i < match.properties.size(); i++)
+ _create_property_item(parent, match.doc, match.properties[i]);
+ for (int i = 0; i < match.theme_properties.size(); i++)
+ _create_theme_property_item(parent, match.doc, match.theme_properties[i]);
+
+ iterator_match = iterator_match->next();
+ return !iterator_match;
+}
+
+bool EditorHelpSearch::Runner::_phase_select_match() {
+
+ if (matched_item)
+ matched_item->select(0);
+ return true;
+}
+
+bool EditorHelpSearch::Runner::_match_string(const String &p_term, const String &p_string) const {
+
+ if (search_flags & SEARCH_CASE_SENSITIVE)
+ return p_string.find(p_term) > -1;
+ else
+ return p_string.findn(p_term) > -1;
+}
+
+void EditorHelpSearch::Runner::_match_item(TreeItem *p_item, const String &p_text) {
+
+ if (!matched_item) {
+ if (search_flags & SEARCH_CASE_SENSITIVE) {
+ if (p_text.casecmp_to(term) == 0)
+ matched_item = p_item;
+ } else {
+ if (p_text.nocasecmp_to(term) == 0)
+ matched_item = p_item;
+ }
+ }
+}
+
+TreeItem *EditorHelpSearch::Runner::_create_class_hierarchy(const ClassMatch &p_match) {
+
+ if (class_items.has(p_match.doc->name))
+ return class_items[p_match.doc->name];
+
+ // Ensure parent nodes are created first.
+ TreeItem *parent = root_item;
+ if (p_match.doc->inherits != "") {
+ if (class_items.has(p_match.doc->inherits)) {
+ parent = class_items[p_match.doc->inherits];
+ } else {
+ ClassMatch &base_match = matches[p_match.doc->inherits];
+ parent = _create_class_hierarchy(base_match);
+ }
+ }
+
+ TreeItem *class_item = _create_class_item(parent, p_match.doc, !p_match.name);
+ class_items[p_match.doc->name] = class_item;
+ return class_item;
+}
+
+TreeItem *EditorHelpSearch::Runner::_create_class_item(TreeItem *p_parent, const DocData::ClassDoc *p_doc, bool p_gray) {
+
+ Ref<Texture> icon = empty_icon;
+ if (ui_service->has_icon(p_doc->name, "EditorIcons"))
+ icon = ui_service->get_icon(p_doc->name, "EditorIcons");
+ else if (ClassDB::class_exists(p_doc->name) && ClassDB::is_parent_class(p_doc->name, "Object"))
+ icon = ui_service->get_icon("Object", "EditorIcons");
+ String tooltip = p_doc->brief_description.strip_edges();
+
+ TreeItem *item = results_tree->create_item(p_parent);
+ item->set_icon(0, icon);
+ item->set_text(0, p_doc->name);
+ item->set_text(1, TTR("Class"));
+ item->set_tooltip(0, tooltip);
+ item->set_tooltip(1, tooltip);
+ item->set_metadata(0, "class_name:" + p_doc->name);
+ if (p_gray) {
+ item->set_custom_color(0, disabled_color);
+ item->set_custom_color(1, disabled_color);
+ }
+
+ _match_item(item, p_doc->name);
+
+ return item;
+}
+
+TreeItem *EditorHelpSearch::Runner::_create_method_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::MethodDoc *p_doc) {
+
+ String tooltip = p_doc->return_type + " " + p_class_doc->name + "." + p_doc->name + "(";
+ for (int i = 0; i < p_doc->arguments.size(); i++) {
+ const DocData::ArgumentDoc &arg = p_doc->arguments[i];
+ tooltip += arg.type + " " + arg.name;
+ if (arg.default_value != "")
+ tooltip += " = " + arg.default_value;
+ if (i < p_doc->arguments.size() - 1)
+ tooltip += ", ";
+ }
+ tooltip += ")";
+ return _create_member_item(p_parent, p_class_doc->name, "MemberMethod", p_doc->name, "Method", "method", tooltip);
+}
+
+TreeItem *EditorHelpSearch::Runner::_create_signal_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::MethodDoc *p_doc) {
+
+ String tooltip = p_doc->return_type + " " + p_class_doc->name + "." + p_doc->name + "(";
+ for (int i = 0; i < p_doc->arguments.size(); i++) {
+ const DocData::ArgumentDoc &arg = p_doc->arguments[i];
+ tooltip += arg.type + " " + arg.name;
+ if (arg.default_value != "")
+ tooltip += " = " + arg.default_value;
+ if (i < p_doc->arguments.size() - 1)
+ tooltip += ", ";
+ }
+ tooltip += ")";
+ return _create_member_item(p_parent, p_class_doc->name, "MemberSignal", p_doc->name, "Signal", "signal", tooltip);
+}
+
+TreeItem *EditorHelpSearch::Runner::_create_constant_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::ConstantDoc *p_doc) {
+
+ String tooltip = p_class_doc->name + "." + p_doc->name;
+ return _create_member_item(p_parent, p_class_doc->name, "MemberConstant", p_doc->name, "Constant", "constant", tooltip);
+}
+
+TreeItem *EditorHelpSearch::Runner::_create_property_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::PropertyDoc *p_doc) {
+
+ String tooltip = p_doc->type + " " + p_class_doc->name + "." + p_doc->name;
+ tooltip += "\n " + p_class_doc->name + "." + p_doc->setter + "(value) setter";
+ tooltip += "\n " + p_class_doc->name + "." + p_doc->getter + "() getter";
+ return _create_member_item(p_parent, p_class_doc->name, "MemberProperty", p_doc->name, "Property", "property", tooltip);
+}
+
+TreeItem *EditorHelpSearch::Runner::_create_theme_property_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::PropertyDoc *p_doc) {
+
+ String tooltip = p_doc->type + " " + p_class_doc->name + "." + p_doc->name;
+ return _create_member_item(p_parent, p_class_doc->name, "MemberTheme", p_doc->name, "Theme Property", "theme_item", tooltip);
+}
+
+TreeItem *EditorHelpSearch::Runner::_create_member_item(TreeItem *p_parent, const String &p_class_name, const String &p_icon, const String &p_name, const String &p_type, const String &p_metatype, const String &p_tooltip) {
+
+ Ref<Texture> icon;
+ String text;
+ if (search_flags & SEARCH_SHOW_HIERARCHY) {
+ icon = ui_service->get_icon(p_icon, "EditorIcons");
+ text = p_name;
+ } else {
+ icon = ui_service->get_icon(p_icon, "EditorIcons");
+ /*// In flat mode, show the class icon.
+ if (ui_service->has_icon(p_class_name, "EditorIcons"))
+ icon = ui_service->get_icon(p_class_name, "EditorIcons");
+ else if (ClassDB::is_parent_class(p_class_name, "Object"))
+ icon = ui_service->get_icon("Object", "EditorIcons");*/
+ text = p_class_name + "." + p_name;
+ }
+
+ TreeItem *item = results_tree->create_item(p_parent);
+ item->set_icon(0, icon);
+ item->set_text(0, text);
+ item->set_text(1, TTR(p_type));
+ item->set_tooltip(0, p_tooltip);
+ item->set_tooltip(1, p_tooltip);
+ item->set_metadata(0, "class_" + p_metatype + ":" + p_class_name + ":" + p_name);
+
+ _match_item(item, p_name);
+
+ return item;
+}
+
+bool EditorHelpSearch::Runner::work(uint64_t slot) {
+
+ // Return true when the search has been completed, otherwise false.
+ const uint64_t until = OS::get_singleton()->get_ticks_usec() + slot;
+ while (!_slice())
+ if (OS::get_singleton()->get_ticks_usec() > until)
+ return false;
+ return true;
+}
+
+EditorHelpSearch::Runner::Runner(Control *p_icon_service, Tree *p_results_tree, const String &p_term, int p_search_flags) :
+ phase(0),
+ ui_service(p_icon_service),
+ results_tree(p_results_tree),
+ term((p_search_flags & SEARCH_CASE_SENSITIVE) == 0 ? p_term.strip_edges().to_lower() : p_term.strip_edges()),
+ search_flags(p_search_flags),
+ empty_icon(ui_service->get_icon("ArrowRight", "EditorIcons")),
+ disabled_color(ui_service->get_color("disabled_font_color", "Editor")) {
+}
diff --git a/editor/editor_help_search.h b/editor/editor_help_search.h
new file mode 100644
index 0000000000..e74bfdc5b6
--- /dev/null
+++ b/editor/editor_help_search.h
@@ -0,0 +1,155 @@
+/*************************************************************************/
+/* editor_help_search.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef EDITOR_HELP_SEARCH_H
+#define EDITOR_HELP_SEARCH_H
+
+#include "core/ordered_hash_map.h"
+#include "editor/code_editor.h"
+#include "editor/editor_help.h"
+#include "editor/editor_plugin.h"
+#include "scene/gui/option_button.h"
+#include "scene/gui/tree.h"
+
+class EditorHelpSearch : public ConfirmationDialog {
+ GDCLASS(EditorHelpSearch, ConfirmationDialog);
+
+ enum SearchFlags {
+ SEARCH_CLASSES = 1 << 0,
+ SEARCH_METHODS = 1 << 1,
+ SEARCH_SIGNALS = 1 << 2,
+ SEARCH_CONSTANTS = 1 << 3,
+ SEARCH_PROPERTIES = 1 << 4,
+ SEARCH_THEME_ITEMS = 1 << 5,
+ SEARCH_ALL = SEARCH_CLASSES | SEARCH_METHODS | SEARCH_SIGNALS | SEARCH_CONSTANTS | SEARCH_PROPERTIES | SEARCH_THEME_ITEMS,
+ SEARCH_CASE_SENSITIVE = 1 << 29,
+ SEARCH_SHOW_HIERARCHY = 1 << 30
+ };
+
+ LineEdit *search_box;
+ ToolButton *case_sensitive_button;
+ ToolButton *hierarchy_button;
+ OptionButton *filter_combo;
+ Tree *results_tree;
+ bool old_search;
+
+ class Runner;
+ Ref<Runner> search;
+
+ void _update_icons();
+ void _load_settings();
+ void _update_results();
+
+ void _search_box_gui_input(const Ref<InputEvent> &p_event);
+ void _search_box_text_changed(const String &p_text);
+ void _filter_combo_item_selected(int p_option);
+ void _confirmed();
+
+protected:
+ void _notification(int p_what);
+ static void _bind_methods();
+
+public:
+ void popup_dialog();
+ void popup_dialog(const String &p_term);
+
+ EditorHelpSearch();
+};
+
+class EditorHelpSearch::Runner : public Reference {
+
+ enum Phase {
+ PHASE_MATCH_CLASSES_INIT,
+ PHASE_MATCH_CLASSES,
+ PHASE_CLASS_ITEMS_INIT,
+ PHASE_CLASS_ITEMS,
+ PHASE_MEMBER_ITEMS_INIT,
+ PHASE_MEMBER_ITEMS,
+ PHASE_SELECT_MATCH,
+ PHASE_MAX
+ };
+ int phase;
+
+ struct ClassMatch {
+ DocData::ClassDoc *doc;
+ bool name;
+ Vector<DocData::MethodDoc *> methods;
+ Vector<DocData::MethodDoc *> signals;
+ Vector<DocData::ConstantDoc *> constants;
+ Vector<DocData::PropertyDoc *> properties;
+ Vector<DocData::PropertyDoc *> theme_properties;
+
+ bool required() {
+ return name || methods.size() || signals.size() || constants.size() || properties.size() || theme_properties.size();
+ }
+ };
+
+ Control *ui_service;
+ Tree *results_tree;
+ String term;
+ int search_flags;
+
+ Ref<Texture> empty_icon;
+ Color disabled_color;
+
+ Map<String, DocData::ClassDoc>::Element *iterator_doc;
+ Map<String, ClassMatch> matches;
+ Map<String, ClassMatch>::Element *iterator_match;
+ TreeItem *root_item;
+ Map<String, TreeItem *> class_items;
+ TreeItem *matched_item;
+
+ bool _slice();
+ bool _phase_match_classes_init();
+ bool _phase_match_classes();
+ bool _phase_class_items_init();
+ bool _phase_class_items();
+ bool _phase_member_items_init();
+ bool _phase_member_items();
+ bool _phase_select_match();
+
+ bool _match_string(const String &p_term, const String &p_string) const;
+ void _match_item(TreeItem *p_item, const String &p_text);
+ TreeItem *_create_class_hierarchy(const ClassMatch &p_match);
+ TreeItem *_create_class_item(TreeItem *p_parent, const DocData::ClassDoc *p_doc, bool p_gray);
+ TreeItem *_create_method_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::MethodDoc *p_doc);
+ TreeItem *_create_signal_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::MethodDoc *p_doc);
+ TreeItem *_create_constant_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::ConstantDoc *p_doc);
+ TreeItem *_create_property_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::PropertyDoc *p_doc);
+ TreeItem *_create_theme_property_item(TreeItem *p_parent, const DocData::ClassDoc *p_class_doc, const DocData::PropertyDoc *p_doc);
+ TreeItem *_create_member_item(TreeItem *p_parent, const String &p_class_name, const String &p_icon, const String &p_name, const String &p_type, const String &p_metatype, const String &p_tooltip);
+
+public:
+ bool work(uint64_t slot = 100000);
+
+ Runner(Control *p_icon_service, Tree *p_results_tree, const String &p_term, int p_search_flags);
+};
+
+#endif // EDITOR_HELP_SEARCH_H
diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp
index 1b75d2eddf..2ced5fe106 100644
--- a/editor/editor_inspector.cpp
+++ b/editor/editor_inspector.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -128,18 +128,22 @@ void EditorProperty::_notification(int p_what) {
bottom_rect = Rect2(m, rect.size.height + get_constant("vseparation", "Tree"), size.width - m, bottom_editor->get_combined_minimum_size().height);
}
- }
- if (keying) {
- Ref<Texture> key;
+ if (keying) {
+ Ref<Texture> key;
- if (use_keying_next()) {
- key = get_icon("KeyNext", "EditorIcons");
- } else {
- key = get_icon("Key", "EditorIcons");
- }
+ if (use_keying_next()) {
+ key = get_icon("KeyNext", "EditorIcons");
+ } else {
+ key = get_icon("Key", "EditorIcons");
+ }
+
+ rect.size.x -= key->get_width() + get_constant("hseparator", "Tree");
- rect.size.x -= key->get_width() + get_constant("hseparator", "Tree");
+ if (no_children) {
+ text_size -= key->get_width() + 4 * EDSCALE;
+ }
+ }
}
//set children
@@ -297,16 +301,12 @@ bool EditorProperty::is_read_only() const {
return read_only;
}
-bool EditorProperty::_might_be_in_instance() {
-
- if (!object)
- return false;
-
- Node *node = Object::cast_to<Node>(object);
+bool EditorPropertyRevert::may_node_be_in_instance(Node *p_node) {
Node *edited_scene = EditorNode::get_singleton()->get_edited_scene();
bool might_be = false;
+ Node *node = p_node;
while (node) {
@@ -328,13 +328,9 @@ bool EditorProperty::_might_be_in_instance() {
return might_be; // or might not be
}
-bool EditorProperty::_get_instanced_node_original_property(const StringName &p_prop, Variant &value) {
-
- Node *node = Object::cast_to<Node>(object);
-
- if (!node)
- return false;
+bool EditorPropertyRevert::get_instanced_node_original_property(Node *p_node, const StringName &p_prop, Variant &value) {
+ Node *node = p_node;
Node *orig = node;
Node *edited_scene = EditorNode::get_singleton()->get_edited_scene();
@@ -376,7 +372,7 @@ bool EditorProperty::_get_instanced_node_original_property(const StringName &p_p
if (!found) {
//if not found, try default class value
- Variant attempt = ClassDB::class_get_default_property_value(object->get_class_name(), property);
+ Variant attempt = ClassDB::class_get_default_property_value(node->get_class_name(), p_prop);
if (attempt.get_type() != Variant::NIL) {
found = true;
value = attempt;
@@ -386,14 +382,14 @@ bool EditorProperty::_get_instanced_node_original_property(const StringName &p_p
return found;
}
-bool EditorProperty::_is_property_different(const Variant &p_current, const Variant &p_orig) {
+bool EditorPropertyRevert::is_node_property_different(Node *p_node, const Variant &p_current, const Variant &p_orig) {
// this is a pretty difficult function, because a property may not be saved but may have
// the flag to not save if one or if zero
//make sure there is an actual state
{
- Node *node = Object::cast_to<Node>(object);
+ Node *node = p_node;
if (!node)
return false;
@@ -435,46 +431,55 @@ bool EditorProperty::_is_property_different(const Variant &p_current, const Vari
return bool(Variant::evaluate(Variant::OP_NOT_EQUAL, p_current, p_orig));
}
-void EditorProperty::update_reload_status() {
+bool EditorPropertyRevert::can_property_revert(Object *p_object, const StringName &p_property) {
- if (property == StringName())
- return; //no property, so nothing to do
+ bool has_revert = false;
- bool has_reload = false;
+ Node *node = Object::cast_to<Node>(p_object);
- if (_might_be_in_instance()) {
+ if (node && EditorPropertyRevert::may_node_be_in_instance(node)) {
//check for difference including instantiation
Variant vorig;
- if (_get_instanced_node_original_property(property, vorig)) {
- Variant v = object->get(property);
+ if (EditorPropertyRevert::get_instanced_node_original_property(node, p_property, vorig)) {
+ Variant v = p_object->get(p_property);
- if (_is_property_different(v, vorig)) {
- has_reload = true;
+ if (EditorPropertyRevert::is_node_property_different(node, v, vorig)) {
+ has_revert = true;
}
}
} else {
//check for difference against default class value instead
- Variant default_value = ClassDB::class_get_default_property_value(object->get_class_name(), property);
- if (default_value != Variant() && default_value != object->get(property)) {
- has_reload = true;
+ Variant default_value = ClassDB::class_get_default_property_value(p_object->get_class_name(), p_property);
+ if (default_value != Variant() && default_value != p_object->get(p_property)) {
+ has_revert = true;
}
}
- if (object->call("property_can_revert", property).operator bool()) {
+ if (p_object->call("property_can_revert", p_property).operator bool()) {
- has_reload = true;
+ has_revert = true;
}
- if (!has_reload && !object->get_script().is_null()) {
- Ref<Script> scr = object->get_script();
+ if (!has_revert && !p_object->get_script().is_null()) {
+ Ref<Script> scr = p_object->get_script();
Variant orig_value;
- if (scr->get_property_default_value(property, orig_value)) {
- if (orig_value != object->get(property)) {
- has_reload = true;
+ if (scr->get_property_default_value(p_property, orig_value)) {
+ if (orig_value != p_object->get(p_property)) {
+ has_revert = true;
}
}
}
+ return has_revert;
+}
+
+void EditorProperty::update_reload_status() {
+
+ if (property == StringName())
+ return; //no property, so nothing to do
+
+ bool has_reload = EditorPropertyRevert::can_property_revert(object, property);
+
if (has_reload != can_revert) {
can_revert = has_reload;
update();
@@ -638,7 +643,8 @@ void EditorProperty::_gui_input(const Ref<InputEvent> &p_event) {
Variant vorig;
- if (_might_be_in_instance() && _get_instanced_node_original_property(property, vorig)) {
+ Node *node = Object::cast_to<Node>(object);
+ if (node && EditorPropertyRevert::may_node_be_in_instance(node) && EditorPropertyRevert::get_instanced_node_original_property(node, property, vorig)) {
emit_signal("property_changed", property, vorig.duplicate(true));
update_property();
@@ -1380,28 +1386,6 @@ void EditorInspector::update_tree() {
// TreeItem *current_category = NULL;
- bool unfold_if_edited = false;
-
- if (use_folding && auto_unfold_edited && get_tree()->get_edited_scene_root()) {
- String path;
- Node *node = Object::cast_to<Node>(object);
- if (node) {
- path = get_tree()->get_edited_scene_root()->get_filename();
- }
- Resource *res = Object::cast_to<Resource>(object);
- if (res) {
- if (res->get_path().is_resource_file()) {
- path = res->get_path();
- } else if (res->get_path().begins_with("res://")) { //internal resource
- path = get_tree()->get_edited_scene_root()->get_filename();
- }
- }
-
- if (!EditorNode::get_singleton()->get_editor_folding().has_folding_data(path)) {
- unfold_if_edited = true;
- }
- }
-
String filter = search_box ? search_box->get_text() : "";
String group;
String group_base;
@@ -1721,13 +1705,6 @@ void EditorInspector::update_tree() {
if (current_selected && ep->property == current_selected) {
ep->select(current_focusable);
}
-
- if (unfold_if_edited && ep->can_revert_to_default()) {
- //if edited and there is a parent section, unfold it.
- if (current_vbox && section_map.has(current_vbox)) {
- section_map[current_vbox]->unfold();
- }
- }
}
}
@@ -1964,10 +1941,6 @@ void EditorInspector::_edit_set(const String &p_name, const Variant &p_value, bo
Resource *r = Object::cast_to<Resource>(object);
if (r) {
- if (!r->is_edited() && String(p_name) != "resource/edited") {
- undo_redo->add_do_method(r, "set_edited", true);
- undo_redo->add_undo_method(r, "set_edited", false);
- }
if (String(p_name) == "resource_local_to_scene") {
bool prev = object->get(p_name);
@@ -2224,10 +2197,6 @@ String EditorInspector::get_object_class() const {
return object_class;
}
-void EditorInspector::set_auto_unfold_edited(bool p_enable) {
- auto_unfold_edited = p_enable;
-}
-
void EditorInspector::_bind_methods() {
ClassDB::bind_method("_property_changed", &EditorInspector::_property_changed, DEFVAL(""), DEFVAL(false));
@@ -2284,7 +2253,6 @@ EditorInspector::EditorInspector() {
set_process(true);
property_focusable = -1;
use_sub_inspector_bg = false;
- auto_unfold_edited = false;
get_v_scrollbar()->connect("value_changed", this, "_vscroll_changed");
update_scroll_request = -1;
diff --git a/editor/editor_inspector.h b/editor/editor_inspector.h
index 0af39e62fe..835671c9a8 100644
--- a/editor/editor_inspector.h
+++ b/editor/editor_inspector.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -37,6 +37,15 @@
class UndoRedo;
+class EditorPropertyRevert {
+public:
+ static bool may_node_be_in_instance(Node *p_node);
+ static bool get_instanced_node_original_property(Node *p_node, const StringName &p_prop, Variant &value);
+ static bool is_node_property_different(Node *p_node, const Variant &p_current, const Variant &p_orig);
+
+ static bool can_property_revert(Object *p_object, const StringName &p_property);
+};
+
class EditorProperty : public Container {
GDCLASS(EditorProperty, Container)
@@ -70,7 +79,6 @@ private:
bool use_folding;
bool draw_top_bg;
- bool _might_be_in_instance();
bool _is_property_different(const Variant &p_current, const Variant &p_orig);
bool _get_instanced_node_original_property(const StringName &p_prop, Variant &value);
void _focusable_focused(int p_index);
@@ -272,7 +280,6 @@ class EditorInspector : public ScrollContainer {
bool read_only;
bool keying;
bool use_sub_inspector_bg;
- bool auto_unfold_edited;
float refresh_countdown;
bool update_tree_pending;
@@ -367,7 +374,6 @@ public:
String get_object_class() const;
void set_use_sub_inspector_bg(bool p_enable);
- void set_auto_unfold_edited(bool p_enable);
EditorInspector();
};
diff --git a/editor/editor_log.cpp b/editor/editor_log.cpp
index 5f5c46f4a7..803d7e10f7 100644
--- a/editor/editor_log.cpp
+++ b/editor/editor_log.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -155,7 +155,7 @@ EditorLog::EditorLog() {
log->set_v_size_flags(SIZE_EXPAND_FILL);
log->set_h_size_flags(SIZE_EXPAND_FILL);
vb->add_child(log);
- add_message(VERSION_FULL_NAME " (c) 2007-2018 Juan Linietsky, Ariel Manzur & Godot Contributors.");
+ add_message(VERSION_FULL_NAME " (c) 2007-2019 Juan Linietsky, Ariel Manzur & Godot Contributors.");
eh.errfunc = _error_handler;
eh.userdata = this;
diff --git a/editor/editor_log.h b/editor/editor_log.h
index 78a5671d29..13318fd68f 100644
--- a/editor/editor_log.h
+++ b/editor/editor_log.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_name_dialog.cpp b/editor/editor_name_dialog.cpp
index 1ef61802c4..63a91a594c 100644
--- a/editor/editor_name_dialog.cpp
+++ b/editor/editor_name_dialog.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_name_dialog.h b/editor/editor_name_dialog.h
index e8a3da57ca..314fc27124 100644
--- a/editor/editor_name_dialog.h
+++ b/editor/editor_name_dialog.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp
index dbbf5d08b8..719130621e 100644
--- a/editor/editor_node.cpp
+++ b/editor/editor_node.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -384,7 +384,6 @@ void EditorNode::_notification(int p_what) {
update_menu->set_icon(gui_base->get_icon("Progress1", "EditorIcons"));
PopupMenu *p = help_menu->get_popup();
- p->set_item_icon(p->get_item_index(HELP_CLASSES), gui_base->get_icon("ClassList", "EditorIcons"));
p->set_item_icon(p->get_item_index(HELP_SEARCH), gui_base->get_icon("HelpSearch", "EditorIcons"));
p->set_item_icon(p->get_item_index(HELP_DOCS), gui_base->get_icon("Instance", "EditorIcons"));
p->set_item_icon(p->get_item_index(HELP_QA), gui_base->get_icon("Instance", "EditorIcons"));
@@ -410,51 +409,50 @@ void EditorNode::_on_plugin_ready(Object *p_script, const String &p_activate_nam
push_item(script.operator->());
}
-void EditorNode::_fs_changed() {
+void EditorNode::_resources_changed(const PoolVector<String> &p_resources) {
- for (Set<FileDialog *>::Element *E = file_dialogs.front(); E; E = E->next()) {
+ List<Ref<Resource> > changed;
- E->get()->invalidate();
- }
+ int rc = p_resources.size();
+ for (int i = 0; i < rc; i++) {
- for (Set<EditorFileDialog *>::Element *E = editor_file_dialogs.front(); E; E = E->next()) {
+ Ref<Resource> res(ResourceCache::get(p_resources.get(i)));
+ if (res.is_null()) {
+ continue;
+ }
- E->get()->invalidate();
- }
+ if (!res->editor_can_reload_from_file())
+ continue;
+ if (!res->get_path().is_resource_file() && !res->get_path().is_abs_path())
+ continue;
+ if (!FileAccess::exists(res->get_path()))
+ continue;
- {
- //reload changed resources
- List<Ref<Resource> > changed;
+ if (res->get_import_path() != String()) {
+ //this is an imported resource, will be reloaded if reimported via the _resources_reimported() callback
+ continue;
+ }
- List<Ref<Resource> > cached;
- ResourceCache::get_cached_resources(&cached);
- // FIXME: This should be done in a thread.
- for (List<Ref<Resource> >::Element *E = cached.front(); E; E = E->next()) {
+ changed.push_back(res);
+ }
- if (!E->get()->editor_can_reload_from_file())
- continue;
- if (!E->get()->get_path().is_resource_file() && !E->get()->get_path().is_abs_path())
- continue;
- if (!FileAccess::exists(E->get()->get_path()))
- continue;
+ if (changed.size()) {
+ for (List<Ref<Resource> >::Element *E = changed.front(); E; E = E->next()) {
+ E->get()->reload_from_file();
+ }
+ }
+}
- if (E->get()->get_import_path() != String()) {
- //this is an imported resource, will be reloaded if reimported via the _resources_reimported() callback
- continue;
- }
+void EditorNode::_fs_changed() {
- uint64_t mt = FileAccess::get_modified_time(E->get()->get_path());
+ for (Set<FileDialog *>::Element *E = file_dialogs.front(); E; E = E->next()) {
- if (mt != E->get()->get_last_modified_time()) {
- changed.push_back(E->get());
- }
- }
+ E->get()->invalidate();
+ }
- if (changed.size()) {
- for (List<Ref<Resource> >::Element *E = changed.front(); E; E = E->next()) {
- E->get()->reload_from_file();
- }
- }
+ for (Set<EditorFileDialog *>::Element *E = editor_file_dialogs.front(); E; E = E->next()) {
+
+ E->get()->invalidate();
}
_mark_unsaved_scenes();
@@ -496,7 +494,7 @@ void EditorNode::_fs_changed() {
}
}
- get_tree()->quit();
+ _exit_editor();
}
}
@@ -637,6 +635,7 @@ void EditorNode::save_resource(const Ref<Resource> &p_resource) {
void EditorNode::save_resource_as(const Ref<Resource> &p_resource, const String &p_at_path) {
file->set_mode(EditorFileDialog::MODE_SAVE_FILE);
+ saving_resource = p_resource;
current_option = RESOURCE_SAVE_AS;
List<String> extensions;
@@ -1000,6 +999,22 @@ void EditorNode::_save_scene_with_preview(String p_file, int p_idx) {
EditorResourcePreview::get_singleton()->check_for_invalidation(p_file);
}
+bool EditorNode::_validate_scene_recursive(const String &p_filename, Node *p_node) {
+
+ for (int i = 0; i < p_node->get_child_count(); i++) {
+ Node *child = p_node->get_child(i);
+ if (child->get_filename() == p_filename) {
+ return true;
+ }
+
+ if (_validate_scene_recursive(p_filename, child)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
void EditorNode::_save_scene(String p_file, int idx) {
Node *scene = editor_data.get_edited_scene_root(idx);
@@ -1010,6 +1025,11 @@ void EditorNode::_save_scene(String p_file, int idx) {
return;
}
+ if (scene->get_filename() != String() && _validate_scene_recursive(scene->get_filename(), scene)) {
+ show_accept(TTR("This scene can't be saved because there is a cyclic instancing inclusion.\nPlease resolve it and then attempt to save again."), TTR("OK"));
+ return;
+ }
+
editor_data.apply_changes_in_editors();
_save_default_environment();
@@ -1100,7 +1120,7 @@ void EditorNode::save_all_scenes_and_restart() {
to_reopen = get_tree()->get_edited_scene_root()->get_filename();
}
- get_tree()->quit();
+ _exit_editor();
String exec = OS::get_singleton()->get_executable_path();
List<String> args;
@@ -1263,15 +1283,13 @@ void EditorNode::_dialog_action(String p_file) {
case RESOURCE_SAVE:
case RESOURCE_SAVE_AS: {
- uint32_t current = editor_history.get_current();
+ ERR_FAIL_COND(saving_resource.is_null())
+ save_resource_in_path(saving_resource, p_file);
+ saving_resource = Ref<Resource>();
+ ObjectID current = editor_history.get_current();
Object *current_obj = current > 0 ? ObjectDB::get_instance(current) : NULL;
-
- ERR_FAIL_COND(!Object::cast_to<Resource>(current_obj))
-
- RES current_res = RES(Object::cast_to<Resource>(current_obj));
-
- save_resource_in_path(current_res, p_file);
-
+ ERR_FAIL_COND(!current_obj);
+ current_obj->_change_notify();
} break;
case SETTINGS_LAYOUT_SAVE: {
@@ -2003,7 +2021,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
if (err != OK)
ERR_PRINT("Failed to load scene");
editor_data.move_edited_scene_to_index(cur_idx);
- get_undo_redo()->clear_history();
+ get_undo_redo()->clear_history(false);
scene_tabs->set_current_tab(cur_idx);
} break;
@@ -2263,9 +2281,6 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
file->popup_centered_ratio();
} break;
- case HELP_CLASSES: {
- emit_signal("request_help_index", "");
- } break;
case HELP_SEARCH: {
emit_signal("request_help_search", "");
} break;
@@ -2341,6 +2356,12 @@ int EditorNode::_next_unsaved_scene(bool p_valid_filename, int p_start) {
return -1;
}
+void EditorNode::_exit_editor() {
+ exiting = true;
+ resource_preview->stop(); //stop early to avoid crashes
+ get_tree()->quit();
+}
+
void EditorNode::_discard_changes(const String &p_str) {
switch (current_option) {
@@ -2368,14 +2389,13 @@ void EditorNode::_discard_changes(const String &p_str) {
case FILE_QUIT: {
_menu_option_confirm(RUN_STOP, true);
- exiting = true;
- get_tree()->quit();
+ _exit_editor();
+
} break;
case RUN_PROJECT_MANAGER: {
_menu_option_confirm(RUN_STOP, true);
- exiting = true;
- get_tree()->quit();
+ _exit_editor();
String exec = OS::get_singleton()->get_executable_path();
List<String> args;
@@ -2456,7 +2476,7 @@ void EditorNode::_editor_select(int p_which) {
}
}
-void EditorNode::add_editor_plugin(EditorPlugin *p_editor) {
+void EditorNode::add_editor_plugin(EditorPlugin *p_editor, bool p_config_changed) {
if (p_editor->has_main_screen()) {
@@ -2481,9 +2501,11 @@ void EditorNode::add_editor_plugin(EditorPlugin *p_editor) {
}
singleton->editor_data.add_editor_plugin(p_editor);
singleton->add_child(p_editor);
+ if (p_config_changed)
+ p_editor->enable_plugin();
}
-void EditorNode::remove_editor_plugin(EditorPlugin *p_editor) {
+void EditorNode::remove_editor_plugin(EditorPlugin *p_editor, bool p_config_changed) {
if (p_editor->has_main_screen()) {
@@ -2506,6 +2528,8 @@ void EditorNode::remove_editor_plugin(EditorPlugin *p_editor) {
}
p_editor->make_visible(false);
p_editor->clear();
+ if (p_config_changed)
+ p_editor->disable_plugin();
singleton->editor_plugins_over->get_plugins_list().erase(p_editor);
singleton->remove_child(p_editor);
singleton->editor_data.remove_editor_plugin(p_editor);
@@ -2531,7 +2555,7 @@ void EditorNode::_update_addon_config() {
project_settings->queue_save();
}
-void EditorNode::set_addon_plugin_enabled(const String &p_addon, bool p_enabled) {
+void EditorNode::set_addon_plugin_enabled(const String &p_addon, bool p_enabled, bool p_config_changed) {
ERR_FAIL_COND(p_enabled && plugin_addons.has(p_addon));
ERR_FAIL_COND(!p_enabled && !plugin_addons.has(p_addon));
@@ -2539,7 +2563,7 @@ void EditorNode::set_addon_plugin_enabled(const String &p_addon, bool p_enabled)
if (!p_enabled) {
EditorPlugin *addon = plugin_addons[p_addon];
- remove_editor_plugin(addon);
+ remove_editor_plugin(addon, p_config_changed);
memdelete(addon); //bye
plugin_addons.erase(p_addon);
_update_addon_config();
@@ -2570,6 +2594,12 @@ void EditorNode::set_addon_plugin_enabled(const String &p_addon, bool p_enabled)
return;
}
+ //errors in the script cause the base_type to be ""
+ if (String(script->get_instance_base_type()) == "") {
+ show_warning(vformat(TTR("Unable to load addon script from path: '%s' There seems to be an error in the code, please check the syntax."), path));
+ return;
+ }
+
//could check inheritance..
if (String(script->get_instance_base_type()) != "EditorPlugin") {
show_warning(vformat(TTR("Unable to load addon script from path: '%s' Base type is not EditorPlugin."), path));
@@ -2585,7 +2615,7 @@ void EditorNode::set_addon_plugin_enabled(const String &p_addon, bool p_enabled)
ep->set_script(script.get_ref_ptr());
ep->set_dir_cache(p_addon);
plugin_addons[p_addon] = ep;
- add_editor_plugin(ep);
+ add_editor_plugin(ep, p_config_changed);
_update_addon_config();
}
@@ -2613,7 +2643,7 @@ void EditorNode::_remove_edited_scene() {
}
_scene_tab_changed(new_index);
editor_data.remove_scene(old_index);
- editor_data.get_undo_redo().clear_history();
+ editor_data.get_undo_redo().clear_history(false);
_update_title();
_update_scene_tabs();
}
@@ -2926,7 +2956,12 @@ Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, b
_update_scene_tabs();
_add_to_recent_scenes(lpath);
- editor_folding.load_scene_folding(new_scene, lpath);
+ if (editor_folding.has_folding_data(lpath)) {
+ editor_folding.load_scene_folding(new_scene, lpath);
+ } else if (EDITOR_GET("interface/inspector/auto_unfold_foreign_scenes")) {
+ editor_folding.unfold_scene(new_scene);
+ editor_folding.save_scene_folding(new_scene, lpath);
+ }
prev_scene->set_disabled(previous_scenes.size() == 0);
opening_prev = false;
@@ -3105,6 +3140,9 @@ bool EditorNode::is_scene_in_use(const String &p_path) {
void EditorNode::register_editor_types() {
+ ResourceLoader::set_timestamp_on_load(true);
+ ResourceSaver::set_timestamp_on_save(true);
+
ClassDB::register_class<EditorPlugin>();
ClassDB::register_class<EditorImportPlugin>();
ClassDB::register_class<EditorScript>();
@@ -3112,6 +3150,7 @@ void EditorNode::register_editor_types() {
ClassDB::register_class<EditorFileDialog>();
ClassDB::register_virtual_class<EditorSettings>();
ClassDB::register_class<EditorSpatialGizmo>();
+ ClassDB::register_class<EditorSpatialGizmoPlugin>();
ClassDB::register_virtual_class<EditorResourcePreview>();
ClassDB::register_class<EditorResourcePreviewGenerator>();
ClassDB::register_virtual_class<EditorFileSystem>();
@@ -3223,17 +3262,31 @@ Ref<Texture> EditorNode::get_class_icon(const String &p_class, const String &p_f
void EditorNode::progress_add_task(const String &p_task, const String &p_label, int p_steps, bool p_can_cancel) {
- singleton->progress_dialog->add_task(p_task, p_label, p_steps, p_can_cancel);
+ if (singleton->disable_progress_dialog) {
+ print_line(p_task + ": begin: " + p_label + " steps: " + itos(p_steps));
+ } else {
+ singleton->progress_dialog->add_task(p_task, p_label, p_steps, p_can_cancel);
+ }
}
bool EditorNode::progress_task_step(const String &p_task, const String &p_state, int p_step, bool p_force_refresh) {
- return singleton->progress_dialog->task_step(p_task, p_state, p_step, p_force_refresh);
+ if (singleton->disable_progress_dialog) {
+ print_line("\t" + p_task + ": step " + itos(p_step) + ": " + p_state);
+ return false;
+ } else {
+
+ return singleton->progress_dialog->task_step(p_task, p_state, p_step, p_force_refresh);
+ }
}
void EditorNode::progress_end_task(const String &p_task) {
- singleton->progress_dialog->end_task(p_task);
+ if (singleton->disable_progress_dialog) {
+ print_line(p_task + ": end");
+ } else {
+ singleton->progress_dialog->end_task(p_task);
+ }
}
void EditorNode::progress_add_task_bg(const String &p_task, const String &p_label, int p_steps) {
@@ -3315,7 +3368,7 @@ Error EditorNode::export_preset(const String &p_preset, const String &p_path, bo
export_defer.path = p_path;
export_defer.debug = p_debug;
export_defer.password = p_password;
-
+ disable_progress_dialog = true;
return OK;
}
@@ -3605,6 +3658,7 @@ void EditorNode::_load_docks() {
_load_docks_from_config(config, "docks");
_load_open_scenes_from_config(config, "EditorNode");
+
editor_data.set_plugin_window_layout(config);
}
@@ -3799,6 +3853,23 @@ void EditorNode::_load_open_scenes_from_config(Ref<ConfigFile> p_layout, const S
restoring_scenes = false;
}
+bool EditorNode::has_scenes_in_session() {
+ if (!bool(EDITOR_GET("interface/scene_tabs/restore_scenes_on_load"))) {
+ return false;
+ }
+ Ref<ConfigFile> config;
+ config.instance();
+ Error err = config->load(EditorSettings::get_singleton()->get_project_settings_dir().plus_file("editor_layout.cfg"));
+ if (err != OK) {
+ return false;
+ }
+ if (!config->has_section("EditorNode") || !config->has_section_key("EditorNode", "open_scenes")) {
+ return false;
+ }
+ Array scenes = config->get_value("EditorNode", "open_scenes");
+ return !scenes.empty();
+}
+
void EditorNode::_update_layouts_menu() {
editor_layouts->clear();
@@ -4588,6 +4659,8 @@ void EditorNode::_bind_methods() {
ClassDB::bind_method("edit_node", &EditorNode::edit_node);
ClassDB::bind_method("_unhandled_input", &EditorNode::_unhandled_input);
+ ClassDB::bind_method(D_METHOD("push_item", "object", "property", "inspector_only"), &EditorNode::push_item, DEFVAL(""), DEFVAL(false));
+
ClassDB::bind_method("_get_scene_metadata", &EditorNode::_get_scene_metadata);
ClassDB::bind_method("set_edited_scene", &EditorNode::set_edited_scene);
ClassDB::bind_method("open_request", &EditorNode::open_request);
@@ -4651,11 +4724,12 @@ void EditorNode::_bind_methods() {
ClassDB::bind_method(D_METHOD("_video_driver_selected"), &EditorNode::_video_driver_selected);
+ ClassDB::bind_method(D_METHOD("_resources_changed"), &EditorNode::_resources_changed);
+
ADD_SIGNAL(MethodInfo("play_pressed"));
ADD_SIGNAL(MethodInfo("pause_pressed"));
ADD_SIGNAL(MethodInfo("stop_pressed"));
ADD_SIGNAL(MethodInfo("request_help_search"));
- ADD_SIGNAL(MethodInfo("request_help_index"));
ADD_SIGNAL(MethodInfo("script_add_function_request", PropertyInfo(Variant::OBJECT, "obj"), PropertyInfo(Variant::STRING, "function"), PropertyInfo(Variant::POOL_STRING_ARRAY, "args")));
ADD_SIGNAL(MethodInfo("resource_saved", PropertyInfo(Variant::OBJECT, "obj")));
}
@@ -4704,7 +4778,7 @@ EditorNode::EditorNode() {
_initializing_addons = false;
docks_visible = true;
restoring_scenes = false;
-
+ disable_progress_dialog = false;
scene_distraction = false;
script_distraction = false;
@@ -4763,9 +4837,6 @@ EditorNode::EditorNode() {
ResourceLoader::set_error_notify_func(this, _load_error_notify);
ResourceLoader::set_dependency_error_notify_func(this, _dependency_error_report);
- ResourceLoader::set_timestamp_on_load(true);
- ResourceSaver::set_timestamp_on_save(true);
-
{ //register importers at the beginning, so dialogs are created with the right extensions
Ref<ResourceImporterTexture> import_texture;
import_texture.instance();
@@ -4877,7 +4948,7 @@ EditorNode::EditorNode() {
EDITOR_DEF_RST("interface/scene_tabs/show_thumbnail_on_hover", true);
EDITOR_DEF_RST("interface/inspector/capitalize_properties", true);
EDITOR_DEF_RST("interface/inspector/disable_folding", false);
- EDITOR_DEF_RST("interface/inspector/auto_unfold_edited", true);
+ EDITOR_DEF_RST("interface/inspector/auto_unfold_foreign_scenes", true);
EDITOR_DEF("interface/inspector/horizontal_vector2_editing", false);
EDITOR_DEF("interface/inspector/horizontal_vector_types_editing", true);
EDITOR_DEF("interface/inspector/open_resources_in_current_inspector", true);
@@ -5128,14 +5199,9 @@ EditorNode::EditorNode() {
top_region->add_child(left_menu_hb);
menu_hb->add_child(top_region);
- {
- Control *sp = memnew(Control);
- sp->set_custom_minimum_size(Size2(30, 0) * EDSCALE);
- menu_hb->add_child(sp);
- }
-
file_menu = memnew(MenuButton);
file_menu->set_flat(false);
+ file_menu->set_switch_on_hover(true);
file_menu->set_text(TTR("Scene"));
file_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles"));
left_menu_hb->add_child(file_menu);
@@ -5227,6 +5293,7 @@ EditorNode::EditorNode() {
project_menu = memnew(MenuButton);
project_menu->set_flat(false);
+ project_menu->set_switch_on_hover(true);
project_menu->set_tooltip(TTR("Miscellaneous project or scene-wide tools."));
project_menu->set_text(TTR("Project"));
project_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles"));
@@ -5268,6 +5335,7 @@ EditorNode::EditorNode() {
debug_menu = memnew(MenuButton);
debug_menu->set_flat(false);
+ debug_menu->set_switch_on_hover(true);
debug_menu->set_text(TTR("Debug"));
debug_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles"));
left_menu_hb->add_child(debug_menu);
@@ -5298,6 +5366,7 @@ EditorNode::EditorNode() {
settings_menu = memnew(MenuButton);
settings_menu->set_flat(false);
+ settings_menu->set_switch_on_hover(true);
settings_menu->set_text(TTR("Editor"));
settings_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles"));
left_menu_hb->add_child(settings_menu);
@@ -5334,6 +5403,7 @@ EditorNode::EditorNode() {
// Help Menu
help_menu = memnew(MenuButton);
help_menu->set_flat(false);
+ help_menu->set_switch_on_hover(true);
help_menu->set_text(TTR("Help"));
help_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles"));
left_menu_hb->add_child(help_menu);
@@ -5341,8 +5411,7 @@ EditorNode::EditorNode() {
p = help_menu->get_popup();
p->set_hide_on_window_lose_focus(true);
p->connect("id_pressed", this, "_menu_option");
- p->add_icon_item(gui_base->get_icon("ClassList", "EditorIcons"), TTR("Classes"), HELP_CLASSES);
- p->add_icon_item(gui_base->get_icon("HelpSearch", "EditorIcons"), TTR("Search"), HELP_SEARCH);
+ p->add_icon_shortcut(gui_base->get_icon("HelpSearch", "EditorIcons"), ED_SHORTCUT("editor/editor_help", TTR("Search"), KEY_F4), HELP_SEARCH);
p->add_separator();
p->add_icon_item(gui_base->get_icon("Instance", "EditorIcons"), TTR("Online Docs"), HELP_DOCS);
p->add_icon_item(gui_base->get_icon("Instance", "EditorIcons"), TTR("Q&A"), HELP_QA);
@@ -5351,12 +5420,8 @@ EditorNode::EditorNode() {
p->add_separator();
p->add_icon_item(gui_base->get_icon("Godot", "EditorIcons"), TTR("About"), HELP_ABOUT);
- play_cc = memnew(CenterContainer);
- play_cc->set_mouse_filter(Control::MOUSE_FILTER_IGNORE);
- menu_hb->add_child(play_cc);
-
play_button_panel = memnew(PanelContainer);
- play_cc->add_child(play_button_panel);
+ menu_hb->add_child(play_button_panel);
HBoxContainer *play_hb = memnew(HBoxContainer);
play_button_panel->add_child(play_hb);
@@ -5402,11 +5467,6 @@ EditorNode::EditorNode() {
run_native = memnew(EditorRunNative);
play_hb->add_child(run_native);
- native_play_button = memnew(MenuButton);
- native_play_button->set_text("NTV");
- menu_hb->add_child(native_play_button);
- native_play_button->hide();
- native_play_button->get_popup()->connect("id_pressed", this, "_run_in_device");
run_native->connect("native_run", this, "_menu_option", varray(RUN_PLAY_NATIVE));
play_scene_button = memnew(ToolButton);
@@ -5435,6 +5495,9 @@ EditorNode::EditorNode() {
play_custom_scene_button->set_shortcut(ED_SHORTCUT("editor/play_custom_scene", TTR("Play Custom Scene"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_F5));
#endif
+ HBoxContainer *right_menu_hb = memnew(HBoxContainer);
+ menu_hb->add_child(right_menu_hb);
+
// Toggle for video driver
video_driver = memnew(OptionButton);
video_driver->set_flat(true);
@@ -5442,7 +5505,7 @@ EditorNode::EditorNode() {
video_driver->set_v_size_flags(Control::SIZE_SHRINK_CENTER);
video_driver->connect("item_selected", this, "_video_driver_selected");
video_driver->add_font_override("font", gui_base->get_font("bold", "EditorFonts"));
- menu_hb->add_child(video_driver);
+ right_menu_hb->add_child(video_driver);
String video_drivers = ProjectSettings::get_singleton()->get_custom_property_info()["rendering/quality/driver/driver_name"].hint_string;
String current_video_driver = OS::get_singleton()->get_video_driver_name(OS::get_singleton()->get_current_video_driver());
@@ -5468,9 +5531,6 @@ EditorNode::EditorNode() {
progress_hb = memnew(BackgroundProgress);
- HBoxContainer *right_menu_hb = memnew(HBoxContainer);
- menu_hb->add_child(right_menu_hb);
-
layout_dialog = memnew(EditorNameDialog);
gui_base->add_child(layout_dialog);
layout_dialog->set_hide_on_ok(false);
@@ -5777,6 +5837,7 @@ EditorNode::EditorNode() {
_edit_current();
current = NULL;
+ saving_resource = Ref<Resource>();
reference_resource_mem = true;
save_external_resources_mem = true;
@@ -5819,6 +5880,7 @@ EditorNode::EditorNode() {
EditorFileSystem::get_singleton()->connect("sources_changed", this, "_sources_changed");
EditorFileSystem::get_singleton()->connect("filesystem_changed", this, "_fs_changed");
EditorFileSystem::get_singleton()->connect("resources_reimported", this, "_resources_reimported");
+ EditorFileSystem::get_singleton()->connect("resources_reload", this, "_resources_changed");
_build_icon_type_cache();
diff --git a/editor/editor_node.h b/editor/editor_node.h
index b828a4d7d5..13bebea5f0 100644
--- a/editor/editor_node.h
+++ b/editor/editor_node.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -180,7 +180,6 @@ private:
SETTINGS_HELP,
SCENE_TAB_CLOSE,
- HELP_CLASSES,
HELP_SEARCH,
HELP_DOCS,
HELP_QA,
@@ -244,7 +243,6 @@ private:
Control *vp_base;
PaneDrag *pd;
- CenterContainer *play_cc;
HBoxContainer *menu_hb;
Control *viewport;
MenuButton *file_menu;
@@ -256,7 +254,6 @@ private:
ToolButton *export_button;
ToolButton *prev_scene;
ToolButton *play_button;
- MenuButton *native_play_button;
ToolButton *pause_button;
ToolButton *stop_button;
ToolButton *run_settings_button;
@@ -356,6 +353,7 @@ private:
EditorExport *editor_export;
Object *current;
+ Ref<Resource> saving_resource;
bool _playing_edited;
String run_custom_filename;
@@ -445,6 +443,7 @@ private:
void _show_messages();
void _vp_resized();
+ bool _validate_scene_recursive(const String &p_filename, Node *p_node);
void _save_scene(String p_file, int idx = -1);
void _save_all_scenes();
int _next_unsaved_scene(bool p_valid_filename, int p_start = 0);
@@ -471,6 +470,8 @@ private:
void _dropped_files(const Vector<String> &p_files, int p_screen);
String _recent_scene;
+ void _exit_editor();
+
bool convert_old;
void _unhandled_input(const Ref<InputEvent> &p_event);
@@ -524,6 +525,8 @@ private:
} export_defer;
+ bool disable_progress_dialog;
+
static EditorNode *singleton;
static Vector<EditorNodeInitCallback> _init_callbacks;
@@ -605,6 +608,8 @@ private:
static void _resource_saved(RES p_resource, const String &p_path);
static void _resource_loaded(RES p_resource, const String &p_path);
+ void _resources_changed(const PoolVector<String> &p_resources);
+
protected:
void _notification(int p_what);
static void _bind_methods();
@@ -634,8 +639,8 @@ public:
ProjectSettingsEditor *get_project_settings() { return project_settings; }
- static void add_editor_plugin(EditorPlugin *p_editor);
- static void remove_editor_plugin(EditorPlugin *p_editor);
+ static void add_editor_plugin(EditorPlugin *p_editor, bool p_config_changed = false);
+ static void remove_editor_plugin(EditorPlugin *p_editor, bool p_config_changed = false);
void new_inherited_scene() { _menu_option_confirm(FILE_NEW_INHERITED_SCENE, false); }
@@ -648,7 +653,7 @@ public:
void add_control_to_dock(DockSlot p_slot, Control *p_control);
void remove_control_from_dock(Control *p_control);
- void set_addon_plugin_enabled(const String &p_addon, bool p_enabled);
+ void set_addon_plugin_enabled(const String &p_addon, bool p_enabled, bool p_config_changed = false);
bool is_addon_plugin_enabled(const String &p_addon) const;
void edit_node(Node *p_node);
@@ -784,6 +789,7 @@ public:
void edit_current() { _edit_current(); };
void update_keying() const { inspector_dock->update_keying(); };
+ bool has_scenes_in_session();
EditorNode();
~EditorNode();
diff --git a/editor/editor_path.cpp b/editor/editor_path.cpp
index 0eff1fd7dd..7e9d3a889e 100644
--- a/editor/editor_path.cpp
+++ b/editor/editor_path.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -119,9 +119,10 @@ void EditorPath::_notification(int p_what) {
Ref<Texture> icon = EditorNode::get_singleton()->get_object_icon(obj);
- icon->draw(ci, Point2i(ofs, (size.height - icon->get_height()) / 2));
-
- ofs += icon->get_width();
+ if (icon.is_valid()) {
+ icon->draw(ci, Point2i(ofs, (size.height - icon->get_height()) / 2));
+ ofs += icon->get_width();
+ }
if (i == history->get_path_size() - 1) {
//add name
diff --git a/editor/editor_path.h b/editor/editor_path.h
index a86e6b7b28..e12ca02534 100644
--- a/editor/editor_path.h
+++ b/editor/editor_path.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_plugin.cpp b/editor/editor_plugin.cpp
index 86b2db877e..c2493729a3 100644
--- a/editor/editor_plugin.cpp
+++ b/editor/editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -273,7 +273,7 @@ void EditorInterface::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_resource_filesystem"), &EditorInterface::get_resource_file_system);
ClassDB::bind_method(D_METHOD("get_editor_viewport"), &EditorInterface::get_editor_viewport);
ClassDB::bind_method(D_METHOD("make_mesh_previews", "meshes", "preview_size"), &EditorInterface::_make_mesh_previews);
- ClassDB::bind_method(D_METHOD("select_file", "p_file"), &EditorInterface::select_file);
+ ClassDB::bind_method(D_METHOD("select_file", "file"), &EditorInterface::select_file);
ClassDB::bind_method(D_METHOD("get_selected_path"), &EditorInterface::get_selected_path);
ClassDB::bind_method(D_METHOD("set_plugin_enabled", "plugin", "enabled"), &EditorInterface::set_plugin_enabled);
@@ -682,6 +682,14 @@ void EditorPlugin::remove_export_plugin(const Ref<EditorExportPlugin> &p_exporte
EditorExport::get_singleton()->remove_export_plugin(p_exporter);
}
+void EditorPlugin::add_spatial_gizmo_plugin(const Ref<EditorSpatialGizmoPlugin> &p_gizmo_plugin) {
+ SpatialEditor::get_singleton()->add_gizmo_plugin(p_gizmo_plugin);
+}
+
+void EditorPlugin::remove_spatial_gizmo_plugin(const Ref<EditorSpatialGizmoPlugin> &p_gizmo_plugin) {
+ SpatialEditor::get_singleton()->remove_gizmo_plugin(p_gizmo_plugin);
+}
+
void EditorPlugin::add_inspector_plugin(const Ref<EditorInspectorPlugin> &p_plugin) {
EditorInspector::add_inspector_plugin(p_plugin);
}
@@ -698,6 +706,34 @@ void EditorPlugin::remove_scene_import_plugin(const Ref<EditorSceneImporter> &p_
ResourceImporterScene::get_singleton()->remove_importer(p_importer);
}
+int find(const PoolStringArray &a, const String &v) {
+ PoolStringArray::Read r = a.read();
+ for (int j = 0; j < a.size(); ++j) {
+ if (r[j] == v) {
+ return j;
+ }
+ }
+ return -1;
+}
+
+void EditorPlugin::enable_plugin() {
+ // Called when the plugin gets enabled in project settings, after it's added to the tree.
+ // You can implement it to register autoloads.
+
+ if (get_script_instance() && get_script_instance()->has_method("enable_plugin")) {
+ get_script_instance()->call("enable_plugin");
+ }
+}
+
+void EditorPlugin::disable_plugin() {
+ // Last function called when the plugin gets disabled in project settings.
+ // Implement it to cleanup things from the project, such as unregister autoloads.
+
+ if (get_script_instance() && get_script_instance()->has_method("disable_plugin")) {
+ get_script_instance()->call("disable_plugin");
+ }
+}
+
void EditorPlugin::set_window_layout(Ref<ConfigFile> p_layout) {
if (get_script_instance() && get_script_instance()->has_method("set_window_layout")) {
@@ -774,6 +810,8 @@ void EditorPlugin::_bind_methods() {
ClassDB::bind_method(D_METHOD("remove_scene_import_plugin", "scene_importer"), &EditorPlugin::remove_scene_import_plugin);
ClassDB::bind_method(D_METHOD("add_export_plugin", "plugin"), &EditorPlugin::add_export_plugin);
ClassDB::bind_method(D_METHOD("remove_export_plugin", "plugin"), &EditorPlugin::remove_export_plugin);
+ ClassDB::bind_method(D_METHOD("add_spatial_gizmo_plugin", "plugin"), &EditorPlugin::add_spatial_gizmo_plugin);
+ ClassDB::bind_method(D_METHOD("remove_spatial_gizmo_plugin", "plugin"), &EditorPlugin::remove_spatial_gizmo_plugin);
ClassDB::bind_method(D_METHOD("add_inspector_plugin", "plugin"), &EditorPlugin::add_inspector_plugin);
ClassDB::bind_method(D_METHOD("remove_inspector_plugin", "plugin"), &EditorPlugin::remove_inspector_plugin);
ClassDB::bind_method(D_METHOD("set_input_event_forwarding_always_enabled"), &EditorPlugin::set_input_event_forwarding_always_enabled);
@@ -801,6 +839,8 @@ void EditorPlugin::_bind_methods() {
ClassDB::add_virtual_method(get_class_static(), MethodInfo("set_window_layout", PropertyInfo(Variant::OBJECT, "layout", PROPERTY_HINT_RESOURCE_TYPE, "ConfigFile")));
ClassDB::add_virtual_method(get_class_static(), MethodInfo("get_window_layout", PropertyInfo(Variant::OBJECT, "layout", PROPERTY_HINT_RESOURCE_TYPE, "ConfigFile")));
ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "build"));
+ ClassDB::add_virtual_method(get_class_static(), MethodInfo("enable_plugin"));
+ ClassDB::add_virtual_method(get_class_static(), MethodInfo("disable_plugin"));
ADD_SIGNAL(MethodInfo("scene_changed", PropertyInfo(Variant::OBJECT, "scene_root", PROPERTY_HINT_RESOURCE_TYPE, "Node")));
ADD_SIGNAL(MethodInfo("scene_closed", PropertyInfo(Variant::STRING, "filepath")));
@@ -829,11 +869,11 @@ void EditorPlugin::_bind_methods() {
BIND_ENUM_CONSTANT(DOCK_SLOT_MAX);
}
-EditorPlugin::EditorPlugin() {
- undo_redo = NULL;
- input_event_forwarding_always_enabled = false;
- force_draw_over_forwarding_enabled = false;
- last_main_screen_name = "";
+EditorPlugin::EditorPlugin() :
+ undo_redo(NULL),
+ input_event_forwarding_always_enabled(false),
+ force_draw_over_forwarding_enabled(false),
+ last_main_screen_name("") {
}
EditorPlugin::~EditorPlugin() {
diff --git a/editor/editor_plugin.h b/editor/editor_plugin.h
index e03aeb5d30..3e41bb5612 100644
--- a/editor/editor_plugin.h
+++ b/editor/editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -53,6 +53,7 @@ class EditorExport;
class EditorSettings;
class EditorImportPlugin;
class EditorExportPlugin;
+class EditorSpatialGizmoPlugin;
class EditorResourcePreview;
class EditorFileSystem;
class EditorToolAddons;
@@ -219,6 +220,9 @@ public:
void add_export_plugin(const Ref<EditorExportPlugin> &p_exporter);
void remove_export_plugin(const Ref<EditorExportPlugin> &p_exporter);
+ void add_spatial_gizmo_plugin(const Ref<EditorSpatialGizmoPlugin> &p_gizmo_plugin);
+ void remove_spatial_gizmo_plugin(const Ref<EditorSpatialGizmoPlugin> &p_gizmo_plugin);
+
void add_inspector_plugin(const Ref<EditorInspectorPlugin> &p_plugin);
void remove_inspector_plugin(const Ref<EditorInspectorPlugin> &p_plugin);
@@ -232,6 +236,9 @@ public:
String get_dir_cache() { return _dir_cache; }
Ref<ConfigFile> get_config();
+ void enable_plugin();
+ void disable_plugin();
+
EditorPlugin();
virtual ~EditorPlugin();
};
diff --git a/editor/editor_plugin_settings.cpp b/editor/editor_plugin_settings.cpp
index 30027c0c34..ecc3b33a15 100644
--- a/editor/editor_plugin_settings.cpp
+++ b/editor/editor_plugin_settings.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -152,7 +152,7 @@ void EditorPluginSettings::_plugin_activity_changed() {
bool active = ti->get_range(3);
String name = ti->get_metadata(0);
- EditorNode::get_singleton()->set_addon_plugin_enabled(name, active);
+ EditorNode::get_singleton()->set_addon_plugin_enabled(name, active, true);
bool is_active = EditorNode::get_singleton()->is_addon_plugin_enabled(name);
diff --git a/editor/editor_plugin_settings.h b/editor/editor_plugin_settings.h
index fe14f87cfc..0b70295b9b 100644
--- a/editor/editor_plugin_settings.h
+++ b/editor/editor_plugin_settings.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_profiler.cpp b/editor/editor_profiler.cpp
index d3978749c0..e0baca9299 100644
--- a/editor/editor_profiler.cpp
+++ b/editor/editor_profiler.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_profiler.h b/editor/editor_profiler.h
index d445ad58aa..8fa09f8494 100644
--- a/editor/editor_profiler.h
+++ b/editor/editor_profiler.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp
index d95c192a29..9aad7900bc 100644
--- a/editor/editor_properties.cpp
+++ b/editor/editor_properties.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -233,7 +233,7 @@ void EditorPropertyPath::_path_pressed() {
dialog->set_mode(EditorFileDialog::MODE_OPEN_DIR);
dialog->set_current_dir(full_path);
} else {
- dialog->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ dialog->set_mode(save_mode ? EditorFileDialog::MODE_SAVE_FILE : EditorFileDialog::MODE_OPEN_FILE);
for (int i = 0; i < extensions.size(); i++) {
String e = extensions[i].strip_edges();
if (e != String()) {
@@ -260,6 +260,11 @@ void EditorPropertyPath::setup(const Vector<String> &p_extensions, bool p_folder
global = p_global;
}
+void EditorPropertyPath::set_save_mode() {
+
+ save_mode = true;
+}
+
void EditorPropertyPath::_notification(int p_what) {
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
@@ -296,6 +301,7 @@ EditorPropertyPath::EditorPropertyPath() {
path_edit->connect("pressed", this, "_path_pressed");
folder = false;
global = false;
+ save_mode = false;
}
///////////////////// CLASS NAME /////////////////////////
@@ -789,6 +795,7 @@ EditorPropertyLayers::EditorPropertyLayers() {
layers->set_hide_on_checkable_item_selection(false);
layers->connect("id_pressed", this, "_menu_pressed");
}
+
///////////////////// INT /////////////////////////
void EditorPropertyInteger::_value_changed(double val) {
@@ -1090,6 +1097,8 @@ void EditorPropertyVector2::setup(double p_min, double p_max, double p_step, boo
spin[i]->set_max(p_max);
spin[i]->set_step(p_step);
spin[i]->set_hide_slider(p_no_slider);
+ spin[i]->set_allow_greater(true);
+ spin[i]->set_allow_lesser(true);
}
}
@@ -1171,6 +1180,8 @@ void EditorPropertyRect2::setup(double p_min, double p_max, double p_step, bool
spin[i]->set_max(p_max);
spin[i]->set_step(p_step);
spin[i]->set_hide_slider(p_no_slider);
+ spin[i]->set_allow_greater(true);
+ spin[i]->set_allow_lesser(true);
}
}
@@ -1251,6 +1262,8 @@ void EditorPropertyVector3::setup(double p_min, double p_max, double p_step, boo
spin[i]->set_max(p_max);
spin[i]->set_step(p_step);
spin[i]->set_hide_slider(p_no_slider);
+ spin[i]->set_allow_greater(true);
+ spin[i]->set_allow_lesser(true);
}
}
@@ -1331,6 +1344,8 @@ void EditorPropertyPlane::setup(double p_min, double p_max, double p_step, bool
spin[i]->set_max(p_max);
spin[i]->set_step(p_step);
spin[i]->set_hide_slider(p_no_slider);
+ spin[i]->set_allow_greater(true);
+ spin[i]->set_allow_lesser(true);
}
}
@@ -1413,6 +1428,8 @@ void EditorPropertyQuat::setup(double p_min, double p_max, double p_step, bool p
spin[i]->set_max(p_max);
spin[i]->set_step(p_step);
spin[i]->set_hide_slider(p_no_slider);
+ spin[i]->set_allow_greater(true);
+ spin[i]->set_allow_lesser(true);
}
}
@@ -1500,6 +1517,8 @@ void EditorPropertyAABB::setup(double p_min, double p_max, double p_step, bool p
spin[i]->set_max(p_max);
spin[i]->set_step(p_step);
spin[i]->set_hide_slider(p_no_slider);
+ spin[i]->set_allow_greater(true);
+ spin[i]->set_allow_lesser(true);
}
}
@@ -1574,6 +1593,8 @@ void EditorPropertyTransform2D::setup(double p_min, double p_max, double p_step,
spin[i]->set_max(p_max);
spin[i]->set_step(p_step);
spin[i]->set_hide_slider(p_no_slider);
+ spin[i]->set_allow_greater(true);
+ spin[i]->set_allow_lesser(true);
}
}
@@ -1653,6 +1674,8 @@ void EditorPropertyBasis::setup(double p_min, double p_max, double p_step, bool
spin[i]->set_max(p_max);
spin[i]->set_step(p_step);
spin[i]->set_hide_slider(p_no_slider);
+ spin[i]->set_allow_greater(true);
+ spin[i]->set_allow_lesser(true);
}
}
@@ -1738,6 +1761,8 @@ void EditorPropertyTransform::setup(double p_min, double p_max, double p_step, b
spin[i]->set_max(p_max);
spin[i]->set_step(p_step);
spin[i]->set_hide_slider(p_no_slider);
+ spin[i]->set_allow_greater(true);
+ spin[i]->set_allow_lesser(true);
}
}
@@ -1801,15 +1826,32 @@ EditorPropertyColor::EditorPropertyColor() {
void EditorPropertyNodePath::_node_selected(const NodePath &p_path) {
NodePath path = p_path;
- Node *base_node = Object::cast_to<Node>(get_edited_object());
- if (base_node == NULL) {
- if (Object::cast_to<Resource>(get_edited_object())) {
- Node *to_node = get_node(p_path);
- path = get_tree()->get_edited_scene_root()->get_path_to(to_node);
- } else if (get_edited_object()->has_method("get_root_path")) {
- base_node = get_edited_object()->call("get_root_path");
+ Node *base_node = NULL;
+
+ if (!use_path_from_scene_root) {
+ base_node = Object::cast_to<Node>(get_edited_object());
+
+ if (!base_node) {
+ //try a base node within history
+ if (EditorNode::get_singleton()->get_editor_history()->get_path_size() > 0) {
+ Object *base = ObjectDB::get_instance(EditorNode::get_singleton()->get_editor_history()->get_path_object(0));
+ if (base) {
+ base_node = Object::cast_to<Node>(base);
+ }
+ }
}
}
+
+ if (!base_node && get_edited_object()->has_method("get_root_path")) {
+ base_node = get_edited_object()->call("get_root_path");
+ }
+
+ if (!base_node && Object::cast_to<Reference>(get_edited_object())) {
+ Node *to_node = get_node(p_path);
+ ERR_FAIL_COND(!to_node);
+ path = get_tree()->get_edited_scene_root()->get_path_to(to_node);
+ }
+
if (base_node) { // for AnimationTrackKeyEdit
path = base_node->get_path().rel_path_to(p_path);
}
@@ -1841,7 +1883,7 @@ void EditorPropertyNodePath::update_property() {
assign->set_tooltip(p);
if (p == NodePath()) {
assign->set_icon(Ref<Texture>());
- assign->set_text(TTR("Assign.."));
+ assign->set_text(TTR("Assign..."));
assign->set_flat(false);
return;
}
@@ -1875,10 +1917,11 @@ void EditorPropertyNodePath::update_property() {
assign->set_icon(EditorNode::get_singleton()->get_object_icon(target_node, "Node"));
}
-void EditorPropertyNodePath::setup(const NodePath &p_base_hint, Vector<StringName> p_valid_types) {
+void EditorPropertyNodePath::setup(const NodePath &p_base_hint, Vector<StringName> p_valid_types, bool p_use_path_from_scene_root) {
base_hint = p_base_hint;
valid_types = p_valid_types;
+ use_path_from_scene_root = p_use_path_from_scene_root;
}
void EditorPropertyNodePath::_notification(int p_what) {
@@ -1911,15 +1954,57 @@ EditorPropertyNodePath::EditorPropertyNodePath() {
clear->set_flat(true);
clear->connect("pressed", this, "_node_clear");
hbc->add_child(clear);
+ use_path_from_scene_root = false;
scene_tree = NULL; //do not allocate unnecessarily
}
+///////////////////// RID /////////////////////////
+
+void EditorPropertyRID::update_property() {
+ RID rid = get_edited_object()->get(get_edited_property());
+ if (rid.is_valid()) {
+ int id = rid.get_id();
+ label->set_text("RID: " + itos(id));
+ } else {
+ label->set_text(TTR("Invalid RID"));
+ }
+}
+
+EditorPropertyRID::EditorPropertyRID() {
+ label = memnew(Label);
+ add_child(label);
+}
+
////////////// RESOURCE //////////////////////
void EditorPropertyResource::_file_selected(const String &p_path) {
RES res = ResourceLoader::load(p_path);
+
+ List<PropertyInfo> prop_list;
+ get_edited_object()->get_property_list(&prop_list);
+ String property_types;
+
+ for (List<PropertyInfo>::Element *E = prop_list.front(); E; E = E->next()) {
+ if (E->get().name == get_edited_property() && (E->get().hint & PROPERTY_HINT_RESOURCE_TYPE)) {
+ property_types = E->get().hint_string;
+ }
+ }
+ if (!property_types.empty()) {
+ bool any_type_matches = false;
+ const Vector<String> split_property_types = property_types.split(",");
+ for (int i = 0; i < split_property_types.size(); ++i) {
+ if (res->is_class(split_property_types[i])) {
+ any_type_matches = true;
+ break;
+ }
+ }
+
+ if (!any_type_matches)
+ EditorNode::get_singleton()->show_warning(vformat(TTR("The selected resource (%s) does not match any type expected for this property (%s)."), res->get_class(), property_types));
+ }
+
emit_signal("property_changed", get_edited_property(), res);
update_property();
}
@@ -2016,6 +2101,13 @@ void EditorPropertyResource::_menu_option(int p_which) {
} break;
+ case OBJ_MENU_SAVE: {
+ RES res = get_edited_object()->get(get_edited_property());
+ if (res.is_null())
+ return;
+ EditorNode::get_singleton()->save_resource(res);
+ } break;
+
case OBJ_MENU_COPY: {
RES res = get_edited_object()->get(get_edited_property());
@@ -2233,6 +2325,7 @@ void EditorPropertyResource::_update_menu_items() {
menu->add_icon_item(get_icon("Edit", "EditorIcons"), TTR("Edit"), OBJ_MENU_EDIT);
menu->add_icon_item(get_icon("Clear", "EditorIcons"), TTR("Clear"), OBJ_MENU_CLEAR);
menu->add_icon_item(get_icon("Duplicate", "EditorIcons"), TTR("Make Unique"), OBJ_MENU_MAKE_UNIQUE);
+ menu->add_icon_item(get_icon("Save", "EditorIcons"), TTR("Save"), OBJ_MENU_SAVE);
RES r = res;
if (r.is_valid() && r->get_path().is_resource_file()) {
menu->add_separator();
@@ -2304,7 +2397,7 @@ void EditorPropertyResource::_update_menu() {
void EditorPropertyResource::_sub_inspector_property_keyed(const String &p_property, const Variant &p_value, bool) {
- emit_signal("property_keyed_with_value", String(get_edited_property()) + ":" + p_property, p_value);
+ emit_signal("property_keyed_with_value", String(get_edited_property()) + ":" + p_property, p_value, false);
}
void EditorPropertyResource::_sub_inspector_resource_selected(const RES &p_resource, const String &p_property) {
@@ -2353,6 +2446,7 @@ void EditorPropertyResource::update_property() {
if (!sub_inspector) {
sub_inspector = memnew(EditorInspector);
sub_inspector->set_enable_v_scroll(false);
+ sub_inspector->set_use_doc_hints(true);
sub_inspector->set_use_sub_inspector_bg(true);
sub_inspector->set_enable_capitalize_paths(true);
@@ -2363,6 +2457,7 @@ void EditorPropertyResource::update_property() {
sub_inspector->set_keying(is_keying());
sub_inspector->set_read_only(is_read_only());
sub_inspector->set_use_folding(is_using_folding());
+ sub_inspector->set_undo_redo(EditorNode::get_singleton()->get_undo_redo());
sub_inspector_vbox = memnew(VBoxContainer);
add_child(sub_inspector_vbox);
@@ -3036,17 +3131,19 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
EditorPropertyNodePath *editor = memnew(EditorPropertyNodePath);
if (p_hint == PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE && p_hint_text != String()) {
- editor->setup(p_hint_text, Vector<StringName>());
+ editor->setup(p_hint_text, Vector<StringName>(), (p_usage & PROPERTY_USAGE_NODE_PATH_FROM_SCENE_ROOT));
}
if (p_hint == PROPERTY_HINT_NODE_PATH_VALID_TYPES && p_hint_text != String()) {
Vector<String> types = p_hint_text.split(",", false);
Vector<StringName> sn = Variant(types); //convert via variant
- editor->setup(NodePath(), sn);
+ editor->setup(NodePath(), sn, (p_usage & PROPERTY_USAGE_NODE_PATH_FROM_SCENE_ROOT));
}
add_property_editor(p_path, editor);
} break; // 15
case Variant::_RID: {
+ EditorPropertyRID *editor = memnew(EditorPropertyRID);
+ add_property_editor(p_path, editor);
} break;
case Variant::OBJECT: {
EditorPropertyResource *editor = memnew(EditorPropertyResource);
@@ -3076,7 +3173,7 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
} break;
case Variant::ARRAY: {
EditorPropertyArray *editor = memnew(EditorPropertyArray);
- editor->setup(Variant::ARRAY);
+ editor->setup(Variant::ARRAY, p_hint_text);
add_property_editor(p_path, editor);
} break;
case Variant::POOL_BYTE_ARRAY: {
diff --git a/editor/editor_properties.h b/editor/editor_properties.h
index a9751e3d16..df01ee83b5 100644
--- a/editor/editor_properties.h
+++ b/editor/editor_properties.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -106,6 +106,7 @@ class EditorPropertyPath : public EditorProperty {
Vector<String> extensions;
bool folder;
bool global;
+ bool save_mode;
EditorFileDialog *dialog;
LineEdit *path;
Button *path_edit;
@@ -120,6 +121,7 @@ protected:
public:
void setup(const Vector<String> &p_extensions, bool p_folder, bool p_global);
+ void set_save_mode();
virtual void update_property();
EditorPropertyPath();
};
@@ -497,6 +499,7 @@ class EditorPropertyNodePath : public EditorProperty {
Button *clear;
SceneTreeDialog *scene_tree;
NodePath base_hint;
+ bool use_path_from_scene_root;
Vector<StringName> valid_types;
void _node_selected(const NodePath &p_path);
@@ -509,10 +512,19 @@ protected:
public:
virtual void update_property();
- void setup(const NodePath &p_base_hint, Vector<StringName> p_valid_types);
+ void setup(const NodePath &p_base_hint, Vector<StringName> p_valid_types, bool p_use_path_from_scene_root = true);
EditorPropertyNodePath();
};
+class EditorPropertyRID : public EditorProperty {
+ GDCLASS(EditorPropertyRID, EditorProperty)
+ Label *label;
+
+public:
+ virtual void update_property();
+ EditorPropertyRID();
+};
+
class EditorPropertyResource : public EditorProperty {
GDCLASS(EditorPropertyResource, EditorProperty)
@@ -522,10 +534,11 @@ class EditorPropertyResource : public EditorProperty {
OBJ_MENU_EDIT = 1,
OBJ_MENU_CLEAR = 2,
OBJ_MENU_MAKE_UNIQUE = 3,
- OBJ_MENU_COPY = 4,
- OBJ_MENU_PASTE = 5,
- OBJ_MENU_NEW_SCRIPT = 6,
- OBJ_MENU_SHOW_IN_FILE_SYSTEM = 7,
+ OBJ_MENU_SAVE = 4,
+ OBJ_MENU_COPY = 5,
+ OBJ_MENU_PASTE = 6,
+ OBJ_MENU_NEW_SCRIPT = 7,
+ OBJ_MENU_SHOW_IN_FILE_SYSTEM = 8,
TYPE_BASE_ID = 100,
CONVERT_BASE_ID = 1000
diff --git a/editor/editor_properties_array_dict.cpp b/editor/editor_properties_array_dict.cpp
index 24360813a2..20cb6ab534 100644
--- a/editor/editor_properties_array_dict.cpp
+++ b/editor/editor_properties_array_dict.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -29,6 +29,8 @@
/*************************************************************************/
#include "editor_properties_array_dict.h"
+
+#include "core/io/marshalls.h"
#include "editor/editor_scale.h"
#include "editor_properties.h"
@@ -54,6 +56,10 @@ bool EditorPropertyArrayObject::_get(const StringName &p_name, Variant &r_ret) c
int idx = pn.get_slicec('/', 1).to_int();
bool valid;
r_ret = array.get(idx, &valid);
+ if (r_ret.get_type() == Variant::OBJECT && Object::cast_to<EncodedObjectAsID>(r_ret)) {
+ r_ret = Object::cast_to<EncodedObjectAsID>(r_ret)->get_object_id();
+ }
+
return valid;
}
@@ -120,6 +126,10 @@ bool EditorPropertyDictionaryObject::_get(const StringName &p_name, Variant &r_r
int idx = pn.get_slicec('/', 1).to_int();
Variant key = dict.get_key_at_index(idx);
r_ret = dict[key];
+ if (r_ret.get_type() == Variant::OBJECT && Object::cast_to<EncodedObjectAsID>(r_ret)) {
+ r_ret = Object::cast_to<EncodedObjectAsID>(r_ret)->get_object_id();
+ }
+
return true;
}
@@ -198,6 +208,10 @@ void EditorPropertyArray::_change_type_menu(int p_index) {
update_property();
}
+void EditorPropertyArray::_object_id_selected(const String &p_property, ObjectID p_id) {
+ emit_signal("object_id_selected", p_property, p_id);
+}
+
void EditorPropertyArray::update_property() {
Variant array = get_edited_object()->get(get_edited_property());
@@ -211,31 +225,31 @@ void EditorPropertyArray::update_property() {
// arrays
case Variant::POOL_BYTE_ARRAY: {
- arrtype = "ByteArray";
+ arrtype = "PoolByteArray";
} break;
case Variant::POOL_INT_ARRAY: {
- arrtype = "IntArray";
+ arrtype = "PoolIntArray";
} break;
case Variant::POOL_REAL_ARRAY: {
- arrtype = "FltArray";
+ arrtype = "PoolFloatArray";
} break;
case Variant::POOL_STRING_ARRAY: {
- arrtype = "StrArray";
+ arrtype = "PoolStringArray";
} break;
case Variant::POOL_VECTOR2_ARRAY: {
- arrtype = "Vec2Array";
+ arrtype = "PoolVector2Array";
} break;
case Variant::POOL_VECTOR3_ARRAY: {
- arrtype = "Vec3Array";
+ arrtype = "PoolVector3Array";
} break;
case Variant::POOL_COLOR_ARRAY: {
- arrtype = "ColArray";
+ arrtype = "PoolColorArray";
} break;
default: {}
}
@@ -249,7 +263,7 @@ void EditorPropertyArray::update_property() {
return;
}
- edit->set_text(arrtype + "(size " + itos(array.call("size")) + ")");
+ edit->set_text(arrtype + " (size " + itos(array.call("size")) + ")");
#ifdef TOOLS_ENABLED
@@ -322,190 +336,38 @@ void EditorPropertyArray::update_property() {
EditorProperty *prop = NULL;
Variant value = array.get(i + offset);
+ Variant::Type value_type = value.get_type();
- switch (value.get_type()) {
- case Variant::NIL: {
- prop = memnew(EditorPropertyNil);
-
- } break;
-
- // atomic types
- case Variant::BOOL: {
-
- prop = memnew(EditorPropertyCheck);
-
- } break;
- case Variant::INT: {
- EditorPropertyInteger *editor = memnew(EditorPropertyInteger);
- editor->setup(-100000, 100000, 1, true, true);
- prop = editor;
-
- } break;
- case Variant::REAL: {
-
- EditorPropertyFloat *editor = memnew(EditorPropertyFloat);
- editor->setup(-100000, 100000, 0.001, true, false, true, true);
- prop = editor;
- } break;
- case Variant::STRING: {
-
- prop = memnew(EditorPropertyText);
-
- } break;
-
- // math types
-
- case Variant::VECTOR2: {
-
- EditorPropertyVector2 *editor = memnew(EditorPropertyVector2);
- editor->setup(-100000, 100000, 0.001, true);
- prop = editor;
-
- } break;
- case Variant::RECT2: {
-
- EditorPropertyRect2 *editor = memnew(EditorPropertyRect2);
- editor->setup(-100000, 100000, 0.001, true);
- prop = editor;
-
- } break;
- case Variant::VECTOR3: {
-
- EditorPropertyVector3 *editor = memnew(EditorPropertyVector3);
- editor->setup(-100000, 100000, 0.001, true);
- prop = editor;
-
- } break;
- case Variant::TRANSFORM2D: {
-
- EditorPropertyTransform2D *editor = memnew(EditorPropertyTransform2D);
- editor->setup(-100000, 100000, 0.001, true);
- prop = editor;
-
- } break;
- case Variant::PLANE: {
-
- EditorPropertyPlane *editor = memnew(EditorPropertyPlane);
- editor->setup(-100000, 100000, 0.001, true);
- prop = editor;
-
- } break;
- case Variant::QUAT: {
-
- EditorPropertyQuat *editor = memnew(EditorPropertyQuat);
- editor->setup(-100000, 100000, 0.001, true);
- prop = editor;
-
- } break;
- case Variant::AABB: {
-
- EditorPropertyAABB *editor = memnew(EditorPropertyAABB);
- editor->setup(-100000, 100000, 0.001, true);
- prop = editor;
-
- } break;
- case Variant::BASIS: {
- EditorPropertyBasis *editor = memnew(EditorPropertyBasis);
- editor->setup(-100000, 100000, 0.001, true);
- prop = editor;
-
- } break;
- case Variant::TRANSFORM: {
- EditorPropertyTransform *editor = memnew(EditorPropertyTransform);
- editor->setup(-100000, 100000, 0.001, true);
- prop = editor;
-
- } break;
-
- // misc types
- case Variant::COLOR: {
- prop = memnew(EditorPropertyColor);
-
- } break;
- case Variant::NODE_PATH: {
- prop = memnew(EditorPropertyNodePath);
-
- } break;
- case Variant::_RID: {
- prop = memnew(EditorPropertyNil);
-
- } break;
- case Variant::OBJECT: {
- EditorPropertyResource *editor = memnew(EditorPropertyResource);
- editor->setup("Resource");
- prop = editor;
-
- } break;
- case Variant::DICTIONARY: {
- prop = memnew(EditorPropertyDictionary);
-
- } break;
-
- // arrays
- case Variant::ARRAY: {
- EditorPropertyArray *editor = memnew(EditorPropertyArray);
- editor->setup(Variant::ARRAY);
- prop = editor;
-
- } break;
- case Variant::POOL_BYTE_ARRAY: {
- EditorPropertyArray *editor = memnew(EditorPropertyArray);
- editor->setup(Variant::POOL_BYTE_ARRAY);
- prop = editor;
-
- } break;
- case Variant::POOL_INT_ARRAY: {
- EditorPropertyArray *editor = memnew(EditorPropertyArray);
- editor->setup(Variant::POOL_INT_ARRAY);
- prop = editor;
-
- } break;
- case Variant::POOL_REAL_ARRAY: {
-
- EditorPropertyArray *editor = memnew(EditorPropertyArray);
- editor->setup(Variant::POOL_REAL_ARRAY);
- prop = editor;
- } break;
- case Variant::POOL_STRING_ARRAY: {
-
- EditorPropertyArray *editor = memnew(EditorPropertyArray);
- editor->setup(Variant::POOL_STRING_ARRAY);
- prop = editor;
- } break;
- case Variant::POOL_VECTOR2_ARRAY: {
-
- EditorPropertyArray *editor = memnew(EditorPropertyArray);
- editor->setup(Variant::POOL_VECTOR2_ARRAY);
- prop = editor;
- } break;
- case Variant::POOL_VECTOR3_ARRAY: {
-
- EditorPropertyArray *editor = memnew(EditorPropertyArray);
- editor->setup(Variant::POOL_VECTOR3_ARRAY);
- prop = editor;
- } break;
- case Variant::POOL_COLOR_ARRAY: {
+ if (value_type == Variant::NIL && subtype != Variant::NIL) {
+ value_type = subtype;
+ }
- EditorPropertyArray *editor = memnew(EditorPropertyArray);
- editor->setup(Variant::POOL_COLOR_ARRAY);
- prop = editor;
- } break;
- default: {}
+ if (value_type == Variant::OBJECT && Object::cast_to<EncodedObjectAsID>(value)) {
+ EditorPropertyObjectID *editor = memnew(EditorPropertyObjectID);
+ editor->setup("Object");
+ prop = editor;
+ } else {
+ prop = EditorInspector::instantiate_property_editor(NULL, value_type, "", subtype_hint, subtype_hint_string, 0);
}
prop->set_object_and_property(object.ptr(), prop_name);
prop->set_label(itos(i + offset));
prop->set_selectable(false);
prop->connect("property_changed", this, "_property_changed");
+ prop->connect("object_id_selected", this, "_object_id_selected");
if (array.get_type() == Variant::ARRAY) {
HBoxContainer *hb = memnew(HBoxContainer);
vbox->add_child(hb);
hb->add_child(prop);
prop->set_h_size_flags(SIZE_EXPAND_FILL);
- Button *edit = memnew(Button);
- edit->set_icon(get_icon("Edit", "EditorIcons"));
- hb->add_child(edit);
- edit->connect("pressed", this, "_change_type", varray(edit, i + offset));
+
+ if (subtype == Variant::NIL) {
+ Button *edit = memnew(Button);
+ edit->set_icon(get_icon("Edit", "EditorIcons"));
+ hb->add_child(edit);
+ edit->connect("pressed", this, "_change_type", varray(edit, i + offset));
+ }
+
} else {
vbox->add_child(prop);
}
@@ -560,15 +422,39 @@ void EditorPropertyArray::_length_changed(double p_page) {
emit_signal("property_changed", get_edited_property(), array);
if (array.get_type() == Variant::ARRAY) {
+ if (subtype != Variant::NIL) {
+ int size = array.call("size");
+ for (int i = 0; i < size; i++) {
+ if (array.get(i).get_type() == Variant::NIL) {
+ Variant::CallError ce;
+ array.set(i, Variant::construct(subtype, NULL, 0, ce));
+ }
+ }
+ }
array = array.call("duplicate"); //dupe, so undo/redo works better
}
object->set_array(array);
update_property();
}
-void EditorPropertyArray::setup(Variant::Type p_array_type) {
+void EditorPropertyArray::setup(Variant::Type p_array_type, const String &p_hint_string) {
array_type = p_array_type;
+
+ if (array_type == Variant::ARRAY && !p_hint_string.empty()) {
+ int hint_subtype_seperator = p_hint_string.find(":");
+ if (hint_subtype_seperator >= 0) {
+ String subtype_string = p_hint_string.substr(0, hint_subtype_seperator);
+ int slash_pos = subtype_string.find("/");
+ if (slash_pos >= 0) {
+ subtype_hint = PropertyHint(subtype_string.substr(slash_pos + 1, subtype_string.size() - slash_pos - 1).to_int());
+ subtype_string = subtype_string.substr(0, slash_pos);
+ }
+
+ subtype_hint_string = p_hint_string.substr(hint_subtype_seperator + 1, p_hint_string.size() - hint_subtype_seperator - 1);
+ subtype = Variant::Type(subtype_string.to_int());
+ }
+ }
}
void EditorPropertyArray::_bind_methods() {
@@ -578,6 +464,7 @@ void EditorPropertyArray::_bind_methods() {
ClassDB::bind_method("_property_changed", &EditorPropertyArray::_property_changed, DEFVAL(false));
ClassDB::bind_method("_change_type", &EditorPropertyArray::_change_type);
ClassDB::bind_method("_change_type_menu", &EditorPropertyArray::_change_type_menu);
+ ClassDB::bind_method("_object_id_selected", &EditorPropertyArray::_object_id_selected);
}
EditorPropertyArray::EditorPropertyArray() {
@@ -606,6 +493,10 @@ EditorPropertyArray::EditorPropertyArray() {
change_type->add_item(type, i);
}
changing_type_idx = -1;
+
+ subtype = Variant::NIL;
+ subtype_hint = PROPERTY_HINT_NONE;
+ subtype_hint_string = "";
}
///////////////////// DICTIONARY ///////////////////////////
@@ -893,9 +784,19 @@ void EditorPropertyDictionary::update_property() {
} break;
case Variant::OBJECT: {
- EditorPropertyResource *editor = memnew(EditorPropertyResource);
- editor->setup("Resource");
- prop = editor;
+
+ if (Object::cast_to<EncodedObjectAsID>(value)) {
+
+ EditorPropertyObjectID *editor = memnew(EditorPropertyObjectID);
+ editor->setup("Object");
+ prop = editor;
+
+ } else {
+
+ EditorPropertyResource *editor = memnew(EditorPropertyResource);
+ editor->setup("Resource");
+ prop = editor;
+ }
} break;
case Variant::DICTIONARY: {
@@ -986,6 +887,7 @@ void EditorPropertyDictionary::update_property() {
prop->set_selectable(false);
prop->connect("property_changed", this, "_property_changed");
+ prop->connect("object_id_selected", this, "_object_id_selected");
HBoxContainer *hb = memnew(HBoxContainer);
if (add_vbox) {
@@ -1022,6 +924,10 @@ void EditorPropertyDictionary::update_property() {
#endif
}
+void EditorPropertyDictionary::_object_id_selected(const String &p_property, ObjectID p_id) {
+ emit_signal("object_id_selected", p_property, p_id);
+}
+
void EditorPropertyDictionary::_notification(int p_what) {
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
@@ -1055,6 +961,7 @@ void EditorPropertyDictionary::_bind_methods() {
ClassDB::bind_method("_change_type", &EditorPropertyDictionary::_change_type);
ClassDB::bind_method("_change_type_menu", &EditorPropertyDictionary::_change_type_menu);
ClassDB::bind_method("_add_key_value", &EditorPropertyDictionary::_add_key_value);
+ ClassDB::bind_method("_object_id_selected", &EditorPropertyDictionary::_object_id_selected);
}
EditorPropertyDictionary::EditorPropertyDictionary() {
diff --git a/editor/editor_properties_array_dict.h b/editor/editor_properties_array_dict.h
index d2bd849f30..8aea1f8955 100644
--- a/editor/editor_properties_array_dict.h
+++ b/editor/editor_properties_array_dict.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -93,6 +93,9 @@ class EditorPropertyArray : public EditorProperty {
EditorSpinSlider *page;
HBoxContainer *page_hb;
Variant::Type array_type;
+ Variant::Type subtype;
+ PropertyHint subtype_hint;
+ String subtype_hint_string;
void _page_changed(double p_page);
void _length_changed(double p_page);
@@ -101,12 +104,14 @@ class EditorPropertyArray : public EditorProperty {
void _change_type(Object *p_button, int p_index);
void _change_type_menu(int p_index);
+ void _object_id_selected(const String &p_property, ObjectID p_id);
+
protected:
static void _bind_methods();
void _notification(int p_what);
public:
- void setup(Variant::Type p_array_type);
+ void setup(Variant::Type p_array_type, const String &p_hint_string = "");
virtual void update_property();
EditorPropertyArray();
};
@@ -134,6 +139,7 @@ class EditorPropertyDictionary : public EditorProperty {
void _change_type_menu(int p_index);
void _add_key_value();
+ void _object_id_selected(const String &p_property, ObjectID p_id);
protected:
static void _bind_methods();
diff --git a/editor/editor_resource_preview.cpp b/editor/editor_resource_preview.cpp
index 310c3b3a52..368efbc48f 100644
--- a/editor/editor_resource_preview.cpp
+++ b/editor/editor_resource_preview.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -326,7 +326,7 @@ void EditorResourcePreview::queue_edited_resource_preview(const Ref<Resource> &p
if (cache.has(path_id) && cache[path_id].last_hash == p_res->hash_edited_version()) {
cache[path_id].order = order++;
- p_receiver->call_deferred(p_receiver_func, path_id, cache[path_id].preview, cache[path_id].small_preview, p_userdata);
+ p_receiver->call(p_receiver_func, path_id, cache[path_id].preview, cache[path_id].small_preview, p_userdata);
preview_mutex->unlock();
return;
}
@@ -351,7 +351,7 @@ void EditorResourcePreview::queue_resource_preview(const String &p_path, Object
preview_mutex->lock();
if (cache.has(p_path)) {
cache[p_path].order = order++;
- p_receiver->call_deferred(p_receiver_func, p_path, cache[p_path].preview, cache[p_path].small_preview, p_userdata);
+ p_receiver->call(p_receiver_func, p_path, cache[p_path].preview, cache[p_path].small_preview, p_userdata);
preview_mutex->unlock();
return;
}
@@ -416,6 +416,16 @@ void EditorResourcePreview::check_for_invalidation(const String &p_path) {
}
}
+void EditorResourcePreview::stop() {
+ if (thread) {
+ exit = true;
+ preview_sem->post();
+ Thread::wait_to_finish(thread);
+ memdelete(thread);
+ thread = NULL;
+ }
+}
+
EditorResourcePreview::EditorResourcePreview() {
singleton = this;
preview_mutex = Mutex::create();
@@ -428,10 +438,7 @@ EditorResourcePreview::EditorResourcePreview() {
EditorResourcePreview::~EditorResourcePreview() {
- exit = true;
- preview_sem->post();
- Thread::wait_to_finish(thread);
- memdelete(thread);
+ stop();
memdelete(preview_mutex);
memdelete(preview_sem);
}
diff --git a/editor/editor_resource_preview.h b/editor/editor_resource_preview.h
index a3417cdf60..85ac78d58f 100644
--- a/editor/editor_resource_preview.h
+++ b/editor/editor_resource_preview.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -126,6 +126,8 @@ public:
void remove_preview_generator(const Ref<EditorResourcePreviewGenerator> &p_generator);
void check_for_invalidation(const String &p_path);
+ void stop();
+
EditorResourcePreview();
~EditorResourcePreview();
};
diff --git a/editor/editor_run.cpp b/editor/editor_run.cpp
index ad5cf49f3f..0ba32395ec 100644
--- a/editor/editor_run.cpp
+++ b/editor/editor_run.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_run.h b/editor/editor_run.h
index df2324efd7..c27c8a05c8 100644
--- a/editor/editor_run.h
+++ b/editor/editor_run.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_run_native.cpp b/editor/editor_run_native.cpp
index caa1d4be62..887a102aa4 100644
--- a/editor/editor_run_native.cpp
+++ b/editor/editor_run_native.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_run_native.h b/editor/editor_run_native.h
index 5bfe600a04..10cca014cf 100644
--- a/editor/editor_run_native.h
+++ b/editor/editor_run_native.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_run_script.cpp b/editor/editor_run_script.cpp
index 93d201864e..17ce8a7c7b 100644
--- a/editor/editor_run_script.cpp
+++ b/editor/editor_run_script.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_run_script.h b/editor/editor_run_script.h
index 892d5151a0..e019ca6223 100644
--- a/editor/editor_run_script.h
+++ b/editor/editor_run_script.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_scale.cpp b/editor/editor_scale.cpp
index ba1607b408..785e75c332 100644
--- a/editor/editor_scale.cpp
+++ b/editor/editor_scale.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_scale.h b/editor/editor_scale.h
index 87f64598e3..95a797c9f4 100644
--- a/editor/editor_scale.h
+++ b/editor/editor_scale.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_sectioned_inspector.cpp b/editor/editor_sectioned_inspector.cpp
index 9d3ab59116..a2883690da 100644
--- a/editor/editor_sectioned_inspector.cpp
+++ b/editor/editor_sectioned_inspector.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -298,19 +298,18 @@ EditorInspector *SectionedInspector::get_inspector() {
return inspector;
}
-SectionedInspector::SectionedInspector() {
-
- obj = -1;
-
- search_box = NULL;
-
+SectionedInspector::SectionedInspector() :
+ obj(-1),
+ sections(memnew(Tree)),
+ filter(memnew(SectionedInspectorFilter)),
+ inspector(memnew(EditorInspector)),
+ search_box(NULL) {
add_constant_override("autohide", 1); // Fixes the dragger always showing up
VBoxContainer *left_vb = memnew(VBoxContainer);
left_vb->set_custom_minimum_size(Size2(170, 0) * EDSCALE);
add_child(left_vb);
- sections = memnew(Tree);
sections->set_v_size_flags(SIZE_EXPAND_FILL);
sections->set_hide_root(true);
@@ -321,8 +320,6 @@ SectionedInspector::SectionedInspector() {
right_vb->set_h_size_flags(SIZE_EXPAND_FILL);
add_child(right_vb);
- filter = memnew(SectionedInspectorFilter);
- inspector = memnew(EditorInspector);
inspector->set_v_size_flags(SIZE_EXPAND_FILL);
right_vb->add_child(inspector, true);
inspector->set_use_doc_hints(true);
diff --git a/editor/editor_sectioned_inspector.h b/editor/editor_sectioned_inspector.h
index 30d5cd3038..c32f23890f 100644
--- a/editor/editor_sectioned_inspector.h
+++ b/editor/editor_sectioned_inspector.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp
index c0b441bbd5..9973c7354e 100644
--- a/editor/editor_settings.cpp
+++ b/editor/editor_settings.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -256,6 +256,8 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
_THREAD_SAFE_METHOD_
+ /* Languages */
+
{
String lang_hint = "en";
String host_lang = OS::get_singleton()->get_locale();
@@ -291,15 +293,19 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
hints["interface/editor/editor_language"] = PropertyInfo(Variant::STRING, "interface/editor/editor_language", PROPERTY_HINT_ENUM, lang_hint, PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
}
+ /* Interface */
+
+ // Editor
_initial_set("interface/editor/display_scale", 0);
hints["interface/editor/display_scale"] = PropertyInfo(Variant::INT, "interface/editor/display_scale", PROPERTY_HINT_ENUM, "Auto,75%,100%,125%,150%,175%,200%,Custom", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
_initial_set("interface/editor/custom_display_scale", 1.0f);
hints["interface/editor/custom_display_scale"] = PropertyInfo(Variant::REAL, "interface/editor/custom_display_scale", PROPERTY_HINT_RANGE, "0.75,3,0.01", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
- _initial_set("interface/scene_tabs/show_script_button", false);
_initial_set("interface/editor/main_font_size", 14);
hints["interface/editor/main_font_size"] = PropertyInfo(Variant::INT, "interface/editor/main_font_size", PROPERTY_HINT_RANGE, "10,40,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
_initial_set("interface/editor/code_font_size", 14);
hints["interface/editor/code_font_size"] = PropertyInfo(Variant::INT, "interface/editor/code_font_size", PROPERTY_HINT_RANGE, "8,96,1", PROPERTY_USAGE_DEFAULT);
+ _initial_set("interface/editor/main_font_antialiased", true);
+ _initial_set("interface/editor/code_font_antialiased", true);
_initial_set("interface/editor/main_font_hinting", 2);
hints["interface/editor/main_font_hinting"] = PropertyInfo(Variant::INT, "interface/editor/main_font_hinting", PROPERTY_HINT_ENUM, "None,Light,Normal", PROPERTY_USAGE_DEFAULT);
_initial_set("interface/editor/code_font_hinting", 2);
@@ -315,12 +321,11 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
hints["interface/editor/dim_amount"] = PropertyInfo(Variant::REAL, "interface/editor/dim_amount", PROPERTY_HINT_RANGE, "0,1,0.01", PROPERTY_USAGE_DEFAULT);
_initial_set("interface/editor/dim_transition_time", 0.08f);
hints["interface/editor/dim_transition_time"] = PropertyInfo(Variant::REAL, "interface/editor/dim_transition_time", PROPERTY_HINT_RANGE, "0,1,0.001", PROPERTY_USAGE_DEFAULT);
-
_initial_set("interface/editor/separate_distraction_mode", false);
-
_initial_set("interface/editor/save_each_scene_on_quit", true); // Regression
_initial_set("interface/editor/quit_confirmation", true);
+ // Theme
_initial_set("interface/theme/preset", "Default");
hints["interface/theme/preset"] = PropertyInfo(Variant::STRING, "interface/theme/preset", PROPERTY_HINT_ENUM, "Default,Alien,Arc,Godot 2,Grey,Light,Solarized (Dark),Solarized (Light),Custom", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
_initial_set("interface/theme/icon_and_font_color", 0);
@@ -340,35 +345,78 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
_initial_set("interface/theme/custom_theme", "");
hints["interface/theme/custom_theme"] = PropertyInfo(Variant::STRING, "interface/theme/custom_theme", PROPERTY_HINT_GLOBAL_FILE, "*.res,*.tres,*.theme", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
+ // Scene tabs
_initial_set("interface/scene_tabs/show_extension", false);
_initial_set("interface/scene_tabs/show_thumbnail_on_hover", true);
_initial_set("interface/scene_tabs/resize_if_many_tabs", true);
_initial_set("interface/scene_tabs/minimum_width", 50);
hints["interface/scene_tabs/minimum_width"] = PropertyInfo(Variant::INT, "interface/scene_tabs/minimum_width", PROPERTY_HINT_RANGE, "50,500,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
+ _initial_set("interface/scene_tabs/show_script_button", false);
+
+ /* Filesystem */
+ // Directories
_initial_set("filesystem/directories/autoscan_project_path", "");
hints["filesystem/directories/autoscan_project_path"] = PropertyInfo(Variant::STRING, "filesystem/directories/autoscan_project_path", PROPERTY_HINT_GLOBAL_DIR);
_initial_set("filesystem/directories/default_project_path", OS::get_singleton()->has_environment("HOME") ? OS::get_singleton()->get_environment("HOME") : OS::get_singleton()->get_system_dir(OS::SYSTEM_DIR_DOCUMENTS));
hints["filesystem/directories/default_project_path"] = PropertyInfo(Variant::STRING, "filesystem/directories/default_project_path", PROPERTY_HINT_GLOBAL_DIR);
- _initial_set("filesystem/directories/default_project_export_path", "");
- hints["filesystem/directories/default_project_export_path"] = PropertyInfo(Variant::STRING, "filesystem/directories/default_project_export_path", PROPERTY_HINT_GLOBAL_DIR);
- _initial_set("interface/scene_tabs/show_script_button", false);
+ // On save
+ _initial_set("filesystem/on_save/compress_binary_resources", true);
+ _initial_set("filesystem/on_save/safe_save_on_backup_then_rename", true);
+
+ // File dialog
+ _initial_set("filesystem/file_dialog/show_hidden_files", false);
+ _initial_set("filesystem/file_dialog/display_mode", 0);
+ hints["filesystem/file_dialog/display_mode"] = PropertyInfo(Variant::INT, "filesystem/file_dialog/display_mode", PROPERTY_HINT_ENUM, "Thumbnails,List");
+ _initial_set("filesystem/file_dialog/thumbnail_size", 64);
+ hints["filesystem/file_dialog/thumbnail_size"] = PropertyInfo(Variant::INT, "filesystem/file_dialog/thumbnail_size", PROPERTY_HINT_RANGE, "32,128,16");
+
+ // Import
+ _initial_set("filesystem/import/pvrtc_texture_tool", "");
+#ifdef WINDOWS_ENABLED
+ hints["filesystem/import/pvrtc_texture_tool"] = PropertyInfo(Variant::STRING, "filesystem/import/pvrtc_texture_tool", PROPERTY_HINT_GLOBAL_FILE, "*.exe");
+#else
+ hints["filesystem/import/pvrtc_texture_tool"] = PropertyInfo(Variant::STRING, "filesystem/import/pvrtc_texture_tool", PROPERTY_HINT_GLOBAL_FILE, "");
+#endif
+ _initial_set("filesystem/import/pvrtc_fast_conversion", false);
+
+ /* Docks */
+
+ // SceneTree
+ _initial_set("docks/scene_tree/start_create_dialog_fully_expanded", false);
+ _initial_set("docks/scene_tree/draw_relationship_lines", true);
+ _initial_set("docks/scene_tree/relationship_line_color", Color::html("464646"));
+
+ // FileSystem
+ _initial_set("docks/filesystem/display_mode", 0);
+ hints["docks/filesystem/display_mode"] = PropertyInfo(Variant::INT, "docks/filesystem/display_mode", PROPERTY_HINT_ENUM, "Tree only, Split");
+ _initial_set("docks/filesystem/thumbnail_size", 64);
+ hints["docks/filesystem/thumbnail_size"] = PropertyInfo(Variant::INT, "docks/filesystem/thumbnail_size", PROPERTY_HINT_RANGE, "32,128,16");
+ _initial_set("docks/filesystem/files_display_mode", 0);
+ hints["docks/filesystem/files_display_mode"] = PropertyInfo(Variant::INT, "docks/filesystem/files_display_mode", PROPERTY_HINT_ENUM, "Thumbnails,List");
+ _initial_set("docks/filesystem/always_show_folders", true);
+
+ // Property editor
+ _initial_set("docks/property_editor/auto_refresh_interval", 0.3);
+
+ /* Text editor */
+
+ // Theme
_initial_set("text_editor/theme/color_theme", "Adaptive");
hints["text_editor/theme/color_theme"] = PropertyInfo(Variant::STRING, "text_editor/theme/color_theme", PROPERTY_HINT_ENUM, "Adaptive,Default,Custom");
-
_initial_set("text_editor/theme/line_spacing", 6);
_initial_set("text_editor/theme/selection_color", Color::html("40808080"));
_load_default_text_editor_theme();
+ // Highlighting
_initial_set("text_editor/highlighting/syntax_highlighting", true);
-
_initial_set("text_editor/highlighting/highlight_all_occurrences", true);
_initial_set("text_editor/highlighting/highlight_current_line", true);
_initial_set("text_editor/highlighting/highlight_type_safe_lines", true);
- _initial_set("text_editor/cursor/scroll_past_end_of_file", false);
+ // Indent
_initial_set("text_editor/indent/type", 0);
hints["text_editor/indent/type"] = PropertyInfo(Variant::INT, "text_editor/indent/type", PROPERTY_HINT_ENUM, "Tabs,Spaces");
_initial_set("text_editor/indent/size", 4);
@@ -377,6 +425,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
_initial_set("text_editor/indent/convert_indent_on_save", false);
_initial_set("text_editor/indent/draw_tabs", true);
+ // Line numbers
_initial_set("text_editor/line_numbers/show_line_numbers", true);
_initial_set("text_editor/line_numbers/line_numbers_zero_padded", false);
_initial_set("text_editor/line_numbers/show_breakpoint_gutter", true);
@@ -386,35 +435,45 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
_initial_set("text_editor/line_numbers/line_length_guideline_column", 80);
hints["text_editor/line_numbers/line_length_guideline_column"] = PropertyInfo(Variant::INT, "text_editor/line_numbers/line_length_guideline_column", PROPERTY_HINT_RANGE, "20, 160, 1");
+ // Open scripts
_initial_set("text_editor/open_scripts/smooth_scrolling", true);
_initial_set("text_editor/open_scripts/v_scroll_speed", 80);
_initial_set("text_editor/open_scripts/show_members_overview", true);
+ // Files
_initial_set("text_editor/files/trim_trailing_whitespace_on_save", false);
- _initial_set("text_editor/completion/idle_parse_delay", 2);
+ _initial_set("text_editor/files/autosave_interval_secs", 0);
+ _initial_set("text_editor/files/restore_scripts_on_load", true);
+
+ // Tools
_initial_set("text_editor/tools/create_signal_callbacks", true);
_initial_set("text_editor/tools/sort_members_outline_alphabetically", false);
- _initial_set("text_editor/files/autosave_interval_secs", 0);
+ // Cursor
+ _initial_set("text_editor/cursor/scroll_past_end_of_file", false);
_initial_set("text_editor/cursor/block_caret", false);
_initial_set("text_editor/cursor/caret_blink", true);
_initial_set("text_editor/cursor/caret_blink_speed", 0.5);
hints["text_editor/cursor/caret_blink_speed"] = PropertyInfo(Variant::REAL, "text_editor/cursor/caret_blink_speed", PROPERTY_HINT_RANGE, "0.1, 10, 0.01");
_initial_set("text_editor/cursor/right_click_moves_caret", true);
+ // Completion
+ _initial_set("text_editor/completion/idle_parse_delay", 2);
_initial_set("text_editor/completion/auto_brace_complete", false);
_initial_set("text_editor/completion/put_callhint_tooltip_below_current_line", true);
_initial_set("text_editor/completion/callhint_tooltip_offset", Vector2());
- _initial_set("text_editor/files/restore_scripts_on_load", true);
_initial_set("text_editor/completion/complete_file_paths", true);
_initial_set("text_editor/completion/add_type_hints", false);
- _initial_set("docks/scene_tree/start_create_dialog_fully_expanded", false);
- _initial_set("docks/scene_tree/draw_relationship_lines", true);
- _initial_set("docks/scene_tree/relationship_line_color", Color::html("464646"));
+ // Help
+ _initial_set("text_editor/help/show_help_index", true);
+ /* Editors */
+
+ // GridMap
_initial_set("editors/grid_map/pick_distance", 5000.0);
+ // 3D
_initial_set("editors/3d/primary_grid_color", Color::html("909090"));
hints["editors/3d/primary_grid_color"] = PropertyInfo(Variant::COLOR, "editors/3d/primary_grid_color", PROPERTY_HINT_COLOR_NO_ALPHA, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
@@ -431,7 +490,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
_initial_set("editors/3d/default_z_near", 0.05);
_initial_set("editors/3d/default_z_far", 500.0);
- // navigation
+ // 3D: Navigation
_initial_set("editors/3d/navigation/navigation_scheme", 0);
_initial_set("editors/3d/navigation/invert_y_axis", false);
hints["editors/3d/navigation/navigation_scheme"] = PropertyInfo(Variant::INT, "editors/3d/navigation/navigation_scheme", PROPERTY_HINT_ENUM, "Godot,Maya,Modo");
@@ -445,14 +504,11 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
hints["editors/3d/navigation/pan_modifier"] = PropertyInfo(Variant::INT, "editors/3d/navigation/pan_modifier", PROPERTY_HINT_ENUM, "None,Shift,Alt,Meta,Ctrl");
_initial_set("editors/3d/navigation/zoom_modifier", 4);
hints["editors/3d/navigation/zoom_modifier"] = PropertyInfo(Variant::INT, "editors/3d/navigation/zoom_modifier", PROPERTY_HINT_ENUM, "None,Shift,Alt,Meta,Ctrl");
-
- // _initial_set("editors/3d/navigation/emulate_numpad", false); not used at the moment
_initial_set("editors/3d/navigation/warped_mouse_panning", true);
- // navigation feel
+ // 3D: Navigation feel
_initial_set("editors/3d/navigation_feel/orbit_sensitivity", 0.4);
hints["editors/3d/navigation_feel/orbit_sensitivity"] = PropertyInfo(Variant::REAL, "editors/3d/navigation_feel/orbit_sensitivity", PROPERTY_HINT_RANGE, "0.0, 2, 0.01");
-
_initial_set("editors/3d/navigation_feel/orbit_inertia", 0.05);
hints["editors/3d/navigation_feel/orbit_inertia"] = PropertyInfo(Variant::REAL, "editors/3d/navigation_feel/orbit_inertia", PROPERTY_HINT_RANGE, "0.0, 1, 0.01");
_initial_set("editors/3d/navigation_feel/translation_inertia", 0.15);
@@ -464,7 +520,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
_initial_set("editors/3d/navigation_feel/manipulation_translation_inertia", 0.075);
hints["editors/3d/navigation_feel/manipulation_translation_inertia"] = PropertyInfo(Variant::REAL, "editors/3d/navigation_feel/manipulation_translation_inertia", PROPERTY_HINT_RANGE, "0.0, 1, 0.01");
- // freelook
+ // 3D: Freelook
_initial_set("editors/3d/freelook/freelook_inertia", 0.1);
hints["editors/3d/freelook/freelook_inertia"] = PropertyInfo(Variant::REAL, "editors/3d/freelook/freelook_inertia", PROPERTY_HINT_RANGE, "0.0, 1, 0.01");
_initial_set("editors/3d/freelook/freelook_base_speed", 5.0);
@@ -475,6 +531,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
hints["editors/3d/freelook/freelook_modifier_speed_factor"] = PropertyInfo(Variant::REAL, "editors/3d/freelook/freelook_modifier_speed_factor", PROPERTY_HINT_RANGE, "0.0, 10.0, 0.1");
_initial_set("editors/3d/freelook/freelook_speed_zoom_link", false);
+ // 2D
_initial_set("editors/2d/grid_color", Color(1.0, 1.0, 1.0, 0.07));
_initial_set("editors/2d/guides_color", Color(0.6, 0.0, 0.8));
_initial_set("editors/2d/bone_width", 5);
@@ -491,9 +548,19 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
_initial_set("editors/2d/scroll_to_pan", false);
_initial_set("editors/2d/pan_speed", 20);
+ // Polygon editor
_initial_set("editors/poly_editor/point_grab_radius", 8);
_initial_set("editors/poly_editor/show_previous_outline", true);
+ // Animation
+ _initial_set("editors/animation/autorename_animation_tracks", true);
+ _initial_set("editors/animation/confirm_insert_track", true);
+ _initial_set("editors/animation/onion_layers_past_color", Color(1, 0, 0));
+ _initial_set("editors/animation/onion_layers_future_color", Color(0, 1, 0));
+
+ /* Run */
+
+ // Window placement
_initial_set("run/window_placement/rect", 1);
hints["run/window_placement/rect"] = PropertyInfo(Variant::INT, "run/window_placement/rect", PROPERTY_HINT_ENUM, "Top Left,Centered,Custom Position,Force Maximized,Force Fullscreen");
String screen_hints = "Same as Editor,Previous Monitor,Next Monitor";
@@ -504,54 +571,18 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
_initial_set("run/window_placement/screen", 0);
hints["run/window_placement/screen"] = PropertyInfo(Variant::INT, "run/window_placement/screen", PROPERTY_HINT_ENUM, screen_hints);
- _initial_set("filesystem/on_save/compress_binary_resources", true);
- _initial_set("filesystem/on_save/save_modified_external_resources", true);
-
- _initial_set("text_editor/tools/create_signal_callbacks", true);
-
- _initial_set("filesystem/file_dialog/show_hidden_files", false);
- _initial_set("filesystem/file_dialog/display_mode", 0);
- hints["filesystem/file_dialog/display_mode"] = PropertyInfo(Variant::INT, "filesystem/file_dialog/display_mode", PROPERTY_HINT_ENUM, "Thumbnails,List");
-
- _initial_set("filesystem/file_dialog/thumbnail_size", 64);
- hints["filesystem/file_dialog/thumbnail_size"] = PropertyInfo(Variant::INT, "filesystem/file_dialog/thumbnail_size", PROPERTY_HINT_RANGE, "32,128,16");
-
- _initial_set("docks/filesystem/display_mode", 0);
- hints["docks/filesystem/display_mode"] = PropertyInfo(Variant::INT, "docks/filesystem/display_mode", PROPERTY_HINT_ENUM, "Tree only, Split");
- _initial_set("docks/filesystem/thumbnail_size", 64);
- hints["docks/filesystem/thumbnail_size"] = PropertyInfo(Variant::INT, "docks/filesystem/thumbnail_size", PROPERTY_HINT_RANGE, "32,128,16");
- _initial_set("docks/filesystem/files_display_mode", 0);
- hints["docks/filesystem/files_display_mode"] = PropertyInfo(Variant::INT, "docks/filesystem/files_display_mode", PROPERTY_HINT_ENUM, "Thumbnails,List");
- _initial_set("docks/filesystem/always_show_folders", true);
-
- _initial_set("editors/animation/autorename_animation_tracks", true);
- _initial_set("editors/animation/confirm_insert_track", true);
- _initial_set("editors/animation/onion_layers_past_color", Color(1, 0, 0));
- _initial_set("editors/animation/onion_layers_future_color", Color(0, 1, 0));
-
- _initial_set("docks/property_editor/texture_preview_width", 48);
- _initial_set("docks/property_editor/auto_refresh_interval", 0.3);
- _initial_set("text_editor/help/show_help_index", true);
-
- _initial_set("filesystem/import/ask_save_before_reimport", false);
-
- _initial_set("filesystem/import/pvrtc_texture_tool", "");
-#ifdef WINDOWS_ENABLED
- hints["filesystem/import/pvrtc_texture_tool"] = PropertyInfo(Variant::STRING, "filesystem/import/pvrtc_texture_tool", PROPERTY_HINT_GLOBAL_FILE, "*.exe");
-#else
- hints["filesystem/import/pvrtc_texture_tool"] = PropertyInfo(Variant::STRING, "filesystem/import/pvrtc_texture_tool", PROPERTY_HINT_GLOBAL_FILE, "");
-#endif
- _initial_set("filesystem/import/pvrtc_fast_conversion", false);
-
+ // Auto save
_initial_set("run/auto_save/save_before_running", true);
+
+ // Output
_initial_set("run/output/always_clear_output_on_play", true);
_initial_set("run/output/always_open_output_on_play", true);
_initial_set("run/output/always_close_output_on_stop", false);
- _initial_set("filesystem/resources/save_compressed_resources", true);
- _initial_set("filesystem/resources/auto_reload_modified_images", true);
- _initial_set("filesystem/import/automatic_reimport_on_sources_changed", true);
- _initial_set("filesystem/on_save/safe_save_on_backup_then_rename", true);
+ /* Extra config */
+
+ _initial_set("project_manager/sorting_order", 0);
+ hints["project_manager/sorting_order"] = PropertyInfo(Variant::INT, "project_manager/sorting_order", PROPERTY_HINT_ENUM, "Name,Last Modified");
if (p_extra_config.is_valid()) {
diff --git a/editor/editor_settings.h b/editor/editor_settings.h
index 7b0de9617c..1b44c15c54 100644
--- a/editor/editor_settings.h
+++ b/editor/editor_settings.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -71,23 +71,23 @@ private:
bool hide_from_editor;
bool save;
bool restart_if_changed;
- VariantContainer() {
- variant = Variant();
- initial = Variant();
- order = 0;
- hide_from_editor = false;
- has_default_value = false;
- save = false;
- restart_if_changed = false;
+ VariantContainer() :
+ order(0),
+ variant(Variant()),
+ initial(Variant()),
+ has_default_value(false),
+ hide_from_editor(false),
+ save(false),
+ restart_if_changed(false) {
}
- VariantContainer(const Variant &p_variant, int p_order) {
- variant = p_variant;
- initial = Variant();
- order = p_order;
- hide_from_editor = false;
- has_default_value = false;
- save = false;
- restart_if_changed = false;
+ VariantContainer(const Variant &p_variant, int p_order) :
+ order(p_order),
+ variant(p_variant),
+ initial(Variant()),
+ has_default_value(false),
+ hide_from_editor(false),
+ save(false),
+ restart_if_changed(false) {
}
};
diff --git a/editor/editor_spin_slider.cpp b/editor/editor_spin_slider.cpp
index b6e4375ce9..927ef9ab52 100644
--- a/editor/editor_spin_slider.cpp
+++ b/editor/editor_spin_slider.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -63,6 +63,7 @@ void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) {
grabbing_spinner_attempt = true;
grabbing_spinner_dist_cache = 0;
+ pre_grab_value = get_value();
grabbing_spinner = false;
grabbing_spinner_mouse_pos = Input::get_singleton()->get_mouse_position();
}
@@ -107,10 +108,10 @@ void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) {
if (ABS(grabbing_spinner_dist_cache) > 6) {
set_value(get_value() + SGN(grabbing_spinner_dist_cache));
grabbing_spinner_dist_cache = 0;
+ pre_grab_value = get_value();
}
} else {
- set_value(get_value() + get_step() * grabbing_spinner_dist_cache * 10);
- grabbing_spinner_dist_cache = 0;
+ set_value(pre_grab_value + get_step() * grabbing_spinner_dist_cache * 10);
}
}
} else if (updown_offset != -1) {
@@ -154,7 +155,9 @@ void EditorSpinSlider::_grabber_gui_input(const Ref<InputEvent> &p_event) {
void EditorSpinSlider::_notification(int p_what) {
- if (p_what == MainLoop::NOTIFICATION_WM_FOCUS_OUT || p_what == MainLoop::NOTIFICATION_WM_FOCUS_OUT) {
+ if (p_what == MainLoop::NOTIFICATION_WM_FOCUS_OUT ||
+ p_what == MainLoop::NOTIFICATION_WM_FOCUS_IN ||
+ p_what == NOTIFICATION_EXIT_TREE) {
if (grabbing_spinner) {
Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE);
grabbing_spinner = false;
@@ -434,6 +437,7 @@ EditorSpinSlider::EditorSpinSlider() {
grabbing_spinner_attempt = false;
grabbing_spinner = false;
grabbing_spinner_dist_cache = 0;
+ pre_grab_value = 0;
set_focus_mode(FOCUS_ALL);
updown_offset = -1;
hover_updown = false;
diff --git a/editor/editor_spin_slider.h b/editor/editor_spin_slider.h
index e48eb171b8..ceff878e7f 100644
--- a/editor/editor_spin_slider.h
+++ b/editor/editor_spin_slider.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -59,6 +59,7 @@ class EditorSpinSlider : public Range {
bool read_only;
float grabbing_spinner_dist_cache;
Vector2 grabbing_spinner_mouse_pos;
+ double pre_grab_value;
LineEdit *value_input;
bool value_input_just_closed;
diff --git a/editor/editor_sub_scene.cpp b/editor/editor_sub_scene.cpp
index 7036a0ddaa..6a0a151aa9 100644
--- a/editor/editor_sub_scene.cpp
+++ b/editor/editor_sub_scene.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_sub_scene.h b/editor/editor_sub_scene.h
index 202ba03cea..69efc2be20 100644
--- a/editor/editor_sub_scene.h
+++ b/editor/editor_sub_scene.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp
index 36053d7534..31655fed87 100644
--- a/editor/editor_themes.cpp
+++ b/editor/editor_themes.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -351,18 +351,18 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
theme->set_color("mono_color", "Editor", mono_color);
- Color success_color = accent_color.linear_interpolate(Color(0.2, 1, 0.2), 0.6) * 1.2;
- Color warning_color = accent_color.linear_interpolate(Color(1, 1, 0), 0.7) * 1.0;
- Color error_color = accent_color.linear_interpolate(Color(1, 0, 0), 0.8) * 1.7;
+ Color success_color = Color(0.45, 0.95, 0.5);
+ Color warning_color = Color(1, 0.87, 0.4);
+ Color error_color = Color(1, 0.47, 0.42);
Color property_color = font_color.linear_interpolate(Color(0.5, 0.5, 0.5), 0.5);
if (!dark_theme) {
- // yellow on white themes is a P.I.T.A.
- warning_color = accent_color.linear_interpolate(Color(0.9, 0.7, 0), 0.9);
- warning_color = warning_color.linear_interpolate(mono_color, 0.2);
- success_color = success_color.linear_interpolate(mono_color, 0.2);
- error_color = error_color.linear_interpolate(mono_color, 0.2);
+ // Darken some colors to be readable on a light background
+ success_color = success_color.linear_interpolate(mono_color, 0.35);
+ warning_color = warning_color.linear_interpolate(mono_color, 0.35);
+ error_color = error_color.linear_interpolate(mono_color, 0.25);
}
+
theme->set_color("success_color", "Editor", success_color);
theme->set_color("warning_color", "Editor", warning_color);
theme->set_color("error_color", "Editor", error_color);
@@ -994,6 +994,14 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
graphsbposition->set_draw_center(false);
graphsbposition->set_border_color_all(error_color);
graphsbposition->set_shadow_color(error_color * Color(1.0, 1.0, 1.0, 0.2));
+ Ref<StyleBoxFlat> smgraphsb = make_flat_stylebox(Color(mv, mv, mv, 0.7), gn_margin_side, 24, gn_margin_side, 5);
+ smgraphsb->set_border_width_all(border_width);
+ smgraphsb->set_border_color_all(Color(mv2, mv2, mv2, 0.9));
+ Ref<StyleBoxFlat> smgraphsbselected = make_flat_stylebox(Color(mv, mv, mv, 0.9), gn_margin_side, 24, gn_margin_side, 5);
+ smgraphsbselected->set_border_width_all(border_width);
+ smgraphsbselected->set_border_color_all(Color(accent_color.r, accent_color.g, accent_color.b, 0.9));
+ smgraphsbselected->set_shadow_size(8 * EDSCALE);
+ smgraphsbselected->set_shadow_color(shadow_color);
if (use_gn_headers) {
graphsb->set_border_width(MARGIN_TOP, 24 * EDSCALE);
@@ -1008,6 +1016,8 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
theme->set_stylebox("commentfocus", "GraphNode", graphsbcommentselected);
theme->set_stylebox("breakpoint", "GraphNode", graphsbbreakpoint);
theme->set_stylebox("position", "GraphNode", graphsbposition);
+ theme->set_stylebox("state_machine_frame", "GraphNode", smgraphsb);
+ theme->set_stylebox("state_machine_selectedframe", "GraphNode", smgraphsbselected);
Color default_node_color = Color(mv2, mv2, mv2);
theme->set_color("title_color", "GraphNode", default_node_color);
diff --git a/editor/editor_themes.h b/editor/editor_themes.h
index 7d8d3a5308..bd1f260ba6 100644
--- a/editor/editor_themes.h
+++ b/editor/editor_themes.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/export_template_manager.cpp b/editor/export_template_manager.cpp
index 52611367f6..ce1d545510 100644
--- a/editor/export_template_manager.cpp
+++ b/editor/export_template_manager.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/export_template_manager.h b/editor/export_template_manager.h
index bd43fe5dc5..2edd3db6d7 100644
--- a/editor/export_template_manager.h
+++ b/editor/export_template_manager.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/file_type_cache.cpp b/editor/file_type_cache.cpp
index 0e328247ac..1bcbc45d3b 100644
--- a/editor/file_type_cache.cpp
+++ b/editor/file_type_cache.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/file_type_cache.h b/editor/file_type_cache.h
index aa2d78f763..87e2e40a02 100644
--- a/editor/file_type_cache.h
+++ b/editor/file_type_cache.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/fileserver/editor_file_server.cpp b/editor/fileserver/editor_file_server.cpp
index 306f047860..3b402407df 100644
--- a/editor/fileserver/editor_file_server.cpp
+++ b/editor/fileserver/editor_file_server.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/fileserver/editor_file_server.h b/editor/fileserver/editor_file_server.h
index 8e32c3c82f..04efb6b09c 100644
--- a/editor/fileserver/editor_file_server.h
+++ b/editor/fileserver/editor_file_server.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp
index 828e608fa4..1ac66fdd1d 100644
--- a/editor/filesystem_dock.cpp
+++ b/editor/filesystem_dock.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -51,7 +51,7 @@ Ref<Texture> FileSystemDock::_get_tree_item_icon(EditorFileSystemDirectory *p_di
return file_icon;
}
-bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory *p_dir, Vector<String> &uncollapsed_paths) {
+bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory *p_dir, Vector<String> &uncollapsed_paths, bool p_select_in_favorites) {
bool parent_should_expand = false;
@@ -66,7 +66,7 @@ bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory
subdirectory_item->set_selectable(0, true);
String lpath = p_dir->get_path();
subdirectory_item->set_metadata(0, lpath);
- if (path == lpath || ((display_mode_setting == DISPLAY_MODE_SETTING_SPLIT) && path.get_base_dir() == lpath)) {
+ if (!p_select_in_favorites && (path == lpath || ((display_mode_setting == DISPLAY_MODE_SETTING_SPLIT) && path.get_base_dir() == lpath))) {
subdirectory_item->select(0);
}
@@ -81,7 +81,7 @@ bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory
// Create items for all subdirectories
for (int i = 0; i < p_dir->get_subdir_count(); i++)
- parent_should_expand = (_create_tree(subdirectory_item, p_dir->get_subdir(i), uncollapsed_paths) || parent_should_expand);
+ parent_should_expand = (_create_tree(subdirectory_item, p_dir->get_subdir(i), uncollapsed_paths, p_select_in_favorites) || parent_should_expand);
// Create all items for the files in the subdirectory
if (display_mode_setting == DISPLAY_MODE_SETTING_TREE_ONLY) {
@@ -103,7 +103,7 @@ bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory
file_item->set_icon(0, _get_tree_item_icon(p_dir, i));
String file_metadata = lpath.plus_file(file_name);
file_item->set_metadata(0, file_metadata);
- if (path == file_metadata) {
+ if (!p_select_in_favorites && path == file_metadata) {
file_item->select(0);
file_item->set_as_cursor(0);
}
@@ -156,7 +156,7 @@ Vector<String> FileSystemDock::_compute_uncollapsed_paths() {
return uncollapsed_paths;
}
-void FileSystemDock::_update_tree(const Vector<String> p_uncollapsed_paths, bool p_uncollapse_root) {
+void FileSystemDock::_update_tree(const Vector<String> p_uncollapsed_paths, bool p_uncollapse_root, bool p_select_in_favorites) {
// Recreate the tree
tree->clear();
@@ -205,6 +205,10 @@ void FileSystemDock::_update_tree(const Vector<String> p_uncollapsed_paths, bool
ti->set_tooltip(0, fave);
ti->set_selectable(0, true);
ti->set_metadata(0, fave);
+ if (p_select_in_favorites && fave == path) {
+ ti->select(0);
+ ti->set_as_cursor(0);
+ }
if (!fave.ends_with("/")) {
Array udata;
udata.push_back(tree_update_id);
@@ -220,7 +224,7 @@ void FileSystemDock::_update_tree(const Vector<String> p_uncollapsed_paths, bool
}
// Create the remaining of the tree
- _create_tree(root, EditorFileSystem::get_singleton()->get_filesystem(), uncollapsed_paths);
+ _create_tree(root, EditorFileSystem::get_singleton()->get_filesystem(), uncollapsed_paths, p_select_in_favorites);
tree->ensure_cursor_is_visible();
updating_tree = false;
}
@@ -296,7 +300,7 @@ void FileSystemDock::_notification(int p_what) {
file_list_popup->connect("id_pressed", this, "_file_list_rmb_option");
tree_popup->connect("id_pressed", this, "_tree_rmb_option");
- current_path->connect("text_entered", this, "navigate_to_path");
+ current_path->connect("text_entered", this, "_navigate_to_path");
display_mode_setting = DisplayModeSetting(int(EditorSettings::get_singleton()->get("docks/filesystem/display_mode")));
always_show_folders = bool(EditorSettings::get_singleton()->get("docks/filesystem/always_show_folders"));
@@ -442,8 +446,7 @@ void FileSystemDock::_set_current_path_text(const String &p_path) {
}
}
-void FileSystemDock::navigate_to_path(const String &p_path) {
-
+void FileSystemDock::_navigate_to_path(const String &p_path, bool p_select_in_favorites) {
if (p_path == "Favorites") {
path = p_path;
} else {
@@ -466,7 +469,7 @@ void FileSystemDock::navigate_to_path(const String &p_path) {
_set_current_path_text(path);
_push_to_history();
- _update_tree(_compute_uncollapsed_paths());
+ _update_tree(_compute_uncollapsed_paths(), false, p_select_in_favorites);
if (display_mode == DISPLAY_MODE_SPLIT) {
_update_file_list(false);
}
@@ -483,6 +486,10 @@ void FileSystemDock::navigate_to_path(const String &p_path) {
}
}
+void FileSystemDock::navigate_to_path(const String &p_path) {
+ _navigate_to_path(p_path);
+}
+
void FileSystemDock::_file_list_thumbnail_done(const String &p_path, const Ref<Texture> &p_preview, const Ref<Texture> &p_small_preview, const Variant &p_udata) {
if ((file_list_vb->is_visible_in_tree() || path == p_path.get_base_dir()) && p_preview.is_valid()) {
@@ -790,7 +797,7 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) {
}
}
-void FileSystemDock::_select_file(const String p_path) {
+void FileSystemDock::_select_file(const String p_path, bool p_select_in_favorites) {
String fpath = p_path;
if (fpath.ends_with("/")) {
if (fpath != "res://") {
@@ -803,17 +810,21 @@ void FileSystemDock::_select_file(const String p_path) {
editor->load_resource(fpath);
}
}
- navigate_to_path(fpath);
+ _navigate_to_path(fpath, p_select_in_favorites);
}
void FileSystemDock::_tree_activate_file() {
TreeItem *selected = tree->get_selected();
if (selected) {
- call_deferred("_select_file", selected->get_metadata(0));
+ String path = selected->get_metadata(0);
+ TreeItem *parent = selected->get_parent();
+ bool is_favorite = parent != NULL && parent->get_metadata(0) == "Favorites";
- if (path.ends_with("/") || path == "Favorites") {
+ if ((!is_favorite && path.ends_with("/")) || path == "Favorites") {
bool collapsed = selected->is_collapsed();
selected->set_collapsed(!collapsed);
+ } else {
+ _select_file(path, is_favorite && !path.ends_with("/"));
}
}
}
@@ -951,7 +962,7 @@ void FileSystemDock::_find_remaps(EditorFileSystemDirectory *efsd, const Map<Str
}
void FileSystemDock::_try_move_item(const FileOrFolder &p_item, const String &p_new_path,
- Map<String, String> &p_file_renames, Map<String, String> &p_folder_renames) const {
+ Map<String, String> &p_file_renames, Map<String, String> &p_folder_renames) {
//Ensure folder paths end with "/"
String old_path = (p_item.is_file || p_item.path.ends_with("/")) ? p_item.path : (p_item.path + "/");
String new_path = (p_item.is_file || p_new_path.ends_with("/")) ? p_new_path : (p_new_path + "/");
@@ -981,6 +992,7 @@ void FileSystemDock::_try_move_item(const FileOrFolder &p_item, const String &p_
print_verbose("Moving " + old_path + " -> " + new_path);
Error err = da->rename(old_path, new_path);
if (err == OK) {
+
//Move/Rename any corresponding import settings too
if (p_item.is_file && FileAccess::exists(old_path + ".import")) {
err = da->rename(old_path + ".import", new_path + ".import");
@@ -1007,9 +1019,11 @@ void FileSystemDock::_try_move_item(const FileOrFolder &p_item, const String &p_
for (int i = 0; i < file_changed_paths.size(); ++i) {
p_file_renames[file_changed_paths[i]] = file_changed_paths[i].replace_first(old_path, new_path);
print_verbose(" Remap: " + file_changed_paths[i] + " -> " + p_file_renames[file_changed_paths[i]]);
+ emit_signal("files_moved", file_changed_paths[i], p_file_renames[file_changed_paths[i]]);
}
for (int i = 0; i < folder_changed_paths.size(); ++i) {
p_folder_renames[folder_changed_paths[i]] = folder_changed_paths[i].replace_first(old_path, new_path);
+ emit_signal("folder_moved", folder_changed_paths[i], p_folder_renames[folder_changed_paths[i]].substr(0, p_folder_renames[folder_changed_paths[i]].length() - 1));
}
} else {
EditorNode::get_singleton()->add_io_error(TTR("Error moving:") + "\n" + old_path + "\n");
@@ -1177,7 +1191,7 @@ void FileSystemDock::_make_dir_confirm() {
String dir_name = make_dir_dialog_text->get_text().strip_edges();
if (dir_name.length() == 0) {
- EditorNode::get_singleton()->show_warning(TTR("No name provided"));
+ EditorNode::get_singleton()->show_warning(TTR("No name provided."));
return;
} else if (dir_name.find("/") != -1 || dir_name.find("\\") != -1 || dir_name.find(":") != -1 || dir_name.find("*") != -1 ||
dir_name.find("|") != -1 || dir_name.find(">") != -1 || dir_name.ends_with(".") || dir_name.ends_with(" ")) {
@@ -1205,6 +1219,14 @@ void FileSystemDock::_make_dir_confirm() {
}
}
+void FileSystemDock::_file_deleted(String p_file) {
+ emit_signal("file_deleted", p_file);
+}
+
+void FileSystemDock::_folder_deleted(String p_folder) {
+ emit_signal("folder_deleted", p_folder);
+}
+
void FileSystemDock::_rename_operation_confirm() {
String new_name = rename_dialog_text->get_text().strip_edges();
@@ -2130,7 +2152,7 @@ void FileSystemDock::_file_list_rmb_pressed(const Vector2 &p_pos) {
void FileSystemDock::select_file(const String &p_file) {
- navigate_to_path(p_file);
+ _navigate_to_path(p_file);
}
void FileSystemDock::_file_multi_selected(int p_index, bool p_selected) {
@@ -2273,12 +2295,15 @@ void FileSystemDock::_bind_methods() {
ClassDB::bind_method(D_METHOD("_file_list_rmb_select"), &FileSystemDock::_file_list_rmb_select);
ClassDB::bind_method(D_METHOD("_file_list_rmb_pressed"), &FileSystemDock::_file_list_rmb_pressed);
+ ClassDB::bind_method(D_METHOD("_file_deleted"), &FileSystemDock::_file_deleted);
+ ClassDB::bind_method(D_METHOD("_folder_deleted"), &FileSystemDock::_folder_deleted);
+
ClassDB::bind_method(D_METHOD("_file_list_thumbnail_done"), &FileSystemDock::_file_list_thumbnail_done);
ClassDB::bind_method(D_METHOD("_tree_thumbnail_done"), &FileSystemDock::_tree_thumbnail_done);
ClassDB::bind_method(D_METHOD("_file_list_activate_file"), &FileSystemDock::_file_list_activate_file);
ClassDB::bind_method(D_METHOD("_tree_activate_file"), &FileSystemDock::_tree_activate_file);
ClassDB::bind_method(D_METHOD("_select_file"), &FileSystemDock::_select_file);
- ClassDB::bind_method(D_METHOD("navigate_to_path"), &FileSystemDock::navigate_to_path);
+ ClassDB::bind_method(D_METHOD("_navigate_to_path"), &FileSystemDock::_navigate_to_path);
ClassDB::bind_method(D_METHOD("_change_file_display"), &FileSystemDock::_change_file_display);
ClassDB::bind_method(D_METHOD("_fw_history"), &FileSystemDock::_fw_history);
ClassDB::bind_method(D_METHOD("_bw_history"), &FileSystemDock::_bw_history);
@@ -2296,6 +2321,7 @@ void FileSystemDock::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_drag_data_fw"), &FileSystemDock::get_drag_data_fw);
ClassDB::bind_method(D_METHOD("can_drop_data_fw"), &FileSystemDock::can_drop_data_fw);
ClassDB::bind_method(D_METHOD("drop_data_fw"), &FileSystemDock::drop_data_fw);
+ ClassDB::bind_method(D_METHOD("navigate_to_path"), &FileSystemDock::navigate_to_path);
ClassDB::bind_method(D_METHOD("_preview_invalidated"), &FileSystemDock::_preview_invalidated);
ClassDB::bind_method(D_METHOD("_file_multi_selected"), &FileSystemDock::_file_multi_selected);
@@ -2303,6 +2329,11 @@ void FileSystemDock::_bind_methods() {
ADD_SIGNAL(MethodInfo("instance", PropertyInfo(Variant::POOL_STRING_ARRAY, "files")));
ADD_SIGNAL(MethodInfo("open"));
+
+ ADD_SIGNAL(MethodInfo("file_removed", PropertyInfo(Variant::STRING, "file")));
+ ADD_SIGNAL(MethodInfo("folder_removed", PropertyInfo(Variant::STRING, "folder")));
+ ADD_SIGNAL(MethodInfo("files_moved", PropertyInfo(Variant::STRING, "old_file"), PropertyInfo(Variant::STRING, "new_file")));
+ ADD_SIGNAL(MethodInfo("folder_moved", PropertyInfo(Variant::STRING, "old_folder"), PropertyInfo(Variant::STRING, "new_file")));
}
FileSystemDock::FileSystemDock(EditorNode *p_editor) {
@@ -2464,6 +2495,8 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
add_child(owners_editor);
remove_dialog = memnew(DependencyRemoveDialog);
+ remove_dialog->connect("file_removed", this, "_file_deleted");
+ remove_dialog->connect("folder_removed", this, "_folder_deleted");
add_child(remove_dialog);
move_dialog = memnew(EditorDirDialog);
diff --git a/editor/filesystem_dock.h b/editor/filesystem_dock.h
index df6fa5f9d2..237413acc4 100644
--- a/editor/filesystem_dock.h
+++ b/editor/filesystem_dock.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -178,9 +178,10 @@ private:
bool import_dock_needs_update;
Ref<Texture> _get_tree_item_icon(EditorFileSystemDirectory *p_dir, int p_idx);
- bool _create_tree(TreeItem *p_parent, EditorFileSystemDirectory *p_dir, Vector<String> &uncollapsed_paths);
+ bool _create_tree(TreeItem *p_parent, EditorFileSystemDirectory *p_dir, Vector<String> &uncollapsed_paths, bool p_select_in_favorites);
Vector<String> _compute_uncollapsed_paths();
- void _update_tree(const Vector<String> p_uncollapsed_paths = Vector<String>(), bool p_uncollapse_root = false);
+ void _update_tree(const Vector<String> p_uncollapsed_paths = Vector<String>(), bool p_uncollapse_root = false, bool p_select_in_favorites = false);
+ void _navigate_to_path(const String &p_path, bool p_select_in_favorites = false);
void _file_list_gui_input(Ref<InputEvent> p_event);
void _tree_gui_input(Ref<InputEvent> p_event);
@@ -192,7 +193,7 @@ private:
void _tree_toggle_collapsed();
- void _select_file(const String p_path);
+ void _select_file(const String p_path, bool p_select_in_favorites = false);
void _tree_activate_file();
void _file_list_activate_file(int p_idx);
void _file_multi_selected(int p_index, bool p_selected);
@@ -202,13 +203,18 @@ private:
void _get_all_items_in_dir(EditorFileSystemDirectory *efsd, Vector<String> &files, Vector<String> &folders) const;
void _find_remaps(EditorFileSystemDirectory *efsd, const Map<String, String> &renames, Vector<String> &to_remaps) const;
- void _try_move_item(const FileOrFolder &p_item, const String &p_new_path, Map<String, String> &p_file_renames, Map<String, String> &p_folder_renames) const;
+ void _try_move_item(const FileOrFolder &p_item, const String &p_new_path, Map<String, String> &p_file_renames, Map<String, String> &p_folder_renames);
void _try_duplicate_item(const FileOrFolder &p_item, const String &p_new_path) const;
void _update_dependencies_after_move(const Map<String, String> &p_renames) const;
void _update_resource_paths_after_move(const Map<String, String> &p_renames) const;
void _update_favorites_list_after_move(const Map<String, String> &p_files_renames, const Map<String, String> &p_folders_renames) const;
void _update_project_settings_after_move(const Map<String, String> &p_folders_renames) const;
+ void _file_deleted(String p_file);
+ void _folder_deleted(String p_folder);
+ void _files_moved(String p_old_file, String p_new_file);
+ void _folder_moved(String p_old_folder, String p_new_folder);
+
void _resource_created() const;
void _make_dir_confirm();
void _rename_operation_confirm();
diff --git a/editor/find_in_files.cpp b/editor/find_in_files.cpp
index 705bb1d9c5..bae0d196fd 100644
--- a/editor/find_in_files.cpp
+++ b/editor/find_in_files.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -44,8 +44,6 @@
#include "scene/gui/progress_bar.h"
#include "scene/gui/tree.h"
-#define ROOT_PREFIX "res://"
-
const char *FindInFiles::SIGNAL_RESULT_FOUND = "result_found";
const char *FindInFiles::SIGNAL_FINISHED = "finished";
@@ -89,7 +87,6 @@ static bool find_next(const String &line, String pattern, int from, bool match_c
//--------------------------------------------------------------------------------
FindInFiles::FindInFiles() {
- _root_prefix = ROOT_PREFIX;
_searching = false;
_whole_words = true;
_match_case = true;
@@ -182,7 +179,7 @@ void FindInFiles::_iterate() {
_current_dir = _current_dir.plus_file(folder_name);
PoolStringArray sub_dirs;
- _scan_dir(_root_prefix + _current_dir, sub_dirs);
+ _scan_dir("res://" + _current_dir, sub_dirs);
_folders_stack.push_back(sub_dirs);
@@ -348,7 +345,7 @@ FindInFilesDialog::FindInFilesDialog() {
HBoxContainer *hbc = memnew(HBoxContainer);
Label *prefix_label = memnew(Label);
- prefix_label->set_text(ROOT_PREFIX);
+ prefix_label->set_text("res://");
hbc->add_child(prefix_label);
_folder_line_edit = memnew(LineEdit);
@@ -375,10 +372,12 @@ FindInFilesDialog::FindInFilesDialog() {
{
HBoxContainer *hbc = memnew(HBoxContainer);
+ // TODO: Unhardcode this.
Vector<String> exts;
exts.push_back("gd");
if (Engine::get_singleton()->has_singleton("GodotSharp"))
exts.push_back("cs");
+ exts.push_back("shader");
for (int i = 0; i < exts.size(); ++i) {
CheckBox *cb = memnew(CheckBox);
diff --git a/editor/find_in_files.h b/editor/find_in_files.h
index 7f37123430..220f8cc136 100644
--- a/editor/find_in_files.h
+++ b/editor/find_in_files.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -73,7 +73,6 @@ private:
// Config
String _pattern;
Set<String> _extension_filter;
- String _root_prefix;
String _root_dir;
bool _whole_words;
bool _match_case;
diff --git a/editor/groups_editor.cpp b/editor/groups_editor.cpp
index cb9703342f..3cf3bbf0f2 100644
--- a/editor/groups_editor.cpp
+++ b/editor/groups_editor.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -189,7 +189,7 @@ void GroupDialog::_group_renamed() {
if (name == "") {
renamed_group->set_text(0, selected_group);
- error->set_text(TTR("invalid Group name."));
+ error->set_text(TTR("Invalid group name."));
error->popup_centered();
return;
}
diff --git a/editor/groups_editor.h b/editor/groups_editor.h
index 7705b3b6fb..4ffeea84e7 100644
--- a/editor/groups_editor.h
+++ b/editor/groups_editor.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/icons/icon_edit_internal.svg b/editor/icons/icon_edit_internal.svg
new file mode 100644
index 0000000000..4acb54ed82
--- /dev/null
+++ b/editor/icons/icon_edit_internal.svg
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ version="1.1"
+ viewBox="0 0 16 16"
+ id="svg6"
+ sodipodi:docname="icon_edit_internal.svg"
+ inkscape:version="0.92.3 (2405546, 2018-03-11)">
+ <metadata
+ id="metadata12">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs10" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1008"
+ inkscape:window-height="562"
+ id="namedview8"
+ showgrid="false"
+ inkscape:zoom="14.75"
+ inkscape:cx="9.4237288"
+ inkscape:cy="8"
+ inkscape:window-x="649"
+ inkscape:window-y="95"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg6" />
+ <g
+ transform="translate(-3.322034,-1036.4)"
+ id="g4">
+ <path
+ transform="translate(0,1036.4)"
+ d="M 7,1 C 6.446,1 6,1.446 6,2 v 2 h 4 V 2 C 10,1.446 9.554,1 9,1 Z M 6,5 v 7 l 2,3 2,-3 V 5 Z m 1,1 h 1 v 5 H 7 Z"
+ id="path2"
+ inkscape:connector-curvature="0"
+ style="fill:#e0e0e0" />
+ </g>
+ <circle
+ style="fill:#e0e0e0;fill-opacity:1"
+ id="path822"
+ cx="10.508475"
+ cy="12.677966"
+ r="2.3728814" />
+</svg>
diff --git a/editor/icons/icon_editor_internal_handle.svg b/editor/icons/icon_editor_internal_handle.svg
new file mode 100644
index 0000000000..8f6698f2b2
--- /dev/null
+++ b/editor/icons/icon_editor_internal_handle.svg
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="10"
+ height="10"
+ version="1.1"
+ viewBox="0 0 10 10"
+ id="svg8"
+ sodipodi:docname="icon_editor_internal_handle.svg"
+ inkscape:version="0.92.3 (2405546, 2018-03-11)">
+ <metadata
+ id="metadata14">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs12" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1449"
+ inkscape:window-height="649"
+ id="namedview10"
+ showgrid="false"
+ inkscape:zoom="33.37544"
+ inkscape:cx="5.3723219"
+ inkscape:cy="4.9131249"
+ inkscape:window-x="67"
+ inkscape:window-y="27"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg8" />
+ <circle
+ cx="5"
+ cy="5"
+ r="5"
+ fill-opacity=".29412"
+ id="circle2" />
+ <circle
+ cx="5"
+ cy="5"
+ r="4"
+ fill="#fff"
+ id="circle4" />
+ <circle
+ cx="5"
+ cy="5"
+ r="3"
+ fill="#ff8484"
+ id="circle6"
+ style="fill:#84b1ff;fill-opacity:1" />
+</svg>
diff --git a/editor/icons/icon_oriented_path_follow.svg b/editor/icons/icon_oriented_path_follow.svg
deleted file mode 100644
index bd3f585e54..0000000000
--- a/editor/icons/icon_oriented_path_follow.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
-<g transform="translate(0 -1036.4)">
-<path transform="translate(0 1036.4)" d="m13 0l-3 4h1.9473c-0.1385 1.3203-0.5583 1.9074-1.084 2.2754-0.64426 0.451-1.7129 0.60547-2.9629 0.73047s-2.6814 0.22053-3.9121 1.082c-0.89278 0.62493-1.5321 1.6522-1.8184 3.0957a2 2 0 0 0 -1.1699 1.8164 2 2 0 0 0 2 2 2 2 0 0 0 2 -2 2 2 0 0 0 -0.84961 -1.6328c0.19235-0.88496 0.55306-1.3373 0.98633-1.6406 0.64426-0.451 1.7129-0.60547 2.9629-0.73047s2.6814-0.22053 3.9121-1.082c1.0528-0.73697 1.7552-2.032 1.9375-3.9141h2.0508l-3-4z" fill="#fc9c9c" fill-opacity=".99608"/>
-</g>
-</svg>
diff --git a/editor/icons/icon_remove_internal.svg b/editor/icons/icon_remove_internal.svg
new file mode 100644
index 0000000000..392003e83b
--- /dev/null
+++ b/editor/icons/icon_remove_internal.svg
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ version="1.1"
+ viewBox="0 0 16 16"
+ id="svg6"
+ sodipodi:docname="icon_remove_internal.svg"
+ inkscape:version="0.92.3 (2405546, 2018-03-11)">
+ <metadata
+ id="metadata12">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs10" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1111"
+ inkscape:window-height="646"
+ id="namedview8"
+ showgrid="false"
+ inkscape:zoom="14.75"
+ inkscape:cx="9.4237288"
+ inkscape:cy="12.255032"
+ inkscape:window-x="649"
+ inkscape:window-y="95"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg6" />
+ <circle
+ style="fill:#e0e0e0;fill-opacity:1"
+ id="path822"
+ cx="10.508475"
+ cy="12.677966"
+ r="2.3728814" />
+ <g
+ transform="matrix(0.63442593,0,0,0.63442593,0.38221965,-656.59446)"
+ id="g896">
+ <path
+ style="fill:#e0e0e0"
+ inkscape:connector-curvature="0"
+ transform="translate(0,1036.4)"
+ d="M 3.7578,2.3438 2.3437,3.7579 6.5859,8.0001 2.3437,12.2423 3.7578,13.6564 8,9.4142 12.2422,13.6564 13.6563,12.2423 9.4141,8.0001 13.6563,3.7579 12.2422,2.3438 8,6.586 Z"
+ id="path894" />
+ </g>
+</svg>
diff --git a/editor/import/editor_import_collada.cpp b/editor/import/editor_import_collada.cpp
index e8bb772a64..cd5df14f1b 100644
--- a/editor/import/editor_import_collada.cpp
+++ b/editor/import/editor_import_collada.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -1191,6 +1191,7 @@ Error ColladaImport::_create_resources(Collada::Node *p_node, bool p_use_compres
if (collada.state.mesh_data_map.has(meshid)) {
Ref<ArrayMesh> mesh = Ref<ArrayMesh>(memnew(ArrayMesh));
const Collada::MeshData &meshdata = collada.state.mesh_data_map[meshid];
+ mesh->set_name(meshdata.name);
Error err = _create_mesh_surfaces(false, mesh, ng->material_map, meshdata, apply_xform, bone_remap, skin, NULL, Vector<Ref<ArrayMesh> >(), false);
ERR_FAIL_COND_V(err, err);
@@ -1655,8 +1656,9 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones
}
}
- Quat q = xform.basis.get_rotation_quat();
Vector3 s = xform.basis.get_scale();
+ bool singular_matrix = Math::is_equal_approx(s.x, 0.0f) || Math::is_equal_approx(s.y, 0.0f) || Math::is_equal_approx(s.z, 0.0f);
+ Quat q = singular_matrix ? Quat() : xform.basis.get_rotation_quat();
Vector3 l = xform.origin;
animation->transform_track_insert_key(track, snapshots[i], l, q, s);
@@ -1705,8 +1707,9 @@ void ColladaImport::create_animation(int p_clip, bool p_make_tracks_in_all_bones
xform = sk->get_bone_rest(nm.bone).affine_inverse() * xform;
- Quat q = xform.basis.get_rotation_quat();
Vector3 s = xform.basis.get_scale();
+ bool singular_matrix = Math::is_equal_approx(s.x, 0.0f) || Math::is_equal_approx(s.y, 0.0f) || Math::is_equal_approx(s.z, 0.0f);
+ Quat q = singular_matrix ? Quat() : xform.basis.get_rotation_quat();
Vector3 l = xform.origin;
animation->transform_track_insert_key(track, 0, l, q, s);
diff --git a/editor/import/editor_import_collada.h b/editor/import/editor_import_collada.h
index 5dd3ff58fa..6497cdb110 100644
--- a/editor/import/editor_import_collada.h
+++ b/editor/import/editor_import_collada.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/import/editor_import_plugin.cpp b/editor/import/editor_import_plugin.cpp
index c1c1183692..e365471733 100644
--- a/editor/import/editor_import_plugin.cpp
+++ b/editor/import/editor_import_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -165,5 +165,5 @@ void EditorImportPlugin::_bind_methods() {
ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::REAL, "get_priority"));
ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::INT, "get_import_order"));
ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "get_option_visibility", PropertyInfo(Variant::STRING, "option"), PropertyInfo(Variant::DICTIONARY, "options")));
- ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::INT, "import", PropertyInfo(Variant::STRING, "source_file"), PropertyInfo(Variant::STRING, "save_path"), PropertyInfo(Variant::DICTIONARY, "options"), PropertyInfo(Variant::ARRAY, "r_platform_variants"), PropertyInfo(Variant::ARRAY, "r_gen_files")));
+ ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::INT, "import", PropertyInfo(Variant::STRING, "source_file"), PropertyInfo(Variant::STRING, "save_path"), PropertyInfo(Variant::DICTIONARY, "options"), PropertyInfo(Variant::ARRAY, "platform_variants"), PropertyInfo(Variant::ARRAY, "gen_files")));
}
diff --git a/editor/import/editor_import_plugin.h b/editor/import/editor_import_plugin.h
index b850c0605b..9e64fdb7c7 100644
--- a/editor/import/editor_import_plugin.h
+++ b/editor/import/editor_import_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/import/editor_scene_importer_gltf.cpp b/editor/import/editor_scene_importer_gltf.cpp
index cb15be35f2..654dfc62e0 100644
--- a/editor/import/editor_scene_importer_gltf.cpp
+++ b/editor/import/editor_scene_importer_gltf.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -999,6 +999,10 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) {
print_verbose("glTF: Mesh has targets");
Array targets = p["targets"];
+ //ideally BLEND_SHAPE_MODE_RELATIVE since gltf2 stores in displacement
+ //but it could require a larger refactor?
+ mesh.mesh->set_blend_shape_mode(Mesh::BLEND_SHAPE_MODE_NORMALIZED);
+
if (j == 0) {
Array target_names = extras.has("targetNames") ? (Array)extras["targetNames"] : Array();
for (int k = 0; k < targets.size(); k++) {
@@ -1021,10 +1025,34 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) {
array_copy[Mesh::ARRAY_INDEX] = Variant();
if (t.has("POSITION")) {
- array_copy[Mesh::ARRAY_VERTEX] = _decode_accessor_as_vec3(state, t["POSITION"], true);
+ PoolVector<Vector3> varr = _decode_accessor_as_vec3(state, t["POSITION"], true);
+ PoolVector<Vector3> src_varr = array[Mesh::ARRAY_VERTEX];
+ int size = src_varr.size();
+ ERR_FAIL_COND_V(size == 0, ERR_PARSE_ERROR);
+ {
+ PoolVector<Vector3>::Write w_varr = varr.write();
+ PoolVector<Vector3>::Read r_varr = varr.read();
+ PoolVector<Vector3>::Read r_src_varr = src_varr.read();
+ for (int l = 0; l < size; l++) {
+ w_varr[l] = r_varr[l] + r_src_varr[l];
+ }
+ }
+ array_copy[Mesh::ARRAY_VERTEX] = varr;
}
if (t.has("NORMAL")) {
- array_copy[Mesh::ARRAY_NORMAL] = _decode_accessor_as_vec3(state, t["NORMAL"], true);
+ PoolVector<Vector3> narr = _decode_accessor_as_vec3(state, t["NORMAL"], true);
+ PoolVector<Vector3> src_narr = array[Mesh::ARRAY_NORMAL];
+ int size = src_narr.size();
+ ERR_FAIL_COND_V(size == 0, ERR_PARSE_ERROR);
+ {
+ PoolVector<Vector3>::Write w_narr = narr.write();
+ PoolVector<Vector3>::Read r_narr = narr.read();
+ PoolVector<Vector3>::Read r_src_narr = src_narr.read();
+ for (int l = 0; l < size; l++) {
+ w_narr[l] = r_narr[l] + r_src_narr[l];
+ }
+ }
+ array_copy[Mesh::ARRAY_NORMAL] = narr;
}
if (t.has("TANGENT")) {
PoolVector<Vector3> tangents_v3 = _decode_accessor_as_vec3(state, t["TANGENT"], true);
@@ -1043,9 +1071,9 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) {
for (int l = 0; l < size4 / 4; l++) {
- w4[l * 4 + 0] = r3[l].x;
- w4[l * 4 + 1] = r3[l].y;
- w4[l * 4 + 2] = r3[l].z;
+ w4[l * 4 + 0] = r3[l].x + r4[l * 4 + 0];
+ w4[l * 4 + 1] = r3[l].y + r4[l * 4 + 1];
+ w4[l * 4 + 2] = r3[l].z + r4[l * 4 + 2];
w4[l * 4 + 3] = r4[l * 4 + 3]; //copy flip value
}
}
@@ -1686,7 +1714,7 @@ void EditorSceneImporterGLTF::_generate_node(GLTFState &state, int p_node, Node
n->godot_nodes.push_back(node);
- if (n->skin >= 0 && Object::cast_to<MeshInstance>(node)) {
+ if (n->skin >= 0 && n->skin < skeletons.size() && Object::cast_to<MeshInstance>(node)) {
MeshInstance *mi = Object::cast_to<MeshInstance>(node);
Skeleton *s = skeletons[n->skin];
diff --git a/editor/import/editor_scene_importer_gltf.h b/editor/import/editor_scene_importer_gltf.h
index 8258ec41fd..0dff45abaf 100644
--- a/editor/import/editor_scene_importer_gltf.h
+++ b/editor/import/editor_scene_importer_gltf.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -114,14 +114,14 @@ class EditorSceneImporterGLTF : public EditorSceneImporter {
Vector<int> children;
Vector<Node *> godot_nodes;
- GLTFNode() {
- // child_of_skeleton = -1;
- // skeleton_skin = -1;
- mesh = -1;
- camera = -1;
- parent = -1;
- skin = -1;
- scale = Vector3(1, 1, 1);
+ GLTFNode() :
+ parent(-1),
+ mesh(-1),
+ camera(-1),
+ skin(-1),
+ //skeleton_skin(-1),
+ //child_of_skeleton(-1),
+ scale(Vector3(1, 1, 1)) {
}
};
@@ -134,12 +134,12 @@ class EditorSceneImporterGLTF : public EditorSceneImporter {
bool indices;
//matrices need to be transformed to this
- GLTFBufferView() {
- buffer = 0;
- byte_offset = 0;
- byte_length = 0;
- byte_stride = 0;
- indices = false;
+ GLTFBufferView() :
+ buffer(0),
+ byte_offset(0),
+ byte_length(0),
+ byte_stride(0),
+ indices(false) {
}
};
diff --git a/editor/import/resource_importer_bitmask.cpp b/editor/import/resource_importer_bitmask.cpp
index 917d6d1bcc..431396d584 100644
--- a/editor/import/resource_importer_bitmask.cpp
+++ b/editor/import/resource_importer_bitmask.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/import/resource_importer_bitmask.h b/editor/import/resource_importer_bitmask.h
index 1b97152099..b0168e2b53 100644
--- a/editor/import/resource_importer_bitmask.h
+++ b/editor/import/resource_importer_bitmask.h
@@ -1,12 +1,12 @@
/*************************************************************************/
-/* resource_importer_bitmask.cpp */
+/* resource_importer_bitmask.h */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/import/resource_importer_csv_translation.cpp b/editor/import/resource_importer_csv_translation.cpp
index e7f9e1afe6..be5ce34c25 100644
--- a/editor/import/resource_importer_csv_translation.cpp
+++ b/editor/import/resource_importer_csv_translation.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/import/resource_importer_csv_translation.h b/editor/import/resource_importer_csv_translation.h
index 370c182f65..3d74731e8c 100644
--- a/editor/import/resource_importer_csv_translation.h
+++ b/editor/import/resource_importer_csv_translation.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/import/resource_importer_image.cpp b/editor/import/resource_importer_image.cpp
index 923a9a20ec..c3421466f2 100644
--- a/editor/import/resource_importer_image.cpp
+++ b/editor/import/resource_importer_image.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/import/resource_importer_image.h b/editor/import/resource_importer_image.h
index d282ac482d..b38d833c5b 100644
--- a/editor/import/resource_importer_image.h
+++ b/editor/import/resource_importer_image.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/import/resource_importer_layered_texture.cpp b/editor/import/resource_importer_layered_texture.cpp
index afda07c1c2..f43df02916 100644
--- a/editor/import/resource_importer_layered_texture.cpp
+++ b/editor/import/resource_importer_layered_texture.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/import/resource_importer_layered_texture.h b/editor/import/resource_importer_layered_texture.h
index a4b83bf56c..599fdf12fa 100644
--- a/editor/import/resource_importer_layered_texture.h
+++ b/editor/import/resource_importer_layered_texture.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/import/resource_importer_obj.cpp b/editor/import/resource_importer_obj.cpp
index c237d2e854..030b54a589 100644
--- a/editor/import/resource_importer_obj.cpp
+++ b/editor/import/resource_importer_obj.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -45,6 +45,7 @@ uint32_t EditorOBJImporter::get_import_flags() const {
static Error _parse_material_library(const String &p_path, Map<String, Ref<SpatialMaterial> > &material_map, List<String> *r_missing_deps) {
FileAccessRef f = FileAccess::open(p_path, FileAccess::READ);
+ ERR_EXPLAIN(vformat("Couldn't open MTL file '%s', it may not exist or not be readable.", p_path));
ERR_FAIL_COND_V(!f, ERR_CANT_OPEN);
Ref<SpatialMaterial> current;
@@ -206,7 +207,7 @@ static Error _parse_material_library(const String &p_path, Map<String, Ref<Spati
static Error _parse_obj(const String &p_path, List<Ref<Mesh> > &r_meshes, bool p_single_mesh, bool p_generate_tangents, bool p_optimize, Vector3 p_scale_mesh, List<String> *r_missing_deps) {
FileAccessRef f = FileAccess::open(p_path, FileAccess::READ);
-
+ ERR_EXPLAIN(vformat("Couldn't open OBJ file '%s', it may not exist or not be readable.", p_path));
ERR_FAIL_COND_V(!f, ERR_CANT_OPEN);
Ref<ArrayMesh> mesh;
@@ -217,11 +218,6 @@ static Error _parse_obj(const String &p_path, List<Ref<Mesh> > &r_meshes, bool p
bool flip_faces = false;
int mesh_flags = p_optimize ? Mesh::ARRAY_COMPRESS_DEFAULT : 0;
- //bool flip_faces = p_options["force/flip_faces"];
- //bool force_smooth = p_options["force/smooth_shading"];
- //bool weld_vertices = p_options["force/weld_vertices"];
- //float weld_tolerance = p_options["force/weld_tolerance"];
-
Vector<Vector3> vertices;
Vector<Vector3> normals;
Vector<Vector2> uvs;
diff --git a/editor/import/resource_importer_obj.h b/editor/import/resource_importer_obj.h
index 3f6d1104d7..effc56ad95 100644
--- a/editor/import/resource_importer_obj.h
+++ b/editor/import/resource_importer_obj.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/import/resource_importer_scene.cpp b/editor/import/resource_importer_scene.cpp
index c5a5980fc1..f230fa1b8b 100644
--- a/editor/import/resource_importer_scene.cpp
+++ b/editor/import/resource_importer_scene.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/import/resource_importer_scene.h b/editor/import/resource_importer_scene.h
index b81a52ab70..9435b6599a 100644
--- a/editor/import/resource_importer_scene.h
+++ b/editor/import/resource_importer_scene.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/import/resource_importer_texture.cpp b/editor/import/resource_importer_texture.cpp
index 8e91a88adb..a3bc9d0ec9 100644
--- a/editor/import/resource_importer_texture.cpp
+++ b/editor/import/resource_importer_texture.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -216,7 +216,7 @@ void ResourceImporterTexture::get_import_options(List<ImportOption> *r_options,
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "stream"), false));
r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "size_limit", PROPERTY_HINT_RANGE, "0,4096,1"), 0));
r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "detect_3d"), p_preset == PRESET_DETECT));
- r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "svg/scale", PROPERTY_HINT_RANGE, "0.001,100,0.1"), 1.0));
+ r_options->push_back(ImportOption(PropertyInfo(Variant::REAL, "svg/scale", PROPERTY_HINT_RANGE, "0.001,100,0.001"), 1.0));
}
void ResourceImporterTexture::_save_stex(const Ref<Image> &p_image, const String &p_to_path, int p_compress_mode, float p_lossy_quality, Image::CompressMode p_vram_compression, bool p_mipmaps, int p_texture_flags, bool p_streamable, bool p_detect_3d, bool p_detect_srgb, bool p_force_rgbe, bool p_detect_normal, bool p_force_normal) {
@@ -415,7 +415,7 @@ Error ResourceImporterTexture::import(const String &p_source_file, const String
image->resize(new_width, new_height, Image::INTERPOLATE_CUBIC);
}
- if (normal) {
+ if (normal == 1) {
image->normalize();
}
}
diff --git a/editor/import/resource_importer_texture.h b/editor/import/resource_importer_texture.h
index b49b29874d..900654c114 100644
--- a/editor/import/resource_importer_texture.h
+++ b/editor/import/resource_importer_texture.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/import/resource_importer_wav.cpp b/editor/import/resource_importer_wav.cpp
index 55f4cc7439..76ab7a7037 100644
--- a/editor/import/resource_importer_wav.cpp
+++ b/editor/import/resource_importer_wav.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -272,12 +272,18 @@ Error ResourceImporterWAV::import(const String &p_source_file, const String &p_s
for (int i = 0; i < 10; i++)
file->get_32(); // i wish to know why should i do this... no doc!
- // only read 0x00 (loop forward) and 0x01 (loop ping-pong) and skip anything else because
- // it's not supported (loop backward), reserved for future uses or sampler specific
+ // only read 0x00 (loop forward), 0x01 (loop ping-pong) and 0x02 (loop backward)
+ // Skip anything else because it's not supported, reserved for future uses or sampler specific
// from https://sites.google.com/site/musicgapi/technical-documents/wav-file-format#smpl (loop type values table)
int loop_type = file->get_32();
- if (loop_type == 0x00 || loop_type == 0x01) {
- loop = loop_type ? AudioStreamSample::LOOP_PING_PONG : AudioStreamSample::LOOP_FORWARD;
+ if (loop_type == 0x00 || loop_type == 0x01 || loop_type == 0x02) {
+ if (loop_type == 0x00) {
+ loop = AudioStreamSample::LOOP_FORWARD;
+ } else if (loop_type == 0x01) {
+ loop = AudioStreamSample::LOOP_PING_PONG;
+ } else if (loop_type == 0x02) {
+ loop = AudioStreamSample::LOOP_BACKWARD;
+ }
loop_begin = file->get_32();
loop_end = file->get_32();
}
diff --git a/editor/import/resource_importer_wav.h b/editor/import/resource_importer_wav.h
index a630ff732e..68e677b977 100644
--- a/editor/import/resource_importer_wav.h
+++ b/editor/import/resource_importer_wav.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/import_dock.cpp b/editor/import_dock.cpp
index 2e68609a56..e59df7c932 100644
--- a/editor/import_dock.cpp
+++ b/editor/import_dock.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/import_dock.h b/editor/import_dock.h
index 632fd39700..bc992b2f7e 100644
--- a/editor/import_dock.h
+++ b/editor/import_dock.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/inspector_dock.cpp b/editor/inspector_dock.cpp
index 2a8885c0a4..d711c1717d 100644
--- a/editor/inspector_dock.cpp
+++ b/editor/inspector_dock.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -334,6 +334,7 @@ void InspectorDock::_notification(int p_what) {
set_theme(editor->get_gui_base()->get_theme());
resource_new_button->set_icon(get_icon("New", "EditorIcons"));
resource_load_button->set_icon(get_icon("Load", "EditorIcons"));
+ resource_save_button->set_icon(get_icon("Save", "EditorIcons"));
backward_button->set_icon(get_icon("Back", "EditorIcons"));
forward_button->set_icon(get_icon("Forward", "EditorIcons"));
history_menu->set_icon(get_icon("History", "EditorIcons"));
@@ -416,6 +417,7 @@ void InspectorDock::update(Object *p_object) {
object_menu->set_disabled(false);
search->set_editable(true);
+ resource_save_button->set_disabled(!is_resource);
PopupMenu *p = object_menu->get_popup();
@@ -515,6 +517,16 @@ InspectorDock::InspectorDock(EditorNode *p_editor, EditorData &p_editor_data) {
resource_load_button->connect("pressed", this, "_open_resource_selector");
resource_load_button->set_focus_mode(Control::FOCUS_NONE);
+ resource_save_button = memnew(MenuButton);
+ resource_save_button->set_tooltip(TTR("Save the currently edited resource."));
+ resource_save_button->set_icon(get_icon("Save", "EditorIcons"));
+ general_options_hb->add_child(resource_save_button);
+ resource_save_button->get_popup()->add_item(TTR("Save"), RESOURCE_SAVE);
+ resource_save_button->get_popup()->add_item(TTR("Save As..."), RESOURCE_SAVE_AS);
+ resource_save_button->get_popup()->connect("id_pressed", this, "_menu_option");
+ resource_save_button->set_focus_mode(Control::FOCUS_NONE);
+ resource_save_button->set_disabled(true);
+
general_options_hb->add_spacer();
backward_button = memnew(ToolButton);
@@ -593,7 +605,6 @@ InspectorDock::InspectorDock(EditorNode *p_editor, EditorData &p_editor_data) {
inspector->set_undo_redo(&editor_data->get_undo_redo());
inspector->set_use_filter(true); // TODO: check me
- inspector->set_auto_unfold_edited(bool(EDITOR_GET("interface/inspector/auto_unfold_edited")));
inspector->connect("resource_selected", this, "_resource_selected");
inspector->connect("property_keyed", this, "_property_keyed");
diff --git a/editor/inspector_dock.h b/editor/inspector_dock.h
index 57d2a03295..866b152d2e 100644
--- a/editor/inspector_dock.h
+++ b/editor/inspector_dock.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/multi_node_edit.cpp b/editor/multi_node_edit.cpp
index 420d8ad3cf..56a04f615d 100644
--- a/editor/multi_node_edit.cpp
+++ b/editor/multi_node_edit.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/multi_node_edit.h b/editor/multi_node_edit.h
index 614832320e..b9192b206a 100644
--- a/editor/multi_node_edit.h
+++ b/editor/multi_node_edit.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/node_dock.cpp b/editor/node_dock.cpp
index 83e09b7676..e3fb579667 100644
--- a/editor/node_dock.cpp
+++ b/editor/node_dock.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/node_dock.h b/editor/node_dock.h
index 4b2a9d14da..1dd988479b 100644
--- a/editor/node_dock.h
+++ b/editor/node_dock.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/output_strings.cpp b/editor/output_strings.cpp
index e6cadee3e3..24b44f078f 100644
--- a/editor/output_strings.cpp
+++ b/editor/output_strings.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/output_strings.h b/editor/output_strings.h
index 4833f2067e..4fd3f7d836 100644
--- a/editor/output_strings.h
+++ b/editor/output_strings.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/pane_drag.cpp b/editor/pane_drag.cpp
index d8c504a85d..67fda8134d 100644
--- a/editor/pane_drag.cpp
+++ b/editor/pane_drag.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/pane_drag.h b/editor/pane_drag.h
index e80664eee7..c9631bb870 100644
--- a/editor/pane_drag.h
+++ b/editor/pane_drag.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugin_config_dialog.cpp b/editor/plugin_config_dialog.cpp
index 8e626e7111..1b99059f32 100644
--- a/editor/plugin_config_dialog.cpp
+++ b/editor/plugin_config_dialog.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugin_config_dialog.h b/editor/plugin_config_dialog.h
index 2d321a479d..74febfe408 100644
--- a/editor/plugin_config_dialog.h
+++ b/editor/plugin_config_dialog.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/abstract_polygon_2d_editor.cpp b/editor/plugins/abstract_polygon_2d_editor.cpp
index 16423decc4..41e2062ab2 100644
--- a/editor/plugins/abstract_polygon_2d_editor.cpp
+++ b/editor/plugins/abstract_polygon_2d_editor.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -103,6 +103,11 @@ bool AbstractPolygon2DEditor::_is_line() const {
return false;
}
+bool AbstractPolygon2DEditor::_has_uv() const {
+
+ return false;
+}
+
int AbstractPolygon2DEditor::_get_polygon_count() const {
return 1;
@@ -202,12 +207,7 @@ void AbstractPolygon2DEditor::_notification(int p_what) {
button_edit->set_pressed(true);
get_tree()->connect("node_removed", this, "_node_removed");
-
create_resource->connect("confirmed", this, "_create_resource");
-
- } break;
- case NOTIFICATION_PHYSICS_PROCESS: {
-
} break;
}
}
@@ -250,8 +250,12 @@ void AbstractPolygon2DEditor::_wip_close() {
_set_polygon(0, wip);
} else if (wip.size() >= (_is_line() ? 2 : 3)) {
- undo_redo->create_action(TTR("Create Poly"));
+ undo_redo->create_action(TTR("Create Polygon"));
_action_add_polygon(wip);
+ if (_has_uv()) {
+ undo_redo->add_do_method(_get_node(), "set_uv", PoolVector<Vector2>());
+ undo_redo->add_undo_method(_get_node(), "set_uv", _get_node()->get("uv"));
+ }
_commit_action();
} else {
@@ -313,7 +317,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
if (vertices.size() < (_is_line() ? 2 : 3)) {
vertices.push_back(cpoint);
- undo_redo->create_action(TTR("Edit Poly"));
+ undo_redo->create_action(TTR("Edit Polygon"));
selected_point = Vertex(insert.polygon, vertices.size());
_action_set_polygon(insert.polygon, vertices);
_commit_action();
@@ -331,7 +335,6 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
undo_redo->create_action(TTR("Insert Point"));
_action_set_polygon(insert.polygon, vertices);
_commit_action();
-
return true;
}
} else {
@@ -363,7 +366,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
ERR_FAIL_INDEX_V(edited_point.vertex, vertices.size(), false);
vertices.write[edited_point.vertex] = edited_point.pos - _get_offset(edited_point.polygon);
- undo_redo->create_action(TTR("Edit Poly"));
+ undo_redo->create_action(TTR("Edit Polygon"));
_action_set_polygon(edited_point.polygon, pre_move_edit, vertices);
_commit_action();
@@ -422,7 +425,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
return true;
} else {
- const real_t grab_threshold = EDITOR_DEF("editors/poly_editor/point_grab_radius", 8);
+ const real_t grab_threshold = EDITOR_GET("editors/poly_editor/point_grab_radius");
if (!_is_line() && wip.size() > 1 && xform.xform(wip[0]).distance_to(gpoint) < grab_threshold) {
//wip closed
@@ -531,6 +534,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
}
void AbstractPolygon2DEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
+
if (!_get_node())
return;
@@ -561,7 +565,7 @@ void AbstractPolygon2DEditor::forward_canvas_draw_over_viewport(Control *p_overl
offset = _get_offset(j);
}
- if (!wip_active && j == edited_point.polygon && EDITOR_DEF("editors/poly_editor/show_previous_outline", true)) {
+ if (!wip_active && j == edited_point.polygon && EDITOR_GET("editors/poly_editor/show_previous_outline")) {
const Color col = Color(0.5, 0.5, 0.5); // FIXME polygon->get_outline_color();
const int n = pre_move_edit.size();
@@ -631,9 +635,11 @@ void AbstractPolygon2DEditor::edit(Node *p_polygon) {
_set_node(p_polygon);
- //Enable the pencil tool if the polygon is empty
+ // Enable the pencil tool if the polygon is empty.
if (_is_empty())
_menu_option(MODE_CREATE);
+ else
+ _menu_option(MODE_EDIT);
wip.clear();
wip_active = false;
@@ -664,12 +670,12 @@ void AbstractPolygon2DEditor::remove_point(const Vertex &p_vertex) {
vertices.remove(p_vertex.vertex);
- undo_redo->create_action(TTR("Edit Poly (Remove Point)"));
+ undo_redo->create_action(TTR("Edit Polygon (Remove Point)"));
_action_set_polygon(p_vertex.polygon, vertices);
_commit_action();
} else {
- undo_redo->create_action(TTR("Remove Poly And Point"));
+ undo_redo->create_action(TTR("Remove Polygon And Point"));
_action_remove_polygon(p_vertex.polygon);
_commit_action();
}
@@ -689,7 +695,7 @@ AbstractPolygon2DEditor::Vertex AbstractPolygon2DEditor::get_active_point() cons
AbstractPolygon2DEditor::PosVertex AbstractPolygon2DEditor::closest_point(const Vector2 &p_pos) const {
- const real_t grab_threshold = EDITOR_DEF("editors/poly_editor/point_grab_radius", 8);
+ const real_t grab_threshold = EDITOR_GET("editors/poly_editor/point_grab_radius");
const int n_polygons = _get_polygon_count();
const Transform2D xform = canvas_item_editor->get_canvas_transform() * _get_node()->get_global_transform();
@@ -720,7 +726,7 @@ AbstractPolygon2DEditor::PosVertex AbstractPolygon2DEditor::closest_point(const
AbstractPolygon2DEditor::PosVertex AbstractPolygon2DEditor::closest_edge_point(const Vector2 &p_pos) const {
- const real_t grab_threshold = EDITOR_DEF("editors/poly_editor/point_grab_radius", 8);
+ const real_t grab_threshold = EDITOR_GET("editors/poly_editor/point_grab_radius");
const real_t eps = grab_threshold * 2;
const real_t eps2 = eps * eps;
@@ -777,19 +783,19 @@ AbstractPolygon2DEditor::AbstractPolygon2DEditor(EditorNode *p_editor, bool p_wi
add_child(button_create);
button_create->connect("pressed", this, "_menu_option", varray(MODE_CREATE));
button_create->set_toggle_mode(true);
- button_create->set_tooltip(TTR("Create a new polygon from scratch"));
+ button_create->set_tooltip(TTR("Create points."));
button_edit = memnew(ToolButton);
add_child(button_edit);
button_edit->connect("pressed", this, "_menu_option", varray(MODE_EDIT));
button_edit->set_toggle_mode(true);
- button_edit->set_tooltip(TTR("Edit existing polygon:\nLMB: Move Point.\nCtrl+LMB: Split Segment.\nRMB: Erase Point."));
+ button_edit->set_tooltip(TTR("Edit points.\nLMB: Move Point\nRMB: Erase Point"));
button_delete = memnew(ToolButton);
add_child(button_delete);
button_delete->connect("pressed", this, "_menu_option", varray(MODE_DELETE));
button_delete->set_toggle_mode(true);
- button_delete->set_tooltip(TTR("Delete points"));
+ button_delete->set_tooltip(TTR("Erase points."));
create_resource = memnew(ConfirmationDialog);
add_child(create_resource);
@@ -820,13 +826,11 @@ void AbstractPolygon2DEditorPlugin::make_visible(bool p_visible) {
}
}
-AbstractPolygon2DEditorPlugin::AbstractPolygon2DEditorPlugin(EditorNode *p_node, AbstractPolygon2DEditor *p_polygon_editor, String p_class) {
-
- editor = p_node;
- polygon_editor = p_polygon_editor;
- klass = p_class;
+AbstractPolygon2DEditorPlugin::AbstractPolygon2DEditorPlugin(EditorNode *p_node, AbstractPolygon2DEditor *p_polygon_editor, String p_class) :
+ polygon_editor(p_polygon_editor),
+ editor(p_node),
+ klass(p_class) {
CanvasItemEditor::get_singleton()->add_control_to_menu_panel(polygon_editor);
-
polygon_editor->hide();
}
diff --git a/editor/plugins/abstract_polygon_2d_editor.h b/editor/plugins/abstract_polygon_2d_editor.h
index c03670f254..289c2785b1 100644
--- a/editor/plugins/abstract_polygon_2d_editor.h
+++ b/editor/plugins/abstract_polygon_2d_editor.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -88,12 +88,10 @@ class AbstractPolygon2DEditor : public HBoxContainer {
protected:
enum {
-
MODE_CREATE,
MODE_EDIT,
MODE_DELETE,
MODE_CONT,
-
};
int mode;
@@ -116,13 +114,12 @@ protected:
PosVertex closest_edge_point(const Vector2 &p_pos) const;
bool _is_empty() const;
- void _commit_action();
-protected:
virtual Node2D *_get_node() const = 0;
virtual void _set_node(Node *p_polygon) = 0;
virtual bool _is_line() const;
+ virtual bool _has_uv() const;
virtual int _get_polygon_count() const;
virtual Vector2 _get_offset(int p_idx) const;
virtual Variant _get_polygon(int p_idx) const;
@@ -132,6 +129,7 @@ protected:
virtual void _action_remove_polygon(int p_idx);
virtual void _action_set_polygon(int p_idx, const Variant &p_polygon);
virtual void _action_set_polygon(int p_idx, const Variant &p_previous, const Variant &p_polygon);
+ virtual void _commit_action();
virtual bool _has_resource() const;
virtual void _create_resource();
diff --git a/editor/plugins/animation_blend_space_1d_editor.cpp b/editor/plugins/animation_blend_space_1d_editor.cpp
index 4b1e710705..3029ad978a 100644
--- a/editor/plugins/animation_blend_space_1d_editor.cpp
+++ b/editor/plugins/animation_blend_space_1d_editor.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -72,7 +72,7 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEven
ap->get_animation_list(&names);
for (List<StringName>::Element *E = names.front(); E; E = E->next()) {
- animations_menu->add_icon_item(get_icon("Animation", "Editoricons"), E->get());
+ animations_menu->add_icon_item(get_icon("Animation", "EditorIcons"), E->get());
animations_to_add.push_back(E->get());
}
}
@@ -94,7 +94,7 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEven
menu->add_item(TTR("Paste"), MENU_PASTE);
}
menu->add_separator();
- menu->add_item(TTR("Load.."), MENU_LOAD_FILE);
+ menu->add_item(TTR("Load..."), MENU_LOAD_FILE);
menu->set_global_position(blend_space_draw->get_global_transform().xform(mb->get_position()));
menu->popup();
@@ -650,6 +650,7 @@ AnimationNodeBlendSpace1DEditor::AnimationNodeBlendSpace1DEditor() {
snap->set_toggle_mode(true);
top_hb->add_child(snap);
snap->set_pressed(true);
+ snap->set_tooltip(TTR("Enable snap and show grid."));
snap->connect("pressed", this, "_snap_toggled");
snap_value = memnew(SpinBox);
diff --git a/editor/plugins/animation_blend_space_1d_editor.h b/editor/plugins/animation_blend_space_1d_editor.h
index ca6135406c..ae4db184e4 100644
--- a/editor/plugins/animation_blend_space_1d_editor.h
+++ b/editor/plugins/animation_blend_space_1d_editor.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/animation_blend_space_2d_editor.cpp b/editor/plugins/animation_blend_space_2d_editor.cpp
index 394b888d0e..038e2d0b3e 100644
--- a/editor/plugins/animation_blend_space_2d_editor.cpp
+++ b/editor/plugins/animation_blend_space_2d_editor.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -47,11 +47,19 @@ bool AnimationNodeBlendSpace2DEditor::can_edit(const Ref<AnimationNode> &p_node)
return bs2d.is_valid();
}
+void AnimationNodeBlendSpace2DEditor::_blend_space_changed() {
+ blend_space_draw->update();
+}
+
void AnimationNodeBlendSpace2DEditor::edit(const Ref<AnimationNode> &p_node) {
+ if (blend_space.is_valid()) {
+ blend_space->disconnect("triangles_updated", this, "_blend_space_changed");
+ }
blend_space = p_node;
if (!blend_space.is_null()) {
+ blend_space->connect("triangles_updated", this, "_blend_space_changed");
_update_space();
}
}
@@ -113,7 +121,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven
menu->add_item(TTR("Paste"), MENU_PASTE);
}
menu->add_separator();
- menu->add_item(TTR("Load.."), MENU_LOAD_FILE);
+ menu->add_item(TTR("Load..."), MENU_LOAD_FILE);
menu->set_global_position(blend_space_draw->get_global_transform().xform(mb->get_position()));
menu->popup();
@@ -607,6 +615,8 @@ void AnimationNodeBlendSpace2DEditor::_update_space() {
auto_triangles->set_pressed(blend_space->get_auto_triangles());
+ interpolation->select(blend_space->get_blend_mode());
+
max_x_value->set_value(blend_space->get_max_space().x);
max_y_value->set_value(blend_space->get_max_space().y);
@@ -636,6 +646,8 @@ void AnimationNodeBlendSpace2DEditor::_config_changed(double) {
undo_redo->add_undo_method(blend_space.ptr(), "set_min_space", blend_space->get_min_space());
undo_redo->add_do_method(blend_space.ptr(), "set_snap", Vector2(snap_x->get_value(), snap_y->get_value()));
undo_redo->add_undo_method(blend_space.ptr(), "set_snap", blend_space->get_snap());
+ undo_redo->add_do_method(blend_space.ptr(), "set_blend_mode", interpolation->get_selected());
+ undo_redo->add_undo_method(blend_space.ptr(), "set_blend_mode", blend_space->get_blend_mode());
undo_redo->add_do_method(this, "_update_space");
undo_redo->add_undo_method(this, "_update_space");
undo_redo->commit_action();
@@ -752,6 +764,10 @@ void AnimationNodeBlendSpace2DEditor::_notification(int p_what) {
snap->set_icon(get_icon("SnapGrid", "EditorIcons"));
open_editor->set_icon(get_icon("Edit", "EditorIcons"));
auto_triangles->set_icon(get_icon("AutoTriangle", "EditorIcons"));
+ interpolation->clear();
+ interpolation->add_icon_item(get_icon("TrackContinuous", "EditorIcons"), "", 0);
+ interpolation->add_icon_item(get_icon("TrackDiscrete", "EditorIcons"), "", 1);
+ interpolation->add_icon_item(get_icon("TrackCapture", "EditorIcons"), "", 2);
}
if (p_what == NOTIFICATION_PROCESS) {
@@ -829,6 +845,7 @@ void AnimationNodeBlendSpace2DEditor::_bind_methods() {
ClassDB::bind_method("_removed_from_graph", &AnimationNodeBlendSpace2DEditor::_removed_from_graph);
ClassDB::bind_method("_auto_triangles_toggled", &AnimationNodeBlendSpace2DEditor::_auto_triangles_toggled);
+ ClassDB::bind_method("_blend_space_changed", &AnimationNodeBlendSpace2DEditor::_blend_space_changed);
ClassDB::bind_method("_file_opened", &AnimationNodeBlendSpace2DEditor::_file_opened);
}
@@ -896,8 +913,8 @@ AnimationNodeBlendSpace2DEditor::AnimationNodeBlendSpace2DEditor() {
snap = memnew(ToolButton);
snap->set_toggle_mode(true);
top_hb->add_child(snap);
- //snap->set_text(TTR("Snap"));
snap->set_pressed(true);
+ snap->set_tooltip(TTR("Enable snap and show grid."));
snap->connect("pressed", this, "_snap_toggled");
snap_x = memnew(SpinBox);
@@ -914,6 +931,13 @@ AnimationNodeBlendSpace2DEditor::AnimationNodeBlendSpace2DEditor() {
snap_y->set_step(0.01);
snap_y->set_max(1000);
+ top_hb->add_child(memnew(VSeparator));
+
+ top_hb->add_child(memnew(Label(TTR("Blend:"))));
+ interpolation = memnew(OptionButton);
+ top_hb->add_child(interpolation);
+ interpolation->connect("item_selected", this, "_config_changed");
+
edit_hb = memnew(HBoxContainer);
top_hb->add_child(edit_hb);
edit_hb->add_child(memnew(VSeparator));
diff --git a/editor/plugins/animation_blend_space_2d_editor.h b/editor/plugins/animation_blend_space_2d_editor.h
index 613289e4d8..74186791e1 100644
--- a/editor/plugins/animation_blend_space_2d_editor.h
+++ b/editor/plugins/animation_blend_space_2d_editor.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -60,6 +60,7 @@ class AnimationNodeBlendSpace2DEditor : public AnimationTreeNodeEditorPlugin {
ToolButton *snap;
SpinBox *snap_x;
SpinBox *snap_y;
+ OptionButton *interpolation;
ToolButton *auto_triangles;
@@ -137,6 +138,8 @@ class AnimationNodeBlendSpace2DEditor : public AnimationTreeNodeEditorPlugin {
MENU_LOAD_FILE_CONFIRM = 1002
};
+ void _blend_space_changed();
+
protected:
void _notification(int p_what);
static void _bind_methods();
diff --git a/editor/plugins/animation_blend_tree_editor_plugin.cpp b/editor/plugins/animation_blend_tree_editor_plugin.cpp
index eb3c432ee7..62eac05cb7 100644
--- a/editor/plugins/animation_blend_tree_editor_plugin.cpp
+++ b/editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -79,7 +79,7 @@ void AnimationNodeBlendTreeEditor::_update_options_menu() {
add_node->get_popup()->add_item(TTR("Paste"), MENU_PASTE);
}
add_node->get_popup()->add_separator();
- add_node->get_popup()->add_item(TTR("Load.."), MENU_LOAD_FILE);
+ add_node->get_popup()->add_item(TTR("Load..."), MENU_LOAD_FILE);
}
Size2 AnimationNodeBlendTreeEditor::get_minimum_size() const {
@@ -237,23 +237,17 @@ void AnimationNodeBlendTreeEditor::_update_graph() {
mb->get_popup()->connect("index_pressed", this, "_anim_selected", varray(options, E->get()), CONNECT_DEFERRED);
}
- /* should be no longer necessary, as the boolean works
- Ref<AnimationNodeOneShot> oneshot = agnode;
- if (oneshot.is_valid()) {
-
- HBoxContainer *play_stop = memnew(HBoxContainer);
- play_stop->add_spacer();
- Button *play = memnew(Button);
- play->set_icon(get_icon("Play", "EditorIcons"));
- play->connect("pressed", this, "_oneshot_start", varray(E->get()), CONNECT_DEFERRED);
- play_stop->add_child(play);
- Button *stop = memnew(Button);
- stop->set_icon(get_icon("Stop", "EditorIcons"));
- stop->connect("pressed", this, "_oneshot_stop", varray(E->get()), CONNECT_DEFERRED);
- play_stop->add_child(stop);
- play_stop->add_spacer();
- node->add_child(play_stop);
- } */
+ if (EditorSettings::get_singleton()->get("interface/theme/use_graph_node_headers")) {
+ Ref<StyleBoxFlat> sb = node->get_stylebox("frame", "GraphNode");
+ Color c = sb->get_border_color(MARGIN_TOP);
+ Color mono_color = ((c.r + c.g + c.b) / 3) < 0.7 ? Color(1.0, 1.0, 1.0) : Color(0.0, 0.0, 0.0);
+ mono_color.a = 0.85;
+ c = mono_color;
+
+ node->add_color_override("title_color", c);
+ c.a = 0.7;
+ node->add_color_override("close_color", c);
+ }
}
List<AnimationNodeBlendTree::NodeConnection> connections;
@@ -362,7 +356,7 @@ void AnimationNodeBlendTreeEditor::_connection_request(const String &p_from, int
undo_redo->create_action("Nodes Connected");
undo_redo->add_do_method(blend_tree.ptr(), "connect_node", p_to, p_to_index, p_from);
- undo_redo->add_undo_method(blend_tree.ptr(), "disconnect_node", p_to, p_to_index, p_from);
+ undo_redo->add_undo_method(blend_tree.ptr(), "disconnect_node", p_to, p_to_index);
undo_redo->add_do_method(this, "_update_graph");
undo_redo->add_undo_method(this, "_update_graph");
undo_redo->commit_action();
@@ -401,7 +395,7 @@ void AnimationNodeBlendTreeEditor::_delete_request(const String &p_which) {
undo_redo->create_action("Delete Node");
undo_redo->add_do_method(blend_tree.ptr(), "remove_node", p_which);
- undo_redo->add_undo_method(blend_tree.ptr(), "add_node", p_which, blend_tree->get_node(p_which));
+ undo_redo->add_undo_method(blend_tree.ptr(), "add_node", p_which, blend_tree->get_node(p_which), blend_tree.ptr()->get_node_position(p_which));
List<AnimationNodeBlendTree::NodeConnection> conns;
blend_tree->get_node_connections(&conns);
@@ -646,6 +640,9 @@ void AnimationNodeBlendTreeEditor::_notification(int p_what) {
error_panel->add_style_override("panel", get_stylebox("bg", "Tree"));
error_label->add_color_override("font_color", get_color("error_color", "Editor"));
+
+ if (p_what == NOTIFICATION_THEME_CHANGED && is_visible_in_tree())
+ _update_graph();
}
if (p_what == NOTIFICATION_PROCESS) {
@@ -816,6 +813,8 @@ void AnimationNodeBlendTreeEditor::_node_renamed(const String &p_text, Ref<Anima
break;
}
}
+
+ _update_graph(); // Needed to update the signal connections with the new name.
}
void AnimationNodeBlendTreeEditor::_node_renamed_focus_out(Node *le, Ref<AnimationNode> p_node) {
@@ -867,7 +866,7 @@ AnimationNodeBlendTreeEditor::AnimationNodeBlendTreeEditor() {
add_node = memnew(MenuButton);
graph->get_zoom_hbox()->add_child(add_node);
- add_node->set_text(TTR("Add Node.."));
+ add_node->set_text(TTR("Add Node..."));
graph->get_zoom_hbox()->move_child(add_node, 0);
add_node->get_popup()->connect("id_pressed", this, "_add_node");
add_node->connect("about_to_show", this, "_update_options_menu");
diff --git a/editor/plugins/animation_blend_tree_editor_plugin.h b/editor/plugins/animation_blend_tree_editor_plugin.h
index e2daefdec6..6df62c33da 100644
--- a/editor/plugins/animation_blend_tree_editor_plugin.h
+++ b/editor/plugins/animation_blend_tree_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -70,9 +70,9 @@ class AnimationNodeBlendTreeEditor : public AnimationTreeNodeEditorPlugin {
String name;
String type;
Ref<Script> script;
- AddOption(const String &p_name = String(), const String &p_type = String()) {
- name = p_name;
- type = p_type;
+ AddOption(const String &p_name = String(), const String &p_type = String()) :
+ name(p_name),
+ type(p_type) {
}
};
diff --git a/editor/plugins/animation_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp
index 445664f8dd..b32b537d3d 100644
--- a/editor/plugins/animation_player_editor_plugin.cpp
+++ b/editor/plugins/animation_player_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/animation_player_editor_plugin.h b/editor/plugins/animation_player_editor_plugin.h
index 55f082aadb..9085c70410 100644
--- a/editor/plugins/animation_player_editor_plugin.h
+++ b/editor/plugins/animation_player_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/animation_state_machine_editor.cpp b/editor/plugins/animation_state_machine_editor.cpp
index e83773257b..197ee77254 100644
--- a/editor/plugins/animation_state_machine_editor.cpp
+++ b/editor/plugins/animation_state_machine_editor.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -118,7 +118,7 @@ void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEv
menu->add_item(TTR("Paste"), MENU_PASTE);
}
menu->add_separator();
- menu->add_item(TTR("Load.."), MENU_LOAD_FILE);
+ menu->add_item(TTR("Load..."), MENU_LOAD_FILE);
menu->set_global_position(state_machine_draw->get_global_transform().xform(mb->get_position()));
menu->popup();
@@ -572,8 +572,8 @@ void AnimationNodeStateMachineEditor::_state_machine_draw() {
Ref<AnimationNodeStateMachinePlayback> playback = AnimationTreeEditor::get_singleton()->get_tree()->get(AnimationTreeEditor::get_singleton()->get_base_path() + "playback");
- Ref<StyleBox> style = get_stylebox("frame", "GraphNode");
- Ref<StyleBox> style_selected = get_stylebox("selectedframe", "GraphNode");
+ Ref<StyleBox> style = get_stylebox("state_machine_frame", "GraphNode");
+ Ref<StyleBox> style_selected = get_stylebox("state_machine_selectedframe", "GraphNode");
Ref<Font> font = get_font("title_font", "GraphNode");
Color font_color = get_color("title_color", "GraphNode");
@@ -606,7 +606,7 @@ void AnimationNodeStateMachineEditor::_state_machine_draw() {
state_machine->get_node_list(&nodes);
node_rects.clear();
- Rect2 scroll_range(Point2(), state_machine_draw->get_size());
+ Rect2 scroll_range;
//snap lines
if (dragging_selected) {
@@ -823,7 +823,8 @@ void AnimationNodeStateMachineEditor::_state_machine_draw() {
}
}
- scroll_range = scroll_range.grow(200 * EDSCALE);
+ scroll_range.position -= state_machine_draw->get_size();
+ scroll_range.size += state_machine_draw->get_size() * 2.0;
//adjust scrollbars
updating = true;
@@ -849,7 +850,7 @@ void AnimationNodeStateMachineEditor::_state_machine_pos_draw() {
return;
int idx = -1;
- for (int i = 0; node_rects.size(); i++) {
+ for (int i = 0; i < node_rects.size(); i++) {
if (node_rects[i].node_name == playback->get_current_node()) {
idx = i;
break;
@@ -1064,6 +1065,7 @@ void AnimationNodeStateMachineEditor::_open_editor(const String &p_name) {
}
void AnimationNodeStateMachineEditor::_removed_from_graph() {
+
EditorNode::get_singleton()->edit_item(NULL);
}
@@ -1073,7 +1075,9 @@ void AnimationNodeStateMachineEditor::_name_edited(const String &p_text) {
ERR_FAIL_COND(new_name == "" || new_name.find(".") != -1 || new_name.find("/") != -1)
- ERR_FAIL_COND(new_name == prev_name);
+ if (new_name == prev_name) {
+ return; // Nothing to do.
+ }
String base_name = new_name;
int base = 1;
@@ -1097,7 +1101,13 @@ void AnimationNodeStateMachineEditor::_name_edited(const String &p_text) {
name_edit->hide();
}
+void AnimationNodeStateMachineEditor::_name_edited_focus_out() {
+
+ _name_edited(name_edit->get_text());
+}
+
void AnimationNodeStateMachineEditor::_scroll_changed(double) {
+
if (updating)
return;
@@ -1111,7 +1121,7 @@ void AnimationNodeStateMachineEditor::_erase_selected() {
updating = true;
undo_redo->create_action("Node Removed");
undo_redo->add_do_method(state_machine.ptr(), "remove_node", selected_node);
- undo_redo->add_undo_method(state_machine.ptr(), "add_node", selected_node, state_machine->get_node(selected_node));
+ undo_redo->add_undo_method(state_machine.ptr(), "add_node", selected_node, state_machine->get_node(selected_node), state_machine->get_node_position(selected_node));
for (int i = 0; i < state_machine->get_transition_count(); i++) {
String from = state_machine->get_transition_from(i);
String to = state_machine->get_transition_to(i);
@@ -1215,6 +1225,7 @@ void AnimationNodeStateMachineEditor::_bind_methods() {
ClassDB::bind_method("_add_animation_type", &AnimationNodeStateMachineEditor::_add_animation_type);
ClassDB::bind_method("_name_edited", &AnimationNodeStateMachineEditor::_name_edited);
+ ClassDB::bind_method("_name_edited_focus_out", &AnimationNodeStateMachineEditor::_name_edited_focus_out);
ClassDB::bind_method("_removed_from_graph", &AnimationNodeStateMachineEditor::_removed_from_graph);
@@ -1267,7 +1278,7 @@ AnimationNodeStateMachineEditor::AnimationNodeStateMachineEditor() {
top_hb->add_child(tool_erase_hb);
tool_erase_hb->add_child(memnew(VSeparator));
tool_erase = memnew(ToolButton);
- tool_erase->set_tooltip(TTR("Remove selected node or transition"));
+ tool_erase->set_tooltip(TTR("Remove selected node or transition."));
tool_erase_hb->add_child(tool_erase);
tool_erase->connect("pressed", this, "_erase_selected");
tool_erase->set_disabled(true);
@@ -1297,17 +1308,13 @@ AnimationNodeStateMachineEditor::AnimationNodeStateMachineEditor() {
play_mode = memnew(OptionButton);
top_hb->add_child(play_mode);
- GridContainer *main_grid = memnew(GridContainer);
- main_grid->set_columns(2);
- add_child(main_grid);
- main_grid->set_v_size_flags(SIZE_EXPAND_FILL);
-
panel = memnew(PanelContainer);
panel->set_clip_contents(true);
- main_grid->add_child(panel);
- panel->set_h_size_flags(SIZE_EXPAND_FILL);
+ add_child(panel);
+ panel->set_v_size_flags(SIZE_EXPAND_FILL);
state_machine_draw = memnew(Control);
+ panel->add_child(state_machine_draw);
state_machine_draw->connect("gui_input", this, "_state_machine_gui_input");
state_machine_draw->connect("draw", this, "_state_machine_draw");
state_machine_draw->set_focus_mode(FOCUS_ALL);
@@ -1318,24 +1325,22 @@ AnimationNodeStateMachineEditor::AnimationNodeStateMachineEditor() {
state_machine_play_pos->set_anchors_and_margins_preset(PRESET_WIDE);
state_machine_play_pos->connect("draw", this, "_state_machine_pos_draw");
- panel->add_child(state_machine_draw);
- panel->set_v_size_flags(SIZE_EXPAND_FILL);
-
v_scroll = memnew(VScrollBar);
- main_grid->add_child(v_scroll);
+ state_machine_draw->add_child(v_scroll);
+ v_scroll->set_anchors_and_margins_preset(PRESET_RIGHT_WIDE);
v_scroll->connect("value_changed", this, "_scroll_changed");
h_scroll = memnew(HScrollBar);
- main_grid->add_child(h_scroll);
+ state_machine_draw->add_child(h_scroll);
+ h_scroll->set_anchors_and_margins_preset(PRESET_BOTTOM_WIDE);
+ h_scroll->set_margin(MARGIN_RIGHT, -v_scroll->get_size().x * EDSCALE);
h_scroll->connect("value_changed", this, "_scroll_changed");
- main_grid->add_child(memnew(Control)); //empty bottom right
-
error_panel = memnew(PanelContainer);
add_child(error_panel);
error_label = memnew(Label);
error_panel->add_child(error_label);
- error_label->set_text("eh");
+ error_panel->hide();
undo_redo = EditorNode::get_singleton()->get_undo_redo();
@@ -1354,6 +1359,7 @@ AnimationNodeStateMachineEditor::AnimationNodeStateMachineEditor() {
state_machine_draw->add_child(name_edit);
name_edit->hide();
name_edit->connect("text_entered", this, "_name_edited");
+ name_edit->connect("focus_exited", this, "_name_edited_focus_out");
name_edit->set_as_toplevel(true);
open_file = memnew(EditorFileDialog);
diff --git a/editor/plugins/animation_state_machine_editor.h b/editor/plugins/animation_state_machine_editor.h
index 7b8a4a0e94..1c4c06090a 100644
--- a/editor/plugins/animation_state_machine_editor.h
+++ b/editor/plugins/animation_state_machine_editor.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -143,6 +143,7 @@ class AnimationNodeStateMachineEditor : public AnimationTreeNodeEditorPlugin {
String prev_name;
void _name_edited(const String &p_text);
+ void _name_edited_focus_out();
void _open_editor(const String &p_name);
void _scroll_changed(double);
diff --git a/editor/plugins/animation_tree_editor_plugin.cpp b/editor/plugins/animation_tree_editor_plugin.cpp
index 24787a78e9..2c1da3c10b 100644
--- a/editor/plugins/animation_tree_editor_plugin.cpp
+++ b/editor/plugins/animation_tree_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -64,34 +64,15 @@ void AnimationTreeEditor::edit(AnimationTree *p_tree) {
void AnimationTreeEditor::_path_button_pressed(int p_path) {
- Ref<AnimationNode> node = tree->get_tree_root();
- if (node.is_null())
- return;
-
edited_path.clear();
- if (p_path >= 0) {
- for (int i = 0; i <= p_path; i++) {
- Ref<AnimationNode> child = node->get_child_by_name(button_path[i]);
- ERR_BREAK(child.is_null());
- node = child;
- edited_path.push_back(button_path[i]);
- }
- }
-
- for (int i = 0; i < editors.size(); i++) {
- if (editors[i]->can_edit(node)) {
- editors[i]->edit(node);
- editors[i]->show();
- } else {
- editors[i]->edit(Ref<AnimationNode>());
- editors[i]->hide();
- }
+ for (int i = 0; i <= p_path; i++) {
+ edited_path.push_back(button_path[i]);
}
}
void AnimationTreeEditor::_update_path() {
- while (path_hb->get_child_count()) {
- memdelete(path_hb->get_child(0));
+ while (path_hb->get_child_count() > 1) {
+ memdelete(path_hb->get_child(1));
}
Ref<ButtonGroup> group;
@@ -176,6 +157,10 @@ void AnimationTreeEditor::_notification(int p_what) {
if (root != current_root) {
edit_path(Vector<String>());
}
+
+ if (button_path.size() != edited_path.size()) {
+ edit_path(edited_path);
+ }
}
}
@@ -251,6 +236,9 @@ AnimationTreeEditor::AnimationTreeEditor() {
path_edit->set_enable_v_scroll(false);
path_hb = memnew(HBoxContainer);
path_edit->add_child(path_hb);
+ path_hb->add_child(memnew(Label(TTR("Path:"))));
+
+ add_child(memnew(HSeparator));
current_root = 0;
singleton = this;
diff --git a/editor/plugins/animation_tree_editor_plugin.h b/editor/plugins/animation_tree_editor_plugin.h
index be8848d600..4a7f933bbf 100644
--- a/editor/plugins/animation_tree_editor_plugin.h
+++ b/editor/plugins/animation_tree_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/animation_tree_player_editor_plugin.cpp b/editor/plugins/animation_tree_player_editor_plugin.cpp
index c79e3a436d..e2a44069d9 100644
--- a/editor/plugins/animation_tree_player_editor_plugin.cpp
+++ b/editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -1,12 +1,12 @@
/*************************************************************************/
-/* animation_tree_editor_plugin.cpp */
+/* animation_tree_player_editor_plugin.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/animation_tree_player_editor_plugin.h b/editor/plugins/animation_tree_player_editor_plugin.h
index d1c5f395e4..f4bfe58909 100644
--- a/editor/plugins/animation_tree_player_editor_plugin.h
+++ b/editor/plugins/animation_tree_player_editor_plugin.h
@@ -1,12 +1,12 @@
/*************************************************************************/
-/* animation_tree_editor_plugin.h */
+/* animation_tree_player_editor_plugin.h */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/asset_library_editor_plugin.cpp b/editor/plugins/asset_library_editor_plugin.cpp
index 138b8a491c..a42765df6b 100644
--- a/editor/plugins/asset_library_editor_plugin.cpp
+++ b/editor/plugins/asset_library_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/asset_library_editor_plugin.h b/editor/plugins/asset_library_editor_plugin.h
index 69a65dd3dc..dd5f3c2077 100644
--- a/editor/plugins/asset_library_editor_plugin.h
+++ b/editor/plugins/asset_library_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/audio_stream_editor_plugin.cpp b/editor/plugins/audio_stream_editor_plugin.cpp
index 06ca5833e2..172096b1a7 100644
--- a/editor/plugins/audio_stream_editor_plugin.cpp
+++ b/editor/plugins/audio_stream_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/audio_stream_editor_plugin.h b/editor/plugins/audio_stream_editor_plugin.h
index 1887874b74..e60bf6a38f 100644
--- a/editor/plugins/audio_stream_editor_plugin.h
+++ b/editor/plugins/audio_stream_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/baked_lightmap_editor_plugin.cpp b/editor/plugins/baked_lightmap_editor_plugin.cpp
index 40e3bb5be2..d90ff95c1f 100644
--- a/editor/plugins/baked_lightmap_editor_plugin.cpp
+++ b/editor/plugins/baked_lightmap_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/baked_lightmap_editor_plugin.h b/editor/plugins/baked_lightmap_editor_plugin.h
index 8d3b5b1dd6..ff4b59244f 100644
--- a/editor/plugins/baked_lightmap_editor_plugin.h
+++ b/editor/plugins/baked_lightmap_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/camera_editor_plugin.cpp b/editor/plugins/camera_editor_plugin.cpp
index 3d8b24ccc7..2531d59d1b 100644
--- a/editor/plugins/camera_editor_plugin.cpp
+++ b/editor/plugins/camera_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/camera_editor_plugin.h b/editor/plugins/camera_editor_plugin.h
index 0340808c9a..eac9acab93 100644
--- a/editor/plugins/camera_editor_plugin.h
+++ b/editor/plugins/camera_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp
index ee2283a035..86d6799b19 100644
--- a/editor/plugins/canvas_item_editor_plugin.cpp
+++ b/editor/plugins/canvas_item_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -456,7 +456,7 @@ void CanvasItemEditor::_find_canvas_items_at_pos(const Point2 &p_pos, Node *p_no
if (Object::cast_to<Viewport>(p_node))
return;
- const real_t grab_distance = EDITOR_DEF("editors/poly_editor/point_grab_radius", 8);
+ const real_t grab_distance = EDITOR_GET("editors/poly_editor/point_grab_radius");
CanvasItem *canvas_item = Object::cast_to<CanvasItem>(p_node);
for (int i = p_node->get_child_count() - 1; i >= 0; i--) {
@@ -573,10 +573,10 @@ bool CanvasItemEditor::_get_bone_shape(Vector<Vector2> *shape, Vector<Vector2> *
Node2D *from_node = Object::cast_to<Node2D>(ObjectDB::get_instance(bone->key().from));
Node2D *to_node = Object::cast_to<Node2D>(ObjectDB::get_instance(bone->key().to));
- if (!from_node->is_inside_tree())
- return false; //may have been removed
if (!from_node)
return false;
+ if (!from_node->is_inside_tree())
+ return false; //may have been removed
if (!to_node && bone->get().length == 0)
return false;
@@ -2033,16 +2033,19 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) {
// Find the item to select
CanvasItem *canvas_item = NULL;
- Vector<_SelectResult> selection;
-
- // Retrieve the items
- _get_canvas_items_at_pos(click, selection);
// Retrieve the bones
+ Vector<_SelectResult> selection = Vector<_SelectResult>();
_get_bones_at_pos(click, selection);
-
if (!selection.empty()) {
canvas_item = selection[0].item;
+ } else {
+ // Retrieve the canvas items
+ selection = Vector<_SelectResult>();
+ _get_canvas_items_at_pos(click, selection);
+ if (!selection.empty()) {
+ canvas_item = selection[0].item;
+ }
}
if (!canvas_item) {
@@ -4606,7 +4609,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
warning_child_of_container = memnew(Label);
warning_child_of_container->hide();
- warning_child_of_container->set_text("Warning: Children of a container get their position and size determined only by their parent");
+ warning_child_of_container->set_text(TTR("Warning: Children of a container get their position and size determined only by their parent."));
add_control_to_info_overlay(warning_child_of_container);
h_scroll = memnew(HScrollBar);
@@ -4626,19 +4629,19 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
zoom_minus = memnew(ToolButton);
zoom_hb->add_child(zoom_minus);
zoom_minus->connect("pressed", this, "_button_zoom_minus");
- zoom_minus->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_minus", TTR("Zoom out"), KEY_MASK_CMD | KEY_MINUS));
+ zoom_minus->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_minus", TTR("Zoom Out"), KEY_MASK_CMD | KEY_MINUS));
zoom_minus->set_focus_mode(FOCUS_NONE);
zoom_reset = memnew(ToolButton);
zoom_hb->add_child(zoom_reset);
zoom_reset->connect("pressed", this, "_button_zoom_reset");
- zoom_reset->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_reset", TTR("Zoom reset"), KEY_MASK_CMD | KEY_0));
+ zoom_reset->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_reset", TTR("Zoom Reset"), KEY_MASK_CMD | KEY_0));
zoom_reset->set_focus_mode(FOCUS_NONE);
zoom_plus = memnew(ToolButton);
zoom_hb->add_child(zoom_plus);
zoom_plus->connect("pressed", this, "_button_zoom_plus");
- zoom_plus->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_plus", TTR("Zoom in"), KEY_MASK_CMD | KEY_EQUAL)); // Usually direct access key for PLUS
+ zoom_plus->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_plus", TTR("Zoom In"), KEY_MASK_CMD | KEY_EQUAL)); // Usually direct access key for PLUS
zoom_plus->set_focus_mode(FOCUS_NONE);
updating_scroll = false;
diff --git a/editor/plugins/canvas_item_editor_plugin.h b/editor/plugins/canvas_item_editor_plugin.h
index 207e57dbe2..7b6563944e 100644
--- a/editor/plugins/canvas_item_editor_plugin.h
+++ b/editor/plugins/canvas_item_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/collision_polygon_2d_editor_plugin.cpp b/editor/plugins/collision_polygon_2d_editor_plugin.cpp
index 672337ba2f..0179adc148 100644
--- a/editor/plugins/collision_polygon_2d_editor_plugin.cpp
+++ b/editor/plugins/collision_polygon_2d_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/collision_polygon_2d_editor_plugin.h b/editor/plugins/collision_polygon_2d_editor_plugin.h
index ba691ab76a..e15360d4e5 100644
--- a/editor/plugins/collision_polygon_2d_editor_plugin.h
+++ b/editor/plugins/collision_polygon_2d_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/collision_polygon_editor_plugin.cpp b/editor/plugins/collision_polygon_editor_plugin.cpp
index 805a7d3835..6ab554cb05 100644
--- a/editor/plugins/collision_polygon_editor_plugin.cpp
+++ b/editor/plugins/collision_polygon_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -95,7 +95,7 @@ void Polygon3DEditor::_menu_option(int p_option) {
void Polygon3DEditor::_wip_close() {
- undo_redo->create_action(TTR("Create Poly3D"));
+ undo_redo->create_action(TTR("Create Polygon3D"));
undo_redo->add_undo_method(node, "set_polygon", node->call("get_polygon"));
undo_redo->add_do_method(node, "set_polygon", wip);
undo_redo->add_do_method(this, "_polygon_draw");
@@ -144,7 +144,7 @@ bool Polygon3DEditor::forward_spatial_gui_input(Camera *p_camera, const Ref<Inpu
Vector<Vector2> poly = node->call("get_polygon");
//first check if a point is to be added (segment split)
- real_t grab_threshold = EDITOR_DEF("editors/poly_editor/point_grab_radius", 8);
+ real_t grab_threshold = EDITOR_GET("editors/poly_editor/point_grab_radius");
switch (mode) {
diff --git a/editor/plugins/collision_polygon_editor_plugin.h b/editor/plugins/collision_polygon_editor_plugin.h
index 4229808e2f..a699641aba 100644
--- a/editor/plugins/collision_polygon_editor_plugin.h
+++ b/editor/plugins/collision_polygon_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/collision_shape_2d_editor_plugin.cpp b/editor/plugins/collision_shape_2d_editor_plugin.cpp
index 313ba1ee6b..fc572f54e1 100644
--- a/editor/plugins/collision_shape_2d_editor_plugin.cpp
+++ b/editor/plugins/collision_shape_2d_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/collision_shape_2d_editor_plugin.h b/editor/plugins/collision_shape_2d_editor_plugin.h
index fb7b2acb0f..965e6c8827 100644
--- a/editor/plugins/collision_shape_2d_editor_plugin.h
+++ b/editor/plugins/collision_shape_2d_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/cpu_particles_editor_plugin.cpp b/editor/plugins/cpu_particles_editor_plugin.cpp
index 8d3ebc5052..7222525dd7 100644
--- a/editor/plugins/cpu_particles_editor_plugin.cpp
+++ b/editor/plugins/cpu_particles_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/cpu_particles_editor_plugin.h b/editor/plugins/cpu_particles_editor_plugin.h
index 16fb0bab0c..09b0adbe5d 100644
--- a/editor/plugins/cpu_particles_editor_plugin.h
+++ b/editor/plugins/cpu_particles_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/curve_editor_plugin.cpp b/editor/plugins/curve_editor_plugin.cpp
index ace3012c10..3d76b5da21 100644
--- a/editor/plugins/curve_editor_plugin.cpp
+++ b/editor/plugins/curve_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/curve_editor_plugin.h b/editor/plugins/curve_editor_plugin.h
index fa0b92e353..b034368b6a 100644
--- a/editor/plugins/curve_editor_plugin.h
+++ b/editor/plugins/curve_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/editor_preview_plugins.cpp b/editor/plugins/editor_preview_plugins.cpp
index 7f83865777..8464dfd0aa 100644
--- a/editor/plugins/editor_preview_plugins.cpp
+++ b/editor/plugins/editor_preview_plugins.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -86,6 +86,7 @@ Ref<Texture> EditorTexturePreviewPlugin::generate(const RES &p_from, const Size2
Ref<Image> img;
Ref<AtlasTexture> atex = p_from;
+ Ref<LargeTexture> ltex = p_from;
if (atex.is_valid()) {
Ref<Texture> tex = atex->get_atlas();
if (!tex.is_valid()) {
@@ -93,6 +94,8 @@ Ref<Texture> EditorTexturePreviewPlugin::generate(const RES &p_from, const Size2
}
Ref<Image> atlas = tex->get_data();
img = atlas->get_rect(atex->get_region());
+ } else if (ltex.is_valid()) {
+ img = ltex->to_image();
} else {
Ref<Texture> tex = p_from;
img = tex->get_data();
diff --git a/editor/plugins/editor_preview_plugins.h b/editor/plugins/editor_preview_plugins.h
index ed5d2a3ecd..ed2c003a0a 100644
--- a/editor/plugins/editor_preview_plugins.h
+++ b/editor/plugins/editor_preview_plugins.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/gi_probe_editor_plugin.cpp b/editor/plugins/gi_probe_editor_plugin.cpp
index 5fc5cad1ef..a6125af1f7 100644
--- a/editor/plugins/gi_probe_editor_plugin.cpp
+++ b/editor/plugins/gi_probe_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/gi_probe_editor_plugin.h b/editor/plugins/gi_probe_editor_plugin.h
index 1b3b63f227..c33668ae19 100644
--- a/editor/plugins/gi_probe_editor_plugin.h
+++ b/editor/plugins/gi_probe_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/gradient_editor_plugin.cpp b/editor/plugins/gradient_editor_plugin.cpp
index 442bd52ea7..62a9ce719b 100644
--- a/editor/plugins/gradient_editor_plugin.cpp
+++ b/editor/plugins/gradient_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/gradient_editor_plugin.h b/editor/plugins/gradient_editor_plugin.h
index 0c878b168f..91790abee8 100644
--- a/editor/plugins/gradient_editor_plugin.h
+++ b/editor/plugins/gradient_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/item_list_editor_plugin.cpp b/editor/plugins/item_list_editor_plugin.cpp
index 8df40232b0..db0816064c 100644
--- a/editor/plugins/item_list_editor_plugin.cpp
+++ b/editor/plugins/item_list_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -109,7 +109,7 @@ void ItemListPlugin::_get_property_list(List<PropertyInfo> *p_list) const {
int flags = get_flags();
if (flags & FLAG_CHECKABLE) {
- p_list->push_back(PropertyInfo(Variant::BOOL, base + "checkable", PROPERTY_HINT_ENUM, "No,As checkbox,As radio button"));
+ p_list->push_back(PropertyInfo(Variant::INT, base + "checkable", PROPERTY_HINT_ENUM, "No,As checkbox,As radio button"));
p_list->push_back(PropertyInfo(Variant::BOOL, base + "checked"));
}
@@ -265,6 +265,9 @@ void ItemListEditor::_notification(int p_notification) {
add_button->set_icon(get_icon("Add", "EditorIcons"));
del_button->set_icon(get_icon("Remove", "EditorIcons"));
+ } else if (p_notification == NOTIFICATION_READY) {
+
+ get_tree()->connect("node_removed", this, "_node_removed");
}
}
@@ -341,6 +344,7 @@ bool ItemListEditor::handles(Object *p_object) const {
void ItemListEditor::_bind_methods() {
+ ClassDB::bind_method("_node_removed", &ItemListEditor::_node_removed);
ClassDB::bind_method("_edit_items", &ItemListEditor::_edit_items);
ClassDB::bind_method("_add_button", &ItemListEditor::_add_pressed);
ClassDB::bind_method("_delete_button", &ItemListEditor::_delete_pressed);
diff --git a/editor/plugins/item_list_editor_plugin.h b/editor/plugins/item_list_editor_plugin.h
index 3dc3775f83..679235e316 100644
--- a/editor/plugins/item_list_editor_plugin.h
+++ b/editor/plugins/item_list_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/light_occluder_2d_editor_plugin.cpp b/editor/plugins/light_occluder_2d_editor_plugin.cpp
index 6a16cf0989..d8f6259598 100644
--- a/editor/plugins/light_occluder_2d_editor_plugin.cpp
+++ b/editor/plugins/light_occluder_2d_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -30,425 +30,91 @@
#include "light_occluder_2d_editor_plugin.h"
-#include "canvas_item_editor_plugin.h"
-#include "core/os/file_access.h"
-#include "editor/editor_settings.h"
+Ref<OccluderPolygon2D> LightOccluder2DEditor::_ensure_occluder() const {
-void LightOccluder2DEditor::_notification(int p_what) {
+ Ref<OccluderPolygon2D> occluder = node->get_occluder_polygon();
+ if (!occluder.is_valid()) {
- switch (p_what) {
-
- case NOTIFICATION_READY: {
-
- button_create->set_icon(get_icon("Edit", "EditorIcons"));
- button_edit->set_icon(get_icon("MovePoint", "EditorIcons"));
- button_edit->set_pressed(true);
- get_tree()->connect("node_removed", this, "_node_removed");
- create_poly->connect("confirmed", this, "_create_poly");
-
- } break;
- case NOTIFICATION_PHYSICS_PROCESS: {
-
- } break;
- }
-}
-void LightOccluder2DEditor::_node_removed(Node *p_node) {
-
- if (p_node == node) {
- node = NULL;
- hide();
- canvas_item_editor->update_viewport();
+ occluder = Ref<OccluderPolygon2D>(memnew(OccluderPolygon2D));
+ node->set_occluder_polygon(occluder);
}
+ return occluder;
}
-void LightOccluder2DEditor::_menu_option(int p_option) {
+Node2D *LightOccluder2DEditor::_get_node() const {
- switch (p_option) {
-
- case MODE_CREATE: {
-
- mode = MODE_CREATE;
- button_create->set_pressed(true);
- button_edit->set_pressed(false);
- } break;
- case MODE_EDIT: {
-
- mode = MODE_EDIT;
- button_create->set_pressed(false);
- button_edit->set_pressed(true);
- } break;
- }
+ return node;
}
-void LightOccluder2DEditor::_wip_close(bool p_closed) {
-
- undo_redo->create_action(TTR("Create Poly"));
- undo_redo->add_undo_method(node->get_occluder_polygon().ptr(), "set_polygon", node->get_occluder_polygon()->get_polygon());
- undo_redo->add_do_method(node->get_occluder_polygon().ptr(), "set_polygon", wip);
- undo_redo->add_undo_method(node->get_occluder_polygon().ptr(), "set_closed", node->get_occluder_polygon()->is_closed());
- undo_redo->add_do_method(node->get_occluder_polygon().ptr(), "set_closed", p_closed);
+void LightOccluder2DEditor::_set_node(Node *p_polygon) {
- undo_redo->add_do_method(canvas_item_editor, "update_viewport");
- undo_redo->add_undo_method(canvas_item_editor, "update_viewport");
- undo_redo->commit_action();
- wip.clear();
- wip_active = false;
- mode = MODE_EDIT;
- button_edit->set_pressed(true);
- button_create->set_pressed(false);
- edited_point = -1;
+ node = Object::cast_to<LightOccluder2D>(p_polygon);
}
-bool LightOccluder2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
+bool LightOccluder2DEditor::_is_line() const {
- if (!node)
+ Ref<OccluderPolygon2D> occluder = node->get_occluder_polygon();
+ if (occluder.is_valid())
+ return !occluder->is_closed();
+ else
return false;
-
- if (node->get_occluder_polygon().is_null()) {
- Ref<InputEventMouseButton> mb = p_event;
- if (mb.is_valid() && mb->get_button_index() == 1 && mb->is_pressed()) {
- create_poly->set_text(TTR("No OccluderPolygon2D resource on this node.\nCreate and assign one?"));
- create_poly->popup_centered_minsize();
- }
- return (mb.is_valid() && mb->get_button_index() == 1);
- }
-
- Ref<InputEventMouseButton> mb = p_event;
-
- if (mb.is_valid()) {
-
- Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
-
- Vector2 gpoint = mb->get_position();
- Vector2 cpoint = node->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mb->get_position())));
-
- Vector<Vector2> poly = Variant(node->get_occluder_polygon()->get_polygon());
-
- //first check if a point is to be added (segment split)
- real_t grab_threshold = EDITOR_DEF("editors/poly_editor/point_grab_radius", 8);
-
- switch (mode) {
-
- case MODE_CREATE: {
-
- if (mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) {
-
- if (!wip_active) {
-
- wip.clear();
- wip.push_back(cpoint);
- wip_active = true;
- edited_point_pos = cpoint;
- canvas_item_editor->update_viewport();
- edited_point = 1;
- return true;
- } else {
-
- if (wip.size() > 1 && xform.xform(wip[0]).distance_to(gpoint) < grab_threshold) {
- //wip closed
- _wip_close(true);
-
- return true;
- } else if (wip.size() > 1 && xform.xform(wip[wip.size() - 1]).distance_to(gpoint) < grab_threshold) {
- //wip closed
- _wip_close(false);
- return true;
-
- } else {
-
- wip.push_back(cpoint);
- edited_point = wip.size();
- canvas_item_editor->update_viewport();
- return true;
-
- //add wip point
- }
- }
- } else if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed() && wip_active) {
- _wip_close(true);
- }
-
- } break;
-
- case MODE_EDIT: {
-
- if (mb->get_button_index() == BUTTON_LEFT) {
- if (mb->is_pressed()) {
-
- if (mb->get_control()) {
-
- if (poly.size() < 3) {
-
- undo_redo->create_action(TTR("Edit Poly"));
- undo_redo->add_undo_method(node->get_occluder_polygon().ptr(), "set_polygon", poly);
- poly.push_back(cpoint);
- undo_redo->add_do_method(node->get_occluder_polygon().ptr(), "set_polygon", poly);
- undo_redo->add_do_method(canvas_item_editor, "update_viewport");
- undo_redo->add_undo_method(canvas_item_editor, "update_viewport");
- undo_redo->commit_action();
- return true;
- }
-
- //search edges
- int closest_idx = -1;
- Vector2 closest_pos;
- real_t closest_dist = 1e10;
- for (int i = 0; i < poly.size(); i++) {
-
- Vector2 points[2] = { xform.xform(poly[i]),
- xform.xform(poly[(i + 1) % poly.size()]) };
-
- Vector2 cp = Geometry::get_closest_point_to_segment_2d(gpoint, points);
- if (cp.distance_squared_to(points[0]) < CMP_EPSILON2 || cp.distance_squared_to(points[1]) < CMP_EPSILON2)
- continue; //not valid to reuse point
-
- real_t d = cp.distance_to(gpoint);
- if (d < closest_dist && d < grab_threshold) {
- closest_dist = d;
- closest_pos = cp;
- closest_idx = i;
- }
- }
-
- if (closest_idx >= 0) {
-
- pre_move_edit = poly;
- poly.insert(closest_idx + 1, xform.affine_inverse().xform(closest_pos));
- edited_point = closest_idx + 1;
- edited_point_pos = xform.affine_inverse().xform(closest_pos);
- node->get_occluder_polygon()->set_polygon(Variant(poly));
- canvas_item_editor->update_viewport();
- return true;
- }
- } else {
-
- //look for points to move
-
- int closest_idx = -1;
- Vector2 closest_pos;
- real_t closest_dist = 1e10;
- for (int i = 0; i < poly.size(); i++) {
-
- Vector2 cp = xform.xform(poly[i]);
-
- real_t d = cp.distance_to(gpoint);
- if (d < closest_dist && d < grab_threshold) {
- closest_dist = d;
- closest_pos = cp;
- closest_idx = i;
- }
- }
-
- if (closest_idx >= 0) {
-
- pre_move_edit = poly;
- edited_point = closest_idx;
- edited_point_pos = xform.affine_inverse().xform(closest_pos);
- canvas_item_editor->update_viewport();
- return true;
- }
- }
- } else {
-
- if (edited_point != -1) {
-
- //apply
-
- ERR_FAIL_INDEX_V(edited_point, poly.size(), false);
- poly.write[edited_point] = edited_point_pos;
- undo_redo->create_action(TTR("Edit Poly"));
- undo_redo->add_do_method(node->get_occluder_polygon().ptr(), "set_polygon", poly);
- undo_redo->add_undo_method(node->get_occluder_polygon().ptr(), "set_polygon", pre_move_edit);
- undo_redo->add_do_method(canvas_item_editor, "update_viewport");
- undo_redo->add_undo_method(canvas_item_editor, "update_viewport");
- undo_redo->commit_action();
-
- edited_point = -1;
- return true;
- }
- }
- } else if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed() && edited_point == -1) {
-
- int closest_idx = -1;
- Vector2 closest_pos;
- real_t closest_dist = 1e10;
- for (int i = 0; i < poly.size(); i++) {
-
- Vector2 cp = xform.xform(poly[i]);
-
- real_t d = cp.distance_to(gpoint);
- if (d < closest_dist && d < grab_threshold) {
- closest_dist = d;
- closest_pos = cp;
- closest_idx = i;
- }
- }
-
- if (closest_idx >= 0) {
-
- undo_redo->create_action(TTR("Edit Poly (Remove Point)"));
- undo_redo->add_undo_method(node->get_occluder_polygon().ptr(), "set_polygon", poly);
- poly.remove(closest_idx);
- undo_redo->add_do_method(node->get_occluder_polygon().ptr(), "set_polygon", poly);
- undo_redo->add_do_method(canvas_item_editor, "update_viewport");
- undo_redo->add_undo_method(canvas_item_editor, "update_viewport");
- undo_redo->commit_action();
- return true;
- }
- }
-
- } break;
- }
- }
-
- Ref<InputEventMouseMotion> mm = p_event;
-
- if (mm.is_valid()) {
-
- if (edited_point != -1 && (wip_active || mm->get_button_mask() & BUTTON_MASK_LEFT)) {
-
- Vector2 gpoint = mm->get_position();
- Vector2 cpoint = canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint);
- cpoint = canvas_item_editor->snap_point(cpoint);
- edited_point_pos = node->get_global_transform().affine_inverse().xform(cpoint);
-
- canvas_item_editor->update_viewport();
- }
- }
-
- return false;
}
-void LightOccluder2DEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
-
- if (!node || !node->get_occluder_polygon().is_valid())
- return;
-
- Vector<Vector2> poly;
+int LightOccluder2DEditor::_get_polygon_count() const {
- if (wip_active)
- poly = wip;
+ Ref<OccluderPolygon2D> occluder = node->get_occluder_polygon();
+ if (occluder.is_valid())
+ return occluder->get_polygon().size();
else
- poly = Variant(node->get_occluder_polygon()->get_polygon());
-
- Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
- Ref<Texture> handle = get_icon("EditorHandle", "EditorIcons");
-
- for (int i = 0; i < poly.size(); i++) {
-
- Vector2 p, p2;
- p = i == edited_point ? edited_point_pos : poly[i];
- if ((wip_active && i == poly.size() - 1) || (((i + 1) % poly.size()) == edited_point))
- p2 = edited_point_pos;
- else
- p2 = poly[(i + 1) % poly.size()];
+ return 0;
+}
- Vector2 point = xform.xform(p);
- Vector2 next_point = xform.xform(p2);
+Variant LightOccluder2DEditor::_get_polygon(int p_idx) const {
- Color col = Color(1, 0.3, 0.1, 0.8);
+ Ref<OccluderPolygon2D> occluder = node->get_occluder_polygon();
+ if (occluder.is_valid())
+ return occluder->get_polygon();
+ else
+ return Variant(Vector<Vector2>());
+}
- if (i == poly.size() - 1 && (!node->get_occluder_polygon()->is_closed() || wip_active)) {
+void LightOccluder2DEditor::_set_polygon(int p_idx, const Variant &p_polygon) const {
- } else {
- p_overlay->draw_line(point, next_point, col, 2);
- }
- p_overlay->draw_texture(handle, point - handle->get_size() * 0.5);
- }
+ Ref<OccluderPolygon2D> occluder = _ensure_occluder();
+ occluder->set_polygon(p_polygon);
}
-void LightOccluder2DEditor::edit(Node *p_collision_polygon) {
+void LightOccluder2DEditor::_action_set_polygon(int p_idx, const Variant &p_previous, const Variant &p_polygon) {
- if (!canvas_item_editor) {
- canvas_item_editor = CanvasItemEditor::get_singleton();
- }
+ Ref<OccluderPolygon2D> occluder = _ensure_occluder();
+ undo_redo->add_do_method(occluder.ptr(), "set_polygon", p_polygon);
+ undo_redo->add_undo_method(occluder.ptr(), "set_polygon", p_previous);
+}
- if (p_collision_polygon) {
+bool LightOccluder2DEditor::_has_resource() const {
- node = Object::cast_to<LightOccluder2D>(p_collision_polygon);
- wip.clear();
- wip_active = false;
- edited_point = -1;
- canvas_item_editor->update_viewport();
- } else {
- node = NULL;
- }
+ return node && node->get_occluder_polygon().is_valid();
}
-void LightOccluder2DEditor::_create_poly() {
+void LightOccluder2DEditor::_create_resource() {
if (!node)
return;
+
undo_redo->create_action(TTR("Create Occluder Polygon"));
undo_redo->add_do_method(node, "set_occluder_polygon", Ref<OccluderPolygon2D>(memnew(OccluderPolygon2D)));
undo_redo->add_undo_method(node, "set_occluder_polygon", Variant(REF()));
undo_redo->commit_action();
-}
-
-void LightOccluder2DEditor::_bind_methods() {
- ClassDB::bind_method(D_METHOD("_menu_option"), &LightOccluder2DEditor::_menu_option);
- ClassDB::bind_method(D_METHOD("_node_removed"), &LightOccluder2DEditor::_node_removed);
- ClassDB::bind_method(D_METHOD("_create_poly"), &LightOccluder2DEditor::_create_poly);
+ _menu_option(MODE_CREATE);
}
-LightOccluder2DEditor::LightOccluder2DEditor(EditorNode *p_editor) {
+LightOccluder2DEditor::LightOccluder2DEditor(EditorNode *p_editor) :
+ AbstractPolygon2DEditor(p_editor) {
node = NULL;
- canvas_item_editor = NULL;
- editor = p_editor;
- undo_redo = editor->get_undo_redo();
-
- add_child(memnew(VSeparator));
- button_create = memnew(ToolButton);
- add_child(button_create);
- button_create->connect("pressed", this, "_menu_option", varray(MODE_CREATE));
- button_create->set_toggle_mode(true);
- button_create->set_tooltip(TTR("Create a new polygon from scratch."));
-
- button_edit = memnew(ToolButton);
- add_child(button_edit);
- button_edit->connect("pressed", this, "_menu_option", varray(MODE_EDIT));
- button_edit->set_toggle_mode(true);
- button_edit->set_tooltip(TTR("Edit existing polygon:") + "\n" + TTR("LMB: Move Point.") + "\n" + TTR("Ctrl+LMB: Split Segment.") + "\n" + TTR("RMB: Erase Point."));
-
- create_poly = memnew(ConfirmationDialog);
- add_child(create_poly);
- create_poly->get_ok()->set_text(TTR("Create"));
-
- mode = MODE_EDIT;
- wip_active = false;
-}
-
-void LightOccluder2DEditorPlugin::edit(Object *p_object) {
-
- light_occluder_editor->edit(Object::cast_to<Node>(p_object));
-}
-
-bool LightOccluder2DEditorPlugin::handles(Object *p_object) const {
-
- return p_object->is_class("LightOccluder2D");
-}
-
-void LightOccluder2DEditorPlugin::make_visible(bool p_visible) {
-
- if (p_visible) {
- light_occluder_editor->show();
- } else {
-
- light_occluder_editor->hide();
- light_occluder_editor->edit(NULL);
- }
-}
-
-LightOccluder2DEditorPlugin::LightOccluder2DEditorPlugin(EditorNode *p_node) {
-
- editor = p_node;
- light_occluder_editor = memnew(LightOccluder2DEditor(p_node));
- CanvasItemEditor::get_singleton()->add_control_to_menu_panel(light_occluder_editor);
-
- light_occluder_editor->hide();
}
-LightOccluder2DEditorPlugin::~LightOccluder2DEditorPlugin() {
+LightOccluder2DEditorPlugin::LightOccluder2DEditorPlugin(EditorNode *p_node) :
+ AbstractPolygon2DEditorPlugin(p_node, memnew(LightOccluder2DEditor(p_node)), "LightOccluder2D") {
}
diff --git a/editor/plugins/light_occluder_2d_editor_plugin.h b/editor/plugins/light_occluder_2d_editor_plugin.h
index a1962892ee..633fda7091 100644
--- a/editor/plugins/light_occluder_2d_editor_plugin.h
+++ b/editor/plugins/light_occluder_2d_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -31,83 +31,44 @@
#ifndef LIGHT_OCCLUDER_2D_EDITOR_PLUGIN_H
#define LIGHT_OCCLUDER_2D_EDITOR_PLUGIN_H
-#include "editor/editor_node.h"
-#include "editor/editor_plugin.h"
+#include "editor/plugins/abstract_polygon_2d_editor.h"
#include "scene/2d/light_occluder_2d.h"
-#include "scene/gui/tool_button.h"
/**
@author Juan Linietsky <reduzio@gmail.com>
*/
-class CanvasItemEditor;
+class LightOccluder2DEditor : public AbstractPolygon2DEditor {
-class LightOccluder2DEditor : public HBoxContainer {
+ GDCLASS(LightOccluder2DEditor, AbstractPolygon2DEditor);
- GDCLASS(LightOccluder2DEditor, HBoxContainer);
-
- UndoRedo *undo_redo;
- enum Mode {
-
- MODE_CREATE,
- MODE_EDIT,
-
- };
-
- Mode mode;
-
- ToolButton *button_create;
- ToolButton *button_edit;
-
- CanvasItemEditor *canvas_item_editor;
- EditorNode *editor;
- Panel *panel;
LightOccluder2D *node;
- MenuButton *options;
- int edited_point;
- Vector2 edited_point_pos;
- Vector<Vector2> pre_move_edit;
- Vector<Vector2> wip;
- bool wip_active;
+ Ref<OccluderPolygon2D> _ensure_occluder() const;
- ConfirmationDialog *create_poly;
+protected:
+ virtual Node2D *_get_node() const;
+ virtual void _set_node(Node *p_polygon);
- void _wip_close(bool p_closed);
- void _menu_option(int p_option);
- void _create_poly();
+ virtual bool _is_line() const;
+ virtual int _get_polygon_count() const;
+ virtual Variant _get_polygon(int p_idx) const;
+ virtual void _set_polygon(int p_idx, const Variant &p_polygon) const;
-protected:
- void _notification(int p_what);
- void _node_removed(Node *p_node);
- static void _bind_methods();
+ virtual void _action_set_polygon(int p_idx, const Variant &p_previous, const Variant &p_polygon);
+
+ virtual bool _has_resource() const;
+ virtual void _create_resource();
public:
- Vector2 snap_point(const Vector2 &p_point) const;
- void forward_canvas_draw_over_viewport(Control *p_overlay);
- bool forward_gui_input(const Ref<InputEvent> &p_event);
- void edit(Node *p_collision_polygon);
LightOccluder2DEditor(EditorNode *p_editor);
};
-class LightOccluder2DEditorPlugin : public EditorPlugin {
+class LightOccluder2DEditorPlugin : public AbstractPolygon2DEditorPlugin {
- GDCLASS(LightOccluder2DEditorPlugin, EditorPlugin);
-
- LightOccluder2DEditor *light_occluder_editor;
- EditorNode *editor;
+ GDCLASS(LightOccluder2DEditorPlugin, AbstractPolygon2DEditorPlugin);
public:
- virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) { return light_occluder_editor->forward_gui_input(p_event); }
- virtual void forward_canvas_draw_over_viewport(Control *p_overlay) { return light_occluder_editor->forward_canvas_draw_over_viewport(p_overlay); }
-
- virtual String get_name() const { return "LightOccluder2D"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
-
LightOccluder2DEditorPlugin(EditorNode *p_node);
- ~LightOccluder2DEditorPlugin();
};
#endif // LIGHT_OCCLUDER_2D_EDITOR_PLUGIN_H
diff --git a/editor/plugins/line_2d_editor_plugin.cpp b/editor/plugins/line_2d_editor_plugin.cpp
index ba6452c1d1..368cf719c6 100644
--- a/editor/plugins/line_2d_editor_plugin.cpp
+++ b/editor/plugins/line_2d_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/line_2d_editor_plugin.h b/editor/plugins/line_2d_editor_plugin.h
index e2e42c2087..a7a9813cb5 100644
--- a/editor/plugins/line_2d_editor_plugin.h
+++ b/editor/plugins/line_2d_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/material_editor_plugin.cpp b/editor/plugins/material_editor_plugin.cpp
index 5e59a73061..ce8cc77802 100644
--- a/editor/plugins/material_editor_plugin.cpp
+++ b/editor/plugins/material_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/material_editor_plugin.h b/editor/plugins/material_editor_plugin.h
index c06d95e700..39935d3e12 100644
--- a/editor/plugins/material_editor_plugin.h
+++ b/editor/plugins/material_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/mesh_editor_plugin.cpp b/editor/plugins/mesh_editor_plugin.cpp
index 73a216e96f..fcf515e3fc 100644
--- a/editor/plugins/mesh_editor_plugin.cpp
+++ b/editor/plugins/mesh_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/mesh_editor_plugin.h b/editor/plugins/mesh_editor_plugin.h
index cc20bfcbf3..0275f45be9 100644
--- a/editor/plugins/mesh_editor_plugin.h
+++ b/editor/plugins/mesh_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/mesh_instance_editor_plugin.cpp b/editor/plugins/mesh_instance_editor_plugin.cpp
index 74b6f14c2e..40ec03bc96 100644
--- a/editor/plugins/mesh_instance_editor_plugin.cpp
+++ b/editor/plugins/mesh_instance_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/mesh_instance_editor_plugin.h b/editor/plugins/mesh_instance_editor_plugin.h
index 30caeae7ec..d82af621df 100644
--- a/editor/plugins/mesh_instance_editor_plugin.h
+++ b/editor/plugins/mesh_instance_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/mesh_library_editor_plugin.cpp b/editor/plugins/mesh_library_editor_plugin.cpp
index c24c96bdc5..aedac7b45d 100644
--- a/editor/plugins/mesh_library_editor_plugin.cpp
+++ b/editor/plugins/mesh_library_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/mesh_library_editor_plugin.h b/editor/plugins/mesh_library_editor_plugin.h
index be33b5324d..8121ff52bd 100644
--- a/editor/plugins/mesh_library_editor_plugin.h
+++ b/editor/plugins/mesh_library_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/multimesh_editor_plugin.cpp b/editor/plugins/multimesh_editor_plugin.cpp
index 45f8e25959..8ff6080443 100644
--- a/editor/plugins/multimesh_editor_plugin.cpp
+++ b/editor/plugins/multimesh_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/multimesh_editor_plugin.h b/editor/plugins/multimesh_editor_plugin.h
index 201e735893..fe87a2b9cb 100644
--- a/editor/plugins/multimesh_editor_plugin.h
+++ b/editor/plugins/multimesh_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/navigation_polygon_editor_plugin.cpp b/editor/plugins/navigation_polygon_editor_plugin.cpp
index 0332e15b0e..0d6b649526 100644
--- a/editor/plugins/navigation_polygon_editor_plugin.cpp
+++ b/editor/plugins/navigation_polygon_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/navigation_polygon_editor_plugin.h b/editor/plugins/navigation_polygon_editor_plugin.h
index 738aa9fa41..336c28d642 100644
--- a/editor/plugins/navigation_polygon_editor_plugin.h
+++ b/editor/plugins/navigation_polygon_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/particles_2d_editor_plugin.cpp b/editor/plugins/particles_2d_editor_plugin.cpp
index ab94258c44..a944674cbd 100644
--- a/editor/plugins/particles_2d_editor_plugin.cpp
+++ b/editor/plugins/particles_2d_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -85,8 +85,6 @@ void Particles2DEditorPlugin::_menu_callback(int p_idx) {
} break;
case MENU_OPTION_CONVERT_TO_CPU_PARTICLES: {
- UndoRedo *undo_redo = EditorNode::get_singleton()->get_undo_redo();
-
CPUParticles2D *cpu_particles = memnew(CPUParticles2D);
cpu_particles->convert_from_particles(particles);
cpu_particles->set_name(particles->get_name());
@@ -94,12 +92,7 @@ void Particles2DEditorPlugin::_menu_callback(int p_idx) {
cpu_particles->set_visible(particles->is_visible());
cpu_particles->set_pause_mode(particles->get_pause_mode());
- undo_redo->create_action("Replace Particles by CPUParticles");
- undo_redo->add_do_method(particles, "replace_by", cpu_particles);
- undo_redo->add_undo_method(cpu_particles, "replace_by", particles);
- undo_redo->add_do_reference(cpu_particles);
- undo_redo->add_undo_reference(particles);
- undo_redo->commit_action();
+ EditorNode::get_singleton()->get_scene_tree_dock()->replace_node(particles, cpu_particles, false);
} break;
}
diff --git a/editor/plugins/particles_2d_editor_plugin.h b/editor/plugins/particles_2d_editor_plugin.h
index eaa96d84e9..35b874fb25 100644
--- a/editor/plugins/particles_2d_editor_plugin.h
+++ b/editor/plugins/particles_2d_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/particles_editor_plugin.cpp b/editor/plugins/particles_editor_plugin.cpp
index f2dfae7a9f..95828064ac 100644
--- a/editor/plugins/particles_editor_plugin.cpp
+++ b/editor/plugins/particles_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -305,8 +305,6 @@ void ParticlesEditor::_menu_option(int p_option) {
} break;
case MENU_OPTION_CONVERT_TO_CPU_PARTICLES: {
- UndoRedo *undo_redo = EditorNode::get_singleton()->get_undo_redo();
-
CPUParticles *cpu_particles = memnew(CPUParticles);
cpu_particles->convert_from_particles(node);
cpu_particles->set_name(node->get_name());
@@ -314,12 +312,7 @@ void ParticlesEditor::_menu_option(int p_option) {
cpu_particles->set_visible(node->is_visible());
cpu_particles->set_pause_mode(node->get_pause_mode());
- undo_redo->create_action("Replace Particles by CPUParticles");
- undo_redo->add_do_method(node, "replace_by", cpu_particles);
- undo_redo->add_undo_method(cpu_particles, "replace_by", node);
- undo_redo->add_do_reference(cpu_particles);
- undo_redo->add_undo_reference(node);
- undo_redo->commit_action();
+ EditorNode::get_singleton()->get_scene_tree_dock()->replace_node(node, cpu_particles, false);
} break;
}
diff --git a/editor/plugins/particles_editor_plugin.h b/editor/plugins/particles_editor_plugin.h
index 830d30d98f..b1b3e3c1c0 100644
--- a/editor/plugins/particles_editor_plugin.h
+++ b/editor/plugins/particles_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/path_2d_editor_plugin.cpp b/editor/plugins/path_2d_editor_plugin.cpp
index c67c96798a..354475d268 100644
--- a/editor/plugins/path_2d_editor_plugin.cpp
+++ b/editor/plugins/path_2d_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -70,8 +70,9 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
if (!node->get_curve().is_valid())
return false;
- Ref<InputEventMouseButton> mb = p_event;
+ real_t grab_threshold = EDITOR_GET("editors/poly_editor/point_grab_radius");
+ Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid()) {
Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
@@ -79,8 +80,6 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
Vector2 gpoint = mb->get_position();
Vector2 cpoint = node->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mb->get_position())));
- real_t grab_threshold = EDITOR_DEF("editors/poly_editor/point_grab_radius", 8);
-
if (mb->is_pressed() && action == ACTION_NONE) {
Ref<Curve2D> curve = node->get_curve();
@@ -179,6 +178,41 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
return true;
}
+ // Check for segment split.
+ if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && mode == MODE_EDIT && on_edge == true) {
+ Vector2 gpoint = mb->get_position();
+ Ref<Curve2D> curve = node->get_curve();
+
+ int insertion_point = -1;
+ float mbLength = curve->get_closest_offset(xform.affine_inverse().xform(gpoint));
+ int len = curve->get_point_count();
+ for (int i = 0; i < len - 1; i++) {
+ float compareLength = curve->get_closest_offset(curve->get_point_position(i + 1));
+ if (mbLength >= curve->get_closest_offset(curve->get_point_position(i)) && mbLength <= compareLength)
+ insertion_point = i;
+ }
+ if (insertion_point == -1)
+ insertion_point = curve->get_point_count() - 2;
+
+ undo_redo->create_action(TTR("Split Curve"));
+ undo_redo->add_do_method(curve.ptr(), "add_point", xform.affine_inverse().xform(gpoint), Vector2(0, 0), Vector2(0, 0), insertion_point + 1);
+ undo_redo->add_undo_method(curve.ptr(), "remove_point", insertion_point + 1);
+ undo_redo->add_do_method(canvas_item_editor, "update_viewport");
+ undo_redo->add_undo_method(canvas_item_editor, "update_viewport");
+ undo_redo->commit_action();
+
+ action = ACTION_MOVING_POINT;
+ action_point = insertion_point + 1;
+ moving_from = curve->get_point_position(action_point);
+ moving_screen_from = gpoint;
+
+ canvas_item_editor->update_viewport();
+
+ on_edge = false;
+
+ return true;
+ }
+
// Check for point movement completion.
if (!mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && action != ACTION_NONE) {
@@ -245,6 +279,49 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
if (mm.is_valid()) {
+ if (action == ACTION_NONE && mode == MODE_EDIT) {
+ // Handle Edge Follow
+ bool old_edge = on_edge;
+
+ Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
+ Vector2 gpoint = mm->get_position();
+
+ Ref<Curve2D> curve = node->get_curve();
+ if (curve == NULL) return true;
+ if (curve->get_point_count() < 2) return true;
+
+ // Find edge
+ edge_point = xform.xform(curve->get_closest_point(xform.affine_inverse().xform(mm->get_position())));
+ on_edge = false;
+ if (edge_point.distance_to(gpoint) <= grab_threshold) {
+ on_edge = true;
+ }
+ // However, if near a control point or its in-out handles then not on edge
+ int len = curve->get_point_count();
+ for (int i = 0; i < len; i++) {
+ Vector2 pp = curve->get_point_position(i);
+ Vector2 p = xform.xform(pp);
+ if (p.distance_to(gpoint) <= grab_threshold) {
+ on_edge = false;
+ break;
+ }
+ p = xform.xform(pp + curve->get_point_in(i));
+ if (p.distance_to(gpoint) <= grab_threshold) {
+ on_edge = false;
+ break;
+ }
+ p = xform.xform(pp + curve->get_point_out(i));
+ if (p.distance_to(gpoint) <= grab_threshold) {
+ on_edge = false;
+ break;
+ }
+ }
+ if (on_edge || old_edge != on_edge) {
+ canvas_item_editor->update_viewport();
+ return true;
+ }
+ }
+
if (action != ACTION_NONE) {
// Handle point/control movement.
Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
@@ -309,7 +386,6 @@ void Path2DEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
Control *vpc = canvas_item_editor->get_viewport_control();
for (int i = 0; i < len; i++) {
-
Vector2 point = xform.xform(curve->get_point_position(i));
vpc->draw_texture_rect(handle, Rect2(point - handle_size * 0.5, handle_size), false, Color(1, 1, 1, 1));
@@ -325,6 +401,11 @@ void Path2DEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
vpc->draw_texture_rect(handle, Rect2(pointin - handle_size * 0.5, handle_size), false, Color(1, 0.5, 1, 0.3));
}
}
+
+ if (on_edge) {
+ Ref<Texture> add_handle = get_icon("EditorHandleAdd", "EditorIcons");
+ p_overlay->draw_texture(add_handle, edge_point - add_handle->get_size() * 0.5);
+ }
}
void Path2DEditor::_node_visibility_changed() {
@@ -442,6 +523,7 @@ Path2DEditor::Path2DEditor(EditorNode *p_editor) {
undo_redo = editor->get_undo_redo();
mirror_handle_angle = true;
mirror_handle_length = true;
+ on_edge = false;
mode = MODE_EDIT;
action = ACTION_NONE;
@@ -455,7 +537,7 @@ Path2DEditor::Path2DEditor(EditorNode *p_editor) {
curve_edit->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveEdit", "EditorIcons"));
curve_edit->set_toggle_mode(true);
curve_edit->set_focus_mode(Control::FOCUS_NONE);
- curve_edit->set_tooltip(TTR("Select Points") + "\n" + TTR("Shift+Drag: Select Control Points") + "\n" + keycode_get_string(KEY_MASK_CMD) + TTR("Click: Add Point") + "\n" + TTR("Right Click: Delete Point"));
+ curve_edit->set_tooltip(TTR("Select Points") + "\n" + TTR("Shift+Drag: Select Control Points") + "\n" + keycode_get_string(KEY_MASK_CMD) + TTR("Click: Add Point") + "\n" + TTR("Left Click: Split Segment (in curve)") + "\n" + TTR("Right Click: Delete Point"));
curve_edit->connect("pressed", this, "_mode_selected", varray(MODE_EDIT));
base_hb->add_child(curve_edit);
curve_edit_curve = memnew(ToolButton);
@@ -469,7 +551,7 @@ Path2DEditor::Path2DEditor(EditorNode *p_editor) {
curve_create->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("CurveCreate", "EditorIcons"));
curve_create->set_toggle_mode(true);
curve_create->set_focus_mode(Control::FOCUS_NONE);
- curve_create->set_tooltip(TTR("Add Point (in empty space)") + "\n" + TTR("Split Segment (in curve)"));
+ curve_create->set_tooltip(TTR("Add Point (in empty space)"));
curve_create->connect("pressed", this, "_mode_selected", varray(MODE_CREATE));
base_hb->add_child(curve_create);
curve_del = memnew(ToolButton);
diff --git a/editor/plugins/path_2d_editor_plugin.h b/editor/plugins/path_2d_editor_plugin.h
index 3a78657746..4edd17d146 100644
--- a/editor/plugins/path_2d_editor_plugin.h
+++ b/editor/plugins/path_2d_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -73,6 +73,7 @@ class Path2DEditor : public HBoxContainer {
bool mirror_handle_angle;
bool mirror_handle_length;
+ bool on_edge;
enum HandleOption {
HANDLE_OPTION_ANGLE,
@@ -93,6 +94,7 @@ class Path2DEditor : public HBoxContainer {
Point2 moving_screen_from;
float orig_in_length;
float orig_out_length;
+ Vector2 edge_point;
void _mode_selected(int p_mode);
void _handle_option_pressed(int p_option);
diff --git a/editor/plugins/path_editor_plugin.cpp b/editor/plugins/path_editor_plugin.cpp
index df6c40ed02..6efa76ef80 100644
--- a/editor/plugins/path_editor_plugin.cpp
+++ b/editor/plugins/path_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -563,7 +563,7 @@ PathEditorPlugin::PathEditorPlugin(EditorNode *p_node) {
Ref<PathSpatialGizmoPlugin> gizmo_plugin;
gizmo_plugin.instance();
- SpatialEditor::get_singleton()->register_gizmo_plugin(gizmo_plugin);
+ SpatialEditor::get_singleton()->add_gizmo_plugin(gizmo_plugin);
sep = memnew(VSeparator);
sep->hide();
diff --git a/editor/plugins/path_editor_plugin.h b/editor/plugins/path_editor_plugin.h
index c77b2a41cc..ce3d3799d4 100644
--- a/editor/plugins/path_editor_plugin.h
+++ b/editor/plugins/path_editor_plugin.h
@@ -1,12 +1,12 @@
-/*************************************************************************/
+/*************************************************************************/
/* path_editor_plugin.h */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/physical_bone_plugin.cpp b/editor/plugins/physical_bone_plugin.cpp
index 6341d7f2ef..9ea37aceb9 100644
--- a/editor/plugins/physical_bone_plugin.cpp
+++ b/editor/plugins/physical_bone_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/physical_bone_plugin.h b/editor/plugins/physical_bone_plugin.h
index e1f8c9ec47..78c1c331a0 100644
--- a/editor/plugins/physical_bone_plugin.h
+++ b/editor/plugins/physical_bone_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/polygon_2d_editor_plugin.cpp b/editor/plugins/polygon_2d_editor_plugin.cpp
index f937744d45..1d7b4ffa41 100644
--- a/editor/plugins/polygon_2d_editor_plugin.cpp
+++ b/editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -52,87 +52,105 @@ Vector2 Polygon2DEditor::_get_offset(int p_idx) const {
return node->get_offset();
}
+int Polygon2DEditor::_get_polygon_count() const {
+ if (node->get_internal_vertex_count() > 0) {
+ return 0; //do not edit if internal vertices exist
+ } else {
+ return 1;
+ }
+}
+
void Polygon2DEditor::_notification(int p_what) {
switch (p_what) {
+ case NOTIFICATION_ENTER_TREE:
+ case NOTIFICATION_THEME_CHANGED: {
+
+ uv_edit_draw->add_style_override("panel", get_stylebox("bg", "Tree"));
+ bone_scroll->add_style_override("bg", get_stylebox("bg", "Tree"));
+ } break;
case NOTIFICATION_READY: {
button_uv->set_icon(get_icon("Uv", "EditorIcons"));
- uv_button[UV_MODE_CREATE]->set_icon(get_icon("Add", "EditorIcons"));
+ uv_button[UV_MODE_CREATE]->set_icon(get_icon("Edit", "EditorIcons"));
+ uv_button[UV_MODE_CREATE_INTERNAL]->set_icon(get_icon("EditInternal", "EditorIcons"));
+ uv_button[UV_MODE_REMOVE_INTERNAL]->set_icon(get_icon("RemoveInternal", "EditorIcons"));
uv_button[UV_MODE_EDIT_POINT]->set_icon(get_icon("ToolSelect", "EditorIcons"));
uv_button[UV_MODE_MOVE]->set_icon(get_icon("ToolMove", "EditorIcons"));
uv_button[UV_MODE_ROTATE]->set_icon(get_icon("ToolRotate", "EditorIcons"));
uv_button[UV_MODE_SCALE]->set_icon(get_icon("ToolScale", "EditorIcons"));
- uv_button[UV_MODE_ADD_SPLIT]->set_icon(get_icon("AddSplit", "EditorIcons"));
- uv_button[UV_MODE_REMOVE_SPLIT]->set_icon(get_icon("DeleteSplit", "EditorIcons"));
+ uv_button[UV_MODE_ADD_POLYGON]->set_icon(get_icon("Edit", "EditorIcons"));
+ uv_button[UV_MODE_REMOVE_POLYGON]->set_icon(get_icon("Close", "EditorIcons"));
uv_button[UV_MODE_PAINT_WEIGHT]->set_icon(get_icon("PaintVertex", "EditorIcons"));
uv_button[UV_MODE_CLEAR_WEIGHT]->set_icon(get_icon("UnpaintVertex", "EditorIcons"));
b_snap_grid->set_icon(get_icon("Grid", "EditorIcons"));
b_snap_enable->set_icon(get_icon("SnapGrid", "EditorIcons"));
uv_icon_zoom->set_texture(get_icon("Zoom", "EditorIcons"));
-
} break;
- case NOTIFICATION_PHYSICS_PROCESS: {
+ case NOTIFICATION_VISIBILITY_CHANGED: {
+ if (!is_visible()) {
+ uv_edit->hide();
+ }
} break;
}
}
void Polygon2DEditor::_sync_bones() {
+ Skeleton2D *skeleton = NULL;
if (!node->has_node(node->get_skeleton())) {
error->set_text(TTR("The skeleton property of the Polygon2D does not point to a Skeleton2D node"));
error->popup_centered_minsize();
- return;
+ } else {
+ Node *sn = node->get_node(node->get_skeleton());
+ skeleton = Object::cast_to<Skeleton2D>(sn);
}
- Node *sn = node->get_node(node->get_skeleton());
- Skeleton2D *skeleton = Object::cast_to<Skeleton2D>(sn);
+ Array prev_bones = node->call("_get_bones");
+ node->clear_bones();
if (!skeleton) {
error->set_text(TTR("The skeleton property of the Polygon2D does not point to a Skeleton2D node"));
error->popup_centered_minsize();
- return;
- }
-
- Array prev_bones = node->call("_get_bones");
- node->clear_bones();
-
- for (int i = 0; i < skeleton->get_bone_count(); i++) {
- NodePath path = skeleton->get_path_to(skeleton->get_bone(i));
- PoolVector<float> weights;
- int wc = node->get_polygon().size();
-
- for (int j = 0; j < prev_bones.size(); j += 2) {
- NodePath pvp = prev_bones[j];
- PoolVector<float> pv = prev_bones[j + 1];
- if (pvp == path && pv.size() == wc) {
- weights = pv;
+ } else {
+ for (int i = 0; i < skeleton->get_bone_count(); i++) {
+ NodePath path = skeleton->get_path_to(skeleton->get_bone(i));
+ PoolVector<float> weights;
+ int wc = node->get_polygon().size();
+
+ for (int j = 0; j < prev_bones.size(); j += 2) {
+ NodePath pvp = prev_bones[j];
+ PoolVector<float> pv = prev_bones[j + 1];
+ if (pvp == path && pv.size() == wc) {
+ weights = pv;
+ }
}
- }
- if (weights.size() == 0) { //create them
- weights.resize(node->get_polygon().size());
- PoolVector<float>::Write w = weights.write();
- for (int j = 0; j < wc; j++) {
- w[j] = 0.0;
+ if (weights.size() == 0) { //create them
+ weights.resize(node->get_polygon().size());
+ PoolVector<float>::Write w = weights.write();
+ for (int j = 0; j < wc; j++) {
+ w[j] = 0.0;
+ }
}
- }
- node->add_bone(path, weights);
+ node->add_bone(path, weights);
+ }
}
+
Array new_bones = node->call("_get_bones");
- undo_redo->create_action(TTR("Sync bones"));
+ undo_redo->create_action(TTR("Sync Bones"));
undo_redo->add_do_method(node, "_set_bones", new_bones);
undo_redo->add_undo_method(node, "_set_bones", prev_bones);
- undo_redo->add_do_method(uv_edit_draw, "update");
- undo_redo->add_undo_method(uv_edit_draw, "update");
undo_redo->add_do_method(this, "_update_bone_list");
undo_redo->add_undo_method(this, "_update_bone_list");
+ undo_redo->add_do_method(uv_edit_draw, "update");
+ undo_redo->add_undo_method(uv_edit_draw, "update");
undo_redo->commit_action();
}
@@ -162,9 +180,10 @@ void Polygon2DEditor::_update_bone_list() {
cb->set_text(name);
cb->set_button_group(bg);
cb->set_meta("bone_path", np);
+ cb->set_focus_mode(FOCUS_NONE);
bone_scroll_vb->add_child(cb);
- if (np == selected)
+ if (np == selected || bone_scroll_vb->get_child_count() < 2)
cb->set_pressed(true);
cb->connect("pressed", this, "_bone_paint_selected", varray(i));
@@ -180,12 +199,15 @@ void Polygon2DEditor::_bone_paint_selected(int p_index) {
void Polygon2DEditor::_uv_edit_mode_select(int p_mode) {
if (p_mode == 0) { //uv
+
uv_button[UV_MODE_CREATE]->hide();
+ uv_button[UV_MODE_CREATE_INTERNAL]->hide();
+ uv_button[UV_MODE_REMOVE_INTERNAL]->hide();
for (int i = UV_MODE_MOVE; i <= UV_MODE_SCALE; i++) {
uv_button[i]->show();
}
- uv_button[UV_MODE_ADD_SPLIT]->hide();
- uv_button[UV_MODE_REMOVE_SPLIT]->hide();
+ uv_button[UV_MODE_ADD_POLYGON]->hide();
+ uv_button[UV_MODE_REMOVE_POLYGON]->hide();
uv_button[UV_MODE_PAINT_WEIGHT]->hide();
uv_button[UV_MODE_CLEAR_WEIGHT]->hide();
_uv_mode(UV_MODE_EDIT_POINT);
@@ -194,13 +216,13 @@ void Polygon2DEditor::_uv_edit_mode_select(int p_mode) {
bone_paint_strength->hide();
bone_paint_radius->hide();
bone_paint_radius_label->hide();
-
} else if (p_mode == 1) { //poly
+
for (int i = 0; i <= UV_MODE_SCALE; i++) {
uv_button[i]->show();
}
- uv_button[UV_MODE_ADD_SPLIT]->hide();
- uv_button[UV_MODE_REMOVE_SPLIT]->hide();
+ uv_button[UV_MODE_ADD_POLYGON]->hide();
+ uv_button[UV_MODE_REMOVE_POLYGON]->hide();
uv_button[UV_MODE_PAINT_WEIGHT]->hide();
uv_button[UV_MODE_CLEAR_WEIGHT]->hide();
_uv_mode(UV_MODE_EDIT_POINT);
@@ -209,24 +231,24 @@ void Polygon2DEditor::_uv_edit_mode_select(int p_mode) {
bone_paint_strength->hide();
bone_paint_radius->hide();
bone_paint_radius_label->hide();
-
} else if (p_mode == 2) { //splits
+
for (int i = 0; i <= UV_MODE_SCALE; i++) {
uv_button[i]->hide();
}
- uv_button[UV_MODE_ADD_SPLIT]->show();
- uv_button[UV_MODE_REMOVE_SPLIT]->show();
+ uv_button[UV_MODE_ADD_POLYGON]->show();
+ uv_button[UV_MODE_REMOVE_POLYGON]->show();
uv_button[UV_MODE_PAINT_WEIGHT]->hide();
uv_button[UV_MODE_CLEAR_WEIGHT]->hide();
- _uv_mode(UV_MODE_ADD_SPLIT);
+ _uv_mode(UV_MODE_ADD_POLYGON);
bone_scroll_main_vb->hide();
bone_paint_strength->hide();
bone_paint_radius->hide();
bone_paint_radius_label->hide();
-
} else if (p_mode == 3) { //bones´
- for (int i = 0; i <= UV_MODE_REMOVE_SPLIT; i++) {
+
+ for (int i = 0; i <= UV_MODE_REMOVE_POLYGON; i++) {
uv_button[i]->hide();
}
uv_button[UV_MODE_PAINT_WEIGHT]->show();
@@ -241,9 +263,17 @@ void Polygon2DEditor::_uv_edit_mode_select(int p_mode) {
bone_paint_pos = Vector2(-100000, -100000); //send brush away when switching
}
+ uv_edit->set_size(uv_edit->get_size()); // Necessary readjustment of the popup window.
uv_edit_draw->update();
}
+void Polygon2DEditor::_uv_edit_popup_hide() {
+
+ EditorSettings::get_singleton()->set("interface/dialogs/uv_editor_bounds", uv_edit->get_rect());
+
+ _cancel_editing();
+}
+
void Polygon2DEditor::_menu_option(int p_option) {
switch (p_option) {
@@ -252,7 +282,7 @@ void Polygon2DEditor::_menu_option(int p_option) {
if (node->get_texture().is_null()) {
- error->set_text("No texture in this polygon.\nSet a texture to be able to edit UV.");
+ error->set_text(TTR("No texture in this polygon.\nSet a texture to be able to edit UV."));
error->popup_centered_minsize();
return;
}
@@ -268,7 +298,11 @@ void Polygon2DEditor::_menu_option(int p_option) {
undo_redo->commit_action();
}
- uv_edit->popup_centered_ratio(0.85);
+ if (EditorSettings::get_singleton()->has_setting("interface/dialogs/uv_editor_bounds"))
+ uv_edit->popup(EditorSettings::get_singleton()->get("interface/dialogs/uv_editor_bounds"));
+ else
+ uv_edit->popup_centered_ratio(0.85);
+ _update_bone_list();
} break;
case UVEDIT_POLYGON_TO_UV: {
@@ -282,7 +316,6 @@ void Polygon2DEditor::_menu_option(int p_option) {
undo_redo->add_do_method(uv_edit_draw, "update");
undo_redo->add_undo_method(uv_edit_draw, "update");
undo_redo->commit_action();
-
} break;
case UVEDIT_UV_TO_POLYGON: {
@@ -291,13 +324,12 @@ void Polygon2DEditor::_menu_option(int p_option) {
if (uvs.size() == 0)
break;
- undo_redo->create_action(TTR("Create UV Map"));
+ undo_redo->create_action(TTR("Create Polygon"));
undo_redo->add_do_method(node, "set_polygon", uvs);
undo_redo->add_undo_method(node, "set_polygon", points);
undo_redo->add_do_method(uv_edit_draw, "update");
undo_redo->add_undo_method(uv_edit_draw, "update");
undo_redo->commit_action();
-
} break;
case UVEDIT_UV_CLEAR: {
@@ -310,49 +342,89 @@ void Polygon2DEditor::_menu_option(int p_option) {
undo_redo->add_do_method(uv_edit_draw, "update");
undo_redo->add_undo_method(uv_edit_draw, "update");
undo_redo->commit_action();
-
} break;
case UVEDIT_GRID_SETTINGS: {
+
grid_settings->popup_centered_minsize();
} break;
default: {
+
AbstractPolygon2DEditor::_menu_option(p_option);
} break;
}
}
+void Polygon2DEditor::_cancel_editing() {
+
+ if (uv_create) {
+ uv_drag = false;
+ uv_create = false;
+ node->set_uv(uv_create_uv_prev);
+ node->set_polygon(uv_create_poly_prev);
+ node->set_internal_vertex_count(uv_create_prev_internal_vertices);
+ node->set_vertex_colors(uv_create_colors_prev);
+ node->call("_set_bones", uv_create_bones_prev);
+ node->set_polygons(polygons_prev);
+ } else if (uv_drag) {
+ uv_drag = false;
+ if (uv_edit_mode[0]->is_pressed()) { // Edit UV.
+ node->set_uv(points_prev);
+ } else if (uv_edit_mode[1]->is_pressed()) { // Edit polygon.
+ node->set_polygon(points_prev);
+ }
+ }
+
+ polygon_create.clear();
+}
+
+void Polygon2DEditor::_commit_action() {
+
+ // Makes that undo/redoing actions made outside of the UV editor still affects its polygon.
+ undo_redo->add_do_method(uv_edit_draw, "update");
+ undo_redo->add_undo_method(uv_edit_draw, "update");
+ undo_redo->add_do_method(CanvasItemEditor::get_singleton(), "update_viewport");
+ undo_redo->add_undo_method(CanvasItemEditor::get_singleton(), "update_viewport");
+ undo_redo->commit_action();
+}
+
void Polygon2DEditor::_set_use_snap(bool p_use) {
use_snap = p_use;
+ EditorSettings::get_singleton()->set_project_metadata("polygon_2d_uv_editor", "snap_enabled", p_use);
}
void Polygon2DEditor::_set_show_grid(bool p_show) {
snap_show_grid = p_show;
+ EditorSettings::get_singleton()->set_project_metadata("polygon_2d_uv_editor", "show_grid", p_show);
uv_edit_draw->update();
}
void Polygon2DEditor::_set_snap_off_x(float p_val) {
snap_offset.x = p_val;
+ EditorSettings::get_singleton()->set_project_metadata("polygon_2d_uv_editor", "snap_offset", snap_offset);
uv_edit_draw->update();
}
void Polygon2DEditor::_set_snap_off_y(float p_val) {
snap_offset.y = p_val;
+ EditorSettings::get_singleton()->set_project_metadata("polygon_2d_uv_editor", "snap_offset", snap_offset);
uv_edit_draw->update();
}
void Polygon2DEditor::_set_snap_step_x(float p_val) {
snap_step.x = p_val;
+ EditorSettings::get_singleton()->set_project_metadata("polygon_2d_uv_editor", "snap_step", snap_step);
uv_edit_draw->update();
}
void Polygon2DEditor::_set_snap_step_y(float p_val) {
snap_step.y = p_val;
+ EditorSettings::get_singleton()->set_project_metadata("polygon_2d_uv_editor", "snap_step", snap_step);
uv_edit_draw->update();
}
void Polygon2DEditor::_uv_mode(int p_mode) {
- split_create = false;
+ polygon_create.clear();
uv_drag = false;
uv_create = false;
@@ -364,6 +436,9 @@ void Polygon2DEditor::_uv_mode(int p_mode) {
void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
+ if (!_get_node())
+ return;
+
Transform2D mtx;
mtx.elements[2] = -uv_draw_ofs;
mtx.scale_basis(Vector2(uv_draw_zoom, uv_draw_zoom));
@@ -376,7 +451,7 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
if (mb->is_pressed()) {
- uv_drag_from = Vector2(mb->get_position().x, mb->get_position().y);
+ uv_drag_from = snap_point(Vector2(mb->get_position().x, mb->get_position().y));
uv_drag = true;
points_prev = node->get_uv();
@@ -390,8 +465,9 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
if (uv_move_current == UV_MODE_CREATE) {
if (!uv_create) {
+
points_prev.resize(0);
- Vector2 tuv = mtx.affine_inverse().xform(Vector2(mb->get_position().x, mb->get_position().y));
+ Vector2 tuv = mtx.affine_inverse().xform(snap_point(Vector2(mb->get_position().x, mb->get_position().y)));
points_prev.push_back(tuv);
uv_create_to = tuv;
point_drag_index = 0;
@@ -400,28 +476,39 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
uv_create = true;
uv_create_uv_prev = node->get_uv();
uv_create_poly_prev = node->get_polygon();
+ uv_create_prev_internal_vertices = node->get_internal_vertex_count();
+ uv_create_colors_prev = node->get_vertex_colors();
uv_create_bones_prev = node->call("_get_bones");
- splits_prev = node->get_splits();
+ polygons_prev = node->get_polygons();
node->set_polygon(points_prev);
node->set_uv(points_prev);
+ node->set_internal_vertex_count(0);
+ uv_edit_draw->update();
} else {
- Vector2 tuv = mtx.affine_inverse().xform(Vector2(mb->get_position().x, mb->get_position().y));
- if (points_prev.size() > 3 && tuv.distance_to(points_prev[0]) < 8) {
+ Vector2 tuv = mtx.affine_inverse().xform(snap_point(Vector2(mb->get_position().x, mb->get_position().y)));
+
+ if (points_prev.size() > 2 && tuv.distance_to(points_prev[0]) < 8) {
undo_redo->create_action(TTR("Create Polygon & UV"));
undo_redo->add_do_method(node, "set_uv", node->get_uv());
- undo_redo->add_undo_method(node, "set_uv", points_prev);
+ undo_redo->add_undo_method(node, "set_uv", uv_create_uv_prev);
undo_redo->add_do_method(node, "set_polygon", node->get_polygon());
- undo_redo->add_undo_method(node, "set_polygon", points_prev);
+ undo_redo->add_undo_method(node, "set_polygon", uv_create_poly_prev);
+ undo_redo->add_do_method(node, "set_internal_vertex_count", 0);
+ undo_redo->add_undo_method(node, "set_internal_vertex_count", uv_create_prev_internal_vertices);
+ undo_redo->add_do_method(node, "set_vertex_colors", Vector<Color>());
+ undo_redo->add_undo_method(node, "set_vertex_colors", uv_create_colors_prev);
undo_redo->add_do_method(node, "clear_bones");
- undo_redo->add_undo_method(node, "_set_bones", node->call("_get_bones"));
+ undo_redo->add_undo_method(node, "_set_bones", uv_create_bones_prev);
undo_redo->add_do_method(uv_edit_draw, "update");
undo_redo->add_undo_method(uv_edit_draw, "update");
undo_redo->commit_action();
uv_drag = false;
uv_create = false;
+
_uv_mode(UV_MODE_EDIT_POINT);
+ _menu_option(MODE_EDIT);
} else {
points_prev.push_back(tuv);
point_drag_index = points_prev.size() - 1;
@@ -430,6 +517,99 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
node->set_polygon(points_prev);
node->set_uv(points_prev);
}
+
+ CanvasItemEditor::get_singleton()->update_viewport();
+ }
+
+ if (uv_move_current == UV_MODE_CREATE_INTERNAL) {
+
+ uv_create_uv_prev = node->get_uv();
+ uv_create_poly_prev = node->get_polygon();
+ uv_create_colors_prev = node->get_vertex_colors();
+ uv_create_bones_prev = node->call("_get_bones");
+ int internal_vertices = node->get_internal_vertex_count();
+
+ Vector2 pos = mtx.affine_inverse().xform(snap_point(Vector2(mb->get_position().x, mb->get_position().y)));
+
+ uv_create_poly_prev.push_back(pos);
+ uv_create_uv_prev.push_back(pos);
+ if (uv_create_colors_prev.size()) {
+ uv_create_colors_prev.push_back(Color(1, 1, 1));
+ }
+
+ undo_redo->create_action(TTR("Create Internal Vertex"));
+ undo_redo->add_do_method(node, "set_uv", uv_create_uv_prev);
+ undo_redo->add_undo_method(node, "set_uv", node->get_uv());
+ undo_redo->add_do_method(node, "set_polygon", uv_create_poly_prev);
+ undo_redo->add_undo_method(node, "set_polygon", node->get_polygon());
+ undo_redo->add_do_method(node, "set_vertex_colors", uv_create_colors_prev);
+ undo_redo->add_undo_method(node, "set_vertex_colors", node->get_vertex_colors());
+ for (int i = 0; i < node->get_bone_count(); i++) {
+ PoolVector<float> bonew = node->get_bone_weights(i);
+ bonew.push_back(0);
+ undo_redo->add_do_method(node, "set_bone_weights", i, bonew);
+ undo_redo->add_undo_method(node, "set_bone_weights", i, node->get_bone_weights(i));
+ }
+ undo_redo->add_do_method(node, "set_internal_vertex_count", internal_vertices + 1);
+ undo_redo->add_undo_method(node, "set_internal_vertex_count", internal_vertices);
+
+ undo_redo->add_do_method(uv_edit_draw, "update");
+ undo_redo->add_undo_method(uv_edit_draw, "update");
+ undo_redo->commit_action();
+ }
+
+ if (uv_move_current == UV_MODE_REMOVE_INTERNAL) {
+
+ uv_create_uv_prev = node->get_uv();
+ uv_create_poly_prev = node->get_polygon();
+ uv_create_colors_prev = node->get_vertex_colors();
+ uv_create_bones_prev = node->call("_get_bones");
+ int internal_vertices = node->get_internal_vertex_count();
+
+ if (internal_vertices <= 0)
+ return;
+
+ int closest = -1;
+ float closest_dist = 1e20;
+
+ for (int i = points_prev.size() - internal_vertices; i < points_prev.size(); i++) {
+
+ Vector2 tuv = mtx.xform(uv_create_poly_prev[i]);
+ float dist = tuv.distance_to(Vector2(mb->get_position().x, mb->get_position().y));
+ if (dist < 8 && dist < closest_dist) {
+ closest = i;
+ closest_dist = dist;
+ }
+ }
+
+ if (closest == -1)
+ return;
+
+ uv_create_poly_prev.remove(closest);
+ uv_create_uv_prev.remove(closest);
+ if (uv_create_colors_prev.size()) {
+ uv_create_colors_prev.remove(closest);
+ }
+
+ undo_redo->create_action(TTR("Remove Internal Vertex"));
+ undo_redo->add_do_method(node, "set_uv", uv_create_uv_prev);
+ undo_redo->add_undo_method(node, "set_uv", node->get_uv());
+ undo_redo->add_do_method(node, "set_polygon", uv_create_poly_prev);
+ undo_redo->add_undo_method(node, "set_polygon", node->get_polygon());
+ undo_redo->add_do_method(node, "set_vertex_colors", uv_create_colors_prev);
+ undo_redo->add_undo_method(node, "set_vertex_colors", node->get_vertex_colors());
+ for (int i = 0; i < node->get_bone_count(); i++) {
+ PoolVector<float> bonew = node->get_bone_weights(i);
+ bonew.remove(closest);
+ undo_redo->add_do_method(node, "set_bone_weights", i, bonew);
+ undo_redo->add_undo_method(node, "set_bone_weights", i, node->get_bone_weights(i));
+ }
+ undo_redo->add_do_method(node, "set_internal_vertex_count", internal_vertices - 1);
+ undo_redo->add_undo_method(node, "set_internal_vertex_count", internal_vertices);
+
+ undo_redo->add_do_method(uv_edit_draw, "update");
+ undo_redo->add_undo_method(uv_edit_draw, "update");
+ undo_redo->commit_action();
}
if (uv_move_current == UV_MODE_EDIT_POINT) {
@@ -459,132 +639,80 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
}
}
- if (uv_move_current == UV_MODE_ADD_SPLIT) {
+ if (uv_move_current == UV_MODE_ADD_POLYGON) {
+
+ int closest = -1;
+ float closest_dist = 1e20;
- int split_to_index = -1;
- split_to_index = -1;
for (int i = 0; i < points_prev.size(); i++) {
Vector2 tuv = mtx.xform(points_prev[i]);
- if (tuv.distance_to(Vector2(mb->get_position().x, mb->get_position().y)) < 8) {
- split_to_index = i;
+ float dist = tuv.distance_to(Vector2(mb->get_position().x, mb->get_position().y));
+ if (dist < 8 && dist < closest_dist) {
+ closest = i;
+ closest_dist = dist;
}
}
- if (split_to_index == -1) {
- split_create = false;
- return;
- }
-
- if (split_create) {
-
- split_create = false;
- if (split_to_index < point_drag_index) {
- SWAP(split_to_index, point_drag_index);
- }
- bool valid = true;
- String split_error;
- if (split_to_index == point_drag_index) {
- split_error = TTR("Split point with itself.");
- valid = false;
- }
- if (split_to_index + 1 == point_drag_index) {
- //not a split,goes along the edge
- split_error = TTR("Split can't form an existing edge.");
- valid = false;
- }
- if (split_to_index == points_prev.size() - 1 && point_drag_index == 0) {
- //not a split,goes along the edge
- split_error = TTR("Split can't form an existing edge.");
- valid = false;
- }
-
- for (int i = 0; i < splits_prev.size(); i += 2) {
-
- if (splits_prev[i] == point_drag_index && splits_prev[i + 1] == split_to_index) {
- //already exists
- split_error = TTR("Split already exists.");
- valid = false;
- break;
- }
-
- int a_state; //-1, outside split, 0 split point, +1, inside split
- if (point_drag_index == splits_prev[i] || point_drag_index == splits_prev[i + 1]) {
- a_state = 0;
- } else if (point_drag_index < splits_prev[i] || point_drag_index > splits_prev[i + 1]) {
- a_state = -1;
- } else {
- a_state = 1;
- }
-
- int b_state; //-1, outside split, 0 split point, +1, inside split
- if (split_to_index == splits_prev[i] || split_to_index == splits_prev[i + 1]) {
- b_state = 0;
- } else if (split_to_index < splits_prev[i] || split_to_index > splits_prev[i + 1]) {
- b_state = -1;
+ if (closest != -1) {
+ if (polygon_create.size() && closest == polygon_create[0]) {
+ //close
+ if (polygon_create.size() < 3) {
+ error->set_text(TTR("Invalid Polygon (need 3 different vertices)"));
+ error->popup_centered_minsize();
} else {
- b_state = 1;
+ Array polygons = node->get_polygons();
+ polygons = polygons.duplicate(); //copy because its a reference
+
+ //todo, could check whether it already exists?
+ polygons.push_back(polygon_create);
+ undo_redo->create_action(TTR("Add Custom Polygon"));
+ undo_redo->add_do_method(node, "set_polygons", polygons);
+ undo_redo->add_undo_method(node, "set_polygons", node->get_polygons());
+ undo_redo->add_do_method(uv_edit_draw, "update");
+ undo_redo->add_undo_method(uv_edit_draw, "update");
+ undo_redo->commit_action();
}
- if (b_state * a_state < 0) {
- //crossing
- split_error = "Split crosses another split.";
- valid = false;
- break;
- }
+ polygon_create.clear();
+ } else if (polygon_create.find(closest) == -1) {
+ //add temporarily if not exists
+ polygon_create.push_back(closest);
}
-
- if (valid) {
-
- splits_prev.push_back(point_drag_index);
- splits_prev.push_back(split_to_index);
-
- undo_redo->create_action(TTR("Add Split"));
-
- undo_redo->add_do_method(node, "set_splits", splits_prev);
- undo_redo->add_undo_method(node, "set_splits", node->get_splits());
- undo_redo->add_do_method(uv_edit_draw, "update");
- undo_redo->add_undo_method(uv_edit_draw, "update");
- undo_redo->commit_action();
- } else {
- error->set_text(TTR("Invalid Split: ") + split_error);
- error->popup_centered_minsize();
- }
-
- } else {
- point_drag_index = split_to_index;
- split_create = true;
- splits_prev = node->get_splits();
- uv_create_to = mtx.affine_inverse().xform(Vector2(mb->get_position().x, mb->get_position().y));
}
}
- if (uv_move_current == UV_MODE_REMOVE_SPLIT) {
-
- splits_prev = node->get_splits();
- for (int i = 0; i < splits_prev.size(); i += 2) {
- if (splits_prev[i] < 0 || splits_prev[i] >= points_prev.size())
- continue;
- if (splits_prev[i + 1] < 0 || splits_prev[i] >= points_prev.size())
- continue;
- Vector2 e[2] = { mtx.xform(points_prev[splits_prev[i]]), mtx.xform(points_prev[splits_prev[i + 1]]) };
- Vector2 mp = Vector2(mb->get_position().x, mb->get_position().y);
- Vector2 cp = Geometry::get_closest_point_to_segment_2d(mp, e);
- if (cp.distance_to(mp) < 8) {
- splits_prev.remove(i);
- splits_prev.remove(i);
-
- undo_redo->create_action(TTR("Remove Split"));
-
- undo_redo->add_do_method(node, "set_splits", splits_prev);
- undo_redo->add_undo_method(node, "set_splits", node->get_splits());
- undo_redo->add_do_method(uv_edit_draw, "update");
- undo_redo->add_undo_method(uv_edit_draw, "update");
- undo_redo->commit_action();
+ if (uv_move_current == UV_MODE_REMOVE_POLYGON) {
+ Array polygons = node->get_polygons();
+ polygons = polygons.duplicate(); //copy because its a reference
+
+ int erase_index = -1;
+ for (int i = polygons.size() - 1; i >= 0; i--) {
+ PoolVector<int> points = polygons[i];
+ Vector<Vector2> polys;
+ polys.resize(points.size());
+ for (int j = 0; j < polys.size(); j++) {
+ int idx = points[j];
+ if (idx < 0 || idx >= points_prev.size())
+ continue;
+ polys.write[j] = mtx.xform(points_prev[idx]);
+ }
+ if (Geometry::is_point_in_polygon(Vector2(mb->get_position().x, mb->get_position().y), polys)) {
+ erase_index = i;
break;
}
}
+
+ if (erase_index != -1) {
+ polygons.remove(erase_index);
+ undo_redo->create_action(TTR("Remove Custom Polygon"));
+ undo_redo->add_do_method(node, "set_polygons", polygons);
+ undo_redo->add_undo_method(node, "set_polygons", node->get_polygons());
+ undo_redo->add_do_method(uv_edit_draw, "update");
+ undo_redo->add_undo_method(uv_edit_draw, "update");
+ undo_redo->commit_action();
+ }
}
if (uv_move_current == UV_MODE_PAINT_WEIGHT || uv_move_current == UV_MODE_CLEAR_WEIGHT) {
@@ -608,23 +736,26 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
} else if (uv_drag && !uv_create) {
- undo_redo->create_action(TTR("Transform UV Map"));
-
- if (uv_edit_mode[0]->is_pressed()) { //edit uv
+ if (uv_edit_mode[0]->is_pressed()) { // Edit UV.
+ undo_redo->create_action(TTR("Transform UV Map"));
undo_redo->add_do_method(node, "set_uv", node->get_uv());
undo_redo->add_undo_method(node, "set_uv", points_prev);
- } else if (uv_edit_mode[1]->is_pressed()) { //edit polygon
+ undo_redo->add_do_method(uv_edit_draw, "update");
+ undo_redo->add_undo_method(uv_edit_draw, "update");
+ undo_redo->commit_action();
+ } else if (uv_edit_mode[1]->is_pressed() && uv_move_current == UV_MODE_EDIT_POINT) { // Edit polygon.
+ undo_redo->create_action(TTR("Transform Polygon"));
undo_redo->add_do_method(node, "set_polygon", node->get_polygon());
undo_redo->add_undo_method(node, "set_polygon", points_prev);
+ undo_redo->add_do_method(uv_edit_draw, "update");
+ undo_redo->add_undo_method(uv_edit_draw, "update");
+ undo_redo->commit_action();
}
- undo_redo->add_do_method(uv_edit_draw, "update");
- undo_redo->add_undo_method(uv_edit_draw, "update");
- undo_redo->commit_action();
uv_drag = false;
} else if (bone_painting) {
- undo_redo->create_action(TTR("Paint bone weights"));
+ undo_redo->create_action(TTR("Paint Bone Weights"));
undo_redo->add_do_method(node, "set_bone_weights", bone_painting_bone, node->get_bone_weights(bone_painting_bone));
undo_redo->add_undo_method(node, "set_bone_weights", bone_painting_bone, prev_weights);
undo_redo->add_do_method(uv_edit_draw, "update");
@@ -635,30 +766,12 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
} else if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed()) {
- if (uv_create) {
-
- uv_drag = false;
- uv_create = false;
- node->set_uv(uv_create_uv_prev);
- node->set_polygon(uv_create_poly_prev);
- node->call("_set_bones", uv_create_bones_prev);
- node->set_splits(splits_prev);
- uv_edit_draw->update();
- } else if (uv_drag) {
+ _cancel_editing();
- uv_drag = false;
- if (uv_edit_mode[0]->is_pressed()) { //edit uv
- node->set_uv(points_prev);
- } else if (uv_edit_mode[1]->is_pressed()) { //edit polygon
- node->set_polygon(points_prev);
- }
- uv_edit_draw->update();
- } else if (split_create) {
- split_create = false;
- uv_edit_draw->update();
- } else if (bone_painting) {
+ if (bone_painting)
node->set_bone_weights(bone_painting_bone, prev_weights);
- }
+
+ uv_edit_draw->update();
} else if (mb->get_button_index() == BUTTON_WHEEL_UP && mb->is_pressed()) {
@@ -682,13 +795,15 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
} else if (uv_drag) {
Vector2 uv_drag_to = mm->get_position();
+ uv_drag_to = snap_point(uv_drag_to); // FIXME: Only works correctly with 'UV_MODE_EDIT_POINT', it's imprecise with the rest.
Vector2 drag = mtx.affine_inverse().xform(uv_drag_to) - mtx.affine_inverse().xform(uv_drag_from);
switch (uv_move_current) {
case UV_MODE_CREATE: {
+
if (uv_create) {
- uv_create_to = mtx.affine_inverse().xform(Vector2(mm->get_position().x, mm->get_position().y));
+ uv_create_to = mtx.affine_inverse().xform(snap_point(Vector2(mm->get_position().x, mm->get_position().y)));
}
} break;
case UV_MODE_EDIT_POINT: {
@@ -713,7 +828,6 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
} else if (uv_edit_mode[1]->is_pressed()) { //edit polygon
node->set_polygon(uv_new);
}
-
} break;
case UV_MODE_ROTATE: {
@@ -737,7 +851,6 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
} else if (uv_edit_mode[1]->is_pressed()) { //edit polygon
node->set_polygon(uv_new);
}
-
} break;
case UV_MODE_SCALE: {
@@ -767,11 +880,15 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
node->set_polygon(uv_new);
}
} break;
+ case UV_MODE_PAINT_WEIGHT:
+ case UV_MODE_CLEAR_WEIGHT: {
+
+ bone_paint_pos = Vector2(mm->get_position().x, mm->get_position().y);
+ } break;
default: {}
}
if (bone_painting) {
- bone_paint_pos = Vector2(mm->get_position().x, mm->get_position().y);
PoolVector<float> painted_weights = node->get_bone_weights(bone_painting_bone);
{
@@ -796,8 +913,10 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
node->set_bone_weights(bone_painting_bone, painted_weights);
}
+
uv_edit_draw->update();
- } else if (split_create) {
+ CanvasItemEditor::get_singleton()->update_viewport();
+ } else if (polygon_create.size()) {
uv_create_to = mtx.affine_inverse().xform(Vector2(mm->get_position().x, mm->get_position().y));
uv_edit_draw->update();
} else if (uv_mode == UV_MODE_PAINT_WEIGHT || uv_mode == UV_MODE_CLEAR_WEIGHT) {
@@ -833,6 +952,9 @@ void Polygon2DEditor::_uv_scroll_changed(float) {
void Polygon2DEditor::_uv_draw() {
+ if (!uv_edit->is_visible() || !_get_node())
+ return;
+
Ref<Texture> base_tex = node->get_texture();
if (base_tex.is_null())
return;
@@ -848,6 +970,7 @@ void Polygon2DEditor::_uv_draw() {
VS::get_singleton()->canvas_item_add_set_transform(uv_edit_draw->get_canvas_item(), Transform2D());
if (snap_show_grid) {
+ Color grid_color = Color(1.0, 1.0, 1.0, 0.15);
Size2 s = uv_edit_draw->get_size();
int last_cell = 0;
@@ -857,7 +980,7 @@ void Polygon2DEditor::_uv_draw() {
if (i == 0)
last_cell = cell;
if (last_cell != cell)
- uv_edit_draw->draw_line(Point2(i, 0), Point2(i, s.height), Color(0.3, 0.7, 1, 0.3));
+ uv_edit_draw->draw_line(Point2(i, 0), Point2(i, s.height), grid_color);
last_cell = cell;
}
}
@@ -868,12 +991,14 @@ void Polygon2DEditor::_uv_draw() {
if (i == 0)
last_cell = cell;
if (last_cell != cell)
- uv_edit_draw->draw_line(Point2(0, i), Point2(s.width, i), Color(0.3, 0.7, 1, 0.3));
+ uv_edit_draw->draw_line(Point2(0, i), Point2(s.width, i), grid_color);
last_cell = cell;
}
}
}
+ Array polygons = node->get_polygons();
+
PoolVector<Vector2> uvs;
if (uv_edit_mode[0]->is_pressed()) { //edit uv
uvs = node->get_uv();
@@ -900,35 +1025,88 @@ void Polygon2DEditor::_uv_draw() {
}
Ref<Texture> handle = get_icon("EditorHandle", "EditorIcons");
-
+ Ref<Texture> internal_handle = get_icon("EditorInternalHandle", "EditorIcons");
+
+ Color poly_line_color = Color(0.9, 0.5, 0.5);
+ Color polygon_line_color = Color(0.5, 0.5, 0.9);
+ Vector<Color> polygon_fill_color;
+ {
+ Color pf = polygon_line_color;
+ pf.a *= 0.5;
+ polygon_fill_color.push_back(pf);
+ }
+ Color prev_color = Color(0.5, 0.5, 0.5);
Rect2 rect(Point2(), mtx.basis_xform(base_tex->get_size()));
rect.expand_to(mtx.basis_xform(uv_edit_draw->get_size()));
+ int uv_draw_max = uvs.size();
+
+ for (int i = 0; i < polygons.size(); i++) {
+
+ PoolVector<int> points = polygons[i];
+ Vector<Vector2> polypoints;
+ for (int i = 0; i < points.size(); i++) {
+ int next = (i + 1) % points.size();
+
+ int idx = points[i];
+ int idx_next = points[next];
+ if (idx < 0 || idx >= uvs.size())
+ continue;
+ polypoints.push_back(mtx.xform(uvs[idx]));
+
+ if (idx_next < 0 || idx_next >= uvs.size())
+ continue;
+ uv_edit_draw->draw_line(mtx.xform(uvs[idx]), mtx.xform(uvs[idx_next]), polygon_line_color, 2 * EDSCALE);
+ }
+ if (points.size() >= 3) {
+ uv_edit_draw->draw_polygon(polypoints, polygon_fill_color);
+ }
+ }
+
+ uv_draw_max -= node->get_internal_vertex_count();
+ if (uv_draw_max < 0) {
+ uv_draw_max = 0;
+ }
+
for (int i = 0; i < uvs.size(); i++) {
- int next = (i + 1) % uvs.size();
+ int next = uv_draw_max > 0 ? (i + 1) % uv_draw_max : 0;
+
+ if (i < uv_draw_max && uv_drag && uv_move_current == UV_MODE_EDIT_POINT && EDITOR_DEF("editors/poly_editor/show_previous_outline", true)) {
+ uv_edit_draw->draw_line(mtx.xform(points_prev[i]), mtx.xform(points_prev[next]), prev_color, 2 * EDSCALE);
+ }
+
Vector2 next_point = uvs[next];
if (uv_create && i == uvs.size() - 1) {
next_point = uv_create_to;
}
- uv_edit_draw->draw_line(mtx.xform(uvs[i]), mtx.xform(next_point), Color(0.9, 0.5, 0.5), 2);
- if (weight_r.ptr()) {
+ if (i < uv_draw_max && polygons.size() == 0 && polygon_create.size() == 0) { //if using or creating polygons, do not show outline (will show polygons instead)
+ uv_edit_draw->draw_line(mtx.xform(uvs[i]), mtx.xform(next_point), poly_line_color, 2 * EDSCALE);
+ }
+ if (weight_r.ptr()) {
Vector2 draw_pos = mtx.xform(uvs[i]);
float weight = weight_r[i];
uv_edit_draw->draw_rect(Rect2(draw_pos - Vector2(2, 2) * EDSCALE, Vector2(5, 5) * EDSCALE), Color(weight, weight, weight, 1.0));
} else {
- uv_edit_draw->draw_texture(handle, mtx.xform(uvs[i]) - handle->get_size() * 0.5);
+ if (i < uv_draw_max) {
+ uv_edit_draw->draw_texture(handle, mtx.xform(uvs[i]) - handle->get_size() * 0.5);
+ } else {
+ uv_edit_draw->draw_texture(internal_handle, mtx.xform(uvs[i]) - internal_handle->get_size() * 0.5);
+ }
}
rect.expand_to(mtx.basis_xform(uvs[i]));
}
- if (split_create) {
- Vector2 from = uvs[point_drag_index];
- Vector2 to = uv_create_to;
- uv_edit_draw->draw_line(mtx.xform(from), mtx.xform(to), Color(0.9, 0.5, 0.5), 2);
+ if (polygon_create.size()) {
+ for (int i = 0; i < polygon_create.size(); i++) {
+ Vector2 from = uvs[polygon_create[i]];
+ Vector2 to = (i + 1) < polygon_create.size() ? uvs[polygon_create[i + 1]] : uv_create_to;
+ uv_edit_draw->draw_line(mtx.xform(from), mtx.xform(to), poly_line_color, 2);
+ }
}
+#if 0
PoolVector<int> splits = node->get_splits();
for (int i = 0; i < splits.size(); i += 2) {
@@ -936,9 +1114,9 @@ void Polygon2DEditor::_uv_draw() {
int idx_to = splits[i + 1];
if (idx_from < 0 || idx_to >= uvs.size())
continue;
- uv_edit_draw->draw_line(mtx.xform(uvs[idx_from]), mtx.xform(uvs[idx_to]), Color(0.9, 0.5, 0.5), 2);
+ uv_edit_draw->draw_line(mtx.xform(uvs[idx_from]), mtx.xform(uvs[idx_to]), poly_line_color, 2);
}
-
+#endif
if (uv_mode == UV_MODE_PAINT_WEIGHT || uv_mode == UV_MODE_CLEAR_WEIGHT) {
NodePath bone_path;
@@ -963,22 +1141,32 @@ void Polygon2DEditor::_uv_draw() {
bool current = bone_path == skeleton->get_path_to(bone);
+ bool found_child = false;
+
for (int j = 0; j < bone->get_child_count(); j++) {
- Node2D *n = Object::cast_to<Node2D>(bone->get_child(j));
+ Bone2D *n = Object::cast_to<Bone2D>(bone->get_child(j));
if (!n)
continue;
- bool edit_bone = n->has_meta("_edit_bone_") && n->get_meta("_edit_bone_");
- if (edit_bone) {
+ found_child = true;
- Transform2D bone_xform = node->get_global_transform().affine_inverse() * (skeleton->get_global_transform() * bone->get_skeleton_rest());
- Transform2D endpoint_xform = bone_xform * n->get_transform();
+ Transform2D bone_xform = node->get_global_transform().affine_inverse() * (skeleton->get_global_transform() * bone->get_skeleton_rest());
+ Transform2D endpoint_xform = bone_xform * n->get_transform();
- Color color = current ? Color(1, 1, 1) : Color(0.5, 0.5, 0.5);
- uv_edit_draw->draw_line(mtx.xform(bone_xform.get_origin()), mtx.xform(endpoint_xform.get_origin()), Color(0, 0, 0), current ? 5 : 4);
- uv_edit_draw->draw_line(mtx.xform(bone_xform.get_origin()), mtx.xform(endpoint_xform.get_origin()), color, current ? 3 : 2);
- }
+ Color color = current ? Color(1, 1, 1) : Color(0.5, 0.5, 0.5);
+ uv_edit_draw->draw_line(mtx.xform(bone_xform.get_origin()), mtx.xform(endpoint_xform.get_origin()), Color(0, 0, 0), current ? 5 : 4);
+ uv_edit_draw->draw_line(mtx.xform(bone_xform.get_origin()), mtx.xform(endpoint_xform.get_origin()), color, current ? 3 : 2);
+ }
+
+ if (!found_child) {
+ //draw normally
+ Transform2D bone_xform = node->get_global_transform().affine_inverse() * (skeleton->get_global_transform() * bone->get_skeleton_rest());
+ Transform2D endpoint_xform = bone_xform * Transform2D(0, Vector2(bone->get_default_length(), 0));
+
+ Color color = current ? Color(1, 1, 1) : Color(0.5, 0.5, 0.5);
+ uv_edit_draw->draw_line(mtx.xform(bone_xform.get_origin()), mtx.xform(endpoint_xform.get_origin()), Color(0, 0, 0), current ? 5 : 4);
+ uv_edit_draw->draw_line(mtx.xform(bone_xform.get_origin()), mtx.xform(endpoint_xform.get_origin()), color, current ? 3 : 2);
}
}
}
@@ -992,15 +1180,23 @@ void Polygon2DEditor::_uv_draw() {
updating_uv_scroll = true;
uv_hscroll->set_min(rect.position.x);
uv_hscroll->set_max(rect.position.x + rect.size.x);
- uv_hscroll->set_page(uv_edit_draw->get_size().x);
- uv_hscroll->set_value(uv_draw_ofs.x);
- uv_hscroll->set_step(0.001);
+ if (ABS(rect.position.x - (rect.position.x + rect.size.x)) <= uv_edit_draw->get_size().x) {
+ uv_hscroll->hide();
+ } else {
+ uv_hscroll->show();
+ uv_hscroll->set_page(uv_edit_draw->get_size().x);
+ uv_hscroll->set_value(uv_draw_ofs.x);
+ }
uv_vscroll->set_min(rect.position.y);
uv_vscroll->set_max(rect.position.y + rect.size.y);
- uv_vscroll->set_page(uv_edit_draw->get_size().y);
- uv_vscroll->set_value(uv_draw_ofs.y);
- uv_vscroll->set_step(0.001);
+ if (ABS(rect.position.y - (rect.position.y + rect.size.y)) <= uv_edit_draw->get_size().y) {
+ uv_vscroll->hide();
+ } else {
+ uv_vscroll->show();
+ uv_vscroll->set_page(uv_edit_draw->get_size().y);
+ uv_vscroll->set_value(uv_draw_ofs.y);
+ }
updating_uv_scroll = false;
}
@@ -1017,9 +1213,9 @@ void Polygon2DEditor::_bind_methods() {
ClassDB::bind_method(D_METHOD("_set_snap_step_x"), &Polygon2DEditor::_set_snap_step_x);
ClassDB::bind_method(D_METHOD("_set_snap_step_y"), &Polygon2DEditor::_set_snap_step_y);
ClassDB::bind_method(D_METHOD("_uv_edit_mode_select"), &Polygon2DEditor::_uv_edit_mode_select);
+ ClassDB::bind_method(D_METHOD("_uv_edit_popup_hide"), &Polygon2DEditor::_uv_edit_popup_hide);
ClassDB::bind_method(D_METHOD("_sync_bones"), &Polygon2DEditor::_sync_bones);
ClassDB::bind_method(D_METHOD("_update_bone_list"), &Polygon2DEditor::_update_bone_list);
-
ClassDB::bind_method(D_METHOD("_bone_paint_selected"), &Polygon2DEditor::_bone_paint_selected);
}
@@ -1036,23 +1232,25 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
AbstractPolygon2DEditor(p_editor) {
node = NULL;
- snap_step = Vector2(10, 10);
- use_snap = false;
- snap_show_grid = false;
+ snap_offset = EditorSettings::get_singleton()->get_project_metadata("polygon_2d_uv_editor", "snap_offset", Vector2());
+ snap_step = EditorSettings::get_singleton()->get_project_metadata("polygon_2d_uv_editor", "snap_step", Vector2(10, 10));
+ use_snap = EditorSettings::get_singleton()->get_project_metadata("polygon_2d_uv_editor", "snap_enabled", false);
+ snap_show_grid = EditorSettings::get_singleton()->get_project_metadata("polygon_2d_uv_editor", "show_grid", false);
button_uv = memnew(ToolButton);
add_child(button_uv);
+ button_uv->set_tooltip(TTR("Open Polygon 2D UV editor."));
button_uv->connect("pressed", this, "_menu_option", varray(MODE_EDIT_UV));
uv_mode = UV_MODE_EDIT_POINT;
uv_edit = memnew(AcceptDialog);
add_child(uv_edit);
uv_edit->set_title(TTR("Polygon 2D UV Editor"));
- uv_edit->set_self_modulate(Color(1, 1, 1, 0.9));
+ uv_edit->set_resizable(true);
+ uv_edit->connect("popup_hide", this, "_uv_edit_popup_hide");
VBoxContainer *uv_main_vb = memnew(VBoxContainer);
uv_edit->add_child(uv_main_vb);
- //uv_edit->set_child_rect(uv_main_vb);
HBoxContainer *uv_mode_hb = memnew(HBoxContainer);
uv_edit_group.instance();
@@ -1072,8 +1270,8 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
uv_edit_mode[0]->set_text(TTR("UV"));
uv_edit_mode[0]->set_pressed(true);
- uv_edit_mode[1]->set_text(TTR("Poly"));
- uv_edit_mode[2]->set_text(TTR("Splits"));
+ uv_edit_mode[1]->set_text(TTR("Points"));
+ uv_edit_mode[2]->set_text(TTR("Polygons"));
uv_edit_mode[3]->set_text(TTR("Bones"));
uv_edit_mode[0]->set_button_group(uv_edit_group);
@@ -1098,22 +1296,26 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
uv_button[i]->set_focus_mode(FOCUS_NONE);
}
- uv_button[0]->set_tooltip(TTR("Create Polygon"));
- uv_button[1]->set_tooltip(TTR("Move Point") + "\n" + TTR("Ctrl: Rotate") + "\n" + TTR("Shift: Move All") + "\n" + TTR("Shift+Ctrl: Scale"));
- uv_button[2]->set_tooltip(TTR("Move Polygon"));
- uv_button[3]->set_tooltip(TTR("Rotate Polygon"));
- uv_button[4]->set_tooltip(TTR("Scale Polygon"));
- uv_button[5]->set_tooltip(TTR("Connect two points to make a split"));
- uv_button[6]->set_tooltip(TTR("Select a split to erase it"));
- uv_button[7]->set_tooltip(TTR("Paint weights with specified intensity"));
- uv_button[8]->set_tooltip(TTR("UnPaint weights with specified intensity"));
-
- uv_button[0]->hide();
- uv_button[5]->hide();
- uv_button[6]->hide();
- uv_button[7]->hide();
- uv_button[8]->hide();
- uv_button[1]->set_pressed(true);
+ uv_button[UV_MODE_CREATE]->set_tooltip(TTR("Create Polygon"));
+ uv_button[UV_MODE_CREATE_INTERNAL]->set_tooltip(TTR("Create Internal Vertex"));
+ uv_button[UV_MODE_REMOVE_INTERNAL]->set_tooltip(TTR("Remove Internal Vertex"));
+ uv_button[UV_MODE_EDIT_POINT]->set_tooltip(TTR("Move Points") + "\n" + TTR("Ctrl: Rotate") + "\n" + TTR("Shift: Move All") + "\n" + TTR("Shift+Ctrl: Scale"));
+ uv_button[UV_MODE_MOVE]->set_tooltip(TTR("Move Polygon"));
+ uv_button[UV_MODE_ROTATE]->set_tooltip(TTR("Rotate Polygon"));
+ uv_button[UV_MODE_SCALE]->set_tooltip(TTR("Scale Polygon"));
+ uv_button[UV_MODE_ADD_POLYGON]->set_tooltip(TTR("Create a custom polygon. Enables custom polygon rendering."));
+ uv_button[UV_MODE_REMOVE_POLYGON]->set_tooltip(TTR("Remove a custom polygon. If none remain, custom polygon rendering is disabled."));
+ uv_button[UV_MODE_PAINT_WEIGHT]->set_tooltip(TTR("Paint weights with specified intensity."));
+ uv_button[UV_MODE_CLEAR_WEIGHT]->set_tooltip(TTR("Unpaint weights with specified intensity."));
+
+ uv_button[UV_MODE_CREATE]->hide();
+ uv_button[UV_MODE_CREATE_INTERNAL]->hide();
+ uv_button[UV_MODE_REMOVE_INTERNAL]->hide();
+ uv_button[UV_MODE_ADD_POLYGON]->hide();
+ uv_button[UV_MODE_REMOVE_POLYGON]->hide();
+ uv_button[UV_MODE_PAINT_WEIGHT]->hide();
+ uv_button[UV_MODE_CLEAR_WEIGHT]->hide();
+ uv_button[UV_MODE_EDIT_POINT]->set_pressed(true);
bone_paint_strength = memnew(HSlider);
uv_mode_hb->add_child(bone_paint_strength);
@@ -1124,7 +1326,7 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
bone_paint_strength->set_step(0.01);
bone_paint_strength->set_value(0.5);
- bone_paint_radius_label = memnew(Label(" " + TTR("Radius:") + " "));
+ bone_paint_radius_label = memnew(Label(TTR("Radius:")));
uv_mode_hb->add_child(bone_paint_radius_label);
bone_paint_radius = memnew(SpinBox);
uv_mode_hb->add_child(bone_paint_radius);
@@ -1137,12 +1339,13 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
bone_paint_radius->set_step(1);
bone_paint_radius->set_value(32);
- HBoxContainer *uv_main_hb = memnew(HBoxContainer);
- uv_main_vb->add_child(uv_main_hb);
- uv_edit_draw = memnew(Control);
- uv_main_hb->add_child(uv_edit_draw);
- uv_main_hb->set_v_size_flags(SIZE_EXPAND_FILL);
+ HSplitContainer *uv_main_hsc = memnew(HSplitContainer);
+ uv_main_vb->add_child(uv_main_hsc);
+ uv_main_hsc->set_v_size_flags(SIZE_EXPAND_FILL);
+ uv_edit_draw = memnew(Panel);
+ uv_main_hsc->add_child(uv_edit_draw);
uv_edit_draw->set_h_size_flags(SIZE_EXPAND_FILL);
+ uv_edit_draw->set_custom_minimum_size(Size2(200, 200) * EDSCALE);
uv_menu = memnew(MenuButton);
uv_mode_hb->add_child(uv_menu);
uv_menu->set_text(TTR("Edit"));
@@ -1218,6 +1421,7 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
uv_mode_hb->add_child(memnew(VSeparator));
uv_icon_zoom = memnew(TextureRect);
+ uv_icon_zoom->set_stretch_mode(TextureRect::STRETCH_KEEP_CENTERED);
uv_mode_hb->add_child(uv_icon_zoom);
uv_zoom = memnew(HSlider);
uv_zoom->set_min(0.01);
@@ -1235,17 +1439,25 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
uv_zoom->connect("value_changed", this, "_uv_scroll_changed");
uv_vscroll = memnew(VScrollBar);
- uv_main_hb->add_child(uv_vscroll);
+ uv_vscroll->set_step(0.001);
+ uv_edit_draw->add_child(uv_vscroll);
+ uv_vscroll->set_anchors_and_margins_preset(PRESET_RIGHT_WIDE);
uv_vscroll->connect("value_changed", this, "_uv_scroll_changed");
uv_hscroll = memnew(HScrollBar);
- uv_main_vb->add_child(uv_hscroll);
+ uv_hscroll->set_step(0.001);
+ uv_edit_draw->add_child(uv_hscroll);
+ uv_hscroll->set_anchors_and_margins_preset(PRESET_BOTTOM_WIDE);
+ uv_hscroll->set_margin(MARGIN_RIGHT, -uv_vscroll->get_size().x * EDSCALE);
uv_hscroll->connect("value_changed", this, "_uv_scroll_changed");
bone_scroll_main_vb = memnew(VBoxContainer);
bone_scroll_main_vb->hide();
+ bone_scroll_main_vb->set_custom_minimum_size(Size2(150 * EDSCALE, 0));
sync_bones = memnew(Button(TTR("Sync Bones to Polygon")));
bone_scroll_main_vb->add_child(sync_bones);
- uv_main_hb->add_child(bone_scroll_main_vb);
+ sync_bones->set_h_size_flags(0);
+ sync_bones->connect("pressed", this, "_sync_bones");
+ uv_main_hsc->add_child(bone_scroll_main_vb);
bone_scroll = memnew(ScrollContainer);
bone_scroll->set_v_scroll(true);
bone_scroll->set_h_scroll(false);
@@ -1253,7 +1465,6 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
bone_scroll->set_v_size_flags(SIZE_EXPAND_FILL);
bone_scroll_vb = memnew(VBoxContainer);
bone_scroll->add_child(bone_scroll_vb);
- sync_bones->connect("pressed", this, "_sync_bones");
uv_edit_draw->connect("draw", this, "_uv_draw");
uv_edit_draw->connect("gui_input", this, "_uv_input");
@@ -1262,7 +1473,6 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
uv_drag = false;
uv_create = false;
updating_uv_scroll = false;
- split_create = false;
bone_painting = false;
error = memnew(AcceptDialog);
diff --git a/editor/plugins/polygon_2d_editor_plugin.h b/editor/plugins/polygon_2d_editor_plugin.h
index f9b42a21c2..d1849dd09b 100644
--- a/editor/plugins/polygon_2d_editor_plugin.h
+++ b/editor/plugins/polygon_2d_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -41,23 +41,23 @@ class Polygon2DEditor : public AbstractPolygon2DEditor {
GDCLASS(Polygon2DEditor, AbstractPolygon2DEditor);
enum Mode {
-
MODE_EDIT_UV = MODE_CONT,
UVEDIT_POLYGON_TO_UV,
UVEDIT_UV_TO_POLYGON,
UVEDIT_UV_CLEAR,
UVEDIT_GRID_SETTINGS
-
};
enum UVMode {
UV_MODE_CREATE,
+ UV_MODE_CREATE_INTERNAL,
+ UV_MODE_REMOVE_INTERNAL,
UV_MODE_EDIT_POINT,
UV_MODE_MOVE,
UV_MODE_ROTATE,
UV_MODE_SCALE,
- UV_MODE_ADD_SPLIT,
- UV_MODE_REMOVE_SPLIT,
+ UV_MODE_ADD_POLYGON,
+ UV_MODE_REMOVE_POLYGON,
UV_MODE_PAINT_WEIGHT,
UV_MODE_CLEAR_WEIGHT,
UV_MODE_MAX
@@ -73,7 +73,7 @@ class Polygon2DEditor : public AbstractPolygon2DEditor {
ToolButton *uv_button[UV_MODE_MAX];
ToolButton *b_snap_enable;
ToolButton *b_snap_grid;
- Control *uv_edit_draw;
+ Panel *uv_edit_draw;
HSlider *uv_zoom;
SpinBox *uv_zoom_value;
HScrollBar *uv_hscroll;
@@ -102,14 +102,16 @@ class Polygon2DEditor : public AbstractPolygon2DEditor {
PoolVector<Vector2> points_prev;
PoolVector<Vector2> uv_create_uv_prev;
PoolVector<Vector2> uv_create_poly_prev;
+ PoolVector<Color> uv_create_colors_prev;
+ int uv_create_prev_internal_vertices;
Array uv_create_bones_prev;
- PoolVector<int> splits_prev;
+ Array polygons_prev;
Vector2 uv_create_to;
int point_drag_index;
bool uv_drag;
bool uv_create;
- bool split_create;
+ Vector<int> polygon_create;
UVMode uv_move_current;
Vector2 uv_drag_from;
bool updating_uv_scroll;
@@ -125,6 +127,8 @@ class Polygon2DEditor : public AbstractPolygon2DEditor {
virtual void _menu_option(int p_option);
+ void _cancel_editing();
+
void _uv_scroll_changed(float);
void _uv_input(const Ref<InputEvent> &p_input);
void _uv_draw();
@@ -138,14 +142,20 @@ class Polygon2DEditor : public AbstractPolygon2DEditor {
void _set_snap_step_y(float p_val);
void _uv_edit_mode_select(int p_mode);
+ void _uv_edit_popup_hide();
void _bone_paint_selected(int p_index);
+ int _get_polygon_count() const;
+
protected:
virtual Node2D *_get_node() const;
virtual void _set_node(Node *p_polygon);
virtual Vector2 _get_offset(int p_idx) const;
+ virtual bool _has_uv() const { return true; };
+ virtual void _commit_action();
+
void _notification(int p_what);
static void _bind_methods();
diff --git a/editor/plugins/resource_preloader_editor_plugin.cpp b/editor/plugins/resource_preloader_editor_plugin.cpp
index bd4a35c9d8..53300f45ec 100644
--- a/editor/plugins/resource_preloader_editor_plugin.cpp
+++ b/editor/plugins/resource_preloader_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/resource_preloader_editor_plugin.h b/editor/plugins/resource_preloader_editor_plugin.h
index 0a8238ce18..346249b1c5 100644
--- a/editor/plugins/resource_preloader_editor_plugin.h
+++ b/editor/plugins/resource_preloader_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/root_motion_editor_plugin.cpp b/editor/plugins/root_motion_editor_plugin.cpp
index b3adf19a64..a19e715d87 100644
--- a/editor/plugins/root_motion_editor_plugin.cpp
+++ b/editor/plugins/root_motion_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -206,7 +206,7 @@ void EditorPropertyRootMotion::update_property() {
assign->set_tooltip(p);
if (p == NodePath()) {
assign->set_icon(Ref<Texture>());
- assign->set_text(TTR("Assign.."));
+ assign->set_text(TTR("Assign..."));
assign->set_flat(false);
return;
}
diff --git a/editor/plugins/root_motion_editor_plugin.h b/editor/plugins/root_motion_editor_plugin.h
index 2b5492350b..e7fd597235 100644
--- a/editor/plugins/root_motion_editor_plugin.h
+++ b/editor/plugins/root_motion_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp
index 085660b79e..182738cf14 100644
--- a/editor/plugins/script_editor_plugin.cpp
+++ b/editor/plugins/script_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -40,6 +40,7 @@
#include "editor/editor_settings.h"
#include "editor/find_in_files.h"
#include "editor/node_dock.h"
+#include "editor/plugins/shader_editor_plugin.h"
#include "editor/script_editor_debugger.h"
#include "scene/main/viewport.h"
#include "script_text_editor.h"
@@ -50,8 +51,7 @@ void ScriptEditorBase::_bind_methods() {
ADD_SIGNAL(MethodInfo("name_changed"));
ADD_SIGNAL(MethodInfo("edited_script_changed"));
- ADD_SIGNAL(MethodInfo("request_help_search", PropertyInfo(Variant::STRING, "topic")));
- ADD_SIGNAL(MethodInfo("request_help_index"));
+ ADD_SIGNAL(MethodInfo("request_help", PropertyInfo(Variant::STRING, "topic")));
ADD_SIGNAL(MethodInfo("request_open_script_at_line", PropertyInfo(Variant::OBJECT, "script"), PropertyInfo(Variant::INT, "line")));
ADD_SIGNAL(MethodInfo("request_save_history"));
ADD_SIGNAL(MethodInfo("go_to_help", PropertyInfo(Variant::STRING, "what")));
@@ -897,12 +897,12 @@ void ScriptEditor::_file_dialog_action(String p_file) {
} break;
case THEME_SAVE_AS: {
if (!EditorSettings::get_singleton()->save_text_editor_theme_as(p_file)) {
- editor->show_warning(TTR("Error while saving theme"), TTR("Error saving"));
+ editor->show_warning(TTR("Error while saving theme."), TTR("Error Saving"));
}
} break;
case THEME_IMPORT: {
if (!EditorSettings::get_singleton()->import_text_editor_theme(p_file)) {
- editor->show_warning(TTR("Error importing theme"), TTR("Error importing"));
+ editor->show_warning(TTR("Error importing theme."), TTR("Error Importing"));
}
} break;
}
@@ -975,10 +975,6 @@ void ScriptEditor::_menu_option(int p_option) {
help_search_dialog->popup_dialog();
} break;
- case SEARCH_CLASSES: {
-
- help_index->popup_dialog();
- } break;
case SEARCH_WEBSITE: {
OS::get_singleton()->shell_open("https://docs.godotengine.org/");
@@ -1094,7 +1090,7 @@ void ScriptEditor::_menu_option(int p_option) {
Ref<Script> scr = current->get_edited_resource();
if (scr == NULL || scr.is_null()) {
- EditorNode::get_singleton()->show_warning("Can't obtain the script for running");
+ EditorNode::get_singleton()->show_warning("Can't obtain the script for running.");
break;
}
@@ -1107,13 +1103,13 @@ void ScriptEditor::_menu_option(int p_option) {
}
if (!scr->is_tool()) {
- EditorNode::get_singleton()->show_warning("Script is not in tool mode, will not be able to run");
+ EditorNode::get_singleton()->show_warning("Script is not in tool mode, will not be able to run.");
return;
}
if (!ClassDB::is_parent_class(scr->get_instance_base_type(), "EditorScript")) {
- EditorNode::get_singleton()->show_warning("To run this script, it must inherit EditorScript and be set to tool mode");
+ EditorNode::get_singleton()->show_warning("To run this script, it must inherit EditorScript and be set to tool mode.");
return;
}
@@ -1206,12 +1202,6 @@ void ScriptEditor::_menu_option(int p_option) {
if (help) {
switch (p_option) {
-
- case SEARCH_CLASSES: {
-
- help_index->popup_dialog();
- help_index->call_deferred("select_class", help->get_class());
- } break;
case HELP_SEARCH_FIND: {
help->popup_search();
} break;
@@ -1318,7 +1308,6 @@ void ScriptEditor::_notification(int p_what) {
EditorSettings::get_singleton()->connect("settings_changed", this, "_editor_settings_changed");
help_search->set_icon(get_icon("HelpSearch", "EditorIcons"));
site_search->set_icon(get_icon("Instance", "EditorIcons"));
- class_search->set_icon(get_icon("ClassList", "EditorIcons"));
script_forward->set_icon(get_icon("Forward", "EditorIcons"));
script_back->set_icon(get_icon("Back", "EditorIcons"));
@@ -1330,7 +1319,6 @@ void ScriptEditor::_notification(int p_what) {
get_tree()->connect("tree_changed", this, "_tree_changed");
editor->get_inspector_dock()->connect("request_help", this, "_request_help");
editor->connect("request_help_search", this, "_help_search");
- editor->connect("request_help_index", this, "_help_index");
} break;
case NOTIFICATION_EXIT_TREE: {
@@ -1350,7 +1338,6 @@ void ScriptEditor::_notification(int p_what) {
help_search->set_icon(get_icon("HelpSearch", "EditorIcons"));
site_search->set_icon(get_icon("Instance", "EditorIcons"));
- class_search->set_icon(get_icon("ClassList", "EditorIcons"));
script_forward->set_icon(get_icon("Forward", "EditorIcons"));
script_back->set_icon(get_icon("Back", "EditorIcons"));
@@ -1829,6 +1816,10 @@ Ref<TextFile> ScriptEditor::_load_text_file(const String &p_path, Error *r_error
text_file->set_file_path(local_path);
text_file->set_path(local_path, true);
+ if (ResourceLoader::get_timestamp_on_load()) {
+ text_file->set_last_modified_time(FileAccess::get_modified_time(path));
+ }
+
if (r_error) {
*r_error = OK;
}
@@ -1858,6 +1849,10 @@ Error ScriptEditor::_save_text_file(Ref<TextFile> p_text_file, const String &p_p
file->close();
memdelete(file);
+ if (ResourceSaver::get_timestamp_on_save()) {
+ p_text_file->set_last_modified_time(FileAccess::get_modified_time(p_path));
+ }
+
_res_saved_callback(sqscr);
return OK;
}
@@ -2006,7 +2001,7 @@ bool ScriptEditor::edit(const RES &p_resource, int p_line, int p_col, bool p_gra
_save_layout();
se->connect("name_changed", this, "_update_script_names");
se->connect("edited_script_changed", this, "_script_changed");
- se->connect("request_help_search", this, "_help_search");
+ se->connect("request_help", this, "_help_search");
se->connect("request_open_script_at_line", this, "_goto_script_line");
se->connect("go_to_help", this, "_help_class_goto");
se->connect("request_save_history", this, "_save_history");
@@ -2733,10 +2728,6 @@ void ScriptEditor::set_live_auto_reload_running_scripts(bool p_enabled) {
auto_reload_running_scripts = p_enabled;
}
-void ScriptEditor::_help_index(String p_text) {
- help_index->popup_dialog();
-}
-
void ScriptEditor::_help_search(String p_text) {
help_search_dialog->popup_dialog(p_text);
}
@@ -2788,13 +2779,18 @@ void ScriptEditor::_on_find_in_files_requested(String text) {
void ScriptEditor::_on_find_in_files_result_selected(String fpath, int line_number, int begin, int end) {
RES res = ResourceLoader::load(fpath);
- edit(res);
-
- ScriptEditorBase *seb = _get_current_editor();
+ if (fpath.get_extension() == "shader") {
+ ShaderEditorPlugin *shader_editor = Object::cast_to<ShaderEditorPlugin>(EditorNode::get_singleton()->get_editor_data().get_editor("Shader"));
+ shader_editor->edit(res.ptr());
+ shader_editor->make_visible(true);
+ shader_editor->get_shader_editor()->goto_line_selection(line_number - 1, begin, end);
+ } else {
+ edit(res);
- ScriptTextEditor *ste = Object::cast_to<ScriptTextEditor>(seb);
- if (ste) {
- ste->goto_line_selection(line_number - 1, begin, end);
+ ScriptTextEditor *ste = Object::cast_to<ScriptTextEditor>(_get_current_editor());
+ if (ste) {
+ ste->goto_line_selection(line_number - 1, begin, end);
+ }
}
}
@@ -2804,7 +2800,7 @@ void ScriptEditor::_start_find_in_files(bool with_replace) {
f->set_search_text(find_in_files_dialog->get_search_text());
f->set_match_case(find_in_files_dialog->is_match_case());
- f->set_whole_words(find_in_files_dialog->is_match_case());
+ f->set_whole_words(find_in_files_dialog->is_whole_words());
f->set_folder(find_in_files_dialog->get_folder());
f->set_filter(find_in_files_dialog->get_filter());
@@ -2842,7 +2838,6 @@ void ScriptEditor::_bind_methods() {
ClassDB::bind_method("_goto_script_line", &ScriptEditor::_goto_script_line);
ClassDB::bind_method("_goto_script_line2", &ScriptEditor::_goto_script_line2);
ClassDB::bind_method("_help_search", &ScriptEditor::_help_search);
- ClassDB::bind_method("_help_index", &ScriptEditor::_help_index);
ClassDB::bind_method("_save_history", &ScriptEditor::_save_history);
ClassDB::bind_method("_copy_script_path", &ScriptEditor::_copy_script_path);
@@ -2982,10 +2977,11 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
file_menu = memnew(MenuButton);
menu_hb->add_child(file_menu);
file_menu->set_text(TTR("File"));
+ file_menu->set_switch_on_hover(true);
file_menu->get_popup()->set_hide_on_window_lose_focus(true);
- file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/new", TTR("New Script")), FILE_NEW);
- file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/new_textfile", TTR("New TextFile")), FILE_NEW_TEXTFILE);
- file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/open", TTR("Open")), FILE_OPEN);
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/new", TTR("New Script...")), FILE_NEW);
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/new_textfile", TTR("New TextFile...")), FILE_NEW_TEXTFILE);
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/open", TTR("Open...")), FILE_OPEN);
file_menu->get_popup()->add_submenu_item(TTR("Open Recent"), "RecentScripts", FILE_OPEN_RECENT);
recent_scripts = memnew(PopupMenu);
@@ -3014,10 +3010,11 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
theme_submenu->set_name("Theme");
file_menu->get_popup()->add_child(theme_submenu);
theme_submenu->connect("id_pressed", this, "_theme_option");
- theme_submenu->add_shortcut(ED_SHORTCUT("script_editor/import_theme", TTR("Import Theme")), THEME_IMPORT);
+ theme_submenu->add_shortcut(ED_SHORTCUT("script_editor/import_theme", TTR("Import Theme...")), THEME_IMPORT);
theme_submenu->add_shortcut(ED_SHORTCUT("script_editor/reload_theme", TTR("Reload Theme")), THEME_RELOAD);
+ theme_submenu->add_separator();
theme_submenu->add_shortcut(ED_SHORTCUT("script_editor/save_theme", TTR("Save Theme")), THEME_SAVE);
- theme_submenu->add_shortcut(ED_SHORTCUT("script_editor/save_theme_as", TTR("Save Theme As")), THEME_SAVE_AS);
+ theme_submenu->add_shortcut(ED_SHORTCUT("script_editor/save_theme_as", TTR("Save Theme As...")), THEME_SAVE_AS);
file_menu->get_popup()->add_separator();
file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/close_docs", TTR("Close Docs")), CLOSE_DOCS);
@@ -3033,6 +3030,7 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
script_search_menu = memnew(MenuButton);
menu_hb->add_child(script_search_menu);
script_search_menu->set_text(TTR("Search"));
+ script_search_menu->set_switch_on_hover(true);
script_search_menu->get_popup()->set_hide_on_window_lose_focus(true);
script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find", TTR("Find..."), KEY_MASK_CMD | KEY_F), HELP_SEARCH_FIND);
script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_next", TTR("Find Next"), KEY_F3), HELP_SEARCH_FIND_NEXT);
@@ -3042,6 +3040,7 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
debug_menu = memnew(MenuButton);
menu_hb->add_child(debug_menu);
debug_menu->set_text(TTR("Debug"));
+ debug_menu->set_switch_on_hover(true);
debug_menu->get_popup()->set_hide_on_window_lose_focus(true);
debug_menu->get_popup()->add_shortcut(ED_SHORTCUT("debugger/step_over", TTR("Step Over"), KEY_F10), DEBUG_NEXT);
debug_menu->get_popup()->add_shortcut(ED_SHORTCUT("debugger/step_into", TTR("Step Into"), KEY_F11), DEBUG_STEP);
@@ -3077,12 +3076,6 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
menu_hb->add_child(site_search);
site_search->set_tooltip(TTR("Open Godot online documentation"));
- class_search = memnew(ToolButton);
- class_search->set_text(TTR("Classes"));
- class_search->connect("pressed", this, "_menu_option", varray(SEARCH_CLASSES));
- menu_hb->add_child(class_search);
- class_search->set_tooltip(TTR("Search the class hierarchy."));
-
help_search = memnew(ToolButton);
help_search->set_text(TTR("Search Help"));
help_search->connect("pressed", this, "_menu_option", varray(SEARCH_HELP));
@@ -3168,10 +3161,6 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
add_child(help_search_dialog);
help_search_dialog->connect("go_to_help", this, "_help_class_goto");
- help_index = memnew(EditorHelpIndex);
- add_child(help_index);
- help_index->connect("open_class", this, "_help_class_open");
-
find_in_files_dialog = memnew(FindInFilesDialog);
find_in_files_dialog->connect(FindInFilesDialog::SIGNAL_FIND_REQUESTED, this, "_start_find_in_files", varray(false));
find_in_files_dialog->connect(FindInFilesDialog::SIGNAL_REPLACE_REQUESTED, this, "_start_find_in_files", varray(true));
diff --git a/editor/plugins/script_editor_plugin.h b/editor/plugins/script_editor_plugin.h
index 28c07393f7..11f4589f00 100644
--- a/editor/plugins/script_editor_plugin.h
+++ b/editor/plugins/script_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -34,6 +34,7 @@
#include "core/script_language.h"
#include "editor/code_editor.h"
#include "editor/editor_help.h"
+#include "editor/editor_help_search.h"
#include "editor/editor_plugin.h"
#include "editor/script_create_dialog.h"
#include "scene/gui/item_list.h"
@@ -155,7 +156,6 @@ class ScriptEditor : public PanelContainer {
DEBUG_SHOW_KEEP_OPEN,
DEBUG_WITH_EXTERNAL_EDITOR,
SEARCH_HELP,
- SEARCH_CLASSES,
SEARCH_WEBSITE,
HELP_SEARCH_FIND,
HELP_SEARCH_FIND_NEXT,
@@ -200,7 +200,6 @@ class ScriptEditor : public PanelContainer {
Button *help_search;
Button *site_search;
- Button *class_search;
EditorHelpSearch *help_search_dialog;
ItemList *script_list;
@@ -254,7 +253,7 @@ class ScriptEditor : public PanelContainer {
Vector<ScriptHistory> history;
int history_pos;
- EditorHelpIndex *help_index;
+ Vector<String> previous_scripts;
void _tab_changed(int p_which);
void _menu_option(int p_option);
diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp
index c3e2aa86f0..60dc156782 100644
--- a/editor/plugins/script_text_editor.cpp
+++ b/editor/plugins/script_text_editor.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -280,6 +280,13 @@ void ScriptTextEditor::_toggle_warning_pannel(const Ref<InputEvent> &p_event) {
}
}
+void ScriptTextEditor::_error_pressed(const Ref<InputEvent> &p_event) {
+ Ref<InputEventMouseButton> mb = p_event;
+ if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
+ code_editor->goto_error();
+ }
+}
+
void ScriptTextEditor::_warning_clicked(Variant p_line) {
if (p_line.get_type() == Variant::INT) {
code_editor->get_text_edit()->cursor_set_line(p_line.operator int64_t());
@@ -443,6 +450,7 @@ void ScriptTextEditor::_validate_script() {
if (!script->get_language()->validate(text, line, col, errortxt, script->get_path(), &fnc, &warnings, &safe_lines)) {
String error_text = "error(" + itos(line) + "," + itos(col) + "): " + errortxt;
code_editor->set_error(error_text);
+ code_editor->set_error_pos(line - 1, col - 1);
} else {
code_editor->set_error("");
line = -1;
@@ -1049,7 +1057,7 @@ void ScriptTextEditor::_edit_option(int p_op) {
if (text == "")
text = tx->get_word_under_cursor();
if (text != "") {
- emit_signal("request_help_search", text);
+ emit_signal("request_help", text);
}
} break;
case LOOKUP_SYMBOL: {
@@ -1075,7 +1083,7 @@ void ScriptTextEditor::set_syntax_highlighter(SyntaxHighlighter *p_highlighter)
if (p_highlighter != NULL)
highlighter_menu->set_item_checked(highlighter_menu->get_item_idx_from_text(p_highlighter->get_name()), true);
else
- highlighter_menu->set_item_checked(highlighter_menu->get_item_idx_from_text("Standard"), true);
+ highlighter_menu->set_item_checked(highlighter_menu->get_item_idx_from_text(TTR("Standard")), true);
}
void ScriptTextEditor::_change_syntax_highlighter(int p_idx) {
@@ -1100,6 +1108,7 @@ void ScriptTextEditor::_bind_methods() {
ClassDB::bind_method("_lookup_symbol", &ScriptTextEditor::_lookup_symbol);
ClassDB::bind_method("_text_edit_gui_input", &ScriptTextEditor::_text_edit_gui_input);
ClassDB::bind_method("_toggle_warning_pannel", &ScriptTextEditor::_toggle_warning_pannel);
+ ClassDB::bind_method("_error_pressed", &ScriptTextEditor::_error_pressed);
ClassDB::bind_method("_warning_clicked", &ScriptTextEditor::_warning_clicked);
ClassDB::bind_method("_color_changed", &ScriptTextEditor::_color_changed);
@@ -1436,6 +1445,7 @@ ScriptTextEditor::ScriptTextEditor() {
warnings_panel->set_focus_mode(FOCUS_CLICK);
warnings_panel->hide();
+ code_editor->get_error_label()->connect("gui_input", this, "_error_pressed");
code_editor->get_warning_label()->connect("gui_input", this, "_toggle_warning_pannel");
code_editor->get_warning_count_label()->connect("gui_input", this, "_toggle_warning_pannel");
warnings_panel->connect("meta_clicked", this, "_warning_clicked");
@@ -1465,6 +1475,7 @@ ScriptTextEditor::ScriptTextEditor() {
edit_menu = memnew(MenuButton);
edit_menu->set_text(TTR("Edit"));
+ edit_menu->set_switch_on_hover(true);
edit_menu->get_popup()->set_hide_on_window_lose_focus(true);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO);
@@ -1508,7 +1519,7 @@ ScriptTextEditor::ScriptTextEditor() {
convert_case->add_shortcut(ED_SHORTCUT("script_text_editor/capitalize", TTR("Capitalize"), KEY_MASK_SHIFT | KEY_F6), EDIT_CAPITALIZE);
convert_case->connect("id_pressed", this, "_edit_option");
- highlighters["Standard"] = NULL;
+ highlighters[TTR("Standard")] = NULL;
highlighter_menu = memnew(PopupMenu);
highlighter_menu->set_name("highlighter_menu");
edit_menu->get_popup()->add_child(highlighter_menu);
@@ -1519,6 +1530,7 @@ ScriptTextEditor::ScriptTextEditor() {
search_menu = memnew(MenuButton);
edit_hb->add_child(search_menu);
search_menu->set_text(TTR("Search"));
+ search_menu->set_switch_on_hover(true);
search_menu->get_popup()->set_hide_on_window_lose_focus(true);
search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find"), SEARCH_FIND);
search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_next"), SEARCH_FIND_NEXT);
diff --git a/editor/plugins/script_text_editor.h b/editor/plugins/script_text_editor.h
index 837201a947..856e442d82 100644
--- a/editor/plugins/script_text_editor.h
+++ b/editor/plugins/script_text_editor.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -126,6 +126,7 @@ protected:
void _load_theme_settings();
void _set_theme_for_script();
void _toggle_warning_pannel(const Ref<InputEvent> &p_event);
+ void _error_pressed(const Ref<InputEvent> &p_event);
void _warning_clicked(Variant p_line);
void _notification(int p_what);
diff --git a/editor/plugins/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp
index 638de1b213..cc2e65cf6d 100644
--- a/editor/plugins/shader_editor_plugin.cpp
+++ b/editor/plugins/shader_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -193,6 +193,7 @@ void ShaderTextEditor::_validate_script() {
if (err != OK) {
String error_text = "error(" + itos(sl.get_error_line()) + "): " + sl.get_error_text();
set_error(error_text);
+ set_error_pos(sl.get_error_line() - 1, 0);
for (int i = 0; i < get_text_edit()->get_line_count(); i++)
get_text_edit()->set_line_as_marked(i, false);
get_text_edit()->set_line_as_marked(sl.get_error_line() - 1, true);
@@ -349,9 +350,9 @@ void ShaderEditor::_menu_option(int p_option) {
void ShaderEditor::_notification(int p_what) {
- if (p_what == NOTIFICATION_ENTER_TREE) {
- }
- if (p_what == NOTIFICATION_DRAW) {
+ if (p_what == NOTIFICATION_VISIBILITY_CHANGED) {
+ if (is_visible_in_tree())
+ shader_editor->get_text_edit()->grab_focus();
}
}
@@ -388,7 +389,6 @@ void ShaderEditor::_bind_methods() {
ClassDB::bind_method("_menu_option", &ShaderEditor::_menu_option);
ClassDB::bind_method("_params_changed", &ShaderEditor::_params_changed);
ClassDB::bind_method("apply_shaders", &ShaderEditor::apply_shaders);
- //ClassDB::bind_method("_close_current_tab",&ShaderEditor::_close_current_tab);
}
void ShaderEditor::ensure_select_current() {
@@ -404,6 +404,11 @@ void ShaderEditor::ensure_select_current() {
}*/
}
+void ShaderEditor::goto_line_selection(int p_line, int p_begin, int p_end) {
+
+ shader_editor->goto_line_selection(p_line, p_begin, p_end);
+}
+
void ShaderEditor::edit(const Ref<Shader> &p_shader) {
if (p_shader.is_null() || !p_shader->is_text_shader())
@@ -526,9 +531,8 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) {
HBoxContainer *hbc = memnew(HBoxContainer);
edit_menu = memnew(MenuButton);
- //edit_menu->set_position(Point2(5, -1));
edit_menu->set_text(TTR("Edit"));
-
+ edit_menu->set_switch_on_hover(true);
edit_menu->get_popup()->set_hide_on_window_lose_focus(true);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO);
@@ -548,12 +552,11 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) {
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/clone_down"), EDIT_CLONE_DOWN);
edit_menu->get_popup()->add_separator();
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/complete_symbol"), EDIT_COMPLETE);
-
edit_menu->get_popup()->connect("id_pressed", this, "_menu_option");
search_menu = memnew(MenuButton);
- //search_menu->set_position(Point2(38, -1));
search_menu->set_text(TTR("Search"));
+ search_menu->set_switch_on_hover(true);
search_menu->get_popup()->set_hide_on_window_lose_focus(true);
search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find"), SEARCH_FIND);
search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_next"), SEARCH_FIND_NEXT);
diff --git a/editor/plugins/shader_editor_plugin.h b/editor/plugins/shader_editor_plugin.h
index 2ea1562310..46c78c1d33 100644
--- a/editor/plugins/shader_editor_plugin.h
+++ b/editor/plugins/shader_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -120,6 +120,8 @@ public:
void ensure_select_current();
void edit(const Ref<Shader> &p_shader);
+ void goto_line_selection(int p_line, int p_begin, int p_end);
+
virtual Size2 get_minimum_size() const { return Size2(0, 200); }
void save_external_data();
@@ -143,6 +145,8 @@ public:
virtual void make_visible(bool p_visible);
virtual void selected_notify();
+ ShaderEditor *get_shader_editor() const { return shader_editor; }
+
virtual void save_external_data();
virtual void apply_changes();
diff --git a/editor/plugins/skeleton_2d_editor_plugin.cpp b/editor/plugins/skeleton_2d_editor_plugin.cpp
index 08bfebefbd..619d54b202 100644
--- a/editor/plugins/skeleton_2d_editor_plugin.cpp
+++ b/editor/plugins/skeleton_2d_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/skeleton_2d_editor_plugin.h b/editor/plugins/skeleton_2d_editor_plugin.h
index 26ab4328b0..d8e2d23257 100644
--- a/editor/plugins/skeleton_2d_editor_plugin.h
+++ b/editor/plugins/skeleton_2d_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/skeleton_editor_plugin.cpp b/editor/plugins/skeleton_editor_plugin.cpp
index 8b0beefb3e..cd360d4caf 100644
--- a/editor/plugins/skeleton_editor_plugin.cpp
+++ b/editor/plugins/skeleton_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/skeleton_editor_plugin.h b/editor/plugins/skeleton_editor_plugin.h
index aac3e06063..33a9128a11 100644
--- a/editor/plugins/skeleton_editor_plugin.h
+++ b/editor/plugins/skeleton_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/skeleton_ik_editor_plugin.cpp b/editor/plugins/skeleton_ik_editor_plugin.cpp
index c605548a6b..928171950a 100644
--- a/editor/plugins/skeleton_ik_editor_plugin.cpp
+++ b/editor/plugins/skeleton_ik_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/skeleton_ik_editor_plugin.h b/editor/plugins/skeleton_ik_editor_plugin.h
index 3e412305c9..d1ef7c99c5 100644
--- a/editor/plugins/skeleton_ik_editor_plugin.h
+++ b/editor/plugins/skeleton_ik_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/spatial_editor_plugin.cpp b/editor/plugins/spatial_editor_plugin.cpp
index 5566a5aea5..276ca2e451 100644
--- a/editor/plugins/spatial_editor_plugin.cpp
+++ b/editor/plugins/spatial_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -3238,7 +3238,7 @@ bool SpatialEditorViewport::_create_instance(Node *parent, String &path, const P
if (mesh != NULL) {
MeshInstance *mesh_instance = memnew(MeshInstance);
mesh_instance->set_mesh(mesh);
- mesh_instance->set_name(mesh->get_name());
+ mesh_instance->set_name(path.get_file().get_basename());
instanced_scene = mesh_instance;
} else {
if (!scene.is_valid()) { // invalid scene
@@ -4204,10 +4204,10 @@ void SpatialEditor::set_state(const Dictionary &p_state) {
gizmo_plugins.write[j]->set_state(state);
switch (state) {
- case EditorSpatialGizmoPlugin::ON_TOP:
+ case EditorSpatialGizmoPlugin::VISIBLE:
gizmos_menu->set_item_icon(idx, gizmos_menu->get_icon("visibility_visible"));
break;
- case EditorSpatialGizmoPlugin::VISIBLE:
+ case EditorSpatialGizmoPlugin::ON_TOP:
gizmos_menu->set_item_icon(idx, gizmos_menu->get_icon("visibility_xray"));
break;
case EditorSpatialGizmoPlugin::HIDDEN:
@@ -4317,10 +4317,10 @@ void SpatialEditor::_menu_gizmo_toggled(int p_option) {
// Change icon
const int state = gizmos_menu->get_item_state(idx);
switch (state) {
- case EditorSpatialGizmoPlugin::ON_TOP:
+ case EditorSpatialGizmoPlugin::VISIBLE:
gizmos_menu->set_item_icon(idx, view_menu->get_popup()->get_icon("visibility_visible"));
break;
- case EditorSpatialGizmoPlugin::VISIBLE:
+ case EditorSpatialGizmoPlugin::ON_TOP:
gizmos_menu->set_item_icon(idx, view_menu->get_popup()->get_icon("visibility_xray"));
break;
case EditorSpatialGizmoPlugin::HIDDEN:
@@ -4831,15 +4831,15 @@ struct _GizmoPluginComparator {
}
};
-void SpatialEditor::_init_gizmos_menu() {
- _register_all_gizmos();
+void SpatialEditor::_update_gizmos_menu() {
+ gizmos_menu->clear();
gizmo_plugins.sort_custom<_GizmoPluginComparator>();
for (int i = 0; i < gizmo_plugins.size(); ++i) {
if (!gizmo_plugins[i]->can_be_hidden()) continue;
String plugin_name = gizmo_plugins[i]->get_name();
- gizmos_menu->add_multistate_item(TTR(plugin_name), 3, EditorSpatialGizmoPlugin::ON_TOP, i);
+ gizmos_menu->add_multistate_item(TTR(plugin_name), 3, EditorSpatialGizmoPlugin::VISIBLE, i);
gizmos_menu->set_item_icon(gizmos_menu->get_item_index(i), gizmos_menu->get_icon("visibility_visible"));
}
}
@@ -5137,7 +5137,8 @@ void SpatialEditor::_notification(int p_what) {
if (p_what == NOTIFICATION_ENTER_TREE) {
- _init_gizmos_menu();
+ _register_all_gizmos();
+ _update_gizmos_menu();
_init_indicators();
}
@@ -5273,27 +5274,27 @@ void SpatialEditor::_node_removed(Node *p_node) {
}
void SpatialEditor::_register_all_gizmos() {
- register_gizmo_plugin(Ref<CameraSpatialGizmoPlugin>(memnew(CameraSpatialGizmoPlugin)));
- register_gizmo_plugin(Ref<LightSpatialGizmoPlugin>(memnew(LightSpatialGizmoPlugin)));
- register_gizmo_plugin(Ref<AudioStreamPlayer3DSpatialGizmoPlugin>(memnew(AudioStreamPlayer3DSpatialGizmoPlugin)));
- register_gizmo_plugin(Ref<MeshInstanceSpatialGizmoPlugin>(memnew(MeshInstanceSpatialGizmoPlugin)));
- register_gizmo_plugin(Ref<SoftBodySpatialGizmoPlugin>(memnew(SoftBodySpatialGizmoPlugin)));
- register_gizmo_plugin(Ref<Sprite3DSpatialGizmoPlugin>(memnew(Sprite3DSpatialGizmoPlugin)));
- register_gizmo_plugin(Ref<SkeletonSpatialGizmoPlugin>(memnew(SkeletonSpatialGizmoPlugin)));
- register_gizmo_plugin(Ref<Position3DSpatialGizmoPlugin>(memnew(Position3DSpatialGizmoPlugin)));
- register_gizmo_plugin(Ref<RayCastSpatialGizmoPlugin>(memnew(RayCastSpatialGizmoPlugin)));
- register_gizmo_plugin(Ref<SpringArmSpatialGizmoPlugin>(memnew(SpringArmSpatialGizmoPlugin)));
- register_gizmo_plugin(Ref<VehicleWheelSpatialGizmoPlugin>(memnew(VehicleWheelSpatialGizmoPlugin)));
- register_gizmo_plugin(Ref<VisibilityNotifierGizmoPlugin>(memnew(VisibilityNotifierGizmoPlugin)));
- register_gizmo_plugin(Ref<ParticlesGizmoPlugin>(memnew(ParticlesGizmoPlugin)));
- register_gizmo_plugin(Ref<ReflectionProbeGizmoPlugin>(memnew(ReflectionProbeGizmoPlugin)));
- register_gizmo_plugin(Ref<GIProbeGizmoPlugin>(memnew(GIProbeGizmoPlugin)));
- register_gizmo_plugin(Ref<BakedIndirectLightGizmoPlugin>(memnew(BakedIndirectLightGizmoPlugin)));
- register_gizmo_plugin(Ref<CollisionShapeSpatialGizmoPlugin>(memnew(CollisionShapeSpatialGizmoPlugin)));
- register_gizmo_plugin(Ref<CollisionPolygonSpatialGizmoPlugin>(memnew(CollisionPolygonSpatialGizmoPlugin)));
- register_gizmo_plugin(Ref<NavigationMeshSpatialGizmoPlugin>(memnew(NavigationMeshSpatialGizmoPlugin)));
- register_gizmo_plugin(Ref<JointSpatialGizmoPlugin>(memnew(JointSpatialGizmoPlugin)));
- register_gizmo_plugin(Ref<PhysicalBoneSpatialGizmoPlugin>(memnew(PhysicalBoneSpatialGizmoPlugin)));
+ add_gizmo_plugin(Ref<CameraSpatialGizmoPlugin>(memnew(CameraSpatialGizmoPlugin)));
+ add_gizmo_plugin(Ref<LightSpatialGizmoPlugin>(memnew(LightSpatialGizmoPlugin)));
+ add_gizmo_plugin(Ref<AudioStreamPlayer3DSpatialGizmoPlugin>(memnew(AudioStreamPlayer3DSpatialGizmoPlugin)));
+ add_gizmo_plugin(Ref<MeshInstanceSpatialGizmoPlugin>(memnew(MeshInstanceSpatialGizmoPlugin)));
+ add_gizmo_plugin(Ref<SoftBodySpatialGizmoPlugin>(memnew(SoftBodySpatialGizmoPlugin)));
+ add_gizmo_plugin(Ref<Sprite3DSpatialGizmoPlugin>(memnew(Sprite3DSpatialGizmoPlugin)));
+ add_gizmo_plugin(Ref<SkeletonSpatialGizmoPlugin>(memnew(SkeletonSpatialGizmoPlugin)));
+ add_gizmo_plugin(Ref<Position3DSpatialGizmoPlugin>(memnew(Position3DSpatialGizmoPlugin)));
+ add_gizmo_plugin(Ref<RayCastSpatialGizmoPlugin>(memnew(RayCastSpatialGizmoPlugin)));
+ add_gizmo_plugin(Ref<SpringArmSpatialGizmoPlugin>(memnew(SpringArmSpatialGizmoPlugin)));
+ add_gizmo_plugin(Ref<VehicleWheelSpatialGizmoPlugin>(memnew(VehicleWheelSpatialGizmoPlugin)));
+ add_gizmo_plugin(Ref<VisibilityNotifierGizmoPlugin>(memnew(VisibilityNotifierGizmoPlugin)));
+ add_gizmo_plugin(Ref<ParticlesGizmoPlugin>(memnew(ParticlesGizmoPlugin)));
+ add_gizmo_plugin(Ref<ReflectionProbeGizmoPlugin>(memnew(ReflectionProbeGizmoPlugin)));
+ add_gizmo_plugin(Ref<GIProbeGizmoPlugin>(memnew(GIProbeGizmoPlugin)));
+ add_gizmo_plugin(Ref<BakedIndirectLightGizmoPlugin>(memnew(BakedIndirectLightGizmoPlugin)));
+ add_gizmo_plugin(Ref<CollisionShapeSpatialGizmoPlugin>(memnew(CollisionShapeSpatialGizmoPlugin)));
+ add_gizmo_plugin(Ref<CollisionPolygonSpatialGizmoPlugin>(memnew(CollisionPolygonSpatialGizmoPlugin)));
+ add_gizmo_plugin(Ref<NavigationMeshSpatialGizmoPlugin>(memnew(NavigationMeshSpatialGizmoPlugin)));
+ add_gizmo_plugin(Ref<JointSpatialGizmoPlugin>(memnew(JointSpatialGizmoPlugin)));
+ add_gizmo_plugin(Ref<PhysicalBoneSpatialGizmoPlugin>(memnew(PhysicalBoneSpatialGizmoPlugin)));
}
void SpatialEditor::_bind_methods() {
@@ -5475,6 +5476,7 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) {
transform_menu = memnew(MenuButton);
transform_menu->set_text(TTR("Transform"));
+ transform_menu->set_switch_on_hover(true);
hbc_menu->add_child(transform_menu);
p = transform_menu->get_popup();
@@ -5487,6 +5489,7 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) {
view_menu = memnew(MenuButton);
view_menu->set_text(TTR("View"));
+ view_menu->set_switch_on_hover(true);
hbc_menu->add_child(view_menu);
p = view_menu->get_popup();
@@ -5728,8 +5731,15 @@ void SpatialEditorPlugin::snap_cursor_to_plane(const Plane &p_plane) {
spatial_editor->snap_cursor_to_plane(p_plane);
}
-void SpatialEditor::register_gizmo_plugin(Ref<EditorSpatialGizmoPlugin> ref) {
- gizmo_plugins.push_back(ref);
+void SpatialEditor::add_gizmo_plugin(Ref<EditorSpatialGizmoPlugin> p_plugin) {
+ gizmo_plugins.push_back(p_plugin);
+ _update_gizmos_menu();
+ SpatialEditor::get_singleton()->update_all_gizmos();
+}
+
+void SpatialEditor::remove_gizmo_plugin(Ref<EditorSpatialGizmoPlugin> p_plugin) {
+ gizmo_plugins.erase(p_plugin);
+ _update_gizmos_menu();
}
SpatialEditorPlugin::SpatialEditorPlugin(EditorNode *p_node) {
@@ -5855,11 +5865,11 @@ void EditorSpatialGizmoPlugin::add_material(const String &p_name, Ref<SpatialMat
materials[p_name].push_back(p_material);
}
-Ref<SpatialMaterial> EditorSpatialGizmoPlugin::get_material(const String &p_name, EditorSpatialGizmo *p_gizmo) {
+Ref<SpatialMaterial> EditorSpatialGizmoPlugin::get_material(const String &p_name, const Ref<EditorSpatialGizmo> &p_gizmo) {
ERR_FAIL_COND_V(!materials.has(p_name), Ref<SpatialMaterial>());
ERR_FAIL_COND_V(materials[p_name].size() == 0, Ref<SpatialMaterial>());
- if (p_gizmo == NULL) return materials[p_name][0];
+ if (p_gizmo.is_null()) return materials[p_name][0];
int index = (p_gizmo->is_selected() ? 1 : 0) + (p_gizmo->is_editable() ? 2 : 0);
@@ -5874,8 +5884,19 @@ Ref<SpatialMaterial> EditorSpatialGizmoPlugin::get_material(const String &p_name
return mat;
}
+String EditorSpatialGizmoPlugin::get_name() const {
+ if (get_script_instance() && get_script_instance()->has_method("get_name")) {
+ return get_script_instance()->call("get_name");
+ }
+ return TTR("Name-less gizmo");
+}
+
Ref<EditorSpatialGizmo> EditorSpatialGizmoPlugin::get_gizmo(Spatial *p_spatial) {
+ if (get_script_instance() && get_script_instance()->has_method("get_gizmo")) {
+ return get_script_instance()->call("get_gizmo", p_spatial);
+ }
+
Ref<EditorSpatialGizmo> ref = create_gizmo(p_spatial);
if (ref.is_null()) return ref;
@@ -5888,22 +5909,109 @@ Ref<EditorSpatialGizmo> EditorSpatialGizmoPlugin::get_gizmo(Spatial *p_spatial)
return ref;
}
+void EditorSpatialGizmoPlugin::_bind_methods() {
+#define GIZMO_REF PropertyInfo(Variant::OBJECT, "gizmo", PROPERTY_HINT_RESOURCE_TYPE, "EditorSpatialGizmo")
+
+ BIND_VMETHOD(MethodInfo(Variant::BOOL, "has_gizmo", PropertyInfo(Variant::OBJECT, "spatial", PROPERTY_HINT_RESOURCE_TYPE, "Spatial")));
+ BIND_VMETHOD(MethodInfo(GIZMO_REF, "create_gizmo", PropertyInfo(Variant::OBJECT, "spatial", PROPERTY_HINT_RESOURCE_TYPE, "Spatial")));
+
+ ClassDB::bind_method(D_METHOD("create_material", "name", "color", "billboard", "on_top", "use_vertex_color"), &EditorSpatialGizmoPlugin::create_material, DEFVAL(false), DEFVAL(false), DEFVAL(false));
+ ClassDB::bind_method(D_METHOD("create_icon_material", "name", "texture", "on_top", "color"), &EditorSpatialGizmoPlugin::create_icon_material, DEFVAL(false), DEFVAL(Color(1, 1, 1, 1)));
+ ClassDB::bind_method(D_METHOD("create_handle_material", "name", "billboard"), &EditorSpatialGizmoPlugin::create_handle_material, DEFVAL(false));
+ ClassDB::bind_method(D_METHOD("add_material", "name", "material"), &EditorSpatialGizmoPlugin::add_material);
+
+ ClassDB::bind_method(D_METHOD("get_material", "name", "gizmo"), &EditorSpatialGizmoPlugin::get_material); //, DEFVAL(Ref<EditorSpatialGizmo>()));
+
+ BIND_VMETHOD(MethodInfo(Variant::STRING, "get_name"));
+ BIND_VMETHOD(MethodInfo(Variant::BOOL, "can_be_hidden"));
+ BIND_VMETHOD(MethodInfo(Variant::BOOL, "is_selectable_when_hidden"));
+
+ BIND_VMETHOD(MethodInfo("redraw", GIZMO_REF));
+ BIND_VMETHOD(MethodInfo(Variant::STRING, "get_handle_name", GIZMO_REF, PropertyInfo(Variant::INT, "index")));
+
+ MethodInfo hvget(Variant::NIL, "get_handle_value", GIZMO_REF, PropertyInfo(Variant::INT, "index"));
+ hvget.return_val.usage |= PROPERTY_USAGE_NIL_IS_VARIANT;
+ BIND_VMETHOD(hvget);
+
+ BIND_VMETHOD(MethodInfo("set_handle", GIZMO_REF, PropertyInfo(Variant::INT, "index"), PropertyInfo(Variant::OBJECT, "camera", PROPERTY_HINT_RESOURCE_TYPE, "Camera"), PropertyInfo(Variant::VECTOR2, "point")));
+ MethodInfo cm = MethodInfo("commit_handle", GIZMO_REF, PropertyInfo(Variant::INT, "index"), PropertyInfo(Variant::NIL, "restore"), PropertyInfo(Variant::BOOL, "cancel"));
+ cm.default_arguments.push_back(false);
+ BIND_VMETHOD(cm);
+
+ BIND_VMETHOD(MethodInfo(Variant::BOOL, "is_gizmo_handle_highlighted", GIZMO_REF, PropertyInfo(Variant::INT, "index")));
+
+#undef GIZMO_REF
+}
+
bool EditorSpatialGizmoPlugin::has_gizmo(Spatial *p_spatial) {
+ if (get_script_instance() && get_script_instance()->has_method("has_gizmo")) {
+ return get_script_instance()->call("has_gizmo", p_spatial);
+ }
return false;
}
Ref<EditorSpatialGizmo> EditorSpatialGizmoPlugin::create_gizmo(Spatial *p_spatial) {
+ if (get_script_instance() && get_script_instance()->has_method("create_gizmo")) {
+ return get_script_instance()->call("create_gizmo", p_spatial);
+ }
+
Ref<EditorSpatialGizmo> ref;
if (has_gizmo(p_spatial)) ref.instance();
return ref;
}
bool EditorSpatialGizmoPlugin::can_be_hidden() const {
+ if (get_script_instance() && get_script_instance()->has_method("can_be_hidden")) {
+ return get_script_instance()->call("can_be_hidden");
+ }
return true;
}
bool EditorSpatialGizmoPlugin::is_selectable_when_hidden() const {
+ if (get_script_instance() && get_script_instance()->has_method("is_selectable_when_hidden")) {
+ return get_script_instance()->call("is_selectable_when_hidden");
+ }
+ return false;
+}
+
+void EditorSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
+ if (get_script_instance() && get_script_instance()->has_method("redraw")) {
+ Ref<EditorSpatialGizmo> ref(p_gizmo);
+ get_script_instance()->call("redraw", ref);
+ }
+}
+
+String EditorSpatialGizmoPlugin::get_handle_name(const EditorSpatialGizmo *p_gizmo, int p_idx) const {
+ if (get_script_instance() && get_script_instance()->has_method("get_handle_name")) {
+ return get_script_instance()->call("get_handle_name", p_gizmo, p_idx);
+ }
+ return "";
+}
+
+Variant EditorSpatialGizmoPlugin::get_handle_value(EditorSpatialGizmo *p_gizmo, int p_idx) const {
+ if (get_script_instance() && get_script_instance()->has_method("get_handle_value")) {
+ return get_script_instance()->call("get_handle_value", p_gizmo, p_idx);
+ }
+ return Variant();
+}
+
+void EditorSpatialGizmoPlugin::set_handle(EditorSpatialGizmo *p_gizmo, int p_idx, Camera *p_camera, const Point2 &p_point) {
+ if (get_script_instance() && get_script_instance()->has_method("set_handle")) {
+ get_script_instance()->call("set_handle", p_gizmo, p_idx, p_camera, p_point);
+ }
+}
+
+void EditorSpatialGizmoPlugin::commit_handle(EditorSpatialGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel) {
+ if (get_script_instance() && get_script_instance()->has_method("commit_handle")) {
+ get_script_instance()->call("commit_handle", p_gizmo, p_idx, p_restore, p_cancel);
+ }
+}
+
+bool EditorSpatialGizmoPlugin::is_gizmo_handle_highlighted(const EditorSpatialGizmo *p_gizmo, int p_idx) const {
+ if (get_script_instance() && get_script_instance()->has_method("is_gizmo_handle_highlighted")) {
+ return get_script_instance()->call("is_gizmo_handle_highlighted", p_gizmo, p_idx);
+ }
return false;
}
@@ -5919,8 +6027,13 @@ void EditorSpatialGizmoPlugin::unregister_gizmo(EditorSpatialGizmo *p_gizmo) {
}
EditorSpatialGizmoPlugin::EditorSpatialGizmoPlugin() {
- current_state = ON_TOP;
+ current_state = VISIBLE;
}
EditorSpatialGizmoPlugin::~EditorSpatialGizmoPlugin() {
+ for (int i = 0; i < current_gizmos.size(); ++i) {
+ current_gizmos[i]->set_plugin(NULL);
+ current_gizmos[i]->get_spatial_node()->set_gizmo(NULL);
+ }
+ SpatialEditor::get_singleton()->update_all_gizmos();
}
diff --git a/editor/plugins/spatial_editor_plugin.h b/editor/plugins/spatial_editor_plugin.h
index 3cce76cc17..87cd089428 100644
--- a/editor/plugins/spatial_editor_plugin.h
+++ b/editor/plugins/spatial_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -615,7 +615,7 @@ private:
void _instance_scene();
void _init_indicators();
- void _init_gizmos_menu();
+ void _update_gizmos_menu();
void _init_grid();
void _finish_indicators();
void _finish_grid();
@@ -710,7 +710,8 @@ public:
return viewports[p_idx];
}
- void register_gizmo_plugin(Ref<EditorSpatialGizmoPlugin> ref);
+ void add_gizmo_plugin(Ref<EditorSpatialGizmoPlugin> p_plugin);
+ void remove_gizmo_plugin(Ref<EditorSpatialGizmoPlugin> p_plugin);
void edit(Spatial *p_spatial);
void clear();
@@ -754,9 +755,9 @@ class EditorSpatialGizmoPlugin : public Resource {
GDCLASS(EditorSpatialGizmoPlugin, Resource);
public:
- static const int ON_TOP = 0;
- static const int VISIBLE = 1;
- static const int HIDDEN = 2;
+ static const int VISIBLE = 0;
+ static const int HIDDEN = 1;
+ static const int ON_TOP = 2;
private:
int current_state;
@@ -764,6 +765,7 @@ private:
HashMap<String, Vector<Ref<SpatialMaterial> > > materials;
protected:
+ static void _bind_methods();
virtual bool has_gizmo(Spatial *p_spatial);
virtual Ref<EditorSpatialGizmo> create_gizmo(Spatial *p_spatial);
@@ -773,18 +775,18 @@ public:
void create_handle_material(const String &p_name, bool p_billboard = false);
void add_material(const String &p_name, Ref<SpatialMaterial> p_material);
- Ref<SpatialMaterial> get_material(const String &p_name, EditorSpatialGizmo *p_gizmo = NULL);
+ Ref<SpatialMaterial> get_material(const String &p_name, const Ref<EditorSpatialGizmo> &p_gizmo = Ref<EditorSpatialGizmo>());
- virtual String get_name() const = 0;
+ virtual String get_name() const;
virtual bool can_be_hidden() const;
virtual bool is_selectable_when_hidden() const;
- virtual void redraw(EditorSpatialGizmo *p_gizmo) {}
- virtual String get_handle_name(const EditorSpatialGizmo *p_gizmo, int p_idx) const { return ""; }
- virtual Variant get_handle_value(EditorSpatialGizmo *p_gizmo, int p_idx) const { return Variant(); }
- virtual void set_handle(EditorSpatialGizmo *p_gizmo, int p_idx, Camera *p_camera, const Point2 &p_point) {}
- virtual void commit_handle(EditorSpatialGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false) {}
- virtual bool is_gizmo_handle_highlighted(const EditorSpatialGizmo *p_gizmo, int idx) const { return false; }
+ virtual void redraw(EditorSpatialGizmo *p_gizmo);
+ virtual String get_handle_name(const EditorSpatialGizmo *p_gizmo, int p_idx) const;
+ virtual Variant get_handle_value(EditorSpatialGizmo *p_gizmo, int p_idx) const;
+ virtual void set_handle(EditorSpatialGizmo *p_gizmo, int p_idx, Camera *p_camera, const Point2 &p_point);
+ virtual void commit_handle(EditorSpatialGizmo *p_gizmo, int p_idx, const Variant &p_restore, bool p_cancel = false);
+ virtual bool is_gizmo_handle_highlighted(const EditorSpatialGizmo *p_gizmo, int p_idx) const;
Ref<EditorSpatialGizmo> get_gizmo(Spatial *p_spatial);
void set_state(int p_state);
diff --git a/editor/plugins/sprite_editor_plugin.cpp b/editor/plugins/sprite_editor_plugin.cpp
index c574b5e8ba..c1718dd8bf 100644
--- a/editor/plugins/sprite_editor_plugin.cpp
+++ b/editor/plugins/sprite_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/sprite_editor_plugin.h b/editor/plugins/sprite_editor_plugin.h
index 238227e4a0..7250e3df59 100644
--- a/editor/plugins/sprite_editor_plugin.h
+++ b/editor/plugins/sprite_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/sprite_frames_editor_plugin.cpp b/editor/plugins/sprite_frames_editor_plugin.cpp
index 40781908fd..b712cfc9d3 100644
--- a/editor/plugins/sprite_frames_editor_plugin.cpp
+++ b/editor/plugins/sprite_frames_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -598,7 +598,7 @@ bool SpriteFramesEditor::can_drop_data_fw(const Point2 &p_point, const Variant &
return false;
for (int i = 0; i < files.size(); i++) {
- String file = files[0];
+ String file = files[i];
String ftype = EditorFileSystem::get_singleton()->get_file_type(file);
if (!ClassDB::is_parent_class(ftype, "Texture")) {
diff --git a/editor/plugins/sprite_frames_editor_plugin.h b/editor/plugins/sprite_frames_editor_plugin.h
index 1f45b10323..3ef4ba290b 100644
--- a/editor/plugins/sprite_frames_editor_plugin.h
+++ b/editor/plugins/sprite_frames_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/style_box_editor_plugin.cpp b/editor/plugins/style_box_editor_plugin.cpp
index f6d98cb4c7..defc0a40ea 100644
--- a/editor/plugins/style_box_editor_plugin.cpp
+++ b/editor/plugins/style_box_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/style_box_editor_plugin.h b/editor/plugins/style_box_editor_plugin.h
index 6b0d7e57a8..95d21b2c44 100644
--- a/editor/plugins/style_box_editor_plugin.h
+++ b/editor/plugins/style_box_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/text_editor.cpp b/editor/plugins/text_editor.cpp
index 4a8eae1ba4..fe32c97a64 100644
--- a/editor/plugins/text_editor.cpp
+++ b/editor/plugins/text_editor.cpp
@@ -1,12 +1,12 @@
/*************************************************************************/
-/* text_editor.cpp */
+/* text_editor.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/text_editor.h b/editor/plugins/text_editor.h
index 8b1983d891..3c136277df 100644
--- a/editor/plugins/text_editor.h
+++ b/editor/plugins/text_editor.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/texture_editor_plugin.cpp b/editor/plugins/texture_editor_plugin.cpp
index 140d37fdb5..0482ae86f3 100644
--- a/editor/plugins/texture_editor_plugin.cpp
+++ b/editor/plugins/texture_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/texture_editor_plugin.h b/editor/plugins/texture_editor_plugin.h
index 4ca2bc641e..80ff4d6416 100644
--- a/editor/plugins/texture_editor_plugin.h
+++ b/editor/plugins/texture_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/texture_region_editor_plugin.cpp b/editor/plugins/texture_region_editor_plugin.cpp
index 7c3e524d89..6bd0309d17 100644
--- a/editor/plugins/texture_region_editor_plugin.cpp
+++ b/editor/plugins/texture_region_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -169,15 +169,24 @@ void TextureRegionEditor::_region_draw() {
updating_scroll = true;
hscroll->set_min(scroll_rect.position.x);
hscroll->set_max(scroll_rect.position.x + scroll_rect.size.x);
- hscroll->set_page(edit_draw->get_size().x);
- hscroll->set_value(draw_ofs.x);
- hscroll->set_step(0.001);
+ if (ABS(scroll_rect.position.x - (scroll_rect.position.x + scroll_rect.size.x)) <= edit_draw->get_size().x) {
+ hscroll->hide();
+ } else {
+ hscroll->show();
+ hscroll->set_page(edit_draw->get_size().x);
+ hscroll->set_value(draw_ofs.x);
+ }
vscroll->set_min(scroll_rect.position.y);
vscroll->set_max(scroll_rect.position.y + scroll_rect.size.y);
- vscroll->set_page(edit_draw->get_size().y);
- vscroll->set_value(draw_ofs.y);
- vscroll->set_step(0.001);
+ if (ABS(scroll_rect.position.y - (scroll_rect.position.y + scroll_rect.size.y)) <= edit_draw->get_size().y) {
+ vscroll->hide();
+ draw_ofs.y = scroll_rect.position.y;
+ } else {
+ vscroll->show();
+ vscroll->set_page(edit_draw->get_size().y);
+ vscroll->set_value(draw_ofs.y);
+ }
updating_scroll = false;
float margins[4];
@@ -299,6 +308,8 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) {
undo_redo->add_do_method(atlas_tex.ptr(), "set_region", rect);
undo_redo->add_undo_method(atlas_tex.ptr(), "set_region", atlas_tex->get_region());
}
+ undo_redo->add_do_method(this, "_update_rect");
+ undo_redo->add_undo_method(this, "_update_rect");
undo_redo->add_do_method(edit_draw, "update");
undo_redo->add_undo_method(edit_draw, "update");
undo_redo->commit_action();
@@ -336,7 +347,7 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) {
} else if (drag) {
if (edited_margin >= 0) {
- undo_redo->create_action("Set Margin");
+ undo_redo->create_action(TTR("Set Margin"));
static Margin m[4] = { MARGIN_TOP, MARGIN_BOTTOM, MARGIN_LEFT, MARGIN_RIGHT };
if (node_ninepatch) {
undo_redo->add_do_method(node_ninepatch, "set_patch_margin", m[edited_margin], node_ninepatch->get_patch_margin(m[edited_margin]));
@@ -348,7 +359,7 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) {
}
edited_margin = -1;
} else {
- undo_redo->create_action("Set Region Rect");
+ undo_redo->create_action(TTR("Set Region Rect"));
if (node_sprite) {
undo_redo->add_do_method(node_sprite, "set_region_rect", node_sprite->get_region_rect());
undo_redo->add_undo_method(node_sprite, "set_region_rect", rect_prev);
@@ -364,6 +375,8 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) {
}
drag_index = -1;
}
+ undo_redo->add_do_method(this, "_update_rect");
+ undo_redo->add_undo_method(this, "_update_rect");
undo_redo->add_do_method(edit_draw, "update");
undo_redo->add_undo_method(edit_draw, "update");
undo_redo->commit_action();
@@ -509,10 +522,7 @@ void TextureRegionEditor::_scroll_changed(float) {
}
void TextureRegionEditor::_set_snap_mode(int p_mode) {
- snap_mode_button->get_popup()->set_item_checked(snap_mode, false);
snap_mode = p_mode;
- snap_mode_button->set_text(snap_mode_button->get_popup()->get_item_text(p_mode));
- snap_mode_button->get_popup()->set_item_checked(snap_mode, true);
if (snap_mode == SNAP_GRID)
hb_grid->show();
@@ -577,15 +587,26 @@ void TextureRegionEditor::_zoom_out() {
}
}
-void TextureRegionEditor::apply_rect(const Rect2 &rect) {
+void TextureRegionEditor::apply_rect(const Rect2 &p_rect) {
+ if (node_sprite)
+ node_sprite->set_region_rect(p_rect);
+ else if (node_ninepatch)
+ node_ninepatch->set_region_rect(p_rect);
+ else if (obj_styleBox.is_valid())
+ obj_styleBox->set_region_rect(p_rect);
+ else if (atlas_tex.is_valid())
+ atlas_tex->set_region(p_rect);
+}
+
+void TextureRegionEditor::_update_rect() {
if (node_sprite)
- node_sprite->set_region_rect(rect);
+ rect = node_sprite->get_region_rect();
else if (node_ninepatch)
- node_ninepatch->set_region_rect(rect);
+ rect = node_ninepatch->get_region_rect();
else if (obj_styleBox.is_valid())
- obj_styleBox->set_region_rect(rect);
+ rect = obj_styleBox->get_region_rect();
else if (atlas_tex.is_valid())
- atlas_tex->set_region(rect);
+ rect = atlas_tex->get_region();
}
void TextureRegionEditor::_update_autoslice() {
@@ -657,6 +678,10 @@ void TextureRegionEditor::_update_autoslice() {
void TextureRegionEditor::_notification(int p_what) {
switch (p_what) {
+ case NOTIFICATION_ENTER_TREE:
+ case NOTIFICATION_THEME_CHANGED: {
+ edit_draw->add_style_override("panel", get_stylebox("bg", "Tree"));
+ } break;
case NOTIFICATION_READY: {
zoom_out->set_icon(get_icon("ZoomLess", "EditorIcons"));
zoom_reset->set_icon(get_icon("ZoomReset", "EditorIcons"));
@@ -669,7 +694,7 @@ void TextureRegionEditor::_notification(int p_what) {
} break;
case MainLoop::NOTIFICATION_WM_FOCUS_IN: {
// This happens when the user leaves the Editor and returns,
- // he/she could have changed the textures, so the cache is cleared
+ // they could have changed the textures, so the cache is cleared.
cache_map.clear();
_edit_region();
} break;
@@ -702,6 +727,7 @@ void TextureRegionEditor::_bind_methods() {
ClassDB::bind_method(D_METHOD("_zoom_in"), &TextureRegionEditor::_zoom_in);
ClassDB::bind_method(D_METHOD("_zoom_reset"), &TextureRegionEditor::_zoom_reset);
ClassDB::bind_method(D_METHOD("_zoom_out"), &TextureRegionEditor::_zoom_out);
+ ClassDB::bind_method(D_METHOD("_update_rect"), &TextureRegionEditor::_update_rect);
}
bool TextureRegionEditor::is_stylebox() {
@@ -774,6 +800,9 @@ void TextureRegionEditor::_edit_region() {
texture = atlas_tex->get_atlas();
if (texture.is_null()) {
+ _zoom_reset();
+ hscroll->hide();
+ vscroll->hide();
edit_draw->update();
return;
}
@@ -790,15 +819,7 @@ void TextureRegionEditor::_edit_region() {
}
}
- if (node_sprite)
- rect = node_sprite->get_region_rect();
- else if (node_ninepatch)
- rect = node_ninepatch->get_region_rect();
- else if (obj_styleBox.is_valid())
- rect = obj_styleBox->get_region_rect();
- else if (atlas_tex.is_valid())
- rect = atlas_tex->get_region();
-
+ _update_rect();
edit_draw->update();
}
@@ -826,30 +847,23 @@ TextureRegionEditor::TextureRegionEditor(EditorNode *p_editor) {
drag_index = -1;
drag = false;
- VBoxContainer *main_vb = memnew(VBoxContainer);
- add_child(main_vb);
- main_vb->set_anchors_and_margins_preset(Control::PRESET_WIDE);
HBoxContainer *hb_tools = memnew(HBoxContainer);
- main_vb->add_child(hb_tools);
-
+ add_child(hb_tools);
hb_tools->add_child(memnew(Label(TTR("Snap Mode:"))));
- snap_mode_button = memnew(MenuButton);
+ snap_mode_button = memnew(OptionButton);
hb_tools->add_child(snap_mode_button);
- snap_mode_button->set_text(TTR("<None>"));
- PopupMenu *p = snap_mode_button->get_popup();
- p->set_hide_on_checkable_item_selection(false);
- p->add_radio_check_item(TTR("<None>"), 0);
- p->add_radio_check_item(TTR("Pixel Snap"), 1);
- p->add_radio_check_item(TTR("Grid Snap"), 2);
- p->add_radio_check_item(TTR("Auto Slice"), 3);
- p->set_item_checked(0, true);
- p->connect("id_pressed", this, "_set_snap_mode");
+ snap_mode_button->add_item(TTR("None"), 0);
+ snap_mode_button->add_item(TTR("Pixel Snap"), 1);
+ snap_mode_button->add_item(TTR("Grid Snap"), 2);
+ snap_mode_button->add_item(TTR("Auto Slice"), 3);
+ snap_mode_button->select(0);
+ snap_mode_button->connect("item_selected", this, "_set_snap_mode");
+
hb_grid = memnew(HBoxContainer);
- //hb_tools->add_child(hb_grid);
- main_vb->add_child(hb_grid);
- hb_grid->add_child(memnew(VSeparator));
+ hb_tools->add_child(hb_grid);
+ hb_grid->add_child(memnew(VSeparator));
hb_grid->add_child(memnew(Label(TTR("Offset:"))));
sb_off_x = memnew(SpinBox);
@@ -914,42 +928,47 @@ TextureRegionEditor::TextureRegionEditor(EditorNode *p_editor) {
hb_grid->hide();
- HBoxContainer *main_hb = memnew(HBoxContainer);
- main_vb->add_child(main_hb);
- edit_draw = memnew(Control);
- main_hb->add_child(edit_draw);
- main_hb->set_v_size_flags(SIZE_EXPAND_FILL);
- edit_draw->set_h_size_flags(SIZE_EXPAND_FILL);
+ edit_draw = memnew(Panel);
+ add_child(edit_draw);
+ edit_draw->set_v_size_flags(SIZE_EXPAND_FILL);
+ edit_draw->connect("draw", this, "_region_draw");
+ edit_draw->connect("gui_input", this, "_region_input");
+
+ draw_zoom = 1.0;
+ edit_draw->set_clip_contents(true);
- Control *separator = memnew(Control);
- separator->set_h_size_flags(Control::SIZE_EXPAND_FILL);
- hb_tools->add_child(separator);
+ HBoxContainer *zoom_hb = memnew(HBoxContainer);
+ edit_draw->add_child(zoom_hb);
+ zoom_hb->set_begin(Point2(5, 5));
zoom_out = memnew(ToolButton);
+ zoom_out->set_tooltip(TTR("Zoom Out"));
zoom_out->connect("pressed", this, "_zoom_out");
- hb_tools->add_child(zoom_out);
+ zoom_hb->add_child(zoom_out);
zoom_reset = memnew(ToolButton);
+ zoom_out->set_tooltip(TTR("Zoom Reset"));
zoom_reset->connect("pressed", this, "_zoom_reset");
- hb_tools->add_child(zoom_reset);
+ zoom_hb->add_child(zoom_reset);
zoom_in = memnew(ToolButton);
+ zoom_out->set_tooltip(TTR("Zoom In"));
zoom_in->connect("pressed", this, "_zoom_in");
- hb_tools->add_child(zoom_in);
+ zoom_hb->add_child(zoom_in);
vscroll = memnew(VScrollBar);
- main_hb->add_child(vscroll);
+ vscroll->set_step(0.001);
+ edit_draw->add_child(vscroll);
+ vscroll->set_anchors_and_margins_preset(PRESET_RIGHT_WIDE);
vscroll->connect("value_changed", this, "_scroll_changed");
hscroll = memnew(HScrollBar);
- main_vb->add_child(hscroll);
+ hscroll->set_step(0.001);
+ edit_draw->add_child(hscroll);
+ hscroll->set_anchors_and_margins_preset(PRESET_BOTTOM_WIDE);
+ hscroll->set_margin(MARGIN_RIGHT, -vscroll->get_size().x * EDSCALE);
hscroll->connect("value_changed", this, "_scroll_changed");
- edit_draw->connect("draw", this, "_region_draw");
- edit_draw->connect("gui_input", this, "_region_input");
- draw_zoom = 1.0;
updating_scroll = false;
-
- edit_draw->set_clip_contents(true);
}
void TextureRegionEditorPlugin::edit(Object *p_object) {
@@ -978,7 +997,6 @@ void TextureRegionEditorPlugin::make_visible(bool p_visible) {
Dictionary TextureRegionEditorPlugin::get_state() const {
Dictionary state;
- state["zoom"] = region_editor->draw_zoom;
state["snap_offset"] = region_editor->snap_offset;
state["snap_step"] = region_editor->snap_step;
state["snap_separation"] = region_editor->snap_separation;
@@ -989,10 +1007,6 @@ Dictionary TextureRegionEditorPlugin::get_state() const {
void TextureRegionEditorPlugin::set_state(const Dictionary &p_state) {
Dictionary state = p_state;
- if (state.has("zoom")) {
- region_editor->draw_zoom = p_state["zoom"];
- }
-
if (state.has("snap_step")) {
Vector2 s = state["snap_step"];
region_editor->sb_step_x->set_value(s.x);
@@ -1016,6 +1030,7 @@ void TextureRegionEditorPlugin::set_state(const Dictionary &p_state) {
if (state.has("snap_mode")) {
region_editor->_set_snap_mode(state["snap_mode"]);
+ region_editor->snap_mode_button->select(state["snap_mode"]);
}
}
diff --git a/editor/plugins/texture_region_editor_plugin.h b/editor/plugins/texture_region_editor_plugin.h
index 61ef769f89..e4d7971160 100644
--- a/editor/plugins/texture_region_editor_plugin.h
+++ b/editor/plugins/texture_region_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -43,9 +43,9 @@
@author Mariano Suligoy
*/
-class TextureRegionEditor : public Control {
+class TextureRegionEditor : public VBoxContainer {
- GDCLASS(TextureRegionEditor, Control);
+ GDCLASS(TextureRegionEditor, VBoxContainer);
enum SnapMode {
SNAP_NONE,
@@ -55,7 +55,7 @@ class TextureRegionEditor : public Control {
};
friend class TextureRegionEditorPlugin;
- MenuButton *snap_mode_button;
+ OptionButton *snap_mode_button;
ToolButton *zoom_in;
ToolButton *zoom_reset;
ToolButton *zoom_out;
@@ -66,7 +66,7 @@ class TextureRegionEditor : public Control {
SpinBox *sb_off_x;
SpinBox *sb_sep_y;
SpinBox *sb_sep_x;
- Control *edit_draw;
+ Panel *edit_draw;
VScrollBar *vscroll;
HScrollBar *hscroll;
@@ -111,7 +111,8 @@ class TextureRegionEditor : public Control {
void _zoom_in();
void _zoom_reset();
void _zoom_out();
- void apply_rect(const Rect2 &rect);
+ void apply_rect(const Rect2 &p_rect);
+ void _update_rect();
void _update_autoslice();
protected:
diff --git a/editor/plugins/theme_editor_plugin.cpp b/editor/plugins/theme_editor_plugin.cpp
index acee1a6942..e9b9c03c1e 100644
--- a/editor/plugins/theme_editor_plugin.cpp
+++ b/editor/plugins/theme_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/theme_editor_plugin.h b/editor/plugins/theme_editor_plugin.h
index 625b35e2c1..352988d69e 100644
--- a/editor/plugins/theme_editor_plugin.h
+++ b/editor/plugins/theme_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/plugins/tile_map_editor_plugin.cpp b/editor/plugins/tile_map_editor_plugin.cpp
index 213cd2ce1a..a967374eb9 100644
--- a/editor/plugins/tile_map_editor_plugin.cpp
+++ b/editor/plugins/tile_map_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -260,7 +260,7 @@ void TileMapEditor::_finish_undo() {
undo_redo->commit_action();
}
-void TileMapEditor::_set_cell(const Point2i &p_pos, Vector<int> p_values, bool p_flip_h, bool p_flip_v, bool p_transpose) {
+void TileMapEditor::_set_cell(const Point2i &p_pos, Vector<int> p_values, bool p_flip_h, bool p_flip_v, bool p_transpose, const Point2i p_autotile_coord) {
ERR_FAIL_COND(!node);
@@ -299,14 +299,16 @@ void TileMapEditor::_set_cell(const Point2i &p_pos, Vector<int> p_values, bool p
}
}
- node->set_cell(p_pos.x, p_pos.y, p_value, p_flip_h, p_flip_v, p_transpose);
+ node->set_cell(p_pos.x, p_pos.y, p_value, p_flip_h, p_flip_v, p_transpose, p_autotile_coord);
if (manual_autotile || (p_value != -1 && node->get_tileset()->tile_get_tile_mode(p_value) == TileSet::ATLAS_TILE)) {
if (current != -1) {
node->set_cell_autotile_coord(p_pos.x, p_pos.y, position);
}
} else {
// manually placing tiles should not update bitmasks
- node->update_bitmask_area(Point2(p_pos));
+ if (tool != TOOL_PASTING) {
+ node->update_bitmask_area(Point2(p_pos));
+ }
}
}
@@ -514,6 +516,12 @@ void TileMapEditor::_update_palette() {
manual_palette->set_current(selected);
manual_palette->show();
}
+
+ if (sel_tile != TileMap::INVALID_CELL && tileset->tile_get_tile_mode(sel_tile) == TileSet::AUTO_TILE) {
+ manual_button->show();
+ } else {
+ manual_button->hide();
+ }
}
void TileMapEditor::_pick_tile(const Point2 &p_pos) {
@@ -537,6 +545,7 @@ void TileMapEditor::_pick_tile(const Point2 &p_pos) {
flip_h = node->is_cell_x_flipped(p_pos.x, p_pos.y);
flip_v = node->is_cell_y_flipped(p_pos.x, p_pos.y);
transpose = node->is_cell_transposed(p_pos.x, p_pos.y);
+ autotile_coord = node->get_cell_autotile_coord(p_pos.x, p_pos.y);
_update_palette();
CanvasItemEditor::get_singleton()->update_viewport();
@@ -701,7 +710,7 @@ void TileMapEditor::_erase_selection() {
}
}
-void TileMapEditor::_draw_cell(Control *p_viewport, int p_cell, const Point2i &p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Transform2D &p_xform) {
+void TileMapEditor::_draw_cell(Control *p_viewport, int p_cell, const Point2i &p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Point2i p_autotile_coord, const Transform2D &p_xform) {
Ref<Texture> t = node->get_tileset()->tile_get_texture(p_cell);
@@ -717,7 +726,11 @@ void TileMapEditor::_draw_cell(Control *p_viewport, int p_cell, const Point2i &p
if ((manual_autotile || node->get_tileset()->tile_get_tile_mode(p_cell) == TileSet::ATLAS_TILE) && selected != -1) {
offset = manual_palette->get_item_metadata(selected);
} else {
- offset = node->get_tileset()->autotile_get_icon_coordinate(p_cell);
+ if (tool != TOOL_PASTING) {
+ offset = node->get_tileset()->autotile_get_icon_coordinate(p_cell);
+ } else {
+ offset = p_autotile_coord;
+ }
}
int spacing = node->get_tileset()->autotile_get_spacing(p_cell);
@@ -803,14 +816,14 @@ void TileMapEditor::_draw_cell(Control *p_viewport, int p_cell, const Point2i &p
p_viewport->draw_texture_rect_region(t, rect, r, modulate, p_transpose);
}
-void TileMapEditor::_draw_fill_preview(Control *p_viewport, int p_cell, const Point2i &p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Transform2D &p_xform) {
+void TileMapEditor::_draw_fill_preview(Control *p_viewport, int p_cell, const Point2i &p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Point2i p_autotile_coord, const Transform2D &p_xform) {
PoolVector<Vector2> points = _bucket_fill(p_point, false, true);
PoolVector<Vector2>::Read pr = points.read();
int len = points.size();
for (int i = 0; i < len; ++i) {
- _draw_cell(p_viewport, p_cell, pr[i], p_flip_h, p_flip_v, p_transpose, p_xform);
+ _draw_cell(p_viewport, p_cell, pr[i], p_flip_h, p_flip_v, p_transpose, p_autotile_coord, p_xform);
}
}
@@ -841,6 +854,7 @@ void TileMapEditor::_update_copydata() {
tcd.flip_h = node->is_cell_x_flipped(j, i);
tcd.flip_v = node->is_cell_y_flipped(j, i);
tcd.transpose = node->is_cell_transposed(j, i);
+ tcd.autotile_coord = node->get_cell_autotile_coord(j, i);
}
copydata.push_back(tcd);
@@ -1022,7 +1036,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
for (List<TileData>::Element *E = copydata.front(); E; E = E->next()) {
ids.write[0] = E->get().cell;
- _set_cell(E->get().pos + ofs, ids, E->get().flip_h, E->get().flip_v, E->get().transpose);
+ _set_cell(E->get().pos + ofs, ids, E->get().flip_h, E->get().flip_v, E->get().transpose, E->get().autotile_coord);
}
_finish_undo();
@@ -1549,7 +1563,7 @@ void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
for (Map<Point2i, CellOp>::Element *E = paint_undo.front(); E; E = E->next()) {
- _draw_cell(p_overlay, ids[0], E->key(), flip_h, flip_v, transpose, xform);
+ _draw_cell(p_overlay, ids[0], E->key(), flip_h, flip_v, transpose, autotile_coord, xform);
}
} else if (tool == TOOL_RECTANGLE_PAINT) {
@@ -1562,7 +1576,7 @@ void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
for (int i = rectangle.position.y; i <= rectangle.position.y + rectangle.size.y; i++) {
for (int j = rectangle.position.x; j <= rectangle.position.x + rectangle.size.x; j++) {
- _draw_cell(p_overlay, ids[0], Point2i(j, i), flip_h, flip_v, transpose, xform);
+ _draw_cell(p_overlay, ids[0], Point2i(j, i), flip_h, flip_v, transpose, autotile_coord, xform);
}
}
} else if (tool == TOOL_PASTING) {
@@ -1584,7 +1598,7 @@ void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
TileData tcd = E->get();
- _draw_cell(p_overlay, tcd.cell, tcd.pos + ofs, tcd.flip_h, tcd.flip_v, tcd.transpose, xform);
+ _draw_cell(p_overlay, tcd.cell, tcd.pos + ofs, tcd.flip_h, tcd.flip_v, tcd.transpose, tcd.autotile_coord, xform);
}
Rect2i duplicate = rectangle;
@@ -1601,7 +1615,7 @@ void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
} else if (tool == TOOL_BUCKET) {
Vector<int> tiles = get_selected_tiles();
- _draw_fill_preview(p_overlay, tiles[0], over_tile, flip_h, flip_v, transpose, xform);
+ _draw_fill_preview(p_overlay, tiles[0], over_tile, flip_h, flip_v, transpose, autotile_coord, xform);
} else {
@@ -1610,7 +1624,7 @@ void TileMapEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
if (st.size() == 1 && st[0] == TileMap::INVALID_CELL)
return;
- _draw_cell(p_overlay, st[0], over_tile, flip_h, flip_v, transpose, xform);
+ _draw_cell(p_overlay, st[0], over_tile, flip_h, flip_v, transpose, autotile_coord, xform);
}
}
}
@@ -1862,7 +1876,7 @@ TileMapEditor::TileMapEditor(EditorNode *p_editor) {
toolbar->add_child(tile_info);
options = memnew(MenuButton);
- options->set_text("Tile Map");
+ options->set_text("TileMap");
options->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("TileMap", "EditorIcons"));
options->set_process_unhandled_key_input(false);
diff --git a/editor/plugins/tile_map_editor_plugin.h b/editor/plugins/tile_map_editor_plugin.h
index 68e5806ee5..b30426eabe 100644
--- a/editor/plugins/tile_map_editor_plugin.h
+++ b/editor/plugins/tile_map_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -111,6 +111,7 @@ class TileMapEditor : public VBoxContainer {
bool flip_h;
bool flip_v;
bool transpose;
+ Point2i autotile_coord;
Point2i rectangle_begin;
Rect2i rectangle;
@@ -145,6 +146,7 @@ class TileMapEditor : public VBoxContainer {
bool flip_h;
bool flip_v;
bool transpose;
+ Point2i autotile_coord;
TileData() :
cell(TileMap::INVALID_CELL),
@@ -168,8 +170,8 @@ class TileMapEditor : public VBoxContainer {
void _select(const Point2i &p_from, const Point2i &p_to);
void _erase_selection();
- void _draw_cell(Control *p_viewport, int p_cell, const Point2i &p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Transform2D &p_xform);
- void _draw_fill_preview(Control *p_viewport, int p_cell, const Point2i &p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Transform2D &p_xform);
+ void _draw_cell(Control *p_viewport, int p_cell, const Point2i &p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Point2i p_autotile_coord, const Transform2D &p_xform);
+ void _draw_fill_preview(Control *p_viewport, int p_cell, const Point2i &p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Point2i p_autotile_coord, const Transform2D &p_xform);
void _clear_bucket_cache();
void _update_copydata();
@@ -189,7 +191,7 @@ class TileMapEditor : public VBoxContainer {
void _start_undo(const String &p_action);
void _finish_undo();
void _create_set_cell_undo(const Vector2 &p_vec, const CellOp &p_cell_old, const CellOp &p_cell_new);
- void _set_cell(const Point2i &p_pos, Vector<int> p_values, bool p_flip_h = false, bool p_flip_v = false, bool p_transpose = false);
+ void _set_cell(const Point2i &p_pos, Vector<int> p_values, bool p_flip_h = false, bool p_flip_v = false, bool p_transpose = false, const Point2i p_autotile_coord = Point2());
void _canvas_mouse_enter();
void _canvas_mouse_exit();
diff --git a/editor/plugins/tile_set_editor_plugin.cpp b/editor/plugins/tile_set_editor_plugin.cpp
index d0e0b3e006..1a687a4009 100644
--- a/editor/plugins/tile_set_editor_plugin.cpp
+++ b/editor/plugins/tile_set_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -165,6 +165,11 @@ void TileSetEditor::_import_scene(Node *p_scene, Ref<TileSet> p_library, bool p_
_import_node(p_scene, p_library);
}
+void TileSetEditor::_undo_redo_import_scene(Node *p_scene, bool p_merge) {
+
+ _import_scene(p_scene, tileset, p_merge);
+}
+
Error TileSetEditor::update_library_file(Node *p_base_scene, Ref<TileSet> ml, bool p_merge) {
_import_scene(p_base_scene, ml, p_merge);
@@ -172,6 +177,8 @@ Error TileSetEditor::update_library_file(Node *p_base_scene, Ref<TileSet> ml, bo
}
void TileSetEditor::_bind_methods() {
+
+ ClassDB::bind_method("_undo_redo_import_scene", &TileSetEditor::_undo_redo_import_scene);
ClassDB::bind_method("_on_tileset_toolbar_button_pressed", &TileSetEditor::_on_tileset_toolbar_button_pressed);
ClassDB::bind_method("_on_textures_added", &TileSetEditor::_on_textures_added);
ClassDB::bind_method("_on_tileset_toolbar_confirm", &TileSetEditor::_on_tileset_toolbar_confirm);
@@ -184,58 +191,77 @@ void TileSetEditor::_bind_methods() {
ClassDB::bind_method("_on_workspace_input", &TileSetEditor::_on_workspace_input);
ClassDB::bind_method("_on_tool_clicked", &TileSetEditor::_on_tool_clicked);
ClassDB::bind_method("_on_priority_changed", &TileSetEditor::_on_priority_changed);
+ ClassDB::bind_method("_on_z_index_changed", &TileSetEditor::_on_z_index_changed);
ClassDB::bind_method("_on_grid_snap_toggled", &TileSetEditor::_on_grid_snap_toggled);
ClassDB::bind_method("_set_snap_step", &TileSetEditor::_set_snap_step);
ClassDB::bind_method("_set_snap_off", &TileSetEditor::_set_snap_off);
ClassDB::bind_method("_set_snap_sep", &TileSetEditor::_set_snap_sep);
+ ClassDB::bind_method("_validate_current_tile_id", &TileSetEditor::_validate_current_tile_id);
+ ClassDB::bind_method("_zoom_in", &TileSetEditor::_zoom_in);
+ ClassDB::bind_method("_zoom_out", &TileSetEditor::_zoom_out);
+ ClassDB::bind_method("_zoom_reset", &TileSetEditor::_zoom_reset);
+ ClassDB::bind_method("_select_edited_shape_coord", &TileSetEditor::_select_edited_shape_coord);
+
+ ClassDB::bind_method("edit", &TileSetEditor::edit);
+ ClassDB::bind_method("add_texture", &TileSetEditor::add_texture);
+ ClassDB::bind_method("remove_texture", &TileSetEditor::remove_texture);
+ ClassDB::bind_method("update_texture_list_icon", &TileSetEditor::update_texture_list_icon);
}
void TileSetEditor::_notification(int p_what) {
- if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
-
- tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]->set_icon(get_icon("ToolAddNode", "EditorIcons"));
- tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]->set_icon(get_icon("Remove", "EditorIcons"));
- tileset_toolbar_tools->set_icon(get_icon("Tools", "EditorIcons"));
-
- tool_workspacemode[WORKSPACE_EDIT]->set_icon(get_icon("Edit", "EditorIcons"));
- tool_workspacemode[WORKSPACE_CREATE_SINGLE]->set_icon(get_icon("AddSingleTile", "EditorIcons"));
- tool_workspacemode[WORKSPACE_CREATE_AUTOTILE]->set_icon(get_icon("AddAutotile", "EditorIcons"));
- tool_workspacemode[WORKSPACE_CREATE_ATLAS]->set_icon(get_icon("AddAtlasTile", "EditorIcons"));
-
- tools[TOOL_SELECT]->set_icon(get_icon("ToolSelect", "EditorIcons"));
- tools[BITMASK_COPY]->set_icon(get_icon("Duplicate", "EditorIcons"));
- tools[BITMASK_PASTE]->set_icon(get_icon("Override", "EditorIcons"));
- tools[BITMASK_CLEAR]->set_icon(get_icon("Clear", "EditorIcons"));
- tools[SHAPE_NEW_POLYGON]->set_icon(get_icon("CollisionPolygon2D", "EditorIcons"));
- tools[SHAPE_DELETE]->set_icon(get_icon("Remove", "EditorIcons"));
- tools[SHAPE_KEEP_INSIDE_TILE]->set_icon(get_icon("Snap", "EditorIcons"));
- tools[TOOL_GRID_SNAP]->set_icon(get_icon("SnapGrid", "EditorIcons"));
- tools[ZOOM_OUT]->set_icon(get_icon("ZoomLess", "EditorIcons"));
- tools[ZOOM_1]->set_icon(get_icon("ZoomReset", "EditorIcons"));
- tools[ZOOM_IN]->set_icon(get_icon("ZoomMore", "EditorIcons"));
- tools[VISIBLE_INFO]->set_icon(get_icon("InformationSign", "EditorIcons"));
-
- tool_editmode[EDITMODE_REGION]->set_icon(get_icon("RegionEdit", "EditorIcons"));
- tool_editmode[EDITMODE_COLLISION]->set_icon(get_icon("StaticBody2D", "EditorIcons"));
- tool_editmode[EDITMODE_OCCLUSION]->set_icon(get_icon("LightOccluder2D", "EditorIcons"));
- tool_editmode[EDITMODE_NAVIGATION]->set_icon(get_icon("Navigation2D", "EditorIcons"));
- tool_editmode[EDITMODE_BITMASK]->set_icon(get_icon("PackedDataContainer", "EditorIcons"));
- tool_editmode[EDITMODE_PRIORITY]->set_icon(get_icon("MaterialPreviewLight1", "EditorIcons"));
- tool_editmode[EDITMODE_ICON]->set_icon(get_icon("LargeTexture", "EditorIcons"));
+
+ switch (p_what) {
+ case NOTIFICATION_READY: {
+
+ add_constant_override("autohide", 1); // Fixes the dragger always showing up.
+ } break;
+ case NOTIFICATION_ENTER_TREE:
+ case NOTIFICATION_THEME_CHANGED: {
+
+ tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]->set_icon(get_icon("ToolAddNode", "EditorIcons"));
+ tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]->set_icon(get_icon("Remove", "EditorIcons"));
+ tileset_toolbar_tools->set_icon(get_icon("Tools", "EditorIcons"));
+
+ tool_workspacemode[WORKSPACE_EDIT]->set_icon(get_icon("Edit", "EditorIcons"));
+ tool_workspacemode[WORKSPACE_CREATE_SINGLE]->set_icon(get_icon("AddSingleTile", "EditorIcons"));
+ tool_workspacemode[WORKSPACE_CREATE_AUTOTILE]->set_icon(get_icon("AddAutotile", "EditorIcons"));
+ tool_workspacemode[WORKSPACE_CREATE_ATLAS]->set_icon(get_icon("AddAtlasTile", "EditorIcons"));
+
+ tools[TOOL_SELECT]->set_icon(get_icon("ToolSelect", "EditorIcons"));
+ tools[BITMASK_COPY]->set_icon(get_icon("Duplicate", "EditorIcons"));
+ tools[BITMASK_PASTE]->set_icon(get_icon("Override", "EditorIcons"));
+ tools[BITMASK_CLEAR]->set_icon(get_icon("Clear", "EditorIcons"));
+ tools[SHAPE_NEW_POLYGON]->set_icon(get_icon("CollisionPolygon2D", "EditorIcons"));
+ tools[SHAPE_DELETE]->set_icon(get_icon("Remove", "EditorIcons"));
+ tools[SHAPE_KEEP_INSIDE_TILE]->set_icon(get_icon("Snap", "EditorIcons"));
+ tools[TOOL_GRID_SNAP]->set_icon(get_icon("SnapGrid", "EditorIcons"));
+ tools[ZOOM_OUT]->set_icon(get_icon("ZoomLess", "EditorIcons"));
+ tools[ZOOM_1]->set_icon(get_icon("ZoomReset", "EditorIcons"));
+ tools[ZOOM_IN]->set_icon(get_icon("ZoomMore", "EditorIcons"));
+ tools[VISIBLE_INFO]->set_icon(get_icon("InformationSign", "EditorIcons"));
+
+ tool_editmode[EDITMODE_REGION]->set_icon(get_icon("RegionEdit", "EditorIcons"));
+ tool_editmode[EDITMODE_COLLISION]->set_icon(get_icon("StaticBody2D", "EditorIcons"));
+ tool_editmode[EDITMODE_OCCLUSION]->set_icon(get_icon("LightOccluder2D", "EditorIcons"));
+ tool_editmode[EDITMODE_NAVIGATION]->set_icon(get_icon("Navigation2D", "EditorIcons"));
+ tool_editmode[EDITMODE_BITMASK]->set_icon(get_icon("PackedDataContainer", "EditorIcons"));
+ tool_editmode[EDITMODE_PRIORITY]->set_icon(get_icon("MaterialPreviewLight1", "EditorIcons"));
+ tool_editmode[EDITMODE_ICON]->set_icon(get_icon("LargeTexture", "EditorIcons"));
+ tool_editmode[EDITMODE_Z_INDEX]->set_icon(get_icon("Sort", "EditorIcons"));
+
+ scroll->add_style_override("bg", get_stylebox("bg", "Tree"));
+ } break;
}
}
TileSetEditor::TileSetEditor(EditorNode *p_editor) {
editor = p_editor;
- set_name("Tile Set Bottom Editor");
-
- HSplitContainer *split = memnew(HSplitContainer);
- split->set_anchors_and_margins_preset(PRESET_WIDE, PRESET_MODE_MINSIZE, 10);
- add_child(split);
+ undo_redo = editor->get_undo_redo();
+ current_tile = -1;
VBoxContainer *left_container = memnew(VBoxContainer);
- split->add_child(left_container);
+ add_child(left_container);
texture_list = memnew(ItemList);
left_container->add_child(texture_list);
@@ -247,30 +273,22 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
left_container->add_child(tileset_toolbar_container);
tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE] = memnew(ToolButton);
- Vector<Variant> p;
- p.push_back((int)TOOL_TILESET_ADD_TEXTURE);
- tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]->connect("pressed", this, "_on_tileset_toolbar_button_pressed", p);
+ tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]->connect("pressed", this, "_on_tileset_toolbar_button_pressed", varray(TOOL_TILESET_ADD_TEXTURE));
tileset_toolbar_container->add_child(tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]);
- tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]->set_tooltip(TTR("Add Texture(s) to TileSet"));
+ tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]->set_tooltip(TTR("Add Texture(s) to TileSet."));
tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE] = memnew(ToolButton);
- p = Vector<Variant>();
- p.push_back((int)TOOL_TILESET_REMOVE_TEXTURE);
- tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]->connect("pressed", this, "_on_tileset_toolbar_button_pressed", p);
+ tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]->connect("pressed", this, "_on_tileset_toolbar_button_pressed", varray(TOOL_TILESET_REMOVE_TEXTURE));
tileset_toolbar_container->add_child(tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]);
- tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]->set_tooltip(TTR("Remove current Texture from TileSet"));
+ tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]->set_tooltip(TTR("Remove selected Texture from TileSet."));
Control *toolbar_separator = memnew(Control);
toolbar_separator->set_h_size_flags(Control::SIZE_EXPAND_FILL);
tileset_toolbar_container->add_child(toolbar_separator);
tileset_toolbar_tools = memnew(MenuButton);
- tileset_toolbar_tools->set_text("Tools");
- p = Vector<Variant>();
- p.push_back((int)TOOL_TILESET_CREATE_SCENE);
+ tileset_toolbar_tools->set_text(TTR("Tools"));
tileset_toolbar_tools->get_popup()->add_item(TTR("Create from Scene"), TOOL_TILESET_CREATE_SCENE);
- p = Vector<Variant>();
- p.push_back((int)TOOL_TILESET_MERGE_SCENE);
tileset_toolbar_tools->get_popup()->add_item(TTR("Merge from Scene"), TOOL_TILESET_MERGE_SCENE);
tileset_toolbar_tools->get_popup()->connect("id_pressed", this, "_on_tileset_toolbar_button_pressed");
@@ -279,7 +297,7 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
//---------------
VBoxContainer *right_container = memnew(VBoxContainer);
right_container->set_v_size_flags(SIZE_EXPAND_FILL);
- split->add_child(right_container);
+ add_child(right_container);
dragging_point = -1;
creating_shape = false;
@@ -296,21 +314,18 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
Ref<ButtonGroup> g(memnew(ButtonGroup));
String workspace_label[WORKSPACE_MODE_MAX] = { "Edit", "New Single Tile", "New Autotile", "New Atlas" };
-
for (int i = 0; i < (int)WORKSPACE_MODE_MAX; i++) {
tool_workspacemode[i] = memnew(Button);
- tool_workspacemode[i]->set_text(workspace_label[i]);
+ tool_workspacemode[i]->set_text(TTR(workspace_label[i]));
tool_workspacemode[i]->set_toggle_mode(true);
tool_workspacemode[i]->set_button_group(g);
- Vector<Variant> p;
- p.push_back(i);
- tool_workspacemode[i]->connect("pressed", this, "_on_workspace_mode_changed", p);
+ tool_workspacemode[i]->connect("pressed", this, "_on_workspace_mode_changed", varray(i));
tool_hb->add_child(tool_workspacemode[i]);
}
Control *spacer = memnew(Control);
spacer->set_h_size_flags(Control::SIZE_EXPAND_FILL);
tool_hb->add_child(spacer);
- tool_hb->move_child(spacer, (int)WORKSPACE_CREATE_SINGLE);
+ tool_hb->move_child(spacer, WORKSPACE_CREATE_SINGLE);
tool_workspacemode[WORKSPACE_EDIT]->set_pressed(true);
workspace_mode = WORKSPACE_EDIT;
@@ -321,16 +336,13 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
tool_hb = memnew(HBoxContainer);
g = Ref<ButtonGroup>(memnew(ButtonGroup));
- String label[EDITMODE_MAX] = { "Region", "Collision", "Occlusion", "Navigation", "Bitmask", "Priority", "Icon" };
-
+ String label[EDITMODE_MAX] = { "Region", "Collision", "Occlusion", "Navigation", "Bitmask", "Priority", "Icon", "Z Index" };
for (int i = 0; i < (int)EDITMODE_MAX; i++) {
tool_editmode[i] = memnew(Button);
tool_editmode[i]->set_text(label[i]);
tool_editmode[i]->set_toggle_mode(true);
tool_editmode[i]->set_button_group(g);
- Vector<Variant> p;
- p.push_back(i);
- tool_editmode[i]->connect("pressed", this, "_on_edit_mode_changed", p);
+ tool_editmode[i]->connect("pressed", this, "_on_edit_mode_changed", varray(i));
tool_hb->add_child(tool_editmode[i]);
}
tool_editmode[EDITMODE_COLLISION]->set_pressed(true);
@@ -343,90 +355,91 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
toolbar = memnew(HBoxContainer);
Ref<ButtonGroup> tg(memnew(ButtonGroup));
- p = Vector<Variant>();
tools[TOOL_SELECT] = memnew(ToolButton);
toolbar->add_child(tools[TOOL_SELECT]);
- tools[TOOL_SELECT]->set_tooltip(TTR("Select sub-tile to use as icon, this will be also used on invalid autotile bindings."));
tools[TOOL_SELECT]->set_toggle_mode(true);
tools[TOOL_SELECT]->set_button_group(tg);
tools[TOOL_SELECT]->set_pressed(true);
- p.push_back((int)TOOL_SELECT);
- tools[TOOL_SELECT]->connect("pressed", this, "_on_tool_clicked", p);
+ tools[TOOL_SELECT]->connect("pressed", this, "_on_tool_clicked", varray(TOOL_SELECT));
+ separator_bitmask = memnew(VSeparator);
+ toolbar->add_child(separator_bitmask);
tools[BITMASK_COPY] = memnew(ToolButton);
- p.push_back((int)BITMASK_COPY);
- tools[BITMASK_COPY]->connect("pressed", this, "_on_tool_clicked", p);
+ tools[BITMASK_COPY]->set_tooltip(TTR("Copy bitmask."));
+ tools[BITMASK_COPY]->connect("pressed", this, "_on_tool_clicked", varray(BITMASK_COPY));
toolbar->add_child(tools[BITMASK_COPY]);
tools[BITMASK_PASTE] = memnew(ToolButton);
- p = Vector<Variant>();
- p.push_back((int)BITMASK_PASTE);
- tools[BITMASK_PASTE]->connect("pressed", this, "_on_tool_clicked", p);
+ tools[BITMASK_PASTE]->set_tooltip(TTR("Paste bitmask."));
+ tools[BITMASK_PASTE]->connect("pressed", this, "_on_tool_clicked", varray(BITMASK_PASTE));
toolbar->add_child(tools[BITMASK_PASTE]);
tools[BITMASK_CLEAR] = memnew(ToolButton);
- p = Vector<Variant>();
- p.push_back((int)BITMASK_CLEAR);
- tools[BITMASK_CLEAR]->connect("pressed", this, "_on_tool_clicked", p);
+ tools[BITMASK_CLEAR]->set_tooltip(TTR("Erase bitmask."));
+ tools[BITMASK_CLEAR]->connect("pressed", this, "_on_tool_clicked", varray(BITMASK_CLEAR));
toolbar->add_child(tools[BITMASK_CLEAR]);
tools[SHAPE_NEW_POLYGON] = memnew(ToolButton);
toolbar->add_child(tools[SHAPE_NEW_POLYGON]);
tools[SHAPE_NEW_POLYGON]->set_toggle_mode(true);
tools[SHAPE_NEW_POLYGON]->set_button_group(tg);
+ tools[SHAPE_NEW_POLYGON]->set_tooltip(TTR("Create a new polygon."));
separator_delete = memnew(VSeparator);
toolbar->add_child(separator_delete);
tools[SHAPE_DELETE] = memnew(ToolButton);
- p = Vector<Variant>();
- p.push_back((int)SHAPE_DELETE);
- tools[SHAPE_DELETE]->connect("pressed", this, "_on_tool_clicked", p);
+ tools[SHAPE_DELETE]->connect("pressed", this, "_on_tool_clicked", varray(SHAPE_DELETE));
toolbar->add_child(tools[SHAPE_DELETE]);
+ spin_priority = memnew(SpinBox);
+ spin_priority->set_min(1);
+ spin_priority->set_max(255);
+ spin_priority->set_step(1);
+ spin_priority->set_custom_minimum_size(Size2(100, 0));
+ spin_priority->connect("value_changed", this, "_on_priority_changed");
+ spin_priority->hide();
+ toolbar->add_child(spin_priority);
+
+ spin_z_index = memnew(SpinBox);
+ spin_z_index->set_min(VS::CANVAS_ITEM_Z_MIN);
+ spin_z_index->set_max(VS::CANVAS_ITEM_Z_MAX);
+ spin_z_index->set_step(1);
+ spin_z_index->set_custom_minimum_size(Size2(100, 0));
+ spin_z_index->connect("value_changed", this, "_on_z_index_changed");
+ spin_z_index->hide();
+ toolbar->add_child(spin_z_index);
+
separator_grid = memnew(VSeparator);
toolbar->add_child(separator_grid);
tools[SHAPE_KEEP_INSIDE_TILE] = memnew(ToolButton);
tools[SHAPE_KEEP_INSIDE_TILE]->set_toggle_mode(true);
tools[SHAPE_KEEP_INSIDE_TILE]->set_pressed(true);
+ tools[SHAPE_KEEP_INSIDE_TILE]->set_tooltip(TTR("Keep polygon inside region Rect."));
toolbar->add_child(tools[SHAPE_KEEP_INSIDE_TILE]);
tools[TOOL_GRID_SNAP] = memnew(ToolButton);
tools[TOOL_GRID_SNAP]->set_toggle_mode(true);
+ tools[TOOL_GRID_SNAP]->set_tooltip(TTR("Enable snap and show grid (configurable via the Inspector)."));
tools[TOOL_GRID_SNAP]->connect("toggled", this, "_on_grid_snap_toggled");
toolbar->add_child(tools[TOOL_GRID_SNAP]);
- spin_priority = memnew(SpinBox);
- spin_priority->set_min(1);
- spin_priority->set_max(255);
- spin_priority->set_step(1);
- spin_priority->set_custom_minimum_size(Size2(100, 0));
- spin_priority->connect("value_changed", this, "_on_priority_changed");
- spin_priority->hide();
- toolbar->add_child(spin_priority);
-
Control *separator = memnew(Control);
separator->set_h_size_flags(SIZE_EXPAND_FILL);
toolbar->add_child(separator);
tools[ZOOM_OUT] = memnew(ToolButton);
- p = Vector<Variant>();
- p.push_back((int)ZOOM_OUT);
- tools[ZOOM_OUT]->connect("pressed", this, "_on_tool_clicked", p);
+ tools[ZOOM_OUT]->connect("pressed", this, "_zoom_out");
toolbar->add_child(tools[ZOOM_OUT]);
tools[ZOOM_OUT]->set_tooltip(TTR("Zoom Out"));
tools[ZOOM_1] = memnew(ToolButton);
- p = Vector<Variant>();
- p.push_back((int)ZOOM_1);
- tools[ZOOM_1]->connect("pressed", this, "_on_tool_clicked", p);
+ tools[ZOOM_1]->connect("pressed", this, "_zoom_reset");
toolbar->add_child(tools[ZOOM_1]);
- tools[ZOOM_1]->set_tooltip(TTR("Reset Zoom"));
+ tools[ZOOM_1]->set_tooltip(TTR("Zoom Reset"));
tools[ZOOM_IN] = memnew(ToolButton);
- p = Vector<Variant>();
- p.push_back((int)ZOOM_IN);
- tools[ZOOM_IN]->connect("pressed", this, "_on_tool_clicked", p);
+ tools[ZOOM_IN]->connect("pressed", this, "_zoom_in");
toolbar->add_child(tools[ZOOM_IN]);
tools[ZOOM_IN]->set_tooltip(TTR("Zoom In"));
tools[VISIBLE_INFO] = memnew(ToolButton);
tools[VISIBLE_INFO]->set_toggle_mode(true);
- tools[VISIBLE_INFO]->set_tooltip(TTR("Display tile's names (hold Alt Key)"));
+ tools[VISIBLE_INFO]->set_tooltip(TTR("Display Tile Names (Hold Alt Key)"));
toolbar->add_child(tools[VISIBLE_INFO]);
main_vb->add_child(toolbar);
@@ -482,7 +495,7 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
//---------------
helper = memnew(TilesetEditorContext(this));
- tile_names_opacity = 0;
+ tile_names_visible = false;
// config scale
max_scale = 10.0f;
@@ -503,7 +516,7 @@ void TileSetEditor::_on_tileset_toolbar_button_pressed(int p_index) {
} break;
case TOOL_TILESET_REMOVE_TEXTURE: {
if (get_current_texture().is_valid()) {
- cd->set_text(TTR("Remove selected texture and ALL TILES which use it?"));
+ cd->set_text(TTR("Remove selected texture? This will remove all tiles which use it."));
cd->popup_centered(Size2(300, 60));
} else {
err_dialog->set_text(TTR("You haven't selected a texture to remove."));
@@ -512,7 +525,7 @@ void TileSetEditor::_on_tileset_toolbar_button_pressed(int p_index) {
} break;
case TOOL_TILESET_CREATE_SCENE: {
- cd->set_text(TTR("Create from scene?"));
+ cd->set_text(TTR("Create from scene? This will overwrite all current tiles."));
cd->popup_centered(Size2(300, 60));
} break;
case TOOL_TILESET_MERGE_SCENE: {
@@ -529,14 +542,18 @@ void TileSetEditor::_on_tileset_toolbar_confirm() {
RID current_rid = get_current_texture()->get_rid();
List<int> ids;
tileset->get_tile_list(&ids);
+
+ undo_redo->create_action(TTR("Remove Texture"));
for (List<int>::Element *E = ids.front(); E; E = E->next()) {
if (tileset->tile_get_texture(E->get())->get_rid() == current_rid) {
- tileset->remove_tile(E->get());
+ undo_redo->add_do_method(tileset.ptr(), "remove_tile", E->get());
+ _undo_tile_removal(E->get());
}
}
- texture_list->remove_item(texture_list->find_metadata(current_rid));
- texture_map.erase(current_rid);
- _on_texture_list_selected(-1);
+ undo_redo->add_do_method(this, "remove_texture", get_current_texture());
+ undo_redo->add_undo_method(this, "add_texture", get_current_texture());
+ undo_redo->add_undo_method(this, "update_texture_list_icon");
+ undo_redo->commit_action();
} break;
case TOOL_TILESET_MERGE_SCENE:
case TOOL_TILESET_CREATE_SCENE: {
@@ -545,9 +562,19 @@ void TileSetEditor::_on_tileset_toolbar_confirm() {
Node *scene = en->get_edited_scene();
if (!scene)
break;
- _import_scene(scene, tileset, option == TOOL_TILESET_MERGE_SCENE);
- edit(tileset);
+ List<int> ids;
+ tileset->get_tile_list(&ids);
+
+ undo_redo->create_action(TTR(option == TOOL_TILESET_MERGE_SCENE ? "Merge Tileset from Scene" : "Create Tileset from Scene"));
+ undo_redo->add_do_method(this, "_undo_redo_import_scene", scene, option == TOOL_TILESET_MERGE_SCENE);
+ undo_redo->add_undo_method(tileset.ptr(), "clear");
+ for (List<int>::Element *E = ids.front(); E; E = E->next()) {
+ _undo_tile_removal(E->get());
+ }
+ undo_redo->add_do_method(this, "edit", tileset);
+ undo_redo->add_undo_method(this, "edit", tileset);
+ undo_redo->commit_action();
} break;
}
}
@@ -581,9 +608,7 @@ void TileSetEditor::_on_textures_added(const PoolStringArray &p_paths) {
if (texture_map.has(t->get_rid())) {
invalid_count++;
} else {
- texture_list->add_item(t->get_path().get_file());
- texture_map.insert(t->get_rid(), t);
- texture_list->set_item_metadata(texture_list->get_item_count() - 1, t->get_rid());
+ add_texture(t);
}
}
@@ -600,10 +625,14 @@ void TileSetEditor::_on_textures_added(const PoolStringArray &p_paths) {
}
void TileSetEditor::_on_edit_mode_changed(int p_edit_mode) {
+ draw_handles = false;
+ creating_shape = false;
edit_mode = (EditMode)p_edit_mode;
switch (edit_mode) {
case EDITMODE_REGION: {
tools[TOOL_SELECT]->show();
+
+ separator_bitmask->hide();
tools[BITMASK_COPY]->hide();
tools[BITMASK_PASTE]->hide();
tools[BITMASK_CLEAR]->hide();
@@ -623,30 +652,16 @@ void TileSetEditor::_on_edit_mode_changed(int p_edit_mode) {
tools[TOOL_SELECT]->set_pressed(true);
tools[TOOL_SELECT]->set_tooltip(TTR("Drag handles to edit Rect.\nClick on another Tile to edit it."));
+ tools[SHAPE_DELETE]->set_tooltip(TTR("Delete selected Rect."));
spin_priority->hide();
- } break;
- case EDITMODE_BITMASK: {
- tools[TOOL_SELECT]->show();
- tools[BITMASK_COPY]->show();
- tools[BITMASK_PASTE]->show();
- tools[BITMASK_CLEAR]->show();
- tools[SHAPE_NEW_POLYGON]->hide();
-
- separator_delete->hide();
- tools[SHAPE_DELETE]->hide();
-
- separator_grid->hide();
- tools[SHAPE_KEEP_INSIDE_TILE]->hide();
- tools[TOOL_GRID_SNAP]->hide();
-
- tools[TOOL_SELECT]->set_pressed(true);
- tools[TOOL_SELECT]->set_tooltip(TTR("LMB: set bit on.\nRMB: set bit off.\nClick on another Tile to edit it."));
- spin_priority->hide();
+ spin_z_index->hide();
} break;
case EDITMODE_COLLISION:
- case EDITMODE_NAVIGATION:
- case EDITMODE_OCCLUSION: {
+ case EDITMODE_OCCLUSION:
+ case EDITMODE_NAVIGATION: {
tools[TOOL_SELECT]->show();
+
+ separator_bitmask->hide();
tools[BITMASK_COPY]->hide();
tools[BITMASK_PASTE]->hide();
tools[BITMASK_CLEAR]->hide();
@@ -660,11 +675,36 @@ void TileSetEditor::_on_edit_mode_changed(int p_edit_mode) {
tools[TOOL_GRID_SNAP]->show();
tools[TOOL_SELECT]->set_tooltip(TTR("Select current edited sub-tile.\nClick on another Tile to edit it."));
+ tools[SHAPE_DELETE]->set_tooltip(TTR("Delete polygon."));
spin_priority->hide();
- select_coord(edited_shape_coord);
+ spin_z_index->hide();
+
+ _select_edited_shape_coord();
} break;
- default: {
+ case EDITMODE_BITMASK: {
tools[TOOL_SELECT]->show();
+
+ separator_bitmask->show();
+ tools[BITMASK_COPY]->show();
+ tools[BITMASK_PASTE]->show();
+ tools[BITMASK_CLEAR]->show();
+ tools[SHAPE_NEW_POLYGON]->hide();
+
+ separator_delete->hide();
+ tools[SHAPE_DELETE]->hide();
+
+ tools[SHAPE_KEEP_INSIDE_TILE]->hide();
+
+ tools[TOOL_SELECT]->set_pressed(true);
+ tools[TOOL_SELECT]->set_tooltip(TTR("LMB: Set bit on.\nRMB: Set bit off.\nClick on another Tile to edit it."));
+ spin_priority->hide();
+ } break;
+ case EDITMODE_Z_INDEX:
+ case EDITMODE_PRIORITY:
+ case EDITMODE_ICON: {
+ tools[TOOL_SELECT]->show();
+
+ separator_bitmask->hide();
tools[BITMASK_COPY]->hide();
tools[BITMASK_PASTE]->hide();
tools[BITMASK_CLEAR]->hide();
@@ -680,11 +720,18 @@ void TileSetEditor::_on_edit_mode_changed(int p_edit_mode) {
if (edit_mode == EDITMODE_ICON) {
tools[TOOL_SELECT]->set_tooltip(TTR("Select sub-tile to use as icon, this will be also used on invalid autotile bindings.\nClick on another Tile to edit it."));
spin_priority->hide();
- } else {
+ spin_z_index->hide();
+ } else if (edit_mode == EDITMODE_PRIORITY) {
tools[TOOL_SELECT]->set_tooltip(TTR("Select sub-tile to change its priority.\nClick on another Tile to edit it."));
spin_priority->show();
+ spin_z_index->hide();
+ } else {
+ tools[TOOL_SELECT]->set_tooltip(TTR("Select sub-tile to change its z index.\nClick on another Tile to edit it."));
+ spin_priority->hide();
+ spin_z_index->show();
}
} break;
+ default: {}
}
workspace->update();
}
@@ -706,15 +753,16 @@ void TileSetEditor::_on_workspace_mode_changed(int p_workspace_mode) {
void TileSetEditor::_on_workspace_draw() {
- const Color COLOR_AUTOTILE = Color(0.266373, 0.565288, 0.988281);
- const Color COLOR_SINGLE = Color(0.988281, 0.909323, 0.266373);
- const Color COLOR_ATLAS = Color(0.78653, 0.812835, 0.832031);
-
- if (tileset.is_null())
- return;
- if (!get_current_texture().is_valid())
+ if (tileset.is_null() || !get_current_texture().is_valid())
return;
+ const Color COLOR_AUTOTILE = Color(0.3, 0.6, 1);
+ const Color COLOR_SINGLE = Color(1, 1, 0.3);
+ const Color COLOR_ATLAS = Color(0.8, 0.8, 0.8);
+ const Color COLOR_SUBDIVISION = Color(0.3, 0.7, 0.6);
+
+ draw_handles = false;
+
draw_highlight_current_tile();
draw_grid_snap();
@@ -808,10 +856,12 @@ void TileSetEditor::_on_workspace_draw() {
spin_priority->set_suffix(" / " + String::num(total, 0));
draw_highlight_subtile(edited_shape_coord, queue_others);
} break;
+ case EDITMODE_Z_INDEX: {
+ spin_z_index->set_value(tileset->autotile_get_z_index(get_current_tile(), edited_shape_coord));
+ draw_highlight_subtile(edited_shape_coord);
+ } break;
default: {}
}
-
- draw_tile_subdivision(get_current_tile(), Color(0.347214, 0.722656, 0.617063));
}
RID current_texture_rid = get_current_texture()->get_rid();
@@ -819,7 +869,7 @@ void TileSetEditor::_on_workspace_draw() {
tileset->get_tile_list(tiles);
for (List<int>::Element *E = tiles->front(); E; E = E->next()) {
int t_id = E->get();
- if (tileset->tile_get_texture(t_id)->get_rid() == current_texture_rid && (t_id != get_current_tile() || edit_mode != EDITMODE_REGION)) {
+ if (tileset->tile_get_texture(t_id)->get_rid() == current_texture_rid && (t_id != get_current_tile() || edit_mode != EDITMODE_REGION || workspace_mode != WORKSPACE_EDIT)) {
Rect2i region = tileset->tile_get_region(t_id);
region.position += WORKSPACE_MARGIN;
Color c;
@@ -829,10 +879,11 @@ void TileSetEditor::_on_workspace_draw() {
c = COLOR_AUTOTILE;
else if (tileset->tile_get_tile_mode(t_id) == TileSet::ATLAS_TILE)
c = COLOR_ATLAS;
- draw_tile_subdivision(t_id, Color(0.347214, 0.722656, 0.617063, 0.5));
+ draw_tile_subdivision(t_id, COLOR_SUBDIVISION);
workspace->draw_rect(region, c, false);
}
}
+
if (edit_mode == EDITMODE_REGION) {
if (workspace_mode != WORKSPACE_EDIT) {
Rect2i region = edited_region;
@@ -847,6 +898,9 @@ void TileSetEditor::_on_workspace_draw() {
draw_edited_region_subdivision();
} else {
int t_id = get_current_tile();
+ if (t_id < 0)
+ return;
+
Rect2i region;
if (draw_edited_region)
region = edited_region;
@@ -854,6 +908,12 @@ void TileSetEditor::_on_workspace_draw() {
region = tileset->tile_get_region(t_id);
region.position += WORKSPACE_MARGIN;
}
+
+ if (draw_edited_region)
+ draw_edited_region_subdivision();
+ else
+ draw_tile_subdivision(t_id, COLOR_SUBDIVISION);
+
Color c;
if (tileset->tile_get_tile_mode(t_id) == TileSet::SINGLE_TILE)
c = COLOR_SINGLE;
@@ -861,42 +921,36 @@ void TileSetEditor::_on_workspace_draw() {
c = COLOR_AUTOTILE;
else if (tileset->tile_get_tile_mode(t_id) == TileSet::ATLAS_TILE)
c = COLOR_ATLAS;
- if (draw_edited_region)
- draw_edited_region_subdivision();
- else
- draw_tile_subdivision(t_id, Color(0.347214, 0.722656, 0.617063, 1));
workspace->draw_rect(region, c, false);
}
}
+
workspace_overlay->update();
}
void TileSetEditor::_on_workspace_process() {
- float a = tile_names_opacity;
- if (Input::get_singleton()->is_key_pressed(KEY_ALT) || tools[VISIBLE_INFO]->is_pressed()) {
- a += get_tree()->get_idle_process_time() * 2;
- } else {
- a -= get_tree()->get_idle_process_time() * 2;
- }
- a = CLAMP(a, 0, 1);
- if (a != tile_names_opacity)
+ if (Input::get_singleton()->is_key_pressed(KEY_ALT) || tools[VISIBLE_INFO]->is_pressed()) {
+ if (!tile_names_visible) {
+ tile_names_visible = true;
+ workspace_overlay->update();
+ }
+ } else if (tile_names_visible) {
+ tile_names_visible = false;
workspace_overlay->update();
- tile_names_opacity = a;
+ }
}
void TileSetEditor::_on_workspace_overlay_draw() {
- if (!tileset.is_valid())
- return;
- if (!get_current_texture().is_valid())
+ if (!tileset.is_valid() || !get_current_texture().is_valid())
return;
const Color COLOR_AUTOTILE = Color(0.266373, 0.565288, 0.988281);
const Color COLOR_SINGLE = Color(0.988281, 0.909323, 0.266373);
const Color COLOR_ATLAS = Color(0.78653, 0.812835, 0.832031);
- if (tile_names_opacity > 0) {
+ if (tile_names_visible) {
RID current_texture_rid = get_current_texture()->get_rid();
List<int> *tiles = new List<int>();
tileset->get_tile_list(tiles);
@@ -913,13 +967,12 @@ void TileSetEditor::_on_workspace_overlay_draw() {
c = COLOR_AUTOTILE;
else if (tileset->tile_get_tile_mode(t_id) == TileSet::ATLAS_TILE)
c = COLOR_ATLAS;
- c.a = tile_names_opacity;
String tile_id_name = String::num(t_id, 0) + ": " + tileset->tile_get_name(t_id);
Ref<Font> font = get_font("font", "Label");
region.set_size(font->get_string_size(tile_id_name));
workspace_overlay->draw_rect(region, c);
region.position.y += region.size.y - 2;
- c = Color(0.1, 0.1, 0.1, tile_names_opacity);
+ c = Color(0.1, 0.1, 0.1);
workspace_overlay->draw_string(font, region.position, tile_id_name, c);
}
}
@@ -937,11 +990,9 @@ void TileSetEditor::_on_workspace_overlay_draw() {
}
}
-#define MIN_DISTANCE_SQUARED 6
void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
- if (tileset.is_null())
- return;
- if (!get_current_texture().is_valid())
+
+ if (tileset.is_null() || !get_current_texture().is_valid())
return;
static bool dragging;
@@ -979,11 +1030,9 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
}
// Mouse Wheel Event
- const int _mouse_button_index = mb->get_button_index();
- if (_mouse_button_index == BUTTON_WHEEL_UP && mb->get_control()) {
+ if (mb->get_button_index() == BUTTON_WHEEL_UP && mb->is_pressed() && mb->get_control()) {
_zoom_in();
-
- } else if (_mouse_button_index == BUTTON_WHEEL_DOWN && mb->get_control()) {
+ } else if (mb->get_button_index() == BUTTON_WHEEL_DOWN && mb->is_pressed() && mb->get_control()) {
_zoom_out();
}
}
@@ -1019,25 +1068,49 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
edited_region.position -= WORKSPACE_MARGIN;
if (!edited_region.has_no_area()) {
if (get_current_tile() >= 0 && workspace_mode == WORKSPACE_EDIT) {
- tileset->tile_set_region(get_current_tile(), edited_region);
+ undo_redo->create_action(TTR("Set Tile Region"));
+ undo_redo->add_do_method(tileset.ptr(), "tile_set_region", get_current_tile(), edited_region);
+ undo_redo->add_undo_method(tileset.ptr(), "tile_set_region", get_current_tile(), tileset->tile_get_region(get_current_tile()));
+ edited_region = Rect2();
+ undo_redo->add_do_method(workspace, "update");
+ undo_redo->add_undo_method(workspace, "update");
+ undo_redo->add_do_method(workspace_overlay, "update");
+ undo_redo->add_undo_method(workspace_overlay, "update");
+ undo_redo->commit_action();
} else {
int t_id = tileset->get_last_unused_tile_id();
- tileset->create_tile(t_id);
- tileset->tile_set_texture(t_id, get_current_texture());
- tileset->tile_set_region(t_id, edited_region);
- tileset->tile_set_name(t_id, get_current_texture()->get_path().get_file() + " " + String::num(t_id, 0));
+ undo_redo->create_action(TTR("Create Tile"));
+ undo_redo->add_do_method(tileset.ptr(), "create_tile", t_id);
+ undo_redo->add_undo_method(tileset.ptr(), "remove_tile", t_id);
+ undo_redo->add_undo_method(this, "_validate_current_tile_id");
+ undo_redo->add_do_method(tileset.ptr(), "tile_set_texture", t_id, get_current_texture());
+ undo_redo->add_do_method(tileset.ptr(), "tile_set_region", t_id, edited_region);
+ undo_redo->add_do_method(tileset.ptr(), "tile_set_name", t_id, get_current_texture()->get_path().get_file() + " " + String::num(t_id, 0));
if (workspace_mode != WORKSPACE_CREATE_SINGLE) {
- tileset->autotile_set_size(t_id, snap_step);
- tileset->autotile_set_spacing(t_id, snap_separation.x);
- tileset->tile_set_tile_mode(t_id, workspace_mode == WORKSPACE_CREATE_AUTOTILE ? TileSet::AUTO_TILE : TileSet::ATLAS_TILE);
+ undo_redo->add_do_method(tileset.ptr(), "autotile_set_size", t_id, snap_step);
+ undo_redo->add_do_method(tileset.ptr(), "autotile_set_spacing", t_id, snap_separation.x);
+ undo_redo->add_do_method(tileset.ptr(), "tile_set_tile_mode", t_id, workspace_mode == WORKSPACE_CREATE_AUTOTILE ? TileSet::AUTO_TILE : TileSet::ATLAS_TILE);
}
- set_current_tile(t_id);
+
tool_workspacemode[WORKSPACE_EDIT]->set_pressed(true);
+ tool_editmode[EDITMODE_COLLISION]->set_pressed(true);
+ edit_mode = EDITMODE_COLLISION;
+ edited_region = Rect2();
+
+ undo_redo->add_do_method(workspace, "update");
+ undo_redo->add_undo_method(workspace, "update");
+ undo_redo->add_do_method(workspace_overlay, "update");
+ undo_redo->add_undo_method(workspace_overlay, "update");
+ undo_redo->commit_action();
+
+ set_current_tile(t_id);
_on_workspace_mode_changed(WORKSPACE_EDIT);
}
+ } else {
+ edited_region = Rect2();
+ workspace->update();
+ workspace_overlay->update();
}
- workspace->update();
- workspace_overlay->update();
return;
}
} else if (mm.is_valid()) {
@@ -1050,8 +1123,8 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
}
}
}
- if (workspace_mode == WORKSPACE_EDIT) {
+ if (workspace_mode == WORKSPACE_EDIT) {
if (get_current_tile() >= 0) {
int spacing = tileset->autotile_get_spacing(get_current_tile());
Vector2 size = tileset->autotile_get_size(get_current_tile());
@@ -1060,13 +1133,12 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
if (mb.is_valid()) {
if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT && current_tile_region.has_point(mb->get_position())) {
Vector2 coord((int)((mb->get_position().x - current_tile_region.position.x) / (spacing + size.x)), (int)((mb->get_position().y - current_tile_region.position.y) / (spacing + size.y)));
- tileset->autotile_set_icon_coordinate(get_current_tile(), coord);
- Rect2 region = tileset->tile_get_region(get_current_tile());
- region.size = size;
- coord.x *= (spacing + size.x);
- coord.y *= (spacing + size.y);
- region.position += coord;
- workspace->update();
+ undo_redo->create_action(TTR("Set Tile Icon"));
+ undo_redo->add_do_method(tileset.ptr(), "autotile_set_icon_coordinate", get_current_tile(), coord);
+ undo_redo->add_undo_method(tileset.ptr(), "autotile_set_icon_coordinate", get_current_tile(), tileset->autotile_get_icon_coordinate(get_current_tile()));
+ undo_redo->add_do_method(workspace, "update");
+ undo_redo->add_undo_method(workspace, "update");
+ undo_redo->commit_action();
}
}
} break;
@@ -1124,14 +1196,22 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
}
}
}
- uint16_t mask = tileset->autotile_get_bitmask(get_current_tile(), coord);
+
+ uint16_t old_mask = tileset->autotile_get_bitmask(get_current_tile(), coord);
+ uint16_t new_mask = old_mask;
if (erasing) {
- mask &= ~bit;
+ new_mask &= ~bit;
} else {
- mask |= bit;
+ new_mask |= bit;
+ }
+ if (old_mask != new_mask) {
+ undo_redo->create_action(TTR("Edit Tile Bitmask"));
+ undo_redo->add_do_method(tileset.ptr(), "autotile_set_bitmask", get_current_tile(), coord, new_mask);
+ undo_redo->add_undo_method(tileset.ptr(), "autotile_set_bitmask", get_current_tile(), coord, old_mask);
+ undo_redo->add_do_method(workspace, "update");
+ undo_redo->add_undo_method(workspace, "update");
+ undo_redo->commit_action();
}
- tileset->autotile_set_bitmask(get_current_tile(), coord, mask);
- workspace->update();
}
} else {
if ((erasing && mb->get_button_index() == BUTTON_RIGHT) || (!erasing && mb->get_button_index() == BUTTON_LEFT)) {
@@ -1187,34 +1267,44 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
}
}
}
- uint16_t mask = tileset->autotile_get_bitmask(get_current_tile(), coord);
+
+ uint16_t old_mask = tileset->autotile_get_bitmask(get_current_tile(), coord);
+ uint16_t new_mask = old_mask;
if (erasing) {
- mask &= ~bit;
+ new_mask &= ~bit;
} else {
- mask |= bit;
+ new_mask |= bit;
+ }
+ if (old_mask != new_mask) {
+ undo_redo->create_action(TTR("Edit Tile Bitmask"));
+ undo_redo->add_do_method(tileset.ptr(), "autotile_set_bitmask", get_current_tile(), coord, new_mask);
+ undo_redo->add_undo_method(tileset.ptr(), "autotile_set_bitmask", get_current_tile(), coord, old_mask);
+ undo_redo->add_do_method(workspace, "update");
+ undo_redo->add_undo_method(workspace, "update");
+ undo_redo->commit_action();
}
- tileset->autotile_set_bitmask(get_current_tile(), coord, mask);
- workspace->update();
}
}
} break;
case EDITMODE_COLLISION:
case EDITMODE_OCCLUSION:
case EDITMODE_NAVIGATION:
- case EDITMODE_PRIORITY: {
+ case EDITMODE_PRIORITY:
+ case EDITMODE_Z_INDEX: {
Vector2 shape_anchor = Vector2(0, 0);
if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::AUTO_TILE || tileset->tile_get_tile_mode(get_current_tile()) == TileSet::ATLAS_TILE) {
shape_anchor = edited_shape_coord;
shape_anchor.x *= (size.x + spacing);
shape_anchor.y *= (size.y + spacing);
}
+ const real_t grab_threshold = EDITOR_GET("editors/poly_editor/point_grab_radius");
shape_anchor += current_tile_region.position;
if (tools[TOOL_SELECT]->is_pressed()) {
if (mb.is_valid()) {
if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
if (edit_mode != EDITMODE_PRIORITY && current_shape.size() > 0) {
for (int i = 0; i < current_shape.size(); i++) {
- if ((current_shape[i] - mb->get_position()).length_squared() <= MIN_DISTANCE_SQUARED) {
+ if ((current_shape[i] - mb->get_position()).length_squared() <= grab_threshold) {
dragging_point = i;
workspace->update();
return;
@@ -1225,20 +1315,7 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
Vector2 coord((int)((mb->get_position().x - current_tile_region.position.x) / (spacing + size.x)), (int)((mb->get_position().y - current_tile_region.position.y) / (spacing + size.y)));
if (edited_shape_coord != coord) {
edited_shape_coord = coord;
- edited_occlusion_shape = tileset->autotile_get_light_occluder(get_current_tile(), edited_shape_coord);
- edited_navigation_shape = tileset->autotile_get_navigation_polygon(get_current_tile(), edited_shape_coord);
- Vector<TileSet::ShapeData> sd = tileset->tile_get_shapes(get_current_tile());
- bool found_collision_shape = false;
- for (int i = 0; i < sd.size(); i++) {
- if (sd[i].autotile_coord == coord) {
- edited_collision_shape = sd[i].shape;
- found_collision_shape = true;
- break;
- }
- }
- if (!found_collision_shape)
- edited_collision_shape = Ref<ConvexPolygonShape2D>(NULL);
- select_coord(edited_shape_coord);
+ _select_edited_shape_coord();
}
}
workspace->update();
@@ -1257,9 +1334,12 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
points.push_back(p - shape_anchor);
}
- edited_collision_shape->set_points(points);
-
- workspace->update();
+ undo_redo->create_action(TTR("Edit Collision Polygon"));
+ undo_redo->add_do_method(edited_collision_shape.ptr(), "set_points", points);
+ undo_redo->add_undo_method(edited_collision_shape.ptr(), "set_points", edited_collision_shape->get_points());
+ undo_redo->add_do_method(this, "_select_edited_shape_coord");
+ undo_redo->add_undo_method(this, "_select_edited_shape_coord");
+ undo_redo->commit_action();
}
} else if (edit_mode == EDITMODE_OCCLUSION) {
if (dragging_point >= 0) {
@@ -1274,9 +1354,13 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
}
w = PoolVector<Vector2>::Write();
- edited_occlusion_shape->set_polygon(polygon);
- workspace->update();
+ undo_redo->create_action(TTR("Edit Occlusion Polygon"));
+ undo_redo->add_do_method(edited_occlusion_shape.ptr(), "set_polygon", polygon);
+ undo_redo->add_undo_method(edited_occlusion_shape.ptr(), "set_polygon", edited_occlusion_shape->get_polygon());
+ undo_redo->add_do_method(this, "_select_edited_shape_coord");
+ undo_redo->add_undo_method(this, "_select_edited_shape_coord");
+ undo_redo->commit_action();
}
} else if (edit_mode == EDITMODE_NAVIGATION) {
if (dragging_point >= 0) {
@@ -1293,10 +1377,15 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
}
w = PoolVector<Vector2>::Write();
- edited_navigation_shape->set_vertices(polygon);
- edited_navigation_shape->add_polygon(indices);
- workspace->update();
+ undo_redo->create_action(TTR("Edit Navigation Polygon"));
+ undo_redo->add_do_method(edited_navigation_shape.ptr(), "set_vertices", polygon);
+ undo_redo->add_undo_method(edited_navigation_shape.ptr(), "set_vertices", edited_navigation_shape->get_vertices());
+ undo_redo->add_do_method(edited_navigation_shape.ptr(), "add_polygon", indices);
+ undo_redo->add_undo_method(edited_navigation_shape.ptr(), "add_polygon", edited_navigation_shape->get_polygon(0));
+ undo_redo->add_do_method(this, "_select_edited_shape_coord");
+ undo_redo->add_undo_method(this, "_select_edited_shape_coord");
+ undo_redo->commit_action();
}
}
}
@@ -1307,14 +1396,13 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
}
}
} else if (tools[SHAPE_NEW_POLYGON]->is_pressed()) {
-
if (mb.is_valid()) {
if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
Vector2 pos = mb->get_position();
pos = snap_point(pos);
if (creating_shape) {
if (current_shape.size() > 0) {
- if ((pos - current_shape[0]).length_squared() <= MIN_DISTANCE_SQUARED) {
+ if ((pos - current_shape[0]).length_squared() <= grab_threshold) {
if (current_shape.size() > 2) {
close_shape(shape_anchor);
workspace->update();
@@ -1325,60 +1413,16 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
current_shape.push_back(pos);
workspace->update();
} else {
- int t_id = get_current_tile();
- if (t_id >= 0) {
- if (edit_mode == EDITMODE_COLLISION) {
- Vector<TileSet::ShapeData> sd = tileset->tile_get_shapes(t_id);
- for (int i = 0; i < sd.size(); i++) {
- if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::SINGLE_TILE || sd[i].autotile_coord == edited_shape_coord) {
- Ref<ConvexPolygonShape2D> shape = sd[i].shape;
-
- if (!shape.is_null()) {
- sd.remove(i);
- tileset->tile_set_shapes(get_current_tile(), sd);
- edited_collision_shape = Ref<Shape2D>();
- workspace->update();
- }
- break;
- }
- }
- } else if (edit_mode == EDITMODE_OCCLUSION) {
- if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::AUTO_TILE || tileset->tile_get_tile_mode(get_current_tile()) == TileSet::ATLAS_TILE) {
- Map<Vector2, Ref<OccluderPolygon2D> > map = tileset->autotile_get_light_oclusion_map(t_id);
- for (Map<Vector2, Ref<OccluderPolygon2D> >::Element *E = map.front(); E; E = E->next()) {
- if (E->key() == edited_shape_coord) {
- tileset->autotile_set_light_occluder(get_current_tile(), Ref<OccluderPolygon2D>(), edited_shape_coord);
- break;
- }
- }
- } else
- tileset->tile_set_light_occluder(t_id, Ref<OccluderPolygon2D>());
-
- edited_occlusion_shape = Ref<OccluderPolygon2D>();
- workspace->update();
- } else if (edit_mode == EDITMODE_NAVIGATION) {
- if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::AUTO_TILE || tileset->tile_get_tile_mode(get_current_tile()) == TileSet::ATLAS_TILE) {
- Map<Vector2, Ref<NavigationPolygon> > map = tileset->autotile_get_navigation_map(t_id);
- for (Map<Vector2, Ref<NavigationPolygon> >::Element *E = map.front(); E; E = E->next()) {
- if (E->key() == edited_shape_coord) {
- tileset->autotile_set_navigation_polygon(t_id, Ref<NavigationPolygon>(), edited_shape_coord);
- break;
- }
- }
- } else
- tileset->tile_set_navigation_polygon(t_id, Ref<NavigationPolygon>());
- edited_navigation_shape = Ref<NavigationPolygon>();
- workspace->update();
- }
- }
-
creating_shape = true;
current_shape.resize(0);
current_shape.push_back(snap_point(pos));
+ workspace->update();
}
- } else if (mb->is_pressed() && mb->get_button_index() == BUTTON_RIGHT && current_shape.size() > 2) {
+ } else if (mb->is_pressed() && mb->get_button_index() == BUTTON_RIGHT) {
if (creating_shape) {
- close_shape(shape_anchor);
+ creating_shape = false;
+ _select_edited_shape_coord();
+ workspace->update();
}
}
} else if (mm.is_valid()) {
@@ -1398,14 +1442,27 @@ void TileSetEditor::_on_tool_clicked(int p_tool) {
if (p_tool == BITMASK_COPY) {
bitmask_map_copy = tileset->autotile_get_bitmask_map(get_current_tile());
} else if (p_tool == BITMASK_PASTE) {
- tileset->autotile_clear_bitmask_map(get_current_tile());
+ undo_redo->create_action(TTR("Paste Tile Bitmask"));
+ undo_redo->add_do_method(tileset.ptr(), "autotile_clear_bitmask_map", get_current_tile());
+ undo_redo->add_undo_method(tileset.ptr(), "autotile_clear_bitmask_map", get_current_tile());
for (Map<Vector2, uint16_t>::Element *E = bitmask_map_copy.front(); E; E = E->next()) {
- tileset->autotile_set_bitmask(get_current_tile(), E->key(), E->value());
+ undo_redo->add_do_method(tileset.ptr(), "autotile_set_bitmask", get_current_tile(), E->key(), E->value());
}
- workspace->update();
+ for (Map<Vector2, uint16_t>::Element *E = tileset->autotile_get_bitmask_map(get_current_tile()).front(); E; E = E->next()) {
+ undo_redo->add_undo_method(tileset.ptr(), "autotile_set_bitmask", get_current_tile(), E->key(), E->value());
+ }
+ undo_redo->add_do_method(workspace, "update");
+ undo_redo->add_undo_method(workspace, "update");
+ undo_redo->commit_action();
} else if (p_tool == BITMASK_CLEAR) {
- tileset->autotile_clear_bitmask_map(get_current_tile());
- workspace->update();
+ undo_redo->create_action(TTR("Clear Tile Bitmask"));
+ undo_redo->add_do_method(tileset.ptr(), "autotile_clear_bitmask_map", get_current_tile());
+ for (Map<Vector2, uint16_t>::Element *E = tileset->autotile_get_bitmask_map(get_current_tile()).front(); E; E = E->next()) {
+ undo_redo->add_undo_method(tileset.ptr(), "autotile_set_bitmask", get_current_tile(), E->key(), E->value());
+ }
+ undo_redo->add_do_method(workspace, "update");
+ undo_redo->add_undo_method(workspace, "update");
+ undo_redo->commit_action();
} else if (p_tool == SHAPE_DELETE) {
if (creating_shape) {
creating_shape = false;
@@ -1414,10 +1471,17 @@ void TileSetEditor::_on_tool_clicked(int p_tool) {
} else {
switch (edit_mode) {
case EDITMODE_REGION: {
- if (workspace_mode == WORKSPACE_EDIT && get_current_tile() >= 0) {
- tileset->remove_tile(get_current_tile());
- workspace->update();
- workspace_overlay->update();
+ int t_id = get_current_tile();
+ if (workspace_mode == WORKSPACE_EDIT && t_id >= 0) {
+ undo_redo->create_action(TTR("Remove Tile"));
+ undo_redo->add_do_method(tileset.ptr(), "remove_tile", t_id);
+ _undo_tile_removal(t_id);
+ undo_redo->add_do_method(this, "_validate_current_tile_id");
+ undo_redo->add_do_method(workspace, "update");
+ undo_redo->add_undo_method(workspace, "update");
+ undo_redo->add_do_method(workspace_overlay, "update");
+ undo_redo->add_undo_method(workspace_overlay, "update");
+ undo_redo->commit_action();
}
tool_workspacemode[WORKSPACE_EDIT]->set_pressed(true);
workspace_mode = WORKSPACE_EDIT;
@@ -1425,48 +1489,55 @@ void TileSetEditor::_on_tool_clicked(int p_tool) {
} break;
case EDITMODE_COLLISION: {
if (!edited_collision_shape.is_null()) {
- Vector<TileSet::ShapeData> sd = tileset->tile_get_shapes(get_current_tile());
- int index = -1;
+ // Necessary to get the version that returns a Array instead of a Vector.
+ Array sd = tileset->call("tile_get_shapes", get_current_tile());
for (int i = 0; i < sd.size(); i++) {
- if (sd[i].shape == edited_collision_shape) {
- index = i;
+ if (sd[i].get("shape") == edited_collision_shape) {
+ undo_redo->create_action(TTR("Remove Collision Polygon"));
+ undo_redo->add_undo_method(tileset.ptr(), "tile_set_shapes", get_current_tile(), sd.duplicate());
+ sd.remove(i);
+ undo_redo->add_do_method(tileset.ptr(), "tile_set_shapes", get_current_tile(), sd);
+ undo_redo->add_do_method(this, "_select_edited_shape_coord");
+ undo_redo->add_undo_method(this, "_select_edited_shape_coord");
+ undo_redo->commit_action();
break;
}
}
- if (index >= 0) {
- sd.remove(index);
- tileset->tile_set_shapes(get_current_tile(), sd);
- edited_collision_shape = Ref<Shape2D>();
- current_shape.resize(0);
- workspace->update();
+ }
+ } break;
+ case EDITMODE_OCCLUSION: {
+ if (!edited_occlusion_shape.is_null()) {
+ undo_redo->create_action(TTR("Remove Occlusion Polygon"));
+ if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::SINGLE_TILE) {
+ undo_redo->add_do_method(tileset.ptr(), "tile_set_light_occluder", get_current_tile(), Ref<OccluderPolygon2D>());
+ undo_redo->add_undo_method(tileset.ptr(), "tile_set_light_occluder", get_current_tile(), tileset->tile_get_light_occluder(get_current_tile()));
+ } else {
+ undo_redo->add_do_method(tileset.ptr(), "autotile_set_light_occluder", get_current_tile(), Ref<OccluderPolygon2D>(), edited_shape_coord);
+ undo_redo->add_undo_method(tileset.ptr(), "autotile_set_light_occluder", get_current_tile(), tileset->autotile_get_light_occluder(get_current_tile(), edited_shape_coord), edited_shape_coord);
}
+ undo_redo->add_do_method(this, "_select_edited_shape_coord");
+ undo_redo->add_undo_method(this, "_select_edited_shape_coord");
+ undo_redo->commit_action();
}
} break;
case EDITMODE_NAVIGATION: {
if (!edited_navigation_shape.is_null()) {
- tileset->autotile_set_navigation_polygon(get_current_tile(), Ref<NavigationPolygon>(), edited_shape_coord);
- edited_navigation_shape = Ref<NavigationPolygon>();
- current_shape.resize(0);
- workspace->update();
- }
- } break;
- case EDITMODE_OCCLUSION: {
- if (!edited_occlusion_shape.is_null()) {
- tileset->autotile_set_light_occluder(get_current_tile(), Ref<OccluderPolygon2D>(), edited_shape_coord);
- edited_occlusion_shape = Ref<OccluderPolygon2D>();
- current_shape.resize(0);
- workspace->update();
+ undo_redo->create_action(TTR("Remove Navigation Polygon"));
+ if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::SINGLE_TILE) {
+ undo_redo->add_do_method(tileset.ptr(), "tile_set_navigation_polygon", get_current_tile(), Ref<NavigationPolygon>());
+ undo_redo->add_undo_method(tileset.ptr(), "tile_set_navigation_polygon", get_current_tile(), tileset->tile_get_navigation_polygon(get_current_tile()));
+ } else {
+ undo_redo->add_do_method(tileset.ptr(), "autotile_set_navigation_polygon", get_current_tile(), Ref<NavigationPolygon>(), edited_shape_coord);
+ undo_redo->add_undo_method(tileset.ptr(), "autotile_set_navigation_polygon", get_current_tile(), tileset->autotile_get_navigation_polygon(get_current_tile(), edited_shape_coord), edited_shape_coord);
+ }
+ undo_redo->add_do_method(this, "_select_edited_shape_coord");
+ undo_redo->add_undo_method(this, "_select_edited_shape_coord");
+ undo_redo->commit_action();
}
} break;
default: {}
}
}
- } else if (p_tool == ZOOM_OUT) {
- _zoom_out();
- } else if (p_tool == ZOOM_1) {
- _reset_zoom();
- } else if (p_tool == ZOOM_IN) {
- _zoom_in();
} else if (p_tool == TOOL_SELECT) {
if (creating_shape) {
// Cancel Creation
@@ -1478,8 +1549,27 @@ void TileSetEditor::_on_tool_clicked(int p_tool) {
}
void TileSetEditor::_on_priority_changed(float val) {
- tileset->autotile_set_subtile_priority(get_current_tile(), edited_shape_coord, (int)val);
- workspace->update();
+ if ((int)val == tileset->autotile_get_subtile_priority(get_current_tile(), edited_shape_coord))
+ return;
+
+ undo_redo->create_action(TTR("Edit Tile Priority"));
+ undo_redo->add_do_method(tileset.ptr(), "autotile_set_subtile_priority", get_current_tile(), edited_shape_coord, (int)val);
+ undo_redo->add_undo_method(tileset.ptr(), "autotile_set_subtile_priority", get_current_tile(), edited_shape_coord, tileset->autotile_get_subtile_priority(get_current_tile(), edited_shape_coord));
+ undo_redo->add_do_method(workspace, "update");
+ undo_redo->add_undo_method(workspace, "update");
+ undo_redo->commit_action();
+}
+
+void TileSetEditor::_on_z_index_changed(float val) {
+ if ((int)val == tileset->autotile_get_z_index(get_current_tile(), edited_shape_coord))
+ return;
+
+ undo_redo->create_action(TTR("Edit Tile Z Index"));
+ undo_redo->add_do_method(tileset.ptr(), "autotile_set_z_index", get_current_tile(), edited_shape_coord, (int)val);
+ undo_redo->add_undo_method(tileset.ptr(), "autotile_set_z_index", get_current_tile(), edited_shape_coord, tileset->autotile_get_z_index(get_current_tile(), edited_shape_coord));
+ undo_redo->add_do_method(workspace, "update");
+ undo_redo->add_undo_method(workspace, "update");
+ undo_redo->commit_action();
}
void TileSetEditor::_on_grid_snap_toggled(bool p_val) {
@@ -1505,6 +1595,63 @@ void TileSetEditor::_set_snap_sep(Vector2 p_val) {
workspace->update();
}
+void TileSetEditor::_validate_current_tile_id() {
+ if (get_current_tile() >= 0 && !tileset->has_tile(get_current_tile()))
+ set_current_tile(-1);
+}
+
+void TileSetEditor::_select_edited_shape_coord() {
+ select_coord(edited_shape_coord);
+}
+
+void TileSetEditor::_undo_tile_removal(int p_id) {
+ undo_redo->add_undo_method(tileset.ptr(), "create_tile", p_id);
+ undo_redo->add_undo_method(tileset.ptr(), "tile_set_name", p_id, tileset->tile_get_name(p_id));
+ undo_redo->add_undo_method(tileset.ptr(), "tile_set_normal_map", p_id, tileset->tile_get_normal_map(p_id));
+ undo_redo->add_undo_method(tileset.ptr(), "tile_set_texture_offset", p_id, tileset->tile_get_texture_offset(p_id));
+ undo_redo->add_undo_method(tileset.ptr(), "tile_set_material", p_id, tileset->tile_get_material(p_id));
+ undo_redo->add_undo_method(tileset.ptr(), "tile_set_modulate", p_id, tileset->tile_get_modulate(p_id));
+ undo_redo->add_undo_method(tileset.ptr(), "tile_set_occluder_offset", p_id, tileset->tile_get_occluder_offset(p_id));
+ undo_redo->add_undo_method(tileset.ptr(), "tile_set_navigation_polygon_offset", p_id, tileset->tile_get_navigation_polygon_offset(p_id));
+ undo_redo->add_undo_method(tileset.ptr(), "tile_set_shape_offset", p_id, 0, tileset->tile_get_shape_offset(p_id, 0));
+ undo_redo->add_undo_method(tileset.ptr(), "tile_set_shape_transform", p_id, 0, tileset->tile_get_shape_transform(p_id, 0));
+ undo_redo->add_undo_method(tileset.ptr(), "tile_set_z_index", p_id, tileset->tile_get_z_index(p_id));
+ undo_redo->add_undo_method(tileset.ptr(), "tile_set_texture", p_id, tileset->tile_get_texture(p_id));
+ undo_redo->add_undo_method(tileset.ptr(), "tile_set_region", p_id, tileset->tile_get_region(p_id));
+ // Necessary to get the version that returns a Array instead of a Vector.
+ undo_redo->add_undo_method(tileset.ptr(), "tile_set_shapes", p_id, tileset->call("tile_get_shapes", p_id));
+ if (tileset->tile_get_tile_mode(p_id) == TileSet::SINGLE_TILE) {
+ undo_redo->add_undo_method(tileset.ptr(), "tile_set_light_occluder", p_id, tileset->tile_get_light_occluder(p_id));
+ undo_redo->add_undo_method(tileset.ptr(), "tile_set_navigation_polygon", p_id, tileset->tile_get_navigation_polygon(p_id));
+ } else {
+ Map<Vector2, Ref<OccluderPolygon2D> > oclusion_map = tileset->autotile_get_light_oclusion_map(p_id);
+ for (Map<Vector2, Ref<OccluderPolygon2D> >::Element *E = oclusion_map.front(); E; E = E->next()) {
+ undo_redo->add_undo_method(tileset.ptr(), "autotile_set_light_occluder", p_id, E->value(), E->key());
+ }
+ Map<Vector2, Ref<NavigationPolygon> > navigation_map = tileset->autotile_get_navigation_map(p_id);
+ for (Map<Vector2, Ref<NavigationPolygon> >::Element *E = navigation_map.front(); E; E = E->next()) {
+ undo_redo->add_undo_method(tileset.ptr(), "autotile_set_navigation_polygon", p_id, E->value(), E->key());
+ }
+ Map<Vector2, uint16_t> bitmask_map = tileset->autotile_get_bitmask_map(p_id);
+ for (Map<Vector2, uint16_t>::Element *E = bitmask_map.front(); E; E = E->next()) {
+ undo_redo->add_undo_method(tileset.ptr(), "autotile_set_bitmask", p_id, E->key(), E->value());
+ }
+ Map<Vector2, int> priority_map = tileset->autotile_get_priority_map(p_id);
+ for (Map<Vector2, int>::Element *E = priority_map.front(); E; E = E->next()) {
+ undo_redo->add_undo_method(tileset.ptr(), "autotile_set_subtile_priority", p_id, E->key(), E->value());
+ }
+ undo_redo->add_undo_method(tileset.ptr(), "autotile_set_icon_coordinate", p_id, tileset->autotile_get_icon_coordinate(p_id));
+ Map<Vector2, int> z_map = tileset->autotile_get_z_index_map(p_id);
+ for (Map<Vector2, int>::Element *E = z_map.front(); E; E = E->next()) {
+ undo_redo->add_undo_method(tileset.ptr(), "autotile_set_z_index", p_id, E->key(), E->value());
+ }
+ undo_redo->add_undo_method(tileset.ptr(), "tile_set_tile_mode", p_id, tileset->tile_get_tile_mode(p_id));
+ undo_redo->add_undo_method(tileset.ptr(), "autotile_set_size", p_id, tileset->autotile_get_size(p_id));
+ undo_redo->add_undo_method(tileset.ptr(), "autotile_set_spacing", p_id, tileset->autotile_get_spacing(p_id));
+ undo_redo->add_undo_method(tileset.ptr(), "autotile_set_bitmask_mode", p_id, tileset->autotile_get_bitmask_mode(p_id));
+ }
+}
+
void TileSetEditor::_zoom_in() {
float scale = workspace->get_scale().x;
if (scale < max_scale) {
@@ -1515,7 +1662,6 @@ void TileSetEditor::_zoom_in() {
}
}
void TileSetEditor::_zoom_out() {
-
float scale = workspace->get_scale().x;
if (scale > min_scale) {
scale /= scale_ratio;
@@ -1524,7 +1670,7 @@ void TileSetEditor::_zoom_out() {
workspace_overlay->set_custom_minimum_size(workspace->get_rect().size * scale);
}
}
-void TileSetEditor::_reset_zoom() {
+void TileSetEditor::_zoom_reset() {
workspace->set_scale(Vector2(1, 1));
workspace_container->set_custom_minimum_size(workspace->get_rect().size);
workspace_overlay->set_custom_minimum_size(workspace->get_rect().size);
@@ -1532,20 +1678,32 @@ void TileSetEditor::_reset_zoom() {
void TileSetEditor::draw_highlight_current_tile() {
- if (get_current_tile() >= 0) {
- Rect2 region = tileset->tile_get_region(get_current_tile());
- region.position += WORKSPACE_MARGIN;
- workspace->draw_rect(Rect2(0, 0, workspace->get_rect().size.x, region.position.y), Color(0.3, 0.3, 0.3, 0.3));
- workspace->draw_rect(Rect2(0, region.position.y, region.position.x, region.size.y), Color(0.3, 0.3, 0.3, 0.3));
- workspace->draw_rect(Rect2(region.position.x + region.size.x, region.position.y, workspace->get_rect().size.x - region.position.x - region.size.x, region.size.y), Color(0.3, 0.3, 0.3, 0.3));
- workspace->draw_rect(Rect2(0, region.position.y + region.size.y, workspace->get_rect().size.x, workspace->get_rect().size.y - region.size.y - region.position.y), Color(0.3, 0.3, 0.3, 0.3));
+ Color shadow_color = Color(0.3, 0.3, 0.3, 0.3);
+ if ((workspace_mode == WORKSPACE_EDIT && get_current_tile() >= 0) || !edited_region.has_no_area()) {
+ Rect2 region;
+ if (edited_region.has_no_area()) {
+ region = tileset->tile_get_region(get_current_tile());
+ region.position += WORKSPACE_MARGIN;
+ } else {
+ region = edited_region;
+ }
+
+ if (region.position.y >= 0)
+ workspace->draw_rect(Rect2(0, 0, workspace->get_rect().size.x, region.position.y), shadow_color);
+ if (region.position.x >= 0)
+ workspace->draw_rect(Rect2(0, MAX(0, region.position.y), region.position.x, MIN(workspace->get_rect().size.y - region.position.y, MIN(region.size.y, region.position.y + region.size.y))), shadow_color);
+ if (region.position.x + region.size.x <= workspace->get_rect().size.x)
+ workspace->draw_rect(Rect2(region.position.x + region.size.x, MAX(0, region.position.y), workspace->get_rect().size.x - region.position.x - region.size.x, MIN(workspace->get_rect().size.y - region.position.y, MIN(region.size.y, region.position.y + region.size.y))), shadow_color);
+ if (region.position.y + region.size.y <= workspace->get_rect().size.y)
+ workspace->draw_rect(Rect2(0, region.position.y + region.size.y, workspace->get_rect().size.x, workspace->get_rect().size.y - region.size.y - region.position.y), shadow_color);
} else {
- workspace->draw_rect(Rect2(Point2(0, 0), workspace->get_rect().size), Color(0.3, 0.3, 0.3, 0.3));
+ workspace->draw_rect(Rect2(Point2(0, 0), workspace->get_rect().size), shadow_color);
}
}
void TileSetEditor::draw_highlight_subtile(Vector2 coord, const Vector<Vector2> &other_highlighted) {
+ Color shadow_color = Color(0.3, 0.3, 0.3, 0.3);
Vector2 size = tileset->autotile_get_size(get_current_tile());
int spacing = tileset->autotile_get_spacing(get_current_tile());
Rect2 region = tileset->tile_get_region(get_current_tile());
@@ -1553,10 +1711,16 @@ void TileSetEditor::draw_highlight_subtile(Vector2 coord, const Vector<Vector2>
coord.y *= (size.y + spacing);
coord += region.position;
coord += WORKSPACE_MARGIN;
- workspace->draw_rect(Rect2(0, 0, workspace->get_rect().size.x, coord.y), Color(0.3, 0.3, 0.3, 0.3));
- workspace->draw_rect(Rect2(0, coord.y, coord.x, size.y), Color(0.3, 0.3, 0.3, 0.3));
- workspace->draw_rect(Rect2(coord.x + size.x, coord.y, workspace->get_rect().size.x - coord.x - size.x, size.y), Color(0.3, 0.3, 0.3, 0.3));
- workspace->draw_rect(Rect2(0, coord.y + size.y, workspace->get_rect().size.x, workspace->get_rect().size.y - size.y - coord.y), Color(0.3, 0.3, 0.3, 0.3));
+
+ if (coord.y >= 0)
+ workspace->draw_rect(Rect2(0, 0, workspace->get_rect().size.x, coord.y), shadow_color);
+ if (coord.x >= 0)
+ workspace->draw_rect(Rect2(0, MAX(0, coord.y), coord.x, MIN(workspace->get_rect().size.y - coord.y, MIN(size.y, coord.y + size.y))), shadow_color);
+ if (coord.x + size.x <= workspace->get_rect().size.x)
+ workspace->draw_rect(Rect2(coord.x + size.x, MAX(0, coord.y), workspace->get_rect().size.x - coord.x - size.x, MIN(workspace->get_rect().size.y - coord.y, MIN(size.y, coord.y + size.y))), shadow_color);
+ if (coord.y + size.y <= workspace->get_rect().size.y)
+ workspace->draw_rect(Rect2(0, coord.y + size.y, workspace->get_rect().size.x, workspace->get_rect().size.y - size.y - coord.y), shadow_color);
+
coord += Vector2(1, 1) / workspace->get_scale().x;
workspace->draw_rect(Rect2(coord, size - Vector2(2, 2) / workspace->get_scale().x), Color(1, 0, 0), false);
for (int i = 0; i < other_highlighted.size(); i++) {
@@ -1576,35 +1740,35 @@ void TileSetEditor::draw_tile_subdivision(int p_id, Color p_color) const {
Rect2 region = tileset->tile_get_region(p_id);
Size2 size = tileset->autotile_get_size(p_id);
int spacing = tileset->autotile_get_spacing(p_id);
- float j = 0;
+ float j = size.x;
+
while (j < region.size.x) {
- j += size.x;
if (spacing <= 0) {
workspace->draw_line(region.position + WORKSPACE_MARGIN + Point2(j, 0), region.position + WORKSPACE_MARGIN + Point2(j, region.size.y), c);
} else {
workspace->draw_rect(Rect2(region.position + WORKSPACE_MARGIN + Point2(j, 0), Size2(spacing, region.size.y)), c);
}
- j += spacing;
+ j += spacing + size.x;
}
- j = 0;
+ j = size.y;
while (j < region.size.y) {
- j += size.y;
if (spacing <= 0) {
workspace->draw_line(region.position + WORKSPACE_MARGIN + Point2(0, j), region.position + WORKSPACE_MARGIN + Point2(region.size.x, j), c);
} else {
workspace->draw_rect(Rect2(region.position + WORKSPACE_MARGIN + Point2(0, j), Size2(region.size.x, spacing)), c);
}
- j += spacing;
+ j += spacing + size.y;
}
}
}
void TileSetEditor::draw_edited_region_subdivision() const {
- Color c = Color(0.347214, 0.722656, 0.617063, 1);
+ Color c = Color(0.3, 0.7, 0.6);
Rect2 region = edited_region;
Size2 size;
int spacing;
bool draw;
+
if (workspace_mode == WORKSPACE_EDIT) {
int p_id = get_current_tile();
size = tileset->autotile_get_size(p_id);
@@ -1615,66 +1779,72 @@ void TileSetEditor::draw_edited_region_subdivision() const {
spacing = snap_separation.x;
draw = workspace_mode != WORKSPACE_CREATE_SINGLE;
}
- if (draw) {
- float j = 0;
+ if (draw) {
+ float j = size.x;
while (j < region.size.x) {
- j += size.x;
if (spacing <= 0) {
workspace->draw_line(region.position + Point2(j, 0), region.position + Point2(j, region.size.y), c);
} else {
workspace->draw_rect(Rect2(region.position + Point2(j, 0), Size2(spacing, region.size.y)), c);
}
- j += spacing;
+ j += spacing + size.x;
}
- j = 0;
+ j = size.y;
while (j < region.size.y) {
- j += size.y;
if (spacing <= 0) {
workspace->draw_line(region.position + Point2(0, j), region.position + Point2(region.size.x, j), c);
} else {
workspace->draw_rect(Rect2(region.position + Point2(0, j), Size2(region.size.x, spacing)), c);
}
- j += spacing;
+ j += spacing + size.y;
}
}
}
void TileSetEditor::draw_grid_snap() {
if (tools[TOOL_GRID_SNAP]->is_pressed()) {
- Color grid_color = Color(0.39, 0, 1, 0.2f);
+ Color grid_color = Color(0.4, 0, 1);
Size2 s = workspace->get_size();
- int width_count = (int)(s.width / (snap_step.x + snap_separation.x));
- int height_count = (int)(s.height / (snap_step.y + snap_separation.y));
+ int width_count = Math::floor((s.width - WORKSPACE_MARGIN.x) / (snap_step.x + snap_separation.x));
+ int height_count = Math::floor((s.height - WORKSPACE_MARGIN.y) / (snap_step.y + snap_separation.y));
+ int last_p = 0;
if (snap_step.x != 0) {
- int last_p = 0;
for (int i = 0; i <= width_count; i++) {
if (i == 0 && snap_offset.x != 0) {
last_p = snap_offset.x;
}
- if (snap_separation.x != 0 && i != 0) {
- workspace->draw_rect(Rect2(last_p, 0, snap_separation.x, s.height), grid_color);
- last_p += snap_separation.x;
- } else
+ if (snap_separation.x != 0) {
+ if (i != 0) {
+ workspace->draw_rect(Rect2(last_p, 0, snap_separation.x, s.height), grid_color);
+ last_p += snap_separation.x;
+ } else {
+ workspace->draw_rect(Rect2(last_p, 0, -snap_separation.x, s.height), grid_color);
+ }
+ } else {
workspace->draw_line(Point2(last_p, 0), Point2(last_p, s.height), grid_color);
-
+ }
last_p += snap_step.x;
}
}
-
+ last_p = 0;
if (snap_step.y != 0) {
- int last_p = 0;
for (int i = 0; i <= height_count; i++) {
if (i == 0 && snap_offset.y != 0) {
last_p = snap_offset.y;
}
- if (snap_separation.x != 0 && i != 0) {
- workspace->draw_rect(Rect2(0, last_p, s.width, snap_separation.y), grid_color);
- last_p += snap_separation.y;
- } else
+ if (snap_separation.x != 0) {
+ if (i != 0) {
+ workspace->draw_rect(Rect2(0, last_p, s.width, snap_separation.y), grid_color);
+ last_p += snap_separation.y;
+ } else {
+ workspace->draw_rect(Rect2(0, last_p, s.width, -snap_separation.y), grid_color);
+ }
+ } else {
workspace->draw_line(Point2(0, last_p), Point2(s.width, last_p), grid_color);
+ }
last_p += snap_step.y;
}
}
@@ -1687,8 +1857,6 @@ void TileSetEditor::draw_polygon_shapes() {
if (t_id < 0)
return;
- draw_handles = false;
-
switch (edit_mode) {
case EDITMODE_COLLISION: {
Vector<TileSet::ShapeData> sd = tileset->tile_get_shapes(t_id);
@@ -1718,7 +1886,7 @@ void TileSetEditor::draw_polygon_shapes() {
}
Vector<Vector2> polygon;
Vector<Color> colors;
- if (shape == edited_collision_shape && current_shape.size() > 2) {
+ if (!creating_shape && shape == edited_collision_shape && current_shape.size() > 2) {
for (int j = 0; j < current_shape.size(); j++) {
polygon.push_back(current_shape[j]);
colors.push_back(c_bg);
@@ -1732,11 +1900,14 @@ void TileSetEditor::draw_polygon_shapes() {
if (polygon.size() > 2) {
workspace->draw_polygon(polygon, colors);
}
+
if (coord == edited_shape_coord || tileset->tile_get_tile_mode(get_current_tile()) == TileSet::SINGLE_TILE) {
- for (int j = 0; j < shape->get_points().size() - 1; j++) {
- workspace->draw_line(shape->get_points()[j] + anchor, shape->get_points()[j + 1] + anchor, c_border, 1, true);
+ if (!creating_shape) {
+ for (int j = 0; j < polygon.size() - 1; j++) {
+ workspace->draw_line(polygon[j], polygon[j + 1], c_border, 1, true);
+ }
+ workspace->draw_line(polygon[polygon.size() - 1], polygon[0], c_border, 1, true);
}
-
if (shape == edited_collision_shape) {
draw_handles = true;
}
@@ -1755,16 +1926,25 @@ void TileSetEditor::draw_polygon_shapes() {
Vector<Color> colors;
Vector2 anchor = WORKSPACE_MARGIN;
anchor += tileset->tile_get_region(get_current_tile()).position;
- for (int j = 0; j < shape->get_polygon().size(); j++) {
- polygon.push_back(shape->get_polygon()[j] + anchor);
- colors.push_back(c_bg);
+ if (!creating_shape && shape == edited_occlusion_shape && current_shape.size() > 2) {
+ for (int j = 0; j < current_shape.size(); j++) {
+ polygon.push_back(current_shape[j]);
+ colors.push_back(c_bg);
+ }
+ } else {
+ for (int j = 0; j < shape->get_polygon().size(); j++) {
+ polygon.push_back(shape->get_polygon()[j] + anchor);
+ colors.push_back(c_bg);
+ }
}
workspace->draw_polygon(polygon, colors);
- for (int j = 0; j < shape->get_polygon().size() - 1; j++) {
- workspace->draw_line(shape->get_polygon()[j] + anchor, shape->get_polygon()[j + 1] + anchor, c_border, 1, true);
+ if (!creating_shape) {
+ for (int j = 0; j < polygon.size() - 1; j++) {
+ workspace->draw_line(polygon[j], polygon[j + 1], c_border, 1, true);
+ }
+ workspace->draw_line(polygon[polygon.size() - 1], polygon[0], c_border, 1, true);
}
- workspace->draw_line(shape->get_polygon()[shape->get_polygon().size() - 1] + anchor, shape->get_polygon()[0] + anchor, c_border, 1, true);
if (shape == edited_occlusion_shape) {
draw_handles = true;
}
@@ -1793,7 +1973,7 @@ void TileSetEditor::draw_polygon_shapes() {
}
Vector<Vector2> polygon;
Vector<Color> colors;
- if (shape == edited_occlusion_shape && current_shape.size() > 2) {
+ if (!creating_shape && shape == edited_occlusion_shape && current_shape.size() > 2) {
for (int j = 0; j < current_shape.size(); j++) {
polygon.push_back(current_shape[j]);
colors.push_back(c_bg);
@@ -1805,11 +1985,14 @@ void TileSetEditor::draw_polygon_shapes() {
}
}
workspace->draw_polygon(polygon, colors);
+
if (coord == edited_shape_coord) {
- for (int j = 0; j < shape->get_polygon().size() - 1; j++) {
- workspace->draw_line(shape->get_polygon()[j] + anchor, shape->get_polygon()[j + 1] + anchor, c_border, 1, true);
+ if (!creating_shape) {
+ for (int j = 0; j < polygon.size() - 1; j++) {
+ workspace->draw_line(polygon[j], polygon[j + 1], c_border, 1, true);
+ }
+ workspace->draw_line(polygon[polygon.size() - 1], polygon[0], c_border, 1, true);
}
- workspace->draw_line(shape->get_polygon()[shape->get_polygon().size() - 1] + anchor, shape->get_polygon()[0] + anchor, c_border, 1, true);
if (shape == edited_occlusion_shape) {
draw_handles = true;
}
@@ -1830,24 +2013,30 @@ void TileSetEditor::draw_polygon_shapes() {
Vector<Color> colors;
Vector2 anchor = WORKSPACE_MARGIN;
anchor += tileset->tile_get_region(get_current_tile()).position;
- PoolVector<Vector2> vertices = shape->get_vertices();
- for (int j = 0; j < shape->get_polygon(0).size(); j++) {
- polygon.push_back(vertices[shape->get_polygon(0)[j]] + anchor);
- colors.push_back(c_bg);
+ if (!creating_shape && shape == edited_navigation_shape && current_shape.size() > 2) {
+ for (int j = 0; j < current_shape.size(); j++) {
+ polygon.push_back(current_shape[j]);
+ colors.push_back(c_bg);
+ }
+ } else {
+ PoolVector<Vector2> vertices = shape->get_vertices();
+ for (int j = 0; j < shape->get_polygon(0).size(); j++) {
+ polygon.push_back(vertices[shape->get_polygon(0)[j]] + anchor);
+ colors.push_back(c_bg);
+ }
}
workspace->draw_polygon(polygon, colors);
- if (shape->get_polygon_count() > 0) {
- PoolVector<Vector2> vertices = shape->get_vertices();
- for (int j = 0; j < shape->get_polygon(0).size() - 1; j++) {
- workspace->draw_line(vertices[shape->get_polygon(0)[j]] + anchor, vertices[shape->get_polygon(0)[j + 1]] + anchor, c_border, 1, true);
- }
- if (shape == edited_navigation_shape) {
- draw_handles = true;
+ if (!creating_shape) {
+ for (int j = 0; j < polygon.size() - 1; j++) {
+ workspace->draw_line(polygon[j], polygon[j + 1], c_border, 1, true);
}
+ workspace->draw_line(polygon[polygon.size() - 1], polygon[0], c_border, 1, true);
+ }
+ if (shape == edited_navigation_shape) {
+ draw_handles = true;
}
}
-
} else {
Map<Vector2, Ref<NavigationPolygon> > map = tileset->autotile_get_navigation_map(t_id);
for (Map<Vector2, Ref<NavigationPolygon> >::Element *E = map.front(); E; E = E->next()) {
@@ -1872,12 +2061,12 @@ void TileSetEditor::draw_polygon_shapes() {
}
Vector<Vector2> polygon;
Vector<Color> colors;
- if (shape == edited_navigation_shape && current_shape.size() > 2) {
+ if (!creating_shape && shape == edited_navigation_shape && current_shape.size() > 2) {
for (int j = 0; j < current_shape.size(); j++) {
polygon.push_back(current_shape[j]);
colors.push_back(c_bg);
}
- } else if (shape->get_polygon_count() > 0) {
+ } else {
PoolVector<Vector2> vertices = shape->get_vertices();
for (int j = 0; j < shape->get_polygon(0).size(); j++) {
polygon.push_back(vertices[shape->get_polygon(0)[j]] + anchor);
@@ -1885,15 +2074,16 @@ void TileSetEditor::draw_polygon_shapes() {
}
}
workspace->draw_polygon(polygon, colors);
+
if (coord == edited_shape_coord) {
- if (shape->get_polygon_count() > 0) {
- PoolVector<Vector2> vertices = shape->get_vertices();
- for (int j = 0; j < shape->get_polygon(0).size() - 1; j++) {
- workspace->draw_line(vertices[shape->get_polygon(0)[j]] + anchor, vertices[shape->get_polygon(0)[j + 1]] + anchor, c_border, 1, true);
- }
- if (shape == edited_navigation_shape) {
- draw_handles = true;
+ if (!creating_shape) {
+ for (int j = 0; j < polygon.size() - 1; j++) {
+ workspace->draw_line(polygon[j], polygon[j + 1], c_border, 1, true);
}
+ workspace->draw_line(polygon[polygon.size() - 1], polygon[0], c_border, 1, true);
+ }
+ if (shape == edited_navigation_shape) {
+ draw_handles = true;
}
}
}
@@ -1902,11 +2092,13 @@ void TileSetEditor::draw_polygon_shapes() {
} break;
default: {}
}
+
if (creating_shape) {
for (int j = 0; j < current_shape.size() - 1; j++) {
workspace->draw_line(current_shape[j], current_shape[j + 1], Color(0, 1, 1), 1, true);
}
workspace->draw_line(current_shape[current_shape.size() - 1], snap_point(workspace->get_local_mouse_position()), Color(0, 1, 1), 1, true);
+ draw_handles = true;
}
}
@@ -1935,16 +2127,29 @@ void TileSetEditor::close_shape(const Vector2 &shape_anchor) {
shape->set_points(segments);
+ undo_redo->create_action(TTR("Create Collision Polygon"));
+ // Necessary to get the version that returns a Array instead of a Vector.
+ Array sd = tileset->call("tile_get_shapes", get_current_tile());
+ undo_redo->add_undo_method(tileset.ptr(), "tile_set_shapes", get_current_tile(), sd.duplicate());
+ for (int i = 0; i < sd.size(); i++) {
+ if (sd[i].get("shape") == edited_collision_shape) {
+ sd.remove(i);
+ break;
+ }
+ }
+ undo_redo->add_do_method(tileset.ptr(), "tile_set_shapes", get_current_tile(), sd);
if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::AUTO_TILE || tileset->tile_get_tile_mode(get_current_tile()) == TileSet::ATLAS_TILE)
- tileset->tile_add_shape(get_current_tile(), shape, Transform2D(), false, edited_shape_coord);
+ undo_redo->add_do_method(tileset.ptr(), "tile_add_shape", get_current_tile(), shape, Transform2D(), false, edited_shape_coord);
else
- tileset->tile_add_shape(get_current_tile(), shape, Transform2D());
-
- edited_collision_shape = shape;
+ undo_redo->add_do_method(tileset.ptr(), "tile_add_shape", get_current_tile(), shape, Transform2D());
+ tools[TOOL_SELECT]->set_pressed(true);
+ undo_redo->add_do_method(this, "_select_edited_shape_coord");
+ undo_redo->add_undo_method(this, "_select_edited_shape_coord");
+ undo_redo->commit_action();
+ } else {
+ tools[TOOL_SELECT]->set_pressed(true);
+ workspace->update();
}
-
- tools[TOOL_SELECT]->set_pressed(true);
- workspace->update();
} else if (edit_mode == EDITMODE_OCCLUSION) {
Ref<OccluderPolygon2D> shape = memnew(OccluderPolygon2D);
@@ -1959,13 +2164,18 @@ void TileSetEditor::close_shape(const Vector2 &shape_anchor) {
w = PoolVector<Vector2>::Write();
shape->set_polygon(polygon);
- if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::AUTO_TILE || tileset->tile_get_tile_mode(get_current_tile()) == TileSet::ATLAS_TILE)
- tileset->autotile_set_light_occluder(get_current_tile(), shape, edited_shape_coord);
- else
- tileset->tile_set_light_occluder(get_current_tile(), shape);
- edited_occlusion_shape = shape;
+ undo_redo->create_action(TTR("Create Occlusion Polygon"));
+ if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::AUTO_TILE || tileset->tile_get_tile_mode(get_current_tile()) == TileSet::ATLAS_TILE) {
+ undo_redo->add_do_method(tileset.ptr(), "autotile_set_light_occluder", get_current_tile(), shape, edited_shape_coord);
+ undo_redo->add_undo_method(tileset.ptr(), "autotile_set_light_occluder", get_current_tile(), tileset->autotile_get_light_occluder(get_current_tile(), edited_shape_coord), edited_shape_coord);
+ } else {
+ undo_redo->add_do_method(tileset.ptr(), "tile_set_light_occluder", get_current_tile(), shape);
+ undo_redo->add_undo_method(tileset.ptr(), "tile_set_light_occluder", get_current_tile(), tileset->tile_get_light_occluder(get_current_tile()));
+ }
tools[TOOL_SELECT]->set_pressed(true);
- workspace->update();
+ undo_redo->add_do_method(this, "_select_edited_shape_coord");
+ undo_redo->add_undo_method(this, "_select_edited_shape_coord");
+ undo_redo->commit_action();
} else if (edit_mode == EDITMODE_NAVIGATION) {
Ref<NavigationPolygon> shape = memnew(NavigationPolygon);
@@ -1983,13 +2193,18 @@ void TileSetEditor::close_shape(const Vector2 &shape_anchor) {
shape->set_vertices(polygon);
shape->add_polygon(indices);
- if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::AUTO_TILE || tileset->tile_get_tile_mode(get_current_tile()) == TileSet::ATLAS_TILE)
- tileset->autotile_set_navigation_polygon(get_current_tile(), shape, edited_shape_coord);
- else
- tileset->tile_set_navigation_polygon(get_current_tile(), shape);
- edited_navigation_shape = shape;
+ undo_redo->create_action(TTR("Create Navigation Polygon"));
+ if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::AUTO_TILE || tileset->tile_get_tile_mode(get_current_tile()) == TileSet::ATLAS_TILE) {
+ undo_redo->add_do_method(tileset.ptr(), "autotile_set_navigation_polygon", get_current_tile(), shape, edited_shape_coord);
+ undo_redo->add_undo_method(tileset.ptr(), "autotile_set_navigation_polygon", get_current_tile(), tileset->autotile_get_navigation_polygon(get_current_tile(), edited_shape_coord), edited_shape_coord);
+ } else {
+ undo_redo->add_do_method(tileset.ptr(), "tile_set_navigation_polygon", get_current_tile(), shape);
+ undo_redo->add_undo_method(tileset.ptr(), "tile_set_navigation_polygon", get_current_tile(), tileset->tile_get_navigation_polygon(get_current_tile()));
+ }
tools[TOOL_SELECT]->set_pressed(true);
- workspace->update();
+ undo_redo->add_do_method(this, "_select_edited_shape_coord");
+ undo_redo->add_undo_method(this, "_select_edited_shape_coord");
+ undo_redo->commit_action();
}
tileset->_change_notify("");
}
@@ -2034,6 +2249,23 @@ void TileSetEditor::select_coord(const Vector2 &coord) {
}
}
} else {
+ Vector<TileSet::ShapeData> sd = tileset->tile_get_shapes(get_current_tile());
+ bool found_collision_shape = false;
+ for (int i = 0; i < sd.size(); i++) {
+ if (sd[i].autotile_coord == coord) {
+ if (edited_collision_shape != sd[i].shape)
+ edited_collision_shape = sd[i].shape;
+ found_collision_shape = true;
+ break;
+ }
+ }
+ if (!found_collision_shape)
+ edited_collision_shape = Ref<ConvexPolygonShape2D>(NULL);
+ if (edited_occlusion_shape != tileset->autotile_get_light_occluder(get_current_tile(), coord))
+ edited_occlusion_shape = tileset->autotile_get_light_occluder(get_current_tile(), coord);
+ if (edited_navigation_shape != tileset->autotile_get_navigation_polygon(get_current_tile(), coord))
+ edited_navigation_shape = tileset->autotile_get_navigation_polygon(get_current_tile(), coord);
+
int spacing = tileset->autotile_get_spacing(get_current_tile());
Vector2 size = tileset->autotile_get_size(get_current_tile());
Vector2 shape_anchor = coord;
@@ -2104,6 +2336,24 @@ Vector2 TileSetEditor::snap_point(const Vector2 &point) {
return p;
}
+void TileSetEditor::add_texture(Ref<Texture> p_texture) {
+ texture_list->add_item(p_texture->get_path().get_file());
+ texture_map.insert(p_texture->get_rid(), p_texture);
+ texture_list->set_item_metadata(texture_list->get_item_count() - 1, p_texture->get_rid());
+}
+
+void TileSetEditor::remove_texture(Ref<Texture> p_texture) {
+ texture_list->remove_item(texture_list->find_metadata(p_texture->get_rid()));
+ texture_map.erase(p_texture->get_rid());
+
+ _validate_current_tile_id();
+
+ if (!get_current_texture().is_valid()) {
+ _on_texture_list_selected(-1);
+ workspace_overlay->update();
+ }
+}
+
void TileSetEditor::update_texture_list() {
Ref<Texture> selected_texture = get_current_texture();
@@ -2120,9 +2370,7 @@ void TileSetEditor::update_texture_list() {
}
if (!texture_map.has(tileset->tile_get_texture(E->get())->get_rid())) {
- texture_list->add_item(tileset->tile_get_texture(E->get())->get_path().get_file());
- texture_map.insert(tileset->tile_get_texture(E->get())->get_rid(), tileset->tile_get_texture(E->get()));
- texture_list->set_item_metadata(texture_list->get_item_count() - 1, tileset->tile_get_texture(E->get())->get_rid());
+ add_texture(tileset->tile_get_texture(E->get()));
}
}
for (int i = 0; i < ids_to_remove.size(); i++) {
@@ -2136,7 +2384,9 @@ void TileSetEditor::update_texture_list() {
} else if (get_current_texture().is_valid()) {
_on_texture_list_selected(texture_list->find_metadata(get_current_texture()->get_rid()));
} else {
+ _validate_current_tile_id();
_on_texture_list_selected(-1);
+ workspace_overlay->update();
}
update_texture_list_icon();
helper->_change_notify("");
@@ -2154,6 +2404,18 @@ void TileSetEditor::update_texture_list_icon() {
void TileSetEditor::update_workspace_tile_mode() {
+ if (!get_current_texture().is_valid()) {
+ tool_workspacemode[WORKSPACE_EDIT]->set_pressed(true);
+ workspace_mode = WORKSPACE_EDIT;
+ for (int i = 1; i < WORKSPACE_MODE_MAX; i++) {
+ tool_workspacemode[i]->set_disabled(true);
+ }
+ } else {
+ for (int i = 1; i < WORKSPACE_MODE_MAX; i++) {
+ tool_workspacemode[i]->set_disabled(false);
+ }
+ }
+
if (workspace_mode != WORKSPACE_EDIT) {
for (int i = 0; i < EDITMODE_MAX; i++) {
tool_editmode[i]->hide();
@@ -2172,7 +2434,9 @@ void TileSetEditor::update_workspace_tile_mode() {
for (int i = 0; i < ZOOM_OUT; i++) {
tools[i]->hide();
}
+
separator_editmode->hide();
+ separator_bitmask->hide();
separator_delete->hide();
separator_grid->hide();
return;
@@ -2184,7 +2448,7 @@ void TileSetEditor::update_workspace_tile_mode() {
separator_editmode->show();
if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::SINGLE_TILE) {
- if (tool_editmode[EDITMODE_ICON]->is_pressed() || tool_editmode[EDITMODE_PRIORITY]->is_pressed() || tool_editmode[EDITMODE_BITMASK]->is_pressed()) {
+ if (tool_editmode[EDITMODE_ICON]->is_pressed() || tool_editmode[EDITMODE_PRIORITY]->is_pressed() || tool_editmode[EDITMODE_BITMASK]->is_pressed() || tool_editmode[EDITMODE_Z_INDEX]->is_pressed()) {
tool_editmode[EDITMODE_COLLISION]->set_pressed(true);
edit_mode = EDITMODE_COLLISION;
}
@@ -2193,11 +2457,12 @@ void TileSetEditor::update_workspace_tile_mode() {
tool_editmode[EDITMODE_ICON]->hide();
tool_editmode[EDITMODE_BITMASK]->hide();
tool_editmode[EDITMODE_PRIORITY]->hide();
- } else if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::AUTO_TILE || tileset->tile_get_tile_mode(get_current_tile()) == TileSet::ATLAS_TILE) {
+ tool_editmode[EDITMODE_Z_INDEX]->hide();
+ } else if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::AUTO_TILE) {
if (edit_mode == EDITMODE_ICON)
select_coord(tileset->autotile_get_icon_coordinate(get_current_tile()));
else
- select_coord(edited_shape_coord);
+ _select_edited_shape_coord();
} else if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::ATLAS_TILE) {
if (tool_editmode[EDITMODE_PRIORITY]->is_pressed() || tool_editmode[EDITMODE_BITMASK]->is_pressed()) {
tool_editmode[EDITMODE_COLLISION]->set_pressed(true);
@@ -2206,7 +2471,7 @@ void TileSetEditor::update_workspace_tile_mode() {
if (edit_mode == EDITMODE_ICON)
select_coord(tileset->autotile_get_icon_coordinate(get_current_tile()));
else
- select_coord(edited_shape_coord);
+ _select_edited_shape_coord();
tool_editmode[EDITMODE_BITMASK]->hide();
tool_editmode[EDITMODE_PRIORITY]->hide();
@@ -2218,25 +2483,18 @@ void TileSetEditor::update_edited_region(const Vector2 &end_point) {
edited_region = Rect2(region_from, Size2());
if (tools[TOOL_GRID_SNAP]->is_pressed()) {
Vector2 grid_coord;
- grid_coord.x = Math::floor((region_from.x - snap_offset.x) / (snap_step.x + snap_separation.x));
- grid_coord.y = Math::floor((region_from.y - snap_offset.y) / (snap_step.y + snap_separation.y));
- grid_coord.x *= (snap_step.x + snap_separation.x);
- grid_coord.y *= (snap_step.y + snap_separation.y);
+ grid_coord = ((region_from - snap_offset) / (snap_step + snap_separation)).floor();
+ grid_coord *= (snap_step + snap_separation);
grid_coord += snap_offset;
edited_region.expand_to(grid_coord);
grid_coord += snap_step;
edited_region.expand_to(grid_coord);
- grid_coord.x = Math::floor((end_point.x - snap_offset.x) / (snap_step.x + snap_separation.x));
- grid_coord.y = Math::floor((end_point.y - snap_offset.y) / (snap_step.y + snap_separation.y));
- grid_coord.x *= (snap_step.x + snap_separation.x);
- grid_coord.y *= (snap_step.y + snap_separation.y);
+
+ grid_coord = ((end_point - snap_offset) / (snap_step + snap_separation)).floor();
+ grid_coord *= (snap_step + snap_separation);
grid_coord += snap_offset;
edited_region.expand_to(grid_coord);
grid_coord += snap_step;
- if (grid_coord.x < end_point.x)
- grid_coord.x += snap_separation.x;
- if (grid_coord.y < end_point.y)
- grid_coord.y += snap_separation.y;
edited_region.expand_to(grid_coord);
} else {
edited_region.expand_to(end_point);
@@ -2414,7 +2672,13 @@ void TilesetEditorContext::_get_property_list(List<PropertyInfo> *p_list) const
}
}
+void TilesetEditorContext::_bind_methods() {
+
+ ClassDB::bind_method("_hide_script_from_inspector", &TilesetEditorContext::_hide_script_from_inspector);
+}
+
TilesetEditorContext::TilesetEditorContext(TileSetEditor *p_tileset_editor) {
+
tileset_editor = p_tileset_editor;
}
@@ -2428,8 +2692,7 @@ void TileSetEditorPlugin::edit(Object *p_node) {
bool TileSetEditorPlugin::handles(Object *p_node) const {
- return p_node->is_class("TileSet") ||
- p_node->is_class("TilesetEditorContext");
+ return p_node->is_class("TileSet") || p_node->is_class("TilesetEditorContext");
}
void TileSetEditorPlugin::make_visible(bool p_visible) {
@@ -2444,6 +2707,41 @@ void TileSetEditorPlugin::make_visible(bool p_visible) {
}
}
+Dictionary TileSetEditorPlugin::get_state() const {
+
+ Dictionary state;
+ state["snap_offset"] = tileset_editor->snap_offset;
+ state["snap_step"] = tileset_editor->snap_step;
+ state["snap_separation"] = tileset_editor->snap_separation;
+ state["snap_enabled"] = tileset_editor->tools[TileSetEditor::TOOL_GRID_SNAP]->is_pressed();
+ state["keep_inside_tile"] = tileset_editor->tools[TileSetEditor::SHAPE_KEEP_INSIDE_TILE]->is_pressed();
+ return state;
+}
+
+void TileSetEditorPlugin::set_state(const Dictionary &p_state) {
+
+ Dictionary state = p_state;
+ if (state.has("snap_step")) {
+ tileset_editor->_set_snap_step(state["snap_step"]);
+ }
+
+ if (state.has("snap_offset")) {
+ tileset_editor->_set_snap_off(state["snap_offset"]);
+ }
+
+ if (state.has("snap_separation")) {
+ tileset_editor->_set_snap_sep(state["snap_separation"]);
+ }
+
+ if (state.has("snap_enabled")) {
+ tileset_editor->tools[TileSetEditor::TOOL_GRID_SNAP]->set_pressed(state["snap_enabled"]);
+ }
+
+ if (state.has("keep_inside_tile")) {
+ tileset_editor->tools[TileSetEditor::SHAPE_KEEP_INSIDE_TILE]->set_pressed(state["keep_inside_tile"]);
+ }
+}
+
TileSetEditorPlugin::TileSetEditorPlugin(EditorNode *p_node) {
editor = p_node;
tileset_editor = memnew(TileSetEditor(p_node));
@@ -2451,6 +2749,6 @@ TileSetEditorPlugin::TileSetEditorPlugin(EditorNode *p_node) {
tileset_editor->set_custom_minimum_size(Size2(0, 200) * EDSCALE);
tileset_editor->hide();
- tileset_editor_button = p_node->add_bottom_panel_item(TTR("Tile Set"), tileset_editor);
+ tileset_editor_button = p_node->add_bottom_panel_item(TTR("TileSet"), tileset_editor);
tileset_editor_button->hide();
}
diff --git a/editor/plugins/tile_set_editor_plugin.h b/editor/plugins/tile_set_editor_plugin.h
index bd8a2ddb98..1a6b51cdd3 100644
--- a/editor/plugins/tile_set_editor_plugin.h
+++ b/editor/plugins/tile_set_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -40,12 +40,12 @@
#define WORKSPACE_MARGIN Vector2(10, 10)
class TilesetEditorContext;
-class TileSetEditor : public Control {
+class TileSetEditor : public HSplitContainer {
friend class TileSetEditorPlugin;
friend class TilesetEditorContext;
- GDCLASS(TileSetEditor, Control)
+ GDCLASS(TileSetEditor, HSplitContainer)
enum TextureToolButtons {
TOOL_TILESET_ADD_TEXTURE,
@@ -71,6 +71,7 @@ class TileSetEditor : public Control {
EDITMODE_BITMASK,
EDITMODE_PRIORITY,
EDITMODE_ICON,
+ EDITMODE_Z_INDEX,
EDITMODE_MAX
};
@@ -93,6 +94,7 @@ class TileSetEditor : public Control {
Ref<TileSet> tileset;
TilesetEditorContext *helper;
EditorNode *editor;
+ UndoRedo *undo_redo;
ConfirmationDialog *cd;
AcceptDialog *err_dialog;
@@ -106,7 +108,7 @@ class TileSetEditor : public Control {
bool creating_shape;
int dragging_point;
- float tile_names_opacity;
+ bool tile_names_visible;
Vector2 region_from;
Rect2 edited_region;
bool draw_edited_region;
@@ -134,9 +136,11 @@ class TileSetEditor : public Control {
HSeparator *separator_editmode;
HBoxContainer *toolbar;
ToolButton *tools[TOOL_MAX];
+ VSeparator *separator_bitmask;
VSeparator *separator_delete;
VSeparator *separator_grid;
SpinBox *spin_priority;
+ SpinBox *spin_z_index;
WorkspaceMode workspace_mode;
EditMode edit_mode;
int current_tile;
@@ -148,10 +152,14 @@ class TileSetEditor : public Control {
void update_texture_list();
void update_texture_list_icon();
+ void add_texture(Ref<Texture> p_texture);
+ void remove_texture(Ref<Texture> p_texture);
+
Ref<Texture> get_current_texture();
static void _import_node(Node *p_node, Ref<TileSet> p_library);
static void _import_scene(Node *p_scene, Ref<TileSet> p_library, bool p_merge);
+ void _undo_redo_import_scene(Node *p_scene, bool p_merge);
protected:
static void _bind_methods();
@@ -177,14 +185,19 @@ private:
void _on_workspace_input(const Ref<InputEvent> &p_ie);
void _on_tool_clicked(int p_tool);
void _on_priority_changed(float val);
+ void _on_z_index_changed(float val);
void _on_grid_snap_toggled(bool p_val);
void _set_snap_step(Vector2 p_val);
void _set_snap_off(Vector2 p_val);
void _set_snap_sep(Vector2 p_val);
+ void _validate_current_tile_id();
+ void _select_edited_shape_coord();
+ void _undo_tile_removal(int p_id);
+
void _zoom_in();
void _zoom_out();
- void _reset_zoom();
+ void _zoom_reset();
void draw_highlight_current_tile();
void draw_highlight_subtile(Vector2 coord, const Vector<Vector2> &other_highlighted = Vector<Vector2>());
@@ -212,6 +225,7 @@ class TilesetEditorContext : public Object {
bool snap_options_visible;
public:
+ bool _hide_script_from_inspector() { return true; }
void set_tileset(const Ref<TileSet> &p_tileset);
private:
@@ -221,6 +235,7 @@ protected:
bool _set(const StringName &p_name, const Variant &p_value);
bool _get(const StringName &p_name, Variant &r_ret) const;
void _get_property_list(List<PropertyInfo> *p_list) const;
+ static void _bind_methods();
public:
TilesetEditorContext(TileSetEditor *p_tileset_editor);
@@ -240,6 +255,8 @@ public:
virtual void edit(Object *p_node);
virtual bool handles(Object *p_node) const;
virtual void make_visible(bool p_visible);
+ void set_state(const Dictionary &p_state);
+ Dictionary get_state() const;
TileSetEditorPlugin(EditorNode *p_node);
};
diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp
index 39e50ec7f8..becee4d633 100644
--- a/editor/plugins/visual_shader_editor_plugin.cpp
+++ b/editor/plugins/visual_shader_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -341,6 +341,18 @@ void VisualShaderEditor::_update_graph() {
node->add_child(hb);
node->set_slot(i + port_offset, valid_left, port_left, type_color[port_left], valid_right, port_right, type_color[port_right]);
+
+ if (EditorSettings::get_singleton()->get("interface/theme/use_graph_node_headers")) {
+ Ref<StyleBoxFlat> sb = node->get_stylebox("frame", "GraphNode");
+ Color c = sb->get_border_color(MARGIN_TOP);
+ Color mono_color = ((c.r + c.g + c.b) / 3) < 0.7 ? Color(1.0, 1.0, 1.0) : Color(0.0, 0.0, 0.0);
+ mono_color.a = 0.85;
+ c = mono_color;
+
+ node->add_color_override("title_color", c);
+ c.a = 0.7;
+ node->add_color_override("close_color", c);
+ }
}
if (vsnode->get_output_port_for_preview() >= 0) {
@@ -605,6 +617,9 @@ void VisualShaderEditor::_notification(int p_what) {
error_panel->add_style_override("panel", get_stylebox("bg", "Tree"));
error_label->add_color_override("font_color", get_color("error_color", "Editor"));
+
+ if (p_what == NOTIFICATION_THEME_CHANGED && is_visible_in_tree())
+ _update_graph();
}
if (p_what == NOTIFICATION_PROCESS) {
@@ -633,18 +648,23 @@ void VisualShaderEditor::_duplicate_nodes() {
VisualShader::Type type = VisualShader::Type(edit_type->get_selected());
List<int> nodes;
+ Set<int> excluded;
for (int i = 0; i < graph->get_child_count(); i++) {
- if (Object::cast_to<GraphNode>(graph->get_child(i))) {
- int id = String(graph->get_child(i)->get_name()).to_int();
+ GraphNode *gn = Object::cast_to<GraphNode>(graph->get_child(i));
+ if (gn) {
+ int id = String(gn->get_name()).to_int();
Ref<VisualShaderNode> node = visual_shader->get_node(type, id);
Ref<VisualShaderNodeOutput> output = node;
- if (output.is_valid()) //can't duplicate output
+ if (output.is_valid()) { // can't duplicate output
+ excluded.insert(id);
continue;
- if (node.is_valid()) {
+ }
+ if (node.is_valid() && gn->is_selected()) {
nodes.push_back(id);
}
+ excluded.insert(id);
}
}
@@ -683,15 +703,16 @@ void VisualShaderEditor::_duplicate_nodes() {
undo_redo->add_undo_method(this, "_update_graph");
undo_redo->commit_action();
- //reselect
+ // reselect duplicated nodes by excluding the other ones
for (int i = 0; i < graph->get_child_count(); i++) {
- if (Object::cast_to<GraphNode>(graph->get_child(i))) {
- int id = String(graph->get_child(i)->get_name()).to_int();
- if (nodes.find(id)) {
- Object::cast_to<GraphNode>(graph->get_child(i))->set_selected(true);
+ GraphNode *gn = Object::cast_to<GraphNode>(graph->get_child(i));
+ if (gn) {
+ int id = String(gn->get_name()).to_int();
+ if (!excluded.has(id)) {
+ gn->set_selected(true);
} else {
- Object::cast_to<GraphNode>(graph->get_child(i))->set_selected(false);
+ gn->set_selected(false);
}
}
}
@@ -798,7 +819,7 @@ VisualShaderEditor::VisualShaderEditor() {
add_node = memnew(MenuButton);
graph->get_zoom_hbox()->add_child(add_node);
- add_node->set_text(TTR("Add Node.."));
+ add_node->set_text(TTR("Add Node..."));
graph->get_zoom_hbox()->move_child(add_node, 0);
add_node->get_popup()->connect("id_pressed", this, "_add_node");
diff --git a/editor/plugins/visual_shader_editor_plugin.h b/editor/plugins/visual_shader_editor_plugin.h
index 49a51ede8f..2fb8a85d5b 100644
--- a/editor/plugins/visual_shader_editor_plugin.h
+++ b/editor/plugins/visual_shader_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/progress_dialog.cpp b/editor/progress_dialog.cpp
index 4a98aa411d..5fdc725f50 100644
--- a/editor/progress_dialog.cpp
+++ b/editor/progress_dialog.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -166,6 +166,11 @@ void ProgressDialog::_popup() {
void ProgressDialog::add_task(const String &p_task, const String &p_label, int p_steps, bool p_can_cancel) {
+ if (MessageQueue::get_singleton()->is_flushing()) {
+ ERR_PRINT("Do not use progress dialog (task) while flushing the message queue or using call_deferred()!");
+ return;
+ }
+
ERR_FAIL_COND(tasks.has(p_task));
ProgressDialog::Task t;
t.vb = memnew(VBoxContainer);
diff --git a/editor/progress_dialog.h b/editor/progress_dialog.h
index bf0b3cca1c..d8dfb73357 100644
--- a/editor/progress_dialog.h
+++ b/editor/progress_dialog.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/project_export.cpp b/editor/project_export.cpp
index f8ba6fd4e3..c2f9df9877 100644
--- a/editor/project_export.cpp
+++ b/editor/project_export.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -56,7 +56,7 @@ void ProjectExportDialog::_notification(int p_what) {
custom_feature_display->get_parent_control()->add_style_override("panel", get_stylebox("bg", "Tree"));
} break;
case NOTIFICATION_POPUP_HIDE: {
- EditorSettings::get_singleton()->set("interface/dialogs/export_bounds", get_rect());
+ EditorSettings::get_singleton()->set_project_metadata("dialog_bounds", "export", get_rect());
} break;
case NOTIFICATION_THEME_CHANGED: {
duplicate_preset->set_icon(get_icon("Duplicate", "EditorIcons"));
@@ -80,12 +80,13 @@ void ProjectExportDialog::popup_export() {
_update_presets();
if (presets->get_current() >= 0) {
- _edit_preset(presets->get_current()); // triggers rescan for templates if newly installed
+ _update_current_preset(); // triggers rescan for templates if newly installed
}
// Restore valid window bounds or pop up at default size.
- if (EditorSettings::get_singleton()->has_setting("interface/dialogs/export_bounds")) {
- popup(EditorSettings::get_singleton()->get("interface/dialogs/export_bounds"));
+ Rect2 saved_size = EditorSettings::get_singleton()->get_project_metadata("dialog_bounds", "export", Rect2());
+ if (saved_size != Rect2()) {
+ popup(saved_size);
} else {
Size2 popup_size = Size2(900, 700) * editor_get_scale();
@@ -136,13 +137,18 @@ void ProjectExportDialog::_add_preset(int p_platform) {
_edit_preset(EditorExport::get_singleton()->get_export_preset_count() - 1);
}
+void ProjectExportDialog::_update_current_preset() {
+
+ _edit_preset(presets->get_current());
+}
+
void ProjectExportDialog::_update_presets() {
updating = true;
Ref<EditorExportPreset> current;
if (presets->get_current() >= 0 && presets->get_current() < presets->get_item_count())
- current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ current = get_current_preset();
int current_idx = -1;
presets->clear();
@@ -191,7 +197,7 @@ void ProjectExportDialog::_edit_preset(int p_index) {
if (p_index < 0 || p_index >= presets->get_item_count()) {
name->set_text("");
name->set_editable(false);
- export_path->set_editable(false);
+ export_path->hide();
runnable->set_disabled(true);
parameters->edit(NULL);
presets->unselect_all();
@@ -213,11 +219,19 @@ void ProjectExportDialog::_edit_preset(int p_index) {
sections->show();
name->set_editable(true);
- export_path->set_editable(true);
+ export_path->show();
duplicate_preset->set_disabled(false);
delete_preset->set_disabled(false);
name->set_text(current->get_name());
- export_path->set_text(current->get_export_path());
+
+ List<String> extension_list = current->get_platform()->get_binary_extensions(current);
+ Vector<String> extension_vector;
+ for (int i = 0; i < extension_list.size(); i++) {
+ extension_vector.push_back("*." + extension_list[i]);
+ }
+
+ export_path->setup(extension_vector, false, true);
+ export_path->update_property();
runnable->set_disabled(false);
runnable->set_pressed(current->is_runnable());
parameters->edit(current.ptr());
@@ -289,13 +303,35 @@ void ProjectExportDialog::_edit_preset(int p_index) {
custom_features->set_text(current->get_custom_features());
_update_feature_list();
_update_export_all();
+ minimum_size_changed();
+
+ int script_export_mode = current->get_script_export_mode();
+ script_mode->select(script_export_mode);
+
+ String key = current->get_script_encryption_key();
+ if (!updating_script_key) {
+ script_key->set_text(key);
+ }
+ if (script_export_mode == EditorExportPreset::MODE_SCRIPT_ENCRYPTED) {
+ script_key->set_editable(true);
+
+ bool key_valid = _validate_script_encryption_key(key);
+ if (key_valid) {
+ script_key_error->hide();
+ } else {
+ script_key_error->show();
+ }
+ } else {
+ script_key->set_editable(false);
+ script_key_error->hide();
+ }
updating = false;
}
void ProjectExportDialog::_update_feature_list() {
- Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ Ref<EditorExportPreset> current = get_current_preset();
ERR_FAIL_COND(current.is_null());
Set<String> fset;
@@ -332,7 +368,7 @@ void ProjectExportDialog::_custom_features_changed(const String &p_text) {
if (updating)
return;
- Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ Ref<EditorExportPreset> current = get_current_preset();
ERR_FAIL_COND(current.is_null());
current->set_custom_features(p_text);
@@ -349,7 +385,7 @@ void ProjectExportDialog::_patch_button_pressed(Object *p_item, int p_column, in
patch_index = ti->get_metadata(0);
- Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ Ref<EditorExportPreset> current = get_current_preset();
ERR_FAIL_COND(current.is_null());
if (p_id == 0) {
@@ -369,7 +405,7 @@ void ProjectExportDialog::_patch_edited() {
return;
int index = item->get_metadata(0);
- Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ Ref<EditorExportPreset> current = get_current_preset();
ERR_FAIL_COND(current.is_null());
Vector<String> patches = current->get_patches();
@@ -387,7 +423,7 @@ void ProjectExportDialog::_patch_edited() {
void ProjectExportDialog::_patch_selected(const String &p_path) {
- Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ Ref<EditorExportPreset> current = get_current_preset();
ERR_FAIL_COND(current.is_null());
Vector<String> patches = current->get_patches();
@@ -400,25 +436,25 @@ void ProjectExportDialog::_patch_selected(const String &p_path) {
current->set_patch(patch_index, ProjectSettings::get_singleton()->get_resource_path().path_to(p_path) + enabled);
}
- _edit_preset(presets->get_current());
+ _update_current_preset();
}
void ProjectExportDialog::_patch_deleted() {
- Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ Ref<EditorExportPreset> current = get_current_preset();
ERR_FAIL_COND(current.is_null());
Vector<String> patches = current->get_patches();
if (patch_index < patches.size()) {
current->remove_patch(patch_index);
- _edit_preset(presets->get_current());
+ _update_current_preset();
}
}
void ProjectExportDialog::_update_parameters(const String &p_edited_property) {
- _edit_preset(presets->get_current());
+ _update_current_preset();
}
void ProjectExportDialog::_runnable_pressed() {
@@ -426,7 +462,7 @@ void ProjectExportDialog::_runnable_pressed() {
if (updating)
return;
- Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ Ref<EditorExportPreset> current = get_current_preset();
ERR_FAIL_COND(current.is_null());
if (runnable->is_pressed()) {
@@ -450,28 +486,85 @@ void ProjectExportDialog::_name_changed(const String &p_string) {
if (updating)
return;
- Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ Ref<EditorExportPreset> current = get_current_preset();
ERR_FAIL_COND(current.is_null());
current->set_name(p_string);
_update_presets();
}
-void ProjectExportDialog::_export_path_changed(const String &p_string) {
+void ProjectExportDialog::set_export_path(const String &p_value) {
+ Ref<EditorExportPreset> current = get_current_preset();
+ ERR_FAIL_COND(current.is_null());
+
+ current->set_export_path(p_value);
+}
+
+String ProjectExportDialog::get_export_path() {
+ Ref<EditorExportPreset> current = get_current_preset();
+ ERR_FAIL_COND_V(current.is_null(), String(""));
+
+ return current->get_export_path();
+}
+
+Ref<EditorExportPreset> ProjectExportDialog::get_current_preset() const {
+
+ return EditorExport::get_singleton()->get_export_preset(presets->get_current());
+}
+
+void ProjectExportDialog::_export_path_changed(const StringName &p_property, const Variant &p_value) {
if (updating)
return;
- Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ Ref<EditorExportPreset> current = get_current_preset();
ERR_FAIL_COND(current.is_null());
- current->set_export_path(p_string);
+ current->set_export_path(p_value);
_update_presets();
}
+void ProjectExportDialog::_script_export_mode_changed(int p_mode) {
+
+ if (updating)
+ return;
+
+ Ref<EditorExportPreset> current = get_current_preset();
+ ERR_FAIL_COND(current.is_null());
+
+ current->set_script_export_mode(p_mode);
+
+ _update_current_preset();
+}
+
+void ProjectExportDialog::_script_encryption_key_changed(const String &p_key) {
+
+ if (updating)
+ return;
+
+ Ref<EditorExportPreset> current = get_current_preset();
+ ERR_FAIL_COND(current.is_null());
+
+ current->set_script_encryption_key(p_key);
+
+ updating_script_key = true;
+ _update_current_preset();
+ updating_script_key = false;
+}
+
+bool ProjectExportDialog::_validate_script_encryption_key(const String &p_key) {
+
+ bool is_valid = false;
+
+ if (!p_key.empty() && p_key.is_valid_hex_number(false) && p_key.length() == 64) {
+ is_valid = true;
+ }
+ return is_valid;
+}
+
void ProjectExportDialog::_duplicate_preset() {
- Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ Ref<EditorExportPreset> current = get_current_preset();
if (current.is_null())
return;
@@ -526,7 +619,7 @@ void ProjectExportDialog::_duplicate_preset() {
void ProjectExportDialog::_delete_preset() {
- Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ Ref<EditorExportPreset> current = get_current_preset();
if (current.is_null())
return;
@@ -664,12 +757,12 @@ void ProjectExportDialog::drop_data_fw(const Point2 &p_point, const Variant &p_d
to_pos--;
}
- Ref<EditorExportPreset> preset = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ Ref<EditorExportPreset> preset = get_current_preset();
String patch = preset->get_patch(from_pos);
preset->remove_patch(from_pos);
preset->add_patch(patch, to_pos);
- _edit_preset(presets->get_current());
+ _update_current_preset();
}
}
@@ -678,7 +771,7 @@ void ProjectExportDialog::_export_type_changed(int p_which) {
if (updating)
return;
- Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ Ref<EditorExportPreset> current = get_current_preset();
if (current.is_null())
return;
@@ -693,7 +786,7 @@ void ProjectExportDialog::_filter_changed(const String &p_filter) {
if (updating)
return;
- Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ Ref<EditorExportPreset> current = get_current_preset();
if (current.is_null())
return;
@@ -707,7 +800,7 @@ void ProjectExportDialog::_fill_resource_tree() {
include_label->hide();
include_margin->hide();
- Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ Ref<EditorExportPreset> current = get_current_preset();
if (current.is_null())
return;
@@ -769,7 +862,7 @@ void ProjectExportDialog::_tree_changed() {
if (updating)
return;
- Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ Ref<EditorExportPreset> current = get_current_preset();
if (current.is_null())
return;
@@ -794,7 +887,7 @@ void ProjectExportDialog::_export_pck_zip() {
void ProjectExportDialog::_export_pck_zip_selected(const String &p_path) {
- Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ Ref<EditorExportPreset> current = get_current_preset();
ERR_FAIL_COND(current.is_null());
Ref<EditorExportPlatform> platform = current->get_platform();
ERR_FAIL_COND(platform.is_null());
@@ -833,7 +926,7 @@ void ProjectExportDialog::_validate_export_path(const String &p_path) {
void ProjectExportDialog::_export_project() {
- Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ Ref<EditorExportPreset> current = get_current_preset();
ERR_FAIL_COND(current.is_null());
Ref<EditorExportPlatform> platform = current->get_platform();
ERR_FAIL_COND(platform.is_null());
@@ -871,7 +964,7 @@ void ProjectExportDialog::_export_project_to_path(const String &p_path) {
default_filename = p_path.get_file().get_basename();
EditorSettings::get_singleton()->set_project_metadata("export_options", "default_filename", default_filename);
- Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ Ref<EditorExportPreset> current = get_current_preset();
ERR_FAIL_COND(current.is_null());
Ref<EditorExportPlatform> platform = current->get_platform();
ERR_FAIL_COND(platform.is_null());
@@ -947,6 +1040,8 @@ void ProjectExportDialog::_bind_methods() {
ClassDB::bind_method("_open_export_template_manager", &ProjectExportDialog::_open_export_template_manager);
ClassDB::bind_method("_validate_export_path", &ProjectExportDialog::_validate_export_path);
ClassDB::bind_method("_export_path_changed", &ProjectExportDialog::_export_path_changed);
+ ClassDB::bind_method("_script_export_mode_changed", &ProjectExportDialog::_script_export_mode_changed);
+ ClassDB::bind_method("_script_encryption_key_changed", &ProjectExportDialog::_script_encryption_key_changed);
ClassDB::bind_method("_export_project", &ProjectExportDialog::_export_project);
ClassDB::bind_method("_export_project_to_path", &ProjectExportDialog::_export_project_to_path);
ClassDB::bind_method("_export_all", &ProjectExportDialog::_export_all);
@@ -954,6 +1049,11 @@ void ProjectExportDialog::_bind_methods() {
ClassDB::bind_method("_export_all_dialog_action", &ProjectExportDialog::_export_all_dialog_action);
ClassDB::bind_method("_custom_features_changed", &ProjectExportDialog::_custom_features_changed);
ClassDB::bind_method("_tab_changed", &ProjectExportDialog::_tab_changed);
+ ClassDB::bind_method("set_export_path", &ProjectExportDialog::set_export_path);
+ ClassDB::bind_method("get_export_path", &ProjectExportDialog::get_export_path);
+ ClassDB::bind_method("get_current_preset", &ProjectExportDialog::get_current_preset);
+
+ ADD_PROPERTY(PropertyInfo(Variant::STRING, "export_path"), "set_export_path", "get_export_path");
}
ProjectExportDialog::ProjectExportDialog() {
@@ -963,7 +1063,7 @@ ProjectExportDialog::ProjectExportDialog() {
VBoxContainer *main_vb = memnew(VBoxContainer);
add_child(main_vb);
- HBoxContainer *hbox = memnew(HBoxContainer);
+ HSplitContainer *hbox = memnew(HSplitContainer);
main_vb->add_child(hbox);
hbox->set_v_size_flags(SIZE_EXPAND_FILL);
@@ -1006,9 +1106,12 @@ ProjectExportDialog::ProjectExportDialog() {
runnable->connect("pressed", this, "_runnable_pressed");
settings_vb->add_child(runnable);
- export_path = memnew(LineEdit);
- settings_vb->add_margin_child(TTR("Export Path:"), export_path);
- export_path->connect("text_changed", this, "_export_path_changed");
+ export_path = memnew(EditorPropertyPath);
+ settings_vb->add_child(export_path);
+ export_path->set_label(TTR("Export Path"));
+ export_path->set_object_and_property(this, "export_path");
+ export_path->set_save_mode();
+ export_path->connect("property_changed", this, "_export_path_changed");
sections = memnew(TabContainer);
sections->set_tab_align(TabContainer::ALIGN_LEFT);
@@ -1096,14 +1199,34 @@ ProjectExportDialog::ProjectExportDialog() {
feature_vb->add_margin_child(TTR("Feature List:"), features_panel, true);
sections->add_child(feature_vb);
+ updating_script_key = false;
+
+ VBoxContainer *script_vb = memnew(VBoxContainer);
+ script_vb->set_name(TTR("Script"));
+ script_mode = memnew(OptionButton);
+ script_vb->add_margin_child(TTR("Script Export Mode:"), script_mode);
+ script_mode->add_item(TTR("Text"), (int)EditorExportPreset::MODE_SCRIPT_TEXT);
+ script_mode->add_item(TTR("Compiled"), (int)EditorExportPreset::MODE_SCRIPT_COMPILED);
+ script_mode->add_item(TTR("Encrypted (Provide Key Below)"), (int)EditorExportPreset::MODE_SCRIPT_ENCRYPTED);
+ script_mode->connect("item_selected", this, "_script_export_mode_changed");
+ script_key = memnew(LineEdit);
+ script_key->connect("text_changed", this, "_script_encryption_key_changed");
+ script_key_error = memnew(Label);
+ script_key_error->set_text("- " + TTR("Invalid Encryption Key (must be 64 characters long)"));
+ script_key_error->add_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_color("error_color", "Editor"));
+ script_vb->add_margin_child(TTR("Script Encryption Key (256-bits as hex):"), script_key);
+ script_vb->add_child(script_key_error);
+ sections->add_child(script_vb);
+
sections->connect("tab_changed", this, "_tab_changed");
//disable by default
name->set_editable(false);
- export_path->set_editable(false);
+ export_path->hide();
runnable->set_disabled(true);
duplicate_preset->set_disabled(true);
delete_preset->set_disabled(true);
+ script_key_error->hide();
sections->hide();
parameters->edit(NULL);
@@ -1143,6 +1266,7 @@ ProjectExportDialog::ProjectExportDialog() {
export_pck_zip->connect("file_selected", this, "_export_pck_zip_selected");
export_error = memnew(Label);
+ export_error->set_autowrap(true);
main_vb->add_child(export_error);
export_error->hide();
export_error->add_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_color("error_color", "Editor"));
diff --git a/editor/project_export.h b/editor/project_export.h
index 7009968138..d24c51509a 100644
--- a/editor/project_export.h
+++ b/editor/project_export.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -37,6 +37,7 @@
#include "editor/editor_file_dialog.h"
#include "editor/editor_file_system.h"
#include "editor/editor_inspector.h"
+#include "editor/editor_properties.h"
#include "scene/gui/button.h"
#include "scene/gui/check_button.h"
#include "scene/gui/control.h"
@@ -66,7 +67,7 @@ private:
ItemList *presets;
LineEdit *name;
- LineEdit *export_path;
+ EditorPropertyPath *export_path;
EditorInspector *parameters;
CheckButton *runnable;
@@ -99,6 +100,10 @@ private:
LineEdit *custom_features;
RichTextLabel *custom_feature_display;
+ OptionButton *script_mode;
+ LineEdit *script_key;
+ Label *script_key_error;
+
Label *export_error;
HBoxContainer *export_templates_error;
@@ -110,7 +115,7 @@ private:
void _runnable_pressed();
void _update_parameters(const String &p_edited_property);
void _name_changed(const String &p_string);
- void _export_path_changed(const String &p_string);
+ void _export_path_changed(const StringName &p_property, const Variant &p_value);
void _add_preset(int p_platform);
void _edit_preset(int p_index);
void _duplicate_preset();
@@ -118,6 +123,7 @@ private:
void _delete_preset_confirm();
void _update_export_all();
+ void _update_current_preset();
void _update_presets();
void _export_type_changed(int p_which);
@@ -153,6 +159,11 @@ private:
void _update_feature_list();
void _custom_features_changed(const String &p_text);
+ bool updating_script_key;
+ void _script_export_mode_changed(int p_mode);
+ void _script_encryption_key_changed(const String &p_key);
+ bool _validate_script_encryption_key(const String &p_key);
+
void _tab_changed(int);
protected:
@@ -162,6 +173,11 @@ protected:
public:
void popup_export();
+ void set_export_path(const String &p_value);
+ String get_export_path();
+
+ Ref<EditorExportPreset> get_current_preset() const;
+
ProjectExportDialog();
~ProjectExportDialog();
};
diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp
index 8c906e5f0b..b8fb9d4ab0 100644
--- a/editor/project_manager.cpp
+++ b/editor/project_manager.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -447,13 +447,14 @@ private:
ProjectSettings::CustomMap edited_settings;
edited_settings["application/config/name"] = project_name->get_text();
- if (current->save_custom(dir.plus_file("/project.godot"), edited_settings, Vector<String>(), true)) {
+ if (current->save_custom(dir.plus_file("project.godot"), edited_settings, Vector<String>(), true) != OK) {
set_message(TTR("Couldn't edit project.godot in project path."), MESSAGE_ERROR);
}
}
hide();
- emit_signal("project_renamed");
+ emit_signal("projects_updated");
+
} else {
if (mode == MODE_IMPORT) {
@@ -474,12 +475,12 @@ private:
initial_settings["application/config/icon"] = "res://icon.png";
initial_settings["rendering/environment/default_environment"] = "res://default_env.tres";
- if (ProjectSettings::get_singleton()->save_custom(dir.plus_file("/project.godot"), initial_settings, Vector<String>(), false)) {
+ if (ProjectSettings::get_singleton()->save_custom(dir.plus_file("project.godot"), initial_settings, Vector<String>(), false) != OK) {
set_message(TTR("Couldn't create project.godot in project path."), MESSAGE_ERROR);
} else {
- ResourceSaver::save(dir.plus_file("/icon.png"), get_icon("DefaultProjectIcon", "EditorIcons"));
+ ResourceSaver::save(dir.plus_file("icon.png"), get_icon("DefaultProjectIcon", "EditorIcons"));
- FileAccess *f = FileAccess::open(dir.plus_file("/default_env.tres"), FileAccess::WRITE);
+ FileAccess *f = FileAccess::open(dir.plus_file("default_env.tres"), FileAccess::WRITE);
if (!f) {
set_message(TTR("Couldn't create project.godot in project path."), MESSAGE_ERROR);
} else {
@@ -587,7 +588,7 @@ private:
dialog_error->popup_centered_minsize();
} else if (!project_path->get_text().ends_with(".zip")) {
- dialog_error->set_text(TTR("Package Installed Successfully!"));
+ dialog_error->set_text(TTR("Package installed successfully!"));
dialog_error->popup_centered_minsize();
}
}
@@ -651,7 +652,7 @@ protected:
ClassDB::bind_method("_install_path_selected", &ProjectDialog::_install_path_selected);
ClassDB::bind_method("_browse_install_path", &ProjectDialog::_browse_install_path);
ADD_SIGNAL(MethodInfo("project_created"));
- ADD_SIGNAL(MethodInfo("project_renamed"));
+ ADD_SIGNAL(MethodInfo("projects_updated"));
}
public:
@@ -745,7 +746,8 @@ public:
get_ok()->set_text(TTR("Create & Edit"));
name_container->show();
install_path_container->hide();
- project_name->grab_focus();
+ project_name->call_deferred("grab_focus");
+ project_name->call_deferred("select_all");
} else if (mode == MODE_INSTALL) {
@@ -851,6 +853,7 @@ public:
fdialog->connect("file_selected", this, "_file_selected");
fdialog_install->connect("dir_selected", this, "_install_path_selected");
fdialog_install->connect("file_selected", this, "_install_path_selected");
+
set_hide_on_ok(false);
mode = MODE_NEW;
@@ -863,19 +866,27 @@ struct ProjectItem {
String project;
String path;
String conf;
+ int config_version;
uint64_t last_modified;
bool favorite;
bool grayed;
+ bool ordered_latest_modification;
ProjectItem() {}
- ProjectItem(const String &p_project, const String &p_path, const String &p_conf, uint64_t p_last_modified, bool p_favorite = false, bool p_grayed = false) {
+ ProjectItem(const String &p_project, const String &p_path, const String &p_conf, int p_config_version, uint64_t p_last_modified, bool p_favorite = false, bool p_grayed = false, const bool p_ordered_latest_modification = true) {
project = p_project;
path = p_path;
conf = p_conf;
+ config_version = p_config_version;
last_modified = p_last_modified;
favorite = p_favorite;
grayed = p_grayed;
+ ordered_latest_modification = p_ordered_latest_modification;
+ }
+ _FORCE_INLINE_ bool operator<(const ProjectItem &l) const {
+ if (ordered_latest_modification)
+ return last_modified > l.last_modified;
+ return project < l.project;
}
- _FORCE_INLINE_ bool operator<(const ProjectItem &l) const { return last_modified > l.last_modified; }
_FORCE_INLINE_ bool operator==(const ProjectItem &l) const { return project == l.project; }
};
@@ -975,7 +986,7 @@ void ProjectManager::_panel_input(const Ref<InputEvent> &p_ev, Node *p_hb) {
_update_project_buttons();
if (mb->is_doubleclick())
- _open_project(); //open if doubleclicked
+ _open_selected_projects_ask(); //open if doubleclicked
}
}
@@ -997,7 +1008,7 @@ void ProjectManager::_unhandled_input(const Ref<InputEvent> &p_ev) {
case KEY_ENTER: {
- _open_project();
+ _open_selected_projects_ask();
} break;
case KEY_DELETE: {
@@ -1156,6 +1167,15 @@ void ProjectManager::_load_recent_projects() {
Color font_color = gui_base->get_color("font_color", "Tree");
+ bool set_ordered_latest_modification;
+ ProjectListFilter::FilterOption filter_order_option = project_order_filter->get_filter_option();
+ if (filter_order_option == ProjectListFilter::FILTER_NAME) {
+ set_ordered_latest_modification = false;
+ } else {
+ set_ordered_latest_modification = true;
+ }
+ EditorSettings::get_singleton()->set("project_manager/sorting_order", (int)filter_order_option);
+
List<ProjectItem> projects;
List<ProjectItem> favorite_projects;
@@ -1171,6 +1191,7 @@ void ProjectManager::_load_recent_projects() {
String project = _name.get_slice("/", 1);
String conf = path.plus_file("project.godot");
+ int config_version = 0; // Assume 0 until we know better
bool favorite = (_name.begins_with("favorite_projects/")) ? true : false;
bool grayed = false;
@@ -1188,13 +1209,12 @@ void ProjectManager::_load_recent_projects() {
grayed = true;
}
- ProjectItem item(project, path, conf, last_modified, favorite, grayed);
+ ProjectItem item(project, path, conf, config_version, last_modified, favorite, grayed, set_ordered_latest_modification);
if (favorite)
favorite_projects.push_back(item);
else
projects.push_back(item);
}
-
projects.sort();
favorite_projects.sort();
@@ -1216,14 +1236,11 @@ void ProjectManager::_load_recent_projects() {
String project = item.project;
String path = item.path;
String conf = item.conf;
- bool is_favorite = item.favorite;
- bool is_grayed = item.grayed;
Ref<ConfigFile> cf = memnew(ConfigFile);
Error cf_err = cf->load(conf);
String project_name = TTR("Unnamed Project");
-
if (cf_err == OK && cf->has_section_key("application", "config/name")) {
project_name = static_cast<String>(cf->get_value("application", "config/name")).xml_unescape();
}
@@ -1232,8 +1249,16 @@ void ProjectManager::_load_recent_projects() {
continue;
Ref<Texture> icon;
- if (cf_err == OK && cf->has_section_key("application", "config/icon")) {
- String appicon = cf->get_value("application", "config/icon");
+ String main_scene;
+
+ if (cf_err == OK) {
+ item.config_version = (int)cf->get_value("", "config_version", 0);
+ if (item.config_version > ProjectSettings::CONFIG_VERSION) {
+ // Comes from an incompatible (more recent) Godot version, grey it out
+ item.grayed = true;
+ }
+
+ String appicon = cf->get_value("application", "config/icon", "");
if (appicon != "") {
Ref<Image> img;
img.instance();
@@ -1247,21 +1272,19 @@ void ProjectManager::_load_recent_projects() {
icon = it;
}
}
+
+ main_scene = cf->get_value("application", "run/main_scene", "");
}
if (icon.is_null()) {
icon = get_icon("DefaultProjectIcon", "EditorIcons");
}
- String main_scene;
- if (cf_err == OK && cf->has_section_key("application", "run/main_scene")) {
- main_scene = cf->get_value("application", "run/main_scene");
- } else {
- main_scene = "";
- }
-
selected_list_copy.erase(project);
+ bool is_favorite = item.favorite;
+ bool is_grayed = item.grayed;
+
HBoxContainer *hb = memnew(HBoxContainer);
hb->set_meta("name", project);
hb->set_meta("main_scene", main_scene);
@@ -1339,7 +1362,7 @@ void ProjectManager::_load_recent_projects() {
tabs->set_current_tab(0);
}
-void ProjectManager::_on_project_renamed() {
+void ProjectManager::_on_projects_updated() {
_load_recent_projects();
}
@@ -1359,7 +1382,7 @@ void ProjectManager::_on_project_created(const String &dir) {
_load_recent_projects();
_update_scroll_position(dir);
}
- _open_project();
+ _open_selected_projects_ask();
}
void ProjectManager::_update_scroll_position(const String &dir) {
@@ -1381,14 +1404,18 @@ void ProjectManager::_update_scroll_position(const String &dir) {
}
}
-void ProjectManager::_open_project_confirm() {
+void ProjectManager::_confirm_update_settings() {
+ _open_selected_projects();
+}
- for (Map<String, String>::Element *E = selected_list.front(); E; E = E->next()) {
+void ProjectManager::_open_selected_projects() {
+
+ for (const Map<String, String>::Element *E = selected_list.front(); E; E = E->next()) {
const String &selected = E->key();
String path = EditorSettings::get_singleton()->get("projects/" + selected);
- String conf = path + "/project.godot";
+ String conf = path.plus_file("project.godot");
if (!FileAccess::exists(conf)) {
- dialog_error->set_text(TTR("Can't open project"));
+ dialog_error->set_text(vformat(TTR("Can't open project at '%s'."), path));
dialog_error->popup_centered_minsize();
return;
}
@@ -1416,7 +1443,7 @@ void ProjectManager::_open_project_confirm() {
get_tree()->quit();
}
-void ProjectManager::_open_project() {
+void ProjectManager::_open_selected_projects_ask() {
if (selected_list.size() < 1) {
return;
@@ -1425,9 +1452,40 @@ void ProjectManager::_open_project() {
if (selected_list.size() > 1) {
multi_open_ask->set_text(TTR("Are you sure to open more than one project?"));
multi_open_ask->popup_centered_minsize();
- } else {
- _open_project_confirm();
+ return;
}
+
+ // Update the project settings or don't open
+ String path = EditorSettings::get_singleton()->get("projects/" + selected_list.front()->key());
+ String conf = path.plus_file("project.godot");
+
+ // FIXME: We already parse those in _load_recent_projects, we could instead make
+ // its `projects` list global and reuse its parsed metadata here.
+ Ref<ConfigFile> cf = memnew(ConfigFile);
+ Error cf_err = cf->load(conf);
+
+ if (cf_err != OK) {
+ dialog_error->set_text(vformat(TTR("Can't open project at '%s'."), path));
+ dialog_error->popup_centered_minsize();
+ return;
+ }
+
+ int config_version = (int)cf->get_value("", "config_version", 0);
+ // Check if we need to convert project settings from an earlier engine version
+ if (config_version < ProjectSettings::CONFIG_VERSION) {
+ ask_update_settings->set_text(vformat(TTR("The following project settings file was generated by an older engine version, and needs to be converted for this version:\n\n%s\n\nDo you want to convert it?\nWarning: You will not be able to open the project with previous versions of the engine anymore."), conf));
+ ask_update_settings->popup_centered_minsize();
+ return;
+ }
+ // Check if the file was generated by a newer, incompatible engine version
+ if (config_version > ProjectSettings::CONFIG_VERSION) {
+ dialog_error->set_text(vformat(TTR("Can't open project at '%s'.") + "\n" + TTR("The project settings were created by a newer engine version, whose settings are not compatible with this version."), path));
+ dialog_error->popup_centered_minsize();
+ return;
+ }
+
+ // Open if the project is up-to-date
+ _open_selected_projects();
}
void ProjectManager::_run_project_confirm() {
@@ -1672,8 +1730,8 @@ void ProjectManager::_scan_multiple_folders(PoolStringArray p_files) {
void ProjectManager::_bind_methods() {
- ClassDB::bind_method("_open_project", &ProjectManager::_open_project);
- ClassDB::bind_method("_open_project_confirm", &ProjectManager::_open_project_confirm);
+ ClassDB::bind_method("_open_selected_projects_ask", &ProjectManager::_open_selected_projects_ask);
+ ClassDB::bind_method("_open_selected_projects", &ProjectManager::_open_selected_projects);
ClassDB::bind_method("_run_project", &ProjectManager::_run_project);
ClassDB::bind_method("_run_project_confirm", &ProjectManager::_run_project_confirm);
ClassDB::bind_method("_show_project", &ProjectManager::_show_project);
@@ -1688,7 +1746,7 @@ void ProjectManager::_bind_methods() {
ClassDB::bind_method("_restart_confirm", &ProjectManager::_restart_confirm);
ClassDB::bind_method("_exit_dialog", &ProjectManager::_exit_dialog);
ClassDB::bind_method("_load_recent_projects", &ProjectManager::_load_recent_projects);
- ClassDB::bind_method("_on_project_renamed", &ProjectManager::_on_project_renamed);
+ ClassDB::bind_method("_on_projects_updated", &ProjectManager::_on_projects_updated);
ClassDB::bind_method("_on_project_created", &ProjectManager::_on_project_created);
ClassDB::bind_method("_update_scroll_position", &ProjectManager::_update_scroll_position);
ClassDB::bind_method("_panel_draw", &ProjectManager::_panel_draw);
@@ -1698,6 +1756,7 @@ void ProjectManager::_bind_methods() {
ClassDB::bind_method("_install_project", &ProjectManager::_install_project);
ClassDB::bind_method("_files_dropped", &ProjectManager::_files_dropped);
ClassDB::bind_method("_open_asset_library", &ProjectManager::_open_asset_library);
+ ClassDB::bind_method("_confirm_update_settings", &ProjectManager::_confirm_update_settings);
ClassDB::bind_method(D_METHOD("_scan_multiple_folders", "files"), &ProjectManager::_scan_multiple_folders);
}
@@ -1784,7 +1843,7 @@ ProjectManager::ProjectManager() {
String cp;
cp += 0xA9;
- OS::get_singleton()->set_window_title(VERSION_NAME + String(" - ") + TTR("Project Manager") + " - " + cp + " 2007-2018 Juan Linietsky, Ariel Manzur & Godot Contributors");
+ OS::get_singleton()->set_window_title(VERSION_NAME + String(" - ") + TTR("Project Manager") + " - " + cp + " 2007-2019 Juan Linietsky, Ariel Manzur & Godot Contributors");
HBoxContainer *top_hb = memnew(HBoxContainer);
vb->add_child(top_hb);
@@ -1818,16 +1877,44 @@ ProjectManager::ProjectManager() {
tabs->add_child(tree_hb);
VBoxContainer *search_tree_vb = memnew(VBoxContainer);
- search_tree_vb->set_h_size_flags(SIZE_EXPAND_FILL);
tree_hb->add_child(search_tree_vb);
+ search_tree_vb->set_h_size_flags(SIZE_EXPAND_FILL);
- HBoxContainer *search_box = memnew(HBoxContainer);
- search_box->add_spacer(true);
+ HBoxContainer *sort_filters = memnew(HBoxContainer);
+ Label *sort_label = memnew(Label);
+ sort_label->set_text(TTR("Sort:"));
+ sort_filters->add_child(sort_label);
+ Vector<String> sort_filter_titles;
+ sort_filter_titles.push_back("Name");
+ sort_filter_titles.push_back("Last Modified");
+ project_order_filter = memnew(ProjectListFilter);
+ project_order_filter->_setup_filters(sort_filter_titles);
+ project_order_filter->set_filter_size(150);
+ sort_filters->add_child(project_order_filter);
+ project_order_filter->connect("filter_changed", this, "_load_recent_projects");
+ project_order_filter->set_custom_minimum_size(Size2(180, 10) * EDSCALE);
+
+ int projects_sorting_order = (int)EditorSettings::get_singleton()->get("project_manager/sorting_order");
+ project_order_filter->set_filter_option((ProjectListFilter::FilterOption)projects_sorting_order);
+
+ sort_filters->add_spacer(true);
+ Label *search_label = memnew(Label);
+ search_label->set_text(TTR("Search:"));
+ sort_filters->add_child(search_label);
+
+ HBoxContainer *search_filters = memnew(HBoxContainer);
+ Vector<String> vec2;
+ vec2.push_back("Name");
+ vec2.push_back("Path");
project_filter = memnew(ProjectListFilter);
- search_box->add_child(project_filter);
+ project_filter->_setup_filters(vec2);
+ project_filter->add_search_box();
+ search_filters->add_child(project_filter);
project_filter->connect("filter_changed", this, "_load_recent_projects");
project_filter->set_custom_minimum_size(Size2(280, 10) * EDSCALE);
- search_tree_vb->add_child(search_box);
+ sort_filters->add_child(search_filters);
+
+ search_tree_vb->add_child(sort_filters);
PanelContainer *pc = memnew(PanelContainer);
pc->add_style_override("panel", gui_base->get_stylebox("bg", "Tree"));
@@ -1847,7 +1934,7 @@ ProjectManager::ProjectManager() {
Button *open = memnew(Button);
open->set_text(TTR("Edit"));
tree_vb->add_child(open);
- open->connect("pressed", this, "_open_project");
+ open->connect("pressed", this, "_open_selected_projects_ask");
open_btn = open;
Button *run = memnew(Button);
@@ -1954,38 +2041,37 @@ ProjectManager::ProjectManager() {
language_restart_ask->get_ok()->set_text(TTR("Restart Now"));
language_restart_ask->get_ok()->connect("pressed", this, "_restart_confirm");
language_restart_ask->get_cancel()->set_text(TTR("Continue"));
-
gui_base->add_child(language_restart_ask);
erase_ask = memnew(ConfirmationDialog);
erase_ask->get_ok()->set_text(TTR("Remove"));
erase_ask->get_ok()->connect("pressed", this, "_erase_project_confirm");
-
gui_base->add_child(erase_ask);
multi_open_ask = memnew(ConfirmationDialog);
multi_open_ask->get_ok()->set_text(TTR("Edit"));
- multi_open_ask->get_ok()->connect("pressed", this, "_open_project_confirm");
-
+ multi_open_ask->get_ok()->connect("pressed", this, "_open_selected_projects");
gui_base->add_child(multi_open_ask);
multi_run_ask = memnew(ConfirmationDialog);
multi_run_ask->get_ok()->set_text(TTR("Run"));
multi_run_ask->get_ok()->connect("pressed", this, "_run_project_confirm");
-
gui_base->add_child(multi_run_ask);
multi_scan_ask = memnew(ConfirmationDialog);
multi_scan_ask->get_ok()->set_text(TTR("Scan"));
-
gui_base->add_child(multi_scan_ask);
+ ask_update_settings = memnew(ConfirmationDialog);
+ ask_update_settings->get_ok()->connect("pressed", this, "_confirm_update_settings");
+ gui_base->add_child(ask_update_settings);
+
OS::get_singleton()->set_low_processor_usage_mode(true);
npdialog = memnew(ProjectDialog);
gui_base->add_child(npdialog);
- npdialog->connect("project_renamed", this, "_on_project_renamed");
+ npdialog->connect("projects_updated", this, "_on_projects_updated");
npdialog->connect("project_created", this, "_on_project_created");
_load_recent_projects();
@@ -2017,11 +2103,11 @@ ProjectManager::~ProjectManager() {
EditorSettings::destroy();
}
-void ProjectListFilter::_setup_filters() {
+void ProjectListFilter::_setup_filters(Vector<String> options) {
filter_option->clear();
- filter_option->add_item(TTR("Name"));
- filter_option->add_item(TTR("Path"));
+ for (int i = 0; i < options.size(); i++)
+ filter_option->add_item(TTR(options[i]));
}
void ProjectListFilter::_search_text_changed(const String &p_newtext) {
@@ -2036,6 +2122,11 @@ ProjectListFilter::FilterOption ProjectListFilter::get_filter_option() {
return _current_filter;
}
+void ProjectListFilter::set_filter_option(FilterOption option) {
+ filter_option->select((int)option);
+ _filter_option_selected(0);
+}
+
void ProjectListFilter::_filter_option_selected(int p_idx) {
FilterOption selected = (FilterOption)(filter_option->get_selected());
if (_current_filter != selected) {
@@ -2046,7 +2137,7 @@ void ProjectListFilter::_filter_option_selected(int p_idx) {
void ProjectListFilter::_notification(int p_what) {
- if (p_what == NOTIFICATION_ENTER_TREE) {
+ if (p_what == NOTIFICATION_ENTER_TREE && has_search_box) {
search_box->set_right_icon(get_icon("Search", "EditorIcons"));
search_box->set_clear_button_enabled(true);
}
@@ -2060,20 +2151,27 @@ void ProjectListFilter::_bind_methods() {
ADD_SIGNAL(MethodInfo("filter_changed"));
}
+void ProjectListFilter::add_search_box() {
+ search_box = memnew(LineEdit);
+ search_box->connect("text_changed", this, "_search_text_changed");
+ search_box->set_h_size_flags(SIZE_EXPAND_FILL);
+ add_child(search_box);
+ has_search_box = true;
+}
+
+void ProjectListFilter::set_filter_size(int h_size) {
+ filter_option->set_custom_minimum_size(Size2(h_size * EDSCALE, 10 * EDSCALE));
+}
+
ProjectListFilter::ProjectListFilter() {
_current_filter = FILTER_NAME;
filter_option = memnew(OptionButton);
- filter_option->set_custom_minimum_size(Size2(80 * EDSCALE, 10 * EDSCALE));
+ set_filter_size(80);
filter_option->set_clip_text(true);
filter_option->connect("item_selected", this, "_filter_option_selected");
add_child(filter_option);
- _setup_filters();
-
- search_box = memnew(LineEdit);
- search_box->connect("text_changed", this, "_search_text_changed");
- search_box->set_h_size_flags(SIZE_EXPAND_FILL);
- add_child(search_box);
+ has_search_box = false;
}
diff --git a/editor/project_manager.h b/editor/project_manager.h
index ad21e00b0d..6eb55871e4 100644
--- a/editor/project_manager.h
+++ b/editor/project_manager.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -49,42 +49,41 @@ class ProjectManager : public Control {
Button *rename_btn;
Button *run_btn;
- FileDialog *scan_dir;
-
EditorAssetLibrary *asset_library;
ProjectListFilter *project_filter;
+ ProjectListFilter *project_order_filter;
+ FileDialog *scan_dir;
ConfirmationDialog *language_restart_ask;
ConfirmationDialog *erase_ask;
ConfirmationDialog *multi_open_ask;
ConfirmationDialog *multi_run_ask;
ConfirmationDialog *multi_scan_ask;
+ ConfirmationDialog *ask_update_settings;
+ ConfirmationDialog *open_templates;
AcceptDialog *run_error_diag;
AcceptDialog *dialog_error;
ProjectDialog *npdialog;
+
ScrollContainer *scroll;
VBoxContainer *scroll_children;
- Map<String, String> selected_list; // name -> main_scene
- String last_clicked;
- bool importing;
-
HBoxContainer *projects_hb;
-
TabContainer *tabs;
OptionButton *language_btn;
-
Control *gui_base;
- ConfirmationDialog *open_templates;
+ Map<String, String> selected_list; // name -> main_scene
+ String last_clicked;
+ bool importing;
void _open_asset_library();
void _scan_projects();
void _run_project();
void _run_project_confirm();
- void _open_project();
- void _open_project_confirm();
+ void _open_selected_projects();
+ void _open_selected_projects_ask();
void _show_project(const String &p_path);
void _import_project();
void _new_project();
@@ -97,9 +96,11 @@ class ProjectManager : public Control {
void _exit_dialog();
void _scan_begin(const String &p_base);
+ void _confirm_update_settings();
+
void _load_recent_projects();
void _on_project_created(const String &dir);
- void _on_project_renamed();
+ void _on_projects_updated();
void _update_scroll_position(const String &dir);
void _scan_dir(DirAccess *da, float pos, float total, List<String> *r_projects);
@@ -130,6 +131,7 @@ private:
OptionButton *filter_option;
LineEdit *search_box;
+ bool has_search_box;
enum FilterOption {
FILTER_NAME,
@@ -138,7 +140,6 @@ private:
FilterOption _current_filter;
void _search_text_changed(const String &p_newtext);
- void _setup_filters();
void _filter_option_selected(int p_idx);
protected:
@@ -146,8 +147,12 @@ protected:
static void _bind_methods();
public:
+ void _setup_filters(Vector<String> options);
+ void add_search_box();
+ void set_filter_size(int h_size);
String get_search_term();
FilterOption get_filter_option();
+ void set_filter_option(FilterOption);
ProjectListFilter();
};
diff --git a/editor/project_settings_editor.cpp b/editor/project_settings_editor.cpp
index 7a68646f40..dd31853e73 100644
--- a/editor/project_settings_editor.cpp
+++ b/editor/project_settings_editor.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -115,10 +115,9 @@ void ProjectSettingsEditor::_notification(int p_what) {
} break;
case NOTIFICATION_POPUP_HIDE: {
- EditorSettings::get_singleton()->set("interface/dialogs/project_settings_bounds", get_rect());
+ EditorSettings::get_singleton()->set_project_metadata("dialog_bounds", "project_settings", get_rect());
} break;
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
-
search_button->set_icon(get_icon("Search", "EditorIcons"));
search_box->set_right_icon(get_icon("Search", "EditorIcons"));
search_box->set_clear_button_enabled(true);
@@ -788,8 +787,9 @@ void ProjectSettingsEditor::_update_actions() {
void ProjectSettingsEditor::popup_project_settings() {
// Restore valid window bounds or pop up at default size.
- if (EditorSettings::get_singleton()->has_setting("interface/dialogs/project_settings_bounds")) {
- popup(EditorSettings::get_singleton()->get("interface/dialogs/project_settings_bounds"));
+ Rect2 saved_size = EditorSettings::get_singleton()->get_project_metadata("dialog_bounds", "project_settings", Rect2());
+ if (saved_size != Rect2()) {
+ popup(saved_size);
} else {
Size2 popup_size = Size2(900, 700) * editor_get_scale();
diff --git a/editor/project_settings_editor.h b/editor/project_settings_editor.h
index 1344da1de7..d302c0d34b 100644
--- a/editor/project_settings_editor.h
+++ b/editor/project_settings_editor.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/property_editor.cpp b/editor/property_editor.cpp
index 8da75b7b3f..46e2bb18fe 100644
--- a/editor/property_editor.cpp
+++ b/editor/property_editor.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/property_editor.h b/editor/property_editor.h
index c74103df3d..6a709d348b 100644
--- a/editor/property_editor.h
+++ b/editor/property_editor.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/property_selector.cpp b/editor/property_selector.cpp
index a8c97be936..813e24bd61 100644
--- a/editor/property_selector.cpp
+++ b/editor/property_selector.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/property_selector.h b/editor/property_selector.h
index f5b34d210e..cc5b1d4884 100644
--- a/editor/property_selector.h
+++ b/editor/property_selector.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/pvrtc_compress.cpp b/editor/pvrtc_compress.cpp
index 30e78aa32b..84cd6da3d9 100644
--- a/editor/pvrtc_compress.cpp
+++ b/editor/pvrtc_compress.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/pvrtc_compress.h b/editor/pvrtc_compress.h
index 0396837623..fef6430578 100644
--- a/editor/pvrtc_compress.h
+++ b/editor/pvrtc_compress.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/quick_open.cpp b/editor/quick_open.cpp
index 8dacc3c142..c197248c35 100644
--- a/editor/quick_open.cpp
+++ b/editor/quick_open.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/quick_open.h b/editor/quick_open.h
index 5451d5a08c..14d857fa1c 100644
--- a/editor/quick_open.h
+++ b/editor/quick_open.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/register_exporters.h b/editor/register_exporters.h
index dc0a53a686..b3a2a05f33 100644
--- a/editor/register_exporters.h
+++ b/editor/register_exporters.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/rename_dialog.cpp b/editor/rename_dialog.cpp
index 47e1ae0dab..ed1eec95dc 100644
--- a/editor/rename_dialog.cpp
+++ b/editor/rename_dialog.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/rename_dialog.h b/editor/rename_dialog.h
index fa558660a4..4e0fab6a9f 100644
--- a/editor/rename_dialog.h
+++ b/editor/rename_dialog.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/reparent_dialog.cpp b/editor/reparent_dialog.cpp
index 3a6864b052..b4c80d4cfb 100644
--- a/editor/reparent_dialog.cpp
+++ b/editor/reparent_dialog.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/reparent_dialog.h b/editor/reparent_dialog.h
index 301dbe8bb5..3df2a5bda7 100644
--- a/editor/reparent_dialog.h
+++ b/editor/reparent_dialog.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/run_settings_dialog.cpp b/editor/run_settings_dialog.cpp
index ea53de7e8c..e957afc1b7 100644
--- a/editor/run_settings_dialog.cpp
+++ b/editor/run_settings_dialog.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/run_settings_dialog.h b/editor/run_settings_dialog.h
index 9fec71a468..d819705290 100644
--- a/editor/run_settings_dialog.h
+++ b/editor/run_settings_dialog.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp
index fe438236c9..be1c4a36bd 100644
--- a/editor/scene_tree_dock.cpp
+++ b/editor/scene_tree_dock.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -563,6 +563,20 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) {
if (node == root)
return;
+ //check that from node to root, all owners are right
+
+ if (node->get_owner() != root) {
+ accept->set_text(TTR("Node must belong to the edited scene to become root."));
+ accept->popup_centered_minsize();
+ return;
+ }
+
+ if (node->get_filename() != String()) {
+ accept->set_text(TTR("Instantiated scenes can't become root"));
+ accept->popup_centered_minsize();
+ return;
+ }
+
editor_data->get_undo_redo().create_action("Make node as Root");
editor_data->get_undo_redo().add_do_method(node->get_parent(), "remove_child", node);
editor_data->get_undo_redo().add_do_method(root->get_parent(), "remove_child", root);
@@ -1615,7 +1629,10 @@ void SceneTreeDock::_delete_confirm() {
}
void SceneTreeDock::_update_script_button() {
- if (EditorNode::get_singleton()->get_editor_selection()->get_selection().size() == 1) {
+ if (EditorNode::get_singleton()->get_editor_selection()->get_selection().size() == 0) {
+ button_create_script->hide();
+ button_clear_script->hide();
+ } else if (EditorNode::get_singleton()->get_editor_selection()->get_selection().size() == 1) {
Node *n = EditorNode::get_singleton()->get_editor_selection()->get_selected_node_list()[0];
if (n->get_script().is_null()) {
button_create_script->show();
@@ -1626,6 +1643,14 @@ void SceneTreeDock::_update_script_button() {
}
} else {
button_create_script->show();
+ List<Node *> selection = EditorNode::get_singleton()->get_editor_selection()->get_selected_node_list();
+ for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
+ Node *n = E->get();
+ if (!n->get_script().is_null()) {
+ button_clear_script->show();
+ return;
+ }
+ }
button_clear_script->hide();
}
}
@@ -1726,24 +1751,28 @@ void SceneTreeDock::_create() {
}
}
-void SceneTreeDock::replace_node(Node *p_node, Node *p_by_node) {
+void SceneTreeDock::replace_node(Node *p_node, Node *p_by_node, bool p_keep_properties) {
Node *n = p_node;
Node *newnode = p_by_node;
- Node *default_oldnode = Object::cast_to<Node>(ClassDB::instance(n->get_class()));
- List<PropertyInfo> pinfo;
- n->get_property_list(&pinfo);
- for (List<PropertyInfo>::Element *E = pinfo.front(); E; E = E->next()) {
- if (!(E->get().usage & PROPERTY_USAGE_STORAGE))
- continue;
- if (E->get().name == "__meta__")
- continue;
- if (default_oldnode->get(E->get().name) != n->get(E->get().name)) {
- newnode->set(E->get().name, n->get(E->get().name));
+ if (p_keep_properties) {
+ Node *default_oldnode = Object::cast_to<Node>(ClassDB::instance(n->get_class()));
+ List<PropertyInfo> pinfo;
+ n->get_property_list(&pinfo);
+
+ for (List<PropertyInfo>::Element *E = pinfo.front(); E; E = E->next()) {
+ if (!(E->get().usage & PROPERTY_USAGE_STORAGE))
+ continue;
+ if (E->get().name == "__meta__")
+ continue;
+ if (default_oldnode->get(E->get().name) != n->get(E->get().name)) {
+ newnode->set(E->get().name, n->get(E->get().name));
+ }
}
+
+ memdelete(default_oldnode);
}
- memdelete(default_oldnode);
editor->push_item(NULL);
diff --git a/editor/scene_tree_dock.h b/editor/scene_tree_dock.h
index 3939f4f361..653d0a4eca 100644
--- a/editor/scene_tree_dock.h
+++ b/editor/scene_tree_dock.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -238,7 +238,7 @@ public:
void show_tab_buttons();
void hide_tab_buttons();
- void replace_node(Node *p_node, Node *p_by_node);
+ void replace_node(Node *p_node, Node *p_by_node, bool p_keep_properties = true);
void open_script_dialog(Node *p_for_node);
diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp
index 95f0c4870e..7e4baa1533 100644
--- a/editor/scene_tree_editor.cpp
+++ b/editor/scene_tree_editor.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -668,7 +668,7 @@ void SceneTreeEditor::_renamed() {
// Empty node names are not allowed, so resets it to previous text and show warning
if (which->get_text(0).strip_edges().empty()) {
which->set_text(0, n->get_name());
- EditorNode::get_singleton()->show_warning(TTR("No name provided"));
+ EditorNode::get_singleton()->show_warning(TTR("No name provided."));
return;
}
@@ -1148,7 +1148,7 @@ SceneTreeDialog::SceneTreeDialog() {
set_title(TTR("Select a Node"));
- tree = memnew(SceneTreeEditor(false, false));
+ tree = memnew(SceneTreeEditor(false, false, true));
add_child(tree);
//set_child_rect(tree);
diff --git a/editor/scene_tree_editor.h b/editor/scene_tree_editor.h
index e575fb986a..9b87c0981d 100644
--- a/editor/scene_tree_editor.h
+++ b/editor/scene_tree_editor.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/script_create_dialog.cpp b/editor/script_create_dialog.cpp
index df704706af..6a3ed1c5e0 100644
--- a/editor/script_create_dialog.cpp
+++ b/editor/script_create_dialog.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -308,8 +308,10 @@ void ScriptCreateDialog::_built_in_pressed() {
if (internal->is_pressed()) {
is_built_in = true;
+ is_new_script_created = true;
} else {
is_built_in = false;
+ _path_changed(file_path->get_text());
}
_update_dialog();
}
diff --git a/editor/script_create_dialog.h b/editor/script_create_dialog.h
index e0bf336b56..15e838d69f 100644
--- a/editor/script_create_dialog.h
+++ b/editor/script_create_dialog.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/script_editor_debugger.cpp b/editor/script_editor_debugger.cpp
index 089ffa285d..acc735d571 100644
--- a/editor/script_editor_debugger.cpp
+++ b/editor/script_editor_debugger.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -602,6 +602,7 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da
String n = p_data[ofs + i * 2 + 0];
Variant v = p_data[ofs + i * 2 + 1];
+
PropertyHint h = PROPERTY_HINT_NONE;
String hs = String();
@@ -1041,8 +1042,11 @@ void ScriptEditorDebugger::_notification(int p_what) {
if (enable_rl) {
inspect_scene_tree->add_constant_override("draw_relationship_lines", 1);
inspect_scene_tree->add_color_override("relationship_line_color", rl_color);
- } else
+ inspect_scene_tree->add_constant_override("draw_guides", 0);
+ } else {
inspect_scene_tree->add_constant_override("draw_relationship_lines", 0);
+ inspect_scene_tree->add_constant_override("draw_guides", 1);
+ }
} break;
case NOTIFICATION_PROCESS: {
diff --git a/editor/script_editor_debugger.h b/editor/script_editor_debugger.h
index cebf6d785e..49651ad9c9 100644
--- a/editor/script_editor_debugger.h
+++ b/editor/script_editor_debugger.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/settings_config_dialog.cpp b/editor/settings_config_dialog.cpp
index 537c9ac6b8..e4d5573a9a 100644
--- a/editor/settings_config_dialog.cpp
+++ b/editor/settings_config_dialog.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -94,8 +94,9 @@ void EditorSettingsDialog::popup_edit_settings() {
set_process_unhandled_input(true);
// Restore valid window bounds or pop up at default size.
- if (EditorSettings::get_singleton()->has_setting("interface/dialogs/editor_settings_bounds")) {
- popup(EditorSettings::get_singleton()->get("interface/dialogs/editor_settings_bounds"));
+ Rect2 saved_size = EditorSettings::get_singleton()->get_project_metadata("dialog_bounds", "editor_settings", Rect2());
+ if (saved_size != Rect2()) {
+ popup(saved_size);
} else {
Size2 popup_size = Size2(900, 700) * editor_get_scale();
@@ -132,7 +133,7 @@ void EditorSettingsDialog::_notification(int p_what) {
_update_icons();
} break;
case NOTIFICATION_POPUP_HIDE: {
- EditorSettings::get_singleton()->set("interface/dialogs/editor_settings_bounds", get_rect());
+ EditorSettings::get_singleton()->set_project_metadata("dialog_bounds", "editor_settings", get_rect());
set_process_unhandled_input(false);
} break;
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
diff --git a/editor/settings_config_dialog.h b/editor/settings_config_dialog.h
index 37d32e401d..0937766bae 100644
--- a/editor/settings_config_dialog.h
+++ b/editor/settings_config_dialog.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/spatial_editor_gizmos.cpp b/editor/spatial_editor_gizmos.cpp
index 881f20cecb..9f3a0e78f6 100644
--- a/editor/spatial_editor_gizmos.cpp
+++ b/editor/spatial_editor_gizmos.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/spatial_editor_gizmos.h b/editor/spatial_editor_gizmos.h
index 371e3bc689..40e137cded 100644
--- a/editor/spatial_editor_gizmos.h
+++ b/editor/spatial_editor_gizmos.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/editor/translations/af.po b/editor/translations/af.po
index a92264f015..cf00039516 100644
--- a/editor/translations/af.po
+++ b/editor/translations/af.po
@@ -1,45 +1,47 @@
# Afrikaans translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
-#
# Ray West <the.raxar@gmail.com>, 2017.
-#
+# Julius Stopforth <jjstopforth@gmail.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2017-12-01 11:44+0000\n"
-"Last-Translator: Ray West <the.raxar@gmail.com>\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:38+0100\n"
+"Last-Translator: Julius Stopforth <jjstopforth@gmail.com>\n"
"Language-Team: Afrikaans <https://hosted.weblate.org/projects/godot-engine/"
"godot/af/>\n"
"Language: af\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.18-dev\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr ""
+msgstr "Ongeldige tiepe argument om te omskep(), gebruik TYPE_* konstante"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr ""
+msgstr "Nie genoeg bytes om bytes te dekodeer nie, of ongeldige formaat."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Ongeldige toevoer %i (nie geslaag nie) in uitdrukking"
#: core/math/expression.cpp
+#, fuzzy
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "self kan nie vertrou word nie omdat die geval nul is (nie geslaag nie)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
-msgstr ""
+msgstr "Ongeldige operande vir operateur %s, %s en %s."
#: core/math/expression.cpp
msgid "Invalid index of type %s for base type %s"
@@ -261,7 +263,6 @@ msgstr "Skep %d NUWE bane en voeg sleutels by?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -392,8 +393,7 @@ msgstr "Skaal Seleksie"
msgid "Scale From Cursor"
msgstr "Skaal van Wyser"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Dupliseer Seleksie"
@@ -407,11 +407,13 @@ msgid "Delete Selection"
msgstr "Dupliseer Seleksie"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+#, fuzzy
+msgid "Go to Next Step"
msgstr "Gaan na Volgende Stap"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+#, fuzzy
+msgid "Go to Previous Step"
msgstr "Gaan na Vorige Stap"
#: editor/animation_track_editor.cpp
@@ -514,11 +516,11 @@ msgstr "Geen Pasmaats"
msgid "Replaced %d occurrence(s)."
msgstr "Het %d verskynsel(s) vervang."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Pas Letterkas"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "Hele Woorde"
@@ -534,15 +536,19 @@ msgstr "Vervang Alles"
msgid "Selection Only"
msgstr "Slegs Seleksie"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Zoem In"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "Zoem Uit"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "Herset Zoem"
@@ -551,11 +557,10 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "Zoem In"
+msgid "Font Size:"
+msgstr ""
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Reël:"
@@ -588,6 +593,7 @@ msgstr "Voeg By"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -669,7 +675,7 @@ msgid "Edit Connection: "
msgstr "Wysig Seleksie Kurwe"
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -719,23 +725,20 @@ msgid "Recent:"
msgstr "Onlangse:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Soek:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "Passendes:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "Beskrywing:"
@@ -774,8 +777,7 @@ msgid "Resource"
msgstr "Hulpbron"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "Pad"
@@ -796,9 +798,10 @@ msgid "Search Replacement Resource:"
msgstr "Soek Vervanging Hulpbron:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -832,7 +835,8 @@ msgid "Error loading:"
msgstr "Fout terwyl laai:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+#, fuzzy
+msgid "Load failed due to missing dependencies:"
msgstr "Toneel kon nie laai nie as gevolg van vermiste afhanklikhede:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -891,14 +895,6 @@ msgstr "Verander Woordeboek Waarde"
msgid "Thanks from the Godot community!"
msgstr "Dankie van die Godot gemeenskap!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr ""
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Godot Enjin bydraers"
@@ -993,7 +989,8 @@ msgid "Uncompressing Assets"
msgstr "Ontpak Bates"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+#, fuzzy
+msgid "Package installed successfully!"
msgstr "Pakket Suksesvol Geïnstalleer!"
#: editor/editor_asset_installer.cpp
@@ -1076,8 +1073,7 @@ msgid "Bus options"
msgstr "Bus opsies"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "Dupliseer"
@@ -1239,7 +1235,7 @@ msgid "Add AutoLoad"
msgstr "Voeg AutoLaai By"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "Pad:"
@@ -1247,8 +1243,8 @@ msgstr "Pad:"
msgid "Node Name:"
msgstr "Nodus Naam:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "Naam"
@@ -1319,12 +1315,17 @@ msgid "Template file not found:"
msgstr "Sjabloon lêer nie gevind nie:\n"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+#, fuzzy
+msgid "Select Current Folder"
+msgstr "Skep Vouer"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "Lêer Bestaan reeds. Oorskryf?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
#, fuzzy
-msgid "Select Current Folder"
+msgid "Select This Folder"
msgstr "Skep Vouer"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1333,13 +1334,14 @@ msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr "Open 'n Lêer"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
-msgstr ""
+#, fuzzy
+msgid "Show in File Manager"
+msgstr "Open 'n Lêer"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
@@ -1374,7 +1376,8 @@ msgid "Open a File or Directory"
msgstr "Open 'n Lêer of Gids"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Stoor"
@@ -1432,8 +1435,7 @@ msgstr "Gidse & Lêers:"
msgid "Preview:"
msgstr "Voorskou:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "Lêer:"
@@ -1449,24 +1451,11 @@ msgstr "SkandeerBronne"
msgid "(Re)Importing Assets"
msgstr "(Her)Invoer van Bates"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "Deursoek Hulp"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "Klas Lys:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "Deursoek Klasse"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "Bo"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "Klas:"
@@ -1483,28 +1472,31 @@ msgid "Brief Description:"
msgstr "Kort Beskrywing:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "Lede"
+msgid "Properties"
+msgstr "Eienskappe"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "Lede:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "Openbare Metodes"
+msgid "Methods"
+msgstr "Metodes"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "Openbare Metodes:"
+#, fuzzy
+msgid "Methods:"
+msgstr "Metodes"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "GUI Tema Items"
+#, fuzzy
+msgid "Theme Properties"
+msgstr "Eienskappe"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "GUI Tema Items:"
+#, fuzzy
+msgid "Theme Properties:"
+msgstr "Eienskappe"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1531,10 +1523,16 @@ msgid "Constants:"
msgstr "Konstantes:"
#: editor/editor_help.cpp
-msgid "Description"
+#, fuzzy
+msgid "Class Description"
msgstr "Beskrywing"
#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
+msgstr "Beskrywing:"
+
+#: editor/editor_help.cpp
msgid "Online Tutorials:"
msgstr ""
@@ -1549,11 +1547,13 @@ msgstr ""
"[color=$color][url=$url]een by te dra[/url][/color]!"
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "Eienskappe"
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "Eienskap Beskrywing:"
#: editor/editor_help.cpp
-msgid "Property Description:"
+#, fuzzy
+msgid "Property Descriptions:"
msgstr "Eienskap Beskrywing:"
#: editor/editor_help.cpp
@@ -1565,11 +1565,13 @@ msgstr ""
"deur [color=$color][url=$url]een by te dra[/url][/color]!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "Metodes"
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "Metode Beskrywing:"
#: editor/editor_help.cpp
-msgid "Method Description:"
+#, fuzzy
+msgid "Method Descriptions:"
msgstr "Metode Beskrywing:"
#: editor/editor_help.cpp
@@ -1580,12 +1582,60 @@ msgstr ""
"Daar is tans geen beskrywing vir hierdie metode nie. Help ons asseblief deur "
"[color=$color][url=$url]een by te dra[/url][/color]!"
-#: editor/editor_inspector.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Deursoek Hulp"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Display All"
+msgstr "Vervang Alles"
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
#, fuzzy
-msgid "Property: "
+msgid "Methods Only"
+msgstr "Metodes"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "Seine"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Constants Only"
+msgstr "Konstantes"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Properties Only"
+msgstr "Eienskappe"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Theme Properties Only"
msgstr "Eienskappe"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Member Type"
+msgstr "Lede"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Class"
+msgstr "Klas:"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1620,6 +1670,11 @@ msgstr ""
msgid "Error saving resource!"
msgstr "Fout tydens storing van hulpbron!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "Stoor Hulpbron As..."
@@ -1674,10 +1729,20 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr ""
@@ -1905,6 +1970,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1945,6 +2016,12 @@ msgstr ""
msgid "Default"
msgstr ""
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+#, fuzzy
+msgid "Show in FileSystem"
+msgstr "Deursoek Klasse"
+
#: editor/editor_node.cpp
msgid "Play This Scene"
msgstr ""
@@ -2027,8 +2104,9 @@ msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save all Scenes"
-msgstr ""
+#, fuzzy
+msgid "Save All Scenes"
+msgstr "Stoor As"
#: editor/editor_node.cpp
msgid "Close Scene"
@@ -2056,7 +2134,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -2080,7 +2158,7 @@ msgstr ""
msgid "Export"
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr ""
@@ -2094,6 +2172,7 @@ msgid "Quit to Project List"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr ""
@@ -2201,10 +2280,6 @@ msgstr ""
msgid "Help"
msgstr ""
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2298,21 +2373,21 @@ msgstr ""
msgid "Disable Update Spinner"
msgstr ""
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr ""
#: editor/editor_node.cpp
-msgid "Node"
+msgid "FileSystem"
msgstr ""
#: editor/editor_node.cpp
-msgid "FileSystem"
+msgid "Inspector"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Node"
msgstr ""
#: editor/editor_node.cpp
@@ -2449,7 +2524,7 @@ msgstr ""
msgid "Physics Frame %"
msgstr ""
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr ""
@@ -2473,7 +2548,7 @@ msgstr ""
msgid "Calls"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2485,20 +2560,44 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "Ongeldige naam."
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr ""
@@ -2510,10 +2609,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2522,7 +2617,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr ""
@@ -2805,6 +2901,11 @@ msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr ""
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "Gunstelinge:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
@@ -2843,8 +2944,8 @@ msgstr "Fout terwyl laai:"
msgid "Unable to update dependencies:"
msgstr "Toneel kon nie laai nie as gevolg van vermiste afhanklikhede:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2852,10 +2953,6 @@ msgid "Provided name contains invalid characters"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr ""
@@ -2882,28 +2979,21 @@ msgid "Duplicating folder:"
msgstr "Dupliseer"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr ""
+#, fuzzy
+msgid "Open Scene(s)"
+msgstr "Open Lêer(s)"
#: editor/filesystem_dock.cpp
-msgid "Move To..."
+msgid "Instance"
msgstr ""
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open Scene(s)"
-msgstr "Open Lêer(s)"
+msgid "Add to favorites"
+msgstr "Gunstelinge:"
#: editor/filesystem_dock.cpp
-msgid "Instance"
+msgid "Remove from favorites"
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2914,12 +3004,20 @@ msgstr ""
msgid "View Owners..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr ""
+
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Duplicate..."
msgstr "Dupliseer"
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -2928,6 +3026,15 @@ msgstr ""
msgid "New Resource..."
msgstr "Stoor Hulpbron As..."
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Collapse All"
+msgstr "Vervang Alles"
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -2949,34 +3056,25 @@ msgstr ""
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "Wissel Gunsteling"
+msgid "Toggle split mode"
+msgstr "Wissel Modus"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Show current scene file."
-msgstr "Skep Vouer"
+msgid "Search files"
+msgstr "Deursoek Klasse"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "Deursoek Klasse"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
msgstr ""
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr ""
@@ -2993,30 +3091,22 @@ msgid "Create Script"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Find in files"
-msgstr ""
-
-#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find: "
+msgid "Find in Files"
msgstr "Vind"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Whole words"
-msgstr "Hele Woorde"
+msgid "Find:"
+msgstr "Vind"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Match case"
-msgstr "Pas Letterkas"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "Skep Vouer"
#: editor/find_in_files.cpp
-msgid "Filter: "
+msgid "Filters:"
msgstr ""
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -3034,6 +3124,11 @@ msgstr ""
#: editor/find_in_files.cpp
#, fuzzy
+msgid "Find: "
+msgstr "Vind"
+
+#: editor/find_in_files.cpp
+#, fuzzy
msgid "Replace: "
msgstr "Vervang"
@@ -3059,7 +3154,7 @@ msgstr "AutoLaai '%s' bestaan reeds!"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr "Ongeldige naam."
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3195,18 +3290,15 @@ msgstr ""
msgid "Failed to load resource."
msgstr ""
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr ""
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
-msgstr ""
+#, fuzzy
+msgid "Expand All Properties"
+msgstr "Eienskappe"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
-msgstr ""
+#, fuzzy
+msgid "Collapse All Properties"
+msgstr "Eienskappe"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -3251,6 +3343,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr ""
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr ""
@@ -3313,44 +3409,45 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
-msgstr ""
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
+msgstr "Skep Intekening"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
-msgstr ""
+#, fuzzy
+msgid "Edit Polygon"
+msgstr "Skep Intekening"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+msgid "Remove Polygon And Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr ""
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr "Skep"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3366,7 +3463,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
+msgid "Load..."
msgstr "Laai"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3395,13 +3492,8 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Skep"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-msgid "Erase points."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3443,9 +3535,8 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3479,7 +3570,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add Node.."
+msgid "Add Node..."
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3758,7 +3849,7 @@ msgstr "Koppel aan Nodus:"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "Verwyder geselekteerde baan."
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3827,10 +3918,6 @@ msgid "Amount:"
msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr ""
@@ -4029,7 +4116,7 @@ msgstr ""
msgid "Plugins"
msgstr ""
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr ""
@@ -4154,6 +4241,10 @@ msgid "Resize CanvasItem"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
msgstr ""
@@ -4174,21 +4265,19 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "Zoem Uit"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "Zoem Uit"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Zoem In"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4217,6 +4306,11 @@ msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "Wissel Modus"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4311,6 +4405,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "EnkelHouer"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr ""
@@ -4361,6 +4460,10 @@ msgid "Show Viewport"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr ""
@@ -4430,7 +4533,16 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "Skep Intekening"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
msgstr ""
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
@@ -4532,35 +4644,9 @@ msgid "Item List Editor"
msgstr ""
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr ""
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr ""
@@ -4792,12 +4878,12 @@ msgid "Populate"
msgstr ""
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
+msgid "Generating Visibility Rect"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -4826,6 +4912,11 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr ""
@@ -4895,11 +4986,11 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Convert to CPUParticles"
+msgid "Generate AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -4924,6 +5015,11 @@ msgid "Add Point to Curve"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "Wysig Nodus Kurwe"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr ""
@@ -4951,6 +5047,10 @@ msgid "Click: Add Point"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr ""
@@ -4966,11 +5066,6 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr ""
@@ -5027,6 +5122,10 @@ msgstr ""
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5038,82 +5137,90 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync bones"
+msgid "Sync Bones"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create UV Map"
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create Polygon & UV"
+msgid "Create UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
+msgid "Create Polygon & UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
+msgid "Create Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Split already exists."
-msgstr "AutoLaai '%s' bestaan reeds!"
+msgid "Remove Internal Vertex"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Add Split"
+msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "Ongeldige Pad."
+msgid "Add Custom Polygon"
+msgstr "Skep Intekening"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Verwyder Seleksie"
+msgid "Remove Custom Polygon"
+msgstr "Hernoem AutoLaai"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
-msgstr ""
+#, fuzzy
+msgid "Transform Polygon"
+msgstr "Skep Intekening"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Polygon 2D UV Editor"
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UV"
+msgid "Open Polygon 2D UV editor."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Poly"
+msgid "Polygon 2D UV Editor"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Splits"
+msgid "UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Bones"
-msgstr ""
+#, fuzzy
+msgid "Points"
+msgstr "Skuif Gunsteling Op"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
+msgid "Polygons"
msgstr "Skep Intekening"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Bones"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Move Points"
+msgstr "Skuif Gunsteling Op"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
msgstr ""
@@ -5138,19 +5245,21 @@ msgid "Scale Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Select a split to erase it"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5174,6 +5283,11 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr ""
@@ -5231,22 +5345,22 @@ msgid "Paste Resource"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr ""
@@ -5279,6 +5393,11 @@ msgstr "Leêr word gebêre:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
+msgid "Error: could not load file."
+msgstr "Kon nie vouer skep nie."
+
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Error could not load file."
msgstr "Kon nie vouer skep nie."
@@ -5288,20 +5407,24 @@ msgid "Error saving file!"
msgstr "Fout tydens storing van hulpbron!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr ""
+#, fuzzy
+msgid "Error while saving theme."
+msgstr "Fout tydens stoor."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
-msgstr ""
+#, fuzzy
+msgid "Error Saving"
+msgstr "Fout terwyl laai:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr ""
+#, fuzzy
+msgid "Error importing theme."
+msgstr "Fout terwyl laai:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
-msgstr ""
+#, fuzzy
+msgid "Error Importing"
+msgstr "Fout terwyl laai:"
#: editor/plugins/script_editor_plugin.cpp
msgid "New TextFile..."
@@ -5322,6 +5445,14 @@ msgid "Import Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr ""
@@ -5362,8 +5493,9 @@ msgid "File"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile"
-msgstr ""
+#, fuzzy
+msgid "Open..."
+msgstr "Oop"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5378,12 +5510,9 @@ msgid "Copy Script Path"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
-msgstr ""
+#, fuzzy
+msgid "History Previous"
+msgstr "Voorskou:"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
@@ -5395,15 +5524,16 @@ msgid "Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Reload Theme"
-msgstr ""
+#, fuzzy
+msgid "Import Theme..."
+msgstr "Ek sien..."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme"
+msgid "Reload Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
+msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5453,7 +5583,7 @@ msgid "Keep Debugger Open"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5461,10 +5591,6 @@ msgid "Open Godot online documentation"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -5500,19 +5626,9 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Search results"
+msgid "Search Results"
msgstr "Deursoek Hulp"
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "Deursoek Klasse"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
@@ -5523,6 +5639,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "Maak Funksie"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr ""
@@ -5554,10 +5679,6 @@ msgstr ""
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5609,11 +5730,11 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5630,36 +5751,33 @@ msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr ""
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "Gaan na Volgende Stap"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr ""
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "Gaan na Vorige Stap"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in files..."
-msgstr ""
+#, fuzzy
+msgid "Find in Files..."
+msgstr "Vind"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
-msgstr ""
+#, fuzzy
+msgid "Go to Function..."
+msgstr "Maak Funksie"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
-msgstr ""
+#, fuzzy
+msgid "Go to Line..."
+msgstr "Gaan na Reël"
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
@@ -5753,6 +5871,14 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -5917,6 +6043,10 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -6016,10 +6146,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap To Floor"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6136,6 +6262,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
msgstr ""
@@ -6251,11 +6381,16 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6420,6 +6555,11 @@ msgid "Fix Invalid Tiles"
msgstr "Ongeldige naam."
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "Dupliseer Seleksie"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6466,32 +6606,37 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "Verwyder Seleksie"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
+msgid "Rotate left"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
+msgid "Rotate right"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Flip vertically"
msgstr ""
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Clear transform"
+msgstr "Anim Verander Transform"
+
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr "Skuif huidige baan op."
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6503,25 +6648,45 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste bitmask."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Erase bitmask."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "Skep Intekening"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "Skuif huidige baan op."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6529,7 +6694,12 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Verwyder Seleksie"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6539,16 +6709,27 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "Skrap gekose lêers?"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr ""
+msgstr "Skep Vouer"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "Skep Intekening"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr "Skep Vouer"
@@ -6566,11 +6747,93 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr "Skep Vouer"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Skep Vouer"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Skep Intekening"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Skep Intekening"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Skep Intekening"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Verwyder"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Skep Intekening"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Skep Intekening"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "This property can't be changed."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
+msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6606,6 +6869,14 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6614,6 +6885,10 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+msgid "Export Path"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6668,10 +6943,46 @@ msgid "Feature List:"
msgstr ""
#: editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr ""
#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -6802,8 +7113,9 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
-msgid "Can't open project"
-msgstr ""
+#, fuzzy
+msgid "Can't open project at '%s'."
+msgstr "Kan nie '%s' oopmaak nie."
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
@@ -6811,6 +7123,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7125,10 +7455,6 @@ msgstr ""
msgid "General"
msgstr ""
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7262,10 +7588,6 @@ msgstr ""
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr ""
@@ -7353,7 +7675,7 @@ msgid "Step"
msgstr "Tree (s):"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7362,7 +7684,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7403,7 +7725,7 @@ msgstr ""
msgid "Reset"
msgstr "Herset Zoem"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7462,6 +7784,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr ""
@@ -7498,6 +7824,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7570,6 +7902,11 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Open documentation"
+msgstr "Opnoemings"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr ""
@@ -7578,11 +7915,11 @@ msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Change Type"
+msgid "Extend Script"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -7733,6 +8070,10 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -7821,19 +8162,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -7865,18 +8194,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -8074,7 +8391,7 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+msgid "Step argument is zero!"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
@@ -8298,11 +8615,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -8574,6 +8887,10 @@ msgid "Base Type:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "Lede:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr ""
@@ -8674,11 +8991,11 @@ msgid "Search VisualScript"
msgstr "Deursoek Hulp"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8759,6 +9076,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -8797,6 +9120,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -8914,6 +9243,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -8933,6 +9272,26 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -8965,7 +9324,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9022,6 +9381,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr ""
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr ""
@@ -9038,10 +9401,6 @@ msgstr ""
msgid "Please Confirm..."
msgstr ""
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr ""
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9049,6 +9408,10 @@ msgid ""
"hide upon running."
msgstr ""
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9094,10 +9457,6 @@ msgstr ""
msgid "Input"
msgstr ""
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for shader."
msgstr ""
@@ -9114,6 +9473,68 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Split already exists."
+#~ msgstr "AutoLaai '%s' bestaan reeds!"
+
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr "Ongeldige Pad."
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "Verwyder Seleksie"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "Zoem Uit"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "Zoem In"
+
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Zoem In"
+
+#~ msgid "Class List:"
+#~ msgstr "Klas Lys:"
+
+#~ msgid "Search Classes"
+#~ msgstr "Deursoek Klasse"
+
+#~ msgid "Public Methods"
+#~ msgstr "Openbare Metodes"
+
+#~ msgid "Public Methods:"
+#~ msgstr "Openbare Metodes:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "GUI Tema Items"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "GUI Tema Items:"
+
+#, fuzzy
+#~ msgid "Property: "
+#~ msgstr "Eienskappe"
+
+#, fuzzy
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "Wissel Gunsteling"
+
+#, fuzzy
+#~ msgid "Show current scene file."
+#~ msgstr "Skep Vouer"
+
+#, fuzzy
+#~ msgid "Whole words"
+#~ msgstr "Hele Woorde"
+
+#, fuzzy
+#~ msgid "Match case"
+#~ msgstr "Pas Letterkas"
+
#~ msgid "Disabled"
#~ msgstr "Afgeskaskel"
@@ -9138,9 +9559,6 @@ msgstr ""
#~ msgid "Anim Track Change Wrap Mode"
#~ msgstr "Anim Baan Verander Terug Draai Modus"
-#~ msgid "Edit Node Curve"
-#~ msgstr "Wysig Nodus Kurwe"
-
#~ msgid "Anim Add Key"
#~ msgstr "Anim Voeg Sleutel By"
@@ -9202,12 +9620,6 @@ msgstr ""
#~ msgid "Thanks!"
#~ msgstr "Dankie!"
-#~ msgid "I see..."
-#~ msgstr "Ek sien..."
-
-#~ msgid "Can't open '%s'."
-#~ msgstr "Kan nie '%s' oopmaak nie."
-
#~ msgid "Not found!"
#~ msgstr "Nie gevind nie!"
diff --git a/editor/translations/ar.po b/editor/translations/ar.po
index 5631c1884d..c9ee996993 100644
--- a/editor/translations/ar.po
+++ b/editor/translations/ar.po
@@ -1,6 +1,6 @@
# Arabic translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# Adel <dragonhunter250@gmail.com>, 2018.
# athomield <athomield@hotmail.com>, 2017.
@@ -18,19 +18,25 @@
# Wajdi Feki <wajdi.feki@gmail.com>, 2017.
# Omar Aglan <omar.aglan91@yahoo.com>, 2018.
# Codes Otaku <ilyas.gamerz@gmail.com>, 2018.
+# Takai Eddine Kennouche <takai.kenn@gmail.com>, 2018.
+# Mohamed El-Baz <albaz2000eg@gmail.com>, 2018.
+# عاصم شكر - Aasem shokr <aasemshokr@gmail.com>, 2018.
+# Mohammad Fares <mhdchehade@gmail.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-08-13 14:34+0000\n"
-"Last-Translator: Codes Otaku <ilyas.gamerz@gmail.com>\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:38+0100\n"
+"Last-Translator: Mohammad Fares <mhdchehade@gmail.com>\n"
"Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/"
"godot/ar/>\n"
"Language: ar\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
-"X-Generator: Weblate 3.2-dev\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -38,7 +44,7 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr "نوع برهان خاطئ للتحويل()، إستخدم ثابت TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr "لا يوجد ما يكÙÙŠ من البايتات من أجل ÙÙƒ البايتات، أو صيغة غير صحيحة."
@@ -49,7 +55,7 @@ msgstr ""
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "لا يمكن استخدام الحالة لأن لحظة التشغيل عدم (لم بتم ارسالها)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
@@ -57,7 +63,7 @@ msgstr ""
#: core/math/expression.cpp
msgid "Invalid index of type %s for base type %s"
-msgstr ""
+msgstr "الرمز غير متاح للنوع %s للنوع الصل %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
@@ -70,7 +76,7 @@ msgstr "نوع برهان خاطئ للتحويل()، إستخدم ثابت TYPE
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "عند نداء '%s':"
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -79,35 +85,31 @@ msgstr "مجاني/ÙØ§Ø±Øº"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "معزز"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Mirror"
-msgstr "خطأ!"
+msgstr "عكس"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "أدخل Ù…ÙØªØ§Ø­"
+msgstr "أدخل Ù…ÙØªØ§Ø­Ø§Ù‹ هنا"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "تكرير المحدد"
+msgstr "تكرار Ø§Ù„Ù…ÙØ§ØªÙŠØ­ المحدد(Ø©)"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "إمسح Ø§Ù„Ù…Ù„ÙØ§Øª المحددة؟"
+msgstr "إمسح Ø§Ù„Ù…ÙØ§ØªÙŠØ­ المحدد(Ø©)"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
-msgstr "Ù…ÙØ§ØªÙŠØ­ نسخ التحريك"
+msgstr "تكرار Ù…ÙØ§ØªÙŠØ­ التحريك"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Delete Keys"
-msgstr "Ù…ÙØ§ØªÙŠØ­ حذ٠التحريك"
+msgstr "أزل Ù…ÙØ§ØªÙŠØ­ التحريك"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Time"
@@ -131,11 +133,11 @@ msgstr "نداء تغيير التحريك"
#: editor/animation_track_editor.cpp
msgid "Property Track"
-msgstr ""
+msgstr "خط الخاصية"
#: editor/animation_track_editor.cpp
msgid "3D Transform Track"
-msgstr ""
+msgstr "خط التحريك ثلاثي الأبعاد"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
@@ -147,45 +149,40 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "شريط صبط الصوت"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Playback Track"
-msgstr "إيقا٠تشغيل الحركة. (س)"
+msgstr "شريط ضبط الحركة"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
-msgstr "مسار Ø¥Ø¶Ø§ÙØ© التحريك"
+msgstr "Ø¥Ø¶Ø§ÙØ© مسار"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Length Time (seconds)"
-msgstr "طول الحركة (بالثواني)."
+msgstr "مدة الحركة (بالثواني)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "تكبير الحركة."
+msgstr "تكرار الحركة"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Functions:"
-msgstr ""
+msgstr "دوال:"
#: editor/animation_track_editor.cpp
msgid "Audio Clips:"
-msgstr ""
+msgstr "مقاطع الصوت:"
#: editor/animation_track_editor.cpp
msgid "Anim Clips:"
-msgstr ""
+msgstr "مقاطع الحركة:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Toggle this track on/off."
-msgstr "تمكين/إيقا٠الوضع الخالي من الإلهاء."
+msgstr "تمكين/إيقا٠هذا المسار."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
@@ -279,7 +276,6 @@ msgstr "أنشئ %d مسارات جديدة Ùˆ أدخل Ù…ÙØ§ØªÙŠØ­ØŸ"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -412,8 +408,7 @@ msgstr "تكبير المحدد"
msgid "Scale From Cursor"
msgstr "تكبير من المؤشر"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "تكرير المحدد"
@@ -427,11 +422,13 @@ msgid "Delete Selection"
msgstr "Ù†ØµÙ Ø§Ù„Ù…ÙØ­Ø¯Ø¯"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+#, fuzzy
+msgid "Go to Next Step"
msgstr "إذهب إلي الخطوة التالية"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+#, fuzzy
+msgid "Go to Previous Step"
msgstr "إذهب إلي الخطوة السابقة"
#: editor/animation_track_editor.cpp
@@ -534,11 +531,11 @@ msgstr "لا مطابقة"
msgid "Replaced %d occurrence(s)."
msgstr "Ø¥Ø³ØªØ¨ÙØ¯Ù„ %d حادثة(حوادث)."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "قضية تشابه"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "كل الكلمات"
@@ -554,15 +551,19 @@ msgstr "إستبدال الكل"
msgid "Selection Only"
msgstr "المحدد Ùقط"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "تقريب"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "إبعاد"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "إرجاع التكبير"
@@ -572,10 +573,10 @@ msgstr ""
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "تقريب"
+msgid "Font Size:"
+msgstr "حجم الخطوط:"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "الخط:"
@@ -608,6 +609,7 @@ msgstr "أضÙ"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -688,7 +690,7 @@ msgid "Edit Connection: "
msgstr "خطأ ÙÙŠ الإتصال"
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -737,23 +739,20 @@ msgid "Recent:"
msgstr "الحالي:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "بحث:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "يطابق:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "الوصÙ:"
@@ -792,8 +791,7 @@ msgid "Resource"
msgstr "مورد"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "المسار"
@@ -814,9 +812,10 @@ msgid "Search Replacement Resource:"
msgstr "البحث عن مورد بديل:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -848,7 +847,8 @@ msgid "Error loading:"
msgstr "خطآ ÙÙŠ التحميل:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+#, fuzzy
+msgid "Load failed due to missing dependencies:"
msgstr "ÙØ´Ù„ ÙÙŠ تحميل المشهد بسبب وجود تبعيات Ù…Ùقودة يعتمد المشهد عليها:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -907,14 +907,6 @@ msgstr "تغيير قيمة ÙÙŠ القاموس"
msgid "Thanks from the Godot community!"
msgstr "شكراً من مجتمع Godot!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr ""
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "المسهامين ÙÙŠ محرك Godot"
@@ -1008,7 +1000,8 @@ msgid "Uncompressing Assets"
msgstr "ÙŠÙكك الضغط عن الأصول"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+#, fuzzy
+msgid "Package installed successfully!"
msgstr "الحزمة تم تثبيتها بنجاح!"
#: editor/editor_asset_installer.cpp
@@ -1090,8 +1083,7 @@ msgid "Bus options"
msgstr "إعدادات البيوس"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "تكرير"
@@ -1250,7 +1242,7 @@ msgid "Add AutoLoad"
msgstr "Ø¥Ø¶Ø§ÙØ© للتحميل التلقائي"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "المسار:"
@@ -1258,8 +1250,8 @@ msgstr "المسار:"
msgid "Node Name:"
msgstr "إسم العقدة:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "الأسم"
@@ -1329,12 +1321,17 @@ msgid "Template file not found:"
msgstr "مل٠النموذج غير موجود:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "تحديد المجلد الحالي"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "المل٠موجود، إستبدال؟"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "تحديد المجلد الحالي"
+#, fuzzy
+msgid "Select This Folder"
+msgstr "حدد هذا المجلد"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
@@ -1342,12 +1339,13 @@ msgstr "نسخ المسار"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr "أظهر ÙÙŠ مدير Ø§Ù„Ù…Ù„ÙØ§Øª"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+#, fuzzy
+msgid "Show in File Manager"
msgstr "أظهر ÙÙŠ مدير Ø§Ù„Ù…Ù„ÙØ§Øª"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1383,7 +1381,8 @@ msgid "Open a File or Directory"
msgstr "Ø¥ÙØªØ­ مل٠أو وجهة"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Ø­ÙØ¸"
@@ -1441,8 +1440,7 @@ msgstr "الوجهات ÙˆØ§Ù„Ù…Ù„ÙØ§Øª:"
msgid "Preview:"
msgstr "إستعراض:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "الملÙ:"
@@ -1458,24 +1456,11 @@ msgstr "ÙØ­Øµ المصادر"
msgid "(Re)Importing Assets"
msgstr "إعادة إستيراد الأصول"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "إبحث ÙÙŠ المساعدة"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "قائمة الأصناÙ:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "إبحث ÙÙŠ الأصناÙ"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "Ùوق"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "صنÙ:"
@@ -1492,28 +1477,31 @@ msgid "Brief Description:"
msgstr "وص٠مختصر:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "الأعضاء"
+msgid "Properties"
+msgstr "خصائص"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "الأعضاء:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "الطرق العامة"
+msgid "Methods"
+msgstr "قائمة الطرق"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "الطرق العامة:"
+#, fuzzy
+msgid "Methods:"
+msgstr "قائمة الطرق"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "عناصر ثيم واجهة المستخدم"
+#, fuzzy
+msgid "Theme Properties"
+msgstr "خصائص"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "عناصر ثيم واجهة المستخدم:"
+#, fuzzy
+msgid "Theme Properties:"
+msgstr "خصائص"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1540,10 +1528,16 @@ msgid "Constants:"
msgstr "الثوابت:"
#: editor/editor_help.cpp
-msgid "Description"
+#, fuzzy
+msgid "Class Description"
msgstr "الوصÙ"
#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
+msgstr "الوصÙ:"
+
+#: editor/editor_help.cpp
msgid "Online Tutorials:"
msgstr "الدورس علي الإنترنت:"
@@ -1558,11 +1552,13 @@ msgstr ""
"color]."
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "خصائص"
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "وص٠الملكية:"
#: editor/editor_help.cpp
-msgid "Property Description:"
+#, fuzzy
+msgid "Property Descriptions:"
msgstr "وص٠الملكية:"
#: editor/editor_help.cpp
@@ -1574,11 +1570,13 @@ msgstr ""
"المساهمة واحد [color=$color][url=$url]!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "قائمة الطرق"
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "وص٠الطريقة:"
#: editor/editor_help.cpp
-msgid "Method Description:"
+#, fuzzy
+msgid "Method Descriptions:"
msgstr "وص٠الطريقة:"
#: editor/editor_help.cpp
@@ -1589,12 +1587,61 @@ msgstr ""
"لا يوجد حاليا وص٠لهذه الطريقة. الرجاء المساعدة من خلال [color=$color][url="
"$url]المساهمة واحد[/url][/color] !"
-#: editor/editor_inspector.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "إبحث ÙÙŠ المساعدة"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Display All"
+msgstr "إستبدال الكل"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Classes Only"
+msgstr "Ø§Ù„ÙØ¦Ø§Øª"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Methods Only"
+msgstr "قائمة الطرق"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "إشارات"
+
+#: editor/editor_help_search.cpp
#, fuzzy
-msgid "Property: "
+msgid "Constants Only"
+msgstr "الثوابت"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Properties Only"
msgstr "خصائص"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Theme Properties Only"
+msgstr "خصائص"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Member Type"
+msgstr "الأعضاء"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Class"
+msgstr "صنÙ:"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1628,6 +1675,11 @@ msgstr "تصدير المشروع ÙØ´Ù„, رمز الخطأ % d."
msgid "Error saving resource!"
msgstr "خطأ ÙÙŠ Ø­ÙØ¸ المورد!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "Ø­ÙØ¸ المورد باسم..."
@@ -1682,10 +1734,20 @@ msgstr "هذه العملية لا يمكنها الإكتمال من غير جØ
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr "لا يمكن Ø­ÙØ¸ المشهد. على الأرجح لا يمكن Ø¥Ø³ØªÙŠÙØ§Ø¡ التبعيات (مجسّدات)."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr "لا يمكن تحميل مكتبة الميش من أجل الدمج!"
@@ -1937,6 +1999,14 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "غير قادر علي تحميل كود Ø§Ù„Ø¥Ø¶Ø§ÙØ© من المسار: '%s'."
#: editor/editor_node.cpp
+#, fuzzy
+msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"غير قادر علي تحميل كود Ø§Ù„Ø¥Ø¶Ø§ÙØ© من المسار: '%s' الكود ليس ÙÙŠ وضع الأداة."
+
+#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1985,6 +2055,12 @@ msgstr "مسح المخطط"
msgid "Default"
msgstr "Ø§Ù„Ø¥ÙØªØ±Ø§Ø¶ÙŠ"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+#, fuzzy
+msgid "Show in FileSystem"
+msgstr "أظهر ÙÙŠ مدير Ø§Ù„Ù…Ù„ÙØ§Øª"
+
#: editor/editor_node.cpp
#, fuzzy
msgid "Play This Scene"
@@ -2068,7 +2144,8 @@ msgid "Save Scene"
msgstr "Ø­ÙØ¸ المشهد"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+#, fuzzy
+msgid "Save All Scenes"
msgstr "Ø­ÙØ¸ جميع المشاهد"
#: editor/editor_node.cpp
@@ -2097,7 +2174,7 @@ msgid "Undo"
msgstr "تراجع"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "إعادة"
@@ -2121,7 +2198,7 @@ msgstr "إعدادات المشروع"
msgid "Export"
msgstr "تصدير"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "ادوات"
@@ -2135,6 +2212,7 @@ msgid "Quit to Project List"
msgstr "غادر الي قائمه المشاريع"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "تصحيح الأخطاء"
@@ -2261,10 +2339,6 @@ msgstr "إدارة قوالب التصدير"
msgid "Help"
msgstr "مساعدة"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "Ø§Ù„ÙØ¦Ø§Øª"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2359,24 +2433,24 @@ msgstr "تحديث التغييرات"
msgid "Disable Update Spinner"
msgstr "تعطيل دوار التحديث"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "Ù…ÙØ±Ø§Ù‚ب"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "إستيراد"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "عقدة"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "نظام Ø§Ù„Ù…Ù„ÙØ§Øª"
#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr "Ù…ÙØ±Ø§Ù‚ب"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "عقدة"
+
+#: editor/editor_node.cpp
#, fuzzy
msgid "Expand Bottom Panel"
msgstr "توسيع الكل"
@@ -2514,7 +2588,7 @@ msgstr "نسبة الإطار %"
msgid "Physics Frame %"
msgstr "نسبة الإطار الÙيزيائي %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "الوقت:"
@@ -2538,7 +2612,7 @@ msgstr "الوقت"
msgid "Calls"
msgstr "ندائات"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2550,20 +2624,44 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "اسم غير صالح."
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr ""
@@ -2575,10 +2673,6 @@ msgstr ""
msgid "Make Unique"
msgstr "إجعلة مميزاً"
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2587,7 +2681,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr ""
@@ -2878,6 +2973,11 @@ msgstr ""
"لا يمكن ÙØªØ­ file_type_cache.cch من إجل الكتابة، لا يمكن Ø­ÙØ¸ خبأ أنواع الملÙ!"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "Ø§Ù„Ù…ÙØ¶Ù„Ø©:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr "لا يمكن التنقل إلي '%s' حيث لم يتم العثور عليها ÙÙŠ نظام Ø§Ù„Ù…Ù„ÙØ§Øª!"
@@ -2915,19 +3015,15 @@ msgstr "خطآ ÙÙŠ التكرار:"
msgid "Unable to update dependencies:"
msgstr "غير قادر علي تحديث التبعيات:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "لا أسم Ù…Ùقدم"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "لا أسم Ù…Ùقدم."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "الأسم المÙقدم يحتوي علي حرو٠خاطئة"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "لا أسم Ù…Ùقدم."
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "الأسم يحتوي علي أحر٠غير صالحة."
@@ -2952,22 +3048,6 @@ msgid "Duplicating folder:"
msgstr "تكرار مجلد:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "توسيع الكل"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "طوي الكل"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "إعادة تسمية..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "تحريك إلي..."
-
-#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
msgstr "ÙØªØ­ مشهد (مشاهد)"
@@ -2976,6 +3056,16 @@ msgid "Instance"
msgstr "نموذج"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Add to favorites"
+msgstr "Ø§Ù„Ù…ÙØ¶Ù„Ø©:"
+
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Remove from favorites"
+msgstr "حذ٠من المجموعة"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "تعديل التبعيات..."
@@ -2983,11 +3073,19 @@ msgstr "تعديل التبعيات..."
msgid "View Owners..."
msgstr "أظهر المÙلاك..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "إعادة تسمية..."
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "تكرير..."
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr "تحريك إلي..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
msgstr "ÙØªØ­ سريع للكود..."
@@ -2997,6 +3095,16 @@ msgstr "ÙØªØ­ سريع للكود..."
msgid "New Resource..."
msgstr "Ø­ÙØ¸ المورد باسم..."
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Expand All"
+msgstr "توسيع الكل"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Collapse All"
+msgstr "طوي الكل"
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -3018,28 +3126,19 @@ msgstr "إعادة ÙØ­Øµ نظام Ø§Ù„Ù…Ù„ÙØ§Øª"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "تبديل حالة المجلد كما Ø§Ù„Ù…ÙØ¶Ù„Ø©"
+msgid "Toggle split mode"
+msgstr "أظهر المود"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Show current scene file."
-msgstr "Ø­ÙØ¸ العنوان Ø§Ù„ÙØ±Ø¹ÙŠ Ø§Ù„Ø°ÙŠ يتم تعديله حاليا."
+msgid "Search files"
+msgstr "إبحث ÙÙŠ الأصناÙ"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr "نمذج المشهد(المشاهد) المحددة كطÙÙ„ للعقدة المحددة."
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "إبحث ÙÙŠ الأصناÙ"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3047,7 +3146,7 @@ msgstr ""
"ÙŠÙØ­Øµ Ø§Ù„Ù…Ù„ÙØ§ØªØŒ\n"
"من ÙØ¶Ù„Ùƒ إنتظر..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "تحريك"
@@ -3066,31 +3165,22 @@ msgstr ""
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find in files"
+msgid "Find in Files"
msgstr "%d مزيد من Ø§Ù„Ù…Ù„ÙØ§Øª"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find: "
+msgid "Find:"
msgstr "جد"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Whole words"
-msgstr "كل الكلمات"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "قضية تشابه"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "أنشئ مجلد"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Filter: "
+msgid "Filters:"
msgstr "وضع Ø§Ù„Ù…ÙØµÙÙŠ:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -3108,6 +3198,11 @@ msgstr "إلغاء"
#: editor/find_in_files.cpp
#, fuzzy
+msgid "Find: "
+msgstr "جد"
+
+#: editor/find_in_files.cpp
+#, fuzzy
msgid "Replace: "
msgstr "إستبدال"
@@ -3133,7 +3228,7 @@ msgstr "خطأ: إسم الحركة موجود Ø¨Ø§Ù„ÙØ¹Ù„!"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr "اسم غير صالح."
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3272,17 +3367,14 @@ msgstr "إعادة إستيراد"
msgid "Failed to load resource."
msgstr "ÙØ´Ù„ تحميل المورد."
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "حسنا"
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+#, fuzzy
+msgid "Expand All Properties"
msgstr "توسيع كل Ø§Ù„ØªÙØ§ØµÙŠÙ„"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+#, fuzzy
+msgid "Collapse All Properties"
msgstr "طي كل Ø§Ù„ØªÙØ§ØµÙŠÙ„"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3328,6 +3420,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "تحميل مورد موجود مسبقا من الذاكرة وتعديله."
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "Ø­ÙØ¸ المورد الذي يتم تعديله حاليا."
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "إذهب إلي العنصر المعدل سابقاً ÙÙŠ التاريخ."
@@ -3392,14 +3488,14 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
msgstr "إنشاء بولي"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+#, fuzzy
+msgid "Edit Polygon"
msgstr "تعديل البولي"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3407,25 +3503,28 @@ msgid "Insert Point"
msgstr "إدخال نقطة"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+#, fuzzy
+msgid "Edit Polygon (Remove Point)"
msgstr "تعديل البولي (مسح النقطة)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+#, fuzzy
+msgid "Remove Polygon And Point"
msgstr "مسح البولي والنقطة"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "إنشاء Ù…ÙØ¶Ù„ع جديد من Ø§Ù„ØµÙØ±"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr "مسح النقاط"
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#, fuzzy
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
"تعديل المضلعات الموجودة:\n"
"زر Ø§Ù„ÙØ£Ø±Ø© الأيسر: لتحريك النقطة.\n"
@@ -3433,8 +3532,10 @@ msgstr ""
"زر Ø§Ù„ÙØ£Ø±Ø© الأيمن: مسح النقطة."
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
-msgstr "مسح النقاط"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#, fuzzy
+msgid "Erase points."
+msgstr "زر Ø§Ù„ÙØ£Ø±Ø© الأيمن: مسح النقطة."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3449,7 +3550,7 @@ msgstr "أض٠حركة"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
+msgid "Load..."
msgstr "تحميل"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3478,15 +3579,9 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "مسح النقاط"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "زر Ø§Ù„ÙØ£Ø±Ø© الأيمن: مسح النقطة."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3527,10 +3622,9 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr ""
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "الدمج:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3563,7 +3657,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add Node.."
+msgid "Add Node..."
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3690,7 +3784,7 @@ msgstr "أدوات الحركة"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Animation"
-msgstr "حركة"
+msgstr "صورة متحركة"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "New"
@@ -3843,7 +3937,7 @@ msgstr "صلها بالعقدة:"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "ازالة المسار المحدد."
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3911,10 +4005,6 @@ msgid "Amount:"
msgstr "الكمية:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "الدمج:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "الدمج 0:"
@@ -4116,7 +4206,7 @@ msgstr "الكل"
msgid "Plugins"
msgstr "Ø¥Ø¶Ø§ÙØ§Øª"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "ترتيب:"
@@ -4251,6 +4341,11 @@ msgstr "تعديل العنصر القماشي"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Scale CanvasItem"
+msgstr "تعديل العنصر القماشي"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Move CanvasItem"
msgstr "تعديل العنصر القماشي"
@@ -4271,21 +4366,19 @@ msgid "Paste Pose"
msgstr "لصق الوضع"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "إبعاد"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "إبعاد"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "تقريب"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr "تحديد الوضع"
@@ -4314,6 +4407,11 @@ msgid "Rotate Mode"
msgstr "وضع التدوير"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "تحديد الوضع"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4413,6 +4511,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr "إرجاع مقدرة تحديد الطÙÙ„ للعنصر."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "Ø§Ù„ÙØ±Ø¯ÙŠØ©"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "إظهار العظام"
@@ -4464,6 +4567,10 @@ msgid "Show Viewport"
msgstr "أظهر الشاشة"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr "Ù†ØµÙ Ø§Ù„Ù…ÙØ­Ø¯Ø¯"
@@ -4535,8 +4642,17 @@ msgstr ""
"سحب و إسقاط + Alt : تغيير نوع العقدة"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr "إنشاء بولي 3d"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "إنشاء بولي"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "تعديل البولي"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "تعديل البولي (مسح النقطة)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
@@ -4638,37 +4754,9 @@ msgid "Item List Editor"
msgstr "Ù…ÙØ¹Ø¯Ù„ قائمة العناصر"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"لا مصدر شكل Ù…ÙØ·Ø¨Ù‚ 2D ÙÙŠ هذه العقدة.\n"
-"أنشئ و ضع واحدة؟"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr "أنشئ شكل Ù…ÙØ·Ø¨Ù‚"
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr "أنشئ شكل جديد من لا شئ."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "تعديل الشكل الموجود Ø¨Ø§Ù„ÙØ¹Ù„:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "زر Ø§Ù„ÙØ£Ø±Ø© الأوسط: تحريك النقطة."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr "Ctrl+ زر Ø§Ù„ÙØ£Ø±Ø© الأوسط: ÙØµÙ„ المقطع."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "زر Ø§Ù„ÙØ£Ø±Ø© الأيمن: مسح النقطة."
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr "الميش ÙØ§Ø±Øº!"
@@ -4901,13 +4989,14 @@ msgid "Populate"
msgstr "تكثير/تزويد"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr "إنشاء Ù…ÙØ¶Ù„ع التنقل"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr "توليد AABB"
+#, fuzzy
+msgid "Generating Visibility Rect"
+msgstr "توليد Rect الرؤية"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -4935,6 +5024,12 @@ msgstr "إمسح قناع الانبعاث"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "Convert to CPUParticles"
+msgstr "تحويل إلي %s"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr "جسيمات"
@@ -5004,13 +5099,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr "معالج المواد من نوع 'ParticlesMaterial' مطلوب."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
-msgstr "ولد AABB"
+msgid "Generating AABB"
+msgstr "توليد AABB"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "تحويل إلي %s"
+msgid "Generate AABB"
+msgstr "ولد AABB"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5034,6 +5128,11 @@ msgid "Add Point to Curve"
msgstr "أض٠نقطة للمنحنى"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "تحرير منحنى العقدة"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr "حرك النقطة داخل المنحنى"
@@ -5061,6 +5160,10 @@ msgid "Click: Add Point"
msgstr "إظغط: أض٠نقطة"
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr ""
@@ -5076,11 +5179,6 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr ""
@@ -5138,6 +5236,10 @@ msgstr "مسح نقطة خروج التحكم"
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5150,10 +5252,16 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Sync bones"
+msgid "Sync Bones"
msgstr "إظهار العظام"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr ""
@@ -5163,40 +5271,46 @@ msgid "Create Polygon & UV"
msgstr "إنشاء بولي"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "إنشاء موجه Ø£Ùقي جديد"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
+#, fuzzy
+msgid "Remove Internal Vertex"
+msgstr "مسح الموجه العمودي"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "التحميل التلقائي '%s' موجود اصلا!"
+msgid "Add Custom Polygon"
+msgstr "تعديل البولي"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Add Split"
-msgstr "Ø¥Ø¶Ø§ÙØ© نقطة"
+msgid "Remove Custom Polygon"
+msgstr "مسح البولي والنقطة"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Invalid Split: "
-msgstr "مسار غير صالح."
+msgid "Transform UV Map"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "مسح النقطة"
+msgid "Transform Polygon"
+msgstr "إنشاء بولي"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Transform UV Map"
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
-msgstr ""
+#, fuzzy
+msgid "Open Polygon 2D UV editor."
+msgstr "ÙØªØ­ Ø§Ù„Ù…ÙØ¹Ø¯Ù„ 2D"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
@@ -5208,12 +5322,13 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "تعديل البولي"
+msgid "Points"
+msgstr "مسح النقطة"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Splits"
-msgstr ""
+#, fuzzy
+msgid "Polygons"
+msgstr "تعديل البولي"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -5222,12 +5337,8 @@ msgstr "أنشئ عظام"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
-msgstr "إنشاء بولي"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
-msgstr ""
+msgid "Move Points"
+msgstr "مسح النقطة"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
@@ -5254,19 +5365,21 @@ msgid "Scale Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Select a split to erase it"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5291,6 +5404,11 @@ msgid "Grid Settings"
msgstr "إعدادات Ø§Ù„Ù…ÙØ¹Ø¯Ù„"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr ""
@@ -5353,22 +5471,22 @@ msgid "Paste Resource"
msgstr "لصق الموارد"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr ""
@@ -5401,6 +5519,11 @@ msgstr "خطأ ÙÙŠ Ø­ÙØ¸ مجموعة البلاط!"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
+msgid "Error: could not load file."
+msgstr "لا يمكن إنشاء المجلد."
+
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Error could not load file."
msgstr "لا يمكن إنشاء المجلد."
@@ -5410,20 +5533,24 @@ msgid "Error saving file!"
msgstr "خطأ ÙÙŠ Ø­ÙØ¸ مجموعة البلاط!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr ""
+#, fuzzy
+msgid "Error while saving theme."
+msgstr "خطأ خلال Ø§Ù„Ø­ÙØ¸."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
-msgstr ""
+#, fuzzy
+msgid "Error Saving"
+msgstr "خطأ ÙÙŠ تحريك:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr ""
+#, fuzzy
+msgid "Error importing theme."
+msgstr "خطأ ÙÙŠ تحريك:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
-msgstr ""
+#, fuzzy
+msgid "Error Importing"
+msgstr "خطأ ÙÙŠ تحريك:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -5445,6 +5572,14 @@ msgid "Import Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr ""
@@ -5486,8 +5621,8 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile"
-msgstr "إظهار Ø§Ù„Ù…Ù„ÙØ§Øª"
+msgid "Open..."
+msgstr "Ø¥ÙØªØ­"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5502,12 +5637,9 @@ msgid "Copy Script Path"
msgstr "نسخ مسار الكود"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr "أظهر ÙÙŠ مدير Ø§Ù„Ù…Ù„ÙØ§Øª"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
-msgstr ""
+#, fuzzy
+msgid "History Previous"
+msgstr "التبويب السابق"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
@@ -5519,15 +5651,16 @@ msgid "Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Reload Theme"
-msgstr ""
+#, fuzzy
+msgid "Import Theme..."
+msgstr "حاري إستيراد المشهد..."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme"
+msgid "Reload Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
+msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5577,18 +5710,15 @@ msgid "Keep Debugger Open"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
-msgstr ""
+#, fuzzy
+msgid "Debug with External Editor"
+msgstr "ÙØªØ­ ÙÙŠ Ø§Ù„Ù…ÙØ¹Ø¯Ù„ التالي"
#: editor/plugins/script_editor_plugin.cpp
msgid "Open Godot online documentation"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr "إبحث ÙÙŠ هرمية الأصناÙ."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -5624,19 +5754,9 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Search results"
+msgid "Search Results"
msgstr "إبحث ÙÙŠ المساعدة"
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "إبحث ÙÙŠ الأصناÙ"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
@@ -5647,6 +5767,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "مسح المهمة"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr ""
@@ -5678,10 +5807,6 @@ msgstr ""
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5733,12 +5858,14 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
-msgstr ""
+#, fuzzy
+msgid "Convert Indent to Spaces"
+msgstr "تحويل إلي %s"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
-msgstr ""
+#, fuzzy
+msgid "Convert Indent to Tabs"
+msgstr "تحويل إلي %s"
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
@@ -5754,20 +5881,14 @@ msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr ""
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "إذهب إلي الخطوة التالية"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr ""
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "إذهب إلي الخطوة السابقة"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
@@ -5775,16 +5896,18 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr "Ùلتر Ø§Ù„Ù…Ù„ÙØ§Øª..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
-msgstr ""
+#, fuzzy
+msgid "Go to Function..."
+msgstr "مسح المهمة"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
-msgstr ""
+#, fuzzy
+msgid "Go to Line..."
+msgstr "إذهب إلي الخط"
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
@@ -5880,6 +6003,14 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -6045,6 +6176,10 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -6144,11 +6279,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap To Floor"
-msgstr "الكبس إلي الشبكة"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "إلغاء/ØªÙØ¹ÙŠÙ„ وضع النظرة الحرة"
@@ -6265,6 +6395,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
msgid "Sprite is empty!"
@@ -6383,11 +6517,17 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+#, fuzzy
+msgid "Set Margin"
+msgstr "حدد المعامل"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6560,6 +6700,11 @@ msgid "Fix Invalid Tiles"
msgstr "اسم غير صالح."
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "Ù†ØµÙ Ø§Ù„Ù…ÙØ­Ø¯Ø¯"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6606,32 +6751,39 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "Ø­Ø°Ù Ø§Ù„Ù…ÙØ­Ø¯Ø¯"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr ""
+#, fuzzy
+msgid "Rotate left"
+msgstr "وضع التدوير"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr ""
+#, fuzzy
+msgid "Rotate right"
+msgstr "وضع التدوير"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Flip vertically"
msgstr ""
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Clear transform"
+msgstr "تحويل تغيير التحريك"
+
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr "مسح المدخلة الحالية"
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6643,25 +6795,47 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "لصق الحركة"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "زر Ø§Ù„ÙØ£Ø±Ø© الأيمن: مسح النقطة."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "أنشئ شكل جديد من لا شئ."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "مسح المدخلة الحالية"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6669,7 +6843,12 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "مسح القالب"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6679,16 +6858,27 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "إمسح Ø§Ù„Ù…Ù„ÙØ§Øª المحددة؟"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr ""
+msgstr "Ø­ÙØ¸ العنوان Ø§Ù„ÙØ±Ø¹ÙŠ Ø§Ù„Ø°ÙŠ يتم تعديله حاليا."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "مسح النقاط"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr "Ø­ÙØ¸ العنوان Ø§Ù„ÙØ±Ø¹ÙŠ Ø§Ù„Ø°ÙŠ يتم تعديله حاليا."
@@ -6707,11 +6897,100 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr "Ø­ÙØ¸ العنوان Ø§Ù„ÙØ±Ø¹ÙŠ Ø§Ù„Ø°ÙŠ يتم تعديله حاليا."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "أنشئ مجلد"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "تعديل المصاÙÙŠ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "تعديل الشكل الموجود Ø¨Ø§Ù„ÙØ¹Ù„:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "تعديل البولي"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "إنشاء Ù…ÙØ¶Ù„ع التنقل"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "لصق الحركة"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "مسح القالب"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "مسح البولي والنقطة"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "أنشئ شكل Ù…ÙØ·Ø¨Ù‚"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "إنشاء Ù…ÙØ¶Ù„ع التنقل"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "تعديل المصاÙÙŠ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "إنشاء Ù…ÙØ¶Ù„ع التنقل"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "أنشئ شكل Ù…ÙØ·Ø¨Ù‚"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "This property can't be changed."
msgstr "هذه العملية لا يمكن الإكتمال من غير مشهد."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
+#, fuzzy
+msgid "TileSet"
msgstr "مجموعة البلاط"
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6748,6 +7027,15 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Exporting All"
+msgstr "التصدير كـ %s"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6756,6 +7044,11 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "تصدير المشروع"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6810,10 +7103,50 @@ msgid "Feature List:"
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "تشغيل الكود"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Script Export Mode:"
+msgstr "تصدير المشروع"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export mode?"
+msgstr "تصدير المشروع"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Export All"
+msgstr "تصدير"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -6941,7 +7274,8 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
-msgid "Can't open project"
+#, fuzzy
+msgid "Can't open project at '%s'."
msgstr "لا يمكن ÙØªØ­ المشروع"
#: editor/project_manager.cpp
@@ -6950,6 +7284,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7262,11 +7614,7 @@ msgstr ""
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "General"
-msgstr ""
-
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
+msgstr "عام"
#: editor/project_settings_editor.cpp
msgid "Override For..."
@@ -7401,10 +7749,6 @@ msgstr ""
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr ""
@@ -7495,7 +7839,7 @@ msgid "Step"
msgstr "خطوة (ثانية):"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7504,7 +7848,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7545,7 +7889,7 @@ msgstr ""
msgid "Reset"
msgstr "إرجاع التكبير"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7604,6 +7948,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr "إخلاء الكود"
@@ -7640,6 +7988,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7715,6 +8069,11 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Open documentation"
+msgstr "ÙÙØªØ­ مؤخراً"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr ""
@@ -7723,12 +8082,13 @@ msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Change Type"
-msgstr ""
+#, fuzzy
+msgid "Extend Script"
+msgstr "ÙØªØ­ الكود"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -7881,6 +8241,11 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Filename is empty"
+msgstr "الميش ÙØ§Ø±Øº!"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -7969,19 +8334,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -8013,18 +8366,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -8224,7 +8565,8 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+#, fuzzy
+msgid "Step argument is zero!"
msgstr "الخطوة (المتغيرة المدخلة/argument) تساوي ØµÙØ± !"
#: modules/gdscript/gdscript_functions.cpp
@@ -8454,12 +8796,8 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr "طبخ!"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
-msgstr "طبخ ميش المحاور."
+msgid "Bake NavMesh"
+msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8730,6 +9068,10 @@ msgid "Base Type:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "الأعضاء:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr ""
@@ -8830,11 +9172,11 @@ msgid "Search VisualScript"
msgstr "إخلاء الكود"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8916,6 +9258,12 @@ msgstr ""
"يجب تزويد ال CollisionShape2D بإحدى الأشكال (من نوع Shape2D) لتعمل بالشكل "
"المطلوب. الرجاء تكوين و ضبط الشكل لها اولا!"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -8954,6 +9302,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -9071,6 +9425,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -9090,6 +9454,26 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9122,7 +9506,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9180,6 +9564,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr "شجرة الحركة خاطئة."
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr ""
@@ -9196,10 +9584,6 @@ msgstr "تنبيه!"
msgid "Please Confirm..."
msgstr "يرجى التاكيد..."
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr "حدد هذا المجلد"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9207,6 +9591,10 @@ msgid ""
"hide upon running."
msgstr ""
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9253,10 +9641,6 @@ msgstr "حجم الخط غير صالح"
msgid "Input"
msgstr "أض٠مدخله"
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
@@ -9274,6 +9658,128 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Split already exists."
+#~ msgstr "التحميل التلقائي '%s' موجود اصلا!"
+
+#, fuzzy
+#~ msgid "Add Split"
+#~ msgstr "Ø¥Ø¶Ø§ÙØ© نقطة"
+
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr "مسار غير صالح."
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "مسح النقطة"
+
+#, fuzzy
+#~ msgid "Poly"
+#~ msgstr "تعديل البولي"
+
+#~ msgid "No name provided"
+#~ msgstr "لا أسم Ù…Ùقدم"
+
+#~ msgid "Create Poly"
+#~ msgstr "إنشاء بولي"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "إنشاء Ù…ÙØ¶Ù„ع جديد من Ø§Ù„ØµÙØ±"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "إبعاد"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "تقريب"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "إنشاء بولي 3d"
+
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "لا مصدر شكل Ù…ÙØ·Ø¨Ù‚ 2D ÙÙŠ هذه العقدة.\n"
+#~ "أنشئ و ضع واحدة؟"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "زر Ø§Ù„ÙØ£Ø±Ø© الأوسط: تحريك النقطة."
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "Ctrl+ زر Ø§Ù„ÙØ£Ø±Ø© الأوسط: ÙØµÙ„ المقطع."
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "زر Ø§Ù„ÙØ£Ø±Ø© الأيمن: مسح النقطة."
+
+#, fuzzy
+#~ msgid "New TextFile"
+#~ msgstr "إظهار Ø§Ù„Ù…Ù„ÙØ§Øª"
+
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "تقريب"
+
+#~ msgid "Class List:"
+#~ msgstr "قائمة الأصناÙ:"
+
+#~ msgid "Search Classes"
+#~ msgstr "إبحث ÙÙŠ الأصناÙ"
+
+#~ msgid "Public Methods"
+#~ msgstr "الطرق العامة"
+
+#~ msgid "Public Methods:"
+#~ msgstr "الطرق العامة:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "عناصر ثيم واجهة المستخدم"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "عناصر ثيم واجهة المستخدم:"
+
+#, fuzzy
+#~ msgid "Property: "
+#~ msgstr "خصائص"
+
+#, fuzzy
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "تبديل حالة المجلد كما Ø§Ù„Ù…ÙØ¶Ù„Ø©"
+
+#, fuzzy
+#~ msgid "Show current scene file."
+#~ msgstr "Ø­ÙØ¸ العنوان Ø§Ù„ÙØ±Ø¹ÙŠ Ø§Ù„Ø°ÙŠ يتم تعديله حاليا."
+
+#, fuzzy
+#~ msgid "Whole words"
+#~ msgstr "كل الكلمات"
+
+#, fuzzy
+#~ msgid "Match case"
+#~ msgstr "قضية تشابه"
+
+#~ msgid "Ok"
+#~ msgstr "حسنا"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "إبحث ÙÙŠ هرمية الأصناÙ."
+
+#, fuzzy
+#~ msgid "Search in files"
+#~ msgstr "إبحث ÙÙŠ الأصناÙ"
+
+#, fuzzy
+#~ msgid "Snap To Floor"
+#~ msgstr "الكبس إلي الشبكة"
+
+#~ msgid "Bake!"
+#~ msgstr "طبخ!"
+
+#~ msgid "Bake the navigation mesh."
+#~ msgstr "طبخ ميش المحاور."
+
#~ msgid "Modify Color Ramp"
#~ msgstr "تعديل منحدر اللون"
@@ -9301,9 +9807,6 @@ msgstr ""
#~ msgid "Anim Track Change Wrap Mode"
#~ msgstr "تغيير صيغة الغلا٠لمسار التحريك"
-#~ msgid "Edit Node Curve"
-#~ msgstr "تحرير منحنى العقدة"
-
#~ msgid "Edit Selection Curve"
#~ msgstr "تحرير منحنى الإختيار"
@@ -9376,12 +9879,6 @@ msgstr ""
#~ msgid "Ugh"
#~ msgstr "آخخ"
-#~ msgid "Run Script"
-#~ msgstr "تشغيل الكود"
-
-#~ msgid "Save the currently edited resource."
-#~ msgstr "Ø­ÙØ¸ المورد الذي يتم تعديله حاليا."
-
#~ msgid "Stop Profiling"
#~ msgstr "إيقا٠التنميط"
@@ -9493,9 +9990,6 @@ msgstr ""
#~ msgid "Could not save atlas subtexture:"
#~ msgstr "لا يمكن Ø­ÙØ¸ النسيج Ø§Ù„ÙØ±Ø¹ÙŠ Ù„Ù„Ø£Ø·Ù„Ø³:"
-#~ msgid "Exporting for %s"
-#~ msgstr "التصدير كـ %s"
-
#~ msgid "Setting Up..."
#~ msgstr "جاري الإعداد..."
diff --git a/editor/translations/bg.po b/editor/translations/bg.po
index beeb2be3c6..9c1f8d5c5d 100644
--- a/editor/translations/bg.po
+++ b/editor/translations/bg.po
@@ -1,25 +1,26 @@
# Bulgarian translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
-#
# Bojidar Marinov <bojidar.marinov.bg@gmail.com>, 2016.
# Иван Пенев (Ðдмирал ÐнимЕ) <aeternus.arcis@gmail.com>, 2016-2017.
# Любомир ВаÑилев <lyubomirv@abv.bg>, 2018.
# MaresPW <marespw206@gmail.com>, 2018.
-#
+# PakoSt <kokotekilata@gmail.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-01-24 18:44+0000\n"
-"Last-Translator: MaresPW <marespw206@gmail.com>\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:38+0100\n"
+"Last-Translator: PakoSt <kokotekilata@gmail.com>\n"
"Language-Team: Bulgarian <https://hosted.weblate.org/projects/godot-engine/"
"godot/bg/>\n"
"Language: bg\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.19-dev\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -29,7 +30,7 @@ msgstr ""
"TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr "ÐедоÑтатъчно байтове за разкодиране или недейÑтвителен формат."
@@ -55,11 +56,8 @@ msgid "Invalid named index '%s' for base type %s"
msgstr ""
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid arguments to construct '%s'"
-msgstr ""
-"Ðевалиден агрумент тип на convert(), използвайте конÑтантите започващи Ñ "
-"TYPE_*."
+msgstr "Ðевалидени агрументи за конÑÑ‚Ñ€ÑƒÐºÑ†Ð¸Ñ '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
@@ -67,8 +65,9 @@ msgstr ""
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
msgid "Free"
-msgstr ""
+msgstr "Свободен"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
@@ -77,7 +76,7 @@ msgstr ""
#: editor/animation_bezier_editor.cpp
#, fuzzy
msgid "Mirror"
-msgstr "Грешки"
+msgstr "Отрази (огледално)"
#: editor/animation_bezier_editor.cpp
msgid "Insert Key Here"
@@ -241,12 +240,12 @@ msgstr ""
#: editor/animation_track_editor.cpp
#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "Имаше грешка при внаÑÑнето:"
+msgstr "Ðаправи дупликат на Key(s)"
#: editor/animation_track_editor.cpp
#, fuzzy
msgid "Delete Key(s)"
-msgstr "Изтриване на анимациÑта?"
+msgstr "Изтрий Key(s)"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -264,7 +263,6 @@ msgstr ""
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -375,9 +373,8 @@ msgid "Edit"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "Изтриване на анимациÑта?"
+msgstr "ХарактериÑтики на анимациÑта."
#: editor/animation_track_editor.cpp
msgid "Copy Tracks"
@@ -396,8 +393,7 @@ msgstr ""
msgid "Scale From Cursor"
msgstr ""
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr ""
@@ -406,17 +402,18 @@ msgid "Duplicate Transposed"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
-msgstr "Ðова Ñцена"
+msgstr "Изтрий СелекциÑта"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
-msgstr ""
+#, fuzzy
+msgid "Go to Next Step"
+msgstr "Отиди на Следваща Стъпка"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
-msgstr ""
+#, fuzzy
+msgid "Go to Previous Step"
+msgstr "Отиди на Предишна Стъпка"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
@@ -428,7 +425,7 @@ msgstr "ПочиÑтване на анимациÑта"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "Избери възелa, който да бъде анимиран:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
@@ -452,7 +449,7 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Optimize"
-msgstr ""
+msgstr "Оптимизирай"
#: editor/animation_track_editor.cpp
msgid "Remove invalid keys"
@@ -504,67 +501,73 @@ msgstr ""
#: editor/code_editor.cpp
msgid "Go to Line"
-msgstr ""
+msgstr "Отиди на Ред"
#: editor/code_editor.cpp
msgid "Line Number:"
-msgstr ""
+msgstr "Ðомер на Реда:"
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "No Matches"
-msgstr ""
+msgstr "ÐÑма СъвпадениÑ"
#: editor/code_editor.cpp
+#, fuzzy
msgid "Replaced %d occurrence(s)."
-msgstr ""
+msgstr "Готово - %d замеÑтване(ниÑ)."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
-msgstr ""
+msgstr "Цели Думи"
#: editor/code_editor.cpp editor/rename_dialog.cpp
msgid "Replace"
-msgstr ""
+msgstr "Преименувай"
#: editor/code_editor.cpp
msgid "Replace All"
-msgstr ""
+msgstr "Преименувай Ð’Ñички"
#: editor/code_editor.cpp
msgid "Selection Only"
-msgstr ""
+msgstr "Само СелекциÑта"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
-msgstr ""
+msgstr "Приближи"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
-msgstr ""
+msgstr "Отдалечи"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr ""
#: editor/code_editor.cpp
msgid "Warnings:"
-msgstr ""
+msgstr "ПредупреждениÑ:"
#: editor/code_editor.cpp
-msgid "Zoom:"
-msgstr ""
+#, fuzzy
+msgid "Font Size:"
+msgstr "Изглед Отпред."
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
-msgstr ""
+msgstr "Ред:"
#: editor/code_editor.cpp
msgid "Col:"
-msgstr ""
+msgstr "Колона:"
#: editor/connections_dialog.cpp
msgid "Method in target Node must be specified!"
@@ -584,15 +587,16 @@ msgstr ""
#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
msgid "Add"
-msgstr ""
+msgstr "Добави"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
-msgstr ""
+msgstr "Премахни"
#: editor/connections_dialog.cpp
msgid "Add Extra Call Argument:"
@@ -634,41 +638,39 @@ msgstr "ЗатварÑне"
#: editor/connections_dialog.cpp
msgid "Connect"
-msgstr ""
+msgstr "Свържи"
#: editor/connections_dialog.cpp
msgid "Connect '%s' to '%s'"
-msgstr ""
+msgstr "Свържи '%s' Ñ '%s'"
#: editor/connections_dialog.cpp
msgid "Disconnect '%s' from '%s'"
-msgstr ""
+msgstr "Разкачи '%s' от '%s'"
#: editor/connections_dialog.cpp
msgid "Disconnect all from signal: '%s'"
-msgstr ""
+msgstr "Разкачи вÑички Ñигнали: '%s'"
#: editor/connections_dialog.cpp
msgid "Connect..."
-msgstr ""
+msgstr "Свържи..."
#: editor/connections_dialog.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Disconnect"
-msgstr ""
+msgstr "Разкачи"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect Signal: "
-msgstr "Свързване..."
+msgstr "Свържи Сигнала: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection: "
-msgstr "Свързване..."
+msgstr "Промени Връзката: "
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -681,7 +683,7 @@ msgstr ""
#: editor/connections_dialog.cpp
msgid "Disconnect All"
-msgstr ""
+msgstr "Разкачи Ð’Ñички"
#: editor/connections_dialog.cpp
#, fuzzy
@@ -713,26 +715,23 @@ msgstr "Любими:"
#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
msgid "Recent:"
-msgstr ""
+msgstr "Скорошни:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "ТърÑене:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
-msgstr ""
+msgstr "Съвпадащи:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "ОпиÑание:"
@@ -760,21 +759,20 @@ msgstr ""
#: editor/dependency_editor.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Dependencies"
-msgstr ""
+msgstr "ЗавиÑимоÑти"
#: editor/dependency_editor.cpp
msgid "Resource"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr ""
#: editor/dependency_editor.cpp
msgid "Dependencies:"
-msgstr ""
+msgstr "ЗавиÑимоÑти:"
#: editor/dependency_editor.cpp
msgid "Fix Broken"
@@ -789,13 +787,14 @@ msgid "Search Replacement Resource:"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
-msgstr ""
+msgstr "Отвори"
#: editor/dependency_editor.cpp
msgid "Owners Of:"
@@ -803,7 +802,7 @@ msgstr ""
#: editor/dependency_editor.cpp
msgid "Remove selected files from the project? (no undo)"
-msgstr ""
+msgstr "Премахни Ñелектираните файлове от проекта? (необратимо)"
#: editor/dependency_editor.cpp
msgid ""
@@ -814,31 +813,32 @@ msgstr ""
#: editor/dependency_editor.cpp editor/export_template_manager.cpp
msgid "Cannot remove:"
-msgstr ""
+msgstr "Ðе може да Ñе премахне:"
#: editor/dependency_editor.cpp
msgid "Error loading:"
-msgstr ""
+msgstr "Грешка при зареждане:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+#, fuzzy
+msgid "Load failed due to missing dependencies:"
msgstr "Сцената не уÑÐ¿Ñ Ð´Ð° Ñе зареди заради липÑващи завиÑимоÑти:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
-msgstr ""
+msgstr "Отвори Въпреки това"
#: editor/dependency_editor.cpp
msgid "Which action should be taken?"
-msgstr ""
+msgstr "Кое дейÑтвие да Ñе изпълни?"
#: editor/dependency_editor.cpp
msgid "Fix Dependencies"
-msgstr ""
+msgstr "Поправи ЗавиÑимоÑтите"
#: editor/dependency_editor.cpp
msgid "Errors loading!"
-msgstr ""
+msgstr "Грешки при зареждането!"
#: editor/dependency_editor.cpp
msgid "Permanently delete %d item(s)? (No undo!)"
@@ -858,7 +858,7 @@ msgstr ""
#: editor/dependency_editor.cpp
msgid "Delete selected files?"
-msgstr ""
+msgstr "Изтрий избраните файлове?"
#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
@@ -866,7 +866,7 @@ msgstr ""
#: editor/project_export.cpp editor/project_settings_editor.cpp
#: editor/scene_tree_dock.cpp
msgid "Delete"
-msgstr ""
+msgstr "Изтрий"
#: editor/dictionary_property_edit.cpp
msgid "Change Dictionary Key"
@@ -878,15 +878,7 @@ msgstr ""
#: editor/editor_about.cpp
msgid "Thanks from the Godot community!"
-msgstr ""
-
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "Добре"
+msgstr "БлагодарÑ! От общноÑтта на Godot!"
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
@@ -897,8 +889,9 @@ msgid "Project Founders"
msgstr "ОÑнователи на проекта"
#: editor/editor_about.cpp
+#, fuzzy
msgid "Lead Developer"
-msgstr ""
+msgstr "Главен Разработчик"
#: editor/editor_about.cpp
msgid "Project Manager "
@@ -910,7 +903,7 @@ msgstr ""
#: editor/editor_about.cpp
msgid "Authors"
-msgstr ""
+msgstr "Ðвтори"
#: editor/editor_about.cpp
msgid "Platinum Sponsors"
@@ -942,7 +935,7 @@ msgstr ""
#: editor/editor_about.cpp
msgid "License"
-msgstr ""
+msgstr "Лиценз"
#: editor/editor_about.cpp
msgid "Thirdparty License"
@@ -977,7 +970,7 @@ msgid "Uncompressing Assets"
msgstr "Разархивиране на активи"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+msgid "Package installed successfully!"
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1059,8 +1052,7 @@ msgid "Bus options"
msgstr "ÐаÑтройки на шината"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr ""
@@ -1220,7 +1212,7 @@ msgid "Add AutoLoad"
msgstr ""
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "Път:"
@@ -1228,8 +1220,8 @@ msgstr "Път:"
msgid "Node Name:"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr ""
@@ -1243,7 +1235,7 @@ msgstr "ОбновÑване на Ñцената"
#: editor/editor_data.cpp
msgid "Storing local changes..."
-msgstr ""
+msgstr "Запазване на локалните промени..."
#: editor/editor_data.cpp
msgid "Updating scene..."
@@ -1263,7 +1255,7 @@ msgstr "МолÑ, първо изберете оÑновна папка"
#: editor/editor_dir_dialog.cpp
msgid "Choose a Directory"
-msgstr ""
+msgstr "Избери ДиректориÑ"
#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
@@ -1284,7 +1276,7 @@ msgstr "ÐеуÑпешно Ñъздаване на папка."
#: editor/editor_dir_dialog.cpp
msgid "Choose"
-msgstr ""
+msgstr "Избери"
#: editor/editor_export.cpp
msgid "Storing File:"
@@ -1299,12 +1291,17 @@ msgid "Template file not found:"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Избиране на текущата папка"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "Файлът ÑъщеÑтвува. ИÑкате ли да го презапишете?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "Избиране на текущата папка"
+#, fuzzy
+msgid "Select This Folder"
+msgstr "Изберете метод"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
@@ -1312,13 +1309,14 @@ msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr "ДиÑпечер на проектите"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
-msgstr ""
+#, fuzzy
+msgid "Show in File Manager"
+msgstr "Покажи във Файлов Мениджър"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
@@ -1330,30 +1328,31 @@ msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "All Recognized"
-msgstr ""
+msgstr "Ð’Ñички Разпознати"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "All Files (*)"
-msgstr ""
+msgstr "Ð’Ñички Файлове (*)"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a File"
-msgstr ""
+msgstr "Отвори Файл"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open File(s)"
-msgstr ""
+msgstr "Отвори Файл(ове)"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a Directory"
-msgstr ""
+msgstr "Отвори ДиректориÑ"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a File or Directory"
-msgstr ""
+msgstr "Отвори Файл или ДиректориÑ"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Запазване"
@@ -1376,11 +1375,11 @@ msgstr ""
#: editor/editor_file_dialog.cpp
msgid "Toggle Hidden Files"
-msgstr ""
+msgstr "Покажи Скрити Файлове"
#: editor/editor_file_dialog.cpp
msgid "Toggle Favorite"
-msgstr ""
+msgstr "Покажи Любими"
#: editor/editor_file_dialog.cpp
msgid "Toggle Mode"
@@ -1411,8 +1410,7 @@ msgstr "Папки и файлове:"
msgid "Preview:"
msgstr ""
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "Файл:"
@@ -1428,30 +1426,17 @@ msgstr ""
msgid "(Re)Importing Assets"
msgstr "Извършва Ñе повторно внаÑÑне"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr ""
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr ""
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
-msgstr ""
+msgstr "КлаÑ:"
#: editor/editor_help.cpp editor/scene_tree_editor.cpp
msgid "Inherits:"
-msgstr ""
+msgstr "ÐаÑледÑва:"
#: editor/editor_help.cpp
msgid "Inherited by:"
@@ -1459,31 +1444,34 @@ msgstr ""
#: editor/editor_help.cpp
msgid "Brief Description:"
-msgstr ""
+msgstr "Кратко ОпиÑание:"
#: editor/editor_help.cpp
-msgid "Members"
+msgid "Properties"
msgstr ""
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
+#: editor/editor_help.cpp
+msgid "Properties:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "Публични методи"
+msgid "Methods"
+msgstr "Методи"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr ""
+#, fuzzy
+msgid "Methods:"
+msgstr "Методи"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr ""
+#, fuzzy
+msgid "Theme Properties"
+msgstr "ПоÑтавÑне на възелите"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr ""
+#, fuzzy
+msgid "Theme Properties:"
+msgstr "ПоÑтавÑне на възелите"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1507,13 +1495,19 @@ msgstr "КонÑтанти"
#: editor/editor_help.cpp
msgid "Constants:"
-msgstr ""
+msgstr "КонÑтанти:"
#: editor/editor_help.cpp
-msgid "Description"
+#, fuzzy
+msgid "Class Description"
msgstr "ОпиÑание"
#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
+msgstr "ОпиÑание:"
+
+#: editor/editor_help.cpp
msgid "Online Tutorials:"
msgstr ""
@@ -1525,12 +1519,14 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr ""
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "Кратко ОпиÑание:"
#: editor/editor_help.cpp
-msgid "Property Description:"
-msgstr ""
+#, fuzzy
+msgid "Property Descriptions:"
+msgstr "Кратко ОпиÑание:"
#: editor/editor_help.cpp
msgid ""
@@ -1539,12 +1535,14 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "Методи"
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "ОпиÑание"
#: editor/editor_help.cpp
-msgid "Method Description:"
-msgstr ""
+#, fuzzy
+msgid "Method Descriptions:"
+msgstr "ОпиÑание:"
#: editor/editor_help.cpp
msgid ""
@@ -1552,12 +1550,59 @@ msgid ""
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-#: editor/editor_inspector.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "ТърÑи в Помощ"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Display All"
+msgstr "Преименувай Ð’Ñички"
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
#, fuzzy
-msgid "Property: "
+msgid "Methods Only"
+msgstr "Методи"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "Само СелекциÑта"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Constants Only"
+msgstr "КонÑтанти"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Properties Only"
msgstr "Изберете ÑвойÑтво"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Theme Properties Only"
+msgstr "Изберете ÑвойÑтво"
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Class"
+msgstr "КлаÑ:"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1592,21 +1637,26 @@ msgstr ""
msgid "Error saving resource!"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "Добре"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr ""
#: editor/editor_node.cpp
msgid "Can't open file for writing:"
-msgstr ""
+msgstr "Файлът не може да бъде отворен за запиÑване:"
#: editor/editor_node.cpp
msgid "Requested file format unknown:"
-msgstr ""
+msgstr "Форматът на Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð» е неразпознат:"
#: editor/editor_node.cpp
msgid "Error while saving."
-msgstr ""
+msgstr "Грешка при запиÑване."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
@@ -1618,7 +1668,7 @@ msgstr "Грешка при анализа на „%s“."
#: editor/editor_node.cpp
msgid "Unexpected end of file '%s'."
-msgstr ""
+msgstr "Ðеочакван край на файла '%s'."
#: editor/editor_node.cpp
msgid "Missing '%s' or its dependencies."
@@ -1634,7 +1684,7 @@ msgstr "Запазване на Ñцената"
#: editor/editor_node.cpp
msgid "Analyzing"
-msgstr ""
+msgstr "Ðнализира Ñе"
#: editor/editor_node.cpp
msgid "Creating Thumbnail"
@@ -1646,10 +1696,20 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr ""
@@ -1744,6 +1804,7 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Current scene was never saved, please save it prior to running."
msgstr ""
+"Сегашната Ñцена никога не е била запазена, молÑ, запазете Ñ Ð¿Ñ€ÐµÐ´Ð¸ изпълнение."
#: editor/editor_node.cpp
msgid "Could not start subprocess!"
@@ -1787,11 +1848,11 @@ msgstr ""
#: editor/editor_node.cpp
msgid "This scene has never been saved. Save before running?"
-msgstr ""
+msgstr "Тази Ñцена не е била запазвана преди. Запази преди да пуÑнеш?"
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "This operation can't be done without a scene."
-msgstr ""
+msgstr "ОперациÑта не може да Ñе извърши без Ñцена."
#: editor/editor_node.cpp
msgid "Export Mesh Library"
@@ -1811,11 +1872,11 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Current scene not saved. Open anyway?"
-msgstr ""
+msgstr "Текущата Ñцена не е запазена. Отвори въпреки това?"
#: editor/editor_node.cpp
msgid "Can't reload a scene that was never saved."
-msgstr ""
+msgstr "Сцена, коÑто никога не е била запазвана, не може да Ñе презареди."
#: editor/editor_node.cpp
msgid "Revert"
@@ -1879,6 +1940,12 @@ msgstr "Грешка при зареждането на шрифта."
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1920,6 +1987,12 @@ msgstr ""
msgid "Default"
msgstr ""
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+#, fuzzy
+msgid "Show in FileSystem"
+msgstr "Покажи във Файлова СиÑтема"
+
#: editor/editor_node.cpp
#, fuzzy
msgid "Play This Scene"
@@ -2005,7 +2078,8 @@ msgid "Save Scene"
msgstr "Запазване на Ñцената"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+#, fuzzy
+msgid "Save All Scenes"
msgstr "Запазване на вÑички Ñцени"
#: editor/editor_node.cpp
@@ -2034,7 +2108,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -2058,7 +2132,7 @@ msgstr "ÐаÑтройки на проекта"
msgid "Export"
msgstr "ИзнаÑÑне"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "Сечива"
@@ -2072,6 +2146,7 @@ msgid "Quit to Project List"
msgstr "Изход до ÑпиÑъка Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð¸"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "ОтÑтранÑване на грешки"
@@ -2181,10 +2256,6 @@ msgstr ""
msgid "Help"
msgstr ""
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2269,7 +2340,7 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Update Always"
-msgstr ""
+msgstr "ОбновÑвай Винаги"
#: editor/editor_node.cpp
msgid "Update Changes"
@@ -2279,26 +2350,26 @@ msgstr ""
msgid "Disable Update Spinner"
msgstr ""
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "ВнаÑÑне"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "Възел"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr ""
#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr "ИнÑпектор"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Възел"
+
+#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
-msgstr ""
+msgstr "Разшири Ð”Ð¾Ð»Ð½Ð¸Ñ ÐŸÐ°Ð½ÐµÐ»"
#: editor/editor_node.cpp scene/resources/visual_shader.cpp
msgid "Output"
@@ -2306,7 +2377,7 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Don't Save"
-msgstr ""
+msgstr "Ðе Запазвай"
#: editor/editor_node.cpp
msgid "Import Templates From ZIP File"
@@ -2326,7 +2397,7 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Password:"
-msgstr ""
+msgstr "Парола:"
#: editor/editor_node.cpp
msgid "Open & Run a Script"
@@ -2355,7 +2426,7 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Open Script Editor"
-msgstr ""
+msgstr "Отвори Кодов Редактор"
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "Open Asset Library"
@@ -2432,7 +2503,7 @@ msgstr ""
msgid "Physics Frame %"
msgstr ""
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr ""
@@ -2456,7 +2527,7 @@ msgstr ""
msgid "Calls"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2468,20 +2539,43 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Invalid RID"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr "Ðов Ñкрипт"
@@ -2493,10 +2587,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2505,7 +2595,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "ПоÑтавÑне"
@@ -2748,7 +2839,7 @@ msgstr "Запитване..."
#: editor/export_template_manager.cpp
msgid "Downloading"
-msgstr ""
+msgstr "ИзтеглÑне"
#: editor/export_template_manager.cpp
#, fuzzy
@@ -2799,6 +2890,11 @@ msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr ""
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "Любими:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
@@ -2837,8 +2933,8 @@ msgstr "Имаше грешка при внаÑÑнето:"
msgid "Unable to update dependencies:"
msgstr "Сцената '%s' има нарушени завиÑимоÑти:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2846,16 +2942,12 @@ msgid "Provided name contains invalid characters"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr ""
#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
-msgstr ""
+msgstr "Вече ÑъщеÑтвува файл или папка Ñ Ñ‚Ð¾Ð²Ð° име."
#: editor/filesystem_dock.cpp
#, fuzzy
@@ -2876,29 +2968,23 @@ msgid "Duplicating folder:"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr ""
+#, fuzzy
+msgid "Open Scene(s)"
+msgstr "ОтварÑне на Ñцена"
#: editor/filesystem_dock.cpp
-msgid "Move To..."
+msgid "Instance"
msgstr ""
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open Scene(s)"
-msgstr "ОтварÑне на Ñцена"
+msgid "Add to favorites"
+msgstr "Любими:"
#: editor/filesystem_dock.cpp
-msgid "Instance"
-msgstr ""
+#, fuzzy
+msgid "Remove from favorites"
+msgstr "Премахни Ð’Ñички Breakpoint-ове"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -2908,11 +2994,19 @@ msgstr ""
msgid "View Owners..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr ""
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr ""
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
msgstr "Ðов Ñкрипт"
@@ -2922,6 +3016,15 @@ msgstr "Ðов Ñкрипт"
msgid "New Resource..."
msgstr "Ðова папка..."
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Collapse All"
+msgstr "ЗатварÑне на вÑичко"
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -2942,34 +3045,26 @@ msgid "Re-Scan Filesystem"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Toggle folder status as Favorite."
-msgstr ""
+#, fuzzy
+msgid "Toggle split mode"
+msgstr "Покажи Любими"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Show current scene file."
-msgstr "Избиране на текущата папка"
+msgid "Search files"
+msgstr "ТърÑене"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "ТърÑене"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
msgstr ""
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr ""
@@ -2986,46 +3081,45 @@ msgid "Create Script"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Find in files"
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Find: "
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Whole words"
-msgstr ""
+#, fuzzy
+msgid "Find in Files"
+msgstr "Ðамери във файлове"
#: editor/find_in_files.cpp
-msgid "Match case"
-msgstr ""
+#, fuzzy
+msgid "Find:"
+msgstr "Ðамери: "
#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+#, fuzzy
+msgid "Folder:"
+msgstr "Папка: "
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Filter: "
+msgid "Filters:"
msgstr "ПоÑтавÑне на възелите"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
msgid "Find..."
-msgstr ""
+msgstr "Ðамери..."
#: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp
msgid "Replace..."
-msgstr ""
+msgstr "ЗамеÑти..."
#: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp
msgid "Cancel"
msgstr "Отказ"
#: editor/find_in_files.cpp
+msgid "Find: "
+msgstr "Ðамери: "
+
+#: editor/find_in_files.cpp
msgid "Replace: "
-msgstr ""
+msgstr "ЗамеÑти: "
#: editor/find_in_files.cpp
msgid "Replace all (no undo)"
@@ -3038,20 +3132,21 @@ msgstr "ТърÑене"
#: editor/find_in_files.cpp
msgid "Search complete"
-msgstr ""
+msgstr "ТърÑенето е завършено"
#: editor/groups_editor.cpp
+#, fuzzy
msgid "Group name already exists."
-msgstr ""
+msgstr "Група Ñ Ñ‚Ð¾Ð²Ð° име вече ÑъщеÑтвува."
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
-msgstr "Име:"
+msgid "Invalid group name."
+msgstr "невалидно име на Група."
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
-msgstr ""
+msgstr "Групи"
#: editor/groups_editor.cpp
msgid "Nodes not in Group"
@@ -3086,40 +3181,47 @@ msgstr "ВнаÑÑне на Ñцената..."
#: editor/import/resource_importer_scene.cpp
#, fuzzy
msgid "Import with Separate Animations"
-msgstr "ВнаÑÑне на анимации..."
+msgstr "ВнеÑи Ñ Ðнимации поотделно"
#: editor/import/resource_importer_scene.cpp
+#, fuzzy
msgid "Import with Separate Materials"
-msgstr ""
+msgstr "ВнеÑи Ñ ÐœÐ°Ñ‚ÐµÑ€Ð¸Ð°Ð»Ð¸Ñ‚Ðµ поотделно"
#: editor/import/resource_importer_scene.cpp
+#, fuzzy
msgid "Import with Separate Objects"
-msgstr ""
+msgstr "ВнеÑи Ñ ÐžÐ±ÐµÐºÑ‚Ð¸Ñ‚Ðµ поотделно"
#: editor/import/resource_importer_scene.cpp
+#, fuzzy
msgid "Import with Separate Objects+Materials"
-msgstr ""
+msgstr "ВнеÑи Ñ ÐžÐ±ÐµÐºÑ‚Ð¸Ñ‚Ðµ и Материалите поотделно"
#: editor/import/resource_importer_scene.cpp
+#, fuzzy
msgid "Import with Separate Objects+Animations"
-msgstr ""
+msgstr "ВнеÑи Ñ ÐžÐ±ÐµÐºÑ‚Ð¸Ñ‚Ðµ и Ðнимациите поотделно"
#: editor/import/resource_importer_scene.cpp
+#, fuzzy
msgid "Import with Separate Materials+Animations"
-msgstr ""
+msgstr "ВнеÑи Ñ ÐœÐ°Ñ‚ÐµÑ€Ð¸Ð°Ð»Ð¸Ñ‚Ðµ и Ðнимациите поотделно"
#: editor/import/resource_importer_scene.cpp
+#, fuzzy
msgid "Import with Separate Objects+Materials+Animations"
-msgstr ""
+msgstr "ВнеÑи Ñ ÐžÐ±ÐµÐºÑ‚Ð¸Ñ‚Ðµ, Материалите и Ðнимациите поотделно"
#: editor/import/resource_importer_scene.cpp
#, fuzzy
msgid "Import as Multiple Scenes"
-msgstr "ВнаÑÑне на триизмерна Ñцена"
+msgstr "ВнеÑи като ÐÑколко Сцени"
#: editor/import/resource_importer_scene.cpp
+#, fuzzy
msgid "Import as Multiple Scenes+Materials"
-msgstr ""
+msgstr "ВнеÑи като ÐÑколко Сцени и Материали"
#: editor/import/resource_importer_scene.cpp
#: editor/plugins/mesh_library_editor_plugin.cpp
@@ -3156,15 +3258,17 @@ msgstr ""
#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
-msgstr ""
+msgstr "Запазване..."
#: editor/import_dock.cpp
+#, fuzzy
msgid "Set as Default for '%s'"
-msgstr ""
+msgstr "Задай по Подразбиране за '%s'"
#: editor/import_dock.cpp
+#, fuzzy
msgid "Clear Default for '%s'"
-msgstr ""
+msgstr "ИзчиÑти по Подразбиране за '%s'"
#: editor/import_dock.cpp
#, fuzzy
@@ -3184,26 +3288,23 @@ msgid "Reimport"
msgstr "Повторно внаÑÑне"
#: editor/inspector_dock.cpp
+#, fuzzy
msgid "Failed to load resource."
-msgstr ""
-
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr ""
+msgstr "ÐеуÑпешно зареждане на реÑурÑите."
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
-msgstr ""
+#, fuzzy
+msgid "Collapse All Properties"
+msgstr "ПоÑтавÑне на възелите"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
msgid "Save As..."
-msgstr ""
+msgstr "Запази Като..."
#: editor/inspector_dock.cpp
msgid "Copy Params"
@@ -3230,8 +3331,9 @@ msgid "Make Sub-Resources Unique"
msgstr ""
#: editor/inspector_dock.cpp
+#, fuzzy
msgid "Open in Help"
-msgstr ""
+msgstr "Отвори в Помощника"
#: editor/inspector_dock.cpp
msgid "Create a new resource in memory and edit it."
@@ -3242,6 +3344,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr ""
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr ""
@@ -3254,8 +3360,9 @@ msgid "History of recently edited objects."
msgstr ""
#: editor/inspector_dock.cpp
+#, fuzzy
msgid "Object properties."
-msgstr ""
+msgstr "ХарактериÑтики на обекта."
#: editor/inspector_dock.cpp
#, fuzzy
@@ -3264,7 +3371,7 @@ msgstr "ПоÑтавÑне на възелите"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
-msgstr ""
+msgstr "Промените могат да бъдат загубени!"
#: editor/multi_node_edit.cpp
msgid "MultiNode Set"
@@ -3291,7 +3398,7 @@ msgstr "ПриÑтавки"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
-msgstr ""
+msgstr "Подпапка:"
#: editor/plugin_config_dialog.cpp
#, fuzzy
@@ -3305,49 +3412,54 @@ msgstr "Име:"
#: editor/plugin_config_dialog.cpp
msgid "Activate now?"
-msgstr ""
+msgstr "Ðктивирай Ñега?"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
-msgstr ""
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
+msgstr "Създаване на папка"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
-msgstr ""
+#, fuzzy
+msgid "Edit Polygon"
+msgstr "ПриÑтавки"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
-msgstr ""
+#, fuzzy
+msgid "Remove Polygon And Point"
+msgstr "ПремеÑтване на Полигон"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr ""
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr "Създай точки."
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#, fuzzy
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
+"Промени ÑъщеÑтвуващ полигон:\n"
+"LMB: ПремеÑти Точка.\n"
+"Ctrl+LMB: Раздели Сегмент.\n"
+"RMB: Изтрии Точка."
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
-msgid "Delete points"
-msgstr "Изтриване на анимациÑта?"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr "Изтрий точки."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3355,14 +3467,15 @@ msgstr "Изтриване на анимациÑта?"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Animation"
-msgstr ""
+msgstr "Добави ÐнимациÑ"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Load.."
-msgstr ""
+#, fuzzy
+msgid "Load..."
+msgstr "Зареди..."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3386,19 +3499,14 @@ msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Select and move points, create points with RMB."
-msgstr ""
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
#, fuzzy
-msgid "Create points."
-msgstr "Изтриване на анимациÑта?"
+msgid "Select and move points, create points with RMB."
+msgstr "Селектирай и меÑти точки, Ñъздай точки Ñ RMB."
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "Изтриване на анимациÑта?"
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3411,15 +3519,16 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
msgid "Open Animation Node"
-msgstr "Оптимизиране на анимациÑта"
+msgstr "Отвори Ðнимационен Възел"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Triangle already exists"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
msgid "BlendSpace2D does not belong to an AnimationTree node."
-msgstr ""
+msgstr "BlendSpace2D не принадлежи на възел тип AnimationTree."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "No triangles exist, so no blending can take place."
@@ -3438,16 +3547,15 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#, fuzzy
msgid "Edit Filters"
-msgstr "Файл:"
+msgstr "Промени Филтрите"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Output node can't be added to the blend tree."
@@ -3475,8 +3583,9 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add Node.."
-msgstr ""
+#, fuzzy
+msgid "Add Node..."
+msgstr "Добави Възел..."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
@@ -3485,8 +3594,9 @@ msgid "Edit Filtered Tracks:"
msgstr "Файл:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#, fuzzy
msgid "Enable filtering"
-msgstr ""
+msgstr "Позволи филтриране"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
@@ -3494,7 +3604,7 @@ msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "New Animation Name:"
-msgstr ""
+msgstr "Ðово Име на ÐнимациÑ:"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "New Anim"
@@ -3502,7 +3612,7 @@ msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Change Animation Name:"
-msgstr ""
+msgstr "Промени Името на ÐнимациÑта:"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Delete Animation?"
@@ -3560,9 +3670,8 @@ msgid "Paste Animation"
msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to edit!"
-msgstr "ÐÑма артикули за внаÑÑне!"
+msgstr "ÐÑма Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° променÑне!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
@@ -3594,7 +3703,7 @@ msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation Tools"
-msgstr ""
+msgstr "Ðнимационни ИнÑтрументи"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -3691,7 +3800,7 @@ msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
#: editor/script_create_dialog.cpp
msgid "Error!"
-msgstr ""
+msgstr "Грешка!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Blend Times:"
@@ -3744,17 +3853,17 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
msgid "Create new nodes."
-msgstr "Създайте нов/а %s"
+msgstr "Създай нови възли."
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
msgid "Connect nodes."
-msgstr "ИзрÑзване на възелите"
+msgstr "Свържи възли."
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
-msgstr "Премахване на пътечката."
+msgid "Remove selected node or transition."
+msgstr "Премахни ÑÐµÐ»ÐµÐºÑ‚Ð¸Ñ€Ð°Ð½Ð¸Ñ Ð²ÑŠÐ·ÐµÐ» или преход."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
@@ -3777,12 +3886,12 @@ msgstr "Изтриване на анимациÑта?"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "New name:"
-msgstr ""
+msgstr "Ðово име:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Scale:"
-msgstr ""
+msgstr "Мащаб:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Fade In (s):"
@@ -3801,8 +3910,9 @@ msgid "Mix"
msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#, fuzzy
msgid "Auto Restart:"
-msgstr ""
+msgstr "Ðвтоматично РеÑтартиране:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Restart (s):"
@@ -3822,10 +3932,6 @@ msgid "Amount:"
msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr ""
@@ -3867,7 +3973,7 @@ msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Animation Node"
-msgstr ""
+msgstr "Ðнимационен Възел"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "OneShot Node"
@@ -3907,11 +4013,11 @@ msgstr "ВнаÑÑне на анимации..."
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Edit Node Filters"
-msgstr ""
+msgstr "Промени Възлови Филтри"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Filters..."
-msgstr ""
+msgstr "Филтри..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Contents:"
@@ -3927,7 +4033,7 @@ msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
-msgstr ""
+msgstr "Грешка във връзката, Ð¼Ð¾Ð»Ñ Ð¾Ð¿Ð¸Ñ‚Ð°Ð¹ отново."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Can't connect to host:"
@@ -3939,11 +4045,11 @@ msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
-msgstr ""
+msgstr "ЗаÑвката Ñе провали, върнат код:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, too many redirects"
-msgstr ""
+msgstr "ЗаÑвката Ñе провали, твърде много пренаÑочваниÑ"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
@@ -3951,15 +4057,15 @@ msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Expected:"
-msgstr ""
+msgstr "Очаквано:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Got:"
-msgstr ""
+msgstr "Получено:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Failed sha256 hash check"
-msgstr ""
+msgstr "ÐеуÑпешна проверка на sha256 hash"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Asset Download Error:"
@@ -3967,20 +4073,19 @@ msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Downloading (%s / %s)..."
-msgstr ""
+msgstr "ИзтеглÑне (%s / %s)..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Downloading..."
-msgstr ""
+msgstr "Ð˜Ð·Ñ‚ÐµÐ³Ð»Ñ Ñе..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Resolving..."
-msgstr ""
+msgstr "Уреждане на връзката..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Error making request"
-msgstr "Имаше грешка при зареждане на Ñцената."
+msgstr "Имаше грешка при направата на заÑвката за изтеглÑне"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Idle"
@@ -3988,33 +4093,32 @@ msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Retry"
-msgstr ""
+msgstr "Опитай пак"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Download Error"
-msgstr ""
+msgstr "Грешка при изтеглÑнето"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
msgid "Download for this asset is already in progress!"
-msgstr ""
+msgstr "Този актив вече Ñе ÑвалÑ!"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "First"
-msgstr ""
+msgstr "Ðачална"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Previous"
-msgstr "Предишен подпрозорец"
+msgstr "Предишна"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Next"
-msgstr "Следващ подпрозорец"
+msgstr "Следваща"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Last"
-msgstr ""
+msgstr "ПоÑледна"
#: editor/plugins/asset_library_editor_plugin.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -4026,13 +4130,13 @@ msgstr "Ð’Ñички"
msgid "Plugins"
msgstr "ПриÑтавки"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "Подреждане:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Reverse"
-msgstr ""
+msgstr "В обратен ред"
#: editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_settings_editor.cpp
@@ -4045,15 +4149,15 @@ msgstr "МÑÑто:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Support..."
-msgstr "Поддръжка"
+msgstr "Поддръжка..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Official"
-msgstr ""
+msgstr "Официална"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Testing"
-msgstr ""
+msgstr "ТеÑтова"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
@@ -4083,7 +4187,7 @@ msgstr ""
#: editor/plugins/camera_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Preview"
-msgstr ""
+msgstr "Преглед"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Configure Snap"
@@ -4098,42 +4202,43 @@ msgid "Grid Step:"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Rotation Offset:"
-msgstr ""
+msgstr "ИзмеÑтване при Завъртане:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation Step:"
-msgstr ""
+msgstr "Съпка при Завъртане:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move vertical guide"
-msgstr ""
+msgstr "ПемеÑти вертикална помощна линиÑ"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Create new vertical guide"
-msgstr "Създаване на нов Ñкрипт"
+msgstr "Създай нова вертикална помощна линиÑ"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Remove vertical guide"
-msgstr ""
+msgstr "Премахни вертикална помощна линиÑ"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Move horizontal guide"
-msgstr ""
+msgstr "ПремеÑти хоризонтална помощна линиÑ"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Create new horizontal guide"
-msgstr "Създаване на нов Ñкрипт"
+msgstr "Създай нова хоризонтална помощна линиÑ"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Remove horizontal guide"
-msgstr ""
+msgstr "Премахни хоризонтална помощна линиÑ"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create new horizontal and vertical guides"
-msgstr ""
+msgstr "Създай нова хоризонтална и вертикална помощна линиÑ"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move pivot"
@@ -4152,6 +4257,10 @@ msgid "Resize CanvasItem"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
msgstr ""
@@ -4172,29 +4281,29 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom out"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom reset"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom in"
-msgstr ""
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+#, fuzzy
+msgid "Zoom Reset"
+msgstr "Оригинално увеличение"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Select Mode"
-msgstr "Избиране на вÑичко"
+msgstr "Режим на Селектиране"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Drag: Rotate"
-msgstr ""
+msgstr "Дърпане: Завъртане"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Alt+Drag: Move"
-msgstr ""
+msgstr "Alt+Дърпане: ПремеÑтване"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
@@ -4206,11 +4315,16 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move Mode"
-msgstr ""
+msgstr "Режим на ПремеÑтване"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotate Mode"
-msgstr ""
+msgstr "Режим на Завъртане"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "Режим на Селектиране"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -4218,6 +4332,8 @@ msgid ""
"Show a list of all objects at the position clicked\n"
"(same as Alt+RMB in select mode)."
msgstr ""
+"Покажи ÑпиÑък Ñ Ð²Ñички обекти на кликнатата позициÑ\n"
+"(Ñъщото като Alt+RMB в режим на Ñелектиране)."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Click to change object's rotation pivot."
@@ -4225,7 +4341,7 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Pan Mode"
-msgstr ""
+msgstr "Панорамен режим на ОтмеÑтване (на Ñ€Ð°Ð±Ð¾Ñ‚Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€ÐµÑ†)"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Toggle snapping."
@@ -4291,20 +4407,26 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock the selected object in place (can't be moved)."
-msgstr ""
+msgstr "Заключи ÑÐµÐ»ÐµÐºÑ‚Ð¸Ñ€Ð°Ð½Ð¸Ñ Ð¾Ð±ÐµÐºÑ‚ на мÑÑто (за да не може да Ñе премеÑтва)."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Unlock the selected object (can be moved)."
-msgstr ""
+msgstr "Отключи ÑÐµÐ»ÐµÐºÑ‚Ð¸Ñ€Ð°Ð½Ð¸Ñ Ð¾Ð±ÐµÐºÑ‚ (за да може да Ñе премеÑтва)."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Makes sure the object's children are not selectable."
-msgstr ""
+msgstr "Гарантирай че децата на този обект нÑма да могат да бъдат Ñелектирани."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Restores the object's children's ability to be selected."
-msgstr ""
+msgstr "Възвръщане на ÑпоÑобноÑтта да Ñе Ñелектират децата на обекта."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "Само СелекциÑта"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
@@ -4312,11 +4434,11 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make IK Chain"
-msgstr ""
+msgstr "Ðаправи IK Връзка"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Clear IK Chain"
-msgstr ""
+msgstr "ИзчиÑти IK Връзка"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make Custom Bone(s) from Node(s)"
@@ -4329,8 +4451,9 @@ msgstr "Възпроизвеждане на Ñцена по избор"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
msgid "View"
-msgstr ""
+msgstr "Изглед"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -4358,12 +4481,17 @@ msgid "Show Viewport"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Center Selection"
+msgid "Show Group And Lock Icons"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr "Центрирай върху СелекциÑта"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Frame Selection"
-msgstr ""
+msgstr "Покажи СелекциÑта (вмеÑти в Ñ†ÐµÐ»Ð¸Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€ÐµÑ†)"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Layout"
@@ -4395,11 +4523,11 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Add %s"
-msgstr ""
+msgstr "Добави %s"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Adding %s..."
-msgstr ""
+msgstr "ДобавÑне на %s..."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Cannot instantiate multiple nodes without root."
@@ -4408,7 +4536,7 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Create Node"
-msgstr ""
+msgstr "Създай Възел"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
@@ -4426,7 +4554,16 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "Създаване на папка"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
msgstr ""
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
@@ -4529,35 +4666,9 @@ msgid "Item List Editor"
msgstr ""
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr ""
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr ""
@@ -4617,11 +4728,11 @@ msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Could not create outline!"
-msgstr ""
+msgstr "Ðе можа да Ñе Ñъздаде очертание!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline"
-msgstr ""
+msgstr "Създай Очертание"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh"
@@ -4648,14 +4759,12 @@ msgid "Create Outline Mesh..."
msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
msgid "View UV1"
-msgstr "Преглед на файловете"
+msgstr "Покажи UV1"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
msgid "View UV2"
-msgstr "Преглед на файловете"
+msgstr "Покажи UV2"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Unwrap UV2 for Lightmap/AO"
@@ -4667,7 +4776,7 @@ msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Outline Size:"
-msgstr ""
+msgstr "Размер на Очертанието:"
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Remove item %d?"
@@ -4684,11 +4793,11 @@ msgstr ""
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Import from Scene"
-msgstr "ВнаÑÑне от Ñцена"
+msgstr "ВнаÑÑне от Cцена"
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Update from Scene"
-msgstr "ОбновÑване от Ñцена"
+msgstr "ОбновÑване от Cцена"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "No mesh source specified (and no MultiMesh set in node)."
@@ -4791,12 +4900,12 @@ msgid "Populate"
msgstr ""
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
+msgid "Generating Visibility Rect"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -4825,6 +4934,11 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr ""
@@ -4855,15 +4969,15 @@ msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
msgid "No faces!"
-msgstr ""
+msgstr "ÐÑма лица!"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Node does not contain geometry."
-msgstr ""
+msgstr "Възелът не Ñъдържа геометриÑ."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Node does not contain geometry (faces)."
-msgstr ""
+msgstr "Възелът не Ñъдържа Ð³ÐµÐ¾Ð¼ÐµÑ‚Ñ€Ð¸Ñ (лица)."
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emitter"
@@ -4883,7 +4997,7 @@ msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
msgid "Volume"
-msgstr ""
+msgstr "Обем"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Emission Source: "
@@ -4894,11 +5008,11 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Convert to CPUParticles"
+msgid "Generate AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -4923,6 +5037,10 @@ msgid "Add Point to Curve"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr ""
@@ -4950,6 +5068,10 @@ msgid "Click: Add Point"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr ""
@@ -4965,13 +5087,8 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
-msgstr ""
+msgstr "Изтрий Точка"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
@@ -5026,6 +5143,10 @@ msgstr ""
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
msgid "Move joint"
msgstr ""
@@ -5036,7 +5157,13 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync bones"
+msgid "Sync Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5048,36 +5175,44 @@ msgid "Create Polygon & UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "Създай нова хоризонтална помощна линиÑ"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+#, fuzzy
+msgid "Remove Internal Vertex"
+msgstr "Премахни вертикална помощна линиÑ"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split already exists."
+msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Add Split"
-msgstr ""
+#, fuzzy
+msgid "Add Custom Polygon"
+msgstr "ПриÑтавки"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Custom Polygon"
+msgstr "ПремеÑтване на Полигон"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Invalid Split: "
+msgid "Transform UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "ЗатварÑне на вÑичко"
+msgid "Transform Polygon"
+msgstr "Създаване на папка"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Transform UV Map"
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
+msgid "Open Polygon 2D UV editor."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5089,12 +5224,14 @@ msgid "UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Poly"
-msgstr ""
+#, fuzzy
+msgid "Points"
+msgstr "LMB: ПремеÑти Точка."
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Splits"
-msgstr ""
+#, fuzzy
+msgid "Polygons"
+msgstr "Полигон->UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Bones"
@@ -5102,69 +5239,67 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
-msgstr "Създаване на папка"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
-msgstr ""
+msgid "Move Points"
+msgstr "LMB: ПремеÑти Точка."
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
msgid "Ctrl: Rotate"
-msgstr ""
+msgstr "Ctrl: Завъртане"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Shift: Move All"
-msgstr ""
+msgstr "Shift: ПремеÑтване на Ð’Ñичко"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Shift+Ctrl: Scale"
-msgstr ""
+msgstr "Shift+Ctrl: Управление на Мащаб (размер)"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Move Polygon"
-msgstr ""
+msgstr "ПремеÑтване на Полигон"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Rotate Polygon"
-msgstr ""
+msgstr "Завъртане на Полигон"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Scale Polygon"
-msgstr ""
+msgstr "Мащаб на Полигон"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "Изберете папка за Ñканиране"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Radius:"
-msgstr ""
+msgstr "РадиуÑ:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon->UV"
-msgstr ""
+msgstr "Полигон->UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "UV->Polygon"
-msgstr ""
+msgstr "UV->Полигон"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Clear UV"
-msgstr ""
+msgstr "ИзчиÑти UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -5172,6 +5307,11 @@ msgid "Grid Settings"
msgstr "ÐаÑтройки"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr ""
@@ -5205,7 +5345,7 @@ msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "ERROR: Couldn't load resource!"
-msgstr ""
+msgstr "ГРЕШКÐ: РеÑурÑÑŠÑ‚ не можа да бъде зареден!"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Add Resource"
@@ -5229,19 +5369,19 @@ msgid "Paste Resource"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
+msgstr "Тип:"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
@@ -5266,65 +5406,75 @@ msgid "Clear Recent Files"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Close and save changes?"
-msgstr "Да Ñе затвори ли Ñцената? (незаразените промени ще Ñе загубÑÑ‚)"
+msgstr "Затвори и запази промените?"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error writing TextFile:"
-msgstr "Имаше грешка при внаÑÑнето на Ñцената"
+msgstr "Грешка при запиÑване на TextFile:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
+msgid "Error: could not load file."
+msgstr "Грешка, не можа да Ñе зареди файла."
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Error could not load file."
-msgstr "ÐеуÑпешно Ñъздаване на папка."
+msgstr "Грешка, не можа да Ñе зареди файла."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error saving file!"
-msgstr "Грешка при зареждането на шрифта."
+msgstr "Грешка при запиÑването на файла!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr ""
+#, fuzzy
+msgid "Error while saving theme."
+msgstr "Грешка при запиÑване."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
-msgstr ""
+#, fuzzy
+msgid "Error Saving"
+msgstr "Грешка при запазване"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr "Имаше грешка при внаÑÑнето на Ñцената"
+#, fuzzy
+msgid "Error importing theme."
+msgstr "Грешка при внаÑÑне на темата"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+#, fuzzy
+msgid "Error Importing"
msgstr "Имаше грешка при внаÑÑнето"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New TextFile..."
-msgstr "Ðова папка..."
+msgstr "Ðов TextFile..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open File"
-msgstr "Файл:"
+msgstr "Отвори Файл"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Save File As..."
-msgstr "Запазване на Ñцената като..."
+msgstr "Запази Файла Като..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme"
msgstr "ВнаÑÑне на тема"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As..."
+msgid "Error while saving theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Грешка при запазване"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As..."
+msgstr "Запази Темата Като..."
+
+#: editor/plugins/script_editor_plugin.cpp
msgid " Class Reference"
msgstr ""
@@ -5341,34 +5491,34 @@ msgstr "Подреждане:"
#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Move Up"
-msgstr ""
+msgstr "ПремеÑти Ðагоре"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Move Down"
-msgstr ""
+msgstr "ПремеÑти Ðадоло"
#: editor/plugins/script_editor_plugin.cpp
msgid "Next script"
-msgstr ""
+msgstr "Следващ Ñкрипт"
#: editor/plugins/script_editor_plugin.cpp
msgid "Previous script"
-msgstr ""
+msgstr "Предишен Ñкрипт"
#: editor/plugins/script_editor_plugin.cpp
msgid "File"
-msgstr ""
+msgstr "Файл"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile"
-msgstr "Преглед на файловете"
+msgid "Open..."
+msgstr "Отвори"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
-msgstr ""
+msgstr "Запази Ð’Ñичко"
#: editor/plugins/script_editor_plugin.cpp
msgid "Soft Reload Script"
@@ -5379,37 +5529,35 @@ msgid "Copy Script Path"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
-msgstr ""
+#, fuzzy
+msgid "History Previous"
+msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ðазад"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
-msgstr ""
+msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ðапред"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp
msgid "Theme"
-msgstr ""
+msgstr "Тема"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Reload Theme"
-msgstr ""
+#, fuzzy
+msgid "Import Theme..."
+msgstr "ВнаÑÑне на тема"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme"
-msgstr ""
+msgid "Reload Theme"
+msgstr "Зареди Темата наново"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr ""
+msgid "Save Theme"
+msgstr "Запази Темата"
#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
-msgstr ""
+msgstr "Затвори ДокументациÑта"
#: editor/plugins/script_editor_plugin.cpp
msgid "Close All"
@@ -5424,13 +5572,14 @@ msgid "Run"
msgstr "ПуÑкане"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Toggle Scripts Panel"
-msgstr ""
+msgstr "ВидимоÑÑ‚ на Панела ÑÑŠÑ Ð¡ÐºÑ€Ð¸Ð¿Ñ‚Ð¾Ð²Ðµ"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
msgid "Find Next"
-msgstr ""
+msgstr "Ðамери Ðапред"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Step Over"
@@ -5454,16 +5603,12 @@ msgid "Keep Debugger Open"
msgstr "ОтÑÑ‚Ñ€Ð°Ð½Ð¸Ñ‚ÐµÐ»Ñ Ð½Ð° грешки да Ñеди отворен"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
msgid "Open Godot online documentation"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr ""
+msgstr "Отвори документациÑта на Godot онлайн"
#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
@@ -5471,29 +5616,31 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
msgid "Go to previous edited document."
-msgstr ""
+msgstr "Отиди в Ð¿Ñ€ÐµÐ´Ñ…Ð¾Ð´Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð¼ÐµÐ½ÐµÐ½ документ."
#: editor/plugins/script_editor_plugin.cpp
msgid "Go to next edited document."
-msgstr ""
+msgstr "Отиди в ÑÐ»ÐµÐ´Ð²Ð°Ñ‰Ð¸Ñ Ð¿Ñ€Ð¾Ð¼ÐµÐ½ÐµÐ½ документ."
#: editor/plugins/script_editor_plugin.cpp
msgid "Discard"
-msgstr ""
+msgstr "Захвърли (промените)"
#: editor/plugins/script_editor_plugin.cpp
msgid ""
"The following files are newer on disk.\n"
"What action should be taken?:"
msgstr ""
+"Следните файлове Ñа по-нови на диÑка.\n"
+"Кое дейÑтвие трÑбва да Ñе предприеме?:"
#: editor/plugins/script_editor_plugin.cpp
msgid "Reload"
-msgstr ""
+msgstr "Презареди"
#: editor/plugins/script_editor_plugin.cpp
msgid "Resave"
-msgstr ""
+msgstr "Презапиши"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Debugger"
@@ -5501,26 +5648,24 @@ msgstr "ОтÑтранител на грешки"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Search results"
+msgid "Search Results"
msgstr "ТърÑене"
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "Имаше грешка при внаÑÑнето:"
+#: editor/plugins/script_text_editor.cpp
+msgid "Line"
+msgstr "Ред"
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
+#: editor/plugins/script_text_editor.cpp
+msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Line"
-msgstr "Линейно"
+msgid "Go to Function"
+msgstr "Отиди на Ред"
-#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5541,24 +5686,20 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Uppercase"
-msgstr ""
+msgstr "Главни букви"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Lowercase"
-msgstr ""
+msgstr "Малки букви"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Capitalize"
-msgstr ""
+msgstr "Ð’ÑÑка дума Ñ Ð“Ð»Ð°Ð²Ð½Ð° буква"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5570,9 +5711,8 @@ msgid "Select All"
msgstr "Избиране на вÑичко"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Delete Line"
-msgstr "Изтриване на анимациÑта?"
+msgstr "Изтрий Ред"
#: editor/plugins/script_text_editor.cpp
msgid "Indent Left"
@@ -5584,39 +5724,39 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
msgid "Toggle Comment"
-msgstr ""
+msgstr "Вкарай Коментар"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Fold/Unfold Line"
-msgstr "Изтриване на анимациÑта?"
+msgstr "Разтвори/Събери Реда"
#: editor/plugins/script_text_editor.cpp
msgid "Fold All Lines"
-msgstr ""
+msgstr "Събери вÑички Редове"
#: editor/plugins/script_text_editor.cpp
msgid "Unfold All Lines"
-msgstr ""
+msgstr "Разтвори Ð’Ñички Редове"
#: editor/plugins/script_text_editor.cpp
msgid "Clone Down"
-msgstr ""
+msgstr "Копирай на Долен ред"
#: editor/plugins/script_text_editor.cpp
msgid "Complete Symbol"
-msgstr ""
+msgstr "Завърши Символа (Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð·Ð° довършване)"
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
msgid "Trim Trailing Whitespace"
-msgstr ""
+msgstr "Премахни Празните Ñимволи в ÐºÑ€Ð°Ñ Ð½Ð° реда"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5626,43 +5766,39 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Toggle Breakpoint"
-msgstr ""
+msgstr "Добави Breakpoint"
#: editor/plugins/script_text_editor.cpp
msgid "Remove All Breakpoints"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr ""
+msgstr "Премахни Ð’Ñички Breakpoint-ове"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr ""
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "Отиди на ÑÐ»ÐµÐ´Ð²Ð°Ñ‰Ð¸Ñ Breakpoint"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr ""
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "Отиди на ÐŸÑ€ÐµÐ´Ð¸ÑˆÐ½Ð¸Ñ Breakpoint"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in files..."
-msgstr ""
+#, fuzzy
+msgid "Find in Files..."
+msgstr "Ðамери във файлове"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+msgid "Go to Function..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
-msgstr ""
+#, fuzzy
+msgid "Go to Line..."
+msgstr "Отиди на Ред"
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
@@ -5754,6 +5890,14 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -5783,11 +5927,11 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Top View."
-msgstr ""
+msgstr "Изглед Отгоре."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View."
-msgstr ""
+msgstr "Изглед Отдолу."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom"
@@ -5795,7 +5939,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Left View."
-msgstr ""
+msgstr "Изглед ОтлÑво."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Left"
@@ -5803,7 +5947,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Right View."
-msgstr ""
+msgstr "Изглед ОтдÑÑно."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Right"
@@ -5811,7 +5955,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Front View."
-msgstr ""
+msgstr "Изглед Отпред."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Front"
@@ -5819,7 +5963,7 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rear View."
-msgstr ""
+msgstr "Изглед Отзад."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rear"
@@ -5892,41 +6036,43 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
-msgstr ""
+msgstr "Свободен Изглед ОтлÑво"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Right"
-msgstr ""
+msgstr "Свободен Изглед ОтдÑÑно"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Forward"
-msgstr ""
+msgstr "Свободен Изглед Отпред"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Backwards"
-msgstr ""
+msgstr "Свободен Изглед Отзад"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Up"
-msgstr ""
+msgstr "Свободен Изглед Отгоре"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Freelook Down"
-msgstr "Колелцето надолу."
+msgstr "Свободен Изглед Отдолу"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Select Mode (Q)"
-msgstr "Избиране на вÑичко"
+msgstr "Режим на Селектиране (Q)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
@@ -6021,10 +6167,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap To Floor"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6141,6 +6283,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
msgstr ""
@@ -6258,11 +6404,16 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6428,6 +6579,11 @@ msgid "Fix Invalid Tiles"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "Центрирай върху СелекциÑта"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6474,32 +6630,39 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "Ðова Ñцена"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr ""
+#, fuzzy
+msgid "Rotate left"
+msgstr "Режим на Завъртане"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr ""
+#, fuzzy
+msgid "Rotate right"
+msgstr "Завъртане на Полигон"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Flip vertically"
msgstr ""
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Clear transform"
+msgstr "ИзнаÑÑне към платформа"
+
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr "ПремеÑтване на пътечката нагоре."
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6511,25 +6674,47 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "ПоÑтавÑне на възелите"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "Изтрий точки."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "Създай нов полигон от нулата."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "ПремеÑтване на пътечката нагоре."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6537,7 +6722,12 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "ВнаÑÑне на текÑтури"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6547,16 +6737,27 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "Изтрий избраните файлове?"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr ""
+msgstr "Избиране на текущата папка"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "Изтриване на анимациÑта?"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr "Избиране на текущата папка"
@@ -6574,12 +6775,101 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr "Избиране на текущата папка"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Set Tile Region"
+msgstr "Двуизмерна текÑтура"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Създаване на папка"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "Промени Филтрите"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Промени ÑъщеÑтвуващ полигон:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "ПриÑтавки"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Промени ÑъщеÑтвуващ полигон:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "ПоÑтавÑне на възелите"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "ЗатварÑне на вÑичко"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "ПремеÑтване на Полигон"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "ПремеÑтване на Полигон"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "Завъртане на Полигон"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "Промени Филтрите"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Създаване на папка"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Създаване на папка"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "This property can't be changed."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Tile Set"
+msgid "TileSet"
msgstr "Файл:"
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6615,6 +6905,15 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Exporting All"
+msgstr "ИзнаÑÑне за %s"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6623,6 +6922,11 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "ИзнаÑÑне на проекта"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6678,10 +6982,50 @@ msgstr ""
#: editor/project_export.cpp
#, fuzzy
+msgid "Script"
+msgstr "Ðов Ñкрипт"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Script Export Mode:"
+msgstr "Режим на изнаÑÑне:"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
+#, fuzzy
msgid "Export PCK/Zip"
msgstr "ИзнаÑÑне"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export mode?"
+msgstr "Режим на изнаÑÑне:"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Export All"
+msgstr "ИзнаÑÑне"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -6819,7 +7163,7 @@ msgstr ""
#: editor/project_manager.cpp
#, fuzzy
-msgid "Can't open project"
+msgid "Can't open project at '%s'."
msgstr "Създаване на нов проект"
#: editor/project_manager.cpp
@@ -6828,6 +7172,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7147,10 +7509,6 @@ msgstr "ÐаÑтройки на проекта"
msgid "General"
msgstr "Общи"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7287,10 +7645,6 @@ msgstr "ПоÑтавÑне"
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr "Изберете ÑвойÑтво"
@@ -7378,7 +7732,7 @@ msgid "Step"
msgstr "Стъпка (Ñек.):"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7387,7 +7741,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7427,7 +7781,7 @@ msgstr ""
msgid "Reset"
msgstr ""
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7486,6 +7840,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
#, fuzzy
msgid "Clear Script"
msgstr "Ðова Ñцена"
@@ -7523,6 +7881,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7598,6 +7962,11 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Open documentation"
+msgstr "Отвори документациÑта на Godot онлайн"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr ""
@@ -7606,12 +7975,13 @@ msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Change Type"
-msgstr ""
+#, fuzzy
+msgid "Extend Script"
+msgstr "Ðова Ñцена"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -7767,6 +8137,10 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -7858,19 +8232,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -7903,18 +8265,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr "Грешки:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -8116,7 +8466,8 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+#, fuzzy
+msgid "Step argument is zero!"
msgstr "Стъпката на range() е нула!"
#: modules/gdscript/gdscript_functions.cpp
@@ -8357,11 +8708,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -8418,7 +8765,7 @@ msgstr ""
#: modules/recast/navigation_mesh_generator.cpp
msgid "Done!"
-msgstr ""
+msgstr "Готово!"
#: modules/visual_script/visual_script.cpp
msgid ""
@@ -8636,6 +8983,10 @@ msgid "Base Type:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr ""
@@ -8736,11 +9087,11 @@ msgid "Search VisualScript"
msgstr "ПоÑтавÑне на възелите"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8837,6 +9188,12 @@ msgstr ""
"За да работи CollisionShape2D, е нужно да му Ñе даде форма. МолÑ, Ñъздайте "
"му Shape2D реÑурÑ."
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -8883,6 +9240,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr "PathFollow2D работи Ñамо когато е наÑледник на Path2D."
@@ -9002,6 +9365,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -9021,6 +9394,28 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr "PathFollow2D работи Ñамо когато е наÑледник на Path2D."
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr "PathFollow2D работи Ñамо когато е наÑледник на Path2D."
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9056,7 +9451,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9109,6 +9504,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr ""
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr ""
@@ -9125,11 +9524,6 @@ msgstr "Тревога!"
msgid "Please Confirm..."
msgstr "МолÑ, потвърдете..."
-#: scene/gui/file_dialog.cpp
-#, fuzzy
-msgid "Select this Folder"
-msgstr "Изберете метод"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9137,6 +9531,10 @@ msgid ""
"hide upon running."
msgstr ""
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9182,10 +9580,6 @@ msgstr ""
msgid "Input"
msgstr ""
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for shader."
msgstr ""
@@ -9202,6 +9596,71 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "ЗатварÑне на вÑичко"
+
+#, fuzzy
+#~ msgid "Connect two points to make a split."
+#~ msgstr "Свържи две точки, за да направиш разделение"
+
+#, fuzzy
+#~ msgid "Select a split to erase it."
+#~ msgstr "Избери разделение и го изтрий"
+
+#~ msgid "Add Node.."
+#~ msgstr "Добави Възел..."
+
+#~ msgid "Zoom out"
+#~ msgstr "Отдалечи"
+
+#~ msgid "Zoom in"
+#~ msgstr "Приближи"
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "Ctrl+LMB: Раздели Сегмент."
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "RMB: Изтрий Точка."
+
+#, fuzzy
+#~ msgid "New TextFile"
+#~ msgstr "Ðов TextFile"
+
+#~ msgid "Save Theme As"
+#~ msgstr "Запази Темата Като"
+
+#~ msgid "Zoom:"
+#~ msgstr "Приближение:"
+
+#~ msgid "Class List:"
+#~ msgstr "СпиÑък на КлаÑове:"
+
+#~ msgid "Search Classes"
+#~ msgstr "ТърÑи КлаÑове"
+
+#~ msgid "Public Methods"
+#~ msgstr "Публични методи"
+
+#~ msgid "Public Methods:"
+#~ msgstr "Публични Методи:"
+
+#, fuzzy
+#~ msgid "Show current scene file."
+#~ msgstr "Избиране на текущата папка"
+
+#~ msgid "Whole words"
+#~ msgstr "Цели думи"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "ТърÑи в йерархиÑта на клаÑовете."
+
+#~ msgid "Search in files"
+#~ msgstr "ТърÑи във файлове"
+
+#~ msgid "Errors:"
+#~ msgstr "Грешки:"
+
#~ msgid "Disabled"
#~ msgstr "Изключено"
@@ -9249,9 +9708,6 @@ msgstr ""
#~ "Този Viewport трÑбва да бъде наÑтройен в режим 'рендъринг цел'(render "
#~ "target)."
-#~ msgid "Exporting for %s"
-#~ msgstr "ИзнаÑÑне за %s"
-
#~ msgid "Re-Import"
#~ msgstr "Повторно внаÑÑне"
@@ -9290,9 +9746,6 @@ msgstr ""
#~ msgid "Import Large Textures (2D)"
#~ msgstr "ВнаÑÑне на големи текÑтури (двуизмерно)"
-#~ msgid "Import Textures"
-#~ msgstr "ВнаÑÑне на текÑтури"
-
#~ msgid "3D Texture"
#~ msgstr "Триизмерна текÑтура"
diff --git a/editor/translations/bn.po b/editor/translations/bn.po
index f4021e9731..3165a8e85d 100644
--- a/editor/translations/bn.po
+++ b/editor/translations/bn.po
@@ -1,6 +1,6 @@
# Bengali translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Abu Md. Maruf Sarker <maruf.webdev@gmail.com>, 2016-2017.
@@ -10,15 +10,17 @@
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2017-11-29 08:11+0000\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:38+0100\n"
"Last-Translator: Abdullah Zubair <abdullahzubair109@gmail.com>\n"
"Language-Team: Bengali <https://hosted.weblate.org/projects/godot-engine/"
"godot/bn/>\n"
"Language: bn\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.18-dev\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -26,7 +28,7 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr "অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ মান/আরà§à¦—à§à¦®à§‡à¦¨à§à¦Ÿ convert()-ঠগিয়েছে, TYPE_* ধà§à¦°à§à¦¬à¦• বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨à¥¤"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr "বিনà§à¦¯à¦¾à¦¸ জানার জনà§à¦¯ যথেষà§à¦Ÿ বাইট নেই, অথবা ভà§à¦² ফরমà§à¦¯à¦¾à¦Ÿà¥¤"
@@ -275,7 +277,6 @@ msgstr "%d à¦à¦° জনà§à¦¯ নতà§à¦¨ টà§à¦°à§à¦¯à¦¾à¦•/পথ-সমà
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -410,8 +411,7 @@ msgstr "নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ সমূহের আকার পরিব
msgid "Scale From Cursor"
msgstr "কারà§à¦¸à¦° হতে আকার পরিবরà§à¦¤à¦¨ করà§à¦¨"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ সমূহ অনà§à¦²à¦¿à¦ªà¦¿ করà§à¦¨"
@@ -425,11 +425,13 @@ msgid "Delete Selection"
msgstr "নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ সমূহ অপসারণ করà§à¦¨"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+#, fuzzy
+msgid "Go to Next Step"
msgstr "পরবরà§à¦¤à§€ ধাপে যান"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+#, fuzzy
+msgid "Go to Previous Step"
msgstr "পূরà§à¦¬à¦¬à¦°à§à¦¤à§€ ধাপে যান"
#: editor/animation_track_editor.cpp
@@ -532,11 +534,11 @@ msgstr "কোনো মিল নেই"
msgid "Replaced %d occurrence(s)."
msgstr "%d সংখà§à¦¯à¦• সংঘটন পà§à¦°à¦¤à¦¿à¦¸à§à¦¥à¦¾à¦ªà¦¿à¦¤ হয়েছে ।"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "অকà§à¦·à¦°à§‡à¦° মাতà§à¦°à¦¾ (বড়/ছোট-হাতের) মিল করà§à¦¨"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "সমà§à¦ªà§‚রà§à¦£ শবà§à¦¦"
@@ -552,15 +554,19 @@ msgstr "সমসà§à¦¤à¦—à§à¦²à¦¿ পà§à¦°à¦¤à¦¿à¦¸à§à¦¥à¦¾à¦ªà¦¨ করà§à
msgid "Selection Only"
msgstr "শà§à¦§à§à¦®à¦¾à¦¤à§à¦° নিরà§à¦¬à¦¾à¦šà¦¿à¦¤à¦¸à¦®à§‚হ"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "সমà§à¦ªà§à¦°à¦¸à¦¾à¦°à¦¿à¦¤ করà§à¦¨ (জà§à¦®à§ ইন)"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "সংকà§à¦šà¦¿à¦¤ করà§à¦¨ (জà§à¦®à§ আউট)"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "সমà§à¦ªà§à¦°à¦¸à¦¾à¦°à¦¨/সংকোচন অপসারণ করà§à¦¨ (রিসেট জà§à¦®à§)"
@@ -571,10 +577,10 @@ msgstr "সতরà§à¦•তা"
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "জà§à¦®à§ (%):"
+msgid "Font Size:"
+msgstr "উৎস ফনà§à¦Ÿà§‡à¦° আকার:"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "লাইন:"
@@ -607,6 +613,7 @@ msgstr "সংযোজন করà§à¦¨"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -689,7 +696,7 @@ msgstr "সংযোগসমূহ সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨"
#: editor/connections_dialog.cpp
#, fuzzy
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "à¦à¦•ধিক পà§à¦°à¦•লà§à¦ª চালানোয় আপনি সà§à¦¨à¦¿à¦¶à§à¦šà¦¿à¦¤?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -740,23 +747,20 @@ msgid "Recent:"
msgstr "সামà§à¦ªà§à¦°à¦¤à¦¿à¦•:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করà§à¦¨:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "মিলসমূহ:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "বরà§à¦£à¦¨à¦¾:"
@@ -795,8 +799,7 @@ msgid "Resource"
msgstr "রিসোরà§à¦¸"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "পথ"
@@ -817,9 +820,10 @@ msgid "Search Replacement Resource:"
msgstr "পà§à¦°à¦¤à¦¿à¦¸à§à¦¥à¦¾à¦ªà¦• রিসোরà§à¦¸-à¦à¦° অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করà§à¦¨:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -853,7 +857,8 @@ msgid "Error loading:"
msgstr "লোডে সমসà§à¦¯à¦¾ হয়েছে:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+#, fuzzy
+msgid "Load failed due to missing dependencies:"
msgstr "নিরà§à¦­à¦°à¦¤à¦¾-সমূহের অনà§à¦ªà¦¸à§à¦¥à¦¿à¦¤à¦¿à¦¤à§‡ দৃশà§à¦¯à§‡à¦° লোড বà§à¦¯à¦°à§à¦¥ হয়েছে:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -912,14 +917,6 @@ msgstr "ডিকশনারি ভà§à¦¯à¦¾à¦²à§ পরিবরà§à¦¤à¦¨ à¦
msgid "Thanks from the Godot community!"
msgstr "Godot কমিউনিটি হতে আপনাকে ধনà§à¦¯à¦¬à¦¾à¦¦!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "সঠিক"
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Godot Engine কনà§à¦Ÿà§à¦°à¦¿à¦¬à¦¿à¦‰à¦Ÿà¦°à¦¸"
@@ -1013,7 +1010,8 @@ msgid "Uncompressing Assets"
msgstr "আনকমà§à¦ªà§à¦°à§‡à¦¸à§à¦¡ অà§à¦¯à¦¾à¦¸à§‡à¦Ÿà¦¸"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+#, fuzzy
+msgid "Package installed successfully!"
msgstr "পà§à¦¯à¦¾à¦•েজ ইনà§à¦¸à¦Ÿà¦² সমà§à¦ªà¦¨à§à¦¨ হয়েছে!"
#: editor/editor_asset_installer.cpp
@@ -1096,8 +1094,7 @@ msgid "Bus options"
msgstr "বাস অপশন"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "ডà§à¦ªà§à¦²à¦¿à¦•েট"
@@ -1262,7 +1259,7 @@ msgid "Add AutoLoad"
msgstr "AutoLoad সংযà§à¦•à§à¦¤ করà§à¦¨"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "পথ:"
@@ -1270,8 +1267,8 @@ msgstr "পথ:"
msgid "Node Name:"
msgstr "নোডের নাম:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "নাম"
@@ -1344,13 +1341,18 @@ msgid "Template file not found:"
msgstr "টেমপà§à¦²à§‡à¦Ÿ ফাইল পাওয়া যায়নি:\n"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+#, fuzzy
+msgid "Select Current Folder"
+msgstr "ফোলà§à¦¡à¦¾à¦° তৈরি করà§à¦¨"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "à¦à¦•ই নামের ফাইল উপসà§à¦¥à¦¿à¦¤, তা মà§à¦›à§‡ লিখবেন?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
#, fuzzy
-msgid "Select Current Folder"
-msgstr "ফোলà§à¦¡à¦¾à¦° তৈরি করà§à¦¨"
+msgid "Select This Folder"
+msgstr "মেথড/পদà§à¦§à¦¤à¦¿ বাছাই করà§à¦¨"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
@@ -1358,12 +1360,13 @@ msgstr "পথ পà§à¦°à¦¤à¦¿à¦²à¦¿à¦ªà¦¿/কপি করà§à¦¨"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr "ফাইল-মà§à¦¯à¦¾à¦¨à§‡à¦œà¦¾à¦°à§‡ দেখà§à¦¨"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+#, fuzzy
+msgid "Show in File Manager"
msgstr "ফাইল-মà§à¦¯à¦¾à¦¨à§‡à¦œà¦¾à¦°à§‡ দেখà§à¦¨"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1400,7 +1403,8 @@ msgid "Open a File or Directory"
msgstr "ফাইল বা পথ/ডিরেকà§à¦Ÿà¦°à¦¿ খà§à¦²à§à¦¨"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "সংরকà§à¦·à¦¨ করà§à¦¨"
@@ -1459,8 +1463,7 @@ msgstr "পথ à¦à¦¬à¦‚ ফাইল:"
msgid "Preview:"
msgstr "পà§à¦°à¦¿à¦­à¦¿à¦‰:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "ফাইল:"
@@ -1477,24 +1480,11 @@ msgstr "উৎসসমূহ সà§à¦•à§à¦¯à¦¾à¦¨ করà§à¦¨"
msgid "(Re)Importing Assets"
msgstr "পà§à¦¨à¦°à¦¾à§Ÿ ইমà§à¦ªà§‹à¦°à§à¦Ÿ হচà§à¦›à§‡"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "সাহাযà§à¦¯ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করà§à¦¨"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "কà§à¦²à¦¾à¦¸à§‡à¦° তালিকা:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "কà§à¦²à¦¾à¦¸à§‡à¦° অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করà§à¦¨"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "শীরà§à¦·"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "কà§à¦²à¦¾à¦¸:"
@@ -1512,30 +1502,32 @@ msgstr "সংকà§à¦·à¦¿à¦ªà§à¦¤ বরà§à¦£à¦¨à¦¾:"
#: editor/editor_help.cpp
#, fuzzy
-msgid "Members"
-msgstr "সদসà§à¦¯à¦—ণ (Members):"
+msgid "Properties"
+msgstr "পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿-সমূহ:"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "সদসà§à¦¯à¦—ণ (Members):"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr "পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿-সমূহ:"
#: editor/editor_help.cpp
#, fuzzy
-msgid "Public Methods"
-msgstr "সরà§à¦¬à¦œà¦¨à§€à¦¨/পà§à¦°à¦•াশà§à¦¯ মেথডসমূহ:"
+msgid "Methods"
+msgstr "মেথডের তালিকা:"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "সরà§à¦¬à¦œà¦¨à§€à¦¨/পà§à¦°à¦•াশà§à¦¯ মেথডসমূহ:"
+#, fuzzy
+msgid "Methods:"
+msgstr "মেথডের তালিকা:"
#: editor/editor_help.cpp
#, fuzzy
-msgid "GUI Theme Items"
-msgstr "GUI থিম à¦à¦° বসà§à¦¤à§à¦¸à¦®à§‚হ:"
+msgid "Theme Properties"
+msgstr "পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿-সমূহ:"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "GUI থিম à¦à¦° বসà§à¦¤à§à¦¸à¦®à§‚হ:"
+#, fuzzy
+msgid "Theme Properties:"
+msgstr "পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿-সমূহ:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1566,7 +1558,12 @@ msgstr "ধà§à¦°à§à¦¬à¦•সমূহ:"
#: editor/editor_help.cpp
#, fuzzy
-msgid "Description"
+msgid "Class Description"
+msgstr "বরà§à¦£à¦¨à¦¾:"
+
+#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
msgstr "বরà§à¦£à¦¨à¦¾:"
#: editor/editor_help.cpp
@@ -1587,11 +1584,12 @@ msgstr ""
#: editor/editor_help.cpp
#, fuzzy
-msgid "Properties"
-msgstr "পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿-সমূহ:"
+msgid "Property Descriptions"
+msgstr "মান/পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿à¦° বরà§à¦£à¦¨à¦¾:"
#: editor/editor_help.cpp
-msgid "Property Description:"
+#, fuzzy
+msgid "Property Descriptions:"
msgstr "মান/পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿à¦° বরà§à¦£à¦¨à¦¾:"
#: editor/editor_help.cpp
@@ -1605,11 +1603,12 @@ msgstr ""
#: editor/editor_help.cpp
#, fuzzy
-msgid "Methods"
-msgstr "মেথডের তালিকা:"
+msgid "Method Descriptions"
+msgstr "মেথডের বরà§à¦£à§à¦¨à¦¾:"
#: editor/editor_help.cpp
-msgid "Method Description:"
+#, fuzzy
+msgid "Method Descriptions:"
msgstr "মেথডের বরà§à¦£à§à¦¨à¦¾:"
#: editor/editor_help.cpp
@@ -1621,12 +1620,61 @@ msgstr ""
"সহায়তা করà§à¦¨à¥¤ তথà§à¦¯ পà§à¦°à¦¦à¦¾à¦¨à§‡à¦° জনà§à¦¯ [color=$color][url=$url], [/url][/color] ফরমà§à¦¯à¦¾à¦Ÿ "
"বà§à¦¯à¦¾à¦¬à¦¹à¦¾à¦° করà§à¦¨ !"
-#: editor/editor_inspector.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "সাহাযà§à¦¯ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করà§à¦¨"
+
+#: editor/editor_help_search.cpp
#, fuzzy
-msgid "Property: "
+msgid "Display All"
+msgstr "Normal পà§à¦°à¦¦à¦°à§à¦¶à¦¨"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Classes Only"
+msgstr "কà§à¦²à¦¾à¦¸à¦¸à¦®à§‚হ"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Methods Only"
+msgstr "মেথডের তালিকা:"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "সংকেতসমূহ"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Constants Only"
+msgstr "ধà§à¦°à§à¦¬à¦•সমূহ:"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Properties Only"
+msgstr "পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿-সমূহ:"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Theme Properties Only"
+msgstr "পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿-সমূহ:"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Member Type"
+msgstr "সদসà§à¦¯à¦—ণ (Members):"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Class"
+msgstr "কà§à¦²à¦¾à¦¸:"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
msgstr "পà§à¦°à¦ªà¦¾à¦°à§à¦Ÿà¦¿:"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr "নিযà§à¦•à§à¦¤ করà§à¦¨ (Set)"
@@ -1662,6 +1710,11 @@ msgstr ""
msgid "Error saving resource!"
msgstr "রিসোরà§à¦¸ সংরকà§à¦·à¦£à§‡ সমসà§à¦¯à¦¾ হয়েছে!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "সঠিক"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "রিসোরà§à¦¸ à¦à¦‡à¦°à§‚পে সংরকà§à¦·à¦£ করà§à¦¨..."
@@ -1719,6 +1772,12 @@ msgid "This operation can't be done without a tree root."
msgstr "দৃশà§à¦¯ ছাড়া à¦à¦Ÿà¦¿ করা সমà§à¦­à¦¬ হবে না।"
#: editor/editor_node.cpp
+msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
#, fuzzy
msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
@@ -1727,6 +1786,10 @@ msgstr ""
"দৃশà§à¦¯à¦Ÿà¦¿ সংরকà§à¦·à¦£ করা সমà§à¦­à¦¬ হচà§à¦›à§‡ না। সমà§à¦­à¦¬à¦¤ যেসবের (ইনà§à¦¸à¦Ÿà§à¦¯à¦¾à¦¨à§à¦¸) উপর নিরà§à¦­à¦° করছে তাদের "
"সনà§à¦¤à§à¦·à§à¦Ÿ করা সমà§à¦­à¦¬ হচà§à¦›à§‡ না।"
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr "à¦à¦•তà§à¦°à¦¿à¦¤ করার জনà§à¦¯ পà§à¦°à§Ÿà§‹à¦œà¦¨à§€à§Ÿ MeshLibrary লোড অসমà§à¦­à¦¬ হয়েছে!"
@@ -1986,6 +2049,14 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "%s হতে সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ তà§à¦²à¦¤à§‡/লোডে সমসà§à¦¯à¦¾ হয়েছে"
#: editor/editor_node.cpp
+#, fuzzy
+msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"'%s' পাথ বà§à¦¯à¦¾à¦¬à¦¹à¦¾à¦° করে অà§à¦¯à¦¾à¦¡-অন সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ লোড করা সমà§à¦­à¦¬ হয়নি। সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿà¦Ÿà¦¿ টà§à¦² মোডে নেই।"
+
+#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr "অà§à¦¯à¦¾à¦¡-অন সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ পাথ '%s' অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯à¥¤à¦à¦° বেস টাইপ à¦à¦¡à¦¿à¦Ÿà¦° পà§à¦²à¦¾à¦—ইন নয়।"
@@ -2033,6 +2104,12 @@ msgstr "লেআউট/নকশা অপসারণ করà§à¦¨"
msgid "Default"
msgstr "সাধারণ/ডিফলà§à¦Ÿ"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+#, fuzzy
+msgid "Show in FileSystem"
+msgstr "ফাইলসিসà§à¦Ÿà§‡à¦®"
+
#: editor/editor_node.cpp
#, fuzzy
msgid "Play This Scene"
@@ -2122,7 +2199,8 @@ msgid "Save Scene"
msgstr "দৃশà§à¦¯ সংরকà§à¦·à¦£ করà§à¦¨"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+#, fuzzy
+msgid "Save All Scenes"
msgstr "সকল দৃশà§à¦¯ সংরকà§à¦·à¦£ করà§à¦¨"
#: editor/editor_node.cpp
@@ -2151,7 +2229,7 @@ msgid "Undo"
msgstr "সাবেক অবসà§à¦¥à¦¾à§Ÿ যান/আনডà§"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "পà§à¦¨à¦°à¦¾à¦¯à¦¼ করà§à¦¨"
@@ -2176,7 +2254,7 @@ msgstr "পà§à¦°à¦•লà§à¦ªà§‡à¦° সেটিংস"
msgid "Export"
msgstr "à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "সরঞà§à¦œà¦¾à¦®-সমূহ"
@@ -2190,6 +2268,7 @@ msgid "Quit to Project List"
msgstr "পà§à¦°à¦•লà§à¦ªà§‡à¦° তালিকায় পà§à¦°à¦¸à§à¦¥à¦¾à¦¨ করà§à¦¨"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "ডিবাগ"
@@ -2321,10 +2400,6 @@ msgstr "à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ টেমপà§à¦²à§‡à¦Ÿà¦¸à¦®à§‚হ লোà
msgid "Help"
msgstr "হেলà§à¦ª"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "কà§à¦²à¦¾à¦¸à¦¸à¦®à§‚হ"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2420,24 +2495,24 @@ msgstr "পরিবরà§à¦¤à¦¨à¦¸à¦®à§‚হ হাল-নাগাদ করà§
msgid "Disable Update Spinner"
msgstr "হাল-নাগাদকারী ঘূরà§à¦£à¦• নিষà§à¦•à§à¦°à¦¿à§Ÿ করà§à¦¨"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "পরিদরà§à¦¶à¦•/পরীকà§à¦·à¦•"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "ইমà§à¦ªà§‹à¦°à§à¦Ÿ"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "নোড"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "ফাইলসিসà§à¦Ÿà§‡à¦®"
#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr "পরিদরà§à¦¶à¦•/পরীকà§à¦·à¦•"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "নোড"
+
+#: editor/editor_node.cpp
#, fuzzy
msgid "Expand Bottom Panel"
msgstr "ধারক/বাহক পরà§à¦¯à¦¨à§à¦¤ বিসà§à¦¤à§ƒà¦¤ করà§à¦¨"
@@ -2584,7 +2659,7 @@ msgstr "ফà§à¦°à§‡à¦® %"
msgid "Physics Frame %"
msgstr "সà§à¦¥à¦¿à¦°/বদà§à¦§ ফà§à¦°à§‡à¦® %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "সময়:"
@@ -2610,7 +2685,7 @@ msgstr "সময়:"
msgid "Calls"
msgstr "ডাকà§à¦¨ (Call)"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr "চালà§"
@@ -2623,23 +2698,47 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr "বিট %d, মান %d।"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
#, fuzzy
msgid "[Empty]"
msgstr "খালি বসà§à¦¤à§ যোগ করà§à¦¨"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
#, fuzzy
-msgid "Assign.."
+msgid "Assign..."
msgstr "নিযà§à¦•à§à¦¤"
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "অকারà§à¦¯à¦•র পথ।"
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+
#: editor/editor_properties.cpp editor/property_editor.cpp
#, fuzzy
msgid "Pick a Viewport"
msgstr "১ টি Viewport"
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr "নতà§à¦¨ সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ"
@@ -2652,11 +2751,6 @@ msgstr ""
msgid "Make Unique"
msgstr "বোনà§â€Œ/হাড় তৈরি করà§à¦¨"
-#: editor/editor_properties.cpp editor/property_editor.cpp
-#, fuzzy
-msgid "Show in File System"
-msgstr "ফাইলসিসà§à¦Ÿà§‡à¦®"
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2665,7 +2759,8 @@ msgstr "ফাইলসিসà§à¦Ÿà§‡à¦®"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "পà§à¦°à¦¤à¦¿à¦²à§‡à¦ªà¦¨/পেসà§à¦Ÿ করà§à¦¨"
@@ -2988,6 +3083,11 @@ msgstr ""
"সংরকà§à¦·à¦¿à¦¤ হচà§à¦›à§‡ না!"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "ফেবরিট/পà§à¦°à¦¿à¦¯à¦¼-সমূহ:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr "'% s' তে নেভিগেট করা যাবে না কারণ à¦à¦Ÿà¦¿ ফাইল সিসà§à¦Ÿà§‡à¦®à§‡ পাওয়া যায়নি!"
@@ -3034,9 +3134,10 @@ msgstr "লোডে সমসà§à¦¯à¦¾ হয়েছে:"
msgid "Unable to update dependencies:"
msgstr "'%s' দৃশà§à¦¯à¦Ÿà¦¿à¦° অসংলগà§à¦¨ নিরà§à¦­à¦°à¦¤à¦¾ রয়েছে:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "কোন নাম বà§à¦¯à¦¾à¦¬à¦¹à¦¾à¦° করা হয়নি"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+#, fuzzy
+msgid "No name provided."
+msgstr "পà§à¦¨à¦ƒà¦¨à¦¾à¦®à¦•রণ করà§à¦¨ অথবা সরান..."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
@@ -3044,11 +3145,6 @@ msgstr "বà§à¦¯à¦¬à¦¹à§ƒà¦¤ নামে অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ অ
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "No name provided."
-msgstr "পà§à¦¨à¦ƒà¦¨à¦¾à¦®à¦•রণ করà§à¦¨ অথবা সরান..."
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Name contains invalid characters."
msgstr "গà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯ অকà§à¦·à¦°à¦¸à¦®à§‚হ:"
@@ -3079,30 +3175,22 @@ msgstr "নোড পà§à¦¨à¦ƒà¦¨à¦¾à¦®à¦•রণ করà§à¦¨"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Expand all"
-msgstr "ধারক/বাহক পরà§à¦¯à¦¨à§à¦¤ বিসà§à¦¤à§ƒà¦¤ করà§à¦¨"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "কলাপà§à¦¸ করà§à¦¨"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
-msgid "Rename..."
-msgstr "পà§à¦¨à¦ƒà¦¨à¦¾à¦®à¦•রণ করà§à¦¨"
+msgid "Open Scene(s)"
+msgstr "দৃশà§à¦¯ খà§à¦²à§à¦¨"
#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "à¦à¦–ানে সরান..."
+msgid "Instance"
+msgstr "ইনসà§à¦Ÿà§à¦¯à¦¾à¦¨à§à¦¸"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open Scene(s)"
-msgstr "দৃশà§à¦¯ খà§à¦²à§à¦¨"
+msgid "Add to favorites"
+msgstr "ফেবরিট/পà§à¦°à¦¿à¦¯à¦¼-সমূহ:"
#: editor/filesystem_dock.cpp
-msgid "Instance"
-msgstr "ইনসà§à¦Ÿà§à¦¯à¦¾à¦¨à§à¦¸"
+#, fuzzy
+msgid "Remove from favorites"
+msgstr "গà§à¦°à§à¦ª/দল হতে অপসারণ করà§à¦¨"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -3112,12 +3200,21 @@ msgstr "নিরà§à¦­à¦°à¦¤à¦¾à¦¸à¦®à§‚হ সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨.
msgid "View Owners..."
msgstr "সà§à¦¬à¦¤à§à¦¬à¦¾à¦§à¦¿à¦•ারীদের দেখà§à¦¨..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#, fuzzy
+msgid "Rename..."
+msgstr "পà§à¦¨à¦ƒà¦¨à¦¾à¦®à¦•রণ করà§à¦¨"
+
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Duplicate..."
msgstr "ডà§à¦ªà§à¦²à¦¿à¦•েট"
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr "à¦à¦–ানে সরান..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
msgstr "নতà§à¦¨ সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ"
@@ -3127,6 +3224,16 @@ msgstr "নতà§à¦¨ সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ"
msgid "New Resource..."
msgstr "রিসোরà§à¦¸ à¦à¦‡à¦°à§‚পে সংরকà§à¦·à¦£ করà§à¦¨..."
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Expand All"
+msgstr "ধারক/বাহক পরà§à¦¯à¦¨à§à¦¤ বিসà§à¦¤à§ƒà¦¤ করà§à¦¨"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Collapse All"
+msgstr "কলাপà§à¦¸ করà§à¦¨"
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -3148,28 +3255,19 @@ msgstr "ফাইলসিসà§à¦Ÿà§‡à¦® পà§à¦¨-সà§à¦•à§à¦¯à¦¾à¦¨ কর
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "ফোলà§à¦¡à¦¾à¦°à§‡à¦° অবসà§à¦¥à¦¾ ফেবরিট/পà§à¦°à¦¿à¦¯à¦¼ হিসেবে অদলবদল/টগল করà§à¦¨"
+msgid "Toggle split mode"
+msgstr "মোড অদলবদল/টগল করà§à¦¨"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Show current scene file."
-msgstr "à¦à¦‡-মà§à¦¹à§‚রà§à¦¤à§‡ সমà§à¦ªà¦¾à¦¦à¦¿à¦¤ রিসোরà§à¦¸à¦Ÿà¦¿ সংরকà§à¦·à¦£ করà§à¦¨à¥¤"
+msgid "Search files"
+msgstr "কà§à¦²à¦¾à¦¸à§‡à¦° অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করà§à¦¨"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr "নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ দৃশà§à¦¯(সমূহ)-কে নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ নোডের অংশ হিসেবে ইনসà§à¦Ÿà§à¦¯à¦¾à¦¨à§à¦¸ করà§à¦¨à¥¤"
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "কà§à¦²à¦¾à¦¸à§‡à¦° অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করà§à¦¨"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3177,7 +3275,7 @@ msgstr ""
"ফাইল সà§à¦•à§à¦¯à¦¾à¦¨ করা হচà§à¦›à§‡,\n"
"অনà§à¦—à§à¦°à¦¹à¦ªà§‚রà§à¦¬à¦• অপেকà§à¦·à¦¾ করà§à¦¨..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "সরান"
@@ -3196,32 +3294,23 @@ msgstr "সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ তৈরি করà§à¦¨"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find in files"
+msgid "Find in Files"
msgstr "টাইল খà§à¦à¦œà§à¦¨"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find: "
+msgid "Find:"
msgstr "সনà§à¦§à¦¾à¦¨ করà§à¦¨"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Whole words"
-msgstr "সমà§à¦ªà§‚রà§à¦£ শবà§à¦¦"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "অকà§à¦·à¦°à§‡à¦° মাতà§à¦°à¦¾ (বড়/ছোট-হাতের) মিল করà§à¦¨"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "লাইন-ঠযান"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Filter: "
-msgstr "ফিলà§à¦Ÿà¦¾à¦°:"
+msgid "Filters:"
+msgstr "ফিলà§à¦Ÿà¦¾à¦°à¦¸à¦®à§‚হ"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3238,6 +3327,11 @@ msgstr "বাতিল"
#: editor/find_in_files.cpp
#, fuzzy
+msgid "Find: "
+msgstr "সনà§à¦§à¦¾à¦¨ করà§à¦¨"
+
+#: editor/find_in_files.cpp
+#, fuzzy
msgid "Replace: "
msgstr "পà§à¦°à¦¤à¦¿à¦¸à§à¦¥à¦¾à¦ªà¦¨ করà§à¦¨"
@@ -3263,7 +3357,7 @@ msgstr "ভà§à¦²: অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à§‡à¦° নাম ইতিমà¦
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr "অগà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯ নাম।"
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3411,19 +3505,14 @@ msgstr "পà§à¦¨-ইমà§à¦ªà§‹à¦°à§à¦Ÿ"
msgid "Failed to load resource."
msgstr "রিসোরà§à¦¸ লোড বà§à¦¯à¦°à§à¦¥ হয়েছে।"
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "ঠিক আছে"
-
#: editor/inspector_dock.cpp
#, fuzzy
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr "ধারক/বাহক পরà§à¦¯à¦¨à§à¦¤ বিসà§à¦¤à§ƒà¦¤ করà§à¦¨"
#: editor/inspector_dock.cpp
#, fuzzy
-msgid "Collapse all properties"
+msgid "Collapse All Properties"
msgstr "কলাপà§à¦¸ করà§à¦¨"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3469,6 +3558,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "ডিসà§à¦• হতে à¦à¦•টি বিদà§à¦¯à¦®à¦¾à¦¨ রিসোরà§à¦¸ লোড করà§à¦¨ à¦à¦¬à¦‚ সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨à¥¤"
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "à¦à¦‡-মà§à¦¹à§‚রà§à¦¤à§‡ সমà§à¦ªà¦¾à¦¦à¦¿à¦¤ রিসোরà§à¦¸à¦Ÿà¦¿ সংরকà§à¦·à¦£ করà§à¦¨à¥¤"
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "সà§à¦®à§ƒà¦¤à¦¿à¦¤à§‡ অবসà§à¦¥à¦¿à¦¤ পূরà§à¦¬à§‡ সমà§à¦ªà¦¾à¦¦à¦¿à¦¤ বসà§à¦¤à§à¦¤à§‡ যান।"
@@ -3536,14 +3629,14 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
msgstr "Poly তৈরি করà§à¦¨"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+#, fuzzy
+msgid "Edit Polygon"
msgstr "Poly সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3552,26 +3645,28 @@ msgid "Insert Point"
msgstr "সনà§à¦¨à¦¿à¦¬à§‡à¦¶à¦¿à¦¤ হচà§à¦›à§‡"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+#, fuzzy
+msgid "Edit Polygon (Remove Point)"
msgstr "Poly সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨ (বিনà§à¦¦à§ অপসারণ করà§à¦¨)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+#, fuzzy
+msgid "Remove Polygon And Point"
msgstr "পলি à¦à¦¬à¦‚ বিনà§à¦¦à§ অপসারণ করà§à¦¨"
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
#, fuzzy
-msgid "Create a new polygon from scratch"
-msgstr "আরমà§à¦­ হতে নতà§à¦¨ polygon তৈরি করà§à¦¨à¥¤"
+msgid "Create points."
+msgstr "বিনà§à¦¦à§ অপসারণ করà§à¦¨"
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#, fuzzy
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
"তৈরিকৃত পলিগন à¦à¦¡à¦¿à¦Ÿ করà§à¦¨:\n"
"à¦à¦²à¦à¦®à¦¬à¦¿: পয়েনà§à¦Ÿ মà§à¦­ করà§à¦¨à¥¤\n"
@@ -3579,9 +3674,10 @@ msgstr ""
"আরà¦à¦®à¦¬à¦¿: পয়েনà§à¦Ÿ মà§à¦›à§‡ ফেলà§à¦¨à¥¤"
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
#, fuzzy
-msgid "Delete points"
-msgstr "বিনà§à¦¦à§ অপসারণ করà§à¦¨"
+msgid "Erase points."
+msgstr "মাউসের ডান বোতাম: বিনà§à¦¦à§ মà§à¦›à§‡ ফেলà§à¦¨à¥¤"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3596,7 +3692,7 @@ msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ যà§à¦•à§à¦¤ করà§à¦¨"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
+msgid "Load..."
msgstr "লোড"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3625,15 +3721,9 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "বিনà§à¦¦à§ অপসারণ করà§à¦¨"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "মাউসের ডান বোতাম: বিনà§à¦¦à§ মà§à¦›à§‡ ফেলà§à¦¨à¥¤"
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3676,10 +3766,9 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr "সà§à¦¨à§à¦¯à¦¾à¦ª"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "বà§à¦²à§‡à¦¨à§à¦¡/মিশà§à¦°à¦£:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3714,7 +3803,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
-msgid "Add Node.."
+msgid "Add Node..."
msgstr "নোড সংযোজন করà§à¦¨"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -4000,7 +4089,7 @@ msgstr "নোডের সাথে সংযà§à¦•à§à¦¤ করà§à¦¨:"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ টà§à¦°à§à¦¯à¦¾à¦•/পথ অপসারণ করà§à¦¨à¥¤"
#: editor/plugins/animation_state_machine_editor.cpp
@@ -4069,10 +4158,6 @@ msgid "Amount:"
msgstr "পরিমাণ:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "বà§à¦²à§‡à¦¨à§à¦¡/মিশà§à¦°à¦£:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "বà§à¦²à§‡à¦¨à§à¦¡/মিশà§à¦°à¦£ ০:"
@@ -4281,7 +4366,7 @@ msgstr "সকল"
msgid "Plugins"
msgstr "পà§à¦²à¦¾à¦—ইন-সমূহ"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "সাজান:"
@@ -4416,6 +4501,11 @@ msgstr "CanvasItem সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Scale CanvasItem"
+msgstr "CanvasItem সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Move CanvasItem"
msgstr "CanvasItem সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨"
@@ -4438,21 +4528,19 @@ msgid "Paste Pose"
msgstr "ভঙà§à¦—ি পà§à¦°à¦¤à¦¿à¦²à§‡à¦ªà¦¨ করà§à¦¨"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "সংকà§à¦šà¦¿à¦¤ করà§à¦¨ (জà§à¦®à§ আউট)"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "জà§à¦®à§ পà§à¦¨:সà§à¦¥à¦¾à¦ªà¦¨ করà§à¦¨"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "সমà§à¦ªà§à¦°à¦¸à¦¾à¦°à¦¿à¦¤ করà§à¦¨ (জà§à¦®à§ ইন)"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr "মোড (Mode) বাছাই করà§à¦¨"
@@ -4481,6 +4569,11 @@ msgid "Rotate Mode"
msgstr "ঘূরà§à¦£à¦¾à§Ÿà¦¨ মোড"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "মাপের মোড করà§à¦¨ (R)"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4584,6 +4677,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr "বসà§à¦¤à§à¦° অনà§à¦¤à¦°à§à¦­à§à¦•à§à¦¤-সমূহের নিরà§à¦¬à¦¾à¦šà¦¨à¦¯à§‹à¦—à§à¦¯à¦¤à¦¾ পà§à¦¨à¦°à¦¾à§Ÿ ফিরিয়ে আনে।"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "সà§à¦•েলেটন/কাঠাম..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "বোনà§â€Œ/হাড় দেখান"
@@ -4640,6 +4738,10 @@ msgid "Show Viewport"
msgstr "১ টি Viewport"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr "নিরà§à¦¬à¦¾à¦šà¦¨à¦•ে কেনà§à¦¦à§à¦°à§€à¦­à§‚ত করà§à¦¨"
@@ -4712,8 +4814,17 @@ msgstr ""
"টানà§à¦¨ à¦à¦¬à¦‚ ফেলà§à¦¨ + অলà§à¦Ÿà¦¾à¦° কী (Alt) : নোডের ধরণ পরিবরà§à¦¤à¦¨ করতে"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr "Poly3D তৈরি করà§à¦¨"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "Poly তৈরি করà§à¦¨"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Poly সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Poly সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨ (বিনà§à¦¦à§ অপসারণ করà§à¦¨)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
@@ -4828,37 +4939,9 @@ msgid "Item List Editor"
msgstr "বসà§à¦¤à§à¦° তালিকা à¦à¦¡à¦¿à¦Ÿà¦°"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"à¦à¦‡ নোডের মধà§à¦¯à§‡ কোন অকà§à¦²à§à¦¡à¦¾à¦° পলিগন টà§à¦¡à¦¿ রিসোরà§à¦¸ বিদà§à¦¯à¦®à¦¾à¦¨ নেই।\n"
-" নতà§à¦¨ পলিগন তৈরি করবেন?"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr "অকলà§à¦¡à¦¾à¦° (occluder) পলিগন তৈরি করà§à¦¨"
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr "আরমà§à¦­ হতে নতà§à¦¨ polygon তৈরি করà§à¦¨à¥¤"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "বিদà§à¦¯à¦®à¦¾à¦¨ পলিগন সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "মাউসের বাম বোতাম: বিনà§à¦¦à§ সরান।"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr "কনà§à¦Ÿà§à¦°à§‹à¦² + মাউসের বাম বোতাম: অংশ বিভকà§à¦¤ করà§à¦¨à¥¤"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "মাউসের ডান বোতাম: বিনà§à¦¦à§ মà§à¦›à§‡ ফেলà§à¦¨à¥¤"
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr "মেসটি খালি!"
@@ -5092,14 +5175,14 @@ msgid "Populate"
msgstr "পপà§à¦²à§‡à¦Ÿ"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr "Navigation Polygon তৈরি করà§à¦¨"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
#, fuzzy
-msgid "Generating AABB"
-msgstr "AABB উৎপনà§à¦¨ করà§à¦¨"
+msgid "Generating Visibility Rect"
+msgstr "ভিজিবিলিটি রেকà§à¦Ÿ তৈরি করà§à¦¨"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -5128,6 +5211,12 @@ msgstr "Emission Mask পরিসà§à¦•ার করà§à¦¨"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
#, fuzzy
+msgid "Convert to CPUParticles"
+msgstr "à¦à¦¤à§‡ রূপানà§à¦¤à¦° করà§à¦¨..."
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
msgid "Particles"
msgstr "ভারটেকà§à¦¸"
@@ -5204,13 +5293,13 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr "'পারà§à¦Ÿà¦¿à¦•লস মà§à¦¯à¦¾à¦Ÿà§‡à¦°à¦¿à§Ÿà¦¾à¦²' টাইপের à¦à¦•টি পà§à¦°à¦¸à§‡à¦¸à¦° মà§à¦¯à¦¾à¦Ÿà§‡à¦°à¦¿à§Ÿà¦¾à¦² পà§à¦°à§Ÿà§‹à¦œà¦¨ ।"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+#, fuzzy
+msgid "Generating AABB"
msgstr "AABB উৎপনà§à¦¨ করà§à¦¨"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "à¦à¦¤à§‡ রূপানà§à¦¤à¦° করà§à¦¨..."
+msgid "Generate AABB"
+msgstr "AABB উৎপনà§à¦¨ করà§à¦¨"
#: editor/plugins/particles_editor_plugin.cpp
#, fuzzy
@@ -5237,6 +5326,11 @@ msgid "Add Point to Curve"
msgstr "বকà§à¦°à¦°à§‡à¦–ায় বিনà§à¦¦à§ যোগ করà§à¦¨"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "বকà§à¦°à¦°à§‡à¦–া বনà§à¦§ করà§à¦¨"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr "বকà§à¦°à¦°à§‡à¦–ায় বিনà§à¦¦à§ সরান"
@@ -5264,6 +5358,11 @@ msgid "Click: Add Point"
msgstr "কà§à¦²à¦¿à¦•: বিনà§à¦¦à§ যোগ করà§à¦¨"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Left Click: Split Segment (in curve)"
+msgstr "অংশ বিভকà§à¦¤ করà§à¦¨ (বকà§à¦°à¦°à§‡à¦–ায়)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr "ডান কà§à¦²à¦¿à¦•: বিনà§à¦¦à§ অপসারণ করà§à¦¨"
@@ -5279,11 +5378,6 @@ msgstr "বিনà§à¦¦à§ যোগ করà§à¦¨ (শূনà§à¦¯à¦¸à§à¦¥à¦¾à¦
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr "অংশ বিভকà§à¦¤ করà§à¦¨ (বকà§à¦°à¦°à§‡à¦–ায়)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "বিনà§à¦¦à§ অপসারণ করà§à¦¨"
@@ -5345,6 +5439,10 @@ msgstr "বকà§à¦°à¦°à§‡à¦–া বহিঃ-নিয়নà§à¦¤à§à¦°à¦£à§‡
msgid "Remove In-Control Point"
msgstr "বকà§à¦°à¦°à§‡à¦–া আনà§à¦¤-নিয়নà§à¦¤à§à¦°à¦£à§‡ সরান"
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "অংশ বিভকà§à¦¤ করà§à¦¨ (বকà§à¦°à¦°à§‡à¦–ায়)"
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5357,10 +5455,16 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Sync bones"
+msgid "Sync Bones"
msgstr "বোনà§â€Œ/হাড় দেখান"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr "UV Map তৈরি করà§à¦¨"
@@ -5370,42 +5474,48 @@ msgid "Create Polygon & UV"
msgstr "Poly তৈরি করà§à¦¨"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "নতà§à¦¨ সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ তৈরি করà§à¦¨"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "'%s' অà§à¦¯à¦¾à¦•শন ইতিমধà§à¦¯à§‡à¦‡ বিদà§à¦¯à¦®à¦¾à¦¨!"
+msgid "Remove Internal Vertex"
+msgstr "বকà§à¦°à¦°à§‡à¦–া আনà§à¦¤-নিয়নà§à¦¤à§à¦°à¦£à§‡ সরান"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Add Split"
-msgstr "ইনপà§à¦Ÿ যোগ করà§à¦¨"
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ পথ!"
+msgid "Add Custom Polygon"
+msgstr "Poly সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "পথের বিনà§à¦¦à§ অপসারণ করà§à¦¨"
+msgid "Remove Custom Polygon"
+msgstr "পলি à¦à¦¬à¦‚ বিনà§à¦¦à§ অপসারণ করà§à¦¨"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr "UV Map রà§à¦ªà¦¾à¦¨à§à¦¤à¦° করà§à¦¨"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
+#, fuzzy
+msgid "Transform Polygon"
+msgstr "রà§à¦ªà¦¾à¦¨à§à¦¤à¦°à§‡à¦° ধরণ"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Open Polygon 2D UV editor."
+msgstr "Polygon 2D UV à¦à¦¡à¦¿à¦Ÿà¦°"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
msgstr "Polygon 2D UV à¦à¦¡à¦¿à¦Ÿà¦°"
@@ -5415,13 +5525,13 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "Poly সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨"
+msgid "Points"
+msgstr "বিনà§à¦¦à§ সরান"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Splits"
-msgstr "পথ বিভকà§à¦¤ করà§à¦¨"
+msgid "Polygons"
+msgstr "পলিগন->UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -5430,11 +5540,7 @@ msgstr "বোনà§â€Œ/হাড় তৈরি করà§à¦¨"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
-msgstr "Poly তৈরি করà§à¦¨"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Move Points"
msgstr "বিনà§à¦¦à§ সরান"
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5462,20 +5568,21 @@ msgid "Scale Polygon"
msgstr "পলিগন মাপ করà§à¦¨"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "à¦à¦•টি সেটিং আইটেম পà§à¦°à¦¥à¦® নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨!"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5500,6 +5607,11 @@ msgid "Grid Settings"
msgstr "সà§à¦¨à§à¦¯à¦¾à¦ª সেটিংস"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "সà§à¦¨à§à¦¯à¦¾à¦ª"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr "সà§à¦¨à§à¦¯à¦¾à¦ª সকà§à¦°à¦¿à§Ÿ করà§à¦¨"
@@ -5563,22 +5675,22 @@ msgid "Paste Resource"
msgstr "রিসোরà§à¦¸ পà§à¦°à¦¤à¦¿à¦²à§‡à¦ªà¦¨/পেসà§à¦Ÿ করà§à¦¨"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "à¦à¦¡à¦¿à¦Ÿà¦°à§‡ খà§à¦²à§à¦¨"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr "ইনà§à¦¸à¦Ÿà§à¦¯à¦¾à¦¨à§à¦¸:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr "ধরণ:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "à¦à¦¡à¦¿à¦Ÿà¦°à§‡ খà§à¦²à§à¦¨"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr "রিসোরà§à¦¸ লোড করà§à¦¨"
@@ -5616,6 +5728,11 @@ msgstr "ছবি লোডে সমসà§à¦¯à¦¾ হয়েছে:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
+msgid "Error: could not load file."
+msgstr "ছবি লোড অসমà§à¦­à¦¬ হয়েছে"
+
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Error could not load file."
msgstr "ছবি লোড অসমà§à¦­à¦¬ হয়েছে"
@@ -5625,19 +5742,23 @@ msgid "Error saving file!"
msgstr "TileSet সংরকà§à¦·à¦£à§‡ সমসà§à¦¯à¦¾ হয়েছে!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
+#, fuzzy
+msgid "Error while saving theme."
msgstr "থিম সংরকà§à¦·à¦£à§‡ সমসà§à¦¯à¦¾ হয়েছে"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+#, fuzzy
+msgid "Error Saving"
msgstr "সংরকà§à¦·à¦£à§‡ সমসà§à¦¯à¦¾ হয়েছে"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
+#, fuzzy
+msgid "Error importing theme."
msgstr "থিম ইমà§à¦ªà§‹à¦°à§à¦Ÿà§‡ সমসà§à¦¯à¦¾ হয়েছে"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+#, fuzzy
+msgid "Error Importing"
msgstr "ইমà§à¦ªà§‹à¦°à§à¦Ÿà§‡ সমসà§à¦¯à¦¾ হয়েছে"
#: editor/plugins/script_editor_plugin.cpp
@@ -5660,6 +5781,14 @@ msgid "Import Theme"
msgstr "থিম ইমà§à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "থিম সংরকà§à¦·à¦£à§‡ সমসà§à¦¯à¦¾ হয়েছে"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "সংরকà§à¦·à¦£à§‡ সমসà§à¦¯à¦¾ হয়েছে"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr "থিম à¦à¦‡à¦°à§‚পে সংরকà§à¦·à¦£ করà§à¦¨..."
@@ -5702,8 +5831,8 @@ msgstr "ফাইল"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile"
-msgstr "ফাইল"
+msgid "Open..."
+msgstr "খà§à¦²à§à¦¨"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5720,11 +5849,7 @@ msgstr "পথ পà§à¦°à¦¤à¦¿à¦²à¦¿à¦ªà¦¿/কপি করà§à¦¨"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Show In File System"
-msgstr "ফাইলসিসà§à¦Ÿà§‡à¦®"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+msgid "History Previous"
msgstr "পূরà§à¦¬à§‡à¦° ইতিহাস"
#: editor/plugins/script_editor_plugin.cpp
@@ -5737,6 +5862,11 @@ msgid "Theme"
msgstr "থিম"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Import Theme..."
+msgstr "থিম ইমà§à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
msgstr "থিম রিলোড করà§à¦¨"
@@ -5745,10 +5875,6 @@ msgid "Save Theme"
msgstr "থিম সংরকà§à¦·à¦£ করà§à¦¨"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "থিম à¦à¦‡à¦°à§‚পে সংরকà§à¦·à¦£ করà§à¦¨"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "ডকà§à¦®à§‡à¦¨à§à¦Ÿà¦¸à¦®à§‚হ বনà§à¦§ করà§à¦¨"
@@ -5797,7 +5923,7 @@ msgstr "ডিবাগার খোলা রাখà§à¦¨"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr "à¦à¦¡à¦¿à¦Ÿà¦°à§‡ খà§à¦²à§à¦¨"
#: editor/plugins/script_editor_plugin.cpp
@@ -5806,10 +5932,6 @@ msgid "Open Godot online documentation"
msgstr "রেফারেনà§à¦¸à§‡à¦° ডকà§à¦®à§‡à¦¨à§à¦Ÿà§‡à¦¶à¦¨à§‡ খà§à¦à¦œà§à¦¨à¥¤"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr "কà§à¦²à¦¾à¦¸à§‡à¦° কà§à¦°à¦®à§‡à¦¾à¦šà§à¦šà¦¤à¦¾ খà§à¦à¦œà§à¦¨à¥¤"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "রেফারেনà§à¦¸à§‡à¦° ডকà§à¦®à§‡à¦¨à§à¦Ÿà§‡à¦¶à¦¨à§‡ খà§à¦à¦œà§à¦¨à¥¤"
@@ -5848,19 +5970,9 @@ msgstr "ডিবাগার"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Search results"
+msgid "Search Results"
msgstr "সাহাযà§à¦¯ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করà§à¦¨"
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "কà§à¦²à¦¾à¦¸à§‡à¦° অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করà§à¦¨"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr "পূরà§à¦¬à¦¨à¦¿à¦°à§à¦®à¦¿à¦¤ সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ শà§à¦§à§à¦®à¦¾à¦¤à§à¦° তাদের অধিকারী দৃশà§à¦¯ লোড করা হলেই সমà§à¦ªà¦¾à¦¦à¦¨ করা যাবে"
-
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
@@ -5871,6 +5983,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "ফাংশনে যান..."
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr "শà§à¦§à§à¦®à¦¾à¦¤à§à¦° ফাইল সিসà§à¦Ÿà§‡à¦® থেকে রিসোরà§à¦¸ ডà§à¦°à¦ª করা সমà§à¦­à¦¬à¥¤"
@@ -5904,10 +6025,6 @@ msgstr "বড় হাতের অকà§à¦·à¦°à§‡ পরিবরà§à¦¤à¦¨à§‡ à¦
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5961,11 +6078,13 @@ msgid "Trim Trailing Whitespace"
msgstr "শেষের হোয়াইটসà§à¦ªà§‡à¦¸ ছেà¦à¦Ÿà§‡ ফেলà§à¦¨"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+#, fuzzy
+msgid "Convert Indent to Spaces"
msgstr "সà§à¦ªà§‡à¦¸à¦—à§à¦²à¦¿ ইনà§à¦¡à§‡à¦¨à§à¦Ÿà§‡ রূপানà§à¦¤à¦° করà§à¦¨"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+#, fuzzy
+msgid "Convert Indent to Tabs"
msgstr "ইনà§à¦¡à§‡à¦¨à§à¦Ÿà¦—à§à¦²à¦¿ টà§à¦¯à¦¾à¦¬à§‡ রূপানà§à¦¤à¦° করà§à¦¨"
#: editor/plugins/script_text_editor.cpp
@@ -5982,22 +6101,14 @@ msgid "Remove All Breakpoints"
msgstr "সকল বিরতি-বিনà§à¦¦à§-সমূহ অপসারণ করà§à¦¨"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr "পরের বিরতিবিনà§à¦¦à§à¦¤à§‡ যান"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr "পূরà§à¦¬à§‡à¦° বিরতিবিনà§à¦¦à§à¦¤à§‡ যান"
-
-#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Convert To Uppercase"
-msgstr "à¦à¦¤à§‡ রূপানà§à¦¤à¦° করà§à¦¨..."
+msgid "Go to Next Breakpoint"
+msgstr "পরের বিরতিবিনà§à¦¦à§à¦¤à§‡ যান"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Convert To Lowercase"
-msgstr "à¦à¦¤à§‡ রূপানà§à¦¤à¦° করà§à¦¨..."
+msgid "Go to Previous Breakpoint"
+msgstr "পূরà§à¦¬à§‡à¦° বিরতিবিনà§à¦¦à§à¦¤à§‡ যান"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
@@ -6005,15 +6116,17 @@ msgstr "পূরà§à¦¬à§‡ খà§à¦à¦œà§à¦¨"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr "দà§à¦°à§à¦¤ ফাইলসমূহ ফিলà§à¦Ÿà¦¾à¦° করà§à¦¨..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+#, fuzzy
+msgid "Go to Function..."
msgstr "ফাংশনে যান..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+#, fuzzy
+msgid "Go to Line..."
msgstr "লাইনে যান..."
#: editor/plugins/script_text_editor.cpp
@@ -6112,6 +6225,14 @@ msgid "Animation Key Inserted."
msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à§‡à¦° চাবি সনà§à¦¨à¦¿à¦¬à§‡à¦¶à¦¿à¦¤ হয়েছে।"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr "পিচà§â€Œ"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr "অবজেকà§à¦Ÿ আà¦à¦•া হয়েছে"
@@ -6291,6 +6412,11 @@ msgid "Freelook Speed Modifier"
msgstr "ফà§à¦°à¦¿ লà§à¦• সà§à¦ªà¦¿à¦¡ মডিফায়ার"
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "তথà§à¦¯ দেখà§à¦¨"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "XForm à¦à¦° সংলাপ"
@@ -6399,11 +6525,6 @@ msgstr "সà§à¦•েল/মাপ:"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
-msgid "Snap To Floor"
-msgstr "সà§à¦¨à§à¦¯à¦¾à¦ª মোড:"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Toggle Freelook"
msgstr "পূরà§à¦£-পরà§à¦¦à¦¾ অদলবদল/টগল করà§à¦¨"
@@ -6521,6 +6642,10 @@ msgstr "পূরà§à¦¬ (Pre)"
msgid "Post"
msgstr "পরবরà§à¦¤à§€ (Post)"
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
msgid "Sprite is empty!"
@@ -6645,11 +6770,18 @@ msgid "Set Region Rect"
msgstr "গঠনবিনà§à¦¯à¦¾à¦¸à§‡à¦° à¦à¦²à¦¾à¦•া"
#: editor/plugins/texture_region_editor_plugin.cpp
+#, fuzzy
+msgid "Set Margin"
+msgstr "হà§à¦¯à¦¾à¦¨à§à¦¡à§‡à¦² সà§à¦¥à¦¾à¦ªà¦¨ করà§à¦¨"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr "সà§à¦¨à§à¦¯à¦¾à¦ª মোড:"
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+#, fuzzy
+msgid "None"
msgstr "<নান/কিছà§à¦‡ না>"
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6822,6 +6954,11 @@ msgid "Fix Invalid Tiles"
msgstr "অগà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯ নাম।"
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "নিরà§à¦¬à¦¾à¦šà¦¨à¦•ে কেনà§à¦¦à§à¦°à§€à¦­à§‚ত করà§à¦¨"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr "TileMap আà¦à¦•à§à¦¨"
@@ -6871,33 +7008,40 @@ msgstr "টাইল পছনà§à¦¦ করà§à¦¨"
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ সমূহ অপসারণ করà§à¦¨"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr "০ ডিগà§à¦°à¦¿ ঘোরানà§"
+#, fuzzy
+msgid "Rotate left"
+msgstr "ঘূরà§à¦£à¦¾à§Ÿà¦¨ মোড"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Rotate right"
+msgstr "ডানে সরান"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr "৯০ ডিগà§à¦°à¦¿ ঘোরানà§"
+msgid "Flip horizontally"
+msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
-msgstr "১৮০ ডিগà§à¦°à¦¿ ঘোরানà§"
+msgid "Flip vertically"
+msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
-msgstr "২৭০ ডিগà§à¦°à¦¿ ঘোরানà§â€Œ"
+#, fuzzy
+msgid "Clear transform"
+msgstr "রà§à¦ªà¦¾à¦¨à§à¦¤à¦°"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr "শাখা (tree) হতে নোড (সমূহ) যà§à¦•à§à¦¤ করà§à¦¨"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr "পথের বিনà§à¦¦à§ অপসারণ করà§à¦¨"
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6909,33 +7053,60 @@ msgid "Merge from Scene"
msgstr "দৃশà§à¦¯ হতে à¦à¦•তà§à¦°à¦¿à¦¤ করবেন"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ পà§à¦°à¦¤à¦¿à¦²à§‡à¦ªà¦¨ করà§à¦¨"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "মাউসের ডান বোতাম: বিনà§à¦¦à§ মà§à¦›à§‡ ফেলà§à¦¨à¥¤"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "আরমà§à¦­ হতে নতà§à¦¨ polygon তৈরি করà§à¦¨à¥¤"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "পথের বিনà§à¦¦à§ অপসারণ করà§à¦¨"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
-msgstr "দৃশà§à¦¯ হতে তৈরি করবেন?"
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
msgstr "দৃশà§à¦¯ হতে à¦à¦•তà§à¦°à¦¿à¦¤ করবেন?"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "বসà§à¦¤à§ অপসারণ করà§à¦¨"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6945,16 +7116,27 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ ফাইলসমূহ অপসারণ করবেন?"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr ""
+msgstr "à¦à¦‡-মà§à¦¹à§‚রà§à¦¤à§‡ সমà§à¦ªà¦¾à¦¦à¦¿à¦¤ রিসোরà§à¦¸à¦Ÿà¦¿ সংরকà§à¦·à¦£ করà§à¦¨à¥¤"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "বিনà§à¦¦à§ অপসারণ করà§à¦¨"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr "à¦à¦‡-মà§à¦¹à§‚রà§à¦¤à§‡ সমà§à¦ªà¦¾à¦¦à¦¿à¦¤ রিসোরà§à¦¸à¦Ÿà¦¿ সংরকà§à¦·à¦£ করà§à¦¨à¥¤"
@@ -6973,12 +7155,101 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr "à¦à¦‡-মà§à¦¹à§‚রà§à¦¤à§‡ সমà§à¦ªà¦¾à¦¦à¦¿à¦¤ রিসোরà§à¦¸à¦Ÿà¦¿ সংরকà§à¦·à¦£ করà§à¦¨à¥¤"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Set Tile Region"
+msgstr "গঠনবিনà§à¦¯à¦¾à¦¸à§‡à¦° à¦à¦²à¦¾à¦•া"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "ফোলà§à¦¡à¦¾à¦° তৈরি করà§à¦¨"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "নোড ফিলà§à¦Ÿà¦¾à¦°à¦¸à¦®à§‚হ সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "বিদà§à¦¯à¦®à¦¾à¦¨ পলিগন সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Poly সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Navigation Polygon তৈরি করà§à¦¨"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨ পà§à¦°à¦¤à¦¿à¦²à§‡à¦ªà¦¨ করà§à¦¨"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "বসà§à¦¤à§ অপসারণ করà§à¦¨"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "পলি à¦à¦¬à¦‚ বিনà§à¦¦à§ অপসারণ করà§à¦¨"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "অকলà§à¦¡à¦¾à¦° (occluder) পলিগন তৈরি করà§à¦¨"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "Navigation Polygon তৈরি করà§à¦¨"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "নোড ফিলà§à¦Ÿà¦¾à¦°à¦¸à¦®à§‚হ সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Navigation Polygon তৈরি করà§à¦¨"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "অকলà§à¦¡à¦¾à¦° (occluder) পলিগন তৈরি করà§à¦¨"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "This property can't be changed."
msgstr "দৃশà§à¦¯ ছাড়া à¦à¦Ÿà¦¿ করা সমà§à¦­à¦¬ হবে না।"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Tile Set"
+msgid "TileSet"
msgstr "TileSet (টাইল-সেট)..."
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -7023,6 +7294,16 @@ msgstr ""
#: editor/project_export.cpp
#, fuzzy
+msgid "Release"
+msgstr "à¦à¦‡à¦®à¦¾à¦¤à§à¦° অবà§à¦¯à¦¾à¦¹à¦¿à¦¤/মà§à¦•à§à¦¤"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Exporting All"
+msgstr "%s à¦à¦° জনà§à¦¯ à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ (export) হচà§à¦›à§‡"
+
+#: editor/project_export.cpp
+#, fuzzy
msgid "Presets"
msgstr "পà§à¦°à¦¿à¦¸à§‡à¦Ÿ..."
@@ -7031,6 +7312,11 @@ msgid "Add..."
msgstr "সংযোগ..."
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿà§‡à¦° পà§à¦°à¦¿à¦¸à§‡à¦Ÿ:"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr "রিসোরà§à¦¸à¦¸à¦®à§‚হ"
@@ -7098,10 +7384,49 @@ msgid "Feature List:"
msgstr "মেথডের তালিকা:"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "নতà§à¦¨ সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ"
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ মোড:"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr "টেকà§à¦¸à¦Ÿ"
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr "কমà§à¦ªà¦¾à¦‡à¦²à§à¦¡"
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "à¦à¦¨à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ করà§à¦¨ (নীচে কী/চাবি দিন)"
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ à¦à¦¨à¦•à§à¦°à¦¿à¦ªà¦¶à¦¨ কী/চাবি (২৫৬-বিটস হেকà§à¦¸):"
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr "à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ PCK/Zip"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export mode?"
+msgstr "à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ মোড:"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Export All"
+msgstr "à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr "à¦à¦‡ পà§à¦²à§à¦¯à¦¾à¦Ÿà¦«à¦°à§à¦®à§‡à¦° জনà§à¦¯ দরকারি à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ টেমপà§à¦²à§‡à¦Ÿà¦—à§à¦²à¦¿ খà§à¦à¦œà§‡ পাওয়া যাচà§à¦›à§‡ না:"
@@ -7245,7 +7570,7 @@ msgstr "নামহীন পà§à¦°à¦•লà§à¦ª"
#: editor/project_manager.cpp
#, fuzzy
-msgid "Can't open project"
+msgid "Can't open project at '%s'."
msgstr "সংযোগ..."
#: editor/project_manager.cpp
@@ -7253,6 +7578,24 @@ msgid "Are you sure to open more than one project?"
msgstr "à¦à¦•ধিক পà§à¦°à¦•লà§à¦ª খোলায় আপনি সà§à¦¨à¦¿à¦¶à§à¦šà¦¿à¦¤?"
#: editor/project_manager.cpp
+msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
#, fuzzy
msgid ""
"Can't run project: no main scene defined.\n"
@@ -7596,10 +7939,6 @@ msgstr "পà§à¦°à¦•লà§à¦ªà§‡à¦° সেটিংস (engine.cfg)"
msgid "General"
msgstr "জেনেরাল"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr "পà§à¦°à¦ªà¦¾à¦°à§à¦Ÿà¦¿:"
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr "ওভাররাইড..."
@@ -7738,10 +8077,6 @@ msgstr "à¦à¦•টি নোড নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨"
msgid "Bit %d, val %d."
msgstr "বিট %d, মান %d।"
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr "পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿-সমূহ:"
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr "গà§à¦£à¦¾à¦—à§à¦£/বৈশিষà§à¦Ÿà§à¦¯ বাছাই করà§à¦¨"
@@ -7833,7 +8168,7 @@ msgid "Step"
msgstr "পদকà§à¦·à§‡à¦ª:"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7842,7 +8177,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7887,7 +8222,7 @@ msgstr "বড় হাতের অকà§à¦·à¦°"
msgid "Reset"
msgstr "সমà§à¦ªà§à¦°à¦¸à¦¾à¦°à¦¨/সংকোচন অপসারণ করà§à¦¨ (রিসেট জà§à¦®à§)"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr "সমসà§à¦¯à¦¾/ভà§à¦²"
@@ -7948,6 +8283,10 @@ msgid "Instance Scene(s)"
msgstr "দৃশà§à¦¯(সমূহ) ইনà§à¦¸à¦Ÿà§à¦¯à¦¾à¦¨à§à¦¸ করà§à¦¨"
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "শীষà§à¦¯ নোড ইনà§à¦¸à¦Ÿà§à¦¯à¦¾à¦¨à§à¦¸ করà§à¦¨"
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr "সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ পরিসà§à¦•ার করà§à¦¨"
@@ -7984,6 +8323,12 @@ msgid "Save New Scene As..."
msgstr "নতà§à¦¨ দৃশà§à¦¯ à¦à¦‡à¦°à§‚পে সংরকà§à¦·à¦£ করà§à¦¨..."
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr "সমà§à¦ªà¦¾à¦¦à¦¨à¦¯à§‹à¦—à§à¦¯ অংশীদারীসমূহ"
@@ -8062,6 +8407,11 @@ msgid "Clear Inheritance"
msgstr "উতà§à¦¤à¦°à¦¾à¦§à¦¿à¦•ারতà§à¦¬ পরিসà§à¦•ার করà§à¦¨"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Open documentation"
+msgstr "রেফারেনà§à¦¸à§‡à¦° ডকà§à¦®à§‡à¦¨à§à¦Ÿà§‡à¦¶à¦¨à§‡ খà§à¦à¦œà§à¦¨à¥¤"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr "নোড(সমূহ) অপসারণ করà§à¦¨"
@@ -8070,15 +8420,16 @@ msgid "Add Child Node"
msgstr "শীষà§à¦¯ নোড তৈরি করà§à¦¨"
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
-msgstr "শীষà§à¦¯ নোড ইনà§à¦¸à¦Ÿà§à¦¯à¦¾à¦¨à§à¦¸ করà§à¦¨"
-
-#: editor/scene_tree_dock.cpp
msgid "Change Type"
msgstr "ধরণ পরিবরà§à¦¤à¦¨ করà§à¦¨"
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Extend Script"
+msgstr "পরবরà§à¦¤à§€ সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Make Scene Root"
msgstr "অরà§à¦¥à¦ªà§‚রà§à¦¨!"
@@ -8249,6 +8600,11 @@ msgid "Path is empty"
msgstr "পথটি খালি"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Filename is empty"
+msgstr "সংরকà§à¦·à¦£à§‡à¦° পথটি খালি!"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr "পথটি সà§à¦¥à¦¾à¦¨à§€à§Ÿ নয়"
@@ -8348,20 +8704,9 @@ msgid "Bytes:"
msgstr "বাইটস:"
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr "সতরà§à¦•তা"
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr "সমসà§à¦¯à¦¾:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr "উৎস:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
-msgstr "ফাংশন:"
+#, fuzzy
+msgid "Stack Trace"
+msgstr "ফà§à¦°à§‡à¦®à¦¸à¦®à§‚হ সà§à¦¤à§‚প করà§à¦¨"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8393,18 +8738,6 @@ msgid "Stack Frames"
msgstr "ফà§à¦°à§‡à¦®à¦¸à¦®à§‚হ সà§à¦¤à§‚প করà§à¦¨"
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr "চলক/ভেরিয়েবল"
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr "সমসà§à¦¯à¦¾à¦¸à¦®à§‚হ:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr "পদাঙà§à¦• সà§à¦¤à§‚প করà§à¦¨ (পà§à¦°à¦¯à§‹à¦œà§à¦¯ হলে):"
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr "পà§à¦°à§‹à¦«à¦¾à¦‡à¦²à¦¾à¦°"
@@ -8614,7 +8947,8 @@ msgid "GDNative"
msgstr "জিডিনà§à¦¯à¦¾à¦Ÿà¦¿à¦­"
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+#, fuzzy
+msgid "Step argument is zero!"
msgstr "ধাপ মান/আরà§à¦—à§à¦®à§‡à¦¨à§à¦Ÿ শূনà§à¦¯!"
#: modules/gdscript/gdscript_functions.cpp
@@ -8862,13 +9196,8 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr "সিদà§à¦§/বেকà§â€Œ!"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-#, fuzzy
-msgid "Bake the navigation mesh."
-msgstr "Navigation Mesh তৈরি করà§à¦¨"
+msgid "Bake NavMesh"
+msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
#, fuzzy
@@ -9178,6 +9507,10 @@ msgid "Base Type:"
msgstr "তলের ধরণ (Base Type):"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "সদসà§à¦¯à¦—ণ (Members):"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "উপসà§à¦¥à¦¿à¦¤ নোডসমূহ:"
@@ -9280,11 +9613,11 @@ msgid "Search VisualScript"
msgstr "Shader Graph Node অপসারণ করà§à¦¨"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
-msgstr "মান পান (Get)"
+msgid "Get %s"
+msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -9381,6 +9714,12 @@ msgstr ""
"সফলà§à¦­à¦¾à¦¬à§‡ কাজ করতে CollisionShape2D à¦à¦° à¦à¦•টি আকৃতি পà§à¦°à§Ÿà§‹à¦œà¦¨à¥¤ অনà§à¦—à§à¦°à¦¹ করে তার জনà§à¦¯ "
"à¦à¦•টি আকৃতি তৈরি করà§à¦¨!"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -9426,6 +9765,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr "PathFollow2D à¦à¦•মাতà§à¦° Path2D à¦à¦° অংশ হিসেবে নিরà§à¦§à¦¾à¦°à¦¨ করালেই কাজ করে।"
@@ -9556,6 +9901,16 @@ msgstr ""
"সফলà§à¦­à¦¾à¦¬à§‡ কাজ করতে CollisionShape à¦à¦° à¦à¦•টি আকৃতি পà§à¦°à§Ÿà§‹à¦œà¦¨à¥¤ অনà§à¦—à§à¦°à¦¹ করে তার জনà§à¦¯ à¦à¦•টি "
"আকৃতি তৈরি করà§à¦¨!"
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
#, fuzzy
msgid "Plotting Meshes"
@@ -9580,6 +9935,28 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr "PathFollow2D à¦à¦•মাতà§à¦° Path2D à¦à¦° অংশ হিসেবে নিরà§à¦§à¦¾à¦°à¦¨ করালেই কাজ করে।"
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr "PathFollow2D à¦à¦•মাতà§à¦° Path2D à¦à¦° অংশ হিসেবে নিরà§à¦§à¦¾à¦°à¦¨ করালেই কাজ করে।"
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9614,7 +9991,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9675,6 +10052,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à§‡à¦° তালিকাটি অকারà§à¦¯à¦•র।"
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
#, fuzzy
msgid "Raw Mode"
@@ -9692,11 +10073,6 @@ msgstr "সতরà§à¦•তা!"
msgid "Please Confirm..."
msgstr "অনà§à¦—à§à¦°à¦¹ করে নিশà§à¦šà¦¿à¦¤ করà§à¦¨..."
-#: scene/gui/file_dialog.cpp
-#, fuzzy
-msgid "Select this Folder"
-msgstr "মেথড/পদà§à¦§à¦¤à¦¿ বাছাই করà§à¦¨"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9707,6 +10083,10 @@ msgstr ""
"বà§à¦¯à¦¬à¦¹à¦¾à¦° না করেন। যদিও সমà§à¦ªà¦¾à¦¦à¦¨à§‡à¦° কাজে তা গà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯, কিনà§à¦¤à§ চালনার সময় তা লà§à¦•িয়ে "
"যাবে।"
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9757,11 +10137,6 @@ msgstr "ফনà§à¦Ÿà§‡à¦° আকার অগà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯à¥¤"
msgid "Input"
msgstr "ইনপà§à¦Ÿ যোগ করà§à¦¨"
-#: scene/resources/visual_shader.cpp
-#, fuzzy
-msgid "None"
-msgstr "<নান/কিছà§à¦‡ না>"
-
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
@@ -9779,6 +10154,211 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Split already exists."
+#~ msgstr "'%s' অà§à¦¯à¦¾à¦•শন ইতিমধà§à¦¯à§‡à¦‡ বিদà§à¦¯à¦®à¦¾à¦¨!"
+
+#, fuzzy
+#~ msgid "Add Split"
+#~ msgstr "ইনপà§à¦Ÿ যোগ করà§à¦¨"
+
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr "অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ পথ!"
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "পথের বিনà§à¦¦à§ অপসারণ করà§à¦¨"
+
+#, fuzzy
+#~ msgid "Poly"
+#~ msgstr "Poly সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨"
+
+#, fuzzy
+#~ msgid "Splits"
+#~ msgstr "পথ বিভকà§à¦¤ করà§à¦¨"
+
+#, fuzzy
+#~ msgid "Select a split to erase it."
+#~ msgstr "à¦à¦•টি সেটিং আইটেম পà§à¦°à¦¥à¦® নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨!"
+
+#~ msgid "No name provided"
+#~ msgstr "কোন নাম বà§à¦¯à¦¾à¦¬à¦¹à¦¾à¦° করা হয়নি"
+
+#, fuzzy
+#~ msgid "Add Node.."
+#~ msgstr "নোড সংযোজন করà§à¦¨"
+
+#~ msgid "Create from scene?"
+#~ msgstr "দৃশà§à¦¯ হতে তৈরি করবেন?"
+
+#~ msgid "Create Poly"
+#~ msgstr "Poly তৈরি করà§à¦¨"
+
+#, fuzzy
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "আরমà§à¦­ হতে নতà§à¦¨ polygon তৈরি করà§à¦¨à¥¤"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "সংকà§à¦šà¦¿à¦¤ করà§à¦¨ (জà§à¦®à§ আউট)"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "সমà§à¦ªà§à¦°à¦¸à¦¾à¦°à¦¿à¦¤ করà§à¦¨ (জà§à¦®à§ ইন)"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "Poly3D তৈরি করà§à¦¨"
+
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "à¦à¦‡ নোডের মধà§à¦¯à§‡ কোন অকà§à¦²à§à¦¡à¦¾à¦° পলিগন টà§à¦¡à¦¿ রিসোরà§à¦¸ বিদà§à¦¯à¦®à¦¾à¦¨ নেই।\n"
+#~ " নতà§à¦¨ পলিগন তৈরি করবেন?"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "মাউসের বাম বোতাম: বিনà§à¦¦à§ সরান।"
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "কনà§à¦Ÿà§à¦°à§‹à¦² + মাউসের বাম বোতাম: অংশ বিভকà§à¦¤ করà§à¦¨à¥¤"
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "মাউসের ডান বোতাম: বিনà§à¦¦à§ মà§à¦›à§‡ ফেলà§à¦¨à¥¤"
+
+#, fuzzy
+#~ msgid "New TextFile"
+#~ msgstr "ফাইল"
+
+#~ msgid "Save Theme As"
+#~ msgstr "থিম à¦à¦‡à¦°à§‚পে সংরকà§à¦·à¦£ করà§à¦¨"
+
+#~ msgid "<None>"
+#~ msgstr "<নান/কিছà§à¦‡ না>"
+
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "জà§à¦®à§ (%):"
+
+#~ msgid "Class List:"
+#~ msgstr "কà§à¦²à¦¾à¦¸à§‡à¦° তালিকা:"
+
+#~ msgid "Search Classes"
+#~ msgstr "কà§à¦²à¦¾à¦¸à§‡à¦° অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করà§à¦¨"
+
+#, fuzzy
+#~ msgid "Public Methods"
+#~ msgstr "সরà§à¦¬à¦œà¦¨à§€à¦¨/পà§à¦°à¦•াশà§à¦¯ মেথডসমূহ:"
+
+#~ msgid "Public Methods:"
+#~ msgstr "সরà§à¦¬à¦œà¦¨à§€à¦¨/পà§à¦°à¦•াশà§à¦¯ মেথডসমূহ:"
+
+#, fuzzy
+#~ msgid "GUI Theme Items"
+#~ msgstr "GUI থিম à¦à¦° বসà§à¦¤à§à¦¸à¦®à§‚হ:"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "GUI থিম à¦à¦° বসà§à¦¤à§à¦¸à¦®à§‚হ:"
+
+#, fuzzy
+#~ msgid "Property: "
+#~ msgstr "পà§à¦°à¦ªà¦¾à¦°à§à¦Ÿà¦¿:"
+
+#, fuzzy
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "ফোলà§à¦¡à¦¾à¦°à§‡à¦° অবসà§à¦¥à¦¾ ফেবরিট/পà§à¦°à¦¿à¦¯à¦¼ হিসেবে অদলবদল/টগল করà§à¦¨"
+
+#, fuzzy
+#~ msgid "Show current scene file."
+#~ msgstr "à¦à¦‡-মà§à¦¹à§‚রà§à¦¤à§‡ সমà§à¦ªà¦¾à¦¦à¦¿à¦¤ রিসোরà§à¦¸à¦Ÿà¦¿ সংরকà§à¦·à¦£ করà§à¦¨à¥¤"
+
+#, fuzzy
+#~ msgid "Whole words"
+#~ msgstr "সমà§à¦ªà§‚রà§à¦£ শবà§à¦¦"
+
+#, fuzzy
+#~ msgid "Match case"
+#~ msgstr "অকà§à¦·à¦°à§‡à¦° মাতà§à¦°à¦¾ (বড়/ছোট-হাতের) মিল করà§à¦¨"
+
+#, fuzzy
+#~ msgid "Filter: "
+#~ msgstr "ফিলà§à¦Ÿà¦¾à¦°:"
+
+#~ msgid "Ok"
+#~ msgstr "ঠিক আছে"
+
+#, fuzzy
+#~ msgid "Show In File System"
+#~ msgstr "ফাইলসিসà§à¦Ÿà§‡à¦®"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "কà§à¦²à¦¾à¦¸à§‡à¦° কà§à¦°à¦®à§‡à¦¾à¦šà§à¦šà¦¤à¦¾ খà§à¦à¦œà§à¦¨à¥¤"
+
+#, fuzzy
+#~ msgid "Search in files"
+#~ msgstr "কà§à¦²à¦¾à¦¸à§‡à¦° অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করà§à¦¨"
+
+#~ msgid ""
+#~ "Built-in scripts can only be edited when the scene they belong to is "
+#~ "loaded"
+#~ msgstr ""
+#~ "পূরà§à¦¬à¦¨à¦¿à¦°à§à¦®à¦¿à¦¤ সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ শà§à¦§à§à¦®à¦¾à¦¤à§à¦° তাদের অধিকারী দৃশà§à¦¯ লোড করা হলেই সমà§à¦ªà¦¾à¦¦à¦¨ করা যাবে"
+
+#, fuzzy
+#~ msgid "Convert To Uppercase"
+#~ msgstr "à¦à¦¤à§‡ রূপানà§à¦¤à¦° করà§à¦¨..."
+
+#, fuzzy
+#~ msgid "Convert To Lowercase"
+#~ msgstr "à¦à¦¤à§‡ রূপানà§à¦¤à¦° করà§à¦¨..."
+
+#, fuzzy
+#~ msgid "Snap To Floor"
+#~ msgstr "সà§à¦¨à§à¦¯à¦¾à¦ª মোড:"
+
+#~ msgid "Rotate 0 degrees"
+#~ msgstr "০ ডিগà§à¦°à¦¿ ঘোরানà§"
+
+#~ msgid "Rotate 90 degrees"
+#~ msgstr "৯০ ডিগà§à¦°à¦¿ ঘোরানà§"
+
+#~ msgid "Rotate 180 degrees"
+#~ msgstr "১৮০ ডিগà§à¦°à¦¿ ঘোরানà§"
+
+#~ msgid "Rotate 270 degrees"
+#~ msgstr "২৭০ ডিগà§à¦°à¦¿ ঘোরানà§â€Œ"
+
+#~ msgid "Warning"
+#~ msgstr "সতরà§à¦•তা"
+
+#~ msgid "Error:"
+#~ msgstr "সমসà§à¦¯à¦¾:"
+
+#~ msgid "Source:"
+#~ msgstr "উৎস:"
+
+#~ msgid "Function:"
+#~ msgstr "ফাংশন:"
+
+#~ msgid "Variable"
+#~ msgstr "চলক/ভেরিয়েবল"
+
+#~ msgid "Errors:"
+#~ msgstr "সমসà§à¦¯à¦¾à¦¸à¦®à§‚হ:"
+
+#~ msgid "Stack Trace (if applicable):"
+#~ msgstr "পদাঙà§à¦• সà§à¦¤à§‚প করà§à¦¨ (পà§à¦°à¦¯à§‹à¦œà§à¦¯ হলে):"
+
+#~ msgid "Bake!"
+#~ msgstr "সিদà§à¦§/বেকà§â€Œ!"
+
+#, fuzzy
+#~ msgid "Bake the navigation mesh."
+#~ msgstr "Navigation Mesh তৈরি করà§à¦¨"
+
+#~ msgid "Get"
+#~ msgstr "মান পান (Get)"
+
#~ msgid "Change Scalar Constant"
#~ msgstr "সà§à¦•েলার ধà§à¦°à§à¦¬à¦• পরিবরà§à¦¤à¦¨ করà§à¦¨"
@@ -9981,9 +10561,6 @@ msgstr ""
#~ msgid "Run Script"
#~ msgstr "সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ চালান"
-#~ msgid "Save the currently edited resource."
-#~ msgstr "à¦à¦‡-মà§à¦¹à§‚রà§à¦¤à§‡ সমà§à¦ªà¦¾à¦¦à¦¿à¦¤ রিসোরà§à¦¸à¦Ÿà¦¿ সংরকà§à¦·à¦£ করà§à¦¨à¥¤"
-
#~ msgid "Stop Profiling"
#~ msgstr "পà§à¦°à§‹à¦«à¦¾à¦‡à¦²à¦¿à¦‚ বনà§à¦§ করà§à¦¨"
@@ -10193,10 +10770,6 @@ msgstr ""
#~ msgid "Clear Emitter"
#~ msgstr "Emitter পরিসà§à¦•ার করà§à¦¨"
-#, fuzzy
-#~ msgid "Fold Line"
-#~ msgstr "লাইন-ঠযান"
-
#~ msgid " "
#~ msgstr " "
@@ -10281,9 +10854,6 @@ msgstr ""
#~ msgid "Could not save atlas subtexture:"
#~ msgstr "à¦à¦Ÿà¦²à¦¾à¦¸/মানচিতà§à¦°à¦¾à¦¬à¦²à§€à¦° উপ-গঠনবিনà§à¦¯à¦¾à¦¸ (subtexture) সংরকà§à¦·à¦£ অসমরà§à¦¥ হয়েছে:"
-#~ msgid "Exporting for %s"
-#~ msgstr "%s à¦à¦° জনà§à¦¯ à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ (export) হচà§à¦›à§‡"
-
#~ msgid "Setting Up..."
#~ msgstr "সà§à¦¥à¦¾à¦ªà¦¿à¦¤/বিনà§à¦¯à¦¸à§à¦¤ হচà§à¦›à§‡..."
@@ -10382,9 +10952,6 @@ msgstr ""
#~ msgid "Source Font:"
#~ msgstr "ফনà§à¦Ÿà§‡à¦° উৎস:"
-#~ msgid "Source Font Size:"
-#~ msgstr "উৎস ফনà§à¦Ÿà§‡à¦° আকার:"
-
#~ msgid "Dest Resource:"
#~ msgstr "রিসোরà§à¦¸à§‡à¦° গনà§à¦¤à¦¬à§à¦¯à¦¸à§à¦¥à¦¾à¦¨:"
@@ -10463,9 +11030,6 @@ msgstr ""
#~ msgid "Start(s)"
#~ msgstr "আরমà§à¦­(সমূহ)"
-#~ msgid "Filters"
-#~ msgstr "ফিলà§à¦Ÿà¦¾à¦°à¦¸à¦®à§‚হ"
-
#~ msgid "Source path is empty."
#~ msgstr "উৎসের পথটি খালি।"
@@ -10739,15 +11303,9 @@ msgstr ""
#~ msgid "Stereo"
#~ msgstr "সà§à¦Ÿà§‡à¦°à¦¿à¦“"
-#~ msgid "Pitch"
-#~ msgstr "পিচà§â€Œ"
-
#~ msgid "Window"
#~ msgstr "উইনà§à¦¡à§‹"
-#~ msgid "Move Right"
-#~ msgstr "ডানে সরান"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "%s%% -ঠমাপিত হচà§à¦›à§‡à¥¤"
@@ -10812,9 +11370,6 @@ msgstr ""
#~ msgid "just pressed"
#~ msgstr "à¦à¦‡à¦®à¦¾à¦¤à§à¦° চাপিত"
-#~ msgid "just released"
-#~ msgstr "à¦à¦‡à¦®à¦¾à¦¤à§à¦° অবà§à¦¯à¦¾à¦¹à¦¿à¦¤/মà§à¦•à§à¦¤"
-
#, fuzzy
#~ msgid ""
#~ "Couldn't read the certificate file. Are the path and password both "
@@ -11121,21 +11676,6 @@ msgstr ""
#~ msgid "Trailing Silence:"
#~ msgstr "পরিশিষà§à¦Ÿ নীরবতা:"
-#~ msgid "Script Export Mode:"
-#~ msgstr "সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ মোড:"
-
-#~ msgid "Text"
-#~ msgstr "টেকà§à¦¸à¦Ÿ"
-
-#~ msgid "Compiled"
-#~ msgstr "কমà§à¦ªà¦¾à¦‡à¦²à§à¦¡"
-
-#~ msgid "Encrypted (Provide Key Below)"
-#~ msgstr "à¦à¦¨à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ করà§à¦¨ (নীচে কী/চাবি দিন)"
-
-#~ msgid "Script Encryption Key (256-bits as hex):"
-#~ msgstr "সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ à¦à¦¨à¦•à§à¦°à¦¿à¦ªà¦¶à¦¨ কী/চাবি (২৫৬-বিটস হেকà§à¦¸):"
-
#~ msgid "Export Project PCK"
#~ msgstr "পà§à¦°à¦•লà§à¦ªà§‡à¦° PCK à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨"
@@ -11145,9 +11685,6 @@ msgstr ""
#~ msgid "Project Export"
#~ msgstr "à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ পà§à¦°à¦•লà§à¦ª"
-#~ msgid "Export Preset:"
-#~ msgstr "à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿà§‡à¦° পà§à¦°à¦¿à¦¸à§‡à¦Ÿ:"
-
#~ msgid "BakedLightInstance does not contain a BakedLight resource."
#~ msgstr "BakedLightInstance কোনো BakedLight রিসোরà§à¦¸ ধারণ করে না।"
diff --git a/editor/translations/ca.po b/editor/translations/ca.po
index 075b112224..e859a7e9cc 100644
--- a/editor/translations/ca.po
+++ b/editor/translations/ca.po
@@ -1,22 +1,25 @@
# Catalan translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# BennyBeat <bennybeat@gmail.com>, 2017.
# Javier Ocampos <xavier.ocampos@gmail.com>, 2018.
# Roger Blanco Ribera <roger.blancoribera@gmail.com>, 2016-2018.
+# Rubén Moreno <ruben.moreno.romero@gmail.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-07-26 12:25+0000\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:38+0100\n"
"Last-Translator: Roger Blanco Ribera <roger.blancoribera@gmail.com>\n"
"Language-Team: Catalan <https://hosted.weblate.org/projects/godot-engine/"
"godot/ca/>\n"
"Language: ca\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.1-dev\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -24,41 +27,38 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr "L'argument per a convert() no és vàlid, utilitzeu constants TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr "Manquen bytes per a descodificar els bytes, o el format no és vàlid."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "L'entrada %i en l'expressió no és vàlida (no transmesa)"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "No es pot emprar \"self\" car l'instància és nul·la (no transmesa)"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "El nom de la propietat índex '%s' del node %s no és vàlid ."
+msgstr "Els operands de %s, %s i %s no són vàlids."
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid index of type %s for base type %s"
-msgstr "El nom de la propietat índex '%s' del node %s no és vàlid ."
+msgstr "L'índex del tipus %s no és vàlid per al tipus base %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "L'índex anomenat '%s' no és vàlid per al tipus base %s"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid arguments to construct '%s'"
-msgstr ": Argument no vàlid del tipus: "
+msgstr "Els arguments per a construir '%s' no són vàlids"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "En la crida a '%s':"
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -67,27 +67,23 @@ msgstr "Allibera"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "Equilibrat"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Mirror"
-msgstr "Replica en l'eix X"
+msgstr "Emmiralla"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "Insereix una clau"
+msgstr "Insereix una Clau aquí"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "Duplica la Selecció"
+msgstr "Duplica les Claus seleccionades"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "Elimina Seleccionats"
+msgstr "Elimina les Claus seleccionades"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -118,46 +114,40 @@ msgid "Anim Change Call"
msgstr "Modifica la Crida"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Property Track"
-msgstr "Propietat:"
+msgstr "Pista de Propietats"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "3D Transform Track"
-msgstr "Tipus de Transformació"
+msgstr "Pista de Transformació 3D"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "Pista de Crida de Mètodes"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "Pista de Corbes Bezier"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "Pista de reproducció d'Àudio"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Playback Track"
-msgstr "Aturar la reproducció de l'animació. (S)"
+msgstr "Pista de reproducció d'Animacions"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
msgstr "Afegeix una Pista"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Length Time (seconds)"
-msgstr "Durada de l'Animació (en segons)."
+msgstr "Durada de l'Animació (en segons)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "Zoom de l'animació."
+msgstr "Bucle de l'Animació"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -165,42 +155,36 @@ msgid "Functions:"
msgstr "Funcions:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Audio Clips:"
-msgstr "Receptor d'Àudio"
+msgstr "Talls d'Àudio:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Clips:"
-msgstr "Clips"
+msgstr "Talls d'Animació:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Toggle this track on/off."
-msgstr "Mode Lliure de Distraccions."
+msgstr "Activa/Desactiva la Pista."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "Mode d'Actualització (Configuració d'aquesta propietat)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Interpolation Mode"
-msgstr "Node d'Animació"
+msgstr "Mode d'Interpolació"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "Mode de Bucle Continu (Interpola el final amb l'inici del bucle)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "Treu la pista seleccionada."
+msgstr "Treu la Pista."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "Durada de la fosa (s):"
+msgstr "Temps (s): "
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -215,13 +199,12 @@ msgid "Trigger"
msgstr "Activador"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Capture"
-msgstr "Característiques"
+msgstr "Captura"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "El de més a prop"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
@@ -230,15 +213,15 @@ msgstr "Lineal"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr ""
+msgstr "Cúbic"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
-msgstr ""
+msgstr "Limita la Interpolació del bucle"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "Embolcalla la interpolació"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -246,14 +229,12 @@ msgid "Insert Key"
msgstr "Insereix una clau"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "Duplica els Nodes"
+msgstr "Duplica les Claus"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "Elimina els Nodes"
+msgstr "Elimina les Claus"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -271,7 +252,6 @@ msgstr "Voleu crear %d NOVES pistes i inserir-hi claus?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -284,6 +264,7 @@ msgstr "Insereix una Animació"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
msgstr ""
+"Un AnimationPlayer no pot animar-se a si mateix, només altres reproductors."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
@@ -300,6 +281,7 @@ msgstr "Insereix una Clau"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
msgstr ""
+"Les pistes de Transformació només s'apliquen a nodes del tipus Espacial."
#: editor/animation_track_editor.cpp
msgid ""
@@ -308,44 +290,49 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"Les pistes de àudio només poden apuntar a nodes del tipus:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "Les pistes d'Animació només poden apuntar a nodes AnimationPlayer."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
msgstr ""
+"Un reproductor d'Animacions no pot animar-se a si mateix, només altres "
+"reproductors."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "No es pot afegir una nova pista sense cap arrel"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "El camí de la Pista no és vàlid i per tant no s'hi poden afegir claus."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "No s'hi pot inserir cap Clau. La pista no és del tipus \"Spatial\""
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
msgstr ""
+"No s'hi pot afegit cap clau de mètode. El camí de la pista no és vàlid."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Method not found in object: "
-msgstr "Variable Get no trobada en l'Script: "
+msgstr "No s'ha trobat el mètode en l'objecte: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
msgstr "Mou les Claus"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clipboard is empty"
-msgstr "El porta-retalls és buit!"
+msgstr "El porta-retalls és buit"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
@@ -355,24 +342,23 @@ msgstr "Escala les Claus"
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
msgstr ""
+"Aquesta opció no funciona per l'edició de Bézier, ja que és una pista única."
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "Mostra les pistes dels nodes seleccionats en l'arbre."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr ""
+msgstr "Agrupa les pistes per node o mostra-les en una llista."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap (s): "
-msgstr "Pas (s):"
+msgstr "Pas (s): "
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "L'arbre d'animació és vàlid."
+msgstr "Valor del pas d'Animació."
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -384,19 +370,16 @@ msgid "Edit"
msgstr "Edita"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "Arbre d'Animació"
+msgstr "Propietats de l'Animació."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "Copia els Paràmetres"
+msgstr "Còpia les Pistes"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "Enganxa els Paràmetres"
+msgstr "Enganxa les Pistes"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -406,8 +389,7 @@ msgstr "Escala la Selecció"
msgid "Scale From Cursor"
msgstr "Escala amb el Cursor"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Duplica la Selecció"
@@ -416,16 +398,17 @@ msgid "Duplicate Transposed"
msgstr "Duplica'l Transposat"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
-msgstr "Elimina Seleccionats"
+msgstr "Elimina la Selecció"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+#, fuzzy
+msgid "Go to Next Step"
msgstr "Vés al Pas Següent"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+#, fuzzy
+msgid "Go to Previous Step"
msgstr "Vés al Pas Anterior"
#: editor/animation_track_editor.cpp
@@ -438,11 +421,11 @@ msgstr "Poleix l'Animació"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "Tria el node per animar:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "Fés servir Corbes Bézier"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
@@ -490,7 +473,7 @@ msgstr "Relació d'Escala:"
#: editor/animation_track_editor.cpp
msgid "Select tracks to copy:"
-msgstr ""
+msgstr "Tria les Pistes per copiar:"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -528,11 +511,11 @@ msgstr "Cap Coincidència"
msgid "Replaced %d occurrence(s)."
msgstr "%d ocurrència/es reemplaçades."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Distingeix entre majúscules i minúscules"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "Paraules senceres"
@@ -548,29 +531,32 @@ msgstr "Reemplaça-hoTot"
msgid "Selection Only"
msgstr "Selecció Només"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Apropa"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "Allunya"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "Reinicia el Zoom"
#: editor/code_editor.cpp
-#, fuzzy
msgid "Warnings:"
-msgstr "Avisos"
+msgstr "Avisos:"
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "Apropa"
+msgid "Font Size:"
+msgstr "Mida de la lletra:"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Línia:"
@@ -603,6 +589,7 @@ msgstr "Afegeix"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -659,9 +646,8 @@ msgid "Disconnect '%s' from '%s'"
msgstr "Desconnecta '%s' de '%s'"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect all from signal: '%s'"
-msgstr "Desconnecta '%s' de '%s'"
+msgstr "Desconnecta-ho tot del senyal: '%s'"
#: editor/connections_dialog.cpp
msgid "Connect..."
@@ -673,19 +659,17 @@ msgid "Disconnect"
msgstr "Desconnecta"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect Signal: "
-msgstr "Connectant Senyal:"
+msgstr "Connecta el Senyal: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection: "
-msgstr "Error en la connexió"
+msgstr "Edita la Connexió: "
#: editor/connections_dialog.cpp
#, fuzzy
-msgid "Are you sure you want to remove all connections from the \""
-msgstr "Esteu segur que voleu executar més d'un projecte de cop?"
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr "Esteu segur que voleu eliminar totes les connexions d'aquest senyal?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -693,22 +677,19 @@ msgstr "Senyals"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr ""
+msgstr "Esteu segur que voleu eliminar totes les connexions d'aquest senyal?"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "Desconnecta"
+msgstr "Desconnecta-ho Tot"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit..."
-msgstr "Edita"
+msgstr "Edita..."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "Mètodes"
+msgstr "Vés al Mètode"
#: editor/create_dialog.cpp
msgid "Change %s Type"
@@ -733,23 +714,20 @@ msgid "Recent:"
msgstr "Recents:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Cerca:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "Coincidències:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "Descripció:"
@@ -788,8 +766,7 @@ msgid "Resource"
msgstr "Recurs"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "Camí"
@@ -810,9 +787,10 @@ msgid "Search Replacement Resource:"
msgstr "Cerca Recurs Reemplaçant:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -845,7 +823,8 @@ msgid "Error loading:"
msgstr "Error en carregar:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+#, fuzzy
+msgid "Load failed due to missing dependencies:"
msgstr "No es pot carregar l'escena. Manquen dependències:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -904,14 +883,6 @@ msgstr "Modifica Valor del Diccionari"
msgid "Thanks from the Godot community!"
msgstr "Gràcies de la part de la Comunitat del Godot!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "D'acord"
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Col·laboradors de Godot Engine"
@@ -1005,7 +976,8 @@ msgid "Uncompressing Assets"
msgstr "Descomprimint Recursos"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+#, fuzzy
+msgid "Package installed successfully!"
msgstr "Paquet instal·lat correctament!"
#: editor/editor_asset_installer.cpp
@@ -1087,8 +1059,7 @@ msgid "Bus options"
msgstr "Opcions del Bus"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "Duplica"
@@ -1253,7 +1224,7 @@ msgid "Add AutoLoad"
msgstr "Afegeix AutoCàrrega"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "Camí:"
@@ -1261,8 +1232,8 @@ msgstr "Camí:"
msgid "Node Name:"
msgstr "Nom del node:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "Nom"
@@ -1332,12 +1303,17 @@ msgid "Template file not found:"
msgstr "No s'ha trobat la Plantilla:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Selecciona el Directori Actual"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "Fitxer Existent, Voleu sobreescriure'l?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "Selecciona el Directori Actual"
+#, fuzzy
+msgid "Select This Folder"
+msgstr "Selecciona aquest Directori"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
@@ -1345,12 +1321,13 @@ msgstr "Copia Camí"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr "Mostra en el Gestor de Fitxers"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+#, fuzzy
+msgid "Show in File Manager"
msgstr "Mostra en el Gestor de Fitxers"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1386,7 +1363,8 @@ msgid "Open a File or Directory"
msgstr "Obre un Fitxer o Directori"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Desa"
@@ -1444,8 +1422,7 @@ msgstr "Directoris i Fitxers:"
msgid "Preview:"
msgstr "Vista prèvia:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "Fitxer:"
@@ -1461,24 +1438,11 @@ msgstr "Escaneja Fonts"
msgid "(Re)Importing Assets"
msgstr "(Re)Important Recursos"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "Cerca Ajuda"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "Llista de Classes:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "Cerca Classes"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "Dalt"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "Classe:"
@@ -1495,28 +1459,31 @@ msgid "Brief Description:"
msgstr "Descripció breu:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "Membres"
+msgid "Properties"
+msgstr "Propietats"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "Membres:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr "Propietats:"
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "Mètodes Públics"
+msgid "Methods"
+msgstr "Mètodes"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "Mètodes públics:"
+#, fuzzy
+msgid "Methods:"
+msgstr "Mètodes"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "Elements del Tema de la GUI"
+#, fuzzy
+msgid "Theme Properties"
+msgstr "Propietats"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "Elements del Tema de la Interfície :"
+#, fuzzy
+msgid "Theme Properties:"
+msgstr "Propietats:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1543,10 +1510,16 @@ msgid "Constants:"
msgstr "Constants:"
#: editor/editor_help.cpp
-msgid "Description"
+#, fuzzy
+msgid "Class Description"
msgstr "Descripció"
#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
+msgstr "Descripció:"
+
+#: editor/editor_help.cpp
msgid "Online Tutorials:"
msgstr "Tutorials en línia:"
@@ -1561,11 +1534,13 @@ msgstr ""
"$url2]sol·licitant-lo[/url][/color]."
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "Propietats"
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "Descripció de la Propietat:"
#: editor/editor_help.cpp
-msgid "Property Description:"
+#, fuzzy
+msgid "Property Descriptions:"
msgstr "Descripció de la Propietat:"
#: editor/editor_help.cpp
@@ -1577,11 +1552,13 @@ msgstr ""
"$color][url=$url] totaportant-ne una[/url][/color]!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "Mètodes"
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "Descripció del mètode:"
#: editor/editor_help.cpp
-msgid "Method Description:"
+#, fuzzy
+msgid "Method Descriptions:"
msgstr "Descripció del mètode:"
#: editor/editor_help.cpp
@@ -1592,18 +1569,67 @@ msgstr ""
"Aquest mètode no disposa de cap descripció. Podeu contribuir [color=$color]"
"[url=$url] tot aportant-ne una[/url][/color]!"
-#: editor/editor_inspector.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Cerca Ajuda"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Display All"
+msgstr "Mostra les Normals"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Classes Only"
+msgstr "Classes"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Methods Only"
+msgstr "Mètodes"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "Senyals"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Constants Only"
+msgstr "Constants"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Properties Only"
+msgstr "Propietats"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Theme Properties Only"
+msgstr "Propietats"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Member Type"
+msgstr "Membres"
+
+#: editor/editor_help_search.cpp
#, fuzzy
-msgid "Property: "
+msgid "Class"
+msgstr "Classe:"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
msgstr "Propietat:"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr "Estableix"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "Estableix Múltiples:"
#: editor/editor_log.cpp
msgid "Output:"
@@ -1631,6 +1657,11 @@ msgstr "L'exportació del projecte ha fallat amb el codi d'error %d."
msgid "Error saving resource!"
msgstr "Error en desar recurs!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "D'acord"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "Anomena i Desa el Recurs..."
@@ -1649,7 +1680,7 @@ msgstr "Error en desar."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
-msgstr ""
+msgstr "No es pot obrir '%s'. Comproveu si el fitxer s'ha mogut o eliminat."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
@@ -1685,12 +1716,22 @@ msgstr "Aquesta operació no es pot fer sense cap arrel d'arbre."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
"No s'ha pogut desar l'escena. Probablement, no s'han pogut establir totes "
"les dependències (instàncies o herències)."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr "No s'ha pogut carregar MeshLibrary per combinar les dades!!"
@@ -1949,6 +1990,15 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "Error carregant l'Script complement des del camí: '%s'."
#: editor/editor_node.cpp
+#, fuzzy
+msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"No s'ha carregat l'Script d'addon des del camí: L'Script '% s' no és en el "
+"mode d'Eina."
+
+#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1998,15 +2048,19 @@ msgstr "Elimina Disseny"
msgid "Default"
msgstr "Predeterminat"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
#, fuzzy
+msgid "Show in FileSystem"
+msgstr "Mostra'l en el Sistema de Fitxers"
+
+#: editor/editor_node.cpp
msgid "Play This Scene"
-msgstr "Reprodueix Escena"
+msgstr "Reprodueix aquesta Escena"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "Tanca les altres pestanyes"
+msgstr "Tanca la Pestanya"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2081,7 +2135,8 @@ msgid "Save Scene"
msgstr "Desa Escena"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+#, fuzzy
+msgid "Save All Scenes"
msgstr "Desa Totes les Escenes"
#: editor/editor_node.cpp
@@ -2110,7 +2165,7 @@ msgid "Undo"
msgstr "Desfés"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Refés"
@@ -2134,20 +2189,20 @@ msgstr "Configuració del Projecte"
msgid "Export"
msgstr "Exporta"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "Eines"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "Obre el Gestor de Projectes?"
+msgstr "Obre el directori de Dades del Projecte"
#: editor/editor_node.cpp
msgid "Quit to Project List"
msgstr "Surt a la Llista de Projectes"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "Depurar"
@@ -2256,18 +2311,16 @@ msgid "Toggle Fullscreen"
msgstr "Mode Pantalla Completa"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Data/Settings Folder"
-msgstr "Configuració de l'Editor"
+msgstr "Obre el directori de Dades/Configuració de l'Editor"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "Obre el directori de Dades de l'Editor"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Settings Folder"
-msgstr "Configuració de l'Editor"
+msgstr "Obre el directori de Configuració de l'Editor"
#: editor/editor_node.cpp editor/project_export.cpp
msgid "Manage Export Templates"
@@ -2277,10 +2330,6 @@ msgstr "Gestor de Plantilles d'Exportació"
msgid "Help"
msgstr "Ajuda"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "Classes"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2351,13 +2400,12 @@ msgstr "Reprodueix Escena Personalitzada"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr ""
+msgstr "Canviar el controlador de vídeo requereix reiniciar l'editor."
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Save & Restart"
-msgstr "Desa i ReImporta"
+msgstr "Desa i Reinicia"
#: editor/editor_node.cpp
msgid "Spins when the editor window repaints!"
@@ -2375,27 +2423,26 @@ msgstr "Actualitza Canvis"
msgid "Disable Update Spinner"
msgstr "Desactiva l'Indicador d'Actualització"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "Inspector"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "Importa"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "Node"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "Sistema de Fitxers"
#: editor/editor_node.cpp
-#, fuzzy
+msgid "Inspector"
+msgstr "Inspector"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Node"
+
+#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
-msgstr "Expandir tot"
+msgstr "Expandeix el Quadre inferior"
#: editor/editor_node.cpp scene/resources/visual_shader.cpp
msgid "Output"
@@ -2474,9 +2521,8 @@ msgid "Thumbnail..."
msgstr "Miniatura..."
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit Plugin"
-msgstr "Edita Polígon"
+msgstr "Edita Connector"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
@@ -2500,15 +2546,13 @@ msgid "Status:"
msgstr "Estat:"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit:"
-msgstr "Edita"
+msgstr "Edita:"
#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Start"
-msgstr "Inicia!"
+msgstr "Inicia"
#: editor/editor_profiler.cpp
msgid "Measure:"
@@ -2530,7 +2574,7 @@ msgstr "% del Fotograma"
msgid "Physics Frame %"
msgstr "Fotograma de Física %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "Temps:"
@@ -2554,34 +2598,57 @@ msgstr "Temps"
msgid "Calls"
msgstr "Crides"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr "Activat"
#: editor/editor_properties.cpp
msgid "Layer"
-msgstr ""
+msgstr "Capa"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Bit %d, value %d"
-msgstr "Bit %d, valor %d."
+msgstr "Bit %d, valor %d"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr "[Buit]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
#, fuzzy
-msgid "Assign.."
-msgstr "Assigna"
+msgid "Assign..."
+msgstr "Assigna..."
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "Camí no vàlid"
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr "Selecciona una Vista"
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr "Script Nou"
@@ -2593,10 +2660,6 @@ msgstr "Nou %s"
msgid "Make Unique"
msgstr "Fes-lo Únic"
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr "Mostra'l en el Sistema de Fitxers"
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2605,7 +2668,8 @@ msgstr "Mostra'l en el Sistema de Fitxers"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "Enganxa"
@@ -2618,9 +2682,8 @@ msgstr "Converteix a %s"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Open Editor"
-msgstr "Obre en l'Editor"
+msgstr "Obre l'Editor"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Selected node is not a Viewport!"
@@ -2628,25 +2691,23 @@ msgstr "El Node seleccionat no és una Vista!"
#: editor/editor_properties_array_dict.cpp
msgid "Size: "
-msgstr ""
+msgstr "Mida: "
#: editor/editor_properties_array_dict.cpp
msgid "Page: "
-msgstr ""
+msgstr "Pàgina: "
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Key:"
-msgstr "Nou nom:"
+msgstr "Nova Clau:"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Value:"
-msgstr "Nou nom:"
+msgstr "Nou Valor:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
-msgstr ""
+msgstr "Afegeix una Parella de Clau/Valor"
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -2739,9 +2800,8 @@ msgid "Can't open export templates zip."
msgstr "No s'ha pogut obrir el zip amb les plantilles d'exportació."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Invalid version.txt format inside templates: %s."
-msgstr "El format de version.txt dins de les plantilles no és vàlid."
+msgstr "El format de version.txt no és vàlid dins de les plantilles: %s."
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
@@ -2806,6 +2866,8 @@ msgid ""
"Templates installation failed. The problematic templates archives can be "
"found at '%s'."
msgstr ""
+"No s'han pogut instal·lar les plantilles. Els fitxers problemàtics es troben "
+"a '%s'."
#: editor/export_template_manager.cpp
msgid "Error requesting url: "
@@ -2886,9 +2948,8 @@ msgid "Download Templates"
msgstr "Baixa plantilles"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr "Selecciona una rèplica: "
+msgstr "Selecciona un mirror de la llista: (Maj+Clic: Obre en el Navegador)"
#: editor/file_type_cache.cpp
msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
@@ -2897,18 +2958,21 @@ msgstr ""
"tipus de fitxers!"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "Favorits:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr "No es pot accedir a '%s'. No es troba en el sistema de fitxers!"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a grid of thumbnails."
-msgstr "Visualitza en una graella de miniatures"
+msgstr "Visualitza en una graella de miniatures."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a list."
-msgstr "Visualitza en una llista"
+msgstr "Mostra'ls en una llista."
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
@@ -2934,19 +2998,15 @@ msgstr "Error en duplicar:"
msgid "Unable to update dependencies:"
msgstr "No s'han pogut actualitzar les dependències:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "Manca Nom"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "Manca Nom."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "El nom conté caràcters que no són vàlids"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "Manca Nom."
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "El Nom conté caràcters que no són vàlids."
@@ -2971,22 +3031,6 @@ msgid "Duplicating folder:"
msgstr "S'està duplicant el directori:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "Expandir tot"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "Col·lapsar tot"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "Reanomena..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "Mou cap a..."
-
-#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
msgstr "Obre Escenes"
@@ -2995,6 +3039,16 @@ msgid "Instance"
msgstr "Instància"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Add to favorites"
+msgstr "Favorits:"
+
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Remove from favorites"
+msgstr "Treu del Grup"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "Edita Dependències..."
@@ -3002,19 +3056,35 @@ msgstr "Edita Dependències..."
msgid "View Owners..."
msgstr "Mostra Propietaris..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "Reanomena..."
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "Duplica..."
#: editor/filesystem_dock.cpp
-#, fuzzy
+msgid "Move To..."
+msgstr "Mou cap a..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
-msgstr "Script Nou"
+msgstr "Script Nou..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "Anomena i Desa el Recurs..."
+msgstr "Recurs Nou..."
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Expand All"
+msgstr "Expandir tot"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Collapse All"
+msgstr "Col·lapsar tot"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3037,45 +3107,34 @@ msgstr "ReAnalitza Sistema de Fitxers"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "Modifica l'estat del directori com a Favorit"
+msgid "Toggle split mode"
+msgstr "Commuta Mode"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Show current scene file."
-msgstr "Selecciona la sub-tessel·la en edició."
+msgid "Search files"
+msgstr "Cerca Fitxers"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr "Instancia les escenes seleccionades com a filles del node seleccionat."
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "Cerca Classes"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
msgstr "Analitzant Fitxers..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "Mou"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "There is already file or folder with the same name in this location."
-msgstr "Ja hi ha un directori amb el mateix nom en aquest camí."
+msgstr "Ja hi existex un fitxer o directori amb aquest nom."
#: editor/filesystem_dock.cpp
msgid "Overwrite"
-msgstr ""
+msgstr "Sobreescriu"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
@@ -3083,32 +3142,23 @@ msgstr "Crea un Script"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find in files"
-msgstr "Cerca Tessel·la"
+msgid "Find in Files"
+msgstr "Cerca en els fitxers"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find: "
-msgstr "Troba"
+msgid "Find:"
+msgstr "Cerca: "
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Whole words"
-msgstr "Paraules senceres"
+msgid "Folder:"
+msgstr "Directori : "
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Match case"
-msgstr "Distingeix entre majúscules i minúscules"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Filter: "
-msgstr "Filtre:"
+msgid "Filters:"
+msgstr "Filtres"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3124,52 +3174,49 @@ msgid "Cancel"
msgstr "Cancel·la"
#: editor/find_in_files.cpp
-#, fuzzy
+msgid "Find: "
+msgstr "Cerca: "
+
+#: editor/find_in_files.cpp
msgid "Replace: "
-msgstr "Reemplaça"
+msgstr "Reemplaça: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace all (no undo)"
-msgstr "Reemplaça-hoTot"
+msgstr "Reemplaça-ho Tot (no es pot desfer)"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Searching..."
-msgstr "Desant..."
+msgstr "Cercant..."
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Search complete"
-msgstr "Cerca Text"
+msgstr "Cerca completa"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group name already exists."
-msgstr "ERROR: Ja existeix aquest nom d'Animació!"
+msgstr "Aquest grup ja existeix."
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
-msgstr "Nom no vàlid."
+msgid "Invalid group name."
+msgstr "El Nom del grup no és vàlid."
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Grups"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes not in Group"
-msgstr "Afegeix al Grup"
+msgstr "Els nodes no es troben en el Grup"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
msgid "Filter nodes"
msgstr "Filtre els Nodes"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes in Group"
-msgstr "Afegeix al Grup"
+msgstr "Nodes del Grup"
#: editor/groups_editor.cpp
msgid "Add to Group"
@@ -3180,9 +3227,8 @@ msgid "Remove from Group"
msgstr "Treu del Grup"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Manage Groups"
-msgstr "Grups"
+msgstr "Gestiona Grups"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Single Scene"
@@ -3289,17 +3335,14 @@ msgstr "ReImportar"
msgid "Failed to load resource."
msgstr "No s'ha pogut carregar el recurs."
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "D'acord"
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+#, fuzzy
+msgid "Expand All Properties"
msgstr "Expandeix totes les propietats"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+#, fuzzy
+msgid "Collapse All Properties"
msgstr "Col·lapsa totes les propietats"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3316,9 +3359,8 @@ msgid "Paste Params"
msgstr "Enganxa els Paràmetres"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Edit Resource Clipboard"
-msgstr "El porta-retalls de Recursos és buit!"
+msgstr "Edita el Porta-retalls de Recursos"
#: editor/inspector_dock.cpp
msgid "Copy Resource"
@@ -3345,6 +3387,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "Carrega un recurs des del disc i edita'l."
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "Desa el recurs editat ara."
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "Vés a l'anterior objecte editat de l'historial."
@@ -3361,9 +3407,8 @@ msgid "Object properties."
msgstr "Propietats de l'objecte."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Filter properties"
-msgstr "Filtre els Nodes"
+msgstr "Filtra les propietats"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
@@ -3378,47 +3423,42 @@ msgid "Select a Node to edit Signals and Groups."
msgstr "Seleccioneu un Node per editar Senyals i Grups."
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Edit a Plugin"
-msgstr "Edita Polígon"
+msgstr "Edita un Connector"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Create a Plugin"
-msgstr "Crea una solució en C#"
+msgstr "Crea un Connector"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Plugin Name:"
-msgstr "Connectors"
+msgstr "Nom del Connector:"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
-msgstr ""
+msgstr "Subcarpeta:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Language:"
-msgstr "Llengua"
+msgstr "Llengua:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Script Name:"
-msgstr "L'Script és vàlid"
+msgstr "Nom de l'script:"
#: editor/plugin_config_dialog.cpp
msgid "Activate now?"
-msgstr ""
+msgstr "Activar ara?"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
msgstr "Crea Polígon"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+#, fuzzy
+msgid "Edit Polygon"
msgstr "Edita Polígon"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3426,25 +3466,27 @@ msgid "Insert Point"
msgstr "Insereix un Punt"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+#, fuzzy
+msgid "Edit Polygon (Remove Point)"
msgstr "Edita el Polígon (Elimina un Punt)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+#, fuzzy
+msgid "Remove Polygon And Point"
msgstr "Elimina el Polígon i el Punt"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "Crea un Polígon nou del no-res"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr "Crea punts."
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#, fuzzy
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
"Edita un Polígon existent:\n"
"Clic Esquerra: Mou un Punt.\n"
@@ -3452,8 +3494,9 @@ msgstr ""
"Clic Dreta: Elimina un Punt."
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
-msgstr "Elimina els Punts"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr "Elimina un Punt."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3468,14 +3511,16 @@ msgstr "Afegeix una Animació"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
-msgstr "Carrega"
+msgid "Load..."
+msgstr "Carrega..."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "This type of node can't be used. Only root nodes are allowed."
msgstr ""
+"Aquest tipus de node no es pot utilitzar. Només están autoritzats els nodes "
+"arrel."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3485,72 +3530,64 @@ msgid ""
"AnimationTree is inactive.\n"
"Activate to enable playback, check node warnings if activation fails."
msgstr ""
+"AnimationTree inactiu.\n"
+"Activa per permetre playback, comprova avisos de node si falla l'activació."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Set the blending position within the space"
-msgstr ""
+msgstr "Estableix la posició de mescla dins de l'espai"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Select and move points, create points with RMB."
-msgstr ""
+msgstr "Selecciona i mou els punts, crea punts fent clic dret."
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Elimina els Punts"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "Clic Dret: Eliminar un Punt."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Point"
-msgstr "Mou el Punt"
+msgstr "Punt"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Open Animation Node"
-msgstr "Node d'Animació"
+msgstr "Obre un Node d'Animació"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists"
-msgstr "L'Acció '%s' ja existeix!"
+msgstr "El triangle ja existeix"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "BlendSpace2D does not belong to an AnimationTree node."
-msgstr ""
+msgstr "BlendSpace2D no pertany a cap node AnimationTree."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "No triangles exist, so no blending can take place."
-msgstr ""
+msgstr "En no haver-hi cap triangle, no es pot mesclar res."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create triangles by connecting points."
-msgstr ""
+msgstr "Crea triangles connectant punts."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Erase points and triangles."
-msgstr ""
+msgstr "Elimina punts i triangles."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Generate blend triangles automatically (instead of manually)"
-msgstr ""
+msgstr "Genera automàticament triangles de mescla (en comptes d'a mà)"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr "Alinea"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Mescla:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3559,16 +3596,18 @@ msgstr "Edita Filtres"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Output node can't be added to the blend tree."
-msgstr ""
+msgstr "No es pot afegir el node de sortida a l'arbre de mescla."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Unable to connect, port may be in use or connection may be invalid."
-msgstr ""
+msgstr "No es pot connectar. El port és en ús o la connexió no és vàlida."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
msgstr ""
+"En no haver-se establert cap reproductor d'animacions, no es poden recuperar "
+"els noms de les pistes."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Player path set is invalid, so unable to retrieve track names."
@@ -3584,7 +3623,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
-msgid "Add Node.."
+msgid "Add Node..."
msgstr "Afegeix un Node"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3867,7 +3906,7 @@ msgstr "Connecta els Nodes"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "Treu la pista seleccionada."
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3935,10 +3974,6 @@ msgid "Amount:"
msgstr "Quantitat:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "Mescla:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "Mescla 0:"
@@ -4140,7 +4175,7 @@ msgstr "Tot"
msgid "Plugins"
msgstr "Connectors"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "Ordena:"
@@ -4277,6 +4312,11 @@ msgstr "Modifica el elementCanvas"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Scale CanvasItem"
+msgstr "Modifica el elementCanvas"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Move CanvasItem"
msgstr "Modifica el elementCanvas"
@@ -4297,21 +4337,19 @@ msgid "Paste Pose"
msgstr "Enganxa Positura"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "Allunya"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "Allunya"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Apropa"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr "Mode de selecció"
@@ -4342,6 +4380,11 @@ msgid "Rotate Mode"
msgstr "Mode de Rotació"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "Mode Escala (R)"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4441,6 +4484,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr "Permet la selecció de nodes fills."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "Singleton"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "Mostra els Ossos"
@@ -4492,6 +4540,10 @@ msgid "Show Viewport"
msgstr "Mostra el Viewport"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr "Centra la Selecció"
@@ -4563,8 +4615,17 @@ msgstr ""
"Arrossegar i deixar anar + Maj: Canvia el tipus del node"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr "Crea un Poly3D"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "Crea Polígon"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Edita Polígon"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Edita el Polígon (Elimina un Punt)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
@@ -4666,37 +4727,9 @@ msgid "Item List Editor"
msgstr "Editor de Llistes d'Elements"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"No s'ha trobat cap recurs de tipus OccluderPolygon2D en aquest node.\n"
-"Vol Crear i assignar-ne un ara?"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr "Crea un Polígon Oclusor"
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr "Crea un nou Polígon del no-res."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "Edita un polígon existent:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "Clic Esquerra: Mou un Punt."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr "Ctrl + Clic Esquerra: Divideix el Segment."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "Clic Dret: Eliminar un Punt."
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr "La malla és buida!"
@@ -4928,13 +4961,14 @@ msgid "Populate"
msgstr "Omple"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr "Crea un Polígon de Navegació"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr "Generant AABB"
+#, fuzzy
+msgid "Generating Visibility Rect"
+msgstr "Genera un Rectangle de Visibilitat"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -4962,6 +4996,12 @@ msgstr "Esborra la Màscara d'Emissió"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "Convert to CPUParticles"
+msgstr "Converteix en majúscules"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr "Partícules"
@@ -5031,13 +5071,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr "Un material processador de tipus 'ParticlesMaterial' és obligatori."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
-msgstr "Genera AABB"
+msgid "Generating AABB"
+msgstr "Generant AABB"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "Converteix en majúscules"
+msgid "Generate AABB"
+msgstr "Genera AABB"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5061,6 +5100,11 @@ msgid "Add Point to Curve"
msgstr "Afegeix un Punt a la Corba"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "Tanca la Corba"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr "Mou un Punt de la Corba"
@@ -5088,6 +5132,11 @@ msgid "Click: Add Point"
msgstr "Clic: Afegeix un Punt"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Left Click: Split Segment (in curve)"
+msgstr "Parteix el Segment (de la Corba)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr "Clic Dret: Elimina el Punt"
@@ -5103,11 +5152,6 @@ msgstr "Afegeix un Punt (en l'espai buit)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr "Parteix el Segment (de la Corba)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "Elimina el Punt"
@@ -5164,6 +5208,10 @@ msgstr "Elimina el Punt Out-Control"
msgid "Remove In-Control Point"
msgstr "Elimina el Punt In-Control"
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Parteix el Segment (de la Corba)"
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5176,10 +5224,16 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Sync bones"
+msgid "Sync Bones"
msgstr "Mostra els Ossos"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr "Crea un Mapa UV"
@@ -5189,42 +5243,48 @@ msgid "Create Polygon & UV"
msgstr "Crea Polígon"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "Crea una nova guia horitzontal"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "L'Acció '%s' ja existeix!"
+msgid "Remove Internal Vertex"
+msgstr "Elimina el Punt In-Control"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Add Split"
-msgstr "Afegeix un punt"
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "Camí no vàlid"
+msgid "Add Custom Polygon"
+msgstr "Edita Polígon"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Elimina el punt"
+msgid "Remove Custom Polygon"
+msgstr "Elimina el Polígon i el Punt"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr "Transforma el Mapa UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
+#, fuzzy
+msgid "Transform Polygon"
+msgstr "Tipus de Transformació"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Open Polygon 2D UV editor."
+msgstr "Editor d'UVs de Polígons 2D"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
msgstr "Editor d'UVs de Polígons 2D"
@@ -5234,13 +5294,13 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "Edita Polígon"
+msgid "Points"
+msgstr "Punt"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Splits"
-msgstr "Parteix el Camí"
+msgid "Polygons"
+msgstr "Polígon -> UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -5249,11 +5309,7 @@ msgstr "Crea els ossos"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
-msgstr "Crea Polígon"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Move Points"
msgstr "Mou el Punt"
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5281,20 +5337,21 @@ msgid "Scale Polygon"
msgstr "Escala el Polígon"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "Cal seleccionar un Element!"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5319,6 +5376,11 @@ msgid "Grid Settings"
msgstr "Configuració del GridMap"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "Alinea"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr "Activa l'Alineament"
@@ -5382,22 +5444,22 @@ msgid "Paste Resource"
msgstr "Enganxa el Recurs"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "Obre en l'Editor"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr "Instància:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr "Tipus:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Obre en l'Editor"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr "Carrega un Recurs"
@@ -5430,6 +5492,11 @@ msgstr "Error en desar TileSet!"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
+msgid "Error: could not load file."
+msgstr "Error - No s'ha pogut crea l'Script en el sistema de fitxers."
+
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Error could not load file."
msgstr "Error - No s'ha pogut crea l'Script en el sistema de fitxers."
@@ -5439,19 +5506,23 @@ msgid "Error saving file!"
msgstr "Error en desar el TileSet!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
+#, fuzzy
+msgid "Error while saving theme."
msgstr "Error en desar el tema"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+#, fuzzy
+msgid "Error Saving"
msgstr "Error en desar"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
+#, fuzzy
+msgid "Error importing theme."
msgstr "Error en importar el tema"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+#, fuzzy
+msgid "Error Importing"
msgstr "Error en importar"
#: editor/plugins/script_editor_plugin.cpp
@@ -5474,6 +5545,14 @@ msgid "Import Theme"
msgstr "Importa un Tema"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Error en desar el tema"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Error en desar"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr "Desa el Tema com a..."
@@ -5515,8 +5594,8 @@ msgstr "Fitxer"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile"
-msgstr "Visualitza Fitxers"
+msgid "Open..."
+msgstr "Obre"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5531,11 +5610,8 @@ msgid "Copy Script Path"
msgstr "Copia el camí de l'Script"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr "Mostra'l en el Sistema de Fitxers"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+#, fuzzy
+msgid "History Previous"
msgstr "Anterior en l'Historial"
#: editor/plugins/script_editor_plugin.cpp
@@ -5548,6 +5624,11 @@ msgid "Theme"
msgstr "Tema"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Import Theme..."
+msgstr "Importa un Tema"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
msgstr "Recarrega el Tema"
@@ -5556,10 +5637,6 @@ msgid "Save Theme"
msgstr "Desa el Tema"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "Anomena i Desa el Tema"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "Tanca la Documentació"
@@ -5606,7 +5683,8 @@ msgid "Keep Debugger Open"
msgstr "Manté el Depurador Obert"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+#, fuzzy
+msgid "Debug with External Editor"
msgstr "Depura amb un editor extern"
#: editor/plugins/script_editor_plugin.cpp
@@ -5614,10 +5692,6 @@ msgid "Open Godot online documentation"
msgstr "Obre la Documentació en línia"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr "Cerca dins la jerarquia de classes."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Cerca dins la documentació de referència."
@@ -5655,21 +5729,9 @@ msgstr "Depurador"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Search results"
+msgid "Search Results"
msgstr "Cerca Ajuda"
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "Cerca Classes"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-"Només es poden editar els Scripts Integrats amb la seva escena associada "
-"carregada"
-
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
@@ -5680,6 +5742,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "Vés a la Funció..."
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr "Només s'hi poden deixar caure Recursos del sistema de fitxers."
@@ -5712,10 +5783,6 @@ msgstr "Converteix a Majúscules"
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5767,11 +5834,13 @@ msgid "Trim Trailing Whitespace"
msgstr "Retalla els espais en blanc al final"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+#, fuzzy
+msgid "Convert Indent to Spaces"
msgstr "Converteix la Sagnia en espais"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+#, fuzzy
+msgid "Convert Indent to Tabs"
msgstr "Converteix la Sagnia en Tabulacions"
#: editor/plugins/script_text_editor.cpp
@@ -5788,36 +5857,32 @@ msgid "Remove All Breakpoints"
msgstr "Elimina tots els punts d'interrupció"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
+#, fuzzy
+msgid "Go to Next Breakpoint"
msgstr "Vés al següent punt d'interrupció"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
+#, fuzzy
+msgid "Go to Previous Breakpoint"
msgstr "Vés a l'anterior punt d'interrupció"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr "Converteix en majúscules"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr "Converteix en minúscules"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr "Cerca l'Anterior"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr "Filtrat de Fitxers..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+#, fuzzy
+msgid "Go to Function..."
msgstr "Vés a la Funció..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+#, fuzzy
+msgid "Go to Line..."
msgstr "Vés a la Línia..."
#: editor/plugins/script_text_editor.cpp
@@ -5914,6 +5979,15 @@ msgid "Animation Key Inserted."
msgstr "S'ha insertit una Clau d'Animació."
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "Pitch"
+msgstr "commutador"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr "Objectes Dibuixats"
@@ -6080,6 +6154,11 @@ msgid "Freelook Speed Modifier"
msgstr "Modificador de la Velocitat de la Vista Lliure"
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "Mostra la Informació"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "Diàleg XForm"
@@ -6182,11 +6261,6 @@ msgid "Tool Scale"
msgstr "Eina d'Escala"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap To Floor"
-msgstr "Alinea-ho amb la graella"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Vista Lliure"
@@ -6304,6 +6378,10 @@ msgstr "Pre"
msgid "Post"
msgstr "Post"
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
msgid "Sprite is empty!"
@@ -6423,11 +6501,18 @@ msgid "Set Region Rect"
msgstr "Defineix la Regió Rectangular"
#: editor/plugins/texture_region_editor_plugin.cpp
+#, fuzzy
+msgid "Set Margin"
+msgstr "Estableix la Nansa"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr "Mode Imant:"
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+#, fuzzy
+msgid "None"
msgstr "<Cap>"
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6593,6 +6678,11 @@ msgid "Fix Invalid Tiles"
msgstr "Nom no vàlid."
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "Centra la Selecció"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr "Pinta el TileMap"
@@ -6639,33 +6729,40 @@ msgstr "Tria un Tessel·la"
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "Treu la Selecció"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr "Gira-ho 0 graus"
+#, fuzzy
+msgid "Rotate left"
+msgstr "Mode de Rotació"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr "Gira-ho 90 graus"
+#, fuzzy
+msgid "Rotate right"
+msgstr "Gira el Polígon"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
-msgstr "Gira-ho 180 graus"
+msgid "Flip horizontally"
+msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
-msgstr "Gira-ho 270 graus"
+msgid "Flip vertically"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Clear transform"
+msgstr "Transforma"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr "Afegeix Nodes des d'Arbre"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr "Elimina l'entrada actual"
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6677,35 +6774,60 @@ msgid "Merge from Scene"
msgstr "Combina-ho a partir de l'Escena"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
msgstr ""
-"Selecciona una sub-tessel·la com a icona. També s'utilitzarà per les "
-"assignacions automàtiques no-vàlides de l'autotile."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "Enganxa l'Animació"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "Elimina un Punt."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "Crea un nou Polígon del no-res."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "Elimina l'entrada actual"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
-msgstr "Crear-ho a partir de l'escena?"
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
msgstr "Combinar-ho a partir de l'escena?"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Elimina la Plantilla"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6716,13 +6838,8 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
-"Click on another Tile to edit it."
-msgstr ""
-"clic Esquerra: activa el bit\n"
-"clic Dreta: desactiva el bit."
+msgid "Delete selected Rect."
+msgstr "Voleu Esborrar els fitxers seleccionats?"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -6733,6 +6850,21 @@ msgstr "Selecciona la sub-tessel·la en edició."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid "Delete polygon."
+msgstr "Elimina els Punts"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid ""
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
+"Click on another Tile to edit it."
+msgstr ""
+"clic Esquerra: activa el bit\n"
+"clic Dreta: desactiva el bit."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
"Select sub-tile to use as icon, this will be also used on invalid autotile "
"bindings.\n"
@@ -6750,11 +6882,101 @@ msgstr "Selecciona una sub-tessel·la per a modificar-ne la prioritat."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr "Selecciona una sub-tessel·la per a modificar-ne la prioritat."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Set Tile Region"
+msgstr "Defineix la Regió Rectangular"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Crea un Directori"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "Edita Filtres"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Edita un polígon existent:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Edita Polígon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Crea un Polígon de Navegació"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "Enganxa l'Animació"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Elimina la Plantilla"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "Elimina el Polígon i el Punt"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "Crea un Polígon Oclusor"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "Crea un Polígon de Navegació"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "Edita Filtres"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Crea un Polígon de Navegació"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Crea un Polígon Oclusor"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "This property can't be changed."
msgstr "Aquesta operació no pot dur-se a terme sense cap escena."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
+#, fuzzy
+msgid "TileSet"
msgstr "Tile Set"
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6794,6 +7016,16 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr "Manquen d'exportació per aquesta plataforma o s'han malmès:"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Release"
+msgstr "alliberat"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Exporting All"
+msgstr "Exportació per a %s"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr "Configuracions prestablertes"
@@ -6802,6 +7034,11 @@ msgid "Add..."
msgstr "Afegeix..."
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "Exporta Projecte"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr "Recursos"
@@ -6860,10 +7097,50 @@ msgid "Feature List:"
msgstr "Llista de Característiques :"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "Script Nou"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Script Export Mode:"
+msgstr "Mode d'Exportació:"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr "Exporta PCK/Zip"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export mode?"
+msgstr "Mode d'Exportació:"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Export All"
+msgstr "Exporta"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr "Manquen les plantilles d'exportació per aquesta plataforma:"
@@ -6996,7 +7273,8 @@ msgid "Unnamed Project"
msgstr "Projecte sense nom"
#: editor/project_manager.cpp
-msgid "Can't open project"
+#, fuzzy
+msgid "Can't open project at '%s'."
msgstr "No es pot obrir el projecte"
#: editor/project_manager.cpp
@@ -7005,6 +7283,24 @@ msgstr "Esteu segur que voleu obrir més d'un projecte de cop?"
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7340,10 +7636,6 @@ msgstr "Configuració del Projecte (project.godot)"
msgid "General"
msgstr "General"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr "Propietat:"
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr "Substitutiu per a..."
@@ -7477,10 +7769,6 @@ msgstr "Escull un Node"
msgid "Bit %d, val %d."
msgstr "Bit %d, valor %d."
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr "Propietats:"
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr "Selecciona una Propietat"
@@ -7571,7 +7859,7 @@ msgid "Step"
msgstr "Pas:"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7580,7 +7868,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7625,7 +7913,7 @@ msgstr "Majúscules"
msgid "Reset"
msgstr "Reinicia el Zoom"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr "Error"
@@ -7686,6 +7974,10 @@ msgid "Instance Scene(s)"
msgstr "Instància les Escenes"
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "Instancia una Escena Filla"
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr "Esborra l'Script"
@@ -7722,6 +8014,12 @@ msgid "Save New Scene As..."
msgstr "Anomena i Desa la Nova Escena..."
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr "Fills Editables"
@@ -7800,6 +8098,11 @@ msgid "Clear Inheritance"
msgstr "Elimina l'Herència"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Open documentation"
+msgstr "Obre la Documentació en línia"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr "Elimina els Nodes"
@@ -7808,15 +8111,16 @@ msgid "Add Child Node"
msgstr "Afegeix un Node Fill"
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
-msgstr "Instancia una Escena Filla"
-
-#: editor/scene_tree_dock.cpp
msgid "Change Type"
msgstr "Modifica el Tipus"
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Extend Script"
+msgstr "Obre un Script"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Make Scene Root"
msgstr "Entesos!"
@@ -7981,6 +8285,11 @@ msgid "Path is empty"
msgstr "El camí és Buit"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Filename is empty"
+msgstr "El camí per desar és buit!"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr "El Camí no és local"
@@ -8069,20 +8378,9 @@ msgid "Bytes:"
msgstr "Bytes:"
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr "Avís"
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr "Error:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr "Origen:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
-msgstr "Funció:"
+#, fuzzy
+msgid "Stack Trace"
+msgstr "Fotogrames de la Pila"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8113,18 +8411,6 @@ msgid "Stack Frames"
msgstr "Fotogrames de la Pila"
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr "Variable"
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr "Errors:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr "Traça de la Pila (si s'escau):"
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr "Perfilador"
@@ -8328,7 +8614,8 @@ msgid "GDNative"
msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+#, fuzzy
+msgid "Step argument is zero!"
msgstr "L'argument 'step' és zero!"
#: modules/gdscript/gdscript_functions.cpp
@@ -8554,12 +8841,8 @@ msgid "End of inner exception stack trace"
msgstr "Final de la traça de la pila d'excepció interna"
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr "Calcula!"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
-msgstr "Precalcula la malla de navegació."
+msgid "Bake NavMesh"
+msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8842,6 +9125,10 @@ msgid "Base Type:"
msgstr "Tipus Base:"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "Membres:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "Nodes disponibles:"
@@ -8945,11 +9232,11 @@ msgid "Search VisualScript"
msgstr "Elimina el Node de VisualScript"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
-msgstr "Obtenir"
+msgid "Get %s"
+msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -9045,6 +9332,12 @@ msgstr ""
"S'ha de proporcionar una forma perquè *CollisionShape2D pugui funcionar. "
"Creeu-li un recurs de forma (shape)!"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -9096,6 +9389,12 @@ msgstr ""
"En Mancar un material per processar les partícules, no s'ha imprès cap "
"Comportament."
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -9234,6 +9533,17 @@ msgstr ""
"Cal proveir una forma perquè CollisionShape funcioni. Creeu-li un recurs de "
"forma!"
+#: scene/3d/cpu_particles.cpp
+#, fuzzy
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr "Res és visible perquè no s'ha assignat cap Malla a cap pas de Dibuix."
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr "S'estàn traçant les Malles"
@@ -9257,6 +9567,30 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr "Res és visible perquè no s'ha assignat cap Malla a cap pas de Dibuix."
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+"PathFollow2D només funciona si s'estableix com a fill d'un node Path2D."
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+"PathFollow2D només funciona si s'estableix com a fill d'un node Path2D."
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9297,7 +9631,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
#, fuzzy
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9364,6 +9698,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr "L'arbre d'animació no és vàlid."
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr "Mode Cru"
@@ -9380,10 +9718,6 @@ msgstr "Ep!"
msgid "Please Confirm..."
msgstr "Confirmeu..."
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr "Selecciona aquest Directori"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9394,6 +9728,10 @@ msgstr ""
"qualsevol de les funcions popup*(). És possible fer-les visibles mentre "
"s'edita, però s'ocultaran durant l'execució."
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9449,11 +9787,6 @@ msgstr "La mida de la lletra no és vàlida."
msgid "Input"
msgstr "Afegeix una Entrada"
-#: scene/resources/visual_shader.cpp
-#, fuzzy
-msgid "None"
-msgstr "<Cap>"
-
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
@@ -9471,6 +9804,211 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Split already exists."
+#~ msgstr "L'Acció '%s' ja existeix!"
+
+#, fuzzy
+#~ msgid "Add Split"
+#~ msgstr "Afegeix un punt"
+
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr "Camí no vàlid"
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "Elimina el punt"
+
+#, fuzzy
+#~ msgid "Poly"
+#~ msgstr "Edita Polígon"
+
+#, fuzzy
+#~ msgid "Splits"
+#~ msgstr "Parteix el Camí"
+
+#, fuzzy
+#~ msgid "Select a split to erase it."
+#~ msgstr "Cal seleccionar un Element!"
+
+#~ msgid "No name provided"
+#~ msgstr "Manca Nom"
+
+#, fuzzy
+#~ msgid "Add Node.."
+#~ msgstr "Afegeix un Node"
+
+#~ msgid "Create from scene?"
+#~ msgstr "Crear-ho a partir de l'escena?"
+
+#~ msgid "Create Poly"
+#~ msgstr "Crea Polígon"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "Crea un Polígon nou del no-res"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "Allunya"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "Apropa"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "Crea un Poly3D"
+
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "No s'ha trobat cap recurs de tipus OccluderPolygon2D en aquest node.\n"
+#~ "Vol Crear i assignar-ne un ara?"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "Clic Esquerra: Mou un Punt."
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "Ctrl + Clic Esquerra: Divideix el Segment."
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "Clic Dret: Eliminar un Punt."
+
+#, fuzzy
+#~ msgid "New TextFile"
+#~ msgstr "Visualitza Fitxers"
+
+#~ msgid "Save Theme As"
+#~ msgstr "Anomena i Desa el Tema"
+
+#~ msgid "<None>"
+#~ msgstr "<Cap>"
+
+#~ msgid ""
+#~ "Select sub-tile to use as icon, this will be also used on invalid "
+#~ "autotile bindings."
+#~ msgstr ""
+#~ "Selecciona una sub-tessel·la com a icona. També s'utilitzarà per les "
+#~ "assignacions automàtiques no-vàlides de l'autotile."
+
+#~ msgid "Zoom:"
+#~ msgstr "Zoom:"
+
+#~ msgid "Are you sure you want to remove all connections from the \""
+#~ msgstr "Esteu segur que voleu eliminar totes les connexions de \""
+
+#~ msgid "Class List:"
+#~ msgstr "Llista de Classes:"
+
+#~ msgid "Search Classes"
+#~ msgstr "Cerca Classes"
+
+#~ msgid "Public Methods"
+#~ msgstr "Mètodes Públics"
+
+#~ msgid "Public Methods:"
+#~ msgstr "Mètodes públics:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "Elements del Tema de la GUI"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "Elements del Tema de la Interfície :"
+
+#~ msgid "Property: "
+#~ msgstr "Propietat: "
+
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "Modifica l'estat del directori com a Favorit."
+
+#~ msgid "Show current scene file."
+#~ msgstr "Mostra el fitxer de l'escena actual."
+
+#~ msgid "Enter tree-view."
+#~ msgstr "Entra a la vista d'arbre."
+
+#~ msgid "Whole words"
+#~ msgstr "Paraules senceres"
+
+#~ msgid "Match case"
+#~ msgstr "Distingeix majúscules/minúscules"
+
+#~ msgid "Filter: "
+#~ msgstr "Filtre: "
+
+#~ msgid "Ok"
+#~ msgstr "D'acord"
+
+#~ msgid "Show In File System"
+#~ msgstr "Mostra'l en el Sistema de Fitxers"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "Cerca dins la jerarquia de classes."
+
+#, fuzzy
+#~ msgid "Search in files"
+#~ msgstr "Cerca Classes"
+
+#~ msgid ""
+#~ "Built-in scripts can only be edited when the scene they belong to is "
+#~ "loaded"
+#~ msgstr ""
+#~ "Només es poden editar els Scripts Integrats amb la seva escena associada "
+#~ "carregada"
+
+#~ msgid "Convert To Uppercase"
+#~ msgstr "Converteix en majúscules"
+
+#~ msgid "Convert To Lowercase"
+#~ msgstr "Converteix en minúscules"
+
+#, fuzzy
+#~ msgid "Snap To Floor"
+#~ msgstr "Alinea-ho amb la graella"
+
+#~ msgid "Rotate 0 degrees"
+#~ msgstr "Gira-ho 0 graus"
+
+#~ msgid "Rotate 90 degrees"
+#~ msgstr "Gira-ho 90 graus"
+
+#~ msgid "Rotate 180 degrees"
+#~ msgstr "Gira-ho 180 graus"
+
+#~ msgid "Rotate 270 degrees"
+#~ msgstr "Gira-ho 270 graus"
+
+#~ msgid "Warning"
+#~ msgstr "Avís"
+
+#~ msgid "Error:"
+#~ msgstr "Error:"
+
+#~ msgid "Source:"
+#~ msgstr "Origen:"
+
+#~ msgid "Function:"
+#~ msgstr "Funció:"
+
+#~ msgid "Variable"
+#~ msgstr "Variable"
+
+#~ msgid "Errors:"
+#~ msgstr "Errors:"
+
+#~ msgid "Stack Trace (if applicable):"
+#~ msgstr "Traça de la Pila (si s'escau):"
+
+#~ msgid "Bake!"
+#~ msgstr "Calcula!"
+
+#~ msgid "Bake the navigation mesh."
+#~ msgstr "Precalcula la malla de navegació."
+
+#~ msgid "Get"
+#~ msgstr "Obtenir"
+
#~ msgid "Change Scalar Constant"
#~ msgstr "Modificar una constant escalar"
@@ -9669,9 +10207,6 @@ msgstr ""
#~ msgid "Run Script"
#~ msgstr "Executa Script"
-#~ msgid "Save the currently edited resource."
-#~ msgstr "Desa el recurs editat ara."
-
#~ msgid "Stop Profiling"
#~ msgstr "Atura Perfilació"
@@ -9785,9 +10320,6 @@ msgstr ""
#~ msgid "Sequence"
#~ msgstr "Seqüència"
-#~ msgid "Switch"
-#~ msgstr "commutador"
-
#~ msgid "Iterator"
#~ msgstr "Iterador"
@@ -9952,9 +10484,6 @@ msgstr ""
#~ msgid "Could not save atlas subtexture:"
#~ msgstr "No s'ha pogut desar la subtextura de l'atles:"
-#~ msgid "Exporting for %s"
-#~ msgstr "Exportació per a %s"
-
#~ msgid "Setting Up..."
#~ msgstr "Instal·lant..."
@@ -10056,9 +10585,6 @@ msgstr ""
#~ msgid "Source Font:"
#~ msgstr "Lletra:"
-#~ msgid "Source Font Size:"
-#~ msgstr "Mida de la lletra:"
-
#~ msgid "Dest Resource:"
#~ msgstr "Recurs Objectiu:"
@@ -10138,9 +10664,6 @@ msgstr ""
#~ msgid "Start(s)"
#~ msgstr "Inici/s"
-#~ msgid "Filters"
-#~ msgstr "Filtres"
-
#~ msgid "Source path is empty."
#~ msgstr "El camí d'origen és buit."
@@ -10251,9 +10774,6 @@ msgstr ""
#~ msgid "just pressed"
#~ msgstr "premut"
-#~ msgid "just released"
-#~ msgstr "alliberat"
-
#, fuzzy
#~ msgid ""
#~ "Couldn't read the certificate file. Are the path and password both "
diff --git a/editor/translations/cs.po b/editor/translations/cs.po
index 0da8ebee3c..a83e18644d 100644
--- a/editor/translations/cs.po
+++ b/editor/translations/cs.po
@@ -1,28 +1,29 @@
# Czech translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
-#
# Fadex <vitekpaulik@gmail.com>, 2017.
-# Jan 'spl!te' Kondelík <j.kondelik@centrum.cz>, 2016.
+# Jan 'spl!te' Kondelík <j.kondelik@centrum.cz>, 2016, 2018.
# Jiri Hysek <contact@jirihysek.com>, 2017.
# Josef KuchaÅ™ <josef.kuchar267@gmail.com>, 2018.
# Luděk Novotný <gladosicek@gmail.com>, 2016, 2018.
# Martin Novák <maidx@seznam.cz>, 2017.
# zxey <r.hozak@seznam.cz>, 2018.
-#
+# Vojtěch Šamla <auzkok@seznam.cz>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-05-21 12:36+0000\n"
-"Last-Translator: Josef KuchaÅ™ <josef.kuchar267@gmail.com>\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:38+0100\n"
+"Last-Translator: Vojtěch Šamla <auzkok@seznam.cz>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/godot-engine/godot/"
"cs/>\n"
"Language: cs\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-"X-Generator: Weblate 3.0-dev\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -31,10 +32,10 @@ msgstr ""
"Neplatný typ argumentu funkce convert(), použijte některou z konstant TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr "Nedostatek bajtů pro dekódování bajtů, nebo špatný formát."
+msgstr "Nedostatek bytů pro dekódování bytů, nebo špatný formát."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
@@ -45,27 +46,24 @@ msgid "self can't be used because instance is null (not passed)"
msgstr ""
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "Neplatné jméno vlastnosti '%s' v uzlu %s."
+msgstr "Neplatné operandy pro operátor %s, %s a %s."
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid index of type %s for base type %s"
-msgstr "Neplatné jméno vlastnosti '%s' v uzlu %s."
+msgstr "Neplatný index typu %s pro základní typ %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
msgstr ""
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid arguments to construct '%s'"
-msgstr ": Neplatný argument typu: "
+msgstr "Neplatné argumenty pro konstrukci '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "Při volání '%s':"
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -83,9 +81,8 @@ msgid "Mirror"
msgstr "Zrcadlit X"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "Vložit klíÄ"
+msgstr "Vložit klÃ­Ä zde"
#: editor/animation_bezier_editor.cpp
#, fuzzy
@@ -126,46 +123,40 @@ msgid "Anim Change Call"
msgstr "Animace: změna volání"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Property Track"
-msgstr "Vlastnost:"
+msgstr "Stopa vlastnosti"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "3D Transform Track"
-msgstr "Transformovat UV mapu"
+msgstr "Stopa 3D transformace"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "Stopa volání metody"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "Stopa Bézierovy křivky"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "Stopa přehrávání zvuku"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Playback Track"
-msgstr "Zastavit přehrávání animace. (S)"
+msgstr "Stopa přehrávání animace"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
-msgstr "Animace: přidat stopu"
+msgstr "Přidat stopu"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Length Time (seconds)"
-msgstr "Délka animace (v sekundách)."
+msgstr "Délka animace (v sekundách)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "Přiblížení animace."
+msgstr "Opakování animace"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -174,39 +165,35 @@ msgstr "Funkce:"
#: editor/animation_track_editor.cpp
msgid "Audio Clips:"
-msgstr ""
+msgstr "Audio klipy:"
#: editor/animation_track_editor.cpp
msgid "Anim Clips:"
-msgstr ""
+msgstr "AnimaÄní klipy:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Toggle this track on/off."
-msgstr "Zapnout nerozptylující režim."
+msgstr "Aktivovat/Deaktivovat tuto stopu."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Interpolation Mode"
-msgstr "Nerozptylující režim"
+msgstr "InterpolaÄní režim"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "Odstranit vybranou stopu."
+msgstr "Odstranit tuto stopu."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "ÄŒas:"
+msgstr "ÄŒas (s): "
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -221,13 +208,12 @@ msgid "Trigger"
msgstr "Spoušť"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Capture"
-msgstr "Budoucí"
+msgstr "Zachytit"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "Nejbližší"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
@@ -236,7 +222,7 @@ msgstr "Lineární"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr ""
+msgstr "Kubická"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
@@ -252,14 +238,12 @@ msgid "Insert Key"
msgstr "Vložit klíÄ"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "Duplikovat uzel/uzly"
+msgstr "Duplikovat klíÄ(e)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "Odstranit uzel/uzly"
+msgstr "Odstranit klíÄ(e)"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -277,7 +261,6 @@ msgstr "VytvoÅ™it %d NOVÃCH stop a vložit klíÄe?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -289,7 +272,7 @@ msgstr "Animace: vložit"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
-msgstr ""
+msgstr "AnimationPlayer nemůže animovat sám sebe, pouze ostatní."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
@@ -314,10 +297,14 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"Audio stopa může odkazovat pouze na uzly typu:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "Stopa animae může odkazovat pouze na uzly AnimationPlayer."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
@@ -325,7 +312,7 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "Není možné přidat novou stopu bez kořenového uzlu"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
@@ -333,25 +320,23 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "Stopa není typu Spatial, nelze vložit klíÄ"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Method not found in object: "
-msgstr "Proměnná pro získání nebyla ve skriptu nalezena: "
+msgstr "Tato metoda nebyla v objektu nalezena: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
msgstr "Animace: pÅ™esunout klíÄe"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clipboard is empty"
-msgstr "Schránka je prázdná!"
+msgstr "Schránka je prázdná"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
@@ -364,21 +349,19 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "Zobrazit pouze stopy vybraných uzlů."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr ""
+msgstr "Seskupit stopy podle uzlu nebo je zobrazit jako jednoduchý seznam."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap (s): "
-msgstr "Krok (s):"
+msgstr "Přichycení (s): "
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "Strom animace je platný."
+msgstr "Hodnota animaÄního kroku."
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -390,19 +373,16 @@ msgid "Edit"
msgstr "Upravit"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "Strom animací"
+msgstr "Vlastnosti animace."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "Kopírovat parametry"
+msgstr "Kopírovat stopy"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "Vložit parametry"
+msgstr "Vložit stopy"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -412,8 +392,7 @@ msgstr "Změnit měřítko výběru"
msgid "Scale From Cursor"
msgstr "Změnit měřítko od kurzoru"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Duplikovat výběr"
@@ -422,16 +401,17 @@ msgid "Duplicate Transposed"
msgstr "Duplikovat transponované"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
-msgstr "Smazat vybraný"
+msgstr "Smazat vyběr"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+#, fuzzy
+msgid "Go to Next Step"
msgstr "Jít k dalšímu kroku"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+#, fuzzy
+msgid "Go to Previous Step"
msgstr "Jít k předchozímu kroku"
#: editor/animation_track_editor.cpp
@@ -444,11 +424,11 @@ msgstr "ProÄistit animaci"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "Zvolit uzel k animaci:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "Použít Bézierovy křivky"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
@@ -496,7 +476,7 @@ msgstr "Poměr zvětšení:"
#: editor/animation_track_editor.cpp
msgid "Select tracks to copy:"
-msgstr ""
+msgstr "Zvolte stopy ke zkopírování:"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -520,7 +500,7 @@ msgstr "Změnit hodnotu pole"
#: editor/code_editor.cpp
msgid "Go to Line"
-msgstr "Běž na řádek"
+msgstr "Jít na řádek"
#: editor/code_editor.cpp
msgid "Line Number:"
@@ -534,11 +514,11 @@ msgstr "Žádné shody"
msgid "Replaced %d occurrence(s)."
msgstr "Nahrazeno %d výskytů."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Rozlišovat malá/velká"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "Celá slova"
@@ -554,29 +534,32 @@ msgstr "Nahradit všechny"
msgid "Selection Only"
msgstr "Pouze výběr"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Přiblížit"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "Oddálit"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "Obnovit původní přiblížení"
#: editor/code_editor.cpp
-#, fuzzy
msgid "Warnings:"
-msgstr "Varování"
+msgstr "Varování:"
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "Přiblížit"
+msgid "Font Size:"
+msgstr "Pohled zepředu"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Řádek:"
@@ -609,6 +592,7 @@ msgstr "Přidat"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -665,9 +649,8 @@ msgid "Disconnect '%s' from '%s'"
msgstr "Odpojit '%s' od '%s'"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect all from signal: '%s'"
-msgstr "Odpojit '%s' od '%s'"
+msgstr "Odpojit vše od signálu: '%s'"
#: editor/connections_dialog.cpp
msgid "Connect..."
@@ -684,14 +667,13 @@ msgid "Connect Signal: "
msgstr "Připojuji signál:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection: "
-msgstr "Chyba připojení"
+msgstr "Upravit připojení: "
#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "Are you sure you want to remove all connections from the \""
-msgstr "Jste si jisti, že chcete spustit více než jeden projekt?"
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr ""
+"Jste si jisti, že chcete odstranit všechna připojení ze signálu \"%s\"?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -699,22 +681,19 @@ msgstr "Signály"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr ""
+msgstr "Jste si jistí, že chcete odstranit všechna připojení z tohoto signálu?"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "Odpojit"
+msgstr "Odpojit vše"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit..."
-msgstr "Upravit"
+msgstr "Upravit..."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "Metody"
+msgstr "Přejít na metodu"
#: editor/create_dialog.cpp
msgid "Change %s Type"
@@ -739,23 +718,20 @@ msgid "Recent:"
msgstr "Nedávné:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Hledat:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "Shody:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "Popis:"
@@ -794,8 +770,7 @@ msgid "Resource"
msgstr "Zdroj"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "Cesta"
@@ -816,9 +791,10 @@ msgid "Search Replacement Resource:"
msgstr "Hledat náhradní zdroj:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -850,7 +826,8 @@ msgid "Error loading:"
msgstr "Chyba pÅ™i naÄítání:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+#, fuzzy
+msgid "Load failed due to missing dependencies:"
msgstr "Scénu se nepodaÅ™ilo naÄíst kvůli chybÄ›jícím závislostem:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -909,14 +886,6 @@ msgstr "Změnit hodnotu slovníku"
msgid "Thanks from the Godot community!"
msgstr "Děkujeme za komunitu Godotu!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "OK"
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Přispívající do Godot Enginu"
@@ -1010,7 +979,8 @@ msgid "Uncompressing Assets"
msgstr "Dekomprese uživatelského obsahu"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+#, fuzzy
+msgid "Package installed successfully!"
msgstr "BalíÄek byl úspěšnÄ› nainstalován!"
#: editor/editor_asset_installer.cpp
@@ -1092,8 +1062,7 @@ msgid "Bus options"
msgstr "Možnosti Busu"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "Duplikovat"
@@ -1223,11 +1192,11 @@ msgstr ""
#: editor/editor_autoload_settings.cpp
msgid "Move Autoload"
-msgstr ""
+msgstr "Přemístit Autoload"
#: editor/editor_autoload_settings.cpp
msgid "Remove Autoload"
-msgstr ""
+msgstr "Odstranit Autoload"
#: editor/editor_autoload_settings.cpp
msgid "Enable"
@@ -1235,7 +1204,7 @@ msgstr "Povolit"
#: editor/editor_autoload_settings.cpp
msgid "Rearrange Autoloads"
-msgstr ""
+msgstr "Přeskupit Autoloady"
#: editor/editor_autoload_settings.cpp
msgid "Invalid Path."
@@ -1254,7 +1223,7 @@ msgid "Add AutoLoad"
msgstr "Přidat AutoLoad"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "Cesta:"
@@ -1262,8 +1231,8 @@ msgstr "Cesta:"
msgid "Node Name:"
msgstr "Název uzlu:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "Název"
@@ -1333,26 +1302,29 @@ msgid "Template file not found:"
msgstr "Soubor šablony nenalezen:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Vybrat stávající složku"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "Soubor už existuje. Přepsat?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "Vybrat stávající složku"
+msgid "Select This Folder"
+msgstr "Vybrat tuto složku"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
msgstr "Kopírovat cestu"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Open In File Manager"
-msgstr "Ukázat ve správci souborů"
+msgid "Open in File Manager"
+msgstr "Otevřít ve správci souborů"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
-msgstr "Ukázat ve správci souborů"
+msgid "Show in File Manager"
+msgstr "Zobrazit ve správci souborů"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
@@ -1387,7 +1359,8 @@ msgid "Open a File or Directory"
msgstr "Otevřít soubor nebo složku"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Uložit"
@@ -1445,8 +1418,7 @@ msgstr "Složky a soubory:"
msgid "Preview:"
msgstr "Náhled:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "Soubor:"
@@ -1462,24 +1434,11 @@ msgstr ""
msgid "(Re)Importing Assets"
msgstr "(Re)Importování assetů"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "Prohledat nápovědu"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "Seznam tříd:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "Hledat třídy"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr ""
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "Třída:"
@@ -1496,28 +1455,28 @@ msgid "Brief Description:"
msgstr "StruÄný popis:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "Členové"
+msgid "Properties"
+msgstr "Vlastnosti"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "Členové:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr "Vlastnosti:"
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "Veřejné metody"
+msgid "Methods"
+msgstr "Metody"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "Veřejné metody:"
+msgid "Methods:"
+msgstr "Metody:"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr ""
+msgid "Theme Properties"
+msgstr "Vlastnosti motivu"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr ""
+msgid "Theme Properties:"
+msgstr "Vlastnosti motivu:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1544,8 +1503,12 @@ msgid "Constants:"
msgstr "Konstanty:"
#: editor/editor_help.cpp
-msgid "Description"
-msgstr "Popis"
+msgid "Class Description"
+msgstr "Popis třídy"
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
+msgstr "Popis třídy:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1562,11 +1525,11 @@ msgstr ""
"$url2]zažádat[/url][/color]."
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "Vlastnosti"
+msgid "Property Descriptions"
+msgstr "Popis vlastnosti"
#: editor/editor_help.cpp
-msgid "Property Description:"
+msgid "Property Descriptions:"
msgstr "Popis vlastnosti:"
#: editor/editor_help.cpp
@@ -1578,11 +1541,11 @@ msgstr ""
"nám tím, že ho[color=$color][url=$url]vytvoříte[/url][/color]!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "Metody"
+msgid "Method Descriptions"
+msgstr "Popis metody"
#: editor/editor_help.cpp
-msgid "Method Description:"
+msgid "Method Descriptions:"
msgstr "Popis metody:"
#: editor/editor_help.cpp
@@ -1593,12 +1556,53 @@ msgstr ""
"V souÄasné dobÄ› neexistuje žádný popis pro tuto metodu. Prosím pomozte nám "
"tím, že ho [color=$color][url=$url]vytvoříte[/url][/color]!"
-#: editor/editor_inspector.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Prohledat nápovědu"
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr "Zobrazit všechny"
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr "Pouze třídy"
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr "Pouze metody"
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr "Pouze signály"
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr "Pouze konstanty"
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr "Pouze vlastnosti"
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr "Pouze vlastnosti motivu"
+
+#: editor/editor_help_search.cpp
#, fuzzy
-msgid "Property: "
+msgid "Member Type"
+msgstr "Členové"
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr "Třída"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
msgstr "Vlastnost:"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr "Nastavit"
@@ -1626,15 +1630,20 @@ msgstr "Vymazat výstup"
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
-msgstr ""
+msgstr "Export projektu selhal s chybovým kódem %d."
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Error saving resource!"
-msgstr ""
+msgstr "Chyba při ukládání zdrojů!"
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "OK"
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
-msgstr ""
+msgstr "Uložit zdroj jako..."
#: editor/editor_node.cpp
msgid "Can't open file for writing:"
@@ -1650,7 +1659,7 @@ msgstr "Chyba při ukládání."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
-msgstr ""
+msgstr "Nelze otevřít '%s'. Soubor mohl být přesunut nebo smazán."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
@@ -1682,6 +1691,12 @@ msgstr "Vytvářím náhled"
#: editor/editor_node.cpp
msgid "This operation can't be done without a tree root."
+msgstr "Tato operace nemůže být provedena bez kořenového uzlu."
+
+#: editor/editor_node.cpp
+msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
msgstr ""
#: editor/editor_node.cpp
@@ -1692,13 +1707,17 @@ msgstr ""
"Nepodařilo se uložit scénu. Nejspíše se nepodařilo uspokojit závislosti "
"(instance nebo dÄ›diÄnosti)."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr "Nelze přepsat scénu, která je stále otevřená!"
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr ""
#: editor/editor_node.cpp
msgid "Error saving MeshLibrary!"
-msgstr ""
+msgstr "Chyba při ukládání MeshLibrary!"
#: editor/editor_node.cpp
msgid "Can't load TileSet for merging!"
@@ -1706,11 +1725,11 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Error saving TileSet!"
-msgstr ""
+msgstr "Chyba při ukládání TileSet!"
#: editor/editor_node.cpp
msgid "Error trying to save layout!"
-msgstr ""
+msgstr "Chyba při pokusu uložit rozložení!"
#: editor/editor_node.cpp
msgid "Default editor layout overridden."
@@ -1718,7 +1737,7 @@ msgstr "Výchozí rozložení editoru přepsáno."
#: editor/editor_node.cpp
msgid "Layout name not found!"
-msgstr ""
+msgstr "Jméno rozložení nenalezeno!"
#: editor/editor_node.cpp
msgid "Restored default layout to base settings."
@@ -1730,18 +1749,25 @@ msgid ""
"Please read the documentation relevant to importing scenes to better "
"understand this workflow."
msgstr ""
+"Tento zdroj patří scéně, která byla importována, takže ho nelze upravit.\n"
+"PÅ™eÄtÄ›te si, prosím, dokumentaci týkající se importování scén, abyste lépe "
+"pochopili tento proces."
#: editor/editor_node.cpp
msgid ""
"This resource belongs to a scene that was instanced or inherited.\n"
"Changes to it will not be kept when saving the current scene."
msgstr ""
+"Tento zdroj patří scéně, která byla instancovaná nebo poděděná.\n"
+"Jeho změny nebudou zachovány při uložení aktuální scény."
#: editor/editor_node.cpp
msgid ""
"This resource was imported, so it's not editable. Change its settings in the "
"import panel and then re-import."
msgstr ""
+"Tento zdroj byl importován, takže jej nelze měnit. Změňte jeho nastavení v "
+"panelu Import a znovu ho importujte."
#: editor/editor_node.cpp
msgid ""
@@ -1750,6 +1776,10 @@ msgid ""
"Please read the documentation relevant to importing scenes to better "
"understand this workflow."
msgstr ""
+"Tato scéna byla importována, takže její změny nebudou zachovány.\n"
+"Instancování nebo zdědění umožní provádět její změny.\n"
+"PÅ™eÄtÄ›te si, prosím, dokumentaci týkající se importování scén, abyste lépe "
+"pochopili tento proces."
#: editor/editor_node.cpp
msgid ""
@@ -1757,6 +1787,9 @@ msgid ""
"Please read the documentation relevant to debugging to better understand "
"this workflow."
msgstr ""
+"Toto je vzdálený objekt, takže jeho změny nebudou zachovány.\n"
+"PÅ™eÄtÄ›te si, prosím, dokumentaci týkající se debugování, abyste lépe "
+"pochopili tento proces."
#: editor/editor_node.cpp
msgid "There is no defined scene to run."
@@ -1841,7 +1874,7 @@ msgstr "Exportovat Mesh Library"
#: editor/editor_node.cpp
msgid "This operation can't be done without a root node."
-msgstr ""
+msgstr "Tato operace nemůže být provedena bez kořenového uzlu."
#: editor/editor_node.cpp
msgid "Export Tile Set"
@@ -1849,7 +1882,7 @@ msgstr "Exportovat Tile Set"
#: editor/editor_node.cpp
msgid "This operation can't be done without a selected node."
-msgstr ""
+msgstr "Tato operace nemůže být provedena bez vybraného uzlu."
#: editor/editor_node.cpp
msgid "Current scene not saved. Open anyway?"
@@ -1923,6 +1956,14 @@ msgstr "Nelze naÄíst skript rozšíření z cesty: '%s'."
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"Nelze naÄíst skript rozšíření z cesty: '%s'. Zdá se, že se v kódu nachází "
+"chyba. Prosím, zkontrolujte syntax."
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
"NepodaÅ™ilo se naÄíst addon skript z cesty: '%s'. Základní typ není "
@@ -1939,13 +1980,15 @@ msgid ""
"Scene '%s' was automatically imported, so it can't be modified.\n"
"To make changes to it, a new inherited scene can be created."
msgstr ""
+"Scéna '%s' byla automaticky importována, takže nemůže být modifikována.\n"
+"Abyste ji mohli změnit, je možné vytvořit novou zděděnou scénu."
#: editor/editor_node.cpp
msgid ""
"Error loading scene, it must be inside the project path. Use 'Import' to "
"open the scene, then save it inside the project path."
msgstr ""
-"Chyba při nahrávání scény, musí být v cestě projektu. POužijte 'Importovat' "
+"Chyba při nahrávání scény, musí být v cestě projektu. Použijte 'Importovat' "
"k otevření scény, pak ji uložte uvnitř projektu."
#: editor/editor_node.cpp
@@ -1969,15 +2012,18 @@ msgstr "Odstranit rozložení"
msgid "Default"
msgstr "Výchozí"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr "Zobrazit v souborovém systému"
+
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play This Scene"
-msgstr "Spustit scénu"
+msgstr "Spustit tuto scénu"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "Zavřít ostatní záložky"
+msgstr "Zavřít záložku"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2052,7 +2098,7 @@ msgid "Save Scene"
msgstr "Uložit scénu"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+msgid "Save All Scenes"
msgstr "Uložit všechny scény"
#: editor/editor_node.cpp
@@ -2081,7 +2127,7 @@ msgid "Undo"
msgstr "Zpět"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Znovu"
@@ -2105,20 +2151,20 @@ msgstr "Nastavení projektu"
msgid "Export"
msgstr "Exportovat"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "Nástroje"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "Otevřít Správce projektu?"
+msgstr "Otevřít složku s daty projektu"
#: editor/editor_node.cpp
msgid "Quit to Project List"
msgstr "UkonÄit do seznamu projektů"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "Ladění"
@@ -2136,7 +2182,7 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Small Deploy with Network FS"
-msgstr ""
+msgstr "Minimální nasazení se síťovým FS"
#: editor/editor_node.cpp
msgid ""
@@ -2155,23 +2201,26 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Visible Collision Shapes"
-msgstr ""
+msgstr "Viditelné kolizní tvary"
#: editor/editor_node.cpp
msgid ""
"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
"running game if this option is turned on."
msgstr ""
+"Kolizní tvary a raycast uzly (pro 2D a 3D) budou viditelné během hry, po "
+"aktivaci této volby."
#: editor/editor_node.cpp
msgid "Visible Navigation"
-msgstr ""
+msgstr "Viditelná navigace"
#: editor/editor_node.cpp
msgid ""
"Navigation meshes and polygons will be visible on the running game if this "
"option is turned on."
msgstr ""
+"NavigaÄní meshe a polygony budou viditelné bÄ›hem hry, po aktivaci této volby."
#: editor/editor_node.cpp
msgid "Sync Scene Changes"
@@ -2222,18 +2271,16 @@ msgid "Toggle Fullscreen"
msgstr "Celá obrazovka"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Data/Settings Folder"
-msgstr "Nastavení editoru"
+msgstr "Otevřít složku s daty a nastavením editoru"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "Otevřít složku s daty editoru"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Settings Folder"
-msgstr "Nastavení editoru"
+msgstr "Otevřít složku s nastavením editoru"
#: editor/editor_node.cpp editor/project_export.cpp
msgid "Manage Export Templates"
@@ -2243,10 +2290,6 @@ msgstr "Spravovat exportní šablony"
msgid "Help"
msgstr "Nápověda"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "Třídy"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2317,13 +2360,12 @@ msgstr "Spustit vlastní scénu"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr ""
+msgstr "ZmÄ›na grafického ovladaÄe vyžaduje restart editoru."
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Save & Restart"
-msgstr "Uložit a ukonÄit"
+msgstr "Uložit a restartovat"
#: editor/editor_node.cpp
msgid "Spins when the editor window repaints!"
@@ -2341,24 +2383,24 @@ msgstr "Akualizovat změny"
msgid "Disable Update Spinner"
msgstr "Vypnout aktualizaÄní koleÄko"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "Inspektor"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "Importovat"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "Souborový systém"
#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr "Inspektor"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Uzel"
+
+#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
msgstr ""
@@ -2420,7 +2462,7 @@ msgstr "Otevřít editor skriptů"
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "Open Asset Library"
-msgstr ""
+msgstr "Otevřít knihovnu assetů"
#: editor/editor_node.cpp
msgid "Open the next Editor"
@@ -2439,9 +2481,8 @@ msgid "Thumbnail..."
msgstr "Náhled..."
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit Plugin"
-msgstr "Pluginy"
+msgstr "Upravit plugin"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
@@ -2465,15 +2506,13 @@ msgid "Status:"
msgstr "Stav:"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit:"
-msgstr "Upravit"
+msgstr "Upravit:"
#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Start"
-msgstr "Start!"
+msgstr "Start"
#: editor/editor_profiler.cpp
msgid "Measure:"
@@ -2495,7 +2534,7 @@ msgstr "Snímek %"
msgid "Physics Frame %"
msgstr "Fyzikální snímek %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "ÄŒas:"
@@ -2519,33 +2558,59 @@ msgstr "ÄŒas"
msgid "Calls"
msgstr "Volání"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
#: editor/editor_properties.cpp
msgid "Layer"
-msgstr ""
+msgstr "Vrstva"
#: editor/editor_properties.cpp
msgid "Bit %d, value %d"
-msgstr ""
+msgstr "Bit %d, hodnota %d"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr "[Prázdné]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
#, fuzzy
-msgid "Assign.."
-msgstr "Přiřadit"
+msgid "Assign..."
+msgstr "Přiřadit.."
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "Neplatná cesta"
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+"Nelze vytvořit ViewportTexture na zdroji uloženém jako soubor.\n"
+"Zdroj musí patřit scéně."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
-msgstr ""
+msgstr "Vyberte Viewport"
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr "Nový skript"
@@ -2557,10 +2622,6 @@ msgstr "Nový %s"
msgid "Make Unique"
msgstr "Vytvořit unikátní"
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr "Zobrazit v souborovém systému"
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2569,7 +2630,8 @@ msgstr "Zobrazit v souborovém systému"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "Vložit"
@@ -2582,35 +2644,32 @@ msgstr "Konvertovat na %s"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Open Editor"
-msgstr "Otevřít v editoru"
+msgstr "Otevřít editor"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Selected node is not a Viewport!"
-msgstr ""
+msgstr "Vybraný uzel není Viewport!"
#: editor/editor_properties_array_dict.cpp
msgid "Size: "
-msgstr ""
+msgstr "Velikost: "
#: editor/editor_properties_array_dict.cpp
msgid "Page: "
-msgstr ""
+msgstr "Strana: "
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Key:"
-msgstr "Nové jméno:"
+msgstr "Nový klíÄ:"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Value:"
-msgstr "Nové jméno:"
+msgstr "Nová hodnota:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
-msgstr ""
+msgstr "Vložte pár klíÄ/hodnota"
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -2634,7 +2693,6 @@ msgid "Write your logic in the _run() method."
msgstr "Napište svůj kód v _run() metodě."
#: editor/editor_run_script.cpp
-#, fuzzy
msgid "There is an edited scene already."
msgstr "Nějaka scéna už je upravována."
@@ -2648,11 +2706,11 @@ msgstr "NezapomnÄ›li jste na klíÄové slovo 'tool'?"
#: editor/editor_run_script.cpp
msgid "Couldn't run script:"
-msgstr ""
+msgstr "Nelze spustit skript:"
#: editor/editor_run_script.cpp
msgid "Did you forget the '_run' method?"
-msgstr ""
+msgstr "Nezapoměl jste metodu '_run'?"
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
@@ -2664,49 +2722,48 @@ msgstr ""
#: editor/editor_sub_scene.cpp
msgid "Import From Node:"
-msgstr ""
+msgstr "Import z uzlu:"
#: editor/export_template_manager.cpp
msgid "Re-Download"
-msgstr ""
+msgstr "Stáhnout znovu"
#: editor/export_template_manager.cpp
msgid "Uninstall"
-msgstr ""
+msgstr "Odinstalovat"
#: editor/export_template_manager.cpp
msgid "(Installed)"
-msgstr ""
+msgstr "(Instalováno)"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Download"
-msgstr ""
+msgstr "Stáhnout"
#: editor/export_template_manager.cpp
msgid "(Missing)"
-msgstr ""
+msgstr "(Nenalezeno)"
#: editor/export_template_manager.cpp
msgid "(Current)"
-msgstr ""
+msgstr "(Aktuální)"
#: editor/export_template_manager.cpp
msgid "Retrieving mirrors, please wait..."
-msgstr ""
+msgstr "Získávání zrcadel, prosím Äekejte..."
#: editor/export_template_manager.cpp
msgid "Remove template version '%s'?"
-msgstr ""
+msgstr "Odstranit šablonu verze '%s'?"
#: editor/export_template_manager.cpp
msgid "Can't open export templates zip."
msgstr "Nelze otevřít zip soubor exportních šablon."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Invalid version.txt format inside templates: %s."
-msgstr "Neplatný formát version.txt uvnitř šablon."
+msgstr "Neplatný formát version.txt uvnitř šablon: %s."
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
@@ -2722,18 +2779,20 @@ msgstr "Extrakce exportních šablon"
#: editor/export_template_manager.cpp
msgid "Importing:"
-msgstr ""
+msgstr "Importování:"
#: editor/export_template_manager.cpp
msgid ""
"No download links found for this version. Direct download is only available "
"for official releases."
msgstr ""
+"Nebyly nalezeny odkazy pro stažení této verze. Přímé stažení je dostupné "
+"pouze pro oficiální vydání."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Can't resolve."
-msgstr ""
+msgstr "Nelze vyřešit."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -2743,7 +2802,7 @@ msgstr "Nelze se připojit."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "No response."
-msgstr ""
+msgstr "Žádná odpovÄ›Ä."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -2753,22 +2812,23 @@ msgstr "Požadavek se nezdařil."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
-msgstr ""
+msgstr "Zacyklené přesměrování."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Failed:"
-msgstr ""
+msgstr "Selhalo:"
#: editor/export_template_manager.cpp
msgid "Download Complete."
-msgstr ""
+msgstr "Stahování dokonÄeno."
#: editor/export_template_manager.cpp
msgid ""
"Templates installation failed. The problematic templates archives can be "
"found at '%s'."
msgstr ""
+"Instalace šablon selhala. Problémové archivy šablon lze nalézt na '%s'."
#: editor/export_template_manager.cpp
msgid "Error requesting url: "
@@ -2784,11 +2844,11 @@ msgstr "Odpojeno"
#: editor/export_template_manager.cpp
msgid "Resolving"
-msgstr ""
+msgstr "Řeším"
#: editor/export_template_manager.cpp
msgid "Can't Resolve"
-msgstr ""
+msgstr "Nelze vyřešit"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -2818,19 +2878,19 @@ msgstr "Chyba připojení"
#: editor/export_template_manager.cpp
msgid "SSL Handshake Error"
-msgstr ""
+msgstr "Selhání SSL handshaku"
#: editor/export_template_manager.cpp
msgid "Current Version:"
-msgstr ""
+msgstr "Aktuální verze:"
#: editor/export_template_manager.cpp
msgid "Installed Versions:"
-msgstr ""
+msgstr "Instalované verze:"
#: editor/export_template_manager.cpp
msgid "Install From File"
-msgstr ""
+msgstr "Instalovat ze souboru"
#: editor/export_template_manager.cpp
msgid "Remove Template"
@@ -2842,7 +2902,7 @@ msgstr "Vybrat soubor šablony"
#: editor/export_template_manager.cpp
msgid "Export Template Manager"
-msgstr ""
+msgstr "Správce exportních šablon"
#: editor/export_template_manager.cpp
msgid "Download Templates"
@@ -2850,35 +2910,43 @@ msgstr "Stáhnout šablony"
#: editor/export_template_manager.cpp
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr ""
+msgstr "Zvolte zrcadlo ze seznamu: (Shift + Klik: OtevÅ™it v prohlížeÄi)"
#: editor/file_type_cache.cpp
msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr ""
+"Nelze otevřít file_type_cache.cch pro zápis, cache typů souborů není "
+"ukládána!"
+
+#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr "Oblíbené"
#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr ""
+msgstr "Nelze přejít k '%s', protože nebylo nalezeno v souborovém systému!"
#: editor/filesystem_dock.cpp
msgid "View items as a grid of thumbnails."
-msgstr ""
+msgstr "Zobrazit položky jako mřížku náhledů."
#: editor/filesystem_dock.cpp
msgid "View items as a list."
-msgstr ""
+msgstr "Zobrazit položky jako seznam."
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
+"Status: import souboru selhal. Opravte, prosím, soubor a naimportujte ho "
+"znovu ruÄnÄ›."
#: editor/filesystem_dock.cpp
msgid "Cannot move/rename resources root."
-msgstr ""
+msgstr "Nelze přesunout/přejmenovat kořen zdrojů."
#: editor/filesystem_dock.cpp
msgid "Cannot move a folder into itself."
-msgstr ""
+msgstr "Nelze přesunout složku do sebe samé."
#: editor/filesystem_dock.cpp
msgid "Error moving:"
@@ -2890,19 +2958,15 @@ msgstr "Chyba duplikování:"
#: editor/filesystem_dock.cpp
msgid "Unable to update dependencies:"
-msgstr "Nepodařilo se aktualizovat závisloti:"
+msgstr "Nepodařilo se aktualizovat závislosti:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr ""
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "Nebylo poskytnuto žádné jméno."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr ""
+msgstr "Poskytnuté jméno obsahuje neplatné znaky"
#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
@@ -2910,7 +2974,7 @@ msgstr "Jméno obsahuje neplatné znaky."
#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
-msgstr ""
+msgstr "Soubor nebo složka s tímto názvem již existuje."
#: editor/filesystem_dock.cpp
msgid "Renaming file:"
@@ -2918,7 +2982,7 @@ msgstr "Přejmenovávání souboru:"
#: editor/filesystem_dock.cpp
msgid "Renaming folder:"
-msgstr ""
+msgstr "Přejmenování složky:"
#: editor/filesystem_dock.cpp
msgid "Duplicating file:"
@@ -2926,23 +2990,7 @@ msgstr "Duplikace souboru:"
#: editor/filesystem_dock.cpp
msgid "Duplicating folder:"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "Sbalit vše"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "Přejmenovat..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "Přesunout do..."
+msgstr "Duplikace složky:"
#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
@@ -2953,6 +3001,14 @@ msgid "Instance"
msgstr "Instance"
#: editor/filesystem_dock.cpp
+msgid "Add to favorites"
+msgstr "Přidat do oblíbených"
+
+#: editor/filesystem_dock.cpp
+msgid "Remove from favorites"
+msgstr "Odebrat z oblíbených"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "Upravit závislosti..."
@@ -2960,26 +3016,40 @@ msgstr "Upravit závislosti..."
msgid "View Owners..."
msgstr "Zobrazit vlastníky..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "Přejmenovat..."
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "Duplikovat..."
#: editor/filesystem_dock.cpp
-#, fuzzy
+msgid "Move To..."
+msgstr "Přesunout do..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
-msgstr "Nový skript"
+msgstr "Nový skript..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "Zdroj"
+msgstr "Nový zdroj..."
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr "Rozbalit vše"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr "Sbalit vše"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
#: editor/scene_tree_dock.cpp
msgid "Rename"
-msgstr ""
+msgstr "Přejmenovat"
#: editor/filesystem_dock.cpp
msgid "Previous Directory"
@@ -2991,81 +3061,60 @@ msgstr "Následující adresář"
#: editor/filesystem_dock.cpp
msgid "Re-Scan Filesystem"
-msgstr ""
+msgstr "Znovu skenovat souborový systém"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "Zobrazit oblíbené"
+msgid "Toggle split mode"
+msgstr "Přepnout režim"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Show current scene file."
-msgstr "Vytvořit složku"
+msgid "Search files"
+msgstr "Hledat soubory"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "Hledat třídy"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
msgstr ""
+"Skenování souborů,\n"
+"Prosím, Äekejte..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
-msgstr ""
+msgstr "Přesunout"
#: editor/filesystem_dock.cpp
msgid "There is already file or folder with the same name in this location."
-msgstr ""
+msgstr "Soubor nebo složka se stejným názvem již na tomto místě existuje."
#: editor/filesystem_dock.cpp
msgid "Overwrite"
-msgstr ""
+msgstr "Přepsat"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Vytvořit skript"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find in files"
-msgstr "%d více souborů"
+msgid "Find in Files"
+msgstr "Najít v souborech"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find: "
-msgstr "Najít"
+msgid "Find:"
+msgstr "Najít:"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Whole words"
-msgstr "Celá slova"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "Rozlišovat malá/velká"
+msgid "Folder:"
+msgstr "Složka:"
#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Filter: "
-msgstr "Filtr:"
+msgid "Filters:"
+msgstr "Filtry:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3081,34 +3130,33 @@ msgid "Cancel"
msgstr "Zrušit"
#: editor/find_in_files.cpp
-#, fuzzy
+msgid "Find: "
+msgstr "Najít: "
+
+#: editor/find_in_files.cpp
msgid "Replace: "
-msgstr "Nahradit"
+msgstr "Nahradit: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace all (no undo)"
-msgstr "Nahradit všechny"
+msgstr "Nahradit všechny (bez možnosti vrácení)"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Searching..."
-msgstr "Hledat"
+msgstr "Hledám..."
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Search complete"
-msgstr "Prohledat text"
+msgstr "Vyhledávání dokonÄeno"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group name already exists."
-msgstr "Chyba: Jméno animace už existuje!"
+msgstr "Název skupiny již existuje."
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
-msgstr "Neplatný název."
+msgid "Invalid group name."
+msgstr "Neplatný název skupiny."
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
@@ -3116,7 +3164,7 @@ msgstr "Skupiny"
#: editor/groups_editor.cpp
msgid "Nodes not in Group"
-msgstr ""
+msgstr "Uzly nejsou ve skupinÄ›"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
msgid "Filter nodes"
@@ -3124,20 +3172,19 @@ msgstr "Filtrovat uzly"
#: editor/groups_editor.cpp
msgid "Nodes in Group"
-msgstr ""
+msgstr "Uzly jsou ve skupinÄ›"
#: editor/groups_editor.cpp
msgid "Add to Group"
-msgstr ""
+msgstr "Přidat do skupiny"
#: editor/groups_editor.cpp
msgid "Remove from Group"
-msgstr ""
+msgstr "Odebrat ze skupiny"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Manage Groups"
-msgstr "Skupiny"
+msgstr "Spravovat skupiny"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Single Scene"
@@ -3182,11 +3229,11 @@ msgstr ""
#: editor/import/resource_importer_scene.cpp
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Import Scene"
-msgstr ""
+msgstr "Importovat scénu"
#: editor/import/resource_importer_scene.cpp
msgid "Importing Scene..."
-msgstr ""
+msgstr "Importuji scénu..."
#: editor/import/resource_importer_scene.cpp
msgid "Generating Lightmaps"
@@ -3214,7 +3261,7 @@ msgstr ""
#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
-msgstr ""
+msgstr "Ukládání..."
#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
@@ -3242,19 +3289,14 @@ msgstr "Znovu importovat"
#: editor/inspector_dock.cpp
msgid "Failed to load resource."
-msgstr ""
-
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "Ok"
+msgstr "Selhalo nahrání zdroje."
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr "Rozbalit všechny vlastnosti"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+msgid "Collapse All Properties"
msgstr "Sbalit všechny vlastnosti"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3277,7 +3319,7 @@ msgstr "Schránka zdroje je prázdná!"
#: editor/inspector_dock.cpp
msgid "Copy Resource"
-msgstr ""
+msgstr "Kopírovat zdroj"
#: editor/inspector_dock.cpp
msgid "Make Built-In"
@@ -3293,19 +3335,24 @@ msgstr "Otevřít v nápovědě"
#: editor/inspector_dock.cpp
msgid "Create a new resource in memory and edit it."
-msgstr ""
+msgstr "Vytvořit nový zdroj v paměti a editovat ho."
#: editor/inspector_dock.cpp
msgid "Load an existing resource from disk and edit it."
-msgstr ""
+msgstr "Nahrát existující zdroj z disku a editovat ho."
+
+#: editor/inspector_dock.cpp
+#, fuzzy
+msgid "Save the currently edited resource."
+msgstr "Uložit vybranou animaci"
#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
-msgstr ""
+msgstr "Jít na předešlý editovaný objekt v historii."
#: editor/inspector_dock.cpp
msgid "Go to the next edited object in history."
-msgstr ""
+msgstr "Jít na následující editovaný objekt v historii."
#: editor/inspector_dock.cpp
msgid "History of recently edited objects."
@@ -3316,9 +3363,8 @@ msgid "Object properties."
msgstr "Vlastnosti objektu."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Filter properties"
-msgstr "Filtrovat uzly"
+msgstr "Filtrovat vlastnosti"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
@@ -3330,81 +3376,82 @@ msgstr ""
#: editor/node_dock.cpp
msgid "Select a Node to edit Signals and Groups."
-msgstr ""
+msgstr "Zvolit uzel pro editaci signálů a skupin."
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Edit a Plugin"
-msgstr "Upravit IK řetězec"
+msgstr "Editovat plugin"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Create a Plugin"
-msgstr "Vytvořit C# řešení"
+msgstr "Vytvořit plugin"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Plugin Name:"
-msgstr "Pluginy"
+msgstr "Název pluginu:"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
-msgstr ""
+msgstr "Podsložka:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Language:"
-msgstr "Jazyk"
+msgstr "Jazyk:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Script Name:"
-msgstr "Skript je validní"
+msgstr "Název skriptu:"
#: editor/plugin_config_dialog.cpp
msgid "Activate now?"
-msgstr ""
+msgstr "Aktivovat nyní?"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
-msgstr ""
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
+msgstr "Vytvořit polygon"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
-msgstr ""
+#, fuzzy
+msgid "Edit Polygon"
+msgstr "Editovat polygon"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
-msgstr ""
+msgstr "Vložit polygon"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
-msgstr ""
+#, fuzzy
+msgid "Edit Polygon (Remove Point)"
+msgstr "Upravit polygon (Odstranit bod)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
-msgstr ""
+#, fuzzy
+msgid "Remove Polygon And Point"
+msgstr "Odstranit polygon a bod"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr ""
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr "Vytvořit body."
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#, fuzzy
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
+"Upravit existující polygon:\n"
+"LMB: Přesunout bod.\n"
+"Ctrl+LMB: Rozdělit segment.\n"
+"RMB: Vymazat bod."
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
-msgstr "Odstranit body"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr "Vymazat body."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3419,14 +3466,14 @@ msgstr "Přidat animaci"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
-msgstr "NaÄíst"
+msgid "Load..."
+msgstr "NaÄíst.."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "This type of node can't be used. Only root nodes are allowed."
-msgstr ""
+msgstr "Tento typ uzlu nelze použít. Jsou povoleny pouze kořenové uzly."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3445,37 +3492,28 @@ msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Select and move points, create points with RMB."
-msgstr ""
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Odstranit body"
+msgstr "Zvolte a přesuňte body. Nové uzly vytvořte pomocí RMB."
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "RMB: Vymazat bod."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Point"
-msgstr "Přesunout bod"
+msgstr "Bod"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Open Animation Node"
-msgstr "Jméno animace:"
+msgstr "Otevřít uzel animace"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists"
-msgstr "Akce '%s' již existuje!"
+msgstr "Trojúhelník již existuje"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "BlendSpace2D does not belong to an AnimationTree node."
@@ -3498,10 +3536,9 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr "Přichytit"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Prolínání:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3535,14 +3572,13 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
-msgid "Add Node.."
-msgstr "Přidat uzel"
+msgid "Add Node..."
+msgstr "Přidat uzel.."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filtered Tracks:"
-msgstr "Editovat filtry"
+msgstr "Upravit filtrované stopy:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Enable filtering"
@@ -3554,15 +3590,15 @@ msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "New Animation Name:"
-msgstr ""
+msgstr "Nový název animace:"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "New Anim"
-msgstr ""
+msgstr "Nová animace"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Change Animation Name:"
-msgstr ""
+msgstr "Změnit název animace:"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Delete Animation?"
@@ -3574,14 +3610,12 @@ msgid "Remove Animation"
msgstr "Smazat animaci"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Invalid animation name!"
-msgstr "Chyba: Neplatné jméno animace!"
+msgstr "Neplatné jméno animace!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Animation name already exists!"
-msgstr "Chyba: Jméno animace už existuje!"
+msgstr "Jméno animace už existuje!"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -3605,9 +3639,8 @@ msgid "Duplicate Animation"
msgstr "Duplikovat animaci"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to copy!"
-msgstr "ERROR: Nevybrána animace pro kopírování!"
+msgstr "Žádná animace pro kopírování!"
#: editor/plugins/animation_player_editor_plugin.cpp
#, fuzzy
@@ -3623,9 +3656,8 @@ msgid "Paste Animation"
msgstr "Vložit animaci"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to edit!"
-msgstr "ERROR: Nevybrána animace pro úpravu!"
+msgstr "Žádná animace pro úpravu!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
@@ -3669,14 +3701,12 @@ msgid "New"
msgstr "Nový"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Transitions..."
-msgstr "Přechody"
+msgstr "Upravit přechody..."
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Open in Inspector"
-msgstr "Otevřít v editoru"
+msgstr "Otevřít v inspektoru"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Display list of animations in player."
@@ -3769,7 +3799,7 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
msgid "End"
-msgstr ""
+msgstr "Konec"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Immediate"
@@ -3804,18 +3834,16 @@ msgid ""
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "Vytvořit nový %s"
+msgstr "Vytvořit nové uzly."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Connect nodes."
-msgstr "Připojit uzly"
+msgstr "Připojit uzly."
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "Odstranit vybranou stopu."
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3827,9 +3855,8 @@ msgid "Set the end animation. This is useful for sub-transitions."
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "Přechod"
+msgstr "Přechod: "
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3883,10 +3910,6 @@ msgid "Amount:"
msgstr "Množství:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "Prolínání:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "Prolínání 0:"
@@ -3929,7 +3952,7 @@ msgstr "Strom animace je neplatný."
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Animation Node"
-msgstr ""
+msgstr "Uzel animace"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "OneShot Node"
@@ -4025,17 +4048,15 @@ msgstr "Neúspěšná kontrola sha256 hashe"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Asset Download Error:"
-msgstr ""
+msgstr "Chyba při stahování assetu:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading (%s / %s)..."
-msgstr "Stahuji"
+msgstr "Stahuji (%s / %s)..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading..."
-msgstr "Stahuji"
+msgstr "Stahuji..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Resolving..."
@@ -4059,17 +4080,15 @@ msgstr "Chyba při stahování"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Download for this asset is already in progress!"
-msgstr ""
+msgstr "Stahování tohoto assetu právě probíhá!"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "First"
-msgstr "první"
+msgstr "První"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Previous"
-msgstr "Předchozí záložka"
+msgstr "Předchozí"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Next"
@@ -4077,7 +4096,7 @@ msgstr "Další"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Last"
-msgstr ""
+msgstr "Poslední"
#: editor/plugins/asset_library_editor_plugin.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -4089,7 +4108,7 @@ msgstr "Všechny"
msgid "Plugins"
msgstr "Pluginy"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "Řadit:"
@@ -4198,29 +4217,29 @@ msgid "Create new horizontal and vertical guides"
msgstr "Vytvořit nové vodorovné a svislé vodítka"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move pivot"
-msgstr "Přemístit střed"
+msgstr "Přemístit pivot"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Rotate CanvasItem"
-msgstr "Upravit CanvasItem"
+msgstr "Rotovat CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move anchor"
-msgstr "Přesunout akci"
+msgstr "Přesunout kotvu"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Resize CanvasItem"
-msgstr "Upravit CanvasItem"
+msgstr "Změnit velikost CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Scale CanvasItem"
+msgstr "Rotovat CanvasItem"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
-msgstr "Upravit CanvasItem"
+msgstr "Přemístit CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -4239,21 +4258,19 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "Oddálit"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "Oddálit"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Přiblížit"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr "Režim výběru"
@@ -4283,6 +4300,11 @@ msgid "Rotate Mode"
msgstr "Režim otáÄení"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "Režim zvětšování (R)"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4298,16 +4320,14 @@ msgid "Pan Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle snapping."
-msgstr "Přepnout přichycování"
+msgstr "Přepnout přichycování."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Snap"
msgstr "Použít přichycování"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snapping Options"
msgstr "Možnosti přichytávání"
@@ -4346,16 +4366,15 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to node sides"
-msgstr ""
+msgstr "Přichytit ke stranám uzlu"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to node center"
-msgstr "PÅ™ichytit k rodiÄovi"
+msgstr "Přichytit ke středu uzlu"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to other nodes"
-msgstr ""
+msgstr "Přichytit k jiným uzlům"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to guides"
@@ -4364,12 +4383,12 @@ msgstr "Přichytit k vodítkům"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock the selected object in place (can't be moved)."
-msgstr ""
+msgstr "UzamÄít vybraný objekt na místÄ› (nemůže být pÅ™esunut)."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Unlock the selected object (can be moved)."
-msgstr ""
+msgstr "Uvolnit vybraný objekt (může být přesunut)."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Makes sure the object's children are not selectable."
@@ -4380,6 +4399,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "Kostra"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "Zobrazit kosti"
@@ -4427,9 +4451,12 @@ msgid "Show Origin"
msgstr "Zobrazit poÄátek"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Show Viewport"
-msgstr "Zobrazit pomocné"
+msgstr "Zobrazit Viewport"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
@@ -4444,13 +4471,12 @@ msgid "Layout"
msgstr "Rozložení"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Insert keys."
-msgstr "Vložit klíÄe"
+msgstr "Vložit klíÄe."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
-msgstr ""
+msgstr "Vložit klÃ­Ä (existující stopy)"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Copy Pose"
@@ -4501,17 +4527,25 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr "Vytvořit Poly3D"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "Vytvořit polygon"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Editovat polygon"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Upravit polygon (Odstranit bod)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
msgstr ""
#: editor/plugins/cpu_particles_editor_plugin.cpp
-#, fuzzy
msgid "CPUParticles"
-msgstr "Vrcholy"
+msgstr "CPUParticles"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
@@ -4606,37 +4640,9 @@ msgid "Item List Editor"
msgstr "Editor seznamu položek"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"Na tomto uzlu není žádný OccluderPolygon2D.\n"
-"Vytvořit a přiřadit k tomuto uzlu?"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr "Vytvořit Occluder Polygon"
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "Upravit existující polygon:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "LMB: Přesunout bod."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr "Ctrl+LMB: Rozdělit segment."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "RMB: Vymazat bod."
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr "Mesh je prázdný!"
@@ -4667,7 +4673,7 @@ msgstr "Vytvořit Navigation Mesh"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Contained Mesh is not of type ArrayMesh."
-msgstr ""
+msgstr "Obsažená mesh není typu ArrayMesh."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "UV Unwrap failed, mesh may not be manifold?"
@@ -4675,12 +4681,12 @@ msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "No mesh to debug."
-msgstr ""
+msgstr "Žádná mesh pro debugování."
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Model has no UV in this layer"
-msgstr ""
+msgstr "Model nemá UV v této vrstvě"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "MeshInstance lacks a Mesh!"
@@ -4771,10 +4777,11 @@ msgstr "Aktualizovat ze scény"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "No mesh source specified (and no MultiMesh set in node)."
msgstr ""
+"Zdroj meshe není specifikován (a žádná MultiMesh není nastavena v uzlu)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "No mesh source specified (and MultiMesh contains no Mesh)."
-msgstr ""
+msgstr "Zdroj meshe není specifikován (a MultiMesh neobsahuje žádnou Mesh)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh source is invalid (invalid path)."
@@ -4782,11 +4789,11 @@ msgstr "Zdroj meshe je neplatný (neplatná cesta)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh source is invalid (not a MeshInstance)."
-msgstr ""
+msgstr "Zdroj meshe je neplatný (není MeshInstance)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh source is invalid (contains no Mesh resource)."
-msgstr ""
+msgstr "Zdroj meshe je neplatný (neobsahuje žádný Mesh zdroj)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "No surface source specified."
@@ -4826,15 +4833,15 @@ msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Populate MultiMesh"
-msgstr ""
+msgstr "Naplnit MultiMesh"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Target Surface:"
-msgstr ""
+msgstr "Cílový povrch:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Source Mesh:"
-msgstr ""
+msgstr "Zdrojová mesh:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "X-Axis"
@@ -4854,11 +4861,11 @@ msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Random Rotation:"
-msgstr ""
+msgstr "Náhodná rotace:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Random Tilt:"
-msgstr ""
+msgstr "Náhodné naklonění:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Random Scale:"
@@ -4869,13 +4876,14 @@ msgid "Populate"
msgstr "Naplnit"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
-msgstr ""
+msgstr "VytvoÅ™it navigaÄní polygon"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr ""
+#, fuzzy
+msgid "Generating Visibility Rect"
+msgstr "Generování C# projektu..."
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -4883,11 +4891,11 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Error loading image:"
-msgstr ""
+msgstr "Chyba při nahrávání obrázku:"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "No pixels with transparency > 128 in image..."
-msgstr ""
+msgstr "Žádný pixel s průhledností > 128 v obrázku..."
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Generate Visibility Rect"
@@ -4903,17 +4911,22 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr "Převést na CPUParticles"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
-msgstr ""
+msgstr "Částice"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Generated Point Count:"
-msgstr ""
+msgstr "PoÄet vygenerovaných bodů:"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generation Time (sec):"
-msgstr ""
+msgstr "Čas generování (sec):"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Emission Mask"
@@ -4972,13 +4985,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
-msgstr "Vygenerovat AABB"
+msgid "Generating AABB"
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "Konvertovat na velká písmena"
+msgid "Generate AABB"
+msgstr "Vygenerovat AABB"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -4986,7 +4998,7 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Remove Point from Curve"
-msgstr ""
+msgstr "Odstranit bod z křivky"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Remove Out-Control from Curve"
@@ -4999,7 +5011,12 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Add Point to Curve"
-msgstr ""
+msgstr "Přidat bod do křivky"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "Uzavřít křivku"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
@@ -5027,12 +5044,16 @@ msgstr "Shift+Táhnutí:"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Click: Add Point"
-msgstr "Kliknutí: Přidat bod"
+msgstr "Klik: Přidat bod"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
-msgstr ""
+msgstr "Pravý klik: Smazat bod"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Select Control Points (Shift+Drag)"
@@ -5045,11 +5066,6 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "Odstranit bod"
@@ -5079,9 +5095,8 @@ msgid "Curve Point #"
msgstr "Bod křivky #"
#: editor/plugins/path_editor_plugin.cpp
-#, fuzzy
msgid "Set Curve Point Position"
-msgstr "Odstranit signál"
+msgstr "Nastavit pozici bodu křivky"
#: editor/plugins/path_editor_plugin.cpp
msgid "Set Curve In Position"
@@ -5109,6 +5124,10 @@ msgstr "Odstranit funkci"
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5121,8 +5140,14 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Sync bones"
-msgstr "Zobrazit kosti"
+msgid "Sync Bones"
+msgstr "Synchronizovat kosti"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
@@ -5134,42 +5159,48 @@ msgid "Create Polygon & UV"
msgstr "Vytvořit Poly3D"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "Vytvořit nové vodorovné vodítko"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "Akce '%s' již existuje!"
+msgid "Remove Internal Vertex"
+msgstr "Odstranit položku"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Add Split"
-msgstr "Přidat bod"
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "Neplatná cesta"
+msgid "Add Custom Polygon"
+msgstr "Editovat polygon"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Odstranit bod"
+msgid "Remove Custom Polygon"
+msgstr "Odstranit polygon a bod"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr "Transformovat UV mapu"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
+#, fuzzy
+msgid "Transform Polygon"
+msgstr "Typ transformace"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Open Polygon 2D UV editor."
+msgstr "Otevřít 2D editor"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
msgstr ""
@@ -5178,26 +5209,22 @@ msgid "UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Poly"
-msgstr ""
+#, fuzzy
+msgid "Points"
+msgstr "Bod"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Splits"
-msgstr "Rozdělit cestu"
+msgid "Polygons"
+msgstr "Polygon->UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Bones"
-msgstr "Vytvořit kosti"
+msgstr "Kosti"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
-msgstr "Vytvořit Poly3D"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Move Points"
msgstr "Přesunout bod"
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5225,20 +5252,21 @@ msgid "Scale Polygon"
msgstr "Změnit měřítko mnohoúhelníku"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "Vyberte složku pro skenování"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5258,9 +5286,13 @@ msgid "Clear UV"
msgstr "Vymazat UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Settings"
-msgstr "Nastavení GridMap"
+msgstr "Nastavení mřížky"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "Přichytit"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
@@ -5271,29 +5303,24 @@ msgid "Grid"
msgstr "Mřížka"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Configure Grid:"
-msgstr "Nastavení přichycování"
+msgstr "Nastavit mřížku:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset X:"
-msgstr "Offset mřížky:"
+msgstr "Offset mřížky X:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset Y:"
-msgstr "Offset mřížky:"
+msgstr "Offset mřížky Y:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step X:"
-msgstr "Krok mřížky:"
+msgstr "Krok mřížky X:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step Y:"
-msgstr "Krok mřížky:"
+msgstr "Krok mřížky Y:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -5323,12 +5350,7 @@ msgstr "Schránka zdroje je prázdná!"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Paste Resource"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "Otevřít v editoru"
+msgstr "Vložit zdroj"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
@@ -5337,11 +5359,16 @@ msgstr "Instance:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr "Typ:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Otevřít v editoru"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr "NaÄíst zdroj"
@@ -5352,12 +5379,11 @@ msgstr "Zdroj"
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "AnimationTree has no path set to an AnimationPlayer"
-msgstr ""
+msgstr "AnimationTree nemá nastavenou cestu k AnimstionPlayer"
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Path to AnimationPlayer is invalid"
-msgstr "Strom animace je neplatný."
+msgstr "Cesta k AnimationPlayer je neplatná"
#: editor/plugins/script_editor_plugin.cpp
msgid "Clear Recent Files"
@@ -5368,56 +5394,66 @@ msgid "Close and save changes?"
msgstr "Zavřít a uložit změny?"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error writing TextFile:"
-msgstr "Chyba pÅ™i naÄítání:"
+msgstr "Chyba při zápisu textového souboru:"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr "Chyba: nelze naÄíst soubor."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error could not load file."
-msgstr "Chyba - Nelze vytvořit skript v souborovém systému."
+msgstr "Chyba nelze naÄíst soubor."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error saving file!"
-msgstr "Chyba pÅ™i naÄítání:"
+msgstr "Chyba při ukládání souboru!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
+#, fuzzy
+msgid "Error while saving theme."
msgstr "Chyba při ukládání motivu"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+#, fuzzy
+msgid "Error Saving"
msgstr "Chyba při ukládání"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
+#, fuzzy
+msgid "Error importing theme."
msgstr "Chyba při importu motivu"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+#, fuzzy
+msgid "Error Importing"
msgstr "Chyba při importu"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New TextFile..."
-msgstr "Nová složka..."
+msgstr "Nový textový soubor..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open File"
msgstr "Otevřít soubor"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Save File As..."
-msgstr "Uložit jako..."
+msgstr "Uložit soubor jako..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme"
msgstr "Importovat motiv"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Chyba při ukládání motivu"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Chyba při ukládání"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr "Uložit motiv jako..."
@@ -5459,8 +5495,8 @@ msgstr "Soubor"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile"
-msgstr "Zobrazit soubory"
+msgid "Open..."
+msgstr "Otevřít"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5475,11 +5511,8 @@ msgid "Copy Script Path"
msgstr "Zkopírovat cestu ke skriptu"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr "Zobrazit v systému souborů"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+#, fuzzy
+msgid "History Previous"
msgstr "Historie předchozí"
#: editor/plugins/script_editor_plugin.cpp
@@ -5489,7 +5522,12 @@ msgstr "Historie další"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp
msgid "Theme"
-msgstr ""
+msgstr "Téma"
+
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Import Theme..."
+msgstr "Importovat motiv"
#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
@@ -5500,10 +5538,6 @@ msgid "Save Theme"
msgstr "Uložit motiv"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "Uložit motiv jako"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "Zavřít dokumentaci"
@@ -5551,18 +5585,14 @@ msgid "Keep Debugger Open"
msgstr "Nechat ladící program otevřený"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
-msgstr "Debugovat externím editorem"
+msgid "Debug with External Editor"
+msgstr "Debugovat v externím editoru"
#: editor/plugins/script_editor_plugin.cpp
msgid "Open Godot online documentation"
msgstr "Otevřít Godot online dokumentaci"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr "Hledat v hierarchii tříd."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Hledat v referenÄní dokumentaci."
@@ -5583,6 +5613,8 @@ msgid ""
"The following files are newer on disk.\n"
"What action should be taken?:"
msgstr ""
+"Následující soubory mají novější verzi na disku.\n"
+"Jaká akce se má vykonat?:"
#: editor/plugins/script_editor_plugin.cpp
msgid "Reload"
@@ -5597,28 +5629,23 @@ msgid "Debugger"
msgstr "Ladicí program"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search results"
-msgstr "Prohledat nápovědu"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "Hledat třídy"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-"VestavÄ›né skripty lze editovat pouze pokud scéna, které náleží, je naÄtená"
+msgid "Search Results"
+msgstr "Výsledky hledání"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Line"
-msgstr "Řádek:"
+msgstr "Řádek"
#: editor/plugins/script_text_editor.cpp
msgid "(ignore)"
+msgstr "(ignorovat)"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function"
+msgstr "Přejít na funkci"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5634,9 +5661,8 @@ msgid "Pick Color"
msgstr "Vyberte barvu"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-#, fuzzy
msgid "Convert Case"
-msgstr "Převest písmena"
+msgstr "Změnit velikost písmen"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Uppercase"
@@ -5652,11 +5678,7 @@ msgstr "Velká písmena"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Syntax Highlighter"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
+msgstr "ZvýrazňovaÄ syntaxe"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
@@ -5709,11 +5731,11 @@ msgid "Trim Trailing Whitespace"
msgstr "Osekat koncové mezery"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr "Převést odsazení na mezery"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr "Převést odsazení na taby"
#: editor/plugins/script_text_editor.cpp
@@ -5730,36 +5752,27 @@ msgid "Remove All Breakpoints"
msgstr "Odstranit všechny breakpointy"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
+msgid "Go to Next Breakpoint"
msgstr "Přejít na další breakpoint"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
+msgid "Go to Previous Breakpoint"
msgstr "Přejít na předchozí breakpoint"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr "Konvertovat na velká písmena"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr "Konvertovat na malá písmena"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr "Najít předchozí"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Find in files..."
-msgstr "Filtrovat soubory..."
+msgid "Find in Files..."
+msgstr "Najít v souborech..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+msgid "Go to Function..."
msgstr "Přejít na funkci..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+msgid "Go to Line..."
msgstr "Přejít na řádek..."
#: editor/plugins/script_text_editor.cpp
@@ -5775,9 +5788,8 @@ msgid "This skeleton has no bones, create some children Bone2D nodes."
msgstr ""
#: editor/plugins/skeleton_2d_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton2D"
-msgstr "Singleton"
+msgstr "Skeleton2D"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Make Rest Pose (From Bones)"
@@ -5788,24 +5800,20 @@ msgid "Set Bones to Rest Pose"
msgstr ""
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical bones"
-msgstr "Vytvořit Navigation Mesh"
+msgstr "Vytvořit fyzické kosti"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton"
-msgstr "Singleton"
+msgstr "Kostra"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical skeleton"
-msgstr "Vytvořit C# řešení"
+msgstr "Vytvořit fyzickou kostru"
#: editor/plugins/skeleton_ik_editor_plugin.cpp
-#, fuzzy
msgid "Play IK"
-msgstr "Spustit"
+msgstr "Spustit IK"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Orthogonal"
@@ -5857,6 +5865,14 @@ msgid "Animation Key Inserted."
msgstr "AnimaÄní klÃ­Ä vložen."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr "Objekty vykreslené"
@@ -6023,6 +6039,11 @@ msgid "Freelook Speed Modifier"
msgstr "Rychlost volného pohledu"
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "Zobrazit informace"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "XForm Dialog"
@@ -6125,11 +6146,6 @@ msgid "Tool Scale"
msgstr "Nástroj Zvětšení"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap To Floor"
-msgstr "Přichytit k mřížce"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Přepnout volný pohled"
@@ -6221,11 +6237,11 @@ msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Change"
-msgstr ""
+msgstr "Změna transformace"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Translate:"
-msgstr ""
+msgstr "Posunout:"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate (deg.):"
@@ -6237,7 +6253,7 @@ msgstr "Změnit měřítko (poměr):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Type"
-msgstr ""
+msgstr "Typ transformace"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Pre"
@@ -6247,10 +6263,13 @@ msgstr "Před"
msgid "Post"
msgstr "Po"
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite is empty!"
-msgstr "Mesh je prázdný!"
+msgstr "Sprite je prázdný!"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Can't convert a sprite using animation frames to mesh."
@@ -6265,14 +6284,12 @@ msgid "Sprite"
msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to 2D Mesh"
-msgstr "Konvertovat na %s"
+msgstr "Konvertovat na 2D mesh"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create 2D Mesh"
-msgstr "Vytvořit mesh obrysu"
+msgstr "Vytvořit 2D mesh"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Simplification: "
@@ -6283,18 +6300,16 @@ msgid "Grow (Pixels): "
msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Update Preview"
-msgstr "Náhled"
+msgstr "Obnovit náhled"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Settings:"
-msgstr "Nastavení"
+msgstr "Nastavení:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
-msgstr ""
+msgstr "CHYBA: Nelze naÄíst zdroj snímku!"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Frame"
@@ -6310,11 +6325,11 @@ msgstr "Vložit snímek"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Empty"
-msgstr ""
+msgstr "Přidat prázdný"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Change Animation Loop"
-msgstr ""
+msgstr "ZmÄ›nit smyÄku animace"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Change Animation FPS"
@@ -6342,16 +6357,15 @@ msgstr "Snímky animace"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Insert Empty (Before)"
-msgstr ""
+msgstr "Vložit prázdný (před)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Insert Empty (After)"
-msgstr ""
+msgstr "Vložit prázdný (za)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Move (Before)"
-msgstr "Zkopírovat uzly"
+msgstr "Přemístit (před)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Move (After)"
@@ -6366,12 +6380,17 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
-msgstr "<Žádné>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
+msgstr "Žádné"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Pixel Snap"
@@ -6404,7 +6423,7 @@ msgstr "Oblast textury"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Can't save theme to file:"
-msgstr ""
+msgstr "Nelze uložit motiv do souboru:"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
@@ -6428,7 +6447,7 @@ msgstr "Editovat téma..."
#: editor/plugins/theme_editor_plugin.cpp
msgid "Theme editing menu."
-msgstr ""
+msgstr "Menu editace motivu."
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add Class Items"
@@ -6444,11 +6463,11 @@ msgstr "Vytvořit prázdnou šablonu"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Create Empty Editor Template"
-msgstr ""
+msgstr "Vytvořit prázdný motiv editoru"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Create From Current Editor Theme"
-msgstr ""
+msgstr "VytvoÅ™it ze souÄasného motivu editoru"
#: editor/plugins/theme_editor_plugin.cpp
msgid "CheckBox Radio1"
@@ -6538,6 +6557,11 @@ msgid "Fix Invalid Tiles"
msgstr "Neplatný název."
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "Vycentrovat výběr"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6555,12 +6579,11 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Erase TileMap"
-msgstr ""
+msgstr "Vymazat TileMap"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Find Tile"
-msgstr "Najít další"
+msgstr "Najít dlaždici"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Transpose"
@@ -6580,38 +6603,42 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Pick Tile"
-msgstr ""
+msgstr "Vybrat dlaždici"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
-msgid "Move Selection"
-msgstr "Odstranit výběr"
+msgid "Copy Selection"
+msgstr "Kopírovat výběr"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate left"
+msgstr "OtoÄit doleva"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr "OtoÄit o 0 stupňů"
+msgid "Rotate right"
+msgstr "OtoÄit doprava"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr "OtoÄit o 90 stupňů"
+msgid "Flip horizontally"
+msgstr "Převrátit horizontálně"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
-msgstr "OtoÄit o 180 stupňů"
+msgid "Flip vertically"
+msgstr "Převrátit vertikálně"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
-msgstr "OtoÄit o 270 stupňů"
+#, fuzzy
+msgid "Clear transform"
+msgstr "Animace: změna transformace"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr "Přidat uzel(y) ze stromu"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
-msgstr "Odstranit signál"
+msgid "Remove selected Texture from TileSet."
+msgstr "Odstranit aktuální texturu z TileSetu"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -6622,33 +6649,60 @@ msgid "Merge from Scene"
msgstr "SlouÄit ze scény"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "Vložit animaci"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "Vymazat body."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "Vytvořit polygon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "Odstranit aktuální texturu z TileSetu"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
-msgstr "Vytvořit ze scény?"
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
msgstr "SlouÄit ze scény?"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Odstranit šablonu"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6658,16 +6712,27 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "Odstranit vybrané soubory?"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr ""
+msgstr "Vytvořit složku"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "Odstranit body"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr "Vytvořit složku"
@@ -6686,38 +6751,121 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr "Vytvořit složku"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Set Tile Region"
+msgstr "Oblast textury"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Vytvořit složku"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "Editovat filtry"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Upravit existující polygon:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Editovat polygon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "VytvoÅ™it navigaÄní polygon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "Vložit animaci"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Odstranit šablonu"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "Odstranit polygon a bod"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "Vytvořit Occluder Polygon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "VytvoÅ™it navigaÄní polygon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "Editovat filtry"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "VytvoÅ™it navigaÄní polygon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Vytvořit Occluder Polygon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "This property can't be changed."
-msgstr "Tato operace nemůže být provedena bez scény."
+msgstr "Tato vlastnost nemůže být změněna."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Tile Set"
+msgid "TileSet"
msgstr "Soubor:"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vertex"
-msgstr "Vrcholy"
+msgstr "Vrchol"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Fragment"
-msgstr "Argumenty:"
+msgstr "Fragment"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Light"
-msgstr "Pravý"
+msgstr "Světlo"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "VisualShader"
-msgstr "Shader"
+msgstr "VisualShader"
#: editor/project_export.cpp
-#, fuzzy
msgid "Runnable"
-msgstr "Povolit"
+msgstr "Spustitelný"
#: editor/project_export.cpp
#, fuzzy
@@ -6733,6 +6881,14 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr "Exportní šablony pro tuto platformu chybí nebo jsou poškozené:"
#: editor/project_export.cpp
+msgid "Release"
+msgstr "Vydání"
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr "Exportování všeho"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr "Předvolby"
@@ -6741,6 +6897,11 @@ msgid "Add..."
msgstr "Přidat..."
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "Exportovat projekt"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr "Zdroje"
@@ -6796,10 +6957,50 @@ msgid "Feature List:"
msgstr "Seznam funkcí:"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "Nový skript"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Script Export Mode:"
+msgstr "Expertní režim:"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export mode?"
+msgstr "Expertní režim:"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Export All"
+msgstr "Exportovat"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr "Exportní šablony pro tuto platformu chybí:"
@@ -6928,7 +7129,8 @@ msgid "Unnamed Project"
msgstr "Nepojmenovaný projekt"
#: editor/project_manager.cpp
-msgid "Can't open project"
+#, fuzzy
+msgid "Can't open project at '%s'."
msgstr "Nelze otevřít projekt"
#: editor/project_manager.cpp
@@ -6937,6 +7139,24 @@ msgstr "Jste si jisti, že chcete otevřit více než jeden projekt?"
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7009,18 +7229,20 @@ msgid ""
"You don't currently have any projects.\n"
"Would you like to explore the official example projects in the Asset Library?"
msgstr ""
+"V této chvíli nemáte žádný projekt.\n"
+"Přejete si prozkoumat oficiální ukázkové projekty v knihovně assetů?"
#: editor/project_settings_editor.cpp
msgid "Key "
-msgstr ""
+msgstr "Klávesa "
#: editor/project_settings_editor.cpp
msgid "Joy Button"
-msgstr ""
+msgstr "TlaÄítko gamepadu"
#: editor/project_settings_editor.cpp
msgid "Joy Axis"
-msgstr ""
+msgstr "Osa gamepadu"
#: editor/project_settings_editor.cpp
msgid "Mouse Button"
@@ -7264,10 +7486,6 @@ msgstr "Nastavení projektu (project.godot)"
msgid "General"
msgstr "Všeobecné"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr "Vlastnost:"
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7401,10 +7619,6 @@ msgstr "Vybrat uzel"
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr "Vlastnosti:"
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr "Vybrat vlastnost"
@@ -7432,11 +7646,11 @@ msgstr "Rozlišovat malá/velká"
#: editor/rename_dialog.cpp
msgid "Prefix"
-msgstr ""
+msgstr "Prefix"
#: editor/rename_dialog.cpp
msgid "Suffix"
-msgstr ""
+msgstr "Sufix"
#: editor/rename_dialog.cpp
#, fuzzy
@@ -7448,27 +7662,24 @@ msgid "Substitute"
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node name"
-msgstr "Název uzlu:"
+msgstr "Název uzlu"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
-msgstr ""
+msgstr "Jméno rodiÄe uzlu, pokud dostupné"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node type"
-msgstr "Vyhledat typ uzlu"
+msgstr "Typ uzlu"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Current scene name"
-msgstr "Aktuální scéna"
+msgstr "Název aktuální scény"
#: editor/rename_dialog.cpp
msgid "Root node name"
-msgstr ""
+msgstr "Název kořenového uzlu"
#: editor/rename_dialog.cpp
msgid ""
@@ -7489,12 +7700,11 @@ msgid "Initial value for the counter"
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Step"
-msgstr "Krok:"
+msgstr "Krok"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7503,14 +7713,13 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Regular Expressions"
-msgstr "Změnit výraz"
+msgstr "Regulární výrazy"
#: editor/rename_dialog.cpp
msgid "Post-Process"
@@ -7533,21 +7742,19 @@ msgid "Case"
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Lowercase"
-msgstr "Malá písmena"
+msgstr "Na malá písmena"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Uppercase"
-msgstr "Velká písmena"
+msgstr "Na velká písmena"
#: editor/rename_dialog.cpp
#, fuzzy
msgid "Reset"
msgstr "Obnovit původní přiblížení"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr "Chyba"
@@ -7606,6 +7813,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr "Vymazat skript"
@@ -7642,6 +7853,12 @@ msgid "Save New Scene As..."
msgstr "Uložit novou scénu jako..."
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7717,6 +7934,11 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Open documentation"
+msgstr "Otevřít Godot online dokumentaci"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr "Odstranit uzel/uzly"
@@ -7725,15 +7947,16 @@ msgid "Add Child Node"
msgstr "Přidat podřízený uzel"
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
msgid "Change Type"
msgstr "Změnit typ"
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Extend Script"
+msgstr "Otevřít skript"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Make Scene Root"
msgstr "Dává smysl!"
@@ -7883,6 +8106,11 @@ msgid "Path is empty"
msgstr "Cesta je prázdná"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Filename is empty"
+msgstr "Sprite je prázdný!"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr "Cesta není místní"
@@ -7972,20 +8200,8 @@ msgid "Bytes:"
msgstr "Bajtů:"
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr "Varování"
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr "Chyba:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr "Zdroj:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
-msgstr "Funkce:"
+msgid "Stack Trace"
+msgstr ""
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8016,20 +8232,8 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr "Proměnná"
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr "Chyby:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
-msgstr ""
+msgstr "Profiler"
#: editor/script_editor_debugger.cpp
msgid "Monitor"
@@ -8053,7 +8257,7 @@ msgstr "Celkem:"
#: editor/script_editor_debugger.cpp
msgid "Video Mem"
-msgstr ""
+msgstr "Video pamět"
#: editor/script_editor_debugger.cpp
msgid "Resource Path"
@@ -8230,7 +8434,8 @@ msgid "GDNative"
msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+#, fuzzy
+msgid "Step argument is zero!"
msgstr "Argument kroku je nula!"
#: modules/gdscript/gdscript_functions.cpp
@@ -8396,7 +8601,7 @@ msgstr ""
#: modules/mono/csharp_script.cpp
msgid "Class name can't be a reserved keyword"
-msgstr ""
+msgstr "Název třídy nemůže být rezervované klíÄové slovo"
#: modules/mono/editor/godotsharp_editor.cpp
msgid "Generating solution..."
@@ -8420,7 +8625,7 @@ msgstr "Hotovo"
#: modules/mono/editor/godotsharp_editor.cpp
msgid "Failed to create C# project."
-msgstr ""
+msgstr "Vytvoření C# projektu selhalo."
#: modules/mono/editor/godotsharp_editor.cpp
msgid "Mono"
@@ -8436,7 +8641,7 @@ msgstr "Vytvořit C# řešení"
#: modules/mono/editor/mono_bottom_panel.cpp
msgid "Builds"
-msgstr ""
+msgstr "Sestavení"
#: modules/mono/editor/mono_bottom_panel.cpp
msgid "Build Project"
@@ -8456,11 +8661,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -8745,6 +8946,10 @@ msgid "Base Type:"
msgstr "Základní typ:"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "Členové:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "Dostupné uzly:"
@@ -8847,11 +9052,11 @@ msgid "Search VisualScript"
msgstr "Odstranit VisualScript uzel"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
-msgstr "Získat"
+msgid "Get %s"
+msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8912,6 +9117,10 @@ msgid ""
"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
"define its shape."
msgstr ""
+"Tento uzel nemá žádný tvar, takže nemůže kolidovat ani interagovat s "
+"ostatními objekty.\n"
+"Zvažte možnost přidat CollisionShape2D nebo CollisionPolygon2D jako potomka "
+"abyste definovali jeho tvar."
#: scene/2d/collision_polygon_2d.cpp
msgid ""
@@ -8946,6 +9155,12 @@ msgid ""
"shape resource for it!"
msgstr "CollisionShape2D musí obsahovat tvar. Prosím vytvořte zdrojový tvar."
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -8990,6 +9205,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr "PathFollow2D funguje pouze když je dítětem uzlu Path2D."
@@ -9085,6 +9306,10 @@ msgid ""
"Consider adding a CollisionShape or CollisionPolygon as a child to define "
"its shape."
msgstr ""
+"Tento uzel nemá žádný tvar, takže nemůže kolidovat ani interagovat s "
+"ostatními objekty.\n"
+"Zvažte možnost přidat CollisionShape nebo CollisionPolygon jako potomka "
+"abyste definovali jeho tvar."
#: scene/3d/collision_polygon.cpp
msgid ""
@@ -9118,6 +9343,16 @@ msgstr ""
"Aby CollisionShape mohl fungovat, musí mu být poskytnut tvar. Vytvořte mu "
"prosím zdroj tvar!"
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -9141,6 +9376,26 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr "PathFollow funguje pouze, když je dítětem uzlu Path."
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr "OrientedPathFollow funguje pouze když je dítětem uzlu Path."
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9178,10 +9433,12 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
+"Změny velikosti SoftBody budou za běhu přepsány fyzikálním enginem.\n"
+"Změňte místo něho velikost kolizních tvarů potomků."
#: scene/3d/sprite_3d.cpp
msgid ""
@@ -9196,24 +9453,24 @@ msgid ""
"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use "
"it as a child of a VehicleBody."
msgstr ""
+"VehicleWheel slouží jako systém kol pro VehicleBody. Použijte ho prosím jako "
+"potomka VehicleBody."
#: scene/animation/animation_blend_tree.cpp
msgid "On BlendTree node '%s', animation not found: '%s'"
msgstr ""
#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "Nástroje pro animaci"
+msgstr "Animace nenalezena: '%s'"
#: scene/animation/animation_tree.cpp
msgid "In node '%s', invalid animation: '%s'."
-msgstr ""
+msgstr "V uzlu '%s', neplatná animace: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "Chyba: Neplatné jméno animace!"
+msgstr "Neplatná animace: '%s'."
#: scene/animation/animation_tree.cpp
#, fuzzy
@@ -9238,6 +9495,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr "Strom animace je neplatný."
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr "RAW mód"
@@ -9254,10 +9515,6 @@ msgstr "Pozor!"
msgid "Please Confirm..."
msgstr "PotvrÄte prosím..."
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr "Vybrat tuto složku"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9268,6 +9525,10 @@ msgstr ""
"popup*() funkcí. I když je jejich zviditelnění pro úpravu v pořádku, za běhu "
"budou skryty."
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr "Pokud má exp_edit hodnotu true, pak min_value musí být > 0."
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9317,19 +9578,12 @@ msgid "Invalid font size."
msgstr "Neplatná velikost fontu."
#: scene/resources/visual_shader.cpp
-#, fuzzy
msgid "Input"
-msgstr "Přidat vstup"
-
-#: scene/resources/visual_shader.cpp
-#, fuzzy
-msgid "None"
-msgstr "<Žádné>"
+msgstr "Vstup"
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for shader."
-msgstr "Neplatná velikost fontu."
+msgstr "Neplatný zdroj pro shader."
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
@@ -9343,6 +9597,171 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Split already exists."
+#~ msgstr "Akce '%s' již existuje!"
+
+#, fuzzy
+#~ msgid "Add Split"
+#~ msgstr "Přidat bod"
+
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr "Neplatná cesta"
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "Odstranit bod"
+
+#, fuzzy
+#~ msgid "Splits"
+#~ msgstr "Rozdělit cestu"
+
+#, fuzzy
+#~ msgid "Select a split to erase it."
+#~ msgstr "Vyberte složku pro skenování"
+
+#~ msgid "No name provided"
+#~ msgstr "Nebylo poskytnuto žádné jméno"
+
+#~ msgid "Add Node.."
+#~ msgstr "Přidat uzel.."
+
+#~ msgid "Create from scene?"
+#~ msgstr "Vytvořit ze scény?"
+
+#~ msgid "Create Poly"
+#~ msgstr "Vytvořit polygon"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "Oddálit"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "Přiblížit"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "Vytvořit Poly3D"
+
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "Na tomto uzlu není žádný OccluderPolygon2D.\n"
+#~ "Vytvořit a přiřadit k tomuto uzlu?"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "LMB: Přesunout bod."
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "Ctrl+LMB: Rozdělit segment."
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "RMB: Vymazat bod."
+
+#~ msgid "New TextFile"
+#~ msgstr "Nový textový soubor"
+
+#~ msgid "Save Theme As"
+#~ msgstr "Uložit motiv jako"
+
+#~ msgid "<None>"
+#~ msgstr "<Žádné>"
+
+#~ msgid "Zoom:"
+#~ msgstr "Přiblížit:"
+
+#~ msgid "Class List:"
+#~ msgstr "Seznam tříd:"
+
+#~ msgid "Search Classes"
+#~ msgstr "Hledat třídy"
+
+#~ msgid "Public Methods"
+#~ msgstr "Veřejné metody"
+
+#~ msgid "Public Methods:"
+#~ msgstr "Veřejné metody:"
+
+#~ msgid "Property: "
+#~ msgstr "Vlastnost: "
+
+#, fuzzy
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "Zobrazit oblíbené"
+
+#, fuzzy
+#~ msgid "Show current scene file."
+#~ msgstr "Vytvořit složku"
+
+#~ msgid "Whole words"
+#~ msgstr "Celá slova"
+
+#~ msgid "Match case"
+#~ msgstr "Rozlišovat velikost písmen"
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#~ msgid "Show In File System"
+#~ msgstr "Zobrazit v systému souborů"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "Hledat v hierarchii tříd."
+
+#~ msgid "Search in files"
+#~ msgstr "Hledat v souborech"
+
+#~ msgid ""
+#~ "Built-in scripts can only be edited when the scene they belong to is "
+#~ "loaded"
+#~ msgstr ""
+#~ "VestavÄ›né skripty lze editovat pouze pokud scéna, které náleží, je naÄtená"
+
+#~ msgid "Convert To Uppercase"
+#~ msgstr "Konvertovat na velká písmena"
+
+#~ msgid "Convert To Lowercase"
+#~ msgstr "Konvertovat na malá písmena"
+
+#, fuzzy
+#~ msgid "Snap To Floor"
+#~ msgstr "Přichytit k mřížce"
+
+#~ msgid "Rotate 0 degrees"
+#~ msgstr "OtoÄit o 0 stupňů"
+
+#~ msgid "Rotate 90 degrees"
+#~ msgstr "OtoÄit o 90 stupňů"
+
+#~ msgid "Rotate 180 degrees"
+#~ msgstr "OtoÄit o 180 stupňů"
+
+#~ msgid "Rotate 270 degrees"
+#~ msgstr "OtoÄit o 270 stupňů"
+
+#~ msgid "Warning"
+#~ msgstr "Varování"
+
+#~ msgid "Error:"
+#~ msgstr "Chyba:"
+
+#~ msgid "Source:"
+#~ msgstr "Zdroj:"
+
+#~ msgid "Function:"
+#~ msgstr "Funkce:"
+
+#~ msgid "Variable"
+#~ msgstr "Proměnná"
+
+#~ msgid "Errors:"
+#~ msgstr "Chyby:"
+
+#~ msgid "Get"
+#~ msgstr "Získat"
+
#~ msgid "Change Scalar Constant"
#~ msgstr "Změnit skalární konstantu"
@@ -9494,9 +9913,6 @@ msgstr ""
#~ msgid "Load an animation from disk."
#~ msgstr "NaÄíst animaci z disku."
-#~ msgid "Save the current animation"
-#~ msgstr "Uložit vybranou animaci"
-
#~ msgid "Copy Animation"
#~ msgstr "Kopírovat animaci"
@@ -9645,9 +10061,6 @@ msgstr ""
#~ msgid "just pressed"
#~ msgstr "právě stisknuto"
-#~ msgid "just released"
-#~ msgstr "právě uvolněno"
-
#, fuzzy
#~ msgid ""
#~ "Couldn't read the certificate file. Are the path and password both "
diff --git a/editor/translations/da.po b/editor/translations/da.po
index d3a036452a..ed2e8b584c 100644
--- a/editor/translations/da.po
+++ b/editor/translations/da.po
@@ -1,6 +1,6 @@
# Danish translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# Dankse Memes <purplelops@gmail.com>, 2018.
# David Lamhauge <davidlamhauge@gmail.com>, 2016, 2018.
@@ -8,18 +8,24 @@
# Kim Nielsen <kimmowich@stofanet.dk>, 2017, 2018.
# Michael Madsen <mim@michael-madsen.dk>, 2017.
# Christoffer Schindel <ceas@outlook.com>, 2018.
+# frederikzt <frederikzt@gmail.com>, 2018.
+# Jonathan B. Jørgensen <pizzaernam@gmail.com>, 2018.
+# Peter G. Laursen <GhostReven@gmail.com>, 2018.
+# Rémi Verschelde <akien@godotengine.org>, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-08-15 20:35+0000\n"
-"Last-Translator: David Lamhauge <davidlamhauge@gmail.com>\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2019-01-13 15:06+0000\n"
+"Last-Translator: Rémi Verschelde <akien@godotengine.org>\n"
"Language-Team: Danish <https://hosted.weblate.org/projects/godot-engine/"
"godot/da/>\n"
"Language: da\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.2-dev\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -27,69 +33,63 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr "Ugyldigt type argument til convert(), brug TYPE_* konstanter."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr "Ikke nok bytes til afkodning af bytes, eller ugyldigt format."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Ugyldigt input %i (mislykket) i udtrykket"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "self kan ikke bruges fordi instansen er null (mislykket)"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "Ugyldigt indeks egenskabsnavn '%s' i noden %s."
+msgstr "Ugyldigt operandere til operator %s, %s og %s."
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid index of type %s for base type %s"
-msgstr "Ugyldigt indeks egenskabsnavn '%s' i noden %s."
+msgstr "Ugyldigt indeks af type %s for basistype %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "Ugyldigt navngivet indeks '%s' for basistype %s"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid arguments to construct '%s'"
-msgstr ": Ugyldigt argument af typen: "
+msgstr "Ugyldige argumenter til at konstruere '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "Ved kald til '%s':"
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
-msgstr ""
+msgstr "Gratis"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "Balanceret"
#: editor/animation_bezier_editor.cpp
msgid "Mirror"
-msgstr ""
+msgstr "Spejl"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "Anim Indsæt Nøgle"
+msgstr "Indsæt nøgle her"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "Duplikér Valgte"
+msgstr "Duplikér valgte nøgle(r)"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "Slet Valgte"
+msgstr "Slet valgte nøgle(r)"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -121,43 +121,39 @@ msgstr "Anim Skift Call"
#: editor/animation_track_editor.cpp
msgid "Property Track"
-msgstr ""
+msgstr "Egenskabsbane"
#: editor/animation_track_editor.cpp
msgid "3D Transform Track"
-msgstr ""
+msgstr "3D-transformationsspor"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "Kald metode spor"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "Béizierkurve spor"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "Lydafspilningsspor"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Playback Track"
-msgstr "Stop animation afspilning. (S)"
+msgstr "Animation-afspilningsspor"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
-msgstr "Anim Tilføj Spor"
+msgstr "Tilføj Spor"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Length Time (seconds)"
-msgstr "Animations Længde (i sekunder)."
+msgstr "Animations længde (i sekunder)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "Animation Zoom."
+msgstr "Animationsløkke"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -166,39 +162,35 @@ msgstr "Funktioner:"
#: editor/animation_track_editor.cpp
msgid "Audio Clips:"
-msgstr ""
+msgstr "Lydklip:"
#: editor/animation_track_editor.cpp
msgid "Anim Clips:"
-msgstr ""
+msgstr "Anim klip:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Toggle this track on/off."
-msgstr "Skift distraktions-fri modus."
+msgstr "Slå spor til/fra."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "Opdateringstilstand (Hvordan denne egenskab er sat)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Interpolation Mode"
-msgstr "Distraktions Fri Modus"
+msgstr "Interpolationsmetode"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "Lykke omviklingstilstand (Interpoler med begyndelsen af lykken)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "Fjern valgte spor."
+msgstr "Fjern spor."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "Tid:"
+msgstr "Tid (s): "
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -214,11 +206,11 @@ msgstr "Udløser"
#: editor/animation_track_editor.cpp
msgid "Capture"
-msgstr ""
+msgstr "Optag"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "Nærmest"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
@@ -227,30 +219,28 @@ msgstr "Lineær"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr ""
+msgstr "Kubik"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
-msgstr ""
+msgstr "Klamme Løkke Interpolation"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "Vikle Løkke Interpolation"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key"
-msgstr ""
+msgstr "Indsæt nøgle"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "Anim Dublikér Nøgle"
+msgstr "Dublikér nøgle(r)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "Anim Slet Nøgler"
+msgstr "Slet nøgle(r)"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -268,7 +258,6 @@ msgstr "Opret %d NYE spor og indsæt nøgler?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -280,7 +269,7 @@ msgstr "Anim Indsæt"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
-msgstr ""
+msgstr "Animationsafspiller kan ikke animere sig selv, kun andre afspillere."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
@@ -296,7 +285,7 @@ msgstr "Anim Indsæt Nøgle"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr ""
+msgstr "Transformeringsspor kan kun anvendes på rumlige noder."
#: editor/animation_track_editor.cpp
msgid ""
@@ -305,35 +294,39 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"Lydspor kan kun pege på noder af typen:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "Animationsspor kan kun pege på AnimationPlayer noder."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
msgstr ""
+"En animationsafspiller kan ikke animerer sig selv, kun andre afspillere."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "Det er ikke muligt at tilføje et nyt spor uden en rod"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "Sporstien er ugyldig, så kan ikke tilføje en nøgle."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "Spor er ikke af typen Spatial, kan ikke indsætte nøgle"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
-msgstr ""
+msgstr "Sporstien er ugyldig, så kan ikke tilføje en metode nøgle."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Method not found in object: "
-msgstr "VariableGet blev ikke fundet i scriptet: "
+msgstr "Metode ikke fundet i objekt: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
@@ -341,7 +334,7 @@ msgstr "Anim Flyt Nøgle"
#: editor/animation_track_editor.cpp
msgid "Clipboard is empty"
-msgstr ""
+msgstr "Udklipsholder er tom"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
@@ -351,24 +344,24 @@ msgstr "Anim Skaler Nøgler"
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
msgstr ""
+"Denne mulighed virker ikke for Bezier-redigering, da det kun er et enkelt "
+"spor."
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "Vis kun spor fra noder valgt in træ."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr ""
+msgstr "Grupper spor efter node eller vis dem som almindelig liste."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap (s): "
-msgstr "Trin:"
+msgstr "Trin: "
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "Animation Zoom."
+msgstr "Animation trin værdi."
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -380,19 +373,16 @@ msgid "Edit"
msgstr "Rediger"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "Animation Zoom."
+msgstr "Animation egenskaber."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "Kopier Parametre"
+msgstr "Kopier Spor"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "Indsæt Parametre"
+msgstr "Indsæt Spor"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -402,8 +392,7 @@ msgstr "Skalér Valgte"
msgid "Scale From Cursor"
msgstr "Skaler Fra Cursor"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Duplikér Valgte"
@@ -412,17 +401,16 @@ msgid "Duplicate Transposed"
msgstr "Duplicate transposed"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
msgstr "Slet Valgte"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
-msgstr "Gå Til Næste Trin"
+msgid "Go to Next Step"
+msgstr "Gå til Næste Trin"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
-msgstr "GÃ¥ Til Forrige Trin"
+msgid "Go to Previous Step"
+msgstr "GÃ¥ til Forrige Trin"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
@@ -430,19 +418,19 @@ msgstr "Optimer Animation"
#: editor/animation_track_editor.cpp
msgid "Clean-Up Animation"
-msgstr "Clean-Up Animation"
+msgstr "Ryd op Animation"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "Vælg noden der vil blive animeret:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "Brug Bezier Kurver"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
-msgstr "Anim. optimizer"
+msgstr "Anim. optimerer"
#: editor/animation_track_editor.cpp
msgid "Max. Linear Error:"
@@ -486,7 +474,7 @@ msgstr "Skalaforhold:"
#: editor/animation_track_editor.cpp
msgid "Select tracks to copy:"
-msgstr ""
+msgstr "Vælg spor til kopiering:"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -524,11 +512,11 @@ msgstr "Ingen Match"
msgid "Replaced %d occurrence(s)."
msgstr "Erstattede %d forekomst(er)."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Match stor/lille"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "Hele Ord"
@@ -544,28 +532,31 @@ msgstr "Erstat Alle"
msgid "Selection Only"
msgstr "Kun Valgte"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Zoom Ind"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "Zoom Ud"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "Nulstil Zoom"
#: editor/code_editor.cpp
msgid "Warnings:"
-msgstr ""
+msgstr "Advarsler:"
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "Zoom Ind"
+msgid "Font Size:"
+msgstr "Skrifttype Størrelse:"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Linje:"
@@ -598,6 +589,7 @@ msgstr "Tilføj"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -654,9 +646,8 @@ msgid "Disconnect '%s' from '%s'"
msgstr "Afbryd '%s' fra '%s'"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect all from signal: '%s'"
-msgstr "Afbryd '%s' fra '%s'"
+msgstr "Frakoble alt fra signal: '%s'"
#: editor/connections_dialog.cpp
msgid "Connect..."
@@ -668,18 +659,17 @@ msgid "Disconnect"
msgstr "Afbryd"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect Signal: "
-msgstr "Forbindelses Signal:"
+msgstr "Forbind Signal: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection: "
-msgstr "Forbindelses fejl"
+msgstr "Redigere Forbindelse: "
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
+"Er du sikker på at du vil fjerne alle forbindelser fra \"%s\" signalet?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -687,22 +677,19 @@ msgstr "Signaler"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr ""
+msgstr "Er du sikker på at du vil fjerne alle forbindelser fra dette signal?"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "Afbryd"
+msgstr "Frakoble Alt"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit..."
-msgstr "Rediger"
+msgstr "Rediger..."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "Metoder"
+msgstr "GÃ¥ til Metode"
#: editor/create_dialog.cpp
msgid "Change %s Type"
@@ -727,23 +714,20 @@ msgid "Recent:"
msgstr "Seneste:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Søgning:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "Matches:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "Beskrivelse:"
@@ -782,8 +766,7 @@ msgid "Resource"
msgstr "Ressource"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "Sti"
@@ -804,9 +787,10 @@ msgid "Search Replacement Resource:"
msgstr "Søg Erstatnings Ressource:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -830,7 +814,6 @@ msgstr ""
"Fjern dem alligevel? (ej fortrydes)"
#: editor/dependency_editor.cpp editor/export_template_manager.cpp
-#, fuzzy
msgid "Cannot remove:"
msgstr "Kan ikke fjerne:"
@@ -839,8 +822,8 @@ msgid "Error loading:"
msgstr "Fejl under indlæsning:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
-msgstr "Indlæs af Scene fejler, fordi den er afhængig af noget der mangler:"
+msgid "Load failed due to missing dependencies:"
+msgstr "Indlæs mislykkedes på grund af manglende afhængigheder:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -898,14 +881,6 @@ msgstr "Ændre Dictionary Værdi"
msgid "Thanks from the Godot community!"
msgstr "Tak fra Godot fællesskabet!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "Ok"
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Godot Engine bidragsydere"
@@ -999,8 +974,8 @@ msgid "Uncompressing Assets"
msgstr "Udpakker Aktiver"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
-msgstr "Pakke Installeret med Succes!"
+msgid "Package installed successfully!"
+msgstr "Pakke installeret med succes!"
#: editor/editor_asset_installer.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -1070,7 +1045,7 @@ msgstr "Solo"
#: editor/editor_audio_buses.cpp
msgid "Mute"
-msgstr "Mute"
+msgstr "Sluk"
#: editor/editor_audio_buses.cpp
msgid "Bypass"
@@ -1081,8 +1056,7 @@ msgid "Bus options"
msgstr "Bus muligheder"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "Duplikere"
@@ -1158,7 +1132,7 @@ msgstr "Indlæs"
#: editor/editor_audio_buses.cpp
msgid "Load an existing Bus Layout."
-msgstr "Indlæs et eksisterende Bus Layout"
+msgstr "Indlæs et eksisterende Bus Layout."
#: editor/editor_audio_buses.cpp
msgid "Save As"
@@ -1210,9 +1184,8 @@ msgid "Rename Autoload"
msgstr "Omdøb Autoload"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Toggle AutoLoad Globals"
-msgstr "Skift Autoload Globals"
+msgstr "Skift AutoIndlæs Globalt"
#: editor/editor_autoload_settings.cpp
msgid "Move Autoload"
@@ -1247,7 +1220,7 @@ msgid "Add AutoLoad"
msgstr "Tilføj AutoLoad"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "Sti:"
@@ -1255,8 +1228,8 @@ msgstr "Sti:"
msgid "Node Name:"
msgstr "Node Navn:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "Navn"
@@ -1326,26 +1299,29 @@ msgid "Template file not found:"
msgstr "Skabelonfil ikke fundet:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Vælg nurværende mappe"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "Filen Eksisterer, Overskrives?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "Vælg nurværende mappe"
+msgid "Select This Folder"
+msgstr "Vælg denne mappe"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
msgstr "Kopier Sti"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Open In File Manager"
-msgstr "Vis I Fil Manager"
+msgid "Open in File Manager"
+msgstr "Åbn i Filhåndtering"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
-msgstr "Vis I Fil Manager"
+msgid "Show in File Manager"
+msgstr "Vis i Filhåndtering"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
@@ -1380,7 +1356,8 @@ msgid "Open a File or Directory"
msgstr "Ã…ben en Fil eller Mappe"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Gem"
@@ -1438,8 +1415,7 @@ msgstr "Mapper & Filer:"
msgid "Preview:"
msgstr "Forhåndsvisning:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "Fil:"
@@ -1455,30 +1431,17 @@ msgstr "Skan Kilder"
msgid "(Re)Importing Assets"
msgstr "(Gen)Importér Aktiver"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "Søg i Hjælp"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "Class Liste:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "Søg Classes"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "Top"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
-msgstr "Class:"
+msgstr "Klasse:"
#: editor/editor_help.cpp editor/scene_tree_editor.cpp
msgid "Inherits:"
-msgstr "Inherits:"
+msgstr "Arver:"
#: editor/editor_help.cpp
msgid "Inherited by:"
@@ -1489,28 +1452,28 @@ msgid "Brief Description:"
msgstr "Kort Beskrivelse:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "Medlemmer"
+msgid "Properties"
+msgstr "Egenskaber"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "Medlemmer:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "Public Methods"
+msgid "Methods"
+msgstr "Metoder"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "Public Methods:"
+msgid "Methods:"
+msgstr "Metoder:"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "GUI Temaelementer"
+msgid "Theme Properties"
+msgstr "Tema Egenskaber"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "GUI Temaelementer:"
+msgid "Theme Properties:"
+msgstr "Tema Egenskaber:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1530,15 +1493,19 @@ msgstr "enum "
#: editor/editor_help.cpp
msgid "Constants"
-msgstr "Constants"
+msgstr "Konstanter"
#: editor/editor_help.cpp
msgid "Constants:"
-msgstr "Constants:"
+msgstr "Konstanter:"
#: editor/editor_help.cpp
-msgid "Description"
-msgstr "Beskrivelse"
+msgid "Class Description"
+msgstr "Klasse beskrivelse"
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
+msgstr "Klasse beskrivelse:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1550,17 +1517,17 @@ msgid ""
"$url]contribute one[/url][/color] or [color=$color][url=$url2]request one[/"
"url][/color]."
msgstr ""
-"Der er i øjeblikket ingen beskrivelse af denne klasse. Det vil være en stor "
-"hjælp, hvis du kan [color=$color][url=$url]bidrage[/url][/color] med en "
-"beskrivelse!"
+"Der er i øjeblikket ingen vejledninger for denne klasse, du kan [color="
+"$color][url=$url]bidrage med en[/url][/color] eller [color=$color][url="
+"$url2]anmode en[/url][/color]."
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "Egenskaber"
+msgid "Property Descriptions"
+msgstr "Egenskab beskrivelser"
#: editor/editor_help.cpp
-msgid "Property Description:"
-msgstr "Beskrivelse af Egenskaber:"
+msgid "Property Descriptions:"
+msgstr "Egenskab beskrivelser:"
#: editor/editor_help.cpp
msgid ""
@@ -1571,12 +1538,12 @@ msgstr ""
"ved at give os dit [color=$color][url=$url]bidrag[/url][/color]!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "Metoder"
+msgid "Method Descriptions"
+msgstr "Metode beskrivelser"
#: editor/editor_help.cpp
-msgid "Method Description:"
-msgstr "Metode Beskrivelse:"
+msgid "Method Descriptions:"
+msgstr "Metode beskrivelser:"
#: editor/editor_help.cpp
msgid ""
@@ -1587,12 +1554,52 @@ msgstr ""
"hjælp, hvis du kan [color=$color][url=$url]bidrage[/url][/color] med en "
"beskrivelse!"
-#: editor/editor_inspector.cpp
-#, fuzzy
-msgid "Property: "
-msgstr "Egenskaber"
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Søg i Hjælp"
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr "Vis alle"
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr "Kun klasser"
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr "Kun metoder"
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr "Kun signaler"
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr "Kun konstanter"
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr "Kun egenskaber"
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr "Kun tema egenskaber"
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr "Medlemstype"
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr "Klasse"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1626,6 +1633,11 @@ msgstr "Projekt eksport fejlede med fejlkode %d."
msgid "Error saving resource!"
msgstr "Fejl, kan ikke gemme ressource!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "Ok"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "Gem Ressource Som..."
@@ -1675,9 +1687,14 @@ msgid "Creating Thumbnail"
msgstr "Opretter Thumbnail"
#: editor/editor_node.cpp
-#, fuzzy
msgid "This operation can't be done without a tree root."
-msgstr "Denne handling kan ikke foretages uden tree root"
+msgstr "Denne handling kan ikke foretages uden en trærod."
+
+#: editor/editor_node.cpp
+msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
#: editor/editor_node.cpp
msgid ""
@@ -1687,8 +1704,11 @@ msgstr ""
"Kunne ikke gemme scene. Der er nogle afhængigheder (forekomster) som ikke "
"kunne opfyldes."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
-#, fuzzy
msgid "Can't load MeshLibrary for merging!"
msgstr "Kan ikke indlæse MeshLibrary til sammenlægning!"
@@ -1697,9 +1717,8 @@ msgid "Error saving MeshLibrary!"
msgstr "Fejl, kan ikke gemme MeshLibrary!"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Can't load TileSet for merging!"
-msgstr "Kan ikke indlæse TileSet til sammenlægning!"
+msgstr "Kan ikke indlæse Flisesæt til sammenlægning!"
#: editor/editor_node.cpp
msgid "Error saving TileSet!"
@@ -1944,6 +1963,14 @@ msgstr "Kan ikke indlæse addon script fra stien: '%s'."
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"Kan ikke indlæse tilføjelse script fra sti: '%s' Der ser ud til at være en "
+"fejl i koden, tjek syntaksen."
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
"Kan ikke indlæse addon script fra sti: '%s' Grund typen er ikke EditorPlugin."
@@ -1991,15 +2018,18 @@ msgstr "Slet Layout"
msgid "Default"
msgstr "Standard"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr "Vis i Filsystem"
+
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play This Scene"
-msgstr "Spil Scenen"
+msgstr "Spil denne Scene"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "Luk"
+msgstr "Luk faneblad"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2018,9 +2048,8 @@ msgid "%d more files"
msgstr "%d flere filer"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Dock Position"
-msgstr "Dock Position"
+msgstr "Dok Position"
#: editor/editor_node.cpp
msgid "Distraction Free Mode"
@@ -2035,7 +2064,6 @@ msgid "Add a new scene."
msgstr "Tilføj en ny scene."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Scene"
msgstr "Scene"
@@ -2064,7 +2092,6 @@ msgid "New Scene"
msgstr "Ny Scene"
#: editor/editor_node.cpp
-#, fuzzy
msgid "New Inherited Scene..."
msgstr "Ny Nedarvet Scene..."
@@ -2077,7 +2104,7 @@ msgid "Save Scene"
msgstr "Gem Scene"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+msgid "Save All Scenes"
msgstr "Gem alle Scener"
#: editor/editor_node.cpp
@@ -2098,7 +2125,7 @@ msgstr "MaskeBibliotek..."
#: editor/editor_node.cpp
msgid "TileSet..."
-msgstr "TileSet..."
+msgstr "Flisesæt..."
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
@@ -2106,14 +2133,13 @@ msgid "Undo"
msgstr "Fortryd"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Annuller Fortyd"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Revert Scene"
-msgstr "Vend Scene Tilbage"
+msgstr "Gendan scene"
#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
@@ -2129,29 +2155,28 @@ msgstr "Projekt Indstillinger"
#: editor/editor_node.cpp editor/project_export.cpp
msgid "Export"
-msgstr "Eksporter"
+msgstr "Eksport"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "Værktøjer"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "Ã…bn Projekt Manager?"
+msgstr "Ã…bn Projekt datamappe"
#: editor/editor_node.cpp
msgid "Quit to Project List"
msgstr "Afslut til Projekt Listen"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-#, fuzzy
+#: editor/project_export.cpp
msgid "Debug"
-msgstr "Debug"
+msgstr "Fejlfinde"
#: editor/editor_node.cpp
msgid "Deploy with Remote Debug"
-msgstr "Implementere med Remote Debug"
+msgstr "Indsætte med Fjern Fejlfind"
#: editor/editor_node.cpp
msgid ""
@@ -2163,7 +2188,7 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Small Deploy with Network FS"
-msgstr "Lille Deploy med Nætværks FS"
+msgstr "Lille Indsættelse med Nætværks FS"
#: editor/editor_node.cpp
msgid ""
@@ -2238,34 +2263,31 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Editor"
-msgstr "Editor"
+msgstr "Redaktør"
#: editor/editor_node.cpp editor/settings_config_dialog.cpp
msgid "Editor Settings"
msgstr "Editor Indstillinger"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Editor Layout"
-msgstr "Editor Layout"
+msgstr "Redaktør opsætning"
#: editor/editor_node.cpp
msgid "Toggle Fullscreen"
msgstr "Skifter fuldskærm"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Data/Settings Folder"
-msgstr "Editor Indstillinger"
+msgstr "Åbn redaktør Data/Indstillinger-mappe"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Settings Folder"
-msgstr "Editor Indstillinger"
+msgstr "Åbn redaktør Indstillinger mappe"
#: editor/editor_node.cpp editor/project_export.cpp
msgid "Manage Export Templates"
@@ -2275,10 +2297,6 @@ msgstr "Organiser Eksport Skabeloner"
msgid "Help"
msgstr "Hjælp"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "Klasser"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2353,9 +2371,8 @@ msgstr ""
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Save & Restart"
-msgstr "Gem & Afslut"
+msgstr "Gem & genstart"
#: editor/editor_node.cpp
msgid "Spins when the editor window repaints!"
@@ -2373,27 +2390,26 @@ msgstr "Opdater Ændringer"
msgid "Disable Update Spinner"
msgstr "Slå Opdaterings Snurrer Fra"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "Inspektør"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "Importer"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "Node"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "Fil System"
#: editor/editor_node.cpp
-#, fuzzy
+msgid "Inspector"
+msgstr "Inspektør"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Node"
+
+#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
-msgstr "Udvid alle"
+msgstr "Udvid nederste panel"
#: editor/editor_node.cpp scene/resources/visual_shader.cpp
msgid "Output"
@@ -2472,9 +2488,8 @@ msgid "Thumbnail..."
msgstr "Miniature..."
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit Plugin"
-msgstr "Rediger Poly"
+msgstr "Redigere tilslutning"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
@@ -2498,9 +2513,8 @@ msgid "Status:"
msgstr "Status:"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit:"
-msgstr "Rediger"
+msgstr "Rediger:"
#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
#: editor/rename_dialog.cpp
@@ -2520,15 +2534,14 @@ msgid "Average Time (sec)"
msgstr "Gennemsnitlig Tid (sek)"
#: editor/editor_profiler.cpp
-#, fuzzy
msgid "Frame %"
-msgstr "Frame %"
+msgstr "Ramme %"
#: editor/editor_profiler.cpp
msgid "Physics Frame %"
msgstr "Fysik Frame %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "Tid:"
@@ -2541,21 +2554,18 @@ msgid "Self"
msgstr "Selv"
#: editor/editor_profiler.cpp
-#, fuzzy
msgid "Frame #:"
-msgstr "Frame #:"
+msgstr "Ramme #:"
#: editor/editor_profiler.cpp
-#, fuzzy
msgid "Time"
-msgstr "Tid:"
+msgstr "Tid"
#: editor/editor_profiler.cpp
-#, fuzzy
msgid "Calls"
msgstr "Kald"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2567,20 +2577,44 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "Ugyldig sti"
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr ""
@@ -2592,10 +2626,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2604,7 +2634,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "Indsæt"
@@ -2617,9 +2648,8 @@ msgstr "Konverter Til %s"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Open Editor"
-msgstr "Ã…bn 2D Editor"
+msgstr "Åbn redaktør"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Selected node is not a Viewport!"
@@ -2736,18 +2766,16 @@ msgid "Can't open export templates zip."
msgstr "Kan ikke åbne eksport skabeloner zip."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Invalid version.txt format inside templates: %s."
-msgstr "Ugyldigt version.txt format inde i skabeloner."
+msgstr "Ugyldigt version.txt format inde i skabeloner: %s."
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
msgstr "Ingen version.txt fundet inde i skabeloner."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Error creating path for templates:"
-msgstr "Fejl ved oprettelse af sti til skabeloner:\n"
+msgstr "Fejl ved oprettelse af sti til skabeloner:"
#: editor/export_template_manager.cpp
msgid "Extracting Export Templates"
@@ -2767,7 +2795,6 @@ msgstr ""
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Can't resolve."
msgstr "Kan ikke løses."
@@ -2783,9 +2810,8 @@ msgstr "Ingen reaktion."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Request Failed."
-msgstr "Foresp. Fejlede."
+msgstr "Forespørgsel mislykkedes."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -2808,14 +2834,12 @@ msgid ""
msgstr ""
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Error requesting url: "
-msgstr "Fejl i anmodning url: "
+msgstr "Fejl ved anmodning af url: "
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Connecting to Mirror..."
-msgstr "Forbinder..."
+msgstr "Forbinder til spejl..."
#: editor/export_template_manager.cpp
msgid "Disconnected"
@@ -2826,9 +2850,8 @@ msgid "Resolving"
msgstr "Løse"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Can't Resolve"
-msgstr "Kan ikke Løses"
+msgstr "Kan ikke løses"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -2836,9 +2859,8 @@ msgid "Connecting..."
msgstr "Forbinder..."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Can't Connect"
-msgstr "Ingen forbindelse"
+msgstr "Kan ikke forbinde"
#: editor/export_template_manager.cpp
msgid "Connected"
@@ -2890,15 +2912,18 @@ msgid "Download Templates"
msgstr "Download Skabeloner"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr "Vælg spejl fra liste: "
+msgstr "Vælg spejl fra liste: (Shift+Click: Åbn i Browser)"
#: editor/file_type_cache.cpp
msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr "Kan ikke skrive til file_type_cache.cch. Gemmer ikke fil type cache!"
#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr "Favoritter"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr "Kan ikke navigere til '%s' da det ikke blev fundet i filsystemet!"
@@ -2944,19 +2969,15 @@ msgstr "Fejl under indlæsning:"
msgid "Unable to update dependencies:"
msgstr "Kan ikke opdatere afhængigheder:\n"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "Intet navn angivet"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "Intet navn angivet."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "Det angivne navn indeholder ugyldige karakterer"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "Intet navn angivet."
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "Navnet indeholder ugyldige karakterer."
@@ -2983,22 +3004,6 @@ msgid "Duplicating folder:"
msgstr "Omdøber mappe:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "Udvid alle"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "Klap alle sammen"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "Omdøb..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "Flyt Til..."
-
-#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Open Scene(s)"
msgstr "Ã…bn Scene"
@@ -3008,6 +3013,16 @@ msgid "Instance"
msgstr "Instans"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Add to favorites"
+msgstr "Favoritter:"
+
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Remove from favorites"
+msgstr "Fjern fra Gruppe"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "Rediger Afhængigheder..."
@@ -3015,12 +3030,20 @@ msgstr "Rediger Afhængigheder..."
msgid "View Owners..."
msgstr "Vis Ejere..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "Omdøb..."
+
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Duplicate..."
msgstr "Duplikere"
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr "Flyt Til..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
msgstr "Hurtig Ã…bn Script..."
@@ -3030,6 +3053,16 @@ msgstr "Hurtig Ã…bn Script..."
msgid "New Resource..."
msgstr "Gem Ressource Som..."
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Expand All"
+msgstr "Udvid alle"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Collapse All"
+msgstr "Klap alle sammen"
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -3051,28 +3084,19 @@ msgstr "Gen-scan Filsystemet"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "Skift mappe status til Favorit"
+msgid "Toggle split mode"
+msgstr "Skifter Modus"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Show current scene file."
-msgstr "Gem den aktuelt redigerede ressource."
+msgid "Search files"
+msgstr "Søg Classes"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "Søg Classes"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3080,7 +3104,7 @@ msgstr ""
"Scanner Filer,\n"
"Vent Venligst..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "Flyt"
@@ -3099,31 +3123,22 @@ msgstr ""
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find in files"
+msgid "Find in Files"
msgstr "%d flere filer"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find: "
+msgid "Find:"
msgstr "Find"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Whole words"
-msgstr "Hele Ord"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "Match stor/lille"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "Opret Mappe"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Filter: "
+msgid "Filters:"
msgstr "Filter:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -3141,6 +3156,11 @@ msgstr "Annuller"
#: editor/find_in_files.cpp
#, fuzzy
+msgid "Find: "
+msgstr "Find"
+
+#: editor/find_in_files.cpp
+#, fuzzy
msgid "Replace: "
msgstr "Erstat"
@@ -3166,7 +3186,7 @@ msgstr "FEJL: Animationsnavn eksisterer allerede!"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr "Ugyldigt navn."
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3305,17 +3325,14 @@ msgstr "Genimporter"
msgid "Failed to load resource."
msgstr "Fejler med at indlæse ressource."
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr ""
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+#, fuzzy
+msgid "Expand All Properties"
msgstr "Udvid alle egenskaber"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+#, fuzzy
+msgid "Collapse All Properties"
msgstr "Klap alle egenskaber sammen"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3361,6 +3378,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "Indlæs en eksisterende ressource fra disk og rediger den."
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "Gem den aktuelt redigerede ressource."
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "GÃ¥ til det forrige redigerede objekt i historikken."
@@ -3424,14 +3445,14 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
msgstr "Opret Poly"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+#, fuzzy
+msgid "Edit Polygon"
msgstr "Rediger Poly"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3439,25 +3460,28 @@ msgid "Insert Point"
msgstr "Indsæt Punkt"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+#, fuzzy
+msgid "Edit Polygon (Remove Point)"
msgstr "Rediger Poly (Fjern Punkt)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+#, fuzzy
+msgid "Remove Polygon And Point"
msgstr "Fjern Poly og Punkt"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "Opret en ny polygon fra start"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr "Slet points"
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#, fuzzy
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
"Rediger eksisterende polygon:\n"
"LMB: Flyt Punkt.\n"
@@ -3465,7 +3489,9 @@ msgstr ""
"RMB: Slet Punkt."
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#, fuzzy
+msgid "Erase points."
msgstr "Slet points"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3481,7 +3507,7 @@ msgstr "Tilføj animation"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
+msgid "Load..."
msgstr "Indlæs"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3510,15 +3536,9 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Slet points"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "Slet points"
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3559,9 +3579,8 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3596,7 +3615,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
-msgid "Add Node.."
+msgid "Add Node..."
msgstr "Tilføj Node"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3878,7 +3897,7 @@ msgstr "Forbind Nodes"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "Fjern valgte spor."
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3947,10 +3966,6 @@ msgid "Amount:"
msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr ""
@@ -4151,7 +4166,7 @@ msgstr "Alle"
msgid "Plugins"
msgstr ""
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "Sorter:"
@@ -4276,6 +4291,10 @@ msgid "Resize CanvasItem"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
msgstr ""
@@ -4296,21 +4315,19 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "Zoom Ud"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "Zoom Ud"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Zoom Ind"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4339,6 +4356,11 @@ msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "Skifter Modus"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4434,6 +4456,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "Singleton"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr ""
@@ -4485,6 +4512,10 @@ msgid "Show Viewport"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr ""
@@ -4555,8 +4586,17 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr ""
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "Opret Poly"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Rediger Poly"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Rediger Poly (Fjern Punkt)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
@@ -4658,35 +4698,9 @@ msgid "Item List Editor"
msgstr ""
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr ""
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr ""
@@ -4920,12 +4934,12 @@ msgid "Populate"
msgstr ""
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
+msgid "Generating Visibility Rect"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -4954,6 +4968,12 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "Convert to CPUParticles"
+msgstr "Konverter Til %s"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr ""
@@ -5023,13 +5043,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "Konverter Til %s"
+msgid "Generate AABB"
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5053,6 +5072,11 @@ msgid "Add Point to Curve"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "Rediger Node Kurve"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr ""
@@ -5080,6 +5104,10 @@ msgid "Click: Add Point"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr ""
@@ -5095,11 +5123,6 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr ""
@@ -5160,6 +5183,10 @@ msgstr "Fjern Funktion"
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5171,7 +5198,13 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync bones"
+msgid "Sync Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5184,40 +5217,46 @@ msgid "Create Polygon & UV"
msgstr "Opret Poly"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "Opret ny horisontal guide"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
+#, fuzzy
+msgid "Remove Internal Vertex"
+msgstr "Fjern vertikal guide"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "Autoload '%s' eksisterer allerede!"
+msgid "Add Custom Polygon"
+msgstr "Rediger Poly"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Add Split"
-msgstr "Tilføj punkt"
+msgid "Remove Custom Polygon"
+msgstr "Fjern Poly og Punkt"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Invalid Split: "
-msgstr "Ugyldig sti"
+msgid "Transform UV Map"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Fjern punkt"
+msgid "Transform Polygon"
+msgstr "Opret Poly"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Transform UV Map"
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
-msgstr ""
+#, fuzzy
+msgid "Open Polygon 2D UV editor."
+msgstr "Ã…bn 2D Editor"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
@@ -5229,12 +5268,13 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "Rediger Poly"
+msgid "Points"
+msgstr "Fjern punkt"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Splits"
-msgstr ""
+#, fuzzy
+msgid "Polygons"
+msgstr "Rediger Poly"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Bones"
@@ -5242,12 +5282,8 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
-msgstr "Opret Poly"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
-msgstr ""
+msgid "Move Points"
+msgstr "Fjern punkt"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
@@ -5274,19 +5310,21 @@ msgid "Scale Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Select a split to erase it"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5311,6 +5349,11 @@ msgid "Grid Settings"
msgstr "Editor Indstillinger"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr ""
@@ -5368,22 +5411,22 @@ msgid "Paste Resource"
msgstr "Indsæt Ressource"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr ""
@@ -5416,6 +5459,11 @@ msgstr "Error loading skrifttype."
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
+msgid "Error: could not load file."
+msgstr "Fejl - kunne ikke oprette script i filsystem."
+
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Error could not load file."
msgstr "Fejl - kunne ikke oprette script i filsystem."
@@ -5425,20 +5473,24 @@ msgid "Error saving file!"
msgstr "Fejl, kan ikke gemme TileSet!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr ""
+#, fuzzy
+msgid "Error while saving theme."
+msgstr "Fejl, under forsøg på at gemme."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
-msgstr ""
+#, fuzzy
+msgid "Error Saving"
+msgstr "Fejl i flytning:\n"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr ""
+#, fuzzy
+msgid "Error importing theme."
+msgstr "Error loading skrifttype."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
-msgstr ""
+#, fuzzy
+msgid "Error Importing"
+msgstr "Fejl i flytning:\n"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -5460,6 +5512,14 @@ msgid "Import Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr ""
@@ -5501,8 +5561,8 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile"
-msgstr "Vis filer"
+msgid "Open..."
+msgstr "Ã…ben"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5519,12 +5579,8 @@ msgstr "Kopier Sti"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Show In File System"
-msgstr "Vis I Fil Manager"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
-msgstr ""
+msgid "History Previous"
+msgstr "Forrige fane"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
@@ -5536,15 +5592,16 @@ msgid "Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Reload Theme"
-msgstr ""
+#, fuzzy
+msgid "Import Theme..."
+msgstr "Importerer Scene..."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme"
+msgid "Reload Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
+msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5594,7 +5651,8 @@ msgid "Keep Debugger Open"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+#, fuzzy
+msgid "Debug with External Editor"
msgstr "Debug med ekstern editor"
#: editor/plugins/script_editor_plugin.cpp
@@ -5602,10 +5660,6 @@ msgid "Open Godot online documentation"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -5641,19 +5695,9 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Search results"
+msgid "Search Results"
msgstr "Søg i Hjælp"
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "Søg Classes"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
@@ -5664,6 +5708,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "Tilføj Funktion"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr ""
@@ -5695,10 +5748,6 @@ msgstr ""
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5751,12 +5800,14 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
-msgstr ""
+#, fuzzy
+msgid "Convert Indent to Spaces"
+msgstr "Konverter Til %s"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
-msgstr ""
+#, fuzzy
+msgid "Convert Indent to Tabs"
+msgstr "Konverter Til %s"
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
@@ -5772,20 +5823,14 @@ msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr ""
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "Gå Til Næste Trin"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr "Konverter til små bogstaver"
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "Skift/Toggle Breakpoint"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
@@ -5793,16 +5838,18 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr "Filtrer filer..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
-msgstr ""
+#, fuzzy
+msgid "Go to Function..."
+msgstr "Fjern Funktion"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
-msgstr ""
+#, fuzzy
+msgid "Go to Line..."
+msgstr "GÃ¥ til linje"
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
@@ -5897,6 +5944,14 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -6062,6 +6117,10 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -6163,10 +6222,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap To Floor"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6283,6 +6338,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
msgstr ""
@@ -6400,11 +6459,16 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6569,12 +6633,17 @@ msgid "Fix Invalid Tiles"
msgstr "Ugyldigt navn."
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "Ryd Markerede"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Line Draw"
-msgstr "Line Draw"
+msgstr "Linje Streg"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Rectangle Paint"
@@ -6615,33 +6684,38 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "Fjern Markering"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
+msgid "Rotate left"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
+msgid "Rotate right"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Flip vertically"
msgstr ""
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Clear transform"
+msgstr "Anim Skift Transformering"
+
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr "Tilføj Node(r) fra Tree"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr "Fjern Kurve Punkt"
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6653,25 +6727,47 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "Indsæt Spor"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "Slet points"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "Opret Poly"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "Fjern Kurve Punkt"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6679,7 +6775,12 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Fjern Template"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6689,16 +6790,27 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "Slet markerede filer?"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr ""
+msgstr "Gem den aktuelt redigerede ressource."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "Slet points"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr "Gem den aktuelt redigerede ressource."
@@ -6717,12 +6829,100 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr "Gem den aktuelt redigerede ressource."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Opret Mappe"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "Rediger filtre"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Rediger Poly"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Rediger Poly"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Rediger Poly"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "Indsæt Spor"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Fjern Template"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "Fjern Poly og Punkt"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "Fjern Funktion"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "Fjern Animation"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "Rediger filtre"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Opret Poly"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Opret Poly"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "This property can't be changed."
msgstr "Denne handling kan ikke udføres uden en scene."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Tile Set"
+msgid "TileSet"
msgstr "TileSet..."
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6759,6 +6959,15 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Exporting All"
+msgstr "Eksporter"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6767,6 +6976,11 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "Eksporter Projekt"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6821,10 +7035,50 @@ msgid "Feature List:"
msgstr "Funktions Liste:"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "Kør Script"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Script Export Mode:"
+msgstr "Eksporter Projekt"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export mode?"
+msgstr "Eksporter Projekt"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Export All"
+msgstr "Eksporter"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -6957,7 +7211,8 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
-msgid "Can't open project"
+#, fuzzy
+msgid "Can't open project at '%s'."
msgstr "Kan ikke åbne projekt"
#: editor/project_manager.cpp
@@ -6966,6 +7221,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7286,10 +7559,6 @@ msgstr ""
msgid "General"
msgstr "Generelt"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7423,10 +7692,6 @@ msgstr "Vælg en Node"
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr "Vælg Property"
@@ -7516,7 +7781,7 @@ msgid "Step"
msgstr "Trin:"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7525,7 +7790,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7568,7 +7833,7 @@ msgstr ""
msgid "Reset"
msgstr "Nulstil Zoom"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7627,6 +7892,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr "Ryd Script"
@@ -7663,6 +7932,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7738,6 +8013,11 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Open documentation"
+msgstr "Ã…ben Seneste"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr ""
@@ -7746,12 +8026,13 @@ msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Change Type"
-msgstr ""
+#, fuzzy
+msgid "Extend Script"
+msgstr "Ã…ben script"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -7905,6 +8186,10 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -7994,19 +8279,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -8039,18 +8312,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -8248,7 +8509,8 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+#, fuzzy
+msgid "Step argument is zero!"
msgstr "trin argument er nul!"
#: modules/gdscript/gdscript_functions.cpp
@@ -8479,11 +8741,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -8762,6 +9020,10 @@ msgid "Base Type:"
msgstr "Basis Type:"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "Medlemmer:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "Tilgængelige Noder:"
@@ -8866,11 +9128,11 @@ msgid "Search VisualScript"
msgstr "Fjern VisualScript Node"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8967,6 +9229,12 @@ msgstr ""
"En figur skal gives CollisionShape2D for at det fungerer. Opret venligst en "
"figur ressource for den!"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -9013,6 +9281,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -9141,6 +9415,16 @@ msgstr ""
"En figur skal gives for at CollisionShape fungerer. Opret en figur ressource "
"til det!"
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -9164,6 +9448,30 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+"PathFollow2D virker kun, når den angives som et barn af en Path2D node."
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+"PathFollow2D virker kun, når den angives som et barn af en Path2D node."
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9198,7 +9506,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9258,6 +9566,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr ""
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr ""
@@ -9274,11 +9586,6 @@ msgstr "Advarsel!"
msgid "Please Confirm..."
msgstr "Bekræft venligst..."
-#: scene/gui/file_dialog.cpp
-#, fuzzy
-msgid "Select this Folder"
-msgstr "Vælg Method"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9289,6 +9596,10 @@ msgstr ""
"popup*() funktionerne. At gøre dem synlige for redigering er fint, men de "
"bliver skjult under afvikling."
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9338,10 +9649,6 @@ msgstr "Ugyldig skriftstørrelse."
msgid "Input"
msgstr ""
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
@@ -9359,6 +9666,100 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Split already exists."
+#~ msgstr "Autoload '%s' eksisterer allerede!"
+
+#, fuzzy
+#~ msgid "Add Split"
+#~ msgstr "Tilføj punkt"
+
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr "Ugyldig sti"
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "Fjern punkt"
+
+#, fuzzy
+#~ msgid "Poly"
+#~ msgstr "Rediger Poly"
+
+#~ msgid "No name provided"
+#~ msgstr "Intet navn angivet"
+
+#, fuzzy
+#~ msgid "Add Node.."
+#~ msgstr "Tilføj Node"
+
+#~ msgid "Create Poly"
+#~ msgstr "Opret Poly"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "Opret en ny polygon fra start"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "Zoom Ud"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "Zoom Ind"
+
+#, fuzzy
+#~ msgid "New TextFile"
+#~ msgstr "Vis filer"
+
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Zoom Ind"
+
+#~ msgid "Class List:"
+#~ msgstr "Class Liste:"
+
+#~ msgid "Search Classes"
+#~ msgstr "Søg Classes"
+
+#~ msgid "Public Methods"
+#~ msgstr "Public Methods"
+
+#~ msgid "Public Methods:"
+#~ msgstr "Public Methods:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "GUI Temaelementer"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "GUI Temaelementer:"
+
+#, fuzzy
+#~ msgid "Property: "
+#~ msgstr "Egenskaber"
+
+#, fuzzy
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "Skift mappe status til Favorit"
+
+#, fuzzy
+#~ msgid "Show current scene file."
+#~ msgstr "Gem den aktuelt redigerede ressource."
+
+#, fuzzy
+#~ msgid "Whole words"
+#~ msgstr "Hele Ord"
+
+#, fuzzy
+#~ msgid "Match case"
+#~ msgstr "Match stor/lille"
+
+#, fuzzy
+#~ msgid "Search in files"
+#~ msgstr "Søg Classes"
+
+#~ msgid "Convert To Lowercase"
+#~ msgstr "Konverter til små bogstaver"
+
#~ msgid "Disabled"
#~ msgstr "Deaktiveret"
@@ -9383,9 +9784,6 @@ msgstr ""
#~ msgid "Anim Track Change Wrap Mode"
#~ msgstr "Anim Skift Spor Wrap Mode"
-#~ msgid "Edit Node Curve"
-#~ msgstr "Rediger Node Kurve"
-
#~ msgid "Edit Selection Curve"
#~ msgstr "Rediger Valgte Kurve"
@@ -9459,12 +9857,6 @@ msgstr ""
#~ msgid "Ugh"
#~ msgstr "Ugh"
-#~ msgid "Run Script"
-#~ msgstr "Kør Script"
-
-#~ msgid "Save the currently edited resource."
-#~ msgstr "Gem den aktuelt redigerede ressource."
-
#~ msgid "Stop Profiling"
#~ msgstr "Stop Profilering"
diff --git a/editor/translations/de.po b/editor/translations/de.po
index 641d06841b..dabd25d797 100644
--- a/editor/translations/de.po
+++ b/editor/translations/de.po
@@ -1,6 +1,6 @@
# German translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# Alexander Mahr <alex.mahr@gmail.com>, 2016.
# Andreas Esau <andreasesau@gmail.com>, 2016.
@@ -23,7 +23,7 @@
# Peter Friedland <peter_friedland@gmx.de>, 2016.
# No need for a name <endoplasmatik@gmx.net>, 2016.
# Sönke <me@eknoes.de>, 2018.
-# So Wieso <sowieso@dukun.de>, 2016-2018.
+# So Wieso <sowieso@dukun.de>, 2016-2018, 2019.
# Tim Schellenberg <smwleod@gmail.com>, 2017.
# Timo Schwarzer <account@timoschwarzer.com>, 2016-2018.
# viernullvier <hannes.breul+github@gmail.com>, 2016.
@@ -31,12 +31,17 @@
# Gordon <gkone@gmx.net>, 2018.
# chillhelm <wilhelm@neubert.online>, 2018.
# Mathias Schmalisch <mathias.schmalisch@gmail.com>, 2018.
+# Robin Bauknecht <robin.bauknecht@gmail.com>, 2018.
+# Julian Retzlaff <julian.retzlaff@googlemail.com>, 2018.
+# asyncial <mahlburg@posteo.de>, 2018.
+# ssantos <ssantos@web.de>, 2018.
+# Rémi Verschelde <akien@godotengine.org>, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2018-08-14 08:38+0000\n"
-"Last-Translator: Mathias Schmalisch <mathias.schmalisch@gmail.com>\n"
+"PO-Revision-Date: 2019-01-13 15:07+0000\n"
+"Last-Translator: Rémi Verschelde <akien@godotengine.org>\n"
"Language-Team: German <https://hosted.weblate.org/projects/godot-engine/"
"godot/de/>\n"
"Language: de\n"
@@ -44,7 +49,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.2-dev\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -53,7 +58,7 @@ msgstr ""
"Ungültiger Argument-Typ in convert()-Aufruf, TYPE_*-Konstanten benötigt."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
@@ -61,34 +66,31 @@ msgstr ""
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Ungültige Eingabe %i (nicht bestanden) in Ausdruck"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "'self' kann nicht benutzt werden da die Instanz null ist (ungültig)"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "Ungültiger Indexeigenschaftsname ‚%s‘ in Node %s."
+msgstr "Ungültige Operanden für Operator %s: %s und %s."
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid index of type %s for base type %s"
-msgstr "Ungültiger Indexeigenschaftsname ‚%s‘ in Node %s."
+msgstr "Ungültiger Index des Typs ‚%s‘ für Grundtyp %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "Ungültiger benannter Index ‚%s‘ für Grundtyp %s"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid arguments to construct '%s'"
-msgstr ": Ungültiger Parameter vom Typ: "
+msgstr "Ungültige Parameter für die Konstruktion von ‚%s‘"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "Im Aufruf von ‚%s‘:"
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -97,27 +99,23 @@ msgstr "Kostenlos"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "Ausgeglichen"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Mirror"
-msgstr "X-Koordinaten spiegeln"
+msgstr "Gespiegelt"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "Schlüsselbild einfügen"
+msgstr "Hier Schlüsselbild einfügen"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "Auswahl duplizieren"
+msgstr "Ausgewählte Schlüssel duplizieren"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "Ausgewähltes löschen"
+msgstr "Ausgewählte Schlüssel löschen"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -148,46 +146,40 @@ msgid "Anim Change Call"
msgstr "Aufruf ändern"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Property Track"
-msgstr "Eigenschaft:"
+msgstr "Eigenschaftenspur"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "3D Transform Track"
-msgstr "Typ der Transformation"
+msgstr "3D-Transformspur"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "Methodenaufrufsspur"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "Bezierkurvenspur"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "Audiospur"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Playback Track"
-msgstr "Stoppe Animations-Wiedergabe. (S)"
+msgstr "Animationsspielerspur"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
msgstr "Spur hinzufügen"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Length Time (seconds)"
-msgstr "Animationsdauer (in Sekunden)."
+msgstr "Animationsdauer (in Sekunden)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "Animation zoomen."
+msgstr "Animationswiederholung"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -195,42 +187,36 @@ msgid "Functions:"
msgstr "Funktionen:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Audio Clips:"
-msgstr "Audiosenke"
+msgstr "Audioschnipsel:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Clips:"
-msgstr "Ausschnitte"
+msgstr "Animationsschnipsel:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Toggle this track on/off."
-msgstr "Ablenkungsfreien Modus umschalten."
+msgstr "Diese Spur an-/abschalten."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "Aktualisierungs-Modus (wie Eigenschaften gesetzt werden)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Interpolation Mode"
-msgstr "Animations-Node"
+msgstr "Interpolationsmodus"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "Schleifen-Wiederhol-Modus (Interpoliert Ende und Start der Schleife)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "Ausgewählte Spur entfernen."
+msgstr "Diese Spur entfernen."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "Überblendungszeit (s):"
+msgstr "Zeit (s): "
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -245,13 +231,12 @@ msgid "Trigger"
msgstr "Auslöser"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Capture"
-msgstr "Funktionen"
+msgstr "Aufnahme"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "Nächste"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
@@ -260,16 +245,15 @@ msgstr "Linear"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr ""
+msgstr "Kubisch"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clamp Loop Interp"
-msgstr "Ändere Animationswiederholung"
+msgstr "Klammer-Wdrhol-Interpol"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "Wickel-Wdrhol-Interpol"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -277,14 +261,12 @@ msgid "Insert Key"
msgstr "Schlüsselbild einfügen"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "Dupliziere Node(s)"
+msgstr "Schlüsselbilder duplizieren"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "Node(s) löschen"
+msgstr "Schlüsselbilder entfernen"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -302,7 +284,6 @@ msgstr "%d NEUE Spuren erstellen und Schlüsselbilder hinzufügen?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -314,7 +295,7 @@ msgstr "Einfügen"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
-msgstr ""
+msgstr "AnimationPlayer kann sich nicht selbst animieren, nur andere Objekte."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
@@ -330,7 +311,7 @@ msgstr "Schlüsselbild einfügen"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr ""
+msgstr "Transformationsspuren gelten nur für Nodes die auf Spatial basieren."
#: editor/animation_track_editor.cpp
msgid ""
@@ -339,44 +320,49 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"Audiospuren können nur auf die folgenden Objekte zeigen:\n"
+"- AudioStreamPlayer\n"
+"- AudioStreamPlayer2D\n"
+"- AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "Animationsspuren können nur auf AnimationPlayer-Nodes zeigen."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
msgstr ""
+"Ein AnimationPlayer kann sich nicht selbst animieren, nur andere Objekte."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "Ohne eine Wurzel kann keine neue Spur hinzugefügt werden"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "Spurpfad ist ungültig, Schlüssel kann nicht hinzugefügt werden."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
msgstr ""
+"Spur ist nicht vom Typ Spatial, Schlüssel kann nicht hinzugefügt werden"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
msgstr ""
+"Spurpfad ist ungültig, Methoden-Schlüssel kann nicht hinzugefügt werden."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Method not found in object: "
-msgstr "VariableGet nicht im Skript gefunden: "
+msgstr "Methode nicht im Objekt gefunden: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
msgstr "Schlüsselbilder bewegen"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clipboard is empty"
-msgstr "Zwischenablage ist leer!"
+msgstr "Zwischenablage ist leer"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
@@ -386,24 +372,24 @@ msgstr "Schlüsselbilder skalieren"
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
msgstr ""
+"Die Option ist nicht in Verbindung mit Bezier-Bearbeitung verwendbar, da es "
+"sich nur um eine einzige Spur handelt."
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "Nur Spuren der aktuell ausgewählten Nodes anzeigen."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr ""
+msgstr "Spuren nach Node gruppieren oder nacheinander anzeigen."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap (s): "
-msgstr "Einrasten (Pixel):"
+msgstr "Einrasten (s): "
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "Animationsbaum ist gültig."
+msgstr "Animationsschrittwert."
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -415,19 +401,16 @@ msgid "Edit"
msgstr "Bearbeiten"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "AnimationTree"
+msgstr "Animationseigenschaften."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "Parameter kopieren"
+msgstr "Spuren kopieren"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "Parameter einfügen"
+msgstr "Spuren einfügen"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -437,8 +420,7 @@ msgstr "Auswahl skalieren"
msgid "Scale From Cursor"
msgstr "Vom Cursor skalieren"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Auswahl duplizieren"
@@ -447,17 +429,16 @@ msgid "Duplicate Transposed"
msgstr "Transponierte duplizieren"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
-msgstr "Ausgewähltes löschen"
+msgstr "Auswahl löschen"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
-msgstr "Gehe zum nächsten Schritt"
+msgid "Go to Next Step"
+msgstr "Zum nächsten Schritt"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
-msgstr "Gehe zum vorherigen Schritt"
+msgid "Go to Previous Step"
+msgstr "Zum vorherigen Schritt"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
@@ -469,11 +450,11 @@ msgstr "Animation bereinigen"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "Zu animierendes Node auswählen:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "Bezier-Kurven nutzen"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
@@ -521,7 +502,7 @@ msgstr "Skalierungsverhältnis:"
#: editor/animation_track_editor.cpp
msgid "Select tracks to copy:"
-msgstr ""
+msgstr "Zu kopierende Spuren auswählen:"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -559,11 +540,11 @@ msgstr "Keine Übereinstimmungen"
msgid "Replaced %d occurrence(s)."
msgstr "Suchbegriff wurde %d mal ersetzt."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Groß-/Kleinschreibung berücksichtigen"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "Ganze Wörter"
@@ -579,29 +560,31 @@ msgstr "Alle ersetzen"
msgid "Selection Only"
msgstr "Nur Auswahl"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Vergrößern"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "Verkleinern"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "Vergrößerung zurücksetzen"
#: editor/code_editor.cpp
-#, fuzzy
msgid "Warnings:"
-msgstr "Warnungen"
+msgstr "Warnungen:"
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "Vergrößerung (%):"
+msgid "Font Size:"
+msgstr "Schriftgröße:"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Zeile:"
@@ -634,6 +617,7 @@ msgstr "Hinzufügen"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -690,9 +674,8 @@ msgid "Disconnect '%s' from '%s'"
msgstr "'%s' von '%s' trennen"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect all from signal: '%s'"
-msgstr "'%s' von '%s' trennen"
+msgstr "Alle Verbindungen des Signal trennen: ‚%s‘"
#: editor/connections_dialog.cpp
msgid "Connect..."
@@ -704,19 +687,16 @@ msgid "Disconnect"
msgstr "Trennen"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect Signal: "
-msgstr "Signal verbinden:"
+msgstr "Signal verbinden: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection: "
-msgstr "Verbindungen bearbeiten"
+msgstr "Verbindung bearbeiten: "
#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "Are you sure you want to remove all connections from the \""
-msgstr "Sollen wirklich mehrere Projekte ausgeführt werden?"
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr "Sollen wirklich alle Verbindungen des Signals „%s“ entfernt werden?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -724,22 +704,19 @@ msgstr "Signale"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr ""
+msgstr "Sollen wirklich alle Verbindungen mit diesem Signal entfernt werden?"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "Trennen"
+msgstr "Alle Verbindungen lösen"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit..."
-msgstr "Bearbeiten"
+msgstr "Bearbeiten..."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "Methoden"
+msgstr "Zur Methode springen"
#: editor/create_dialog.cpp
msgid "Change %s Type"
@@ -764,23 +741,20 @@ msgid "Recent:"
msgstr "Kürzlich:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Suche:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "Treffer:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "Beschreibung:"
@@ -819,8 +793,7 @@ msgid "Resource"
msgstr "Ressource"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "Pfad"
@@ -841,9 +814,10 @@ msgid "Search Replacement Resource:"
msgstr "Ersatzressource suchen:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -878,9 +852,8 @@ msgid "Error loading:"
msgstr "Fehler beim Laden:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
-msgstr ""
-"Die Szene konnte aufgrund fehlender Abhängigkeiten nicht geladen werden:"
+msgid "Load failed due to missing dependencies:"
+msgstr "Ladefehler aufgrund fehlender Abhängigkeiten:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -939,14 +912,6 @@ msgstr "Wörterbuchwert ändern"
msgid "Thanks from the Godot community!"
msgstr "Die Godot-Gemeinschaft bedankt sich!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "OK"
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Mitwirkende der Godot Engine"
@@ -1041,8 +1006,8 @@ msgid "Uncompressing Assets"
msgstr "Inhalte werden entpackt"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
-msgstr "Das Paket wurde erfolgreich installiert!"
+msgid "Package installed successfully!"
+msgstr "Paket erfolgreich installiert!"
#: editor/editor_asset_installer.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -1123,8 +1088,7 @@ msgid "Bus options"
msgstr "Audiobusoptionen"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "Duplizieren"
@@ -1289,7 +1253,7 @@ msgid "Add AutoLoad"
msgstr "Autoload hinzufügen"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "Pfad:"
@@ -1297,8 +1261,8 @@ msgstr "Pfad:"
msgid "Node Name:"
msgstr "Node-Name:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "Name"
@@ -1368,26 +1332,29 @@ msgid "Template file not found:"
msgstr "Vorlagendatei nicht gefunden:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Gegenwärtigen Ordner auswählen"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "Datei existiert bereits. Überschreiben?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "Gegenwärtigen Ordner auswählen"
+msgid "Select This Folder"
+msgstr "Diesen Ordner auswählen"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
msgstr "Pfad kopieren"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Open In File Manager"
-msgstr "Zeige im Dateimanager"
+msgid "Open in File Manager"
+msgstr "Im Dateimanager öffnen"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
-msgstr "Zeige im Dateimanager"
+msgid "Show in File Manager"
+msgstr "Im Dateimanager anzeigen"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
@@ -1422,7 +1389,8 @@ msgid "Open a File or Directory"
msgstr "Datei oder Verzeichnis öffnen"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Speichern"
@@ -1480,8 +1448,7 @@ msgstr "Verzeichnisse & Dateien:"
msgid "Preview:"
msgstr "Vorschau:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "Datei:"
@@ -1497,62 +1464,49 @@ msgstr "Lese Quellen"
msgid "(Re)Importing Assets"
msgstr "Importiere Nutzerinhalte erneut"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "Hilfe durchsuchen"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "Klassenliste:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "Klassen suchen"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "Oben"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "Klasse:"
#: editor/editor_help.cpp editor/scene_tree_editor.cpp
msgid "Inherits:"
-msgstr "Erbt:"
+msgstr "Erbt von:"
#: editor/editor_help.cpp
msgid "Inherited by:"
-msgstr "Geerbt von:"
+msgstr "Vererbt an:"
#: editor/editor_help.cpp
msgid "Brief Description:"
msgstr "Kurze Beschreibung:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "Mitglieder"
+msgid "Properties"
+msgstr "Eigenschaften"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "Mitglieder:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr "Eigenschaften:"
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "Öffentliche Methoden"
+msgid "Methods"
+msgstr "Methoden"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "Öffentliche Methoden:"
+msgid "Methods:"
+msgstr "Methoden:"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "GUI-Thema-Elemente"
+msgid "Theme Properties"
+msgstr "Motiv-Eigenschaften"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "GUI-Theme-Elemente:"
+msgid "Theme Properties:"
+msgstr "Motiv-Eigenschaften:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1579,8 +1533,12 @@ msgid "Constants:"
msgstr "Konstanten:"
#: editor/editor_help.cpp
-msgid "Description"
-msgstr "Beschreibung"
+msgid "Class Description"
+msgstr "Klassenbeschreibung"
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
+msgstr "Klassenbeschreibung:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1597,12 +1555,12 @@ msgstr ""
"$url2]Meldung von Problemen[/url][/color] sind sehr erwünscht."
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "Eigenschaften"
+msgid "Property Descriptions"
+msgstr "Eigenschaften-Beschreibung"
#: editor/editor_help.cpp
-msgid "Property Description:"
-msgstr "Eigenschaft-Beschreibung:"
+msgid "Property Descriptions:"
+msgstr "Eigenschaften-Beschreibung:"
#: editor/editor_help.cpp
msgid ""
@@ -1613,11 +1571,11 @@ msgstr ""
"$url]Ergänzungen durch eigene Beiträge[/url][/color] sind sehr erwünscht!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "Methoden"
+msgid "Method Descriptions"
+msgstr "Methoden-Beschreibung"
#: editor/editor_help.cpp
-msgid "Method Description:"
+msgid "Method Descriptions:"
msgstr "Methoden-Beschreibung:"
#: editor/editor_help.cpp
@@ -1628,18 +1586,58 @@ msgstr ""
"Es gibt zurzeit keine Beschreibung dieser Methode. [color=$color][url="
"$url]Ergänzungen durch eigene Beiträge[/url][/color] sind sehr erwünscht!"
-#: editor/editor_inspector.cpp
-#, fuzzy
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Hilfe durchsuchen"
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr "Alles anzeigen"
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr "Nur Klassen"
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr "Nur Methoden"
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr "Nur Signale"
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr "Nur Konstanten"
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr "Nur Eigenschaften"
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr "Nur Motiv-Eigenschaften"
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr "Mitgliedstyp"
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr "Klasse"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
msgstr "Eigenschaft:"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp
msgid "Set"
-msgstr "Setzen"
+msgstr "Setze"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "Setze mehrere:"
#: editor/editor_log.cpp
msgid "Output:"
@@ -1667,6 +1665,11 @@ msgstr "Projekt-Export ist fehlgeschlagen mit Fehlercode %d."
msgid "Error saving resource!"
msgstr "Fehler beim speichern der Ressource!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "OK"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "Speichere Ressource als..."
@@ -1686,6 +1689,8 @@ msgstr "Fehler beim speichern."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
msgstr ""
+"Datei ‚%s‘ kann nicht geöffnet werden. Die Datei könnte verschoben oder "
+"gelöscht sein."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
@@ -1721,12 +1726,25 @@ msgstr "Diese Aktion kann nicht ohne eine Wurzel ausgeführt werden."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+"Diese Szene kann nicht gespeichert werden da sie eine zyklische "
+"Instantiierungshierarchie enthält.\n"
+"Speichern ist erst nach Beheben des Konflikts möglich."
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
"Szene konnte nicht gespeichert werden. Wahrscheinlich werden Abhängigkeiten "
"(Instanzen oder Vererbungen) nicht erfüllt."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr "Momentan geöffnete Szenen können nicht überschrieben werden!"
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr "MeshLibrary konnte nicht zum vereinen geladen werden!"
@@ -1989,6 +2007,14 @@ msgstr "Erweiterungsskript konnte nicht geladen werden: ‚%s‘."
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"Erweiterungsskript konnte nicht von folgendem Pfad geladen werden: ‚%s‘. Es "
+"scheint ein Fehler im Quellcode zu sein. Bitte Syntax überprüfen."
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
"Erweiterungsskript konnte nicht geladen werden: ‚%s‘ Basistyp ist nicht "
@@ -2040,15 +2066,18 @@ msgstr "Layout löschen"
msgid "Default"
msgstr "Standard"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr "Im Dateisystem anzeigen"
+
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play This Scene"
-msgstr "Szene starten"
+msgstr "Diese Szene abspielen"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "Andere Tabs schließen"
+msgstr "Tab schließen"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2123,7 +2152,7 @@ msgid "Save Scene"
msgstr "Szene speichern"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+msgid "Save All Scenes"
msgstr "Alle Szenen speichern"
#: editor/editor_node.cpp
@@ -2144,7 +2173,7 @@ msgstr "Mesh-Bibliothek..."
#: editor/editor_node.cpp
msgid "TileSet..."
-msgstr "TileSet..."
+msgstr "Tile Set…"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
@@ -2152,7 +2181,7 @@ msgid "Undo"
msgstr "Rückgängig machen"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Wiederherstellen"
@@ -2176,20 +2205,20 @@ msgstr "Projekteinstellungen"
msgid "Export"
msgstr "Exportieren"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "Werkzeuge"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "Projektverwaltung öffnen?"
+msgstr "Projektdatenordner öffnen"
#: editor/editor_node.cpp
msgid "Quit to Project List"
msgstr "Verlasse zur Projektverwaltung"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "Debuggen"
@@ -2234,7 +2263,7 @@ msgid ""
"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
"running game if this option is turned on."
msgstr ""
-"Collision-Formen und Raycast Nodes (für 2D und 3D) werden im laufenden Spiel "
+"Collision-Shapes und Raycast-Nodes (für 2D und 3D) werden im laufenden Spiel "
"angezeigt, falls diese Option aktiviert ist."
#: editor/editor_node.cpp
@@ -2298,18 +2327,16 @@ msgid "Toggle Fullscreen"
msgstr "Vollbildmodus umschalten"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Data/Settings Folder"
-msgstr "Editoreinstellungen"
+msgstr "Editordaten-/Einstellungenordner öffnen"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "Editor-Dateiverzeichnis öffnen"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Settings Folder"
-msgstr "Editoreinstellungen"
+msgstr "Editoreinstellungenordner öffnen"
#: editor/editor_node.cpp editor/project_export.cpp
msgid "Manage Export Templates"
@@ -2319,10 +2346,6 @@ msgstr "Verwalte Exportvorlagen"
msgid "Help"
msgstr "Hilfe"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "Klassen"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2393,13 +2416,12 @@ msgstr "Spiele angepasste Szene"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr ""
+msgstr "Das Ändern des Video-Treibers erfordert einen Neustart des Editors."
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Save & Restart"
-msgstr "Speichern & neu importieren"
+msgstr "Speichern & Neu starten"
#: editor/editor_node.cpp
msgid "Spins when the editor window repaints!"
@@ -2417,27 +2439,26 @@ msgstr "Änderungen aktualisieren"
msgid "Disable Update Spinner"
msgstr "Update-Anzeigerad deaktivieren"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "Inspektor"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "Import"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "Node"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "Dateisystem"
#: editor/editor_node.cpp
-#, fuzzy
+msgid "Inspector"
+msgstr "Inspektor"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Node"
+
+#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
-msgstr "Alle expandieren"
+msgstr "Unteres Panel vergrößern"
#: editor/editor_node.cpp scene/resources/visual_shader.cpp
msgid "Output"
@@ -2516,9 +2537,8 @@ msgid "Thumbnail..."
msgstr "Vorschau..."
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit Plugin"
-msgstr "Polygon bearbeiten"
+msgstr "Plugin bearbeiten"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
@@ -2542,15 +2562,13 @@ msgid "Status:"
msgstr "Status:"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit:"
-msgstr "Bearbeiten"
+msgstr "Bearbeiten:"
#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Start"
-msgstr "Start!"
+msgstr "Start"
#: editor/editor_profiler.cpp
msgid "Measure:"
@@ -2558,31 +2576,31 @@ msgstr "Messung:"
#: editor/editor_profiler.cpp
msgid "Frame Time (sec)"
-msgstr "Bild Zeit (Sek)"
+msgstr "Renderzeit (Sek)"
#: editor/editor_profiler.cpp
msgid "Average Time (sec)"
-msgstr "Durchschnittszeit (Sek)"
+msgstr "Renderzeit ⌀ (sek)"
#: editor/editor_profiler.cpp
msgid "Frame %"
-msgstr "Bild %"
+msgstr "Relative Renderzeit %"
#: editor/editor_profiler.cpp
msgid "Physics Frame %"
-msgstr "Physik-Frame %"
+msgstr "Physik-relative Renderzeit %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "Zeit:"
#: editor/editor_profiler.cpp
msgid "Inclusive"
-msgstr "Inklusive"
+msgstr "Gesamt"
#: editor/editor_profiler.cpp
msgid "Self"
-msgstr "Selbst"
+msgstr "Eigenanteil"
#: editor/editor_profiler.cpp
msgid "Frame #:"
@@ -2596,34 +2614,65 @@ msgstr "Zeit"
msgid "Calls"
msgstr "Aufrufe"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr "An"
#: editor/editor_properties.cpp
msgid "Layer"
-msgstr ""
+msgstr "Schicht"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Bit %d, value %d"
-msgstr "Bit %d, Wert %d."
+msgstr "Bit %d, Wert %d"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr "[leer]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
+msgid "Assign..."
+msgstr "Zuweisen.."
+
+#: editor/editor_properties.cpp
#, fuzzy
-msgid "Assign.."
-msgstr "Zuweisen"
+msgid "Invalid RID"
+msgstr "Ungültiger Pfad"
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+"Die ausgewählte Ressource (%s) stimmt mit keinem erwarteten Typ dieser "
+"Eigenschaft (%s) überein."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+"ViewportTextures können nicht für Ressourcen erstellt werden die als Datei "
+"gespeichert sind.\n"
+"Diese Ressourcen müssen zu einer Szene gehören."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+"ViewportTexture kann für diese Ressource nicht erstellt werden weil sie "
+"nicht als lokal zu einer Szene markiert wurde.\n"
+"Bitte die ‚Lokal zu Szene‘-Eigenschaft an dieser Ressource aktivieren (und "
+"an allen Ressourcen die sie enthalten, bis zum nächsten Node)."
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr "Viewport auswählen"
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr "Neues Skript"
@@ -2635,10 +2684,6 @@ msgstr "Neues %s"
msgid "Make Unique"
msgstr "Einzigartig machen"
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr "Im Dateisystem anzeigen"
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2647,7 +2692,8 @@ msgstr "Im Dateisystem anzeigen"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "Einfügen"
@@ -2660,36 +2706,32 @@ msgstr "Umwandeln zu %s"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Open Editor"
-msgstr "Im Editor öffnen"
+msgstr "Editor öffnen"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Selected node is not a Viewport!"
msgstr "Ausgewähltes Node ist kein Viewport!"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "Size: "
-msgstr "Zellgröße:"
+msgstr "Größe: "
#: editor/editor_properties_array_dict.cpp
msgid "Page: "
-msgstr ""
+msgstr "Seite: "
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Key:"
-msgstr "Neuer Name:"
+msgstr "Neuer Schlüssel:"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Value:"
-msgstr "Neuer Name:"
+msgstr "Neuer Wert:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
-msgstr ""
+msgstr "Schlüssel-Wert-Paar hinzufügen"
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -2782,9 +2824,8 @@ msgid "Can't open export templates zip."
msgstr "Exportvorlagen-ZIP-Datei konnte nicht geöffnet werden."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Invalid version.txt format inside templates: %s."
-msgstr "Ungültiges version.txt-Format in Templates."
+msgstr "Ungültiges version.txt-Format in Templates: %s."
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
@@ -2849,6 +2890,8 @@ msgid ""
"Templates installation failed. The problematic templates archives can be "
"found at '%s'."
msgstr ""
+"Template-Installation fehlgeschlagen. Des problematische Template-Archiv "
+"befindet sich hier: ‚%s‘."
#: editor/export_template_manager.cpp
msgid "Error requesting url: "
@@ -2929,9 +2972,8 @@ msgid "Download Templates"
msgstr "Lade Template herunter"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr "Mirror aus Liste auswählen: "
+msgstr "Mirror aus Liste auswählen: (Umsch-Klick: In Browser öffnen)"
#: editor/file_type_cache.cpp
msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
@@ -2940,20 +2982,22 @@ msgstr ""
"Der Dateityp-Cache wird nicht gespeichert!"
#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr "Favoriten"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
"Kann nicht zu '%s' navigierien, da es sich nicht im Dateisystem gefunden "
"wurde!"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a grid of thumbnails."
-msgstr "Einträge in Vorschaugitter anzeigen"
+msgstr "Einträge in Vorschaugitter anzeigen."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a list."
-msgstr "Einträge als Liste anzeigen"
+msgstr "Einträge als Liste anzeigen."
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
@@ -2980,19 +3024,15 @@ msgstr "Fehler beim Duplizieren:"
msgid "Unable to update dependencies:"
msgstr "Fehler beim Aktualisieren der Abhängigkeiten:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "Kein Name angegeben"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "Kein Name angegeben."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "Angegebener Name enthält ungültige Zeichen"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "Kein Name angegeben."
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "Name enthält ungültige Zeichen."
@@ -3017,22 +3057,6 @@ msgid "Duplicating folder:"
msgstr "Dupliziere Ordner:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "Alle expandieren"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "Alle einklappen"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "Umbenennen..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "Verschiebe zu..."
-
-#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
msgstr "Szene(n) öffnen"
@@ -3041,6 +3065,14 @@ msgid "Instance"
msgstr "Instanz"
#: editor/filesystem_dock.cpp
+msgid "Add to favorites"
+msgstr "Zu Favoriten hinzufügen"
+
+#: editor/filesystem_dock.cpp
+msgid "Remove from favorites"
+msgstr "Aus Favoriten entfernen"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "Abhängigkeiten bearbeiten..."
@@ -3048,19 +3080,33 @@ msgstr "Abhängigkeiten bearbeiten..."
msgid "View Owners..."
msgstr "Zeige Besitzer..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "Umbenennen..."
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "Duplizieren..."
#: editor/filesystem_dock.cpp
-#, fuzzy
+msgid "Move To..."
+msgstr "Verschiebe zu..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
-msgstr "Neues Skript"
+msgstr "Neues Skript..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "Speichere Ressource als..."
+msgstr "Neue Ressource..."
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr "Alle ausklappen"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr "Alle einklappen"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3082,29 +3128,18 @@ msgid "Re-Scan Filesystem"
msgstr "Dateisystem erneut einlesen"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "Favoriten-Verzeichnisstatus umschalten"
+msgid "Toggle split mode"
+msgstr "Geteilten Modus umschalten"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Show current scene file."
-msgstr "Speichere die so eben bearbeitete Unterkachel."
+msgid "Search files"
+msgstr "Dateien suchen"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr "Instantiiere gewählte Szene(n) als Unterobjekt des ausgewählten Nodes."
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "Klassen suchen"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3112,51 +3147,38 @@ msgstr ""
"Lese Dateien,\n"
"Bitte warten..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "Verschieben"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "There is already file or folder with the same name in this location."
msgstr ""
-"Es existiert bereits ein Ordner an diesem Pfad mit dem angegebenen Namen."
+"Es existiert bereits eine Datei oder ein Ordner an diesem Pfad mit dem "
+"angegebenen Namen."
#: editor/filesystem_dock.cpp
msgid "Overwrite"
-msgstr ""
+msgstr "Überschreiben"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Erstelle Skript"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find in files"
-msgstr "Finde Kachel"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find: "
-msgstr "Finden"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Whole words"
-msgstr "Ganze Wörter"
+msgid "Find in Files"
+msgstr "In Dateien suchen"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "Groß-/Kleinschreibung berücksichtigen"
+msgid "Find:"
+msgstr "Suche:"
#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "Verzeichnis:"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Filter: "
+msgid "Filters:"
msgstr "Filter:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -3173,52 +3195,48 @@ msgid "Cancel"
msgstr "Abbrechen"
#: editor/find_in_files.cpp
-#, fuzzy
+msgid "Find: "
+msgstr "Suche: "
+
+#: editor/find_in_files.cpp
msgid "Replace: "
-msgstr "Ersetzen"
+msgstr "Ersetzen: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace all (no undo)"
-msgstr "Alle ersetzen"
+msgstr "Alle ersetzen (nicht rückgängig)"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Searching..."
-msgstr "Speichere..."
+msgstr "Am suchen..."
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Search complete"
-msgstr "Suchtext"
+msgstr "Suche abgeschlossen"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group name already exists."
-msgstr "FEHLER: Animationsname existiert bereits!"
+msgstr "Gruppenname existiert bereits."
#: editor/groups_editor.cpp
-#, fuzzy
-msgid "invalid Group name."
-msgstr "Ungültiger Name."
+msgid "Invalid group name."
+msgstr "Ungültiger Gruppenname."
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Gruppen"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes not in Group"
-msgstr "Zu Gruppe hinzufügen"
+msgstr "Nodes nicht in der Gruppe"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
msgid "Filter nodes"
msgstr "Nodes filtern"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes in Group"
-msgstr "Gruppen bearbeiten"
+msgstr "Nodes in der Gruppe"
#: editor/groups_editor.cpp
msgid "Add to Group"
@@ -3229,9 +3247,8 @@ msgid "Remove from Group"
msgstr "Aus Gruppe entfernen"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Manage Groups"
-msgstr "Bildergruppen"
+msgstr "Gruppen verwalten"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Single Scene"
@@ -3312,7 +3329,7 @@ msgstr "Speichere..."
#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
-msgstr "Standard für ‚%s‘ setzen"
+msgstr "Als Standard für ‚%s‘ setzen"
#: editor/import_dock.cpp
msgid "Clear Default for '%s'"
@@ -3338,17 +3355,12 @@ msgstr "Neuimport"
msgid "Failed to load resource."
msgstr "Laden der Ressource gescheitert."
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "Ok"
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr "Alle Eigenschaften ausklappen"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+msgid "Collapse All Properties"
msgstr "Alle Eigenschaften einklappen"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3365,9 +3377,8 @@ msgid "Paste Params"
msgstr "Parameter einfügen"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Edit Resource Clipboard"
-msgstr "Zwischenablage für Ressourcen ist leer!"
+msgstr "Ressourcen-Zwischenablage bearbeiten"
#: editor/inspector_dock.cpp
msgid "Copy Resource"
@@ -3379,7 +3390,7 @@ msgstr "Einbetten"
#: editor/inspector_dock.cpp
msgid "Make Sub-Resources Unique"
-msgstr "Unter-Ressource Einzigartig Machen"
+msgstr "Unter-Ressource einzigartig machen"
#: editor/inspector_dock.cpp
msgid "Open in Help"
@@ -3394,6 +3405,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "Lade eine bestehende Ressource von der Festplatte und bearbeite sie."
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "Speichere die so eben bearbeitete Ressource."
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "Gehe zum vorherigen bearbeiteten Objekt im Verlauf."
@@ -3410,9 +3425,8 @@ msgid "Object properties."
msgstr "Objekteigenschaften."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Filter properties"
-msgstr "Nodes filtern"
+msgstr "Eigenschaften filtern"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
@@ -3427,47 +3441,40 @@ msgid "Select a Node to edit Signals and Groups."
msgstr "Node auswählen um Signale und Gruppen zu bearbeiten."
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Edit a Plugin"
-msgstr "Polygon bearbeiten"
+msgstr "Ein Plugin bearbeiten"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Create a Plugin"
-msgstr "Erzeuge C#-Lösung"
+msgstr "Ein Plugin erstellen"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Plugin Name:"
-msgstr "Plugin Liste:"
+msgstr "Pluginname:"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
-msgstr ""
+msgstr "Unterverzeichnis:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Language:"
-msgstr "Sprache"
+msgstr "Sprache:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Script Name:"
-msgstr "Skript gültig"
+msgstr "Skriptname:"
#: editor/plugin_config_dialog.cpp
msgid "Activate now?"
-msgstr ""
+msgstr "Sofort aktivieren?"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
msgstr "Polygon erstellen"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+msgid "Edit Polygon"
msgstr "Polygon bearbeiten"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3475,34 +3482,33 @@ msgid "Insert Point"
msgstr "Punkt einfügen"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr "Polygon bearbeiten (Punkt entfernen)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+msgid "Remove Polygon And Point"
msgstr "Polygon und Punkt entfernen"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "Polygon von Grund auf neu erstellen"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr "Punkte erstellen."
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
-"Existierendes Polygon editieren:\n"
-"LMT: Punkt verschieben.\n"
-"Strg+LMT: Segment aufteilen.\n"
-"RMT: Punkt löschen."
+"Punkt bearbeiten:\n"
+"LMT: Punkt verschieben\n"
+"RMT: Punkt löschen"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
-msgstr "Punkte entfernen"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr "Punkte löschen."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3516,15 +3522,15 @@ msgstr "Animation hinzufügen"
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Load.."
-msgstr "Lade"
+msgid "Load..."
+msgstr "Lade..."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "This type of node can't be used. Only root nodes are allowed."
msgstr ""
+"Dieser Node-Type kann nicht verwendet werden. Nur Wurzel-Nodes sind möglich."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3534,73 +3540,65 @@ msgid ""
"AnimationTree is inactive.\n"
"Activate to enable playback, check node warnings if activation fails."
msgstr ""
+"AnimationTree ist inaktiv.\n"
+"Aktivieren um Abspielen zu starten, Node-Warnungen sollten überprüft werden "
+"falls Aktivierung fehlschlägt."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Set the blending position within the space"
-msgstr ""
+msgstr "Übergangsposition innerhalb des Raums setzen"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Select and move points, create points with RMB."
-msgstr ""
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Punkte entfernen"
+msgstr "Punkte auswählen und verschieben, erstellen mit RMT."
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "RMT: Punkt entfernen."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr "Schnapp- und Anzeigeraster aktivieren."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Point"
-msgstr "Punkt verschieben"
+msgstr "Punkt"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Open Animation Node"
-msgstr "Animations-Node"
+msgstr "Animations-Node öffnen"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists"
-msgstr "Aktion ‚%s‘ existiert bereits!"
+msgstr "Dreieck existiert bereits"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "BlendSpace2D does not belong to an AnimationTree node."
-msgstr ""
+msgstr "BlendSpace2D gehört nicht zu einem AnimationTree-Node."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "No triangles exist, so no blending can take place."
-msgstr ""
+msgstr "Es existieren keine Dreiecke, Vermischen nicht möglich."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create triangles by connecting points."
-msgstr ""
+msgstr "Dreiecke durch Punkteverbinden herstellen."
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Erase points and triangles."
-msgstr "Analysiere %d Dreiecke:"
+msgstr "Punkte und Dreiecke löschen."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Generate blend triangles automatically (instead of manually)"
-msgstr ""
+msgstr "Vermischungsdreiecke automatisch erstellen (statt manuell)"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr "Einrasten"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Blende:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3609,20 +3607,24 @@ msgstr "Filter bearbeiten"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Output node can't be added to the blend tree."
-msgstr ""
+msgstr "Ausgabe-Node kann nicht zum Mischungsbaum hinzugefügt werden."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Unable to connect, port may be in use or connection may be invalid."
msgstr ""
+"Verbindung nicht möglich, Port ist eventuell bereits in Benutzung oder "
+"Verbindung ist ungültig."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
msgstr ""
+"Kein Animationsspieler festgelegt, Spurnamen können nicht abgerufen werden."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Player path set is invalid, so unable to retrieve track names."
msgstr ""
+"Animationsspieler-Pfad ist ungültig, Spurnamen können nicht abgerufen werden."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
@@ -3630,23 +3632,22 @@ msgid ""
"Animation player has no valid root node path, so unable to retrieve track "
"names."
msgstr ""
+"Animationsspieler hat keinen gültigen Wurzel-Node-Pfad, Spurnamen können "
+"nicht abgerufen werden."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Add Node.."
-msgstr "Node hinzufügen"
+msgid "Add Node..."
+msgstr "Knoten hinzufügen....."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filtered Tracks:"
-msgstr "Filter bearbeiten"
+msgstr "Gefilterte Spuren bearbeiten:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Enable filtering"
-msgstr "bearbeitbare Unterobjekte"
+msgstr "Filtern aktivieren"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
@@ -3674,14 +3675,12 @@ msgid "Remove Animation"
msgstr "Animation entfernen"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Invalid animation name!"
-msgstr "FEHLER: ungültiger Animationsname!"
+msgstr "Ungültiger Animationsname!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Animation name already exists!"
-msgstr "FEHLER: Animationsname existiert bereits!"
+msgstr "Animationsname existiert bereits!"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -3705,14 +3704,12 @@ msgid "Duplicate Animation"
msgstr "Animation duplizieren"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to copy!"
-msgstr "Fehler: Keine Animation zum kopieren!"
+msgstr "Keine Animation zum kopieren!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation resource on clipboard!"
-msgstr "FEHLER: Keine Animations-Ressource im Zwischenspeicher!"
+msgstr "Keine Animations-Ressource in der Zwischenablage!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
@@ -3723,9 +3720,8 @@ msgid "Paste Animation"
msgstr "Animation einfügen"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to edit!"
-msgstr "FEHLER: Keine Animation zum bearbeiten!"
+msgstr "Keine Animation zum bearbeiten!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
@@ -3769,14 +3765,12 @@ msgid "New"
msgstr "Neu"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Transitions..."
-msgstr "Bearbeite Verbindungen..."
+msgstr "Übergänge bearbeiten..."
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Open in Inspector"
-msgstr "Im Editor öffnen"
+msgstr "Im Inspektor öffnen"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Display list of animations in player."
@@ -3835,9 +3829,8 @@ msgid "Include Gizmos (3D)"
msgstr "Griffe (3D) einbeziehen"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Pin AnimationPlayer"
-msgstr "Animation einfügen"
+msgstr "Animationsspieler anheften"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Create New Animation"
@@ -3868,34 +3861,32 @@ msgid "Cross-Animation Blend Times"
msgstr "Übergangszeiten kreuzender Animationen"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "End"
msgstr "Ende"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Immediate"
-msgstr ""
+msgstr "Unmittelbar"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Sync"
-msgstr ""
+msgstr "Synchronisieren"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "At End"
-msgstr ""
+msgstr "Am Ende"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Travel"
-msgstr ""
+msgstr "Fortlaufend"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Start and end nodes are needed for a sub-transition."
-msgstr ""
+msgstr "Star- und End-Nodes werden für Sub-Transition benötigt."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "No playback resource set at path: %s."
-msgstr "Nicht im Ressourcen-Pfad."
+msgstr "Keine Abspiel-Ressource festgelegt im Pfad: %s."
#: editor/plugins/animation_state_machine_editor.cpp
msgid ""
@@ -3903,34 +3894,35 @@ msgid ""
"RMB to add new nodes.\n"
"Shift+LMB to create connections."
msgstr ""
+"Node auswählen und verschieben.\n"
+"RMT zum Hinzufügen neuer Nodes.\n"
+"Umsch-LMT um Verbindungen herzustellen."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "%s erstellen"
+msgstr "Neue Nodes erstellen."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Connect nodes."
-msgstr "Nodes verbinden"
+msgstr "Nodes verbinden."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Remove selected node or transition"
-msgstr "Ausgewählte Spur entfernen."
+msgid "Remove selected node or transition."
+msgstr "Ausgewähltes Node oder Übergang entfernen."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
msgstr ""
+"Automatische Abspielen dieser Animation zum Start, Neustart oder bei Sprung "
+"zu Null festlegen."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set the end animation. This is useful for sub-transitions."
-msgstr ""
+msgstr "End-Animation festlegen. Hilfreich bei Sub-Transitionen."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "Übergang"
+msgstr "Übergang: "
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3984,10 +3976,6 @@ msgid "Amount:"
msgstr "Menge:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "Blende:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "Blende 0:"
@@ -4128,14 +4116,12 @@ msgid "Asset Download Error:"
msgstr "Nutzerinhalte-Download-Fehler:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading (%s / %s)..."
-msgstr "Wird heruntergeladen"
+msgstr "Wird heruntergeladen (%s / %s)..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading..."
-msgstr "Wird heruntergeladen"
+msgstr "Wird heruntergeladen..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Resolving..."
@@ -4162,14 +4148,12 @@ msgid "Download for this asset is already in progress!"
msgstr "Dieser Nutzerinhalt wird bereits herunter geladen!"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "First"
-msgstr "Anfang"
+msgstr "Erste"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Previous"
-msgstr "Vorheriger Tab"
+msgstr "Vorherige"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Next"
@@ -4177,7 +4161,7 @@ msgstr "Nächste"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Last"
-msgstr ""
+msgstr "Letzte"
#: editor/plugins/asset_library_editor_plugin.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -4189,7 +4173,7 @@ msgstr "Alle"
msgid "Plugins"
msgstr "Erweiterungen"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "Sortiere:"
@@ -4305,29 +4289,28 @@ msgid "Create new horizontal and vertical guides"
msgstr "Neue horizontale und vertikale Hilfslinien erstellen"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move pivot"
-msgstr "Mittelpunkt bewegen"
+msgstr "Pivotpunkt bewegen"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Rotate CanvasItem"
-msgstr "CanvasItem bearbeiten"
+msgstr "CanvasItem rotieren"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move anchor"
-msgstr "Aktion verschieben"
+msgstr "Anker verschieben"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Resize CanvasItem"
-msgstr "CanvasItem bearbeiten"
+msgstr "CanvasItem in Größe anpassen"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr "CanvasItem skalieren"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move CanvasItem"
-msgstr "CanvasItem bearbeiten"
+msgstr "CanvasItem verschieben"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -4346,19 +4329,18 @@ msgid "Paste Pose"
msgstr "Pose einfügen"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "Verkleinern"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom reset"
-msgstr "Vergrößerung zurücksetzen"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
+"Warnung: Position und Größe der Kinder eines Containers werden nur von ihren "
+"Eltern bestimmt."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Vergrößern"
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
+msgstr "Zoom Zurücksetzen"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
@@ -4391,6 +4373,10 @@ msgid "Rotate Mode"
msgstr "Rotationsmodus"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr "Skalierungsmodus"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4409,16 +4395,14 @@ msgid "Pan Mode"
msgstr "Schwenkmodus"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle snapping."
-msgstr "Einrasten umschalten"
+msgstr "Einrasten umschalten."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Snap"
msgstr "Einrasten aktivieren"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snapping Options"
msgstr "Einrasteinstellungen"
@@ -4460,9 +4444,8 @@ msgid "Snap to node sides"
msgstr "An Node-Seiten einrasten"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to node center"
-msgstr "Am Node-Anker einrasten"
+msgstr "Am Node-Mittelpunkt einrasten"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to other nodes"
@@ -4492,6 +4475,10 @@ msgid "Restores the object's children's ability to be selected."
msgstr "Macht Unterobjekte dieses Objekts wieder auswählbar."
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr "Skelett-Einstellungen"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "Knochen anzeigen"
@@ -4505,12 +4492,11 @@ msgstr "IK-Kette zurücksetzen"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make Custom Bone(s) from Node(s)"
-msgstr ""
+msgstr "Erstelle eigenständige(n) Knochen aus Node(s)"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Custom Bones"
-msgstr "Knochen entfernen"
+msgstr "Spezielle Knochen löschen"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -4543,6 +4529,10 @@ msgid "Show Viewport"
msgstr "Zeige Ansichtsfenster (Viewport)"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr "Gruppe zeigen und Icons sperren"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr "Auswahl zentrieren"
@@ -4555,9 +4545,8 @@ msgid "Layout"
msgstr "Layout"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Insert keys."
-msgstr "Schlüsselbilder einfügen"
+msgstr "Schlüsselbilder einfügen."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
@@ -4614,17 +4603,24 @@ msgstr ""
"Ziehen + Alt: Nodetyp ändern"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
+msgid "Create Polygon3D"
msgstr "Polygon3D erstellen"
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Polygon bearbeiten"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Polygon bearbeiten (Punkt entfernen)"
+
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
msgstr "Wähle Griff"
#: editor/plugins/cpu_particles_editor_plugin.cpp
-#, fuzzy
msgid "CPUParticles"
-msgstr "Partikel"
+msgstr "CPU-Partikel"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
@@ -4717,37 +4713,9 @@ msgid "Item List Editor"
msgstr "Auflistungseditor"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"Keine OccluderPolygon2D-Ressource für dieses Node gefunden.\n"
-"Neues erstellen und zuweisen?"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr "Occluder-Polygon erzeugen"
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr "Polygon von Grund auf neu erstellen."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "Bestehendes Polygon bearbeiten:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "LMT: Punkt verschieben."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr "Strg+LMT: Segment aufteilen."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "RMT: Punkt entfernen."
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr "Mesh ist leer!"
@@ -4828,7 +4796,7 @@ msgstr "Statischen Konvex-Körper erzeugen"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Collision Sibling"
-msgstr "Trimesh Kollisionselement erzeugen"
+msgstr "Trimesh-Kollisionselement erzeugen"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Convex Collision Sibling"
@@ -4981,13 +4949,13 @@ msgid "Populate"
msgstr "Füllen"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr "Erzeuge Navigationspolygon"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr "Erzeuge AABB"
+msgid "Generating Visibility Rect"
+msgstr "Generiere Sichtbarkeits-Rechteck"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -5017,6 +4985,11 @@ msgstr "Emissionsmaske leeren"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr "Zu CPU-Partikeln konvertieren"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr "Partikel"
@@ -5086,13 +5059,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr "Ein Verarbeitungsmaterial des Typs ‚ParticlesMaterial‘ wird benötigt."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr "Erzeuge AABB"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "In Großbuchstaben konvertieren"
+msgid "Generate AABB"
+msgstr "Erzeuge AABB"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5116,6 +5088,10 @@ msgid "Add Point to Curve"
msgstr "Punkt zu Kurve hinzufügen"
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr "Kurve Teilen"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr "Punkt auf Kurve verschieben"
@@ -5143,6 +5119,10 @@ msgid "Click: Add Point"
msgstr "Klicken: Punkt hinzufügen"
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr "Linksklick: Segment Teilen (in Kurve)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr "Rechtsklick: Punkt löschen"
@@ -5158,11 +5138,6 @@ msgstr "Punkt hinzufügen (in leerem Raum)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr "Segment aufteilen (in Kurve)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "Punk löschen"
@@ -5180,12 +5155,12 @@ msgstr "Optionen"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Angles"
-msgstr ""
+msgstr "Griffwinkel spiegeln"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Lengths"
-msgstr ""
+msgstr "Grifflängen spiegeln"
#: editor/plugins/path_editor_plugin.cpp
msgid "Curve Point #"
@@ -5219,65 +5194,79 @@ msgstr "Ausgangskontrollpunkt löschen"
msgid "Remove In-Control Point"
msgstr "Eingangskontrollpunkt löschen"
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Segment aufteilen (in Kurve)"
+
#: editor/plugins/physical_bone_plugin.cpp
-#, fuzzy
msgid "Move joint"
-msgstr "Punkt verschieben"
+msgstr "Gelenk verschieben"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
msgstr ""
+"Die Skeleton-Eigenschaft des Polygon2Ds zeigt nicht auf ein Skeleton2D-Node"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Sync bones"
-msgstr "Knochen anzeigen"
+msgid "Sync Bones"
+msgstr "Knochen synchronisieren"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+"Es gibt keine Textur in diesem Polygon.\n"
+"Legen Sie eine Textur fest, um UV bearbeiten zu können."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr "Erzeuge UV-Map"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon & UV"
-msgstr "Polygon erstellen"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
+msgstr "Polygon und UV erstellen"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "Neue horizontale Hilfslinie erstellen"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "Aktion ‚%s‘ existiert bereits!"
+msgid "Remove Internal Vertex"
+msgstr "Eingangskontrollpunkt löschen"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Add Split"
-msgstr "Punkt hinzufügen"
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "Ungültiger Pfad!"
+msgid "Add Custom Polygon"
+msgstr "Polygon bearbeiten"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Punkt entfernen"
+msgid "Remove Custom Polygon"
+msgstr "Kollisionspolygon entfernen"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr "Transformiere UV-Map"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
-msgstr ""
+msgid "Transform Polygon"
+msgstr "Polygon Transformieren"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
+msgstr "Knochenmalgewichte"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Open Polygon 2D UV editor."
+msgstr "Polygon2D-UV-Editor öffnen."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
@@ -5285,31 +5274,25 @@ msgstr "Polygon2D-UV-Editor"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "UV"
-msgstr ""
+msgstr "UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "Polygon bearbeiten"
+msgid "Points"
+msgstr "Punkt"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Splits"
-msgstr "Pfad aufteilen"
+msgid "Polygons"
+msgstr "Polygon→UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Bones"
-msgstr "Knochen erstellen"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Create Polygon"
-msgstr "Polygon erstellen"
+msgstr "Knochen"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
-msgstr "Punkt verschieben"
+msgid "Move Points"
+msgstr "Punkte Verschieben"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
@@ -5336,25 +5319,26 @@ msgid "Scale Polygon"
msgstr "Polygon skalieren"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "Zuerst Einstellungspunkt auswählen!"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
-msgstr ""
+msgid "Paint weights with specified intensity."
+msgstr "Gewichte mit angegebener Intensität malen."
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
-msgstr ""
+msgid "Unpaint weights with specified intensity."
+msgstr "Gewichte mit angegebener Intensität weg malen."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Radius:"
-msgstr ""
+msgstr "Radius:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon->UV"
@@ -5369,9 +5353,13 @@ msgid "Clear UV"
msgstr "Leere UV-Map"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Settings"
-msgstr "GridMap-Einstellungen"
+msgstr "Gittereinstellungen"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "Einrasten"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
@@ -5379,37 +5367,31 @@ msgstr "Einrasten aktivieren"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Grid"
-msgstr "Raster"
+msgstr "Gitter"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Configure Grid:"
-msgstr "Einrasten konfigurieren"
+msgstr "Gitter einstellen:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset X:"
-msgstr "Gitterversatz:"
+msgstr "Gitterversatz X:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset Y:"
-msgstr "Gitterversatz:"
+msgstr "Gitterversatz Y:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step X:"
-msgstr "Gitterabstand:"
+msgstr "Gitterabstand X:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step Y:"
-msgstr "Gitterabstand:"
+msgstr "Gitterabstand Y:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Sync Bones to Polygon"
-msgstr "Polygon skalieren"
+msgstr "Knochen mit Polygon synchronisieren"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "ERROR: Couldn't load resource!"
@@ -5437,22 +5419,22 @@ msgid "Paste Resource"
msgstr "Ressource einfügen"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "Im Editor öffnen"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr "Instanz:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr "Typ:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Im Editor öffnen"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr "Ressource laden"
@@ -5464,11 +5446,11 @@ msgstr "Ressourcen-Vorlader"
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "AnimationTree has no path set to an AnimationPlayer"
msgstr ""
+"Es wurde kein Pfad zu einem AnimationPlayer im AnimationTree festgelegt"
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Path to AnimationPlayer is invalid"
-msgstr "Animationsbaum ist ungültig."
+msgstr "Pfad zum Animationsspieler ist ungültig"
#: editor/plugins/script_editor_plugin.cpp
msgid "Clear Recent Files"
@@ -5479,56 +5461,62 @@ msgid "Close and save changes?"
msgstr "Schließen und Änderungen speichern?"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error writing TextFile:"
-msgstr "Fehler beim Dateiverschieben:\n"
+msgstr "Fehler beim Schreiben von Textdatei:"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr "Fehler: Datei konnte nicht geladen werden."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error could not load file."
-msgstr "Konnte Bild nicht laden"
+msgstr "Fehler: Datei konnte nicht geladen werden."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error saving file!"
-msgstr "Fehler beim speichern des TileSet!"
+msgstr "Fehler beim Speichern der Datei!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr "Fehler beim Speichern des Motivs"
+msgid "Error while saving theme."
+msgstr "Fehler beim Speichern des Themas."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+msgid "Error Saving"
msgstr "Fehler beim Speichern"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr "Fehler beim importieren des Motivs"
+msgid "Error importing theme."
+msgstr "Fehler beim Importieren des Themas."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+msgid "Error Importing"
msgstr "Fehler beim Importieren"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New TextFile..."
-msgstr "Neuer Ordner..."
+msgstr "Neue Textdatei..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open File"
msgstr "Datei öffnen"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Save File As..."
-msgstr "Speichern als..."
+msgstr "Datei speichern als..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme"
msgstr "Motiv importieren"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Fehler beim Speichern des Motivs"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Fehler beim Speichern"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr "Motiv speichern als..."
@@ -5538,7 +5526,7 @@ msgstr " Klassenreferenz"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
-msgstr ""
+msgstr "Alphabetische Sortierung der Methodenliste umschalten."
#: editor/plugins/script_editor_plugin.cpp
msgid "Sort"
@@ -5569,9 +5557,8 @@ msgid "File"
msgstr "Datei"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "New TextFile"
-msgstr "Dateien anzeigen"
+msgid "Open..."
+msgstr "Öffnen..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5586,11 +5573,7 @@ msgid "Copy Script Path"
msgstr "Skriptpfad kopieren"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr "Im Dateisystem anzeigen"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+msgid "History Previous"
msgstr "Zurück im Verlauf"
#: editor/plugins/script_editor_plugin.cpp
@@ -5603,6 +5586,10 @@ msgid "Theme"
msgstr "Motiv"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme..."
+msgstr "Thema importieren..."
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
msgstr "Motiv neu laden"
@@ -5611,10 +5598,6 @@ msgid "Save Theme"
msgstr "Motiv speichern"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "Motiv speichern als"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "Dokumentation schließen"
@@ -5649,7 +5632,7 @@ msgstr "Hineinspringen"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Break"
-msgstr "Unterbrechung"
+msgstr "Unterbrechen"
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
#: editor/script_editor_debugger.cpp
@@ -5661,7 +5644,7 @@ msgid "Keep Debugger Open"
msgstr "Debugger offen halten"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr "Mit externem Editor debuggen"
#: editor/plugins/script_editor_plugin.cpp
@@ -5669,10 +5652,6 @@ msgid "Open Godot online documentation"
msgstr "Öffne Godot-Referenzdokumentation"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr "Durchsuche die Klassenhierarchie."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Durchsuche die Referenzdokumentation."
@@ -5709,39 +5688,32 @@ msgid "Debugger"
msgstr "Debugger"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search results"
-msgstr "Hilfe durchsuchen"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "Klassen suchen"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-"Eingebettete Skripte können nur bearbeitet werden wenn die entsprechende "
-"Szene geladen ist"
+msgid "Search Results"
+msgstr "Suchergebnisse"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Line"
-msgstr "Zeile:"
+msgstr "Zeile"
#: editor/plugins/script_text_editor.cpp
msgid "(ignore)"
-msgstr ""
+msgstr "(ignorieren)"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function"
+msgstr "Springe zu Funktion"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr "Standard"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr "Nur Ressourcen aus dem Dateisystem können hier fallen gelassen werden."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Lookup Symbol"
-msgstr "Symbol vervollständigen"
+msgstr "Symbol nachschlagen"
#: editor/plugins/script_text_editor.cpp
msgid "Pick Color"
@@ -5765,11 +5737,7 @@ msgstr "Kapitalisiere"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Syntax Highlighter"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
+msgstr "Syntaxhervorhebung"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
@@ -5783,7 +5751,7 @@ msgstr "Alles auswählen"
#: editor/plugins/script_text_editor.cpp
msgid "Delete Line"
-msgstr "Linie löschen"
+msgstr "Zeile löschen"
#: editor/plugins/script_text_editor.cpp
msgid "Indent Left"
@@ -5819,14 +5787,14 @@ msgstr "Symbol vervollständigen"
#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
-msgstr "kürze Leerraum am Zeilenende"
+msgstr "Kürze Leerraum am Zeilenende"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr "Konvertiere Einrückung zu Leerzeichen"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr "Konvertiere Einrückung zu Tabulatoren"
#: editor/plugins/script_text_editor.cpp
@@ -5843,36 +5811,27 @@ msgid "Remove All Breakpoints"
msgstr "Lösche alle Haltepunkte"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
+msgid "Go to Next Breakpoint"
msgstr "Springe zum nächsten Haltepunkt"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
+msgid "Go to Previous Breakpoint"
msgstr "Springe zum vorigen Haltepunkt"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr "In Großbuchstaben konvertieren"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr "In Kleinbuchstaben konvertieren"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr "Finde Vorheriges"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Find in files..."
-msgstr "Dateien filtern..."
+msgid "Find in Files..."
+msgstr "In Dateien suchen..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+msgid "Go to Function..."
msgstr "Springe zu Funktion..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+msgid "Go to Line..."
msgstr "Springe zu Zeile..."
#: editor/plugins/script_text_editor.cpp
@@ -5886,39 +5845,36 @@ msgstr "Shader"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "This skeleton has no bones, create some children Bone2D nodes."
msgstr ""
+"Dieses Skelett hat keine Knochen, Bone2D-Nodes sollten als Unterobjekte "
+"hinzugefügt werden."
#: editor/plugins/skeleton_2d_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton2D"
-msgstr "Skelett..."
+msgstr "Skeleton2D"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Make Rest Pose (From Bones)"
-msgstr ""
+msgstr "Ruhe-Pose erstellen (aus Knochen)"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Set Bones to Rest Pose"
-msgstr ""
+msgstr "Kochen in Ruhe-Pose setzen"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical bones"
-msgstr "Navigations-Mesh erzeugen"
+msgstr "Physikalische Knochen erstellen"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton"
-msgstr "Skelett..."
+msgstr "Skelett"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical skeleton"
-msgstr "Erzeuge C#-Lösung"
+msgstr "Physikalisches Skelett erzeugen"
#: editor/plugins/skeleton_ik_editor_plugin.cpp
-#, fuzzy
msgid "Play IK"
-msgstr "Starten"
+msgstr "IK abspielen"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Orthogonal"
@@ -5926,7 +5882,7 @@ msgstr "Orthogonal"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Perspective"
-msgstr "Perspektive"
+msgstr "Perspektivisch"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Aborted."
@@ -5969,6 +5925,14 @@ msgid "Animation Key Inserted."
msgstr "Animationsschlüsselbild eingefügt."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr "Neigen"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr "Gieren"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr "Gezeichnete Objekte"
@@ -6026,7 +5990,7 @@ msgstr "Rechts"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Front View."
-msgstr "Sicht von Vorne."
+msgstr "Sicht von vorne."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Front"
@@ -6053,9 +6017,8 @@ msgid "This operation requires a single selected node."
msgstr "Diese Aktion benötigt ein einzelnes ausgewähltes Node."
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Lock View Rotation"
-msgstr "Sicht-Informationen"
+msgstr "Sichtrotation sperren"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Normal"
@@ -6102,9 +6065,8 @@ msgid "Doppler Enable"
msgstr "Dopplereffekt aktivieren"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Cinematic Preview"
-msgstr "Mesh-Vorschauen erzeugen"
+msgstr "Cinematische Vorschau"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
@@ -6135,6 +6097,10 @@ msgid "Freelook Speed Modifier"
msgstr "Freisicht Geschwindigkeitsregler"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "Sichtrotation gesperrt"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "Transformationsdialog"
@@ -6190,7 +6156,7 @@ msgstr "Sicht von hinten"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Front View"
-msgstr "Sicht von Vorne"
+msgstr "Sicht von vorne"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Left View"
@@ -6237,11 +6203,6 @@ msgid "Tool Scale"
msgstr "Werkzeug Skalieren"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap To Floor"
-msgstr "Am Gitter einrasten"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Freie Kamera umschalten"
@@ -6251,7 +6212,7 @@ msgstr "Transformation"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap object to floor"
-msgstr ""
+msgstr "Objekt am Boden einrasten"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Dialog..."
@@ -6282,9 +6243,8 @@ msgid "4 Viewports"
msgstr "Vier Ansichten"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Gizmos"
-msgstr "Griffe anzeigen"
+msgstr "Griffe"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Origin"
@@ -6359,52 +6319,51 @@ msgstr "Vorher"
msgid "Post"
msgstr "Nachher"
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr "Namenloser Anfasser"
+
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite is empty!"
-msgstr "Speicherpfad ist leer!"
+msgstr "Sprite ist leer!"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Can't convert a sprite using animation frames to mesh."
msgstr ""
+"Ein Sprite das Animationsbilder nutzt kann nicht zu einem Mesh konvertiert "
+"werden."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't replace by mesh."
-msgstr ""
+msgstr "Ungültige Geometrie, Mesh kann nicht ersetzt werden."
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite"
-msgstr "Sprite-Einzelbilder"
+msgstr "Sprite"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to 2D Mesh"
-msgstr "Umwandeln zu %s"
+msgstr "Zu 2D-Mesh umwandeln"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create 2D Mesh"
-msgstr "Erzeuge Umriss-Mesh"
+msgstr "2D-Mesh erzeugen"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Simplification: "
-msgstr ""
+msgstr "Vereinfachung: "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Grow (Pixels): "
-msgstr "Einrasten (Pixel):"
+msgstr "Wachsen (Pixel): "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Update Preview"
-msgstr "Atlas-Vorschau"
+msgstr "Vorschau aktualisieren"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Settings:"
-msgstr "Einstellungen"
+msgstr "Einstellungen:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
@@ -6479,12 +6438,17 @@ msgid "Set Region Rect"
msgstr "Bereichsrechteck setzen"
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr "Rand einstellen"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr "Einrastmodus:"
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
-msgstr "<Nichts>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
+msgstr "Nichts"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Pixel Snap"
@@ -6508,10 +6472,9 @@ msgstr "Schritt:"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Sep.:"
-msgstr ""
+msgstr "Trenner:"
#: editor/plugins/texture_region_editor_plugin.cpp
-#, fuzzy
msgid "TextureRegion"
msgstr "Texturbereich"
@@ -6601,7 +6564,7 @@ msgstr "Viele"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Has,Many,Options"
-msgstr "Einstellungen"
+msgstr "Hat,Mehrere,Einstellungen"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Tab 1"
@@ -6644,9 +6607,12 @@ msgid "Erase Selection"
msgstr "Auswahl löschen"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Fix Invalid Tiles"
-msgstr "Ungültiger Name."
+msgstr "Ungültige Kacheln reparieren"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Cut Selection"
+msgstr "Auswahl ausschneiden"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
@@ -6669,9 +6635,8 @@ msgid "Erase TileMap"
msgstr "Lösche TileMap"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Find Tile"
-msgstr "Finde Kachel"
+msgstr "Kachel finden"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Transpose"
@@ -6694,35 +6659,36 @@ msgid "Pick Tile"
msgstr "Wähle Kachel"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
-msgid "Move Selection"
-msgstr "Auswahl entfernen"
+msgid "Copy Selection"
+msgstr "Auswahl kopieren"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr "Drehe auf 0 Grad"
+msgid "Rotate left"
+msgstr "Nach links rotieren"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr "Drehe auf 90 Grad"
+msgid "Rotate right"
+msgstr "Nach rechts rotieren"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
-msgstr "Drehe auf 180 Grad"
+msgid "Flip horizontally"
+msgstr "Horizontal spiegeln"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
-msgstr "Drehe auf 270 Grad"
+msgid "Flip vertically"
+msgstr "Vertikal spiegeln"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Clear transform"
+msgstr "Transform löschen"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Add Texture(s) to TileSet"
-msgstr "Node(s) aus Szenenbaum hinzufügen"
+msgid "Add Texture(s) to TileSet."
+msgstr "Textur(en) zu TileSet hinzufügen."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Remove current Texture from TileSet"
-msgstr "Aktuellen Eintrag entfernen"
+msgid "Remove selected Texture from TileSet."
+msgstr "Aktuelle Textur aus TileSet entfernen."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -6733,104 +6699,212 @@ msgid "Merge from Scene"
msgstr "Aus Szene zusammenführen"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
-msgstr ""
-"Unterkachel zur Benutzung als Icon auswählen, dieses wird auch für ungültige "
-"Autokachelzuordnungen benutzt werden."
+msgid "Copy bitmask."
+msgstr "Bitmaske kopieren."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste bitmask."
+msgstr "Bitmaske einfügen."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Erase bitmask."
+msgstr "Bitmaske löschen."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new polygon."
+msgstr "Neues Polygon erstellen."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Keep polygon inside region Rect."
+msgstr "Polygon im Rechteck Bereich halten."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
+"Schnapp- und Anzeigeraster aktivieren (über den Inspektor konfigurierbar)."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr "Kachelnamen anzeigen (Alt-Taste halten)"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove selected texture? This will remove all tiles which use it."
msgstr ""
+"Ausgewählte Textur entfernen? Alle Kacheln die sie nutzen werden entfernt."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
-msgstr ""
+msgstr "Keine Textur zum Entfernen ausgewählt."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
-msgstr "Von Szene erstellen?"
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr "Aus Szene erstellen? Alle gegenwärtigen Kacheln werden überschrieben."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
msgstr "Aus Szene vereinen?"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+msgid "Remove Texture"
+msgstr "Textur entfernen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
+"%s Datei(en) wurde(n) nicht hinzugefügt weil sie schon in der Liste "
+"vorhanden war(en)."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Drag handles to edit Rect.\n"
"Click on another Tile to edit it."
msgstr ""
+"Griff ziehen um Rechteck zu bearbeiten.\n"
+"Auf andere Kachel drücken um sie zu bearbeiten."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete selected Rect."
+msgstr "Ausgewähltes Rechteck löschen."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
-"LMT: Bit anstellen.\n"
-"RMT: Bit ausstellen."
+"Speichere die so eben bearbeitete Unterkachel.\n"
+"Auf andere Kachel drücken um diese zu bearbeiten."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete polygon."
+msgstr "Polygon löschen."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
-msgstr "Speichere die so eben bearbeitete Unterkachel."
+msgstr ""
+"LMT: Bit anstellen.\n"
+"RMT: Bit ausstellen.\n"
+"Auf andere Kachel klicken um diese zu bearbeiten."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to use as icon, this will be also used on invalid autotile "
"bindings.\n"
"Click on another Tile to edit it."
msgstr ""
"Unterkachel zur Benutzung als Icon auswählen, dieses wird auch für ungültige "
-"Autokachelzuordnungen benutzt werden."
+"Autokachelzuordnungen benutzt werden.\n"
+"Auf andere Kachel drücken um diese zu bearbeiten."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to change its priority.\n"
"Click on another Tile to edit it."
-msgstr "Unterkachel auswählen um ihre Priorität zu ändern."
+msgstr ""
+"Unterkachel auswählen um ihre Priorität zu ändern.\n"
+"Auf andere Kachel drücken um diese zu bearbeiten."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+"Unterkachel auswählen, um ihren z-Index zu ändern.\n"
+"Auf andere Kachel drücken um diese zu bearbeiten."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr "Kachelregion setzen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Tile"
+msgstr "Kachel erstellen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr "Kachel-Icon setzen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr "Kachel-Bitmaske bearbeiten"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Collision Polygon"
+msgstr "Kollisionspolygon bearbeiten"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Occlusion Polygon"
+msgstr "Occlusion-Polygon bearbeiten"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Navigation Polygon"
+msgstr "Navigationspolygon bearbeiten"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste Tile Bitmask"
+msgstr "Kachel-Bitmaske einfügen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr "Kachel-Bitmaske leeren"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Tile"
+msgstr "Kachel entfernen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr "Kollisionspolygon entfernen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr "Occlusion-Polygon entfernen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr "Navigationspolygon entfernen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr "Kachelpriorität bearbeiten"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr "Kachel-Z-Index bearbeiten"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Collision Polygon"
+msgstr "Kollisionspolygon erzeugen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Occlusion Polygon"
+msgstr "Occlusion-Polygon erzeugen"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "This property can't be changed."
-msgstr "Diese Aktion kann nicht ohne eine Szene ausgeführt werden."
+msgstr "Diese Eigenschaft kann nicht geändert werden."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
-msgstr "Kachelsatz"
+msgid "TileSet"
+msgstr "TileSet"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vertex"
-msgstr "Vertices"
+msgstr "Vertex"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Fragment"
msgstr "Fragment"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Light"
-msgstr "Rechts"
+msgstr "Licht"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "VisualShader"
-msgstr "Shader"
+msgstr "VisualShader"
#: editor/project_export.cpp
msgid "Runnable"
@@ -6849,6 +6923,14 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr "Export-Vorlagen für dieses Systeme fehlen / sind fehlerhaft:"
#: editor/project_export.cpp
+msgid "Release"
+msgstr "Veröffentlichung"
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr "Exportiere alles"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr "Vorlagen"
@@ -6857,6 +6939,10 @@ msgid "Add..."
msgstr "Hinzufügen..."
#: editor/project_export.cpp
+msgid "Export Path"
+msgstr "Exportpfad"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr "Ressourcen"
@@ -6915,10 +7001,46 @@ msgid "Feature List:"
msgstr "Funktionalitätsliste:"
#: editor/project_export.cpp
+msgid "Script"
+msgstr "Skript"
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "Skript-Exportmodus:"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr "Text"
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr "Kompiliert"
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "Verschlüsselt (Schlüssel unten angeben)"
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr "Ungültiger Schlüssel (muss 64 Zeichen lang sein)"
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "Skript-Schlüssel (256 Bit hexadezimal):"
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr "Exportiere PCK/Zip"
#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr "Export-Modus?"
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr "Alles exportieren"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr "Export-Templates für diese Systeme fehlen:"
@@ -6931,22 +7053,20 @@ msgid "The path does not exist."
msgstr "Dieser Pfad existiert nicht."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
-msgstr "Ein Ordner ohne ‚project.godot‘-Datei muss ausgewählt werden."
+msgstr "Ungültige Projekt-Zipdatei, enthält keine ‚project.godot‘-Datei."
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "Bitte einen leeren Ordner auswählen."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "Eine ‚project.godot‘-Datei auswählen."
+msgstr "Eine ‚project.godot‘-Datei oder Zipdatei auswählen."
#: editor/project_manager.cpp
msgid "Directory already contains a Godot project."
-msgstr ""
+msgstr "Das Verzeichnis beinhaltet bereits ein Godot-Projekt."
#: editor/project_manager.cpp
msgid "Imported Project"
@@ -7038,9 +7158,8 @@ msgid "Project Path:"
msgstr "Projektpfad:"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Project Installation Path:"
-msgstr "Projektpfad:"
+msgstr "Projektinstallationspfad:"
#: editor/project_manager.cpp
msgid "Browse"
@@ -7051,8 +7170,8 @@ msgid "Unnamed Project"
msgstr "Unbenanntes Projekt"
#: editor/project_manager.cpp
-msgid "Can't open project"
-msgstr "Projekt kann nicht geöffnet werden"
+msgid "Can't open project at '%s'."
+msgstr "Projekt in ‚%s‘ kann nicht geöffnet werden."
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
@@ -7060,6 +7179,34 @@ msgstr "Sollen wirklich mehrere Projekte geöffnet werden?"
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+"Die folgende Projekteinstellungsdatei wurde mit einer älteren Godot-Version "
+"erzeugt und muss für die gegenwärtige Version angepasst werden:\n"
+"\n"
+"%s\n"
+"\n"
+"Sollen die Anpassungen vorgenommen werden?\n"
+"Achtung: Das Projekt kann nach der Anpassung nicht mehr mit einer älteren "
+"Godot-Version geöffnet werden."
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+"Die Projekteinstellungen wurden mit einer neueren Godot-Version erstellt und "
+"sind nicht kompatibel mit der aktuell genutzten Version."
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7163,13 +7310,12 @@ msgid "Mouse Button"
msgstr "Maustaste"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid ""
"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
msgstr ""
"Ungültiger Aktionsname. Er kann weder leer sein noch ‚/‘, ‚:‘, ‚=‘, ‘\\‘ "
-"oder ‚\"‘ enthalten."
+"oder ‚\"‘ enthalten"
#: editor/project_settings_editor.cpp
msgid "Action '%s' already exists!"
@@ -7180,18 +7326,16 @@ msgid "Rename Input Action Event"
msgstr "Eingabeaktionsereignis umbenennen"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Change Action deadzone"
-msgstr "Animationsname ändern:"
+msgstr "Nullschwelle der Aktion ändern"
#: editor/project_settings_editor.cpp
msgid "Add Input Action Event"
msgstr "Eingabeaktionsereignis hinzufügen"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "All Devices"
-msgstr "Gerät"
+msgstr "Alle Geräte"
#: editor/project_settings_editor.cpp
msgid "Device"
@@ -7238,24 +7382,20 @@ msgid "Wheel Down Button"
msgstr "Mausrad herunter"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Left Button"
-msgstr "Mausrad hoch"
+msgstr "Mausrad links"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Right Button"
-msgstr "Rechte Taste"
+msgstr "Mausrad rechts"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 1"
-msgstr "Taste 6"
+msgstr "X-Knopf 1"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 2"
-msgstr "Taste 6"
+msgstr "X-Knopf 2"
#: editor/project_settings_editor.cpp
msgid "Joypad Axis Index:"
@@ -7283,7 +7423,7 @@ msgstr "Ereignis hinzufügen"
#: editor/project_settings_editor.cpp
msgid "Button"
-msgstr "Schaltfläche"
+msgstr "Knopf"
#: editor/project_settings_editor.cpp
msgid "Left Button."
@@ -7397,21 +7537,17 @@ msgstr "Projekteinstellungen (project.godot)"
msgid "General"
msgstr "Allgemein"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr "Eigenschaft:"
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr "Überschreiben für..."
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Editor must be restarted for changes to take effect"
-msgstr ""
+msgstr "Damit Änderungen Wirkung zeigen muss der Editor neu gestartet werden"
#: editor/project_settings_editor.cpp
msgid "Input Map"
-msgstr "Eingabe Zuordnung"
+msgstr "Eingabe-Zuordnung"
#: editor/project_settings_editor.cpp
msgid "Action:"
@@ -7423,7 +7559,7 @@ msgstr "Aktion"
#: editor/project_settings_editor.cpp
msgid "Deadzone"
-msgstr ""
+msgstr "Nullschwelle"
#: editor/project_settings_editor.cpp
msgid "Device:"
@@ -7533,10 +7669,6 @@ msgstr "Node auswählen"
msgid "Bit %d, val %d."
msgstr "Bit %d, Wert %d."
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr "Eigenschaften:"
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr "Eigenschaft auswählen"
@@ -7559,97 +7691,93 @@ msgstr ""
"Umgewandeltes Bild kann mittels PVRTC-Werkzeug nicht zurück geladen werden:"
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Batch Rename"
-msgstr "Umbenennen"
+msgstr "Stapelweise Umbenennung"
#: editor/rename_dialog.cpp
msgid "Prefix"
-msgstr ""
+msgstr "Prefix"
#: editor/rename_dialog.cpp
msgid "Suffix"
-msgstr ""
+msgstr "Suffix"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Advanced options"
-msgstr "Einrasteinstellungen"
+msgstr "Erweiterte Einstellungen"
#: editor/rename_dialog.cpp
msgid "Substitute"
-msgstr ""
+msgstr "Ersatz"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node name"
-msgstr "Node-Name:"
+msgstr "Node-Name"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
-msgstr ""
+msgstr "Name des Eltern-Nodes, falls vorhanden"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node type"
-msgstr "Node-Typ finden"
+msgstr "Node-Typ"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Current scene name"
-msgstr "Aktuelle Szene"
+msgstr "Aktueller Szenenname"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Root node name"
-msgstr "Name des Root-Node:"
+msgstr "Name des Root-Nodes"
#: editor/rename_dialog.cpp
msgid ""
"Sequential integer counter.\n"
"Compare counter options."
msgstr ""
+"Sequenzieller ganzzahliger Zähler.\n"
+"Zahleroptionen vergleichen."
#: editor/rename_dialog.cpp
msgid "Per Level counter"
-msgstr ""
+msgstr "Pro-Ebene-Zähler"
#: editor/rename_dialog.cpp
msgid "If set the counter restarts for each group of child nodes"
msgstr ""
+"Falls gesetzt startet dieser Zähler für jede Gruppe aus Unterobjekten neu"
#: editor/rename_dialog.cpp
msgid "Initial value for the counter"
-msgstr ""
+msgstr "Anfangswert für Zähler"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Step"
-msgstr "Schritt:"
+msgstr "Schritt"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
-msgstr ""
+msgid "Amount by which counter is incremented for each node"
+msgstr "Wert um welchen der Zähler für jedes Node erhöht wird"
#: editor/rename_dialog.cpp
msgid "Padding"
-msgstr ""
+msgstr "Versatz"
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
+"Minimale Anzahl an Ziffern für diesen Zähler.\n"
+"Fehlende Ziffern werden mit führenden Nullen ergänzt."
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Regular Expressions"
-msgstr "Ausdruck ändern"
+msgstr "Reguläre Ausdrücke"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Post-Process"
-msgstr "Post-Process Skript:"
+msgstr "Nachbearbeitung"
#: editor/rename_dialog.cpp
msgid "Keep"
@@ -7657,32 +7785,29 @@ msgstr "Behalten"
#: editor/rename_dialog.cpp
msgid "CamelCase to under_scored"
-msgstr ""
+msgstr "CamelCase zu unter_strich"
#: editor/rename_dialog.cpp
msgid "under_scored to CamelCase"
-msgstr ""
+msgstr "unter_strich zu CamelCase"
#: editor/rename_dialog.cpp
msgid "Case"
-msgstr ""
+msgstr "Form"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Lowercase"
-msgstr "Kleinbuchstaben"
+msgstr "Zu Kleinbuchstaben"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Uppercase"
-msgstr "Großbuchstaben"
+msgstr "Zu Großbuchstaben"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Reset"
-msgstr "Vergrößerung zurücksetzen"
+msgstr "Zurücksetzen"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr "Fehler"
@@ -7744,6 +7869,10 @@ msgid "Instance Scene(s)"
msgstr "Instanz-Szene(n)"
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "Szene hier instantiieren"
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr "Skript leeren"
@@ -7781,6 +7910,14 @@ msgid "Save New Scene As..."
msgstr "Speichere neue Szene als..."
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+"Wenn „Editierbare Instanz“ deaktiviert wird, werden alle Eigenschaften "
+"dieses Nodes wieder in ihren Ausgangszustand zurückgesetzt."
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr "bearbeitbare Unterobjekte"
@@ -7793,29 +7930,24 @@ msgid "Make Local"
msgstr "Lokal machen"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "Erzeuge Node"
+msgstr "Erzeuge Wurzel-Node:"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "2D Scene"
-msgstr "Szene"
+msgstr "2D Szene"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "3D Scene"
-msgstr "Szene"
+msgstr "3D Szene"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "User Interface"
-msgstr "Leere Vererbung"
+msgstr "Benutzerschnittstelle"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Custom Node"
-msgstr "Nodes trennen"
+msgstr "Selbst-erstelltes Node"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
@@ -7858,6 +7990,10 @@ msgid "Clear Inheritance"
msgstr "Leere Vererbung"
#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr "Dokumentation öffnen"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr "Node(s) löschen"
@@ -7866,17 +8002,16 @@ msgid "Add Child Node"
msgstr "Node hier anhängen"
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
-msgstr "Szene hier instantiieren"
-
-#: editor/scene_tree_dock.cpp
msgid "Change Type"
msgstr "Typ ändern"
#: editor/scene_tree_dock.cpp
-#, fuzzy
+msgid "Extend Script"
+msgstr "Skript erweitern"
+
+#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
-msgstr "Verstehe!"
+msgstr "Szenen-Wurzel erstellen"
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
@@ -7912,7 +8047,7 @@ msgstr "Ein neues oder existierendes Skript zum ausgewählten Node hinzufügen."
#: editor/scene_tree_dock.cpp
msgid "Clear a script for the selected node."
-msgstr "Leere ein Skript für das ausgewählte Node."
+msgstr "Entferne Skript von ausgewähltem Node."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -7927,7 +8062,6 @@ msgid "Clear Inheritance? (No Undo!)"
msgstr "Vererbung wirklich leeren? (Lässt sich nicht rückgängig machen!)"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Toggle Visible"
msgstr "Sichtbarkeit umschalten"
@@ -7936,13 +8070,12 @@ msgid "Node configuration warning:"
msgstr "Node-Konfigurationswarnung:"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node has connection(s) and group(s).\n"
"Click to show signals dock."
msgstr ""
-"Node hat Verbindungen und Gruppen\n"
-"Hier klicken zur Signalverwaltung."
+"Node hat Verbindungen und Gruppen.\n"
+"Klicken um Signalverwaltung aufzurufen."
#: editor/scene_tree_editor.cpp
msgid ""
@@ -7961,27 +8094,24 @@ msgstr ""
"Hier klicken zur Gruppenverwaltung."
#: editor/scene_tree_editor.cpp editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script"
msgstr "Skript öffnen"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node is locked.\n"
"Click to unlock it."
msgstr ""
"Node ist gesperrt.\n"
-"Hier klicken zum entsperren"
+"Zum Entsperren klicken."
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Children are not selectable.\n"
"Click to make selectable."
msgstr ""
"Unterobjekte sind nicht auswählbar.\n"
-"Hier klicken um auswählbar zu machen"
+"Zum auswählbar machen klicken."
#: editor/scene_tree_editor.cpp
msgid "Toggle Visibility"
@@ -7992,6 +8122,8 @@ msgid ""
"AnimationPlayer is pinned.\n"
"Click to unpin."
msgstr ""
+"AnimationPlayer ist angeheftet.\n"
+"Zum Losheften klicken."
#: editor/scene_tree_editor.cpp
msgid "Invalid node name, the following characters are not allowed:"
@@ -8031,15 +8163,18 @@ msgid "N/A"
msgstr "Nicht verfügbar"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script/Choose Location"
-msgstr "Skripteditor öffnen"
+msgstr "Skript öffnen / Ort wählen"
#: editor/script_create_dialog.cpp
msgid "Path is empty"
msgstr "Pfad ist leer"
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr "Dateiname ist leer"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr "Pfad ist nicht lokal"
@@ -8101,7 +8236,7 @@ msgstr "Sprache"
#: editor/script_create_dialog.cpp
msgid "Inherits"
-msgstr "Erbt"
+msgstr "Erbt von"
#: editor/script_create_dialog.cpp
msgid "Class Name"
@@ -8128,20 +8263,8 @@ msgid "Bytes:"
msgstr "Bytes:"
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr "Warnung"
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr "Fehler:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr "Quelle:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
-msgstr "Funktion:"
+msgid "Stack Trace"
+msgstr "Stacktrace"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8157,7 +8280,7 @@ msgstr "Unterprozess verbunden"
#: editor/script_editor_debugger.cpp
msgid "Copy Error"
-msgstr "Kopierfehler"
+msgstr "Fehlermeldung kopieren"
#: editor/script_editor_debugger.cpp
msgid "Inspect Previous Instance"
@@ -8169,19 +8292,7 @@ msgstr "Nächste Instanz untersuchen"
#: editor/script_editor_debugger.cpp
msgid "Stack Frames"
-msgstr "Einzelbilder stapeln"
-
-#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr "Variable"
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr "Fehler:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr "Stack Trace (falls geeignet):"
+msgstr "Aufrufsverlauf"
#: editor/script_editor_debugger.cpp
msgid "Profiler"
@@ -8272,9 +8383,8 @@ msgid "Change Camera Size"
msgstr "Ändere Kameragröße"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Notifier AABB"
-msgstr "Ändere Ausmaße des Benachrichtigers"
+msgstr "Benachrichtigendes AABB ändern"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Particles AABB"
@@ -8286,53 +8396,47 @@ msgstr "Sondenausmaße ändern"
#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
msgid "Change Sphere Shape Radius"
-msgstr "Ändere Radius der Kugelform"
+msgstr "Kugelformradius ändern"
#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
msgid "Change Box Shape Extents"
-msgstr "Ändere Ausmaße der Kastenform"
+msgstr "Kastenformausmaße ändern"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Capsule Shape Radius"
-msgstr "Ändere Radius der Kapselform"
+msgstr "Kapselfromradius ändern"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Capsule Shape Height"
-msgstr "Ändere Höhe der Kapselform"
+msgstr "Kapselformhöhe ändern"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Radius"
-msgstr "Ändere Radius der Kapselform"
+msgstr "Zylinderformradius ändern"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Height"
-msgstr "Ändere Höhe der Kapselform"
+msgstr "Zylinderformhöhe ändern"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Ray Shape Length"
msgstr "Ändere Länge der Strahlenform"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Radius"
-msgstr "Ändere Lichtradius"
+msgstr "Zylinderradius ändern"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Height"
-msgstr "Ändere Höhe der Kapselform"
+msgstr "Zylinderhöhe ändern"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Inner Radius"
-msgstr "Ändere Radius der Kugelform"
+msgstr "Inneren Torusradius ändern"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Outer Radius"
-msgstr "Ändere Lichtradius"
+msgstr "Äußeren Torusradius ändern"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select the dynamic library for this entry"
@@ -8387,7 +8491,7 @@ msgid "GDNative"
msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+msgid "Step argument is zero!"
msgstr "Schrittargument ist null!"
#: modules/gdscript/gdscript_functions.cpp
@@ -8453,9 +8557,8 @@ msgid "GridMap Delete Selection"
msgstr "GridMap-Auswahl löschen"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Fill Selection"
-msgstr "GridMap-Auswahl löschen"
+msgstr "GridMap-Auswahl füllen"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Duplicate Selection"
@@ -8483,15 +8586,15 @@ msgstr "Unten einrasten"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Edit X Axis"
-msgstr "X-Achse editieren"
+msgstr "X-Achse bearbeiten"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Edit Y Axis"
-msgstr "Y-Achse editieren"
+msgstr "Y-Achse bearbeiten"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Edit Z Axis"
-msgstr "Z-Achse editieren"
+msgstr "Z-Achse bearbeiten"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Rotate X"
@@ -8538,9 +8641,8 @@ msgid "Clear Selection"
msgstr "Auswahl leeren"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Fill Selection"
-msgstr "Alle auswählen"
+msgstr "Auswahl füllen"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Settings"
@@ -8611,12 +8713,8 @@ msgid "End of inner exception stack trace"
msgstr "Ende des inneren Exception-Stack-Traces"
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr "Vorrendern!"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
-msgstr "Das Navigations-Mesh backen."
+msgid "Bake NavMesh"
+msgstr "NavMesh backen"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8845,14 +8943,12 @@ msgid "Connect Nodes"
msgstr "Nodes verbinden"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Data"
-msgstr "Nodes verbinden"
+msgstr "Node-Daten verbinden"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Sequence"
-msgstr "Nodes verbinden"
+msgstr "Node-Sequenzen verbinden"
#: modules/visual_script/visual_script_editor.cpp
msgid "Script already has function '%s'"
@@ -8899,6 +8995,10 @@ msgid "Base Type:"
msgstr "Basistyp:"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "Mitglieder:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "Verfügbare Nodes:"
@@ -8936,9 +9036,8 @@ msgid "Paste Nodes"
msgstr "Nodes einfügen"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
-msgstr "Mitglieder"
+msgstr "Mitglied bearbeiten"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Input type not iterable: "
@@ -8999,17 +9098,16 @@ msgstr ""
"String (für Fehler) sein."
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Search VisualScript"
-msgstr "VisualScript-Node entfernen"
+msgstr "VisualScript suchen"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
-msgstr "Abfragen"
+msgid "Get %s"
+msgstr "%s abrufen"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
-msgstr ""
+msgid "Set %s"
+msgstr "%s setzen"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -9061,15 +9159,14 @@ msgstr ""
"Rest wird ignoriert."
#: scene/2d/collision_object_2d.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
"define its shape."
msgstr ""
"Dieses Node besitzt keine untergeordneten Formen, es kann deshalb nicht mit "
-"dem Raum interagieren.\n"
-"Es wird empfohlen CollisionShape2D oder CollisionPolygon2D Unterobjekte "
+"anderen Objekten kollidieren oder interagieren.\n"
+"Es wird empfohlen CollisionShape2D- oder CollisionPolygon2D-Unterobjekte "
"hinzuzufügen um seine Form festzulegen."
#: scene/2d/collision_polygon_2d.cpp
@@ -9106,6 +9203,14 @@ msgstr ""
"Damit CollisionShape2D funktionieren kann, muss eine Form angegeben werden. "
"Bitte erzeuge eine Shape-Ressource dafür!"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+"CPUParticles2D-Animationen benötigen ein CanvasItemMaterial mit der "
+"Eigenschaft „Particles Animation“ aktiviert."
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -9159,6 +9264,14 @@ msgstr ""
"Es ist kein Material zum Verarbeiten der Partikel zugewiesen, deshalb ist "
"kein Verhalten definiert."
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+"Particles2D-Animationen benötigen ein CanvasItemMaterial mit der Eigenschaft "
+"„Particles Animation“ aktiviert."
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -9173,7 +9286,7 @@ msgid ""
msgstr ""
"Größenänderungen von RigidBody2D (in den Character- oder Rigid-Modi) werden "
"überschrieben wenn die Physikengine läuft.\n"
-"Die Größe der entsprechenden Collisionshape-Unterobjekte sollte stattdessen "
+"Die Größe der entsprechenden Collision-Shape-Unterobjekte sollte stattdessen "
"geändert werden."
#: scene/2d/remote_transform_2d.cpp
@@ -9184,16 +9297,20 @@ msgstr ""
#: scene/2d/skeleton_2d.cpp
msgid "This Bone2D chain should end at a Skeleton2D node."
-msgstr ""
+msgstr "Diese Bone2D-Kette sollte an einem Skeleton2D-Node enden."
#: scene/2d/skeleton_2d.cpp
msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
msgstr ""
+"Ein Bone2D kann nur zusammen mit einem Skeleton2D oder einem anderen Bone2D "
+"als Eltern-Objekt funktionieren."
#: scene/2d/skeleton_2d.cpp
msgid ""
"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
msgstr ""
+"Dieser Knochen hat keine korrekte Ruhe-Pose. Diese kann am Skeleton2D-Node "
+"festgelegt werden."
#: scene/2d/visibility_notifier_2d.cpp
msgid ""
@@ -9260,15 +9377,14 @@ msgid "Lighting Meshes: "
msgstr "Beleuchte Meshe: "
#: scene/3d/collision_object.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape or CollisionPolygon as a child to define "
"its shape."
msgstr ""
"Dieses Node besitzt keine untergeordneten Formen, es kann deshalb nicht mit "
-"dem Raum interagieren.\n"
-"Es wird empfohlen CollisionShape oder CollisionPolygon Unterobjekte "
+"anderen Objekten kollidieren oder interagieren.\n"
+"Es wird empfohlen CollisionShape- oder CollisionPolygon-Unterobjekte "
"hinzuzufügen um seine Form festzulegen."
#: scene/3d/collision_polygon.cpp
@@ -9303,6 +9419,18 @@ msgstr ""
"Damit CollisionShape funktionieren kann, muss eine Form vorhanden sein. "
"Bitte erzeuge eine shape Ressource dafür!"
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr "Nichts ist sichtbar da kein Mesh zugewiesen wurden."
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+"CPUParticles-Animationen benötigen ein SpatialMaterial mit der Eigenschaft "
+"„Billboard Particles“ aktiviert."
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr "Plotte Mesh"
@@ -9327,6 +9455,34 @@ msgid ""
msgstr ""
"Nichts ist sichtbar da keine Meshe den Zeichendurchläufen zugewiesen wurden."
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+"Particles-Animationen benötigen ein SpatialMaterial mit der Eigenschaft "
+"„Billboard Particles“ aktiviert."
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+"PathFollow funktioniert nur, wenn es als Unterobjekt eines Path-Nodes "
+"gesetzt wird."
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+"OrientedPathFollow funktioniert nur, wenn es als Unterobjekt eines Path-"
+"Nodes gesetzt wird."
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+"OrientedPathFollow erfordert die Aktivierung von \"Up Vector\" in der Curve-"
+"Ressource des übergeordneten Pfades."
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9364,17 +9520,16 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid "This body will be ignored until you set a mesh"
-msgstr ""
+msgstr "Diese Körper wird ignoriert werden bis ein Mesh gesetzt wurde"
#: scene/3d/soft_body.cpp
-#, fuzzy
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
-"Größenänderungen von RigidBody (in Character- oder Rigid-Modus) werden "
-"überschrieben wenn die Physikengine läuft.\n"
+"Größenänderungen an SoftBody werden von der Physikengine überschrieben wenn "
+"sie läuft.\n"
"Die Größe der entsprechenden Collisionshape-Unterobjekte sollte stattdessen "
"geändert werden."
@@ -9397,45 +9552,49 @@ msgstr ""
#: scene/animation/animation_blend_tree.cpp
msgid "On BlendTree node '%s', animation not found: '%s'"
-msgstr ""
+msgstr "In BlendTree-Node ‚%s‘, Animation nicht gefunden: ‚%s‘"
#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "Animationswerkzeuge"
+msgstr "Animation nicht gefunden: ‚%s‘"
#: scene/animation/animation_tree.cpp
msgid "In node '%s', invalid animation: '%s'."
-msgstr ""
+msgstr "In Node ‚%s‘, ungültige Animation: ‚%s‘."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "FEHLER: ungültiger Animationsname!"
+msgstr "Ungültige Animation: ‚%s‘."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "'%s' von '%s' trennen"
+msgstr "Nichts ist mit dem Eingang ‚%s‘ von Node ‚%s‘ verbunden."
#: scene/animation/animation_tree.cpp
msgid "A root AnimationNode for the graph is not set."
-msgstr ""
+msgstr "Für diesen Graphen wurde kein Wurzel-Animation-Node festgelegt."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Path to an AnimationPlayer node containing animations is not set."
msgstr ""
-"AnimationPlayer aus dem Szenenbaum auswählen um Animationen zu bearbeiten."
+"Es ist kein Pfad zu einem Animationsspieler mit Animationen festgelegt "
+"worden."
#: scene/animation/animation_tree.cpp
msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
msgstr ""
+"Der Pfad der als AnimationSpieler festgelegt wurde führt nicht zu einem "
+"AnimationPlayer-Node."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "AnimationPlayer root is not a valid node."
-msgstr "Animationsbaum ist ungültig."
+msgstr "Die Wurzel des Animationsspieler ist kein gültiges Node."
+
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+"Dieser Knoten wurde als veraltet markiert. Verwenden Sie stattdessen "
+"AnimationTree."
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
@@ -9453,10 +9612,6 @@ msgstr "Warnung!"
msgid "Please Confirm..."
msgstr "Bitte bestätigen..."
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr "Diesen Ordner auswählen"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9468,6 +9623,10 @@ msgstr ""
"machen ist in Ordnung, aber sie werden zur Laufzeit automatisch wieder "
"versteckt."
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr "Wenn exp_edit true ist muss min_value größer als null sein."
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9522,31 +9681,225 @@ msgid "Invalid font size."
msgstr "Ungültige Schriftgröße."
#: scene/resources/visual_shader.cpp
-#, fuzzy
msgid "Input"
-msgstr "Eingang hinzufügen"
-
-#: scene/resources/visual_shader.cpp
-#, fuzzy
-msgid "None"
-msgstr "<Nichts>"
+msgstr "Eingang"
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for shader."
-msgstr "Fehlerhafte Quelle!"
+msgstr "Ungültige Quelle für Shader."
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
-msgstr ""
+msgstr "Zuweisung an Funktion."
#: servers/visual/shader_language.cpp
msgid "Assignment to uniform."
-msgstr ""
+msgstr "Zuweisung an Uniform."
#: servers/visual/shader_language.cpp
msgid "Varyings can only be assigned in vertex function."
-msgstr ""
+msgstr "Varyings können nur in Vertex-Funktion zugewiesen werden."
+
+#~ msgid "Split point with itself."
+#~ msgstr "Teile Punkt mit sich selbst."
+
+#~ msgid "Split can't form an existing edge."
+#~ msgstr "Teilen kann keine existierende Kante erstellen."
+
+#~ msgid "Split already exists."
+#~ msgstr "Teilung existiert bereits."
+
+#~ msgid "Add Split"
+#~ msgstr "Teilung hinzufügen"
+
+#~ msgid "Invalid Split: "
+#~ msgstr "Ungültige Teilung: "
+
+#~ msgid "Remove Split"
+#~ msgstr "Teilung entfernen"
+
+#~ msgid "Poly"
+#~ msgstr "Poly"
+
+#~ msgid "Splits"
+#~ msgstr "Teilungen"
+
+#~ msgid "Connect two points to make a split."
+#~ msgstr "Zwei Punkte verbinden um Teilung zu erstellen."
+
+#~ msgid "Select a split to erase it."
+#~ msgstr "Teilung zum Löschen auswählen."
+
+#~ msgid "No name provided"
+#~ msgstr "Kein Name angegeben"
+
+#~ msgid "Add Node.."
+#~ msgstr "Node hinzufügen.."
+
+#~ msgid "Create from scene?"
+#~ msgstr "Von Szene erstellen?"
+
+#~ msgid "Create Poly"
+#~ msgstr "Polygon erstellen"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "Polygon von Grund auf neu erstellen"
+
+#~ msgid "Zoom out"
+#~ msgstr "Verkleinern"
+
+#~ msgid "Zoom in"
+#~ msgstr "Vergrößern"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "Polygon3D erstellen"
+
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "Keine OccluderPolygon2D-Ressource für dieses Node gefunden.\n"
+#~ "Neues erstellen und zuweisen?"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "LMT: Punkt verschieben."
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "Strg+LMT: Segment aufteilen."
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "RMT: Punkt entfernen."
+
+#~ msgid "New TextFile"
+#~ msgstr "Neue Textdatei"
+
+#~ msgid "Save Theme As"
+#~ msgstr "Motiv speichern als"
+
+#~ msgid "<None>"
+#~ msgstr "<Nichts>"
+
+#~ msgid ""
+#~ "Select sub-tile to use as icon, this will be also used on invalid "
+#~ "autotile bindings."
+#~ msgstr ""
+#~ "Unterkachel zur Benutzung als Icon auswählen, dieses wird auch für "
+#~ "ungültige Autokachelzuordnungen benutzt werden."
+
+#~ msgid "Zoom:"
+#~ msgstr "Vergrößerung:"
+
+#~ msgid "Are you sure you want to remove all connections from the \""
+#~ msgstr "Sollen wirklich alle Verbindungen entfernt werden von „"
+
+#~ msgid "Class List:"
+#~ msgstr "Klassenliste:"
+
+#~ msgid "Search Classes"
+#~ msgstr "Klassen suchen"
+
+#~ msgid "Public Methods"
+#~ msgstr "Öffentliche Methoden"
+
+#~ msgid "Public Methods:"
+#~ msgstr "Öffentliche Methoden:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "GUI-Thema-Elemente"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "GUI-Theme-Elemente:"
+
+#~ msgid "Property: "
+#~ msgstr "Eigenschaft: "
+
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "Favoriten-Verzeichnisstatus umschalten."
+
+#~ msgid "Show current scene file."
+#~ msgstr "Aktuelle Szenendatei anzeigen."
+
+#~ msgid "Enter tree-view."
+#~ msgstr "Zur Baumansicht."
+
+#~ msgid "Whole words"
+#~ msgstr "Ganze Wörter"
+
+#~ msgid "Match case"
+#~ msgstr "Groß-/Kleinschreibung berücksichtigen"
+
+#~ msgid "Filter: "
+#~ msgstr "Filter: "
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#~ msgid "Show In File System"
+#~ msgstr "Im Dateisystem anzeigen"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "Durchsuche die Klassenhierarchie."
+
+#~ msgid "Search in files"
+#~ msgstr "In Dateien suchen"
+
+#~ msgid ""
+#~ "Built-in scripts can only be edited when the scene they belong to is "
+#~ "loaded"
+#~ msgstr ""
+#~ "Eingebettete Skripte können nur bearbeitet werden wenn die entsprechende "
+#~ "Szene geladen ist"
+
+#~ msgid "Convert To Uppercase"
+#~ msgstr "In Großbuchstaben konvertieren"
+
+#~ msgid "Convert To Lowercase"
+#~ msgstr "In Kleinbuchstaben konvertieren"
+
+#~ msgid "Snap To Floor"
+#~ msgstr "Am Boden einrasten"
+
+#~ msgid "Rotate 0 degrees"
+#~ msgstr "Drehe auf 0 Grad"
+
+#~ msgid "Rotate 90 degrees"
+#~ msgstr "Drehe auf 90 Grad"
+
+#~ msgid "Rotate 180 degrees"
+#~ msgstr "Drehe auf 180 Grad"
+
+#~ msgid "Rotate 270 degrees"
+#~ msgstr "Drehe auf 270 Grad"
+
+#~ msgid "Warning"
+#~ msgstr "Warnung"
+
+#~ msgid "Error:"
+#~ msgstr "Fehler:"
+
+#~ msgid "Source:"
+#~ msgstr "Quelle:"
+
+#~ msgid "Function:"
+#~ msgstr "Funktion:"
+
+#~ msgid "Variable"
+#~ msgstr "Variable"
+
+#~ msgid "Errors:"
+#~ msgstr "Fehler:"
+
+#~ msgid "Stack Trace (if applicable):"
+#~ msgstr "Stack Trace (falls geeignet):"
+
+#~ msgid "Bake!"
+#~ msgstr "Vorrendern!"
+
+#~ msgid "Bake the navigation mesh."
+#~ msgstr "Das Navigations-Mesh backen."
+
+#~ msgid "Get"
+#~ msgstr "Abfragen"
#~ msgid "Change Scalar Constant"
#~ msgstr "Ändere skalare Konstante"
@@ -9752,9 +10105,6 @@ msgstr ""
#~ msgid "Run Script"
#~ msgstr "Skript ausführen"
-#~ msgid "Save the currently edited resource."
-#~ msgstr "Speichere die so eben bearbeitete Ressource."
-
#~ msgid "Stop Profiling"
#~ msgstr "Laufzeitanalyse beenden"
@@ -10052,9 +10402,6 @@ msgstr ""
#~ msgid "Could not save atlas subtexture:"
#~ msgstr "Atlas Untertextur konnte nicht gespeichert werden:"
-#~ msgid "Exporting for %s"
-#~ msgstr "Exportiere für %s"
-
#~ msgid "Setting Up..."
#~ msgstr "Bereite vor..."
@@ -10161,9 +10508,6 @@ msgstr ""
#~ msgid "Source Font:"
#~ msgstr "Quellschriftart:"
-#~ msgid "Source Font Size:"
-#~ msgstr "Quellschriftgröße:"
-
#~ msgid "Dest Resource:"
#~ msgstr "Ziel-Ressource:"
@@ -10240,9 +10584,6 @@ msgstr ""
#~ msgid "Start(s)"
#~ msgstr "Start"
-#~ msgid "Filters"
-#~ msgstr "Filter"
-
#~ msgid "Source path is empty."
#~ msgstr "Quellpfad ist leer."
@@ -10516,15 +10857,9 @@ msgstr ""
#~ msgid "Stereo"
#~ msgstr "Stereo"
-#~ msgid "Pitch"
-#~ msgstr "Tonhöhe"
-
#~ msgid "Window"
#~ msgstr "Fenster"
-#~ msgid "Move Right"
-#~ msgstr "nach rechts"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "Skaliere auf %s%%."
@@ -10592,9 +10927,6 @@ msgstr ""
#~ msgid "just pressed"
#~ msgstr "gerade gedrückt"
-#~ msgid "just released"
-#~ msgstr "gerade losgelassen"
-
#~ msgid ""
#~ "Couldn't read the certificate file. Are the path and password both "
#~ "correct?"
@@ -10903,21 +11235,6 @@ msgstr ""
#~ msgid "Trailing Silence:"
#~ msgstr "Auslaufende Stille:"
-#~ msgid "Script Export Mode:"
-#~ msgstr "Skript-Exportmodus:"
-
-#~ msgid "Text"
-#~ msgstr "Text"
-
-#~ msgid "Compiled"
-#~ msgstr "Kompiliert"
-
-#~ msgid "Encrypted (Provide Key Below)"
-#~ msgstr "Verschlüsselt (Schlüssel unten angeben)"
-
-#~ msgid "Script Encryption Key (256-bits as hex):"
-#~ msgstr "Skript-Schlüssel (256 Bit hexadezimal):"
-
#~ msgid "Export Project PCK"
#~ msgstr "Exportiere Projekt-PCK"
@@ -10927,9 +11244,6 @@ msgstr ""
#~ msgid "Project Export"
#~ msgstr "Projekt exportieren"
-#~ msgid "Export Preset:"
-#~ msgstr "Exportvorlage:"
-
#~ msgid "BakedLightInstance does not contain a BakedLight resource."
#~ msgstr "BakedLightInstance enthält keine BakedLight-Ressource."
diff --git a/editor/translations/de_CH.po b/editor/translations/de_CH.po
index 3c10dc874c..e8977232da 100644
--- a/editor/translations/de_CH.po
+++ b/editor/translations/de_CH.po
@@ -1,6 +1,6 @@
# Swiss High German translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Christian Fisch <christian.fiesel@gmail.com>, 2016.
@@ -8,15 +8,17 @@
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2016-07-17 23:44+0000\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:38+0100\n"
"Last-Translator: Christian Fisch <christian.fiesel@gmail.com>\n"
"Language-Team: Swiss High German <https://hosted.weblate.org/projects/godot-"
"engine/godot/de_CH/>\n"
"Language: de_CH\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.8-dev\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -24,7 +26,7 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr ""
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
@@ -259,7 +261,6 @@ msgstr "Erstelle %d in neuer Ebene inklusiv Bild?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -391,8 +392,7 @@ msgstr ""
msgid "Scale From Cursor"
msgstr ""
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr ""
@@ -406,11 +406,11 @@ msgid "Delete Selection"
msgstr "Script hinzufügen"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+msgid "Go to Next Step"
msgstr ""
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+msgid "Go to Previous Step"
msgstr ""
#: editor/animation_track_editor.cpp
@@ -513,11 +513,11 @@ msgstr ""
msgid "Replaced %d occurrence(s)."
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr ""
@@ -533,15 +533,19 @@ msgstr ""
msgid "Selection Only"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr ""
@@ -550,10 +554,10 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Zoom:"
+msgid "Font Size:"
msgstr ""
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr ""
@@ -585,6 +589,7 @@ msgstr ""
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -664,7 +669,7 @@ msgid "Edit Connection: "
msgstr "Connections editieren"
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -713,23 +718,20 @@ msgid "Recent:"
msgstr ""
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr ""
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr ""
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr ""
@@ -764,8 +766,7 @@ msgid "Resource"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr ""
@@ -786,9 +787,10 @@ msgid "Search Replacement Resource:"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -818,8 +820,9 @@ msgid "Error loading:"
msgstr ""
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
-msgstr ""
+#, fuzzy
+msgid "Load failed due to missing dependencies:"
+msgstr "Szene '%s' hat kapute Abhängigkeiten:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -878,14 +881,6 @@ msgstr "Typ ändern"
msgid "Thanks from the Godot community!"
msgstr ""
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "Okay"
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr ""
@@ -977,7 +972,7 @@ msgid "Uncompressing Assets"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+msgid "Package installed successfully!"
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1061,8 +1056,7 @@ msgid "Bus options"
msgstr ""
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr ""
@@ -1224,7 +1218,7 @@ msgid "Add AutoLoad"
msgstr ""
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr ""
@@ -1232,8 +1226,8 @@ msgstr ""
msgid "Node Name:"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr ""
@@ -1303,12 +1297,17 @@ msgid "Template file not found:"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+#, fuzzy
+msgid "Select Current Folder"
+msgstr "Node(s) löschen"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "Datei existiert, Überschreiben?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
#, fuzzy
-msgid "Select Current Folder"
+msgid "Select This Folder"
msgstr "Node(s) löschen"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1317,13 +1316,14 @@ msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr "Datei öffnen"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
-msgstr ""
+#, fuzzy
+msgid "Show in File Manager"
+msgstr "Datei öffnen"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
@@ -1358,7 +1358,8 @@ msgid "Open a File or Directory"
msgstr "Datei oder Verzeichnis öffnen"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Speichern"
@@ -1416,8 +1417,7 @@ msgstr ""
msgid "Preview:"
msgstr ""
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr ""
@@ -1433,24 +1433,11 @@ msgstr ""
msgid "(Re)Importing Assets"
msgstr ""
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr ""
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr ""
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr ""
@@ -1467,28 +1454,30 @@ msgid "Brief Description:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Members"
+msgid "Properties"
msgstr ""
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
+#: editor/editor_help.cpp
+msgid "Properties:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
+msgid "Methods"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods:"
+msgid "Methods:"
msgstr ""
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr ""
+#, fuzzy
+msgid "Theme Properties"
+msgstr "Node erstellen"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr ""
+#, fuzzy
+msgid "Theme Properties:"
+msgstr "Node erstellen"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1516,7 +1505,12 @@ msgstr ""
#: editor/editor_help.cpp
#, fuzzy
-msgid "Description"
+msgid "Class Description"
+msgstr "Script hinzufügen"
+
+#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
msgstr "Script hinzufügen"
#: editor/editor_help.cpp
@@ -1531,12 +1525,14 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr ""
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "Script hinzufügen"
#: editor/editor_help.cpp
-msgid "Property Description:"
-msgstr ""
+#, fuzzy
+msgid "Property Descriptions:"
+msgstr "Script hinzufügen"
#: editor/editor_help.cpp
msgid ""
@@ -1545,12 +1541,14 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr ""
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "Script hinzufügen"
#: editor/editor_help.cpp
-msgid "Method Description:"
-msgstr ""
+#, fuzzy
+msgid "Method Descriptions:"
+msgstr "Script hinzufügen"
#: editor/editor_help.cpp
msgid ""
@@ -1558,11 +1556,52 @@ msgid ""
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-#: editor/editor_inspector.cpp
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Class"
msgstr ""
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1597,6 +1636,11 @@ msgstr ""
msgid "Error saving resource!"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "Okay"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr ""
@@ -1655,10 +1699,20 @@ msgstr "Ohne eine Szene kann das nicht funktionieren."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr ""
@@ -1892,6 +1946,12 @@ msgstr "Fehler beim Instanzieren der %s Szene"
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1932,6 +1992,12 @@ msgstr ""
msgid "Default"
msgstr ""
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+#, fuzzy
+msgid "Show in FileSystem"
+msgstr "Szene kann nicht gespeichert werden."
+
#: editor/editor_node.cpp
#, fuzzy
msgid "Play This Scene"
@@ -2016,7 +2082,7 @@ msgstr ""
#: editor/editor_node.cpp
#, fuzzy
-msgid "Save all Scenes"
+msgid "Save All Scenes"
msgstr "Neue Szene speichern als..."
#: editor/editor_node.cpp
@@ -2045,7 +2111,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -2070,7 +2136,7 @@ msgstr "Projekteinstellungen"
msgid "Export"
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr ""
@@ -2084,6 +2150,7 @@ msgid "Quit to Project List"
msgstr "Zurück zur Projektliste"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr ""
@@ -2194,10 +2261,6 @@ msgstr ""
msgid "Help"
msgstr ""
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2293,24 +2356,24 @@ msgstr ""
msgid "Disable Update Spinner"
msgstr ""
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr ""
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "Node"
+msgid "FileSystem"
+msgstr ""
#: editor/editor_node.cpp
-msgid "FileSystem"
+msgid "Inspector"
msgstr ""
#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Node"
+
+#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
msgstr ""
@@ -2448,7 +2511,7 @@ msgstr ""
msgid "Physics Frame %"
msgstr ""
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr ""
@@ -2472,7 +2535,7 @@ msgstr ""
msgid "Calls"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2484,20 +2547,43 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Invalid RID"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
#, fuzzy
msgid "New Script"
msgstr "Script hinzufügen"
@@ -2510,10 +2596,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2522,7 +2604,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr ""
@@ -2815,6 +2898,10 @@ msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr ""
#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
@@ -2853,8 +2940,8 @@ msgstr "Szene kann nicht gespeichert werden."
msgid "Unable to update dependencies:"
msgstr "Szene '%s' hat kapute Abhängigkeiten:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2862,10 +2949,6 @@ msgid "Provided name contains invalid characters"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr ""
@@ -2893,29 +2976,22 @@ msgid "Duplicating folder:"
msgstr "Node(s) duplizieren"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr ""
+#, fuzzy
+msgid "Open Scene(s)"
+msgstr "Datei(en) öffnen"
#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
+msgid "Instance"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Move To..."
+msgid "Add to favorites"
msgstr ""
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open Scene(s)"
-msgstr "Datei(en) öffnen"
-
-#: editor/filesystem_dock.cpp
-msgid "Instance"
-msgstr ""
+msgid "Remove from favorites"
+msgstr "Ungültige Bilder löschen"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -2925,12 +3001,20 @@ msgstr ""
msgid "View Owners..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr ""
+
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Duplicate..."
msgstr "Node(s) duplizieren"
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
msgstr "Script hinzufügen"
@@ -2939,6 +3023,14 @@ msgstr "Script hinzufügen"
msgid "New Resource..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr ""
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -2959,24 +3051,15 @@ msgid "Re-Scan Filesystem"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Toggle folder status as Favorite."
+msgid "Toggle split mode"
msgstr ""
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Show current scene file."
-msgstr "Node(s) löschen"
-
-#: editor/filesystem_dock.cpp
-msgid "Instance the selected scene(s) as child of the selected node."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
+msgid "Search files"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Search files"
+msgid "Instance the selected scene(s) as child of the selected node."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2985,7 +3068,7 @@ msgid ""
"Please Wait..."
msgstr ""
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr ""
@@ -3002,28 +3085,21 @@ msgid "Create Script"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Find in files"
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Find: "
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Whole words"
-msgstr ""
+#, fuzzy
+msgid "Find in Files"
+msgstr "Node Filter editieren"
#: editor/find_in_files.cpp
-msgid "Match case"
+msgid "Find:"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Folder: "
+msgid "Folder:"
msgstr ""
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Filter: "
+msgid "Filters:"
msgstr "Node erstellen"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -3040,6 +3116,10 @@ msgid "Cancel"
msgstr "Abbrechen"
#: editor/find_in_files.cpp
+msgid "Find: "
+msgstr ""
+
+#: editor/find_in_files.cpp
msgid "Replace: "
msgstr ""
@@ -3062,7 +3142,7 @@ msgstr ""
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr "Projektname:"
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3200,18 +3280,14 @@ msgstr ""
msgid "Failed to load resource."
msgstr ""
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "Okay"
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
-msgstr ""
+#, fuzzy
+msgid "Collapse All Properties"
+msgstr "Node erstellen"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -3255,6 +3331,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr ""
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr ""
@@ -3320,15 +3400,15 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
-msgstr ""
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
+msgstr "Node erstellen"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
-msgstr ""
+#, fuzzy
+msgid "Edit Polygon"
+msgstr "Script hinzufügen"
#: editor/plugins/abstract_polygon_2d_editor.cpp
#, fuzzy
@@ -3336,31 +3416,33 @@ msgid "Insert Point"
msgstr "Bild einfügen"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
-msgstr ""
+#, fuzzy
+msgid "Remove Polygon And Point"
+msgstr "Ungültige Bilder löschen"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr ""
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr "Bild einfügen"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
#, fuzzy
-msgid "Delete points"
-msgstr "Bild einfügen"
+msgid "Erase points."
+msgstr "Oberfläche %d"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3374,7 +3456,7 @@ msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Load.."
+msgid "Load..."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3403,15 +3485,9 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Bild einfügen"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "Oberfläche %d"
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3451,9 +3527,8 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3489,7 +3564,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
-msgid "Add Node.."
+msgid "Add Node..."
msgstr "Node"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3770,8 +3845,9 @@ msgid "Connect nodes."
msgstr "Verbindung zu Node:"
#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Remove selected node or transition"
-msgstr ""
+#, fuzzy
+msgid "Remove selected node or transition."
+msgstr "Ungültige Bilder löschen"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
@@ -3839,10 +3915,6 @@ msgid "Amount:"
msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr ""
@@ -4043,7 +4115,7 @@ msgstr ""
msgid "Plugins"
msgstr ""
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr ""
@@ -4173,6 +4245,10 @@ msgid "Resize CanvasItem"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
msgstr ""
@@ -4193,15 +4269,15 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom out"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom reset"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom in"
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -4235,6 +4311,11 @@ msgid "Rotate Mode"
msgstr "Node erstellen"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "TimeScale-Node"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4329,6 +4410,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "Bild einfügen"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr ""
@@ -4380,6 +4466,10 @@ msgid "Show Viewport"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr ""
@@ -4450,7 +4540,16 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "Node erstellen"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
msgstr ""
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
@@ -4555,35 +4654,9 @@ msgid "Item List Editor"
msgstr ""
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr ""
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr ""
@@ -4818,12 +4891,12 @@ msgid "Populate"
msgstr ""
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
+msgid "Generating Visibility Rect"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -4853,6 +4926,12 @@ msgstr "Inhalt der Emissions-Masken löschen"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "Convert to CPUParticles"
+msgstr "Verbindung zu Node:"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr ""
@@ -4926,13 +5005,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "Verbindung zu Node:"
+msgid "Generate AABB"
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -4956,6 +5034,11 @@ msgid "Add Point to Curve"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "Node Kurve editieren"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr ""
@@ -4983,6 +5066,10 @@ msgid "Click: Add Point"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr ""
@@ -4998,11 +5085,6 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr ""
@@ -5062,6 +5144,10 @@ msgstr ""
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5073,7 +5159,13 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync bones"
+msgid "Sync Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5085,29 +5177,27 @@ msgid "Create Polygon & UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "Neues Projekt erstellen"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+#, fuzzy
+msgid "Remove Internal Vertex"
+msgstr "Ungültige Bilder löschen"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split already exists."
+msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Add Split"
+msgid "Add Custom Polygon"
msgstr "Script hinzufügen"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Invalid Split: "
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
+msgid "Remove Custom Polygon"
msgstr "Ungültige Bilder löschen"
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5115,10 +5205,20 @@ msgid "Transform UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
+#, fuzzy
+msgid "Transform Polygon"
+msgstr "Transformationstyp"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Open Polygon 2D UV editor."
+msgstr "Polygon 2D UV Editor"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
msgstr "Polygon 2D UV Editor"
@@ -5127,12 +5227,14 @@ msgid "UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Poly"
-msgstr ""
+#, fuzzy
+msgid "Points"
+msgstr "Ungültige Bilder löschen"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Splits"
-msgstr ""
+#, fuzzy
+msgid "Polygons"
+msgstr "Script hinzufügen"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Bones"
@@ -5140,12 +5242,8 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
-msgstr "Node erstellen"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
-msgstr ""
+msgid "Move Points"
+msgstr "Ungültige Bilder löschen"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
@@ -5172,19 +5270,21 @@ msgid "Scale Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Select a split to erase it"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5209,6 +5309,11 @@ msgid "Grid Settings"
msgstr "Projekteinstellungen"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr ""
@@ -5266,22 +5371,22 @@ msgid "Paste Resource"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr ""
@@ -5312,6 +5417,10 @@ msgid "Error writing TextFile:"
msgstr "Szene kann nicht gespeichert werden."
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Error could not load file."
msgstr ""
@@ -5321,20 +5430,24 @@ msgid "Error saving file!"
msgstr "Szene kann nicht gespeichert werden."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr ""
+#, fuzzy
+msgid "Error while saving theme."
+msgstr "Szene kann nicht gespeichert werden."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
-msgstr ""
+#, fuzzy
+msgid "Error Saving"
+msgstr "Szene kann nicht gespeichert werden."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr ""
+#, fuzzy
+msgid "Error importing theme."
+msgstr "Fehler beim Exportieren des Projekts!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
-msgstr ""
+#, fuzzy
+msgid "Error Importing"
+msgstr "Szene kann nicht gespeichert werden."
#: editor/plugins/script_editor_plugin.cpp
msgid "New TextFile..."
@@ -5355,6 +5468,14 @@ msgid "Import Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr ""
@@ -5396,8 +5517,8 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile"
-msgstr "Datei(en) öffnen"
+msgid "Open..."
+msgstr "Öffnen"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5412,11 +5533,7 @@ msgid "Copy Script Path"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+msgid "History Previous"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5429,15 +5546,15 @@ msgid "Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Reload Theme"
+msgid "Import Theme..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme"
+msgid "Reload Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
+msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5487,7 +5604,7 @@ msgid "Keep Debugger Open"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5495,10 +5612,6 @@ msgid "Open Godot online documentation"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -5533,18 +5646,9 @@ msgid "Debugger"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search results"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Search in files"
-msgstr "Szene kann nicht gespeichert werden."
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
+msgid "Search Results"
+msgstr "Ungültige Bilder löschen"
#: editor/plugins/script_text_editor.cpp
msgid "Line"
@@ -5555,6 +5659,14 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr ""
@@ -5586,10 +5698,6 @@ msgstr ""
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5643,12 +5751,14 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
-msgstr ""
+#, fuzzy
+msgid "Convert Indent to Spaces"
+msgstr "Verbindung zu Node:"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
-msgstr ""
+#, fuzzy
+msgid "Convert Indent to Tabs"
+msgstr "Verbindung zu Node:"
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
@@ -5664,36 +5774,27 @@ msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
+msgid "Go to Next Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
+msgid "Go to Previous Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Convert To Lowercase"
-msgstr "Verbindung zu Node:"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+msgid "Go to Function..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5787,6 +5888,14 @@ msgid "Animation Key Inserted."
msgstr "Animationsbild eingefügt."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -5954,6 +6063,10 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -6056,10 +6169,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap To Floor"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6176,6 +6285,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
msgstr ""
@@ -6293,11 +6406,16 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6464,6 +6582,11 @@ msgid "Fix Invalid Tiles"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "Script hinzufügen"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6509,33 +6632,39 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "Script hinzufügen"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr ""
+#, fuzzy
+msgid "Rotate left"
+msgstr "Node erstellen"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
+#, fuzzy
+msgid "Rotate right"
+msgstr "Node erstellen"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip vertically"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Clear transform"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr "Node von Szene"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr "Ungültige Bilder löschen"
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6547,25 +6676,47 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "Node erstellen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "Oberfläche %d"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "Node erstellen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "Ungültige Bilder löschen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6573,7 +6724,12 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Ungültige Bilder löschen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6583,16 +6739,27 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "Node(s) löschen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr ""
+msgstr "Node(s) löschen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "Bild einfügen"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr "Node(s) löschen"
@@ -6611,12 +6778,99 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr "Node(s) löschen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Set Tile Region"
+msgstr "2D-Textur"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Node erstellen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "Node Filter editieren"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Script hinzufügen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Script hinzufügen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Script hinzufügen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "Node erstellen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Ungültige Bilder löschen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "Ungültige Bilder löschen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "Node Filter editieren"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Node erstellen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Node erstellen"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "This property can't be changed."
msgstr "Ohne eine Szene kann das nicht funktionieren."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Tile Set"
+msgid "TileSet"
msgstr "Datei(en) öffnen"
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6652,6 +6906,14 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6660,6 +6922,11 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "Projekt exportieren"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6717,10 +6984,49 @@ msgstr ""
#: editor/project_export.cpp
#, fuzzy
+msgid "Script"
+msgstr "Script hinzufügen"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Script Export Mode:"
+msgstr "Projekt exportieren"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
+#, fuzzy
msgid "Export PCK/Zip"
msgstr "Exportiere das Projekt PCK"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export mode?"
+msgstr "Projekt exportieren"
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -6859,7 +7165,7 @@ msgstr ""
#: editor/project_manager.cpp
#, fuzzy
-msgid "Can't open project"
+msgid "Can't open project at '%s'."
msgstr "Neues Projekt erstellen"
#: editor/project_manager.cpp
@@ -6868,6 +7174,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7187,10 +7511,6 @@ msgstr "Projekteinstellungen"
msgid "General"
msgstr ""
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7327,10 +7647,6 @@ msgstr "TimeScale-Node"
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr ""
@@ -7416,7 +7732,7 @@ msgid "Step"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7425,7 +7741,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7467,7 +7783,7 @@ msgstr ""
msgid "Reset"
msgstr ""
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7526,6 +7842,10 @@ msgid "Instance Scene(s)"
msgstr "Instanziere Szene(n)"
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
#, fuzzy
msgid "Clear Script"
msgstr "Script hinzufügen"
@@ -7564,6 +7884,12 @@ msgid "Save New Scene As..."
msgstr "Neue Szene speichern als..."
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7639,6 +7965,10 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr "Node(s) löschen"
@@ -7647,14 +7977,15 @@ msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
-msgstr ""
-
-#: editor/scene_tree_dock.cpp
msgid "Change Type"
msgstr "Typ ändern"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Extend Script"
+msgstr "Script hinzufügen"
+
+#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
msgstr ""
@@ -7806,6 +8137,10 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -7899,19 +8234,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -7944,18 +8267,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -8153,7 +8464,7 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+msgid "Step argument is zero!"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
@@ -8381,11 +8692,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -8675,6 +8982,10 @@ msgid "Base Type:"
msgstr "Typ ändern"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Available Nodes:"
msgstr "TimeScale-Node"
@@ -8778,11 +9089,11 @@ msgid "Search VisualScript"
msgstr "Ungültige Bilder löschen"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8866,6 +9177,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -8913,6 +9230,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -9037,6 +9360,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -9056,6 +9389,32 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+"PathFollow2D funktioniert nur, wenn sie als Unterobjekt eines Path2D Nodes "
+"gesetzt wird."
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+"PathFollow2D funktioniert nur, wenn sie als Unterobjekt eines Path2D Nodes "
+"gesetzt wird."
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9089,7 +9448,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9143,6 +9502,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr ""
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
#, fuzzy
msgid "Raw Mode"
@@ -9160,11 +9523,6 @@ msgstr "Alert!"
msgid "Please Confirm..."
msgstr "Bitte bestätigen..."
-#: scene/gui/file_dialog.cpp
-#, fuzzy
-msgid "Select this Folder"
-msgstr "Node(s) löschen"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9172,6 +9530,10 @@ msgid ""
"hide upon running."
msgstr ""
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9218,10 +9580,6 @@ msgstr ""
msgid "Input"
msgstr ""
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for shader."
msgstr ""
@@ -9238,8 +9596,32 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
-#~ msgid "Edit Node Curve"
-#~ msgstr "Node Kurve editieren"
+#, fuzzy
+#~ msgid "Add Split"
+#~ msgstr "Script hinzufügen"
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "Ungültige Bilder löschen"
+
+#, fuzzy
+#~ msgid "Add Node.."
+#~ msgstr "Node"
+
+#, fuzzy
+#~ msgid "New TextFile"
+#~ msgstr "Datei(en) öffnen"
+
+#, fuzzy
+#~ msgid "Show current scene file."
+#~ msgstr "Node(s) löschen"
+
+#~ msgid "Ok"
+#~ msgstr "Okay"
+
+#, fuzzy
+#~ msgid "Convert To Lowercase"
+#~ msgstr "Verbindung zu Node:"
#~ msgid "Anim Add Key"
#~ msgstr "Anim Bild hinzufügen"
@@ -9362,9 +9744,6 @@ msgstr ""
#~ "SampleLibrary Ressource in der 'samples' Eigenschaft erzeugt oder "
#~ "definiert werden."
-#~ msgid "Error exporting project!"
-#~ msgstr "Fehler beim Exportieren des Projekts!"
-
#~ msgid "Error writing the project PCK!"
#~ msgstr "Fehler beim Schreiben des Projekts PCK!"
diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot
index 4437b58965..345c7dcc26 100644
--- a/editor/translations/editor.pot
+++ b/editor/translations/editor.pot
@@ -1,6 +1,6 @@
# LANGUAGE translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
@@ -18,7 +18,7 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr ""
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
@@ -243,7 +243,6 @@ msgstr ""
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -371,8 +370,7 @@ msgstr ""
msgid "Scale From Cursor"
msgstr ""
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr ""
@@ -385,11 +383,11 @@ msgid "Delete Selection"
msgstr ""
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+msgid "Go to Next Step"
msgstr ""
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+msgid "Go to Previous Step"
msgstr ""
#: editor/animation_track_editor.cpp
@@ -492,11 +490,11 @@ msgstr ""
msgid "Replaced %d occurrence(s)."
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr ""
@@ -512,15 +510,19 @@ msgstr ""
msgid "Selection Only"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr ""
@@ -529,10 +531,10 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Zoom:"
+msgid "Font Size:"
msgstr ""
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr ""
@@ -563,6 +565,7 @@ msgstr ""
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -640,7 +643,7 @@ msgid "Edit Connection: "
msgstr ""
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -686,23 +689,20 @@ msgid "Recent:"
msgstr ""
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr ""
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr ""
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr ""
@@ -737,8 +737,7 @@ msgid "Resource"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr ""
@@ -759,9 +758,10 @@ msgid "Search Replacement Resource:"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -791,7 +791,7 @@ msgid "Error loading:"
msgstr ""
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+msgid "Load failed due to missing dependencies:"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -850,14 +850,6 @@ msgstr ""
msgid "Thanks from the Godot community!"
msgstr ""
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr ""
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr ""
@@ -947,7 +939,7 @@ msgid "Uncompressing Assets"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+msgid "Package installed successfully!"
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1029,8 +1021,7 @@ msgid "Bus options"
msgstr ""
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr ""
@@ -1189,7 +1180,7 @@ msgid "Add AutoLoad"
msgstr ""
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr ""
@@ -1197,8 +1188,8 @@ msgstr ""
msgid "Node Name:"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr ""
@@ -1268,11 +1259,15 @@ msgid "Template file not found:"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
+msgid "Select This Folder"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1280,12 +1275,12 @@ msgid "Copy Path"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+msgid "Show in File Manager"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1321,7 +1316,8 @@ msgid "Open a File or Directory"
msgstr ""
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr ""
@@ -1379,8 +1375,7 @@ msgstr ""
msgid "Preview:"
msgstr ""
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr ""
@@ -1396,24 +1391,11 @@ msgstr ""
msgid "(Re)Importing Assets"
msgstr ""
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr ""
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr ""
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr ""
@@ -1430,27 +1412,27 @@ msgid "Brief Description:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Members"
+msgid "Properties"
msgstr ""
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
+#: editor/editor_help.cpp
+msgid "Properties:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
+msgid "Methods"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods:"
+msgid "Methods:"
msgstr ""
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
+msgid "Theme Properties"
msgstr ""
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
+msgid "Theme Properties:"
msgstr ""
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
@@ -1478,7 +1460,11 @@ msgid "Constants:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Description"
+msgid "Class Description"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
msgstr ""
#: editor/editor_help.cpp
@@ -1493,11 +1479,11 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Properties"
+msgid "Property Descriptions"
msgstr ""
#: editor/editor_help.cpp
-msgid "Property Description:"
+msgid "Property Descriptions:"
msgstr ""
#: editor/editor_help.cpp
@@ -1507,11 +1493,11 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Methods"
+msgid "Method Descriptions"
msgstr ""
#: editor/editor_help.cpp
-msgid "Method Description:"
+msgid "Method Descriptions:"
msgstr ""
#: editor/editor_help.cpp
@@ -1520,11 +1506,52 @@ msgid ""
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-#: editor/editor_inspector.cpp
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr ""
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
msgstr ""
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1558,6 +1585,11 @@ msgstr ""
msgid "Error saving resource!"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr ""
@@ -1612,10 +1644,20 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr ""
@@ -1843,6 +1885,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1883,6 +1931,11 @@ msgstr ""
msgid "Default"
msgstr ""
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Play This Scene"
msgstr ""
@@ -1964,7 +2017,7 @@ msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -1993,7 +2046,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -2017,7 +2070,7 @@ msgstr ""
msgid "Export"
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr ""
@@ -2030,6 +2083,7 @@ msgid "Quit to Project List"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr ""
@@ -2137,10 +2191,6 @@ msgstr ""
msgid "Help"
msgstr ""
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2234,21 +2284,21 @@ msgstr ""
msgid "Disable Update Spinner"
msgstr ""
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr ""
#: editor/editor_node.cpp
-msgid "Node"
+msgid "FileSystem"
msgstr ""
#: editor/editor_node.cpp
-msgid "FileSystem"
+msgid "Inspector"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Node"
msgstr ""
#: editor/editor_node.cpp
@@ -2385,7 +2435,7 @@ msgstr ""
msgid "Physics Frame %"
msgstr ""
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr ""
@@ -2409,7 +2459,7 @@ msgstr ""
msgid "Calls"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2421,20 +2471,43 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Invalid RID"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr ""
@@ -2446,10 +2519,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2458,7 +2527,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr ""
@@ -2739,6 +2809,10 @@ msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr ""
#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
@@ -2774,8 +2848,8 @@ msgstr ""
msgid "Unable to update dependencies:"
msgstr ""
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2783,10 +2857,6 @@ msgid "Provided name contains invalid characters"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr ""
@@ -2811,27 +2881,19 @@ msgid "Duplicating folder:"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
+msgid "Open Scene(s)"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Move To..."
+msgid "Instance"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Open Scene(s)"
+msgid "Add to favorites"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Instance"
+msgid "Remove from favorites"
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2842,11 +2904,19 @@ msgstr ""
msgid "View Owners..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr ""
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr ""
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -2854,6 +2924,14 @@ msgstr ""
msgid "New Resource..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr ""
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -2874,11 +2952,11 @@ msgid "Re-Scan Filesystem"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Toggle folder status as Favorite."
+msgid "Toggle split mode"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Show current scene file."
+msgid "Search files"
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2886,20 +2964,12 @@ msgid "Instance the selected scene(s) as child of the selected node."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Search files"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
msgstr ""
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr ""
@@ -2916,27 +2986,19 @@ msgid "Create Script"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Find in files"
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Find: "
+msgid "Find in Files"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Whole words"
+msgid "Find:"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Match case"
+msgid "Folder:"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Filter: "
+msgid "Filters:"
msgstr ""
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -2953,6 +3015,10 @@ msgid "Cancel"
msgstr ""
#: editor/find_in_files.cpp
+msgid "Find: "
+msgstr ""
+
+#: editor/find_in_files.cpp
msgid "Replace: "
msgstr ""
@@ -2973,7 +3039,7 @@ msgid "Group name already exists."
msgstr ""
#: editor/groups_editor.cpp
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr ""
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3109,17 +3175,12 @@ msgstr ""
msgid "Failed to load resource."
msgstr ""
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr ""
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+msgid "Collapse All Properties"
msgstr ""
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3164,6 +3225,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr ""
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr ""
@@ -3224,14 +3289,12 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+msgid "Edit Polygon"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3239,29 +3302,29 @@ msgid "Insert Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+msgid "Remove Polygon And Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3276,7 +3339,7 @@ msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Load.."
+msgid "Load..."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3305,12 +3368,8 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Create points."
-msgstr ""
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-msgid "Erase points."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3350,9 +3409,8 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3386,7 +3444,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add Node.."
+msgid "Add Node..."
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3653,7 +3711,7 @@ msgid "Connect nodes."
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3720,10 +3778,6 @@ msgid "Amount:"
msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr ""
@@ -3921,7 +3975,7 @@ msgstr ""
msgid "Plugins"
msgstr ""
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr ""
@@ -4045,6 +4099,10 @@ msgid "Resize CanvasItem"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
msgstr ""
@@ -4065,15 +4123,15 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom out"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom reset"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom in"
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -4105,6 +4163,10 @@ msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4199,6 +4261,10 @@ msgid "Restores the object's children's ability to be selected."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr ""
@@ -4249,6 +4315,10 @@ msgid "Show Viewport"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr ""
@@ -4317,7 +4387,15 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
+msgid "Create Polygon3D"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
msgstr ""
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
@@ -4419,35 +4497,9 @@ msgid "Item List Editor"
msgstr ""
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr ""
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr ""
@@ -4679,12 +4731,12 @@ msgid "Populate"
msgstr ""
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
+msgid "Generating Visibility Rect"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -4713,6 +4765,11 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr ""
@@ -4782,11 +4839,11 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Convert to CPUParticles"
+msgid "Generate AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -4811,6 +4868,10 @@ msgid "Add Point to Curve"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr ""
@@ -4838,6 +4899,10 @@ msgid "Click: Add Point"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr ""
@@ -4853,11 +4918,6 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr ""
@@ -4914,6 +4974,10 @@ msgstr ""
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
msgid "Move joint"
msgstr ""
@@ -4924,7 +4988,13 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync bones"
+msgid "Sync Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -4936,35 +5006,39 @@ msgid "Create Polygon & UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
+msgid "Create Internal Vertex"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Remove Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
+msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split already exists."
+msgid "Add Custom Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Add Split"
+msgid "Remove Custom Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Invalid Split: "
+msgid "Transform UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Remove Split"
+msgid "Transform Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Transform UV Map"
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
+msgid "Open Polygon 2D UV editor."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -4976,11 +5050,11 @@ msgid "UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Poly"
+msgid "Points"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Splits"
+msgid "Polygons"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -4988,11 +5062,7 @@ msgid "Bones"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create Polygon"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Move Points"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5020,19 +5090,21 @@ msgid "Scale Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Select a split to erase it"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5056,6 +5128,11 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr ""
@@ -5113,22 +5190,22 @@ msgid "Paste Resource"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr ""
@@ -5158,6 +5235,10 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Error could not load file."
msgstr ""
@@ -5166,19 +5247,19 @@ msgid "Error saving file!"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
+msgid "Error while saving theme."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+msgid "Error Saving"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
+msgid "Error importing theme."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+msgid "Error Importing"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5198,6 +5279,14 @@ msgid "Import Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr ""
@@ -5238,7 +5327,7 @@ msgid "File"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile"
+msgid "Open..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5254,11 +5343,7 @@ msgid "Copy Script Path"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+msgid "History Previous"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5271,15 +5356,15 @@ msgid "Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Reload Theme"
+msgid "Import Theme..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme"
+msgid "Reload Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
+msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5329,7 +5414,7 @@ msgid "Keep Debugger Open"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5337,10 +5422,6 @@ msgid "Open Godot online documentation"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -5375,24 +5456,23 @@ msgid "Debugger"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search results"
+msgid "Search Results"
msgstr ""
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search in files"
+#: editor/plugins/script_text_editor.cpp
+msgid "Line"
msgstr ""
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
+#: editor/plugins/script_text_editor.cpp
+msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
+msgid "Go to Function"
msgstr ""
-#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5427,10 +5507,6 @@ msgstr ""
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5482,11 +5558,11 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5503,19 +5579,11 @@ msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
+msgid "Go to Next Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
+msgid "Go to Previous Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5523,15 +5591,15 @@ msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+msgid "Go to Function..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5623,6 +5691,14 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -5787,6 +5863,10 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -5886,10 +5966,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap To Floor"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6006,6 +6082,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
msgstr ""
@@ -6119,11 +6199,16 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6287,6 +6372,10 @@ msgid "Fix Invalid Tiles"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Cut Selection"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6331,31 +6420,35 @@ msgid "Pick Tile"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
+msgid "Rotate left"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
+msgid "Rotate right"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Flip vertically"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Clear transform"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6367,17 +6460,35 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Erase bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new polygon."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Enable snap and show grid (configurable via the Inspector)."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove selected texture? This will remove all tiles which use it."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6385,7 +6496,7 @@ msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6393,7 +6504,11 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+msgid "Remove Texture"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6403,15 +6518,23 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete selected Rect."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete polygon."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr ""
@@ -6429,11 +6552,85 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Tile"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Tile"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "This property can't be changed."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
+msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6469,6 +6666,14 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6477,6 +6682,10 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+msgid "Export Path"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6531,10 +6740,46 @@ msgid "Feature List:"
msgstr ""
#: editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr ""
#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -6661,7 +6906,7 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
-msgid "Can't open project"
+msgid "Can't open project at '%s'."
msgstr ""
#: editor/project_manager.cpp
@@ -6670,6 +6915,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -6983,10 +7246,6 @@ msgstr ""
msgid "General"
msgstr ""
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7119,10 +7378,6 @@ msgstr ""
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr ""
@@ -7206,7 +7461,7 @@ msgid "Step"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7215,7 +7470,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7255,7 +7510,7 @@ msgstr ""
msgid "Reset"
msgstr ""
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7314,6 +7569,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr ""
@@ -7350,6 +7609,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7420,6 +7685,10 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr ""
@@ -7428,11 +7697,11 @@ msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Change Type"
+msgid "Extend Script"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -7582,6 +7851,10 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -7670,19 +7943,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -7714,18 +7975,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -7922,7 +8171,7 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+msgid "Step argument is zero!"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
@@ -8142,11 +8391,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -8416,6 +8661,10 @@ msgid "Base Type:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr ""
@@ -8514,11 +8763,11 @@ msgid "Search VisualScript"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8596,6 +8845,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -8634,6 +8889,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -8751,6 +9012,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -8770,6 +9041,26 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -8802,7 +9093,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -8855,6 +9146,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr ""
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr ""
@@ -8871,10 +9166,6 @@ msgstr ""
msgid "Please Confirm..."
msgstr ""
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr ""
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -8882,6 +9173,10 @@ msgid ""
"hide upon running."
msgstr ""
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -8927,10 +9222,6 @@ msgstr ""
msgid "Input"
msgstr ""
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for shader."
msgstr ""
diff --git a/editor/translations/el.po b/editor/translations/el.po
index 6dc1f9459d..5c8ba5a794 100644
--- a/editor/translations/el.po
+++ b/editor/translations/el.po
@@ -1,20 +1,22 @@
# Greek translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# George Tsiamasiotis <gtsiam@windowslive.com>, 2017-2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-08-04 20:39+0000\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:39+0100\n"
"Last-Translator: George Tsiamasiotis <gtsiam@windowslive.com>\n"
"Language-Team: Greek <https://hosted.weblate.org/projects/godot-engine/godot/"
"el/>\n"
"Language: el\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.1.1\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -23,70 +25,65 @@ msgstr ""
"Μη έγκυÏη παÏάμετÏος στην convert(). ΧÏησιμοποιήστε τις σταθεÏές TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr "Δεν υπάÏχουν αÏκετά byte για την αποκωδικοποίηση, ή άκυÏη μοÏφή."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "ΆκυÏη είσοδος %i (δεν πέÏασε) στην έκφÏαση"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
msgstr ""
+"Το self δεν μποÏεί να χÏησιμοποιηθεί επειδή το στιγμιότυπο είναι null (δεν "
+"πέÏασε)"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "ΆκυÏο όνομα ιδιότητας δείκτη '%s' στον κόμβο %s."
+msgstr "ΆκυÏοι ÏŒÏοι στον τελεστή %s, %s και %s."
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid index of type %s for base type %s"
-msgstr "ΆκυÏο όνομα ιδιότητας δείκτη '%s' στον κόμβο %s."
+msgstr "ΆκυÏος δείκτης Ï„Ïπου %s για βασικό Ï„Ïπο %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "ΆκυÏος επώνυμος δείκτης '%s' για βασικό Ï„Ïπο %s"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid arguments to construct '%s'"
-msgstr ": ΆκυÏη παÏάμετÏος Ï„Ïπου: "
+msgstr "ΆκυÏα οÏίσματα στην κατασκευή του '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "Στην κλήση στο '%s':"
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
-msgstr "ΔωÏεάν"
+msgstr "ΕλεÏθεÏο"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "ΙσοÏÏοπημένο"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Mirror"
-msgstr "ΣυμμετÏία στον άξονα Χ"
+msgstr "ΚατοπτÏισμός"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "Εισαγωγή κλειδιοÏ"
+msgstr "Εισαγωγή ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï ÎµÎ´ÏŽ"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
msgstr "Διπλασιασμός επιλογής"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "ΔιαγÏαφή επιλεγμένου"
+msgstr "ΔιαγÏαφή επιλογής"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -117,46 +114,40 @@ msgid "Anim Change Call"
msgstr "Anim Αλλαγή κλήσης"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Property Track"
-msgstr "Ιδιότητα:"
+msgstr "Κομμάτι Ιδιότητας"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "3D Transform Track"
-msgstr "Είδος μετασχηματισμοÏ"
+msgstr "Κομμάτι 3D μετασχηματισμοÏ"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "Κομμάτι κλήσης μεθόδου"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "Κομμάτι καμπÏλης Bezier"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "Κομμάτι αναπαÏαγωγής ήχου"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Playback Track"
-msgstr "Πάυση αναπαÏγωγής κίνησης. (S)"
+msgstr "Κομμάτι αναπαÏαγωγής κίνησης"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
-msgstr "Anim ΠÏοσθήκη κομματιοÏ"
+msgstr "ΠÏοσθήκη κομματιοÏ"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Length Time (seconds)"
-msgstr "Μήκος animation (σε δευτεÏόλεπτα)."
+msgstr "Μήκος κίνησης (δευτεÏόλεπτα)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "Μεγέθυνση animation."
+msgstr "Επανάληψη κίνησης"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -164,42 +155,36 @@ msgid "Functions:"
msgstr "ΣυναÏτήσεις:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Audio Clips:"
-msgstr "ΑκÏοατής ήχου"
+msgstr "Αποσπάσματα ήχου:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Clips:"
-msgstr "Αποσπάσματα"
+msgstr "Αποσπάσματα κίνησης:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Toggle this track on/off."
-msgstr "Εναλλαγή λειτουÏγίας χωÏίς πεÏισπασμοÏÏ‚."
+msgstr "Εναλλαγή ÎºÎ¿Î¼Î¼Î±Ï„Î¹Î¿Ï on/off."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "Μέθοδος ανανέωσης (της ιδιότητας)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Interpolation Mode"
-msgstr "Κόμβος κίνησης"
+msgstr "Μέθοδος παÏεμβολής"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "Μέθοδος επανάληψης (παÏεμβολή τέλους με αÏχή)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "ΑφαίÏεση επιλεγμένου κομματιοÏ."
+msgstr "ΑφαίÏεση κομματιοÏ."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "ΧÏόνος ÏƒÏ…Î½Î´Î¹Î±ÏƒÎ¼Î¿Ï (s):"
+msgstr "ΧÏόνος (s): "
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -214,13 +199,12 @@ msgid "Trigger"
msgstr "Άμεση"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Capture"
-msgstr "Δυνατότητες"
+msgstr "ΚαταγÏαφή"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "ΠλησιέστεÏη"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
@@ -229,15 +213,15 @@ msgstr "ΓÏαμμική"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr ""
+msgstr "Κυβική"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
-msgstr ""
+msgstr "ΠεÏιοÏισμός παÏεμβολής επανάληψης"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "Αναδίπλωση παÏεμβολής επανάληψης"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -245,14 +229,12 @@ msgid "Insert Key"
msgstr "Εισαγωγή κλειδιοÏ"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "Διπλασιασμός κόμβων"
+msgstr "Διπλασιασμός κλειδιών"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "ΔιαγÏαφή Κόμβων"
+msgstr "ΔιαγÏαφή κλειδιών"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -270,7 +252,6 @@ msgstr "ΔημιουÏγία %d νέων κομματιών και εισαγωÎ
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -282,7 +263,7 @@ msgstr "Anim Εισαγωγή"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
-msgstr ""
+msgstr "Ένα AnimationPlayer δεν μποÏεί να κινήσει τον εαυτό του."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
@@ -299,6 +280,8 @@ msgstr "Anim εισαγωγή κλειδιοÏ"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
msgstr ""
+"Τα κομμάτια Î¼ÎµÏ„Î±ÏƒÏ‡Î·Î¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï ÎµÏ†Î±Ïμόζονται μόνο σε κόμβους βασισμένους σε "
+"Spatial."
#: editor/animation_track_editor.cpp
msgid ""
@@ -307,44 +290,47 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"Τα κομμάτια ήχου μποÏοÏν να δείχνουν μόνο σε κόμβους Ï„Ïπου:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
msgstr ""
+"Τα κομμάτια κίνησης μποÏοÏν να δείχνουν μόνο σε κόμβους AnimationPlayer."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
-msgstr ""
+msgstr "Ένα AnimationPlayer δεν μποÏεί να κινήσει τον εαυτό του."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "ΑδÏνατη η Ï€Ïοσθήκη ÎºÎ¿Î¼Î¼Î±Ï„Î¹Î¿Ï Ï‡Ï‰Ïίς Ïίζα"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "ΑδÏνατη η Ï€Ïοσθήκη κλειδιοÏ, λόγω άκυÏης διαδÏομής κομματιοÏ."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "ΑδÏνατη η Ï€Ïοσθήκη κλειδιοÏ, το κομμάτι δεν είναι Ï„Ïπου Spatial"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
-msgstr ""
+msgstr "ΑδÏνατη η Ï€Ïοσθήκη ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Î¼ÎµÎ¸ÏŒÎ´Î¿Ï…, λόγω άκυÏης διαδÏομής κομματιοÏ."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Method not found in object: "
-msgstr "Το VariableGet δεν βÏέθηκε στη δεσμή ενεÏγειών: "
+msgstr "Δεν βÏέθηκε η μέθοδος στο αντικείμενο: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
msgstr "Anim Μετακίνηση κελιδιών"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clipboard is empty"
-msgstr "Το Ï€ÏόχειÏο είναι άδειο!"
+msgstr "Το Ï€ÏόχειÏο είναι άδειο"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
@@ -354,24 +340,24 @@ msgstr "Anim Μεγέθυνση κλειδιών"
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
msgstr ""
+"Αυτή η επιλογή δεν δουλεÏει σε καμπÏλες Bezier, καθώς είναι μεμονωμένο "
+"κομμάτι."
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "Δείξε μόνο κομμάτια απο επιλεγμένους κόμβους στο δέντÏο."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr ""
+msgstr "Ομαδοποίηση κομματιών ανα κόμβο, ή εμφάνιση σε λίστα."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap (s): "
-msgstr "ΚοÏμπωμα (Εικονοστοιχεία):"
+msgstr "ΚοÏμπωμα (s): "
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "Το δέντÏο κίνησης είναι έγκυÏο."
+msgstr "Τιμή βήματος κίνησης."
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -383,19 +369,16 @@ msgid "Edit"
msgstr "ΕπεξεÏγασία"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "ΔέντÏο κίνησης"
+msgstr "Ιδιότητες κίνησης."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "ΑντιγÏαφή παÏαμέτÏων"
+msgstr "ΑντιγÏαφή κομματιών"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "Επικόλληση παÏαμέτÏων"
+msgstr "Επικόλληση κομματιών"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -405,8 +388,7 @@ msgstr "Μεγέθυνση επιλογής"
msgid "Scale From Cursor"
msgstr "Μεγέθυνση από τον δείκτη"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Διπλασιασμός επιλογής"
@@ -415,16 +397,17 @@ msgid "Duplicate Transposed"
msgstr "Διπλασιασμός ανεστÏαμένων"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
-msgstr "ΔιαγÏαφή επιλεγμένου"
+msgstr "ΔιαγÏαφή επιλογής"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+#, fuzzy
+msgid "Go to Next Step"
msgstr "Πήγαινε στο επόμενο βήμα"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+#, fuzzy
+msgid "Go to Previous Step"
msgstr "Πήγαινε στο Ï€ÏοηγοÏμενο βήμα"
#: editor/animation_track_editor.cpp
@@ -437,11 +420,11 @@ msgstr "ΚαθαÏισμός animation"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "Επιλογή του κόμβου που θα κινηθεί:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "ΧÏήση καμπυλών Bezier"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
@@ -489,7 +472,7 @@ msgstr "Λόγος μεγέθυνσης:"
#: editor/animation_track_editor.cpp
msgid "Select tracks to copy:"
-msgstr ""
+msgstr "Επιλογή κομματιών για αντιγÏαφή:"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -527,11 +510,11 @@ msgstr "Δεν υπάÏχουν αντιστοιχίες"
msgid "Replaced %d occurrence(s)."
msgstr "Αντικαταστάθηκαν %d εμφανίσεις."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Αντιστοίχηση πεζών-κεφαλαίων"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "ΟλόκληÏες λέξεις"
@@ -547,29 +530,32 @@ msgstr "Αντικατάσταση όλων"
msgid "Selection Only"
msgstr "Μόνο στην επιλογή"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Μεγέθυνση"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "ΣμÏκÏινση"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "ΕπαναφοÏά μεγέθυνσης"
#: editor/code_editor.cpp
-#, fuzzy
msgid "Warnings:"
-msgstr "ΠÏοειδοποιήσεις"
+msgstr "ΠÏοειδοποιήσεις:"
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "Μεγέθυνση (%):"
+msgid "Font Size:"
+msgstr "Μέγεθος πηγαίας γÏαμματοσειÏάς:"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "ΓÏαμμή:"
@@ -602,6 +588,7 @@ msgstr "ΠÏοσθήκη"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -658,9 +645,8 @@ msgid "Disconnect '%s' from '%s'"
msgstr "ΑποσÏνδεση του '%s' απο το '%s'"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect all from signal: '%s'"
-msgstr "ΑποσÏνδεση του '%s' απο το '%s'"
+msgstr "ΑποσÏνδεση όλων απο το σήμα: '%s'"
#: editor/connections_dialog.cpp
msgid "Connect..."
@@ -672,19 +658,18 @@ msgid "Disconnect"
msgstr "ΑποσÏνδεση"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect Signal: "
-msgstr "ΣÏνδεση στο σήμα:"
+msgstr "ΣÏνδεση σήματος: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection: "
-msgstr "ΕπεξεÏγασία συνδέσεων"
+msgstr "ΕπεξεÏγασία σÏνδεσης: "
#: editor/connections_dialog.cpp
#, fuzzy
-msgid "Are you sure you want to remove all connections from the \""
-msgstr "Είστε σίγουÏοι πως θέλετε να Ï„Ïέξετε πεÏισσότεÏα από ένα έÏγα;"
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr ""
+"Είστε σίγουÏοι πως θέλετε να αφαιÏέσετε όλες της συνδέσεις απο αυτό το σήμα;"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -693,21 +678,19 @@ msgstr "Σήματα"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
+"Είστε σίγουÏοι πως θέλετε να αφαιÏέσετε όλες της συνδέσεις απο αυτό το σήμα;"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "ΑποσÏνδεση"
+msgstr "ΑποσÏνδεση όλων"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit..."
-msgstr "ΕπεξεÏγασία"
+msgstr "ΕπεξεÏγασία..."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "ΣυναÏτήσεις"
+msgstr "Πήγαινε σε συνάÏτηση"
#: editor/create_dialog.cpp
msgid "Change %s Type"
@@ -732,23 +715,20 @@ msgid "Recent:"
msgstr "ΠÏόσφατα:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Αναζήτηση:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "Αντιστοιχίες:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "ΠεÏιγÏαφή:"
@@ -787,8 +767,7 @@ msgid "Resource"
msgstr "ΠόÏος"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "ΔιαδÏομή"
@@ -809,9 +788,10 @@ msgid "Search Replacement Resource:"
msgstr "Αναζήτηση αντικαταστάτη πόÏου:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -843,7 +823,8 @@ msgid "Error loading:"
msgstr "Σφάλμα κατά την φόÏτωση:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+#, fuzzy
+msgid "Load failed due to missing dependencies:"
msgstr "Η φόÏτωση της σκηνής απέτυχε, λόγω απόντων εξαÏτήσεων:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -902,14 +883,6 @@ msgstr "Αλλαγή τιμής λεξικοÏ"
msgid "Thanks from the Godot community!"
msgstr "ΕυχαÏιστίες από την κοινότητα της Godot!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "Εντάξει"
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "ΣυνεισφέÏοντες στην Godot Engine"
@@ -1004,7 +977,8 @@ msgid "Uncompressing Assets"
msgstr "Αποσυμπίεση asset"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+#, fuzzy
+msgid "Package installed successfully!"
msgstr "Το πακέτο εγκαταστάθηκε επιτυχώς!"
#: editor/editor_asset_installer.cpp
@@ -1086,8 +1060,7 @@ msgid "Bus options"
msgstr "Επιλογές διαÏλου"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "Διπλασιασμός"
@@ -1248,7 +1221,7 @@ msgid "Add AutoLoad"
msgstr "ΠÏοσθήκη AutoLoad"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "ΔιαδÏομή:"
@@ -1256,8 +1229,8 @@ msgstr "ΔιαδÏομή:"
msgid "Node Name:"
msgstr "Όνομα κόμβου:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "Όνομα"
@@ -1327,12 +1300,17 @@ msgid "Template file not found:"
msgstr "Δεν βÏέθηκε αÏχείο Ï€ÏοτÏπου:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Επιλογή Ï„Ïέχοντα φακέλου"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "Το αÏχείο υπάÏχει. Θέλετε να το αντικαταστήσετε;"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "Επιλογή Ï„Ïέχοντα φακέλου"
+#, fuzzy
+msgid "Select This Folder"
+msgstr "Επιλογή Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… φακέλου"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
@@ -1340,12 +1318,13 @@ msgstr "ΑντιγÏαφή διαδÏομής"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open In File Manager"
-msgstr "Εμφάνιση στη διαχείÏιση αÏχείων"
+msgid "Open in File Manager"
+msgstr "Άνοιγμα στη διαχείÏιση αÏχείων"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+#, fuzzy
+msgid "Show in File Manager"
msgstr "Εμφάνιση στη διαχείÏιση αÏχείων"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1381,7 +1360,8 @@ msgid "Open a File or Directory"
msgstr "Άνοιγμα αÏχείου ή φακέλου"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Αποθήκευση"
@@ -1439,8 +1419,7 @@ msgstr "Φάκελοι & ΑÏχεία:"
msgid "Preview:"
msgstr "ΠÏοεπισκόπηση:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "ΑÏχείο:"
@@ -1456,24 +1435,11 @@ msgstr "ΣάÏωση πηγών"
msgid "(Re)Importing Assets"
msgstr "(Επαν)εισαγωγή"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "Αναζήτηση βοήθειας"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "Λίστα κλάσεων:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "Αναζήτηση κλάσεων"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "ΚοÏυφή"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "Κλάση:"
@@ -1490,28 +1456,31 @@ msgid "Brief Description:"
msgstr "ΣÏντομη πεÏιγÏαφή:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "Μέλη"
+msgid "Properties"
+msgstr "Ιδιότητες"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "Μέλη:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr "Ιδιότητες:"
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "Δημόσιες συναÏτήσεις"
+msgid "Methods"
+msgstr "ΣυναÏτήσεις"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "Δημόσιες συναÏτήσεις:"
+#, fuzzy
+msgid "Methods:"
+msgstr "ΣυναÏτήσεις"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "Στοιχεία του θέματος GUI"
+#, fuzzy
+msgid "Theme Properties"
+msgstr "Ιδιότητες"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "Στοιχεία του θέματος GUI:"
+#, fuzzy
+msgid "Theme Properties:"
+msgstr "Ιδιότητες:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1538,10 +1507,16 @@ msgid "Constants:"
msgstr "ΣταθεÏές:"
#: editor/editor_help.cpp
-msgid "Description"
+#, fuzzy
+msgid "Class Description"
msgstr "ΠεÏιγÏαφή"
#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
+msgstr "ΠεÏιγÏαφή:"
+
+#: editor/editor_help.cpp
msgid "Online Tutorials:"
msgstr "Online Tutorial:"
@@ -1556,11 +1531,13 @@ msgstr ""
"url][/color]."
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "Ιδιότητες"
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "ΠεÏιγÏαφή ιδιότητας:"
#: editor/editor_help.cpp
-msgid "Property Description:"
+#, fuzzy
+msgid "Property Descriptions:"
msgstr "ΠεÏιγÏαφή ιδιότητας:"
#: editor/editor_help.cpp
@@ -1572,11 +1549,13 @@ msgstr ""
"[color=$color][url=$url]γÏάφοντας μία[/url][/color]!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "ΣυναÏτήσεις"
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "ΠεÏιγÏαφή μεθόδου:"
#: editor/editor_help.cpp
-msgid "Method Description:"
+#, fuzzy
+msgid "Method Descriptions:"
msgstr "ΠεÏιγÏαφή μεθόδου:"
#: editor/editor_help.cpp
@@ -1587,18 +1566,67 @@ msgstr ""
"Δεν υπάÏχει ακόμη πεÏιγÏαφή για αυτήν την μέθοδο. ΠαÏακαλοÏμε βοηθήστε μας "
"[color=$color][url=$url]γÏάφοντας μία[/url][/color]!"
-#: editor/editor_inspector.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Αναζήτηση βοήθειας"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Display All"
+msgstr "Κανονική εμφάνιση"
+
+#: editor/editor_help_search.cpp
#, fuzzy
-msgid "Property: "
+msgid "Classes Only"
+msgstr "Κλάσεις"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Methods Only"
+msgstr "ΣυναÏτήσεις"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "Σήματα"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Constants Only"
+msgstr "ΣταθεÏές"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Properties Only"
+msgstr "Ιδιότητες"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Theme Properties Only"
+msgstr "Ιδιότητες"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Member Type"
+msgstr "Μέλη"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Class"
+msgstr "Κλάση:"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
msgstr "Ιδιότητα:"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr "ÎŒÏισε"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "ΟÏισμός πολλών:"
#: editor/editor_log.cpp
msgid "Output:"
@@ -1626,6 +1654,11 @@ msgstr "Η εξαγωγή του έÏγου απέτυχε με κωδικό %d.
msgid "Error saving resource!"
msgstr "Σφάλμα κατά την αποθήκευση πόÏου!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "Εντάξει"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "Αποθήκευση πόÏου ως..."
@@ -1645,6 +1678,7 @@ msgstr "Σφάλμα κατά την αποθήκευση."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
msgstr ""
+"ΑδÏνατο το άνοιγμα του '%s'. Το αÏχείο πιθανώς μετακινήθηκε ή διαγÏάφηκε."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
@@ -1680,12 +1714,22 @@ msgstr "Αυτή η λειτουÏγία δεν μποÏεί να γίνει χÏ
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
"ΑδÏνατη η αποθήκευση σκηνής. Πιθανώς οι εξαÏτήσεις (στιγμιότυπα ή "
"κληÏονομιά) να μην μποÏοÏσαν να ικανοποιηθοÏν."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr "ΑδÏνατο το φόÏτωμα της βιβλιοθήκης πλεγμάτων για συγχώνευση!"
@@ -1951,6 +1995,15 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "ΑδÏνατη η φόÏτωση δεσμής ενεÏγειών Ï€Ïοσθέτου από τη διαδÏομή: '%s'."
#: editor/editor_node.cpp
+#, fuzzy
+msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"ΑδÏνατη η φόÏτωση δεσμής ενεÏγειών Ï€Ïοσθέτου από τη διαδÏομή: '%s'. Δεν "
+"είναι σε λειτουÏγία tool."
+
+#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -2002,15 +2055,19 @@ msgstr "ΔιαγÏαφή διάταξης"
msgid "Default"
msgstr "ΠÏοεπιλογή"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
#, fuzzy
+msgid "Show in FileSystem"
+msgstr "Εμφάνιση στο σÏστημα αÏχείων"
+
+#: editor/editor_node.cpp
msgid "Play This Scene"
msgstr "ΑναπαÏαγωγή σκηνής"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "Κλείσιμο άλλον καÏτελών"
+msgstr "Κλείσιμο καÏτέλας"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2085,7 +2142,8 @@ msgid "Save Scene"
msgstr "ΑποθηκεÏσετε σκηνής"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+#, fuzzy
+msgid "Save All Scenes"
msgstr "Αποθήκευση όλων των σκηνών"
#: editor/editor_node.cpp
@@ -2114,7 +2172,7 @@ msgid "Undo"
msgstr "ΑναίÏεση"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "ΑκÏÏωση αναίÏεσης"
@@ -2138,20 +2196,20 @@ msgstr "Ρυθμίσεις έÏγου"
msgid "Export"
msgstr "Εξαγωγή"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "ΕÏγαλεία"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "Άνοιγμα του διαχειÏιστή έÏγων;"
+msgstr "Άνοιγμα φακέλου δεδομένων έÏγου"
#: editor/editor_node.cpp
msgid "Quit to Project List"
msgstr "Έξοδος στη λίστα έÏγων"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "Αποσφαλμάτωση"
@@ -2260,18 +2318,16 @@ msgid "Toggle Fullscreen"
msgstr "Εναλλαγή πλήÏους οθόνης"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Data/Settings Folder"
-msgstr "Ρυθμίσεις επεξεÏγαστή"
+msgstr "Άνοιγμα φακέλου δεδομένων/Ïυθμίσεων επεξεÏγαστή"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "Άνοιγμα φακέλου δεδομένων επεξεÏγαστή"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Settings Folder"
-msgstr "Ρυθμίσεις επεξεÏγαστή"
+msgstr "Άνοιγμα φακέλου Ïυθμίσεων επεξεÏγαστή"
#: editor/editor_node.cpp editor/project_export.cpp
msgid "Manage Export Templates"
@@ -2281,10 +2337,6 @@ msgstr "ΔιαχείÏιση Ï€ÏοτÏπων εξαγωγής"
msgid "Help"
msgstr "Βοήθεια"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "Κλάσεις"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2355,13 +2407,12 @@ msgstr "ΑναπαÏαγωγή Ï€ÏοσαÏμοσμένης σκηνής"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr ""
+msgstr "Η αλλαγή του Î¿Î´Î·Î³Î¿Ï Î²Î¯Î½Ï„ÎµÎ¿ απαιτεί επανεκκίνηση του επεξεÏγαστή."
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Save & Restart"
-msgstr "Αποθήκευση & Επανεισαγωγή"
+msgstr "Αποθήκευση & Επανεκκίνηση"
#: editor/editor_node.cpp
msgid "Spins when the editor window repaints!"
@@ -2379,27 +2430,26 @@ msgstr "ΕνημέÏωση αλλαγών"
msgid "Disable Update Spinner"
msgstr "ΑπενεÏγοποίηση δείκτη ενημέÏωσης"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "ΕπιθεωÏητής"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "Εισαγωγή"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "Κόμβος"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "ΣÏστημα αÏχείων"
#: editor/editor_node.cpp
-#, fuzzy
+msgid "Inspector"
+msgstr "ΕπιθεωÏητής"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Κόμβος"
+
+#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
-msgstr "Ανάπτυξη όλων"
+msgstr "Ανάπτυξη κάτω πλαισίου"
#: editor/editor_node.cpp scene/resources/visual_shader.cpp
msgid "Output"
@@ -2478,9 +2528,8 @@ msgid "Thumbnail..."
msgstr "ΜικÏογÏαφία..."
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit Plugin"
-msgstr "ΕπεγεÏγασία πολυγώνου"
+msgstr "ΕπεγεÏγασία επέκτασης"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
@@ -2504,15 +2553,13 @@ msgid "Status:"
msgstr "Κατάσταση:"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit:"
-msgstr "ΕπεξεÏγασία"
+msgstr "ΕπεξεÏγασία:"
#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Start"
-msgstr "Εκκινιση!"
+msgstr "Εκκινιση"
#: editor/editor_profiler.cpp
msgid "Measure:"
@@ -2534,7 +2581,7 @@ msgstr "ΚαÏέ %"
msgid "Physics Frame %"
msgstr "KαÏέ φυσικής %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "ΧÏόνος:"
@@ -2558,34 +2605,57 @@ msgstr "ΧÏόνος"
msgid "Calls"
msgstr "Κλήσεις"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr "Îαι"
#: editor/editor_properties.cpp
msgid "Layer"
-msgstr ""
+msgstr "ΣτÏώμα"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Bit %d, value %d"
-msgstr "Δυαδικό ψηφίο %d, τιμή %d."
+msgstr "Bit %d, τιμή %d"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr "[Άδειο]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
#, fuzzy
-msgid "Assign.."
-msgstr "Ανάθεση"
+msgid "Assign..."
+msgstr "ΕκχώÏηση.."
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "Μη έγκυÏη διαδÏομή"
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr "Επιλέξτε μία οπτική γωνία"
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr "Îεα δεσμή ενεÏγειών"
@@ -2597,10 +2667,6 @@ msgstr "Îέο %s"
msgid "Make Unique"
msgstr "Κάνε μοναδικό"
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr "Εμφάνιση στο σÏστημα αÏχείων"
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2609,7 +2675,8 @@ msgstr "Εμφάνιση στο σÏστημα αÏχείων"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "Επικόληση"
@@ -2622,36 +2689,32 @@ msgstr "ΜετατÏοπή σε %s"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Open Editor"
-msgstr "Άνοιγμα στον επεξεÏγαστή"
+msgstr "Άνοιγμα επεξεÏγαστή"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Selected node is not a Viewport!"
msgstr "Ο επιλεγμένος κόμβος δεν είναι Viewport!"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "Size: "
-msgstr "Μέγεθος κελιοÏ:"
+msgstr "Μέγεθος: "
#: editor/editor_properties_array_dict.cpp
msgid "Page: "
-msgstr ""
+msgstr "Σελίδα: "
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Key:"
-msgstr "Îέο όνομα:"
+msgstr "Îέο κλειδί:"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Value:"
-msgstr "Îέο όνομα:"
+msgstr "Îέα τιμή:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
-msgstr ""
+msgstr "ΠÏοσθήκη ζεÏγους κλειδιοÏ/τιμής"
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -2744,9 +2807,8 @@ msgid "Can't open export templates zip."
msgstr "ΑδÏνατο το άνοιγμα του zip των Ï€ÏοτÏπων εξαγωγής."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Invalid version.txt format inside templates: %s."
-msgstr "ΆκυÏη μοÏφή version.txt μέσα στα Ï€Ïότυπα."
+msgstr "ΆκυÏη μοÏφή version.txt μέσα στα Ï€Ïότυπα: %s."
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
@@ -2811,6 +2873,8 @@ msgid ""
"Templates installation failed. The problematic templates archives can be "
"found at '%s'."
msgstr ""
+"Αποτυχία εγκατάστασης Ï€ÏοτÏπων. Οι Ï€Ïοβληματικές αÏχειοθήκες μποÏοÏν να "
+"βÏεθοÏν στο '%s'."
#: editor/export_template_manager.cpp
msgid "Error requesting url: "
@@ -2891,9 +2955,10 @@ msgid "Download Templates"
msgstr "Λήψη Ï€ÏοτÏπων"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr "Επιλέξτε έναν διακοσμιτή κατοπτÏÎ¹ÏƒÎ¼Î¿Ï Î±Ï€ÏŒ την λίστα: "
+msgstr ""
+"Επιλέξτε έναν διακομιστή κατοπτÏισμοÏ: (Shift+Click για άνοιγμα στο "
+"Ï€ÏόγÏαμμα πεÏιήγησης)"
#: editor/file_type_cache.cpp
msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
@@ -2902,19 +2967,22 @@ msgstr ""
"αποθήκευσης cache Ï„Ïπου αÏχείου!"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "Αγαπημένα:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
"Δεν ήταν δυνατή η πλοήγηση στο '%s', καθώς δεν βÏέθηκε στο σÏστημα αÏχείων!"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a grid of thumbnails."
-msgstr "Εμφάνιση αντικειμένων σε πλέγμα μικÏγÏαφιών"
+msgstr "Εμφάνιση αντικειμένων σε πλέγμα μικÏγÏαφιών."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a list."
-msgstr "Εμφάνιση αντικειμένων σε λίστα"
+msgstr "Εμφάνιση αντικειμένων σε λίστα."
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
@@ -2942,19 +3010,15 @@ msgstr "Σφάλμα κατά τον διπλασιασμό:"
msgid "Unable to update dependencies:"
msgstr "ΑδÏνατη η ενημέÏωση των εξαÏτήσεων:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "Δεν δόθηκε όνομα"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "Δεν δόθηκε όνομα."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "Το δοσμένο όνομα πεÏιέχει άκυÏους χαÏακτήÏες"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "Δεν δόθηκε όνομα."
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "Το όνομα πεÏιέχει άκυÏους χαÏακτήÏες."
@@ -2979,22 +3043,6 @@ msgid "Duplicating folder:"
msgstr "Διπλασιασμός καταλόγου:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "Ανάπτυξη όλων"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "ΣÏμπτηξη όλων"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "Μετονομασία..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "Μετακίνηση σε..."
-
-#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
msgstr "Άνοιγμα σκηνής"
@@ -3003,6 +3051,16 @@ msgid "Instance"
msgstr "Στιγμιότυπο"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Add to favorites"
+msgstr "Αγαπημένα:"
+
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Remove from favorites"
+msgstr "ΚατάÏγηση από την ομάδα"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "ΕπεξεÏγασία εξαÏτήσεων..."
@@ -3010,19 +3068,35 @@ msgstr "ΕπεξεÏγασία εξαÏτήσεων..."
msgid "View Owners..."
msgstr "ΠÏοβολή ιδιοκτητών..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "Μετονομασία..."
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "ΑναπαÏαγωγή..."
#: editor/filesystem_dock.cpp
-#, fuzzy
+msgid "Move To..."
+msgstr "Μετακίνηση σε..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
-msgstr "Îεα δεσμή ενεÏγειών"
+msgstr "Îεα δεσμή ενεÏγειών..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "Αποθήκευση πόÏου ως..."
+msgstr "Îέος πόÏος..."
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Expand All"
+msgstr "Ανάπτυξη όλων"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Collapse All"
+msgstr "ΣÏμπτηξη όλων"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3045,13 +3119,12 @@ msgstr "Εκ νέου σάÏωση το συστήματος αÏχείων"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "Εναλλαγή αγαπημένου"
+msgid "Toggle split mode"
+msgstr "Εναλλαγή λειτουÏγίας"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Show current scene file."
-msgstr "Επέλεξε το Ï„Ïέχων επεξεÏγαζόμενο υπο-πλακίδιο."
+msgid "Search files"
+msgstr "Αναζήτηση αÏχείων"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
@@ -3060,15 +3133,6 @@ msgstr ""
"κόμβου."
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "Αναζήτηση κλάσεων"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3076,18 +3140,17 @@ msgstr ""
"ΣάÏωση αÏχείων,\n"
"ΠαÏακαλώ πεÏιμένετε..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "Μετακίνηση"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "There is already file or folder with the same name in this location."
-msgstr "ΥπάÏχει ήδη φάκελος στην διαδÏομή με το Ï€ÏοσδιοÏισμένο όνομα."
+msgstr "ΥπάÏχει ήδη αÏχείο ή φάκελος με το ίδιο όνομα στη διαδÏομή."
#: editor/filesystem_dock.cpp
msgid "Overwrite"
-msgstr ""
+msgstr "Αντικατάσταση"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
@@ -3095,32 +3158,23 @@ msgstr "ΔημιουÏγία δεσμής ενεÏγειών"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find in files"
-msgstr "ΕÏÏεση πλακιδίου"
+msgid "Find in Files"
+msgstr "ΕÏÏεση στα αÏχεία"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find: "
-msgstr "ΕÏÏεση"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Whole words"
-msgstr "ΟλόκληÏες λέξεις"
+msgid "Find:"
+msgstr "ΕÏÏεση: "
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Match case"
-msgstr "Αντιστοίχηση πεζών-κεφαλαίων"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "Φάκελος: "
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Filter: "
-msgstr "ΦίλτÏο:"
+msgid "Filters:"
+msgstr "ΦίλτÏα"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3136,52 +3190,49 @@ msgid "Cancel"
msgstr "ΑκÏÏωση"
#: editor/find_in_files.cpp
-#, fuzzy
+msgid "Find: "
+msgstr "ΕÏÏεση: "
+
+#: editor/find_in_files.cpp
msgid "Replace: "
-msgstr "Αντικατάσταση"
+msgstr "Αντικατάσταση: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace all (no undo)"
-msgstr "Αντικατάσταση όλων"
+msgstr "Αντικατάσταση όλων (χωÏίς ανέÏαιση)"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Searching..."
-msgstr "Αποθήκευση..."
+msgstr "Αναζήτηση..."
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Search complete"
-msgstr "Αναζήτηση κειμένου"
+msgstr "ΟλοκλήÏωση αναζήτησης"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group name already exists."
-msgstr "ΣΦΑΛΜΑ: Αυτό το όνομα κίνησης υπάÏχει ήδη!"
+msgstr "ΥπαÏκτό όνομα ομάδας."
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
-msgstr "Μη έγκυÏο όνομα."
+msgid "Invalid group name."
+msgstr "ΆκυÏο όνομα ομάδας."
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Ομάδες"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes not in Group"
-msgstr "ΠÏοσθήκη σε Ομάδα"
+msgstr "Κόμβοι εκτός ομάδας"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
msgid "Filter nodes"
msgstr "ΦιλτÏάÏισμα κόμβων"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes in Group"
-msgstr "ΕπεξεÏγασία Ομάδων"
+msgstr "Κόμβοι σε ομάδα"
#: editor/groups_editor.cpp
msgid "Add to Group"
@@ -3192,9 +3243,8 @@ msgid "Remove from Group"
msgstr "ΚατάÏγηση από την ομάδα"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Manage Groups"
-msgstr "Ομάδες"
+msgstr "ΔιαχείÏηση ομάδων"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Single Scene"
@@ -3303,17 +3353,14 @@ msgstr "Επανεισαγωγή"
msgid "Failed to load resource."
msgstr "Απέτυχε η φόÏτωση πόÏου."
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "Εντάξει"
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+#, fuzzy
+msgid "Expand All Properties"
msgstr "Ανάπτυξη όλων των ιδιοτήτων"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+#, fuzzy
+msgid "Collapse All Properties"
msgstr "ΣÏμπτηξη όλων των ιδιοτήτων"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3330,9 +3377,8 @@ msgid "Paste Params"
msgstr "Επικόλληση παÏαμέτÏων"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Edit Resource Clipboard"
-msgstr "Το Ï€ÏόχειÏο πόÏων είναι άδειο!"
+msgstr "ΕπεξεÏγασία Ï€ÏοχείÏου πόÏων"
#: editor/inspector_dock.cpp
msgid "Copy Resource"
@@ -3359,6 +3405,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "ΦόÏτωσε υπάÏχων πόÏο στη μνήμη και επεξεÏγάσου τον."
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "Αποθήκευσε το Ï„Ïέχων επεξεÏγαζόμενο πόÏο."
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "Πήγαινε στο Ï€Ïοηγουμένως επεξεÏγασμένο αντικείμενο στο ιστοÏικό."
@@ -3375,9 +3425,8 @@ msgid "Object properties."
msgstr "Ιδιότητες αντικειμένου."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Filter properties"
-msgstr "ΦιλτÏάÏισμα κόμβων"
+msgstr "ΦιλτÏάÏισμα ιδιοτήτων"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
@@ -3392,47 +3441,42 @@ msgid "Select a Node to edit Signals and Groups."
msgstr "Επιλέξτε ένα κόμβο για να επεξεÏγαστείτε τα σήματα και τις ομάδες."
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Edit a Plugin"
-msgstr "ΕπεγεÏγασία πολυγώνου"
+msgstr "ΕπεγεÏγασία Ï€Ïοσθέτου"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Create a Plugin"
-msgstr "ΔημιουÏγία λÏσης C#"
+msgstr "ΔημιουÏγία Ï€Ïοσθέτου"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Plugin Name:"
-msgstr "ΠÏόσθετα"
+msgstr "Όνομα Ï€Ïοσθέτου:"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
-msgstr ""
+msgstr "Υποφάκελος:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Language:"
-msgstr "Γλώσσα"
+msgstr "Γλώσσα:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Script Name:"
-msgstr "ΈγκυÏη δεσμή ενεÏγειών"
+msgstr "Όνομα δεσμής ενεÏγειών:"
#: editor/plugin_config_dialog.cpp
msgid "Activate now?"
-msgstr ""
+msgstr "ΕνεÏγοποίηση τώÏα;"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
msgstr "Δημιουγία πολυγώνου"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+#, fuzzy
+msgid "Edit Polygon"
msgstr "ΕπεγεÏγασία πολυγώνου"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3440,25 +3484,27 @@ msgid "Insert Point"
msgstr "Εισαγωγή σημείου"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+#, fuzzy
+msgid "Edit Polygon (Remove Point)"
msgstr "ΕπεγεÏγασία πολυγώνου (ΑφαίÏεση σημείου)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+#, fuzzy
+msgid "Remove Polygon And Point"
msgstr "ΑφαίÏεση πολυγώνου και σημείου"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "ΔημιουÏγία νέου πολυγώνου από την αÏχή"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr "ΔημιουÏγία σημείων."
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#, fuzzy
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
"ΕπεξεÏγασία υπαÏÎºÏ„Î¿Ï Ï€Î¿Î»Ï…Î³ÏŒÎ½Î¿Ï…:\n"
"ΑÏιστεÏÏŒ κλικ: Μετακίνηση σημείου.\n"
@@ -3466,8 +3512,9 @@ msgstr ""
"Δεξί κλικ: ΔιαγÏαφή σημείου."
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
-msgstr "ΔιαγÏαφή σημείων"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr "ΔιαγÏαφή σημείων."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3482,14 +3529,14 @@ msgstr "ΠÏοσθήκη κίνησης"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
-msgstr "ΦόÏτωσε"
+msgid "Load..."
+msgstr "ΦόÏτωσε.."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "This type of node can't be used. Only root nodes are allowed."
-msgstr ""
+msgstr "ΆκυÏος Ï„Ïπος κόμβου. ΕπιτÏέπονται μόνο Ïιζικοί κόμβοι."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3499,73 +3546,65 @@ msgid ""
"AnimationTree is inactive.\n"
"Activate to enable playback, check node warnings if activation fails."
msgstr ""
+"Το AnimationTree είναι ανενεÏγό.\n"
+"ΕνεÏγοποίηση για αναπÏαγωγή, έλεγχος Ï€Ïοειδοπιήσεων κόμβου σε πεÏίπτωση "
+"αποτυχίας."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Set the blending position within the space"
-msgstr ""
+msgstr "ΟÏισμός θέσης μίξης εντός του χώÏου"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Select and move points, create points with RMB."
-msgstr ""
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "ΔιαγÏαφή σημείων"
+msgstr "Επιλογή και μετακίνηση σημείων, δημιουÏγία σημείων με δεξί κλικ."
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "Δεξί κλικ: ΔιαγÏαφή σημείου."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Point"
-msgstr "Μετακίνηση σημείου"
+msgstr "Σημείο"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Open Animation Node"
-msgstr "Κόμβος κίνησης"
+msgstr "Άνοιγμα κόμβου κίνησης"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists"
-msgstr "Η ενέÏγεια '%s' υπάÏχει ήδη!"
+msgstr "Το Ï„Ïίγωνο υπάÏχει ήδη"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "BlendSpace2D does not belong to an AnimationTree node."
-msgstr ""
+msgstr "Το BlendSpace2D δεν ανήκει σε κόμβο AnimationTree."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "No triangles exist, so no blending can take place."
-msgstr ""
+msgstr "Δεν υπάÏχουν Ï„Ïίγωνα, οπότε είναι αδÏνατη η μίξη."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create triangles by connecting points."
-msgstr ""
+msgstr "ΔημιουÏγία Ï„Ïιγώνων με την ένωση σημείων."
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Erase points and triangles."
-msgstr "Ανάλυση %d ΤÏιγώνων:"
+msgstr "ΔιαγÏαφή σημείων και Ï„Ïιγώνων."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Generate blend triangles automatically (instead of manually)"
-msgstr ""
+msgstr "ΔημιουÏγία Ï„Ïιγώνων μίξης αυτόματα (αντι για χειÏοκινητα)"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr "ΚοÏμπωμα"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Ανάμειξη:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3574,20 +3613,26 @@ msgstr "ΕπεξεÏγασία φίλτÏων"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Output node can't be added to the blend tree."
-msgstr ""
+msgstr "Ο κόμβος εξόδου δεν μποÏεί να Ï€Ïοστεθεί στο δέντÏο μίξης."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Unable to connect, port may be in use or connection may be invalid."
msgstr ""
+"ΑδÏνατη η σÏνδεση, η θÏÏα μποÏεί να χÏησιμοποιείται ή η σÏνδεση να είναι "
+"άκυÏη."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
msgstr ""
+"Δεν οÏίστηκε AnimationPlayer, άÏα αδÏνατη η ανάκτηση των ονομάτων των "
+"κομματιών."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Player path set is invalid, so unable to retrieve track names."
msgstr ""
+"Η διαδÏομή AnimationPlayer είναι άκυÏη, άÏα αδÏνατη η ανάκτηση των ονομάτων "
+"των κομματιών."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
@@ -3595,23 +3640,23 @@ msgid ""
"Animation player has no valid root node path, so unable to retrieve track "
"names."
msgstr ""
+"Το AnimationPlayer δεν έχει έγκυÏη διαδÏομή ÏÎ¹Î¶Î¹ÎºÎ¿Ï ÎºÏŒÎ¼Î²Î¿Ï…, άÏα αδÏνατη η "
+"ανάκτηση των ονομάτων των κομματιών."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
-msgid "Add Node.."
-msgstr "ΠÏοσθήκη κόμβου"
+msgid "Add Node..."
+msgstr "ΠÏοσθήκη κόμβου.."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filtered Tracks:"
-msgstr "ΕπεξεÏγασία φίλτÏων"
+msgstr "ΕπεξεÏγασία φιλτÏαÏισμένων κομματιών:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Enable filtering"
-msgstr "ΕπεξεÏγάσιμα παιδιά"
+msgstr "ΕνεÏγοποίηση φιλτÏαÏίσματος"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
@@ -3639,14 +3684,12 @@ msgid "Remove Animation"
msgstr "ΚατάÏγηση κίνησης"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Invalid animation name!"
-msgstr "ΣΦΑΛΜΑ: Μη έγκυÏο όνομα κίνησης!"
+msgstr "ΆκυÏο όνομα κίνησης!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Animation name already exists!"
-msgstr "ΣΦΑΛΜΑ: Αυτό το όνομα κίνησης υπάÏχει ήδη!"
+msgstr "Ήδη υπαÏκτό όνομα κίνησης!"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -3670,14 +3713,12 @@ msgid "Duplicate Animation"
msgstr "ΑναπαÏαγωγή κίνησης"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to copy!"
-msgstr "ΣΦΑΛΜΑ: Δεν υπάÏχει κίνηση για αντÏιγÏαφή!"
+msgstr "Καμία κίνηση για αντÏιγÏαφή!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation resource on clipboard!"
-msgstr "ΣΦΑΛΜΑ: Δεν υπάÏχει πόÏος κίνησης στο Ï€ÏόχειÏο!"
+msgstr "Δεν υπάÏχει πόÏος κίνησης στο Ï€ÏόχειÏο!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
@@ -3688,9 +3729,8 @@ msgid "Paste Animation"
msgstr "Επικόλληση κίνησης"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to edit!"
-msgstr "ΣΦΑΛΜΑ: Δεν υπάÏχει κίνηση για επεξεÏγασία!"
+msgstr "Καμία κίνηση για επεξεÏγασία!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
@@ -3734,14 +3774,12 @@ msgid "New"
msgstr "Îέο"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Transitions..."
-msgstr "Μεταβάσεις"
+msgstr "ΕπεξεÏγασία μεταβάσεων..."
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Open in Inspector"
-msgstr "Άνοιγμα στον επεξεÏγαστή"
+msgstr "Άνοιγμα για επιθεώÏηση"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Display list of animations in player."
@@ -3800,9 +3838,8 @@ msgid "Include Gizmos (3D)"
msgstr "ΣυμπεÏιέλαβε τα μαÏαφέτια (3D)"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Pin AnimationPlayer"
-msgstr "Επικόλληση κίνησης"
+msgstr "ΚαÏφίτσωμα AnimationPlayer"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Create New Animation"
@@ -3833,34 +3870,32 @@ msgid "Cross-Animation Blend Times"
msgstr "ΧÏόνοι ανάμειξης κινήσεων"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "End"
msgstr "Τέλος"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Immediate"
-msgstr ""
+msgstr "Άμεση"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Sync"
-msgstr ""
+msgstr "ΣυγχÏωνισμένη"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "At End"
-msgstr ""
+msgstr "Στο τέλος"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Travel"
-msgstr ""
+msgstr "Ταξίδι"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Start and end nodes are needed for a sub-transition."
-msgstr ""
+msgstr "Οι αÏχικοί και τελικοί κόμβοι είναι αναγκαίοι για υπο-μετασχηματισμό."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "No playback resource set at path: %s."
-msgstr "Δεν υπάÏχει στην διαδÏομή πόÏων."
+msgstr "Κανένας πόÏος αναπαÏαγωγής στη διαδÏομή: %s."
#: editor/plugins/animation_state_machine_editor.cpp
msgid ""
@@ -3868,34 +3903,36 @@ msgid ""
"RMB to add new nodes.\n"
"Shift+LMB to create connections."
msgstr ""
+"Επιλογή και μετακίνηση κόμβων.\n"
+"Δεξί κλικ για Ï€Ïοσθήκη κόμβων.\n"
+"Shift+ΑÏιστεÏÏŒ κλικ για την δημιουÏγία συνδέσεων."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "ΔημιουÏγία νέου %s"
+msgstr "ΔημιουÏγία νέων κόμβων."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Connect nodes."
-msgstr "ΣÏνδεση κόμβων"
+msgstr "ΣÏνδεση κόμβων."
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
-msgstr "ΑφαίÏεση επιλεγμένου κομματιοÏ."
+msgid "Remove selected node or transition."
+msgstr "ΑφαίÏεση επιλεγμένου κόμβου ή μετάβασης"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
msgstr ""
+"Εναλλαγή αυτόματης αναπαÏαγωγής της κίνησης στην εκκίνηση, επανεκκίνηση και "
+"επιστÏοφή στην αÏχή."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set the end animation. This is useful for sub-transitions."
-msgstr ""
+msgstr "ΟÏισμός τελικής κίνησης. ΧÏήσιμο για υπο-μεταβάσεις."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "Μετάβαση"
+msgstr "Μετάβαση: "
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3949,10 +3986,6 @@ msgid "Amount:"
msgstr "Ποσότητα:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "Ανάμειξη:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "Ανάμειξη 0:"
@@ -4094,14 +4127,12 @@ msgid "Asset Download Error:"
msgstr "Σφάλμα λήψης:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading (%s / %s)..."
-msgstr "Λήψη"
+msgstr "Λήψη (%s / %s)..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading..."
-msgstr "Λήψη"
+msgstr "Λήψη..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Resolving..."
@@ -4128,14 +4159,12 @@ msgid "Download for this asset is already in progress!"
msgstr "Η λήψη είναι ήδη σε εξέλιξη!"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "First"
msgstr "ΠÏώτο"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Previous"
-msgstr "ΠÏοηγοÏμενη καÏτέλα"
+msgstr "ΠÏοηγοÏμενο"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Next"
@@ -4143,7 +4172,7 @@ msgstr "Επόμενο"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Last"
-msgstr ""
+msgstr "Τελευταίο"
#: editor/plugins/asset_library_editor_plugin.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -4155,7 +4184,7 @@ msgstr "Όλα"
msgid "Plugins"
msgstr "ΠÏόσθετα"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "Ταξινόμηση:"
@@ -4271,29 +4300,29 @@ msgid "Create new horizontal and vertical guides"
msgstr "ΔημιουÏγία νέων οÏιζοντίων και κάθετων οδηγών"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move pivot"
msgstr "Μετακίνηση πηγαίου σημείου"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Rotate CanvasItem"
-msgstr "ΕπεξεÏγασία στοιχείου κανβά"
+msgstr "ΠεÏιστÏοφή CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move anchor"
-msgstr "ΕνέÏγεια μετακίνησης"
+msgstr "Μετακίνηση άγκυÏας"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Resize CanvasItem"
-msgstr "ΕπεξεÏγασία στοιχείου κανβά"
+msgstr "Αλλαγή μεγέθους CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Scale CanvasItem"
+msgstr "ΠεÏιστÏοφή CanvasItem"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
-msgstr "ΕπεξεÏγασία στοιχείου κανβά"
+msgstr "Μετακίνηση CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -4312,21 +4341,19 @@ msgid "Paste Pose"
msgstr "Επικόληση στάσης"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "ΣμÏκÏινση"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "ΕπαναφοÏά μεγέθυνσης"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Μεγέθυνση"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr "Επιλογή λειτουÏγίας"
@@ -4356,6 +4383,11 @@ msgid "Rotate Mode"
msgstr "ΛειτουÏγία πεÏιστÏοφής"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "ΛειτουÏγία κλιμάκωσης (R)"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4374,16 +4406,14 @@ msgid "Pan Mode"
msgstr "ΛειτουÏγία Μετακίνησης κάμεÏας"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle snapping."
-msgstr "Εναλλαγή κουμπώματος"
+msgstr "Εναλλαγή κουμπώματος."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Snap"
msgstr "ΧÏήση κουμπώματος"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snapping Options"
msgstr "Επιλογές κουμπώματος"
@@ -4425,9 +4455,8 @@ msgid "Snap to node sides"
msgstr "ΚοÏμπωμα στις πλευÏές του κόμβου"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to node center"
-msgstr "ΚοÏμπωμα στην άγκυÏα του κόμβου"
+msgstr "ΚοÏμπωμα στο κέντÏο του κόμβου"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to other nodes"
@@ -4456,6 +4485,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr "ΕπαναφέÏει την δυνατότητα των παιδιών του αντικειμένου να επιλεγοÏν."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "Σκελετός..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "Εμφάνιση οστών"
@@ -4469,12 +4503,11 @@ msgstr "ΕκκαθάÏιση αλυσίδας IK"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make Custom Bone(s) from Node(s)"
-msgstr ""
+msgstr "ΔημιουÏγία Ï€ÏοσαÏμοσμένων οστών απο κόμβους"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Custom Bones"
-msgstr "ΕκκαθάÏιση οστών"
+msgstr "ΕκκαθάÏιση Ï€ÏοσαÏμοσμένων οστών"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -4507,6 +4540,10 @@ msgid "Show Viewport"
msgstr "ΠÏοβολή οπτικής γωνίας"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr "ΚεντÏάÏισμα επιλογής"
@@ -4519,9 +4556,8 @@ msgid "Layout"
msgstr "Διάταξη"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Insert keys."
-msgstr "Εισαγωγή κλειδιών"
+msgstr "Εισαγωγή κλειδιών."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
@@ -4578,17 +4614,25 @@ msgstr ""
"ΣÏÏσιμο & απόθεση + Alt: Αλλαγή του Ï„Ïπου του κόμβου"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr "ΔημιουÏγία πολυγώνου 3D"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "Δημιουγία πολυγώνου"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "ΕπεγεÏγασία πολυγώνου"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "ΕπεγεÏγασία πολυγώνου (ΑφαίÏεση σημείου)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
msgstr "ΟÏισμός λαβής"
#: editor/plugins/cpu_particles_editor_plugin.cpp
-#, fuzzy
msgid "CPUParticles"
-msgstr "Σωματίδια"
+msgstr "Σωματίδια CPU"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
@@ -4681,37 +4725,9 @@ msgid "Item List Editor"
msgstr "ΕπεξεÏγαστής λίστας στοιχείων"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"Δεν υπάÏχει πόÏος OccluderPolygon2D σε αυτόν τον κόμβο.\n"
-"Îα δημιουÏγία και να οÏισθεί ένας;"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr "ΔημιουÏγία πολυγώνου εμποδίου"
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr "ΔημιουÏγία νέου πολυγώνου από την αÏχή."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "ΕπεξεÏγασία υπαÏÎºÏ„Î¿Ï Ï€Î¿Î»Ï…Î³ÏŽÎ½Î¿Ï…:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "ΑÏιστεÏÏŒ κλίκ: ΜΕτακίνηση σημείου."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr "Ctrl+ΑÏιστεÏÏŒ κλικ: ΔιαχωÏσμός τμήματος."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "Δεξί κλικ: ΔιαγÏαφή σημείου."
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr "Το πλέγμα είναι άδειο!"
@@ -4945,13 +4961,14 @@ msgid "Populate"
msgstr "ΣυμπλήÏωση"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr "ΔημιουÏγία πολυγώνου πλοήγησης"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr "ΔημιουÏία AABB"
+#, fuzzy
+msgid "Generating Visibility Rect"
+msgstr "ΔημιουÏγία οÏθογωνίου οÏατότητας"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -4981,6 +4998,11 @@ msgstr "ΕκκαθάÏιση μάσκας εκπομπής"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr "ΜετατÏοπή σε σωματίδια CPU"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr "Σωματίδια"
@@ -5050,13 +5072,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr "Απαιτείται ένα υλικό επεξεÏγασίας Ï„Ïπου 'ParticlesMaterial'."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr "ΔημιουÏία AABB"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "ΜετατÏοπή σε κεφαλαία"
+msgid "Generate AABB"
+msgstr "ΔημιουÏία AABB"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5080,6 +5101,11 @@ msgid "Add Point to Curve"
msgstr "ΠÏοσθήκη σημείου στην καμπÏλη"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "κλείσιμο καμπÏλης"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr "Μετακίνηση σημείου στην καμπÏλη"
@@ -5107,6 +5133,11 @@ msgid "Click: Add Point"
msgstr "Κλικ: ΠÏοσθήκη σημείου"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Left Click: Split Segment (in curve)"
+msgstr "ΔιαχωÏισμός τμήματος (στην καμπÏλη)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr "Δεξί κλικ: ΔιαγÏαφή σημείου"
@@ -5122,11 +5153,6 @@ msgstr "ΠÏοσθήκη σημείου (σε άδειο χώÏο)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr "ΔιαχωÏισμός τμήματος (στην καμπÏλη)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "ΔιαγÏαφή σημείου"
@@ -5183,6 +5209,10 @@ msgstr "ΑφαίÏεση σημείου ελέγχου εξόδου"
msgid "Remove In-Control Point"
msgstr "ΑφαίÏεση σημείου ελέγχου εισόδου"
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "ΔιαχωÏισμός τμήματος (στην καμπÏλη)"
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5195,10 +5225,16 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Sync bones"
+msgid "Sync Bones"
msgstr "Εμφάνιση οστών"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr "ΔημιουÏγία χάÏτη UV"
@@ -5208,42 +5244,48 @@ msgid "Create Polygon & UV"
msgstr "Δημιουγία πολυγώνου"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "ΔημιουÏγία νέου οÏιζόντιου οδηγοÏ"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "Η ενέÏγεια '%s' υπάÏχει ήδη!"
+msgid "Remove Internal Vertex"
+msgstr "ΑφαίÏεση σημείου ελέγχου εισόδου"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Add Split"
-msgstr "ΠÏοσθήκη σημείου"
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "Μη έγκυÏη διαδÏομή!"
+msgid "Add Custom Polygon"
+msgstr "ΕπεγεÏγασία πολυγώνου"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "ΑφαίÏεση σημείου"
+msgid "Remove Custom Polygon"
+msgstr "ΑφαίÏεση πολυγώνου και σημείου"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr "Μετασχηματισμός χάÏτη UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
+#, fuzzy
+msgid "Transform Polygon"
+msgstr "Είδος μετασχηματισμοÏ"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Open Polygon 2D UV editor."
+msgstr "ΕπεξεÏγαστής δισδιάστατου πολυγώνου"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
msgstr "ΕπεξεÏγαστής δισδιάστατου πολυγώνου"
@@ -5253,13 +5295,13 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "ΕπεγεÏγασία πολυγώνου"
+msgid "Points"
+msgstr "Σημείο"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Splits"
-msgstr "ΔιαχωÏισμός διαδÏομής"
+msgid "Polygons"
+msgstr "ΠολÏγωνο -> UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -5268,11 +5310,7 @@ msgstr "ΔημιουÏγία οστών"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
-msgstr "Δημιουγία πολυγώνου"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Move Points"
msgstr "Μετακίνηση σημείου"
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5300,20 +5338,21 @@ msgid "Scale Polygon"
msgstr "Κλιμάκωση πολυγώνου"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "Επιλέξτε ένα αντικείμενο ÏÏθμισης Ï€Ïώτα!"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5338,6 +5377,11 @@ msgid "Grid Settings"
msgstr "Ρυθμίσεις GridMap"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "ΚοÏμπωμα"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr "ΕνεÏγοποίηση κουμπώματος"
@@ -5401,22 +5445,22 @@ msgid "Paste Resource"
msgstr "Επικόλληση πόÏου"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "Άνοιγμα στον επεξεÏγαστή"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr "Στιγμιότυπο:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr "ΤÏπος:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Άνοιγμα στον επεξεÏγαστή"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr "ΦόÏτωση πόÏου"
@@ -5449,6 +5493,11 @@ msgstr "Σφάλμα κατά την μετακίνηση αÏχείου:\n"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
+msgid "Error: could not load file."
+msgstr "Δεν ήταν δυνατή η φόÏτωση εικόνας"
+
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Error could not load file."
msgstr "Δεν ήταν δυνατή η φόÏτωση εικόνας"
@@ -5458,19 +5507,23 @@ msgid "Error saving file!"
msgstr "Σφάλμα κατά την αποθήκευση TileSet!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
+#, fuzzy
+msgid "Error while saving theme."
msgstr "Σφάλμα κατά την αποθήκευση θέματος"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+#, fuzzy
+msgid "Error Saving"
msgstr "Σφάλμα κατά την αποθήκευση"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
+#, fuzzy
+msgid "Error importing theme."
msgstr "Σφάλμα κατά την εισαγωγή θέματος"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+#, fuzzy
+msgid "Error Importing"
msgstr "Σφάλμα κατά την εισαγωγή"
#: editor/plugins/script_editor_plugin.cpp
@@ -5493,6 +5546,14 @@ msgid "Import Theme"
msgstr "Εισαγωγή θέματος"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Σφάλμα κατά την αποθήκευση θέματος"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Σφάλμα κατά την αποθήκευση"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr "Αποθήκευση θέματος ως..."
@@ -5534,8 +5595,8 @@ msgstr "ΑÏχείο"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile"
-msgstr "ΠÏοβολή αÏχείων"
+msgid "Open..."
+msgstr "Άνοιγμα"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5550,11 +5611,8 @@ msgid "Copy Script Path"
msgstr "ΑντιγÏαφή διαδÏομής δεσμής ενεÏγειών"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr "Εμφάνιση στο σÏστημα αÏχείων"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+#, fuzzy
+msgid "History Previous"
msgstr "ΙστοÏικά Ï€ÏοηγοÏμενο"
#: editor/plugins/script_editor_plugin.cpp
@@ -5567,6 +5625,11 @@ msgid "Theme"
msgstr "Θέμα"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Import Theme..."
+msgstr "Εισαγωγή θέματος"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
msgstr "ΕπαναφόÏτωση θέματος"
@@ -5575,10 +5638,6 @@ msgid "Save Theme"
msgstr "Αποθήκευση θέματος"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "Αποθήκευση θέματος ως"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "Κλείσιμο τεκμηÏίωσης"
@@ -5625,7 +5684,8 @@ msgid "Keep Debugger Open"
msgstr "ΔιατήÏησε τον αποσφαλματωτή ανοιχτό"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+#, fuzzy
+msgid "Debug with External Editor"
msgstr "Αποσφαλμάτωση με εξωτεÏικό επεξεÏγαστή"
#: editor/plugins/script_editor_plugin.cpp
@@ -5633,10 +5693,6 @@ msgid "Open Godot online documentation"
msgstr "Άνοιγμα ηλεκτÏονικής τεκμηÏίωσης της Godot"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr "Αναζήτηση στην ιεÏαÏχεία κλάσεων."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Αναζήτηση στην τεκμηÏίωση αναφοÏάς."
@@ -5674,21 +5730,9 @@ msgstr "Αποσφαλματωτής"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Search results"
+msgid "Search Results"
msgstr "Αναζήτηση βοήθειας"
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "Αναζήτηση κλάσεων"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-"Οι ενσωματομένες δεσμές ενεÏγειών μποÏοÏν να επεξεÏγαστοÏν μόνο όταν η σκηνή "
-"στην οποία ανήκουν είναι φοÏτωμένη"
-
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
@@ -5699,6 +5743,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "Πήγαινε σε συνάÏτηση..."
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr "Μόνο οι πόÏοι από το σÏστημα αÏχείων μποÏοÏν να διαγÏαφοÏν."
@@ -5731,10 +5784,6 @@ msgstr "Κεφαλαιοποίηση"
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5786,11 +5835,13 @@ msgid "Trim Trailing Whitespace"
msgstr "ΠεÏικοπή ÎºÎ±Ï„Î±Î»Î·ÎºÏ„Î¹ÎºÎ¿Ï ÎºÎµÎ½Î¿Ï Î´Î¹Î±ÏƒÏ„Î®Î¼Î±Ï„Î¿Ï‚"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+#, fuzzy
+msgid "Convert Indent to Spaces"
msgstr "ΜετατÏοπή εσοχής σε κενά"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+#, fuzzy
+msgid "Convert Indent to Tabs"
msgstr "ΜετατÏοπή εσοχής σε στηλοθέτες"
#: editor/plugins/script_text_editor.cpp
@@ -5807,36 +5858,32 @@ msgid "Remove All Breakpoints"
msgstr "ΑφαίÏεση όλων των σημείων διακοπής"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
+#, fuzzy
+msgid "Go to Next Breakpoint"
msgstr "Πήγαινε στο επόμενο σημείο διακοπής"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
+#, fuzzy
+msgid "Go to Previous Breakpoint"
msgstr "Πήγαινε στο Ï€ÏοηγοÏμενο σημείο διακοπής"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr "ΜετατÏοπή σε κεφαλαία"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr "ΜετατÏοπή σε πεζά"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr "ΈυÏεση Ï€ÏοηγοÏμενου"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr "ΦιλτÏάÏισμα αÏχείων..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+#, fuzzy
+msgid "Go to Function..."
msgstr "Πήγαινε σε συνάÏτηση..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+#, fuzzy
+msgid "Go to Line..."
msgstr "Πήγαινε σε γÏαμμή..."
#: editor/plugins/script_text_editor.cpp
@@ -5934,6 +5981,14 @@ msgid "Animation Key Inserted."
msgstr "Το κλειδί κίνησης έχει εισαχθεί."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr "Τόνος"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr "ΖωγÏαφισμένα αντικείμενα"
@@ -6101,6 +6156,11 @@ msgid "Freelook Speed Modifier"
msgstr "ΤαχÏτητα ελεÏθεÏου κοιτάγματος"
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "Εμφάνιση πληÏοφοÏιών"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "Διάλογος XForm"
@@ -6203,11 +6263,6 @@ msgid "Tool Scale"
msgstr "ΕÏγαλείο κλιμάκωσης"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap To Floor"
-msgstr "κουμπώματος στο πλέγμα"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Εναλλαγή ελεÏθεÏης κάμεÏας"
@@ -6325,6 +6380,10 @@ msgstr "ΠÏιν"
msgid "Post"
msgstr "Μετά"
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
msgid "Sprite is empty!"
@@ -6445,11 +6504,18 @@ msgid "Set Region Rect"
msgstr "ΟÏισμός οÏθογωνίου πεÏιοχής"
#: editor/plugins/texture_region_editor_plugin.cpp
+#, fuzzy
+msgid "Set Margin"
+msgstr "ΟÏισμός λαβής"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr "ΛειτουÏγία κουμπώματος:"
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+#, fuzzy
+msgid "None"
msgstr "<Τίποτα>"
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6615,6 +6681,11 @@ msgid "Fix Invalid Tiles"
msgstr "Μη έγκυÏο όνομα."
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "ΚεντÏάÏισμα επιλογής"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr "Βάψιμο TileMap"
@@ -6661,33 +6732,40 @@ msgstr "Επιλογή πλακιδίου"
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "ΑφαίÏεση επιλογής"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr "ΠεÏιστÏοφή 0 μοίÏες"
+#, fuzzy
+msgid "Rotate left"
+msgstr "ΛειτουÏγία πεÏιστÏοφής"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr "ΠεÏιστÏοφή 90 μοίÏες"
+#, fuzzy
+msgid "Rotate right"
+msgstr "Μετακίνηση δεξιά"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
-msgstr "ΠεÏιστÏοφή 180 μοίÏες"
+msgid "Flip horizontally"
+msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
-msgstr "ΠεÏιστÏοφή 270 μοίÏες"
+msgid "Flip vertically"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Clear transform"
+msgstr "Μετασχηματισμός"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr "ΠÏοσθέστε κόμβο/-ους από δέντÏο"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr "ΑφαίÏεση Ï„Ïέχουσας εγγÏαφής"
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6699,35 +6777,60 @@ msgid "Merge from Scene"
msgstr "Συγχώνευση από σκηνή"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
msgstr ""
-"Επιλέξτε υπότιτλο για εικονίδιο, o οποίος θα χÏησιμοποιείται και σε μη "
-"έγκυÏες συνδέσεις αυτόματων πλακιδίων."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "Επικόλληση κίνησης"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "ΔιαγÏαφή σημείων."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "ΔημιουÏγία νέου πολυγώνου από την αÏχή."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "ΑφαίÏεση Ï„Ïέχουσας εγγÏαφής"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
-msgstr "ΔημιουÏγία από σκηνή;"
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
msgstr "Συγχώνευση από σκηνή;"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "ΑφαίÏεση Ï€ÏοτÏπου"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6738,13 +6841,8 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
-"Click on another Tile to edit it."
-msgstr ""
-"ΑÏιστεÏÏŒ κλικ: ενεÏγοποίησε το bit.\n"
-"Δεξί κλικ: απενεÏγοποίησε το bit."
+msgid "Delete selected Rect."
+msgstr "ΔιαγÏαφή επιλεγμένων αÏχείων;"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -6755,6 +6853,21 @@ msgstr "Επέλεξε το Ï„Ïέχων επεξεÏγαζόμενο υπο-Ï€Î
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid "Delete polygon."
+msgstr "ΔιαγÏαφή σημείων"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid ""
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
+"Click on another Tile to edit it."
+msgstr ""
+"ΑÏιστεÏÏŒ κλικ: ενεÏγοποίησε το bit.\n"
+"Δεξί κλικ: απενεÏγοποίησε το bit."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
"Select sub-tile to use as icon, this will be also used on invalid autotile "
"bindings.\n"
@@ -6772,11 +6885,101 @@ msgstr "Επιλέξτε υπο-πλακίδιο για να αλλάξετε τ
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr "Επιλέξτε υπο-πλακίδιο για να αλλάξετε την Ï€ÏοτεÏαιότητα του."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Set Tile Region"
+msgstr "ΟÏισμός οÏθογωνίου πεÏιοχής"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "ΔημιουÏγία φακέλου"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "ΕπεξεÏγασία φίλτÏων"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "ΕπεξεÏγασία υπαÏÎºÏ„Î¿Ï Ï€Î¿Î»Ï…Î³ÏŽÎ½Î¿Ï…:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "ΕπεγεÏγασία πολυγώνου"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "ΔημιουÏγία πολυγώνου πλοήγησης"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "Επικόλληση κίνησης"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "ΑφαίÏεση Ï€ÏοτÏπου"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "ΑφαίÏεση πολυγώνου και σημείου"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "ΔημιουÏγία πολυγώνου εμποδίου"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "ΔημιουÏγία πολυγώνου πλοήγησης"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "ΕπεξεÏγασία φίλτÏων"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "ΔημιουÏγία πολυγώνου πλοήγησης"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "ΔημιουÏγία πολυγώνου εμποδίου"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "This property can't be changed."
msgstr "Αυτή η λειτουÏγία δεν μποÏεί να γίνει χωÏίς σκηνή."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
+#, fuzzy
+msgid "TileSet"
msgstr "ΣÏνολο πλακιδίων"
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6817,6 +7020,16 @@ msgstr ""
"Τα Ï€Ïότυπα εξαγωγής για αυτή την πλατφόÏτμα λείπουν ή είναι κατεστÏαμμένα:"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Release"
+msgstr "μόλις απελευθεÏώθηκε"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Exporting All"
+msgstr "Εξαγωγή για %s"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr "ΔιαμοÏφώσεις"
@@ -6825,6 +7038,11 @@ msgid "Add..."
msgstr "ΠÏοσθήκη..."
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "Εξαγωγή έÏγου"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr "ΠόÏοι"
@@ -6883,10 +7101,52 @@ msgid "Feature List:"
msgstr "Λίστα δυνατοτήτων:"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "Îεα δεσμή ενεÏγειών"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Script Export Mode:"
+msgstr "ΛειτουÏγία εξαγωγής:"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Text"
+msgstr "Υφή"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Compiled"
+msgstr "Συμπίεση"
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr "Εξαγωγή PCK/ZIP"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export mode?"
+msgstr "ΛειτουÏγία εξαγωγής:"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Export All"
+msgstr "Εξαγωγή"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr "Τα Ï€Ïότυπα εξαγωγής για αυτή την πλατφόÏτμα λείπουν:"
@@ -7020,7 +7280,8 @@ msgid "Unnamed Project"
msgstr "Ανώνυμο έÏγο"
#: editor/project_manager.cpp
-msgid "Can't open project"
+#, fuzzy
+msgid "Can't open project at '%s'."
msgstr "Δεν ήταν δυνατό το άνοιγμα του έÏγου"
#: editor/project_manager.cpp
@@ -7029,6 +7290,24 @@ msgstr "Είστε σίγουÏοι πως θέλετε να ανοίξετε Ï€
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7366,10 +7645,6 @@ msgstr "Ρυθμίσεις έÏγου (project.godot)"
msgid "General"
msgstr "Γενικά"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr "Ιδιότητα:"
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr "ΠαÏάκαμψη για..."
@@ -7503,10 +7778,6 @@ msgstr "Επιλέξτε έναν κόμβο"
msgid "Bit %d, val %d."
msgstr "Δυαδικό ψηφίο %d, τιμή %d."
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr "Ιδιότητες:"
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr "Επιλογή ιδιότητας"
@@ -7599,7 +7870,7 @@ msgid "Step"
msgstr "Βήμα:"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7608,7 +7879,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7653,7 +7924,7 @@ msgstr "Κεφαλαία"
msgid "Reset"
msgstr "ΕπαναφοÏά μεγέθυνσης"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr "Σφάλμα"
@@ -7714,6 +7985,10 @@ msgid "Instance Scene(s)"
msgstr "ΔημιουÏγία στιγμιοτÏπυ σκηνών"
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "ΑÏχικοποίηση σκηνής ως παιδί"
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr "ΕκκαθάÏιση δεσμής ενεÏγειών"
@@ -7752,6 +8027,12 @@ msgid "Save New Scene As..."
msgstr "Αποθήκευση νέας σκηνής ως..."
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr "ΕπεξεÏγάσιμα παιδιά"
@@ -7831,6 +8112,11 @@ msgid "Clear Inheritance"
msgstr "ΕκκαθάÏιση κληÏονομικότητας"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Open documentation"
+msgstr "Άνοιγμα ηλεκτÏονικής τεκμηÏίωσης της Godot"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr "ΔιαγÏαφή Κόμβων"
@@ -7839,15 +8125,16 @@ msgid "Add Child Node"
msgstr "ΠÏοσθήκη κόμβου ως παιδί"
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
-msgstr "ΑÏχικοποίηση σκηνής ως παιδί"
-
-#: editor/scene_tree_dock.cpp
msgid "Change Type"
msgstr "Αλλαγή Ï„Ïπου"
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Extend Script"
+msgstr "Άνοιγμα δεσμής ενεÏγειών"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Make Scene Root"
msgstr "Βγάζει νόημα!"
@@ -8013,6 +8300,11 @@ msgid "Path is empty"
msgstr "Η διαδÏομή είναι άδεια"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Filename is empty"
+msgstr "Η διαδÏομή αποθήκευσης είναι άδεια!"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr "Η διαδÏομή δεν είναι τοπική"
@@ -8101,20 +8393,9 @@ msgid "Bytes:"
msgstr "Ψηφιολέξεις:"
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr "ΠÏοειδοποίηση"
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr "Σφάλμα:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr "Πηγή:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
-msgstr "ΣυνάÏτηση:"
+#, fuzzy
+msgid "Stack Trace"
+msgstr "Στοίβαξη καÏέ"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8147,18 +8428,6 @@ msgid "Stack Frames"
msgstr "Στοίβαξη καÏέ"
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr "Μεταβλητή"
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr "Σφάλματα:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr "Ιχνηλάτηση στοίβας (Εάν υφίσταται):"
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr "ΠÏόγÏαμμα δημιουÏγίας Ï€Ïοφιλ"
@@ -8362,7 +8631,8 @@ msgid "GDNative"
msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+#, fuzzy
+msgid "Step argument is zero!"
msgstr "Η παÏάμετÏος step είναι μηδέν!"
#: modules/gdscript/gdscript_functions.cpp
@@ -8586,12 +8856,8 @@ msgid "End of inner exception stack trace"
msgstr "Τέλος ιχνηλάτησης στοίβας εσωτεÏικής εξαίÏεσης"
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr "ΠÏοετοίμασε!"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
-msgstr "ΠÏοετοιμασία του πλέγματος πλοήγησης."
+msgid "Bake NavMesh"
+msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8876,6 +9142,10 @@ msgid "Base Type:"
msgstr "ΤÏπος βάσης:"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "Μέλη:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "Διαθέσιμοι κόμβοι:"
@@ -8979,11 +9249,11 @@ msgid "Search VisualScript"
msgstr "ΑφαίÏεση κόμβου VisualScript"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
-msgstr "ΠάÏε"
+msgid "Get %s"
+msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -9081,6 +9351,12 @@ msgstr ""
"Ένα σχήμα Ï€Ïέπει να δοθεί στο CollisionShape2D για να λειτουÏγήσει. "
"ΔημιουÏγήστε ένα πόÏο σχήματος για αυτό!"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -9131,6 +9407,12 @@ msgstr ""
"Δεν έχει οÏιστεί υλικό για να επεξεÏγαστεί τα σωματίδια, οπότε η συμπεÏιφοÏά "
"θα εκτυπώνεται."
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr "Το PathFollow2D δουλεÏει μόνο όταν κληÏονομεί έναν κόμβο Path2D."
@@ -9274,6 +9556,18 @@ msgstr ""
"Ένα σχήμα Ï€Ïέπει να δοθεί στο CollisionShape για να λειτουÏγήσει. "
"ΔημιουÏγήστε ένα πόÏο σχήματος για αυτό!"
+#: scene/3d/cpu_particles.cpp
+#, fuzzy
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+"Τίποτα δεν είναι οÏατό, επειδή δεν έχουν οÏιστεί πεÏάσματα για τα πλέγματα."
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr "Τοποθέτηση πλεγμάτων"
@@ -9298,6 +9592,28 @@ msgid ""
msgstr ""
"Τίποτα δεν είναι οÏατό, επειδή δεν έχουν οÏιστεί πεÏάσματα για τα πλέγματα."
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr "Το PathFollow2D δουλεÏει μόνο όταν κληÏονομεί έναν κόμβο Path2D."
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr "Το PathFollow2D δουλεÏει μόνο όταν κληÏονομεί έναν κόμβο Path2D."
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9340,7 +9656,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
#, fuzzy
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9407,6 +9723,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr "Το δέντÏο κίνησης δεν είναι έγκυÏο."
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr "Ωμή λειτουÏγία"
@@ -9423,10 +9743,6 @@ msgstr "Ειδοποίηση!"
msgid "Please Confirm..."
msgstr "ΠαÏακαλώ επιβεβαιώστε..."
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr "Επιλογή Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… φακέλου"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9437,6 +9753,10 @@ msgstr ""
"καλέσετε την popup() ή καμία από τις συναÏτήσεις popup*(). Το να τους κάνετε "
"οÏατοÏÏ‚ κατά την επεξεÏγασία, όμως, δεν είναι Ï€Ïόβλημα."
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9493,11 +9813,6 @@ msgstr "Μη έγκυÏο μέγεθος γÏαμματοσειÏάς."
msgid "Input"
msgstr "ΠÏοσθήκη εισόδου"
-#: scene/resources/visual_shader.cpp
-#, fuzzy
-msgid "None"
-msgstr "<Τίποτα>"
-
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
@@ -9515,6 +9830,209 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Split already exists."
+#~ msgstr "Η ενέÏγεια '%s' υπάÏχει ήδη!"
+
+#, fuzzy
+#~ msgid "Add Split"
+#~ msgstr "ΠÏοσθήκη σημείου"
+
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr "Μη έγκυÏη διαδÏομή!"
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "ΑφαίÏεση σημείου"
+
+#, fuzzy
+#~ msgid "Poly"
+#~ msgstr "ΕπεγεÏγασία πολυγώνου"
+
+#, fuzzy
+#~ msgid "Splits"
+#~ msgstr "ΔιαχωÏισμός διαδÏομής"
+
+#, fuzzy
+#~ msgid "Select a split to erase it."
+#~ msgstr "Επιλέξτε ένα αντικείμενο ÏÏθμισης Ï€Ïώτα!"
+
+#~ msgid "No name provided"
+#~ msgstr "Δεν δόθηκε όνομα"
+
+#~ msgid "Add Node.."
+#~ msgstr "ΠÏοσθήκη κόμβου.."
+
+#~ msgid "Create from scene?"
+#~ msgstr "ΔημιουÏγία από σκηνή;"
+
+#~ msgid "Create Poly"
+#~ msgstr "Δημιουγία πολυγώνου"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "ΔημιουÏγία νέου πολυγώνου από την αÏχή"
+
+#~ msgid "Zoom out"
+#~ msgstr "ΣμÏκÏινση"
+
+#~ msgid "Zoom in"
+#~ msgstr "Μεγέθυνση"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "ΔημιουÏγία πολυγώνου 3D"
+
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "Δεν υπάÏχει πόÏος OccluderPolygon2D σε αυτόν τον κόμβο.\n"
+#~ "Îα δημιουÏγία και να οÏισθεί ένας;"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "ΑÏιστεÏÏŒ κλίκ: ΜΕτακίνηση σημείου."
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "Ctrl+ΑÏιστεÏÏŒ κλικ: ΔιαχωÏσμός τμήματος."
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "Δεξί κλικ: ΔιαγÏαφή σημείου."
+
+#, fuzzy
+#~ msgid "New TextFile"
+#~ msgstr "ΠÏοβολή αÏχείων"
+
+#~ msgid "Save Theme As"
+#~ msgstr "Αποθήκευση θέματος ως"
+
+#~ msgid "<None>"
+#~ msgstr "<Τίποτα>"
+
+#~ msgid ""
+#~ "Select sub-tile to use as icon, this will be also used on invalid "
+#~ "autotile bindings."
+#~ msgstr ""
+#~ "Επιλέξτε υπότιτλο για εικονίδιο, o οποίος θα χÏησιμοποιείται και σε μη "
+#~ "έγκυÏες συνδέσεις αυτόματων πλακιδίων."
+
+#~ msgid "Zoom:"
+#~ msgstr "Μεγέθυνση:"
+
+#~ msgid "Are you sure you want to remove all connections from the \""
+#~ msgstr ""
+#~ "Είστε σίγουÏοι πως θέλετε να αφαιÏέσετε όλες τις συνδέσεις απο το \""
+
+#~ msgid "Class List:"
+#~ msgstr "Λίστα κλάσεων:"
+
+#~ msgid "Search Classes"
+#~ msgstr "Αναζήτηση κλάσεων"
+
+#~ msgid "Public Methods"
+#~ msgstr "Δημόσιες συναÏτήσεις"
+
+#~ msgid "Public Methods:"
+#~ msgstr "Δημόσιες συναÏτήσεις:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "Στοιχεία του θέματος GUI"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "Στοιχεία του θέματος GUI:"
+
+#~ msgid "Property: "
+#~ msgstr "Ιδιότητα: "
+
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "Εναλλαγή φακέλου ως αγαπημένο."
+
+#~ msgid "Show current scene file."
+#~ msgstr "Εμφάνιση του αÏχείου της Ï„Ïέχουσας σκηνής."
+
+#~ msgid "Enter tree-view."
+#~ msgstr "Είσοδος σε Ï€Ïοβολή δέντÏου."
+
+#~ msgid "Whole words"
+#~ msgstr "ΟλόκληÏες λέξεις"
+
+#~ msgid "Match case"
+#~ msgstr "Αντιστοίχηση πεζών-κεφαλαίων"
+
+#~ msgid "Filter: "
+#~ msgstr "ΦίλτÏο: "
+
+#~ msgid "Ok"
+#~ msgstr "Εντάξει"
+
+#~ msgid "Show In File System"
+#~ msgstr "Εμφάνιση στο σÏστημα αÏχείων"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "Αναζήτηση στην ιεÏαÏχεία κλάσεων."
+
+#, fuzzy
+#~ msgid "Search in files"
+#~ msgstr "Αναζήτηση κλάσεων"
+
+#~ msgid ""
+#~ "Built-in scripts can only be edited when the scene they belong to is "
+#~ "loaded"
+#~ msgstr ""
+#~ "Οι ενσωματομένες δεσμές ενεÏγειών μποÏοÏν να επεξεÏγαστοÏν μόνο όταν η "
+#~ "σκηνή στην οποία ανήκουν είναι φοÏτωμένη"
+
+#~ msgid "Convert To Uppercase"
+#~ msgstr "ΜετατÏοπή σε κεφαλαία"
+
+#~ msgid "Convert To Lowercase"
+#~ msgstr "ΜετατÏοπή σε πεζά"
+
+#, fuzzy
+#~ msgid "Snap To Floor"
+#~ msgstr "κουμπώματος στο πλέγμα"
+
+#~ msgid "Rotate 0 degrees"
+#~ msgstr "ΠεÏιστÏοφή 0 μοίÏες"
+
+#~ msgid "Rotate 90 degrees"
+#~ msgstr "ΠεÏιστÏοφή 90 μοίÏες"
+
+#~ msgid "Rotate 180 degrees"
+#~ msgstr "ΠεÏιστÏοφή 180 μοίÏες"
+
+#~ msgid "Rotate 270 degrees"
+#~ msgstr "ΠεÏιστÏοφή 270 μοίÏες"
+
+#~ msgid "Warning"
+#~ msgstr "ΠÏοειδοποίηση"
+
+#~ msgid "Error:"
+#~ msgstr "Σφάλμα:"
+
+#~ msgid "Source:"
+#~ msgstr "Πηγή:"
+
+#~ msgid "Function:"
+#~ msgstr "ΣυνάÏτηση:"
+
+#~ msgid "Variable"
+#~ msgstr "Μεταβλητή"
+
+#~ msgid "Errors:"
+#~ msgstr "Σφάλματα:"
+
+#~ msgid "Stack Trace (if applicable):"
+#~ msgstr "Ιχνηλάτηση στοίβας (Εάν υφίσταται):"
+
+#~ msgid "Bake!"
+#~ msgstr "ΠÏοετοίμασε!"
+
+#~ msgid "Bake the navigation mesh."
+#~ msgstr "ΠÏοετοιμασία του πλέγματος πλοήγησης."
+
+#~ msgid "Get"
+#~ msgstr "ΠάÏε"
+
#~ msgid "Change Scalar Constant"
#~ msgstr "Αλλαγή μονόμετÏης σταθεÏάς"
@@ -9716,9 +10234,6 @@ msgstr ""
#~ msgid "Run Script"
#~ msgstr "Εκτέλεση δεσμής ενεÏγειών"
-#~ msgid "Save the currently edited resource."
-#~ msgstr "Αποθήκευσε το Ï„Ïέχων επεξεÏγαζόμενο πόÏο."
-
#~ msgid "Stop Profiling"
#~ msgstr "Διακοπή Ï€Ïοφίλ"
@@ -10011,9 +10526,6 @@ msgstr ""
#~ msgid "Could not save atlas subtexture:"
#~ msgstr "ΑδÏνατη η αποθήκευση υπό-εικόνας άτλαντα:"
-#~ msgid "Exporting for %s"
-#~ msgstr "Εξαγωγή για %s"
-
#~ msgid "Setting Up..."
#~ msgstr "ΑÏχικοποίηση..."
@@ -10120,9 +10632,6 @@ msgstr ""
#~ msgid "Source Font:"
#~ msgstr "Πηγαία γÏαμματοσειÏά:"
-#~ msgid "Source Font Size:"
-#~ msgstr "Μέγεθος πηγαίας γÏαμματοσειÏάς:"
-
#~ msgid "Dest Resource:"
#~ msgstr "ΠόÏος Ï€ÏοοÏισμοÏ:"
@@ -10199,9 +10708,6 @@ msgstr ""
#~ msgid "Start(s)"
#~ msgstr "ΑÏχή"
-#~ msgid "Filters"
-#~ msgstr "ΦίλτÏα"
-
#~ msgid "Source path is empty."
#~ msgstr "Η διαδÏομή Ï€Ïοέλευσης είναι άδεια."
@@ -10340,9 +10846,6 @@ msgstr ""
#~ msgid "Crop empty space."
#~ msgstr "ΠεÏικοπή άδειου χώÏου."
-#~ msgid "Texture"
-#~ msgstr "Υφή"
-
#~ msgid "Import Large Texture"
#~ msgstr "Εισαγωγή μεγάλης υφής"
@@ -10406,9 +10909,6 @@ msgstr ""
#~ msgid "Ignore First Row"
#~ msgstr "Αγνόησε την Ï€Ïώτη γÏαμμή"
-#~ msgid "Compress"
-#~ msgstr "Συμπίεση"
-
#~ msgid "Add to Project (project.godot)"
#~ msgstr "ΠÏόσθεσε στο έÏγο (project.godot)"
@@ -10480,15 +10980,9 @@ msgstr ""
#~ msgid "Stereo"
#~ msgstr "ΣτεÏεοφωνικό"
-#~ msgid "Pitch"
-#~ msgstr "Τόνος"
-
#~ msgid "Window"
#~ msgstr "ΠαÏάθυÏο"
-#~ msgid "Move Right"
-#~ msgstr "Μετακίνηση δεξιά"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "Κλιμάκωση to %s%%."
@@ -10562,9 +11056,6 @@ msgstr ""
#~ msgid "just pressed"
#~ msgstr "μόλις πατήθηκε"
-#~ msgid "just released"
-#~ msgstr "μόλις απελευθεÏώθηκε"
-
#~ msgid ""
#~ "Couldn't read the certificate file. Are the path and password both "
#~ "correct?"
diff --git a/editor/translations/es.po b/editor/translations/es.po
index efc8ae334d..0d24aab9f6 100644
--- a/editor/translations/es.po
+++ b/editor/translations/es.po
@@ -1,6 +1,6 @@
# Spanish translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# Addiel Lucena Perez <addiell2017@gmail.com>, 2017.
# Aleix Sanchis <aleixsanchis@hotmail.com>, 2017, 2018.
@@ -31,12 +31,18 @@
# Yovani Damián <blackblex@gmail.com>, 2018.
# Andrus Diaz German <andrusdiazaleman@gmail.com>, 2018.
# Franklin David Macias Avellan <franklin.macias864@gmail.com>, 2018.
+# Dianiel García <jdangarr@gmail.com>, 2018.
+# ayahuasca1979 <ayahuasca1979@gmail.com>, 2018.
+# Elena G <elena.guzbla@gmail.com>, 2018.
+# willy zegarra <willyzegarra58@gmail.com>, 2018.
+# emma peel <emma.peel@riseup.net>, 2018.
+# Vicente Juárez <vijuarez@uc.cl>, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2018-08-07 18:44+0000\n"
-"Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n"
+"PO-Revision-Date: 2019-01-13 15:07+0000\n"
+"Last-Translator: Vicente Juárez <vijuarez@uc.cl>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/"
"godot/es/>\n"
"Language: es\n"
@@ -44,17 +50,15 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.2-dev\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr ""
-"El argumento para convert() no es correcto, prueba utilizando constantes "
-"TYPE_*."
+msgstr "El argumento para convert() no es correcto, utiliza constantes TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
@@ -63,34 +67,32 @@ msgstr ""
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Entrada inválida %i (no pasado) en expresión"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
msgstr ""
+"self no puede ser usado ya que la instancia es nula (no ha sido pasada)"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "Ãndice inválido de nombre de propiedad '%s' en el nodo %s."
+msgstr "Operandos inválidos para el operador %s, %s y %s."
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid index of type %s for base type %s"
-msgstr "Ãndice inválido de nombre de propiedad '%s' en el nodo %s."
+msgstr "Indice inválido de tipo %s para tipo base %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "Indice de nombre invalido '%s' para el tipo base %s"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid arguments to construct '%s'"
-msgstr ": Argumento incorrecto de tipo: "
+msgstr "Argumentos inválidos para construir '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "En llamada a '%s':"
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -99,27 +101,23 @@ msgstr "Libre"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "Balanceado"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Mirror"
-msgstr "Voltear horizontalmente"
+msgstr "Espejo"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "Insertar clave"
+msgstr "Insertar Clave Aquí"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "Duplicar selección"
+msgstr "Duplicar Clave(s) Seleccionada(s)"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "Quitar seleccionados"
+msgstr "Eliminar Clave(s) Seleccionada(s)"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -150,46 +148,40 @@ msgid "Anim Change Call"
msgstr "Cambiar llamada de animación"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Property Track"
-msgstr "Propiedad:"
+msgstr "Pista de Propiedades"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "3D Transform Track"
-msgstr "Tipo de transformación"
+msgstr "Pista de Transformación 3D"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "Pista de Llamada a Métodos"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "Pista de Curva Bezier"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "Pista de Reproducción de Audio"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Playback Track"
-msgstr "Detener la reproducción de la animación. (S)"
+msgstr "Pista de Reproducción de Animación"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
-msgstr "Añadir pista de animación"
+msgstr "Agregar Pista"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Length Time (seconds)"
-msgstr "Duración de la animación (en segundos)."
+msgstr "Tiempo de Duración de la Animación (segundos)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "Zoom de animación."
+msgstr "Loop de Animación"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -197,42 +189,36 @@ msgid "Functions:"
msgstr "Funciones:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Audio Clips:"
-msgstr "Oyente de audio"
+msgstr "Clips de Audio:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Clips:"
-msgstr "Clips"
+msgstr "Clips de Anim:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Toggle this track on/off."
-msgstr "Act/desact. modo sin distracciones."
+msgstr "Act./Desact. esta pista."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "Modo de Actualización (Como esta configurada esta propiedad)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Interpolation Mode"
-msgstr "Nodo de animación"
+msgstr "Modo de Interpolación"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "Modo Loop Envolvente (Interpolar el final con el comienzo al loopear)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "Remover la pista seleccionada."
+msgstr "Quitar esta pista."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "Tiempo de Crossfade (s):"
+msgstr "Tiempo (s): "
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -247,13 +233,12 @@ msgid "Trigger"
msgstr "Trigger"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Capture"
-msgstr "Características"
+msgstr "Captura"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "Más Cercano"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
@@ -262,16 +247,15 @@ msgstr "Lineal"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr ""
+msgstr "Cúbica"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clamp Loop Interp"
-msgstr "Cambiar Interpolación de Loop de Anim"
+msgstr "Interp de Loop Cortante"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "Interp de Loop Envolvente"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -279,14 +263,12 @@ msgid "Insert Key"
msgstr "Insertar clave"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "Duplicar nodo(s)"
+msgstr "Duplicar Clave(s)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "Eliminar nodo(s)"
+msgstr "Eliminar Clave(s)"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -304,7 +286,6 @@ msgstr "¿Crear %d nuevas pistas e insertar claves?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -316,11 +297,11 @@ msgstr "Insertar animación"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
-msgstr ""
+msgstr "Un AnimationPlayer no puede animarse a sí mismo, solo a otros players."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
-msgstr "Crear e insertar animación"
+msgstr "Crear e Insertar Animación"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Track & Key"
@@ -332,7 +313,7 @@ msgstr "Insertar clave de animación"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr ""
+msgstr "Las pistas Transform solo aplican a nodos de tipo Spatial."
#: editor/animation_track_editor.cpp
msgid ""
@@ -341,44 +322,51 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"Las pistas de audio pueden apuntar solo a nodos de tipo:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "Las pistas de Animación solo pueden apuntar a nodos AnimationPlayer."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
msgstr ""
+"Un reproductor de animación no puede animarse a sí mismo, solo a otros "
+"reproductores."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "No es posible agregar una nueva pista sin una raíz"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
msgstr ""
+"La ruta de la pista es inválida, por lo tanto no se pueden agregar claves."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "La pista no es de tipo Spatial, no se puede insertar la clave"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
msgstr ""
+"La ruta de la pista es inválida, por ende no se pueden agregar claves de "
+"métodos."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Method not found in object: "
-msgstr "VariableGet no encontrado en el script: "
+msgstr "Método no encontrado en el objeto: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
-msgstr "Mover claves de animación"
+msgstr "Mover Claves de Anim"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clipboard is empty"
-msgstr "¡El portapapeles está vacío!"
+msgstr "El portapapeles está vacío"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
@@ -388,24 +376,24 @@ msgstr "Escalar claves de animación"
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
msgstr ""
+"Esta opción no funciona con la edición Bezier, ya que es solo una pista "
+"única."
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "Mostrar solo las pistas de los nodos seleccionados en el árbol."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr ""
+msgstr "Agrupar las pistas por nodo o mostrarlas como una lista plana."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap (s): "
-msgstr "Fijar (Pixeles):"
+msgstr "Snap (s): "
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "El árbol de animación es correcto."
+msgstr "Valor de step de animación."
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -417,19 +405,16 @@ msgid "Edit"
msgstr "Editar"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "Ãrbol de animación"
+msgstr "Propiedades de animación."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "Copiar parámetros"
+msgstr "Copiar Pistas"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "Pegar parámetros"
+msgstr "Pegar Pistas"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -439,8 +424,7 @@ msgstr "Escalar selección"
msgid "Scale From Cursor"
msgstr "Escalar desde cursor"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Duplicar selección"
@@ -449,16 +433,15 @@ msgid "Duplicate Transposed"
msgstr "Duplicar transpuesto"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
-msgstr "Quitar seleccionados"
+msgstr "Eliminar selección"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
-msgstr "Ir al siguiente paso"
+msgid "Go to Next Step"
+msgstr "Ir al paso siguiente"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+msgid "Go to Previous Step"
msgstr "Ir al paso anterior"
#: editor/animation_track_editor.cpp
@@ -471,11 +454,11 @@ msgstr "Limpiar animación"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "Elegí el nodo que será animado:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "Usar Curvas Bezier"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
@@ -523,7 +506,7 @@ msgstr "Relación de escala:"
#: editor/animation_track_editor.cpp
msgid "Select tracks to copy:"
-msgstr ""
+msgstr "Elegir pistas a copiar:"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -561,11 +544,11 @@ msgstr "Sin coincidencias"
msgid "Replaced %d occurrence(s)."
msgstr "%d ocurrencia(s) reemplazada(s)."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Coincidir mayús/minúsculas"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "Palabras completas"
@@ -581,29 +564,31 @@ msgstr "Reemplazar todo"
msgid "Selection Only"
msgstr "Sólo selección"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Acercar"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "Alejar"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "Restablecer zoom"
#: editor/code_editor.cpp
-#, fuzzy
msgid "Warnings:"
-msgstr "Advertencias"
+msgstr "Advertencias:"
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "Zoom (%):"
+msgid "Font Size:"
+msgstr "Tamaño de la tipografía:"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Línea:"
@@ -636,6 +621,7 @@ msgstr "Añadir"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -692,9 +678,8 @@ msgid "Disconnect '%s' from '%s'"
msgstr "Desconectar '%s' de '%s'"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect all from signal: '%s'"
-msgstr "Desconectar '%s' de '%s'"
+msgstr "Desconectar todos de la señal: '%s'"
#: editor/connections_dialog.cpp
msgid "Connect..."
@@ -706,19 +691,16 @@ msgid "Disconnect"
msgstr "Desconectar"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect Signal: "
-msgstr "Conectando señal:"
+msgstr "Conectar Señal: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection: "
-msgstr "Editar conexiones"
+msgstr "Editar Conexión: "
#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "Are you sure you want to remove all connections from the \""
-msgstr "¿Seguro que quieres ejecutar más de un proyecto?"
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr "¿Está seguro/a que quiere quitar todas las conexiones de esta señal?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -726,22 +708,19 @@ msgstr "Señales"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr ""
+msgstr "¿Estás seguro/a que quieres quitar todas las conexiones de esta señal?"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "Desconectar"
+msgstr "Desconectar Todo"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit..."
-msgstr "Editar"
+msgstr "Editar..."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "Métodos"
+msgstr "Ir Al Método"
#: editor/create_dialog.cpp
msgid "Change %s Type"
@@ -766,23 +745,20 @@ msgid "Recent:"
msgstr "Recientes:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Buscar:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "Coincidencias:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "Descripción:"
@@ -821,8 +797,7 @@ msgid "Resource"
msgstr "Recursos"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "Ruta"
@@ -843,9 +818,10 @@ msgid "Search Replacement Resource:"
msgstr "Buscar recurso de reemplazo:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -878,8 +854,8 @@ msgid "Error loading:"
msgstr "Error al cargar:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
-msgstr "La escena no se pudo cargar porque faltan las siguientes dependencias:"
+msgid "Load failed due to missing dependencies:"
+msgstr "Fallo la carga debido a dependencias faltantes:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -937,14 +913,6 @@ msgstr "Cambiar valor del diccionario"
msgid "Thanks from the Godot community!"
msgstr "¡Muchas gracias de parte de la comunidad de Godot!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "Aceptar"
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Contribuidores de Godot"
@@ -1038,7 +1006,8 @@ msgid "Uncompressing Assets"
msgstr "Descomprimiendo assets"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+#, fuzzy
+msgid "Package installed successfully!"
msgstr "¡Paquete instalado exitosamente!"
#: editor/editor_asset_installer.cpp
@@ -1120,8 +1089,7 @@ msgid "Bus options"
msgstr "Opciones del bus"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "Duplicar"
@@ -1286,7 +1254,7 @@ msgid "Add AutoLoad"
msgstr "Añadir AutoLoad"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "Ruta:"
@@ -1294,8 +1262,8 @@ msgstr "Ruta:"
msgid "Node Name:"
msgstr "Nombre del nodo:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "Nombre"
@@ -1365,26 +1333,29 @@ msgid "Template file not found:"
msgstr "Archivo de plantilla no encontrado:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Seleccionar carpeta actual"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "El archivo ya existe ¿Quieres sobreescribirlo?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "Seleccionar carpeta actual"
+msgid "Select This Folder"
+msgstr "Seleccionar esta carpeta"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
msgstr "Copiar ruta"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Open In File Manager"
-msgstr "Mostrar en el navegador de archivos"
+msgid "Open in File Manager"
+msgstr "Abrir en el Explorador de Archivos"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
-msgstr "Mostrar en el navegador de archivos"
+msgid "Show in File Manager"
+msgstr "Mostrar en Explorador de Archivos"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
@@ -1419,7 +1390,8 @@ msgid "Open a File or Directory"
msgstr "Abrir un archivo o directorio"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Guardar"
@@ -1477,8 +1449,7 @@ msgstr "Directorios y archivos:"
msgid "Preview:"
msgstr "Vista previa:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "Archivo:"
@@ -1494,24 +1465,11 @@ msgstr "Analizando fuentes"
msgid "(Re)Importing Assets"
msgstr "(Re)Importando assets"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "Ayuda de búsqueda"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "Lista de clases:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "Buscar clases"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "Cima"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "Clase:"
@@ -1528,28 +1486,28 @@ msgid "Brief Description:"
msgstr "Descripción breve:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "Miembros"
+msgid "Properties"
+msgstr "Propiedades"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "Miembros:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr "Propiedades:"
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "Métodos públicos"
+msgid "Methods"
+msgstr "Métodos"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "Métodos públicos:"
+msgid "Methods:"
+msgstr "Métodos:"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "Elementos del tema de interfaz"
+msgid "Theme Properties"
+msgstr "Propiedades del Tema"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "Elementos del tema de interfaz:"
+msgid "Theme Properties:"
+msgstr "Propiedades del Tema:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1576,8 +1534,12 @@ msgid "Constants:"
msgstr "Constantes:"
#: editor/editor_help.cpp
-msgid "Description"
-msgstr "Descripción"
+msgid "Class Description"
+msgstr "Descripción de Clase"
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
+msgstr "Descripción de la Clase:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1594,11 +1556,11 @@ msgstr ""
"$color][url=$url2]."
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "Propiedades"
+msgid "Property Descriptions"
+msgstr "Descripción de la propiedad"
#: editor/editor_help.cpp
-msgid "Property Description:"
+msgid "Property Descriptions:"
msgstr "Descripción de la propiedad:"
#: editor/editor_help.cpp
@@ -1610,12 +1572,12 @@ msgstr ""
"[color=$color][url=$url]aportando una[/url][/color]!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "Métodos"
+msgid "Method Descriptions"
+msgstr "Descripción de Método"
#: editor/editor_help.cpp
-msgid "Method Description:"
-msgstr "Descripción del método:"
+msgid "Method Descriptions:"
+msgstr "Descripciones del método:"
#: editor/editor_help.cpp
msgid ""
@@ -1625,18 +1587,58 @@ msgstr ""
"Actualmente no hay una descripción para este método. Por favor, ¡ayúdanos "
"[color=$color][url=$url]aportando una[/url][/color]!"
-#: editor/editor_inspector.cpp
-#, fuzzy
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Ayuda de búsqueda"
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr "Mostrar todos"
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr "Solo clases"
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr "Solo métodos"
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr "Solo señales"
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr "Solo Constantes"
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr "Solo Propiedades"
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr "Solo Propiedades del Tema"
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr "Tipo de Miembro"
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr "Clase"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
msgstr "Propiedad:"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr "Establecer"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "Asignar Múltiples:"
#: editor/editor_log.cpp
msgid "Output:"
@@ -1664,6 +1666,11 @@ msgstr "La exportación del proyecto falló con el código de error %d."
msgid "Error saving resource!"
msgstr "¡Error al guardar el recurso!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "Aceptar"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "Guardar recurso como..."
@@ -1683,6 +1690,7 @@ msgstr "Error al guardar."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
msgstr ""
+"No se puede abrir '%s'. El archivo puede haber sido movido o eliminado."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
@@ -1718,12 +1726,25 @@ msgstr "Esta operación no puede realizarse sin una escena raíz."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+"Esta escena no puede ser guardada porque hay una inclusión cíclica de "
+"instanciado.\n"
+"Por favor resuélvela y prueba de nuevo."
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
"No se pudo guardar la escena. Las dependencias (instancias o herencia) no se "
"pudieron resolver."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr "¡No se puede sobreescribir una escena que está abierta!"
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr "¡No se puede cargar MeshLibrary para poder unir los datos!"
@@ -1987,6 +2008,14 @@ msgstr "No se pudo cargar el script addon desde la ruta: '%s'."
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"No se puede cargar el script de addon desde la ruta: '%s' Parece que hay un "
+"error en el código, por favor compruebe la sintaxis."
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
"No se pudo cargar el script addon desde la ruta: '%s' El tipo de base no es "
@@ -2037,15 +2066,18 @@ msgstr "Borrar ajustes"
msgid "Default"
msgstr "Predeterminado"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr "Mostrar en Sistema de Archivos"
+
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play This Scene"
-msgstr "Reproducir escena"
+msgstr "Reproducir esta escena"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "Cerrar las demás pestañas"
+msgstr "Cerrar pestaña"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2120,8 +2152,8 @@ msgid "Save Scene"
msgstr "Guardar escena"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
-msgstr "Guardar todas las escenas"
+msgid "Save All Scenes"
+msgstr "Guardar Todas las Escenas"
#: editor/editor_node.cpp
msgid "Close Scene"
@@ -2149,7 +2181,7 @@ msgid "Undo"
msgstr "Deshacer"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Rehacer"
@@ -2173,20 +2205,20 @@ msgstr "Ajustes del proyecto"
msgid "Export"
msgstr "Exportar"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "Herramientas"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "¿Abrir el administrador de proyectos?"
+msgstr "Abrir carpeta de datos del proyecto"
#: editor/editor_node.cpp
msgid "Quit to Project List"
msgstr "Salir al listado de proyectos"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "Depurar"
@@ -2294,18 +2326,16 @@ msgid "Toggle Fullscreen"
msgstr "Act/desact. pantalla completa"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Data/Settings Folder"
-msgstr "Ajustes del Editor"
+msgstr "Abrir carpeta de datos/configuración del Editor"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "Abrir Carpeta de Datos del Editor"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Settings Folder"
-msgstr "Ajustes del Editor"
+msgstr "Abrir carpeta de configuración del Editor"
#: editor/editor_node.cpp editor/project_export.cpp
msgid "Manage Export Templates"
@@ -2315,10 +2345,6 @@ msgstr "Cargar plantillas de exportación"
msgid "Help"
msgstr "Ayuda"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "Clases"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2389,13 +2415,12 @@ msgstr "Reproducir escena personalizada"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr ""
+msgstr "Cambiar el driver de video requiere reiniciar el editor."
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Save & Restart"
-msgstr "Guardar y reimportar"
+msgstr "Guardar y Reiniciar"
#: editor/editor_node.cpp
msgid "Spins when the editor window repaints!"
@@ -2413,27 +2438,26 @@ msgstr "Actualizar cambios"
msgid "Disable Update Spinner"
msgstr "Desactivar indicador de actividad"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "Inspector"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "Importar"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "Nodos"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "Sistema de archivos"
#: editor/editor_node.cpp
-#, fuzzy
+msgid "Inspector"
+msgstr "Inspector"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Nodos"
+
+#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
-msgstr "Expandir todo"
+msgstr "Expandir panel inferior"
#: editor/editor_node.cpp scene/resources/visual_shader.cpp
msgid "Output"
@@ -2512,9 +2536,8 @@ msgid "Thumbnail..."
msgstr "Miniatura..."
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit Plugin"
-msgstr "Editar polígono"
+msgstr "Editar Plugin"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
@@ -2538,15 +2561,13 @@ msgid "Status:"
msgstr "Estado:"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit:"
-msgstr "Editar"
+msgstr "Editar:"
#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Start"
-msgstr "¡Iniciar!"
+msgstr "Iniciar"
#: editor/editor_profiler.cpp
msgid "Measure:"
@@ -2568,7 +2589,7 @@ msgstr "% de cuadro"
msgid "Physics Frame %"
msgstr "% de cuadro físico"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "Tiempo:"
@@ -2592,34 +2613,67 @@ msgstr "Tiempo"
msgid "Calls"
msgstr "Llamadas"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr "Activado"
#: editor/editor_properties.cpp
msgid "Layer"
-msgstr ""
+msgstr "Capa"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Bit %d, value %d"
-msgstr "Bit %d, valor %d."
+msgstr "Bit %d, valor %d"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr "[Vacío]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
#, fuzzy
-msgid "Assign.."
-msgstr "Asignar"
+msgid "Assign..."
+msgstr "Asignar..."
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "Ruta inválida"
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+"El recurso seleccionado (%s) no concuerda con el tipo esperado para esta "
+"propiedad (%s)."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+"No se puede crear un ViewportTexture en un recurso guardado como un "
+"archivo.\n"
+"El recurso necesita pertenecer a una escena."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+"No se puede crear una ViewportTexture en este recurso porque no esta "
+"asignado como local a la escena.\n"
+"Por favor activa la propiedad 'local a escena' en él (y en todos los "
+"recursos que lo contienen hasta un nodo)."
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr "Selecciona un viewport"
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr "Nuevo script"
@@ -2631,10 +2685,6 @@ msgstr "Nuevo %s"
msgid "Make Unique"
msgstr "Hacer único"
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr "Mostrar en el sistema de archivos"
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2643,7 +2693,8 @@ msgstr "Mostrar en el sistema de archivos"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "Pegar"
@@ -2656,36 +2707,32 @@ msgstr "Convertir a %s"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Open Editor"
-msgstr "Abrir en el editor"
+msgstr "Abrir Editor"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Selected node is not a Viewport!"
msgstr "¡El nodo seleccionado no es un Viewport!"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "Size: "
-msgstr "Tamaño de celda:"
+msgstr "Tamaño: "
#: editor/editor_properties_array_dict.cpp
msgid "Page: "
-msgstr ""
+msgstr "Página: "
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Key:"
-msgstr "Nuevo nombre:"
+msgstr "Nueva Clave:"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Value:"
-msgstr "Nuevo nombre:"
+msgstr "Nuevo Valor:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
-msgstr ""
+msgstr "Agregar Par Clave/Valor"
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -2779,9 +2826,8 @@ msgid "Can't open export templates zip."
msgstr "No se puede abir el zip de plantillas de exportación."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Invalid version.txt format inside templates: %s."
-msgstr "Formato de \"version.txt\" inválido dentro de las plantillas."
+msgstr "Formato de version.txt inválido dentro de plantillas: %s."
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
@@ -2846,6 +2892,8 @@ msgid ""
"Templates installation failed. The problematic templates archives can be "
"found at '%s'."
msgstr ""
+"Fallo la instalación de plantillas. Las plantillas problemáticas pueden ser "
+"encontradas en '%s'."
#: editor/export_template_manager.cpp
msgid "Error requesting url: "
@@ -2926,9 +2974,9 @@ msgid "Download Templates"
msgstr "Descargar plantillas"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr "Seleccionar mirror de la lista: "
+msgstr ""
+"Seleccionar un mirror de la lista: (Shift + Clic: Abrir en el Navegador)"
#: editor/file_type_cache.cpp
msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
@@ -2937,20 +2985,22 @@ msgstr ""
"de tipos de archivo!"
#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr "Favoritos"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
"¡No se puede navegar a '%s' ya que no se ha encontrado en el sistema de "
"archivos!"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a grid of thumbnails."
-msgstr "Ver elementos como una cuadrícula de miniaturas"
+msgstr "Ver ítems como una cuadrícula de miniaturas."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a list."
-msgstr "Ver elementos como una lista"
+msgstr "Ver ítems como una lista."
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
@@ -2978,19 +3028,15 @@ msgstr "Error al duplicar:"
msgid "Unable to update dependencies:"
msgstr "No se han podido actualizar las dependencias:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "No se proporcionó un nombre"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "Nombre no proporcionado."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "El nombre proporcionado contiene caracteres inválidos"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "Nombre no proporcionado."
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "El nombre contiene caracteres inválidos."
@@ -3015,22 +3061,6 @@ msgid "Duplicating folder:"
msgstr "Duplicando carpeta:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "Expandir todo"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "Colapsar todo"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "Renombrar..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "Mover a..."
-
-#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
msgstr "Abrir escena(s)"
@@ -3039,6 +3069,14 @@ msgid "Instance"
msgstr "Instanciar"
#: editor/filesystem_dock.cpp
+msgid "Add to favorites"
+msgstr "Agregar a favoritos"
+
+#: editor/filesystem_dock.cpp
+msgid "Remove from favorites"
+msgstr "Quitar de favoritos"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "Editar dependencias..."
@@ -3046,19 +3084,33 @@ msgstr "Editar dependencias..."
msgid "View Owners..."
msgstr "Ver propietarios..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "Renombrar..."
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "Duplicar..."
#: editor/filesystem_dock.cpp
-#, fuzzy
+msgid "Move To..."
+msgstr "Mover a..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
-msgstr "Nuevo script"
+msgstr "Nuevo Script..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "Guardar recurso como..."
+msgstr "Nuevo Recurso..."
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr "Expandir Todo"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr "Colapsar Todo"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3080,14 +3132,12 @@ msgid "Re-Scan Filesystem"
msgstr "Re-escanear sistema de archivos"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "Act/desact. estado de carpeta como favorito"
+msgid "Toggle split mode"
+msgstr "Act/Desact. Modo Partido"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Show current scene file."
-msgstr "Guardar el sub-tile editado actualmente."
+msgid "Search files"
+msgstr "Buscar archivos"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
@@ -3095,15 +3145,6 @@ msgstr ""
"Instanciar la(s) escena(s) seleccionadas como hijas del nodo seleccionado."
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "Buscar clases"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3111,51 +3152,37 @@ msgstr ""
"Escaneando archivos,\n"
"Por favor, espere..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "Mover"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "There is already file or folder with the same name in this location."
-msgstr "Ya hay una carpeta en esta ruta con ese nombre."
+msgstr "Ya hay un archivo o carpeta con el mismo nombre en esta ubicación."
#: editor/filesystem_dock.cpp
msgid "Overwrite"
-msgstr ""
+msgstr "Sobreescribir"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Crear script"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find in files"
-msgstr "Encontrar tile"
+msgid "Find in Files"
+msgstr "Buscar en Archivos"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find: "
-msgstr "Buscar"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Whole words"
-msgstr "Palabras completas"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "Coincidir mayús/minúsculas"
+msgid "Find:"
+msgstr "Buscar:"
#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "Carpeta:"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Filter: "
-msgstr "Filtro:"
+msgid "Filters:"
+msgstr "Filtros:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3171,52 +3198,48 @@ msgid "Cancel"
msgstr "Cancelar"
#: editor/find_in_files.cpp
-#, fuzzy
+msgid "Find: "
+msgstr "Buscar: "
+
+#: editor/find_in_files.cpp
msgid "Replace: "
-msgstr "Reemplazar"
+msgstr "Reemplazar: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace all (no undo)"
-msgstr "Reemplazar todo"
+msgstr "Reemplazar todo (no se puede deshacer)"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Searching..."
-msgstr "Guardando..."
+msgstr "Buscando..."
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Search complete"
-msgstr "Texto de búsqueda"
+msgstr "Búsqueda completa"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group name already exists."
-msgstr "ERROR: ¡El nombre de animación ya existe!"
+msgstr "El nombre del grupo ya existe."
#: editor/groups_editor.cpp
-#, fuzzy
-msgid "invalid Group name."
-msgstr "Nombre inválido."
+msgid "Invalid group name."
+msgstr "Nombre de grupo inválido."
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Grupos"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes not in Group"
-msgstr "Grupo(s) de Nodos"
+msgstr "Nodos fuera del Grupo"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
msgid "Filter nodes"
msgstr "Filtrar nodos"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes in Group"
-msgstr "Grupo(s) de Nodos"
+msgstr "Nodos dentro del Grupo"
#: editor/groups_editor.cpp
msgid "Add to Group"
@@ -3227,9 +3250,8 @@ msgid "Remove from Group"
msgstr "Quitar del grupo"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Manage Groups"
-msgstr "Grupos de imágenes"
+msgstr "Administrar Grupos"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Single Scene"
@@ -3337,18 +3359,13 @@ msgstr "Reimportar"
msgid "Failed to load resource."
msgstr "Error al cargar el recurso."
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "Aceptar"
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
-msgstr "Expandir todas las propiedades"
+msgid "Expand All Properties"
+msgstr "Expandir Todas las Propiedades"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
-msgstr "Ocultar todas las propiedades"
+msgid "Collapse All Properties"
+msgstr "Colapsar Todas las Propiedades"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -3364,9 +3381,8 @@ msgid "Paste Params"
msgstr "Pegar parámetros"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Edit Resource Clipboard"
-msgstr "¡El portapapeles de recursos está vacío!"
+msgstr "Editar Portapapeles de Recursos"
#: editor/inspector_dock.cpp
msgid "Copy Resource"
@@ -3393,6 +3409,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "Cargar un recurso existente desde disco y editarlo."
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "Guardar el recurso editado actualmente."
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "Ir al objeto editado previo en el historial."
@@ -3409,9 +3429,8 @@ msgid "Object properties."
msgstr "Propiedades del objeto."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Filter properties"
-msgstr "Filtrar nodos"
+msgstr "Filtrar propiedades"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
@@ -3426,82 +3445,74 @@ msgid "Select a Node to edit Signals and Groups."
msgstr "Selecciona un nodo para editar señales y grupos."
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Edit a Plugin"
-msgstr "Editar polígono"
+msgstr "Editar Plugin"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Create a Plugin"
-msgstr "Crear solución C#"
+msgstr "Crear un Plugin"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Plugin Name:"
-msgstr "Lista de Plugins:"
+msgstr "Nombre del Plugin:"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
-msgstr ""
+msgstr "Subcarpeta:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Language:"
-msgstr "Lenguaje"
+msgstr "Lenguaje:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Script Name:"
-msgstr "Script válido"
+msgstr "Nombre del Script:"
#: editor/plugin_config_dialog.cpp
msgid "Activate now?"
-msgstr ""
+msgstr "¿Activar ahora?"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
msgstr "Crear polígono"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
-msgstr "Editar polígono"
+msgid "Edit Polygon"
+msgstr "Editar Polígono"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
msgstr "Insertar punto"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
-msgstr "Editar polígono (quitar punto)"
+msgid "Edit Polygon (Remove Point)"
+msgstr "Editar Polígono (Remover Punto)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
-msgstr "Quitar polígono y punto"
+msgid "Remove Polygon And Point"
+msgstr "Remover Polígono y Punto"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "Crear un nuevo polígono desde cero"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr "Crear puntos."
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
-"Editar polígono existente:\n"
-"Clic izquierdo: Mover punto.\n"
-"Control + Clic izquierdo: Dividir segmento.\n"
-"Clic derecho: Borrar punto."
+"Editar puntos.\n"
+"Clic izq: Mover Punto\n"
+"Clic der: Eliminar Punto"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
-msgstr "Eliminar puntos"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr "Borrar puntos."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3516,14 +3527,15 @@ msgstr "Añadir animación"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
-msgstr "Cargar"
+msgid "Load..."
+msgstr "Cargar..."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "This type of node can't be used. Only root nodes are allowed."
msgstr ""
+"Este tipo de nodo no puede ser usado. Solo los nodos raíz están permitidos."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3533,73 +3545,65 @@ msgid ""
"AnimationTree is inactive.\n"
"Activate to enable playback, check node warnings if activation fails."
msgstr ""
+"El AnimationTree esta inactivo.\n"
+"Actívalo para habilitar la reproducción, revisa las advertencias de nodo si "
+"la activación falla."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Set the blending position within the space"
-msgstr ""
+msgstr "Asignar la posición de blending dentro del espacio"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Select and move points, create points with RMB."
-msgstr ""
+msgstr "Seleccionar y mover puntos, crear puntos con clic derecho."
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Eliminar puntos"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "Clic derecho: Borrar punto."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr "Activar snap y mostrar cuadricula."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Point"
-msgstr "Mover punto"
+msgstr "Punto"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Open Animation Node"
-msgstr "Nodo de animación"
+msgstr "Abrir Nodo de Animación"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists"
-msgstr "¡La acción «%s» ya existe!"
+msgstr "El triángulo ya existe"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "BlendSpace2D does not belong to an AnimationTree node."
-msgstr ""
+msgstr "BlendSpace2D no pertenece a un nodo AnimationTree."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "No triangles exist, so no blending can take place."
-msgstr ""
+msgstr "No hay ningún triángulo, así que no se puede hacer blending."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create triangles by connecting points."
-msgstr ""
+msgstr "Crear triángulos conectando puntos."
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Erase points and triangles."
-msgstr "Leyendo %d triángulos:"
+msgstr "Borrar puntos y triángulos."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Generate blend triangles automatically (instead of manually)"
-msgstr ""
+msgstr "Generar triángulos de blending automáticamente (en vez de manualmente)"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr "Ajustar a cuadrícula"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Mezcla:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3608,20 +3612,26 @@ msgstr "Editar filtros"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Output node can't be added to the blend tree."
-msgstr ""
+msgstr "El nodo de salida no puede ser agregado al blend tree."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Unable to connect, port may be in use or connection may be invalid."
msgstr ""
+"No se pudo conectar, el puerto podría estar en uso o la conexión ser "
+"inválida."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
msgstr ""
+"No se asigno ningún reproductor de animación, así que no se pudieron obtener "
+"los nombres de las pistas."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Player path set is invalid, so unable to retrieve track names."
msgstr ""
+"La ruta de reproductor asignada es inválida, así que no se pudieron obtener "
+"los nombres de las pistas."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
@@ -3629,23 +3639,22 @@ msgid ""
"Animation player has no valid root node path, so unable to retrieve track "
"names."
msgstr ""
+"El reproductor de animación no tiene una ruta válida a un nodo raíz, así que "
+"no se pudieron obtener los nombres de las pistas."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Add Node.."
-msgstr "Añadir nodo"
+msgid "Add Node..."
+msgstr "Agregar Nodo..."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filtered Tracks:"
-msgstr "Editar filtros"
+msgstr "Editar pistas filtradas:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Enable filtering"
-msgstr "Hijos editables"
+msgstr "Habilitar filtrado"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
@@ -3673,14 +3682,12 @@ msgid "Remove Animation"
msgstr "Quitar animación"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Invalid animation name!"
-msgstr "ERROR: ¡El nombre de animación no es correcto!"
+msgstr "¡Nombre de animación inválido!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Animation name already exists!"
-msgstr "ERROR: ¡El nombre de animación ya existe!"
+msgstr "¡El nombre de animación ya existe!"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -3704,14 +3711,12 @@ msgid "Duplicate Animation"
msgstr "Duplicar animación"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to copy!"
-msgstr "ERROR: ¡No hay animaciones para copiar!"
+msgstr "¡No hay animaciones para copiar!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation resource on clipboard!"
-msgstr "ERROR: ¡No hay recursos de animación en el portapapeles!"
+msgstr "¡No hay recursos de animación en el portapapeles!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
@@ -3722,9 +3727,8 @@ msgid "Paste Animation"
msgstr "Pegar animación"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to edit!"
-msgstr "ERROR: ¡No hay animación que editar!"
+msgstr "¡No hay animación que editar!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
@@ -3770,14 +3774,12 @@ msgid "New"
msgstr "Nuevo"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Transitions..."
-msgstr "Editar Conecciones..."
+msgstr "Editar Transiciones..."
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Open in Inspector"
-msgstr "Abrir en el editor"
+msgstr "Abrir en el Inspector"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Display list of animations in player."
@@ -3836,9 +3838,8 @@ msgid "Include Gizmos (3D)"
msgstr "Incluir Gizmos (3D)"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Pin AnimationPlayer"
-msgstr "Pegar animación"
+msgstr "Pinear el AnimationPlayer"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Create New Animation"
@@ -3869,34 +3870,32 @@ msgid "Cross-Animation Blend Times"
msgstr "Cross-Animation Blend Times"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "End"
-msgstr "Finales"
+msgstr "Fin"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Immediate"
-msgstr ""
+msgstr "Inmediata"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Sync"
-msgstr ""
+msgstr "Sincronizar"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "At End"
-msgstr ""
+msgstr "Al Final"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Travel"
-msgstr ""
+msgstr "Viaje"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Start and end nodes are needed for a sub-transition."
-msgstr ""
+msgstr "El comienzo y fin de los nodos son necesarios para una sub-transición."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "No playback resource set at path: %s."
-msgstr "No está en la ruta de recursos."
+msgstr "Ningún recurso de reproducción asignado en la ruta: %s."
#: editor/plugins/animation_state_machine_editor.cpp
msgid ""
@@ -3904,34 +3903,36 @@ msgid ""
"RMB to add new nodes.\n"
"Shift+LMB to create connections."
msgstr ""
+"Seleccionar y mover nodos.\n"
+"Clic der. para agregar nuevos nodos.\n"
+"Shift + clic izq. para crear conexiones."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "Crear nuevo %s"
+msgstr "Crear nuevos nodos."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Connect nodes."
-msgstr "Conectar nodos"
+msgstr "Conectar nodos."
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
-msgstr "Remover la pista seleccionada."
+msgid "Remove selected node or transition."
+msgstr "Quitar el nodo o transición seleccionado/a"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
msgstr ""
+"Act./Desact. reproducción automática de esta animación al comenzar, "
+"reiniciar o hacer seek hasta el cero."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set the end animation. This is useful for sub-transitions."
-msgstr ""
+msgstr "Asignar la animación de fin. Esto es útil para sub-transiciones."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "Transición"
+msgstr "Transición: "
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3985,10 +3986,6 @@ msgid "Amount:"
msgstr "Cantidad:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "Mezcla:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "Mezcla 0:"
@@ -4129,14 +4126,12 @@ msgid "Asset Download Error:"
msgstr "Error en la descarga del asset:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading (%s / %s)..."
-msgstr "Descargando"
+msgstr "Descargando (%s / %s)..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading..."
-msgstr "Descargando"
+msgstr "Descargando..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Resolving..."
@@ -4163,14 +4158,12 @@ msgid "Download for this asset is already in progress!"
msgstr "¡Éste asset ya está descargándose!"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "First"
-msgstr "primero"
+msgstr "Primero"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Previous"
-msgstr "Pestaña anterior"
+msgstr "Anterior"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Next"
@@ -4178,7 +4171,7 @@ msgstr "Siguiente"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Last"
-msgstr ""
+msgstr "Último"
#: editor/plugins/asset_library_editor_plugin.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -4190,7 +4183,7 @@ msgstr "Todos"
msgid "Plugins"
msgstr "Plugins"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "Ordenar:"
@@ -4258,7 +4251,7 @@ msgstr "Vista previa"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Configure Snap"
-msgstr "Configurar ajuste"
+msgstr "Configurar Snap"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Grid Offset:"
@@ -4266,7 +4259,7 @@ msgstr "Desplazamiento de cuadrícula:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Grid Step:"
-msgstr "Paso de cuadrícula:"
+msgstr "Step de cuadrícula:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation Offset:"
@@ -4274,7 +4267,7 @@ msgstr "Desplazamiento de rotación:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation Step:"
-msgstr "Cantidad de rotaciones:"
+msgstr "Step de rotaciones:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move vertical guide"
@@ -4305,29 +4298,28 @@ msgid "Create new horizontal and vertical guides"
msgstr "Crear nuevas guías horizontales y verticales"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move pivot"
msgstr "Mover pivote"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Rotate CanvasItem"
-msgstr "Editar CanvasItem"
+msgstr "Rotar CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move anchor"
-msgstr "Mover acción"
+msgstr "Mover ancla"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Resize CanvasItem"
-msgstr "Editar CanvasItem"
+msgstr "Redimensionar CanvasItem"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr "Escalar CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move CanvasItem"
-msgstr "Editar CanvasItem"
+msgstr "Mover CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -4346,19 +4338,18 @@ msgid "Paste Pose"
msgstr "Pegar pose"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "Alejar"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom reset"
-msgstr "Restablecer zoom"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
+"Advertencia: El tamaño y posición de los hijos de un contenedor es "
+"determinado solo por su padre."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Acercar"
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
+msgstr "Resetear el Zoom"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
@@ -4391,6 +4382,10 @@ msgid "Rotate Mode"
msgstr "Modo rotación"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr "Modo de Escalado"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4409,39 +4404,37 @@ msgid "Pan Mode"
msgstr "Modo desplazamiento lateral"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle snapping."
-msgstr "Activar/desactivar fijado"
+msgstr "Act/Desact. alineado."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Snap"
-msgstr "Usar fijado"
+msgstr "Usar Snap"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snapping Options"
-msgstr "Opciones de fijado"
+msgstr "Opciones de Alineado"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to grid"
-msgstr "Ajustar a cuadrícula"
+msgstr "Alinear a la cuadrícula"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Rotation Snap"
-msgstr "Ajustar rotación"
+msgstr "Usar Snap de Rotación"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Configure Snap..."
-msgstr "Configurar ajuste..."
+msgstr "Configurar Snap..."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap Relative"
-msgstr "Fijado relativo"
+msgstr "Usar Snap Relativo"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Pixel Snap"
-msgstr "Ajustar a píxeles"
+msgstr "Usar Pixel Snap"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Smart snapping"
@@ -4449,28 +4442,27 @@ msgstr "Fijado inteligente"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to parent"
-msgstr "Ajustar al padre"
+msgstr "Alinear al Padre"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to node anchor"
-msgstr "Ajustar al anclaje del nodo"
+msgstr "Alinear al ancla de nodo"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to node sides"
-msgstr "Ajustar a los lados de los nodos"
+msgstr "Alinear a los lados del nodo"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to node center"
-msgstr "Ajustar al anclaje del nodo"
+msgstr "Alinear al centro del nodo"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to other nodes"
-msgstr "Ajustar a otros nodos"
+msgstr "Alinear a otros nodos"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to guides"
-msgstr "Ajustar a guías"
+msgstr "Alinear a guías"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -4491,6 +4483,10 @@ msgid "Restores the object's children's ability to be selected."
msgstr "Restaurar la habilidad de seleccionar los hijos de un objeto."
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr "Opciones de Esqueleto"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "Mostrar huesos"
@@ -4504,12 +4500,11 @@ msgstr "Reestrablecer cadena IK"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make Custom Bone(s) from Node(s)"
-msgstr ""
+msgstr "Crear Hueso(s) Personalizados a partir de Nodo(s)"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Custom Bones"
-msgstr "Reestablecer huesos"
+msgstr "Restablecer Huesos Personalizados"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -4542,6 +4537,10 @@ msgid "Show Viewport"
msgstr "Ver viewport"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr "Mostrar Grupo y Bloquear Iconos"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr "Centrar selección"
@@ -4554,9 +4553,8 @@ msgid "Layout"
msgstr "Disposición"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Insert keys."
-msgstr "Insertar claves"
+msgstr "Insertar claves."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
@@ -4572,11 +4570,11 @@ msgstr "Restablecer pose"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Multiply grid step by 2"
-msgstr "Multiplicar paso de cuadrícula por 2"
+msgstr "Multiplicar step de cuadrícula por 2"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Divide grid step by 2"
-msgstr "Dividir paso de cuadrícula por 2"
+msgstr "Dividir step de cuadrícula por 2"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Add %s"
@@ -4613,17 +4611,24 @@ msgstr ""
"Arrastrar y soltar + Alt : Cambiar tipo de nodo"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr "Crear Poly3D"
+msgid "Create Polygon3D"
+msgstr "Crear Polygon3D"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Editar polígono"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Editar polígono (quitar punto)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
msgstr "Establecer handle"
#: editor/plugins/cpu_particles_editor_plugin.cpp
-#, fuzzy
msgid "CPUParticles"
-msgstr "Partículas"
+msgstr "CPUParticles"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
@@ -4716,37 +4721,9 @@ msgid "Item List Editor"
msgstr "Editor de lista de elementos"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"No se ha encontrado el recurso OccluderPolygon2D en este nodo.\n"
-"¿Crear uno y asignarlo?"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr "Crear polígono oclusor"
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr "Crea un nuevo polígono desde cero."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "Editar polígono existente:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "Clic izquierdo: Mover punto."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr "Ctrl + LMB: Partir segmento."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "Clic derecho: Borrar punto."
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr "¡La malla está vacía!"
@@ -4984,13 +4961,13 @@ msgid "Populate"
msgstr "Rellenar"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr "Crear polígono de navegación"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr "Generando AABB"
+msgid "Generating Visibility Rect"
+msgstr "Generando Rect. de Visibilidad"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -5019,6 +4996,11 @@ msgstr "Borrar máscara de emisión"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr "Convertir a CPUParticles"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr "Partículas"
@@ -5088,13 +5070,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr "Se requiere un material procesador del tipo 'ParticlesMaterial'."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
-msgstr "Generar AABB"
+msgid "Generating AABB"
+msgstr "Generando AABB"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "Convertir a mayúsculas"
+msgid "Generate AABB"
+msgstr "Generar AABB"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5118,6 +5099,10 @@ msgid "Add Point to Curve"
msgstr "Añadir punto a curva"
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr "Partir Curva"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr "Mover Punto en Curva"
@@ -5145,6 +5130,10 @@ msgid "Click: Add Point"
msgstr "Clic: Añadir Punto"
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr "Clic Izquierdo: Partir Segmento (en curva)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr "Clic derecho: Eliminar punto"
@@ -5160,11 +5149,6 @@ msgstr "Añadir punto (en espacio vacío)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr "Dividir segmento (en curva)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "Eliminar punto"
@@ -5182,12 +5166,12 @@ msgstr "Opciones"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Angles"
-msgstr ""
+msgstr "Manejadores de Ãngulos de Espejo"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Lengths"
-msgstr ""
+msgstr "Manejadores de Tamaño de Espejo"
#: editor/plugins/path_editor_plugin.cpp
msgid "Curve Point #"
@@ -5221,65 +5205,78 @@ msgstr "Eliminar punto Out-Control"
msgid "Remove In-Control Point"
msgstr "Eliminar punto In-Control"
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Dividir segmento (en curva)"
+
#: editor/plugins/physical_bone_plugin.cpp
-#, fuzzy
msgid "Move joint"
-msgstr "Mover punto"
+msgstr "Mover unión"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
-msgstr ""
+msgstr "La propiedad esqueleto del Polygon2D no apunta a un nodo Skeleton2D"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Sync bones"
-msgstr "Mostrar huesos"
+msgid "Sync Bones"
+msgstr "Sincronizar Huesos"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+"Sin textura en este nodo.\n"
+"Asigna una textura para poder editar el UV."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr "Crear mapa UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon & UV"
-msgstr "Crear polígono"
+msgstr "Crear Polígono y UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "Crear nueva guía horizontal"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "¡La acción «%s» ya existe!"
+msgid "Remove Internal Vertex"
+msgstr "Eliminar punto In-Control"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Add Split"
-msgstr "Añadir punto"
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "¡Ruta incorrecta!"
+msgid "Add Custom Polygon"
+msgstr "Editar Polígono"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Quitar punto"
+msgid "Remove Custom Polygon"
+msgstr "Remover Polígono y Punto"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr "Transformar Mapa UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
-msgstr ""
+msgid "Transform Polygon"
+msgstr "Transformar Polígono"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
+msgstr "Pintar Peso de Huesos"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Open Polygon 2D UV editor."
+msgstr "Abrir editor UV de Polígonos 2D."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
@@ -5287,31 +5284,25 @@ msgstr "Editor UV de polígonos en 2D"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "UV"
-msgstr ""
+msgstr "UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "Editar polígono"
+msgid "Points"
+msgstr "Punto"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Splits"
-msgstr "Dividir ruta"
+msgid "Polygons"
+msgstr "Polígono->UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Bones"
-msgstr "Crear huesos"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Create Polygon"
-msgstr "Crear polígono"
+msgstr "Huesos"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
-msgstr "Mover punto"
+msgid "Move Points"
+msgstr "Mover Puntos"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
@@ -5338,25 +5329,26 @@ msgid "Scale Polygon"
msgstr "Escalar polígono"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "¡Selecciona un ítem primero!"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
-msgstr ""
+msgid "Paint weights with specified intensity."
+msgstr "Pintar pesos con la intensidad especificada."
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
-msgstr ""
+msgid "Unpaint weights with specified intensity."
+msgstr "Despintar pesos con la intensidad especificada."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Radius:"
-msgstr ""
+msgstr "Radio:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon->UV"
@@ -5371,47 +5363,45 @@ msgid "Clear UV"
msgstr "Limpiar UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Settings"
-msgstr "Ajustes del GridMap"
+msgstr "Ajustes de cuadrícula"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "Snap"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
-msgstr "Habilitar fijado"
+msgstr "Activar Snap"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Grid"
msgstr "Cuadrícula"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Configure Grid:"
-msgstr "Configurar ajuste"
+msgstr "Configurar cuadrícula:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset X:"
-msgstr "Desplazamiento de cuadrícula:"
+msgstr "Desplazamiento de cuadrícula en X:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset Y:"
-msgstr "Desplazamiento de cuadrícula:"
+msgstr "Desplazamiento de cuadrícula en Y:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step X:"
-msgstr "Paso de cuadrícula:"
+msgstr "Step de cuadrícula en X:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step Y:"
-msgstr "Paso de cuadrícula:"
+msgstr "Step de cuadrícula en Y:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Sync Bones to Polygon"
-msgstr "Escalar polígono"
+msgstr "Sincronizar Huesos con el Polígono"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "ERROR: Couldn't load resource!"
@@ -5439,22 +5429,22 @@ msgid "Paste Resource"
msgstr "Pegar recurso"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "Abrir en el editor"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr "Instancia:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr "Tipo:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Abrir en el editor"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr "Cargar recurso"
@@ -5465,12 +5455,11 @@ msgstr "Precargador de recursos"
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "AnimationTree has no path set to an AnimationPlayer"
-msgstr ""
+msgstr "El AnimationTree no tiene una ruta asignada a un AnimationPlayer"
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Path to AnimationPlayer is invalid"
-msgstr "El árbol de animación no es correcto."
+msgstr "La ruta al AnimationPlayer es inválida"
#: editor/plugins/script_editor_plugin.cpp
msgid "Clear Recent Files"
@@ -5481,56 +5470,62 @@ msgid "Close and save changes?"
msgstr "¿Cerrar y guardar cambios?"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error writing TextFile:"
-msgstr "Error al cargar la imagen:"
+msgstr "Error al escribir el TextFile:"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr "Error: no se pudo cargar el archivo."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error could not load file."
-msgstr "No se pudo cargar la imagen"
+msgstr "Error no se pudo cargar el archivo."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error saving file!"
-msgstr "¡Error al guardar el TileSet!"
+msgstr "¡Error guardando archivo!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr "Error al guardar el tema"
+msgid "Error while saving theme."
+msgstr "Error al guardar el tema."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
-msgstr "Error al guardar"
+msgid "Error Saving"
+msgstr "Error al Guardar"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr "Error al importar el tema"
+msgid "Error importing theme."
+msgstr "Error al importar el tema."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
-msgstr "Error al importar"
+msgid "Error Importing"
+msgstr "Error al Importar"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New TextFile..."
-msgstr "Nueva carpeta..."
+msgstr "Nuevo TextFile..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open File"
-msgstr "Abrir un archivo"
+msgstr "Abrir archivo"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Save File As..."
-msgstr "Guardar como..."
+msgstr "Guardar archivo como..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme"
msgstr "Importar tema"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Error al guardar el tema"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Error al guardar"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr "Guardar tema como..."
@@ -5540,7 +5535,7 @@ msgstr " Referencia de clase"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
-msgstr ""
+msgstr "Alternar la ordenación alfabética de la lista de métodos."
#: editor/plugins/script_editor_plugin.cpp
msgid "Sort"
@@ -5571,9 +5566,8 @@ msgid "File"
msgstr "Archivo"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "New TextFile"
-msgstr "Ver archivos"
+msgid "Open..."
+msgstr "Abrir..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5588,12 +5582,8 @@ msgid "Copy Script Path"
msgstr "Copiar ruta del script"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr "Mostrar en sistema de archivos"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
-msgstr "Previo en historial"
+msgid "History Previous"
+msgstr "Previo en Historial"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
@@ -5605,6 +5595,10 @@ msgid "Theme"
msgstr "Tema"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme..."
+msgstr "Importar Tema..."
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
msgstr "Recargar tema"
@@ -5613,10 +5607,6 @@ msgid "Save Theme"
msgstr "Guardar tema"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "Guardar tema como"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "Cerrar documentación"
@@ -5663,18 +5653,14 @@ msgid "Keep Debugger Open"
msgstr "Mantener el depurador abierto"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
-msgstr "Depurar en editor externo"
+msgid "Debug with External Editor"
+msgstr "Depurar con Editor Externo"
#: editor/plugins/script_editor_plugin.cpp
msgid "Open Godot online documentation"
msgstr "Abrir documentación online de Godot"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr "Buscar en la jerarquía de clases."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Buscar en la documentación de referencia."
@@ -5711,39 +5697,32 @@ msgid "Debugger"
msgstr "Depurador"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search results"
-msgstr "Ayuda de búsqueda"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "Buscar clases"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-"Los scripts integrados sólo se pueden editar cuando la escena a la que "
-"pertenecen está cargada"
+msgid "Search Results"
+msgstr "Resultados de la Búsqueda"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Line"
-msgstr "Línea:"
+msgstr "Línea"
#: editor/plugins/script_text_editor.cpp
msgid "(ignore)"
-msgstr ""
+msgstr "(ignorar)"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function"
+msgstr "Ir a Función"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr "Estándar"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr "Sólo se pueden arrastrar/soltar recursos del sistema de archivos."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Lookup Symbol"
-msgstr "Completar símbolo"
+msgstr "Buscar Símbolo"
#: editor/plugins/script_text_editor.cpp
msgid "Pick Color"
@@ -5767,11 +5746,7 @@ msgstr "Poner en mayúsculas"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Syntax Highlighter"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
+msgstr "Resaltador de sintaxis"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
@@ -5824,12 +5799,12 @@ msgid "Trim Trailing Whitespace"
msgstr "Borrar espacios sobrantes al final"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
-msgstr "Convertir Indentación a Espacios"
+msgid "Convert Indent to Spaces"
+msgstr "Convertir Indentación en Espacios"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
-msgstr "Convertir Indentación a Tabuladores"
+msgid "Convert Indent to Tabs"
+msgstr "Convertir Indentación en Tabulaciones"
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
@@ -5845,37 +5820,28 @@ msgid "Remove All Breakpoints"
msgstr "Borrar todos los Breakpoints"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr "Ir a siguiente Breakpoint"
+msgid "Go to Next Breakpoint"
+msgstr "Ir al Siguente Breakpoint"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr "Ir al Breakpoint anterior"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr "Convertir a mayúsculas"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr "Convertir a minúsculas"
+msgid "Go to Previous Breakpoint"
+msgstr "Ir al Breakpoint Anterior"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr "Buscar anterior"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Find in files..."
-msgstr "Filtrado de archivos..."
+msgid "Find in Files..."
+msgstr "Buscar en Archivos..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
-msgstr "Ir a función..."
+msgid "Go to Function..."
+msgstr "Ir a Función..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
-msgstr "Ir a línea..."
+msgid "Go to Line..."
+msgstr "Ir a Línea..."
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
@@ -5887,40 +5853,35 @@ msgstr "Shader"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "This skeleton has no bones, create some children Bone2D nodes."
-msgstr ""
+msgstr "Este esqueleto no tiene huesos, crea algunos nodos Bone2D hijos."
#: editor/plugins/skeleton_2d_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton2D"
-msgstr "Esqueleto..."
+msgstr "Skeleton2D"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Make Rest Pose (From Bones)"
-msgstr ""
+msgstr "Crear Pose de Descanso (De los Huesos)"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Set Bones to Rest Pose"
-msgstr ""
+msgstr "Establecer Huesos a la Pose de Descanso"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical bones"
-msgstr "Crear malla de navegación"
+msgstr "Crear huesos físicos"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton"
-msgstr "Esqueleto..."
+msgstr "Skeleton"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical skeleton"
-msgstr "Crear solución C#"
+msgstr "Crear esqueleto físico"
#: editor/plugins/skeleton_ik_editor_plugin.cpp
-#, fuzzy
msgid "Play IK"
-msgstr "Reproducir"
+msgstr "Reproducir IK"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Orthogonal"
@@ -5971,6 +5932,14 @@ msgid "Animation Key Inserted."
msgstr "Clave de animación insertada."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr "Altura"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr "Yaw"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr "Objetos dibujados"
@@ -6055,9 +6024,8 @@ msgid "This operation requires a single selected node."
msgstr "Esta operación requiere un solo nodo seleccionado."
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Lock View Rotation"
-msgstr "Ver información"
+msgstr "Bloquear rotación de vista"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Normal"
@@ -6104,9 +6072,8 @@ msgid "Doppler Enable"
msgstr "Activar Doppler"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Cinematic Preview"
-msgstr "Creación de vistas previas de malla"
+msgstr "Vista previa cinemática"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
@@ -6137,6 +6104,10 @@ msgid "Freelook Speed Modifier"
msgstr "Modificador de velocidad de vista libre"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "Bloquear Rotación de Vista"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "Diálogo XForm"
@@ -6176,7 +6147,7 @@ msgstr "Modo de espacio local (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Mode (%s)"
-msgstr "Modo de ajuste (%s)"
+msgstr "Modo de Snap (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
@@ -6239,11 +6210,6 @@ msgid "Tool Scale"
msgstr "Escalar"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap To Floor"
-msgstr "Ajustar a cuadrícula"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Act/desact. Vista Libre"
@@ -6253,7 +6219,7 @@ msgstr "Transformar"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap object to floor"
-msgstr ""
+msgstr "Ajustar objeto al suelo"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Dialog..."
@@ -6284,9 +6250,8 @@ msgid "4 Viewports"
msgstr "4 viewports"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Gizmos"
-msgstr "Ver gizmos"
+msgstr "Gizmos"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Origin"
@@ -6303,19 +6268,19 @@ msgstr "Ajustes"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Settings"
-msgstr "Configuración de fijado"
+msgstr "Ajustes de Snap"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Translate Snap:"
-msgstr "Ajuste de desplazamiento:"
+msgstr "Snap de Traslación:"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Snap (deg.):"
-msgstr "Ajuste de rotación (grados):"
+msgstr "Snap de Rotación (grados):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Snap (%):"
-msgstr "Ajuste de escala (%):"
+msgstr "Snap de Escala (%):"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Viewport Settings"
@@ -6361,52 +6326,49 @@ msgstr "Previa"
msgid "Post"
msgstr "Posterior"
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite is empty!"
-msgstr "La ruta de guardado esta vacía!"
+msgstr "¡El sprite esta vacío!"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Can't convert a sprite using animation frames to mesh."
-msgstr ""
+msgstr "No se puede convertir a mesh un sprite que usa frames de animación."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't replace by mesh."
-msgstr ""
+msgstr "Geometría inválida, no se puede reemplazar por mesh."
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite"
-msgstr "SpriteFrames"
+msgstr "Sprite"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to 2D Mesh"
-msgstr "Convertir a %s"
+msgstr "Convertir a Mesh 2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create 2D Mesh"
-msgstr "Crear contorno de malla"
+msgstr "Crear Mesh 2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Simplification: "
-msgstr ""
+msgstr "Simplificación: "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Grow (Pixels): "
-msgstr "Fijar (Pixeles):"
+msgstr "Crecer (Pixeles): "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Update Preview"
-msgstr "Vista previa del atlas"
+msgstr "Actualizar vista previa"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Settings:"
-msgstr "Ajustes"
+msgstr "Ajustes:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
@@ -6481,20 +6443,25 @@ msgid "Set Region Rect"
msgstr "Establecer rectángulo de región"
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr "Asignar Margen"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
-msgstr "Modo de fijado:"
+msgstr "Modo Snap:"
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
-msgstr "<Ninguno>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
+msgstr "Ninguno"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Pixel Snap"
-msgstr "Ajustar a píxeles"
+msgstr "Pixel Snap"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Grid Snap"
-msgstr "Ajustar a cuadrícula"
+msgstr "Snap de cuadrícula"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Auto Slice"
@@ -6510,10 +6477,9 @@ msgstr "Paso:"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Sep.:"
-msgstr ""
+msgstr "Sep.:"
#: editor/plugins/texture_region_editor_plugin.cpp
-#, fuzzy
msgid "TextureRegion"
msgstr "Región de textura"
@@ -6646,9 +6612,12 @@ msgid "Erase Selection"
msgstr "Borrar selección"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Fix Invalid Tiles"
-msgstr "Nombre inválido."
+msgstr "Corregir Tiles inválidos"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Cut Selection"
+msgstr "Cortar Selección"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
@@ -6671,9 +6640,8 @@ msgid "Erase TileMap"
msgstr "Borrar TileMap"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Find Tile"
-msgstr "Encontrar tile"
+msgstr "Encontrar Tile"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Transpose"
@@ -6696,35 +6664,36 @@ msgid "Pick Tile"
msgstr "Elegir tile"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
-msgid "Move Selection"
-msgstr "Quitar selección"
+msgid "Copy Selection"
+msgstr "Copiar Selección"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr "Rotar 0 grados"
+msgid "Rotate left"
+msgstr "Rotar a la izquierda"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr "Rotar 90 grados"
+msgid "Rotate right"
+msgstr "Rotar a la derecha"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
-msgstr "Rotar 180 grados"
+msgid "Flip horizontally"
+msgstr "Voltear horizontalmente"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
-msgstr "Rotar 270 grados"
+msgid "Flip vertically"
+msgstr "Voltear verticalmente"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Clear transform"
+msgstr "Reestablecer transform"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Add Texture(s) to TileSet"
-msgstr "Añadir nodo(s) desde árbol"
+msgid "Add Texture(s) to TileSet."
+msgstr "Agregar Textura(s) al TileSet."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Remove current Texture from TileSet"
-msgstr "Borrar entrada actual"
+msgid "Remove selected Texture from TileSet."
+msgstr "Quitar Textura seleccionada del TileSet."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -6735,104 +6704,224 @@ msgid "Merge from Scene"
msgstr "Unir desde escena"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
-msgstr ""
-"Seleccione sub-tile para utilizar como icono, éste se utilizará también en "
-"enlazados automáticos no válidos."
+msgid "Copy bitmask."
+msgstr "Copiar bitmask."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
-msgstr ""
+msgid "Paste bitmask."
+msgstr "Pegar bitmask."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
-msgstr ""
+msgid "Erase bitmask."
+msgstr "Borrar bitmask."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new polygon."
+msgstr "Crear un nuevo polígono."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr "Mantener el polígono dentro del region Rect."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
+msgstr "Activar snap y mostrar cuadricula (configurable vía el Inspector)."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr "Mostrar Nombres de Tiles (mantener Tecla Alt)"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "¿Borrar textura seleccionada y TODOS LOS TILES que la utilizan?"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
-msgstr ""
+msgstr "No elegiste una textura para eliminar."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
-msgstr "¿Crear desde escena?"
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
msgstr "¿Mezclar desde escena?"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
-msgstr ""
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Eliminar plantilla"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
+msgstr "%s archivo(s) no fueron agregados porque ya estaban en la lista."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Drag handles to edit Rect.\n"
"Click on another Tile to edit it."
msgstr ""
+"Arrastra los controles para editar el Rect.\n"
+"Haz clic en otro Tile para editarlo."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete selected Rect."
+msgstr "Eliminar el Rect seleccionado."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
-"Clic Izquierdo: habilitar bit.\n"
-"Clic Derecho: deshabilitar bit."
+"Seleccionar sub-tile editado actualmente.\n"
+"Clic en otro Tile para editarlo."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete polygon."
+msgstr "Eliminar polígono."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
-msgstr "Guardar el sub-tile editado actualmente."
+msgstr ""
+"Clic izq: Activar bit.\n"
+"Clic der: Desactivar bit.\n"
+"Clic en otro Tile para editarlo."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to use as icon, this will be also used on invalid autotile "
"bindings.\n"
"Click on another Tile to edit it."
msgstr ""
-"Seleccione sub-tile para utilizar como icono, éste se utilizará también en "
-"enlazados automáticos no válidos."
+"Selectionar sub-tile para usar como ícono, este también sera usado en "
+"bindings inválidos de autotile.\n"
+"Clic en otro Tile para editarlo."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to change its priority.\n"
"Click on another Tile to edit it."
-msgstr "Selecciona sub-tile para cambiar su prioridad."
+msgstr ""
+"Seleccionar sub-tile para cambiar su prioridad.\n"
+"Clic en otro Tile para editarlo."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+"Seleccionar sub-tile para cambiar su z index.\n"
+"Clic en otro Tile para editarlo."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Set Tile Region"
+msgstr "Establecer rectángulo de región"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Crear carpeta"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "Editar filtros"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Editar polígono existente:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Editar Polígono"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Crear polígono de navegación"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "Pegar bitmask."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Eliminar plantilla"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "Remover Polígono y Punto"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "Crear polígono oclusor"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "Crear polígono de navegación"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "Editar filtros"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Crear polígono de navegación"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Crear polígono oclusor"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "This property can't be changed."
-msgstr "Esta operación no puede realizarse sin una escena."
+msgstr "Esta propiedad no se puede cambiar."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
-msgstr "Tile Set"
+msgid "TileSet"
+msgstr "TileSet"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vertex"
-msgstr "Vértices"
+msgstr "Vértice"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Fragment"
msgstr "Fragmento"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Light"
-msgstr "Derecha"
+msgstr "Luz"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "VisualShader"
-msgstr "Shader"
+msgstr "VisualShader"
#: editor/project_export.cpp
msgid "Runnable"
@@ -6852,6 +6941,14 @@ msgstr ""
"Las plantillas de exportación para esta plataforma faltan/están corruptas:"
#: editor/project_export.cpp
+msgid "Release"
+msgstr "Release"
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr "Exportar Todo"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr "Ajustes preestablecidos"
@@ -6860,6 +6957,10 @@ msgid "Add..."
msgstr "Añadir..."
#: editor/project_export.cpp
+msgid "Export Path"
+msgstr "Ruta de Exportación"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr "Recursos"
@@ -6918,10 +7019,47 @@ msgid "Feature List:"
msgstr "Lista de características:"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "Nuevo script"
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "Modo de exportación de scipts:"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr "Texto"
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr "Compilado"
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "Encriptado (Proveer la Clave Debajo)"
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr "Llave de Encriptación Inválida (debe tener 64 caracteres de largo)"
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "Clave de cifrado de scripts (256-bits en hexadecimal):"
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr "Exportar PCK/Zip"
#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr "¿Modo de Exportación?"
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr "Exportar Todo"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr "Faltan plantillas de exportación para esta plataforma:"
@@ -6934,23 +7072,21 @@ msgid "The path does not exist."
msgstr "La ruta no existe."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
msgstr ""
-"Por favor, elige un directorio que no contenga un archivo 'project.godot'."
+"Archivo de projecto '.zip' inválido, no contiene un archivo 'project.godot'."
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "Por favor elija una carpeta vacía."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "Por favor elija un archivo 'project.godot'."
+msgstr "Por favor selecciona un archivo 'project.godot' o '.zip'."
#: editor/project_manager.cpp
msgid "Directory already contains a Godot project."
-msgstr ""
+msgstr "El directorio ya contiene un proyecto de Godot."
#: editor/project_manager.cpp
msgid "Imported Project"
@@ -7041,9 +7177,8 @@ msgid "Project Path:"
msgstr "Ruta del proyecto:"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Project Installation Path:"
-msgstr "Ruta del proyecto:"
+msgstr "Ruta de instalación del proyecto:"
#: editor/project_manager.cpp
msgid "Browse"
@@ -7054,7 +7189,8 @@ msgid "Unnamed Project"
msgstr "Proyecto sin nombre"
#: editor/project_manager.cpp
-msgid "Can't open project"
+#, fuzzy
+msgid "Can't open project at '%s'."
msgstr "No se puede abrir proyecto"
#: editor/project_manager.cpp
@@ -7063,6 +7199,24 @@ msgstr "¿Seguro que quieres abrir más de un proyecto?"
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7168,13 +7322,12 @@ msgid "Mouse Button"
msgstr "Botón del ratón"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid ""
"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
msgstr ""
-"Nombre de acción inválido. No puede estar vacío ni contener '/', ':', '=', "
-"'\\' o '\"'."
+"Nombre de acción inválido. No puede estar vacío o contener '/', ':', '=', "
+"'\\' o '\"'"
#: editor/project_settings_editor.cpp
msgid "Action '%s' already exists!"
@@ -7185,18 +7338,16 @@ msgid "Rename Input Action Event"
msgstr "Renombrar evento de acción de entrada"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Change Action deadzone"
-msgstr "Cambiar nombre de animación:"
+msgstr "Cambiar zona muerta de la acción"
#: editor/project_settings_editor.cpp
msgid "Add Input Action Event"
msgstr "Añadir evento de acción de entrada"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "All Devices"
-msgstr "Dispositivo"
+msgstr "Todos los dispositivos"
#: editor/project_settings_editor.cpp
msgid "Device"
@@ -7243,24 +7394,20 @@ msgid "Wheel Down Button"
msgstr "Botón rueda abajo"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Left Button"
-msgstr "Botón rueda arriba"
+msgstr "Botón rueda izquierda"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Right Button"
-msgstr "Botón derecho"
+msgstr "Botón rueda derecha"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 1"
-msgstr "Botón 6"
+msgstr "Botón X 1"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 2"
-msgstr "Botón 6"
+msgstr "Botón X 2"
#: editor/project_settings_editor.cpp
msgid "Joypad Axis Index:"
@@ -7402,17 +7549,13 @@ msgstr "Ajustes del proyecto (project.godot)"
msgid "General"
msgstr "General"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr "Propiedad:"
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr "Sustituir por..."
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Editor must be restarted for changes to take effect"
-msgstr ""
+msgstr "Se debe reiniciar el editor para que los cambios surtan efecto"
#: editor/project_settings_editor.cpp
msgid "Input Map"
@@ -7428,7 +7571,7 @@ msgstr "Acción"
#: editor/project_settings_editor.cpp
msgid "Deadzone"
-msgstr ""
+msgstr "Zona muerta"
#: editor/project_settings_editor.cpp
msgid "Device:"
@@ -7538,10 +7681,6 @@ msgstr "Selecciona un nodo"
msgid "Bit %d, val %d."
msgstr "Bit %d, valor %d."
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr "Propiedades:"
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr "Seleccionar propiedad"
@@ -7564,97 +7703,92 @@ msgstr ""
"No se pudo volver a cargar la imagen convertida usando la herramienta PVRTC:"
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Batch Rename"
-msgstr "Renombrar"
+msgstr "Renombrar en masa"
#: editor/rename_dialog.cpp
msgid "Prefix"
-msgstr ""
+msgstr "Prefijo"
#: editor/rename_dialog.cpp
msgid "Suffix"
-msgstr ""
+msgstr "Sufijo"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Advanced options"
-msgstr "Opciones de fijado"
+msgstr "Opciones avanzadas"
#: editor/rename_dialog.cpp
msgid "Substitute"
-msgstr ""
+msgstr "Sustituir"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node name"
-msgstr "Nombre del nodo:"
+msgstr "Nombre del nodo"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
-msgstr ""
+msgstr "Nombre del padre del nodo, si está disponible"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node type"
-msgstr "Buscar tipo de nodo"
+msgstr "Tipo de nodo"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Current scene name"
-msgstr "Escena actual"
+msgstr "Nombre de la escena actual"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Root node name"
-msgstr "Nombre del nodo:"
+msgstr "Nombre del nodo raíz"
#: editor/rename_dialog.cpp
msgid ""
"Sequential integer counter.\n"
"Compare counter options."
msgstr ""
+"Contador de enteros secuenciales.\n"
+"Comparar opciones de contador."
#: editor/rename_dialog.cpp
msgid "Per Level counter"
-msgstr ""
+msgstr "Contador por nivel"
#: editor/rename_dialog.cpp
msgid "If set the counter restarts for each group of child nodes"
-msgstr ""
+msgstr "Si esta activo el contador reinicia por cada grupo de nodos hijos"
#: editor/rename_dialog.cpp
msgid "Initial value for the counter"
-msgstr ""
+msgstr "Valor inicial para el contador"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Step"
-msgstr "Paso:"
+msgstr "Paso"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
-msgstr ""
+msgid "Amount by which counter is incremented for each node"
+msgstr "Cantidad en la que se incrementa el contador por cada nodo"
#: editor/rename_dialog.cpp
msgid "Padding"
-msgstr ""
+msgstr "Relleno"
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
+"Número mínimo de dígitos para el contador.\n"
+"Los dígitos faltantes serán rellenados con ceros al principio."
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Regular Expressions"
-msgstr "Cambiar expresión"
+msgstr "Expresiones regulares"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Post-Process"
-msgstr "Script de posprocesado:"
+msgstr "Post-Procesado"
#: editor/rename_dialog.cpp
msgid "Keep"
@@ -7662,32 +7796,29 @@ msgstr "Conservar"
#: editor/rename_dialog.cpp
msgid "CamelCase to under_scored"
-msgstr ""
+msgstr "CamelCase a under_scored"
#: editor/rename_dialog.cpp
msgid "under_scored to CamelCase"
-msgstr ""
+msgstr "under_scored a CamelCase"
#: editor/rename_dialog.cpp
msgid "Case"
-msgstr ""
+msgstr "Mayus./Minus."
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Lowercase"
-msgstr "Minúscula"
+msgstr "A minúsculas"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Uppercase"
-msgstr "Mayúscula"
+msgstr "A mayúsculas"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Reset"
-msgstr "Restablecer zoom"
+msgstr "Resetear"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr "Error"
@@ -7748,6 +7879,10 @@ msgid "Instance Scene(s)"
msgstr "Instanciar escenas"
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "Instanciar escena hija"
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr "Quitar script"
@@ -7784,6 +7919,14 @@ msgid "Save New Scene As..."
msgstr "Guardar nueva escena como..."
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+"Desactivar \"editable_instance\" causara que todas las propiedades del nodo "
+"vuelvan a sus valores por defecto."
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr "Hijos editables"
@@ -7796,29 +7939,24 @@ msgid "Make Local"
msgstr "Crear local"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "Crear nodo"
+msgstr "Crear Nodo Raíz:"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "2D Scene"
-msgstr "Escenas"
+msgstr "Escena 2D"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "3D Scene"
-msgstr "Escenas"
+msgstr "Escena 3D"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "User Interface"
-msgstr "Limpiar heredado"
+msgstr "Interfaz de usuario"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Custom Node"
-msgstr "Cortar nodos"
+msgstr "Nodo personalizado"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
@@ -7861,6 +7999,10 @@ msgid "Clear Inheritance"
msgstr "Limpiar heredado"
#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr "Abrir documentación"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr "Eliminar nodo(s)"
@@ -7869,17 +8011,16 @@ msgid "Add Child Node"
msgstr "Añadir nodo hijo"
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
-msgstr "Instanciar escena hija"
-
-#: editor/scene_tree_dock.cpp
msgid "Change Type"
msgstr "Cambiar tipo"
#: editor/scene_tree_dock.cpp
-#, fuzzy
+msgid "Extend Script"
+msgstr "Extender Script"
+
+#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
-msgstr "Nueva Raíz de Escena"
+msgstr "Convertir en raíz de escena"
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
@@ -7930,22 +8071,20 @@ msgid "Clear Inheritance? (No Undo!)"
msgstr "¿Quieres limpiar la herencia? (No se puede deshacer)"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Toggle Visible"
-msgstr "Cambiar visibilidad"
+msgstr "Act/Desact. Visible"
#: editor/scene_tree_editor.cpp
msgid "Node configuration warning:"
msgstr "Alerta de configuración de nodos:"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node has connection(s) and group(s).\n"
"Click to show signals dock."
msgstr ""
-"El nodo tiene conexión(es) y grupo(s)\n"
-"Haz clic para mostrar el panel de señales."
+"El nodo tiene conexión/es y grupo/s.\n"
+"Clic para mostrar el panel de señales."
#: editor/scene_tree_editor.cpp
msgid ""
@@ -7964,27 +8103,24 @@ msgstr ""
"Haz clic para mostrar el panel de grupos."
#: editor/scene_tree_editor.cpp editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script"
msgstr "Abrir script"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node is locked.\n"
"Click to unlock it."
msgstr ""
"El nodo está bloqueado.\n"
-"Haz clic para desbloquear"
+"Clic para desbloquear."
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Children are not selectable.\n"
"Click to make selectable."
msgstr ""
"Los hijos no son seleccionables.\n"
-"Haz clic para hacerlos seleccionables"
+"Clic para convertir en seleccionables."
#: editor/scene_tree_editor.cpp
msgid "Toggle Visibility"
@@ -7995,6 +8131,8 @@ msgid ""
"AnimationPlayer is pinned.\n"
"Click to unpin."
msgstr ""
+"El AnimationPlayer esta pineado.\n"
+"Haz clic para despinear."
#: editor/scene_tree_editor.cpp
msgid "Invalid node name, the following characters are not allowed:"
@@ -8034,15 +8172,18 @@ msgid "N/A"
msgstr "N/D"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script/Choose Location"
-msgstr "Abrir editor de script"
+msgstr "Abrir script/Elegir ubicación"
#: editor/script_create_dialog.cpp
msgid "Path is empty"
msgstr "La ruta está vacia"
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr "Nombre de archivo vacío"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr "La ruta no es local"
@@ -8131,20 +8272,8 @@ msgid "Bytes:"
msgstr "Bytes:"
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr "Advertencia"
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr "Error:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr "Fuente:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
-msgstr "Función:"
+msgid "Stack Trace"
+msgstr "Stack Trace"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8175,18 +8304,6 @@ msgid "Stack Frames"
msgstr "Frames del stack"
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr "Variable"
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr "Errores:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr "Stack Trace (si aplica):"
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr "Profiler"
@@ -8275,9 +8392,8 @@ msgid "Change Camera Size"
msgstr "Cambiar tamaño de cámara"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Notifier AABB"
-msgstr "Cambiar alcances de notificadores"
+msgstr "Cambiar Notificador AABB"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Particles AABB"
@@ -8304,38 +8420,32 @@ msgid "Change Capsule Shape Height"
msgstr "Cambiar altura de shape cápsula"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Radius"
-msgstr "Cambiar radio de shape cápsula"
+msgstr "Cambiar radio de Shape Cilindro"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Height"
-msgstr "Cambiar altura de shape cápsula"
+msgstr "Cambiar altura de Shape Cilindro"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Ray Shape Length"
msgstr "Cambiar longitud de forma de rayo"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Radius"
-msgstr "Cambiar radio de luces"
+msgstr "Cambiar radio de Shape Cilindro"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Height"
-msgstr "Cambiar altura de shape cápsula"
+msgstr "Cambiar altura de Shape Cilindro"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Inner Radius"
-msgstr "Cambiar radio de shape esférico"
+msgstr "Cambiar radio interno de Toro"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Outer Radius"
-msgstr "Cambiar radio de luces"
+msgstr "Cambiar radio externo de Toro"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select the dynamic library for this entry"
@@ -8390,8 +8500,8 @@ msgid "GDNative"
msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
-msgstr "¡el argumento del paso es cero!"
+msgid "Step argument is zero!"
+msgstr "¡El argumento step es cero!"
#: modules/gdscript/gdscript_functions.cpp
msgid "Not a script with an instance"
@@ -8458,9 +8568,8 @@ msgid "GridMap Delete Selection"
msgstr "GridMap Quitar seleccionados"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Fill Selection"
-msgstr "GridMap Quitar seleccionados"
+msgstr "Llenar selección en GridMap"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Duplicate Selection"
@@ -8472,7 +8581,7 @@ msgstr "Mapa de cuadrícula"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Snap View"
-msgstr "Fijar vista"
+msgstr "Anclar Vista"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Clip Disabled"
@@ -8543,9 +8652,8 @@ msgid "Clear Selection"
msgstr "Deseleccionar"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Fill Selection"
-msgstr "Toda la selección"
+msgstr "Llenar la selección"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Settings"
@@ -8616,12 +8724,8 @@ msgid "End of inner exception stack trace"
msgstr "Fin del reporte de la pila de excepciones"
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr "¡Calcular!"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
-msgstr "Pre-calcular la malla de navegación."
+msgid "Bake NavMesh"
+msgstr "Bake de NavMesh"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8850,14 +8954,12 @@ msgid "Connect Nodes"
msgstr "Conectar nodos"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Data"
-msgstr "Conectar nodos"
+msgstr "Conectar datos de nodos"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Sequence"
-msgstr "Conectar nodos"
+msgstr "Conectar secuencia de nodos"
#: modules/visual_script/visual_script_editor.cpp
msgid "Script already has function '%s'"
@@ -8904,6 +9006,10 @@ msgid "Base Type:"
msgstr "Tipo base:"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "Miembros:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "Nodos disponibles:"
@@ -8940,9 +9046,8 @@ msgid "Paste Nodes"
msgstr "Pegar nodos"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
-msgstr "Miembros"
+msgstr "Editar Miembros"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Input type not iterable: "
@@ -9003,17 +9108,16 @@ msgstr ""
"o string/cadena (error)."
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Search VisualScript"
-msgstr "Quitar nodo de VisualScript"
+msgstr "Buscar en VisualScript"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
-msgstr "Get"
+msgid "Get %s"
+msgstr "Obtener %s"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
-msgstr ""
+msgid "Set %s"
+msgstr "Establecer %s"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -9065,16 +9169,15 @@ msgstr ""
"el resto van a ser ignorados."
#: scene/2d/collision_object_2d.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
"define its shape."
msgstr ""
-"Este nodo no tiene formas hijas, por lo que no puede interactuar con el "
-"espacio.\n"
-"Considere añadir CollisionShape2D o CollisionPolygon2D como hijo para "
-"definir su forma."
+"Este nodo no tiene forma definida, por lo tanto, no puede colisionar o "
+"interactuar con otros objetos.\n"
+"Considera agregarle un nodo hijo de tipo CollisionShape2D o "
+"CollisionPolygon2D para definir su forma."
#: scene/2d/collision_polygon_2d.cpp
msgid ""
@@ -9109,6 +9212,14 @@ msgstr ""
"Se debe de proveer de forma a CollisionShape2D para que funcione. ¡Creale un "
"recurso \"shape\"!"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+"La animación CPUParticles2D requiere el uso de un CanvasItemMaterial con "
+"\"Particles Animation\" activado."
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -9160,6 +9271,14 @@ msgstr ""
"No se ha asignado un material para procesar las partículas, por lo que no se "
"muestra ningún comportamiento."
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+"La animación Particles2D requiere el uso de un CanvasItemMaterial con "
+"\"Particles Animation\" activado."
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -9182,16 +9301,19 @@ msgstr "La propiedad Path debe apuntar a un nodo Node2D válido para funcionar."
#: scene/2d/skeleton_2d.cpp
msgid "This Bone2D chain should end at a Skeleton2D node."
-msgstr ""
+msgstr "Esta cadena Bone2D debería terminar en un nodo Skeleton2D."
#: scene/2d/skeleton_2d.cpp
msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
msgstr ""
+"Un Bone2D solo funciona con un Skeleton2D u otro Bone2D como nodo padre."
#: scene/2d/skeleton_2d.cpp
msgid ""
"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
msgstr ""
+"Este hueso no tiene una pose de DESCANSO adecuada. Ve al nodo Skeleton2D y "
+"asígnale una."
#: scene/2d/visibility_notifier_2d.cpp
msgid ""
@@ -9258,16 +9380,15 @@ msgid "Lighting Meshes: "
msgstr "Iluminando mallas: "
#: scene/3d/collision_object.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape or CollisionPolygon as a child to define "
"its shape."
msgstr ""
-"Este nodo no tiene formas hijas, por lo que no puede interactuar con el "
-"espacio.\n"
-"Considera añadir un CollisionShape o CollisionPolygon como hijos de este "
-"nodo para dotarlo de una forma."
+"Este nodo no tiene forma, por lo tanto, no puede colisionar o interactuar "
+"con otros objetos.\n"
+"Considera agregarle un nodo hijo de tipo CollisionShape o CollisionPolygon "
+"para definir su forma."
#: scene/3d/collision_polygon.cpp
msgid ""
@@ -9301,6 +9422,18 @@ msgstr ""
"Se debe proveer de una forma a CollisionShape para que funcione. Por favor, "
"¡crea un recurso \"shape\"!"
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr "Nada visible ya que no se asignó ningún mesh."
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+"La animación CPUParticles requiere el uso de un SpatialMaterial con "
+"\"Billboard Particles\" activado."
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr "Trazando mallas"
@@ -9325,6 +9458,33 @@ msgid ""
msgstr ""
"Nada es visible porque las mallas no se han asignado a los pases de dibujo."
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+"La animación de partículas requiere el uso de un SpatialMaterial con "
+"\"Billboard Particles\" activado."
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+"PathFollow solo funciona cuando está asignado como hijo de un nodo Path."
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+"OrientedPathFollow solo funciona cuando esta asignado como hijo de un nodo "
+"Path."
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+"OrientedPathFollow requiere que \"Up Vector\" esté activo en el recurso "
+"Curve de su Path padre."
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9362,18 +9522,17 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid "This body will be ignored until you set a mesh"
-msgstr ""
+msgstr "Este cuerpo sera ignorado hasta que le asignes un mesh"
#: scene/3d/soft_body.cpp
-#, fuzzy
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
-"Los cambios en el tamaño del RigidBody (en los modos \"character\" o \"rigid"
-"\") serán sobre-escritos por el motor de físicas cuando se ejecute.\n"
-"En lugar de esto, cambie el tamaño en las formas de colisión hijas."
+"Los cambios de tamaño a un SoftBody serán sobrescritos por el motor de "
+"física al ejecutar.\n"
+"En su lugar, cambia el tamaño de los collision shapes hijos."
#: scene/3d/sprite_3d.cpp
msgid ""
@@ -9393,46 +9552,45 @@ msgstr ""
#: scene/animation/animation_blend_tree.cpp
msgid "On BlendTree node '%s', animation not found: '%s'"
-msgstr ""
+msgstr "En el nodo BlendTree '%s', no se encontró la animación: '%s'"
#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "Herramientas de animación"
+msgstr "No se encontró la animación: '%s'"
#: scene/animation/animation_tree.cpp
msgid "In node '%s', invalid animation: '%s'."
-msgstr ""
+msgstr "En el nodo '%s', animación inválida: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "ERROR: ¡El nombre de animación no es correcto!"
+msgstr "Animación inválida: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "Desconectar '%s' de '%s'"
+msgstr "Nada conectado a la entrada '%s' del nodo '%s'."
#: scene/animation/animation_tree.cpp
msgid "A root AnimationNode for the graph is not set."
-msgstr ""
+msgstr "No hay asignado ningún nodo AnimationNode raíz para el gráfico."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Path to an AnimationPlayer node containing animations is not set."
msgstr ""
-"Selecciona un AnimationPlayer desde el árbol de escenas para editar "
-"animaciones."
+"No hay asignada una ruta a un nodo AnimationPlayer conteniendo animaciones."
#: scene/animation/animation_tree.cpp
msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
msgstr ""
+"La ruta asignada al AnimationPlayer no apunta a un nodo AnimationPlayer."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "AnimationPlayer root is not a valid node."
-msgstr "El árbol de animación no es correcto."
+msgstr "La raíz del AnimationPlayer no es un nodo válido."
+
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr "Este nodo ha quedado obsoleto. Usa AnimationTree en su lugar."
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
@@ -9450,10 +9608,6 @@ msgstr "¡Alerta!"
msgid "Please Confirm..."
msgstr "Por favor, confirma..."
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr "Seleccionar esta carpeta"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9464,6 +9618,10 @@ msgstr ""
"cualquiera de las funciones popup*(). Sin embargo, no hay problema con "
"hacerlos visibles para editar, aunque se esconderán al ejecutar."
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr "Si exp_edit es `true` min_value debe ser > 0."
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9515,31 +9673,225 @@ msgid "Invalid font size."
msgstr "Tamaño de tipografía incorrecto."
#: scene/resources/visual_shader.cpp
-#, fuzzy
msgid "Input"
-msgstr "Añadir Entrada"
-
-#: scene/resources/visual_shader.cpp
-#, fuzzy
-msgid "None"
-msgstr "<Ninguno>"
+msgstr "Entrada"
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for shader."
-msgstr "¡Origen incorrecto!"
+msgstr "Fuente inválida para el shader."
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
-msgstr ""
+msgstr "Asignación a función."
#: servers/visual/shader_language.cpp
msgid "Assignment to uniform."
-msgstr ""
+msgstr "Asignación a uniform."
#: servers/visual/shader_language.cpp
msgid "Varyings can only be assigned in vertex function."
-msgstr ""
+msgstr "Solo se pueden asignar variaciones en funciones de vértice."
+
+#~ msgid "Split point with itself."
+#~ msgstr "Dividir punto con sí mismo."
+
+#~ msgid "Split can't form an existing edge."
+#~ msgstr "La división no puede formar un borde existente."
+
+#~ msgid "Split already exists."
+#~ msgstr "La división ya existe."
+
+#~ msgid "Add Split"
+#~ msgstr "Agregar división"
+
+#~ msgid "Invalid Split: "
+#~ msgstr "División inválida: "
+
+#~ msgid "Remove Split"
+#~ msgstr "Quitar división"
+
+#~ msgid "Poly"
+#~ msgstr "Polígono"
+
+#~ msgid "Splits"
+#~ msgstr "Divisiones"
+
+#~ msgid "Connect two points to make a split."
+#~ msgstr "Conectar dos puntos para crear una división."
+
+#~ msgid "Select a split to erase it."
+#~ msgstr "Selecciona una división para borrarla."
+
+#~ msgid "No name provided"
+#~ msgstr "No se proporcionó un nombre"
+
+#~ msgid "Add Node.."
+#~ msgstr "Añadir Nodo..."
+
+#~ msgid "Create from scene?"
+#~ msgstr "¿Crear desde escena?"
+
+#~ msgid "Create Poly"
+#~ msgstr "Crear polígono"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "Crear un nuevo polígono desde cero"
+
+#~ msgid "Zoom out"
+#~ msgstr "Zoom out"
+
+#~ msgid "Zoom in"
+#~ msgstr "Zoom in"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "Crear Poly3D"
+
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "No se ha encontrado el recurso OccluderPolygon2D en este nodo.\n"
+#~ "¿Crear uno y asignarlo?"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "Clic izquierdo: Mover punto."
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "Ctrl + LMB: Dividir Segmento."
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "Clic derecho: Borrar punto."
+
+#~ msgid "New TextFile"
+#~ msgstr "Nuevo TextFile"
+
+#~ msgid "Save Theme As"
+#~ msgstr "Guardar tema como"
+
+#~ msgid "<None>"
+#~ msgstr "<Ninguno>"
+
+#~ msgid ""
+#~ "Select sub-tile to use as icon, this will be also used on invalid "
+#~ "autotile bindings."
+#~ msgstr ""
+#~ "Seleccione sub-tile para utilizar como icono, éste se utilizará también "
+#~ "en enlazados automáticos no válidos."
+
+#~ msgid "Zoom:"
+#~ msgstr "Zoom:"
+
+#~ msgid "Are you sure you want to remove all connections from the \""
+#~ msgstr "¿Estás seguro/a que quieres quitar todas las conexiones de el/la \""
+
+#~ msgid "Class List:"
+#~ msgstr "Lista de clases:"
+
+#~ msgid "Search Classes"
+#~ msgstr "Buscar clases"
+
+#~ msgid "Public Methods"
+#~ msgstr "Métodos públicos"
+
+#~ msgid "Public Methods:"
+#~ msgstr "Métodos públicos:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "Elementos del tema de interfaz"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "Elementos del tema de interfaz:"
+
+#~ msgid "Property: "
+#~ msgstr "Propiedad: "
+
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "Act/Desact. estado de carpeta como Favorito."
+
+#~ msgid "Show current scene file."
+#~ msgstr "Mostrar archivo de escena actual."
+
+#~ msgid "Enter tree-view."
+#~ msgstr "Entrar a la vista árbol."
+
+#~ msgid "Whole words"
+#~ msgstr "Palabras completas"
+
+#~ msgid "Match case"
+#~ msgstr "Coincidir Mayúsculas/Minúsculas"
+
+#~ msgid "Filter: "
+#~ msgstr "Filtro: "
+
+#~ msgid "Ok"
+#~ msgstr "Aceptar"
+
+#~ msgid "Show In File System"
+#~ msgstr "Mostrar en sistema de archivos"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "Buscar en la jerarquía de clases."
+
+#~ msgid "Search in files"
+#~ msgstr "Buscar en archivos"
+
+#~ msgid ""
+#~ "Built-in scripts can only be edited when the scene they belong to is "
+#~ "loaded"
+#~ msgstr ""
+#~ "Los scripts integrados sólo se pueden editar cuando la escena a la que "
+#~ "pertenecen está cargada"
+
+#~ msgid "Convert To Uppercase"
+#~ msgstr "Convertir a mayúsculas"
+
+#~ msgid "Convert To Lowercase"
+#~ msgstr "Convertir a minúsculas"
+
+#~ msgid "Snap To Floor"
+#~ msgstr "Ajustar al suelo"
+
+#~ msgid "Rotate 0 degrees"
+#~ msgstr "Rotar 0 grados"
+
+#~ msgid "Rotate 90 degrees"
+#~ msgstr "Rotar 90 grados"
+
+#~ msgid "Rotate 180 degrees"
+#~ msgstr "Rotar 180 grados"
+
+#~ msgid "Rotate 270 degrees"
+#~ msgstr "Rotar 270 grados"
+
+#~ msgid "Warning"
+#~ msgstr "Advertencia"
+
+#~ msgid "Error:"
+#~ msgstr "Error:"
+
+#~ msgid "Source:"
+#~ msgstr "Fuente:"
+
+#~ msgid "Function:"
+#~ msgstr "Función:"
+
+#~ msgid "Variable"
+#~ msgstr "Variable"
+
+#~ msgid "Errors:"
+#~ msgstr "Errores:"
+
+#~ msgid "Stack Trace (if applicable):"
+#~ msgstr "Stack Trace (si aplica):"
+
+#~ msgid "Bake!"
+#~ msgstr "¡Calcular!"
+
+#~ msgid "Bake the navigation mesh."
+#~ msgstr "Pre-calcular la malla de navegación."
+
+#~ msgid "Get"
+#~ msgstr "Get"
#~ msgid "Change Scalar Constant"
#~ msgstr "Cambiar constante escalar"
@@ -9745,9 +10097,6 @@ msgstr ""
#~ msgid "Run Script"
#~ msgstr "Ejecutar script"
-#~ msgid "Save the currently edited resource."
-#~ msgstr "Guardar el recurso editado actualmente."
-
#~ msgid "Stop Profiling"
#~ msgstr "Parar Profiling"
@@ -10054,9 +10403,6 @@ msgstr ""
#~ msgid "Could not save atlas subtexture:"
#~ msgstr "No se pudo guardar la subtextura del altas:"
-#~ msgid "Exporting for %s"
-#~ msgstr "Exportando para %s"
-
#~ msgid "Setting Up..."
#~ msgstr "Configurando..."
@@ -10166,9 +10512,6 @@ msgstr ""
#~ msgid "Source Font:"
#~ msgstr "Tipografía elegida:"
-#~ msgid "Source Font Size:"
-#~ msgstr "Tamaño de la tipografía elegida:"
-
#~ msgid "Dest Resource:"
#~ msgstr "Recurso de destino:"
@@ -10245,9 +10588,6 @@ msgstr ""
#~ msgid "Start(s)"
#~ msgstr "Inicios"
-#~ msgid "Filters"
-#~ msgstr "Filtros"
-
#~ msgid "Source path is empty."
#~ msgstr "La ruta de origen esta vacía."
@@ -10524,15 +10864,9 @@ msgstr ""
#~ msgid "Stereo"
#~ msgstr "Estéreo"
-#~ msgid "Pitch"
-#~ msgstr "Altura"
-
#~ msgid "Window"
#~ msgstr "Ventana"
-#~ msgid "Move Right"
-#~ msgstr "Mover a la derecha"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "Escalando al %s%%."
@@ -10615,9 +10949,6 @@ msgstr ""
#~ msgid "just pressed"
#~ msgstr "se presione"
-#~ msgid "just released"
-#~ msgstr "se levante"
-
#, fuzzy
#~ msgid ""
#~ "Couldn't read the certificate file. Are the path and password both "
@@ -10955,21 +11286,6 @@ msgstr ""
#~ msgid "Trailing Silence:"
#~ msgstr "Silencio sobrante al final:"
-#~ msgid "Script Export Mode:"
-#~ msgstr "Modo de exportación de scipts:"
-
-#~ msgid "Text"
-#~ msgstr "Texto"
-
-#~ msgid "Compiled"
-#~ msgstr "Compilado"
-
-#~ msgid "Encrypted (Provide Key Below)"
-#~ msgstr "Encriptado (Proveer la Clave Debajo)"
-
-#~ msgid "Script Encryption Key (256-bits as hex):"
-#~ msgstr "Clave de cifrado de scripts (256-bits en hexadecimal):"
-
#~ msgid "Export Project PCK"
#~ msgstr "Exportar PCK del proyecto"
@@ -10979,9 +11295,6 @@ msgstr ""
#~ msgid "Project Export"
#~ msgstr "Exportar proyecto"
-#~ msgid "Export Preset:"
-#~ msgstr "Presets de Exportación:"
-
#~ msgid "BakedLightInstance does not contain a BakedLight resource."
#~ msgstr "BakedLightInstance no contiene un recurso BakedLight."
@@ -11059,13 +11372,6 @@ msgstr ""
#~ msgid "Scale Region Editor"
#~ msgstr "Editor de Regiones de Escalado"
-#~ msgid ""
-#~ "No texture in this node.\n"
-#~ "Set a texture to be able to edit region."
-#~ msgstr ""
-#~ "Sin textura en este nodo.\n"
-#~ "Asigná una textura para poder editar la región."
-
#~ msgid "Inherit Scene"
#~ msgstr "Heredar Escena"
diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po
index 457b63c44b..7b0465f2a9 100644
--- a/editor/translations/es_AR.po
+++ b/editor/translations/es_AR.po
@@ -1,18 +1,20 @@
# Spanish (Argentina) translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# Diego López <diegodario21@gmail.com>, 2017.
# Lisandro Lorea <lisandrolorea@gmail.com>, 2016-2018.
# Roger Blanco Ribera <roger.blancoribera@gmail.com>, 2016-2018.
# Sebastian Silva <sebastian@sugarlabs.org>, 2016.
# Jose Luis Bossio <joseluisbossio@gmail.com>, 2018.
+# Reynaldo Cruz <rcruz60@gmail.com>, 2018.
+# Javier Ocampos <xavier.ocampos@gmail.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2018-07-27 15:44+0000\n"
-"Last-Translator: Jose Luis Bossio <joseluisbossio@gmail.com>\n"
+"PO-Revision-Date: 2018-12-22 11:09+0000\n"
+"Last-Translator: Lisandro Lorea <lisandrolorea@gmail.com>\n"
"Language-Team: Spanish (Argentina) <https://hosted.weblate.org/projects/"
"godot-engine/godot/es_AR/>\n"
"Language: es_AR\n"
@@ -20,15 +22,15 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.1.1\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr "Argumento de tipo inválido para convert(), usá constantes TYPE_*."
+msgstr "El argumento para convert() no es correcto, utiliza constantes TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
@@ -36,34 +38,31 @@ msgstr ""
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Entrada inválida %i (no se transmitió) en la expresión"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "self no puede ser usado ya que la instancia es nula (no pasó)"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "Nombre de propiedad índice '%s' inválido en nodo %s."
+msgstr "Operandos inválidos para el operador %s, %s y %s."
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid index of type %s for base type %s"
-msgstr "Nombre de propiedad índice '%s' inválido en nodo %s."
+msgstr "Indice inválido de tipo %s para tipo base %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "Indice con nombre '%s' inválido para el tipo base %s"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid arguments to construct '%s'"
-msgstr ": Argumento inválido de tipo: "
+msgstr "Argumentos inválidos para construir '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "En la llamada a '%s':"
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -72,27 +71,23 @@ msgstr "Libre"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "Balanceado"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Mirror"
-msgstr "Espejar X"
+msgstr "Espejar"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "Insertar Clave"
+msgstr "Insertar Clave Aquí"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "Duplicar Selección"
+msgstr "Duplicar Clave(s) Seleccionada(s)"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "Eliminar Seleccionados"
+msgstr "Eliminar Clave(s) Seleccionada(s)"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -123,46 +118,40 @@ msgid "Anim Change Call"
msgstr "Cambiar Call de Anim"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Property Track"
-msgstr "Propiedad:"
+msgstr "Pista de Propiedades"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "3D Transform Track"
-msgstr "Tipo de Transformación"
+msgstr "Pista de Transformación 3D"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "Pista de Llamada a Métodos"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "Pista de Curva Bezier"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "Pista de Reproducción de Audio"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Playback Track"
-msgstr "Detener la reproducción de la animación. (S)"
+msgstr "Pista de Reproducción de Animación"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
-msgstr "Agregar pista de animación"
+msgstr "Agregar Pista"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Length Time (seconds)"
-msgstr "Duración de la animación (en segundos)."
+msgstr "Tiempo de Duración de la Animación (segundos)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "Zoom de animación."
+msgstr "Loop de Animación"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -170,42 +159,36 @@ msgid "Functions:"
msgstr "Funciones:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Audio Clips:"
-msgstr "Oyente de Audio"
+msgstr "Clips de Audio:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Clips:"
-msgstr "Clips"
+msgstr "Clips de Anim:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Toggle this track on/off."
-msgstr "Act./Desact. modo sin distracciones."
+msgstr "Act./Desact. esta pista."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "Modo de Actualización (Como esta configurada esta propiedad)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Interpolation Mode"
-msgstr "Nodo de Animación"
+msgstr "Modo de Interpolación"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "Modo Loop Envolvente (Interpolar el final con el comienzo al loopear)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "Quitar la pista seleccionada."
+msgstr "Quitar esta pista."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "Tiempo de Crossfade (s):"
+msgstr "Tiempo (s): "
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -220,13 +203,12 @@ msgid "Trigger"
msgstr "Trigger"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Capture"
-msgstr "Características"
+msgstr "Captura"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "Mas Cercano"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
@@ -235,16 +217,15 @@ msgstr "Lineal"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr ""
+msgstr "Cúbica"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clamp Loop Interp"
-msgstr "Cambiar Interpolación de Loop de Anim"
+msgstr "Interp de Loop Cortante"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "Interp de Loop Envolvente"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -252,14 +233,12 @@ msgid "Insert Key"
msgstr "Insertar Clave"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "Duplicar Nodo(s)"
+msgstr "Duplicar Clave(s)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "Eliminar Nodo(s)"
+msgstr "Eliminar Clave(s)"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -277,7 +256,6 @@ msgstr "Crear %d NUEVOS tracks e insertar claves?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -289,7 +267,7 @@ msgstr "Insertar Anim"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
-msgstr ""
+msgstr "Un AnimationPlayer no puede animarse a sí mismo, solo a otros players."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
@@ -305,7 +283,7 @@ msgstr "Insertar Clave de Animación"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr ""
+msgstr "Las pistas Transform solo aplican a nodos de tipo Spatial."
#: editor/animation_track_editor.cpp
msgid ""
@@ -314,44 +292,50 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"Las pistas de audio pueden apuntar solo a nodos de tipo:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "Las pistas de Animación solo pueden apuntar a nodos AnimationPlayer."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
msgstr ""
+"Un reproductor de animación no puede animarse a sí mismo, solo a otros "
+"reproductores."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "No es posible agregar una nueva pista sin una raíz"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "La ruta de la pista es inválida, por ende no se pueden agregar claves."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "La pista no es de tipo Spatial, no se puede insertar la clave"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
msgstr ""
+"La ruta de la pista es inválida, por ende no se pueden agregar claves de "
+"métodos."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Method not found in object: "
-msgstr "VariableGet no encontrado en el script: "
+msgstr "Método no encontrado en el objeto: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
msgstr "Mover Claves de Anim"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clipboard is empty"
-msgstr "El portapapeles está vacío!"
+msgstr "El portapapeles está vacío"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
@@ -361,24 +345,24 @@ msgstr "Escalar Keys de Anim"
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
msgstr ""
+"Esta opción no funciona con la edición Bezier, ya que es solo una pista "
+"única."
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "Mostrar solo las pistas de los nodos seleccionados en el árbol."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr ""
+msgstr "Agrupar las pistas por nodo o mostrarlas como una lista plana."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap (s): "
-msgstr "Snap (Pixeles):"
+msgstr "Ajuste (s): "
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "El árbol de animación es válido."
+msgstr "Valor de paso de animación."
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -390,19 +374,16 @@ msgid "Edit"
msgstr "Editar"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "AnimationTree"
+msgstr "Propiedades de animación."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "Copiar Parámetros"
+msgstr "Copiar Pistas"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "Pegar Parámetros"
+msgstr "Pegar Pistas"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -412,8 +393,7 @@ msgstr "Escalar Selección"
msgid "Scale From Cursor"
msgstr "Escalar Desde Cursor"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Duplicar Selección"
@@ -422,16 +402,15 @@ msgid "Duplicate Transposed"
msgstr "Duplicar Transpuesto"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
-msgstr "Eliminar Seleccionados"
+msgstr "Eliminar Selección"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+msgid "Go to Next Step"
msgstr "Ir a Paso Próximo"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+msgid "Go to Previous Step"
msgstr "Ir a Paso Previo"
#: editor/animation_track_editor.cpp
@@ -444,11 +423,11 @@ msgstr "Hacer Clean-Up de Animación"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "Elegí el nodo que será animado:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "Usar Curvas Bezier"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
@@ -496,7 +475,7 @@ msgstr "Ratio de Escala:"
#: editor/animation_track_editor.cpp
msgid "Select tracks to copy:"
-msgstr ""
+msgstr "Elegir pistas a copiar:"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -534,11 +513,11 @@ msgstr "Sin Coincidencias"
msgid "Replaced %d occurrence(s)."
msgstr "%d ocurrencia(s) Reemplazadas."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Coincidir Mayúsculas/Minúsculas"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "Palabras Completas"
@@ -554,29 +533,31 @@ msgstr "Reemplazar Todo"
msgid "Selection Only"
msgstr "Solo Selección"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Zoom In"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "Zoom Out"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "Resetear el Zoom"
#: editor/code_editor.cpp
-#, fuzzy
msgid "Warnings:"
-msgstr "Advertencias"
+msgstr "Advertencias:"
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "Zoom (%):"
+msgid "Font Size:"
+msgstr "Tamaño de Tipografía:"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Linea:"
@@ -609,6 +590,7 @@ msgstr "Agregar"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -665,9 +647,8 @@ msgid "Disconnect '%s' from '%s'"
msgstr "Desconectar '%s' de '%s'"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect all from signal: '%s'"
-msgstr "Desconectar '%s' de '%s'"
+msgstr "Desconectar todos de la señal: '%s'"
#: editor/connections_dialog.cpp
msgid "Connect..."
@@ -679,19 +660,17 @@ msgid "Disconnect"
msgstr "Desconectar"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect Signal: "
-msgstr "Conectando Señal:"
+msgstr "Conectar Señal: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection: "
-msgstr "Editar Conexiones"
+msgstr "Editar Conexión: "
#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "Are you sure you want to remove all connections from the \""
-msgstr "¿Estás seguro/a que quieres ejecutar más de un proyecto?"
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr ""
+"¿Estás seguro/a que querés quitar todas las conexiones de la señal \"%s\"?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -699,22 +678,19 @@ msgstr "Señales"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr ""
+msgstr "¿Estás seguro/a que querés quitar todas las conexiones de esta señal?"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "Desconectar"
+msgstr "Desconectar Todo"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit..."
-msgstr "Editar"
+msgstr "Editar..."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "Métodos"
+msgstr "Ir Al Método"
#: editor/create_dialog.cpp
msgid "Change %s Type"
@@ -739,23 +715,20 @@ msgid "Recent:"
msgstr "Recientes:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Buscar:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "Coincidencias:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "Descripción:"
@@ -792,8 +765,7 @@ msgid "Resource"
msgstr "Recursos"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "Ruta"
@@ -814,9 +786,10 @@ msgid "Search Replacement Resource:"
msgstr "Buscar Reemplazo de Recurso:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -849,9 +822,8 @@ msgid "Error loading:"
msgstr "Error cargando:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
-msgstr ""
-"La escena falló al cargar debido a las siguientes dependencias faltantes:"
+msgid "Load failed due to missing dependencies:"
+msgstr "Fallo la carga debido a dependencias faltantes:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -909,14 +881,6 @@ msgstr "Cambiar Valor del Diccionario"
msgid "Thanks from the Godot community!"
msgstr "Gracias de parte de la comunidad Godot!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "OK"
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Colaboradores de Godot Engine"
@@ -1010,13 +974,14 @@ msgid "Uncompressing Assets"
msgstr "Descomprimiendo Assets"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+#, fuzzy
+msgid "Package installed successfully!"
msgstr "El Paquete se Instaló Exitosamente!"
#: editor/editor_asset_installer.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Success!"
-msgstr "Conseguido!"
+msgstr "¡Conseguido!"
#: editor/editor_asset_installer.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -1092,8 +1057,7 @@ msgid "Bus options"
msgstr "Opciones de Bus"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "Duplicar"
@@ -1258,7 +1222,7 @@ msgid "Add AutoLoad"
msgstr "Agregar AutoLoad"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "Ruta:"
@@ -1266,8 +1230,8 @@ msgstr "Ruta:"
msgid "Node Name:"
msgstr "Nombre de Nodo:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "Nombre"
@@ -1337,26 +1301,29 @@ msgid "Template file not found:"
msgstr "Plantilla no encontrada:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Seleccionar Carpeta Actual"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "El Archivo Existe, Sobreescribir?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "Seleccionar Carpeta Actual"
+msgid "Select This Folder"
+msgstr "Seleccionar Esta Carpeta"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
msgstr "Copiar Ruta"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Open In File Manager"
-msgstr "Mostrar en Gestor de Archivos"
+msgid "Open in File Manager"
+msgstr "Abrir en el Explorador de Archivos"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
-msgstr "Mostrar en Gestor de Archivos"
+msgid "Show in File Manager"
+msgstr "Mostrar en Explorador de Archivos"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
@@ -1391,7 +1358,8 @@ msgid "Open a File or Directory"
msgstr "Abrir un Archivo o Directorio"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Guardar"
@@ -1449,8 +1417,7 @@ msgstr "Directorios y Archivos:"
msgid "Preview:"
msgstr "Vista Previa:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "Archivo:"
@@ -1466,24 +1433,11 @@ msgstr "EscanearFuentes"
msgid "(Re)Importing Assets"
msgstr "(Re)Importando Assets"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "Buscar en la Ayuda"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "Lista de Clases:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "Buscar Clases"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "Cima"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "Clase:"
@@ -1500,28 +1454,28 @@ msgid "Brief Description:"
msgstr "Descripción Breve:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "Miembros"
+msgid "Properties"
+msgstr "Propiedades"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "Miembros:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr "Propiedades:"
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "Métodos Públicos"
+msgid "Methods"
+msgstr "Métodos"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "Métodos Públicos:"
+msgid "Methods:"
+msgstr "Métodos:"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "Items de Tema de la GUI"
+msgid "Theme Properties"
+msgstr "Propiedades de Tema"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "Items de Tema de la GUI:"
+msgid "Theme Properties:"
+msgstr "Propiedades de Tema:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1548,8 +1502,12 @@ msgid "Constants:"
msgstr "Constantes:"
#: editor/editor_help.cpp
-msgid "Description"
-msgstr "Descripción"
+msgid "Class Description"
+msgstr "Descripción de Clase"
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
+msgstr "Descripción de Clase:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1566,12 +1524,12 @@ msgstr ""
"url][/color]."
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "Propiedades"
+msgid "Property Descriptions"
+msgstr "Descripción de Propiedades"
#: editor/editor_help.cpp
-msgid "Property Description:"
-msgstr "Descripción de Propiedad:"
+msgid "Property Descriptions:"
+msgstr "Descripción de Propiedades:"
#: editor/editor_help.cpp
msgid ""
@@ -1582,11 +1540,11 @@ msgstr ""
"[color=$color][url=$url]contribuyendo una[/url][/color]!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "Métodos"
+msgid "Method Descriptions"
+msgstr "Descripción de Método"
#: editor/editor_help.cpp
-msgid "Method Description:"
+msgid "Method Descriptions:"
msgstr "Descripción de Métodos:"
#: editor/editor_help.cpp
@@ -1597,18 +1555,58 @@ msgstr ""
"Actualmente no existe descripción para este método. Por favor ayudanos "
"[color=$color][url=$url]contribuyendo una[/url][/color]!"
-#: editor/editor_inspector.cpp
-#, fuzzy
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Buscar en la Ayuda"
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr "Mostrar Todo"
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr "Solo Clases"
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr "Solo Métodos"
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr "Solo Señales"
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr "Solo Constantes"
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr "Solo Propiedades"
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr "Solo Propiedades de Tema"
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr "Tipo de Miembro"
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr "Clase"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
msgstr "Propiedad:"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp
msgid "Set"
-msgstr "Setear"
+msgstr "Asignar"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "Asignar Múltiples:"
#: editor/editor_log.cpp
msgid "Output:"
@@ -1636,6 +1634,11 @@ msgstr "La exportación del proyecto falló con el código de error %d."
msgid "Error saving resource!"
msgstr "Error al guardar el recurso!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "OK"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "Guardar Recurso Como..."
@@ -1655,6 +1658,7 @@ msgstr "Error al grabar."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
msgstr ""
+"No se puede abrir '%s'. El archivo puede haber sido movido o eliminado."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
@@ -1690,12 +1694,25 @@ msgstr "Esta operación no puede hacerse sin una raíz de árbol."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+"Esta escena no puede ser guardada porque hay una inclusión cíclica de "
+"instanciado.\n"
+"Por favor resolvela y probá de nuevo."
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
"No se pudo guardar la escena. Probablemente no se hayan podido satisfacer "
"dependencias (instancias o herencia)."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr "No se puede sobrescribir una escena que todavía esta abierta!"
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr "No se puede cargar MeshLibrary para hacer merge!"
@@ -1958,6 +1975,14 @@ msgstr "No se pudo cargar el script de addon desde la ruta: '%s'."
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"No se pudo cargar el script de addon desde la ruta: '%s' Parece haber un "
+"error en el código. Por favor, revisá la sintaxis."
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
"No se pudo cargar el script de addon desde la ruta: El tipo base de '%s' no "
@@ -2008,15 +2033,18 @@ msgstr "Eliminar Layout"
msgid "Default"
msgstr "Por Defecto"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr "Mostrar en Sistema de Archivos"
+
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play This Scene"
-msgstr "Reproducir Escena"
+msgstr "Reproducir Esta Escena"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "Cerrar Otras Pestañas"
+msgstr "Cerrar Pestaña"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2091,8 +2119,8 @@ msgid "Save Scene"
msgstr "Guardar Escena"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
-msgstr "Guardar todas las Escenas"
+msgid "Save All Scenes"
+msgstr "Guardar Todas las Escenas"
#: editor/editor_node.cpp
msgid "Close Scene"
@@ -2120,7 +2148,7 @@ msgid "Undo"
msgstr "Deshacer"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Rehacer"
@@ -2144,26 +2172,26 @@ msgstr "Configuración de Proyecto"
msgid "Export"
msgstr "Exportar"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "Herramientas"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "Abrir Gestor de Proyectos?"
+msgstr "Abrir Carpeta de Datos del Proyecto"
#: editor/editor_node.cpp
msgid "Quit to Project List"
msgstr "Salir a Listado de Proyecto"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
-msgstr "Debuguear"
+msgstr "Depurar"
#: editor/editor_node.cpp
msgid "Deploy with Remote Debug"
-msgstr "Hacer Deploy con Debug Remoto"
+msgstr "Hacer Deploy con Depuración Remota"
#: editor/editor_node.cpp
msgid ""
@@ -2171,11 +2199,11 @@ msgid ""
"connect to the IP of this computer in order to be debugged."
msgstr ""
"Al exportar o hacer deploy, el ejecutable resultante tratara de conectarse a "
-"la IP de esta computadora de manera de ser debugueado."
+"la IP de esta computadora de manera de ser depurado."
#: editor/editor_node.cpp
msgid "Small Deploy with Network FS"
-msgstr "Deploy Pequeño con Network FS"
+msgstr "Deploy Pequeño con recursos en red"
#: editor/editor_node.cpp
msgid ""
@@ -2235,7 +2263,7 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Sync Script Changes"
-msgstr "Actualizar Cambios en Scripts"
+msgstr "Sincronizar Cambios en Scripts"
#: editor/editor_node.cpp
msgid ""
@@ -2266,18 +2294,16 @@ msgid "Toggle Fullscreen"
msgstr "Act./Desact. Pantalla Completa"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Data/Settings Folder"
-msgstr "Configuración del Editor"
+msgstr "Abrir Carpeta de Datos/Configuración del Editor"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "Abrir Carpeta de Datos del Editor"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Settings Folder"
-msgstr "Configuración del Editor"
+msgstr "Abrir Carpeta de Configuración del Editor"
#: editor/editor_node.cpp editor/project_export.cpp
msgid "Manage Export Templates"
@@ -2287,10 +2313,6 @@ msgstr "Gestionar Plantillas de Exportación"
msgid "Help"
msgstr "Ayuda"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "Clases"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2361,13 +2383,12 @@ msgstr "Reproducir Escena Personalizada"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr ""
+msgstr "Cambiar el driver de video requiere reiniciar el editor."
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Save & Restart"
-msgstr "Guardar y Reimportar"
+msgstr "Guardar y Reiniciar"
#: editor/editor_node.cpp
msgid "Spins when the editor window repaints!"
@@ -2385,27 +2406,26 @@ msgstr "Actualizar Cambios"
msgid "Disable Update Spinner"
msgstr "Desactivar Update Spinner"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "Inspector"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "Importar"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "Nodo"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "FileSystem"
#: editor/editor_node.cpp
-#, fuzzy
+msgid "Inspector"
+msgstr "Inspector"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Nodo"
+
+#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
-msgstr "Expandir todos"
+msgstr "Expandir Panel Inferior"
#: editor/editor_node.cpp scene/resources/visual_shader.cpp
msgid "Output"
@@ -2484,9 +2504,8 @@ msgid "Thumbnail..."
msgstr "Miniatura..."
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit Plugin"
-msgstr "Editar Polígono"
+msgstr "Editar Plugin"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
@@ -2510,15 +2529,13 @@ msgid "Status:"
msgstr "Estado:"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit:"
-msgstr "Editar"
+msgstr "Editar:"
#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Start"
-msgstr "Iniciar!"
+msgstr "Iniciar"
#: editor/editor_profiler.cpp
msgid "Measure:"
@@ -2540,7 +2557,7 @@ msgstr "Frame %"
msgid "Physics Frame %"
msgstr "Frames de Física %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "Tiempo:"
@@ -2564,34 +2581,66 @@ msgstr "Tiempo"
msgid "Calls"
msgstr "Llamadas"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr "On"
#: editor/editor_properties.cpp
msgid "Layer"
-msgstr ""
+msgstr "Capa"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Bit %d, value %d"
-msgstr "Bit %d, val %d."
+msgstr "Bit %d, valor %d"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr "[Vacio]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
#, fuzzy
-msgid "Assign.."
-msgstr "Asignar"
+msgid "Assign..."
+msgstr "Asignar.."
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "Ruta inválida"
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+"El recurso seleccionado (%s) no concuerda con el tipo esperado para esta "
+"propiedad (%s)."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+"No se puede crear una ViewportTexture en recursos guardados como archivo.\n"
+"El recurso debe pertenecer a una escena."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+"No se puede crear una ViewportTexture en este recurso porque no esta "
+"asignado como local a la escena.\n"
+"Por favor activá la propiedad 'local a escena' en él (y en todos los "
+"recursos que lo contienen hasta un nodo)."
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr "Seleccionar un Viewport"
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr "Nuevo Script"
@@ -2603,10 +2652,6 @@ msgstr "Nuevo %s"
msgid "Make Unique"
msgstr "Convertir en Unico"
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr "Mostrar en Sistema de Archivos"
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2615,7 +2660,8 @@ msgstr "Mostrar en Sistema de Archivos"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "Pegar"
@@ -2628,36 +2674,32 @@ msgstr "Convertir A %s"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Open Editor"
-msgstr "Abrir en Editor"
+msgstr "Abrir Editor"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Selected node is not a Viewport!"
msgstr "El nodo seleccionado no es un Viewport!"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "Size: "
-msgstr "Tamaño de Celda:"
+msgstr "Tamaño: "
#: editor/editor_properties_array_dict.cpp
msgid "Page: "
-msgstr ""
+msgstr "Página: "
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Key:"
-msgstr "Nuevo nombre:"
+msgstr "Nueva Clave:"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Value:"
-msgstr "Nuevo nombre:"
+msgstr "Nuevo Valor:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
-msgstr ""
+msgstr "Agregar Par Clave/Valor"
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -2751,9 +2793,8 @@ msgid "Can't open export templates zip."
msgstr "No se puede abir el zip de plantillas de exportación."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Invalid version.txt format inside templates: %s."
-msgstr "Formato de version.txt invalido dentro de plantillas."
+msgstr "Formato de version.txt inválido dentro de plantillas: %s."
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
@@ -2818,6 +2859,8 @@ msgid ""
"Templates installation failed. The problematic templates archives can be "
"found at '%s'."
msgstr ""
+"Fallo la instalación de plantillas. Las plantillas problemáticas pueden ser "
+"encontradas en '%s'."
#: editor/export_template_manager.cpp
msgid "Error requesting url: "
@@ -2898,9 +2941,9 @@ msgid "Download Templates"
msgstr "Descargar Plantillas"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr "Seleccionar mirror de la lista: "
+msgstr ""
+"Seleccionar un mirror de la lista: (Shift+Click: Abrir en el Navegador)"
#: editor/file_type_cache.cpp
msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
@@ -2909,19 +2952,21 @@ msgstr ""
"de tipos de archivo!"
#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr "Favoritos"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
"No se puede navegar a '%s' ya que no se encontro en el sistema de archivos!"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a grid of thumbnails."
-msgstr "Ver items como una grilla de miniaturas"
+msgstr "Ver ítems como una grilla de miniaturas."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a list."
-msgstr "Ver items como una lista"
+msgstr "Ver ítems como una lista."
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
@@ -2949,19 +2994,15 @@ msgstr "Error al duplicar:"
msgid "Unable to update dependencies:"
msgstr "No se pudieron actualizar las dependencias:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "No se indicó ningún nombre"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "No se indicó ningún nombre."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "El nombre indicado contiene caracteres inválidos"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "No se indicó ningún nombre."
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "El nombre indicado contiene caracteres inválidos."
@@ -2986,22 +3027,6 @@ msgid "Duplicating folder:"
msgstr "Duplicando carpeta:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "Expandir todos"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "Colapsar todos"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "Renombrar..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "Mover A..."
-
-#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
msgstr "Abrir Escena(s)"
@@ -3010,6 +3035,14 @@ msgid "Instance"
msgstr "Instancia"
#: editor/filesystem_dock.cpp
+msgid "Add to favorites"
+msgstr "Agregar a favoritos"
+
+#: editor/filesystem_dock.cpp
+msgid "Remove from favorites"
+msgstr "Quitar de favoritos"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "Editar Dependencias..."
@@ -3017,19 +3050,33 @@ msgstr "Editar Dependencias..."
msgid "View Owners..."
msgstr "Ver Dueños..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "Renombrar..."
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "Duplicar..."
#: editor/filesystem_dock.cpp
-#, fuzzy
+msgid "Move To..."
+msgstr "Mover A..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
-msgstr "Nuevo Script"
+msgstr "Nuevo Script.."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "Guardar Recurso Como..."
+msgstr "Nuevo Recurso..."
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr "Expandir Todos"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr "Colapsar Todos"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3051,14 +3098,12 @@ msgid "Re-Scan Filesystem"
msgstr "Reexaminar Sistema de Archivos"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "Act/Desact. estado de carpeta como Favorito"
+msgid "Toggle split mode"
+msgstr "Act/Desact. Modo Partido"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Show current scene file."
-msgstr "Seleccionar sub-tile editado actualmente."
+msgid "Search files"
+msgstr "Buscar archivos"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
@@ -3066,15 +3111,6 @@ msgstr ""
"Instanciar la(s) escena(s) seleccionadas como hijas del nodo seleccionado."
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "Buscar Clases"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3082,51 +3118,37 @@ msgstr ""
"Examinando Archivos,\n"
"Aguardá, por favor."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "Mover"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "There is already file or folder with the same name in this location."
-msgstr "Ya hay una carpeta en esta ruta con el nombre especificado."
+msgstr "Ya hay un archivo o carpeta con el mismo nombre en esta ubicación."
#: editor/filesystem_dock.cpp
msgid "Overwrite"
-msgstr ""
+msgstr "Sobreescribir"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Crear Script"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find in files"
-msgstr "Encontrar tile"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find: "
-msgstr "Encontrar"
+msgid "Find in Files"
+msgstr "Buscar en archivos"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Whole words"
-msgstr "Palabras Completas"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "Coincidir Mayúsculas/Minúsculas"
+msgid "Find:"
+msgstr "Buscar:"
#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "Carpeta:"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Filter: "
-msgstr "Filtro:"
+msgid "Filters:"
+msgstr "Filtros:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3142,52 +3164,48 @@ msgid "Cancel"
msgstr "Cancelar"
#: editor/find_in_files.cpp
-#, fuzzy
+msgid "Find: "
+msgstr "Encontrar: "
+
+#: editor/find_in_files.cpp
msgid "Replace: "
-msgstr "Reemplazar"
+msgstr "Reemplazar: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace all (no undo)"
-msgstr "Reemplazar Todo"
+msgstr "Reemplazar todo (no se puede deshacer)"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Searching..."
-msgstr "Guardando..."
+msgstr "Buscando..."
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Search complete"
-msgstr "Texto de Búsqueda"
+msgstr "Búsqueda completa"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group name already exists."
-msgstr "ERROR: El nombre de animación ya existe!"
+msgstr "El nombre del grupo ya existe."
#: editor/groups_editor.cpp
-#, fuzzy
-msgid "invalid Group name."
-msgstr "Nombre inválido."
+msgid "Invalid group name."
+msgstr "Nombre de grupo inválido."
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Grupos"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes not in Group"
-msgstr "Grupo(s) de Nodos"
+msgstr "Nodos fuera del Grupo"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
msgid "Filter nodes"
msgstr "Filtrar nodos"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes in Group"
-msgstr "Grupo(s) de Nodos"
+msgstr "Nodos dentro del Grupo"
#: editor/groups_editor.cpp
msgid "Add to Group"
@@ -3198,9 +3216,8 @@ msgid "Remove from Group"
msgstr "Quitar del Grupo"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Manage Groups"
-msgstr "Grupos de Imágenes"
+msgstr "Administrar Grupos"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Single Scene"
@@ -3307,18 +3324,13 @@ msgstr "Reimportar"
msgid "Failed to load resource."
msgstr "Fallo al cargar recurso."
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "Ok"
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
-msgstr "Expandir todas las propiedades"
+msgid "Expand All Properties"
+msgstr "Expandir Todas las Propiedades"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
-msgstr "Colapsar todas las propiedades"
+msgid "Collapse All Properties"
+msgstr "Colapsar Todas las Propiedades"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -3334,9 +3346,8 @@ msgid "Paste Params"
msgstr "Pegar Parámetros"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Edit Resource Clipboard"
-msgstr "Clipboard de Recursos vacío!"
+msgstr "Editar Portapapeles de Recursos"
#: editor/inspector_dock.cpp
msgid "Copy Resource"
@@ -3363,6 +3374,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "Cargar un recurso existente desde disco y editarlo."
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "Guardar el recurso editado actualmente."
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "Ir al anterior objeto editado en el historial."
@@ -3379,9 +3394,8 @@ msgid "Object properties."
msgstr "Propiedades del objeto."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Filter properties"
-msgstr "Filtrar nodos"
+msgstr "Filtrar propiedades"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
@@ -3396,47 +3410,40 @@ msgid "Select a Node to edit Signals and Groups."
msgstr "Seleccionar un Nodo para editar Señales y Grupos."
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Edit a Plugin"
-msgstr "Editar Polígono"
+msgstr "Editar un Plugin"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Create a Plugin"
-msgstr "Crear solución en C#"
+msgstr "Crear un Plugin"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Plugin Name:"
-msgstr "Lista de Plugins:"
+msgstr "Nombre del Plugin:"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
-msgstr ""
+msgstr "Subcarpeta:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Language:"
-msgstr "Lenguaje"
+msgstr "Lenguaje:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Script Name:"
-msgstr "Script válido"
+msgstr "Nombre del Script:"
#: editor/plugin_config_dialog.cpp
msgid "Activate now?"
-msgstr ""
+msgstr "Activar ahora?"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
msgstr "Crear Polígono"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+msgid "Edit Polygon"
msgstr "Editar Polígono"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3444,34 +3451,33 @@ msgid "Insert Point"
msgstr "Insertar Punto"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr "Editar Polígono (Remover Punto)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+msgid "Remove Polygon And Point"
msgstr "Remover Polígono y Punto"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "Crear un nuevo polígono desde cero"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr "Crear puntos."
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
-"Editar polígono existente:\n"
-"Click izq: Mover Punto.\n"
-"Ctrl+Click izq: Dividir Segmento.\n"
-"Click der: Eliminar Punto."
+"Editar puntos:\n"
+"Click izq: Mover Punto\n"
+"Click der: Eliminar Punto"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
-msgstr "Eliminar puntos"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr "Borrar puntos."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3486,14 +3492,15 @@ msgstr "Agregar Animación"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
-msgstr "Cargar"
+msgid "Load..."
+msgstr "Cargar.."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "This type of node can't be used. Only root nodes are allowed."
msgstr ""
+"Este tipo de nodo no puede ser usado. Solo los nodos raíz están permitidos."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3503,73 +3510,65 @@ msgid ""
"AnimationTree is inactive.\n"
"Activate to enable playback, check node warnings if activation fails."
msgstr ""
+"El AnimationTree esta inactivo.\n"
+"Activalo para habilitar la reproducción, revisá las advertencias de nodo si "
+"la activación falla."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Set the blending position within the space"
-msgstr ""
+msgstr "Asignar la posición de blending dentro del espacio"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Select and move points, create points with RMB."
-msgstr ""
+msgstr "Seleccionar y mover puntos, crear puntos con click derecho."
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Eliminar puntos"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "Click Der.: Borrar Punto."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr "Activar snap y mostrar grilla."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Point"
-msgstr "Mover Punto"
+msgstr "Punto"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Open Animation Node"
-msgstr "Nodo de Animación"
+msgstr "Abrir Nodo de Animación"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists"
-msgstr "La acción '%s' ya existe!"
+msgstr "El triángulo ya existe"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "BlendSpace2D does not belong to an AnimationTree node."
-msgstr ""
+msgstr "BlendSpace2D no pertenece a un nodo AnimationTree."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "No triangles exist, so no blending can take place."
-msgstr ""
+msgstr "No hay ningún triángulo, así que no se puede hacer blending."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create triangles by connecting points."
-msgstr ""
+msgstr "Crear triángulos conectando puntos."
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Erase points and triangles."
-msgstr "Parseando %d Triángulos:"
+msgstr "Borrar puntos y triángulos."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Generate blend triangles automatically (instead of manually)"
-msgstr ""
+msgstr "Generar triángulos de blending automáticamente (en vez de manualmente)"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr "Esnapear"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Blend:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3578,20 +3577,26 @@ msgstr "Editar Filtros"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Output node can't be added to the blend tree."
-msgstr ""
+msgstr "El nodo de salida no puede ser agregado al blend tree."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Unable to connect, port may be in use or connection may be invalid."
msgstr ""
+"No se pudo conectar, el puerto podría estar en uso o la conexión ser "
+"inválida."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
msgstr ""
+"No se asigno ningún reproductor de animación, así que no se pudieron obtener "
+"los nombres de las pistas."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Player path set is invalid, so unable to retrieve track names."
msgstr ""
+"La ruta de reproductor asignada es inválida, así que no se pudieron obtener "
+"los nombres de las pistas."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
@@ -3599,23 +3604,22 @@ msgid ""
"Animation player has no valid root node path, so unable to retrieve track "
"names."
msgstr ""
+"El reproductor de animación no tiene una ruta válida a un nodo raíz, así que "
+"no se pudieron obtener los nombres de las pistas."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Add Node.."
-msgstr "Agregar Nodo"
+msgid "Add Node..."
+msgstr "Agregar Nodo..."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filtered Tracks:"
-msgstr "Editar Filtros"
+msgstr "Editar Pistas Filtradas:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Enable filtering"
-msgstr "Hijos Editables"
+msgstr "Habilitar filtrado"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
@@ -3643,14 +3647,12 @@ msgid "Remove Animation"
msgstr "Quitar Animación"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Invalid animation name!"
-msgstr "ERROR: Nombre de animación inválido!"
+msgstr "Nombre de animación inválido!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Animation name already exists!"
-msgstr "ERROR: El nombre de animación ya existe!"
+msgstr "El nombre de animación ya existe!"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -3674,14 +3676,12 @@ msgid "Duplicate Animation"
msgstr "Duplicar Animación"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to copy!"
-msgstr "ERROR: No hay animaciones para copiar!"
+msgstr "No hay animaciones para copiar!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation resource on clipboard!"
-msgstr "ERROR: No hay recursos de animación en el portapapeles!"
+msgstr "No hay recursos de animación en el portapapeles!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
@@ -3692,9 +3692,8 @@ msgid "Paste Animation"
msgstr "Pegar Animación"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to edit!"
-msgstr "ERROR: No hay aniación que editar!"
+msgstr "No hay animación que editar!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
@@ -3740,14 +3739,12 @@ msgid "New"
msgstr "Nuevo"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Transitions..."
-msgstr "Editar Conecciones..."
+msgstr "Editar Transiciones..."
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Open in Inspector"
-msgstr "Abrir en Editor"
+msgstr "Abrir en el Inspector"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Display list of animations in player."
@@ -3775,7 +3772,7 @@ msgstr "Pasado"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Future"
-msgstr "Futuro"
+msgstr "Posterior"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Depth"
@@ -3806,9 +3803,8 @@ msgid "Include Gizmos (3D)"
msgstr "Incluir Gizmos (3D)"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Pin AnimationPlayer"
-msgstr "Pegar Animación"
+msgstr "Pinear el AnimationPlayer"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Create New Animation"
@@ -3839,34 +3835,32 @@ msgid "Cross-Animation Blend Times"
msgstr "Cross-Animation Blend Times"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "End"
-msgstr "Fin(es)"
+msgstr "Fin"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Immediate"
-msgstr ""
+msgstr "Inmediata"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Sync"
-msgstr ""
+msgstr "Sincro"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "At End"
-msgstr ""
+msgstr "Al Final"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Travel"
-msgstr ""
+msgstr "Viaje"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Start and end nodes are needed for a sub-transition."
-msgstr ""
+msgstr "El comienzo y fin de los nodos son necesarios para una sub-transicion."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "No playback resource set at path: %s."
-msgstr "No está en la ruta de recursos."
+msgstr "Ningún recurso de reproducción asignado en la ruta: %s."
#: editor/plugins/animation_state_machine_editor.cpp
msgid ""
@@ -3874,34 +3868,36 @@ msgid ""
"RMB to add new nodes.\n"
"Shift+LMB to create connections."
msgstr ""
+"Seleccionar y mover nodos.\n"
+"Click der. para agregar nuevos nodos.\n"
+"Shift+click izq. para crear conexiones."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "Crear Nuevo %s"
+msgstr "Crear nuevos nodos."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Connect nodes."
-msgstr "Conectar Nodos"
+msgstr "Conectar nodos."
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
-msgstr "Quitar la pista seleccionada."
+msgid "Remove selected node or transition."
+msgstr "Quitar el nodo o transición seleccionado/a"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
msgstr ""
+"Act./Desact. reproducción automática de esta animación al comenzar, "
+"reiniciar o hacer seek hasta el cero."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set the end animation. This is useful for sub-transitions."
-msgstr ""
+msgstr "Asignar la animación de fin. Esto es útil para sub-transiciones."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "Transición"
+msgstr "Transición: "
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3955,10 +3951,6 @@ msgid "Amount:"
msgstr "Cantidad:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "Blend:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "Blend 0:"
@@ -4099,14 +4091,12 @@ msgid "Asset Download Error:"
msgstr "Error de Descarga del Asset:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading (%s / %s)..."
-msgstr "Descargando"
+msgstr "Descargando (%s / %s)..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading..."
-msgstr "Descargando"
+msgstr "Descargando..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Resolving..."
@@ -4133,14 +4123,12 @@ msgid "Download for this asset is already in progress!"
msgstr "La descarga de este asset ya está en progreso!"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "First"
-msgstr "primero"
+msgstr "Primero"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Previous"
-msgstr "Pestaña anterior"
+msgstr "Anterior"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Next"
@@ -4148,7 +4136,7 @@ msgstr "Siguiente"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Last"
-msgstr ""
+msgstr "Ultimo"
#: editor/plugins/asset_library_editor_plugin.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -4160,7 +4148,7 @@ msgstr "Todos"
msgid "Plugins"
msgstr "Plugins"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "Ordenar:"
@@ -4187,7 +4175,7 @@ msgstr "Oficial"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Testing"
-msgstr "Testeo"
+msgstr "Prueba"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Assets ZIP File"
@@ -4275,29 +4263,28 @@ msgid "Create new horizontal and vertical guides"
msgstr "Crear nuevas guías horizontales y verticales"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move pivot"
-msgstr "Mover Pivote"
+msgstr "Mover pivote"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Rotate CanvasItem"
-msgstr "Editar CanvasItem"
+msgstr "Rotar CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move anchor"
-msgstr "Mover Acción"
+msgstr "Mover ancla"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Resize CanvasItem"
-msgstr "Editar CanvasItem"
+msgstr "Redimensionar CanvasItem"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr "Escalar CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move CanvasItem"
-msgstr "Editar CanvasItem"
+msgstr "Mover CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -4316,19 +4303,18 @@ msgid "Paste Pose"
msgstr "Pegar Pose"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "Zoom Out"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom reset"
-msgstr "Resetear Zoom"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
+"Advertencia: El tamaño y posición de los hijos de un contenedor es "
+"determinado solo por su padre."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Zoom In"
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
+msgstr "Reset de Zoom"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
@@ -4361,6 +4347,10 @@ msgid "Rotate Mode"
msgstr "Modo Rotar"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr "Modo de Escalado"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4378,18 +4368,16 @@ msgid "Pan Mode"
msgstr "Modo Paneo"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle snapping."
-msgstr "Act/Desact. alineado"
+msgstr "Act/Desact. alineado."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Snap"
msgstr "Usar Snap"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snapping Options"
-msgstr "Opciones de alineado"
+msgstr "Opciones de Alineado"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to grid"
@@ -4426,12 +4414,11 @@ msgstr "Alinear al ancla de nodo"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to node sides"
-msgstr "Alinear a lados de nodo"
+msgstr "Alinear a los lados del nodo"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to node center"
-msgstr "Alinear al ancla de nodo"
+msgstr "Alinear al centro del nodo"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to other nodes"
@@ -4460,6 +4447,10 @@ msgid "Restores the object's children's ability to be selected."
msgstr "Restaurar la habilidad de seleccionar los hijos de un objeto."
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr "Opciones de Esqueleto"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "Mostrar Huesos"
@@ -4473,12 +4464,11 @@ msgstr "Reestrablecer Cadena IK"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make Custom Bone(s) from Node(s)"
-msgstr ""
+msgstr "Crear Hueso(s) Personalizados a partir de Nodo(s)"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Custom Bones"
-msgstr "Restablecer Huesos"
+msgstr "Restablecer Huesos Personalizados"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -4511,6 +4501,10 @@ msgid "Show Viewport"
msgstr "Mostrar Viewport"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr "Mostrar Grupo Y Bloquear Iconos"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr "Centrar Selección"
@@ -4523,9 +4517,8 @@ msgid "Layout"
msgstr "Layout"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Insert keys."
-msgstr "Insertar Claves"
+msgstr "Insertar claves."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
@@ -4541,11 +4534,11 @@ msgstr "Restablecer Pose"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Multiply grid step by 2"
-msgstr "Multiplicar ingremento de grilla por 2"
+msgstr "Multiplicar step de grilla por 2"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Divide grid step by 2"
-msgstr "Dividir incremento de grilla por 2"
+msgstr "Dividir step de grilla por 2"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Add %s"
@@ -4582,17 +4575,24 @@ msgstr ""
"Drag & drop + Alt : Cambiar tipo de nodo"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr "Crear Poly3D"
+msgid "Create Polygon3D"
+msgstr "Crear Polygon3D"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Editar Polígono"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Editar Polígono (Remover Punto)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
msgstr "Setear Handle"
#: editor/plugins/cpu_particles_editor_plugin.cpp
-#, fuzzy
msgid "CPUParticles"
-msgstr "Partículas"
+msgstr "CPUParticles"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
@@ -4685,37 +4685,9 @@ msgid "Item List Editor"
msgstr "Editor de Lista de Items"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"No hay ningún recurso OccluderPolygon2D en este nodo.\n"
-"Crear y asignar uno?"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr "Crear Polígono Oclusor"
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr "Crear un nuevo polígono de cero."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "Editar polígono existente:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "Click. Izq: Mover Punto."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr "Ctrl+Click Izq.: Partir Segmento en Dos."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "Click Der.: Borrar Punto."
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr "El Mesh está vacío!"
@@ -4754,7 +4726,7 @@ msgstr "Fallo el UV Unwrap, la mesh podria no ser manifold?"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "No mesh to debug."
-msgstr "No hay meshes para debuguear."
+msgstr "No hay meshes para depurar."
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/sprite_editor_plugin.cpp
@@ -4948,13 +4920,13 @@ msgid "Populate"
msgstr "Poblar"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr "Crear Polígono de Navegación"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr "Generando AABB"
+msgid "Generating Visibility Rect"
+msgstr "Generando Rect. de Visibilidad"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -4983,6 +4955,11 @@ msgstr "Limpiar Máscara de Emisión"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr "Convertir A CPUParticles"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr "Partículas"
@@ -5052,13 +5029,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr "Se requiere un material procesador de tipo 'ParticlesMaterial'."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
-msgstr "Generar AABB"
+msgid "Generating AABB"
+msgstr "Generando AABB"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "Convertir A Mayúscula"
+msgid "Generate AABB"
+msgstr "Generar AABB"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5082,6 +5058,10 @@ msgid "Add Point to Curve"
msgstr "Agregar Punto a Curva"
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr "Partir Curva"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr "Mover Punto en Curva"
@@ -5109,6 +5089,10 @@ msgid "Click: Add Point"
msgstr "Click: Agregar Punto"
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr "Click Izquierdo: Partir Segmento (en curva)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr "Click Derecho: Eliminar Punto"
@@ -5124,11 +5108,6 @@ msgstr "Agregar Punto (en espacio vacío)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr "Partir Segmento (en curva)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "Eliminar Punto"
@@ -5146,12 +5125,12 @@ msgstr "Opciones"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Angles"
-msgstr ""
+msgstr "Manejadores de Ãngulos de Espejo"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Lengths"
-msgstr ""
+msgstr "Manejadores de Tamaño de Espejo"
#: editor/plugins/path_editor_plugin.cpp
msgid "Curve Point #"
@@ -5185,65 +5164,78 @@ msgstr "Quitar Punto Out-Control"
msgid "Remove In-Control Point"
msgstr "Quitar Punto In-Control"
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Partir Segmento (en curva)"
+
#: editor/plugins/physical_bone_plugin.cpp
-#, fuzzy
msgid "Move joint"
-msgstr "Mover Punto"
+msgstr "Mover unión"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
-msgstr ""
+msgstr "La propiedad esqueleto del Polygon2D no apunta a un nodo Skeleton2D"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Sync bones"
-msgstr "Mostrar Huesos"
+msgid "Sync Bones"
+msgstr "Sincronizar Huesos"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+"Sin textura en este nodo.\n"
+"Asigná una textura para poder editar el UV."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr "Crear Mapa UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon & UV"
-msgstr "Crear Polígono"
+msgstr "Crear Polígono y UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "Crear nueva guía horizontal"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "La acción '%s' ya existe!"
+msgid "Remove Internal Vertex"
+msgstr "Quitar Punto In-Control"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Add Split"
-msgstr "Agregar punto"
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "Ruta inválida!"
+msgid "Add Custom Polygon"
+msgstr "Editar Polígono"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Quitar punto"
+msgid "Remove Custom Polygon"
+msgstr "Remover Polígono y Punto"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr "Transformar Mapa UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
-msgstr ""
+msgid "Transform Polygon"
+msgstr "Transformar Polígono"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
+msgstr "Pintar Peso de Huesos"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Open Polygon 2D UV editor."
+msgstr "Abrir editor UV de Polígonos 2D."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
@@ -5251,31 +5243,25 @@ msgstr "Editor UV de Polígonos 2D"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "UV"
-msgstr ""
+msgstr "UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "Editar Polígono"
+msgid "Points"
+msgstr "Punto"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Splits"
-msgstr "Partir Path"
+msgid "Polygons"
+msgstr "Polígono->UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Bones"
-msgstr "Crear Huesos"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Create Polygon"
-msgstr "Crear Polígono"
+msgstr "Huesos"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
-msgstr "Mover Punto"
+msgid "Move Points"
+msgstr "Mover Puntos"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
@@ -5302,25 +5288,26 @@ msgid "Scale Polygon"
msgstr "Escalar Polígono"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "Selecciona un ítem primero!"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
-msgstr ""
+msgid "Paint weights with specified intensity."
+msgstr "Pintar pesos con la intensidad especificada."
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
-msgstr ""
+msgid "Unpaint weights with specified intensity."
+msgstr "Despintar pesos con la intensidad especificada."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Radius:"
-msgstr ""
+msgstr "Radio:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon->UV"
@@ -5335,9 +5322,13 @@ msgid "Clear UV"
msgstr "Limpiar UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Settings"
-msgstr "Ajustes de GridMap"
+msgstr "Ajustes de Grilla"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "Esnapear"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
@@ -5348,34 +5339,28 @@ msgid "Grid"
msgstr "Grilla"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Configure Grid:"
-msgstr "Configurar Snap"
+msgstr "Configurar Grilla:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset X:"
-msgstr "Offset de Grilla:"
+msgstr "Offset de Grilla en X:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset Y:"
-msgstr "Offset de Grilla:"
+msgstr "Offset de Grilla en Y:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step X:"
-msgstr "Step de Grilla:"
+msgstr "Step de Grilla en X:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step Y:"
-msgstr "Step de Grilla:"
+msgstr "Step de Grilla en Y:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Sync Bones to Polygon"
-msgstr "Escalar Polígono"
+msgstr "Sincronizar Huesos con el Polígono"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "ERROR: Couldn't load resource!"
@@ -5403,22 +5388,22 @@ msgid "Paste Resource"
msgstr "Pegar Recurso"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "Abrir en Editor"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr "Instancia:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr "Tipo:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Abrir en Editor"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr "Cargar Recurso"
@@ -5429,12 +5414,11 @@ msgstr "ResourcePreloader"
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "AnimationTree has no path set to an AnimationPlayer"
-msgstr ""
+msgstr "El AnimationTree no tiene una ruta asignada a un AnimationPlayer"
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Path to AnimationPlayer is invalid"
-msgstr "El árbol de animación es inválido."
+msgstr "La ruta al AnimationPlayer es inválida"
#: editor/plugins/script_editor_plugin.cpp
msgid "Clear Recent Files"
@@ -5445,56 +5429,62 @@ msgid "Close and save changes?"
msgstr "¿Cerrar y guardar cambios?"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error writing TextFile:"
-msgstr "Error al mover el archivo:\n"
+msgstr "Error al escribir el TextFile:"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr "Error: no se pudo cargar el archivo."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error could not load file."
-msgstr "No se pudo cargar la imagen"
+msgstr "Error no se pudo cargar el archivo."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error saving file!"
-msgstr "Error guardando TileSet!"
+msgstr "Error guardando archivo!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr "Error al guardar el tema"
+msgid "Error while saving theme."
+msgstr "Error al guardar el tema."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
-msgstr "Error al guardar"
+msgid "Error Saving"
+msgstr "Error al Guardar"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr "Error al importar el tema"
+msgid "Error importing theme."
+msgstr "Error al importar el tema."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
-msgstr "Error al importar"
+msgid "Error Importing"
+msgstr "Error al Importar"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New TextFile..."
-msgstr "Nueva Carpeta..."
+msgstr "Nuevo TextFile..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open File"
-msgstr "Abrir un Archivo"
+msgstr "Abrir Archivo"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Save File As..."
-msgstr "Guardar Como..."
+msgstr "Guardar Archivo Como..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme"
msgstr "Importar Tema"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Error al guardar el tema"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Error al guardar"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr "Guardar Tema Como..."
@@ -5504,7 +5494,7 @@ msgstr " Referencia de Clases"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
-msgstr ""
+msgstr "Alternar la ordenación alfabética de la lista de métodos."
#: editor/plugins/script_editor_plugin.cpp
msgid "Sort"
@@ -5535,9 +5525,8 @@ msgid "File"
msgstr "Archivo"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "New TextFile"
-msgstr "Ver Archivos"
+msgid "Open..."
+msgstr "Abrir..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5552,11 +5541,7 @@ msgid "Copy Script Path"
msgstr "Copiar Ruta de Script"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr "Mostrar en Sistema de Archivos"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+msgid "History Previous"
msgstr "Previo en Historial"
#: editor/plugins/script_editor_plugin.cpp
@@ -5569,6 +5554,10 @@ msgid "Theme"
msgstr "Tema"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme..."
+msgstr "Importar Tema..."
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
msgstr "Recargar Tema"
@@ -5577,10 +5566,6 @@ msgid "Save Theme"
msgstr "Guardar Tema"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "Guardar Tema Como"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "Cerrar Docs"
@@ -5624,21 +5609,17 @@ msgstr "Continuar"
#: editor/plugins/script_editor_plugin.cpp
msgid "Keep Debugger Open"
-msgstr "Mantener el Debugger Abierto"
+msgstr "Mantener el Depurador Abierto"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
-msgstr "Debuguear con editor externo"
+msgid "Debug with External Editor"
+msgstr "Depurar con Editor Externo"
#: editor/plugins/script_editor_plugin.cpp
msgid "Open Godot online documentation"
msgstr "Abrir la documentación online de Godot"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr "Buscar en la jerarquía de clases."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Buscar en la documentación de referencia."
@@ -5672,42 +5653,35 @@ msgstr "Volver a Guardar"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Debugger"
-msgstr "Debugger"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search results"
-msgstr "Buscar en la Ayuda"
+msgstr "Depurador"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "Buscar Clases"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-"Los scripts built-in sólo pueden ser editados cuando la escena a la que "
-"pertenecen está cargada"
+msgid "Search Results"
+msgstr "Resultados de la Búsqueda"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Line"
-msgstr "Linea:"
+msgstr "Línea"
#: editor/plugins/script_text_editor.cpp
msgid "(ignore)"
-msgstr ""
+msgstr "(ignorar)"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function"
+msgstr "Ir a Función"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr "Estándar"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr "Solo se pueden depositar recursos del sistema de archivos."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Lookup Symbol"
-msgstr "Completar Símbolo"
+msgstr "Buscar Símbolo"
#: editor/plugins/script_text_editor.cpp
msgid "Pick Color"
@@ -5731,11 +5705,7 @@ msgstr "Capitalizar"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Syntax Highlighter"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
+msgstr "Resaltador de sintaxis"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
@@ -5788,12 +5758,12 @@ msgid "Trim Trailing Whitespace"
msgstr "Eliminar Espacios Sobrantes al Final"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr "Convertir Indentación En Espacios"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
-msgstr "Convertir Indentación En Tabs"
+msgid "Convert Indent to Tabs"
+msgstr "Convertir Indentación En Tabulaciones"
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
@@ -5809,36 +5779,27 @@ msgid "Remove All Breakpoints"
msgstr "Quitar Todos los Breakpoints"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr "Ir a Próximo Breakpoint"
+msgid "Go to Next Breakpoint"
+msgstr "Ir al Breakpoint Siguiente"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr "Ir a Anterior Breakpoint"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr "Convertir A Mayúscula"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr "Convertir A Minúscula"
+msgid "Go to Previous Breakpoint"
+msgstr "Ir al Breakpoint Anterior"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr "Encontrar Anterior"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Find in files..."
-msgstr "Filtrar Archivos..."
+msgid "Find in Files..."
+msgstr "Buscar en Archivos..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+msgid "Go to Function..."
msgstr "Ir a Función..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+msgid "Go to Line..."
msgstr "Ir a Línea..."
#: editor/plugins/script_text_editor.cpp
@@ -5851,40 +5812,35 @@ msgstr "Shader"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "This skeleton has no bones, create some children Bone2D nodes."
-msgstr ""
+msgstr "Este esqueleto no tiene huesos, crea algunos nodos Bone2D hijos."
#: editor/plugins/skeleton_2d_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton2D"
-msgstr "Esqueleto..."
+msgstr "Skeleton2D"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Make Rest Pose (From Bones)"
-msgstr ""
+msgstr "Crear Pose de Descanso"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Set Bones to Rest Pose"
-msgstr ""
+msgstr "Setear Huesos a la Pose de Descanso"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical bones"
-msgstr "Crear Mesh de Navegación"
+msgstr "Crear huesos físicos"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton"
-msgstr "Esqueleto..."
+msgstr "Esqueleto"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical skeleton"
-msgstr "Crear solución en C#"
+msgstr "Crear esqueleto físico"
#: editor/plugins/skeleton_ik_editor_plugin.cpp
-#, fuzzy
msgid "Play IK"
-msgstr "Reproducir"
+msgstr "Reproducir IK"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Orthogonal"
@@ -5935,6 +5891,14 @@ msgid "Animation Key Inserted."
msgstr "Clave de Animación Insertada."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr "Altura"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr "Yaw"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr "Objetos Dibujados"
@@ -6019,9 +5983,8 @@ msgid "This operation requires a single selected node."
msgstr "Esta operación requiere un solo nodo seleccionado."
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Lock View Rotation"
-msgstr "Ver Información"
+msgstr "Trabar Rotación de Vista"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Normal"
@@ -6068,9 +6031,8 @@ msgid "Doppler Enable"
msgstr "Activar Doppler"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Cinematic Preview"
-msgstr "Creando Vistas Previas de Mesh/es"
+msgstr "Vista Previa Cinemática"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
@@ -6101,6 +6063,10 @@ msgid "Freelook Speed Modifier"
msgstr "Modificador de Velocidad de Vista Libre"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "Rotación de Vista Trabada"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "Dialogo XForm"
@@ -6203,21 +6169,16 @@ msgid "Tool Scale"
msgstr "Herramienta Escalar"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap To Floor"
-msgstr "Alinear a la grilla"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Act./Desact. Vista Libre"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform"
-msgstr "Transformar"
+msgstr "Transform"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap object to floor"
-msgstr ""
+msgstr "Ajustar objeto al suelo"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Dialog..."
@@ -6248,9 +6209,8 @@ msgid "4 Viewports"
msgstr "4 Viewports"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Gizmos"
-msgstr "Ver Gizmos"
+msgstr "Gizmos"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Origin"
@@ -6325,52 +6285,49 @@ msgstr "Pre"
msgid "Post"
msgstr "Post"
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite is empty!"
-msgstr "La ruta de guardado esta vacía!"
+msgstr "El sprite esta vacío!"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Can't convert a sprite using animation frames to mesh."
-msgstr ""
+msgstr "No se puede convertir a mesh un sprite que usa frames de animación."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't replace by mesh."
-msgstr ""
+msgstr "Geometría inválida, no se puede reemplazar por mesh."
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite"
-msgstr "SpriteFrames"
+msgstr "Sprite"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to 2D Mesh"
-msgstr "Convertir A %s"
+msgstr "Convertir A Mesh 2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create 2D Mesh"
-msgstr "Crear Outline Mesh"
+msgstr "Crear Mesh 2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Simplification: "
-msgstr ""
+msgstr "Simplificación: "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Grow (Pixels): "
-msgstr "Snap (Pixeles):"
+msgstr "Crecer (Pixeles): "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Update Preview"
-msgstr "Vista Previa de Atlas"
+msgstr "Actualizar Vista Previa"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Settings:"
-msgstr "Configuración"
+msgstr "Configuración:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
@@ -6445,12 +6402,17 @@ msgid "Set Region Rect"
msgstr "Setear Region Rect"
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr "Asignar Margen"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr "Modo Snap:"
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
-msgstr "<Ninguno>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
+msgstr "Ninguno"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Pixel Snap"
@@ -6474,10 +6436,9 @@ msgstr "Paso:"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Sep.:"
-msgstr ""
+msgstr "Sep.:"
#: editor/plugins/texture_region_editor_plugin.cpp
-#, fuzzy
msgid "TextureRegion"
msgstr "Región de Textura"
@@ -6610,9 +6571,12 @@ msgid "Erase Selection"
msgstr "Eliminar Selección"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Fix Invalid Tiles"
-msgstr "Nombre inválido."
+msgstr "Corregir Tiles Inválidos"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Cut Selection"
+msgstr "Cortar Selección"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
@@ -6635,9 +6599,8 @@ msgid "Erase TileMap"
msgstr "Borrar TileMap"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Find Tile"
-msgstr "Encontrar tile"
+msgstr "Encontrar Tile"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Transpose"
@@ -6660,35 +6623,36 @@ msgid "Pick Tile"
msgstr "Elegir Tile"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
-msgid "Move Selection"
-msgstr "Quitar Selección"
+msgid "Copy Selection"
+msgstr "Copiar Selección"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr "Rotar 0 grados"
+msgid "Rotate left"
+msgstr "Rotar a la izquierda"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr "Rotar 90 grados"
+msgid "Rotate right"
+msgstr "Rotar a la derecha"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
-msgstr "Rotar 180 grados"
+msgid "Flip horizontally"
+msgstr "Espejar horizontalmente"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
-msgstr "Rotar 270 grados"
+msgid "Flip vertically"
+msgstr "Espejar verticalmente"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Clear transform"
+msgstr "Reestablecer transform"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Add Texture(s) to TileSet"
-msgstr "Agregar Nodo(s) Desde Arbol"
+msgid "Add Texture(s) to TileSet."
+msgstr "Agregar Textura(s) al TileSet."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Remove current Texture from TileSet"
-msgstr "Quitar ingreso actual"
+msgid "Remove selected Texture from TileSet."
+msgstr "Quitar Textura seleccionada del TileSet."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -6699,104 +6663,224 @@ msgid "Merge from Scene"
msgstr "Mergear desde Escena"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
-msgstr ""
-"Selectionar sub-tile para usar como icono, esta también sera usada en "
-"bindings inválidos de autotile."
+msgid "Copy bitmask."
+msgstr "Copiar bitmask."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
-msgstr ""
+msgid "Paste bitmask."
+msgstr "Pegar bitmask."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
-msgstr ""
+msgid "Erase bitmask."
+msgstr "Borrar bitmask."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new polygon."
+msgstr "Crear un nuevo polígono."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr "Mantener el polígono dentro del region Rect."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
+msgstr "Activar snap y mostrar grilla (configurable via el Inspector)."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr "Mostrar Nombres de Tiles (mantener Tecla Alt)"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "¿Quitar Textura Seleccionada y TODOS LOS TILES que la usen?"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
-msgstr ""
+msgstr "No elegiste una textura para remover."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
-msgstr "¿Crear desde escena?"
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
msgstr "¿Mergear desde escena?"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
-msgstr ""
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Remover Plantilla"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
+msgstr "%s archivo(s) no fueron agregados porque ya estaban en la lista."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Drag handles to edit Rect.\n"
"Click on another Tile to edit it."
msgstr ""
+"Tirar de las asas para editar el Rect.\n"
+"Click en otro Tile para editarlo."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete selected Rect."
+msgstr "Eliminar el Rect seleccionado."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
-"Click izq: Activar bit.\n"
-"Click der: Desactivar bit."
+"Seleccionar sub-tile editado actualmente.\n"
+"Click en otro Tile para editarlo."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete polygon."
+msgstr "Eliminar polígono."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
-msgstr "Seleccionar sub-tile editado actualmente."
+msgstr ""
+"Click izq: Activar bit.\n"
+"Click der: Desactivar bit.\n"
+"Click en otro Tile para editarlo."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to use as icon, this will be also used on invalid autotile "
"bindings.\n"
"Click on another Tile to edit it."
msgstr ""
-"Selectionar sub-tile para usar como icono, esta también sera usada en "
-"bindings inválidos de autotile."
+"Selectionar sub-tile para usar como ícono, este también sera usado en "
+"bindings inválidos de autotile.\n"
+"Click en otro Tile para editarlo."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to change its priority.\n"
"Click on another Tile to edit it."
-msgstr "Seleccionar sub-tile para cambiar su prioridad."
+msgstr ""
+"Seleccionar sub-tile para cambiar su prioridad.\n"
+"Click en otro Tile para editarlo."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+"Seleccionar sub-tile para cambiar su z index.\n"
+"Click en otro Tile para editarlo."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Set Tile Region"
+msgstr "Setear Region Rect"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid "Create Tile"
+msgstr "Crear Carpeta"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "Editar Filtros"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Editar polígono existente:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Editar Polígono"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Crear Polígono de Navegación"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "Pegar bitmask."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Remover Plantilla"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "Remover Polígono y Punto"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "Crear Polígono Oclusor"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "Crear Polígono de Navegación"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "Editar Filtros"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Crear Polígono de Navegación"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Crear Polígono Oclusor"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "This property can't be changed."
-msgstr "Esta operación no puede hacerse sin una escena."
+msgstr "Esta propiedad no se puede cambiar."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
-msgstr "Tile Set"
+msgid "TileSet"
+msgstr "TileSet"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vertex"
-msgstr "Vértices"
+msgstr "Vértice"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Fragment"
msgstr "Fragmento"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Light"
-msgstr "Derecha"
+msgstr "Luz"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "VisualShader"
-msgstr "Shader"
+msgstr "VisualShader"
#: editor/project_export.cpp
msgid "Runnable"
@@ -6817,6 +6901,14 @@ msgstr ""
"corruptas:"
#: editor/project_export.cpp
+msgid "Release"
+msgstr "Release"
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr "Exportar Todo"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr "Presets"
@@ -6825,6 +6917,10 @@ msgid "Add..."
msgstr "Agregar..."
#: editor/project_export.cpp
+msgid "Export Path"
+msgstr "Ruta de Exportación"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr "Recursos"
@@ -6883,39 +6979,74 @@ msgid "Feature List:"
msgstr "Lista de Características:"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "Nuevo Script"
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "Modo de Exportación de Scipts:"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr "Texto"
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr "Compilado"
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "Encriptado (Proveer la Clave Debajo)"
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "Clave de Encriptación de Script (256-bits como hex):"
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr "Exportar PCK/Zip"
#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr "¿Modo de Exportación?"
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr "Exportar Todos"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr "Faltan las plantillas de exportación para esta plataforma:"
#: editor/project_export.cpp
msgid "Export With Debug"
-msgstr "Exportar Como Debug"
+msgstr "Exportar Con Depuración"
#: editor/project_manager.cpp
msgid "The path does not exist."
msgstr "La ruta no existe."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
msgstr ""
-"Por favor elegí una carpeta que no contenga un archivo 'project.godot'."
+"Archivo de projecto '.zip' inválido, no contiene un archivo 'project.godot'."
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "Por favor elegí una carpeta vacía."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "Por favor elegí un archivo 'project.godot'."
+msgstr "Por favor elegí un archivo 'project.godot' o '.zip'."
#: editor/project_manager.cpp
msgid "Directory already contains a Godot project."
-msgstr ""
+msgstr "El directorio ya contiene un proyecto de Godot."
#: editor/project_manager.cpp
msgid "Imported Project"
@@ -7006,9 +7137,8 @@ msgid "Project Path:"
msgstr "Ruta del Proyecto:"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Project Installation Path:"
-msgstr "Ruta del Proyecto:"
+msgstr "Ruta de Instalación del Proyecto:"
#: editor/project_manager.cpp
msgid "Browse"
@@ -7019,7 +7149,8 @@ msgid "Unnamed Project"
msgstr "Proyecto Sin Nombre"
#: editor/project_manager.cpp
-msgid "Can't open project"
+#, fuzzy
+msgid "Can't open project at '%s'."
msgstr "No se pudo abrir el proyecto"
#: editor/project_manager.cpp
@@ -7028,6 +7159,24 @@ msgstr "¿Estás seguro/a que quieres abrir más de un proyecto?"
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7133,13 +7282,12 @@ msgid "Mouse Button"
msgstr "Botón de Mouse"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid ""
"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
msgstr ""
"Nombre de acción inválido. No puede estar vacío o contener '/', ':', '=', "
-"'\\' o '\"'."
+"'\\' o '\"'"
#: editor/project_settings_editor.cpp
msgid "Action '%s' already exists!"
@@ -7150,18 +7298,16 @@ msgid "Rename Input Action Event"
msgstr "Renombrar Evento de Acción de Entrada"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Change Action deadzone"
-msgstr "Cambiar Nombre de Animación:"
+msgstr "Cambiar zona muerta de la Acción"
#: editor/project_settings_editor.cpp
msgid "Add Input Action Event"
msgstr "Agregar Evento de Acción de Entrada"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "All Devices"
-msgstr "Dispositivo"
+msgstr "Todos los Dispositivos"
#: editor/project_settings_editor.cpp
msgid "Device"
@@ -7208,24 +7354,20 @@ msgid "Wheel Down Button"
msgstr "Botón Rueda Abajo"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Left Button"
-msgstr "Botón Rueda Arriba"
+msgstr "Botón Rueda Izquierda"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Right Button"
-msgstr "Botón Derecho"
+msgstr "Botón Rueda Derecha"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 1"
-msgstr "Botón 6"
+msgstr "Botón X 1"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 2"
-msgstr "Botón 6"
+msgstr "Botón X 2"
#: editor/project_settings_editor.cpp
msgid "Joypad Axis Index:"
@@ -7367,17 +7509,13 @@ msgstr "Configuración de Proyecto (project.godot)"
msgid "General"
msgstr "General"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr "Propiedad:"
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr "Sobreescribir Para..."
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Editor must be restarted for changes to take effect"
-msgstr ""
+msgstr "Se debe reiniciar el editor para que los cambios surtan efecto"
#: editor/project_settings_editor.cpp
msgid "Input Map"
@@ -7393,7 +7531,7 @@ msgstr "Acción"
#: editor/project_settings_editor.cpp
msgid "Deadzone"
-msgstr ""
+msgstr "Zona muerta"
#: editor/project_settings_editor.cpp
msgid "Device:"
@@ -7429,7 +7567,7 @@ msgstr "Remapeos por Locale:"
#: editor/project_settings_editor.cpp
msgid "Locale"
-msgstr "Locale"
+msgstr "Idioma"
#: editor/project_settings_editor.cpp
msgid "Locales Filter"
@@ -7503,10 +7641,6 @@ msgstr "Seleccionar un Nodo"
msgid "Bit %d, val %d."
msgstr "Bit %d, val %d."
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr "Propiedades:"
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr "Seleccionar Propiedad"
@@ -7529,97 +7663,92 @@ msgstr ""
"No se pudo volver a cargar la imagen convertida usando la herramienta PVRTC:"
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Batch Rename"
-msgstr "Renombrar"
+msgstr "Renombrar en Masa"
#: editor/rename_dialog.cpp
msgid "Prefix"
-msgstr ""
+msgstr "Prefijo"
#: editor/rename_dialog.cpp
msgid "Suffix"
-msgstr ""
+msgstr "Sufijo"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Advanced options"
-msgstr "Opciones de alineado"
+msgstr "Opciones avanzadas"
#: editor/rename_dialog.cpp
msgid "Substitute"
-msgstr ""
+msgstr "Sustituir"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node name"
-msgstr "Nombre de Nodo:"
+msgstr "Nombre del Nodo"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
-msgstr ""
+msgstr "Nombre del padre del nodo, si está disponible"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node type"
-msgstr "Encontrar Tipo de Nodo"
+msgstr "Tipo de nodo"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Current scene name"
-msgstr "Escena Actual"
+msgstr "Nombre de la escena actual"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Root node name"
-msgstr "Nombre del Nodo Raíz:"
+msgstr "Nombre del nodo raíz"
#: editor/rename_dialog.cpp
msgid ""
"Sequential integer counter.\n"
"Compare counter options."
msgstr ""
+"Contador de enteros secuenciales.\n"
+"Comparar opciones de contador."
#: editor/rename_dialog.cpp
msgid "Per Level counter"
-msgstr ""
+msgstr "Contador por nivel"
#: editor/rename_dialog.cpp
msgid "If set the counter restarts for each group of child nodes"
-msgstr ""
+msgstr "Si esta activo el contador reinicia por cada grupo de nodos hijos"
#: editor/rename_dialog.cpp
msgid "Initial value for the counter"
-msgstr ""
+msgstr "Valor inicial para el contador"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Step"
-msgstr "Paso:"
+msgstr "Paso"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
-msgstr ""
+msgid "Amount by which counter is incremented for each node"
+msgstr "Cantidad en la que se incrementa el contador por cada nodo"
#: editor/rename_dialog.cpp
msgid "Padding"
-msgstr ""
+msgstr "Relleno"
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
+"Número mínimo de dígitos para el contador.\n"
+"Los dígitos faltantes serán rellenados con ceros al principio."
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Regular Expressions"
-msgstr "Cambiar Expresión"
+msgstr "Expresiones Regulares"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Post-Process"
-msgstr "Script de Postprocesado:"
+msgstr "Post-Procesado"
#: editor/rename_dialog.cpp
msgid "Keep"
@@ -7627,32 +7756,29 @@ msgstr "Conservar"
#: editor/rename_dialog.cpp
msgid "CamelCase to under_scored"
-msgstr ""
+msgstr "CamelCase a under_scored"
#: editor/rename_dialog.cpp
msgid "under_scored to CamelCase"
-msgstr ""
+msgstr "under_scored a CamelCase"
#: editor/rename_dialog.cpp
msgid "Case"
-msgstr ""
+msgstr "Mayus./Minus."
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Lowercase"
-msgstr "Minúsculas"
+msgstr "A Minúsculas"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Uppercase"
-msgstr "Mayúsculas"
+msgstr "A Mayúsculas"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Reset"
-msgstr "Resetear el Zoom"
+msgstr "Resetear"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr "Error"
@@ -7713,6 +7839,10 @@ msgid "Instance Scene(s)"
msgstr "Instanciar Escena(s)"
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "Instanciar Escena Hija"
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr "Restablecer Script"
@@ -7749,6 +7879,14 @@ msgid "Save New Scene As..."
msgstr "Guardar Nueva Escena Como..."
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+"Desactivar \"editable_instance\" causara que todas las propiedades del nodo "
+"vuelvan a sus valores por defecto."
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr "Hijos Editables"
@@ -7761,29 +7899,24 @@ msgid "Make Local"
msgstr "Crear Local"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "Crear Nodo"
+msgstr "Crear Nodo Raíz:"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "2D Scene"
-msgstr "Escena"
+msgstr "Escena 2D"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "3D Scene"
-msgstr "Escena"
+msgstr "Escena 3D"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "User Interface"
-msgstr "Limpiar Herencia"
+msgstr "Interfaz de Usuario"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Custom Node"
-msgstr "Cortar Nodos"
+msgstr "Nodo Personalizado"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
@@ -7827,6 +7960,10 @@ msgid "Clear Inheritance"
msgstr "Limpiar Herencia"
#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr "Abrir documentación"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr "Eliminar Nodo(s)"
@@ -7835,17 +7972,16 @@ msgid "Add Child Node"
msgstr "Agregar Nodo Hijo"
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
-msgstr "Instanciar Escena Hija"
-
-#: editor/scene_tree_dock.cpp
msgid "Change Type"
msgstr "Cambiar Tipo"
#: editor/scene_tree_dock.cpp
-#, fuzzy
+msgid "Extend Script"
+msgstr "Extender Script"
+
+#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
-msgstr "Nueva Raíz de Escena"
+msgstr "Convertir en Raíz de Escena"
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
@@ -7896,21 +8032,19 @@ msgid "Clear Inheritance? (No Undo!)"
msgstr "Limpiar Herencia? (Imposible Deshacer!)"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Toggle Visible"
-msgstr "Act/Desact. Visibilidad"
+msgstr "Act/Desact. Visible"
#: editor/scene_tree_editor.cpp
msgid "Node configuration warning:"
msgstr "Advertencia de configuración de nodo:"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node has connection(s) and group(s).\n"
"Click to show signals dock."
msgstr ""
-"El nodo tiene conexión/es y grupo/s\n"
+"El nodo tiene conexión/es y grupo/s.\n"
"Clic para mostrar el panel de señales."
#: editor/scene_tree_editor.cpp
@@ -7930,27 +8064,24 @@ msgstr ""
"Click para mostrar el panel de grupos."
#: editor/scene_tree_editor.cpp editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script"
-msgstr "Abrir script"
+msgstr "Abrir Script"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node is locked.\n"
"Click to unlock it."
msgstr ""
"El nodo está bloqueado.\n"
-"Clic para desbloquear"
+"Click para desbloquear."
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Children are not selectable.\n"
"Click to make selectable."
msgstr ""
"Los hijos no son seleccionables.\n"
-"Clic para convertir en seleccionables"
+"Click para convertir en seleccionables."
#: editor/scene_tree_editor.cpp
msgid "Toggle Visibility"
@@ -7961,6 +8092,8 @@ msgid ""
"AnimationPlayer is pinned.\n"
"Click to unpin."
msgstr ""
+"El AnimationPlayer esta pineado.\n"
+"Click para despinear."
#: editor/scene_tree_editor.cpp
msgid "Invalid node name, the following characters are not allowed:"
@@ -8000,15 +8133,18 @@ msgid "N/A"
msgstr "N/A"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script/Choose Location"
-msgstr "Abrir en Editor de Script"
+msgstr "Abrir Script/Elegir Ubicación"
#: editor/script_create_dialog.cpp
msgid "Path is empty"
msgstr "La ruta está vacía"
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr "Nombre de archivo vacio"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr "La ruta no es local"
@@ -8097,20 +8233,8 @@ msgid "Bytes:"
msgstr "Bytes:"
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr "Advertencia"
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr "Error:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr "Fuente:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
-msgstr "Funcion:"
+msgid "Stack Trace"
+msgstr "Stack Trace"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8126,7 +8250,7 @@ msgstr "Proceso Hijo Conectado"
#: editor/script_editor_debugger.cpp
msgid "Copy Error"
-msgstr "Erroes de Copia"
+msgstr "Copiar Error"
#: editor/script_editor_debugger.cpp
msgid "Inspect Previous Instance"
@@ -8141,18 +8265,6 @@ msgid "Stack Frames"
msgstr "Frames del Stack"
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr "Variable"
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr "Errores:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr "Stack Trace (si aplica):"
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr "Profiler"
@@ -8241,9 +8353,8 @@ msgid "Change Camera Size"
msgstr "Cambiar Tamaño de Cámara"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Notifier AABB"
-msgstr "Cambiar Alcances de Notificadores"
+msgstr "Cambiar Notificador AABB"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Particles AABB"
@@ -8270,38 +8381,32 @@ msgid "Change Capsule Shape Height"
msgstr "Cambiar Altura de Shape Cápsula"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Radius"
-msgstr "Cambiar Radio de Shape Cápsula"
+msgstr "Cambiar Radio de Shape Cilindro"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Height"
-msgstr "Cambiar Altura de Shape Cápsula"
+msgstr "Cambiar Altura de Shape Cilindro"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Ray Shape Length"
msgstr "Cambiar Largo de Shape Rayo"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Radius"
-msgstr "Cambiar Radio de Luces"
+msgstr "Cambiar Radio de Cilindro"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Height"
-msgstr "Cambiar Altura de Shape Cápsula"
+msgstr "Cambiar Altura de Cilindro"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Inner Radius"
-msgstr "Cambiar Radio de Shape Esférico"
+msgstr "Cambiar Radio Interno de Toro"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Outer Radius"
-msgstr "Cambiar Radio de Luces"
+msgstr "Cambiar Radio Externo de Toro"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select the dynamic library for this entry"
@@ -8356,8 +8461,8 @@ msgid "GDNative"
msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
-msgstr "el argumento step es cero!"
+msgid "Step argument is zero!"
+msgstr "El argumento step es cero!"
#: modules/gdscript/gdscript_functions.cpp
msgid "Not a script with an instance"
@@ -8423,9 +8528,8 @@ msgid "GridMap Delete Selection"
msgstr "Eliminar Seleccionados en GridMap"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Fill Selection"
-msgstr "Eliminar Seleccionados en GridMap"
+msgstr "Llenar Selección en GridMap"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Duplicate Selection"
@@ -8508,9 +8612,8 @@ msgid "Clear Selection"
msgstr "Limpiar Selección"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Fill Selection"
-msgstr "Toda la Selección"
+msgstr "Llenar la Selección"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Settings"
@@ -8581,12 +8684,8 @@ msgid "End of inner exception stack trace"
msgstr "Fin del stack trace de excepción interna"
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr "Hacer Bake!"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
-msgstr "Hacer bake de mesh de navegación."
+msgid "Bake NavMesh"
+msgstr "Hacer Bake de NavMesh"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8814,14 +8913,12 @@ msgid "Connect Nodes"
msgstr "Conectar Nodos"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Data"
-msgstr "Conectar Nodos"
+msgstr "Conectar Datos de Nodos"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Sequence"
-msgstr "Conectar Nodos"
+msgstr "Conectar Secuencia de Nodos"
#: modules/visual_script/visual_script_editor.cpp
msgid "Script already has function '%s'"
@@ -8868,6 +8965,10 @@ msgid "Base Type:"
msgstr "Tipo Base:"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "Miembros:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "Nodos Disponibles:"
@@ -8904,9 +9005,8 @@ msgid "Paste Nodes"
msgstr "Pegar Nodos"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
-msgstr "Miembros"
+msgstr "Editar Miembros"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Input type not iterable: "
@@ -8967,17 +9067,16 @@ msgstr ""
"(error)."
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Search VisualScript"
-msgstr "Quitar Nodo de VisualScript"
+msgstr "Buscar en VisualScript"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
-msgstr "Obtener"
+msgid "Get %s"
+msgstr "Obtener %s"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
-msgstr ""
+msgid "Set %s"
+msgstr "Asignar %s"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -9029,15 +9128,14 @@ msgstr ""
"ser ignorados."
#: scene/2d/collision_object_2d.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
"define its shape."
msgstr ""
-"Este nodo no tiene hijos de tipo shape, por lo tanto no puede interactuar "
-"con el espacio.\n"
-"Considerá agregarle nodos hijos de tipo CollisionShape2D o "
+"Este nodo no tiene forma definida, por lo tanto no puede colisionar o "
+"interactuar con otros objetos.\n"
+"Considerá agregarle un nodo hijo de tipo CollisionShape2D o "
"CollisionPolygon2D para definir su forma."
#: scene/2d/collision_polygon_2d.cpp
@@ -9072,6 +9170,14 @@ msgstr ""
"Se debe proveer un shape para que CollisionShape2D funcione. Creale un "
"recurso shape!"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+"Animar CPUParticles2D requiere el uso de un CanvasItemMaterial con "
+"\"Particles Animation\" activado."
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -9121,6 +9227,14 @@ msgstr ""
"No se imprimió ningun comportamiento ya que ningún material fue asignado "
"para procesar las particulas."
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+"Animar de Particles2D requiere el uso de un CanvasItemMaterial con "
+"\"Particles Animation\" activado."
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -9142,16 +9256,19 @@ msgstr "La propiedad Path debe apuntar a un nodo Node2D válido para funcionar."
#: scene/2d/skeleton_2d.cpp
msgid "This Bone2D chain should end at a Skeleton2D node."
-msgstr ""
+msgstr "Esta cadena Bone2D debería terminar en un nodo Skeleton2D."
#: scene/2d/skeleton_2d.cpp
msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
msgstr ""
+"Un Bone2D solo funciona con un Skeleton2D u otro Bone2D como nodo padre."
#: scene/2d/skeleton_2d.cpp
msgid ""
"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
msgstr ""
+"Este hueso no tiene una pose de DESCANSO adecuada. Andá al nodo Skeleton2D y "
+"asígnale una."
#: scene/2d/visibility_notifier_2d.cpp
msgid ""
@@ -9218,15 +9335,14 @@ msgid "Lighting Meshes: "
msgstr "Iluminando Meshes: "
#: scene/3d/collision_object.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape or CollisionPolygon as a child to define "
"its shape."
msgstr ""
-"Este nodo no tiene hijos de tipo shape, asi que no puede interactuar con el "
-"espacio.\n"
-"Considerá agregarle nodos hijos de tipo CollisionShape o CollisionPolygon "
+"Este nodo no tiene forma, por lo tanto no puede colisionar o interactuar con "
+"otros objetos.\n"
+"Considerá agregarle un nodo hijo de tipo CollisionShape o CollisionPolygon "
"para definir su forma."
#: scene/3d/collision_polygon.cpp
@@ -9261,6 +9377,18 @@ msgstr ""
"Se debe proveer un shape para que CollisionShape funcione. Creale un recurso "
"shape!"
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr "Nada visible ya que no se asignó ningún mesh."
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+"Animar CPUParticles requiere el uso de un SpatialMaterial con \"Billboard "
+"Particles\" activado."
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr "Ploteando Meshes"
@@ -9283,6 +9411,33 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr "Nada visible ya que no se asigno pasadas de dibujado a los meshes."
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+"Animar Particles requiere el uso de un SpatialMaterial con \"Billboard "
+"Particles\" activado."
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+"PathFollow solo funciona cuando está asignado como hijo de un nodo Path."
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+"OrientedPathFollow solo funciona cuando esta asignado como hijo de un nodo "
+"Path."
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+"OrientedPathFollow requiere que \"Up Vector\" esté activo en el recurso "
+"Curve de su Path padre."
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9320,18 +9475,17 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid "This body will be ignored until you set a mesh"
-msgstr ""
+msgstr "Este cuerpo sera ignorado hasta que le asignes un mesh"
#: scene/3d/soft_body.cpp
-#, fuzzy
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
-"Los cambios de tamaño a RigidBody (en modo character o rigid) seran "
-"sobreescritos por el motor de física al ejecutar.\n"
-"Cambiá el tamaño de los collision shapes hijos."
+"Los cambios de tamaño a un SoftBody serán sobrescritos por el motor de "
+"física al ejecutar.\n"
+"En su lugar, cambiá el tamaño de los collision shapes hijos."
#: scene/3d/sprite_3d.cpp
msgid ""
@@ -9351,45 +9505,45 @@ msgstr ""
#: scene/animation/animation_blend_tree.cpp
msgid "On BlendTree node '%s', animation not found: '%s'"
-msgstr ""
+msgstr "En el nodo BlendTree '%s', no se encontró la animación: '%s'"
#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "Herramientas de Animación"
+msgstr "No se encontró la animación: '%s'"
#: scene/animation/animation_tree.cpp
msgid "In node '%s', invalid animation: '%s'."
-msgstr ""
+msgstr "En el nodo '%s', animación inválida: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "ERROR: Nombre de animación inválido!"
+msgstr "Animación inválida: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "Desconectar '%s' de '%s'"
+msgstr "Nada conectado a la entrada '%s' del nodo '%s'."
#: scene/animation/animation_tree.cpp
msgid "A root AnimationNode for the graph is not set."
-msgstr ""
+msgstr "No hay asignado ningún nodo AnimationNode raíz para el gráfico."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Path to an AnimationPlayer node containing animations is not set."
msgstr ""
-"Selecciona un AnimationPlayer del Ãrbol de Escenas para editar animaciones."
+"No hay asignada una ruta a un nodo AnimationPlayer conteniendo animaciones."
#: scene/animation/animation_tree.cpp
msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
msgstr ""
+"La ruta asignada al AnimationPlayer no apunta a un nodo AnimationPlayer."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "AnimationPlayer root is not a valid node."
-msgstr "El árbol de animación es inválido."
+msgstr "La raíz del AnimationPlayer no es un nodo válido."
+
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr "Este nodo ha sido deprecado. Usá AnimationTree."
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
@@ -9407,10 +9561,6 @@ msgstr "Alerta!"
msgid "Please Confirm..."
msgstr "Confirmá, por favor..."
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr "Seleccionar esta Carpeta"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9421,6 +9571,10 @@ msgstr ""
"cualquiera de las funciones popup*(). Sin embargo, no hay problema con "
"hacerlos visibles para editar, aunque se esconderán al ejecutar."
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr "Si exp_edit es verdadero min_value debe ser > 0."
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9472,31 +9626,225 @@ msgid "Invalid font size."
msgstr "Tamaño de tipografía inválido."
#: scene/resources/visual_shader.cpp
-#, fuzzy
msgid "Input"
-msgstr "Agregar Entrada"
-
-#: scene/resources/visual_shader.cpp
-#, fuzzy
-msgid "None"
-msgstr "<Ninguno>"
+msgstr "Entrada"
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for shader."
-msgstr "Fuente inválida!"
+msgstr "Fuente inválida para el shader."
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
-msgstr ""
+msgstr "Asignación a función."
#: servers/visual/shader_language.cpp
msgid "Assignment to uniform."
-msgstr ""
+msgstr "Asignación a uniform."
#: servers/visual/shader_language.cpp
msgid "Varyings can only be assigned in vertex function."
-msgstr ""
+msgstr "Solo se pueden asignar variaciones en funciones de vértice."
+
+#~ msgid "Split point with itself."
+#~ msgstr "Dividir punto con sí mismo."
+
+#~ msgid "Split can't form an existing edge."
+#~ msgstr "La división no puede formar un borde existente."
+
+#~ msgid "Split already exists."
+#~ msgstr "La división ya existe."
+
+#~ msgid "Add Split"
+#~ msgstr "Agregar División"
+
+#~ msgid "Invalid Split: "
+#~ msgstr "División Inválida: "
+
+#~ msgid "Remove Split"
+#~ msgstr "Quitar División"
+
+#~ msgid "Poly"
+#~ msgstr "Poly"
+
+#~ msgid "Splits"
+#~ msgstr "Divisiones"
+
+#~ msgid "Connect two points to make a split."
+#~ msgstr "Conectar dos puntos para crear una división."
+
+#~ msgid "Select a split to erase it."
+#~ msgstr "Seleccioná una división para borrarla."
+
+#~ msgid "No name provided"
+#~ msgstr "No se indicó ningún nombre"
+
+#~ msgid "Add Node.."
+#~ msgstr "Agregar Nodo.."
+
+#~ msgid "Create from scene?"
+#~ msgstr "¿Crear desde escena?"
+
+#~ msgid "Create Poly"
+#~ msgstr "Crear Polígono"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "Crear un nuevo polígono desde cero"
+
+#~ msgid "Zoom out"
+#~ msgstr "Zoom out"
+
+#~ msgid "Zoom in"
+#~ msgstr "Zoom in"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "Crear Poly3D"
+
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "No hay ningún recurso OccluderPolygon2D en este nodo.\n"
+#~ "Crear y asignar uno?"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "Click. Izq: Mover Punto."
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "Ctrl+Click Izq.: Partir Segmento en Dos."
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "Click Der.: Borrar Punto."
+
+#~ msgid "New TextFile"
+#~ msgstr "Nuevo Archivo de Texto"
+
+#~ msgid "Save Theme As"
+#~ msgstr "Guardar Tema Como"
+
+#~ msgid "<None>"
+#~ msgstr "<Ninguno>"
+
+#~ msgid ""
+#~ "Select sub-tile to use as icon, this will be also used on invalid "
+#~ "autotile bindings."
+#~ msgstr ""
+#~ "Selectionar sub-tile para usar como icono, esta también sera usada en "
+#~ "bindings inválidos de autotile."
+
+#~ msgid "Zoom:"
+#~ msgstr "Zoom:"
+
+#~ msgid "Are you sure you want to remove all connections from the \""
+#~ msgstr "¿Estás seguro/a que querés quitar todas las conexiones de el/la \""
+
+#~ msgid "Class List:"
+#~ msgstr "Lista de Clases:"
+
+#~ msgid "Search Classes"
+#~ msgstr "Buscar Clases"
+
+#~ msgid "Public Methods"
+#~ msgstr "Métodos Públicos"
+
+#~ msgid "Public Methods:"
+#~ msgstr "Métodos Públicos:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "Items de Tema de la GUI"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "Items de Tema de la GUI:"
+
+#~ msgid "Property: "
+#~ msgstr "Propiedad: "
+
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "Act/Desact. estado de carpeta como Favorito."
+
+#~ msgid "Show current scene file."
+#~ msgstr "Mostrar archivo de escena actual."
+
+#~ msgid "Enter tree-view."
+#~ msgstr "Entrar a la vista arbol."
+
+#~ msgid "Whole words"
+#~ msgstr "Palabras completas"
+
+#~ msgid "Match case"
+#~ msgstr "Coincidir mayúsculas/minúsculas"
+
+#~ msgid "Filter: "
+#~ msgstr "Filtro: "
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#~ msgid "Show In File System"
+#~ msgstr "Mostrar en Sistema de Archivos"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "Buscar en la jerarquía de clases."
+
+#~ msgid "Search in files"
+#~ msgstr "Buscar en archivo"
+
+#~ msgid ""
+#~ "Built-in scripts can only be edited when the scene they belong to is "
+#~ "loaded"
+#~ msgstr ""
+#~ "Los scripts built-in sólo pueden ser editados cuando la escena a la que "
+#~ "pertenecen está cargada"
+
+#~ msgid "Convert To Uppercase"
+#~ msgstr "Convertir A Mayúscula"
+
+#~ msgid "Convert To Lowercase"
+#~ msgstr "Convertir A Minúscula"
+
+#~ msgid "Snap To Floor"
+#~ msgstr "Ajustar al suelo"
+
+#~ msgid "Rotate 0 degrees"
+#~ msgstr "Rotar 0 grados"
+
+#~ msgid "Rotate 90 degrees"
+#~ msgstr "Rotar 90 grados"
+
+#~ msgid "Rotate 180 degrees"
+#~ msgstr "Rotar 180 grados"
+
+#~ msgid "Rotate 270 degrees"
+#~ msgstr "Rotar 270 grados"
+
+#~ msgid "Warning"
+#~ msgstr "Advertencia"
+
+#~ msgid "Error:"
+#~ msgstr "Error:"
+
+#~ msgid "Source:"
+#~ msgstr "Fuente:"
+
+#~ msgid "Function:"
+#~ msgstr "Funcion:"
+
+#~ msgid "Variable"
+#~ msgstr "Variable"
+
+#~ msgid "Errors:"
+#~ msgstr "Errores:"
+
+#~ msgid "Stack Trace (if applicable):"
+#~ msgstr "Stack Trace (si aplica):"
+
+#~ msgid "Bake!"
+#~ msgstr "Hacer Bake!"
+
+#~ msgid "Bake the navigation mesh."
+#~ msgstr "Hacer bake de mesh de navegación."
+
+#~ msgid "Get"
+#~ msgstr "Obtener"
#~ msgid "Change Scalar Constant"
#~ msgstr "Cambiar Constante Escalar"
@@ -9702,9 +10050,6 @@ msgstr ""
#~ msgid "Run Script"
#~ msgstr "Ejecutar Script"
-#~ msgid "Save the currently edited resource."
-#~ msgstr "Guardar el recurso editado actualmente."
-
#~ msgid "Stop Profiling"
#~ msgstr "Parar Profiling"
@@ -10003,9 +10348,6 @@ msgstr ""
#~ msgid "Could not save atlas subtexture:"
#~ msgstr "No se pudo guardar la subtextura de altas:"
-#~ msgid "Exporting for %s"
-#~ msgstr "Exportando para %s"
-
#~ msgid "Setting Up..."
#~ msgstr "Configurando..."
@@ -10112,9 +10454,6 @@ msgstr ""
#~ msgid "Source Font:"
#~ msgstr "Tipografía de Origen:"
-#~ msgid "Source Font Size:"
-#~ msgstr "Tamaño de la Tipografía de Origen:"
-
#~ msgid "Dest Resource:"
#~ msgstr "Recurso de Dest:"
@@ -10191,9 +10530,6 @@ msgstr ""
#~ msgid "Start(s)"
#~ msgstr "Comienzo(s)"
-#~ msgid "Filters"
-#~ msgstr "Filtros"
-
#~ msgid "Source path is empty."
#~ msgstr "La ruta de origen esta vacía."
@@ -10469,15 +10805,9 @@ msgstr ""
#~ msgid "Stereo"
#~ msgstr "Estereo"
-#~ msgid "Pitch"
-#~ msgstr "Altura"
-
#~ msgid "Window"
#~ msgstr "Ventana"
-#~ msgid "Move Right"
-#~ msgstr "Mover a la Derecha"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "Escalando a %s%%."
@@ -10552,9 +10882,6 @@ msgstr ""
#~ msgid "just pressed"
#~ msgstr "recién presionado"
-#~ msgid "just released"
-#~ msgstr "recién soltado"
-
#~ msgid ""
#~ "Couldn't read the certificate file. Are the path and password both "
#~ "correct?"
@@ -10871,21 +11198,6 @@ msgstr ""
#~ msgid "Trailing Silence:"
#~ msgstr "Silencio Sobrante al Final:"
-#~ msgid "Script Export Mode:"
-#~ msgstr "Modo de Exportación de Scipts:"
-
-#~ msgid "Text"
-#~ msgstr "Texto"
-
-#~ msgid "Compiled"
-#~ msgstr "Compilado"
-
-#~ msgid "Encrypted (Provide Key Below)"
-#~ msgstr "Encriptado (Proveer la Clave Debajo)"
-
-#~ msgid "Script Encryption Key (256-bits as hex):"
-#~ msgstr "Clave de Encriptación de Script (256-bits como hex):"
-
#~ msgid "Export Project PCK"
#~ msgstr "Exportar PCK de Proyecto"
@@ -10895,9 +11207,6 @@ msgstr ""
#~ msgid "Project Export"
#~ msgstr "Exportar Proyecto"
-#~ msgid "Export Preset:"
-#~ msgstr "Presets de Exportación:"
-
#~ msgid "BakedLightInstance does not contain a BakedLight resource."
#~ msgstr "BakedLightInstance no contiene un recurso BakedLight."
@@ -10982,13 +11291,6 @@ msgstr ""
#~ msgid "Scale Region Editor"
#~ msgstr "Editor de Regiones de Escalado"
-#~ msgid ""
-#~ "No texture in this node.\n"
-#~ "Set a texture to be able to edit region."
-#~ msgstr ""
-#~ "Sin textura en este nodo.\n"
-#~ "Asigná una textura para poder editar la región."
-
#~ msgid "Inherit Scene"
#~ msgstr "Heredar Escena"
diff --git a/editor/translations/et.po b/editor/translations/et.po
new file mode 100644
index 0000000000..a31dd80762
--- /dev/null
+++ b/editor/translations/et.po
@@ -0,0 +1,9237 @@
+# LANGUAGE translation of the Godot Engine editor
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
+# This file is distributed under the same license as the Godot source code.
+# Jens <arrkiin@gmail.com>, 2019.
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"Language: et\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+
+#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr ""
+
+#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
+#: modules/mono/glue/gd_glue.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid input %i (not passed) in expression"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "self can't be used because instance is null (not passed)"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid operands to operator %s, %s and %s."
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid index of type %s for base type %s"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid named index '%s' for base type %s"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid arguments to construct '%s'"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "On call to '%s':"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Free"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Balanced"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Mirror"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Insert Key Here"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Duplicate Selected Key(s)"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Delete Selected Key(s)"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
+msgid "Anim Delete Keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Keyframe Time"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Transition"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Transform"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Keyframe Value"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Call"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Property Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "3D Transform Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Call Method Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Bezier Curve Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Audio Playback Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation Playback Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Add Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation Length Time (seconds)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation Looping"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Audio Clips:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Clips:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Toggle this track on/off."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Update Mode (How this property is set)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Interpolation Mode"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove this track."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Time (s): "
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Continuous"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Discrete"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Trigger"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Capture"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Nearest"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
+#: editor/property_editor.cpp
+msgid "Linear"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Cubic"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clamp Loop Interp"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Wrap Loop Interp"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Duplicate Key(s)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Delete Key(s)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove Anim Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/create_dialog.cpp
+#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
+#: editor/plugin_config_dialog.cpp
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
+msgid "Create"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "AnimationPlayer can't animate itself, only other players."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Create & Insert"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Transform tracks only apply to Spatial-based nodes."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid ""
+"Audio tracks can only point to nodes of type:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation tracks can only point to AnimationPlayer nodes."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "An animation player can't animate itself, only other players."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Not possible to add a new track without a root"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Track path is invalid, so can't add a key."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Track is not of type Spatial, can't insert key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Track path is invalid, so can't add a method key."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Method not found in object: "
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Move Keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clipboard is empty"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Scale Keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid ""
+"This option does not work for Bezier editing, as it's only a single track."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Only show tracks from nodes selected in tree."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Group tracks by node or display them as plain list."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Snap (s): "
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation step value."
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/editor_properties.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+#: editor/project_manager.cpp editor/project_settings_editor.cpp
+#: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp
+msgid "Edit"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation properties."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Copy Tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Paste Tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Scale Selection"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Scale From Cursor"
+msgstr ""
+
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Duplicate Transposed"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Delete Selection"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Go to Next Step"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Go to Previous Step"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Optimize Animation"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up Animation"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Pick the node that will be animated:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Use Bezier Curves"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim. Optimizer"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Max. Linear Error:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Max. Angular Error:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Optimize"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove invalid keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-up all animations"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Scale Ratio:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Select tracks to copy:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/editor_properties.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Copy"
+msgstr ""
+
+#: editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr ""
+
+#: editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr ""
+
+#: editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Go to Line"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Line Number:"
+msgstr ""
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "No Matches"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Replaced %d occurrence(s)."
+msgstr ""
+
+#: editor/code_editor.cpp editor/find_in_files.cpp
+msgid "Match Case"
+msgstr ""
+
+#: editor/code_editor.cpp editor/find_in_files.cpp
+msgid "Whole Words"
+msgstr ""
+
+#: editor/code_editor.cpp editor/rename_dialog.cpp
+msgid "Replace"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Replace All"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Selection Only"
+msgstr ""
+
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom In"
+msgstr ""
+
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Out"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Warnings:"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Font Size:"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Line:"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Col:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
+#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
+msgid "Add"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/dependency_editor.cpp
+#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_settings_editor.cpp
+msgid "Remove"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/dependency_editor.cpp
+#: editor/export_template_manager.cpp editor/groups_editor.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp
+#: editor/project_settings_editor.cpp editor/property_editor.cpp
+#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Close"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect '%s' from '%s'"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect all from signal: '%s'"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect..."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Disconnect"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect Signal: "
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Edit Connection: "
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
+msgid "Signals"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Are you sure you want to remove all connections from this signal?"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect All"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Edit..."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Go To Method"
+msgstr ""
+
+#: editor/create_dialog.cpp
+msgid "Change %s Type"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/project_settings_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr ""
+
+#: editor/create_dialog.cpp
+msgid "Create New %s"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Search:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Matches:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Description:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+
+#: editor/dependency_editor.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Dependencies"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Resource"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
+msgid "Path"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+#: scene/gui/file_dialog.cpp
+msgid "Open"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+msgid "Cannot remove:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Load failed due to missing dependencies:"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_node.cpp
+msgid "Open Anyway"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Owns"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp
+#: editor/editor_file_dialog.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/item_list_editor_plugin.cpp
+#: editor/project_export.cpp editor/project_settings_editor.cpp
+#: editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr ""
+
+#: editor/dictionary_property_edit.cpp
+msgid "Change Dictionary Key"
+msgstr ""
+
+#: editor/dictionary_property_edit.cpp
+msgid "Change Dictionary Value"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Godot Engine contributors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Project Founders"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Lead Developer"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Project Manager "
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Developers"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Authors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Platinum Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Gold Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Mini Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Gold Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Silver Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Bronze Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "License"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Thirdparty License"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid ""
+"Godot Engine relies on a number of thirdparty free and open source "
+"libraries, all compatible with the terms of its MIT license. The following "
+"is an exhaustive list of all such thirdparty components with their "
+"respective copyright statements and license terms."
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "All Components"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Components"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Licenses"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp editor/project_manager.cpp
+msgid "Error opening package file, not in zip format."
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+msgid "Uncompressing Assets"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp editor/project_manager.cpp
+msgid "Package installed successfully!"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Success!"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Install"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+msgid "Package Installer"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Speakers"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Rename Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Change Audio Bus Volume"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Solo"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Mute"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Bypass Effects"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Select Audio Bus Send"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Audio Bus Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Move Bus Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Bus Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Audio Bus, Drag and Drop to rearrange."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Solo"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Mute"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Bypass"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Bus options"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Reset Volume"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Audio"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Master bus can't be deleted!"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Duplicate Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Reset Bus Volume"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Move Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Save Audio Bus Layout As..."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Location for New Layout..."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Open Audio Bus Layout"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "There is no 'res://default_bus_layout.tres' file."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Invalid file, not an audio bus layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Create a new Bus Layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/editor_properties.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
+#: editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Load an existing Bus Layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Save As"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Save this Bus Layout to a file."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/import_dock.cpp
+msgid "Load Default"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Load the default Bus Layout."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
+msgid "Path:"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
+msgid "Name"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "Storing local changes..."
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "Updating scene..."
+msgstr ""
+
+#: editor/editor_data.cpp editor/editor_properties.cpp
+msgid "[empty]"
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "[unsaved]"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp
+msgid "Please select a base directory first"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
+msgid "Create Folder"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp
+#: scene/gui/file_dialog.cpp
+msgid "Name:"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
+msgid "Could not create folder."
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid "Storing File:"
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid "Packing"
+msgstr ""
+
+#: editor/editor_export.cpp platform/javascript/export/export.cpp
+msgid "Template file not found:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select This Folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "Open in File Manager"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+#: editor/project_manager.cpp
+msgid "Show in File Manager"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "New Folder..."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "All Recognized"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "All Files (*)"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/editor_node.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
+msgid "Save"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Save a File"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Go to parent folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Directories & Files:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
+#: editor/plugins/style_box_editor_plugin.cpp
+msgid "Preview:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "File:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr ""
+
+#: editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr ""
+
+#: editor/editor_file_system.cpp
+msgid "(Re)Importing Assets"
+msgstr ""
+
+#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class:"
+msgstr ""
+
+#: editor/editor_help.cpp editor/scene_tree_editor.cpp
+msgid "Inherits:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Properties"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Methods"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Methods:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Theme Properties"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Theme Properties:"
+msgstr ""
+
+#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
+msgid "Signals:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Enumerations"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Enumerations:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "enum "
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Constants"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Constants:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class Description"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Online Tutorials:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid ""
+"There are currently no tutorials for this class, you can [color=$color][url="
+"$url]contribute one[/url][/color] or [color=$color][url=$url2]request one[/"
+"url][/color]."
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Property Descriptions"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Property Descriptions:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid ""
+"There is currently no description for this property. Please help us by "
+"[color=$color][url=$url]contributing one[/url][/color]!"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Method Descriptions"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Method Descriptions:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid ""
+"There is currently no description for this method. Please help us by [color="
+"$color][url=$url]contributing one[/url][/color]!"
+msgstr ""
+
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr ""
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
+msgid "Set"
+msgstr ""
+
+#: editor/editor_inspector.cpp
+msgid "Set Multiple:"
+msgstr ""
+
+#: editor/editor_log.cpp
+msgid "Output:"
+msgstr ""
+
+#: editor/editor_log.cpp editor/editor_profiler.cpp
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/property_editor.cpp editor/scene_tree_dock.cpp
+#: editor/script_editor_debugger.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp
+#: scene/gui/text_edit.cpp
+msgid "Clear"
+msgstr ""
+
+#: editor/editor_log.cpp
+msgid "Clear Output"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Project export failed with error code %d."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Error saving resource!"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save Resource As..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error while saving."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Can't open '%s'. The file could have been moved or deleted."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error while parsing '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unexpected end of file '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Missing '%s' or its dependencies."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error while loading '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Analyzing"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a tree root."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
+"be satisfied."
+msgstr ""
+
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource belongs to a scene that was imported, so it's not editable.\n"
+"Please read the documentation relevant to importing scenes to better "
+"understand this workflow."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource belongs to a scene that was instanced or inherited.\n"
+"Changes to it will not be kept when saving the current scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource was imported, so it's not editable. Change its settings in the "
+"import panel and then re-import."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This scene was imported, so changes to it will not be kept.\n"
+"Instancing it or inheriting will allow making changes to it.\n"
+"Please read the documentation relevant to importing scenes to better "
+"understand this workflow."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This is a remote object so changes to it will not be kept.\n"
+"Please read the documentation relevant to debugging to better understand "
+"this workflow."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Open Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Open Script..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save & Close"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save changes to '%s' before closing?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save Scene As..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "No"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Yes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a root node."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a selected node."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Revert"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Run Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quit"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Project Manager?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save & Quit"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save changes to the following scene(s) before quitting?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save changes the following scene(s) before opening Project Manager?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This option is deprecated. Situations where refresh must be forced are now "
+"considered a bug. Please report."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to find script field for addon plugin at: 'res://addons/%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to load addon script from path: '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to load addon script from path: '%s' Script is not in tool mode."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Scene '%s' was automatically imported, so it can't be modified.\n"
+"To make changes to it, a new inherited scene can be created."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Clear Recent Scenes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save Layout"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr ""
+
+#: editor/editor_node.cpp editor/import_dock.cpp
+#: editor/script_create_dialog.cpp
+msgid "Default"
+msgstr ""
+
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play This Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Close Tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "%d more files or folders"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "%d more folders"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "%d more files"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Dock Position"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Toggle distraction-free mode."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Add a new scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Next tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Previous tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Filter Files..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "New Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "New Inherited Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save All Scenes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Convert To..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "MeshLibrary..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "TileSet..."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Undo"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Redo"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Project"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Project Settings"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_export.cpp
+msgid "Export"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Project Data Folder"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
+msgid "Debug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Editor"
+msgstr ""
+
+#: editor/editor_node.cpp editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Editor Data/Settings Folder"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Editor Data Folder"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Editor Settings Folder"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Help"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+msgid "Search"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Online Docs"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Q&A"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Issue Tracker"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "About"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play the project."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr ""
+
+#: editor/editor_node.cpp editor/editor_profiler.cpp
+msgid "Stop"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Changing the video driver requires restarting the editor."
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_settings_editor.cpp
+#: editor/settings_config_dialog.cpp
+msgid "Save & Restart"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Update Always"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Update Changes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
+#: editor/project_manager.cpp
+msgid "Import"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Expand Bottom Panel"
+msgstr ""
+
+#: editor/editor_node.cpp scene/resources/visual_shader.cpp
+msgid "Output"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Don't Save"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_export.cpp
+msgid "Export Project"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export Library"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Password:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "New Inherited"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Load Errors"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open 2D Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open 3D Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Script Editor"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "Open Asset Library"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open the next Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open the previous Editor"
+msgstr ""
+
+#: editor/editor_plugin.cpp
+msgid "Creating Mesh Previews"
+msgstr ""
+
+#: editor/editor_plugin.cpp
+msgid "Thumbnail..."
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Edit Plugin"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+msgid "Update"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Version:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+msgid "Author:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Edit:"
+msgstr ""
+
+#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
+#: editor/rename_dialog.cpp
+msgid "Start"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Physics Frame %"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Time:"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Time"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Calls"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "On"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Layer"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Bit %d, value %d"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "[Empty]"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Invalid RID"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Pick a Viewport"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "New Script"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "New %s"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Make Unique"
+msgstr ""
+
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Paste"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Convert To %s"
+msgstr ""
+
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Open Editor"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Selected node is not a Viewport!"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Size: "
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Page: "
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "New Key:"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "New Value:"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Add Key/Value Pair"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: editor/editor_run_native.cpp
+msgid "Select device from the list"
+msgstr ""
+
+#: editor/editor_run_native.cpp
+msgid ""
+"No runnable export preset found for this platform.\n"
+"Please add a runnable preset in the export menu."
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Re-Download"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Uninstall"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "(Installed)"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "(Missing)"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "(Current)"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Retrieving mirrors, please wait..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Remove template version '%s'?"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Can't open export templates zip."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Invalid version.txt format inside templates: %s."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "No version.txt found inside templates."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Error creating path for templates:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Extracting Export Templates"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Importing:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid ""
+"No download links found for this version. Direct download is only available "
+"for official releases."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't connect."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "No response."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request Failed."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect Loop."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Failed:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Download Complete."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid ""
+"Templates installation failed. The problematic templates archives can be "
+"found at '%s'."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Error requesting url: "
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Connecting to Mirror..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Disconnected"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Resolving"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Can't Resolve"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Connecting..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Can't Connect"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Connected"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Requesting..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Downloading"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Connection Error"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "SSL Handshake Error"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Current Version:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Installed Versions:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Install From File"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Remove Template"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Select template file"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Export Template Manager"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Download Templates"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Select mirror from list: (Shift+Click: Open in Browser)"
+msgstr ""
+
+#: editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "View items as a grid of thumbnails."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "View items as a list."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Status: Import of file failed. Please fix file and reimport manually."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Cannot move/rename resources root."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Cannot move a folder into itself."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Error moving:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Error duplicating:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Unable to update dependencies:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Provided name contains invalid characters"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "A file or folder with this name already exists."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Renaming file:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Renaming folder:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicating file:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicating folder:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Open Scene(s)"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Add to favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Remove from favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Edit Dependencies..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "View Owners..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicate..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+msgid "New Script..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "New Resource..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/project_manager.cpp editor/rename_dialog.cpp
+#: editor/scene_tree_dock.cpp
+msgid "Rename"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Toggle split mode"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Search files"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid ""
+"Scanning Files,\n"
+"Please Wait..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "There is already file or folder with the same name in this location."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Overwrite"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Find in Files"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Find:"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Folder:"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Filters:"
+msgstr ""
+
+#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+msgid "Find..."
+msgstr ""
+
+#: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp
+msgid "Replace..."
+msgstr ""
+
+#: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp
+msgid "Cancel"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Find: "
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Replace: "
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Replace all (no undo)"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Searching..."
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Search complete"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Group name already exists."
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Invalid group name."
+msgstr ""
+
+#: editor/groups_editor.cpp editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Nodes not in Group"
+msgstr ""
+
+#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
+msgid "Filter nodes"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Nodes in Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Manage Groups"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Single Scene"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Materials"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Materials"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Materials+Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Materials+Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Multiple Scenes"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Multiple Scenes+Materials"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Import Scene"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Importing Scene..."
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Generating Lightmaps"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Generating for Mesh: "
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Running Custom Script..."
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Saving..."
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Set as Default for '%s'"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Clear Default for '%s'"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid " Files"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Import As:"
+msgstr ""
+
+#: editor/import_dock.cpp editor/property_editor.cpp
+msgid "Preset..."
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Reimport"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Failed to load resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Expand All Properties"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Collapse All Properties"
+msgstr ""
+
+#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save As..."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Copy Params"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Edit Resource Clipboard"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Copy Resource"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Make Built-In"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Open in Help"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Object properties."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Filter properties"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Changes may be lost!"
+msgstr ""
+
+#: editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Edit a Plugin"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Create a Plugin"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Plugin Name:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Subfolder:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Language:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Script Name:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Activate now?"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Edit Polygon"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Insert Point"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Edit Polygon (Remove Point)"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Remove Polygon And Point"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid ""
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Load..."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "This type of node can't be used. Only root nodes are allowed."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid ""
+"AnimationTree is inactive.\n"
+"Activate to enable playback, check node warnings if activation fails."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Set the blending position within the space"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Select and move points, create points with RMB."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Open Animation Node"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Triangle already exists"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "BlendSpace2D does not belong to an AnimationTree node."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "No triangles exist, so no blending can take place."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create triangles by connecting points."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Erase points and triangles."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Generate blend triangles automatically (instead of manually)"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Edit Filters"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Output node can't be added to the blend tree."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Unable to connect, port may be in use or connection may be invalid."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "No animation player set, so unable to retrieve track names."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Player path set is invalid, so unable to retrieve track names."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid ""
+"Animation player has no valid root node path, so unable to retrieve track "
+"names."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add Node..."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "Edit Filtered Tracks:"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Enable filtering"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Delete Animation?"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Invalid animation name!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation name already exists!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation to copy!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation resource on clipboard!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation to edit!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Transitions..."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Open in Inspector"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Onion Skinning"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Enable Onion Skinning"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Directions"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Past"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Future"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Depth"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "1 step"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "2 steps"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "3 steps"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Differences Only"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Force White Modulate"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Include Gizmos (3D)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pin AnimationPlayer"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "End"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Immediate"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Sync"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "At End"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Travel"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Start and end nodes are needed for a sub-transition."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "No playback resource set at path: %s."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid ""
+"Select and move nodes.\n"
+"RMB to add new nodes.\n"
+"Shift+LMB to create connections."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Create new nodes."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Connect nodes."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Remove selected node or transition."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Toggle autoplay this animation on start, restart or seek to zero."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Set the end animation. This is useful for sub-transitions."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Transition: "
+msgstr ""
+
+#: editor/plugins/animation_tree_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "AnimationTree"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Import Animations..."
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Filters..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Contents:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "View Files"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Connection error, please try again."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't connect to host:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "No response from host:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, return code:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, too many redirects"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Bad download hash, assuming file has been tampered with."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Expected:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Got:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Failed sha256 hash check"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Asset Download Error:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Downloading (%s / %s)..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Downloading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Resolving..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Error making request"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Idle"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Retry"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download Error"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download for this asset is already in progress!"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "First"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Previous"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Next"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Last"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "All"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+msgid "Sort:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/project_settings_editor.cpp
+msgid "Category:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Support..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid ""
+"Can't determine a save path for lightmap images.\n"
+"Save your scene (for images to be saved in the same dir), or pick a save "
+"path from the BakedLightmap properties."
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid ""
+"No meshes to bake. Make sure they contain an UV2 channel and that the 'Bake "
+"Light' flag is on."
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid "Failed creating lightmap images, make sure path is writable."
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid "Bake Lightmaps"
+msgstr ""
+
+#: editor/plugins/camera_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+msgid "Preview"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move vertical guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create new vertical guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Remove vertical guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move horizontal guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create new horizontal guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Remove horizontal guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create new horizontal and vertical guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move pivot"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move anchor"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Resize CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchors only"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors and Margins"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Toggle snapping."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snapping Options"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to grid"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Smart snapping"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to parent"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to node anchor"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to node sides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to node center"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to other nodes"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Custom Bone(s) from Node(s)"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Custom Bones"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Helpers"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Rulers"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Origin"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Viewport"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Layout"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert keys."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Multiply grid step by 2"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Divide grid step by 2"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Cannot instantiate multiple nodes without root."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change default type"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Polygon3D"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+msgid "CPUParticles"
+msgstr ""
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emission Points From Mesh"
+msgstr ""
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emission Points From Node"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Flat0"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Flat1"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Ease in"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Ease out"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Smoothstep"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Modify Curve Point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Modify Curve Tangent"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Load Curve Preset"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Add point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Remove point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Left linear"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Right linear"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Load preset"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Remove Curve Point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Toggle Curve Linear Tangent"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Hold Shift to edit tangents individually"
+msgstr ""
+
+#: editor/plugins/gi_probe_editor_plugin.cpp
+msgid "Bake GI Probe"
+msgstr ""
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Contained Mesh is not of type ArrayMesh."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "UV Unwrap failed, mesh may not be manifold?"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "No mesh to debug."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Model has no UV in this layer"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh..."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "View UV1"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "View UV2"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Unwrap UV2 for Lightmap/AO"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generating Visibility Rect"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Can only set point into a ParticlesMaterial process material"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image..."
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generate Visibility Rect"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Particles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generation Time (sec):"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Emission Mask"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Capture from Pixel"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Emission Colors"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Points:"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Surface Points"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Surface Points+Normal (Directed)"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Source: "
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "A processor material of type 'ParticlesMaterial' is required."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generating AABB"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generate Visibility AABB"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Out-Control from Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove In-Control from Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp editor/plugins/theme_editor_plugin.cpp
+#: editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Mirror Handle Angles"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Mirror Handle Lengths"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Position"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Position"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Position"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove Out-Control Point"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove In-Control Point"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/physical_bone_plugin.cpp
+msgid "Move joint"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Sync Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon & UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Internal Vertex"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Remove Internal Vertex"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Add Custom Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Remove Custom Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Open Polygon 2D UV editor."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Points"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygons"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Points"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create a custom polygon. Enables custom polygon rendering."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint weights with specified intensity."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Unpaint weights with specified intensity."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Radius:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Settings"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Configure Grid:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset X:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset Y:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step X:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step Y:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Sync Bones to Polygon"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
+#: editor/scene_tree_editor.cpp
+msgid "Type:"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ResourcePreloader"
+msgstr ""
+
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "AnimationTree has no path set to an AnimationPlayer"
+msgstr ""
+
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "Path to AnimationPlayer is invalid"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Files"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close and save changes?"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error writing TextFile:"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error could not load file."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving file!"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error Saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error Importing"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "New TextFile..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open File"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save File As..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid " Class Reference"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Toggle alphabetical sorting of the method list."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Sort"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Move Up"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Move Down"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "File"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Copy Script Path"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "History Previous"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Other Tabs"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Toggle Scripts Panel"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+msgid "Find Next"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Debug with External Editor"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open Godot online documentation"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Discard"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Results"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Line"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "(ignore)"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Only resources from filesystem can be dropped."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Lookup Symbol"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Convert Case"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Uppercase"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Lowercase"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Capitalize"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Syntax Highlighter"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
+#: scene/gui/text_edit.cpp
+msgid "Cut"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
+#: scene/gui/text_edit.cpp
+msgid "Select All"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Delete Line"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Fold/Unfold Line"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Fold All Lines"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Unfold All Lines"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Convert Indent to Spaces"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Convert Indent to Tabs"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Find in Files..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Line..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: editor/plugins/shader_editor_plugin.cpp
+msgid "Shader"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "This skeleton has no bones, create some children Bone2D nodes."
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Skeleton2D"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Make Rest Pose (From Bones)"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Set Bones to Rest Pose"
+msgstr ""
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Create physical bones"
+msgstr ""
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Skeleton"
+msgstr ""
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Create physical skeleton"
+msgstr ""
+
+#: editor/plugins/skeleton_ik_editor_plugin.cpp
+msgid "Play IK"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling: "
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translating: "
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Objects Drawn"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Material Changes"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Shader Changes"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Surface Changes"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Draw Calls"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Vertices"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "FPS"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Lock View Rotation"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Unshaded"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Environment"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Gizmos"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Information"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View FPS"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Half Resolution"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Doppler Enable"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Cinematic Preview"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Left"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Right"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Forward"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Backwards"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Up"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Down"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Speed Modifier"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Select Mode (Q)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Drag: Rotate\n"
+"Alt+Drag: Move\n"
+"Alt+RMB: Depth list selection"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Space Mode (%s)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Mode (%s)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Tool Select"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Tool Move"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Tool Rotate"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Tool Scale"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Toggle Freelook"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap object to floor"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog..."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Settings"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Sprite is empty!"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Can't convert a sprite using animation frames to mesh."
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Invalid geometry, can't replace by mesh."
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Sprite"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Convert to 2D Mesh"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create 2D Mesh"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Simplification: "
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Grow (Pixels): "
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Update Preview"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Settings:"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Move (Before)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Move (After)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "SpriteFrames"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Region Rect"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: scene/resources/visual_shader.cpp
+msgid "None"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Sep.:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "TextureRegion"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove All Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove All"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Edit theme..."
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Theme editing menu."
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create From Current Editor Theme"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Radio Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Radio Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Has,Many,Options"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
+msgid "Style"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase Selection"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Fix Invalid Tiles"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Cut Selection"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Line Draw"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rectangle Paint"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket Fill"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find Tile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint Tile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Copy Selection"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate left"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate right"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Flip horizontally"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Flip vertically"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Clear transform"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Texture(s) to TileSet."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove selected Texture from TileSet."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Erase bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new polygon."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "You haven't selected a texture to remove."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Texture"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Drag handles to edit Rect.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete selected Rect."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select current edited sub-tile.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete polygon."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to use as icon, this will be also used on invalid autotile "
+"bindings.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its priority.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Tile"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Tile"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "This property can't be changed."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "TileSet"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vertex"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Fragment"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Light"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "VisualShader"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Runnable"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Delete patch '%s' from list?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Delete preset '%s'?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export templates for this platform are missing/corrupted:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Presets"
+msgstr ""
+
+#: editor/project_export.cpp editor/project_settings_editor.cpp
+msgid "Add..."
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export Path"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export all resources in the project"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export selected scenes (and dependencies)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export selected resources (and dependencies)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Resources to export:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma separated, e.g: *.json, *.txt)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid ""
+"Filters to exclude files from project (comma separated, e.g: *.json, *.txt)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Patches"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Make Patch"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Features"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Custom (comma-separated):"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Feature List:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export templates for this platform are missing:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export With Debug"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "The path does not exist."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Please choose an empty folder."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Please choose a 'project.godot' or '.zip' file."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Directory already contains a Godot project."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Imported Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Invalid Project Name."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Couldn't create folder."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "There is already a folder in this path with the specified name."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "It would be a good idea to name your project."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Couldn't load project.godot in project path (error %d). It may be missing or "
+"corrupted."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Couldn't edit project.godot in project path."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Couldn't create project.godot in project path."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Rename Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Import & Edit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Create & Edit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Install & Edit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Create folder"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Installation Path:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Can't open project at '%s'."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Can't run project: no main scene defined.\n"
+"Please edit the project and set the main scene in \"Project Settings\" under "
+"the \"Application\" category."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Can't run project: Assets need to be imported.\n"
+"Please edit the project to trigger the initial import."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Language changed.\n"
+"The UI will update next time the editor or project manager starts."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project List"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Templates"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Exit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Restart Now"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Can't run project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"You don't currently have any projects.\n"
+"Would you like to explore the official example projects in the Asset Library?"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Key "
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid ""
+"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
+"'\"'"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Action '%s' already exists!"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Change Action deadzone"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "All Devices"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Device"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Press a Key..."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Left Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Right Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Left Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Right Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "X Button 1"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "X Button 2"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joypad Axis Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Axis"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joypad Button Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Erase Input Action"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Left Button."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Right Button."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Middle Button."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Up."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Down."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Global Property"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Select a setting item first!"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "No property '%s' exists."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Setting '%s' is internal, and it can't be deleted."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Delete Item"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid ""
+"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
+"'\"'."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Already existing"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Settings saved OK."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Override for Feature"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Changed Locale Filter"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Changed Locale Filter Mode"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Project Settings (project.godot)"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Override For..."
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Editor must be restarted for changes to take effect"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Input Map"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Action:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Action"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Deadzone"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Device:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Localization"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Translations"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Translations:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remaps"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Resources:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Locale"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Locales Filter"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Show all locales"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Show only selected locales"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Filter mode:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Locales:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "File..."
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Dir..."
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Select Node"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Pick a Node"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: editor/property_selector.cpp
+msgid "Select Property"
+msgstr ""
+
+#: editor/property_selector.cpp
+msgid "Select Virtual Method"
+msgstr ""
+
+#: editor/property_selector.cpp
+msgid "Select Method"
+msgstr ""
+
+#: editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr ""
+
+#: editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+
+#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Batch Rename"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Prefix"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Advanced options"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Substitute"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Node name"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Node's parent name, if available"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Node type"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Current scene name"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Root node name"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid ""
+"Sequential integer counter.\n"
+"Compare counter options."
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Per Level counter"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "If set the counter restarts for each group of child nodes"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Initial value for the counter"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Step"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Amount by which counter is incremented for each node"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Padding"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid ""
+"Minimum number of digits for the counter.\n"
+"Missing digits are padded with leading zeros."
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Regular Expressions"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Post-Process"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Keep"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "CamelCase to under_scored"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "under_scored to CamelCase"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Case"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "To Lowercase"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "To Uppercase"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Reset"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Error"
+msgstr ""
+
+#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Script"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can not perform with the root node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Save New Scene As..."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Create Root Node:"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "2D Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "3D Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "User Interface"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Custom Node"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Sub-Resources"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Extend Script"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Make Scene Root"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Copy Node Path"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Remote"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Local"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Toggle Visible"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Node configuration warning:"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node has connection(s) and group(s).\n"
+"Click to show signals dock."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node has connections.\n"
+"Click to show signals dock."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node is in group(s).\n"
+"Click to show groups dock."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp editor/script_create_dialog.cpp
+msgid "Open Script"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node is locked.\n"
+"Click to unlock it."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Children are not selectable.\n"
+"Click to make selectable."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Toggle Visibility"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"AnimationPlayer is pinned.\n"
+"Click to unpin."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Node Configuration Warning!"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Error loading template '%s'"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Error - Could not create script in filesystem."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Open Script/Choose Location"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Directory of the same name exists"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "File exists, will be reused"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Wrong extension chosen"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid Path"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid inherited parent name or path"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Script valid"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Allowed: a-z, A-Z, 0-9 and _"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Built-in script (into scene file)"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Create new script file"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Load existing script file"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Inherits"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Class Name"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Template"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Built-in Script"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Remote "
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Stack Trace"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Pick one or more items from the list to display the graph."
+msgstr ""
+
+#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp
+msgid "Errors"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Copy Error"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Binding"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change AudioStreamPlayer3D Emission Angle"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier AABB"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Particles AABB"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Cylinder Shape Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Cylinder Shape Height"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Cylinder Radius"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Cylinder Height"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Torus Inner Radius"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Torus Outer Radius"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Select the dynamic library for this entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Select dependencies of the library for this entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Remove current entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Double click to create a new entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Platform:"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Platform"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Dynamic Library"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Add an architecture entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "GDNativeLibrary"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Library"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Status"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Libraries: "
+msgstr ""
+
+#: modules/gdnative/register_types.cpp
+msgid "GDNative"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Step argument is zero!"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not a script with an instance"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not based on a script"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not based on a resource file"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Object can't provide a length."
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Next Plane"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Previous Plane"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Plane:"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Next Floor"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Previous Floor"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Floor:"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Delete Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Fill Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Duplicate Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Grid Map"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Snap View"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Disabled"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Above"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Below"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit X Axis"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit Y Axis"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit Z Axis"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate X"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate Y"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate Z"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate X"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate Y"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate Z"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Clear Rotation"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Create Area"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Create Exterior Connector"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Erase Area"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clear Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Fill Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Settings"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Pick Distance:"
+msgstr ""
+
+#: modules/mono/csharp_script.cpp
+msgid "Class name can't be a reserved keyword"
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Generating solution..."
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Generating C# project..."
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Failed to create solution."
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Failed to save solution."
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Done"
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Failed to create C# project."
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Mono"
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "About C# support"
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Create C# solution"
+msgstr ""
+
+#: modules/mono/editor/mono_bottom_panel.cpp
+msgid "Builds"
+msgstr ""
+
+#: modules/mono/editor/mono_bottom_panel.cpp
+msgid "Build Project"
+msgstr ""
+
+#: modules/mono/editor/mono_bottom_panel.cpp
+msgid "Warnings"
+msgstr ""
+
+#: modules/mono/editor/mono_bottom_panel.cpp
+msgid "View log"
+msgstr ""
+
+#: modules/mono/mono_gd/gd_mono_utils.cpp
+msgid "End of inner exception stack trace"
+msgstr ""
+
+#: modules/recast/navigation_mesh_editor_plugin.cpp
+msgid "Bake NavMesh"
+msgstr ""
+
+#: modules/recast/navigation_mesh_editor_plugin.cpp
+msgid "Clear the navigation mesh."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Setting up Configuration..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Calculating grid size..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating heightfield..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Marking walkable triangles..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Constructing compact heightfield..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Eroding walkable area..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Partitioning..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating contours..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating polymesh..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Converting to native navigation mesh..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Navigation Mesh Generator Setup:"
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Parsing Geometry..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Done!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Signal Arguments"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Argument Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Argument name"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Set Variable Default Value"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Set Variable Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove VisualScript Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Duplicate VisualScript Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Base Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Move Node(s)"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove VisualScript Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Node Data"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Node Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Script already has function '%s'"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Input Value"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Can't copy the function node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Clipboard is empty!"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste VisualScript Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Member"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Search VisualScript"
+msgstr ""
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Get %s"
+msgstr ""
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Set %s"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Run in Browser"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Run exported HTML in the system's default browser."
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not write file:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not open template for export:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Invalid export template:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not read custom HTML shell:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not read boot splash image file:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Using default boot splash image."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+
+#: scene/2d/collision_object_2d.cpp
+msgid ""
+"This node has no shape, so it can't collide or interact with other objects.\n"
+"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
+"define its shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp scene/3d/particles.cpp
+msgid ""
+"A material to process the particles is not assigned, so no behavior is "
+"imprinted."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+
+#: scene/2d/physics_body_2d.cpp
+msgid ""
+"Size changes to RigidBody2D (in character or rigid modes) will be overridden "
+"by the physics engine when running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+
+#: scene/2d/skeleton_2d.cpp
+msgid "This Bone2D chain should end at a Skeleton2D node."
+msgstr ""
+
+#: scene/2d/skeleton_2d.cpp
+msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
+msgstr ""
+
+#: scene/2d/skeleton_2d.cpp
+msgid ""
+"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
+msgstr ""
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRCamera must have an ARVROrigin node as its parent"
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRController must have an ARVROrigin node as its parent"
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid ""
+"The controller id must not be 0 or this controller will not be bound to an "
+"actual controller"
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRAnchor must have an ARVROrigin node as its parent"
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid ""
+"The anchor id must not be 0 or this anchor will not be bound to an actual "
+"anchor"
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVROrigin requires an ARVRCamera child node"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "%d%%"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "(Time Left: %d:%02d s)"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Plotting Meshes: "
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Plotting Lights:"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp
+msgid "Finishing Plot"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Lighting Meshes: "
+msgstr ""
+
+#: scene/3d/collision_object.cpp
+msgid ""
+"This node has no shape, so it can't collide or interact with other objects.\n"
+"Consider adding a CollisionShape or CollisionPolygon as a child to define "
+"its shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr ""
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
+#: scene/3d/gi_probe.cpp
+msgid "Plotting Meshes"
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+
+#: scene/3d/particles.cpp
+msgid ""
+"Nothing is visible because meshes have not been assigned to draw passes."
+msgstr ""
+
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
+#: scene/3d/physics_body.cpp
+msgid ""
+"Size changes to RigidBody (in character or rigid modes) will be overridden "
+"by the physics engine when running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+
+#: scene/3d/remote_transform.cpp
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid "WorldEnvironment needs an Environment resource."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set "
+"this environment's Background Mode to Canvas (for 2D scenes)."
+msgstr ""
+
+#: scene/3d/soft_body.cpp
+msgid "This body will be ignored until you set a mesh"
+msgstr ""
+
+#: scene/3d/soft_body.cpp
+msgid ""
+"Size changes to SoftBody will be overridden by the physics engine when "
+"running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+
+#: scene/3d/vehicle_body.cpp
+msgid ""
+"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use "
+"it as a child of a VehicleBody."
+msgstr ""
+
+#: scene/animation/animation_blend_tree.cpp
+msgid "On BlendTree node '%s', animation not found: '%s'"
+msgstr ""
+
+#: scene/animation/animation_blend_tree.cpp
+msgid "Animation not found: '%s'"
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "In node '%s', invalid animation: '%s'."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Invalid animation: '%s'."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Nothing connected to input '%s' of node '%s'."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "A root AnimationNode for the graph is not set."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Path to an AnimationPlayer node containing animations is not set."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "AnimationPlayer root is not a valid node."
+msgstr ""
+
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
+#: scene/gui/color_picker.cpp
+msgid "Raw Mode"
+msgstr ""
+
+#: scene/gui/color_picker.cpp
+msgid "Add current color as a preset"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr ""
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
+#: scene/gui/scroll_container.cpp
+msgid ""
+"ScrollContainer is intended to work with a single child control.\n"
+"Use a container as child (VBox,HBox,etc), or a Control and set the custom "
+"minimum size manually."
+msgstr ""
+
+#: scene/gui/tree.cpp
+msgid "(Other)"
+msgstr ""
+
+#: scene/main/scene_tree.cpp
+msgid ""
+"Default Environment as specified in Project Settings (Rendering -> "
+"Environment -> Default Environment) could not be loaded."
+msgstr ""
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+msgid "Error initializing FreeType."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+msgid "Unknown font format."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+msgid "Error loading font."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+msgid "Invalid font size."
+msgstr ""
+
+#: scene/resources/visual_shader.cpp
+msgid "Input"
+msgstr ""
+
+#: scene/resources/visual_shader_nodes.cpp
+msgid "Invalid source for shader."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Assignment to function."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Assignment to uniform."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Varyings can only be assigned in vertex function."
+msgstr ""
diff --git a/editor/translations/extract.py b/editor/translations/extract.py
index ebb032fd6f..fd9b1183c4 100755
--- a/editor/translations/extract.py
+++ b/editor/translations/extract.py
@@ -38,8 +38,8 @@ unique_str = []
unique_loc = {}
main_po = """
# LANGUAGE translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
diff --git a/editor/translations/fa.po b/editor/translations/fa.po
index 2a5818db88..fce5d80ac1 100644
--- a/editor/translations/fa.po
+++ b/editor/translations/fa.po
@@ -1,6 +1,6 @@
# Persian translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# alabd14313 <alabd14313@yahoo.com>, 2016.
# Dante Marshal <Marshal.Devilhunter@gmail.com>, 2018.
@@ -9,18 +9,21 @@
# rezapouya <r.pouya@chmail.ir>, 2016.
# sayyed hamed nasib <cghamed752@chmail.ir>, 2017.
# Behrooz Kashani <bkashani@gmail.com>, 2018.
+# Mahdi <sadisticwarlock@gmail.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-07-24 19:42+0000\n"
-"Last-Translator: Behrooz Kashani <bkashani@gmail.com>\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:35+0100\n"
+"Last-Translator: Mahdi <sadisticwarlock@gmail.com>\n"
"Language-Team: Persian <https://hosted.weblate.org/projects/godot-engine/"
"godot/fa/>\n"
"Language: fa\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 3.1-dev\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -30,7 +33,7 @@ msgstr ""
"کنید ."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
@@ -82,19 +85,16 @@ msgid "Mirror"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "کلید را در انیمیشن درج کن"
+msgstr "کلید را وارد کن"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "انتخاب شده را به دو تا تکثیر کن"
+msgstr "کلید تکراری درست کن"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "انتخاب شده را حذ٠کن"
+msgstr "کلید‌ها را پاک کن"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -150,19 +150,16 @@ msgid "Animation Playback Track"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
-msgstr "Ø§ÙØ²ÙˆØ¯Ù† ترَک به انیمیشن"
+msgstr "ترک را اضاÙÙ‡ Ú©Ù†"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Length Time (seconds)"
-msgstr "طول انیمیشن (به ثانیه)."
+msgstr "طول انیمیشن (به ثانیه)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "بزرگنمایی در انیمیشن."
+msgstr "تکرار انیمیشن"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -195,9 +192,8 @@ msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
msgstr ""
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "ترک انتخاب شده را حذ٠کن."
+msgstr "این ترک را حذ٠کن."
#: editor/animation_track_editor.cpp
#, fuzzy
@@ -272,11 +268,10 @@ msgstr "ساختن تعداد d% ترک جدید، ودرج کلیدها؟"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
-msgstr "ساختن"
+msgstr "تولید"
#: editor/animation_track_editor.cpp
msgid "Anim Insert"
@@ -406,8 +401,7 @@ msgstr "انتخاب شده را تغییر مقیاس بده"
msgid "Scale From Cursor"
msgstr "از مکان‌نما تغییر مقیاس بده"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "انتخاب شده را به دو تا تکثیر کن"
@@ -421,11 +415,13 @@ msgid "Delete Selection"
msgstr "انتخاب شده را حذ٠کن"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+#, fuzzy
+msgid "Go to Next Step"
msgstr "به گام بعدی برو"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+#, fuzzy
+msgid "Go to Previous Step"
msgstr "به گام قبلی برو"
#: editor/animation_track_editor.cpp
@@ -528,11 +524,11 @@ msgstr "تطبیقی ندارد"
msgid "Replaced %d occurrence(s)."
msgstr "تعداد d% رخداد جایگزین شد."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "بین حرو٠کوچک و بزرگ لاتین تمایز قائل شو"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "عین کلمات (بدون هیچ کم و کاستی)"
@@ -548,15 +544,19 @@ msgstr "جایگزینی همه"
msgid "Selection Only"
msgstr "تنها در قسمت انتخاب شده"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "بزرگنمایی بیشتر"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "بزرگنمایی کمتر"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "بازنشانی بزرگنمایی"
@@ -565,11 +565,10 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "بزرگنمایی بیشتر"
+msgid "Font Size:"
+msgstr ""
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "خط:"
@@ -602,6 +601,7 @@ msgstr "Ø§ÙØ²ÙˆØ¯Ù†"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -682,7 +682,7 @@ msgid "Edit Connection: "
msgstr "خطای اتصال"
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -731,23 +731,20 @@ msgid "Recent:"
msgstr "اخیر:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "جستجو:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "تطبیق‌ها:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "توضیح:"
@@ -786,8 +783,7 @@ msgid "Resource"
msgstr "منبع"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "مسیر"
@@ -808,9 +804,10 @@ msgid "Search Replacement Resource:"
msgstr "منبع جایگزینی را جستجو کن:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -843,7 +840,8 @@ msgid "Error loading:"
msgstr "خطا در بارگذاری:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+#, fuzzy
+msgid "Load failed due to missing dependencies:"
msgstr "خطا در بارگذاری صحنه به دلیل بستگی‌های Ù…Ùقود:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -902,14 +900,6 @@ msgstr "تغییر مقدار دیکشنری"
msgid "Thanks from the Godot community!"
msgstr "با تشکر از سوی جامعه‌ی Godot!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "مواÙقت"
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "شرکت‌کنندگان در ساخت موتور Godot"
@@ -1001,7 +991,7 @@ msgid "Uncompressing Assets"
msgstr "عست های غیر ÙØ´Ø±Ø¯Ù‡"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+msgid "Package installed successfully!"
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1084,8 +1074,7 @@ msgid "Bus options"
msgstr ""
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr ""
@@ -1248,7 +1237,7 @@ msgid "Add AutoLoad"
msgstr "بارگذاری خودکار (AutoLoad) را اضاÙÙ‡ Ú©Ù†"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "مسیر:"
@@ -1256,8 +1245,8 @@ msgstr "مسیر:"
msgid "Node Name:"
msgstr "نام گره:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr ""
@@ -1328,13 +1317,18 @@ msgid "Template file not found:"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+#, fuzzy
+msgid "Select Current Folder"
+msgstr "ساختن پوشه"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "ÙØ§ÛŒÙ„ وجود دارد، آیا بازنویسی شود؟"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
#, fuzzy
-msgid "Select Current Folder"
-msgstr "ساختن پوشه"
+msgid "Select This Folder"
+msgstr "انتخاب حالت"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
@@ -1342,13 +1336,14 @@ msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr "باز شدن مدیر پروژه؟"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
-msgstr ""
+#, fuzzy
+msgid "Show in File Manager"
+msgstr "باز شدن مدیر پروژه؟"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
@@ -1383,7 +1378,8 @@ msgid "Open a File or Directory"
msgstr "یک پرونده یا پوشه را باز کن"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "ذخیره کن"
@@ -1441,8 +1437,7 @@ msgstr "پوشه‌ها و پرونده‌ها:"
msgid "Preview:"
msgstr ""
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "پرونده:"
@@ -1458,24 +1453,11 @@ msgstr ""
msgid "(Re)Importing Assets"
msgstr "(در حال) وارد کردن دوباره عست ها"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "جستجوی راهنما"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "Ùهرست کلاس:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "جستجوی کلاسها"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr ""
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "کلاس:"
@@ -1492,28 +1474,31 @@ msgid "Brief Description:"
msgstr "خلاصه توضیحات:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "عضوها"
+msgid "Properties"
+msgstr ""
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "عضوها:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "روش های عمومی"
+msgid "Methods"
+msgstr "روش ها"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr ""
+#, fuzzy
+msgid "Methods:"
+msgstr "روش ها"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr ""
+#, fuzzy
+msgid "Theme Properties"
+msgstr "صاÙÛŒ کردن گره‌ها"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr ""
+#, fuzzy
+msgid "Theme Properties:"
+msgstr "صاÙÛŒ کردن گره‌ها"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1540,10 +1525,16 @@ msgid "Constants:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Description"
+#, fuzzy
+msgid "Class Description"
msgstr "توضیحات"
#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
+msgstr "توضیح:"
+
+#: editor/editor_help.cpp
msgid "Online Tutorials:"
msgstr ""
@@ -1555,11 +1546,13 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr ""
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "توضیحات مشخصه:"
#: editor/editor_help.cpp
-msgid "Property Description:"
+#, fuzzy
+msgid "Property Descriptions:"
msgstr "توضیحات مشخصه:"
#: editor/editor_help.cpp
@@ -1569,12 +1562,14 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "روش ها"
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "توضیحات"
#: editor/editor_help.cpp
-msgid "Method Description:"
-msgstr ""
+#, fuzzy
+msgid "Method Descriptions:"
+msgstr "توضیح:"
#: editor/editor_help.cpp
msgid ""
@@ -1582,12 +1577,60 @@ msgid ""
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-#: editor/editor_inspector.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "جستجوی راهنما"
+
+#: editor/editor_help_search.cpp
#, fuzzy
-msgid "Property: "
+msgid "Display All"
+msgstr "جایگزینی همه"
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Methods Only"
+msgstr "روش ها"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "سیگنال‌ها"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Constants Only"
+msgstr "ثابت ها"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Properties Only"
+msgstr "ویژگی:"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Theme Properties Only"
+msgstr "دارایی Setter را اضاÙÙ‡ Ú©Ù†"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Member Type"
+msgstr "عضوها"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Class"
+msgstr "کلاس:"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
msgstr "ویژگی:"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1622,6 +1665,11 @@ msgstr ""
msgid "Error saving resource!"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "مواÙقت"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "ذخیره منبع از ..."
@@ -1678,10 +1726,20 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr ""
@@ -1910,6 +1968,12 @@ msgstr "خطای بارگذاری قلم."
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1950,6 +2014,12 @@ msgstr ""
msgid "Default"
msgstr "Ù¾ÛŒØ´ÙØ±Ø¶"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+#, fuzzy
+msgid "Show in FileSystem"
+msgstr "سامانه پرونده"
+
#: editor/editor_node.cpp
#, fuzzy
msgid "Play This Scene"
@@ -2034,8 +2104,9 @@ msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save all Scenes"
-msgstr ""
+#, fuzzy
+msgid "Save All Scenes"
+msgstr "ذخیره صحنه در ..."
#: editor/editor_node.cpp
msgid "Close Scene"
@@ -2063,7 +2134,7 @@ msgid "Undo"
msgstr "خنثی کردن (Undo)"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -2087,7 +2158,7 @@ msgstr "ترجیحات پروژه"
msgid "Export"
msgstr "صدور"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "ابزارها"
@@ -2101,6 +2172,7 @@ msgid "Quit to Project List"
msgstr "خروج به Ùهرست پروژه ها"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "اشکال زدا"
@@ -2211,10 +2283,6 @@ msgstr "مدیریت صدور قالب ها"
msgid "Help"
msgstr "راهنما"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2309,24 +2377,24 @@ msgstr ""
msgid "Disable Update Spinner"
msgstr ""
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "وارد کردن"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "گره"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "سامانه پرونده"
#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "گره"
+
+#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
msgstr ""
@@ -2462,7 +2530,7 @@ msgstr ""
msgid "Physics Frame %"
msgstr ""
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "زمان:"
@@ -2488,7 +2556,7 @@ msgstr "زمان:"
msgid "Calls"
msgstr "ÙØ±Ø§Ø®ÙˆØ§Ù†ÛŒ"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2500,20 +2568,44 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "مسیر نامعتبر."
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
#, fuzzy
msgid "New Script"
msgstr "صحنه جدید"
@@ -2526,10 +2618,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2538,7 +2626,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "چسباندن"
@@ -2826,6 +2915,11 @@ msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr ""
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "برگزیده‌ها:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
@@ -2864,8 +2958,8 @@ msgstr "خطا در بارگذاری:"
msgid "Unable to update dependencies:"
msgstr "خطا در بارگذاری صحنه به دلیل بستگی‌های Ù…Ùقود:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2873,10 +2967,6 @@ msgid "Provided name contains invalid characters"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Name contains invalid characters."
msgstr "کاراکترهای معتبر:"
@@ -2904,29 +2994,23 @@ msgid "Duplicating folder:"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "تغییر نام..."
+#, fuzzy
+msgid "Open Scene(s)"
+msgstr "باز کردن صحنه"
#: editor/filesystem_dock.cpp
-msgid "Move To..."
+msgid "Instance"
msgstr ""
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open Scene(s)"
-msgstr "باز کردن صحنه"
+msgid "Add to favorites"
+msgstr "برگزیده‌ها:"
#: editor/filesystem_dock.cpp
-msgid "Instance"
-msgstr ""
+#, fuzzy
+msgid "Remove from favorites"
+msgstr "حذ٠نقطهٔ منحنی"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -2936,12 +3020,20 @@ msgstr ""
msgid "View Owners..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "تغییر نام..."
+
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Duplicate..."
msgstr "انتخاب شده را به دو تا تکثیر کن"
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
msgstr "صحنه جدید"
@@ -2951,6 +3043,15 @@ msgstr "صحنه جدید"
msgid "New Resource..."
msgstr "ذخیره منبع از ..."
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Collapse All"
+msgstr "بستن"
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -2971,34 +3072,26 @@ msgid "Re-Scan Filesystem"
msgstr "پویش دوباره سامانه پرونده"
#: editor/filesystem_dock.cpp
-msgid "Toggle folder status as Favorite."
-msgstr ""
+#, fuzzy
+msgid "Toggle split mode"
+msgstr "یک Breakpoint درج کن"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Show current scene file."
-msgstr "ساختن پوشه"
+msgid "Search files"
+msgstr "جستجوی کلاسها"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "جستجوی کلاسها"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
msgstr ""
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr ""
@@ -3015,31 +3108,23 @@ msgid "Create Script"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Find in files"
-msgstr ""
-
-#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find: "
+msgid "Find in Files"
msgstr "ÛŒØ§ÙØªÙ†"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Whole words"
-msgstr "عین کلمات (بدون هیچ کم و کاستی)"
+msgid "Find:"
+msgstr "ÛŒØ§ÙØªÙ†"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Match case"
-msgstr "بین حرو٠کوچک و بزرگ لاتین تمایز قائل شو"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "ساختن پوشه"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Filter: "
+msgid "Filters:"
msgstr "صاÙÛŒ:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -3057,6 +3142,11 @@ msgstr "لغو"
#: editor/find_in_files.cpp
#, fuzzy
+msgid "Find: "
+msgstr "ÛŒØ§ÙØªÙ†"
+
+#: editor/find_in_files.cpp
+#, fuzzy
msgid "Replace: "
msgstr "جایگزینی"
@@ -3082,7 +3172,7 @@ msgstr "بارگذاری خودکار 's%' هم اکنون موجود است!"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr "نام نامعتبر."
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3218,18 +3308,15 @@ msgstr "وارد کردن دوباره"
msgid "Failed to load resource."
msgstr ""
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr ""
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
-msgstr ""
+#, fuzzy
+msgid "Expand All Properties"
+msgstr "Ø§ÙØ²ÙˆØ¯Ù† ویژگی سراسری"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
-msgstr ""
+#, fuzzy
+msgid "Collapse All Properties"
+msgstr "صاÙÛŒ کردن گره‌ها"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -3274,6 +3361,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr ""
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr ""
@@ -3337,46 +3428,48 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
-msgstr ""
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
+msgstr "انتخاب شده را تغییر مقیاس بده"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
-msgstr ""
+#, fuzzy
+msgid "Edit Polygon"
+msgstr "ویرایش سیگنال"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
-msgstr ""
+#, fuzzy
+msgid "Remove Polygon And Point"
+msgstr "برداشتن نقش"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr ""
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr "حذ٠کن"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
#, fuzzy
-msgid "Delete points"
-msgstr "حذ٠کن"
+msgid "Erase points."
+msgstr "Ú©Ùندی در آغاز"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3391,7 +3484,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
+msgid "Load..."
msgstr "بارگیری"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3420,15 +3513,9 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "حذ٠کن"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "Ú©Ùندی در آغاز"
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3469,9 +3556,8 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3506,7 +3592,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
-msgid "Add Node.."
+msgid "Add Node..."
msgstr "Ø§ÙØ²ÙˆØ¯Ù† گره"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3789,7 +3875,7 @@ msgstr "اتصال گره‌ها"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "ترک انتخاب شده را حذ٠کن."
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3858,10 +3944,6 @@ msgid "Amount:"
msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr ""
@@ -4064,7 +4146,7 @@ msgstr "همه"
msgid "Plugins"
msgstr ""
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "مرتب‌سازی:"
@@ -4191,6 +4273,10 @@ msgid "Resize CanvasItem"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
msgstr ""
@@ -4211,21 +4297,19 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "بزرگنمایی کمتر"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "بزرگنمایی کمتر"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "بزرگنمایی بیشتر"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr "انتخاب حالت"
@@ -4254,6 +4338,11 @@ msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "انتخاب حالت"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4349,6 +4438,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "تنها در قسمت انتخاب شده"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr ""
@@ -4400,6 +4494,10 @@ msgid "Show Viewport"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr ""
@@ -4470,7 +4568,16 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "انتخاب شده را تغییر مقیاس بده"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
msgstr ""
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
@@ -4574,35 +4681,9 @@ msgid "Item List Editor"
msgstr ""
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr ""
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr ""
@@ -4836,12 +4917,12 @@ msgid "Populate"
msgstr ""
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
+msgid "Generating Visibility Rect"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -4870,6 +4951,12 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "Convert to CPUParticles"
+msgstr "اتصال به گره:"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr ""
@@ -4939,13 +5026,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "اتصال به گره:"
+msgid "Generate AABB"
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -4969,6 +5055,11 @@ msgid "Add Point to Curve"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "ویرایش منحنی گره"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr ""
@@ -4996,6 +5087,10 @@ msgid "Click: Add Point"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr ""
@@ -5011,11 +5106,6 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr ""
@@ -5076,6 +5166,10 @@ msgstr "برداشتن نقش"
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5087,54 +5181,66 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync bones"
+msgid "Sync Bones"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create UV Map"
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create Polygon & UV"
+msgid "Create UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
+msgid "Create Polygon & UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "ساختن راهنمای اÙÙ‚ÛŒ"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "پیش از این وجود داشته است"
+msgid "Remove Internal Vertex"
+msgstr "برداشتن متغیر"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Add Split"
-msgstr "Ø§ÙØ²ÙˆØ¯Ù† نقطه"
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "مسیر نامعتبر."
+msgid "Add Custom Polygon"
+msgstr "ویرایش سیگنال"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "برداشتن نقطه"
+msgid "Remove Custom Polygon"
+msgstr "برداشتن نقش"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
+#, fuzzy
+msgid "Transform Polygon"
+msgstr "انتخاب شده را تغییر مقیاس بده"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Open Polygon 2D UV editor."
+msgstr "گشودن ویرایشگر دو بعدی"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
msgstr ""
@@ -5143,12 +5249,14 @@ msgid "UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Poly"
-msgstr ""
+#, fuzzy
+msgid "Points"
+msgstr "برداشتن نقطه"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Splits"
-msgstr ""
+#, fuzzy
+msgid "Polygons"
+msgstr "ویرایش سیگنال"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Bones"
@@ -5156,12 +5264,8 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
-msgstr "انتخاب شده را تغییر مقیاس بده"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
-msgstr ""
+msgid "Move Points"
+msgstr "برداشتن نقطه"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
@@ -5188,20 +5292,21 @@ msgid "Scale Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "نخست، یک تنظیم را انتخاب کنید!"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5226,6 +5331,11 @@ msgid "Grid Settings"
msgstr "ترجیحات"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr ""
@@ -5283,22 +5393,22 @@ msgid "Paste Resource"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "گشودن در ویرایشگر"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "گشودن در ویرایشگر"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr ""
@@ -5331,6 +5441,11 @@ msgstr "خطا در بارگذاری:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
+msgid "Error: could not load file."
+msgstr "نمی‌تواند یک پوشه ایجاد شود."
+
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Error could not load file."
msgstr "نمی‌تواند یک پوشه ایجاد شود."
@@ -5340,20 +5455,24 @@ msgid "Error saving file!"
msgstr "خطا در بارگذاری:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr ""
+#, fuzzy
+msgid "Error while saving theme."
+msgstr "خطای بارگذاری قلم."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
-msgstr ""
+#, fuzzy
+msgid "Error Saving"
+msgstr "خطا در بارگذاری:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr ""
+#, fuzzy
+msgid "Error importing theme."
+msgstr "خطای بارگذاری قلم."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
-msgstr ""
+#, fuzzy
+msgid "Error Importing"
+msgstr "خطا در بارگذاری:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -5375,6 +5494,14 @@ msgid "Import Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr ""
@@ -5417,8 +5544,8 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile"
-msgstr "نمایش پرونده ها"
+msgid "Open..."
+msgstr "باز کن"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5435,12 +5562,8 @@ msgstr "رونوشت مسیر گره"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Show In File System"
-msgstr "سامانه پرونده"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
-msgstr ""
+msgid "History Previous"
+msgstr "زبانه قبلی"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
@@ -5452,15 +5575,16 @@ msgid "Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Reload Theme"
-msgstr ""
+#, fuzzy
+msgid "Import Theme..."
+msgstr "من میبینم ..."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme"
+msgid "Reload Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
+msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5512,7 +5636,7 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr "ویرایشگر بستگی"
#: editor/plugins/script_editor_plugin.cpp
@@ -5520,10 +5644,6 @@ msgid "Open Godot online documentation"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -5560,19 +5680,9 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Search results"
+msgid "Search Results"
msgstr "جستجوی راهنما"
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "جستجوی کلاسها"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
@@ -5583,6 +5693,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "Ø§ÙØ²ÙˆØ¯Ù† وظیÙÙ‡"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr ""
@@ -5614,10 +5733,6 @@ msgstr ""
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5671,12 +5786,14 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
-msgstr ""
+#, fuzzy
+msgid "Convert Indent to Spaces"
+msgstr "اتصال به گره:"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
-msgstr ""
+#, fuzzy
+msgid "Convert Indent to Tabs"
+msgstr "اتصال به گره:"
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
@@ -5692,37 +5809,33 @@ msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr ""
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "به گام بعدی برو"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Convert To Lowercase"
-msgstr "اتصال به گره:"
+msgid "Go to Previous Breakpoint"
+msgstr "یک Breakpoint درج کن"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in files..."
-msgstr ""
+#, fuzzy
+msgid "Find in Files..."
+msgstr "ÛŒØ§ÙØªÙ†"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
-msgstr ""
+#, fuzzy
+msgid "Go to Function..."
+msgstr "برداشتن نقش"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
-msgstr ""
+#, fuzzy
+msgid "Go to Line..."
+msgstr "برو به خط"
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
@@ -5816,6 +5929,15 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "Pitch"
+msgstr "سوییچ"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -5986,6 +6108,11 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "بومی‌سازی"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -6088,10 +6215,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap To Floor"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "دید آزاد"
@@ -6208,6 +6331,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
msgid "Sprite is empty!"
@@ -6327,11 +6454,16 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6500,6 +6632,11 @@ msgid "Fix Invalid Tiles"
msgstr "نام نامعتبر."
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "انتخاب شده را تغییر مقیاس بده"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6547,33 +6684,38 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "برداشتن انتخاب شده"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
+msgid "Rotate left"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
+msgid "Rotate right"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Flip vertically"
msgstr ""
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Clear transform"
+msgstr "انتقال را در انیمیشن تغییر بده"
+
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr "گره(ها) را از درخت اضاÙÙ‡ Ú©Ù†"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr "حذ٠نقطهٔ منحنی"
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6585,25 +6727,47 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "مسیر به سمت گره:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "Ú©Ùندی در آغاز"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "انتخاب شده را تغییر مقیاس بده"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "حذ٠نقطهٔ منحنی"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6611,7 +6775,12 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "حذ٠قالب"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6621,16 +6790,27 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "آیا پرونده‌های انتخاب شده حذ٠شود؟"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr ""
+msgstr "ساختن پوشه"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "حذ٠کن"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr "ساختن پوشه"
@@ -6648,12 +6828,100 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr "ساختن پوشه"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "ساختن پوشه"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "ویرایش صاÙÛŒ ها"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "ویرایش سیگنال"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "ویرایش سیگنال"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "ویرایش سیگنال"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "مسیر به سمت گره:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "حذ٠قالب"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "برداشتن نقش"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "برداشتن نقش"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "حذ٠ترجمه"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "ویرایش صاÙÛŒ ها"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "انتخاب شده را تغییر مقیاس بده"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "انتخاب شده را تغییر مقیاس بده"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "This property can't be changed."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Tile Set"
+msgid "TileSet"
msgstr "صدور مجموعه کاشی"
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6692,6 +6960,15 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Exporting All"
+msgstr "صدور"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6700,6 +6977,11 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "صدور پروژه"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6756,10 +7038,50 @@ msgid "Feature List:"
msgstr "Ùهرست متدها:"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "صحنه جدید"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Script Export Mode:"
+msgstr "حالت صدور:"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr "صدور pck/zip"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export mode?"
+msgstr "حالت صدور:"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Export All"
+msgstr "صدور"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -6893,7 +7215,8 @@ msgid "Unnamed Project"
msgstr "پروژه بی نام"
#: editor/project_manager.cpp
-msgid "Can't open project"
+#, fuzzy
+msgid "Can't open project at '%s'."
msgstr "ناتوان در گشودن پروژه"
#: editor/project_manager.cpp
@@ -6902,6 +7225,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7224,10 +7565,6 @@ msgstr "تنظیمات پروژه (پروژه.گودات)"
msgid "General"
msgstr "کلی"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr "ویژگی:"
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7361,10 +7698,6 @@ msgstr "کاویدن گره"
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
#, fuzzy
msgid "Select Property"
@@ -7456,7 +7789,7 @@ msgid "Step"
msgstr "گام(ها):"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7465,7 +7798,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7508,7 +7841,7 @@ msgstr ""
msgid "Reset"
msgstr "بازنشانی بزرگنمایی"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7567,6 +7900,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "ارث‌بری صحنهٔ ÙØ±Ø²Ù†Ø¯"
+
+#: editor/scene_tree_dock.cpp
#, fuzzy
msgid "Clear Script"
msgstr "صحنه جدید"
@@ -7604,6 +7941,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr "ÙØ±Ø²Ù†Ø¯ قابل ویرایش"
@@ -7681,6 +8024,11 @@ msgid "Clear Inheritance"
msgstr "پاک کردن ارث‌بری"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Open documentation"
+msgstr "شمارش ها"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr "حذ٠گره(ها)"
@@ -7689,14 +8037,15 @@ msgid "Add Child Node"
msgstr "Ø§ÙØ²ÙˆØ¯Ù† گره ÙØ±Ø²Ù†Ø¯"
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
-msgstr "ارث‌بری صحنهٔ ÙØ±Ø²Ù†Ø¯"
-
-#: editor/scene_tree_dock.cpp
msgid "Change Type"
msgstr "تغییر نوع"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Extend Script"
+msgstr "باز کردن و اجرای یک اسکریپت"
+
+#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
msgstr ""
@@ -7849,6 +8198,11 @@ msgid "Path is empty"
msgstr "مسیر خالی است"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Filename is empty"
+msgstr "مسیر خالی است"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -7945,19 +8299,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -7990,18 +8332,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -8203,7 +8533,8 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+#, fuzzy
+msgid "Step argument is zero!"
msgstr "آرگومان step ØµÙØ± است!"
#: modules/gdscript/gdscript_functions.cpp
@@ -8441,11 +8772,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -8733,6 +9060,10 @@ msgid "Base Type:"
msgstr "نوع پایه:"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "عضوها:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "گره های موجود:"
@@ -8840,11 +9171,11 @@ msgid "Search VisualScript"
msgstr "حذ٠گره اسکریپت٠دیداری"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
-msgstr "Ú¯Ø±ÙØªÙ†"
+msgid "Get %s"
+msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8943,6 +9274,12 @@ msgstr ""
"یک Ø´Ú©Ù„ باید برای CollisionShape2D ÙØ±Ø§Ù‡Ù… شده باشد تا عمل کند. Ù„Ø·ÙØ§ یک Ø´Ú©Ù„ "
"منبع برای آن ایجاد کنید!"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -8989,6 +9326,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -9120,6 +9463,16 @@ msgstr ""
"باید یک Ø´Ú©Ù„ برای CollisionShape ÙØ±Ø§Ù‡Ù… شده باشد تا عمل کند. Ù„Ø·ÙØ§ یک منبع Ø´Ú©Ù„ "
"برای آن ایجاد کنید!"
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -9141,6 +9494,32 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+"PathFollow2D تنها در زمانی Ú©Ù‡ به عنوان یک ÙØ±Ø²Ù†Ø¯ یک گره Path2D تنظیم شود کار "
+"می‌کند."
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+"PathFollow2D تنها در زمانی Ú©Ù‡ به عنوان یک ÙØ±Ø²Ù†Ø¯ یک گره Path2D تنظیم شود کار "
+"می‌کند."
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9176,7 +9555,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9236,6 +9615,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr ""
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr ""
@@ -9252,11 +9635,6 @@ msgstr "هشدار!"
msgid "Please Confirm..."
msgstr "Ù„Ø·ÙØ§Ù‹ تأیید کنید…"
-#: scene/gui/file_dialog.cpp
-#, fuzzy
-msgid "Select this Folder"
-msgstr "انتخاب حالت"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9267,6 +9645,10 @@ msgstr ""
"()*popup را ÙØ±Ø§Ø®ÙˆØ§Ù†ÛŒ کنید. در هر صورت نمایان کردن آن‌ها برای ویرایش خوب است، "
"اما به محض اجرا مخÙÛŒ می‌شوند."
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9316,10 +9698,6 @@ msgstr "اندازهٔ قلم نامعتبر."
msgid "Input"
msgstr ""
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
@@ -9337,6 +9715,82 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Split already exists."
+#~ msgstr "پیش از این وجود داشته است"
+
+#, fuzzy
+#~ msgid "Add Split"
+#~ msgstr "Ø§ÙØ²ÙˆØ¯Ù† نقطه"
+
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr "مسیر نامعتبر."
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "برداشتن نقطه"
+
+#, fuzzy
+#~ msgid "Select a split to erase it."
+#~ msgstr "نخست، یک تنظیم را انتخاب کنید!"
+
+#, fuzzy
+#~ msgid "Add Node.."
+#~ msgstr "Ø§ÙØ²ÙˆØ¯Ù† گره"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "بزرگنمایی کمتر"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "بزرگنمایی بیشتر"
+
+#, fuzzy
+#~ msgid "New TextFile"
+#~ msgstr "نمایش پرونده ها"
+
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "بزرگنمایی بیشتر"
+
+#~ msgid "Class List:"
+#~ msgstr "Ùهرست کلاس:"
+
+#~ msgid "Search Classes"
+#~ msgstr "جستجوی کلاسها"
+
+#~ msgid "Public Methods"
+#~ msgstr "روش های عمومی"
+
+#, fuzzy
+#~ msgid "Property: "
+#~ msgstr "ویژگی:"
+
+#, fuzzy
+#~ msgid "Show current scene file."
+#~ msgstr "ساختن پوشه"
+
+#, fuzzy
+#~ msgid "Whole words"
+#~ msgstr "عین کلمات (بدون هیچ کم و کاستی)"
+
+#, fuzzy
+#~ msgid "Match case"
+#~ msgstr "بین حرو٠کوچک و بزرگ لاتین تمایز قائل شو"
+
+#, fuzzy
+#~ msgid "Search in files"
+#~ msgstr "جستجوی کلاسها"
+
+#, fuzzy
+#~ msgid "Convert To Lowercase"
+#~ msgstr "اتصال به گره:"
+
+#~ msgid "Get"
+#~ msgstr "Ú¯Ø±ÙØªÙ†"
+
#~ msgid "Disabled"
#~ msgstr "ØºÛŒØ±ÙØ¹Ø§Ù„ شده"
@@ -9361,9 +9815,6 @@ msgstr ""
#~ msgid "Anim Track Change Wrap Mode"
#~ msgstr "تغییر حالت بسته شدن ترک انیمشین"
-#~ msgid "Edit Node Curve"
-#~ msgstr "ویرایش منحنی گره"
-
#~ msgid "Edit Selection Curve"
#~ msgstr "ویرایش منحنی انتخاب شده"
@@ -9427,9 +9878,6 @@ msgstr ""
#~ msgid "Thanks!"
#~ msgstr "با تشکر !"
-#~ msgid "I see..."
-#~ msgstr "من میبینم ..."
-
#, fuzzy
#~ msgid "Can't open '%s'."
#~ msgstr "در حال اتصال..."
@@ -9449,10 +9897,6 @@ msgstr ""
#~ msgid "Sequence"
#~ msgstr "دنباله"
-#, fuzzy
-#~ msgid "Switch"
-#~ msgstr "سوییچ"
-
#~ msgid "Iterator"
#~ msgstr "تکرارکننده"
diff --git a/editor/translations/fi.po b/editor/translations/fi.po
index c6efa1f56a..5a8515b81d 100644
--- a/editor/translations/fi.po
+++ b/editor/translations/fi.po
@@ -1,6 +1,6 @@
# Finnish translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# basse <basse@roiske.org>, 2017.
# Bastian Salmela <bastian.salmela@gmail.com>, 2017, 2018.
@@ -8,19 +8,21 @@
# Jarmo Riikonen <amatrelan@gmail.com>, 2017.
# Nuutti Varvikko <nvarvikko@gmail.com>, 2018.
# Sami Lehtilä <sami.lehtila@gmail.com>, 2018.
-# Tapani Niemi <tapani.niemi@kapsi.fi>, 2018.
+# Tapani Niemi <tapani.niemi@kapsi.fi>, 2018, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-08-21 21:36+0000\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2019-01-13 15:06+0000\n"
"Last-Translator: Tapani Niemi <tapani.niemi@kapsi.fi>\n"
"Language-Team: Finnish <https://hosted.weblate.org/projects/godot-engine/"
"godot/fi/>\n"
"Language: fi\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.2-dev\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -29,41 +31,38 @@ msgstr ""
"Virheellinen tyyppiargumentti convert() metodille, käytä TYPE_* vakioita."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr "Ei tarpeeksi tavuja tavujen purkamiseksi tai virheellinen formaatti."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Virheellinen syöte %i (ei välitetty) lausekkeessa"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "'self' ei kelpaa koska ilmentymä on 'null' (ei välitetty)"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "Virheellinen osoitinominaisuuden nimi '%s' solmussa %s."
+msgstr "Virheelliset operandit operaattorille %s, %s ja %s."
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid index of type %s for base type %s"
-msgstr "Virheellinen osoitinominaisuuden nimi '%s' solmussa %s."
+msgstr "Virheellinen indeksi tyyppiä %s perustyypille %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "Virheellinen nimetty indeksi '%s' perustyypille %s"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid arguments to construct '%s'"
-msgstr ": Virheellinen argumentti tyyppiä: "
+msgstr "Virheelliset argumentit rakenteelle '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "Kutsuttaessa funktiota '%s':"
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -72,27 +71,23 @@ msgstr "Vapauta"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "Tasapainotettu"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Mirror"
-msgstr "Peilaa X"
+msgstr "Peilaa"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "Lisää keyframe"
+msgstr "Lisää tähän avainruutu"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "Kahdenna valinta"
+msgstr "Kahdenna valitut avaimet"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "Poista valitut"
+msgstr "Poista valitut avaimet"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -123,46 +118,40 @@ msgid "Anim Change Call"
msgstr "Animaatio: muuta kutsua"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Property Track"
-msgstr "Ominaisuus:"
+msgstr "Ominaisuusraita"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "3D Transform Track"
-msgstr "Muunnoksen tyyppi"
+msgstr "3D-muunnosraita"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "Metodikutsuraita"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "Bezier-käyräraita"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "Äänentoistoraita"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Playback Track"
-msgstr "Lopeta animaation toisto. (S)"
+msgstr "Animaatiotoistoraita"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
-msgstr "Animaatio: Lisää raita"
+msgstr "Lisää raita"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Length Time (seconds)"
-msgstr "Animaation pituus (sekunteina)."
+msgstr "Animaation pituus (sekunteina)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "Animaation lähennystaso."
+msgstr "Animaation kierto"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -170,42 +159,36 @@ msgid "Functions:"
msgstr "Funktiot:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Audio Clips:"
-msgstr "Äänikuuntelija"
+msgstr "Äänileikkeet:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Clips:"
-msgstr "Klippejä"
+msgstr "Animaatioleikkeet:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Toggle this track on/off."
-msgstr "Käytä häiriötöntä tilaa."
+msgstr "Käytä tämä raita päälle/pois."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "Päivitystila (Kuinka tämä ominaisuus on asetettu)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Interpolation Mode"
-msgstr "Animaatiosolmu"
+msgstr "Interpolaatiotila"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "Kierron tila (Interpoloi loppu alun kanssa kiertäessä)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "Poista valittu raita."
+msgstr "Poista tämä raita."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "Ristihäivytyksen aika (s):"
+msgstr "Aika (s): "
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -220,13 +203,12 @@ msgid "Trigger"
msgstr "Liipaisin"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Capture"
-msgstr "Ominaisuudet"
+msgstr "Kaappaa"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "Lähin"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
@@ -235,30 +217,28 @@ msgstr "Lineaarinen"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr ""
+msgstr "Kuutiollinen"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
-msgstr ""
+msgstr "Leikkaa kierron interpolointi"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "Kiedo kierron interpolointi"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key"
-msgstr "Lisää keyframe"
+msgstr "Lisää avainruutu"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "Kahdenna solmu(t)"
+msgstr "Kahdenna avainruudut"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "Poista solmu(t)"
+msgstr "Poista avainruudut"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -276,7 +256,6 @@ msgstr "Luo %d uutta raitaa ja lisää avaimet?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -288,7 +267,7 @@ msgstr "Animaatio: lisää"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
-msgstr ""
+msgstr "AnimationPlayer ei voi animoida itseään, vain muita toistimia."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
@@ -304,7 +283,7 @@ msgstr "Animaatio: Lisää avain"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr ""
+msgstr "Raitojen muunnos toimii vain Spatial-pohjaisille solmuille."
#: editor/animation_track_editor.cpp
msgid ""
@@ -313,44 +292,46 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"Ääniraidat voivat osoittaa vain seuraavan tyyppisiin solmuihin:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "Animaatioraidat voivat osoittaa vain AnimationPlayer solmuihin."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
-msgstr ""
+msgstr "Animaatiotoistin ei voi animoida itseään, ainoastaan muita toistimia."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "Uutta raitaa ei voida lisätä ilman juurta"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "Raidan polku on virheellinen, joten ei voida lisätä avainruutua."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "Raita ei ole Spatial-tyyppinen, joten ei voida lisätä avainruutua"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
-msgstr ""
+msgstr "Raidan polku on virheellinen, joten ei voida lisätä metodin avainta."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Method not found in object: "
-msgstr "VariableGet ei löytynyt skriptistä: "
+msgstr "Metodia ei löydy objektista: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
msgstr "Animaatio: siirrä avaimia"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clipboard is empty"
-msgstr "Leikepöytä on tyhjä!"
+msgstr "Leikepöytä on tyhjä"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
@@ -359,25 +340,23 @@ msgstr "Animaatio: Skaalaa avaimia"
#: editor/animation_track_editor.cpp
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
-msgstr ""
+msgstr "Tämä valinta ei käy Bezier-editoinnille, koska se on vain yksi raita."
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "Näytä raidat vain puussa valituista solmuista."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr ""
+msgstr "Ryhmitä raidat solmujen mukaan tai näytä ne tavallisena luettelona."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap (s): "
-msgstr "Askellus (s):"
+msgstr "Askellus (s): "
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "Animaatiopuu on kelvollinen."
+msgstr "Animaation askelluksen arvo."
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -389,19 +368,16 @@ msgid "Edit"
msgstr "Muokkaa"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "Animaatiopuu"
+msgstr "Animaation ominaisuudet."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "Kopioi parametrit"
+msgstr "Kopioi raidat"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "Liitä parametrit"
+msgstr "Liitä raidat"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -411,8 +387,7 @@ msgstr "Skaalaa valintaa"
msgid "Scale From Cursor"
msgstr "Skaalaa kursorista"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Kahdenna valinta"
@@ -421,17 +396,16 @@ msgid "Duplicate Transposed"
msgstr "Kahdenna käänteisesti"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
msgstr "Poista valitut"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
-msgstr "Mene seuraavaan vaiheeseen"
+msgid "Go to Next Step"
+msgstr "Mene seuraavaan askeleeseen"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
-msgstr "Mene edelliseen vaiheeseen"
+msgid "Go to Previous Step"
+msgstr "Mene edelliseen askeleeseen"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
@@ -443,11 +417,11 @@ msgstr "Siivoa animaatio"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "Valitse animoitava solmu:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "Käytä Bezier-käyriä"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
@@ -495,7 +469,7 @@ msgstr "Skaalaussuhde:"
#: editor/animation_track_editor.cpp
msgid "Select tracks to copy:"
-msgstr ""
+msgstr "Valitse kopioitavat raidat:"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -533,11 +507,11 @@ msgstr "Ei osumia"
msgid "Replaced %d occurrence(s)."
msgstr "Korvattu %d osuvuutta."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Huomioi kirjainkoko"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "Kokonaisia sanoja"
@@ -553,29 +527,31 @@ msgstr "Korvaa kaikki"
msgid "Selection Only"
msgstr "Pelkkä valinta"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Lähennä"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "Loitonna"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "Palauta oletuslähennystaso"
#: editor/code_editor.cpp
-#, fuzzy
msgid "Warnings:"
-msgstr "Varoitukset"
+msgstr "Varoitukset:"
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "Lähennä (%):"
+msgid "Font Size:"
+msgstr "Fontin koko:"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Rivi:"
@@ -608,6 +584,7 @@ msgstr "Lisää"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -664,9 +641,8 @@ msgid "Disconnect '%s' from '%s'"
msgstr "Katkaise yhteys solmusta '%s' solmuun '%s'"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect all from signal: '%s'"
-msgstr "Katkaise yhteys solmusta '%s' solmuun '%s'"
+msgstr "Katkaise kaikki yhteydet signaalista: '%s'"
#: editor/connections_dialog.cpp
msgid "Connect..."
@@ -678,19 +654,16 @@ msgid "Disconnect"
msgstr "Katkaise yhteys"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect Signal: "
-msgstr "Yhdistävä signaali:"
+msgstr "Yhdistä signaali: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection: "
-msgstr "Muokkaa yhteyksiä"
+msgstr "Muokkaa yhteyttä: "
#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "Are you sure you want to remove all connections from the \""
-msgstr "Haluatko varmasti suorittaa usemman projektin?"
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr "Oletko varma, että haluat poistaa kaikki kytkennät signaalilta \"%s\"?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -698,22 +671,19 @@ msgstr "Signaalit"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr ""
+msgstr "Oletko varma, että haluat poistaa kaikki kytkennät tältä signaalilta?"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "Katkaise yhteys"
+msgstr "Katkaise kaikki yhteydet"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit..."
-msgstr "Muokkaa"
+msgstr "Muokkaa..."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "Metodit"
+msgstr "Mene metodiin"
#: editor/create_dialog.cpp
msgid "Change %s Type"
@@ -738,23 +708,20 @@ msgid "Recent:"
msgstr "Viimeaikaiset:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Hae:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "Osumat:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "Kuvaus:"
@@ -793,8 +760,7 @@ msgid "Resource"
msgstr "Resurssi"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "Polku"
@@ -815,9 +781,10 @@ msgid "Search Replacement Resource:"
msgstr "Etsi korvaava resurssi:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -850,8 +817,8 @@ msgid "Error loading:"
msgstr "Virhe ladatessa:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
-msgstr "Skenen lataaminen epäonnistui puuttuvan riippuvuuden takia:"
+msgid "Load failed due to missing dependencies:"
+msgstr "Lataaminen epäonnistui puuttuvien riippuvuuksien takia:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -909,14 +876,6 @@ msgstr "Vaihda hakurakenteen arvoa"
msgid "Thanks from the Godot community!"
msgstr "Kiitos Godot-yhteisöltä!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "OK"
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Godot moottorin kehittäjät"
@@ -1010,7 +969,7 @@ msgid "Uncompressing Assets"
msgstr "Puretaan assetteja"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+msgid "Package installed successfully!"
msgstr "Paketti asennettu onnistuneesti!"
#: editor/editor_asset_installer.cpp
@@ -1092,8 +1051,7 @@ msgid "Bus options"
msgstr "Väylän asetukset"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "Monista"
@@ -1258,7 +1216,7 @@ msgid "Add AutoLoad"
msgstr "Lisää automaattisesti ladattava"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "Polku:"
@@ -1266,8 +1224,8 @@ msgstr "Polku:"
msgid "Node Name:"
msgstr "Solmun nimi:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "Nimi"
@@ -1337,25 +1295,28 @@ msgid "Template file not found:"
msgstr "Mallitiedostoa ei löytynyt:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Valitse nykyinen kansio"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "Tiedosto on jo olemassa, korvaa?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "Valitse nykyinen kansio"
+msgid "Select This Folder"
+msgstr "Valitse tämä kansio"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
msgstr "Kopioi polku"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Open In File Manager"
-msgstr "Näytä tiedostonhallinnassa"
+msgid "Open in File Manager"
+msgstr "Avaa tiedostonhallinnassa"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+msgid "Show in File Manager"
msgstr "Näytä tiedostonhallinnassa"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1391,7 +1352,8 @@ msgid "Open a File or Directory"
msgstr "Avaa tiedosto tai hakemisto"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Tallenna"
@@ -1449,8 +1411,7 @@ msgstr "Hakemistot ja tiedostot:"
msgid "Preview:"
msgstr "Esikatselu:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "Tiedosto:"
@@ -1466,24 +1427,11 @@ msgstr "Selaa lähdetiedostoja"
msgid "(Re)Importing Assets"
msgstr "Tuodaan (uudelleen) assetteja"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "Etsi ohjeesta"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "Luokkaluettelo:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "Etsi luokkia"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "Yläpuoli"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "Luokka:"
@@ -1500,28 +1448,28 @@ msgid "Brief Description:"
msgstr "Lyhyt kuvaus:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "Jäsenet"
+msgid "Properties"
+msgstr "Ominaisuudet"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "Jäsenet:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr "Ominaisuudet:"
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "Julkiset metodit"
+msgid "Methods"
+msgstr "Metodit"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "Julkiset metodit:"
+msgid "Methods:"
+msgstr "Metodit:"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "Käyttöliittymäteeman osat"
+msgid "Theme Properties"
+msgstr "Teeman ominaisuudet"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "Käyttöliittymäteeman osat:"
+msgid "Theme Properties:"
+msgstr "Teeman ominaisuudet:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1548,8 +1496,12 @@ msgid "Constants:"
msgstr "Vakiot:"
#: editor/editor_help.cpp
-msgid "Description"
-msgstr "Kuvaus"
+msgid "Class Description"
+msgstr "Luokan kuvaus"
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
+msgstr "Luokan kuvaus:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1566,12 +1518,12 @@ msgstr ""
"sellaisen[/url][/color]."
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "Ominaisuudet"
+msgid "Property Descriptions"
+msgstr "Ominaisuuksien kuvaukset"
#: editor/editor_help.cpp
-msgid "Property Description:"
-msgstr "Ominaisuuden kuvaus:"
+msgid "Property Descriptions:"
+msgstr "Ominaisuuksien kuvaukset:"
#: editor/editor_help.cpp
msgid ""
@@ -1582,12 +1534,12 @@ msgstr ""
"$color][url=$url]kirjoittamalla sellaisen[/url][/color]!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "Metodit"
+msgid "Method Descriptions"
+msgstr "Metodien kuvaukset"
#: editor/editor_help.cpp
-msgid "Method Description:"
-msgstr "Metodin kuvaus:"
+msgid "Method Descriptions:"
+msgstr "Metodien kuvaukset:"
#: editor/editor_help.cpp
msgid ""
@@ -1597,18 +1549,58 @@ msgstr ""
"Tälle metodille ei vielä löydy kuvausta. Voit auttaa meitä [color=$color]"
"[url=$url]kirjoittamalla sellaisen[/url][/color]!"
-#: editor/editor_inspector.cpp
-#, fuzzy
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Etsi ohjeesta"
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr "Näytä kaikki"
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr "Vain luokat"
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr "Vain metodit"
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr "Vain signaalit"
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr "Vain vakiot"
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr "Vain ominaisuudet"
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr "Vain teeman ominaisuudet"
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr "Jäsenen tyyppi"
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr "Luokka"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
msgstr "Ominaisuus:"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr "Aseta"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "Aseta useita:"
#: editor/editor_log.cpp
msgid "Output:"
@@ -1636,6 +1628,11 @@ msgstr "Projektin vienti epäonnistui virhekoodilla %d."
msgid "Error saving resource!"
msgstr "Virhe tallennettaessa resurssia!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "OK"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "Tallenna resurssi nimellä..."
@@ -1654,7 +1651,7 @@ msgstr "Virhe tallennettaessa."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
-msgstr ""
+msgstr "Ei voida avata tiedostoa '%s'. Se on voitu siirtää tai tuhota."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
@@ -1690,12 +1687,25 @@ msgstr "Tätä toimintoa ei voi tehdä ilman että puun juuri on olemassa."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+"Tätä skeneä ei voida tallentaa, koska ilmentymät on sisällytetty toisiinsa "
+"syklisesti.\n"
+"Ratkaise ensin se ja yritä sitten tallennusta uudelleen."
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
"Skeneä ei voitu tallentaa. Mahdollisia riippuvuuksia (ilmentymiä tai "
"perintää) ei voida toteuttaa."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr "Ei voida ylikirjoittaa vielä auki olevaa skeneä!"
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr "Ei voitu ladata MeshLibrary resurssia yhdistämistä varten!"
@@ -1948,6 +1958,14 @@ msgstr "Virhe ladattaessa lisäosaa polusta: '%s'."
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"Virhe ladattaessa lisäosaa polusta: '%s'. Koodissa vaikuttaa olevan virhe, "
+"ole hyvä ja tarkista syntaksi."
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr "Virhe ladattaessa lisäosaa polusta: '%s'. Tyyppi ei ole EditorPlugin."
@@ -1993,15 +2011,18 @@ msgstr "Poista asettelu"
msgid "Default"
msgstr "Oletus"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr "Näytä tiedostojärjestelmässä"
+
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play This Scene"
-msgstr "Pelaa skeneä"
+msgstr "Pelaa tätä skeneä"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "Sulje muut välilehdet"
+msgstr "Sulje välilehti"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2076,7 +2097,7 @@ msgid "Save Scene"
msgstr "Tallenna skene"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+msgid "Save All Scenes"
msgstr "Tallenna kaikki skenet"
#: editor/editor_node.cpp
@@ -2105,7 +2126,7 @@ msgid "Undo"
msgstr "Peru"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Tee uudelleen"
@@ -2129,20 +2150,20 @@ msgstr "Projektin asetukset"
msgid "Export"
msgstr "Vie"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "Työkalut"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "Avataanko projektinhallinta?"
+msgstr "Avaa projektin datakansio"
#: editor/editor_node.cpp
msgid "Quit to Project List"
msgstr "Lopeta ja palaa projektiluetteloon"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "Virheenkorjaus"
@@ -2249,18 +2270,16 @@ msgid "Toggle Fullscreen"
msgstr "Siirry koko näytön tilaan"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Data/Settings Folder"
-msgstr "Editorin asetukset"
+msgstr "Avaa editorin data/asetuskansio"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "Avaa editorin datakansio"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Settings Folder"
-msgstr "Editorin asetukset"
+msgstr "Avaa editorin asetuskansio"
#: editor/editor_node.cpp editor/project_export.cpp
msgid "Manage Export Templates"
@@ -2270,10 +2289,6 @@ msgstr "Hallinnoi vientimalleja"
msgid "Help"
msgstr "Ohje"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "Luokat"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2344,13 +2359,12 @@ msgstr "Valitse ja käynnistä skene"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr ""
+msgstr "Näyttöajurin vaihtaminen edellyttää editorin uudelleenkäynnistystä."
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Save & Restart"
-msgstr "Tallenna & tuo uudelleen"
+msgstr "Tallenna & käynnistä uudelleen"
#: editor/editor_node.cpp
msgid "Spins when the editor window repaints!"
@@ -2368,27 +2382,26 @@ msgstr "Päivitä muutokset"
msgid "Disable Update Spinner"
msgstr "Poista päivitysanimaatio"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "Tarkastelu"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "Tuo"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "Solmu"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "Tiedostojärjestelmä"
#: editor/editor_node.cpp
-#, fuzzy
+msgid "Inspector"
+msgstr "Tarkastelu"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Solmu"
+
+#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
-msgstr "Laajenna kaikki"
+msgstr "Laajenna alapaneeli"
#: editor/editor_node.cpp scene/resources/visual_shader.cpp
msgid "Output"
@@ -2467,9 +2480,8 @@ msgid "Thumbnail..."
msgstr "Pienoiskuva..."
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit Plugin"
-msgstr "Muokkaa polygonia"
+msgstr "Muokkaa liitännäistä"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
@@ -2493,15 +2505,13 @@ msgid "Status:"
msgstr "Tila:"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit:"
-msgstr "Muokkaa"
+msgstr "Muokkaa:"
#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Start"
-msgstr "Aloita!"
+msgstr "Aloita"
#: editor/editor_profiler.cpp
msgid "Measure:"
@@ -2523,7 +2533,7 @@ msgstr "Kuvaruutujen %"
msgid "Physics Frame %"
msgstr "Fysiikkaruutujen %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "Aika:"
@@ -2547,34 +2557,65 @@ msgstr "Aika"
msgid "Calls"
msgstr "Kutsuja"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr "Päällä"
#: editor/editor_properties.cpp
msgid "Layer"
-msgstr ""
+msgstr "Kerros"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Bit %d, value %d"
-msgstr "Bitti %d, arvo %d."
+msgstr "Bitti %d, arvo %d"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr "[Tyhjä]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
+msgid "Assign..."
+msgstr "Aseta..."
+
+#: editor/editor_properties.cpp
#, fuzzy
-msgid "Assign.."
-msgstr "Aseta"
+msgid "Invalid RID"
+msgstr "Virheellinen polku"
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+"Valittu resurssi (%s) ei vastaa mitään odotettua tyyppiä tälle "
+"ominaisuudelle (%s)."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+"Ei voida luoda ViewportTexture tietoa tiedostoon tallennetuille "
+"resursseille.\n"
+"Resurssin täytyy kuulua johonkin skeneen."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+"Ei voida luoda ViewportTexture tietoa tälle resurssille, koska sitä ei ole "
+"asetettu paikalliseksi skeneen.\n"
+"Ole hyvä ja vaihda 'local to scene' ominaisuus sille (ja kaikille sen "
+"sisältäville resursseille aina solmuun saakka)."
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr "Valitse näyttöruutu"
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr "Uusi skripti"
@@ -2586,10 +2627,6 @@ msgstr "Uusi %s"
msgid "Make Unique"
msgstr "Tee yksilölliseksi"
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr "Näytä tiedostojärjestelmässä"
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2598,7 +2635,8 @@ msgstr "Näytä tiedostojärjestelmässä"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "Liitä"
@@ -2611,36 +2649,32 @@ msgstr "Muunna muotoon %s"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Open Editor"
-msgstr "Avaa editorissa"
+msgstr "Avaa editori"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Selected node is not a Viewport!"
msgstr "Valittu solmu ei ole Viewport!"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "Size: "
-msgstr "Solun koko:"
+msgstr "Koko: "
#: editor/editor_properties_array_dict.cpp
msgid "Page: "
-msgstr ""
+msgstr "Sivu: "
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Key:"
-msgstr "Uusi nimi:"
+msgstr "Uusi avain:"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Value:"
-msgstr "Uusi nimi:"
+msgstr "Uusi arvo:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
-msgstr ""
+msgstr "Lisää avain/arvopari"
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -2733,9 +2767,8 @@ msgid "Can't open export templates zip."
msgstr "Vientimallien zip-tiedostoa ei voitu avata."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Invalid version.txt format inside templates: %s."
-msgstr "Vientimalli sisältää virheellisen version.txt tiedoston."
+msgstr "Vientimalli sisältää virheellisen version.txt tiedoston: %s."
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
@@ -2800,6 +2833,8 @@ msgid ""
"Templates installation failed. The problematic templates archives can be "
"found at '%s'."
msgstr ""
+"Vientimallien asennus epäonnistui. Ongelmallisten vientimallien arkisto "
+"löytyy kohteesta '%s'."
#: editor/export_template_manager.cpp
msgid "Error requesting url: "
@@ -2880,9 +2915,8 @@ msgid "Download Templates"
msgstr "Lataa mallit"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr "Valitse peilipalvelin listasta: "
+msgstr "Valitse peilipalvelin listasta: (Shift+napsautus: Avaa selaimessa)"
#: editor/file_type_cache.cpp
msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
@@ -2891,20 +2925,22 @@ msgstr ""
"Välimuistia ei tallenneta!"
#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr "Suosikit"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
"Tiedostoa '%s' ei voida avata, koska sitä ei näytä löytyvän "
"tiedostojärjestelmästäsi!"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a grid of thumbnails."
-msgstr "Ruudukkonäkymä esikatselukuvilla"
+msgstr "Ruudukkonäkymä esikatselukuvilla."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a list."
-msgstr "Listanäkymä"
+msgstr "Listanäkymä."
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
@@ -2931,19 +2967,15 @@ msgstr "Virhe kahdennettaessa:"
msgid "Unable to update dependencies:"
msgstr "Ei voida päivittää riippuvuuksia:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "Nimeä ei annettu"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "Nimeä ei annettu."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "Annettu nimi sisältää virheellisiä kirjainmerkkejä"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "Nimeä ei annettu."
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "Nimi sisältää virheellisiä kirjainmerkkejä."
@@ -2968,22 +3000,6 @@ msgid "Duplicating folder:"
msgstr "Kahdennetaan kansio:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "Laajenna kaikki"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "Pienennä kaikki"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "Nimeä uudelleen..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "Siirrä..."
-
-#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
msgstr "Avaa skene tai skenejä"
@@ -2992,6 +3008,14 @@ msgid "Instance"
msgstr "Luo ilmentymä"
#: editor/filesystem_dock.cpp
+msgid "Add to favorites"
+msgstr "Lisää suosikkeihin"
+
+#: editor/filesystem_dock.cpp
+msgid "Remove from favorites"
+msgstr "Poista suosikeista"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "Muokkaa riippuvuuksia..."
@@ -2999,19 +3023,33 @@ msgstr "Muokkaa riippuvuuksia..."
msgid "View Owners..."
msgstr "Tarkastele omistajia..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "Nimeä uudelleen..."
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "Kahdenna..."
#: editor/filesystem_dock.cpp
-#, fuzzy
+msgid "Move To..."
+msgstr "Siirrä..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
-msgstr "Uusi skripti"
+msgstr "Uusi skripti..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "Tallenna resurssi nimellä..."
+msgstr "Uusi resurssi..."
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr "Laajenna kaikki"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr "Tiivistä kaikki"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3033,29 +3071,18 @@ msgid "Re-Scan Filesystem"
msgstr "Skannaa tiedostojärjestelmä uudelleen"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "Merkitse kansio suosikkeihin"
+msgid "Toggle split mode"
+msgstr "Aseta jaettu tila"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Show current scene file."
-msgstr "Valitse muokattavana oleva aliruutu."
+msgid "Search files"
+msgstr "Etsi tiedostoista"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr "Luo valituista skeneistä ilmentymä valitun solmun alle."
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "Etsi luokkia"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3063,51 +3090,37 @@ msgstr ""
"Selataan tiedostoja,\n"
"Hetkinen…"
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "Siirrä"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "There is already file or folder with the same name in this location."
-msgstr "Polusta löytyy jo kansio annetulla nimellä."
+msgstr "Tästä sijainnista löytyy jo samanniminen tiedosto tai kansio."
#: editor/filesystem_dock.cpp
msgid "Overwrite"
-msgstr ""
+msgstr "Ylikirjoita"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Luo skripti"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find in files"
-msgstr "Etsi ruutu"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find: "
-msgstr "Etsi"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Whole words"
-msgstr "Kokonaisia sanoja"
+msgid "Find in Files"
+msgstr "Etsi tiedostoista"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "Huomioi kirjainkoko"
+msgid "Find:"
+msgstr "Etsi:"
#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "Kansio:"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Filter: "
-msgstr "Suodatin:"
+msgid "Filters:"
+msgstr "Suodattimet:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3123,52 +3136,48 @@ msgid "Cancel"
msgstr "Peru"
#: editor/find_in_files.cpp
-#, fuzzy
+msgid "Find: "
+msgstr "Etsi: "
+
+#: editor/find_in_files.cpp
msgid "Replace: "
-msgstr "Korvaa"
+msgstr "Korvaa: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace all (no undo)"
-msgstr "Korvaa kaikki"
+msgstr "Korvaa kaikki (ei voi perua)"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Searching..."
-msgstr "Tallennetaan..."
+msgstr "Haetaan..."
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Search complete"
-msgstr "Hae tekstiä"
+msgstr "Haku valmis"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group name already exists."
-msgstr "VIRHE: Samanniminen animaatio on jo olemassa!"
+msgstr "Ryhmän nimi on jo olemassa."
#: editor/groups_editor.cpp
-#, fuzzy
-msgid "invalid Group name."
-msgstr "Virheellinen nimi."
+msgid "Invalid group name."
+msgstr "Virheellinen ryhmän nimi."
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Ryhmät"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes not in Group"
-msgstr "Lisää ryhmään"
+msgstr "Ryhmään kuulumattomat solmut"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
msgid "Filter nodes"
msgstr "Suodata solmuja"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes in Group"
-msgstr "Muokkaa ryhmiä"
+msgstr "Ryhmään kuuluvat solmut"
#: editor/groups_editor.cpp
msgid "Add to Group"
@@ -3179,9 +3188,8 @@ msgid "Remove from Group"
msgstr "Poista ryhmästä"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Manage Groups"
-msgstr "Ryhmät"
+msgstr "Hallinnoi ryhmiä"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Single Scene"
@@ -3289,17 +3297,12 @@ msgstr "Tuo uudelleen"
msgid "Failed to load resource."
msgstr "Resurssin lataaminen epäonnistui."
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "Ok"
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr "Laajenna kaikki ominaisuudet"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+msgid "Collapse All Properties"
msgstr "Tiivistä kaikki ominaisuudet"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3316,9 +3319,8 @@ msgid "Paste Params"
msgstr "Liitä parametrit"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Edit Resource Clipboard"
-msgstr "Resurssien leikepöytä on tyhjä!"
+msgstr "Muokkaa resurssien leikepöytää"
#: editor/inspector_dock.cpp
msgid "Copy Resource"
@@ -3345,6 +3347,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "Lataa olemassaoleva resurssi levyltä ja muokkaa sitä."
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "Tallenna tällä hetkellä muokattu resurssi."
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "Edellinen editoitu objekti."
@@ -3361,9 +3367,8 @@ msgid "Object properties."
msgstr "Objektin ominaisuudet."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Filter properties"
-msgstr "Suodata solmuja"
+msgstr "Suodata ominaisuuksia"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
@@ -3378,47 +3383,40 @@ msgid "Select a Node to edit Signals and Groups."
msgstr "Valitse solmu, jonka signaaleja ja ryhmiä haluat muokata."
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Edit a Plugin"
-msgstr "Muokkaa polygonia"
+msgstr "Muokkaa liitännäistä"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Create a Plugin"
-msgstr "Luo C# ratkaisu"
+msgstr "Luo liitännäinen"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Plugin Name:"
-msgstr "Lisäosat"
+msgstr "Liitännäisen nimi:"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
-msgstr ""
+msgstr "Alikansio:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Language:"
-msgstr "Kieli"
+msgstr "Kieli:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Script Name:"
-msgstr "Skripti kelpaa"
+msgstr "Skriptin nimi:"
#: editor/plugin_config_dialog.cpp
msgid "Activate now?"
-msgstr ""
+msgstr "Aktivoi nyt?"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
msgstr "Luo polygoni"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+msgid "Edit Polygon"
msgstr "Muokkaa polygonia"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3426,34 +3424,33 @@ msgid "Insert Point"
msgstr "Lisää piste"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr "Muokkaa polygonia (poista piste)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+msgid "Remove Polygon And Point"
msgstr "Poista polygoni ja piste"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "Luo uusi polygoni tyhjästä"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr "Luo pisteitä."
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
-"Muokkaa polygonia:\n"
-"Vasen hiirenkorva: Siirrä pistettä.\n"
-"Ctrl+Vasen hiirenkorva: Puolita segmentti.\n"
-"Oikea hiirenkorva: Poista piste."
+"Muokkaa pisteitä.\n"
+"Vasen hiirenkorva: Siirrä pistettä\n"
+"Oikea hiirenkorva: Poista piste"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
-msgstr "Poista pisteitä"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr "Pyyhi pisteitä."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3467,15 +3464,15 @@ msgstr "Lisää animaatio"
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Load.."
-msgstr "Lataa"
+msgid "Load..."
+msgstr "Lataa..."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "This type of node can't be used. Only root nodes are allowed."
msgstr ""
+"Tämän tyyppistä solmua ei voi käyttää. Vain juurisolmut ovat sallittuja."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3485,72 +3482,65 @@ msgid ""
"AnimationTree is inactive.\n"
"Activate to enable playback, check node warnings if activation fails."
msgstr ""
+"AnimationTree ei ole aktiivinen.\n"
+"Aktivoi se käynnistääksesi toiston, ja tarkista solmujen varoitukset, jos se "
+"epäonnistuu."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Set the blending position within the space"
-msgstr ""
+msgstr "Aseta sulautussijainti tilassa"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Select and move points, create points with RMB."
-msgstr ""
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Poista pisteitä"
+msgstr "Valitse ja siirrä pisteitä, luo pisteitä hiiren oikealla napilla."
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "OHP: Pyyhi piste."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr "Aseta tarttuminen ja näytä ruudukko."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Point"
-msgstr "Siirrä pistettä"
+msgstr "Piste"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Open Animation Node"
-msgstr "Animaatiosolmu"
+msgstr "Avaa animaatiosolmu"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists"
-msgstr "Tapahtuma '%s' on jo olemassa!"
+msgstr "Kolmio on jo olemassa"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "BlendSpace2D does not belong to an AnimationTree node."
-msgstr ""
+msgstr "BlendSpace2D ei kuulu AnimationTree solmuun."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "No triangles exist, so no blending can take place."
-msgstr ""
+msgstr "Kolmioita ei ole olemassa, joten mitään sulautusta ei tapahdu."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create triangles by connecting points."
-msgstr ""
+msgstr "Luo kolmiot yhdistämällä pisteet."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Erase points and triangles."
-msgstr ""
+msgstr "Poista pisteet ja kolmiot."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Generate blend triangles automatically (instead of manually)"
-msgstr ""
+msgstr "Luo sulautuskolmiot automaattisesti (manuaalisen sijaan)"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr "Tartu"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Sulautus:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3559,20 +3549,23 @@ msgstr "Muokkaa suodattimia"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Output node can't be added to the blend tree."
-msgstr ""
+msgstr "Lähtösolmua ei voida lisätä sulautuspuuhun."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Unable to connect, port may be in use or connection may be invalid."
msgstr ""
+"Ei voida yhdistää, portti voi olla käytössä tai yhteys voi olla virheellinen."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
msgstr ""
+"Animaatiotoistinta ei ole asetettu, joten raitojen nimien haku ei onnistu."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Player path set is invalid, so unable to retrieve track names."
msgstr ""
+"Toistimen polku on virheellinen, joten raitojen nimien haku ei onnistu."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
@@ -3580,23 +3573,22 @@ msgid ""
"Animation player has no valid root node path, so unable to retrieve track "
"names."
msgstr ""
+"Animaatiotoistimella ei ole kelvollista juurisolmun polkua, joten raitojen "
+"nimien haku ei onnistu."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Add Node.."
-msgstr "Lisää solmu"
+msgid "Add Node..."
+msgstr "Lisää solmu..."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filtered Tracks:"
-msgstr "Muokkaa suodattimia"
+msgstr "Muokkaa suodatettuja raitoja:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Enable filtering"
-msgstr "Muokattavat alisolmut"
+msgstr "Kytke suodatus"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
@@ -3624,14 +3616,12 @@ msgid "Remove Animation"
msgstr "Poista animaatio"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Invalid animation name!"
-msgstr "VIRHE: Virheellinen animaation nimi!"
+msgstr "Virheellinen animaation nimi!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Animation name already exists!"
-msgstr "VIRHE: Samanniminen animaatio on jo olemassa!"
+msgstr "Samanniminen animaatio on jo olemassa!"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -3655,14 +3645,12 @@ msgid "Duplicate Animation"
msgstr "Monista animaatio"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to copy!"
-msgstr "VIRHE: Ei kopioitavaa animaatiota!"
+msgstr "Ei kopioitavaa animaatiota!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation resource on clipboard!"
-msgstr "VIRHE: Ei animaation resurssia leikepöydällä!"
+msgstr "Ei animaation resurssia leikepöydällä!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
@@ -3673,9 +3661,8 @@ msgid "Paste Animation"
msgstr "Liitä animaatio"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to edit!"
-msgstr "VIRHE: Ei muokattavaa animaatiota!"
+msgstr "Ei muokattavaa animaatiota!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
@@ -3719,14 +3706,12 @@ msgid "New"
msgstr "Uusi"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Transitions..."
-msgstr "Siirtymät"
+msgstr "Muokkaa siirtymiä..."
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Open in Inspector"
-msgstr "Avaa editorissa"
+msgstr "Avaa tarkastelijassa"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Display list of animations in player."
@@ -3785,9 +3770,8 @@ msgid "Include Gizmos (3D)"
msgstr "Näytä 3D-muokkaimet"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Pin AnimationPlayer"
-msgstr "Liitä animaatio"
+msgstr "Kiinnitä AnimationPlayer"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Create New Animation"
@@ -3818,34 +3802,32 @@ msgid "Cross-Animation Blend Times"
msgstr "Lomittautuvien animaatioiden sulautusajat"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "End"
-msgstr "Loppu(u)"
+msgstr "End"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Immediate"
-msgstr ""
+msgstr "Välitön"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Sync"
-msgstr ""
+msgstr "Synkronoi"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "At End"
-msgstr ""
+msgstr "Lopussa"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Travel"
-msgstr ""
+msgstr "Matkaa"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Start and end nodes are needed for a sub-transition."
-msgstr ""
+msgstr "Alku- ja loppusolmut tarvitaan alisiirtymään."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "No playback resource set at path: %s."
-msgstr "Ei löytynyt resurssipolusta."
+msgstr "Polulle ei ole asetettu toistoresurssia: %s."
#: editor/plugins/animation_state_machine_editor.cpp
msgid ""
@@ -3853,34 +3835,35 @@ msgid ""
"RMB to add new nodes.\n"
"Shift+LMB to create connections."
msgstr ""
+"Valitse ja siirrä solmuja.\n"
+"Oikea hiirenkorva lisää uusia solmuja.\n"
+"Shift+vasen hiirenkorva luo yhteyksiä."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "Luo uusi %s"
+msgstr "Luo uusia solmuja."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Connect nodes."
-msgstr "Kytke solmut"
+msgstr "Kytke solmut."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Remove selected node or transition"
-msgstr "Poista valittu raita."
+msgid "Remove selected node or transition."
+msgstr "Poista valittu solmu tai siirtymä."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
msgstr ""
+"Kytke tämän animaation automaattinen toisto alussa, aloita uudelleen tai "
+"palaa nollaan."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set the end animation. This is useful for sub-transitions."
-msgstr ""
+msgstr "Aseta loppuanimaatio. Tämä on hyödyllistä alisiirtymiä varten."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "Siirtymä"
+msgstr "Siirtymä: "
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3914,11 +3897,11 @@ msgstr "Sekoita"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Auto Restart:"
-msgstr "Automaattinen uudelleenkäynnistys:"
+msgstr "Automaattinen uudelleenaloitus:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Restart (s):"
-msgstr "Käynnistä uudelleen (s):"
+msgstr "Aloita uudelleen (s):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Random Restart (s):"
@@ -3934,10 +3917,6 @@ msgid "Amount:"
msgstr "Määrä:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "Sulautus:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "Sulautus 0:"
@@ -4064,7 +4043,7 @@ msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Expected:"
-msgstr "Oletettiin:"
+msgstr "Odotettiin:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Got:"
@@ -4079,14 +4058,12 @@ msgid "Asset Download Error:"
msgstr "Assettien latausvirhe:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading (%s / %s)..."
-msgstr "Ladataan"
+msgstr "Ladataan (%s / %s)..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading..."
-msgstr "Ladataan"
+msgstr "Ladataan..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Resolving..."
@@ -4113,14 +4090,12 @@ msgid "Download for this asset is already in progress!"
msgstr "Tämän assetin lataus on jo käynnissä!"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "First"
-msgstr "ensimmäinen"
+msgstr "Ensimmäinen"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Previous"
-msgstr "Edellinen välilehti"
+msgstr "Edellinen"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Next"
@@ -4128,7 +4103,7 @@ msgstr "Seuraava"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Last"
-msgstr ""
+msgstr "Viimeinen"
#: editor/plugins/asset_library_editor_plugin.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -4138,9 +4113,9 @@ msgstr "Kaikki"
#: editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_settings_editor.cpp
msgid "Plugins"
-msgstr "Lisäosat"
+msgstr "Liitännäiset"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "Lajittele:"
@@ -4220,7 +4195,7 @@ msgstr "Ruudukon välistys:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation Offset:"
-msgstr "Ruudukon siirtymä:"
+msgstr "Kierron siirtymä:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation Step:"
@@ -4228,7 +4203,7 @@ msgstr "Kierron välistys:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move vertical guide"
-msgstr "Siirrä pystysuuntaista apuviivaa"
+msgstr "Siirrä pystysuoraa apuviivaa"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create new vertical guide"
@@ -4255,29 +4230,28 @@ msgid "Create new horizontal and vertical guides"
msgstr "Luo uudet vaaka- ja pystysuorat apuviivat"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move pivot"
msgstr "Siirrä keskikohtaa"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Rotate CanvasItem"
-msgstr "Muokkaa CanvasItemiä"
+msgstr "Kierrä CanvasItemiä"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move anchor"
-msgstr "Siirrä"
+msgstr "Siirrä ankkuri"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Resize CanvasItem"
-msgstr "Muokkaa CanvasItemiä"
+msgstr "Muokkaa CanvasItemin kokoa"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr "Skaalaa CanvasItemiä"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move CanvasItem"
-msgstr "Muokkaa CanvasItemiä"
+msgstr "Siirrä CanvasItemiä"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -4296,19 +4270,18 @@ msgid "Paste Pose"
msgstr "Liitä asento"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "Loitonna"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom reset"
-msgstr "Palauta lähennys"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
+"Varoitus: Säilön alisolmujen sijainti ja koko määrittyy vain niiden "
+"isäntäsolmun perusteella."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Lähennä"
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
+msgstr "Palauta oletuslähennystaso"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
@@ -4341,6 +4314,10 @@ msgid "Rotate Mode"
msgstr "Kääntötila"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr "Skaalaustila"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4358,16 +4335,14 @@ msgid "Pan Mode"
msgstr "Panorointitila"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle snapping."
-msgstr "Asettaa tarttumisen"
+msgstr "Aseta tarttuminen."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Snap"
msgstr "Käytä tarttumista"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snapping Options"
msgstr "Tarttumisen asetukset"
@@ -4409,9 +4384,8 @@ msgid "Snap to node sides"
msgstr "Tartu solmun reunoihin"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to node center"
-msgstr "Tartu solmun ankkuriin"
+msgstr "Tartu solmun keskipisteeseen"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to other nodes"
@@ -4433,13 +4407,17 @@ msgstr "Poista valittujen objektien lukitus (voi liikutella)."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Makes sure the object's children are not selectable."
-msgstr "Varmistaa ettei objektin lapsia voi valita."
+msgstr "Varmistaa, ettei objektin alisolmuja voi valita."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Restores the object's children's ability to be selected."
msgstr "Palauttaa objektin aliobjektien mahdollisuuden tulla valituksi."
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr "Luurangon asetukset"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "Näytä luut"
@@ -4453,12 +4431,11 @@ msgstr "Tyhjennä IK ketju"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make Custom Bone(s) from Node(s)"
-msgstr ""
+msgstr "Luo mukautetut luut solmuista"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Custom Bones"
-msgstr "Tyhjennä luut"
+msgstr "Poista mukautetut luut"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -4491,21 +4468,24 @@ msgid "Show Viewport"
msgstr "Näytä näyttöikkuna"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr "Näytä ryhmityksen ja lukituksen kuvakkeet"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
-msgstr "Valinta keskikohtaan"
+msgstr "Keskitä valintaan"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Frame Selection"
-msgstr "Framen valinta"
+msgstr "Rajaa valintaan"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Layout"
msgstr "Asettelu"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Insert keys."
-msgstr "Lisää avainruutuja"
+msgstr "Lisää avainruutuja."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
@@ -4562,17 +4542,24 @@ msgstr ""
"Vedä & pudota + Alt: Muuta solmun tyyppiä"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr "Luo Poly3D"
+msgid "Create Polygon3D"
+msgstr "Luo Polygon3D"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Muokkaa polygonia"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Muokkaa polygonia (poista piste)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
msgstr "Aseta kahva"
#: editor/plugins/cpu_particles_editor_plugin.cpp
-#, fuzzy
msgid "CPUParticles"
-msgstr "Partikkelit"
+msgstr "CPUPartikkelit"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
@@ -4618,7 +4605,7 @@ msgstr "Lataa käyrän esiasetus"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Add point"
-msgstr "Lisää pistä"
+msgstr "Lisää piste"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Remove point"
@@ -4665,36 +4652,8 @@ msgid "Item List Editor"
msgstr "Sisällön muokkaus"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"Tälle solmulle ei ole OccluderPolygon2D resurssia.\n"
-"Luodaanko ja asetetaanko sellainen?"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
-msgstr "Luo peittävä polygoni"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr "Luo uusi piste tyhjästä."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "Muokkaa olemassaolevaa polygonia:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "VHP: Siirrä pistettä."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr "Ctrl+Vasen hiirennappi: Puolita osa."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "OHP: Pyyhi piste."
+msgstr "Luo peittopolygoni"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
@@ -4783,7 +4742,7 @@ msgstr "Luo konveksi törmäysmuoto sisareksi"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
-msgstr "Luo reunoista Mesh..."
+msgstr "Luo ääriviivoista Mesh..."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
@@ -4799,7 +4758,7 @@ msgstr "Aukaise UV2 Lightmapille tai AO:lle"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh"
-msgstr "Luo reunoista Mesh"
+msgstr "Luo ääriviivoista Mesh"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Outline Size:"
@@ -4929,13 +4888,13 @@ msgid "Populate"
msgstr "Täytä"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr "Luo navigointipolygoni"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr "Luodaan AABB"
+msgid "Generating Visibility Rect"
+msgstr "Kartoitetaan näkyvää aluetta"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -4964,6 +4923,11 @@ msgstr "Tyhjennä emissiomaski"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr "Muunna CPUPartikkeleiksi"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr "Partikkelit"
@@ -5018,11 +4982,11 @@ msgstr "Pinnan pisteet"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Surface Points+Normal (Directed)"
-msgstr "Pinnan pisteet+normaali"
+msgstr "Pinnan pisteet+normaali (suunnattu)"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Volume"
-msgstr "Äänenvoimakkuus"
+msgstr "Tilavuus"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Emission Source: "
@@ -5033,13 +4997,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr "Tarvitaan 'ParticlesMaterial' tyyppinen prosessorimateriaali."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
-msgstr "Luo AABB"
+msgid "Generating AABB"
+msgstr "Luodaan AABB"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "Muunna isoiksi kirjaimiksi"
+msgid "Generate AABB"
+msgstr "Luo AABB"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5063,6 +5026,10 @@ msgid "Add Point to Curve"
msgstr "Lisää käyrään piste"
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr "Puolita käyrä"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr "Siirrä pistettä käyrällä"
@@ -5082,21 +5049,25 @@ msgstr "Valitse pisteet"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Shift+Drag: Select Control Points"
-msgstr "Shift+vedä: Valitse kontrollipisteitä"
+msgstr "Shift+vedä: Valitse ohjauspisteitä"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Click: Add Point"
-msgstr "Klikkaa: lisää piste"
+msgstr "Napsauta: lisää piste"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr "Vasen painallus: Puolita osa (käyrässä)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
-msgstr "Oikea klikkaus: Poista piste"
+msgstr "Oikea painallus: poista piste"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Select Control Points (Shift+Drag)"
-msgstr "Valitse kontrollipisteitä (Shift+vedä)"
+msgstr "Valitse ohjauspisteitä (Shift+vedä)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
@@ -5105,11 +5076,6 @@ msgstr "Lisää piste (tyhjyydessä)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr "Puolita osa (käyrässä)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "Poista piste"
@@ -5127,12 +5093,12 @@ msgstr "Asetuksia"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Angles"
-msgstr ""
+msgstr "Peilaa kahvojen kulmat"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Lengths"
-msgstr ""
+msgstr "Peilaa kahvojen pituudet"
#: editor/plugins/path_editor_plugin.cpp
msgid "Curve Point #"
@@ -5166,65 +5132,78 @@ msgstr "Poista lähtöohjaimen piste"
msgid "Remove In-Control Point"
msgstr "Poista tulo-ohjaimen piste"
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Puolita osa (käyrässä)"
+
#: editor/plugins/physical_bone_plugin.cpp
-#, fuzzy
msgid "Move joint"
-msgstr "Siirrä pistettä"
+msgstr "Siirrä liitosta"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
-msgstr ""
+msgstr "Polygon2D solmun luuominaisuus ei osoita Skeleton2D solmuun"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Sync bones"
-msgstr "Näytä luut"
+msgid "Sync Bones"
+msgstr "Synkkaa luut"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+"Tällä polygonilla ei ole tekstuuria.\n"
+"Aseta tekstuuri mahdollistaaksesi UV-editoinnin."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr "Luo UV kartta"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon & UV"
-msgstr "Luo polygoni"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
+msgstr "Luo polygoni ja UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "Luo uusi vaakasuora apuviiva"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "Tapahtuma '%s' on jo olemassa!"
+msgid "Remove Internal Vertex"
+msgstr "Poista tulo-ohjaimen piste"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Add Split"
-msgstr "Lisää pistä"
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "Virheellinen polku!"
+msgid "Add Custom Polygon"
+msgstr "Muokkaa polygonia"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Poista piste"
+msgid "Remove Custom Polygon"
+msgstr "Poista törmäyspolygoni"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr "Muunna UV kartta"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
-msgstr ""
+msgid "Transform Polygon"
+msgstr "Muunna polygonia"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
+msgstr "Maalaa luiden painot"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Open Polygon 2D UV editor."
+msgstr "Avaa Polygon 2D UV-editori."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
@@ -5232,31 +5211,25 @@ msgstr "Polygon 2D UV-editori"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "UV"
-msgstr ""
+msgstr "UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "Muokkaa polygonia"
+msgid "Points"
+msgstr "Piste"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Splits"
-msgstr "Puolita polku"
+msgid "Polygons"
+msgstr "Polygoni->UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Bones"
-msgstr "Tee luut"
+msgstr "Luut"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Create Polygon"
-msgstr "Luo polygoni"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
-msgstr "Siirrä pistettä"
+msgid "Move Points"
+msgstr "Siirrä pisteitä"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
@@ -5283,25 +5256,26 @@ msgid "Scale Polygon"
msgstr "Skaalaa polygonia"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "Valitse asetus ensin!"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
-msgstr ""
+msgid "Paint weights with specified intensity."
+msgstr "Maalaa painot tietyllä voimakkuudella."
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
-msgstr ""
+msgid "Unpaint weights with specified intensity."
+msgstr "Poista painojen maalaus tietyllä voimakkuudella."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Radius:"
-msgstr ""
+msgstr "Säde:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon->UV"
@@ -5316,11 +5290,15 @@ msgid "Clear UV"
msgstr "Tyhjennä UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Settings"
msgstr "Ruudukon asetukset"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "Tartu"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr "Käytä tarttumista"
@@ -5329,34 +5307,28 @@ msgid "Grid"
msgstr "Ruudukko"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Configure Grid:"
-msgstr "Määrittele tarttuminen"
+msgstr "Määrittele ruudukko:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset X:"
-msgstr "Ruudukon siirtymä:"
+msgstr "Ruudukon X-siirtymä:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset Y:"
-msgstr "Ruudukon siirtymä:"
+msgstr "Ruudukon Y-siirtymä:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step X:"
-msgstr "Ruudukon välistys:"
+msgstr "Ruudukon X-välistys:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step Y:"
-msgstr "Ruudukon välistys:"
+msgstr "Ruudukon Y-välistys:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Sync Bones to Polygon"
-msgstr "Skaalaa polygonia"
+msgstr "Synkkaa luut polygoniin"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "ERROR: Couldn't load resource!"
@@ -5384,22 +5356,22 @@ msgid "Paste Resource"
msgstr "Liitä resurssi"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "Avaa editorissa"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr "Ilmentymä:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr "Tyyppi:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Avaa editorissa"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr "Lataa resurssi"
@@ -5410,12 +5382,11 @@ msgstr "Resurssien esilataaja"
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "AnimationTree has no path set to an AnimationPlayer"
-msgstr ""
+msgstr "AnimationTree solmulle ei ole asetettu polkua AnimationPlayer solmuun"
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Path to AnimationPlayer is invalid"
-msgstr "Animaatiopuu ei ole kelvollinen."
+msgstr "Polku AnimationPlayer solmuun ei ole kelvollinen"
#: editor/plugins/script_editor_plugin.cpp
msgid "Clear Recent Files"
@@ -5426,56 +5397,62 @@ msgid "Close and save changes?"
msgstr "Sulje ja tallenna muutokset?"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error writing TextFile:"
-msgstr "Virhe ladattaessa kuvaa:"
+msgstr "Virhe kirjoitettaessa teksitiedostoa:"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr "Virhe: ei voitu ladata tiedostoa."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error could not load file."
-msgstr "Virhe - Ei voitu luoda skriptiä tiedostojärjestelmään."
+msgstr "Virhe - Ei voitu ladata tiedostoa."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error saving file!"
-msgstr "Virhe tallennettaessa ruutuvalikoimaa!"
+msgstr "Virhe tallennettaessa tiedostoa!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr "Virhe tallennettaessa teemaa"
+msgid "Error while saving theme."
+msgstr "Virhe tallennettaessa teemaa."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+msgid "Error Saving"
msgstr "Virhe tallennettaessa"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr "Virhe tuotaessa teemaa"
+msgid "Error importing theme."
+msgstr "Virhe tuotaessa teemaa."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+msgid "Error Importing"
msgstr "Virhe tuonnissa"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New TextFile..."
-msgstr "Uusi kansio..."
+msgstr "Uusi tekstitiedosto..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open File"
msgstr "Avaa tiedosto"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Save File As..."
-msgstr "Tallenna nimellä..."
+msgstr "Tallenna tiedosto nimellä..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme"
msgstr "Tuo teema"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Virhe tallennettaessa teemaa"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Virhe tallennettaessa"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr "Tallenna teema nimellä..."
@@ -5485,7 +5462,7 @@ msgstr " Luokan referenssi"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
-msgstr ""
+msgstr "Käytä metodilistalla aakkosellista järjestystä."
#: editor/plugins/script_editor_plugin.cpp
msgid "Sort"
@@ -5516,9 +5493,8 @@ msgid "File"
msgstr "Tiedosto"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "New TextFile"
-msgstr "Näytä tiedostot"
+msgid "Open..."
+msgstr "Avaa..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5533,11 +5509,7 @@ msgid "Copy Script Path"
msgstr "Kopioi skriptin polku"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr "Näytä tiedostojärjestelmässä"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+msgid "History Previous"
msgstr "Edellinen historiassa"
#: editor/plugins/script_editor_plugin.cpp
@@ -5550,6 +5522,10 @@ msgid "Theme"
msgstr "Teema"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme..."
+msgstr "Tuo teema..."
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
msgstr "Lataa teema uudelleen"
@@ -5558,10 +5534,6 @@ msgid "Save Theme"
msgstr "Tallenna teema"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "Tallenna teema nimellä"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "Sulje dokumentaatio"
@@ -5608,18 +5580,14 @@ msgid "Keep Debugger Open"
msgstr "Pidä testaaja auki"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
-msgstr "Testaa ulkoisella editorilla"
+msgid "Debug with External Editor"
+msgstr "Debuggaa ulkoisella editorilla"
#: editor/plugins/script_editor_plugin.cpp
msgid "Open Godot online documentation"
msgstr "Avaa Godotin online-dokumentaatio"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr "Etsi luokkahierarkiasta."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Etsi dokumentaatiosta."
@@ -5640,8 +5608,8 @@ msgid ""
"The following files are newer on disk.\n"
"What action should be taken?:"
msgstr ""
-"Seuraavat tiedostot ovat uudempia.\n"
-"MItä toimenpiteitä tulisi suorittaa?:"
+"Seuraavat tiedostot ovat uudempia levyllä.\n"
+"Mikä toimenpide tulisi suorittaa?:"
#: editor/plugins/script_editor_plugin.cpp
msgid "Reload"
@@ -5656,39 +5624,32 @@ msgid "Debugger"
msgstr "Debuggeri"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search results"
-msgstr "Etsi ohjeesta"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "Etsi luokkia"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-"Sisäänrakennettuja skriptejä voi muokata ainoastaan, kun skene, johon ne "
-"kuuluvat, on ladattu"
+msgid "Search Results"
+msgstr "Haun tulokset"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Line"
-msgstr "Rivi:"
+msgstr "Rivi"
#: editor/plugins/script_text_editor.cpp
msgid "(ignore)"
-msgstr ""
+msgstr "(sivuuta)"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function"
+msgstr "Mene funktioon"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr "Standardi"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr "Vain tiedostojärjestelmän resursseja voi raahata ja pudottaa."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Lookup Symbol"
-msgstr "Täydennä symbooli"
+msgstr "Haettava symboli"
#: editor/plugins/script_text_editor.cpp
msgid "Pick Color"
@@ -5712,11 +5673,7 @@ msgstr "Isot alkukirjaimet"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Syntax Highlighter"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
+msgstr "Syntaksin korostaja"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
@@ -5742,7 +5699,7 @@ msgstr "Sisennä oikealle"
#: editor/plugins/script_text_editor.cpp
msgid "Toggle Comment"
-msgstr "Näytä/Piilota kommentit"
+msgstr "Lisää tai poista kommentit"
#: editor/plugins/script_text_editor.cpp
msgid "Fold/Unfold Line"
@@ -5762,18 +5719,18 @@ msgstr "Kloonaa alas"
#: editor/plugins/script_text_editor.cpp
msgid "Complete Symbol"
-msgstr "Täydennä symbooli"
+msgstr "Täydennä symboli"
#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
msgstr "Poista välilyönnit lopusta"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr "Muuta sisennys välilyönneiksi"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr "Muuta sisennys sarkaimiksi"
#: editor/plugins/script_text_editor.cpp
@@ -5783,43 +5740,34 @@ msgstr "Automaattinen sisennys"
#: editor/plugins/script_text_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Toggle Breakpoint"
-msgstr "Aseta tai poista breakpoint"
+msgstr "Aseta tai poista keskeytyskohta"
#: editor/plugins/script_text_editor.cpp
msgid "Remove All Breakpoints"
-msgstr "Poista kaikki breakpointit"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr "Mene seuraavaan breakpointiin"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr "Mene edelliseen breakpointiin"
+msgstr "Poista kaikki keskeytyskohdat"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr "Muunna isoiksi kirjaimiksi"
+msgid "Go to Next Breakpoint"
+msgstr "Mene seuraavaan keskeytyskohtaan"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr "Muunna pieniksi kirjaimiksi"
+msgid "Go to Previous Breakpoint"
+msgstr "Mene edelliseen keskeytyskohtaan"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr "Etsi edellinen"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Find in files..."
-msgstr "Suodata tiedostot..."
+msgid "Find in Files..."
+msgstr "Etsi tiedostoista..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+msgid "Go to Function..."
msgstr "Mene funktioon..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+msgid "Go to Line..."
msgstr "Mene riville..."
#: editor/plugins/script_text_editor.cpp
@@ -5832,40 +5780,35 @@ msgstr "Sävytin"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "This skeleton has no bones, create some children Bone2D nodes."
-msgstr ""
+msgstr "Tällä luurangolla ei ole luita, luo joitakin Bone2D alisolmuja."
#: editor/plugins/skeleton_2d_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton2D"
-msgstr "Luuranko..."
+msgstr "Skeleton2D"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Make Rest Pose (From Bones)"
-msgstr ""
+msgstr "Tee lepoasento (luista)"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Set Bones to Rest Pose"
-msgstr ""
+msgstr "Aseta luut lepoasentoon"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical bones"
-msgstr "Luo navigointiverkko"
+msgstr "Luo fyysiset luut"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton"
-msgstr "Luuranko..."
+msgstr "Luuranko"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical skeleton"
-msgstr "Luo C# ratkaisu"
+msgstr "Luo fyysinen luuranko"
#: editor/plugins/skeleton_ik_editor_plugin.cpp
-#, fuzzy
msgid "Play IK"
-msgstr "Pelaa"
+msgstr "Toista IK"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Orthogonal"
@@ -5916,6 +5859,14 @@ msgid "Animation Key Inserted."
msgstr "Animaatioavain lisätty."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr "Nyökkäys (pitch)"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr "Käännös (yaw)"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr "Objekteja piirretty"
@@ -6000,9 +5951,8 @@ msgid "This operation requires a single selected node."
msgstr "Tämä toiminto vaatii yhden valitun solmun."
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Lock View Rotation"
-msgstr "Näytä tiedot"
+msgstr "Lukitse näkymän kierto"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Normal"
@@ -6049,9 +5999,8 @@ msgid "Doppler Enable"
msgstr "Doppler käytössä"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Cinematic Preview"
-msgstr "Luodaan meshien esikatseluita"
+msgstr "Elokuvallinen esikatselu"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
@@ -6082,6 +6031,10 @@ msgid "Freelook Speed Modifier"
msgstr "Liikkumisen nopeussäädin"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "Näkymän kierto lukittu"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "XForm-ikkuna"
@@ -6184,11 +6137,6 @@ msgid "Tool Scale"
msgstr "Skaalaustyökalu"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap To Floor"
-msgstr "Tartu ruudukkoon"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Kytke liikkuminen päälle/pois"
@@ -6198,7 +6146,7 @@ msgstr "Muunna"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap object to floor"
-msgstr ""
+msgstr "Kohdista objekti lattiaan"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Dialog..."
@@ -6229,9 +6177,8 @@ msgid "4 Viewports"
msgstr "4 Näyttöruutua"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Gizmos"
-msgstr "Näytä muokkaimet"
+msgstr "Muokkaimet"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Origin"
@@ -6306,51 +6253,49 @@ msgstr "Esi"
msgid "Post"
msgstr "Jälki"
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr "Nimetön muokkain"
+
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite is empty!"
-msgstr "Tallennuspolku on tyhjä!"
+msgstr "Sprite on tyhjä!"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Can't convert a sprite using animation frames to mesh."
-msgstr ""
+msgstr "Ei voida muuntaa spriteä meshiin animaatioruutuja käyttäen."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't replace by mesh."
-msgstr ""
+msgstr "Virheellinen geometria, ei voida korvata meshillä."
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite"
-msgstr "SpriteFrames"
+msgstr "Sprite"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to 2D Mesh"
-msgstr "Muunna muotoon %s"
+msgstr "Muunna 2D-meshiksi"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create 2D Mesh"
-msgstr "Luo reunoista Mesh"
+msgstr "Luo 2D-mesh"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Simplification: "
-msgstr ""
+msgstr "Yksinkertaistus: "
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Grow (Pixels): "
-msgstr ""
+msgstr "Suurrennus (pikseleissä): "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Update Preview"
-msgstr "Esikatselu"
+msgstr "Päivitä esikatselu"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Settings:"
-msgstr "Asetukset"
+msgstr "Asetukset:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
@@ -6398,7 +6343,7 @@ msgstr "Toista"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Animation Frames"
-msgstr "Animaatioframet"
+msgstr "Animaatioruudut"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Insert Empty (Before)"
@@ -6425,12 +6370,17 @@ msgid "Set Region Rect"
msgstr "Aseta alueen suorakulmio"
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr "Aseta marginaali"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr "Tarttumisen tila:"
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
-msgstr "<Ei mitään>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
+msgstr "Ei mitään"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Pixel Snap"
@@ -6454,10 +6404,9 @@ msgstr "Välistys:"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Sep.:"
-msgstr ""
+msgstr "Erotin:"
#: editor/plugins/texture_region_editor_plugin.cpp
-#, fuzzy
msgid "TextureRegion"
msgstr "Tekstuurialue"
@@ -6590,9 +6539,12 @@ msgid "Erase Selection"
msgstr "Tyhjennä valittu alue"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Fix Invalid Tiles"
-msgstr "Virheellinen nimi."
+msgstr "Korjaa virheelliset ruudut"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Cut Selection"
+msgstr "Leikkaa valinta"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
@@ -6615,7 +6567,6 @@ msgid "Erase TileMap"
msgstr "Tyhjennä ruudukko"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Find Tile"
msgstr "Etsi ruutu"
@@ -6640,35 +6591,36 @@ msgid "Pick Tile"
msgstr "Poimi ruutu"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
-msgid "Move Selection"
-msgstr "Poista valinta"
+msgid "Copy Selection"
+msgstr "Kopioi valinta"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr "Käännä 0 astetta"
+msgid "Rotate left"
+msgstr "Kierrä vasemmalle"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr "Käännä 90 astetta"
+msgid "Rotate right"
+msgstr "Kierrä oikealle"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
-msgstr "Käännä 180 astetta"
+msgid "Flip horizontally"
+msgstr "Käännä vaakasuorasti"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
-msgstr "Käännä 270 astetta"
+msgid "Flip vertically"
+msgstr "Käännä pystysuorasti"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Clear transform"
+msgstr "Tyhjennä muunnos"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Add Texture(s) to TileSet"
-msgstr "Lisää solmut puusta"
+msgid "Add Texture(s) to TileSet."
+msgstr "Lisää tekstuurit ruutuvalikoimaan."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Remove current Texture from TileSet"
-msgstr "Poista nykyinen kohde"
+msgid "Remove selected Texture from TileSet."
+msgstr "Poista valittu tekstuuri ruutuvalikoimasta."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -6679,105 +6631,209 @@ msgid "Merge from Scene"
msgstr "Yhdistä skenestä"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
-msgstr ""
-"Valitse aliruutu, jota käytetään ikonina ja myös virheellisten "
-"automaattiruudutusten ilmaisemiseen."
+msgid "Copy bitmask."
+msgstr "Kopioi bittimaski."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
-msgstr ""
+msgid "Paste bitmask."
+msgstr "Liitä bittimaski."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Erase bitmask."
+msgstr "Pyyhi bittimaski."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new polygon."
+msgstr "Luo uusi polygoni."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr "Pidä polygoni alueen suorakulmion sisällä."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
+msgstr "Aseta tarttuminen ja näytä ruudukko (muokattavissa Tarkastelussa)."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr "Näytä ruutujen nimet (pidä Alt-näppäin pohjassa)"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove selected texture? This will remove all tiles which use it."
msgstr ""
+"Poista valittu tekstuuri? Tämä poistaa kaikki ruudut, jotka käyttävät sitä."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
-msgstr ""
+msgstr "Et ole valinnut poistettavaa tekstuuria."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
-msgstr "Luo skenestä?"
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr "Luo skenestä? Tämä ylikirjoittaa kaikki nykyiset ruudut."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
msgstr "Yhdistä skenestä?"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
-msgstr ""
+msgid "Remove Texture"
+msgstr "Poista tekstuuri"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
+msgstr "%s tiedostoa ei lisätty, koska ne olivat jo listalla."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Drag handles to edit Rect.\n"
"Click on another Tile to edit it."
msgstr ""
+"Vedä kahvoja muokataksesi suorakulmiota.\n"
+"Napsauta toista ruutua muokataksesi sitä."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete selected Rect."
+msgstr "Poista valittu suorakulmio."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
-"Hiiren vasen: aseta bitti päälle.\n"
-"Hiiren oikea: aseta bitti pois päältä."
+"Valitse muokattavana oleva aliruutu.\n"
+"Napsauta toista ruutua muokataksesi sitä."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete polygon."
+msgstr "Poista polygoni."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
-msgstr "Valitse muokattavana oleva aliruutu."
+msgstr ""
+"Hiiren vasen: aseta bitti päälle.\n"
+"Hiiren oikea: aseta bitti pois päältä.\n"
+"Napsauta toista ruutua muokataksesi sitä."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to use as icon, this will be also used on invalid autotile "
"bindings.\n"
"Click on another Tile to edit it."
msgstr ""
"Valitse aliruutu, jota käytetään ikonina ja myös virheellisten "
-"automaattiruudutusten ilmaisemiseen."
+"automaattiruudutusten ilmaisemiseen.\n"
+"Napsauta toista ruutua muokataksesi sitä."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to change its priority.\n"
"Click on another Tile to edit it."
-msgstr "Valitse aliruutu muuttaaksesi sen tärkeyttä."
+msgstr ""
+"Valitse aliruutu muuttaaksesi sen tärkeyttä.\n"
+"Napsauta toista ruutua muokataksesi sitä."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+"Valitse aliruutu muuttaaksesi sen z-järjestystä.\n"
+"Napsauta toista ruutua muokataksesi sitä."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr "Aseta ruudun alue"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Tile"
+msgstr "Luo ruutu"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr "Aseta ruudun ikoni"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr "Muokkaa ruudun bittimaskia"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Collision Polygon"
+msgstr "Muokkaa törmäyspolygonia"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Occlusion Polygon"
+msgstr "Muokkaa peittopolygonia"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Navigation Polygon"
+msgstr "Muokkaa navigointipolygonia"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste Tile Bitmask"
+msgstr "Liitä ruudun bittimaski"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr "Tyhjennä ruudun bittimaski"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Tile"
+msgstr "Poista ruutu"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr "Poista törmäyspolygoni"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr "Poista peittopolygoni"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr "Poista navigointipolygoni"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr "Muokkaa ruudun prioriteettia"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr "Muokkaa ruudun Z-indeksiä"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Collision Polygon"
+msgstr "Luo törmäyspolygoni"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Occlusion Polygon"
+msgstr "Luo peittopolygoni"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "This property can't be changed."
-msgstr "Tätä toimintoa ei voi tehdä ilman skeneä."
+msgstr "Tätä ominaisuutta ei voi muuttaa."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
+msgid "TileSet"
msgstr "Ruutuvalikoima"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vertex"
-msgstr "Kärkipisteet"
+msgstr "Vertex"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Fragment"
-msgstr "Argumentit:"
+msgstr "Fragment"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Light"
-msgstr "OIkea"
+msgstr "Valo"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "VisualShader"
-msgstr "Sävytin"
+msgstr "VisualShader"
#: editor/project_export.cpp
msgid "Runnable"
@@ -6796,6 +6852,14 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr "Vientimallit tälle alustalle puuttuvat tai ovat viallisia:"
#: editor/project_export.cpp
+msgid "Release"
+msgstr "Julkaisuversio"
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr "Viedään kaikki"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr "Esiasetukset"
@@ -6804,6 +6868,10 @@ msgid "Add..."
msgstr "Lisää..."
#: editor/project_export.cpp
+msgid "Export Path"
+msgstr "Vie polku"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr "Resurssit"
@@ -6862,10 +6930,46 @@ msgid "Feature List:"
msgstr "Ominaisuuslista:"
#: editor/project_export.cpp
+msgid "Script"
+msgstr "Skripti"
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "Skriptin vientitila:"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr "Teksti"
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr "Käännetty"
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "Salattu (syötä avain alla)"
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr "Virheellinen salausavain (oltava 64 merkkiä pitkä)"
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "Skriptin salausavain (256-bittinen heksana):"
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr "Vie PCK/Zip"
#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr "Vientitila?"
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr "Vie kaikki"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr "Tälle alustalle ei löytynyt vientipohjia:"
@@ -6878,22 +6982,22 @@ msgid "The path does not exist."
msgstr "Polkua ei ole olemassa."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
-msgstr "Ole hyvä ja valitse hakemisto jossa ei ole 'project.godot' tiedostoa."
+msgstr ""
+"Virheellinen '.zip' projektitiedosto; se ei sisällä 'project.godot' "
+"tiedostoa."
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "Ole hyvä ja valitse tyhjä kansio."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "Ole hyvä ja valitse 'project.godot' tiedosto."
+msgstr "Ole hyvä ja valitse 'project.godot' tai '.zip' tiedosto."
#: editor/project_manager.cpp
msgid "Directory already contains a Godot project."
-msgstr ""
+msgstr "Hakemisto sisältää jo Godot-projektin."
#: editor/project_manager.cpp
msgid "Imported Project"
@@ -6984,9 +7088,8 @@ msgid "Project Path:"
msgstr "Projektin polku:"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Project Installation Path:"
-msgstr "Projektin polku:"
+msgstr "Projektin asennuspolku:"
#: editor/project_manager.cpp
msgid "Browse"
@@ -6997,8 +7100,8 @@ msgid "Unnamed Project"
msgstr "Nimetön projekti"
#: editor/project_manager.cpp
-msgid "Can't open project"
-msgstr "Projektia ei voida avata"
+msgid "Can't open project at '%s'."
+msgstr "Ei voida avata projektia kohteesta '%s'."
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
@@ -7006,6 +7109,33 @@ msgstr "Haluatko varmasti avata useamman kuin yhden projektin?"
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+"Seuraava projektin asetustiedosto on luotu vanhemmalla versiolla ja täytyy "
+"muuntaa tätä versiota varten:\n"
+"\n"
+"%s\n"
+"\n"
+"Haluatko muuntaa sen?\n"
+"Varoitus: et voi avata projektia tämän jälkeen enää vanhemmilla versioilla."
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+"Projektin asetukset on luotu uudemmalla versiolla, jonka asetukset eivät ole "
+"yhteensopivia tämän version kanssa."
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7106,13 +7236,12 @@ msgid "Mouse Button"
msgstr "Hiiren painike"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid ""
"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
msgstr ""
"Virheellinen toiminnon nimi. Se ei voi olla tyhjä eikä voi sisältää merkkejä "
-"'/', ':', '=', '\\' tai '\"'."
+"'/', ':', '=', '\\' tai '\"'"
#: editor/project_settings_editor.cpp
msgid "Action '%s' already exists!"
@@ -7123,18 +7252,16 @@ msgid "Rename Input Action Event"
msgstr "Nimeä syötetoiminto uudelleen"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Change Action deadzone"
-msgstr "Vaihda animaation nimi:"
+msgstr "Vaihda toiminnon katvealue"
#: editor/project_settings_editor.cpp
msgid "Add Input Action Event"
msgstr "Lisää syötetoiminnon tapahtuma"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "All Devices"
-msgstr "Laite"
+msgstr "Kaikki laitteet"
#: editor/project_settings_editor.cpp
msgid "Device"
@@ -7181,24 +7308,20 @@ msgid "Wheel Down Button"
msgstr "Rulla alas painike"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Left Button"
-msgstr "Rulla ylös painike"
+msgstr "Rullan vasen painike"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Right Button"
-msgstr "Oikea painike"
+msgstr "Rullan oikea painike"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 1"
-msgstr "Painike 6"
+msgstr "X-painike 1"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 2"
-msgstr "Painike 6"
+msgstr "X-painike 2"
#: editor/project_settings_editor.cpp
msgid "Joypad Axis Index:"
@@ -7340,17 +7463,13 @@ msgstr "Projektin asetukset (project.godot)"
msgid "General"
msgstr "Yleistä"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr "Ominaisuus:"
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr "Ohita alustalle..."
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Editor must be restarted for changes to take effect"
-msgstr ""
+msgstr "Editori täytyy käynnistää uudelleen, jotta muutokset tulevat voimaan"
#: editor/project_settings_editor.cpp
msgid "Input Map"
@@ -7361,13 +7480,12 @@ msgid "Action:"
msgstr "Toiminto:"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Action"
-msgstr "Toiminto:"
+msgstr "Toiminto"
#: editor/project_settings_editor.cpp
msgid "Deadzone"
-msgstr ""
+msgstr "Katvealue"
#: editor/project_settings_editor.cpp
msgid "Device:"
@@ -7477,10 +7595,6 @@ msgstr "Poimi solmu"
msgid "Bit %d, val %d."
msgstr "Bitti %d, arvo %d."
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr "Ominaisuudet:"
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr "Valitse ominaisuus"
@@ -7502,129 +7616,122 @@ msgid "Can't load back converted image using PVRTC tool:"
msgstr "Muunnettua kuva ei voitu ladata takaisin PVRTC-työkalulla:"
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Batch Rename"
-msgstr "Nimeä uudelleen"
+msgstr "Niputettu uudelleennimeäminen"
#: editor/rename_dialog.cpp
msgid "Prefix"
-msgstr ""
+msgstr "Etuliite"
#: editor/rename_dialog.cpp
msgid "Suffix"
-msgstr ""
+msgstr "Pääte"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Advanced options"
-msgstr "Tarttumisen asetukset"
+msgstr "Edistyneet asetukset"
#: editor/rename_dialog.cpp
msgid "Substitute"
-msgstr ""
+msgstr "Korvike"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node name"
-msgstr "Solmun nimi:"
+msgstr "Solmun nimi"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
-msgstr ""
+msgstr "Solmun yläsolmun nimi, jos saatavilla"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node type"
-msgstr "Etsi solmun tyyppi"
+msgstr "Solmun tyyppi"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Current scene name"
-msgstr "Nykyinen skene"
+msgstr "Nykyisen skene nimi"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Root node name"
-msgstr "Nimeä uudelleen"
+msgstr "Juurisolmun nimi"
#: editor/rename_dialog.cpp
msgid ""
"Sequential integer counter.\n"
"Compare counter options."
msgstr ""
+"Jaksollinen kokonaislukulaskuri.\n"
+"Vertaa laskurin valintoja."
#: editor/rename_dialog.cpp
msgid "Per Level counter"
-msgstr ""
+msgstr "Per taso -laskuri"
#: editor/rename_dialog.cpp
msgid "If set the counter restarts for each group of child nodes"
-msgstr ""
+msgstr "Jos asetettu, laskuri alkaa alusta jokaiselle alisolmujen ryhmälle"
#: editor/rename_dialog.cpp
msgid "Initial value for the counter"
-msgstr ""
+msgstr "Laskurin alkuarvo"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Step"
-msgstr "Välistys:"
+msgstr "Askel"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
-msgstr ""
+msgid "Amount by which counter is incremented for each node"
+msgstr "Lukumäärä, jolla laskuria kasvatetaan kullekin solmulle"
#: editor/rename_dialog.cpp
msgid "Padding"
-msgstr ""
+msgstr "Täyte"
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
+"Pienin määrä numeromerkkejä laskurille.\n"
+"Puuttuvat numeromerkit täytetään edeltävillä nollilla."
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Regular Expressions"
-msgstr "Vaihda lauseketta"
+msgstr "Säännölliset lausekkeet"
#: editor/rename_dialog.cpp
msgid "Post-Process"
-msgstr ""
+msgstr "Jälkikäsittely"
#: editor/rename_dialog.cpp
msgid "Keep"
-msgstr ""
+msgstr "Pidä"
#: editor/rename_dialog.cpp
msgid "CamelCase to under_scored"
-msgstr ""
+msgstr "CamelCase ala_viivoiksi"
#: editor/rename_dialog.cpp
msgid "under_scored to CamelCase"
-msgstr ""
+msgstr "ala_viivat CamelCaseksi"
#: editor/rename_dialog.cpp
msgid "Case"
-msgstr ""
+msgstr "Aakkoslaji"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Lowercase"
-msgstr "Pienet kirjaimet"
+msgstr "Pieniksi kirjaimiksi"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Uppercase"
-msgstr "Isot kirjaimet"
+msgstr "Isoiksi kirjaimiksi"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Reset"
-msgstr "Palauta oletuslähennystaso"
+msgstr "Palauta"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr "Virhe"
@@ -7685,6 +7792,10 @@ msgid "Instance Scene(s)"
msgstr "Luo ilmentymä skenestä tai skeneistä"
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "Luo aliskenen ilmentymä"
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr "Tyhjennä skripti"
@@ -7721,6 +7832,14 @@ msgid "Save New Scene As..."
msgstr "Tallenna uusi skene nimellä..."
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+"\"editable_instance\" ominaisuuden poistaminen käytöstä palauttaa kaikki "
+"solmun ominaisuudet oletusarvoihin."
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr "Muokattavat alisolmut"
@@ -7729,34 +7848,28 @@ msgid "Load As Placeholder"
msgstr "Lataa paikanpitäjäksi"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make Local"
-msgstr "Paikallinen"
+msgstr "Tee paikallinen"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "Luo solmu"
+msgstr "Luo juurisolmu:"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "2D Scene"
-msgstr "Skene"
+msgstr "2D-skene"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "3D Scene"
-msgstr "Skene"
+msgstr "3D-skene"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "User Interface"
-msgstr "Poista perintä"
+msgstr "Käyttöliittymä"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Custom Node"
-msgstr "Leikkaa solmut"
+msgstr "Mukautettu solmu"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
@@ -7799,6 +7912,10 @@ msgid "Clear Inheritance"
msgstr "Poista perintä"
#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr "Avaa dokumentaatio"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr "Poista solmu(t)"
@@ -7807,17 +7924,16 @@ msgid "Add Child Node"
msgstr "Lisää alisolmu"
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
-msgstr "Luo aliskenen ilmentymä"
-
-#: editor/scene_tree_dock.cpp
msgid "Change Type"
msgstr "Muuta tyyppiä"
#: editor/scene_tree_dock.cpp
-#, fuzzy
+msgid "Extend Script"
+msgstr "Laajenna skriptiä"
+
+#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
-msgstr "Käy järkeen!"
+msgstr "Tee skenen juuri"
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
@@ -7868,7 +7984,6 @@ msgid "Clear Inheritance? (No Undo!)"
msgstr "Poistetaanko perintä? (Ei voi perua!)"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Toggle Visible"
msgstr "Aseta näkyvyys"
@@ -7877,12 +7992,11 @@ msgid "Node configuration warning:"
msgstr "Solmun konfiguroinnin varoitus:"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node has connection(s) and group(s).\n"
"Click to show signals dock."
msgstr ""
-"Solmulla on liitäntöjä ja ryhmiä\n"
+"Solmulla on yhteyksiä ja ryhmiä.\n"
"Napsauta näyttääksesi signaalitelakan."
#: editor/scene_tree_editor.cpp
@@ -7902,27 +8016,24 @@ msgstr ""
"Napsauta näyttääksesi ryhmätelakan."
#: editor/scene_tree_editor.cpp editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script"
msgstr "Avaa skripti"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node is locked.\n"
"Click to unlock it."
msgstr ""
"Solmu on lukittu.\n"
-"Napsauta lukituksen avaamiseksi"
+"Napsauta lukituksen avaamiseksi."
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Children are not selectable.\n"
"Click to make selectable."
msgstr ""
"Alisolmut eivät ole valittavissa.\n"
-"Napsauta niiden tekemiseksi valittavaksi"
+"Napsauta niiden tekemiseksi valittavaksi."
#: editor/scene_tree_editor.cpp
msgid "Toggle Visibility"
@@ -7933,6 +8044,8 @@ msgid ""
"AnimationPlayer is pinned.\n"
"Click to unpin."
msgstr ""
+"AnimationPlayer on kiinnitetty.\n"
+"Napsauta kiinnityksen poistamiseksi."
#: editor/scene_tree_editor.cpp
msgid "Invalid node name, the following characters are not allowed:"
@@ -7971,15 +8084,18 @@ msgid "N/A"
msgstr "Ei mitään"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script/Choose Location"
-msgstr "Avaa skriptieditori"
+msgstr "Avaa skripti / Valitse sijainti"
#: editor/script_create_dialog.cpp
msgid "Path is empty"
msgstr "Polku on tyhjä"
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr "Tiedostonimi on tyhjä"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr "Polku ei ole paikallinen"
@@ -8068,20 +8184,8 @@ msgid "Bytes:"
msgstr "Tavu(j)a:"
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr "Varoitus"
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr "Virhe:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr "Lähde:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
-msgstr "Funktio:"
+msgid "Stack Trace"
+msgstr "Pinojäljitys"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8109,19 +8213,7 @@ msgstr "Tarkastele seuraavaa ilmentymää"
#: editor/script_editor_debugger.cpp
msgid "Stack Frames"
-msgstr "Pinoa Framet"
-
-#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr "Muuttuja"
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr "Virheet:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr "Metodipino (jos soveltuva):"
+msgstr "Pinokehykset"
#: editor/script_editor_debugger.cpp
msgid "Profiler"
@@ -8212,9 +8304,8 @@ msgid "Change Camera Size"
msgstr "Muuta kameran kokoa"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Notifier AABB"
-msgstr "Muuta ilmoittajan kattavuutta"
+msgstr "Muuta ilmoittajan AABB"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Particles AABB"
@@ -8241,38 +8332,32 @@ msgid "Change Capsule Shape Height"
msgstr "Muuta kapselimuodon korkeutta"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Radius"
-msgstr "Muuta kapselimuodon sädettä"
+msgstr "Muuta sylinterimuodon sädettä"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Height"
-msgstr "Muuta kapselimuodon korkeutta"
+msgstr "Muuta sylinterimuodon korkeutta"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Ray Shape Length"
msgstr "Vaihda säteen muodon pituutta"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Radius"
-msgstr "Muuta valon sädettä"
+msgstr "Muuta sylinterin sädettä"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Height"
-msgstr "Muuta kapselimuodon korkeutta"
+msgstr "Muuta sylinterin korkeutta"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Inner Radius"
-msgstr "Muuta pallomuodon sädettä"
+msgstr "Muuta toruksen sisäsädettä"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Outer Radius"
-msgstr "Muuta valon sädettä"
+msgstr "Muuta toruksen ulkosädettä"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select the dynamic library for this entry"
@@ -8327,8 +8412,8 @@ msgid "GDNative"
msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
-msgstr "askeleen argumentti on nolla!"
+msgid "Step argument is zero!"
+msgstr "Askeleen argumentti on nolla!"
#: modules/gdscript/gdscript_functions.cpp
msgid "Not a script with an instance"
@@ -8395,9 +8480,8 @@ msgid "GridMap Delete Selection"
msgstr "Poista valinta"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Fill Selection"
-msgstr "Poista valinta"
+msgstr "Täytä valinta"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Duplicate Selection"
@@ -8480,9 +8564,8 @@ msgid "Clear Selection"
msgstr "Tyhjennä valinta"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Fill Selection"
-msgstr "Koko valinta"
+msgstr "Täytä valinta"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Settings"
@@ -8553,12 +8636,8 @@ msgid "End of inner exception stack trace"
msgstr "Sisemmän poikkeuksen kutsupinon loppu"
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr "Kehitä!"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
-msgstr "Kehitä navigointiverkko."
+msgid "Bake NavMesh"
+msgstr "Kehitä NavMesh"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8786,14 +8865,12 @@ msgid "Connect Nodes"
msgstr "Kytke solmut"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Data"
-msgstr "Kytke solmut"
+msgstr "Kytke solmun data"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Sequence"
-msgstr "Kytke solmut"
+msgstr "Kytke solmun järjestys"
#: modules/visual_script/visual_script_editor.cpp
msgid "Script already has function '%s'"
@@ -8840,6 +8917,10 @@ msgid "Base Type:"
msgstr "Kantatyyppi:"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "Jäsenet:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "Saatavilla olevat solmut:"
@@ -8876,9 +8957,8 @@ msgid "Paste Nodes"
msgstr "Liitä solmut"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
-msgstr "Jäsenet"
+msgstr "Muokkaa jäsentä"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Input type not iterable: "
@@ -8938,17 +9018,16 @@ msgstr ""
"tai merkkijono (virhe)."
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Search VisualScript"
-msgstr "Poista VisualScript solmu"
+msgstr "Hae VisualScriptistä"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
-msgstr "Get"
+msgid "Get %s"
+msgstr "Hae %s"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
-msgstr ""
+msgid "Set %s"
+msgstr "Aseta %s"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -8999,14 +9078,13 @@ msgstr ""
"joukko). Ensimmäisenä luotu toimii ja loput jätetään huomioimatta."
#: scene/2d/collision_object_2d.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
"define its shape."
msgstr ""
-"Tämän solmun alaisuudessa ei ole muotoja, joten se ei voi olla "
-"vuorovaikutuksessa avaruuden kanssa.\n"
+"Tämän solmulla ei ole muotoa, joten se ei voi törmätä tai olla "
+"vuorovaikutuksessa muiden objektien kanssa.\n"
"Harkitse CollisionShape2D tai CollisionPolygon2D solmun lisäämistä "
"alisolmuksi muodon määrittämiseksi."
@@ -9042,6 +9120,14 @@ msgstr ""
"CollisionShape2D solmulla täytyy olla muoto, jotta se toimisi. Ole hyvä ja "
"luo sille muotoresurssi!"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+"CPUParticles2D animaatio edellyttää CanvasItemMaterial käyttöä niin että "
+"\"Particles Animation\" on kytketty päälle."
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -9053,14 +9139,12 @@ msgstr ""
msgid ""
"An occluder polygon must be set (or drawn) for this occluder to take effect."
msgstr ""
-"Toimimiseksi tälle peittäjälle on asetettava (tai piirrettävä) peittävä "
-"monikulmio."
+"Jotta tämä peittäjä toimisi, sille on asetettava (tai piirrettävä) "
+"peittopolygoni."
#: scene/2d/light_occluder_2d.cpp
msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
-msgstr ""
-"Peittävä monikulmio tälle peittäjälle on tyhjä. Ole hyvä ja piirrä "
-"monikulmio!"
+msgstr "Tämän peittäjän peittopolygoni on tyhjä. Ole hyvä ja piirrä polygoni!"
#: scene/2d/navigation_polygon.cpp
msgid ""
@@ -9093,6 +9177,14 @@ msgstr ""
"Materiaalia partikkeleiden käsittelemiseksi ei ole määritetty, joten mitään "
"ei tapahdu."
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+"Particles2D animaatio edellyttää CanvasItemMaterial käyttöä niin että "
+"\"Particles Animation\" on kytketty päälle."
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -9115,16 +9207,19 @@ msgstr ""
#: scene/2d/skeleton_2d.cpp
msgid "This Bone2D chain should end at a Skeleton2D node."
-msgstr ""
+msgstr "Tämän Bone2D ketjun pitäisi päättyä Skeleton2D solmuun."
#: scene/2d/skeleton_2d.cpp
msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
msgstr ""
+"Bone2D solmu toimii vain, jos sen yläsolmu on Skeleton2D tai toinen Bone2D."
#: scene/2d/skeleton_2d.cpp
msgid ""
"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
msgstr ""
+"Tältä luulta puuttuu kunnollinen lepoasento (REST). Mene Skeleton2D solmuun "
+"ja aseta sellainen."
#: scene/2d/visibility_notifier_2d.cpp
msgid ""
@@ -9191,14 +9286,13 @@ msgid "Lighting Meshes: "
msgstr "Valaistaan meshejä: "
#: scene/3d/collision_object.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape or CollisionPolygon as a child to define "
"its shape."
msgstr ""
-"Tällä solmulla ei ole alimuotoja, joten se ei voi olla vuorovaikutuksessa "
-"avaruuden kanssa.\n"
+"Tällä solmulla ei ole muotoa, joten se ei voi törmätä tai olla "
+"vuorovaikutuksessa muiden objektien kanssa.\n"
"Harkitse CollisionShape tai CollisionPolygon solmun lisäämistä sen "
"alisolmuksi määritelläksesi sen muodon."
@@ -9234,6 +9328,18 @@ msgstr ""
"CollisionShape solmulle täytyy antaa muoto, jotta se toimisi. Ole hyvä ja "
"luo sille muotoresurssi!"
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr "Mitään ei näy, koska meshiä ei ole asetettu."
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+"CPUParticles animaatio edellyttää SpatialMaterial käyttöä niin että "
+"\"Billboard Particles\" on kytketty päälle."
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr "Piirretään meshejä"
@@ -9259,6 +9365,31 @@ msgstr ""
"Mitään ei näy, koska mesheille ei ole asetettu piirtopyyhkäisyjä (draw "
"passes)."
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+"Particles animaatio edellyttää SpatialMaterial käyttöä niin että \"Billboard "
+"Particles\" on kytketty päälle."
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr "PathFollow toimii ainoastaan ollessaan asetettuna Path solmun alle."
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+"OrientedPathFollow toimii ainoastaan ollessaan asetettuna Path solmun alle."
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+"OrientedPathFollow edellyttää, että sen Path isäntäsolmun Curve resurssin "
+"\"Up Vector\" on asetettu päälle."
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9295,18 +9426,16 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid "This body will be ignored until you set a mesh"
-msgstr ""
+msgstr "Tämä kappale sivuutetaan, kunnes asetat meshin"
#: scene/3d/soft_body.cpp
-#, fuzzy
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
-"Fysiikkamoottori ylikirjoittaa RigidBody kokomuutokset (hahmo- tai "
-"jäykkätilassa) ajon aikana.\n"
-"Muuta sen sijaan solmun alla olevia törmäysmuotoja."
+"Fysiikkamoottori ylikirjoittaa SoftBody kokomuutokset ajon aikana.\n"
+"Muuta kokoa sen sijaan alisolmujen törmäysmuodoissa."
#: scene/3d/sprite_3d.cpp
msgid ""
@@ -9326,44 +9455,45 @@ msgstr ""
#: scene/animation/animation_blend_tree.cpp
msgid "On BlendTree node '%s', animation not found: '%s'"
-msgstr ""
+msgstr "BlendTree solmusta '%' ei löytynyt animaatiota: '%s'"
#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "Animaatiotyökalut"
+msgstr "Animaatio ei löytynyt: '%s'"
#: scene/animation/animation_tree.cpp
msgid "In node '%s', invalid animation: '%s'."
-msgstr ""
+msgstr "Virheellinen animaatio solmussa '%s': '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "VIRHE: Virheellinen animaation nimi!"
+msgstr "Virheellinen animaatio: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "Katkaise yhteys solmusta '%s' solmuun '%s'"
+msgstr "Mitään ei ole yhdistetty syötteeseen '%s' solmussa '%s'."
#: scene/animation/animation_tree.cpp
msgid "A root AnimationNode for the graph is not set."
-msgstr ""
+msgstr "Graafille ei ole asetettu AnimationNode juurisolmua."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Path to an AnimationPlayer node containing animations is not set."
-msgstr "Valitse AnimationPlayer skenen puusta muokataksesi animaatioita."
+msgstr "Polku animaatiot sisältävään AnimationPlayer solmuun on asettamatta."
#: scene/animation/animation_tree.cpp
msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
msgstr ""
+"AnimationPlayer solmulle asetettu polku ei johda AnimationPlayer solmuun."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "AnimationPlayer root is not a valid node."
-msgstr "Animaatiopuu ei ole kelvollinen."
+msgstr "AnimationPlayer juuri ei ole kelvollinen solmu."
+
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+"Tämä solmu on poistettu käytöstä. Käytä sen sijaan AnimationTree solmua."
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
@@ -9381,10 +9511,6 @@ msgstr "Huomio!"
msgid "Please Confirm..."
msgstr "Ole hyvä ja vahvista..."
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr "Valitse tämä kansio"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9395,6 +9521,10 @@ msgstr ""
"popup*() -funktiota. Ne saadaan näkyville muokatessa, mutta eivät näy "
"suoritettaessa."
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr "Jos exp_edit on tosi, min_value täytyy olla > 0."
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9446,31 +9576,225 @@ msgid "Invalid font size."
msgstr "Virheellinen fonttikoko."
#: scene/resources/visual_shader.cpp
-#, fuzzy
msgid "Input"
-msgstr "Lisää syöte"
-
-#: scene/resources/visual_shader.cpp
-#, fuzzy
-msgid "None"
-msgstr "<Ei mitään>"
+msgstr "Syöte"
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for shader."
-msgstr "Virheellinen lähde!"
+msgstr "Virheellinen lähde sävyttimelle."
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
-msgstr ""
+msgstr "Sijoitus funktiolle."
#: servers/visual/shader_language.cpp
msgid "Assignment to uniform."
-msgstr ""
+msgstr "Sijoitus uniformille."
#: servers/visual/shader_language.cpp
msgid "Varyings can only be assigned in vertex function."
-msgstr ""
+msgstr "Varying tyypin voi sijoittaa vain vertex-funktiossa."
+
+#~ msgid "Split point with itself."
+#~ msgstr "Jaa piste itsellään."
+
+#~ msgid "Split can't form an existing edge."
+#~ msgstr "Jako ei voi muodostaa olemassa olevaa reunaa."
+
+#~ msgid "Split already exists."
+#~ msgstr "Jako on jo olemassa."
+
+#~ msgid "Add Split"
+#~ msgstr "Lisää jako"
+
+#~ msgid "Invalid Split: "
+#~ msgstr "Virheellinen jako: "
+
+#~ msgid "Remove Split"
+#~ msgstr "Poista jako"
+
+#~ msgid "Poly"
+#~ msgstr "Polygoni"
+
+#~ msgid "Splits"
+#~ msgstr "Jaot"
+
+#~ msgid "Connect two points to make a split."
+#~ msgstr "Yhdistä kaksi pistettä luodaksesi jaon."
+
+#~ msgid "Select a split to erase it."
+#~ msgstr "Valitse jako poistaaksesi sen."
+
+#~ msgid "No name provided"
+#~ msgstr "Nimeä ei annettu"
+
+#~ msgid "Add Node.."
+#~ msgstr "Lisää solmu..."
+
+#~ msgid "Create from scene?"
+#~ msgstr "Luo skenestä?"
+
+#~ msgid "Create Poly"
+#~ msgstr "Luo polygoni"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "Luo uusi polygoni tyhjästä"
+
+#~ msgid "Zoom out"
+#~ msgstr "Loitonna"
+
+#~ msgid "Zoom in"
+#~ msgstr "Lähennä"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "Luo Poly3D"
+
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "Tälle solmulle ei ole OccluderPolygon2D resurssia.\n"
+#~ "Luodaanko ja asetetaanko sellainen?"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "VHP: Siirrä pistettä."
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "Ctrl+Vasen hiirennappi: Puolita osa."
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "OHP: Pyyhi piste."
+
+#~ msgid "New TextFile"
+#~ msgstr "Uusi tekstitiedosto"
+
+#~ msgid "Save Theme As"
+#~ msgstr "Tallenna teema nimellä"
+
+#~ msgid "<None>"
+#~ msgstr "<Ei mitään>"
+
+#~ msgid ""
+#~ "Select sub-tile to use as icon, this will be also used on invalid "
+#~ "autotile bindings."
+#~ msgstr ""
+#~ "Valitse aliruutu, jota käytetään ikonina ja myös virheellisten "
+#~ "automaattiruudutusten ilmaisemiseen."
+
+#~ msgid "Zoom:"
+#~ msgstr "Lähennä:"
+
+#~ msgid "Are you sure you want to remove all connections from the \""
+#~ msgstr "Oletko varma, että haluat poistaa kaikki yhteydet kohteesta \""
+
+#~ msgid "Class List:"
+#~ msgstr "Luokkaluettelo:"
+
+#~ msgid "Search Classes"
+#~ msgstr "Etsi luokkia"
+
+#~ msgid "Public Methods"
+#~ msgstr "Julkiset metodit"
+
+#~ msgid "Public Methods:"
+#~ msgstr "Julkiset metodit:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "Käyttöliittymäteeman osat"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "Käyttöliittymäteeman osat:"
+
+#~ msgid "Property: "
+#~ msgstr "Ominaisuus: "
+
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "Merkitse kansio suosikkeihin."
+
+#~ msgid "Show current scene file."
+#~ msgstr "Näytä nykyinen skenetiedosto."
+
+#~ msgid "Enter tree-view."
+#~ msgstr "Mene puunäkymään."
+
+#~ msgid "Whole words"
+#~ msgstr "Kokonaisia sanoja"
+
+#~ msgid "Match case"
+#~ msgstr "Huomioi kirjainkoko"
+
+#~ msgid "Filter: "
+#~ msgstr "Suodatin: "
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#~ msgid "Show In File System"
+#~ msgstr "Näytä tiedostojärjestelmässä"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "Etsi luokkahierarkiasta."
+
+#~ msgid "Search in files"
+#~ msgstr "Hae tiedostoista"
+
+#~ msgid ""
+#~ "Built-in scripts can only be edited when the scene they belong to is "
+#~ "loaded"
+#~ msgstr ""
+#~ "Sisäänrakennettuja skriptejä voi muokata ainoastaan, kun skene, johon ne "
+#~ "kuuluvat, on ladattu"
+
+#~ msgid "Convert To Uppercase"
+#~ msgstr "Muunna isoiksi kirjaimiksi"
+
+#~ msgid "Convert To Lowercase"
+#~ msgstr "Muunna pieniksi kirjaimiksi"
+
+#~ msgid "Snap To Floor"
+#~ msgstr "Tartu lattiaan"
+
+#~ msgid "Rotate 0 degrees"
+#~ msgstr "Käännä 0 astetta"
+
+#~ msgid "Rotate 90 degrees"
+#~ msgstr "Käännä 90 astetta"
+
+#~ msgid "Rotate 180 degrees"
+#~ msgstr "Käännä 180 astetta"
+
+#~ msgid "Rotate 270 degrees"
+#~ msgstr "Käännä 270 astetta"
+
+#~ msgid "Warning"
+#~ msgstr "Varoitus"
+
+#~ msgid "Error:"
+#~ msgstr "Virhe:"
+
+#~ msgid "Source:"
+#~ msgstr "Lähde:"
+
+#~ msgid "Function:"
+#~ msgstr "Funktio:"
+
+#~ msgid "Variable"
+#~ msgstr "Muuttuja"
+
+#~ msgid "Errors:"
+#~ msgstr "Virheet:"
+
+#~ msgid "Stack Trace (if applicable):"
+#~ msgstr "Metodipino (jos soveltuva):"
+
+#~ msgid "Bake!"
+#~ msgstr "Kehitä!"
+
+#~ msgid "Bake the navigation mesh."
+#~ msgstr "Kehitä navigointiverkko."
+
+#~ msgid "Get"
+#~ msgstr "Get"
#~ msgid "Change Scalar Constant"
#~ msgstr "Muuta skalaarivakiota"
@@ -9670,9 +9994,6 @@ msgstr ""
#~ msgid "Run Script"
#~ msgstr "Suorita skripti"
-#~ msgid "Save the currently edited resource."
-#~ msgstr "Tallenna tällä hetkellä muokattu resurssi."
-
#~ msgid "Stop Profiling"
#~ msgstr "Lopeta profilointi"
@@ -10038,9 +10359,6 @@ msgstr ""
#~ msgid "Start(s)"
#~ msgstr "Alkaa"
-#~ msgid "Filters"
-#~ msgstr "Suodattimet"
-
#~ msgid "Source path is empty."
#~ msgstr "Lähdepolku on tyhjä."
@@ -10140,9 +10458,6 @@ msgstr ""
#~ msgid "Crop empty space."
#~ msgstr "Leikkaa pois tyhjä tila."
-#~ msgid "Texture"
-#~ msgstr "Tekstuuri"
-
#~ msgid "Import Large Texture"
#~ msgstr "Tuo suurikokoinen tekstuuri"
@@ -10194,9 +10509,6 @@ msgstr ""
#~ msgid "Ignore First Row"
#~ msgstr "Sivuuta ensimmäinen rivi"
-#~ msgid "Compress"
-#~ msgstr "Tiivistä"
-
#, fuzzy
#~ msgid "Add to Project (project.godot)"
#~ msgstr "Lisää projektiin (godot.cfg)"
@@ -10237,15 +10549,9 @@ msgstr ""
#~ msgid "8 Bits"
#~ msgstr "8 bittiä"
-#~ msgid "Pitch"
-#~ msgstr "Sävelkorkeus"
-
#~ msgid "Window"
#~ msgstr "Ikkuna"
-#~ msgid "Move Right"
-#~ msgstr "Siirry oikealle"
-
#~ msgid "Up"
#~ msgstr "Ylös"
@@ -10290,9 +10596,6 @@ msgstr ""
#~ msgid "just pressed"
#~ msgstr "juuri painettu"
-#~ msgid "just released"
-#~ msgstr "juuri julkaistu"
-
#~ msgid "Error creating the signature object."
#~ msgstr "Virhe luotaessa allekirjoitusoliota."
diff --git a/editor/translations/fr.po b/editor/translations/fr.po
index 2f98c3cf99..efea23d4bd 100644
--- a/editor/translations/fr.po
+++ b/editor/translations/fr.po
@@ -1,6 +1,6 @@
# French translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# Antoine Carrier <ac.g392@gmail.com>, 2017-2018.
# ARocherVj <a.rocher.vj@gmail.com>, 2017.
@@ -42,14 +42,22 @@
# Xananax <xananax@yelostudio.com>, 2017-2018.
# Perrier Mathis <mathis.perrier73@gmail.com>, 2018.
# Ewan Lehnebach <ewan.lehnebach@gmail.com>, 2018.
-# Hugo Locurcio <hugo.locurcio@hugo.pro>, 2018.
+# Hugo Locurcio <hugo.locurcio@hugo.pro>, 2018, 2019.
# Grigore Antoniuc <grisa181@gmail.com>, 2018.
+# x2f <x.defoy@gmail.com>, 2018.
+# LittleWhite <lw.demoscene@googlemail.com>, 2018.
+# Brice Lobet <tempo.data@gmail.com>, 2018.
+# Florent Wijanto <f_wijanto@hotmail.com>, 2018.
+# Olivier gareau <olivier.gareau@protonmail.com>, 2018.
+# Rémi Verschelde <akien@godotengine.org>, 2018, 2019.
+# Rémi Bintein <reminus5@hotmail.fr>, 2018.
+# Sylvain Corsini <sylvain.corsini@gmail.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2018-08-05 00:41+0000\n"
-"Last-Translator: Grigore Antoniuc <grisa181@gmail.com>\n"
+"PO-Revision-Date: 2019-01-13 15:07+0000\n"
+"Last-Translator: Hugo Locurcio <hugo.locurcio@hugo.pro>\n"
"Language-Team: French <https://hosted.weblate.org/projects/godot-engine/"
"godot/fr/>\n"
"Language: fr\n"
@@ -57,7 +65,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 3.1.1\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -66,140 +74,127 @@ msgstr ""
"Argument de type incorrect dans convert(), utilisez les constantes TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr "Pas assez d'octets pour les octets de décodage, ou format non valide."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Entrée non valide %i (non passée) dans l’expression"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "self ne peut être utilisé car l'instance est null (non fournie)"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "Nom de propriété invalide '%s' dans le nœud %s."
+msgstr "Opérandes invalides pour les opérateurs %s, %s et %s."
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid index of type %s for base type %s"
-msgstr "Nom de propriété invalide '%s' dans le nœud %s."
+msgstr "Index de type %s invalide pour le type de base %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "Index nommé %s invalide pour le type de base %s"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid arguments to construct '%s'"
-msgstr ": Argument invalide de type: "
+msgstr "Arguments invalides pour construire '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "Sur appel à '%s' :"
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
-msgstr "Libérer"
+msgstr "Libre"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "Équilibré"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Mirror"
-msgstr "Miroir X"
+msgstr "Miroir"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "Insérer une clé"
+msgstr "Insérer la clé ici"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "Dupliquer la sélection"
+msgstr "Dupliquer les clé(s) sélectionnée(s)"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "Supprimer la selection"
+msgstr "Supprimer les clé(s) sélectionnée(s)"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
-msgstr "Animation Dupliquer les clés"
+msgstr "Dupliquer les clés d'animation"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Delete Keys"
-msgstr "Anim Supprimer Clés"
+msgstr "Supprimer les clés d'animation"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Time"
-msgstr "Animation Changer l'heure de l'image clé"
+msgstr "Modifier le temps d'image-clé"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transition"
-msgstr "Animation Changer la transition"
+msgstr "Modifier la transition"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transform"
-msgstr "Animation Changer la transformation"
+msgstr "Anim: Change Transformation"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Value"
-msgstr "Animation Changer la valeur de l'image clé"
+msgstr "Anim: Change Valeur de l'Image Clé"
#: editor/animation_track_editor.cpp
msgid "Anim Change Call"
-msgstr "Animation Changer l'appel"
+msgstr "Anim: Change l'Appel"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Property Track"
-msgstr "Propriété :"
+msgstr "Piste de propriété"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "3D Transform Track"
-msgstr "Type de transformation"
+msgstr "Piste de transformation 3D"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "Piste d'appel de méthode"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "Piste de la courbe de Bézier"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "Piste de lecture audio"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Playback Track"
-msgstr "Arrêter la lecture de l'animation. (S)"
+msgstr "Piste de lecture d'animation"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
-msgstr "Animation Ajouter une piste"
+msgstr "Ajouter une piste"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Length Time (seconds)"
-msgstr "Longueur de l'animation (en secondes)."
+msgstr "Durée de l'animation (en secondes)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "Zoom de l'animation."
+msgstr "Bouclage de l'animation"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -207,42 +202,36 @@ msgid "Functions:"
msgstr "Fonctions :"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Audio Clips:"
-msgstr "Écouteur audio"
+msgstr "Clips audio :"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Clips:"
-msgstr "Séquences"
+msgstr "Clips d'animation :"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Toggle this track on/off."
-msgstr "Basculer en mode sans distraction."
+msgstr "Activer/désactiver cette piste."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "Mode de mise à jour (comment cette propriété est définie)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Interpolation Mode"
-msgstr "Nœud d'animation"
+msgstr "Mode d'interpolation"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "Mode bouclé (fin interpolée avec début en boucle)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "Supprimer la piste sélectionnée."
+msgstr "Supprime cette piste."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "Durée du fondu (s) :"
+msgstr "Temps (s) : "
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -257,13 +246,12 @@ msgid "Trigger"
msgstr "Déclencheur"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Capture"
-msgstr "Fonctionnalités"
+msgstr "Capturer"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "Au plus proche"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
@@ -272,16 +260,15 @@ msgstr "Linéaire"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr ""
+msgstr "Cubique"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clamp Loop Interp"
-msgstr "Changer l'interpolation de la boucle d'animation"
+msgstr "Limiter l'interpolation de la boucle"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "Envelopper l'interp. de la boucle"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -289,14 +276,12 @@ msgid "Insert Key"
msgstr "Insérer une clé"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "Dupliquer le(s) nœud(s)"
+msgstr "Dupliquer clé(s)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "Supprimer nœud(s)"
+msgstr "Supprimer clé(s)"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -314,7 +299,6 @@ msgstr "Créer %d NOUVELLES pistes et insérer des clés ?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -327,22 +311,24 @@ msgstr "Insérer une animation"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
msgstr ""
+"Un AnimationPlayer ne peut s'animer lui-même, seulement les autres lecteurs."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
-msgstr "Animation Créer et insérer"
+msgstr "Créer et insérer une animation"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Track & Key"
-msgstr "Animation Insérer une piste et une clé"
+msgstr "Insérer une piste et clé d'animation"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Key"
-msgstr "Animation Inserer une clé"
+msgstr "Insérer une clé d'animation"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
msgstr ""
+"Les pistes de transformation ne s'appliquent qu'aux nœuds basés sur Spatial."
#: editor/animation_track_editor.cpp
msgid ""
@@ -351,71 +337,80 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"Les pistes audio ne peuvent pointer que sur les nœuds de type :\n"
+"- AudioStreamPlayer\n"
+"- AudioStreamPlayer2D\n"
+"- AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
msgstr ""
+"Les pistes d'animation ne peuvent pointer que sur des nœuds AnimationPlayer."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
msgstr ""
+"Un lecteur d'animation ne peut s'animer lui-même, seulement les autres "
+"lecteurs."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "Impossible d'ajouter une nouvelle piste sans racine"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "Le chemin de la piste est invalide, impossible d'ajouter une clé."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "La piste n'est pas de type Spatial, impossible d'insérer une clé"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
msgstr ""
+"Le chemin de la piste est invalide, impossible d'ajouter une clé d'appel de "
+"méthode."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Method not found in object: "
-msgstr "VariableGet introuvable dans le script: "
+msgstr "Méthode introuvable dans l'objet : "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
-msgstr "Anim Déplacer Clés"
+msgstr "Déplacer les clés d'animation"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clipboard is empty"
-msgstr "Le presse-papiers est vide !"
+msgstr "Le presse-papiers est vide"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
-msgstr "Anim Mettre à l’Échelle les Clés"
+msgstr "Mettre à l'échelle les clés d'animation"
#: editor/animation_track_editor.cpp
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
msgstr ""
+"Cette option ne fonctionne pas pour l'édition de courbes de Bézier car il ne "
+"s'agit que d'une seule piste."
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
msgstr ""
+"Afficher seulement les pistes provenant des nœuds sélectionnés dans "
+"l'arborescence."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr ""
+msgstr "Grouper les pistes par nœuds ou les afficher dans une liste simple."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap (s): "
-msgstr "Aligner (pixels) :"
+msgstr "Pas (s) : "
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "L'arbre d'animations est valide."
+msgstr "Valeur du pas d'animation."
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -427,19 +422,16 @@ msgid "Edit"
msgstr "Édition"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "AnimationTree"
+msgstr "Propriétés de l'animation."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "Copier paramètres"
+msgstr "Copier pistes"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "Coller les paramètres"
+msgstr "Coller pistes"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -447,28 +439,26 @@ msgstr "Mettre à l'échelle la sélection"
#: editor/animation_track_editor.cpp
msgid "Scale From Cursor"
-msgstr "Mettre à l’Échelle Avec Curseur"
+msgstr "Mettre à l’échelle depuis le curseur"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Dupliquer la sélection"
#: editor/animation_track_editor.cpp
msgid "Duplicate Transposed"
-msgstr "Dupliquer Transposé"
+msgstr "Dupliquer transposé"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
-msgstr "Supprimer la selection"
+msgstr "Supprimer la sélection"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+msgid "Go to Next Step"
msgstr "Aller à l'étape suivante"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+msgid "Go to Previous Step"
msgstr "Aller à l'étape précédente"
#: editor/animation_track_editor.cpp
@@ -481,15 +471,15 @@ msgstr "Nettoyer l'animation"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "Choisir le nœud à animer :"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "Utiliser les courbes de Bézier"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
-msgstr "Optimiseur d'animation"
+msgstr "Optimiser l'animation"
#: editor/animation_track_editor.cpp
msgid "Max. Linear Error:"
@@ -513,7 +503,7 @@ msgstr "Supprimer les clés invalides"
#: editor/animation_track_editor.cpp
msgid "Remove unresolved and empty tracks"
-msgstr "Supprimer les pistes vides et non résulues"
+msgstr "Supprimer les pistes vides et non résolues"
#: editor/animation_track_editor.cpp
msgid "Clean-up all animations"
@@ -533,7 +523,7 @@ msgstr "Ratio d'échelle :"
#: editor/animation_track_editor.cpp
msgid "Select tracks to copy:"
-msgstr ""
+msgstr "Sélectionner les pistes à copier :"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -549,11 +539,11 @@ msgstr "Redimensionner le tableau"
#: editor/array_property_edit.cpp
msgid "Change Array Value Type"
-msgstr "Modifier type de valeur du tableau"
+msgstr "Modifier le type de valeurs du tableau"
#: editor/array_property_edit.cpp
msgid "Change Array Value"
-msgstr "Modifier valeur du tableau"
+msgstr "Modifier la valeur du tableau"
#: editor/code_editor.cpp
msgid "Go to Line"
@@ -571,11 +561,11 @@ msgstr "Pas de correspondances"
msgid "Replaced %d occurrence(s)."
msgstr "%d occurrence(s) remplacée(s)."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Sensible à la casse"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "Mots entiers"
@@ -591,29 +581,31 @@ msgstr "Remplacer tout"
msgid "Selection Only"
msgstr "Sélection uniquement"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Zoomer"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "Dézoomer"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "Réinitialiser le zoom"
#: editor/code_editor.cpp
-#, fuzzy
msgid "Warnings:"
-msgstr "Avertissements"
+msgstr "Avertissements :"
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "Zoom (%) :"
+msgid "Font Size:"
+msgstr "Taille de police :"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Ligne :"
@@ -630,7 +622,7 @@ msgid ""
"Target method not found! Specify a valid method or attach a script to target "
"Node."
msgstr ""
-"La méthode cible n'a pas été trouvée! Spécifiez une méthode valide ou "
+"La méthode cible n'a pas été trouvée ! Spécifiez une méthode valide ou "
"attachez un script au nœud cible."
#: editor/connections_dialog.cpp
@@ -646,6 +638,7 @@ msgstr "Ajouter"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -653,7 +646,7 @@ msgstr "Supprimer"
#: editor/connections_dialog.cpp
msgid "Add Extra Call Argument:"
-msgstr "Ajouter des arguments supplémentaires :"
+msgstr "Ajouter un argument supplémentaire :"
#: editor/connections_dialog.cpp
msgid "Extra Call Arguments:"
@@ -702,9 +695,8 @@ msgid "Disconnect '%s' from '%s'"
msgstr "Déconnecter « %s » de « %s »"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect all from signal: '%s'"
-msgstr "Déconnecter « %s » de « %s »"
+msgstr "Tout déconnecter au signal : '%s'"
#: editor/connections_dialog.cpp
msgid "Connect..."
@@ -716,19 +708,16 @@ msgid "Disconnect"
msgstr "Déconnecter"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect Signal: "
-msgstr "Connecter un signal :"
+msgstr "Signal de connexion : "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection: "
-msgstr "Modifier les connexions"
+msgstr "Modifier les connexions : "
#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "Are you sure you want to remove all connections from the \""
-msgstr "Voulez-vous vraiment lancer plus d'un projet à la fois ?"
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr "Voulez-vous vraiment supprimer toutes les connexions de ce signal ?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -736,22 +725,19 @@ msgstr "Signaux"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr ""
+msgstr "Voulez-vous vraiment supprimer toutes les connexions de ce signal ?"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "Déconnecter"
+msgstr "Tout déconnecter"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit..."
-msgstr "Édition"
+msgstr "Édition..."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "Méthodes :"
+msgstr "Aller à la méthode"
#: editor/create_dialog.cpp
msgid "Change %s Type"
@@ -776,23 +762,20 @@ msgid "Recent:"
msgstr "Récents :"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Rechercher :"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "Correspondances :"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "Description :"
@@ -831,8 +814,7 @@ msgid "Resource"
msgstr "Ressource"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "Chemin"
@@ -853,9 +835,10 @@ msgid "Search Replacement Resource:"
msgstr "Recherche ressource de remplacement :"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -889,7 +872,7 @@ msgid "Error loading:"
msgstr "Erreur au chargement :"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+msgid "Load failed due to missing dependencies:"
msgstr "La scène n'a pas pu être chargée à cause de dépendances manquantes :"
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -948,14 +931,6 @@ msgstr "Modifier valeur du dictionnaire"
msgid "Thanks from the Godot community!"
msgstr "La communauté Godot vous dit merci !"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "OK"
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Contributeurs de Godot Engine"
@@ -1046,10 +1021,10 @@ msgstr "Erreur d'ouverture de paquetage, pas au format zip."
#: editor/editor_asset_installer.cpp
msgid "Uncompressing Assets"
-msgstr "Ressource non compressé"
+msgstr "Décompression des assets"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+msgid "Package installed successfully!"
msgstr "Paquetage installé avec succès !"
#: editor/editor_asset_installer.cpp
@@ -1131,8 +1106,7 @@ msgid "Bus options"
msgstr "Options de tranport"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "Dupliquer"
@@ -1297,7 +1271,7 @@ msgid "Add AutoLoad"
msgstr "Ajouter l'AutoLoad"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "Chemin :"
@@ -1305,8 +1279,8 @@ msgstr "Chemin :"
msgid "Node Name:"
msgstr "Nom de nœud :"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "Nom"
@@ -1332,7 +1306,7 @@ msgstr "[vide]"
#: editor/editor_data.cpp
msgid "[unsaved]"
-msgstr "(Non sauvegardé)"
+msgstr "[non enregistré]"
#: editor/editor_dir_dialog.cpp
msgid "Please select a base directory first"
@@ -1376,25 +1350,28 @@ msgid "Template file not found:"
msgstr "Fichier modèle introuvable :"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Sélectionner le dossier courant"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "Le fichier existe, l'écraser ?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "Sélectionner le dossier courant"
+msgid "Select This Folder"
+msgstr "Sélectionner ce dossier"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
msgstr "Copier le chemin"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Open In File Manager"
-msgstr "Montrer dans le gestionnaire de fichiers"
+msgid "Open in File Manager"
+msgstr "Ouvrir dans le gestionnaire de fichiers"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+msgid "Show in File Manager"
msgstr "Montrer dans le gestionnaire de fichiers"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1430,7 +1407,8 @@ msgid "Open a File or Directory"
msgstr "Ouvrir un fichier ou un répertoire"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Enregistrer"
@@ -1488,8 +1466,7 @@ msgstr "Répertoires et fichiers :"
msgid "Preview:"
msgstr "Aperçu :"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "Fichier :"
@@ -1505,24 +1482,11 @@ msgstr "Scanner les sources"
msgid "(Re)Importing Assets"
msgstr "Ré-importation des assets"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "Chercher dans l'aide"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "Liste des classes :"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "Chercher dans les classes"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "Dessus"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "Classe :"
@@ -1539,28 +1503,28 @@ msgid "Brief Description:"
msgstr "Brève description :"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "Membres"
+msgid "Properties"
+msgstr "Propriétés"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "Membres :"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr "Propriétés :"
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "Méthodes Publiques"
+msgid "Methods"
+msgstr "Méthodes"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "Méthodes publiques :"
+msgid "Methods:"
+msgstr "Méthodes :"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "Items de thème GUI"
+msgid "Theme Properties"
+msgstr "Propriétés du thème"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "Items de thème GUI :"
+msgid "Theme Properties:"
+msgstr "Propriétés du thème :"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1587,8 +1551,12 @@ msgid "Constants:"
msgstr "Constantes :"
#: editor/editor_help.cpp
-msgid "Description"
-msgstr "Description"
+msgid "Class Description"
+msgstr "Description de la classe"
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
+msgstr "Description de la classe :"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1605,11 +1573,11 @@ msgstr ""
"demander un[/url][/color]."
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "Propriétés"
+msgid "Property Descriptions"
+msgstr "Description des propriétés"
#: editor/editor_help.cpp
-msgid "Property Description:"
+msgid "Property Descriptions:"
msgstr "Description des propriétés :"
#: editor/editor_help.cpp
@@ -1621,12 +1589,12 @@ msgstr ""
"[color=$color][url=$url]en créant[/url][/color] une !"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "Méthodes :"
+msgid "Method Descriptions"
+msgstr "Descriptions des méthodes"
#: editor/editor_help.cpp
-msgid "Method Description:"
-msgstr "Description de la méthode :"
+msgid "Method Descriptions:"
+msgstr "Descriptions des méthode :"
#: editor/editor_help.cpp
msgid ""
@@ -1636,18 +1604,58 @@ msgstr ""
"Il n'y a pas de description disponible pour cette méthode. Aidez-nous en "
"[color=$color][url=$url]en créant[/url][/color] une !"
-#: editor/editor_inspector.cpp
-#, fuzzy
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Chercher dans l'aide"
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr "Tout afficher"
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr "Classes seulement"
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr "Méthodes seulement"
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr "Signaux seulement"
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr "Constantes seulement"
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr "Propriétés seulement"
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr "Propriétés du thème seulement"
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr "Type de membre"
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr "Classe"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
msgstr "Propriété :"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr "Définir"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "Définir plusieurs :"
#: editor/editor_log.cpp
msgid "Output:"
@@ -1675,6 +1683,11 @@ msgstr "L'export du projet a échoué avec le code erreur %d."
msgid "Error saving resource!"
msgstr "Erreur d'enregistrement de la ressource !"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "OK"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "Enregistrer la ressource sous…"
@@ -1693,7 +1706,7 @@ msgstr "Erreur lors de l'enregistrement."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
-msgstr ""
+msgstr "Impossible d'ouvrir '%s'. Le fichier a pu être déplacé ou supprimé."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
@@ -1729,12 +1742,25 @@ msgstr "Cette opération ne peut être réalisée sans une arborescence racine."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+"Cette scène ne peut pas être enregistrée du fait d'une dépendance circulaire "
+"à l'instanciation.\n"
+"L'enregistrement ne sera possible qu'une fois ce problème résolu."
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
"Impossible d'enregistrer la scène. Les dépendances (instances ou héritage) "
"n'ont sans doute pas pu être satisfaites."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr "Impossible de ré-écrire une scène tant que celle-ci est ouverte !"
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr "Impossible de charger la MeshLibrary pour fusion !"
@@ -2003,6 +2029,14 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"Impossible de charger le script de l’extension depuis le chemin : '%s' Il "
+"semble y avoir une erreur dans le code, merci de vérifier la syntaxe."
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
"Impossible de charger le script de l'addon depuis le chemin : '%s' Le type "
@@ -2053,15 +2087,18 @@ msgstr "Supprimer la disposition"
msgid "Default"
msgstr "Par défaut"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr "Montrer dans le système de fichiers"
+
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play This Scene"
-msgstr "Lancer la scène"
+msgstr "Jouer Cette Scène"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "Fermer les autres onglets"
+msgstr "Fermer l'onglet"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2136,7 +2173,7 @@ msgid "Save Scene"
msgstr "Enregistrer la scène"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+msgid "Save All Scenes"
msgstr "Enregistrer toutes les scènes"
#: editor/editor_node.cpp
@@ -2165,7 +2202,7 @@ msgid "Undo"
msgstr "Annuler"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Refaire"
@@ -2189,20 +2226,20 @@ msgstr "Paramètres du projet"
msgid "Export"
msgstr "Exporter"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "Outils"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "Ouvrir gestionnaire de projets ?"
+msgstr "Ouvrir le dossier de données du projets"
#: editor/editor_node.cpp
msgid "Quit to Project List"
msgstr "Quitter vers la liste des projets"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "Débogage"
@@ -2312,18 +2349,16 @@ msgid "Toggle Fullscreen"
msgstr "Activer/Désactiver le plein écran"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Data/Settings Folder"
-msgstr "Paramètres de l'éditeur"
+msgstr "Ouvrir le dossier de données/paramètres de l'éditeur"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "Ouvrir le dossier de données de l'éditeur"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Settings Folder"
-msgstr "Paramètres de l'éditeur"
+msgstr "Ouvrir le dossier des paramètres de l'éditeur"
#: editor/editor_node.cpp editor/project_export.cpp
msgid "Manage Export Templates"
@@ -2333,10 +2368,6 @@ msgstr "Gérer les modèles d'exportation"
msgid "Help"
msgstr "Aide"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "Classes"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2407,13 +2438,12 @@ msgstr "Jouer une scène personnalisée"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr ""
+msgstr "Changer le pilote vidéo nécessite le redémarrage de l'éditeur."
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Save & Restart"
-msgstr "Enregistrer et ré-importer"
+msgstr "Enregistrer et Redémarrer"
#: editor/editor_node.cpp
msgid "Spins when the editor window repaints!"
@@ -2431,27 +2461,26 @@ msgstr "Repeindre quand modifié"
msgid "Disable Update Spinner"
msgstr "Désactiver l'indicateur d'activité"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "Inspecteur"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "Importer"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "Nœud"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "Système de fichiers"
#: editor/editor_node.cpp
-#, fuzzy
+msgid "Inspector"
+msgstr "Inspecteur"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Nœud"
+
+#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
-msgstr "Développer tout"
+msgstr "Développez le panneau inférieur"
#: editor/editor_node.cpp scene/resources/visual_shader.cpp
msgid "Output"
@@ -2530,9 +2559,8 @@ msgid "Thumbnail..."
msgstr "Aperçu…"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit Plugin"
-msgstr "Modifier le polygone"
+msgstr "Modifier le Plugin"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
@@ -2556,15 +2584,13 @@ msgid "Status:"
msgstr "État :"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit:"
-msgstr "Édition"
+msgstr "Éditer :"
#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Start"
-msgstr "Démarrer !"
+msgstr "Démarrer"
#: editor/editor_profiler.cpp
msgid "Measure:"
@@ -2572,7 +2598,7 @@ msgstr "Mesure :"
#: editor/editor_profiler.cpp
msgid "Frame Time (sec)"
-msgstr "Temps image (en seconde)"
+msgstr "Temps par trame (seconde)"
#: editor/editor_profiler.cpp
msgid "Average Time (sec)"
@@ -2580,13 +2606,13 @@ msgstr "Temps moyen (seconde)"
#: editor/editor_profiler.cpp
msgid "Frame %"
-msgstr "% d'image"
+msgstr "Trame %"
#: editor/editor_profiler.cpp
msgid "Physics Frame %"
-msgstr "Frame physique %"
+msgstr "Trame physique %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "Temps :"
@@ -2600,7 +2626,7 @@ msgstr "Self"
#: editor/editor_profiler.cpp
msgid "Frame #:"
-msgstr "Frame # :"
+msgstr "Trame # :"
#: editor/editor_profiler.cpp
msgid "Time"
@@ -2610,34 +2636,64 @@ msgstr "Temps"
msgid "Calls"
msgstr "Appels"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr "Activé"
#: editor/editor_properties.cpp
msgid "Layer"
-msgstr ""
+msgstr "Calque"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Bit %d, value %d"
-msgstr "Bit %d, valeur %d."
+msgstr "Bit %d, valeur %d"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr "[Vide]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
-msgid "Assign.."
-msgstr "Assigner"
+msgid "Assign..."
+msgstr "Assigner..."
+
+#: editor/editor_properties.cpp
+msgid "Invalid RID"
+msgstr "RID invalide"
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+"La ressource sélectionnée (%s) ne correspond à aucun des types attendus pour "
+"cette propriété (%s)."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+"Impossible de créer un ViewportTexture sur des ressources enregistrées comme "
+"fichier.\n"
+"La ressource a besoin d'appartenir à une scène."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+"Impossible de créer un ViewportTexture sur cette ressource car elle n'est "
+"pas définie comme locale à la scène.\n"
+"Merci de changer la propriété \"Local To Scene\" de cette ressource (et des "
+"ressources intermédiaires la contenant, jusqu'au nœud qui l'utilise)."
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr "Choisissez un Viewport"
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr "Nouveau script"
@@ -2649,10 +2705,6 @@ msgstr "Nouveau %s"
msgid "Make Unique"
msgstr "Rendre unique"
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr "Montrer dans le système de fichiers"
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2661,7 +2713,8 @@ msgstr "Montrer dans le système de fichiers"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "Coller"
@@ -2674,36 +2727,32 @@ msgstr "Convertir en %s"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Open Editor"
-msgstr "Ouvrir dans l'éditeur"
+msgstr "Ouvrir l'éditeur"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Selected node is not a Viewport!"
-msgstr "Le nœud sélectionné n'est pas un Viewport !"
+msgstr "Le nœud sélectionné n'est pas un Viewport !"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "Size: "
-msgstr "Taille des cellules :"
+msgstr "Taille : "
#: editor/editor_properties_array_dict.cpp
msgid "Page: "
-msgstr ""
+msgstr "Page : "
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Key:"
-msgstr "Nouveau nom :"
+msgstr "Nouvelle Clé :"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Value:"
-msgstr "Nouveau nom :"
+msgstr "Nouvelle Valeur :"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
-msgstr ""
+msgstr "Ajouter une paire clé/valeur"
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -2796,9 +2845,8 @@ msgid "Can't open export templates zip."
msgstr "Impossible d'ouvrir le ZIP de modèles d'exportation."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Invalid version.txt format inside templates: %s."
-msgstr "Format de version.txt invalide dans les modèles."
+msgstr "Format de version.txt invalide dans les modèles : %s."
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
@@ -2863,6 +2911,8 @@ msgid ""
"Templates installation failed. The problematic templates archives can be "
"found at '%s'."
msgstr ""
+"L'installation des modèles à échoué. Les archives des modèles posant "
+"problème peuvent être trouvées ici : '%s'."
#: editor/export_template_manager.cpp
msgid "Error requesting url: "
@@ -2924,7 +2974,7 @@ msgstr "Versions installées :"
#: editor/export_template_manager.cpp
msgid "Install From File"
-msgstr "Installer depuis fichier :"
+msgstr "Installer depuis fichier"
#: editor/export_template_manager.cpp
msgid "Remove Template"
@@ -2943,9 +2993,10 @@ msgid "Download Templates"
msgstr "Télécharger les modèles"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr "Sélectionner un miroir depuis la liste : "
+msgstr ""
+"Sélectionner un miroir depuis la liste : (Maj+Click : Ouvrir dans le "
+"navigateur)"
#: editor/file_type_cache.cpp
msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
@@ -2954,20 +3005,22 @@ msgstr ""
"sera pas sauvé !"
#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr "Favoris"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
"Impossible d'accédez à '%s' car celui-ci n'existe pas dans le système de "
"fichiers !"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a grid of thumbnails."
-msgstr "Afficher les éléments sous forme de grille de vignettes"
+msgstr "Afficher les éléments sous forme de grille de vignettes."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a list."
-msgstr "Afficher les éléments sous forme de liste"
+msgstr "Afficher les éléments sous forme de liste."
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
@@ -2995,19 +3048,15 @@ msgstr "Erreur à la duplication :"
msgid "Unable to update dependencies:"
msgstr "Impossible de mettre à jour les dépendences :"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "Aucun nom renseigné"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "Aucun nom renseigné."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "Le nom renseigné contient des caractères invalides"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "Aucun nom renseigné."
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "Le nom contient des caractères invalides."
@@ -3032,22 +3081,6 @@ msgid "Duplicating folder:"
msgstr "Duplication du dossier :"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "Développer tout"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "Réduire tout"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "Renommer..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "Déplacer vers…"
-
-#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
msgstr "Ouvrir une(des) scène(s)"
@@ -3056,6 +3089,14 @@ msgid "Instance"
msgstr "Instance"
#: editor/filesystem_dock.cpp
+msgid "Add to favorites"
+msgstr "Ajouter aux favoris"
+
+#: editor/filesystem_dock.cpp
+msgid "Remove from favorites"
+msgstr "Supprimer des favoris"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "Modifier les dépendances…"
@@ -3063,19 +3104,33 @@ msgstr "Modifier les dépendances…"
msgid "View Owners..."
msgstr "Voir les propriétaires…"
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "Renommer..."
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "Dupliquer…"
#: editor/filesystem_dock.cpp
-#, fuzzy
+msgid "Move To..."
+msgstr "Déplacer vers…"
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
-msgstr "Nouveau script"
+msgstr "Nouveau Script..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "Enregistrer la ressource sous…"
+msgstr "Nouvelle Ressource…"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr "Développer tout"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr "Réduire tout"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3097,14 +3152,12 @@ msgid "Re-Scan Filesystem"
msgstr "Analyser à nouveau le système de fichiers"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "Basculer l'état favori du dossier"
+msgid "Toggle split mode"
+msgstr "Activer/désactiver le mode scindé"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Show current scene file."
-msgstr "Sélectionner la sous-tuile en cours d'édition."
+msgid "Search files"
+msgstr "Rechercher des fichiers"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
@@ -3113,15 +3166,6 @@ msgstr ""
"sélectionné."
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "Chercher dans les classes"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3129,51 +3173,38 @@ msgstr ""
"Analyse des fichiers en cours,\n"
"Veuillez patienter..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "Déplacer"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "There is already file or folder with the same name in this location."
-msgstr "Un dossier avec le nom spécifié existe déjà dans ce chemin."
+msgstr ""
+"Il existe déjà un fichier ou un dossier ayant le même nom à cet emplacement."
#: editor/filesystem_dock.cpp
msgid "Overwrite"
-msgstr ""
+msgstr "Écraser"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Créer un script"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find in files"
-msgstr "Trouver une tuile"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find: "
-msgstr "Trouver"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Whole words"
-msgstr "Mots entiers"
+msgid "Find in Files"
+msgstr "Trouver dans les fichiers"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "Sensible à la casse"
+msgid "Find:"
+msgstr "Trouver :"
#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "Dossier :"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Filter: "
-msgstr "Filtre:"
+msgid "Filters:"
+msgstr "Filtres :"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3189,52 +3220,48 @@ msgid "Cancel"
msgstr "Annuler"
#: editor/find_in_files.cpp
-#, fuzzy
+msgid "Find: "
+msgstr "Trouver : "
+
+#: editor/find_in_files.cpp
msgid "Replace: "
-msgstr "Remplacer"
+msgstr "Remplacer : "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace all (no undo)"
-msgstr "Remplacer tout"
+msgstr "Remplacer tout (pas de retour en arrière)"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Searching..."
-msgstr "Enregistrement…"
+msgstr "Recherche…"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Search complete"
-msgstr "Chercher du texte"
+msgstr "Recherche terminée"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group name already exists."
-msgstr "ERREUR : Le nom de l'animation existe déjà !"
+msgstr "Le nom du groupe existe déjà."
#: editor/groups_editor.cpp
-#, fuzzy
-msgid "invalid Group name."
-msgstr "Nom invalide."
+msgid "Invalid group name."
+msgstr "Nom de groupe invalide."
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Groupes"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes not in Group"
-msgstr "Groupes de nœuds"
+msgstr "Nœuds non groupés"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
msgid "Filter nodes"
-msgstr "Filtrer les noeuds"
+msgstr "Filtrer les nœuds"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes in Group"
-msgstr "Groupes de nœuds"
+msgstr "Nœuds groupés"
#: editor/groups_editor.cpp
msgid "Add to Group"
@@ -3245,9 +3272,8 @@ msgid "Remove from Group"
msgstr "Supprimer du groupe"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Manage Groups"
-msgstr "Groupes d'images"
+msgstr "Gérer les groupes"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Single Scene"
@@ -3300,7 +3326,7 @@ msgstr "Importation de la scène…"
#: editor/import/resource_importer_scene.cpp
msgid "Generating Lightmaps"
-msgstr "Génération des lightmaps :"
+msgstr "Génération des lightmaps"
#: editor/import/resource_importer_scene.cpp
msgid "Generating for Mesh: "
@@ -3355,17 +3381,12 @@ msgstr "Ré-importer"
msgid "Failed to load resource."
msgstr "Impossible de charger la ressource."
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "OK"
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr "Développer toutes les propriétés"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+msgid "Collapse All Properties"
msgstr "Réduire toutes les propriétés"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3382,9 +3403,8 @@ msgid "Paste Params"
msgstr "Coller les paramètres"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Edit Resource Clipboard"
-msgstr "Le presse-papiers des ressources est vide !"
+msgstr "Modifier le Presse-papiers de la ressource"
#: editor/inspector_dock.cpp
msgid "Copy Resource"
@@ -3411,6 +3431,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "Charger une ressource existante depuis la disque et la modifier."
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "Enregistrer la ressource en cours d'édition."
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "Aller à l'objet modifié précédent dans l'historique."
@@ -3427,9 +3451,8 @@ msgid "Object properties."
msgstr "Propriétés de l'objet."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Filter properties"
-msgstr "Filtrer les noeuds"
+msgstr "Filtrer les propriétés"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
@@ -3444,82 +3467,74 @@ msgid "Select a Node to edit Signals and Groups."
msgstr "Sélectionnez un nœud pour editer des signaux et des groupes."
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Edit a Plugin"
-msgstr "Modifier le polygone"
+msgstr "Modifier un plugin"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Create a Plugin"
-msgstr "Créer la solution C#"
+msgstr "Créer un Plugin"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Plugin Name:"
-msgstr "Liste d'extensions :"
+msgstr "Nom du plugin :"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
-msgstr ""
+msgstr "Sous-dossier :"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Language:"
-msgstr "Langage"
+msgstr "Langage :"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Script Name:"
-msgstr "Script valide"
+msgstr "Nom du script :"
#: editor/plugin_config_dialog.cpp
msgid "Activate now?"
-msgstr ""
+msgstr "Activer maintenant ?"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
msgstr "Créer un polygone"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+msgid "Edit Polygon"
msgstr "Modifier le polygone"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
-msgstr "Point d'insertion"
+msgstr "Insérer un point"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr "Modifier le polygone (supprimer un point)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
-msgstr "Retirer Polygone et Point"
+msgid "Remove Polygon And Point"
+msgstr "Supprimer le polygone et le point"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "Créer un nouveau polygone à partir de rien"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr "Créer des points."
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
-"Editer polygones existants :\n"
-"Bouton gauche : Déplacer point\n"
-"Ctrl+Bouton gauche : Diviser section.\n"
-"Bouton droit: Effeacer point."
+"Éditer les points.\n"
+"Bouton gauche : Déplacer le point\n"
+"Bouton droit : Effacer le point"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
-msgstr "Supprimer les points"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr "Effacer des points."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3533,15 +3548,16 @@ msgstr "Ajouter une animation"
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Load.."
-msgstr "Charger"
+msgid "Load..."
+msgstr "Charger..."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "This type of node can't be used. Only root nodes are allowed."
msgstr ""
+"Ce type de nœud ne peut pas être utilisé. Seuls les nœuds racine sont "
+"autorisés."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3551,73 +3567,67 @@ msgid ""
"AnimationTree is inactive.\n"
"Activate to enable playback, check node warnings if activation fails."
msgstr ""
+"AnimationTree est inactif.\n"
+"Activez le pour permettre la lecture, vérifier les avertissements des nœuds "
+"en cas d'échec de l'activation."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Set the blending position within the space"
-msgstr ""
+msgstr "Définir la position de mélange dans l'espace"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Select and move points, create points with RMB."
msgstr ""
+"Sélectionner et déplacer les points, créer des points avec un clic droit."
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Supprimer les points"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "Bouton droit : effacer un point."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr "Activer l'aimantation et afficher la grille."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Point"
-msgstr "Déplacer le point"
+msgstr "Point"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Open Animation Node"
-msgstr "Nœud d'animation"
+msgstr "Ouvrir le Nœud Animation"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists"
-msgstr "L'action « %s » existe déjà !"
+msgstr "Le triangle existe déjà"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "BlendSpace2D does not belong to an AnimationTree node."
-msgstr ""
+msgstr "BlendSpace2D n'appartient pas à un nœud AnimationTree."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "No triangles exist, so no blending can take place."
-msgstr ""
+msgstr "Il n'existe pas de triangles, donc aucun mélange ne peut avoir lieu."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create triangles by connecting points."
-msgstr ""
+msgstr "Créer des triangles en reliant les points."
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Erase points and triangles."
-msgstr "Analyse de %d triangles :"
+msgstr "Effacer les points et les triangles."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
+"Générer des triangles de mélange automatiquement (au lieu de manuellement)"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr "Aligner"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Mélange :"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3626,20 +3636,26 @@ msgstr "Editer les filtres"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Output node can't be added to the blend tree."
-msgstr ""
+msgstr "Un nœud de sortie ne peut être ajouté à l'arborescence du mélange."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Unable to connect, port may be in use or connection may be invalid."
msgstr ""
+"Impossible de se connecter, le port peut être en cours d'utilisation ou la "
+"connexion peut être invalide."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
msgstr ""
+"Aucun lecteur d'animation défini, dès lors impossible de retrouver les noms "
+"des pistes."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Player path set is invalid, so unable to retrieve track names."
msgstr ""
+"Le chemin défini pour le lecteur est invalide, dès lors impossible de "
+"récupérer les noms des pistes."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
@@ -3647,23 +3663,22 @@ msgid ""
"Animation player has no valid root node path, so unable to retrieve track "
"names."
msgstr ""
+"Le lecteur d'animation n'a pas un chemin de nœud racine valide, dès lors "
+"impossible de récupérer les noms des pistes."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Add Node.."
-msgstr "Ajouter un nœud"
+msgid "Add Node..."
+msgstr "Ajouter un nœud..."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filtered Tracks:"
-msgstr "Editer les filtres"
+msgstr "Éditer Pistes Filtrées :"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Enable filtering"
-msgstr "Enfants modifiables"
+msgstr "Activer le filtrage"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
@@ -3691,14 +3706,12 @@ msgid "Remove Animation"
msgstr "Supprimer l'animation"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Invalid animation name!"
-msgstr "ERREUR : Nom de l'animation invalide !"
+msgstr "Nom d'animation invalide !"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Animation name already exists!"
-msgstr "ERREUR : Le nom de l'animation existe déjà !"
+msgstr "Ce nom d'animation existe déjà !"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -3722,14 +3735,12 @@ msgid "Duplicate Animation"
msgstr "Dupliquer l'animation"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to copy!"
-msgstr "ERREUR : Aucune animation à copier !"
+msgstr "Aucune animation à copier !"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation resource on clipboard!"
-msgstr "ERREUR : Pas de ressource de type animation dans le presse-papiers !"
+msgstr "Aucune ressource d'animation dans le presse-papiers !"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
@@ -3740,9 +3751,8 @@ msgid "Paste Animation"
msgstr "Coller l'animation"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to edit!"
-msgstr "ERREUR : Pas d'animation à modifier !"
+msgstr "Pas d'animation à modifier !"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
@@ -3751,7 +3761,7 @@ msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from end. (Shift+A)"
-msgstr "Lire l'animation sélectionnée à rebours depuis la fin. (Maj + A)"
+msgstr "Lire l'animation sélectionnée à rebours depuis la fin. (Maj+A)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Stop animation playback. (S)"
@@ -3759,7 +3769,7 @@ msgstr "Arrêter la lecture de l'animation. (S)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation from start. (Shift+D)"
-msgstr "Lire l'animation sélectionnée depuis le début. (Maj + D)"
+msgstr "Lire l'animation sélectionnée depuis le début. (Maj+D)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation from current pos. (D)"
@@ -3787,14 +3797,12 @@ msgid "New"
msgstr "Nouveau"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Transitions..."
-msgstr "Modifier les connexions..."
+msgstr "Modification Transitions..."
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Open in Inspector"
-msgstr "Ouvrir dans l'éditeur"
+msgstr "Ouvrir dans l'Inspecteur"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Display list of animations in player."
@@ -3853,9 +3861,8 @@ msgid "Include Gizmos (3D)"
msgstr "Inclure les Gizmos (3D)"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Pin AnimationPlayer"
-msgstr "Coller l'animation"
+msgstr "Épingler AnimationPlayer"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Create New Animation"
@@ -3886,34 +3893,33 @@ msgid "Cross-Animation Blend Times"
msgstr "Temps de mélange des entre animations"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "End"
-msgstr "Fin(s)"
+msgstr "Fin"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Immediate"
-msgstr ""
+msgstr "Immédiat"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Sync"
-msgstr ""
+msgstr "Synchroniser"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "At End"
-msgstr ""
+msgstr "À la fin"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Travel"
-msgstr ""
+msgstr "Se déplacer"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Start and end nodes are needed for a sub-transition."
msgstr ""
+"Les nœuds de départ et de fin sont nécessaire pour une sous-transition."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "No playback resource set at path: %s."
-msgstr "Pas dans le chemin de la ressource."
+msgstr "Aucune ressource de lecture définie sur le chemin : %s."
#: editor/plugins/animation_state_machine_editor.cpp
msgid ""
@@ -3921,34 +3927,35 @@ msgid ""
"RMB to add new nodes.\n"
"Shift+LMB to create connections."
msgstr ""
+"Sélectionnez et déplacez les nœuds.\n"
+"Bouton droit pour ajouter de nouveaux nœuds.\n"
+"Maj+Bouton gauche pour créer des connexions."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "Créer un nouveau %s"
+msgstr "Créer de nouveaux nœuds."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Connect nodes."
-msgstr "Connecter nœud"
+msgstr "Connecter des nœuds."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Remove selected node or transition"
-msgstr "Supprimer la piste sélectionnée."
+msgid "Remove selected node or transition."
+msgstr "Supprimer le nœud sélectionné ou la transition."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
msgstr ""
+"Activer/désactiver cette animation au (re) démarrage ou lors du retour à "
+"zéro."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set the end animation. This is useful for sub-transitions."
-msgstr ""
+msgstr "Définir l'animation de fin. Ceci est utile pour les sous-transitions."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "Transition"
+msgstr "Transition : "
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -4002,10 +4009,6 @@ msgid "Amount:"
msgstr "Quantité :"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "Mélange :"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "Mélange 0 :"
@@ -4146,14 +4149,12 @@ msgid "Asset Download Error:"
msgstr "Erreur dans le téléchargement d'une ressource:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading (%s / %s)..."
-msgstr "Téléchargement en cours"
+msgstr "Téléchargement (%s / %s)..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading..."
-msgstr "Téléchargement en cours"
+msgstr "Téléchargement..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Resolving..."
@@ -4180,14 +4181,12 @@ msgid "Download for this asset is already in progress!"
msgstr "Le téléchargement de cette ressource est déjà en cours!"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "First"
-msgstr "premier"
+msgstr "Premier"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Previous"
-msgstr "Onglet precedent"
+msgstr "Précédent"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Next"
@@ -4195,7 +4194,7 @@ msgstr "Suivant"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Last"
-msgstr ""
+msgstr "Dernier"
#: editor/plugins/asset_library_editor_plugin.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -4207,7 +4206,7 @@ msgstr "Tout"
msgid "Plugins"
msgstr "Extensions"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "Trier :"
@@ -4267,7 +4266,7 @@ msgstr ""
#: editor/plugins/baked_lightmap_editor_plugin.cpp
msgid "Bake Lightmaps"
-msgstr "Précalculer les lightmaps :"
+msgstr "Précalculer les lightmaps"
#: editor/plugins/camera_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
@@ -4312,7 +4311,7 @@ msgstr "Déplacer le guide horizontal"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create new horizontal guide"
-msgstr "créer un nouveau guide horizontal"
+msgstr "Créer un nouveau guide horizontal"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Remove horizontal guide"
@@ -4323,29 +4322,28 @@ msgid "Create new horizontal and vertical guides"
msgstr "Créer de nouveaux guides horizontaux et verticaux"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move pivot"
msgstr "Déplacer le pivot"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Rotate CanvasItem"
-msgstr "Modifier le CanvasItem"
+msgstr "Pivoter l'élément de canevas"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move anchor"
-msgstr "Déplacer l'action"
+msgstr "Déplacer l'ancre"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Resize CanvasItem"
-msgstr "Modifier le CanvasItem"
+msgstr "Redimensionner l'élément de canevas"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr "Mise à l'échelle de CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move CanvasItem"
-msgstr "Modifier le CanvasItem"
+msgstr "Déplacer l'élément de canevas"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -4364,19 +4362,18 @@ msgid "Paste Pose"
msgstr "Coller la pose"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "Dézoomer"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom reset"
-msgstr "Réinitialiser le zoom"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
+"Avertissement : la position et la taille des nœuds enfants d'un conteneur "
+"sont strictement déterminées par leur parent."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Zoomer"
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
+msgstr "Réinitialiser le facteur d'agrandissement"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
@@ -4388,7 +4385,7 @@ msgstr "Glisser : tourner"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Alt+Drag: Move"
-msgstr "Alt + Glisser : déplacer"
+msgstr "Alt+Glisser : déplacer"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
@@ -4398,7 +4395,7 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Alt+RMB: Depth list selection"
-msgstr "Alt + Bouton droit : sélection détaillée par liste"
+msgstr "Alt+Bouton droit : Sélection détaillée par liste"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move Mode"
@@ -4409,13 +4406,17 @@ msgid "Rotate Mode"
msgstr "Mode rotation"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr "Mode de mise à l'échelle"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
"(same as Alt+RMB in select mode)."
msgstr ""
"Afficher une liste de tous les objets à la position cliquée\n"
-"(identique à Alt+Clic droit en mode sélection)."
+"(identique à Alt+Bouton droit en mode sélection)."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Click to change object's rotation pivot."
@@ -4426,18 +4427,16 @@ msgid "Pan Mode"
msgstr "Mode navigation"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle snapping."
-msgstr "Activer/Désactiver le magnétisme de grille"
+msgstr "Activer/Désactiver le magnétisme."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Snap"
msgstr "Aligner sur la grille"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snapping Options"
-msgstr "Options du magnétisme"
+msgstr "Options de magnétisme"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to grid"
@@ -4477,9 +4476,8 @@ msgid "Snap to node sides"
msgstr "Accrocher aux flancs du nœud"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to node center"
-msgstr "Accrocher à l'ancre du nœud"
+msgstr "Accrocher au centre du nœud"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to other nodes"
@@ -4508,6 +4506,10 @@ msgid "Restores the object's children's ability to be selected."
msgstr "Rendre la sélection des enfants de l'objet de nouveau possible."
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr "Configuration du squelette"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "Afficher les os"
@@ -4521,12 +4523,11 @@ msgstr "Effacer la chaîne IK"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make Custom Bone(s) from Node(s)"
-msgstr ""
+msgstr "Créer des os personnalisés à partir d'un ou de plusieurs nœuds"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Custom Bones"
-msgstr "Effacer les os"
+msgstr "Effacer les os personnalisés"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -4559,6 +4560,10 @@ msgid "Show Viewport"
msgstr "Afficher le Viewport"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr "Montrer le groupe et verrouiller les icônes"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr "Centrer sur la sélection"
@@ -4571,9 +4576,8 @@ msgid "Layout"
msgstr "Disposition sur l'écran"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Insert keys."
-msgstr "Insérer des clefs"
+msgstr "Insérer les clefs."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
@@ -4630,17 +4634,24 @@ msgstr ""
"Glisser-déposer + Alt : Modifier le type de nœud"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr "Créer un Poly3D"
+msgid "Create Polygon3D"
+msgstr "Créer un Polygon3D"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Modifier le polygone"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Modifier le polygone (supprimer un point)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
msgstr "Définir la poignée"
#: editor/plugins/cpu_particles_editor_plugin.cpp
-#, fuzzy
msgid "CPUParticles"
-msgstr "Particules"
+msgstr "ParticulesCPU"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
@@ -4733,36 +4744,9 @@ msgid "Item List Editor"
msgstr "Éditeur de listes d'objets"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"Aucune ressource OccluderPolygon2D sur ce nœud. En créer et en attribuer un ?"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr "Créer un polygone occulteur"
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr "Créer un nouveau polygone à partir de rien."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "Modifier un polygone existant :"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "Bouton gauche : déplacer un point."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr "Contrôle + Bouton gauche : séparer le segment."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "Bouton droit : effacer un point."
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr "Le maillage est vide !"
@@ -5000,13 +4984,13 @@ msgid "Populate"
msgstr "Peupler"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr "Créer Polygone de Navigation"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr "Générer AABB"
+msgid "Generating Visibility Rect"
+msgstr "Génération du rectangle de visibilité"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -5035,6 +5019,11 @@ msgstr "Effacer Masque d'Émission"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr "Convertir en ParticulesCPU"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr "Particules"
@@ -5104,13 +5093,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr "Un matériel processeur de type 'ParticlesMaterial' est requis."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr "Générer AABB"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "Convertir en majuscule"
+msgid "Generate AABB"
+msgstr "Générer AABB"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5134,6 +5122,10 @@ msgid "Add Point to Curve"
msgstr "Ajouter un point à la courbe"
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr "Scinder la courbe"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr "Déplacer le point dans la courbe"
@@ -5153,7 +5145,7 @@ msgstr "Sélectionner des points"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Shift+Drag: Select Control Points"
-msgstr "Maj. + Glisser : sélectionner des points de contrôle"
+msgstr "Maj+Glisser : sélectionner des points de contrôle"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
@@ -5161,13 +5153,17 @@ msgid "Click: Add Point"
msgstr "Clic : ajouter un point"
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr "Clic gauche : Diviser le segment (en courbe)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
-msgstr "Clic droit : supprimer un point"
+msgstr "Clic droit : Supprimer un point"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Select Control Points (Shift+Drag)"
-msgstr "Sélectionner les points de contrôle (Maj. + glisser)"
+msgstr "Sélectionner les points de contrôle (Maj+Glisser)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
@@ -5176,11 +5172,6 @@ msgstr "Ajouter un point (dans un espace vide)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr "Diviser le segment (en courbe)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "Supprimer le point"
@@ -5198,12 +5189,12 @@ msgstr "Options"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Angles"
-msgstr ""
+msgstr "Refléter les angles de poignée"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Lengths"
-msgstr ""
+msgstr "Refléter les longeurs de poignée"
#: editor/plugins/path_editor_plugin.cpp
msgid "Curve Point #"
@@ -5237,65 +5228,75 @@ msgstr "Supprimer point Out-Control"
msgid "Remove In-Control Point"
msgstr "Supprimer point In-Control"
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Diviser le segment (en courbe)"
+
#: editor/plugins/physical_bone_plugin.cpp
-#, fuzzy
msgid "Move joint"
-msgstr "Déplacer le point"
+msgstr "Déplacer la jointure"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
msgstr ""
+"La propriété squelette du Polygon2D ne pointe pas vers un nœud Skeleton2D"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Sync bones"
-msgstr "Afficher les os"
+msgid "Sync Bones"
+msgstr "Synchroniser les os"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+"Pas de texture dans ce polygone.\n"
+"Sélectionnez une texture pour pouvoir éditer les UV."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr "Créer une carte UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon & UV"
-msgstr "Créer un polygone"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
+msgstr "Créer un polygone & UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+msgid "Create Internal Vertex"
+msgstr "Créer un vertex interne"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Split already exists."
-msgstr "L'action « %s » existe déjà !"
+msgid "Remove Internal Vertex"
+msgstr "Supprimer un vertex interne"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Add Split"
-msgstr "Ajouter un point"
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr "Polygone invalide (3 vertex différents sont nécessaires)"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Invalid Split: "
-msgstr "Chemin invalide !"
+msgid "Add Custom Polygon"
+msgstr "Ajouter un polygone personnalisé"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Remove Split"
-msgstr "Supprimer point"
+msgid "Remove Custom Polygon"
+msgstr "Supprimer un polygone personnalisé"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr "Transformer la carte UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
-msgstr ""
+msgid "Transform Polygon"
+msgstr "Transformer le polygon"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
+msgstr "Peindre les poids de l'os"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Open Polygon 2D UV editor."
+msgstr "Ouvrir l'éditeur d'UV de polygones 2D."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
@@ -5303,43 +5304,35 @@ msgstr "Éditeur UV de polygones 2D"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "UV"
-msgstr ""
+msgstr "UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Poly"
-msgstr "Modifier le polygone"
+msgid "Points"
+msgstr "Points"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Splits"
-msgstr "Diviser le chemin"
+msgid "Polygons"
+msgstr "Polygones"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Bones"
-msgstr "Créer les os"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Create Polygon"
-msgstr "Créer un polygone"
+msgstr "Os"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
-msgstr "Déplacer le point"
+msgid "Move Points"
+msgstr "Déplacer de points"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
-msgstr "Contrôle: Tourner"
+msgstr "Contrôle : Tourner"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Shift: Move All"
-msgstr "Maj. : Tout déplacer"
+msgstr "Maj : Tout déplacer"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Shift+Ctrl: Scale"
-msgstr "Maj.+Contrôle : Mettre à l'échelle"
+msgstr "Maj+Contrôle : Mettre à l'échelle"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Move Polygon"
@@ -5354,25 +5347,29 @@ msgid "Scale Polygon"
msgstr "Mettre à l'échelle le polygone"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
+"Créer un polygon personnalisé. Active le rendu des polygones personnalisés."
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "Sélectionnez d'abord un élément à configurer !"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
+"Supprimer un polygone personnalisé. S'il n'en reste aucun, le rendu des "
+"polygones personnalisés est désactivé."
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
-msgstr ""
+msgid "Paint weights with specified intensity."
+msgstr "Appliquer les poids avec l'intensité spécifiée."
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
-msgstr ""
+msgid "Unpaint weights with specified intensity."
+msgstr "Retirer les poids avec l'intensité spécifiée."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Radius:"
-msgstr ""
+msgstr "Rayon :"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon->UV"
@@ -5387,9 +5384,13 @@ msgid "Clear UV"
msgstr "Effacer l'UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Settings"
-msgstr "Paramètres GridMap"
+msgstr "Paramètres de la grille"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "Aligner"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
@@ -5400,34 +5401,28 @@ msgid "Grid"
msgstr "Grille"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Configure Grid:"
-msgstr "Configurer la grille"
+msgstr "Configurer la grille :"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset X:"
-msgstr "Décalage de la grille :"
+msgstr "Décalage X de la grille :"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset Y:"
-msgstr "Décalage de la grille :"
+msgstr "Décalage Y de la grille :"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step X:"
-msgstr "Pas de la grille :"
+msgstr "Pas X de la grille :"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step Y:"
-msgstr "Pas de la grille :"
+msgstr "Pas Y de la grille :"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Sync Bones to Polygon"
-msgstr "Mettre à l'échelle le polygone"
+msgstr "Synchroniser les os avec le polygone"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "ERROR: Couldn't load resource!"
@@ -5455,22 +5450,22 @@ msgid "Paste Resource"
msgstr "Coller la ressource"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "Ouvrir dans l'éditeur"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr "Instance :"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr "Type :"
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Ouvrir dans l'éditeur"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr "Charger une ressource"
@@ -5481,12 +5476,11 @@ msgstr "ResourcePreloader"
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "AnimationTree has no path set to an AnimationPlayer"
-msgstr ""
+msgstr "AnimationTree n'a pas de chemin défini vers un AnimationPlayer"
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Path to AnimationPlayer is invalid"
-msgstr "L'arbre d'animations est invalide."
+msgstr "Le chemin vers AnimationPlayer est invalide"
#: editor/plugins/script_editor_plugin.cpp
msgid "Clear Recent Files"
@@ -5497,48 +5491,46 @@ msgid "Close and save changes?"
msgstr "Quitter et sauvegarder les modifications ?"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error writing TextFile:"
-msgstr "Erreur lors du déplacement de fichier :\n"
+msgstr "Erreur lors de l'écriture du fichier texte :"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr "Erreur de chargement de fichier."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error could not load file."
-msgstr "Impossible de charger l'image"
+msgstr "Erreur de chargement de fichier."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error saving file!"
-msgstr "Erreur d'enregistrement du TileSet !"
+msgstr "Erreur lors de l'enregistrement du fichier !"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr "Erreur d'enregistrement du thème"
+msgid "Error while saving theme."
+msgstr "Erreur d'enregistrement du thème."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+msgid "Error Saving"
msgstr "Erreur d'enregistrement"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr "Erreur d'importation du thème"
+msgid "Error importing theme."
+msgstr "Erreur d'importation du thème."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+msgid "Error Importing"
msgstr "Erreur d'importation"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New TextFile..."
-msgstr "Nouveau dossier..."
+msgstr "Nouveau fichier texte..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open File"
-msgstr "Ouvrir un fichier"
+msgstr "Ouvrir le fichier"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Save File As..."
msgstr "Enregistrer sous…"
@@ -5547,6 +5539,14 @@ msgid "Import Theme"
msgstr "Importer un thème"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Erreur d'enregistrement du thème"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Erreur d'enregistrement"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr "Enregistrer le thème sous…"
@@ -5556,7 +5556,7 @@ msgstr " Référence de classe"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
-msgstr ""
+msgstr "Basculer le tri alphabétique de la liste de méthodes."
#: editor/plugins/script_editor_plugin.cpp
msgid "Sort"
@@ -5587,9 +5587,8 @@ msgid "File"
msgstr "Fichier"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "New TextFile"
-msgstr "Voir Fichiers"
+msgid "Open..."
+msgstr "Ouvrir..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5604,11 +5603,7 @@ msgid "Copy Script Path"
msgstr "Copier le chemin du script"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr "Afficher dans le système de fichiers"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+msgid "History Previous"
msgstr "Précédent dans l'historique"
#: editor/plugins/script_editor_plugin.cpp
@@ -5621,6 +5616,10 @@ msgid "Theme"
msgstr "Thème"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme..."
+msgstr "Importer un thème..."
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
msgstr "Recharger le thème"
@@ -5629,10 +5628,6 @@ msgid "Save Theme"
msgstr "Enregistrer le thème"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "Enregistrer le thème sous"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "Fermer les documentations"
@@ -5679,7 +5674,7 @@ msgid "Keep Debugger Open"
msgstr "Garder le débogueur ouvert"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr "Déboguer avec un éditeur externe"
#: editor/plugins/script_editor_plugin.cpp
@@ -5687,10 +5682,6 @@ msgid "Open Godot online documentation"
msgstr "Ouvrir la documentation Godot en ligne"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr "Cherche dans la hiérarchie des classes."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Chercher dans la documentation de référence."
@@ -5727,39 +5718,32 @@ msgid "Debugger"
msgstr "Débogueur"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search results"
-msgstr "Chercher dans l'aide"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "Chercher dans les classes"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-"Les scripts intégrés ne peuvent être modifiés uniquement lorsque la scène à "
-"qui ils appartiennent est ouverte"
+msgid "Search Results"
+msgstr "Résultats de recherche"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Line"
-msgstr "Ligne :"
+msgstr "Ligne"
#: editor/plugins/script_text_editor.cpp
msgid "(ignore)"
-msgstr ""
+msgstr "(ignorer)"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function"
+msgstr "Aller à la fonction"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr "Standard"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr "Seules les ressources du système de fichiers peuvent être abaissées."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Lookup Symbol"
-msgstr "Compléter le symbole"
+msgstr "Symbole de recherche"
#: editor/plugins/script_text_editor.cpp
msgid "Pick Color"
@@ -5783,11 +5767,7 @@ msgstr "Capitaliser"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Syntax Highlighter"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
+msgstr "Surligneur de syntaxe"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
@@ -5840,11 +5820,11 @@ msgid "Trim Trailing Whitespace"
msgstr "Supprimer les espaces de fin de ligne"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr "Convertir indentations en espaces"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr "Convertir les indentations en tabulations"
#: editor/plugins/script_text_editor.cpp
@@ -5861,36 +5841,27 @@ msgid "Remove All Breakpoints"
msgstr "Supprimer tous les points d'arrêt"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
+msgid "Go to Next Breakpoint"
msgstr "Aller au point d'arrêt suivant"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
+msgid "Go to Previous Breakpoint"
msgstr "Aller au point d'arrêt précédent"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr "Convertir en majuscule"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr "Convertir en minuscule"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr "Trouver le précédent"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Find in files..."
-msgstr "Filtrer Fichiers..."
+msgid "Find in Files..."
+msgstr "Trouver dans les fichiers..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+msgid "Go to Function..."
msgstr "Aller à la fonction…"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+msgid "Go to Line..."
msgstr "Aller à la ligne…"
#: editor/plugins/script_text_editor.cpp
@@ -5903,40 +5874,35 @@ msgstr "Shader"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "This skeleton has no bones, create some children Bone2D nodes."
-msgstr ""
+msgstr "Ce squelette n'a pas d'os, créez des nœuds Bone2D enfants."
#: editor/plugins/skeleton_2d_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton2D"
-msgstr "Squelette…"
+msgstr "Squelette 2D"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Make Rest Pose (From Bones)"
-msgstr ""
+msgstr "Créer la position de repos (d'après les os)"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Set Bones to Rest Pose"
-msgstr ""
+msgstr "Assigner les os à la position de repos"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical bones"
-msgstr "Créer un maillage de navigation"
+msgstr "Créer des os physiques"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton"
-msgstr "Squelette…"
+msgstr "Squelette"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical skeleton"
-msgstr "Créer la solution C#"
+msgstr "Créer un squelette physique"
#: editor/plugins/skeleton_ik_editor_plugin.cpp
-#, fuzzy
msgid "Play IK"
-msgstr "Jouer"
+msgstr "Jouer IK"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Orthogonal"
@@ -5987,6 +5953,14 @@ msgid "Animation Key Inserted."
msgstr "Clé d'animation insérée."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr "Tangage (latéral)"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr "Lacet (hauteur)"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr "Objets dessinés"
@@ -6073,9 +6047,8 @@ msgstr ""
"sélectionné."
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Lock View Rotation"
-msgstr "Voir information"
+msgstr "Verrouiller la rotation de la vue"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Normal"
@@ -6122,9 +6095,8 @@ msgid "Doppler Enable"
msgstr "Activer Doppler"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Cinematic Preview"
-msgstr "Création des prévisualisations des maillages"
+msgstr "Aperçu cinématographique"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
@@ -6155,6 +6127,10 @@ msgid "Freelook Speed Modifier"
msgstr "Modificateur de vitesse de la vue libre"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "Verrouiller la rotation de la vue"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "Dialogue XForm"
@@ -6169,8 +6145,8 @@ msgid ""
"Alt+RMB: Depth list selection"
msgstr ""
"Glisser : Rotation\n"
-"ALt+glisser : Déplacer\n"
-"Alt + Bouton droit : sélection détaillée par liste"
+"ALt+Glisser : Déplacer\n"
+"Alt+Bouton droit : Sélection détaillée par liste"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode (W)"
@@ -6257,11 +6233,6 @@ msgid "Tool Scale"
msgstr "Outil échelle"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap To Floor"
-msgstr "Accrocher à la grille"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Basculer en vue libre"
@@ -6271,7 +6242,7 @@ msgstr "Transformation"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap object to floor"
-msgstr ""
+msgstr "Aligner l'objet sur le sol"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Dialog..."
@@ -6302,9 +6273,8 @@ msgid "4 Viewports"
msgstr "4 vues"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Gizmos"
-msgstr "Voir les gadgets"
+msgstr "Gadgets"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Origin"
@@ -6379,52 +6349,51 @@ msgstr "Pré"
msgid "Post"
msgstr "Post"
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr "Gadget sans nom"
+
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite is empty!"
-msgstr "Le chemin de sauvegarde est vide !"
+msgstr "Le sprite est vide !"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Can't convert a sprite using animation frames to mesh."
msgstr ""
+"Impossible de convertir un sprite en utilisant des images d'animation à "
+"mailler."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't replace by mesh."
-msgstr ""
+msgstr "Géométrie invalide, impossible de remplacer par un maillage."
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite"
-msgstr "SpriteFrames"
+msgstr "Sprite"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to 2D Mesh"
-msgstr "Convertir en %s"
+msgstr "Convertir en maillage 2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create 2D Mesh"
-msgstr "Créer un maillage de contour"
+msgstr "Créer un maillage 2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Simplification: "
-msgstr ""
+msgstr "Simplification : "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Grow (Pixels): "
-msgstr "Aligner (pixels) :"
+msgstr "Croissance (Pixels) : "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Update Preview"
-msgstr "Aperçu de l'atlas"
+msgstr "Aperçu de la mise à jour"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Settings:"
-msgstr "Paramètres"
+msgstr "Paramètres :"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
@@ -6499,12 +6468,17 @@ msgid "Set Region Rect"
msgstr "Définir région rectangulaire"
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr "Définir la marge"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr "Mode d'aimantation :"
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
-msgstr "<Aucun>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
+msgstr "Aucun"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Pixel Snap"
@@ -6528,12 +6502,11 @@ msgstr "Pas (s) :"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Sep.:"
-msgstr ""
+msgstr "Sep. :"
#: editor/plugins/texture_region_editor_plugin.cpp
-#, fuzzy
msgid "TextureRegion"
-msgstr "Région de texture"
+msgstr "RegionDeTexture"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Can't save theme to file:"
@@ -6664,9 +6637,12 @@ msgid "Erase Selection"
msgstr "Supprimer la sélection"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Fix Invalid Tiles"
-msgstr "Nom invalide."
+msgstr "Résoudre les tuiles invalides"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Cut Selection"
+msgstr "Couper la sélection"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
@@ -6689,7 +6665,6 @@ msgid "Erase TileMap"
msgstr "Supprimer la TileMap"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Find Tile"
msgstr "Trouver une tuile"
@@ -6714,35 +6689,36 @@ msgid "Pick Tile"
msgstr "Sélectionner une case"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
-msgid "Move Selection"
-msgstr "Supprimer la sélection"
+msgid "Copy Selection"
+msgstr "Copier la sélection"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr "Tourner de 0 degrés"
+msgid "Rotate left"
+msgstr "Rotation à gauche"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr "Tourner de 90 degrés"
+msgid "Rotate right"
+msgstr "Rotation à droite"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
-msgstr "Tourner de 180 degrés"
+msgid "Flip horizontally"
+msgstr "Retourner horizontalement"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
-msgstr "Tourner de 270 degrés"
+msgid "Flip vertically"
+msgstr "Retourner verticalement"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Clear transform"
+msgstr "Supprimer la transformation"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Add Texture(s) to TileSet"
-msgstr "Ajouter un nœud à partir de l'arbre"
+msgid "Add Texture(s) to TileSet."
+msgstr "Ajouter des textures au TileSet."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Remove current Texture from TileSet"
-msgstr "Supprimer l’entrée"
+msgid "Remove selected Texture from TileSet."
+msgstr "Supprimer la texture sélectionnée du TileSet."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -6753,88 +6729,197 @@ msgid "Merge from Scene"
msgstr "Fusionner depuis la scène"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
-msgstr ""
-"Sélectionner une sous-tuile à utiliser comme icône, celle-ci sera aussi "
-"utilisée pour les liaisons de tuiles automatiques invalides."
+msgid "Copy bitmask."
+msgstr "Copier le masque de bit."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste bitmask."
+msgstr "Coller le masque de bit."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Erase bitmask."
+msgstr "Effacer le masque de bit."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new polygon."
+msgstr "Créer un nouveau polygone."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr "Circonscrire le polygone dans le Rect de région."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
+"Activer l'aimantation et afficher la grille (paramétrable via l'Inspecteur)."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr "Afficher les noms des tuiles (maintenez Alt enfoncé)"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Remove selected texture? This will remove all tiles which use it."
msgstr ""
+"Supprimer la texture sélectionnée ? Cela entraînera la suppression de toutes "
+"les tuiles qui l'utilisent."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
-msgstr ""
+msgstr "Vous n'avez pas sélectionné de texture à supprimer."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
-msgstr "Créer depuis la scène ?"
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr "Créer depuis une scène ? Cela remplacera toutes les tuiles existantes."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
msgstr "Fusionner depuis la scène ?"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
-msgstr ""
+msgid "Remove Texture"
+msgstr "Supprimer la texture"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
+msgstr "%s fichier(s) non ajouté(s) car déjà sur la liste."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Drag handles to edit Rect.\n"
"Click on another Tile to edit it."
msgstr ""
+"Faites glisser les poignées pour modifier Rect.\n"
+"Cliquez sur une autre tuile pour la modifier."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete selected Rect."
+msgstr "Supprimer le Rect sélectionné."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
-"Clic-gauche : Activer\n"
-"Clic-droit : Désactiver"
+"Sélectionner la sous-tuile en cours d'édition.\n"
+"Cliquer sur une autre tuile pour l'éditer."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete polygon."
+msgstr "Supprimer le polygone."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
-msgstr "Sélectionner la sous-tuile en cours d'édition."
+msgstr ""
+"Bouton gauche : Activer le bit.\n"
+"Bouton droit : Désactiver le bit.\n"
+"Cliquer sur une autre tuile pour l'éditer."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to use as icon, this will be also used on invalid autotile "
"bindings.\n"
"Click on another Tile to edit it."
msgstr ""
"Sélectionner une sous-tuile à utiliser comme icône, celle-ci sera aussi "
-"utilisée pour les liaisons de tuiles automatiques invalides."
+"utilisée pour les liaisons de tuiles automatiques invalides.\n"
+"Cliquer sur une autre tuile pour la modifier."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to change its priority.\n"
"Click on another Tile to edit it."
-msgstr "Sélectionner une sous-tuile pour changer sa priorité."
+msgstr ""
+"Sélectionner une sous-tuile pour changer sa priorité.\n"
+"Cliquer sur une autre tuile pour l'éditer."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+"Sélectionner une sous-tuile pour changer son index Z.\n"
+"Cliquer sur une autre tuile pour l'éditer."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr "Définir la région de la tuile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Tile"
+msgstr "Créer une tuile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr "Définir l'icône de la tuile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr "Modifier le masque de bit de la tuile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Collision Polygon"
+msgstr "Modifier le polygone de collision"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Occlusion Polygon"
+msgstr "Modifier le polygone d'occlusion"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Navigation Polygon"
+msgstr "Modifier le polygone de navigation"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste Tile Bitmask"
+msgstr "Coller le masque de bit de la tuile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr "Supprimer le masque de bit de la tuile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Tile"
+msgstr "Supprimer la tuile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr "Supprimer le polygone de collision"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr "Supprimer le polygone d'occlusion"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr "Supprimer le polygone de navigation"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr "Modifier la priorité de la tuile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr "Modifier l'index Z de la tuile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Collision Polygon"
+msgstr "Créer le polygone de collision"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Occlusion Polygon"
+msgstr "Créer le polygone d'occlusion"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "This property can't be changed."
-msgstr "Cette opération ne peut être réalisée sans une scène."
+msgstr "Cette propriété ne peut être changée."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
-msgstr "Jeu de tuiles"
+msgid "TileSet"
+msgstr "TileSet"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vertex"
msgstr "Vertex"
@@ -6843,14 +6928,12 @@ msgid "Fragment"
msgstr "Fragment"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Light"
-msgstr "Droite"
+msgstr "Lumière"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "VisualShader"
-msgstr "Shader"
+msgstr "VisualShader"
#: editor/project_export.cpp
msgid "Runnable"
@@ -6869,6 +6952,14 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr "Modèles d'exportation manquants ou corrompus pour cette plateforme :"
#: editor/project_export.cpp
+msgid "Release"
+msgstr "Publication (release)"
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr "Tout exporter"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr "Pré-réglages"
@@ -6877,6 +6968,10 @@ msgid "Add..."
msgstr "Ajouter…"
#: editor/project_export.cpp
+msgid "Export Path"
+msgstr "Chemin d'exportation"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr "Ressources"
@@ -6935,10 +7030,46 @@ msgid "Feature List:"
msgstr "Liste des fonctionnalités :"
#: editor/project_export.cpp
+msgid "Script"
+msgstr "Script"
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "Mode d'exportation des scripts :"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr "Texte"
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr "Compilé"
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "Chiffré (fournir clé ci-dessous)"
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr "Clé de chiffrement invalide (doit comporter 64 caractères)"
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "Clé de chiffre des scripts (256 bits en hexadécimal) :"
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr "Exporter le PCK/ZIP"
#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr "Mode d'exportation?"
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr "Tout exporter"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr "Modèles d'exportation manquants pour cette plateforme :"
@@ -6951,23 +7082,22 @@ msgid "The path does not exist."
msgstr "Le chemin vers ce fichier n'existe pas."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
msgstr ""
-"Veuillez choisir un dossier qui ne contient pas de fichier 'project.godot'."
+"Fichier de projet '.zip' invalide, il ne contient pas de fichier 'project."
+"godot'."
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "Veuillez choisir un dossier vide."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "Veuillez choisir un fichier 'project.godot'."
+msgstr "Veuillez choisir un fichier 'project.godot' ou '.zip'."
#: editor/project_manager.cpp
msgid "Directory already contains a Godot project."
-msgstr ""
+msgstr "Le répertoire contient déjà un projet Godot."
#: editor/project_manager.cpp
msgid "Imported Project"
@@ -6975,7 +7105,7 @@ msgstr "Projet importé"
#: editor/project_manager.cpp
msgid "Invalid Project Name."
-msgstr "Nom du Projet Invalide."
+msgstr "Nom du projet invalide."
#: editor/project_manager.cpp
msgid "Couldn't create folder."
@@ -7059,9 +7189,8 @@ msgid "Project Path:"
msgstr "Chemin du projet :"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Project Installation Path:"
-msgstr "Chemin du projet :"
+msgstr "Chemin d'installation du projet :"
#: editor/project_manager.cpp
msgid "Browse"
@@ -7072,8 +7201,8 @@ msgid "Unnamed Project"
msgstr "Projet sans titre"
#: editor/project_manager.cpp
-msgid "Can't open project"
-msgstr "Impossible d'ouvrir le projet"
+msgid "Can't open project at '%s'."
+msgstr "Impossible d'ouvrir le projet à \"%s\"."
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
@@ -7081,6 +7210,35 @@ msgstr "Voulez-vous vraiment ouvrir plus d'un projet à la fois ?"
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+"Le fichier de configuration de projet ci-dessous a été généré par une "
+"précédente version du moteur, et doit être mis à nouveau pour cette "
+"version :\n"
+"\n"
+"%s\n"
+"\n"
+"Souhaitez-vous le convertir ?\n"
+"Attention : Il ne sera plus possible d'ouvrir ce projet avec les précédentes "
+"versions du moteur."
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+"Ce fichier de configuration de projet a été créé par une version ultérieure "
+"du moteur, dont les paramètres ne sont pas compatibles avec cette version."
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7185,13 +7343,12 @@ msgid "Mouse Button"
msgstr "Bouton de souris"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid ""
"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
msgstr ""
-"Nom d'action invalide. Il ne peux être vide ou contenir '/', ':', '=', '\\' "
-"ou '\"'."
+"Nom d'action invalide. Il ne peux être vide ni contenir '/', ':', '=', '\\' "
+"ou '\"'"
#: editor/project_settings_editor.cpp
msgid "Action '%s' already exists!"
@@ -7202,18 +7359,16 @@ msgid "Rename Input Action Event"
msgstr "Renommer l'événement d'action d'entrée"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Change Action deadzone"
-msgstr "Modifier le nom de l'animation :"
+msgstr "Modifier la zone morte de l'action"
#: editor/project_settings_editor.cpp
msgid "Add Input Action Event"
msgstr "Ajouter un événement d'action d'entrée"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "All Devices"
-msgstr "Périphérique"
+msgstr "Tous les périphérique"
#: editor/project_settings_editor.cpp
msgid "Device"
@@ -7245,7 +7400,7 @@ msgstr "Bouton gauche"
#: editor/project_settings_editor.cpp
msgid "Right Button"
-msgstr "Bouton droite"
+msgstr "Bouton droit"
#: editor/project_settings_editor.cpp
msgid "Middle Button"
@@ -7260,24 +7415,20 @@ msgid "Wheel Down Button"
msgstr "Molette vers le bas"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Left Button"
-msgstr "Molette vers le haut"
+msgstr "Molette bouton gauche"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Right Button"
-msgstr "Bouton droite"
+msgstr "Molette bouton droit"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 1"
-msgstr "Bouton 6"
+msgstr "X Bouton 1"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 2"
-msgstr "Bouton 6"
+msgstr "X Bouton 2"
#: editor/project_settings_editor.cpp
msgid "Joypad Axis Index:"
@@ -7419,17 +7570,13 @@ msgstr "Paramètres du projet (project.godot)"
msgid "General"
msgstr "Général"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr "Propriété :"
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr "Écraser pour…"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Editor must be restarted for changes to take effect"
-msgstr ""
+msgstr "L'éditeur doit être redémarré pour que les changements prennent effet"
#: editor/project_settings_editor.cpp
msgid "Input Map"
@@ -7445,7 +7592,7 @@ msgstr "Action"
#: editor/project_settings_editor.cpp
msgid "Deadzone"
-msgstr ""
+msgstr "Zone morte"
#: editor/project_settings_editor.cpp
msgid "Device:"
@@ -7485,7 +7632,7 @@ msgstr "Localisation"
#: editor/project_settings_editor.cpp
msgid "Locales Filter"
-msgstr "Filtre de langues :"
+msgstr "Filtre de langues"
#: editor/project_settings_editor.cpp
msgid "Show all locales"
@@ -7555,10 +7702,6 @@ msgstr "Choisissez un nœud"
msgid "Bit %d, val %d."
msgstr "Bit %d, valeur %d."
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr "Propriétés :"
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr "Sélectionnez une propriété"
@@ -7581,97 +7724,92 @@ msgstr ""
"L'image convertie n'a pas pu être rechargée en utilisant l'outil PVRTC :"
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Batch Rename"
-msgstr "Renommer"
+msgstr "Renommer par lot"
#: editor/rename_dialog.cpp
msgid "Prefix"
-msgstr ""
+msgstr "Préfixe"
#: editor/rename_dialog.cpp
msgid "Suffix"
-msgstr ""
+msgstr "Suffixe"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Advanced options"
-msgstr "Options du magnétisme"
+msgstr "Options avancées"
#: editor/rename_dialog.cpp
msgid "Substitute"
-msgstr ""
+msgstr "Remplacer"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node name"
-msgstr "Nom de nœud :"
+msgstr "Nom de nœud"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
-msgstr ""
+msgstr "Nom parent du nœud, si disponible"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node type"
-msgstr "Trouver le type du nœud"
+msgstr "Type de nœud"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Current scene name"
-msgstr "Scène actuelle"
+msgstr "Nom de la scène courante"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Root node name"
-msgstr "Nom de nœud racine :"
+msgstr "Nom de nœud racine"
#: editor/rename_dialog.cpp
msgid ""
"Sequential integer counter.\n"
"Compare counter options."
msgstr ""
+"Compteur entier séquentiel.\n"
+"Comparez les options du compteur."
#: editor/rename_dialog.cpp
msgid "Per Level counter"
-msgstr ""
+msgstr "Compteur par niveau"
#: editor/rename_dialog.cpp
msgid "If set the counter restarts for each group of child nodes"
-msgstr ""
+msgstr "Si défini, le compteur redémarre pour chaque groupe de nœuds enfant"
#: editor/rename_dialog.cpp
msgid "Initial value for the counter"
-msgstr ""
+msgstr "Valeur initiale pour le compteur"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Step"
-msgstr "Pas (s) :"
+msgstr "Pas"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
-msgstr ""
+msgid "Amount by which counter is incremented for each node"
+msgstr "Valeur par laquelle le compteur est incrémenté pour chaque nœud"
#: editor/rename_dialog.cpp
msgid "Padding"
-msgstr ""
+msgstr "Remplissage"
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
+"Nombre minimum de chiffres pour le compteur.\n"
+"Les chiffres manquants sont complétés par des zéros en tête."
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Regular Expressions"
-msgstr "Changer l'expression"
+msgstr "Expressions régulières"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Post-Process"
-msgstr "Script de post-traitement :"
+msgstr "Post-traitement"
#: editor/rename_dialog.cpp
msgid "Keep"
@@ -7679,32 +7817,29 @@ msgstr "Conserver"
#: editor/rename_dialog.cpp
msgid "CamelCase to under_scored"
-msgstr ""
+msgstr "CamelCase vers sous_ligné"
#: editor/rename_dialog.cpp
msgid "under_scored to CamelCase"
-msgstr ""
+msgstr "sous_ligné vers CamelCase"
#: editor/rename_dialog.cpp
msgid "Case"
-msgstr ""
+msgstr "Cas"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Lowercase"
-msgstr "Minuscule"
+msgstr "Convertir en minuscule"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Uppercase"
-msgstr "Majuscule"
+msgstr "Convertir en majuscule"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Reset"
-msgstr "Réinitialiser le zoom"
+msgstr "Réinitialiser"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr "Erreur"
@@ -7765,6 +7900,10 @@ msgid "Instance Scene(s)"
msgstr "Instancier scène(s)"
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "Instancier une scène enfant"
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr "Supprimer le script"
@@ -7790,7 +7929,7 @@ msgstr "Supprimer le(s) nœud(s) ?"
#: editor/scene_tree_dock.cpp
msgid "Can not perform with the root node."
-msgstr "Ne peut fonctionner avec le noeud racine."
+msgstr "Ne peut fonctionner avec le nœud racine."
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on instanced scenes."
@@ -7801,45 +7940,48 @@ msgid "Save New Scene As..."
msgstr "Enregistrer la nouvelle scène sous…"
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+"Désactiver \"editable_instance\" implique la remise à zéro de toutes les "
+"propriétés du nœud."
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr "Enfants modifiables"
#: editor/scene_tree_dock.cpp
msgid "Load As Placeholder"
-msgstr "Charger en tant que fictif"
+msgstr "Charger en tant qu'instance temporaire"
#: editor/scene_tree_dock.cpp
msgid "Make Local"
msgstr "Rendre local"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "Créer un nœud"
+msgstr "Créer un nœud racine :"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "2D Scene"
-msgstr "Scène"
+msgstr "Scène 2D"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "3D Scene"
-msgstr "Scène"
+msgstr "Scène 3D"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "User Interface"
-msgstr "Effacer l'héritage"
+msgstr "Interface utilisateur"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Custom Node"
-msgstr "Couper les nœuds"
+msgstr "Nœud personnalisé"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
-msgstr "Impossible d'opérer sur des nœuds d'une scène étrangère !"
+msgstr "Impossible de modifier les nœuds en provenance d'une autre scène !"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes the current scene inherits from!"
@@ -7871,13 +8013,17 @@ msgstr "Erreur de duplication de la scène afin de l'enregistrer."
#: editor/scene_tree_dock.cpp
msgid "Sub-Resources"
-msgstr "Ressources secondaires :"
+msgstr "Ressources secondaires"
#: editor/scene_tree_dock.cpp
msgid "Clear Inheritance"
msgstr "Effacer l'héritage"
#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr "Ouvrir la documentation"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr "Supprimer nœud(s)"
@@ -7886,17 +8032,16 @@ msgid "Add Child Node"
msgstr "Ajouter un nœud enfant"
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
-msgstr "Instancier une scène enfant"
-
-#: editor/scene_tree_dock.cpp
msgid "Change Type"
msgstr "Changer le type"
#: editor/scene_tree_dock.cpp
-#, fuzzy
+msgid "Extend Script"
+msgstr "Hériter d'un script"
+
+#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
-msgstr "Nouvelle racine de la scène"
+msgstr "Choisir comme racine de scène"
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
@@ -7908,7 +8053,7 @@ msgstr "Sauvegarder la branche comme scène"
#: editor/scene_tree_dock.cpp
msgid "Copy Node Path"
-msgstr "Copier le chemin du noeud"
+msgstr "Copier le chemin du nœud"
#: editor/scene_tree_dock.cpp
msgid "Delete (No Confirm)"
@@ -7916,7 +8061,7 @@ msgstr "Effacer (pas de confirmation)"
#: editor/scene_tree_dock.cpp
msgid "Add/Create a New Node"
-msgstr "Ajouter un nouveau nœud"
+msgstr "Ajouter/Créer un nouveau nœud"
#: editor/scene_tree_dock.cpp
msgid ""
@@ -7948,61 +8093,56 @@ msgid "Clear Inheritance? (No Undo!)"
msgstr "Effacer l'héritage ? (Pas de retour en arrière !)"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Toggle Visible"
-msgstr "Basculer la visibilité"
+msgstr "Rendre visible"
#: editor/scene_tree_editor.cpp
msgid "Node configuration warning:"
-msgstr "Avertissement de configuration de noeud :"
+msgstr "Avertissement de configuration de nœud :"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node has connection(s) and group(s).\n"
"Click to show signals dock."
msgstr ""
-"Le noeud possède une (des) connection(s) et un (des) groupe(s)\n"
-"Cliquez pour montrer l'arrimage de signaux."
+"Le nœud possède des connexions et/ou des groupes.\n"
+"Cliquez pour afficher le panneau de connexion des signaux."
#: editor/scene_tree_editor.cpp
msgid ""
"Node has connections.\n"
"Click to show signals dock."
msgstr ""
-"Le noeud possède des connections.\n"
-"Cliquez pour montrer l'arrimage de signaux."
+"Le nœud possède des connections.\n"
+"Cliquez pour afficher le panneau de connexion des signaux."
#: editor/scene_tree_editor.cpp
msgid ""
"Node is in group(s).\n"
"Click to show groups dock."
msgstr ""
-"Le noeud fait partie d'un (de) groupe(s).\n"
-"Cliquez pour montrer l'arrimage de goupes."
+"Le nœud fait partie de groupes.\n"
+"Cliquez pour afficher le panneau de gestion des groupes."
#: editor/scene_tree_editor.cpp editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script"
-msgstr "Ouvrir script"
+msgstr "Ouvrir un script"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node is locked.\n"
"Click to unlock it."
msgstr ""
-"Noeud verouillé.\n"
-"Cliquez pour dévérouiller"
+"Le nœud est verrouillé.\n"
+"Cliquer pour le déverrouiller."
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Children are not selectable.\n"
"Click to make selectable."
msgstr ""
-"Enfants non séléctionnable.\n"
-"Cliquez pour les rendre sélectionnable"
+"Enfants non sélectionnables.\n"
+"Cliquer pour les rendre sélectionnables."
#: editor/scene_tree_editor.cpp
msgid "Toggle Visibility"
@@ -8013,6 +8153,8 @@ msgid ""
"AnimationPlayer is pinned.\n"
"Click to unpin."
msgstr ""
+"AnimationPlayer est épinglé.\n"
+"Cliquez pour détacher."
#: editor/scene_tree_editor.cpp
msgid "Invalid node name, the following characters are not allowed:"
@@ -8028,7 +8170,7 @@ msgstr "Arbre de scène (nœuds) :"
#: editor/scene_tree_editor.cpp
msgid "Node Configuration Warning!"
-msgstr "Avertissement de configuration de noeud !"
+msgstr "Avertissement de configuration de nœud !"
#: editor/scene_tree_editor.cpp
msgid "Select a Node"
@@ -8051,15 +8193,18 @@ msgid "N/A"
msgstr "N/A"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script/Choose Location"
-msgstr "Ouvrir l'éditeur de script"
+msgstr "Ouvrir le script / Choisir l'emplacement"
#: editor/script_create_dialog.cpp
msgid "Path is empty"
msgstr "Le chemin est vide"
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr "Le nom de fichier est vide"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr "Le chemin n'est pas local"
@@ -8121,7 +8266,7 @@ msgstr "Langage"
#: editor/script_create_dialog.cpp
msgid "Inherits"
-msgstr "Hérité de :"
+msgstr "Hérité de"
#: editor/script_create_dialog.cpp
msgid "Class Name"
@@ -8137,7 +8282,7 @@ msgstr "Script intégré"
#: editor/script_create_dialog.cpp
msgid "Attach Node Script"
-msgstr "Attacher script de nœud"
+msgstr "Attacher un script au nœud"
#: editor/script_editor_debugger.cpp
msgid "Remote "
@@ -8148,20 +8293,8 @@ msgid "Bytes:"
msgstr "Octets :"
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr "Avertissement"
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr "Erreur :"
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr "Source :"
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
-msgstr "Fonction :"
+msgid "Stack Trace"
+msgstr "Pile des appels"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8193,18 +8326,6 @@ msgid "Stack Frames"
msgstr "Pile des appels"
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr "Variable"
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr "Erreurs :"
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr "Trace de pile (si applicable) :"
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr "Profileur"
@@ -8293,9 +8414,8 @@ msgid "Change Camera Size"
msgstr "Changer la taille d'une caméra"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Notifier AABB"
-msgstr "Changer les extents d'un notificateur"
+msgstr "Changer le notificateur AABB"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Particles AABB"
@@ -8322,38 +8442,32 @@ msgid "Change Capsule Shape Height"
msgstr "Changer la hauteur de la forme capsule"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Radius"
-msgstr "Changer le rayon d'une forme en capsule"
+msgstr "Changer le rayon de la forme du cylindre"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Height"
-msgstr "Changer la hauteur de la forme capsule"
+msgstr "Changer la hauteur de la forme du cylindre"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Ray Shape Length"
msgstr "Changer la longueur d'une forme en rayon"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Radius"
-msgstr "Changer le rayon d'une lumière"
+msgstr "Changer le rayon du cylindre"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Height"
-msgstr "Changer la hauteur de la forme capsule"
+msgstr "Changer la hauteur du cylindre"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Inner Radius"
-msgstr "Changer le rayon d'une forme en sphère"
+msgstr "Changer le rayon intérieur de la tour"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Outer Radius"
-msgstr "Changer le rayon d'une lumière"
+msgstr "Changer le rayon extérieur de la tour"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select the dynamic library for this entry"
@@ -8408,7 +8522,7 @@ msgid "GDNative"
msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+msgid "Step argument is zero!"
msgstr "L'argument du pas est zéro !"
#: modules/gdscript/gdscript_functions.cpp
@@ -8473,12 +8587,11 @@ msgstr "Étage :"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Delete Selection"
-msgstr "Sélection de la supression de GridMap"
+msgstr "Suppression de la sélection de GridMap"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Fill Selection"
-msgstr "Sélection de la supression de GridMap"
+msgstr "Remplissage de la sélection de GridMap"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Duplicate Selection"
@@ -8561,9 +8674,8 @@ msgid "Clear Selection"
msgstr "Supprimer la sélection"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Fill Selection"
-msgstr "Toute la sélection"
+msgstr "Remplir la sélection"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Settings"
@@ -8575,7 +8687,7 @@ msgstr "Choisissez distance :"
#: modules/mono/csharp_script.cpp
msgid "Class name can't be a reserved keyword"
-msgstr "Le nom de la classe ne peut pas être un mot clé réservé"
+msgstr "Le nom de classe ne peut pas être un mot-clé réservé"
#: modules/mono/editor/godotsharp_editor.cpp
msgid "Generating solution..."
@@ -8595,7 +8707,7 @@ msgstr "Impossible de sauvegarder la solution."
#: modules/mono/editor/godotsharp_editor.cpp
msgid "Done"
-msgstr "C'est fait !"
+msgstr "Terminé"
#: modules/mono/editor/godotsharp_editor.cpp
msgid "Failed to create C# project."
@@ -8634,12 +8746,8 @@ msgid "End of inner exception stack trace"
msgstr "Fin de la trace d'appel (stack trace) intrinsèque"
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr "Calculer !"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
-msgstr "Précalculer le maillage de navigation."
+msgid "Bake NavMesh"
+msgstr "Calculer le NavMesh"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8702,8 +8810,8 @@ msgid ""
"A node yielded without working memory, please read the docs on how to yield "
"properly!"
msgstr ""
-"Une node utilise yield sans mémoire de travail; veuillez lire la "
-"documentation sur l'utilisation de yield !"
+"Un nœud utilise `yield` sans mémoire de travail ; veuillez consulter la "
+"documentation sur l'utilisation de `yield` !"
#: modules/visual_script/visual_script.cpp
msgid ""
@@ -8718,8 +8826,8 @@ msgid ""
"Return value must be assigned to first element of node working memory! Fix "
"your node please."
msgstr ""
-"Une valeur de retour doit être assignée au premier élément de la mémoire de "
-"travail du nœud! Veuillez corriger votre nœud."
+"La valeur de retour doit être assignée au premier élément de la mémoire de "
+"travail du nœud ! Veuillez rectifier votre nœud."
#: modules/visual_script/visual_script.cpp
msgid "Node returned an invalid sequence output: "
@@ -8801,11 +8909,11 @@ msgstr "Ajouter un nœud"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove VisualScript Nodes"
-msgstr "Supprimer noeuds VisualScript"
+msgstr "Supprimer nœuds VisualScript"
#: modules/visual_script/visual_script_editor.cpp
msgid "Duplicate VisualScript Nodes"
-msgstr "Dupliquer noeuds VisualScript"
+msgstr "Dupliquer nœuds VisualScript"
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature."
@@ -8816,7 +8924,7 @@ msgstr ""
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
msgstr ""
-"Maintenir Ctrl pour déposer un accesseur. Maintenir Maj pour déposer une "
+"Maintenir Contrôle pour déposer un accesseur. Maintenir Maj pour déposer une "
"signature générique."
#: modules/visual_script/visual_script_editor.cpp
@@ -8825,7 +8933,7 @@ msgstr "Maintenir %s pour déposer une référence simple au nœud."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold Ctrl to drop a simple reference to the node."
-msgstr "Maintenir Ctrl pour déposer une référence simple au nœud."
+msgstr "Maintenir Contrôle pour déposer une référence simple au nœud."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a Variable Setter."
@@ -8833,7 +8941,7 @@ msgstr "Maintenir %s pour déposer un mutateur de variable."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold Ctrl to drop a Variable Setter."
-msgstr "Maintenir Ctrl pour déposer un mutateur de variable."
+msgstr "Maintenir Contrôle pour déposer un mutateur de variable."
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Preload Node"
@@ -8868,14 +8976,12 @@ msgid "Connect Nodes"
msgstr "Connecter nœud"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Data"
-msgstr "Connecter nœud"
+msgstr "Données de connexion du nœud"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Sequence"
-msgstr "Connecter nœud"
+msgstr "Séquence de connexion du nœud"
#: modules/visual_script/visual_script_editor.cpp
msgid "Script already has function '%s'"
@@ -8887,7 +8993,7 @@ msgstr "Changer nom de l'entrée"
#: modules/visual_script/visual_script_editor.cpp
msgid "Can't copy the function node."
-msgstr "Impossible de copier le noeud de fonction."
+msgstr "Impossible de copier le nœud de fonction."
#: modules/visual_script/visual_script_editor.cpp
msgid "Clipboard is empty!"
@@ -8922,6 +9028,10 @@ msgid "Base Type:"
msgstr "Type de base :"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "Membres :"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "Nœuds disponibles :"
@@ -8958,9 +9068,8 @@ msgid "Paste Nodes"
msgstr "Coller les nœuds"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
-msgstr "Membres"
+msgstr "Modifier le membre"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Input type not iterable: "
@@ -9021,17 +9130,16 @@ msgstr ""
"out), ou une chaîne (erreur)."
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Search VisualScript"
-msgstr "Supprimer nœud VisualScript"
+msgstr "Rechercher VisualScript"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
-msgstr "Récupérer"
+msgid "Get %s"
+msgstr "Obtenir %s"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
-msgstr ""
+msgid "Set %s"
+msgstr "Définir %s"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -9082,15 +9190,15 @@ msgstr ""
"scènes instanciées). Le premier créé fonctionnera, les autres seront ignorés."
#: scene/2d/collision_object_2d.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
"define its shape."
msgstr ""
-"Ce nœud n'a aucune forme enfant, et ne peut donc interagir avec l'espace.\n"
-"Considérez ajouter un nœud enfant CollisionShape2D ou un CollisionPolygon2D "
-"pour définir sa forme."
+"Ce nœud n'a pas de forme, il ne peut donc pas entrer en collision ou "
+"interagir avec d'autres objets.\n"
+"Envisagez d'ajouter un CollisionShape2D ou CollisionPolygon2D en tant "
+"qu'enfant pour définir sa forme."
#: scene/2d/collision_polygon_2d.cpp
msgid ""
@@ -9124,6 +9232,14 @@ msgstr ""
"Une forme doit être créée afin qu'une CollisionShape2D fonctionne. Veuillez "
"créer une ressource de forme !"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+"L'animation de CPUParticles2D a besoin d'un CanvasItemMaterial avec "
+"\"Animation de Particules\" activé."
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -9166,8 +9282,8 @@ msgstr ""
msgid ""
"ParallaxLayer node only works when set as child of a ParallaxBackground node."
msgstr ""
-"Le nœud ParallaxLayer ne fonctionne que lorsqu'il s'agit d'un enfant d'un "
-"nœud de type ParallaxBackground."
+"Le nœud ParallaxLayer ne fonctionne que s'il est défini en tant qu'enfant "
+"d'un nœud de type ParallaxBackground."
#: scene/2d/particles_2d.cpp scene/3d/particles.cpp
msgid ""
@@ -9177,11 +9293,19 @@ msgstr ""
"Un matériau de traitement des particules n'est pas assigné, aucun "
"comportement n'est donc imprimé."
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+"L'animation de Particles2D a besoin d'un CanvasItemMaterial avec \"Animation "
+"de Particules\" activé."
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
-"Un PathFollow2D fonctionne seulement quand défini comme un enfant d'un nœud "
-"Path2D."
+"Le nœud PathFollow2D ne fonctionne que s'il est défini en tant qu'enfant "
+"d'un nœud de type Path2D."
#: scene/2d/physics_body_2d.cpp
msgid ""
@@ -9201,16 +9325,20 @@ msgstr ""
#: scene/2d/skeleton_2d.cpp
msgid "This Bone2D chain should end at a Skeleton2D node."
-msgstr ""
+msgstr "Cette chaîne Bone2D doit se terminer sur un nœud Skeleton2D."
#: scene/2d/skeleton_2d.cpp
msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
msgstr ""
+"Un nœud de type Bone2D ne fonctionne qu'avec un Skeleton2D ou un autre "
+"Bone2D en tant que nœud parent."
#: scene/2d/skeleton_2d.cpp
msgid ""
"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
msgstr ""
+"Cet os ne dispose pas d'une position de repos appropriée. Accédez au nœud "
+"Skeleton2D et définissez-en une."
#: scene/2d/visibility_notifier_2d.cpp
msgid ""
@@ -9222,11 +9350,11 @@ msgstr ""
#: scene/3d/arvr_nodes.cpp
msgid "ARVRCamera must have an ARVROrigin node as its parent"
-msgstr "ARVRCamera doit avoir un noeud ARVROrigin comme parent"
+msgstr "ARVRCamera doit avoir un nœud ARVROrigin comme parent"
#: scene/3d/arvr_nodes.cpp
msgid "ARVRController must have an ARVROrigin node as its parent"
-msgstr "ARVRController doit avoir un noeud ARVROrigin comme parent"
+msgstr "ARVRController doit avoir un nœud ARVROrigin comme parent"
#: scene/3d/arvr_nodes.cpp
msgid ""
@@ -9238,7 +9366,7 @@ msgstr ""
#: scene/3d/arvr_nodes.cpp
msgid "ARVRAnchor must have an ARVROrigin node as its parent"
-msgstr "ARVRAnchor doit avoir un noeud ARVROrigin comme parent"
+msgstr "ARVRAnchor doit avoir un nœud ARVROrigin comme parent"
#: scene/3d/arvr_nodes.cpp
msgid ""
@@ -9277,15 +9405,15 @@ msgid "Lighting Meshes: "
msgstr "Tracer les maillages : "
#: scene/3d/collision_object.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape or CollisionPolygon as a child to define "
"its shape."
msgstr ""
-"Ce nœud n'a aucune forme enfant, il ne peut donc interagir avec l'espace.\n"
-"Considérez ajouter un nœud enfant CollisionShape ou CollisionPolygon pour "
-"définir sa forme."
+"Ce nœud n'a pas de forme, il ne peut donc pas entrer en collision ou "
+"interagir avec d'autres objets.\n"
+"Envisagez d'ajouter un CollisionShape ou CollisionPolygon en tant qu'enfant "
+"pour définir sa forme."
#: scene/3d/collision_polygon.cpp
msgid ""
@@ -9317,6 +9445,18 @@ msgstr ""
"Une CollisionShape nécessite une forme pour fonctionner. Créez une ressource "
"de forme pour cette CollisionShape !"
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr "Rien n'est visible car aucun maillage n'a été assigné."
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+"L'animation de CPUParticles a besoin d'un SpatialMaterial avec \"Billboard "
+"Particles\" activé."
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr "Tracer les maillages"
@@ -9342,6 +9482,34 @@ msgstr ""
"Rien n'est visible car les maillages n'ont pas été assignés au tirage des "
"passes."
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+"L'animation de Particles a besoin d'un SpatialMaterial avec \"Billboard "
+"Particles\" activé."
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+"Le nœud PathFollow ne fonctionne que s'il est défini en tant qu'enfant d'un "
+"nœud de type Path."
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+"Le nœud OrientedPathFollow ne fonctionne que s'il est défini en tant qu'un "
+"enfant d'un nœud de type Path."
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+"OrientedPathFollow requiert l'activation de la propriété \"Up Vector\" de la "
+"ressource Curve de son Path parent."
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9359,7 +9527,7 @@ msgstr ""
#: scene/3d/scenario_fx.cpp
msgid "WorldEnvironment needs an Environment resource."
-msgstr "L'environnement mondial a besoin d'une ressource environnementale."
+msgstr "WorldEnvironment requiert une ressource de type Environment."
#: scene/3d/scenario_fx.cpp
msgid ""
@@ -9373,24 +9541,23 @@ msgid ""
"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set "
"this environment's Background Mode to Canvas (for 2D scenes)."
msgstr ""
-"Cet WorldEnvironment est ignoré. Ajoutez une caméra (pour les scènes 3D) ou "
-"définissez le mode Background Mode de cet environnement sur Canvas (pour les "
-"scènes 2D)."
+"Ce WorldEnvironment est ignoré. Ajoutez une caméra (pour les scènes 3D) ou "
+"définissez la propriété \"Background Mode\" de cet environnement sur \"Canvas"
+"\" (pour les scènes 2D)."
#: scene/3d/soft_body.cpp
msgid "This body will be ignored until you set a mesh"
-msgstr ""
+msgstr "Ce corps sera ignoré jusqu'à ce que vous définissiez un maillage"
#: scene/3d/soft_body.cpp
-#, fuzzy
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
-"Les changements de taille pour RigidBody (dans les modes caractère ou "
-"rigide) seront remplacés par le moteur physique lors de l'exécution. "
-"Modifiez la taille dans les formes de collision enfants à la place."
+"Les changements de tailles des SoftBody seront suppléés par le moteur "
+"physique lors de l'exécution.\n"
+"Modifiez les tailles dans les formes de collision enfants à la place."
#: scene/3d/sprite_3d.cpp
msgid ""
@@ -9410,46 +9577,46 @@ msgstr ""
#: scene/animation/animation_blend_tree.cpp
msgid "On BlendTree node '%s', animation not found: '%s'"
-msgstr ""
+msgstr "Sur le nœud BlendTree '%s', animation introuvable : '%s'"
#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "Outils d'animation"
+msgstr "Animation introuvable : '%s'"
#: scene/animation/animation_tree.cpp
msgid "In node '%s', invalid animation: '%s'."
-msgstr ""
+msgstr "Dans le nœud '%s', animation non valide : '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "ERREUR : Nom de l'animation invalide !"
+msgstr "Animation invalide : '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "Déconnecter « %s » de « %s »"
+msgstr "Rien n'est connecté à l'entrée '%s' du nœud '%s'."
#: scene/animation/animation_tree.cpp
msgid "A root AnimationNode for the graph is not set."
-msgstr ""
+msgstr "Un AnimationNode racine pour le graphique n'est pas défini."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Path to an AnimationPlayer node containing animations is not set."
msgstr ""
-"Sélectionnez un AnimationPlayer de l'arbre de scène pour modifier les "
-"animations."
+"Le chemin d'accès à un nœud AnimationPlayer contenant des animations n'est "
+"pas défini."
#: scene/animation/animation_tree.cpp
msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
msgstr ""
+"Le chemin défini pour AnimationPlayer ne mène pas à un nœud AnimationPlayer."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "AnimationPlayer root is not a valid node."
-msgstr "L'arbre d'animations est invalide."
+msgstr "La racine AnimationPlayer n'est pas un nœud valide."
+
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr "Ce nœud est désormais déprécié. Utilisez AnimationTree à la place."
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
@@ -9467,10 +9634,6 @@ msgstr "Alerte !"
msgid "Please Confirm..."
msgstr "Veuillez confirmer…"
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr "Sélectionner ce dossier"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9482,14 +9645,19 @@ msgstr ""
"l'édition ne pose pas de problème, mais elles seront cachées lors de "
"l'exécution."
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr "Si exp_edit est vrai min_value doit être > 0."
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
"Use a container as child (VBox,HBox,etc), or a Control and set the custom "
"minimum size manually."
msgstr ""
-"ScrollContainer est destiné à fonctionner avec un contrôle enfant unique. "
-"Utilisez un conteneur comme enfant (VBox, HBox, etc.) ou un contrôle et "
+"ScrollContainer est conçu pour fonctionner avec un unique nœud enfant de "
+"type contrôle.\n"
+"Utilisez un conteneur comme enfant (VBox, HBox, etc.) ou un Control et "
"définissez manuellement la taille minimale personnalisée."
#: scene/gui/tree.cpp
@@ -9533,1552 +9701,51 @@ msgid "Invalid font size."
msgstr "Taille de police invalide."
#: scene/resources/visual_shader.cpp
-#, fuzzy
msgid "Input"
-msgstr "Ajouter une entrée"
-
-#: scene/resources/visual_shader.cpp
-#, fuzzy
-msgid "None"
-msgstr "<Aucun>"
+msgstr "Entrée"
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for shader."
-msgstr "Source invalide !"
+msgstr "Source invalide pour la forme."
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
-msgstr ""
+msgstr "Affectation à la fonction."
#: servers/visual/shader_language.cpp
msgid "Assignment to uniform."
-msgstr ""
+msgstr "Affectation à l'uniforme."
#: servers/visual/shader_language.cpp
msgid "Varyings can only be assigned in vertex function."
-msgstr ""
-
-#~ msgid "Change Scalar Constant"
-#~ msgstr "Modifier une constante scalaire"
-
-#~ msgid "Change Vec Constant"
-#~ msgstr "Modifier une constance vectorielle"
-
-#~ msgid "Change RGB Constant"
-#~ msgstr "Modifier une constante RVB"
-
-#~ msgid "Change Scalar Operator"
-#~ msgstr "Modifier un opérateur scalaire"
-
-#~ msgid "Change Vec Operator"
-#~ msgstr "Modifier un opérateur vectoriel"
-
-#~ msgid "Change Vec Scalar Operator"
-#~ msgstr "Modifier un opérateur vectoriel scalaire"
-
-#~ msgid "Change RGB Operator"
-#~ msgstr "Modifier un opérateur RVB"
-
-#~ msgid "Toggle Rot Only"
-#~ msgstr "Basculer en mode rotation seule"
-
-#~ msgid "Change Scalar Function"
-#~ msgstr "Modifier une fonction scalaire"
-
-#~ msgid "Change Vec Function"
-#~ msgstr "Modifier une fonction vecteur"
-
-#~ msgid "Change Scalar Uniform"
-#~ msgstr "Modifier échelle"
-
-#~ msgid "Change Vec Uniform"
-#~ msgstr "Modifier vecteur"
-
-#~ msgid "Change RGB Uniform"
-#~ msgstr "Modifier RGB"
-
-#~ msgid "Change Default Value"
-#~ msgstr "Changer la valeur par défaut"
-
-#~ msgid "Change XForm Uniform"
-#~ msgstr "Modifier XForm"
-
-#~ msgid "Change Texture Uniform"
-#~ msgstr "Modifier texture"
-
-#~ msgid "Change Cubemap Uniform"
-#~ msgstr "Modifier Cubemap"
-
-#~ msgid "Change Comment"
-#~ msgstr "Modifier un commentaire"
-
-#~ msgid "Add/Remove to Color Ramp"
-#~ msgstr "Ajouter/supprimer de la rampe de couleurs"
-
-#~ msgid "Modify Color Ramp"
-#~ msgstr "Modifier une rampe de couleurs"
-
-#~ msgid "Add/Remove to Curve Map"
-#~ msgstr "Ajouter/supprimer de la carte de courbes"
-
-#~ msgid "Modify Curve Map"
-#~ msgstr "Modifier la carte de courbes"
-
-#~ msgid "Change Input Name"
-#~ msgstr "Changer le nom de l'entrée"
-
-#~ msgid "Connect Graph Nodes"
-#~ msgstr "Connecter les nœuds de graphe"
-
-#~ msgid "Disconnect Graph Nodes"
-#~ msgstr "Déconnecter les nœuds de graphe"
-
-#~ msgid "Remove Shader Graph Node"
-#~ msgstr "Supprimer le nœud de graphe Shader"
-
-#~ msgid "Move Shader Graph Node"
-#~ msgstr "Déplacer le nœud de graphe Shader"
-
-#~ msgid "Duplicate Graph Node(s)"
-#~ msgstr "Dupliquer le(s) nœud(s) de graphe"
-
-#~ msgid "Delete Shader Graph Node(s)"
-#~ msgstr "Effacer le(s) nœud(s) de graphe Shader"
-
-#~ msgid "Error: Cyclic Connection Link"
-#~ msgstr "Erreur: lien de connexion cyclique"
-
-#~ msgid "Error: Missing Input Connections"
-#~ msgstr "Erreur : connexions d'entrée manquantes"
-
-#~ msgid "Add Shader Graph Node"
-#~ msgstr "Ajouter un nœud de graphe Shader"
-
-#~ msgid "Disabled"
-#~ msgstr "Désactivé"
-
-#~ msgid "Move Anim Track Up"
-#~ msgstr "Monter la piste d'animation"
-
-#~ msgid "Move Anim Track Down"
-#~ msgstr "Descendre la piste d'animation"
-
-#~ msgid "Set Transitions to:"
-#~ msgstr "Définir les transitions à :"
-
-#~ msgid "Anim Track Rename"
-#~ msgstr "Renommer la piste d'animation"
-
-#~ msgid "Anim Track Change Interpolation"
-#~ msgstr "Modifier l'interpolation de la piste d'animation"
-
-#~ msgid "Anim Track Change Value Mode"
-#~ msgstr "Modifier le mode de valeur de la piste d'animation"
-
-#~ msgid "Anim Track Change Wrap Mode"
-#~ msgstr "Piste d'Animation Changer Mode de Conclusion"
-
-#~ msgid "Edit Node Curve"
-#~ msgstr "Modifier la courbe du nœud"
-
-#~ msgid "Edit Selection Curve"
-#~ msgstr "Modifier la courbe de sélection"
-
-#~ msgid "Anim Add Key"
-#~ msgstr "Anim Ajouter Clé"
-
-#~ msgid "In"
-#~ msgstr "In"
-
-#~ msgid "Out"
-#~ msgstr "Out"
-
-#~ msgid "In-Out"
-#~ msgstr "In-out"
-
-#~ msgid "Out-In"
-#~ msgstr "Out-in"
-
-#~ msgid "Transitions"
-#~ msgstr "Transitions"
-
-#~ msgid "Change Anim Len"
-#~ msgstr "Changer durée d'animation"
-
-#~ msgid "Change Anim Loop"
-#~ msgstr "Modifier le bouclage de l'animation"
-
-#~ msgid "Anim Create Typed Value Key"
-#~ msgstr "Animation Créer une clé pour une valeur typée"
-
-#~ msgid "Anim Add Call Track"
-#~ msgstr "Anim Ajouter Piste d'Appel"
-
-#~ msgid "Length (s):"
-#~ msgstr "Longueur (s) :"
-
-#~ msgid "Step (s):"
-#~ msgstr "Pas (s) :"
-
-#~ msgid "Cursor step snap (in seconds)."
-#~ msgstr "Pas du curseur (en secondes)."
-
-#~ msgid "Enable/Disable looping in animation."
-#~ msgstr "Activer/Désactiver le bouclage de l'animation."
-
-#~ msgid "Add new tracks."
-#~ msgstr "Ajouter de nouvelles pistes."
-
-#~ msgid "Move current track up."
-#~ msgstr "Déplacer la piste actuelle vers le haut."
-
-#~ msgid "Move current track down."
-#~ msgstr "Déplacer la piste actuelle vers le bas."
-
-#~ msgid "Track tools"
-#~ msgstr "Outils de piste"
-
-#~ msgid "Enable editing of individual keys by clicking them."
-#~ msgstr "Activer la modification de chaque clé en cliquant dessus."
-
-#~ msgid "Key"
-#~ msgstr "Clé"
-
-#~ msgid "Call Functions in Which Node?"
-#~ msgstr "Appeler des fonctions dans quel nœud ?"
-
-#~ msgid "Thanks!"
-#~ msgstr "Merci !"
-
-#~ msgid "I see..."
-#~ msgstr "Je vois…"
-
-#~ msgid "Can't open '%s'."
-#~ msgstr "Impossible d'ouvrir '%s'."
-
-#~ msgid "Ugh"
-#~ msgstr "Oups"
-
-#~ msgid "Run Script"
-#~ msgstr "Lancer le script"
-
-#~ msgid "Save the currently edited resource."
-#~ msgstr "Enregistrer la ressource actuellement modifiée."
-
-#~ msgid "Stop Profiling"
-#~ msgstr "Arrêter le profilage"
-
-#~ msgid "Start Profiling"
-#~ msgstr "Démarrer le profilage"
-
-#~ msgid "Default (Same as Editor)"
-#~ msgstr "Par défaut (le même que l'éditeur)"
-
-#~ msgid "Create new animation in player."
-#~ msgstr "Créer une nouvelle animation dans le lecteur."
-
-#~ msgid "Load animation from disk."
-#~ msgstr "Charger une animation depuis le disque."
-
-#~ msgid "Load an animation from disk."
-#~ msgstr "Charger une animation depuis le disque."
-
-#~ msgid "Save the current animation"
-#~ msgstr "Enregistrer l'animation actuelle"
-
-#~ msgid "Edit Target Blend Times"
-#~ msgstr "Modifier les temps de mélange de la cible"
-
-#~ msgid "Copy Animation"
-#~ msgstr "Copier l'animation"
-
-#~ msgid "Fetching:"
-#~ msgstr "Récupération:"
-
-#~ msgid "prev"
-#~ msgstr "préc"
-
-#~ msgid "next"
-#~ msgstr "suiv"
-
-#~ msgid "last"
-#~ msgstr "dern"
-
-#~ msgid "Edit IK Chain"
-#~ msgstr "Modifier la chaîne IK"
-
-#~ msgid "Drag pivot from mouse position"
-#~ msgstr "Déplacer le point de pivot à la position de la souris"
-
-#~ msgid "Set pivot at mouse position"
-#~ msgstr "Placer le pivot sur la position de la souris"
-
-#~ msgid "Add/Remove Color Ramp Point"
-#~ msgstr "Ajouter/supprimer un point de rampe de couleur"
-
-#~ msgid "OK :("
-#~ msgstr "OK :("
-
-#~ msgid "Skeleton Gizmo visibility"
-#~ msgstr "Visibilité squelette Gizmo"
-
-#~ msgid "StyleBox Preview:"
-#~ msgstr "Aperçu de la StyleBox :"
-
-#~ msgid "StyleBox"
-#~ msgstr "StyleBox"
-
-#~ msgid "Separation:"
-#~ msgstr "Séparation :"
-
-#~ msgid "Texture Region Editor"
-#~ msgstr "Éditeur de région de texture"
-
-#~ msgid "Erase selection"
-#~ msgstr "Supprimer la sélection"
-
-#~ msgid "Could not find tile:"
-#~ msgstr "Impossible de trouver la tuile :"
-
-#~ msgid "Item name or ID:"
-#~ msgstr "Nom d'item ou ID :"
-
-#~ msgid "Autotiles"
-#~ msgstr "Autotiles"
-
-#~ msgid "Export templates for this platform are missing/corrupted: "
-#~ msgstr ""
-#~ "Modèles d'exportation manquants ou corrompus pour cette plateforme : "
-
-#~ msgid "Button 7"
-#~ msgstr "Bouton 7"
-
-#~ msgid "Button 8"
-#~ msgstr "Bouton 8"
-
-#~ msgid "Button 9"
-#~ msgstr "Bouton 9"
-
-#~ msgid "Discard Instancing"
-#~ msgstr "Abandonner l'instanciation"
-
-#~ msgid "Makes Sense!"
-#~ msgstr "C'est sensé !"
-
-#~ msgid "Clear!"
-#~ msgstr "Effacer !"
-
-#~ msgid "Toggle Spatial Visible"
-#~ msgstr "Afficher/cacher le Spatial"
-
-#~ msgid "Toggle CanvasItem Visible"
-#~ msgstr "Afficher/cacher le CanvasItem"
-
-#~ msgid "Condition"
-#~ msgstr "Condition"
-
-#~ msgid "Sequence"
-#~ msgstr "Séquence"
-
-#~ msgid "Switch"
-#~ msgstr "Switch"
-
-#~ msgid "Iterator"
-#~ msgstr "Itérateur"
-
-#~ msgid "While"
-#~ msgstr "Tant que"
-
-#~ msgid "Return"
-#~ msgstr "Retour"
-
-#~ msgid "Call"
-#~ msgstr "Appel"
-
-#~ msgid "Edit Variable"
-#~ msgstr "Editerr la variable :"
-
-#~ msgid "Edit Signal"
-#~ msgstr "Editer signal :"
-
-#~ msgid "Invalid action (anything goes but '/' or ':')."
-#~ msgstr "Action invalide (tout passe, sauf « / » ou « : »)."
-
-#~ msgid "Can't contain '/' or ':'"
-#~ msgstr "Ne peut pas contenir de '/' ou ':'"
-
-#~ msgid ""
-#~ "Invalid version.txt format inside templates. Revision is not a valid "
-#~ "identifier."
-#~ msgstr ""
-#~ "Format de version.txt invalide dans les modèles. Revision n'est pas un "
-#~ "identifiant valide."
-
-#~ msgid "Can't write file."
-#~ msgstr "Impossible d'écrire le fichier."
-
-#~ msgid "Couldn't get project.godot in project path."
-#~ msgstr ""
-#~ "Impossible de trouver le fichier project.godot dans le chemin du projet."
-
-#~ msgid "Couldn't get project.godot in the project path."
-#~ msgstr ""
-#~ "Impossible de trouver le fichier project.godot dans le chemin du projet."
-
-#~ msgid "Not found!"
-#~ msgstr "Non trouvé !"
-
-#~ msgid "Replace By"
-#~ msgstr "Remplacer par"
-
-#~ msgid "Case Sensitive"
-#~ msgstr "Sensible à la casse"
-
-#~ msgid "Backwards"
-#~ msgstr "À l'envers"
-
-#~ msgid "Prompt On Replace"
-#~ msgstr "Avertir lors du remplacement"
-
-#~ msgid "Skip"
-#~ msgstr "Passer"
-
-#~ msgid ""
-#~ "Your project will be created in a non empty folder (you might want to "
-#~ "create a new folder)."
-#~ msgstr ""
-#~ "Votre projet sera créé dans un dossier non-vide (vous pourriez avoir "
-#~ "besoin de créer un nouveau dossier)."
-
-#~ msgid "That's a BINGO!"
-#~ msgstr "C'est un BINGO !"
-
-#~ msgid "preview"
-#~ msgstr "Aperçu"
-
-#~ msgid "Move Add Key"
-#~ msgstr "Mouvement Ajouter une clé"
-
-#~ msgid "Create Subscription"
-#~ msgstr "Créer une connexion"
-
-#~ msgid "List:"
-#~ msgstr "Liste :"
-
-#~ msgid "Set Emission Mask"
-#~ msgstr "Définir le masque d'émission"
-
-#~ msgid "Clear Emitter"
-#~ msgstr "Effacer l'Émetteur"
-
-#~ msgid "Fold Line"
-#~ msgstr "Masquer la ligne"
-
-#~ msgid " "
-#~ msgstr " "
-
-#~ msgid "Sections:"
-#~ msgstr "Sections :"
-
-#~ msgid "Cannot navigate to '"
-#~ msgstr "Ne peux pas acceder à '"
-
-#~ msgid ""
-#~ "\n"
-#~ "Source: "
-#~ msgstr ""
-#~ "\n"
-#~ "Source : "
-
-#~ msgid "Remove Point from Line2D"
-#~ msgstr "Supprimer point de Line2D"
-
-#~ msgid "Add Point to Line2D"
-#~ msgstr "Ajouter point à Line2D"
-
-#~ msgid "Move Point in Line2D"
-#~ msgstr "Déplacer point de Line2D"
-
-#~ msgid "Split Segment (in line)"
-#~ msgstr "Diviser le segment (dans la ligne)"
-
-#~ msgid "Meta+"
-#~ msgstr "Méta+"
-
-#~ msgid "Setting '"
-#~ msgstr "Paramètre"
-
-#~ msgid "Remote Inspector"
-#~ msgstr "Inspecteur distant"
-
-#~ msgid "Live Scene Tree:"
-#~ msgstr "Arbre des scènes en direct :"
-
-#~ msgid "Remote Object Properties: "
-#~ msgstr "Propriétés de l'objet distant : "
-
-#, fuzzy
-#~ msgid "Prev Level (%sDown Wheel)"
-#~ msgstr "Niveau de prévisualisation ("
-
-#, fuzzy
-#~ msgid "Next Level (%sUp Wheel)"
-#~ msgstr "Niveau suivant ("
-
-#~ msgid "Selection -> Duplicate"
-#~ msgstr "Sélection -> Dupliquer"
-
-#~ msgid "Selection -> Clear"
-#~ msgstr "Sélection -> Effacer"
-
-#~ msgid ""
-#~ "Path property must point to a valid Viewport node to work. Such Viewport "
-#~ "must be set to 'render target' mode."
-#~ msgstr ""
-#~ "La propriété Path doit pointer vers un nœud de type Viewport valide pour "
-#~ "fonctionner. Ce Viewport doit utiliser le mode « render target »."
-
-#~ msgid ""
-#~ "The Viewport set in the path property must be set as 'render target' in "
-#~ "order for this sprite to work."
-#~ msgstr ""
-#~ "Le Viewport défini dans la propriété Path doit utiliser le mode « render "
-#~ "target » pour que cette sprite fonctionne."
-
-#~ msgid "' parsing of config failed."
-#~ msgstr "L'analyse de la configuration a échoué."
-
-#~ msgid "Method List For '%s':"
-#~ msgstr "Liste des méthodes pour « %s » :"
-
-#~ msgid "Arguments:"
-#~ msgstr "Paramètres :"
-
-#~ msgid "Return:"
-#~ msgstr "Retourne :"
-
-#~ msgid "Added:"
-#~ msgstr "Ajouté :"
-
-#~ msgid "Removed:"
-#~ msgstr "Supprimé :"
-
-#~ msgid "Could not save atlas subtexture:"
-#~ msgstr "Impossible d'enregistrer la sous-texture atlas :"
-
-#~ msgid "Exporting for %s"
-#~ msgstr "Exportation pour %s"
-
-#~ msgid "Setting Up..."
-#~ msgstr "Configuration…"
-
-#~ msgid "Error loading scene."
-#~ msgstr "Erreur lors du chargement de la scène."
-
-#~ msgid "Re-Import"
-#~ msgstr "Ré-importer"
-
-#~ msgid "Please wait for scan to complete."
-#~ msgstr "Veuillez attendre la fin du scan."
-
-#~ msgid "Current scene must be saved to re-import."
-#~ msgstr ""
-#~ "La scène actuelle doit être enregistrée afin de pouvoir ré-importer."
-
-#~ msgid "Re-Importing"
-#~ msgstr "Ré-importation"
-
-#~ msgid "Re-Import Changed Resources"
-#~ msgstr "Ré-importer les ressources modifiées"
-
-#~ msgid "Loading Export Templates"
-#~ msgstr "Chargement des modèles d'exportation"
-
-#~ msgid ""
-#~ "\n"
-#~ "Status: Needs Re-Import"
-#~ msgstr ""
-#~ "\n"
-#~ "Statut: Réimportation nécessaire"
-
-#~ msgid "Same source and destination files, doing nothing."
-#~ msgstr "Fichiers source et destination identiques, rien à faire."
-
-#~ msgid "Target file exists, can't overwrite. Delete first."
-#~ msgstr ""
-#~ "Le fichier cible existe et ne peut être réécrit. Supprimez le d'abord."
-
-#~ msgid "Same source and destination paths, doing nothing."
-#~ msgstr "Chemins source et destination identiques, rien à faire."
-
-#~ msgid "Can't move directories to within themselves."
-#~ msgstr "Impossible de déplacer des répertoires vers eux-mêmes."
-
-#~ msgid "Can't rename deps for:\n"
-#~ msgstr "Impossible de renommer dependances pour :\n"
-
-#~ msgid "Pick New Name and Location For:"
-#~ msgstr "Entrez un nouveau nom et chemin pour :"
-
-#~ msgid "No files selected!"
-#~ msgstr "Pas de fichiers sélectionnés !"
-
-#~ msgid "Info"
-#~ msgstr "Information"
-
-#~ msgid "Re-Import..."
-#~ msgstr "Ré-importer…"
-
-#~ msgid "No bit masks to import!"
-#~ msgstr "Pas de masques de bits à importer !"
-
-#~ msgid "Target path is empty."
-#~ msgstr "Le chemin de destination est vide."
-
-#~ msgid "Target path must be a complete resource path."
-#~ msgstr ""
-#~ "Le chemin de destination doit être un chemin complet vers une ressource."
-
-#~ msgid "Target path must exist."
-#~ msgstr "Le chemin de destination doit exister."
-
-#~ msgid "Import BitMasks"
-#~ msgstr "Importer des BitMasks"
-
-#~ msgid "Source Texture(s):"
-#~ msgstr "Texture(s) source :"
-
-#~ msgid "Target Path:"
-#~ msgstr "Chemin de destination :"
-
-#~ msgid "Accept"
-#~ msgstr "Accepter"
-
-#~ msgid "Bit Mask"
-#~ msgstr "Masque de bits"
-
-#~ msgid "No source font file!"
-#~ msgstr "Pas de fichier de police source !"
-
-#~ msgid "No target font resource!"
-#~ msgstr "Pas de ressource de police de destination !"
-
-#~ msgid ""
-#~ "Invalid file extension.\n"
-#~ "Please use .font."
-#~ msgstr ""
-#~ "Extension de fichier invalide.\n"
-#~ "Veuillez utiliser .font."
-
-#~ msgid "Couldn't save font."
-#~ msgstr "Impossible d'enregistrer la police."
-
-#~ msgid "Source Font:"
-#~ msgstr "Police source :"
-
-#~ msgid "Source Font Size:"
-#~ msgstr "Taille de la police source :"
-
-#~ msgid "Dest Resource:"
-#~ msgstr "Ressource de destination :"
-
-#~ msgid "The quick brown fox jumps over the lazy dog."
-#~ msgstr "Voix ambiguë d'un cœur qui, au zéphyr, préfère les jattes de kiwis."
-
-#~ msgid "Test:"
-#~ msgstr "Test :"
-
-#~ msgid "Options:"
-#~ msgstr "Options :"
-
-#~ msgid "Font Import"
-#~ msgstr "Importation d'une police"
-
-#~ msgid ""
-#~ "This file is already a Godot font file, please supply a BMFont type file "
-#~ "instead."
-#~ msgstr ""
-#~ "Ce fichier est déjà un fichier de police Godot, veuillez fournir un "
-#~ "fichier de type BMFont à la place."
-
-#~ msgid "Failed opening as BMFont file."
-#~ msgstr "Impossible d'ouvrir le fichier en tant que fichier BMFont."
-
-#~ msgid "Invalid font custom source."
-#~ msgstr "Source personnalisée de police invalide."
-
-#~ msgid "No meshes to import!"
-#~ msgstr "Pas de maillages à importer !"
-
-#~ msgid "Single Mesh Import"
-#~ msgstr "Importer un maillage"
-
-#~ msgid "Source Mesh(es):"
-#~ msgstr "Maillage(s) source :"
-
-#~ msgid "Surface %d"
-#~ msgstr "Surface %d"
-
-#~ msgid "No samples to import!"
-#~ msgstr "Pas d'échantillons à importer !"
-
-#~ msgid "Import Audio Samples"
-#~ msgstr "Importer des échantillons audio"
-
-#~ msgid "Source Sample(s):"
-#~ msgstr "Échantillon(s) source :"
-
-#~ msgid "Audio Sample"
-#~ msgstr "Échantillon audio"
-
-#~ msgid "New Clip"
-#~ msgstr "Nouvelle séquence"
-
-#~ msgid "Flags"
-#~ msgstr "Drapeaux"
-
-#~ msgid "Bake FPS:"
-#~ msgstr "FPS de calcul :"
-
-#~ msgid "Optimizer"
-#~ msgstr "Optimiseur"
-
-#~ msgid "Max Linear Error"
-#~ msgstr "Erreur linéaire maximale"
-
-#~ msgid "Max Angular Error"
-#~ msgstr "Erreur angulaire maximale"
-
-#~ msgid "Max Angle"
-#~ msgstr "Angle maximal"
-
-#~ msgid "Start(s)"
-#~ msgstr "Départ(s)"
-
-#~ msgid "Filters"
-#~ msgstr "Filtres"
-
-#~ msgid "Source path is empty."
-#~ msgstr "Le chemin source est vide."
-
-#~ msgid "Couldn't load post-import script."
-#~ msgstr "Impossible de charger le script de post-importation."
-
-#~ msgid "Invalid/broken script for post-import."
-#~ msgstr "Script invalide ou cassé de post-importation."
-
-#~ msgid "Error importing scene."
-#~ msgstr "Erreur à l'importation de la scène."
-
-#~ msgid "Import 3D Scene"
-#~ msgstr "Importer une scène 3D"
-
-#~ msgid "Source Scene:"
-#~ msgstr "Scène source :"
-
-#~ msgid "Same as Target Scene"
-#~ msgstr "Identique à la scène de destination"
-
-#~ msgid "Shared"
-#~ msgstr "Partagé"
-
-#~ msgid "Target Texture Folder:"
-#~ msgstr "Dossier de destination des textures :"
-
-#~ msgid "Custom Root Node Type:"
-#~ msgstr "Type de nœud racine personnalisé :"
-
-#~ msgid "Auto"
-#~ msgstr "Auto."
-
-#~ msgid "The Following Files are Missing:"
-#~ msgstr "Les fichiers suivants sont manquants :"
-
-#~ msgid "Import Anyway"
-#~ msgstr "Importer quand même"
-
-#~ msgid "Edited scene has not been saved, open imported scene anyway?"
-#~ msgstr ""
-#~ "La scène modifiée actuellement n'a pas été enregistrée, ouvrir la scène "
-#~ "importée quand même ?"
-
-#~ msgid "Import Image:"
-#~ msgstr "Importer une image :"
-
-#~ msgid "Couldn't localize path: %s (already local)"
-#~ msgstr "Impossible de rendre le chemin local : %s (déjà local)"
-
-#~ msgid "3D Scene Animation"
-#~ msgstr "Animation de scène 3D"
-
-#~ msgid "Uncompressed"
-#~ msgstr "Non compressé"
-
-#~ msgid "Compress Lossless (PNG)"
-#~ msgstr "Compression sans perte (PNG)"
-
-#~ msgid "Compress Lossy (WebP)"
-#~ msgstr "Compression avec perte (WebP)"
-
-#~ msgid "Compress (VRAM)"
-#~ msgstr "Compression GPU (VRAM)"
-
-#~ msgid "Texture Format"
-#~ msgstr "Format de texture"
-
-#~ msgid "Texture Compression Quality (WebP):"
-#~ msgstr "Qualité de compression de la texture (WebP) :"
-
-#~ msgid "Texture Options"
-#~ msgstr "Options de texture"
-
-#~ msgid "Please specify some files!"
-#~ msgstr "Veuillez spécifier des fichiers !"
-
-#~ msgid "At least one file needed for Atlas."
-#~ msgstr "Il faut au moins un fichier pour créer un atlas."
-
-#~ msgid "Error importing:"
-#~ msgstr "Erreur d'importation :"
-
-#~ msgid "Only one file is required for large texture."
-#~ msgstr "Un seul fichier est nécessaire pour créer une grande texture."
-
-#~ msgid "Max Texture Size:"
-#~ msgstr "Taille de texture maximale :"
-
-#~ msgid "Import Textures for Atlas (2D)"
-#~ msgstr "Importer des textures pour un atlas (2D)"
-
-#~ msgid "Large Texture"
-#~ msgstr "Grande texture"
-
-#~ msgid "Import Large Textures (2D)"
-#~ msgstr "Importer des grandes textures (2D)"
-
-#~ msgid "Source Texture"
-#~ msgstr "Texture source"
-
-#~ msgid "Base Atlas Texture"
-#~ msgstr "Texture d'atlas de base"
-
-#~ msgid "Source Texture(s)"
-#~ msgstr "Texture(s) source"
-
-#~ msgid "Import Textures for 2D"
-#~ msgstr "Importer des textures pour la 2D"
-
-#~ msgid "Import Textures for 3D"
-#~ msgstr "Importer des textures pour la 3D"
-
-#~ msgid "Import Textures"
-#~ msgstr "Importer des textures"
-
-#~ msgid "2D Texture"
-#~ msgstr "Texture 2D"
-
-#~ msgid "3D Texture"
-#~ msgstr "Texture 3D"
-
-#~ msgid "Atlas Texture"
-#~ msgstr "Texture atlas"
-
-#~ msgid ""
-#~ "NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files "
-#~ "to the project."
-#~ msgstr ""
-#~ "REMARQUE : L'import de textures 2D n'est pas obligatoire. Copiez "
-#~ "directement les fichiers PNG ou JPEG dans le projet."
-
-#~ msgid "Crop empty space."
-#~ msgstr "Rogner l'espace vide."
-
-#~ msgid "Texture"
-#~ msgstr "Texture"
-
-#~ msgid "Import Large Texture"
-#~ msgstr "Importer une grande texture"
-
-#~ msgid "Load Source Image"
-#~ msgstr "Charger une image source"
-
-#~ msgid "Slicing"
-#~ msgstr "Découpage"
-
-#~ msgid "Saving"
-#~ msgstr "Enregistrement"
-
-#~ msgid "Couldn't save large texture:"
-#~ msgstr "Impossible d'enregistrer la grande texture :"
-
-#~ msgid "Build Atlas For:"
-#~ msgstr "Construire l'atlas pour :"
-
-#~ msgid "Loading Image:"
-#~ msgstr "Chargement de l'image :"
-
-#~ msgid "Couldn't load image:"
-#~ msgstr "Impossible de charger l'image :"
-
-#~ msgid "Converting Images"
-#~ msgstr "Conversion des images"
-
-#~ msgid "Cropping Images"
-#~ msgstr "Rognage des images"
-
-#~ msgid "Couldn't save atlas image:"
-#~ msgstr "Impossible d'enregistrer l'image d'atlas :"
-
-#~ msgid "Couldn't save converted texture:"
-#~ msgstr "Impossible d'enregistrer la texture convertie :"
-
-#~ msgid "Invalid translation source!"
-#~ msgstr "Source de traduction invalide !"
-
-#~ msgid "Column"
-#~ msgstr "Colonne"
-
-#~ msgid "No items to import!"
-#~ msgstr "Pas d'objets à importer !"
-
-#~ msgid "No target path!"
-#~ msgstr "Pas de chemin de destination !"
-
-#~ msgid "Import Translations"
-#~ msgstr "Importer des traductions"
-
-#~ msgid "Couldn't import!"
-#~ msgstr "Impossible d'importer !"
-
-#~ msgid "Import Translation"
-#~ msgstr "Importer une traduction"
-
-#~ msgid "Source CSV:"
-#~ msgstr "CSV source :"
-
-#~ msgid "Ignore First Row"
-#~ msgstr "Ignorer la première ligne"
-
-#~ msgid "Compress"
-#~ msgstr "Compresser"
-
-#~ msgid "Add to Project (project.godot)"
-#~ msgstr "Ajouter au projet (project.godot)"
-
-#~ msgid "Import Languages:"
-#~ msgstr "Importer les langues :"
-
-#~ msgid "Translation"
-#~ msgstr "Traduction"
-
-#~ msgid "Triangle #"
-#~ msgstr "Triangle #"
-
-#~ msgid "Light Baker Setup:"
-#~ msgstr "Paramètres du calculateur d'éclairage :"
-
-#~ msgid "Fixing Lights"
-#~ msgstr "Correction des lumières"
-
-#~ msgid "Making BVH"
-#~ msgstr "Création du BVH"
-
-#~ msgid "Allocating Texture #"
-#~ msgstr "Allocation de la texture #"
-
-#~ msgid "Baking Triangle #"
-#~ msgstr "Calcul de la texture #"
-
-#~ msgid "Post-Processing Texture #"
-#~ msgstr "Post-traitement de la texture #"
-
-#~ msgid "Reset the lightmap octree baking process (start over)."
-#~ msgstr ""
-#~ "Remettre le processus de calcul de l'éclairage à zéro (recommencer)."
-
-#~ msgid "Zoom Set..."
-#~ msgstr "Définir le zoom…"
-
-#~ msgid "Set a Value"
-#~ msgstr "Définir une valeur"
-
-#~ msgid "Parse BBCode"
-#~ msgstr "Analyser le BBCode"
-
-#~ msgid "Length:"
-#~ msgstr "Longueur :"
-
-#~ msgid "Open Sample File(s)"
-#~ msgstr "Ouvrir un ou des fichiers d'échantillons"
-
-#~ msgid "ERROR: Couldn't load sample!"
-#~ msgstr "ERREUR : Impossible de charger l'échantillon !"
-
-#~ msgid "Add Sample"
-#~ msgstr "Ajouter un échantillon"
-
-#~ msgid "Rename Sample"
-#~ msgstr "Renommer l'échantillon"
-
-#~ msgid "Delete Sample"
-#~ msgstr "Supprimer l'échantillon"
-
-#~ msgid "16 Bits"
-#~ msgstr "16 bits"
-
-#~ msgid "8 Bits"
-#~ msgstr "8 bits"
-
-#~ msgid "Stereo"
-#~ msgstr "Stéréo"
-
-#~ msgid "Pitch"
-#~ msgstr "Hauteur"
-
-#~ msgid "Window"
-#~ msgstr "Fenêtre"
-
-#~ msgid "Move Right"
-#~ msgstr "Aller à droite"
-
-#~ msgid "Scaling to %s%%."
-#~ msgstr "Mise à l'échelle %s%%."
-
-#~ msgid "Up"
-#~ msgstr "Haut"
-
-#~ msgid "Down"
-#~ msgstr "Bas"
-
-#~ msgid "Bucket"
-#~ msgstr "Seau"
-
-#~ msgid "Invalid project path, the path must exist!"
-#~ msgstr "Chemin de projet invalide, le chemin doit exister !"
-
-#~ msgid "Invalid project path, project.godot must not exist."
-#~ msgstr "Chemin de projet invalide, project.godot ne doit pas exister."
-
-#~ msgid "Invalid project path, project.godot must exist."
-#~ msgstr "Chemin de projet invalide, project.godot doit exister."
-
-#~ msgid "Project Path (Must Exist):"
-#~ msgstr "Chemin du projet (doit exister) :"
-
-#~ msgid "Create New Resource"
-#~ msgstr "Créer une nouvelle ressource"
-
-#~ msgid "Open Resource"
-#~ msgstr "Ouvrir la ressource"
-
-#~ msgid "Save Resource"
-#~ msgstr "Enregistrer la ressource"
-
-#~ msgid "Resource Tools"
-#~ msgstr "Outils des ressources"
-
-#~ msgid "Edit Groups"
-#~ msgstr "Modifier les groupes"
-
-#~ msgid "GridMap Paint"
-#~ msgstr "Peinture de GridMap"
-
-#~ msgid "Tiles"
-#~ msgstr "Tuiles"
-
-#~ msgid "Areas"
-#~ msgstr "Aires"
-
-#~ msgid "Ctrl+"
-#~ msgstr "Ctrl+"
-
-#~ msgid "Down Wheel)"
-#~ msgstr "Roue descendante)"
-
-#~ msgid "Up Wheel)"
-#~ msgstr "Roue ascendante)"
-
-#~ msgid "Close scene? (Unsaved changes will be lost)"
-#~ msgstr ""
-#~ "Fermer la scène ? (les modifications non sauvegardées seront perdues)"
-
-#~ msgid ""
-#~ "Open Project Manager? \n"
-#~ "(Unsaved changes will be lost)"
-#~ msgstr ""
-#~ "Ouvrir le gestionnaire de projets ?\n"
-#~ "(les modifications non sauvegardées seront perdues)"
-
-#~ msgid "Close Goto Prev. Scene"
-#~ msgstr "Fermer, aller à la scène précédente"
-
-#~ msgid "Del"
-#~ msgstr "Supprimer"
-
-#~ msgid "just pressed"
-#~ msgstr "vient d'être appuyé"
-
-#~ msgid "just released"
-#~ msgstr "vient d'être relâché"
-
-#, fuzzy
-#~ msgid ""
-#~ "Couldn't read the certificate file. Are the path and password both "
-#~ "correct?"
-#~ msgstr ""
-#~ "Le fichier certificat n'a pas pu être lu. Le chemin et le mot de passe "
-#~ "sont-ils tous deux corrects ?"
-
-#~ msgid "Error creating the signature object."
-#~ msgstr "Erreur en créant la signature de l'objet."
-
-#~ msgid "Error creating the package signature."
-#~ msgstr "Erreur en créant la signature du paquet."
-
-#~ msgid ""
-#~ "No export templates found.\n"
-#~ "Download and install export templates."
-#~ msgstr ""
-#~ "Aucun modèle d'export n'a été trouvé.\n"
-#~ "Téléchargez et installez des modèles d'export."
-
-#~ msgid "Custom debug package not found."
-#~ msgstr "Le paquet personnalisé de débogage n'a pas été trouvé."
-
-#~ msgid "Custom release package not found."
-#~ msgstr "Le paquet personnalisé de parution n'a pas été trouvé."
-
-#~ msgid "Invalid unique name."
-#~ msgstr "Nom unique invalide."
-
-#~ msgid "Invalid product GUID."
-#~ msgstr "GUID de produit invalide."
-
-#~ msgid "Invalid publisher GUID."
-#~ msgstr "GUID d'éditeur invalide."
-
-#~ msgid "Invalid background color."
-#~ msgstr "Couleur d'arrière-plan invalide."
-
-#~ msgid "Invalid Store Logo image dimensions (should be 50x50)."
-#~ msgstr "Dimensions de l'image incorrectes (devraient être 50x50)."
-
-#~ msgid "Invalid square 44x44 logo image dimensions (should be 44x44)."
-#~ msgstr ""
-#~ "Dimensions d'image de logo carré 44x44 invalides (devraient être 44x44)."
-
-#~ msgid "Invalid square 71x71 logo image dimensions (should be 71x71)."
-#~ msgstr ""
-#~ "Dimensions d'image de logo carré 71x71 invalides (devraient être 71x71)."
-
-#~ msgid "Invalid square 150x150 logo image dimensions (should be 150x150)."
-#~ msgstr ""
-#~ "Dimensions d'image de logo carré 150x150 invalides (devraient être "
-#~ "150x150)."
-
-#~ msgid "Invalid square 310x310 logo image dimensions (should be 310x310)."
-#~ msgstr ""
-#~ "Dimensions d'image de logo carré 310x310 invalides (devraient être "
-#~ "310x310)."
-
-#~ msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)."
-#~ msgstr ""
-#~ "Dimensions d'image de logo large 310x150 invalides (devraient être "
-#~ "310x150)."
-
-#~ msgid "Invalid splash screen image dimensions (should be 620x300)."
-#~ msgstr ""
-#~ "Dimensions d'image d'écran de démarrage invalides (devraient être "
-#~ "620x300)."
-
-#, fuzzy
-#~ msgid "RAW Mode"
-#~ msgstr "Mode d'exécution :"
-
-#~ msgid "Node From Scene"
-#~ msgstr "Nœud à partir d'une scène"
-
-#~ msgid "Import assets to the project."
-#~ msgstr "Importer des ressources dans le projet."
-
-#~ msgid "Export the project to many platforms."
-#~ msgstr "Exporter le projet vers diverses plate-formes."
-
-#~ msgid "Alerts when an external resource has changed."
-#~ msgstr "Alerte lorsqu'une ressource externe a été modifiée."
-
-#~ msgid "Open https://godotengine.org at tutorials section."
-#~ msgstr "Ouvre https://godotengine.org dans la section des tutoriels."
-
-#~ msgid "No scene selected to instance!"
-#~ msgstr "Pas de scène sélectionnée à instancier !"
-
-#~ msgid "Instance at Cursor"
-#~ msgstr "Instancier sur le cursuer"
-
-#~ msgid "Could not instance scene!"
-#~ msgstr "Impossible d'instancier la scène !"
-
-#~ msgid "Use Default Light"
-#~ msgstr "Utiliser la lumière par défaut"
-
-#~ msgid "Use Default sRGB"
-#~ msgstr "Utiliser sRGB par défaut"
-
-#~ msgid "Default Light Normal:"
-#~ msgstr "Normale de l'éclairage par défaut :"
-
-#~ msgid "Ambient Light Color:"
-#~ msgstr "Couleur de l'éclairage ambient :"
-
-#~ msgid "Invalid parent class name"
-#~ msgstr "Nom de classe parent invalide"
-
-#~ msgid "Valid chars:"
-#~ msgstr "Caractères valides :"
-
-#~ msgid "Valid name"
-#~ msgstr "Nom valide"
-
-#~ msgid "Class name is invalid!"
-#~ msgstr "Le nom de classe est invalide !"
-
-#~ msgid "Parent class name is invalid!"
-#~ msgstr "Le nom de classe parent est invalide !"
-
-#~ msgid "Path property must point to a valid Particles2D node to work."
-#~ msgstr ""
-#~ "La propriété Path doit pointer à un nœud de type Particles2D valide pour "
-#~ "fonctionner."
-
-#~ msgid "Surface"
-#~ msgstr "Surface"
-
-#~ msgid ""
-#~ "A SampleLibrary resource must be created or set in the 'samples' property "
-#~ "in order for SamplePlayer to play sound."
-#~ msgstr ""
-#~ "Une ressource SampleLibrary doit être créée ou définie dans la propriété "
-#~ "\"échantillon\" pour que le SamplePlayer puisse jouer un son."
-
-#~ msgid ""
-#~ "A SampleLibrary resource must be created or set in the 'samples' property "
-#~ "in order for SpatialSamplePlayer to play sound."
-#~ msgstr ""
-#~ "Une ressource de type SampleLibrary doit être créée ou définie dans la "
-#~ "propriété « samples » afin que le SpatialSamplePlayer joue des sons."
-
-#~ msgid "Replaced %d Ocurrence(s)."
-#~ msgstr "%d occurrence(s) remplacée(s)."
-
-#~ msgid "Save Translatable Strings"
-#~ msgstr "Enregistrer les chaînes traduisibles"
-
-#~ msgid "Edit Script Options"
-#~ msgstr "Modifier les options du script"
-
-#~ msgid "Error exporting project!"
-#~ msgstr "Erreur d'exportation du projet !"
-
-#~ msgid "Error writing the project PCK!"
-#~ msgstr "Erreur d'écriture du PCK du projet !"
-
-#~ msgid "No exporter for platform '%s' yet."
-#~ msgstr "Pas d'exportateur pour la plate-forme « %s » actuellement."
-
-#, fuzzy
-#~ msgid "Create Android keystore"
-#~ msgstr "Créer une nouvelle ressource"
-
-#, fuzzy
-#~ msgid "Full name"
-#~ msgstr "Nom valide"
-
-#~ msgid "Organizational unit"
-#~ msgstr "Unité d'organisation"
-
-#, fuzzy
-#~ msgid "Organization"
-#~ msgstr "Transition"
-
-#~ msgid "City"
-#~ msgstr "Ville"
-
-#, fuzzy
-#~ msgid "State"
-#~ msgstr "État :"
-
-#~ msgid "2 letter country code"
-#~ msgstr "Code de pays à 2 lettres"
-
-#, fuzzy
-#~ msgid "Password"
-#~ msgstr "Mot de passe :"
-
-#, fuzzy
-#~ msgid "at least 6 characters"
-#~ msgstr "Caractères valides :"
-
-#, fuzzy
-#~ msgid "File name"
-#~ msgstr "Nouveau nom :"
-
-#~ msgid "Include"
-#~ msgstr "Inclure"
-
-#~ msgid "Group name can't be empty!"
-#~ msgstr "Le nom du groupe ne peut pas être vide !"
-
-#~ msgid "Invalid character in group name!"
-#~ msgstr "Caractère invalide dans le nom du groupe !"
-
-#~ msgid "Add Image Group"
-#~ msgstr "Ajouter un groupe d'images"
-
-#~ msgid "Delete Image Group"
-#~ msgstr "Supprimer le groupe d'images"
-
-#~ msgid "Project Export Settings"
-#~ msgstr "Paramètres d'exportation du projet"
-
-#~ msgid "Target"
-#~ msgstr "Cible"
-
-#~ msgid "Export to Platform"
-#~ msgstr "Exporter vers la plate-forme"
-
-#~ msgid "Export all files in the project directory."
-#~ msgstr "Exporter tous les fichiers dans le répertoire du projet."
-
-#~ msgid "Convert text scenes to binary on export."
-#~ msgstr ""
-#~ "Convertir les scènes en format texte au format binaire à l'exportation."
-
-#~ msgid "Images"
-#~ msgstr "Images"
-
-#~ msgid "Keep Original"
-#~ msgstr "Garder les originaux"
-
-#~ msgid "Compress for Disk (Lossy, WebP)"
-#~ msgstr "Compression pour le disque (avec perte, WebP)"
-
-#~ msgid "Compress for RAM (BC/PVRTC/ETC)"
-#~ msgstr "Compression pour la RAM (BC/PVRTC/ETC)"
-
-#~ msgid "Convert Images (*.png):"
-#~ msgstr "Convertir les images (*.png) :"
-
-#~ msgid "Compress for Disk (Lossy) Quality:"
-#~ msgstr "Qualité de la compression pour le disque (avec perte) :"
-
-#~ msgid "Shrink All Images:"
-#~ msgstr "Réduire toutes les images :"
-
-#~ msgid "Compress Formats:"
-#~ msgstr "Compresser les formats :"
-
-#~ msgid "Groups:"
-#~ msgstr "Groupes :"
-
-#~ msgid "Compress Disk"
-#~ msgstr "Compression pour le disque"
-
-#~ msgid "Compress RAM"
-#~ msgstr "Compression pour la RAM"
-
-#~ msgid "Compress Mode:"
-#~ msgstr "Mode de compression :"
-
-#~ msgid "Lossy Quality:"
-#~ msgstr "Qualité de compression avec perte :"
-
-#~ msgid "Atlas:"
-#~ msgstr "Atlas :"
-
-#~ msgid "Shrink By:"
-#~ msgstr "Réduire de :"
-
-#~ msgid "Preview Atlas"
-#~ msgstr "Aperçu de l'atlas"
-
-#~ msgid "Images:"
-#~ msgstr "Images :"
-
-#~ msgid "Select None"
-#~ msgstr "Ne rien sélectionner"
-
-#~ msgid "Group"
-#~ msgstr "Groupe"
-
-#~ msgid "Samples"
-#~ msgstr "Échantillons"
-
-#~ msgid "Sample Conversion Mode: (.wav files):"
-#~ msgstr "Mode de conversion des échantillons (fichiers .wav) :"
-
-#~ msgid "Compress (RAM - IMA-ADPCM)"
-#~ msgstr "Compresser (RAM - IMA-ADPCM)"
-
-#~ msgid "Sampling Rate Limit (Hz):"
-#~ msgstr "Limite de taux d'échantillonage (Hz) :"
-
-#~ msgid "Trim"
-#~ msgstr "Rogner"
-
-#~ msgid "Trailing Silence:"
-#~ msgstr "Silence de fin :"
-
-#~ msgid "Script Export Mode:"
-#~ msgstr "Mode d'exportation des scripts :"
-
-#~ msgid "Text"
-#~ msgstr "Texte"
-
-#~ msgid "Compiled"
-#~ msgstr "Compilé"
-
-#~ msgid "Encrypted (Provide Key Below)"
-#~ msgstr "Chiffré (insérez une clé ci-dessous)"
-
-#~ msgid "Script Encryption Key (256-bits as hex):"
-#~ msgstr "Clé de chiffrement des scripts (256 bits en hexadécimal) :"
-
-#~ msgid "Export Project PCK"
-#~ msgstr "Exporter le PCK du projet"
-
-#~ msgid "Export..."
-#~ msgstr "Exporter…"
-
-#~ msgid "Project Export"
-#~ msgstr "Exportation de projet"
-
-#~ msgid "Export Preset:"
-#~ msgstr "Pré-réglage d'exportation :"
-
-#~ msgid "BakedLightInstance does not contain a BakedLight resource."
-#~ msgstr "La BakedLightInstance ne contient pas de ressource BakedLight."
-
-#~ msgid "Lighting"
-#~ msgstr "Éclairage"
-
-#~ msgid "Global"
-#~ msgstr "Global"
-
-#~ msgid ""
-#~ "This item cannot be made visible because the parent is hidden. Unhide the "
-#~ "parent first."
-#~ msgstr ""
-#~ "Cet objet ne peut être rendu visible car son parent est caché. Affichez "
-#~ "le parent d'abord."
-
-#~ msgid ""
-#~ "Paths cannot start with '/', absolute paths must start with 'res://', "
-#~ "'user://', or 'local://'"
-#~ msgstr ""
-#~ "Les chemins ne peuvent pas commencer par '/', les chemins absolus doivent "
-#~ "commencer par 'res://', 'user://' ou 'local://'"
-
-#~ msgid "File exists"
-#~ msgstr "Le fichier existe"
-
-#~ msgid "Valid path"
-#~ msgstr "Chemin valide"
-
-#~ msgid "Cannot go into subdir:"
-#~ msgstr "Impossible d'aller dans le sous-répertoire :"
-
-#~ msgid "Imported Resources"
-#~ msgstr "Ressources importées"
-
-#~ msgid "Top (Num7)"
-#~ msgstr "Dessus (Pavé num. 7)"
-
-#~ msgid "Bottom (Shift+Num7)"
-#~ msgstr "Dessous (Maj+Pavé num. 7)"
-
-#~ msgid "Left (Num3)"
-#~ msgstr "Gauche (Pavé num. 3)"
-
-#~ msgid "Right (Shift+Num3)"
-#~ msgstr "Droite (Maj+Pavé num. 3)"
-
-#~ msgid "Front (Num1)"
-#~ msgstr "Devant (Pavé num. 1)"
-
-#~ msgid "Rear (Shift+Num1)"
-#~ msgstr "Arrière (Maj+Pavé num. 1)"
-
-#~ msgid "Perspective (Num5)"
-#~ msgstr "Perspective (Pavé num. 5)"
-
-#~ msgid "Orthogonal (Num5)"
-#~ msgstr "Orthogonale (Pavé num. 5)"
-
-#~ msgid "Selection (F)"
-#~ msgstr "Sélection (F)"
-
-#~ msgid "Align with view (Ctrl+Shift+F)"
-#~ msgstr "Aligner avec la vue (Ctrl+Maj+F)"
-
-#~ msgid "Enable/Disable interpolation when looping animation."
-#~ msgstr "Activer/Désactiver l'interpolation lors de la boucle d'animation."
-
-#~ msgid "Load Layout"
-#~ msgstr "Charger la disposition"
-
-#~ msgid "Inherit Scene"
-#~ msgstr "Hériter la scène"
-
-#~ msgid "Method In Node:"
-#~ msgstr "Méthode dans le nœud :"
-
-#~ msgid "Set Params"
-#~ msgstr "Définir paramètres"
-
-#~ msgid "Live Editing"
-#~ msgstr "Édition en direct"
-
-#~ msgid "File Server"
-#~ msgstr "Serveur de fichiers"
-
-#~ msgid "Deploy File Server Clients"
-#~ msgstr "Déployer des clients de serveur de fichiers"
+msgstr "Les variations ne peuvent être affectées que dans la fonction vertex."
-#~ msgid "Group Editor"
-#~ msgstr "Éditeur de groupes"
+#~ msgid "Split point with itself."
+#~ msgstr "Point de séparation avec lui-même."
-#~ msgid "Overwrite Existing Scene"
-#~ msgstr "Écraser la scène existante"
+#~ msgid "Split can't form an existing edge."
+#~ msgstr "Le fractionnement ne peut pas former une arête existante."
-#~ msgid "Overwrite Existing, Keep Materials"
-#~ msgstr "Écraser l'existant, conserver les matériaux"
+#~ msgid "Split already exists."
+#~ msgstr "Le fractionnement existe déjà."
-#~ msgid "Keep Existing, Merge with New"
-#~ msgstr "Conserver l'existant, fusionner avec les nouveautés"
+#~ msgid "Add Split"
+#~ msgstr "Ajouter un fractionnement"
-#~ msgid "Keep Existing, Ignore New"
-#~ msgstr "Conserver l'existant, ignorer les nouveautés"
+#~ msgid "Invalid Split: "
+#~ msgstr "Fractionnement invalide : "
-#~ msgid "This Time:"
-#~ msgstr "Cette fois :"
+#~ msgid "Remove Split"
+#~ msgstr "Supprimer le fractionnement"
-#~ msgid "Next Time:"
-#~ msgstr "Les prochaines fois :"
+#~ msgid "Poly"
+#~ msgstr "Polygone"
-#~ msgid "%d frames"
-#~ msgstr "%d images"
+#~ msgid "Splits"
+#~ msgstr "Fractionnements"
-#~ msgid ""
-#~ "NOTICE: You are not forced to import textures for 2D projects. Just copy "
-#~ "your .jpg or .png files to your project, and change export options later. "
-#~ "Atlases can be generated on export too."
-#~ msgstr ""
-#~ "NOTICE : Vous n'êtes pas obligé d'importer des textures pour des projets "
-#~ "en 2D. Copiez simplement vos fichiers .jpg ou .png dans le projet, et "
-#~ "modifiez les options d'exportation par la suite. Vous pouvez également "
-#~ "générer des atlas à l'exportation."
+#~ msgid "Connect two points to make a split."
+#~ msgstr "Relier deux points pour faire un fractionnement."
-#~ msgid "Merging..."
-#~ msgstr "Fusion..."
+#~ msgid "Select a split to erase it."
+#~ msgstr "Sélectionnez un fractionnement à effacer."
diff --git a/editor/translations/he.po b/editor/translations/he.po
index 43bfd2a473..e479ef9d66 100644
--- a/editor/translations/he.po
+++ b/editor/translations/he.po
@@ -1,26 +1,27 @@
# Hebrew translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
-#
# Daniel <lorddaniel09@gmail.com>, 2018.
# Ben Golan <golanben4@gmail.com>, 2017.
# Luc Stepniewski <lior@gradstein.info>, 2017.
# Yaron Shahrabani <sh.yaron@gmail.com>, 2018.
-#
+# RaikaRakka <shaiyatta@gmail.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-04-18 16:38+0000\n"
-"Last-Translator: Daniel <lorddaniel09@gmail.com>\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:40+0100\n"
+"Last-Translator: RaikaRakka <shaiyatta@gmail.com>\n"
"Language-Team: Hebrew <https://hosted.weblate.org/projects/godot-engine/"
"godot/he/>\n"
"Language: he\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && "
"n % 10 == 0) ? 2 : 3));\n"
-"X-Generator: Weblate 3.0-dev\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -28,7 +29,7 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr ""
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
@@ -267,7 +268,6 @@ msgstr "ליצור %d רצועות חדשות ולהכניס מפתחות?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -402,8 +402,7 @@ msgstr ""
msgid "Scale From Cursor"
msgstr ""
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr ""
@@ -417,11 +416,13 @@ msgid "Delete Selection"
msgstr "ביטול הבחירה"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+#, fuzzy
+msgid "Go to Next Step"
msgstr "מעבר לצעד הב×"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+#, fuzzy
+msgid "Go to Previous Step"
msgstr "מעבר לצעד הקוד×"
#: editor/animation_track_editor.cpp
@@ -524,11 +525,11 @@ msgstr "×ין תוצ×ות"
msgid "Replaced %d occurrence(s)."
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "הת×מת רישיות"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "×ž×™×œ×™× ×©×œ×ž×•×ª"
@@ -544,15 +545,19 @@ msgstr "להחליף הכול"
msgid "Selection Only"
msgstr "בחירה בלבד"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "להתקרב"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "להתרחק"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "×יפוס התקריב"
@@ -563,10 +568,10 @@ msgstr "×זהרות"
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "להתקרב"
+msgid "Font Size:"
+msgstr "מבט קדמי"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "שורה:"
@@ -597,6 +602,7 @@ msgstr "הוספה"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -676,7 +682,7 @@ msgid "Edit Connection: "
msgstr "שגי×ת חיבור"
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -725,23 +731,20 @@ msgid "Recent:"
msgstr "×חרוני×:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "חיפוש:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "הת×מות:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "תי×ור:"
@@ -776,8 +779,7 @@ msgid "Resource"
msgstr "מש×ב"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "נתיב"
@@ -798,9 +800,10 @@ msgid "Search Replacement Resource:"
msgstr "חיפוש מש×ב חלופי:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -830,7 +833,8 @@ msgid "Error loading:"
msgstr "שגי××” בטעינה:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+#, fuzzy
+msgid "Load failed due to missing dependencies:"
msgstr "טעינת הסצנה נכשלה עקב תלויות חסרות:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -889,14 +893,6 @@ msgstr "החלפת ערך מילון"
msgid "Thanks from the Godot community!"
msgstr "תודה רבה מקהילת Godot!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr ""
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "מתנדבי מנוע Godot"
@@ -986,7 +982,8 @@ msgid "Uncompressing Assets"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+#, fuzzy
+msgid "Package installed successfully!"
msgstr "החבילה הותקנה בהצלחה!"
#: editor/editor_asset_installer.cpp
@@ -1068,8 +1065,7 @@ msgid "Bus options"
msgstr "×פשרויות ×פיק"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "שכפול"
@@ -1228,7 +1224,7 @@ msgid "Add AutoLoad"
msgstr "הוספת טעינה ×וטומטית"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "נתיב:"
@@ -1236,8 +1232,8 @@ msgstr "נתיב:"
msgid "Node Name:"
msgstr "×©× ×”×ž×¤×¨×§:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "ש×"
@@ -1307,12 +1303,17 @@ msgid "Template file not found:"
msgstr "קובץ התבנית ×œ× × ×ž×¦×:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "× × ×œ×‘×—×•×¨ ×ת התיקייה הנוכחית"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "הקובץ ×§×™×™×, לשכתב?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "× × ×œ×‘×—×•×¨ ×ת התיקייה הנוכחית"
+#, fuzzy
+msgid "Select This Folder"
+msgstr "בחירת התיקייה"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
@@ -1320,12 +1321,13 @@ msgstr "העתקת נתיב"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr "הצגה במנהל הקבצי×"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+#, fuzzy
+msgid "Show in File Manager"
msgstr "הצגה במנהל הקבצי×"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1361,7 +1363,8 @@ msgid "Open a File or Directory"
msgstr "פתיחת קובץ ×ו תיקייה"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "שמירה"
@@ -1419,8 +1422,7 @@ msgstr "תיקיות וקבצי×:"
msgid "Preview:"
msgstr "תצוגה מקדימה:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "קובץ:"
@@ -1436,24 +1438,11 @@ msgstr "סריקת מקורות"
msgid "(Re)Importing Assets"
msgstr ""
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "חיפוש בעזרה"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "רשימת מחלקות:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "חיפוש במחלקות"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "עליון"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "מחלקה:"
@@ -1470,28 +1459,31 @@ msgid "Brief Description:"
msgstr "תי×ור קצר:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "חברי×"
+msgid "Properties"
+msgstr "מ×פייני×"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "חברי×:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "שיטות ציבוריות"
+msgid "Methods"
+msgstr "שיטות"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "שיטות ציבוריות:"
+#, fuzzy
+msgid "Methods:"
+msgstr "שיטות"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "פריטי מנשק משתמש של ערכת העיצוב"
+#, fuzzy
+msgid "Theme Properties"
+msgstr "מ×פייני×"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "פריטי מנשק משתמש של ערכת העיצוב:"
+#, fuzzy
+msgid "Theme Properties:"
+msgstr "מ×פייני×"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1518,10 +1510,16 @@ msgid "Constants:"
msgstr "קבועי×:"
#: editor/editor_help.cpp
-msgid "Description"
+#, fuzzy
+msgid "Class Description"
msgstr "תי×ור"
#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
+msgstr "תי×ור:"
+
+#: editor/editor_help.cpp
msgid "Online Tutorials:"
msgstr ""
@@ -1533,11 +1531,13 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "מ×פייני×"
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "תי×ור המ×פיין:"
#: editor/editor_help.cpp
-msgid "Property Description:"
+#, fuzzy
+msgid "Property Descriptions:"
msgstr "תי×ור המ×פיין:"
#: editor/editor_help.cpp
@@ -1547,11 +1547,13 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "שיטות"
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "תי×ור השיטה:"
#: editor/editor_help.cpp
-msgid "Method Description:"
+#, fuzzy
+msgid "Method Descriptions:"
msgstr "תי×ור השיטה:"
#: editor/editor_help.cpp
@@ -1560,12 +1562,61 @@ msgid ""
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-#: editor/editor_inspector.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "חיפוש בעזרה"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Display All"
+msgstr "הצגה נורמלית"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Classes Only"
+msgstr "מחלקות"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Methods Only"
+msgstr "שיטות"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "×ותות"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Constants Only"
+msgstr "קבועי×"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Properties Only"
+msgstr "מ×פייני×"
+
+#: editor/editor_help_search.cpp
#, fuzzy
-msgid "Property: "
+msgid "Theme Properties Only"
msgstr "מ×פייני×"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Member Type"
+msgstr "חברי×"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Class"
+msgstr "מחלקה:"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1599,6 +1650,11 @@ msgstr ""
msgid "Error saving resource!"
msgstr "שגי××” בשמירת המש×ב!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "שמירת המש×ב בתור…"
@@ -1653,12 +1709,22 @@ msgstr "×œ× × ×™×ª×Ÿ לבצע פעולה זו ×œ×œ× ×©×•×¨×© ×”×¢×¥."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
"×œ× × ×™×ª×Ÿ לשמור ×ת הסצנה. כפי הנר××” עקב תלויות (×ž×•×¤×¢×™× ×ו ירושות) ש×ינן "
"מסופקות."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr ""
@@ -1890,6 +1956,12 @@ msgstr "×œ× × ×™×ª×Ÿ לטעון סקריפט הרחבה מהנתיב: ‚%s’.
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1930,6 +2002,12 @@ msgstr ""
msgid "Default"
msgstr ""
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+#, fuzzy
+msgid "Show in FileSystem"
+msgstr "הצגה במערכת הקבצי×"
+
#: editor/editor_node.cpp
#, fuzzy
msgid "Play This Scene"
@@ -2013,7 +2091,8 @@ msgid "Save Scene"
msgstr "שמירת סצנה"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+#, fuzzy
+msgid "Save All Scenes"
msgstr "שמירת כל הסצנות"
#: editor/editor_node.cpp
@@ -2042,7 +2121,7 @@ msgid "Undo"
msgstr "ביטול"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "ביצוע חוזר"
@@ -2066,7 +2145,7 @@ msgstr "הגדרות מיז×"
msgid "Export"
msgstr "ייצו×"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "כלי×"
@@ -2080,6 +2159,7 @@ msgid "Quit to Project List"
msgstr "יצי××” לרשימת המיזמי×"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "ניפוי שגי×ות"
@@ -2191,10 +2271,6 @@ msgstr "ניהול תבניות ייצו×"
msgid "Help"
msgstr "עזרה"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "מחלקות"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2289,24 +2365,24 @@ msgstr "עדכון שינויי×"
msgid "Disable Update Spinner"
msgstr "השבתת שבשבת עדכון"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "חוקר"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "ייבו×"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "מפרק"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "מערכת קבצי×"
#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr "חוקר"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "מפרק"
+
+#: editor/editor_node.cpp
#, fuzzy
msgid "Expand Bottom Panel"
msgstr "להרחיב הכול"
@@ -2443,7 +2519,7 @@ msgstr "שקופית %"
msgid "Physics Frame %"
msgstr "שקופית פיזיקלית %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "זמן:"
@@ -2467,7 +2543,7 @@ msgstr "זמן"
msgid "Calls"
msgstr "קרי×ות"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2479,20 +2555,44 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "×©× ×©×’×•×™."
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr ""
@@ -2504,10 +2604,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2516,7 +2612,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "הדבקה"
@@ -2801,6 +2898,11 @@ msgstr ""
"×œ× × ×™×ª×Ÿ לפתוח ×ת file_type_cache.cch לכתיבה, מטמון סוג ×”×§×‘×¦×™× ×œ× ×™×™×©×ž×¨!"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "מועדפי×:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr "×œ× × ×™×ª×Ÿ לנווט ×ל ‚%s’ כיוון ×©×œ× × ×ž×¦× ×‘×ž×¢×¨×›×ª הקבצי×!"
@@ -2838,19 +2940,15 @@ msgstr "שגי××” בשכפול:"
msgid "Unable to update dependencies:"
msgstr "×œ× × ×™×ª×Ÿ לעדכן ×ת התלויות:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "×œ× ×¦×•×™×Ÿ ש×"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "×œ× ×¦×•×™×Ÿ ש×."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "×”×©× ×©×¡×•×¤×§ מכיל ×ª×•×•×™× ×©×’×•×™×™×"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "×œ× ×¦×•×™×Ÿ ש×."
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "×”×©× ×ž×›×™×œ ×ª×•×•×™× ×©×’×•×™×™×."
@@ -2875,22 +2973,6 @@ msgid "Duplicating folder:"
msgstr "תיקייה משוכפלת:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "להרחיב הכול"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "×œ×¦×ž×¦× ×”×›×•×œ"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "שינוי ש×…"
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "העברה ×ל…"
-
-#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
msgstr "פתיחת סצנות"
@@ -2899,6 +2981,16 @@ msgid "Instance"
msgstr "עותק"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Add to favorites"
+msgstr "מועדפי×:"
+
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Remove from favorites"
+msgstr "הסרה מקבוצה"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "עריכת תלויות…"
@@ -2906,11 +2998,19 @@ msgstr "עריכת תלויות…"
msgid "View Owners..."
msgstr "צפייה בבעלי×…"
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "שינוי ש×…"
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "שכפול…"
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr "העברה ×ל…"
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
msgstr "פתיחת סקריפט מהירה…"
@@ -2920,6 +3020,16 @@ msgstr "פתיחת סקריפט מהירה…"
msgid "New Resource..."
msgstr "שמירת המש×ב בתור…"
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Expand All"
+msgstr "להרחיב הכול"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Collapse All"
+msgstr "×œ×¦×ž×¦× ×”×›×•×œ"
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -2941,27 +3051,19 @@ msgstr "סריקת מערכת ×”×§×‘×¦×™× ×ž×—×“×©"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "החלפת מצב התיקייה כמועדפת"
+msgid "Toggle split mode"
+msgstr "החלפת מצב"
#: editor/filesystem_dock.cpp
-msgid "Show current scene file."
-msgstr ""
+#, fuzzy
+msgid "Search files"
+msgstr "חיפוש במחלקות"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "חיפוש במחלקות"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -2969,7 +3071,7 @@ msgstr ""
"×”×§×‘×¦×™× × ×¡×¨×§×™×,\n"
"× × ×œ×”×ž×ª×™×Ÿâ€¦"
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "העברה"
@@ -2987,30 +3089,22 @@ msgid "Create Script"
msgstr "יצירת סקריפט"
#: editor/find_in_files.cpp
-msgid "Find in files"
-msgstr ""
-
-#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find: "
-msgstr "×יתור"
+msgid "Find in Files"
+msgstr "×יתור…"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Whole words"
-msgstr "×ž×™×œ×™× ×©×œ×ž×•×ª"
+msgid "Find:"
+msgstr "×יתור"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Match case"
-msgstr "הת×מת רישיות"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "יצירת תיקייה"
#: editor/find_in_files.cpp
-msgid "Filter: "
+msgid "Filters:"
msgstr ""
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -3028,6 +3122,11 @@ msgstr ""
#: editor/find_in_files.cpp
#, fuzzy
+msgid "Find: "
+msgstr "×יתור"
+
+#: editor/find_in_files.cpp
+#, fuzzy
msgid "Replace: "
msgstr "להחליף"
@@ -3053,7 +3152,7 @@ msgstr "הפעולה ‚%s’ כבר קיימת!"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr "×©× ×©×’×•×™."
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3192,17 +3291,14 @@ msgstr "×™×™×‘×•× ×ž×—×“×©"
msgid "Failed to load resource."
msgstr "טעינת המש×ב נכשלה."
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr ""
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+#, fuzzy
+msgid "Expand All Properties"
msgstr "הרחבת כל המ×פייני×"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+#, fuzzy
+msgid "Collapse All Properties"
msgstr "×¦×ž×¦×•× ×›×œ המ×פייני×"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3248,6 +3344,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "טעינת מש×ב ×§×™×™× ×ž×”×›×•× ×Ÿ ועריכתו."
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "שמירת המש×ב שנערך כרגע."
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "מעבר לפריט ×”×חרון שנערך מההיסטוריה."
@@ -3311,14 +3411,14 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
msgstr "יצירת מצולע"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+#, fuzzy
+msgid "Edit Polygon"
msgstr "עריכת מצולע"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3326,29 +3426,33 @@ msgid "Insert Point"
msgstr "הוספת נקודה"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+#, fuzzy
+msgid "Edit Polygon (Remove Point)"
msgstr "עריכת מצולע (הסרת נקודה)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+#, fuzzy
+msgid "Remove Polygon And Point"
msgstr "הסרת מצולע ונקודה"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "יצירת מצולע חדש מ×פס"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr "מחיקת נקודות"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#, fuzzy
+msgid "Erase points."
msgstr "מחיקת נקודות"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3364,7 +3468,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
+msgid "Load..."
msgstr "טעינה"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3393,15 +3497,9 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "מחיקת נקודות"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "מחיקת נקודות"
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3443,10 +3541,9 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr "הצמדה"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3479,7 +3576,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add Node.."
+msgid "Add Node..."
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3758,7 +3855,7 @@ msgstr "התחברות למפרק:"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "להסיר ×ת ×”×§×‘×¦×™× ×”× ×‘×—×¨×™× ×ž×”×ž×™×–×? (××™ ×פשר לשחזר)"
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3826,10 +3923,6 @@ msgid "Amount:"
msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr ""
@@ -4030,7 +4123,7 @@ msgstr ""
msgid "Plugins"
msgstr ""
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr ""
@@ -4156,6 +4249,10 @@ msgid "Resize CanvasItem"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
msgstr ""
@@ -4176,21 +4273,19 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "להתרחק"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "להתרחק"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "להתקרב"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4219,6 +4314,11 @@ msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "מצב שינוי קנה מידה (R)"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4315,6 +4415,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "יחידני"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr ""
@@ -4366,6 +4471,10 @@ msgid "Show Viewport"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr ""
@@ -4434,8 +4543,17 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr ""
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "יצירת מצולע"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "עריכת מצולע"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "עריכת מצולע (הסרת נקודה)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
@@ -4537,35 +4655,9 @@ msgid "Item List Editor"
msgstr ""
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr ""
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr ""
@@ -4797,13 +4889,14 @@ msgid "Populate"
msgstr ""
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr ""
+#, fuzzy
+msgid "Generating Visibility Rect"
+msgstr "נוצר ×ž×™×–× C#‎…"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -4831,6 +4924,12 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "Convert to CPUParticles"
+msgstr "המרה ל×ותיות גדולות"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr ""
@@ -4900,13 +4999,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "המרה ל×ותיות גדולות"
+msgid "Generate AABB"
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -4930,6 +5028,10 @@ msgid "Add Point to Curve"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr ""
@@ -4957,6 +5059,10 @@ msgid "Click: Add Point"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr ""
@@ -4972,11 +5078,6 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "מחיקת נקודה"
@@ -5033,6 +5134,10 @@ msgstr ""
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5044,7 +5149,14 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync bones"
+#, fuzzy
+msgid "Sync Bones"
+msgstr "שינוי קנה מידה של מצולע"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5057,41 +5169,46 @@ msgid "Create Polygon & UV"
msgstr "יצירת מצולע"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
+msgid "Create Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
+msgid "Remove Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Split already exists."
-msgstr "הפעולה ‚%s’ כבר קיימת!"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Add Split"
+msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "נתיב שגוי."
+msgid "Add Custom Polygon"
+msgstr "עריכת מצולע"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "הסרת תבנית"
+msgid "Remove Custom Polygon"
+msgstr "הסרת מצולע ונקודה"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
+#, fuzzy
+msgid "Transform Polygon"
+msgstr "התמרה"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Open Polygon 2D UV editor."
+msgstr "פתיחת עורך דו־ממד"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
msgstr ""
@@ -5101,13 +5218,13 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "עריכת מצולע"
+msgid "Points"
+msgstr "הזזת נקודה"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Splits"
-msgstr "פיצול נתיב"
+msgid "Polygons"
+msgstr "עריכת מצולע"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Bones"
@@ -5115,11 +5232,7 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
-msgstr "יצירת מצולע"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Move Points"
msgstr "הזזת נקודה"
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5147,20 +5260,21 @@ msgid "Scale Polygon"
msgstr "שינוי קנה מידה של מצולע"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "יש לבחור פריט הגדרה ×§×•×“× ×›×œ!"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5185,6 +5299,11 @@ msgid "Grid Settings"
msgstr "הגדרות"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "הצמדה"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr "הפעלת הצמדה"
@@ -5244,22 +5363,22 @@ msgid "Paste Resource"
msgstr "הדבקת מש×ב"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr "טעינת מש×ב"
@@ -5291,6 +5410,11 @@ msgstr "שגי××” ×‘×™×™×‘×•× ×¢×¨×›×ª הנוש×"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
+msgid "Error: could not load file."
+msgstr "×œ× × ×™×ª×Ÿ ליצור תיקייה."
+
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Error could not load file."
msgstr "×œ× × ×™×ª×Ÿ ליצור תיקייה."
@@ -5300,19 +5424,23 @@ msgid "Error saving file!"
msgstr "שגי××” בשמירה"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
+#, fuzzy
+msgid "Error while saving theme."
msgstr "שגי××” בשמירת ערכת העיצוב"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+#, fuzzy
+msgid "Error Saving"
msgstr "שגי××” בשמירה"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
+#, fuzzy
+msgid "Error importing theme."
msgstr "שגי××” ×‘×™×™×‘×•× ×¢×¨×›×ª הנוש×"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+#, fuzzy
+msgid "Error Importing"
msgstr "שגי××” בייבו×"
#: editor/plugins/script_editor_plugin.cpp
@@ -5335,6 +5463,14 @@ msgid "Import Theme"
msgstr "×™×™×‘×•× ×¢×¨×›×ª עיצוב"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "שגי××” בשמירת ערכת העיצוב"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "שגי××” בשמירה"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr "שמירת ערכת עיצוב בש×…"
@@ -5375,8 +5511,9 @@ msgid "File"
msgstr "קובץ"
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile"
-msgstr ""
+#, fuzzy
+msgid "Open..."
+msgstr "פתיחה"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5391,11 +5528,8 @@ msgid "Copy Script Path"
msgstr "העתקת נתיב הסקריפט"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr "הצגה במערכת הקבצי×"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+#, fuzzy
+msgid "History Previous"
msgstr "×”×§×•×“× ×‘×”×™×¡×˜×•×¨×™×”"
#: editor/plugins/script_editor_plugin.cpp
@@ -5408,6 +5542,11 @@ msgid "Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Import Theme..."
+msgstr "×™×™×‘×•× ×¢×¨×›×ª עיצוב"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
msgstr "רענון ערכת העיצוב"
@@ -5416,10 +5555,6 @@ msgid "Save Theme"
msgstr "שמירת ערכת העיצוב"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "שמירת ערכת העיצוב בש×"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "סגירת מסמכי×"
@@ -5466,7 +5601,8 @@ msgid "Keep Debugger Open"
msgstr "להש×יר ×ת מנפה השגי×ות פתוח"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+#, fuzzy
+msgid "Debug with External Editor"
msgstr "ניפוי שגי×ות ×¢× ×¢×•×¨×š חיצוני"
#: editor/plugins/script_editor_plugin.cpp
@@ -5474,10 +5610,6 @@ msgid "Open Godot online documentation"
msgstr "פתיחת התיעוד המקוון של Godot"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr "חיפוש בהיררכיית המחלקות."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -5515,19 +5647,9 @@ msgstr "ניפוי שגי×ות"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Search results"
+msgid "Search Results"
msgstr "חיפוש בעזרה"
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "חיפוש במחלקות"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr "ניתן לערוך ×¡×§×¨×™×¤×˜×™× ×ž×•×‘× ×™× ×¨×§ ×›×שר הסצנה ××œ×™×”× ×”× ×©×™×™×›×™× × ×˜×¢× ×”"
-
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
@@ -5538,6 +5660,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "מעבר לפונקציה…"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr "ניתן להשמיט מש××‘×™× ×ž×ž×¢×¨×›×ª ×”×§×‘×¦×™× ×‘×œ×‘×“."
@@ -5569,10 +5700,6 @@ msgstr "הגדלת ×ות ר×שונה"
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5624,11 +5751,13 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+#, fuzzy
+msgid "Convert Indent to Spaces"
msgstr "המרת הזחות לרווחי×"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+#, fuzzy
+msgid "Convert Indent to Tabs"
msgstr "המרת הזחות לט×בי×"
#: editor/plugins/script_text_editor.cpp
@@ -5645,36 +5774,32 @@ msgid "Remove All Breakpoints"
msgstr "הסרת כל נקודות העצירה"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
+#, fuzzy
+msgid "Go to Next Breakpoint"
msgstr "מעבר לנקודת העצירה הב××”"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
+#, fuzzy
+msgid "Go to Previous Breakpoint"
msgstr "מעבר לנקודת העצירה הקודמת"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr "המרה ל×ותיות גדולות"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr "המרה ל×ותיות קטנות"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr "×יתור הקוד×"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr "×יתור…"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+#, fuzzy
+msgid "Go to Function..."
msgstr "מעבר לפונקציה…"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+#, fuzzy
+msgid "Go to Line..."
msgstr "מעבר לשורה…"
#: editor/plugins/script_text_editor.cpp
@@ -5770,6 +5895,14 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -5935,6 +6068,11 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "הצגת מידע"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -6037,10 +6175,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap To Floor"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "החלפת מצב מבט חופשי"
@@ -6157,6 +6291,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
msgstr ""
@@ -6274,11 +6412,16 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6443,6 +6586,11 @@ msgid "Fix Invalid Tiles"
msgstr "×©× ×©×’×•×™."
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "בחירת מיקוד"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6489,32 +6637,40 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "הסרת הבחירה"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr ""
+#, fuzzy
+msgid "Rotate left"
+msgstr "הטיית מצולע"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr ""
+#, fuzzy
+msgid "Rotate right"
+msgstr "הטיית מצולע"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Flip vertically"
msgstr ""
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Clear transform"
+msgstr "התמרה"
+
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove current Texture from TileSet"
-msgstr ""
+#, fuzzy
+msgid "Remove selected Texture from TileSet."
+msgstr "להסיר ×ת ×”×§×‘×¦×™× ×”× ×‘×—×¨×™× ×ž×”×ž×™×–×? (××™ ×פשר לשחזר)"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -6525,25 +6681,47 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "הדבקת משתני×"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "מחיקת נקודות"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "יצירת מצולע"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "להסיר ×ת ×”×§×‘×¦×™× ×”× ×‘×—×¨×™× ×ž×”×ž×™×–×? (××™ ×פשר לשחזר)"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6551,7 +6729,12 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "הסרת תבנית"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6561,15 +6744,25 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "למחוק ×ת ×”×§×‘×¦×™× ×”× ×‘×—×¨×™×?"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "מחיקת נקודות"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr ""
@@ -6587,12 +6780,97 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "יצירת תיקייה"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "עריכת מצולע"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "עריכת מצולע"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "עריכת מצולע"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "הדבקת משתני×"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "הסרת תבנית"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "הסרת מצולע ונקודה"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "הזזת מצולע"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "הסרת נקודה בנתיב"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "יצירת מצולע"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "יצירת מצולע"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid "This property can't be changed."
msgstr "×œ× × ×™×ª×Ÿ לבצע פעולה זו ×œ×œ× ×¡×¦× ×”."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
+msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6630,6 +6908,15 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Exporting All"
+msgstr "ייצו×"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6638,6 +6925,11 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "×™×™×¦×•× ×ž×™×–×"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6692,10 +6984,50 @@ msgid "Feature List:"
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "הרצת סקריפט"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Script Export Mode:"
+msgstr "×™×™×¦×•× ×ž×™×–×"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export mode?"
+msgstr "×™×™×¦×•× ×ž×™×–×"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Export All"
+msgstr "ייצו×"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -6823,8 +7155,9 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
-msgid "Can't open project"
-msgstr ""
+#, fuzzy
+msgid "Can't open project at '%s'."
+msgstr "×œ× × ×™×ª×Ÿ לפתוח ×ת ‚%s’."
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
@@ -6832,6 +7165,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7151,11 +7502,7 @@ msgstr ""
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "General"
-msgstr ""
-
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
+msgstr "כללי"
#: editor/project_settings_editor.cpp
msgid "Override For..."
@@ -7290,10 +7637,6 @@ msgstr ""
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr ""
@@ -7383,7 +7726,7 @@ msgid "Step"
msgstr "צעד/×™×:"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7392,7 +7735,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7435,7 +7778,7 @@ msgstr "×ותיות גדולות"
msgid "Reset"
msgstr "×יפוס התקריב"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7494,6 +7837,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr ""
@@ -7530,6 +7877,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7604,6 +7957,11 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Open documentation"
+msgstr "פתיחת התיעוד המקוון של Godot"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr ""
@@ -7612,12 +7970,13 @@ msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Change Type"
-msgstr ""
+#, fuzzy
+msgid "Extend Script"
+msgstr "הרצת סקריפט"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -7770,6 +8129,11 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Filename is empty"
+msgstr "לוח גזירי המש××‘×™× ×¨×™×§!"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -7858,19 +8222,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -7902,18 +8254,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -8110,7 +8450,7 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+msgid "Step argument is zero!"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
@@ -8332,11 +8672,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -8608,6 +8944,10 @@ msgid "Base Type:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "חברי×:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr ""
@@ -8708,11 +9048,11 @@ msgid "Search VisualScript"
msgstr "חיפוש בעזרה"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8790,6 +9130,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -8829,6 +9175,12 @@ msgid ""
"imprinted."
msgstr "×œ× ×ž×•×§×¦×” חומר לעיבוד חלקיקי×, לכן ×œ× ×ª×•×˜×‘×¢ התנהגות."
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr "PathFollow2D עובד רק ×›×שר ×”×•× ×ž×•×’×“×¨ כצ××¦× ×©×œ מפרק Path2D."
@@ -8946,6 +9298,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -8965,6 +9327,28 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr "PathFollow2D עובד רק ×›×שר ×”×•× ×ž×•×’×“×¨ כצ××¦× ×©×œ מפרק Path2D."
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr "PathFollow2D עובד רק ×›×שר ×”×•× ×ž×•×’×“×¨ כצ××¦× ×©×œ מפרק Path2D."
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -8997,7 +9381,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9052,6 +9436,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr ""
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr "מצב גולמי"
@@ -9068,10 +9456,6 @@ msgstr ""
msgid "Please Confirm..."
msgstr "× × ×œ×מת…"
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr "בחירת התיקייה"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9079,6 +9463,10 @@ msgid ""
"hide upon running."
msgstr ""
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9124,10 +9512,6 @@ msgstr "גודל הגופן שגוי."
msgid "Input"
msgstr ""
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
@@ -9145,6 +9529,106 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Split already exists."
+#~ msgstr "הפעולה ‚%s’ כבר קיימת!"
+
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr "נתיב שגוי."
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "הסרת תבנית"
+
+#, fuzzy
+#~ msgid "Poly"
+#~ msgstr "עריכת מצולע"
+
+#, fuzzy
+#~ msgid "Splits"
+#~ msgstr "פיצול נתיב"
+
+#, fuzzy
+#~ msgid "Select a split to erase it."
+#~ msgstr "יש לבחור פריט הגדרה ×§×•×“× ×›×œ!"
+
+#~ msgid "No name provided"
+#~ msgstr "×œ× ×¦×•×™×Ÿ ש×"
+
+#~ msgid "Create Poly"
+#~ msgstr "יצירת מצולע"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "יצירת מצולע חדש מ×פס"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "להתרחק"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "להתקרב"
+
+#~ msgid "Save Theme As"
+#~ msgstr "שמירת ערכת העיצוב בש×"
+
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "להתקרב"
+
+#~ msgid "Class List:"
+#~ msgstr "רשימת מחלקות:"
+
+#~ msgid "Search Classes"
+#~ msgstr "חיפוש במחלקות"
+
+#~ msgid "Public Methods"
+#~ msgstr "שיטות ציבוריות"
+
+#~ msgid "Public Methods:"
+#~ msgstr "שיטות ציבוריות:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "פריטי מנשק משתמש של ערכת העיצוב"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "פריטי מנשק משתמש של ערכת העיצוב:"
+
+#, fuzzy
+#~ msgid "Property: "
+#~ msgstr "מ×פייני×"
+
+#, fuzzy
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "החלפת מצב התיקייה כמועדפת"
+
+#, fuzzy
+#~ msgid "Whole words"
+#~ msgstr "×ž×™×œ×™× ×©×œ×ž×•×ª"
+
+#, fuzzy
+#~ msgid "Match case"
+#~ msgstr "הת×מת רישיות"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "חיפוש בהיררכיית המחלקות."
+
+#, fuzzy
+#~ msgid "Search in files"
+#~ msgstr "חיפוש במחלקות"
+
+#~ msgid ""
+#~ "Built-in scripts can only be edited when the scene they belong to is "
+#~ "loaded"
+#~ msgstr "ניתן לערוך ×¡×§×¨×™×¤×˜×™× ×ž×•×‘× ×™× ×¨×§ ×›×שר הסצנה ××œ×™×”× ×”× ×©×™×™×›×™× × ×˜×¢× ×”"
+
+#~ msgid "Convert To Uppercase"
+#~ msgstr "המרה ל×ותיות גדולות"
+
+#~ msgid "Convert To Lowercase"
+#~ msgstr "המרה ל×ותיות קטנות"
+
#~ msgid "Change Default Value"
#~ msgstr "שינוי ערך בררת המחדל"
@@ -9184,12 +9668,6 @@ msgstr ""
#~ msgid "I see..."
#~ msgstr "×× ×™ רו×ה…"
-#~ msgid "Can't open '%s'."
-#~ msgstr "×œ× × ×™×ª×Ÿ לפתוח ×ת ‚%s’."
-
-#~ msgid "Save the currently edited resource."
-#~ msgstr "שמירת המש×ב שנערך כרגע."
-
#~ msgid "Default (Same as Editor)"
#~ msgstr "בררת מחדל (כמו העורך)"
diff --git a/editor/translations/hi.po b/editor/translations/hi.po
index 87c09cdd07..80a6607522 100644
--- a/editor/translations/hi.po
+++ b/editor/translations/hi.po
@@ -1,70 +1,72 @@
# Hindi translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
-#
# Abhas Kumar Sinha <abhaskumarsinha@gmail.com>, 2017.
-#
+# Suryansh5545 <suryanshpathak5545@gmail.com>, 2018.
+# Vikram1323 <vikram1323@gmail.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2017-11-25 10:21+0000\n"
-"Last-Translator: Abhas Kumar Sinha <abhaskumarsinha@gmail.com>\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:40+0100\n"
+"Last-Translator: Vikram1323 <vikram1323@gmail.com>\n"
"Language-Team: Hindi <https://hosted.weblate.org/projects/godot-engine/godot/"
"hi/>\n"
"Language: hi\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.18-dev\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr ""
+msgstr "कनà¥à¤µà¤°à¥à¤Ÿ करने के लिठअमानà¥à¤¯ पà¥à¤°à¤•ार तरà¥à¤• (), TYPE_ * सà¥à¤¥à¤¿à¤°à¤¾à¤‚क का उपयोग करें।"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr ""
+msgstr "डीकोडिंग बाइटà¥à¤¸, या अमानà¥à¤¯ पà¥à¤°à¤¾à¤°à¥‚प के लिठपरà¥à¤¯à¤¾à¤ªà¥à¤¤ बाइटà¥à¤¸ नहीं है।"
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "अभिवà¥à¤¯à¤•à¥à¤¤à¤¿ में अमानà¥à¤¯ इनपà¥à¤Ÿ % i (पारित नहीं)"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "सà¥à¤µà¤¯à¤‚ का उपयोग नहीं किया जा सकता कà¥à¤¯à¥‹à¤‚कि उदाहरण शूनà¥à¤¯ है (पास नहीं हà¥à¤†)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
-msgstr ""
+msgstr "ऑपरेटर %s, %s और %s के लिठअमानà¥à¤¯ ऑपरेंड।"
#: core/math/expression.cpp
msgid "Invalid index of type %s for base type %s"
-msgstr ""
+msgstr "बेस पà¥à¤°à¤•ार %s के लिठपà¥à¤°à¤•ार %s का अमानà¥à¤¯ अनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•ा"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "आधार पà¥à¤°à¤•ार %s के लिठअवैध नाम सूचकांक '%s'"
#: core/math/expression.cpp
msgid "Invalid arguments to construct '%s'"
-msgstr ""
+msgstr "'%s' बनाने के लिठअवैध तरà¥à¤•"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "'% s ' को कॉल करने पर:"
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
-msgstr ""
+msgstr "मà¥à¤«à¥à¤¤"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "संतà¥à¤²à¤¿à¤¤"
#: editor/animation_bezier_editor.cpp
msgid "Mirror"
@@ -72,12 +74,11 @@ msgstr ""
#: editor/animation_bezier_editor.cpp
msgid "Insert Key Here"
-msgstr ""
+msgstr "चाबी यहां डालें"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "डà¥à¤ªà¥à¤²à¤¿à¤•ेट चयन"
+msgstr "चयनित चाबी (फ़ाइलें) डà¥à¤ªà¥à¤²à¤¿à¤•ेट"
#: editor/animation_bezier_editor.cpp
#, fuzzy
@@ -86,7 +87,7 @@ msgstr "चयनित फ़ाइलें हटाà¤à¤‚?"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
-msgstr ""
+msgstr "Anim डà¥à¤ªà¥à¤²à¤¿à¤•ेट चाबी"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
#, fuzzy
@@ -101,7 +102,7 @@ msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ परिवरà¥à¤¤à¤¨ निधि"
#: editor/animation_track_editor.cpp
#, fuzzy
msgid "Anim Change Transition"
-msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ परिवरà¥à¤¤à¤¨ संकà¥à¤°à¤®à¤£ (à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ परिवरà¥à¤¤à¤¨)"
+msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ परिवरà¥à¤¤à¤¨ बà¥à¤²à¤¾à¤µà¤¾"
#: editor/animation_track_editor.cpp
#, fuzzy
@@ -109,9 +110,8 @@ msgid "Anim Change Transform"
msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ परिवरà¥à¤¤à¤¨ परिणत"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Change Keyframe Value"
-msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ परिवरà¥à¤¤à¤¨ निधि"
+msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ मà¥à¤–à¥à¤¯-फ़à¥à¤°à¥‡à¤® मूलà¥à¤¯(Value) बदलें"
#: editor/animation_track_editor.cpp
msgid "Anim Change Call"
@@ -119,45 +119,45 @@ msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ परिवरà¥à¤¤à¤¨ बà¥à¤²à¤¾à¤µà¤¾"
#: editor/animation_track_editor.cpp
msgid "Property Track"
-msgstr ""
+msgstr "गà¥à¤£(Property) टà¥à¤°à¥ˆà¤•"
#: editor/animation_track_editor.cpp
msgid "3D Transform Track"
-msgstr ""
+msgstr "3 डी टà¥à¤°à¥ˆà¤• रूपांतरण"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "कॉल मेथड टà¥à¤°à¥ˆà¤•"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "बेज़ियर वकà¥à¤° टà¥à¤°à¥ˆà¤•"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "ऑडियो पà¥à¤²à¥‡à¤¬à¥ˆà¤• टà¥à¤°à¥ˆà¤•"
#: editor/animation_track_editor.cpp
msgid "Animation Playback Track"
-msgstr ""
+msgstr "à¤à¤¨à¤¿à¤®à¥‡à¤¶à¤¨ पà¥à¤²à¥‡à¤¬à¥ˆà¤• टà¥à¤°à¥ˆà¤•"
#: editor/animation_track_editor.cpp
#, fuzzy
msgid "Add Track"
-msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ टà¥à¤°à¥ˆà¤• जोड़ें"
+msgstr "टà¥à¤°à¥ˆà¤• जोड़ें"
#: editor/animation_track_editor.cpp
msgid "Animation Length Time (seconds)"
-msgstr ""
+msgstr "à¤à¤¨à¤¿à¤®à¥‡à¤¶à¤¨ लंबाई समय (सेकंडà¥à¤¸)"
#: editor/animation_track_editor.cpp
msgid "Animation Looping"
-msgstr ""
+msgstr "à¤à¤¨à¤¿à¤®à¥‡à¤¶à¤¨ लूप"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Functions:"
-msgstr ""
+msgstr "कारà¥à¤¯à¥‹à¤‚:"
#: editor/animation_track_editor.cpp
msgid "Audio Clips:"
@@ -259,7 +259,6 @@ msgstr ""
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -387,8 +386,7 @@ msgstr ""
msgid "Scale From Cursor"
msgstr ""
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
#, fuzzy
msgid "Duplicate Selection"
msgstr "डà¥à¤ªà¥à¤²à¤¿à¤•ेट चयन"
@@ -403,11 +401,11 @@ msgid "Delete Selection"
msgstr "डà¥à¤ªà¥à¤²à¤¿à¤•ेट चयन"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+msgid "Go to Next Step"
msgstr ""
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+msgid "Go to Previous Step"
msgstr ""
#: editor/animation_track_editor.cpp
@@ -510,11 +508,11 @@ msgstr ""
msgid "Replaced %d occurrence(s)."
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr ""
@@ -530,15 +528,19 @@ msgstr ""
msgid "Selection Only"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "बड़ा करो"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "छोटा करो"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "रीसेट आकार"
@@ -547,11 +549,10 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "बड़ा करो"
+msgid "Font Size:"
+msgstr ""
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "रेखा:"
@@ -585,6 +586,7 @@ msgstr "जोड़ें"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -670,7 +672,7 @@ msgid "Edit Connection: "
msgstr "परिवरà¥à¤¤à¤¨ वकà¥à¤° चयन"
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -718,24 +720,21 @@ msgid "Recent:"
msgstr "हाल ही में किया:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#, fuzzy
msgid "Search:"
msgstr "खोज कर:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "à¤à¤• जैसा:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "विवरण:"
@@ -776,8 +775,7 @@ msgid "Resource"
msgstr "संसाधन"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "पथ"
@@ -799,9 +797,10 @@ msgid "Search Replacement Resource:"
msgstr "खोज रिपà¥à¤²à¥‡à¤¸à¤®à¥‡à¤‚ट संसाधन:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -834,7 +833,8 @@ msgid "Error loading:"
msgstr "लोड होने मे तà¥à¤°à¥à¤Ÿà¤¿:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+#, fuzzy
+msgid "Load failed due to missing dependencies:"
msgstr "लापता निरà¥à¤­à¤°à¤¤à¤¾à¤“ं के कारण दृशà¥à¤¯ लोड करने में विफल रहे:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -894,14 +894,6 @@ msgstr "शबà¥à¤¦ बदलें मूलà¥à¤¯"
msgid "Thanks from the Godot community!"
msgstr "गोडोट समà¥à¤¦à¤¾à¤¯ से आपको धनà¥à¤¯à¤µà¤¾à¤¦!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr ""
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "गॉडोट इंजन योगदानकरà¥à¤¤à¤¾"
@@ -998,7 +990,8 @@ msgid "Uncompressing Assets"
msgstr "असंपीड़ित संपतà¥à¤¤à¤¿à¤¯à¤¾à¤‚"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+#, fuzzy
+msgid "Package installed successfully!"
msgstr "पैकेज सफलतापूरà¥à¤µà¤• सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया गया!"
#: editor/editor_asset_installer.cpp
@@ -1085,8 +1078,7 @@ msgid "Bus options"
msgstr "बस विकलà¥à¤ª"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿"
@@ -1245,7 +1237,7 @@ msgid "Add AutoLoad"
msgstr ""
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr ""
@@ -1253,8 +1245,8 @@ msgstr ""
msgid "Node Name:"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr ""
@@ -1324,11 +1316,15 @@ msgid "Template file not found:"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
+msgid "Select This Folder"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1336,12 +1332,13 @@ msgid "Copy Path"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-msgid "Open In File Manager"
-msgstr ""
+#, fuzzy
+msgid "Open in File Manager"
+msgstr "खोलो इसे"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+msgid "Show in File Manager"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1377,7 +1374,8 @@ msgid "Open a File or Directory"
msgstr ""
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr ""
@@ -1435,8 +1433,7 @@ msgstr ""
msgid "Preview:"
msgstr ""
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr ""
@@ -1452,24 +1449,11 @@ msgstr ""
msgid "(Re)Importing Assets"
msgstr ""
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr ""
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr ""
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr ""
@@ -1486,27 +1470,27 @@ msgid "Brief Description:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Members"
+msgid "Properties"
msgstr ""
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
+#: editor/editor_help.cpp
+msgid "Properties:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
+msgid "Methods"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods:"
+msgid "Methods:"
msgstr ""
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
+msgid "Theme Properties"
msgstr ""
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
+msgid "Theme Properties:"
msgstr ""
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
@@ -1534,8 +1518,14 @@ msgid "Constants:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Description"
-msgstr ""
+#, fuzzy
+msgid "Class Description"
+msgstr "विवरण:"
+
+#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
+msgstr "विवरण:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1549,12 +1539,14 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr ""
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "विवरण:"
#: editor/editor_help.cpp
-msgid "Property Description:"
-msgstr ""
+#, fuzzy
+msgid "Property Descriptions:"
+msgstr "विवरण:"
#: editor/editor_help.cpp
msgid ""
@@ -1563,12 +1555,14 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr ""
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "विवरण:"
#: editor/editor_help.cpp
-msgid "Method Description:"
-msgstr ""
+#, fuzzy
+msgid "Method Descriptions:"
+msgstr "विवरण:"
#: editor/editor_help.cpp
msgid ""
@@ -1576,11 +1570,53 @@ msgid ""
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-#: editor/editor_inspector.cpp
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
msgstr ""
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "संकेत"
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr ""
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1614,6 +1650,11 @@ msgstr ""
msgid "Error saving resource!"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr ""
@@ -1668,10 +1709,20 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr ""
@@ -1899,6 +1950,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1939,6 +1996,11 @@ msgstr ""
msgid "Default"
msgstr ""
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Play This Scene"
msgstr ""
@@ -2021,7 +2083,7 @@ msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2050,7 +2112,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -2074,7 +2136,7 @@ msgstr ""
msgid "Export"
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr ""
@@ -2088,6 +2150,7 @@ msgid "Quit to Project List"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr ""
@@ -2195,10 +2258,6 @@ msgstr ""
msgid "Help"
msgstr ""
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2221,11 +2280,11 @@ msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
-msgstr ""
+msgstr "समà¥à¤¦à¤¾à¤¯"
#: editor/editor_node.cpp
msgid "About"
-msgstr ""
+msgstr "के बारे में"
#: editor/editor_node.cpp
msgid "Play the project."
@@ -2292,21 +2351,21 @@ msgstr ""
msgid "Disable Update Spinner"
msgstr ""
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr ""
#: editor/editor_node.cpp
-msgid "Node"
+msgid "FileSystem"
msgstr ""
#: editor/editor_node.cpp
-msgid "FileSystem"
+msgid "Inspector"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Node"
msgstr ""
#: editor/editor_node.cpp
@@ -2443,7 +2502,7 @@ msgstr ""
msgid "Physics Frame %"
msgstr ""
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr ""
@@ -2467,7 +2526,7 @@ msgstr ""
msgid "Calls"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2479,20 +2538,44 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "गलत फॉणà¥à¤Ÿ का आकार |"
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr ""
@@ -2504,10 +2587,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2516,7 +2595,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr ""
@@ -2799,6 +2879,11 @@ msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr ""
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "पसंदीदा:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
@@ -2837,8 +2922,8 @@ msgstr "लोड होने मे तà¥à¤°à¥à¤Ÿà¤¿:"
msgid "Unable to update dependencies:"
msgstr "लापता निरà¥à¤­à¤°à¤¤à¤¾à¤“ं के कारण दृशà¥à¤¯ लोड करने में विफल रहे:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2846,10 +2931,6 @@ msgid "Provided name contains invalid characters"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr ""
@@ -2876,27 +2957,20 @@ msgid "Duplicating folder:"
msgstr "पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
+msgid "Open Scene(s)"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Move To..."
+msgid "Instance"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Open Scene(s)"
-msgstr ""
+#, fuzzy
+msgid "Add to favorites"
+msgstr "पसंदीदा:"
#: editor/filesystem_dock.cpp
-msgid "Instance"
+msgid "Remove from favorites"
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2907,12 +2981,20 @@ msgstr ""
msgid "View Owners..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr ""
+
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Duplicate..."
msgstr "पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿"
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -2921,6 +3003,14 @@ msgstr ""
msgid "New Resource..."
msgstr "संसाधन"
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr ""
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -2941,33 +3031,25 @@ msgid "Re-Scan Filesystem"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Toggle folder status as Favorite."
+msgid "Toggle split mode"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Show current scene file."
-msgstr ""
+#, fuzzy
+msgid "Search files"
+msgstr "खोज कर:"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "खोज कर:"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
msgstr ""
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr ""
@@ -2984,28 +3066,19 @@ msgid "Create Script"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Find in files"
+msgid "Find in Files"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Find: "
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Whole words"
+msgid "Find:"
msgstr ""
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "à¤à¤• जैसा:"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
+msgid "Folder:"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Filter: "
+msgid "Filters:"
msgstr ""
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -3022,6 +3095,10 @@ msgid "Cancel"
msgstr ""
#: editor/find_in_files.cpp
+msgid "Find: "
+msgstr ""
+
+#: editor/find_in_files.cpp
msgid "Replace: "
msgstr ""
@@ -3044,7 +3121,7 @@ msgstr ""
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr "गलत फॉणà¥à¤Ÿ का आकार |"
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3180,17 +3257,12 @@ msgstr ""
msgid "Failed to load resource."
msgstr ""
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr ""
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+msgid "Collapse All Properties"
msgstr ""
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3236,6 +3308,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr ""
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr ""
@@ -3297,44 +3373,45 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
-msgstr ""
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
+msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
-msgstr ""
+#, fuzzy
+msgid "Edit Polygon"
+msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+msgid "Remove Polygon And Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr ""
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr "à¤à¤• नया बनाà¤à¤‚"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3349,7 +3426,7 @@ msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Load.."
+msgid "Load..."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3378,13 +3455,8 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "à¤à¤• नया बनाà¤à¤‚"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-msgid "Erase points."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3424,9 +3496,8 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3460,7 +3531,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add Node.."
+msgid "Add Node..."
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3732,7 +3803,7 @@ msgstr "जà¥à¤¡à¤¿à¤¯à¥‡"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "परियोजना से चयनित फ़ाइलें निकालें? (कोई पूरà¥à¤µà¤µà¤¤ नहीं)"
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3800,10 +3871,6 @@ msgid "Amount:"
msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr ""
@@ -4001,7 +4068,7 @@ msgstr ""
msgid "Plugins"
msgstr ""
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr ""
@@ -4125,6 +4192,10 @@ msgid "Resize CanvasItem"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
msgstr ""
@@ -4145,21 +4216,19 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "छोटा करो"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "छोटा करो"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "बड़ा करो"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4188,6 +4257,10 @@ msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4282,6 +4355,10 @@ msgid "Restores the object's children's ability to be selected."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr ""
@@ -4332,6 +4409,10 @@ msgid "Show Viewport"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr ""
@@ -4400,7 +4481,16 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
msgstr ""
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
@@ -4502,35 +4592,9 @@ msgid "Item List Editor"
msgstr ""
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr ""
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr ""
@@ -4762,12 +4826,12 @@ msgid "Populate"
msgstr ""
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
+msgid "Generating Visibility Rect"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -4796,6 +4860,11 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr ""
@@ -4865,11 +4934,11 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Convert to CPUParticles"
+msgid "Generate AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -4894,6 +4963,11 @@ msgid "Add Point to Curve"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "नोड वकà¥à¤° संपादित करें"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr ""
@@ -4921,6 +4995,10 @@ msgid "Click: Add Point"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr ""
@@ -4936,11 +5014,6 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr ""
@@ -4997,6 +5070,10 @@ msgstr ""
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
msgid "Move joint"
msgstr ""
@@ -5007,78 +5084,85 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync bones"
+msgid "Sync Bones"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create UV Map"
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create Polygon & UV"
+msgid "Create UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
+msgid "Create Polygon & UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
+msgid "Create Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split already exists."
+msgid "Remove Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Add Split"
+msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "गलत फॉणà¥à¤Ÿ का आकार |"
+msgid "Add Custom Polygon"
+msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "मिटाना"
+msgid "Remove Custom Polygon"
+msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
-msgstr ""
+#, fuzzy
+msgid "Transform Polygon"
+msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Polygon 2D UV Editor"
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UV"
+msgid "Open Polygon 2D UV editor."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Poly"
+msgid "Polygon 2D UV Editor"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Splits"
+msgid "UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Bones"
+msgid "Points"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
+msgid "Polygons"
msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Points"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5106,19 +5190,21 @@ msgid "Scale Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Select a split to erase it"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5142,6 +5228,11 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr ""
@@ -5199,22 +5290,22 @@ msgid "Paste Resource"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr ""
@@ -5245,6 +5336,10 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Error could not load file."
msgstr ""
@@ -5254,20 +5349,24 @@ msgid "Error saving file!"
msgstr "लोड हो रहा है तà¥à¤°à¥à¤Ÿà¤¿à¤¯à¤¾à¤!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr ""
+#, fuzzy
+msgid "Error while saving theme."
+msgstr "लोड हो रहा है तà¥à¤°à¥à¤Ÿà¤¿à¤¯à¤¾à¤!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
-msgstr ""
+#, fuzzy
+msgid "Error Saving"
+msgstr "लोड होने मे तà¥à¤°à¥à¤Ÿà¤¿:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr ""
+#, fuzzy
+msgid "Error importing theme."
+msgstr "लोड होने मे तà¥à¤°à¥à¤Ÿà¤¿:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
-msgstr ""
+#, fuzzy
+msgid "Error Importing"
+msgstr "लोड होने मे तà¥à¤°à¥à¤Ÿà¤¿:"
#: editor/plugins/script_editor_plugin.cpp
msgid "New TextFile..."
@@ -5287,6 +5386,14 @@ msgid "Import Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr ""
@@ -5327,8 +5434,9 @@ msgid "File"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile"
-msgstr ""
+#, fuzzy
+msgid "Open..."
+msgstr "खोलो इसे"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5343,11 +5451,7 @@ msgid "Copy Script Path"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+msgid "History Previous"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5360,15 +5464,15 @@ msgid "Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Reload Theme"
+msgid "Import Theme..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme"
+msgid "Reload Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
+msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5418,7 +5522,7 @@ msgid "Keep Debugger Open"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5426,10 +5530,6 @@ msgid "Open Godot online documentation"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -5464,17 +5564,9 @@ msgid "Debugger"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search results"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search in files"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
+#, fuzzy
+msgid "Search Results"
+msgstr "खोज कर:"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -5486,6 +5578,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "कारà¥à¤¯à¥‹à¤‚:"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr ""
@@ -5517,10 +5618,6 @@ msgstr ""
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5572,11 +5669,11 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5593,19 +5690,11 @@ msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
+msgid "Go to Next Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
+msgid "Go to Previous Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5613,15 +5702,15 @@ msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+msgid "Go to Function..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5714,6 +5803,14 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -5878,6 +5975,10 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -5977,10 +6078,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap To Floor"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6097,6 +6194,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
msgstr ""
@@ -6211,11 +6312,16 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6379,6 +6485,11 @@ msgid "Fix Invalid Tiles"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "डà¥à¤ªà¥à¤²à¤¿à¤•ेट चयन"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6424,32 +6535,38 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "सभी खंड"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
+msgid "Rotate left"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
+msgid "Rotate right"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Flip vertically"
msgstr ""
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Clear transform"
+msgstr "à¤à¤¨à¥€à¤®à¥‡à¤¶à¤¨ परिवरà¥à¤¤à¤¨ परिणत"
+
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove current Texture from TileSet"
-msgstr ""
+#, fuzzy
+msgid "Remove selected Texture from TileSet."
+msgstr "परियोजना से चयनित फ़ाइलें निकालें? (कोई पूरà¥à¤µà¤µà¤¤ नहीं)"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -6460,25 +6577,45 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Erase bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "परियोजना से चयनित फ़ाइलें निकालें? (कोई पूरà¥à¤µà¤µà¤¤ नहीं)"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6486,7 +6623,12 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "मिटाना"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6496,15 +6638,25 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "चयनित फ़ाइलें हटाà¤à¤‚?"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr ""
@@ -6522,11 +6674,92 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "à¤à¤• नया बनाà¤à¤‚"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "मिटाना"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "This property can't be changed."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
+msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6562,6 +6795,14 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6570,6 +6811,10 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+msgid "Export Path"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6624,10 +6869,46 @@ msgid "Feature List:"
msgstr ""
#: editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr ""
#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -6757,7 +7038,7 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
-msgid "Can't open project"
+msgid "Can't open project at '%s'."
msgstr ""
#: editor/project_manager.cpp
@@ -6766,6 +7047,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7078,11 +7377,7 @@ msgstr ""
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "General"
-msgstr ""
-
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
+msgstr "सामानà¥à¤¯"
#: editor/project_settings_editor.cpp
msgid "Override For..."
@@ -7217,10 +7512,6 @@ msgstr ""
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr ""
@@ -7304,7 +7595,7 @@ msgid "Step"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7313,7 +7604,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7354,7 +7645,7 @@ msgstr ""
msgid "Reset"
msgstr "रीसेट आकार"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7413,6 +7704,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr ""
@@ -7449,6 +7744,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7521,6 +7822,10 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr ""
@@ -7529,11 +7834,11 @@ msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Change Type"
+msgid "Extend Script"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -7683,6 +7988,10 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -7771,19 +8080,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -7815,18 +8112,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -8023,7 +8308,7 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+msgid "Step argument is zero!"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
@@ -8246,11 +8531,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -8520,6 +8801,10 @@ msgid "Base Type:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr ""
@@ -8618,11 +8903,11 @@ msgid "Search VisualScript"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8700,6 +8985,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -8738,6 +9029,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -8855,6 +9152,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -8874,6 +9181,26 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -8906,7 +9233,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -8961,6 +9288,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr ""
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr ""
@@ -8977,10 +9308,6 @@ msgstr ""
msgid "Please Confirm..."
msgstr ""
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr ""
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -8988,6 +9315,10 @@ msgid ""
"hide upon running."
msgstr ""
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9033,10 +9364,6 @@ msgstr "गलत फॉणà¥à¤Ÿ का आकार |"
msgid "Input"
msgstr ""
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
@@ -9055,12 +9382,29 @@ msgid "Varyings can only be assigned in vertex function."
msgstr ""
#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "मिटाना"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "छोटा करो"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "बड़ा करो"
+
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "बड़ा करो"
+
+#, fuzzy
+#~ msgid "Match case"
+#~ msgstr "à¤à¤• जैसा:"
+
+#, fuzzy
#~ msgid "Disabled"
#~ msgstr "बंद कर दिया गया है"
-#~ msgid "Edit Node Curve"
-#~ msgstr "नोड वकà¥à¤° संपादित करें"
-
#~ msgid "Thanks!"
#~ msgstr "धनà¥à¤¯à¤µà¤¾à¤¦!"
diff --git a/editor/translations/hr.po b/editor/translations/hr.po
new file mode 100644
index 0000000000..d69409b615
--- /dev/null
+++ b/editor/translations/hr.po
@@ -0,0 +1,9244 @@
+# Croatian translation of the Godot Engine editor
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
+# This file is distributed under the same license as the Godot source code.
+# Unlimited Creativity <marinosah1@gmail.com>, 2019.
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2019-01-06 15:06+0000\n"
+"Last-Translator: Unlimited Creativity <marinosah1@gmail.com>\n"
+"Language-Team: Croatian <https://hosted.weblate.org/projects/godot-engine/"
+"godot/hr/>\n"
+"Language: hr\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 3.4-dev\n"
+
+#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr "Neispravni argument za convert(), upotrijebi konstantu TYPE_*"
+
+#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
+#: modules/mono/glue/gd_glue.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid input %i (not passed) in expression"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "self can't be used because instance is null (not passed)"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid operands to operator %s, %s and %s."
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid index of type %s for base type %s"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid named index '%s' for base type %s"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid arguments to construct '%s'"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "On call to '%s':"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Free"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Balanced"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Mirror"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Insert Key Here"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Duplicate Selected Key(s)"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Delete Selected Key(s)"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
+msgid "Anim Delete Keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Keyframe Time"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Transition"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Transform"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Keyframe Value"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Call"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Property Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "3D Transform Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Call Method Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Bezier Curve Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Audio Playback Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation Playback Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Add Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation Length Time (seconds)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation Looping"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Audio Clips:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Clips:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Toggle this track on/off."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Update Mode (How this property is set)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Interpolation Mode"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove this track."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Time (s): "
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Continuous"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Discrete"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Trigger"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Capture"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Nearest"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
+#: editor/property_editor.cpp
+msgid "Linear"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Cubic"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clamp Loop Interp"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Wrap Loop Interp"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Duplicate Key(s)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Delete Key(s)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove Anim Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/create_dialog.cpp
+#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
+#: editor/plugin_config_dialog.cpp
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
+msgid "Create"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "AnimationPlayer can't animate itself, only other players."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Create & Insert"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Transform tracks only apply to Spatial-based nodes."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid ""
+"Audio tracks can only point to nodes of type:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation tracks can only point to AnimationPlayer nodes."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "An animation player can't animate itself, only other players."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Not possible to add a new track without a root"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Track path is invalid, so can't add a key."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Track is not of type Spatial, can't insert key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Track path is invalid, so can't add a method key."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Method not found in object: "
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Move Keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clipboard is empty"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Scale Keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid ""
+"This option does not work for Bezier editing, as it's only a single track."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Only show tracks from nodes selected in tree."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Group tracks by node or display them as plain list."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Snap (s): "
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation step value."
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/editor_properties.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+#: editor/project_manager.cpp editor/project_settings_editor.cpp
+#: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp
+msgid "Edit"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation properties."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Copy Tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Paste Tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Scale Selection"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Scale From Cursor"
+msgstr ""
+
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Duplicate Transposed"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Delete Selection"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Go to Next Step"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Go to Previous Step"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Optimize Animation"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up Animation"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Pick the node that will be animated:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Use Bezier Curves"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim. Optimizer"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Max. Linear Error:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Max. Angular Error:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Optimize"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove invalid keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-up all animations"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Scale Ratio:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Select tracks to copy:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/editor_properties.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Copy"
+msgstr ""
+
+#: editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr ""
+
+#: editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr ""
+
+#: editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Go to Line"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Line Number:"
+msgstr ""
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "No Matches"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Replaced %d occurrence(s)."
+msgstr ""
+
+#: editor/code_editor.cpp editor/find_in_files.cpp
+msgid "Match Case"
+msgstr ""
+
+#: editor/code_editor.cpp editor/find_in_files.cpp
+msgid "Whole Words"
+msgstr ""
+
+#: editor/code_editor.cpp editor/rename_dialog.cpp
+msgid "Replace"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Replace All"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Selection Only"
+msgstr ""
+
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom In"
+msgstr ""
+
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Out"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Warnings:"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Font Size:"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Line:"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Col:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
+#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
+msgid "Add"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/dependency_editor.cpp
+#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_settings_editor.cpp
+msgid "Remove"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/dependency_editor.cpp
+#: editor/export_template_manager.cpp editor/groups_editor.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp
+#: editor/project_settings_editor.cpp editor/property_editor.cpp
+#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Close"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect '%s' from '%s'"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect all from signal: '%s'"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect..."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Disconnect"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect Signal: "
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Edit Connection: "
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
+msgid "Signals"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Are you sure you want to remove all connections from this signal?"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect All"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Edit..."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Go To Method"
+msgstr ""
+
+#: editor/create_dialog.cpp
+msgid "Change %s Type"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/project_settings_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr ""
+
+#: editor/create_dialog.cpp
+msgid "Create New %s"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Search:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Matches:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Description:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+
+#: editor/dependency_editor.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Dependencies"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Resource"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
+msgid "Path"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+#: scene/gui/file_dialog.cpp
+msgid "Open"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+msgid "Cannot remove:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Load failed due to missing dependencies:"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_node.cpp
+msgid "Open Anyway"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Owns"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp
+#: editor/editor_file_dialog.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/item_list_editor_plugin.cpp
+#: editor/project_export.cpp editor/project_settings_editor.cpp
+#: editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr ""
+
+#: editor/dictionary_property_edit.cpp
+msgid "Change Dictionary Key"
+msgstr ""
+
+#: editor/dictionary_property_edit.cpp
+msgid "Change Dictionary Value"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Godot Engine contributors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Project Founders"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Lead Developer"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Project Manager "
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Developers"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Authors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Platinum Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Gold Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Mini Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Gold Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Silver Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Bronze Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "License"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Thirdparty License"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid ""
+"Godot Engine relies on a number of thirdparty free and open source "
+"libraries, all compatible with the terms of its MIT license. The following "
+"is an exhaustive list of all such thirdparty components with their "
+"respective copyright statements and license terms."
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "All Components"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Components"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Licenses"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp editor/project_manager.cpp
+msgid "Error opening package file, not in zip format."
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+msgid "Uncompressing Assets"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp editor/project_manager.cpp
+msgid "Package installed successfully!"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Success!"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Install"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+msgid "Package Installer"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Speakers"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Rename Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Change Audio Bus Volume"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Solo"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Mute"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Bypass Effects"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Select Audio Bus Send"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Audio Bus Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Move Bus Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Bus Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Audio Bus, Drag and Drop to rearrange."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Solo"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Mute"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Bypass"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Bus options"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Reset Volume"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Audio"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Master bus can't be deleted!"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Duplicate Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Reset Bus Volume"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Move Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Save Audio Bus Layout As..."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Location for New Layout..."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Open Audio Bus Layout"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "There is no 'res://default_bus_layout.tres' file."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Invalid file, not an audio bus layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Create a new Bus Layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/editor_properties.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
+#: editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Load an existing Bus Layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Save As"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Save this Bus Layout to a file."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/import_dock.cpp
+msgid "Load Default"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Load the default Bus Layout."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
+msgid "Path:"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
+msgid "Name"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "Storing local changes..."
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "Updating scene..."
+msgstr ""
+
+#: editor/editor_data.cpp editor/editor_properties.cpp
+msgid "[empty]"
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "[unsaved]"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp
+msgid "Please select a base directory first"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
+msgid "Create Folder"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp
+#: scene/gui/file_dialog.cpp
+msgid "Name:"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
+msgid "Could not create folder."
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid "Storing File:"
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid "Packing"
+msgstr ""
+
+#: editor/editor_export.cpp platform/javascript/export/export.cpp
+msgid "Template file not found:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select This Folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "Open in File Manager"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+#: editor/project_manager.cpp
+msgid "Show in File Manager"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "New Folder..."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "All Recognized"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "All Files (*)"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/editor_node.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
+msgid "Save"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Save a File"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Go to parent folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Directories & Files:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
+#: editor/plugins/style_box_editor_plugin.cpp
+msgid "Preview:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "File:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr ""
+
+#: editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr ""
+
+#: editor/editor_file_system.cpp
+msgid "(Re)Importing Assets"
+msgstr ""
+
+#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class:"
+msgstr ""
+
+#: editor/editor_help.cpp editor/scene_tree_editor.cpp
+msgid "Inherits:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Properties"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Methods"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Methods:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Theme Properties"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Theme Properties:"
+msgstr ""
+
+#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
+msgid "Signals:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Enumerations"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Enumerations:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "enum "
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Constants"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Constants:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class Description"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Online Tutorials:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid ""
+"There are currently no tutorials for this class, you can [color=$color][url="
+"$url]contribute one[/url][/color] or [color=$color][url=$url2]request one[/"
+"url][/color]."
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Property Descriptions"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Property Descriptions:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid ""
+"There is currently no description for this property. Please help us by "
+"[color=$color][url=$url]contributing one[/url][/color]!"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Method Descriptions"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Method Descriptions:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid ""
+"There is currently no description for this method. Please help us by [color="
+"$color][url=$url]contributing one[/url][/color]!"
+msgstr ""
+
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr ""
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
+msgid "Set"
+msgstr ""
+
+#: editor/editor_inspector.cpp
+msgid "Set Multiple:"
+msgstr ""
+
+#: editor/editor_log.cpp
+msgid "Output:"
+msgstr ""
+
+#: editor/editor_log.cpp editor/editor_profiler.cpp
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/property_editor.cpp editor/scene_tree_dock.cpp
+#: editor/script_editor_debugger.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp
+#: scene/gui/text_edit.cpp
+msgid "Clear"
+msgstr ""
+
+#: editor/editor_log.cpp
+msgid "Clear Output"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Project export failed with error code %d."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Error saving resource!"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save Resource As..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error while saving."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Can't open '%s'. The file could have been moved or deleted."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error while parsing '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unexpected end of file '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Missing '%s' or its dependencies."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error while loading '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Analyzing"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a tree root."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
+"be satisfied."
+msgstr ""
+
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource belongs to a scene that was imported, so it's not editable.\n"
+"Please read the documentation relevant to importing scenes to better "
+"understand this workflow."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource belongs to a scene that was instanced or inherited.\n"
+"Changes to it will not be kept when saving the current scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource was imported, so it's not editable. Change its settings in the "
+"import panel and then re-import."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This scene was imported, so changes to it will not be kept.\n"
+"Instancing it or inheriting will allow making changes to it.\n"
+"Please read the documentation relevant to importing scenes to better "
+"understand this workflow."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This is a remote object so changes to it will not be kept.\n"
+"Please read the documentation relevant to debugging to better understand "
+"this workflow."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Open Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Open Script..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save & Close"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save changes to '%s' before closing?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save Scene As..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "No"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Yes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a root node."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a selected node."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Revert"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Run Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quit"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Project Manager?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save & Quit"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save changes to the following scene(s) before quitting?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save changes the following scene(s) before opening Project Manager?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This option is deprecated. Situations where refresh must be forced are now "
+"considered a bug. Please report."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to find script field for addon plugin at: 'res://addons/%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to load addon script from path: '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to load addon script from path: '%s' Script is not in tool mode."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Scene '%s' was automatically imported, so it can't be modified.\n"
+"To make changes to it, a new inherited scene can be created."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Clear Recent Scenes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save Layout"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr ""
+
+#: editor/editor_node.cpp editor/import_dock.cpp
+#: editor/script_create_dialog.cpp
+msgid "Default"
+msgstr ""
+
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play This Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Close Tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "%d more files or folders"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "%d more folders"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "%d more files"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Dock Position"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Toggle distraction-free mode."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Add a new scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Next tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Previous tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Filter Files..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "New Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "New Inherited Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save All Scenes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Convert To..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "MeshLibrary..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "TileSet..."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Undo"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Redo"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Project"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Project Settings"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_export.cpp
+msgid "Export"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Project Data Folder"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
+msgid "Debug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Editor"
+msgstr ""
+
+#: editor/editor_node.cpp editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Editor Data/Settings Folder"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Editor Data Folder"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Editor Settings Folder"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Help"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+msgid "Search"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Online Docs"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Q&A"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Issue Tracker"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "About"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play the project."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr ""
+
+#: editor/editor_node.cpp editor/editor_profiler.cpp
+msgid "Stop"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Changing the video driver requires restarting the editor."
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_settings_editor.cpp
+#: editor/settings_config_dialog.cpp
+msgid "Save & Restart"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Update Always"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Update Changes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
+#: editor/project_manager.cpp
+msgid "Import"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Expand Bottom Panel"
+msgstr ""
+
+#: editor/editor_node.cpp scene/resources/visual_shader.cpp
+msgid "Output"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Don't Save"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_export.cpp
+msgid "Export Project"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export Library"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Password:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "New Inherited"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Load Errors"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open 2D Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open 3D Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Script Editor"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "Open Asset Library"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open the next Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open the previous Editor"
+msgstr ""
+
+#: editor/editor_plugin.cpp
+msgid "Creating Mesh Previews"
+msgstr ""
+
+#: editor/editor_plugin.cpp
+msgid "Thumbnail..."
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Edit Plugin"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+msgid "Update"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Version:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+msgid "Author:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Edit:"
+msgstr ""
+
+#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
+#: editor/rename_dialog.cpp
+msgid "Start"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Physics Frame %"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Time:"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Time"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Calls"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "On"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Layer"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Bit %d, value %d"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "[Empty]"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Invalid RID"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Pick a Viewport"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "New Script"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "New %s"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Make Unique"
+msgstr ""
+
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Paste"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Convert To %s"
+msgstr ""
+
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Open Editor"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Selected node is not a Viewport!"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Size: "
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Page: "
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "New Key:"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "New Value:"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Add Key/Value Pair"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: editor/editor_run_native.cpp
+msgid "Select device from the list"
+msgstr ""
+
+#: editor/editor_run_native.cpp
+msgid ""
+"No runnable export preset found for this platform.\n"
+"Please add a runnable preset in the export menu."
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Re-Download"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Uninstall"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "(Installed)"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "(Missing)"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "(Current)"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Retrieving mirrors, please wait..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Remove template version '%s'?"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Can't open export templates zip."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Invalid version.txt format inside templates: %s."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "No version.txt found inside templates."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Error creating path for templates:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Extracting Export Templates"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Importing:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid ""
+"No download links found for this version. Direct download is only available "
+"for official releases."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't connect."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "No response."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request Failed."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect Loop."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Failed:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Download Complete."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid ""
+"Templates installation failed. The problematic templates archives can be "
+"found at '%s'."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Error requesting url: "
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Connecting to Mirror..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Disconnected"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Resolving"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Can't Resolve"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Connecting..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Can't Connect"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Connected"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Requesting..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Downloading"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Connection Error"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "SSL Handshake Error"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Current Version:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Installed Versions:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Install From File"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Remove Template"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Select template file"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Export Template Manager"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Download Templates"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Select mirror from list: (Shift+Click: Open in Browser)"
+msgstr ""
+
+#: editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "View items as a grid of thumbnails."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "View items as a list."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Status: Import of file failed. Please fix file and reimport manually."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Cannot move/rename resources root."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Cannot move a folder into itself."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Error moving:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Error duplicating:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Unable to update dependencies:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Provided name contains invalid characters"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "A file or folder with this name already exists."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Renaming file:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Renaming folder:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicating file:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicating folder:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Open Scene(s)"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Add to favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Remove from favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Edit Dependencies..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "View Owners..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicate..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+msgid "New Script..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "New Resource..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/project_manager.cpp editor/rename_dialog.cpp
+#: editor/scene_tree_dock.cpp
+msgid "Rename"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Toggle split mode"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Search files"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid ""
+"Scanning Files,\n"
+"Please Wait..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "There is already file or folder with the same name in this location."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Overwrite"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Find in Files"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Find:"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Folder:"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Filters:"
+msgstr ""
+
+#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+msgid "Find..."
+msgstr ""
+
+#: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp
+msgid "Replace..."
+msgstr ""
+
+#: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp
+msgid "Cancel"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Find: "
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Replace: "
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Replace all (no undo)"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Searching..."
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Search complete"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Group name already exists."
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Invalid group name."
+msgstr ""
+
+#: editor/groups_editor.cpp editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Nodes not in Group"
+msgstr ""
+
+#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
+msgid "Filter nodes"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Nodes in Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Manage Groups"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Single Scene"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Materials"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Materials"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Materials+Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Materials+Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Multiple Scenes"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Multiple Scenes+Materials"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Import Scene"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Importing Scene..."
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Generating Lightmaps"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Generating for Mesh: "
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Running Custom Script..."
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Saving..."
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Set as Default for '%s'"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Clear Default for '%s'"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid " Files"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Import As:"
+msgstr ""
+
+#: editor/import_dock.cpp editor/property_editor.cpp
+msgid "Preset..."
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Reimport"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Failed to load resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Expand All Properties"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Collapse All Properties"
+msgstr ""
+
+#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save As..."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Copy Params"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Edit Resource Clipboard"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Copy Resource"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Make Built-In"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Open in Help"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Object properties."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Filter properties"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Changes may be lost!"
+msgstr ""
+
+#: editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Edit a Plugin"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Create a Plugin"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Plugin Name:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Subfolder:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Language:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Script Name:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Activate now?"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Edit Polygon"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Insert Point"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Edit Polygon (Remove Point)"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Remove Polygon And Point"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid ""
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Load..."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "This type of node can't be used. Only root nodes are allowed."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid ""
+"AnimationTree is inactive.\n"
+"Activate to enable playback, check node warnings if activation fails."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Set the blending position within the space"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Select and move points, create points with RMB."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Open Animation Node"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Triangle already exists"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "BlendSpace2D does not belong to an AnimationTree node."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "No triangles exist, so no blending can take place."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create triangles by connecting points."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Erase points and triangles."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Generate blend triangles automatically (instead of manually)"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Edit Filters"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Output node can't be added to the blend tree."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Unable to connect, port may be in use or connection may be invalid."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "No animation player set, so unable to retrieve track names."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Player path set is invalid, so unable to retrieve track names."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid ""
+"Animation player has no valid root node path, so unable to retrieve track "
+"names."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add Node..."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "Edit Filtered Tracks:"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Enable filtering"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Delete Animation?"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Invalid animation name!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation name already exists!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation to copy!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation resource on clipboard!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation to edit!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Transitions..."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Open in Inspector"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Onion Skinning"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Enable Onion Skinning"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Directions"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Past"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Future"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Depth"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "1 step"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "2 steps"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "3 steps"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Differences Only"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Force White Modulate"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Include Gizmos (3D)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pin AnimationPlayer"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "End"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Immediate"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Sync"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "At End"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Travel"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Start and end nodes are needed for a sub-transition."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "No playback resource set at path: %s."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid ""
+"Select and move nodes.\n"
+"RMB to add new nodes.\n"
+"Shift+LMB to create connections."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Create new nodes."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Connect nodes."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Remove selected node or transition."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Toggle autoplay this animation on start, restart or seek to zero."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Set the end animation. This is useful for sub-transitions."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Transition: "
+msgstr ""
+
+#: editor/plugins/animation_tree_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "AnimationTree"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Import Animations..."
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Filters..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Contents:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "View Files"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Connection error, please try again."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't connect to host:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "No response from host:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, return code:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, too many redirects"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Bad download hash, assuming file has been tampered with."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Expected:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Got:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Failed sha256 hash check"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Asset Download Error:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Downloading (%s / %s)..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Downloading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Resolving..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Error making request"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Idle"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Retry"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download Error"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download for this asset is already in progress!"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "First"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Previous"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Next"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Last"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "All"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+msgid "Sort:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/project_settings_editor.cpp
+msgid "Category:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Support..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid ""
+"Can't determine a save path for lightmap images.\n"
+"Save your scene (for images to be saved in the same dir), or pick a save "
+"path from the BakedLightmap properties."
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid ""
+"No meshes to bake. Make sure they contain an UV2 channel and that the 'Bake "
+"Light' flag is on."
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid "Failed creating lightmap images, make sure path is writable."
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid "Bake Lightmaps"
+msgstr ""
+
+#: editor/plugins/camera_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+msgid "Preview"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move vertical guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create new vertical guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Remove vertical guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move horizontal guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create new horizontal guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Remove horizontal guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create new horizontal and vertical guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move pivot"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move anchor"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Resize CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchors only"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors and Margins"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Toggle snapping."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snapping Options"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to grid"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Smart snapping"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to parent"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to node anchor"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to node sides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to node center"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to other nodes"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Custom Bone(s) from Node(s)"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Custom Bones"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Helpers"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Rulers"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Origin"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Viewport"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Layout"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert keys."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Multiply grid step by 2"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Divide grid step by 2"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Cannot instantiate multiple nodes without root."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change default type"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Polygon3D"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+msgid "CPUParticles"
+msgstr ""
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emission Points From Mesh"
+msgstr ""
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emission Points From Node"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Flat0"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Flat1"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Ease in"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Ease out"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Smoothstep"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Modify Curve Point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Modify Curve Tangent"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Load Curve Preset"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Add point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Remove point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Left linear"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Right linear"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Load preset"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Remove Curve Point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Toggle Curve Linear Tangent"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Hold Shift to edit tangents individually"
+msgstr ""
+
+#: editor/plugins/gi_probe_editor_plugin.cpp
+msgid "Bake GI Probe"
+msgstr ""
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Contained Mesh is not of type ArrayMesh."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "UV Unwrap failed, mesh may not be manifold?"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "No mesh to debug."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Model has no UV in this layer"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh..."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "View UV1"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "View UV2"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Unwrap UV2 for Lightmap/AO"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generating Visibility Rect"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Can only set point into a ParticlesMaterial process material"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image..."
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generate Visibility Rect"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Particles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generation Time (sec):"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Emission Mask"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Capture from Pixel"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Emission Colors"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Points:"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Surface Points"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Surface Points+Normal (Directed)"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Source: "
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "A processor material of type 'ParticlesMaterial' is required."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generating AABB"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generate Visibility AABB"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Out-Control from Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove In-Control from Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp editor/plugins/theme_editor_plugin.cpp
+#: editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Mirror Handle Angles"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Mirror Handle Lengths"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Position"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Position"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Position"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove Out-Control Point"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove In-Control Point"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/physical_bone_plugin.cpp
+msgid "Move joint"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Sync Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon & UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Internal Vertex"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Remove Internal Vertex"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Add Custom Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Remove Custom Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Open Polygon 2D UV editor."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Points"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygons"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Points"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create a custom polygon. Enables custom polygon rendering."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint weights with specified intensity."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Unpaint weights with specified intensity."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Radius:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Settings"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Configure Grid:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset X:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset Y:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step X:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step Y:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Sync Bones to Polygon"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
+#: editor/scene_tree_editor.cpp
+msgid "Type:"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ResourcePreloader"
+msgstr ""
+
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "AnimationTree has no path set to an AnimationPlayer"
+msgstr ""
+
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "Path to AnimationPlayer is invalid"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Files"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close and save changes?"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error writing TextFile:"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error could not load file."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving file!"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error Saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error Importing"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "New TextFile..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open File"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save File As..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid " Class Reference"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Toggle alphabetical sorting of the method list."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Sort"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Move Up"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Move Down"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "File"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Copy Script Path"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "History Previous"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Other Tabs"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Toggle Scripts Panel"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+msgid "Find Next"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Debug with External Editor"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open Godot online documentation"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Discard"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Results"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Line"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "(ignore)"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Only resources from filesystem can be dropped."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Lookup Symbol"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Convert Case"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Uppercase"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Lowercase"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Capitalize"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Syntax Highlighter"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
+#: scene/gui/text_edit.cpp
+msgid "Cut"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
+#: scene/gui/text_edit.cpp
+msgid "Select All"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Delete Line"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Fold/Unfold Line"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Fold All Lines"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Unfold All Lines"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Convert Indent to Spaces"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Convert Indent to Tabs"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Find in Files..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Line..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: editor/plugins/shader_editor_plugin.cpp
+msgid "Shader"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "This skeleton has no bones, create some children Bone2D nodes."
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Skeleton2D"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Make Rest Pose (From Bones)"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Set Bones to Rest Pose"
+msgstr ""
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Create physical bones"
+msgstr ""
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Skeleton"
+msgstr ""
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Create physical skeleton"
+msgstr ""
+
+#: editor/plugins/skeleton_ik_editor_plugin.cpp
+msgid "Play IK"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling: "
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translating: "
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Objects Drawn"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Material Changes"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Shader Changes"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Surface Changes"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Draw Calls"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Vertices"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "FPS"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Lock View Rotation"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Unshaded"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Environment"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Gizmos"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Information"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View FPS"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Half Resolution"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Doppler Enable"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Cinematic Preview"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Left"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Right"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Forward"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Backwards"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Up"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Down"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Speed Modifier"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Select Mode (Q)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Drag: Rotate\n"
+"Alt+Drag: Move\n"
+"Alt+RMB: Depth list selection"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Space Mode (%s)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Mode (%s)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Tool Select"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Tool Move"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Tool Rotate"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Tool Scale"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Toggle Freelook"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap object to floor"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog..."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Settings"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Sprite is empty!"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Can't convert a sprite using animation frames to mesh."
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Invalid geometry, can't replace by mesh."
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Sprite"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Convert to 2D Mesh"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create 2D Mesh"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Simplification: "
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Grow (Pixels): "
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Update Preview"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Settings:"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Move (Before)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Move (After)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "SpriteFrames"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Region Rect"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: scene/resources/visual_shader.cpp
+msgid "None"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Sep.:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "TextureRegion"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove All Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove All"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Edit theme..."
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Theme editing menu."
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create From Current Editor Theme"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Radio Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Radio Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Has,Many,Options"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
+msgid "Style"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase Selection"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Fix Invalid Tiles"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Cut Selection"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Line Draw"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rectangle Paint"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket Fill"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find Tile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint Tile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Copy Selection"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate left"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate right"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Flip horizontally"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Flip vertically"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Clear transform"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Texture(s) to TileSet."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove selected Texture from TileSet."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Erase bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new polygon."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "You haven't selected a texture to remove."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Texture"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Drag handles to edit Rect.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete selected Rect."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select current edited sub-tile.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete polygon."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to use as icon, this will be also used on invalid autotile "
+"bindings.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its priority.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Tile"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Tile"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "This property can't be changed."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "TileSet"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vertex"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Fragment"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Light"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "VisualShader"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Runnable"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Delete patch '%s' from list?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Delete preset '%s'?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export templates for this platform are missing/corrupted:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Presets"
+msgstr ""
+
+#: editor/project_export.cpp editor/project_settings_editor.cpp
+msgid "Add..."
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export Path"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export all resources in the project"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export selected scenes (and dependencies)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export selected resources (and dependencies)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Resources to export:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma separated, e.g: *.json, *.txt)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid ""
+"Filters to exclude files from project (comma separated, e.g: *.json, *.txt)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Patches"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Make Patch"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Features"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Custom (comma-separated):"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Feature List:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export templates for this platform are missing:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export With Debug"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "The path does not exist."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Please choose an empty folder."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Please choose a 'project.godot' or '.zip' file."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Directory already contains a Godot project."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Imported Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Invalid Project Name."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Couldn't create folder."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "There is already a folder in this path with the specified name."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "It would be a good idea to name your project."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Couldn't load project.godot in project path (error %d). It may be missing or "
+"corrupted."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Couldn't edit project.godot in project path."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Couldn't create project.godot in project path."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Rename Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Import & Edit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Create & Edit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Install & Edit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Create folder"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Installation Path:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Can't open project at '%s'."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Can't run project: no main scene defined.\n"
+"Please edit the project and set the main scene in \"Project Settings\" under "
+"the \"Application\" category."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Can't run project: Assets need to be imported.\n"
+"Please edit the project to trigger the initial import."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Language changed.\n"
+"The UI will update next time the editor or project manager starts."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project List"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Templates"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Exit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Restart Now"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Can't run project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"You don't currently have any projects.\n"
+"Would you like to explore the official example projects in the Asset Library?"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Key "
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid ""
+"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
+"'\"'"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Action '%s' already exists!"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Change Action deadzone"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "All Devices"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Device"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Press a Key..."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Left Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Right Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Left Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Right Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "X Button 1"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "X Button 2"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joypad Axis Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Axis"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joypad Button Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Erase Input Action"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Left Button."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Right Button."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Middle Button."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Up."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Down."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Global Property"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Select a setting item first!"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "No property '%s' exists."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Setting '%s' is internal, and it can't be deleted."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Delete Item"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid ""
+"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
+"'\"'."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Already existing"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Settings saved OK."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Override for Feature"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Changed Locale Filter"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Changed Locale Filter Mode"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Project Settings (project.godot)"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Override For..."
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Editor must be restarted for changes to take effect"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Input Map"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Action:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Action"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Deadzone"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Device:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Localization"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Translations"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Translations:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remaps"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Resources:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Locale"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Locales Filter"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Show all locales"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Show only selected locales"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Filter mode:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Locales:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "File..."
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Dir..."
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Select Node"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Pick a Node"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: editor/property_selector.cpp
+msgid "Select Property"
+msgstr ""
+
+#: editor/property_selector.cpp
+msgid "Select Virtual Method"
+msgstr ""
+
+#: editor/property_selector.cpp
+msgid "Select Method"
+msgstr ""
+
+#: editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr ""
+
+#: editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+
+#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Batch Rename"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Prefix"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Advanced options"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Substitute"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Node name"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Node's parent name, if available"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Node type"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Current scene name"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Root node name"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid ""
+"Sequential integer counter.\n"
+"Compare counter options."
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Per Level counter"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "If set the counter restarts for each group of child nodes"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Initial value for the counter"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Step"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Amount by which counter is incremented for each node"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Padding"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid ""
+"Minimum number of digits for the counter.\n"
+"Missing digits are padded with leading zeros."
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Regular Expressions"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Post-Process"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Keep"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "CamelCase to under_scored"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "under_scored to CamelCase"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Case"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "To Lowercase"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "To Uppercase"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Reset"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Error"
+msgstr ""
+
+#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Script"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can not perform with the root node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Save New Scene As..."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Create Root Node:"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "2D Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "3D Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "User Interface"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Custom Node"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Sub-Resources"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Extend Script"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Make Scene Root"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Copy Node Path"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Remote"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Local"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Toggle Visible"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Node configuration warning:"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node has connection(s) and group(s).\n"
+"Click to show signals dock."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node has connections.\n"
+"Click to show signals dock."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node is in group(s).\n"
+"Click to show groups dock."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp editor/script_create_dialog.cpp
+msgid "Open Script"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node is locked.\n"
+"Click to unlock it."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Children are not selectable.\n"
+"Click to make selectable."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Toggle Visibility"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"AnimationPlayer is pinned.\n"
+"Click to unpin."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Node Configuration Warning!"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Error loading template '%s'"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Error - Could not create script in filesystem."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Open Script/Choose Location"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Directory of the same name exists"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "File exists, will be reused"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Wrong extension chosen"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid Path"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid inherited parent name or path"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Script valid"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Allowed: a-z, A-Z, 0-9 and _"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Built-in script (into scene file)"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Create new script file"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Load existing script file"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Inherits"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Class Name"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Template"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Built-in Script"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Remote "
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Stack Trace"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Pick one or more items from the list to display the graph."
+msgstr ""
+
+#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp
+msgid "Errors"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Copy Error"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Binding"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change AudioStreamPlayer3D Emission Angle"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier AABB"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Particles AABB"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Cylinder Shape Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Cylinder Shape Height"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Cylinder Radius"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Cylinder Height"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Torus Inner Radius"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Torus Outer Radius"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Select the dynamic library for this entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Select dependencies of the library for this entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Remove current entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Double click to create a new entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Platform:"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Platform"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Dynamic Library"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Add an architecture entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "GDNativeLibrary"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Library"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Status"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Libraries: "
+msgstr ""
+
+#: modules/gdnative/register_types.cpp
+msgid "GDNative"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Step argument is zero!"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not a script with an instance"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not based on a script"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not based on a resource file"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Object can't provide a length."
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Next Plane"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Previous Plane"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Plane:"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Next Floor"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Previous Floor"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Floor:"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Delete Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Fill Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Duplicate Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Grid Map"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Snap View"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Disabled"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Above"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Below"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit X Axis"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit Y Axis"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit Z Axis"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate X"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate Y"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate Z"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate X"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate Y"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate Z"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Clear Rotation"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Create Area"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Create Exterior Connector"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Erase Area"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clear Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Fill Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Settings"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Pick Distance:"
+msgstr ""
+
+#: modules/mono/csharp_script.cpp
+msgid "Class name can't be a reserved keyword"
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Generating solution..."
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Generating C# project..."
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Failed to create solution."
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Failed to save solution."
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Done"
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Failed to create C# project."
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Mono"
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "About C# support"
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Create C# solution"
+msgstr ""
+
+#: modules/mono/editor/mono_bottom_panel.cpp
+msgid "Builds"
+msgstr ""
+
+#: modules/mono/editor/mono_bottom_panel.cpp
+msgid "Build Project"
+msgstr ""
+
+#: modules/mono/editor/mono_bottom_panel.cpp
+msgid "Warnings"
+msgstr ""
+
+#: modules/mono/editor/mono_bottom_panel.cpp
+msgid "View log"
+msgstr ""
+
+#: modules/mono/mono_gd/gd_mono_utils.cpp
+msgid "End of inner exception stack trace"
+msgstr ""
+
+#: modules/recast/navigation_mesh_editor_plugin.cpp
+msgid "Bake NavMesh"
+msgstr ""
+
+#: modules/recast/navigation_mesh_editor_plugin.cpp
+msgid "Clear the navigation mesh."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Setting up Configuration..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Calculating grid size..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating heightfield..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Marking walkable triangles..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Constructing compact heightfield..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Eroding walkable area..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Partitioning..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating contours..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating polymesh..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Converting to native navigation mesh..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Navigation Mesh Generator Setup:"
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Parsing Geometry..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Done!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Signal Arguments"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Argument Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Argument name"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Set Variable Default Value"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Set Variable Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove VisualScript Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Duplicate VisualScript Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Base Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Move Node(s)"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove VisualScript Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Node Data"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Node Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Script already has function '%s'"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Input Value"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Can't copy the function node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Clipboard is empty!"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste VisualScript Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Member"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Search VisualScript"
+msgstr ""
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Get %s"
+msgstr ""
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Set %s"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Run in Browser"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Run exported HTML in the system's default browser."
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not write file:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not open template for export:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Invalid export template:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not read custom HTML shell:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not read boot splash image file:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Using default boot splash image."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+
+#: scene/2d/collision_object_2d.cpp
+msgid ""
+"This node has no shape, so it can't collide or interact with other objects.\n"
+"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
+"define its shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp scene/3d/particles.cpp
+msgid ""
+"A material to process the particles is not assigned, so no behavior is "
+"imprinted."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+
+#: scene/2d/physics_body_2d.cpp
+msgid ""
+"Size changes to RigidBody2D (in character or rigid modes) will be overridden "
+"by the physics engine when running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+
+#: scene/2d/skeleton_2d.cpp
+msgid "This Bone2D chain should end at a Skeleton2D node."
+msgstr ""
+
+#: scene/2d/skeleton_2d.cpp
+msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
+msgstr ""
+
+#: scene/2d/skeleton_2d.cpp
+msgid ""
+"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
+msgstr ""
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRCamera must have an ARVROrigin node as its parent"
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRController must have an ARVROrigin node as its parent"
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid ""
+"The controller id must not be 0 or this controller will not be bound to an "
+"actual controller"
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRAnchor must have an ARVROrigin node as its parent"
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid ""
+"The anchor id must not be 0 or this anchor will not be bound to an actual "
+"anchor"
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVROrigin requires an ARVRCamera child node"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "%d%%"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "(Time Left: %d:%02d s)"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Plotting Meshes: "
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Plotting Lights:"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp
+msgid "Finishing Plot"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Lighting Meshes: "
+msgstr ""
+
+#: scene/3d/collision_object.cpp
+msgid ""
+"This node has no shape, so it can't collide or interact with other objects.\n"
+"Consider adding a CollisionShape or CollisionPolygon as a child to define "
+"its shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr ""
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
+#: scene/3d/gi_probe.cpp
+msgid "Plotting Meshes"
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+
+#: scene/3d/particles.cpp
+msgid ""
+"Nothing is visible because meshes have not been assigned to draw passes."
+msgstr ""
+
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
+#: scene/3d/physics_body.cpp
+msgid ""
+"Size changes to RigidBody (in character or rigid modes) will be overridden "
+"by the physics engine when running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+
+#: scene/3d/remote_transform.cpp
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid "WorldEnvironment needs an Environment resource."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set "
+"this environment's Background Mode to Canvas (for 2D scenes)."
+msgstr ""
+
+#: scene/3d/soft_body.cpp
+msgid "This body will be ignored until you set a mesh"
+msgstr ""
+
+#: scene/3d/soft_body.cpp
+msgid ""
+"Size changes to SoftBody will be overridden by the physics engine when "
+"running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+
+#: scene/3d/vehicle_body.cpp
+msgid ""
+"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use "
+"it as a child of a VehicleBody."
+msgstr ""
+
+#: scene/animation/animation_blend_tree.cpp
+msgid "On BlendTree node '%s', animation not found: '%s'"
+msgstr ""
+
+#: scene/animation/animation_blend_tree.cpp
+msgid "Animation not found: '%s'"
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "In node '%s', invalid animation: '%s'."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Invalid animation: '%s'."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Nothing connected to input '%s' of node '%s'."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "A root AnimationNode for the graph is not set."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Path to an AnimationPlayer node containing animations is not set."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "AnimationPlayer root is not a valid node."
+msgstr ""
+
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
+#: scene/gui/color_picker.cpp
+msgid "Raw Mode"
+msgstr ""
+
+#: scene/gui/color_picker.cpp
+msgid "Add current color as a preset"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr ""
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
+#: scene/gui/scroll_container.cpp
+msgid ""
+"ScrollContainer is intended to work with a single child control.\n"
+"Use a container as child (VBox,HBox,etc), or a Control and set the custom "
+"minimum size manually."
+msgstr ""
+
+#: scene/gui/tree.cpp
+msgid "(Other)"
+msgstr ""
+
+#: scene/main/scene_tree.cpp
+msgid ""
+"Default Environment as specified in Project Settings (Rendering -> "
+"Environment -> Default Environment) could not be loaded."
+msgstr ""
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+msgid "Error initializing FreeType."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+msgid "Unknown font format."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+msgid "Error loading font."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+msgid "Invalid font size."
+msgstr ""
+
+#: scene/resources/visual_shader.cpp
+msgid "Input"
+msgstr ""
+
+#: scene/resources/visual_shader_nodes.cpp
+msgid "Invalid source for shader."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Assignment to function."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Assignment to uniform."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Varyings can only be assigned in vertex function."
+msgstr ""
diff --git a/editor/translations/hu.po b/editor/translations/hu.po
index 1518b02617..9cf7cd6942 100644
--- a/editor/translations/hu.po
+++ b/editor/translations/hu.po
@@ -1,23 +1,27 @@
# Hungarian translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# Ãrpád Horváth <horvatha4@googlemail.com>, 2018.
# Nagy Lajos <neutron9707@gmail.com>, 2017.
# Sandor Domokos <sandor.domokos@gmail.com>, 2017-2018.
# Varga Dániel <danikah.danikah@gmail.com>, 2016-2018.
+# Gabor Csordas <gaborcsordas@yahoo.com>, 2018.
+# Tusa Gamer <tusagamer@mailinator.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-06-17 07:39+0000\n"
-"Last-Translator: Ãrpád Horváth <horvatha4@googlemail.com>\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-29 12:09+0000\n"
+"Last-Translator: Tusa Gamer <tusagamer@mailinator.com>\n"
"Language-Team: Hungarian <https://hosted.weblate.org/projects/godot-engine/"
"godot/hu/>\n"
"Language: hu\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.0.1\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -26,18 +30,18 @@ msgstr ""
"Érvénytelen típus argumentum a convert()-hez használjon TYPE_* konstansokat."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr "Nincs elég bájt a bájtok dekódolására, vagy hibás formátum."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Érvénytelen bemenet %i (nem átadott) a kifejezésben."
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "self nem használható, mert a példány null (nincs átadva)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
@@ -133,7 +137,7 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "Bezier Görbe Nyomvonal"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
@@ -219,7 +223,7 @@ msgstr "Jövő"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "Legközelebbi"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
@@ -269,7 +273,6 @@ msgstr "Létrehoz %d ÚJ nyomvonalat és beilleszti a kulcsokat?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -403,8 +406,7 @@ msgstr "Kiválasztás átméretezés"
msgid "Scale From Cursor"
msgstr "Ãtméretezés a kurzortól"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Kiválasztás megkettőzés"
@@ -418,11 +420,13 @@ msgid "Delete Selection"
msgstr "Kijelölés Középre"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+#, fuzzy
+msgid "Go to Next Step"
msgstr "Ugrás a következő lépésre"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+#, fuzzy
+msgid "Go to Previous Step"
msgstr "Ugrás az előző lépésre"
#: editor/animation_track_editor.cpp
@@ -525,11 +529,11 @@ msgstr "Nincs Találat"
msgid "Replaced %d occurrence(s)."
msgstr "Lecserélve %d előfordulás."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Pontos Egyezés"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "Teljes Szavak"
@@ -545,15 +549,19 @@ msgstr "Mind Lecserélése"
msgid "Selection Only"
msgstr "Csak Kiválsztás"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Nagyítás"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "Kicsinyítés"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "Nagyítás Visszaállítása"
@@ -563,10 +571,10 @@ msgstr ""
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "Nagyítás"
+msgid "Font Size:"
+msgstr "Körvonal Mérete:"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Sor:"
@@ -599,6 +607,7 @@ msgstr "Hozzáad"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -679,7 +688,7 @@ msgid "Edit Connection: "
msgstr "Kapcsolathiba"
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -728,23 +737,20 @@ msgid "Recent:"
msgstr "Legutóbbi:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Keresés:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "Találatok:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "Leírás:"
@@ -783,8 +789,7 @@ msgid "Resource"
msgstr "Forrás"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "Útvonal"
@@ -805,9 +810,10 @@ msgid "Search Replacement Resource:"
msgstr "Csere Forrás Keresése:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -839,7 +845,8 @@ msgid "Error loading:"
msgstr "Hiba betöltéskor:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+#, fuzzy
+msgid "Load failed due to missing dependencies:"
msgstr "A Jelenetet nem sikerült betölteni a hiányzó függőségek miatt:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -898,14 +905,6 @@ msgstr "Szótár Érték Módosítása"
msgid "Thanks from the Godot community!"
msgstr "Köszönet a Godot közösségétől!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr ""
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Godot Engine közreműködők"
@@ -999,7 +998,8 @@ msgid "Uncompressing Assets"
msgstr "Eszközök Kicsomagolása"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+#, fuzzy
+msgid "Package installed successfully!"
msgstr "A Csomag Telepítése Sikeresen Megtörtént!"
#: editor/editor_asset_installer.cpp
@@ -1081,8 +1081,7 @@ msgid "Bus options"
msgstr "Busz beállítások"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "Megkettőzés"
@@ -1242,7 +1241,7 @@ msgid "Add AutoLoad"
msgstr "AutoLoad Hozzáadása"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "Útvonal:"
@@ -1250,8 +1249,8 @@ msgstr "Útvonal:"
msgid "Node Name:"
msgstr "Node neve:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "Név"
@@ -1321,11 +1320,16 @@ msgid "Template file not found:"
msgstr "Sablon fájl nem található:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Aktuális Mappa Kiválasztása"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "Fájl Létezik, Felülírja?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
+#, fuzzy
+msgid "Select This Folder"
msgstr "Aktuális Mappa Kiválasztása"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1334,12 +1338,13 @@ msgstr "Útvonal másolása"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr "Mutat Fájlkezelőben"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+#, fuzzy
+msgid "Show in File Manager"
msgstr "Mutat Fájlkezelőben"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1375,7 +1380,8 @@ msgid "Open a File or Directory"
msgstr "Fájl vagy Könyvtár Megnyitása"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Mentés"
@@ -1433,8 +1439,7 @@ msgstr "Könyvtárak és Fájlok:"
msgid "Preview:"
msgstr "Előnézet:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "Fájl:"
@@ -1450,24 +1455,11 @@ msgstr "Források Vizsgálata"
msgid "(Re)Importing Assets"
msgstr "Eszközök (Újra) Betöltése"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "Keresés Súgóban"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "Osztálylista:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "Osztályok Keresése"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "Eleje"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "Osztály:"
@@ -1484,28 +1476,31 @@ msgid "Brief Description:"
msgstr "Rövid Leírás:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "Tagok"
+msgid "Properties"
+msgstr "Tulajdonságok"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "Tagok:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "Publikus Metódusok"
+msgid "Methods"
+msgstr "Metódusok"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "Publikus Metódusok:"
+#, fuzzy
+msgid "Methods:"
+msgstr "Metódusok"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "GUI Téma Elemek"
+#, fuzzy
+msgid "Theme Properties"
+msgstr "Tulajdonságok"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "GUI Téma Elemek:"
+#, fuzzy
+msgid "Theme Properties:"
+msgstr "Tulajdonságok"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1532,10 +1527,16 @@ msgid "Constants:"
msgstr "Konstansok:"
#: editor/editor_help.cpp
-msgid "Description"
+#, fuzzy
+msgid "Class Description"
msgstr "Leírás"
#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
+msgstr "Leírás:"
+
+#: editor/editor_help.cpp
msgid "Online Tutorials:"
msgstr "Online Oktatóanyagok:"
@@ -1550,11 +1551,13 @@ msgstr ""
"$url2]kérvényezhet egyet[/url][/color]."
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "Tulajdonságok"
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "Tulajdonság Leírása:"
#: editor/editor_help.cpp
-msgid "Property Description:"
+#, fuzzy
+msgid "Property Descriptions:"
msgstr "Tulajdonság Leírása:"
#: editor/editor_help.cpp
@@ -1566,11 +1569,13 @@ msgstr ""
"[color=$color][url=$url]hozzájárul eggyel[/url][/color]!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "Metódusok"
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "Metódus Leírás:"
#: editor/editor_help.cpp
-msgid "Method Description:"
+#, fuzzy
+msgid "Method Descriptions:"
msgstr "Metódus Leírás:"
#: editor/editor_help.cpp
@@ -1581,12 +1586,61 @@ msgstr ""
"Ennek a metódusnak jelenleg nincs leírása. Segítsen minket azzal, hogy "
"[color=$color][url=$url]hozzájárul eggyel[/url][/color]!"
-#: editor/editor_inspector.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Keresés Súgóban"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Display All"
+msgstr "Mind Lecserélése"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Classes Only"
+msgstr "Osztályok"
+
+#: editor/editor_help_search.cpp
#, fuzzy
-msgid "Property: "
+msgid "Methods Only"
+msgstr "Metódusok"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "Jelzések"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Constants Only"
+msgstr "Konstansok"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Properties Only"
+msgstr "Tulajdonságok"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Theme Properties Only"
msgstr "Tulajdonságok"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Member Type"
+msgstr "Tagok"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Class"
+msgstr "Osztály:"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1620,6 +1674,11 @@ msgstr "Projekt export nem sikerült, hibakód %d."
msgid "Error saving resource!"
msgstr "Hiba történt az erőforrás mentésekor!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "Erőforrás Mentése Másként..."
@@ -1674,12 +1733,22 @@ msgstr "Ezt a műveletet nem lehet fagyökér nélkül végrehajtani."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
"Nem sikerült a Scene mentése. Valószínű, hogy a függőségei (példányok vagy "
"öröklések) nem voltak megfelelőek."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr "Nem lehet betölteni a MeshLibrary-t összeolvasztásra!"
@@ -1944,6 +2013,15 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "Nem sikerült az addon szkript betöltése a következő útvonalról: '%s'."
#: editor/editor_node.cpp
+#, fuzzy
+msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"Nem sikerült az addon szkript betöltése a következő útvonalról: '%s' A "
+"szkript nem eszközmódban van."
+
+#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1994,6 +2072,12 @@ msgstr "Elrendezés Törlése"
msgid "Default"
msgstr "Alapértelmezett"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+#, fuzzy
+msgid "Show in FileSystem"
+msgstr "Mutassa a Fájlrendszerben"
+
#: editor/editor_node.cpp
#, fuzzy
msgid "Play This Scene"
@@ -2077,7 +2161,8 @@ msgid "Save Scene"
msgstr "Scene mentés"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+#, fuzzy
+msgid "Save All Scenes"
msgstr "Minden Scene mentés"
#: editor/editor_node.cpp
@@ -2106,7 +2191,7 @@ msgid "Undo"
msgstr "Visszavonás"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Mégis"
@@ -2130,7 +2215,7 @@ msgstr "Projekt Beállítások"
msgid "Export"
msgstr "Exportálás"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "Eszközök"
@@ -2144,6 +2229,7 @@ msgid "Quit to Project List"
msgstr "Kilépés a Projektlistába"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "Hibakeresés"
@@ -2273,10 +2359,6 @@ msgstr "Export Sablonok Kezelése"
msgid "Help"
msgstr "Súgó"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "Osztályok"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2371,24 +2453,24 @@ msgstr "Változások Frissítése"
msgid "Disable Update Spinner"
msgstr "Frissítési Forgó Kikapcsolása"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "Megfigyelő"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "Importálás"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "Node"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "Fájlrendszer"
#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr "Megfigyelő"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Node"
+
+#: editor/editor_node.cpp
#, fuzzy
msgid "Expand Bottom Panel"
msgstr "Összes kibontása"
@@ -2526,7 +2608,7 @@ msgstr "Keret %"
msgid "Physics Frame %"
msgstr "Fizika Keret %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "Idő:"
@@ -2550,7 +2632,7 @@ msgstr "Idő"
msgid "Calls"
msgstr "Hívások"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2562,20 +2644,44 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "Érvénytelen név."
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr ""
@@ -2587,10 +2693,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2599,7 +2701,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "Beillesztés"
@@ -2891,6 +2994,11 @@ msgstr ""
"gyorsítótár nem lesz mentve!"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "Kedvencek:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr "Nem lehet '%s'-t elérni, mivel nem létezik a fájlrendszerben!"
@@ -2930,19 +3038,15 @@ msgstr "Hiba másoláskor:"
msgid "Unable to update dependencies:"
msgstr "Nem sikerült a függőségek frissítése:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "Nincs név megadva"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "Nincs név megadva."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "A megadott név érvénytelen karaktereket tartalmaz"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "Nincs név megadva."
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "A név érvénytelen karaktereket tartalmaz."
@@ -2967,22 +3071,6 @@ msgid "Duplicating folder:"
msgstr "Mappa másolása:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "Összes kibontása"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "Összes összecsukása"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "Ãtnevezés..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "Ãthelyezés..."
-
-#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
msgstr "Scene(k) megnyitás"
@@ -2991,6 +3079,16 @@ msgid "Instance"
msgstr "Példány"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Add to favorites"
+msgstr "Kedvencek:"
+
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Remove from favorites"
+msgstr "Eltávolítás Csoportból"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "Függőségek Szerkesztése..."
@@ -2998,11 +3096,19 @@ msgstr "Függőségek Szerkesztése..."
msgid "View Owners..."
msgstr "Tulajdonosok Megtekintése..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "Ãtnevezés..."
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "Megkettőzés..."
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr "Ãthelyezés..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
msgstr "Szkript gyors megnyitás..."
@@ -3012,6 +3118,16 @@ msgstr "Szkript gyors megnyitás..."
msgid "New Resource..."
msgstr "Erőforrás Mentése Másként..."
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Expand All"
+msgstr "Összes kibontása"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Collapse All"
+msgstr "Összes összecsukása"
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -3033,27 +3149,19 @@ msgstr "Fájlrendszer Újra-vizsgálata"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "Mappa Kedvencnek jelölése / Kedvenc jelölés visszavonása"
+msgid "Toggle split mode"
+msgstr "Mód Váltása"
#: editor/filesystem_dock.cpp
-msgid "Show current scene file."
-msgstr ""
+#, fuzzy
+msgid "Search files"
+msgstr "Osztályok Keresése"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr "Kiválasztott Scene(k) példányosítása a kiválasztott Node gyermekeként."
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "Osztályok Keresése"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3061,7 +3169,7 @@ msgstr ""
"Fájlok Vizsgálata,\n"
"Kérem Várjon..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "Ãthelyezés"
@@ -3080,31 +3188,22 @@ msgstr "Szkript Létrehozása"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find in files"
+msgid "Find in Files"
msgstr "%d további fájl"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find: "
+msgid "Find:"
msgstr "Keres"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Whole words"
-msgstr "Teljes Szavak"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "Pontos Egyezés"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "Mappa Létrehozása"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Filter: "
+msgid "Filters:"
msgstr "Szűrők..."
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -3122,6 +3221,11 @@ msgstr "Mégse"
#: editor/find_in_files.cpp
#, fuzzy
+msgid "Find: "
+msgstr "Keres"
+
+#: editor/find_in_files.cpp
+#, fuzzy
msgid "Replace: "
msgstr "Lecserélés"
@@ -3147,7 +3251,7 @@ msgstr "HIBA: Animáció név már létezik!"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr "Érvénytelen név."
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3287,17 +3391,14 @@ msgstr "Újraimportálás"
msgid "Failed to load resource."
msgstr "Nem sikerült betölteni az erőforrást."
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "Rendben"
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+#, fuzzy
+msgid "Expand All Properties"
msgstr "Összes tulajdonság kibontása"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+#, fuzzy
+msgid "Collapse All Properties"
msgstr "Összes tulajdonság összecsukása"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3343,6 +3444,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "Meglévő erőforrás betöltése a lemezről, majd annak szerkesztése."
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "A jelenleg szerkesztett erőforrás elmentése."
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "Ugrás az előzőleg módosított objektumra a történelemben."
@@ -3407,14 +3512,14 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
msgstr "Sokszög Létrehozása"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+#, fuzzy
+msgid "Edit Polygon"
msgstr "Sokszög Szerkesztése"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3422,25 +3527,28 @@ msgid "Insert Point"
msgstr "Pont Beszúrása"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+#, fuzzy
+msgid "Edit Polygon (Remove Point)"
msgstr "Sokszög Szerkesztése (Pont Eltávolítása)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+#, fuzzy
+msgid "Remove Polygon And Point"
msgstr "Sokszög és Pont Eltávolítása"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "Új sokszög létrehozása a semmiből"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr "Pontok Törlése"
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#, fuzzy
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
"Meglévő sokszög módosítása:\n"
"Bal Egérgomb: Pont Mozgatása.\n"
@@ -3448,8 +3556,10 @@ msgstr ""
"Jobb Egérgomb: Pont Eltörlése."
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
-msgstr "Pontok Törlése"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#, fuzzy
+msgid "Erase points."
+msgstr "Jobb Egérgomb: Pont Törlése."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3464,7 +3574,7 @@ msgstr "Animáció Hozzáadása"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
+msgid "Load..."
msgstr "Betöltés"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3493,15 +3603,9 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Pontok Törlése"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "Jobb Egérgomb: Pont Törlése."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3543,10 +3647,9 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr "Illesztés"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Keverés:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3579,7 +3682,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add Node.."
+msgid "Add Node..."
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3860,7 +3963,7 @@ msgstr "Csatlakoztatás Node-hoz:"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "Kiválasztott nyomvonal eltávolítása."
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3928,10 +4031,6 @@ msgid "Amount:"
msgstr "Mennyiség:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "Keverés:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "Keverés 0:"
@@ -4135,7 +4234,7 @@ msgstr "Mind"
msgid "Plugins"
msgstr "Bővítmények"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "Rendezés:"
@@ -4273,6 +4372,11 @@ msgstr "CanvasItem Szerkesztése"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Scale CanvasItem"
+msgstr "CanvasItem Szerkesztése"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Move CanvasItem"
msgstr "CanvasItem Szerkesztése"
@@ -4293,21 +4397,19 @@ msgid "Paste Pose"
msgstr "Póz Beillesztése"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "Kicsinyítés"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "Kicsinyítés"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Nagyítás"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr "Kiválasztó Mód"
@@ -4338,6 +4440,11 @@ msgid "Rotate Mode"
msgstr "Forgató mód"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "Kiválasztó Mód"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4437,6 +4544,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr "Újra kiválaszthatóvá teszi az objektum gyermekeit."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "Egyke"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "Csontok Mutatása"
@@ -4488,6 +4600,10 @@ msgid "Show Viewport"
msgstr "Nézet Megjelenítése"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr "Kijelölés Középre"
@@ -4559,8 +4675,17 @@ msgstr ""
"Fogd és vidd + Alt: Node típusának megváltoztatása"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr "Poly3D Létrehozása"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "Sokszög Létrehozása"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Sokszög Szerkesztése"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Sokszög Szerkesztése (Pont Eltávolítása)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
@@ -4662,37 +4787,9 @@ msgid "Item List Editor"
msgstr "Elemlista Szerkesztő"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"Nincs OccluderPolygon2D erőforrás ezen a Node-on.\n"
-"Létrehoz egyet és hozzárendeli a Node-hoz?"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr "Ãrnyékoló Sokszög Létrehozása"
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr "Új sokszög létrehozása a semmiből."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "Létező sokszög szerkesztése:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "Bal Egérgomb: Pont Mozgatása."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr "Ctrl + Bal Egérgomb: Szakasz Felosztása."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "Jobb Egérgomb: Pont Törlése."
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr "A háló üres!"
@@ -4926,13 +5023,14 @@ msgid "Populate"
msgstr "Kitöltés"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr "Navigációs Sokszög Létrehozása"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr "AABB Generálása"
+#, fuzzy
+msgid "Generating Visibility Rect"
+msgstr "Láthatósági Téglalap Generálása"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -4960,6 +5058,12 @@ msgstr "Kibocsátási Maszk Törlése"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "Convert to CPUParticles"
+msgstr "Konvertálás Nagybetűsre"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr "Részecskék"
@@ -5029,13 +5133,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr "Egy 'ParticlesMaterial' típusú feldolgozó anyag szükséges."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr "AABB Generálása"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "Konvertálás Nagybetűsre"
+msgid "Generate AABB"
+msgstr "AABB Generálása"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5059,6 +5162,11 @@ msgid "Add Point to Curve"
msgstr "Pont Hozzáadása a Görbéhez"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "Görbe Lezárása"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr "Pont Mozgatása a Görbén"
@@ -5086,6 +5194,11 @@ msgid "Click: Add Point"
msgstr "Kattintás: Pont Hozzáadása"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Left Click: Split Segment (in curve)"
+msgstr "Szakasz Felosztása (görbén)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr "Jobb Kattintás: Pont Törlése"
@@ -5101,11 +5214,6 @@ msgstr "Pont Hozzáadása (üres helyre)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr "Szakasz Felosztása (görbén)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "Pont Törlése"
@@ -5162,6 +5270,10 @@ msgstr "Ki-Vezérlő Pont Eltávolítása"
msgid "Remove In-Control Point"
msgstr "Be-Vezérlő Pont Eltávolítása"
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Szakasz Felosztása (görbén)"
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5174,10 +5286,16 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Sync bones"
+msgid "Sync Bones"
msgstr "Csontok Mutatása"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr "UV Térkép Létrehozása"
@@ -5187,42 +5305,48 @@ msgid "Create Polygon & UV"
msgstr "Sokszög Létrehozása"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "Új vízszintes vezetővonal létrehozása"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "Már létezik '%s' AutoLoad!"
+msgid "Remove Internal Vertex"
+msgstr "Be-Vezérlő Pont Eltávolítása"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Add Split"
-msgstr "Pont hozzáadása"
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "Érvénytelen Elérési Út."
+msgid "Add Custom Polygon"
+msgstr "Sokszög Szerkesztése"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Pont eltávolítása"
+msgid "Remove Custom Polygon"
+msgstr "Sokszög és Pont Eltávolítása"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr "UV Térkép Transzformálása"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
+#, fuzzy
+msgid "Transform Polygon"
+msgstr "Sokszög Létrehozása"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Open Polygon 2D UV editor."
+msgstr "2D UV Sokszög Szerkesztő"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
msgstr "2D UV Sokszög Szerkesztő"
@@ -5232,13 +5356,13 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "Sokszög Szerkesztése"
+msgid "Points"
+msgstr "Pont Mozgatása"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Splits"
-msgstr "Útvonal Felosztása"
+msgid "Polygons"
+msgstr "Sokszög -> UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -5247,11 +5371,7 @@ msgstr "Csontok Létrehozása"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
-msgstr "Sokszög Létrehozása"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Move Points"
msgstr "Pont Mozgatása"
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5279,19 +5399,21 @@ msgid "Scale Polygon"
msgstr "Sokszög Skálázása"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Select a split to erase it"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5316,6 +5438,11 @@ msgid "Grid Settings"
msgstr "Szerkesztő Beállítások"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "Illesztés"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr "Illesztés Engedélyezése"
@@ -5379,22 +5506,22 @@ msgid "Paste Resource"
msgstr "Erőforrás Beillesztése"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "Megnyitás Szerkesztőben"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr "Példány:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr "Típus:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Megnyitás Szerkesztőben"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr "Erőforrás Betöltése"
@@ -5427,6 +5554,11 @@ msgstr "Hiba TileSet mentésekor!"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
+msgid "Error: could not load file."
+msgstr "Nem sikerült létrehozni a mappát."
+
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Error could not load file."
msgstr "Nem sikerült létrehozni a mappát."
@@ -5436,19 +5568,23 @@ msgid "Error saving file!"
msgstr "Hiba TileSet mentésekor!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
+#, fuzzy
+msgid "Error while saving theme."
msgstr "HIba történt a téma mentésekor"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+#, fuzzy
+msgid "Error Saving"
msgstr "Hiba mentés közben"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
+#, fuzzy
+msgid "Error importing theme."
msgstr "Hiba történt a téma importálásakor"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+#, fuzzy
+msgid "Error Importing"
msgstr "Hiba importáláskor"
#: editor/plugins/script_editor_plugin.cpp
@@ -5471,6 +5607,14 @@ msgid "Import Theme"
msgstr "Téma Importálása"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "HIba történt a téma mentésekor"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Hiba mentés közben"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr "Téma Mentése Másként..."
@@ -5512,8 +5656,8 @@ msgstr "Fájl"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile"
-msgstr "Fájlok Megtekintése"
+msgid "Open..."
+msgstr "Megnyit"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5528,11 +5672,8 @@ msgid "Copy Script Path"
msgstr "Szkript Útvonal Másolása"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr "Mutassa a Fájlrendszerben"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+#, fuzzy
+msgid "History Previous"
msgstr "Előző Előzmény"
#: editor/plugins/script_editor_plugin.cpp
@@ -5545,6 +5686,11 @@ msgid "Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Import Theme..."
+msgstr "Téma Importálása"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
msgstr "Téma Újratöltése"
@@ -5553,10 +5699,6 @@ msgid "Save Theme"
msgstr "Téma Mentése"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "Téma Mentése Másként"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "Dokumentációs Lapok Bezárása"
@@ -5603,7 +5745,8 @@ msgid "Keep Debugger Open"
msgstr "Hibakereső Nyitva Tartása"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+#, fuzzy
+msgid "Debug with External Editor"
msgstr "Hibakeresés külső szerkesztővel"
#: editor/plugins/script_editor_plugin.cpp
@@ -5611,10 +5754,6 @@ msgid "Open Godot online documentation"
msgstr "Godot online dokumentáció megnyitása"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr "Keresés az osztályhierarchiában."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Keresés a referencia dokumentációban."
@@ -5652,21 +5791,9 @@ msgstr "Hibakereső"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Search results"
+msgid "Search Results"
msgstr "Keresés Súgóban"
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "Osztályok Keresése"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-"A beépített szkriptek csak akkor szerkeszthetőek, amikor az a Scene amihez "
-"tartoznak éppen be van töltve"
-
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
@@ -5677,6 +5804,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "Ugrás Funkcióra..."
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr "Csak a fájlrendszerből eredő erőforrásokat lehet bedobni."
@@ -5709,10 +5845,6 @@ msgstr "Szó Eleji Nagybetű"
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5764,11 +5896,13 @@ msgid "Trim Trailing Whitespace"
msgstr "Sorvégi Szóközök Lenyírása"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+#, fuzzy
+msgid "Convert Indent to Spaces"
msgstr "Behúzások Ãtkonvertálása Szóközökre"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+#, fuzzy
+msgid "Convert Indent to Tabs"
msgstr "Behúzások Ãtkonvertálása Tabokra"
#: editor/plugins/script_text_editor.cpp
@@ -5785,36 +5919,32 @@ msgid "Remove All Breakpoints"
msgstr "Összes Töréspont Eltávolítása"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
+#, fuzzy
+msgid "Go to Next Breakpoint"
msgstr "Ugrás Következő Töréspontra"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
+#, fuzzy
+msgid "Go to Previous Breakpoint"
msgstr "Ugrás Előző Töréspontra"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr "Konvertálás Nagybetűsre"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr "Konvertálás Kisbetűsre"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr "Előző Keresése"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr "Fájlok Szűrése..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+#, fuzzy
+msgid "Go to Function..."
msgstr "Ugrás Funkcióra..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+#, fuzzy
+msgid "Go to Line..."
msgstr "Ugrás Sorra..."
#: editor/plugins/script_text_editor.cpp
@@ -5910,6 +6040,14 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -6075,6 +6213,10 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -6174,11 +6316,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap To Floor"
-msgstr "Rácshoz illesztés"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6295,6 +6432,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
msgid "Sprite is empty!"
@@ -6413,11 +6554,17 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+#, fuzzy
+msgid "Set Margin"
+msgstr "Fogantyú Beállítása"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6558,7 +6705,7 @@ msgstr ""
#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
msgid "Style"
-msgstr ""
+msgstr "Stílus"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Font"
@@ -6566,7 +6713,7 @@ msgstr ""
#: editor/plugins/theme_editor_plugin.cpp
msgid "Color"
-msgstr ""
+msgstr "Szín"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Constant"
@@ -6582,6 +6729,11 @@ msgid "Fix Invalid Tiles"
msgstr "Érvénytelen név."
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "Kijelölés Középre"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6595,7 +6747,7 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Bucket Fill"
-msgstr ""
+msgstr "Kitöltés egy színnel"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Erase TileMap"
@@ -6628,32 +6780,39 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "Kiválasztás eltávolítás"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr ""
+#, fuzzy
+msgid "Rotate left"
+msgstr "Forgató mód"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr ""
+#, fuzzy
+msgid "Rotate right"
+msgstr "Sokszög Forgatása"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Flip vertically"
msgstr ""
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Clear transform"
+msgstr "Animáció transzformáció változtatás"
+
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr "Jelenlegi tétel eltávolítása"
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6665,25 +6824,47 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "Animáció Beillesztése"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "Jobb Egérgomb: Pont Törlése."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "Új sokszög létrehozása a semmiből."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "Jelenlegi tétel eltávolítása"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6691,7 +6872,12 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Sablon Eltávolítása"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6701,15 +6887,25 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "Törli a kiválasztott fájlokat?"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "Pontok Törlése"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr ""
@@ -6727,13 +6923,101 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Mappa Létrehozása"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "Szűrők Szerkesztése"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Létező sokszög szerkesztése:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Sokszög Szerkesztése"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Navigációs Sokszög Létrehozása"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "Animáció Beillesztése"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Sablon Eltávolítása"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "Sokszög és Pont Eltávolítása"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "Ãrnyékoló Sokszög Létrehozása"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "Navigációs Sokszög Létrehozása"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "Szűrők Szerkesztése"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Navigációs Sokszög Létrehozása"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Ãrnyékoló Sokszög Létrehozása"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid "This property can't be changed."
msgstr "Ezt a műveletet nem lehet végrehajtani egy Scene nélkül."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
-msgstr ""
+#, fuzzy
+msgid "TileSet"
+msgstr "TileSet-re..."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
@@ -6769,6 +7053,15 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Exporting All"
+msgstr "Exportálás"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6777,6 +7070,11 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "Projekt Exportálása"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6831,10 +7129,50 @@ msgid "Feature List:"
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "Szkript Futtatása"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Script Export Mode:"
+msgstr "Projekt Exportálása"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export mode?"
+msgstr "Projekt Exportálása"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Export All"
+msgstr "Exportálás"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -6914,7 +7252,7 @@ msgstr ""
#: editor/project_manager.cpp
msgid "Import Existing Project"
-msgstr ""
+msgstr "Meglévő Projekt Importálása"
#: editor/project_manager.cpp
msgid "Import & Edit"
@@ -6922,7 +7260,7 @@ msgstr ""
#: editor/project_manager.cpp
msgid "Create New Project"
-msgstr ""
+msgstr "Új Projekt Létrehozása"
#: editor/project_manager.cpp
msgid "Create & Edit"
@@ -6961,8 +7299,9 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
-msgid "Can't open project"
-msgstr ""
+#, fuzzy
+msgid "Can't open project at '%s'."
+msgstr "'%s' nem nyitható meg."
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
@@ -6970,6 +7309,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7088,19 +7445,19 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Device"
-msgstr ""
+msgstr "Eszköz"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Shift+"
-msgstr ""
+msgstr "Shift+"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Alt+"
-msgstr ""
+msgstr "Alt+"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Control+"
-msgstr ""
+msgstr "Control+"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Press a Key..."
@@ -7152,7 +7509,7 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Axis"
-msgstr ""
+msgstr "Tengely"
#: editor/project_settings_editor.cpp
msgid "Joypad Button Index:"
@@ -7172,19 +7529,19 @@ msgstr ""
#: editor/project_settings_editor.cpp
msgid "Button"
-msgstr ""
+msgstr "Gomb"
#: editor/project_settings_editor.cpp
msgid "Left Button."
-msgstr ""
+msgstr "Bal Egérgomb."
#: editor/project_settings_editor.cpp
msgid "Right Button."
-msgstr ""
+msgstr "Jobb Egérgomb."
#: editor/project_settings_editor.cpp
msgid "Middle Button."
-msgstr ""
+msgstr "Középső Egérgomb."
#: editor/project_settings_editor.cpp
msgid "Wheel Up."
@@ -7284,10 +7641,6 @@ msgstr ""
msgid "General"
msgstr "Ãltalános"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7421,10 +7774,6 @@ msgstr ""
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr ""
@@ -7515,7 +7864,7 @@ msgid "Step"
msgstr "Lépés (mp):"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7524,7 +7873,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7567,7 +7916,7 @@ msgstr "Mind Nagybetű"
msgid "Reset"
msgstr "Nagyítás Visszaállítása"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7626,6 +7975,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr ""
@@ -7662,6 +8015,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7737,6 +8096,11 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Open documentation"
+msgstr "Godot online dokumentáció megnyitása"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr ""
@@ -7745,12 +8109,13 @@ msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Change Type"
-msgstr ""
+#, fuzzy
+msgid "Extend Script"
+msgstr "Szkript Futtatása"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -7903,6 +8268,11 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Filename is empty"
+msgstr "A háló üres!"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -7991,19 +8361,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -8035,18 +8393,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -8246,7 +8592,7 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+msgid "Step argument is zero!"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
@@ -8469,12 +8815,8 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr "Besütés!"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
-msgstr "A navigációs mesh besütése."
+msgid "Bake NavMesh"
+msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8751,6 +9093,10 @@ msgid "Base Type:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "Tagok:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr ""
@@ -8851,11 +9197,11 @@ msgid "Search VisualScript"
msgstr "Keresés Súgóban"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8933,6 +9279,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -8971,6 +9323,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -9088,6 +9446,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -9107,6 +9475,26 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9139,7 +9527,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9199,6 +9587,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr "Az animációs fa érvénytelen."
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr ""
@@ -9215,10 +9607,6 @@ msgstr "Figyelem!"
msgid "Please Confirm..."
msgstr "Kérem Erősítse Meg..."
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr ""
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9226,6 +9614,10 @@ msgid ""
"hide upon running."
msgstr ""
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9276,10 +9668,6 @@ msgstr "Érvénytelen betűtípus méret."
msgid "Input"
msgstr "Bemenet Hozzáadása"
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
@@ -9297,6 +9685,144 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Split already exists."
+#~ msgstr "Már létezik '%s' AutoLoad!"
+
+#, fuzzy
+#~ msgid "Add Split"
+#~ msgstr "Pont hozzáadása"
+
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr "Érvénytelen Elérési Út."
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "Pont eltávolítása"
+
+#, fuzzy
+#~ msgid "Poly"
+#~ msgstr "Sokszög Szerkesztése"
+
+#, fuzzy
+#~ msgid "Splits"
+#~ msgstr "Útvonal Felosztása"
+
+#~ msgid "No name provided"
+#~ msgstr "Nincs név megadva"
+
+#~ msgid "Create Poly"
+#~ msgstr "Sokszög Létrehozása"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "Új sokszög létrehozása a semmiből"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "Kicsinyítés"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "Nagyítás"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "Poly3D Létrehozása"
+
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "Nincs OccluderPolygon2D erőforrás ezen a Node-on.\n"
+#~ "Létrehoz egyet és hozzárendeli a Node-hoz?"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "Bal Egérgomb: Pont Mozgatása."
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "Ctrl + Bal Egérgomb: Szakasz Felosztása."
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "Jobb Egérgomb: Pont Törlése."
+
+#, fuzzy
+#~ msgid "New TextFile"
+#~ msgstr "Fájlok Megtekintése"
+
+#~ msgid "Save Theme As"
+#~ msgstr "Téma Mentése Másként"
+
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Nagyítás"
+
+#~ msgid "Class List:"
+#~ msgstr "Osztálylista:"
+
+#~ msgid "Search Classes"
+#~ msgstr "Osztályok Keresése"
+
+#~ msgid "Public Methods"
+#~ msgstr "Publikus Metódusok"
+
+#~ msgid "Public Methods:"
+#~ msgstr "Publikus Metódusok:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "GUI Téma Elemek"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "GUI Téma Elemek:"
+
+#, fuzzy
+#~ msgid "Property: "
+#~ msgstr "Tulajdonságok"
+
+#, fuzzy
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "Mappa Kedvencnek jelölése / Kedvenc jelölés visszavonása"
+
+#, fuzzy
+#~ msgid "Whole words"
+#~ msgstr "Teljes Szavak"
+
+#, fuzzy
+#~ msgid "Match case"
+#~ msgstr "Pontos Egyezés"
+
+#~ msgid "Ok"
+#~ msgstr "Rendben"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "Keresés az osztályhierarchiában."
+
+#, fuzzy
+#~ msgid "Search in files"
+#~ msgstr "Osztályok Keresése"
+
+#~ msgid ""
+#~ "Built-in scripts can only be edited when the scene they belong to is "
+#~ "loaded"
+#~ msgstr ""
+#~ "A beépített szkriptek csak akkor szerkeszthetőek, amikor az a Scene "
+#~ "amihez tartoznak éppen be van töltve"
+
+#~ msgid "Convert To Uppercase"
+#~ msgstr "Konvertálás Nagybetűsre"
+
+#~ msgid "Convert To Lowercase"
+#~ msgstr "Konvertálás Kisbetűsre"
+
+#, fuzzy
+#~ msgid "Snap To Floor"
+#~ msgstr "Rácshoz illesztés"
+
+#~ msgid "Bake!"
+#~ msgstr "Besütés!"
+
+#~ msgid "Bake the navigation mesh."
+#~ msgstr "A navigációs mesh besütése."
+
#~ msgid "Change Scalar Constant"
#~ msgstr "Skaláris állandó változtatás"
@@ -9435,15 +9961,9 @@ msgstr ""
#~ msgid "I see..."
#~ msgstr "Értem..."
-#~ msgid "Can't open '%s'."
-#~ msgstr "'%s' nem nyitható meg."
-
#~ msgid "Ugh"
#~ msgstr "Hoppá"
-#~ msgid "Save the currently edited resource."
-#~ msgstr "A jelenleg szerkesztett erőforrás elmentése."
-
#~ msgid "Stop Profiling"
#~ msgstr "Profilozás Leállítása"
diff --git a/editor/translations/id.po b/editor/translations/id.po
index d8ffaf2e05..056ab1d3ce 100644
--- a/editor/translations/id.po
+++ b/editor/translations/id.po
@@ -1,6 +1,6 @@
# Indonesian translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# Abdul Aziz Muslim Alqudsy <abdul.aziz.muslim.alqudsy@gmail.com>, 2016.
# Andevid Dynmyn <doyan4forum@gmail.com>, 2016.
@@ -15,18 +15,22 @@
# Tito <ijavadroid@gmail.com>, 2018.
# Tom My <tom.asadinawan@gmail.com>, 2017.
# yursan9 <rizal.sagi@gmail.com>, 2016.
+# Evan Hyacinth <muhammad.ivan669@gmail.com>, 2018, 2019.
+# Guntur Sarwohadi <gsarwohadi@gmail.com>, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-07-15 12:38+0000\n"
-"Last-Translator: Romi Kusuma Bakti <romikusumab@gmail.com>\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2019-01-13 15:07+0000\n"
+"Last-Translator: Guntur Sarwohadi <gsarwohadi@gmail.com>\n"
"Language-Team: Indonesian <https://hosted.weblate.org/projects/godot-engine/"
"godot/id/>\n"
"Language: id\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 3.1-dev\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -35,70 +39,64 @@ msgstr ""
"Tipe argument salah dalam menggunakan convert(), gunakan konstanta TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr "Tidak cukup bytes untuk menerjemahkan, atau format tidak sah."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Masukkan tidak sah %i (tidak diberikan) dalam ekspresi"
#: core/math/expression.cpp
+#, fuzzy
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "self tidak dapat digunakan karena instansi adalah null (not passed)"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "Nama properti index '%s' tidak sah dalam node %s."
+msgstr "operan untuk operator %s, %s dan %s tidak sah."
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid index of type %s for base type %s"
-msgstr "Nama properti index '%s' tidak sah dalam node %s."
+msgstr "index tipe %s tidak sah untuk tipe dasar %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "index bernama '%s' untuk tipe dasar %s tidak sah"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid arguments to construct '%s'"
-msgstr ": Argumen tidak sah dari tipe: "
+msgstr "argumen untuk membangun '%s' tidak sah"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "Pada pemanggilan '%s':"
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
-msgstr ""
+msgstr "Bebaskan"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "Seimbang"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Mirror"
-msgstr "Kesalahan!"
+msgstr "Cermin"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "Sisipkan Key Anim"
+msgstr "Sisipkan Key Disini"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "Duplikat Pilihan"
+msgstr "Duplikat Key Terpilih"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "Hapus yang Dipilih"
+msgstr "Hapus Key Terpilih"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -130,43 +128,39 @@ msgstr "Ubah Panggilan Anim"
#: editor/animation_track_editor.cpp
msgid "Property Track"
-msgstr ""
+msgstr "Track Properti"
#: editor/animation_track_editor.cpp
msgid "3D Transform Track"
-msgstr ""
+msgstr "Track Transformasi 3D"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "Track Pemanggil Metode"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "Track Lengkungan Bezier"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "Track Pemutar Suara"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Playback Track"
-msgstr "Hentikan playback animasi. (S)"
+msgstr "Track Pemutar Animasi"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
-msgstr "Tambah Trek Anim"
+msgstr "Tambah Track"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Length Time (seconds)"
-msgstr "Panjang animasi (dalam detik)."
+msgstr "Panjang Animasi (detik)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "Zoom animasi."
+msgstr "Perulangan Animasi"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -175,39 +169,35 @@ msgstr "Fungsi-fungsi:"
#: editor/animation_track_editor.cpp
msgid "Audio Clips:"
-msgstr ""
+msgstr "Klip-klip Suara:"
#: editor/animation_track_editor.cpp
msgid "Anim Clips:"
-msgstr ""
+msgstr "Klip-klip Animasi:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Toggle this track on/off."
-msgstr "Mode Tanpa Gangguan"
+msgstr "Alihkan track ini ke nyala/mati."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "Mode Pembaruan (Bagaimana properti ini akan di terapkan)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Interpolation Mode"
-msgstr "Mode Tanpa Gangguan"
+msgstr "Mode Interpolasi"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "Mode Putaran Berulang (Interpolasi akhir dan awal perulangan)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "Hapus track yang dipilih."
+msgstr "Hapus track ini."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "Waktu:"
+msgstr "Waktu (d): "
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -223,11 +213,11 @@ msgstr "Pemicu"
#: editor/animation_track_editor.cpp
msgid "Capture"
-msgstr ""
+msgstr "Tangkap"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "Terdekat"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
@@ -236,30 +226,28 @@ msgstr "Linier"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr ""
+msgstr "Kubik"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
-msgstr ""
+msgstr "Interpolasi perulangan clamp"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "Interpolasi perulangan warp"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key"
-msgstr ""
+msgstr "Masukkan Key"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "Tombol Duplikat Anim"
+msgstr "Duplikat Key"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "Hapus Kunci Anim"
+msgstr "Hapus Key"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -277,7 +265,6 @@ msgstr "Buat track BARU %d dan masukkan tombol-tombol?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -290,6 +277,7 @@ msgstr "Sisipkan Anim"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
msgstr ""
+"AnimationPlayer tidak bisa menganimasikan diri sendiri, gunakan pemutar lain."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
@@ -305,7 +293,7 @@ msgstr "Sisipkan Key Anim"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr ""
+msgstr "Track transformasi hanya berlaku untuk node berbasis ruangan."
#: editor/animation_track_editor.cpp
msgid ""
@@ -314,35 +302,40 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"Track suara hanya bisa menunjuk ke node ber-tipe:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "Track animasi hanya bisa menunjuk ke node AnimationPlayer."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
msgstr ""
+"Pemutar animasi tidak bisa menganimasikan diri sendiri, hanya pemutar lain."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "Tidak memungkinkan untuk menambah track baru tanpa akar"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "Tidak bisa menambahkan key karena path pada track tidak sah."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "Track bukan tipe Spatial, tidak bisa menambahkan key"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
msgstr ""
+"Tidak bisa menambahkan key untuk metode karena path pada track tidak sah."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Method not found in object: "
-msgstr "VariableGet tidak ditemukan dalam script: "
+msgstr "Metode tidak ditemukan dalam objek: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
@@ -350,7 +343,7 @@ msgstr "Pindahkan Kunci Anim"
#: editor/animation_track_editor.cpp
msgid "Clipboard is empty"
-msgstr ""
+msgstr "Papan klip kosong"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
@@ -359,25 +352,23 @@ msgstr "Skala Kunci Anim"
#: editor/animation_track_editor.cpp
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
-msgstr ""
+msgstr "Opsi ini tidak bisa untuk mengedit Bezier, karena hanya satu track."
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "Hanya tampilkan track dari node terpilih dalam tree."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr ""
+msgstr "Susun Track-track dengan node atau tampilkan sebagai daftar biasa."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap (s): "
-msgstr "Langkah:"
+msgstr "Snap (d): "
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "Nama Animasi:"
+msgstr "Nilai Langkah Animasi."
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -411,8 +402,7 @@ msgstr "Seleksi Skala"
msgid "Scale From Cursor"
msgstr "Skala dari Kursor"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Duplikat Pilihan"
@@ -426,11 +416,13 @@ msgid "Delete Selection"
msgstr "Hapus yang Dipilih"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+#, fuzzy
+msgid "Go to Next Step"
msgstr "Lanjut ke Langkah Berikutnya"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+#, fuzzy
+msgid "Go to Previous Step"
msgstr "Lanjut ke Langkah Sebelumnya"
#: editor/animation_track_editor.cpp
@@ -443,11 +435,11 @@ msgstr "Bersihkan Animasi"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "Pilih node yang ingin dianimasikan:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "Gunakan Lengkungan Bezier"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
@@ -495,7 +487,7 @@ msgstr "Skala Rasio:"
#: editor/animation_track_editor.cpp
msgid "Select tracks to copy:"
-msgstr ""
+msgstr "Pilih track untuk disalin:"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -533,11 +525,11 @@ msgstr "Tidak ada yang cocok"
msgid "Replaced %d occurrence(s)."
msgstr "%d kejadian diganti."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Kasus Kecocokan"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "Semua Kata"
@@ -553,28 +545,32 @@ msgstr "Ganti Semua"
msgid "Selection Only"
msgstr "Hanya yang Dipilih"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Perbesar Pandangan"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "Perkecil Pandangan"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "Kebalikan Semula Pandangan"
#: editor/code_editor.cpp
msgid "Warnings:"
-msgstr ""
+msgstr "Peringatan:"
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "Perbesar Pandangan"
+msgid "Font Size:"
+msgstr "Tampilan Depan."
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Baris:"
@@ -607,6 +603,7 @@ msgstr "Tambah"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -677,19 +674,16 @@ msgid "Disconnect"
msgstr "Tidak tersambung"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect Signal: "
-msgstr "Menyambungkan Sinyal:"
+msgstr "Sambungkan Sinyal: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection: "
-msgstr "Gangguan Koneksi"
+msgstr "Ubah koneksi: "
#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "Are you sure you want to remove all connections from the \""
-msgstr "Apakah Anda yakin menjalankan lebih dari satu projek?"
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr "Anda yakin ingin menghapus semua hubungan dari sinyal '%s'?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -697,22 +691,19 @@ msgstr "Sinyal-sinyal"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr ""
+msgstr "Anda yakin ingin menghapus semua hubungan dari sinyal ini?"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "Tidak tersambung"
+msgstr "Putuskan Semuanya"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit..."
-msgstr "Sunting"
+msgstr "sunting..."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "Fungsi"
+msgstr "Menuju Ke Fungsi"
#: editor/create_dialog.cpp
msgid "Change %s Type"
@@ -725,7 +716,7 @@ msgstr "Ubah"
#: editor/create_dialog.cpp
msgid "Create New %s"
-msgstr "Buat Baru %s"
+msgstr "Buat %s baru"
#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp
@@ -737,23 +728,20 @@ msgid "Recent:"
msgstr "Saat ini:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Cari:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "Kecocokan:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "Deskripsi:"
@@ -792,8 +780,7 @@ msgid "Resource"
msgstr "Resource"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "Path"
@@ -814,9 +801,10 @@ msgid "Search Replacement Resource:"
msgstr "Cari Resource Pengganti:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -850,7 +838,8 @@ msgid "Error loading:"
msgstr "Error saat memuat:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+#, fuzzy
+msgid "Load failed due to missing dependencies:"
msgstr "Scene gagal dimuat disebabkan oleh dependensi yang hilang:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -909,14 +898,6 @@ msgstr "Ubah Nilai Kamus"
msgid "Thanks from the Godot community!"
msgstr "Terimakasih dari komunitas Godot!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "Oke"
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Godot Engine kontributor"
@@ -1010,7 +991,8 @@ msgid "Uncompressing Assets"
msgstr "Membuka Aset Terkompresi"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+#, fuzzy
+msgid "Package installed successfully!"
msgstr "Paket Sukses Terpasang!"
#: editor/editor_asset_installer.cpp
@@ -1092,8 +1074,7 @@ msgid "Bus options"
msgstr "Opsi Bus"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "Gandakan"
@@ -1255,7 +1236,7 @@ msgid "Add AutoLoad"
msgstr "Tambahkan AutoLoad"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "Path:"
@@ -1263,8 +1244,8 @@ msgstr "Path:"
msgid "Node Name:"
msgstr "Nama Node:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "Nama"
@@ -1334,25 +1315,30 @@ msgid "Template file not found:"
msgstr "Templat berkas tidak ditemukan:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Pilih Folder Saat Ini"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "File telah ada, Overwrite?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "Pilih Folder Saat Ini"
+#, fuzzy
+msgid "Select This Folder"
+msgstr "Pilih Folder ini"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
msgstr "Salin Lokasi"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Open In File Manager"
-msgstr "Tampilkan di Manajer Berkas"
+msgid "Open in File Manager"
+msgstr "Tampilkan di Pengelola Berkas"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+#, fuzzy
+msgid "Show in File Manager"
msgstr "Tampilkan di Manajer Berkas"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1388,7 +1374,8 @@ msgid "Open a File or Directory"
msgstr "Buka sebuah File atau Direktori"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Simpan"
@@ -1446,8 +1433,7 @@ msgstr "Direktori-direktori & File-file:"
msgid "Preview:"
msgstr "Pratinjau:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "File:"
@@ -1463,24 +1449,11 @@ msgstr "Sumber Pemindaian"
msgid "(Re)Importing Assets"
msgstr "Mengimpor ulang Aset"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "Mencari Bantuan"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "Daftar Class:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "Cari Kelas"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "Atas"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "Kelas:"
@@ -1497,28 +1470,31 @@ msgid "Brief Description:"
msgstr "Deskripsi Singkat:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "Anggota"
+msgid "Properties"
+msgstr "Properti Objek"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "Member-member:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr "Properti:"
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "Metode Publik"
+msgid "Methods"
+msgstr "Fungsi"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "Metode Publik:"
+#, fuzzy
+msgid "Methods:"
+msgstr "Fungsi"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "Item Tema GUI"
+#, fuzzy
+msgid "Theme Properties"
+msgstr "Properti Objek"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "Item-item Tema GUI:"
+#, fuzzy
+msgid "Theme Properties:"
+msgstr "Properti Objek"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1545,10 +1521,16 @@ msgid "Constants:"
msgstr "Konstanta:"
#: editor/editor_help.cpp
-msgid "Description"
+#, fuzzy
+msgid "Class Description"
msgstr "Deskripsi"
#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
+msgstr "Deskripsi:"
+
+#: editor/editor_help.cpp
msgid "Online Tutorials:"
msgstr "Tutorial Daring:"
@@ -1563,11 +1545,13 @@ msgstr ""
"$url2]memberikan usulan[/url][/color]."
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "Properti Objek"
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "Deskripsi Properti Objek:"
#: editor/editor_help.cpp
-msgid "Property Description:"
+#, fuzzy
+msgid "Property Descriptions:"
msgstr "Deskripsi Properti Objek:"
#: editor/editor_help.cpp
@@ -1579,11 +1563,13 @@ msgstr ""
"dengan[color=$color][url=$url]kontribusi[/url][/color]!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "Fungsi"
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "Deskripsi Metode:"
#: editor/editor_help.cpp
-msgid "Method Description:"
+#, fuzzy
+msgid "Method Descriptions:"
msgstr "Deskripsi Metode:"
#: editor/editor_help.cpp
@@ -1594,18 +1580,62 @@ msgstr ""
"Untuk saat ini tidak ada deskripsi metode ini. Tolong bantu kita dengan "
"[color=$color][url=$url]kontribusi[/url][/color]!"
-#: editor/editor_inspector.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Mencari Bantuan"
+
+#: editor/editor_help_search.cpp
#, fuzzy
-msgid "Property: "
-msgstr "Properti Objek"
+msgid "Display All"
+msgstr "Ganti Semua"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Classes Only"
+msgstr "Kelas"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Methods Only"
+msgstr "Fungsi"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "Sinyal-sinyal"
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr "Hanya Konstanta"
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr "Hanya Properti"
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr "Hanya Properti Tema"
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr "Tipe Anggota"
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr "Kelas"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr "Properti:"
+
+#: editor/editor_inspector.cpp
msgid "Set"
-msgstr ""
+msgstr "Terapkan"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "Terapkan Bersamaan:"
#: editor/editor_log.cpp
msgid "Output:"
@@ -1633,6 +1663,11 @@ msgstr "Ekspor proyek gagal dengan kode kesalahan% d."
msgid "Error saving resource!"
msgstr "Error menyimpan resource!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "Oke"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "Simpan Resource Sebagai..."
@@ -1651,7 +1686,7 @@ msgstr "Error saat menyimpan."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
-msgstr ""
+msgstr "Gagal membuka '%s'. Berkas telah dipindah atau dihapus."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
@@ -1687,12 +1722,25 @@ msgstr "Operasi ini tidak dapat diselesaikan tanpa root pohon."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+"Scene ini tidak bisa disimpan karena ada inklusi penginstansian yang "
+"siklik.\n"
+"Mohon betulkan dan coba simpan lagi."
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
"Tidak dapat menyimpan scene. Dependensi (instance atau turunannya) mungkin "
"tidak terpenuhi."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr "Tidak bisa menimpa scene yang masih terbuka!"
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr "Tidak dapat memuat MeshLibrary untuk menggabungkan!"
@@ -1950,6 +1998,14 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "Tidak bisa memuat script addon dari lokasi: '%s'."
#: editor/editor_node.cpp
+#, fuzzy
+msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"Tidak dapat memuat addon script dari jalur: '%s' Script tidak pada mode tool."
+
+#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1998,6 +2054,12 @@ msgstr "Hapus Penampilan"
msgid "Default"
msgstr "Bawaan"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+#, fuzzy
+msgid "Show in FileSystem"
+msgstr "Tampilkan dalam Manajer Berkas"
+
#: editor/editor_node.cpp
#, fuzzy
msgid "Play This Scene"
@@ -2082,7 +2144,8 @@ msgid "Save Scene"
msgstr "Simpan Scene"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+#, fuzzy
+msgid "Save All Scenes"
msgstr "Simpan semua Scene"
#: editor/editor_node.cpp
@@ -2111,7 +2174,7 @@ msgid "Undo"
msgstr "Batal"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Ulangi"
@@ -2135,7 +2198,7 @@ msgstr "Pengaturan Proyek"
msgid "Export"
msgstr "Ekspor"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "Alat"
@@ -2149,6 +2212,7 @@ msgid "Quit to Project List"
msgstr "Keluar ke daftar proyek"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "\"Debug\""
@@ -2262,7 +2326,7 @@ msgstr "Pengaturan Editor"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "Buka Folder Data Editor"
#: editor/editor_node.cpp
#, fuzzy
@@ -2277,10 +2341,6 @@ msgstr "Mengatur Templat Ekspor"
msgid "Help"
msgstr "Bantuan"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "Kelas"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2351,7 +2411,7 @@ msgstr "Mainkan Custom Scene"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr ""
+msgstr "Mengubah driver video harus memulai ulang editor."
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
@@ -2375,24 +2435,24 @@ msgstr "Perbarui Perubahan"
msgid "Disable Update Spinner"
msgstr "Nonaktifkan Perbaruan Spinner"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "Inspektur"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "Impor"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "Node"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "Berkas Sistem"
#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr "Inspektur"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Node"
+
+#: editor/editor_node.cpp
#, fuzzy
msgid "Expand Bottom Panel"
msgstr "Perluas semua"
@@ -2530,17 +2590,17 @@ msgstr "Bingkai %"
msgid "Physics Frame %"
msgstr "Frame Fisika %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "Waktu:"
#: editor/editor_profiler.cpp
msgid "Inclusive"
-msgstr "Termasuk"
+msgstr "Inklusif"
#: editor/editor_profiler.cpp
msgid "Self"
-msgstr "Diri"
+msgstr "Sendiri"
#: editor/editor_profiler.cpp
msgid "Frame #:"
@@ -2554,50 +2614,76 @@ msgstr "Waktu"
msgid "Calls"
msgstr "Panggil"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
-msgstr ""
+msgstr "Nyala"
#: editor/editor_properties.cpp
msgid "Layer"
-msgstr ""
+msgstr "Lapisan"
#: editor/editor_properties.cpp
msgid "Bit %d, value %d"
-msgstr ""
+msgstr "Bit %d, nilai %d"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
-msgstr ""
+msgstr "[Kosong]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+#, fuzzy
+msgid "Assign..."
+msgstr "Terapkan.."
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "Path Tidak Sah."
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+"Resource terpilih (%s) tidak sesuai dengan tipe yang diharapkan untuk "
+"properti ini (%s)."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+"Tidak dapat membuat ViewportTexture pada sumber yang tersimpan sebagai "
+"berkas.\n"
+"Sumber harus dimiliki oleh sebuah scene."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
-msgstr ""
+msgstr "Pilih Viewport"
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
#, fuzzy
msgid "New Script"
msgstr "Scene Baru"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New %s"
-msgstr ""
+msgstr "%s baru"
#: editor/editor_properties.cpp editor/property_editor.cpp
#, fuzzy
msgid "Make Unique"
msgstr "Membuat sub-Resource Unik"
-#: editor/editor_properties.cpp editor/property_editor.cpp
-#, fuzzy
-msgid "Show in File System"
-msgstr "Tampilkan dalam Manajer Berkas"
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2606,7 +2692,8 @@ msgstr "Tampilkan dalam Manajer Berkas"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "Tempel"
@@ -2626,15 +2713,15 @@ msgstr "Buka dalam Penyunting"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Selected node is not a Viewport!"
-msgstr ""
+msgstr "Node terpilih bukanlah Viewport!"
#: editor/editor_properties_array_dict.cpp
msgid "Size: "
-msgstr ""
+msgstr "Ukuran: "
#: editor/editor_properties_array_dict.cpp
msgid "Page: "
-msgstr ""
+msgstr "Halaman: "
#: editor/editor_properties_array_dict.cpp
#, fuzzy
@@ -2648,12 +2735,12 @@ msgstr "Nama baru:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
-msgstr ""
+msgstr "Tambahkan pasangan Key/Value"
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
msgid "Remove Item"
-msgstr ""
+msgstr "Hapus item"
#: editor/editor_run_native.cpp
msgid "Select device from the list"
@@ -2809,6 +2896,8 @@ msgid ""
"Templates installation failed. The problematic templates archives can be "
"found at '%s'."
msgstr ""
+"Instalasi templat gagal. Arsip templat yang bermasalah dapat ditemukan di "
+"'%s'."
#: editor/export_template_manager.cpp
msgid "Error requesting url: "
@@ -2900,6 +2989,11 @@ msgstr ""
"disimpan!"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "Favorit:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
"'%s' tidak bisa ditelusuri karena tidak bisa ditemukan dalam berkas sistem!"
@@ -2940,19 +3034,15 @@ msgstr "Galat saat menggandakan berkas:"
msgid "Unable to update dependencies:"
msgstr "Tidak bisa memperbarui dependensi:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "Nama masih kosong"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "Nama masih kosong."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "Nama yang dimasukkan tidak valid"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "Nama masih kosong."
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "Nama mengandung karakter tidak valid."
@@ -2977,22 +3067,6 @@ msgid "Duplicating folder:"
msgstr "Menggandakan folder:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "Perluas semua"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "Ciutkan semua"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "Ubah Nama..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "Pindahkan ke..."
-
-#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
msgstr "Buka Scene"
@@ -3001,6 +3075,16 @@ msgid "Instance"
msgstr "Instance"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Add to favorites"
+msgstr "Favorit:"
+
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Remove from favorites"
+msgstr "Hapus dari Grup"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "Sunting Dependensi..."
@@ -3008,11 +3092,19 @@ msgstr "Sunting Dependensi..."
msgid "View Owners..."
msgstr "Tampilkan Pemilik Berkas..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "Ubah Nama..."
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "Gandakan..."
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr "Pindahkan ke..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
msgstr "Scene Baru"
@@ -3022,6 +3114,16 @@ msgstr "Scene Baru"
msgid "New Resource..."
msgstr "Simpan Resource Sebagai..."
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Expand All"
+msgstr "Perluas semua"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Collapse All"
+msgstr "Ciutkan semua"
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -3043,28 +3145,19 @@ msgstr "Pindai Ulang Berkas Sistem"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "Kondisikan status folder sebagai Favorit"
+msgid "Toggle split mode"
+msgstr "Beralih Mode"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Show current scene file."
-msgstr "Simpan sumber yang sedang diatur."
+msgid "Search files"
+msgstr "Cari Kelas"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr "Instance scene terpilih sebagai anak node saat ini."
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "Cari Kelas"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3072,7 +3165,7 @@ msgstr ""
"Memindai Berkas,\n"
"Silakan Tunggu..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "Pindahkan"
@@ -3083,39 +3176,30 @@ msgstr "Sudah ada nama berkas atau folder seperti itu."
#: editor/filesystem_dock.cpp
msgid "Overwrite"
-msgstr ""
+msgstr "Timpa"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
-msgstr ""
+msgstr "Buat Script"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find in files"
+msgid "Find in Files"
msgstr "%d file lagi"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find: "
+msgid "Find:"
msgstr "Cari"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Whole words"
-msgstr "Semua Kata"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "Kasus Kecocokan"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "Buat Folder"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Filter: "
+msgid "Filters:"
msgstr "Filter:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -3125,7 +3209,7 @@ msgstr "Cari..."
#: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp
msgid "Replace..."
-msgstr ""
+msgstr "Gantikan..."
#: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp
msgid "Cancel"
@@ -3133,6 +3217,11 @@ msgstr "Batal"
#: editor/find_in_files.cpp
#, fuzzy
+msgid "Find: "
+msgstr "Cari"
+
+#: editor/find_in_files.cpp
+#, fuzzy
msgid "Replace: "
msgstr "Ganti"
@@ -3158,7 +3247,7 @@ msgstr "KESALAHAN: Nama animasi sudah ada!"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr "Nama tidak sah."
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3248,7 +3337,7 @@ msgstr "Membuat Pemetaan Cahaya"
#: editor/import/resource_importer_scene.cpp
msgid "Generating for Mesh: "
-msgstr ""
+msgstr "Menghasilkan untuk Mesh:"
#: editor/import/resource_importer_scene.cpp
msgid "Running Custom Script..."
@@ -3298,17 +3387,14 @@ msgstr "Impor ulang"
msgid "Failed to load resource."
msgstr "Gagal memuat resource."
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr ""
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+#, fuzzy
+msgid "Expand All Properties"
msgstr "Perluas semua properti"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+#, fuzzy
+msgid "Collapse All Properties"
msgstr "Ciutkan semua properti"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3354,6 +3440,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "Muat sumber tersedia dari disk dan ubah."
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "Simpan sumber yang sedang diatur."
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "Ke objek sebelum diubah pada histori."
@@ -3403,11 +3493,11 @@ msgstr "Pengaya"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
-msgstr ""
+msgstr "Subfolder:"
#: editor/plugin_config_dialog.cpp
msgid "Language:"
-msgstr ""
+msgstr "Bahasa:"
#: editor/plugin_config_dialog.cpp
#, fuzzy
@@ -3416,19 +3506,17 @@ msgstr "Nama Projek:"
#: editor/plugin_config_dialog.cpp
msgid "Activate now?"
-msgstr ""
+msgstr "Aktifkan sekarang?"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Poly"
+msgid "Create Polygon"
msgstr "Buat Bidang"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#, fuzzy
-msgid "Edit Poly"
+msgid "Edit Polygon"
msgstr "Sunting Bidang"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3436,28 +3524,28 @@ msgid "Insert Point"
msgstr "Tambah Titik"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+#, fuzzy
+msgid "Edit Polygon (Remove Point)"
msgstr "Sunting Bidang (Hapus Titik)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
#, fuzzy
-msgid "Remove Poly And Point"
+msgid "Remove Polygon And Point"
msgstr "Hapus Bidang dan Titik"
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
#, fuzzy
-msgid "Create a new polygon from scratch"
-msgstr "Buat bidang baru dari awal"
+msgid "Create points."
+msgstr "Hapus Titik"
#: editor/plugins/abstract_polygon_2d_editor.cpp
#, fuzzy
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
"Sunting bidang yang ada:\n"
"LMB: Pindahkan Titik.\n"
@@ -3465,8 +3553,10 @@ msgstr ""
"RMB: Hapus Titik."
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
-msgstr "Hapus Titik"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#, fuzzy
+msgid "Erase points."
+msgstr "Beri Skala Seleksi"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3481,14 +3571,14 @@ msgstr "Tambah Animasi"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
+msgid "Load..."
msgstr "Muat"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "This type of node can't be used. Only root nodes are allowed."
-msgstr ""
+msgstr "Node tipe ini tidak dapat digunakan. Hanya node utama yang diijinkan."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3498,32 +3588,29 @@ msgid ""
"AnimationTree is inactive.\n"
"Activate to enable playback, check node warnings if activation fails."
msgstr ""
+"AnimationTree tidak aktif.\n"
+"Aktifkan untuk mengijinkan pemutaran, cek peringatan pada node jika aktifasi "
+"gagal."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Set the blending position within the space"
-msgstr ""
+msgstr "Setel posisi pembauran di dalam ruangan"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Select and move points, create points with RMB."
-msgstr ""
+msgstr "Pilih dan gerakkan titik-titik, buat titik dengan RMB."
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Hapus Titik"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "Beri Skala Seleksi"
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr "Izinkan snap dan tampilkan garis-garis kotak."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Point"
-msgstr ""
+msgstr "Titik"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3540,28 +3627,27 @@ msgstr "KESALAHAN: Nama animasi sudah ada!"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "BlendSpace2D does not belong to an AnimationTree node."
-msgstr ""
+msgstr "BlendSpace2D tidak dimiliki oleh sebuah node AnimationTree."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "No triangles exist, so no blending can take place."
-msgstr ""
+msgstr "Tidak ada segi tiga, pembauran tidak di terapkan."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create triangles by connecting points."
-msgstr ""
+msgstr "Buat segi tiga dengan menghubungkan titik-titik."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Erase points and triangles."
-msgstr ""
+msgstr "Hapus titik-titik dan segi tiga."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Generate blend triangles automatically (instead of manually)"
-msgstr ""
+msgstr "Buat segi tiga pembauran secara otomatis (sebagai ganti cara manual)"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3578,14 +3664,17 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Unable to connect, port may be in use or connection may be invalid."
msgstr ""
+"Tidak dapat terhubung, port mungkin sedang digunakan atau hubungan tidak sah."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
msgstr ""
+"Tidak ada pemutar animasi disetel, jadi tidak bisa mendapatkan nama track."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Player path set is invalid, so unable to retrieve track names."
msgstr ""
+"Setelan path pada pemutar tidak sah, jadi tidak bisa mendapatkan nama track."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
@@ -3593,11 +3682,13 @@ msgid ""
"Animation player has no valid root node path, so unable to retrieve track "
"names."
msgstr ""
+"Pemutar animasi tidak punya path root yang sah, jadi tidak bisa mendapatkan "
+"nama track."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
-msgid "Add Node.."
+msgid "Add Node..."
msgstr "Tambahkan Node"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3608,7 +3699,7 @@ msgstr "Sunting Filter"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Enable filtering"
-msgstr ""
+msgstr "Aktifkan penyaringan"
#: editor/plugins/animation_player_editor_plugin.cpp
#, fuzzy
@@ -3653,7 +3744,7 @@ msgstr "Ubah Nama Animasi"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Blend Next Changed"
-msgstr ""
+msgstr "Baur Pergantian Selanjutnya"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Change Blend Time"
@@ -3762,7 +3853,7 @@ msgstr "Onion Skinning"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Enable Onion Skinning"
-msgstr ""
+msgstr "Aktifkan Bayang-bayang"
#: editor/plugins/animation_player_editor_plugin.cpp
#, fuzzy
@@ -3800,16 +3891,15 @@ msgstr "Hanya yang berbeda"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Force White Modulate"
-msgstr ""
+msgstr "Paksa Modulasi Putih"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Include Gizmos (3D)"
-msgstr ""
+msgstr "Masukkan Gizmo (3D)"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Pin AnimationPlayer"
-msgstr "Tempelkan Animasi"
+msgstr "Sematkan AnimationPlayer"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Create New Animation"
@@ -3829,7 +3919,7 @@ msgstr "Kesalahan!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Blend Times:"
-msgstr ""
+msgstr "Waktu Berbaur:"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Next (Auto Queue):"
@@ -3837,31 +3927,31 @@ msgstr "Selanjutnya (Antrian Otomatis):"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Cross-Animation Blend Times"
-msgstr ""
+msgstr "Waktu Berbaur Animasi-silang"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "End"
-msgstr ""
+msgstr "Akhir"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Immediate"
-msgstr ""
+msgstr "Segera"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Sync"
-msgstr ""
+msgstr "Sinkron"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "At End"
-msgstr ""
+msgstr "Pada Akhir"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Travel"
-msgstr ""
+msgstr "Menjelajah"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Start and end nodes are needed for a sub-transition."
-msgstr ""
+msgstr "Node awal dan akhir dibutuhkan untuk sub-transisi."
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
@@ -3874,6 +3964,9 @@ msgid ""
"RMB to add new nodes.\n"
"Shift+LMB to create connections."
msgstr ""
+"Pilih dan pindah node.\n"
+"RMB untuk menambah node baru.\n"
+"Shift+LMB untuk membuat sambungan."
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
@@ -3887,16 +3980,16 @@ msgstr "Sambungkan Ke Node:"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "Hapus track yang dipilih."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
-msgstr ""
+msgstr "Alihkan autoplay animasi ini pada awal, restart atau geser ke nol."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set the end animation. This is useful for sub-transitions."
-msgstr ""
+msgstr "Terapkan akhir pada animasi. Berguna untuk sub-transisi."
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
@@ -3906,7 +3999,7 @@ msgstr "Transisi"
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "AnimationTree"
-msgstr "PohonAnimasi"
+msgstr "AnimationTree"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "New name:"
@@ -3919,19 +4012,19 @@ msgstr "Skala:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Fade In (s):"
-msgstr ""
+msgstr "Memudar Masuk (d):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Fade Out (s):"
-msgstr ""
+msgstr "Memudar Keluar (d):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend"
-msgstr ""
+msgstr "Berbaur"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Mix"
-msgstr ""
+msgstr "Bercampur"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Auto Restart:"
@@ -3943,7 +4036,7 @@ msgstr "Mulai Ulang:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Random Restart (s):"
-msgstr ""
+msgstr "Mulai Ulang secara Acak (d):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Start!"
@@ -3952,59 +4045,55 @@ msgstr "Mulai!"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Amount:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr ""
+msgstr "Jumlah:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
-msgstr ""
+msgstr "Berbaur 0:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 1:"
-msgstr ""
+msgstr "Berbaur 1:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "X-Fade Time (s):"
-msgstr ""
+msgstr "Waktu X-Fade (d):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Current:"
-msgstr ""
+msgstr "Saat ini:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Add Input"
-msgstr ""
+msgstr "Tambah Masukan"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Clear Auto-Advance"
-msgstr ""
+msgstr "Bersihkan Auto-Advance"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Set Auto-Advance"
-msgstr ""
+msgstr "Terapkan Auto-Advance"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Delete Input"
-msgstr ""
+msgstr "Hapus Masukan"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Animation tree is valid."
-msgstr ""
+msgstr "Pohon animasi valid."
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Animation tree is invalid."
-msgstr ""
+msgstr "Pohon animasi tidak valid."
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Animation Node"
-msgstr ""
+msgstr "Node Animasi"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "OneShot Node"
-msgstr ""
+msgstr "Node sekali tembak"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Mix Node"
@@ -4024,15 +4113,15 @@ msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "TimeScale Node"
-msgstr ""
+msgstr "Node TimeScale"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "TimeSeek Node"
-msgstr ""
+msgstr "Node TimeSeek"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Transition Node"
-msgstr ""
+msgstr "Node Transisi"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Import Animations..."
@@ -4059,7 +4148,7 @@ msgstr "File:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Can't resolve hostname:"
-msgstr ""
+msgstr "Tidak dapat menjelaskan hostname:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connection error, please try again."
@@ -4085,38 +4174,35 @@ msgstr "Permintaan gagal, terlalu banyak pengalihan"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
-msgstr ""
+msgstr "Hash unduhan buruk, berkas mungkin telah diubah."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Expected:"
-msgstr ""
+msgstr "Yang Diharapkan:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Got:"
-msgstr ""
+msgstr "Yang Didapat:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Failed sha256 hash check"
msgstr "Gagal mengecek hash sha256"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Asset Download Error:"
-msgstr "Gagal Mengunduh Aset:"
+msgstr "Kesalahan Saat Mengunduh Aset:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading (%s / %s)..."
-msgstr "Mengunduh"
+msgstr "Mengunduh (%s / %s)..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading..."
-msgstr "Mengunduh"
+msgstr "Mengunduh..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Resolving..."
-msgstr ""
+msgstr "Menyelesaikan..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Error making request"
@@ -4124,11 +4210,11 @@ msgstr "Kesalahan saat melakukan permintaan"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Idle"
-msgstr ""
+msgstr "Menganggur"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Retry"
-msgstr ""
+msgstr "Coba Lagi"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Download Error"
@@ -4154,7 +4240,7 @@ msgstr "Berikutnya"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Last"
-msgstr ""
+msgstr "Terakhir"
#: editor/plugins/asset_library_editor_plugin.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -4166,7 +4252,7 @@ msgstr "Semua"
msgid "Plugins"
msgstr "Pengaya"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "Sortir:"
@@ -4303,6 +4389,11 @@ msgstr "Sunting CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Scale CanvasItem"
+msgstr "Sunting CanvasItem"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Move CanvasItem"
msgstr "Sunting CanvasItem"
@@ -4323,21 +4414,19 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "Perkecil Pandangan"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "Perkecil Pandangan"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Perbesar Pandangan"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4366,6 +4455,11 @@ msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "Beralih Mode"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4461,6 +4555,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "Singleton"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr ""
@@ -4512,6 +4611,10 @@ msgid "Show Viewport"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr ""
@@ -4583,8 +4686,18 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr ""
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "Buat Bidang"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Poly"
+msgstr "Sunting Bidang"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Sunting Bidang (Hapus Titik)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
@@ -4693,36 +4806,9 @@ msgid "Item List Editor"
msgstr "Penyunting Daftar Item"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Edit existing polygon:"
-msgstr "Sunting poligon yang ada:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr ""
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr ""
@@ -4956,12 +5042,12 @@ msgid "Populate"
msgstr ""
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
+msgid "Generating Visibility Rect"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -4990,6 +5076,12 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "Convert to CPUParticles"
+msgstr "Sambungkan Ke Node:"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr "Partikel"
@@ -5059,13 +5151,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "Sambungkan Ke Node:"
+msgid "Generate AABB"
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5089,6 +5180,11 @@ msgid "Add Point to Curve"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "Sunting Kurva Node"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr ""
@@ -5116,6 +5212,10 @@ msgid "Click: Add Point"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr ""
@@ -5131,11 +5231,6 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr ""
@@ -5196,6 +5291,10 @@ msgstr "Hapus Autoload"
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5207,7 +5306,13 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync bones"
+msgid "Sync Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5220,40 +5325,46 @@ msgid "Create Polygon & UV"
msgstr "Buat Bidang"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "Buat Subskribsi"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
+#, fuzzy
+msgid "Remove Internal Vertex"
+msgstr "Hapus item"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "Autoload '%s' telah ada!"
+msgid "Add Custom Polygon"
+msgstr "Sunting Bidang"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Add Split"
-msgstr "Tambahkan Sinyal"
+msgid "Remove Custom Polygon"
+msgstr "Hapus Bidang dan Titik"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Invalid Split: "
-msgstr "Path Tidak Sah."
+msgid "Transform UV Map"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Hapus Sinyal"
+msgid "Transform Polygon"
+msgstr "Buat Bidang"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Transform UV Map"
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
-msgstr ""
+#, fuzzy
+msgid "Open Polygon 2D UV editor."
+msgstr "Penyunting UV Poligon 2D"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -5266,12 +5377,13 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "Sunting Bidang"
+msgid "Points"
+msgstr "Titik"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Splits"
-msgstr ""
+#, fuzzy
+msgid "Polygons"
+msgstr "Sunting Bidang"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Bones"
@@ -5279,12 +5391,8 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
-msgstr "Buat Bidang"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
-msgstr ""
+msgid "Move Points"
+msgstr "Hapus Sinyal"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
@@ -5311,20 +5419,21 @@ msgid "Scale Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "Pilih Berkas untuk Dipindai"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5349,6 +5458,11 @@ msgid "Grid Settings"
msgstr "Pengaturan Editor"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr ""
@@ -5407,23 +5521,23 @@ msgid "Paste Resource"
msgstr "Tempel Resource"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-#, fuzzy
-msgid "Open in Editor"
-msgstr "Buka dalam Penyunting"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+#, fuzzy
+msgid "Open in Editor"
+msgstr "Buka dalam Penyunting"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr ""
@@ -5457,6 +5571,11 @@ msgstr "Error menyimpan TileSet!"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
+msgid "Error: could not load file."
+msgstr "Tidak dapat membuat folder."
+
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Error could not load file."
msgstr "Tidak dapat membuat folder."
@@ -5466,20 +5585,24 @@ msgid "Error saving file!"
msgstr "Error menyimpan TileSet!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr ""
+#, fuzzy
+msgid "Error while saving theme."
+msgstr "Error saat menyimpan."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
-msgstr ""
+#, fuzzy
+msgid "Error Saving"
+msgstr "Galat saat memindahkan:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr ""
+#, fuzzy
+msgid "Error importing theme."
+msgstr "Galat saat mengimpor:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
-msgstr ""
+#, fuzzy
+msgid "Error Importing"
+msgstr "Galat saat mengimpor:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -5501,6 +5624,14 @@ msgid "Import Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr ""
@@ -5543,8 +5674,8 @@ msgstr "Berkas"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile"
-msgstr "File:"
+msgid "Open..."
+msgstr "Buka"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5561,12 +5692,8 @@ msgstr "Salin Resource"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Show In File System"
-msgstr "Tampilkan dalam Manajer Berkas"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
-msgstr ""
+msgid "History Previous"
+msgstr "Tab sebelumnya"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
@@ -5579,6 +5706,11 @@ msgid "Theme"
msgstr "Simpan Tema"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Import Theme..."
+msgstr "Mengimpor scene..."
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
msgstr "Muat Ulang Tema"
@@ -5587,10 +5719,6 @@ msgid "Save Theme"
msgstr "Simpan Tema"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "Simpan Tema Sebagai"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "Tutup Dokumentasi"
@@ -5639,7 +5767,7 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr "Debug menggunakan penyunting eksternal"
#: editor/plugins/script_editor_plugin.cpp
@@ -5647,10 +5775,6 @@ msgid "Open Godot online documentation"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -5688,19 +5812,9 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Search results"
+msgid "Search Results"
msgstr "Mencari Bantuan"
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "Cari Kelas"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr "Skrip built-in hanya bisa disunting ketika scene induknya dimuat"
-
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
@@ -5711,6 +5825,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "Tambahkan Fungsi"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr ""
@@ -5742,10 +5865,6 @@ msgstr ""
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5799,12 +5918,14 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
-msgstr ""
+#, fuzzy
+msgid "Convert Indent to Spaces"
+msgstr "Sambungkan Ke Node:"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
-msgstr ""
+#, fuzzy
+msgid "Convert Indent to Tabs"
+msgstr "Sambungkan Ke Node:"
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
@@ -5820,21 +5941,14 @@ msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr ""
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "Lanjut ke Langkah Berikutnya"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Convert To Lowercase"
-msgstr "Sambungkan Ke Node:"
+msgid "Go to Previous Breakpoint"
+msgstr "Ke dokumen yang disunting sebelumnya."
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
@@ -5842,16 +5956,18 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr "Saring berkas..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
-msgstr ""
+#, fuzzy
+msgid "Go to Function..."
+msgstr "Hapus Fungsi"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
-msgstr ""
+#, fuzzy
+msgid "Go to Line..."
+msgstr "Pergi ke Baris"
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
@@ -5947,6 +6063,14 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -6120,6 +6244,10 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -6222,10 +6350,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap To Floor"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Toggle Freelook"
msgstr "Mode Layar Penuh"
@@ -6343,6 +6467,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
msgstr ""
@@ -6461,11 +6589,16 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6636,6 +6769,11 @@ msgid "Fix Invalid Tiles"
msgstr "Nama tidak sah."
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "Beri Skala Seleksi"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6683,33 +6821,38 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "Hapus Pilihan"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
+msgid "Rotate left"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
+msgid "Rotate right"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Flip vertically"
msgstr ""
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Clear transform"
+msgstr "Ubah Transformasi Animasi"
+
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr "Tambahkan Node (Node-node) dari Tree"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr "Hapus Sinyal"
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6721,25 +6864,47 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "Tempelkan Animasi"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "Beri Skala Seleksi"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "Buat Bidang"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "Hapus Sinyal"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6747,7 +6912,12 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Hapus Templat"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6757,16 +6927,27 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "Hapus file yang dipilih?"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr ""
+msgstr "Simpan sumber yang sedang diatur."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "Hapus Titik"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr "Simpan sumber yang sedang diatur."
@@ -6785,12 +6966,101 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr "Simpan sumber yang sedang diatur."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Set Tile Region"
+msgstr "Penyunting Daerah Tekstur"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Buat Folder"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "Sunting Filter"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Sunting poligon yang ada:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Sunting Bidang"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Sunting poligon yang ada:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "Tempelkan Animasi"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Hapus Templat"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "Hapus Bidang dan Titik"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "Hapus Autoload"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "Hapus Animasi"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "Sunting Filter"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Buat Bidang"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Buat Bidang"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "This property can't be changed."
msgstr "Operasi ini tidak dapat diselesaikan tanpa scene."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Tile Set"
+msgid "TileSet"
msgstr "TileSet..."
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6831,6 +7101,15 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Exporting All"
+msgstr "Mengekspor untuk %s"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6839,6 +7118,11 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "Ekspor Projek"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6895,10 +7179,50 @@ msgid "Feature List:"
msgstr "Daftar Fungsi:"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "Scene Baru"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Script Export Mode:"
+msgstr "Ekspor Projek"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export mode?"
+msgstr "Ekspor Projek"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Export All"
+msgstr "Ekspor"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -7034,7 +7358,7 @@ msgstr ""
#: editor/project_manager.cpp
#, fuzzy
-msgid "Can't open project"
+msgid "Can't open project at '%s'."
msgstr "Menyambungkan..."
#: editor/project_manager.cpp
@@ -7043,6 +7367,24 @@ msgid "Are you sure to open more than one project?"
msgstr "Apakah Anda yakin membuka lebih dari satu projek?"
#: editor/project_manager.cpp
+msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
#, fuzzy
msgid ""
"Can't run project: no main scene defined.\n"
@@ -7376,10 +7718,6 @@ msgstr ""
msgid "General"
msgstr "Umum"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7517,10 +7855,6 @@ msgstr "Path ke Node:"
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
#, fuzzy
msgid "Select Property"
@@ -7613,7 +7947,7 @@ msgid "Step"
msgstr "Langkah:"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7622,7 +7956,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7665,7 +7999,7 @@ msgstr ""
msgid "Reset"
msgstr "Kebalikan Semula Pandangan"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7724,6 +8058,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
#, fuzzy
msgid "Clear Script"
msgstr "Scene Baru"
@@ -7761,6 +8099,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7837,6 +8181,11 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Open documentation"
+msgstr "Buka baru-baru ini"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr ""
@@ -7845,12 +8194,13 @@ msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Change Type"
-msgstr ""
+#, fuzzy
+msgid "Extend Script"
+msgstr "Buka Cepat Script..."
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -8008,6 +8358,10 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -8105,19 +8459,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -8150,18 +8492,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -8371,7 +8701,8 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+#, fuzzy
+msgid "Step argument is zero!"
msgstr "Argumen langkah adalah nol!"
#: modules/gdscript/gdscript_functions.cpp
@@ -8607,11 +8938,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -8907,6 +9234,10 @@ msgid "Base Type:"
msgstr "Tipe Dasar:"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "Member-member:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "Node-node yang Tersedia:"
@@ -9013,11 +9344,11 @@ msgid "Search VisualScript"
msgstr "Hapus Variabel"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -9117,6 +9448,12 @@ msgstr ""
"Sebuah bentuk harus disediakan untuk CollisionShape2D untuk fungsi. Mohon "
"ciptakan resource bentuk untuk itu!"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -9165,6 +9502,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -9297,6 +9640,16 @@ msgstr ""
"Sebuah bentuk harus disediakan untuk CollisionShape untuk fungsi. Mohon "
"ciptakan sebuah resource bentuk untuk itu!"
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -9320,6 +9673,32 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+"PathFollow2D hanya bekerja ketika diatur sebagai sebuah child dari sebuah "
+"node Path2D."
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+"PathFollow2D hanya bekerja ketika diatur sebagai sebuah child dari sebuah "
+"node Path2D."
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9357,7 +9736,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9416,14 +9795,17 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr ""
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr ""
#: scene/gui/color_picker.cpp
-#, fuzzy
msgid "Add current color as a preset"
-msgstr "Tambah warna sekarang sebagai preset"
+msgstr "Tambahkan warna yang sekarang sebagai preset"
#: scene/gui/dialogs.cpp
msgid "Alert!"
@@ -9433,19 +9815,20 @@ msgstr "Peringatan!"
msgid "Please Confirm..."
msgstr "Mohon konfirmasi..."
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr "Pilih Folder ini"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
"functions. Making them visible for editing is fine though, but they will "
"hide upon running."
msgstr ""
-"Popup-popup akan sembunyi secara default kecuali panggil popup() atau apapun "
-"dari fungsi-fungsi popup*(). Meskipun membuat mereka terlihat untuk mengedit "
-"itu baik, tetapi mereka akan sembunyi saat berjalan."
+"Popup-popup akan disembunyikan secara default kecuali anda memanggil fungsi "
+"popup() atau salah satu dari semua fungsi popup*() yang ada. Membuat mereka "
+"terlihat saat mengedit bisa dilakukan, namun mereka akan disembunyikan saat "
+"game dijalankan."
+
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr "jika exp_edit adalah true min_value seharusnya > 0."
#: scene/gui/scroll_container.cpp
msgid ""
@@ -9475,10 +9858,10 @@ msgid ""
"texture to some node for display."
msgstr ""
"Viewport ini tidak diatur sebagai target render. Jika anda berniat untuk "
-"menampilkan konten-kontennya secara langsung ke layar, buatlah sebuah child "
-"dari Kontrol jadi hal tersebut bisa memperoleh ukuran. Jika tidak, buatlah "
-"sebuah RenderTarget dan tetapkan tekstur internal untuk beberapa node untuk "
-"ditampilkan."
+"menampilkan konten-kontennya secara langsung ke layar, jadikan viewport ini "
+"sebagai child dari sebuah Control agar ia bisa memperoleh ukuran. Jika "
+"tidak, jadikan sebagai RenderTarget dan tetapkan tekstur internal nya ke "
+"beberapa node untuk ditampilkan."
#: scene/resources/dynamic_font.cpp
msgid "Error initializing FreeType."
@@ -9500,10 +9883,6 @@ msgstr "Ukuran font tidak sah."
msgid "Input"
msgstr ""
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
@@ -9521,6 +9900,119 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Split already exists."
+#~ msgstr "Autoload '%s' telah ada!"
+
+#, fuzzy
+#~ msgid "Add Split"
+#~ msgstr "Tambahkan Sinyal"
+
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr "Path Tidak Sah."
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "Hapus Sinyal"
+
+#, fuzzy
+#~ msgid "Poly"
+#~ msgstr "Sunting Bidang"
+
+#, fuzzy
+#~ msgid "Select a split to erase it."
+#~ msgstr "Pilih Berkas untuk Dipindai"
+
+#~ msgid "No name provided"
+#~ msgstr "Nama masih kosong"
+
+#, fuzzy
+#~ msgid "Add Node.."
+#~ msgstr "Tambahkan Node"
+
+#, fuzzy
+#~ msgid "Create Poly"
+#~ msgstr "Buat Bidang"
+
+#, fuzzy
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "Buat bidang baru dari awal"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "Perkecil Pandangan"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "Perbesar Pandangan"
+
+#, fuzzy
+#~ msgid "New TextFile"
+#~ msgstr "File:"
+
+#~ msgid "Save Theme As"
+#~ msgstr "Simpan Tema Sebagai"
+
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Perbesar Pandangan"
+
+#~ msgid "Class List:"
+#~ msgstr "Daftar Class:"
+
+#~ msgid "Search Classes"
+#~ msgstr "Cari Kelas"
+
+#~ msgid "Public Methods"
+#~ msgstr "Metode Publik"
+
+#~ msgid "Public Methods:"
+#~ msgstr "Metode Publik:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "Item Tema GUI"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "Item-item Tema GUI:"
+
+#, fuzzy
+#~ msgid "Property: "
+#~ msgstr "Properti Objek"
+
+#, fuzzy
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "Kondisikan status folder sebagai Favorit"
+
+#, fuzzy
+#~ msgid "Show current scene file."
+#~ msgstr "Simpan sumber yang sedang diatur."
+
+#, fuzzy
+#~ msgid "Whole words"
+#~ msgstr "Semua Kata"
+
+#, fuzzy
+#~ msgid "Match case"
+#~ msgstr "Kasus Kecocokan"
+
+#, fuzzy
+#~ msgid "Show In File System"
+#~ msgstr "Tampilkan dalam Manajer Berkas"
+
+#, fuzzy
+#~ msgid "Search in files"
+#~ msgstr "Cari Kelas"
+
+#~ msgid ""
+#~ "Built-in scripts can only be edited when the scene they belong to is "
+#~ "loaded"
+#~ msgstr "Skrip built-in hanya bisa disunting ketika scene induknya dimuat"
+
+#, fuzzy
+#~ msgid "Convert To Lowercase"
+#~ msgstr "Sambungkan Ke Node:"
+
#~ msgid "Disabled"
#~ msgstr "Dinonaktifkan"
@@ -9545,9 +10037,6 @@ msgstr ""
#~ msgid "Anim Track Change Wrap Mode"
#~ msgstr "Ubah Trek Anim ke Wrap Mode"
-#~ msgid "Edit Node Curve"
-#~ msgstr "Sunting Kurva Node"
-
#~ msgid "Edit Selection Curve"
#~ msgstr "Edit Kurva Pilihan"
@@ -9623,9 +10112,6 @@ msgstr ""
#~ msgid "Run Script"
#~ msgstr "Jalankan Script"
-#~ msgid "Save the currently edited resource."
-#~ msgstr "Simpan sumber yang sedang diatur."
-
#~ msgid "Stop Profiling"
#~ msgstr "Hentikan Profiling"
@@ -9788,9 +10274,6 @@ msgstr ""
#~ msgid "Could not save atlas subtexture:"
#~ msgstr "Tidak dapat menyimpan sub tekstur atlas:"
-#~ msgid "Exporting for %s"
-#~ msgstr "Mengekspor untuk %s"
-
#~ msgid "Setting Up..."
#~ msgstr "Mengatur..."
@@ -9822,9 +10305,6 @@ msgstr ""
#~ msgid "Texture Options"
#~ msgstr "Opsi Tekstur"
-#~ msgid "Error importing:"
-#~ msgstr "Galat saat mengimpor:"
-
#~ msgid "Max Texture Size:"
#~ msgstr "Ukuran Tekstur Maksimum:"
diff --git a/editor/translations/is.po b/editor/translations/is.po
index 5aedc67388..56b954046e 100644
--- a/editor/translations/is.po
+++ b/editor/translations/is.po
@@ -1,23 +1,23 @@
# Icelandic translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
-#
-# Jóhannes G. Þorsteinsson <johannesg@johannesg.com>, 2017.
+# Jóhannes G. Þorsteinsson <johannesg@johannesg.com>, 2017, 2018.
# Kaan Gül <qaantum@hotmail.com>, 2018.
-#
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-06-05 05:39+0000\n"
-"Last-Translator: Kaan Gül <qaantum@hotmail.com>\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:40+0100\n"
+"Last-Translator: Jóhannes G. Þorsteinsson <johannesg@johannesg.com>\n"
"Language-Team: Icelandic <https://hosted.weblate.org/projects/godot-engine/"
"godot/is/>\n"
"Language: is\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.0\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -25,7 +25,7 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr ""
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
@@ -85,14 +85,12 @@ msgid "Delete Selected Key(s)"
msgstr ""
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Duplicate Keys"
-msgstr "Tvíteknir lyklar"
+msgstr "Anim Tvíteknir lyklar"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Delete Keys"
-msgstr "Anim DELETE-lyklar"
+msgstr "Anim Eyða Lyklum"
#: editor/animation_track_editor.cpp
#, fuzzy
@@ -266,7 +264,6 @@ msgstr ""
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -373,7 +370,7 @@ msgstr ""
#: editor/project_manager.cpp editor/project_settings_editor.cpp
#: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp
msgid "Edit"
-msgstr ""
+msgstr "Breyta"
#: editor/animation_track_editor.cpp
msgid "Animation properties."
@@ -396,8 +393,7 @@ msgstr "Val á kvarða"
msgid "Scale From Cursor"
msgstr ""
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
#, fuzzy
msgid "Duplicate Selection"
msgstr "Afrita val"
@@ -413,11 +409,11 @@ msgid "Delete Selection"
msgstr "Afrita val"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+msgid "Go to Next Step"
msgstr ""
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+msgid "Go to Previous Step"
msgstr ""
#: editor/animation_track_editor.cpp
@@ -520,11 +516,11 @@ msgstr ""
msgid "Replaced %d occurrence(s)."
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr ""
@@ -540,15 +536,19 @@ msgstr ""
msgid "Selection Only"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr ""
@@ -557,10 +557,10 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Zoom:"
+msgid "Font Size:"
msgstr ""
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr ""
@@ -591,6 +591,7 @@ msgstr ""
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -664,12 +665,11 @@ msgid "Connect Signal: "
msgstr ""
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection: "
-msgstr "Breyta valferil"
+msgstr "Breyta Tengingu: "
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -686,7 +686,7 @@ msgstr ""
#: editor/connections_dialog.cpp
msgid "Edit..."
-msgstr ""
+msgstr "Breyta..."
#: editor/connections_dialog.cpp
msgid "Go To Method"
@@ -715,23 +715,20 @@ msgid "Recent:"
msgstr ""
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr ""
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr ""
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr ""
@@ -766,8 +763,7 @@ msgid "Resource"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr ""
@@ -788,9 +784,10 @@ msgid "Search Replacement Resource:"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -820,7 +817,7 @@ msgid "Error loading:"
msgstr ""
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+msgid "Load failed due to missing dependencies:"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -879,14 +876,6 @@ msgstr ""
msgid "Thanks from the Godot community!"
msgstr ""
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr ""
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr ""
@@ -901,7 +890,7 @@ msgstr ""
#: editor/editor_about.cpp
msgid "Project Manager "
-msgstr ""
+msgstr "Verkefna Stjóri "
#: editor/editor_about.cpp
msgid "Developers"
@@ -976,7 +965,7 @@ msgid "Uncompressing Assets"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+msgid "Package installed successfully!"
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1058,8 +1047,7 @@ msgid "Bus options"
msgstr ""
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr ""
@@ -1218,7 +1206,7 @@ msgid "Add AutoLoad"
msgstr ""
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr ""
@@ -1226,8 +1214,8 @@ msgstr ""
msgid "Node Name:"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr ""
@@ -1297,11 +1285,15 @@ msgid "Template file not found:"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
+msgid "Select This Folder"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1309,12 +1301,13 @@ msgid "Copy Path"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-msgid "Open In File Manager"
-msgstr ""
+#, fuzzy
+msgid "Open in File Manager"
+msgstr "Opna Verkefna Stjóra?"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+msgid "Show in File Manager"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1350,7 +1343,8 @@ msgid "Open a File or Directory"
msgstr ""
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr ""
@@ -1408,8 +1402,7 @@ msgstr ""
msgid "Preview:"
msgstr ""
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr ""
@@ -1425,24 +1418,11 @@ msgstr ""
msgid "(Re)Importing Assets"
msgstr ""
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr ""
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr ""
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr ""
@@ -1459,27 +1439,27 @@ msgid "Brief Description:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Members"
+msgid "Properties"
msgstr ""
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
+#: editor/editor_help.cpp
+msgid "Properties:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
+msgid "Methods"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods:"
+msgid "Methods:"
msgstr ""
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
+msgid "Theme Properties"
msgstr ""
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
+msgid "Theme Properties:"
msgstr ""
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
@@ -1507,7 +1487,11 @@ msgid "Constants:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Description"
+msgid "Class Description"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
msgstr ""
#: editor/editor_help.cpp
@@ -1522,11 +1506,11 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Properties"
+msgid "Property Descriptions"
msgstr ""
#: editor/editor_help.cpp
-msgid "Property Description:"
+msgid "Property Descriptions:"
msgstr ""
#: editor/editor_help.cpp
@@ -1536,11 +1520,11 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Methods"
+msgid "Method Descriptions"
msgstr ""
#: editor/editor_help.cpp
-msgid "Method Description:"
+msgid "Method Descriptions:"
msgstr ""
#: editor/editor_help.cpp
@@ -1549,11 +1533,52 @@ msgid ""
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-#: editor/editor_inspector.cpp
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
msgstr ""
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr ""
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1587,6 +1612,11 @@ msgstr ""
msgid "Error saving resource!"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr ""
@@ -1641,10 +1671,20 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr ""
@@ -1834,7 +1874,7 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Open Project Manager?"
-msgstr ""
+msgstr "Opna Verkefna Stjóra?"
#: editor/editor_node.cpp
msgid "Save & Quit"
@@ -1847,6 +1887,7 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Save changes the following scene(s) before opening Project Manager?"
msgstr ""
+"Vista breytingar á neðangreindum senu(m) áður en Verkefna Stjóri er opnaður?"
#: editor/editor_node.cpp
msgid ""
@@ -1872,6 +1913,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1912,6 +1959,11 @@ msgstr ""
msgid "Default"
msgstr ""
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Play This Scene"
msgstr ""
@@ -1993,7 +2045,7 @@ msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2022,7 +2074,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -2046,7 +2098,7 @@ msgstr ""
msgid "Export"
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr ""
@@ -2059,6 +2111,7 @@ msgid "Quit to Project List"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr ""
@@ -2166,10 +2219,6 @@ msgstr ""
msgid "Help"
msgstr ""
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2263,21 +2312,21 @@ msgstr ""
msgid "Disable Update Spinner"
msgstr ""
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr ""
#: editor/editor_node.cpp
-msgid "Node"
+msgid "FileSystem"
msgstr ""
#: editor/editor_node.cpp
-msgid "FileSystem"
+msgid "Inspector"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Node"
msgstr ""
#: editor/editor_node.cpp
@@ -2362,7 +2411,7 @@ msgstr ""
#: editor/editor_plugin_settings.cpp
msgid "Edit Plugin"
-msgstr ""
+msgstr "Breyta Viðbót"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
@@ -2387,7 +2436,7 @@ msgstr ""
#: editor/editor_plugin_settings.cpp
msgid "Edit:"
-msgstr ""
+msgstr "Breyta:"
#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
#: editor/rename_dialog.cpp
@@ -2414,7 +2463,7 @@ msgstr ""
msgid "Physics Frame %"
msgstr ""
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr ""
@@ -2438,7 +2487,7 @@ msgstr ""
msgid "Calls"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2450,20 +2499,43 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Invalid RID"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr ""
@@ -2475,10 +2547,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2487,7 +2555,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr ""
@@ -2768,6 +2837,10 @@ msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr ""
#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
@@ -2803,8 +2876,8 @@ msgstr ""
msgid "Unable to update dependencies:"
msgstr ""
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2812,10 +2885,6 @@ msgid "Provided name contains invalid characters"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr ""
@@ -2840,43 +2909,43 @@ msgid "Duplicating folder:"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
+msgid "Open Scene(s)"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Move To..."
+msgid "Instance"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Open Scene(s)"
+msgid "Add to favorites"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Instance"
+msgid "Remove from favorites"
msgstr ""
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
-msgstr ""
+msgstr "Breyta"
#: editor/filesystem_dock.cpp
msgid "View Owners..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr ""
+
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Duplicate..."
msgstr "Hreyfimynd Tvöfalda Lykla"
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -2884,6 +2953,14 @@ msgstr ""
msgid "New Resource..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr ""
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -2904,11 +2981,11 @@ msgid "Re-Scan Filesystem"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Toggle folder status as Favorite."
+msgid "Toggle split mode"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Show current scene file."
+msgid "Search files"
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2916,20 +2993,12 @@ msgid "Instance the selected scene(s) as child of the selected node."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Search files"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
msgstr ""
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr ""
@@ -2946,27 +3015,19 @@ msgid "Create Script"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Find in files"
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Find: "
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Whole words"
+msgid "Find in Files"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Match case"
+msgid "Find:"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Folder: "
+msgid "Folder:"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Filter: "
+msgid "Filters:"
msgstr ""
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -2983,6 +3044,10 @@ msgid "Cancel"
msgstr ""
#: editor/find_in_files.cpp
+msgid "Find: "
+msgstr ""
+
+#: editor/find_in_files.cpp
msgid "Replace: "
msgstr ""
@@ -3003,7 +3068,7 @@ msgid "Group name already exists."
msgstr ""
#: editor/groups_editor.cpp
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr ""
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3139,17 +3204,12 @@ msgstr ""
msgid "Failed to load resource."
msgstr ""
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr ""
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+msgid "Collapse All Properties"
msgstr ""
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3194,6 +3254,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr ""
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr ""
@@ -3254,44 +3318,43 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
-msgstr ""
+#, fuzzy
+msgid "Edit Polygon"
+msgstr "Breyta Viðbót"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+msgid "Remove Polygon And Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3306,7 +3369,7 @@ msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Load.."
+msgid "Load..."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3335,12 +3398,8 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Create points."
-msgstr ""
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-msgid "Erase points."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3380,9 +3439,8 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3416,7 +3474,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add Node.."
+msgid "Add Node..."
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3685,7 +3743,7 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "Fjarlægja val"
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3753,10 +3811,6 @@ msgid "Amount:"
msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr ""
@@ -3954,7 +4008,7 @@ msgstr ""
msgid "Plugins"
msgstr ""
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr ""
@@ -4078,6 +4132,10 @@ msgid "Resize CanvasItem"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
msgstr ""
@@ -4098,15 +4156,15 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom out"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom reset"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom in"
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -4138,6 +4196,10 @@ msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4232,6 +4294,10 @@ msgid "Restores the object's children's ability to be selected."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr ""
@@ -4282,6 +4348,10 @@ msgid "Show Viewport"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr ""
@@ -4350,7 +4420,15 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
+msgid "Create Polygon3D"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
msgstr ""
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
@@ -4452,35 +4530,9 @@ msgid "Item List Editor"
msgstr ""
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr ""
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr ""
@@ -4712,12 +4764,12 @@ msgid "Populate"
msgstr ""
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
+msgid "Generating Visibility Rect"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -4746,6 +4798,11 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr ""
@@ -4815,11 +4872,11 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Convert to CPUParticles"
+msgid "Generate AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -4844,6 +4901,11 @@ msgid "Add Point to Curve"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "Breyta hnútnum Ferill"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr ""
@@ -4871,6 +4933,10 @@ msgid "Click: Add Point"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr ""
@@ -4886,11 +4952,6 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr ""
@@ -4947,6 +5008,10 @@ msgstr ""
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
msgid "Move joint"
msgstr ""
@@ -4957,7 +5022,13 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync bones"
+msgid "Sync Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -4969,36 +5040,40 @@ msgid "Create Polygon & UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
+msgid "Create Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
+msgid "Remove Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split already exists."
+msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Add Split"
+#, fuzzy
+msgid "Add Custom Polygon"
+msgstr "Breyta Viðbót"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Remove Custom Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Invalid Split: "
+msgid "Transform UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Remove Split"
-msgstr "Fjarlægja val"
+msgid "Transform Polygon"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Transform UV Map"
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
+msgid "Open Polygon 2D UV editor."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5010,23 +5085,20 @@ msgid "UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Poly"
+msgid "Points"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Splits"
-msgstr ""
+#, fuzzy
+msgid "Polygons"
+msgstr "Breyta Viðbót"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Bones"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create Polygon"
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Move Points"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5054,19 +5126,21 @@ msgid "Scale Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Select a split to erase it"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5090,6 +5164,11 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr ""
@@ -5147,22 +5226,22 @@ msgid "Paste Resource"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr ""
@@ -5192,6 +5271,10 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Error could not load file."
msgstr ""
@@ -5200,19 +5283,19 @@ msgid "Error saving file!"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
+msgid "Error while saving theme."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+msgid "Error Saving"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
+msgid "Error importing theme."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+msgid "Error Importing"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5232,6 +5315,14 @@ msgid "Import Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr ""
@@ -5272,7 +5363,7 @@ msgid "File"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile"
+msgid "Open..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5288,11 +5379,7 @@ msgid "Copy Script Path"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+msgid "History Previous"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5305,15 +5392,15 @@ msgid "Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Reload Theme"
+msgid "Import Theme..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme"
+msgid "Reload Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
+msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5363,7 +5450,7 @@ msgid "Keep Debugger Open"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5371,10 +5458,6 @@ msgid "Open Godot online documentation"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -5409,24 +5492,23 @@ msgid "Debugger"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search results"
+msgid "Search Results"
msgstr ""
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search in files"
+#: editor/plugins/script_text_editor.cpp
+msgid "Line"
msgstr ""
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
+#: editor/plugins/script_text_editor.cpp
+msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
+msgid "Go to Function"
msgstr ""
-#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5461,10 +5543,6 @@ msgstr ""
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5516,11 +5594,11 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5537,19 +5615,11 @@ msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
+msgid "Go to Next Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
+msgid "Go to Previous Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5557,15 +5627,15 @@ msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+msgid "Go to Function..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5657,6 +5727,14 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -5821,6 +5899,10 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -5920,10 +6002,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap To Floor"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6040,6 +6118,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
msgstr ""
@@ -6153,11 +6235,16 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6321,6 +6408,11 @@ msgid "Fix Invalid Tiles"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "Afrita val"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6366,32 +6458,38 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "Fjarlægja val"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
+msgid "Rotate left"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
+msgid "Rotate right"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Flip vertically"
msgstr ""
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Clear transform"
+msgstr "Breyta umbreytingu"
+
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove current Texture from TileSet"
-msgstr ""
+#, fuzzy
+msgid "Remove selected Texture from TileSet."
+msgstr "Fjarlægja val"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -6402,25 +6500,44 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Erase bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new polygon."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "Fjarlægja val"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6428,7 +6545,12 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Fjarlægja val"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6438,15 +6560,25 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "Afrita val"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "Afrita val"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr ""
@@ -6464,11 +6596,89 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Tile"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Breyta Viðbót"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Breyta Viðbót"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Breyta Viðbót"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Fjarlægja val"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "This property can't be changed."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
+msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6504,6 +6714,14 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6512,6 +6730,10 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+msgid "Export Path"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6566,10 +6788,46 @@ msgid "Feature List:"
msgstr ""
#: editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr ""
#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -6696,7 +6954,7 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
-msgid "Can't open project"
+msgid "Can't open project at '%s'."
msgstr ""
#: editor/project_manager.cpp
@@ -6705,6 +6963,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -6729,6 +7005,8 @@ msgid ""
"Language changed.\n"
"The UI will update next time the editor or project manager starts."
msgstr ""
+"Tungumáli breytt.\n"
+"Viðmótið mun uppfærast við næstu ræsingu á tóli eða verkefna stjóra."
#: editor/project_manager.cpp
msgid ""
@@ -6738,7 +7016,7 @@ msgstr ""
#: editor/project_manager.cpp
msgid "Project Manager"
-msgstr ""
+msgstr "Verkefna Stjóri"
#: editor/project_manager.cpp
msgid "Project List"
@@ -7018,10 +7296,6 @@ msgstr ""
msgid "General"
msgstr ""
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7155,10 +7429,6 @@ msgstr ""
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr ""
@@ -7243,7 +7513,7 @@ msgid "Step"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7252,7 +7522,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7292,7 +7562,7 @@ msgstr ""
msgid "Reset"
msgstr ""
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7351,6 +7621,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr ""
@@ -7387,6 +7661,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7457,6 +7737,10 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr ""
@@ -7465,11 +7749,11 @@ msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Change Type"
+msgid "Extend Script"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -7619,6 +7903,10 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -7707,19 +7995,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -7751,18 +8027,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -7959,7 +8223,7 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+msgid "Step argument is zero!"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
@@ -8181,11 +8445,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -8455,6 +8715,10 @@ msgid "Base Type:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr ""
@@ -8553,11 +8817,11 @@ msgid "Search VisualScript"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8635,6 +8899,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -8673,6 +8943,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -8790,6 +9066,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -8809,6 +9095,26 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -8841,7 +9147,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -8894,6 +9200,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr ""
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr ""
@@ -8910,10 +9220,6 @@ msgstr ""
msgid "Please Confirm..."
msgstr ""
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr ""
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -8921,6 +9227,10 @@ msgid ""
"hide upon running."
msgstr ""
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -8966,10 +9276,6 @@ msgstr ""
msgid "Input"
msgstr ""
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for shader."
msgstr ""
@@ -8987,6 +9293,10 @@ msgid "Varyings can only be assigned in vertex function."
msgstr ""
#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "Fjarlægja val"
+
+#, fuzzy
#~ msgid "Disabled"
#~ msgstr "Óvirkt"
@@ -9011,10 +9321,6 @@ msgstr ""
#~ msgstr "Anim track breyta hulum ham"
#, fuzzy
-#~ msgid "Edit Node Curve"
-#~ msgstr "Breyta hnútnum Ferill"
-
-#, fuzzy
#~ msgid "Anim Add Key"
#~ msgstr "Anim bæta við lykli"
diff --git a/editor/translations/it.po b/editor/translations/it.po
index 4c60b4d34f..66eed4d2aa 100644
--- a/editor/translations/it.po
+++ b/editor/translations/it.po
@@ -1,6 +1,6 @@
# Italian translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# Alessio Corridori <alessiocorridori@hotmail.com>, 2018.
# Dario Bonfanti <bonfi.96@hotmail.it>, 2016-2017.
@@ -20,12 +20,16 @@
# Ste d f <sdfilippo84@gmail.com>, 2018.
# Salvo Permiracolo <salvoperm@gmail.com>, 2018.
# Giovanni Tommasi <tommasig@gmail.com>, 2018.
+# xxssmaoxx <simon.dottor@gmail.com>, 2018.
+# Nicola Gramola <nicola.gramola@gmail.com>, 2018.
+# Davide Wayan Mores <moresdavidewayan@gmail.com>, 2018.
+# Alessandro Zoppi <alessandro.zoppi@live.it>, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2018-08-18 17:38+0000\n"
-"Last-Translator: Giovanni Tommasi <tommasig@gmail.com>\n"
+"PO-Revision-Date: 2019-01-04 04:09+0000\n"
+"Last-Translator: Alessandro Zoppi <alessandro.zoppi@live.it>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/"
"godot/it/>\n"
"Language: it\n"
@@ -33,7 +37,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.2-dev\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -41,7 +45,7 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr "Argomento tipo invalido per convert(), usare le costanti TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
@@ -50,11 +54,11 @@ msgstr ""
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Input non valido %i (non passato) nell'espressione"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "self non può essere usato perché l'istanza è nulla (non passata)"
#: core/math/expression.cpp
#, fuzzy
@@ -68,16 +72,15 @@ msgstr "Nome proprietà indice invalido '%s' nel nodo %s."
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "Indice nominale '%s' invalido per il tipo base %s"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid arguments to construct '%s'"
-msgstr ": Argomento invalido di tipo: "
+msgstr "Argomento invalido di tipo '%s"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "Alla chiamata di '%s':"
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -86,7 +89,7 @@ msgstr "Gratuito"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "Bilanciato"
#: editor/animation_bezier_editor.cpp
#, fuzzy
@@ -94,19 +97,16 @@ msgid "Mirror"
msgstr "Specchia X"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "Inserisci Key"
+msgstr "Inserisci la chiave qui"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "Duplica Selezione"
+msgstr "Duplicare la(e) chiave selezionata(e)"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "Elimina selezionati"
+msgstr "Eliminare la(e) Chiave(i) Selezionata(e)"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -126,11 +126,11 @@ msgstr "Anim Cambia Transizione"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transform"
-msgstr "Anim Cambia Transform"
+msgstr "Anim Cambia Trasformazione"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Value"
-msgstr "Anim Cambia Valore Chiave"
+msgstr "Anim Cambia Valore Keyframe"
#: editor/animation_track_editor.cpp
msgid "Anim Change Call"
@@ -291,7 +291,6 @@ msgstr "Creare %d NUOVE tracce e inserire key?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -426,8 +425,7 @@ msgstr "Scala Selezione"
msgid "Scale From Cursor"
msgstr "Scala da Cursore"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Duplica Selezione"
@@ -441,11 +439,13 @@ msgid "Delete Selection"
msgstr "Elimina selezionati"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+#, fuzzy
+msgid "Go to Next Step"
msgstr "Vai a Step Successivo"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+#, fuzzy
+msgid "Go to Previous Step"
msgstr "Vai a Step Precedente"
#: editor/animation_track_editor.cpp
@@ -548,11 +548,11 @@ msgstr "Nessuna Corrispondenza"
msgid "Replaced %d occurrence(s)."
msgstr "Rimpiazzate %d occorrenze."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Controlla Maiuscole"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "Parole Intere"
@@ -568,15 +568,19 @@ msgstr "Rimpiazza Tutti"
msgid "Selection Only"
msgstr "Solo Selezione"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Zoom In"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "Zoom Out"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "Resetta Zoom"
@@ -587,10 +591,10 @@ msgstr "Avvertimento"
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "Zoom(%):"
+msgid "Font Size:"
+msgstr "Dimensione Font sorgente:"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Riga:"
@@ -623,6 +627,7 @@ msgstr "Aggiungi"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -704,7 +709,7 @@ msgstr "Modifica Connessioni"
#: editor/connections_dialog.cpp
#, fuzzy
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "Sei sicuro di voler eseguire più di un progetto?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -753,23 +758,20 @@ msgid "Recent:"
msgstr "Recenti:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Cerca:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "Corrispondenze:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "Descrizione:"
@@ -808,8 +810,7 @@ msgid "Resource"
msgstr "Risorsa"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "Percorso"
@@ -830,9 +831,10 @@ msgid "Search Replacement Resource:"
msgstr "Cerca Risorsa di Rimpiazzo:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -865,7 +867,8 @@ msgid "Error loading:"
msgstr "Errore in caricamento:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+#, fuzzy
+msgid "Load failed due to missing dependencies:"
msgstr "Caricamento scena fallito per mancanza di dipendenze:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -924,14 +927,6 @@ msgstr "Cambia Valore Dizionario"
msgid "Thanks from the Godot community!"
msgstr "Grazie dalla comunità di Godot!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "OK"
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Contributori a Godot Engine"
@@ -1025,7 +1020,8 @@ msgid "Uncompressing Assets"
msgstr "Decompressione Assets"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+#, fuzzy
+msgid "Package installed successfully!"
msgstr "Pacchetto Installato Con Successo!"
#: editor/editor_asset_installer.cpp
@@ -1107,8 +1103,7 @@ msgid "Bus options"
msgstr "Opzioni bus"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "duplica"
@@ -1273,7 +1268,7 @@ msgid "Add AutoLoad"
msgstr "Aggiungi AutoLoad"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "Percorso:"
@@ -1281,8 +1276,8 @@ msgstr "Percorso:"
msgid "Node Name:"
msgstr "Nome Nodo:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "Nome"
@@ -1352,12 +1347,17 @@ msgid "Template file not found:"
msgstr "Template non trovato:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Seleziona Cartella Attuale"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "File Esistente, Sovrascrivere?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "Seleziona Cartella Attuale"
+#, fuzzy
+msgid "Select This Folder"
+msgstr "Seleziona Metodo"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
@@ -1365,12 +1365,13 @@ msgstr "Copia Percorso"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr "Mostra nel File Manager"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+#, fuzzy
+msgid "Show in File Manager"
msgstr "Mostra nel File Manager"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1406,7 +1407,8 @@ msgid "Open a File or Directory"
msgstr "Apri un File o una Directory"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Salva"
@@ -1464,8 +1466,7 @@ msgstr "Directory e File:"
msgid "Preview:"
msgstr "Anteprima:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "File:"
@@ -1481,24 +1482,11 @@ msgstr "ScansionaSorgenti"
msgid "(Re)Importing Assets"
msgstr "(Re)Importando gli Assets"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "Cerca Aiuto"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "Lista Classi:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "Cerca Classi"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "Alto"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "Classe:"
@@ -1515,28 +1503,31 @@ msgid "Brief Description:"
msgstr "Breve Descrizione:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "Membri"
+msgid "Properties"
+msgstr "Proprietà"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "Membri:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr "Proprietà:"
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "Metodi Pubblici"
+msgid "Methods"
+msgstr "Metodi"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "Metodi Pubblici:"
+#, fuzzy
+msgid "Methods:"
+msgstr "Metodi"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "Elementi Tema GUI"
+#, fuzzy
+msgid "Theme Properties"
+msgstr "Proprietà"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "Elementi Tema GUI:"
+#, fuzzy
+msgid "Theme Properties:"
+msgstr "Proprietà:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1563,10 +1554,16 @@ msgid "Constants:"
msgstr "Costanti:"
#: editor/editor_help.cpp
-msgid "Description"
+#, fuzzy
+msgid "Class Description"
msgstr "Descrizione"
#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
+msgstr "Descrizione:"
+
+#: editor/editor_help.cpp
msgid "Online Tutorials:"
msgstr "Tutorial online:"
@@ -1581,11 +1578,13 @@ msgstr ""
"$url2]richiedendone una[/url][/color]."
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "Proprietà"
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "Descrizione Proprietà:"
#: editor/editor_help.cpp
-msgid "Property Description:"
+#, fuzzy
+msgid "Property Descriptions:"
msgstr "Descrizione Proprietà:"
#: editor/editor_help.cpp
@@ -1597,11 +1596,13 @@ msgstr ""
"$color][url=$url]aggiungendone una[/url][/color]!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "Metodi"
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "Descrizione Metodo:"
#: editor/editor_help.cpp
-msgid "Method Description:"
+#, fuzzy
+msgid "Method Descriptions:"
msgstr "Descrizione Metodo:"
#: editor/editor_help.cpp
@@ -1612,12 +1613,61 @@ msgstr ""
"Al momento una descrizione per questo metodo non esiste. Aiutaci [color="
"$color][url=$url]aggiungendone una[/url][/color]!"
-#: editor/editor_inspector.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Cerca Aiuto"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Display All"
+msgstr "Mostra Normale"
+
+#: editor/editor_help_search.cpp
#, fuzzy
-msgid "Property: "
+msgid "Classes Only"
+msgstr "Classi"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Methods Only"
+msgstr "Metodi"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "Segnali"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Constants Only"
+msgstr "Costanti"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Properties Only"
+msgstr "Proprietà"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Theme Properties Only"
+msgstr "Proprietà"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Member Type"
+msgstr "Membri"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Class"
+msgstr "Classe:"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
msgstr "Proprietà:"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr "Set"
@@ -1651,6 +1701,11 @@ msgstr "Esportazione progetto fallita con codice di errore %d."
msgid "Error saving resource!"
msgstr "Errore salvando la Risorsa!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "OK"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "Salva Risorsa Come..."
@@ -1706,12 +1761,22 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
"Impossibile salvare la scena. Probabili dipendenze (instanze o eredità) non "
"sono state soddisfatte."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr "Impossibile caricare MeshLibrary per l'unione!"
@@ -1972,6 +2037,15 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "Impossibile caricare uno script aggiuntivo dal percorso: '%s'."
#: editor/editor_node.cpp
+#, fuzzy
+msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"Impossibile caricare uno script aggiuntivo dal percorso: Lo script '%s' non "
+"è in tool mode."
+
+#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -2023,6 +2097,12 @@ msgstr "Elimina Layout"
msgid "Default"
msgstr "Default"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+#, fuzzy
+msgid "Show in FileSystem"
+msgstr "Mostra nel File System"
+
#: editor/editor_node.cpp
#, fuzzy
msgid "Play This Scene"
@@ -2106,7 +2186,8 @@ msgid "Save Scene"
msgstr "Salva Scena"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+#, fuzzy
+msgid "Save All Scenes"
msgstr "Salva tutte le Scene"
#: editor/editor_node.cpp
@@ -2123,7 +2204,7 @@ msgstr "Converti In..."
#: editor/editor_node.cpp
msgid "MeshLibrary..."
-msgstr "MeshLibrary..."
+msgstr "Libreria delle Mesh..."
#: editor/editor_node.cpp
msgid "TileSet..."
@@ -2135,7 +2216,7 @@ msgid "Undo"
msgstr "Annulla"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Redo"
@@ -2159,7 +2240,7 @@ msgstr "Impostazioni Progetto"
msgid "Export"
msgstr "Esporta"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "Strumenti"
@@ -2173,12 +2254,13 @@ msgid "Quit to Project List"
msgstr "Esci alla Lista Progetti"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "Debug"
#: editor/editor_node.cpp
msgid "Deploy with Remote Debug"
-msgstr "Distribuisci con Debug Remoto"
+msgstr "Distribuzione con il Debug Remoto"
#: editor/editor_node.cpp
msgid ""
@@ -2190,7 +2272,7 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Small Deploy with Network FS"
-msgstr "Distribuzione Piccola con Network FS"
+msgstr "Piccola distribuzione con la rete FS"
#: editor/editor_node.cpp
msgid ""
@@ -2301,10 +2383,6 @@ msgstr "Gestisci Template d'Esportazione"
msgid "Help"
msgstr "Aiuto"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "Classi"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2399,24 +2477,24 @@ msgstr "Aggiorna Cambiamenti"
msgid "Disable Update Spinner"
msgstr "Disabilita lo Spinner di Update"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "Inspector"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "Importa"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "Nodo"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "FileSystem"
#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr "Inspector"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Nodo"
+
+#: editor/editor_node.cpp
#, fuzzy
msgid "Expand Bottom Panel"
msgstr "Espandi tutto"
@@ -2554,7 +2632,7 @@ msgstr "Frame %"
msgid "Physics Frame %"
msgstr "Frame della Fisica %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "Tempo:"
@@ -2578,7 +2656,7 @@ msgstr "Tempo"
msgid "Calls"
msgstr "Chiamate"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr "On"
@@ -2591,22 +2669,46 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr "Bit %d, val %d."
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
#, fuzzy
msgid "[Empty]"
msgstr "Aggiungi vuoto"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
#, fuzzy
-msgid "Assign.."
+msgid "Assign..."
msgstr "Assegna"
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "Percorso Invalido"
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr "Scegli una Vista"
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr "Nuovo Script"
@@ -2619,10 +2721,6 @@ msgstr ""
msgid "Make Unique"
msgstr "Crea Ossa"
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr "Mostra nel File System"
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2631,7 +2729,8 @@ msgstr "Mostra nel File System"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "Incolla"
@@ -2927,6 +3026,11 @@ msgstr ""
"tipi di file!"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "Preferiti:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
"Impossibile navigare a '%s' perché non è stato trovato nel file system!"
@@ -2967,19 +3071,15 @@ msgstr "Errore duplicazione:"
msgid "Unable to update dependencies:"
msgstr "Impossibile aggiornare le dipendenze:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "Nessun nome fornito"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "Nessun nome fornito."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "Il nome fornito contiene caratteri non validi"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "Nessun nome fornito."
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "Il nome contiene caratteri non validi."
@@ -3004,22 +3104,6 @@ msgid "Duplicating folder:"
msgstr "Duplicando cartella:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "Espandi tutto"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "Comprimi tutto"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "Rinomina..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "Sposta in..."
-
-#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
msgstr "Apri Scena/e"
@@ -3028,6 +3112,16 @@ msgid "Instance"
msgstr "Istanza"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Add to favorites"
+msgstr "Preferiti:"
+
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Remove from favorites"
+msgstr "Rimuovi da Gruppo"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "Modifica Dipendenze..."
@@ -3035,11 +3129,19 @@ msgstr "Modifica Dipendenze..."
msgid "View Owners..."
msgstr "Vedi Proprietari..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "Rinomina..."
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "Duplica..."
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr "Sposta in..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
msgstr "Nuovo Script"
@@ -3049,6 +3151,16 @@ msgstr "Nuovo Script"
msgid "New Resource..."
msgstr "Salva Risorsa Come..."
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Expand All"
+msgstr "Espandi tutto"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Collapse All"
+msgstr "Comprimi tutto"
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -3070,28 +3182,19 @@ msgstr "Re-Scan Filesystem"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "Abilita lo stato della cartella come Preferito"
+msgid "Toggle split mode"
+msgstr "Modalità Attivazione"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Show current scene file."
-msgstr "Salva la risorsa in modifica."
+msgid "Search files"
+msgstr "Cerca Classi"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr "Istanzia le scene selezionate come figlie del nodo selezionato."
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "Cerca Classi"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3099,7 +3202,7 @@ msgstr ""
"Scansione File,\n"
"Si prega di attendere..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "Sposta"
@@ -3118,32 +3221,23 @@ msgstr "Crea Script"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find in files"
+msgid "Find in Files"
msgstr "Trova tile"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find: "
+msgid "Find:"
msgstr "Trova"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Whole words"
-msgstr "Parole Intere"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "Controlla Maiuscole"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "Vai alla Linea"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Filter: "
-msgstr "Filtro:"
+msgid "Filters:"
+msgstr "Filtri"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3160,6 +3254,11 @@ msgstr "Annulla"
#: editor/find_in_files.cpp
#, fuzzy
+msgid "Find: "
+msgstr "Trova"
+
+#: editor/find_in_files.cpp
+#, fuzzy
msgid "Replace: "
msgstr "Rimpiazza"
@@ -3185,7 +3284,7 @@ msgstr "ERRORE: Il nome dell'animazione esiste già!"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr "Nome Invalido."
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3325,17 +3424,14 @@ msgstr "Reimporta"
msgid "Failed to load resource."
msgstr "Caricamento della risorsa fallito."
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "Ok"
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+#, fuzzy
+msgid "Expand All Properties"
msgstr "Espandi tutte le proprietà"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+#, fuzzy
+msgid "Collapse All Properties"
msgstr "Comprimi tutte le proprietà"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3381,6 +3477,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "Carica una risorsa esistente dal disco e modificala."
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "Salva la risorsa in modifica."
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "Vai all'ultimo oggetto modificato nella cronologia."
@@ -3447,14 +3547,14 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
msgstr "Crea Poly"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+#, fuzzy
+msgid "Edit Polygon"
msgstr "Modifica Poly"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3462,25 +3562,28 @@ msgid "Insert Point"
msgstr "Inserisci Punto"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+#, fuzzy
+msgid "Edit Polygon (Remove Point)"
msgstr "Modifica Poly (Rimuovi Punto)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+#, fuzzy
+msgid "Remove Polygon And Point"
msgstr "Rimuovi Poligono e Punto"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "Crea un nuovo poligono da zero"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr "Elimina Punti"
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#, fuzzy
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
"Modifica poligono esistente:\n"
"LMB: muovi punto.\n"
@@ -3488,8 +3591,10 @@ msgstr ""
"RMB: cancella punto."
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
-msgstr "Elimina Punti"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#, fuzzy
+msgid "Erase points."
+msgstr "RMB: Elimina Punto."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3504,7 +3609,7 @@ msgstr "Aggiungi Animazione"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
+msgid "Load..."
msgstr "Carica"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3533,15 +3638,9 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Elimina Punti"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "RMB: Elimina Punto."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3584,10 +3683,9 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr "Snap"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Blend:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3621,7 +3719,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
-msgid "Add Node.."
+msgid "Add Node..."
msgstr "Aggiungi Nodo"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3904,7 +4002,7 @@ msgstr "Connetti A Nodo:"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "Rimuovi traccia selezionata."
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3972,10 +4070,6 @@ msgid "Amount:"
msgstr "Quantità:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "Blend:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "Blend 0:"
@@ -4177,7 +4271,7 @@ msgstr "Tutti"
msgid "Plugins"
msgstr "Plugins"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "Ordina:"
@@ -4314,6 +4408,11 @@ msgstr "Modifica CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Scale CanvasItem"
+msgstr "Modifica CanvasItem"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Move CanvasItem"
msgstr "Modifica CanvasItem"
@@ -4334,21 +4433,19 @@ msgid "Paste Pose"
msgstr "Incolla Posa"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "Zoom Out"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "Zoom Reset"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Zoom In"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr "Modalità di Selezione"
@@ -4379,6 +4476,11 @@ msgid "Rotate Mode"
msgstr "Modalità Rotazione"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "Modalità Scala (R)"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4478,6 +4580,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr "Ripristina l'abilità dei figli dell'oggetto di essere selezionati."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "Scheletro..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "Mostra Ossa"
@@ -4530,6 +4637,10 @@ msgid "Show Viewport"
msgstr "Mostra Viewport"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr "Centra Selezione"
@@ -4601,8 +4712,17 @@ msgstr ""
"Premi & Trascina + Alt : Cambia tipo del nodo"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr "Crea Poly3D"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "Crea Poly"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Modifica Poly"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Modifica Poly (Rimuovi Punto)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
@@ -4709,38 +4829,9 @@ msgid "Item List Editor"
msgstr "Editor Lista Elementi"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-#, fuzzy
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"Nessuna risorsa OccluderPolygon2D su questo nodo.\n"
-"Crearne una ed assegnarla?"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr "Crea Poligono di occlusione"
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr "Crea un nuovo poligono dal nulla."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "Modifica poligono esistente:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "LMB: Sposta punto."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr "Ctrl+LMB: dividi Segmento."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "RMB: Elimina Punto."
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr "La mesh è vuota!"
@@ -4976,13 +5067,14 @@ msgid "Populate"
msgstr "Popola"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr "Crea Poligono di Navigazione"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr "Generando AABB"
+#, fuzzy
+msgid "Generating Visibility Rect"
+msgstr "Genera Rect Visibilità"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -5012,6 +5104,12 @@ msgstr "Cancella Maschera Emissione"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "Convert to CPUParticles"
+msgstr "Converti In Maiuscolo"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr "Particelle"
@@ -5081,13 +5179,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr "Un processor material di tipo 'ParticlesMaterial' é richiesto."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
-msgstr "Genera AABB"
+msgid "Generating AABB"
+msgstr "Generando AABB"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "Converti In Maiuscolo"
+msgid "Generate AABB"
+msgstr "Genera AABB"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5111,6 +5208,11 @@ msgid "Add Point to Curve"
msgstr "Aggiungi Punto a Curva"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "Chiudi curva"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr "Sposta Punto in curva"
@@ -5138,6 +5240,11 @@ msgid "Click: Add Point"
msgstr "Click: Aggiungi Punto"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Left Click: Split Segment (in curve)"
+msgstr "Spezza Segmento (in curva)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr "Click Destro: Elimina Punto"
@@ -5153,11 +5260,6 @@ msgstr "Aggiungi Punto (in sapzio vuoto)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr "Spezza Segmento (in curva)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "Elimina Punto"
@@ -5214,6 +5316,10 @@ msgstr "Rimuovi Punto Out-Control"
msgid "Remove In-Control Point"
msgstr "Rimuovi Punto In-Control"
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Spezza Segmento (in curva)"
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5226,10 +5332,19 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Sync bones"
+msgid "Sync Bones"
msgstr "Mostra Ossa"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+"Nessuna texture in questo nodo.\n"
+"Imposta una texture per poter modificare la regione."
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr "Crea UV Map"
@@ -5239,42 +5354,48 @@ msgid "Create Polygon & UV"
msgstr "Crea Poly"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "Crea nuova guida orizzontale"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "L'Azione '%s' esiste già!"
+msgid "Remove Internal Vertex"
+msgstr "Rimuovi Punto In-Control"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Add Split"
-msgstr "Aggiungi punto"
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "Percorso Invalido!"
+msgid "Add Custom Polygon"
+msgstr "Modifica Poly"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Rimuovi punto"
+msgid "Remove Custom Polygon"
+msgstr "Rimuovi Poligono e Punto"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr "Trasla UV Map"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
+#, fuzzy
+msgid "Transform Polygon"
+msgstr "Tipo Transform"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Open Polygon 2D UV editor."
+msgstr "Polygon 2D UV Editor"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
msgstr "Polygon 2D UV Editor"
@@ -5284,13 +5405,13 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "Modifica Poly"
+msgid "Points"
+msgstr "Sposta Punto"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Splits"
-msgstr "Dividi Percorso"
+msgid "Polygons"
+msgstr "Poligono->UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -5299,11 +5420,7 @@ msgstr "Crea Ossa"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
-msgstr "Crea Poly"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Move Points"
msgstr "Sposta Punto"
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5331,20 +5448,21 @@ msgid "Scale Polygon"
msgstr "Scala Poligono"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "Prima seleziona un oggetto di impostazione!"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5369,6 +5487,11 @@ msgid "Grid Settings"
msgstr "Impostazioni Snap"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "Snap"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr "Abilita Snap"
@@ -5432,22 +5555,22 @@ msgid "Paste Resource"
msgstr "Incolla Risorsa"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "Apri nell Editor"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr "Istanza:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr "Tipo:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Apri nell Editor"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr "Carica Risorsa"
@@ -5480,6 +5603,11 @@ msgstr "Errore spostamento file:\n"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
+msgid "Error: could not load file."
+msgstr "Impossibile caricare l'immagine"
+
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Error could not load file."
msgstr "Impossibile caricare l'immagine"
@@ -5489,19 +5617,23 @@ msgid "Error saving file!"
msgstr "Errore di salvataggio TileSet!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
+#, fuzzy
+msgid "Error while saving theme."
msgstr "Errore durante il salvataggio del tema"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+#, fuzzy
+msgid "Error Saving"
msgstr "Errore di salvataggio"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
+#, fuzzy
+msgid "Error importing theme."
msgstr "Errore di importazione tema"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+#, fuzzy
+msgid "Error Importing"
msgstr "Errore di importazione"
#: editor/plugins/script_editor_plugin.cpp
@@ -5524,6 +5656,14 @@ msgid "Import Theme"
msgstr "Importa Tema"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Errore durante il salvataggio del tema"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Errore di salvataggio"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr "Salva Tema Come..."
@@ -5566,8 +5706,8 @@ msgstr "File"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile"
-msgstr "Vedi Files"
+msgid "Open..."
+msgstr "Apri"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5583,11 +5723,7 @@ msgstr "Copia Percorso Script"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Show In File System"
-msgstr "Mostra nel File System"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+msgid "History Previous"
msgstr "Cronologia Succ."
#: editor/plugins/script_editor_plugin.cpp
@@ -5600,6 +5736,11 @@ msgid "Theme"
msgstr "Tema"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Import Theme..."
+msgstr "Importa Tema"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
msgstr "Ricarica Tema"
@@ -5608,10 +5749,6 @@ msgid "Save Theme"
msgstr "Salva Tema"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "Salva Tema Come"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "Chiudi Documentazione"
@@ -5658,7 +5795,8 @@ msgid "Keep Debugger Open"
msgstr "Mantieni Debugger Aperto"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+#, fuzzy
+msgid "Debug with External Editor"
msgstr "Debug con editor esterno"
#: editor/plugins/script_editor_plugin.cpp
@@ -5666,10 +5804,6 @@ msgid "Open Godot online documentation"
msgstr "Apri la documentazione online di Godot"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr "Cerca nella gerarchia delle classi."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Cerca Riferimenti nella documentazione."
@@ -5707,21 +5841,9 @@ msgstr "Debugger"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Search results"
+msgid "Search Results"
msgstr "Cerca Aiuto"
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "Cerca Classi"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-"Gli script built-in possono essere modificati solamente quando la scena a "
-"cui appartengono è caricata"
-
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
@@ -5733,6 +5855,15 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
+msgid "Go to Function"
+msgstr "Vai a Funzione..."
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
msgid "Only resources from filesystem can be dropped."
msgstr "Solo le risorse del filesystem possono essere liberate."
@@ -5765,10 +5896,6 @@ msgstr "Aggiungi maiuscola iniziale"
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5820,11 +5947,13 @@ msgid "Trim Trailing Whitespace"
msgstr "Taglia Spazi in Coda"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+#, fuzzy
+msgid "Convert Indent to Spaces"
msgstr "Converti Indentazione In Spazi"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+#, fuzzy
+msgid "Convert Indent to Tabs"
msgstr "Converti Indentazione In Tabulazioni"
#: editor/plugins/script_text_editor.cpp
@@ -5841,36 +5970,32 @@ msgid "Remove All Breakpoints"
msgstr "Rimuovi Tutti i Breakpoints"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
+#, fuzzy
+msgid "Go to Next Breakpoint"
msgstr "Vai a Breakpoint Successivo"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
+#, fuzzy
+msgid "Go to Previous Breakpoint"
msgstr "Vai a Breakpoint Precedente"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr "Converti In Maiuscolo"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr "Converti In Minuscolo"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr "Trova Precedente"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr "Filtra Files..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+#, fuzzy
+msgid "Go to Function..."
msgstr "Vai a Funzione..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+#, fuzzy
+msgid "Go to Line..."
msgstr "Vai a Linea..."
#: editor/plugins/script_text_editor.cpp
@@ -5968,6 +6093,14 @@ msgid "Animation Key Inserted."
msgstr "Key d'Animazione Inserito."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr "Pitch"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr "Oggetti Disegnati"
@@ -6134,6 +6267,11 @@ msgid "Freelook Speed Modifier"
msgstr "Modificatore Velocità Vista Libera"
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "Visualizza Informazioni"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "Finestra di XForm"
@@ -6236,11 +6374,6 @@ msgid "Tool Scale"
msgstr "Strumento Scala"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap To Floor"
-msgstr "Allinea alla griglia"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Abilita/Disabilita Vista libera"
@@ -6358,6 +6491,10 @@ msgstr "Pre"
msgid "Post"
msgstr "Post"
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
msgid "Sprite is empty!"
@@ -6478,11 +6615,18 @@ msgid "Set Region Rect"
msgstr "Imposta Region Rect"
#: editor/plugins/texture_region_editor_plugin.cpp
+#, fuzzy
+msgid "Set Margin"
+msgstr "Imposta Maniglia"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr "Modalità Snap:"
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+#, fuzzy
+msgid "None"
msgstr "<Nessuno>"
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6650,6 +6794,11 @@ msgid "Fix Invalid Tiles"
msgstr "Nome Invalido."
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "Centra Selezione"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr "Disegna TileMap"
@@ -6697,33 +6846,40 @@ msgstr "Preleva Tile"
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "Rimuovi Selezione"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr "Ruota a 0 gradi"
+#, fuzzy
+msgid "Rotate left"
+msgstr "Modalità Rotazione"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr "Ruota a 90 gradi"
+#, fuzzy
+msgid "Rotate right"
+msgstr "Sposta a Destra"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
-msgstr "Ruota a 180 gradi"
+msgid "Flip horizontally"
+msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
-msgstr "Ruota a 270 gradi"
+msgid "Flip vertically"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Clear transform"
+msgstr "Transform"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr "Aggiungi Nodo(i) Da Albero"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr "Rimuovi Punto Percorso"
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6735,33 +6891,60 @@ msgid "Merge from Scene"
msgstr "Unisci da Scena"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "Incolla Animazione"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "RMB: Elimina Punto."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "Crea un nuovo poligono dal nulla."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "Rimuovi Punto Percorso"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
-msgstr "Crea da scena?"
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
msgstr "Unisci da scena?"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Rimuovi Template"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6771,16 +6954,27 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "Eliminare i file selezionati?"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr ""
+msgstr "Salva la risorsa in modifica."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "Elimina Punti"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr "Salva la risorsa in modifica."
@@ -6799,11 +6993,101 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr "Salva la risorsa in modifica."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Set Tile Region"
+msgstr "Imposta Region Rect"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Crea Cartella"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "Modifica Filtri"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Modifica poligono esistente:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Modifica Poly"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Crea Poligono di Navigazione"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "Incolla Animazione"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Rimuovi Template"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "Rimuovi Poligono e Punto"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "Crea Poligono di occlusione"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "Crea Poligono di Navigazione"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "Modifica Filtri"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Crea Poligono di Navigazione"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Crea Poligono di occlusione"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "This property can't be changed."
msgstr "Questa operazione non può essere eseguita senza una scena."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
+#, fuzzy
+msgid "TileSet"
msgstr "TileSet"
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6844,6 +7128,16 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr "Le export templates per questa piattaforma sono mancanti:"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Release"
+msgstr "appena rilasciato"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Exporting All"
+msgstr "Esportando per %s"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr "Presets"
@@ -6852,6 +7146,11 @@ msgid "Add..."
msgstr "Aggiungi..."
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "Preset Esportazione:"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr "Risorse"
@@ -6912,10 +7211,49 @@ msgid "Feature List:"
msgstr "Lista Metodi:"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "Nuovo Script"
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "Modalità Esportazione Script:"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr "Testo"
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr "Compilato"
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "Criptato (Fornisci la Chiave Sotto)"
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "Chiave di Crittografia Script (256-bits come esadecimali):"
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr "Esporta PCK/Zip"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export mode?"
+msgstr "Modalità d'Esportazione:"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Export All"
+msgstr "Esporta"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr "Le export templates per questa piattaforma sono mancanti:"
@@ -7058,7 +7396,7 @@ msgstr "Progetto Senza Nome"
#: editor/project_manager.cpp
#, fuzzy
-msgid "Can't open project"
+msgid "Can't open project at '%s'."
msgstr "Impossibile connettersi."
#: editor/project_manager.cpp
@@ -7066,6 +7404,24 @@ msgid "Are you sure to open more than one project?"
msgstr "Sei sicuro di voler aprire più di un progetto?"
#: editor/project_manager.cpp
+msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
#, fuzzy
msgid ""
"Can't run project: no main scene defined.\n"
@@ -7291,7 +7647,7 @@ msgstr "Aggiungi Evento"
#: editor/project_settings_editor.cpp
msgid "Button"
-msgstr "Pulsante"
+msgstr ""
#: editor/project_settings_editor.cpp
msgid "Left Button."
@@ -7408,10 +7764,6 @@ msgstr "Impostazioni Progetto (project.godot)"
msgid "General"
msgstr "Informazioni Generali"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr "Proprietà:"
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr "Sovrascrivi Per..."
@@ -7549,10 +7901,6 @@ msgstr "Scegli un Nodo"
msgid "Bit %d, val %d."
msgstr "Bit %d, val %d."
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr "Proprietà:"
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr "Seleziona Proprietà"
@@ -7644,7 +7992,7 @@ msgid "Step"
msgstr "Step:"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7653,7 +8001,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7698,7 +8046,7 @@ msgstr "Maiuscolo"
msgid "Reset"
msgstr "Resetta Zoom"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr "Errore"
@@ -7759,6 +8107,10 @@ msgid "Instance Scene(s)"
msgstr "Istanzia Scena(e)"
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "Istanzia Scena Figlia"
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr "Svuota Script"
@@ -7795,6 +8147,12 @@ msgid "Save New Scene As..."
msgstr "Salva Nuova Scena Come..."
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr "Figlio Modificabile"
@@ -7873,6 +8231,11 @@ msgid "Clear Inheritance"
msgstr "Liberare ereditarietà"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Open documentation"
+msgstr "Apri la documentazione online di Godot"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr "Elimina Nodo(i)"
@@ -7881,15 +8244,16 @@ msgid "Add Child Node"
msgstr "Aggiungi Nodo Figlio"
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
-msgstr "Istanzia Scena Figlia"
-
-#: editor/scene_tree_dock.cpp
msgid "Change Type"
msgstr "Cambia Tipo"
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Extend Script"
+msgstr "Apri script"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Make Scene Root"
msgstr "Nuova Scena di Root"
@@ -8059,6 +8423,11 @@ msgid "Path is empty"
msgstr "Percorso vuoto"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Filename is empty"
+msgstr "Il percorso di salvataggio è vuoto!"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr "Percorso non locale"
@@ -8149,20 +8518,9 @@ msgid "Bytes:"
msgstr "Bytes:"
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr "Avvertimento"
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr "Errore:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr "Sorgente:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
-msgstr "Funzione:"
+#, fuzzy
+msgid "Stack Trace"
+msgstr "Impila Frame"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8194,18 +8552,6 @@ msgid "Stack Frames"
msgstr "Impila Frame"
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr "Valiabile"
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr "Errori:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr "Stack Trace (se applicabile):"
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr "Profiler"
@@ -8415,7 +8761,8 @@ msgid "GDNative"
msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+#, fuzzy
+msgid "Step argument is zero!"
msgstr "step argument è zero!"
#: modules/gdscript/gdscript_functions.cpp
@@ -8671,13 +9018,8 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr "Bake!"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-#, fuzzy
-msgid "Bake the navigation mesh."
-msgstr "Crea Mesh di Navigazione"
+msgid "Bake NavMesh"
+msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
#, fuzzy
@@ -8978,6 +9320,10 @@ msgid "Base Type:"
msgstr "Tipo Base:"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "Membri:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "Nodi Disponibili:"
@@ -9082,12 +9428,13 @@ msgid "Search VisualScript"
msgstr "Rimuovi Nodo Grafico di Shader"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
-msgstr "Get"
+msgid "Get %s"
+msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
-msgstr ""
+#, fuzzy
+msgid "Set %s"
+msgstr "Imposta parametri"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -9185,6 +9532,12 @@ msgstr ""
"Perché CollisionShape2D funzioni deve essere fornita una forma. Si prega di "
"creare una risorsa forma (shape)!"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -9238,6 +9591,12 @@ msgstr ""
"Un materiale per processare le particelle non é assegnato, pertanto nessun "
"comportamento é impresso."
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -9381,6 +9740,17 @@ msgstr ""
"Perché CollisionShape funzioni deve essere fornita una forma. Si prega di "
"creare una risorsa forma (shape)!"
+#: scene/3d/cpu_particles.cpp
+#, fuzzy
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr "Nulla é visibile perché le mesh non sono state assegnate ai draw pass."
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
#, fuzzy
msgid "Plotting Meshes"
@@ -9405,6 +9775,32 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr "Nulla é visibile perché le mesh non sono state assegnate ai draw pass."
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+"PathFollow2D funziona solamente quando impostato come figlio di un nodo "
+"Path2D."
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+"PathFollow2D funziona solamente quando impostato come figlio di un nodo "
+"Path2D."
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9445,7 +9841,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
#, fuzzy
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9511,6 +9907,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr "Animation tree invalido."
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
#, fuzzy
msgid "Raw Mode"
@@ -9528,11 +9928,6 @@ msgstr "Attenzione!"
msgid "Please Confirm..."
msgstr "Per Favore Conferma..."
-#: scene/gui/file_dialog.cpp
-#, fuzzy
-msgid "Select this Folder"
-msgstr "Seleziona Metodo"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9543,6 +9938,10 @@ msgstr ""
"popup() o qualsiasi altra funzione popup*(). Renderli visibili per la "
"modifica nell'editor è okay, ma verranno nascosti una volta in esecuzione."
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9599,11 +9998,6 @@ msgstr "Dimensione font Invalida."
msgid "Input"
msgstr "Aggiungi Input"
-#: scene/resources/visual_shader.cpp
-#, fuzzy
-msgid "None"
-msgstr "<Nessuno>"
-
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
@@ -9621,6 +10015,208 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Split already exists."
+#~ msgstr "L'Azione '%s' esiste già!"
+
+#, fuzzy
+#~ msgid "Add Split"
+#~ msgstr "Aggiungi punto"
+
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr "Percorso Invalido!"
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "Rimuovi punto"
+
+#, fuzzy
+#~ msgid "Poly"
+#~ msgstr "Modifica Poly"
+
+#, fuzzy
+#~ msgid "Splits"
+#~ msgstr "Dividi Percorso"
+
+#, fuzzy
+#~ msgid "Select a split to erase it."
+#~ msgstr "Prima seleziona un oggetto di impostazione!"
+
+#~ msgid "No name provided"
+#~ msgstr "Nessun nome fornito"
+
+#, fuzzy
+#~ msgid "Add Node.."
+#~ msgstr "Aggiungi Nodo"
+
+#~ msgid "Create from scene?"
+#~ msgstr "Crea da scena?"
+
+#~ msgid "Create Poly"
+#~ msgstr "Crea Poly"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "Crea un nuovo poligono da zero"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "Zoom Out"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "Zoom In"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "Crea Poly3D"
+
+#, fuzzy
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "Nessuna risorsa OccluderPolygon2D su questo nodo.\n"
+#~ "Crearne una ed assegnarla?"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "LMB: Sposta punto."
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "Ctrl+LMB: dividi Segmento."
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "RMB: Elimina Punto."
+
+#, fuzzy
+#~ msgid "New TextFile"
+#~ msgstr "Vedi Files"
+
+#~ msgid "Save Theme As"
+#~ msgstr "Salva Tema Come"
+
+#~ msgid "<None>"
+#~ msgstr "<Nessuno>"
+
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Zoom(%):"
+
+#~ msgid "Class List:"
+#~ msgstr "Lista Classi:"
+
+#~ msgid "Search Classes"
+#~ msgstr "Cerca Classi"
+
+#~ msgid "Public Methods"
+#~ msgstr "Metodi Pubblici"
+
+#~ msgid "Public Methods:"
+#~ msgstr "Metodi Pubblici:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "Elementi Tema GUI"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "Elementi Tema GUI:"
+
+#, fuzzy
+#~ msgid "Property: "
+#~ msgstr "Proprietà:"
+
+#, fuzzy
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "Abilita lo stato della cartella come Preferito"
+
+#, fuzzy
+#~ msgid "Show current scene file."
+#~ msgstr "Salva la risorsa in modifica."
+
+#, fuzzy
+#~ msgid "Whole words"
+#~ msgstr "Parole Intere"
+
+#, fuzzy
+#~ msgid "Match case"
+#~ msgstr "Controlla Maiuscole"
+
+#, fuzzy
+#~ msgid "Filter: "
+#~ msgstr "Filtro:"
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#, fuzzy
+#~ msgid "Show In File System"
+#~ msgstr "Mostra nel File System"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "Cerca nella gerarchia delle classi."
+
+#, fuzzy
+#~ msgid "Search in files"
+#~ msgstr "Cerca Classi"
+
+#~ msgid ""
+#~ "Built-in scripts can only be edited when the scene they belong to is "
+#~ "loaded"
+#~ msgstr ""
+#~ "Gli script built-in possono essere modificati solamente quando la scena a "
+#~ "cui appartengono è caricata"
+
+#~ msgid "Convert To Uppercase"
+#~ msgstr "Converti In Maiuscolo"
+
+#~ msgid "Convert To Lowercase"
+#~ msgstr "Converti In Minuscolo"
+
+#, fuzzy
+#~ msgid "Snap To Floor"
+#~ msgstr "Allinea alla griglia"
+
+#~ msgid "Rotate 0 degrees"
+#~ msgstr "Ruota a 0 gradi"
+
+#~ msgid "Rotate 90 degrees"
+#~ msgstr "Ruota a 90 gradi"
+
+#~ msgid "Rotate 180 degrees"
+#~ msgstr "Ruota a 180 gradi"
+
+#~ msgid "Rotate 270 degrees"
+#~ msgstr "Ruota a 270 gradi"
+
+#~ msgid "Warning"
+#~ msgstr "Avvertimento"
+
+#~ msgid "Error:"
+#~ msgstr "Errore:"
+
+#~ msgid "Source:"
+#~ msgstr "Sorgente:"
+
+#~ msgid "Function:"
+#~ msgstr "Funzione:"
+
+#~ msgid "Variable"
+#~ msgstr "Valiabile"
+
+#~ msgid "Errors:"
+#~ msgstr "Errori:"
+
+#~ msgid "Stack Trace (if applicable):"
+#~ msgstr "Stack Trace (se applicabile):"
+
+#~ msgid "Bake!"
+#~ msgstr "Bake!"
+
+#, fuzzy
+#~ msgid "Bake the navigation mesh."
+#~ msgstr "Crea Mesh di Navigazione"
+
+#~ msgid "Get"
+#~ msgstr "Get"
+
#~ msgid "Change Scalar Constant"
#~ msgstr "Cambia Costante Scalare"
@@ -9825,9 +10421,6 @@ msgstr ""
#~ msgid "Run Script"
#~ msgstr "Esegui Script"
-#~ msgid "Save the currently edited resource."
-#~ msgstr "Salva la risorsa in modifica."
-
#~ msgid "Stop Profiling"
#~ msgstr "Interrrompi Profiling"
@@ -10039,10 +10632,6 @@ msgstr ""
#~ msgid "Clear Emitter"
#~ msgstr "Cancella Emitter"
-#, fuzzy
-#~ msgid "Fold Line"
-#~ msgstr "Vai alla Linea"
-
#~ msgid " "
#~ msgstr " "
@@ -10131,9 +10720,6 @@ msgstr ""
#~ msgid "Could not save atlas subtexture:"
#~ msgstr "Impossibile salvare la substruttura dell'atlas:"
-#~ msgid "Exporting for %s"
-#~ msgstr "Esportando per %s"
-
#~ msgid "Setting Up..."
#~ msgstr "Impostando..."
@@ -10243,9 +10829,6 @@ msgstr ""
#~ msgid "Source Font:"
#~ msgstr "Font Sorgente:"
-#~ msgid "Source Font Size:"
-#~ msgstr "Dimensione Font sorgente:"
-
#~ msgid "Dest Resource:"
#~ msgstr "Risorsa di destin. :"
@@ -10322,9 +10905,6 @@ msgstr ""
#~ msgid "Start(s)"
#~ msgstr "Inizio(i)"
-#~ msgid "Filters"
-#~ msgstr "Filtri"
-
#~ msgid "Source path is empty."
#~ msgstr "Il percorso sorgente è vuoto."
@@ -10598,15 +11178,9 @@ msgstr ""
#~ msgid "Stereo"
#~ msgstr "Stereo"
-#~ msgid "Pitch"
-#~ msgstr "Pitch"
-
#~ msgid "Window"
#~ msgstr "Finestra"
-#~ msgid "Move Right"
-#~ msgstr "Sposta a Destra"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "Scalando a %s%%."
@@ -10672,9 +11246,6 @@ msgstr ""
#~ msgid "just pressed"
#~ msgstr "appena premuto"
-#~ msgid "just released"
-#~ msgstr "appena rilasciato"
-
#~ msgid ""
#~ "Couldn't read the certificate file. Are the path and password both "
#~ "correct?"
@@ -10993,21 +11564,6 @@ msgstr ""
#~ msgid "Trailing Silence:"
#~ msgstr "Silenzio di coda:"
-#~ msgid "Script Export Mode:"
-#~ msgstr "Modalità Esportazione Script:"
-
-#~ msgid "Text"
-#~ msgstr "Testo"
-
-#~ msgid "Compiled"
-#~ msgstr "Compilato"
-
-#~ msgid "Encrypted (Provide Key Below)"
-#~ msgstr "Criptato (Fornisci la Chiave Sotto)"
-
-#~ msgid "Script Encryption Key (256-bits as hex):"
-#~ msgstr "Chiave di Crittografia Script (256-bits come esadecimali):"
-
#~ msgid "Export Project PCK"
#~ msgstr "Esporta Progetto PCK"
@@ -11017,9 +11573,6 @@ msgstr ""
#~ msgid "Project Export"
#~ msgstr "Esportazione Progetto"
-#~ msgid "Export Preset:"
-#~ msgstr "Preset Esportazione:"
-
#~ msgid "BakedLightInstance does not contain a BakedLight resource."
#~ msgstr "BakedLightInstance non contiene una risorsa BakedLight."
@@ -11104,13 +11657,6 @@ msgstr ""
#~ msgid "Scale Region Editor"
#~ msgstr "Scala Editor Regioni"
-#~ msgid ""
-#~ "No texture in this node.\n"
-#~ "Set a texture to be able to edit region."
-#~ msgstr ""
-#~ "Nessuna texture in questo nodo.\n"
-#~ "Imposta una texture per poter modificare la regione."
-
#~ msgid "Inherit Scene"
#~ msgstr "Eredita Scena"
@@ -11123,9 +11669,6 @@ msgstr ""
#~ msgid "Reload Tool Script (Soft)"
#~ msgstr "Ricarica Tool Script (Soft)"
-#~ msgid "Set Params"
-#~ msgstr "Imposta parametri"
-
#~ msgid "Live Editing"
#~ msgstr "Editing Live"
diff --git a/editor/translations/ja.po b/editor/translations/ja.po
index 0f87aaeec5..0d6f6677ba 100644
--- a/editor/translations/ja.po
+++ b/editor/translations/ja.po
@@ -1,8 +1,8 @@
# Japanese translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
-# akirakido <achts.y@gmail.com>, 2016-2017.
+# akirakido <achts.y@gmail.com>, 2016-2017, 2018.
# D_first <dntk.daisei@gmail.com>, 2017, 2018.
# Daisuke Saito <d.saito@coriginate.com>, 2017, 2018.
# h416 <shinichiro.hirama@gmail.com>, 2017.
@@ -16,209 +16,189 @@
# yu tang <0011solo@gmail.com>, 2018.
# zukkun <zukkun@gmail.com>, 2018.
# sugusan <sugusan.development@gmail.com>, 2018.
+# Nathan Lovato <nathan.lovato.art@gmail.com>, 2018.
+# nyanode <akaruooyagi@yahoo.co.jp>, 2018.
+# nitenook <admin@alterbaum.net>, 2018.
+# Rob Matych <robertsmatych@gmail.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-08-16 08:38+0000\n"
-"Last-Translator: sugusan <sugusan.development@gmail.com>\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-25 05:08+0000\n"
+"Last-Translator: Rob Matych <robertsmatych@gmail.com>\n"
"Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/"
"godot/ja/>\n"
"Language: ja\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 3.2-dev\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
-#, fuzzy
msgid "Invalid type argument to convert(), use TYPE_* constants."
-msgstr "Convert()ã«å¯¾ã—ã¦ç„¡åйãªåž‹ã®å¼•æ•°ã§ã™ã€‚TYPE_* 定数を使ã£ã¦ãã ã•ã„。"
+msgstr "convert() ã®å¼•æ•°ã®åž‹ãŒç„¡åйã§ã™ã€‚TYPE_* 定数を使ã£ã¦ãã ã•ã„。"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
-#, fuzzy
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr "デコードãƒã‚¤ãƒˆã®ãƒã‚¤ãƒˆã¯å分ã§ã¯ã‚りã¾ã›ã‚“。ã¾ãŸã¯ç„¡åйãªå½¢å¼ã§ã™ã€‚"
+msgstr "デコードã™ã‚‹ã«ã¯ãƒã‚¤ãƒˆãŒè¶³ã‚Šãªã„ã‹ã€ã¾ãŸã¯ç„¡åйãªå½¢å¼ã§ã™ã€‚"
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "入力ã•れãŸå¼ %i ã¯ç„¡åйã§ã™"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "インスタンス㌠null ã®ãŸã‚ã€self ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "ノード%sã®ä¸æ­£ãªã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®ãƒ—ロパティå'%s' ."
+msgstr "æ¼”ç®—å­ %s, %s, %s ã«å¯¾ã™ã‚‹å€¤ãŒç„¡åйã§ã™ã€‚"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid index of type %s for base type %s"
-msgstr "ノード%sã®ä¸æ­£ãªã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®ãƒ—ロパティå'%s' ."
+msgstr "基本型 %s ã®åž‹ %s ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ãŒç„¡åйã§ã™"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "インデックス '%s' (%s型)ã¯ç„¡åйãªåå‰ã§ã™"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid arguments to construct '%s'"
-msgstr ":䏿­£ãªå¼•æ•°ã§ã™.引数ã®åž‹=: "
+msgstr "'%s' ã®å¼•æ•°ã¯ç„¡åйã§ã™"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "'%s' ã¸ã®å‘¼ã³å‡ºã—:"
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Free"
msgstr "解放"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "ãƒãƒ©ãƒ³ã‚¹"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Mirror"
-msgstr "エラー"
+msgstr "ミラー"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "キーフレームを挿入"
+msgstr "ã“ã“ã«ã‚­ãƒ¼ã‚’挿入"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "é¸æŠžç¯„å›²ã‚’è¤‡è£½"
+msgstr "é¸æŠžä¸­ã®ã‚­ãƒ¼ã‚’複製"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "é¸æŠžç¯„å›²ã‚’æ¶ˆåŽ»"
+msgstr "é¸æŠžä¸­ã®ã‚­ãƒ¼ã‚’削除"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
-msgstr "アニメーションã®ã‚­ãƒ¼ãƒ•レームを複製"
+msgstr "アニメーションã®ã‚­ãƒ¼ã‚’複製"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Delete Keys"
-msgstr "アニメーションã®ã‚­ãƒ¼ãƒ•レームを削除"
+msgstr "アニメーションã®ã‚­ãƒ¼ã‚’削除"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Change Keyframe Time"
-msgstr "Anim 値を変更"
+msgstr "ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚­ãƒ¼ãƒ•ãƒ¬ãƒ¼ãƒ ã®æ™‚間を変更"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transition"
-msgstr "アニメーション 変化ã¨ãã®ç§»ã‚Šå¤‰ã‚り(トランジション)"
+msgstr "アニメーションã®ãƒˆãƒ©ãƒ³ã‚¸ã‚·ãƒ§ãƒ³ã‚’変更"
#: editor/animation_track_editor.cpp
msgid "Anim Change Transform"
-msgstr "アニメーションã®ãƒˆãƒ©ãƒ³ã‚¹ãƒ•ォーム(変形)"
+msgstr "アニメーションã®ãƒˆãƒ©ãƒ³ã‚¹ãƒ•ォームを変更"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Change Keyframe Value"
-msgstr "Anim 値を変更"
+msgstr "アニメーションキーフレームã®å€¤ã‚’変更"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Change Call"
-msgstr "Anim コールã®å¤‰æ›´(Call)"
+msgstr "アニメーション呼出ã—ã®å¤‰æ›´"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Property Track"
-msgstr "プロパティ:"
+msgstr "プロパティトラック"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "3D Transform Track"
-msgstr "トランスフォーム"
+msgstr "3Dトランスフォームトラック"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "メソッド呼出ã—トラック"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "ベジェ曲線トラック"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "オーディオå†ç”Ÿãƒˆãƒ©ãƒƒã‚¯"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Playback Track"
-msgstr "アニメーションå†ç”Ÿã‚’中止(S)"
+msgstr "アニメーションå†ç”Ÿãƒˆãƒ©ãƒƒã‚¯"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
-msgstr "Anim トラックを追加"
+msgstr "トラックを追加"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Length Time (seconds)"
-msgstr "アニメーションã®é•·ã• (å˜ä½ã¯ç§’)。"
+msgstr "アニメーションã®é•·ã• (ç§’)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "アニメーション 拡大。"
+msgstr "アニメーションループ"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Functions:"
-msgstr "関数を作æˆ"
+msgstr "関数:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Audio Clips:"
-msgstr "オーディオリスナー"
+msgstr "オーディオクリップ:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Clips:"
-msgstr "クリップ"
+msgstr "アニメーションクリップ:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Toggle this track on/off."
-msgstr "最低é™ãƒ¢ãƒ¼ãƒ‰"
+msgstr "ã“ã®ãƒˆãƒ©ãƒƒã‚¯ã® オン/オフ を切り替ãˆã€‚"
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "Update モード(ã“ã®ãƒ—ロパティã®è¨­å®šæ–¹æ³•)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Interpolation Mode"
-msgstr "アニメーションã®ãƒŽãƒ¼ãƒ‰"
+msgstr "補間モード"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "ループラップモード(ループã®å…ˆé ­ã§è£œé–“を終了ã™ã‚‹ï¼‰"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "é¸æŠžã—ãŸãƒˆãƒ©ãƒƒã‚¯ã‚’削除ã—ã¾ã™ã€‚"
+msgstr "ã“ã®ãƒˆãƒ©ãƒƒã‚¯ã‚’除去ã™ã‚‹ã€‚"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "クロスフェード時間(秒)"
+msgstr "時間 (秒): "
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -233,64 +213,59 @@ msgid "Trigger"
msgstr "トリガー"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Capture"
-msgstr "テクスãƒãƒ£"
+msgstr "キャプãƒãƒ£"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "è¿‘å‚"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
msgid "Linear"
-msgstr "等速"
+msgstr "リニア"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr ""
+msgstr "キュービック"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
-msgstr ""
+msgstr "ループインタプリタを抑ãˆè¾¼ã¿ï¼ˆclamp)"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "ループインタプリタをラップ(wrap)"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Insert Key"
-msgstr "キーフレームを挿入"
+msgstr "キーを挿入"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "ノードを複製"
+msgstr "キーを複製"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "ノードを消去"
+msgstr "キーを削除"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
-msgstr "Anim トラックを削除"
+msgstr "アニメーショントラックを除去"
#: editor/animation_track_editor.cpp
msgid "Create NEW track for %s and insert key?"
-msgstr "%s ã®æ–°ã—ã„トラックを作æˆã—ã€ã‚­ãƒ¼ã‚’挿入ã—ã¾ã™ã‹ï¼Ÿ"
+msgstr "%s ã®æ–°è¦ãƒˆãƒ©ãƒƒã‚¯ã‚’作æˆã—ã€ã‚­ãƒ¼ã‚’挿入ã—ã¾ã™ã‹ï¼Ÿ"
#: editor/animation_track_editor.cpp
msgid "Create %d NEW tracks and insert keys?"
-msgstr "æ–°ã—ã„ %d トラックを作æˆã—ã€ã‚­ãƒ¼ã‚’挿入ã—ã¾ã™ã‹ï¼Ÿ"
+msgstr "%d æ–°è¦ãƒˆãƒ©ãƒƒã‚¯ã‚’作æˆã—ã€ã‚­ãƒ¼ã‚’挿入ã—ã¾ã™ã‹ï¼Ÿ"
#: editor/animation_track_editor.cpp editor/create_dialog.cpp
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -298,27 +273,29 @@ msgstr "作æˆ"
#: editor/animation_track_editor.cpp
msgid "Anim Insert"
-msgstr "Anim 挿入"
+msgstr "アニメーション挿入"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
msgstr ""
+"アニメーションプレイヤーã¯ä»–ã®ãƒ—レイヤーã ã‘をアニメーション化ã™ã‚‹ã“ã¨ã¯ã§ã"
+"ã¾ã›ã‚“。"
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
-msgstr "Anim ã®ä½œæˆãƒ»æŒ¿å…¥"
+msgstr "アニメーションã®ä½œæˆã¨æŒ¿å…¥"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Track & Key"
-msgstr "Anim トラック ・ キーを挿入"
+msgstr "アニメーショントラック ã¨ã‚­ãƒ¼ã‚’挿入"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Key"
-msgstr "Anim キーを挿入"
+msgstr "アニメーションキーを挿入"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr ""
+msgstr "トランスフォームトラックã¯ç©ºé–“ベースã®ãƒŽãƒ¼ãƒ‰ã«ã®ã¿é©ç”¨ã•れã¾ã™ã€‚"
#: editor/animation_track_editor.cpp
msgid ""
@@ -327,72 +304,75 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªãƒˆãƒ©ãƒƒã‚¯ã¯æ¬¡ã®ã‚¿ã‚¤ãƒ—ã®ãƒŽãƒ¼ãƒ‰ã®ã¿æŒ‡å®šã§ãã¾ã™:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
msgstr ""
+"アニメーショントラックã¯ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãƒ—レイヤーノードã®ã¿æŒ‡å®šã§ãã¾ã™ã€‚"
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
msgstr ""
+"アニメーションプレーヤーã¯ä»–ã®ãƒ—レーヤーã ã‘ã«ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’é©ç”¨ã™ã‚‹ã“ã¨ã¯"
+"ã§ãã¾ã›ã‚“。"
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "root ãŒç„¡ã‘ã‚Œã°æ–°è¦ãƒˆãƒ©ãƒƒã‚¯ã¯è¿½åŠ ã§ãã¾ã›ã‚“"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "トラックã®ãƒ‘スãŒç„¡åйãªãŸã‚ã€ã‚­ãƒ¼ã‚’追加ã§ãã¾ã›ã‚“。"
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "トラック㌠spatial åž‹ã§ã¯ãªã„ãŸã‚ã€ã‚­ãƒ¼ã‚’挿入ã§ãã¾ã›ã‚“"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
-msgstr ""
+msgstr "トラックã®ãƒ‘スãŒç„¡åйãªãŸã‚ã€ãƒ¡ã‚½ãƒƒãƒ‰ã‚­ãƒ¼ã‚’追加ã§ãã¾ã›ã‚“。"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Method not found in object: "
-msgstr "変数ã®get(VariableGet)ãŒã‚¹ã‚¯ãƒªãƒ—トã«ç„¡ã„: "
+msgstr "オブジェクトã«ãƒ¡ã‚½ãƒƒãƒ‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
-msgstr "Anim キーã®ç§»å‹•"
+msgstr "アニメーションキーã®ç§»å‹•"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clipboard is empty"
-msgstr "リソースã®ã‚¯ãƒªãƒƒãƒ—ボードã¯ç©ºã§ã™!"
+msgstr "クリップボードãŒç©ºã§ã™"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Scale Keys"
-msgstr "Anim 拡大縮å°ã‚­ãƒ¼"
+msgstr "ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚­ãƒ¼ã®æ‹¡ç¸®"
#: editor/animation_track_editor.cpp
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
-msgstr ""
+msgstr "ã“ã®ã‚ªãƒ—ションã¯å˜ä¸€ãƒˆãƒ©ãƒƒã‚¯ã§ã®ãƒ™ã‚¸ã‚§ç·¨é›†ã§ã¯æ©Ÿèƒ½ã—ã¾ã›ã‚“。"
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "ツリーã§é¸æŠžã—ãŸãƒŽãƒ¼ãƒ‰ã®ãƒˆãƒ©ãƒƒã‚¯ã®ã¿ã‚’表示ã—ã¾ã™ã€‚"
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
msgstr ""
+"ノードã”ã¨ã«ãƒˆãƒ©ãƒƒã‚¯ã‚’グループ化ã™ã‚‹ã‹ã€ãƒ—レーンãªãƒªã‚¹ãƒˆã¨ã—ã¦è¡¨ç¤ºã—ã¾ã™ã€‚"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap (s): "
-msgstr "スナップ機能(ピクセルå˜ä½ï¼‰:"
+msgstr "スナップ (秒): "
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "アニメーションツリーã¯å•題ã‚りã¾ã›ã‚“."
+msgstr "アニメーションステップã®å€¤ã€‚"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -404,32 +384,26 @@ msgid "Edit"
msgstr "編集"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "アニメーション"
+msgstr "アニメーションプロパティ。"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "パラメーターをコピーã™ã‚‹"
+msgstr "トラックをコピー"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "パラメーターを張り付ã‘ã‚‹"
+msgstr "トラックを貼り付ã‘"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Scale Selection"
-msgstr "縮尺(Scale)ã®é¸æŠž"
+msgstr "スケールã®é¸æŠž"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Scale From Cursor"
-msgstr "カーソル起点ã§ç¸®å°º(Scale)変更"
+msgstr "カーソル基準ã§ã‚¹ã‚±ãƒ¼ãƒ«"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "é¸æŠžç¯„å›²ã‚’è¤‡è£½"
@@ -438,16 +412,15 @@ msgid "Duplicate Transposed"
msgstr "複製を転置"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
-msgstr "é¸æŠžç¯„å›²ã‚’æ¶ˆåŽ»"
+msgstr "é¸æŠžç¯„å›²ã‚’å‰Šé™¤"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+msgid "Go to Next Step"
msgstr "次ã®ã‚¹ãƒ†ãƒƒãƒ—ã¸"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+msgid "Go to Previous Step"
msgstr "å‰ã®ã‚¹ãƒ†ãƒƒãƒ—ã¸"
#: editor/animation_track_editor.cpp
@@ -460,11 +433,11 @@ msgstr "アニメーションをクリーンアップ"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "アニメーション化ã•れるノードをé¸ã¶:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "ベジェ曲線を使用"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
@@ -488,11 +461,11 @@ msgstr "最é©åŒ–"
#: editor/animation_track_editor.cpp
msgid "Remove invalid keys"
-msgstr "無効ãªã‚­ãƒ¼ã‚’削除"
+msgstr "無効ãªã‚­ãƒ¼ã‚’除去"
#: editor/animation_track_editor.cpp
msgid "Remove unresolved and empty tracks"
-msgstr "未解決や空ã®ãƒˆãƒ©ãƒƒã‚¯ã‚’削除"
+msgstr "未解決・空ã®ãƒˆãƒ©ãƒƒã‚¯ã‚’除去"
#: editor/animation_track_editor.cpp
msgid "Clean-up all animations"
@@ -500,7 +473,7 @@ msgstr "ã™ã¹ã¦ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’クリーンアップ"
#: editor/animation_track_editor.cpp
msgid "Clean-Up Animation(s) (NO UNDO!)"
-msgstr "クリーン アップ アニメーション(å…ƒã«æˆ»ã›ã¾ã›ã‚“!)"
+msgstr "アニメーションをクリーンアップ(アンドゥä¸å¯ï¼ï¼‰"
#: editor/animation_track_editor.cpp
msgid "Clean-Up"
@@ -508,11 +481,11 @@ msgstr "クリーンアップ"
#: editor/animation_track_editor.cpp
msgid "Scale Ratio:"
-msgstr "æ‹¡å¤§ç¸®å°æ¯”:"
+msgstr "スケール比:"
#: editor/animation_track_editor.cpp
msgid "Select tracks to copy:"
-msgstr ""
+msgstr "コピーã™ã‚‹ãƒˆãƒ©ãƒƒã‚¯ã‚’é¸æŠž:"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -528,7 +501,7 @@ msgstr "é…列ã®ã‚µã‚¤ã‚ºã‚’変更"
#: editor/array_property_edit.cpp
msgid "Change Array Value Type"
-msgstr "é…列ã®å€¤ã®ç¨®é¡žã®å¤‰æ›´"
+msgstr "é…列値ã®åž‹ã‚’変更"
#: editor/array_property_edit.cpp
msgid "Change Array Value"
@@ -550,11 +523,11 @@ msgstr "一致ãªã—"
msgid "Replaced %d occurrence(s)."
msgstr "%d 箇所を置æ›ã—ã¾ã—ãŸã€‚"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "å¤§æ–‡å­—å°æ–‡å­—を区別ã™ã‚‹"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "å˜èªžå…¨ä½“"
@@ -570,101 +543,92 @@ msgstr "ã™ã¹ã¦ç½®æ›"
msgid "Selection Only"
msgstr "é¸æŠžç¯„å›²ã®ã¿"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "ズームイン"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "ズームアウト"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "ズームをリセット"
#: editor/code_editor.cpp
-#, fuzzy
msgid "Warnings:"
-msgstr "警告"
+msgstr "警告:"
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "ズーム (%):"
+msgid "Font Size:"
+msgstr "フォントサイズ:"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
-msgstr "ライン:"
+msgstr "行:"
#: editor/code_editor.cpp
-#, fuzzy
msgid "Col:"
-msgstr "縦:"
+msgstr "列:"
#: editor/connections_dialog.cpp
msgid "Method in target Node must be specified!"
-msgstr "対象ã¨ãªã‚‹ãƒŽãƒ¼ãƒ‰ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™!"
+msgstr "対象ノードã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid ""
"Target method not found! Specify a valid method or attach a script to target "
"Node."
msgstr ""
-"対象メソッドãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ メソッドを指定ã™ã‚‹ã‹å¯¾è±¡ãƒŽãƒ¼ãƒ‰ã«ã‚¹ã‚¯ãƒªãƒ—トを付"
-"加ã—ã¦ãã ã•ã„"
+"対象メソッドãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ï¼æœ‰åйãªãƒ¡ã‚½ãƒƒãƒ‰ã‚’指定ã™ã‚‹ã‹ã€å¯¾è±¡ãƒŽãƒ¼ãƒ‰ã«ã‚¹ã‚¯ãƒª"
+"プトを添付ã—ã¦ãã ã•ã„。"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect To Node:"
-msgstr "ãƒŽãƒ¼ãƒ‰ã«æŽ¥ç¶šã—ã¾ã™:"
+msgstr "ãƒŽãƒ¼ãƒ‰ã«æŽ¥ç¶š:"
#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#, fuzzy
msgid "Add"
msgstr "追加"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
-msgstr "削除"
+msgstr "除去"
#: editor/connections_dialog.cpp
msgid "Add Extra Call Argument:"
-msgstr "呼ã³å‡ºã—引数を追加ã—ã¾ã™ã€‚"
+msgstr "呼出ã—引数を追加:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Extra Call Arguments:"
-msgstr "追加呼ã³å‡ºã—引数:"
+msgstr "追加ã®å‘¼å‡ºã—引数:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Path to Node:"
msgstr "ノードã¸ã®ãƒ‘ス:"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Make Function"
msgstr "関数を作æˆ"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Deferred"
msgstr "é…å»¶"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Oneshot"
-msgstr "一括"
+msgstr "å˜ç™º"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/export_template_manager.cpp editor/groups_editor.cpp
@@ -681,152 +645,126 @@ msgid "Close"
msgstr "é–‰ã˜ã‚‹"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect"
msgstr "接続"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect '%s' to '%s'"
msgstr "'%s' ã‚’ '%s' ã«æŽ¥ç¶š"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect '%s' from '%s'"
-msgstr "'%s' ã‚’ '%s' ã«æŽ¥ç¶š"
+msgstr "'%s' ã‚’ '%s' ã‹ã‚‰åˆ‡æ–­"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect all from signal: '%s'"
-msgstr "'%s' ã‚’ '%s' ã«æŽ¥ç¶š"
+msgstr "シグナル '%s' ã‹ã‚‰å…¨ã¦ã‚’切断"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect..."
msgstr "接続..."
#: editor/connections_dialog.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "Disconnect"
msgstr "切断"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect Signal: "
-msgstr "シグナルを接続:"
+msgstr "ã‚·ã‚°ãƒŠãƒ«ã®æŽ¥ç¶š: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection: "
-msgstr "コãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’編集"
+msgstr "接続を編集 "
#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "Are you sure you want to remove all connections from the \""
-msgstr "複数ã®ãƒ—ロジェクトを本当ã«å®Ÿè¡Œã—ã¾ã™ã‹ï¼Ÿ"
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr "シグナル %s ã‹ã‚‰å…¨ã¦ã®æŽ¥ç¶šã‚’除去ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
-#, fuzzy
msgid "Signals"
msgstr "シグナル"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr ""
+msgstr "ã“ã®ã‚·ã‚°ãƒŠãƒ«ã‹ã‚‰å…¨ã¦ã®æŽ¥ç¶šã‚’除去ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "切断"
+msgstr "å…¨ã¦åˆ‡æ–­"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit..."
-msgstr "編集"
+msgstr "編集..."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "メソッド一覧:"
+msgstr "メソッドã¸è¡Œã"
#: editor/create_dialog.cpp
-#, fuzzy
msgid "Change %s Type"
-msgstr "型(type)を変更"
+msgstr "%s 型を変更"
#: editor/create_dialog.cpp editor/project_settings_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Change"
msgstr "変更"
#: editor/create_dialog.cpp
-#, fuzzy
msgid "Create New %s"
msgstr "%s ã‚’æ–°è¦ä½œæˆ"
#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Favorites:"
msgstr "ãŠæ°—ã«å…¥ã‚Š:"
#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
msgid "Recent:"
-msgstr "最近ã®:"
+msgstr "最近:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "検索:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Matches:"
msgstr "一致:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Description:"
-msgstr "記述:"
+msgstr "説明:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Search Replacement For:"
msgstr "検索ã—ã¦ç½®æ›:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Dependencies For:"
-msgstr "~ã¨ä¾å­˜é–¢ä¿‚ã«ã‚ã‚‹:"
+msgstr "次ã®ä¾å­˜é–¢ä¿‚:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid ""
"Scene '%s' is currently being edited.\n"
"Changes will not take effect unless reloaded."
msgstr ""
"シーン '%s' ã¯ç¾åœ¨ç·¨é›†ä¸­ã§ã™ã€‚\n"
-"å†èª­ã¿è¾¼ã¿ã—ãªã„é™ã‚Šã€å¤‰æ›´ã¯å映ã•れã¾ã›ã‚“。"
+"å†èª­è¾¼ã¿ã—ãªã„é™ã‚Šã€å¤‰æ›´ã¯å映ã•れã¾ã›ã‚“。"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid ""
"Resource '%s' is in use.\n"
"Changes will take effect when reloaded."
msgstr ""
-"リソース '%s' ã¯ä½¿ç”¨ä¸­ã§ã™\n"
-"変更ã¯å†èª­è¾¼æ™‚ã«é©ç”¨ã•れã¾ã™"
+"リソース '%s' ã¯ä½¿ç”¨ä¸­ã§ã™ã€‚\n"
+"変更ã¯å†èª­è¾¼ã¿æ™‚ã«é©ç”¨ã•れã¾ã™ã€‚"
#: editor/dependency_editor.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -834,13 +772,11 @@ msgid "Dependencies"
msgstr "ä¾å­˜é–¢ä¿‚"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Resource"
msgstr "リソース"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "パス"
@@ -849,7 +785,6 @@ msgid "Dependencies:"
msgstr "ä¾å­˜é–¢ä¿‚:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Fix Broken"
msgstr "修復"
@@ -858,58 +793,51 @@ msgid "Dependency Editor"
msgstr "ä¾å­˜é–¢ä¿‚エディタ"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Search Replacement Resource:"
-msgstr "ç½®æ›ã™ã‚‹ãƒªã‚½ãƒ¼ã‚¹ã‚’探ã™:"
+msgstr "ç½®æ›ã™ã‚‹ãƒªã‚½ãƒ¼ã‚¹ã‚’検索:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
msgstr "é–‹ã"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Owners Of:"
-msgstr "~ã®ã‚ªãƒ¼ãƒŠãƒ¼:"
+msgstr "次ã®ã‚ªãƒ¼ãƒŠãƒ¼:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Remove selected files from the project? (no undo)"
-msgstr "é¸æŠžã—ãŸãƒ•ァイルをプロジェクトã‹ã‚‰å–り除ã(å–り消ã—ã§ãã¾ã›ã‚“)"
+msgstr "é¸æŠžã—ãŸãƒ•ァイルをプロジェクトã‹ã‚‰é™¤åŽ»ã—ã¾ã™ã‹ï¼Ÿï¼ˆã‚¢ãƒ³ãƒ‰ã‚¥ä¸å¯ï¼‰"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid ""
"The files being removed are required by other resources in order for them to "
"work.\n"
"Remove them anyway? (no undo)"
msgstr ""
-"å–り除ã“ã†ã¨ã—ã¦ã„るファイルã¯ä»–ã®ãƒªã‚½ãƒ¼ã‚¹ã®å‹•作ã«å¿…è¦ã§ã™. 本当ã«å–り除ãã¾"
-"ã™ã‹ï¼Ÿï¼ˆundoã§ãã¾ã›ã‚“)"
+"除去ã—よã†ã¨ã—ã¦ã„るファイルã¯ä»–ã®ãƒªã‚½ãƒ¼ã‚¹ã®å‹•作ã«å¿…è¦ã§ã™ã€‚\n"
+"無視ã—ã¦é™¤åŽ»ã—ã¾ã™ã‹ï¼Ÿï¼ˆã‚¢ãƒ³ãƒ‰ã‚¥ä¸å¯ï¼‰"
#: editor/dependency_editor.cpp editor/export_template_manager.cpp
-#, fuzzy
msgid "Cannot remove:"
-msgstr "解決ã§ãã¾ã›ã‚“."
+msgstr "除去ä¸å¯:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Error loading:"
-msgstr "読ã¿è¾¼ã¿å¤±æ•—:"
+msgstr "読込ã¿ã‚¨ãƒ©ãƒ¼:"
#: editor/dependency_editor.cpp
-#, fuzzy
-msgid "Scene failed to load due to missing dependencies:"
-msgstr "ä¾å­˜é–¢ä¿‚ãŒç¢ºèªã§ããšã€ã‚·ãƒ¼ãƒ³ã‚’読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ:"
+msgid "Load failed due to missing dependencies:"
+msgstr "ä¾å­˜é–¢ä¿‚ãŒè¦‹ã¤ã‹ã‚‰ãªã„ãŸã‚ã€ã‚·ãƒ¼ãƒ³ã‚’読込ã‚ã¾ã›ã‚“:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
-#, fuzzy
msgid "Open Anyway"
-msgstr "ã¨ã‚‚ã‹ãé–‹ã"
+msgstr "ã¨ã«ã‹ãé–‹ã"
#: editor/dependency_editor.cpp
msgid "Which action should be taken?"
@@ -920,107 +848,82 @@ msgid "Fix Dependencies"
msgstr "ä¾å­˜é–¢ä¿‚ã®ä¿®å¾©"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Errors loading!"
-msgstr "読ã¿è¾¼ã¿å¤±æ•—!"
+msgstr "読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼ï¼"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Permanently delete %d item(s)? (No undo!)"
-msgstr "永久ã«%d を削除(undoä¸å¯ï¼‰"
+msgstr "%d 個ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’完全ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿï¼ˆã‚¢ãƒ³ãƒ‰ã‚¥ä¸å¯ï¼‰"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Owns"
-msgstr "ä¿æŒã™ã‚‹"
+msgstr "所有"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Resources Without Explicit Ownership:"
-msgstr "ã‚ªãƒ¼ãƒŠãƒ¼ãŒæ˜Žç¤ºã•れã¦ã„ãªã„リソース"
+msgstr "æ‰€æœ‰æ¨©ãŒæ˜Žç¤ºã•れã¦ã„ãªã„リソース:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
-#, fuzzy
msgid "Orphan Resource Explorer"
-msgstr "無オーナーリソース用エクスプローラー"
+msgstr "孤立リソース用エクスプローラー"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Delete selected files?"
-msgstr "é¸æŠžã—ãŸãƒ•ァイルを消去ã—ã¾ã™ã‹?"
+msgstr "é¸æŠžã—ãŸãƒ•ァイルを削除ã—ã¾ã™ã‹ï¼Ÿ"
#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
#: editor/filesystem_dock.cpp editor/plugins/item_list_editor_plugin.cpp
#: editor/project_export.cpp editor/project_settings_editor.cpp
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete"
-msgstr "消去"
+msgstr "削除"
#: editor/dictionary_property_edit.cpp
-#, fuzzy
msgid "Change Dictionary Key"
-msgstr "ディクショナリ キーã®å¤‰æ›´"
+msgstr "Dictionary キーã®å¤‰æ›´"
#: editor/dictionary_property_edit.cpp
-#, fuzzy
msgid "Change Dictionary Value"
-msgstr "ディクショナリ 値ã®å¤‰æ›´"
+msgstr "Dictionary 値ã®å¤‰æ›´"
#: editor/editor_about.cpp
msgid "Thanks from the Godot community!"
-msgstr "Godotコミュニティより感è¬ã‚’!"
-
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "OK"
+msgstr "Godot コミュニティより感è¬ã‚’ï¼"
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
-msgstr "Godotエンジンã«è²¢çŒ®ã—ãŸäººã€…"
+msgstr "Godot エンジンã«è²¢çŒ®ã—ãŸäººã€…"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Project Founders"
-msgstr "プロジェクト創業者"
+msgstr "プロジェクト創始者"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Lead Developer"
-msgstr "開発者"
+msgstr "開発主任"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Project Manager "
-msgstr "プロジェクトマãƒãƒ¼ã‚¸ãƒ£ãƒ¼"
+msgstr "プロジェクトマãƒãƒ¼ã‚¸ãƒ£ãƒ¼ "
#: editor/editor_about.cpp
-#, fuzzy
msgid "Developers"
msgstr "開発者"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Authors"
-msgstr "作者:"
+msgstr "作者"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Platinum Sponsors"
msgstr "プラãƒãƒŠã‚¹ãƒãƒ³ã‚µãƒ¼"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Gold Sponsors"
msgstr "ゴールドスãƒãƒ³ã‚µãƒ¼"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Mini Sponsors"
msgstr "ミニスãƒãƒ³ã‚µãƒ¼"
@@ -1038,16 +941,15 @@ msgstr "ブロンズドナー"
#: editor/editor_about.cpp
msgid "Donors"
-msgstr "寄付・å”賛者"
+msgstr "ドナー"
#: editor/editor_about.cpp
msgid "License"
msgstr "ライセンス"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Thirdparty License"
-msgstr "サードパーティライセンス"
+msgstr "サードパーティ ライセンス"
#: editor/editor_about.cpp
msgid ""
@@ -1057,44 +959,41 @@ msgid ""
"respective copyright statements and license terms."
msgstr ""
"Godot Engineã¯ã€MITライセンスã¨äº’æ›æ€§ã®ã‚ã‚‹ã€å¤šæ•°ã®ã‚µãƒ¼ãƒ‰ãƒ‘ーティ製ã®ãƒ•リーãŠ"
-"よã³ã‚ªãƒ¼ãƒ—ンソースã®ãƒ©ã‚¤ãƒ–ラリã«ä¾å­˜ã—ã¦ã„ã¾ã™ã€‚ 以下ã¯ã€ã‚µãƒ¼ãƒ‰ãƒ‘ーティ製コン"
-"ãƒãƒ¼ãƒãƒ³ãƒˆã®è‘—作権ãŠã‚ˆã³ãƒ©ã‚¤ã‚»ãƒ³ã‚¹æ¡é …ã®å®Œå…¨ãªãƒªã‚¹ãƒˆã§ã™ã€‚"
+"よã³ã‚ªãƒ¼ãƒ—ンソースライブラリã«ä¾å­˜ã—ã¦ã„ã¾ã™ã€‚ 以下ã¯ã€ã‚µãƒ¼ãƒ‰ãƒ‘ーティ製コン"
+"ãƒãƒ¼ãƒãƒ³ãƒˆã®å„著作権ãŠã‚ˆã³ãƒ©ã‚¤ã‚»ãƒ³ã‚¹æ¡é …ã®ç·è¦§ã§ã™ã€‚"
#: editor/editor_about.cpp
msgid "All Components"
-msgstr "ã™ã¹ã¦ã®ã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆ(æ§‹æˆéƒ¨åˆ†)"
+msgstr "全コンãƒãƒ¼ãƒãƒ³ãƒˆ"
#: editor/editor_about.cpp
msgid "Components"
-msgstr "コンãƒãƒ¼ãƒãƒ³ãƒˆ(æ§‹æˆéƒ¨åˆ†)"
+msgstr "コンãƒãƒ¼ãƒãƒ³ãƒˆ"
#: editor/editor_about.cpp
-#, fuzzy
msgid "Licenses"
msgstr "ライセンス"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "Error opening package file, not in zip format."
-msgstr "パッケージファイルを開ã‘ã¾ã›ã‚“ã§ã—ãŸã€‚ zip å½¢å¼ã§ã¯ã‚りã¾ã›ã‚“。"
+msgstr "パッケージファイルを開ã‘ã¾ã›ã‚“ã§ã—ãŸã€‚zip å½¢å¼ã§ã¯ã‚りã¾ã›ã‚“。"
#: editor/editor_asset_installer.cpp
-#, fuzzy
msgid "Uncompressing Assets"
-msgstr "éžåœ§ç¸®"
+msgstr "アセットを展開"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
-msgstr "パッケージインストールæˆåŠŸ!"
+#, fuzzy
+msgid "Package installed successfully!"
+msgstr "パッケージã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«æˆåŠŸã—ã¾ã—ãŸï¼"
#: editor/editor_asset_installer.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Success!"
msgstr "æˆåŠŸï¼"
#: editor/editor_asset_installer.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Install"
msgstr "インストール"
@@ -1120,19 +1019,19 @@ msgstr "オーディオãƒã‚¹ã®ãƒœãƒªãƒ¥ãƒ¼ãƒ ã‚’変更"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Solo"
-msgstr "オーディオãƒã‚¹ã‚’ソロã«åˆ‡ã‚Šæ›¿ãˆ"
+msgstr "オーディオãƒã‚¹ã®ã‚½ãƒ­ã‚’切り替ãˆ"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Mute"
-msgstr "オーディオãƒã‚¹ã‚’ミュート(無音)ã«åˆ‡ã‚Šæ›¿ãˆ"
+msgstr "オーディオãƒã‚¹ã®ãƒŸãƒ¥ãƒ¼ãƒˆã‚’切り替ãˆ"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Bypass Effects"
-msgstr "オーディオãƒã‚¹ã®ãƒã‚¤ãƒ‘スエフェクトã®åˆ‡ã‚Šæ›¿ãˆ"
+msgstr "オーディオãƒã‚¹ã®ãƒã‚¤ãƒ‘スエフェクトを切り替ãˆ"
#: editor/editor_audio_buses.cpp
msgid "Select Audio Bus Send"
-msgstr "オーディオãƒã‚¹ã®å‡ºåŠ›å…ˆã®é¸æŠž"
+msgstr "オーディオãƒã‚¹ã®å‡ºåŠ›å…ˆã‚’é¸æŠž"
#: editor/editor_audio_buses.cpp
msgid "Add Audio Bus Effect"
@@ -1144,19 +1043,19 @@ msgstr "ãƒã‚¹ã‚¨ãƒ•ェクトを移動"
#: editor/editor_audio_buses.cpp
msgid "Delete Bus Effect"
-msgstr "ãƒã‚¹ã‚¨ãƒ•ェクトを消去"
+msgstr "ãƒã‚¹ã‚¨ãƒ•ェクトを削除"
#: editor/editor_audio_buses.cpp
msgid "Audio Bus, Drag and Drop to rearrange."
-msgstr "オーディオãƒã‚¹ã‚’ドラッグ・アンド・ドロップã§(å†)整列."
+msgstr "オーディオãƒã‚¹ã¯ãƒ‰ãƒ©ãƒƒã‚°ãƒ»ã‚¢ãƒ³ãƒ‰ãƒ»ãƒ‰ãƒ­ãƒƒãƒ—ã§ä¸¦ã¹æ›¿ãˆã‚‰ã‚Œã¾ã™ã€‚"
#: editor/editor_audio_buses.cpp
msgid "Solo"
-msgstr "ソロ(独立)"
+msgstr "ソロ"
#: editor/editor_audio_buses.cpp
msgid "Mute"
-msgstr "ミュート(無音)"
+msgstr "ミュート"
#: editor/editor_audio_buses.cpp
msgid "Bypass"
@@ -1164,11 +1063,10 @@ msgstr "ãƒã‚¤ãƒ‘ス"
#: editor/editor_audio_buses.cpp
msgid "Bus options"
-msgstr "ãƒã‚¹ã‚ªãƒ—ション"
+msgstr "ãƒã‚¹ オプション"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "複製"
@@ -1177,9 +1075,8 @@ msgid "Reset Volume"
msgstr "音é‡ã‚’リセット"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Delete Effect"
-msgstr "エフェクトを消去"
+msgstr "エフェクトを削除"
#: editor/editor_audio_buses.cpp
msgid "Audio"
@@ -1191,11 +1088,11 @@ msgstr "オーディオãƒã‚¹ã‚’追加"
#: editor/editor_audio_buses.cpp
msgid "Master bus can't be deleted!"
-msgstr "マスターãƒã‚¹ã¯å‰Šé™¤ã§ãã¾ã›ã‚“!"
+msgstr "マスター ãƒã‚¹ã¯å‰Šé™¤ã§ãã¾ã›ã‚“!"
#: editor/editor_audio_buses.cpp
msgid "Delete Audio Bus"
-msgstr "オーディオãƒã‚¹ã®æ¶ˆåŽ»"
+msgstr "オーディオãƒã‚¹ã®å‰Šé™¤"
#: editor/editor_audio_buses.cpp
msgid "Duplicate Audio Bus"
@@ -1210,162 +1107,138 @@ msgid "Move Audio Bus"
msgstr "オーディオãƒã‚¹ã‚’移動"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Save Audio Bus Layout As..."
-msgstr "オーディオãƒã‚¹ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’別åã§ä¿å­˜"
+msgstr "オーディオãƒã‚¹ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’別åã§ä¿å­˜..."
#: editor/editor_audio_buses.cpp
msgid "Location for New Layout..."
-msgstr "æ–°ã—ã„レイアウトã®å ´æ‰€..."
+msgstr "æ–°è¦ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã®å ´æ‰€..."
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Open Audio Bus Layout"
msgstr "オーディオãƒã‚¹ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’é–‹ã"
#: editor/editor_audio_buses.cpp
msgid "There is no 'res://default_bus_layout.tres' file."
-msgstr ""
-"リソースディレクトリã«ã€Œres://default_bus_layout.tresã€ãƒ•ァイルãŒã‚りã¾ã›ã‚“!"
+msgstr "'res://default_bus_layout.tres' ファイルãŒã‚りã¾ã›ã‚“。"
#: editor/editor_audio_buses.cpp
msgid "Invalid file, not an audio bus layout."
-msgstr "䏿­£ãªãƒ•ァイルã§ã™.オーディオãƒã‚¹ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã§ã¯ã‚りã¾ã›ã‚“."
+msgstr "無効ãªãƒ•ァイルã§ã™ã€‚オーディオãƒã‚¹ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã§ã¯ã‚りã¾ã›ã‚“。"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Add Bus"
-msgstr "ãƒã‚¹ã‚’追加ã™ã‚‹"
+msgstr "ãƒã‚¹ã‚’追加"
#: editor/editor_audio_buses.cpp
msgid "Create a new Bus Layout."
-msgstr "æ–°ã—ã„ãƒã‚¹ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’生æˆ."
+msgstr "æ–°è¦ãƒã‚¹ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’作æˆã€‚"
#: editor/editor_audio_buses.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Load"
-msgstr "読ã¿è¾¼ã‚€"
+msgstr "読込ã¿"
#: editor/editor_audio_buses.cpp
msgid "Load an existing Bus Layout."
-msgstr "既存ã®ãƒã‚¹ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’読ã¿è¾¼ã‚€."
+msgstr "既存ã®ãƒã‚¹ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’読込む。"
#: editor/editor_audio_buses.cpp
msgid "Save As"
-msgstr "åå‰ã‚’付ã‘ã¦ä¿å­˜ã™ã‚‹"
+msgstr "åå‰ã‚’付ã‘ã¦ä¿å­˜"
#: editor/editor_audio_buses.cpp
-#, fuzzy
msgid "Save this Bus Layout to a file."
-msgstr "オーディオãƒã‚¹ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’別åã§ä¿å­˜"
+msgstr "ã“ã®ãƒã‚¹ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’ファイルã«ä¿å­˜ã€‚"
#: editor/editor_audio_buses.cpp editor/import_dock.cpp
-#, fuzzy
msgid "Load Default"
-msgstr "標準(既定)"
+msgstr "デフォルトを読込む"
#: editor/editor_audio_buses.cpp
msgid "Load the default Bus Layout."
-msgstr "デフォルトã®ãƒã‚¹ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’ロードã—ã¾ã™ã€‚"
+msgstr "デフォルトã®ãƒã‚¹ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’読込ã¿ã¾ã™ã€‚"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Invalid name."
-msgstr "無効ãªåå‰ã§ã™."
+msgstr "無効ãªåå‰ã§ã™ã€‚"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Valid characters:"
-msgstr "使用å¯èƒ½ãªæ–‡å­—:"
+msgstr "æœ‰åŠ¹ãªæ–‡å­—:"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Invalid name. Must not collide with an existing engine class name."
-msgstr "無効ãªåå‰ã§ã™. 既存ã®ã‚¨ãƒ³ã‚¸ãƒ³ã‚¯ãƒ©ã‚¹ã®åå‰ã¨è¡çªã—ã¦ã¯ã„ã‘ã¾ã›ã‚“."
+msgstr "無効ãªåå‰ã§ã™ã€‚既存ã®ã‚¨ãƒ³ã‚¸ãƒ³ã‚¯ãƒ©ã‚¹åã¨é‡è¤‡ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“。"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Invalid name. Must not collide with an existing buit-in type name."
-msgstr "無効ãªåå‰ã§ã™. 既存ã®çµ„ã¿è¾¼ã¿åž‹ã®åå‰ã¨è¡çªã—ã¦ã¯ã„ã‘ã¾ã›ã‚“."
+msgstr "無効ãªåå‰ã§ã™ã€‚既存ã®çµ„è¾¼ã¿åž‹åã¨é‡è¤‡ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“。"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Invalid name. Must not collide with an existing global constant name."
-msgstr "無効ãªåå‰ã§ã™. 既存ã®ã‚°ãƒ­ãƒ¼ãƒãƒ«å®šæ•°ã®åå‰ã¨è¡çªã—ã¦ã¯ã„ã‘ã¾ã›ã‚“."
+msgstr "無効ãªåå‰ã§ã™ã€‚既存ã®ã‚°ãƒ­ãƒ¼ãƒãƒ«å®šæ•°åã¨é‡è¤‡ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“。"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Autoload '%s' already exists!"
-msgstr "既存ã®'%s' を自動読ã¿è¾¼ã¿ã—ã¾ã™!"
+msgstr "自動読込㿠'%s' ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™ï¼"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Rename Autoload"
-msgstr "自動読ã¿è¾¼ã¿ã‚’åå‰å¤‰æ›´"
+msgstr "自動読込ã¿ã®åå‰å¤‰æ›´"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Toggle AutoLoad Globals"
-msgstr "自動読ã¿è¾¼ã¿ã™ã‚‹ã‚°ãƒ­ãƒ¼ãƒãƒ«ã‚’切替"
+msgstr "グローãƒãƒ«ã®è‡ªå‹•読込ã¿ã‚’切り替ãˆ"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Move Autoload"
-msgstr "自動読ã¿è¾¼ã¿ã‚’移動ã™ã‚‹"
+msgstr "自動読込ã¿ã‚’移動"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Remove Autoload"
-msgstr "自動読ã¿è¾¼ã¿ã‚’å–り除ã"
+msgstr "自動読込ã¿ã‚’除去"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Enable"
-msgstr "有効ã«ã™ã‚‹"
+msgstr "有効"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Rearrange Autoloads"
-msgstr "自動読ã¿è¾¼ã¿ã‚’çµ„ã¿æ›¿ãˆã‚‹"
+msgstr "自動読込ã¿ã®ä¸¦ã¹æ›¿ãˆ"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Invalid Path."
-msgstr "無効ãªãƒ‘スã§ã™."
+msgstr "無効ãªãƒ‘スã§ã™ã€‚"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "File does not exist."
-msgstr "ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“."
+msgstr "ファイルãŒå­˜åœ¨ã—ã¾ã›ã‚“。"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Not in resource path."
-msgstr "リソースã®ãƒ‘スã§ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+msgstr "リソースパスã«ã‚りã¾ã›ã‚“。"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
-msgstr "自動読ã¿è¾¼ã¿ã‚’付加"
+msgstr "自動読込ã¿ã‚’追加"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "パス:"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Node Name:"
-msgstr "ノードã®åå‰:"
+msgstr "ノードå:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "åå‰"
#: editor/editor_autoload_settings.cpp
-#, fuzzy
msgid "Singleton"
msgstr "シングルトン"
@@ -1374,32 +1247,28 @@ msgid "Updating Scene"
msgstr "シーンを更新"
#: editor/editor_data.cpp
-#, fuzzy
msgid "Storing local changes..."
-msgstr "ローカル環境ã®å¤‰æ›´ã‚’ä¿å­˜ã™ã‚‹..."
+msgstr "ローカルã®å¤‰æ›´ã‚’ä¿å­˜..."
#: editor/editor_data.cpp
msgid "Updating scene..."
-msgstr "シーンを更新ã—ã¦ã„ã¾ã™..."
+msgstr "シーンを更新..."
#: editor/editor_data.cpp editor/editor_properties.cpp
-#, fuzzy
msgid "[empty]"
-msgstr "(空)"
+msgstr "[空]"
#: editor/editor_data.cpp
msgid "[unsaved]"
-msgstr "(未ä¿å­˜)"
+msgstr "[未ä¿å­˜]"
#: editor/editor_dir_dialog.cpp
-#, fuzzy
msgid "Please select a base directory first"
-msgstr "ã¯ã˜ã‚ã«ã€ãƒ™ãƒ¼ã‚¹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„。"
+msgstr "ã¯ã˜ã‚ã«ãƒ™ãƒ¼ã‚¹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„"
#: editor/editor_dir_dialog.cpp
-#, fuzzy
msgid "Choose a Directory"
-msgstr "ディレクトリをé¸ã¶"
+msgstr "ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é¸æŠž"
#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
@@ -1419,64 +1288,61 @@ msgid "Could not create folder."
msgstr "フォルダを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
#: editor/editor_dir_dialog.cpp
-#, fuzzy
msgid "Choose"
msgstr "é¸ã¶"
#: editor/editor_export.cpp
-#, fuzzy
msgid "Storing File:"
-msgstr "ファイルをä¿å­˜ã™ã‚‹:"
+msgstr "ファイルã®ä¿å­˜:"
#: editor/editor_export.cpp
-#, fuzzy
msgid "Packing"
-msgstr "パッキングã™ã‚‹"
+msgstr "パックã™ã‚‹"
#: editor/editor_export.cpp platform/javascript/export/export.cpp
-#, fuzzy
msgid "Template file not found:"
-msgstr "テンプレートファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“:\n"
+msgstr "テンプレートファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“:"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "ç¾åœ¨ã®ãƒ•ã‚©ãƒ«ãƒ€ãƒ¼ã‚’é¸æŠž"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "ãƒ•ã‚¡ã‚¤ãƒ«ãŒæ—¢ã«å­˜åœ¨ã—ã¾ã™ã€‚上書ãã—ã¾ã™ã‹ï¼Ÿ"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "ç¾åœ¨ã®ãƒ•ã‚©ãƒ«ãƒ€ãƒ¼ã‚’é¸æŠž"
+msgid "Select This Folder"
+msgstr "ã“ã®ãƒ•ã‚©ãƒ«ãƒ€ãƒ¼ã‚’é¸æŠž"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
-msgstr "パスをコピーã™ã‚‹"
+msgstr "パスをコピー"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Open In File Manager"
-msgstr "ファイルマãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã§è¡¨ç¤º"
+msgid "Open in File Manager"
+msgstr "ファイルマãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã§é–‹ã"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+msgid "Show in File Manager"
msgstr "ファイルマãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã§è¡¨ç¤º"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
-msgstr "フォルダを作æˆã™ã‚‹..."
+msgstr "æ–°è¦ãƒ•ォルダ..."
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Refresh"
msgstr "å†èª­è¾¼"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "All Recognized"
-msgstr "知られã¦ã„ã‚‹ã™ã¹ã¦ã®"
+msgstr "æ‰¿èªæ¸ˆã¿ã™ã¹ã¦"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "All Files (*)"
-msgstr "ã™ã¹ã¦ã®ãƒ•ァイル(*)"
+msgstr "ã™ã¹ã¦ã®ãƒ•ァイル (*)"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a File"
@@ -1495,7 +1361,8 @@ msgid "Open a File or Directory"
msgstr "ファイルã¾ãŸã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é–‹ã"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "ä¿å­˜"
@@ -1505,67 +1372,55 @@ msgid "Save a File"
msgstr "ファイルをä¿å­˜"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go Back"
msgstr "戻る"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go Forward"
msgstr "進む"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Go Up"
-msgstr "上ã«å‘ã‹ã†"
+msgstr "上ã¸"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Toggle Hidden Files"
-msgstr "éš ã—ファイルを切り替ãˆã‚‹"
+msgstr "éš ã—ファイルã®åˆ‡ã‚Šæ›¿ãˆ"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Toggle Favorite"
-msgstr "ãŠæ°—ã«å…¥ã‚Šã‚’切り替ãˆã‚‹"
+msgstr "ãŠæ°—ã«å…¥ã‚Šã®åˆ‡ã‚Šæ›¿ãˆ"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Toggle Mode"
-msgstr "モードを切り替ãˆã‚‹"
+msgstr "モード切替ãˆ"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Focus Path"
-msgstr "フォーカスã¸ã®ãƒ‘ス"
+msgstr "フォーカスパス"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Move Favorite Up"
-msgstr "ãŠæ°—ã«å…¥ã‚Šã‚’上ã’ã‚‹"
+msgstr "ãŠæ°—ã«å…¥ã‚Šã‚’上ã¸"
#: editor/editor_file_dialog.cpp
-#, fuzzy
msgid "Move Favorite Down"
-msgstr "ãŠæ°—ã«å…¥ã‚Šã‚’下ã’ã‚‹"
+msgstr "ãŠæ°—ã«å…¥ã‚Šã‚’下ã¸"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Go to parent folder"
-msgstr "フォルダを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
+msgstr "親フォルダã¸"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Directories & Files:"
-msgstr "ディレクトリã¾ãŸã¯ãƒ•ァイル:"
+msgstr "ディレクトリã¨ãƒ•ァイル:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
-#, fuzzy
msgid "Preview:"
msgstr "プレビュー:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "ファイル:"
@@ -1574,84 +1429,58 @@ msgid "Must use a valid extension."
msgstr "æœ‰åŠ¹ãªæ‹¡å¼µå­ã‚’使用ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚"
#: editor/editor_file_system.cpp
-#, fuzzy
msgid "ScanSources"
-msgstr "ソース走査"
+msgstr "スキャンソース"
#: editor/editor_file_system.cpp
msgid "(Re)Importing Assets"
-msgstr "アセットを(å†ï¼‰ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
-
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "ヘルプを検索"
-
-#: editor/editor_help.cpp
-#, fuzzy
-msgid "Class List:"
-msgstr "クラスã®ãƒªã‚¹ãƒˆ:"
-
-#: editor/editor_help.cpp
-#, fuzzy
-msgid "Search Classes"
-msgstr "ã‚¯ãƒ©ã‚¹ã®æ¤œç´¢"
+msgstr "アセットを(å†)インãƒãƒ¼ãƒˆä¸­"
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
-msgstr "上é¢"
+msgstr "トップ"
-#: editor/editor_help.cpp editor/property_editor.cpp
-#, fuzzy
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "クラス:"
#: editor/editor_help.cpp editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Inherits:"
-msgstr "継承:"
+msgstr "継承元:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Inherited by:"
-msgstr "~ã«ç¶™æ‰¿ã•れる:"
+msgstr "継承先:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Brief Description:"
msgstr "è¦ç´„:"
#: editor/editor_help.cpp
-#, fuzzy
-msgid "Members"
-msgstr "メンãƒãƒ¼:"
+msgid "Properties"
+msgstr "プロパティ"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Members:"
-msgstr "メンãƒãƒ¼:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr "プロパティ:"
#: editor/editor_help.cpp
-#, fuzzy
-msgid "Public Methods"
-msgstr "公開メソッド:"
+msgid "Methods"
+msgstr "メソッド"
#: editor/editor_help.cpp
-#, fuzzy
-msgid "Public Methods:"
-msgstr "公開メソッド:"
+msgid "Methods:"
+msgstr "メソッド:"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "GUIテーマã®éƒ¨å“"
+msgid "Theme Properties"
+msgstr "テーマプロパティ"
#: editor/editor_help.cpp
-#, fuzzy
-msgid "GUI Theme Items:"
-msgstr "GUIテーマã®éƒ¨å“:"
+msgid "Theme Properties:"
+msgstr "テーマプロパティ:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Signals:"
msgstr "シグナル:"
@@ -1668,88 +1497,123 @@ msgid "enum "
msgstr "列挙型 "
#: editor/editor_help.cpp
-#, fuzzy
msgid "Constants"
-msgstr "定数:"
+msgstr "定数"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Constants:"
msgstr "定数:"
#: editor/editor_help.cpp
-#, fuzzy
-msgid "Description"
-msgstr "記述:"
+msgid "Class Description"
+msgstr "クラスã®èª¬æ˜Ž"
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
+msgstr "クラスã®èª¬æ˜Žï¼š"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Online Tutorials:"
-msgstr "オンライン文書"
+msgstr "オンラインãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«:"
#: editor/editor_help.cpp
-#, fuzzy
msgid ""
"There are currently no tutorials for this class, you can [color=$color][url="
"$url]contribute one[/url][/color] or [color=$color][url=$url2]request one[/"
"url][/color]."
msgstr ""
-"ç¾åœ¨ã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã®èª¬æ˜Žã¯ã‚りã¾ã›ã‚“。[color=$color][url=$url]貢献[/url][/"
-"color]ã—ã¦ç§ãŸã¡ã‚’助ã‘ã¦ãã ã•ã„!"
+"ç¾åœ¨ã€ã“ã®ã‚¯ãƒ©ã‚¹ã®ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã¯ã‚りã¾ã›ã‚“ãŒã€[color=$color][url=$url]寄付"
+"[/url][/color]ã€ã¾ãŸã¯[color=$color][url=$url2]リクエスト[/url][/color]ã¯å¯èƒ½"
+"ã§ã™ã€‚"
#: editor/editor_help.cpp
-#, fuzzy
-msgid "Properties"
-msgstr "プロパティ:"
+msgid "Property Descriptions"
+msgstr "プロパティã®èª¬æ˜Ž"
#: editor/editor_help.cpp
-#, fuzzy
-msgid "Property Description:"
-msgstr "プロパティã«ã¤ã„ã¦ã®è¨˜è¼‰:"
+msgid "Property Descriptions:"
+msgstr "プロパティã®èª¬æ˜Ž:"
#: editor/editor_help.cpp
msgid ""
"There is currently no description for this property. Please help us by "
"[color=$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-"ç¾åœ¨ã€ã“ã®ãƒ—ロパティã®èª¬æ˜Žã¯ã‚りã¾ã›ã‚“。[color=$color][url=$url]貢献[/url][/"
-"color]ã—ã¦ç§ãŸã¡ã‚’助ã‘ã¦ãã ã•ã„!"
+"ç¾åœ¨ã€ã“ã®ãƒ—ロパティã®èª¬æ˜Žã¯ã‚りã¾ã›ã‚“。[color=$color][url=$url]寄付[/url][/"
+"color]ã—ã¦ç§ãŸã¡ã‚’助ã‘ã¦ãã ã•ã„ï¼"
#: editor/editor_help.cpp
-#, fuzzy
-msgid "Methods"
-msgstr "メソッド一覧:"
+msgid "Method Descriptions"
+msgstr "メソッドã®èª¬æ˜Ž"
#: editor/editor_help.cpp
-#, fuzzy
-msgid "Method Description:"
-msgstr "メソッドã«ã¤ã„ã¦ã®è¨˜è¼‰:"
+msgid "Method Descriptions:"
+msgstr "メソッドã®èª¬æ˜Ž:"
#: editor/editor_help.cpp
msgid ""
"There is currently no description for this method. Please help us by [color="
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-"ç¾åœ¨ã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã®èª¬æ˜Žã¯ã‚りã¾ã›ã‚“。[color=$color][url=$url]貢献[/url][/"
-"color]ã—ã¦ç§ãŸã¡ã‚’助ã‘ã¦ãã ã•ã„!"
+"ç¾åœ¨ã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã®èª¬æ˜Žã¯ã‚りã¾ã›ã‚“。[color=$color][url=$url]寄付[/url][/"
+"color]ã—ã¦ç§ãŸã¡ã‚’助ã‘ã¦ãã ã•ã„ï¼"
-#: editor/editor_inspector.cpp
-#, fuzzy
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "ヘルプを検索"
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr "ã™ã¹ã¦è¡¨ç¤º"
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr "クラスã®ã¿"
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr "メソッドã®ã¿"
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr "シグナルã®ã¿"
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr "定数ã®ã¿"
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr "プロパティã®ã¿"
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr "テーマプロパティã®ã¿"
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr "メンãƒãƒ¼ã‚¿ã‚¤ãƒ—"
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr "クラス"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
msgstr "プロパティ:"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr "設定"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "複数設定:"
#: editor/editor_log.cpp
-#, fuzzy
msgid "Output:"
-msgstr " 出力:"
+msgstr "出力:"
#: editor/editor_log.cpp editor/editor_profiler.cpp
#: editor/editor_properties.cpp
@@ -1759,36 +1623,36 @@ msgstr " 出力:"
#: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Clear"
-msgstr "削除"
+msgstr "クリア"
#: editor/editor_log.cpp
-#, fuzzy
msgid "Clear Output"
-msgstr "出力"
+msgstr "出力をクリア"
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
-msgstr "エラーコード %d ã«ã‚ˆã‚Šã€ãƒ—ロジェクトã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
+msgstr "プロジェクトã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãŒã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ %d ã§å¤±æ•—ã—ã¾ã—ãŸã€‚"
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Error saving resource!"
-msgstr "リソースä¿å­˜ã‚¨ãƒ©ãƒ¼!"
+msgstr "リソースä¿å­˜ä¸­ã®ã‚¨ãƒ©ãƒ¼ï¼"
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "OK"
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Save Resource As..."
-msgstr "~ã¨ã„ã†åå‰ã§ãƒªã‚½ãƒ¼ã‚¹ã‚’ä¿å­˜ã™ã‚‹"
+msgstr "リソースを別åã§ä¿å­˜..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Can't open file for writing:"
-msgstr "ファイルを開ã„ã¦æ›¸ãè¾¼ã‚ã¾ã›ã‚“:"
+msgstr "書込むファイルを開ã‘ã¾ã›ã‚“:"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Requested file format unknown:"
-msgstr "ãã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æœªçŸ¥ã®ãƒ•ォーマットã§ã™:"
+msgstr "ファイル形å¼ãŒä¸æ˜Ž:"
#: editor/editor_node.cpp
msgid "Error while saving."
@@ -1797,91 +1661,89 @@ msgstr "ä¿å­˜ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
msgstr ""
+"'%s' ã‚’é–‹ãã“ã¨ãŒã§ãã¾ã›ã‚“。ファイルãŒç§»å‹•ã¾ãŸã¯å‰Šé™¤ã•れãŸå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚"
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
-msgstr "「%sã€ã®è§£æžä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+msgstr "'%s' ã®è§£æžä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
#: editor/editor_node.cpp
msgid "Unexpected end of file '%s'."
-msgstr "予期ã—ãªã„ファイル終了 '%s'."
+msgstr "ファイル '%s' ãŒäºˆæœŸã›ãšçµ‚了ã—ã¾ã—ãŸã€‚"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Missing '%s' or its dependencies."
-msgstr "シーン'%s' ã¯ä¾å­˜é–¢ä¿‚ãŒå£Šã‚Œã¦ã„ã¾ã™:"
+msgstr "'%s' ã€ã¾ãŸã¯ä¾å­˜é–¢ä¿‚ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。"
#: editor/editor_node.cpp
msgid "Error while loading '%s'."
-msgstr "「%sã€ã®èª­è¾¼ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+msgstr "'%s' ã®èª­è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
#: editor/editor_node.cpp
msgid "Saving Scene"
-msgstr "シーンをä¿å­˜"
+msgstr "シーンをä¿å­˜ä¸­"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Analyzing"
msgstr "分æžä¸­"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Creating Thumbnail"
-msgstr "サムãƒã‚¤ãƒ«ã‚’作æˆã—ã¦ã„ã¾ã™"
+msgstr "サムãƒã‚¤ãƒ«ã‚’作æˆ"
#: editor/editor_node.cpp
-#, fuzzy
msgid "This operation can't be done without a tree root."
-msgstr "ã“ã®å‡¦ç†ã«ã¯ã‚·ãƒ¼ãƒ³ãŒå¿…è¦ã§ã™."
+msgstr "ã“ã®æ“作ã¯ã€ãƒ„リー㮠root ãªã—ã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。"
+
+#: editor/editor_node.cpp
+msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
-"シーンをä¿å­˜ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ãŠãらãä¾å­˜é–¢ä¿‚ (インスタンス) を完備ã•れã¦ã„"
-"ãªã„ã¨æ€ã‚れã¾ã™."
+"シーンをä¿å­˜ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ ãŠãらãã€ä¾å­˜é–¢ä¿‚(インスタンスã¾ãŸã¯ç¶™æ‰¿ï¼‰ã‚’"
+"満ãŸã›ã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr "é–‹ã„ã¦ã„るシーンを上書ãã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“!"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Can't load MeshLibrary for merging!"
-msgstr "マージã™ã‚‹ãƒ¡ãƒƒã‚·ãƒ¥ãƒ©ã‚¤ãƒ–ラリーã®èª­ã¿è¾¼ã¿å¤±æ•—"
+msgstr "マージã™ã‚‹ãƒ¡ãƒƒã‚·ãƒ¥ãƒ©ã‚¤ãƒ–ラリーãŒèª­è¾¼ã‚ã¾ã›ã‚“ï¼"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Error saving MeshLibrary!"
msgstr "メッシュライブラリーã®ä¿å­˜ã‚¨ãƒ©ãƒ¼!"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Can't load TileSet for merging!"
-msgstr "マージã™ã‚‹ã‚¿ã‚¤ãƒ«ã‚»ãƒƒãƒˆã®èª­ã¿è¾¼ã¿å¤±æ•—"
+msgstr "マージã™ã‚‹ã‚¿ã‚¤ãƒ«ã‚»ãƒƒãƒˆãŒèª­è¾¼ã‚ã¾ã›ã‚“ï¼"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Error saving TileSet!"
-msgstr "タイルセットã®ä¿å­˜ã‚¨ãƒ©ãƒ¼!"
+msgstr "タイルセットã®ä¿å­˜ã‚¨ãƒ©ãƒ¼ï¼"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Error trying to save layout!"
-msgstr "レイアウトã®ä¿å­˜ã‚¨ãƒ©ãƒ¼"
+msgstr "レイアウトã®ä¿å­˜ã‚¨ãƒ©ãƒ¼ï¼"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Default editor layout overridden."
-msgstr "ã‚¨ãƒ‡ã‚£ã‚¿ã®æ¨™æº–レイアウトを上書ãã—ã¾ã—ãŸ."
+msgstr "デフォルトã®ã‚¨ãƒ‡ã‚£ã‚¿ レイアウトを上書ãã—ã¾ã—ãŸã€‚"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Layout name not found!"
-msgstr "レイアウトåãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+msgstr "レイアウトåãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ï¼"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Restored default layout to base settings."
-msgstr "æ¨™æº–ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’åŸºæœ¬è¨­å®šã«æˆ»ã—ã¾ã—ãŸ"
+msgstr "デフォルトã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’åŸºæœ¬è¨­å®šã«æˆ»ã—ã¾ã—ãŸã€‚"
#: editor/editor_node.cpp
msgid ""
@@ -1889,26 +1751,26 @@ msgid ""
"Please read the documentation relevant to importing scenes to better "
"understand this workflow."
msgstr ""
-"ã“ã®ãƒªã‚½ãƒ¼ã‚¹ã¯ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•れãŸã‚·ãƒ¼ãƒ³ã«æ‰€å±žã—ã¦ã„ã‚‹ãŸã‚ã€ç·¨é›†ã™ã‚‹ã“ã¨ãŒã§ãã¾"
-"ã›ã‚“。\n"
-"ã“ã®æ‰‹ç¶šãã«ã¤ã„ã¦ã‚ˆã‚Šè‰¯ã„ç†è§£ãŒå¿…è¦ãªã‚‰ã‚·ãƒ¼ãƒ³ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«é–¢ã™ã‚‹ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³"
-"トを確èªã—ã¦ä¸‹ã•ã„。"
+"ã“ã®ãƒªã‚½ãƒ¼ã‚¹ã¯ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•れãŸã‚·ãƒ¼ãƒ³ã«å±žã—ã¦ã„ã‚‹ãŸã‚ã€ç·¨é›†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›"
+"ん。\n"
+"ã“ã®ãƒ¯ãƒ¼ã‚¯ãƒ•ローをよりよãç†è§£ã™ã‚‹ãŸã‚ã«ã€ã‚·ãƒ¼ãƒ³ã®èª­ã¿è¾¼ã¿ã«é–¢é€£ã™ã‚‹ãƒ‰ã‚­ãƒ¥ãƒ¡"
+"ントをãŠèª­ã¿ãã ã•ã„。"
#: editor/editor_node.cpp
msgid ""
"This resource belongs to a scene that was instanced or inherited.\n"
"Changes to it will not be kept when saving the current scene."
msgstr ""
-"ã“ã®ãƒªã‚½ãƒ¼ã‚¹ã¯ã€ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹åŒ–ã•れãŸã‹ç¶™æ‰¿ã•れãŸã‚·ãƒ¼ãƒ³ã«æ‰€å±žã—ã¦ã„ã¾ã™ã€‚\n"
-"ç¾åœ¨ã®ã‚·ãƒ¼ãƒ³ã‚’ä¿å­˜ã™ã‚‹ã¨ã€å¤‰æ›´ãŒç ´æ£„ã•れã¾ã™ã€‚"
+"ã“ã®ãƒªã‚½ãƒ¼ã‚¹ã¯ã€ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹åŒ–ã¾ãŸã¯ç¶™æ‰¿ã•れãŸã‚·ãƒ¼ãƒ³ã«å±žã—ã¦ã„ã¾ã™ã€‚\n"
+"ç¾åœ¨ã®ã‚·ãƒ¼ãƒ³ã‚’ä¿å­˜ã—ã¦ã‚‚ã€å¤‰æ›´å†…容ã¯ä¿æŒã•れã¾ã›ã‚“。"
#: editor/editor_node.cpp
msgid ""
"This resource was imported, so it's not editable. Change its settings in the "
"import panel and then re-import."
msgstr ""
-"ã“ã®ãƒªã‚½ãƒ¼ã‚¹ã¯ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•れãŸã‚‚ã®ã§ã€ç·¨é›†ã§ãã¾ã›ã‚“。インãƒãƒ¼ãƒˆãƒ‘ãƒãƒ«ã®è¨­å®š"
-"を変更ã—ã€ã‚‚ã†ä¸€åº¦ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¦ãã ã•ã„。"
+"ã“ã®ãƒªã‚½ãƒ¼ã‚¹ã¯ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•れãŸã‚‚ã®ã§ã€ç·¨é›†ã§ãã¾ã›ã‚“。インãƒãƒ¼ãƒˆãƒ‘ãƒãƒ«ã§è¨­å®š"
+"を変更ã—ã€å†åº¦ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¦ãã ã•ã„。"
#: editor/editor_node.cpp
msgid ""
@@ -1917,9 +1779,10 @@ msgid ""
"Please read the documentation relevant to importing scenes to better "
"understand this workflow."
msgstr ""
-"ã“ã®ã‚·ãƒ¼ãƒ³ã¯ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•れãŸã‚‚ã®ã§ã€å¤‰æ›´ãŒä¿å­˜ã•れã¾ã›ã‚“。\n"
-"インスタンス化ã™ã‚‹ã‹ç¶™æ‰¿ã—ã¦ãã ã•ã„。ドキュメントã®ã‚·ãƒ¼ãƒ³ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«é–¢ã™"
-"る部分をå‚ç…§ã—ã¦ãã ã•ã„。"
+"ã“ã®ã‚·ãƒ¼ãƒ³ã¯ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•れãŸã‚‚ã®ã§ã€å¤‰æ›´ã¯ä¿æŒã•れã¾ã›ã‚“。\n"
+"インスタンス化ã‹ç¶™æ‰¿ã™ã‚‹ã¨ã€å¤‰æ›´ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚\n"
+"ã“ã®ãƒ¯ãƒ¼ã‚¯ãƒ•ローをよりよãç†è§£ã™ã‚‹ãŸã‚ã«ã€ã‚·ãƒ¼ãƒ³ã®èª­ã¿è¾¼ã¿ã«é–¢é€£ã™ã‚‹ãƒ‰ã‚­ãƒ¥ãƒ¡"
+"ントをãŠèª­ã¿ãã ã•ã„。"
#: editor/editor_node.cpp
msgid ""
@@ -1927,63 +1790,55 @@ msgid ""
"Please read the documentation relevant to debugging to better understand "
"this workflow."
msgstr ""
-"リモートオブジェクトã®ãŸã‚ã€å¤‰æ›´ãŒä¿å­˜ã•れã¾ã›ã‚“。\n"
-"ドキュメントã®ãƒ‡ãƒãƒƒã‚°ã«é–¢ã™ã‚‹éƒ¨åˆ†ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+"リモートオブジェクトã®ãŸã‚ã€å¤‰æ›´ã¯ä¿æŒã•れã¾ã›ã‚“。\n"
+"ã“ã®ãƒ¯ãƒ¼ã‚¯ãƒ•ローをよりよãç†è§£ã™ã‚‹ã«ã¯ã€ãƒ‡ãƒãƒƒã‚°ã«é–¢é€£ã™ã‚‹ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’ãŠèª­"
+"ã¿ãã ã•ã„。"
#: editor/editor_node.cpp
-#, fuzzy
msgid "There is no defined scene to run."
-msgstr "実行ã™ã‚‹å®šç¾©æ¸ˆã¿ã®ã‚·ãƒ¼ãƒ³ã¯ã‚りã¾ã›ã‚“。"
+msgstr "実行ã™ã‚‹ã‚·ãƒ¼ãƒ³ãŒå®šç¾©ã•れã¦ã„ã¾ã›ã‚“。"
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"No main scene has ever been defined, select one?\n"
"You can change it later in \"Project Settings\" under the 'application' "
"category."
msgstr ""
-"é¸æŠžã—ãŸã‚·ãƒ¼ãƒ³ '%s' ã¯ã€ã‚·ãƒ¼ãƒ³ ファイルã§ã¯ã‚りã¾ã›ã‚“ã€æœ‰åйãªã‚‚ã®ã‚’é¸æŠžã—ã¦ã„"
-"ã¾ã™ã‹ï¼Ÿ\n"
-"'アプリケーション' カテゴリã®ä¸‹ã®'プロジェクトã®è¨­å®š'ã§å¤‰æ›´ã§ãã¾ã™ã€‚"
+"メインシーンãŒå®šç¾©ã•れã¦ã„ã¾ã›ã‚“ã€‚é¸æŠžã—ã¾ã™ã‹?\n"
+"'アプリケーション' カテゴリã®ä¸‹ã® \"プロジェクト設定\" ã‹ã‚‰ã‚‚変更ã§ãã¾ã™ã€‚"
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"Selected scene '%s' does not exist, select a valid one?\n"
"You can change it later in \"Project Settings\" under the 'application' "
"category."
msgstr ""
-"é¸æŠžã—ãŸã‚·ãƒ¼ãƒ³'%s' ã¯å­˜åœ¨ã—ã¾ã›ã‚“ 有効ãªã‚·ãƒ¼ãƒ³ã‚’指定ã—ã¦ãã ã•ã„\n"
-"指定ã•れãŸã‚·ãƒ¼ãƒ³ã¯å¾Œã§\"アプリケーション\"ã®\"プロジェクトã®è¨­å®š\"ã‹ã‚‰å¤‰æ›´å¯"
-"能ã§ã™"
+"é¸æŠžã—ãŸã‚·ãƒ¼ãƒ³ '%s' ã¯å­˜åœ¨ã—ã¾ã›ã‚“。有効ãªã‚·ãƒ¼ãƒ³ã‚’é¸æŠžã—ã¾ã™ã‹?\n"
+"'アプリケーション' カテゴリã®ä¸‹ã® \"プロジェクト設定\" ã§å¾Œã‹ã‚‰å¤‰æ›´ã§ãã¾ã™ã€‚"
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"Selected scene '%s' is not a scene file, select a valid one?\n"
"You can change it later in \"Project Settings\" under the 'application' "
"category."
msgstr ""
-"é¸æŠžã—ãŸã‚·ãƒ¼ãƒ³ '%s' ã¯ã€ã‚·ãƒ¼ãƒ³ ファイルã§ã¯ã‚りã¾ã›ã‚“ã€æœ‰åйãªã‚‚ã®ã‚’é¸æŠžã—ã¦ã„"
-"ã¾ã™ã‹ï¼Ÿ\n"
-"'アプリケーション' カテゴリã®ä¸‹ã®'プロジェクトã®è¨­å®š'ã§å¤‰æ›´ã§ãã¾ã™ã€‚"
+"é¸æŠžã—ãŸã‚·ãƒ¼ãƒ³ '%s' ã¯ã‚·ãƒ¼ãƒ³ãƒ•ァイルã§ã¯ã‚りã¾ã›ã‚“。有効ãªã‚·ãƒ¼ãƒ³ã‚’é¸æŠžã—ã¾ã™"
+"ã‹?\n"
+"'アプリケーション' カテゴリã®ä¸‹ã® \"プロジェクト設定\" ã§å¾Œã‹ã‚‰å¤‰æ›´ã§ãã¾ã™ã€‚"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Current scene was never saved, please save it prior to running."
-msgstr ""
-"ç¾åœ¨ã®ã‚·ãƒ¼ãƒ³ãŒä¿å­˜ã•れã¦ã„ã¾ã›ã‚“ã§ã—ãŸã€ãれ以å‰ã®å®Ÿè¡Œä¸­ã«ä¿å­˜ã—ã¦ãã ã•ã„。"
+msgstr "ç¾åœ¨ã®ã‚·ãƒ¼ãƒ³ã¯ä¿å­˜ã•れã¾ã›ã‚“ã§ã—ãŸã€‚実行ã™ã‚‹å‰ã«ä¿å­˜ã—ã¦ãã ã•ã„。"
#: editor/editor_node.cpp
msgid "Could not start subprocess!"
-msgstr "サブプロセスを開始ã§ãã¾ã›ã‚“!"
+msgstr "サブプロセスを開始ã§ãã¾ã›ã‚“ã§ã—ãŸ!"
#: editor/editor_node.cpp
msgid "Open Scene"
msgstr "シーンを開ã"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Base Scene"
msgstr "基本シーンを開ã"
@@ -1992,85 +1847,72 @@ msgid "Quick Open Scene..."
msgstr "シーンã®ã‚¯ã‚¤ãƒƒã‚¯ã‚ªãƒ¼ãƒ—ン..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Quick Open Script..."
msgstr "スクリプトã®ã‚¯ã‚¤ãƒƒã‚¯ã‚ªãƒ¼ãƒ—ン..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save & Close"
-msgstr "ファイルをä¿å­˜"
+msgstr "ä¿å­˜ã—ã¦é–‰ã˜ã‚‹"
#: editor/editor_node.cpp
msgid "Save changes to '%s' before closing?"
-msgstr "終了ã™ã‚‹å‰ã«ã€'%s' ã¸ã®å¤‰æ›´ã‚’ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ"
+msgstr "é–‰ã˜ã‚‹å‰ã«ã€'%s' ã¸ã®å¤‰æ›´ã‚’ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ"
#: editor/editor_node.cpp
msgid "Save Scene As..."
-msgstr "åå‰ã‚’付ã‘ã¦ã‚·ãƒ¼ãƒ³ã‚’ä¿å­˜"
+msgstr "åå‰ã‚’付ã‘ã¦ã‚·ãƒ¼ãƒ³ã‚’ä¿å­˜..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "No"
msgstr "ã„ã„ãˆ"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Yes"
msgstr "ã¯ã„"
#: editor/editor_node.cpp
-#, fuzzy
msgid "This scene has never been saved. Save before running?"
-msgstr "ã“ã®ã‚·ãƒ¼ãƒ³ã¯ä¿å­˜ã•れã¦ã„ã¾ã›ã‚“. runã™ã‚‹å‰ã«ä¿å­˜ã—ã¾ã™ã‹?"
+msgstr "ã“ã®ã‚·ãƒ¼ãƒ³ã¯ä¸€åº¦ã‚‚ä¿å­˜ã•れã¦ã„ã¾ã›ã‚“。実行ã™ã‚‹å‰ã«ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ"
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "This operation can't be done without a scene."
-msgstr "ã“ã®å‡¦ç†ã«ã¯ã‚·ãƒ¼ãƒ³ãŒå¿…è¦ã§ã™."
+msgstr "ã“ã®æ“作ã«ã¯ã‚·ãƒ¼ãƒ³ãŒå¿…è¦ã§ã™ã€‚"
#: editor/editor_node.cpp
msgid "Export Mesh Library"
msgstr "メッシュライブラリã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ"
#: editor/editor_node.cpp
-#, fuzzy
msgid "This operation can't be done without a root node."
-msgstr "ã“ã®å‡¦ç†ã«ã¯ã‚·ãƒ¼ãƒ³ãŒå¿…è¦ã§ã™."
+msgstr "ã“ã®æ“作ã«ã¯ãƒ«ãƒ¼ãƒˆãƒŽãƒ¼ãƒ‰ãŒå¿…è¦ã§ã™ã€‚"
#: editor/editor_node.cpp
msgid "Export Tile Set"
msgstr "タイルセットã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ"
#: editor/editor_node.cpp
-#, fuzzy
msgid "This operation can't be done without a selected node."
-msgstr "ã“ã®å‡¦ç†ã«ã¯ã‚·ãƒ¼ãƒ³ãŒå¿…è¦ã§ã™."
+msgstr "ã“ã®æ“作ã«ã¯é¸æŠžã•れãŸãƒŽãƒ¼ãƒ‰ãŒå¿…è¦ã§ã™ã€‚"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Current scene not saved. Open anyway?"
-msgstr "ã“ã®ã‚·ãƒ¼ãƒ³ã¯ä¿å­˜ã•れã¦ã„ã¾ã›ã‚“. ãれã§ã‚‚é–‹ãã¾ã™ã‹?"
+msgstr "ç¾åœ¨ã®ã‚·ãƒ¼ãƒ³ã¯ä¿å­˜ã•れã¦ã„ã¾ã›ã‚“。ãれã§ã‚‚é–‹ãã¾ã™ã‹ï¼Ÿ"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Can't reload a scene that was never saved."
-msgstr "ä¿å­˜ã•れã¦ã„ãªã„シーンã¯å†èª­ã¿è¾¼ã¿ã§ãã¾ã›ã‚“"
+msgstr "ä¿å­˜ã•れã¦ã„ãªã„シーンを読ã¿è¾¼ã‚€ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Revert"
msgstr "å…ƒã«æˆ»ã™"
#: editor/editor_node.cpp
-#, fuzzy
msgid "This action cannot be undone. Revert anyway?"
-msgstr "ã“ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã¯undoã§ãã¾ã›ã‚“. å…ƒã«æˆ»ã—ã¾ã™ã‹ï¼Ÿ"
+msgstr "ã“ã®æ“作ã¯ã‚¢ãƒ³ãƒ‰ã‚¥ã§ãã¾ã›ã‚“。ãれã§ã‚‚å…ƒã«æˆ»ã—ã¾ã™ã‹ï¼Ÿ"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Quick Run Scene..."
-msgstr "シーンをクイックランã™ã‚‹"
+msgstr "シーンをクイック実行ã™ã‚‹..."
#: editor/editor_node.cpp
msgid "Quit"
@@ -2086,15 +1928,16 @@ msgstr "プロジェクトマãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’é–‹ãã¾ã™ã‹ï¼Ÿ"
#: editor/editor_node.cpp
msgid "Save & Quit"
-msgstr "ファイルをä¿å­˜ã—ã¦çµ‚了"
+msgstr "ä¿å­˜ã—ã¦çµ‚了"
#: editor/editor_node.cpp
msgid "Save changes to the following scene(s) before quitting?"
-msgstr "終了ã™ã‚‹å‰ã«ã€ä»¥ä¸‹ã®ã‚·ãƒ¼ãƒ³ã®å¤‰æ›´ã‚’ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ"
+msgstr "終了ã™ã‚‹å‰ã«ã€ä»¥ä¸‹ã®ã‚·ãƒ¼ãƒ³ã¸ã®å¤‰æ›´ã‚’ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ"
#: editor/editor_node.cpp
msgid "Save changes the following scene(s) before opening Project Manager?"
-msgstr "プロジェクトマãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’é–‹ãå‰ã«ã€ä»¥ä¸‹ã®ã‚·ãƒ¼ãƒ³ã®å¤‰æ›´ã‚’ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ"
+msgstr ""
+"プロジェクトマãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’é–‹ãå‰ã«ã€ä»¥ä¸‹ã®ã‚·ãƒ¼ãƒ³ã¸ã®å¤‰æ›´ã‚’ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ"
#: editor/editor_node.cpp
msgid ""
@@ -2105,110 +1948,110 @@ msgstr ""
"ã¿ãªã•れã¾ã™ã€‚報告ã—ã¦ãã ã•ã„。"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Pick a Main Scene"
-msgstr "メインシーンを指定"
+msgstr "メインシーンをé¸ã¶"
#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
-msgstr ""
-"アドオンプラグインを有効ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“: '%s' 設定ã®è§£æžã«å¤±æ•—ã—ã¾ã—"
-"ãŸã€‚"
+msgstr "アドオンプラグインを有効ã«ã§ãã¾ã›ã‚“: '%s' 設定ã®è§£æžã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
#: editor/editor_node.cpp
msgid "Unable to find script field for addon plugin at: 'res://addons/%s'."
msgstr ""
-"アドオンプラグインã®ã‚¹ã‚¯ãƒªãƒ—トフィールドを見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“: 'res://"
-"addons/%s'."
+"アドオンプラグインã®ã‚¹ã‚¯ãƒªãƒ—トフィールド㌠'res://addons/%s' ã‹ã‚‰è¦‹ã¤ã‹ã‚Šã¾ã›"
+"ん。"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Unable to load addon script from path: '%s'."
-msgstr "フォント読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼ã€‚"
+msgstr "パス '%s' ã‹ã‚‰ã‚¢ãƒ‰ã‚ªãƒ³ã‚¹ã‚¯ãƒªãƒ—トを読込ã‚ã¾ã›ã‚“。"
+
+#: editor/editor_node.cpp
+msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"パス '%s' ã‹ã‚‰ã‚¢ãƒ‰ã‚ªãƒ³ã‚¹ã‚¯ãƒªãƒ—トを読ã¿è¾¼ã‚ã¾ã›ã‚“。コードã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å¯èƒ½æ€§"
+"ãŒã‚りã¾ã™ã€‚構文を確èªã—ã¦ãã ã•ã„。"
#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
-"アドオンスクリプトを読ã¿è¾¼ã‚ã¾ã›ã‚“: '%s' エディタプラグインã§ã¯ã‚りã¾ã›ã‚“。"
+"パス '%s' ã‹ã‚‰ã‚¢ãƒ‰ã‚ªãƒ³ã‚¹ã‚¯ãƒªãƒ—トを読込ã‚ã¾ã›ã‚“。基本型ãŒã‚¨ãƒ‡ã‚£ã‚¿ãƒ—ラグインã§"
+"ã¯ã‚りã¾ã›ã‚“。"
#: editor/editor_node.cpp
msgid "Unable to load addon script from path: '%s' Script is not in tool mode."
msgstr ""
-"アドオンスクリプトを読ã¿è¾¼ã‚ã¾ã›ã‚“: '%s' スクリプトãŒãƒ„ールモードã§ã¯ã‚りã¾"
-"ã›ã‚“。"
+"パス '%s' ã‹ã‚‰ã‚¢ãƒ‰ã‚ªãƒ³ã‚¹ã‚¯ãƒªãƒ—トを読込ã‚ã¾ã›ã‚“。スクリプトãŒãƒ„ールモードã§ã¯"
+"ã‚りã¾ã›ã‚“。"
#: editor/editor_node.cpp
msgid ""
"Scene '%s' was automatically imported, so it can't be modified.\n"
"To make changes to it, a new inherited scene can be created."
msgstr ""
-"シーン'%s'ã¯è‡ªå‹•çš„ã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•れã€ä¿®æ­£å¯èƒ½ã§ã™\n"
-"変更ã™ã‚‹ãŸã‚ã«ã¯ã€ã‚·ãƒ¼ãƒ³ã‚’継承ã—ã¦æ–°ã—ã生æˆã—ã¾ã™."
+"シーン '%s' ã¯è‡ªå‹•çš„ã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•れãŸã®ã§ã€å¤‰æ›´ã§ãã¾ã›ã‚“。\n"
+"変更ã™ã‚‹ãŸã‚ã«ã¯ã€æ–°ãŸã«ç¶™æ‰¿ã•れãŸã‚·ãƒ¼ãƒ³ã‚’作æˆã—ã¦ãã ã•ã„。"
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"Error loading scene, it must be inside the project path. Use 'Import' to "
"open the scene, then save it inside the project path."
msgstr ""
-"シーン読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼ã€€ã‚·ãƒ¼ãƒ³ã¯ãƒ—ロジェクトパス内ã«ä½ç½®ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ã“"
-"ã®ã‚·ãƒ¼ãƒ³ã‚’é–‹ãã«ã¯'インãƒãƒ¼ãƒˆ'を使用ã—ã€ãƒ—ロジェクトパス内ã«ä¿å­˜ã—ã¦ãã ã•ã„"
+"シーン読込ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚プロジェクトパス内ã«ã‚ã‚‹å¿…è¦ãŒã‚りã¾"
+"ã™ã€‚ã“ã®ã‚·ãƒ¼ãƒ³ã‚’é–‹ãã«ã¯ 'インãƒãƒ¼ãƒˆ' を使用ã—ã€ãƒ—ロジェクトパス内ã«ä¿å­˜ã—ã¦"
+"ãã ã•ã„。"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Scene '%s' has broken dependencies:"
-msgstr "シーン'%s' ã¯ä¾å­˜é–¢ä¿‚ãŒå£Šã‚Œã¦ã„ã¾ã™:"
+msgstr "シーン '%s' ã¯ä¾å­˜é–¢ä¿‚ãŒå£Šã‚Œã¦ã„ã¾ã™:"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Clear Recent Scenes"
-msgstr "最近開ã„ãŸãƒ•ァイルã®è¨˜éŒ²ã‚’クリア"
+msgstr "最近開ã„ãŸã‚·ãƒ¼ãƒ³ã®å±¥æ­´ã‚’クリア"
#: editor/editor_node.cpp
msgid "Save Layout"
msgstr "レイアウトをä¿å­˜"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Delete Layout"
-msgstr "ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã®æ¶ˆåŽ»"
+msgstr "レイアウトã®å‰Šé™¤"
#: editor/editor_node.cpp editor/import_dock.cpp
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Default"
-msgstr "標準(既定)"
+msgstr "デフォルト"
+
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr "ファイルシステム上ã§è¡¨ç¤º"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play This Scene"
-msgstr "シーンを実行"
+msgstr "シーンをプレイ"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "ã»ã‹ã®ã‚¿ãƒ–ã‚’é–‰ã˜ã‚‹"
+msgstr "タブを閉ã˜ã‚‹"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Switch Scene Tab"
-msgstr "シーンタブを切り替ãˆã‚‹"
+msgstr "シーンタブを切り替ãˆ"
#: editor/editor_node.cpp
-#, fuzzy
msgid "%d more files or folders"
-msgstr "%d 多ã„ファイルã‹ãƒ•ォルダ"
+msgstr "%d 以上ã®ãƒ•ァイルã¨ãƒ•ォルダ"
#: editor/editor_node.cpp
-#, fuzzy
msgid "%d more folders"
-msgstr "%d 多ã„ファイル"
+msgstr "%d 以上ã®ãƒ•ォルダ"
#: editor/editor_node.cpp
-#, fuzzy
msgid "%d more files"
-msgstr "%d 多ã„ファイル"
+msgstr "%d 以上ã®ãƒ•ァイル"
#: editor/editor_node.cpp
msgid "Dock Position"
@@ -2216,93 +2059,77 @@ msgstr "ドックã®ä½ç½®"
#: editor/editor_node.cpp
msgid "Distraction Free Mode"
-msgstr "最低é™ãƒ¢ãƒ¼ãƒ‰"
+msgstr "集中モード"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Toggle distraction-free mode."
-msgstr "最低é™ãƒ¢ãƒ¼ãƒ‰"
+msgstr "集中モードを切り替ãˆã‚‹ã€‚"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Add a new scene."
-msgstr "æ–°ã—ã„トラックを追加。"
+msgstr "æ–°è¦ã‚·ãƒ¼ãƒ³ã‚’追加ã™ã‚‹ã€‚"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Scene"
msgstr "シーン"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Go to previously opened scene."
-msgstr "éŽåŽ»ã«é–‹ã„ãŸã‚·ãƒ¼ãƒ³ã«ç§»å‹•"
+msgstr "以å‰ã«é–‹ã„ãŸã‚·ãƒ¼ãƒ³ã«ç§»å‹•ã™ã‚‹ã€‚"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Next tab"
msgstr "次ã®ã‚¿ãƒ–"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Previous tab"
-msgstr "以å‰ã®ã‚¿ãƒ–"
+msgstr "å‰ã®ã‚¿ãƒ–"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Filter Files..."
msgstr "ファイルを絞り込む..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Operations with scene files."
-msgstr "シーンファイルã¸ã®æ“作"
+msgstr "ã‚·ãƒ¼ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ã®æ“作。"
#: editor/editor_node.cpp
-#, fuzzy
msgid "New Scene"
-msgstr "æ–°ã—ã„シーン"
+msgstr "æ–°è¦ã‚·ãƒ¼ãƒ³"
#: editor/editor_node.cpp
-#, fuzzy
msgid "New Inherited Scene..."
msgstr "æ–°ã—ã„継承ã—ãŸã‚·ãƒ¼ãƒ³..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Scene..."
msgstr "シーンを開ã..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save Scene"
-msgstr "シーンをä¿å­˜ã™ã‚‹"
+msgstr "シーンをä¿å­˜"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
-msgstr "シーンをã™ã¹ã¦ä¿å­˜"
+msgid "Save All Scenes"
+msgstr "å…¨ã¦ã®ã‚·ãƒ¼ãƒ³ã‚’ä¿å­˜"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Scene"
msgstr "シーンを閉ã˜ã‚‹"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Open Recent"
-msgstr "最近使ã£ãŸãƒ•ァイルを開ã"
+msgstr "最近開ã„ãŸã‚·ãƒ¼ãƒ³ã‚’é–‹ã"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Convert To..."
-msgstr "~ã«å¤‰æ›ã™ã‚‹..."
+msgstr "変æ›..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "MeshLibrary..."
msgstr "メッシュライブラリ..."
#: editor/editor_node.cpp
-#, fuzzy
msgid "TileSet..."
msgstr "タイルセット..."
@@ -2312,28 +2139,23 @@ msgid "Undo"
msgstr "å…ƒã«æˆ»ã™"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
-#, fuzzy
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
-msgstr "å†å®Ÿè¡Œ"
+msgstr "やり直ã™"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Revert Scene"
-msgstr "シーンを戻ã™"
+msgstr "ã‚·ãƒ¼ãƒ³ã‚’å…ƒã«æˆ»ã™"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Miscellaneous project or scene-wide tools."
-msgstr "数多ãã®ãƒ—ロジェクトやシーンã®ãƒ„ール"
+msgstr "ãã®ä»–ã®ãƒ—ロジェクトã¾ãŸã¯ã‚·ãƒ¼ãƒ³å…¨ä½“ã®ãƒ„ール。"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Project"
msgstr "プロジェクト"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Project Settings"
msgstr "プロジェクトã®è¨­å®š"
@@ -2341,42 +2163,38 @@ msgstr "プロジェクトã®è¨­å®š"
msgid "Export"
msgstr "エクスãƒãƒ¼ãƒˆ"
-#: editor/editor_node.cpp
-#, fuzzy
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "ツール"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "プロジェクトマãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’é–‹ãã¾ã™ã‹ï¼Ÿ"
+msgstr "プロジェクトã®ãƒ‡ãƒ¼ã‚¿ãƒ•ォルダを開ã"
#: editor/editor_node.cpp
msgid "Quit to Project List"
msgstr "終了ã—ã¦ãƒ—ロジェクト一覧を開ã"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-#, fuzzy
+#: editor/project_export.cpp
msgid "Debug"
msgstr "デãƒãƒƒã‚°"
#: editor/editor_node.cpp
msgid "Deploy with Remote Debug"
-msgstr "リモートデãƒãƒƒã‚°ä»˜ãã§ãƒ‡ãƒ—ロイ(æä¾›ï¼‰ã™ã‚‹"
+msgstr "リモートデãƒãƒƒã‚°ã§ãƒ‡ãƒ—ロイ"
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"When exporting or deploying, the resulting executable will attempt to "
"connect to the IP of this computer in order to be debugged."
msgstr ""
-"エクスãƒãƒ¼ãƒˆã™ã‚‹ã«ã›ã‚ˆã€ãƒ‡ãƒ—ロイ(æä¾›ï¼‰ã™ã‚‹ã«ã›ã‚ˆã€ç”Ÿæˆã•れãŸå®Ÿè¡Œãƒ•ァイル"
-"ã¯ã€ã“ã®ã‚³ãƒ³ãƒ”ューターã®ï¼©ï¼°ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ãƒ‡ãƒãƒƒã‚°ã®ãŸã‚接続ã—よã†ã¨ã™ã‚‹."
+"エクスãƒãƒ¼ãƒˆã¾ãŸã¯ãƒ‡ãƒ—ロイを行ã†å ´åˆã€ç”Ÿæˆã•れãŸå®Ÿè¡Œãƒ•ァイルã¯ãƒ‡ãƒãƒƒã‚°ã®ãŸã‚"
+"ã«ã€ã“ã®ã‚³ãƒ³ãƒ”ューターã®ï¼©ï¼°ã«æŽ¥ç¶šã‚’試ã¿ã¾ã™ã€‚"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Small Deploy with Network FS"
-msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ•ァイルシステムã§ãƒ‡ãƒ—ロイ(æä¾›ï¼‰ã™ã‚‹"
+msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ•ァイルシステムã§ã‚¹ãƒ¢ãƒ¼ãƒ«ãƒ‡ãƒ—ロイ"
#: editor/editor_node.cpp
msgid ""
@@ -2387,122 +2205,103 @@ msgid ""
"On Android, deploy will use the USB cable for faster performance. This "
"option speeds up testing for games with a large footprint."
msgstr ""
-"ã“ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ãŒæœ‰åйã«ã™ã‚‹ã¨ã€æ›¸ã出ã—ã‚‚ã—ãã¯ãƒ‡ãƒ—ロイ(æä¾›ï¼‰ã•ã‚Œã‚‹æ™‚ã€æœ€å°"
-"ã®å®Ÿè¡Œãƒ•ァイルを生æˆã—ã¾ã™. \n"
-"ファイルシステムã¯ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯è¶Šã—ã«ã‚¨ãƒ‡ã‚£ã‚¿ã®ãƒ—ロジェクトを利用ã—ã¾ã™\n"
+"ã“ã®ã‚ªãƒ—ションを有効ã«ã™ã‚‹ã¨ã€ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã¾ãŸã¯ãƒ‡ãƒ—ãƒ­ã‚¤æ™‚ã«æœ€å°é™ã®å®Ÿè¡Œå¯èƒ½"
+"ファイルãŒç”Ÿæˆã•れã¾ã™ã€‚\n"
+"ファイルシステムã¯ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã®ã‚¨ãƒ‡ã‚£ã‚¿ã«ã‚ˆã£ã¦ãƒ—ロジェクトã‹ã‚‰æä¾›ã•れ"
+"ã¾ã™ã€‚\n"
"Androidã§ã¯USBケーブルã®åˆ©ç”¨ã§ã‚ˆã‚Šé«˜é€Ÿã«ãªã‚Šã¾ã™ã€‚ã“ã®ã‚ªãƒ—ションã¯å¤§ããªã‚²ãƒ¼"
-"ムã®ãƒ†ã‚¹ãƒˆã‚’スピードアップã§ãã¾ã™ã€‚"
+"ムã®ãƒ†ã‚¹ãƒˆã‚’高速化ã§ãã¾ã™ã€‚"
#: editor/editor_node.cpp
msgid "Visible Collision Shapes"
-msgstr "コリジョンã®ã‚·ã‚§ã‚¤ãƒ—を見ãˆã‚‹ã‚ˆã†ã«ãªã‚‹"
+msgstr "コリジョン形状ã®è¡¨ç¤º"
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
"running game if this option is turned on."
msgstr ""
-"ã“ã®ã‚ªãƒ—ションを有効ã«ã™ã‚‹ã¨ã€ã‚³ãƒªã‚¸ãƒ§ãƒ³ã®ã‚·ã‚§ã‚£ãƒ—ã¨ãƒ¬ã‚¤ã‚­ãƒ£ã‚¹ãƒˆã®ãƒŽãƒ¼ãƒ‰ãŒã€"
-"ゲーム実行時ã«è¦‹ãˆã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™."
+"ã“ã®ã‚ªãƒ—ションを有効ã«ã™ã‚‹ã¨ã€ã‚³ãƒªã‚¸ãƒ§ãƒ³å½¢çжã¨ãƒ¬ã‚¤ã‚­ãƒ£ã‚¹ãƒˆãƒŽãƒ¼ãƒ‰ãŒã€ã‚²ãƒ¼ãƒ å®Ÿ"
+"行中ã«ã‚‚表示ã•れるよã†ã«ãªã‚Šã¾ã™ã€‚"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Visible Navigation"
-msgstr "ナビゲーションãŒè¦‹ãˆã‚‹ã‚ˆã†ã«ãªã‚‹"
+msgstr "ナビゲーションã®è¡¨ç¤º"
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"Navigation meshes and polygons will be visible on the running game if this "
"option is turned on."
msgstr ""
-"ã“ã®ã‚ªãƒ—ションを有効ã«ã™ã‚‹ã¨ã€ãƒŠãƒ“ゲーションメッシュã¨ãƒãƒªã‚´ãƒ³ãŒã‚²ãƒ¼ãƒ å®Ÿè¡Œæ™‚"
-"ã«è¦‹ãˆã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™"
+"ã“ã®ã‚ªãƒ—ションを有効ã«ã™ã‚‹ã¨ã€ãƒŠãƒ“ゲーションメッシュãŒã€ã‚²ãƒ¼ãƒ å®Ÿè¡Œä¸­ã«ã‚‚表示"
+"ã•れるよã†ã«ãªã‚Šã¾ã™ã€‚"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Sync Scene Changes"
msgstr "シーンã®å¤‰æ›´ã‚’åŒæœŸ"
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"When this option is turned on, any changes made to the scene in the editor "
"will be replicated in the running game.\n"
"When used remotely on a device, this is more efficient with network "
"filesystem."
msgstr ""
-"ã“ã®ã‚ªãƒ—ションを有効ã«ã™ã‚‹ã¨ã€ã‚¨ãƒ‡ã‚£ã‚¿ã«ã‚ˆã‚‹ã‚·ãƒ¼ãƒ³ã®å¤‰æ›´ã¯å®Ÿè¡Œä¸­ã®ã‚²ãƒ¼ãƒ ã«é©"
-"用ã•れã¾ã™.リモート実行ã®å ´åˆã€ã“ã®ã‚ªãƒ—ションã¯ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ•ァイルシステムを"
-"使ã†ã¨ã‚ˆã‚ŠåŠ¹æžœçš„ã§ã™"
+"ã“ã®ã‚ªãƒ—ションを有効ã«ã™ã‚‹ã¨ã€ã‚¨ãƒ‡ã‚£ã‚¿ã‹ã‚‰ã‚·ãƒ¼ãƒ³ã«åŠ ãˆã‚‰ã‚ŒãŸå¤‰æ›´ãŒã€å®Ÿè¡Œä¸­ã®"
+"ゲームã«å映ã•れるよã†ã«ãªã‚Šã¾ã™ã€‚\n"
+"リモート実行ã®å ´åˆã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ•ァイルシステムを使ã†ã¨ã‚ˆã‚ŠåŠ¹æžœçš„ã§ã™ã€‚"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Sync Script Changes"
-msgstr "スクリプトã®å¤‰æ›´ã‚’åŒæœŸã™ã‚‹"
+msgstr "スクリプトã®å¤‰æ›´ã‚’åŒæœŸ"
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"When this option is turned on, any script that is saved will be reloaded on "
"the running game.\n"
"When used remotely on a device, this is more efficient with network "
"filesystem."
msgstr ""
-"ã“ã®ã‚ªãƒ—ションを有効ã«ã™ã‚‹ã¨ã€ä¿å­˜ã—ãŸã‚¹ã‚¯ãƒªãƒ—トãŒå®Ÿè¡Œä¸­ã®ã‚²ãƒ¼ãƒ ã«é©ç”¨ã•れã¾"
-"ã™.リモート実行ã®å ´åˆã€ã“ã®ã‚ªãƒ—ションã¯ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ•ァイルシステムを使ã†ã¨ã‚ˆ"
-"り効果的ã§ã™"
+"ã“ã®ã‚ªãƒ—ションを有効ã«ã™ã‚‹ã¨ã€ä¿å­˜ã—ãŸã‚¹ã‚¯ãƒªãƒ—トãŒã€å®Ÿè¡Œä¸­ã®ã‚²ãƒ¼ãƒ ã«å映ã•れ"
+"るよã†ã«ãªã‚Šã¾ã™ã€‚\n"
+"リモート実行ã®å ´åˆã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ•ァイルシステムを使ã†ã¨ã‚ˆã‚ŠåŠ¹æžœçš„ã§ã™ã€‚"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Editor"
msgstr "エディタ"
#: editor/editor_node.cpp editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Editor Settings"
-msgstr "エディタã®è¨­å®š"
+msgstr "エディタ設定"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Editor Layout"
-msgstr "エディタã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆ"
+msgstr "エディタレイアウト"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Toggle Fullscreen"
-msgstr "フルスクリーンã®åˆ‡ã‚Šæ›¿ãˆ"
+msgstr "フルスクリーン切り替ãˆ"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Data/Settings Folder"
-msgstr "エディタã®è¨­å®š"
+msgstr "エディタã®ãƒ‡ãƒ¼ã‚¿ãƒ»è¨­å®šãƒ•ォルダを開ã"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "エディタã®ãƒ‡ãƒ¼ã‚¿ãƒ•ォルダを開ã"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Settings Folder"
-msgstr "エディタã®è¨­å®š"
+msgstr "エディタ設定ã®ãƒ•ォルダを開ã"
#: editor/editor_node.cpp editor/project_export.cpp
-#, fuzzy
msgid "Manage Export Templates"
-msgstr "テンプレート エクスãƒãƒ¼ãƒˆã‚’管ç†"
+msgstr "エクスãƒãƒ¼ãƒˆãƒ†ãƒ³ãƒ—レートã®ç®¡ç†"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Help"
msgstr "ヘルプ"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Classes"
-msgstr "クラス"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2512,110 +2311,89 @@ msgid "Search"
msgstr "検索"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Online Docs"
-msgstr "オンライン文書"
+msgstr "オンラインドキュメント"
#: editor/editor_node.cpp
msgid "Q&A"
msgstr "Q&A"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Issue Tracker"
-msgstr "課題(ãƒã‚°ï¼‰ç®¡ç†ã‚·ã‚¹ãƒ†ãƒ "
+msgstr "課題管ç†ã‚·ã‚¹ãƒ†ãƒ "
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
msgstr "コミュニティ"
#: editor/editor_node.cpp
-#, fuzzy
msgid "About"
-msgstr "ã«ã¤ã„ã¦"
+msgstr "概è¦"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play the project."
-msgstr "プロジェクトã®å®Ÿè¡Œ"
+msgstr "プロジェクトを実行。"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play"
msgstr "実行"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Pause the scene"
msgstr "ã‚·ãƒ¼ãƒ³ã‚’ä¸€æ™‚åœæ­¢"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Pause Scene"
msgstr "ã‚·ãƒ¼ãƒ³ã‚’ä¸€æ™‚åœæ­¢"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Stop the scene."
-msgstr "ã‚·ãƒ¼ãƒ³ã‚’åœæ­¢"
+msgstr "ã‚·ãƒ¼ãƒ³ã‚’åœæ­¢ã€‚"
#: editor/editor_node.cpp editor/editor_profiler.cpp
msgid "Stop"
msgstr "åœæ­¢"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play the edited scene."
-msgstr "編集ã—ãŸã‚·ãƒ¼ãƒ³ã‚’実行"
+msgstr "編集ã—ãŸã‚·ãƒ¼ãƒ³ã‚’実行。"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play Scene"
msgstr "シーンを実行"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play custom scene"
msgstr "カスタムシーンを実行"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play Custom Scene"
msgstr "カスタムシーンを実行"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr ""
+msgstr "ビデオドライãƒã‚’変更ã™ã‚‹ã«ã¯ã€ã‚¨ãƒ‡ã‚£ã‚¿ã‚’å†èµ·å‹•ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚"
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Save & Restart"
-msgstr "ä¿å­˜ã—ã¦å†ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
+msgstr "ä¿å­˜ã—ã¦å†èµ·å‹•"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Spins when the editor window repaints!"
-msgstr "ã‚¨ãƒ‡ã‚£ã‚¿ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’å†æç”»ã™ã‚‹ã¨ãã«å¤‰æ›´ã™ã‚‹!"
+msgstr "エディタウィンドウã®å†æç”»æ™‚ã«ã‚¹ãƒ”ンã—ã¾ã™ï¼"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Update Always"
-msgstr "常ã«ã‚¢ãƒƒãƒ—デート"
+msgstr "å¸¸ã«æ›´æ–°"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Update Changes"
-msgstr "å¤‰æ›´ã‚’åæ˜ ã™ã‚‹"
+msgstr "å¤‰æ›´æ™‚ã«æ›´æ–°"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Disable Update Spinner"
-msgstr "ã‚¢ãƒƒãƒ—ãƒ‡ãƒ¼ãƒˆåæ˜ ã‚’åœæ­¢"
-
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "インスペクター"
+msgstr "アップデートスピナーを無効化"
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
@@ -2623,18 +2401,20 @@ msgid "Import"
msgstr "インãƒãƒ¼ãƒˆ"
#: editor/editor_node.cpp
-#, fuzzy
-msgid "Node"
-msgstr "ノード"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "ファイルシステム"
#: editor/editor_node.cpp
-#, fuzzy
+msgid "Inspector"
+msgstr "インスペクタ"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "ノード"
+
+#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
-msgstr "ã™ã¹ã¦å±•é–‹ã™ã‚‹"
+msgstr "下パãƒãƒ«ã‚’展開"
#: editor/editor_node.cpp scene/resources/visual_shader.cpp
msgid "Output"
@@ -2645,40 +2425,36 @@ msgid "Don't Save"
msgstr "ä¿å­˜ã—ãªã„"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Import Templates From ZIP File"
msgstr "ZIPファイルã‹ã‚‰ãƒ†ãƒ³ãƒ—レートをインãƒãƒ¼ãƒˆ"
#: editor/editor_node.cpp editor/project_export.cpp
msgid "Export Project"
-msgstr "プロジェクトをエクスãƒãƒ¼ãƒˆ"
+msgstr "プロジェクトã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ"
#: editor/editor_node.cpp
msgid "Export Library"
-msgstr "ライブラリをエクスãƒãƒ¼ãƒˆ"
+msgstr "ライブラリã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Merge With Existing"
-msgstr "(ライブラリを)マージã™ã‚‹"
+msgstr "既存ã®ï¼ˆãƒ©ã‚¤ãƒ–ラリを)マージ"
#: editor/editor_node.cpp
msgid "Password:"
msgstr "パスワード:"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open & Run a Script"
-msgstr "é–‹ã„ã¦ã‚¹ã‚¯ãƒªãƒ—トを実行ã™ã‚‹"
+msgstr "スクリプトを開ã„ã¦å®Ÿè¡Œ"
#: editor/editor_node.cpp
-#, fuzzy
msgid "New Inherited"
-msgstr "æ–°ã—ã„継承ã—ãŸã‚·ãƒ¼ãƒ³..."
+msgstr "æ–°è¦ã®ç¶™æ‰¿"
#: editor/editor_node.cpp
msgid "Load Errors"
-msgstr "読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼"
+msgstr "読込ã¿ã‚¨ãƒ©ãƒ¼"
#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp
msgid "Select"
@@ -2710,20 +2486,19 @@ msgstr "å‰ã®ã‚¨ãƒ‡ã‚£ã‚¿ã‚’é–‹ã"
#: editor/editor_plugin.cpp
msgid "Creating Mesh Previews"
-msgstr "メッシュライブラリを生æˆ"
+msgstr "メッシュプレビューを作æˆ"
#: editor/editor_plugin.cpp
msgid "Thumbnail..."
msgstr "サムãƒã‚¤ãƒ«..."
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit Plugin"
-msgstr "ãƒãƒªã‚´ãƒ³ã‚’編集"
+msgstr "プラグインã®ç·¨é›†"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
-msgstr "インストール済ã¿ã®ãƒ—ラグイン:"
+msgstr "インストール済プラグイン:"
#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
msgid "Update"
@@ -2743,15 +2518,13 @@ msgid "Status:"
msgstr "ステータス:"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit:"
-msgstr "編集"
+msgstr "編集:"
#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Start"
-msgstr "å†ç”Ÿé–‹å§‹!"
+msgstr "é–‹å§‹"
#: editor/editor_profiler.cpp
msgid "Measure:"
@@ -2771,82 +2544,95 @@ msgstr "フレーム %"
#: editor/editor_profiler.cpp
msgid "Physics Frame %"
-msgstr "固定フレーム %"
+msgstr "物ç†ãƒ•レーム %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "時間:"
#: editor/editor_profiler.cpp
-#, fuzzy
msgid "Inclusive"
-msgstr "ã‚’å«ã‚€"
+msgstr "å«"
#: editor/editor_profiler.cpp
-#, fuzzy
msgid "Self"
msgstr "セルフ"
#: editor/editor_profiler.cpp
-#, fuzzy
msgid "Frame #:"
msgstr "フレーム #:"
#: editor/editor_profiler.cpp
-#, fuzzy
msgid "Time"
-msgstr "時間:"
+msgstr "時間"
#: editor/editor_profiler.cpp
-#, fuzzy
msgid "Calls"
-msgstr "呼ã³å‡ºã—"
+msgstr "呼出ã—"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr "オン"
#: editor/editor_properties.cpp
msgid "Layer"
-msgstr ""
+msgstr "レイヤ"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Bit %d, value %d"
-msgstr "ビット %d, 値 %d."
+msgstr "ビット %d, 値 %d"
-#: editor/editor_properties.cpp editor/property_editor.cpp
-#, fuzzy
+#: editor/editor_properties.cpp
msgid "[Empty]"
-msgstr "空を追加"
+msgstr "[空]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
#, fuzzy
-msgid "Assign.."
-msgstr "アサインã™ã‚‹"
+msgid "Assign..."
+msgstr "アサイン.."
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
#, fuzzy
+msgid "Invalid RID"
+msgstr "無効ãªãƒ‘ス"
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+"ファイルã¨ã—ã¦ä¿å­˜ã•れãŸãƒªã‚½ãƒ¼ã‚¹ã« ViewportTexture を生æˆã§ãã¾ã›ã‚“。\n"
+"リソースã¯ã‚·ãƒ¼ãƒ³ã«å±žã—ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚"
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr "ビューãƒãƒ¼ãƒˆã‚’é¸ã¶"
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr "æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New %s"
-msgstr ""
+msgstr "æ–°è¦ %s"
#: editor/editor_properties.cpp editor/property_editor.cpp
-#, fuzzy
msgid "Make Unique"
-msgstr "ボーンを生æˆ"
-
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr "ファイルシステム上ã§è¡¨ç¤º"
+msgstr "ユニーク化"
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -2856,51 +2642,46 @@ msgstr "ファイルシステム上ã§è¡¨ç¤º"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "貼り付ã‘"
#: editor/editor_properties.cpp editor/property_editor.cpp
-#, fuzzy
msgid "Convert To %s"
-msgstr "~ã«å¤‰æ›ã™ã‚‹..."
+msgstr "%s ã«å¤‰æ›"
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Open Editor"
msgstr "エディタã§é–‹ã"
#: editor/editor_properties.cpp editor/property_editor.cpp
-#, fuzzy
msgid "Selected node is not a Viewport!"
-msgstr "インãƒãƒ¼ãƒˆã™ã‚‹ãƒŽãƒ¼ãƒ‰ã‚’é¸æŠžã™ã‚‹"
+msgstr "é¸æŠžã—ãŸãƒŽãƒ¼ãƒ‰ã¯ãƒ“ューãƒãƒ¼ãƒˆã§ã¯ã‚りã¾ã›ã‚“ï¼"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "Size: "
-msgstr "セルサイズ:"
+msgstr "サイズ: "
#: editor/editor_properties_array_dict.cpp
msgid "Page: "
-msgstr ""
+msgstr "ページ: "
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Key:"
-msgstr "æ–°ã—ã„åå‰:"
+msgstr "æ–°è¦ã‚­ãƒ¼:"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Value:"
-msgstr "æ–°ã—ã„åå‰:"
+msgstr "æ–°è¦ã®å€¤:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
-msgstr ""
+msgstr "キー・値ã®ãƒšã‚¢ã‚’追加"
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -2909,7 +2690,7 @@ msgstr "アイテムを除去"
#: editor/editor_run_native.cpp
msgid "Select device from the list"
-msgstr "リストã‹ã‚‰ãƒ‡ãƒã‚¤ã‚¹ã‚’é¸æŠžã—ã¦ãã ã•ã„"
+msgstr "一覧ã‹ã‚‰ãƒ‡ãƒã‚¤ã‚¹ã‚’é¸æŠž"
#: editor/editor_run_native.cpp
msgid ""
@@ -2921,12 +2702,11 @@ msgstr ""
#: editor/editor_run_script.cpp
msgid "Write your logic in the _run() method."
-msgstr "ã‚ãªãŸã®ãƒ­ã‚¸ãƒƒã‚¯ã‚’_run() メソッドã«è¨˜è¿°ã—ã¦ãã ã•ã„."
+msgstr "ロジックを _run() メソッドã«è¨˜è¿°ã™ã‚‹ã€‚"
#: editor/editor_run_script.cpp
-#, fuzzy
msgid "There is an edited scene already."
-msgstr "æ—¢ã«ç·¨é›†ã—ãŸã‚·ãƒ¼ãƒ³ãŒã‚りã¾ã™"
+msgstr "æ—¢ã«ç·¨é›†ã•れãŸã‚·ãƒ¼ãƒ³ãŒã‚りã¾ã™ã€‚"
#: editor/editor_run_script.cpp
msgid "Couldn't instance script:"
@@ -2934,7 +2714,7 @@ msgstr "スクリプトをインスタンス化ã§ãã¾ã›ã‚“ã§ã—ãŸ:"
#: editor/editor_run_script.cpp
msgid "Did you forget the 'tool' keyword?"
-msgstr "キーワード'tool'を忘れã¦ã„ã¾ã›ã‚“ã‹ï¼Ÿ"
+msgstr "キーワード 'tool' を忘れã¦ã„ã¾ã›ã‚“ã‹ï¼Ÿ"
#: editor/editor_run_script.cpp
msgid "Couldn't run script:"
@@ -2942,11 +2722,11 @@ msgstr "スクリプトを実行ã§ãã¾ã›ã‚“ã§ã—ãŸ:"
#: editor/editor_run_script.cpp
msgid "Did you forget the '_run' method?"
-msgstr "'_run'メソッドを忘れã¦ã„ã¾ã›ã‚“ã‹ï¼Ÿ"
+msgstr "'_run' メソッドを忘れã¦ã„ã¾ã›ã‚“ã‹ï¼Ÿ"
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
-msgstr "インãƒãƒ¼ãƒˆã™ã‚‹ãƒŽãƒ¼ãƒ‰ã‚’é¸æŠžã™ã‚‹"
+msgstr "インãƒãƒ¼ãƒˆã™ã‚‹ãƒŽãƒ¼ãƒ‰ã‚’é¸æŠž"
#: editor/editor_sub_scene.cpp
msgid "Scene Path:"
@@ -2983,39 +2763,35 @@ msgstr "(ç¾åœ¨ã®ï¼‰"
#: editor/export_template_manager.cpp
msgid "Retrieving mirrors, please wait..."
-msgstr "ミラーサイトをå–å¾—ã—ã¦ã„ã¾ã™ã€‚ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„..."
+msgstr "ミラーをå–å¾—ã—ã¦ã„ã¾ã™ã€‚ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„..."
#: editor/export_template_manager.cpp
msgid "Remove template version '%s'?"
-msgstr "テンプレート ãƒãƒ¼ã‚¸ãƒ§ãƒ³'%s'を除去ã—ã¾ã™ã‹ï¼Ÿ"
+msgstr "テンプレート ãƒãƒ¼ã‚¸ãƒ§ãƒ³ '%s' を除去ã—ã¾ã™ã‹ï¼Ÿ"
#: editor/export_template_manager.cpp
msgid "Can't open export templates zip."
-msgstr "エクスãƒãƒ¼ãƒˆã€€ãƒ†ãƒ³ãƒ—レート(ZIP)ファイルを確èªã§ãã¾ã›ã‚“."
+msgstr "エクスãƒãƒ¼ãƒˆ テンプレート ZIP ファイルを開ã‘ã¾ã›ã‚“。"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Invalid version.txt format inside templates: %s."
-msgstr "テンプレート内ã®version.txt フォーマットãŒä¸æ­£ã§ã™."
+msgstr "テンプレート内㮠version.txt フォーマットãŒä¸æ­£ã§ã™: %s。"
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
-msgstr "テンプレート内ã«version.txtãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“."
+msgstr "テンプレート内㫠version.txt ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Error creating path for templates:"
-msgstr "テンプレートã®ãƒ‘ス生æˆã‚¨ãƒ©ãƒ¼\n"
+msgstr "テンプレートã®ãƒ‘ス生æˆã‚¨ãƒ©ãƒ¼:"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Extracting Export Templates"
-msgstr "エクスãƒãƒ¼ãƒˆã€€ãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆã®æŠ½å‡º"
+msgstr "エクスãƒãƒ¼ãƒˆ テンプレートã®å±•開中"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Importing:"
-msgstr "インãƒãƒ¼ãƒˆ:"
+msgstr "インãƒãƒ¼ãƒˆä¸­:"
#: editor/export_template_manager.cpp
msgid ""
@@ -3027,31 +2803,28 @@ msgstr ""
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Can't resolve."
-msgstr "解決ã§ãã¾ã›ã‚“."
+msgstr "解決ã§ãã¾ã›ã‚“。"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Can't connect."
-msgstr "接続失敗."
+msgstr "接続ã§ãã¾ã›ã‚“。"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "No response."
-msgstr "応答ãŒã‚りã¾ã›ã‚“."
+msgstr "応答ãŒã‚りã¾ã›ã‚“。"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Request Failed."
-msgstr "リクエスト失敗."
+msgstr "リクエストã¯å¤±æ•—ã—ã¾ã—ãŸã€‚"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
-msgstr "リダイレクトã®ãƒ«ãƒ¼ãƒ—."
+msgstr "リダイレクトã®ãƒ«ãƒ¼ãƒ—。"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -3060,24 +2833,25 @@ msgstr "失敗:"
#: editor/export_template_manager.cpp
msgid "Download Complete."
-msgstr "ダウンロード完了."
+msgstr "ダウンロードãŒå®Œäº†ã—ã¾ã—ãŸã€‚"
#: editor/export_template_manager.cpp
msgid ""
"Templates installation failed. The problematic templates archives can be "
"found at '%s'."
msgstr ""
+"テンプレートã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ å•題ã®ãƒ†ãƒ³ãƒ—レートã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–㯠"
+"'%s' ã«ã‚りã¾ã™ã€‚"
#: editor/export_template_manager.cpp
msgid "Error requesting url: "
-msgstr "urlã®è¦æ±‚ã«å¤±æ•—ã—ã¾ã—ãŸ: "
+msgstr "URL リクエストã®ã‚¨ãƒ©ãƒ¼: "
#: editor/export_template_manager.cpp
msgid "Connecting to Mirror..."
-msgstr "ãƒŸãƒ©ãƒ¼ã‚µã‚¤ãƒˆã«æŽ¥ç¶šä¸­..."
+msgstr "ãƒŸãƒ©ãƒ¼ã«æŽ¥ç¶šä¸­..."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Disconnected"
msgstr "切断ã•れã¾ã—ãŸ"
@@ -3095,9 +2869,8 @@ msgid "Connecting..."
msgstr "接続中..."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Can't Connect"
-msgstr "接続失敗"
+msgstr "接続ã§ãã¾ã›ã‚“"
#: editor/export_template_manager.cpp
msgid "Connected"
@@ -3118,7 +2891,7 @@ msgstr "接続エラー"
#: editor/export_template_manager.cpp
msgid "SSL Handshake Error"
-msgstr "SSLãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚¨ãƒ©ãƒ¼"
+msgstr "SSL ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚¨ãƒ©ãƒ¼"
#: editor/export_template_manager.cpp
msgid "Current Version:"
@@ -3134,95 +2907,85 @@ msgstr "ファイルã‹ã‚‰ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«"
#: editor/export_template_manager.cpp
msgid "Remove Template"
-msgstr "テンプレートを削除"
+msgstr "テンプレートを除去"
#: editor/export_template_manager.cpp
msgid "Select template file"
msgstr "ãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠž"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Export Template Manager"
-msgstr "エクスãƒãƒ¼ãƒˆã€€ãƒ†ãƒ³ãƒ—レート マãƒãƒ¼ã‚¸ãƒ£ãƒ¼"
+msgstr "テンプレートã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ マãƒãƒ¼ã‚¸ãƒ£ãƒ¼"
#: editor/export_template_manager.cpp
msgid "Download Templates"
msgstr "テンプレートをダウンロード"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr "リストã‹ã‚‰ãƒŸãƒ©ãƒ¼ã‚’é¸æŠž: "
+msgstr "リストã‹ã‚‰ãƒŸãƒ©ãƒ¼ã‚’é¸æŠž: (Shift+クリック: ブラウザã§é–‹ã)"
#: editor/file_type_cache.cpp
-#, fuzzy
msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr ""
"書ãå‡ºã—æ™‚ã«file_type_cache.cchを確èªã§ãã¾ã›ã‚“。ファイルタイプã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’"
-"ä¿å­˜ã§ãã¾ã›ã‚“!"
+"ä¿å­˜ã§ãã¾ã›ã‚“!\n"
+"ファイルタイプキャッシュをä¿å­˜ã›ãšã« file_type_cache.cch を書込ã¿ç”¨ã«é–‹ãã“ã¨"
+"ã¯ã§ãã¾ã›ã‚“ï¼"
+
+#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr "ãŠæ°—ã«å…¥ã‚Š"
#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
-msgstr "ファイルシステムã«è¦‹ã¤ã‹ã‚‰ãªã„ãŸã‚ã€'%s' ã«ç§»å‹•ã§ãã¾ã›ã‚“!"
+msgstr "ファイルシステム上㧠'%s' を見ã¤ã‘られãªã„ãŸã‚移動ã§ãã¾ã›ã‚“ï¼"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a grid of thumbnails."
-msgstr "サムãƒã‚¤ãƒ«è¡¨ç¤º"
+msgstr "アイテムをサムãƒã‚¤ãƒ«ã§ã‚°ãƒªãƒƒãƒ‰è¡¨ç¤ºã™ã‚‹ã€‚"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a list."
-msgstr "リストã§ã‚¢ã‚¤ãƒ†ãƒ ã‚’見る"
+msgstr "アイテムを一覧ã§è¡¨ç¤ºã™ã‚‹ã€‚"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
-"\n"
-"状æ³: ファイルã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚ファイルを修正ã—ã¦æ‰‹å‹•ã§å†ã‚¤ãƒ³ãƒãƒ¼"
-"トã—ã¦ä¸‹ã•ã„。"
+"ステータス: ファイルã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚ファイルを修正ã—ã¦æ‰‹å‹•ã§å†ã‚¤"
+"ンãƒãƒ¼ãƒˆã—ã¦ä¸‹ã•ã„。"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Cannot move/rename resources root."
-msgstr "ソースã®ãƒ•ォントを読ã¿è¾¼ã¿/処ç†ã§ãã¾ã›ã‚“."
+msgstr "ルートã®ãƒªã‚½ãƒ¼ã‚¹ã¯ç§»å‹•・リãƒãƒ¼ãƒ ã§ãã¾ã›ã‚“。"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Cannot move a folder into itself."
-msgstr "åŒã˜ãƒ•ァイルã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã§ãã¾ã›ã‚“:"
+msgstr "フォルダをフォルダ自身ã®ä¸­ã«ç§»å‹•ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Error moving:"
-msgstr "エラーをインãƒãƒ¼ãƒˆä¸­:"
+msgstr "移動中ã®ã‚¨ãƒ©ãƒ¼:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Error duplicating:"
-msgstr "読ã¿è¾¼ã¿å¤±æ•—:"
+msgstr "複製エラー:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Unable to update dependencies:"
-msgstr "シーン'%s' ã¯ä¾å­˜é–¢ä¿‚ãŒå£Šã‚Œã¦ã„ã¾ã™:"
+msgstr "ä¾å­˜é–¢ä¿‚ã‚’æ›´æ–°ã§ãã¾ã›ã‚“:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "åå‰ãŒã‚りã¾ã›ã‚“"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "åå‰ãŒä»˜ã„ã¦ã„ã¾ã›ã‚“。"
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
-msgstr "åå‰ãŒä½¿ç”¨ä¸å¯èƒ½ãªæ–‡å­—ã‚’å«ã‚“ã§ã„ã¾ã™"
-
-#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "åå‰ãŒã‚りã¾ã›ã‚“."
+msgstr "åå‰ã«ä½¿ç”¨ã§ããªã„文字ãŒå«ã¾ã‚Œã¦ã„ã¾ã™"
#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
-msgstr "åå‰ãŒä½¿ç”¨ä¸å¯èƒ½ãªæ–‡å­—ã‚’å«ã‚“ã§ã„ã¾ã™."
+msgstr "åå‰ã«ä½¿ç”¨ã§ããªã„文字ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚"
#: editor/filesystem_dock.cpp
msgid "A file or folder with this name already exists."
@@ -3237,33 +3000,14 @@ msgid "Renaming folder:"
msgstr "フォルダåを変更:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Duplicating file:"
-msgstr "複製"
+msgstr "ファイルを複製:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Duplicating folder:"
-msgstr "フォルダåを変更:"
+msgstr "フォルダを複製:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "ã™ã¹ã¦å±•é–‹ã™ã‚‹"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "ã™ã¹ã¦æŠ˜ã‚ŠãŸãŸã‚€"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "åå‰ã‚’変更ã™ã‚‹..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "~ã¸ç§»å‹•ã™ã‚‹..."
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open Scene(s)"
msgstr "シーンを開ã"
@@ -3272,28 +3016,48 @@ msgid "Instance"
msgstr "インスタンス"
#: editor/filesystem_dock.cpp
+msgid "Add to favorites"
+msgstr "ãŠæ°—ã«å…¥ã‚Šã«è¿½åŠ "
+
+#: editor/filesystem_dock.cpp
+msgid "Remove from favorites"
+msgstr "ãŠæ°—ã«å…¥ã‚Šã‹ã‚‰å‰Šé™¤"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
-msgstr "ä¾å­˜é–¢ä¿‚を編集..."
+msgstr "ä¾å­˜é–¢ä¿‚ã®ç·¨é›†..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View Owners..."
-msgstr "オーナーを見る..."
+msgstr "所有者を見る..."
+
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "åå‰ã‚’変更..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Duplicate..."
-msgstr "複製"
+msgstr "複製..."
#: editor/filesystem_dock.cpp
-#, fuzzy
+msgid "Move To..."
+msgstr "移動..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
-msgstr "æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト"
+msgstr "æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "~ã¨ã„ã†åå‰ã§ãƒªã‚½ãƒ¼ã‚¹ã‚’ä¿å­˜ã™ã‚‹"
+msgstr "æ–°è¦ãƒªã‚½ãƒ¼ã‚¹..."
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr "ã™ã¹ã¦å±•é–‹"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr "ã™ã¹ã¦æŠ˜ã‚ŠãŸãŸã‚€"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3312,301 +3076,241 @@ msgstr "次ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª"
#: editor/filesystem_dock.cpp
msgid "Re-Scan Filesystem"
-msgstr "ファイルシステムをå†èµ°æŸ»"
+msgstr "ファイルシステムをå†ã‚¹ã‚­ãƒ£ãƒ³"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "フォルダã®çŠ¶æ…‹ã‚’ãŠæ°—ã«å…¥ã‚Šã«å¤‰æ›´"
+msgid "Toggle split mode"
+msgstr "分割モード切り替ãˆ"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Show current scene file."
-msgstr "ç¾åœ¨ç·¨é›†ä¸­ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’ä¿å­˜ã™ã‚‹"
+msgid "Search files"
+msgstr "ファイル検索"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Instance the selected scene(s) as child of the selected node."
-msgstr "é¸æŠžã—ãŸãƒŽãƒ¼ãƒ‰ã®å­ã¨ã—ã¦ã€é¸æŠžã—ãŸã‚·ãƒ¼ãƒ³ã‚’インスタンス化ã™ã‚‹"
-
-#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "ã‚¯ãƒ©ã‚¹ã®æ¤œç´¢"
+msgstr "é¸æŠžã—ãŸã‚·ãƒ¼ãƒ³ã‚’é¸æŠžã—ãŸãƒŽãƒ¼ãƒ‰ã®å­ã¨ã—ã¦ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹åŒ–ã—ã¾ã™ã€‚"
#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
msgstr ""
-"ファイルをスキャンã—ã¦ã„ã¾ã™\n"
+"ファイルã®ã‚¹ã‚­ãƒ£ãƒ³ä¸­\n"
"ã—ã°ã‚‰ããŠå¾…ã¡ä¸‹ã•ã„..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "移動"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "There is already file or folder with the same name in this location."
-msgstr "ã“ã®ãƒ‘スã«ã¯ã€æŒ‡å®šã•れãŸåå‰ã®ãƒ•ã‚©ãƒ«ãƒ€ãƒ¼ãŒæ—¢ã«å­˜åœ¨ã—ã¾ã™ã€‚"
+msgstr "ã“ã®ãƒ‘スã«ã¯ã€æ—¢ã«åŒåã®ãƒ•ァイルã‹ãƒ•ォルダãŒã‚りã¾ã™ã€‚"
#: editor/filesystem_dock.cpp
msgid "Overwrite"
-msgstr ""
+msgstr "上書ã"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
-msgstr "スクリプトを作æˆ"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find in files"
-msgstr "タイルを探ã™"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find: "
-msgstr "検索"
+msgstr "スクリプト作æˆ"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Whole words"
-msgstr "å˜èªžå…¨ä½“"
+msgid "Find in Files"
+msgstr "ファイル内検索"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "å¤§æ–‡å­—å°æ–‡å­—を区別ã™ã‚‹"
+msgid "Find:"
+msgstr "検索:"
#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "フォルダ:"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Filter: "
+msgid "Filters:"
msgstr "フィルター:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Find..."
msgstr "検索..."
#: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp
msgid "Replace..."
-msgstr "ç½®ãæ›ãˆ..."
+msgstr "ç½®æ›..."
#: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp
msgid "Cancel"
msgstr "キャンセル"
#: editor/find_in_files.cpp
-#, fuzzy
+msgid "Find: "
+msgstr "検索: "
+
+#: editor/find_in_files.cpp
msgid "Replace: "
-msgstr "ç½®æ›"
+msgstr "ç½®æ›: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace all (no undo)"
-msgstr "ã™ã¹ã¦ç½®æ›"
+msgstr "ã™ã¹ã¦ç½®æ›ï¼ˆã‚¢ãƒ³ãƒ‰ã‚¥ä¸å¯ï¼‰"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Searching..."
-msgstr "ä¿å­˜ä¸­..."
+msgstr "検索中..."
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Search complete"
-msgstr "テキストを探ã™"
+msgstr "検索完了"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group name already exists."
-msgstr "エラー:アニメーションã®åå‰ãŒã™ã§ã«ã‚ã‚‹åå‰ã§ã™!"
+msgstr "グループåãŒæ—¢ã«ã‚りã¾ã™ã€‚"
#: editor/groups_editor.cpp
-#, fuzzy
-msgid "invalid Group name."
-msgstr "無効ãªåå‰ã§ã™."
+msgid "Invalid group name."
+msgstr "無効ãªã‚°ãƒ«ãƒ¼ãƒ—åã§ã™ã€‚"
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "グループ"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes not in Group"
-msgstr "グループã«åŠ ãˆã‚‹"
+msgstr "グループã«ãªã„ノード"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Filter nodes"
-msgstr "フィルター"
+msgstr "フィルタノード"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes in Group"
-msgstr "グループを編集"
+msgstr "グループ内ノード"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Add to Group"
-msgstr "グループã«åŠ ãˆã‚‹"
+msgstr "グループã«è¿½åŠ "
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Remove from Group"
-msgstr "グループã‹ã‚‰å–り除ã"
+msgstr "グループã‹ã‚‰é™¤åŽ»"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Manage Groups"
-msgstr "グループ"
+msgstr "グループã®ç®¡ç†"
#: editor/import/resource_importer_scene.cpp
-#, fuzzy
msgid "Import as Single Scene"
-msgstr "シーンをインãƒãƒ¼ãƒˆä¸­..."
+msgstr "å˜ä¸€ã®ã‚·ãƒ¼ãƒ³ã¨ã—ã¦èª­è¾¼ã‚€"
#: editor/import/resource_importer_scene.cpp
-#, fuzzy
msgid "Import with Separate Animations"
-msgstr "アニメーションをインãƒãƒ¼ãƒˆ..."
+msgstr "アニメーションを別々ã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Materials"
-msgstr "別ã®ãƒžãƒ†ãƒªã‚¢ãƒ«ã¨ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
+msgstr "マテリアルを別々ã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects"
-msgstr "別ã®ã‚ªãƒ–ジェクトã¨ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
+msgstr "オブジェクトを別々ã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects+Materials"
-msgstr "別ã®ã‚ªãƒ–ジェクトã€ãƒžãƒ†ãƒªã‚¢ãƒ«ã¨ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
+msgstr "オブジェクト+マテリアルを別々ã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects+Animations"
-msgstr "別ã®ã‚ªãƒ–ジェクトã€ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã¨ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
+msgstr "オブジェクト+アニメーションを別々ã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Materials+Animations"
-msgstr "別ã®ãƒžãƒ†ãƒªã‚¢ãƒ«ã€ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã¨ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
+msgstr "マテリアル+アニメーションを別々ã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects+Materials+Animations"
-msgstr "別ã®ã‚ªãƒ–ジェクトã€ãƒžãƒ†ãƒªã‚¢ãƒ«ã€ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã¨ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
+msgstr "オブジェクト+マテリアル+アニメーションを別々ã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
#: editor/import/resource_importer_scene.cpp
-#, fuzzy
msgid "Import as Multiple Scenes"
-msgstr "3Dシーンをインãƒãƒ¼ãƒˆ"
+msgstr "複数ã®ã‚·ãƒ¼ãƒ³ã¨ã—ã¦ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Multiple Scenes+Materials"
-msgstr "複数ã®ã‚·ãƒ¼ãƒ³ã€ãƒžãƒ†ãƒªã‚¢ãƒ«ã¨ã—ã¦ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
+msgstr "複数ã®ã‚·ãƒ¼ãƒ³ï¼‹ãƒžãƒ†ãƒªã‚¢ãƒ«ã¨ã—ã¦ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
#: editor/import/resource_importer_scene.cpp
#: editor/plugins/mesh_library_editor_plugin.cpp
-#, fuzzy
msgid "Import Scene"
msgstr "シーンをインãƒãƒ¼ãƒˆ"
#: editor/import/resource_importer_scene.cpp
-#, fuzzy
msgid "Importing Scene..."
msgstr "シーンをインãƒãƒ¼ãƒˆä¸­..."
#: editor/import/resource_importer_scene.cpp
-#, fuzzy
msgid "Generating Lightmaps"
-msgstr "ライトマップã¸ã®è»¢å†™:"
+msgstr "ライトマップã®ç”Ÿæˆ"
#: editor/import/resource_importer_scene.cpp
-#, fuzzy
msgid "Generating for Mesh: "
-msgstr "軸平行境界ボックス(AABB)を生æˆ"
+msgstr "メッシュã®ç”Ÿæˆ: "
#: editor/import/resource_importer_scene.cpp
-#, fuzzy
msgid "Running Custom Script..."
-msgstr "カスタムスクリプトを実行中"
+msgstr "カスタムスクリプトã®å®Ÿè¡Œä¸­..."
#: editor/import/resource_importer_scene.cpp
-#, fuzzy
msgid "Couldn't load post-import script:"
-msgstr "æ—¢ã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ãŸã‚¹ã‚¯ãƒªãƒ—トを読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ:"
+msgstr "インãƒãƒ¼ãƒˆæ¸ˆã®ã‚¹ã‚¯ãƒªãƒ—トを読込ã‚ã¾ã›ã‚“ã§ã—ãŸï¼š"
#: editor/import/resource_importer_scene.cpp
-#, fuzzy
msgid "Invalid/broken script for post-import (check console):"
-msgstr ""
-"無効ãª/壊れãŸã‚¤ãƒ³ãƒãƒ¼ãƒˆæ¸ˆã¿ã®ã‚¹ã‚¯ãƒªãƒ—ト(コンソールをãƒã‚§ãƒƒã‚¯ã—ã¦ãã ã•ã„)"
+msgstr "無効・壊れãŸã‚¤ãƒ³ãƒãƒ¼ãƒˆæ¸ˆã‚¹ã‚¯ãƒªãƒ—ト(コンソールを確èªã—ã¦ãã ã•ã„):"
#: editor/import/resource_importer_scene.cpp
-#, fuzzy
msgid "Error running post-import script:"
-msgstr "インãƒãƒ¼ãƒˆæ¸ˆã¿ã®ã‚¹ã‚¯ãƒªãƒ—ト実行エラー"
+msgstr "インãƒãƒ¼ãƒˆæ¸ˆã‚¹ã‚¯ãƒªãƒ—トã®å®Ÿè¡Œä¸­ã«ã‚¨ãƒ©ãƒ¼:"
#: editor/import/resource_importer_scene.cpp
-#, fuzzy
msgid "Saving..."
msgstr "ä¿å­˜ä¸­..."
#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
-msgstr "'%s'ã®ãƒ‡ãƒ•ォルトã¨ã—ã¦è¨­å®š"
+msgstr "'%s' ã®ãƒ‡ãƒ•ォルトã¨ã—ã¦è¨­å®š"
#: editor/import_dock.cpp
msgid "Clear Default for '%s'"
-msgstr "'%s'ã®ãƒ‡ãƒ•ォルトを消去"
+msgstr "'%s' ã®ãƒ‡ãƒ•ォルトをクリア"
#: editor/import_dock.cpp
-#, fuzzy
msgid " Files"
-msgstr "ファイル:"
+msgstr " ファイル"
#: editor/import_dock.cpp
-#, fuzzy
msgid "Import As:"
-msgstr "~ã¨ã—ã¦ã‚¤ãƒ³ãƒãƒ¼ãƒˆ:"
+msgstr "åå‰ã‚’付ã‘ã¦ã‚¤ãƒ³ãƒãƒ¼ãƒˆ:"
#: editor/import_dock.cpp editor/property_editor.cpp
msgid "Preset..."
-msgstr "åˆæœŸè¨­å®šå€¤..."
+msgstr "プリセット..."
#: editor/import_dock.cpp
-#, fuzzy
msgid "Reimport"
msgstr "å†ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Failed to load resource."
-msgstr "リソース読ã¿è¾¼ã¿å¤±æ•—"
-
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "オッケー"
+msgstr "リソースã®èª­è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
#: editor/inspector_dock.cpp
-#, fuzzy
-msgid "Expand all properties"
-msgstr "ã™ã¹ã¦å±•é–‹ã™ã‚‹"
+msgid "Expand All Properties"
+msgstr "ã™ã¹ã¦ã®ãƒ—ロパティを展開"
#: editor/inspector_dock.cpp
-#, fuzzy
-msgid "Collapse all properties"
-msgstr "ã™ã¹ã¦æŠ˜ã‚ŠãŸãŸã‚€"
+msgid "Collapse All Properties"
+msgstr "ã™ã¹ã¦ã®ãƒ—ロパティを折りãŸãŸã‚€"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -3614,192 +3318,169 @@ msgid "Save As..."
msgstr "åå‰ã‚’付ã‘ã¦ä¿å­˜..."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Copy Params"
-msgstr "パラメーターをコピーã™ã‚‹"
+msgstr "パラメーターをコピー"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Paste Params"
-msgstr "パラメーターを張り付ã‘ã‚‹"
+msgstr "パラメーターを貼り付ã‘"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Edit Resource Clipboard"
-msgstr "リソースã®ã‚¯ãƒªãƒƒãƒ—ボードã¯ç©ºã§ã™!"
+msgstr "リソースã®ã‚¯ãƒªãƒƒãƒ—ボードを編集"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Copy Resource"
-msgstr "リソースをコピーã™ã‚‹"
+msgstr "リソースをコピー"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Make Built-In"
-msgstr "ビルトインを作る"
+msgstr "ビルトインを作æˆ"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Make Sub-Resources Unique"
-msgstr "一æ„ã®ï¼ˆï¼ä»–ã¨é‡è¤‡ã—ãªã„)サブリソースを生æˆ"
+msgstr "ユニークãªã‚µãƒ–リソースを生æˆ"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Open in Help"
-msgstr "ヘルプを開ã"
+msgstr "ヘルプã§é–‹ã"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Create a new resource in memory and edit it."
-msgstr "ãƒ¡ãƒ¢ãƒªãƒ¼ã«æ–°ã—ã„リソースを確ä¿ã—編集ã™ã‚‹"
+msgstr "æ–°è¦ãƒªã‚½ãƒ¼ã‚¹ã‚’メモリ上ã«ä½œæˆã—ã¦ç·¨é›†ã™ã‚‹ã€‚"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Load an existing resource from disk and edit it."
-msgstr "既存ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’ディスクã‹ã‚‰èª­ã¿è¾¼ã¿ç·¨é›†ã™ã‚‹"
+msgstr "既存ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’ディスクã‹ã‚‰èª­è¾¼ã¿ç·¨é›†ã™ã‚‹ã€‚"
+
+#: editor/inspector_dock.cpp
+#, fuzzy
+msgid "Save the currently edited resource."
+msgstr "ç¾åœ¨ç·¨é›†ä¸­ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’ä¿å­˜ã™ã‚‹"
#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
-msgstr "以å‰ã«ç·¨é›†ã—ãŸã‚ªãƒ–ジェクト履歴ã§ã€Œã²ã¨ã¤å‰ã€ã«ç§»å‹•."
+msgstr "履歴内ã®ç·¨é›†æ¸ˆã‚ªãƒ–ジェクトをå‰ã¸ã€‚"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Go to the next edited object in history."
-msgstr "以å‰ã«ç·¨é›†ã—ãŸã‚ªãƒ–ジェクト履歴ã§ã€Œæ¬¡ã€ã«ç§»å‹•."
+msgstr "履歴内ã®ç·¨é›†æ¸ˆã‚ªãƒ–ジェクトを次ã¸ã€‚"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "History of recently edited objects."
-msgstr "最近編集ã—ãŸã‚ªãƒ–ジェクトã®å±¥æ­´"
+msgstr "最近編集ã—ãŸã‚ªãƒ–ジェクトã®å±¥æ­´ã€‚"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Object properties."
-msgstr "オブジェクトã®ãƒ—ロパティ"
+msgstr "オブジェクトã®ãƒ—ロパティ。"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Filter properties"
-msgstr "フィルター"
+msgstr "フィルタプロパティ"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Changes may be lost!"
-msgstr "ベクトル定数を変更"
+msgstr "変更ãŒå¤±ã‚れるã‹ã‚‚ã—れã¾ã›ã‚“ï¼"
#: editor/multi_node_edit.cpp
msgid "MultiNode Set"
-msgstr "複数ノード セット"
+msgstr "マルãƒãƒŽãƒ¼ãƒ‰ セット"
#: editor/node_dock.cpp
-#, fuzzy
msgid "Select a Node to edit Signals and Groups."
-msgstr "シグナルã¨ã‚°ãƒ«ãƒ¼ãƒ—を編集ã™ã‚‹ãŸã‚ãƒŽãƒ¼ãƒ‰ã‚’é¸æŠž"
+msgstr "シグナルã¨ã‚°ãƒ«ãƒ¼ãƒ—を編集ã™ã‚‹ãƒŽãƒ¼ãƒ‰ã‚’é¸æŠžã€‚"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Edit a Plugin"
-msgstr "ãƒãƒªã‚´ãƒ³ã‚’編集"
+msgstr "プラグインã®ç·¨é›†"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Create a Plugin"
-msgstr "アウトラインを生æˆ"
+msgstr "プラグインã®ä½œæˆ"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Plugin Name:"
-msgstr "プラグイン"
+msgstr "プラグインå:"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
-msgstr ""
+msgstr "サブフォルダ:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Language:"
-msgstr "言語"
+msgstr "言語:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Script Name:"
-msgstr "スクリプトã¯å•題ã‚りã¾ã›ã‚“"
+msgstr "スクリプトå:"
#: editor/plugin_config_dialog.cpp
msgid "Activate now?"
-msgstr ""
+msgstr "今ã™ãアクティブ化?"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
msgstr "ãƒãƒªã‚´ãƒ³ã‚’生æˆ"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+msgid "Edit Polygon"
msgstr "ãƒãƒªã‚´ãƒ³ã‚’編集"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
msgid "Insert Point"
-msgstr "挿入"
+msgstr "ãƒã‚¤ãƒ³ãƒˆæŒ¿å…¥"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Edit Poly (Remove Point)"
-msgstr "ãƒãƒªã‚´ãƒ³ã‚’編集(ãƒã‚¤ãƒ³ãƒˆï¼ç‚¹ã‚’除去)"
+msgid "Edit Polygon (Remove Point)"
+msgstr "ãƒãƒªã‚´ãƒ³ã‚’編集(点を除去)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
-msgstr "ãƒãƒªã‚´ãƒ³ã¨ãƒã‚¤ãƒ³ãƒˆã‚’除去"
+msgid "Remove Polygon And Point"
+msgstr "ãƒãƒªã‚´ãƒ³ã¨ç‚¹ã‚’除去"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
-msgid "Create a new polygon from scratch"
-msgstr "æ–°è¦ã«ãƒãƒªã‚´ãƒ³ã‚’生æˆã™ã‚‹"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr "点を作æˆã™ã‚‹ã€‚"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
-"ãƒãƒªã‚´ãƒ³ã‚’編集:\n"
-"LMB: ãƒã‚¤ãƒ³ãƒˆã‚’移動.\n"
-"Ctrl+LMB: セグメント分割.\n"
-"RMB: ãƒã‚¤ãƒ³ãƒˆé™¤åŽ»."
+"点を編集ã™ã‚‹ã€‚\n"
+"左クリック: 点を移動\n"
+"å³ã‚¯ãƒªãƒƒã‚¯: 点を削除"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#, fuzzy
-msgid "Delete points"
-msgstr "ãƒã‚¤ãƒ³ãƒˆï¼ç‚¹ã‚’除去"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr "点を消ã™ã€‚"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Add Animation"
-msgstr "アニメーションを加ãˆã‚‹"
+msgstr "アニメーションを追加"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
-msgstr "読ã¿è¾¼ã‚€"
+msgid "Load..."
+msgstr "読込む.."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "This type of node can't be used. Only root nodes are allowed."
-msgstr ""
+msgstr "ã“ã®ã‚¿ã‚¤ãƒ—ã®ãƒŽãƒ¼ãƒ‰ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。ルートノードã®ã¿ãŒè¨±å¯ã•れã¾ã™ã€‚"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3809,96 +3490,88 @@ msgid ""
"AnimationTree is inactive.\n"
"Activate to enable playback, check node warnings if activation fails."
msgstr ""
+"アニメーションツリーãŒéžã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã§ã™ã€‚\n"
+"å†ç”Ÿã‚’有効ã«ã™ã‚‹ãŸã‚ã«ã‚¢ã‚¯ãƒ†ã‚£ãƒ™ãƒ¼ãƒˆã—ã¾ã™ã€‚アクティベートã«å¤±æ•—ã—ãŸå ´åˆã¯"
+"ノードã®è­¦å‘Šã‚’確èªã—ã¦ãã ã•ã„。"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Set the blending position within the space"
-msgstr ""
+msgstr "スペース内ã®ãƒ–レンドä½ç½®ã‚’設定"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Select and move points, create points with RMB."
-msgstr ""
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "ãƒã‚¤ãƒ³ãƒˆï¼ç‚¹ã‚’除去"
+msgstr "ç‚¹ã‚’é¸æŠžã—ã¦ç§»å‹•ã—ã€å³ã‚¯ãƒªãƒƒã‚¯ã§ç‚¹ã‚’作æˆã—ã¾ã™ã€‚"
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "マウスå³ãƒœã‚¿ãƒ³:ãƒã‚¤ãƒ³ãƒˆï¼ç‚¹ã‚’除去."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr "スナップã¨ã‚°ãƒªãƒƒãƒ‰ã®è¡¨ç¤ºã‚’有効ã«ã™ã‚‹ã€‚"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Point"
-msgstr "ãƒã‚¤ãƒ³ãƒˆã‚’移動"
+msgstr "点"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Open Animation Node"
-msgstr "アニメーションã®ãƒŽãƒ¼ãƒ‰"
+msgstr "アニメーションノードを開ã"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists"
-msgstr "アクション'%s'ã¯æ—¢ã«ã‚りã¾ã™!"
+msgstr "ä¸‰è§’å½¢ãŒæ—¢ã«å­˜åœ¨ã—ã¾ã™"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "BlendSpace2D does not belong to an AnimationTree node."
-msgstr ""
+msgstr "ブレンドシェイプ2Dã¯ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãƒ„リー ノードã«å±žã—ã¾ã›ã‚“。"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "No triangles exist, so no blending can take place."
-msgstr ""
+msgstr "三角形ãŒå­˜åœ¨ã—ãªã„ãŸã‚ã€ãƒ–レンドã§ãã¾ã›ã‚“。"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create triangles by connecting points."
-msgstr ""
+msgstr "点を繋ã„ã§ä¸‰è§’形を作æˆã™ã‚‹ã€‚"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Erase points and triangles."
-msgstr "%d 三角形をパース中ã§ã™:"
+msgstr "点ã¨ä¸‰è§’形を消ã™ã€‚"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Generate blend triangles automatically (instead of manually)"
-msgstr ""
+msgstr "自動的ã«ãƒ–レンド三角形を生æˆ"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr "スナップ"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "ブレンド:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filters"
-msgstr "ノードフィルターã®ç·¨é›†"
+msgstr "フィルタã®ç·¨é›†"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Output node can't be added to the blend tree."
-msgstr ""
+msgstr "出力ノードをブレンドツリーã«è¿½åŠ ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Unable to connect, port may be in use or connection may be invalid."
-msgstr ""
+msgstr "接続ã§ãã¾ã›ã‚“。ãƒãƒ¼ãƒˆãŒä½¿ç”¨ä¸­ã‹ã€æŽ¥ç¶šãŒç„¡åйã§ã‚ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
msgstr ""
+"アニメーションプレイヤーãŒè¨­å®šã•れã¦ã„ãªã„ãŸã‚ã€ãƒˆãƒ©ãƒƒã‚¯åã‚’å–å¾—ã§ãã¾ã›ã‚“。"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Player path set is invalid, so unable to retrieve track names."
-msgstr ""
+msgstr "プレイヤーã®ãƒ‘ス設定ãŒç„¡åйãªãŸã‚ã€ãƒˆãƒ©ãƒƒã‚¯åã‚’å–å¾—ã§ãã¾ã›ã‚“。"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
@@ -3906,43 +3579,38 @@ msgid ""
"Animation player has no valid root node path, so unable to retrieve track "
"names."
msgstr ""
+"ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒ¤ãƒ¼ã«æœ‰åйãªãƒ«ãƒ¼ãƒˆãƒŽãƒ¼ãƒ‰ã®ãƒ‘スãŒãªã„ãŸã‚ã€ãƒˆãƒ©ãƒƒã‚¯åã‚’å–"
+"å¾—ã§ãã¾ã›ã‚“。"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Add Node.."
-msgstr "ノードを加ãˆã‚‹"
+msgid "Add Node..."
+msgstr "ノードを追加..."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filtered Tracks:"
-msgstr "ノードフィルターã®ç·¨é›†"
+msgstr "フィルタリング済トラックã®ç·¨é›†:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Enable filtering"
-msgstr "編集å¯èƒ½ãªå­"
+msgstr "フィルタリングを有効化"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Toggle Autoplay"
-msgstr "オートプレイを切替"
+msgstr "自動å†ç”Ÿã®åˆ‡ã‚Šæ›¿ãˆ"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "New Animation Name:"
-msgstr "æ–°ã—ã„アニメーションã®åå‰:"
+msgstr "æ–°è¦ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³å:"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "New Anim"
-msgstr "æ–°ã—ã„アニメーション"
+msgstr "æ–°è¦ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Change Animation Name:"
-msgstr "アニメーションã®åå‰ã‚’変更:"
+msgstr "アニメーションåを変更:"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Delete Animation?"
@@ -3950,19 +3618,16 @@ msgstr "アニメーションを削除ã—ã¾ã™ã‹ï¼Ÿ"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Remove Animation"
-msgstr "アニメーションを削除"
+msgstr "アニメーションを除去"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Invalid animation name!"
-msgstr "エラー:アニメーションã®åå‰ãŒä¸æ­£ã§ã™!"
+msgstr "アニメーションåãŒç„¡åйã§ã™ï¼"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Animation name already exists!"
-msgstr "エラー:アニメーションã®åå‰ãŒã™ã§ã«ã‚ã‚‹åå‰ã§ã™!"
+msgstr "アニメーションåã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™ï¼"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -3970,85 +3635,70 @@ msgid "Rename Animation"
msgstr "アニメーションã®åå‰ã‚’変更"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Blend Next Changed"
-msgstr "ブレンドã™ã‚‹å¯¾è±¡ã‚’変更"
+msgstr "次ã®å¤‰æ›´ã‚’ブレンド"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Change Blend Time"
-msgstr "ブレンドã™ã‚‹æ™‚間を変更"
+msgstr "ブレンド時間ã®å¤‰æ›´"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Load Animation"
-msgstr "アニメーションを読ã¿è¾¼ã¿"
+msgstr "アニメーション読込ã¿"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Duplicate Animation"
msgstr "アニメーションを複製"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to copy!"
-msgstr "エラー:アニメーションã®è¤‡è£½å…ƒãŒã‚りã¾ã›ã‚“"
+msgstr "コピーã™ã‚‹ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãŒã‚りã¾ã›ã‚“ï¼"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation resource on clipboard!"
-msgstr "エラー:クリップボードã«ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®ãƒªã‚½ãƒ¼ã‚¹ãŒã‚りã¾ã›ã‚“"
+msgstr "クリップボードã«ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®ãƒªã‚½ãƒ¼ã‚¹ãŒã‚りã¾ã›ã‚“ï¼"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
msgstr "貼り付ã‘ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Paste Animation"
-msgstr "アニメーションを貼り付ã‘ã‚‹"
+msgstr "アニメーションを貼り付ã‘"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to edit!"
-msgstr "エラー:編集ã™ã‚‹ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãŒã‚りã¾ã›ã‚“!"
+msgstr "編集ã™ã‚‹ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãŒã‚りã¾ã›ã‚“ï¼"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
-msgstr "é¸æŠžã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ç¾æ™‚点ã‹ã‚‰å·»ã戻ã—å†ç”Ÿ(A)"
+msgstr "é¸æŠžã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ç¾åœ¨ã®ä½ç½®ã‹ã‚‰é€†å†ç”Ÿã™ã‚‹ã€‚(A)"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Play selected animation backwards from end. (Shift+A)"
-msgstr "é¸æŠžã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’最後ã‹ã‚‰å·»ã戻ã—å†ç”Ÿ (Shift+A)"
+msgstr "é¸æŠžã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’最後ã‹ã‚‰é€†å†ç”Ÿã™ã‚‹ã€‚(Shift+A)"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Stop animation playback. (S)"
-msgstr "アニメーションå†ç”Ÿã‚’中止(S)"
+msgstr "アニメーションã®å†ç”Ÿã‚’åœæ­¢ã™ã‚‹ã€‚(S)"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Play selected animation from start. (Shift+D)"
-msgstr "é¸æŠžã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’最åˆã‹ã‚‰å†ç”Ÿ(Shift+D)"
+msgstr "é¸æŠžã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’最åˆã‹ã‚‰å†ç”Ÿã™ã‚‹ã€‚(Shift+D)"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Play selected animation from current pos. (D)"
-msgstr "é¸æŠžã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ç¾æ™‚点ã‹ã‚‰å†ç”Ÿ(D)"
+msgstr "é¸æŠžã—ãŸã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ç¾åœ¨ã®ä½ç½®ã‹ã‚‰å†ç”Ÿã™ã‚‹ã€‚(D)"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Animation position (in seconds)."
-msgstr "アニメーションã®çµŒéŽæ™‚é–“(秒)"
+msgstr "アニメーションã®ä½ç½®ï¼ˆç§’)。"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Scale animation playback globally for the node."
-msgstr "ノードã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³å†ç”Ÿã®ç¸®å°ºå¤‰æ›´."
+msgstr "ノードã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³å†ç”Ÿã‚’グローãƒãƒ«ã«ã‚¹ã‚±ãƒ¼ãƒªãƒ³ã‚°ã™ã‚‹ã€‚"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Animation Tools"
msgstr "アニメーションツール"
@@ -4059,27 +3709,23 @@ msgstr "アニメーション"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "New"
-msgstr "æ–°è¦ä½œæˆ"
+msgstr "æ–°è¦"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Transitions..."
-msgstr "é·ç§»ï¼ˆãƒˆãƒ©ãƒ³ã‚¸ã‚·ãƒ§ãƒ³ï¼‰"
+msgstr "トランジションã®ç·¨é›†..."
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Open in Inspector"
-msgstr "エディタã§é–‹ã"
+msgstr "インスペクタã§é–‹ã"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Display list of animations in player."
-msgstr "プレイヤーã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãƒªã‚¹ãƒˆã‚’表示ã™ã‚‹"
+msgstr "プレーヤーã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãƒªã‚¹ãƒˆã‚’表示ã™ã‚‹ã€‚"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Autoplay on Load"
-msgstr "読ã¿è¾¼ã¿å¾Œã€è‡ªå‹•å†ç”Ÿ"
+msgstr "読込ã¿å¾Œã€è‡ªå‹•å†ç”Ÿ"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Onion Skinning"
@@ -4090,35 +3736,32 @@ msgid "Enable Onion Skinning"
msgstr "オニオンスキンを有効ã«ã™ã‚‹"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Directions"
-msgstr "セクション:"
+msgstr "æ–¹å‘"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Past"
-msgstr "貼り付ã‘"
+msgstr "éŽåŽ»"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Future"
-msgstr "テクスãƒãƒ£"
+msgstr "未æ¥"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Depth"
-msgstr "奥行ã"
+msgstr "深度"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "1 step"
-msgstr "1ステップ"
+msgstr "1ステップ"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "2 steps"
-msgstr "2ステップ"
+msgstr "2ステップ"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "3 steps"
-msgstr "3ステップ"
+msgstr "3ステップ"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Differences Only"
@@ -4133,18 +3776,16 @@ msgid "Include Gizmos (3D)"
msgstr "ギズモ(3D)ã‚’å«ã‚€"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Pin AnimationPlayer"
-msgstr "アニメーションを貼り付ã‘ã‚‹"
+msgstr "アニメーションプレーヤーを固定"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Create New Animation"
-msgstr "アニメーションを新ã—ã作る"
+msgstr "アニメーションを新è¦ä½œæˆ"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation Name:"
-msgstr "アニメーションã®åå‰:"
+msgstr "アニメーションå:"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
@@ -4152,39 +3793,35 @@ msgstr "アニメーションã®åå‰:"
#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
#: editor/script_create_dialog.cpp
msgid "Error!"
-msgstr "エラー!"
+msgstr "エラーï¼"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Blend Times:"
-msgstr "ブレンドã®å›žæ•°:"
+msgstr "ブレンド時間:"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Next (Auto Queue):"
-msgstr "次(オートキュー)"
+msgstr "次(自動キュー):"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Cross-Animation Blend Times"
-msgstr "アニメーション間ã®ãƒ–レンド回数"
+msgstr "アニメーション間ã®ãƒ–レンド時間"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "End"
-msgstr "終了"
+msgstr "終り"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Immediate"
-msgstr ""
+msgstr "å³åº§"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Sync"
-msgstr ""
+msgstr "åŒæœŸ"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "At End"
-msgstr ""
+msgstr "終りã«"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Travel"
@@ -4192,12 +3829,11 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Start and end nodes are needed for a sub-transition."
-msgstr ""
+msgstr "サブトランジションã«ã¯ã€é–‹å§‹ãƒŽãƒ¼ãƒ‰ã¨çµ‚了ノードãŒå¿…è¦ã§ã™ã€‚"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "No playback resource set at path: %s."
-msgstr "リソースã®ãƒ‘スã§ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+msgstr "パス( %s )ã«å†ç”Ÿãƒªã‚½ãƒ¼ã‚¹ãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“。"
#: editor/plugins/animation_state_machine_editor.cpp
msgid ""
@@ -4205,40 +3841,42 @@ msgid ""
"RMB to add new nodes.\n"
"Shift+LMB to create connections."
msgstr ""
+"ãƒŽãƒ¼ãƒ‰ã‚’é¸æŠžã—ã¦ç§»å‹•。\n"
+"å³ã‚¯ãƒªãƒƒã‚¯ã§æ–°è¦ãƒŽãƒ¼ãƒ‰ã‚’追加。\n"
+"Shift+å·¦ã‚¯ãƒªãƒƒã‚¯ã§æŽ¥ç¶šã‚’ä½œæˆã€‚"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "%s ã‚’æ–°è¦ä½œæˆ"
+msgstr "æ–°è¦ãƒŽãƒ¼ãƒ‰ã‚’作æˆã€‚"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Connect nodes."
-msgstr "ãƒŽãƒ¼ãƒ‰ã«æŽ¥ç¶šã—ã¾ã™:"
+msgstr "ノードを接続。"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
-msgstr "é¸æŠžã—ãŸãƒˆãƒ©ãƒƒã‚¯ã‚’削除ã—ã¾ã™ã€‚"
+msgid "Remove selected node or transition."
+msgstr "é¸æŠžã—ãŸãƒŽãƒ¼ãƒ‰ã¾ãŸã¯ãƒˆãƒ©ãƒ³ã‚¸ã‚·ãƒ§ãƒ³ã‚’除去"
#: editor/plugins/animation_state_machine_editor.cpp
+#, fuzzy
msgid "Toggle autoplay this animation on start, restart or seek to zero."
msgstr ""
+"ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®è‡ªå‹•å†ç”Ÿã‚’ã€ã‚¹ã‚¿ãƒ¼ãƒˆã€ãƒªã‚¹ã‚¿ãƒ¼ãƒˆã€ã‚¼ãƒ­ã«ã‚·ãƒ¼ã‚¯ã«åˆ‡ã‚Šæ›¿ãˆ"
+"る。"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set the end animation. This is useful for sub-transitions."
-msgstr ""
+msgstr "終了アニメーションを設定ã™ã‚‹ã€‚ã“れã¯ã‚µãƒ–トランジションã«ä¾¿åˆ©ã§ã™ã€‚"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "é·ç§»"
+msgstr "トランジション: "
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "AnimationTree"
-msgstr "アニメーション"
+msgstr "アニメーションツリー"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "New name:"
@@ -4246,9 +3884,8 @@ msgstr "æ–°ã—ã„åå‰:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
msgid "Scale:"
-msgstr "縮尺:"
+msgstr "スケール:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Fade In (s):"
@@ -4260,164 +3897,136 @@ msgstr "フェードアウト:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend"
-msgstr "ブレンド(æ··åˆï¼‰"
+msgstr "ブレンド"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "Mix"
-msgstr "ミクシング"
+msgstr "ミックス"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "Auto Restart:"
-msgstr "自動ã§ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’最åˆã‹ã‚‰å†ç”Ÿã™ã‚‹ :"
+msgstr "自動リスタート:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Restart (s):"
-msgstr "アニメーションを最åˆã‹ã‚‰å†ç”Ÿã™ã‚‹ :"
+msgstr "リスタート:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "Random Restart (s):"
-msgstr "ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ãƒ©ãƒ³ãƒ€ãƒ ã«æœ€åˆã‹ã‚‰å†ç”Ÿã™ã‚‹:"
+msgstr "ランダムリスタート:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "Start!"
-msgstr "å†ç”Ÿé–‹å§‹!"
+msgstr "スタートï¼"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
msgid "Amount:"
msgstr "ç·è¨ˆ:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
-msgid "Blend:"
-msgstr "ブレンド:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "Blend 0:"
msgstr "ブレンド 0:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "Blend 1:"
msgstr "ブレンド 1:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "X-Fade Time (s):"
-msgstr "クロスフェード時間(秒)"
+msgstr "クロスフェード時間(秒):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "Current:"
-msgstr "ç¾åœ¨ã®:"
+msgstr "ç¾åœ¨:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "Add Input"
msgstr "入力を追加"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "Clear Auto-Advance"
-msgstr "自動表示ã®è§£é™¤"
+msgstr "自動アドãƒãƒ³ã‚¹ã®è§£é™¤"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "Set Auto-Advance"
-msgstr "自動表示を設定"
+msgstr "自動アドãƒãƒ³ã‚¹ã‚’設定"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "Delete Input"
-msgstr "入力を消去"
+msgstr "入力を削除"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "Animation tree is valid."
-msgstr "アニメーションツリーã¯å•題ã‚りã¾ã›ã‚“."
+msgstr "ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãƒ„ãƒªãƒ¼ã¯æœ‰åйã§ã™ã€‚"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "Animation tree is invalid."
-msgstr "アニメーションツリーã«å•題ãŒã‚りã¾ã™."
+msgstr "アニメーションツリーãŒç„¡åйã§ã™ã€‚"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "Animation Node"
-msgstr "アニメーションã®ãƒŽãƒ¼ãƒ‰"
+msgstr "アニメーション ノード"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "OneShot Node"
msgstr "ワンショット ノード"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "Mix Node"
-msgstr "ミキシング ノード"
+msgstr "ミックス ノード"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend2 Node"
-msgstr "ブレンド2ノード"
+msgstr "ブレンド2 ノード"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend3 Node"
-msgstr "ブレンド3ノード"
+msgstr "ブレンド3 ノード"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend4 Node"
-msgstr "ブレンド4ノード"
+msgstr "ブレンド4 ノード"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "TimeScale Node"
-msgstr "進行速度ノード"
+msgstr "タイムスケール ノード"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "TimeSeek Node"
-msgstr "時刻移動ノード"
+msgstr "タイムシーク ノード"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Transition Node"
-msgstr "トランジション(é·ç§»ï¼‰ãƒŽãƒ¼ãƒ‰"
+msgstr "トランジション ノード"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "Import Animations..."
msgstr "アニメーションをインãƒãƒ¼ãƒˆ..."
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Node Filters"
-msgstr "ノードフィルターã®ç·¨é›†"
+msgstr "ノードフィルタã®ç·¨é›†"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Filters..."
-msgstr "フィルター..."
+msgstr "フィルタ..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Contents:"
msgstr "コンテンツ:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "View Files"
-msgstr "ビューファイル:"
+msgstr "ファイルを表示"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Can't resolve hostname:"
msgstr "ホストåを解決ã§ãã¾ã›ã‚“:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Connection error, please try again."
-msgstr "接続失敗 å†è©¦è¡Œã‚’"
+msgstr "接続エラー。å†è©¦è¡Œã—ã¦ãã ã•ã„。"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Can't connect to host:"
@@ -4428,64 +4037,53 @@ msgid "No response from host:"
msgstr "ホストã‹ã‚‰å¿œç­”ãŒã‚りã¾ã›ã‚“:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Request failed, return code:"
-msgstr "リクエスト失敗 リターン コード:"
+msgstr "リクエスト失敗。リターンコード:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Request failed, too many redirects"
-msgstr "リクエスト失敗 リダイレクトã®å›žæ•°ãŒå¤šã™ãŽã¾ã™"
+msgstr "リクエスト失敗。リダイレクトéŽå¤š"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Bad download hash, assuming file has been tampered with."
-msgstr "ダウンロード内容ã®ãƒãƒƒã‚·ãƒ¥ãŒä¸æ•´åˆã€€æ”¹ã–ã‚“ã®å¯èƒ½æ€§ãŒã‚りã¾ã™."
+msgstr ""
+"ダウンロードãƒãƒƒã‚·ãƒ¥ãŒä¸æ­£ã§ã™ã€‚ãƒ•ã‚¡ã‚¤ãƒ«ãŒæ”¹ã–ã‚“ ã•れã¦ã„ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Expected:"
msgstr "予測:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Got:"
msgstr "å–å¾—:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Failed sha256 hash check"
-msgstr "sha256ã®ãƒãƒƒã‚·ãƒ¥ãƒã‚§ãƒƒã‚¯å¤±æ•—"
+msgstr "sha256 ãƒãƒƒã‚·ãƒ¥ãƒã‚§ãƒƒã‚¯å¤±æ•—"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Asset Download Error:"
-msgstr "アセットã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰å¤±æ•—:"
+msgstr "アセットã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã‚¨ãƒ©ãƒ¼:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading (%s / %s)..."
-msgstr "ダウンロード中"
+msgstr "ダウンロード中 (%s / %s)..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading..."
-msgstr "ダウンロード中"
+msgstr "ダウンロード中..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Resolving..."
msgstr "解決中..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Error making request"
msgstr "リクエスト発行エラー"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Idle"
-msgstr "待機中"
+msgstr "待機"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Retry"
@@ -4500,14 +4098,12 @@ msgid "Download for this asset is already in progress!"
msgstr "ã“ã®ã‚¢ã‚»ãƒƒãƒˆã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã¯æ—¢ã«é€²è¡Œä¸­ï¼"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "First"
msgstr "最åˆ"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Previous"
-msgstr "以å‰ã®ã‚¿ãƒ–"
+msgstr "å‰"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Next"
@@ -4515,7 +4111,7 @@ msgstr "次"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Last"
-msgstr ""
+msgstr "最後"
#: editor/plugins/asset_library_editor_plugin.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -4527,9 +4123,9 @@ msgstr "ã™ã¹ã¦"
msgid "Plugins"
msgstr "プラグイン"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
-msgstr "ä¸¦ã¹æ›¿ãˆ:"
+msgstr "ソート:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Reverse"
@@ -4566,6 +4162,9 @@ msgid ""
"Save your scene (for images to be saved in the same dir), or pick a save "
"path from the BakedLightmap properties."
msgstr ""
+"ライトマップ画åƒã®ä¿å­˜ãƒ‘スを確定ã§ãã¾ã›ã‚“。\n"
+"シーンをä¿å­˜ã™ã‚‹ (ç”»åƒãŒåŒã˜ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ä¿å­˜ã•れる) ã‹ã€BakedLightmapプロパ"
+"ティã‹ã‚‰ä¿å­˜ãƒ‘ã‚¹ã‚’é¸æŠžã—ã¦ãã ã•ã„。"
#: editor/plugins/baked_lightmap_editor_plugin.cpp
msgid ""
@@ -4576,11 +4175,12 @@ msgstr ""
#: editor/plugins/baked_lightmap_editor_plugin.cpp
msgid "Failed creating lightmap images, make sure path is writable."
msgstr ""
+"ライトマップ画åƒã®ç”Ÿæˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚ãƒ‘ã‚¹ãŒæ›¸ãè¾¼ã¿å¯èƒ½ã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦"
+"ãã ã•ã„。"
#: editor/plugins/baked_lightmap_editor_plugin.cpp
-#, fuzzy
msgid "Bake Lightmaps"
-msgstr "ライトマップã¸ã®è»¢å†™:"
+msgstr "ライトマップを焼ã込む"
#: editor/plugins/camera_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
@@ -4636,31 +4236,31 @@ msgid "Create new horizontal and vertical guides"
msgstr "水平垂直ガイドを作æˆ"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move pivot"
-msgstr "ピボット移動"
+msgstr "ピボットを移動"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Rotate CanvasItem"
-msgstr "キャンãƒã‚¹ã‚¢ã‚¤ãƒ†ãƒ ã®ç·¨é›†"
+msgstr "CanvasItemを回転"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move anchor"
-msgstr "移動動作"
+msgstr "アンカーを移動"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Resize CanvasItem"
-msgstr "キャンãƒã‚¹ã‚¢ã‚¤ãƒ†ãƒ ã®ç·¨é›†"
+msgstr "CanvasItemをリサイズ"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
-msgid "Move CanvasItem"
+msgid "Scale CanvasItem"
msgstr "キャンãƒã‚¹ã‚¢ã‚¤ãƒ†ãƒ ã®ç·¨é›†"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move CanvasItem"
+msgstr "CanvasItemを移動"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
msgstr "アンカーã®ã¿"
@@ -4669,9 +4269,8 @@ msgid "Change Anchors and Margins"
msgstr "アンカーã¨ãƒžãƒ¼ã‚¸ãƒ³ã‚’変更ã™ã‚‹"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Change Anchors"
-msgstr "アンカーを変更ã™ã‚‹"
+msgstr "アンカーを変更"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -4679,21 +4278,18 @@ msgid "Paste Pose"
msgstr "ãƒãƒ¼ã‚ºã‚’貼り付ã‘ã‚‹"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "ズームアウト"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom reset"
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
msgstr "ズームをリセット"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "ズームイン"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr "é¸æŠžãƒ¢ãƒ¼ãƒ‰"
@@ -4702,15 +4298,14 @@ msgid "Drag: Rotate"
msgstr "ドラッグ:回転"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Alt+Drag: Move"
-msgstr "Alt+ドラッグ:移動"
+msgstr "Alt+ドラッグ: 移動"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
msgstr ""
-"vキーを押ã™ã¨ãƒ”ボットã®å¤‰æ›´ã€'Shift+v' ã§ãƒ”ボットをドラッグ(移動中ã§ã‚‚)"
+"vキーを押ã™ã¨ãƒ”ボットã®å¤‰æ›´ã€'Shift+v' ã§ãƒ”ボットをドラッグ(移動中ã§ã‚‚)"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -4723,24 +4318,25 @@ msgid "Move Mode"
msgstr "追加ã—ãŸã‚­ãƒ¼ã‚’移動"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Rotate Mode"
msgstr "回転モード"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr "スケール(拡大縮å°ï¼‰ãƒ¢ãƒ¼ãƒ‰"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid ""
"Show a list of all objects at the position clicked\n"
"(same as Alt+RMB in select mode)."
msgstr ""
-"クリックã—ãŸä½ç½®ã®ã‚ªãƒ–ジェクトã®ãƒªã‚¹ãƒˆ\n"
-"ï¼ˆé¸æŠžãƒ¢ãƒ¼ãƒ‰ã§ã®Alt+å³ã‚¯ãƒªãƒƒã‚¯ã¨åŒã˜)"
+"クリックã—ãŸä½ç½®ã«ã‚るオブジェクトã®ãƒªã‚¹ãƒˆã‚’表示\n"
+"(é¸æŠžãƒ¢ãƒ¼ãƒ‰ã§ã®Alt+å³ã‚¯ãƒªãƒƒã‚¯ã¨åŒã˜)。"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Click to change object's rotation pivot."
-msgstr "クリックã™ã‚‹ã¨ã‚ªãƒ–ジェクトã®å›žè»¢ãƒ”ボットを変更"
+msgstr "クリックã§ã‚ªãƒ–ジェクトã®å›žè»¢ãƒ”ボットを変更ã™ã‚‹ã€‚"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -4748,45 +4344,37 @@ msgid "Pan Mode"
msgstr "パン・モード"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle snapping."
-msgstr "ブレークãƒã‚¤ãƒ³ãƒˆã‚’切替"
+msgstr "スナッピングを切り替ãˆã‚‹ã€‚"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Use Snap"
-msgstr "スナップ機能を使ã†"
+msgstr "スナップを使ã†"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snapping Options"
-msgstr "アニメーションã®ã‚ªãƒ—ション"
+msgstr "スナッピングオプション"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to grid"
-msgstr "Snapモード:"
+msgstr "グリッドã«ã‚¹ãƒŠãƒƒãƒ—"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Use Rotation Snap"
-msgstr "回転スナップ機能を使ã†"
+msgstr "回転スナップを使ã†"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Configure Snap..."
-msgstr "スナップ機能ã®è¨­å®š"
+msgstr "スナップã®è¨­å®š..."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap Relative"
-msgstr "相対スナップ機能"
+msgstr "相対スナップ"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Use Pixel Snap"
-msgstr "ピクセルå˜ä½ã‚¹ãƒŠãƒƒãƒ—"
+msgstr "ピクセルスナップを使用"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Smart snapping"
@@ -4805,30 +4393,26 @@ msgid "Snap to node sides"
msgstr "ノードå´é¢ã«ã‚¹ãƒŠãƒƒãƒ—"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to node center"
-msgstr "ノードアンカーã«ã‚¹ãƒŠãƒƒãƒ—"
+msgstr "ノードã®ä¸­å¿ƒã«ã‚¹ãƒŠãƒƒãƒ—"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to other nodes"
msgstr "ä»–ã®ãƒŽãƒ¼ãƒ‰ã«ã‚¹ãƒŠãƒƒãƒ—"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to guides"
-msgstr "Snapモード:"
+msgstr "ガイドã«ã‚¹ãƒŠãƒƒãƒ—"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Lock the selected object in place (can't be moved)."
-msgstr "é¸æŠžã—ãŸã‚ªãƒ–ジェクトをロックã—ã¦ç§»å‹•ä¸èƒ½ã¨ã™ã‚‹."
+msgstr "é¸æŠžã—ãŸã‚ªãƒ–ジェクトをãã®å ´ã§ãƒ­ãƒƒã‚¯ (移動ä¸å¯èƒ½ã«ã™ã‚‹)。"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Unlock the selected object (can be moved)."
-msgstr "é¸æŠžã—ãŸã‚ªãƒ–ジェクトをロック解除ã—ã¦ç§»å‹•å¯èƒ½ã¨ã™ã‚‹."
+msgstr "é¸æŠžã—ãŸã‚ªãƒ–ジェクトをアンロック (移動å¯èƒ½ã«ã™ã‚‹)。"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -4841,19 +4425,20 @@ msgid "Restores the object's children's ability to be selected."
msgstr "ã“ã®ã‚ªãƒ–ジェクトã®å­ï¼ˆã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆï¼‰ã‚’é¸æŠžå¯èƒ½ã¨ã™ã‚‹."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
+msgid "Skeleton Options"
+msgstr "スケルトンã®ã‚ªãƒ—ション"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "ボーンを表示ã™ã‚‹"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Make IK Chain"
-msgstr "IK(インãƒãƒ¼ã‚¹ ã‚­ãƒãƒžãƒ†ã‚£ã‚¯ã‚¹ï¼‰ãƒã‚§ãƒ¼ãƒ³ã®ä½œæˆ"
+msgstr "IKãƒã‚§ãƒ¼ãƒ³ã‚’作æˆ"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear IK Chain"
-msgstr "IK(インãƒãƒ¼ã‚¹ ã‚­ãƒãƒžãƒ†ã‚£ã‚¯ã‚¹ï¼‰ãƒã‚§ãƒ¼ãƒ³ã‚’クリアã™ã‚‹"
+msgstr "IKãƒã‚§ãƒ¼ãƒ³ã‚’クリア"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make Custom Bone(s) from Node(s)"
@@ -4866,7 +4451,6 @@ msgstr "ボーンをクリアã™ã‚‹"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "View"
msgstr "ビュー"
@@ -4876,29 +4460,28 @@ msgid "Show Grid"
msgstr "グリッドを表示"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Show Helpers"
-msgstr "ボーンを表示ã™ã‚‹"
+msgstr "ヘルパーを表示"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Show Rulers"
-msgstr "ボーンを表示ã™ã‚‹"
+msgstr "ルーラーを表示"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Show Guides"
-msgstr "ボーンを表示ã™ã‚‹"
+msgstr "ガイドを表示"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Show Origin"
-msgstr "原点を見る"
+msgstr "原点を表示"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Show Viewport"
-msgstr "1 ビューãƒãƒ¼ãƒˆ"
+msgstr "ビューãƒãƒ¼ãƒˆã‚’表示"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -4911,19 +4494,17 @@ msgid "Frame Selection"
msgstr "é¸æŠžå¯¾è±¡ã‚’ãƒ•ãƒ¬ãƒ¼ãƒ ã®ä¸­å¤®ã«"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Layout"
-msgstr "レイアウトをä¿å­˜"
+msgstr "レイアウト"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Insert keys."
-msgstr "キーフレームを挿入"
+msgstr "キーを挿入ã™ã‚‹ã€‚"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Insert Key (Existing Tracks)"
-msgstr "キーフレームを(既存ã®ãƒˆãƒ©ãƒƒã‚¯ã«ï¼‰æŒ¿å…¥"
+msgstr "キーを (既存ã®ãƒˆãƒ©ãƒƒã‚¯ã«) 挿入"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Copy Pose"
@@ -4942,22 +4523,19 @@ msgid "Divide grid step by 2"
msgstr "グリッドステップをåŠåˆ†ã«ã™ã‚‹"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Add %s"
-msgstr "%s追加ã™ã‚‹"
+msgstr "%s を追加"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Adding %s..."
-msgstr "%s追加中..."
+msgstr "%s を追加中..."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Cannot instantiate multiple nodes without root."
-msgstr ""
+msgstr "ルートã®å­˜åœ¨ã—ãªã„状態ã§ã€è¤‡æ•°ãƒŽãƒ¼ãƒ‰ã‚’インスタンス化ã§ãã¾ã›ã‚“。"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Node"
msgstr "ノードを生æˆ"
@@ -4981,8 +4559,16 @@ msgstr ""
"ドラッグ&ドロップ + Alt : ノードã®ã‚¿ã‚¤ãƒ—を変更ã™ã‚‹"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr "3Dãƒãƒªã‚´ãƒ³ã‚’生æˆã™ã‚‹"
+msgid "Create Polygon3D"
+msgstr "Polygon3Dを生æˆ"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "ãƒãƒªã‚´ãƒ³ã‚’編集"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "ãƒãƒªã‚´ãƒ³ã‚’編集(点を除去)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
#, fuzzy
@@ -4990,21 +4576,18 @@ msgid "Set Handle"
msgstr "ãƒãƒ³ãƒ‰ãƒ«ã‚’設定ã™ã‚‹"
#: editor/plugins/cpu_particles_editor_plugin.cpp
-#, fuzzy
msgid "CPUParticles"
-msgstr "頂点"
+msgstr "CPUパーティクル"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "Create Emission Points From Mesh"
-msgstr "メッシュã‹ã‚‰ç™ºå…‰ç‚¹ã‚’生æˆ"
+msgstr "メッシュã‹ã‚‰æ”¾å‡ºç‚¹ã‚’生æˆ"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "Create Emission Points From Node"
-msgstr "ノードã‹ã‚‰ã®ç™ºå…‰ç‚¹ã‚’生æˆ"
+msgstr "ノードã‹ã‚‰æ”¾å‡ºç‚¹ã‚’生æˆ"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Flat0"
@@ -5029,9 +4612,8 @@ msgid "Smoothstep"
msgstr "スムーズステップ"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Modify Curve Point"
-msgstr "カーブを修正ã™ã‚‹"
+msgstr "カーブãƒã‚¤ãƒ³ãƒˆã‚’修正"
#: editor/plugins/curve_editor_plugin.cpp
#, fuzzy
@@ -5039,17 +4621,16 @@ msgid "Modify Curve Tangent"
msgstr "カーブマップを修正"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Load Curve Preset"
-msgstr "åˆæœŸè¨­å®šå€¤ã‚’読ã¿è¾¼ã‚€"
+msgstr "カーブã®ãƒ—リセットを読ã¿è¾¼ã‚€"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Add point"
-msgstr "ãƒã‚¤ãƒ³ãƒˆï¼ç‚¹ã‚’追加"
+msgstr "点を追加"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Remove point"
-msgstr "é¸æŠžã—ã¦ã„ã‚‹ãƒã‚¤ãƒ³ãƒˆï¼ç‚¹ã‚’削除"
+msgstr "ãƒã‚¤ãƒ³ãƒˆã‚’除去"
#: editor/plugins/curve_editor_plugin.cpp
#, fuzzy
@@ -5066,9 +4647,8 @@ msgid "Load preset"
msgstr "åˆæœŸè¨­å®šå€¤ã‚’読ã¿è¾¼ã‚€"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Remove Curve Point"
-msgstr "パスã®ãƒã‚¤ãƒ³ãƒˆã‚’除去"
+msgstr "カーブãƒã‚¤ãƒ³ãƒˆã‚’除去"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Toggle Curve Linear Tangent"
@@ -5095,40 +4675,10 @@ msgid "Item List Editor"
msgstr "アイテムリストã®ã‚¨ãƒ‡ã‚£ã‚¿"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"ã“ã®ãƒŽãƒ¼ãƒ‰ã«OccluderPolygon2DリソースãŒã‚りã¾ã›ã‚“。\n"
-"作æˆã—ã¦ã€å‰²ã‚Šå½“ã¦ã¾ã™ã‹ ?"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#, fuzzy
msgid "Create Occluder Polygon"
msgstr "オクルージョンを生ã˜ã‚‹ãƒãƒªã‚´ãƒ³ã‚’生æˆ"
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Create a new polygon from scratch."
-msgstr "æ–°è¦ã«ãƒãƒªã‚´ãƒ³ã‚’生æˆã™ã‚‹"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "既存ã®ãƒãƒªã‚´ãƒ³ã‚’編集:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "マウス左ボタン:ãƒã‚¤ãƒ³ãƒˆï¼ç‚¹ã‚’移動."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Ctrl+LMB: Split Segment."
-msgstr "Ctrl+マウス左ボタン: セグメントを分割"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "マウスå³ãƒœã‚¿ãƒ³:ãƒã‚¤ãƒ³ãƒˆï¼ç‚¹ã‚’除去."
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
msgid "Mesh is empty!"
@@ -5158,26 +4708,25 @@ msgid "Create Convex Shape"
msgstr "凸状シェイプを生æˆ"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
msgid "Create Navigation Mesh"
-msgstr "ナビメッシュ(ナビゲーションメッシュ)ã®ç”Ÿæˆ"
+msgstr "ナビゲーションメッシュを生æˆ"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Contained Mesh is not of type ArrayMesh."
-msgstr ""
+msgstr "å«ã¾ã‚Œã¦ã„るメッシュãŒArrayMeshåž‹ã§ã¯ã‚りã¾ã›ã‚“。"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "UV Unwrap failed, mesh may not be manifold?"
-msgstr ""
+msgstr "UV展開ã«å¤±æ•—ã—ã¾ã—ãŸã€‚メッシュãŒéžå¤šæ§˜ä½“ã§ã¯ã‚りã¾ã›ã‚“ã‹?"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "No mesh to debug."
-msgstr ""
+msgstr "デãƒãƒƒã‚°ã™ã‚‹ãƒ¡ãƒƒã‚·ãƒ¥ãŒã‚りã¾ã›ã‚“。"
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Model has no UV in this layer"
-msgstr ""
+msgstr "モデルã«ã¯ã“ã®ãƒ¬ã‚¤ãƒ¤ãƒ¼ã«UVãŒã‚りã¾ã›ã‚“"
#: editor/plugins/mesh_instance_editor_plugin.cpp
#, fuzzy
@@ -5185,16 +4734,14 @@ msgid "MeshInstance lacks a Mesh!"
msgstr "メッシュインスタンスã®ãƒ¡ãƒƒã‚·ãƒ¥ãŒå­˜åœ¨ã—ã¾ã›ã‚“"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
msgid "Mesh has not surface to create outlines from!"
-msgstr "メッシュã«ã‚¢ã‚¦ãƒˆãƒ©ã‚¤ãƒ³ã‚’作æˆã™ã‚‹ãŸã‚ã®ã‚µãƒ¼ãƒ•ェイスãŒå­˜åœ¨ã—ã¾ã›ã‚“"
+msgstr "メッシュã«ã‚¢ã‚¦ãƒˆãƒ©ã‚¤ãƒ³ã‚’作æˆã™ã‚‹ãŸã‚ã®ã‚µãƒ¼ãƒ•ェスãŒå­˜åœ¨ã—ã¾ã›ã‚“!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!"
-msgstr ""
+msgstr "メッシュã®ãƒ—リミティブ型㌠PRIMITIVE_TRIANGLES ã§ã¯ã‚りã¾ã›ã‚“!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
msgid "Could not create outline!"
msgstr "アウトラインを生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ!"
@@ -5225,30 +4772,26 @@ msgid "Create Convex Collision Sibling"
msgstr "凸型兄弟コリジョンを生æˆ"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
msgid "Create Outline Mesh..."
msgstr "アウトラインメッシュを生æˆ..."
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
msgid "View UV1"
-msgstr "ビュー"
+msgstr "UV1を表示"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
msgid "View UV2"
-msgstr "ビュー"
+msgstr "UV2を表示"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Unwrap UV2 for Lightmap/AO"
-msgstr ""
+msgstr "Lightmap/AO ã®UV2を展開"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh"
msgstr "アウトラインメッシュを生æˆ"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
msgid "Outline Size:"
msgstr "アウトラインã®ã‚µã‚¤ã‚º:"
@@ -5287,40 +4830,32 @@ msgstr ""
"在ã—ã¾ã›ã‚“)."
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
msgid "Mesh source is invalid (invalid path)."
-msgstr "ãƒ¡ãƒƒã‚·ãƒ¥ã‚½ãƒ¼ã‚¹ã¯æ­£ã—ãæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“ï¼ˆä¸æ­£ãªãƒ‘ス)"
+msgstr "無効ãªãƒ¡ãƒƒã‚·ãƒ¥ã‚½ãƒ¼ã‚¹ã§ã™ (無効ãªãƒ‘ス)。"
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
msgid "Mesh source is invalid (not a MeshInstance)."
-msgstr ""
-"ãƒ¡ãƒƒã‚·ãƒ¥ã‚½ãƒ¼ã‚¹ã¯æ­£ã—ãã‚りã¾ã›ã‚“(メッシュã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã§ã¯ã‚りã¾ã›ã‚“)"
+msgstr "無効ãªãƒ¡ãƒƒã‚·ãƒ¥ã‚½ãƒ¼ã‚¹ã§ã™ (MeshInstanceã§ã¯ã‚りã¾ã›ã‚“)。"
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
msgid "Mesh source is invalid (contains no Mesh resource)."
-msgstr "ãƒ¡ãƒƒã‚·ãƒ¥ã‚½ãƒ¼ã‚¹ã¯æ­£ã—ãã‚りã¾ã›ã‚“(メッシュリソースãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“)"
+msgstr "無効ãªãƒ¡ãƒƒã‚·ãƒ¥ã‚½ãƒ¼ã‚¹ã§ã™ (メッシュリソースãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“)。"
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
msgid "No surface source specified."
-msgstr "サーフェイスã®ã‚½ãƒ¼ã‚¹ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“."
+msgstr "サーフェスã®ã‚½ãƒ¼ã‚¹ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“。"
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
msgid "Surface source is invalid (invalid path)."
-msgstr "サーフェイスã®ã‚½ãƒ¼ã‚¹ãŒæ­£ã—ãã‚りã¾ã›ã‚“ï¼ˆä¸æ­£ãªãƒ‘ス)"
+msgstr "無効ãªã‚µãƒ¼ãƒ•ェスã®ã‚½ãƒ¼ã‚¹ã§ã™ (無効ãªãƒ‘ス)。"
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
msgid "Surface source is invalid (no geometry)."
-msgstr "サーフェイスã®ã‚½ãƒ¼ã‚¹ãŒæ­£ã—ãã‚りã¾ã›ã‚“(ジオメトリーãŒã‚りã¾ã›ã‚“)"
+msgstr "無効ãªã‚µãƒ¼ãƒ•ェスã®ã‚½ãƒ¼ã‚¹ã§ã™ (ジオメトリãŒã‚りã¾ã›ã‚“)。"
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
msgid "Surface source is invalid (no faces)."
-msgstr "ã‚µãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚½ãƒ¼ã‚¹ã¯æ­£ã—ãã‚りã¾ã›ã‚“(フェースãŒã‚りã¾ã›ã‚“)"
+msgstr "無効ãªã‚µãƒ¼ãƒ•ェスソースã§ã™ (é¢ãŒã‚りã¾ã›ã‚“)。"
#: editor/plugins/multimesh_editor_plugin.cpp
#, fuzzy
@@ -5333,19 +4868,17 @@ msgid "Couldn't map area."
msgstr "エリアをマッピングã§ãã¾ã›ã‚“"
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
msgid "Select a Source Mesh:"
-msgstr "ソースメッシュをé¸ã¶:"
+msgstr "ã‚½ãƒ¼ã‚¹ãƒ¡ãƒƒã‚·ãƒ¥ã‚’é¸æŠž:"
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
msgid "Select a Target Surface:"
-msgstr "ターゲットサーフェースをé¸ã¶:"
+msgstr "ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚µãƒ¼ãƒ•ã‚§ã‚¹ã‚’é¸æŠž:"
#: editor/plugins/multimesh_editor_plugin.cpp
#, fuzzy
msgid "Populate Surface"
-msgstr "サーフェースã«åˆæœŸå€¤ã‚’設定"
+msgstr "サーフェスã«åˆæœŸå€¤ã‚’設定"
#: editor/plugins/multimesh_editor_plugin.cpp
#, fuzzy
@@ -5354,10 +4887,9 @@ msgstr "マルãƒãƒ¡ãƒƒã‚·ãƒ¥ã«åˆæœŸå€¤ã‚’設定"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Target Surface:"
-msgstr "ターゲットサーフェース:"
+msgstr "ターゲットサーフェス:"
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
msgid "Source Mesh:"
msgstr "ソースメッシュ:"
@@ -5399,28 +4931,26 @@ msgid "Populate"
msgstr "åˆæœŸå€¤ã‚’設定"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr "ナビゲーションãƒãƒªã‚´ãƒ³ã‚’生æˆ"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
#, fuzzy
-msgid "Generating AABB"
-msgstr "軸平行境界ボックス(AABB)を生æˆ"
+msgid "Generating Visibility Rect"
+msgstr "å¯è¦–性ã®çŸ©å½¢ã‚’生æˆ"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "Error loading image:"
-msgstr "イメージ読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼:"
+msgstr "ç”»åƒèª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼:"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "No pixels with transparency > 128 in image..."
-msgstr "イメージ内ã«é€æ˜Žåº¦>128ã®ãƒ”クセルãŒã‚りã¾ã›ã‚“..."
+msgstr "ç”»åƒå†…ã«é€æ˜Žåº¦ãŒ128以上ã®ãƒ”クセルãŒã‚りã¾ã›ã‚“..."
#: editor/plugins/particles_2d_editor_plugin.cpp
#, fuzzy
@@ -5439,20 +4969,22 @@ msgstr "発光(Emission)マスクをクリア"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
+msgid "Convert to CPUParticles"
+msgstr "CPUパーティクルã«å¤‰æ›"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
-msgstr "頂点"
+msgstr "パーティクル"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "Generated Point Count:"
msgstr "生æˆã—ãŸãƒã‚¤ãƒ³ãƒˆã®æ•°:"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "Generation Time (sec):"
-msgstr "ç”Ÿæˆæ™‚間(秒)"
+msgstr "ç”Ÿæˆæ™‚é–“ (ç§’):"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Emission Mask"
@@ -5473,19 +5005,16 @@ msgid "Faces contain no area!"
msgstr "é¢ã«ã‚¨ãƒªã‚¢ãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“!"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "No faces!"
msgstr "é¢ãŒã‚りã¾ã›ã‚“!"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "Node does not contain geometry."
-msgstr "ノードã¯ã‚¸ã‚ªãƒ¡ãƒˆãƒªãƒ¼ã‚’å«ã‚“ã§ã„ã¾ã›ã‚“."
+msgstr "ノードã¯ã‚¸ã‚ªãƒ¡ãƒˆãƒªãƒ¼ã‚’å«ã‚“ã§ã„ã¾ã›ã‚“。"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "Node does not contain geometry (faces)."
-msgstr "ノードã¯ã‚¸ã‚ªãƒ¡ãƒˆãƒªãƒ¼(é¢ï¼‰ã‚’å«ã‚“ã§ã„ã¾ã›ã‚“."
+msgstr "ノードã¯ã‚¸ã‚ªãƒ¡ãƒˆãƒªãƒ¼ (é¢) ã‚’å«ã‚“ã§ã„ã¾ã›ã‚“。"
#: editor/plugins/particles_editor_plugin.cpp
#, fuzzy
@@ -5493,24 +5022,21 @@ msgid "Create Emitter"
msgstr "発光物を生æˆ"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "Emission Points:"
-msgstr "発光点:"
+msgstr "放出点:"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "Surface Points"
-msgstr "サーフェース(表é¢ï¼‰ãƒã‚¤ãƒ³ãƒˆ"
+msgstr "表é¢ã®ç‚¹"
#: editor/plugins/particles_editor_plugin.cpp
#, fuzzy
msgid "Surface Points+Normal (Directed)"
-msgstr "サーフェースãƒã‚¤ãƒ³ãƒˆï¼‹Normalï¼ˆæŒ‡å‘æ€§ï¼‰"
+msgstr "サーフェスãƒã‚¤ãƒ³ãƒˆï¼‹Normalï¼ˆæŒ‡å‘æ€§ï¼‰"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "Volume"
-msgstr "(発光ã®ï¼‰ãƒœãƒªãƒ¥ãƒ¼ãƒ "
+msgstr "ボリューム"
#: editor/plugins/particles_editor_plugin.cpp
#, fuzzy
@@ -5522,13 +5048,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr "パーティクルマテリアルãŒå¿…è¦ã§ã™."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
-msgstr "軸平行境界ボックス(AABB)を生æˆ"
+msgid "Generating AABB"
+msgstr "AABBを生æˆä¸­"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "大文字ã«å¤‰æ›"
+msgid "Generate AABB"
+msgstr "軸平行境界ボックス(AABB)を生æˆ"
#: editor/plugins/particles_editor_plugin.cpp
#, fuzzy
@@ -5557,6 +5082,11 @@ msgstr "ãƒã‚¤ãƒ³ãƒˆã‚’曲線ã«è¿½åŠ "
#: editor/plugins/path_2d_editor_plugin.cpp
#, fuzzy
+msgid "Split Curve"
+msgstr "曲線を閉ã˜ã‚‹"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
msgid "Move Point in Curve"
msgstr "曲線ã®ãƒã‚¤ãƒ³ãƒˆã‚’移動"
@@ -5573,7 +5103,7 @@ msgstr "曲線ã®Out-ãƒãƒ³ãƒ‰ãƒ«ã‚’移動ã™ã‚‹"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Select Points"
-msgstr "ãƒã‚¤ãƒ³ãƒˆï¼ç‚¹ã‚’é¸æŠž"
+msgstr "ç‚¹ã‚’é¸æŠž"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
@@ -5583,15 +5113,18 @@ msgstr "Shift+ドラッグ:コントロールãƒã‚¤ãƒ³ãƒˆã‚’é¸æŠž"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-#, fuzzy
msgid "Click: Add Point"
-msgstr "クリック:ãƒã‚¤ãƒ³ãƒˆï¼ç‚¹ã‚’追加"
+msgstr "クリック: 点を追加"
#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
#, fuzzy
+msgid "Left Click: Split Segment (in curve)"
+msgstr "分割ã™ã‚‹(曲線を)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
-msgstr "å³ã‚¯ãƒªãƒƒã‚¯:ãƒã‚¤ãƒ³ãƒˆï¼ç‚¹ã‚’除去"
+msgstr "å³ã‚¯ãƒªãƒƒã‚¯: 点を削除"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Select Control Points (Shift+Drag)"
@@ -5599,20 +5132,13 @@ msgstr "コントロールãƒã‚¤ãƒ³ãƒˆã‚’é¸ã¶ (Shift+Drag)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-#, fuzzy
msgid "Add Point (in empty space)"
-msgstr "ãƒã‚¤ãƒ³ãƒˆï¼ç‚¹ã‚’追加(空白ã«ï¼‰"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
-#, fuzzy
-msgid "Split Segment (in curve)"
-msgstr "分割ã™ã‚‹(曲線を)"
+msgstr "点を空ãスペースã«è¿½åŠ "
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
-msgstr "ãƒã‚¤ãƒ³ãƒˆï¼ç‚¹ã‚’除去"
+msgstr "点を削除"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
@@ -5636,14 +5162,12 @@ msgid "Mirror Handle Lengths"
msgstr ""
#: editor/plugins/path_editor_plugin.cpp
-#, fuzzy
msgid "Curve Point #"
-msgstr "曲線ã®ãƒã‚¤ãƒ³ãƒˆ#"
+msgstr "カーブãƒã‚¤ãƒ³ãƒˆ #"
#: editor/plugins/path_editor_plugin.cpp
-#, fuzzy
msgid "Set Curve Point Position"
-msgstr "曲線ã®ãƒã‚¤ãƒ³ãƒˆã®ä½ç½®ã‚’指定"
+msgstr "カーブãƒã‚¤ãƒ³ãƒˆã®ä½ç½®ã‚’設定"
#: editor/plugins/path_editor_plugin.cpp
#, fuzzy
@@ -5672,6 +5196,11 @@ msgstr "曲線ã®Out-ãƒãƒ³ãƒ‰ãƒ«ã‚’除去"
msgid "Remove In-Control Point"
msgstr "曲線ã®In-ãƒãƒ³ãƒ‰ãƒ«ã‚’除去"
+#: editor/plugins/path_editor_plugin.cpp
+#, fuzzy
+msgid "Split Segment (in curve)"
+msgstr "分割ã™ã‚‹(曲線を)"
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5684,72 +5213,83 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Sync bones"
+msgid "Sync Bones"
msgstr "ボーンを表示ã™ã‚‹"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+"ã“ã®ãƒãƒªã‚´ãƒ³ã«ã¯ãƒ†ã‚¯ã‚¹ãƒãƒ£ãŒã‚りã¾ã›ã‚“。\n"
+"UVを編集ã™ã‚‹ã«ã¯ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’設定ã—ã¾ã™ã€‚"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr "UVマップを生æˆ"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon & UV"
-msgstr "ãƒãƒªã‚´ãƒ³ã‚’生æˆ"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
+msgstr "ãƒãƒªã‚´ãƒ³ã¨UVを生æˆ"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "水平ガイドを作æˆ"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "アクション'%s'ã¯æ—¢ã«ã‚りã¾ã™!"
+msgid "Remove Internal Vertex"
+msgstr "曲線ã®In-ãƒãƒ³ãƒ‰ãƒ«ã‚’除去"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Add Split"
-msgstr "ãƒã‚¤ãƒ³ãƒˆï¼ç‚¹ã‚’追加"
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "無効ãªãƒ•ォント サイズã§ã™ã€‚"
+msgid "Add Custom Polygon"
+msgstr "ãƒãƒªã‚´ãƒ³ã‚’編集"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "é¸æŠžã—ã¦ã„ã‚‹ãƒã‚¤ãƒ³ãƒˆï¼ç‚¹ã‚’削除"
+msgid "Remove Custom Polygon"
+msgstr "ãƒãƒªã‚´ãƒ³ã¨ç‚¹ã‚’除去"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr "UVマップをトランスフォーム"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
+#, fuzzy
+msgid "Transform Polygon"
+msgstr "トランスフォーム"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
+msgid "Open Polygon 2D UV editor."
+msgstr "Polygon 2D UV エディタを開ã。"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
-msgstr "ãƒãƒªã‚´ãƒ³ï¼’Dã®UVエディタ"
+msgstr "Polygon 2D UV エディタ"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "UV"
-msgstr ""
+msgstr "UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "ãƒãƒªã‚´ãƒ³ã‚’編集"
+msgid "Points"
+msgstr "点"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Splits"
-msgstr "パスを分割"
+msgid "Polygons"
+msgstr "ãƒãƒªã‚´ãƒ³->UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -5758,21 +5298,14 @@ msgstr "ボーンを生æˆ"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
-msgstr "ãƒãƒªã‚´ãƒ³ã‚’生æˆ"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Move Point"
+msgid "Move Points"
msgstr "ãƒã‚¤ãƒ³ãƒˆã‚’移動"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Ctrl: Rotate"
msgstr "Ctrl: 回転"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Shift: Move All"
msgstr "Shift: ã™ã¹ã¦ç§»å‹•"
@@ -5782,12 +5315,10 @@ msgid "Shift+Ctrl: Scale"
msgstr "Shift+Ctrl: 縮尺(Scale)"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Move Polygon"
msgstr "ãƒãƒªã‚´ãƒ³ã‚’移動"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Rotate Polygon"
msgstr "ãƒãƒªã‚´ãƒ³ã‚’回転"
@@ -5797,25 +5328,26 @@ msgid "Scale Polygon"
msgstr "ãƒãƒªã‚´ãƒ³ã®ç¸®å°ºã‚’変更"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "設定項目を設定ã—ã¦ãã ã•ã„!"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Radius:"
-msgstr ""
+msgstr "åŠå¾„:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -5828,14 +5360,17 @@ msgid "UV->Polygon"
msgstr "UV->ãƒãƒªã‚´ãƒ³"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Clear UV"
msgstr "UVをクリア"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Settings"
-msgstr "Snapã®è¨­å®š"
+msgstr "スナップã®è¨­å®š"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "スナップ"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
@@ -5846,29 +5381,24 @@ msgid "Grid"
msgstr "グリッド"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Configure Grid:"
-msgstr "スナップã®è¨­å®š"
+msgstr "グリッドã®è¨­å®š:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset X:"
-msgstr "グリッドã®ã‚ªãƒ•セット:"
+msgstr "グリッドã®ã‚ªãƒ•セット X:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset Y:"
-msgstr "グリッドã®ã‚ªãƒ•セット:"
+msgstr "グリッドã®ã‚ªãƒ•セット Y:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step X:"
-msgstr "グリッドã®ã‚¹ãƒ†ãƒƒãƒ—:"
+msgstr "グリッドã®ã‚¹ãƒ†ãƒƒãƒ— X:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step Y:"
-msgstr "グリッドã®ã‚¹ãƒ†ãƒƒãƒ—:"
+msgstr "グリッドã®ã‚¹ãƒ†ãƒƒãƒ— Y:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -5881,20 +5411,17 @@ msgid "ERROR: Couldn't load resource!"
msgstr "エラー:リソースを読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ!"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#, fuzzy
msgid "Add Resource"
msgstr "リソースを追加"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#, fuzzy
msgid "Rename Resource"
-msgstr "リソースã®åå‰ã‚’変ãˆã‚‹"
+msgstr "リソースåを変更"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Delete Resource"
-msgstr "リソースを消去ã™ã‚‹"
+msgstr "リソースを削除"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#, fuzzy
@@ -5902,14 +5429,8 @@ msgid "Resource clipboard is empty!"
msgstr "リソースã®ã‚¯ãƒªãƒƒãƒ—ボードã¯ç©ºã§ã™!"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#, fuzzy
msgid "Paste Resource"
-msgstr "リソースを張り付ã‘ã‚‹"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "エディタã§é–‹ã"
+msgstr "リソースã®è²¼ã‚Šä»˜ã‘"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
@@ -5918,12 +5439,17 @@ msgstr "インスタンス:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
#, fuzzy
msgid "Type:"
msgstr "åž‹(Type):"
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "エディタã§é–‹ã"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr "リソースを読ã¿è¾¼ã‚€"
@@ -5948,16 +5474,16 @@ msgid "Clear Recent Files"
msgstr "最近開ã„ãŸãƒ•ァイルã®è¨˜éŒ²ã‚’クリア"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Close and save changes?"
-msgstr ""
-"変更をä¿å­˜ã—ã¦é–‰ã˜ã¾ã™ã‹?\n"
-"\""
+msgstr "変更をä¿å­˜ã—ã¦é–‰ã˜ã¾ã™ã‹?"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error writing TextFile:"
-msgstr "イメージ読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼:"
+msgstr "ãƒ†ã‚­ã‚¹ãƒˆãƒ•ã‚¡ã‚¤ãƒ«ã®æ›¸ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼:"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr "エラー: ファイルを読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸã€‚"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -5965,40 +5491,38 @@ msgid "Error could not load file."
msgstr "フォルダを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error saving file!"
-msgstr "タイルセットã®ä¿å­˜ã‚¨ãƒ©ãƒ¼!"
+msgstr "ファイルã®ä¿å­˜ã‚¨ãƒ©ãƒ¼!"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Error while saving theme"
+msgid "Error while saving theme."
msgstr "テーマをä¿å­˜ã™ã‚‹é€”中ã§ã®ã‚¨ãƒ©ãƒ¼"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+#, fuzzy
+msgid "Error Saving"
msgstr "ä¿å­˜ã‚¨ãƒ©ãƒ¼"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Error importing theme"
+msgid "Error importing theme."
msgstr "テーマをインãƒãƒ¼ãƒˆä¸­ã®ã‚¨ãƒ©ãƒ¼"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+#, fuzzy
+msgid "Error Importing"
msgstr "インãƒãƒ¼ãƒˆã®ã‚¨ãƒ©ãƒ¼"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New TextFile..."
-msgstr "フォルダを作æˆã™ã‚‹..."
+msgstr "æ–°è¦ãƒ†ã‚­ã‚¹ãƒˆãƒ•ァイル..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open File"
msgstr "ファイルを開ã"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Save File As..."
msgstr "åå‰ã‚’付ã‘ã¦ä¿å­˜..."
@@ -6007,6 +5531,15 @@ msgid "Import Theme"
msgstr "テーマã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Error while saving theme"
+msgstr "テーマをä¿å­˜ã™ã‚‹é€”中ã§ã®ã‚¨ãƒ©ãƒ¼"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "ä¿å­˜ã‚¨ãƒ©ãƒ¼"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr "テーマをåå‰ã‚’ã¤ã‘ã¦ä¿å­˜..."
@@ -6016,12 +5549,11 @@ msgstr " クラスリファレンス"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
-msgstr ""
+msgstr "メソッドリストã®ã‚¢ãƒ«ãƒ•ァベット順ソートを切り替ãˆã‚‹ã€‚"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Sort"
-msgstr "ä¸¦ã¹æ›¿ãˆ:"
+msgstr "ソート"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
@@ -6044,14 +5576,12 @@ msgid "Previous script"
msgstr "ç›´å‰ã®ã‚¹ã‚¯ãƒªãƒ—ト"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "File"
msgstr "ファイル"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "New TextFile"
-msgstr "ビューファイル:"
+msgid "Open..."
+msgstr "é–‹ã..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -6062,19 +5592,12 @@ msgid "Soft Reload Script"
msgstr "スクリプトをソフトリロード"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Copy Script Path"
-msgstr "パスをコピーã™ã‚‹"
+msgstr "スクリプトã®ãƒ‘スをコピー"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Show In File System"
-msgstr "ファイルシステム上ã§è¡¨ç¤º"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "History Prev"
-msgstr "ç›´å‰ã®å±¥æ­´"
+msgid "History Previous"
+msgstr "å‰ã®å±¥æ­´"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
@@ -6086,59 +5609,53 @@ msgid "Theme"
msgstr "テーマ"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
+msgid "Import Theme..."
+msgstr "テーマã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ..."
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
-msgstr "テーマをå†èª­è¾¼"
+msgstr "テーマをå†èª­ã¿è¾¼ã¿"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme"
msgstr "テーマをä¿å­˜"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "テーマã«åå‰ã‚’付ã‘ã¦ä¿å­˜"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Close Docs"
-msgstr "é–‰ã˜ã‚‹"
+msgstr "ドキュメントを閉ã˜ã‚‹"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Close All"
msgstr "ã™ã¹ã¦é–‰ã˜ã‚‹"
#: editor/plugins/script_editor_plugin.cpp
msgid "Close Other Tabs"
-msgstr "ã»ã‹ã®ã‚¿ãƒ–ã‚’é–‰ã˜ã‚‹"
+msgstr "ä»–ã®ã‚¿ãƒ–ã‚’é–‰ã˜ã‚‹"
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
msgid "Run"
msgstr "実行"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Toggle Scripts Panel"
-msgstr "ãŠæ°—ã«å…¥ã‚Šã‚’切り替ãˆã‚‹"
+msgstr "スクリプトパãƒãƒ«ã‚’切り替ãˆ"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Find Next"
-msgstr "次を探ã™"
+msgstr "次を検索"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Step Over"
msgstr "ステップオーãƒãƒ¼"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Step Into"
msgstr "ステップイン"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Break"
-msgstr "(デãƒãƒƒã‚°ã§ï¼‰ãƒ–レーク"
+msgstr "ブレーク"
#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
#: editor/script_editor_debugger.cpp
@@ -6150,30 +5667,24 @@ msgid "Keep Debugger Open"
msgstr "デãƒãƒƒã‚¬ã‚’é–‹ã„ãŸã¾ã¾ã«"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Debug with external editor"
-msgstr "次ã®ã‚¨ãƒ‡ã‚£ã‚¿ã‚’é–‹ã"
+msgid "Debug with External Editor"
+msgstr "外部エディタã§ãƒ‡ãƒãƒƒã‚°"
#: editor/plugins/script_editor_plugin.cpp
msgid "Open Godot online documentation"
msgstr "Godotã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³æ–‡æ›¸ã‚’é–‹ã"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search the class hierarchy."
-msgstr "クラス階層を検索."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "リファレンス文書を探ã™."
#: editor/plugins/script_editor_plugin.cpp
msgid "Go to previous edited document."
-msgstr "ç›´å‰ã®ã€Œç·¨é›†ã—ãŸæ–‡æ›¸ã€ã¸ç§»å‹•."
+msgstr "å‰ã®ç·¨é›†ã—ãŸãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã¸ç§»å‹•。"
#: editor/plugins/script_editor_plugin.cpp
msgid "Go to next edited document."
-msgstr "次ã®ã®ã€Œç·¨é›†ã—ãŸæ–‡æ›¸ã€ã¸ç§»å‹•."
+msgstr "次ã®ç·¨é›†ã—ãŸãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã¸ç§»å‹•。"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -6202,21 +5713,8 @@ msgid "Debugger"
msgstr "デãƒãƒƒã‚¬"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search results"
-msgstr "ヘルプを検索"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "ã‚¯ãƒ©ã‚¹ã®æ¤œç´¢"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-"組ã¿è¾¼ã¾ã‚ŒãŸã‚¹ã‚¯ãƒªãƒ—ãƒˆã¯æ‰€å±žã™ã‚‹ã‚·ãƒ¼ãƒ³ãŒèª­ã¿è¾¼ã¾ã‚Œã¦ã„ãªã„ã¨ç·¨é›†ã§ãã¾ã›ã‚“"
+msgid "Search Results"
+msgstr "æ¤œç´¢çµæžœ"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -6225,7 +5723,15 @@ msgstr "ライン:"
#: editor/plugins/script_text_editor.cpp
msgid "(ignore)"
-msgstr ""
+msgstr "(無視)"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function"
+msgstr "関数ã«ç§»å‹•"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr "標準"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
@@ -6254,15 +5760,11 @@ msgstr "å°æ–‡å­—"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Capitalize"
-msgstr "先頭を大文字ã«"
+msgstr "å˜èªžã®å…ˆé ­æ–‡å­—を大文字ã«"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Syntax Highlighter"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
+msgstr "シンタックスãƒã‚¤ãƒ©ã‚¤ãƒˆ"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
@@ -6275,9 +5777,8 @@ msgid "Select All"
msgstr "ã™ã¹ã¦é¸æŠž"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Delete Line"
-msgstr "ãƒã‚¤ãƒ³ãƒˆï¼ç‚¹ã‚’除去"
+msgstr "行を削除"
#: editor/plugins/script_text_editor.cpp
msgid "Indent Left"
@@ -6288,27 +5789,24 @@ msgid "Indent Right"
msgstr "å³ã‚¤ãƒ³ãƒ‡ãƒ³ãƒˆ"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Toggle Comment"
-msgstr "コメントを切り替ãˆã‚‹"
+msgstr "コメントã®åˆ‡ã‚Šæ›¿ãˆ"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Fold/Unfold Line"
-msgstr "行ã«ç§»å‹•"
+msgstr "行を折りãŸãŸã‚€/展開ã™ã‚‹"
#: editor/plugins/script_text_editor.cpp
msgid "Fold All Lines"
-msgstr ""
+msgstr "ã™ã¹ã¦ã®è¡Œã‚’折りãŸãŸã‚€"
#: editor/plugins/script_text_editor.cpp
msgid "Unfold All Lines"
-msgstr ""
+msgstr "ã™ã¹ã¦ã®è¡Œã‚’展開ã™ã‚‹"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Clone Down"
-msgstr "複製ã—ã¦ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰"
+msgstr "下ã«è¤‡å†™"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -6316,16 +5814,15 @@ msgid "Complete Symbol"
msgstr "記å·ã™ã¹ã¦"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Trim Trailing Whitespace"
-msgstr "連続スペースを刈り込む"
+msgstr "末尾ã®ç©ºç™½ã‚’å–り除ã"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr "インデントをスペースã«å¤‰æ›"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr "インデントをタブã«å¤‰æ›"
#: editor/plugins/script_text_editor.cpp
@@ -6335,27 +5832,19 @@ msgstr "自動インデント"
#: editor/plugins/script_text_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Toggle Breakpoint"
-msgstr "ブレークãƒã‚¤ãƒ³ãƒˆã‚’切替"
+msgstr "ブレークãƒã‚¤ãƒ³ãƒˆã‚’切り替ãˆ"
#: editor/plugins/script_text_editor.cpp
msgid "Remove All Breakpoints"
msgstr "ã™ã¹ã¦ã®ãƒ–レークãƒã‚¤ãƒ³ãƒˆã‚’消去"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
+msgid "Go to Next Breakpoint"
msgstr "次ã®ãƒ–レークãƒã‚¤ãƒ³ãƒˆã«ç§»å‹•"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr "最後ã®ãƒ–レークãƒã‚¤ãƒ³ãƒˆã«æˆ»ã‚‹"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr "大文字ã«å¤‰æ›"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr "å°æ–‡å­—ã«å¤‰æ›"
+msgid "Go to Previous Breakpoint"
+msgstr "å‰ã®ãƒ–レークãƒã‚¤ãƒ³ãƒˆã«ç§»å‹•"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
@@ -6363,18 +5852,16 @@ msgstr "å‰ã‚’検索"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr "ファイルを絞り込む..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Goto Function..."
-msgstr "関数~ã«ç§»å‹•..."
+msgid "Go to Function..."
+msgstr "関数ã«ç§»å‹•..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Goto Line..."
-msgstr "~行ã«ç§»å‹•..."
+msgid "Go to Line..."
+msgstr "行ã«ç§»å‹•..."
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -6387,7 +5874,7 @@ msgstr "シェーダー"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "This skeleton has no bones, create some children Bone2D nodes."
-msgstr ""
+msgstr "ã“ã®skeletonã«ã¯ãƒœãƒ¼ãƒ³ãŒã‚りã¾ã›ã‚“。å­Bone2Dノードを追加ã—ã¦ãã ã•ã„。"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
#, fuzzy
@@ -6424,7 +5911,7 @@ msgstr "実行"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Orthogonal"
-msgstr "並行投影"
+msgstr "平行投影"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Perspective"
@@ -6475,12 +5962,20 @@ msgid "Animation Key Inserted."
msgstr "アニメーションã®ã‚­ãƒ¼ãŒæŒ¿å…¥ã•れã¦ã„ã¾ã™."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr "ピッãƒ"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr "ヨー"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr "æç”»ã•れãŸã‚ªãƒ–ジェクト"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Material Changes"
-msgstr "ç´ æã®å¤‰æ›´"
+msgstr "マテリアルã®å¤‰æ›´"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Shader Changes"
@@ -6488,11 +5983,11 @@ msgstr "シェーダーã®å¤‰æ›´"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Surface Changes"
-msgstr "サーフェースã®å¤‰æ›´"
+msgstr "サーフェスã®å¤‰æ›´"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Draw Calls"
-msgstr "ドローコール(Daw call)"
+msgstr "ドローコール"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Vertices"
@@ -6516,7 +6011,7 @@ msgstr "下é¢"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Left View."
-msgstr "å·¦å´é¢å›³."
+msgstr "å·¦å´é¢å›³ã€‚"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Left"
@@ -6524,7 +6019,7 @@ msgstr "å·¦å´é¢"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Right View."
-msgstr "å³å´é¢å›³."
+msgstr "å³å´é¢å›³ã€‚"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Right"
@@ -6570,17 +6065,14 @@ msgid "Display Normal"
msgstr "通常表示"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Display Wireframe"
msgstr "ワイヤーフレーム表示"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Display Overdraw"
-msgstr "逿˜Žã‚·ãƒ«ã‚¨ãƒƒãƒˆè¡¨ç¤º"
+msgstr "オーãƒãƒ¼ãƒ‰ãƒ­ãƒ¼ã‚’表示"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Display Unshaded"
msgstr "シェーディングãªã—ã§è¡¨ç¤º"
@@ -6589,24 +6081,21 @@ msgid "View Environment"
msgstr "環境表示"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "View Gizmos"
-msgstr "ギズモ(Gizmo)表示"
+msgstr "ギズモ(Gizmo)を表示"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "View Information"
msgstr "情報を表示"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "View FPS"
-msgstr "ビューファイル:"
+msgstr "フレームレートを表示"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Half Resolution"
-msgstr "縮尺(Scale)ã®é¸æŠž"
+msgstr "åŠè§£åƒåº¦"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Audio Listener"
@@ -6652,13 +6141,17 @@ msgid "Freelook Speed Modifier"
msgstr "フリールックã®é€Ÿåº¦ã‚’調整"
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "情報を表示"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "Xformダイアログ"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Select Mode (Q)"
-msgstr "é¸æŠžãƒ¢ãƒ¼ãƒ‰"
+msgstr "é¸æŠžãƒ¢ãƒ¼ãƒ‰ (Q)"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
@@ -6674,7 +6167,7 @@ msgstr "移動モード (W)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode (E)"
-msgstr "回転Mode (E)"
+msgstr "回転モード (E)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scale Mode (R)"
@@ -6685,18 +6178,16 @@ msgid "Local Coords"
msgstr "ローカル座標系"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Local Space Mode (%s)"
-msgstr "スケール(拡大縮å°ï¼‰ãƒ¢ãƒ¼ãƒ‰(R)"
+msgstr "ローカル空間モード (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Snap Mode (%s)"
-msgstr "Snapモード:"
+msgstr "スナップモード (%s)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
-msgstr "底é¢å›³"
+msgstr "下é¢å›³"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Top View"
@@ -6711,12 +6202,10 @@ msgid "Front View"
msgstr "å‰é¢å›³"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Left View"
msgstr "å·¦å´é¢å›³"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Right View"
msgstr "å³å´é¢å›³"
@@ -6761,11 +6250,6 @@ msgstr "拡大縮å°ãƒ„ール"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
-msgid "Snap To Floor"
-msgstr "Snapモード:"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Toggle Freelook"
msgstr "フルスクリーンã®åˆ‡ã‚Šæ›¿ãˆ"
@@ -6808,9 +6292,8 @@ msgid "4 Viewports"
msgstr "4 ビューãƒãƒ¼ãƒˆ"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Gizmos"
-msgstr "ギズモ(Gizmo)表示"
+msgstr "ギズモ"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Origin"
@@ -6822,7 +6305,6 @@ msgstr "ビューã®ã‚°ãƒªãƒƒãƒ‰"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Settings"
msgstr "設定"
@@ -6889,6 +6371,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
msgid "Sprite is empty!"
@@ -6903,14 +6389,12 @@ msgid "Invalid geometry, can't replace by mesh."
msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite"
-msgstr "スタックフレーム"
+msgstr "スプライト"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to 2D Mesh"
-msgstr "~ã«å¤‰æ›ã™ã‚‹..."
+msgstr "2Dメッシュã«å¤‰æ›"
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
@@ -6927,14 +6411,12 @@ msgid "Grow (Pixels): "
msgstr "スナップ機能(ピクセルå˜ä½ï¼‰:"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Update Preview"
-msgstr "プレビュー"
+msgstr "プレビューを更新"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Settings:"
-msgstr "設定"
+msgstr "設定:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
#, fuzzy
@@ -6942,7 +6424,6 @@ msgid "ERROR: Couldn't load frame resource!"
msgstr "エラー:フレームリソースを読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ!"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Add Frame"
msgstr "フレームを追加"
@@ -6952,9 +6433,8 @@ msgid "Resource clipboard is empty or not a texture!"
msgstr "リソースクリップボードã¯ç©ºã‹ã€ãƒ†ã‚¯ã‚¹ãƒãƒ£ä»¥å¤–ã§ã™!"
#: editor/plugins/sprite_frames_editor_plugin.cpp
-#, fuzzy
msgid "Paste Frame"
-msgstr "フレームを張り付ã‘"
+msgstr "フレームを貼り付ã‘"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Empty"
@@ -6990,11 +6470,11 @@ msgstr "アニメーションã®ãƒ•レーム"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Insert Empty (Before)"
-msgstr ""
+msgstr "空を挿入 (å‰)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Insert Empty (After)"
-msgstr ""
+msgstr "空を挿入 (後)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
#, fuzzy
@@ -7017,12 +6497,18 @@ msgid "Set Region Rect"
msgstr "テクスãƒãƒ£ã€€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³"
#: editor/plugins/texture_region_editor_plugin.cpp
+#, fuzzy
+msgid "Set Margin"
+msgstr "ãƒãƒ³ãƒ‰ãƒ«ã‚’設定ã™ã‚‹"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr "Snapモード:"
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
-msgstr "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
+msgstr "None"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Pixel Snap"
@@ -7067,14 +6553,12 @@ msgid "Add All"
msgstr "ã™ã¹ã¦ã‚’追加"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Remove All Items"
-msgstr "アイテムを除去"
+msgstr "ã™ã¹ã¦ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’除去"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Remove All"
-msgstr "削除"
+msgstr "ã™ã¹ã¦é™¤åŽ»"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Edit theme..."
@@ -7198,6 +6682,11 @@ msgid "Fix Invalid Tiles"
msgstr "無効ãªåå‰ã§ã™."
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "é¸æŠžå¯¾è±¡ã‚’ä¸­å¤®ã«"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr "タイルマップを塗る"
@@ -7246,33 +6735,40 @@ msgstr "ã‚¿ã‚¤ãƒ«ã‚’é¸æŠž"
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "é¸æŠžã—ã¦ã„ã‚‹ã‚‚ã®ã‚’削除"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr "0度回転"
+#, fuzzy
+msgid "Rotate left"
+msgstr "回転モード"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Rotate right"
+msgstr "å³ã«ç§»å‹•"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr "90度回転"
+msgid "Flip horizontally"
+msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
-msgstr "180度回転"
+msgid "Flip vertically"
+msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
-msgstr "270度回転"
+#, fuzzy
+msgid "Clear transform"
+msgstr "トランスフォーム"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr "シーンã‹ã‚‰ã®ãƒŽãƒ¼ãƒ‰"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr "パスã®ãƒã‚¤ãƒ³ãƒˆã‚’除去"
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -7284,27 +6780,47 @@ msgid "Merge from Scene"
msgstr "シーンã‹ã‚‰ãƒžãƒ¼ã‚¸"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
-msgstr ""
+msgid "Paste bitmask."
+msgstr "ビットマスクを貼り付ã‘。"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
-msgstr ""
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "点を消ã™ã€‚"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "You haven't selected a texture to remove."
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "æ–°è¦ã«ãƒãƒªã‚´ãƒ³ã‚’生æˆã™ã‚‹"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
+msgstr "スナップã¨ã‚°ãƒªãƒƒãƒ‰ã®è¡¨ç¤ºã‚’有効ã«ã™ã‚‹ (インスペクタã‹ã‚‰è¨­å®šå¯èƒ½)。"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr "タイルåを表示 (Altキーを長押ã—)"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Create from scene?"
-msgstr "シーンã‹ã‚‰ç”Ÿæˆã—ã¾ã™ã‹ï¼Ÿ"
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "パスã®ãƒã‚¤ãƒ³ãƒˆã‚’除去"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "You haven't selected a texture to remove."
+msgstr "除去ã™ã‚‹ãƒ†ã‚¯ã‚¹ãƒãƒ£ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -7312,8 +6828,13 @@ msgid "Merge from scene?"
msgstr "シーンã‹ã‚‰ãƒžãƒ¼ã‚¸ã—ã¾ã™ã‹ï¼Ÿ"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
-msgstr ""
+#, fuzzy
+msgid "Remove Texture"
+msgstr "テンプレートを除去"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
+msgstr "%s ファイル ã¯ã™ã§ã«ãƒªã‚¹ãƒˆã«å«ã¾ã‚Œã¦ã„ã‚‹ãŸã‚追加ã•れã¾ã›ã‚“ã§ã—ãŸã€‚"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -7322,16 +6843,26 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "é¸æŠžã—ãŸãƒ•ァイルを削除ã—ã¾ã™ã‹ï¼Ÿ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr ""
+msgstr "ç¾åœ¨ç·¨é›†ä¸­ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’ä¿å­˜ã™ã‚‹"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete polygon."
+msgstr "ãƒãƒªã‚´ãƒ³ã‚’削除。"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr "ç¾åœ¨ç·¨é›†ä¸­ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’ä¿å­˜ã™ã‚‹"
@@ -7350,16 +6881,104 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr "ç¾åœ¨ç·¨é›†ä¸­ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’ä¿å­˜ã™ã‚‹"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Set Tile Region"
+msgstr "テクスãƒãƒ£ã€€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "フォルダーを作æˆ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "フィルタã®ç·¨é›†"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "既存ã®ãƒãƒªã‚´ãƒ³ã‚’編集:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "ãƒãƒªã‚´ãƒ³ã‚’編集"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "ナビゲーションãƒãƒªã‚´ãƒ³ã‚’生æˆ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "ビットマスクを貼り付ã‘。"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "テンプレートを除去"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "ãƒãƒªã‚´ãƒ³ã¨ç‚¹ã‚’除去"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "オクルージョンを生ã˜ã‚‹ãƒãƒªã‚´ãƒ³ã‚’生æˆ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "ナビゲーションãƒãƒªã‚´ãƒ³ã‚’生æˆ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "フィルタã®ç·¨é›†"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "ナビゲーションãƒãƒªã‚´ãƒ³ã‚’生æˆ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "オクルージョンを生ã˜ã‚‹ãƒãƒªã‚´ãƒ³ã‚’生æˆ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "This property can't be changed."
msgstr "ã“ã®å‡¦ç†ã«ã¯ã‚·ãƒ¼ãƒ³ãŒå¿…è¦ã§ã™."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Tile Set"
+msgid "TileSet"
msgstr "タイルセット..."
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vertex"
msgstr "頂点"
@@ -7383,20 +7002,28 @@ msgid "Runnable"
msgstr "実行å¯èƒ½"
#: editor/project_export.cpp
-#, fuzzy
msgid "Delete patch '%s' from list?"
-msgstr "パッãƒé™¤åŽ»'"
+msgstr "パッム'%s' をリストã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹?"
#: editor/project_export.cpp
-#, fuzzy
msgid "Delete preset '%s'?"
-msgstr "åˆæœŸè¨­å®šå€¤ '%s'?を削除ã—ã¾ã™ã‹ï¼Ÿ"
+msgstr "プリセット '%s' を削除ã—ã¾ã™ã‹?"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
-"ã“ã®ãƒ—ラットフォームã«å‘ã‘ã¦ã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã®ãƒ†ãƒ³ãƒ—レートãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“:"
+"ã“ã®ãƒ—ラットフォームã«å¯¾ã™ã‚‹ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ テンプレートãŒè¦‹ã¤ã‹ã‚‰ãªã„ã‹ã€ç ´æã—"
+"ã¦ã„ã¾ã™:"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Release"
+msgstr "離ã—ãŸ"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Exporting All"
+msgstr "%sã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆä¸­"
#: editor/project_export.cpp
msgid "Presets"
@@ -7407,11 +7034,14 @@ msgid "Add..."
msgstr "追加..."
#: editor/project_export.cpp
+msgid "Export Path"
+msgstr "エクスãƒãƒ¼ãƒˆå…ˆã®ãƒ‘ス"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr "リソース"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export all resources in the project"
msgstr "プロジェクト内ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’ã™ã¹ã¦ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ"
@@ -7433,25 +7063,20 @@ msgid "Resources to export:"
msgstr "エクスãƒãƒ¼ãƒˆã™ã‚‹ãƒªã‚½ãƒ¼ã‚¹:"
#: editor/project_export.cpp
-#, fuzzy
msgid ""
"Filters to export non-resource files (comma separated, e.g: *.json, *.txt)"
msgstr ""
-"リソース以外ã®ãƒ•ァイルをエクスãƒãƒ¼ãƒˆã™ã‚‹éš›ã®é¸åˆ¥åŸºæº–(Filters)(コンマã§åˆ†å‰²,"
-"例*.json, *.txt)"
+"エクスãƒãƒ¼ãƒˆã™ã‚‹éžãƒªã‚½ãƒ¼ã‚¹ãƒ•ァイルã®ãƒ•ィルタ (コンマ区切り, 例*.json, *.txt)"
#: editor/project_export.cpp
-#, fuzzy
msgid ""
"Filters to exclude files from project (comma separated, e.g: *.json, *.txt)"
msgstr ""
-"リソース以外ã®ãƒ•ァイルをエクスãƒãƒ¼ãƒˆã™ã‚‹éš›ã®é™¤å¤–基準(Filters)(コンマã§åˆ†å‰²,"
-"例*.json, *.txt)"
+"プロジェクトã‹ã‚‰é™¤å¤–ã™ã‚‹ãƒ•ァイルã®ãƒ•ィルタ (コンマ区切り, 例*.json, *.txt)"
#: editor/project_export.cpp
-#, fuzzy
msgid "Patches"
-msgstr "一致ãªã—"
+msgstr "パッãƒ"
#: editor/project_export.cpp
msgid "Make Patch"
@@ -7464,7 +7089,7 @@ msgstr "テクスãƒãƒ£"
#: editor/project_export.cpp
msgid "Custom (comma-separated):"
-msgstr "カスタム(コンマ区切り):"
+msgstr "カスタム (コンマ区切り):"
#: editor/project_export.cpp
#, fuzzy
@@ -7473,53 +7098,88 @@ msgstr "メソッド一覧:"
#: editor/project_export.cpp
#, fuzzy
+msgid "Script"
+msgstr "æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Script Export Mode:"
+msgstr "エクスãƒãƒ¼ãƒˆã®ãƒ¢ãƒ¼ãƒ‰:"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Text"
+msgstr "テクスãƒãƒ£"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Compiled"
+msgstr "圧縮"
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
-msgstr "エクスãƒãƒ¼ãƒˆ"
+msgstr "PCK/Zipã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ"
#: editor/project_export.cpp
#, fuzzy
+msgid "Export mode?"
+msgstr "エクスãƒãƒ¼ãƒˆã®ãƒ¢ãƒ¼ãƒ‰:"
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr "ã™ã¹ã¦ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
-msgstr ""
-"ã“ã®ãƒ—ラットフォームã«å‘ã‘ã¦ã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã®ãƒ†ãƒ³ãƒ—レートãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“:"
+msgstr "ã“ã®ãƒ—ラットフォームã«å¯¾ã™ã‚‹ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ テンプレートãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“:"
#: editor/project_export.cpp
msgid "Export With Debug"
msgstr "デãƒãƒƒã‚°ä»˜ãエクスãƒãƒ¼ãƒˆ"
#: editor/project_manager.cpp
-#, fuzzy
msgid "The path does not exist."
-msgstr "ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“."
+msgstr "存在ã—ãªã„パスã§ã™ã€‚"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
-msgstr "'project.godot'ãŒãªã„ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ã¦ãã ã•ã„."
+msgstr ""
+"無効㪠'.zip' プロジェクトファイルã§ã™ã€‚'project.godot' ファイルãŒå«ã¾ã‚Œã¦ã„"
+"ã¾ã›ã‚“。"
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "空ã®ãƒ•ã‚©ãƒ«ãƒ€ãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„。"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "'project.godot' ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„."
+msgstr "'project.godot' ã‚‚ã—ã㯠'.zip' ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„."
#: editor/project_manager.cpp
msgid "Directory already contains a Godot project."
-msgstr ""
+msgstr "ディレクトリã«ã¯GodotプロジェクトãŒã™ã§ã«å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚"
#: editor/project_manager.cpp
msgid "Imported Project"
msgstr "インãƒãƒ¼ãƒˆã•れãŸãƒ—ロジェクト"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Invalid Project Name."
-msgstr "プロジェクトå:"
+msgstr "無効ãªãƒ—ロジェクトåã§ã™ã€‚"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Couldn't create folder."
msgstr "フォルダを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
@@ -7554,9 +7214,8 @@ msgid "Couldn't create project.godot in project path."
msgstr "project.godotをプロジェクトパスã«ç”Ÿæˆã§ãã¾ã›ã‚“ã§ã—ãŸ"
#: editor/project_manager.cpp
-#, fuzzy
msgid "The following files failed extraction from package:"
-msgstr "以下ã®ãƒ•ァイルをパッケージã‹ã‚‰æŠ½å‡ºã§ãã¾ã›ã‚“ã§ã—ãŸ:"
+msgstr "次ã®ãƒ•ァイルをパッケージã‹ã‚‰æŠ½å‡ºã§ãã¾ã›ã‚“ã§ã—ãŸ:"
#: editor/project_manager.cpp
msgid "Rename Project"
@@ -7571,9 +7230,8 @@ msgid "Import Existing Project"
msgstr "既存ã®ãƒ—ロジェクトをインãƒãƒ¼ãƒˆ"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Import & Edit"
-msgstr "インãƒãƒ¼ãƒˆã—ã¦é–‹ã"
+msgstr "インãƒãƒ¼ãƒˆã—ã¦ç·¨é›†"
#: editor/project_manager.cpp
msgid "Create New Project"
@@ -7588,9 +7246,8 @@ msgid "Install Project:"
msgstr "プロジェクトをインストール:"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Install & Edit"
-msgstr "インストール"
+msgstr "インストールã—ã¦ç·¨é›†"
#: editor/project_manager.cpp
msgid "Project Name:"
@@ -7605,25 +7262,43 @@ msgid "Project Path:"
msgstr "プロジェクトパス:"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Project Installation Path:"
-msgstr "プロジェクトパス:"
+msgstr "プロジェクトã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãƒ‘ス:"
#: editor/project_manager.cpp
msgid "Browse"
-msgstr "å‚照…"
+msgstr "å‚ç…§"
#: editor/project_manager.cpp
msgid "Unnamed Project"
msgstr "åç„¡ã—ã®ãƒ—ロジェクト"
#: editor/project_manager.cpp
-msgid "Can't open project"
+#, fuzzy
+msgid "Can't open project at '%s'."
msgstr "プロジェクトを開ã‘ã¾ã›ã‚“"
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
-msgstr "複数ã®ãƒ—ロジェクトを本当ã«é–‹ã‘ã¾ã™ã‹ï¼Ÿ"
+msgstr "複数ã®ãƒ—ロジェクトを開ã„ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹?"
+
+#: editor/project_manager.cpp
+msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
#: editor/project_manager.cpp
#, fuzzy
@@ -7644,7 +7319,7 @@ msgstr ""
#: editor/project_manager.cpp
msgid "Are you sure to run more than one project?"
-msgstr "複数ã®ãƒ—ロジェクトを本当ã«å®Ÿè¡Œã—ã¾ã™ã‹ï¼Ÿ"
+msgstr "複数ã®ãƒ—ロジェクトを実行ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹?"
#: editor/project_manager.cpp
msgid "Remove project from the list? (Folder contents will not be modified)"
@@ -7710,9 +7385,8 @@ msgstr ""
"アセットライブラリã§å…¬å¼ã®ã‚µãƒ³ãƒ—ルプロジェクトをãƒã‚§ãƒƒã‚¯ã—ã¾ã™ã‹ï¼Ÿ"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Key "
-msgstr "キー.. "
+msgstr "キー "
#: editor/project_settings_editor.cpp
#, fuzzy
@@ -7753,9 +7427,8 @@ msgid "Add Input Action Event"
msgstr "入力アクションイベントを追加"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "All Devices"
-msgstr "デãƒã‚¤ã‚¹"
+msgstr "ã™ã¹ã¦ã®ãƒ‡ãƒã‚¤ã‚¹"
#: editor/project_settings_editor.cpp
msgid "Device"
@@ -7884,7 +7557,7 @@ msgstr "プロパティã«getter(get method)を作る"
#: editor/project_settings_editor.cpp
msgid "Select a setting item first!"
-msgstr "設定項目を設定ã—ã¦ãã ã•ã„!"
+msgstr "è¨­å®šé …ç›®ã‚’é¸æŠžã—ã¦ãã ã•ã„!"
#: editor/project_settings_editor.cpp
#, fuzzy
@@ -7896,20 +7569,20 @@ msgid "Setting '%s' is internal, and it can't be deleted."
msgstr ""
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Delete Item"
-msgstr "入力を消去"
+msgstr "アイテムを削除"
#: editor/project_settings_editor.cpp
msgid ""
"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'."
msgstr ""
+"無効ãªã‚¢ã‚¯ã‚·ãƒ§ãƒ³åã§ã™ã€‚空もã—ãã¯'/', ':', '=', '\\' ã‚„ '\"'ã‚’å«ã‚ã‚‹ã“ã¨ã¯ã§"
+"ãã¾ã›ã‚“。"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Already existing"
-msgstr "アクション'%s'ã¯æ—¢ã«ã‚りã¾ã™!"
+msgstr "æ—¢ã«å­˜åœ¨ã—ã¾ã™"
#: editor/project_settings_editor.cpp
#, fuzzy
@@ -7933,7 +7606,6 @@ msgid "Add Translation"
msgstr "翻訳を追加"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Remove Translation"
msgstr "翻訳を除去"
@@ -7971,7 +7643,6 @@ msgid "Changed Locale Filter Mode"
msgstr ""
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Project Settings (project.godot)"
msgstr "プロジェクト設定 (project.godot)"
@@ -7979,17 +7650,13 @@ msgstr "プロジェクト設定 (project.godot)"
msgid "General"
msgstr "一般"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr "プロパティ:"
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Editor must be restarted for changes to take effect"
-msgstr ""
+msgstr "変更を有効ã«ã™ã‚‹ã«ã¯ã€ã‚¨ãƒ‡ã‚£ã‚¿ã‚’å†èµ·å‹•ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™"
#: editor/project_settings_editor.cpp
msgid "Input Map"
@@ -8000,9 +7667,8 @@ msgid "Action:"
msgstr "アクション:"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Action"
-msgstr "アクション:"
+msgstr "アクション"
#: editor/project_settings_editor.cpp
msgid "Deadzone"
@@ -8037,19 +7703,16 @@ msgid "Resources:"
msgstr "リソース:"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Remaps by Locale:"
-msgstr "ロケールã«å¾“ã£ã¦ã‚­ãƒ¼ã®ãƒªãƒžãƒƒãƒ—:"
+msgstr "ロケールã«å¾“ã„リマップ:"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Locale"
msgstr "ロケール"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Locales Filter"
-msgstr "ロケールフィルタ"
+msgstr "ロケールフィルター"
#: editor/project_settings_editor.cpp
msgid "Show all locales"
@@ -8060,14 +7723,12 @@ msgid "Show only selected locales"
msgstr "é¸æŠžã—ãŸãƒ­ã‚±ãƒ¼ãƒ«ã®ã¿è¡¨ç¤º"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Filter mode:"
-msgstr "フィルター"
+msgstr "フィルターモード:"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Locales:"
-msgstr "ロケール"
+msgstr "ロケール:"
#: editor/project_settings_editor.cpp
msgid "AutoLoad"
@@ -8107,14 +7768,12 @@ msgid "Assign"
msgstr "アサインã™ã‚‹"
#: editor/property_editor.cpp
-#, fuzzy
msgid "Select Node"
msgstr "ãƒŽãƒ¼ãƒ‰ã‚’é¸æŠž"
#: editor/property_editor.cpp
-#, fuzzy
msgid "Error loading file: Not a resource!"
-msgstr "ファイル読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼:リソースã§ã¯ã‚りã¾ã›ã‚“!"
+msgstr "ファイル読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼: リソースã§ã¯ã‚りã¾ã›ã‚“!"
#: editor/property_editor.cpp
#, fuzzy
@@ -8125,11 +7784,6 @@ msgstr "ノードã¸ã®ãƒ‘ス:"
msgid "Bit %d, val %d."
msgstr "ビット %d, 値 %d."
-#: editor/property_editor.cpp
-#, fuzzy
-msgid "Properties:"
-msgstr "プロパティ:"
-
#: editor/property_selector.cpp
#, fuzzy
msgid "Select Property"
@@ -8160,11 +7814,11 @@ msgstr "åå‰ã®å¤‰æ›´"
#: editor/rename_dialog.cpp
msgid "Prefix"
-msgstr ""
+msgstr "プレフィックス"
#: editor/rename_dialog.cpp
msgid "Suffix"
-msgstr ""
+msgstr "サフィックス"
#: editor/rename_dialog.cpp
#, fuzzy
@@ -8176,9 +7830,8 @@ msgid "Substitute"
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node name"
-msgstr "ノードã®åå‰:"
+msgstr "ノードå"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
@@ -8190,14 +7843,12 @@ msgid "Node type"
msgstr "ノードタイプを探ã™"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Current scene name"
-msgstr "ç¾åœ¨ã®ã‚·ãƒ¼ãƒ³"
+msgstr "ç¾åœ¨ã®ã‚·ãƒ¼ãƒ³å"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Root node name"
-msgstr "ルートノードã®åå‰:"
+msgstr "ルートノードå"
#: editor/rename_dialog.cpp
msgid ""
@@ -8218,12 +7869,11 @@ msgid "Initial value for the counter"
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Step"
-msgstr "ステップ:"
+msgstr "ステップ"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -8232,7 +7882,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -8242,9 +7892,8 @@ msgid "Regular Expressions"
msgstr "å¼ã‚’変更"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Post-Process"
-msgstr "後処ç†ã‚¹ã‚¯ãƒªãƒ—ト:"
+msgstr "ãƒã‚¹ãƒˆãƒ—ロセス"
#: editor/rename_dialog.cpp
msgid "Keep"
@@ -8265,25 +7914,24 @@ msgstr ""
#: editor/rename_dialog.cpp
#, fuzzy
msgid "To Lowercase"
-msgstr "å°æ–‡å­—"
+msgstr "å°æ–‡å­—ã«ã™ã‚‹"
#: editor/rename_dialog.cpp
#, fuzzy
msgid "To Uppercase"
-msgstr "大文字"
+msgstr "大文字ã«ã™ã‚‹"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Reset"
-msgstr "ズームをリセット"
+msgstr "リセット"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr "エラー"
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent Node"
-msgstr ""
+msgstr "親ノードを変更"
#: editor/reparent_dialog.cpp
msgid "Reparent Location (Select new Parent):"
@@ -8295,7 +7943,7 @@ msgstr ""
#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
msgid "Reparent"
-msgstr ""
+msgstr "親を変更"
#: editor/run_settings_dialog.cpp
msgid "Run Mode:"
@@ -8311,12 +7959,10 @@ msgid "Main Scene"
msgstr "メインシーン"
#: editor/run_settings_dialog.cpp
-#, fuzzy
msgid "Main Scene Arguments:"
msgstr "メインシーンã®å¼•æ•°:"
#: editor/run_settings_dialog.cpp
-#, fuzzy
msgid "Scene Run Settings"
msgstr "シーン実行ã®è¨­å®š"
@@ -8339,12 +7985,14 @@ msgstr ""
"化ã§ãã¾ã›ã‚“"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Instance Scene(s)"
msgstr "シーンã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹åŒ–"
#: editor/scene_tree_dock.cpp
-#, fuzzy
+msgid "Instance Child Scene"
+msgstr "å­ã‚·ãƒ¼ãƒ³ã‚’インスタンス化"
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr "スクリプトをクリア"
@@ -8364,14 +8012,12 @@ msgid "Move Nodes In Parent"
msgstr "親ã®ãƒŽãƒ¼ãƒ‰ã‚’移動"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Duplicate Node(s)"
msgstr "ノードを複製"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete Node(s)?"
-msgstr "ノードを除去ã—ã¾ã™ã‹ï¼Ÿ"
+msgstr "ノードを削除ã—ã¾ã™ã‹?"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -8388,6 +8034,12 @@ msgid "Save New Scene As..."
msgstr "æ–°è¦ã‚·ãƒ¼ãƒ³ã«åå‰ã‚’付ã‘ã¦ä¿å­˜..."
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
#, fuzzy
msgid "Editable Children"
msgstr "編集å¯èƒ½ãªå­"
@@ -8402,29 +8054,24 @@ msgid "Make Local"
msgstr "ロケール"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "ノードを生æˆ"
+msgstr "ルートノードを生æˆ:"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "2D Scene"
-msgstr "シーン"
+msgstr "2D シーン"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "3D Scene"
-msgstr "シーン"
+msgstr "3D シーン"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "User Interface"
-msgstr "継承をクリアã™ã‚‹"
+msgstr "ユーザーインターフェース"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Custom Node"
-msgstr "ノードを切りå–ã‚‹"
+msgstr "カスタムノード"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
@@ -8436,9 +8083,8 @@ msgid "Can't operate on nodes the current scene inherits from!"
msgstr "ç¾åœ¨ã®ã‚·ãƒ¼ãƒ³ãŒç¶™æ‰¿ã™ã‚‹ãƒŽãƒ¼ãƒ‰ã‚’処ç†ã§ãã¾ã›ã‚“!"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Attach Script"
-msgstr "スクリプトを付与"
+msgstr "スクリプトをアタッãƒ"
#: editor/scene_tree_dock.cpp
msgid "Remove Node(s)"
@@ -8462,18 +8108,20 @@ msgid "Error duplicating scene to save it."
msgstr "ä¿å­˜ã®ãŸã‚シーンを複製ã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿ."
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Sub-Resources"
-msgstr "サブリソース:"
+msgstr "サブリソース"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Clear Inheritance"
-msgstr "継承をクリアã™ã‚‹"
+msgstr "継承をクリア"
+
+#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr "ドキュメントを開ã"
#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
-msgstr "ノードを消去"
+msgstr "ノードを削除"
#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
@@ -8481,41 +8129,36 @@ msgstr "å­ãƒŽãƒ¼ãƒ‰ã‚’追加"
#: editor/scene_tree_dock.cpp
#, fuzzy
-msgid "Instance Child Scene"
-msgstr "å­ã‚·ãƒ¼ãƒ³ã‚’インスタンス化"
-
-#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Change Type"
msgstr "型(type)を変更"
#: editor/scene_tree_dock.cpp
-#, fuzzy
+msgid "Extend Script"
+msgstr "スクリプトを拡張"
+
+#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
-msgstr "有æ„義ã«!"
+msgstr "シーンをルートã«ã™ã‚‹"
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
msgstr "シーンã‹ã‚‰ãƒžãƒ¼ã‚¸"
#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Save Branch as Scene"
msgstr "ブランãƒã‚’シーンã¨ã—ã¦ä¿å­˜"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Copy Node Path"
msgstr "ノードã®ãƒ‘スをコピー"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Delete (No Confirm)"
-msgstr "確èªã—ã¦ãã ã•ã„。"
+msgstr "削除 (確èªãªã—)"
#: editor/scene_tree_dock.cpp
msgid "Add/Create a New Node"
-msgstr "æ–°ã—ã„ノードを加ãˆã‚‹/生æˆã™ã‚‹"
+msgstr "æ–°ã—ã„ノードを追加/生æˆ"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -8527,24 +8170,20 @@ msgstr ""
"ã—ãŸã‚·ãƒ¼ãƒ³ã‚’生æˆ"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Attach a new or existing script for the selected node."
-msgstr "é¸æŠžã—ãŸãƒŽãƒ¼ãƒ‰ã«æ–°è¦/既存ã®ã‚¹ã‚¯ãƒªãƒ—トを付与"
+msgstr "é¸æŠžã—ãŸãƒŽãƒ¼ãƒ‰ã«æ–°è¦ã¾ãŸã¯æ—¢å­˜ã®ã‚¹ã‚¯ãƒªãƒ—トをアタッãƒã™ã‚‹ã€‚"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Clear a script for the selected node."
-msgstr "é¸æŠžã—ãŸãƒŽãƒ¼ãƒ‰ã®ã‚¹ã‚¯ãƒªãƒ—トをクリア"
+msgstr "é¸æŠžã—ãŸãƒŽãƒ¼ãƒ‰ã®ã‚¹ã‚¯ãƒªãƒ—トをクリアã™ã‚‹ã€‚"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Remote"
-msgstr "削除"
+msgstr "リモート"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Local"
-msgstr "ロケール"
+msgstr "ローカル"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -8589,18 +8228,16 @@ msgstr ""
"クリックã—ã¦ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ‰ãƒƒã‚¯ã‚’表示ã—ã¦ãã ã•ã„."
#: editor/scene_tree_editor.cpp editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script"
-msgstr "フォルダを作æˆ"
+msgstr "スクリプトを開ã"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node is locked.\n"
"Click to unlock it."
msgstr ""
-"ノードã¯ãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™.\n"
-"クリックã—ã¦ãƒ­ãƒƒã‚¯ã‚’外ã—ã¦ãã ã•ã„"
+"ノードã¯ãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚\n"
+"クリックã—ã¦ãƒ­ãƒƒã‚¯ã‚’外ã—ã¦ãã ã•ã„。"
#: editor/scene_tree_editor.cpp
#, fuzzy
@@ -8644,14 +8281,12 @@ msgid "Select a Node"
msgstr "ãƒŽãƒ¼ãƒ‰ã‚’é¸æŠž"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Error loading template '%s'"
-msgstr "イメージ読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼:"
+msgstr "テンプレート %s 読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Error - Could not create script in filesystem."
-msgstr "フォルダを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
+msgstr "エラー - ファイルシステムã«ã‚¹ã‚¯ãƒªãƒ—トを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
#: editor/script_create_dialog.cpp
#, fuzzy
@@ -8660,7 +8295,7 @@ msgstr "フォント読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼ã€‚"
#: editor/script_create_dialog.cpp
msgid "N/A"
-msgstr "利用ã§ããªã„"
+msgstr "N/A"
#: editor/script_create_dialog.cpp
#, fuzzy
@@ -8672,6 +8307,10 @@ msgid "Path is empty"
msgstr "パスãŒã‚りã¾ã›ã‚“"
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr "ファイルåãŒç©ºã§ã™"
+
+#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Path is not local"
msgstr "パスã¯ãƒ­ãƒ¼ã‚«ãƒ«ã§ã¯ã‚りã¾ã›ã‚“"
@@ -8699,9 +8338,8 @@ msgid "Wrong extension chosen"
msgstr "æ‹¡å¼µå­ãŒèª¤ã£ã¦ã„ã¾ã™"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid Path"
-msgstr "無効ãªãƒ•ォント サイズã§ã™ã€‚"
+msgstr "無効ãªãƒ‘ス"
#: editor/script_create_dialog.cpp
msgid "Invalid class name"
@@ -8713,29 +8351,26 @@ msgid "Invalid inherited parent name or path"
msgstr "継承ã—ãŸè¦ªã®åå‰ã‹ãƒ‘スãŒä¸æ­£ã§ã™"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Script valid"
-msgstr "スクリプトã¯å•題ã‚りã¾ã›ã‚“"
+msgstr "正当ãªã‚¹ã‚¯ãƒªãƒ—ト"
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9 and _"
-msgstr "使ãˆã‚‹æ–‡å­—ã¯:a-z, A-Z, 0-9 㨠_ã§ã™"
+msgstr "使用å¯èƒ½: a-z, A-Z, 0-9 㨠_"
#: editor/script_create_dialog.cpp
msgid "Built-in script (into scene file)"
msgstr "組ã¿è¾¼ã¿ã‚¹ã‚¯ãƒªãƒ—ト(シーンファイルã®ï¼‰"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Create new script file"
-msgstr "フォルダを作æˆ"
+msgstr "æ–°è¦ã‚¹ã‚¯ãƒªãƒ—トファイルを作æˆ"
#: editor/script_create_dialog.cpp
msgid "Load existing script file"
msgstr "既存ã®ã‚¹ã‚¯ãƒªãƒ—トファイルを読ã¿è¾¼ã‚€"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Language"
msgstr "言語"
@@ -8748,9 +8383,8 @@ msgid "Class Name"
msgstr "クラスå"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Template"
-msgstr "é¸æŠžã—ã¦ã„ã‚‹ã‚‚ã®ã‚’削除"
+msgstr "テンプレート"
#: editor/script_create_dialog.cpp
msgid "Built-in Script"
@@ -8762,33 +8396,20 @@ msgid "Attach Node Script"
msgstr "ノードã«ã‚¹ã‚¯ãƒªãƒ—トを添付ã™ã‚‹"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Remote "
-msgstr "削除"
+msgstr "リモート "
#: editor/script_editor_debugger.cpp
msgid "Bytes:"
msgstr "ãƒã‚¤ãƒˆ:"
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr "警告"
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr "エラー:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr "ソース:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
-msgstr "関数:"
+msgid "Stack Trace"
+msgstr "スタックトレース"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
-msgstr "グラフ表示ã™ã‚‹ã«ã¯ãƒªã‚¹ãƒˆã‹ã‚‰ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸ã‚“ã§ãã ã•ã„."
+msgstr "グラフを表示ã™ã‚‹ã«ã¯ã€ãƒªã‚¹ãƒˆã‹ã‚‰ã‚¢ã‚¤ãƒ†ãƒ ã‚’1ã¤ä»¥ä¸Šé¸ã‚“ã§ãã ã•ã„。"
#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp
msgid "Errors"
@@ -8799,9 +8420,8 @@ msgid "Child Process Connected"
msgstr "å­ãƒ—ロセス接続"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Copy Error"
-msgstr "読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼"
+msgstr "エラーをコピー"
#: editor/script_editor_debugger.cpp
#, fuzzy
@@ -8818,18 +8438,6 @@ msgid "Stack Frames"
msgstr "スタックフレーム"
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr "変数"
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr "エラー:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr "スタックトレース(å¯èƒ½ãªã‚‰ï¼‰:"
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr "プロファイラー"
@@ -8846,9 +8454,8 @@ msgid "Monitors"
msgstr "モニター"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "List of Video Memory Usage by Resource:"
-msgstr "リソースã«ã‚ˆã‚‹ãƒ“デオメモリーã®ä½¿ç”¨ãƒªã‚¹ãƒˆ:"
+msgstr "リソースã«ã‚ˆã‚‹ãƒ“デオメモリーã®ä½¿ç”¨ä¸€è¦§:"
#: editor/script_editor_debugger.cpp
msgid "Total:"
@@ -9001,16 +8608,15 @@ msgstr "パスã®ãƒã‚¤ãƒ³ãƒˆã‚’除去"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Double click to create a new entry"
-msgstr ""
+msgstr "ãƒ€ãƒ–ãƒ«ã‚¯ãƒªãƒƒã‚¯ã§æ–°è¦ã‚¨ãƒ³ãƒˆãƒªã‚’生æˆ"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Platform:"
-msgstr ""
+msgstr "プラットフォーム:"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
-#, fuzzy
msgid "Platform"
-msgstr "プラットフォームã¸ã‚³ãƒ”ー..."
+msgstr "プラットフォーム"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
#, fuzzy
@@ -9027,14 +8633,12 @@ msgid "GDNativeLibrary"
msgstr "メッシュライブラリ..."
#: modules/gdnative/gdnative_library_singleton_editor.cpp
-#, fuzzy
msgid "Library"
-msgstr "メッシュライブラリ..."
+msgstr "ライブラリ"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
-#, fuzzy
msgid "Status"
-msgstr "ステータス:"
+msgstr "ステータス"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Libraries: "
@@ -9042,10 +8646,11 @@ msgstr "ライブラリ: "
#: modules/gdnative/register_types.cpp
msgid "GDNative"
-msgstr ""
+msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+#, fuzzy
+msgid "Step argument is zero!"
msgstr "ステップ引数ã¯ã‚¼ãƒ­ã§ã™ï¼"
#: modules/gdscript/gdscript_functions.cpp
@@ -9207,9 +8812,8 @@ msgid "Erase Area"
msgstr "タイルマップを消去"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Clear Selection"
-msgstr "é¸æŠžå¯¾è±¡ã‚’ä¸­å¤®ã«"
+msgstr "é¸æŠžã‚’ã‚¯ãƒªã‚¢"
#: modules/gridmap/grid_map_editor_plugin.cpp
#, fuzzy
@@ -9237,7 +8841,7 @@ msgstr "八分木テクスãƒãƒ£ã‚’生æˆ"
#: modules/mono/editor/godotsharp_editor.cpp
msgid "Generating C# project..."
-msgstr ""
+msgstr "C#プロジェクトを生æˆã—ã¦ã„ã¾ã™â€¦"
#: modules/mono/editor/godotsharp_editor.cpp
#, fuzzy
@@ -9245,64 +8849,52 @@ msgid "Failed to create solution."
msgstr "アウトラインを生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ!"
#: modules/mono/editor/godotsharp_editor.cpp
-#, fuzzy
msgid "Failed to save solution."
-msgstr "リソース読ã¿è¾¼ã¿å¤±æ•—"
+msgstr "ソリューションã®ä¿å­˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
#: modules/mono/editor/godotsharp_editor.cpp
-#, fuzzy
msgid "Done"
-msgstr "完了!"
+msgstr "完了"
#: modules/mono/editor/godotsharp_editor.cpp
-#, fuzzy
msgid "Failed to create C# project."
-msgstr "リソース読ã¿è¾¼ã¿å¤±æ•—"
+msgstr "C#プロジェクトã®ç”Ÿæˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
#: modules/mono/editor/godotsharp_editor.cpp
msgid "Mono"
-msgstr "モノラル音声"
+msgstr "Mono"
#: modules/mono/editor/godotsharp_editor.cpp
msgid "About C# support"
-msgstr ""
+msgstr "C#ã®ã‚µãƒãƒ¼ãƒˆã«ã¤ã„ã¦"
#: modules/mono/editor/godotsharp_editor.cpp
-#, fuzzy
msgid "Create C# solution"
-msgstr "アウトラインを生æˆ"
+msgstr "C#ソリューションを生æˆ"
#: modules/mono/editor/mono_bottom_panel.cpp
msgid "Builds"
msgstr "ビルド"
#: modules/mono/editor/mono_bottom_panel.cpp
-#, fuzzy
msgid "Build Project"
-msgstr "プロジェクト"
+msgstr "プロジェクトをビルド"
#: modules/mono/editor/mono_bottom_panel.cpp
-#, fuzzy
msgid "Warnings"
msgstr "警告"
#: modules/mono/editor/mono_bottom_panel.cpp
-#, fuzzy
msgid "View log"
-msgstr "ビューファイル:"
+msgstr "ログを表示"
#: modules/mono/mono_gd/gd_mono_utils.cpp
msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr "ベイク!"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-#, fuzzy
-msgid "Bake the navigation mesh."
-msgstr "ナビメッシュ(ナビゲーションメッシュ)ã®ç”Ÿæˆ"
+msgid "Bake NavMesh"
+msgstr "NavMeshを焼ã込む"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -9400,14 +8992,12 @@ msgstr ""
"ã‚’!"
#: modules/visual_script/visual_script.cpp
-#, fuzzy
msgid "Stack overflow with stack depth: "
-msgstr "スタックãŒã‚ªãƒ¼ãƒãƒ¼ãƒ•ローã—ã¦ã„ã¾ã™: "
+msgstr "スタックオーãƒãƒ¼ãƒ•ロー ã‚¹ã‚¿ãƒƒã‚¯ã®æ·±ã•: "
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Change Signal Arguments"
-msgstr "シグナルã®å¼•数を編集:"
+msgstr "シグナルã®å¼•数を変更"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
@@ -9439,19 +9029,16 @@ msgid "Name is not a valid identifier:"
msgstr "ã“ã®åå‰ã¯ä¸æ­£ãªè­˜åˆ¥å­ã§ã™:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Name already in use by another func/var/signal:"
-msgstr "ä»–ã®é–¢æ•°/変数/シグナルã«ã‚ˆã‚Šæ—¢ã«ä½¿ã‚れã¦ã„ã‚‹åå‰ã§ã™:"
+msgstr "ä»–ã®é–¢æ•°/変数/シグナルã«ã‚ˆã‚Šæ—¢ã«ä½¿ã‚れã¦ã„ã‚‹åå‰:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Rename Function"
-msgstr "関数を作æˆ"
+msgstr "関数åを変更"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Rename Variable"
-msgstr "変数ã®åå‰ã‚’変ãˆã‚‹"
+msgstr "変数åを変更"
#: modules/visual_script/visual_script_editor.cpp
msgid "Rename Signal"
@@ -9462,34 +9049,28 @@ msgid "Add Function"
msgstr "関数を追加"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Variable"
-msgstr "変数を加ãˆã‚‹"
+msgstr "変数を追加"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Signal"
-msgstr "signalを加ãˆã‚‹"
+msgstr "シグナルを追加"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Change Expression"
msgstr "å¼ã‚’変更"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Add Node"
-msgstr "ノードを加ãˆã‚‹"
+msgstr "ノードを追加"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Remove VisualScript Nodes"
-msgstr "無効ãªã‚­ãƒ¼ã‚’削除"
+msgstr "VisualScriptノードを除去"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Duplicate VisualScript Nodes"
-msgstr "グラフノードを複製"
+msgstr "VisualScriptノードを複製"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
@@ -9548,14 +9129,12 @@ msgid "Change Base Type"
msgstr "型(type)を変更"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Move Node(s)"
-msgstr "ノードを除去"
+msgstr "ノードを移動"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Remove VisualScript Node"
-msgstr "シェーダーグラフノードを除去"
+msgstr "VisualScriptノードを除去"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
@@ -9587,19 +9166,16 @@ msgid "Can't copy the function node."
msgstr "'..'を処ç†ã§ãã¾ã›ã‚“"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Clipboard is empty!"
-msgstr "リソースã®ã‚¯ãƒªãƒƒãƒ—ボードã¯ç©ºã§ã™!"
+msgstr "クリップボードã¯ç©ºã§ã™!"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Paste VisualScript Nodes"
-msgstr "ノードを貼り付ã‘:"
+msgstr "VisualScriptノードを貼り付ã‘"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Remove Function"
-msgstr "é¸æŠžã—ã¦ã„ã‚‹ã‚‚ã®ã‚’削除"
+msgstr "関数を除去"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
@@ -9612,14 +9188,12 @@ msgid "Editing Variable:"
msgstr "変数を編集中:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Remove Signal"
-msgstr "é¸æŠžã—ã¦ã„ã‚‹ã‚‚ã®ã‚’削除"
+msgstr "シグナルを除去"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Editing Signal:"
-msgstr "ä¿¡å·ã‚’接続:"
+msgstr "シグナルを接続:"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
@@ -9627,34 +9201,35 @@ msgid "Base Type:"
msgstr "基底型(Base Type):"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "メンãƒãƒ¼:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "利用å¯èƒ½ãªãƒŽãƒ¼ãƒ‰:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Select or create a function to edit graph"
-msgstr "グラフを編集ã™ã‚‹é–¢æ•°ã‚’ã€é¸æŠžã™ã‚‹ã‹ç”Ÿæˆã™ã‚‹"
+msgstr "グラフを編集ã™ã‚‹é–¢æ•°ã‚’é¸æŠžã¾ãŸã¯ç”Ÿæˆ"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Signal Arguments:"
msgstr "シグナルã®å¼•数を編集:"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Variable:"
msgstr "変数を編集:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Delete Selected"
-msgstr "é¸æŠžç¯„å›²ã‚’æ¶ˆåŽ»"
+msgstr "é¸æŠžæ¸ˆã¿ã‚’削除"
#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Find Node Type"
msgstr "ノードタイプを探ã™"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Copy Nodes"
msgstr "ノードをコピー"
@@ -9664,12 +9239,11 @@ msgstr "ノードを切りå–ã‚‹"
#: modules/visual_script/visual_script_editor.cpp
msgid "Paste Nodes"
-msgstr "ノードを貼り付ã‘:"
+msgstr "ノードを貼り付ã‘"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
-msgstr "メンãƒãƒ¼:"
+msgstr "メンãƒãƒ¼ã‚’編集"
#: modules/visual_script/visual_script_flow_control.cpp
#, fuzzy
@@ -9707,14 +9281,12 @@ msgid "Invalid index property name '%s' in node %s."
msgstr "ノード%sã®ä¸æ­£ãªã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®ãƒ—ロパティå'%s' ."
#: modules/visual_script/visual_script_nodes.cpp
-#, fuzzy
msgid ": Invalid argument of type: "
-msgstr ":䏿­£ãªå¼•æ•°ã§ã™.引数ã®åž‹=: "
+msgstr ":無効ãªå¼•æ•° 引数ã®åž‹: "
#: modules/visual_script/visual_script_nodes.cpp
-#, fuzzy
msgid ": Invalid arguments: "
-msgstr ":䏿­£ãªå¼•æ•°: "
+msgstr ": 無効ãªå¼•æ•°: "
#: modules/visual_script/visual_script_nodes.cpp
#, fuzzy
@@ -9741,33 +9313,28 @@ msgstr ""
"ã‚“."
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Search VisualScript"
-msgstr "シェーダーグラフノードを除去"
+msgstr "VisualScriptを検索"
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
-msgid "Get"
-msgstr "Getメソッド"
+msgid "Get %s"
+msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
-#, fuzzy
msgid "Run in Browser"
msgstr "ブラウザã§å®Ÿè¡Œ"
#: platform/javascript/export/export.cpp
-#, fuzzy
msgid "Run exported HTML in the system's default browser."
-msgstr "エクスãƒãƒ¼ãƒˆã—ãŸHTMLファイルを既定ã®ãƒ–ラウザã§å®Ÿè¡Œ."
+msgstr "エクスãƒãƒ¼ãƒˆã—ãŸHTMLをシステム既定ã®ãƒ–ラウザã§å®Ÿè¡Œã™ã‚‹ã€‚"
#: platform/javascript/export/export.cpp
-#, fuzzy
msgid "Could not write file:"
-msgstr "ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã¿ã§ãã¾ã›ã‚“ã§ã—ãŸ:\n"
+msgstr "ファイルを書ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ:"
#: platform/javascript/export/export.cpp
#, fuzzy
@@ -9775,9 +9342,8 @@ msgid "Could not open template for export:"
msgstr "エクスãƒãƒ¼ãƒˆã™ã‚‹ãƒ†ãƒ³ãƒ—レートを開ã‘ã¾ã›ã‚“:\n"
#: platform/javascript/export/export.cpp
-#, fuzzy
msgid "Invalid export template:"
-msgstr "テンプレート エクスãƒãƒ¼ãƒˆã‚’管ç†"
+msgstr "無効ãªã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ テンプレート:"
#: platform/javascript/export/export.cpp
#, fuzzy
@@ -9785,14 +9351,12 @@ msgid "Could not read custom HTML shell:"
msgstr "ファイルを読ã‚ã¾ã›ã‚“ã§ã—ãŸ:\n"
#: platform/javascript/export/export.cpp
-#, fuzzy
msgid "Could not read boot splash image file:"
-msgstr "ファイルを読ã‚ã¾ã›ã‚“ã§ã—ãŸ:\n"
+msgstr "ブートスプラッシュ画åƒãƒ•ァイルを読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ:"
#: platform/javascript/export/export.cpp
-#, fuzzy
msgid "Using default boot splash image."
-msgstr "ファイルを読ã‚ã¾ã›ã‚“ã§ã—ãŸ:\n"
+msgstr "デフォルトã®ãƒ–ートスプラッシュ画åƒã‚’使用ã—ã¾ã™ã€‚"
#: scene/2d/animated_sprite.cpp
msgid ""
@@ -9854,6 +9418,12 @@ msgstr ""
"関数ã«å¯¾ã—㦠CollisionShape2D ã®å½¢çŠ¶ï¼ˆã‚·ã‚§ã‚¤ãƒ—ï¼‰ã‚’æŒ‡å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ã"
"ã®ãŸã‚ã®ã‚·ã‚§ã‚¤ãƒ—リソースを作æˆã—ã¦ãã ã•ã„!"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -9903,6 +9473,12 @@ msgstr ""
"パーティクルを処ç†ã™ã‚‹ãŸã‚ã®ãƒžãƒ†ãƒªã‚¢ãƒ«ã¯æŒ‡å®šã•れã¦ãŠã‚‰ãšã€ãã®æŒ¯ã‚‹èˆžã„ã¯æœªæŒ‡"
"示ã§ã™."
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -10019,6 +9595,7 @@ msgid "An empty CollisionPolygon has no effect on collision."
msgstr "空㮠CollisionPolygon ã¯ã€è¡çªåˆ¤å®šã‚’æŒã¡ã¾ã›ã‚“。"
#: scene/3d/collision_shape.cpp
+#, fuzzy
msgid ""
"CollisionShape only serves to provide a collision shape to a CollisionObject "
"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
@@ -10036,6 +9613,17 @@ msgstr ""
"関数㮠CollisionShape ã®å½¢çŠ¶ã‚’æŒ‡å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ãれã®ãŸã‚ã®ã‚·ã‚§ã‚¤ãƒ—リ"
"ソースを作æˆã—ã¦ãã ã•ã„!"
+#: scene/3d/cpu_particles.cpp
+#, fuzzy
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr "æç”»ãƒ‘スã®ãŸã‚ã®ãƒ¡ãƒƒã‚·ãƒ¥ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“ã®ã§è¦‹ãˆã¾ã›ã‚“"
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
#, fuzzy
msgid "Plotting Meshes"
@@ -10061,6 +9649,30 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr "æç”»ãƒ‘スã®ãŸã‚ã®ãƒ¡ãƒƒã‚·ãƒ¥ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“ã®ã§è¦‹ãˆã¾ã›ã‚“"
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+"PathFollow2D ã¯ã€Path2D ノードã®å­ã¨ã—ã¦è¨­å®šã•れã¦ã„ã‚‹å ´åˆã®ã¿å‹•作ã—ã¾ã™ã€‚"
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+"PathFollow2D ã¯ã€Path2D ノードã®å­ã¨ã—ã¦è¨­å®šã•れã¦ã„ã‚‹å ´åˆã®ã¿å‹•作ã—ã¾ã™ã€‚"
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -10084,14 +9696,17 @@ msgstr ""
msgid ""
"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
msgstr ""
-"1 ã¤ã ã‘ã® WorldEnvironment ã¯ã€ã‚·ãƒ¼ãƒ³ (ã¾ãŸã¯ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹åŒ–ã•れãŸã‚·ãƒ¼ãƒ³ã®"
-"セット) ã”ã¨ã«è¨±å¯ã•れã¾ã™ã€‚"
+"WorldEnvironment ã¯ã€ã‚·ãƒ¼ãƒ³ (ã¾ãŸã¯ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹åŒ–ã•れãŸã‚·ãƒ¼ãƒ³ã®ã‚»ãƒƒãƒˆ) ã”ã¨ã«"
+"1ã¤ã ã‘許å¯ã•れã¾ã™ã€‚"
#: scene/3d/scenario_fx.cpp
+#, fuzzy
msgid ""
"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set "
"this environment's Background Mode to Canvas (for 2D scenes)."
msgstr ""
+"ã“ã®WorldEnvironmentã¯ç„¡è¦–ã•れã¾ã—ãŸã€‚カメラを追加ã™ã‚‹ã‹(3Dシーンã®å ´åˆ)ã€ã“"
+"ã®Environmentã® Backgroundモード ã‚’ Canvas ã«è¨­å®šã—ã¾ã™(2Dシーンã®å ´åˆ)。"
#: scene/3d/soft_body.cpp
msgid "This body will be ignored until you set a mesh"
@@ -10099,7 +9714,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -10123,18 +9738,16 @@ msgid "On BlendTree node '%s', animation not found: '%s'"
msgstr ""
#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "アニメーションツール"
+msgstr "見ã¤ã‹ã‚‰ãªã„アニメーション: '%s'"
#: scene/animation/animation_tree.cpp
msgid "In node '%s', invalid animation: '%s'."
msgstr ""
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "エラー:アニメーションã®åå‰ãŒä¸æ­£ã§ã™!"
+msgstr "無効ãªã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³: '%s'。"
#: scene/animation/animation_tree.cpp
#, fuzzy
@@ -10159,15 +9772,19 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr "アニメーションツリーã«å•題ãŒã‚りã¾ã™."
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+"ã“ã®ãƒŽãƒ¼ãƒ‰ã¯éžæŽ¨å¥¨ã«ãªã‚Šã¾ã—ãŸã€‚代ã‚りã«AnimationTreeを使用ã—ã¦ãã ã•ã„。"
+
#: scene/gui/color_picker.cpp
#, fuzzy
msgid "Raw Mode"
msgstr "パン・モード"
#: scene/gui/color_picker.cpp
-#, fuzzy
msgid "Add current color as a preset"
-msgstr "ã“ã®è‰²ã‚’åˆæœŸè¨­å®šå€¤ã¨ã—ã¦è¿½åŠ ã™ã‚‹"
+msgstr "ç¾åœ¨ã®è‰²ã‚’プリセットã¨ã—ã¦è¿½åŠ "
#: scene/gui/dialogs.cpp
msgid "Alert!"
@@ -10175,12 +9792,7 @@ msgstr "警告!"
#: scene/gui/dialogs.cpp
msgid "Please Confirm..."
-msgstr "確èª"
-
-#: scene/gui/file_dialog.cpp
-#, fuzzy
-msgid "Select this Folder"
-msgstr "ã™ã¹ã¦é¸æŠž"
+msgstr "確èª..."
#: scene/gui/popup.cpp
msgid ""
@@ -10192,6 +9804,10 @@ msgstr ""
"既定ã§ã¯éžè¡¨ç¤ºã«ãªã‚Šã¾ã™ã€‚編集ã®ãŸã‚ã«ãれらをå¯è¦–化ã™ã‚‹ã“ã¨ã¯å¯èƒ½ã§ã™ãŒã€å½¼"
"らã¯å®Ÿè¡Œæ™‚ã«éžè¡¨ç¤ºã«ãªã‚Šã¾ã™ã€‚"
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -10203,7 +9819,6 @@ msgstr ""
"イズを手動ã§è¨­å®šã—ã¦ãã ã•ã„。"
#: scene/gui/tree.cpp
-#, fuzzy
msgid "(Other)"
msgstr "(ãã®ä»–)"
@@ -10245,19 +9860,12 @@ msgid "Invalid font size."
msgstr "無効ãªãƒ•ォント サイズã§ã™ã€‚"
#: scene/resources/visual_shader.cpp
-#, fuzzy
msgid "Input"
-msgstr "入力を追加"
-
-#: scene/resources/visual_shader.cpp
-#, fuzzy
-msgid "None"
-msgstr "<None>"
+msgstr "入力"
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for shader."
-msgstr "䏿­£ãªã‚½ãƒ¼ã‚¹!"
+msgstr "無効ãªã‚·ã‚§ãƒ¼ãƒ€ãƒ¼ã®ã‚½ãƒ¼ã‚¹ã§ã™ã€‚"
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
@@ -10272,6 +9880,208 @@ msgid "Varyings can only be assigned in vertex function."
msgstr ""
#, fuzzy
+#~ msgid "Split already exists."
+#~ msgstr "アクション'%s'ã¯æ—¢ã«ã‚りã¾ã™!"
+
+#~ msgid "Add Split"
+#~ msgstr "分割を追加"
+
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr "無効ãªãƒ•ォント サイズã§ã™ã€‚"
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "é¸æŠžã—ã¦ã„ã‚‹ãƒã‚¤ãƒ³ãƒˆï¼ç‚¹ã‚’削除"
+
+#, fuzzy
+#~ msgid "Poly"
+#~ msgstr "ãƒãƒªã‚´ãƒ³ã‚’編集"
+
+#, fuzzy
+#~ msgid "Splits"
+#~ msgstr "パスを分割"
+
+#, fuzzy
+#~ msgid "Select a split to erase it."
+#~ msgstr "設定項目を設定ã—ã¦ãã ã•ã„!"
+
+#~ msgid "No name provided"
+#~ msgstr "åå‰ãŒä»˜ã„ã¦ã„ã¾ã›ã‚“"
+
+#~ msgid "Add Node.."
+#~ msgstr "ノードを追加.."
+
+#, fuzzy
+#~ msgid "Create from scene?"
+#~ msgstr "シーンã‹ã‚‰ç”Ÿæˆã—ã¾ã™ã‹ï¼Ÿ"
+
+#~ msgid "Create Poly"
+#~ msgstr "ãƒãƒªã‚´ãƒ³ã‚’作æˆ"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "æ–°è¦ã«ãƒãƒªã‚´ãƒ³ã‚’作æˆ"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "ズームアウト"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "ズームイン"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "3Dãƒãƒªã‚´ãƒ³ã‚’生æˆã™ã‚‹"
+
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "ã“ã®ãƒŽãƒ¼ãƒ‰ã«OccluderPolygon2DリソースãŒã‚りã¾ã›ã‚“。\n"
+#~ "作æˆã—ã¦ã€å‰²ã‚Šå½“ã¦ã¾ã™ã‹ ?"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "LMB: 点を移動ã™ã‚‹ã€‚"
+
+#, fuzzy
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "Ctrl+マウス左ボタン: セグメントを分割"
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "å³ã‚¯ãƒªãƒƒã‚¯: 点を消ã™ã€‚"
+
+#, fuzzy
+#~ msgid "New TextFile"
+#~ msgstr "ビューファイル:"
+
+#~ msgid "Save Theme As"
+#~ msgstr "テーマã«åå‰ã‚’付ã‘ã¦ä¿å­˜"
+
+#~ msgid "<None>"
+#~ msgstr "<None>"
+
+#~ msgid "Zoom:"
+#~ msgstr "ズーム:"
+
+#~ msgid "Are you sure you want to remove all connections from the \""
+#~ msgstr "\" ã‹ã‚‰å…¨ã¦ã®æŽ¥ç¶šã‚’除去ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹"
+
+#~ msgid "Class List:"
+#~ msgstr "クラス一覧:"
+
+#~ msgid "Search Classes"
+#~ msgstr "ã‚¯ãƒ©ã‚¹ã®æ¤œç´¢"
+
+#~ msgid "Public Methods"
+#~ msgstr "パブリックメソッド"
+
+#~ msgid "Public Methods:"
+#~ msgstr "パブリックメソッド:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "GUIテーマã®ã‚¢ã‚¤ãƒ†ãƒ "
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "GUIテーマã®ã‚¢ã‚¤ãƒ†ãƒ :"
+
+#~ msgid "Property: "
+#~ msgstr "プロパティ: "
+
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "フォルダã®çŠ¶æ…‹ã‚’ãŠæ°—ã«å…¥ã‚Šã«åˆ‡æ›¿ãˆã‚‹ã€‚"
+
+#~ msgid "Show current scene file."
+#~ msgstr "ç¾åœ¨ã®ã‚·ãƒ¼ãƒ³ãƒ•ァイルを表示ã™ã‚‹ã€‚"
+
+#~ msgid "Enter tree-view."
+#~ msgstr "ツリービューã«å…¥ã‚‹ã€‚"
+
+#~ msgid "Whole words"
+#~ msgstr "å˜èªžå…¨ä½“"
+
+#~ msgid "Match case"
+#~ msgstr "å¤§æ–‡å­—å°æ–‡å­—を区別"
+
+#~ msgid "Filter: "
+#~ msgstr "フィルタ: "
+
+#~ msgid "Ok"
+#~ msgstr "OK"
+
+#, fuzzy
+#~ msgid "Show In File System"
+#~ msgstr "ファイルシステム上ã§è¡¨ç¤º"
+
+#, fuzzy
+#~ msgid "Search the class hierarchy."
+#~ msgstr "クラス階層を検索."
+
+#, fuzzy
+#~ msgid "Search in files"
+#~ msgstr "ã‚¯ãƒ©ã‚¹ã®æ¤œç´¢"
+
+#, fuzzy
+#~ msgid ""
+#~ "Built-in scripts can only be edited when the scene they belong to is "
+#~ "loaded"
+#~ msgstr ""
+#~ "組ã¿è¾¼ã¾ã‚ŒãŸã‚¹ã‚¯ãƒªãƒ—ãƒˆã¯æ‰€å±žã™ã‚‹ã‚·ãƒ¼ãƒ³ãŒèª­ã¿è¾¼ã¾ã‚Œã¦ã„ãªã„ã¨ç·¨é›†ã§ãã¾ã›ã‚“"
+
+#~ msgid "Convert To Uppercase"
+#~ msgstr "大文字ã«å¤‰æ›"
+
+#~ msgid "Convert To Lowercase"
+#~ msgstr "å°æ–‡å­—ã«å¤‰æ›"
+
+#, fuzzy
+#~ msgid "Snap To Floor"
+#~ msgstr "Snapモード:"
+
+#~ msgid "Rotate 0 degrees"
+#~ msgstr "0度回転"
+
+#~ msgid "Rotate 90 degrees"
+#~ msgstr "90度回転"
+
+#~ msgid "Rotate 180 degrees"
+#~ msgstr "180度回転"
+
+#~ msgid "Rotate 270 degrees"
+#~ msgstr "270度回転"
+
+#~ msgid "Warning"
+#~ msgstr "警告"
+
+#~ msgid "Error:"
+#~ msgstr "エラー:"
+
+#~ msgid "Source:"
+#~ msgstr "ソース:"
+
+#~ msgid "Function:"
+#~ msgstr "関数:"
+
+#~ msgid "Variable"
+#~ msgstr "変数"
+
+#~ msgid "Errors:"
+#~ msgstr "エラー:"
+
+#~ msgid "Stack Trace (if applicable):"
+#~ msgstr "スタックトレース(å¯èƒ½ãªã‚‰ï¼‰:"
+
+#~ msgid "Bake!"
+#~ msgstr "ベイク!"
+
+#, fuzzy
+#~ msgid "Bake the navigation mesh."
+#~ msgstr "ナビメッシュ(ナビゲーションメッシュ)ã®ç”Ÿæˆ"
+
+#, fuzzy
+#~ msgid "Get"
+#~ msgstr "Getメソッド"
+
+#, fuzzy
#~ msgid "Change Scalar Constant"
#~ msgstr "スカラ定数を変更"
@@ -10495,10 +10305,6 @@ msgstr ""
#~ msgid "Run Script"
#~ msgstr "スクリプトã®å®Ÿè¡Œ"
-#, fuzzy
-#~ msgid "Save the currently edited resource."
-#~ msgstr "ç¾åœ¨ç·¨é›†ä¸­ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’ä¿å­˜ã™ã‚‹"
-
#~ msgid "Stop Profiling"
#~ msgstr "ãƒ—ãƒ­ãƒ•ã‚¡ã‚¤ãƒªãƒ³ã‚°åœæ­¢"
@@ -10810,10 +10616,6 @@ msgstr ""
#~ msgstr "アトラスã®è¦ç´ ã§ã‚るテクスãƒãƒ£ã®ä¿å­˜ãŒã§ãã¾ã›ã‚“:"
#, fuzzy
-#~ msgid "Exporting for %s"
-#~ msgstr "%sã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆä¸­"
-
-#, fuzzy
#~ msgid "Setting Up..."
#~ msgstr "セットアップ中..."
@@ -10938,10 +10740,6 @@ msgstr ""
#~ msgstr "ソース フォント:"
#, fuzzy
-#~ msgid "Source Font Size:"
-#~ msgstr "ソース フォントサイズ:"
-
-#, fuzzy
#~ msgid "Dest Resource:"
#~ msgstr "é€ã‚Šå…ˆã®ãƒªã‚½ãƒ¼ã‚¹:"
@@ -11036,9 +10834,6 @@ msgstr ""
#~ msgid "Start(s)"
#~ msgstr "é–‹å§‹"
-#~ msgid "Filters"
-#~ msgstr "フィルター"
-
#, fuzzy
#~ msgid "Source path is empty."
#~ msgstr "ソースã®ãƒ‘スã¯ç©ºã§ã™"
@@ -11209,9 +11004,6 @@ msgstr ""
#~ msgid "Crop empty space."
#~ msgstr "空白を刈り込む"
-#~ msgid "Texture"
-#~ msgstr "テクスãƒãƒ£"
-
#, fuzzy
#~ msgid "Import Large Texture"
#~ msgstr "大ããªãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’インãƒãƒ¼ãƒˆ"
@@ -11292,9 +11084,6 @@ msgstr ""
#~ msgid "Ignore First Row"
#~ msgstr "最åˆã®è¡Œã‚’無視"
-#~ msgid "Compress"
-#~ msgstr "圧縮"
-
#, fuzzy
#~ msgid "Add to Project (project.godot)"
#~ msgstr "プロジェクトã«è¿½åŠ  (project.godot)"
@@ -11378,17 +11167,10 @@ msgstr ""
#~ msgid "Stereo"
#~ msgstr "ステレオ音声"
-#~ msgid "Pitch"
-#~ msgstr "ピッãƒ"
-
#~ msgid "Window"
#~ msgstr "ウィンドウ"
#, fuzzy
-#~ msgid "Move Right"
-#~ msgstr "å³ã«ç§»å‹•"
-
-#, fuzzy
#~ msgid "Scaling to %s%%."
#~ msgstr "æ‹¡å¤§ç¸®å°æ¯”率%s%%."
@@ -11459,10 +11241,6 @@ msgstr ""
#~ msgstr "押ã—ãŸ"
#, fuzzy
-#~ msgid "just released"
-#~ msgstr "離ã—ãŸ"
-
-#, fuzzy
#~ msgid ""
#~ "Couldn't read the certificate file. Are the path and password both "
#~ "correct?"
diff --git a/editor/translations/ka.po b/editor/translations/ka.po
index b8b3e848be..84a3cd1bbc 100644
--- a/editor/translations/ka.po
+++ b/editor/translations/ka.po
@@ -1,21 +1,23 @@
# Georgian translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# Giorgi Beriashvili <giorgi.beriashvili@outlook.com>, 2018.
# George Dzavashvili <dzavashviligeorge@gmail.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-08-16 16:36+0000\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:41+0100\n"
"Last-Translator: George Dzavashvili <dzavashviligeorge@gmail.com>\n"
"Language-Team: Georgian <https://hosted.weblate.org/projects/godot-engine/"
"godot/ka/>\n"
"Language: ka\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.2-dev\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -23,7 +25,7 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr ""
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
@@ -258,7 +260,6 @@ msgstr "áƒáƒ®áƒáƒšáƒ˜ %d თრექების შექმნრდრáƒ
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -389,8 +390,7 @@ msgstr "მáƒáƒœáƒ˜áƒ¨áƒ•ნის მáƒáƒ¡áƒ¨áƒ¢áƒáƒ‘ის ცვლილá
msgid "Scale From Cursor"
msgstr "შკáƒáƒšáƒ˜áƒ áƒ”ბრმáƒáƒ©áƒ•ენებლიდáƒáƒœ"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "მáƒáƒœáƒ˜áƒ¨áƒ•ნის áƒáƒ¡áƒšáƒ˜áƒ¡ შექმნáƒ"
@@ -404,11 +404,13 @@ msgid "Delete Selection"
msgstr "მáƒáƒœáƒ˜áƒ¨áƒ•ნის áƒáƒ¡áƒšáƒ˜áƒ¡ შექმნáƒ"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+#, fuzzy
+msgid "Go to Next Step"
msgstr "მáƒáƒ›áƒ“ევნრნáƒáƒ‘იჯზე გáƒáƒ“áƒáƒ¡áƒ•ლáƒ"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+#, fuzzy
+msgid "Go to Previous Step"
msgstr "წინáƒáƒ›áƒ“ებáƒáƒ áƒ” ნáƒáƒ‘იჯზე გáƒáƒ“áƒáƒ¡áƒ•ლáƒ"
#: editor/animation_track_editor.cpp
@@ -511,11 +513,11 @@ msgstr "áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს ტáƒáƒšáƒ˜"
msgid "Replaced %d occurrence(s)."
msgstr "შეცვლილირ%d დáƒáƒ›áƒ—ხვევები."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "სáƒáƒ¥áƒ›áƒ˜áƒ¡ დáƒáƒ›áƒ—ხვევáƒ"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "მთლიáƒáƒœáƒ˜ სიტყვები"
@@ -531,15 +533,19 @@ msgstr "ყველáƒáƒ¡ ჩáƒáƒœáƒáƒªáƒ•ლებáƒ"
msgid "Selection Only"
msgstr "მáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜ მხáƒáƒšáƒáƒ“"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "ზუმის გáƒáƒ–რდáƒ"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "ზუმის დáƒáƒžáƒáƒ¢áƒáƒ áƒáƒ•ებáƒ"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "ზუმის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ–ე დáƒáƒ§áƒ”ნებáƒ"
@@ -548,11 +554,10 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "ზუმის გáƒáƒ–რდáƒ"
+msgid "Font Size:"
+msgstr ""
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "ხáƒáƒ–ი:"
@@ -585,6 +590,7 @@ msgstr "დáƒáƒ›áƒáƒ¢áƒ”ბáƒ"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -665,7 +671,7 @@ msgid "Edit Connection: "
msgstr "მáƒáƒœáƒ˜áƒ¨áƒ•ნის მრუდის ცვლილებáƒ"
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -712,23 +718,20 @@ msgid "Recent:"
msgstr "ბáƒáƒšáƒ:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "ძებნáƒ:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "დáƒáƒ›áƒ—ხვევები:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "áƒáƒ¦áƒ¬áƒ”რáƒ:"
@@ -767,8 +770,7 @@ msgid "Resource"
msgstr "რესურსი"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "გზáƒ"
@@ -789,9 +791,10 @@ msgid "Search Replacement Resource:"
msgstr "ჩáƒáƒ›áƒœáƒáƒªáƒ•ლებელი რესურსის ძიებáƒ:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -823,7 +826,8 @@ msgid "Error loading:"
msgstr "ჩáƒáƒ¢áƒ•ირთვის შეცდáƒáƒ›áƒ:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+#, fuzzy
+msgid "Load failed due to missing dependencies:"
msgstr "სცენის ჩáƒáƒ¢áƒ•ირთვრვერ მáƒáƒ®áƒ”რხდრáƒáƒ áƒáƒ áƒ¡áƒ”ბული დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულებების გáƒáƒ›áƒ:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -882,14 +886,6 @@ msgstr "ლექსიკáƒáƒœáƒ˜áƒ¡ მნიშვნელáƒáƒ‘ის შá
msgid "Thanks from the Godot community!"
msgstr "მáƒáƒ“ლáƒáƒ‘რGodot სáƒáƒ–áƒáƒ’áƒáƒ“áƒáƒ”ბისგáƒáƒœ!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr ""
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Godot ძრáƒáƒ•ის ხელშემწყáƒáƒ‘ები"
@@ -983,7 +979,8 @@ msgid "Uncompressing Assets"
msgstr "áƒáƒ¥áƒ¢áƒ˜áƒ•ების áƒáƒ áƒáƒ™áƒáƒ›áƒžáƒ áƒ”სირებáƒ"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+#, fuzzy
+msgid "Package installed successfully!"
msgstr "პáƒáƒ™áƒ”ტი დáƒáƒ§áƒ”ნდრწáƒáƒ áƒ›áƒáƒ¢áƒ”ბით!"
#: editor/editor_asset_installer.cpp
@@ -1065,8 +1062,7 @@ msgid "Bus options"
msgstr ""
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr ""
@@ -1225,7 +1221,7 @@ msgid "Add AutoLoad"
msgstr ""
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr ""
@@ -1233,8 +1229,8 @@ msgstr ""
msgid "Node Name:"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr ""
@@ -1304,11 +1300,15 @@ msgid "Template file not found:"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
+msgid "Select This Folder"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1316,12 +1316,13 @@ msgid "Copy Path"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-msgid "Open In File Manager"
-msgstr ""
+#, fuzzy
+msgid "Open in File Manager"
+msgstr "გáƒáƒ®áƒ¡áƒœáƒ˜áƒšáƒ˜"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+msgid "Show in File Manager"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1357,7 +1358,8 @@ msgid "Open a File or Directory"
msgstr ""
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr ""
@@ -1415,8 +1417,7 @@ msgstr ""
msgid "Preview:"
msgstr ""
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr ""
@@ -1432,24 +1433,11 @@ msgstr ""
msgid "(Re)Importing Assets"
msgstr ""
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr ""
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr ""
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr ""
@@ -1466,27 +1454,27 @@ msgid "Brief Description:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Members"
+msgid "Properties"
msgstr ""
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
+#: editor/editor_help.cpp
+msgid "Properties:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
+msgid "Methods"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods:"
+msgid "Methods:"
msgstr ""
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
+msgid "Theme Properties"
msgstr ""
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
+msgid "Theme Properties:"
msgstr ""
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
@@ -1514,8 +1502,14 @@ msgid "Constants:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Description"
-msgstr ""
+#, fuzzy
+msgid "Class Description"
+msgstr "áƒáƒ¦áƒ¬áƒ”რáƒ:"
+
+#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
+msgstr "áƒáƒ¦áƒ¬áƒ”რáƒ:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1529,12 +1523,14 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr ""
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "áƒáƒ¦áƒ¬áƒ”რáƒ:"
#: editor/editor_help.cpp
-msgid "Property Description:"
-msgstr ""
+#, fuzzy
+msgid "Property Descriptions:"
+msgstr "áƒáƒ¦áƒ¬áƒ”რáƒ:"
#: editor/editor_help.cpp
msgid ""
@@ -1543,12 +1539,14 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr ""
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "áƒáƒ¦áƒ¬áƒ”რáƒ:"
#: editor/editor_help.cpp
-msgid "Method Description:"
-msgstr ""
+#, fuzzy
+msgid "Method Descriptions:"
+msgstr "áƒáƒ¦áƒ¬áƒ”რáƒ:"
#: editor/editor_help.cpp
msgid ""
@@ -1556,11 +1554,56 @@ msgid ""
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-#: editor/editor_inspector.cpp
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Display All"
+msgstr "ყველáƒáƒ¡ ჩáƒáƒœáƒáƒªáƒ•ლებáƒ"
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Methods Only"
+msgstr "მáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜ მხáƒáƒšáƒáƒ“"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "სიგნáƒáƒšáƒ”ბი"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Constants Only"
+msgstr "მუდმივი"
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Class"
msgstr ""
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1594,6 +1637,11 @@ msgstr ""
msgid "Error saving resource!"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr ""
@@ -1648,10 +1696,20 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr ""
@@ -1879,6 +1937,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1919,6 +1983,11 @@ msgstr ""
msgid "Default"
msgstr ""
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Play This Scene"
msgstr ""
@@ -2001,7 +2070,7 @@ msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2030,7 +2099,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -2054,7 +2123,7 @@ msgstr ""
msgid "Export"
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr ""
@@ -2068,6 +2137,7 @@ msgid "Quit to Project List"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr ""
@@ -2175,10 +2245,6 @@ msgstr ""
msgid "Help"
msgstr ""
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2272,21 +2338,21 @@ msgstr ""
msgid "Disable Update Spinner"
msgstr ""
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr ""
#: editor/editor_node.cpp
-msgid "Node"
+msgid "FileSystem"
msgstr ""
#: editor/editor_node.cpp
-msgid "FileSystem"
+msgid "Inspector"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Node"
msgstr ""
#: editor/editor_node.cpp
@@ -2423,7 +2489,7 @@ msgstr ""
msgid "Physics Frame %"
msgstr ""
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr ""
@@ -2447,7 +2513,7 @@ msgstr ""
msgid "Calls"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2459,20 +2525,44 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ფáƒáƒœáƒ¢áƒ˜áƒ¡ ზáƒáƒ›áƒ."
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr ""
@@ -2484,10 +2574,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2496,7 +2582,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr ""
@@ -2778,6 +2865,11 @@ msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr ""
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "სáƒáƒ§áƒ•áƒáƒ áƒšáƒ”ბი:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
@@ -2813,8 +2905,8 @@ msgstr ""
msgid "Unable to update dependencies:"
msgstr ""
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2822,10 +2914,6 @@ msgid "Provided name contains invalid characters"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr ""
@@ -2850,27 +2938,20 @@ msgid "Duplicating folder:"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
+msgid "Open Scene(s)"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Move To..."
+msgid "Instance"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Open Scene(s)"
-msgstr ""
+#, fuzzy
+msgid "Add to favorites"
+msgstr "სáƒáƒ§áƒ•áƒáƒ áƒšáƒ”ბი:"
#: editor/filesystem_dock.cpp
-msgid "Instance"
+msgid "Remove from favorites"
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2881,11 +2962,19 @@ msgstr ""
msgid "View Owners..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr ""
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr ""
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -2894,6 +2983,15 @@ msgstr ""
msgid "New Resource..."
msgstr "რესურსი"
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Collapse All"
+msgstr "ყველáƒáƒ¡ ჩáƒáƒœáƒáƒªáƒ•ლებáƒ"
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -2914,33 +3012,25 @@ msgid "Re-Scan Filesystem"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Toggle folder status as Favorite."
+msgid "Toggle split mode"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Show current scene file."
-msgstr ""
+#, fuzzy
+msgid "Search files"
+msgstr "ძებნáƒ:"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "ძებნáƒ:"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
msgstr ""
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr ""
@@ -2957,29 +3047,19 @@ msgid "Create Script"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Find in files"
+msgid "Find in Files"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Find: "
+msgid "Find:"
msgstr ""
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Whole words"
-msgstr "მთლიáƒáƒœáƒ˜ სიტყვები"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "სáƒáƒ¥áƒ›áƒ˜áƒ¡ დáƒáƒ›áƒ—ხვევáƒ"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
+msgid "Folder:"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Filter: "
+msgid "Filters:"
msgstr ""
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -2996,6 +3076,10 @@ msgid "Cancel"
msgstr ""
#: editor/find_in_files.cpp
+msgid "Find: "
+msgstr ""
+
+#: editor/find_in_files.cpp
#, fuzzy
msgid "Replace: "
msgstr "ჩáƒáƒœáƒáƒªáƒ•ლებáƒ"
@@ -3019,8 +3103,9 @@ msgid "Group name already exists."
msgstr ""
#: editor/groups_editor.cpp
-msgid "invalid Group name."
-msgstr ""
+#, fuzzy
+msgid "Invalid group name."
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ფáƒáƒœáƒ¢áƒ˜áƒ¡ ზáƒáƒ›áƒ."
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
@@ -3155,17 +3240,12 @@ msgstr ""
msgid "Failed to load resource."
msgstr ""
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr ""
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+msgid "Collapse All Properties"
msgstr ""
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3210,6 +3290,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr ""
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr ""
@@ -3270,44 +3354,45 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
-msgstr ""
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
+msgstr "შექმნáƒ"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
-msgstr ""
+#, fuzzy
+msgid "Edit Polygon"
+msgstr "შექმნáƒ"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+msgid "Remove Polygon And Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr ""
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr "შექმნáƒ"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3322,7 +3407,7 @@ msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Load.."
+msgid "Load..."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3351,13 +3436,8 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "შექმნáƒ"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-msgid "Erase points."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3398,9 +3478,8 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3434,7 +3513,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add Node.."
+msgid "Add Node..."
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3706,7 +3785,7 @@ msgstr "კვáƒáƒœáƒ«áƒ—áƒáƒœ დáƒáƒ™áƒáƒ•შირებáƒ:"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "მáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜ თრექის წáƒáƒ¨áƒšáƒ."
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3774,10 +3853,6 @@ msgid "Amount:"
msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr ""
@@ -3975,7 +4050,7 @@ msgstr ""
msgid "Plugins"
msgstr ""
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr ""
@@ -4099,6 +4174,10 @@ msgid "Resize CanvasItem"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
msgstr ""
@@ -4119,21 +4198,19 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "ზუმის დáƒáƒžáƒáƒ¢áƒáƒ áƒáƒ•ებáƒ"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "ზუმის დáƒáƒžáƒáƒ¢áƒáƒ áƒáƒ•ებáƒ"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "ზუმის გáƒáƒ–რდáƒ"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4162,6 +4239,11 @@ msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "მáƒáƒ¡áƒ¨áƒ¢áƒáƒ‘ის თáƒáƒœáƒáƒ¤áƒáƒ áƒ“áƒáƒ‘áƒ:"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4256,6 +4338,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "მáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜ მხáƒáƒšáƒáƒ“"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr ""
@@ -4306,6 +4393,10 @@ msgid "Show Viewport"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr ""
@@ -4375,7 +4466,16 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "შექმნáƒ"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
msgstr ""
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
@@ -4477,35 +4577,9 @@ msgid "Item List Editor"
msgstr ""
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr ""
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr ""
@@ -4737,12 +4811,12 @@ msgid "Populate"
msgstr ""
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
+msgid "Generating Visibility Rect"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -4771,6 +4845,11 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr ""
@@ -4840,11 +4919,11 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Convert to CPUParticles"
+msgid "Generate AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -4869,6 +4948,11 @@ msgid "Add Point to Curve"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "კვáƒáƒœáƒ«áƒ˜áƒ¡ მრუდის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr ""
@@ -4896,6 +4980,10 @@ msgid "Click: Add Point"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr ""
@@ -4911,11 +4999,6 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr ""
@@ -4972,6 +5055,10 @@ msgstr ""
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
msgid "Move joint"
msgstr ""
@@ -4982,78 +5069,85 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync bones"
+msgid "Sync Bones"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create UV Map"
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create Polygon & UV"
+msgid "Create UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
+msgid "Create Polygon & UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
+msgid "Create Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split already exists."
+msgid "Remove Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Add Split"
+msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ფáƒáƒœáƒ¢áƒ˜áƒ¡ ზáƒáƒ›áƒ."
+msgid "Add Custom Polygon"
+msgstr "შექმნáƒ"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "მáƒáƒœáƒ˜áƒ¨áƒ•ნის მáƒáƒ¨áƒáƒ áƒ”ბáƒ"
+msgid "Remove Custom Polygon"
+msgstr "შექმნáƒ"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
-msgstr ""
+#, fuzzy
+msgid "Transform Polygon"
+msgstr "შექმნáƒ"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Polygon 2D UV Editor"
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UV"
+msgid "Open Polygon 2D UV editor."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Poly"
+msgid "Polygon 2D UV Editor"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Splits"
+msgid "UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Bones"
+msgid "Points"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
+msgid "Polygons"
msgstr "შექმნáƒ"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Points"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5081,19 +5175,21 @@ msgid "Scale Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Select a split to erase it"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5117,6 +5213,11 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr ""
@@ -5174,22 +5275,22 @@ msgid "Paste Resource"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr ""
@@ -5219,6 +5320,10 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Error could not load file."
msgstr ""
@@ -5228,20 +5333,24 @@ msgid "Error saving file!"
msgstr "ჩáƒáƒ¢áƒ•ირთვის შეცდáƒáƒ›áƒ”ბი!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr ""
+#, fuzzy
+msgid "Error while saving theme."
+msgstr "ჩáƒáƒ¢áƒ•ირთვის შეცდáƒáƒ›áƒ”ბი!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
-msgstr ""
+#, fuzzy
+msgid "Error Saving"
+msgstr "ჩáƒáƒ¢áƒ•ირთვის შეცდáƒáƒ›áƒ:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr ""
+#, fuzzy
+msgid "Error importing theme."
+msgstr "შეცდáƒáƒ›áƒ ფáƒáƒœáƒ¢áƒ˜áƒ¡ ჩáƒáƒ¢áƒ•ირთვისáƒáƒ¡."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
-msgstr ""
+#, fuzzy
+msgid "Error Importing"
+msgstr "ჩáƒáƒ¢áƒ•ირთვის შეცდáƒáƒ›áƒ:"
#: editor/plugins/script_editor_plugin.cpp
msgid "New TextFile..."
@@ -5261,6 +5370,14 @@ msgid "Import Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr ""
@@ -5301,8 +5418,9 @@ msgid "File"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile"
-msgstr ""
+#, fuzzy
+msgid "Open..."
+msgstr "გáƒáƒ®áƒ¡áƒœáƒ˜áƒšáƒ˜"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5317,11 +5435,7 @@ msgid "Copy Script Path"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+msgid "History Previous"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5334,15 +5448,15 @@ msgid "Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Reload Theme"
+msgid "Import Theme..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme"
+msgid "Reload Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
+msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5392,7 +5506,7 @@ msgid "Keep Debugger Open"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5400,10 +5514,6 @@ msgid "Open Godot online documentation"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -5438,17 +5548,9 @@ msgid "Debugger"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search results"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search in files"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
+#, fuzzy
+msgid "Search Results"
+msgstr "ძებნáƒ:"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -5460,6 +5562,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "ფუნქციის შექმნáƒ"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr ""
@@ -5491,10 +5602,6 @@ msgstr ""
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5546,11 +5653,11 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5567,36 +5674,32 @@ msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr ""
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "მáƒáƒ›áƒ“ევნრნáƒáƒ‘იჯზე გáƒáƒ“áƒáƒ¡áƒ•ლáƒ"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr ""
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "წინáƒáƒ›áƒ“ებáƒáƒ áƒ” ნáƒáƒ‘იჯზე გáƒáƒ“áƒáƒ¡áƒ•ლáƒ"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
-msgstr ""
+#, fuzzy
+msgid "Go to Function..."
+msgstr "ფუნქციის შექმნáƒ"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
-msgstr ""
+#, fuzzy
+msgid "Go to Line..."
+msgstr "ხáƒáƒ–ზე გáƒáƒ“áƒáƒ¡áƒ•ლáƒ"
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
@@ -5687,6 +5790,14 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -5851,6 +5962,10 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -5950,10 +6065,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap To Floor"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6070,6 +6181,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
msgstr ""
@@ -6184,11 +6299,16 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6352,6 +6472,11 @@ msgid "Fix Invalid Tiles"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "მáƒáƒœáƒ˜áƒ¨áƒ•ნის áƒáƒ¡áƒšáƒ˜áƒ¡ შექმნáƒ"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6397,32 +6522,38 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "მáƒáƒœáƒ˜áƒ¨áƒ•ნის მáƒáƒ¨áƒáƒ áƒ”ბáƒ"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
+msgid "Rotate left"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
+msgid "Rotate right"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Flip vertically"
msgstr ""
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Clear transform"
+msgstr "áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ ცვლილებáƒ"
+
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove current Texture from TileSet"
-msgstr ""
+#, fuzzy
+msgid "Remove selected Texture from TileSet."
+msgstr "მáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜ თრექის წáƒáƒ¨áƒšáƒ."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -6433,25 +6564,45 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Erase bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "შექმნáƒ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "მáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜ თრექის წáƒáƒ¨áƒšáƒ."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6459,7 +6610,12 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "მáƒáƒœáƒ˜áƒ¨áƒ•ნის მáƒáƒ¨áƒáƒ áƒ”ბáƒ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6469,15 +6625,25 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "წáƒáƒ•შáƒáƒšáƒáƒ— მáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ”ბი?"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "შექმნáƒ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr ""
@@ -6495,11 +6661,92 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "შექმნáƒ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "შექმნáƒ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "შექმნáƒ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "შექმნáƒ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "მáƒáƒ¨áƒáƒ áƒ”ბáƒ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "შექმნáƒ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "შექმნáƒ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "This property can't be changed."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
+msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6535,6 +6782,14 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6543,6 +6798,10 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+msgid "Export Path"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6597,10 +6856,46 @@ msgid "Feature List:"
msgstr ""
#: editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr ""
#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -6727,7 +7022,7 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
-msgid "Can't open project"
+msgid "Can't open project at '%s'."
msgstr ""
#: editor/project_manager.cpp
@@ -6736,6 +7031,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7050,10 +7363,6 @@ msgstr ""
msgid "General"
msgstr ""
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7187,10 +7496,6 @@ msgstr ""
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr ""
@@ -7276,7 +7581,7 @@ msgid "Step"
msgstr "ნáƒáƒ‘იჯი (წáƒáƒ›áƒ˜):"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7285,7 +7590,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7326,7 +7631,7 @@ msgstr ""
msgid "Reset"
msgstr "ზუმის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ–ე დáƒáƒ§áƒ”ნებáƒ"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7385,6 +7690,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr ""
@@ -7421,6 +7730,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7492,6 +7807,10 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr ""
@@ -7500,11 +7819,11 @@ msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Change Type"
+msgid "Extend Script"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -7654,6 +7973,10 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -7742,19 +8065,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -7786,18 +8097,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -7994,7 +8293,7 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+msgid "Step argument is zero!"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
@@ -8216,11 +8515,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -8492,6 +8787,10 @@ msgid "Base Type:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr ""
@@ -8590,11 +8889,11 @@ msgid "Search VisualScript"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8672,6 +8971,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -8710,6 +9015,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -8827,6 +9138,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -8846,6 +9167,26 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -8878,7 +9219,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -8935,6 +9276,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr ""
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr ""
@@ -8951,10 +9296,6 @@ msgstr ""
msgid "Please Confirm..."
msgstr ""
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr ""
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -8962,6 +9303,10 @@ msgid ""
"hide upon running."
msgstr ""
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9007,10 +9352,6 @@ msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ფáƒáƒœáƒ¢áƒ˜áƒ¡ ზáƒáƒ›áƒ."
msgid "Input"
msgstr ""
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
@@ -9028,6 +9369,30 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "მáƒáƒœáƒ˜áƒ¨áƒ•ნის მáƒáƒ¨áƒáƒ áƒ”ბáƒ"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "ზუმის დáƒáƒžáƒáƒ¢áƒáƒ áƒáƒ•ებáƒ"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "ზუმის გáƒáƒ–რდáƒ"
+
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "ზუმის გáƒáƒ–რდáƒ"
+
+#, fuzzy
+#~ msgid "Whole words"
+#~ msgstr "მთლიáƒáƒœáƒ˜ სიტყვები"
+
+#, fuzzy
+#~ msgid "Match case"
+#~ msgstr "სáƒáƒ¥áƒ›áƒ˜áƒ¡ დáƒáƒ›áƒ—ხვევáƒ"
+
#~ msgid "Disabled"
#~ msgstr "გáƒáƒ›áƒáƒ áƒ—ული"
@@ -9052,9 +9417,6 @@ msgstr ""
#~ msgid "Anim Track Change Wrap Mode"
#~ msgstr "áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ თრექის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ¡ რეჟიმის ცვლილებáƒ"
-#~ msgid "Edit Node Curve"
-#~ msgstr "კვáƒáƒœáƒ«áƒ˜áƒ¡ მრუდის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ"
-
#~ msgid "Anim Add Key"
#~ msgstr "áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბის დáƒáƒ›áƒáƒ¢áƒ”ბáƒ"
diff --git a/editor/translations/ko.po b/editor/translations/ko.po
index 10ee7d659b..11e5313724 100644
--- a/editor/translations/ko.po
+++ b/editor/translations/ko.po
@@ -1,6 +1,6 @@
# Korean translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# Ch <ccwpc@hanmail.net>, 2017.
# paijai 송 (fivejobi) <xotjq237@gmail.com>, 2018.
@@ -9,14 +9,15 @@
# TheRedPlanet <junmo.moon8@gmail.com>, 2018.
# Xavier Cho <mysticfallband@gmail.com>, 2018.
# 박한얼 (volzhs) <volzhs@gmail.com>, 2016-2018.
-# 송태섭 <xotjq237@gmail.com>, 2018.
+# 송태섭 <xotjq237@gmail.com>, 2018, 2019.
# JY <yimjisoo@mailfence.com>, 2018.
+# Ch. <ccwpc@hanmail.net>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2018-08-21 00:40+0000\n"
-"Last-Translator: JY <yimjisoo@mailfence.com>\n"
+"PO-Revision-Date: 2019-01-13 15:07+0000\n"
+"Last-Translator: 송태섭 <xotjq237@gmail.com>\n"
"Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/"
"godot/ko/>\n"
"Language: ko\n"
@@ -24,79 +25,72 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 3.2-dev\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr ""
-"convert()하기 위한 ì¸ìž íƒ€ìž…ì´ ìœ íš¨í•˜ì§€ 않습니다, TYPE_* ìƒìˆ˜ë¥¼ 사용하세요."
+"convert()하기 위한 ì¸ìˆ˜ íƒ€ìž…ì´ ìœ íš¨í•˜ì§€ 않습니다, TYPE_* ìƒìˆ˜ë¥¼ 사용하세요."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr "디코딩할 ë°”ì´íŠ¸ê°€ 모ìžë¼ê±°ë‚˜, 유효하지 ì•Šì€ í˜•ì‹ìž…니다."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "표현ì‹ì—서 ìž˜ëª»ëœ ìž…ë ¥ %i (전달ë˜ì§€ 않ìŒ)"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "ì¸ìŠ¤í„´ìŠ¤ê°€ 비어있기 ë•Œë¬¸ì— Self를 사용할 수 없습니다 (전달ë˜ì§€ 않ìŒ)"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "노드 %s ì•ˆì— ì¸ë±ìФ ì†ì„± ì´ë¦„ '%s' 는 유효하지 않습니다."
+msgstr "ì—°ì‚°ìž %s, %s ë° %s ì˜ ì—°ì‚° 대ìƒì´ 유효하지 않습니다."
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid index of type %s for base type %s"
-msgstr "노드 %s ì•ˆì— ì¸ë±ìФ ì†ì„± ì´ë¦„ '%s' 는 유효하지 않습니다."
+msgstr "ë² ì´ìФ 타입 %s ì— ìœ íš¨í•˜ì§€ ì•Šì€ ì¸ë±ìФ 타입 %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "ë² ì´ìФ 타입 %s ì— ìœ íš¨í•˜ì§€ ì•Šì€ ì¸ë±ìФ ì´ë¦„ %s"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid arguments to construct '%s'"
-msgstr ": 유효하지 ì•Šì€ ì¸ìž 타입: "
+msgstr "'%s' ì„ êµ¬ì„±í•˜ê¸°ì— ìœ íš¨í•˜ì§€ ì•Šì€ ì¸ìˆ˜"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "'%s' 를 호출 시:"
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
-msgstr "무료"
+msgstr "ìžìœ "
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "균형"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Mirror"
-msgstr "X축 뒤집기"
+msgstr "거울"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "키 삽입"
+msgstr "ì—¬ê¸°ì— í‚¤ë¥¼ 삽입"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "ì„ íƒ ë³µì œ"
+msgstr "ì„ íƒí•œ 키를 복제"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "ì„ íƒ í•­ëª© ì‚­ì œ"
+msgstr "ì„ íƒí•œ 키를 ì‚­ì œ"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -127,46 +121,40 @@ msgid "Anim Change Call"
msgstr "애니메ì´ì…˜ 호출 변경"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Property Track"
-msgstr "ì†ì„±:"
+msgstr "ì†ì„± 트랙"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "3D Transform Track"
-msgstr "변형 타입"
+msgstr "3D 변형 트랙"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "호출 메서드 트랙"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "베지어 커브 트랙"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "오디오 ìž¬ìƒ íŠ¸ëž™"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Playback Track"
-msgstr "애니메ì´ì…˜ ìž¬ìƒ ì •ì§€. (S)"
+msgstr "애니메ì´ì…˜ ìž¬ìƒ íŠ¸ëž™"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
-msgstr "애니메ì´ì…˜ 트랙 추가"
+msgstr "트랙 추가"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Length Time (seconds)"
-msgstr "애니메ì´ì…˜ ê¸¸ì´ (ì´ˆ)."
+msgstr "애니메ì´ì…˜ ê¸¸ì´ ì‹œê°„ (ì´ˆ)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "애니메ì´ì…˜ 확대."
+msgstr "애니메ì´ì…˜ 반복"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -174,63 +162,56 @@ msgid "Functions:"
msgstr "함수:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Audio Clips:"
-msgstr "오디오 리스너"
+msgstr "오디오 í´ë¦½:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Clips:"
-msgstr "í´ë¦½"
+msgstr "애니메ì´ì…˜ í´ë¦½:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Toggle this track on/off."
-msgstr "집중 모드 토글."
+msgstr "ì´ íŠ¸ëž™ì„ í‚¤ê±°ë‚˜ ë•니다."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "ì—…ë°ì´íЏ 모드 (ì´ ì†ì„±ì„ 설정하는 방법)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Interpolation Mode"
-msgstr "애니메ì´ì…˜ 노드"
+msgstr "보간 모드"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "루프 ëž© 모드 (시작 루프와 ëì„ ë³´ê°„)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "ì„ íƒëœ 트랙 ì‚­ì œ."
+msgstr "ì´ íŠ¸ëž™ì„ ì‚­ì œí•©ë‹ˆë‹¤."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "í¬ë¡œìФ 페ì´ë“œ 시간 (ì´ˆ):"
+msgstr "시간 (초): "
#: editor/animation_track_editor.cpp
msgid "Continuous"
-msgstr "ì—°ì†ì ì¸"
+msgstr "ì—°ì†ì "
#: editor/animation_track_editor.cpp
msgid "Discrete"
-msgstr "비연ì†ì ì¸"
+msgstr "비연ì†ì "
#: editor/animation_track_editor.cpp
msgid "Trigger"
msgstr "트리거"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Capture"
-msgstr "기능"
+msgstr "캡ì³"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "가장 가까움"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
@@ -239,16 +220,15 @@ msgstr "ì§ì„ í˜•"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr ""
+msgstr "입방형"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clamp Loop Interp"
-msgstr "애니메ì´ì…˜ 루프 ë³´ê°„ 변경"
+msgstr "í´ëž¨í”„ 루프 ì¸í„°í”„리터"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "ëž© 루프 ì¸í„°í”„리터"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -256,14 +236,12 @@ msgid "Insert Key"
msgstr "키 삽입"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "노드 복제"
+msgstr "키 복제"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "노드 삭제"
+msgstr "키 삭제"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -281,11 +259,10 @@ msgstr "%dê°œì˜ ìƒˆ íŠ¸ëž™ì„ ìƒì„±í•˜ê³  키를 삽입하시겠습니까?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
-msgstr "ìƒì„±"
+msgstr "만들기"
#: editor/animation_track_editor.cpp
msgid "Anim Insert"
@@ -294,6 +271,7 @@ msgstr "애니메ì´ì…˜ 삽입"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
msgstr ""
+"AnimationPlayer는 ìžì‹ ì„ 애니메ì´ì…˜ í•  수 없습니다, 다른 것ì—ë§Œ ë©ë‹ˆë‹¤."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
@@ -309,7 +287,7 @@ msgstr "애니메ì´ì…˜ 키 삽입"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr ""
+msgstr "변형 íŠ¸ëž™ì€ ì˜¤ì§ Spatial 기반 노드ì—ë§Œ ì ìš©ë©ë‹ˆë‹¤."
#: editor/animation_track_editor.cpp
msgid ""
@@ -318,44 +296,47 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"오디오 íŠ¸ëž™ì€ ì˜¤ì§ ë‹¤ìŒ íƒ€ìž…ì˜ ë…¸ë“œë§Œ 가리킬 수 있습니다:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "애니메ì´ì…˜ íŠ¸ëž™ì€ ì˜¤ì§ AnimationPlayer 노드만 가리킬 수 있습니다."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
msgstr ""
+"애니메ì´ì…˜ 플레ì´ì–´ëŠ” ìžì‹ ì„ 애니메ì´ì…˜ í•  수 없습니다, 다른 것ì—ë§Œ ë©ë‹ˆë‹¤."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "루트 ì—†ì´ ìƒˆ íŠ¸ëž™ì„ ì¶”ê°€í•  수 ì—†ìŒ"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "트랙 경로가 유효하지 않습니다, 키를 추가하실 수 없습니다."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "íŠ¸ëž™ì´ Spatial íƒ€ìž…ì´ ì•„ë‹™ë‹ˆë‹¤, 키를 삽입하실 수 없습니다"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
-msgstr ""
+msgstr "트랙 경로가 유효하지 않습니다, 메서드 키를 추가하실 수 없습니다."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Method not found in object: "
-msgstr "VariableGetì´ ìŠ¤í¬ë¦½íЏì—서 발견ë˜ì§€ 않ìŒ: "
+msgstr "ê°ì²´ì— 메서드가 없습니다: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
msgstr "애니메ì´ì…˜ 키 ì´ë™"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clipboard is empty"
-msgstr "í´ë¦½ë³´ë“œê°€ 비었습니다!"
+msgstr "í´ë¦½ë³´ë“œê°€ 비었습니다"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
@@ -364,25 +345,23 @@ msgstr "애니메ì´ì…˜ 키 í¬ê¸° ì¡°ì ˆ"
#: editor/animation_track_editor.cpp
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
-msgstr ""
+msgstr "ì´ ì˜µì…˜ì€ ë² ì§€ì–´ 편집ì—서 ë‹¨ì¼ íŠ¸ëž™ì´ê¸° 때문ì—, ìž‘ë™í•˜ì§€ 않습니다."
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "트리ì—서 ì„ íƒí•œ ë…¸ë“œì˜ íŠ¸ëž™ë§Œ 표시합니다."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr ""
+msgstr "노드 별로 ê·¸ë£¹ì„ íŠ¸ëž™ 하거나 ì¼ë°˜ 목ë¡ìœ¼ë¡œ 표시합니다."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap (s): "
-msgstr "스냅 (픽셀):"
+msgstr "스냅: "
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "애니메ì´ì…˜ 트리가 유효합니다."
+msgstr "애니메ì´ì…˜ 단계 ê°’."
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -394,19 +373,16 @@ msgid "Edit"
msgstr "편집"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "애니메ì´ì…˜ 트리"
+msgstr "애니메ì´ì…˜ ì†ì„±."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "ì†ì„± 복사"
+msgstr "트랙 복사"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "ì†ì„± 붙여넣기"
+msgstr "트랙 붙여넣기"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -416,8 +392,7 @@ msgstr "ì„ íƒ í¬ê¸° ì¡°ì ˆ"
msgid "Scale From Cursor"
msgstr "커서 위치ì—서 í¬ê¸° ì¡°ì ˆ"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "ì„ íƒ ë³µì œ"
@@ -426,16 +401,15 @@ msgid "Duplicate Transposed"
msgstr "ì„ íƒëœ íŠ¸ëž™ì— ë³µì œ"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
-msgstr "ì„ íƒ í•­ëª© ì‚­ì œ"
+msgstr "ì„ íƒ ì‚­ì œ"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+msgid "Go to Next Step"
msgstr "ë‹¤ìŒ ìŠ¤í…으로 ì´ë™"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+msgid "Go to Previous Step"
msgstr "ì´ì „ 스í…으로 ì´ë™"
#: editor/animation_track_editor.cpp
@@ -448,11 +422,11 @@ msgstr "애니메ì´ì…˜ 정리"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "애니메ì´ì…˜ í•  노드를 ì„ íƒí•˜ì„¸ìš”:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "베지어 커브 사용"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
@@ -500,7 +474,7 @@ msgstr "ìŠ¤ì¼€ì¼ ë¹„ìœ¨:"
#: editor/animation_track_editor.cpp
msgid "Select tracks to copy:"
-msgstr ""
+msgstr "복사할 트랙 ì„ íƒ:"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -538,11 +512,11 @@ msgstr "ì¼ì¹˜ ê²°ê³¼ ì—†ìŒ"
msgid "Replaced %d occurrence(s)."
msgstr "%d 회 êµì²´ë¨."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "ëŒ€ì†Œë¬¸ìž êµ¬ë¶„"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "전체 단어"
@@ -558,29 +532,31 @@ msgstr "전체 바꾸기"
msgid "Selection Only"
msgstr "ì„ íƒ ì˜ì—­ë§Œ"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "확대"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "축소"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "줌 리셋"
#: editor/code_editor.cpp
-#, fuzzy
msgid "Warnings:"
-msgstr "경고"
+msgstr "경고:"
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "확대 (%):"
+msgid "Font Size:"
+msgstr "í°íЏ í¬ê¸°:"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "ë¼ì¸:"
@@ -613,6 +589,7 @@ msgstr "추가"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -620,11 +597,11 @@ msgstr "삭제"
#: editor/connections_dialog.cpp
msgid "Add Extra Call Argument:"
-msgstr "별ë„ì˜ í˜¸ì¶œ ì¸ìž 추가:"
+msgstr "별ë„ì˜ í˜¸ì¶œ ì¸ìˆ˜ 추가:"
#: editor/connections_dialog.cpp
msgid "Extra Call Arguments:"
-msgstr "별ë„ì˜ í˜¸ì¶œ ì¸ìž:"
+msgstr "별ë„ì˜ í˜¸ì¶œ ì¸ìˆ˜:"
#: editor/connections_dialog.cpp
msgid "Path to Node:"
@@ -669,9 +646,8 @@ msgid "Disconnect '%s' from '%s'"
msgstr "'%s'와 '%s'ì˜ ì—°ê²° í•´ì œ"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect all from signal: '%s'"
-msgstr "'%s'와 '%s'ì˜ ì—°ê²° í•´ì œ"
+msgstr "ì „ë¶€ 시그ë„ì—서 ì—°ê²° í•´ì œ: '%s'"
#: editor/connections_dialog.cpp
msgid "Connect..."
@@ -683,42 +659,36 @@ msgid "Disconnect"
msgstr "연결해제"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect Signal: "
-msgstr "ì‹œê·¸ë„ ì—°ê²°:"
+msgstr "ì‹œê·¸ë„ ì—°ê²°: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection: "
-msgstr "연결 편집"
+msgstr "연결 편집 "
#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "Are you sure you want to remove all connections from the \""
-msgstr "ë‘ê°œ ì´ìƒì˜ 프로ì íŠ¸ë¥¼ 실행하려는 ê²ƒì´ í™•ì‹¤í•©ë‹ˆê¹Œ?"
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr "\"%s\" 시그ë„ì—서 모든 ì—°ê²°ì„ ì‚­ì œí•˜ì‹œê² ìŠµë‹ˆê¹Œ?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
-msgstr "시그ë„"
+msgstr "시그ë„(Signal)"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr ""
+msgstr "ì´ ì‹œê·¸ë„ì—서 모든 ì—°ê²°ì„ ì‚­ì œí•˜ì‹œê² ìŠµë‹ˆê¹Œ?"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "연결해제"
+msgstr "모든 연결 해제"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit..."
-msgstr "편집"
+msgstr "편집..."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "메서드"
+msgstr "메서드로 ì´ë™"
#: editor/create_dialog.cpp
msgid "Change %s Type"
@@ -731,7 +701,7 @@ msgstr "변경"
#: editor/create_dialog.cpp
msgid "Create New %s"
-msgstr "새 %s ìƒì„±"
+msgstr "새 %s 만들기"
#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp
@@ -743,23 +713,20 @@ msgid "Recent:"
msgstr "최근:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "검색:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "ì¼ì¹˜:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "설명:"
@@ -778,7 +745,7 @@ msgid ""
"Changes will not take effect unless reloaded."
msgstr ""
"씬 '%s'(ì´)ê°€ 현재 편집 중입니다.\n"
-"다시 로드 í•  때 변경 ì‚¬í•­ì´ ì ìš©ë©ë‹ˆë‹¤."
+"다시 불러올 때 변경 ì‚¬í•­ì´ ì ìš©ë©ë‹ˆë‹¤."
#: editor/dependency_editor.cpp
msgid ""
@@ -786,7 +753,7 @@ msgid ""
"Changes will take effect when reloaded."
msgstr ""
"리소스 '%s'ì´(ê°€) 사용 중입니다.\n"
-"다시 로드 í•  때 변경 ì‚¬í•­ì´ ì ìš©ë©ë‹ˆë‹¤."
+"다시 불러올 때 변경 ì‚¬í•­ì´ ì ìš©ë©ë‹ˆë‹¤."
#: editor/dependency_editor.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -798,8 +765,7 @@ msgid "Resource"
msgstr "리소스"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "경로"
@@ -820,9 +786,10 @@ msgid "Search Replacement Resource:"
msgstr "대체 리소스 검색:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -847,15 +814,15 @@ msgstr ""
#: editor/dependency_editor.cpp editor/export_template_manager.cpp
msgid "Cannot remove:"
-msgstr "제거할 수 없습니다:"
+msgstr "삭제할 수 없습니다:"
#: editor/dependency_editor.cpp
msgid "Error loading:"
-msgstr "로드 중 ì—러:"
+msgstr "불러오기 중 ì—러:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
-msgstr "ì¢…ì† ê´€ê³„ë¥¼ ì°¾ì„ ìˆ˜ 없어 씬를 로드할 수 없습니다:"
+msgid "Load failed due to missing dependencies:"
+msgstr "ì¢…ì† ê´€ê³„ë¥¼ ì°¾ì„ ìˆ˜ 없어 ì”¬ì„ ë¶ˆëŸ¬ì˜¬ 수 없습니다:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -871,7 +838,7 @@ msgstr "ì¢…ì† ê´€ê³„ 수정"
#: editor/dependency_editor.cpp
msgid "Errors loading!"
-msgstr "로드 중 ì—러 ë°œìƒ!"
+msgstr "불러오기 중 ì—러 ë°œìƒ!"
#: editor/dependency_editor.cpp
msgid "Permanently delete %d item(s)? (No undo!)"
@@ -913,14 +880,6 @@ msgstr "Dictionary 값 변경"
msgid "Thanks from the Godot community!"
msgstr "Godot ì»¤ë®¤ë‹ˆí‹°ì— ê°ì‚¬ë“œë¦½ë‹ˆë‹¤!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "확ì¸"
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Godot Engine 기여ìž"
@@ -1013,7 +972,7 @@ msgid "Uncompressing Assets"
msgstr "ì—ì…‹ ì••ì¶•í•´ì œ"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+msgid "Package installed successfully!"
msgstr "패키지가 성공ì ìœ¼ë¡œ 설치ë˜ì—ˆìŠµë‹ˆë‹¤!"
#: editor/editor_asset_installer.cpp
@@ -1052,11 +1011,11 @@ msgstr "오디오 버스 솔로 토글"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Mute"
-msgstr "오디오 버스 뮤트 토글"
+msgstr "오디오 버스 ìŒì†Œê±° 토글"
#: editor/editor_audio_buses.cpp
msgid "Toggle Audio Bus Bypass Effects"
-msgstr "오디오 버스 ë°”ì´íŒ¨ìФ ì´íŽ™íŠ¸ 토글"
+msgstr "오디오 버스 ë°”ì´íŒ¨ìФ 효과 토글"
#: editor/editor_audio_buses.cpp
msgid "Select Audio Bus Send"
@@ -1076,7 +1035,7 @@ msgstr "버스 ì´íŽ™íŠ¸ ì‚­ì œ"
#: editor/editor_audio_buses.cpp
msgid "Audio Bus, Drag and Drop to rearrange."
-msgstr "오디오 버스, 드래그 ë° ë“œëžìœ¼ë¡œ 재배치하세요."
+msgstr "오디오 버스, 드래그 앤 드롭으로 재 배치하세요."
#: editor/editor_audio_buses.cpp
msgid "Solo"
@@ -1095,8 +1054,7 @@ msgid "Bus options"
msgstr "버스 옵션"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "복제"
@@ -1168,7 +1126,7 @@ msgstr "새로운 버스 ë ˆì´ì•„ì›ƒì„ ë§Œë“­ë‹ˆë‹¤."
#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
#: editor/script_create_dialog.cpp
msgid "Load"
-msgstr "로드"
+msgstr "불러오기"
#: editor/editor_audio_buses.cpp
msgid "Load an existing Bus Layout."
@@ -1257,7 +1215,7 @@ msgid "Add AutoLoad"
msgstr "오토로드 추가"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "경로:"
@@ -1265,8 +1223,8 @@ msgstr "경로:"
msgid "Node Name:"
msgstr "노드 ì´ë¦„:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "ì´ë¦„"
@@ -1305,7 +1263,7 @@ msgstr "디렉토리 ì„ íƒ"
#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
msgid "Create Folder"
-msgstr "í´ë” ìƒì„±"
+msgstr "í´ë” 만들기"
#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp
@@ -1336,26 +1294,29 @@ msgid "Template file not found:"
msgstr "í…œí”Œë¦¿ì„ ì°¾ì„ ìˆ˜ 없습니다:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "현재 í´ë” ì„ íƒ"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "파ì¼ì´ 존재합니다. ë®ì–´ì“°ì‹œê² ìŠµë‹ˆê¹Œ?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "현재 í´ë” ì„ íƒ"
+msgid "Select This Folder"
+msgstr "ì´ í´ë” ì„ íƒ"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
msgstr "경로 복사"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Open In File Manager"
-msgstr "íŒŒì¼ ë§¤ë‹ˆì €ì—서 보기"
+msgid "Open in File Manager"
+msgstr "íŒŒì¼ íƒìƒ‰ê¸°ì—서 열기"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
-msgstr "íŒŒì¼ ë§¤ë‹ˆì €ì—서 보기"
+msgid "Show in File Manager"
+msgstr "íŒŒì¼ íƒìƒ‰ê¸°ì—서 보기"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
@@ -1390,7 +1351,8 @@ msgid "Open a File or Directory"
msgstr "디렉토리 ë˜ëŠ” íŒŒì¼ ì—´ê¸°"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "저장하기"
@@ -1448,8 +1410,7 @@ msgstr "디렉토리와 파ì¼:"
msgid "Preview:"
msgstr "미리보기:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "파ì¼:"
@@ -1465,24 +1426,11 @@ msgstr "소스 조사"
msgid "(Re)Importing Assets"
msgstr "ì—ì…‹ (다시) 가져오기"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "ë„ì›€ë§ ê²€ìƒ‰"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "í´ëž˜ìФ 목ë¡:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "í´ëž˜ìФ 검색"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
-msgstr "윗면"
+msgstr "맨 위"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "í´ëž˜ìФ:"
@@ -1499,28 +1447,28 @@ msgid "Brief Description:"
msgstr "간단한 설명:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "멤버"
+msgid "Properties"
+msgstr "ì†ì„±"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "멤버:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr "ì†ì„±:"
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "공개 메서드"
+msgid "Methods"
+msgstr "메서드"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "공개 메서드:"
+msgid "Methods:"
+msgstr "메서드:"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "GUI 테마 항목"
+msgid "Theme Properties"
+msgstr "테마 ì†ì„±"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "GUI 테마 항목:"
+msgid "Theme Properties:"
+msgstr "테마 ì†ì„±:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1540,15 +1488,19 @@ msgstr "ì´ë„˜(ì—´ê±°) "
#: editor/editor_help.cpp
msgid "Constants"
-msgstr "ìƒìˆ˜"
+msgstr "ìƒìˆ˜(Constant)"
#: editor/editor_help.cpp
msgid "Constants:"
msgstr "ìƒìˆ˜:"
#: editor/editor_help.cpp
-msgid "Description"
-msgstr "설명"
+msgid "Class Description"
+msgstr "í´ëž˜ìФ 설명"
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
+msgstr "í´ëž˜ìФ 설명:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1565,11 +1517,11 @@ msgstr ""
"니다."
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "ì†ì„±"
+msgid "Property Descriptions"
+msgstr "ì†ì„± 설명"
#: editor/editor_help.cpp
-msgid "Property Description:"
+msgid "Property Descriptions:"
msgstr "ì†ì„± 설명:"
#: editor/editor_help.cpp
@@ -1581,11 +1533,11 @@ msgstr ""
"기여하여[/url][/color] ë” ë‚˜ì•„ì§€ê²Œ ë„와주세요!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "메서드"
+msgid "Method Descriptions"
+msgstr "메서드 설명"
#: editor/editor_help.cpp
-msgid "Method Description:"
+msgid "Method Descriptions:"
msgstr "메서드 설명:"
#: editor/editor_help.cpp
@@ -1593,21 +1545,61 @@ msgid ""
"There is currently no description for this method. Please help us by [color="
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-"현재 ì´ ë©”ì„œë“œì— ëŒ€í•œ ìƒì„¸ì„¤ëª…ì´ ì—†ìŠµë‹ˆë‹¤. [color=$color][url=$url]관련 ì •ë³´"
+"현재 ì´ ë©”ì„œë“œì— ëŒ€í•œ ìƒì„¸ ì„¤ëª…ì´ ì—†ìŠµë‹ˆë‹¤. [color=$color][url=$url]관련 ì •ë³´"
"를 기여하여[/url][/color] ë” ë‚˜ì•„ì§€ê²Œ ë„와주세요!"
-#: editor/editor_inspector.cpp
-#, fuzzy
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "ë„ì›€ë§ ê²€ìƒ‰"
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr "ëª¨ë‘ í‘œì‹œ"
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr "í´ëž˜ìŠ¤ë§Œ"
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr "메서드만"
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr "시그ë„ë§Œ"
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr "ìƒìˆ˜ë§Œ"
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr "ì†ì„±ë§Œ"
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr "테마 ì†ì„±ë§Œ"
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr "멤버 타입"
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr "í´ëž˜ìФ"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
msgstr "ì†ì„±:"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr "설정"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "다중 설정:"
#: editor/editor_log.cpp
msgid "Output:"
@@ -1635,6 +1627,11 @@ msgstr "프로ì íЏ 내보내기가 오류 코드 %d 로 실패했습니다."
msgid "Error saving resource!"
msgstr "리소스 저장 중 ì—러!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "확ì¸"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "리소스를 다른 ì´ë¦„으로 저장..."
@@ -1653,7 +1650,7 @@ msgstr "저장 중 ì—러."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
-msgstr ""
+msgstr "'%s' 를 ì—´ 수 없습니다. 파ì¼ì´ 존재하지 않습니다."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
@@ -1689,15 +1686,27 @@ msgstr "ì´ ìž‘ì—…ì€ íŠ¸ë¦¬ 루트 ì—†ì´ëŠ” 불가합니다."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+"사ì´í´ë¡œ ëœ ì¸ìŠ¤í„´ìŠ¤ê°€ í¬í•¨ë˜ì–´ 있기 ë•Œë¬¸ì— ì´ ì”¬ì„ ì €ìž¥í•  수 없습니다.\n"
+"ì´ë¥¼ 수정하고 다시 ì €ìž¥ì„ ì‹œë„하십시오."
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
"ì”¬ì„ ì €ìž¥í•  수 없습니다. ì•„ë§ˆë„ ì¢…ì† ê´€ê³„(ì¸ìŠ¤í„´ìŠ¤ ë˜ëŠ” ìƒì†)ê°€ 만족스럽지 않"
"ì„ ìˆ˜ 있습니다."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr "열려있는 ì”¬ì„ ë®ì–´ 쓸 수 없습니다!"
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
-msgstr "병합할 메시 ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 로드할 수 없습니다!"
+msgstr "병합할 메시 ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 불러올 수 없습니다!"
#: editor/editor_node.cpp
msgid "Error saving MeshLibrary!"
@@ -1705,7 +1714,7 @@ msgstr "메시 ë¼ì´ë¸ŒëŸ¬ë¦¬ 저장 중 ì—러!"
#: editor/editor_node.cpp
msgid "Can't load TileSet for merging!"
-msgstr "병합할 타ì¼ì…‹ì„ 로드할 수 없습니다!"
+msgstr "병합할 타ì¼ì…‹ì„ 불러올 수 없습니다!"
#: editor/editor_node.cpp
msgid "Error saving TileSet!"
@@ -1880,7 +1889,7 @@ msgstr "현재 ì”¬ì´ ì €ìž¥ë˜ì§€ 않았습니다. 무시하고 여시겠습니
#: editor/editor_node.cpp
msgid "Can't reload a scene that was never saved."
-msgstr "저장ë˜ì§€ ì•Šì€ ì”¬ì€ ë‹¤ì‹œ 로드할 수 없습니다."
+msgstr "저장ë˜ì§€ ì•Šì€ ì”¬ì€ ë‹¤ì‹œ 불러올 수 없습니다."
#: editor/editor_node.cpp
msgid "Revert"
@@ -1908,7 +1917,7 @@ msgstr "프로ì íЏ 매니저를 여시겠습니까?"
#: editor/editor_node.cpp
msgid "Save & Quit"
-msgstr "저장 ë° ì¢…ë£Œ"
+msgstr "저장하고 종료"
#: editor/editor_node.cpp
msgid "Save changes to the following scene(s) before quitting?"
@@ -1923,8 +1932,8 @@ msgid ""
"This option is deprecated. Situations where refresh must be forced are now "
"considered a bug. Please report."
msgstr ""
-"ì´ ì˜µì…˜ì€ ë” ì´ìƒ 사용ë˜ì§€ 않습니다. 반드시 ìƒˆë¡œê³ ì¹¨ì„ í•´ì•¼ 하는 ìƒí™©ì€ ì´ì œ "
-"버그입니다. 신고해주십시오."
+"ì´ ì˜µì…˜ì€ ë” ì´ìƒ 사용ë˜ì§€ 않습니다. ìƒˆë¡œê³ ì¹¨ì„ í•´ì•¼ 하는 ìƒí™©ì€ 버그로 간주"
+"ë©ë‹ˆë‹¤. 리í¬íЏ ë°”ëžë‹ˆë‹¤."
#: editor/editor_node.cpp
msgid "Pick a Main Scene"
@@ -1932,35 +1941,43 @@ msgstr "ë©”ì¸ ì”¬ ì„ íƒ"
#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
-msgstr "확장기능 플러그ì¸ì„ 활성화할 수 없습니다: '%s' 설정 í•´ì„ ì‹¤íŒ¨."
+msgstr "애드온 플러그ì¸ì„ 활성화할 수 없습니다: '%s' 설정 í•´ì„ ì‹¤íŒ¨."
#: editor/editor_node.cpp
msgid "Unable to find script field for addon plugin at: 'res://addons/%s'."
-msgstr "확장기능 플러그ì¸ì„ ì°¾ì„ ìˆ˜ 없습니다: 'res://addons/%s'."
+msgstr "애드온 플러그ì¸ì„ ì°¾ì„ ìˆ˜ 없습니다: 'res://addons/%s'."
#: editor/editor_node.cpp
msgid "Unable to load addon script from path: '%s'."
-msgstr "확장기능 스í¬ë¦½íŠ¸ë¥¼ 로드할 수 없습니다: '%s'."
+msgstr "애드온 스í¬ë¦½íŠ¸ë¥¼ 불러올 수 없습니다: '%s'."
+
+#: editor/editor_node.cpp
+msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"해당 경로ì—서 애드온 스í¬ë¦½íŠ¸ë¥¼ 불러올 수 없습니다: '%s' ì½”ë“œì— ì˜¤ë¥˜ê°€ 있는 "
+"것 같습니다, êµ¬ë¬¸ì„ í™•ì¸í•´ 보십시오."
#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
-"해당 경로ì—서 확장기능 스í¬ë¦½íŠ¸ë¥¼ 로드할 수 없습니다: '%s' 기본 íƒ€ìž…ì´ "
+"해당 경로ì—서 애드온 스í¬ë¦½íŠ¸ë¥¼ 불러올 수 없습니다: '%s' 기본 íƒ€ìž…ì´ "
"EditorPluginì´ ì•„ë‹™ë‹ˆë‹¤."
#: editor/editor_node.cpp
msgid "Unable to load addon script from path: '%s' Script is not in tool mode."
msgstr ""
-"해당 경로ì—서 확장기능 스í¬ë¦½íŠ¸ë¥¼ 로드할 수 없습니다: '%s' 스í¬ë¦½íŠ¸ê°€ tool 모"
-"드가 아닙니다."
+"해당 경로ì—서 애드온 스í¬ë¦½íŠ¸ë¥¼ 불러올 수 없습니다: '%s' 스í¬ë¦½íŠ¸ê°€ tool 모드"
+"가 아닙니다."
#: editor/editor_node.cpp
msgid ""
"Scene '%s' was automatically imported, so it can't be modified.\n"
"To make changes to it, a new inherited scene can be created."
msgstr ""
-"'%s' ì”¬ì€ ìžë™ìœ¼ë¡œ ìž„í¬íЏ ë˜ì™¸ì„œ, 변경할 수 없습니다.\n"
+"'%s' ì”¬ì€ ìžë™ìœ¼ë¡œ 가져와 지기 때문ì—, 변경할 수 없습니다.\n"
"ë³€ê²½ì‚¬í•­ì„ ì ìš©í•˜ë ¤ë©´, 새로운 ìƒì† ì”¬ì„ ë§Œë“œì„¸ìš”."
#: editor/editor_node.cpp
@@ -1992,15 +2009,18 @@ msgstr "ë ˆì´ì•„웃 ì‚­ì œ"
msgid "Default"
msgstr "기본"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr "íŒŒì¼ ì‹œìŠ¤í…œì—서 보기"
+
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play This Scene"
-msgstr "씬 실행"
+msgstr "ì´ ì”¬ì„ ì‹¤í–‰"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "다른 탭 닫기"
+msgstr "탭 닫기"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2075,7 +2095,7 @@ msgid "Save Scene"
msgstr "씬 저장"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+msgid "Save All Scenes"
msgstr "모든 씬 저장"
#: editor/editor_node.cpp
@@ -2104,7 +2124,7 @@ msgid "Undo"
msgstr "ë˜ëŒë¦¬ê¸°"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "다시 실행"
@@ -2128,20 +2148,20 @@ msgstr "프로ì íЏ 설정"
msgid "Export"
msgstr "내보내기"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "ë„구"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "프로ì íЏ 매니저를 여시겠습니까?"
+msgstr "프로ì íЏ ë°ì´í„° í´ë” 열기"
#: editor/editor_node.cpp
msgid "Quit to Project List"
msgstr "종료 후 프로ì íЏ ëª©ë¡ ì—´ê¸°"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "디버그"
@@ -2247,21 +2267,19 @@ msgstr "ì—디터 ë ˆì´ì•„웃"
#: editor/editor_node.cpp
msgid "Toggle Fullscreen"
-msgstr "전체화면 토글"
+msgstr "전체 화면 토글"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Data/Settings Folder"
-msgstr "ì—디터 설정"
+msgstr "ì—디터 ë°ì´í„°/설정 í´ë” 열기"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "ì—디터 ë°ì´í„° í´ë” 열기"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Settings Folder"
-msgstr "ì—디터 설정"
+msgstr "ì—디터 설정 í´ë” 열기"
#: editor/editor_node.cpp editor/project_export.cpp
msgid "Manage Export Templates"
@@ -2271,10 +2289,6 @@ msgstr "내보내기 템플릿 관리"
msgid "Help"
msgstr "ë„움ë§"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "í´ëž˜ìФ"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2345,13 +2359,12 @@ msgstr "커스텀 씬 실행"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr ""
+msgstr "비디오 드ë¼ì´ë²„를 변경하려면 ì—디터를 다시 시작해야 합니다."
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Save & Restart"
-msgstr "저장 ë° ë‹¤ì‹œ 가져오기"
+msgstr "저장 & 다시 시작"
#: editor/editor_node.cpp
msgid "Spins when the editor window repaints!"
@@ -2369,27 +2382,26 @@ msgstr "변경사항만 갱신"
msgid "Disable Update Spinner"
msgstr "ì—…ë°ì´íЏ 스피너 비활성화"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "ì¸ìŠ¤íŽ™í„°"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "가져오기"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "노드"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "íŒŒì¼ ì‹œìŠ¤í…œ"
#: editor/editor_node.cpp
-#, fuzzy
+msgid "Inspector"
+msgstr "ì¸ìŠ¤íŽ™í„°"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "노드"
+
+#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
-msgstr "ëª¨ë‘ í™•ìž¥"
+msgstr "하단 íŒ¨ë„ í™•ìž¥"
#: editor/editor_node.cpp scene/resources/visual_shader.cpp
msgid "Output"
@@ -2429,7 +2441,7 @@ msgstr "새 ìƒì† 씬"
#: editor/editor_node.cpp
msgid "Load Errors"
-msgstr "로드 ì—러"
+msgstr "불러오기 ì—러"
#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp
msgid "Select"
@@ -2468,9 +2480,8 @@ msgid "Thumbnail..."
msgstr "ì¸ë„¤ì¼..."
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit Plugin"
-msgstr "í´ë¦¬ê³¤ 편집"
+msgstr "í”ŒëŸ¬ê·¸ì¸ íŽ¸ì§‘"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
@@ -2494,15 +2505,13 @@ msgid "Status:"
msgstr "ìƒíƒœ:"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit:"
-msgstr "편집"
+msgstr "편집:"
#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Start"
-msgstr "시작!"
+msgstr "시작"
#: editor/editor_profiler.cpp
msgid "Measure:"
@@ -2524,7 +2533,7 @@ msgstr "프레임 %"
msgid "Physics Frame %"
msgstr "물리 프레임 %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "시간:"
@@ -2534,7 +2543,7 @@ msgstr "í¬í•¨"
#: editor/editor_profiler.cpp
msgid "Self"
-msgstr "ìžì‹ "
+msgstr "Self(셀프)"
#: editor/editor_profiler.cpp
msgid "Frame #:"
@@ -2548,34 +2557,62 @@ msgstr "시간"
msgid "Calls"
msgstr "호출"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr "사용"
#: editor/editor_properties.cpp
msgid "Layer"
-msgstr ""
+msgstr "ë ˆì´ì–´"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Bit %d, value %d"
-msgstr "비트 %d, 값 %d."
+msgstr "비트 %d, 값 %d"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr "[비어있ìŒ]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
+msgid "Assign..."
+msgstr "지정하기..."
+
+#: editor/editor_properties.cpp
#, fuzzy
-msgid "Assign.."
-msgstr "할당"
+msgid "Invalid RID"
+msgstr "유효하지 ì•Šì€ ê²½ë¡œ"
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr "ì„ íƒëœ 리소스(%s)ê°€ ì´ ì†ì„±(%s)ì— ì•Œë§žì€ íƒ€ìž…ì´ ì•„ë‹™ë‹ˆë‹¤."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+"파ì¼ë¡œ ì €ìž¥ëœ ë¦¬ì†ŒìŠ¤ì—서 ViewportTexture를 만들 수 없습니다.\n"
+"리소스가 ì”¬ì— ì†í•´ 있어야 합니다."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+"리소스가 ì”¬ì— ë¡œì»¬ë¡œ 설정ë˜ì§€ 않았기 ë•Œë¬¸ì— ViewportTexture를 만들 수 없습니"
+"다.\n"
+"ë¦¬ì†ŒìŠ¤ì˜ 'local to scene' ì†ì„±ì„ 켜십시오 (그리고 모든 리소스를 노드가 í¬í•¨í•˜"
+"고 있어야 합니다)."
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr "ë·°í¬íЏ ì„ íƒ"
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr "새 스í¬ë¦½íЏ"
@@ -2587,10 +2624,6 @@ msgstr "새 %s"
msgid "Make Unique"
msgstr "고유하게 만들기"
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr "íŒŒì¼ ì‹œìŠ¤í…œì—서 보기"
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2599,7 +2632,8 @@ msgstr "íŒŒì¼ ì‹œìŠ¤í…œì—서 보기"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "붙여넣기"
@@ -2612,36 +2646,32 @@ msgstr "%s로 변환"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Open Editor"
-msgstr "ì—디터ì—서 열기"
+msgstr "ì—디터 열기"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Selected node is not a Viewport!"
msgstr "ì„ íƒëœ 노드는 ë·°í¬íŠ¸ê°€ 아닙니다!"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "Size: "
-msgstr "쎌 사ì´ì¦ˆ:"
+msgstr "사ì´ì¦ˆ: "
#: editor/editor_properties_array_dict.cpp
msgid "Page: "
-msgstr ""
+msgstr "페ì´ì§€: "
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Key:"
-msgstr "새 ì´ë¦„:"
+msgstr "새 키:"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Value:"
-msgstr "새 ì´ë¦„:"
+msgstr "새 값:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
-msgstr ""
+msgstr "키/ê°’ ìŒ ì¶”ê°€"
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -2662,7 +2692,7 @@ msgstr ""
#: editor/editor_run_script.cpp
msgid "Write your logic in the _run() method."
-msgstr "로ì§ì„ _run() ë©”ì„œë“œì•ˆì— ìž‘ì„±í•˜ì„¸ìš”."
+msgstr "_run() ë©”ì„œë“œì— ë¡œì§ì„ 작성하세요."
#: editor/editor_run_script.cpp
msgid "There is an edited scene already."
@@ -2698,7 +2728,7 @@ msgstr "노드ì—서 가져오기:"
#: editor/export_template_manager.cpp
msgid "Re-Download"
-msgstr "다시 다운로드"
+msgstr "다시 다운불러오기"
#: editor/export_template_manager.cpp
msgid "Uninstall"
@@ -2727,16 +2757,15 @@ msgstr "미러를 가져오는 중입니다, 잠시만 기다리세요..."
#: editor/export_template_manager.cpp
msgid "Remove template version '%s'?"
-msgstr "'%s' 템플릿 ë²„ì „ì„ ì œê±°í•˜ì‹œê² ìŠµë‹ˆê¹Œ?"
+msgstr "'%s' 템플릿 ë²„ì „ì„ ì‚­ì œí•˜ì‹œê² ìŠµë‹ˆê¹Œ?"
#: editor/export_template_manager.cpp
msgid "Can't open export templates zip."
msgstr "내보내기 템플릿 zip 파ì¼ì„ ì—´ 수 없습니다."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Invalid version.txt format inside templates: %s."
-msgstr "템플릿 ì•ˆì— version.txtê°€ 유효하지 ì•Šì€ í˜•ì‹ìž…니다."
+msgstr "템플릿 ì•ˆì— version.txtê°€ 유효하지 ì•Šì€ í˜•ì‹ìž…니다: %s."
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
@@ -2801,6 +2830,8 @@ msgid ""
"Templates installation failed. The problematic templates archives can be "
"found at '%s'."
msgstr ""
+"템플릿 ì„¤ì¹˜ì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤. 문제가 있는 템플릿 ì•„ì¹´ì´ë¸ŒëŠ” '%s' ì—서 확ì¸í•˜ì‹¤ "
+"수 있습니다."
#: editor/export_template_manager.cpp
msgid "Error requesting url: "
@@ -2866,7 +2897,7 @@ msgstr "파ì¼ë¡œë¶€í„° 설치"
#: editor/export_template_manager.cpp
msgid "Remove Template"
-msgstr "템플릿 제거"
+msgstr "템플릿 삭제"
#: editor/export_template_manager.cpp
msgid "Select template file"
@@ -2881,27 +2912,28 @@ msgid "Download Templates"
msgstr "템플릿 다운로드"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr "목ë¡ì—서 미러를 ì„ íƒí•˜ì„¸ìš”: "
+msgstr "목ë¡ì—서 미러를 ì„ íƒí•˜ì„¸ìš”: (Shift+í´ë¦­: 브ë¼ìš°ì €ì—서 열기)"
#: editor/file_type_cache.cpp
msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr "file_type_cache.cch를 열수 없어서, íŒŒì¼ íƒ€ìž… ìºì‰¬ë¥¼ 저장하지 않습니다!"
#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr "ì¦ê²¨ì°¾ê¸°"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr "íŒŒì¼ ì‹œìŠ¤í…œì—서 '%s'를 ì°¾ì„ ìˆ˜ 없습니다!"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a grid of thumbnails."
-msgstr "ì¸ë„¤ì¼ 그리드로 보기"
+msgstr "ì¸ë„¤ì¼ 바둑íŒìœ¼ë¡œ 보기."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a list."
-msgstr "리스트로 보기"
+msgstr "리스트로 보기."
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
@@ -2928,19 +2960,15 @@ msgstr "복제 중 ì—러:"
msgid "Unable to update dependencies:"
msgstr "종ì†í•­ëª©ì„ ì—…ë°ì´íЏ í•  수 없습니다:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "ì´ë¦„ì´ ì§€ì •ë˜ì§€ 않ìŒ"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "ì´ë¦„ì´ ì œê³µë˜ì§€ 않았습니다."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "ì´ë¦„ì— ìœ íš¨í•˜ì§€ ì•Šì€ ë¬¸ìžê°€ í¬í•¨ë¨"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "ì´ë¦„ì´ ì œê³µë˜ì§€ 않았습니다."
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "ì´ë¦„ì— ìœ íš¨í•˜ì§€ ì•Šì€ ë¬¸ìžê°€ 있습니다."
@@ -2965,22 +2993,6 @@ msgid "Duplicating folder:"
msgstr "복제 ì¤‘ì¸ í´ë”:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "ëª¨ë‘ í™•ìž¥"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "ëª¨ë‘ ì ‘ê¸°"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "ì´ë¦„ 변경..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "ì´ë™..."
-
-#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
msgstr "씬(들) 열기"
@@ -2989,6 +3001,14 @@ msgid "Instance"
msgstr "ì¸ìŠ¤í„´ìŠ¤"
#: editor/filesystem_dock.cpp
+msgid "Add to favorites"
+msgstr "ì¦ê²¨ì°¾ê¸°ë¡œ 추가"
+
+#: editor/filesystem_dock.cpp
+msgid "Remove from favorites"
+msgstr "ì¦ê²¨ì°¾ê¸°ì—서 ì‚­ì œ"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "ì¢…ì† ê´€ê³„ 편집..."
@@ -2996,19 +3016,33 @@ msgstr "ì¢…ì† ê´€ê³„ 편집..."
msgid "View Owners..."
msgstr "ì†Œìœ ìž ë³´ê¸°..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "ì´ë¦„ 변경..."
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "복제..."
#: editor/filesystem_dock.cpp
-#, fuzzy
+msgid "Move To..."
+msgstr "ì´ë™..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
-msgstr "새 스í¬ë¦½íЏ"
+msgstr "새 스í¬ë¦½íЏ..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "리소스를 다른 ì´ë¦„으로 저장..."
+msgstr "새 리소스..."
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr "ëª¨ë‘ í™•ìž¥"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr "ëª¨ë‘ ì ‘ê¸°"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3030,29 +3064,18 @@ msgid "Re-Scan Filesystem"
msgstr "íŒŒì¼ ì‹œìŠ¤í…œ 재검사"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "ì¦ê²¨ì°¾ê¸°ë¡œ 설정 토글"
+msgid "Toggle split mode"
+msgstr "분할 모드 토글"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Show current scene file."
-msgstr "현재 íŽ¸ì§‘ëœ ì„œë¸Œ íƒ€ì¼ ì„ íƒ."
+msgid "Search files"
+msgstr "íŒŒì¼ ê²€ìƒ‰"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr "ì„ íƒëœ ì”¬ì„ ì„ íƒëœ ë…¸ë“œì˜ ìžì‹ìœ¼ë¡œ ì¸ìŠ¤í„´ìŠ¤ 합니다."
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "í´ëž˜ìФ 검색"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3060,50 +3083,36 @@ msgstr ""
"íŒŒì¼ ìŠ¤ìº”ì¤‘,\n"
"잠시만 기다려주세요..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "ì´ë™"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "There is already file or folder with the same name in this location."
-msgstr "ì´ë¯¸ ì§€ì •ëœ ì´ë¦„ì˜ ê²½ë¡œë¥¼ 가진 í´ë”입니다."
+msgstr "ê°™ì€ ì´ë¦„ì˜ íŒŒì¼ì´ë‚˜ í´ë”ê°€ ì´ë¯¸ 존재합니다."
#: editor/filesystem_dock.cpp
msgid "Overwrite"
-msgstr ""
+msgstr "ë®ì–´ 쓰기"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "스í¬ë¦½íЏ 만들기"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find in files"
-msgstr "íƒ€ì¼ ì°¾ê¸°"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find: "
-msgstr "찾기"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Whole words"
-msgstr "전체 단어"
+msgid "Find in Files"
+msgstr "파ì¼ì—서 찾기"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "ëŒ€ì†Œë¬¸ìž êµ¬ë¶„"
+msgid "Find:"
+msgstr "찾기:"
#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "í´ë”:"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Filter: "
+msgid "Filters:"
msgstr "í•„í„°:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -3120,52 +3129,48 @@ msgid "Cancel"
msgstr "취소"
#: editor/find_in_files.cpp
-#, fuzzy
+msgid "Find: "
+msgstr "찾기: "
+
+#: editor/find_in_files.cpp
msgid "Replace: "
-msgstr "바꾸기"
+msgstr "바꾸기: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace all (no undo)"
-msgstr "전체 바꾸기"
+msgstr "ì „ì²´ 바꾸기 (취소할 수 ì—†ìŒ)"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Searching..."
-msgstr "저장 중..."
+msgstr "검색 중..."
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Search complete"
-msgstr "ë¬¸ìž ê²€ìƒ‰"
+msgstr "검색 완료"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group name already exists."
-msgstr "ì—러: 애니메ì´ì…˜ ì´ë¦„ì´ ì´ë¯¸ 존재합니다!"
+msgstr "그룹 ì´ë¦„ì´ ì´ë¯¸ 존재합니다."
#: editor/groups_editor.cpp
-#, fuzzy
-msgid "invalid Group name."
-msgstr "유효하지 ì•Šì€ ì´ë¦„."
+msgid "Invalid group name."
+msgstr "그룹 ì´ë¦„ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤."
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
-msgstr "그룹"
+msgstr "그룹(Groups)"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes not in Group"
-msgstr "노트 그룹"
+msgstr "ê·¸ë£¹ì— ìžˆì§€ ì•Šì€ ë…¸ë“œ"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
msgid "Filter nodes"
msgstr "노드 필터"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes in Group"
-msgstr "노트 그룹"
+msgstr "ê·¸ë£¹ì— ìžˆëŠ” 노드"
#: editor/groups_editor.cpp
msgid "Add to Group"
@@ -3173,12 +3178,11 @@ msgstr "ê·¸ë£¹ì— ì¶”ê°€"
#: editor/groups_editor.cpp
msgid "Remove from Group"
-msgstr "그룹ì—서 제거"
+msgstr "그룹ì—서 ì‚­ì œ"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Manage Groups"
-msgstr "ì´ë¯¸ì§€ 그룹"
+msgstr "그룹 관리"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Single Scene"
@@ -3239,16 +3243,16 @@ msgstr "메시를 위해 ìƒì„± 중: "
#: editor/import/resource_importer_scene.cpp
msgid "Running Custom Script..."
-msgstr "ì‚¬ìš©ìž ì •ì˜ ìŠ¤í¬ë¦½íЏ 실행중..."
+msgstr "커스텀 스í¬ë¦½íЏ 실행 중..."
#: editor/import/resource_importer_scene.cpp
msgid "Couldn't load post-import script:"
-msgstr "가져오기 후 실행할 스í¬ë¦½íŠ¸ë¥¼ 로드할 수 없습니다:"
+msgstr "가져오기 후 실행할 스í¬ë¦½íŠ¸ë¥¼ 불러올 수 없습니다:"
#: editor/import/resource_importer_scene.cpp
msgid "Invalid/broken script for post-import (check console):"
msgstr ""
-"가져오기 후 실행할 스í¬ë¦½íŠ¸ê°€ 유효하지 않거나 깨져있습니다 (콘솔 확ì¸):"
+"가져오기 후 실행할 스í¬ë¦½íŠ¸ê°€ 유효하지 않거나 깨져 있습니다 (콘솔 확ì¸):"
#: editor/import/resource_importer_scene.cpp
msgid "Error running post-import script:"
@@ -3284,19 +3288,14 @@ msgstr "다시 가져오기"
#: editor/inspector_dock.cpp
msgid "Failed to load resource."
-msgstr "리소스 로드 실패."
-
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "확ì¸"
+msgstr "리소스 불러오기 실패."
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr "모든 ì†ì„± 펼치기"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+msgid "Collapse All Properties"
msgstr "모든 ì†ì„± 접기"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3313,9 +3312,8 @@ msgid "Paste Params"
msgstr "ì†ì„± 붙여넣기"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Edit Resource Clipboard"
-msgstr "리소스 í´ë¦½ë³´ë“œê°€ 비었습니다!"
+msgstr "리소스 í´ë¦½ë³´ë“œ 편집"
#: editor/inspector_dock.cpp
msgid "Copy Resource"
@@ -3339,15 +3337,19 @@ msgstr "새로운 리소스를 ë©”ëª¨ë¦¬ì— ë§Œë“¤ê³  편집합니다."
#: editor/inspector_dock.cpp
msgid "Load an existing resource from disk and edit it."
-msgstr "디스í¬ì—서 기존 리소스를 로드하여 편집합니다."
+msgstr "디스í¬ì—서 기존 리소스를 불러와 편집합니다."
+
+#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "현재 íŽ¸ì§‘ëœ ë¦¬ì†ŒìŠ¤ 저장."
#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
-msgstr "ížˆìŠ¤í† ë¦¬ìƒ ì´ì „ì— íŽ¸ì§‘í•œ 오브ì íŠ¸ë¡œ 가기."
+msgstr "기ë¡ì—서 ì´ì „ 편집한 대ìƒìœ¼ë¡œ 가기."
#: editor/inspector_dock.cpp
msgid "Go to the next edited object in history."
-msgstr "ížˆìŠ¤í† ë¦¬ìƒ ë‹¤ìŒì— 편집한 오브ì íŠ¸ë¡œ 가기."
+msgstr "기ë¡ì—서 ë‹¤ìŒ íŽ¸ì§‘í•œ 대ìƒìœ¼ë¡œ 가기."
#: editor/inspector_dock.cpp
msgid "History of recently edited objects."
@@ -3358,9 +3360,8 @@ msgid "Object properties."
msgstr "오브ì íЏ ì†ì„±."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Filter properties"
-msgstr "노드 필터"
+msgstr "í•„í„° ì†ì„±"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
@@ -3375,47 +3376,40 @@ msgid "Select a Node to edit Signals and Groups."
msgstr "시그ë„ê³¼ ê·¸ë£¹ì„ íŽ¸ì§‘í•  노드를 ì„ íƒí•˜ì„¸ìš”."
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Edit a Plugin"
-msgstr "í´ë¦¬ê³¤ 편집"
+msgstr "í”ŒëŸ¬ê·¸ì¸ íŽ¸ì§‘"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Create a Plugin"
-msgstr "C# 솔루션 만들기"
+msgstr "í”ŒëŸ¬ê·¸ì¸ ë§Œë“¤ê¸°"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Plugin Name:"
-msgstr "í”ŒëŸ¬ê·¸ì¸ ëª©ë¡:"
+msgstr "í”ŒëŸ¬ê·¸ì¸ ì´ë¦„:"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
-msgstr ""
+msgstr "하위 í´ë”:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Language:"
-msgstr "언어"
+msgstr "언어:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Script Name:"
-msgstr "유효한 스í¬ë¦½íЏ"
+msgstr "스í¬ë¦½íЏ ì´ë¦„:"
#: editor/plugin_config_dialog.cpp
msgid "Activate now?"
-msgstr ""
+msgstr "지금 실행하시겠습니까?"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
-msgstr "í´ë¦¬ê³¤ ìƒì„±"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
+msgstr "í´ë¦¬ê³¤ 만들기"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+msgid "Edit Polygon"
msgstr "í´ë¦¬ê³¤ 편집"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3423,34 +3417,33 @@ msgid "Insert Point"
msgstr "í¬ì¸íЏ 삽입"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
-msgstr "í´ë¦¬ê³¤ 편집 (ì  ì‚­ì œ)"
+msgid "Edit Polygon (Remove Point)"
+msgstr "í´ë¦¬ê³¤ 편집 (í¬ì¸íЏ ì‚­ì œ)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+msgid "Remove Polygon And Point"
msgstr "í´ë¦¬ê³¤ê³¼ í¬ì¸íЏ ì‚­ì œ"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "처ìŒë¶€í„° 새로운 í´ë¦¬ê³¤ 만들기"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr "í¬ì¸íЏ 만들기."
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
-"기존 í´ë¦¬ê³¤ 편집:\n"
-"좌í´ë¦­: í¬ì¸íЏ ì´ë™.\n"
-"컨트롤+좌í´ë¦­: 세그먼트 나누기.\n"
-"ìš°í´ë¦­: í¬ì¸íЏ 지우기."
+"í¬ì¸íЏ 편집.\n"
+"좌í´ë¦­: í¬ì¸íЏ ì´ë™\n"
+"ìš°í´ë¦­: í¬ì¸íЏ 지우기"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
-msgstr "í¬ì¸íЏ ì‚­ì œ"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr "í¬ì¸íЏ 지우기."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3464,15 +3457,14 @@ msgstr "애니메ì´ì…˜ 추가하기"
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Load.."
-msgstr "로드"
+msgid "Load..."
+msgstr "불러오기..."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "This type of node can't be used. Only root nodes are allowed."
-msgstr ""
+msgstr "ì´ íƒ€ìž…ì˜ ë…¸ë“œë¥¼ 사용할 수 없습니다. ì˜¤ì§ ë£¨íŠ¸ 노드만 사용 가능합니다."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3482,73 +3474,65 @@ msgid ""
"AnimationTree is inactive.\n"
"Activate to enable playback, check node warnings if activation fails."
msgstr ""
+"AnimationTree ê°€ 비활성 ìƒíƒœíž™ë‹ˆë‹¤.\n"
+"ìƒíƒœë¥¼ 활성화하면 재ìƒí•  수 있습니다, í™œì„±í™”ì— ì‹¤íŒ¨í•˜ë©´ ë…¸ë“œì— ê²½ê³ ê°€ 있는지 "
+"확ì¸í•˜ì„¸ìš”."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Set the blending position within the space"
-msgstr ""
+msgstr "공간 ë‚´ì˜ í˜¼í•© 위치 설정"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Select and move points, create points with RMB."
-msgstr ""
+msgstr "í¬ì¸íŠ¸ë¥¼ ì„ íƒí•˜ê³  ì´ë™í•©ë‹ˆë‹¤, ìš°í´ë¦­ìœ¼ë¡œ í¬ì¸íŠ¸ë¥¼ 만드실 수 있습니다."
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "í¬ì¸íЏ ì‚­ì œ"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "ìš°í´ë¦­: í¬ì¸íЏ ì‚­ì œ."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr "ìŠ¤ëƒ…ì„ í™œì„±í™” 하고 격ìžë¥¼ ë³´ì´ê¸°."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Point"
-msgstr "í¬ì¸íЏ ì´ë™"
+msgstr "í¬ì¸íЏ"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Open Animation Node"
-msgstr "애니메ì´ì…˜ 노드"
+msgstr "애니메ì´ì…˜ 노드 열기"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists"
-msgstr "'%s' ì•¡ì…˜ì´ ì´ë¯¸ 존재합니다!"
+msgstr "삼ê°í˜•ì´ ì´ë¯¸ 존재함"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "BlendSpace2D does not belong to an AnimationTree node."
-msgstr ""
+msgstr "BlendSpace2Dê°€ AnimationTree ë…¸ë“œì— ì†í•´ìžˆì§€ 않습니다."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "No triangles exist, so no blending can take place."
-msgstr ""
+msgstr "삼ê°í˜•ì´ ì¡´ìž¬í•˜ì§€ 않습니다, ë¸”ëžœë”©ì´ ì¼ì–´ë‚˜ì§€ 않습니다."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create triangles by connecting points."
-msgstr ""
+msgstr "í¬ì¸íŠ¸ë¥¼ 연결하여 삼ê°í˜• 만들기."
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Erase points and triangles."
-msgstr "%dê°œ 삼ê°í˜• ë¶„ì„ ì¤‘:"
+msgstr "í¬ì¸íŠ¸ì™€ 삼ê°í˜• 지우기."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Generate blend triangles automatically (instead of manually)"
-msgstr ""
+msgstr "(ìˆ˜ë™ ëŒ€ì‹ ) ìžë™ìœ¼ë¡œ 블렌드 삼ê°í˜• 만들기"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr "스냅"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "블렌드:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3557,20 +3541,21 @@ msgstr "필터 편집"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Output node can't be added to the blend tree."
-msgstr ""
+msgstr "출력 노드를 블렌드 íŠ¸ë¦¬ì— ì¶”ê°€í•  수 없습니다."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Unable to connect, port may be in use or connection may be invalid."
-msgstr ""
+msgstr "ì—°ê²°í•  수 없습니다, í¬íŠ¸ê°€ 사용 중ì´ê±°ë‚˜ 유효하지 않는 연결입니다."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
-msgstr ""
+msgstr "설정한 애니메ì´ì…˜ 플레ì´ì–´ê°€ 없습니다, 트랙 ì´ë¦„ì„ ê²€ìƒ‰í•  수 없습니다."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Player path set is invalid, so unable to retrieve track names."
msgstr ""
+"유효하지 않는 플레ì´ì–´ 경로 설정입니다, 트랙 ì´ë¦„ì„ ê²€ìƒ‰í•  수 없습니다."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
@@ -3578,23 +3563,22 @@ msgid ""
"Animation player has no valid root node path, so unable to retrieve track "
"names."
msgstr ""
+"애니메ì´ì…˜ 플레ì´ì–´ê°€ 유효한 루트 노드 경로를 가지고 있지 않습니다, 트랙 ì´ë¦„"
+"ì„ ê²€ìƒ‰í•  수 없습니다."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Add Node.."
-msgstr "노드 추가"
+msgid "Add Node..."
+msgstr "노드 추가하기..."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filtered Tracks:"
-msgstr "필터 편집"
+msgstr "필터 트랙 편집:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Enable filtering"
-msgstr "ìžì‹ë…¸ë“œ 편집 가능"
+msgstr "필터 활성화"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
@@ -3619,17 +3603,15 @@ msgstr "애니메ì´ì…˜ì„ 삭제하시겠습니까?"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Remove Animation"
-msgstr "애니메ì´ì…˜ 제거"
+msgstr "애니메ì´ì…˜ ì‚­ì œ"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Invalid animation name!"
-msgstr "ì—러: 유효하지 ì•Šì€ ì• ë‹ˆë©”ì´ì…˜ ì´ë¦„!"
+msgstr "유효하지 ì•Šì€ ì• ë‹ˆë©”ì´ì…˜ ì´ë¦„!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Animation name already exists!"
-msgstr "ì—러: 애니메ì´ì…˜ ì´ë¦„ì´ ì´ë¯¸ 존재합니다!"
+msgstr "애니메ì´ì…˜ ì´ë¦„ì´ ì´ë¯¸ 존재합니다!"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -3646,21 +3628,19 @@ msgstr "블렌드 시간 변경"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Load Animation"
-msgstr "애니메ì´ì…˜ 로드하기"
+msgstr "애니메ì´ì…˜ 불러오기"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Duplicate Animation"
msgstr "애니메ì´ì…˜ 복제하기"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to copy!"
-msgstr "ì—러: 복사할 애니메ì´ì…˜ì´ 없습니다!"
+msgstr "복사할 애니메ì´ì…˜ì´ 없습니다!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation resource on clipboard!"
-msgstr "ì—러: í´ë¦½ë³´ë“œì— 애니메ì´ì…˜ 리소스가 없습니다!"
+msgstr "í´ë¦½ë³´ë“œì— 애니메ì´ì…˜ 리소스가 없습니다!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
@@ -3671,9 +3651,8 @@ msgid "Paste Animation"
msgstr "애니메ì´ì…˜ 붙여넣기"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to edit!"
-msgstr "ì—러: 편집할 애니메ì´ì…˜ì´ 없습니다!"
+msgstr "편집할 애니메ì´ì…˜ì´ 없습니다!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
@@ -3681,7 +3660,7 @@ msgstr "ì„ íƒëœ 애니메ì´ì…˜ì„ 현재 위치ì—서 거꾸로 재ìƒ. (A)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from end. (Shift+A)"
-msgstr "ì„ íƒëœ 애니메ì´ì…˜ì„ ëì—서 거꾸로 재ìƒ. (시프트+A)"
+msgstr "ì„ íƒëœ 애니메ì´ì…˜ì„ ëì—서 거꾸로 재ìƒ. (Shift+A)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Stop animation playback. (S)"
@@ -3689,7 +3668,7 @@ msgstr "애니메ì´ì…˜ ìž¬ìƒ ì •ì§€. (S)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation from start. (Shift+D)"
-msgstr "ì„ íƒëœ 애니메ì´ì…˜ì„ 처ìŒë¶€í„° 재ìƒ. (시프트+D)"
+msgstr "ì„ íƒëœ 애니메ì´ì…˜ì„ 처ìŒë¶€í„° 재ìƒ. (Shift+D)"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation from current pos. (D)"
@@ -3717,14 +3696,12 @@ msgid "New"
msgstr "새 파ì¼"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Transitions..."
-msgstr "연결 편집..."
+msgstr "전환 편집..."
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Open in Inspector"
-msgstr "ì—디터ì—서 열기"
+msgstr "ì¸ìŠ¤íŽ™í„°ì—서 열기"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Display list of animations in player."
@@ -3732,7 +3709,7 @@ msgstr "애니메ì´ì…˜ ëª©ë¡ í‘œì‹œ."
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Autoplay on Load"
-msgstr "로드 시 ìžë™ 플레ì´"
+msgstr "불러올 시 ìžë™ 재ìƒ"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Onion Skinning"
@@ -3783,9 +3760,8 @@ msgid "Include Gizmos (3D)"
msgstr "기즈모 í¬í•¨ (3D)"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Pin AnimationPlayer"
-msgstr "애니메ì´ì…˜ 붙여넣기"
+msgstr "AnimationPlayer 고정하기"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Create New Animation"
@@ -3816,34 +3792,32 @@ msgid "Cross-Animation Blend Times"
msgstr "êµì°¨-애니메ì´ì…˜ 블렌드 시간"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "End"
-msgstr "ë(ì´ˆ)"
+msgstr "ë"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Immediate"
-msgstr ""
+msgstr "즉시"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Sync"
-msgstr ""
+msgstr "ë™ê¸°í™”"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "At End"
-msgstr ""
+msgstr "ëì—서"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Travel"
-msgstr ""
+msgstr "ì´ë™"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Start and end nodes are needed for a sub-transition."
-msgstr ""
+msgstr "하위 ì „í™˜ì— ì‹œìž‘ê³¼ ë 노드가 필요합니다."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "No playback resource set at path: %s."
-msgstr "리소스 경로가 아닙니다."
+msgstr "ê²½ë¡œì— ì„¤ì •ëœ ìž¬ìƒ ë¦¬ì†ŒìŠ¤ ì„¤ì •ì´ ì—†ìŠµë‹ˆë‹¤: %s."
#: editor/plugins/animation_state_machine_editor.cpp
msgid ""
@@ -3851,34 +3825,35 @@ msgid ""
"RMB to add new nodes.\n"
"Shift+LMB to create connections."
msgstr ""
+"노드를 ì„ íƒí•˜ê³  ì´ë™í•˜ì‹­ì‹œì˜¤.\n"
+"ìš°í´ë¦­ìœ¼ë¡œ 새 노드를 추가합니다.\n"
+"Shift+좌í´ë¦­ìœ¼ë¡œ ì—°ê²°ì„ ë§Œë“­ë‹ˆë‹¤."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "새 %s ìƒì„±"
+msgstr "새 노드 만들기."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Connect nodes."
-msgstr "노드 연결"
+msgstr "노드 연결."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Remove selected node or transition"
-msgstr "ì„ íƒëœ 트랙 ì‚­ì œ."
+msgid "Remove selected node or transition."
+msgstr "ì„ íƒëœ 노드나 전환 삭제하기."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
msgstr ""
+"ì´ ì• ë‹ˆë©”ì´ì…˜ì´ 시작, 재시작, 아니면 0으로 ê°ˆ 때 ìžë™ìœ¼ë¡œ 시작할 지를 키거나 "
+"ë•니다."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set the end animation. This is useful for sub-transitions."
-msgstr ""
+msgstr "ë 애니메ì´ì…˜ì„ 설정합니다. ì´ê²ƒì€ 하위 ì „í™˜ì— ìœ ìš©í•©ë‹ˆë‹¤."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "전환"
+msgstr "전환: "
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3932,10 +3907,6 @@ msgid "Amount:"
msgstr "ì–‘:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "블렌드:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "블렌드 0:"
@@ -3957,7 +3928,7 @@ msgstr "입력 추가"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Clear Auto-Advance"
-msgstr "ìžë™ ì§„í–‰ 제거"
+msgstr "ìžë™ ì§„í–‰ ì‚­ì œ"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Set Auto-Advance"
@@ -4076,14 +4047,12 @@ msgid "Asset Download Error:"
msgstr "ì—ì…‹ 다운로드 ì—러:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading (%s / %s)..."
-msgstr "다운로드 중"
+msgstr "다운로드 중 (%s / %s)..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading..."
-msgstr "다운로드 중"
+msgstr "다운로드 중..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Resolving..."
@@ -4110,14 +4079,12 @@ msgid "Download for this asset is already in progress!"
msgstr "ì´ ì—ì…‹ì˜ ë‹¤ìš´ë¡œë“œê°€ ì´ë¯¸ 진행중입니다!"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "First"
-msgstr "처ìŒ"
+msgstr "처ìŒìœ¼ë¡œ"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Previous"
-msgstr "ì´ì „ 탭"
+msgstr "ì´ì „"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Next"
@@ -4125,7 +4092,7 @@ msgstr "다ìŒ"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Last"
-msgstr ""
+msgstr "마지막으로"
#: editor/plugins/asset_library_editor_plugin.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -4137,7 +4104,7 @@ msgstr "모ë‘"
msgid "Plugins"
msgstr "플러그ì¸"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "ì •ë ¬:"
@@ -4207,11 +4174,11 @@ msgstr "스냅 설정"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Grid Offset:"
-msgstr "그리드 오프셋:"
+msgstr "ê²©ìž ì˜¤í”„ì…‹:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Grid Step:"
-msgstr "그리드 스í…:"
+msgstr "ê²©ìž ìŠ¤í…:"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation Offset:"
@@ -4231,7 +4198,7 @@ msgstr "새로운 세로 ê°€ì´ë“œ 만들기"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Remove vertical guide"
-msgstr "세로 ê°€ì´ë“œ 제거"
+msgstr "세로 ê°€ì´ë“œ ì‚­ì œ"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move horizontal guide"
@@ -4243,36 +4210,35 @@ msgstr "새로운 가로 ê°€ì´ë“œ 만들기"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Remove horizontal guide"
-msgstr "가로 ê°€ì´ë“œ 제거"
+msgstr "가로 ê°€ì´ë“œ ì‚­ì œ"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create new horizontal and vertical guides"
msgstr "새 가로 세로 ê°€ì´ë“œ 만들기"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move pivot"
msgstr "피벗 ì´ë™"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Rotate CanvasItem"
-msgstr "CanvasItem 편집"
+msgstr "CanvasItem 회전"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move anchor"
-msgstr "ì´ë™ ì•¡ì…˜"
+msgstr "앵커 ì´ë™"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Resize CanvasItem"
-msgstr "CanvasItem 편집"
+msgstr "CanvasItem í¬ê¸° ì¡°ì ˆ"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr "CanvasItem 규모"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move CanvasItem"
-msgstr "CanvasItem 편집"
+msgstr "CanvasItem ì´ë™"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -4291,19 +4257,16 @@ msgid "Paste Pose"
msgstr "í¬ì¦ˆ 붙여넣기"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "축소"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom reset"
-msgstr "확대 초기화"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr "경고: 컨테ì´ë„ˆì˜ ìžì‹ì€ ë¶€ëª¨ì— ì˜í•´ ê²°ì •ëœ ìœ„ì¹˜ì™€ 규모를 갖습니다."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "확대"
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
+msgstr "배율 초기화"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
@@ -4319,7 +4282,7 @@ msgstr "알트+드래그: ì´ë™"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
-msgstr "'v'키로 피벗 변경, '시프트+v'키로 피벗 드래그 (ì´ë™í•˜ëŠ” ë™ì•ˆ)."
+msgstr "'v'키로 피벗 변경, 'Shift+v'키로 피벗 드래그 (ì´ë™í•˜ëŠ” ë™ì•ˆ)."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Alt+RMB: Depth list selection"
@@ -4334,6 +4297,10 @@ msgid "Rotate Mode"
msgstr "회전 모드"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr "규모 모드"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4351,22 +4318,20 @@ msgid "Pan Mode"
msgstr "팬 모드"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle snapping."
-msgstr "스냅 토글"
+msgstr "스냅 토글."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Snap"
msgstr "스냅 사용"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snapping Options"
msgstr "스냅 옵션"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to grid"
-msgstr "ê·¸ë¦¬ë“œì— ìŠ¤ëƒ…"
+msgstr "격ìžì— 스냅"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Rotation Snap"
@@ -4402,9 +4367,8 @@ msgid "Snap to node sides"
msgstr "노드 ì˜†ì— ìŠ¤ëƒ…"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to node center"
-msgstr "노드 ì•µì»¤ì— ìŠ¤ëƒ…"
+msgstr "노드 ì¤‘ì‹¬ì— ìŠ¤ëƒ…"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to other nodes"
@@ -4433,6 +4397,10 @@ msgid "Restores the object's children's ability to be selected."
msgstr "오브ì íŠ¸ì˜ ìžì‹ë…¸ë“œê°€ ì„ íƒë  수 있ë„ë¡ ë³µì›í•©ë‹ˆë‹¤."
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr "스켈레톤 설정"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "뼈대 보기"
@@ -4446,12 +4414,11 @@ msgstr "IK ì²´ì¸ ì§€ìš°ê¸°"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make Custom Bone(s) from Node(s)"
-msgstr ""
+msgstr "노드ì—서 커스텀 본 만들기"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Custom Bones"
-msgstr "Bones 지우기"
+msgstr "커스텀 본 지우기"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -4461,7 +4428,7 @@ msgstr "보기"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Show Grid"
-msgstr "그리드 보기"
+msgstr "ê²©ìž ë³´ê¸°"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Helpers"
@@ -4484,6 +4451,10 @@ msgid "Show Viewport"
msgstr "ë·°í¬íЏ 보기"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr "그룹과 잠금 ì•„ì´ì½˜ ë³´ì´ê¸°"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr "ì„ íƒ í•­ëª© 화면 ì¤‘ì•™ì— í‘œì‹œ"
@@ -4496,9 +4467,8 @@ msgid "Layout"
msgstr "ë ˆì´ì•„웃"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Insert keys."
-msgstr "키 삽입"
+msgstr "키 삽입."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
@@ -4514,11 +4484,11 @@ msgstr "í¬ì¦ˆ 정리"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Multiply grid step by 2"
-msgstr "그리드 단계를 2ë°° ì¦ê°€"
+msgstr "ê²©ìž ë‹¨ê³„ë¥¼ 2ë°° ì¦ê°€"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Divide grid step by 2"
-msgstr "그리드 단계를 반으로 ê°ì†Œ"
+msgstr "ê²©ìž ë‹¨ê³„ë¥¼ 반으로 ê°ì†Œ"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Add %s"
@@ -4535,7 +4505,7 @@ msgstr "루트 ë…¸ë“œì—†ì´ ì—¬ëŸ¬ê°œì˜ ë…¸ë“œë¥¼ ìƒì„±í•  수 없습니다."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Create Node"
-msgstr "노드 ìƒì„±"
+msgstr "노드 만들기"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
@@ -4551,21 +4521,28 @@ msgid ""
"Drag & drop + Shift : Add node as sibling\n"
"Drag & drop + Alt : Change node type"
msgstr ""
-"드래그 & ë“œëž + 시프트 : 형제 노드로 추가\n"
-"드래그 & ë“œëž + 알트 : 노드 타입 변경"
+"드래그 & 드롭 + Shift : 형제 노드로 추가\n"
+"드래그 & 드롭 + Alt : 노드 타입 변경"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
+msgid "Create Polygon3D"
msgstr "í´ë¦¬ê³¤3D 만들기"
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "í´ë¦¬ê³¤ 편집"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "í´ë¦¬ê³¤ 편집 (ì  ì‚­ì œ)"
+
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
msgstr "핸들 설정"
#: editor/plugins/cpu_particles_editor_plugin.cpp
-#, fuzzy
msgid "CPUParticles"
-msgstr "파티í´"
+msgstr "CPU파티í´"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
@@ -4607,7 +4584,7 @@ msgstr "커브 탄젠트 수정"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Load Curve Preset"
-msgstr "커브 프리셋 로드"
+msgstr "커브 프리셋 불러오기"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Add point"
@@ -4615,7 +4592,7 @@ msgstr "í¬ì¸íЏ 추가"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Remove point"
-msgstr "í¬ì¸íЏ 제거"
+msgstr "í¬ì¸íЏ ì‚­ì œ"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Left linear"
@@ -4627,7 +4604,7 @@ msgstr "오른쪽 선형"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Load preset"
-msgstr "프리셋 로드"
+msgstr "프리셋 불러오기"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Remove Curve Point"
@@ -4639,7 +4616,7 @@ msgstr "커브 선형 탄젠트 토글"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Hold Shift to edit tangents individually"
-msgstr "시프트키를 누르고 있으면 탄젠트를 개별ì ìœ¼ë¡œ 편집 가능"
+msgstr "Shift키를 누르고 있으면 탄젠트를 개별ì ìœ¼ë¡œ 편집 가능"
#: editor/plugins/gi_probe_editor_plugin.cpp
msgid "Bake GI Probe"
@@ -4658,37 +4635,9 @@ msgid "Item List Editor"
msgstr "항목 ëª©ë¡ ì—디터"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"ì´ ë…¸ë“œì— OccluderPolygon2D 리소스가 없습니다.\n"
-"새로 만들어서 지정하시겠습니까?"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr "Occluder í´ë¦¬ê³¤ 만들기"
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr "처ìŒë¶€í„° 새로운 í´ë¦¬ê³¤ 만들기."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "기존 í´ë¦¬ê³¤ 편집:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "좌í´ë¦­: í¬ì¸íЏ ì´ë™."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr "컨트롤+좌í´ë¦­: 세그먼트 ë¶„í• ."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "ìš°í´ë¦­: í¬ì¸íЏ ì‚­ì œ."
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr "메쉬가 비었습니다!"
@@ -4873,11 +4822,11 @@ msgstr "ëŒ€ìƒ ì„œí”¼ìŠ¤ ì„ íƒ:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Populate Surface"
-msgstr "서피스 ìƒì„±"
+msgstr "서피스 만들기"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Populate MultiMesh"
-msgstr "MultiMesh ìƒì„±"
+msgstr "MultiMesh 만들기"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Target Surface:"
@@ -4917,16 +4866,16 @@ msgstr "ìž„ì˜ í¬ê¸°:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Populate"
-msgstr "ìƒì„±"
+msgstr "만들기"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr "네비게ì´ì…˜ í´ë¦¬ê³¤ 만들기"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr "AABB ìƒì„± 중"
+msgid "Generating Visibility Rect"
+msgstr "가시성 ì§ì‚¬ê°í˜• 만들기"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -4934,7 +4883,7 @@ msgstr "ì˜¤ì§ ParticlesMaterial 프로세스 메테리얼 ì•ˆì˜ í¬ì¸íŠ¸ë§Œ ì
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Error loading image:"
-msgstr "ì´ë¯¸ì§€ 로드 ì—러:"
+msgstr "ì´ë¯¸ì§€ 불러오기 ì—러:"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "No pixels with transparency > 128 in image..."
@@ -4942,11 +4891,11 @@ msgstr "ì´ë¯¸ì§€ì— 투명ë„ê°€ 128보다 í° í”½ì…€ì´ ì—†ìŠµë‹ˆë‹¤..."
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Generate Visibility Rect"
-msgstr "Visibility Rect를 ìƒì„±"
+msgstr "가시성 ì§ì‚¬ê°í˜•ì„ ë§Œë“¤ê¸°"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
-msgstr "ì—미션 ë§ˆìŠ¤í¬ ë¡œë“œ"
+msgstr "ì—미션 ë§ˆìŠ¤í¬ ë¶ˆëŸ¬ì˜¤ê¸°"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Clear Emission Mask"
@@ -4954,8 +4903,13 @@ msgstr "ì—미션 ë§ˆìŠ¤í¬ ì •ë¦¬"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr "CPU파티í´ë¡œ 변환"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
-msgstr "파티í´"
+msgstr "파티í´(Particles)"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Generated Point Count:"
@@ -5023,17 +4977,16 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr "'ParticlesMaterial' íƒ€ìž…ì˜ í”„ë¡œì„¸ì„œ ë¨¸í„°ë¦¬ì–¼ì´ í•„ìš”í•©ë‹ˆë‹¤."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
-msgstr "AABB ìƒì„±"
+msgid "Generating AABB"
+msgstr "AABB ìƒì„± 중"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "대문ìžë¡œ 변환"
+msgid "Generate AABB"
+msgstr "AABB 만들기"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
-msgstr "가시성 AABB ìƒì„±"
+msgstr "가시성 AABB 만들기"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Remove Point from Curve"
@@ -5053,6 +5006,10 @@ msgid "Add Point to Curve"
msgstr "ì»¤ë¸Œì— í¬ì¸íЏ 추가"
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr "커브 나누기"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr "ì»¤ë¸Œì˜ í¬ì¸íЏ ì´ë™"
@@ -5072,7 +5029,7 @@ msgstr "í¬ì¸íЏ ì„ íƒ"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Shift+Drag: Select Control Points"
-msgstr "시프트+드래그: 컨트롤 í¬ì¸íЏ ì„ íƒ"
+msgstr "Shift+드래그: 컨트롤 í¬ì¸íЏ ì„ íƒ"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
@@ -5080,13 +5037,17 @@ msgid "Click: Add Point"
msgstr "í´ë¦­: í¬ì¸íЏ 추가"
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr "선분 나누기 (커브로)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr "ìš°í´ë¦­: í¬ì¸íЏ ì‚­ì œ"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Select Control Points (Shift+Drag)"
-msgstr "컨트롤 í¬ì¸íЏ ì„ íƒ (시프트+드래그)"
+msgstr "컨트롤 í¬ì¸íЏ ì„ íƒ (Shift+드래그)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
@@ -5095,11 +5056,6 @@ msgstr "í¬ì¸íЏ 추가 (빈 공간)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr "세그먼트 분할 (커브)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "í¬ì¸íЏ ì‚­ì œ"
@@ -5117,12 +5073,12 @@ msgstr "옵션"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Angles"
-msgstr ""
+msgstr "핸들 ê°ë„ 거울"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Lengths"
-msgstr ""
+msgstr "핸들 ê¸¸ì´ ê±°ìš¸"
#: editor/plugins/path_editor_plugin.cpp
msgid "Curve Point #"
@@ -5156,65 +5112,78 @@ msgstr "아웃-컨트롤 í¬ì¸íЏ ì‚­ì œ"
msgid "Remove In-Control Point"
msgstr "ì¸-컨트롤 í¬ì¸íЏ ì‚­ì œ"
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "선분 분할 (커브)"
+
#: editor/plugins/physical_bone_plugin.cpp
-#, fuzzy
msgid "Move joint"
-msgstr "í¬ì¸íЏ ì´ë™"
+msgstr "관절 ì´ë™"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
-msgstr ""
+msgstr "Polygon2Dì˜ ìŠ¤ì¼ˆë ˆí†¤ ì†ì„±ì´ Skeleton2D 노드를 향하고 있지 않ìŒ"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Sync bones"
-msgstr "뼈대 보기"
+msgid "Sync Bones"
+msgstr "본 ë™ê¸°í™”"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+"ì´ í´ë¦¬ê³¤ì— í…스ì³ê°€ 없습니다.\n"
+"UV를 편집하기 위해 í…스ì³ë¥¼ 설정해야 합니다."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr "UV 맵 만들기"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon & UV"
-msgstr "í´ë¦¬ê³¤ ìƒì„±"
+msgstr "í´ë¦¬ê³¤ & UV 만들기"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "새로운 가로 ê°€ì´ë“œ 만들기"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "'%s' ì•¡ì…˜ì´ ì´ë¯¸ 존재합니다!"
+msgid "Remove Internal Vertex"
+msgstr "ì¸-컨트롤 í¬ì¸íЏ ì‚­ì œ"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Add Split"
-msgstr "í¬ì¸íЏ 추가"
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "경로가 유효하지 않습니다!"
+msgid "Add Custom Polygon"
+msgstr "í´ë¦¬ê³¤ 편집"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "í¬ì¸íЏ 제거"
+msgid "Remove Custom Polygon"
+msgstr "ì¶©ëŒ í´ë¦¬ê³¤ ì‚­ì œ"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr "UV 맵 변형"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
-msgstr ""
+msgid "Transform Polygon"
+msgstr "변형 í´ë¦¬ê³¤"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
+msgstr "본 무게 페ì¸íЏ"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Open Polygon 2D UV editor."
+msgstr "í´ë¦¬ê³¤ 2D UV ì—디터 열기."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
@@ -5222,43 +5191,37 @@ msgstr "í´ë¦¬ê³¤ 2D UV ì—디터"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "UV"
-msgstr ""
+msgstr "UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "í´ë¦¬ê³¤ 편집"
+msgid "Points"
+msgstr "í¬ì¸íЏ"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Splits"
-msgstr "경로 나누기"
+msgid "Polygons"
+msgstr "í´ë¦¬ê³¤->UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Bones"
-msgstr "Bones 만들기"
+msgstr "본"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Create Polygon"
-msgstr "í´ë¦¬ê³¤ ìƒì„±"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Move Points"
msgstr "í¬ì¸íЏ ì´ë™"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
-msgstr "컨트롤: 회전"
+msgstr "Ctrl: 회전"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Shift: Move All"
-msgstr "시프트: ì „ì²´ ì´ë™"
+msgstr "Shift: ì „ì²´ ì´ë™"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Shift+Ctrl: Scale"
-msgstr "시프트+컨트롤: í¬ê¸° ì¡°ì ˆ"
+msgstr "Shift+Ctrl: í¬ê¸° ì¡°ì ˆ"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Move Polygon"
@@ -5273,25 +5236,26 @@ msgid "Scale Polygon"
msgstr "í´ë¦¬ê³¤ í¬ê¸° ì¡°ì ˆ"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "먼저 설정 í•­ëª©ì„ ì„ íƒí•˜ì„¸ìš”!"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
-msgstr ""
+msgid "Paint weights with specified intensity."
+msgstr "지정한 ê°•ë„로 가중치를 칠하기."
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
-msgstr ""
+msgid "Unpaint weights with specified intensity."
+msgstr "지정한 ê°•ë„로 가중치를 지우기."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Radius:"
-msgstr ""
+msgstr "반지름:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon->UV"
@@ -5306,9 +5270,13 @@ msgid "Clear UV"
msgstr "UV 정리"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Settings"
-msgstr "그리드맵 설정"
+msgstr "ê²©ìž ì„¤ì •"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "스냅"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
@@ -5316,41 +5284,35 @@ msgstr "스냅 활성화"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Grid"
-msgstr "그리드"
+msgstr "격ìž"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Configure Grid:"
-msgstr "스냅 설정"
+msgstr "ê²©ìž êµ¬ì„±:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset X:"
-msgstr "그리드 오프셋:"
+msgstr "ê²©ìž ì˜¤í”„ì…‹ X:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset Y:"
-msgstr "그리드 오프셋:"
+msgstr "ê²©ìž ì˜¤í”„ì…‹ Y:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step X:"
-msgstr "그리드 스í…:"
+msgstr "ê²©ìž ìŠ¤í… X:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step Y:"
-msgstr "그리드 스í…:"
+msgstr "ê²©ìž ìŠ¤í… Y:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Sync Bones to Polygon"
-msgstr "í´ë¦¬ê³¤ í¬ê¸° ì¡°ì ˆ"
+msgstr "ë³¸ì„ í´ë¦¬ê³¤ì— ë™ê¸°í™”"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "ERROR: Couldn't load resource!"
-msgstr "ì—러: 리소스를 로드할 수 없습니다!"
+msgstr "ì—러: 리소스를 불러올 수 없습니다!"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "Add Resource"
@@ -5374,25 +5336,25 @@ msgid "Paste Resource"
msgstr "리소스 붙여넣기"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "ì—디터ì—서 열기"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr "ì¸ìŠ¤í„´ìŠ¤:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr "타입:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "ì—디터ì—서 열기"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
-msgstr "리소스 로드"
+msgstr "리소스 불러오기"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "ResourcePreloader"
@@ -5400,12 +5362,11 @@ msgstr "리소스 프리로ë”"
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "AnimationTree has no path set to an AnimationPlayer"
-msgstr ""
+msgstr "AnimationTree가 AnimationPlayer로 향하는 경로를 가지고 있지 않습니다"
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Path to AnimationPlayer is invalid"
-msgstr "애니메ì´ì…˜ 트리가 유효하지 않습니다."
+msgstr "AnimationPlayer로 향하는 경로가 유효하지 않습니다"
#: editor/plugins/script_editor_plugin.cpp
msgid "Clear Recent Files"
@@ -5416,48 +5377,46 @@ msgid "Close and save changes?"
msgstr "ë³€ê²½ì‚¬í•­ì„ ì €ìž¥í•˜ê³  닫겠습니까?"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error writing TextFile:"
-msgstr "íŒŒì¼ ì´ë™ ì—러:\n"
+msgstr "í…스트 íŒŒì¼ ì“°ê¸° ì—러:"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr "ì—러: 파ì¼ì„ 불러올 수 ì—†ìŒ."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error could not load file."
-msgstr "ì´ë¯¸ì§€ë¥¼ 로드할 수 ì—†ìŒ"
+msgstr "ì—러로 파ì¼ì„ 불러올 수 ì—†ìŒ."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error saving file!"
-msgstr "타ì¼ì…‹ 저장 중 ì—러!"
+msgstr "íŒŒì¼ ì €ìž¥ 중 ì—러!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr "테마 저장 중 ì—러"
+msgid "Error while saving theme."
+msgstr "테마 저장 중 오류 ë°œìƒ."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
-msgstr "저장 중 ì—러"
+msgid "Error Saving"
+msgstr "저장 중 오류 ë°œìƒ"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr "테마 가져오는 중 ì—러"
+msgid "Error importing theme."
+msgstr "테마 가져오는 중 오류 ë°œìƒ."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
-msgstr "가져오는 중 ì—러"
+msgid "Error Importing"
+msgstr "가져오는 중 오류 ë°œìƒ"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New TextFile..."
-msgstr "새 í´ë”..."
+msgstr "새 í…스트 파ì¼..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open File"
msgstr "íŒŒì¼ ì—´ê¸°"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Save File As..."
msgstr "다른 ì´ë¦„으로 저장..."
@@ -5466,6 +5425,14 @@ msgid "Import Theme"
msgstr "테마 가져오기"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "테마 저장 중 ì—러"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "저장 중 ì—러"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr "테마 다른 ì´ë¦„으로 저장..."
@@ -5475,7 +5442,7 @@ msgstr " í´ëž˜ìФ ë ˆí¼ëŸ°ìФ"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
-msgstr ""
+msgstr "메서드 목ë¡ì˜ 사전 ì‹ ì •ë ¬ì„ í‚¤ê±°ë‚˜ ë•니다."
#: editor/plugins/script_editor_plugin.cpp
msgid "Sort"
@@ -5506,9 +5473,8 @@ msgid "File"
msgstr "파ì¼"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "New TextFile"
-msgstr "íŒŒì¼ ë³´ê¸°"
+msgid "Open..."
+msgstr "열기..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5516,18 +5482,14 @@ msgstr "ëª¨ë‘ ì €ìž¥"
#: editor/plugins/script_editor_plugin.cpp
msgid "Soft Reload Script"
-msgstr "스í¬ë¦½íЏ 다시 로드"
+msgstr "스í¬ë¦½íЏ 다시 불러오기"
#: editor/plugins/script_editor_plugin.cpp
msgid "Copy Script Path"
msgstr "스í¬ë¦½íЏ 경로 복사"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr "íŒŒì¼ ì‹œìŠ¤í…œì—서 보기"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+msgid "History Previous"
msgstr "ì´ì „ 히스토리"
#: editor/plugins/script_editor_plugin.cpp
@@ -5540,18 +5502,18 @@ msgid "Theme"
msgstr "테마"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme..."
+msgstr "테마 가져오기..."
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
-msgstr "테마 다시 로드"
+msgstr "테마 다시 불러오기"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme"
msgstr "테마 저장"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "테마 다른 ì´ë¦„으로 저장"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "문서 닫기"
@@ -5598,18 +5560,14 @@ msgid "Keep Debugger Open"
msgstr "디버거 í•­ìƒ ì—´ì–´ë†“ê¸°"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
-msgstr "외부 ì—디터와 디버그"
+msgid "Debug with External Editor"
+msgstr "외부 ì—디터로 디버깅"
#: editor/plugins/script_editor_plugin.cpp
msgid "Open Godot online documentation"
msgstr "Godot 온ë¼ì¸ 문서 열기"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr "í´ëž˜ìФ 계층 검색."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "ë ˆí¼ëŸ°ìФ 문서 검색."
@@ -5635,7 +5593,7 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
msgid "Reload"
-msgstr "다시 로드"
+msgstr "다시 불러오기"
#: editor/plugins/script_editor_plugin.cpp
msgid "Resave"
@@ -5646,37 +5604,32 @@ msgid "Debugger"
msgstr "디버거"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search results"
-msgstr "ë„ì›€ë§ ê²€ìƒ‰"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "í´ëž˜ìФ 검색"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr "내장 스í¬ë¦½íŠ¸ëŠ” 종ì†ëœ ì”¬ì´ ì—´ë¦° ìƒíƒœì—서만 íŽ¸ì§‘ì´ ê°€ëŠ¥í•©ë‹ˆë‹¤"
+msgid "Search Results"
+msgstr "검색 결과"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Line"
-msgstr "ë¼ì¸:"
+msgstr "ë¼ì¸"
#: editor/plugins/script_text_editor.cpp
msgid "(ignore)"
-msgstr ""
+msgstr "(무시함)"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function"
+msgstr "함수로 ì´ë™"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr "표준"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr "íŒŒì¼ ì‹œìŠ¤í…œì—서 가져온 리소스만 드ëží•  수 있습니다."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Lookup Symbol"
-msgstr "ìžë™ 완성"
+msgstr "룩업 심벌"
#: editor/plugins/script_text_editor.cpp
msgid "Pick Color"
@@ -5700,11 +5653,7 @@ msgstr "대문ìžë¡œ 시작"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Syntax Highlighter"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
+msgstr "구문 강조"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
@@ -5754,14 +5703,14 @@ msgstr "ìžë™ 완성"
#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
-msgstr "후행 공백 ë¬¸ìž ì œê±°"
+msgstr "후행 공백 ë¬¸ìž ì‚­ì œ"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
-msgstr "들여쓰기를 스페ì´ìŠ¤ë¡œ 변환"
+msgid "Convert Indent to Spaces"
+msgstr "들여쓰기를 공백으로 변환"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr "들여쓰기를 탭으로 변환"
#: editor/plugins/script_text_editor.cpp
@@ -5778,36 +5727,27 @@ msgid "Remove All Breakpoints"
msgstr "ì¤‘ë‹¨ì  ëª¨ë‘ ì‚­ì œ"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
+msgid "Go to Next Breakpoint"
msgstr "ë‹¤ìŒ ì¤‘ë‹¨ì ìœ¼ë¡œ ì´ë™"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
+msgid "Go to Previous Breakpoint"
msgstr "ì´ì „ 중단ì ìœ¼ë¡œ ì´ë™"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr "대문ìžë¡œ 변환"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr "소문ìžë¡œ 변환"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr "ì´ì „ 찾기"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Find in files..."
-msgstr "íŒŒì¼ í•„í„°ë§..."
+msgid "Find in Files..."
+msgstr "파ì¼ì—서 찾기..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+msgid "Go to Function..."
msgstr "함수로 ì´ë™..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+msgid "Go to Line..."
msgstr "ë¼ì¸ìœ¼ë¡œ ì´ë™..."
#: editor/plugins/script_text_editor.cpp
@@ -5821,39 +5761,35 @@ msgstr "ì…°ì´ë”"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "This skeleton has no bones, create some children Bone2D nodes."
msgstr ""
+"ì´ ìŠ¤ì¼ˆë ˆí†¤ì€ ë³¸ì„ ê°€ì§€ê³  있지 않습니다, ìžì‹ìœ¼ë¡œ Bone2D 노드를 추가하세요."
#: editor/plugins/skeleton_2d_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton2D"
-msgstr "스켈레톤..."
+msgstr "스켈레톤2D"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Make Rest Pose (From Bones)"
-msgstr ""
+msgstr "(본으로부터) íœ´ì‹ í¬ì¦ˆ 만들기"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Set Bones to Rest Pose"
-msgstr ""
+msgstr "ë³¸ì„ íœ´ì‹ í¬ì¦ˆë¡œ 설정"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical bones"
-msgstr "네비게ì´ì…˜ 메시 만들기"
+msgstr "ë¬¼ë¦¬ì  ë³¸ 만들기"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton"
-msgstr "스켈레톤..."
+msgstr "스켈레톤"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical skeleton"
-msgstr "C# 솔루션 만들기"
+msgstr "ë¬¼ë¦¬ì  ìŠ¤ì¼ˆë ˆí†¤ 만들기"
#: editor/plugins/skeleton_ik_editor_plugin.cpp
-#, fuzzy
msgid "Play IK"
-msgstr "실행"
+msgstr "IK 실행"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Orthogonal"
@@ -5904,6 +5840,14 @@ msgid "Animation Key Inserted."
msgstr "애니메ì´ì…˜ 키가 삽입ë˜ì—ˆìŠµë‹ˆë‹¤."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr "피치"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr "ìš”"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr "그려진 오브ì íЏ"
@@ -5988,9 +5932,8 @@ msgid "This operation requires a single selected node."
msgstr "ì´ ìž‘ì—…ì€ í•˜ë‚˜ì˜ ì„ íƒëœ 노드를 필요로 합니다."
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Lock View Rotation"
-msgstr "정보 보기"
+msgstr "뷰 회전 잠금"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Normal"
@@ -6037,9 +5980,8 @@ msgid "Doppler Enable"
msgstr "ë„플러 활성화"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Cinematic Preview"
-msgstr "메시 미리보기 ìƒì„± 중"
+msgstr "시네마틱 미리보기"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
@@ -6070,8 +6012,12 @@ msgid "Freelook Speed Modifier"
msgstr "ìžìœ ì‹œì  ì†ë„ 변화"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "뷰 회전 잠김"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
-msgstr "XForm 다ì´ì–¼ë¡œê·¸"
+msgstr "XForm 대화 ìƒìž"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Select Mode (Q)"
@@ -6172,13 +6118,8 @@ msgid "Tool Scale"
msgstr "í¬ê¸° ì¡°ì ˆ 툴"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap To Floor"
-msgstr "ê·¸ë¦¬ë“œì— ìŠ¤ëƒ…"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
-msgstr "ìžìœ ì‹œì  토글"
+msgstr "ìžìœ  ì‹œì  í† ê¸€"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform"
@@ -6186,11 +6127,11 @@ msgstr "변형"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap object to floor"
-msgstr ""
+msgstr "물체를 ë°”ë‹¥ì— ìŠ¤ëƒ…"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Dialog..."
-msgstr "변형 다ì´ì–¼ë¡œê·¸..."
+msgstr "변형 대화 ìƒìž..."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "1 Viewport"
@@ -6217,9 +6158,8 @@ msgid "4 Viewports"
msgstr "4ê°œ ë·°í¬íЏ"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Gizmos"
-msgstr "기즈모 보기"
+msgstr "기즈모"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Origin"
@@ -6227,7 +6167,7 @@ msgstr "ì›ì  보기"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Grid"
-msgstr "그리드 보기"
+msgstr "ê²©ìž ë³´ê¸°"
#: editor/plugins/spatial_editor_plugin.cpp
#: modules/gridmap/grid_map_editor_plugin.cpp
@@ -6294,56 +6234,53 @@ msgstr "Pre"
msgid "Post"
msgstr "Post"
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr "ì´ë¦„없는 기즈모"
+
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite is empty!"
-msgstr "저장 경로가 없습니다!"
+msgstr "스프ë¼ì´íŠ¸ê°€ 비었습니다!"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Can't convert a sprite using animation frames to mesh."
-msgstr ""
+msgstr "스프ë¼ì´íŠ¸ê°€ 애니메ì´ì…˜ í”„ë ˆìž„ì„ ì‚¬ìš©í•´ì„œ 메시로 ì „í™˜ë  ìˆ˜ 없습니다."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't replace by mesh."
-msgstr ""
+msgstr "유효하지 ì•Šì€ í˜•ìƒ, 메시로 대체할 수 없습니다."
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite"
-msgstr "스프ë¼ì´íЏ 프레임"
+msgstr "스프ë¼ì´íЏ"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to 2D Mesh"
-msgstr "%s로 변환"
+msgstr "2D 메시로 전환"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create 2D Mesh"
-msgstr "외곽선 메시 만들기"
+msgstr "2D 메시 만들기"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Simplification: "
-msgstr ""
+msgstr "단순화: "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Grow (Pixels): "
-msgstr "스냅 (픽셀):"
+msgstr "성장 (픽셀): "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Update Preview"
-msgstr "ì•„í‹€ë¼ìФ 미리보기"
+msgstr "ì—…ë°ì´íЏ 미리보기"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Settings:"
-msgstr "설정"
+msgstr "설정:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
-msgstr "ì—러: 프레임 리소스를 로드할 수 없습니다!"
+msgstr "ì—러: 프레임 리소스를 불러올 수 없습니다!"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Add Frame"
@@ -6375,7 +6312,7 @@ msgstr "(비었ìŒ)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Animations"
-msgstr "애니메ì´ì…˜"
+msgstr "애니메ì´ì…˜(Animations)"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Speed (FPS):"
@@ -6414,12 +6351,17 @@ msgid "Set Region Rect"
msgstr "ì˜ì—­ 설정"
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr "마진 설정"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr "스냅 모드:"
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
-msgstr "<ì—†ìŒ>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
+msgstr "ì—†ìŒ"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Pixel Snap"
@@ -6427,7 +6369,7 @@ msgstr "픽셀 스냅"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Grid Snap"
-msgstr "그리드 스냅"
+msgstr "ê²©ìž ìŠ¤ëƒ…"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Auto Slice"
@@ -6443,12 +6385,11 @@ msgstr "단계:"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Sep.:"
-msgstr ""
+msgstr "분리.:"
#: editor/plugins/texture_region_editor_plugin.cpp
-#, fuzzy
msgid "TextureRegion"
-msgstr "í…ìŠ¤ì³ ì˜ì—­"
+msgstr "TextureRegion"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Can't save theme to file:"
@@ -6536,7 +6477,7 @@ msgstr "ë§Žì€"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Has,Many,Options"
-msgstr "가진다,ë§Žì€,옵션들"
+msgstr "ë§Žì€,옵션,갖춤"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Tab 1"
@@ -6552,7 +6493,7 @@ msgstr "탭 3"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Data Type:"
-msgstr "ë°ì´íƒ€ 타입:"
+msgstr "ë°ì´í„° 타입:"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Icon"
@@ -6579,9 +6520,12 @@ msgid "Erase Selection"
msgstr "ì„ íƒ ì§€ìš°ê¸°"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Fix Invalid Tiles"
-msgstr "유효하지 ì•Šì€ ì´ë¦„."
+msgstr "ìž˜ëª»ëœ íƒ€ì¼ ìˆ˜ì •"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Cut Selection"
+msgstr "ì„ íƒ ìž˜ë¼ë‚´ê¸°"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
@@ -6604,7 +6548,6 @@ msgid "Erase TileMap"
msgstr "타ì¼ë§µ 지우기"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Find Tile"
msgstr "íƒ€ì¼ ì°¾ê¸°"
@@ -6629,35 +6572,36 @@ msgid "Pick Tile"
msgstr "íƒ€ì¼ ì„ íƒ"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
-msgid "Move Selection"
-msgstr "ì„ íƒ ì‚­ì œ"
+msgid "Copy Selection"
+msgstr "ì„ íƒ ë³µì‚¬"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate left"
+msgstr "왼쪽으로 회전"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr "0ë„ íšŒì „"
+msgid "Rotate right"
+msgstr "오른쪽으로 회전"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr "90ë„ íšŒì „"
+msgid "Flip horizontally"
+msgstr "가로로 뒤집기"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
-msgstr "180ë„ íšŒì „"
+msgid "Flip vertically"
+msgstr "세로로 뒤집기"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
-msgstr "270ë„ íšŒì „"
+msgid "Clear transform"
+msgstr "변형 지우기"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Add Texture(s) to TileSet"
-msgstr "트리ì—서 노드 추가"
+msgid "Add Texture(s) to TileSet."
+msgstr "TileSetì— í…ìŠ¤ì³ ì¶”ê°€í•˜ê¸°."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Remove current Texture from TileSet"
-msgstr "현재 엔트리 제거"
+msgid "Remove selected Texture from TileSet."
+msgstr "ì„ íƒëœ í…스ì³ë¥¼ TileSetì—서 삭제하기."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -6668,104 +6612,210 @@ msgid "Merge from Scene"
msgstr "씬으로부터 병합하기"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
-msgstr ""
-"사용할 서브 타ì¼ì„ ì•„ì´ì½˜ìœ¼ë¡œ 설정하세요, 효력없는 ìžë™íƒ€ì¼ ë°”ì¸ë”©ì—ë„ ì‚¬ìš©ë©"
-"니다."
+msgid "Copy bitmask."
+msgstr "비트 ë§ˆìŠ¤í¬ ë³µì‚¬í•˜ê¸°."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
-msgstr ""
+msgid "Paste bitmask."
+msgstr "비트 ë§ˆìŠ¤í¬ ë¶™ì—¬ë„£ê¸°."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Erase bitmask."
+msgstr "비트 ë§ˆìŠ¤í¬ ì§€ìš°ê¸°."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new polygon."
+msgstr "새로운 í´ë¦¬ê³¤ 만들기."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr "사ê°í˜• ë‚´ë¶€ì— í´ë¦¬ê³¤ì„ 유지하기."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
+msgstr "ìŠ¤ëƒ…ì„ í™œì„±í™” 하고 격ìžë¥¼ ë³´ì´ê¸° (ì¸ìŠ¤íŽ™í„°ë¥¼ 통해 구성할 수 있습니다)."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr "íƒ€ì¼ ì´ë¦„ ë³´ì´ê¸° (Alt 키를 누르세요)"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Remove selected texture? This will remove all tiles which use it."
msgstr ""
+"ì„ íƒí•œ í…스ì³ë¥¼ 삭제하시겠습니까? 해당 í…스ì³ë¥¼ 사용하는 모든 타ì¼ì´ ì‚­ì œë  "
+"것입니다."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
-msgstr ""
+msgstr "삭제할 í…스ì³ë¥¼ ì„ íƒí•˜ì§€ 않았습니다."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
-msgstr "씬으로부터 만드시겠습니까?"
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr "씬으로부터 ìƒì„±í•˜ì‹œê² ìŠµë‹ˆê¹Œ? 현재 타ì¼ì„ ëª¨ë‘ ë®ì–´ì”니다."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
msgstr "씬으로부터 병합하시겠습니까?"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
-msgstr ""
+msgid "Remove Texture"
+msgstr "í…ìŠ¤ì³ ì‚­ì œ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
+msgstr "%s 파ì¼ì´ ì´ë¯¸ 목ë¡ì— 존재하여 추가ë˜ì§€ 않습니다."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Drag handles to edit Rect.\n"
"Click on another Tile to edit it."
msgstr ""
+"í•¸ë“¤ì„ ë“œëž˜ê·¸í•˜ì—¬ 사ê°í˜•ì„ íŽ¸ì§‘.\n"
+"다른 타ì¼ì„ 편집하려면 í´ë¦­."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete selected Rect."
+msgstr "ì„ íƒëœ 사ê°í˜•ì„ ì‚­ì œí•˜ê¸°."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
-"좌í´ë¦­: 비트 켜기를 설정합니다.\n"
-"ìš°í´ë¦­: 비트 ë„기를 설정합니다."
+"현재 íŽ¸ì§‘ëœ ì„œë¸Œ íƒ€ì¼ ì„ íƒ.\n"
+"다른 타ì¼ì„ 편집하려면 í´ë¦­."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete polygon."
+msgstr "í´ë¦¬ê³¤ 삭제하기."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
-msgstr "현재 íŽ¸ì§‘ëœ ì„œë¸Œ íƒ€ì¼ ì„ íƒ."
+msgstr ""
+"좌í´ë¦­: 비트 켜기를 설정함.\n"
+"ìš°í´ë¦­: 비트 ë„기를 설정함.\n"
+"다른 타ì¼ì„ 편집하려면 í´ë¦­í•˜ì„¸ìš”."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to use as icon, this will be also used on invalid autotile "
"bindings.\n"
"Click on another Tile to edit it."
msgstr ""
-"사용할 서브 타ì¼ì„ ì•„ì´ì½˜ìœ¼ë¡œ 설정하세요, 효력없는 ìžë™íƒ€ì¼ ë°”ì¸ë”©ì—ë„ ì‚¬ìš©ë©"
-"니다."
+"사용할 서브 타ì¼ì„ ì•„ì´ì½˜ìœ¼ë¡œ 설정하세요, 유효하지 ì•Šì€ ìžë™ íƒ€ì¼ ë°”ì¸ë”©ì—ë„ "
+"사용ë©ë‹ˆë‹¤.\n"
+"다른 타ì¼ì„ 편집하려면 í´ë¦­."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to change its priority.\n"
"Click on another Tile to edit it."
-msgstr "서브 타ì¼ì„ ì„ íƒí•´ ìš°ì„  순위를 바꿉니다."
+msgstr ""
+"서브 타ì¼ì„ ì„ íƒí•´ ìš°ì„  순위를 바꿈.\n"
+"다른 타ì¼ì„ 편집하려면 í´ë¦­."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+"서브 타ì¼ì„ ì„ íƒí•´ z ì¸ë±ìŠ¤ë¥¼ 변경합니다.\n"
+"다른 타ì¼ì„ 편집하려면 í´ë¦­í•©ë‹ˆë‹¤."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr "íƒ€ì¼ ì˜ì—­ 설정"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Tile"
+msgstr "íƒ€ì¼ ë§Œë“¤ê¸°"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr "íƒ€ì¼ ì•„ì´ì½˜ 설정"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr "íƒ€ì¼ ë¹„íŠ¸ ë§ˆìŠ¤í¬ íŽ¸ì§‘"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Collision Polygon"
+msgstr "ì¶©ëŒ í´ë¦¬ê³¤ 편집"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Occlusion Polygon"
+msgstr "ì–´í´ë£¨ì „ í´ë¦¬ê³¤ 편집"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Navigation Polygon"
+msgstr "내비게ì´ì…˜ í´ë¦¬ê³¤ 편집"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste Tile Bitmask"
+msgstr "íƒ€ì¼ ë¹„íŠ¸ ë§ˆìŠ¤í¬ ë¶™ì—¬ë„£ê¸°"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr "íƒ€ì¼ ë¹„íŠ¸ ë§ˆìŠ¤í¬ ì§€ìš°ê¸°"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Tile"
+msgstr "íƒ€ì¼ ì‚­ì œ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr "ì¶©ëŒ í´ë¦¬ê³¤ ì‚­ì œ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr "ì–´í´ë£¨ì „ í´ë¦¬ê³¤ ì‚­ì œ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr "내비게ì´ì…˜ í´ë¦¬ê³¤ ì‚­ì œ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr "필터 우선 순위 편집"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr "íƒ€ì¼ Z ì¸ë±ìФ 편집"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Collision Polygon"
+msgstr "내비게ì´ì…˜ ì¶©ëŒ í´ë¦¬ê³¤ 만들기"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Occlusion Polygon"
+msgstr "ì–´í´ë£¨ì „ í´ë¦¬ê³¤ 만들기"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "This property can't be changed."
-msgstr "ì´ ìž‘ì—…ì€ ì”¬ ì—†ì´ëŠ” 불가합니다."
+msgstr "ì´ ì†ì„±ì„ 바꿀 수 없습니다."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
-msgstr "íƒ€ì¼ ì…‹"
+msgid "TileSet"
+msgstr "TileSet(íƒ€ì¼ ì…‹)"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vertex"
-msgstr "버틱스"
+msgstr "버í…스"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Fragment"
msgstr "프래그먼트"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Light"
-msgstr "오른쪽면"
+msgstr "ë¹›"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "VisualShader"
-msgstr "ì…°ì´ë”"
+msgstr "비주얼 ì…°ì´ë”"
#: editor/project_export.cpp
msgid "Runnable"
@@ -6784,6 +6834,14 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr "ì´ í”Œëž«í¼ì— 대한 내보내기 í…œí”Œë¦¿ì´ ì—†ê±°ë‚˜ ì†ìƒë¨:"
#: editor/project_export.cpp
+msgid "Release"
+msgstr "ë°°í¬"
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr "ëª¨ë‘ ë‚´ë³´ë‚´ê¸°"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr "프리셋"
@@ -6792,8 +6850,12 @@ msgid "Add..."
msgstr "추가..."
#: editor/project_export.cpp
+msgid "Export Path"
+msgstr "경로 내보내기"
+
+#: editor/project_export.cpp
msgid "Resources"
-msgstr "리소스"
+msgstr "리소스(Resources)"
#: editor/project_export.cpp
msgid "Export all resources in the project"
@@ -6839,17 +6901,53 @@ msgstr "기능"
#: editor/project_export.cpp
msgid "Custom (comma-separated):"
-msgstr "커스텀 (콤마로 구분):"
+msgstr "커스텀 (쉼표로 구분):"
#: editor/project_export.cpp
msgid "Feature List:"
msgstr "기능 목ë¡:"
#: editor/project_export.cpp
+msgid "Script"
+msgstr "스í¬ë¦½íЏ"
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "스í¬ë¦½íЏ 내보내기 모드:"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr "í…스트"
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr "컴파ì¼"
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "암호화 (ì•„ëž˜ì— í‚¤ê°’ í•„ìš”)"
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr "올바르지 ì•Šì€ ì•”í˜¸í™” 키 (64ìž ê¸¸ì´ì–´ì•¼ 함)"
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "스í¬ë¦½íЏ 암호 키 (256-비트를 hex í¬ë©§ìœ¼ë¡œ):"
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr "PCK/Zip 내보내기"
#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr "내보내기 모드?"
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr "ëª¨ë‘ ë‚´ë³´ë‚´ê¸°"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr "ì´ í”Œëž«í¼ì— 대한 내보내기 í…œí”Œë¦¿ì´ ì—†ìŒ:"
@@ -6862,22 +6960,21 @@ msgid "The path does not exist."
msgstr "경로가 존재하지 않습니다."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
-msgstr "'project.godot' 파ì¼ì´ 없는 í´ë”를 ì„ íƒ í•˜ì‹­ì‹œì˜¤."
+msgstr ""
+"유효하지 ì•Šì€ '.zip' 프로ì íЏ 파ì¼, 'project.godot' 파ì¼ì„ í¬í•¨í•˜ì§€ 않ìŒ."
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "비어있는 í´ë”를 ì„ íƒí•˜ì„¸ìš”."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "'project.godot' 파ì¼ì„ ì„ íƒí•˜ì„¸ìš”."
+msgstr "'project.godot' íŒŒì¼ ì´ë‚˜ '.zip' 파ì¼ì„ ì„ íƒí•˜ì„¸ìš”."
#: editor/project_manager.cpp
msgid "Directory already contains a Godot project."
-msgstr ""
+msgstr "ë””ë ‰í† ë¦¬ì— Godot 프로ì íŠ¸ê°€ ì´ë¯¸ 있습니다."
#: editor/project_manager.cpp
msgid "Imported Project"
@@ -6908,8 +7005,8 @@ msgid ""
"Couldn't load project.godot in project path (error %d). It may be missing or "
"corrupted."
msgstr ""
-"프로ì íЏ 경로로 부터 project.godot 파ì¼ì„ 로드 í•  수 없습니다 (ì—러 %d). 존재"
-"하지 않거나 ì†ìƒë˜ì—ˆì„ 수 있습니다."
+"프로ì íЏ 경로로부터 project.godot 파ì¼ì„ 불러올 수 없습니다 (ì—러 %d). 존재하"
+"ì§€ 않거나 ì†ìƒë˜ì—ˆì„ 수 있습니다."
#: editor/project_manager.cpp
msgid "Couldn't edit project.godot in project path."
@@ -6961,16 +7058,15 @@ msgstr "프로ì íЏ 명:"
#: editor/project_manager.cpp
msgid "Create folder"
-msgstr "í´ë” ìƒì„±"
+msgstr "í´ë” 만들기"
#: editor/project_manager.cpp
msgid "Project Path:"
msgstr "프로ì íЏ 경로:"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Project Installation Path:"
-msgstr "프로ì íЏ 경로:"
+msgstr "프로ì íЏ 설치 경로:"
#: editor/project_manager.cpp
msgid "Browse"
@@ -6981,8 +7077,8 @@ msgid "Unnamed Project"
msgstr "ì´ë¦„없는 프로ì íЏ"
#: editor/project_manager.cpp
-msgid "Can't open project"
-msgstr "프로ì íŠ¸ë¥¼ ì—´ 수 ì—†ìŒ"
+msgid "Can't open project at '%s'."
+msgstr "'%s'ì—서 프로ì íŠ¸ë¥¼ ì—´ 수 ì—†ìŒ."
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
@@ -6990,13 +7086,40 @@ msgstr "ë‘ê°œ ì´ìƒì˜ 프로ì íŠ¸ë¥¼ 열려는 ê²ƒì´ í™•ì‹¤í•©ë‹ˆê¹Œ?"
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+"다ìŒì˜ 프로ì íЏ 설정 파ì¼ì€ 예전 버전ì—서 ìƒì„±ëœ 것으로, ì´ ë²„ì „ì— ë§žê²Œ 전환"
+"해야 합니다:\n"
+"\n"
+"%s\n"
+"\n"
+"전환하시겠습니까?\n"
+"경고: ë” ì´ìƒ ì´ í”„ë¡œì íŠ¸ë¥¼ 과거 ë²„ì „ì˜ ê²ƒìœ¼ë¡œ ì—´ 수 없게 ë©ë‹ˆë‹¤."
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+"새로운 ë²„ì „ì˜ ì—”ì§„ìœ¼ë¡œ 프로ì íЏ ì„¤ì •ì´ ìƒì„±ë˜ì—ˆìŠµë‹ˆë‹¤, ì´ ë²„ì „ì—서는 호환ë˜"
+"지 않습니다."
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
msgstr ""
-"프로ì íŠ¸ë¥¼ 실행할 수 없습니다: ë©”ì¸ì”¬ì´ 지정ë˜ì§€ 않았습니다.\n"
-"프로ì íŠ¸ë¥¼ 편집하여 \"Application\" ì¹´í…Œê³ ë¦¬ì— \"Project Settings\"ì—서 ë©”ì¸ "
-"ì”¬ì„ ì„¤ì •í•˜ì„¸ìš”."
+"프로ì íŠ¸ë¥¼ 실행할 수 없습니다: ë©”ì¸ ì”¬ì´ ì§€ì •ë˜ì§€ 않았습니다.\n"
+"\"프로ì íЏ 설정\"ì˜ \"Application\" 카테고리ì—서 ë©”ì¸ ì”¬ì„ ì„¤ì •í•˜ê³  프로ì íЏ"
+"를 편집하세요."
#: editor/project_manager.cpp
msgid ""
@@ -7008,12 +7131,12 @@ msgstr ""
#: editor/project_manager.cpp
msgid "Are you sure to run more than one project?"
-msgstr "ë‘ê°œ ì´ìƒì˜ 프로ì íŠ¸ë¥¼ 실행하려는 ê²ƒì´ í™•ì‹¤í•©ë‹ˆê¹Œ?"
+msgstr "ë‘ ê°œ ì´ìƒì˜ 프로ì íŠ¸ë¥¼ 실행하려는 ê²ƒì´ í™•ì‹¤í•©ë‹ˆê¹Œ?"
#: editor/project_manager.cpp
msgid "Remove project from the list? (Folder contents will not be modified)"
msgstr ""
-"목ë¡ì—서 프로ì íŠ¸ë¥¼ 제거하시겠습니까? (í´ë”와 파ì¼ë“¤ì€ 남아있게 ë©ë‹ˆë‹¤.)"
+"목ë¡ì—서 프로ì íŠ¸ë¥¼ 삭제하시겠습니까? (í´ë”ì˜ ë‚´ìš©ë¬¼ì€ ì‚¬ë¼ì§€ì§€ 않습니다)"
#: editor/project_manager.cpp
msgid ""
@@ -7090,13 +7213,12 @@ msgid "Mouse Button"
msgstr "마우스 버튼"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid ""
"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
msgstr ""
-"ì¸ì‹í• ìˆ˜ 없는 ì•¡ì…˜ ì´ë¦„입니다. 공백ì´ê±°ë‚˜, '/' , ':', '=', '\\', '\"' ê°€ í¬í•¨"
-"ë˜ë©´ 안 ë©ë‹ˆë‹¤."
+"유효하지 ì•Šì€ ì•¡ì…˜ ì´ë¦„. 공백ì´ê±°ë‚˜, '/' , ':', '=', '\\', '\"' 를 í¬í•¨í•˜ë©´ "
+"안 ë©ë‹ˆë‹¤"
#: editor/project_settings_editor.cpp
msgid "Action '%s' already exists!"
@@ -7107,18 +7229,16 @@ msgid "Rename Input Action Event"
msgstr "ìž…ë ¥ 앱션 ì´ë²¤íЏ ì´ë¦„ 변경"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Change Action deadzone"
-msgstr "애니메ì´ì…˜ ì´ë¦„ 변경:"
+msgstr "ì•¡ì…˜ ë°ë“œ ì¡´ 변경"
#: editor/project_settings_editor.cpp
msgid "Add Input Action Event"
msgstr "ìž…ë ¥ ì•¡ì…˜ ì´ë²¤íЏ 추가"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "All Devices"
-msgstr "기기"
+msgstr "모든 기기"
#: editor/project_settings_editor.cpp
msgid "Device"
@@ -7126,15 +7246,15 @@ msgstr "기기"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Shift+"
-msgstr "시프트+"
+msgstr "Shift+"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Alt+"
-msgstr "알트+"
+msgstr "Alt+"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Control+"
-msgstr "컨트롤+"
+msgstr "Control+"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Press a Key..."
@@ -7165,24 +7285,20 @@ msgid "Wheel Down Button"
msgstr "휠 아래로 버튼"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Left Button"
-msgstr "휠 위로 버튼"
+msgstr "휠 왼쪽 버튼"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Right Button"
-msgstr "오른쪽 버튼"
+msgstr "휠 오른쪽 버튼"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 1"
-msgstr "버튼 6"
+msgstr "X 버튼 1"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 2"
-msgstr "버튼 6"
+msgstr "X 버튼 2"
#: editor/project_settings_editor.cpp
msgid "Joypad Axis Index:"
@@ -7210,7 +7326,7 @@ msgstr "ì´ë²¤íЏ 추가"
#: editor/project_settings_editor.cpp
msgid "Button"
-msgstr "버튼"
+msgstr "버튼(Button)"
#: editor/project_settings_editor.cpp
msgid "Left Button."
@@ -7302,11 +7418,11 @@ msgstr "리소스 리맵핑 언어 변경"
#: editor/project_settings_editor.cpp
msgid "Remove Resource Remap"
-msgstr "리소스 리맵핑 제거"
+msgstr "리소스 리맵핑 삭제"
#: editor/project_settings_editor.cpp
msgid "Remove Resource Remap Option"
-msgstr "리소스 리맵핑 옵션 제거"
+msgstr "리소스 리맵핑 옵션 삭제"
#: editor/project_settings_editor.cpp
msgid "Changed Locale Filter"
@@ -7324,17 +7440,13 @@ msgstr "프로ì íЏ 설정 (project.godot)"
msgid "General"
msgstr "ì¼ë°˜"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr "ì†ì„±:"
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr "재정ì˜..."
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Editor must be restarted for changes to take effect"
-msgstr ""
+msgstr "변경 ì‚¬í•­ì„ ì ìš©í•˜ë ¤ë©´ ì—디터를 다시 실행해야 합니다"
#: editor/project_settings_editor.cpp
msgid "Input Map"
@@ -7346,11 +7458,11 @@ msgstr "ì•¡ì…˜:"
#: editor/project_settings_editor.cpp
msgid "Action"
-msgstr "ì•¡ì…˜"
+msgstr "ì•¡ì…˜(Action)"
#: editor/project_settings_editor.cpp
msgid "Deadzone"
-msgstr ""
+msgstr "ë°ë“œ ì¡´"
#: editor/project_settings_editor.cpp
msgid "Device:"
@@ -7410,7 +7522,7 @@ msgstr "로케ì¼:"
#: editor/project_settings_editor.cpp
msgid "AutoLoad"
-msgstr "오토로드"
+msgstr "오토로드(AutoLoad)"
#: editor/property_editor.cpp
msgid "Ease In"
@@ -7450,7 +7562,7 @@ msgstr "노드 ì„ íƒ"
#: editor/property_editor.cpp
msgid "Error loading file: Not a resource!"
-msgstr "íŒŒì¼ ë¡œë“œ ì—러: 리소스가 아닙니다!"
+msgstr "íŒŒì¼ ë¶ˆëŸ¬ì˜¤ê¸° ì—러: 리소스가 아닙니다!"
#: editor/property_editor.cpp
msgid "Pick a Node"
@@ -7460,10 +7572,6 @@ msgstr "노드 ì„ íƒ"
msgid "Bit %d, val %d."
msgstr "비트 %d, 값 %d."
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr "ì†ì„±:"
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr "ì†ì„± ì„ íƒ"
@@ -7482,100 +7590,95 @@ msgstr "PVRTC ë„구를 실행할 수 없습니다:"
#: editor/pvrtc_compress.cpp
msgid "Can't load back converted image using PVRTC tool:"
-msgstr "PVRTC ë„구를 사용하여 ë³€í™˜ëœ ì´ë¯¸ì§€ë¥¼ 다시 로드 í•  수 없습니다:"
+msgstr "PVRTC ë„구를 사용하여 ë³€í™˜ëœ ì´ë¯¸ì§€ë¥¼ 다시 불러올 수 없습니다:"
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Batch Rename"
-msgstr "ì´ë¦„ 변경"
+msgstr "ì¼ê´„ ì´ë¦„ 변경"
#: editor/rename_dialog.cpp
msgid "Prefix"
-msgstr ""
+msgstr "ì ‘ë‘사"
#: editor/rename_dialog.cpp
msgid "Suffix"
-msgstr ""
+msgstr "접미사"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Advanced options"
-msgstr "스냅 옵션"
+msgstr "고급 옵션"
#: editor/rename_dialog.cpp
msgid "Substitute"
-msgstr ""
+msgstr "대체"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node name"
-msgstr "노드 ì´ë¦„:"
+msgstr "노드 ì´ë¦„"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
-msgstr ""
+msgstr "ë…¸ë“œì˜ ë¶€ëª¨ ì´ë¦„ (사용 가능한 경우)"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node type"
-msgstr "노드 타입 찾기"
+msgstr "노드 타입"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Current scene name"
-msgstr "현재 씬"
+msgstr "현재 씬 ì´ë¦„"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Root node name"
-msgstr "루트 노드 ì´ë¦„:"
+msgstr "루트 노드 ì´ë¦„"
#: editor/rename_dialog.cpp
msgid ""
"Sequential integer counter.\n"
"Compare counter options."
msgstr ""
+"순차 정수 카운터.\n"
+"ì¹´ìš´í„° 설정과 비êµí•¨."
#: editor/rename_dialog.cpp
msgid "Per Level counter"
-msgstr ""
+msgstr "수준 별 카운터"
#: editor/rename_dialog.cpp
msgid "If set the counter restarts for each group of child nodes"
-msgstr ""
+msgstr "설정한다면 ê° ê·¸ë£¹ì˜ ìžì‹ ë…¸ë“œì— ëŒ€í•´ ì¹´ìš´í„°ê°€ 다시 시작ë©ë‹ˆë‹¤"
#: editor/rename_dialog.cpp
msgid "Initial value for the counter"
-msgstr ""
+msgstr "ì¹´ìš´í„°ì˜ ì´ˆê¸° ê°’"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Step"
-msgstr "단계:"
+msgstr "단계"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
-msgstr ""
+msgid "Amount by which counter is incremented for each node"
+msgstr "ê° ë…¸ë“œì— ëŒ€í•´ ì¹´ìš´í„°ê°€ ì¦ê°€í•˜ëŠ” ì–‘"
#: editor/rename_dialog.cpp
msgid "Padding"
-msgstr ""
+msgstr "패딩(Padding)"
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
+"ì¹´ìš´í„°ì˜ ìµœì†Œ ìžë¦¿ìˆ˜.\n"
+"빈 ìžë¦¬ëŠ” 0으로 채워집니다."
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Regular Expressions"
-msgstr "í‘œí˜„ì‹ ë³€ê²½"
+msgstr "ì •ê·œ 표현ì‹"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Post-Process"
-msgstr "가져오기 후 수행할 스í¬ë¦½íЏ:"
+msgstr "후 처리"
#: editor/rename_dialog.cpp
msgid "Keep"
@@ -7583,32 +7686,29 @@ msgstr "유지"
#: editor/rename_dialog.cpp
msgid "CamelCase to under_scored"
-msgstr ""
+msgstr "낙타 대문ìžë¥¼ 밑줄로"
#: editor/rename_dialog.cpp
msgid "under_scored to CamelCase"
-msgstr ""
+msgstr "ë°‘ì¤„ì„ ë‚™íƒ€ 대문ìžë¡œ"
#: editor/rename_dialog.cpp
msgid "Case"
-msgstr ""
+msgstr "문ìž"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Lowercase"
-msgstr "소문ìžë¡œ 변경"
+msgstr "소문ìžë¡œ"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Uppercase"
-msgstr "대문ìžë¡œ 변경"
+msgstr "대문ìžë¡œ"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Reset"
-msgstr "줌 리셋"
+msgstr "리셋"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr "ì—러"
@@ -7667,8 +7767,12 @@ msgid "Instance Scene(s)"
msgstr "씬 ì¸ìŠ¤í„´ìŠ¤"
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "ìžì‹ 씬 추가"
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
-msgstr "스í¬ë¦½íЏ 제거"
+msgstr "스í¬ë¦½íЏ ì‚­ì œ"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -7703,41 +7807,44 @@ msgid "Save New Scene As..."
msgstr "새 ì”¬ì„ ë‹¤ë¥¸ ì´ë¦„으로 저장..."
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+"\"editable_instance\"를 비활설화 하면 ë…¸ë“œì˜ ëª¨ë“  ì†ì„±ì´ 기본 값으로 ë˜ëŒì•„ê°‘"
+"니다."
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr "ìžì‹ë…¸ë“œ 편집 가능"
#: editor/scene_tree_dock.cpp
msgid "Load As Placeholder"
-msgstr "Placeholderë¡œì¨ ë¡œë“œ"
+msgstr "Placeholderë¡œì¨ ë¶ˆëŸ¬ì˜¤ê¸°"
#: editor/scene_tree_dock.cpp
msgid "Make Local"
msgstr "로컬로 만들기"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "노드 ìƒì„±"
+msgstr "루트 노드 만들기:"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "2D Scene"
-msgstr "씬"
+msgstr "2D 씬"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "3D Scene"
-msgstr "씬"
+msgstr "3D 씬"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "User Interface"
-msgstr "ìƒì† 지우기"
+msgstr "ì‚¬ìš©ìž ì¸í„°íŽ˜ì´ìФ"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Custom Node"
-msgstr "노드 잘ë¼ë‚´ê¸°"
+msgstr "커스텀 노드"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
@@ -7779,6 +7886,10 @@ msgid "Clear Inheritance"
msgstr "ìƒì† 지우기"
#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr "문서 열기"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr "노드 삭제"
@@ -7787,17 +7898,16 @@ msgid "Add Child Node"
msgstr "ìžì‹ 노드 추가"
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
-msgstr "ìžì‹ 씬 추가"
-
-#: editor/scene_tree_dock.cpp
msgid "Change Type"
msgstr "타입 변경"
#: editor/scene_tree_dock.cpp
-#, fuzzy
+msgid "Extend Script"
+msgstr "스í¬ë¦½íЏ 확장"
+
+#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
-msgstr "새로운 씬 루트"
+msgstr "씬 루트 만들기"
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
@@ -7817,7 +7927,7 @@ msgstr "ì‚­ì œ (í™•ì¸ ì—†ìŒ)"
#: editor/scene_tree_dock.cpp
msgid "Add/Create a New Node"
-msgstr "새 노드 추가/ìƒì„±"
+msgstr "새 노드 추가/만들기"
#: editor/scene_tree_dock.cpp
msgid ""
@@ -7828,11 +7938,11 @@ msgstr ""
#: editor/scene_tree_dock.cpp
msgid "Attach a new or existing script for the selected node."
-msgstr "ì„ íƒëœ ë…¸ë“œì— ìƒˆë¡œìš´ 스í¬ë¦½íŠ¸ë¥¼ ìƒì„±í•˜ê±°ë‚˜ 기존 스í¬ë¦½íŠ¸ë¥¼ 로드합니다."
+msgstr "ì„ íƒëœ ë…¸ë“œì— ìƒˆë¡œìš´ 스í¬ë¦½íŠ¸ë¥¼ ìƒì„±í•˜ê±°ë‚˜ 기존 스í¬ë¦½íŠ¸ë¥¼ 불러옵니다."
#: editor/scene_tree_dock.cpp
msgid "Clear a script for the selected node."
-msgstr "ì„ íƒëœ ë…¸ë“œì˜ ìŠ¤í¬ë¦½íŠ¸ë¥¼ 제거합니다."
+msgstr "ì„ íƒëœ ë…¸ë“œì˜ ìŠ¤í¬ë¦½íŠ¸ë¥¼ 삭제합니다."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -7847,7 +7957,6 @@ msgid "Clear Inheritance? (No Undo!)"
msgstr "ìƒì†ì„ 지우시겠습니까? (ë˜ëŒë¦¬ê¸° 불가!)"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Toggle Visible"
msgstr "ë³´ì´ê¸° 토글"
@@ -7856,13 +7965,12 @@ msgid "Node configuration warning:"
msgstr "노드 배열 경고:"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node has connection(s) and group(s).\n"
"Click to show signals dock."
msgstr ""
-"노드가 커넥션과 ê·¸ë£¹ì„ ê°–ê³  있습니다.\n"
-"í´ë¦­í•´ì„œ ì‹œê·¸ë„ ë…ì„ ë³´ì‹­ì‹œì˜¤."
+"노드가 ì—°ê²°ê³¼ ê·¸ë£¹ì„ ê°–ê³  있습니다.\n"
+"í´ë¦­í•´ì„œ ì‹œê·¸ë„ ë…ì„ ì—¬ì„¸ìš”."
#: editor/scene_tree_editor.cpp
msgid ""
@@ -7881,37 +7989,36 @@ msgstr ""
"í´ë¦­í•´ì„œ 그룹 ë…ì„ ë³´ì‹­ì‹œì˜¤."
#: editor/scene_tree_editor.cpp editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script"
msgstr "스í¬ë¦½íЏ 열기"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node is locked.\n"
"Click to unlock it."
msgstr ""
"노드가 잠겨있습니다.\n"
-"í´ë¦­í•˜ë©´ 잠금 í•´ì œë©ë‹ˆë‹¤"
+"í´ë¦­í•˜ì—¬ ìž ê¸ˆì„ í‘¸ì„¸ìš”."
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Children are not selectable.\n"
"Click to make selectable."
msgstr ""
"ìžì‹ë“¤ì„ ì„ íƒí•  수 없습니다.\n"
-"í´ë¦­í•˜ë©´ ì„ íƒí•  수 있게 ë©ë‹ˆë‹¤"
+"í´ë¦­í•˜ë©´ ì„ íƒí•  수 있게 ë©ë‹ˆë‹¤."
#: editor/scene_tree_editor.cpp
msgid "Toggle Visibility"
-msgstr "ë³´ì´ê¸° 토글"
+msgstr "가시성 토글"
#: editor/scene_tree_editor.cpp
msgid ""
"AnimationPlayer is pinned.\n"
"Click to unpin."
msgstr ""
+"AnimationPlayerê°€ ê³ ì •ë˜ì—ˆìŠµë‹ˆë‹¤.\n"
+"í´ë¦­í•´ì„œ ê³ ì •ì„ í’‰ë‹ˆë‹¤."
#: editor/scene_tree_editor.cpp
msgid "Invalid node name, the following characters are not allowed:"
@@ -7935,7 +8042,7 @@ msgstr "노드 ì„ íƒ"
#: editor/script_create_dialog.cpp
msgid "Error loading template '%s'"
-msgstr "'%s' 템플릿 로드 ì—러"
+msgstr "'%s' 템플릿 불러오기 ì—러"
#: editor/script_create_dialog.cpp
msgid "Error - Could not create script in filesystem."
@@ -7950,15 +8057,18 @@ msgid "N/A"
msgstr "해당 ì—†ìŒ"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script/Choose Location"
-msgstr "스í¬ë¦½íЏ ì—디터 열기"
+msgstr "스í¬ë¦½íЏ 열기/위치 ì„ íƒ"
#: editor/script_create_dialog.cpp
msgid "Path is empty"
msgstr "경로가 비어 있ìŒ"
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr "íŒŒì¼ ì´ë¦„ì´ ë¹„ì—ˆìŠµë‹ˆë‹¤"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr "경로가 ë¡œì»¬ì´ ì•„ë‹˜"
@@ -8012,7 +8122,7 @@ msgstr "새 스í¬ë¦½íЏ íŒŒì¼ ë§Œë“¤ê¸°"
#: editor/script_create_dialog.cpp
msgid "Load existing script file"
-msgstr "기존 스í¬ë¦½íЏ íŒŒì¼ ë¡œë“œí•˜ê¸°"
+msgstr "기존 스í¬ë¦½íЏ íŒŒì¼ ë¶ˆëŸ¬ì˜¤ê¸°"
#: editor/script_create_dialog.cpp
msgid "Language"
@@ -8047,20 +8157,8 @@ msgid "Bytes:"
msgstr "ë°”ì´íЏ:"
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr "경고"
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr "ì—러:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr "소스:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
-msgstr "함수:"
+msgid "Stack Trace"
+msgstr "ìŠ¤íƒ ì¶”ì "
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8091,18 +8189,6 @@ msgid "Stack Frames"
msgstr "ìŠ¤íƒ í”„ë ˆìž„"
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr "변수"
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr "ì—러:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr "ìŠ¤íƒ ì¶”ì  (해당ë˜ëŠ” 경우):"
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr "프로파ì¼ëŸ¬"
@@ -8191,9 +8277,8 @@ msgid "Change Camera Size"
msgstr "Camera í¬ê¸° 변경"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Notifier AABB"
-msgstr "알림 범위 변경"
+msgstr "알림 AABB 변경"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Particles AABB"
@@ -8220,12 +8305,10 @@ msgid "Change Capsule Shape Height"
msgstr "ìº¡ìŠ ëª¨ì–‘ ë†’ì´ ë³€ê²½"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Radius"
-msgstr "ìº¡ìŠ ëª¨ì–‘ 반경 변경"
+msgstr "ìº¡ìŠ ëª¨ì–‘ 반지름 변경"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Height"
msgstr "ìº¡ìŠ ëª¨ì–‘ ë†’ì´ ë³€ê²½"
@@ -8234,24 +8317,20 @@ msgid "Change Ray Shape Length"
msgstr "ê´‘ì„  모양 ê¸¸ì´ ë³€ê²½"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Radius"
-msgstr "Light 반경 변경"
+msgstr "ì›ê¸°ë‘¥ 반지름 변경"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Height"
-msgstr "ìº¡ìŠ ëª¨ì–‘ ë†’ì´ ë³€ê²½"
+msgstr "ì›ê¸°ë‘¥ ë†’ì´ ë³€ê²½"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Inner Radius"
-msgstr "구체 모양 반경 변경"
+msgstr "토러스 내부 반지름 변경"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Outer Radius"
-msgstr "Light 반경 변경"
+msgstr "토러스 외부 반지름 변경"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select the dynamic library for this entry"
@@ -8263,11 +8342,11 @@ msgstr "ì´ ì—”íŠ¸ë¦¬ì— ëŒ€í•œ ë¼ì´ë¸ŒëŸ¬ë¦¬ì˜ 종ì†ì„ ì„ íƒ"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Remove current entry"
-msgstr "현재 엔트리 제거"
+msgstr "현재 엔트리 삭제"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Double click to create a new entry"
-msgstr "ë”블 í´ë¦­ìœ¼ë¡œ 새로운 엔트리를 ìƒì„±"
+msgstr "ë”블 í´ë¦­ìœ¼ë¡œ 새로운 엔트리를 만들기"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Platform:"
@@ -8306,8 +8385,8 @@ msgid "GDNative"
msgstr "GD네ì´í‹°ë¸Œ"
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
-msgstr "ìŠ¤í… ì¸ìžê°€ 제로입니다!"
+msgid "Step argument is zero!"
+msgstr "ìŠ¤í… ì¸ìˆ˜ê°€ 0입니다!"
#: modules/gdscript/gdscript_functions.cpp
msgid "Not a script with an instance"
@@ -8328,7 +8407,7 @@ msgstr "유효하지 ì•Šì€ ì¸ìŠ¤í„´ìŠ¤ Dictionary í˜•ì‹ (@path ì—†ìŒ)"
#: modules/gdscript/gdscript_functions.cpp
msgid "Invalid instance dictionary format (can't load script at @path)"
msgstr ""
-"유효하지 ì•Šì€ ì¸ìŠ¤í„´ìŠ¤ Dictionary í˜•ì‹ (@path ì—서 스í¬ë¦½íŠ¸ë¥¼ 로드할 수 ì—†ìŒ)"
+"유효하지 ì•Šì€ ì¸ìŠ¤í„´ìŠ¤ Dictionary í˜•ì‹ (@path ì—서 스í¬ë¦½íŠ¸ë¥¼ 불러올 수 ì—†ìŒ)"
#: modules/gdscript/gdscript_functions.cpp
msgid "Invalid instance dictionary format (invalid script at @path)"
@@ -8372,9 +8451,8 @@ msgid "GridMap Delete Selection"
msgstr "그리드맵 ì„ íƒ ì‚­ì œ"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Fill Selection"
-msgstr "그리드맵 ì„ íƒ ì‚­ì œ"
+msgstr "그리드맵 채우기 ì„ íƒ"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Duplicate Selection"
@@ -8457,9 +8535,8 @@ msgid "Clear Selection"
msgstr "ì„ íƒ ì§€ìš°ê¸°"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Fill Selection"
-msgstr "ëª¨ë‘ ì„ íƒ"
+msgstr "채우기 ì„ íƒ"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Settings"
@@ -8523,19 +8600,15 @@ msgstr "경고"
#: modules/mono/editor/mono_bottom_panel.cpp
msgid "View log"
-msgstr "ê¸°ë¡ ë³´ê¸°"
+msgstr "로그 보기"
#: modules/mono/mono_gd/gd_mono_utils.cpp
msgid "End of inner exception stack trace"
msgstr "ë‚´ë¶€ 예외 ìŠ¤íƒ ì¶”ì ì˜ ë"
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr "굽기!"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
-msgstr "네비게ì´ì…˜ 메시 만들기."
+msgid "Bake NavMesh"
+msgstr "NavMesh ë² ì´í¬"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8624,7 +8697,7 @@ msgstr "유효하지 ì•Šì€ ì‹œí€€ìŠ¤ ì¶œë ¥ì„ ë°˜í™˜í•œ 노드: "
#: modules/visual_script/visual_script.cpp
msgid "Found sequence bit but not the node in the stack, report bug!"
msgstr ""
-"시퀀스 비트를 발견했지만 스íƒì•ˆì˜ 노드ì—는 없습니다, 버그를 제보하세요!"
+"시퀀스 비트를 발견했지만 ìŠ¤íƒ ì•ˆì˜ ë…¸ë“œì—는 없습니다, 버그 리í¬íŠ¸ë¥¼ 해주세요!"
#: modules/visual_script/visual_script.cpp
msgid "Stack overflow with stack depth: "
@@ -8632,15 +8705,15 @@ msgstr "ìŠ¤íƒ ê¹Šì´ë¡œ 오버플로우한 스íƒ: "
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Signal Arguments"
-msgstr "ì‹œê·¸ë„ ì¸ìž 변경"
+msgstr "ì‹œê·¸ë„ ì¸ìˆ˜ 변경"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Argument Type"
-msgstr "ì¸ìž 타입 변경"
+msgstr "ì¸ìˆ˜ 타입 변경"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Argument name"
-msgstr "ì¸ìž ì´ë¦„ 변경"
+msgstr "ì¸ìˆ˜ ì´ë¦„ 변경"
#: modules/visual_script/visual_script_editor.cpp
msgid "Set Variable Default Value"
@@ -8696,7 +8769,7 @@ msgstr "노드 추가"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove VisualScript Nodes"
-msgstr "비주얼 스í¬ë¦½íЏ 노드 제거"
+msgstr "비주얼 스í¬ë¦½íЏ 노드 ì‚­ì œ"
#: modules/visual_script/visual_script_editor.cpp
msgid "Duplicate VisualScript Nodes"
@@ -8705,30 +8778,30 @@ msgstr "비주얼 스í¬ë¦½íЏ 노드 복제"
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature."
msgstr ""
-"%s 를 누르고 있으면 게터를 드ëží•©ë‹ˆë‹¤. 시프트를 누르고 있으면 ì¼ë°˜ì ì¸ 시그니"
-"처를 드ëží•©ë‹ˆë‹¤."
+"%s 를 누르고 있으면 Getter를 드롭합니다. Shift를 누르고 있으면 ì¼ë°˜ì ì¸ 시그"
+"니처를 드롭합니다."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
msgstr ""
-"ì»¨íŠ¸ë¡¤ì„ ëˆ„ë¥´ê³  있으면 게터를 드ëží•©ë‹ˆë‹¤. 시프트를 누르고 있으면 ì¼ë°˜ì ì¸ 시"
-"그니처를 드ëží•©ë‹ˆë‹¤."
+"Ctrlì„ ëˆ„ë¥´ê³  있으면 Getter를 드롭합니다. Shift를 누르고 있으면 ì¼ë°˜ì ì¸ 시그"
+"니처를 드롭합니다."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a simple reference to the node."
-msgstr "%s 를 누르고 있으면 ë…¸ë“œì— ëŒ€í•œ 간단한 참고를 ì¤ë‹ˆë‹¤."
+msgstr "%s 를 누르고 있으면 ë…¸ë“œì— ëŒ€í•œ 간단한 참조를 드롭합니다."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold Ctrl to drop a simple reference to the node."
-msgstr "ì»¨íŠ¸ë¡¤ì„ ëˆ„ë¥´ê³  있으면 ë…¸ë“œì— ëŒ€í•œ 간단한 참고를 ì¤ë‹ˆë‹¤."
+msgstr "Ctrlì„ ëˆ„ë¥´ê³  있으면 ë…¸ë“œì— ëŒ€í•œ 간단한 참조를 드롭합니다."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold %s to drop a Variable Setter."
-msgstr "%s를 누르고 있르면 변수 세터를 드ëží•©ë‹ˆë‹¤."
+msgstr "%s를 누르고 있르면 변수 Setter를 드롭합니다."
#: modules/visual_script/visual_script_editor.cpp
msgid "Hold Ctrl to drop a Variable Setter."
-msgstr "ì»¨íŠ¸ë¡¤ì„ ëˆ„ë¥´ê³  있으면 변수 세터를 드ëží•©ë‹ˆë‹¤."
+msgstr "Ctrlì„ ëˆ„ë¥´ê³  있으면 변수 Setter를 드ëží•©ë‹ˆë‹¤."
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Preload Node"
@@ -8740,11 +8813,11 @@ msgstr "트리ì—서 노드 추가"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Getter Property"
-msgstr "게터 ì†ì„± 추가"
+msgstr "Getter ì†ì„± 추가"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Setter Property"
-msgstr "세터 ì†ì„± 추가"
+msgstr "Setter ì†ì„± 추가"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Base Type"
@@ -8756,21 +8829,19 @@ msgstr "노드 ì´ë™"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove VisualScript Node"
-msgstr "비주얼 스í¬ë¦½íЏ 노드 제거"
+msgstr "비주얼 스í¬ë¦½íЏ 노드 ì‚­ì œ"
#: modules/visual_script/visual_script_editor.cpp
msgid "Connect Nodes"
msgstr "노드 연결"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Data"
-msgstr "노드 연결"
+msgstr "노드 ë°ì´í„° ì—°ê²°"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Sequence"
-msgstr "노드 연결"
+msgstr "노드 시퀀스 연결"
#: modules/visual_script/visual_script_editor.cpp
msgid "Script already has function '%s'"
@@ -8794,11 +8865,11 @@ msgstr "비주얼 스í¬ë¦½íЏ 노드 붙여넣기"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Function"
-msgstr "함수 제거"
+msgstr "함수 삭제"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Variable"
-msgstr "변수 제거"
+msgstr "변수 삭제"
#: modules/visual_script/visual_script_editor.cpp
msgid "Editing Variable:"
@@ -8806,7 +8877,7 @@ msgstr "변수 편집:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Signal"
-msgstr "ì‹œê·¸ë„ ì œê±°"
+msgstr "ì‹œê·¸ë„ ì‚­ì œ"
#: modules/visual_script/visual_script_editor.cpp
msgid "Editing Signal:"
@@ -8817,16 +8888,20 @@ msgid "Base Type:"
msgstr "기본 타입:"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "멤버:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
-msgstr "가능한 노드:"
+msgstr "사용 가능한 노드:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Select or create a function to edit graph"
-msgstr "그래프를 편집하기 위한 함수를 ì„ íƒí•˜ê±°ë‚˜ ìƒì„±"
+msgstr "그래프를 편집하기 위한 함수를 ì„ íƒí•˜ê±°ë‚˜ 만들기"
#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Signal Arguments:"
-msgstr "ì‹œê·¸ë„ ì¸ìž 편집:"
+msgstr "ì‹œê·¸ë„ ì¸ìˆ˜ 편집:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Variable:"
@@ -8853,9 +8928,8 @@ msgid "Paste Nodes"
msgstr "노드 붙여넣기"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
-msgstr "멤버"
+msgstr "멤버 편집"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Input type not iterable: "
@@ -8887,11 +8961,11 @@ msgstr "노드 %s ì•ˆì— ì¸ë±ìФ ì†ì„± ì´ë¦„ '%s' 는 유효하지 않습니
#: modules/visual_script/visual_script_nodes.cpp
msgid ": Invalid argument of type: "
-msgstr ": 유효하지 ì•Šì€ ì¸ìž 타입: "
+msgstr ": 유효하지 ì•Šì€ ì¸ìˆ˜ 타입: "
#: modules/visual_script/visual_script_nodes.cpp
msgid ": Invalid arguments: "
-msgstr ": 유효하지 ì•Šì€ ì¸ìž: "
+msgstr ": 유효하지 ì•Šì€ ì¸ìˆ˜: "
#: modules/visual_script/visual_script_nodes.cpp
msgid "VariableGet not found in script: "
@@ -8915,17 +8989,16 @@ msgstr ""
"(error)ê°€ 아니면 안ë©ë‹ˆë‹¤."
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Search VisualScript"
-msgstr "비주얼 스í¬ë¦½íЏ 노드 제거"
+msgstr "비주얼 스í¬ë¦½íЏ 검색"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
-msgstr "얻기"
+msgid "Get %s"
+msgstr "Get %s"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
-msgstr ""
+msgid "Set %s"
+msgstr "Set %s"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -8976,15 +9049,14 @@ msgstr ""
"작하고, 나머지는 무시ë©ë‹ˆë‹¤."
#: scene/2d/collision_object_2d.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
"define its shape."
msgstr ""
-"ì´ ë…¸ë“œëŠ” ëª¨ì–‘ì„ ê°–ëŠ” ìžì‹ 노드가 없어서, 공간ìƒì—서 ìƒí˜¸ìž‘용할 수 없습니"
-"다.\n"
-"CollisionShape2D ë˜ëŠ” CollisionPolygon2Dì„ ìžì‹ 노드로 추가하여 ëª¨ì–‘ì„ ì •ì˜í•˜"
+"ì´ ë…¸ë“œëŠ” ëª¨ì–‘ì„ ê°–ëŠ” ìžì‹ 노드가 없습니다, 다른 물체와 ì¶©ëŒí•˜ê±°ë‚˜ ìƒí˜¸ìž‘ìš© "
+"할 수 없습니다.\n"
+"CollisionShape2D ë˜ëŠ” CollisionPolygon2D를 ìžì‹ 노드로 추가하여 ëª¨ì–‘ì„ ì •ì˜í•˜"
"세요."
#: scene/2d/collision_polygon_2d.cpp
@@ -9019,6 +9091,14 @@ msgstr ""
"CollisionShape2Dê°€ ê¸°ëŠ¥ì„ í•˜ê¸° 위해서는 반드시 ëª¨ì–‘ì´ ì œê³µë˜ì–´ì•¼ 합니다. 모"
"양 리소스를 만드세요!"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+"CPUParticles2D 애니메ì´ì…˜ì„ 사용하려면 \"Particles Animation\"ì´ í™œì„±í™”ëœ "
+"CanvasItemMaterialì´ í•„ìš”í•©ë‹ˆë‹¤."
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -9065,6 +9145,14 @@ msgstr ""
"파티í´ì„ 처리할 ë©”í…Œë¦¬ì–¼ì´ í• ë‹¹ë˜ì§€ 않았기ì—, 아무런 í–‰ë™ë„ ì¸ì‡„ë˜ì§€ 않았습니"
"다."
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+"Particles2D 애니메ì´ì…˜ì„ 사용하려면 \"Particles Animation\"ì´ í™œì„±í™”ëœ "
+"CanvasItemMaterialì´ í•„ìš”í•©ë‹ˆë‹¤."
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr "PathFollow2D는 Path2D ë…¸ë“œì˜ ìžì‹ë…¸ë“œë¡œ ìžˆì„ ë•Œë§Œ ë™ìž‘합니다."
@@ -9085,16 +9173,18 @@ msgstr "Path ì†ì„±ì€ 유효한 Node2D 노드를 가리켜야 합니다."
#: scene/2d/skeleton_2d.cpp
msgid "This Bone2D chain should end at a Skeleton2D node."
-msgstr ""
+msgstr "ì´ Bone2D ì²´ì¸ì€ Skeleton2D 노드ì—서 ë나야 합니다."
#: scene/2d/skeleton_2d.cpp
msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
-msgstr ""
+msgstr "Bone2D는 Skeleton2D나 다른 Bone2Dê°€ 부모 노드로 있어야만 ìž‘ë™í•©ë‹ˆë‹¤."
#: scene/2d/skeleton_2d.cpp
msgid ""
"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
msgstr ""
+"ì´ ë³¸ì— ì ì ˆí•œ íœ´ì‹ ìžì„¸ê°€ 없습니다. Skeleton2D 노드로 ê°€ 휴ì‹ìœ¼ë¡œ í•  ìžì„¸ë¥¼ "
+"설정하세요."
#: scene/2d/visibility_notifier_2d.cpp
msgid ""
@@ -9157,15 +9247,14 @@ msgid "Lighting Meshes: "
msgstr "ë©”ì‹œì— ë¼ì´íŒ… 중: "
#: scene/3d/collision_object.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape or CollisionPolygon as a child to define "
"its shape."
msgstr ""
-"ì´ ë…¸ë“œëŠ” ëª¨ì–‘ì„ ê°–ëŠ” ìžì‹ 노드가 없어서, 공간ìƒì—서 ìƒí˜¸ìž‘용할 수 없습니"
-"다.\n"
-"CollisionShape ë˜ëŠ” CollisionPolygonì„ ìžì‹ 노드로 추가하여 ëª¨ì–‘ì„ ì •ì˜í•˜ì„¸"
+"ì´ ë…¸ë“œëŠ” ëª¨ì–‘ì„ ê°–ëŠ” ìžì‹ 노드가 없습니다, 다른 물체와 ì¶©ëŒí•˜ê±°ë‚˜ ìƒí˜¸ìž‘ìš© "
+"할 수 없습니다.\n"
+"CollisionShape ë˜ëŠ” CollisionPolygon를 ìžì‹ 노드로 추가하여 ëª¨ì–‘ì„ ì •ì˜í•˜ì„¸"
"ìš”."
#: scene/3d/collision_polygon.cpp
@@ -9200,6 +9289,18 @@ msgstr ""
"CollisionShapeê°€ ê¸°ëŠ¥ì„ í•˜ê¸° 위해서는 ëª¨ì–‘ì´ ì œê³µë˜ì–´ì•¼ 합니다. 모양 리소스"
"를 만드세요!"
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr "ì§€ì •ëœ ë©”ì‹œê°€ 없으므로 메시를 ë³¼ 수 없습니다."
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+"CPUParticles 애니메ì´ì…˜ì„ 사용하려면 \"Billboard Particles\"ì´ í™œì„±í™”ëœ "
+"SpatialMaterialì´ í•„ìš”í•©ë‹ˆë‹¤."
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr "메시 구분중"
@@ -9223,6 +9324,30 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr "ë©”ì‹œë“¤ì„ íŒ¨ìŠ¤ë¥¼ 그리ë„ë¡ í• ë‹¹í•˜ì§€ 않았으므로 ë³´ì´ì§€ 않습니다."
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+"Particles 애니메ì´ì…˜ì„ 사용하려면 \"Billboard Particles\"ì´ í™œì„±í™”ëœ "
+"SpatialMaterialì´ í•„ìš”í•©ë‹ˆë‹¤."
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr "PathFollow는 Path ë…¸ë“œì˜ ìžì‹ìœ¼ë¡œ ìžˆì„ ë•Œë§Œ ë™ìž‘합니다."
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr "OrientedPathFollow는 Path ë…¸ë“œì˜ ìžì‹ìœ¼ë¡œ ìžˆì„ ë•Œë§Œ ë™ìž‘합니다."
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+"OrientedPathFollow는 부모 Pathì˜ Curve 리소스ì—서 \"Up Vector\"를 활성화해야 "
+"합니다."
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9256,18 +9381,16 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid "This body will be ignored until you set a mesh"
-msgstr ""
+msgstr "ì´ ë°”ë””ëŠ” 메시를 설정할 때 까지 무시ë©ë‹ˆë‹¤"
#: scene/3d/soft_body.cpp
-#, fuzzy
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
-"(ìºë¦­í„°ë‚˜ 리지드 모드ì—서) RigidBodyì˜ í¬ê¸° ë³€ê²½ì€ ë¬¼ë¦¬ ì—”ì§„ì´ ìž‘ë™í•˜ëŠ” ë™ì•ˆ "
-"í° ë¶€ë‹´ì´ ë©ë‹ˆë‹¤.\n"
-"대신 ìžì‹ ì¶©ëŒ í˜•íƒœì˜ í¬ê¸°ë¥¼ 변경해보세요."
+"SoftBodyì˜ í¬ê¸° ë³€ê²½ì€ ì‹¤í–‰ ì¤‘ì— ë¬¼ë¦¬ ì—”ì§„ì— ì˜í•´ 무시ë©ë‹ˆë‹¤.\n"
+"대신 ìžì‹ì˜ ì¶©ëŒ í¬ê¸°ë¥¼ 변경하세요."
#: scene/3d/sprite_3d.cpp
msgid ""
@@ -9287,45 +9410,47 @@ msgstr ""
#: scene/animation/animation_blend_tree.cpp
msgid "On BlendTree node '%s', animation not found: '%s'"
-msgstr ""
+msgstr "BlendTree 노드 '%s' ì—서, 애니메ì´ì…˜ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ: '%s'"
#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "애니메ì´ì…˜ ë„구"
+msgstr "애니메ì´ì…˜ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ: '%s'"
#: scene/animation/animation_tree.cpp
msgid "In node '%s', invalid animation: '%s'."
-msgstr ""
+msgstr "노드 '%s' ì—서, 유효하지 ì•Šì€ ì• ë‹ˆë©”ì´ì…˜: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "ì—러: 유효하지 ì•Šì€ ì• ë‹ˆë©”ì´ì…˜ ì´ë¦„!"
+msgstr "유효하지 ì•Šì€ ì• ë‹ˆë©”ì´ì…˜: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "'%s'와 '%s'ì˜ ì—°ê²° í•´ì œ"
+msgstr "노드 '%s' ì˜ '%s' ìž…ë ¥ì— ì•„ë¬´ê²ƒë„ ì—°ê²°ë˜ì§€ 않ìŒ."
#: scene/animation/animation_tree.cpp
msgid "A root AnimationNode for the graph is not set."
-msgstr ""
+msgstr "ê·¸ëž˜í”„ì˜ ë£¨íŠ¸ AnimationNodeê°€ 설정ë˜ì§€ 않았습니다."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Path to an AnimationPlayer node containing animations is not set."
msgstr ""
-"애니메ì´ì…˜ íŽ¸ì§‘ì„ ìœ„í•´ì„œëŠ” 씬 트리ì—서 AnimationPlayer를 ì„ íƒí•´ì•¼ 합니다."
+"애니메ì´ì…˜ì„ ê°–ê³  있는 AnimationPlayer ë…¸ë“œì˜ ê²½ë¡œê°€ 설정ë˜ì§€ 않았습니다."
#: scene/animation/animation_tree.cpp
msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
msgstr ""
+"AnimationPlayerì— ëŒ€í•œ 경로 ì„¤ì •ì´ AnimationPlayer 노드를 향하고 있지 않습니"
+"다."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "AnimationPlayer root is not a valid node."
-msgstr "애니메ì´ì…˜ 트리가 유효하지 않습니다."
+msgstr "AnimationPlayer 루트가 유효한 노드가 아닙니다."
+
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+"ì´ ë…¸ë“œëŠ” ë” ì´ìƒ 사용할 수 없습니다. AnimationTree를 사용하시길 ë°”ëžë‹ˆë‹¤."
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
@@ -9343,10 +9468,6 @@ msgstr "경고!"
msgid "Please Confirm..."
msgstr "확ì¸í•´ì£¼ì„¸ìš”..."
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr "ì´ í´ë” ì„ íƒ"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9354,7 +9475,11 @@ msgid ""
"hide upon running."
msgstr ""
"Popupì€ popup() ë˜ëŠ” 기타 popup*() 함수를 호출하기 전까지는 기본ì ìœ¼ë¡œ 숨겨집"
-"니다. í™”ë©´ì„ íŽ¸ì§‘í•˜ëŠ” ë™ì•ˆ 보여지ë„ë¡ í•  수는 있으나, 실행시ì—는 숨겨집니다."
+"니다. 편집하는 ë™ì•ˆ 보여지ë„ë¡ í•  수는 있으나, 실행 시ì—는 숨겨집니다."
+
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr "exp_editì´ ì°¸ì´ë¼ë©´ min_value는 반드시 > 0 ì´ì–´ì•¼ 합니다."
#: scene/gui/scroll_container.cpp
msgid ""
@@ -9363,8 +9488,8 @@ msgid ""
"minimum size manually."
msgstr ""
"ScrollContainer는 ë‹¨ì¼ ìžì‹ ì»¨íŠ¸ë¡¤ì„ ìž‘ì—…í•˜ê¸° 위한 것입니다.\n"
-"컨테ì´ë„ˆë¥¼ ìžì‹(VBox,HBox,등)으로 사용하거나, Controlì„ ìˆ˜ë™ìœ¼ë¡œ 지정한 최소 "
-"수치로 설정해서 사용하세요."
+"컨테ì´ë„ˆë¥¼ ìžì‹ (VBox,HBox,등)으로 사용하거나, Controlì„ ìˆ˜ë™ìœ¼ë¡œ 지정한 최"
+"소 수치로 설정해서 사용하세요."
#: scene/gui/tree.cpp
msgid "(Other)"
@@ -9375,8 +9500,8 @@ msgid ""
"Default Environment as specified in Project Settings (Rendering -> "
"Environment -> Default Environment) could not be loaded."
msgstr ""
-"Project Setings(ë Œë”ë§ -> 환경 -> 기본 환경)ì— ì§€ì •ëœ ê¸°ë³¸ í™˜ê²½ì€ ë¡œë“œí•  수 "
-"없습니다."
+"프로ì íЏ 설정 (Rendering -> Environment -> Default Environment)ì— ì§€ì •ëœ ê¸°"
+"본 í™˜ê²½ì€ ë¶ˆëŸ¬ì˜¬ 수 없습니다."
#: scene/main/viewport.cpp
msgid ""
@@ -9385,7 +9510,7 @@ msgid ""
"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
"texture to some node for display."
msgstr ""
-"ë·°í¬íŠ¸ê°€ ë Œë” ëŒ€ìƒìœ¼ë¡œ 설정ë˜ì§€ 않았습니다. ë·°í¬íŠ¸ì˜ ë‚´ìš©ì„ í™”ë©´ìƒì— ì§ì ‘ 표"
+"ë·°í¬íŠ¸ê°€ ë Œë” ëŒ€ìƒìœ¼ë¡œ 설정ë˜ì§€ 않았습니다. ë·°í¬íŠ¸ì˜ ë‚´ìš©ì„ í™”ë©´ ìƒì— ì§ì ‘ 표"
"ì‹œí•˜ê³ ìž í•  경우, í¬ê¸°ë¥¼ 얻기 위해서 Controlì˜ ìžì‹ 노드로 만들어야 합니다. "
"그렇지 ì•Šì„ ê²½ìš°, í™”ë©´ì— í‘œì‹œí•˜ê¸° 위해서는 RenderTarget으로 설정하고 ë‚´ë¶€ì "
"ì¸ í…스ì³ë¥¼ 다른 ë…¸ë“œì— í• ë‹¹í•´ì•¼ 합니다."
@@ -9407,31 +9532,223 @@ msgid "Invalid font size."
msgstr "유효하지 ì•Šì€ í°íЏ í¬ê¸°."
#: scene/resources/visual_shader.cpp
-#, fuzzy
msgid "Input"
-msgstr "입력 추가"
-
-#: scene/resources/visual_shader.cpp
-#, fuzzy
-msgid "None"
-msgstr "<ì—†ìŒ>"
+msgstr "ìž…ë ¥"
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for shader."
-msgstr "유효하지 ì•Šì€ ì†ŒìŠ¤!"
+msgstr "ì…°ì´ë”ì— ìœ íš¨í•˜ì§€ ì•Šì€ ì†ŒìŠ¤."
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
-msgstr ""
+msgstr "í•¨ìˆ˜ì— ë°°ì¹˜í•¨."
#: servers/visual/shader_language.cpp
msgid "Assignment to uniform."
-msgstr ""
+msgstr "ê· ì¼í•˜ê²Œ 배치함."
#: servers/visual/shader_language.cpp
msgid "Varyings can only be assigned in vertex function."
-msgstr ""
+msgstr "Varyings는 ì˜¤ì§ ë²„í…스 함수ì—서만 지정할 수 있습니다."
+
+#~ msgid "Split point with itself."
+#~ msgstr "ìžì²´ì ìœ¼ë¡œ í¬ì¸íЏ ë¶„í• ."
+
+#~ msgid "Split can't form an existing edge."
+#~ msgstr "ë¶„í• ì€ ì¡´ìž¬í•˜ëŠ” 모서리를 형성할 수 없습니다."
+
+#~ msgid "Split already exists."
+#~ msgstr "ì´ë¯¸ ë¶„í• ë˜ì—ˆìŠµë‹ˆë‹¤."
+
+#~ msgid "Add Split"
+#~ msgstr "분할 추가"
+
+#~ msgid "Invalid Split: "
+#~ msgstr "유효하지 ì•Šì€ ë¶„í• : "
+
+#~ msgid "Remove Split"
+#~ msgstr "분할 삭제"
+
+#~ msgid "Poly"
+#~ msgstr "í´ë¦¬"
+
+#~ msgid "Splits"
+#~ msgstr "ë¶„í• "
+
+#~ msgid "Connect two points to make a split."
+#~ msgstr "ë‘ í¬ì¸íŠ¸ë¥¼ 연결하여 나누기."
+
+#~ msgid "Select a split to erase it."
+#~ msgstr "지우기 위한 ë¶„í•  위치를 ì„ íƒí•˜ê¸°."
+
+#~ msgid "No name provided"
+#~ msgstr "ì´ë¦„ì´ ì§€ì •ë˜ì§€ 않ìŒ"
+
+#~ msgid "Add Node.."
+#~ msgstr "노드 추가.."
+
+#~ msgid "Create from scene?"
+#~ msgstr "씬으로부터 만드시겠습니까?"
+
+#~ msgid "Create Poly"
+#~ msgstr "í´ë¦¬ê³¤ 만들기"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "처ìŒë¶€í„° 새로운 í´ë¦¬ê³¤ 만들기"
+
+#~ msgid "Zoom out"
+#~ msgstr "축소"
+
+#~ msgid "Zoom in"
+#~ msgstr "확대"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "í´ë¦¬ê³¤3D 만들기"
+
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "ì´ ë…¸ë“œì— OccluderPolygon2D 리소스가 없습니다.\n"
+#~ "새로 만들어서 지정하시겠습니까?"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "좌í´ë¦­: í¬ì¸íЏ ì´ë™."
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "Ctrl+좌í´ë¦­: ì„ ë¶„ ë¶„í• ."
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "ìš°í´ë¦­: í¬ì¸íЏ ì‚­ì œ."
+
+#~ msgid "New TextFile"
+#~ msgstr "새 í…스트 파ì¼"
+
+#~ msgid "Save Theme As"
+#~ msgstr "테마 다른 ì´ë¦„으로 저장"
+
+#~ msgid "<None>"
+#~ msgstr "<ì—†ìŒ>"
+
+#~ msgid ""
+#~ "Select sub-tile to use as icon, this will be also used on invalid "
+#~ "autotile bindings."
+#~ msgstr ""
+#~ "사용할 서브 타ì¼ì„ ì•„ì´ì½˜ìœ¼ë¡œ 설정하세요, 효력없는 ìžë™íƒ€ì¼ ë°”ì¸ë”©ì—ë„ ì‚¬"
+#~ "ìš©ë©ë‹ˆë‹¤."
+
+#~ msgid "Zoom:"
+#~ msgstr "확대:"
+
+#~ msgid "Are you sure you want to remove all connections from the \""
+#~ msgstr "\" ì—서 모든 ì—°ê²°ì„ ì œê±°í•˜ì‹œê² ìŠµë‹ˆê¹Œ"
+
+#~ msgid "Class List:"
+#~ msgstr "í´ëž˜ìФ 목ë¡:"
+
+#~ msgid "Search Classes"
+#~ msgstr "í´ëž˜ìФ 검색"
+
+#~ msgid "Public Methods"
+#~ msgstr "공개 메서드"
+
+#~ msgid "Public Methods:"
+#~ msgstr "공개 메서드:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "GUI 테마 항목"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "GUI 테마 항목:"
+
+#~ msgid "Property: "
+#~ msgstr "ì†ì„±: "
+
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "í´ë”를 ì¦ê²¨ì°¾ê¸°ë¡œ 설정."
+
+#~ msgid "Show current scene file."
+#~ msgstr "현재 씬 파ì¼ì„ 보여줌."
+
+#~ msgid "Enter tree-view."
+#~ msgstr "트리 보기로 가기."
+
+#~ msgid "Whole words"
+#~ msgstr "전체 단어"
+
+#~ msgid "Match case"
+#~ msgstr "ëŒ€ì†Œë¬¸ìž êµ¬ë¶„"
+
+#~ msgid "Filter: "
+#~ msgstr "í•„í„°: "
+
+#~ msgid "Ok"
+#~ msgstr "확ì¸"
+
+#~ msgid "Show In File System"
+#~ msgstr "íŒŒì¼ ì‹œìŠ¤í…œì—서 보기"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "í´ëž˜ìФ 계층 검색."
+
+#~ msgid "Search in files"
+#~ msgstr "파ì¼ì—서 검색"
+
+#~ msgid ""
+#~ "Built-in scripts can only be edited when the scene they belong to is "
+#~ "loaded"
+#~ msgstr "내장 스í¬ë¦½íŠ¸ëŠ” 종ì†ëœ ì”¬ì´ ì—´ë¦° ìƒíƒœì—서만 íŽ¸ì§‘ì´ ê°€ëŠ¥í•©ë‹ˆë‹¤"
+
+#~ msgid "Convert To Uppercase"
+#~ msgstr "대문ìžë¡œ 변환"
+
+#~ msgid "Convert To Lowercase"
+#~ msgstr "소문ìžë¡œ 변환"
+
+#~ msgid "Snap To Floor"
+#~ msgstr "ë°”ë‹¥ì— ìŠ¤ëƒ…"
+
+#~ msgid "Rotate 0 degrees"
+#~ msgstr "0ë„ íšŒì „"
+
+#~ msgid "Rotate 90 degrees"
+#~ msgstr "90ë„ íšŒì „"
+
+#~ msgid "Rotate 180 degrees"
+#~ msgstr "180ë„ íšŒì „"
+
+#~ msgid "Rotate 270 degrees"
+#~ msgstr "270ë„ íšŒì „"
+
+#~ msgid "Warning"
+#~ msgstr "경고"
+
+#~ msgid "Error:"
+#~ msgstr "ì—러:"
+
+#~ msgid "Source:"
+#~ msgstr "소스:"
+
+#~ msgid "Function:"
+#~ msgstr "함수:"
+
+#~ msgid "Variable"
+#~ msgstr "변수"
+
+#~ msgid "Errors:"
+#~ msgstr "ì—러:"
+
+#~ msgid "Stack Trace (if applicable):"
+#~ msgstr "ìŠ¤íƒ ì¶”ì  (해당ë˜ëŠ” 경우):"
+
+#~ msgid "Bake!"
+#~ msgstr "굽기!"
+
+#~ msgid "Bake the navigation mesh."
+#~ msgstr "네비게ì´ì…˜ 메시 만들기."
+
+#~ msgid "Get"
+#~ msgstr "Get"
#~ msgid "Change Scalar Constant"
#~ msgstr "Scalar ìƒìˆ˜ 변경"
@@ -9455,7 +9772,7 @@ msgstr ""
#~ msgstr "RGB ì—°ì‚°ìž ë³€ê²½"
#~ msgid "Toggle Rot Only"
-#~ msgstr "회전만 토글"
+#~ msgstr "ì˜¤ì§ íšŒì „ 토글"
#~ msgid "Change Scalar Function"
#~ msgstr "Scalar 함수 변경"
@@ -9637,9 +9954,6 @@ msgstr ""
#~ msgid "Run Script"
#~ msgstr "스í¬ë¦½íЏ 실행"
-#~ msgid "Save the currently edited resource."
-#~ msgstr "현재 íŽ¸ì§‘ëœ ë¦¬ì†ŒìŠ¤ 저장."
-
#~ msgid "Stop Profiling"
#~ msgstr "프로파ì¼ë§ 중지"
@@ -9924,9 +10238,6 @@ msgstr ""
#~ msgid "Could not save atlas subtexture:"
#~ msgstr "ì•„í‹€ë¼ìФ 서브 í…스ì³ë¥¼ 저장할 수 없습니다:"
-#~ msgid "Exporting for %s"
-#~ msgstr "%s 내보내기"
-
#~ msgid "Setting Up..."
#~ msgstr "설정 중..."
@@ -10025,9 +10336,6 @@ msgstr ""
#~ msgid "Source Font:"
#~ msgstr "소스 í°íЏ:"
-#~ msgid "Source Font Size:"
-#~ msgstr "소스 í°íЏ í¬ê¸°:"
-
#~ msgid "Dest Resource:"
#~ msgstr "리소스 경로:"
@@ -10104,9 +10412,6 @@ msgstr ""
#~ msgid "Start(s)"
#~ msgstr "시작(초)"
-#~ msgid "Filters"
-#~ msgstr "í•„í„°"
-
#~ msgid "Source path is empty."
#~ msgstr "소스 경로가 비어있습니다."
@@ -10378,15 +10683,9 @@ msgstr ""
#~ msgid "Stereo"
#~ msgstr "스테레오"
-#~ msgid "Pitch"
-#~ msgstr "피치"
-
#~ msgid "Window"
#~ msgstr "윈ë„ìš°"
-#~ msgid "Move Right"
-#~ msgstr "오른쪽으로 ì´ë™"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "%s%%로 í¬ê¸° 변경."
@@ -10729,21 +11028,6 @@ msgstr ""
#~ msgid "Trailing Silence:"
#~ msgstr "ëì˜ ë¬´ìŒ:"
-#~ msgid "Script Export Mode:"
-#~ msgstr "스í¬ë¦½íЏ 내보내기 모드:"
-
-#~ msgid "Text"
-#~ msgstr "í…스트"
-
-#~ msgid "Compiled"
-#~ msgstr "컴파ì¼"
-
-#~ msgid "Encrypted (Provide Key Below)"
-#~ msgstr "암호화 (ì•„ëž˜ì— í‚¤ê°’ í•„ìš”)"
-
-#~ msgid "Script Encryption Key (256-bits as hex):"
-#~ msgstr "스í¬ë¦½íЏ 암호 키 (256-비트를 hex í¬ë©§ìœ¼ë¡œ):"
-
#~ msgid "Export Project PCK"
#~ msgstr "프로ì íЏ PCK 내보내기"
@@ -10753,9 +11037,6 @@ msgstr ""
#~ msgid "Project Export"
#~ msgstr "프로ì íЏ 내보내기"
-#~ msgid "Export Preset:"
-#~ msgstr "프리셋 내보내기:"
-
#~ msgid "BakedLightInstance does not contain a BakedLight resource."
#~ msgstr "BakedLightInstance가 BakedLight 리소스를 가지고 있지 않습니다."
@@ -10833,13 +11114,6 @@ msgstr ""
#~ msgid "Scale Region Editor"
#~ msgstr "ìŠ¤ì¼€ì¼ êµ¬ì—­ 편집기"
-#~ msgid ""
-#~ "No texture in this node.\n"
-#~ "Set a texture to be able to edit region."
-#~ msgstr ""
-#~ "ì´ ë…¸ë“œì— í…스ì³ê°€ 없습니다.\n"
-#~ "êµ¬ì—­ì„ íŽ¸ì§‘í•˜ê¸° 위해서는 í…스ì³ë¥¼ 지정해야합니다."
-
#~ msgid "Inherit Scene"
#~ msgstr "ìƒì† 씬"
diff --git a/editor/translations/lt.po b/editor/translations/lt.po
index f646555da2..7bea51f4f5 100644
--- a/editor/translations/lt.po
+++ b/editor/translations/lt.po
@@ -1,22 +1,24 @@
# Lithuanian translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# Ignas Kiela <ignaskiela@super.lt>, 2017.
# Kornelijus <kornelijus.github@gmail.com>, 2017, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-06-12 09:40+0000\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:41+0100\n"
"Last-Translator: Kornelijus <kornelijus.github@gmail.com>\n"
"Language-Team: Lithuanian <https://hosted.weblate.org/projects/godot-engine/"
"godot/lt/>\n"
"Language: lt\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=n==1 ? 0 : n%10>=2 && (n%100<10 || n"
"%100>=20) ? 1 : n%10==0 || (n%100>10 && n%100<20) ? 2 : 3;\n"
-"X-Generator: Weblate 3.0.1\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -24,7 +26,7 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr ""
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
@@ -258,7 +260,6 @@ msgstr ""
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -389,8 +390,7 @@ msgstr ""
msgid "Scale From Cursor"
msgstr ""
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr ""
@@ -404,11 +404,11 @@ msgid "Delete Selection"
msgstr "Panaikinti pasirinkimÄ…"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+msgid "Go to Next Step"
msgstr ""
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+msgid "Go to Previous Step"
msgstr ""
#: editor/animation_track_editor.cpp
@@ -511,11 +511,11 @@ msgstr ""
msgid "Replaced %d occurrence(s)."
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr ""
@@ -531,15 +531,19 @@ msgstr ""
msgid "Selection Only"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Priartinti"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "Nutolinti"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "Atstatyti PriartinimÄ…"
@@ -548,11 +552,10 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "Priartinti"
+msgid "Font Size:"
+msgstr ""
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Linija:"
@@ -585,6 +588,7 @@ msgstr "PridÄ—ti"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -664,7 +668,7 @@ msgid "Edit Connection: "
msgstr ""
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -713,23 +717,20 @@ msgid "Recent:"
msgstr "Naujausi:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr ""
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr ""
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "Aprašymas:"
@@ -764,8 +765,7 @@ msgid "Resource"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr ""
@@ -786,9 +786,10 @@ msgid "Search Replacement Resource:"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -818,7 +819,7 @@ msgid "Error loading:"
msgstr ""
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+msgid "Load failed due to missing dependencies:"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -877,14 +878,6 @@ msgstr ""
msgid "Thanks from the Godot community!"
msgstr ""
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr ""
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr ""
@@ -974,7 +967,7 @@ msgid "Uncompressing Assets"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+msgid "Package installed successfully!"
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1056,8 +1049,7 @@ msgid "Bus options"
msgstr ""
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "Duplikuoti"
@@ -1216,7 +1208,7 @@ msgid "Add AutoLoad"
msgstr ""
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr ""
@@ -1224,8 +1216,8 @@ msgstr ""
msgid "Node Name:"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr ""
@@ -1295,24 +1287,30 @@ msgid "Template file not found:"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "File Exists, Overwrite?"
+msgid "Select Current Folder"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
+msgid "File Exists, Overwrite?"
msgstr ""
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+#, fuzzy
+msgid "Select This Folder"
+msgstr "Pasirinkite Nodus, kuriuos norite importuoti"
+
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-msgid "Open In File Manager"
-msgstr ""
+#, fuzzy
+msgid "Open in File Manager"
+msgstr "Atidaryti"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+msgid "Show in File Manager"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1348,7 +1346,8 @@ msgid "Open a File or Directory"
msgstr ""
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr ""
@@ -1406,8 +1405,7 @@ msgstr ""
msgid "Preview:"
msgstr ""
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr ""
@@ -1423,24 +1421,11 @@ msgstr ""
msgid "(Re)Importing Assets"
msgstr ""
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr ""
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr ""
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr ""
@@ -1457,27 +1442,27 @@ msgid "Brief Description:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Members"
+msgid "Properties"
msgstr ""
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
+#: editor/editor_help.cpp
+msgid "Properties:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
+msgid "Methods"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods:"
+msgid "Methods:"
msgstr ""
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
+msgid "Theme Properties"
msgstr ""
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
+msgid "Theme Properties:"
msgstr ""
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
@@ -1505,8 +1490,14 @@ msgid "Constants:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Description"
-msgstr ""
+#, fuzzy
+msgid "Class Description"
+msgstr "Aprašymas:"
+
+#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
+msgstr "Aprašymas:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1520,12 +1511,14 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr ""
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "Aprašymas:"
#: editor/editor_help.cpp
-msgid "Property Description:"
-msgstr ""
+#, fuzzy
+msgid "Property Descriptions:"
+msgstr "Aprašymas:"
#: editor/editor_help.cpp
msgid ""
@@ -1534,12 +1527,14 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr ""
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "Aprašymas:"
#: editor/editor_help.cpp
-msgid "Method Description:"
-msgstr ""
+#, fuzzy
+msgid "Method Descriptions:"
+msgstr "Aprašymas:"
#: editor/editor_help.cpp
msgid ""
@@ -1547,11 +1542,54 @@ msgid ""
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-#: editor/editor_inspector.cpp
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "Signalai"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Constants Only"
+msgstr "Konstanta"
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
msgstr ""
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr ""
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1585,6 +1623,11 @@ msgstr ""
msgid "Error saving resource!"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr ""
@@ -1639,10 +1682,20 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr ""
@@ -1870,6 +1923,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1910,6 +1969,11 @@ msgstr ""
msgid "Default"
msgstr ""
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Play This Scene"
msgstr ""
@@ -1992,7 +2056,7 @@ msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2021,7 +2085,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -2045,7 +2109,7 @@ msgstr ""
msgid "Export"
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr ""
@@ -2058,6 +2122,7 @@ msgid "Quit to Project List"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr ""
@@ -2165,10 +2230,6 @@ msgstr ""
msgid "Help"
msgstr ""
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2262,21 +2323,21 @@ msgstr ""
msgid "Disable Update Spinner"
msgstr ""
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr ""
#: editor/editor_node.cpp
-msgid "Node"
+msgid "FileSystem"
msgstr ""
#: editor/editor_node.cpp
-msgid "FileSystem"
+msgid "Inspector"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Node"
msgstr ""
#: editor/editor_node.cpp
@@ -2416,7 +2477,7 @@ msgstr "Kadro %"
msgid "Physics Frame %"
msgstr "Fizikos Kadro %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "TrukmÄ—:"
@@ -2441,7 +2502,7 @@ msgstr "TrukmÄ—:"
msgid "Calls"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2453,20 +2514,44 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "Netinkamas šrifto dydis."
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr ""
@@ -2478,10 +2563,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2490,7 +2571,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr ""
@@ -2776,6 +2858,11 @@ msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr ""
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "MÄ—gstamiausi:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
@@ -2813,8 +2900,8 @@ msgstr "Duplikuoti"
msgid "Unable to update dependencies:"
msgstr ""
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2822,10 +2909,6 @@ msgid "Provided name contains invalid characters"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr ""
@@ -2852,27 +2935,20 @@ msgid "Duplicating folder:"
msgstr "Duplikuoti"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
+msgid "Open Scene(s)"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Move To..."
+msgid "Instance"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Open Scene(s)"
-msgstr ""
+#, fuzzy
+msgid "Add to favorites"
+msgstr "MÄ—gstamiausi:"
#: editor/filesystem_dock.cpp
-msgid "Instance"
+msgid "Remove from favorites"
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2883,12 +2959,20 @@ msgstr ""
msgid "View Owners..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr ""
+
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Duplicate..."
msgstr "Duplikuoti"
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -2896,6 +2980,14 @@ msgstr ""
msgid "New Resource..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr ""
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -2916,11 +3008,11 @@ msgid "Re-Scan Filesystem"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Toggle folder status as Favorite."
+msgid "Toggle split mode"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Show current scene file."
+msgid "Search files"
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2928,20 +3020,12 @@ msgid "Instance the selected scene(s) as child of the selected node."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Search files"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
msgstr ""
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr ""
@@ -2958,28 +3042,21 @@ msgid "Create Script"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Find in files"
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Find: "
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Whole words"
-msgstr ""
+#, fuzzy
+msgid "Find in Files"
+msgstr "Filtrai..."
#: editor/find_in_files.cpp
-msgid "Match case"
+msgid "Find:"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Folder: "
+msgid "Folder:"
msgstr ""
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Filter: "
+msgid "Filters:"
msgstr "Filtrai..."
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -2996,6 +3073,10 @@ msgid "Cancel"
msgstr "Atšaukti"
#: editor/find_in_files.cpp
+msgid "Find: "
+msgstr ""
+
+#: editor/find_in_files.cpp
msgid "Replace: "
msgstr ""
@@ -3017,7 +3098,7 @@ msgstr ""
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr "Netinkamas šrifto dydis."
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3153,17 +3234,12 @@ msgstr ""
msgid "Failed to load resource."
msgstr ""
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr ""
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+msgid "Collapse All Properties"
msgstr ""
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3208,6 +3284,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr ""
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr ""
@@ -3271,44 +3351,45 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
-msgstr ""
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
+msgstr "Keisti Poligono SkalÄ™"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
-msgstr ""
+#, fuzzy
+msgid "Edit Polygon"
+msgstr "Priedai"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+msgid "Remove Polygon And Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr ""
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr "Sukurti"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3323,7 +3404,7 @@ msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Load.."
+msgid "Load..."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3352,13 +3433,8 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Sukurti"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-msgid "Erase points."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3399,9 +3475,8 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3435,7 +3510,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add Node.."
+msgid "Add Node..."
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3710,7 +3785,7 @@ msgstr "Prijunkite prie Nodo:"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "Panaikinti pasirinkimÄ…"
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3780,10 +3855,6 @@ msgid "Amount:"
msgstr "Kiekis:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr ""
@@ -3984,7 +4055,7 @@ msgstr "Visi"
msgid "Plugins"
msgstr "Priedai"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr ""
@@ -4108,6 +4179,10 @@ msgid "Resize CanvasItem"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
msgstr ""
@@ -4128,21 +4203,19 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "Nutolinti"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "Nutolinti"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Priartinti"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4171,6 +4244,11 @@ msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "TimeScale Nodas"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4265,6 +4343,10 @@ msgid "Restores the object's children's ability to be selected."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr ""
@@ -4315,6 +4397,10 @@ msgid "Show Viewport"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr ""
@@ -4383,7 +4469,16 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "Keisti Poligono SkalÄ™"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
msgstr ""
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
@@ -4485,35 +4580,9 @@ msgid "Item List Editor"
msgstr ""
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr ""
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr ""
@@ -4745,12 +4814,12 @@ msgid "Populate"
msgstr ""
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
+msgid "Generating Visibility Rect"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -4779,6 +4848,11 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr ""
@@ -4848,11 +4922,11 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Convert to CPUParticles"
+msgid "Generate AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -4877,6 +4951,10 @@ msgid "Add Point to Curve"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr ""
@@ -4904,6 +4982,10 @@ msgid "Click: Add Point"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr ""
@@ -4919,11 +5001,6 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr ""
@@ -4980,6 +5057,10 @@ msgstr ""
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
msgid "Move joint"
msgstr ""
@@ -4990,7 +5071,14 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync bones"
+#, fuzzy
+msgid "Sync Bones"
+msgstr "Keisti Poligono SkalÄ™"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5003,40 +5091,46 @@ msgid "Create Polygon & UV"
msgstr "Keisti Poligono SkalÄ™"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
+msgid "Create Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split already exists."
+msgid "Remove Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Add Split"
+msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "Netinkamas šrifto dydis."
+msgid "Add Custom Polygon"
+msgstr "Priedai"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Panaikinti pasirinkimÄ…"
+msgid "Remove Custom Polygon"
+msgstr "Keisti Poligono SkalÄ™"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
+#, fuzzy
+msgid "Transform Polygon"
+msgstr "Keisti Poligono SkalÄ™"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Open Polygon 2D UV editor."
+msgstr "Atidaryti 2D Editorių"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
msgstr ""
@@ -5045,24 +5139,20 @@ msgid "UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Poly"
+msgid "Points"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Splits"
-msgstr ""
+#, fuzzy
+msgid "Polygons"
+msgstr "Priedai"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Bones"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Create Polygon"
-msgstr "Keisti Poligono SkalÄ™"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Move Points"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5090,19 +5180,21 @@ msgid "Scale Polygon"
msgstr "Keisti Poligono SkalÄ™"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Select a split to erase it"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5126,6 +5218,11 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr ""
@@ -5184,22 +5281,22 @@ msgid "Paste Resource"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr ""
@@ -5229,6 +5326,10 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Error could not load file."
msgstr ""
@@ -5238,20 +5339,24 @@ msgid "Error saving file!"
msgstr "Įvyko klaida kraunant šriftą."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr ""
+#, fuzzy
+msgid "Error while saving theme."
+msgstr "Įvyko klaida kraunant šriftą."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
-msgstr ""
+#, fuzzy
+msgid "Error Saving"
+msgstr "Įvyko klaida kraunant šriftą."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr ""
+#, fuzzy
+msgid "Error importing theme."
+msgstr "Įvyko klaida kraunant šriftą."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
-msgstr ""
+#, fuzzy
+msgid "Error Importing"
+msgstr "Įvyko klaida kraunant šriftą."
#: editor/plugins/script_editor_plugin.cpp
msgid "New TextFile..."
@@ -5272,6 +5377,14 @@ msgid "Import Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr ""
@@ -5312,8 +5425,9 @@ msgid "File"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile"
-msgstr ""
+#, fuzzy
+msgid "Open..."
+msgstr "Atidaryti"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5328,11 +5442,7 @@ msgid "Copy Script Path"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+msgid "History Previous"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5345,15 +5455,16 @@ msgid "Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Reload Theme"
-msgstr ""
+#, fuzzy
+msgid "Import Theme..."
+msgstr "Importuoti Animacijas..."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme"
+msgid "Reload Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
+msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5403,7 +5514,7 @@ msgid "Keep Debugger Open"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5411,10 +5522,6 @@ msgid "Open Godot online documentation"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -5449,16 +5556,7 @@ msgid "Debugger"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search results"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search in files"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgid "Search Results"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5471,6 +5569,14 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr ""
@@ -5502,10 +5608,6 @@ msgstr ""
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5557,11 +5659,11 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5578,19 +5680,11 @@ msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
+msgid "Go to Next Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
+msgid "Go to Previous Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5599,15 +5693,15 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr "Filtrai..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+msgid "Go to Function..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5699,6 +5793,14 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -5863,6 +5965,10 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -5963,10 +6069,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap To Floor"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6083,6 +6185,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
msgstr ""
@@ -6198,11 +6304,16 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6366,6 +6477,11 @@ msgid "Fix Invalid Tiles"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "Panaikinti pasirinkimÄ…"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6411,32 +6527,38 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "Panaikinti pasirinkimÄ…"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
+msgid "Rotate left"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
+msgid "Rotate right"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Flip vertically"
msgstr ""
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Clear transform"
+msgstr "Animacija: Pakeisti TransformacijÄ…"
+
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove current Texture from TileSet"
-msgstr ""
+#, fuzzy
+msgid "Remove selected Texture from TileSet."
+msgstr "Panaikinti pasirinkimÄ…"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -6447,25 +6569,45 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Erase bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "Keisti Poligono SkalÄ™"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "Panaikinti pasirinkimÄ…"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6473,7 +6615,12 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Panaikinti pasirinkimÄ…"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6483,15 +6630,25 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "Panaikinti pasirinkimÄ…"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "Keisti Poligono SkalÄ™"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr ""
@@ -6509,11 +6666,94 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Sukurti"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "Redaguoti Filtrus"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Priedai"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Priedai"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Priedai"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Panaikinti"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "Redaguoti Filtrus"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Keisti Poligono SkalÄ™"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Keisti Poligono SkalÄ™"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "This property can't be changed."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
+msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6549,6 +6789,14 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6557,6 +6805,11 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "Importuoti iš Nodo:"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6611,10 +6864,49 @@ msgid "Feature List:"
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "Atidaryti Skriptų Editorių"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Script Export Mode:"
+msgstr "Importuoti iš Nodo:"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export mode?"
+msgstr "Importuoti iš Nodo:"
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -6745,7 +7037,7 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
-msgid "Can't open project"
+msgid "Can't open project at '%s'."
msgstr ""
#: editor/project_manager.cpp
@@ -6754,6 +7046,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7067,10 +7377,6 @@ msgstr ""
msgid "General"
msgstr ""
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7204,10 +7510,6 @@ msgstr ""
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr ""
@@ -7294,7 +7596,7 @@ msgid "Step"
msgstr "Žingsnis(iai):"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7303,7 +7605,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7344,7 +7646,7 @@ msgstr ""
msgid "Reset"
msgstr "Atstatyti PriartinimÄ…"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7403,6 +7705,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr ""
@@ -7439,6 +7745,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7511,15 +7823,15 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Delete Node(s)"
+msgid "Open documentation"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Add Child Node"
+msgid "Delete Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -7527,6 +7839,11 @@ msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Extend Script"
+msgstr "Atidaryti Skriptų Editorių"
+
+#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
msgstr ""
@@ -7675,6 +7992,10 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -7763,19 +8084,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -7807,18 +8116,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -8015,7 +8312,7 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+msgid "Step argument is zero!"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
@@ -8237,11 +8534,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -8513,6 +8806,10 @@ msgid "Base Type:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr ""
@@ -8612,11 +8909,11 @@ msgid "Search VisualScript"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8694,6 +8991,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -8732,6 +9035,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -8849,6 +9158,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -8870,6 +9189,26 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -8902,7 +9241,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -8960,6 +9299,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr ""
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr ""
@@ -8976,10 +9319,6 @@ msgstr "Įspėjimas!"
msgid "Please Confirm..."
msgstr "Prašome Patvirtinti..."
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr ""
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -8987,6 +9326,10 @@ msgid ""
"hide upon running."
msgstr ""
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9032,10 +9375,6 @@ msgstr "Netinkamas šrifto dydis."
msgid "Input"
msgstr ""
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
@@ -9053,6 +9392,22 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "Panaikinti pasirinkimÄ…"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "Nutolinti"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "Priartinti"
+
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Priartinti"
+
#~ msgid "Disabled"
#~ msgstr "Išjungta"
diff --git a/editor/translations/lv.po b/editor/translations/lv.po
index 7dc72def39..849ae26500 100644
--- a/editor/translations/lv.po
+++ b/editor/translations/lv.po
@@ -1,21 +1,24 @@
# Latvian translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# Gustavs Porietis (pg829-) <porietisgustavs@gmail.com>, 2018.
+# Martch Zagorski <martchzagorski@gmail.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-07-28 12:39+0000\n"
-"Last-Translator: Gustavs Porietis (pg829-) <porietisgustavs@gmail.com>\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:41+0100\n"
+"Last-Translator: Martch Zagorski <martchzagorski@gmail.com>\n"
"Language-Team: Latvian <https://hosted.weblate.org/projects/godot-engine/"
"godot/lv/>\n"
"Language: lv\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= "
"19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n"
-"X-Generator: Weblate 3.1.1\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -23,14 +26,14 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr ""
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr ""
+msgstr "Nepietiekams skaits baitu lai dekodÄ“tu baitus vai nepareizs formÄts."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "NederÄ«ga ievade %i (nav padota) izteikumÄ"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
@@ -38,19 +41,19 @@ msgstr ""
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
-msgstr ""
+msgstr "Nederīgi operatoru %s, %s un %s operandi."
#: core/math/expression.cpp
msgid "Invalid index of type %s for base type %s"
-msgstr ""
+msgstr "NederÄ«gs %s tipa indekss bÄzes tipam %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "NederÄ«gs nosaukts indekss '%s' bÄzes tipam %s"
#: core/math/expression.cpp
msgid "Invalid arguments to construct '%s'"
-msgstr ""
+msgstr "Nderīgs arguments, lai izveidotu '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
@@ -59,11 +62,11 @@ msgstr ""
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
-msgstr ""
+msgstr "Bezmaksas"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "Balancēts"
#: editor/animation_bezier_editor.cpp
msgid "Mirror"
@@ -129,38 +132,36 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "Audio atskaņošanas celiņs"
#: editor/animation_track_editor.cpp
msgid "Animation Playback Track"
-msgstr ""
+msgstr "AnimÄcijas atskaņoÅ¡anas celiņs"
#: editor/animation_track_editor.cpp
msgid "Add Track"
-msgstr ""
+msgstr "Pievienot celiņu"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Length Time (seconds)"
-msgstr "AnimÄcijas garums (sekundÄ“s)."
+msgstr "AnimÄcijas Garums (sekundes)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "AnimÄcijas tÄlummaiņa."
+msgstr "AnimÄciju Cilpa"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Functions:"
-msgstr ""
+msgstr "Funkcijas:"
#: editor/animation_track_editor.cpp
msgid "Audio Clips:"
-msgstr ""
+msgstr "Audio klipi:"
#: editor/animation_track_editor.cpp
msgid "Anim Clips:"
-msgstr ""
+msgstr "AnimÄcijas klipi:"
#: editor/animation_track_editor.cpp
msgid "Toggle this track on/off."
@@ -172,7 +173,7 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Interpolation Mode"
-msgstr ""
+msgstr "InterpolÄcijas režīms"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
@@ -180,32 +181,31 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Remove this track."
-msgstr ""
+msgstr "Noņemt šo celiņu."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "Solis (ļi):"
+msgstr "Laiks (s): "
#: editor/animation_track_editor.cpp
msgid "Continuous"
-msgstr ""
+msgstr "NepÄrtraukti"
#: editor/animation_track_editor.cpp
msgid "Discrete"
-msgstr ""
+msgstr "Diskrēta"
#: editor/animation_track_editor.cpp
msgid "Trigger"
-msgstr ""
+msgstr "Trigeris"
#: editor/animation_track_editor.cpp
msgid "Capture"
-msgstr ""
+msgstr "Uztvert"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "TuvÄkais"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
@@ -214,7 +214,7 @@ msgstr "LineÄrs"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr ""
+msgstr "Kubisks"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
@@ -227,35 +227,32 @@ msgstr ""
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key"
-msgstr ""
+msgstr "Ievietot atslēgievietni"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "DublikÄta IzvÄ“le"
+msgstr "Dublicēt atslēgvietnes"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "Izdzēst"
+msgstr "Izdzēst atslēgvietnes"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
-msgstr ""
+msgstr "Noņemt animÄcijas celiņu"
#: editor/animation_track_editor.cpp
msgid "Create NEW track for %s and insert key?"
-msgstr ""
+msgstr "Izveidot JAUNU celiņu priekš %s un ievietot atslēgievietni?"
#: editor/animation_track_editor.cpp
msgid "Create %d NEW tracks and insert keys?"
-msgstr ""
+msgstr "Izveidot %d JAUNU celiņu un ievietot atslēgievietni?"
#: editor/animation_track_editor.cpp editor/create_dialog.cpp
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -263,23 +260,23 @@ msgstr "Izveidot"
#: editor/animation_track_editor.cpp
msgid "Anim Insert"
-msgstr ""
+msgstr "Anim ievietot"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
-msgstr ""
+msgstr "AnimationPlayer nevar animÄ“t pats sevi, tikai citi spÄ“lÄ“tÄji."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
-msgstr ""
+msgstr "Anim izveidot un ievietot"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Track & Key"
-msgstr ""
+msgstr "Anim ievietot celiņu un atslēgvietni"
#: editor/animation_track_editor.cpp
msgid "Anim Insert Key"
-msgstr ""
+msgstr "Anim ievietot atslēgievietni"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
@@ -292,18 +289,22 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"Audio celiņu var tikai rÄdÄ«t uz Å¡Äda tipa mezgliem:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "AnimÄcijas celiņi var norÄdÄ«t tikai uz AnimationPlayer mezgliem."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
-msgstr ""
+msgstr "AnimÄcijas atskaņotÄjs nevar animÄ“t pats sevi, tikai citi spÄ“lÄ“tÄji."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "Nevar izveidot jaunu celiņu bez saknes"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
@@ -319,19 +320,19 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Method not found in object: "
-msgstr ""
+msgstr "Metode netika atrasta objektÄ: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
-msgstr ""
+msgstr "Anim pÄrvietot atslÄ“gievietnes"
#: editor/animation_track_editor.cpp
msgid "Clipboard is empty"
-msgstr ""
+msgstr "Starpliktuve ir tukša"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
-msgstr ""
+msgstr "Anim pÄrvietot atslÄ“gievietnes"
#: editor/animation_track_editor.cpp
msgid ""
@@ -340,21 +341,20 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "RÄdÄ«t celiņus tikai no mezgliem izvÄ“lÄ“tajÄ kokÄ."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
msgstr ""
+"SagrupÄ“t celiņus atkarÄ«bÄ no mezgliem vai rÄdÄ«t tos vienkÄrÅ¡Ä sarakstÄ."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap (s): "
-msgstr "Solis (ļi):"
+msgstr "Solis (s): "
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "AnimÄcijas tÄlummaiņa."
+msgstr "AnimÄcijas soļa vÄ“rtÄ«ba."
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -363,54 +363,53 @@ msgstr "AnimÄcijas tÄlummaiņa."
#: editor/project_manager.cpp editor/project_settings_editor.cpp
#: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp
msgid "Edit"
-msgstr ""
+msgstr "Rediģēt"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "AnimÄcijas tÄlummaiņa."
+msgstr "AnimÄcijas Ä«pašības."
#: editor/animation_track_editor.cpp
msgid "Copy Tracks"
-msgstr ""
+msgstr "Kopēt celiņus"
#: editor/animation_track_editor.cpp
msgid "Paste Tracks"
-msgstr ""
+msgstr "Ielīmēt celiņus"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
-msgstr ""
+msgstr "Mēroga Izvēle"
#: editor/animation_track_editor.cpp
msgid "Scale From Cursor"
-msgstr ""
+msgstr "Skala No Kursora"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "DublikÄta IzvÄ“le"
#: editor/animation_track_editor.cpp
msgid "Duplicate Transposed"
-msgstr ""
+msgstr "DublicÄ“t transponÄ“juÅ¡Äs"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
-msgstr "DublikÄta IzvÄ“le"
+msgstr "Dzēst izvēlētos"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+#, fuzzy
+msgid "Go to Next Step"
msgstr "Doties uz nÄkamo soli"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+#, fuzzy
+msgid "Go to Previous Step"
msgstr "Doties uz iepriekšējo soli"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
-msgstr ""
+msgstr "OptimizÄ“t animÄciju"
#: editor/animation_track_editor.cpp
msgid "Clean-Up Animation"
@@ -418,7 +417,7 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "IzvÄ“lies mezglu, kurÄ tiks animÄ“ta:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
@@ -426,7 +425,7 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
-msgstr ""
+msgstr "Anim. OptimizÄ“tÄjs"
#: editor/animation_track_editor.cpp
msgid "Max. Linear Error:"
@@ -508,11 +507,11 @@ msgstr ""
msgid "Replaced %d occurrence(s)."
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr ""
@@ -528,15 +527,19 @@ msgstr ""
msgid "Selection Only"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "PietuvinÄt"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "AttÄlinÄt"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "AtiestatÄ«t tÄlummaiņu"
@@ -545,11 +548,10 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "PietuvinÄt"
+msgid "Font Size:"
+msgstr ""
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Rinda:"
@@ -580,6 +582,7 @@ msgstr "Pievienot"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -659,7 +662,7 @@ msgid "Edit Connection: "
msgstr ""
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -705,23 +708,20 @@ msgid "Recent:"
msgstr "Nesenie:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Meklēt:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr ""
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "Apraksts:"
@@ -756,8 +756,7 @@ msgid "Resource"
msgstr "Resurs"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr ""
@@ -778,9 +777,10 @@ msgid "Search Replacement Resource:"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -814,7 +814,7 @@ msgstr "Kļūme lÄdÄ“jot:"
#: editor/dependency_editor.cpp
#, fuzzy
-msgid "Scene failed to load due to missing dependencies:"
+msgid "Load failed due to missing dependencies:"
msgstr "Ainu nevarÄ“ja ielÄdÄ“t dēļ neatrastiem dependencÄ«em:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -874,14 +874,6 @@ msgstr ""
msgid "Thanks from the Godot community!"
msgstr "Paldies no Godot sabiedrības!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr ""
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Godot DzinÄ“ja ieguldÄ«tÄji"
@@ -932,7 +924,7 @@ msgstr "Bronzas Donors"
#: editor/editor_about.cpp
msgid "Donors"
-msgstr "Donors"
+msgstr "ZiedotÄji"
#: editor/editor_about.cpp
msgid "License"
@@ -975,7 +967,7 @@ msgid "Uncompressing Assets"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+msgid "Package installed successfully!"
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1057,8 +1049,7 @@ msgid "Bus options"
msgstr "Kopnes iestatījumi"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr ""
@@ -1221,7 +1212,7 @@ msgid "Add AutoLoad"
msgstr ""
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr ""
@@ -1229,8 +1220,8 @@ msgstr ""
msgid "Node Name:"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "Nosaukums"
@@ -1300,24 +1291,30 @@ msgid "Template file not found:"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "File Exists, Overwrite?"
+msgid "Select Current Folder"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
+msgid "File Exists, Overwrite?"
msgstr ""
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+#, fuzzy
+msgid "Select This Folder"
+msgstr "Izvēlēties šo Mapi"
+
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-msgid "Open In File Manager"
-msgstr ""
+#, fuzzy
+msgid "Open in File Manager"
+msgstr "Atvērt"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+msgid "Show in File Manager"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1353,7 +1350,8 @@ msgid "Open a File or Directory"
msgstr ""
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr ""
@@ -1411,8 +1409,7 @@ msgstr ""
msgid "Preview:"
msgstr ""
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr ""
@@ -1428,24 +1425,11 @@ msgstr ""
msgid "(Re)Importing Assets"
msgstr ""
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr ""
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr ""
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr ""
@@ -1462,27 +1446,27 @@ msgid "Brief Description:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Members"
+msgid "Properties"
msgstr ""
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
+#: editor/editor_help.cpp
+msgid "Properties:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
+msgid "Methods"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods:"
+msgid "Methods:"
msgstr ""
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
+msgid "Theme Properties"
msgstr ""
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
+msgid "Theme Properties:"
msgstr ""
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
@@ -1510,8 +1494,14 @@ msgid "Constants:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Description"
-msgstr ""
+#, fuzzy
+msgid "Class Description"
+msgstr "Apraksts:"
+
+#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
+msgstr "Apraksts:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1525,12 +1515,14 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr ""
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "Apraksts:"
#: editor/editor_help.cpp
-msgid "Property Description:"
-msgstr ""
+#, fuzzy
+msgid "Property Descriptions:"
+msgstr "Apraksts:"
#: editor/editor_help.cpp
msgid ""
@@ -1539,12 +1531,14 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr ""
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "Apraksts:"
#: editor/editor_help.cpp
-msgid "Method Description:"
-msgstr ""
+#, fuzzy
+msgid "Method Descriptions:"
+msgstr "Apraksts:"
#: editor/editor_help.cpp
msgid ""
@@ -1552,11 +1546,53 @@ msgid ""
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-#: editor/editor_inspector.cpp
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
msgstr ""
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "SignÄli"
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr ""
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1590,6 +1626,11 @@ msgstr ""
msgid "Error saving resource!"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr ""
@@ -1644,10 +1685,20 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr ""
@@ -1875,6 +1926,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1915,6 +1972,11 @@ msgstr ""
msgid "Default"
msgstr ""
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Play This Scene"
msgstr ""
@@ -1997,8 +2059,9 @@ msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save all Scenes"
-msgstr ""
+#, fuzzy
+msgid "Save All Scenes"
+msgstr "SaglabÄt KÄ"
#: editor/editor_node.cpp
msgid "Close Scene"
@@ -2026,7 +2089,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -2050,7 +2113,7 @@ msgstr ""
msgid "Export"
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr ""
@@ -2064,6 +2127,7 @@ msgid "Quit to Project List"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr ""
@@ -2171,10 +2235,6 @@ msgstr ""
msgid "Help"
msgstr ""
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2268,21 +2328,21 @@ msgstr ""
msgid "Disable Update Spinner"
msgstr ""
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr ""
#: editor/editor_node.cpp
-msgid "Node"
+msgid "FileSystem"
msgstr ""
#: editor/editor_node.cpp
-msgid "FileSystem"
+msgid "Inspector"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Node"
msgstr ""
#: editor/editor_node.cpp
@@ -2419,7 +2479,7 @@ msgstr ""
msgid "Physics Frame %"
msgstr ""
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr ""
@@ -2443,7 +2503,7 @@ msgstr ""
msgid "Calls"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2455,20 +2515,44 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "Nederīgs nosaukums."
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr ""
@@ -2480,10 +2564,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2492,7 +2572,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr ""
@@ -2773,6 +2854,11 @@ msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr ""
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "Favorīti:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
@@ -2808,8 +2894,8 @@ msgstr ""
msgid "Unable to update dependencies:"
msgstr ""
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2817,10 +2903,6 @@ msgid "Provided name contains invalid characters"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr ""
@@ -2845,27 +2927,20 @@ msgid "Duplicating folder:"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
+msgid "Open Scene(s)"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Move To..."
+msgid "Instance"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Open Scene(s)"
-msgstr ""
+#, fuzzy
+msgid "Add to favorites"
+msgstr "Favorīti:"
#: editor/filesystem_dock.cpp
-msgid "Instance"
+msgid "Remove from favorites"
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2876,11 +2951,19 @@ msgstr ""
msgid "View Owners..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr ""
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr ""
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -2889,6 +2972,14 @@ msgstr ""
msgid "New Resource..."
msgstr "Resurs"
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr ""
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -2909,33 +3000,25 @@ msgid "Re-Scan Filesystem"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Toggle folder status as Favorite."
+msgid "Toggle split mode"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Show current scene file."
-msgstr ""
+#, fuzzy
+msgid "Search files"
+msgstr "Meklēt:"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "Meklēt:"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
msgstr ""
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr ""
@@ -2952,27 +3035,20 @@ msgid "Create Script"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Find in files"
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Find: "
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Whole words"
-msgstr ""
+#, fuzzy
+msgid "Find in Files"
+msgstr "Nederīgs nosaukums."
#: editor/find_in_files.cpp
-msgid "Match case"
+msgid "Find:"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Folder: "
+msgid "Folder:"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Filter: "
+msgid "Filters:"
msgstr ""
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -2989,6 +3065,10 @@ msgid "Cancel"
msgstr ""
#: editor/find_in_files.cpp
+msgid "Find: "
+msgstr ""
+
+#: editor/find_in_files.cpp
#, fuzzy
msgid "Replace: "
msgstr "Aizvietot"
@@ -3012,7 +3092,7 @@ msgstr ""
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr "Nederīgs nosaukums."
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3148,17 +3228,12 @@ msgstr ""
msgid "Failed to load resource."
msgstr ""
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr ""
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+msgid "Collapse All Properties"
msgstr ""
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3203,6 +3278,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr ""
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr ""
@@ -3263,44 +3342,45 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
-msgstr ""
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
+msgstr "Izveidot"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
-msgstr ""
+#, fuzzy
+msgid "Edit Polygon"
+msgstr "Izveidot"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+msgid "Remove Polygon And Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr ""
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr "Izveidot"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3316,7 +3396,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
+msgid "Load..."
msgstr "IelÄdÄ“t"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3345,13 +3425,8 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Izveidot"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-msgid "Erase points."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3392,9 +3467,8 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3428,7 +3502,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add Node.."
+msgid "Add Node..."
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3700,7 +3774,7 @@ msgstr "Savienot"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "Noņemt Izvēlēto"
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3767,10 +3841,6 @@ msgid "Amount:"
msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr ""
@@ -3968,7 +4038,7 @@ msgstr ""
msgid "Plugins"
msgstr ""
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr ""
@@ -4092,6 +4162,10 @@ msgid "Resize CanvasItem"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
msgstr ""
@@ -4112,21 +4186,19 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "AttÄlinÄt"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "AttÄlinÄt"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "PietuvinÄt"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4155,6 +4227,11 @@ msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "Mēroga Attiecība:"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4249,6 +4326,10 @@ msgid "Restores the object's children's ability to be selected."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr ""
@@ -4299,6 +4380,10 @@ msgid "Show Viewport"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr ""
@@ -4367,7 +4452,16 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "Izveidot"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
msgstr ""
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
@@ -4469,35 +4563,9 @@ msgid "Item List Editor"
msgstr ""
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr ""
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr ""
@@ -4729,12 +4797,12 @@ msgid "Populate"
msgstr ""
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
+msgid "Generating Visibility Rect"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -4763,6 +4831,11 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr ""
@@ -4832,11 +4905,11 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Convert to CPUParticles"
+msgid "Generate AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -4861,6 +4934,10 @@ msgid "Add Point to Curve"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr ""
@@ -4888,6 +4965,10 @@ msgid "Click: Add Point"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr ""
@@ -4903,11 +4984,6 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr ""
@@ -4964,6 +5040,10 @@ msgstr ""
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
msgid "Move joint"
msgstr ""
@@ -4974,78 +5054,85 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync bones"
+msgid "Sync Bones"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create UV Map"
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create Polygon & UV"
+msgid "Create UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
+msgid "Create Polygon & UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
+msgid "Create Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split already exists."
+msgid "Remove Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Add Split"
+msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "Nederīgs fonta izmērs."
+msgid "Add Custom Polygon"
+msgstr "Izveidot"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Noņemt Izvēlēto"
+msgid "Remove Custom Polygon"
+msgstr "Izveidot"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
-msgstr ""
+#, fuzzy
+msgid "Transform Polygon"
+msgstr "Izveidot"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Polygon 2D UV Editor"
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UV"
+msgid "Open Polygon 2D UV editor."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Poly"
+msgid "Polygon 2D UV Editor"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Splits"
+msgid "UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Bones"
+msgid "Points"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
+msgid "Polygons"
msgstr "Izveidot"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Points"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5073,19 +5160,21 @@ msgid "Scale Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Select a split to erase it"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5109,6 +5198,11 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr ""
@@ -5166,22 +5260,22 @@ msgid "Paste Resource"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr ""
@@ -5211,6 +5305,10 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Error could not load file."
msgstr ""
@@ -5220,20 +5318,24 @@ msgid "Error saving file!"
msgstr "Kļūmes lÄdÄ“jot!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr ""
+#, fuzzy
+msgid "Error while saving theme."
+msgstr "Kļūmes lÄdÄ“jot!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
-msgstr ""
+#, fuzzy
+msgid "Error Saving"
+msgstr "Kļūme lÄdÄ“jot:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr ""
+#, fuzzy
+msgid "Error importing theme."
+msgstr "Kļūda lÄdÄ“jot fontu."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
-msgstr ""
+#, fuzzy
+msgid "Error Importing"
+msgstr "Kļūme lÄdÄ“jot:"
#: editor/plugins/script_editor_plugin.cpp
msgid "New TextFile..."
@@ -5254,6 +5356,14 @@ msgid "Import Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr ""
@@ -5294,8 +5404,9 @@ msgid "File"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile"
-msgstr ""
+#, fuzzy
+msgid "Open..."
+msgstr "Atvērt"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5310,11 +5421,7 @@ msgid "Copy Script Path"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+msgid "History Previous"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5327,15 +5434,15 @@ msgid "Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Reload Theme"
+msgid "Import Theme..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme"
+msgid "Reload Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
+msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5385,7 +5492,7 @@ msgid "Keep Debugger Open"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5393,10 +5500,6 @@ msgid "Open Godot online documentation"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -5431,17 +5534,9 @@ msgid "Debugger"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search results"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search in files"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
+#, fuzzy
+msgid "Search Results"
+msgstr "Meklēt:"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -5453,6 +5548,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "Izveidot Funkciju"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr ""
@@ -5484,10 +5588,6 @@ msgstr ""
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5539,11 +5639,11 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5560,36 +5660,32 @@ msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr ""
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "Doties uz nÄkamo soli"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr ""
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "Doties uz iepriekšējo soli"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
-msgstr ""
+#, fuzzy
+msgid "Go to Function..."
+msgstr "Izveidot Funkciju"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
-msgstr ""
+#, fuzzy
+msgid "Go to Line..."
+msgstr "Doties uz Rindu"
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
@@ -5680,6 +5776,14 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -5844,6 +5948,10 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -5943,10 +6051,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap To Floor"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6063,6 +6167,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
msgstr ""
@@ -6177,11 +6285,16 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6346,6 +6459,11 @@ msgid "Fix Invalid Tiles"
msgstr "Nederīgs nosaukums."
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "Dzēst izvēlētos"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6391,34 +6509,39 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "Noņemt Izvēlēto"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
+msgid "Rotate left"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
+msgid "Rotate right"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Flip vertically"
msgstr ""
-#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Add Texture(s) to TileSet"
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Clear transform"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove current Texture from TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected Texture from TileSet."
+msgstr "Noņemt Izvēlēto"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
msgstr ""
@@ -6427,25 +6550,46 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "Ielīmēt celiņus"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Erase bitmask."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "Izveidot"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "Noņemt Izvēlēto"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6453,7 +6597,12 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Noņemt Izvēlēto"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6463,15 +6612,25 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "Izdzēst izvēlētos failus?"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "Izveidot"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr ""
@@ -6489,11 +6648,93 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Izveidot"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Izveidot"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Izveidot"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Izveidot"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "Ielīmēt celiņus"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Noņemt"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Izveidot"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Izveidot"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "This property can't be changed."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
+msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6529,6 +6770,14 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6537,6 +6786,10 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+msgid "Export Path"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6591,10 +6844,46 @@ msgid "Feature List:"
msgstr ""
#: editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr ""
#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -6721,7 +7010,7 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
-msgid "Can't open project"
+msgid "Can't open project at '%s'."
msgstr ""
#: editor/project_manager.cpp
@@ -6730,6 +7019,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7043,10 +7350,6 @@ msgstr ""
msgid "General"
msgstr ""
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7180,10 +7483,6 @@ msgstr ""
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr ""
@@ -7268,7 +7567,7 @@ msgid "Step"
msgstr "Solis (ļi):"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7277,7 +7576,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7318,7 +7617,7 @@ msgstr ""
msgid "Reset"
msgstr "AtiestatÄ«t tÄlummaiņu"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7377,6 +7676,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr ""
@@ -7413,6 +7716,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7484,6 +7793,10 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr ""
@@ -7492,11 +7805,11 @@ msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Change Type"
+msgid "Extend Script"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -7646,6 +7959,11 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Filename is empty"
+msgstr "Starpliktuve ir tukša"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -7734,19 +8052,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -7778,18 +8084,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -7986,7 +8280,7 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+msgid "Step argument is zero!"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
@@ -8208,11 +8502,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -8482,6 +8772,10 @@ msgid "Base Type:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr ""
@@ -8580,11 +8874,11 @@ msgid "Search VisualScript"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8662,6 +8956,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -8700,6 +9000,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -8817,6 +9123,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -8836,6 +9152,26 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -8868,7 +9204,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -8924,6 +9260,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr ""
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr ""
@@ -8940,10 +9280,6 @@ msgstr "BrÄ«dinÄjums!"
msgid "Please Confirm..."
msgstr "Lūdzu Apstipriniet..."
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr "Izvēlēties šo Mapi"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -8951,6 +9287,10 @@ msgid ""
"hide upon running."
msgstr ""
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -8996,10 +9336,6 @@ msgstr "Nederīgs fonta izmērs."
msgid "Input"
msgstr ""
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
@@ -9017,6 +9353,25 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr "Nederīgs fonta izmērs."
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "Noņemt Izvēlēto"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "AttÄlinÄt"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "PietuvinÄt"
+
+#~ msgid "Zoom:"
+#~ msgstr "PietuvinÄt:"
+
#~ msgid "Disabled"
#~ msgstr "Atspējots"
diff --git a/editor/translations/ml.po b/editor/translations/ml.po
new file mode 100644
index 0000000000..7e49430df9
--- /dev/null
+++ b/editor/translations/ml.po
@@ -0,0 +1,9245 @@
+# Malayalam translation of the Godot Engine editor
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
+# This file is distributed under the same license as the Godot source code.
+# christy james <jkuttu@gmail.com>, 2018.
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:41+0100\n"
+"Last-Translator: christy james <jkuttu@gmail.com>\n"
+"Language-Team: Malayalam <https://hosted.weblate.org/projects/godot-engine/"
+"godot/ml/>\n"
+"Language: ml\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 2.2\n"
+
+#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr "ആർഗàµà´¯àµà´®àµ†à´¨àµà´±àµ ടൈപàµà´ªàµ അസാധàµà´µà´¾à´£àµ മാറàµà´±à´‚വരàµà´¤àµà´¤à´¾àµ»(), TYPE_ * à´¸àµà´¥à´¿à´°à´¾à´™àµà´•à´™àµà´™àµ¾ ഉപയോഗികàµà´•àµà´•."
+
+#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
+#: modules/mono/glue/gd_glue.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr "തെറàµà´±à´¾à´¯ ഫോർമാറàµà´±à´¿à´™àµ à´…à´²àµà´²àµ†à´™àµà´•ിൽ ഡീകàµà´•ോഡിങàµà´™à´¿à´¨àµ ആവശàµà´¯à´¤àµà´¤à´¿à´¨àµ ബെറàµà´±àµà´•ൾ ഇലàµà´²."
+
+#: core/math/expression.cpp
+msgid "Invalid input %i (not passed) in expression"
+msgstr "à´Žà´•àµà´¸àµà´ªàµà´°àµ†à´·à´¨à´¿àµ½ അസാധàµà´µà´¾à´¯ ഇൻപàµà´Ÿàµà´Ÿàµ %i (പാസാകàµà´•ിയിടàµà´Ÿà´¿à´²àµà´²)"
+
+#: core/math/expression.cpp
+msgid "self can't be used because instance is null (not passed)"
+msgstr "സെലàµà´«àµ ഉപയോഗികàµà´•ാൻ പറàµà´±à´¿à´²àµà´² കാരണം à´† ഇൻസàµà´±àµà´±àµ»à´¸àµ ശൂനàµà´¯à´‚ ആണൠ(പാസായിടàµà´Ÿà´¿à´²àµà´²)"
+
+#: core/math/expression.cpp
+msgid "Invalid operands to operator %s, %s and %s."
+msgstr "à´ªàµà´°à´µàµ¼à´¤àµà´¤à´•നൠചെയàµà´¯à´¾àµ» കൊടàµà´¤àµà´¤ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´™àµà´™àµ¾ %s,%s,%s അസാധàµà´µà´¾à´£àµ."
+
+#: core/math/expression.cpp
+msgid "Invalid index of type %s for base type %s"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid named index '%s' for base type %s"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "Invalid arguments to construct '%s'"
+msgstr ""
+
+#: core/math/expression.cpp
+msgid "On call to '%s':"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Free"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Balanced"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Mirror"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Insert Key Here"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Duplicate Selected Key(s)"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp
+msgid "Delete Selected Key(s)"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
+msgid "Anim Delete Keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Keyframe Time"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Transition"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Transform"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Keyframe Value"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Call"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Property Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "3D Transform Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Call Method Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Bezier Curve Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Audio Playback Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation Playback Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Add Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation Length Time (seconds)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation Looping"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Audio Clips:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Clips:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Toggle this track on/off."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Update Mode (How this property is set)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Interpolation Mode"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove this track."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Time (s): "
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Continuous"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Discrete"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Trigger"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Capture"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Nearest"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
+#: editor/property_editor.cpp
+msgid "Linear"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Cubic"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clamp Loop Interp"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Wrap Loop Interp"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Duplicate Key(s)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Delete Key(s)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove Anim Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/create_dialog.cpp
+#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
+#: editor/plugin_config_dialog.cpp
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
+msgid "Create"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "AnimationPlayer can't animate itself, only other players."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Create & Insert"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Transform tracks only apply to Spatial-based nodes."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid ""
+"Audio tracks can only point to nodes of type:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation tracks can only point to AnimationPlayer nodes."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "An animation player can't animate itself, only other players."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Not possible to add a new track without a root"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Track path is invalid, so can't add a key."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Track is not of type Spatial, can't insert key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Track path is invalid, so can't add a method key."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Method not found in object: "
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Move Keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clipboard is empty"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Scale Keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid ""
+"This option does not work for Bezier editing, as it's only a single track."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Only show tracks from nodes selected in tree."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Group tracks by node or display them as plain list."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Snap (s): "
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation step value."
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/editor_properties.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+#: editor/project_manager.cpp editor/project_settings_editor.cpp
+#: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp
+msgid "Edit"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation properties."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Copy Tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Paste Tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Scale Selection"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Scale From Cursor"
+msgstr ""
+
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Duplicate Transposed"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Delete Selection"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Go to Next Step"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Go to Previous Step"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Optimize Animation"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up Animation"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Pick the node that will be animated:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Use Bezier Curves"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim. Optimizer"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Max. Linear Error:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Max. Angular Error:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Optimize"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove invalid keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-up all animations"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Scale Ratio:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Select tracks to copy:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/editor_properties.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Copy"
+msgstr ""
+
+#: editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr ""
+
+#: editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr ""
+
+#: editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Go to Line"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Line Number:"
+msgstr ""
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "No Matches"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Replaced %d occurrence(s)."
+msgstr ""
+
+#: editor/code_editor.cpp editor/find_in_files.cpp
+msgid "Match Case"
+msgstr ""
+
+#: editor/code_editor.cpp editor/find_in_files.cpp
+msgid "Whole Words"
+msgstr ""
+
+#: editor/code_editor.cpp editor/rename_dialog.cpp
+msgid "Replace"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Replace All"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Selection Only"
+msgstr ""
+
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom In"
+msgstr ""
+
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Out"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Warnings:"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Font Size:"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Line:"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Col:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
+#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
+msgid "Add"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/dependency_editor.cpp
+#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_settings_editor.cpp
+msgid "Remove"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/dependency_editor.cpp
+#: editor/export_template_manager.cpp editor/groups_editor.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp
+#: editor/project_settings_editor.cpp editor/property_editor.cpp
+#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Close"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect '%s' from '%s'"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect all from signal: '%s'"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect..."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Disconnect"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect Signal: "
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Edit Connection: "
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
+msgid "Signals"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Are you sure you want to remove all connections from this signal?"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect All"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Edit..."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Go To Method"
+msgstr ""
+
+#: editor/create_dialog.cpp
+msgid "Change %s Type"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/project_settings_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr ""
+
+#: editor/create_dialog.cpp
+msgid "Create New %s"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Search:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Matches:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Description:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+
+#: editor/dependency_editor.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Dependencies"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Resource"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
+msgid "Path"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+#: scene/gui/file_dialog.cpp
+msgid "Open"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+msgid "Cannot remove:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Load failed due to missing dependencies:"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_node.cpp
+msgid "Open Anyway"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Owns"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp
+#: editor/editor_file_dialog.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/item_list_editor_plugin.cpp
+#: editor/project_export.cpp editor/project_settings_editor.cpp
+#: editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr ""
+
+#: editor/dictionary_property_edit.cpp
+msgid "Change Dictionary Key"
+msgstr ""
+
+#: editor/dictionary_property_edit.cpp
+msgid "Change Dictionary Value"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Godot Engine contributors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Project Founders"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Lead Developer"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Project Manager "
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Developers"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Authors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Platinum Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Gold Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Mini Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Gold Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Silver Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Bronze Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "License"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Thirdparty License"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid ""
+"Godot Engine relies on a number of thirdparty free and open source "
+"libraries, all compatible with the terms of its MIT license. The following "
+"is an exhaustive list of all such thirdparty components with their "
+"respective copyright statements and license terms."
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "All Components"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Components"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Licenses"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp editor/project_manager.cpp
+msgid "Error opening package file, not in zip format."
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+msgid "Uncompressing Assets"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp editor/project_manager.cpp
+msgid "Package installed successfully!"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Success!"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Install"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+msgid "Package Installer"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Speakers"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Rename Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Change Audio Bus Volume"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Solo"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Mute"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Bypass Effects"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Select Audio Bus Send"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Audio Bus Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Move Bus Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Bus Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Audio Bus, Drag and Drop to rearrange."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Solo"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Mute"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Bypass"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Bus options"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Reset Volume"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Audio"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Master bus can't be deleted!"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Duplicate Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Reset Bus Volume"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Move Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Save Audio Bus Layout As..."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Location for New Layout..."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Open Audio Bus Layout"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "There is no 'res://default_bus_layout.tres' file."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Invalid file, not an audio bus layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Create a new Bus Layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/editor_properties.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
+#: editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Load an existing Bus Layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Save As"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Save this Bus Layout to a file."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/import_dock.cpp
+msgid "Load Default"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Load the default Bus Layout."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
+msgid "Path:"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
+msgid "Name"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "Storing local changes..."
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "Updating scene..."
+msgstr ""
+
+#: editor/editor_data.cpp editor/editor_properties.cpp
+msgid "[empty]"
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "[unsaved]"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp
+msgid "Please select a base directory first"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
+msgid "Create Folder"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp
+#: scene/gui/file_dialog.cpp
+msgid "Name:"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
+msgid "Could not create folder."
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid "Storing File:"
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid "Packing"
+msgstr ""
+
+#: editor/editor_export.cpp platform/javascript/export/export.cpp
+msgid "Template file not found:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select This Folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "Open in File Manager"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+#: editor/project_manager.cpp
+msgid "Show in File Manager"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "New Folder..."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "All Recognized"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "All Files (*)"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/editor_node.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
+msgid "Save"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Save a File"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Go to parent folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Directories & Files:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
+#: editor/plugins/style_box_editor_plugin.cpp
+msgid "Preview:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "File:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr ""
+
+#: editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr ""
+
+#: editor/editor_file_system.cpp
+msgid "(Re)Importing Assets"
+msgstr ""
+
+#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class:"
+msgstr ""
+
+#: editor/editor_help.cpp editor/scene_tree_editor.cpp
+msgid "Inherits:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Properties"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Methods"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Methods:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Theme Properties"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Theme Properties:"
+msgstr ""
+
+#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
+msgid "Signals:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Enumerations"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Enumerations:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "enum "
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Constants"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Constants:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class Description"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Online Tutorials:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid ""
+"There are currently no tutorials for this class, you can [color=$color][url="
+"$url]contribute one[/url][/color] or [color=$color][url=$url2]request one[/"
+"url][/color]."
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Property Descriptions"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Property Descriptions:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid ""
+"There is currently no description for this property. Please help us by "
+"[color=$color][url=$url]contributing one[/url][/color]!"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Method Descriptions"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Method Descriptions:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid ""
+"There is currently no description for this method. Please help us by [color="
+"$color][url=$url]contributing one[/url][/color]!"
+msgstr ""
+
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr ""
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
+msgid "Set"
+msgstr ""
+
+#: editor/editor_inspector.cpp
+msgid "Set Multiple:"
+msgstr ""
+
+#: editor/editor_log.cpp
+msgid "Output:"
+msgstr ""
+
+#: editor/editor_log.cpp editor/editor_profiler.cpp
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/property_editor.cpp editor/scene_tree_dock.cpp
+#: editor/script_editor_debugger.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp
+#: scene/gui/text_edit.cpp
+msgid "Clear"
+msgstr ""
+
+#: editor/editor_log.cpp
+msgid "Clear Output"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Project export failed with error code %d."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Error saving resource!"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save Resource As..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error while saving."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Can't open '%s'. The file could have been moved or deleted."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error while parsing '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unexpected end of file '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Missing '%s' or its dependencies."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error while loading '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Analyzing"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a tree root."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
+"be satisfied."
+msgstr ""
+
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource belongs to a scene that was imported, so it's not editable.\n"
+"Please read the documentation relevant to importing scenes to better "
+"understand this workflow."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource belongs to a scene that was instanced or inherited.\n"
+"Changes to it will not be kept when saving the current scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource was imported, so it's not editable. Change its settings in the "
+"import panel and then re-import."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This scene was imported, so changes to it will not be kept.\n"
+"Instancing it or inheriting will allow making changes to it.\n"
+"Please read the documentation relevant to importing scenes to better "
+"understand this workflow."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This is a remote object so changes to it will not be kept.\n"
+"Please read the documentation relevant to debugging to better understand "
+"this workflow."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Open Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Open Script..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save & Close"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save changes to '%s' before closing?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save Scene As..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "No"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Yes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a root node."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a selected node."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Revert"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Run Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quit"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Project Manager?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save & Quit"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save changes to the following scene(s) before quitting?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save changes the following scene(s) before opening Project Manager?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This option is deprecated. Situations where refresh must be forced are now "
+"considered a bug. Please report."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to find script field for addon plugin at: 'res://addons/%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to load addon script from path: '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to load addon script from path: '%s' Script is not in tool mode."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Scene '%s' was automatically imported, so it can't be modified.\n"
+"To make changes to it, a new inherited scene can be created."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Clear Recent Scenes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save Layout"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr ""
+
+#: editor/editor_node.cpp editor/import_dock.cpp
+#: editor/script_create_dialog.cpp
+msgid "Default"
+msgstr ""
+
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play This Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Close Tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "%d more files or folders"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "%d more folders"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "%d more files"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Dock Position"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Toggle distraction-free mode."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Add a new scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Next tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Previous tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Filter Files..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "New Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "New Inherited Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save All Scenes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Convert To..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "MeshLibrary..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "TileSet..."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Undo"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Redo"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Project"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Project Settings"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_export.cpp
+msgid "Export"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Project Data Folder"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
+msgid "Debug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Editor"
+msgstr ""
+
+#: editor/editor_node.cpp editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Editor Data/Settings Folder"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Editor Data Folder"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Editor Settings Folder"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Help"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+msgid "Search"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Online Docs"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Q&A"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Issue Tracker"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "About"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play the project."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr ""
+
+#: editor/editor_node.cpp editor/editor_profiler.cpp
+msgid "Stop"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Changing the video driver requires restarting the editor."
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_settings_editor.cpp
+#: editor/settings_config_dialog.cpp
+msgid "Save & Restart"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Update Always"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Update Changes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
+#: editor/project_manager.cpp
+msgid "Import"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Expand Bottom Panel"
+msgstr ""
+
+#: editor/editor_node.cpp scene/resources/visual_shader.cpp
+msgid "Output"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Don't Save"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_export.cpp
+msgid "Export Project"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export Library"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Password:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "New Inherited"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Load Errors"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open 2D Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open 3D Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Script Editor"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "Open Asset Library"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open the next Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open the previous Editor"
+msgstr ""
+
+#: editor/editor_plugin.cpp
+msgid "Creating Mesh Previews"
+msgstr ""
+
+#: editor/editor_plugin.cpp
+msgid "Thumbnail..."
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Edit Plugin"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+msgid "Update"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Version:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+msgid "Author:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Edit:"
+msgstr ""
+
+#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
+#: editor/rename_dialog.cpp
+msgid "Start"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Physics Frame %"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Time:"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Time"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Calls"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "On"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Layer"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Bit %d, value %d"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "[Empty]"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Invalid RID"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Pick a Viewport"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "New Script"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "New %s"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Make Unique"
+msgstr ""
+
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Paste"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Convert To %s"
+msgstr ""
+
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Open Editor"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Selected node is not a Viewport!"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Size: "
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Page: "
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "New Key:"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "New Value:"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Add Key/Value Pair"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: editor/editor_run_native.cpp
+msgid "Select device from the list"
+msgstr ""
+
+#: editor/editor_run_native.cpp
+msgid ""
+"No runnable export preset found for this platform.\n"
+"Please add a runnable preset in the export menu."
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Re-Download"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Uninstall"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "(Installed)"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "(Missing)"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "(Current)"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Retrieving mirrors, please wait..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Remove template version '%s'?"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Can't open export templates zip."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Invalid version.txt format inside templates: %s."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "No version.txt found inside templates."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Error creating path for templates:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Extracting Export Templates"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Importing:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid ""
+"No download links found for this version. Direct download is only available "
+"for official releases."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't connect."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "No response."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request Failed."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect Loop."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Failed:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Download Complete."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid ""
+"Templates installation failed. The problematic templates archives can be "
+"found at '%s'."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Error requesting url: "
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Connecting to Mirror..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Disconnected"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Resolving"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Can't Resolve"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Connecting..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Can't Connect"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Connected"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Requesting..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Downloading"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Connection Error"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "SSL Handshake Error"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Current Version:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Installed Versions:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Install From File"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Remove Template"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Select template file"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Export Template Manager"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Download Templates"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Select mirror from list: (Shift+Click: Open in Browser)"
+msgstr ""
+
+#: editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "View items as a grid of thumbnails."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "View items as a list."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Status: Import of file failed. Please fix file and reimport manually."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Cannot move/rename resources root."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Cannot move a folder into itself."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Error moving:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Error duplicating:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Unable to update dependencies:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Provided name contains invalid characters"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "A file or folder with this name already exists."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Renaming file:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Renaming folder:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicating file:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicating folder:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Open Scene(s)"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Add to favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Remove from favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Edit Dependencies..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "View Owners..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicate..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+msgid "New Script..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "New Resource..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/project_manager.cpp editor/rename_dialog.cpp
+#: editor/scene_tree_dock.cpp
+msgid "Rename"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Toggle split mode"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Search files"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid ""
+"Scanning Files,\n"
+"Please Wait..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "There is already file or folder with the same name in this location."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Overwrite"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Find in Files"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Find:"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Folder:"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Filters:"
+msgstr ""
+
+#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+msgid "Find..."
+msgstr ""
+
+#: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp
+msgid "Replace..."
+msgstr ""
+
+#: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp
+msgid "Cancel"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Find: "
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Replace: "
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Replace all (no undo)"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Searching..."
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Search complete"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Group name already exists."
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Invalid group name."
+msgstr ""
+
+#: editor/groups_editor.cpp editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Nodes not in Group"
+msgstr ""
+
+#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
+msgid "Filter nodes"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Nodes in Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Manage Groups"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Single Scene"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Materials"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Materials"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Materials+Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Materials+Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Multiple Scenes"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Multiple Scenes+Materials"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Import Scene"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Importing Scene..."
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Generating Lightmaps"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Generating for Mesh: "
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Running Custom Script..."
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Saving..."
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Set as Default for '%s'"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Clear Default for '%s'"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid " Files"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Import As:"
+msgstr ""
+
+#: editor/import_dock.cpp editor/property_editor.cpp
+msgid "Preset..."
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Reimport"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Failed to load resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Expand All Properties"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Collapse All Properties"
+msgstr ""
+
+#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save As..."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Copy Params"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Edit Resource Clipboard"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Copy Resource"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Make Built-In"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Open in Help"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Object properties."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Filter properties"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Changes may be lost!"
+msgstr ""
+
+#: editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Edit a Plugin"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Create a Plugin"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Plugin Name:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Subfolder:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Language:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Script Name:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Activate now?"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Edit Polygon"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Insert Point"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Edit Polygon (Remove Point)"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Remove Polygon And Point"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid ""
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Load..."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "This type of node can't be used. Only root nodes are allowed."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid ""
+"AnimationTree is inactive.\n"
+"Activate to enable playback, check node warnings if activation fails."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Set the blending position within the space"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Select and move points, create points with RMB."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Open Animation Node"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Triangle already exists"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "BlendSpace2D does not belong to an AnimationTree node."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "No triangles exist, so no blending can take place."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create triangles by connecting points."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Erase points and triangles."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Generate blend triangles automatically (instead of manually)"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Edit Filters"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Output node can't be added to the blend tree."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Unable to connect, port may be in use or connection may be invalid."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "No animation player set, so unable to retrieve track names."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Player path set is invalid, so unable to retrieve track names."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid ""
+"Animation player has no valid root node path, so unable to retrieve track "
+"names."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add Node..."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "Edit Filtered Tracks:"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Enable filtering"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Delete Animation?"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Invalid animation name!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation name already exists!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation to copy!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation resource on clipboard!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation to edit!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Transitions..."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Open in Inspector"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Onion Skinning"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Enable Onion Skinning"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Directions"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Past"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Future"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Depth"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "1 step"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "2 steps"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "3 steps"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Differences Only"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Force White Modulate"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Include Gizmos (3D)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pin AnimationPlayer"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "End"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Immediate"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Sync"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "At End"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Travel"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Start and end nodes are needed for a sub-transition."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "No playback resource set at path: %s."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid ""
+"Select and move nodes.\n"
+"RMB to add new nodes.\n"
+"Shift+LMB to create connections."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Create new nodes."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Connect nodes."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Remove selected node or transition."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Toggle autoplay this animation on start, restart or seek to zero."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Set the end animation. This is useful for sub-transitions."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Transition: "
+msgstr ""
+
+#: editor/plugins/animation_tree_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "AnimationTree"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Import Animations..."
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Filters..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Contents:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "View Files"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Connection error, please try again."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't connect to host:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "No response from host:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, return code:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, too many redirects"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Bad download hash, assuming file has been tampered with."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Expected:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Got:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Failed sha256 hash check"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Asset Download Error:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Downloading (%s / %s)..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Downloading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Resolving..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Error making request"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Idle"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Retry"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download Error"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download for this asset is already in progress!"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "First"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Previous"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Next"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Last"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "All"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+msgid "Sort:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/project_settings_editor.cpp
+msgid "Category:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Support..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid ""
+"Can't determine a save path for lightmap images.\n"
+"Save your scene (for images to be saved in the same dir), or pick a save "
+"path from the BakedLightmap properties."
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid ""
+"No meshes to bake. Make sure they contain an UV2 channel and that the 'Bake "
+"Light' flag is on."
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid "Failed creating lightmap images, make sure path is writable."
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid "Bake Lightmaps"
+msgstr ""
+
+#: editor/plugins/camera_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+msgid "Preview"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move vertical guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create new vertical guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Remove vertical guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move horizontal guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create new horizontal guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Remove horizontal guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create new horizontal and vertical guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move pivot"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move anchor"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Resize CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchors only"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors and Margins"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Toggle snapping."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snapping Options"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to grid"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Smart snapping"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to parent"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to node anchor"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to node sides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to node center"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to other nodes"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Custom Bone(s) from Node(s)"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Custom Bones"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Helpers"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Rulers"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Origin"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Viewport"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Layout"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert keys."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Multiply grid step by 2"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Divide grid step by 2"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Cannot instantiate multiple nodes without root."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change default type"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Polygon3D"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+msgid "CPUParticles"
+msgstr ""
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emission Points From Mesh"
+msgstr ""
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emission Points From Node"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Flat0"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Flat1"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Ease in"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Ease out"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Smoothstep"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Modify Curve Point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Modify Curve Tangent"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Load Curve Preset"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Add point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Remove point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Left linear"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Right linear"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Load preset"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Remove Curve Point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Toggle Curve Linear Tangent"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Hold Shift to edit tangents individually"
+msgstr ""
+
+#: editor/plugins/gi_probe_editor_plugin.cpp
+msgid "Bake GI Probe"
+msgstr ""
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Contained Mesh is not of type ArrayMesh."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "UV Unwrap failed, mesh may not be manifold?"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "No mesh to debug."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Model has no UV in this layer"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh..."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "View UV1"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "View UV2"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Unwrap UV2 for Lightmap/AO"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generating Visibility Rect"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Can only set point into a ParticlesMaterial process material"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image..."
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generate Visibility Rect"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Particles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generation Time (sec):"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Emission Mask"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Capture from Pixel"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Emission Colors"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Points:"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Surface Points"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Surface Points+Normal (Directed)"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Source: "
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "A processor material of type 'ParticlesMaterial' is required."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generating AABB"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generate Visibility AABB"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Out-Control from Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove In-Control from Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp editor/plugins/theme_editor_plugin.cpp
+#: editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Mirror Handle Angles"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Mirror Handle Lengths"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Position"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Position"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Position"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove Out-Control Point"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove In-Control Point"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/physical_bone_plugin.cpp
+msgid "Move joint"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Sync Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon & UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Internal Vertex"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Remove Internal Vertex"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Add Custom Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Remove Custom Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Open Polygon 2D UV editor."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Points"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygons"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Points"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create a custom polygon. Enables custom polygon rendering."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint weights with specified intensity."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Unpaint weights with specified intensity."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Radius:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Settings"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Configure Grid:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset X:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset Y:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step X:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step Y:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Sync Bones to Polygon"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
+#: editor/scene_tree_editor.cpp
+msgid "Type:"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ResourcePreloader"
+msgstr ""
+
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "AnimationTree has no path set to an AnimationPlayer"
+msgstr ""
+
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "Path to AnimationPlayer is invalid"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Files"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close and save changes?"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error writing TextFile:"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error could not load file."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving file!"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error Saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error Importing"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "New TextFile..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open File"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save File As..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid " Class Reference"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Toggle alphabetical sorting of the method list."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Sort"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Move Up"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Move Down"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "File"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Copy Script Path"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "History Previous"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Other Tabs"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Toggle Scripts Panel"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+msgid "Find Next"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Debug with External Editor"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open Godot online documentation"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Discard"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Results"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Line"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "(ignore)"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Only resources from filesystem can be dropped."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Lookup Symbol"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Convert Case"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Uppercase"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Lowercase"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Capitalize"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Syntax Highlighter"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
+#: scene/gui/text_edit.cpp
+msgid "Cut"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
+#: scene/gui/text_edit.cpp
+msgid "Select All"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Delete Line"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Fold/Unfold Line"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Fold All Lines"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Unfold All Lines"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Convert Indent to Spaces"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Convert Indent to Tabs"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Find in Files..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Line..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: editor/plugins/shader_editor_plugin.cpp
+msgid "Shader"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "This skeleton has no bones, create some children Bone2D nodes."
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Skeleton2D"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Make Rest Pose (From Bones)"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Set Bones to Rest Pose"
+msgstr ""
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Create physical bones"
+msgstr ""
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Skeleton"
+msgstr ""
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Create physical skeleton"
+msgstr ""
+
+#: editor/plugins/skeleton_ik_editor_plugin.cpp
+msgid "Play IK"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling: "
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translating: "
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Objects Drawn"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Material Changes"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Shader Changes"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Surface Changes"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Draw Calls"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Vertices"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "FPS"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Lock View Rotation"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Unshaded"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Environment"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Gizmos"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Information"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View FPS"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Half Resolution"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Doppler Enable"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Cinematic Preview"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Left"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Right"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Forward"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Backwards"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Up"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Down"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Speed Modifier"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Select Mode (Q)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Drag: Rotate\n"
+"Alt+Drag: Move\n"
+"Alt+RMB: Depth list selection"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Space Mode (%s)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Mode (%s)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Tool Select"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Tool Move"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Tool Rotate"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Tool Scale"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Toggle Freelook"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap object to floor"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog..."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Settings"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Sprite is empty!"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Can't convert a sprite using animation frames to mesh."
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Invalid geometry, can't replace by mesh."
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Sprite"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Convert to 2D Mesh"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create 2D Mesh"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Simplification: "
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Grow (Pixels): "
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Update Preview"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Settings:"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Move (Before)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Move (After)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "SpriteFrames"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Region Rect"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: scene/resources/visual_shader.cpp
+msgid "None"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Sep.:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "TextureRegion"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove All Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove All"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Edit theme..."
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Theme editing menu."
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create From Current Editor Theme"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Radio Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Radio Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Has,Many,Options"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
+msgid "Style"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase Selection"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Fix Invalid Tiles"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Cut Selection"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Line Draw"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rectangle Paint"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket Fill"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find Tile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint Tile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Copy Selection"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate left"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate right"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Flip horizontally"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Flip vertically"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Clear transform"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Texture(s) to TileSet."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove selected Texture from TileSet."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Erase bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new polygon."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "You haven't selected a texture to remove."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Texture"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Drag handles to edit Rect.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete selected Rect."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select current edited sub-tile.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete polygon."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to use as icon, this will be also used on invalid autotile "
+"bindings.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its priority.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Tile"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Tile"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "This property can't be changed."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "TileSet"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vertex"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Fragment"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Light"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "VisualShader"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Runnable"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Delete patch '%s' from list?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Delete preset '%s'?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export templates for this platform are missing/corrupted:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Presets"
+msgstr ""
+
+#: editor/project_export.cpp editor/project_settings_editor.cpp
+msgid "Add..."
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export Path"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export all resources in the project"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export selected scenes (and dependencies)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export selected resources (and dependencies)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Resources to export:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma separated, e.g: *.json, *.txt)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid ""
+"Filters to exclude files from project (comma separated, e.g: *.json, *.txt)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Patches"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Make Patch"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Features"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Custom (comma-separated):"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Feature List:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export templates for this platform are missing:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export With Debug"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "The path does not exist."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Please choose an empty folder."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Please choose a 'project.godot' or '.zip' file."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Directory already contains a Godot project."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Imported Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Invalid Project Name."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Couldn't create folder."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "There is already a folder in this path with the specified name."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "It would be a good idea to name your project."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Couldn't load project.godot in project path (error %d). It may be missing or "
+"corrupted."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Couldn't edit project.godot in project path."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Couldn't create project.godot in project path."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Rename Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Import & Edit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Create & Edit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Install & Edit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Create folder"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Installation Path:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Can't open project at '%s'."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Can't run project: no main scene defined.\n"
+"Please edit the project and set the main scene in \"Project Settings\" under "
+"the \"Application\" category."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Can't run project: Assets need to be imported.\n"
+"Please edit the project to trigger the initial import."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Language changed.\n"
+"The UI will update next time the editor or project manager starts."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project List"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Templates"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Exit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Restart Now"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Can't run project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"You don't currently have any projects.\n"
+"Would you like to explore the official example projects in the Asset Library?"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Key "
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid ""
+"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
+"'\"'"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Action '%s' already exists!"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Change Action deadzone"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "All Devices"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Device"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Press a Key..."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Left Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Right Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Left Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Right Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "X Button 1"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "X Button 2"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joypad Axis Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Axis"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joypad Button Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Erase Input Action"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Left Button."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Right Button."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Middle Button."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Up."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Down."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Global Property"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Select a setting item first!"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "No property '%s' exists."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Setting '%s' is internal, and it can't be deleted."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Delete Item"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid ""
+"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
+"'\"'."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Already existing"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Settings saved OK."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Override for Feature"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Changed Locale Filter"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Changed Locale Filter Mode"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Project Settings (project.godot)"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Override For..."
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Editor must be restarted for changes to take effect"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Input Map"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Action:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Action"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Deadzone"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Device:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Localization"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Translations"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Translations:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remaps"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Resources:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Locale"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Locales Filter"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Show all locales"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Show only selected locales"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Filter mode:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Locales:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "File..."
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Dir..."
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Select Node"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Pick a Node"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: editor/property_selector.cpp
+msgid "Select Property"
+msgstr ""
+
+#: editor/property_selector.cpp
+msgid "Select Virtual Method"
+msgstr ""
+
+#: editor/property_selector.cpp
+msgid "Select Method"
+msgstr ""
+
+#: editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr ""
+
+#: editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+
+#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Batch Rename"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Prefix"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Advanced options"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Substitute"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Node name"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Node's parent name, if available"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Node type"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Current scene name"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Root node name"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid ""
+"Sequential integer counter.\n"
+"Compare counter options."
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Per Level counter"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "If set the counter restarts for each group of child nodes"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Initial value for the counter"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Step"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Amount by which counter is incremented for each node"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Padding"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid ""
+"Minimum number of digits for the counter.\n"
+"Missing digits are padded with leading zeros."
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Regular Expressions"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Post-Process"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Keep"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "CamelCase to under_scored"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "under_scored to CamelCase"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Case"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "To Lowercase"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "To Uppercase"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Reset"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Error"
+msgstr ""
+
+#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Script"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can not perform with the root node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Save New Scene As..."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Create Root Node:"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "2D Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "3D Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "User Interface"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Custom Node"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Sub-Resources"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Extend Script"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Make Scene Root"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Copy Node Path"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Remote"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Local"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Toggle Visible"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Node configuration warning:"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node has connection(s) and group(s).\n"
+"Click to show signals dock."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node has connections.\n"
+"Click to show signals dock."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node is in group(s).\n"
+"Click to show groups dock."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp editor/script_create_dialog.cpp
+msgid "Open Script"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node is locked.\n"
+"Click to unlock it."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Children are not selectable.\n"
+"Click to make selectable."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Toggle Visibility"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"AnimationPlayer is pinned.\n"
+"Click to unpin."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Node Configuration Warning!"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Error loading template '%s'"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Error - Could not create script in filesystem."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Open Script/Choose Location"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Directory of the same name exists"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "File exists, will be reused"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Wrong extension chosen"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid Path"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid inherited parent name or path"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Script valid"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Allowed: a-z, A-Z, 0-9 and _"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Built-in script (into scene file)"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Create new script file"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Load existing script file"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Inherits"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Class Name"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Template"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Built-in Script"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Remote "
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Stack Trace"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Pick one or more items from the list to display the graph."
+msgstr ""
+
+#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp
+msgid "Errors"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Copy Error"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Binding"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change AudioStreamPlayer3D Emission Angle"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier AABB"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Particles AABB"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Cylinder Shape Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Cylinder Shape Height"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Cylinder Radius"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Cylinder Height"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Torus Inner Radius"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Torus Outer Radius"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Select the dynamic library for this entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Select dependencies of the library for this entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Remove current entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Double click to create a new entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Platform:"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Platform"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Dynamic Library"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Add an architecture entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "GDNativeLibrary"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Library"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Status"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Libraries: "
+msgstr ""
+
+#: modules/gdnative/register_types.cpp
+msgid "GDNative"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Step argument is zero!"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not a script with an instance"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not based on a script"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not based on a resource file"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Object can't provide a length."
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Next Plane"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Previous Plane"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Plane:"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Next Floor"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Previous Floor"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Floor:"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Delete Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Fill Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Duplicate Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Grid Map"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Snap View"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Disabled"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Above"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Below"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit X Axis"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit Y Axis"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit Z Axis"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate X"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate Y"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate Z"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate X"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate Y"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate Z"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Clear Rotation"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Create Area"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Create Exterior Connector"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Erase Area"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clear Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Fill Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Settings"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Pick Distance:"
+msgstr ""
+
+#: modules/mono/csharp_script.cpp
+msgid "Class name can't be a reserved keyword"
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Generating solution..."
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Generating C# project..."
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Failed to create solution."
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Failed to save solution."
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Done"
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Failed to create C# project."
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Mono"
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "About C# support"
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Create C# solution"
+msgstr ""
+
+#: modules/mono/editor/mono_bottom_panel.cpp
+msgid "Builds"
+msgstr ""
+
+#: modules/mono/editor/mono_bottom_panel.cpp
+msgid "Build Project"
+msgstr ""
+
+#: modules/mono/editor/mono_bottom_panel.cpp
+msgid "Warnings"
+msgstr ""
+
+#: modules/mono/editor/mono_bottom_panel.cpp
+msgid "View log"
+msgstr ""
+
+#: modules/mono/mono_gd/gd_mono_utils.cpp
+msgid "End of inner exception stack trace"
+msgstr ""
+
+#: modules/recast/navigation_mesh_editor_plugin.cpp
+msgid "Bake NavMesh"
+msgstr ""
+
+#: modules/recast/navigation_mesh_editor_plugin.cpp
+msgid "Clear the navigation mesh."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Setting up Configuration..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Calculating grid size..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating heightfield..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Marking walkable triangles..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Constructing compact heightfield..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Eroding walkable area..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Partitioning..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating contours..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating polymesh..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Converting to native navigation mesh..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Navigation Mesh Generator Setup:"
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Parsing Geometry..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Done!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Signal Arguments"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Argument Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Argument name"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Set Variable Default Value"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Set Variable Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove VisualScript Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Duplicate VisualScript Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Base Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Move Node(s)"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove VisualScript Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Node Data"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Node Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Script already has function '%s'"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Input Value"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Can't copy the function node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Clipboard is empty!"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste VisualScript Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Member"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Search VisualScript"
+msgstr ""
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Get %s"
+msgstr ""
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Set %s"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Run in Browser"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Run exported HTML in the system's default browser."
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not write file:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not open template for export:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Invalid export template:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not read custom HTML shell:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not read boot splash image file:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Using default boot splash image."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+
+#: scene/2d/collision_object_2d.cpp
+msgid ""
+"This node has no shape, so it can't collide or interact with other objects.\n"
+"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
+"define its shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp scene/3d/particles.cpp
+msgid ""
+"A material to process the particles is not assigned, so no behavior is "
+"imprinted."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+
+#: scene/2d/physics_body_2d.cpp
+msgid ""
+"Size changes to RigidBody2D (in character or rigid modes) will be overridden "
+"by the physics engine when running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+
+#: scene/2d/skeleton_2d.cpp
+msgid "This Bone2D chain should end at a Skeleton2D node."
+msgstr ""
+
+#: scene/2d/skeleton_2d.cpp
+msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
+msgstr ""
+
+#: scene/2d/skeleton_2d.cpp
+msgid ""
+"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
+msgstr ""
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRCamera must have an ARVROrigin node as its parent"
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRController must have an ARVROrigin node as its parent"
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid ""
+"The controller id must not be 0 or this controller will not be bound to an "
+"actual controller"
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRAnchor must have an ARVROrigin node as its parent"
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid ""
+"The anchor id must not be 0 or this anchor will not be bound to an actual "
+"anchor"
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVROrigin requires an ARVRCamera child node"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "%d%%"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "(Time Left: %d:%02d s)"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Plotting Meshes: "
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Plotting Lights:"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp
+msgid "Finishing Plot"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Lighting Meshes: "
+msgstr ""
+
+#: scene/3d/collision_object.cpp
+msgid ""
+"This node has no shape, so it can't collide or interact with other objects.\n"
+"Consider adding a CollisionShape or CollisionPolygon as a child to define "
+"its shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr ""
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
+#: scene/3d/gi_probe.cpp
+msgid "Plotting Meshes"
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+
+#: scene/3d/particles.cpp
+msgid ""
+"Nothing is visible because meshes have not been assigned to draw passes."
+msgstr ""
+
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
+#: scene/3d/physics_body.cpp
+msgid ""
+"Size changes to RigidBody (in character or rigid modes) will be overridden "
+"by the physics engine when running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+
+#: scene/3d/remote_transform.cpp
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid "WorldEnvironment needs an Environment resource."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set "
+"this environment's Background Mode to Canvas (for 2D scenes)."
+msgstr ""
+
+#: scene/3d/soft_body.cpp
+msgid "This body will be ignored until you set a mesh"
+msgstr ""
+
+#: scene/3d/soft_body.cpp
+msgid ""
+"Size changes to SoftBody will be overridden by the physics engine when "
+"running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+
+#: scene/3d/vehicle_body.cpp
+msgid ""
+"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use "
+"it as a child of a VehicleBody."
+msgstr ""
+
+#: scene/animation/animation_blend_tree.cpp
+msgid "On BlendTree node '%s', animation not found: '%s'"
+msgstr ""
+
+#: scene/animation/animation_blend_tree.cpp
+msgid "Animation not found: '%s'"
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "In node '%s', invalid animation: '%s'."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Invalid animation: '%s'."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Nothing connected to input '%s' of node '%s'."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "A root AnimationNode for the graph is not set."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Path to an AnimationPlayer node containing animations is not set."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "AnimationPlayer root is not a valid node."
+msgstr ""
+
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
+#: scene/gui/color_picker.cpp
+msgid "Raw Mode"
+msgstr ""
+
+#: scene/gui/color_picker.cpp
+msgid "Add current color as a preset"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr ""
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
+#: scene/gui/scroll_container.cpp
+msgid ""
+"ScrollContainer is intended to work with a single child control.\n"
+"Use a container as child (VBox,HBox,etc), or a Control and set the custom "
+"minimum size manually."
+msgstr ""
+
+#: scene/gui/tree.cpp
+msgid "(Other)"
+msgstr ""
+
+#: scene/main/scene_tree.cpp
+msgid ""
+"Default Environment as specified in Project Settings (Rendering -> "
+"Environment -> Default Environment) could not be loaded."
+msgstr ""
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+msgid "Error initializing FreeType."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+msgid "Unknown font format."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+msgid "Error loading font."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+msgid "Invalid font size."
+msgstr ""
+
+#: scene/resources/visual_shader.cpp
+msgid "Input"
+msgstr ""
+
+#: scene/resources/visual_shader_nodes.cpp
+msgid "Invalid source for shader."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Assignment to function."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Assignment to uniform."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Varyings can only be assigned in vertex function."
+msgstr ""
diff --git a/editor/translations/ms.po b/editor/translations/ms.po
index e7e084af56..e72cdb350e 100644
--- a/editor/translations/ms.po
+++ b/editor/translations/ms.po
@@ -1,6 +1,6 @@
# Malay translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# Sam Vanguard <syafz119@gmail.com>, 2018.
# Shaqir Rafiq <moshamoradev@gmail.com>, 2018.
@@ -9,15 +9,17 @@
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-07-29 03:39+0000\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:41+0100\n"
"Last-Translator: Nafis Ibrahim <thepreciousnafis@gmail.com>\n"
"Language-Team: Malay <https://hosted.weblate.org/projects/godot-engine/godot/"
"ms/>\n"
"Language: ms\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 3.1.1\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -25,7 +27,7 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr ""
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
@@ -255,7 +257,6 @@ msgstr ""
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -383,8 +384,7 @@ msgstr ""
msgid "Scale From Cursor"
msgstr ""
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr ""
@@ -398,11 +398,11 @@ msgid "Delete Selection"
msgstr "Semua Pilihan"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+msgid "Go to Next Step"
msgstr ""
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+msgid "Go to Previous Step"
msgstr ""
#: editor/animation_track_editor.cpp
@@ -505,11 +505,11 @@ msgstr ""
msgid "Replaced %d occurrence(s)."
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr ""
@@ -525,15 +525,19 @@ msgstr ""
msgid "Selection Only"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr ""
@@ -542,10 +546,10 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Zoom:"
+msgid "Font Size:"
msgstr ""
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr ""
@@ -576,6 +580,7 @@ msgstr ""
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -653,7 +658,7 @@ msgid "Edit Connection: "
msgstr ""
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -699,23 +704,20 @@ msgid "Recent:"
msgstr ""
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr ""
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr ""
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr ""
@@ -750,8 +752,7 @@ msgid "Resource"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr ""
@@ -772,9 +773,10 @@ msgid "Search Replacement Resource:"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -804,7 +806,7 @@ msgid "Error loading:"
msgstr ""
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+msgid "Load failed due to missing dependencies:"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -863,14 +865,6 @@ msgstr ""
msgid "Thanks from the Godot community!"
msgstr ""
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr ""
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr ""
@@ -960,7 +954,7 @@ msgid "Uncompressing Assets"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+msgid "Package installed successfully!"
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1042,8 +1036,7 @@ msgid "Bus options"
msgstr ""
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr ""
@@ -1202,7 +1195,7 @@ msgid "Add AutoLoad"
msgstr ""
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr ""
@@ -1210,8 +1203,8 @@ msgstr ""
msgid "Node Name:"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr ""
@@ -1281,11 +1274,15 @@ msgid "Template file not found:"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
+msgid "Select This Folder"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1293,12 +1290,12 @@ msgid "Copy Path"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+msgid "Show in File Manager"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1334,7 +1331,8 @@ msgid "Open a File or Directory"
msgstr ""
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr ""
@@ -1392,8 +1390,7 @@ msgstr ""
msgid "Preview:"
msgstr ""
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr ""
@@ -1409,24 +1406,11 @@ msgstr ""
msgid "(Re)Importing Assets"
msgstr ""
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr ""
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr ""
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr ""
@@ -1443,27 +1427,27 @@ msgid "Brief Description:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Members"
+msgid "Properties"
msgstr ""
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
+#: editor/editor_help.cpp
+msgid "Properties:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
+msgid "Methods"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods:"
+msgid "Methods:"
msgstr ""
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
+msgid "Theme Properties"
msgstr ""
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
+msgid "Theme Properties:"
msgstr ""
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
@@ -1491,7 +1475,11 @@ msgid "Constants:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Description"
+msgid "Class Description"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
msgstr ""
#: editor/editor_help.cpp
@@ -1506,11 +1494,11 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Properties"
+msgid "Property Descriptions"
msgstr ""
#: editor/editor_help.cpp
-msgid "Property Description:"
+msgid "Property Descriptions:"
msgstr ""
#: editor/editor_help.cpp
@@ -1520,11 +1508,11 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Methods"
+msgid "Method Descriptions"
msgstr ""
#: editor/editor_help.cpp
-msgid "Method Description:"
+msgid "Method Descriptions:"
msgstr ""
#: editor/editor_help.cpp
@@ -1533,11 +1521,52 @@ msgid ""
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-#: editor/editor_inspector.cpp
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
msgstr ""
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr ""
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1571,6 +1600,11 @@ msgstr ""
msgid "Error saving resource!"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr ""
@@ -1625,10 +1659,20 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr ""
@@ -1856,6 +1900,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1896,6 +1946,11 @@ msgstr ""
msgid "Default"
msgstr ""
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Play This Scene"
msgstr ""
@@ -1977,7 +2032,7 @@ msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2006,7 +2061,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -2030,7 +2085,7 @@ msgstr ""
msgid "Export"
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr ""
@@ -2043,6 +2098,7 @@ msgid "Quit to Project List"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr ""
@@ -2150,10 +2206,6 @@ msgstr ""
msgid "Help"
msgstr ""
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2247,21 +2299,21 @@ msgstr ""
msgid "Disable Update Spinner"
msgstr ""
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr ""
#: editor/editor_node.cpp
-msgid "Node"
+msgid "FileSystem"
msgstr ""
#: editor/editor_node.cpp
-msgid "FileSystem"
+msgid "Inspector"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Node"
msgstr ""
#: editor/editor_node.cpp
@@ -2398,7 +2450,7 @@ msgstr ""
msgid "Physics Frame %"
msgstr ""
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr ""
@@ -2422,7 +2474,7 @@ msgstr ""
msgid "Calls"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2434,20 +2486,43 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Invalid RID"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr ""
@@ -2459,10 +2534,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2471,7 +2542,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr ""
@@ -2752,6 +2824,10 @@ msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr ""
#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
@@ -2787,8 +2863,8 @@ msgstr ""
msgid "Unable to update dependencies:"
msgstr ""
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2796,10 +2872,6 @@ msgid "Provided name contains invalid characters"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr ""
@@ -2824,27 +2896,19 @@ msgid "Duplicating folder:"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
+msgid "Open Scene(s)"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Move To..."
+msgid "Instance"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Open Scene(s)"
+msgid "Add to favorites"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Instance"
+msgid "Remove from favorites"
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2855,11 +2919,19 @@ msgstr ""
msgid "View Owners..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr ""
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr ""
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -2867,6 +2939,14 @@ msgstr ""
msgid "New Resource..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr ""
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -2887,11 +2967,11 @@ msgid "Re-Scan Filesystem"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Toggle folder status as Favorite."
+msgid "Toggle split mode"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Show current scene file."
+msgid "Search files"
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2899,20 +2979,12 @@ msgid "Instance the selected scene(s) as child of the selected node."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Search files"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
msgstr ""
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr ""
@@ -2929,27 +3001,19 @@ msgid "Create Script"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Find in files"
+msgid "Find in Files"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Find: "
+msgid "Find:"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Whole words"
+msgid "Folder:"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Match case"
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Filter: "
+msgid "Filters:"
msgstr ""
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -2966,6 +3030,10 @@ msgid "Cancel"
msgstr ""
#: editor/find_in_files.cpp
+msgid "Find: "
+msgstr ""
+
+#: editor/find_in_files.cpp
msgid "Replace: "
msgstr ""
@@ -2986,7 +3054,7 @@ msgid "Group name already exists."
msgstr ""
#: editor/groups_editor.cpp
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr ""
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3122,17 +3190,12 @@ msgstr ""
msgid "Failed to load resource."
msgstr ""
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr ""
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+msgid "Collapse All Properties"
msgstr ""
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3177,6 +3240,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr ""
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr ""
@@ -3237,14 +3304,12 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+msgid "Edit Polygon"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3252,29 +3317,29 @@ msgid "Insert Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+msgid "Remove Polygon And Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3289,7 +3354,7 @@ msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Load.."
+msgid "Load..."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3318,12 +3383,8 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Create points."
-msgstr ""
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-msgid "Erase points."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3363,9 +3424,8 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3399,7 +3459,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add Node.."
+msgid "Add Node..."
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3667,7 +3727,7 @@ msgid "Connect nodes."
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3735,10 +3795,6 @@ msgid "Amount:"
msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr ""
@@ -3936,7 +3992,7 @@ msgstr ""
msgid "Plugins"
msgstr ""
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr ""
@@ -4060,6 +4116,10 @@ msgid "Resize CanvasItem"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
msgstr ""
@@ -4080,15 +4140,15 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom out"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom reset"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom in"
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -4120,6 +4180,10 @@ msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4214,6 +4278,10 @@ msgid "Restores the object's children's ability to be selected."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr ""
@@ -4264,6 +4332,10 @@ msgid "Show Viewport"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr ""
@@ -4332,7 +4404,15 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
+msgid "Create Polygon3D"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
msgstr ""
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
@@ -4434,35 +4514,9 @@ msgid "Item List Editor"
msgstr ""
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr ""
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr ""
@@ -4694,12 +4748,12 @@ msgid "Populate"
msgstr ""
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
+msgid "Generating Visibility Rect"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -4728,6 +4782,11 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr ""
@@ -4797,11 +4856,11 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Convert to CPUParticles"
+msgid "Generate AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -4826,6 +4885,10 @@ msgid "Add Point to Curve"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr ""
@@ -4853,6 +4916,10 @@ msgid "Click: Add Point"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr ""
@@ -4868,11 +4935,6 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr ""
@@ -4929,6 +4991,10 @@ msgstr ""
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
msgid "Move joint"
msgstr ""
@@ -4939,7 +5005,13 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync bones"
+msgid "Sync Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -4951,63 +5023,63 @@ msgid "Create Polygon & UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
+msgid "Create Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
+msgid "Remove Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split already exists."
+msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Add Split"
+msgid "Add Custom Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Invalid Split: "
+msgid "Remove Custom Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Remove Split"
+msgid "Transform UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Transform UV Map"
+msgid "Transform Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Polygon 2D UV Editor"
+msgid "Open Polygon 2D UV editor."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UV"
+msgid "Polygon 2D UV Editor"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Poly"
+msgid "UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Splits"
+msgid "Points"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Bones"
+msgid "Polygons"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create Polygon"
+msgid "Bones"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Move Points"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5035,19 +5107,21 @@ msgid "Scale Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Select a split to erase it"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5071,6 +5145,11 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr ""
@@ -5128,22 +5207,22 @@ msgid "Paste Resource"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr ""
@@ -5173,6 +5252,10 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Error could not load file."
msgstr ""
@@ -5181,19 +5264,19 @@ msgid "Error saving file!"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
+msgid "Error while saving theme."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+msgid "Error Saving"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
+msgid "Error importing theme."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+msgid "Error Importing"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5213,6 +5296,14 @@ msgid "Import Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr ""
@@ -5253,7 +5344,7 @@ msgid "File"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile"
+msgid "Open..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5269,11 +5360,7 @@ msgid "Copy Script Path"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+msgid "History Previous"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5286,15 +5373,15 @@ msgid "Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Reload Theme"
+msgid "Import Theme..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme"
+msgid "Reload Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
+msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5344,7 +5431,7 @@ msgid "Keep Debugger Open"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5352,10 +5439,6 @@ msgid "Open Godot online documentation"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -5390,24 +5473,23 @@ msgid "Debugger"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search results"
+msgid "Search Results"
msgstr ""
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search in files"
+#: editor/plugins/script_text_editor.cpp
+msgid "Line"
msgstr ""
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
+#: editor/plugins/script_text_editor.cpp
+msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
+msgid "Go to Function"
msgstr ""
-#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5442,10 +5524,6 @@ msgstr ""
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5497,11 +5575,11 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5518,19 +5596,11 @@ msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
+msgid "Go to Next Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
+msgid "Go to Previous Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5538,15 +5608,15 @@ msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+msgid "Go to Function..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5638,6 +5708,14 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -5802,6 +5880,10 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -5901,10 +5983,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap To Floor"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6021,6 +6099,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
msgstr ""
@@ -6134,11 +6216,16 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6302,6 +6389,11 @@ msgid "Fix Invalid Tiles"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "Semua Pilihan"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6347,31 +6439,36 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "Semua Pilihan"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
+msgid "Rotate left"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
+msgid "Rotate right"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Flip vertically"
msgstr ""
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Clear transform"
+msgstr "Anim Ubah Penukaran"
+
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6383,17 +6480,35 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Paste bitmask."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Erase bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new polygon."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove selected texture? This will remove all tiles which use it."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6401,7 +6516,7 @@ msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6409,7 +6524,11 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+msgid "Remove Texture"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6419,15 +6538,25 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "Semua Pilihan"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "Semua Pilihan"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr ""
@@ -6445,11 +6574,85 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Tile"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Tile"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "This property can't be changed."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
+msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6485,6 +6688,14 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6493,6 +6704,10 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+msgid "Export Path"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6547,10 +6762,46 @@ msgid "Feature List:"
msgstr ""
#: editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr ""
#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -6677,7 +6928,7 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
-msgid "Can't open project"
+msgid "Can't open project at '%s'."
msgstr ""
#: editor/project_manager.cpp
@@ -6686,6 +6937,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -6999,10 +7268,6 @@ msgstr ""
msgid "General"
msgstr "Am"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7136,10 +7401,6 @@ msgstr ""
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr ""
@@ -7224,7 +7485,7 @@ msgid "Step"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7233,7 +7494,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7273,7 +7534,7 @@ msgstr ""
msgid "Reset"
msgstr ""
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7332,6 +7593,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr ""
@@ -7368,6 +7633,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7438,6 +7709,10 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr ""
@@ -7446,11 +7721,11 @@ msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Change Type"
+msgid "Extend Script"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -7600,6 +7875,10 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -7688,19 +7967,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -7732,18 +7999,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -7940,7 +8195,7 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+msgid "Step argument is zero!"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
@@ -8162,11 +8417,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -8436,6 +8687,10 @@ msgid "Base Type:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr ""
@@ -8534,11 +8789,11 @@ msgid "Search VisualScript"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8616,6 +8871,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -8654,6 +8915,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -8771,6 +9038,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -8790,6 +9067,26 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -8822,7 +9119,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -8875,6 +9172,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr ""
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr ""
@@ -8891,10 +9192,6 @@ msgstr ""
msgid "Please Confirm..."
msgstr ""
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr ""
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -8902,6 +9199,10 @@ msgid ""
"hide upon running."
msgstr ""
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -8947,10 +9248,6 @@ msgstr ""
msgid "Input"
msgstr ""
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for shader."
msgstr ""
diff --git a/editor/translations/nb.po b/editor/translations/nb.po
index fc4a1bed6e..fe2a37ec74 100644
--- a/editor/translations/nb.po
+++ b/editor/translations/nb.po
@@ -1,6 +1,6 @@
# Norwegian Bokmål translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# Allan Nordhøy <epost@anotheragency.no>, 2017-2018.
# Anonymous <GentleSaucepan@protonmail.com>, 2017.
@@ -11,18 +11,21 @@
# NicolaiF <nico-fre@hotmail.com>, 2017-2018.
# Norwegian Disaster <stian.furu.overbye@gmail.com>, 2017.
# passeride <lukas@passeride.com>, 2017.
+# Byzantin <kasper-hoel@hotmail.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-06-28 14:40+0000\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:41+0100\n"
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/godot-"
-"engine/godot/nb/>\n"
+"engine/godot/nb_NO/>\n"
"Language: nb\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.1-dev\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -30,18 +33,19 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr "Ugyldig typeargument til convert(), bruk TYPE_*-konstantene."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr ""
+msgstr "Ikke nok byte til dekodingsbyte, eller ugyldig format."
#: core/math/expression.cpp
+#, fuzzy
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Ikke gyldig inndata %i (ikke bestått) i utrykket"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "self kan ikke brukes siden instansen er lik null (ikke bestått)"
#: core/math/expression.cpp
#, fuzzy
@@ -54,8 +58,9 @@ msgid "Invalid index of type %s for base type %s"
msgstr "Ugyldig indeks egenskap navn '%s' i node %s."
#: core/math/expression.cpp
+#, fuzzy
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "Ugyldig navngitt indeks \"%s\" for grunntypen %s"
#: core/math/expression.cpp
#, fuzzy
@@ -64,7 +69,7 @@ msgstr ": Ugyldig argument av type: "
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "NÃ¥r \"%s\" ble anropt:"
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -73,12 +78,11 @@ msgstr "Frigjør"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "Balansert"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Mirror"
-msgstr "Speil X"
+msgstr "Speil"
#: editor/animation_bezier_editor.cpp
#, fuzzy
@@ -86,14 +90,12 @@ msgid "Insert Key Here"
msgstr "Sett inn Nøkkel"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "Dupliser Utvalg"
+msgstr "Dupliser valgte nøkler/taster"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "Slett Valgte"
+msgstr "Slett valgte nøkler/taster"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -273,7 +275,6 @@ msgstr "Lag %d NYE spor og sett inn nøkler?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -407,8 +408,7 @@ msgstr "Skaler Utvalg"
msgid "Scale From Cursor"
msgstr "Skaler Fra Peker"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Dupliser Utvalg"
@@ -422,11 +422,13 @@ msgid "Delete Selection"
msgstr "Slett Valgte"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+#, fuzzy
+msgid "Go to Next Step"
msgstr "GÃ¥ til Neste Steg"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+#, fuzzy
+msgid "Go to Previous Step"
msgstr "GÃ¥ til Forrige Steg"
#: editor/animation_track_editor.cpp
@@ -529,11 +531,11 @@ msgstr "Ingen Treff"
msgid "Replaced %d occurrence(s)."
msgstr "Erstattet %d forekomst(er)."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Match Tilfelle"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "Hele Ord"
@@ -549,15 +551,19 @@ msgstr "Erstatt Alle"
msgid "Selection Only"
msgstr "Kun Valgte"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Zoom Inn"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "Zoom Ut"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "Nullstill Zoom"
@@ -567,10 +573,10 @@ msgstr ""
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "Zoom Inn"
+msgid "Font Size:"
+msgstr "Frontvisning"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Linje:"
@@ -603,6 +609,7 @@ msgstr "Legg Til"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -684,7 +691,7 @@ msgstr "Tilkoblingsfeil"
#: editor/connections_dialog.cpp
#, fuzzy
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "Er du sikker på at du vil kjøre mer enn ett prosjekt?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -733,23 +740,20 @@ msgid "Recent:"
msgstr "Nylige:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Søk:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "Treff:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "Beskrivelse:"
@@ -788,8 +792,7 @@ msgid "Resource"
msgstr "Ressurs"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "Søkesti"
@@ -811,9 +814,10 @@ msgid "Search Replacement Resource:"
msgstr "Søk Erstatningsressurs:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -845,7 +849,8 @@ msgid "Error loading:"
msgstr "Feil ved innlasting:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+#, fuzzy
+msgid "Load failed due to missing dependencies:"
msgstr "Scenen kunne ikke lastes på grunn av manglende avhengigheter:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -906,14 +911,6 @@ msgstr "Endre Ordboksverdi"
msgid "Thanks from the Godot community!"
msgstr "Takk fra Godot-samfunnet!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr ""
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Godot Engine sine bidragsytere"
@@ -1007,7 +1004,8 @@ msgid "Uncompressing Assets"
msgstr "Dekomprimerer Ressurser"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+#, fuzzy
+msgid "Package installed successfully!"
msgstr "Vellykket Installering av Pakke!"
#: editor/editor_asset_installer.cpp
@@ -1089,8 +1087,7 @@ msgid "Bus options"
msgstr "Bus valg"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "Duplisér"
@@ -1252,7 +1249,7 @@ msgid "Add AutoLoad"
msgstr "Legg til AutoLoad"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "Bane:"
@@ -1260,8 +1257,8 @@ msgstr "Bane:"
msgid "Node Name:"
msgstr "Nodenavn:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "Navn"
@@ -1331,12 +1328,17 @@ msgid "Template file not found:"
msgstr "Malfil ble ikke funnet:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Velg Gjeldende Mappe"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "Filen finnes, overskriv?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "Velg Gjeldende Mappe"
+#, fuzzy
+msgid "Select This Folder"
+msgstr "Kutt Noder"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
@@ -1344,12 +1346,13 @@ msgstr "Kopier Sti"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr "Vis I Filutforsker"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+#, fuzzy
+msgid "Show in File Manager"
msgstr "Vis I Filutforsker"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1385,7 +1388,8 @@ msgid "Open a File or Directory"
msgstr "Ã…pne ei fil eller mappe"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Lagre"
@@ -1443,8 +1447,7 @@ msgstr "Mapper og Filer:"
msgid "Preview:"
msgstr "Forhåndsvisning:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "Fil:"
@@ -1460,24 +1463,11 @@ msgstr "SkannKilder"
msgid "(Re)Importing Assets"
msgstr "(Re)Importerer Assets"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "Søk hjelp"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "Klasseliste:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "Søk i klasser"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "Topp"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "Klasse:"
@@ -1494,28 +1484,31 @@ msgid "Brief Description:"
msgstr "Kort beskrivelse:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "Medlemmer"
+msgid "Properties"
+msgstr "Egenskaper"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "Medlemmer:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "Offentlige metoder"
+msgid "Methods"
+msgstr "Metoder"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "Offentlige metoder:"
+#, fuzzy
+msgid "Methods:"
+msgstr "Metoder"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "GUI Tema Elementer"
+#, fuzzy
+msgid "Theme Properties"
+msgstr "Egenskaper"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "GUI Tema Elementer:"
+#, fuzzy
+msgid "Theme Properties:"
+msgstr "Egenskaper"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1542,10 +1535,16 @@ msgid "Constants:"
msgstr "Konstanter:"
#: editor/editor_help.cpp
-msgid "Description"
+#, fuzzy
+msgid "Class Description"
msgstr "Beskrivelse"
#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
+msgstr "Beskrivelse:"
+
+#: editor/editor_help.cpp
msgid "Online Tutorials:"
msgstr "Online dokumentasjon:"
@@ -1560,11 +1559,13 @@ msgstr ""
"$url2]be om en[/url][/color]."
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "Egenskaper"
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "Egenskapsbeskrivelse:"
#: editor/editor_help.cpp
-msgid "Property Description:"
+#, fuzzy
+msgid "Property Descriptions:"
msgstr "Egenskapsbeskrivelse:"
#: editor/editor_help.cpp
@@ -1576,11 +1577,13 @@ msgstr ""
"Ã¥ [colour=$color][url=$url]bidra med en[/url][/color]!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "Metoder"
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "Metodebeskrivelse:"
#: editor/editor_help.cpp
-msgid "Method Description:"
+#, fuzzy
+msgid "Method Descriptions:"
msgstr "Metodebeskrivelse:"
#: editor/editor_help.cpp
@@ -1591,12 +1594,61 @@ msgstr ""
"Det finnes i øyeblikket ingen beskrivelse av denne metoden. Hjelp til ved å "
"[colour=$color][url=$url]bidra med en[/url][/color]!"
-#: editor/editor_inspector.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Søk hjelp"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Display All"
+msgstr "Erstatt Alle"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Classes Only"
+msgstr "Klasser"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Methods Only"
+msgstr "Metoder"
+
+#: editor/editor_help_search.cpp
#, fuzzy
-msgid "Property: "
+msgid "Signals Only"
+msgstr "Signaler"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Constants Only"
+msgstr "Konstanter"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Properties Only"
+msgstr "Egenskaper"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Theme Properties Only"
msgstr "Egenskaper"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Member Type"
+msgstr "Medlemmer"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Class"
+msgstr "Klasse:"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr "Sett"
@@ -1630,6 +1682,11 @@ msgstr "Eksport av prosjektet mislyktes med feilkode %d."
msgid "Error saving resource!"
msgstr "Feil ved lagring av ressurs!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "Lagre Ressurs Som..."
@@ -1684,12 +1741,22 @@ msgstr "Denne operasjonen kan ikke gjennomføres uten en trerot."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
"Kunne ikke lagre scene. Sannsynligvis kunne ikke avhengigheter (instanser "
"eller arvinger) oppfylles."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr "Kan ikke laste MeshLibrary for sammenslåing!"
@@ -1945,6 +2012,14 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "Kan ikke laste addon-skript fra bane: '%s'."
#: editor/editor_node.cpp
+#, fuzzy
+msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"Kunne ikke laste tillegsskript fra sti: '%s' Script er ikke i verktøymodus."
+
+#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1992,6 +2067,12 @@ msgstr "Slett Layout"
msgid "Default"
msgstr "Standard"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+#, fuzzy
+msgid "Show in FileSystem"
+msgstr "Vis I Filutforsker"
+
#: editor/editor_node.cpp
#, fuzzy
msgid "Play This Scene"
@@ -2075,7 +2156,8 @@ msgid "Save Scene"
msgstr "Lagre Scene"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+#, fuzzy
+msgid "Save All Scenes"
msgstr "Lagre alle Scener"
#: editor/editor_node.cpp
@@ -2104,7 +2186,7 @@ msgid "Undo"
msgstr "Angre"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Gjenta"
@@ -2129,7 +2211,7 @@ msgstr "Prosjektinnstillinger"
msgid "Export"
msgstr "Eksporter"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "Verktøy"
@@ -2143,6 +2225,7 @@ msgid "Quit to Project List"
msgstr "Avslutt til Prosjektliste"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "Debug"
@@ -2277,10 +2360,6 @@ msgstr "HÃ¥ndter Eksportmaler"
msgid "Help"
msgstr "Hjelp"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "Klasser"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2376,24 +2455,24 @@ msgstr "Oppdater Endringer"
msgid "Disable Update Spinner"
msgstr "Deaktiver Oppdateringsspinner"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "Inspektør"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "Importer"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "Node"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "FilSystem"
#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr "Inspektør"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Node"
+
+#: editor/editor_node.cpp
#, fuzzy
msgid "Expand Bottom Panel"
msgstr "Utvid alle"
@@ -2533,7 +2612,7 @@ msgstr "Frame %"
msgid "Physics Frame %"
msgstr "Fysikk-Frame %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "Tid:"
@@ -2561,7 +2640,7 @@ msgstr "Tid:"
msgid "Calls"
msgstr "Ring"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2573,20 +2652,44 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr ": Ugyldige argumenter: "
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr ""
@@ -2598,10 +2701,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2610,7 +2709,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "Lim inn"
@@ -2910,6 +3010,11 @@ msgstr ""
"Kan ikke åpne fyle_type_cache.cch for skriving, lagrer ikke file type cache!"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "Favoritter:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr "Kan ikke navigere til '%s' for den ble ikke funnet på filsystemet!"
@@ -2956,19 +3061,15 @@ msgstr "Feil ved innlasting:"
msgid "Unable to update dependencies:"
msgstr "Kan ikke oppdatere av avhengigheter:\n"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "Ingen navn gitt"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "Ingen navn gitt."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "Gitt navn inneholder ugyldige tegn"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "Ingen navn gitt."
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "Navn inneholder ugyldige tegn."
@@ -2995,22 +3096,6 @@ msgid "Duplicating folder:"
msgstr "Ender mappenavn:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "Utvid alle"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "Kollaps alle"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "Endre Navn..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "Flytt Til..."
-
-#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Open Scene(s)"
msgstr "Ã…pne Scene"
@@ -3020,6 +3105,16 @@ msgid "Instance"
msgstr "Instans"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Add to favorites"
+msgstr "Favoritter:"
+
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Remove from favorites"
+msgstr "Fjern fra Gruppe"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "Endre Avhengigheter..."
@@ -3027,12 +3122,20 @@ msgstr "Endre Avhengigheter..."
msgid "View Owners..."
msgstr "Vis Eiere..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "Endre Navn..."
+
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Duplicate..."
msgstr "Duplisér"
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr "Flytt Til..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
msgstr "Hurtigåpne Skript..."
@@ -3042,6 +3145,16 @@ msgstr "Hurtigåpne Skript..."
msgid "New Resource..."
msgstr "Lagre Ressurs Som..."
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Expand All"
+msgstr "Utvid alle"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Collapse All"
+msgstr "Kollaps alle"
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -3063,13 +3176,13 @@ msgstr "Re-Skann Filsystem"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "Vis/skjul mappestatus som Favoritt"
+msgid "Toggle split mode"
+msgstr "Veksle modus"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Show current scene file."
-msgstr "Velg Gjeldende Mappe"
+msgid "Search files"
+msgstr "Søk i klasser"
#: editor/filesystem_dock.cpp
#, fuzzy
@@ -3077,15 +3190,6 @@ msgid "Instance the selected scene(s) as child of the selected node."
msgstr "Instanser den valgte scene(r) som barn av den valgte noden."
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "Søk i klasser"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3093,7 +3197,7 @@ msgstr ""
"Skanner Filer,\n"
"Vennligst Vent..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "Flytt"
@@ -3112,31 +3216,22 @@ msgstr "Opprett skript"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find in files"
+msgid "Find in Files"
msgstr "%d flere filer"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find: "
+msgid "Find:"
msgstr "Finn"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Whole words"
-msgstr "Hele Ord"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "Match Tilfelle"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "Lag mappe"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Filter: "
+msgid "Filters:"
msgstr "Lim inn Noder"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -3154,6 +3249,11 @@ msgstr "Avbryt"
#: editor/find_in_files.cpp
#, fuzzy
+msgid "Find: "
+msgstr "Finn"
+
+#: editor/find_in_files.cpp
+#, fuzzy
msgid "Replace: "
msgstr "Erstatt"
@@ -3179,7 +3279,7 @@ msgstr "ERROR: Animasjonsnavnet finnes allerede!"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr "Ugyldig navn."
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3321,17 +3421,14 @@ msgstr "Reimporter"
msgid "Failed to load resource."
msgstr "Kunne ikke laste ressurs."
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "Ok"
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+#, fuzzy
+msgid "Expand All Properties"
msgstr "Utvid alle egenskaper"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+#, fuzzy
+msgid "Collapse All Properties"
msgstr "Kollaps alle egenskaper"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3377,6 +3474,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "Last inn en eksisterende ressurs fra disk og rediger den."
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "Lagre den nylige redigerte ressursen."
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "GÃ¥ til det forrige redigerte objektet i historikken."
@@ -3443,14 +3544,14 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
msgstr "Lag Poly"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+#, fuzzy
+msgid "Edit Polygon"
msgstr "Rediger Poly"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3458,25 +3559,28 @@ msgid "Insert Point"
msgstr "Sett inn Punkt"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+#, fuzzy
+msgid "Edit Polygon (Remove Point)"
msgstr "Rediger Poly (Fjern Punkt)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+#, fuzzy
+msgid "Remove Polygon And Point"
msgstr "Fjern Poly Og Punkt"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "Lag en ny polygon fra bunnen"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr "Slett punkter"
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#, fuzzy
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
"Endre eksisterende polygon:\n"
"Venstreklikk: Flytt Punkt.\n"
@@ -3484,8 +3588,10 @@ msgstr ""
"Høyreklikk: Fjern Punkt."
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
-msgstr "Slett punkter"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#, fuzzy
+msgid "Erase points."
+msgstr "Høyreklikk: Slett Punkt."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3500,7 +3606,7 @@ msgstr "Legg til Animasjon"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
+msgid "Load..."
msgstr "Last"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3529,15 +3635,9 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Slett punkter"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "Høyreklikk: Slett Punkt."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3579,10 +3679,10 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr ""
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#, fuzzy
+msgid "Blend:"
+msgstr "Blend:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3615,7 +3715,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add Node.."
+msgid "Add Node..."
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3900,7 +4000,7 @@ msgstr "Kutt Noder"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "Fjern valgt spor."
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3970,11 +4070,6 @@ msgid "Amount:"
msgstr "Mengde:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
-msgid "Blend:"
-msgstr "Blend:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "Blend 0:"
@@ -4185,7 +4280,7 @@ msgstr "Alle"
msgid "Plugins"
msgstr "Plugins"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "Sorter:"
@@ -4314,6 +4409,11 @@ msgstr "Endre CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Scale CanvasItem"
+msgstr "Endre CanvasItem"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Move CanvasItem"
msgstr "Endre CanvasItem"
@@ -4334,21 +4434,19 @@ msgid "Paste Pose"
msgstr "Lim Inn Pose"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "Zoom Ut"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "Zoom Ut"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Zoom Inn"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr "Velg Modus"
@@ -4378,6 +4476,11 @@ msgid "Rotate Mode"
msgstr "Roter Modus"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "Velg Modus"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid ""
@@ -4479,6 +4582,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr "Gjenopprett objektets barn sin mulighet for å bli valgt."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "Singleton"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "Vis Ben"
@@ -4532,6 +4640,10 @@ msgid "Show Viewport"
msgstr "Vis hjelpere"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
msgid "Center Selection"
msgstr "Plasser Utvalg I Midten"
@@ -4605,8 +4717,17 @@ msgstr ""
"Dra & Slipp + Alft: Endre nodetype"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr "Lag Poly3D"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "Lag Poly"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Rediger Poly"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Rediger Poly (Fjern Punkt)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
#, fuzzy
@@ -4711,35 +4832,9 @@ msgid "Item List Editor"
msgstr ""
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr "Lag en ny polygon fra bunnen."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "Rediger eksisterende polygon:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "Venstreklikk: Flytt Punkt."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr "Ctrl+Venstreklikk: Splitt Segment."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "Høyreklikk: Slett Punkt."
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr ""
@@ -4973,12 +5068,12 @@ msgid "Populate"
msgstr ""
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
+msgid "Generating Visibility Rect"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -5007,6 +5102,12 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "Convert to CPUParticles"
+msgstr "Konverter til store versaler"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr "Partikler"
@@ -5076,13 +5177,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "Konverter til store versaler"
+msgid "Generate AABB"
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5106,6 +5206,11 @@ msgid "Add Point to Curve"
msgstr "Legg til Punkt på Kurve"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "Lukk Kurve"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr "Flytt Punkt på Kurve"
@@ -5133,6 +5238,11 @@ msgid "Click: Add Point"
msgstr "Klikk: Legg til Punkt"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Left Click: Split Segment (in curve)"
+msgstr "Split Segment (i kurve)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr "Høyreklikk: Fjern Punkt"
@@ -5148,11 +5258,6 @@ msgstr "Legg til Punkt (i tomt rom)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr "Split Segment (i kurve)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "Fjern Punkt"
@@ -5213,6 +5318,10 @@ msgstr "Fjern Funksjon"
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Split Segment (i kurve)"
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5225,10 +5334,16 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Sync bones"
+msgid "Sync Bones"
msgstr "Vis Ben"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr ""
@@ -5238,40 +5353,46 @@ msgid "Create Polygon & UV"
msgstr "Lag Poly"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "Lag ny horisontal veileder"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
+#, fuzzy
+msgid "Remove Internal Vertex"
+msgstr "Fjern vertikal veileder"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "Eksisterer allerede"
+msgid "Add Custom Polygon"
+msgstr "Rediger Poly"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Add Split"
-msgstr "Legg til punkt"
+msgid "Remove Custom Polygon"
+msgstr "Fjern Poly Og Punkt"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Invalid Split: "
-msgstr ": Ugyldige argumenter: "
+msgid "Transform UV Map"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Fjern punkt"
+msgid "Transform Polygon"
+msgstr "Lag Poly"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Transform UV Map"
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
-msgstr ""
+#, fuzzy
+msgid "Open Polygon 2D UV editor."
+msgstr "Ã…pne 2D Editor"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
@@ -5283,13 +5404,13 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "Rediger Poly"
+msgid "Points"
+msgstr "Flytt Punkt"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Splits"
-msgstr "Splitt Sti"
+msgid "Polygons"
+msgstr "Rediger Poly"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -5298,11 +5419,7 @@ msgstr "Lag Ben"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
-msgstr "Lag Poly"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Move Points"
msgstr "Flytt Punkt"
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5330,20 +5447,21 @@ msgid "Scale Polygon"
msgstr "Skaler Polygon"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "Velg en Mappe å Skanne"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5368,6 +5486,11 @@ msgid "Grid Settings"
msgstr "Redigeringsverktøy-instillinger"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr "Aktiver Snap"
@@ -5431,22 +5554,22 @@ msgid "Paste Resource"
msgstr "Lim inn Ressurs"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "Åpne i Redigeringsverktøy"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr "Instans:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr "Type:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Åpne i Redigeringsverktøy"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr "Last Ressurs"
@@ -5483,6 +5606,11 @@ msgstr "Error ved lagring av TileSet!"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
+msgid "Error: could not load file."
+msgstr "Kunne ikke opprette mappe."
+
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Error could not load file."
msgstr "Kunne ikke opprette mappe."
@@ -5492,19 +5620,23 @@ msgid "Error saving file!"
msgstr "Error ved lagring av TileSet!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
+#, fuzzy
+msgid "Error while saving theme."
msgstr "Error ved lasting av tema"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+#, fuzzy
+msgid "Error Saving"
msgstr "Error ved lagring"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
+#, fuzzy
+msgid "Error importing theme."
msgstr "Error ved importering av tema"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+#, fuzzy
+msgid "Error Importing"
msgstr "Error ved importering"
#: editor/plugins/script_editor_plugin.cpp
@@ -5527,6 +5659,14 @@ msgid "Import Theme"
msgstr "Importer Tema"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Error ved lasting av tema"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Error ved lagring"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr "Lagre Tema Som..."
@@ -5568,8 +5708,8 @@ msgstr "Fil"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile"
-msgstr "Vis Filer"
+msgid "Open..."
+msgstr "Ã…pne"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5584,12 +5724,9 @@ msgid "Copy Script Path"
msgstr "Kopier Skript-Sti"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr "Vis I Filutforsker"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
-msgstr ""
+#, fuzzy
+msgid "History Previous"
+msgstr "Finn forrige"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
@@ -5601,6 +5738,11 @@ msgid "Theme"
msgstr "Tema"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Import Theme..."
+msgstr "Importer Tema"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
msgstr "Gjeninnlast drakt"
@@ -5609,10 +5751,6 @@ msgid "Save Theme"
msgstr "Lagre drakt"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "Lagre drakt som"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "Lukk Dokumentasjon"
@@ -5659,7 +5797,8 @@ msgid "Keep Debugger Open"
msgstr "Hold feilretteren åpen"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+#, fuzzy
+msgid "Debug with External Editor"
msgstr "Feilrett med ekstern behandler"
#: editor/plugins/script_editor_plugin.cpp
@@ -5667,10 +5806,6 @@ msgid "Open Godot online documentation"
msgstr "Ã…pne Godots nettbaserte dokumentasjon"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr "Søk i klasse-hierarkiet."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Søk i referanse-dokumentasjonen."
@@ -5706,19 +5841,9 @@ msgstr "Feilretter"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Search results"
+msgid "Search Results"
msgstr "Søk hjelp"
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "Søk i klasser"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
@@ -5729,6 +5854,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "Fjern Funksjon"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr ""
@@ -5760,10 +5894,6 @@ msgstr "Store bokstaver"
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5817,12 +5947,14 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
-msgstr ""
+#, fuzzy
+msgid "Convert Indent to Spaces"
+msgstr "Konverter til store versaler"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
-msgstr ""
+#, fuzzy
+msgid "Convert Indent to Tabs"
+msgstr "Konverter til store versaler"
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
@@ -5838,20 +5970,14 @@ msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr "Konverter til store versaler"
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "GÃ¥ til Neste Steg"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr "Konverter til små versaler"
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "GÃ¥ til tidligere redigert dokument."
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
@@ -5859,16 +5985,18 @@ msgstr "Finn forrige"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr "Filtrer Filer..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
-msgstr ""
+#, fuzzy
+msgid "Go to Function..."
+msgstr "Fjern Funksjon"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
-msgstr ""
+#, fuzzy
+msgid "Go to Line..."
+msgstr "GÃ¥ til Linje"
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
@@ -5963,6 +6091,15 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "Pitch"
+msgstr "Bryter"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -6130,6 +6267,11 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "Vis Informasjon"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -6232,11 +6374,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap To Floor"
-msgstr "Snap til rutenett"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6353,6 +6490,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
msgstr ""
@@ -6471,11 +6612,17 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+#, fuzzy
+msgid "Set Margin"
+msgstr "Sett Handle"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6644,6 +6791,11 @@ msgid "Fix Invalid Tiles"
msgstr "Ugyldig navn."
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "Plasser Utvalg I Midten"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6690,33 +6842,40 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "Fjern Utvalg"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr "Roter 0 grader"
+#, fuzzy
+msgid "Rotate left"
+msgstr "Roter Modus"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Rotate right"
+msgstr "Roter Polygon"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr "Roter 90 grader"
+msgid "Flip horizontally"
+msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
-msgstr "Roter 180 grader"
+msgid "Flip vertically"
+msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
-msgstr "Roter 270 grader"
+#, fuzzy
+msgid "Clear transform"
+msgstr "Anim Forandre Omforming"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr "Legg til node(r) fra tre"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr "Fjern Kurvepunkt"
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6728,25 +6887,47 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "Lim inn Animasjon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "Høyreklikk: Slett Punkt."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "Lag en ny polygon fra bunnen."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "Fjern Kurvepunkt"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6754,7 +6935,12 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Fjern Mal"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6764,16 +6950,27 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "Slett valgte filer?"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr ""
+msgstr "Velg Gjeldende Mappe"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "Slett punkter"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr "Velg Gjeldende Mappe"
@@ -6792,12 +6989,100 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr "Velg Gjeldende Mappe"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Lag mappe"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "Rediger Filtre"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Rediger eksisterende polygon:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Rediger Poly"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Rediger eksisterende polygon:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "Lim inn Animasjon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Fjern Mal"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "Fjern Poly Og Punkt"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "Fjern Funksjon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "Fjern Animasjon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "Rediger Filtre"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Lag Poly"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Lag Poly"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "This property can't be changed."
msgstr "Denne operasjonen kan ikke gjøres uten en scene."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Tile Set"
+msgid "TileSet"
msgstr "TileSet..."
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6834,6 +7119,15 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Exporting All"
+msgstr "Eksporter"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6842,6 +7136,11 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "Eksporter Prosjekt"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr "Ressurser"
@@ -6896,10 +7195,50 @@ msgid "Feature List:"
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "Kjør Skript"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Script Export Mode:"
+msgstr "Eksporter Prosjekt"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export mode?"
+msgstr "Eksporter Prosjekt"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Export All"
+msgstr "Eksporter"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -7032,7 +7371,8 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
-msgid "Can't open project"
+#, fuzzy
+msgid "Can't open project at '%s'."
msgstr "Kan ikke åpne prosjekt"
#: editor/project_manager.cpp
@@ -7041,6 +7381,24 @@ msgstr "Er du sikker på at du vil åpne mer enn ett prosjekt?"
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7361,10 +7719,6 @@ msgstr ""
msgid "General"
msgstr ""
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7501,10 +7855,6 @@ msgstr "Lim inn Noder"
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr ""
@@ -7595,7 +7945,7 @@ msgid "Step"
msgstr "Steg:"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7604,7 +7954,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7647,7 +7997,7 @@ msgstr "Store versaler"
msgid "Reset"
msgstr "Nullstill Zoom"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7706,6 +8056,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr ""
@@ -7742,6 +8096,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7818,6 +8178,11 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Open documentation"
+msgstr "Ã…pne Godots nettbaserte dokumentasjon"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr ""
@@ -7826,12 +8191,13 @@ msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Change Type"
-msgstr ""
+#, fuzzy
+msgid "Extend Script"
+msgstr "Kjør Skript"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -7986,6 +8352,11 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Filename is empty"
+msgstr "Ressurs-utklippstavle er tom!"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -8076,19 +8447,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -8121,18 +8480,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -8333,7 +8680,7 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+msgid "Step argument is zero!"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
@@ -8569,11 +8916,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -8859,6 +9202,10 @@ msgid "Base Type:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "Medlemmer:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "Tilgjengelige Noder:"
@@ -8960,12 +9307,11 @@ msgid "Search VisualScript"
msgstr "Lim inn Noder"
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
-msgid "Get"
-msgstr "Hent"
+msgid "Get %s"
+msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -9047,6 +9393,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -9085,6 +9437,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -9202,6 +9560,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -9221,6 +9589,26 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9253,7 +9641,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9311,6 +9699,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr "Animasjonstre er ugyldig."
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr ""
@@ -9327,11 +9719,6 @@ msgstr ""
msgid "Please Confirm..."
msgstr ""
-#: scene/gui/file_dialog.cpp
-#, fuzzy
-msgid "Select this Folder"
-msgstr "Kutt Noder"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9339,6 +9726,10 @@ msgid ""
"hide upon running."
msgstr ""
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9385,10 +9776,6 @@ msgstr "Ugyldig fontstørrelse."
msgid "Input"
msgstr "Legg til Input"
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
@@ -9406,6 +9793,148 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Split already exists."
+#~ msgstr "Eksisterer allerede"
+
+#, fuzzy
+#~ msgid "Add Split"
+#~ msgstr "Legg til punkt"
+
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr ": Ugyldige argumenter: "
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "Fjern punkt"
+
+#, fuzzy
+#~ msgid "Poly"
+#~ msgstr "Rediger Poly"
+
+#, fuzzy
+#~ msgid "Splits"
+#~ msgstr "Splitt Sti"
+
+#, fuzzy
+#~ msgid "Select a split to erase it."
+#~ msgstr "Velg en Mappe å Skanne"
+
+#~ msgid "No name provided"
+#~ msgstr "Ingen navn gitt"
+
+#~ msgid "Create Poly"
+#~ msgstr "Lag Poly"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "Lag en ny polygon fra bunnen"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "Zoom Ut"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "Zoom Inn"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "Lag Poly3D"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "Venstreklikk: Flytt Punkt."
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "Ctrl+Venstreklikk: Splitt Segment."
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "Høyreklikk: Slett Punkt."
+
+#, fuzzy
+#~ msgid "New TextFile"
+#~ msgstr "Vis Filer"
+
+#~ msgid "Save Theme As"
+#~ msgstr "Lagre drakt som"
+
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Zoom Inn"
+
+#~ msgid "Class List:"
+#~ msgstr "Klasseliste:"
+
+#~ msgid "Search Classes"
+#~ msgstr "Søk i klasser"
+
+#~ msgid "Public Methods"
+#~ msgstr "Offentlige metoder"
+
+#~ msgid "Public Methods:"
+#~ msgstr "Offentlige metoder:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "GUI Tema Elementer"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "GUI Tema Elementer:"
+
+#, fuzzy
+#~ msgid "Property: "
+#~ msgstr "Egenskaper"
+
+#, fuzzy
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "Vis/skjul mappestatus som Favoritt"
+
+#, fuzzy
+#~ msgid "Show current scene file."
+#~ msgstr "Velg Gjeldende Mappe"
+
+#, fuzzy
+#~ msgid "Whole words"
+#~ msgstr "Hele Ord"
+
+#, fuzzy
+#~ msgid "Match case"
+#~ msgstr "Match Tilfelle"
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "Søk i klasse-hierarkiet."
+
+#, fuzzy
+#~ msgid "Search in files"
+#~ msgstr "Søk i klasser"
+
+#~ msgid "Convert To Uppercase"
+#~ msgstr "Konverter til store versaler"
+
+#~ msgid "Convert To Lowercase"
+#~ msgstr "Konverter til små versaler"
+
+#, fuzzy
+#~ msgid "Snap To Floor"
+#~ msgstr "Snap til rutenett"
+
+#~ msgid "Rotate 0 degrees"
+#~ msgstr "Roter 0 grader"
+
+#~ msgid "Rotate 90 degrees"
+#~ msgstr "Roter 90 grader"
+
+#~ msgid "Rotate 180 degrees"
+#~ msgstr "Roter 180 grader"
+
+#~ msgid "Rotate 270 degrees"
+#~ msgstr "Roter 270 grader"
+
+#, fuzzy
+#~ msgid "Get"
+#~ msgstr "Hent"
+
#~ msgid "Change Comment"
#~ msgstr "Endre Kommentar"
@@ -9511,9 +10040,6 @@ msgstr ""
#~ msgid "Ugh"
#~ msgstr "Æsj"
-#~ msgid "Save the currently edited resource."
-#~ msgstr "Lagre den nylige redigerte ressursen."
-
#~ msgid "Stop Profiling"
#~ msgstr "Stopp Profilering"
@@ -9574,9 +10100,6 @@ msgstr ""
#~ msgid "Sequence"
#~ msgstr "Sekvens"
-#~ msgid "Switch"
-#~ msgstr "Bryter"
-
#~ msgid "While"
#~ msgstr "Mens"
diff --git a/editor/translations/nl.po b/editor/translations/nl.po
index 5c0aa6546c..90c49fdba1 100644
--- a/editor/translations/nl.po
+++ b/editor/translations/nl.po
@@ -1,6 +1,6 @@
# Dutch translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# aelspire <aelspire@gmail.com>, 2017.
# Aram Nap <xyphex.aram@gmail.com>, 2017.
@@ -24,18 +24,23 @@
# Wout Standaert <wout@blobkat.com>, 2017.
# Zatherz <zatherz@linux.pl>, 2017.
# Tahar Meijs <tntmeijs@gmail.com>, 2018.
+# Laurent Windels <laurentwindels@yahoo.com>, 2018.
+# rxadmin <r.van.eeghem@gmail.com>, 2018.
+# Peter Goelst <muis24@gmail.com>, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-08-07 22:36+0000\n"
-"Last-Translator: Willem <studiebolmail@gmail.com>\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2019-01-13 15:06+0000\n"
+"Last-Translator: Peter Goelst <muis24@gmail.com>\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/godot-engine/godot/"
"nl/>\n"
"Language: nl\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.2-dev\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -43,41 +48,39 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr "Ongeldige type argument voor convert(), gebruik TYPE_* constanten."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr "Niet genoeg bytes om bytes te decoderen, of ongeldig formaat."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Ongeldige invoer %i (niet doorgegeven) in expressie"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
msgstr ""
+"self kan niet gebruikt worden omdat de instantie null is (niet doorgegeven)"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "Ongeldige index eigenschap naam '%s' in node %s."
+msgstr "Ongeldige operand voor operator %s, %s en %s."
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid index of type %s for base type %s"
-msgstr "Ongeldige index eigenschap naam '%s' in node %s."
+msgstr "Ongeldige index in type %s voor basis-type %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "Ongeldige indexnaam %s voor basis-type %s"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid arguments to construct '%s'"
-msgstr ": Ongeldig argument van type: "
+msgstr "Ongeldig argument in constructie '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "Tijdens invocatie van '%s':"
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -86,27 +89,23 @@ msgstr "Vrij"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "Gebalanceerd"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Mirror"
-msgstr "Spiegel X"
+msgstr "Spiegel"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "Voer Sleutel in"
+msgstr "Hier Key invoegen"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "Dupliceer Selectie"
+msgstr "Kopieer Geselecteerde Key(s)"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "Geselecteerde Verwijderen"
+msgstr "Geselecteerde Key(s) Verwijderen"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -138,44 +137,39 @@ msgstr "Anim Wijzig Aanroep"
#: editor/animation_track_editor.cpp
msgid "Property Track"
-msgstr ""
+msgstr "Eigenschap Track"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "3D Transform Track"
-msgstr "Transformatie Type"
+msgstr "3D Transformatie Track"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "Methode Invocatie Track"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "Bezier-curve Track"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "Audio Terugspelen Track"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Playback Track"
-msgstr "Stop animatie opname. (S)"
+msgstr "Animatie Terugspelen Track"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
-msgstr "Anim Track Toevoegen"
+msgstr "Track Toevoegen"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Length Time (seconds)"
-msgstr "Animatie lengte (in seconden)."
+msgstr "Animatielengte (in seconden)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "Animatie zoom."
+msgstr "Animatie Loopen"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -183,41 +177,37 @@ msgid "Functions:"
msgstr "Functies:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Audio Clips:"
-msgstr "Audio Luisteraar"
+msgstr "Audioclips:"
#: editor/animation_track_editor.cpp
msgid "Anim Clips:"
-msgstr ""
+msgstr "Animatieclips:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Toggle this track on/off."
-msgstr "Afleidingsvrije modus veranderen."
+msgstr "Aan-uitschakelaar Track."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "Update Modus (Setting van deze eigenschap)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Interpolation Mode"
-msgstr "Animatie Node"
+msgstr "Interpolatiemodus"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
msgstr ""
+"Terugloopmodus (Interpolatie tussen het begin en het einde van de loop)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "Verwijder geselecteerde track."
+msgstr "Verwijder deze track."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "X-Fade Tijd (en):"
+msgstr "Tijd (s): "
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -232,13 +222,12 @@ msgid "Trigger"
msgstr "Trigger"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Capture"
-msgstr "Kenmerken"
+msgstr "Vastleggen"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "Dichtstbijzijnde"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
@@ -247,15 +236,15 @@ msgstr "Lineair"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr ""
+msgstr "Kubiek"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
-msgstr ""
+msgstr "Klem loop interpolatie"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "Loop Interpolatie Terug"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -263,14 +252,12 @@ msgid "Insert Key"
msgstr "Voer Sleutel in"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "Anim Dupliceer Keys"
+msgstr "Dupliceer Key(s)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "Anim Verwijder Keys"
+msgstr "Verwijder Key(s)"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -288,7 +275,6 @@ msgstr "Maak %d NIEUWE tracks aan en keys invoeren?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -300,7 +286,7 @@ msgstr "Anim Invoegen"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
-msgstr ""
+msgstr "Animatie-Speler kan zichzelf niet animeren, alleen andere spelers."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
@@ -317,6 +303,8 @@ msgstr "Anim Key Invoegen"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
msgstr ""
+"Transformatie tracks zijn alleen te gebruiken met nodes die een dimensionale "
+"oriëntatie hebben."
#: editor/animation_track_editor.cpp
msgid ""
@@ -325,44 +313,46 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"Audio tracks kunnen enkel verwijzen naar nodes van het type:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "Animatie tracks kunnen enkel verwijzen naar AnimatiePlayer nodes."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
-msgstr ""
+msgstr "Een animatiespeler kan zichzelf niet animeren, alleen andere spelers."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "Niet mogelijk om een nieuwe track toe te voegen zonder een root"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "Track path is niet geldig, dus kan geen key toevoegen."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "Track is niet van het type Spatial, kan geen key invoegen"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
-msgstr ""
+msgstr "Track path is niet geldig, dus kan geen methode key toevoegen."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Method not found in object: "
-msgstr "VariableGet niet gevonden in script: "
+msgstr "Methode niet gevonden in object "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
msgstr "Anim Verplaats Keys"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clipboard is empty"
-msgstr "Bronnen klembord is leeg!"
+msgstr "Klembord is leeg"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
@@ -372,14 +362,16 @@ msgstr "Anim Schaal Keys"
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
msgstr ""
+"Deze optie is nu niet mogelijk bij Bezier bewerken omdat slechts een spoor "
+"aanwezig is."
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "Toon alleen sporen die horen bij de geselecteerde node in de boom."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr ""
+msgstr "Sporen weergeven op basis van nodes of als lijst."
#: editor/animation_track_editor.cpp
#, fuzzy
@@ -387,9 +379,8 @@ msgid "Snap (s): "
msgstr "Stap(pen):"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "Animatie boom is geldig."
+msgstr "Animatie stap waarde."
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -401,30 +392,26 @@ msgid "Edit"
msgstr "Bewerken"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "AnimatieBoom"
+msgstr "Animatie eigenschappen."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "Kopieer Parameters"
+msgstr "Kopieer sporen"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "Plak Parameters"
+msgstr "Plak sporen"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
-msgstr "Schaal Selectie"
+msgstr "Schaal selectie"
#: editor/animation_track_editor.cpp
msgid "Scale From Cursor"
msgstr "Schaal Vanaf Cursor"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Dupliceer Selectie"
@@ -433,16 +420,17 @@ msgid "Duplicate Transposed"
msgstr "Dupliceer Getransponeerde"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
-msgstr "Geselecteerde Verwijderen"
+msgstr "Verwijder Selectie"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+#, fuzzy
+msgid "Go to Next Step"
msgstr "Ga Naar Volgende Stap"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+#, fuzzy
+msgid "Go to Previous Step"
msgstr "Ga Naar Vorige Stap"
#: editor/animation_track_editor.cpp
@@ -455,11 +443,11 @@ msgstr "Animatie Opschonen"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "Kies de node die geanimeerd zal worden:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "Gebruik Bezier Curves"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
@@ -467,11 +455,11 @@ msgstr "Anim. Optimalisator"
#: editor/animation_track_editor.cpp
msgid "Max. Linear Error:"
-msgstr "Max. Lineair Error:"
+msgstr "Max. Lineaire Fout:"
#: editor/animation_track_editor.cpp
msgid "Max. Angular Error:"
-msgstr "Max. Hoekig Error:"
+msgstr "Max. Fout in hoek:"
#: editor/animation_track_editor.cpp
msgid "Max Optimizable Angle:"
@@ -483,11 +471,11 @@ msgstr "Optimaliseren"
#: editor/animation_track_editor.cpp
msgid "Remove invalid keys"
-msgstr "Verwijder ongeldige keys"
+msgstr "Verwijder ongeldige sleutels"
#: editor/animation_track_editor.cpp
msgid "Remove unresolved and empty tracks"
-msgstr "Verwijder onopgeloste en lege tracks"
+msgstr "Verwijder onopgeloste en lege sporen"
#: editor/animation_track_editor.cpp
msgid "Clean-up all animations"
@@ -507,7 +495,7 @@ msgstr "Schaal Ratio:"
#: editor/animation_track_editor.cpp
msgid "Select tracks to copy:"
-msgstr ""
+msgstr "Selecteer sporen om te kopieren:"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -519,7 +507,7 @@ msgstr "Kopiëren"
#: editor/array_property_edit.cpp
msgid "Resize Array"
-msgstr "Array van Grootte Veranderen"
+msgstr "Array Grootte Wijzigen"
#: editor/array_property_edit.cpp
msgid "Change Array Value Type"
@@ -539,17 +527,17 @@ msgstr "Regelnummer:"
#: editor/code_editor.cpp editor/editor_help.cpp
msgid "No Matches"
-msgstr "Geen Matches"
+msgstr "Geen Overeenkomsten"
#: editor/code_editor.cpp
msgid "Replaced %d occurrence(s)."
msgstr "%d voorgekomen waarde(s) vervangen."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Hoofdlettergevoelig"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "Hele Woorden"
@@ -565,28 +553,32 @@ msgstr "Alle Vervangen"
msgid "Selection Only"
msgstr "Alleen Selectie"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Inzoomen"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "Uitzoomen"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
-msgstr "Reset Zoom"
+msgstr "Initialiseer Zoom"
#: editor/code_editor.cpp
msgid "Warnings:"
-msgstr ""
+msgstr "Waarschuwingen:"
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "Inzoomen"
+msgid "Font Size:"
+msgstr "Vooraanzicht"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Regel:"
@@ -596,15 +588,15 @@ msgstr "Kolom:"
#: editor/connections_dialog.cpp
msgid "Method in target Node must be specified!"
-msgstr "Methode in target Node moet gespecificeerd worden!"
+msgstr "Methode in doel Node moet gespecificeerd worden!"
#: editor/connections_dialog.cpp
msgid ""
"Target method not found! Specify a valid method or attach a script to target "
"Node."
msgstr ""
-"Target methode niet gevonden! Specificeer een geldige methode of koppel een "
-"script aan de target Node."
+"Doel methode niet gevonden! Specificeer een geldige methode of koppel een "
+"script aan de doel Node."
#: editor/connections_dialog.cpp
msgid "Connect To Node:"
@@ -619,6 +611,7 @@ msgstr "Toevoegen"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -689,19 +682,17 @@ msgid "Disconnect"
msgstr "Losmaken"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect Signal: "
-msgstr "Signaal aan het Verbinden:"
+msgstr "Verbind met Signaal: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection: "
-msgstr "Verbindingsfout"
+msgstr "Verbinding bewerken: "
#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "Are you sure you want to remove all connections from the \""
-msgstr "Weet je zeker dat je meerdere projecten wilt uitvoeren?"
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr ""
+"Weet je zeker dat je alle verbindingen met signaal \"%s\" wilt verwijderen?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -710,6 +701,7 @@ msgstr "Signalen"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
msgstr ""
+"Weet je zeker dat je alle verbindingen naar dit signaal wilt verwijderen?"
#: editor/connections_dialog.cpp
#, fuzzy
@@ -722,9 +714,8 @@ msgid "Edit..."
msgstr "Bewerken"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "Methodes"
+msgstr "Ga Naar Methode"
#: editor/create_dialog.cpp
msgid "Change %s Type"
@@ -737,7 +728,7 @@ msgstr "Wijzig"
#: editor/create_dialog.cpp
msgid "Create New %s"
-msgstr "Maake Nieuwe %s"
+msgstr "Maak Nieuwe %s"
#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp
@@ -749,23 +740,20 @@ msgid "Recent:"
msgstr "Recente:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Zoeken:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "Overeenkomsten:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "Omschrijving:"
@@ -784,7 +772,7 @@ msgid ""
"Changes will not take effect unless reloaded."
msgstr ""
"Scene '%s' wordt op dit moment gewijzigd.\n"
-"Wijzigingen hebben geen effect tenzij ze herladen worden."
+"Wijzigingen hebben geen effect tenzij de scene herladen worden."
#: editor/dependency_editor.cpp
msgid ""
@@ -801,11 +789,10 @@ msgstr "Afhankelijkheden"
#: editor/dependency_editor.cpp
msgid "Resource"
-msgstr "Resource"
+msgstr "Bron"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "Pad"
@@ -815,7 +802,7 @@ msgstr "Afhankelijkheden:"
#: editor/dependency_editor.cpp
msgid "Fix Broken"
-msgstr "Gebroken Repareren"
+msgstr "Repareer defecten"
#: editor/dependency_editor.cpp
msgid "Dependency Editor"
@@ -826,9 +813,10 @@ msgid "Search Replacement Resource:"
msgstr "Zoek Vervangende Resource:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -863,7 +851,8 @@ msgid "Error loading:"
msgstr "Error bij het laden van:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+#, fuzzy
+msgid "Load failed due to missing dependencies:"
msgstr "Scene faalde om te laden door ontbrekende afhankelijkheden:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -922,14 +911,6 @@ msgstr "Wijzig Array Waarde"
msgid "Thanks from the Godot community!"
msgstr "Bedankt van de Godot gemeenschap!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "Oké"
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Godot Engine medewerkers"
@@ -1023,7 +1004,8 @@ msgid "Uncompressing Assets"
msgstr "Bronnen aan het uitpakken"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+#, fuzzy
+msgid "Package installed successfully!"
msgstr "Pakket Succesvol Geïnstalleerd!"
#: editor/editor_asset_installer.cpp
@@ -1105,8 +1087,7 @@ msgid "Bus options"
msgstr "Audiobusopties"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "Dupliceren"
@@ -1268,7 +1249,7 @@ msgid "Add AutoLoad"
msgstr "AutoLoad Toevoegen"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "Pad:"
@@ -1276,8 +1257,8 @@ msgstr "Pad:"
msgid "Node Name:"
msgstr "Node Naam:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "Naam"
@@ -1347,12 +1328,17 @@ msgid "Template file not found:"
msgstr "Template bestand niet gevonden:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Selecteer Huidige Map"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "Bestand Bestaat, Overschrijven?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "Selecteer Huidige Map"
+#, fuzzy
+msgid "Select This Folder"
+msgstr "Selecteer Modus"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
@@ -1360,12 +1346,13 @@ msgstr "Kopieer Pad"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr "Weergeven in Bestandsbeheer"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+#, fuzzy
+msgid "Show in File Manager"
msgstr "Weergeven in Bestandsbeheer"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1401,7 +1388,8 @@ msgid "Open a File or Directory"
msgstr "Open een Bestand of Map"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Opslaan"
@@ -1459,8 +1447,7 @@ msgstr "Mappen & Bestanden:"
msgid "Preview:"
msgstr "Voorbeeld:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "Bestand:"
@@ -1476,24 +1463,11 @@ msgstr "Scan Bronnen"
msgid "(Re)Importing Assets"
msgstr "Bronnen (Her)Importeren"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "Zoek Hulp"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "Klasse Lijst:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "Zoek Klasses"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "Boven"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "Klasse:"
@@ -1510,28 +1484,31 @@ msgid "Brief Description:"
msgstr "Korte Beschrijving:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "Leden"
+msgid "Properties"
+msgstr "Eigenschappen"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "Leden:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr "Eigenschappen:"
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "Publieke Methodes"
+msgid "Methods"
+msgstr "Methodes"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "Publieke Methodes:"
+#, fuzzy
+msgid "Methods:"
+msgstr "Methodes"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "GUI Thema Items"
+#, fuzzy
+msgid "Theme Properties"
+msgstr "Eigenschappen"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "GUI Thema Items:"
+#, fuzzy
+msgid "Theme Properties:"
+msgstr "Eigenschappen:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1558,10 +1535,16 @@ msgid "Constants:"
msgstr "Constanten:"
#: editor/editor_help.cpp
-msgid "Description"
+#, fuzzy
+msgid "Class Description"
msgstr "Beschrijving"
#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
+msgstr "Omschrijving:"
+
+#: editor/editor_help.cpp
msgid "Online Tutorials:"
msgstr "Online Documentatie:"
@@ -1576,11 +1559,13 @@ msgstr ""
"$color][url=$url2]een aan te vragen[/url][/color]."
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "Eigenschappen"
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "Eigenschap Beschrijving:"
#: editor/editor_help.cpp
-msgid "Property Description:"
+#, fuzzy
+msgid "Property Descriptions:"
msgstr "Eigenschap Beschrijving:"
#: editor/editor_help.cpp
@@ -1592,11 +1577,13 @@ msgstr ""
"door [color=$color][url=$url]een toe te voegen[/url][/color]!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "Methodes"
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "Methode Beschrijving:"
#: editor/editor_help.cpp
-msgid "Method Description:"
+#, fuzzy
+msgid "Method Descriptions:"
msgstr "Methode Beschrijving:"
#: editor/editor_help.cpp
@@ -1607,12 +1594,61 @@ msgstr ""
"Er is momenteel geen beschrijving voor deze methode. Help ons alsjeblieft "
"door [color=$color][url=$url]een toe te voegen[/url][/color]!"
-#: editor/editor_inspector.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Zoek Hulp"
+
+#: editor/editor_help_search.cpp
#, fuzzy
-msgid "Property: "
-msgstr "Eigenschappen:"
+msgid "Display All"
+msgstr "Weergave Normaalvector"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Classes Only"
+msgstr "Klassen"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Methods Only"
+msgstr "Methodes"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "Signalen"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Constants Only"
+msgstr "Constanten"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Properties Only"
+msgstr "Eigenschappen"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Theme Properties Only"
+msgstr "Eigenschappen"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Member Type"
+msgstr "Leden"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Class"
+msgstr "Klasse:"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr "Zet"
@@ -1646,6 +1682,11 @@ msgstr "Project exporteren faalt door foutcode %d."
msgid "Error saving resource!"
msgstr "Error bij het opslaan van resource!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "Oké"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "Resource Opslaan Als..."
@@ -1700,12 +1741,22 @@ msgstr "Deze operatie kan niet gedaan worden zonder boomwortel."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
"Kon de scene niet opslaan. Waarschijnlijk konden afhankelijkheden "
"(instanties of erfelijkheden) niet voldaan worden."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr "Kan MeshLibrary niet laden om te samenvoegen!"
@@ -1967,6 +2018,14 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "Volgend script kon niet geladen worden: '%s'."
#: editor/editor_node.cpp
+#, fuzzy
+msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"Volgend script kon niet geladen worden: '%s' Script is niet in tool modus."
+
+#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -2015,6 +2074,12 @@ msgstr "Layout Verwijderen"
msgid "Default"
msgstr "Standaard"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+#, fuzzy
+msgid "Show in FileSystem"
+msgstr "Toon in Bestandsbeheer"
+
#: editor/editor_node.cpp
#, fuzzy
msgid "Play This Scene"
@@ -2098,7 +2163,8 @@ msgid "Save Scene"
msgstr "Scene Opslaan"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+#, fuzzy
+msgid "Save All Scenes"
msgstr "Alle Scenes Opslaan"
#: editor/editor_node.cpp
@@ -2127,7 +2193,7 @@ msgid "Undo"
msgstr "Ongedaan Maken"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Opnieuw"
@@ -2151,7 +2217,7 @@ msgstr "Projectinstellingen"
msgid "Export"
msgstr "Exporteren"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "Gereedschappen"
@@ -2165,6 +2231,7 @@ msgid "Quit to Project List"
msgstr "Sluit af naar Projectlijst"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "Debuggen"
@@ -2294,10 +2361,6 @@ msgstr "Beheer Export Templates"
msgid "Help"
msgstr "Help"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "Klassen"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2392,24 +2455,24 @@ msgstr "Update Veranderingen"
msgid "Disable Update Spinner"
msgstr "Schakel Update Draaier Uit"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "Inspecteur"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "Importeren"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "Knooppunt"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "Bestandssysteem"
#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr "Inspecteur"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Knooppunt"
+
+#: editor/editor_node.cpp
#, fuzzy
msgid "Expand Bottom Panel"
msgstr "Klap alles uit"
@@ -2547,7 +2610,7 @@ msgstr "Frame %"
msgid "Physics Frame %"
msgstr "Physics Frame %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "Tijd:"
@@ -2571,7 +2634,7 @@ msgstr "Tijd"
msgid "Calls"
msgstr "Aanroepen"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2583,20 +2646,44 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr "[Leeg]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "Ongeldig Path"
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr "Kies een Aanzicht portaal"
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr ""
@@ -2608,10 +2695,6 @@ msgstr ""
msgid "Make Unique"
msgstr "Maak Uniek"
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2620,7 +2703,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "Plakken"
@@ -2914,6 +2998,11 @@ msgstr ""
"bewaard!"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "Favorieten:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
"Kan niet naar '%s' navigeren omdat het niet in het bestandssysteem gevonden "
@@ -2955,19 +3044,15 @@ msgstr "Fout bij het dupliceren:"
msgid "Unable to update dependencies:"
msgstr "Kon afhankelijkheden niet updaten:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "Geen naam opgegeven"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "Geen naam opgegeven."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "De opgegeven naam bevat ongeldige tekens"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "Geen naam opgegeven."
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "Naam bevat ongeldige tekens."
@@ -2992,22 +3077,6 @@ msgid "Duplicating folder:"
msgstr "Folder dupliceren:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "Klap alles uit"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "Klap alles in"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "Hernoemen..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "Verplaats Naar..."
-
-#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
msgstr "Scene(s) Openen"
@@ -3016,6 +3085,16 @@ msgid "Instance"
msgstr "Instantie"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Add to favorites"
+msgstr "Favorieten:"
+
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Remove from favorites"
+msgstr "Verwijderen uit Groep"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "Afhankelijkheden aanpassen..."
@@ -3023,11 +3102,19 @@ msgstr "Afhankelijkheden aanpassen..."
msgid "View Owners..."
msgstr "Bekijk eigenaren..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "Hernoemen..."
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "Dupliceren..."
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr "Verplaats Naar..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
msgstr "Open Script Snel..."
@@ -3037,6 +3124,16 @@ msgstr "Open Script Snel..."
msgid "New Resource..."
msgstr "Resource Opslaan Als..."
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Expand All"
+msgstr "Klap alles uit"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Collapse All"
+msgstr "Klap alles in"
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -3058,13 +3155,13 @@ msgstr "Bestandssysteem Opnieuw Scannen"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "Schakel folder status als Favoriet"
+msgid "Toggle split mode"
+msgstr "Toggle Modus"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Show current scene file."
-msgstr "Selecteer zojuist bewerkte sub-tegel."
+msgid "Search files"
+msgstr "Zoek Klasses"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
@@ -3073,15 +3170,6 @@ msgstr ""
"geselecteerde knoop."
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "Zoek Klasses"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3089,7 +3177,7 @@ msgstr ""
"Bestanden Scannen,\n"
"Wacht Alstublieft..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "Verplaatsen"
@@ -3108,31 +3196,22 @@ msgstr "Creëer Script"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find in files"
+msgid "Find in Files"
msgstr "Vind Tegel"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find: "
+msgid "Find:"
msgstr "Zoeken"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Whole words"
-msgstr "Hele Woorden"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "Hoofdlettergevoelig"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "Map Maken"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Filter: "
+msgid "Filters:"
msgstr "Filter:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -3150,6 +3229,11 @@ msgstr "Annuleer"
#: editor/find_in_files.cpp
#, fuzzy
+msgid "Find: "
+msgstr "Zoeken"
+
+#: editor/find_in_files.cpp
+#, fuzzy
msgid "Replace: "
msgstr "Vervangen"
@@ -3175,7 +3259,7 @@ msgstr "FOUTMELDING: Animatie naam bestaat al!"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr "Ongeldige naam."
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3315,17 +3399,14 @@ msgstr "Herimporteer"
msgid "Failed to load resource."
msgstr "Mislukt om resource te laden."
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "Oké"
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+#, fuzzy
+msgid "Expand All Properties"
msgstr "Klap alle eigenschappen uit"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+#, fuzzy
+msgid "Collapse All Properties"
msgstr "Klap alle eigenschappen in"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3371,6 +3452,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "Laad een bestaande bron van de schijf en bewerk het."
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "De bewerkte bron opslaan."
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "Ga naar het vorige bewerkte object in de geschiedenis."
@@ -3436,14 +3521,14 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
msgstr "Creëer Poly"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+#, fuzzy
+msgid "Edit Polygon"
msgstr "Bewerk Poly"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3451,25 +3536,28 @@ msgid "Insert Point"
msgstr "Punt Toevoegen"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+#, fuzzy
+msgid "Edit Polygon (Remove Point)"
msgstr "Bewerk Poly (Verwijder punt)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+#, fuzzy
+msgid "Remove Polygon And Point"
msgstr "Verwijder Poly en punt"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "Begin een nieuwe polygoon"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr "Verwijder punten"
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#, fuzzy
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
"Bewerk bestaande polygoon:\n"
"LMK: Verplaats punt.\n"
@@ -3477,8 +3565,10 @@ msgstr ""
"RMK: Wis punt."
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
-msgstr "Verwijder punten"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#, fuzzy
+msgid "Erase points."
+msgstr "RMB: Verwijder Punt."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3493,7 +3583,7 @@ msgstr "Voeg Animatie Toe"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
+msgid "Load..."
msgstr "Laden"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3522,15 +3612,9 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Verwijder punten"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "RMB: Verwijder Punt."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3572,10 +3656,9 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr "Snap"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Mengen:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3609,7 +3692,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
-msgid "Add Node.."
+msgid "Add Node..."
msgstr "Node Toevoegen"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3891,7 +3974,7 @@ msgstr "Verbind Aan Node:"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "Verwijder geselecteerde track."
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3959,10 +4042,6 @@ msgid "Amount:"
msgstr "Hoeveelheid:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "Mengen:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "Meng 0:"
@@ -4164,7 +4243,7 @@ msgstr "Alle"
msgid "Plugins"
msgstr "Plugins"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "Sorteren:"
@@ -4300,6 +4379,11 @@ msgstr "CanvasItem Bewerken"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Scale CanvasItem"
+msgstr "CanvasItem Bewerken"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Move CanvasItem"
msgstr "CanvasItem Bewerken"
@@ -4320,21 +4404,19 @@ msgid "Paste Pose"
msgstr "Plak Houding"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "Uitzoomen"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "Uitzoomen"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Inzoomen"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr "Selecteer Modus"
@@ -4365,6 +4447,11 @@ msgid "Rotate Mode"
msgstr "Rotatiemodus"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "Schaalstand (R)"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4468,6 +4555,11 @@ msgstr ""
"object."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "Singleton"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "Laat Botten Zien"
@@ -4519,6 +4611,10 @@ msgid "Show Viewport"
msgstr "Toon Aanzicht Portaal"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr "Centreer Selectie"
@@ -4590,8 +4686,17 @@ msgstr ""
"Sleep & laat los + Alt : Verander node type"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr "Maak Poly3D"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "Creëer Poly"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Bewerk Poly"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Bewerk Poly (Verwijder punt)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
@@ -4694,37 +4799,9 @@ msgid "Item List Editor"
msgstr "Item Lijst Editor"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"Geen OccluderPolygon2D resource op deze node.\n"
-"Creëer en wijs één toe?"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr "Creëer Occluder Polygon"
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr "Creëer een compleet nieuwe polygon."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "Wijzig bestaande polygon:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "LMB: Verplaats Punt."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr "Ctrl+LMB: Splits Segment."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "RMB: Verwijder Punt."
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr "Mesh is leeg!"
@@ -4965,13 +5042,14 @@ msgid "Populate"
msgstr "Bevolken"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr "Creëer Navigatie Polygoon"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr "AABB Genereren"
+#, fuzzy
+msgid "Generating Visibility Rect"
+msgstr "Genereer Zichtbaarheid Rechthoek"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -4999,6 +5077,12 @@ msgstr "Leeg Emissie Masker"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "Convert to CPUParticles"
+msgstr "Converteer Naar Hoofdletters"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr "Partikels"
@@ -5068,13 +5152,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr "Een processor materiaal of type 'PartikelMateriaal' is nodig."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
-msgstr "Genereer AABB"
+msgid "Generating AABB"
+msgstr "AABB Genereren"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "Converteer Naar Hoofdletters"
+msgid "Generate AABB"
+msgstr "Genereer AABB"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5098,6 +5181,11 @@ msgid "Add Point to Curve"
msgstr "Voeg Punt toe aan Curve"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "Sluit Curve"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr "Verplaats Punt in Curve"
@@ -5125,6 +5213,11 @@ msgid "Click: Add Point"
msgstr "Klik: Voeg Punt Toe"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Left Click: Split Segment (in curve)"
+msgstr "Splits Segment (in curve)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr "Rechter Klik: Verwijder Punt"
@@ -5140,11 +5233,6 @@ msgstr "Voeg Punt Toe (in lege ruimte)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr "Splits Segment (in curve)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "Verwijder Punt"
@@ -5201,6 +5289,10 @@ msgstr "Verwijder Uit-Controle Punt"
msgid "Remove In-Control Point"
msgstr "Verwijder In-Controle Punt"
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Splits Segment (in curve)"
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5213,10 +5305,16 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Sync bones"
+msgid "Sync Bones"
msgstr "Laat Botten Zien"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr "Creëer UV Map"
@@ -5226,42 +5324,48 @@ msgid "Create Polygon & UV"
msgstr "Creëer Poly"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "Maak nieuwe horizontale gids"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "Bestaat al"
+msgid "Remove Internal Vertex"
+msgstr "Verwijder In-Controle Punt"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Add Split"
-msgstr "Punt toevoegen"
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "Ongeldig Pad."
+msgid "Add Custom Polygon"
+msgstr "Bewerk Poly"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Punt verwijderen"
+msgid "Remove Custom Polygon"
+msgstr "Verwijder Poly en punt"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr "Transformeer UV Map"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
+#, fuzzy
+msgid "Transform Polygon"
+msgstr "Transformatie Type"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Open Polygon 2D UV editor."
+msgstr "Polygon 2D UV Editor"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
msgstr "Polygon 2D UV Editor"
@@ -5271,13 +5375,13 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "Bewerk Poly"
+msgid "Points"
+msgstr "Beweeg Punt"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Splits"
-msgstr "Splits Pad"
+msgid "Polygons"
+msgstr "Polygon->UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -5286,11 +5390,7 @@ msgstr "Maak Botten"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
-msgstr "Creëer Poly"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Move Points"
msgstr "Beweeg Punt"
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5318,20 +5418,21 @@ msgid "Scale Polygon"
msgstr "Schaal Polygon"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "Selecteer een map om te scannen"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5356,6 +5457,11 @@ msgid "Grid Settings"
msgstr "Instellingen"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "Snap"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr "Zet Snap Aan"
@@ -5419,22 +5525,22 @@ msgid "Paste Resource"
msgstr "Plak Bron"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "Openen in Editor"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr "Instantie:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr "Type:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Openen in Editor"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr "Laad Bron"
@@ -5467,6 +5573,11 @@ msgstr "Error bij het opslaan van TileSet!"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
+msgid "Error: could not load file."
+msgstr "Map kon niet gemaakt worden."
+
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Error could not load file."
msgstr "Map kon niet gemaakt worden."
@@ -5476,19 +5587,23 @@ msgid "Error saving file!"
msgstr "Error bij het opslaan van TileSet!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
+#, fuzzy
+msgid "Error while saving theme."
msgstr "Fout bij het opslaan van het thema"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+#, fuzzy
+msgid "Error Saving"
msgstr "Fout bij het opslaan"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
+#, fuzzy
+msgid "Error importing theme."
msgstr "Fout bij import van thema"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+#, fuzzy
+msgid "Error Importing"
msgstr "Fout bij importeren"
#: editor/plugins/script_editor_plugin.cpp
@@ -5511,6 +5626,14 @@ msgid "Import Theme"
msgstr "Importeer Thema"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Fout bij het opslaan van het thema"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Fout bij het opslaan"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr "Thema Opslaan Als..."
@@ -5552,8 +5675,8 @@ msgstr "Bestand"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile"
-msgstr "Bekijk Bestanden"
+msgid "Open..."
+msgstr "Openen"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5568,11 +5691,8 @@ msgid "Copy Script Path"
msgstr "Kopieer Script Pad"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr "Toon in Bestandsbeheer"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+#, fuzzy
+msgid "History Previous"
msgstr "Geschiedenis voorgaande"
#: editor/plugins/script_editor_plugin.cpp
@@ -5585,6 +5705,11 @@ msgid "Theme"
msgstr "Thema"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Import Theme..."
+msgstr "Importeer Thema"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
msgstr "Herlaad Thema"
@@ -5593,10 +5718,6 @@ msgid "Save Theme"
msgstr "Thema Opslaan"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "Thema Opslaan Als"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "Sluit Docs"
@@ -5643,7 +5764,8 @@ msgid "Keep Debugger Open"
msgstr "Houd Debugger Open"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+#, fuzzy
+msgid "Debug with External Editor"
msgstr "Debug met externe editor"
#: editor/plugins/script_editor_plugin.cpp
@@ -5651,10 +5773,6 @@ msgid "Open Godot online documentation"
msgstr "Open Godot online documentatie"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr "Zoek in de klasse hiërarchie."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Zoek in de referentie documentatie."
@@ -5692,21 +5810,9 @@ msgstr "Debugger"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Search results"
+msgid "Search Results"
msgstr "Zoek Hulp"
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "Zoek Klasses"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-"Ingebouwde scripts kunnen alleen ge-edit worden wanneer de bijbehorende "
-"scène geladen is"
-
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
@@ -5717,6 +5823,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "Ga Naar Functie..."
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr "Alleen bronnen uit bestandssysteem kunnen gedropt worden."
@@ -5749,10 +5864,6 @@ msgstr "Maak Hoofdletters"
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5804,11 +5915,13 @@ msgid "Trim Trailing Whitespace"
msgstr "Trim Navolgende Spaties"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+#, fuzzy
+msgid "Convert Indent to Spaces"
msgstr "Converteer Indentatie Naar Spaties"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+#, fuzzy
+msgid "Convert Indent to Tabs"
msgstr "Converteer Indentatie Naar Tabs"
#: editor/plugins/script_text_editor.cpp
@@ -5825,36 +5938,32 @@ msgid "Remove All Breakpoints"
msgstr "Verwijder Alle Breekpunten"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
+#, fuzzy
+msgid "Go to Next Breakpoint"
msgstr "Ga Naar Volgende Breekpunt"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
+#, fuzzy
+msgid "Go to Previous Breakpoint"
msgstr "Ga Naar Vorige Breekpunt"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr "Converteer Naar Hoofdletters"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr "Converteer Naar Kleine Letters"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr "Vind Vorige"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr "Bestanden Filteren..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+#, fuzzy
+msgid "Go to Function..."
msgstr "Ga Naar Functie..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+#, fuzzy
+msgid "Go to Line..."
msgstr "Ga Naar Regel..."
#: editor/plugins/script_text_editor.cpp
@@ -5951,6 +6060,15 @@ msgid "Animation Key Inserted."
msgstr "Animatie Key Ingevoegd."
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "Pitch"
+msgstr "Schakelaar"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr "Objecten Getekend"
@@ -6117,6 +6235,11 @@ msgid "Freelook Speed Modifier"
msgstr "Vrijekijk Snelheid Modificator"
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "Bekijk Informatie"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "XForm Dialoog"
@@ -6221,11 +6344,6 @@ msgstr "Verschalen Gereedschap"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
-msgid "Snap To Floor"
-msgstr "Uitlijnen op raster"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Toggle Freelook"
msgstr "Toggle Favoriet"
@@ -6343,6 +6461,10 @@ msgstr "Pre"
msgid "Post"
msgstr "Post"
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
msgid "Sprite is empty!"
@@ -6462,11 +6584,18 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+#, fuzzy
+msgid "Set Margin"
+msgstr "Stel Handgreep In"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr "Snap Modus:"
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+#, fuzzy
+msgid "None"
msgstr "<Geen>"
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6634,6 +6763,11 @@ msgid "Fix Invalid Tiles"
msgstr "Ongeldige naam."
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "Centreer Selectie"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6680,33 +6814,40 @@ msgstr "Kies Tegel"
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "Verwijder Selectie"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr "0 Graden Roteren"
+#, fuzzy
+msgid "Rotate left"
+msgstr "Rotatiemodus"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr "90 Graden Roteren"
+#, fuzzy
+msgid "Rotate right"
+msgstr "Roteer Polygon"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Flip horizontally"
+msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
-msgstr "180 Graden Roteren"
+msgid "Flip vertically"
+msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
-msgstr "270 Graden Roteren"
+#, fuzzy
+msgid "Clear transform"
+msgstr "Transformatie"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr "Voeg Node(s) Toe Uit Tree"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr "Verwijder Signaal"
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6718,33 +6859,60 @@ msgid "Merge from Scene"
msgstr "Vervoeg vanuit Scene"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "Plak Animatie"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "RMB: Verwijder Punt."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "Creëer een compleet nieuwe polygon."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "Verwijder Signaal"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
-msgstr "Creëer vanuit scene?"
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
msgstr "Vervoegen vanuit scene?"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Verwijder Sjabloon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6754,11 +6922,9 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
-"Click on another Tile to edit it."
-msgstr ""
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "Verwijder geselecteerde bestanden?"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -6768,6 +6934,19 @@ msgid ""
msgstr "Selecteer zojuist bewerkte sub-tegel."
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "Verwijder punten"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid ""
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
+"Click on another Tile to edit it."
+msgstr "Selecteer een sub-tegel om zijn prioriteit te veranderen."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Select sub-tile to use as icon, this will be also used on invalid autotile "
"bindings.\n"
@@ -6783,12 +6962,101 @@ msgstr "Selecteer een sub-tegel om zijn prioriteit te veranderen."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr "Selecteer een sub-tegel om zijn prioriteit te veranderen."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Set Tile Region"
+msgstr "Textuur Regio"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Map Maken"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "Filters Bewerken"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Wijzig bestaande polygon:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Bewerk Poly"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Creëer Navigatie Polygoon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "Plak Animatie"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Verwijder Sjabloon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "Verwijder Poly en punt"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "Creëer Occluder Polygon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "Creëer Navigatie Polygoon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "Filters Bewerken"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Creëer Navigatie Polygoon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Creëer Occluder Polygon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "This property can't be changed."
msgstr "Deze operatie kan niet uitgevoerd worden zonder scene."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Tile Set"
+msgid "TileSet"
msgstr "TileSet..."
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6828,6 +7096,16 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Release"
+msgstr "reeds losgelaten"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Exporting All"
+msgstr "Aan het exporteren voor %s"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr "Voorinstelling"
@@ -6836,6 +7114,11 @@ msgid "Add..."
msgstr "Toevoegen..."
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "Project Exporteren"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6890,10 +7173,50 @@ msgid "Feature List:"
msgstr "Kenmerkenlijst:"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "Voer Script Uit"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Script Export Mode:"
+msgstr "Project Exporteren"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr "Exporteer PCK/Zip"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export mode?"
+msgstr "Project Exporteren"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Export All"
+msgstr "Exporteren"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr "Vermiste Exportsjablonen voor dit platform:"
@@ -6979,9 +7302,8 @@ msgid "Import Existing Project"
msgstr "Importeer bestaand project"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Import & Edit"
-msgstr "Importeren"
+msgstr "Importeer & Bewerk"
#: editor/project_manager.cpp
msgid "Create New Project"
@@ -6997,9 +7319,8 @@ msgid "Install Project:"
msgstr "Installeer project:"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Install & Edit"
-msgstr "Installeer"
+msgstr "Installeer & Bewerk"
#: editor/project_manager.cpp
msgid "Project Name:"
@@ -7015,9 +7336,8 @@ msgid "Project Path:"
msgstr "Projectpad:"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Project Installation Path:"
-msgstr "Projectpad:"
+msgstr "Project Installatie Path:"
#: editor/project_manager.cpp
msgid "Browse"
@@ -7029,8 +7349,8 @@ msgstr "Naamloos Project"
#: editor/project_manager.cpp
#, fuzzy
-msgid "Can't open project"
-msgstr "Verbind..."
+msgid "Can't open project at '%s'."
+msgstr "Kan project niet openen"
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
@@ -7038,6 +7358,24 @@ msgstr "Weet je zeker dat je meer dan één project wilt openen?"
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7368,10 +7706,6 @@ msgstr "Projectinstellingen (project.godot)"
msgid "General"
msgstr "Algemeen"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7508,10 +7842,6 @@ msgstr "Plak Nodes"
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr "Eigenschappen:"
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr "Selecteer Eigenschap"
@@ -7602,7 +7932,7 @@ msgid "Step"
msgstr "Stap(pen):"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7611,7 +7941,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7655,7 +7985,7 @@ msgstr "Hoofdletters"
msgid "Reset"
msgstr "Reset Zoom"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr "Fout"
@@ -7714,6 +8044,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr ""
@@ -7750,6 +8084,12 @@ msgid "Save New Scene As..."
msgstr "Nieuwe Scène Opslaan Als..."
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7826,6 +8166,11 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Open documentation"
+msgstr "Open Godot online documentatie"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr ""
@@ -7834,12 +8179,13 @@ msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Change Type"
-msgstr ""
+#, fuzzy
+msgid "Extend Script"
+msgstr "Omschrijving:"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -7940,7 +8286,7 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid "Toggle Visibility"
-msgstr ""
+msgstr "Toggle Zichtbaarheid"
#: editor/scene_tree_editor.cpp
msgid ""
@@ -7954,7 +8300,7 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid "Rename Node"
-msgstr ""
+msgstr "Hernoem Node"
#: editor/scene_tree_editor.cpp
msgid "Scene Tree (Nodes):"
@@ -7966,68 +8312,67 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid "Select a Node"
-msgstr ""
+msgstr "Selecteer een Node"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Error loading template '%s'"
-msgstr "Error bij het laden van lettertype."
+msgstr "Error bij het laden van sjabloon '%s'"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Error - Could not create script in filesystem."
-msgstr "Map kon niet gemaakt worden."
+msgstr "Fout - Kon geen script aanmaken in bestandssysteem."
#: editor/script_create_dialog.cpp
msgid "Error loading script from %s"
-msgstr ""
+msgstr "Fout bij het laden script van %s"
#: editor/script_create_dialog.cpp
msgid "N/A"
-msgstr ""
+msgstr "Niet van toepassing"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script/Choose Location"
-msgstr "Open Script Bewerker"
+msgstr "Open Script/Kies Locatie"
#: editor/script_create_dialog.cpp
msgid "Path is empty"
-msgstr ""
+msgstr "Path is leeg"
+
+#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr "Bestandsnaam is leeg"
#: editor/script_create_dialog.cpp
msgid "Path is not local"
-msgstr ""
+msgstr "Path is niet lokaal"
#: editor/script_create_dialog.cpp
msgid "Invalid base path"
-msgstr ""
+msgstr "Ongeldig basis path"
#: editor/script_create_dialog.cpp
msgid "Directory of the same name exists"
-msgstr ""
+msgstr "Directory met dezelfde naam bestaat al"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "File exists, will be reused"
-msgstr "Bestand Bestaat, Overschrijven?"
+msgstr "Bestand Bestaat, zal herbruikt worden"
#: editor/script_create_dialog.cpp
msgid "Invalid extension"
-msgstr ""
+msgstr "Ongeldige extensie"
#: editor/script_create_dialog.cpp
msgid "Wrong extension chosen"
-msgstr ""
+msgstr "Verkeerde extensie gekozen"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid Path"
-msgstr "Ongeldig Pad."
+msgstr "Ongeldig Path"
#: editor/script_create_dialog.cpp
msgid "Invalid class name"
-msgstr ""
+msgstr "Ongeldige klassenaam"
#: editor/script_create_dialog.cpp
#, fuzzy
@@ -8036,47 +8381,43 @@ msgstr "Ongeldige index eigenschap naam."
#: editor/script_create_dialog.cpp
msgid "Script valid"
-msgstr ""
+msgstr "Script geldig"
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9 and _"
-msgstr ""
+msgstr "Toegestaan: a-z, A-Z, 0-9 en _"
#: editor/script_create_dialog.cpp
msgid "Built-in script (into scene file)"
-msgstr ""
+msgstr "Ingebouwd script (in scene bestand)"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Create new script file"
-msgstr "Subscriptie Maken"
+msgstr "Maak nieuw script bestand"
#: editor/script_create_dialog.cpp
msgid "Load existing script file"
-msgstr ""
+msgstr "Laad bestaand script"
#: editor/script_create_dialog.cpp
msgid "Language"
-msgstr ""
+msgstr "Taal"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Inherits"
-msgstr "Erft:"
+msgstr "Erft"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Class Name"
-msgstr "Klasse:"
+msgstr "Klasse Naam"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Template"
-msgstr "Verwijder Selectie"
+msgstr "Sjabloon"
#: editor/script_create_dialog.cpp
msgid "Built-in Script"
-msgstr ""
+msgstr "Ingebouwd Script"
#: editor/script_create_dialog.cpp
msgid "Attach Node Script"
@@ -8092,19 +8433,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -8113,42 +8442,29 @@ msgstr ""
#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp
msgid "Errors"
-msgstr ""
+msgstr "Fouten"
#: editor/script_editor_debugger.cpp
msgid "Child Process Connected"
msgstr ""
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Copy Error"
-msgstr "Laadfouten"
+msgstr "Kopieer Fout"
#: editor/script_editor_debugger.cpp
msgid "Inspect Previous Instance"
-msgstr ""
+msgstr "Inspecteer vorige instantie"
#: editor/script_editor_debugger.cpp
msgid "Inspect Next Instance"
-msgstr ""
+msgstr "Inspecteer Volgende Instantie"
#: editor/script_editor_debugger.cpp
msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -8170,7 +8486,7 @@ msgstr ""
#: editor/script_editor_debugger.cpp
msgid "Total:"
-msgstr ""
+msgstr "Totaal:"
#: editor/script_editor_debugger.cpp
msgid "Video Mem"
@@ -8182,7 +8498,7 @@ msgstr ""
#: editor/script_editor_debugger.cpp
msgid "Type"
-msgstr ""
+msgstr "Type"
#: editor/script_editor_debugger.cpp
msgid "Format"
@@ -8190,7 +8506,7 @@ msgstr ""
#: editor/script_editor_debugger.cpp
msgid "Usage"
-msgstr ""
+msgstr "Gebruik"
#: editor/script_editor_debugger.cpp
msgid "Misc"
@@ -8214,7 +8530,7 @@ msgstr ""
#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
-msgstr ""
+msgstr "Snelkoppelingen"
#: editor/settings_config_dialog.cpp
msgid "Binding"
@@ -8230,7 +8546,7 @@ msgstr ""
#: editor/spatial_editor_gizmos.cpp
msgid "Change Camera FOV"
-msgstr ""
+msgstr "Wijzig Camera FOV"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Camera Size"
@@ -8250,7 +8566,7 @@ msgstr ""
#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
msgid "Change Sphere Shape Radius"
-msgstr ""
+msgstr "Wijzig Sphere Vorm Straal"
#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
msgid "Change Box Shape Extents"
@@ -8258,11 +8574,11 @@ msgstr ""
#: editor/spatial_editor_gizmos.cpp
msgid "Change Capsule Shape Radius"
-msgstr ""
+msgstr "Wijzig Capsule Vorm Straal"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Capsule Shape Height"
-msgstr ""
+msgstr "Wijzig Capsule Vorm Hoogte"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Cylinder Shape Radius"
@@ -8274,43 +8590,39 @@ msgstr ""
#: editor/spatial_editor_gizmos.cpp
msgid "Change Ray Shape Length"
-msgstr ""
+msgstr "Wijzig Ray Vorm Lengte"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Radius"
-msgstr "Wijzig Meng Tijd"
+msgstr "Wijzig Cylinder Straal"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Height"
-msgstr "Wijzig Meng Tijd"
+msgstr "Wijzig Cylinder Hoogte"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Inner Radius"
-msgstr "Wijzig Ankers en Marges"
+msgstr "Wijzig Torus Binnenste Straal"
#: modules/csg/csg_gizmos.cpp
msgid "Change Torus Outer Radius"
-msgstr ""
+msgstr "Wijzig Torus Buitenste Straal"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select the dynamic library for this entry"
-msgstr ""
+msgstr "Selecteer de dynamische bibliotheek voor deze ingave"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select dependencies of the library for this entry"
-msgstr ""
+msgstr "Selecteer afhankelijkheden van de bibliotheek voor deze ingave"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
-#, fuzzy
msgid "Remove current entry"
-msgstr "Verwijder Signaal"
+msgstr "Verwijder huidige ingave"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Double click to create a new entry"
-msgstr ""
+msgstr "Dubbelklikken om een nieuwe ingave te creëren"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Platform:"
@@ -8330,26 +8642,27 @@ msgstr ""
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "GDNativeLibrary"
-msgstr ""
+msgstr "GDInheemsBibliotheek"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Library"
-msgstr ""
+msgstr "Bibliotheek"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Status"
-msgstr ""
+msgstr "Status"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Libraries: "
-msgstr ""
+msgstr "Bibliotheken: "
#: modules/gdnative/register_types.cpp
msgid "GDNative"
-msgstr ""
+msgstr "GDInheems"
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+#, fuzzy
+msgid "Step argument is zero!"
msgstr "step argument is nul!"
#: modules/gdscript/gdscript_functions.cpp
@@ -8450,27 +8763,27 @@ msgstr ""
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Edit X Axis"
-msgstr ""
+msgstr "Bewerk X As"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Edit Y Axis"
-msgstr ""
+msgstr "Bewerk Y As"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Edit Z Axis"
-msgstr ""
+msgstr "Bewerk Z As"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Rotate X"
-msgstr ""
+msgstr "Cursor Roteer X"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Rotate Y"
-msgstr ""
+msgstr "Cursor Roteer Y"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Rotate Z"
-msgstr ""
+msgstr "Cursor Roteer Z"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Back Rotate X"
@@ -8586,12 +8899,8 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr "Bakken!"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
-msgstr "Bak de navigatie mesh."
+msgid "Bake NavMesh"
+msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8891,6 +9200,10 @@ msgid "Base Type:"
msgstr "Basis Type:"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "Leden:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "Beschikbare Nodes:"
@@ -8994,11 +9307,11 @@ msgid "Search VisualScript"
msgstr "Verwijder Variabele"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
-msgstr "Krijg"
+msgid "Get %s"
+msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -9097,6 +9410,12 @@ msgstr ""
"Een vorm moet voorzien worden om CollisionShape2D te laten functioneren. "
"Creëer hiervoor alsjeblieft een vorm resource!"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -9147,6 +9466,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr "PathFollow2D werkt alleen wanneer het een kind van een Path2D node is."
@@ -9275,6 +9600,16 @@ msgstr ""
"Een vorm moet gegeven worden om CollisionShape te laten werken. Maak "
"alsjeblieft een vorm resource voor deze!"
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -9298,6 +9633,28 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr "PathFollow2D werkt alleen wanneer het een kind van een Path2D node is."
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr "PathFollow2D werkt alleen wanneer het een kind van een Path2D node is."
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9333,7 +9690,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9394,6 +9751,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr "Animatie boom is ongeldig."
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr "Raw-modus"
@@ -9410,11 +9771,6 @@ msgstr "Alarm!"
msgid "Please Confirm..."
msgstr "Bevestig Alsjeblieft..."
-#: scene/gui/file_dialog.cpp
-#, fuzzy
-msgid "Select this Folder"
-msgstr "Selecteer Modus"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9425,6 +9781,10 @@ msgstr ""
"popup*() functies. Ze zichtbaar maken om te bewerken is prima, maar ze "
"zullen zich verbergen bij het uitvoeren."
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9478,11 +9838,6 @@ msgstr "Ongeldige lettertype grootte."
msgid "Input"
msgstr "Voeg invoer toe"
-#: scene/resources/visual_shader.cpp
-#, fuzzy
-msgid "None"
-msgstr "<Geen>"
-
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
@@ -9500,6 +9855,177 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Split already exists."
+#~ msgstr "Bestaat al"
+
+#, fuzzy
+#~ msgid "Add Split"
+#~ msgstr "Punt toevoegen"
+
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr "Ongeldig Pad."
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "Punt verwijderen"
+
+#, fuzzy
+#~ msgid "Poly"
+#~ msgstr "Bewerk Poly"
+
+#, fuzzy
+#~ msgid "Splits"
+#~ msgstr "Splits Pad"
+
+#, fuzzy
+#~ msgid "Select a split to erase it."
+#~ msgstr "Selecteer een map om te scannen"
+
+#~ msgid "No name provided"
+#~ msgstr "Geen naam opgegeven"
+
+#, fuzzy
+#~ msgid "Add Node.."
+#~ msgstr "Node Toevoegen"
+
+#~ msgid "Create from scene?"
+#~ msgstr "Creëer vanuit scene?"
+
+#~ msgid "Create Poly"
+#~ msgstr "Creëer Poly"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "Begin een nieuwe polygoon"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "Uitzoomen"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "Inzoomen"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "Maak Poly3D"
+
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "Geen OccluderPolygon2D resource op deze node.\n"
+#~ "Creëer en wijs één toe?"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "LMB: Verplaats Punt."
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "Ctrl+LMB: Splits Segment."
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "RMB: Verwijder Punt."
+
+#, fuzzy
+#~ msgid "New TextFile"
+#~ msgstr "Bekijk Bestanden"
+
+#~ msgid "Save Theme As"
+#~ msgstr "Thema Opslaan Als"
+
+#~ msgid "<None>"
+#~ msgstr "<Geen>"
+
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Inzoomen"
+
+#~ msgid "Class List:"
+#~ msgstr "Klasse Lijst:"
+
+#~ msgid "Search Classes"
+#~ msgstr "Zoek Klasses"
+
+#~ msgid "Public Methods"
+#~ msgstr "Publieke Methodes"
+
+#~ msgid "Public Methods:"
+#~ msgstr "Publieke Methodes:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "GUI Thema Items"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "GUI Thema Items:"
+
+#, fuzzy
+#~ msgid "Property: "
+#~ msgstr "Eigenschappen:"
+
+#, fuzzy
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "Schakel folder status als Favoriet"
+
+#, fuzzy
+#~ msgid "Show current scene file."
+#~ msgstr "Selecteer zojuist bewerkte sub-tegel."
+
+#, fuzzy
+#~ msgid "Whole words"
+#~ msgstr "Hele Woorden"
+
+#, fuzzy
+#~ msgid "Match case"
+#~ msgstr "Hoofdlettergevoelig"
+
+#~ msgid "Ok"
+#~ msgstr "Oké"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "Zoek in de klasse hiërarchie."
+
+#, fuzzy
+#~ msgid "Search in files"
+#~ msgstr "Zoek Klasses"
+
+#~ msgid ""
+#~ "Built-in scripts can only be edited when the scene they belong to is "
+#~ "loaded"
+#~ msgstr ""
+#~ "Ingebouwde scripts kunnen alleen ge-edit worden wanneer de bijbehorende "
+#~ "scène geladen is"
+
+#~ msgid "Convert To Uppercase"
+#~ msgstr "Converteer Naar Hoofdletters"
+
+#~ msgid "Convert To Lowercase"
+#~ msgstr "Converteer Naar Kleine Letters"
+
+#, fuzzy
+#~ msgid "Snap To Floor"
+#~ msgstr "Uitlijnen op raster"
+
+#~ msgid "Rotate 0 degrees"
+#~ msgstr "0 Graden Roteren"
+
+#~ msgid "Rotate 90 degrees"
+#~ msgstr "90 Graden Roteren"
+
+#~ msgid "Rotate 180 degrees"
+#~ msgstr "180 Graden Roteren"
+
+#~ msgid "Rotate 270 degrees"
+#~ msgstr "270 Graden Roteren"
+
+#~ msgid "Bake!"
+#~ msgstr "Bakken!"
+
+#~ msgid "Bake the navigation mesh."
+#~ msgstr "Bak de navigatie mesh."
+
+#~ msgid "Get"
+#~ msgstr "Krijg"
+
#~ msgid "Change Scalar Constant"
#~ msgstr "Verander Shalar Constante"
@@ -9697,12 +10223,6 @@ msgstr ""
#~ msgid "Ugh"
#~ msgstr "Oeps"
-#~ msgid "Run Script"
-#~ msgstr "Voer Script Uit"
-
-#~ msgid "Save the currently edited resource."
-#~ msgstr "De bewerkte bron opslaan."
-
#~ msgid "Stop Profiling"
#~ msgstr "Stop Profilering"
@@ -9781,9 +10301,6 @@ msgstr ""
#~ msgid "Sequence"
#~ msgstr "Sequentie"
-#~ msgid "Switch"
-#~ msgstr "Schakelaar"
-
#~ msgid "Iterator"
#~ msgstr "Iterator"
@@ -9903,9 +10420,6 @@ msgstr ""
#~ msgid "Could not save atlas subtexture:"
#~ msgstr "Kon atlas subtexture niet opslaan:"
-#~ msgid "Exporting for %s"
-#~ msgstr "Aan het exporteren voor %s"
-
#~ msgid "Setting Up..."
#~ msgstr "Aan Het Opzetten..."
@@ -9922,9 +10436,6 @@ msgstr ""
#~ msgid "just pressed"
#~ msgstr "reeds ingedrukt"
-#~ msgid "just released"
-#~ msgstr "reeds losgelaten"
-
#, fuzzy
#~ msgid ""
#~ "Couldn't read the certificate file. Are the path and password both "
diff --git a/editor/translations/pl.po b/editor/translations/pl.po
index 3a74f61167..763ee3e60c 100644
--- a/editor/translations/pl.po
+++ b/editor/translations/pl.po
@@ -1,11 +1,11 @@
# Polish translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# 8-bit Pixel <dawdejw@gmail.com>, 2016.
# Adam Wolanski <adam.wolanski94@gmail.com>, 2017.
# Adrian Węcławski <weclawskiadrian@gmail.com>, 2016.
-# aelspire <aelspire@gmail.com>, 2017.
+# aelspire <aelspire@gmail.com>, 2017, 2019.
# Daniel Lewan <vision360.daniel@gmail.com>, 2016-2018.
# Dariusz Król <rexioweb@gmail.com>, 2018.
# heya10 <igor.gielzak@gmail.com>, 2017.
@@ -24,19 +24,26 @@
# Sebastian Pasich <sebastian.pasich@gmail.com>, 2017.
# siatek papieros <sbigneu@gmail.com>, 2016.
# Zatherz <zatherz@linux.pl>, 2017.
+# Tomek <kobewi4e@gmail.com>, 2018, 2019.
+# Wojcieh Er Zet <wojcieh.rzepecki@gmail.com>, 2018.
+# Dariusz Siek <dariuszynski@gmail.com>, 2018.
+# Szymon Nowakowski <smnbdg13@gmail.com>, 2019.
+# Nie Powiem <blazek10@tlen.pl>, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-07-14 08:42+0000\n"
-"Last-Translator: RM <synaptykq@gmail.com>\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2019-01-13 15:07+0000\n"
+"Last-Translator: Nie Powiem <blazek10@tlen.pl>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/"
"godot/pl/>\n"
"Language: pl\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 3.1-dev\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -44,7 +51,7 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr "Niepoprawny typ argumentu funkcji convert(), użyj stałych TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
@@ -52,63 +59,57 @@ msgstr ""
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Niewłaściwe wejście %i (nie podano) w wyrażeniu"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
msgstr ""
+"self nie może zostać użyte ponieważ obiekt ma wartość null (nie podano)"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "Nieprawidłowy indeks we właściwości '%s' węzła %s."
+msgstr "Nieprawidłowe operandy dla operatora %s, %s i %s."
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid index of type %s for base type %s"
-msgstr "Nieprawidłowy indeks we właściwości '%s' węzła %s."
+msgstr "Nieprawidłowy indeks we właściwości '%s' węzła %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "Niepoprawny nazwany indeks '%s' dla bazowego typu %s"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid arguments to construct '%s'"
-msgstr ":nieprawidłowy argument typu: "
+msgstr "Niepoprawne argumenty do utworzenia '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "Przy wywołaniu '%s':"
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Free"
-msgstr "Darmowy"
+msgstr "Wolny"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "Zrównoważony"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Mirror"
-msgstr "Odbij X"
+msgstr "Odbij"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "Wstaw Klucz"
+msgstr "Wstaw klucz tutaj"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "Duplikuj zaznaczone"
+msgstr "Duplikuj klucz(e)"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "Usuń zaznaczone"
+msgstr "Usuń klucz(e)"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -139,46 +140,40 @@ msgid "Anim Change Call"
msgstr "Animacja - wywołanie funkcji"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Property Track"
-msgstr "Właściwość:"
+msgstr "Ścieżka właściwości"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "3D Transform Track"
-msgstr "Typ przekształcenia"
+msgstr "Ścieżka przekształcenia 3D"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "Ścieżka wywołania metody"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "Ścieżka krzywej Béziera"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "Ścieżka audio"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Playback Track"
-msgstr "Zatrzymaj animacjÄ™ (S)"
+msgstr "Ścieżka animacji"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
-msgstr "Dodaj ścieżkę animacji"
+msgstr "Dodaj ścieżkę"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Length Time (seconds)"
-msgstr "Długość animacji (w sekundach)."
+msgstr "Długość animacji (sekundy)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "Powiększenie animacji."
+msgstr "Zapętlenie animacji"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -186,42 +181,36 @@ msgid "Functions:"
msgstr "Funkcje:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Audio Clips:"
-msgstr "Nasłuchiwacz dźwięku"
+msgstr "Klipy dźwiękowe:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Clips:"
-msgstr "Klipy"
+msgstr "Klipy animacji:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Toggle this track on/off."
-msgstr "Tryb bez rozproszeń."
+msgstr "Włącz/wyłącz tę ścieżkę."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "Sposób odświeżania (jak ta właściwość jest ustawiana)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Interpolation Mode"
-msgstr "Węzeł animacji"
+msgstr "Sposób interpolacji"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "Zawijanie pętli (interpolacja pomiędzy końcem a początkiem)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "Usuń wybraną ścieżkę."
+msgstr "Usuń tę ścieżkę."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "Czas X-Fade (s):"
+msgstr "Czas (s): "
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -229,52 +218,49 @@ msgstr "Ciągłe"
#: editor/animation_track_editor.cpp
msgid "Discrete"
-msgstr "Oddzielne"
+msgstr "Dyskretnie"
#: editor/animation_track_editor.cpp
msgid "Trigger"
msgstr "Wyzwalacz"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Capture"
-msgstr "Funkcje"
+msgstr "Przechwyć"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "Najbliższy"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
msgid "Linear"
-msgstr "Liniowe"
+msgstr "Liniowy"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr ""
+msgstr "Sześcienny"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
-msgstr ""
+msgstr "Przytnij"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "Zawiń"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key"
-msgstr "Wstaw Klucz"
+msgstr "Wstaw klucz"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "Duplikuj węzeł(y)"
+msgstr "Duplikuj klucz(e)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "Usuń węzeł (węzły)"
+msgstr "Usuń klucz(e)"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -282,17 +268,16 @@ msgstr "Usuń ścieżkę animacji"
#: editor/animation_track_editor.cpp
msgid "Create NEW track for %s and insert key?"
-msgstr "Stworzyć NOWĄ ścieżkę dla %s i wstawić klatkę kluczową?"
+msgstr "Utworzyć NOWĄ ścieżkę dla %s i wstawić klucz?"
#: editor/animation_track_editor.cpp
msgid "Create %d NEW tracks and insert keys?"
-msgstr "Utworzyć NOWĄ ścieżkę i dodać klatkę kluczową?"
+msgstr "Utworzyć %d NOWYCH ścieżek i wstawić klucze?"
#: editor/animation_track_editor.cpp editor/create_dialog.cpp
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -305,6 +290,7 @@ msgstr "Wstaw animacjÄ™"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
msgstr ""
+"AnimationPlayer nie może animować sam siebie, tylko inne węzły tego typu."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
@@ -320,7 +306,7 @@ msgstr "Wstaw klatkÄ™ kluczowÄ…"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr ""
+msgstr "Ścieżki przekształceń działają tylko z węzłami bazującymi na Spatial."
#: editor/animation_track_editor.cpp
msgid ""
@@ -329,44 +315,47 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"Ścieżki audio mogą wskazywać tylko na węzły tych typów:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "Ścieżki animacji mogą wskazywać tylko na węzły AnimationPlayer."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
msgstr ""
+"AnimationPlayer nie może animować sam siebie, tylko inne węzły tego typu."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "Nie da się dodać nowej ścieżki bez korzenia"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "Ścieżka jest nieprawidłowa, więc nie można wstawić klucza."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "Ścieżka nie jest typu Spatial, nie można wstawić klucza"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
-msgstr ""
+msgstr "Ścieżka jest nieprawidłowa, więc nie można wstawić klucza metody."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Method not found in object: "
-msgstr "Nie znaleziono VariableGet w skrypcie: "
+msgstr "Metoda nie znaleziona w obiekcie: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
-msgstr "PrzemieÅ› klatki kluczowe"
+msgstr "Przemieść klucze animacji"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clipboard is empty"
-msgstr "Schowek jest pusty!"
+msgstr "Schowek jest pusty"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
@@ -376,24 +365,23 @@ msgstr "Przeskaluj klatki kluczowe"
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
msgstr ""
+"Ta opcja nie działa dla edycji Beziera, ponieważ jest to tylko jedna ścieżka."
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "Pokaż tylko ścieżki z węzłów zaznaczonych w drzewie."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr ""
+msgstr "Grupuj ścieżki po węzłach lub wyświetl je jako prostą listę."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap (s): "
-msgstr "PrzyciÄ…ganie (piksele):"
+msgstr "PrzyciÄ…ganie (s): "
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "Drzewo animacji jest poprawne."
+msgstr "Wartość kroku animacji."
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -405,19 +393,16 @@ msgid "Edit"
msgstr "Edycja"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "Drzewo animacji"
+msgstr "Właściwości animacji."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "Kopiuj parametry"
+msgstr "Kopiuj ścieżki"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "Wklej parametry"
+msgstr "Wklej ścieżki"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -427,8 +412,7 @@ msgstr "Skaluj zaznaczone"
msgid "Scale From Cursor"
msgstr "Skaluj od kursora"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Duplikuj zaznaczone"
@@ -437,16 +421,15 @@ msgid "Duplicate Transposed"
msgstr "Duplikuj transponowane"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
msgstr "Usuń zaznaczone"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+msgid "Go to Next Step"
msgstr "Przejdź do następnego kroku"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+msgid "Go to Previous Step"
msgstr "Przejdź do poprzedniego kroku"
#: editor/animation_track_editor.cpp
@@ -459,11 +442,11 @@ msgstr "Wyczyść animację"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "Wybierz węzeł, który będzie animowany:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "Użyj krzywych Beziera"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
@@ -511,7 +494,7 @@ msgstr "Współczynnik skali:"
#: editor/animation_track_editor.cpp
msgid "Select tracks to copy:"
-msgstr ""
+msgstr "Wybierz ścieżki do skopiowania:"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -549,11 +532,11 @@ msgstr "Nie znaleziono"
msgid "Replaced %d occurrence(s)."
msgstr "Zastąpiono %d wystąpień."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Uwzględnij wielkość liter"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "Całe słowa"
@@ -569,29 +552,31 @@ msgstr "ZastÄ…p wszystkie"
msgid "Selection Only"
msgstr "Tylko zaznaczenie"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Przybliż"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "Oddal"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "Wyzeruj przybliżenie"
#: editor/code_editor.cpp
-#, fuzzy
msgid "Warnings:"
-msgstr "Ostrzeżenia"
+msgstr "Ostrzeżenia:"
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "Powiększenie (%):"
+msgid "Font Size:"
+msgstr "Rozmiar czcionki:"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Linia:"
@@ -624,6 +609,7 @@ msgstr "Dodaj"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -680,9 +666,8 @@ msgid "Disconnect '%s' from '%s'"
msgstr "Rozłącz '%s' z '%s'"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect all from signal: '%s'"
-msgstr "Rozłącz '%s' z '%s'"
+msgstr "Rozłącz wszystko z sygnału: '%s'"
#: editor/connections_dialog.cpp
msgid "Connect..."
@@ -694,19 +679,16 @@ msgid "Disconnect"
msgstr "Rozłącz"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect Signal: "
-msgstr "Połączony sygnał:"
+msgstr "Połącz sygnał: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection: "
-msgstr "Edytuj Połączenia"
+msgstr "Edytuj połączenie: "
#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "Are you sure you want to remove all connections from the \""
-msgstr "Czy jesteś pewny że chcesz uruchomić więcej niż jeden projekt?"
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr "Na pewno chcesz usunąć wszystkie połączenia z sygnału \"%s\"?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -714,22 +696,19 @@ msgstr "Sygnały"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr ""
+msgstr "Na pewno chcesz usunąć wszystkie połączenia z tego sygnału?"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "Rozłącz"
+msgstr "Rozłącz wszystkie"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit..."
-msgstr "Edycja"
+msgstr "Edytuj..."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "Metody"
+msgstr "Idź do metody"
#: editor/create_dialog.cpp
msgid "Change %s Type"
@@ -754,23 +733,20 @@ msgid "Recent:"
msgstr "Ostatnie:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Szukaj:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "PasujÄ…ce:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "Opis:"
@@ -809,8 +785,7 @@ msgid "Resource"
msgstr "Zasoby"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "Ścieżka"
@@ -831,9 +806,10 @@ msgid "Search Replacement Resource:"
msgstr "Szukaj zastępczego zasobu:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -865,8 +841,8 @@ msgid "Error loading:"
msgstr "Błąd ładowania:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
-msgstr "Scena nie została wczytana z powodu brakujących zależności:"
+msgid "Load failed due to missing dependencies:"
+msgstr "Wczytywanie nieudane z powodu brakujących zależności:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -924,14 +900,6 @@ msgstr "Zmień wartość słownika"
msgid "Thanks from the Godot community!"
msgstr "Podziękowania od społeczności Godota!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "OK"
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Współtwórcy Godot Engine"
@@ -1025,8 +993,8 @@ msgid "Uncompressing Assets"
msgstr "Dekompresja zasobów"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
-msgstr "Pakiet zastał zainstalowany poprawnie!"
+msgid "Package installed successfully!"
+msgstr "Pakiet zainstalowano poprawnie!"
#: editor/editor_asset_installer.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -1071,8 +1039,9 @@ msgid "Toggle Audio Bus Bypass Effects"
msgstr "Przełącz ominięcie efektów w magistrali audio"
#: editor/editor_audio_buses.cpp
+#, fuzzy
msgid "Select Audio Bus Send"
-msgstr ""
+msgstr "Wybierz szynę wysyłki audio"
#: editor/editor_audio_buses.cpp
msgid "Add Audio Bus Effect"
@@ -1107,8 +1076,7 @@ msgid "Bus options"
msgstr "Opcje magistrali"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "Duplikuj"
@@ -1268,7 +1236,7 @@ msgid "Add AutoLoad"
msgstr "Dodaj AutoLoad"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "Ścieżka:"
@@ -1276,8 +1244,8 @@ msgstr "Ścieżka:"
msgid "Node Name:"
msgstr "Nazwa węzła:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "Nazwa"
@@ -1347,26 +1315,29 @@ msgid "Template file not found:"
msgstr "Nie znaleziono pliku szablonu:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Wybierz bieżący katalog"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "Plik istnieje, nadpisać?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "Wybierz bieżący katalog"
+msgid "Select This Folder"
+msgstr "Wybierz ten folder"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
-msgstr "Skopiuj Ścieżkę"
+msgstr "Skopiuj ścieżkę"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Open In File Manager"
-msgstr "Pokaż w menadżerze plików"
+msgid "Open in File Manager"
+msgstr "Otwórz w menedżerze plików"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
-msgstr "Pokaż w menadżerze plików"
+msgid "Show in File Manager"
+msgstr "Pokaż w menedżerze plików"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
@@ -1401,7 +1372,8 @@ msgid "Open a File or Directory"
msgstr "Otwórz plik lub katalog"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Zapisz"
@@ -1459,8 +1431,7 @@ msgstr "Katalogi i pliki:"
msgid "Preview:"
msgstr "PodglÄ…d:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "Plik:"
@@ -1476,24 +1447,11 @@ msgstr "Przeszukaj źródła"
msgid "(Re)Importing Assets"
msgstr "(Ponowne) importowanie zasobów"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "Wyszukaj w Pomocy"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "Lista klas:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "Przeszukaj klasy"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "Góra"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "Klasa:"
@@ -1510,28 +1468,28 @@ msgid "Brief Description:"
msgstr "Krótki opis:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "Członkowie"
+msgid "Properties"
+msgstr "Właściwości"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "Członkowie:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr "Właściwości:"
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "Metody publiczne"
+msgid "Methods"
+msgstr "Metody"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "Metody publiczne:"
+msgid "Methods:"
+msgstr "Metody:"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "Elementy motywu interfejsu"
+msgid "Theme Properties"
+msgstr "Właściwości motywu"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "Elementy motywu GUI:"
+msgid "Theme Properties:"
+msgstr "Właściwości motywu:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1558,31 +1516,34 @@ msgid "Constants:"
msgstr "Stałe:"
#: editor/editor_help.cpp
-msgid "Description"
-msgstr "Opis"
+msgid "Class Description"
+msgstr "Opis klasy"
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
+msgstr "Opis klasy:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
msgstr "Poradniki online:"
#: editor/editor_help.cpp
-#, fuzzy
msgid ""
"There are currently no tutorials for this class, you can [color=$color][url="
"$url]contribute one[/url][/color] or [color=$color][url=$url2]request one[/"
"url][/color]."
msgstr ""
"Obecnie nie ma żadnych samouczków dla tej klasy, możesz [color=$color][url="
-"$url]dodać jeden[/url][/kolor] lub [color=$color] [url=$url2]poprosić o "
-"jeden[/url][/barl]."
+"$url]dodać jeden[/url][/color] lub [color=$color] [url=$url2]poprosić o "
+"jakiÅ›[/url][/color]."
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "Właściwości"
+msgid "Property Descriptions"
+msgstr "Opisy właściwości"
#: editor/editor_help.cpp
-msgid "Property Description:"
-msgstr "Opis właściwości:"
+msgid "Property Descriptions:"
+msgstr "Opisy właściwości:"
#: editor/editor_help.cpp
msgid ""
@@ -1593,12 +1554,12 @@ msgstr ""
"$url]wysyłając ją[/url][/color]!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "Metody"
+msgid "Method Descriptions"
+msgstr "Opisy metod"
#: editor/editor_help.cpp
-msgid "Method Description:"
-msgstr "Opis metody:"
+msgid "Method Descriptions:"
+msgstr "Opisy metod:"
#: editor/editor_help.cpp
msgid ""
@@ -1608,18 +1569,58 @@ msgstr ""
"Obecnie nie ma opisu dla tej metody. Pomóż nam, [color=$color][url="
"$url]wysyłając ją[/url][/color]!"
-#: editor/editor_inspector.cpp
-#, fuzzy
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Wyszukaj w Pomocy"
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr "Pokaż wszystko"
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr "Tylko klasy"
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr "Tylko metody"
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr "Tylko sygnały"
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr "Tylko stałe"
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr "Tylko właściwości"
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr "Tylko właściwości motywu"
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr "Typ członka"
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr "Klasa"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
msgstr "Właściwość:"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr "Ustaw"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "Ustaw wiele:"
#: editor/editor_log.cpp
msgid "Output:"
@@ -1647,6 +1648,11 @@ msgstr "Eksport projektu nie powiódł się, kod błędu to %d."
msgid "Error saving resource!"
msgstr "Błąd podczas zapisu zasobu!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "OK"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "Zapisz zasób jako..."
@@ -1665,7 +1671,7 @@ msgstr "Błąd podczas zapisywania."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
-msgstr ""
+msgstr "Nie można otworzyć '%s'. Plik mógł zostać przeniesiony lub usunięty."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
@@ -1701,12 +1707,22 @@ msgstr "Ta operacja nie może zostać wykonana bez sceny."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
"Nie udało się zapisać sceny. Najprawdopodobniej pewne zależności "
"(instancjonowanie lub dziedziczenie) nie są spełnione."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr "Nie można nadpisać sceny, która wciąż jest otwarta!"
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr "Nie udało się wczytać MeshLibrary do połączenia!"
@@ -1962,6 +1978,14 @@ msgstr "Nie można załadować skryptu dodatku z ścieżki: '%s'."
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"Nie można załadować skryptu dodatku ze ścieżki: '%s' W kodzie znajduje się "
+"błąd, sprawdź składnię."
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
"Nie można wczytać skryptu dodatku ze ścieżki: '%s' Skrypt nie dziedziczy po "
@@ -2012,15 +2036,18 @@ msgstr "Usuń układ"
msgid "Default"
msgstr "Domyślny"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr "Pokaż w systemie plików"
+
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play This Scene"
-msgstr "Odtwórz scenę"
+msgstr "Odtwórz tę scenę"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "Zamknij inne karty"
+msgstr "Zamknij kartÄ™"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2095,7 +2122,7 @@ msgid "Save Scene"
msgstr "Zapisz scenÄ™"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+msgid "Save All Scenes"
msgstr "Zapisz wszystkie sceny"
#: editor/editor_node.cpp
@@ -2124,7 +2151,7 @@ msgid "Undo"
msgstr "Cofnij"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Ponów"
@@ -2148,20 +2175,20 @@ msgstr "Ustawienia projektu"
msgid "Export"
msgstr "Eksport"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "Narzędzia"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "Otworzyć menadżera projektów?"
+msgstr "Otwórz folder danych projektu"
#: editor/editor_node.cpp
msgid "Quit to Project List"
msgstr "Wyjdź do Listy Projektów"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "Debugowanie"
@@ -2266,18 +2293,16 @@ msgid "Toggle Fullscreen"
msgstr "Pełny ekran"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Data/Settings Folder"
-msgstr "Ustawienia edytora"
+msgstr "Otwórz folder ustawień/danych edytora"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "Otwórz folder danych edytora"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Settings Folder"
-msgstr "Ustawienia edytora"
+msgstr "Otwórz folder ustawień edytora"
#: editor/editor_node.cpp editor/project_export.cpp
msgid "Manage Export Templates"
@@ -2287,10 +2312,6 @@ msgstr "ZarzÄ…dzanie szablonami eksportu"
msgid "Help"
msgstr "Pomoc"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "Klasy"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2361,13 +2382,12 @@ msgstr "Uruchom niestandardowÄ… scenÄ™"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr ""
+msgstr "Zmiana sterownika grafiki wymaga restartu edytora."
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Save & Restart"
-msgstr "Zapisz i importuj ponownie"
+msgstr "Zapisz i zrestartuj"
#: editor/editor_node.cpp
msgid "Spins when the editor window repaints!"
@@ -2385,27 +2405,26 @@ msgstr "Odśwież Zmiany"
msgid "Disable Update Spinner"
msgstr "Wyłącz wiatraczek aktualizacji"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "Inspektor"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "Importuj"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "Węzeł"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "System plików"
#: editor/editor_node.cpp
-#, fuzzy
+msgid "Inspector"
+msgstr "Inspektor"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Węzeł"
+
+#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
-msgstr "Rozwiń foldery"
+msgstr "Rozwiń panel dolny"
#: editor/editor_node.cpp scene/resources/visual_shader.cpp
msgid "Output"
@@ -2484,9 +2503,8 @@ msgid "Thumbnail..."
msgstr "Miniatura..."
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit Plugin"
-msgstr "Edytuj wielokÄ…t"
+msgstr "Edytuj wtyczkÄ™"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
@@ -2510,15 +2528,13 @@ msgid "Status:"
msgstr "Status:"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit:"
-msgstr "Edycja"
+msgstr "Edytuj:"
#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Start"
-msgstr "Start!"
+msgstr "Start"
#: editor/editor_profiler.cpp
msgid "Measure:"
@@ -2540,7 +2556,7 @@ msgstr "Klatka %"
msgid "Physics Frame %"
msgstr "Klatki Fizyki %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "Czas:"
@@ -2564,34 +2580,62 @@ msgstr "Czas"
msgid "Calls"
msgstr "Wywołania"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr "Włącz"
#: editor/editor_properties.cpp
msgid "Layer"
-msgstr ""
+msgstr "Warstwa"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Bit %d, value %d"
-msgstr "Bit %d, wartość %d."
+msgstr "Bit %d, wartość %d"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr "[Pusty]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
+msgid "Assign..."
+msgstr "Przypisz..."
+
+#: editor/editor_properties.cpp
#, fuzzy
-msgid "Assign.."
-msgstr "Przypisz"
+msgid "Invalid RID"
+msgstr "Nieprawidłowa ścieżka"
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+"Nie można utworzyć ViewportTexture na zasobach zapisanych jako plik.\n"
+"Zasób musi należeć do sceny."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+"Nie można utworzyć ViewportTexture na tym zasobie, ponieważ nie jest "
+"ustawiony jako lokalny dla sceny.\n"
+"Włącz mu właściwość \"lokalny dla sceny\" (i wszystkim zasobom, które go "
+"zawierają, aż do węzła)."
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr "Wybierz Viewport"
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr "Nowy skrypt"
@@ -2600,13 +2644,8 @@ msgid "New %s"
msgstr "Nowy %s"
#: editor/editor_properties.cpp editor/property_editor.cpp
-#, fuzzy
msgid "Make Unique"
-msgstr "Utwórz unikatowy zasób"
-
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr "Pokaż w systemie plików"
+msgstr "Zrób unikalny"
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -2616,7 +2655,8 @@ msgstr "Pokaż w systemie plików"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "Wklej"
@@ -2629,36 +2669,32 @@ msgstr "Konwersja do %s"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Open Editor"
-msgstr "Otwórz w edytorze"
+msgstr "Otwórz edytor"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Selected node is not a Viewport!"
msgstr "Wybrany węzeł to nie Viewport!"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "Size: "
-msgstr "Rozmiar komórki:"
+msgstr "Rozmiar: "
#: editor/editor_properties_array_dict.cpp
msgid "Page: "
-msgstr ""
+msgstr "Strona: "
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Key:"
-msgstr "Nowa nazwa:"
+msgstr "Nowy klucz:"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Value:"
-msgstr "Nowa nazwa:"
+msgstr "Nowa wartość:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
-msgstr ""
+msgstr "Dodaj parę klucz/wartość"
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -2752,9 +2788,8 @@ msgid "Can't open export templates zip."
msgstr "Nie można otworzyć pliku zip szablonów eksportu."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Invalid version.txt format inside templates: %s."
-msgstr "Nieprawidłowy format pliku version.txt w szablonach."
+msgstr "Nieprawidłowy format pliku version.txt w szablonach: %s."
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
@@ -2819,6 +2854,8 @@ msgid ""
"Templates installation failed. The problematic templates archives can be "
"found at '%s'."
msgstr ""
+"Instalacja szablonów się nie udała. Problematyczne archiwa szablonów mogą "
+"być znalezione w '%s'."
#: editor/export_template_manager.cpp
msgid "Error requesting url: "
@@ -2899,9 +2936,8 @@ msgid "Download Templates"
msgstr "Pobierz szablony eksportu"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr "Wybierz serwer z listy: "
+msgstr "Wybierz serwer z listy: (Shift+Klik: Otwórz w przeglądarce)"
#: editor/file_type_cache.cpp
msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
@@ -2910,18 +2946,20 @@ msgstr ""
"typu plików nie będzie zapisana!"
#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr "Ulubione"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr "Nie można przejść do '%s' - nie znaleziono w tym systemie plików!"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a grid of thumbnails."
-msgstr "Wyświetlanie elementów jako siatkę miniatur"
+msgstr "Wyświetl elementy jako siatkę miniatur."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a list."
-msgstr "Wyświetlanie elementów jako listę"
+msgstr "Wyświetl elementy jako listę."
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
@@ -2949,19 +2987,15 @@ msgstr "Błąd duplikacji:"
msgid "Unable to update dependencies:"
msgstr "Nie można zaktualizować zależności:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "Nie podano nazwy"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "Nie podano nazwy."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "Podana nazwa zawiera niedozwolone znaki"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "Nie podano nazwy."
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "Nazwa zawiera niedozwolone znaki."
@@ -2986,22 +3020,6 @@ msgid "Duplicating folder:"
msgstr "Duplikowanie Folderu:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "Rozwiń foldery"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "Zwiń foldery"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "Zmień nazwę..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "PrzenieÅ› Do..."
-
-#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
msgstr "Otwórz Scenę/y"
@@ -3010,6 +3028,14 @@ msgid "Instance"
msgstr "Instancja"
#: editor/filesystem_dock.cpp
+msgid "Add to favorites"
+msgstr "Dodaj do ulubionych"
+
+#: editor/filesystem_dock.cpp
+msgid "Remove from favorites"
+msgstr "Usuń z ulubionych"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "Edytuj Zależności..."
@@ -3017,19 +3043,33 @@ msgstr "Edytuj Zależności..."
msgid "View Owners..."
msgstr "Pokaż właścicieli..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "Zmień nazwę..."
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "Duplikuj..."
#: editor/filesystem_dock.cpp
-#, fuzzy
+msgid "Move To..."
+msgstr "PrzenieÅ› do..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
-msgstr "Nowy skrypt"
+msgstr "Nowy skrypt..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "Zapisz zasób jako..."
+msgstr "Nowy zasób..."
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr "Rozwiń wszystko"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr "Zwiń wszystko"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3051,27 +3091,16 @@ msgid "Re-Scan Filesystem"
msgstr "Przeskanuj system plików ponownie"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "Ustaw folder jako ulubiony"
+msgid "Toggle split mode"
+msgstr "Przełącz tryb podziału"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Show current scene file."
-msgstr "Wybierz aktualnie edytowany sub-tile."
+msgid "Search files"
+msgstr "Przeszukaj pliki"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
-msgstr "Utwórz instancje wybranej sceny/scen jako dziecko wybranego węzła."
-
-#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "Przeszukaj klasy"
+msgstr "Utwórz instancję wybranej sceny/scen jako dziecko wybranego węzła."
#: editor/filesystem_dock.cpp
msgid ""
@@ -3081,51 +3110,37 @@ msgstr ""
"Skanowanie plików,\n"
"Proszę czekać..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "PrzenieÅ›"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "There is already file or folder with the same name in this location."
-msgstr "Folder o podanej nazwie istnieje już w tej lokalizacji."
+msgstr "W tej lokalizacji istnieje już plik lub folder o podanej nazwie."
#: editor/filesystem_dock.cpp
msgid "Overwrite"
-msgstr ""
+msgstr "Nadpisz"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Utwórz Skrypt"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find in files"
-msgstr "Znajdź tile"
+msgid "Find in Files"
+msgstr "Znajdź w plikach"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find: "
-msgstr "Szukaj"
+msgid "Find:"
+msgstr "Znajdź:"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Whole words"
-msgstr "Całe słowa"
+msgid "Folder:"
+msgstr "Folder:"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "Uwzględnij wielkość liter"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Filter: "
-msgstr "Filtr:"
+msgid "Filters:"
+msgstr "Filtry:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3141,52 +3156,49 @@ msgid "Cancel"
msgstr "Anuluj"
#: editor/find_in_files.cpp
-#, fuzzy
+msgid "Find: "
+msgstr "Znajdź: "
+
+#: editor/find_in_files.cpp
msgid "Replace: "
-msgstr "ZastÄ…p"
+msgstr "ZastÄ…p: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace all (no undo)"
-msgstr "ZastÄ…p wszystkie"
+msgstr "Zastąp wszystkie (nie można cofnąć)"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Searching..."
-msgstr "Zapisywanie..."
+msgstr "Wyszukiwanie..."
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Search complete"
-msgstr "Wyszukaj w tekście"
+msgstr "Wyszukiwanie zakończone"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group name already exists."
-msgstr "BÅÄ„D: animacja o takiej nazwie już istnieje!"
+msgstr "Nazwa grupy już istnieje."
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
-msgstr "Niewłaściwa nazwa."
+msgid "Invalid group name."
+msgstr "Niewłaściwa nazwa grupy."
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Grupy"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes not in Group"
-msgstr "Dodaj do Grupy"
+msgstr "Węzły nie w grupie"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
msgid "Filter nodes"
msgstr "Filtruj węzły"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes in Group"
-msgstr "Edytuj grupy"
+msgstr "Węzły w grupie"
#: editor/groups_editor.cpp
msgid "Add to Group"
@@ -3197,9 +3209,8 @@ msgid "Remove from Group"
msgstr "Usuń z Grupy"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Manage Groups"
-msgstr "Grupy obrazków"
+msgstr "ZarzÄ…dzaj grupami"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Single Scene"
@@ -3308,17 +3319,12 @@ msgstr "Importuj ponownie"
msgid "Failed to load resource."
msgstr "Nie udało się wczytać zasobu."
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "Ok"
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr "Rozwiń wszystkie właściwości"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+msgid "Collapse All Properties"
msgstr "Zwiń wszystkie właściwości"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3335,9 +3341,8 @@ msgid "Paste Params"
msgstr "Wklej parametry"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Edit Resource Clipboard"
-msgstr "Schowka zasobów jest pusty!"
+msgstr "Edytuj schowek zasobów"
#: editor/inspector_dock.cpp
msgid "Copy Resource"
@@ -3364,6 +3369,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "Wczytaj istniejący zasób i edytuj go."
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "Zapisz aktualnie edytowany zasób."
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "Idź do poprzedniego edytowanego obiektu w historii."
@@ -3380,9 +3389,8 @@ msgid "Object properties."
msgstr "Właściwości obiektu."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Filter properties"
-msgstr "Filtruj węzły"
+msgstr "Filtruj właściwości"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
@@ -3397,47 +3405,41 @@ msgid "Select a Node to edit Signals and Groups."
msgstr "Wybierz węzeł do edycji sygnałów i grup."
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Edit a Plugin"
-msgstr "Edytuj wielokÄ…t"
+msgstr "Edytuj wtyczkÄ™"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Create a Plugin"
-msgstr "Utwórz solucję C#"
+msgstr "Utwórz wtyczkę"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Plugin Name:"
-msgstr "Wtyczki"
+msgstr "Nazwa wtyczki:"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
-msgstr ""
+msgstr "Podfolder:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Language:"
-msgstr "Język"
+msgstr "Język:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Script Name:"
-msgstr "Skrypt prawidłowy"
+msgstr "Nazwa skryptu:"
#: editor/plugin_config_dialog.cpp
msgid "Activate now?"
-msgstr ""
+msgstr "Aktywować teraz?"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
-msgstr "Utwórz Polygon"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
+msgstr "Utwórz wielokąt"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+#, fuzzy
+msgid "Edit Polygon"
msgstr "Edytuj wielokÄ…t"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3445,34 +3447,36 @@ msgid "Insert Point"
msgstr "Wstaw punkt"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+#, fuzzy
+msgid "Edit Polygon (Remove Point)"
msgstr "Edytuj wielokąt (usuń punkty)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+#, fuzzy
+msgid "Remove Polygon And Point"
msgstr "Usuń wielokąt i punkt"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "Utwórz nowy wielokąt"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr "Utwórz punkty."
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#, fuzzy
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
-"Edytować istniejący wielokąt:\n"
-"LMB: PrzenieÅ› punkt.\n"
-"Ctrl + LPM: Podziału segmentu.\n"
-"RMB: Usuwanie punktu."
+"Edycja punktów.\n"
+"LPM: Przesuwanie punktu\n"
+"PPM: Usuwanie punktu"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
-msgstr "Usuwanie punktów"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr "Usuń punkty."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3486,15 +3490,15 @@ msgstr "Dodaj animacjÄ™"
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Load.."
-msgstr "Wczytaj"
+msgid "Load..."
+msgstr "Wczytaj..."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "This type of node can't be used. Only root nodes are allowed."
msgstr ""
+"Ten typ węzła nie może zostać użyty. Tylko węzły korzenia są dozwolone."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3504,72 +3508,65 @@ msgid ""
"AnimationTree is inactive.\n"
"Activate to enable playback, check node warnings if activation fails."
msgstr ""
+"AnimationTree jest nieaktywne.\n"
+"Aktywuj, by umożliwić odtwarzanie. Sprawdź ostrzeżenia węzła, jeśli "
+"aktywacja siÄ™ nie powiedzie."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Set the blending position within the space"
-msgstr ""
+msgstr "Wybierz pozycjÄ™ mieszania w przestrzeni"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Select and move points, create points with RMB."
-msgstr ""
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Usuwanie punktów"
+msgstr "Wybierz i przesuń punkty, utwórz punkty używając PPM."
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "RMB: Wymaż Punkt."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr "Włącz przyciąganie i pokaż siatkę."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Point"
-msgstr "Przesuń Punkt"
+msgstr "Punkt"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Open Animation Node"
-msgstr "Węzeł animacji"
+msgstr "Otwórz węzeł animacji"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists"
-msgstr "Akcja %s już istnieje!"
+msgstr "Trójkąt już istnieje"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "BlendSpace2D does not belong to an AnimationTree node."
-msgstr ""
+msgstr "BlendSpace2D nie należy do węzła AnimationTree."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "No triangles exist, so no blending can take place."
-msgstr ""
+msgstr "Nie ma żadnego trójkąta, więc nie może zajść mieszanie."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create triangles by connecting points."
-msgstr ""
+msgstr "Utwórz trójkąty poprzez łączenie punktów."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Erase points and triangles."
-msgstr ""
+msgstr "Usuń punkty i trójkąty."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Generate blend triangles automatically (instead of manually)"
-msgstr ""
+msgstr "Wygeneruj trójkąty mieszania automatycznie (zamiast ręcznie)"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr "PrzyciÄ…gaj"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Mieszanie:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3578,20 +3575,24 @@ msgstr "Edytuj filtry"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Output node can't be added to the blend tree."
-msgstr ""
+msgstr "Węzeł wyjściowy nie może być dodany do drzewa mieszania."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Unable to connect, port may be in use or connection may be invalid."
msgstr ""
+"Nie można połączyć, port może być w użyciu lub połączenie może być "
+"nieprawidłowe."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
msgstr ""
+"Nie ustawiono odtwarzacza animacji, więc nie można uzyskać nazw ścieżek."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Player path set is invalid, so unable to retrieve track names."
msgstr ""
+"Ścieżka odtwarzacza jest nieprawidłowa, więc nie można uzyskać nazw ścieżek."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
@@ -3599,23 +3600,22 @@ msgid ""
"Animation player has no valid root node path, so unable to retrieve track "
"names."
msgstr ""
+"Odtwarzacz animacji nie ma prawidłowej ścieżki korzenia, więc nie można "
+"uzyskać nazw ścieżek."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Add Node.."
-msgstr "Dodaj węzeł"
+msgid "Add Node..."
+msgstr "Dodaj węzeł..."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filtered Tracks:"
-msgstr "Edytuj filtry"
+msgstr "Edytuj filtrowane ścieżki:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Enable filtering"
-msgstr "Edytowalne dzieci"
+msgstr "Włącz filtrowanie"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
@@ -3635,7 +3635,7 @@ msgstr "Zmień nazwę animacji:"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Delete Animation?"
-msgstr "Usunąć animacje?"
+msgstr "Usunąć animację?"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -3643,14 +3643,12 @@ msgid "Remove Animation"
msgstr "Usuń animację"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Invalid animation name!"
-msgstr "BÅÄ„D: błędna nazwa animacji!"
+msgstr "Nieprawidłowa nazwa animacji!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Animation name already exists!"
-msgstr "BÅÄ„D: animacja o takiej nazwie już istnieje!"
+msgstr "Nazwa animacji już istnieje!"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -3660,7 +3658,7 @@ msgstr "Zmień nazwę animacji"
#: editor/plugins/animation_player_editor_plugin.cpp
#, fuzzy
msgid "Blend Next Changed"
-msgstr "Zmienione następne przejście animacji"
+msgstr "Mieszaj następną zmienioną"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Change Blend Time"
@@ -3672,17 +3670,15 @@ msgstr "Wczytaj animacjÄ™"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Duplicate Animation"
-msgstr "Duplikuj animacje"
+msgstr "Duplikuj animacjÄ™"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to copy!"
-msgstr "BÅÄ„D: Brak animacji do skopiowania!"
+msgstr "Brak animacji do skopiowania!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation resource on clipboard!"
-msgstr "BÅÄ„D: Brak zasobu animacji w schowku!"
+msgstr "Brak zasobu animacji w schowku!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
@@ -3693,9 +3689,8 @@ msgid "Paste Animation"
msgstr "Wklej animacjÄ™"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to edit!"
-msgstr "BÅÄ„D: Brak animacji do edycji!"
+msgstr "Brak animacji do edycji!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
@@ -3739,14 +3734,12 @@ msgid "New"
msgstr "Nowy"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Transitions..."
-msgstr "Przejścia"
+msgstr "Edytuj przejścia..."
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Open in Inspector"
-msgstr "Otwórz w edytorze"
+msgstr "Otwórz w inspektorze"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Display list of animations in player."
@@ -3759,7 +3752,7 @@ msgstr "Auto odtwarzanie po załadowaniu"
#: editor/plugins/animation_player_editor_plugin.cpp
#, fuzzy
msgid "Onion Skinning"
-msgstr "Tryb łusek cebuli"
+msgstr "Tryb warstw cebuli"
#: editor/plugins/animation_player_editor_plugin.cpp
#, fuzzy
@@ -3799,18 +3792,16 @@ msgid "Differences Only"
msgstr "Tylko różnice"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Force White Modulate"
-msgstr "Wymuś Białe Cieniowanie"
+msgstr "Wymuś białe cieniowanie"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Include Gizmos (3D)"
msgstr "Dołącz Gizmo (3D)"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Pin AnimationPlayer"
-msgstr "Wklej animacjÄ™"
+msgstr "Przypnij AnimationPlayer"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Create New Animation"
@@ -3838,37 +3829,35 @@ msgstr "Następny (automatyczna kolejka):"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Cross-Animation Blend Times"
-msgstr "Czas Przejścia Między Animacjami"
+msgstr "Czasy przejścia pomiędzy animacjami"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "End"
msgstr "Koniec"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Immediate"
-msgstr ""
+msgstr "Pośredni"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Sync"
-msgstr ""
+msgstr "Synchronizuj"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "At End"
-msgstr ""
+msgstr "Na końcu"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Travel"
-msgstr ""
+msgstr "Przejdź"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Start and end nodes are needed for a sub-transition."
-msgstr ""
+msgstr "Początkowy i końcowy węzeł są potrzebne do podprzejścia."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "No playback resource set at path: %s."
-msgstr "Nie znaleziono w ścieżce zasobów."
+msgstr "Nie znaleziono zasobu do odtworzenia w ścieżce: %s."
#: editor/plugins/animation_state_machine_editor.cpp
msgid ""
@@ -3876,34 +3865,35 @@ msgid ""
"RMB to add new nodes.\n"
"Shift+LMB to create connections."
msgstr ""
+"Wybierz i przesuń węzły.\n"
+"PPM, by dodać nowe węzły.\n"
+"Shift+LPM, by utworzyć połączenia."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "Utwórz nowy %s"
+msgstr "Utwórz nowe węzły."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Connect nodes."
-msgstr "Podłącz węzły"
+msgstr "Połącz węzły."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Remove selected node or transition"
-msgstr "Usuń wybraną ścieżkę."
+msgid "Remove selected node or transition."
+msgstr "Usuń zaznaczony węzeł lub przejście."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
msgstr ""
+"Przełącz autoodtwarzanie tej animacji na starcie, restart lub przewinięcie "
+"do zera."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set the end animation. This is useful for sub-transitions."
-msgstr ""
+msgstr "Ustaw koniec animacji. To jest przydatne dla podprzejść."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "Przejście"
+msgstr "Przejście: "
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3957,10 +3947,6 @@ msgid "Amount:"
msgstr "Ilośc:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "Mieszanie:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "Mieszanie 0:"
@@ -3981,14 +3967,12 @@ msgid "Add Input"
msgstr "Dodaj Wejście"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "Clear Auto-Advance"
-msgstr "Wyczyść Auto-Progres"
+msgstr "Wyczyść autopostęp"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "Set Auto-Advance"
-msgstr "Ustaw Auto-Progres"
+msgstr "Ustaw autopostęp"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Delete Input"
@@ -4032,7 +4016,7 @@ msgstr "Węzeł Skalowania Czasu"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "TimeSeek Node"
-msgstr ""
+msgstr "Węzeł TimeSeek"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Transition Node"
@@ -4105,14 +4089,12 @@ msgid "Asset Download Error:"
msgstr "Błąd Podczas Pobierania Zasobu:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading (%s / %s)..."
-msgstr "Pobieranie"
+msgstr "Pobieranie (%s / %s)..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading..."
-msgstr "Pobieranie"
+msgstr "Pobieranie..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Resolving..."
@@ -4139,22 +4121,20 @@ msgid "Download for this asset is already in progress!"
msgstr "Pobieranie tego zasobu jest już w toku!"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "First"
-msgstr "pierwszy"
+msgstr "PoczÄ…tek"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Previous"
-msgstr "Poprzednia zakładka"
+msgstr "Wstecz"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Next"
-msgstr "Następny"
+msgstr "Dalej"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Last"
-msgstr ""
+msgstr "Koniec"
#: editor/plugins/asset_library_editor_plugin.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -4166,7 +4146,7 @@ msgstr "Wszystko"
msgid "Plugins"
msgstr "Wtyczki"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "Sortuj:"
@@ -4278,32 +4258,31 @@ msgstr "Usuń prowadnicę poziomą"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Create new horizontal and vertical guides"
-msgstr "Utwórz nowe poziome i pionowe prowadnice"
+msgstr "Utwórz nowe prowadnice: poziomą oraz pionową"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move pivot"
-msgstr "Przesuń pivot"
+msgstr "Przesuń oś"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Rotate CanvasItem"
-msgstr "Edytuj CanvasItem"
+msgstr "Obróć CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move anchor"
-msgstr "Przesuń Działanie"
+msgstr "Przesuń zakotwiczenie"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Resize CanvasItem"
-msgstr "Edytuj CanvasItem"
+msgstr "Zmień rozmiar CanvasItem"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr "Skaluj CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move CanvasItem"
-msgstr "Edytuj CanvasItem"
+msgstr "Przesuń CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -4322,19 +4301,17 @@ msgid "Paste Pose"
msgstr "Wklej pozÄ™"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "Oddal"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom reset"
-msgstr "Wyzeruj przybliżenie"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom in"
-msgstr "Przybliż"
+msgid "Zoom Reset"
+msgstr "Wyzeruj powiększenie"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
@@ -4367,6 +4344,10 @@ msgid "Rotate Mode"
msgstr "Tryb Rotacji"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr "Tryb skalowania"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4384,16 +4365,14 @@ msgid "Pan Mode"
msgstr "Tryb przesuwania"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle snapping."
-msgstr "PrzyciÄ…ganie"
+msgstr "Przełącz przyciąganie."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Snap"
msgstr "Użyj przyciągania"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snapping Options"
msgstr "Opcje przyciÄ…gania"
@@ -4435,9 +4414,8 @@ msgid "Snap to node sides"
msgstr "Przyciągaj do boków węzła"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to node center"
-msgstr "Przyciągaj do kotwicy węzła"
+msgstr "Przyciągaj do środka węzła"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to other nodes"
@@ -4466,6 +4444,10 @@ msgid "Restores the object's children's ability to be selected."
msgstr "Odblokuj selekcję węzłów podrzędnych."
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr "Opcje szkieletu"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "Pokaż kości"
@@ -4479,12 +4461,11 @@ msgstr "Wyczyść ÅaÅ„cuch IK"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make Custom Bone(s) from Node(s)"
-msgstr ""
+msgstr "Utwórz własne kości z węzłów"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Custom Bones"
-msgstr "Wyczyść Kości"
+msgstr "Wyczyść własne kości"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -4517,6 +4498,10 @@ msgid "Show Viewport"
msgstr "Pokaż widok"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr "Pokaż ikony grup i blokady"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr "Wyśrodkowywanie na zaznaczeniu"
@@ -4529,9 +4514,8 @@ msgid "Layout"
msgstr "Układ"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Insert keys."
-msgstr "Wstaw Klucze"
+msgstr "Wstaw klucze."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
@@ -4563,7 +4547,7 @@ msgstr "Dodawanie %s..."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Cannot instantiate multiple nodes without root."
-msgstr "Nie można utworzyć wielu wezłów bez węzła głównego."
+msgstr "Nie można utworzyć wielu węzłów bez węzła głównego."
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
@@ -4588,17 +4572,25 @@ msgstr ""
"Przeciągnij i upuść + Alt: Zmień typ węzła"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr "Stwórz Poly3D"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "Utwórz wielokąt"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Edytuj wielokÄ…t"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Edytuj wielokąt (usuń punkty)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
msgstr "Ustaw Uchwyt"
#: editor/plugins/cpu_particles_editor_plugin.cpp
-#, fuzzy
msgid "CPUParticles"
-msgstr "CzÄ…steczki"
+msgstr "CzÄ…steczki CPU"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
@@ -4620,11 +4612,11 @@ msgstr "Flat1"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Ease in"
-msgstr "Ease in"
+msgstr "Åagodne wejÅ›cie"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Ease out"
-msgstr "Ease out"
+msgstr "Åagodne wyjÅ›cie"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Smoothstep"
@@ -4635,9 +4627,8 @@ msgid "Modify Curve Point"
msgstr "Zmodyfikuj punkt krzywej"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Modify Curve Tangent"
-msgstr "Zamknij krzywÄ…"
+msgstr "Modyfikuj stycznÄ… krzywej"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Load Curve Preset"
@@ -4652,14 +4643,12 @@ msgid "Remove point"
msgstr "Usuń punkt"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Left linear"
-msgstr "Liniowe"
+msgstr "Lewe liniowe"
#: editor/plugins/curve_editor_plugin.cpp
-#, fuzzy
msgid "Right linear"
-msgstr "Widok z prawej"
+msgstr "Prawe liniowe"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Load preset"
@@ -4671,7 +4660,7 @@ msgstr "Usuń punkt krzywej"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Toggle Curve Linear Tangent"
-msgstr ""
+msgstr "Przełącz styczną liniową krzywej"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Hold Shift to edit tangents individually"
@@ -4679,7 +4668,7 @@ msgstr "Przytrzymaj Shift aby edytować styczne indywidualnie"
#: editor/plugins/gi_probe_editor_plugin.cpp
msgid "Bake GI Probe"
-msgstr ""
+msgstr "Wypal sondÄ™ GI"
#: editor/plugins/item_list_editor_plugin.cpp
msgid "Item %d"
@@ -4694,37 +4683,9 @@ msgid "Item List Editor"
msgstr "Edytor listy elementów"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"Brak zasobu OccluderPolygon2D w tym węźle.\n"
-"Stworzyć i przypisać nowy?"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr "Stwórz Occluder Polygon"
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr "Utwórz nowy wielokąt."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "Edytuj istniejÄ…cy polygon:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "LMB: Przesuń Punkt."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr "Ctrl + LPM: Podziału segmentu."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "RMB: Wymaż Punkt."
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr "Siatka jest pusta!"
@@ -4743,7 +4704,7 @@ msgstr "Nie działa na głównym węźle sceny!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Shape"
-msgstr ""
+msgstr "Utwórz kształt trójsiatki"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Convex Shape"
@@ -4775,13 +4736,12 @@ msgid "MeshInstance lacks a Mesh!"
msgstr "MeshInstance nie posiada siatki!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
msgid "Mesh has not surface to create outlines from!"
-msgstr "Siatka nie posiada powierzchni z której można utworzyć zarys!"
+msgstr "Siatka nie posiada powierzchni, z której można by utworzyć obrysy!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!"
-msgstr ""
+msgstr "Typ prymitywu siatki jest inny niż PRIMITIVE_TRIANGLES!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Could not create outline!"
@@ -4789,7 +4749,7 @@ msgstr "Nie udało się utworzyć zarysu!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline"
-msgstr "Utwórz zarys"
+msgstr "Utwórz obrys"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh"
@@ -4797,19 +4757,20 @@ msgstr "Siatka"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Static Body"
-msgstr ""
+msgstr "Utwórz statyczne ciało trójsiatki"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Convex Static Body"
msgstr "Utwórz statyczne ciało wypukłe"
#: editor/plugins/mesh_instance_editor_plugin.cpp
+#, fuzzy
msgid "Create Trimesh Collision Sibling"
-msgstr ""
+msgstr "Utwórz trójsiatkę sąsiednich kolizji"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Convex Collision Sibling"
-msgstr ""
+msgstr "Utwórz wypukłego sąsiada kolizji"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
@@ -4858,11 +4819,11 @@ msgstr "Aktualizuj ze sceny"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "No mesh source specified (and no MultiMesh set in node)."
-msgstr ""
+msgstr "Nie ustawiono źródła siatki (i nie ma MultiMesh ustawionego w węźle)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "No mesh source specified (and MultiMesh contains no Mesh)."
-msgstr ""
+msgstr "Nie ustawiono źródła siatki (a MultiMesh nie posiada siatki)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh source is invalid (invalid path)."
@@ -4870,25 +4831,23 @@ msgstr "Źródło siatki jest niepoprawne (nieprawidłowa ścieżka)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh source is invalid (not a MeshInstance)."
-msgstr ""
+msgstr "Źródło siatki jest nieprawidłowe (nie jest MeshInstance)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh source is invalid (contains no Mesh resource)."
-msgstr ""
+msgstr "Źródło siatki jest nieprawidłowe (nie zawiera zasobu Mesh)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "No surface source specified."
msgstr "Nie ustawiono źródła płaszczyzny."
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
msgid "Surface source is invalid (invalid path)."
-msgstr "Płaszczyzna jest niepoprawna(nieprawidłowa ścieżka)"
+msgstr "Źródło powierzchni jest niepoprawne (nieprawidłowa ścieżka)."
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
msgid "Surface source is invalid (no geometry)."
-msgstr "Płaszczyzna jest niepoprawna (brak geometrii)"
+msgstr "Źródło powierzchni jest niepoprawne (brak geometrii)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Surface source is invalid (no faces)."
@@ -4896,24 +4855,21 @@ msgstr "Płaszczyzna jest niepoprawna (brak ścian)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Parent has no solid faces to populate."
-msgstr ""
+msgstr "Rodzic nie ma stałych powierzchni do zapełnienia."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Couldn't map area."
msgstr "Nie można zmapować obszaru."
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
msgid "Select a Source Mesh:"
-msgstr "Wybierz źródło siatki"
+msgstr "Wybierz siatkę źródłową:"
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
msgid "Select a Target Surface:"
-msgstr "Wybierz docelową przestrzeń"
+msgstr "Wybierz docelową płaszczyznę:"
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
msgid "Populate Surface"
msgstr "Zapełnij powierzchnię"
@@ -4922,9 +4878,8 @@ msgid "Populate MultiMesh"
msgstr "Zapełnij MultiMesh"
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
msgid "Target Surface:"
-msgstr "Docelowa przestrzeń"
+msgstr "Docelowa powierzchnia:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Source Mesh:"
@@ -4943,7 +4898,6 @@ msgid "Z-Axis"
msgstr "OÅ›-Z"
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
msgid "Mesh Up Axis:"
msgstr "Oś \"do góry\" siatki:"
@@ -4960,22 +4914,22 @@ msgid "Random Scale:"
msgstr "Losowa skala:"
#: editor/plugins/multimesh_editor_plugin.cpp
-#, fuzzy
msgid "Populate"
msgstr "Zapełnij"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr "Utwórz wielokąt nawigacyjny"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr "Generowanie AABB"
+msgid "Generating Visibility Rect"
+msgstr "Generowanie prostokąta widzialności"
#: editor/plugins/particles_2d_editor_plugin.cpp
+#, fuzzy
msgid "Can only set point into a ParticlesMaterial process material"
-msgstr ""
+msgstr "Punkt można wstawić tylko w materiał obróbki ParticlesMaterial"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Error loading image:"
@@ -4986,9 +4940,8 @@ msgid "No pixels with transparency > 128 in image..."
msgstr "Brak pikseli z przeźroczystością > 128 w obrazie..."
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "Generate Visibility Rect"
-msgstr "Wygeneruj widzialność prostokąta"
+msgstr "Wygeneruj prostokąta widzialności"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Load Emission Mask"
@@ -5000,6 +4953,11 @@ msgstr "Usuń maskę emisji"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr "Przekonwertuj na czÄ…steczki CPU"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr "CzÄ…steczki"
@@ -5053,9 +5011,8 @@ msgid "Surface Points"
msgstr "Punkty powierzchni"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
msgid "Surface Points+Normal (Directed)"
-msgstr "Punkty powierzchni+Normalne (Skierowane)"
+msgstr "Punkty powierzchni+normalna (skierowane)"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Volume"
@@ -5071,13 +5028,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr "Materiał przetwarzający typu 'ParticlesMaterial' jest wymagany."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
-msgstr "Generuj AABB"
+msgid "Generating AABB"
+msgstr "Generowanie AABB"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "Wielkie litery"
+msgid "Generate AABB"
+msgstr "Generuj AABB"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5103,6 +5059,10 @@ msgid "Add Point to Curve"
msgstr "Dodaj punkt do krzywej"
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr "Podziel krzywÄ…"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr "PrzenieÅ› punkt krzywej"
@@ -5130,6 +5090,11 @@ msgid "Click: Add Point"
msgstr "Klik: Dodaj Punkt"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Left Click: Split Segment (in curve)"
+msgstr "Podziel Segment (na krzywej)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr "Prawy Klik: Usuń Punkt"
@@ -5145,11 +5110,6 @@ msgstr "Dodaj Punkt (w pustym miejscu)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr "Podziel Segment (na krzywej)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "Usuń Punkt"
@@ -5167,12 +5127,12 @@ msgstr "Opcje"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Angles"
-msgstr ""
+msgstr "Odbij kąty uchwytów"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Lengths"
-msgstr ""
+msgstr "Odbij długość uchwytów"
#: editor/plugins/path_editor_plugin.cpp
msgid "Curve Point #"
@@ -5210,65 +5170,82 @@ msgstr "Usuń punkt ścieżki"
msgid "Remove In-Control Point"
msgstr "Usuń punkt ścieżki"
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Podziel Segment (na krzywej)"
+
#: editor/plugins/physical_bone_plugin.cpp
-#, fuzzy
msgid "Move joint"
-msgstr "Przesuń Punkt"
+msgstr "Przesuń złącze"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
-msgstr ""
+msgstr "Właściwość skeleton węzła Polygon2D nie wskazuje na węzeł Skeleton2D"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Sync bones"
-msgstr "Pokaż kości"
+msgid "Sync Bones"
+msgstr "Synchronizuj kości"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+"Ten wielokÄ…t nie ma tekstury.\n"
+"Ustaw teksturę, by móc edytować UV."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr "Utwórz Mapę UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon & UV"
-msgstr "Utwórz Polygon"
+msgstr "Utwórz wielokąt i UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "Utwórz nową prowadnicę poziomą"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
+#, fuzzy
+msgid "Remove Internal Vertex"
+msgstr "Usuń punkt ścieżki"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "Akcja %s już istnieje!"
+msgid "Add Custom Polygon"
+msgstr "Edytuj wielokÄ…t"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Add Split"
-msgstr "Dodaj punkt"
+msgid "Remove Custom Polygon"
+msgstr "Usuń wielokąt i punkt"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Invalid Split: "
-msgstr "Niepoprawna ścieżka!"
+msgid "Transform UV Map"
+msgstr "Przekształć Mapę UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Usuń punkt"
+msgid "Transform Polygon"
+msgstr "Typ przekształcenia"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Transform UV Map"
-msgstr "Przekształć Mapę UV"
+#, fuzzy
+msgid "Paint Bone Weights"
+msgstr "Maluj wagi kości"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
-msgstr ""
+#, fuzzy
+msgid "Open Polygon 2D UV editor."
+msgstr "WielokÄ…t 2D UV Edytor"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
@@ -5276,31 +5253,25 @@ msgstr "WielokÄ…t 2D UV Edytor"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "UV"
-msgstr ""
+msgstr "UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "Edytuj wielokÄ…t"
+msgid "Points"
+msgstr "Punkt"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Splits"
-msgstr "Podziel Ścieżkę"
+msgid "Polygons"
+msgstr "WielokÄ…t->UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Bones"
-msgstr "Utwórz Kości"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Create Polygon"
-msgstr "Utwórz Polygon"
+msgstr "Kości"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
-msgstr "Przesuń Punkt"
+msgid "Move Points"
+msgstr "Przesuń punkty"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
@@ -5327,25 +5298,28 @@ msgid "Scale Polygon"
msgstr "Skaluj WielokÄ…t"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "Najpierw wybierz ustawienie z listy!"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
-msgstr ""
+#, fuzzy
+msgid "Paint weights with specified intensity."
+msgstr "Maluj wagi z podaną intensywnością."
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
-msgstr ""
+#, fuzzy
+msgid "Unpaint weights with specified intensity."
+msgstr "Odmaluj wagi z podaną intensywnością."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Radius:"
-msgstr ""
+msgstr "Promień:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon->UV"
@@ -5360,9 +5334,13 @@ msgid "Clear UV"
msgstr "Wyczyść UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Settings"
-msgstr "Ustawienia GridMap"
+msgstr "Ustawienia siatki"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "PrzyciÄ…gaj"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
@@ -5373,34 +5351,28 @@ msgid "Grid"
msgstr "Siatka"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Configure Grid:"
-msgstr "Konfiguruj przyciÄ…ganie"
+msgstr "Konfiguruj siatkÄ™:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset X:"
-msgstr "Offset siatki:"
+msgstr "Przesunięcie X siatki:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset Y:"
-msgstr "Offset siatki:"
+msgstr "Przesunięcie Y siatki:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step X:"
-msgstr "Krok siatki:"
+msgstr "Krok X siatki:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step Y:"
-msgstr "Krok siatki:"
+msgstr "Krok Y siatki:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Sync Bones to Polygon"
-msgstr "Skaluj WielokÄ…t"
+msgstr "Synchronizuj kości z wielokątem"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "ERROR: Couldn't load resource!"
@@ -5428,39 +5400,37 @@ msgid "Paste Resource"
msgstr "Wklej zasób"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "Otwórz w edytorze"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr "Instancja:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr "Typ:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Otwórz w edytorze"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr "Wczytaj Zasób"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#, fuzzy
msgid "ResourcePreloader"
-msgstr "Ścieżka zasobu"
+msgstr "Wstępny ładowacz zasobów"
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "AnimationTree has no path set to an AnimationPlayer"
-msgstr ""
+msgstr "Węzeł AnimationTree nie ma ustawionej ścieżki do AnimationPlayer"
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Path to AnimationPlayer is invalid"
-msgstr "Drzewo animacji jest wadliwe."
+msgstr "Ścieżka do AnimationPlayer jest nieprawidłowa"
#: editor/plugins/script_editor_plugin.cpp
msgid "Clear Recent Files"
@@ -5471,56 +5441,65 @@ msgid "Close and save changes?"
msgstr "Zamknąć i zapisać zmiany?"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error writing TextFile:"
-msgstr "Błąd wczytywania obrazu:"
+msgstr "Błąd pisania pliku tekstowego:"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr "Błąd: nie udało się wczytać pliku."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error could not load file."
-msgstr "Nie można wczytać obrazu"
+msgstr "Błąd nie udało się wczytać pliku."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error saving file!"
-msgstr "Błąd podczas zapisywania TileSet!"
+msgstr "Błąd zapisywania pliku!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr "Błąd podczas zapisywania motywu"
+msgid "Error while saving theme."
+msgstr "Błąd podczas zapisywania motywu."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+#, fuzzy
+msgid "Error Saving"
msgstr "Błąd zapisywania"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr "Błąd importowania motywu"
+#, fuzzy
+msgid "Error importing theme."
+msgstr "Błąd importowania motywu."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+#, fuzzy
+msgid "Error Importing"
msgstr "Błąd importowania"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New TextFile..."
-msgstr "Utwórz katalog..."
+msgstr "Nowy plik tekstowy..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open File"
msgstr "Otwórz plik"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Save File As..."
-msgstr "Zapisz jako..."
+msgstr "Zapisz plik jako..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme"
msgstr "Zaimportuj motyw"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Błąd podczas zapisywania motywu"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Błąd zapisywania"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr "Zapisz motyw jako..."
@@ -5531,12 +5510,11 @@ msgstr " Referencja klas"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
-msgstr ""
+msgstr "Przełącz alfabetyczne sortowanie listy metod."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Sort"
-msgstr "Sortuj:"
+msgstr "Sortuj"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
@@ -5563,9 +5541,8 @@ msgid "File"
msgstr "Plik"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "New TextFile"
-msgstr "Pokaż pliki"
+msgid "Open..."
+msgstr "Otwórz..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5580,11 +5557,7 @@ msgid "Copy Script Path"
msgstr "Skopiuj ścieżkę skryptu"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr "Pokaż w systemie plików"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+msgid "History Previous"
msgstr "Poprzedni plik"
#: editor/plugins/script_editor_plugin.cpp
@@ -5597,6 +5570,10 @@ msgid "Theme"
msgstr "Motyw"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme..."
+msgstr "Importuj motyw..."
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
msgstr "Przeładuj motyw"
@@ -5605,10 +5582,6 @@ msgid "Save Theme"
msgstr "Zapisz motyw"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "Zapisz motyw jako"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "Zamknij pliki pomocy"
@@ -5655,18 +5628,14 @@ msgid "Keep Debugger Open"
msgstr "Pozostaw Debugger otwarty"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
-msgstr "Debugowanie z zewnętrznego edytora"
+msgid "Debug with External Editor"
+msgstr "Debugowanie z zewnętrznym edytorem"
#: editor/plugins/script_editor_plugin.cpp
msgid "Open Godot online documentation"
msgstr "Otwórz dokumentację online"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr "Szukaj w hierarchii klas."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Poszukaj w dokumentacji referencyjnej."
@@ -5703,39 +5672,32 @@ msgid "Debugger"
msgstr "Debugger"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search results"
-msgstr "Wyszukaj w Pomocy"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "Przeszukaj klasy"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-"Wbudowany skrypty mogą być edytowane tylko, po załadowaniu sceny do której "
-"należą"
+msgid "Search Results"
+msgstr "Wyniki wyszukiwania"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Line"
-msgstr "Linia:"
+msgstr "Linia"
#: editor/plugins/script_text_editor.cpp
msgid "(ignore)"
-msgstr ""
+msgstr "(ignoruj)"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function"
+msgstr "Przejdź do funkcji"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr "Standardowy"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr "Jedynie zasoby z systemu plików mogą zostać tu upuszczone."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Lookup Symbol"
-msgstr "Uzupełnij symbol"
+msgstr "Podejrzyj symbol"
#: editor/plugins/script_text_editor.cpp
msgid "Pick Color"
@@ -5759,11 +5721,7 @@ msgstr "Wielkie litery na początku słów"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Syntax Highlighter"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
+msgstr "Podświetlacz składni"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
@@ -5816,11 +5774,11 @@ msgid "Trim Trailing Whitespace"
msgstr "Przytnij końcowe spacje"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr "Zamień wcięcia na spacje"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr "Zamień wcięcia na tabulatory"
#: editor/plugins/script_text_editor.cpp
@@ -5830,44 +5788,34 @@ msgstr "Automatyczne wcięcie"
#: editor/plugins/script_text_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Toggle Breakpoint"
-msgstr "Przełącz pułapkę"
+msgstr "Przełącz punkt wstrzymania"
#: editor/plugins/script_text_editor.cpp
msgid "Remove All Breakpoints"
-msgstr "Usuń wszystkie pułapki"
+msgstr "Usuń wszystkie punkty wstrzymania"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr "Przejdź do następnej pułapki"
+msgid "Go to Next Breakpoint"
+msgstr "Przejdź do następnego punktu wstrzymania"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr "Przejdź do poprzedniej pułapki"
-
-#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Convert To Uppercase"
-msgstr "Wielkie litery"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr "Małe litery"
+msgid "Go to Previous Breakpoint"
+msgstr "Przejdź do poprzedniego punktu wstrzymania"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr "Znajdź poprzedni"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Find in files..."
-msgstr "Filtrowanie plików..."
+msgid "Find in Files..."
+msgstr "Znajdź w plikach..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+msgid "Go to Function..."
msgstr "Przejdź do funkcji..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+msgid "Go to Line..."
msgstr "Przejdź do linii..."
#: editor/plugins/script_text_editor.cpp
@@ -5880,40 +5828,35 @@ msgstr "Shader"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "This skeleton has no bones, create some children Bone2D nodes."
-msgstr ""
+msgstr "Ten szkielet nie ma kości. Stwórz jakieś węzły potomne Bone2D."
#: editor/plugins/skeleton_2d_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton2D"
-msgstr "Szkielet..."
+msgstr "Szkielet 2D"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Make Rest Pose (From Bones)"
-msgstr ""
+msgstr "Utwórz pozę spoczynkową (z kości)"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Set Bones to Rest Pose"
-msgstr ""
+msgstr "Ustaw kości do pozy spoczynkowej"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical bones"
-msgstr "Utwórz siatkę nawigacyjną (Navigation Mesh)"
+msgstr "Utwórz fizyczne kości"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton"
-msgstr "Szkielet..."
+msgstr "Szkielet"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical skeleton"
-msgstr "Utwórz solucję C#"
+msgstr "Utwórz fizyczny szkielet"
#: editor/plugins/skeleton_ik_editor_plugin.cpp
-#, fuzzy
msgid "Play IK"
-msgstr "Uruchom"
+msgstr "Odtwórz IK"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Orthogonal"
@@ -5941,39 +5884,41 @@ msgstr "Transformacja osi Z."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Plane Transform."
-msgstr ""
+msgstr "Pokaż transformację płaszczyzny."
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Scaling: "
-msgstr "Skala:"
+msgstr "Skalowanie: "
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Translating: "
-msgstr "Tłumaczenia:"
+msgstr "Przesuwanie: "
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotating %s degrees."
msgstr "Obracanie o %s stopni."
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Keying is disabled (no key inserted)."
msgstr "Kluczowanie jest wyłączone (nie wstawiono klucza)."
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Animation Key Inserted."
msgstr "Wstawiono klucz animacji."
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
+msgid "Pitch"
+msgstr "Wysokość"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr "Odchylenie"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr "Narysowane obiekty"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Material Changes"
msgstr "Zmiany materiału"
@@ -5982,9 +5927,8 @@ msgid "Shader Changes"
msgstr "Zmiany Shadera"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Surface Changes"
-msgstr "Odśwież Zmiany"
+msgstr "Zmiany powierzchni"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Draw Calls"
@@ -6055,9 +5999,8 @@ msgid "This operation requires a single selected node."
msgstr "Ta operacja wymaga pojedynczego wybranego węzła."
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Lock View Rotation"
-msgstr "Wyświetlaj informacje"
+msgstr "Zablokuj obrót widoku"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Normal"
@@ -6082,7 +6025,7 @@ msgstr "Wyświetlaj środowisko"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "View Gizmos"
-msgstr "Wyświetlaj uchwyty"
+msgstr "Pokaż uchwyty"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Information"
@@ -6097,18 +6040,16 @@ msgid "Half Resolution"
msgstr "Połowa rozdzielczości"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Audio Listener"
-msgstr "Nasłuchiwacz dźwięku"
+msgstr "Słuchacz dźwięku"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Doppler Enable"
msgstr "Efekt Dopplera"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Cinematic Preview"
-msgstr "Tworzenie podglÄ…du Mesh"
+msgstr "PodglÄ…d kinowy"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
@@ -6139,6 +6080,10 @@ msgid "Freelook Speed Modifier"
msgstr "Zmiennik prędkości \"Wolnego widoku\""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "Obroty widoku zablokowane"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "Okno dialogowe XForm"
@@ -6170,7 +6115,7 @@ msgstr "Tryb skalowania (R)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Local Coords"
-msgstr "Local Coords"
+msgstr "Lokalne koordynaty"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Local Space Mode (%s)"
@@ -6225,29 +6170,20 @@ msgid "Align Selection With View"
msgstr "Dopasuj zaznaczenie do widoku"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Tool Select"
-msgstr "Wybierz narzędzie"
+msgstr "Narzędzie wyboru"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Tool Move"
-msgstr "PrzenieÅ›"
+msgstr "Narzędzie poruszania"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Tool Rotate"
-msgstr "Narzędzie Obracanie"
+msgstr "Narzędzie obracania"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Tool Scale"
-msgstr "Narzędzia Skala"
-
-#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap To Floor"
-msgstr "PrzyciÄ…gaj do siatki"
+msgstr "Narzędzie skalowania"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
@@ -6259,7 +6195,7 @@ msgstr "Przekształcanie"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap object to floor"
-msgstr ""
+msgstr "Przyciągnij obiekt do podłogi"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Dialog..."
@@ -6290,9 +6226,8 @@ msgid "4 Viewports"
msgstr "4 widoki"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Gizmos"
-msgstr "Wyświetlaj uchwyty"
+msgstr "Uchwyty"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Origin"
@@ -6369,52 +6304,50 @@ msgstr "Przed"
msgid "Post"
msgstr "Po"
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite is empty!"
-msgstr "Ścieżka zapisu jest pusta!"
+msgstr "Sprite jest pusty!"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Can't convert a sprite using animation frames to mesh."
msgstr ""
+"Nie można przekonwertować sprite'a używającego klatek animacji na siatkę."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't replace by mesh."
-msgstr ""
+msgstr "Nieprawidłowa geometria, nie można zastąpić przez siatkę."
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite"
-msgstr "SpriteFrames"
+msgstr "Sprite"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to 2D Mesh"
-msgstr "Konwersja do %s"
+msgstr "Konwertuj do siatki 2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create 2D Mesh"
-msgstr "Utwórz siatkę zarysu"
+msgstr "Utwórz siatkę 2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Simplification: "
-msgstr ""
+msgstr "Uproszczenie: "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Grow (Pixels): "
-msgstr "PrzyciÄ…ganie (piksele):"
+msgstr "Wzrost (piksele): "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Update Preview"
-msgstr "PodglÄ…d"
+msgstr "Odśwież podgląd"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Settings:"
-msgstr "Ustawienia"
+msgstr "Ustawienia:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
@@ -6489,12 +6422,17 @@ msgid "Set Region Rect"
msgstr "Ustaw obszar tekstury"
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr "Ustaw margines"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr "Tryb przyciÄ…gania:"
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
-msgstr "<żaden>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
+msgstr "Brak"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Pixel Snap"
@@ -6518,10 +6456,9 @@ msgstr "Krok:"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Sep.:"
-msgstr ""
+msgstr "Sep.:"
#: editor/plugins/texture_region_editor_plugin.cpp
-#, fuzzy
msgid "TextureRegion"
msgstr "Obszar tekstury"
@@ -6550,9 +6487,8 @@ msgid "Edit theme..."
msgstr "Edytuj motyw interfejsu..."
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Theme editing menu."
-msgstr "Menu zmiany wyglÄ…du programu."
+msgstr "Menu edycji motywu."
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add Class Items"
@@ -6587,23 +6523,20 @@ msgid "Item"
msgstr "Element"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Check Item"
-msgstr "Sprawdź element"
+msgstr "Element wyboru"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Checked Item"
-msgstr "Zaznaczony element"
+msgstr "Zaznaczony element wyboru"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Radio Item"
-msgstr "Dodaj element"
+msgstr "Element opcji"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Checked Radio Item"
-msgstr "Zaznaczony element"
+msgstr "Zaznaczony element opcji"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Has"
@@ -6614,17 +6547,14 @@ msgid "Many"
msgstr "Wiele"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Has,Many,Options"
-msgstr "Ma,Wiele,Różnych,Opcji!"
+msgstr "Ma,Wiele,Opcji"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Tab 1"
msgstr "Zakładka 1"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Tab 2"
msgstr "Zakładka 2"
@@ -6633,9 +6563,8 @@ msgid "Tab 3"
msgstr "Zakładka 3"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Data Type:"
-msgstr "Rodzaj Daty:"
+msgstr "Typ danych:"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Icon"
@@ -6662,9 +6591,12 @@ msgid "Erase Selection"
msgstr "Usuń zaznaczenie"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Fix Invalid Tiles"
-msgstr "Niewłaściwa nazwa."
+msgstr "Napraw niewłaściwe kafelki"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Cut Selection"
+msgstr "Wytnij zaznaczenie"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
@@ -6676,7 +6608,7 @@ msgstr "Rysuj LiniÄ™"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Rectangle Paint"
-msgstr ""
+msgstr "Malowanie prostokÄ…tne"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Bucket Fill"
@@ -6687,9 +6619,8 @@ msgid "Erase TileMap"
msgstr "Wyczyść TileMap"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Find Tile"
-msgstr "Znajdź tile"
+msgstr "Znajdź kafelek"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Transpose"
@@ -6705,42 +6636,45 @@ msgstr "Odbij Y"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint Tile"
-msgstr "Maluj Tile"
+msgstr "Maluj kafelek"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Pick Tile"
-msgstr "Wybierz tile"
+msgstr "Wybierz kafelek"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
-msgid "Move Selection"
-msgstr "Usuń zaznaczone"
+msgid "Copy Selection"
+msgstr "Kopiuj zaznaczenie"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr "Obróć o 0 stopni"
+msgid "Rotate left"
+msgstr "Obróć w lewo"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr "Obróć o 90 stopni"
+msgid "Rotate right"
+msgstr "Obróć w prawo"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
-msgstr "Obróć o 180 stopni"
+msgid "Flip horizontally"
+msgstr "Odbij poziomo"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
-msgstr "Obróć o 270 stopni"
+msgid "Flip vertically"
+msgstr "Odbij pionowo"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Clear transform"
+msgstr "Wyczyść przekształcenie"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Add Texture(s) to TileSet"
-msgstr "Dodaj węzeł(y) z drzewa"
+msgid "Add Texture(s) to TileSet."
+msgstr "Dodaj teksturÄ™/tekstury do TileSet."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
-msgstr "Usuń punkt krzywej"
+msgid "Remove selected Texture from TileSet."
+msgstr "Usuń zaznaczoną teksturę z TileSet."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -6751,54 +6685,95 @@ msgid "Merge from Scene"
msgstr "Połącz ze sceny"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
-msgstr ""
+msgid "Copy bitmask."
+msgstr "Kopiuj maskÄ™ bitowÄ…."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
-msgstr ""
+msgid "Paste bitmask."
+msgstr "Wklej maskÄ™ bitowÄ…."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Erase bitmask."
+msgstr "Wyczyść maskę bitową."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new polygon."
+msgstr "Utwórz nowy wielokąt."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Enable snap and show grid (configurable via the Inspector)."
+msgstr "Włącz przyciąganie i pokaż siatkę (konfigurowalne w inspektorze)."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr "Pokaż nazwy kafelków (przytrzymaj Alt)"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "Usunąć wybraną teksturę i WSZYSTKIE KAFELKI, które jej używają?"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
-msgstr ""
+msgstr "Nie wybrano tekstury do usunięcia."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
-msgstr "Utwórz ze sceny?"
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr "Utworzyć na podstawie sceny? Obecne kafelki zostaną nadpisane."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
msgstr "Połącz ze sceny?"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
-msgstr ""
+msgid "Remove Texture"
+msgstr "Usuń teksturę"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
+msgstr "%s plik(ów) nie zostało dodane, bo był(y) już na liście."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Drag handles to edit Rect.\n"
"Click on another Tile to edit it."
msgstr ""
+"Przeciągnij uchwyty, by edytować prostokąt.\n"
+"Kliknij na inny kafelek, by go edytować."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "Usuń zaznaczony prostokąt."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
+"Wybierz aktualnie edytowany pod-kafelek.\n"
+"Kliknij inny kafelek, by go edytować."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete polygon."
+msgstr "Usuń wielokąt."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
-msgstr "Wybierz aktualnie edytowany sub-tile."
+msgstr ""
+"LPM: Włącz bit.\n"
+"PPM: Wyłącz bit.\n"
+"Kliknij inny kafelek, by go edytować."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -6806,42 +6781,131 @@ msgid ""
"bindings.\n"
"Click on another Tile to edit it."
msgstr ""
+"Wybierz pod-kafelek do użycia jako ikona. Zostanie on również użyty do "
+"niewłaściwych ustawień autokafelków.\n"
+"Kliknij inny kafelek, by go edytować."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Select sub-tile to change its priority.\n"
"Click on another Tile to edit it."
msgstr ""
+"Wybierz pod-kafelek, by zmienić jego priorytet.\n"
+"Kliknij inny kafelek, by go edytować."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "This property can't be changed."
-msgstr "Ta operacja nie może zostać wykonana bez sceny."
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+"Wybierz pod-kafelek, by zmienić jego priorytet.\n"
+"Kliknij inny kafelek, by go edytować."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Tile Set"
-msgstr "TileSet..."
+msgid "Set Tile Region"
+msgstr "Ustaw obszar tekstury"
-#: editor/plugins/visual_shader_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid "Create Tile"
+msgstr "Utwórz katalog"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "Edytuj filtry"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Collision Polygon"
+msgstr "Edytuj wielokÄ…t kolizji"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Edytuj wielokÄ…t"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Edytuj wielokÄ…t nawigacyjny"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "Wklej animacjÄ™"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Usuń szablon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "Usuń wielokąt i punkt"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "Stwórz Occluder Polygon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "Utwórz wielokąt nawigacyjny"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "Edytuj filtry"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Utwórz wielokąt nawigacyjny"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Stwórz Occluder Polygon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "This property can't be changed."
+msgstr "Ta właściwość nie może zostać zmieniona."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "TileSet"
+msgstr "TileSet"
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
-msgstr "Wierzchołki"
+msgstr "Wierzchołek"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Fragment"
-msgstr "Argumenty:"
+msgstr "Fragmenty"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Light"
-msgstr "Prawa"
+msgstr "Światło"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "VisualShader"
-msgstr "Shader"
+msgstr "Shader wizualny"
#: editor/project_export.cpp
msgid "Runnable"
@@ -6860,6 +6924,14 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr "Brakuje szablonów eksportu dla tej platformy lub są uszkodzone:"
#: editor/project_export.cpp
+msgid "Release"
+msgstr "Wydanie"
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr "Eksportowanie wszystkiego"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr "Profile eksportu"
@@ -6868,6 +6940,10 @@ msgid "Add..."
msgstr "Dodaj..."
#: editor/project_export.cpp
+msgid "Export Path"
+msgstr "Ścieżka eksportu"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr "Zasoby"
@@ -6926,10 +7002,46 @@ msgid "Feature List:"
msgstr "Lista funkcji:"
#: editor/project_export.cpp
+msgid "Script"
+msgstr "Skrypt"
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "Tryb eksportu skryptów:"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr "Tekst"
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr "Skompilowany"
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "Zaszyfrowany (podaj klucz poniżej)"
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "Klucz szyfrujÄ…cy skryptu (256-bit jako hex):"
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr "Eksport PCK/Zip"
#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr "Tryb eksportu?"
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr "Eksportuj wszystko"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr "Brakuje eksportu szablonów dla tej platformy:"
@@ -6942,32 +7054,29 @@ msgid "The path does not exist."
msgstr "Ścieżka nie istnieje."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
-msgstr "Proszę wybrać folder nie zawierający pliku 'project.godot'."
+msgstr ""
+"Niewłaściwy projekt pliku \".zip\", nie zawiera pliku \"project.godot\"."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Please choose an empty folder."
-msgstr "Proszę wybrać plik 'project.godot'."
+msgstr "Proszę wybrać pusty folder."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "Proszę wybrać plik 'project.godot'."
+msgstr "Proszę wybrać plik \"project.godot\" lub \".zip\"."
#: editor/project_manager.cpp
msgid "Directory already contains a Godot project."
-msgstr ""
+msgstr "Folder już zawiera projekt Godota."
#: editor/project_manager.cpp
msgid "Imported Project"
msgstr "Zaimportowano projekt"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Invalid Project Name."
-msgstr "Nazwa projektu:"
+msgstr "Nieprawidłowa nazwa projektu."
#: editor/project_manager.cpp
msgid "Couldn't create folder."
@@ -6986,11 +7095,12 @@ msgid "Invalid project path (changed anything?)."
msgstr "Niepoprawna ścieżka projektu (zmienić cokolwiek?)."
#: editor/project_manager.cpp
-#, fuzzy
msgid ""
"Couldn't load project.godot in project path (error %d). It may be missing or "
"corrupted."
-msgstr "Nie można było edytować engine.cfg w ścieżce projektu."
+msgstr ""
+"Nie udało się wczytać project.godot w ścieżce projektu (błąd %d). Może go "
+"brakować lub być uszkodzony."
#: editor/project_manager.cpp
msgid "Couldn't edit project.godot in project path."
@@ -7049,9 +7159,8 @@ msgid "Project Path:"
msgstr "Ścieżka do projektu:"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Project Installation Path:"
-msgstr "Ścieżka do projektu:"
+msgstr "Ścieżka instalacji projektu:"
#: editor/project_manager.cpp
msgid "Browse"
@@ -7062,8 +7171,9 @@ msgid "Unnamed Project"
msgstr "Projekt bez nazwy"
#: editor/project_manager.cpp
-msgid "Can't open project"
-msgstr "Nie można otworzyć projektu"
+#, fuzzy
+msgid "Can't open project at '%s'."
+msgstr "Nie można otworzyć projektu w '%s'."
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
@@ -7071,6 +7181,26 @@ msgstr "Czy jesteś pewny że chcesz otworzyć więcej niż jeden projekt?"
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+"Opcje projektu zostały utworzone w nowszej wersji silnika, która nie jest "
+"kompatybilna z obecnÄ… wersjÄ…."
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7171,13 +7301,12 @@ msgid "Mouse Button"
msgstr "Przycisk myszy"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid ""
"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
msgstr ""
-"Niepoprawna nazwa akcji. Nazwa nie może być pusta ani zawierać znaki takie "
-"jak: '/', ':', '=', '\\' lub '\"'"
+"Niepoprawna nazwa akcji. Nie może być pusta ani zawierać '/', ':', '=', '\\' "
+"lub '\"'"
#: editor/project_settings_editor.cpp
msgid "Action '%s' already exists!"
@@ -7188,18 +7317,16 @@ msgid "Rename Input Action Event"
msgstr "Zmień nazwę zdarzenia akcji wejścia"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Change Action deadzone"
-msgstr "Zmień nazwę animacji:"
+msgstr "Zmień martwą strefę akcji"
#: editor/project_settings_editor.cpp
msgid "Add Input Action Event"
msgstr "Dodaj zdarzenie akcji wejścia"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "All Devices"
-msgstr "UrzÄ…dzenie"
+msgstr "Wszystkie urzÄ…dzenia"
#: editor/project_settings_editor.cpp
msgid "Device"
@@ -7246,24 +7373,20 @@ msgid "Wheel Down Button"
msgstr "Kółko myszy w dół"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Left Button"
-msgstr "Kółko myszy w górę"
+msgstr "Kółko w lewo"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Right Button"
-msgstr "Prawy guzik"
+msgstr "Kółko w prawo"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 1"
-msgstr "Przycisk 6"
+msgstr "Przycisk X 1"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 2"
-msgstr "Przycisk 6"
+msgstr "Przycisk X 2"
#: editor/project_settings_editor.cpp
msgid "Joypad Axis Index:"
@@ -7291,7 +7414,7 @@ msgstr "Dodaj zdarzenie"
#: editor/project_settings_editor.cpp
msgid "Button"
-msgstr "Button"
+msgstr "Przycisk"
#: editor/project_settings_editor.cpp
msgid "Left Button."
@@ -7334,13 +7457,12 @@ msgid "Delete Item"
msgstr "Usuń element"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid ""
"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'."
msgstr ""
-"Niepoprawna nazwa akcji. Nazwa nie może być pusta ani zawierać znaki takie "
-"jak: '/', ':', '=', '\\' lub '\"'"
+"Niepoprawna nazwa akcji. Nie może być pusta ani zawierać '/', ':', '=', '\\' "
+"lub '\"'."
#: editor/project_settings_editor.cpp
msgid "Already existing"
@@ -7360,7 +7482,7 @@ msgstr "Ustawienia zapisane pomyślnie."
#: editor/project_settings_editor.cpp
msgid "Override for Feature"
-msgstr ""
+msgstr "Nadpisanie dla cechy"
#: editor/project_settings_editor.cpp
msgid "Add Translation"
@@ -7376,7 +7498,7 @@ msgstr "Dodaj zmapowaną ścieżkę"
#: editor/project_settings_editor.cpp
msgid "Resource Remap Add Remap"
-msgstr ""
+msgstr "Dodaj mapowanie zasobu"
#: editor/project_settings_editor.cpp
msgid "Change Resource Remap Language"
@@ -7406,17 +7528,13 @@ msgstr "Ustawienia projektu (project.godot)"
msgid "General"
msgstr "Ogólne"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr "Właściwość:"
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr "Nadpisz dla..."
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Editor must be restarted for changes to take effect"
-msgstr ""
+msgstr "Edytor musi zostać zrestartowany, by zmiany miały efekt"
#: editor/project_settings_editor.cpp
msgid "Input Map"
@@ -7432,7 +7550,7 @@ msgstr "Akcja"
#: editor/project_settings_editor.cpp
msgid "Deadzone"
-msgstr ""
+msgstr "Martwa strefa"
#: editor/project_settings_editor.cpp
msgid "Device:"
@@ -7539,14 +7657,9 @@ msgid "Pick a Node"
msgstr "Wybierz węzeł"
#: editor/property_editor.cpp
-#, fuzzy
msgid "Bit %d, val %d."
msgstr "Bit %d, wartość %d."
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr "Właściwości:"
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr "Wybierz właściwość"
@@ -7569,50 +7682,44 @@ msgstr ""
"Nie można załadować przekonwertowanego obrazka używając narzędzia PVRTC:"
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Batch Rename"
-msgstr "Zmień nazwę"
+msgstr "Grupowa zmiana nazwy"
#: editor/rename_dialog.cpp
msgid "Prefix"
-msgstr ""
+msgstr "Przedrostek"
#: editor/rename_dialog.cpp
msgid "Suffix"
-msgstr ""
+msgstr "Przyrostek"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Advanced options"
-msgstr "Opcje przyciÄ…gania"
+msgstr "Opcje zaawansowane"
#: editor/rename_dialog.cpp
msgid "Substitute"
-msgstr ""
+msgstr "Substytut"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node name"
-msgstr "Nazwa węzła:"
+msgstr "Nazwa węzła"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
-msgstr ""
+msgstr "Nazwa rodzica węzła, jeśli dostępna"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node type"
-msgstr "Znajdź typ węzła"
+msgstr "Typ węzła"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Current scene name"
-msgstr "Aktualna scena"
+msgstr "Nazwa aktualnej sceny"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Root node name"
-msgstr "Nazwa węzła:"
+msgstr "Nazwa korzenia"
#: editor/rename_dialog.cpp
msgid ""
@@ -7626,40 +7733,40 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid "If set the counter restarts for each group of child nodes"
-msgstr ""
+msgstr "Gdy ustawione, licznik restartuje dla każdej grupy węzłów potomnych"
#: editor/rename_dialog.cpp
msgid "Initial value for the counter"
-msgstr ""
+msgstr "Początkowa wartość dla licznika"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Step"
-msgstr "Krok:"
+msgstr "Krok"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
-msgstr ""
+msgid "Amount by which counter is incremented for each node"
+msgstr "Liczba, o którą licznik jest zwiększany dla każdego węzła"
#: editor/rename_dialog.cpp
msgid "Padding"
-msgstr ""
+msgstr "Wyrównanie"
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
+"Minimalna liczba cyfr dla licznika.\n"
+"Brakujące cyfry są wyrównywane zerami poprzedzającymi."
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Regular Expressions"
-msgstr "Zmień wyrażenie"
+msgstr "Wyrażenia regularne"
#: editor/rename_dialog.cpp
#, fuzzy
msgid "Post-Process"
-msgstr "Skrypt do wywołania po imporcie:"
+msgstr "Post-Process"
#: editor/rename_dialog.cpp
msgid "Keep"
@@ -7667,32 +7774,29 @@ msgstr "Bez zmian"
#: editor/rename_dialog.cpp
msgid "CamelCase to under_scored"
-msgstr ""
+msgstr "CamelCase na under_scored"
#: editor/rename_dialog.cpp
msgid "under_scored to CamelCase"
-msgstr ""
+msgstr "under_scored na CamelCase"
#: editor/rename_dialog.cpp
msgid "Case"
-msgstr ""
+msgstr "Notacja"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Lowercase"
-msgstr "Małe Litery"
+msgstr "Na małe litery"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Uppercase"
-msgstr "Wielkie Litery"
+msgstr "Na wielkie litery"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Reset"
-msgstr "Wyzeruj przybliżenie"
+msgstr "Resetuj"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr "Błąd"
@@ -7748,9 +7852,12 @@ msgstr ""
"Nie można utworzyć sceny '%s' ponieważ obecna scena jest jednym z jej wezłów."
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Instance Scene(s)"
-msgstr "Instancja Scen(y)"
+msgstr "Dodaj instancjÄ™ sceny"
+
+#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "Dodaj instancjÄ™ sceny"
#: editor/scene_tree_dock.cpp
msgid "Clear Script"
@@ -7761,12 +7868,10 @@ msgid "This operation can't be done on the tree root."
msgstr "Nie można wykonać tej operacji na głównym węźle drzewa."
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Move Node In Parent"
-msgstr "Przenieś węzeł w nadrzędny"
+msgstr "Przenieś węzeł w nadrzędnym"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Move Nodes In Parent"
msgstr "Przenieś węzły w nadrzędnym"
@@ -7791,6 +7896,14 @@ msgid "Save New Scene As..."
msgstr "Zapisz nowÄ… scenÄ™ jako ..."
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+"Wyłączenie \"edytowalnej instancji\" sprawi, że wszystkie właściwości węzła "
+"zostaną przywrócone do domyślnych."
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr "Edytowalne dzieci"
@@ -7799,34 +7912,28 @@ msgid "Load As Placeholder"
msgstr "Wczytaj jako zastępczy"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make Local"
-msgstr "Uczyń lokalnym"
+msgstr "Zrób lokalne"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "Utwórz węzeł"
+msgstr "Utwórz korzeń:"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "2D Scene"
-msgstr "Scena"
+msgstr "Scena 2D"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "3D Scene"
-msgstr "Scena"
+msgstr "Scena 3D"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "User Interface"
-msgstr "Wyczyść dziedziczenie"
+msgstr "Interfejs użytkownika"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Custom Node"
-msgstr "Wytnij Węzły"
+msgstr "Inny węzeł"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
@@ -7869,6 +7976,10 @@ msgid "Clear Inheritance"
msgstr "Wyczyść dziedziczenie"
#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr "Otwórz dokumentację"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr "Usuń węzeł (węzły)"
@@ -7877,17 +7988,16 @@ msgid "Add Child Node"
msgstr "Dodaj węzeł"
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
-msgstr "Dodaj instancje sceny"
-
-#: editor/scene_tree_dock.cpp
msgid "Change Type"
msgstr "Zmień typ"
#: editor/scene_tree_dock.cpp
-#, fuzzy
+msgid "Extend Script"
+msgstr "Rozszerz skrypt"
+
+#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
-msgstr "To ma sens!"
+msgstr "Zmień na korzeń sceny"
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
@@ -7899,7 +8009,7 @@ msgstr "Zapisz gałąź jako scenę"
#: editor/scene_tree_dock.cpp
msgid "Copy Node Path"
-msgstr "Skopiuj Ścieżkę"
+msgstr "Skopiuj ścieżkę węzła"
#: editor/scene_tree_dock.cpp
msgid "Delete (No Confirm)"
@@ -7914,7 +8024,7 @@ msgid ""
"Instance a scene file as a Node. Creates an inherited scene if no root node "
"exists."
msgstr ""
-"Stwórz instancję sceny jako węzeł. Tworzy dziedziczącą scenę jeśli węzeł "
+"Dodaj instancję sceny jako węzeł. Tworzy dziedziczącą scenę jeśli węzeł "
"główny nie istnieje."
#: editor/scene_tree_dock.cpp
@@ -7938,7 +8048,6 @@ msgid "Clear Inheritance? (No Undo!)"
msgstr "Wyczyścić dziedziczenie? (Nie można cofnąć!)"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Toggle Visible"
msgstr "Przełącz widoczność"
@@ -7947,12 +8056,11 @@ msgid "Node configuration warning:"
msgstr "Ostrzeżenie konfiguracji węzła:"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node has connection(s) and group(s).\n"
"Click to show signals dock."
msgstr ""
-"Węzeł posiada połączenia i grupy\n"
+"Węzeł posiada połączenie(a) i grupę(y).\n"
"Kliknij, aby wyświetlić panel sygnałów."
#: editor/scene_tree_editor.cpp
@@ -7972,27 +8080,24 @@ msgstr ""
"Kliknij, aby wyświetlić panel grup."
#: editor/scene_tree_editor.cpp editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script"
msgstr "Otwórz skrypt"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node is locked.\n"
"Click to unlock it."
msgstr ""
"Węzeł jest zablokowany.\n"
-"Kliknij by odblokować"
+"Kliknij, by go odblokować."
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Children are not selectable.\n"
"Click to make selectable."
msgstr ""
-"Dziecko nie jest możliwe do zaznaczenia.\n"
-"Kliknij by móc zaznaczyć"
+"Dzieci nie są możliwe do zaznaczenia.\n"
+"Kliknij, by móc zaznaczyć."
#: editor/scene_tree_editor.cpp
msgid "Toggle Visibility"
@@ -8003,6 +8108,8 @@ msgid ""
"AnimationPlayer is pinned.\n"
"Click to unpin."
msgstr ""
+"AnimationPlayer jest przypięty.\n"
+"Kliknij, by odpiąć."
#: editor/scene_tree_editor.cpp
msgid "Invalid node name, the following characters are not allowed:"
@@ -8041,15 +8148,18 @@ msgid "N/A"
msgstr "N/A"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script/Choose Location"
-msgstr "Otwórz edytor skryptów"
+msgstr "Otwórz skrypt/Wybierz lokację"
#: editor/script_create_dialog.cpp
msgid "Path is empty"
msgstr "Ścieżka jest pusta"
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr "Nazwa pliku jest pusta"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr "Ścieżka nie jest lokalna"
@@ -8138,20 +8248,8 @@ msgid "Bytes:"
msgstr "Bajty:"
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr "Ostrzeżenie"
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr "Błąd:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr "Źródło:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
-msgstr "Funkcja:"
+msgid "Stack Trace"
+msgstr "Åšlad stosu"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8182,18 +8280,6 @@ msgid "Stack Frames"
msgstr "Ramki stosu"
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr "Zmienna"
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr "Błędy:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr "Śledzenie stosu (jeśli dotyczy):"
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr "Profiler"
@@ -8203,7 +8289,7 @@ msgstr "Monitor"
#: editor/script_editor_debugger.cpp
msgid "Value"
-msgstr "Value"
+msgstr "Wartość"
#: editor/script_editor_debugger.cpp
msgid "Monitors"
@@ -8251,7 +8337,7 @@ msgstr "Typ klikniętej kontrolki:"
#: editor/script_editor_debugger.cpp
msgid "Live Edit Root:"
-msgstr ""
+msgstr "Korzeń edycji:"
#: editor/script_editor_debugger.cpp
msgid "Set From Tree"
@@ -8271,7 +8357,7 @@ msgstr "Zmień promień światła"
#: editor/spatial_editor_gizmos.cpp
msgid "Change AudioStreamPlayer3D Emission Angle"
-msgstr ""
+msgstr "Zmień kąt emisji węzła AudioStreamPlayer3D"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Camera FOV"
@@ -8283,11 +8369,11 @@ msgstr "Zmień rozmiar kamery"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Notifier AABB"
-msgstr ""
+msgstr "Zmień AABB powiadamiacza"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Particles AABB"
-msgstr ""
+msgstr "Zmień AABB cząsteczek"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Probe Extents"
@@ -8310,38 +8396,32 @@ msgid "Change Capsule Shape Height"
msgstr "Zmień wysokość kształtu kapsuły"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Radius"
-msgstr "Zmień średnicę Capsule Shape"
+msgstr "Zmień promień kształtu cylindra"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Height"
-msgstr "Zmień wysokość kształtu kapsuły"
+msgstr "Zmień wysokość kształtu cylindra"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Ray Shape Length"
msgstr "Zmień długość Ray Shape"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Radius"
-msgstr "Zmień promień światła"
+msgstr "Zmień promień cylindra"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Height"
-msgstr "Zmień wysokość kształtu kapsuły"
+msgstr "Zmień wysokość cylindra"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Inner Radius"
-msgstr "Zmień promień Sphere Shape"
+msgstr "Zmień wewnętrzny promień torusa"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Outer Radius"
-msgstr "Zmień promień światła"
+msgstr "Zmień zewnętrzny promień torusa"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select the dynamic library for this entry"
@@ -8352,9 +8432,8 @@ msgid "Select dependencies of the library for this entry"
msgstr "Zaznacz zależności biblioteki dla tego pola"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
-#, fuzzy
msgid "Remove current entry"
-msgstr "Usuń punkt krzywej"
+msgstr "Usuń aktualny wpis"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Double click to create a new entry"
@@ -8397,8 +8476,9 @@ msgid "GDNative"
msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
-msgstr "argument kroku wynosi zero!"
+#, fuzzy
+msgid "Step argument is zero!"
+msgstr "Argument kroku wynosi zero!"
#: modules/gdscript/gdscript_functions.cpp
msgid "Not a script with an instance"
@@ -8431,21 +8511,19 @@ msgstr "Niepoprawna instancja słownika (niepoprawne podklasy)"
#: modules/gdscript/gdscript_functions.cpp
msgid "Object can't provide a length."
-msgstr ""
+msgstr "Obiekt nie może podać długości."
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Next Plane"
-msgstr "Następna zakładka"
+msgstr "Następna płaszczyzna"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Previous Plane"
-msgstr "Poprzednia zakładka"
+msgstr "Poprzednia płaszczyzna"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Plane:"
-msgstr ""
+msgstr "Płaszczyzna:"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Next Floor"
@@ -8464,9 +8542,8 @@ msgid "GridMap Delete Selection"
msgstr "GridMap Usuń zaznaczenie"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Fill Selection"
-msgstr "GridMap Usuń zaznaczenie"
+msgstr "GridMap Wypełnij zaznaczenie"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Duplicate Selection"
@@ -8521,44 +8598,39 @@ msgstr "Kursor Obróć Z"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Back Rotate X"
-msgstr ""
+msgstr "Kursor Obróć w tył X"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Back Rotate Y"
-msgstr ""
+msgstr "Kursor Obróć w tył Y"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Back Rotate Z"
-msgstr ""
+msgstr "Kursor Obróć w tył Z"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Clear Rotation"
-msgstr ""
+msgstr "Kursor Wyczyść obrót"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Create Area"
-msgstr "Tworzenie obszaru"
+msgstr "Utwórz obszar"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Create Exterior Connector"
-msgstr "Utwórz nowy projekt"
+msgstr "Utwórz łącznik zewnętrzny"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Erase Area"
msgstr "Usuń obszar"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Clear Selection"
-msgstr "Wyczyść zaznaczenie"
+msgstr "Wyczyść zaznaczone"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Fill Selection"
-msgstr "Wszystkie zaznaczenia"
+msgstr "Wypełnij zaznaczone"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Settings"
@@ -8621,9 +8693,8 @@ msgid "Warnings"
msgstr "Ostrzeżenia"
#: modules/mono/editor/mono_bottom_panel.cpp
-#, fuzzy
msgid "View log"
-msgstr "Pokaż pliki"
+msgstr "Pokaż logi"
#: modules/mono/mono_gd/gd_mono_utils.cpp
msgid "End of inner exception stack trace"
@@ -8631,13 +8702,8 @@ msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
#, fuzzy
-msgid "Bake!"
-msgstr "NanieÅ›!"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-#, fuzzy
-msgid "Bake the navigation mesh."
-msgstr "NanieÅ› siatkÄ™ nawigacji.\n"
+msgid "Bake NavMesh"
+msgstr "Wypiecz NavMesh"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8875,9 +8941,8 @@ msgid "Change Input Value"
msgstr "Zmień wartość wejściową"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Can't copy the function node."
-msgstr "Nie można skopiować funkcji węzła."
+msgstr "Nie można skopiować węzła funkcji."
#: modules/visual_script/visual_script_editor.cpp
msgid "Clipboard is empty!"
@@ -8912,6 +8977,10 @@ msgid "Base Type:"
msgstr "Typ bazowy:"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "Członkowie:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "Dostępne węzły:"
@@ -8948,9 +9017,8 @@ msgid "Paste Nodes"
msgstr "Wklej węzły"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
-msgstr "Członkowie"
+msgstr "Edytuj członka"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Input type not iterable: "
@@ -8965,9 +9033,8 @@ msgid "Iterator became invalid: "
msgstr "Iterator stał się nieprawidłowy: "
#: modules/visual_script/visual_script_func_nodes.cpp
-#, fuzzy
msgid "Invalid index property name."
-msgstr "Nieprawidłowa nazwa klasy bazowej"
+msgstr "Nieprawidłowa nazwa właściwości indeksowej."
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Base object is not a Node!"
@@ -9011,18 +9078,16 @@ msgstr ""
"całkowitą (seq out), lub tekstową (error)."
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Search VisualScript"
-msgstr "Usuń węzeł VisualScript"
+msgstr "Przeszukaj VisualScript"
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
-msgid "Get"
-msgstr "Pobierz"
+msgid "Get %s"
+msgstr "Przyjmij %s"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
-msgstr ""
+msgid "Set %s"
+msgstr "Ustaw %s"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -9075,16 +9140,15 @@ msgstr ""
"przy czym pozostałe zostaną zignorowane."
#: scene/2d/collision_object_2d.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
"define its shape."
msgstr ""
-"Ten węzeł nie posiada podwezła, który definiował by jego kształt, więc nie "
-"może wchodzić w interakcje.\n"
-"Powinieneś dodać węzeł \"CollisionShape2D\" lub \"CollisionPolygon2D\" jako "
-"podwęzeł aby zdefiniować kształt."
+"Ten węzeł nie posiada kształtu, więc nie może kolidować, czy wchodzić w "
+"interakcje z innymi obiektami.\n"
+"Rozważ dodanie węzła CollisionShape2D lub CollisionPolygon2D jako podrzędny, "
+"aby zdefiniować kształt."
#: scene/2d/collision_polygon_2d.cpp
msgid ""
@@ -9118,6 +9182,14 @@ msgstr ""
"Zasób shape jest niezbędny do działania CollisionPolygon2D. Proszę utworzyć "
"zasób shape!"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+"Animacja CPUParticles2D wymaga użycia CanvasItemMaterial z włączonym "
+"\"Particles Animation\"."
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -9167,6 +9239,14 @@ msgstr ""
"Nie przypisano materiału do przetwarzania cząsteczek, więc zmiany nie będą "
"widoczne."
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+"Animacja Particles2D wymaga użycia CanvasItemMaterial z włączonym "
+"\"Particles Animation\"."
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr "PathFollow2D zadziała tylko wtedy, gdy będzie dzieckiem węzeł Path2D."
@@ -9188,16 +9268,20 @@ msgstr "Żeby zadziałało, pole Path musi wskazywać na istniejący węzeł Nod
#: scene/2d/skeleton_2d.cpp
msgid "This Bone2D chain should end at a Skeleton2D node."
-msgstr ""
+msgstr "Ten łańcuch kości 2D powinien się kończyć na węźle Skeleton2D."
#: scene/2d/skeleton_2d.cpp
msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
msgstr ""
+"Węzeł Bone2D działa tylko z węzłem Skeleton2D lub innym Bone2D jako "
+"nadrzędnym węzłem."
#: scene/2d/skeleton_2d.cpp
msgid ""
"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
msgstr ""
+"Tej kości brakuje odpowiedniej pozy spoczynkowej. Pójdź do węzła Skeleton2D "
+"i ustaw jÄ…."
#: scene/2d/visibility_notifier_2d.cpp
msgid ""
@@ -9212,9 +9296,8 @@ msgid "ARVRCamera must have an ARVROrigin node as its parent"
msgstr "ARVRCamera musi dziedziczyć po węźle ARVROrigin"
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid "ARVRController must have an ARVROrigin node as its parent"
-msgstr "ARVRController musi posiadać węzeł ARVROrigin jako rodzica"
+msgstr "ARVRController musi posiadać węzeł ARVROrigin jako nadrzędny"
#: scene/3d/arvr_nodes.cpp
msgid ""
@@ -9225,15 +9308,16 @@ msgstr ""
"przypisany do żadnego rzeczywistego kontrolera"
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid "ARVRAnchor must have an ARVROrigin node as its parent"
-msgstr "ARVRAnchor musi posiadać węzeł ARVROrigin jako rodzica"
+msgstr "ARVRAnchor musi posiadać węzeł ARVROrigin jako nadrzędny"
#: scene/3d/arvr_nodes.cpp
msgid ""
"The anchor id must not be 0 or this anchor will not be bound to an actual "
"anchor"
msgstr ""
+"ID kotwicy nie może być 0, bo inaczej ta kotwica nie będzie przypisana do "
+"rzeczywistej kotwicy"
#: scene/3d/arvr_nodes.cpp
msgid "ARVROrigin requires an ARVRCamera child node"
@@ -9265,16 +9349,15 @@ msgid "Lighting Meshes: "
msgstr "Oświetlanie siatek: "
#: scene/3d/collision_object.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape or CollisionPolygon as a child to define "
"its shape."
msgstr ""
-"Ten węzeł nie posiada podwezła, który definiowałby jego kształt, więc nie "
-"może wchodzić w interakcje z przestrzenią.\n"
-"Powinieneś dodać węzeł \"CollisionShape2D\" lub \"CollisionPolygon2D\" jako "
-"jego podwęzeł aby zdefiniować jego kształt."
+"Ten węzeł nie posiada kształtu, więc nie może kolidować, czy wchodzić w "
+"interakcje z innymi obiektami.\n"
+"Rozważ dodanie węzła CollisionShape lub CollisionPolygon jako podrzędny, aby "
+"zdefiniować kształt."
#: scene/3d/collision_polygon.cpp
msgid ""
@@ -9308,6 +9391,19 @@ msgstr ""
"Kształt musi być określony dla CollisionShape, aby spełniał swoje zadanie. "
"Utwórz zasób typu CollisionShape w odpowiednim polu obiektu!"
+#: scene/3d/cpu_particles.cpp
+#, fuzzy
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr "Nic nie jest widoczne, bo nie została przypisana żadna siatka."
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+"Animacja CPUParticles wymaga użycia SpatialMaterial z włączonym \"Billboard "
+"Particles\"."
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -9330,6 +9426,31 @@ msgstr ""
msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+"Nic nie jest widoczne, bo siatki nie zostały przypisane do kolejki rysowania."
+
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+"Animacja Particles wymaga użycia SpatialMaterial z włączonym \"Billboard "
+"Particles\"."
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr "PathFollow działa tylko, gdy jest węzłem podrzędnym Path."
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr "OrientedPathFollow działa tylko, gdy jest węzłem podrzędnym Path."
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+"OrientedPathFollow wymaga włączonych wektorów w górę w jego nadrzędnym Path."
#: scene/3d/physics_body.cpp
#, fuzzy
@@ -9348,7 +9469,7 @@ msgstr "Pole Path musi wskazywać na węzeł Spatial."
#: scene/3d/scenario_fx.cpp
msgid "WorldEnvironment needs an Environment resource."
-msgstr ""
+msgstr "WorldEnvironment wymaga zasobu Environment."
#: scene/3d/scenario_fx.cpp
msgid ""
@@ -9362,20 +9483,21 @@ msgid ""
"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set "
"this environment's Background Mode to Canvas (for 2D scenes)."
msgstr ""
+"Ten WorldEnvironment jest ignorowany. Dodaj Camera (dla scen 3D) lub ustaw "
+"Background Mode tego środowiska na Canvas (dla scen 2D)."
#: scene/3d/soft_body.cpp
msgid "This body will be ignored until you set a mesh"
-msgstr ""
+msgstr "To ciało będzie ignorowane, dopóki nie ustawisz siatki"
#: scene/3d/soft_body.cpp
-#, fuzzy
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
-"Zmiany rozmiaru w RigidBody (w trybach character i rigid) zostanÄ… nadpisane "
-"przez silnik fizyki podczas działania.\n"
+"Zmiany rozmiaru dla SoftBody zostanÄ… nadpisane przez silnik fizyki podczas "
+"działania.\n"
"Zamiast tego, zmień rozmiary kształtów kolizji w węzłach podrzędnych."
#: scene/3d/sprite_3d.cpp
@@ -9396,44 +9518,45 @@ msgstr ""
#: scene/animation/animation_blend_tree.cpp
msgid "On BlendTree node '%s', animation not found: '%s'"
-msgstr ""
+msgstr "W węźle BlendTree '%s', animacja nie znaleziona: '%s'"
#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "Narzędzia do animacji"
+msgstr "Animacja nie znaleziona: '%s'"
#: scene/animation/animation_tree.cpp
msgid "In node '%s', invalid animation: '%s'."
-msgstr ""
+msgstr "W węźle '%s', nieprawidłowa animacja: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "BÅÄ„D: błędna nazwa animacji!"
+msgstr "Nieprawidłowa animacja: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "Rozłącz '%s' z '%s'"
+msgstr "Nic nie podłączono do wejścia '%s' węzła '%s'."
#: scene/animation/animation_tree.cpp
msgid "A root AnimationNode for the graph is not set."
-msgstr ""
+msgstr "Korzeń dla grafu AnimationNode nie jest ustawiony."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Path to an AnimationPlayer node containing animations is not set."
-msgstr "Zaznacz węzeł AnimationPlayer w drzewie sceny aby edytować animacje."
+msgstr ""
+"Ścieżka do węzła AnimationPlayer zawierającego animacje nie jest ustawiona."
#: scene/animation/animation_tree.cpp
msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
msgstr ""
+"Ścieżka do węzła AnimationPlayer nie prowadzi do węzła AnimationPlayer."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "AnimationPlayer root is not a valid node."
-msgstr "Drzewo animacji jest wadliwe."
+msgstr "Korzeń AnimationPlayer nie jest poprawnym węzłem."
+
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
@@ -9451,10 +9574,6 @@ msgstr "Alarm!"
msgid "Please Confirm..."
msgstr "Proszę potwierdzić..."
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr "Wybierz ten Folder"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9465,6 +9584,10 @@ msgstr ""
"dowolnej funkcji popup*(). Ustawienie ich jako widocznych jest przydatne do "
"edycji, ale zostanÄ… ukryte po uruchomieniu."
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9481,13 +9604,12 @@ msgid "(Other)"
msgstr "Inne"
#: scene/main/scene_tree.cpp
-#, fuzzy
msgid ""
"Default Environment as specified in Project Settings (Rendering -> "
"Environment -> Default Environment) could not be loaded."
msgstr ""
-"Domyślne Środowisko określone w Ustawieniach Projektu (Renderowanie -> "
-"Viewport -> Domyślne Środowisko) nie mogło zostać załadowane."
+"Domyślne środowisko określone w Ustawieniach Projektu (Renderowanie -> "
+"Environment -> Default Environment) nie mogło zostać załadowane."
#: scene/main/viewport.cpp
msgid ""
@@ -9518,31 +9640,233 @@ msgid "Invalid font size."
msgstr "Niepoprawny rozmiar fonta."
#: scene/resources/visual_shader.cpp
-#, fuzzy
msgid "Input"
-msgstr "Dodaj Wejście"
-
-#: scene/resources/visual_shader.cpp
-#, fuzzy
-msgid "None"
-msgstr "<żaden>"
+msgstr "Wejście"
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for shader."
-msgstr "Wadliwe źródło!"
+msgstr "Niewłaściwe źródło dla shadera."
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
-msgstr ""
+msgstr "Przypisanie do funkcji."
#: servers/visual/shader_language.cpp
msgid "Assignment to uniform."
-msgstr ""
+msgstr "Przypisanie do uniformu."
#: servers/visual/shader_language.cpp
msgid "Varyings can only be assigned in vertex function."
-msgstr ""
+msgstr "Varying może być przypisane tylko w funkcji wierzchołków."
+
+#~ msgid "Split point with itself."
+#~ msgstr "Podziel punkt ze sobÄ…."
+
+#~ msgid "Split can't form an existing edge."
+#~ msgstr "Podział nie może uformować istniejącej krawędzi."
+
+#~ msgid "Split already exists."
+#~ msgstr "Podział już istnieje."
+
+#~ msgid "Add Split"
+#~ msgstr "Dodaj podział"
+
+#~ msgid "Invalid Split: "
+#~ msgstr "Niepoprawny podział: "
+
+#~ msgid "Remove Split"
+#~ msgstr "Usuń podział"
+
+#~ msgid "Poly"
+#~ msgstr "WielokÄ…t"
+
+#~ msgid "Splits"
+#~ msgstr "Podziały"
+
+#, fuzzy
+#~ msgid "Connect two points to make a split."
+#~ msgstr "Połącz dwa punkty, by utworzyć podział."
+
+#, fuzzy
+#~ msgid "Select a split to erase it."
+#~ msgstr "Wybierz podział, by go usunąć."
+
+#~ msgid "No name provided"
+#~ msgstr "Nie podano nazwy"
+
+#~ msgid "Add Node.."
+#~ msgstr "Dodaj węzeł..."
+
+#~ msgid "Create from scene?"
+#~ msgstr "Utwórz ze sceny?"
+
+#~ msgid "Create Poly"
+#~ msgstr "Utwórz Polygon"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "Utwórz nowy wielokąt od zera"
+
+#~ msgid "Zoom out"
+#~ msgstr "Pomniejsz"
+
+#~ msgid "Zoom in"
+#~ msgstr "Powiększ"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "Stwórz Poly3D"
+
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "Brak zasobu OccluderPolygon2D w tym węźle.\n"
+#~ "Stworzyć i przypisać nowy?"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "LMB: Przesuń Punkt."
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "Ctrl + LPM: Podziału segmentu."
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "RMB: Wymaż Punkt."
+
+#~ msgid "New TextFile"
+#~ msgstr "Nowy plik tekstowy"
+
+#~ msgid "Save Theme As"
+#~ msgstr "Zapisz motyw jako"
+
+#~ msgid "<None>"
+#~ msgstr "<żaden>"
+
+#~ msgid ""
+#~ "Select sub-tile to use as icon, this will be also used on invalid "
+#~ "autotile bindings."
+#~ msgstr ""
+#~ "Wybierz pod-kafelek do użycia jako ikona. Zostanie on użyty również do "
+#~ "niewłaściwych ustawień autokafelków."
+
+#~ msgid "Zoom:"
+#~ msgstr "Powiększenie:"
+
+#~ msgid "Are you sure you want to remove all connections from the \""
+#~ msgstr "Na pewno chcesz usunąć wszystkie połączenia z \""
+
+#~ msgid "Class List:"
+#~ msgstr "Lista klas:"
+
+#~ msgid "Search Classes"
+#~ msgstr "Przeszukaj klasy"
+
+#~ msgid "Public Methods"
+#~ msgstr "Metody publiczne"
+
+#~ msgid "Public Methods:"
+#~ msgstr "Metody publiczne:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "Elementy motywu interfejsu"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "Elementy motywu GUI:"
+
+#~ msgid "Property: "
+#~ msgstr "Właściwość: "
+
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "Ustaw status folderu jako Ulubiony."
+
+#~ msgid "Show current scene file."
+#~ msgstr "Pokaż plik aktualnej sceny."
+
+#~ msgid "Enter tree-view."
+#~ msgstr "Wejdź w widok drzewa."
+
+#~ msgid "Whole words"
+#~ msgstr "Całe wyrazy"
+
+#~ msgid "Match case"
+#~ msgstr "Uwzględnij wielkość liter"
+
+#~ msgid "Filter: "
+#~ msgstr "Filtr: "
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#~ msgid "Show In File System"
+#~ msgstr "Pokaż w systemie plików"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "Szukaj w hierarchii klas."
+
+#, fuzzy
+#~ msgid "Search in files"
+#~ msgstr "Przeszukaj klasy"
+
+#~ msgid ""
+#~ "Built-in scripts can only be edited when the scene they belong to is "
+#~ "loaded"
+#~ msgstr ""
+#~ "Wbudowane skrypty mogą być edytowane tylko po załadowaniu sceny, do "
+#~ "której należą"
+
+#, fuzzy
+#~ msgid "Convert To Uppercase"
+#~ msgstr "Wielkie litery"
+
+#~ msgid "Convert To Lowercase"
+#~ msgstr "Małe litery"
+
+#, fuzzy
+#~ msgid "Snap To Floor"
+#~ msgstr "PrzyciÄ…gaj do siatki"
+
+#~ msgid "Rotate 0 degrees"
+#~ msgstr "Obróć o 0 stopni"
+
+#~ msgid "Rotate 90 degrees"
+#~ msgstr "Obróć o 90 stopni"
+
+#~ msgid "Rotate 180 degrees"
+#~ msgstr "Obróć o 180 stopni"
+
+#~ msgid "Rotate 270 degrees"
+#~ msgstr "Obróć o 270 stopni"
+
+#~ msgid "Warning"
+#~ msgstr "Ostrzeżenie"
+
+#~ msgid "Error:"
+#~ msgstr "Błąd:"
+
+#~ msgid "Source:"
+#~ msgstr "Źródło:"
+
+#~ msgid "Function:"
+#~ msgstr "Funkcja:"
+
+#~ msgid "Variable"
+#~ msgstr "Zmienna"
+
+#~ msgid "Errors:"
+#~ msgstr "Błędy:"
+
+#~ msgid "Stack Trace (if applicable):"
+#~ msgstr "Śledzenie stosu (jeśli dotyczy):"
+
+#, fuzzy
+#~ msgid "Bake!"
+#~ msgstr "NanieÅ›!"
+
+#, fuzzy
+#~ msgid "Bake the navigation mesh."
+#~ msgstr "NanieÅ› siatkÄ™ nawigacji.\n"
+
+#, fuzzy
+#~ msgid "Get"
+#~ msgstr "Pobierz"
#~ msgid "Change Scalar Constant"
#~ msgstr "Zmień wartość stałej skalarnej"
@@ -9718,9 +10042,6 @@ msgstr ""
#~ msgid "Run Script"
#~ msgstr "Uruchom skrypt"
-#~ msgid "Save the currently edited resource."
-#~ msgstr "Zapisz aktualnie edytowany zasób."
-
#~ msgid "Stop Profiling"
#~ msgstr "Zatrzymaj profilowanie"
@@ -10003,9 +10324,6 @@ msgstr ""
#~ msgid "Could not save atlas subtexture:"
#~ msgstr "Nie udało się zapisać tekstury atlasu:"
-#~ msgid "Exporting for %s"
-#~ msgstr "Exportowanie do %s"
-
#~ msgid "Setting Up..."
#~ msgstr "Konfigurowanie ..."
@@ -10108,9 +10426,6 @@ msgstr ""
#~ msgid "Source Font:"
#~ msgstr "Źródło fontu:"
-#~ msgid "Source Font Size:"
-#~ msgstr "Wielkość oryginalna fontu:"
-
#~ msgid "Dest Resource:"
#~ msgstr "Zasób docelowy:"
@@ -10186,9 +10501,6 @@ msgstr ""
#~ msgid "Start(s)"
#~ msgstr "Start"
-#~ msgid "Filters"
-#~ msgstr "Filtry"
-
#~ msgid "Source path is empty."
#~ msgstr "Ścieżka źródłowa jest pusta."
@@ -10440,15 +10752,9 @@ msgstr ""
#~ msgid "Stereo"
#~ msgstr "Stereo"
-#~ msgid "Pitch"
-#~ msgstr "Wysokość"
-
#~ msgid "Window"
#~ msgstr "Okno"
-#~ msgid "Move Right"
-#~ msgstr "Przesuń w prawo"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "Skalowanie do %s%%."
@@ -10710,21 +11016,6 @@ msgstr ""
#~ msgid "Trim"
#~ msgstr "Przytnij"
-#~ msgid "Script Export Mode:"
-#~ msgstr "Tryb eksportu skryptów:"
-
-#~ msgid "Text"
-#~ msgstr "Tekst"
-
-#~ msgid "Compiled"
-#~ msgstr "Skompilowany"
-
-#~ msgid "Encrypted (Provide Key Below)"
-#~ msgstr "Zaszyfrowany (podaj klucz poniżej)"
-
-#~ msgid "Script Encryption Key (256-bits as hex):"
-#~ msgstr "Klucz szyfrujÄ…cy skryptu (256-bit jako hex):"
-
#~ msgid "Export Project PCK"
#~ msgstr "Eksport projektu PCK"
@@ -10734,9 +11025,6 @@ msgstr ""
#~ msgid "Project Export"
#~ msgstr "Eksport projektu"
-#~ msgid "Export Preset:"
-#~ msgstr "Szablon eksportu:"
-
#~ msgid "Global"
#~ msgstr "Globalne"
diff --git a/editor/translations/pr.po b/editor/translations/pr.po
index 1ea7dca649..b956a62e9a 100644
--- a/editor/translations/pr.po
+++ b/editor/translations/pr.po
@@ -1,23 +1,24 @@
# Pirate translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
-#
# Calum Knott <calum@calumk.com>, 2017.
# Zion Nimchuk <zionnimchuk@gmail.com>, 2016-2017.
-#
+# Allan Nordhøy <epost@anotheragency.no>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2017-11-23 14:48+0000\n"
-"Last-Translator: Calum Knott <calum@calumk.com>\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:42+0100\n"
+"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
"Language-Team: Pirate <https://hosted.weblate.org/projects/godot-engine/"
"godot/pr/>\n"
"Language: pr\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.18-dev\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -27,7 +28,7 @@ msgstr ""
"constants!"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr "Nah enough bytes fer decodin' bytes, or ye got th' wrong ship."
@@ -265,7 +266,6 @@ msgstr ""
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -395,8 +395,7 @@ msgstr ""
msgid "Scale From Cursor"
msgstr ""
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr ""
@@ -410,11 +409,11 @@ msgid "Delete Selection"
msgstr "Yar, Blow th' Selected Down!"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+msgid "Go to Next Step"
msgstr ""
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+msgid "Go to Previous Step"
msgstr ""
#: editor/animation_track_editor.cpp
@@ -517,11 +516,11 @@ msgstr ""
msgid "Replaced %d occurrence(s)."
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr ""
@@ -537,15 +536,19 @@ msgstr ""
msgid "Selection Only"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr ""
@@ -554,10 +557,10 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Zoom:"
+msgid "Font Size:"
msgstr ""
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr ""
@@ -588,6 +591,7 @@ msgstr ""
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -667,7 +671,7 @@ msgid "Edit Connection: "
msgstr "Slit th' Node"
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -715,23 +719,20 @@ msgid "Recent:"
msgstr ""
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr ""
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr ""
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr ""
@@ -766,8 +767,7 @@ msgid "Resource"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr ""
@@ -788,9 +788,10 @@ msgid "Search Replacement Resource:"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -820,7 +821,7 @@ msgid "Error loading:"
msgstr ""
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+msgid "Load failed due to missing dependencies:"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -879,14 +880,6 @@ msgstr ""
msgid "Thanks from the Godot community!"
msgstr ""
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr ""
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr ""
@@ -976,7 +969,7 @@ msgid "Uncompressing Assets"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+msgid "Package installed successfully!"
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1061,8 +1054,7 @@ msgid "Bus options"
msgstr ""
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr ""
@@ -1222,7 +1214,7 @@ msgid "Add AutoLoad"
msgstr ""
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr ""
@@ -1230,8 +1222,8 @@ msgstr ""
msgid "Node Name:"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr ""
@@ -1301,12 +1293,17 @@ msgid "Template file not found:"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+#, fuzzy
+msgid "Select Current Folder"
+msgstr "Slit th' Node"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
#, fuzzy
-msgid "Select Current Folder"
+msgid "Select This Folder"
msgstr "Slit th' Node"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1314,12 +1311,12 @@ msgid "Copy Path"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+msgid "Show in File Manager"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1355,7 +1352,8 @@ msgid "Open a File or Directory"
msgstr ""
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr ""
@@ -1413,8 +1411,7 @@ msgstr ""
msgid "Preview:"
msgstr ""
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr ""
@@ -1430,24 +1427,11 @@ msgstr ""
msgid "(Re)Importing Assets"
msgstr ""
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr ""
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr ""
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr ""
@@ -1464,29 +1448,30 @@ msgid "Brief Description:"
msgstr ""
#: editor/editor_help.cpp
-#, fuzzy
-msgid "Members"
-msgstr "th' Members:"
-
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "th' Members:"
+msgid "Properties"
+msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
+msgid "Properties:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods:"
+msgid "Methods"
msgstr ""
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
+msgid "Methods:"
msgstr ""
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr ""
+#, fuzzy
+msgid "Theme Properties"
+msgstr "Paste yer Node"
+
+#: editor/editor_help.cpp
+#, fuzzy
+msgid "Theme Properties:"
+msgstr "Paste yer Node"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1515,8 +1500,14 @@ msgid "Constants:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Description"
-msgstr ""
+#, fuzzy
+msgid "Class Description"
+msgstr "Yar, Blow th' Selected Down!"
+
+#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
+msgstr "Yar, Blow th' Selected Down!"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1530,11 +1521,11 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Properties"
+msgid "Property Descriptions"
msgstr ""
#: editor/editor_help.cpp
-msgid "Property Description:"
+msgid "Property Descriptions:"
msgstr ""
#: editor/editor_help.cpp
@@ -1544,11 +1535,11 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Methods"
+msgid "Method Descriptions"
msgstr ""
#: editor/editor_help.cpp
-msgid "Method Description:"
+msgid "Method Descriptions:"
msgstr ""
#: editor/editor_help.cpp
@@ -1557,11 +1548,54 @@ msgid ""
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-#: editor/editor_inspector.cpp
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "Yer signals:"
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Member Type"
+msgstr "th' Members:"
+
+#: editor/editor_help_search.cpp
+msgid "Class"
msgstr ""
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr "Set"
@@ -1595,6 +1629,11 @@ msgstr ""
msgid "Error saving resource!"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr ""
@@ -1651,10 +1690,20 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr ""
@@ -1882,6 +1931,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1922,6 +1977,12 @@ msgstr ""
msgid "Default"
msgstr ""
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+#, fuzzy
+msgid "Show in FileSystem"
+msgstr "Rename Variable"
+
#: editor/editor_node.cpp
msgid "Play This Scene"
msgstr ""
@@ -2004,7 +2065,7 @@ msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2033,7 +2094,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -2057,7 +2118,7 @@ msgstr ""
msgid "Export"
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr ""
@@ -2071,6 +2132,7 @@ msgid "Quit to Project List"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr ""
@@ -2179,10 +2241,6 @@ msgstr ""
msgid "Help"
msgstr ""
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2276,21 +2334,21 @@ msgstr ""
msgid "Disable Update Spinner"
msgstr ""
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr ""
#: editor/editor_node.cpp
-msgid "Node"
+msgid "FileSystem"
msgstr ""
#: editor/editor_node.cpp
-msgid "FileSystem"
+msgid "Inspector"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Node"
msgstr ""
#: editor/editor_node.cpp
@@ -2429,7 +2487,7 @@ msgstr ""
msgid "Physics Frame %"
msgstr ""
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr ""
@@ -2454,7 +2512,7 @@ msgstr ""
msgid "Calls"
msgstr "Call"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2466,20 +2524,44 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr ": Evil arguments: "
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr ""
@@ -2491,10 +2573,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2503,7 +2581,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr ""
@@ -2792,6 +2871,10 @@ msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr ""
#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
@@ -2829,8 +2912,8 @@ msgstr "Rename Variable"
msgid "Unable to update dependencies:"
msgstr ""
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2838,10 +2921,6 @@ msgid "Provided name contains invalid characters"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr ""
@@ -2868,28 +2947,21 @@ msgid "Duplicating folder:"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
+msgid "Open Scene(s)"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Move To..."
+msgid "Instance"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Open Scene(s)"
+msgid "Add to favorites"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Instance"
-msgstr ""
+#, fuzzy
+msgid "Remove from favorites"
+msgstr "Discharge ye' Signal"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -2899,11 +2971,19 @@ msgstr ""
msgid "View Owners..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr ""
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr ""
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -2911,6 +2991,14 @@ msgstr ""
msgid "New Resource..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr ""
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -2931,24 +3019,16 @@ msgid "Re-Scan Filesystem"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Toggle folder status as Favorite."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Show current scene file."
-msgstr "Slit th' Node"
-
-#: editor/filesystem_dock.cpp
-msgid "Instance the selected scene(s) as child of the selected node."
-msgstr ""
+msgid "Toggle split mode"
+msgstr "Toggle ye Breakpoint"
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
+msgid "Search files"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Search files"
+msgid "Instance the selected scene(s) as child of the selected node."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2957,7 +3037,7 @@ msgid ""
"Please Wait..."
msgstr ""
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr ""
@@ -2974,28 +3054,21 @@ msgid "Create Script"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Find in files"
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Find: "
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Whole words"
-msgstr ""
+#, fuzzy
+msgid "Find in Files"
+msgstr "Find ye Node Type"
#: editor/find_in_files.cpp
-msgid "Match case"
+msgid "Find:"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Folder: "
+msgid "Folder:"
msgstr ""
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Filter: "
+msgid "Filters:"
msgstr "Paste yer Node"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -3012,6 +3085,10 @@ msgid "Cancel"
msgstr ""
#: editor/find_in_files.cpp
+msgid "Find: "
+msgstr ""
+
+#: editor/find_in_files.cpp
msgid "Replace: "
msgstr ""
@@ -3033,7 +3110,7 @@ msgstr ""
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr "Yer unique name be evil."
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3170,18 +3247,15 @@ msgstr ""
msgid "Failed to load resource."
msgstr ""
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr ""
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
-msgstr ""
+#, fuzzy
+msgid "Expand All Properties"
+msgstr "Add yer Getter Property"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
-msgstr ""
+#, fuzzy
+msgid "Collapse All Properties"
+msgstr "Paste yer Node"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -3225,6 +3299,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr ""
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr ""
@@ -3286,45 +3364,46 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
-msgstr ""
+#, fuzzy
+msgid "Edit Polygon"
+msgstr "Ye be fixin' Signal:"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
-msgstr ""
+#, fuzzy
+msgid "Remove Polygon And Point"
+msgstr "Discharge ye' Function"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr ""
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr "Yar, Blow th' Selected Down!"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
#, fuzzy
-msgid "Delete points"
+msgid "Erase points."
msgstr "Yar, Blow th' Selected Down!"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3339,7 +3418,7 @@ msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Load.."
+msgid "Load..."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3368,15 +3447,9 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Yar, Blow th' Selected Down!"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "Yar, Blow th' Selected Down!"
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3415,9 +3488,8 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3453,7 +3525,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
-msgid "Add Node.."
+msgid "Add Node..."
msgstr "Add Node"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3724,8 +3796,9 @@ msgid "Connect nodes."
msgstr "Slit th' Node"
#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Remove selected node or transition"
-msgstr ""
+#, fuzzy
+msgid "Remove selected node or transition."
+msgstr "Discharge ye' Signal"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
@@ -3791,10 +3864,6 @@ msgid "Amount:"
msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr ""
@@ -3992,7 +4061,7 @@ msgstr ""
msgid "Plugins"
msgstr ""
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr ""
@@ -4119,6 +4188,10 @@ msgid "Resize CanvasItem"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
msgstr ""
@@ -4139,15 +4212,15 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom out"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom reset"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom in"
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -4179,6 +4252,11 @@ msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "Slit th' Node"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4274,6 +4352,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "Yar, Blow th' Selected Down!"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr ""
@@ -4324,6 +4407,10 @@ msgid "Show Viewport"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr ""
@@ -4392,7 +4479,16 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "Yar, Blow th' Selected Down!"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
msgstr ""
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
@@ -4497,35 +4593,9 @@ msgid "Item List Editor"
msgstr ""
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr ""
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr ""
@@ -4757,12 +4827,12 @@ msgid "Populate"
msgstr ""
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
+msgid "Generating Visibility Rect"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -4791,6 +4861,11 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr ""
@@ -4860,11 +4935,11 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Convert to CPUParticles"
+msgid "Generate AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -4889,6 +4964,10 @@ msgid "Add Point to Curve"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr ""
@@ -4916,6 +4995,10 @@ msgid "Click: Add Point"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr ""
@@ -4931,11 +5014,6 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr ""
@@ -4996,6 +5074,10 @@ msgstr "Discharge ye' Function"
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5007,81 +5089,90 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync bones"
+msgid "Sync Bones"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create UV Map"
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create Polygon & UV"
+msgid "Create UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
+msgid "Create Polygon & UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
+msgid "Create Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split already exists."
-msgstr ""
+#, fuzzy
+msgid "Remove Internal Vertex"
+msgstr "Discharge ye' Variable"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Add Split"
-msgstr "Add Signal"
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr ": Evil arguments: "
+msgid "Add Custom Polygon"
+msgstr "Ye be fixin' Signal:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Discharge ye' Signal"
+msgid "Remove Custom Polygon"
+msgstr "Discharge ye' Function"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
+msgid "Transform Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Polygon 2D UV Editor"
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UV"
+msgid "Open Polygon 2D UV editor."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Poly"
+msgid "Polygon 2D UV Editor"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Splits"
+msgid "UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Bones"
-msgstr ""
+#, fuzzy
+msgid "Points"
+msgstr "Discharge ye' Signal"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create Polygon"
-msgstr ""
+#, fuzzy
+msgid "Polygons"
+msgstr "Ye be fixin' Signal:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Bones"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Move Points"
+msgstr "Discharge ye' Signal"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
msgstr ""
@@ -5106,19 +5197,21 @@ msgid "Scale Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Select a split to erase it"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5142,6 +5235,11 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr ""
@@ -5199,22 +5297,22 @@ msgid "Paste Resource"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr ""
@@ -5244,6 +5342,10 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Error could not load file."
msgstr ""
@@ -5253,20 +5355,24 @@ msgid "Error saving file!"
msgstr "Error loading yer Calligraphy Pen."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr ""
+#, fuzzy
+msgid "Error while saving theme."
+msgstr "Blimey! I can't make th' signature object!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
-msgstr ""
+#, fuzzy
+msgid "Error Saving"
+msgstr "Error loading yer Calligraphy Pen."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr ""
+#, fuzzy
+msgid "Error importing theme."
+msgstr "Error loading yer Calligraphy Pen."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
-msgstr ""
+#, fuzzy
+msgid "Error Importing"
+msgstr "Error loading yer Calligraphy Pen."
#: editor/plugins/script_editor_plugin.cpp
msgid "New TextFile..."
@@ -5285,6 +5391,14 @@ msgid "Import Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr ""
@@ -5325,7 +5439,7 @@ msgid "File"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile"
+msgid "Open..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5342,11 +5456,7 @@ msgid "Copy Script Path"
msgstr "Forge yer Node!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+msgid "History Previous"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5359,15 +5469,15 @@ msgid "Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Reload Theme"
+msgid "Import Theme..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme"
+msgid "Reload Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
+msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5417,7 +5527,7 @@ msgid "Keep Debugger Open"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5425,10 +5535,6 @@ msgid "Open Godot online documentation"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -5463,18 +5569,9 @@ msgid "Debugger"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search results"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Search in files"
-msgstr "Rename Variable"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
+msgid "Search Results"
+msgstr "Discharge ye' Variable"
#: editor/plugins/script_text_editor.cpp
msgid "Line"
@@ -5485,6 +5582,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "Add Function"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr ""
@@ -5516,10 +5622,6 @@ msgstr ""
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5573,11 +5675,11 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5594,35 +5696,31 @@ msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr ""
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "Toggle ye Breakpoint"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr ""
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "Toggle ye Breakpoint"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in files..."
-msgstr ""
+#, fuzzy
+msgid "Find in Files..."
+msgstr "Find ye Node Type"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
-msgstr ""
+#, fuzzy
+msgid "Go to Function..."
+msgstr "Discharge ye' Function"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5714,6 +5812,15 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "Pitch"
+msgstr "Switch"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -5879,6 +5986,10 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -5980,10 +6091,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap To Floor"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Toggle Freelook"
msgstr "Toggle ye Breakpoint"
@@ -6101,6 +6208,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
msgstr ""
@@ -6215,11 +6326,16 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6385,6 +6501,11 @@ msgid "Fix Invalid Tiles"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "Yar, Blow th' Selected Down!"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6431,33 +6552,38 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "Yar, Blow th' Selected Down!"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
+msgid "Rotate left"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
+msgid "Rotate right"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Flip vertically"
msgstr ""
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Clear transform"
+msgstr "Change yer Anim Transform"
+
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr "Add Node(s) From yer Tree"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr "Discharge ye' Signal"
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6469,25 +6595,47 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "Paste yer Node"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "Yar, Blow th' Selected Down!"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "Yar, Blow th' Selected Down!"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "Discharge ye' Signal"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6495,7 +6643,12 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Discharge ye' Variable"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6505,16 +6658,27 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "Yar, Blow th' Selected Down!"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr ""
+msgstr "Slit th' Node"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "Yar, Blow th' Selected Down!"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr "Slit th' Node"
@@ -6532,11 +6696,98 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr "Slit th' Node"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Yar, Blow th' Selected Down!"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "Edit yer Variable:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Ye be fixin' Signal:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Ye be fixin' Signal:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Ye be fixin' Signal:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "Paste yer Node"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Discharge ye' Variable"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "Discharge ye' Function"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "Discharge ye' Function"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "Edit yer Variable:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Yar, Blow th' Selected Down!"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Yar, Blow th' Selected Down!"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "This property can't be changed."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
+msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6572,6 +6823,15 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Release"
+msgstr "just released"
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6580,6 +6840,10 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+msgid "Export Path"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6634,10 +6898,46 @@ msgid "Feature List:"
msgstr ""
#: editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr ""
#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -6766,7 +7066,7 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
-msgid "Can't open project"
+msgid "Can't open project at '%s'."
msgstr ""
#: editor/project_manager.cpp
@@ -6775,6 +7075,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7091,10 +7409,6 @@ msgstr ""
msgid "General"
msgstr ""
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7231,10 +7545,6 @@ msgstr "Paste yer Node"
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr ""
@@ -7319,7 +7629,7 @@ msgid "Step"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7328,7 +7638,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7369,7 +7679,7 @@ msgstr ""
msgid "Reset"
msgstr ""
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7428,6 +7738,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr ""
@@ -7464,6 +7778,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7535,6 +7855,11 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Open documentation"
+msgstr "Yer functions:"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr ""
@@ -7543,11 +7868,11 @@ msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Change Type"
+msgid "Extend Script"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -7701,6 +8026,10 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -7793,19 +8122,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -7838,18 +8155,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -8047,7 +8352,8 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+#, fuzzy
+msgid "Step argument is zero!"
msgstr "Blimey! Ye step argument be marooned!"
#: modules/gdscript/gdscript_functions.cpp
@@ -8274,11 +8580,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -8403,7 +8705,7 @@ msgstr "Yer variables:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Name is not a valid identifier:"
-msgstr "Yer name's got no valid identifier: "
+msgstr "Yer name's got no valid identifier:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Name already in use by another func/var/signal:"
@@ -8574,6 +8876,10 @@ msgid "Base Type:"
msgstr "th' Base Type:"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "th' Members:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "yer Nodes doing nothin':"
@@ -8676,11 +8982,11 @@ msgid "Search VisualScript"
msgstr "Discharge ye' Variable"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
-msgstr "Get"
+msgid "Get %s"
+msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8759,6 +9065,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -8797,6 +9109,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -8914,6 +9232,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -8933,6 +9261,26 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -8965,7 +9313,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9019,6 +9367,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr ""
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr ""
@@ -9035,11 +9387,6 @@ msgstr ""
msgid "Please Confirm..."
msgstr ""
-#: scene/gui/file_dialog.cpp
-#, fuzzy
-msgid "Select this Folder"
-msgstr "Slit th' Node"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9047,6 +9394,10 @@ msgid ""
"hide upon running."
msgstr ""
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9092,10 +9443,6 @@ msgstr "Yer Calligraphy be wrongly sized."
msgid "Input"
msgstr ""
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
@@ -9113,6 +9460,29 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Add Split"
+#~ msgstr "Add Signal"
+
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr ": Evil arguments: "
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "Discharge ye' Signal"
+
+#, fuzzy
+#~ msgid "Add Node.."
+#~ msgstr "Add Node"
+
+#, fuzzy
+#~ msgid "Show current scene file."
+#~ msgstr "Slit th' Node"
+
+#~ msgid "Get"
+#~ msgstr "Get"
+
#~ msgid "Disabled"
#~ msgstr "Cursed"
@@ -9126,9 +9496,6 @@ msgstr ""
#~ msgid "Sequence"
#~ msgstr "Sequence"
-#~ msgid "Switch"
-#~ msgstr "Switch"
-
#~ msgid "Iterator"
#~ msgstr "Iterator"
@@ -9151,9 +9518,6 @@ msgstr ""
#~ msgid "just pressed"
#~ msgstr "just smashed"
-#~ msgid "just released"
-#~ msgstr "just released"
-
#, fuzzy
#~ msgid ""
#~ "Couldn't read the certificate file. Are the path and password both "
diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po
index c88dc3ea2c..740c2ab7d8 100644
--- a/editor/translations/pt_BR.po
+++ b/editor/translations/pt_BR.po
@@ -1,6 +1,6 @@
# Portuguese (Brazil) translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# Allyson Souza <allyson_as@outlook.com>, 2017.
# Anderson Araujo <anderson.araujoprog@gmail.com>, 2018.
@@ -21,16 +21,35 @@
# Marcus Correia <marknokalt@live.com>, 2017-2018.
# Michael Alexsander Silva Dias <michaelalexsander@protonmail.com>, 2017-2018.
# Renato Rotenberg <renato.rotenberg@gmail.com>, 2017.
-# Rodolfo R Gomes <rodolforg@gmail.com>, 2017-2018.
+# Rodolfo R Gomes <rodolforg@gmail.com>, 2017-2018, 2019.
# Tiago Almeida <thyagoeap@gmail.com>, 2017.
# Mauricio Luan Carneiro deSouza <newmailmlcs@gmail.com>, 2018.
# Emerson Guerra <guerraemerson@gmail.com>, 2018.
+# Michel G. Souza <Michelgomesdes@hotmail.com>, 2018.
+# Caio Northfleet <caio.northfleet@gmail.com>, 2018.
+# Henrique Combochi <henrique.combochi@gmail.com>, 2018, 2019.
+# Gabriel Carvalho <billlmaster@gmail.com>, 2018, 2019.
+# miketangogamer <miketangogamer@gmail.com>, 2018.
+# Eduardo Abreu <eduo.abreu@gmail.com>, 2018.
+# Bruno Miranda Da Silva <brunofreezee@gmail.com>, 2018.
+# Marcos Roberto Rodrigues Marques <contato.mroberto@gmail.com>, 2018.
+# Dyefferson Azevedo <gamecanalbrasil@gmail.com>, 2018.
+# LucasSouza6 <lucasosouza66@gmail.com>, 2018.
+# Pedro Pacheco <pedroxixipa@hotmail.com>, 2018, 2019.
+# Bruno Henrique <nimbusdroid@gmail.com>, 2018, 2019.
+# Luciano Scilletta <lucianoscilletta@gmail.com>, 2018.
+# Julio Yagami <juliohenrique31501234@hotmail.com>, 2018.
+# Fernando Martinez <contact@fernandodev.com>, 2018.
+# Marcelo <mitissa@gmail.com>, 2018, 2019.
+# Walter Bolitto <wrcarval@live.com>, 2018, 2019.
+# Vitor Chaves <vitorclcoelho@gmail.com>, 2019.
+# João Paulo Pulga <joaopaulo1339@outlook.com>, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: 2016-05-30\n"
-"PO-Revision-Date: 2018-07-31 19:35+0000\n"
-"Last-Translator: Emerson Guerra <guerraemerson@gmail.com>\n"
+"PO-Revision-Date: 2019-01-13 15:07+0000\n"
+"Last-Translator: João Paulo Pulga <joaopaulo1339@outlook.com>\n"
"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/"
"godot-engine/godot/pt_BR/>\n"
"Language: pt_BR\n"
@@ -38,7 +57,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 3.1.1\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -46,41 +65,38 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr "Argumento de tipo inválido para convert(), use constantes TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr "Não há bytes suficientes para decodificar, ou o formato é inválido."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Entrada inválida %i (não passou) na expressão"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "self não pode ser usado porque a instancia é nul0o (não passou)"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "Nome de propriedade '%s' inválido no nó %s."
+msgstr "Operandos inválidos para operador %s, %s e %s."
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid index of type %s for base type %s"
-msgstr "Nome de propriedade '%s' inválido no nó %s."
+msgstr "Ãndice de tipo %s inválido para tipo base %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "Nome inválido de índice '%s' para base tipo %s"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid arguments to construct '%s'"
-msgstr ": Argumento inválido do tipo: "
+msgstr "Argumento inválido do tipo '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "Na chamada para '%s':"
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -89,27 +105,23 @@ msgstr "Livre"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "Equilibrado"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Mirror"
-msgstr "Espelhar X"
+msgstr "Espelhar"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "Inserir Chave"
+msgstr "Inserir Chave Aqui"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "Duplicar Seleção"
+msgstr "Duplicar Chave(s) Selecionada(s)"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "Excluir Selecionados"
+msgstr "Excluir Chave(s) Selecionada(s)"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -140,46 +152,40 @@ msgid "Anim Change Call"
msgstr "Alterar Chamada da Anim"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Property Track"
-msgstr "Propriedade:"
+msgstr "Trilha de Propriedade"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "3D Transform Track"
-msgstr "Tipo de Transformação"
+msgstr "Trilha de transformação 3D"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "Trilha de método de chamada"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "Caminho da Curva de Bezier"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "Faixa de Reprodução de Ãudio"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Playback Track"
-msgstr "Parar reprodução da animação. (S)"
+msgstr "Faixa de Reprodução de Animação"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
-msgstr "Adicionar Trilha na Anim"
+msgstr "Adicionar Trilha"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Length Time (seconds)"
-msgstr "Duração da animação (em segundos)."
+msgstr "Duração da Animação (em segundos)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "Zoom da animação."
+msgstr "Loop da Animação"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -187,42 +193,36 @@ msgid "Functions:"
msgstr "Funções:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Audio Clips:"
-msgstr "Ouvinte de Ãudio"
+msgstr "Clipes de Ãudio:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Clips:"
-msgstr "Clipes"
+msgstr "Clipes de Animação:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Toggle this track on/off."
-msgstr "Alternar modo sem-distrações."
+msgstr "Ligar/desligar esta trilha."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "Modo de Atualização (Como esta propriedade é setada)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Interpolation Mode"
-msgstr "Nó Animation"
+msgstr "Modo de Interpolação"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "Modo Loop Enrolado (Interpolar fim com início no loop)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "Remover trilha selecionada."
+msgstr "Remover esta trilha."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "Tempo do X-Fade (s):"
+msgstr "Tempo (s): "
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -237,13 +237,12 @@ msgid "Trigger"
msgstr "Gatilho"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Capture"
-msgstr "Funcionalidades"
+msgstr "Capturar"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "Mais próximo"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
@@ -252,16 +251,15 @@ msgstr "Linear"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr ""
+msgstr "Cúbico"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clamp Loop Interp"
msgstr "Mudar Interpolação do Loop da Animação"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "Amarrar Interpolação de Loop"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -269,14 +267,12 @@ msgid "Insert Key"
msgstr "Inserir Chave"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "Duplicar Nó(s)"
+msgstr "Duplicar Chave(s)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "Excluir Nó(s)"
+msgstr "Deletar Chave(s)"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -294,7 +290,6 @@ msgstr "Criar %d NOVAS trilhas e inserir chaves?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -306,7 +301,7 @@ msgstr "Inserir Anim"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
-msgstr ""
+msgstr "AnimationPlayer não pode animar a si mesmo, apenas outros jogadores."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
@@ -323,6 +318,7 @@ msgstr "Inserir Chave na Anim"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
msgstr ""
+"As faixas de transformação aplicam-se apenas aos nós baseados no espaço."
#: editor/animation_track_editor.cpp
msgid ""
@@ -331,44 +327,48 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"Faixas de áudio só podem apontar para nós do tipo:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "Faixas de animação só podem apontar para nós AnimationPlayer."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
msgstr ""
+"Um tocador de animação não pode animar a si mesmo, apenas outros tocadores."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "Não é possível adicionar uma nova trilha sem uma raiz"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "Caminho da trilha é inválido,então não pode adicionar uma chave."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "Trilha não é do tipo Espacial,não pode inserir chave"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
msgstr ""
+"Caminho da trilha é inválido,então não pode adicionar uma chave de método."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Method not found in object: "
-msgstr "VariableGet não encontrada no script: "
+msgstr "Método não encontrado no objeto: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
msgstr "Mover Chaves da Anim"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clipboard is empty"
-msgstr "Ãrea de transferência vazia!"
+msgstr "Ãrea de transferência vazia"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
@@ -378,24 +378,23 @@ msgstr "Alterar Escala das Chaves na Anim"
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
msgstr ""
+"Essa opção não funciona para edição por Bezier,pois é apenas uma faixa única."
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "Apenas mostrar trilhas de nós selecionados na árvore."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr ""
+msgstr "Agrupe as trilhas pelo nó ou exiba-as como lista simples."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap (s): "
-msgstr "Snap (Pixels):"
+msgstr "Snap (Pixels): "
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "Ãrvore de Animação é válida."
+msgstr "Valor do passo de animação."
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -407,48 +406,43 @@ msgid "Edit"
msgstr "Editar"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "AnimationTree"
+msgstr "Propriedades de animação."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "Copiar Parâmetros"
+msgstr "Copiar Trilhas"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "Colar Params"
+msgstr "Colar Trilhas"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
-msgstr "Mudar Escala da Seleção"
+msgstr "Selecionar Escala"
#: editor/animation_track_editor.cpp
msgid "Scale From Cursor"
-msgstr "Mudar Escala a partir do Cursor"
+msgstr "Escalar a partir do Cursor"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Duplicar Seleção"
#: editor/animation_track_editor.cpp
msgid "Duplicate Transposed"
-msgstr "Duplicar Transposto"
+msgstr "Duplicar Transposta"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
-msgstr "Excluir Selecionados"
+msgstr "Deletar Seleção"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+msgid "Go to Next Step"
msgstr "Ir ao Próximo Passo"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+msgid "Go to Previous Step"
msgstr "Ir ao Passo Anterior"
#: editor/animation_track_editor.cpp
@@ -461,11 +455,11 @@ msgstr "Limpar Animação"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "Escolher o nó que será animado:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "Usar Curvas de Bezier"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
@@ -481,7 +475,7 @@ msgstr "Erro Angular Max.:"
#: editor/animation_track_editor.cpp
msgid "Max Optimizable Angle:"
-msgstr "Angulo Máximo otimizável:"
+msgstr "Ângulo Máximo Otimizável:"
#: editor/animation_track_editor.cpp
msgid "Optimize"
@@ -489,7 +483,7 @@ msgstr "Otimizar"
#: editor/animation_track_editor.cpp
msgid "Remove invalid keys"
-msgstr "Remover Chaves Invalidas"
+msgstr "Remover chaves inválidas"
#: editor/animation_track_editor.cpp
msgid "Remove unresolved and empty tracks"
@@ -509,11 +503,11 @@ msgstr "Limpar"
#: editor/animation_track_editor.cpp
msgid "Scale Ratio:"
-msgstr "Proporção de Escala:"
+msgstr "Razão de Escala:"
#: editor/animation_track_editor.cpp
msgid "Select tracks to copy:"
-msgstr ""
+msgstr "Selecionar trilhas para copiar:"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -551,11 +545,11 @@ msgstr "Sem Correspondências"
msgid "Replaced %d occurrence(s)."
msgstr "%d ocorrência(s) substituída(s)."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Corresponder Caixa"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "Palavras Inteiras"
@@ -569,31 +563,33 @@ msgstr "Substituir Tudo"
#: editor/code_editor.cpp
msgid "Selection Only"
-msgstr "Apenas na Seleção"
+msgstr "Selecionar Apenas"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
-msgstr "Ampliar Mais"
+msgstr "Ampliar"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
-msgstr "Ampliar Menos"
+msgstr "Reduzir"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "Redefinir Ampliação"
#: editor/code_editor.cpp
-#, fuzzy
msgid "Warnings:"
-msgstr "Avisos"
+msgstr "Avisos:"
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "Ampliação (%):"
+msgid "Font Size:"
+msgstr "Tamanho da Fonte:"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Linha:"
@@ -603,14 +599,14 @@ msgstr "Coluna:"
#: editor/connections_dialog.cpp
msgid "Method in target Node must be specified!"
-msgstr "O método no nó destino precisa ser especificado!"
+msgstr "O método no Nó alvo precisa ser especificado!"
#: editor/connections_dialog.cpp
msgid ""
"Target method not found! Specify a valid method or attach a script to target "
"Node."
msgstr ""
-"Método destino não encontrado! Específique um método válido ou anexe um "
+"Método destino não encontrado! Especifique um método válido ou anexe um "
"script ao nó destino."
#: editor/connections_dialog.cpp
@@ -626,6 +622,7 @@ msgstr "Adicionar"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -641,11 +638,11 @@ msgstr "Argumentos de Chamada Extras:"
#: editor/connections_dialog.cpp
msgid "Path to Node:"
-msgstr "Caminho para o nó:"
+msgstr "Caminho para o Nó:"
#: editor/connections_dialog.cpp
msgid "Make Function"
-msgstr "Criar Função"
+msgstr "Fazer Função"
#: editor/connections_dialog.cpp
msgid "Deferred"
@@ -682,9 +679,8 @@ msgid "Disconnect '%s' from '%s'"
msgstr "Desconectar '%s' do '%s'"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect all from signal: '%s'"
-msgstr "Desconectar '%s' do '%s'"
+msgstr "Desconectar todos do sinal : '%s'"
#: editor/connections_dialog.cpp
msgid "Connect..."
@@ -696,19 +692,16 @@ msgid "Disconnect"
msgstr "Desconectar"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect Signal: "
-msgstr "Conectando Sinal:"
+msgstr "Conectar Sinal: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection: "
-msgstr "Editar Conexões"
+msgstr "Editar Conexão: "
#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "Are you sure you want to remove all connections from the \""
-msgstr "Tem certeza de que quer executar mais de um projeto?"
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr "Tem certeza que quer remover todas as conexões do sinal \"%s\"?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -716,22 +709,19 @@ msgstr "Sinais"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr ""
+msgstr "Tem certeza que quer remover todas conexões desse sinal?"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "Desconectar"
+msgstr "Desconectar Tudo"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit..."
-msgstr "Editar"
+msgstr "Editar..."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "Métodos"
+msgstr "Ir ao Método"
#: editor/create_dialog.cpp
msgid "Change %s Type"
@@ -756,23 +746,20 @@ msgid "Recent:"
msgstr "Recente:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Pesquisar:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
-msgstr "Combinações:"
+msgstr "Correspondências:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "Descrição:"
@@ -790,16 +777,16 @@ msgid ""
"Scene '%s' is currently being edited.\n"
"Changes will not take effect unless reloaded."
msgstr ""
-"A cena \"%s\" está sendo editada atualmente.\n"
-"As alterações não terão efeito a menos que seja recarregada."
+"Cena \"%s\" está sendo editada atualmente.\n"
+"Alterações não terão efeito a menos que seja recarregada."
#: editor/dependency_editor.cpp
msgid ""
"Resource '%s' is in use.\n"
"Changes will take effect when reloaded."
msgstr ""
-"O recurso \"%s\" está em uso.\n"
-"As alterações não terão efeito a menos que seja recarregado."
+"Recurso \"%s\" está em uso.\n"
+"Alterações terão efeito ao recarregar."
#: editor/dependency_editor.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -811,8 +798,7 @@ msgid "Resource"
msgstr "Recurso"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "Caminho"
@@ -833,9 +819,10 @@ msgid "Search Replacement Resource:"
msgstr "Buscar Recurso para Substituição:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -847,7 +834,7 @@ msgstr "Donos De:"
#: editor/dependency_editor.cpp
msgid "Remove selected files from the project? (no undo)"
-msgstr "Remover os arquivos selecionados do projeto? (impossível desfazer)"
+msgstr "Remover arquivos selecionados do projeto? (irreversível)"
#: editor/dependency_editor.cpp
msgid ""
@@ -855,21 +842,21 @@ msgid ""
"work.\n"
"Remove them anyway? (no undo)"
msgstr ""
-"Os arquivos a serem removidos são requeridos por outros recursos para que "
+"Os arquivos sendo removidos são requeridos por outros recursos para que "
"funcionem.\n"
"Removê-los mesmo assim? (irreversível)"
#: editor/dependency_editor.cpp editor/export_template_manager.cpp
msgid "Cannot remove:"
-msgstr "Impossível remover:"
+msgstr "Não pode remover:"
#: editor/dependency_editor.cpp
msgid "Error loading:"
msgstr "Erro ao carregar:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
-msgstr "A cena não pôde ser carregada por causa de dependências ausentes:"
+msgid "Load failed due to missing dependencies:"
+msgstr "Não foi possível carregar porque há dependências ausentes:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -889,7 +876,7 @@ msgstr "Erros ao carregar!"
#: editor/dependency_editor.cpp
msgid "Permanently delete %d item(s)? (No undo!)"
-msgstr "Excluir permanentemente %d item(s)? (Impossível desfazer!)"
+msgstr "Excluir permanentemente %d item(s)? (Irreversível)"
#: editor/dependency_editor.cpp
msgid "Owns"
@@ -905,7 +892,7 @@ msgstr "Explorador de Recursos Órfãos"
#: editor/dependency_editor.cpp
msgid "Delete selected files?"
-msgstr "Excluir os arquivos selecionados?"
+msgstr "Excluir arquivos selecionados?"
#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
@@ -927,14 +914,6 @@ msgstr "Alterar Valor do Dicionário"
msgid "Thanks from the Godot community!"
msgstr "Agradecimentos da comunidade Godot!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "OK"
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Contribuidores da Godot Engine"
@@ -1009,7 +988,7 @@ msgstr ""
#: editor/editor_about.cpp
msgid "All Components"
-msgstr "Todos os Componentes"
+msgstr "Todos Componentes"
#: editor/editor_about.cpp
msgid "Components"
@@ -1028,8 +1007,8 @@ msgid "Uncompressing Assets"
msgstr "Descompactando Assets"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
-msgstr "Pacote Instalado com Sucesso!"
+msgid "Package installed successfully!"
+msgstr "Pacote instalado com sucesso!"
#: editor/editor_asset_installer.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -1051,7 +1030,7 @@ msgstr "Caixas de Som"
#: editor/editor_audio_buses.cpp
msgid "Add Effect"
-msgstr "Ad. Efeito"
+msgstr "Adicionar Efeito"
#: editor/editor_audio_buses.cpp
msgid "Rename Audio Bus"
@@ -1110,8 +1089,7 @@ msgid "Bus options"
msgstr "Opções da pista"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "Duplicar"
@@ -1273,7 +1251,7 @@ msgid "Add AutoLoad"
msgstr "Adicionar Autoload"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "Caminho:"
@@ -1281,8 +1259,8 @@ msgstr "Caminho:"
msgid "Node Name:"
msgstr "Nome do nó:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "Nome"
@@ -1352,25 +1330,28 @@ msgid "Template file not found:"
msgstr "Arquivo de modelo não encontrado:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Selecione a Pasta Atual"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "O arquivo existe. Sobrescrever?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "Selecione a Pasta Atual"
+msgid "Select This Folder"
+msgstr "Selecionar esta Pasta"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
msgstr "Copiar Caminho"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr "Mostrar no Gerenciador de Arquivos"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+msgid "Show in File Manager"
msgstr "Mostrar no Gerenciador de Arquivos"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1406,7 +1387,8 @@ msgid "Open a File or Directory"
msgstr "Abrir Arquivo ou Diretório"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Salvar"
@@ -1464,8 +1446,7 @@ msgstr "Diretórios & Arquivos:"
msgid "Preview:"
msgstr "Previsualização:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "Arquivo:"
@@ -1481,24 +1462,11 @@ msgstr "BuscarFontes"
msgid "(Re)Importing Assets"
msgstr "(Re)Importando Assets"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "Pesquisar Ajuda"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "Lista de Classes:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "Pesquisar Classes"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "Cima"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "Classe:"
@@ -1515,28 +1483,28 @@ msgid "Brief Description:"
msgstr "Descrição breve:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "Membros"
+msgid "Properties"
+msgstr "Propriedades"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "Membros:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr "Propriedades:"
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "Métodos Públicos"
+msgid "Methods"
+msgstr "Métodos"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "Métodos Públicos:"
+msgid "Methods:"
+msgstr "Métodos:"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "Itens do Tema de GUI"
+msgid "Theme Properties"
+msgstr "Propriedades do Tema"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "Itens do Tema de GUI:"
+msgid "Theme Properties:"
+msgstr "Propriedades do Tema:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1563,8 +1531,12 @@ msgid "Constants:"
msgstr "Constantes:"
#: editor/editor_help.cpp
-msgid "Description"
-msgstr "Descrição"
+msgid "Class Description"
+msgstr "Descrição da Classe"
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
+msgstr "Descrição da Classe:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1581,12 +1553,12 @@ msgstr ""
"$url2]solicitar[/url][/color]."
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "Propriedades"
+msgid "Property Descriptions"
+msgstr "Descrições da Propriedade"
#: editor/editor_help.cpp
-msgid "Property Description:"
-msgstr "Descrição da Propriedade:"
+msgid "Property Descriptions:"
+msgstr "Descrições da Propriedade:"
#: editor/editor_help.cpp
msgid ""
@@ -1597,12 +1569,12 @@ msgstr ""
"[color=$color][url=$url]contribuindo uma[/url][/color]!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "Métodos"
+msgid "Method Descriptions"
+msgstr "Descrições do Método"
#: editor/editor_help.cpp
-msgid "Method Description:"
-msgstr "Descrição do Método:"
+msgid "Method Descriptions:"
+msgstr "Descrições do Método:"
#: editor/editor_help.cpp
msgid ""
@@ -1612,18 +1584,58 @@ msgstr ""
"Atualmente não existe descrição para este método. Por favor nos ajude [color="
"$color][url=$url]contribuindo uma[/url][/color]!"
-#: editor/editor_inspector.cpp
-#, fuzzy
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Pesquisar Ajuda"
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr "Exibir Tudo"
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr "Apenas Classes"
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr "Apenas Métodos"
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr "Apenas Sinais"
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr "Apenas Constantes"
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr "Apenas Propriedades"
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr "Apenas Propriedades de Tema"
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr "Tipo de Membro"
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr "Classe"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
msgstr "Propriedade:"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr "Set"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "Definir Múltiplos:"
#: editor/editor_log.cpp
msgid "Output:"
@@ -1651,9 +1663,14 @@ msgstr "Falha na exportação do projeto com código de erro %d."
msgid "Error saving resource!"
msgstr "Erro ao salvar Recurso!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "OK"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
-msgstr "Salvar Recuso como..."
+msgstr "Salvar Recurso como..."
#: editor/editor_node.cpp
msgid "Can't open file for writing:"
@@ -1670,6 +1687,7 @@ msgstr "Erro ao salvar."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
msgstr ""
+"Não foi possível abrir '%s'. O arquivo pode ter sido movido ou deletado."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
@@ -1705,12 +1723,25 @@ msgstr "Essa operação não pode ser realizada sem uma raiz da cena."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+"Não é possível salvar esta cena porque existe uma inclusão cíclica de "
+"instância.\n"
+"Por favor, solucione isso e tente salvar novamente."
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
"Não se pôde salvar a cena. É provável que dependências (instâncias ou "
"herança) não foram satisfeitas."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr "Não é possível sobrescrever a cena que ainda está aberta!"
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr "Não se pôde carregar MeshLibrary para fusão!"
@@ -1969,6 +2000,14 @@ msgstr "Não foi possível carregar o script complementar do caminho: '%s'."
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"Não foi possível carregar o script complementar do caminho: '%s' Parece "
+"haver um erro no código, por favor verifique a sintaxe."
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
"Não foi possível carregar o script complementar do caminho: '%s' Tipo base "
@@ -2017,15 +2056,18 @@ msgstr "Excluir Layout"
msgid "Default"
msgstr "Padrão"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr "Mostrar em Arquivos"
+
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play This Scene"
msgstr "Rodar Cena"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "Fechas as outras abas"
+msgstr "Fechar aba"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2100,8 +2142,8 @@ msgid "Save Scene"
msgstr "Salvar Cena"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
-msgstr "Salvar todas as Cenas"
+msgid "Save All Scenes"
+msgstr "Salvar Todas as Cenas"
#: editor/editor_node.cpp
msgid "Close Scene"
@@ -2129,7 +2171,7 @@ msgid "Undo"
msgstr "Desfazer"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Refazer"
@@ -2153,20 +2195,20 @@ msgstr "Configurações do Projeto"
msgid "Export"
msgstr "Exportar"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "Ferramentas"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "Abrir Gerenciador de Projetos?"
+msgstr "Abrir Pasta do Projeto"
#: editor/editor_node.cpp
msgid "Quit to Project List"
msgstr "Sair para a Lista de Projetos"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "Depurar"
@@ -2274,18 +2316,16 @@ msgid "Toggle Fullscreen"
msgstr "Alternar Tela-Cheia"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Data/Settings Folder"
-msgstr "Configurações do Editor"
+msgstr "Abrir Editor/Configurações de Pasta"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "Abrir a Pasta de dados do Editor"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Settings Folder"
-msgstr "Configurações do Editor"
+msgstr "Abrir Configurações do Editor"
#: editor/editor_node.cpp editor/project_export.cpp
msgid "Manage Export Templates"
@@ -2295,10 +2335,6 @@ msgstr "Gerenciar Modelos de Exportação"
msgid "Help"
msgstr "Ajuda"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "Classes"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2365,17 +2401,16 @@ msgstr "Rodar outra cena"
#: editor/editor_node.cpp
msgid "Play Custom Scene"
-msgstr "Rodar outra cena"
+msgstr "Rodar Outra Cena"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr ""
+msgstr "Mudar o driver de vídeo necessita reinicializar o editor."
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Save & Restart"
-msgstr "Salvar e Re-Importar"
+msgstr "Salvar e Reiniciar"
#: editor/editor_node.cpp
msgid "Spins when the editor window repaints!"
@@ -2393,27 +2428,26 @@ msgstr "Atualizar Alterações"
msgid "Disable Update Spinner"
msgstr "Desabilitar Spinner de Atualização"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "Inspetor"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "Importar"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "Nó"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "Arquivos"
#: editor/editor_node.cpp
-#, fuzzy
+msgid "Inspector"
+msgstr "Inspetor"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Nó"
+
+#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
-msgstr "Expandir tudo"
+msgstr "Expandir Painel Inferior"
#: editor/editor_node.cpp scene/resources/visual_shader.cpp
msgid "Output"
@@ -2492,9 +2526,8 @@ msgid "Thumbnail..."
msgstr "Miniatura..."
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit Plugin"
-msgstr "Editar Polígono"
+msgstr "Editar Plugin"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
@@ -2518,15 +2551,13 @@ msgid "Status:"
msgstr "Status:"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit:"
-msgstr "Editar"
+msgstr "Editar:"
#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Start"
-msgstr "Iniciar!"
+msgstr "Iniciar"
#: editor/editor_profiler.cpp
msgid "Measure:"
@@ -2548,7 +2579,7 @@ msgstr "% de Quadro"
msgid "Physics Frame %"
msgstr "Quadro Físico %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "Tempo:"
@@ -2572,34 +2603,65 @@ msgstr "Tempo"
msgid "Calls"
msgstr "Chamadas"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr "Ativo"
#: editor/editor_properties.cpp
msgid "Layer"
-msgstr ""
+msgstr "Camada"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Bit %d, value %d"
-msgstr "Bit %d, val %d."
+msgstr "Bit %d, valor %d"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr "[Vazio]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
+msgid "Assign..."
+msgstr "Atribuir..."
+
+#: editor/editor_properties.cpp
#, fuzzy
-msgid "Assign.."
-msgstr "Atribuir"
+msgid "Invalid RID"
+msgstr "Caminho Inválido"
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+"O recurso selecionado (%s) não corresponde ao tipo esperado para essa "
+"propriedade (%s)."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+"Não é possível criar uma ViewportTexture em recursos salvos como um "
+"arquivo.\n"
+"Os recursos precisam pertencer à cena."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+"Não é possível criar uma ViewportTexture neste recurso porque ele não está "
+"definido como local a uma cena.\n"
+"Por favor ative sua propriedade \"local para cena\" (e todos os recursos que "
+"o contém até chegar nele)."
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr "Escolha uma Viewport"
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr "Novo Script"
@@ -2611,10 +2673,6 @@ msgstr "Novo %s"
msgid "Make Unique"
msgstr "Tornar Único"
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr "Mostrar em Arquivos"
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2623,7 +2681,8 @@ msgstr "Mostrar em Arquivos"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "Colar"
@@ -2636,36 +2695,32 @@ msgstr "Converter Para %s"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Open Editor"
-msgstr "Abrir no Editor"
+msgstr "Abrir Editor"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Selected node is not a Viewport!"
msgstr "O nó selecionado não é uma Viewport!"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "Size: "
-msgstr "Tamanho da Célula:"
+msgstr "Tamanho: "
#: editor/editor_properties_array_dict.cpp
msgid "Page: "
-msgstr ""
+msgstr "Página: "
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Key:"
-msgstr "Novo nome:"
+msgstr "Nova Chave:"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Value:"
-msgstr "Novo nome:"
+msgstr "Novo Valor:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
-msgstr ""
+msgstr "Adicionar Par de Chave/Valor"
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -2736,7 +2791,7 @@ msgstr "(Instalado)"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Download"
-msgstr "Download"
+msgstr "Baixar"
#: editor/export_template_manager.cpp
msgid "(Missing)"
@@ -2759,9 +2814,8 @@ msgid "Can't open export templates zip."
msgstr "Não se pôde abrir zip dos modelos de exportação."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Invalid version.txt format inside templates: %s."
-msgstr "Formato do version.txt dentro dos modelos é inválido."
+msgstr "Formato do version.txt inválido dentro de templates: %s."
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
@@ -2826,6 +2880,8 @@ msgid ""
"Templates installation failed. The problematic templates archives can be "
"found at '%s'."
msgstr ""
+"Instalação de templates falhou. Os arquivos problemáticos podem ser achados "
+"em '%s'."
#: editor/export_template_manager.cpp
msgid "Error requesting url: "
@@ -2871,7 +2927,7 @@ msgstr "Baixando"
#: editor/export_template_manager.cpp
msgid "Connection Error"
-msgstr "Erro de conexão"
+msgstr "Erro de Conexão"
#: editor/export_template_manager.cpp
msgid "SSL Handshake Error"
@@ -2887,7 +2943,7 @@ msgstr "Versões Instaladas:"
#: editor/export_template_manager.cpp
msgid "Install From File"
-msgstr "Instalar a partir do arquivo"
+msgstr "Instalar a Partir do Arquivo"
#: editor/export_template_manager.cpp
msgid "Remove Template"
@@ -2899,16 +2955,15 @@ msgstr "Selecione o arquivo de modelo"
#: editor/export_template_manager.cpp
msgid "Export Template Manager"
-msgstr "Gerenciador de exportação de modelo"
+msgstr "Gerenciador de Exportação de Modelo"
#: editor/export_template_manager.cpp
msgid "Download Templates"
-msgstr "Baixar modelos"
+msgstr "Baixar Modelos"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr "Selecione uma fonte da lista: "
+msgstr "Selecione um espelho da lista: (Shift+Click: Abrir no Navegador)"
#: editor/file_type_cache.cpp
msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
@@ -2917,18 +2972,20 @@ msgstr ""
"não salvo!"
#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr "Favoritos"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr "Impossível navegar até '%s' pois não existe no sistema de arquivos!"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a grid of thumbnails."
-msgstr "Visualizar itens como uma grade de miniaturas"
+msgstr "Visualizar itens como uma grade de miniaturas."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a list."
-msgstr "Visualizar itens como uma lista"
+msgstr "Visualizar itens como uma lista."
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
@@ -2956,19 +3013,15 @@ msgstr "Erro ao duplicar:"
msgid "Unable to update dependencies:"
msgstr "Não foi possível atualizar dependências:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "Nenhum nome fornecido"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "Nenhum nome fornecido."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "O nome fornecido contém caracteres inválidos"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "Nenhum nome fornecido."
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "Nome contém caracteres inválidos."
@@ -2993,22 +3046,6 @@ msgid "Duplicating folder:"
msgstr "Duplicando pasta:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "Expandir tudo"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "Recolher tudo"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "Renomear..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "Mover Para..."
-
-#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
msgstr "Abrir Cena(s)"
@@ -3017,6 +3054,14 @@ msgid "Instance"
msgstr "Instância"
#: editor/filesystem_dock.cpp
+msgid "Add to favorites"
+msgstr "Adicionar aos favoritos"
+
+#: editor/filesystem_dock.cpp
+msgid "Remove from favorites"
+msgstr "Remover dos favoritos"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "Editar Dependências..."
@@ -3024,19 +3069,33 @@ msgstr "Editar Dependências..."
msgid "View Owners..."
msgstr "Visualizar Proprietários..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "Renomear..."
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "Duplicar..."
#: editor/filesystem_dock.cpp
-#, fuzzy
+msgid "Move To..."
+msgstr "Mover Para..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
-msgstr "Novo Script"
+msgstr "Novo Script..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "Salvar Recuso como..."
+msgstr "Novo Recurso..."
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr "Expandir Tudo"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr "Recolher Tudo"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3058,29 +3117,18 @@ msgid "Re-Scan Filesystem"
msgstr "Re-escanear Sistema de Arquivos"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "Alternar status da pasta como Favorito"
+msgid "Toggle split mode"
+msgstr "Alternar modo"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Show current scene file."
-msgstr "Selecione o sub-tile editado atual."
+msgid "Search files"
+msgstr "Pesquisar arquivos"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr "Instanciar a(s) cena(s) selecionada como filho do nó selecionado."
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "Pesquisar Classes"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3088,51 +3136,37 @@ msgstr ""
"Escaneando arquivos,\n"
"Por favor aguarde..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "Mover"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "There is already file or folder with the same name in this location."
-msgstr "Já há uma pasta neste caminho com o nome especificado."
+msgstr "Já há uma pasta ou arquivo neste caminho com o nome especificado."
#: editor/filesystem_dock.cpp
msgid "Overwrite"
-msgstr ""
+msgstr "Sobrescrever"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Criar Script"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find in files"
-msgstr "Localizar tile"
+msgid "Find in Files"
+msgstr "Localizar nos Arquivos"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find: "
-msgstr "Localizar"
+msgid "Find:"
+msgstr "Encontrar:"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Whole words"
-msgstr "Palavras Inteiras"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "Corresponder Caixa"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "Pasta:"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Filter: "
-msgstr "Filtro:"
+msgid "Filters:"
+msgstr "Filtros:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3148,52 +3182,48 @@ msgid "Cancel"
msgstr "Cancelar"
#: editor/find_in_files.cpp
-#, fuzzy
+msgid "Find: "
+msgstr "Encontrar: "
+
+#: editor/find_in_files.cpp
msgid "Replace: "
-msgstr "Substituir"
+msgstr "Substituir: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace all (no undo)"
-msgstr "Substituir Tudo"
+msgstr "Substituir Tudo (sem desfazer)"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Searching..."
-msgstr "Salvando..."
+msgstr "Procurando..."
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Search complete"
-msgstr "Pesquisar Texto"
+msgstr "Pesquisa concluída"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group name already exists."
-msgstr "ERRO: Nome da animação já existe!"
+msgstr "Nome do grupo já existe."
#: editor/groups_editor.cpp
-#, fuzzy
-msgid "invalid Group name."
-msgstr "Nome Inválido."
+msgid "Invalid group name."
+msgstr "Nome de grupo inválido."
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Grupos"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes not in Group"
-msgstr "Grupo(s) do Nó"
+msgstr "Nós fora de Grupo"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
msgid "Filter nodes"
msgstr "Filtrar nós"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes in Group"
-msgstr "Grupo(s) do Nó"
+msgstr "Nós no Grupo"
#: editor/groups_editor.cpp
msgid "Add to Group"
@@ -3204,54 +3234,53 @@ msgid "Remove from Group"
msgstr "Remover do Grupo"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Manage Groups"
-msgstr "Grupos de Imagens"
+msgstr "Gerenciar Grupos"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Single Scene"
-msgstr "Importar como cena única"
+msgstr "Importar como Cena Única"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Animations"
-msgstr "Importar com animações separadas"
+msgstr "Importar com Animações Separadas"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Materials"
-msgstr "Importar com materiais separados"
+msgstr "Importar com Materiais Separados"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects"
-msgstr "Importar com objetos separados"
+msgstr "Importar com Objetos Separados"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects+Materials"
-msgstr "Importar com Objetos+Materiais separados"
+msgstr "Importar com Objetos+Materiais Separados"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects+Animations"
-msgstr "Importar com Objetos+Animações separados"
+msgstr "Importar com Objetos+Animações Separados"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Materials+Animations"
-msgstr "Importar com Materiais+Animações separados"
+msgstr "Importar com Materiais+Animações Separados"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects+Materials+Animations"
-msgstr "Importar com Objetos+Materiais+Animações separados"
+msgstr "Importar com Objetos+Materiais+Animações Separados"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Multiple Scenes"
-msgstr "Importar como múltiplas cenas"
+msgstr "Importar como Múltiplas Cenas"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Multiple Scenes+Materials"
-msgstr "Importar como múltiplas Cenas+Materiais"
+msgstr "Importar como Múltiplas Cenas+Materiais"
#: editor/import/resource_importer_scene.cpp
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Import Scene"
-msgstr "Importar cena"
+msgstr "Importar Cena"
#: editor/import/resource_importer_scene.cpp
msgid "Importing Scene..."
@@ -3313,18 +3342,13 @@ msgstr "Reimportar"
msgid "Failed to load resource."
msgstr "Falha ao carregar recurso."
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "Ok"
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
-msgstr "Expandir todas as propriedades"
+msgid "Expand All Properties"
+msgstr "Expandir Todas as Propriedades"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
-msgstr "Recolher todas as propriedades"
+msgid "Collapse All Properties"
+msgstr "Recolher Todas as Propriedades"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -3337,12 +3361,11 @@ msgstr "Copiar Parâmetros"
#: editor/inspector_dock.cpp
msgid "Paste Params"
-msgstr "Colar Params"
+msgstr "Colar Parâmetros"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Edit Resource Clipboard"
-msgstr "Recurso da área de transferência está vazio!"
+msgstr "Editar Ãrea de Transferência de Recursos"
#: editor/inspector_dock.cpp
msgid "Copy Resource"
@@ -3369,6 +3392,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "Carrega um recurso existente do disco e o edita."
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "Salva o recurso editado atualmente."
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "Ir ao objeto editado anteriormente no histórico."
@@ -3385,9 +3412,8 @@ msgid "Object properties."
msgstr "Propriedades do objeto."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Filter properties"
-msgstr "Filtrar nós"
+msgstr "Filtrar propriedades"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
@@ -3402,47 +3428,40 @@ msgid "Select a Node to edit Signals and Groups."
msgstr "Selecione um nó para editar Sinais e Grupos."
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Edit a Plugin"
-msgstr "Editar Polígono"
+msgstr "Editar um Plugin"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Create a Plugin"
-msgstr "Criar solução C#"
+msgstr "Criar um Plugin"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Plugin Name:"
-msgstr "Lista de Plugins:"
+msgstr "Nome do Plugin:"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
-msgstr ""
+msgstr "Subpasta:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Language:"
-msgstr "Linguagem"
+msgstr "Idioma:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Script Name:"
-msgstr "Script válido"
+msgstr "Nome do Script:"
#: editor/plugin_config_dialog.cpp
msgid "Activate now?"
-msgstr ""
+msgstr "Ativar agora?"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
msgstr "Criar Polígono"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+msgid "Edit Polygon"
msgstr "Editar Polígono"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3450,34 +3469,33 @@ msgid "Insert Point"
msgstr "Inserir Ponto"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr "Editar Polígono (Remover Ponto)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+msgid "Remove Polygon And Point"
msgstr "Remover Polígono e Ponto"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "Criar um novo polígono do zero"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr "Criar pontos."
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
-"Editar polígono existente:\n"
-"LMB: Mover Ponto.\n"
-"Ctrl+LMB: Soltar Segmento.\n"
-"RMB: Apagar Ponto."
+"Editar pontos:\n"
+"Botão esquerdo do mouse: Mover Ponto\n"
+"Botão direito do mouse: Apagar Ponto"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
-msgstr "Excluir Pontos"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr "Apagar pontos."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3491,15 +3509,15 @@ msgstr "Adicionar Animação"
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Load.."
-msgstr "Carregar"
+msgid "Load..."
+msgstr "Carregar..."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "This type of node can't be used. Only root nodes are allowed."
msgstr ""
+"Esse tipo de nó não pode ser utilizado. Apenas nós raízes são permitidos."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3509,73 +3527,65 @@ msgid ""
"AnimationTree is inactive.\n"
"Activate to enable playback, check node warnings if activation fails."
msgstr ""
+"A árvore de animação está inativa.\n"
+"Ative para permitir a reprodução, cheque os avisos de nós caso a ativação "
+"falhe."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Set the blending position within the space"
-msgstr ""
+msgstr "Definir posição de mescla dentro do espaço"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Select and move points, create points with RMB."
-msgstr ""
+msgstr "Selecione e mova pontos, crie pontos com o Botão Direito do Mouse."
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Excluir Pontos"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "RMB: Apagar Ponto."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr "Habilitar snap e mostrar a grade"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Point"
-msgstr "Mover Ponto"
+msgstr "Ponto"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Open Animation Node"
-msgstr "Nó Animation"
+msgstr "Abrir Nó de Animação"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists"
-msgstr "A ação \"%s\" já existe!"
+msgstr "Triângulo já existe"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "BlendSpace2D does not belong to an AnimationTree node."
-msgstr ""
+msgstr "BlendSpace2D não pertence ao nó AnimationTree."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "No triangles exist, so no blending can take place."
-msgstr ""
+msgstr "Não existem triângulos, então nenhuma mistura pode acontecer."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create triangles by connecting points."
-msgstr ""
+msgstr "Crie triângulos conectando pontos."
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Erase points and triangles."
-msgstr "Analisando %d Triângulos:"
+msgstr "Apagar pontos e triângulos."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Generate blend triangles automatically (instead of manually)"
-msgstr ""
+msgstr "Gerar triângulos de mistura automaticamente (em vez de manualmente)"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr "Snap"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Misturar:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3584,20 +3594,25 @@ msgstr "Editar Filtros"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Output node can't be added to the blend tree."
-msgstr ""
+msgstr "Nós de saída não pode ser adicionado à árvore de mistura."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Unable to connect, port may be in use or connection may be invalid."
msgstr ""
+"Incapaz de conectar, a porta pode estar em uso ou a conexão é inválida."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
msgstr ""
+"Nenhum reprodutor de animação foi definido, então não é possível obter os "
+"nomes das trilhas."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Player path set is invalid, so unable to retrieve track names."
msgstr ""
+"O caminho definido para o reprodutor é inválido, então não é possível obter "
+"os nomes das trilhas."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
@@ -3605,27 +3620,26 @@ msgid ""
"Animation player has no valid root node path, so unable to retrieve track "
"names."
msgstr ""
+"O reprodutor de animações não tem caminho de nó raiz válido, então não é "
+"possível obter os nomes das trilhas."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Add Node.."
-msgstr "Adicionar Nó"
+msgid "Add Node..."
+msgstr "Adicionar nó..."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filtered Tracks:"
-msgstr "Editar Filtros"
+msgstr "Editar trilhas filtradas:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Enable filtering"
-msgstr "Filhos Editáveis"
+msgstr "Filhos editáveis"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
-msgstr "Alternar Inicio automático"
+msgstr "Alternar Início Automático"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "New Animation Name:"
@@ -3649,14 +3663,12 @@ msgid "Remove Animation"
msgstr "Remover Animação"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Invalid animation name!"
-msgstr "ERRO: Nome de animação inválido!"
+msgstr "Nome de animação inválido!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Animation name already exists!"
-msgstr "ERRO: Nome da animação já existe!"
+msgstr "O nome da animação já existe!"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -3680,14 +3692,12 @@ msgid "Duplicate Animation"
msgstr "Duplicar Animação"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to copy!"
-msgstr "ERRO: Nenhuma animação para copiar!"
+msgstr "Nenhuma animação para copiar!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation resource on clipboard!"
-msgstr "ERRO: Nenhum recurso de animação na área de transferência!"
+msgstr "Nenhum recurso de animação na área de transferência!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
@@ -3698,9 +3708,8 @@ msgid "Paste Animation"
msgstr "Colar Animação"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to edit!"
-msgstr "ERRO: Nenhuma animação para editar!"
+msgstr "Nenhuma animação para editar!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
@@ -3747,14 +3756,12 @@ msgid "New"
msgstr "Novo"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Transitions..."
msgstr "Editar Conexões..."
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Open in Inspector"
-msgstr "Abrir no Editor"
+msgstr "Abrir no inspetor"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Display list of animations in player."
@@ -3813,9 +3820,8 @@ msgid "Include Gizmos (3D)"
msgstr "Incluir Gizmos (3D)"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Pin AnimationPlayer"
-msgstr "Colar Animação"
+msgstr "Fixar AnimationPlayer"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Create New Animation"
@@ -3846,32 +3852,30 @@ msgid "Cross-Animation Blend Times"
msgstr "Tempos de Mistura de Animação Cruzada"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "End"
-msgstr "Fim(ns)"
+msgstr "Fim"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Immediate"
-msgstr ""
+msgstr "Imediato"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Sync"
-msgstr ""
+msgstr "Sincronizar"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "At End"
-msgstr ""
+msgstr "Ao final"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Travel"
-msgstr ""
+msgstr "Viagem"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Start and end nodes are needed for a sub-transition."
-msgstr ""
+msgstr "Nós inicial e final são necessários para uma sub-transição."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "No playback resource set at path: %s."
msgstr "Não está no caminho de recursos."
@@ -3881,34 +3885,35 @@ msgid ""
"RMB to add new nodes.\n"
"Shift+LMB to create connections."
msgstr ""
+"Selecione e mova nós.\n"
+"Clique no botão direito do mouse para adicionar novos nós.\n"
+"Shift + botão esquerdo do mouse para criar conexões."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "Criar Novo %s"
+msgstr "Criar novos nós."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Connect nodes."
-msgstr "Conectar Nodes"
+msgstr "Conectar nós."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Remove selected node or transition"
-msgstr "Remover trilha selecionada."
+msgid "Remove selected node or transition."
+msgstr "Remover nó ou trilha selecionada."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
msgstr ""
+"Alternar a reprodução automática dessa animação ao iniciar, reiniciar ou "
+"zerar."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set the end animation. This is useful for sub-transitions."
-msgstr ""
+msgstr "Define o fim da animação. Isto é útil para subtransições."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "Transição"
+msgstr "Transição: "
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3950,7 +3955,7 @@ msgstr "Reinício (s):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Random Restart (s):"
-msgstr "Reinício Randômico:"
+msgstr "Reinício Aleatório:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Start!"
@@ -3962,10 +3967,6 @@ msgid "Amount:"
msgstr "Quantidade:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "Misturar:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "Misturar 0:"
@@ -4106,14 +4107,12 @@ msgid "Asset Download Error:"
msgstr "Erro no Download do Asset:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading (%s / %s)..."
-msgstr "Baixando"
+msgstr "Baixando (%s / %s)..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading..."
-msgstr "Baixando"
+msgstr "Baixando..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Resolving..."
@@ -4133,21 +4132,19 @@ msgstr "Tentar Novamente"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Download Error"
-msgstr "Erro no Download"
+msgstr "Erro ao baixar"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Download for this asset is already in progress!"
msgstr "Download deste asset já está em progresso!"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "First"
-msgstr "prim"
+msgstr "Primeiro"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Previous"
-msgstr "Guia anterior"
+msgstr "Anterior"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Next"
@@ -4155,7 +4152,7 @@ msgstr "Próximo"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Last"
-msgstr ""
+msgstr "Último"
#: editor/plugins/asset_library_editor_plugin.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -4167,7 +4164,7 @@ msgstr "Todos"
msgid "Plugins"
msgstr "Plugins"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "Ordenar:"
@@ -4303,6 +4300,11 @@ msgstr "Editar CanvaItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Scale CanvasItem"
+msgstr "Editar CanvaItem"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Move CanvasItem"
msgstr "Editar CanvaItem"
@@ -4323,21 +4325,21 @@ msgid "Paste Pose"
msgstr "Colar Pose"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "Ampliar Menos"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
+"Aviso: os filhos de um contêiner têm a posição e o tamanho determinados "
+"apenas pelos pais."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "Restaurar Ampliação"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Ampliar Mais"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr "Modo de Seleção"
@@ -4352,12 +4354,12 @@ msgstr "Alt+Arrastar: Mover"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
msgstr ""
-"Aperte \"v\" para Alterar Pivô, \"Shift+v\" para Arrastar Pivô (enquanto "
-"movendo)."
+"Aperte \"v\" para Alterar Pivô, \"Shift+v\" para Arrastar Pivô (enquanto o "
+"move)."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Alt+RMB: Depth list selection"
-msgstr "Alt+RMB: Lista de seleção de profundidade"
+msgstr "Alt + botão direito do mouse: Lista de seleção de profundidade"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move Mode"
@@ -4368,13 +4370,17 @@ msgid "Rotate Mode"
msgstr "Modo Rotacionar"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr "Modo Escala"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
"(same as Alt+RMB in select mode)."
msgstr ""
"Mostrar uma lista de todos os objetos na posição clicada\n"
-"(mesmo como Alt+RMB no Modo de seleção)."
+"(mesmo como Alt + botão direito do mouse no Modo de seleção)."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Click to change object's rotation pivot."
@@ -4467,6 +4473,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr "Restaura a habilidade dos filhos do objeto de serem selecionados."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "Esqueleto..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "Mostrar Ossos"
@@ -4480,7 +4491,7 @@ msgstr "Limpar Cadeia de IK"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make Custom Bone(s) from Node(s)"
-msgstr ""
+msgstr "Criar esqueleto(s) customizado do(s) nó(s)"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -4503,11 +4514,11 @@ msgstr "Mostrar auxiliadores"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Rulers"
-msgstr "Mostrar réguas"
+msgstr "Mostrar Réguas"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Guides"
-msgstr "Mostrar guias"
+msgstr "Mostrar Guias"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Origin"
@@ -4518,6 +4529,10 @@ msgid "Show Viewport"
msgstr "Mostrar Viewport"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr "Exibir grupo e travar ícones"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr "Centralizar Seleção"
@@ -4530,9 +4545,8 @@ msgid "Layout"
msgstr "Layout"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Insert keys."
-msgstr "Inserir Chaves"
+msgstr "Inserir chaves."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
@@ -4589,8 +4603,16 @@ msgstr ""
"Arrastar e soltar + Alt : Mudar tipo de nó"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr "Criar Polígono 3D"
+msgid "Create Polygon3D"
+msgstr "Criar Polígono3D"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Editar Polígono"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Editar Polígono (Remover Ponto)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
@@ -4692,37 +4714,9 @@ msgid "Item List Editor"
msgstr "Editor de Lista de Itens"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"Nenhum recurso OccluderPolygon2D neste nó.\n"
-"Criar e atribuir um?"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr "Criar Polígono de Oclusão"
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr "Criar um novo polígono do zero."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "Editar polígono existente:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "LMB: Mover Ponto."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr "Ctrl+LMB: Dividir Segmento."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "RMB: Apagar Ponto."
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr "Mesh está vazia!"
@@ -4956,13 +4950,14 @@ msgid "Populate"
msgstr "Popular"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr "Criar Polígono de Navegação"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr "Gerando AABB"
+#, fuzzy
+msgid "Generating Visibility Rect"
+msgstr "Gerar Retângulo de Visibilidade"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -4991,6 +4986,12 @@ msgstr "Limpar Máscara de Emissão"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "Convert to CPUParticles"
+msgstr "Converter para Maíusculo"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr "Partículas"
@@ -5060,13 +5061,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr "Um material processador do tipo 'ParticlesMaterial' é necessário."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
-msgstr "Gerar AABB"
+msgid "Generating AABB"
+msgstr "Gerando AABB"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "Converter para Maíusculo"
+msgid "Generate AABB"
+msgstr "Gerar AABB"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5090,6 +5090,11 @@ msgid "Add Point to Curve"
msgstr "Adicionar Ponto à Curva"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "Fechar Curva"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr "Mover Ponto na Curva"
@@ -5117,6 +5122,11 @@ msgid "Click: Add Point"
msgstr "Clique: Adicionar Ponto"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Left Click: Split Segment (in curve)"
+msgstr "Botão esquerdo: Dividir Segmentos (na curva)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr "Clique Direito: Excluir Ponto"
@@ -5132,11 +5142,6 @@ msgstr "Adicionar Ponto (em espaço vazio)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr "Dividir Segmentos (na curva)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "Excluir Ponto"
@@ -5154,12 +5159,13 @@ msgstr "Opções"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Angles"
-msgstr ""
+msgstr "Espelhar ângulos de controle"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
+#, fuzzy
msgid "Mirror Handle Lengths"
-msgstr ""
+msgstr "Espelhar comprimindo de controle"
#: editor/plugins/path_editor_plugin.cpp
msgid "Curve Point #"
@@ -5193,22 +5199,34 @@ msgstr "Remover Ponto de Controle de Saída"
msgid "Remove In-Control Point"
msgstr "Remover Ponto de Controle de Entrada"
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Dividir Segmentos (na curva)"
+
#: editor/plugins/physical_bone_plugin.cpp
-#, fuzzy
msgid "Move joint"
msgstr "Mover Ponto"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
msgid ""
"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
-msgstr ""
+msgstr "A propriedade esqueleto do Polygon2D não aponta para um nó Skeleton2D."
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Sync bones"
+msgid "Sync Bones"
msgstr "Mostrar Ossos"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+"Sem textura nesse nó.\n"
+"Defina uma textura para poder editar essa região."
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr "Criar Mapa UV"
@@ -5218,58 +5236,63 @@ msgid "Create Polygon & UV"
msgstr "Criar Polígono"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "Criar novo guia horizontal"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "A ação \"%s\" já existe!"
+msgid "Remove Internal Vertex"
+msgstr "Remover Ponto de Controle de Entrada"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Add Split"
-msgstr "Adicionar ponto"
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "Caminho inválido!"
+msgid "Add Custom Polygon"
+msgstr "Editar Polígono"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Remover ponto"
+msgid "Remove Custom Polygon"
+msgstr "Remover Polígono e Ponto"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr "Transformar Mapa UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
+msgid "Transform Polygon"
+msgstr "Transformar polígono"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Open Polygon 2D UV editor."
+msgstr "Editor UV de Polígonos 2D"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
msgstr "Editor UV de Polígonos 2D"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "UV"
-msgstr ""
+msgstr "UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "Editar Polígono"
+msgid "Points"
+msgstr "Ponto"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Splits"
-msgstr "Dividir Caminho"
+msgid "Polygons"
+msgstr "Polígono->UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -5277,13 +5300,8 @@ msgid "Bones"
msgstr "Fazer Ossos"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Create Polygon"
-msgstr "Criar Polígono"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
-msgstr "Mover Ponto"
+msgid "Move Points"
+msgstr "Mover pontos"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
@@ -5310,25 +5328,26 @@ msgid "Scale Polygon"
msgstr "Escalonar Polígono"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "Selecione um item de configuração primeiro!"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Radius:"
-msgstr ""
+msgstr "Raio:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon->UV"
@@ -5343,9 +5362,13 @@ msgid "Clear UV"
msgstr "Limpar UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Settings"
-msgstr "Configurações do GridMap"
+msgstr "Configurações da grade"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "Snap"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
@@ -5356,9 +5379,8 @@ msgid "Grid"
msgstr "Grade"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Configure Grid:"
-msgstr "Configurar o Snap"
+msgstr "Configurar a grade:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -5411,22 +5433,22 @@ msgid "Paste Resource"
msgstr "Colar Recurso"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "Abrir no Editor"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr "Instância:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr "Tipo:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Abrir no Editor"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr "Carregar Recurso"
@@ -5453,34 +5475,35 @@ msgid "Close and save changes?"
msgstr "Fechar e salvar alterações?"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error writing TextFile:"
-msgstr "Erro ao mover arquivo:\n"
+msgstr "Erro ao escrever arquivo:"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr "Erro: Não foi possível carregar o arquivo."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error could not load file."
-msgstr "Não pôde carregar a imagem"
+msgstr "Erro: não pôde carregar o arquivo."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error saving file!"
-msgstr "Erro ao salvar TileSet!"
+msgstr "Erro ao salvar o arquivo!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr "Erro ao salvar tema"
+msgid "Error while saving theme."
+msgstr "Erro ao salvar o tema."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+msgid "Error Saving"
msgstr "Erro ao salvar"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr "Erro ao importar tema"
+msgid "Error importing theme."
+msgstr "Erro ao importar tema."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+msgid "Error Importing"
msgstr "Erro ao importar"
#: editor/plugins/script_editor_plugin.cpp
@@ -5489,20 +5512,26 @@ msgid "New TextFile..."
msgstr "Nova Pasta..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open File"
-msgstr "Abrir um Arquivo"
+msgstr "Abrir um arquivo"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Save File As..."
-msgstr "Salvar Como..."
+msgstr "Salvar como..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme"
msgstr "Importar Tema"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Erro ao salvar tema"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Erro ao salvar"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr "Salvar Tema Como..."
@@ -5512,7 +5541,7 @@ msgstr " Referência de Classes"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
-msgstr ""
+msgstr "Alternar ordenação alfabética da lista de métodos."
#: editor/plugins/script_editor_plugin.cpp
msgid "Sort"
@@ -5543,9 +5572,8 @@ msgid "File"
msgstr "Arquivo"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "New TextFile"
-msgstr "Ver Arquivos"
+msgid "Open..."
+msgstr "Abrir..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5560,11 +5588,7 @@ msgid "Copy Script Path"
msgstr "Copiar Caminho do Script"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr "Mostrar no Sistema de Arquivos"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+msgid "History Previous"
msgstr "Anterior no Histórico"
#: editor/plugins/script_editor_plugin.cpp
@@ -5577,6 +5601,10 @@ msgid "Theme"
msgstr "Tema"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme..."
+msgstr "Importar Tema..."
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
msgstr "Recarregar Tema"
@@ -5585,10 +5613,6 @@ msgid "Save Theme"
msgstr "Salvar Tema"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "Salvar Tema Como"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "Fechar Docs"
@@ -5635,7 +5659,8 @@ msgid "Keep Debugger Open"
msgstr "Manter Depurador Aberto"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+#, fuzzy
+msgid "Debug with External Editor"
msgstr "Depurar com um editor externo"
#: editor/plugins/script_editor_plugin.cpp
@@ -5643,10 +5668,6 @@ msgid "Open Godot online documentation"
msgstr "Abrir a documentação online da Godot"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr "Pesquise na hierarquia da classe."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Pesquise a documentação de referência."
@@ -5683,30 +5704,24 @@ msgid "Debugger"
msgstr "Depurador"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search results"
-msgstr "Pesquisar Ajuda"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "Pesquisar Classes"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-"Scripts embutidos só podem ser editados quando a cena a qual pertencem está "
-"carregada"
+msgid "Search Results"
+msgstr "Pesquisar resultados"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Line"
-msgstr "Linha:"
+msgstr "Linha"
#: editor/plugins/script_text_editor.cpp
msgid "(ignore)"
-msgstr ""
+msgstr "(ignore)"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function"
+msgstr "Ir para Função"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr "Padrão"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
@@ -5739,11 +5754,7 @@ msgstr "Capitalizar"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Syntax Highlighter"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
+msgstr "Realce de sintaxe"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
@@ -5796,11 +5807,13 @@ msgid "Trim Trailing Whitespace"
msgstr "Apagar Espaços em Branco"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+#, fuzzy
+msgid "Convert Indent to Spaces"
msgstr "Converter Indentação Para Espaços"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+#, fuzzy
+msgid "Convert Indent to Tabs"
msgstr "Converter Indentação Para Tabs"
#: editor/plugins/script_text_editor.cpp
@@ -5817,37 +5830,31 @@ msgid "Remove All Breakpoints"
msgstr "Remover Todos os Pontos de Interrupção"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
+#, fuzzy
+msgid "Go to Next Breakpoint"
msgstr "Ir ao Próximo Ponto de Interrupção"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
+#, fuzzy
+msgid "Go to Previous Breakpoint"
msgstr "Ir ao Ponto de Interrupção Anterior"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr "Converter para Maíusculo"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr "Converter Para Minúsculo"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr "Encontrar Anterior"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Find in files..."
-msgstr "Filtrar Arquivos..."
+msgid "Find in Files..."
+msgstr "Procurar nos Arquivos..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+#, fuzzy
+msgid "Go to Function..."
msgstr "Ir para Função..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
-msgstr "Ir para linha..."
+msgid "Go to Line..."
+msgstr "Ir para Linha..."
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
@@ -5858,13 +5865,13 @@ msgid "Shader"
msgstr "Shader"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
+#, fuzzy
msgid "This skeleton has no bones, create some children Bone2D nodes."
-msgstr ""
+msgstr "Esse esqueleto não tem ossos, crie alguns nós Bone2D filhos."
#: editor/plugins/skeleton_2d_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton2D"
-msgstr "Esqueleto..."
+msgstr "Esqueleto2D"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Make Rest Pose (From Bones)"
@@ -5880,9 +5887,8 @@ msgid "Create physical bones"
msgstr "Criar Malha de Navegação"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton"
-msgstr "Esqueleto..."
+msgstr "Esqueleto"
#: editor/plugins/skeleton_editor_plugin.cpp
#, fuzzy
@@ -5920,7 +5926,7 @@ msgstr "Transformação do Eixo-Z."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Plane Transform."
-msgstr "Transformação do Plano de Visão."
+msgstr "Ver Transformada do Plano."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scaling: "
@@ -5943,6 +5949,14 @@ msgid "Animation Key Inserted."
msgstr "Chave de Animação Inserida."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr "Tom"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr "Objetos Desenhados"
@@ -6027,9 +6041,8 @@ msgid "This operation requires a single selected node."
msgstr "Essa operação requer um único nó selecionado."
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Lock View Rotation"
-msgstr "Visualizar Informações"
+msgstr "Bloquear Rotação da Visão"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Normal"
@@ -6076,9 +6089,8 @@ msgid "Doppler Enable"
msgstr "Habilitar Doppler"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Cinematic Preview"
-msgstr "Criando Previsualizações das Malhas"
+msgstr "Pré-visualização Cinemática"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
@@ -6109,6 +6121,11 @@ msgid "Freelook Speed Modifier"
msgstr "Modificador de velocidade da Visão Livre"
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "Visualizar Informações"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "Diálogo XForm"
@@ -6123,8 +6140,8 @@ msgid ""
"Alt+RMB: Depth list selection"
msgstr ""
"Arrastar: Rotacionar\n"
-"Alt+Arrastar: Mover\n"
-"Alt+RMB: Lista de Profundidade"
+"Alt + Arrastar: Mover\n"
+"Alt + botão direito do mouse: Lista de Profundidade"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Move Mode (W)"
@@ -6211,11 +6228,6 @@ msgid "Tool Scale"
msgstr "Ferramenta Escalar"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap To Floor"
-msgstr "Encaixar na grade"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Alternar Visão Livre"
@@ -6333,6 +6345,10 @@ msgstr "Pré"
msgid "Post"
msgstr "Pós"
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
msgid "Sprite is empty!"
@@ -6363,7 +6379,7 @@ msgstr "Criar Malha de Contorno"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Simplification: "
-msgstr ""
+msgstr "Simplificação: "
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
@@ -6376,9 +6392,8 @@ msgid "Update Preview"
msgstr "Visualização do Atlas"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Settings:"
-msgstr "Configurações"
+msgstr "Configurações:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
@@ -6453,12 +6468,17 @@ msgid "Set Region Rect"
msgstr "Definir Retângulo de Região"
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr "Definir Margem"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr "Modo Snap:"
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
-msgstr "<Nenhum>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
+msgstr "Nenhum"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Pixel Snap"
@@ -6623,6 +6643,11 @@ msgid "Fix Invalid Tiles"
msgstr "Nome Inválido."
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "Centralizar Seleção"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr "Pintar TileMap"
@@ -6668,34 +6693,38 @@ msgid "Pick Tile"
msgstr "Pegar Tile"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
-msgid "Move Selection"
-msgstr "Remover Seleção"
+msgid "Copy Selection"
+msgstr "Copiar Seleção"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate left"
+msgstr "Rotacionar para a esquerda"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr "Rotacionar 0 degraus"
+msgid "Rotate right"
+msgstr "Rotacionar para a direita"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr "Rotacionar 90 degraus"
+msgid "Flip horizontally"
+msgstr "Girar horizontalmente"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
-msgstr "Rotacionar 180 degraus"
+msgid "Flip vertically"
+msgstr "Girar verticalmente"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
-msgstr "Rotacionar 270 degraus"
+#, fuzzy
+msgid "Clear transform"
+msgstr "Transformação"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr "Adicionar Nó(s) a Partir da Ãrvore"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr "Remover a entrada atual"
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6707,36 +6736,60 @@ msgid "Merge from Scene"
msgstr "Fundir a partir de Cena"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
msgstr ""
-"Selecione o sub-tile para usar como ícone, isso também vai ser usado em "
-"vinculamentos de autotiles inválidos."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "Colar Animação"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "RMB: Apagar Pontos"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new polygon."
+msgstr "Criar um novo polígono."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "You haven't selected a texture to remove."
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
-msgstr "Criar a partir de cena?"
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "Remover Texture Selecionada e TODAS PEÇAS que a usam?"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "You haven't selected a texture to remove."
+msgstr "Você não selecionou uma textura para remover."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
msgstr "Fundir a partir de cena?"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
-msgstr ""
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Remover Modelo"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
+msgstr "%s arquivo(s) não adicionado(s) pois já estava(m) na lista."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -6746,13 +6799,8 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
-"Click on another Tile to edit it."
-msgstr ""
-"LMB: ligar bit.\n"
-"RMB: desligar bit."
+msgid "Delete selected Rect."
+msgstr "Excluir arquivos selecionados?"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -6762,6 +6810,20 @@ msgid ""
msgstr "Selecione o sub-tile editado atual."
#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete polygon."
+msgstr "Excluir polígono."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid ""
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
+"Click on another Tile to edit it."
+msgstr ""
+"LMB: ligar bit.\n"
+"RMB: desligar bit."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid ""
"Select sub-tile to use as icon, this will be also used on invalid autotile "
@@ -6780,11 +6842,100 @@ msgstr "Selecione o sub-tile para alterar sua prioridade."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr "Selecione o sub-tile para alterar sua prioridade."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Set Tile Region"
+msgstr "Definir Retângulo de Região"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Criar Pasta"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "Editar Filtros"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Editar polígono existente:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Editar Polígono"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Criar Polígono de Navegação"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "Colar Animação"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Remover Modelo"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "Remover Polígono e Ponto"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "Criar Polígono de Oclusão"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "Criar Polígono de Navegação"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "Editar Filtros"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Criar Polígono de Navegação"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Criar Polígono de Oclusão"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "This property can't be changed."
-msgstr "Essa operação não pode ser realizada sem uma cena."
+msgstr "Esta propriedade não pode ser alterada."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
+#, fuzzy
+msgid "TileSet"
msgstr "Tile Set"
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6825,14 +6976,27 @@ msgstr ""
"corrompidos:"
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr "Exportando tudo"
+
+#: editor/project_export.cpp
msgid "Presets"
-msgstr "Predefiniçoes"
+msgstr "Predefinições"
#: editor/project_export.cpp editor/project_settings_editor.cpp
msgid "Add..."
msgstr "Adicionar..."
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "Preset de Exportação:"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr "Recursos"
@@ -6854,7 +7018,7 @@ msgstr "Modo de Exportação:"
#: editor/project_export.cpp
msgid "Resources to export:"
-msgstr "Recursos para Exportar:"
+msgstr "Recursos para exportar:"
#: editor/project_export.cpp
msgid ""
@@ -6867,8 +7031,8 @@ msgstr ""
msgid ""
"Filters to exclude files from project (comma separated, e.g: *.json, *.txt)"
msgstr ""
-"Filtros para excluir da exportação (separados por vírgula, e.g.: *.json, *."
-"txt)"
+"Filtros para excluir arquivos do projeto (separados por vírgula, ex.: *."
+"json, *.txt)"
#: editor/project_export.cpp
msgid "Patches"
@@ -6891,10 +7055,48 @@ msgid "Feature List:"
msgstr "Lista de Funcionalidades:"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "Novo Script"
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "Modo de Exportação de Scripts:"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr "Texto"
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr "Compilado"
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "Criptografado (forneça chave abaixo)"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr "Chave de Criptografia Inválida (é necessário 64 caracteres)"
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "Chave de Criptografia dos Scripts (256-bit como hex):"
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr "Exportar PCK/Zip"
#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr "Modo de exportação?"
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr "Exportar tudo"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr "Modelos de exportação para esta plataforma não foram encontrados:"
@@ -6907,23 +7109,21 @@ msgid "The path does not exist."
msgstr "O caminho não existe."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
msgstr ""
-"Por favor, escolha uma pasta que não contenha um arquivo 'project.godot'."
+"Projeto '.zip' inválido, o projeto não contém um arquivo 'project.godot'."
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "Por favor, escolha uma pasta vazia."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "Por favor, escolha um arquivo 'project.godot'."
+msgstr "Por favor, escolha um arquivo 'project.godot' ou '.zip'."
#: editor/project_manager.cpp
msgid "Directory already contains a Godot project."
-msgstr ""
+msgstr "O diretório já contém um projeto Godot."
#: editor/project_manager.cpp
msgid "Imported Project"
@@ -7014,7 +7214,6 @@ msgid "Project Path:"
msgstr "Caminho do Projeto:"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Project Installation Path:"
msgstr "Caminho do Projeto:"
@@ -7027,14 +7226,43 @@ msgid "Unnamed Project"
msgstr "Projeto Sem Nome"
#: editor/project_manager.cpp
-msgid "Can't open project"
-msgstr "Não é possível abrir o projeto"
+msgid "Can't open project at '%s'."
+msgstr "Não é possível abrir o projeto em '%s'."
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
msgstr "Tem certeza de que quer abrir mais de um projeto?"
#: editor/project_manager.cpp
+#, fuzzy
+msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+"As configurações do projeto foram geradas por uma versão antiga, e precisam "
+"ser convertidas para esta versão:\n"
+"\n"
+"%s\n"
+"\n"
+"Você deseja realizar a conversão?\n"
+"Aviso: Não será mais possível você abrir o projeto com versões mais antigas."
+
+#: editor/project_manager.cpp
+#, fuzzy
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+"As configurações do projeto foram geradas por uma versão do Godot mais nova, "
+"cuja configurações não são compatíveis com esta versão."
+
+#: editor/project_manager.cpp
msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
@@ -7372,17 +7600,13 @@ msgstr "Configurações do Projeto (project.godot)"
msgid "General"
msgstr "Geral"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr "Propriedade:"
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr "Sobrescrever Para..."
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Editor must be restarted for changes to take effect"
-msgstr ""
+msgstr "O editor deve ser reiniciado para que as mudanças surtam efeito"
#: editor/project_settings_editor.cpp
msgid "Input Map"
@@ -7508,10 +7732,6 @@ msgstr "Escolha um Nó"
msgid "Bit %d, val %d."
msgstr "Bit %d, val %d."
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr "Propriedades:"
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr "Selecionar Propriedade"
@@ -7539,44 +7759,40 @@ msgstr "Renomear"
#: editor/rename_dialog.cpp
msgid "Prefix"
-msgstr ""
+msgstr "Prefixo"
#: editor/rename_dialog.cpp
+#, fuzzy
msgid "Suffix"
-msgstr ""
+msgstr "Sufixo"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Advanced options"
-msgstr "Opções da Encaixe"
+msgstr "Opções avançadas"
#: editor/rename_dialog.cpp
msgid "Substitute"
-msgstr ""
+msgstr "Substituir"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node name"
-msgstr "Nome do nó:"
+msgstr "Nome do nó"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node type"
-msgstr "Localizar Tipo de Nó"
+msgstr "Tipo de nó"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Current scene name"
-msgstr "Cena Atual"
+msgstr "Nome da cena atual"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Root node name"
-msgstr "Nome do Nó Raíz:"
+msgstr "Nome do nó raiz"
#: editor/rename_dialog.cpp
msgid ""
@@ -7594,26 +7810,29 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid "Initial value for the counter"
-msgstr ""
+msgstr "Valor inicial para o contador"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Step"
-msgstr "Passo:"
+msgstr "Passo"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
-msgstr ""
+#, fuzzy
+msgid "Amount by which counter is incremented for each node"
+msgstr "Quantidade pela qual contador é incrementado para cada nó"
#: editor/rename_dialog.cpp
msgid "Padding"
-msgstr ""
+msgstr "Preenchimento"
#: editor/rename_dialog.cpp
+#, fuzzy
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
+"Número mínimo de dígitos para o contador.\n"
+"Dígitos perdidos são preenchidos com zeros."
#: editor/rename_dialog.cpp
#, fuzzy
@@ -7621,9 +7840,8 @@ msgid "Regular Expressions"
msgstr "Alterar Expressão"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Post-Process"
-msgstr "Script de Pós-Processamento:"
+msgstr "Pós-Processamento"
#: editor/rename_dialog.cpp
msgid "Keep"
@@ -7656,7 +7874,7 @@ msgstr "Maiúscula"
msgid "Reset"
msgstr "Redefinir Ampliação"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr "Erro"
@@ -7717,6 +7935,10 @@ msgid "Instance Scene(s)"
msgstr "Instanciar Cena(s)"
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "Instânciar Cena Filha"
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr "Remover Script"
@@ -7753,6 +7975,12 @@ msgid "Save New Scene As..."
msgstr "Salvar Nova Cena Como..."
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr "Filhos Editáveis"
@@ -7765,9 +7993,8 @@ msgid "Make Local"
msgstr "Tornar Local"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "Criar Nó"
+msgstr "Criar nó raiz:"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -7830,6 +8057,11 @@ msgid "Clear Inheritance"
msgstr "Limpar Herança"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Open documentation"
+msgstr "Abrir a documentação online da Godot"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr "Excluir Nó(s)"
@@ -7838,15 +8070,16 @@ msgid "Add Child Node"
msgstr "Adicionar Nó Filho"
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
-msgstr "Instânciar Cena Filha"
-
-#: editor/scene_tree_dock.cpp
msgid "Change Type"
msgstr "Mudar Tipo"
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Extend Script"
+msgstr "Abrir script"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Make Scene Root"
msgstr "Nova Raiz de Cena"
@@ -8011,6 +8244,11 @@ msgid "Path is empty"
msgstr "O caminho está vazio"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Filename is empty"
+msgstr "Caminho de salvamento vazio!"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr "O caminho não é local"
@@ -8099,20 +8337,9 @@ msgid "Bytes:"
msgstr "Bytes:"
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr "Aviso"
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr "Erro:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr "Origem:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
-msgstr "Função:"
+#, fuzzy
+msgid "Stack Trace"
+msgstr "Pilha de Quadros"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8143,18 +8370,6 @@ msgid "Stack Frames"
msgstr "Pilha de Quadros"
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr "Variável"
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr "Erros:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr "Pilha de Rastreamento (se aplicável):"
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr "Profilador"
@@ -8358,7 +8573,8 @@ msgid "GDNative"
msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+#, fuzzy
+msgid "Step argument is zero!"
msgstr "o argumento step é zero!"
#: modules/gdscript/gdscript_functions.cpp
@@ -8582,12 +8798,8 @@ msgid "End of inner exception stack trace"
msgstr "Fim da pilha de rastreamento de exceção interna"
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr "Precalcular!"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
-msgstr "Preparar a malha de navegação."
+msgid "Bake NavMesh"
+msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8868,6 +9080,10 @@ msgid "Base Type:"
msgstr "Tipo de Base:"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "Membros:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "Nodes Disponíveis:"
@@ -8972,12 +9188,13 @@ msgid "Search VisualScript"
msgstr "Remover Nó VisualScript"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
-msgstr "Obter"
+msgid "Get %s"
+msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
-msgstr ""
+#, fuzzy
+msgid "Set %s"
+msgstr "Fixar "
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -9072,6 +9289,12 @@ msgstr ""
"Uma forma deve ser fornecida para que o nó CollisionShape2D funcione. Por "
"favor, crie um recurso de forma para ele!"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -9122,6 +9345,12 @@ msgstr ""
"Um material para processar partículas não foi atribuído, então nenhum "
"comportamento será aplicado."
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -9264,6 +9493,18 @@ msgstr ""
"Uma forma deve ser fornecida para que o nó CollisionShape funcione. Por "
"favor, crie um recurso de forma a ele!"
+#: scene/3d/cpu_particles.cpp
+#, fuzzy
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+"Nada está visível porque as meshes não foram atribuídas a passes de desenho."
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr "Planejando Malhas"
@@ -9288,6 +9529,30 @@ msgid ""
msgstr ""
"Nada está visível porque as meshes não foram atribuídas a passes de desenho."
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+"PathFollow2D apenas funciona quando definido como filho de um nó Path2D."
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+"PathFollow2D apenas funciona quando definido como filho de um nó Path2D."
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9328,7 +9593,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
#, fuzzy
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9357,18 +9622,16 @@ msgid "On BlendTree node '%s', animation not found: '%s'"
msgstr ""
#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "Ferramentas de Animação"
+msgstr "Animação não encontrada: '%s'"
#: scene/animation/animation_tree.cpp
msgid "In node '%s', invalid animation: '%s'."
msgstr ""
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "ERRO: Nome de animação inválido!"
+msgstr "Animação inválida: '%s'."
#: scene/animation/animation_tree.cpp
#, fuzzy
@@ -9393,6 +9656,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr "Ãrvore de Animação é inválida."
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr "Modo Bruto"
@@ -9409,10 +9676,6 @@ msgstr "Alerta!"
msgid "Please Confirm..."
msgstr "Confirme Por Favor..."
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr "Selecionar esta Pasta"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9423,6 +9686,10 @@ msgstr ""
"popup*(). Torná-los visíveis para editar não causa problema, mas eles serão "
"ocultados ao rodar a cena."
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9478,11 +9745,6 @@ msgstr "Tamanho de fonte inválido."
msgid "Input"
msgstr "Adicionar Entrada"
-#: scene/resources/visual_shader.cpp
-#, fuzzy
-msgid "None"
-msgstr "<Nenhum>"
-
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
@@ -9490,15 +9752,222 @@ msgstr "Origem inválida!"
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
-msgstr ""
+msgstr "Atribuição à função."
#: servers/visual/shader_language.cpp
+#, fuzzy
msgid "Assignment to uniform."
-msgstr ""
+msgstr "Atribuição à uniforme."
#: servers/visual/shader_language.cpp
+#, fuzzy
msgid "Varyings can only be assigned in vertex function."
-msgstr ""
+msgstr "Variáveis só podem ser atribuídas na função de vértice."
+
+#, fuzzy
+#~ msgid "Split already exists."
+#~ msgstr "A ação \"%s\" já existe!"
+
+#, fuzzy
+#~ msgid "Add Split"
+#~ msgstr "Adicionar ponto"
+
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr "Caminho inválido!"
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "Remover ponto"
+
+#, fuzzy
+#~ msgid "Poly"
+#~ msgstr "Editar Polígono"
+
+#, fuzzy
+#~ msgid "Splits"
+#~ msgstr "Dividir Caminho"
+
+#, fuzzy
+#~ msgid "Select a split to erase it."
+#~ msgstr "Selecione um item de configuração primeiro!"
+
+#~ msgid "No name provided"
+#~ msgstr "Nenhum nome fornecido"
+
+#~ msgid "Add Node.."
+#~ msgstr "Adicionar Nó.."
+
+#~ msgid "Create from scene?"
+#~ msgstr "Criar a partir de cena?"
+
+#~ msgid "Create Poly"
+#~ msgstr "Criar Polígono"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "Criar um novo polígono do zero"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "Ampliar Menos"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "Ampliar Mais"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "Criar Polígono 3D"
+
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "Nenhum recurso OccluderPolygon2D neste nó.\n"
+#~ "Criar e atribuir um?"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "LMB: Mover Ponto."
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "Ctrl+LMB: Dividir Segmento."
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "RMB: Apagar Ponto."
+
+#, fuzzy
+#~ msgid "New TextFile"
+#~ msgstr "Ver Arquivos"
+
+#~ msgid "Save Theme As"
+#~ msgstr "Salvar Tema Como"
+
+#~ msgid "<None>"
+#~ msgstr "<Nenhum>"
+
+#~ msgid ""
+#~ "Select sub-tile to use as icon, this will be also used on invalid "
+#~ "autotile bindings."
+#~ msgstr ""
+#~ "Selecione o sub-tile para usar como ícone, isso também vai ser usado em "
+#~ "vinculamentos de autotiles inválidos."
+
+#~ msgid "Zoom:"
+#~ msgstr "Ampliação:"
+
+#~ msgid "Are you sure you want to remove all connections from the \""
+#~ msgstr "Tem certeza que quer remover todas conexões do \""
+
+#~ msgid "Class List:"
+#~ msgstr "Lista de Classes:"
+
+#~ msgid "Search Classes"
+#~ msgstr "Pesquisar Classes"
+
+#~ msgid "Public Methods"
+#~ msgstr "Métodos Públicos"
+
+#~ msgid "Public Methods:"
+#~ msgstr "Métodos Públicos:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "Itens do Tema de GUI"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "Itens do Tema de GUI:"
+
+#~ msgid "Property: "
+#~ msgstr "Propriedade: "
+
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "Alternar status Favorito da pasta."
+
+#~ msgid "Show current scene file."
+#~ msgstr "Mostrar o arquivo da cena atual."
+
+#~ msgid "Enter tree-view."
+#~ msgstr "Entrar em visualização em árvore."
+
+#, fuzzy
+#~ msgid "Whole words"
+#~ msgstr "Palavras inteiras"
+
+#~ msgid "Match case"
+#~ msgstr "Corresponder Caso"
+
+#~ msgid "Filter: "
+#~ msgstr "Filtro: "
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#~ msgid "Show In File System"
+#~ msgstr "Mostrar no Sistema de Arquivos"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "Pesquise na hierarquia da classe."
+
+#, fuzzy
+#~ msgid "Search in files"
+#~ msgstr "Pesquisar Classes"
+
+#~ msgid ""
+#~ "Built-in scripts can only be edited when the scene they belong to is "
+#~ "loaded"
+#~ msgstr ""
+#~ "Scripts embutidos só podem ser editados quando a cena a qual pertencem "
+#~ "está carregada"
+
+#~ msgid "Convert To Uppercase"
+#~ msgstr "Converter para Maíusculo"
+
+#~ msgid "Convert To Lowercase"
+#~ msgstr "Converter Para Minúsculo"
+
+#, fuzzy
+#~ msgid "Snap To Floor"
+#~ msgstr "Encaixar na grade"
+
+#~ msgid "Rotate 0 degrees"
+#~ msgstr "Rotacionar 0 degraus"
+
+#~ msgid "Rotate 90 degrees"
+#~ msgstr "Rotacionar 90 degraus"
+
+#~ msgid "Rotate 180 degrees"
+#~ msgstr "Rotacionar 180 degraus"
+
+#~ msgid "Rotate 270 degrees"
+#~ msgstr "Rotacionar 270 degraus"
+
+#~ msgid "Warning"
+#~ msgstr "Aviso"
+
+#~ msgid "Error:"
+#~ msgstr "Erro:"
+
+#~ msgid "Source:"
+#~ msgstr "Origem:"
+
+#~ msgid "Function:"
+#~ msgstr "Função:"
+
+#~ msgid "Variable"
+#~ msgstr "Variável"
+
+#~ msgid "Errors:"
+#~ msgstr "Erros:"
+
+#~ msgid "Stack Trace (if applicable):"
+#~ msgstr "Pilha de Rastreamento (se aplicável):"
+
+#~ msgid "Bake!"
+#~ msgstr "Precalcular!"
+
+#~ msgid "Bake the navigation mesh."
+#~ msgstr "Preparar a malha de navegação."
+
+#~ msgid "Get"
+#~ msgstr "Obter"
#~ msgid "Change Scalar Constant"
#~ msgstr "Alterar Constante Escalar"
@@ -9704,9 +10173,6 @@ msgstr ""
#~ msgid "Run Script"
#~ msgstr "Rodar Script"
-#~ msgid "Save the currently edited resource."
-#~ msgstr "Salva o recurso editado atualmente."
-
#~ msgid "Stop Profiling"
#~ msgstr "Parar Profiling"
@@ -10005,9 +10471,6 @@ msgstr ""
#~ msgid "Could not save atlas subtexture:"
#~ msgstr "Não foi possível salvar Subtextura do Atlas:"
-#~ msgid "Exporting for %s"
-#~ msgstr "Exportando para %s"
-
#~ msgid "Setting Up..."
#~ msgstr "Ajustando..."
@@ -10113,9 +10576,6 @@ msgstr ""
#~ msgid "Source Font:"
#~ msgstr "Fonte Origem:"
-#~ msgid "Source Font Size:"
-#~ msgstr "Tamanho da Fonte de Origem:"
-
#~ msgid "Dest Resource:"
#~ msgstr "Recurso Destino:"
@@ -10194,9 +10654,6 @@ msgstr ""
#~ msgid "Start(s)"
#~ msgstr "Início(s)"
-#~ msgid "Filters"
-#~ msgstr "Filtros"
-
#~ msgid "Source path is empty."
#~ msgstr "Caminho de origem está vazio."
@@ -10468,15 +10925,9 @@ msgstr ""
#~ msgid "Stereo"
#~ msgstr "Estéreo"
-#~ msgid "Pitch"
-#~ msgstr "Pitch"
-
#~ msgid "Window"
#~ msgstr "Janela"
-#~ msgid "Move Right"
-#~ msgstr "Mover para Direita"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "Escalonando para %s%%."
@@ -10807,21 +11258,6 @@ msgstr ""
#~ msgid "Trailing Silence:"
#~ msgstr "Silêncio no Fim:"
-#~ msgid "Script Export Mode:"
-#~ msgstr "Modo de Exportação de Scripts:"
-
-#~ msgid "Text"
-#~ msgstr "Texto"
-
-#~ msgid "Compiled"
-#~ msgstr "Compilado"
-
-#~ msgid "Encrypted (Provide Key Below)"
-#~ msgstr "Criptografado (forneça chave abaixo)"
-
-#~ msgid "Script Encryption Key (256-bits as hex):"
-#~ msgstr "Chave de Criptografia dos Scripts (256-bit como hex):"
-
#~ msgid "Export Project PCK"
#~ msgstr "Exportar PCK do Projeto"
@@ -10831,9 +11267,6 @@ msgstr ""
#~ msgid "Project Export"
#~ msgstr "Exportação de Projeto"
-#~ msgid "Export Preset:"
-#~ msgstr "Preset de Exportação:"
-
#~ msgid "BakedLightInstance does not contain a BakedLight resource."
#~ msgstr "BakedLightInstance não contém um recurso BakedLight ."
@@ -10904,13 +11337,6 @@ msgstr ""
#~ msgid "Scale Region Editor"
#~ msgstr "Editor de Região de Escala"
-#~ msgid ""
-#~ "No texture in this node.\n"
-#~ "Set a texture to be able to edit region."
-#~ msgstr ""
-#~ "Sem textura nesse nó.\n"
-#~ "Defina uma textura para poder editar essa região."
-
#~ msgid "Inherit Scene"
#~ msgstr "Herdar Cena"
diff --git a/editor/translations/pt_PT.po b/editor/translations/pt_PT.po
index 9a4a70a1fc..198fa4ddb0 100644
--- a/editor/translations/pt_PT.po
+++ b/editor/translations/pt_PT.po
@@ -1,30 +1,33 @@
# Portuguese (Portugal) translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# António Sarmento <antonio.luis.sarmento@gmail.com>, 2016.
# Carlos Vieira <carlos.vieira@gmail.com>, 2017.
# João <joao@nogordio.com>, 2018.
# João Graça <jgraca95@gmail.com>, 2017.
-# João Lopes <linux-man@hotmail.com>, 2017-2018.
+# João Lopes <linux-man@hotmail.com>, 2017-2018, 2019.
# Miguel Gomes <miggas09@gmail.com>, 2017.
# Paulo Caldeira <paucal@gmail.com>, 2018.
# Pedro Gomes <pedrogomes1698@gmail.com>, 2017.
# Rueben Stevens <supercell03@gmail.com>, 2017.
# SARDON <fabio3_Santos@hotmail.com>, 2017.
# Vinicius Gonçalves <viniciusgoncalves21@gmail.com>, 2017.
+# ssantos <ssantos@web.de>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-06-10 01:02+0000\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2019-01-13 15:07+0000\n"
"Last-Translator: João Lopes <linux-man@hotmail.com>\n"
"Language-Team: Portuguese (Portugal) <https://hosted.weblate.org/projects/"
"godot-engine/godot/pt_PT/>\n"
"Language: pt_PT\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.0\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -32,7 +35,7 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr "Tipo de argumento inválido para convert(), use constantes TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
@@ -40,34 +43,31 @@ msgstr ""
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Entrada inválida %i (não passada) na expressão"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "self não pode ser usado porque a instância é nula (não passada)"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "Nome de Propriedade índice '%s' inválido em Nó %s."
+msgstr "Operandos inválidos para operador %s, %s e %s."
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid index of type %s for base type %s"
-msgstr "Nome de Propriedade índice '%s' inválido em Nó %s."
+msgstr "Ãndice inválido do tipo %s para tipo base %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "Ãndice nomeado '%s' inválido para base tipo %s"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid arguments to construct '%s'"
-msgstr ": Argumento inválido de tipo: "
+msgstr "Argumentos inválidos para construir '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "Em chamada para '%s':"
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -76,27 +76,23 @@ msgstr "Livre"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "Equilibrado"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Mirror"
-msgstr "Espelho X"
+msgstr "Espelhar"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "Inserir Chave"
+msgstr "Inserir Chave Aqui"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "Duplicar Seleção"
+msgstr "Duplicar Chave(s) Selecionada(s)"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "Apagar Selecionados"
+msgstr "Apagar Chave(s) Selecionada(s)"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -127,46 +123,40 @@ msgid "Anim Change Call"
msgstr "Anim Mudar Chamada"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Property Track"
-msgstr "Propriedade:"
+msgstr "Pista de Propriedades"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "3D Transform Track"
-msgstr "Tipo de transformação"
+msgstr "Pista de Transformação 3D"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "Chamar Pista Método"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "Pista Curva Bezier"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "Pista de Reprodução de Ãudio"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Playback Track"
-msgstr "Parar reprodução da Animação. (S)"
+msgstr "Pista de Reprodução de Animação"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
-msgstr "Anim Adicionar Pista"
+msgstr "Adicionar Pista"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Length Time (seconds)"
-msgstr "Duração da Animação (em segundos)."
+msgstr "Duração da Animação (segundos)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "Zoom da Animação."
+msgstr "Loop da Animação"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -174,41 +164,36 @@ msgid "Functions:"
msgstr "Funções:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Audio Clips:"
-msgstr "Audição de áudio"
+msgstr "Clips Ãudio:"
#: editor/animation_track_editor.cpp
msgid "Anim Clips:"
-msgstr ""
+msgstr "Clips Anim:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Toggle this track on/off."
-msgstr "Alternar modo livre de distrações."
+msgstr "Alternar esta pista on/off."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "Modo Atualização (Como esta propriedade é definida)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Interpolation Mode"
-msgstr "Nó Animation"
+msgstr "Modo de Interpolação"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "Modo Loop Wrap (interpola o fim com o início do loop)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "Remover Pista selecionada."
+msgstr "Remover esta Pista."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "Tempo X-Fade (s):"
+msgstr "Tempo (s): "
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -223,13 +208,12 @@ msgid "Trigger"
msgstr "Gatilho"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Capture"
-msgstr "Características"
+msgstr "Capturar"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "Mais próximo"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
@@ -238,15 +222,15 @@ msgstr "Linear"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr ""
+msgstr "Cúbico"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
-msgstr ""
+msgstr "Prender Interp Loop"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "Enrolar Interp Loop"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -254,14 +238,12 @@ msgid "Insert Key"
msgstr "Inserir Chave"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "Duplicar Nó(s)"
+msgstr "Duplicar Chave(s)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "Apagar Nó(s)"
+msgstr "Apagar Chave(s)"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -279,7 +261,6 @@ msgstr "Criar %d NOVAS Pistas e inserir Chaves?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -292,6 +273,8 @@ msgstr "Anim Inserir"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
msgstr ""
+"AnimationPlayer não se pode animar a ele próprio, apenas a outros "
+"executantes."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
@@ -307,7 +290,7 @@ msgstr "Anim Inserir Chave"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr ""
+msgstr "Pistas de Transformação só se aplicam a nós de base Espacial."
#: editor/animation_track_editor.cpp
msgid ""
@@ -316,44 +299,49 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"Pistas Ãudio só podem apontar a nós de tipo:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "Pistas de Animação só podem apontar a nós AnimationPlayer."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
msgstr ""
+"Um reprodutor de animação não se pode animar a ele próprio, apenas a outros "
+"reprodutores."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "Não é possível adicionar nova pista sem uma raíz"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "Caminho da pista é inválido, não se consegue adicionar uma chave."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "Pista não do tipo Spatial, não se consegue inserir chave"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
msgstr ""
+"Caminho da pista é inválido, não se consegue adicionar uma chave método."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Method not found in object: "
-msgstr "VariableGet não encontrada no Script: "
+msgstr "Método não encontrado no objeto: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
msgstr "Anim Mover Chaves"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clipboard is empty"
-msgstr "Ãrea de Transferência está vazia!"
+msgstr "Ãrea de Transferência está vazia"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
@@ -363,24 +351,23 @@ msgstr "Anim Escalar Chaves"
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
msgstr ""
+"Esta opção não funciona para edição de Bezier, dado que é uma única faixa."
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "Apenas mostrar faixas de nós selecionados na árvore."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr ""
+msgstr "Agrupar faixas por nó ou exibi-las como lista simples."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap (s): "
-msgstr "Passos (s):"
+msgstr "Ajuste (s): "
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "Ãrvore de Animação válida."
+msgstr "Valor passo da Animação."
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -392,19 +379,16 @@ msgid "Edit"
msgstr "Editar"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "AnimationTree"
+msgstr "Propriedades da Animação."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "Copiar Parâmetros"
+msgstr "Copiar Pistas"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "Colar Parâmetros"
+msgstr "Colar Pistas"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -414,8 +398,7 @@ msgstr "Escalar Selecção"
msgid "Scale From Cursor"
msgstr "Escalar Partir do Cursor"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Duplicar Seleção"
@@ -424,17 +407,16 @@ msgid "Duplicate Transposed"
msgstr "Duplicar Transposto"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
-msgstr "Apagar Selecionados"
+msgstr "Apagar Seleção"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
-msgstr "Ir Próximo Passo"
+msgid "Go to Next Step"
+msgstr "Ir para Próximo Passo"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
-msgstr "Ir Passo Anterior"
+msgid "Go to Previous Step"
+msgstr "Ir para Passo Anterior"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
@@ -446,11 +428,11 @@ msgstr "Limpar Animação"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "Escolha o nó que será animado:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "Usar Curvas Bezier"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
@@ -494,11 +476,11 @@ msgstr "Limpar"
#: editor/animation_track_editor.cpp
msgid "Scale Ratio:"
-msgstr "Taxa de Escala:"
+msgstr "Proporção de Escala:"
#: editor/animation_track_editor.cpp
msgid "Select tracks to copy:"
-msgstr ""
+msgstr "Selecionar pistas a copiar:"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -536,11 +518,11 @@ msgstr "Sem combinações"
msgid "Replaced %d occurrence(s)."
msgstr "Substituído %d ocorrência(s)."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Caso de Compatibilidade"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "Palavras inteiras"
@@ -556,29 +538,31 @@ msgstr "Substituir todos"
msgid "Selection Only"
msgstr "Apenas seleção"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Zoom In"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "Zoom Out"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "Repor Zoom"
#: editor/code_editor.cpp
-#, fuzzy
msgid "Warnings:"
-msgstr "Avisos"
+msgstr "Avisos:"
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "Zoom In"
+msgid "Font Size:"
+msgstr "Tamanho do tipo de letra:"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Linha:"
@@ -611,6 +595,7 @@ msgstr "Adicionar"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -667,9 +652,8 @@ msgid "Disconnect '%s' from '%s'"
msgstr "Desligar '%s' de '%s'"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect all from signal: '%s'"
-msgstr "Desligar '%s' de '%s'"
+msgstr "Desconectar tudo do sinal: '%s'"
#: editor/connections_dialog.cpp
msgid "Connect..."
@@ -681,19 +665,16 @@ msgid "Disconnect"
msgstr "Desligar"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect Signal: "
-msgstr "Ligar sinal:"
+msgstr "Conectar sinal: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection: "
-msgstr "Erro de Ligação"
+msgstr "Editar Conexão: "
#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "Are you sure you want to remove all connections from the \""
-msgstr "Está seguro que quer executar mais do que um Projeto?"
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr "Deseja remover todas as conexões do sinal \"%s\"?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -701,22 +682,19 @@ msgstr "Sinais"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr ""
+msgstr "Deseja remover todas as conexões deste sinal?"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "Desligar"
+msgstr "Desconectar Tudo"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit..."
-msgstr "Editar"
+msgstr "Editar..."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "Métodos"
+msgstr "Ir para Método"
#: editor/create_dialog.cpp
msgid "Change %s Type"
@@ -741,30 +719,27 @@ msgid "Recent:"
msgstr "Recente:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Procurar:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "Correspondências:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "Descrição:"
#: editor/dependency_editor.cpp
msgid "Search Replacement For:"
-msgstr "Procurar substituição para:"
+msgstr "Procurar Substituição para:"
#: editor/dependency_editor.cpp
msgid "Dependencies For:"
@@ -796,8 +771,7 @@ msgid "Resource"
msgstr "Recurso"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "Caminho"
@@ -815,12 +789,13 @@ msgstr "Editor de dependência"
#: editor/dependency_editor.cpp
msgid "Search Replacement Resource:"
-msgstr "Procurar recurso de substituição:"
+msgstr "Procurar Recurso de substituição:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -853,8 +828,8 @@ msgid "Error loading:"
msgstr "Erro ao carregar:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
-msgstr "Cena falha ao carregar devido a dependências que estão em falta:"
+msgid "Load failed due to missing dependencies:"
+msgstr "Falha no carregamento devido a dependências em falta:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -912,14 +887,6 @@ msgstr "Mudar o valor do dicionário"
msgid "Thanks from the Godot community!"
msgstr "Agradecimentos da Comunidade Godot!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "OK"
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Contribuidores da engine Godot"
@@ -1013,8 +980,8 @@ msgid "Uncompressing Assets"
msgstr "A descompactar Ativos"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
-msgstr "Pacote Instalado com Sucesso!"
+msgid "Package installed successfully!"
+msgstr "Pacote Instalado com sucesso!"
#: editor/editor_asset_installer.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -1095,8 +1062,7 @@ msgid "Bus options"
msgstr "Opções de barramento"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "Duplicado"
@@ -1238,7 +1204,7 @@ msgstr "Remover Carregamento Automático"
#: editor/editor_autoload_settings.cpp
msgid "Enable"
-msgstr "Habilitar"
+msgstr "Ativar"
#: editor/editor_autoload_settings.cpp
msgid "Rearrange Autoloads"
@@ -1261,7 +1227,7 @@ msgid "Add AutoLoad"
msgstr "Adicionar Carregamento Automático"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "Caminho:"
@@ -1269,8 +1235,8 @@ msgstr "Caminho:"
msgid "Node Name:"
msgstr "Nome do Nó:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "Nome"
@@ -1340,25 +1306,28 @@ msgid "Template file not found:"
msgstr "Ficheiro Modelo não encontrado:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Selecionar pasta atual"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "O Ficheiro existe, sobrescrever?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "Selecionar pasta atual"
+msgid "Select This Folder"
+msgstr "Selecionar esta Pasta"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
msgstr "Copiar Caminho"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Open In File Manager"
-msgstr "Mostrar no Gestor de Ficheiros"
+msgid "Open in File Manager"
+msgstr "Abrir no Gestor de Ficheiros"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+msgid "Show in File Manager"
msgstr "Mostrar no Gestor de Ficheiros"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1394,7 +1363,8 @@ msgid "Open a File or Directory"
msgstr "Abrir um Ficheiro ou Diretoria"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Guardar"
@@ -1452,8 +1422,7 @@ msgstr "Diretorias e Ficheiros:"
msgid "Preview:"
msgstr "Visualização prévia:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "Ficheiro:"
@@ -1469,24 +1438,11 @@ msgstr "Analisar fontes"
msgid "(Re)Importing Assets"
msgstr "A (Re)Importar Ativos"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "Procurar em Ajuda"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "Lista de Classes:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "Procurar Classes"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "Topo"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "Classe:"
@@ -1503,28 +1459,28 @@ msgid "Brief Description:"
msgstr "Breve Descrição:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "Membros"
+msgid "Properties"
+msgstr "Propriedades"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "Membros:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr "Propriedades:"
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "Métodos Públicos"
+msgid "Methods"
+msgstr "Métodos"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "Métodos Públicos:"
+msgid "Methods:"
+msgstr "Métodos:"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "Itens do tema GUI"
+msgid "Theme Properties"
+msgstr "Propriedades do Tema"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "Itens do tema GUI:"
+msgid "Theme Properties:"
+msgstr "Propriedades do Tema:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1551,8 +1507,12 @@ msgid "Constants:"
msgstr "Constantes:"
#: editor/editor_help.cpp
-msgid "Description"
-msgstr "Descrição"
+msgid "Class Description"
+msgstr "Descrição da Classe"
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
+msgstr "Descrição da Classe:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1569,12 +1529,12 @@ msgstr ""
"um[/url][/color]."
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "Propriedades"
+msgid "Property Descriptions"
+msgstr "Descrições da Propriedade"
#: editor/editor_help.cpp
-msgid "Property Description:"
-msgstr "Descrição da Propriedade:"
+msgid "Property Descriptions:"
+msgstr "Descrições da Propriedade:"
#: editor/editor_help.cpp
msgid ""
@@ -1585,12 +1545,12 @@ msgstr ""
"[color=$color][url=$url]contribuindo com uma[/url][/color]!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "Métodos"
+msgid "Method Descriptions"
+msgstr "Descrições do Método"
#: editor/editor_help.cpp
-msgid "Method Description:"
-msgstr "Descrição do Método:"
+msgid "Method Descriptions:"
+msgstr "Descrições do Método:"
#: editor/editor_help.cpp
msgid ""
@@ -1600,18 +1560,58 @@ msgstr ""
"Atualmente não existe descrição para este Método. Por favor ajude-nos [color="
"$color][url=$url]contribuindo com uma[/url][/color]!"
-#: editor/editor_inspector.cpp
-#, fuzzy
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Procurar em Ajuda"
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr "Mostrar Tudo"
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr "Apenas Classes"
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr "Apenas Métodos"
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr "Apenas Sinais"
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr "Apenas Constantes"
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr "Apenas Propriedades"
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr "Apenas Propriedades do Tema"
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr "Tipo do Membro"
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr "Classe"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
msgstr "Propriedade:"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr "Definir"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "Definir Múltiplo:"
#: editor/editor_log.cpp
msgid "Output:"
@@ -1639,6 +1639,11 @@ msgstr "Exportação do projeto falhou com código de erro %d."
msgid "Error saving resource!"
msgstr "Erro ao guardar recurso!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "OK"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "Guardar Recurso Como..."
@@ -1657,7 +1662,7 @@ msgstr "Erro ao guardar."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
-msgstr ""
+msgstr "Impossível abrir '%s'. O ficheiro pode ter sido movido ou apagado."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
@@ -1693,12 +1698,25 @@ msgstr "Esta operação não pode ser feita sem uma raiz da árvore."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+"Esta cena não pode ser guardada porque existe inclusão de instâncias "
+"cíclica.\n"
+"Resolva-a e tente guardá-la novamente."
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
"Impossível guardar Cena. Provavelmente, as dependências (instâncias ou "
"heranças) não puderam ser satisfeitas."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr "Não se consegue sobrescrever cena ainda aberta!"
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr "Impossível carregar MeshLibrary para fundir!"
@@ -1871,7 +1889,7 @@ msgstr "Esta operação não pode ser efetuada sem uma Cena."
#: editor/editor_node.cpp
msgid "Export Mesh Library"
-msgstr "Exportar Biblioteca de Mesh"
+msgstr "Exportar Biblioteca de Malhas"
#: editor/editor_node.cpp
msgid "This operation can't be done without a root node."
@@ -1949,7 +1967,7 @@ msgstr "Incapaz de ativar plugin em: '%s' falha de análise ou configuração."
#: editor/editor_node.cpp
msgid "Unable to find script field for addon plugin at: 'res://addons/%s'."
-msgstr "Incapaz de encontrar campo Script para plugin em: 'res://addons/%s'."
+msgstr "Incapaz de localizar campo Script para plugin em: 'res://addons/%s'."
#: editor/editor_node.cpp
msgid "Unable to load addon script from path: '%s'."
@@ -1957,6 +1975,14 @@ msgstr "Incapaz de carregar Script addon do Caminho: '%s'."
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"Incapaz de carregar Script addon do caminho: '%s' Parece haver um erro no "
+"código, reveja a sintaxe."
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
"Incapaz de carregar Script addon do Caminho: '%s' Tipo base não é "
@@ -2005,15 +2031,18 @@ msgstr "Apagar Modelo"
msgid "Default"
msgstr "Padrão"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr "Mostrar no Sistema de Ficheiros"
+
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play This Scene"
-msgstr "Executar a Cena"
+msgstr "Executar esta Cena"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "Fechar outros separadores"
+msgstr "Fechar Separador"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2088,7 +2117,7 @@ msgid "Save Scene"
msgstr "Guardar Cena"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+msgid "Save All Scenes"
msgstr "Guardar todas as Cenas"
#: editor/editor_node.cpp
@@ -2117,7 +2146,7 @@ msgid "Undo"
msgstr "Desfazer"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Refazer"
@@ -2141,20 +2170,20 @@ msgstr "Configurações de Projeto"
msgid "Export"
msgstr "Exportar"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "Ferramentas"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "Abrir Gestor de Projeto?"
+msgstr "Abrir Pasta de Dados do Projeto"
#: editor/editor_node.cpp
msgid "Quit to Project List"
msgstr "Sair para a lista de Projetos"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "Depurar"
@@ -2183,8 +2212,8 @@ msgid ""
"On Android, deploy will use the USB cable for faster performance. This "
"option speeds up testing for games with a large footprint."
msgstr ""
-"Quando esta opção está ativa, exportação ou distribuição criará um "
-"executável mínimo.\n"
+"Quando esta opção é ativada, exportação ou distribuição criará um executável "
+"mínimo.\n"
"O Sistema de Ficheiros será fornecido ao Projeto pelo Editor sobre a rede.\n"
"Em Android, a distribuição irá usar a ligação USB para melhor performance. "
"Esta opção acelera o teste de jogos pesados."
@@ -2261,18 +2290,16 @@ msgid "Toggle Fullscreen"
msgstr "Alternar Ecrã completo"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Data/Settings Folder"
-msgstr "Configurações do Editor"
+msgstr "Abrir Pasta do Editor de Dados/Configurações"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "Abrir Pasta de Dados do Editor"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Settings Folder"
-msgstr "Configurações do Editor"
+msgstr "Abrir Pasta de Configurações do Editor"
#: editor/editor_node.cpp editor/project_export.cpp
msgid "Manage Export Templates"
@@ -2282,10 +2309,6 @@ msgstr "Gerir Modelos de Exportação"
msgid "Help"
msgstr "Ajuda"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "Classes"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2348,21 +2371,20 @@ msgstr "Executar a Cena"
#: editor/editor_node.cpp
msgid "Play custom scene"
-msgstr "Executa a cena customizada"
+msgstr "Executa a cena personalizada"
#: editor/editor_node.cpp
msgid "Play Custom Scene"
-msgstr "Executar Cena Customizada"
+msgstr "Executar Cena Personalizada"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr ""
+msgstr "Alterar o driver de vídeo requer reiniciar o editor."
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Save & Restart"
-msgstr "Guardar & Sair"
+msgstr "Guardar & Reiniciar"
#: editor/editor_node.cpp
msgid "Spins when the editor window repaints!"
@@ -2380,27 +2402,26 @@ msgstr "Atualizar Alterações"
msgid "Disable Update Spinner"
msgstr "Desativar a roleta de atualização"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "Inspetor"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "Importar"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "Nó"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "Sistema de Ficheiros"
#: editor/editor_node.cpp
-#, fuzzy
+msgid "Inspector"
+msgstr "Inspetor"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Nó"
+
+#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
-msgstr "Expandir tudo"
+msgstr "Expandir Painel do Fundo"
#: editor/editor_node.cpp scene/resources/visual_shader.cpp
msgid "Output"
@@ -2472,16 +2493,15 @@ msgstr "Abrir o Editor anterior"
#: editor/editor_plugin.cpp
msgid "Creating Mesh Previews"
-msgstr "A criar pré-visualizações de Mesh"
+msgstr "A criar pré-visualizações de Malha"
#: editor/editor_plugin.cpp
msgid "Thumbnail..."
msgstr "Miniatura..."
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit Plugin"
-msgstr "Editar Polígono"
+msgstr "Editar Plugin"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
@@ -2505,15 +2525,13 @@ msgid "Status:"
msgstr "Estado:"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit:"
-msgstr "Editar"
+msgstr "Editar:"
#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Start"
-msgstr "Partida!"
+msgstr "Início"
#: editor/editor_profiler.cpp
msgid "Measure:"
@@ -2535,7 +2553,7 @@ msgstr "% Quadro"
msgid "Physics Frame %"
msgstr "% Quadro de Física"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "Tempo:"
@@ -2559,34 +2577,64 @@ msgstr "Tempo"
msgid "Calls"
msgstr "Chamadas"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr "On"
#: editor/editor_properties.cpp
msgid "Layer"
-msgstr ""
+msgstr "Camada"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Bit %d, value %d"
-msgstr "Bit %d, val %d."
+msgstr "Bit %d, valor %d"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr "[Vazio]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
+msgid "Assign..."
+msgstr "Atribuir..."
+
+#: editor/editor_properties.cpp
#, fuzzy
-msgid "Assign.."
-msgstr "Atribuir"
+msgid "Invalid RID"
+msgstr "Caminho inválido"
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+"O recurso selecionado (%s) não corresponde a qualquer tipo esperado para "
+"esta propriedade (%s)."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+"Não se consegue criar Textura Viewport em recursos guardados como ficheiro.\n"
+"O recurso tem de pertencer a uma cena."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+"Não se consegue criar Textura Viewport neste recurso porque não está "
+"definido na cena como local.\n"
+"Ative a sua propriedade 'local to scene' (e em todos os recursos que o "
+"contêm até a um Nó)."
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr "Escolha uma Vista"
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr "Novo Script"
@@ -2598,10 +2646,6 @@ msgstr "Novo %s"
msgid "Make Unique"
msgstr "Fazer único"
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr "Mostrar no Sistema de Ficheiros"
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2610,7 +2654,8 @@ msgstr "Mostrar no Sistema de Ficheiros"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "Colar"
@@ -2623,9 +2668,8 @@ msgstr "Converter em %s"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Open Editor"
-msgstr "Abrir no Editor"
+msgstr "Abrir Editor"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Selected node is not a Viewport!"
@@ -2633,25 +2677,23 @@ msgstr "Nó selecionado não é uma Vista!"
#: editor/editor_properties_array_dict.cpp
msgid "Size: "
-msgstr ""
+msgstr "Tamanho: "
#: editor/editor_properties_array_dict.cpp
msgid "Page: "
-msgstr ""
+msgstr "Página: "
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Key:"
-msgstr "Novo nome:"
+msgstr "Novo Chave:"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Value:"
-msgstr "Novo nome:"
+msgstr "Novo Valor:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
-msgstr ""
+msgstr "Adicionar Par Chave/Valor"
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -2737,16 +2779,15 @@ msgstr "A readquirir servidores, espere por favor..."
#: editor/export_template_manager.cpp
msgid "Remove template version '%s'?"
-msgstr "Remover versão de Modelo '%s'?"
+msgstr "Remover versão '%s' do Modelo?"
#: editor/export_template_manager.cpp
msgid "Can't open export templates zip."
msgstr "Impossível abrir o zip de Modelos."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Invalid version.txt format inside templates: %s."
-msgstr "Formato de version.txt inválido, dentro dos Modelos."
+msgstr "Formato de version.txt inválido dentro dos modelos: %s."
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
@@ -2811,6 +2852,8 @@ msgid ""
"Templates installation failed. The problematic templates archives can be "
"found at '%s'."
msgstr ""
+"Falhou a instalação de Modelos. Os ficheiros problemáticos podem ser "
+"encontrados em '%s'."
#: editor/export_template_manager.cpp
msgid "Error requesting url: "
@@ -2891,9 +2934,8 @@ msgid "Download Templates"
msgstr "Transferir Modelos"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr "Selecionar servidor da lista: "
+msgstr "Selecionar servidor da lista: (Shift+Click: Abrir no Navegador)"
#: editor/file_type_cache.cpp
msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
@@ -2902,18 +2944,20 @@ msgstr ""
"leitura!"
#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr "Favoritos"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr "'%s' não foi encontrado no Sistema de Ficheiros!"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a grid of thumbnails."
-msgstr "Visualizar itens como uma grelha de miniaturas"
+msgstr "Visualizar itens como grelha de miniaturas."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a list."
-msgstr "Visualizar itens como uma lista"
+msgstr "Visualizar itens como lista."
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
@@ -2941,19 +2985,15 @@ msgstr "Erro ao duplicar:"
msgid "Unable to update dependencies:"
msgstr "Incapaz de atualizar dependências:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "Nenhum nome foi fornecido"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "Nome não fornecido."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "O nome contém carateres inválidos"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "Nome não fornecido."
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "O nome contém carateres inválidos."
@@ -2978,22 +3018,6 @@ msgid "Duplicating folder:"
msgstr "A duplicar Diretoria:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "Expandir tudo"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "Colapsar tudo"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "Renomear..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "Mover para..."
-
-#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
msgstr "Abrir Cena(s)"
@@ -3002,6 +3026,14 @@ msgid "Instance"
msgstr "Instância"
#: editor/filesystem_dock.cpp
+msgid "Add to favorites"
+msgstr "Adicionar aos Favoritos"
+
+#: editor/filesystem_dock.cpp
+msgid "Remove from favorites"
+msgstr "Remover dos Favoritos"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "Editar Dependências..."
@@ -3009,19 +3041,33 @@ msgstr "Editar Dependências..."
msgid "View Owners..."
msgstr "Ver proprietários..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "Renomear..."
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "Duplicar..."
#: editor/filesystem_dock.cpp
-#, fuzzy
+msgid "Move To..."
+msgstr "Mover para..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
-msgstr "Novo Script"
+msgstr "Novo Script..."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "Guardar Recurso Como..."
+msgstr "Novo Recurso..."
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr "Expandir Tudo"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr "Colapsar Tudo"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3043,29 +3089,18 @@ msgid "Re-Scan Filesystem"
msgstr "Carregar novamente o Sistema de Ficheiros"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "Alternar a pasta de situação como Favorita"
+msgid "Toggle split mode"
+msgstr "Alternar modo de divisão"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Show current scene file."
-msgstr "Selecionar o sub-tile editado."
+msgid "Search files"
+msgstr "Procurar ficheiros"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr "Instancie a(s) Cena(s) selecionada(s) como filha(s) do Nó selecionado."
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "Procurar Classes"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3073,56 +3108,42 @@ msgstr ""
"A analisar Ficheiros,\n"
"Espere, por favor..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "Mover"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "There is already file or folder with the same name in this location."
-msgstr "Já existe uma pasta neste caminho com o nome indicado."
+msgstr "Já existe um ficheiro ou pasta com o mesmo nome nesta localização."
#: editor/filesystem_dock.cpp
msgid "Overwrite"
-msgstr ""
+msgstr "Sobrescrever"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Criar Script"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find in files"
-msgstr "Encontrar tile"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find: "
-msgstr "Encontrar"
+msgid "Find in Files"
+msgstr "Localizar em Ficheiros"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Whole words"
-msgstr "Palavras inteiras"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "Caso de Compatibilidade"
+msgid "Find:"
+msgstr "Localizar:"
#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "Pasta:"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Filter: "
-msgstr "Modo de filtro:"
+msgid "Filters:"
+msgstr "Filtros:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
msgid "Find..."
-msgstr "Encontrar..."
+msgstr "Localizar..."
#: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp
msgid "Replace..."
@@ -3133,52 +3154,48 @@ msgid "Cancel"
msgstr "Cancelar"
#: editor/find_in_files.cpp
-#, fuzzy
+msgid "Find: "
+msgstr "Localizar: "
+
+#: editor/find_in_files.cpp
msgid "Replace: "
-msgstr "Substituir"
+msgstr "Substituir: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace all (no undo)"
-msgstr "Substituir todos"
+msgstr "Substituir tudo (não há desfazer)"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Searching..."
-msgstr "A guardar..."
+msgstr "A procurar..."
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Search complete"
-msgstr "Texto de Pesquisa"
+msgstr "Pesquisa completa"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group name already exists."
-msgstr "ERRO: O nome da Animação já existe!"
+msgstr "Já existe o nome de grupo ."
#: editor/groups_editor.cpp
-#, fuzzy
-msgid "invalid Group name."
-msgstr "Nome inválido."
+msgid "Invalid group name."
+msgstr "Nome de grupo inválido."
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Grupos"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes not in Group"
-msgstr "Adicionar ao Grupo"
+msgstr "Nós fora do Grupo"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
msgid "Filter nodes"
msgstr "Filtrar Nós"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes in Group"
-msgstr "Adicionar ao Grupo"
+msgstr "Nós no Grupo"
#: editor/groups_editor.cpp
msgid "Add to Group"
@@ -3189,9 +3206,8 @@ msgid "Remove from Group"
msgstr "Remover do Grupo"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Manage Groups"
-msgstr "Grupos"
+msgstr "Gerir Grupos"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Single Scene"
@@ -3248,7 +3264,7 @@ msgstr "A gerar Lightmaps"
#: editor/import/resource_importer_scene.cpp
msgid "Generating for Mesh: "
-msgstr "A gerar para Mesh: "
+msgstr "A gerar para Malha: "
#: editor/import/resource_importer_scene.cpp
msgid "Running Custom Script..."
@@ -3272,11 +3288,11 @@ msgstr "A guardar..."
#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
-msgstr "Definir como padrão para '%s'"
+msgstr "Definir como Padrão para '%s'"
#: editor/import_dock.cpp
msgid "Clear Default for '%s'"
-msgstr "Limpar padrão para '%s'"
+msgstr "Limpar Padrão para '%s'"
#: editor/import_dock.cpp
msgid " Files"
@@ -3298,18 +3314,13 @@ msgstr "Reimportar"
msgid "Failed to load resource."
msgstr "Falha ao carregar recurso."
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "Ok"
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
-msgstr "Expandir tudo"
+msgid "Expand All Properties"
+msgstr "Expandir Todas as Propriedades"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
-msgstr "Colapsar todas as Propriedades"
+msgid "Collapse All Properties"
+msgstr "Colapsar Todas as Propriedades"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -3325,9 +3336,8 @@ msgid "Paste Params"
msgstr "Colar Parâmetros"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Edit Resource Clipboard"
-msgstr "Ãrea de transferência de recursos vazia!"
+msgstr "Editar Ãrea de Transferência de Recursos"
#: editor/inspector_dock.cpp
msgid "Copy Resource"
@@ -3354,6 +3364,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "Carregue um recurso existente a partir do disco e edite-o."
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "Guarde o recurso editado."
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "Ir para o Objeto editado anteriormente no histórico."
@@ -3370,9 +3384,8 @@ msgid "Object properties."
msgstr "Propriedades do Objeto."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Filter properties"
-msgstr "Filtrar Nós"
+msgstr "Propriedades do Filtro"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
@@ -3387,47 +3400,40 @@ msgid "Select a Node to edit Signals and Groups."
msgstr "Selecionar um Nó para editar sinais e grupos."
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Edit a Plugin"
-msgstr "Editar Polígono"
+msgstr "Editar Plugin"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Create a Plugin"
-msgstr "Criar solução C#"
+msgstr "Criar Plugin"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Plugin Name:"
-msgstr "Plugins"
+msgstr "Nome do Plugin:"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
-msgstr ""
+msgstr "Sub-pasta:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Language:"
-msgstr "Linguagem"
+msgstr "Linguagem:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Script Name:"
-msgstr "Script inválido"
+msgstr "Nome do Script:"
#: editor/plugin_config_dialog.cpp
msgid "Activate now?"
-msgstr ""
+msgstr "Ativar agora?"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
msgstr "Criar Polígono"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+msgid "Edit Polygon"
msgstr "Editar Polígono"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3435,34 +3441,33 @@ msgid "Insert Point"
msgstr "Inserir Ponto"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
-msgstr "Editar Poly (Remover Ponto)"
+msgid "Edit Polygon (Remove Point)"
+msgstr "Editar Polígono (Remover Ponto)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
-msgstr "Remover Poly e Ponto"
+msgid "Remove Polygon And Point"
+msgstr "Remover Polígono e Ponto"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "Criar um novo Polígono de raíz"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr "Criar pontos."
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
-"Editar Polígono existente:\n"
-"LMB: Mover Ponto.\n"
-"Ctrl+LMB: Separar segmento.\n"
-"RMB: Apagar Ponto."
+"Editar Polígono:\n"
+"LMB: Mover Ponto\n"
+"RMB: Apagar Ponto"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
-msgstr "Apagar Pontos"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr "Apagar pontos."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3476,15 +3481,14 @@ msgstr "Adicionar Animação"
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Load.."
-msgstr "Carregar"
+msgid "Load..."
+msgstr "Carregar..."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "This type of node can't be used. Only root nodes are allowed."
-msgstr ""
+msgstr "Este tipo de nó não pode ser usado. Apenas nós raiz são permitidos."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3494,72 +3498,65 @@ msgid ""
"AnimationTree is inactive.\n"
"Activate to enable playback, check node warnings if activation fails."
msgstr ""
+"AnimationTree está inativa.\n"
+"Active-a para permitir a reprodução, verifique avisos do nó se a ativação "
+"falhar."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Set the blending position within the space"
-msgstr ""
+msgstr "Definir a posição de mistura dentro do espaço"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Select and move points, create points with RMB."
-msgstr ""
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Apagar Pontos"
+msgstr "Selecionar e mover pontos, criar pontos com RMB."
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "RMB: Apagar Ponto."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr "Habilita a grelha snap and show."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Point"
-msgstr "Mover Ponto"
+msgstr "Ponto"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Open Animation Node"
-msgstr "Nó Animation"
+msgstr "Abrir Nó Animação"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists"
-msgstr "Ação '%s' já existe!"
+msgstr "Já existe triângulo"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "BlendSpace2D does not belong to an AnimationTree node."
-msgstr ""
+msgstr "BlendSpace2D não pertence a um nó AnimationTree."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "No triangles exist, so no blending can take place."
-msgstr ""
+msgstr "Não existem triângulos, nenhuma mistura pode ocorrer."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create triangles by connecting points."
-msgstr ""
+msgstr "Criar triângulos ligando pontos."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Erase points and triangles."
-msgstr ""
+msgstr "Apagar pontos e triângulos."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Generate blend triangles automatically (instead of manually)"
-msgstr ""
+msgstr "Gera triângulos automaticamente (em vez de manual)"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr "Ajustar"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Mistura:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3568,20 +3565,24 @@ msgstr "Editar filtros"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Output node can't be added to the blend tree."
-msgstr ""
+msgstr "Saída do nó não pode ser adicionada à árvore de mistura."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Unable to connect, port may be in use or connection may be invalid."
msgstr ""
+"Incapaz de conectar, porta pode estar em uso ou conexão pode ser inválida."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
msgstr ""
+"Reprodutor de animação não definido, sendo incapaz de recolher nome das "
+"faixas."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Player path set is invalid, so unable to retrieve track names."
msgstr ""
+"Caminho do reprodutor é inválido, sendo incapaz de recolher nome das faixas."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
@@ -3589,23 +3590,22 @@ msgid ""
"Animation player has no valid root node path, so unable to retrieve track "
"names."
msgstr ""
+"Reprodutor de animação não tem um caminha de nó raiz válido, sendo incapaz "
+"de recolher nome das faixas."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Add Node.."
-msgstr "Adicionar Nó"
+msgid "Add Node..."
+msgstr "Adicionar Nó.."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filtered Tracks:"
-msgstr "Editar filtros"
+msgstr "Editar Pistas Filtradas:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Enable filtering"
-msgstr "Filhos editáveis"
+msgstr "Ativar filtragem"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
@@ -3633,14 +3633,12 @@ msgid "Remove Animation"
msgstr "Remover Animação"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Invalid animation name!"
-msgstr "ERRO: Nome de Animação inválido!"
+msgstr "Nome de Animação inválido!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Animation name already exists!"
-msgstr "ERRO: O nome da Animação já existe!"
+msgstr "Já existe o nome da Animação!"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -3653,7 +3651,7 @@ msgstr "Misturar seguinte alterado"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Change Blend Time"
-msgstr "Mudar tempo de mistura"
+msgstr "Mudar tempo de Mistura"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Load Animation"
@@ -3664,14 +3662,12 @@ msgid "Duplicate Animation"
msgstr "Duplicar Animação"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to copy!"
-msgstr "ERRO: Sem Animação para copiar!"
+msgstr "Nenhuma animação para copiar!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation resource on clipboard!"
-msgstr "ERRO: nenhuma Animação na Ãrea de Transferência!"
+msgstr "Nenhum recurso de animação na Ãrea de Transferência!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
@@ -3682,9 +3678,8 @@ msgid "Paste Animation"
msgstr "Colar Animação"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to edit!"
-msgstr "ERRO: Sem Animação para editar!"
+msgstr "Nenhuma animação para editar!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
@@ -3729,14 +3724,12 @@ msgid "New"
msgstr "Novo"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Transitions..."
-msgstr "Transições"
+msgstr "Editar Transições..."
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Open in Inspector"
-msgstr "Abrir no Editor"
+msgstr "Abrir no Inspetor"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Display list of animations in player."
@@ -3795,9 +3788,8 @@ msgid "Include Gizmos (3D)"
msgstr "Incluir ferramentas (3D)"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Pin AnimationPlayer"
-msgstr "Colar Animação"
+msgstr "Pregar AnimationPlayer"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Create New Animation"
@@ -3817,7 +3809,7 @@ msgstr "Erro!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Blend Times:"
-msgstr "Tempos de mistura:"
+msgstr "Tempos de Mistura:"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Next (Auto Queue):"
@@ -3825,36 +3817,35 @@ msgstr "Próximo (auto-fila):"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Cross-Animation Blend Times"
-msgstr "Tempos de mistura de Animação cruzada"
+msgstr "Tempos de Mistura de Animação cruzada"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "End"
-msgstr ""
+msgstr "Fim"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Immediate"
-msgstr ""
+msgstr "Imediato"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Sync"
-msgstr ""
+msgstr "Sinc"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "At End"
-msgstr ""
+msgstr "No Fim"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Travel"
-msgstr ""
+msgstr "Viagem"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Start and end nodes are needed for a sub-transition."
-msgstr ""
+msgstr "Nodos de início e fim são necessários para uma sub-transição."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "No playback resource set at path: %s."
-msgstr "Não está no Caminho do recurso."
+msgstr "Nenhum recurso de playback definido no caminho: %s."
#: editor/plugins/animation_state_machine_editor.cpp
msgid ""
@@ -3862,34 +3853,34 @@ msgid ""
"RMB to add new nodes.\n"
"Shift+LMB to create connections."
msgstr ""
+"Selecionar e mover nós.\n"
+"RMB para adicionar novos nós.\n"
+"Shift+LMB para criar conexões."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "Criar Novo %s"
+msgstr "Criar novos nós."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Connect nodes."
-msgstr "Conectar Nós"
+msgstr "Conectar nós."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Remove selected node or transition"
-msgstr "Remover Pista selecionada."
+msgid "Remove selected node or transition."
+msgstr "Remover nó ou transição selecionado."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
msgstr ""
+"Alternar autoplay deste animação em início, reinício ou procura de zero."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set the end animation. This is useful for sub-transitions."
-msgstr ""
+msgstr "Definir a animação final. Útil para sub-transições."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "Transição"
+msgstr "Transição: "
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3943,10 +3934,6 @@ msgid "Amount:"
msgstr "Valor:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "Mistura:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "Mistura 0:"
@@ -4087,14 +4074,12 @@ msgid "Asset Download Error:"
msgstr "Erro na transferência de Ativo:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading (%s / %s)..."
-msgstr "A transferir"
+msgstr "A transferir (%s / %s)..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading..."
-msgstr "A transferir"
+msgstr "A transferir..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Resolving..."
@@ -4121,14 +4106,12 @@ msgid "Download for this asset is already in progress!"
msgstr "A transferência deste Ativo já está em andamento!"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "First"
-msgstr "primeiro"
+msgstr "Primeiro"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Previous"
-msgstr "Guia anterior"
+msgstr "Anterior"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Next"
@@ -4136,7 +4119,7 @@ msgstr "Proximo"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Last"
-msgstr ""
+msgstr "Último"
#: editor/plugins/asset_library_editor_plugin.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -4148,7 +4131,7 @@ msgstr "Todos"
msgid "Plugins"
msgstr "Plugins"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "Ordenar:"
@@ -4196,7 +4179,7 @@ msgid ""
"No meshes to bake. Make sure they contain an UV2 channel and that the 'Bake "
"Light' flag is on."
msgstr ""
-"Não há Meshes para cozinhar. Assegure-se que contêm um canal UV2 e que a "
+"Não há Meshes para consolidar. Assegure-se que contêm um canal UV2 e que a "
"referência 'Bake Light' flag está on."
#: editor/plugins/baked_lightmap_editor_plugin.cpp
@@ -4205,7 +4188,7 @@ msgstr "Falha ao criar imagens lightmap, assegure-se que o caminho é gravável.
#: editor/plugins/baked_lightmap_editor_plugin.cpp
msgid "Bake Lightmaps"
-msgstr "Cozinhar Lightmaps"
+msgstr "Consolidar Lightmaps"
#: editor/plugins/camera_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
@@ -4261,29 +4244,28 @@ msgid "Create new horizontal and vertical guides"
msgstr "Criar guias horizontal e vertical"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move pivot"
-msgstr "Mover Eixo"
+msgstr "Mover pivô"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Rotate CanvasItem"
-msgstr "Editar CanvasItem"
+msgstr "Rodar CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move anchor"
-msgstr "Mover ação"
+msgstr "Mover âncora"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Resize CanvasItem"
-msgstr "Editar CanvasItem"
+msgstr "Redimensionar CanvasItem"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr "Escalar CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move CanvasItem"
-msgstr "Editar CanvasItem"
+msgstr "Mover CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -4302,19 +4284,18 @@ msgid "Paste Pose"
msgstr "Colar Pose"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "Zoom Out"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom reset"
-msgstr "Zoom Out"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
+"Atenção: as crianças de um contentor obtêm a sua posição e tamanho "
+"determinados apenas pelos seus pais."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Zoom In"
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
+msgstr "Repor zoom"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
@@ -4346,6 +4327,10 @@ msgid "Rotate Mode"
msgstr "Modo rodar"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr "Modo Escalar"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4363,16 +4348,14 @@ msgid "Pan Mode"
msgstr "Modo deslocamento"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle snapping."
-msgstr "Alternar Ajuste"
+msgstr "Alternar Ajuste."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Snap"
msgstr "Usar Ajuste"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snapping Options"
msgstr "Opções de Ajuste"
@@ -4382,7 +4365,7 @@ msgstr "Ajustar à grelha"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Rotation Snap"
-msgstr "Usar Ajuste na rotação"
+msgstr "Usar Ajuste de rotação"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -4395,7 +4378,7 @@ msgstr "Ajuste relativo"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Pixel Snap"
-msgstr "Usar Ajuste de pixel"
+msgstr "Usar Ajuste de Pixel"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Smart snapping"
@@ -4414,9 +4397,8 @@ msgid "Snap to node sides"
msgstr "Ajustar aos lados do Nó"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to node center"
-msgstr "Ajustar ao Nó âncora"
+msgstr "Ajustar ao centro do Nó"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to other nodes"
@@ -4445,6 +4427,10 @@ msgid "Restores the object's children's ability to be selected."
msgstr "Restaura a capacidade de selecionar os Objetos-filho."
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr "Opções do Esqueleto"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "Mostrar ossos"
@@ -4458,12 +4444,11 @@ msgstr "Apagar corrente IK"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make Custom Bone(s) from Node(s)"
-msgstr ""
+msgstr "Fazer Osso(s) Personalizados a partis de Nó(s)"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Custom Bones"
-msgstr "Apagar ossos"
+msgstr "Apagar Ossos Personalizados"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -4496,6 +4481,10 @@ msgid "Show Viewport"
msgstr "Mostrar Vista"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr "Mostrar Grupo e Bloquear Ãcones"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr "Centrar seleção"
@@ -4508,9 +4497,8 @@ msgid "Layout"
msgstr "Esquema"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Insert keys."
-msgstr "Inserir Chaves"
+msgstr "Inserir chaves."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
@@ -4567,22 +4555,29 @@ msgstr ""
"Arrastar & largar + Alt : Altera o tipo de Nó"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr "Criar Poly3D"
+msgid "Create Polygon3D"
+msgstr "Criar Polygon3D"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Editar Polígono"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Editar Poly (Remover Ponto)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
-msgstr "Definir handle"
+msgstr "Definir Manipulador"
#: editor/plugins/cpu_particles_editor_plugin.cpp
-#, fuzzy
msgid "CPUParticles"
-msgstr "Partículas"
+msgstr "CPUPartículas"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
msgid "Create Emission Points From Mesh"
-msgstr "Criar Pontos de emissão a partir da Mesh"
+msgstr "Criar Pontos de emissão a partir da Malha"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
@@ -4655,7 +4650,7 @@ msgstr "Pressione Shift para editar tangentes individualmente"
#: editor/plugins/gi_probe_editor_plugin.cpp
msgid "Bake GI Probe"
-msgstr "Cozinhar a sonda GI"
+msgstr "Consolidar Sonda GI"
#: editor/plugins/item_list_editor_plugin.cpp
msgid "Item %d"
@@ -4670,40 +4665,12 @@ msgid "Item List Editor"
msgstr "Editor da lista de itens"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"Não há recurso OccluderPolygon2D neste Nó.\n"
-"Criar um e associar?"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr "Criar Polígono oclusor"
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr "Criar um novo Polígono a partir do zero."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "Editar Polígono existente:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "LMB: Mover Ponto."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr "Ctrl+LMB: Separar segmento."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "RMB: Apagar Ponto."
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
-msgstr "A Mesh está vazia!"
+msgstr "A Malha está vazia!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Static Trimesh Body"
@@ -4727,36 +4694,36 @@ msgstr "Criar forma convexa"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
-msgstr "Criar Mesh de navegação"
+msgstr "Criar Malha de Navegação"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Contained Mesh is not of type ArrayMesh."
-msgstr "Mesh incluída não é do tipo ArrayMesh."
+msgstr "Malha contida não é do tipo ArrayMesh."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "UV Unwrap failed, mesh may not be manifold?"
-msgstr "Falhou o desempacotamento UV, a Mesh pode não ser múltipla?"
+msgstr "Falhou o desempacotamento UV, a Malha pode não ser múltipla?"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "No mesh to debug."
-msgstr "Nenhuma Mesh para depurar."
+msgstr "Nenhuma Malha para depurar."
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Model has no UV in this layer"
-msgstr "O Modelo não tem UV neste Layer"
+msgstr "O Modelo não tem UV nesta camada"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "MeshInstance lacks a Mesh!"
-msgstr "Falta uma Mesh a MeshInstance!"
+msgstr "Falta uma Malha a MeshInstance!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh has not surface to create outlines from!"
-msgstr "A Mesh não tem superfície para criar contornos!"
+msgstr "A Malha não tem superfície para criar contornos!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!"
-msgstr "Tipo primitivo de Mesh não é PRIMITIVE_TRIANGLES!"
+msgstr "Tipo primitivo de Malha não é PRIMITIVE_TRIANGLES!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Could not create outline!"
@@ -4768,7 +4735,7 @@ msgstr "Criar contorno"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh"
-msgstr "Mesh"
+msgstr "Malha"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Static Body"
@@ -4788,7 +4755,7 @@ msgstr "Criar irmão de colisão convexa"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh..."
-msgstr "Criar Mesh contorno..."
+msgstr "Criar Malha de Contorno..."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
@@ -4804,7 +4771,7 @@ msgstr "Desempacotar UV2 para Lightmap/AO"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Outline Mesh"
-msgstr "Criar Mesh contorno"
+msgstr "Criar Malha de Contorno"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Outline Size:"
@@ -4833,23 +4800,23 @@ msgstr "Atualizar da Cena"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "No mesh source specified (and no MultiMesh set in node)."
-msgstr "Não há fonte de Mesh (nem MultiMesh no Nó)."
+msgstr "Fonte da Malha não especificada (nem MultiMesh no Nó)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "No mesh source specified (and MultiMesh contains no Mesh)."
-msgstr "Não há fonte de Mesh (e MultiMesh não contêm Mesh)."
+msgstr "Fonte da Malha não especificada (e MultiMesh não contêm Malha)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh source is invalid (invalid path)."
-msgstr "A fonte de Mesh é inválida (Caminho inválido)."
+msgstr "A fonte da Malha é inválida (Caminho inválido)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh source is invalid (not a MeshInstance)."
-msgstr "A fonte de Mesh é inválida (não é MeshInstance)."
+msgstr "A fonte da Malha é inválida (não é MeshInstance)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh source is invalid (contains no Mesh resource)."
-msgstr "A fonte de Mesh é inválida (não contêm um recurso Mesh)."
+msgstr "A fonte da Malha é inválida (não contêm um recurso Mesh)."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "No surface source specified."
@@ -4877,7 +4844,7 @@ msgstr "Ãrea não pode ser mapeada."
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Source Mesh:"
-msgstr "Selecione uma fonte Mesh:"
+msgstr "Selecione uma fonte Malha:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Select a Target Surface:"
@@ -4897,7 +4864,7 @@ msgstr "Superfície alvo:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Source Mesh:"
-msgstr "Mesh fonte:"
+msgstr "Fonte Malha:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "X-Axis"
@@ -4913,7 +4880,7 @@ msgstr "Eixo Z"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh Up Axis:"
-msgstr "Mesh Eixo cima:"
+msgstr "Malha Eixo Cima:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Random Rotation:"
@@ -4932,13 +4899,13 @@ msgid "Populate"
msgstr "Povoar"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr "Criar Polígono de navegação"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr "A gerar AABB"
+msgid "Generating Visibility Rect"
+msgstr "A Gerar Visibilidade Rect"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -4966,6 +4933,11 @@ msgstr "Limpar máscara de emissão"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr "Converter em CPUPartículas"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr "Partículas"
@@ -5035,13 +5007,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr "É necessário um Material processador do tipo 'ParticlesMaterial'."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
-msgstr "Gerar AABB"
+msgid "Generating AABB"
+msgstr "A gerar AABB"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "Converter em maiúsculas"
+msgid "Generate AABB"
+msgstr "Gerar AABB"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5065,6 +5036,10 @@ msgid "Add Point to Curve"
msgstr "Adicionar Ponto à curva"
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr "Dividir Curva"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr "Mover Ponto na curva"
@@ -5092,6 +5067,10 @@ msgid "Click: Add Point"
msgstr "Clique: Adicionar Ponto"
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr "Clique esquerdo: Dividir o Segmento (em curva)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr "Clique direito: Apagar Ponto"
@@ -5107,11 +5086,6 @@ msgstr "Adicionar Ponto (num espaço vazio)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr "Separar segmento (na curva)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "Apagar Ponto"
@@ -5129,12 +5103,12 @@ msgstr "Opções"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Angles"
-msgstr ""
+msgstr "Espelhar ângulos do manipulador"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Lengths"
-msgstr ""
+msgstr "Espelhar comprimentos do manipulador"
#: editor/plugins/path_editor_plugin.cpp
msgid "Curve Point #"
@@ -5168,65 +5142,78 @@ msgstr "Remover Ponto Out-Control"
msgid "Remove In-Control Point"
msgstr "Remover Ponto In-Control"
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Separar segmento (na curva)"
+
#: editor/plugins/physical_bone_plugin.cpp
-#, fuzzy
msgid "Move joint"
-msgstr "Mover Ponto"
+msgstr "Mover Junta"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
-msgstr ""
+msgstr "A propriedade esqueleto do Polygon2D não aponta para um nó Skeleton2D"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Sync bones"
-msgstr "Mostrar ossos"
+msgid "Sync Bones"
+msgstr "Sincronizar ossos"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+"Sem textura neste polígono.\n"
+"Defina uma textura para poder editar UV."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr "Criar mapa UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon & UV"
-msgstr "Criar Polígono"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
+msgstr "Criar Polígono & UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "Criar nova guia horizontal"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "Ação '%s' já existe!"
+msgid "Remove Internal Vertex"
+msgstr "Remover Ponto In-Control"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Add Split"
-msgstr "Adicionar Ponto"
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "Caminho inválido"
+msgid "Add Custom Polygon"
+msgstr "Editar Polígono"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Remover Ponto"
+msgid "Remove Custom Polygon"
+msgstr "Remover Polígono de Colisão"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr "Transformar mapa UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
-msgstr ""
+msgid "Transform Polygon"
+msgstr "Transformar Polígono"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
+msgstr "Pintar pesos dos ossos"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Open Polygon 2D UV editor."
+msgstr "Abrir editor UV de Polygon2D."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
@@ -5234,30 +5221,24 @@ msgstr "Editor UV de Polígono 2D"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "UV"
-msgstr ""
+msgstr "UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "Editar Polígono"
+msgid "Points"
+msgstr "Ponto"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Splits"
-msgstr "Separar Caminho"
+msgid "Polygons"
+msgstr "Polígono->UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Bones"
-msgstr "Criar ossos"
+msgstr "Ossos"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Create Polygon"
-msgstr "Criar Polígono"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Move Points"
msgstr "Mover Ponto"
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5285,25 +5266,26 @@ msgid "Scale Polygon"
msgstr "Escalar Polígono"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "Selecione primeiro um item de configuração!"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
-msgstr ""
+msgid "Paint weights with specified intensity."
+msgstr "Pintar pesos com determinada intensidade."
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
-msgstr ""
+msgid "Unpaint weights with specified intensity."
+msgstr "Despintar pesos com intensidade específica."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Radius:"
-msgstr ""
+msgstr "Raio:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon->UV"
@@ -5318,9 +5300,13 @@ msgid "Clear UV"
msgstr "Limpar UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Settings"
-msgstr "Configurações do GridMap"
+msgstr "Configurações da Grelha"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "Ajustar"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
@@ -5331,34 +5317,28 @@ msgid "Grid"
msgstr "Grelha"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Configure Grid:"
-msgstr "Configurar Ajuste"
+msgstr "Configurar Grelha:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset X:"
-msgstr "Compensação da grelha:"
+msgstr "Deslocação X da grelha:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset Y:"
-msgstr "Compensação da grelha:"
+msgstr "Deslocação Y da grelha:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step X:"
-msgstr "Passo da grelha:"
+msgstr "Passo X da grelha:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step Y:"
-msgstr "Passo da grelha:"
+msgstr "Passo Y da grelha:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Sync Bones to Polygon"
-msgstr "Escalar Polígono"
+msgstr "Sincronizar Ossos com Polígono"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "ERROR: Couldn't load resource!"
@@ -5386,22 +5366,22 @@ msgid "Paste Resource"
msgstr "Colar Recurso"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "Abrir no Editor"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr "Instância:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr "Tipo:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Abrir no Editor"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr "Carregar recurso"
@@ -5412,12 +5392,11 @@ msgstr "ResourcePreloader"
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "AnimationTree has no path set to an AnimationPlayer"
-msgstr ""
+msgstr "AnimationTree não tem caminho definido para um AnimationPlayer"
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Path to AnimationPlayer is invalid"
-msgstr "Ãrvore de Animação inválida."
+msgstr "Caminho para AnimationPlayer é inválido"
#: editor/plugins/script_editor_plugin.cpp
msgid "Clear Recent Files"
@@ -5428,56 +5407,62 @@ msgid "Close and save changes?"
msgstr "Fechar e guardar alterações?"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error writing TextFile:"
-msgstr "Erro ao guardar TileSet!"
+msgstr "Erro ao escrever TextFile:"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr "Erro ao carregar ficheiro."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error could not load file."
-msgstr "Erro - Impossível criar Script no Sistema de Ficheiros."
+msgstr "Erro ao carregar ficheiro."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error saving file!"
-msgstr "Erro ao guardar TileSet!"
+msgstr "Erro ao guardar ficheiro!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr "Erro ao guardar tema"
+msgid "Error while saving theme."
+msgstr "Erro ao gravar tema."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
-msgstr "Erro ao guardar"
+msgid "Error Saving"
+msgstr "Erro Ao Gravar"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr "Erro ao importar tema"
+msgid "Error importing theme."
+msgstr "Erro ao importar tema."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+msgid "Error Importing"
msgstr "Erro ao importar"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New TextFile..."
-msgstr "Nova Diretoria..."
+msgstr "Novo TextFile..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open File"
-msgstr "Abrir um Ficheiro"
+msgstr "Abrir Ficheiro"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Save File As..."
-msgstr "Guardar Como..."
+msgstr "Guardar Ficheiro Como..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme"
msgstr "Importar tema"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Erro ao guardar tema"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Erro ao guardar"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr "Guardar tema como..."
@@ -5487,7 +5472,7 @@ msgstr " Referência de classe"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
-msgstr ""
+msgstr "Alternar ordenação alfabética da lista de métodos."
#: editor/plugins/script_editor_plugin.cpp
msgid "Sort"
@@ -5518,9 +5503,8 @@ msgid "File"
msgstr "Ficheiro"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "New TextFile"
-msgstr "Ver Ficheiros"
+msgid "Open..."
+msgstr "Abrir..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5535,12 +5519,8 @@ msgid "Copy Script Path"
msgstr "Copiar Caminho do Script"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr "Mostrar no Sistema de Ficheiros"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
-msgstr "Histórico anterior"
+msgid "History Previous"
+msgstr "Histórico Anterior"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
@@ -5552,6 +5532,10 @@ msgid "Theme"
msgstr "Tema"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme..."
+msgstr "Importar tema..."
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
msgstr "Recarregar tema"
@@ -5560,10 +5544,6 @@ msgid "Save Theme"
msgstr "Guardar tema"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "Guardar tema como"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "Fechar documentos"
@@ -5586,7 +5566,7 @@ msgstr "Alternar painel de Scripts"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
msgid "Find Next"
-msgstr "Encontrar seguinte"
+msgstr "Localizar Seguinte"
#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
msgid "Step Over"
@@ -5610,18 +5590,14 @@ msgid "Keep Debugger Open"
msgstr "Manter depurador aberto"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
-msgstr "Depurar com Editor externo"
+msgid "Debug with External Editor"
+msgstr "Depurar com Editor Externo"
#: editor/plugins/script_editor_plugin.cpp
msgid "Open Godot online documentation"
msgstr "Abrir documentação online do Godot"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr "Procurar na hierarquia de classe."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Procurar na documentação de referência."
@@ -5658,39 +5634,32 @@ msgid "Debugger"
msgstr "Depurador"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search results"
-msgstr "Procurar em Ajuda"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "Procurar Classes"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-"Scripts incorporados só podem ser editados quando a Cena a que pertencem é "
-"carregada"
+msgid "Search Results"
+msgstr "Resultados da Pesquisa"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Line"
-msgstr "Linha:"
+msgstr "Linha"
#: editor/plugins/script_text_editor.cpp
msgid "(ignore)"
-msgstr ""
+msgstr "(ignorar)"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function"
+msgstr "Ir para Função"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr "Padrão"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr "Só podem ser largados recursos do Sistema de Ficheiros ."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Lookup Symbol"
-msgstr "Completar símbolo"
+msgstr "Símbolo Consulta"
#: editor/plugins/script_text_editor.cpp
msgid "Pick Color"
@@ -5714,11 +5683,7 @@ msgstr "Capitalizar"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Syntax Highlighter"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
+msgstr "Destaque de Sintaxe"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
@@ -5771,12 +5736,12 @@ msgid "Trim Trailing Whitespace"
msgstr "Apagar espaços nos limites"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
-msgstr "Converter Indentação em espaços"
+msgid "Convert Indent to Spaces"
+msgstr "Converter Indentação em Espaços"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
-msgstr "Converter Indentação em tabulação"
+msgid "Convert Indent to Tabs"
+msgstr "Converter Indentação em Tabulação"
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
@@ -5792,37 +5757,28 @@ msgid "Remove All Breakpoints"
msgstr "Remover todos os Breakpoints"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr "Ir para próximo Breakpoint"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr "Ir para Breakpoint anterior"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr "Converter em maiúsculas"
+msgid "Go to Next Breakpoint"
+msgstr "Ir para Próximo Breakpoint"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr "Converter em minúsculas"
+msgid "Go to Previous Breakpoint"
+msgstr "Ir para Breakpoint Anterior"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
-msgstr "Encontrar anterior"
+msgstr "Localizar Anterior"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Find in files..."
-msgstr "Filtrar Ficheiro..."
+msgid "Find in Files..."
+msgstr "Localizar em Ficheiros..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+msgid "Go to Function..."
msgstr "Ir para Função..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
-msgstr "Ir para linha..."
+msgid "Go to Line..."
+msgstr "Ir para Linha..."
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
@@ -5834,40 +5790,35 @@ msgstr "Shader"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "This skeleton has no bones, create some children Bone2D nodes."
-msgstr ""
+msgstr "Este esqueleto não tem ossos, crie alguns nós Bone2D filhos."
#: editor/plugins/skeleton_2d_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton2D"
-msgstr "Instância única"
+msgstr "Esqueleto2D"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Make Rest Pose (From Bones)"
-msgstr ""
+msgstr "Criar Pose de Descanso (a partir de Ossos)"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Set Bones to Rest Pose"
-msgstr ""
+msgstr "Pôr Ossos em Pose de Descanso"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical bones"
-msgstr "Criar Mesh de navegação"
+msgstr "Criar ossos físicos"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton"
-msgstr "Instância única"
+msgstr "Esqueleto"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical skeleton"
-msgstr "Criar solução C#"
+msgstr "Criar esqueleto físico"
#: editor/plugins/skeleton_ik_editor_plugin.cpp
-#, fuzzy
msgid "Play IK"
-msgstr "Executar"
+msgstr "Executar IK"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Orthogonal"
@@ -5895,7 +5846,7 @@ msgstr "Transformação no Eixo Z."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Plane Transform."
-msgstr "Ver transformação do plano."
+msgstr "Ver Transformação do Plano."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Scaling: "
@@ -5918,6 +5869,14 @@ msgid "Animation Key Inserted."
msgstr "Chave de Animação inserida."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr "Inclinação"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr "Direção"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr "Objetos desenhados"
@@ -6002,9 +5961,8 @@ msgid "This operation requires a single selected node."
msgstr "Esta operação requer um único Nó selecionado."
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Lock View Rotation"
-msgstr "Ver informação"
+msgstr "Bloquear Rotação da Vista"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Normal"
@@ -6048,12 +6006,11 @@ msgstr "Audição de áudio"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Doppler Enable"
-msgstr "Efeito doppler"
+msgstr "Doppler Ativo"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Cinematic Preview"
-msgstr "A criar pré-visualizações de Mesh"
+msgstr "Previsualização cinemática"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
@@ -6084,6 +6041,10 @@ msgid "Freelook Speed Modifier"
msgstr "Modificador de velocidade Freelook"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "Rotação da Vista Bloqueada"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "Diálogo XForm"
@@ -6115,7 +6076,7 @@ msgstr "Modo escalar (R)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Local Coords"
-msgstr "Coordenadas locais"
+msgstr "Coordenadas Locais"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Local Space Mode (%s)"
@@ -6186,11 +6147,6 @@ msgid "Tool Scale"
msgstr "Ferramenta escalar"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap To Floor"
-msgstr "Ajustar à grelha"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Alternar Freelook"
@@ -6200,7 +6156,7 @@ msgstr "Transformar"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap object to floor"
-msgstr ""
+msgstr "Alinhar objetos ao chão"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Dialog..."
@@ -6231,9 +6187,8 @@ msgid "4 Viewports"
msgstr "4 vistas"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Gizmos"
-msgstr "Ver ferramentas"
+msgstr "Bugigangas"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Origin"
@@ -6308,51 +6263,49 @@ msgstr "Pré"
msgid "Post"
msgstr "Pós"
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr "Bugiganga sem nome"
+
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite is empty!"
-msgstr "A Mesh está vazia!"
+msgstr "Sprite está vazia!"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Can't convert a sprite using animation frames to mesh."
-msgstr ""
+msgstr "Impossível converter sprite com frames de animação para malha."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't replace by mesh."
-msgstr ""
+msgstr "Geometria inválida, não substituível por malha."
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite"
-msgstr "SpriteFrames"
+msgstr "Sprite"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to 2D Mesh"
-msgstr "Converter em %s"
+msgstr "Converter para Malha 2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create 2D Mesh"
-msgstr "Criar Mesh contorno"
+msgstr "Criar Malha 2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Simplification: "
-msgstr ""
+msgstr "Simplificação: "
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Grow (Pixels): "
-msgstr ""
+msgstr "Crescer (Pixeis): "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Update Preview"
-msgstr "Previsualização"
+msgstr "Atualizar Previsualização"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Settings:"
-msgstr "Configuração"
+msgstr "Configuração:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
@@ -6427,12 +6380,17 @@ msgid "Set Region Rect"
msgstr "Definir região Rect"
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr "Definir Margem"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr "Modo Ajuste:"
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
-msgstr "<Nenhum>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
+msgstr "Nenhum"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Pixel Snap"
@@ -6456,12 +6414,11 @@ msgstr "Passo:"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Sep.:"
-msgstr ""
+msgstr "Sep.:"
#: editor/plugins/texture_region_editor_plugin.cpp
-#, fuzzy
msgid "TextureRegion"
-msgstr "Região de textura"
+msgstr "TextureRegion"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Can't save theme to file:"
@@ -6592,9 +6549,12 @@ msgid "Erase Selection"
msgstr "Apagar seleção"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Fix Invalid Tiles"
-msgstr "Nome inválido."
+msgstr "Reparar Tiles inválidos"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Cut Selection"
+msgstr "Cortar Seleção"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
@@ -6617,9 +6577,8 @@ msgid "Erase TileMap"
msgstr "Apagar TileMap"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Find Tile"
-msgstr "Encontrar tile"
+msgstr "Localizar Tile"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Transpose"
@@ -6635,42 +6594,43 @@ msgstr "Espelho Y"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint Tile"
-msgstr "Pintar tile"
+msgstr "Pintar Tile"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Pick Tile"
-msgstr "Escolher tile"
+msgstr "Escolher Tile"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
-msgid "Move Selection"
-msgstr "Remover Selecção"
+msgid "Copy Selection"
+msgstr "Copiar Seleção"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr "Rodar 0 graus"
+msgid "Rotate left"
+msgstr "Rodar p/ esquerda"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr "Rodar 90 graus"
+msgid "Rotate right"
+msgstr "Rodar p/ direita"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
-msgstr "Rodar 180 graus"
+msgid "Flip horizontally"
+msgstr "Inverter horizontalmente"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
-msgstr "Rodar 270 graus"
+msgid "Flip vertically"
+msgstr "Inverter verticalmente"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Clear transform"
+msgstr "Limpar Transformação"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Add Texture(s) to TileSet"
-msgstr "Adicionar Nó da Ãrvore"
+msgid "Add Texture(s) to TileSet."
+msgstr "Adicionar Textura(s) ao TileSet."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Remove current Texture from TileSet"
-msgstr "Remover Entrada atual"
+msgid "Remove selected Texture from TileSet."
+msgstr "Remover Textura selecionado do TileSet."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -6681,104 +6641,209 @@ msgid "Merge from Scene"
msgstr "Fundir a partir da Cena"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
-msgstr ""
-"Selecionar sub-tile para usar como ícone, também será usado em ligações "
-"inválidas autotile."
+msgid "Copy bitmask."
+msgstr "Copiar bitmask."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
-msgstr ""
+msgid "Paste bitmask."
+msgstr "Colar bitmask."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Erase bitmask."
+msgstr "Apagar bitmask."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new polygon."
+msgstr "Criar um novo polígono."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr "Manter polígono dentro da região Rect."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
+msgstr "Ativar o snap and show grid (configurável através do Inspector)."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr "Exibir nome dos tiles (segure tecla Alt)"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove selected texture? This will remove all tiles which use it."
msgstr ""
+"Remover textura selecionada? Todos os tiles que a usam serão removidos."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
-msgstr ""
+msgstr "Não selecionou uma textura para remover."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
-msgstr "Criar a partir da Cena?"
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr "Criar a partir de cena? Irá substituir todos os tiles atuais."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
msgstr "Fundir a partir da Cena?"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
-msgstr ""
+msgid "Remove Texture"
+msgstr "Remover Textura"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
+msgstr "%s ficheiro(s) não foi/foram adicionado(s) por já estar(em) na lista."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Drag handles to edit Rect.\n"
"Click on another Tile to edit it."
msgstr ""
+"Arrastar manipuladores para editar Rect.\n"
+"Clique em outro Tile para o editar."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete selected Rect."
+msgstr "Eliminar Rect seleccionado."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
-"LMB: definir bit on.\n"
-"RMB: definir bit off."
+"Selecionar o sub-tile editado.\n"
+"Clique em outro Tile para o editar."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete polygon."
+msgstr "Apagar polígono."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
-msgstr "Selecionar o sub-tile editado."
+msgstr ""
+"LMB: Ligar bit.\n"
+"RMB: Desligar bit.\n"
+"Clique em outro Tile para o editar."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to use as icon, this will be also used on invalid autotile "
"bindings.\n"
"Click on another Tile to edit it."
msgstr ""
"Selecionar sub-tile para usar como ícone, também será usado em ligações "
-"inválidas autotile."
+"inválidas autotile.\n"
+"Clique em outro Tile para o editar."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to change its priority.\n"
"Click on another Tile to edit it."
-msgstr "Selecionar sub-tile para alterar a sua prioridade."
+msgstr ""
+"Selecionar sub-tile para alterar a sua prioridade.\n"
+"Clique em outro Tile para o editar."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+"Selecionar sub-tile para alterar o seu índice.\n"
+"Clique em outro Tile para o editar."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr "Definir Região Tile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Tile"
+msgstr "Criar Tile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr "Definir Ãcone de Tile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr "Editar Bitmask to Tile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Collision Polygon"
+msgstr "Editar Polígono de Colisão"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Occlusion Polygon"
+msgstr "Editar Polígono de Oclusão"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Navigation Polygon"
+msgstr "Editar Polígono de Navegação"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste Tile Bitmask"
+msgstr "Colar Bitmask de Tile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr "Limpar Bitmask de Tile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Tile"
+msgstr "Remover Tile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr "Remover Polígono de Colisão"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr "Remover Polígono de Oclusão"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr "Remover Polígono de Navegação"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr "Editar Prioridade de Tile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr "Editar Ãndice Z de Tile"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Collision Polygon"
+msgstr "Criar Polígono de Colisão"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Occlusion Polygon"
+msgstr "Criar Polígono de Oclusão"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "This property can't be changed."
-msgstr "Esta operação não pode ser efetuada sem uma Cena."
+msgstr "Esta propriedade não pode ser alterada."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
-msgstr "Conjunto de tiles"
+msgid "TileSet"
+msgstr "TileSet"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vertex"
-msgstr "Vértices"
+msgstr "Vértice"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Fragment"
-msgstr ""
+msgstr "Fragmento"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Light"
-msgstr "Direita"
+msgstr "Luz"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "VisualShader"
-msgstr "Shader"
+msgstr "VIsualShader"
#: editor/project_export.cpp
msgid "Runnable"
@@ -6798,6 +6863,14 @@ msgstr ""
"Modelos de exportação para esta plataforma estão ausentes/corrompidos :"
#: editor/project_export.cpp
+msgid "Release"
+msgstr "Libertar"
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr "A Exportar Tudo"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr "Predefinições"
@@ -6806,6 +6879,10 @@ msgid "Add..."
msgstr "Adicionar..."
#: editor/project_export.cpp
+msgid "Export Path"
+msgstr "Exportar Caminho"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr "Recursos"
@@ -6864,10 +6941,46 @@ msgid "Feature List:"
msgstr "Lista de características:"
#: editor/project_export.cpp
+msgid "Script"
+msgstr "Script"
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "Modo Exportação de Script:"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr "Texto"
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr "Compilado"
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "Encriptado (Fornecer Chave em Baixo)"
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr "Chave de Encriptação Inválida (tem de ter 64 caracteres)"
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "Chave de Encriptação de Script (Hexadecimal 256-bits):"
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr "Exportar PCK/Zip"
#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr "Modo Exportação?"
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr "Exportar Tudo"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr "Não existem Modelos de exportação para esta plataforma:"
@@ -6880,22 +6993,21 @@ msgid "The path does not exist."
msgstr "O Caminho não existe."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
-msgstr "Escolha uma pasta que não contenha um Ficheiro 'project.godot'."
+msgstr ""
+"Ficheiro de projeto '.zip' inválido, não contém um ficheiro 'project.godot'."
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "Por favor escolha uma pasta vazia."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "Escolha um Ficheiro 'project.godot'."
+msgstr "Escolha um ficheiro 'project.godot' ou '.zip'."
#: editor/project_manager.cpp
msgid "Directory already contains a Godot project."
-msgstr ""
+msgstr "A pasta já contém um projeto Godot."
#: editor/project_manager.cpp
msgid "Imported Project"
@@ -6986,9 +7098,8 @@ msgid "Project Path:"
msgstr "Caminho do Projeto:"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Project Installation Path:"
-msgstr "Caminho do Projeto:"
+msgstr "Caminho de Instalação do Projeto:"
#: editor/project_manager.cpp
msgid "Browse"
@@ -6999,8 +7110,8 @@ msgid "Unnamed Project"
msgstr "Projeto sem nome"
#: editor/project_manager.cpp
-msgid "Can't open project"
-msgstr "Impossível abrir Projeto"
+msgid "Can't open project at '%s'."
+msgstr "Impossível abrir Projeto em '%s'."
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
@@ -7008,6 +7119,34 @@ msgstr "Está seguro que quer abrir mais do que um Projeto?"
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+"A seguinte configuração do projeto foi gerada por um motor mais antigo, e "
+"precisa de ser convertida para esta versão.\n"
+"\n"
+"%s\n"
+"\n"
+"Deseja convertê-la?\n"
+"Aviso: Não conseguirá mais abrir o projeto em versões anteriores à deste "
+"motor."
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+"A configuração do projeto foi criada por um motor de versão mais recente, "
+"cuja configuração não é compatível com esta versão."
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7109,13 +7248,12 @@ msgid "Mouse Button"
msgstr "Botão do rato"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid ""
"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
msgstr ""
"Nome de ação inválido. Não pode ser vazio nem conter '/', ':', '=', '\\' ou "
-"'\"'."
+"'\"'"
#: editor/project_settings_editor.cpp
msgid "Action '%s' already exists!"
@@ -7126,18 +7264,16 @@ msgid "Rename Input Action Event"
msgstr "Renomear evento ação de entrada"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Change Action deadzone"
-msgstr "Mudar o Nome da Animação:"
+msgstr "Mudar a zona morta da Ação"
#: editor/project_settings_editor.cpp
msgid "Add Input Action Event"
msgstr "Adicionar evento ação de entrada"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "All Devices"
-msgstr "Dispositivo"
+msgstr "Todos os Dispositivos"
#: editor/project_settings_editor.cpp
msgid "Device"
@@ -7184,24 +7320,20 @@ msgid "Wheel Down Button"
msgstr "Botão roda para baixo"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Left Button"
-msgstr "Botão roda para cima"
+msgstr "Roda Botão Esquerdo"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Right Button"
-msgstr "Botão direito"
+msgstr "Roda Botão Direito"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 1"
-msgstr "Botão 6"
+msgstr "X Botão 1"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 2"
-msgstr "Botão 6"
+msgstr "X Botão 2"
#: editor/project_settings_editor.cpp
msgid "Joypad Axis Index:"
@@ -7343,17 +7475,13 @@ msgstr "Definições do Projeto (project.godot)"
msgid "General"
msgstr "Geral"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr "Propriedade:"
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr "Sobrepor por..."
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Editor must be restarted for changes to take effect"
-msgstr ""
+msgstr "O editor deve ser reiniciado para que as alterações entrem em vigor"
#: editor/project_settings_editor.cpp
msgid "Input Map"
@@ -7364,13 +7492,12 @@ msgid "Action:"
msgstr "Ação:"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Action"
-msgstr "Ação:"
+msgstr "Ação"
#: editor/project_settings_editor.cpp
msgid "Deadzone"
-msgstr ""
+msgstr "Zona morta"
#: editor/project_settings_editor.cpp
msgid "Device:"
@@ -7480,10 +7607,6 @@ msgstr "Escolha um Nó"
msgid "Bit %d, val %d."
msgstr "Bit %d, val %d."
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr "Propriedades:"
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr "Selecionar Propriedade"
@@ -7505,129 +7628,122 @@ msgid "Can't load back converted image using PVRTC tool:"
msgstr "Impossível carregar imagem convertida com a ferramenta PVRTC:"
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Batch Rename"
-msgstr "Renomear"
+msgstr "Renomear em massa"
#: editor/rename_dialog.cpp
msgid "Prefix"
-msgstr ""
+msgstr "Prefixo"
#: editor/rename_dialog.cpp
msgid "Suffix"
-msgstr ""
+msgstr "Sufixo"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Advanced options"
-msgstr "Opções de Ajuste"
+msgstr "Opções Avançadas"
#: editor/rename_dialog.cpp
msgid "Substitute"
-msgstr ""
+msgstr "Substituto"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node name"
-msgstr "Nome do Nó:"
+msgstr "Nome do Nó"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
-msgstr ""
+msgstr "Nome do parente do Nó, se disponível"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node type"
-msgstr "Encontrar tipo de Nó"
+msgstr "Tipo de Nó"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Current scene name"
-msgstr "Cena atual"
+msgstr "Nome da cena atual"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Root node name"
-msgstr "Renomear"
+msgstr "Nome do Nó raiz"
#: editor/rename_dialog.cpp
msgid ""
"Sequential integer counter.\n"
"Compare counter options."
msgstr ""
+"Contador sequencial de inteiros.\n"
+"Comparar opções do contador."
#: editor/rename_dialog.cpp
msgid "Per Level counter"
-msgstr ""
+msgstr "Contador por nível"
#: editor/rename_dialog.cpp
msgid "If set the counter restarts for each group of child nodes"
-msgstr ""
+msgstr "Se definido o contador reinicia para cada grupo de nós filhos"
#: editor/rename_dialog.cpp
msgid "Initial value for the counter"
-msgstr ""
+msgstr "Valor inicial do contador"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Step"
-msgstr "Passo:"
+msgstr "Passo"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
-msgstr ""
+msgid "Amount by which counter is incremented for each node"
+msgstr "Valor pelo qual cada contador é incrementado para cada nó"
#: editor/rename_dialog.cpp
msgid "Padding"
-msgstr ""
+msgstr "Preenchimento"
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
+"Número mínimo de dígitos para o contador.\n"
+"Dígitos ausentes são preenchidos com zeros."
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Regular Expressions"
-msgstr "Mudar Expressão"
+msgstr "Expressões Regulares"
#: editor/rename_dialog.cpp
msgid "Post-Process"
-msgstr ""
+msgstr "Pós-processamento"
#: editor/rename_dialog.cpp
msgid "Keep"
-msgstr ""
+msgstr "Manter"
#: editor/rename_dialog.cpp
msgid "CamelCase to under_scored"
-msgstr ""
+msgstr "CamelCase para under_scored"
#: editor/rename_dialog.cpp
msgid "under_scored to CamelCase"
-msgstr ""
+msgstr "under_scored para CamelCase"
#: editor/rename_dialog.cpp
msgid "Case"
-msgstr ""
+msgstr "Caixa"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Lowercase"
-msgstr "Minúsculas"
+msgstr "Para Minúsculas"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Uppercase"
-msgstr "Maiúsculas"
+msgstr "Para Maiúsculas"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Reset"
-msgstr "Repor Zoom"
+msgstr "Restaurar"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr "Erro"
@@ -7637,7 +7753,7 @@ msgstr "Recolocar Nó"
#: editor/reparent_dialog.cpp
msgid "Reparent Location (Select new Parent):"
-msgstr "Recolocar localização (selecionar novo parente):"
+msgstr "Recolocar localização (selecionar novo Parente):"
#: editor/reparent_dialog.cpp
msgid "Keep Global Transform"
@@ -7688,6 +7804,10 @@ msgid "Instance Scene(s)"
msgstr "Cena(s) da Instância"
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "Instanciar Cena filha"
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr "Limpar Script"
@@ -7697,11 +7817,11 @@ msgstr "Esta operação não pode ser feita na raiz da árvore."
#: editor/scene_tree_dock.cpp
msgid "Move Node In Parent"
-msgstr "Mover Nó no parente"
+msgstr "Mover Nó no Parente"
#: editor/scene_tree_dock.cpp
msgid "Move Nodes In Parent"
-msgstr "Mover Nós no parente"
+msgstr "Mover Nós no Parente"
#: editor/scene_tree_dock.cpp
msgid "Duplicate Node(s)"
@@ -7724,6 +7844,14 @@ msgid "Save New Scene As..."
msgstr "Guardar nova Cena como..."
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+"Desativar \"editable_instance\" irá reverter todas as propriedades do Nó "
+"para os seus valores padrão."
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr "Filhos editáveis"
@@ -7732,34 +7860,28 @@ msgid "Load As Placeholder"
msgstr "Carregar como marcador de posição"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make Local"
-msgstr "Local"
+msgstr "Tornar Local"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "Criar Nó"
+msgstr "Criar Nó Raiz:"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "2D Scene"
-msgstr "Cena"
+msgstr "Cena 2D"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "3D Scene"
-msgstr "Cena"
+msgstr "Cena 3D"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "User Interface"
-msgstr "Limpar herança"
+msgstr "Interface do Utilizador"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Custom Node"
-msgstr "Cortar Nós"
+msgstr "Nó Personalizado"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
@@ -7802,6 +7924,10 @@ msgid "Clear Inheritance"
msgstr "Limpar herança"
#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr "Abrir documentação"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr "Apagar Nó(s)"
@@ -7810,17 +7936,16 @@ msgid "Add Child Node"
msgstr "Adicionar Nó filho"
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
-msgstr "Instanciar Cena filha"
-
-#: editor/scene_tree_dock.cpp
msgid "Change Type"
msgstr "Mudar tipo"
#: editor/scene_tree_dock.cpp
-#, fuzzy
+msgid "Extend Script"
+msgstr "Estender Script"
+
+#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
-msgstr "Faz sentido!"
+msgstr "Tornar Nó Raiz"
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
@@ -7871,21 +7996,19 @@ msgid "Clear Inheritance? (No Undo!)"
msgstr "Limpar herança? (Sem retrocesso!)"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Toggle Visible"
-msgstr "Alternar visibilidade"
+msgstr "Alternar Visibilidade"
#: editor/scene_tree_editor.cpp
msgid "Node configuration warning:"
msgstr "Aviso de configuração do Nó:"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node has connection(s) and group(s).\n"
"Click to show signals dock."
msgstr ""
-"Nó tem conexões e grupo(s).\n"
+"Nó tem conexões e grupos.\n"
"Clique para mostrar doca dos sinais."
#: editor/scene_tree_editor.cpp
@@ -7905,27 +8028,24 @@ msgstr ""
"Clique para mostrar doca dos grupos."
#: editor/scene_tree_editor.cpp editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script"
msgstr "Abrir Script"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node is locked.\n"
"Click to unlock it."
msgstr ""
"Nó está bloqueado.\n"
-"Clique para desbloquear"
+"Clique para desbloquear."
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Children are not selectable.\n"
"Click to make selectable."
msgstr ""
"Filhos não são selecionáveis.\n"
-"Clique para os tornar selecionáveis"
+"Clique para os tornar selecionáveis."
#: editor/scene_tree_editor.cpp
msgid "Toggle Visibility"
@@ -7936,6 +8056,8 @@ msgid ""
"AnimationPlayer is pinned.\n"
"Click to unpin."
msgstr ""
+"AnimationPlayer está fixado.\n"
+"Clique para desafixar."
#: editor/scene_tree_editor.cpp
msgid "Invalid node name, the following characters are not allowed:"
@@ -7974,15 +8096,18 @@ msgid "N/A"
msgstr "N/A"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script/Choose Location"
-msgstr "Abrir Editor de Scripts"
+msgstr "Abrir Script/Escolher Localização"
#: editor/script_create_dialog.cpp
msgid "Path is empty"
msgstr "Caminho está vazio"
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr "Nome do ficheiro vazio"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr "Caminho não é local"
@@ -8071,20 +8196,8 @@ msgid "Bytes:"
msgstr "Bytes:"
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr "Aviso"
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr "Erro:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr "Fonte:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
-msgstr "Função:"
+msgid "Stack Trace"
+msgstr "Rastreamento de Pilha"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8115,18 +8228,6 @@ msgid "Stack Frames"
msgstr "Empilhar Frames"
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr "Variável"
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr "Erros:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr "Stack Trace (se aplicável):"
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr "Profiler"
@@ -8215,9 +8316,8 @@ msgid "Change Camera Size"
msgstr "Mudar tamanho da câmara"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Notifier AABB"
-msgstr "Mudar extensões de notificador"
+msgstr "Mudar Notificador AABB"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Particles AABB"
@@ -8244,38 +8344,32 @@ msgid "Change Capsule Shape Height"
msgstr "Mudar altura da forma cápsula"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Radius"
-msgstr "Mudar raio da forma cápsula"
+msgstr "Mudar Raio da Forma Cilindro"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Height"
-msgstr "Mudar altura da forma cápsula"
+msgstr "Mudar Altura da Forma Cilindro"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Ray Shape Length"
msgstr "Mudar comprimento da forma raio"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Radius"
-msgstr "Mudar raio da luz"
+msgstr "Mudar Raio do Cilindro"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Height"
-msgstr "Mudar altura da forma cápsula"
+msgstr "Mudar Altura do CIlindro"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Inner Radius"
-msgstr "Mudar raio da forma esfera"
+msgstr "Mudar Raio Interno do Toro"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Outer Radius"
-msgstr "Mudar raio da luz"
+msgstr "Mudar Raio Externo do Toro"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select the dynamic library for this entry"
@@ -8330,8 +8424,8 @@ msgid "GDNative"
msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
-msgstr "o argumento \"step\" é zero!"
+msgid "Step argument is zero!"
+msgstr "O argumento \"step\" é zero!"
#: modules/gdscript/gdscript_functions.cpp
msgid "Not a script with an instance"
@@ -8396,9 +8490,8 @@ msgid "GridMap Delete Selection"
msgstr "Apagar seleção GridMap"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Fill Selection"
-msgstr "Apagar seleção GridMap"
+msgstr "Seleção de Preenchimento de GridMap"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Duplicate Selection"
@@ -8481,9 +8574,8 @@ msgid "Clear Selection"
msgstr "Limpar Seleção"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Fill Selection"
-msgstr "Toda Selecção"
+msgstr "Preencher Seleção"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Settings"
@@ -8546,25 +8638,20 @@ msgid "Warnings"
msgstr "Avisos"
#: modules/mono/editor/mono_bottom_panel.cpp
-#, fuzzy
msgid "View log"
-msgstr "Ver Ficheiros"
+msgstr "Ver log"
#: modules/mono/mono_gd/gd_mono_utils.cpp
msgid "End of inner exception stack trace"
msgstr "Fim do stack trace de exceção interna"
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr "Cozinhar!"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
-msgstr "Cozinhar a Mesh de navegação."
+msgid "Bake NavMesh"
+msgstr "Consolidar NavMesh"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
-msgstr "Limpar a Mesh de navegação."
+msgstr "Limpar a Malha de navegação."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Setting up Configuration..."
@@ -8604,11 +8691,11 @@ msgstr "A criar polymesh..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Converting to native navigation mesh..."
-msgstr "A converter para Mesh de navegação nativa..."
+msgstr "A converter para Malha de navegação nativa..."
#: modules/recast/navigation_mesh_generator.cpp
msgid "Navigation Mesh Generator Setup:"
-msgstr "Configuração do gerador da Mesh de navegação:"
+msgstr "Configuração do gerador da Malha de navegação:"
#: modules/recast/navigation_mesh_generator.cpp
msgid "Parsing Geometry..."
@@ -8668,7 +8755,7 @@ msgstr "Mudar nome do argumento"
#: modules/visual_script/visual_script_editor.cpp
msgid "Set Variable Default Value"
-msgstr "Definir valor padrão da variável"
+msgstr "Definir Valor Padrão da Variável"
#: modules/visual_script/visual_script_editor.cpp
msgid "Set Variable Type"
@@ -8787,14 +8874,12 @@ msgid "Connect Nodes"
msgstr "Conectar Nós"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Data"
-msgstr "Conectar Nós"
+msgstr "Conectar Dados de Nó"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Sequence"
-msgstr "Conectar Nós"
+msgstr "Conectar Sequência de Nós"
#: modules/visual_script/visual_script_editor.cpp
msgid "Script already has function '%s'"
@@ -8841,6 +8926,10 @@ msgid "Base Type:"
msgstr "Tipo de Base:"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "Membros:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "Nós Disponíveis:"
@@ -8862,7 +8951,7 @@ msgstr "Apagar Selecionados"
#: modules/visual_script/visual_script_editor.cpp
msgid "Find Node Type"
-msgstr "Encontrar tipo de Nó"
+msgstr "Localizar Tipo de Nó"
#: modules/visual_script/visual_script_editor.cpp
msgid "Copy Nodes"
@@ -8877,9 +8966,8 @@ msgid "Paste Nodes"
msgstr "Colar Nós"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
-msgstr "Membros"
+msgstr "Editar Membros"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Input type not iterable: "
@@ -8903,7 +8991,7 @@ msgstr "Objeto de base não é um Nó!"
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Path does not lead Node!"
-msgstr "Caminho não aponta para nenhum Nó!"
+msgstr "Caminho não conduz Nó!"
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Invalid index property name '%s' in node %s."
@@ -8938,17 +9026,16 @@ msgstr ""
"string (error)."
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Search VisualScript"
-msgstr "Remover Nó VisualScript"
+msgstr "Procurar VisualScript"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
-msgstr "Obter"
+msgid "Get %s"
+msgstr "Obter %s"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
-msgstr ""
+msgid "Set %s"
+msgstr "Definir %s"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -8980,7 +9067,7 @@ msgstr "Impossível ler Ficheiro de imagem do ecrã de inicialização:"
#: platform/javascript/export/export.cpp
msgid "Using default boot splash image."
-msgstr "A usar imagem de inicialização por defeito."
+msgstr "A usar imagem padrão de inicialização."
#: scene/2d/animated_sprite.cpp
msgid ""
@@ -9000,16 +9087,15 @@ msgstr ""
"ignorado."
#: scene/2d/collision_object_2d.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
"define its shape."
msgstr ""
-"Este nó não tem formas filhos, não conseguindo assim interagir com o "
-"espaço.\n"
-"Considere adicionar nós filhos CollisionShape2D ou CollisionPolygon2D para "
-"definir a sua forma."
+"Este nó não tem forma, não conseguindo assim colidir ou interagir com outros "
+"objetos.\n"
+"Considere adicionar nós CollisionShape2D ou CollisionPolygon2D como filhos "
+"para definir a sua forma."
#: scene/2d/collision_polygon_2d.cpp
msgid ""
@@ -9043,6 +9129,14 @@ msgstr ""
"Uma forma tem de ser fornecida para CollisionShape2D funcionar. Crie um "
"recurso forma!"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+"Animação CPUParticles2D requer o uso de um CanvasItemMaterial com "
+"\"Particles Animation\" ativada."
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -9093,6 +9187,14 @@ msgstr ""
"Não foi atribuído um Material para processar as partículas, não possuindo um "
"comportamento."
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+"Animação Particles2D requer o uso de um CanvasItemMaterial com \"Particles "
+"Animation\" ativada."
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -9116,16 +9218,16 @@ msgstr ""
#: scene/2d/skeleton_2d.cpp
msgid "This Bone2D chain should end at a Skeleton2D node."
-msgstr ""
+msgstr "Esta corrente de Bone2D deve terminar em um nó Skeleton2D."
#: scene/2d/skeleton_2d.cpp
msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
-msgstr ""
+msgstr "Um Bone2D só funciona com um nó parente Skeleton2D ou Bone2D."
#: scene/2d/skeleton_2d.cpp
msgid ""
"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
-msgstr ""
+msgstr "Falta uma pose DESCANSO a este osso. Vá ao nó Skeleton2D e defina uma."
#: scene/2d/visibility_notifier_2d.cpp
msgid ""
@@ -9192,15 +9294,14 @@ msgid "Lighting Meshes: "
msgstr "A iluminar Meshes: "
#: scene/3d/collision_object.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape or CollisionPolygon as a child to define "
"its shape."
msgstr ""
-"Este nó não tem formas filhos, não conseguindo assim interagir com o "
-"espaço.\n"
-"Considere adicionar nós filhos CollisionShape ou CollisionPolygon para "
+"Este nó não tem forma, não conseguindo assim colidir ou interagir com outros "
+"objetos.\n"
+"Considere adicionar nós CollisionShape ou CollisionPolygon como filhos para "
"definir a sua forma."
#: scene/3d/collision_polygon.cpp
@@ -9235,6 +9336,18 @@ msgstr ""
"Uma forma tem de ser fornecida para CollisionShape funcionar. Crie um "
"recurso forma!"
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr "Nada é visível porque nenhuma Malha foi atribuída."
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+"Animação CPUParticles requer o uso de um SpatialMaterial com \"Billboard "
+"Particles\" ativada."
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr "A desenhar Meshes"
@@ -9259,6 +9372,30 @@ msgid ""
msgstr ""
"Nada é visível porque não foram atribuídas Meshes aos passos de desenho."
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+"Animação Particles requer o uso de um SpatialMaterial com \"Billboard "
+"Particles\" ativada."
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr "PathFollow apenas funciona quando definido como filho de um Nó Path."
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+"OrientedPathFollow apenas funciona quando definido como filho de um Nó Path."
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+"OrientedPathFollow requer \"Up Vector\" ativado no recurso Curve do pai dele."
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9296,18 +9433,17 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid "This body will be ignored until you set a mesh"
-msgstr ""
+msgstr "Este corpo será ignorado até se definir uma Malha"
#: scene/3d/soft_body.cpp
-#, fuzzy
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
-"Mudanças no tamanho do RigidBody (em modos caráter ou rígido) serão "
-"reescritas pelo motor de física na execução.\n"
-"Mude antes o tamanho das formas de colisão filhas."
+"Mudanças no tamanho do SoftBody serão reescritas pelo motor de física na "
+"execução.\n"
+"Em vez disso, mude o tamanho das formas de colisão filhas."
#: scene/3d/sprite_3d.cpp
msgid ""
@@ -9327,44 +9463,45 @@ msgstr ""
#: scene/animation/animation_blend_tree.cpp
msgid "On BlendTree node '%s', animation not found: '%s'"
-msgstr ""
+msgstr "No nó BlendTree '%s', animação não encontrada: '%s'"
#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "Ferramentas de Animação"
+msgstr "Animação não encontrada: '%s'"
#: scene/animation/animation_tree.cpp
msgid "In node '%s', invalid animation: '%s'."
-msgstr ""
+msgstr "No nó '%s', animação inválida: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "ERRO: Nome de Animação inválido!"
+msgstr "Animação inválida: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "Desligar '%s' de '%s'"
+msgstr "Nada conectado à entrada '%s' do nó '%s'."
#: scene/animation/animation_tree.cpp
msgid "A root AnimationNode for the graph is not set."
-msgstr ""
+msgstr "Não foi definida um AnimationNode raiz para o gráfico."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Path to an AnimationPlayer node containing animations is not set."
-msgstr "Selecionar um AnimationPlayer da Scene Tree para editar Animações."
+msgstr ""
+"Caminho para um nó AnimationPlayer contendo animações não está definido."
#: scene/animation/animation_tree.cpp
msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
msgstr ""
+"O caminho definido para AnimationPlayer não conduz a um nó AnimationPlayer."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "AnimationPlayer root is not a valid node."
-msgstr "Ãrvore de Animação inválida."
+msgstr "A raiz de AnimationPlayer não é um nó válido."
+
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr "Este nó foi depreciado. Use AnimationTree em vez disso."
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
@@ -9382,10 +9519,6 @@ msgstr "Alerta!"
msgid "Please Confirm..."
msgstr "Confirme por favor..."
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr "Selecionar esta pasta"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9396,6 +9529,10 @@ msgstr ""
"das funções popup*(). Torná-las visíveis para edição é aceitável, mas serão "
"escondidas na execução."
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr "Se exp_edit é verdadeiro min_value tem de ser > 0."
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9415,7 +9552,7 @@ msgid ""
"Default Environment as specified in Project Settings (Rendering -> "
"Environment -> Default Environment) could not be loaded."
msgstr ""
-"Ambiente padrão especificado em Configuração do Projeto (Rendering -> "
+"Ambiente Padrão especificado em Configuração do Projeto (Rendering -> "
"Environment -> Default Environment) não pode ser carregado."
#: scene/main/viewport.cpp
@@ -9447,31 +9584,222 @@ msgid "Invalid font size."
msgstr "Tamanho de letra inválido."
#: scene/resources/visual_shader.cpp
-#, fuzzy
msgid "Input"
-msgstr "Adicionar entrada"
-
-#: scene/resources/visual_shader.cpp
-#, fuzzy
-msgid "None"
-msgstr "<Nenhum>"
+msgstr "Entrada"
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for shader."
-msgstr "Tamanho de letra inválido."
+msgstr "Fonte inválida para Shader."
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
-msgstr ""
+msgstr "Atribuição a função."
#: servers/visual/shader_language.cpp
msgid "Assignment to uniform."
-msgstr ""
+msgstr "Atribuição a uniforme."
#: servers/visual/shader_language.cpp
msgid "Varyings can only be assigned in vertex function."
-msgstr ""
+msgstr "Variações só podem ser atribuídas na função vértice."
+
+#~ msgid "Split point with itself."
+#~ msgstr "Separar ponto consigo próprio."
+
+#~ msgid "Split can't form an existing edge."
+#~ msgstr "Separação não forma uma aresta existente."
+
+#~ msgid "Split already exists."
+#~ msgstr "Separação já existe."
+
+#~ msgid "Add Split"
+#~ msgstr "Adicionar Separação"
+
+#~ msgid "Invalid Split: "
+#~ msgstr "Separação inválida: "
+
+#~ msgid "Remove Split"
+#~ msgstr "Remover Separação"
+
+#~ msgid "Poly"
+#~ msgstr "Poli"
+
+#~ msgid "Splits"
+#~ msgstr "Separações"
+
+#~ msgid "Connect two points to make a split."
+#~ msgstr "Conectar dois pontos para fazer uma divisão."
+
+#~ msgid "Select a split to erase it."
+#~ msgstr "Selecionar uma separação para a apagar."
+
+#~ msgid "No name provided"
+#~ msgstr "Nenhum nome foi fornecido"
+
+#~ msgid "Add Node.."
+#~ msgstr "Adicionar Nó.."
+
+#~ msgid "Create from scene?"
+#~ msgstr "Criar a partir da Cena?"
+
+#~ msgid "Create Poly"
+#~ msgstr "Criar Polígono"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "Criar um novo Polígono de raíz"
+
+#~ msgid "Zoom out"
+#~ msgstr "Diminuir zoom"
+
+#~ msgid "Zoom in"
+#~ msgstr "Aumentar zoom"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "Criar Poly3D"
+
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "Não há recurso OccluderPolygon2D neste Nó.\n"
+#~ "Criar um e associar?"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "LMB: Mover Ponto."
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "Ctrl+LMB: Separar segmento."
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "RMB: Apagar Ponto."
+
+#~ msgid "New TextFile"
+#~ msgstr "Novo TextFile"
+
+#~ msgid "Save Theme As"
+#~ msgstr "Guardar tema como"
+
+#~ msgid "<None>"
+#~ msgstr "<Nenhum>"
+
+#~ msgid ""
+#~ "Select sub-tile to use as icon, this will be also used on invalid "
+#~ "autotile bindings."
+#~ msgstr ""
+#~ "Selecionar sub-tile para usar como ícone, também será usado em ligações "
+#~ "autotile inválidas."
+
+#~ msgid "Zoom:"
+#~ msgstr "Zoom:"
+
+#~ msgid "Are you sure you want to remove all connections from the \""
+#~ msgstr "Está seguro que quer remover todas as conexões de \""
+
+#~ msgid "Class List:"
+#~ msgstr "Lista de Classes:"
+
+#~ msgid "Search Classes"
+#~ msgstr "Procurar Classes"
+
+#~ msgid "Public Methods"
+#~ msgstr "Métodos Públicos"
+
+#~ msgid "Public Methods:"
+#~ msgstr "Métodos Públicos:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "Itens do tema GUI"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "Itens do tema GUI:"
+
+#~ msgid "Property: "
+#~ msgstr "Propriedade: "
+
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "Alternar a pasta de situação como Favorita."
+
+#~ msgid "Show current scene file."
+#~ msgstr "Mostrar o ficheiro da cena atual."
+
+#~ msgid "Enter tree-view."
+#~ msgstr "Ir para Vista de árvore."
+
+#~ msgid "Whole words"
+#~ msgstr "Palavras completas"
+
+#~ msgid "Match case"
+#~ msgstr "Sensível a maiúsculas/minúsculas"
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#~ msgid "Show In File System"
+#~ msgstr "Mostrar no Sistema de Ficheiros"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "Procurar na hierarquia de classe."
+
+#~ msgid "Search in files"
+#~ msgstr "Procurar em ficheiros"
+
+#~ msgid ""
+#~ "Built-in scripts can only be edited when the scene they belong to is "
+#~ "loaded"
+#~ msgstr ""
+#~ "Scripts incorporados só podem ser editados quando a Cena a que pertencem "
+#~ "é carregada"
+
+#~ msgid "Convert To Uppercase"
+#~ msgstr "Converter em maiúsculas"
+
+#~ msgid "Convert To Lowercase"
+#~ msgstr "Converter em minúsculas"
+
+#~ msgid "Snap To Floor"
+#~ msgstr "Ajustar ao Fundo"
+
+#~ msgid "Rotate 0 degrees"
+#~ msgstr "Rodar 0 graus"
+
+#~ msgid "Rotate 90 degrees"
+#~ msgstr "Rodar 90 graus"
+
+#~ msgid "Rotate 180 degrees"
+#~ msgstr "Rodar 180 graus"
+
+#~ msgid "Rotate 270 degrees"
+#~ msgstr "Rodar 270 graus"
+
+#~ msgid "Warning"
+#~ msgstr "Aviso"
+
+#~ msgid "Error:"
+#~ msgstr "Erro:"
+
+#~ msgid "Source:"
+#~ msgstr "Fonte:"
+
+#~ msgid "Function:"
+#~ msgstr "Função:"
+
+#~ msgid "Variable"
+#~ msgstr "Variável"
+
+#~ msgid "Errors:"
+#~ msgstr "Erros:"
+
+#~ msgid "Stack Trace (if applicable):"
+#~ msgstr "Stack Trace (se aplicável):"
+
+#~ msgid "Bake!"
+#~ msgstr "Cozinhar!"
+
+#~ msgid "Bake the navigation mesh."
+#~ msgstr "Cozinhar a Malha de navegação."
+
+#~ msgid "Get"
+#~ msgstr "Obter"
#~ msgid "Change Scalar Constant"
#~ msgstr "Mudar constante escalar"
@@ -9549,16 +9877,16 @@ msgstr ""
#~ msgstr "Desconectar Nós do gráfico"
#~ msgid "Remove Shader Graph Node"
-#~ msgstr "Remover Nó Shader"
+#~ msgstr "Remover Nó Gráfico Shader"
#~ msgid "Move Shader Graph Node"
-#~ msgstr "Mover Nó Shader"
+#~ msgstr "Mover Nó Gráfico Shader"
#~ msgid "Duplicate Graph Node(s)"
#~ msgstr "Duplicar Nó(s)"
#~ msgid "Delete Shader Graph Node(s)"
-#~ msgstr "Apagar Nó(s) Shader"
+#~ msgstr "Apagar Nó(s) Gráfico(s) Shader"
#~ msgid "Error: Cyclic Connection Link"
#~ msgstr "Erro: conexão cíclica"
@@ -9567,7 +9895,7 @@ msgstr ""
#~ msgstr "Erro: Faltam conexões de entrada"
#~ msgid "Add Shader Graph Node"
-#~ msgstr "Adicionar Nó Shader"
+#~ msgstr "Adicionar Nó Gráfico Shader"
#~ msgid "Disabled"
#~ msgstr "Desativado"
@@ -9671,9 +9999,6 @@ msgstr ""
#~ msgid "Run Script"
#~ msgstr "Executar Script"
-#~ msgid "Save the currently edited resource."
-#~ msgstr "Guarde o recurso editado."
-
#~ msgid "Stop Profiling"
#~ msgstr "Parar análise"
@@ -9786,9 +10111,6 @@ msgstr ""
#~ msgid "Sequence"
#~ msgstr "Sequência"
-#~ msgid "Switch"
-#~ msgstr "Trocar"
-
#~ msgid "Iterator"
#~ msgstr "Iterador"
diff --git a/editor/translations/ro.po b/editor/translations/ro.po
index f668c20d96..4d4084ffa8 100644
--- a/editor/translations/ro.po
+++ b/editor/translations/ro.po
@@ -1,6 +1,6 @@
# Romanian translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# Calin Sopterean <csopterean@gmail.com>, 2018.
# Filip <filipanton@tutanota.com>, 2018.
@@ -10,16 +10,18 @@
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-08-05 00:52+0000\n"
-"Last-Translator: Grigore Antoniuc <grisa181@gmail.com>\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:42+0100\n"
+"Last-Translator: Nitroretro <nitroretro@protonmail.com>\n"
"Language-Team: Romanian <https://hosted.weblate.org/projects/godot-engine/"
"godot/ro/>\n"
"Language: ro\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
"20)) ? 1 : 2;\n"
-"X-Generator: Weblate 3.1.1\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -27,7 +29,7 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr ""
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
@@ -70,24 +72,20 @@ msgid "Balanced"
msgstr ""
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Mirror"
-msgstr "Eroare!"
+msgstr "Reflectează"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "Inserează Notă"
+msgstr "Inserează Cheie Aici"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "Duplicați Selecția"
+msgstr "Duplicați Cheile Selectate"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "Ştergeți fişierele selectate?"
+msgstr "Ştergeți Cheile Selectate"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -268,7 +266,6 @@ msgstr "Creați %d piste NOI și inserați cheie?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -402,8 +399,7 @@ msgstr "Scalați Selecția"
msgid "Scale From Cursor"
msgstr "Scalați De La Cursor"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Duplicați Selecția"
@@ -417,11 +413,13 @@ msgid "Delete Selection"
msgstr "Centrează Selecția"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+#, fuzzy
+msgid "Go to Next Step"
msgstr "Mergeți la Pasul Următor"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+#, fuzzy
+msgid "Go to Previous Step"
msgstr "Mergeți la Pasul Anterior"
#: editor/animation_track_editor.cpp
@@ -524,11 +522,11 @@ msgstr "Nici o Potrivire"
msgid "Replaced %d occurrence(s)."
msgstr "ÃŽnlocuit %d potriviri."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Potrivește Caz-ul"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "Cuvinte Complete"
@@ -544,15 +542,19 @@ msgstr "Înlocuiți Tot"
msgid "Selection Only"
msgstr "Numai Selecția"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Zoom-ați În"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "Zoom-ați Afară"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "Resetați Zoom-area"
@@ -562,10 +564,10 @@ msgstr ""
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "Zoom-ați În"
+msgid "Font Size:"
+msgstr "Dimensiunea Conturului:"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Linie:"
@@ -598,6 +600,7 @@ msgstr "Adăugați"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -679,7 +682,7 @@ msgstr "Eroare de Conexiune"
#: editor/connections_dialog.cpp
#, fuzzy
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "Ești sigur că vrei să execuți acel proiect?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -728,23 +731,20 @@ msgid "Recent:"
msgstr "Recent:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Cautați:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "Potriviri:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "Descriere:"
@@ -783,8 +783,7 @@ msgid "Resource"
msgstr "Resursă"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "Cale"
@@ -805,9 +804,10 @@ msgid "Search Replacement Resource:"
msgstr "Cautați Înlocuitor Resursă:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -840,7 +840,8 @@ msgid "Error loading:"
msgstr "Eroare încărcând:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+#, fuzzy
+msgid "Load failed due to missing dependencies:"
msgstr "Scena nu a putut fi încărcata deoarece are dependențe în lipsa:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -899,14 +900,6 @@ msgstr "Schimbaţi Valoarea Dicţionar"
msgid "Thanks from the Godot community!"
msgstr "Mulțumesc din partea comunităţii Godot!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr ""
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Contribuabili Motor Godot"
@@ -1000,7 +993,8 @@ msgid "Uncompressing Assets"
msgstr "Decomprimare Asset-uri"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+#, fuzzy
+msgid "Package installed successfully!"
msgstr "Pachet Instalat cu Succes!"
#: editor/editor_asset_installer.cpp
@@ -1082,8 +1076,7 @@ msgid "Bus options"
msgstr "Opțiuni Pistă Audio"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "Duplicați"
@@ -1247,7 +1240,7 @@ msgid "Add AutoLoad"
msgstr "Adaugați AutoLoad"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "Cale:"
@@ -1255,8 +1248,8 @@ msgstr "Cale:"
msgid "Node Name:"
msgstr "Nume Nod:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "Nume"
@@ -1326,11 +1319,16 @@ msgid "Template file not found:"
msgstr "Fișierul șablon nu a fost găsit:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Selectaţi directorul curent"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "Fișierul există, suprascrieţi?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
+#, fuzzy
+msgid "Select This Folder"
msgstr "Selectaţi directorul curent"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1339,12 +1337,13 @@ msgstr "Copiaţi Calea"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr "Arătați în Administratorul de Fișiere"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+#, fuzzy
+msgid "Show in File Manager"
msgstr "Arătați în Administratorul de Fișiere"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1380,7 +1379,8 @@ msgid "Open a File or Directory"
msgstr "Deschideți un Fişier sau Director"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Salvați"
@@ -1438,8 +1438,7 @@ msgstr "Directoare și Fişiere:"
msgid "Preview:"
msgstr "Previzualizați:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "Fișier:"
@@ -1455,24 +1454,11 @@ msgstr "SurseScan"
msgid "(Re)Importing Assets"
msgstr "(Re)Importând Asset-uri"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "Căutați în Ajutor"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "Listă de Clase:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "Căutare Clase"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "Sus"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "Clasă:"
@@ -1489,28 +1475,31 @@ msgid "Brief Description:"
msgstr "Descriere Scurtă:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "Membri"
+msgid "Properties"
+msgstr "Proprietăți"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "Membri:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "Metode Publice"
+msgid "Methods"
+msgstr "Metode"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "Metode Publice:"
+#, fuzzy
+msgid "Methods:"
+msgstr "Metode"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "Obiecte Tema Interfața Grafică"
+#, fuzzy
+msgid "Theme Properties"
+msgstr "Proprietăți"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "Obiecte Tema Interfața Grafică:"
+#, fuzzy
+msgid "Theme Properties:"
+msgstr "Proprietăți"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1537,10 +1526,16 @@ msgid "Constants:"
msgstr "Constante:"
#: editor/editor_help.cpp
-msgid "Description"
+#, fuzzy
+msgid "Class Description"
msgstr "Descriere"
#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
+msgstr "Descriere:"
+
+#: editor/editor_help.cpp
msgid "Online Tutorials:"
msgstr "Tutoriale Internet:"
@@ -1555,11 +1550,13 @@ msgstr ""
"$color] [url = $url2] cerere unul[/ URL] [/ color]."
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "Proprietăți"
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "Descriere Proprietate:"
#: editor/editor_help.cpp
-msgid "Property Description:"
+#, fuzzy
+msgid "Property Descriptions:"
msgstr "Descriere Proprietate:"
#: editor/editor_help.cpp
@@ -1572,11 +1569,13 @@ msgstr ""
"color]!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "Metode"
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "Descrierea metodei:"
#: editor/editor_help.cpp
-msgid "Method Description:"
+#, fuzzy
+msgid "Method Descriptions:"
msgstr "Descrierea metodei:"
#: editor/editor_help.cpp
@@ -1587,12 +1586,61 @@ msgstr ""
"Nu există în prezent nici o descriere pentru această metodă. Te rog ajută-ne "
"de prin a [color = $color] [url = $url] contribui cu una [/ URL] [/ color]!"
-#: editor/editor_inspector.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Căutați în Ajutor"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Display All"
+msgstr "Înlocuiți Tot"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Classes Only"
+msgstr "Clase"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Methods Only"
+msgstr "Metode"
+
+#: editor/editor_help_search.cpp
#, fuzzy
-msgid "Property: "
+msgid "Signals Only"
+msgstr "Semnale"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Constants Only"
+msgstr "Constante"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Properties Only"
msgstr "Proprietăți"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Theme Properties Only"
+msgstr "Proprietăți"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Member Type"
+msgstr "Membri"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Class"
+msgstr "Clasă:"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1626,6 +1674,11 @@ msgstr "Exportul de proiect nu a reuÅŸit cu un cod de eroare %d."
msgid "Error saving resource!"
msgstr "Eroare la salvarea resursei!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "Salvați Resursa Ca..."
@@ -1680,12 +1733,22 @@ msgstr "Aceasta operațiune nu se poate face fără o rădăcină de copac."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
"Nu am putut salva scena. Probabil dependenţe (instanţe sau moşteniri) nu au "
"putut fi satisfăcute."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr "Imposibil de încărcat MeshLibrary pentru unire!"
@@ -1943,6 +2006,15 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "Nu a putut fi încărcat scriptul add-on din calea: '%s'."
#: editor/editor_node.cpp
+#, fuzzy
+msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"Nu a putut fi încărcat scriptul add-on din calea: '%s' Scriptul nu este în "
+"modul unealtă."
+
+#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1993,6 +2065,12 @@ msgstr "Șterge Schema"
msgid "Default"
msgstr "Implicit"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+#, fuzzy
+msgid "Show in FileSystem"
+msgstr "Sistemul De Fișiere"
+
#: editor/editor_node.cpp
#, fuzzy
msgid "Play This Scene"
@@ -2076,7 +2154,8 @@ msgid "Save Scene"
msgstr "Salvează Scena"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+#, fuzzy
+msgid "Save All Scenes"
msgstr "Salvează toate Scenele"
#: editor/editor_node.cpp
@@ -2105,7 +2184,7 @@ msgid "Undo"
msgstr "Revenire"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Reîntoarcere"
@@ -2129,7 +2208,7 @@ msgstr "Setări ale Proiectului"
msgid "Export"
msgstr "Exportare"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "Unelte"
@@ -2143,6 +2222,7 @@ msgid "Quit to Project List"
msgstr "ÃŽnchide spre Lista Proiectului"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "Depanare"
@@ -2271,10 +2351,6 @@ msgstr "Administrează Șabloanele de Export"
msgid "Help"
msgstr "Ajutor"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "Clase"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2345,13 +2421,12 @@ msgstr "Rulează Scena Personalizată"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr ""
+msgstr "Schimbarea driver-ului video necesită restartarea editorului."
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Save & Restart"
-msgstr "Salvează și Închide"
+msgstr "Salvează și Restartează"
#: editor/editor_node.cpp
msgid "Spins when the editor window repaints!"
@@ -2369,24 +2444,24 @@ msgstr "Modificări ale Actualizării"
msgid "Disable Update Spinner"
msgstr "Dezactivează Cercul de Actualizare"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "Inspector"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "Importă"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "Nod"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "Sistemul De Fișiere"
#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr "Inspector"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Nod"
+
+#: editor/editor_node.cpp
#, fuzzy
msgid "Expand Bottom Panel"
msgstr "Extinde toate"
@@ -2524,7 +2599,7 @@ msgstr "Cadru %"
msgid "Physics Frame %"
msgstr "Cadru Fizic %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "Timp:"
@@ -2548,7 +2623,7 @@ msgstr "Timp"
msgid "Calls"
msgstr "Apeluri"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2560,20 +2635,44 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "Nume nevalid."
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr ""
@@ -2585,10 +2684,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2597,7 +2692,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr ""
@@ -2890,6 +2986,11 @@ msgstr ""
"fișierul tip cache!"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "Favorite:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
"Nu se poate naviga către '%s' pentru că nu a fost găsit în sistemul de "
@@ -2931,19 +3032,15 @@ msgstr "Eroare duplicând:"
msgid "Unable to update dependencies:"
msgstr "Imposibil de actualizat dependințele:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "Niciun nume furnizat"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "Niciun nume furnizat."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "Numele furnizat conține caractere nevalide"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "Niciun nume furnizat."
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "Numele furnizat conține caractere nevalide."
@@ -2968,22 +3065,6 @@ msgid "Duplicating folder:"
msgstr "Duplicând directorul:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "Extinde toate"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "Restrânge toate"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "Redenumește..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "Mută În..."
-
-#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
msgstr "Deschide Scena(ele)"
@@ -2992,6 +3073,16 @@ msgid "Instance"
msgstr "Instanță"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Add to favorites"
+msgstr "Favorite:"
+
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Remove from favorites"
+msgstr "Elimină din Grup"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "Editează Dependințele..."
@@ -2999,11 +3090,19 @@ msgstr "Editează Dependințele..."
msgid "View Owners..."
msgstr "Vizualizează Proprietarii..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "Redenumește..."
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "Duplicați..."
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr "Mută În..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
msgstr "Deschide un script rapid..."
@@ -3013,6 +3112,16 @@ msgstr "Deschide un script rapid..."
msgid "New Resource..."
msgstr "Salvați Resursa Ca..."
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Expand All"
+msgstr "Extinde toate"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Collapse All"
+msgstr "Restrânge toate"
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -3034,27 +3143,19 @@ msgstr "Rescanează Sistemul de Fișiere"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "Marchează statutul directorului ca Favorit"
+msgid "Toggle split mode"
+msgstr "Modul de Comutare"
#: editor/filesystem_dock.cpp
-msgid "Show current scene file."
-msgstr ""
+#, fuzzy
+msgid "Search files"
+msgstr "Căutare Clase"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr "Instanțiază scena(ele) selectată ca un copil al nodului selectat."
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "Căutare Clase"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3062,7 +3163,7 @@ msgstr ""
"Se Scanează Fișierele,\n"
"Te Rog Așteaptă..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "Mută"
@@ -3081,31 +3182,22 @@ msgstr ""
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find in files"
+msgid "Find in Files"
msgstr "%d mai multe fișiere"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find: "
+msgid "Find:"
msgstr "Găsiți"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Whole words"
-msgstr "Cuvinte Complete"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "Potrivește Caz-ul"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "Creați Director"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Filter: "
+msgid "Filters:"
msgstr "Filtre..."
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -3123,6 +3215,11 @@ msgstr ""
#: editor/find_in_files.cpp
#, fuzzy
+msgid "Find: "
+msgstr "Găsiți"
+
+#: editor/find_in_files.cpp
+#, fuzzy
msgid "Replace: "
msgstr "Înlocuiți"
@@ -3148,7 +3245,7 @@ msgstr "EROARE: Numele animației există deja!"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr "Nume nevalid."
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3287,17 +3384,14 @@ msgstr "Reimportă"
msgid "Failed to load resource."
msgstr "Încărcarea resursei a eșuat."
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "Bine"
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+#, fuzzy
+msgid "Expand All Properties"
msgstr "Extinde toate proprietăţile"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+#, fuzzy
+msgid "Collapse All Properties"
msgstr "Restrânge toate proprietăţile"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3343,6 +3437,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "Încarcă o resursă existentă de pe disc si editeaz-o."
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "Salvează resursa editată curentă."
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "Mergi la un obiect din istoric editat anterior."
@@ -3407,14 +3505,14 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
msgstr "Crează Poligon"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+#, fuzzy
+msgid "Edit Polygon"
msgstr "Editează Poligon"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3422,25 +3520,28 @@ msgid "Insert Point"
msgstr "Inserează Punct"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+#, fuzzy
+msgid "Edit Polygon (Remove Point)"
msgstr "Editează Poligon (Elimină Punct)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+#, fuzzy
+msgid "Remove Polygon And Point"
msgstr "Elimină Poligon Și Punct"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "Crează un nou poligon de la zero"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr "Șterge puncte"
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#, fuzzy
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
"Editează poligon existent:\n"
"LMB: Mută Punct.\n"
@@ -3448,8 +3549,10 @@ msgstr ""
"RMB: Șterge Punct."
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
-msgstr "Șterge puncte"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#, fuzzy
+msgid "Erase points."
+msgstr "RMB: Șterge Punctul."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3464,7 +3567,7 @@ msgstr "Adaugă Animația"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
+msgid "Load..."
msgstr "Încărcați"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3493,15 +3596,9 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Șterge puncte"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "RMB: Șterge Punctul."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3543,10 +3640,9 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr "Aliniere"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Amestec:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3579,7 +3675,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add Node.."
+msgid "Add Node..."
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3859,7 +3955,7 @@ msgstr "Conectați la Nod:"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "Ștergeți pista selectată."
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3927,10 +4023,6 @@ msgid "Amount:"
msgstr "Cantitate:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "Amestec:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "Amestec 0:"
@@ -4133,7 +4225,7 @@ msgstr "Toate"
msgid "Plugins"
msgstr "Plugin-uri"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "Sorare:"
@@ -4269,6 +4361,11 @@ msgstr "Editează ObiectulPânză"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Scale CanvasItem"
+msgstr "Editează ObiectulPânză"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Move CanvasItem"
msgstr "Editează ObiectulPânză"
@@ -4289,21 +4386,19 @@ msgid "Paste Pose"
msgstr "Lipește Postura"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "Zoom-ați Afară"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "Zoom-ați Afară"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Zoom-ați În"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr "Mod Selectare"
@@ -4334,6 +4429,11 @@ msgid "Rotate Mode"
msgstr "Mod Rotație"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "Mod Redimensionare (R)"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4433,6 +4533,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr "Restaurează abilitatea copiilor obiectului de a fi selectați."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "Singleton (Unicat)"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "Arată Oasele"
@@ -4484,6 +4589,10 @@ msgid "Show Viewport"
msgstr "Arată Fereastra de Lucru"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr "Centrează Selecția"
@@ -4555,8 +4664,17 @@ msgstr ""
"Trage & lasă + Shift: Schimbă tipul nodului"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr "Creează Poligon3D"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "Crează Poligon"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Editează Poligon"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Editează Poligon (Elimină Punct)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
@@ -4658,37 +4776,9 @@ msgid "Item List Editor"
msgstr "Editor Lista de Obiect"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"Nicio resursă OccluderPolygon2D în acest nod.\n"
-"Vrei să creezi și să atribui una?"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr "Creează Poligon de Ocluziune"
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr "Creează un nou poligon de la zero."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "Editează poligonul existent:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "LMB: Mișcă Punctul."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr "Ctrl+LMB: Despică Segmentul."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "RMB: Șterge Punctul."
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr "Mesh-ul este gol!"
@@ -4920,13 +5010,14 @@ msgid "Populate"
msgstr "Populare"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr "Creare Poligon de Navigare"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr "Generare AABB"
+#, fuzzy
+msgid "Generating Visibility Rect"
+msgstr "Generare Dreptunghi de Vizibilitate"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -4956,6 +5047,11 @@ msgstr "Curăță Masca de Emisie"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr "Particule"
@@ -5025,12 +5121,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr "Este necesar un material procesor de tip 'ParticlesMaterial'."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr "Generare AABB"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Convert to CPUParticles"
-msgstr ""
+msgid "Generate AABB"
+msgstr "Generare AABB"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5054,6 +5150,11 @@ msgid "Add Point to Curve"
msgstr "Adăugare punct pe curbă"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "Închidere curbă"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr "Deplasare punct pe curbă"
@@ -5081,6 +5182,11 @@ msgid "Click: Add Point"
msgstr "Click: Adăugare punct"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Left Click: Split Segment (in curve)"
+msgstr "Divizare segment (pe curbă)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr "Click Drept: Ștergere punct"
@@ -5096,11 +5202,6 @@ msgstr "Adăugare punct (într-un spațiu gol)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr "Divizare segment (pe curbă)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "Stergere punct"
@@ -5157,6 +5258,10 @@ msgstr "Ștergere punct de Control-Ieșire"
msgid "Remove In-Control Point"
msgstr "Ștergere punct de Control-Intrare"
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Divizare segment (pe curbă)"
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5169,10 +5274,16 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Sync bones"
+msgid "Sync Bones"
msgstr "Arată Oasele"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr "Creare hartă UV"
@@ -5182,42 +5293,48 @@ msgid "Create Polygon & UV"
msgstr "Crează Poligon"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "Creează un nou ghid orizontal"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "AutoLoad '%s' există deja!"
+msgid "Remove Internal Vertex"
+msgstr "Ștergere punct de Control-Intrare"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Add Split"
-msgstr "Adaugă punct"
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "Cale nevalidă."
+msgid "Add Custom Polygon"
+msgstr "Editează Poligon"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Elimină punct"
+msgid "Remove Custom Polygon"
+msgstr "Elimină Poligon Și Punct"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr "Transformare hartă UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
+#, fuzzy
+msgid "Transform Polygon"
+msgstr "Crează Poligon"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Open Polygon 2D UV editor."
+msgstr "Editor UV de poligoane 2D"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
msgstr "Editor UV de poligoane 2D"
@@ -5227,13 +5344,13 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "Editează Poligon"
+msgid "Points"
+msgstr "Deplasare punct"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Splits"
-msgstr "Divizare cale"
+msgid "Polygons"
+msgstr "Poligon->UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -5242,11 +5359,7 @@ msgstr "Creează Oase"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
-msgstr "Crează Poligon"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Move Points"
msgstr "Deplasare punct"
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5274,19 +5387,21 @@ msgid "Scale Polygon"
msgstr "Redimensionează Poligon"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Select a split to erase it"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5311,6 +5426,11 @@ msgid "Grid Settings"
msgstr "Setări ale Editorului"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "Aliniere"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr "Activează aliniere"
@@ -5374,22 +5494,22 @@ msgid "Paste Resource"
msgstr "Lipiți Resursa"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "Deschidere în Editor"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr "Instanță :"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Deschidere în Editor"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr ""
@@ -5422,6 +5542,11 @@ msgstr "Eroare la salvarea TileSet!"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
+msgid "Error: could not load file."
+msgstr "Directorul nu a putut fi creat."
+
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Error could not load file."
msgstr "Directorul nu a putut fi creat."
@@ -5431,20 +5556,24 @@ msgid "Error saving file!"
msgstr "Eroare la salvarea TileSet!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr ""
+#, fuzzy
+msgid "Error while saving theme."
+msgstr "Eroare la salvare."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
-msgstr ""
+#, fuzzy
+msgid "Error Saving"
+msgstr "Eroare mutând:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr ""
+#, fuzzy
+msgid "Error importing theme."
+msgstr "Eroare mutând:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
-msgstr ""
+#, fuzzy
+msgid "Error Importing"
+msgstr "Eroare mutând:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -5466,6 +5595,14 @@ msgid "Import Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr ""
@@ -5507,8 +5644,8 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile"
-msgstr "Vizualizează Fișierele"
+msgid "Open..."
+msgstr "Deschide"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5523,12 +5660,9 @@ msgid "Copy Script Path"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
-msgstr ""
+#, fuzzy
+msgid "History Previous"
+msgstr "Fila anterioară"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
@@ -5540,15 +5674,16 @@ msgid "Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Reload Theme"
-msgstr ""
+#, fuzzy
+msgid "Import Theme..."
+msgstr "Se Importa Scena..."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme"
+msgid "Reload Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
+msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5598,18 +5733,15 @@ msgid "Keep Debugger Open"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
-msgstr ""
+#, fuzzy
+msgid "Debug with External Editor"
+msgstr "Deschide Editorul următor"
#: editor/plugins/script_editor_plugin.cpp
msgid "Open Godot online documentation"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -5645,19 +5777,9 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Search results"
+msgid "Search Results"
msgstr "Căutați în Ajutor"
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "Căutare Clase"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
@@ -5668,6 +5790,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "Faceți Funcția"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr ""
@@ -5699,10 +5830,6 @@ msgstr ""
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5754,11 +5881,11 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5775,20 +5902,14 @@ msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr ""
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "Mergeți la Pasul Următor"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr ""
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "Mergeți la Pasul Anterior"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
@@ -5796,16 +5917,18 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr "Filtrează fișierele..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
-msgstr ""
+#, fuzzy
+msgid "Go to Function..."
+msgstr "Faceți Funcția"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
-msgstr ""
+#, fuzzy
+msgid "Go to Line..."
+msgstr "Duceți-vă la Linie"
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
@@ -5900,6 +6023,14 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -6066,6 +6197,11 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "Curăță Rotația Cursorului"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -6165,11 +6301,6 @@ msgid "Tool Scale"
msgstr "Unealtă Dimensiune"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap To Floor"
-msgstr "Snap pe grilă"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6286,6 +6417,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
msgid "Sprite is empty!"
@@ -6403,11 +6538,17 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+#, fuzzy
+msgid "Set Margin"
+msgstr "Setează Mâner"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr "Mod Snap:"
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6572,6 +6713,11 @@ msgid "Fix Invalid Tiles"
msgstr "Nume nevalid."
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "Centrează Selecția"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6618,32 +6764,40 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "Elminați Selecția"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr ""
+#, fuzzy
+msgid "Rotate left"
+msgstr "Mod Rotație"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr ""
+#, fuzzy
+msgid "Rotate right"
+msgstr "Rotație poligon"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Flip vertically"
msgstr ""
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Clear transform"
+msgstr "Anim Schimbare transformare"
+
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove current Texture from TileSet"
-msgstr ""
+#, fuzzy
+msgid "Remove selected Texture from TileSet."
+msgstr "Elimină Obiectul Selectat"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -6654,25 +6808,47 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "Lipește Animație"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "RMB: Șterge Punctul."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "Creează un nou poligon de la zero."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "Elimină Obiectul Selectat"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6680,7 +6856,12 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Elimină Șablon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6690,15 +6871,25 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "Ştergeți fişierele selectate?"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "Șterge puncte"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr ""
@@ -6716,13 +6907,101 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Creați Director"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "Editează Filtrele"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Editează poligonul existent:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Editează Poligon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Creare Poligon de Navigare"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "Lipește Animație"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Elimină Șablon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "Elimină Poligon Și Punct"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "Creează Poligon de Ocluziune"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "Creare Poligon de Navigare"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "Editează Filtrele"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Creare Poligon de Navigare"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Creează Poligon de Ocluziune"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid "This property can't be changed."
msgstr "Această operație nu se poate face fără o scenă."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
-msgstr ""
+#, fuzzy
+msgid "TileSet"
+msgstr "Set_de_Plăci..."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
@@ -6757,6 +7036,15 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Exporting All"
+msgstr "Exportare"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6765,6 +7053,11 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "Exportă Proiectul"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6819,10 +7112,50 @@ msgid "Feature List:"
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "Execută Scriptul"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Script Export Mode:"
+msgstr "Exportă Proiectul"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export mode?"
+msgstr "Exportă Proiectul"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Export All"
+msgstr "Exportare"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -6949,8 +7282,9 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
-msgid "Can't open project"
-msgstr ""
+#, fuzzy
+msgid "Can't open project at '%s'."
+msgstr "Imposibil de deschis '%s'."
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
@@ -6958,6 +7292,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7280,10 +7632,6 @@ msgstr ""
msgid "General"
msgstr "General"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7417,10 +7765,6 @@ msgstr ""
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr ""
@@ -7511,7 +7855,7 @@ msgid "Step"
msgstr "Pas (s):"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7520,7 +7864,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7561,7 +7905,7 @@ msgstr ""
msgid "Reset"
msgstr "Resetați Zoom-area"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7620,6 +7964,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr "Curăță Scriptul"
@@ -7656,6 +8004,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7732,6 +8086,11 @@ msgid "Clear Inheritance"
msgstr "Curăță Derivarea"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Open documentation"
+msgstr "Deschide Recente"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr ""
@@ -7740,12 +8099,13 @@ msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Change Type"
-msgstr ""
+#, fuzzy
+msgid "Extend Script"
+msgstr "Execută Scriptul"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -7898,6 +8258,11 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Filename is empty"
+msgstr "Mesh-ul este gol!"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -7986,19 +8351,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -8030,18 +8383,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -8241,7 +8582,7 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+msgid "Step argument is zero!"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
@@ -8463,12 +8804,8 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr "Coacere!"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
-msgstr "Procesează mesh-ul de navigare."
+msgid "Bake NavMesh"
+msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8739,6 +9076,10 @@ msgid "Base Type:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "Membri:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr ""
@@ -8839,11 +9180,11 @@ msgid "Search VisualScript"
msgstr "Curăță Scriptul"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8921,6 +9262,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -8959,6 +9306,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -9076,6 +9429,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -9095,6 +9458,26 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9127,7 +9510,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9185,6 +9568,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr "Arborele Animației este nevalid."
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr ""
@@ -9201,10 +9588,6 @@ msgstr ""
msgid "Please Confirm..."
msgstr ""
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr ""
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9212,6 +9595,10 @@ msgid ""
"hide upon running."
msgstr ""
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9258,10 +9645,6 @@ msgstr ""
msgid "Input"
msgstr "Adaugă Intrare(Input)"
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for shader."
msgstr ""
@@ -9278,6 +9661,125 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Split already exists."
+#~ msgstr "AutoLoad '%s' există deja!"
+
+#, fuzzy
+#~ msgid "Add Split"
+#~ msgstr "Adaugă punct"
+
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr "Cale nevalidă."
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "Elimină punct"
+
+#, fuzzy
+#~ msgid "Poly"
+#~ msgstr "Editează Poligon"
+
+#, fuzzy
+#~ msgid "Splits"
+#~ msgstr "Divizare cale"
+
+#~ msgid "No name provided"
+#~ msgstr "Niciun nume furnizat"
+
+#~ msgid "Create Poly"
+#~ msgstr "Crează Poligon"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "Crează un nou poligon de la zero"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "Zoom-ați Afară"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "Zoom-ați În"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "Creează Poligon3D"
+
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "Nicio resursă OccluderPolygon2D în acest nod.\n"
+#~ "Vrei să creezi și să atribui una?"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "LMB: Mișcă Punctul."
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "Ctrl+LMB: Despică Segmentul."
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "RMB: Șterge Punctul."
+
+#, fuzzy
+#~ msgid "New TextFile"
+#~ msgstr "Vizualizează Fișierele"
+
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Zoom-ați În"
+
+#~ msgid "Class List:"
+#~ msgstr "Listă de Clase:"
+
+#~ msgid "Search Classes"
+#~ msgstr "Căutare Clase"
+
+#~ msgid "Public Methods"
+#~ msgstr "Metode Publice"
+
+#~ msgid "Public Methods:"
+#~ msgstr "Metode Publice:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "Obiecte Tema Interfața Grafică"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "Obiecte Tema Interfața Grafică:"
+
+#, fuzzy
+#~ msgid "Property: "
+#~ msgstr "Proprietăți"
+
+#, fuzzy
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "Marchează statutul directorului ca Favorit"
+
+#, fuzzy
+#~ msgid "Whole words"
+#~ msgstr "Cuvinte Complete"
+
+#, fuzzy
+#~ msgid "Match case"
+#~ msgstr "Potrivește Caz-ul"
+
+#~ msgid "Ok"
+#~ msgstr "Bine"
+
+#, fuzzy
+#~ msgid "Search in files"
+#~ msgstr "Căutare Clase"
+
+#, fuzzy
+#~ msgid "Snap To Floor"
+#~ msgstr "Snap pe grilă"
+
+#~ msgid "Bake!"
+#~ msgstr "Coacere!"
+
+#~ msgid "Bake the navigation mesh."
+#~ msgstr "Procesează mesh-ul de navigare."
+
#~ msgid "Modify Color Ramp"
#~ msgstr "Modifică Rampa de Culori"
@@ -9374,15 +9876,9 @@ msgstr ""
#~ msgid "I see..."
#~ msgstr "Am înțeles..."
-#~ msgid "Can't open '%s'."
-#~ msgstr "Imposibil de deschis '%s'."
-
#~ msgid "Ugh"
#~ msgstr "Uh"
-#~ msgid "Save the currently edited resource."
-#~ msgstr "Salvează resursa editată curentă."
-
#~ msgid "Stop Profiling"
#~ msgstr "Oprește Profilarea"
diff --git a/editor/translations/ru.po b/editor/translations/ru.po
index 117fff72c3..3ac5ebb869 100644
--- a/editor/translations/ru.po
+++ b/editor/translations/ru.po
@@ -1,6 +1,6 @@
# Russian translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# Ðркадий ÐÐ²Ð°Ñ <savvot@gmail.com>, 2018.
# Artem Varaksa <aymfst@gmail.com>, 2018.
@@ -21,12 +21,23 @@
# Игорь Д <protorian.di@gmail.com>, 2018.
# Егор Бураков <fend.q@mail.ru>, 2018.
# Grigore Antoniuc <grisa181@gmail.com>, 2018.
+# Neo6666666 <Neo6666666@gmail.com>, 2018.
+# Roman <Steel_hawk@list.ru>, 2018.
+# Егор РÑбуха (REgorion) <ryrgor@gmail.com>, 2018.
+# Yan <uvokinuvokines@gmail.com>, 2018.
+# V. <Unit68189@gmail.com>, 2018.
+# Victor Butorin <mrwebsterchannel@gmail.com>, 2018.
+# ÐлекÑандр <ol-vin@mail.ru>, 2018, 2019.
+# Ðнатолий Горбунов <afgorbunov@gmail.com>, 2018.
+# Vadim Vergasov <vadim.vergasov2003@gmail.com>, 2018.
+# ÐÑлан Снупов <aslan170505@gmail.com>, 2018.
+# Alexandr Eremeev <ae125529@gmail.com>, 2019.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2018-08-06 07:41+0000\n"
-"Last-Translator: Aleksey Terentyev <terentjew.alexey@ya.ru>\n"
+"PO-Revision-Date: 2019-01-13 15:07+0000\n"
+"Last-Translator: ÐлекÑандр <ol-vin@mail.ru>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/"
"godot/ru/>\n"
"Language: ru\n"
@@ -35,7 +46,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 3.1.1\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -43,41 +54,39 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr "Ðеверный тип аргумента Ð´Ð»Ñ convert(), иÑпользуйте TYPE_* конÑтанты."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr "Ðе хватает байтов Ð´Ð»Ñ Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±Ð°Ð¹Ñ‚Ð¾Ð², или неверный формат."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Ðеправильный ввод %i (не проходит) в выражении"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
msgstr ""
+"self не может быть иÑпользован, потому что ÑкземплÑÑ€ равен null (не прошел)"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "Ðеправильный Ð¸Ð½Ð´ÐµÐºÑ ÑвойÑтва имени '%s' в узле %s."
+msgstr "ÐедопуÑтимые операнды Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° %s, %s и %s."
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid index of type %s for base type %s"
-msgstr "Ðеправильный Ð¸Ð½Ð´ÐµÐºÑ ÑвойÑтва имени '%s' в узле %s."
+msgstr "ÐедопуÑтимый Ð¸Ð½Ð´ÐµÐºÑ Ñ‚Ð¸Ð¿Ð° %s Ð´Ð»Ñ Ð±Ð°Ð·Ð¾Ð²Ð¾Ð³Ð¾ типа %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "ÐедопуÑтимый именованный Ð¸Ð½Ð´ÐµÐºÑ '%s' Ð´Ð»Ñ Ð±Ð°Ð·Ð¾Ð²Ð¾Ð³Ð¾ типа %s"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid arguments to construct '%s'"
-msgstr ": ÐедопуÑтимый аргумент типа: "
+msgstr "ÐедопуÑтимые аргументы Ð´Ð»Ñ Ð¿Ð¾ÑÑ‚Ñ€Ð¾ÐµÐ½Ð¸Ñ '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "Ðа вызове '%s':"
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -86,27 +95,23 @@ msgstr "ОÑвободить"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "СбаланÑированный"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Mirror"
-msgstr "Зеркально по X"
+msgstr "Отобразить"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "Ð’Ñтавить ключ"
+msgstr "Ð’Ñтавить ключ здеÑÑŒ"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "Дублировать выделенное"
+msgstr "Дублировать выделенные ключ(и)"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "Удалить выделенное"
+msgstr "Удалить выделенные ключ(и)"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -137,46 +142,40 @@ msgid "Anim Change Call"
msgstr "Изменить вызов анимации"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Property Track"
-msgstr "Параметр:"
+msgstr "Трек Параметра"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "3D Transform Track"
-msgstr "Тип преобразованиÑ"
+msgstr "Трек 3D ПреобразованиÑ"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "Трек Вызова Метода"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "Трек Кривой Безье"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "Трек Ðудио Дорожки"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Playback Track"
-msgstr "ОÑтановить воÑпроизведение анимации. (S)"
+msgstr "Трек ВоÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ðнимации"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
-msgstr "Добавить новую дорожку"
+msgstr "Добавить новый Трек"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Length Time (seconds)"
-msgstr "Длина анимации (в Ñекундах)."
+msgstr "ПродолжительноÑть анимации (в Ñекундах)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "МаÑштаб анимации."
+msgstr "Зацикливание анимации"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -184,42 +183,37 @@ msgid "Functions:"
msgstr "Функции:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Audio Clips:"
-msgstr "ПроÑлушиватель звука"
+msgstr "Ðудио Дорожки:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Clips:"
-msgstr "Дорожки"
+msgstr "Дорожки Ðнимации:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Toggle this track on/off."
-msgstr "Переключить режим без отвлечениÑ."
+msgstr "Переключить Ñтот трек вкл/выкл."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "Режим ÐžÐ±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ (Как Ñто ÑвойÑтво уÑтанавливаетÑÑ)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Interpolation Mode"
-msgstr "Animation узел"
+msgstr "Режим Перехода"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
msgstr ""
+"Режим Обработки Ð—Ð°Ñ†Ð¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ (Переход заканчиваетÑÑ Ñ Ð½Ð°Ñ‡Ð°Ð»Ð¾Ð¼ нового цикла)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "Удалить выделенную дорожку."
+msgstr "Удалить Ñтот трек."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "Ð’Ñ€ÐµÐ¼Ñ X-Fade (Ñек.):"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ (Ñек.): "
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -234,13 +228,12 @@ msgid "Trigger"
msgstr "Триггер"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Capture"
-msgstr "ОÑобенноÑти"
+msgstr "Захват"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "Ближайшие"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
@@ -249,16 +242,15 @@ msgstr "Линейный"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr ""
+msgstr "КубичеÑкаÑ"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clamp Loop Interp"
-msgstr "Изменена интерполÑÑ†Ð¸Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ð¸"
+msgstr "Обрезание Перехода ЗацикливаниÑ"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "Обработка Перехода ЗацикливаниÑ"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -266,14 +258,12 @@ msgid "Insert Key"
msgstr "Ð’Ñтавить ключ"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "Дублировать узел(узлы)"
+msgstr "Дублировать ключ(ключи)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "Удалить узел(узлы)"
+msgstr "Удалить ключ(ключи)"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -291,7 +281,6 @@ msgstr "Создать %d новые дорожки и вÑтавить ключ
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -303,7 +292,7 @@ msgstr "Ð’Ñтавить"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
-msgstr ""
+msgstr "AnimationPlayer не может анимировать Ñам ÑебÑ, только других."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
@@ -319,7 +308,7 @@ msgstr "Ð’Ñтавить ключ"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr ""
+msgstr "Трек транÑформации применÑетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к оÑнованным на Spatial узлам."
#: editor/animation_track_editor.cpp
msgid ""
@@ -328,44 +317,46 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"Aудио треки могут указывать только на узлы типа:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "Треки Ðнимации могут указывать только на узлы типа AnimationPlayer."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
-msgstr ""
+msgstr "Проигрыватель анимации не может анимировать Ñам ÑебÑ, только других."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ новый трек без корневого узла"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "Путь трека некорректен, потому Ð½ÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ ключ."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "Трек не имеет тип Spatial, Ð½ÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ ключ"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
-msgstr ""
+msgstr "Путь трека некорректен, потому Ð½ÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ ключ метода."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Method not found in object: "
-msgstr "VariableGet не найден в Ñкрипте: "
+msgstr "В объекте нет такого метода: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
msgstr "ПеремеÑтить ключи"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clipboard is empty"
-msgstr "Буфер обмена пуÑÑ‚!"
+msgstr "Буфер обмена пуÑÑ‚"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
@@ -375,24 +366,24 @@ msgstr "МаÑштабировать ключи"
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
msgstr ""
+"Эта Ð¾Ð¿Ñ†Ð¸Ñ Ð½Ðµ работает Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÑ€Ð¸Ð²Ñ‹Ð¼Ð¸ Безье, так как Ñто только "
+"один трек."
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "Показывать треки только выделенных в дереве узлов."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr ""
+msgstr "Группировать треки по узлам или показывать их как проÑтой ÑпиÑок."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap (s): "
-msgstr "ПривÑзка (пикÑели):"
+msgstr "ПривÑзка (Ñек): "
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "Дерево анимации дейÑтвительно."
+msgstr "Значение шага анимации."
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -401,22 +392,19 @@ msgstr "Дерево анимации дейÑтвительно."
#: editor/project_manager.cpp editor/project_settings_editor.cpp
#: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp
msgid "Edit"
-msgstr "Перемена"
+msgstr "Редактировать"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "Дерево анимации"
+msgstr "СвойÑтва анимации."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "Копировать параметры"
+msgstr "Копировать Треки"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "Ð’Ñтавить параметры"
+msgstr "Ð’Ñтавить Треки"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -426,8 +414,7 @@ msgstr "МаÑштабировать выбранное"
msgid "Scale From Cursor"
msgstr "МаÑштабировать от курÑора"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Дублировать выделенное"
@@ -436,16 +423,15 @@ msgid "Duplicate Transposed"
msgstr "Дублировать и перемеÑтить"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
msgstr "Удалить выделенное"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+msgid "Go to Next Step"
msgstr "Перейти к Ñледующему шагу"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+msgid "Go to Previous Step"
msgstr "Перейти к предыдущему шагу"
#: editor/animation_track_editor.cpp
@@ -458,11 +444,11 @@ msgstr "ПодчиÑтить анимацию"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "Выберите узел, который будет анимирован:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "ИÑпользовать кривые Безье"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
@@ -510,7 +496,7 @@ msgstr "КоÑффициент маÑштабированиÑ:"
#: editor/animation_track_editor.cpp
msgid "Select tracks to copy:"
-msgstr ""
+msgstr "Выбрать треки Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ:"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -548,11 +534,11 @@ msgstr "Ðет Ñовпадений"
msgid "Replaced %d occurrence(s)."
msgstr "Заменено %d Ñовпадений."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Учитывать региÑтр"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "Целые Ñлова"
@@ -568,29 +554,31 @@ msgstr "Заменить вÑÑ‘"
msgid "Selection Only"
msgstr "Только выделÑть"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Приблизить"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "Отдалить"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "СброÑить приближение"
#: editor/code_editor.cpp
-#, fuzzy
msgid "Warnings:"
-msgstr "ПредупреждениÑ"
+msgstr "ПредупреждениÑ:"
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "МаÑштаб (%):"
+msgid "Font Size:"
+msgstr "Размер шрифта:"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Строка:"
@@ -623,6 +611,7 @@ msgstr "Добавить"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -679,9 +668,8 @@ msgid "Disconnect '%s' from '%s'"
msgstr "Отключить '%s' от '%s'"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect all from signal: '%s'"
-msgstr "Отключить '%s' от '%s'"
+msgstr "Отключить вÑе от Ñигнала: '%s'"
#: editor/connections_dialog.cpp
msgid "Connect..."
@@ -693,19 +681,16 @@ msgid "Disconnect"
msgstr "ОтÑоединить"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect Signal: "
-msgstr "Подключение Ñигнала:"
+msgstr "Подключить Ñигнал: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection: "
-msgstr "Редактировать ÑвÑзи"
+msgstr "Редактировать Подключение: "
#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "Are you sure you want to remove all connections from the \""
-msgstr "Ð’Ñ‹ уверены, что хотите запуÑтить более одного проекта?"
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr "Ð’Ñ‹ уверены, что хотите удалить вÑе Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð· Ñигнала \"%s\"?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -713,22 +698,19 @@ msgstr "Сигналы"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr ""
+msgstr "Ð’Ñ‹ уверены, что хотите удалить вÑе Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¾Ñ‚ Ñигнала?"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "ОтÑоединить"
+msgstr "ОтÑоединить вÑе"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit..."
-msgstr "Перемена"
+msgstr "Редактирование..."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "Методы"
+msgstr "Перейти к Методу"
#: editor/create_dialog.cpp
msgid "Change %s Type"
@@ -753,23 +735,20 @@ msgid "Recent:"
msgstr "Ðедавнее:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "ПоиÑк:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "СовпадениÑ:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "ОпиÑание:"
@@ -808,8 +787,7 @@ msgid "Resource"
msgstr "РеÑурÑ"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "Путь"
@@ -830,9 +808,10 @@ msgid "Search Replacement Resource:"
msgstr "Ðайти заменÑемый реÑурÑ:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -864,7 +843,7 @@ msgid "Error loading:"
msgstr "Ошибка при загрузке:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+msgid "Load failed due to missing dependencies:"
msgstr "Ðе удалоÑÑŒ загрузить Ñцену из-за отÑутÑÑ‚Ð²Ð¸Ñ Ð·Ð°Ð²Ð¸ÑимоÑтей:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -923,14 +902,6 @@ msgstr "Изменить значение ÑловарÑ"
msgid "Thanks from the Godot community!"
msgstr "СпаÑибо от ÑообщеÑтва Godot!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "Ок"
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Ðвторы Движка Godot"
@@ -1024,7 +995,8 @@ msgid "Uncompressing Assets"
msgstr "РаÑпаковка аÑÑетов"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+#, fuzzy
+msgid "Package installed successfully!"
msgstr "Пакет уÑпешно уÑтановлен!"
#: editor/editor_asset_installer.cpp
@@ -1106,8 +1078,7 @@ msgid "Bus options"
msgstr "Параметры шины"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "Дублировать"
@@ -1272,7 +1243,7 @@ msgid "Add AutoLoad"
msgstr "Добавить автозагрузку"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "Путь:"
@@ -1280,8 +1251,8 @@ msgstr "Путь:"
msgid "Node Name:"
msgstr "Ð˜Ð¼Ñ Ð£Ð·Ð»Ð°:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "ИмÑ"
@@ -1351,25 +1322,28 @@ msgid "Template file not found:"
msgstr "Файл шаблона не найден:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Выбрать текущую папку"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "Файл ÑущеÑтвует, перезапиÑать?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "Выбрать текущую папку"
+msgid "Select This Folder"
+msgstr "Выбрать Ñту папку"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
msgstr "Копировать путь"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Open In File Manager"
-msgstr "ПроÑмотреть в проводнике"
+msgid "Open in File Manager"
+msgstr "Открыть в проводнике"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+msgid "Show in File Manager"
msgstr "ПроÑмотреть в проводнике"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1405,7 +1379,8 @@ msgid "Open a File or Directory"
msgstr "Открыть каталог или файл"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Сохранить"
@@ -1463,8 +1438,7 @@ msgstr "Каталоги и файлы:"
msgid "Preview:"
msgstr "ПредпроÑмотр:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "Файл:"
@@ -1480,24 +1454,11 @@ msgstr "Сканировать иÑходники"
msgid "(Re)Importing Assets"
msgstr "(Ре)Импортировать"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "Помощь"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "СпиÑок клаÑÑов:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "ПоиÑк клаÑÑов"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "Верх"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "КлаÑÑ:"
@@ -1514,28 +1475,28 @@ msgid "Brief Description:"
msgstr "Краткое опиÑание:"
#: editor/editor_help.cpp
-msgid "Members"
+msgid "Properties"
msgstr "СвойÑтва"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
+#: editor/editor_help.cpp
+msgid "Properties:"
msgstr "СвойÑтва:"
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "Публичные методы"
+msgid "Methods"
+msgstr "Методы"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "СпиÑок методов:"
+msgid "Methods:"
+msgstr "Методы:"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "Тема Ñлементов GUI"
+msgid "Theme Properties"
+msgstr "СвойÑтва темы"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "Тема Ñлементов GUI:"
+msgid "Theme Properties:"
+msgstr "СвойÑтва темы:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1562,8 +1523,12 @@ msgid "Constants:"
msgstr "КонÑтанты:"
#: editor/editor_help.cpp
-msgid "Description"
-msgstr "ОпиÑание"
+msgid "Class Description"
+msgstr "ОпиÑание клаÑÑа"
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
+msgstr "ОпиÑание клаÑÑа:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1580,11 +1545,11 @@ msgstr ""
"$url2]запроÑить[/url][/color]."
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "СвойÑтва"
+msgid "Property Descriptions"
+msgstr "ОпиÑание ÑвойÑтв"
#: editor/editor_help.cpp
-msgid "Property Description:"
+msgid "Property Descriptions:"
msgstr "ОпиÑание ÑвойÑтв:"
#: editor/editor_help.cpp
@@ -1596,11 +1561,11 @@ msgstr ""
"$color][url=$url]помогите нам[/url][/color]!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "Методы"
+msgid "Method Descriptions"
+msgstr "ОпиÑание методов"
#: editor/editor_help.cpp
-msgid "Method Description:"
+msgid "Method Descriptions:"
msgstr "ОпиÑание методов:"
#: editor/editor_help.cpp
@@ -1611,18 +1576,58 @@ msgstr ""
"Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ÑутÑтвует опиÑание Ñтого метода. ПожалуйÑта [color="
"$color][url=$url]помогите нам[/url][/color]!"
-#: editor/editor_inspector.cpp
-#, fuzzy
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Помощь"
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr "Отображать вÑÑ‘"
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr "Только клаÑÑÑ‹"
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr "Только методы"
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr "Только Ñигналы"
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr "Только конÑтанты"
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr "Только ÑвойÑтва"
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr "Только ÑвойÑтва темы"
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr "Тип члена"
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr "КлаÑÑ"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
msgstr "Параметр:"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr "Задать"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "УÑтановить МножеÑтво:"
#: editor/editor_log.cpp
msgid "Output:"
@@ -1650,6 +1655,11 @@ msgstr "ЭкÑпорт проекта не удалÑÑ, код %d."
msgid "Error saving resource!"
msgstr "Ошибка при Ñохранении реÑурÑа!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "Ок"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "Сохранить реÑÑƒÑ€Ñ ÐºÐ°Ðº..."
@@ -1668,7 +1678,7 @@ msgstr "Ошибка при Ñохранении."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
-msgstr ""
+msgstr "Ðе возможно открыть '%s'. Возможно файл перемещен или удален."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
@@ -1704,12 +1714,25 @@ msgstr "Эта Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð½Ðµ может быть выполнена бе
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+"Эта Ñцена не может быть Ñохранена, потому что еÑть цикличеÑкое Ñоздание "
+"ÑÑылок.\n"
+"ПожалуйÑта, решите проблему, а затем повторите попытку ÑохранениÑ."
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
"Ðе возможно Ñохранить Ñцену. ВероÑтно, завиÑимоÑти (ÑкземплÑры или "
"унаÑледованные) не могли быть удовлетворены."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr "Ðевозможно перезапиÑать Ñцену, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð²Ñе еще открыта!"
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr "Ðевозможно загрузить библиотеку полиÑеток Ð´Ð»Ñ ÑлиÑниÑ!"
@@ -1964,6 +1987,14 @@ msgstr "Ðе удалоÑÑŒ загрузить Ñкрипт из иÑточниÐ
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"Ðевозможно загрузить Ñкрипт аддона из иÑточника: \"% s\". Ð’ коде еÑть "
+"ошибка. ПожалуйÑта, проверьте ÑинтакÑиÑ."
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
"Ðе удалоÑÑŒ загрузить Ñкрипт из иÑточника: '%s' базовый тип не EditorPlugin."
@@ -2013,15 +2044,18 @@ msgstr "Удалить макет"
msgid "Default"
msgstr "По умолчанию"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr "Показать в файловой ÑиÑтеме"
+
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play This Scene"
msgstr "ЗапуÑтить Ñцену"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "Закрыть другие вкладки"
+msgstr "Закрыть вкладку"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2096,7 +2130,7 @@ msgid "Save Scene"
msgstr "Сохранить Ñцену"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+msgid "Save All Scenes"
msgstr "Сохранить вÑе Ñцены"
#: editor/editor_node.cpp
@@ -2125,7 +2159,7 @@ msgid "Undo"
msgstr "Отменить"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Повторить"
@@ -2149,20 +2183,20 @@ msgstr "Параметры проекта"
msgid "Export"
msgstr "ЭкÑпорт"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "ИнÑтрументы"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "Открыть менеджер проектов?"
+msgstr "Открыть папку Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸ проекта"
#: editor/editor_node.cpp
msgid "Quit to Project List"
msgstr "Выйти в ÑпиÑок проектов"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "Отладка"
@@ -2270,18 +2304,16 @@ msgid "Toggle Fullscreen"
msgstr "Переключить полноÑкранный режим"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Data/Settings Folder"
-msgstr "ÐаÑтройки редактора"
+msgstr "Открыть папку данных/наÑтроек редактора"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "Открыть папку данных редактора"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Settings Folder"
-msgstr "ÐаÑтройки редактора"
+msgstr "Открыть папку наÑтроек Редктора"
#: editor/editor_node.cpp editor/project_export.cpp
msgid "Manage Export Templates"
@@ -2291,10 +2323,6 @@ msgstr "Управление шаблонами ÑкÑпорта"
msgid "Help"
msgstr "Справка"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "КлаÑÑÑ‹"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2305,7 +2333,7 @@ msgstr "ПоиÑк"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Online Docs"
-msgstr "Онлайн Документы"
+msgstr "Онлайн ДокументациÑ"
#: editor/editor_node.cpp
msgid "Q&A"
@@ -2365,13 +2393,12 @@ msgstr "ЗапуÑтить произвольную Ñцену"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr ""
+msgstr "Ð”Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´ÐµÐ¾Ð´Ñ€Ð°Ð¹Ð²ÐµÑ€Ð° необходим перезапуÑк редактора."
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Save & Restart"
-msgstr "Сохранить и переимпортировать"
+msgstr "Сохранить и перезапуÑтить"
#: editor/editor_node.cpp
msgid "Spins when the editor window repaints!"
@@ -2389,27 +2416,26 @@ msgstr "ОбновлÑть при изменениÑÑ…"
msgid "Disable Update Spinner"
msgstr "Отключить Ñчётчик обновлений"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "ИнÑпектор"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "Импорт"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "Узел"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "Ð¤Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема"
#: editor/editor_node.cpp
-#, fuzzy
+msgid "Inspector"
+msgstr "ИнÑпектор"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Узел"
+
+#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
-msgstr "Развернуть вÑе"
+msgstr "Развернуть нижнюю панель"
#: editor/editor_node.cpp scene/resources/visual_shader.cpp
msgid "Output"
@@ -2488,9 +2514,8 @@ msgid "Thumbnail..."
msgstr "Миниатюра..."
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit Plugin"
-msgstr "Редактировать полигон"
+msgstr "Редактировать дополнение"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
@@ -2514,15 +2539,13 @@ msgid "Status:"
msgstr "СтатуÑ:"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit:"
-msgstr "Перемена"
+msgstr "Редактировать:"
#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Start"
-msgstr "ЗапуÑк!"
+msgstr "ЗапуÑтить"
#: editor/editor_profiler.cpp
msgid "Measure:"
@@ -2544,7 +2567,7 @@ msgstr "Кадр %"
msgid "Physics Frame %"
msgstr "Кадр физики %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "ВремÑ:"
@@ -2568,34 +2591,66 @@ msgstr "ВремÑ"
msgid "Calls"
msgstr "Вызовы"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr "Вкл"
#: editor/editor_properties.cpp
msgid "Layer"
-msgstr ""
+msgstr "Слой"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Bit %d, value %d"
-msgstr "Бит %d, значение %d."
+msgstr "Бит %d, значение %d"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr "[ПуÑто]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
#, fuzzy
-msgid "Assign.."
-msgstr "Ðазначить"
+msgid "Assign..."
+msgstr "Ðазначить.."
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "Ðеверный путь"
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+"Выбранные реÑурÑÑ‹ (%s) не ÑоответÑтвуют типу, ожидаемому Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ "
+"ÑвойÑтва (%s)."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+"Ðевозможно Ñоздать ViewportTexture Ð´Ð»Ñ Ñ€ÐµÑурÑов, Ñохраненных в виде файла.\n"
+"РеÑÑƒÑ€Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ принадлежать Ñцене."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+"Ðевозможно Ñоздать ViewportTexture Ð´Ð»Ñ Ñтого реÑурÑа, потому что он не "
+"уÑтановлен как локальный Ð´Ð»Ñ Ñцены.\n"
+"Включите ÑвойÑтво «Локально Ð´Ð»Ñ Ñцены» (и вÑе реÑурÑÑ‹, Ñодержащие его вверх "
+"от узла)."
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr "Выберите Viewport"
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr "Ðовый Ñкрипт"
@@ -2607,10 +2662,6 @@ msgstr "Ðовый %s"
msgid "Make Unique"
msgstr "Сделать уникальным"
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr "Показать в файловой ÑиÑтеме"
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2619,7 +2670,8 @@ msgstr "Показать в файловой ÑиÑтеме"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "Ð’Ñтавить"
@@ -2632,36 +2684,32 @@ msgstr "Преобразовать в %s"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Open Editor"
-msgstr "Открыть в редакторе"
+msgstr "Открыть редактор"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Selected node is not a Viewport!"
msgstr "Выбранный узел не Viewport!"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "Size: "
-msgstr "Размер Ñчейки:"
+msgstr "Размер: "
#: editor/editor_properties_array_dict.cpp
msgid "Page: "
-msgstr ""
+msgstr "Страница: "
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Key:"
-msgstr "Ðовое имÑ:"
+msgstr "Ðовый ключ:"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Value:"
-msgstr "Ðовое имÑ:"
+msgstr "Ðовое значение:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
-msgstr ""
+msgstr "добавить пару Ключ/Значение"
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -2754,9 +2802,8 @@ msgid "Can't open export templates zip."
msgstr "Ðе удаётÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ архив шаблонов ÑкÑпорта."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Invalid version.txt format inside templates: %s."
-msgstr "Ðеверный формат version.txt файла внутри шаблонов."
+msgstr "ÐедейÑтвительный формат version.txt внутри шаблонов: %s."
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
@@ -2821,6 +2868,7 @@ msgid ""
"Templates installation failed. The problematic templates archives can be "
"found at '%s'."
msgstr ""
+"Ошибка уÑтановки шаблона. Ðрхив Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð½Ñ‹Ð¼ шаблоном можно найти в '%s'."
#: editor/export_template_manager.cpp
msgid "Error requesting url: "
@@ -2901,9 +2949,8 @@ msgid "Download Templates"
msgstr "Загрузить Шаблоны"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr "Выберите зеркало из ÑпиÑка "
+msgstr "Выберите зеркало из ÑпиÑка: (Shift+Click: Открыть в браузере)"
#: editor/file_type_cache.cpp
msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
@@ -2912,19 +2959,21 @@ msgstr ""
"типов файлов!"
#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr "Избранное"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
"Ðе удаетÑÑ Ð¿ÐµÑ€ÐµÐ¹Ñ‚Ð¸ к '%s', так как он не был найден в файловой ÑиÑтеме!"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a grid of thumbnails."
-msgstr "ПроÑмотр Ñлементов в виде миниатюр"
+msgstr "ПроÑмотр Ñлементов в виде миниатюр."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a list."
-msgstr "ПроÑмотр Ñлементов в виде ÑпиÑка"
+msgstr "ПроÑмотр Ñлементов в виде ÑпиÑка."
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
@@ -2952,19 +3001,15 @@ msgstr "Ошибка дублированиÑ:"
msgid "Unable to update dependencies:"
msgstr "Ðе удаётÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ‚ÑŒ завиÑимоÑти:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "Ðе указано имÑ"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "Ðе предоÑтавлено имÑ."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "Ð˜Ð¼Ñ Ñодержит недопуÑтимые Ñимволы"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "Ðе предоÑтавлено имÑ."
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "Ð˜Ð¼Ñ Ñодержит недопуÑтимые Ñимволы."
@@ -2989,22 +3034,6 @@ msgid "Duplicating folder:"
msgstr "Дублирование папки:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "Развернуть вÑе"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "Свернуть вÑе"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "Переименовать..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "ПеремеÑтить в..."
-
-#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
msgstr "Открыть Ñцену(ны)"
@@ -3013,6 +3042,14 @@ msgid "Instance"
msgstr "Добавить ÑкземплÑÑ€"
#: editor/filesystem_dock.cpp
+msgid "Add to favorites"
+msgstr "Добавить в избранное"
+
+#: editor/filesystem_dock.cpp
+msgid "Remove from favorites"
+msgstr "Удалить из избранного"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "Редактировать завиÑимоÑти..."
@@ -3020,19 +3057,33 @@ msgstr "Редактировать завиÑимоÑти..."
msgid "View Owners..."
msgstr "ПроÑмотреть владельцев..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "Переименовать..."
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "Дублировать..."
#: editor/filesystem_dock.cpp
-#, fuzzy
+msgid "Move To..."
+msgstr "ПеремеÑтить в..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
-msgstr "Ðовый Ñкрипт"
+msgstr "Ðовый Ñкрипт."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "Сохранить реÑÑƒÑ€Ñ ÐºÐ°Ðº..."
+msgstr "Ðовый реÑурÑ..."
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr "Развернуть вÑе"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr "Свернуть вÑе"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3054,29 +3105,18 @@ msgid "Re-Scan Filesystem"
msgstr "ПереÑканировать файловую ÑиÑтему"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "Переключить ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¿Ð°Ð¿ÐºÐ¸ как избранной"
+msgid "Toggle split mode"
+msgstr "Переключить режим разделениÑ"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Show current scene file."
-msgstr "Выберите текущий редактированный вложенный тайл."
+msgid "Search files"
+msgstr "ПоиÑк файлов"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr "Добавить выбранную Ñцену(Ñ‹), в качеÑтве потомка выбранного узла."
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "ПоиÑк клаÑÑов"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3084,51 +3124,37 @@ msgstr ""
"Сканирование файлов,\n"
"пожалуйÑта, подождите..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "ПеремеÑтить"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "There is already file or folder with the same name in this location."
-msgstr "По Ñтому пути уже ÑущеÑтвует папка Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ именем."
+msgstr "По Ñтому пути уже ÑущеÑтвует файл или папка Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ именем."
#: editor/filesystem_dock.cpp
msgid "Overwrite"
-msgstr ""
+msgstr "ПерезапиÑать"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "Создать Ñкрипт"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find in files"
-msgstr "Ðайти тайл"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find: "
-msgstr "Ðайти"
+msgid "Find in Files"
+msgstr "Ðайти в файлах"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Whole words"
-msgstr "Целые Ñлова"
+msgid "Find:"
+msgstr "Ðайти:"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "Учитывать региÑтр"
+msgid "Folder:"
+msgstr "Папка:"
#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Filter: "
-msgstr "Фильтр:"
+msgid "Filters:"
+msgstr "Фильтры:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3144,52 +3170,48 @@ msgid "Cancel"
msgstr "Отмена"
#: editor/find_in_files.cpp
-#, fuzzy
+msgid "Find: "
+msgstr "Ðайти: "
+
+#: editor/find_in_files.cpp
msgid "Replace: "
-msgstr "Заменить"
+msgstr "Заменить: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace all (no undo)"
-msgstr "Заменить вÑÑ‘"
+msgstr "Заменить вÑÑ‘ (без возможноÑти отмены)"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Searching..."
-msgstr "Сохранение..."
+msgstr "ПоиÑк..."
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Search complete"
-msgstr "ИÑкать текÑÑ‚"
+msgstr "ПоиÑк завершен"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group name already exists."
-msgstr "ОШИБКÐ: Такое название анимации уже ÑущеÑтвует!"
+msgstr "Ð˜Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹ уже ÑущеÑтвует."
#: editor/groups_editor.cpp
-#, fuzzy
-msgid "invalid Group name."
-msgstr "ÐедопуÑтимое имÑ."
+msgid "Invalid group name."
+msgstr "Ðеверное название группы."
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Группы"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes not in Group"
-msgstr "Группа(ы) нода"
+msgstr "Узлы не в Группе"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
msgid "Filter nodes"
msgstr "Ð¤Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ ÑƒÐ·Ð»Ð¾Ð²"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes in Group"
-msgstr "Группа(ы) нода"
+msgstr "Узлы в Группе"
#: editor/groups_editor.cpp
msgid "Add to Group"
@@ -3200,9 +3222,8 @@ msgid "Remove from Group"
msgstr "Удалить из группы"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Manage Groups"
-msgstr "Группы изображений"
+msgstr "Управление Группами"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Single Scene"
@@ -3309,17 +3330,12 @@ msgstr "Переимпортировать"
msgid "Failed to load resource."
msgstr "Ðе удалоÑÑŒ загрузить реÑурÑ."
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "Ок"
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr "Развернуть вÑе ÑвойÑтва"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+msgid "Collapse All Properties"
msgstr "Свернуть вÑе ÑвойÑтва"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3336,9 +3352,8 @@ msgid "Paste Params"
msgstr "Ð’Ñтавить параметры"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Edit Resource Clipboard"
-msgstr "Ðет реÑурÑа в буфере обмена!"
+msgstr "Редактировать реÑÑƒÑ€Ñ Ð² буфере обмена"
#: editor/inspector_dock.cpp
msgid "Copy Resource"
@@ -3365,6 +3380,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "Загрузить ÑущеÑтвующий реÑÑƒÑ€Ñ Ñ Ð´Ð¸Ñка и редактировать его."
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "Сохранить текущий редактируемый реÑурÑ."
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "Перейти к предыдущему редактируемому объекту в иÑтории."
@@ -3381,9 +3400,8 @@ msgid "Object properties."
msgstr "СвойÑтва объекта."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Filter properties"
-msgstr "Ð¤Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ ÑƒÐ·Ð»Ð¾Ð²"
+msgstr "СвойÑтва фильтра"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
@@ -3398,47 +3416,40 @@ msgid "Select a Node to edit Signals and Groups."
msgstr "Выберите узел Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñигналов и групп."
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Edit a Plugin"
-msgstr "Редактировать полигон"
+msgstr "Редактировать плагин"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Create a Plugin"
-msgstr "Создать C# решение"
+msgstr "Создать Дополнение"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Plugin Name:"
-msgstr "СпиÑок плагинов:"
+msgstr "Ð˜Ð¼Ñ Ð”Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ:"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
-msgstr ""
+msgstr "Подпапка:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Language:"
-msgstr "Язык"
+msgstr "Язык:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Script Name:"
-msgstr "Скрипт корректен"
+msgstr "Ð˜Ð¼Ñ Ð¡ÐºÑ€Ð¸Ð¿Ñ‚Ð°:"
#: editor/plugin_config_dialog.cpp
msgid "Activate now?"
-msgstr ""
+msgstr "Ðктивировать ÑейчаÑ?"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
-msgstr "Создан полигон"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
+msgstr "Создать Полигон"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+msgid "Edit Polygon"
msgstr "Редактировать полигон"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3446,34 +3457,33 @@ msgid "Insert Point"
msgstr "Ð’Ñтавить точку"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
-msgstr "Редактировать полигон (удалить точку)"
+msgid "Edit Polygon (Remove Point)"
+msgstr "Редактировать Полигон (удалить точку)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
-msgstr "Удалить полигон и точку"
+msgid "Remove Polygon And Point"
+msgstr "Удалить Полигон и Точку"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "Создать новый полигон Ñ Ð½ÑƒÐ»Ñ"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr "Создать точки."
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
-"Редактирование полигона:\n"
-"ЛКМ: перемеÑтить точку.\n"
-"Ctrl+ЛКМ: разделить Ñегмент.\n"
-"ПКМ: удалить точку."
+"Редактирование точек.\n"
+"ЛКМ: Двигать Точку\n"
+"ПКМ: Стереть Точку"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
-msgstr "Удалить точку"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr "Удалить точки."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3488,14 +3498,15 @@ msgstr "Добавить анимацию"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
-msgstr "Загрузить"
+msgid "Load..."
+msgstr "Загрузить.."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "This type of node can't be used. Only root nodes are allowed."
msgstr ""
+"Этот тип узла не может быть иÑпользован. Разрешены только корневые узлы."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3505,73 +3516,65 @@ msgid ""
"AnimationTree is inactive.\n"
"Activate to enable playback, check node warnings if activation fails."
msgstr ""
+"AnimationTree неактивен.\n"
+"Ðктивируйте, чтобы включить воÑпроизведение, проверьте Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ ÑƒÐ·Ð»Ð°, "
+"еÑли Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»Ð°ÑÑŒ неудачей."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Set the blending position within the space"
-msgstr ""
+msgstr "УÑтановить меÑто ÑÐ¼ÐµÑˆÐ¸Ð²Ð°Ð½Ð¸Ñ Ð² проÑтранÑтве"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Select and move points, create points with RMB."
-msgstr ""
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Удалить точку"
+msgstr "Выбирайте, перемещайте и Ñоздавайте точки Ñ ÐŸÐšÐœ."
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "ПКМ: Удалить точку."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr "Включить привÑзку и отображение Ñетки."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Point"
-msgstr "Передвинуть точку"
+msgstr "Точка"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Open Animation Node"
-msgstr "Animation узел"
+msgstr "Открыть Узел Ðнимации"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists"
-msgstr "ДейÑтвие '%s' уже ÑущеÑтвует!"
+msgstr "Треугольник уже ÑущеÑтвует"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "BlendSpace2D does not belong to an AnimationTree node."
-msgstr ""
+msgstr "BlendSpace2D не принадлежит Узлу AnimationTree."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "No triangles exist, so no blending can take place."
-msgstr ""
+msgstr "Ðевозможно Ñмешивать, поÑкольку отÑутÑтвуют треугольники."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create triangles by connecting points."
-msgstr ""
+msgstr "Создать треугольник Ñоединением точек."
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Erase points and triangles."
-msgstr "ПарÑинг %d треугольников:"
+msgstr "Удалить точки и треугольники."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Generate blend triangles automatically (instead of manually)"
-msgstr ""
+msgstr "Создать ÑмеÑÑŒ треугольники автоматичеÑки (а не вручную)"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr "ПривÑзка"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Смешивание:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3580,20 +3583,21 @@ msgstr "Редактировать фильтры"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Output node can't be added to the blend tree."
-msgstr ""
+msgstr "Узел вывода не может быть добавлен в дерево ÑмешиваниÑ."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Unable to connect, port may be in use or connection may be invalid."
msgstr ""
+"Ðевозможно подключитьÑÑ, возможно порт уже иÑпользуетÑÑ Ð¸Ð»Ð¸ недейÑтвительный."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
-msgstr ""
+msgstr "ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð¸Ð³Ñ€Ð¾ÐºÐ° не задана, Ð½ÐµÐ»ÑŒÐ·Ñ Ð½Ð°Ð¹Ñ‚Ð¸ отÑлеживаемые имена."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Player path set is invalid, so unable to retrieve track names."
-msgstr ""
+msgstr "Путь игрока недейÑтвителен, Ð½ÐµÐ»ÑŒÐ·Ñ Ð½Ð°Ð¹Ñ‚Ð¸ отÑлеживаемые имена."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
@@ -3601,23 +3605,22 @@ msgid ""
"Animation player has no valid root node path, so unable to retrieve track "
"names."
msgstr ""
+"ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð¸Ð³Ñ€Ð¾ÐºÐ° не имеет дейÑтвующего пути корневого узла, поÑтому не "
+"удаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ отÑлеживаемые имена."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Add Node.."
-msgstr "Добавить узел"
+msgid "Add Node..."
+msgstr "Добавить узел..."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filtered Tracks:"
-msgstr "Редактировать фильтры"
+msgstr "Редактировать фильтры:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Enable filtering"
-msgstr "Редактируемые потомки"
+msgstr "Включить фильтр"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
@@ -3645,14 +3648,12 @@ msgid "Remove Animation"
msgstr "Удалить анимацию"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Invalid animation name!"
-msgstr "ОШИБКÐ: ÐедопуÑтимое название анимации!"
+msgstr "ÐедопуÑтимое название анимации!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Animation name already exists!"
-msgstr "ОШИБКÐ: Такое название анимации уже ÑущеÑтвует!"
+msgstr "Такое название анимации уже ÑущеÑтвует!"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -3676,14 +3677,12 @@ msgid "Duplicate Animation"
msgstr "Дублировать анимацию"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to copy!"
-msgstr "ОШИБКÐ: Ðет анимации Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ!"
+msgstr "Ðет анимации Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation resource on clipboard!"
-msgstr "ОШИБКÐ: Ðет анимации в буфере обмена!"
+msgstr "Ðет реÑурÑа анимации в буфере обмена!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
@@ -3694,9 +3693,8 @@ msgid "Paste Animation"
msgstr "Ð’Ñтавить анимацию"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to edit!"
-msgstr "ОШИБКÐ: Ðет анимации Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ!"
+msgstr "Ðет анимации Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
@@ -3743,14 +3741,12 @@ msgid "New"
msgstr "Ðовый"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Transitions..."
-msgstr "Изменить ÑвÑзи..."
+msgstr "Редактировать переходы..."
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Open in Inspector"
-msgstr "Открыть в редакторе"
+msgstr "Открыть в ИнÑпекторе"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Display list of animations in player."
@@ -3809,9 +3805,8 @@ msgid "Include Gizmos (3D)"
msgstr "Включать 3D гизмо"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Pin AnimationPlayer"
-msgstr "Ð’Ñтавить анимацию"
+msgstr "Закрепить анимацию игрока"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Create New Animation"
@@ -3842,34 +3837,32 @@ msgid "Cross-Animation Blend Times"
msgstr "Межанимационный инÑтрумент ÑмешиваниÑ"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "End"
-msgstr "Кон(Ñ.)"
+msgstr "Конец"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Immediate"
-msgstr ""
+msgstr "Ðемедленно"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Sync"
-msgstr ""
+msgstr "СинхронизациÑ"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "At End"
-msgstr ""
+msgstr "В конце"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Travel"
-msgstr ""
+msgstr "ПеремеÑтитÑÑ"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Start and end nodes are needed for a sub-transition."
-msgstr ""
+msgstr "Ð”Ð»Ñ Ñуб-перехода необходимы начальный и конечный узлы."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "No playback resource set at path: %s."
-msgstr "Ðе в пути реÑурÑов."
+msgstr "Ð’ пути нет реÑурÑов воÑпроизведениÑ: %s."
#: editor/plugins/animation_state_machine_editor.cpp
msgid ""
@@ -3877,34 +3870,36 @@ msgid ""
"RMB to add new nodes.\n"
"Shift+LMB to create connections."
msgstr ""
+"Выбирайте и перемещайте узлы.\n"
+"ПКМ Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ узла.\n"
+"Shift+ЛКМ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑвÑзи."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "Создать %s"
+msgstr "Создать новый узел."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Connect nodes."
-msgstr "ПриÑоединить узлы"
+msgstr "Соединить узлы."
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
-msgstr "Удалить выделенную дорожку."
+msgid "Remove selected node or transition."
+msgstr "Удалить выделенный узел или переход"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
msgstr ""
+"Включить автоматичеÑкий запуÑк анимации при запуÑке, перезапуÑке или "
+"уÑтановите на ноль."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set the end animation. This is useful for sub-transitions."
-msgstr ""
+msgstr "УÑтановите конец анимации. Полезно Ð´Ð»Ñ Ð²Ñпомогательных переходов."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "Переход"
+msgstr "Переход: "
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3958,10 +3953,6 @@ msgid "Amount:"
msgstr "Величина:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "Смешивание:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "Смешивание 0:"
@@ -4102,14 +4093,12 @@ msgid "Asset Download Error:"
msgstr "Ошибка Загрузки Шаблона:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading (%s / %s)..."
-msgstr "Загрузка"
+msgstr "Загрузка (%s / %s)..."
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading..."
-msgstr "Загрузка"
+msgstr "Загрузка..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Resolving..."
@@ -4136,14 +4125,12 @@ msgid "Download for this asset is already in progress!"
msgstr "Загрузка Ñтого шаблона уже идёт!"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "First"
-msgstr "первый"
+msgstr "Первый"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Previous"
-msgstr "ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð²ÐºÐ»Ð°Ð´ÐºÐ°"
+msgstr "Ðазад"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Next"
@@ -4151,7 +4138,7 @@ msgstr "Следующий"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Last"
-msgstr ""
+msgstr "ПоÑледнÑÑ"
#: editor/plugins/asset_library_editor_plugin.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -4163,7 +4150,7 @@ msgstr "Ð’Ñе"
msgid "Plugins"
msgstr "Плагины"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "Сортировать:"
@@ -4277,29 +4264,28 @@ msgid "Create new horizontal and vertical guides"
msgstr "Создание новых горизонтальных и вертикальных направлÑющих"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move pivot"
-msgstr "ПеремеÑтить точку вращениÑ"
+msgstr "ПеремеÑтить опорную точку"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Rotate CanvasItem"
-msgstr "Редактировать CanvasItem"
+msgstr "Вращать CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move anchor"
-msgstr "ПеремеÑтить дейÑтвие"
+msgstr "ПеремеÑтить Ñкорь"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Resize CanvasItem"
-msgstr "Редактировать CanvasItem"
+msgstr "Изменить размер CanvasItem"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr "Вращать CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move CanvasItem"
-msgstr "Редактировать CanvasItem"
+msgstr "ПеремеÑтить CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -4318,19 +4304,18 @@ msgid "Paste Pose"
msgstr "Ð’Ñтавить позу"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "Отдалить"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom reset"
-msgstr "СброÑить маÑштаб"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
+"Внимание: Положение и размер детей контейнера определÑетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ их "
+"родителÑми."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Приблизить"
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
+msgstr "СброÑить маÑштабирование"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
@@ -4363,6 +4348,10 @@ msgid "Rotate Mode"
msgstr "Режим поворота"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr "Режим маÑштабированиÑ"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4380,18 +4369,16 @@ msgid "Pan Mode"
msgstr "Режим оÑмотра"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle snapping."
-msgstr "Переключение прилипаниÑ"
+msgstr "Переключить привÑзки."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Snap"
msgstr "ИÑпользовать привÑзку"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snapping Options"
-msgstr "Параметры прилипаниÑ"
+msgstr "Параметры ПривÑзки"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to grid"
@@ -4431,9 +4418,8 @@ msgid "Snap to node sides"
msgstr "ПривÑзка к Ñторонам узла"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to node center"
-msgstr "ПривÑзка к Ñкорю узла"
+msgstr "ПривÑзка к центру узла"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to other nodes"
@@ -4462,6 +4448,10 @@ msgid "Restores the object's children's ability to be selected."
msgstr "ВоÑÑтанавливает возможноÑть выбора потомков объекта."
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr "Опции Ñкелета"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "Показать коÑти"
@@ -4475,12 +4465,11 @@ msgstr "ОчиÑтить цепь ИК"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make Custom Bone(s) from Node(s)"
-msgstr ""
+msgstr "Сделать ПользовательÑкие КоÑть(и) от Узла(ов)"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Custom Bones"
-msgstr "ОчиÑтить коÑти"
+msgstr "ОчиÑтить ПользовательÑкие КоÑти"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -4513,6 +4502,10 @@ msgid "Show Viewport"
msgstr "Показать окно проÑмотра"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr "Показать группу и заблокировать иконки"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr "Центрировать выбранное"
@@ -4525,9 +4518,8 @@ msgid "Layout"
msgstr "Макет"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Insert keys."
-msgstr "Ð’Ñтавить ключи"
+msgstr "Ð’Ñтавить ключи."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
@@ -4584,17 +4576,24 @@ msgstr ""
"Drag & drop + Alt : Изменить тип узла"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr "Создан Poly3D"
+msgid "Create Polygon3D"
+msgstr "Создать Polygon3D"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Редактировать полигон"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Редактировать полигон (удалить точку)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
-msgstr "УÑтановить обработчик"
+msgstr "Задать обработчик"
#: editor/plugins/cpu_particles_editor_plugin.cpp
-#, fuzzy
msgid "CPUParticles"
-msgstr "ЧаÑтицы"
+msgstr "ЦПУЧаÑтицы"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
@@ -4687,37 +4686,9 @@ msgid "Item List Editor"
msgstr "Редактор ÑпиÑка Ñлементов"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"Ðет OccluderPolygon2D реÑурÑа у Ñтого узла.\n"
-"Создать и назначить?"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr "Создан затенÑющий полигон"
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr "Создать новый полигон Ñ Ð½ÑƒÐ»Ñ."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "Редактировать ÑущеÑтвующий полигон:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "ЛКМ: Передвинуть точку."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr "Ctrl+ЛКМ: Разделить Ñегмент."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "ПКМ: Удалить точку."
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr "ПолиÑетка пуÑта!"
@@ -4949,13 +4920,13 @@ msgid "Populate"
msgstr "Заполнить"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr "Создать Navigation Polygon"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr "Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ AABB"
+msgid "Generating Visibility Rect"
+msgstr "Создать облаÑть видимоÑти"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -4983,6 +4954,11 @@ msgstr "МаÑка выброÑа очищена"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr "Преобразовать в CPUParticles"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr "ЧаÑтицы"
@@ -5052,13 +5028,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr "ТребуетÑÑ Ð¼Ð°Ñ‚ÐµÑ€Ð¸Ð°Ð» типа 'ParticlesMaterial'."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
-msgstr "Генерировать AABB"
+msgid "Generating AABB"
+msgstr "Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ AABB"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "Конвертировать в ВЕРХÐИЙ РЕГИСТР"
+msgid "Generate AABB"
+msgstr "Генерировать AABB"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5082,6 +5057,10 @@ msgid "Add Point to Curve"
msgstr "Добавить точку к кривой"
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr "Разделить кривую"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr "Точка кривой передвинута"
@@ -5109,6 +5088,10 @@ msgid "Click: Add Point"
msgstr "ЛКМ: Добавить точку"
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr "ЛКМ: Разделить Ñегмент (в кривой)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr "ПКМ: Удалить точку"
@@ -5124,11 +5107,6 @@ msgstr "Добавить точку (в пуÑтом проÑтранÑтрве)
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr "Разделить Ñегмент (в кривой)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "Удалить точку"
@@ -5146,12 +5124,12 @@ msgstr "Параметры"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Angles"
-msgstr ""
+msgstr "Отразить угол ручки"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Lengths"
-msgstr ""
+msgstr "Отразить длину ручки"
#: editor/plugins/path_editor_plugin.cpp
msgid "Curve Point #"
@@ -5185,65 +5163,79 @@ msgstr "Удалить выходную контрольную точку"
msgid "Remove In-Control Point"
msgstr "Удалить входную контрольную точку"
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Разделить Ñегмент (в кривой)"
+
#: editor/plugins/physical_bone_plugin.cpp
-#, fuzzy
msgid "Move joint"
-msgstr "Передвинуть точку"
+msgstr "Передвинуть ÑуÑтав"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
-msgstr ""
+msgstr "СвойÑтво Ñкелета Polygon2D не указывает на узел Skeleton2D"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Sync bones"
-msgstr "Показать коÑти"
+msgid "Sync Bones"
+msgstr "Синхронизировать коÑти"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+"Ð’ Ñтом полигоне нет текÑтуры.\n"
+"УÑтановите текÑтуру, чтобы иметь возможноÑть редактировать UV."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr "Создать UV карту"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon & UV"
-msgstr "Создан полигон"
+msgstr "Создать Полигон и UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "Создать новую горизонтальную направлÑющую"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "ДейÑтвие '%s' уже ÑущеÑтвует!"
+msgid "Remove Internal Vertex"
+msgstr "Удалить входную контрольную точку"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Add Split"
-msgstr "Добавить точку"
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "ÐедопуÑтимый путь!"
+msgid "Add Custom Polygon"
+msgstr "Редактировать полигон"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Удалить точку"
+msgid "Remove Custom Polygon"
+msgstr "Удалить Полигон и Точку"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr "Преобразовать UV карту"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
-msgstr ""
+msgid "Transform Polygon"
+msgstr "Преобразовать полигон"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Paint Bone Weights"
+msgstr "КоÑтные грузы Ð´Ð»Ñ ÐºÑ€Ð°Ñки"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Open Polygon 2D UV editor."
+msgstr "Открыть UV-редактор Polygon 2D."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
@@ -5251,31 +5243,25 @@ msgstr "Polygon 2D UV редактор"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "UV"
-msgstr ""
+msgstr "UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "Редактировать полигон"
+msgid "Points"
+msgstr "Точка"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Splits"
-msgstr "Разделить путь"
+msgid "Polygons"
+msgstr "Полигон -> UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Bones"
-msgstr "Создать коÑти"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Create Polygon"
-msgstr "Создан полигон"
+msgstr "КоÑти"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
-msgstr "Передвинуть точку"
+msgid "Move Points"
+msgstr "Передвинуть Точку"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
@@ -5302,25 +5288,27 @@ msgid "Scale Polygon"
msgstr "МаÑштабировать полигон"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "Сначала выберите Ñлемент наÑтроек!"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
-msgstr ""
+msgid "Paint weights with specified intensity."
+msgstr "ПокраÑить веÑа Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ интенÑивноÑтью."
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
-msgstr ""
+#, fuzzy
+msgid "Unpaint weights with specified intensity."
+msgstr "СнÑть краÑку веÑа Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ интенÑивноÑтью"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Radius:"
-msgstr ""
+msgstr "РадиуÑ:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon->UV"
@@ -5335,9 +5323,13 @@ msgid "Clear UV"
msgstr "ОчиÑтить UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Settings"
-msgstr "GridMap Параметры"
+msgstr "Параметры Ñетки"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "ПривÑзка"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
@@ -5348,34 +5340,28 @@ msgid "Grid"
msgstr "Сетка"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Configure Grid:"
-msgstr "ÐаÑтроить привÑзку"
+msgstr "ÐаÑтройки Ñетки:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset X:"
-msgstr "ОтÑтуп Ñетки:"
+msgstr "ОтÑтуп Ñетки по X:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset Y:"
-msgstr "ОтÑтуп Ñетки:"
+msgstr "ОтÑтуп Ñетки по Y:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step X:"
-msgstr "Шаг Ñетки:"
+msgstr "Шаг Ñетки по X:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step Y:"
-msgstr "Шаг Ñетки:"
+msgstr "Шаг Ñетки по Y:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Sync Bones to Polygon"
-msgstr "МаÑштабировать полигон"
+msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ ÐºÐ¾Ñтей Ñ Ð¿Ð¾Ð»Ð¸Ð³Ð¾Ð½Ð¾Ð¼"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "ERROR: Couldn't load resource!"
@@ -5403,22 +5389,22 @@ msgid "Paste Resource"
msgstr "Ð’Ñтавить параметры"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "Открыть в редакторе"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr "ЭкземплÑÑ€:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr "Тип:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Открыть в редакторе"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr "Загрузить реÑурÑ"
@@ -5429,12 +5415,11 @@ msgstr "Предзагрузчик реÑурÑов"
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "AnimationTree has no path set to an AnimationPlayer"
-msgstr ""
+msgstr "AnimationTree - не задан путь к AnimationPlayer"
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Path to AnimationPlayer is invalid"
-msgstr "Дерево анимации не дейÑтвительно."
+msgstr "Путь к AnimationPlayer недейÑтвительный"
#: editor/plugins/script_editor_plugin.cpp
msgid "Clear Recent Files"
@@ -5445,48 +5430,46 @@ msgid "Close and save changes?"
msgstr "Закрыть и Ñохранить изменениÑ?"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error writing TextFile:"
-msgstr "Ошибка Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°:\n"
+msgstr "Ошибка при запиÑи:"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr "Ошибка: Ðе удалоÑÑŒ загрузить файл."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error could not load file."
-msgstr "Ðевозможно загрузить изображение"
+msgstr "Ðе удалоÑÑŒ загрузить файл."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error saving file!"
-msgstr "Ошибка ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð½Ð°Ð±Ð¾Ñ€Ð° тайлов!"
+msgstr "Ошибка при Ñохранении файла!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr "Ошибка во Ð²Ñ€ÐµÐ¼Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ¼Ñ‹"
+msgid "Error while saving theme."
+msgstr "Ошибка при Ñохранении темы."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+msgid "Error Saving"
msgstr "Ошибка ÑохранениÑ"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr "Ошибка Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐ¼Ñ‹"
+msgid "Error importing theme."
+msgstr "Ошибка Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐ¼Ñ‹."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
-msgstr "Ошибка импортированиÑ"
+msgid "Error Importing"
+msgstr "Ошибка Импорта"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New TextFile..."
-msgstr "ÐÐ¾Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°..."
+msgstr "Создать текÑтовый файл..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open File"
msgstr "Открыть файл"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Save File As..."
msgstr "Сохранить как..."
@@ -5495,6 +5478,14 @@ msgid "Import Theme"
msgstr "Импортировать тему"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Ошибка во Ð²Ñ€ÐµÐ¼Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ¼Ñ‹"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Ошибка ÑохранениÑ"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr "Сохранить тему как..."
@@ -5504,7 +5495,7 @@ msgstr " СÑылка на КлаÑÑ"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
-msgstr ""
+msgstr "Включить Ñортировку по алфавиту в ÑпиÑке методов."
#: editor/plugins/script_editor_plugin.cpp
msgid "Sort"
@@ -5535,9 +5526,8 @@ msgid "File"
msgstr "Файл"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "New TextFile"
-msgstr "ПроÑмотр Файлов"
+msgid "Open..."
+msgstr "Открыть..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5552,11 +5542,7 @@ msgid "Copy Script Path"
msgstr "Копировать путь к Ñкрипту"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr "Показать в файловой ÑиÑтеме"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+msgid "History Previous"
msgstr "Предыдущий файл"
#: editor/plugins/script_editor_plugin.cpp
@@ -5569,6 +5555,10 @@ msgid "Theme"
msgstr "Тема"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme..."
+msgstr "Импортировать тему...."
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
msgstr "Перезагрузить тему"
@@ -5577,10 +5567,6 @@ msgid "Save Theme"
msgstr "Сохранить тему"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "Сохранить тему как"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "Закрыть документацию"
@@ -5627,7 +5613,7 @@ msgid "Keep Debugger Open"
msgstr "ОÑтавить отладчик открытым"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr "Отладка Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ внешнего редактора"
#: editor/plugins/script_editor_plugin.cpp
@@ -5635,10 +5621,6 @@ msgid "Open Godot online documentation"
msgstr "Открыть онлайн документацию Godot"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr "ПоиÑк в клаÑÑовой иерархии."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "ПоиÑк Ñправочной документации."
@@ -5675,39 +5657,32 @@ msgid "Debugger"
msgstr "Отладчик"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search results"
-msgstr "Помощь"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "ПоиÑк клаÑÑов"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-"Ð’Ñтроенные Ñкрипты могут быть изменены только, когда Ñцена, которой они "
-"принадлежат, загружена"
+msgid "Search Results"
+msgstr "Результаты поиÑка"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Line"
-msgstr "Строка:"
+msgstr "Строка"
#: editor/plugins/script_text_editor.cpp
msgid "(ignore)"
-msgstr ""
+msgstr "(игнорировать)"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function"
+msgstr "Перейти к функции"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr "Стандартный"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr "Можно перетащить только реÑÑƒÑ€Ñ Ð¸Ð· файловой ÑиÑтемы."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Lookup Symbol"
-msgstr "СпиÑок автозавершениÑ"
+msgstr "ПоиÑк"
#: editor/plugins/script_text_editor.cpp
msgid "Pick Color"
@@ -5727,15 +5702,11 @@ msgstr "нижний региÑтр"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Capitalize"
-msgstr "С ПропиÑной"
+msgstr "ПропиÑные"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Syntax Highlighter"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
+msgstr "ПодÑветка СинтакÑиÑа"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
@@ -5788,11 +5759,11 @@ msgid "Trim Trailing Whitespace"
msgstr "Удаление пробелов в конце Ñтрок"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr "Преобразовать отÑтуп в пробелы"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr "Преобразовать отÑтуп в табулÑцию"
#: editor/plugins/script_text_editor.cpp
@@ -5809,36 +5780,27 @@ msgid "Remove All Breakpoints"
msgstr "Удалить вÑе точки оÑтановок"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
+msgid "Go to Next Breakpoint"
msgstr "Перейти к Ñледующей точке оÑтановки"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
+msgid "Go to Previous Breakpoint"
msgstr "Перейти к предыдущей точке оÑтановки"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr "Конвертировать в ВЕРХÐИЙ РЕГИСТР"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr "Конвертировать в нижний региÑтр"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr "Ðайти предыдущее"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Find in files..."
-msgstr "ОтÑортировать файлы..."
+msgid "Find in Files..."
+msgstr "Ðайти в файлах..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+msgid "Go to Function..."
msgstr "Перейти к функции..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+msgid "Go to Line..."
msgstr "Перейти к Ñтроке..."
#: editor/plugins/script_text_editor.cpp
@@ -5851,40 +5813,35 @@ msgstr "Шейдер"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "This skeleton has no bones, create some children Bone2D nodes."
-msgstr ""
+msgstr "У Ñтого Ñкелета нет коÑтей, Ñоздайте дочерние Bone2D узлы."
#: editor/plugins/skeleton_2d_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton2D"
-msgstr "Скелет..."
+msgstr "2D Ñкелет"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Make Rest Pose (From Bones)"
-msgstr ""
+msgstr "Сделать позу Ð¿Ð¾ÐºÐ¾Ñ (из коÑтей)"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Set Bones to Rest Pose"
-msgstr ""
+msgstr "УÑтановить коÑти в позу покоÑ"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical bones"
-msgstr "Создать полиÑетку навигации"
+msgstr "Создать физичеÑкие коÑти"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton"
-msgstr "Скелет..."
+msgstr "Скелет"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical skeleton"
-msgstr "Создать C# решение"
+msgstr "Создать физичеÑкий Ñкелет"
#: editor/plugins/skeleton_ik_editor_plugin.cpp
-#, fuzzy
msgid "Play IK"
-msgstr "ВоÑпроизвеÑти"
+msgstr "ВоÑпроизвеÑти IK"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Orthogonal"
@@ -5935,6 +5892,14 @@ msgid "Animation Key Inserted."
msgstr "Ключ анимации вÑтавлен."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr "Ð’Ñ‹Ñота"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr "Отклонение"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr "ÐариÑовано обьектов"
@@ -6019,9 +5984,8 @@ msgid "This operation requires a single selected node."
msgstr "Эта Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ одного выбранного узла."
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Lock View Rotation"
-msgstr "ИнформациÑ"
+msgstr "Блокировать вращение камеры"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Normal"
@@ -6045,7 +6009,7 @@ msgstr "Окружение"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Gizmos"
-msgstr "Гизмо"
+msgstr "Отобразить гизмо"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Information"
@@ -6068,9 +6032,8 @@ msgid "Doppler Enable"
msgstr "ДоплеровÑкий режим"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Cinematic Preview"
-msgstr "Создание предпроÑмотра"
+msgstr "КинематографичеÑкий предварительный проÑмотр"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
@@ -6101,6 +6064,10 @@ msgid "Freelook Speed Modifier"
msgstr "Обзор модификатор ÑкороÑти"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "Блокировать вращение камеры"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "XForm диалоговое окно"
@@ -6203,11 +6170,6 @@ msgid "Tool Scale"
msgstr "ИнÑтрумент маÑштаб"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap To Floor"
-msgstr "ПривÑзка к Ñетке"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Переключить Ñвободный обзор"
@@ -6217,7 +6179,7 @@ msgstr "Преобразование"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap object to floor"
-msgstr ""
+msgstr "ПривÑзать объект к полу"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Dialog..."
@@ -6248,7 +6210,6 @@ msgid "4 Viewports"
msgstr "4 Окна"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Gizmos"
msgstr "Гизмо"
@@ -6325,52 +6286,51 @@ msgstr "До"
msgid "Post"
msgstr "ПоÑле"
-#: editor/plugins/sprite_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
+msgid "Name-less gizmo"
+msgstr "БезымÑнный штуковина"
+
+#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
-msgstr "Путь ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¿ÑƒÑÑ‚!"
+msgstr "Спрайт пуÑÑ‚!"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Can't convert a sprite using animation frames to mesh."
msgstr ""
+"Ðе удаетÑÑ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ñ‚ÑŒ Ñпрайт иÑпользующий анимационные кадры в Ñетку."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't replace by mesh."
-msgstr ""
+msgstr "ÐÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ð³ÐµÐ¾Ð¼ÐµÑ‚Ñ€Ð¸Ñ, не может быть заменена Ñеткой."
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite"
-msgstr "Спрайт кадры"
+msgstr "Спрайт"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to 2D Mesh"
-msgstr "Преобразовать в %s"
+msgstr "Преобразовать в 2D Mesh"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create 2D Mesh"
-msgstr "Создать полиÑетку обводки"
+msgstr "Создать 2D Mesh"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Simplification: "
-msgstr ""
+msgstr "Упрощение: "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Grow (Pixels): "
-msgstr "ПривÑзка (пикÑели):"
+msgstr "РоÑÑ‚ (пикÑели): "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Update Preview"
-msgstr "Предварительный проÑмотр атлаÑа"
+msgstr "Обновить предварительный проÑмотр"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Settings:"
-msgstr "ÐаÑтройки"
+msgstr "Параметры:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
@@ -6445,12 +6405,17 @@ msgid "Set Region Rect"
msgstr "Задать регион"
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr "Задать отÑтуп"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr "Режим привÑзки:"
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
-msgstr "<Ðет>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
+msgstr "ПуÑто"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Pixel Snap"
@@ -6474,12 +6439,11 @@ msgstr "Шаг:"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Sep.:"
-msgstr ""
+msgstr "Разделитель:"
#: editor/plugins/texture_region_editor_plugin.cpp
-#, fuzzy
msgid "TextureRegion"
-msgstr "ОблаÑть текÑтуры"
+msgstr "TextureRegion"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Can't save theme to file:"
@@ -6610,9 +6574,12 @@ msgid "Erase Selection"
msgstr "ОчиÑтить выделенное"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Fix Invalid Tiles"
-msgstr "ÐедопуÑтимое имÑ."
+msgstr "ИÑправить недопуÑтимые плитки"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Cut Selection"
+msgstr "Вырезать выделенное"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
@@ -6635,9 +6602,8 @@ msgid "Erase TileMap"
msgstr "ОчиÑтить карту тайлов"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Find Tile"
-msgstr "Ðайти тайл"
+msgstr "Ðайти плитку"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Transpose"
@@ -6660,35 +6626,36 @@ msgid "Pick Tile"
msgstr "Выбрать тайл"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
-msgid "Move Selection"
-msgstr "Удалить выделенное"
+msgid "Copy Selection"
+msgstr "Копировать выделенное"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr "Поворот на 0 градуÑов"
+msgid "Rotate left"
+msgstr "Повернуть влево"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr "Поворот на 90 градуÑов"
+msgid "Rotate right"
+msgstr "Повернуть вправо"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
-msgstr "Поворот на 180 градуÑов"
+msgid "Flip horizontally"
+msgstr "Отразить по горизонтали"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
-msgstr "Поворот на 270 градуÑов"
+msgid "Flip vertically"
+msgstr "Отразить по вертикали"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Clear transform"
+msgstr "ОчиÑтить преобразование"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Add Texture(s) to TileSet"
-msgstr "Добавить узел(узлы) из дерева"
+msgid "Add Texture(s) to TileSet."
+msgstr "Добавить текÑтуру(Ñ‹) в TileSet."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Remove current Texture from TileSet"
-msgstr "Удалить текущее поле"
+msgid "Remove selected Texture from TileSet."
+msgstr "Удалить выбранную текÑтуру из TileSet."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -6699,88 +6666,211 @@ msgid "Merge from Scene"
msgstr "СлиÑние из Ñцены"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
-msgstr ""
-"Выберите плитку Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² качеÑтве значка, она также будет "
-"иÑпользоватьÑÑ Ð¿Ñ€Ð¸ неверных привÑзках автотайлов."
+msgid "Copy bitmask."
+msgstr "Копировать битовую маÑку."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
-msgstr ""
+msgid "Paste bitmask."
+msgstr "Ð’Ñтавить битовую маÑку."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
-msgstr ""
+msgid "Erase bitmask."
+msgstr "Стереть битовую маÑку."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new polygon."
+msgstr "Создать новый полигон."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr "Держать полигон внутри облаÑти Rect."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
+msgstr "Включить привÑзку и отображение Ñетки (наÑтраиваетÑÑ Ñ‡ÐµÑ€ÐµÐ· инÑпектор)."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr "Отобразить имена плиток (удерживать нажатой клавишу Alt)"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "Удалить выделенную текÑтуру и ВСЕ ПЛИТКИ, которые ее иÑпользуют?"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
-msgstr ""
+msgstr "Ð’Ñ‹ не выбрали текÑтуру Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
-msgstr "Создать из Ñцены?"
+#, fuzzy
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr "Создавать из Ñцены? Это перезапишет вÑе текущие плитки."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
msgstr "СлиÑние из Ñцены?"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
-msgstr ""
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Удалить шаблон"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
+msgstr "%s файл(Ñ‹) не были добавлены, потому что уже были в ÑпиÑке."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Drag handles to edit Rect.\n"
"Click on another Tile to edit it."
msgstr ""
+"Перетащите ручки Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Rect.\n"
+"Ðажмите на другую плитку, чтобы отредактировать ее."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete selected Rect."
+msgstr "Удалить выбранный Rect."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
-"ЛКМ: уÑтановить бит.\n"
-"ПКМ: ÑнÑть бит."
+"Выбрать текущий редактированный вложенный тайл.\n"
+"Ðажмите на другой тайл чтобы его отредактировать."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete polygon."
+msgstr "Удалить полигон."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
-msgstr "Выберите текущий редактированный вложенный тайл."
+msgstr ""
+"ЛКМ: уÑтановить бит.\n"
+"ПКМ: ÑнÑть бит.\n"
+"Ðажмите на другой тайл чтобы его отредактировать."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to use as icon, this will be also used on invalid autotile "
"bindings.\n"
"Click on another Tile to edit it."
msgstr ""
-"Выберите плитку Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² качеÑтве значка, она также будет "
-"иÑпользоватьÑÑ Ð¿Ñ€Ð¸ неверных привÑзках автотайлов."
+"Выберите вложенную плитку Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² качеÑтве иконки, она также "
+"будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð½ÐµÐ´ÐµÐ¹Ñтвительных автопривÑзок.\n"
+"Ðажмите на другую плитку, чтобы отредактировать ее."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to change its priority.\n"
"Click on another Tile to edit it."
-msgstr "Выберите вложенный тайл, Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÐµÐ³Ð¾ приоритета."
+msgstr ""
+"Выберите Ñуб-плитку, чтобы изменить его приоритет.\n"
+"Ðажмите на другую плитку, чтобы отредактировать ее."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+"Выберите Ñуб-плитку, чтобы изменить его Ð¸Ð½Ð´ÐµÐºÑ z.\n"
+"Ðажмите на другую плитку, чтобы отредактировать ее."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Set Tile Region"
+msgstr "Задать регион"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Создать папку"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr "УÑтановить Иконку Плитки"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "Редактировать фильтры"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Редактировать ÑущеÑтвующий полигон:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Редактировать полигон"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Создать Navigation Polygon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "Ð’Ñтавить битовую маÑку."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr "ОчиÑтить Битовую МаÑку Плитки"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Удалить шаблон"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "Удалить Полигон и Точку"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "Создан затенÑющий полигон"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "Создать Navigation Polygon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "Редактировать фильтры"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr "Редактирование Z индекÑа плитки"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Создать Navigation Polygon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Создан затенÑющий полигон"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "This property can't be changed."
-msgstr "Эта Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð½Ðµ может быть выполнена без Ñцены."
+msgstr "Это ÑвойÑтво не может быть изменено."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
-msgstr "Ðабор тайлов"
+msgid "TileSet"
+msgstr "TileSet"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vertex"
msgstr "Вершины"
@@ -6789,14 +6879,12 @@ msgid "Fragment"
msgstr "Фрагмент"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Light"
-msgstr "Право"
+msgstr "Свет"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "VisualShader"
-msgstr "Шейдер"
+msgstr "VisualShader"
#: editor/project_export.cpp
msgid "Runnable"
@@ -6815,6 +6903,14 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr "Шаблоны ÑкÑпорта Ð´Ð»Ñ Ñтой платформы отÑутÑтвуют/повреждены:"
#: editor/project_export.cpp
+msgid "Release"
+msgstr "Релиз"
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr "ЭкÑпорт вÑех"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr "ПредуÑтановки"
@@ -6823,6 +6919,10 @@ msgid "Add..."
msgstr "Добавить..."
#: editor/project_export.cpp
+msgid "Export Path"
+msgstr "Путь ÑкÑпорта"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr "РеÑурÑÑ‹"
@@ -6879,10 +6979,48 @@ msgid "Feature List:"
msgstr "СпиÑок ÑвойÑтв:"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "Ðовый Ñкрипт"
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "Режим ÑкÑÐ¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñкриптов:"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr "ТекÑтовый"
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr "Компилированный"
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "Зашифрованный (Ðапишите ключ ниже)"
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+"ÐедейÑтвительный ключ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ (длина ключа должна ÑоÑтавлÑть 64 Ñимвола)"
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "Ключ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñкрипта (256-бит, а в шеÑтнадцатеричном виде):"
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr "ЭкÑпортировать PCK/Zip"
#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr "Режим ÑкÑпорта?"
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr "ЭкÑпортировать вÑÑ‘"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr "Шаблоны ÑкÑпорта Ð´Ð»Ñ Ñтой платформы отÑутÑтвуют:"
@@ -6895,22 +7033,21 @@ msgid "The path does not exist."
msgstr "Путь не ÑущеÑтвует."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
-msgstr "ПожалуйÑта, выберите папку, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½Ðµ Ñодержит файл 'project.godot'."
+msgstr ""
+"ÐедейÑтвительный '.zip' файл проекта, не Ñодержит файл 'project.godot'."
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "ПожалуйÑта, выберите пуÑтую папку."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "ПожалуйÑта, выберите 'project.godot' файл."
+msgstr "ПожалуйÑта, выберите файл 'project.godot' или '.zip'."
#: editor/project_manager.cpp
msgid "Directory already contains a Godot project."
-msgstr ""
+msgstr "Каталог уже Ñодержит проект Godot."
#: editor/project_manager.cpp
msgid "Imported Project"
@@ -7001,9 +7138,8 @@ msgid "Project Path:"
msgstr "Путь к проекту:"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Project Installation Path:"
-msgstr "Путь к проекту:"
+msgstr "Путь уÑтановки проекта:"
#: editor/project_manager.cpp
msgid "Browse"
@@ -7014,7 +7150,8 @@ msgid "Unnamed Project"
msgstr "БезымÑнный проект"
#: editor/project_manager.cpp
-msgid "Can't open project"
+#, fuzzy
+msgid "Can't open project at '%s'."
msgstr "Ðе удаётÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ проект"
#: editor/project_manager.cpp
@@ -7023,6 +7160,33 @@ msgstr "Ð’Ñ‹ уверены, что хотите открыть более одÐ
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+"Файл наÑтроек проекта был Ñгенерирован Ñтарой верÑией движка и должен быть "
+"преобразован Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ верÑии:\n"
+"\n"
+"%s\n"
+"\n"
+"Вы хотите преобразовать его?\n"
+"Внимание: Ð’Ñ‹ больше не Ñможете открыть проект предыдущими верÑиÑми движка."
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+"ÐаÑтройки проекта были Ñозданы более новой верÑией движка, которые "
+"неÑовмеÑтимы Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ верÑией."
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7124,13 +7288,12 @@ msgid "Mouse Button"
msgstr "Кнопка мыши"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid ""
"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
msgstr ""
-"ÐедопуÑтимое Ð¸Ð¼Ñ Ð´ÐµÐ¹ÑтвиÑ. Оно не может быть пуÑтым или Ñодержать '/', ':', "
-"'=', '\\' или '\"'."
+"Ðеверное Ð¸Ð¼Ñ Ð´ÐµÐ¹ÑтвиÑ. Оно не может быть пуÑтым и не может Ñодержать Ñимволы "
+"\"/\", \":\", \"=\", \"\\\" или \"''\""
#: editor/project_settings_editor.cpp
msgid "Action '%s' already exists!"
@@ -7141,18 +7304,16 @@ msgid "Rename Input Action Event"
msgstr "Переименовать дейÑтвие"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Change Action deadzone"
-msgstr "Изменить Ð¸Ð¼Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ð¸:"
+msgstr "Изменить ДейÑтвие мертвой зоны"
#: editor/project_settings_editor.cpp
msgid "Add Input Action Event"
msgstr "Добавить дейÑтвие"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "All Devices"
-msgstr "УÑтройÑтво"
+msgstr "Ð’Ñе уÑтройÑтва"
#: editor/project_settings_editor.cpp
msgid "Device"
@@ -7199,24 +7360,20 @@ msgid "Wheel Down Button"
msgstr "КолёÑико вниз"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Left Button"
-msgstr "КолёÑико вверх"
+msgstr "Кнопка на колеÑике Ñлева"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Right Button"
-msgstr "ÐŸÑ€Ð°Ð²Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° мыши"
+msgstr "ÐŸÑ€Ð°Ð²Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° колеÑа"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 1"
-msgstr "Кнопка 6"
+msgstr "Кнопка X 1"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 2"
-msgstr "Кнопка 6"
+msgstr "Кнопка X 2"
#: editor/project_settings_editor.cpp
msgid "Joypad Axis Index:"
@@ -7358,17 +7515,13 @@ msgstr "ÐаÑтройки проекта (project.godot)"
msgid "General"
msgstr "ОÑновное"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr "Параметр:"
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr "Переопределить длÑ..."
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Editor must be restarted for changes to take effect"
-msgstr ""
+msgstr "Чтобы Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ñтупили в Ñилу, необходимо перезапуÑтить редактор"
#: editor/project_settings_editor.cpp
msgid "Input Map"
@@ -7384,7 +7537,7 @@ msgstr "ДейÑтвие"
#: editor/project_settings_editor.cpp
msgid "Deadzone"
-msgstr ""
+msgstr "ÐœÐµÑ€Ñ‚Ð²Ð°Ñ Ð·Ð¾Ð½Ð°"
#: editor/project_settings_editor.cpp
msgid "Device:"
@@ -7494,10 +7647,6 @@ msgstr "Выберите узел"
msgid "Bit %d, val %d."
msgstr "Бит %d, значение %d."
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr "СвойÑтва:"
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr "Выбрать ÑвойÑтво"
@@ -7521,97 +7670,94 @@ msgstr ""
"инÑтрумент:"
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Batch Rename"
-msgstr "Переименовать"
+msgstr "Пакетное переименование"
#: editor/rename_dialog.cpp
msgid "Prefix"
-msgstr ""
+msgstr "ПрефикÑ"
#: editor/rename_dialog.cpp
msgid "Suffix"
-msgstr ""
+msgstr "СуффикÑ"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Advanced options"
-msgstr "Параметры прилипаниÑ"
+msgstr "Дополнительные параметры"
#: editor/rename_dialog.cpp
msgid "Substitute"
-msgstr ""
+msgstr "Заменить"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node name"
-msgstr "Ð˜Ð¼Ñ Ð£Ð·Ð»Ð°:"
+msgstr "Ð˜Ð¼Ñ ÑƒÐ·Ð»Ð°"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
-msgstr ""
+msgstr "Ð˜Ð¼Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑкого узла, еÑли оно доÑтупно"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node type"
-msgstr "Ðайти тип узла"
+msgstr "Тип узла"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Current scene name"
-msgstr "Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ñцена"
+msgstr "Ðазвание текущей Ñцены"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Root node name"
-msgstr "Ð˜Ð¼Ñ ÐºÐ¾Ñ€Ð½ÐµÐ²Ð¾Ð³Ð¾ узла:"
+msgstr "Ð˜Ð¼Ñ ÐºÐ¾Ñ€Ð½ÐµÐ²Ð¾Ð³Ð¾ узла"
#: editor/rename_dialog.cpp
msgid ""
"Sequential integer counter.\n"
"Compare counter options."
msgstr ""
+"ПоÑледовательный целочиÑленный Ñчетчик.\n"
+"Сравните параметров Ñчетчика."
#: editor/rename_dialog.cpp
msgid "Per Level counter"
-msgstr ""
+msgstr "Счетчик уровнÑ"
#: editor/rename_dialog.cpp
msgid "If set the counter restarts for each group of child nodes"
msgstr ""
+"ЕÑли уÑтановить, Ñчетчик перезапуÑтитÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ группы дочерних узлов"
#: editor/rename_dialog.cpp
msgid "Initial value for the counter"
-msgstr ""
+msgstr "Ðачальное значение Ð´Ð»Ñ Ñчетчика"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Step"
-msgstr "Шаг:"
+msgstr "Шаг"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
+"КоличеÑтво, на которое увеличиваетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ñчетчика Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ узла"
#: editor/rename_dialog.cpp
msgid "Padding"
-msgstr ""
+msgstr "ОтÑтуп"
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
+"Минимальное количеÑтво цифр Ð´Ð»Ñ Ñчетчика.\n"
+"ÐедоÑтающие цифры заполнÑÑŽÑ‚ÑÑ Ð½ÑƒÐ»Ñми."
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Regular Expressions"
-msgstr "Изменить выражение"
+msgstr "РегулÑрные ВыражениÑ"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Post-Process"
-msgstr "Скрипт поÑÑ‚-процеÑÑа:"
+msgstr "ПоÑÑ‚-обработка"
#: editor/rename_dialog.cpp
msgid "Keep"
@@ -7619,15 +7765,17 @@ msgstr "ОÑтавить оригинал"
#: editor/rename_dialog.cpp
msgid "CamelCase to under_scored"
-msgstr ""
+msgstr "CamelCase в under_scored"
#: editor/rename_dialog.cpp
+#, fuzzy
msgid "under_scored to CamelCase"
-msgstr ""
+msgstr "under_scored в CamelCase"
#: editor/rename_dialog.cpp
+#, fuzzy
msgid "Case"
-msgstr ""
+msgstr "РегиÑтр"
#: editor/rename_dialog.cpp
#, fuzzy
@@ -7640,11 +7788,10 @@ msgid "To Uppercase"
msgstr "ВЕРХÐИЙ РЕГИСТР"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Reset"
-msgstr "СброÑить приближение"
+msgstr "СброÑ"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr "Ошибка"
@@ -7705,6 +7852,10 @@ msgid "Instance Scene(s)"
msgstr "Дополнить Ñценой(ами)"
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "Добавить дочернюю Ñцену"
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr "Убрать Ñкрипт"
@@ -7741,6 +7892,14 @@ msgid "Save New Scene As..."
msgstr "Сохранить новую Сцену как..."
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+"Отключение параметра \"editable_instance\" приведет к тому, что вÑе ÑвойÑтва "
+"узла будут возвращены к значениÑм по умолчанию."
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr "Редактируемые потомки"
@@ -7753,29 +7912,24 @@ msgid "Make Local"
msgstr "Сделать локальным"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "Создать узел"
+msgstr "Создать корневой узел:"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "2D Scene"
-msgstr "Сцена"
+msgstr "2D-Ñцена"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "3D Scene"
-msgstr "Сцена"
+msgstr "3D-Ñцена"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "User Interface"
-msgstr "ОчиÑтить наÑледование"
+msgstr "ПользовательÑкий интерфейÑ"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Custom Node"
-msgstr "Вырезать узлы"
+msgstr "ПользовательÑкий узел"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
@@ -7818,6 +7972,10 @@ msgid "Clear Inheritance"
msgstr "ОчиÑтить наÑледование"
#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr "Открыть документацию"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr "Удалить узел(узлы)"
@@ -7826,17 +7984,17 @@ msgid "Add Child Node"
msgstr "Добавить дочерний узел"
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
-msgstr "Добавить дочернюю Ñцену"
-
-#: editor/scene_tree_dock.cpp
msgid "Change Type"
msgstr "Изменить тип"
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Extend Script"
+msgstr "ÐаÑледовать Ñкрипт"
+
+#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
-msgstr "Ðовый корень Ñцены"
+msgstr "Создать корневой узел Ñцены"
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
@@ -7887,7 +8045,6 @@ msgid "Clear Inheritance? (No Undo!)"
msgstr "ОчиÑтить наÑледование? (ÐÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ!)"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Toggle Visible"
msgstr "Переключить видимоÑть"
@@ -7896,7 +8053,6 @@ msgid "Node configuration warning:"
msgstr "Конфигурации узла, предупреждение:"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node has connection(s) and group(s).\n"
"Click to show signals dock."
@@ -7921,27 +8077,24 @@ msgstr ""
"Ðажмите, чтобы показать панель групп."
#: editor/scene_tree_editor.cpp editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script"
msgstr "Открыть Ñкрипт"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node is locked.\n"
"Click to unlock it."
msgstr ""
"Узел заблокирован.\n"
-"Ðажмите чтобы разблокировать"
+"Ðажмите чтобы разблокировать."
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Children are not selectable.\n"
"Click to make selectable."
msgstr ""
-"Потомки не выделÑÑŽÑ‚ÑÑ.\n"
-"Ðажмите чтобы выделÑлиÑÑŒ"
+"Дочерние объекты не выделÑÑŽÑ‚ÑÑ.\n"
+"Ðажмите, чтобы Ñделать их выделÑемыми."
#: editor/scene_tree_editor.cpp
msgid "Toggle Visibility"
@@ -7952,6 +8105,8 @@ msgid ""
"AnimationPlayer is pinned.\n"
"Click to unpin."
msgstr ""
+"AnimationPlayer закреплен.\n"
+"Ðажмите, чтобы открепить."
#: editor/scene_tree_editor.cpp
msgid "Invalid node name, the following characters are not allowed:"
@@ -7992,13 +8147,17 @@ msgstr "Ð/Д"
#: editor/script_create_dialog.cpp
#, fuzzy
msgid "Open Script/Choose Location"
-msgstr "Открыть редактор Ñкриптов"
+msgstr "Открыть Скрипт/Выбрать МеÑто"
#: editor/script_create_dialog.cpp
msgid "Path is empty"
msgstr "Ðе указан путь"
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr "ПуÑтое Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr "Путь не локальный"
@@ -8087,20 +8246,9 @@ msgid "Bytes:"
msgstr "Байты:"
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr "Предупреждение"
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr "Ошибка:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr "ИÑточник:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
-msgstr "ФункциÑ:"
+#, fuzzy
+msgid "Stack Trace"
+msgstr "ТраÑÑировка Стека"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8117,7 +8265,7 @@ msgstr "Дочерний процеÑÑ ÑвÑзан"
#: editor/script_editor_debugger.cpp
msgid "Copy Error"
-msgstr "Ошибка копированиÑ"
+msgstr "Копировать ошибку"
#: editor/script_editor_debugger.cpp
msgid "Inspect Previous Instance"
@@ -8132,18 +8280,6 @@ msgid "Stack Frames"
msgstr "Стек"
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr "ПеременнаÑ"
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr "Ошибки:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr "ТраÑÑировка Ñтека (еÑли применимо):"
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr "Профайлер"
@@ -8261,38 +8397,32 @@ msgid "Change Capsule Shape Height"
msgstr "Изменить выÑоту капÑулы"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Radius"
-msgstr "Изменить Ñ€Ð°Ð´Ð¸ÑƒÑ ÐºÐ°Ð¿Ñулы"
+msgstr "Изменить Ñ€Ð°Ð´Ð¸ÑƒÑ Ñ†Ð¸Ð»Ð¸Ð½Ð´Ñ€Ð°"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Height"
-msgstr "Изменить выÑоту капÑулы"
+msgstr "Изменить выÑоту цилиндра"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Ray Shape Length"
msgstr "Изменить длину луча"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Radius"
-msgstr "Изменить Ñ€Ð°Ð´Ð¸ÑƒÑ Ñвета"
+msgstr "Изменить Ñ€Ð°Ð´Ð¸ÑƒÑ Ñ†Ð¸Ð»Ð¸Ð½Ð´Ñ€Ð°"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Height"
-msgstr "Изменить выÑоту капÑулы"
+msgstr "Изменить выÑоту цилиндра"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Inner Radius"
-msgstr "Изменить Ñ€Ð°Ð´Ð¸ÑƒÑ Ñферы"
+msgstr "Изменение внутреннего радиуÑа полукруга"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Outer Radius"
-msgstr "Изменить Ñ€Ð°Ð´Ð¸ÑƒÑ Ñвета"
+msgstr "Изменение внешнего радиуÑа полукруга"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select the dynamic library for this entry"
@@ -8344,10 +8474,11 @@ msgstr "Библиотеки: "
#: modules/gdnative/register_types.cpp
msgid "GDNative"
-msgstr ""
+msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+#, fuzzy
+msgid "Step argument is zero!"
msgstr "Ðргумент шага равен нулю!"
#: modules/gdscript/gdscript_functions.cpp
@@ -8414,7 +8545,7 @@ msgstr "Удалить выделенную Ñетку"
#: modules/gridmap/grid_map_editor_plugin.cpp
#, fuzzy
msgid "GridMap Fill Selection"
-msgstr "Удалить выделенную Ñетку"
+msgstr "Заполнить выделенную GridMap"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Duplicate Selection"
@@ -8497,9 +8628,8 @@ msgid "Clear Selection"
msgstr "ОчиÑтить выделение"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Fill Selection"
-msgstr "Ð’Ñе выбранные Ñлементы"
+msgstr "Заполнить выбранное"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Settings"
@@ -8570,12 +8700,9 @@ msgid "End of inner exception stack trace"
msgstr "Конец траÑÑировки внутреннего Ñтека иÑключений"
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr "Запечь!"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
-msgstr "Создать полиÑетку навигации."
+#, fuzzy
+msgid "Bake NavMesh"
+msgstr "ИÑпечь NavMesh"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8804,12 +8931,11 @@ msgstr "ПриÑоединить узлы"
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
msgid "Connect Node Data"
-msgstr "ПриÑоединить узлы"
+msgstr "ПриÑоединить данные узла"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Sequence"
-msgstr "ПриÑоединить узлы"
+msgstr "ПриÑоединить цепь узлов"
#: modules/visual_script/visual_script_editor.cpp
msgid "Script already has function '%s'"
@@ -8856,6 +8982,10 @@ msgid "Base Type:"
msgstr "Базовый тип:"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "СвойÑтва:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "ДоÑтупные узлы:"
@@ -8892,9 +9022,8 @@ msgid "Paste Nodes"
msgstr "Ð’Ñтавить узлы"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
-msgstr "СвойÑтва"
+msgstr "Редактировать Ñлемент"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Input type not iterable: "
@@ -8954,17 +9083,16 @@ msgstr ""
"out) или Ñтрока (error)."
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Search VisualScript"
-msgstr "Удалить узел VisualScript"
+msgstr "ИÑкать VisualScript"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
-msgstr "Получить"
+msgid "Get %s"
+msgstr "Получить %s"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
-msgstr ""
+msgid "Set %s"
+msgstr "Задать %s"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -9015,16 +9143,15 @@ msgstr ""
"Ñцен). Будет работать первый Ñозданный, оÑтальные будут проигнорированы."
#: scene/2d/collision_object_2d.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
"define its shape."
msgstr ""
-"Этот узел не имеет дочерних форм, поÑтому он не может взаимодейÑтвовать Ñ "
-"проÑтранÑтвом.\n"
-"РаÑÑмотрите возможноÑть Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ CollisionShape2D или CollisionPolygon2D "
-"дочерних узлов, Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐµÐ³Ð¾ формы."
+"Этот узел не имеет форму, поÑтому не может ÑталкиватьÑÑ Ð¸Ð»Ð¸ "
+"взаимодейÑтвовать Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ объектами.\n"
+"Подумайте о добавлении CollisionShape2D или CollisionPolygon2D как дочерний, "
+"чтобы определить ее форму."
#: scene/2d/collision_polygon_2d.cpp
msgid ""
@@ -9060,6 +9187,14 @@ msgstr ""
"Shape должен быть предуÑмотрен Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¹ CollisionShape2D. ПожалуйÑта, "
"Ñоздайте shape-реÑÑƒÑ€Ñ Ð´Ð»Ñ Ñтого!"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+"ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ CPUParticles2D требует иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ CanvasItemMaterial Ñ "
+"включенной функцией \"Particles Animation\"."
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -9109,6 +9244,14 @@ msgid ""
msgstr ""
"Материал Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ чаÑтиц не назначен, поÑтому поведение отÑутÑтвует."
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+"Ð”Ð»Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ð¸ Particles2D требуетÑÑ Ð¸Ñпользование CanvasItemMaterial Ñ "
+"включенной функцией \"Particles Animation\"."
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -9133,16 +9276,20 @@ msgstr ""
#: scene/2d/skeleton_2d.cpp
msgid "This Bone2D chain should end at a Skeleton2D node."
-msgstr ""
+msgstr "Эта Bone2D цепь должна заканчиватьÑÑ Ð½Ð° узле Skeleton2D."
#: scene/2d/skeleton_2d.cpp
msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
msgstr ""
+"Bone2D работает только Ñо Skeleton2D или другим Bone2D в качеÑтве "
+"родительÑкого узла."
#: scene/2d/skeleton_2d.cpp
msgid ""
"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
msgstr ""
+"У Ñтой коÑти отÑутÑтвует Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ REST-позициÑ. Перейдите к узлу "
+"Skeleton2D и уÑтановите её."
#: scene/2d/visibility_notifier_2d.cpp
msgid ""
@@ -9209,16 +9356,15 @@ msgid "Lighting Meshes: "
msgstr "ОÑвещение полиÑетки: "
#: scene/3d/collision_object.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape or CollisionPolygon as a child to define "
"its shape."
msgstr ""
-"Этот узел не имеет дочерних форм, поÑтому он не может взаимодейÑтвовать Ñ "
-"проÑтранÑтвом.\n"
-"РаÑÑмотрите возможноÑть Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ CollisionShape или CollisionPolygon "
-"дочерних узлов, чтобы определить его форму."
+"Этот узел не имеет форму, поÑтому не может ÑталкиватьÑÑ Ð¸Ð»Ð¸ "
+"взаимодейÑтвовать Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ объектами.\n"
+"Подумайте о добавлении CollisionShape или CollisionPolygon как дочернего, "
+"чтобы определить ее форму."
#: scene/3d/collision_polygon.cpp
msgid ""
@@ -9252,6 +9398,18 @@ msgstr ""
"Shape должен быть предуÑмотрен Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¹ CollisionShape. ПожалуйÑта, "
"Ñоздайте shape-реÑÑƒÑ€Ñ Ð´Ð»Ñ Ñтого!"
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr "Ðичто не видно, потому что не назначена Ñетка."
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+"ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ CPUParticles требует иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ SpatialMaterial Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ð¾Ð¹ "
+"функцией \"Billboard Particles\"."
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr "ПоÑтроение полиÑетки"
@@ -9274,6 +9432,31 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr "Ðичего не видно, потому что полиÑетки не были назначены на отриÑовку."
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+"ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ñ‡Ð°Ñтиц требует иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ SpatialMaterial Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ð¾Ð¹ функцией "
+"\"Billboard Particles\"."
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr "PathFollow работает только при еÑли она дочь узла Path."
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr "OrientedPathFollow работает только еÑли она дочь узла Path."
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+"OrientedPathFollow требует, чтобы в его родительÑком пути были включены "
+"векторы."
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9309,18 +9492,18 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid "This body will be ignored until you set a mesh"
-msgstr ""
+msgstr "Это тело будет игнорироватьÑÑ, пока вы не уÑтановите Ñетку"
#: scene/3d/soft_body.cpp
-#, fuzzy
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
-"Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° RigidBody (в режиме character или rigid) будут "
-"переопределены движком при запуÑке.\n"
-"Измените размер дочерней формы коллизии."
+"Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° SoftBody будут переопределены физичеÑким движком во Ð²Ñ€ÐµÐ¼Ñ "
+"работы.\n"
+"ВмеÑто Ñтого измените размер его дочерних форм Ñтолкновений(collision "
+"shapes)."
#: scene/3d/sprite_3d.cpp
msgid ""
@@ -9340,44 +9523,43 @@ msgstr ""
#: scene/animation/animation_blend_tree.cpp
msgid "On BlendTree node '%s', animation not found: '%s'"
-msgstr ""
+msgstr "Ðа узле BlendTree '%s' Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð½Ðµ найдена: '%s'"
#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "ИнÑтрументы анимации"
+msgstr "ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð½Ðµ найдена: %s"
#: scene/animation/animation_tree.cpp
msgid "In node '%s', invalid animation: '%s'."
-msgstr ""
+msgstr "Ð’ узле '%s' недопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "ОШИБКÐ: ÐедопуÑтимое название анимации!"
+msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ: \"%s\"."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "Отключить '%s' от '%s'"
+msgstr "Ðичего не подключено к входу \"%s\" узла \"%s\"."
#: scene/animation/animation_tree.cpp
msgid "A root AnimationNode for the graph is not set."
-msgstr ""
+msgstr "Ðе задан корневой AnimationNode Ð´Ð»Ñ Ð³Ñ€Ð°Ñ„Ð°."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Path to an AnimationPlayer node containing animations is not set."
-msgstr "Выберите AnimationPlayer из дерева Ñцены Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ð¹."
+msgstr "Путь к узлу AnimationPlayer, Ñодержащему анимацию, не задан."
#: scene/animation/animation_tree.cpp
msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
-msgstr ""
+msgstr "Путь, заданный Ð´Ð»Ñ AnimationPlayer, не ведет к узлу AnimationPlayer."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "AnimationPlayer root is not a valid node."
-msgstr "Дерево анимации не дейÑтвительно."
+msgstr "Корневой Ñлемент AnimationPlayer недейÑтвительный."
+
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr "Этот узел был удален. ВмеÑто Ñтого иÑпользуйте AnimationTree."
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
@@ -9395,10 +9577,6 @@ msgstr "Внимание!"
msgid "Please Confirm..."
msgstr "Подтверждение..."
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr "Выбрать Ñту папку"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9409,6 +9587,10 @@ msgstr ""
"иÑпользуйте функцию popup() или любую из popup*(). Делать их видимыми Ð´Ð»Ñ "
"Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ - нормально, но они будут Ñкрыты при запуÑке."
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr "ЕÑли exp_edit равен true min_value должно быть > 0."
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9467,27 +9649,224 @@ msgstr "ÐедопуÑтимый размер шрифта."
msgid "Input"
msgstr "Добавить вход"
-#: scene/resources/visual_shader.cpp
-#, fuzzy
-msgid "None"
-msgstr "<Ðет>"
-
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for shader."
-msgstr "Ðеверный иÑточник!"
+msgstr "ÐедейÑтвительный иÑточник шейдера."
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
-msgstr ""
+msgstr "Ðазначение функции."
#: servers/visual/shader_language.cpp
+#, fuzzy
msgid "Assignment to uniform."
-msgstr ""
+msgstr "Ðазначить форму"
#: servers/visual/shader_language.cpp
+#, fuzzy
msgid "Varyings can only be assigned in vertex function."
-msgstr ""
+msgstr "Переменные могут быть назначены только в функции вершин."
+
+#~ msgid "Split point with itself."
+#~ msgstr "Точка разделениÑ."
+
+#~ msgid "Split can't form an existing edge."
+#~ msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð´ÐµÐ»Ð¸Ñ‚ÑŒ от ÑущеÑтвующего краÑ."
+
+#~ msgid "Split already exists."
+#~ msgstr "Разрез уже ÑущеÑтвует."
+
+#~ msgid "Add Split"
+#~ msgstr "Добавить разрез"
+
+#~ msgid "Invalid Split: "
+#~ msgstr "ÐедопуÑтимое Разбиение: "
+
+#~ msgid "Remove Split"
+#~ msgstr "Удалить разрез"
+
+#~ msgid "Poly"
+#~ msgstr "Полигон"
+
+#~ msgid "Splits"
+#~ msgstr "Разделение"
+
+#~ msgid "Connect two points to make a split."
+#~ msgstr "Соединить две точки, чтобы Ñоздать разделение."
+
+#~ msgid "Select a split to erase it."
+#~ msgstr "Выберите разделение, чтобы Ñтереть его."
+
+#~ msgid "No name provided"
+#~ msgstr "Ðе указано имÑ"
+
+#~ msgid "Add Node.."
+#~ msgstr "Добавить Узел.."
+
+#~ msgid "Create from scene?"
+#~ msgstr "Создать из Ñцены?"
+
+#~ msgid "Create Poly"
+#~ msgstr "Создан полигон"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "Создать новый полигон Ñ Ð½ÑƒÐ»Ñ"
+
+#~ msgid "Zoom out"
+#~ msgstr "Уменьшить"
+
+#~ msgid "Zoom in"
+#~ msgstr "Увеличить"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "Создан Poly3D"
+
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "Ðет OccluderPolygon2D реÑурÑа у Ñтого узла.\n"
+#~ "Создать и назначить?"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "ЛКМ: Передвинуть точку."
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "Ctrl+ЛКМ: Разделить Ñегмент."
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "ПКМ: Удалить точку."
+
+#~ msgid "New TextFile"
+#~ msgstr "Ðовый текÑтовый файл"
+
+#~ msgid "Save Theme As"
+#~ msgstr "Сохранить тему как"
+
+#~ msgid "<None>"
+#~ msgstr "<Ðет>"
+
+#~ msgid ""
+#~ "Select sub-tile to use as icon, this will be also used on invalid "
+#~ "autotile bindings."
+#~ msgstr ""
+#~ "Выберите плитку Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² качеÑтве значка, она также будет "
+#~ "иÑпользоватьÑÑ Ð¿Ñ€Ð¸ неверных привÑзках автотайлов."
+
+#~ msgid "Zoom:"
+#~ msgstr "Приближение:"
+
+#~ msgid "Are you sure you want to remove all connections from the \""
+#~ msgstr "Ð’Ñ‹ уверены, что хотите удалить вÑе Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¾Ñ‚ \""
+
+#~ msgid "Class List:"
+#~ msgstr "СпиÑок клаÑÑов:"
+
+#~ msgid "Search Classes"
+#~ msgstr "ПоиÑк клаÑÑов"
+
+#~ msgid "Public Methods"
+#~ msgstr "Публичные методы"
+
+#~ msgid "Public Methods:"
+#~ msgstr "СпиÑок методов:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "Тема Ñлементов GUI"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "Тема Ñлементов GUI:"
+
+#~ msgid "Property: "
+#~ msgstr "Параметр: "
+
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "Добавить папку в Избранное."
+
+#~ msgid "Show current scene file."
+#~ msgstr "Показать текущий файл Ñцены."
+
+#~ msgid "Enter tree-view."
+#~ msgstr "Войти в древовидное предÑтавление."
+
+#~ msgid "Whole words"
+#~ msgstr "Слова целиком"
+
+#~ msgid "Match case"
+#~ msgstr "Учитывать региÑтр"
+
+#~ msgid "Filter: "
+#~ msgstr "Фильтр: "
+
+#~ msgid "Ok"
+#~ msgstr "Ок"
+
+#~ msgid "Show In File System"
+#~ msgstr "Показать в файловой ÑиÑтеме"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "ПоиÑк в клаÑÑовой иерархии."
+
+#~ msgid "Search in files"
+#~ msgstr "ИÑкать в файлах"
+
+#~ msgid ""
+#~ "Built-in scripts can only be edited when the scene they belong to is "
+#~ "loaded"
+#~ msgstr ""
+#~ "Ð’Ñтроенные Ñкрипты могут быть изменены только, когда Ñцена, которой они "
+#~ "принадлежат, загружена"
+
+#~ msgid "Convert To Uppercase"
+#~ msgstr "Конвертировать в ВЕРХÐИЙ РЕГИСТР"
+
+#~ msgid "Convert To Lowercase"
+#~ msgstr "Конвертировать в нижний региÑтр"
+
+#~ msgid "Snap To Floor"
+#~ msgstr "ПривÑзать к полу"
+
+#~ msgid "Rotate 0 degrees"
+#~ msgstr "Поворот на 0 градуÑов"
+
+#~ msgid "Rotate 90 degrees"
+#~ msgstr "Поворот на 90 градуÑов"
+
+#~ msgid "Rotate 180 degrees"
+#~ msgstr "Поворот на 180 градуÑов"
+
+#~ msgid "Rotate 270 degrees"
+#~ msgstr "Поворот на 270 градуÑов"
+
+#~ msgid "Warning"
+#~ msgstr "Предупреждение"
+
+#~ msgid "Error:"
+#~ msgstr "Ошибка:"
+
+#~ msgid "Source:"
+#~ msgstr "ИÑточник:"
+
+#~ msgid "Function:"
+#~ msgstr "ФункциÑ:"
+
+#~ msgid "Variable"
+#~ msgstr "ПеременнаÑ"
+
+#~ msgid "Errors:"
+#~ msgstr "Ошибки:"
+
+#~ msgid "Stack Trace (if applicable):"
+#~ msgstr "ТраÑÑировка Ñтека (еÑли применимо):"
+
+#~ msgid "Bake!"
+#~ msgstr "Запечь!"
+
+#~ msgid "Bake the navigation mesh."
+#~ msgstr "Создать полиÑетку навигации."
+
+#~ msgid "Get"
+#~ msgstr "Получить"
#~ msgid "Change Scalar Constant"
#~ msgstr "Изменить чиÑловую конÑтанту"
@@ -9693,9 +10072,6 @@ msgstr ""
#~ msgid "Run Script"
#~ msgstr "ЗапуÑтить Ñкрипт"
-#~ msgid "Save the currently edited resource."
-#~ msgstr "Сохранить текущий редактируемый реÑурÑ."
-
#~ msgid "Stop Profiling"
#~ msgstr "ОÑтановить профилирование"
@@ -9988,9 +10364,6 @@ msgstr ""
#~ msgid "Could not save atlas subtexture:"
#~ msgstr "Ðевозможно Ñохранить текÑтуру атлаÑа:"
-#~ msgid "Exporting for %s"
-#~ msgstr "ЭкÑпортирование Ð´Ð»Ñ %s"
-
#~ msgid "Setting Up..."
#~ msgstr "ÐаÑтройка..."
@@ -10095,9 +10468,6 @@ msgstr ""
#~ msgid "Source Font:"
#~ msgstr "ИÑходный шрифт:"
-#~ msgid "Source Font Size:"
-#~ msgstr "ИÑходный размер шрифта:"
-
#~ msgid "Dest Resource:"
#~ msgstr "РеÑÑƒÑ€Ñ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ:"
@@ -10176,9 +10546,6 @@ msgstr ""
#~ msgid "Start(s)"
#~ msgstr "Ðач(Ñ.)"
-#~ msgid "Filters"
-#~ msgstr "Фильтры"
-
#~ msgid "Source path is empty."
#~ msgstr "Путь к иÑточнику пуÑÑ‚."
@@ -10452,15 +10819,9 @@ msgstr ""
#~ msgid "Stereo"
#~ msgstr "Стерео"
-#~ msgid "Pitch"
-#~ msgstr "Ð’Ñ‹Ñота"
-
#~ msgid "Window"
#~ msgstr "Окно"
-#~ msgid "Move Right"
-#~ msgstr "Двигать вправо"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "МаÑштабирование до %s%%."
@@ -10537,9 +10898,6 @@ msgstr ""
#~ msgid "just pressed"
#~ msgstr "проÑто нажата"
-#~ msgid "just released"
-#~ msgstr "проÑто отпущена"
-
#~ msgid ""
#~ "Couldn't read the certificate file. Are the path and password both "
#~ "correct?"
@@ -10845,21 +11203,6 @@ msgstr ""
#~ msgid "Trailing Silence:"
#~ msgstr "Удаление тишины:"
-#~ msgid "Script Export Mode:"
-#~ msgstr "Режим ÑкÑÐ¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñкриптов:"
-
-#~ msgid "Text"
-#~ msgstr "ТекÑтовый"
-
-#~ msgid "Compiled"
-#~ msgstr "Компилированный"
-
-#~ msgid "Encrypted (Provide Key Below)"
-#~ msgstr "Зашифрованный (Ðапишите ключ ниже)"
-
-#~ msgid "Script Encryption Key (256-bits as hex):"
-#~ msgstr "Ключ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñкрипта (256-бит, а в шеÑтнадцатеричном виде):"
-
#~ msgid "Export Project PCK"
#~ msgstr "ЭкÑпортировать PCK проекта"
@@ -10869,9 +11212,6 @@ msgstr ""
#~ msgid "Project Export"
#~ msgstr "ЭкÑпортирование проекта"
-#~ msgid "Export Preset:"
-#~ msgstr "ЭкÑпортировать наÑтройки:"
-
#~ msgid "BakedLightInstance does not contain a BakedLight resource."
#~ msgstr "BakedLightInstance не Ñодержит BakedLight реÑурÑ."
@@ -10956,13 +11296,6 @@ msgstr ""
#~ msgid "Scale Region Editor"
#~ msgstr "Редактор маÑштабируемой облаÑти текÑтуры"
-#~ msgid ""
-#~ "No texture in this node.\n"
-#~ "Set a texture to be able to edit region."
-#~ msgstr ""
-#~ "Ð’ Ñтом узле нет текÑтуры.\n"
-#~ "Выберите текÑтуру, чтобы редактировать облаÑть."
-
#~ msgid "Inherit Scene"
#~ msgstr "УнаÑледовать Ñцену"
diff --git a/editor/translations/si.po b/editor/translations/si.po
new file mode 100644
index 0000000000..64533d0af4
--- /dev/null
+++ b/editor/translations/si.po
@@ -0,0 +1,9253 @@
+# Sinhala translation of the Godot Engine editor
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
+# This file is distributed under the same license as the Godot source code.
+# Yohan Sandun <Yohan99ysk@gmail.com>, 2018.
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:42+0100\n"
+"Last-Translator: Yohan Sandun <Yohan99ysk@gmail.com>\n"
+"Language-Team: Sinhala <https://hosted.weblate.org/projects/godot-engine/"
+"godot/si/>\n"
+"Language: si\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Poedit 2.2\n"
+
+#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr ""
+
+#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
+#: modules/mono/glue/gd_glue.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr "විකේතන à¶¶à·’à¶§à·” සදහ෠ප්â€à¶»à¶¸à·à¶«à·€à¶­à·Š à¶¶à·’à¶§à·” නොමà·à¶­, à·„à· à·€à·à¶»à¶¯à·’ ආකෘතියක්."
+
+#: core/math/expression.cpp
+msgid "Invalid input %i (not passed) in expression"
+msgstr "à·€à·à¶»à¶¯à·’ ආදà·à¶±à¶ºà¶šà·Š %i (යà·à·€à·’ය නොහà·à¶­)"
+
+#: core/math/expression.cpp
+msgid "self can't be used because instance is null (not passed)"
+msgstr "නිදර්à·à¶šà¶º à·à·”න්â€à¶º නිස෠self à¶·à·à·€à·’à¶­à· à¶šà·… නොහà·à¶š (යà·à·€à·’ය නොහà·à¶š)"
+
+#: core/math/expression.cpp
+msgid "Invalid operands to operator %s, %s and %s."
+msgstr "%s, %s සහ %s සදහ෠වà·à¶»à¶¯à·’ මෙහෙයුම් à¶šà·à¶»à¶š."
+
+#: core/math/expression.cpp
+msgid "Invalid index of type %s for base type %s"
+msgstr "%s වර්ගය %s මූල වර්ගය සදහ෠වà·à¶»à¶¯à·’ සුචියක්"
+
+#: core/math/expression.cpp
+msgid "Invalid named index '%s' for base type %s"
+msgstr "'%s' මූල වර්ග %s සදහ෠වà·à¶»à¶¯à·’ à¶±à·à¶¸à·’à¶š සුචියක්"
+
+#: core/math/expression.cpp
+msgid "Invalid arguments to construct '%s'"
+msgstr "'%s' ගොඩනà·à¶œà·“මට à·€à·à¶»à¶¯à·’ තර්ක"
+
+#: core/math/expression.cpp
+msgid "On call to '%s':"
+msgstr "'%s' ඇමතීම:"
+
+#: editor/animation_bezier_editor.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Free"
+msgstr "නිදහස්"
+
+#: editor/animation_bezier_editor.cpp
+msgid "Balanced"
+msgstr "සමතුලිතයි"
+
+#: editor/animation_bezier_editor.cpp
+msgid "Mirror"
+msgstr "à¶šà·à¶©à¶´à¶­"
+
+#: editor/animation_bezier_editor.cpp
+msgid "Insert Key Here"
+msgstr "මෙහි යතුර ඇතුලත් කරන්න"
+
+#: editor/animation_bezier_editor.cpp
+msgid "Duplicate Selected Key(s)"
+msgstr "à¶­à·à¶»à·à¶œà¶­à·Š යතුරු à¶´à·’à¶§à¶´à¶­à·Š කරන්න"
+
+#: editor/animation_bezier_editor.cpp
+msgid "Delete Selected Key(s)"
+msgstr "à¶­à·à¶»à·à¶œà¶­à·Š යතුරු මක෠දමන්න"
+
+#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr "Anim යතුරු පිටපත් කරන්න"
+
+#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
+msgid "Anim Delete Keys"
+msgstr "Anim යතුරු මක෠දමන්න"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Keyframe Time"
+msgstr "Anim කීෆ්â€à¶»à·šà¶¸à·Š à¶šà·à¶½à¶º වෙනස් කරන්න"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Transition"
+msgstr "Anim සංක්රමණය වෙනස් කරන්න"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Transform"
+msgstr "Anim පරිවර්තනය වෙනස් කරන්න"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Keyframe Value"
+msgstr "Anim කීෆ්â€à¶»à·šà¶¸à·Š අගය වෙනස් කරන්න"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Call"
+msgstr "Anim à¶šà·à¶¯à·€à·“ම් වෙනස් කරන්න"
+
+#: editor/animation_track_editor.cpp
+msgid "Property Track"
+msgstr "ලක්ෂණය ලුහුබදින්න"
+
+#: editor/animation_track_editor.cpp
+msgid "3D Transform Track"
+msgstr "3D රූපà·à¶±à·Šà¶­à¶»à¶«à¶º ලුහුබදින්න"
+
+#: editor/animation_track_editor.cpp
+msgid "Call Method Track"
+msgstr "ඇමතීම් à¶šà·Šâ€à¶»à¶¸à¶º ලුහුබදින්න"
+
+#: editor/animation_track_editor.cpp
+msgid "Bezier Curve Track"
+msgstr "Bezier වක්â€à¶» ලුහුබදින්න"
+
+#: editor/animation_track_editor.cpp
+msgid "Audio Playback Track"
+msgstr "à·à¶¶à·Šà¶° à¶°à·à·€à¶±à¶º ලුහුබදින්න"
+
+#: editor/animation_track_editor.cpp
+msgid "Animation Playback Track"
+msgstr "සජීවීකරණ à¶°à·à·€à¶±à¶º ලුහුබදින්න"
+
+#: editor/animation_track_editor.cpp
+msgid "Add Track"
+msgstr "ලුහුබදින්නෙක් එක් කරන්න"
+
+#: editor/animation_track_editor.cpp
+msgid "Animation Length Time (seconds)"
+msgstr "සජීවීකරණ à¶šà·à¶½à¶º (à¶­à¶´à·Šà¶´à¶»)"
+
+#: editor/animation_track_editor.cpp
+msgid "Animation Looping"
+msgstr "සජීවීකරණ පුනරà·à·€à¶»à·Šà¶®à¶±à¶º"
+
+#: editor/animation_track_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr "à·à·Šâ€à¶»à·’à¶­:"
+
+#: editor/animation_track_editor.cpp
+msgid "Audio Clips:"
+msgstr "à·à·Šâ€à¶»à·€à·Šâ€à¶º පසුරු:"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Clips:"
+msgstr "Anim පසුරු:"
+
+#: editor/animation_track_editor.cpp
+msgid "Toggle this track on/off."
+msgstr "ලුහුබදින්න෠සක්â€à¶»à·’ය/à¶…à¶šà·Šâ€à¶»à·’ය."
+
+#: editor/animation_track_editor.cpp
+msgid "Update Mode (How this property is set)"
+msgstr "මà·à¶¯à·’ලිය යà·à·€à¶­à·Š කරන්න (මෙම ගුණà·à¶‚ගය සකස෠ඇත්තේ කෙසේද)"
+
+#: editor/animation_track_editor.cpp
+msgid "Interpolation Mode"
+msgstr "නිවේà·à¶± මà·à¶¯à·’ලිය"
+
+#: editor/animation_track_editor.cpp
+msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
+msgstr "පුනර්කරණ මà·à¶¯à·’ලිය (පුනර්කරණය ආරම්භයේ දී නිවේà·à¶šà¶º අවසන් වේ)"
+
+#: editor/animation_track_editor.cpp
+msgid "Remove this track."
+msgstr "මෙම ලුහුබදින්න෠ඉවත් කරන්න."
+
+#: editor/animation_track_editor.cpp
+msgid "Time (s): "
+msgstr "à¶šà·à¶½à¶º (à¶­à¶­à·Š): "
+
+#: editor/animation_track_editor.cpp
+msgid "Continuous"
+msgstr "අඛණ්ඩව"
+
+#: editor/animation_track_editor.cpp
+msgid "Discrete"
+msgstr "විවික්ත"
+
+#: editor/animation_track_editor.cpp
+msgid "Trigger"
+msgstr "à¶šà·Šâ€à¶»à·’යà·à¶»à¶¸à·Šà¶·à¶šà¶º"
+
+#: editor/animation_track_editor.cpp
+msgid "Capture"
+msgstr "ග්â€à¶»à·„ණය"
+
+#: editor/animation_track_editor.cpp
+msgid "Nearest"
+msgstr "ආසන්නම"
+
+#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
+#: editor/property_editor.cpp
+msgid "Linear"
+msgstr "රේඛීය"
+
+#: editor/animation_track_editor.cpp
+msgid "Cubic"
+msgstr "à¶à¶±"
+
+#: editor/animation_track_editor.cpp
+msgid "Clamp Loop Interp"
+msgstr "පුනර්කරණය රදවන්න"
+
+#: editor/animation_track_editor.cpp
+msgid "Wrap Loop Interp"
+msgstr "වෙලුම් පුනර්කරණය"
+
+#: editor/animation_track_editor.cpp
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr "යතුර ඇතුලත් කරන්න"
+
+#: editor/animation_track_editor.cpp
+msgid "Duplicate Key(s)"
+msgstr "යතුරු පිටපත් කරන්න"
+
+#: editor/animation_track_editor.cpp
+msgid "Delete Key(s)"
+msgstr "යතුරු මක෠දමන්න"
+
+#: editor/animation_track_editor.cpp
+msgid "Remove Anim Track"
+msgstr "Anim ලුහුබදින්න෠ඉවත් කරන්න"
+
+#: editor/animation_track_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr "%s සදහ෠නව ලුහුබදින්නෙත් à·ƒà·à¶¯à· යතුරක් ඇතුලත් කරන්න?"
+
+#: editor/animation_track_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr "%d සදහ෠ලුහුබදින්නන් à·ƒà·à¶¯à· යතුරු ඇතුලත් කරන්න?"
+
+#: editor/animation_track_editor.cpp editor/create_dialog.cpp
+#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
+#: editor/plugin_config_dialog.cpp
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
+msgid "Create"
+msgstr "à·ƒà·à¶¯à¶±à·Šà¶±"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert"
+msgstr "Anim ඇතුලත් කරන්න"
+
+#: editor/animation_track_editor.cpp
+msgid "AnimationPlayer can't animate itself, only other players."
+msgstr "සජීවීකරණ à¶°à·à·€à¶šà¶º තමà·à¶§à¶¸ සජීවීකරණය à¶šà¶½ නොහà·à¶š, අනෙක් à¶°à·à·€à¶š පමණි."
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Create & Insert"
+msgstr "Anim à·ƒà·à¶¯à¶±à·Šà¶± සහ ඇතුලත් කරන්න"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr "Anim ලුහුබදින්නෙක් හ෠යතුරක් ඇතුලත් කරන්න"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert Key"
+msgstr "Anim යතුරක් ඇතුලත් කරන්න"
+
+#: editor/animation_track_editor.cpp
+msgid "Transform tracks only apply to Spatial-based nodes."
+msgstr "Spatial à¶´à·à¶¯à¶š පුරුක් සදහ෠පමණක් රූපà·à¶±à·Šà¶­à¶» ලුහුබදින්නන් à¶‘à¶šà·Š à¶šà·… à·„à·à¶š."
+
+#: editor/animation_track_editor.cpp
+msgid ""
+"Audio tracks can only point to nodes of type:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
+msgstr ""
+"à¶´à·„à¶­ පුරුක් වර්ග සදහ෠පමණක් à·à·Šâ€à¶»à·€à·Šâ€à¶º ලුහුබදින්නන් à¶‘à¶šà·Š à¶šà·… à·„à·à¶š:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
+
+#: editor/animation_track_editor.cpp
+msgid "Animation tracks can only point to AnimationPlayer nodes."
+msgstr "AnimationPlayer පුරුක් සදහ෠පමණක් සජීවීකරණ ලුහුබදින්නන් à¶‘à¶šà·Š à¶šà·… à·„à·à¶š."
+
+#: editor/animation_track_editor.cpp
+msgid "An animation player can't animate itself, only other players."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Not possible to add a new track without a root"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Track path is invalid, so can't add a key."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Track is not of type Spatial, can't insert key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Track path is invalid, so can't add a method key."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Method not found in object: "
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Move Keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clipboard is empty"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Scale Keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid ""
+"This option does not work for Bezier editing, as it's only a single track."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Only show tracks from nodes selected in tree."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Group tracks by node or display them as plain list."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Snap (s): "
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation step value."
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/editor_properties.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+#: editor/project_manager.cpp editor/project_settings_editor.cpp
+#: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp
+msgid "Edit"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation properties."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Copy Tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Paste Tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Scale Selection"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Scale From Cursor"
+msgstr ""
+
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Duplicate Transposed"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Delete Selection"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Go to Next Step"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Go to Previous Step"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Optimize Animation"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up Animation"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Pick the node that will be animated:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Use Bezier Curves"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim. Optimizer"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Max. Linear Error:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Max. Angular Error:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Optimize"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove invalid keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-up all animations"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Scale Ratio:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Select tracks to copy:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/editor_properties.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Copy"
+msgstr ""
+
+#: editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr ""
+
+#: editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr ""
+
+#: editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Go to Line"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Line Number:"
+msgstr ""
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "No Matches"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Replaced %d occurrence(s)."
+msgstr ""
+
+#: editor/code_editor.cpp editor/find_in_files.cpp
+msgid "Match Case"
+msgstr ""
+
+#: editor/code_editor.cpp editor/find_in_files.cpp
+msgid "Whole Words"
+msgstr ""
+
+#: editor/code_editor.cpp editor/rename_dialog.cpp
+msgid "Replace"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Replace All"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Selection Only"
+msgstr ""
+
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom In"
+msgstr ""
+
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Out"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Warnings:"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Font Size:"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Line:"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Col:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
+#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
+msgid "Add"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/dependency_editor.cpp
+#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_settings_editor.cpp
+msgid "Remove"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/dependency_editor.cpp
+#: editor/export_template_manager.cpp editor/groups_editor.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp
+#: editor/project_settings_editor.cpp editor/property_editor.cpp
+#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Close"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect '%s' from '%s'"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect all from signal: '%s'"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect..."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Disconnect"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect Signal: "
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Edit Connection: "
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
+msgid "Signals"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Are you sure you want to remove all connections from this signal?"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect All"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Edit..."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Go To Method"
+msgstr ""
+
+#: editor/create_dialog.cpp
+msgid "Change %s Type"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/project_settings_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr ""
+
+#: editor/create_dialog.cpp
+msgid "Create New %s"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Search:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Matches:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Description:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+
+#: editor/dependency_editor.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Dependencies"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Resource"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
+msgid "Path"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+#: scene/gui/file_dialog.cpp
+msgid "Open"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+msgid "Cannot remove:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Load failed due to missing dependencies:"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_node.cpp
+msgid "Open Anyway"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Owns"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp
+#: editor/editor_file_dialog.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/item_list_editor_plugin.cpp
+#: editor/project_export.cpp editor/project_settings_editor.cpp
+#: editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr ""
+
+#: editor/dictionary_property_edit.cpp
+msgid "Change Dictionary Key"
+msgstr ""
+
+#: editor/dictionary_property_edit.cpp
+msgid "Change Dictionary Value"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Godot Engine contributors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Project Founders"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Lead Developer"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Project Manager "
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Developers"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Authors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Platinum Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Gold Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Mini Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Gold Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Silver Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Bronze Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "License"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Thirdparty License"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid ""
+"Godot Engine relies on a number of thirdparty free and open source "
+"libraries, all compatible with the terms of its MIT license. The following "
+"is an exhaustive list of all such thirdparty components with their "
+"respective copyright statements and license terms."
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "All Components"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Components"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Licenses"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp editor/project_manager.cpp
+msgid "Error opening package file, not in zip format."
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+msgid "Uncompressing Assets"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp editor/project_manager.cpp
+msgid "Package installed successfully!"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Success!"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Install"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+msgid "Package Installer"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Speakers"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Rename Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Change Audio Bus Volume"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Solo"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Mute"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Bypass Effects"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Select Audio Bus Send"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Audio Bus Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Move Bus Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Bus Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Audio Bus, Drag and Drop to rearrange."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Solo"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Mute"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Bypass"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Bus options"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Reset Volume"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Audio"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Master bus can't be deleted!"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Duplicate Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Reset Bus Volume"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Move Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Save Audio Bus Layout As..."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Location for New Layout..."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Open Audio Bus Layout"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "There is no 'res://default_bus_layout.tres' file."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Invalid file, not an audio bus layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Create a new Bus Layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/editor_properties.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
+#: editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Load an existing Bus Layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Save As"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Save this Bus Layout to a file."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/import_dock.cpp
+msgid "Load Default"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Load the default Bus Layout."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
+msgid "Path:"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
+msgid "Name"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "Storing local changes..."
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "Updating scene..."
+msgstr ""
+
+#: editor/editor_data.cpp editor/editor_properties.cpp
+msgid "[empty]"
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "[unsaved]"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp
+msgid "Please select a base directory first"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
+msgid "Create Folder"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp
+#: scene/gui/file_dialog.cpp
+msgid "Name:"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
+msgid "Could not create folder."
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid "Storing File:"
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid "Packing"
+msgstr ""
+
+#: editor/editor_export.cpp platform/javascript/export/export.cpp
+msgid "Template file not found:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select This Folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "Open in File Manager"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+#: editor/project_manager.cpp
+msgid "Show in File Manager"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "New Folder..."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "All Recognized"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "All Files (*)"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/editor_node.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
+msgid "Save"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Save a File"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Go to parent folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Directories & Files:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
+#: editor/plugins/style_box_editor_plugin.cpp
+msgid "Preview:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "File:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr ""
+
+#: editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr ""
+
+#: editor/editor_file_system.cpp
+msgid "(Re)Importing Assets"
+msgstr ""
+
+#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class:"
+msgstr ""
+
+#: editor/editor_help.cpp editor/scene_tree_editor.cpp
+msgid "Inherits:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Properties"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Methods"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Methods:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Theme Properties"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Theme Properties:"
+msgstr ""
+
+#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
+msgid "Signals:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Enumerations"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Enumerations:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "enum "
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Constants"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Constants:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class Description"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Online Tutorials:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid ""
+"There are currently no tutorials for this class, you can [color=$color][url="
+"$url]contribute one[/url][/color] or [color=$color][url=$url2]request one[/"
+"url][/color]."
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Property Descriptions"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Property Descriptions:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid ""
+"There is currently no description for this property. Please help us by "
+"[color=$color][url=$url]contributing one[/url][/color]!"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Method Descriptions"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Method Descriptions:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid ""
+"There is currently no description for this method. Please help us by [color="
+"$color][url=$url]contributing one[/url][/color]!"
+msgstr ""
+
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr ""
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
+msgid "Set"
+msgstr ""
+
+#: editor/editor_inspector.cpp
+msgid "Set Multiple:"
+msgstr ""
+
+#: editor/editor_log.cpp
+msgid "Output:"
+msgstr ""
+
+#: editor/editor_log.cpp editor/editor_profiler.cpp
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/property_editor.cpp editor/scene_tree_dock.cpp
+#: editor/script_editor_debugger.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp
+#: scene/gui/text_edit.cpp
+msgid "Clear"
+msgstr ""
+
+#: editor/editor_log.cpp
+msgid "Clear Output"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Project export failed with error code %d."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Error saving resource!"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save Resource As..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error while saving."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Can't open '%s'. The file could have been moved or deleted."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error while parsing '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unexpected end of file '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Missing '%s' or its dependencies."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error while loading '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Analyzing"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a tree root."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
+"be satisfied."
+msgstr ""
+
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource belongs to a scene that was imported, so it's not editable.\n"
+"Please read the documentation relevant to importing scenes to better "
+"understand this workflow."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource belongs to a scene that was instanced or inherited.\n"
+"Changes to it will not be kept when saving the current scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource was imported, so it's not editable. Change its settings in the "
+"import panel and then re-import."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This scene was imported, so changes to it will not be kept.\n"
+"Instancing it or inheriting will allow making changes to it.\n"
+"Please read the documentation relevant to importing scenes to better "
+"understand this workflow."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This is a remote object so changes to it will not be kept.\n"
+"Please read the documentation relevant to debugging to better understand "
+"this workflow."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Open Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Open Script..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save & Close"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save changes to '%s' before closing?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save Scene As..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "No"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Yes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a root node."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a selected node."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Revert"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Run Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quit"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Project Manager?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save & Quit"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save changes to the following scene(s) before quitting?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save changes the following scene(s) before opening Project Manager?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This option is deprecated. Situations where refresh must be forced are now "
+"considered a bug. Please report."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to find script field for addon plugin at: 'res://addons/%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to load addon script from path: '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to load addon script from path: '%s' Script is not in tool mode."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Scene '%s' was automatically imported, so it can't be modified.\n"
+"To make changes to it, a new inherited scene can be created."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Clear Recent Scenes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save Layout"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr ""
+
+#: editor/editor_node.cpp editor/import_dock.cpp
+#: editor/script_create_dialog.cpp
+msgid "Default"
+msgstr ""
+
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play This Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Close Tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "%d more files or folders"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "%d more folders"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "%d more files"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Dock Position"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Toggle distraction-free mode."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Add a new scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Next tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Previous tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Filter Files..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "New Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "New Inherited Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save All Scenes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Convert To..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "MeshLibrary..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "TileSet..."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Undo"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Redo"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Project"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Project Settings"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_export.cpp
+msgid "Export"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Project Data Folder"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
+msgid "Debug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Editor"
+msgstr ""
+
+#: editor/editor_node.cpp editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Editor Data/Settings Folder"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Editor Data Folder"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Editor Settings Folder"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Help"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+msgid "Search"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Online Docs"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Q&A"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Issue Tracker"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "About"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play the project."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr ""
+
+#: editor/editor_node.cpp editor/editor_profiler.cpp
+msgid "Stop"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Changing the video driver requires restarting the editor."
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_settings_editor.cpp
+#: editor/settings_config_dialog.cpp
+msgid "Save & Restart"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Update Always"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Update Changes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
+#: editor/project_manager.cpp
+msgid "Import"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Expand Bottom Panel"
+msgstr ""
+
+#: editor/editor_node.cpp scene/resources/visual_shader.cpp
+msgid "Output"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Don't Save"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_export.cpp
+msgid "Export Project"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export Library"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Password:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "New Inherited"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Load Errors"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open 2D Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open 3D Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Script Editor"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "Open Asset Library"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open the next Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open the previous Editor"
+msgstr ""
+
+#: editor/editor_plugin.cpp
+msgid "Creating Mesh Previews"
+msgstr ""
+
+#: editor/editor_plugin.cpp
+msgid "Thumbnail..."
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Edit Plugin"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+msgid "Update"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Version:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+msgid "Author:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Edit:"
+msgstr ""
+
+#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
+#: editor/rename_dialog.cpp
+msgid "Start"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Physics Frame %"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Time:"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Time"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Calls"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "On"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Layer"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Bit %d, value %d"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "[Empty]"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Invalid RID"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Pick a Viewport"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "New Script"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "New %s"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Make Unique"
+msgstr ""
+
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Paste"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Convert To %s"
+msgstr ""
+
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Open Editor"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Selected node is not a Viewport!"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Size: "
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Page: "
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "New Key:"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "New Value:"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Add Key/Value Pair"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: editor/editor_run_native.cpp
+msgid "Select device from the list"
+msgstr ""
+
+#: editor/editor_run_native.cpp
+msgid ""
+"No runnable export preset found for this platform.\n"
+"Please add a runnable preset in the export menu."
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Re-Download"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Uninstall"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "(Installed)"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "(Missing)"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "(Current)"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Retrieving mirrors, please wait..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Remove template version '%s'?"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Can't open export templates zip."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Invalid version.txt format inside templates: %s."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "No version.txt found inside templates."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Error creating path for templates:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Extracting Export Templates"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Importing:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid ""
+"No download links found for this version. Direct download is only available "
+"for official releases."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't connect."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "No response."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request Failed."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect Loop."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Failed:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Download Complete."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid ""
+"Templates installation failed. The problematic templates archives can be "
+"found at '%s'."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Error requesting url: "
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Connecting to Mirror..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Disconnected"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Resolving"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Can't Resolve"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Connecting..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Can't Connect"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Connected"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Requesting..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Downloading"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Connection Error"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "SSL Handshake Error"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Current Version:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Installed Versions:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Install From File"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Remove Template"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Select template file"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Export Template Manager"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Download Templates"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Select mirror from list: (Shift+Click: Open in Browser)"
+msgstr ""
+
+#: editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "View items as a grid of thumbnails."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "View items as a list."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Status: Import of file failed. Please fix file and reimport manually."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Cannot move/rename resources root."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Cannot move a folder into itself."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Error moving:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Error duplicating:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Unable to update dependencies:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Provided name contains invalid characters"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "A file or folder with this name already exists."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Renaming file:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Renaming folder:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicating file:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicating folder:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Open Scene(s)"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Add to favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Remove from favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Edit Dependencies..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "View Owners..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicate..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+msgid "New Script..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "New Resource..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/project_manager.cpp editor/rename_dialog.cpp
+#: editor/scene_tree_dock.cpp
+msgid "Rename"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Toggle split mode"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Search files"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid ""
+"Scanning Files,\n"
+"Please Wait..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "There is already file or folder with the same name in this location."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Overwrite"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Find in Files"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Find:"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Folder:"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Filters:"
+msgstr ""
+
+#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+msgid "Find..."
+msgstr ""
+
+#: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp
+msgid "Replace..."
+msgstr ""
+
+#: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp
+msgid "Cancel"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Find: "
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Replace: "
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Replace all (no undo)"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Searching..."
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Search complete"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Group name already exists."
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Invalid group name."
+msgstr ""
+
+#: editor/groups_editor.cpp editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Nodes not in Group"
+msgstr ""
+
+#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
+msgid "Filter nodes"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Nodes in Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Manage Groups"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Single Scene"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Materials"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Materials"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Materials+Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Materials+Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Multiple Scenes"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Multiple Scenes+Materials"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Import Scene"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Importing Scene..."
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Generating Lightmaps"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Generating for Mesh: "
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Running Custom Script..."
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Saving..."
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Set as Default for '%s'"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Clear Default for '%s'"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid " Files"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Import As:"
+msgstr ""
+
+#: editor/import_dock.cpp editor/property_editor.cpp
+msgid "Preset..."
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Reimport"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Failed to load resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Expand All Properties"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Collapse All Properties"
+msgstr ""
+
+#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save As..."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Copy Params"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Edit Resource Clipboard"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Copy Resource"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Make Built-In"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Open in Help"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Object properties."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Filter properties"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Changes may be lost!"
+msgstr ""
+
+#: editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Edit a Plugin"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Create a Plugin"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Plugin Name:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Subfolder:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Language:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Script Name:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Activate now?"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Edit Polygon"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Insert Point"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Edit Polygon (Remove Point)"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Remove Polygon And Point"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid ""
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Load..."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "This type of node can't be used. Only root nodes are allowed."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid ""
+"AnimationTree is inactive.\n"
+"Activate to enable playback, check node warnings if activation fails."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Set the blending position within the space"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Select and move points, create points with RMB."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Open Animation Node"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Triangle already exists"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "BlendSpace2D does not belong to an AnimationTree node."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "No triangles exist, so no blending can take place."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create triangles by connecting points."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Erase points and triangles."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Generate blend triangles automatically (instead of manually)"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Edit Filters"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Output node can't be added to the blend tree."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Unable to connect, port may be in use or connection may be invalid."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "No animation player set, so unable to retrieve track names."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Player path set is invalid, so unable to retrieve track names."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid ""
+"Animation player has no valid root node path, so unable to retrieve track "
+"names."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add Node..."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "Edit Filtered Tracks:"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Enable filtering"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Delete Animation?"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Invalid animation name!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation name already exists!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation to copy!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation resource on clipboard!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation to edit!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Transitions..."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Open in Inspector"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Onion Skinning"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Enable Onion Skinning"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Directions"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Past"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Future"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Depth"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "1 step"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "2 steps"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "3 steps"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Differences Only"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Force White Modulate"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Include Gizmos (3D)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pin AnimationPlayer"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "End"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Immediate"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Sync"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "At End"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Travel"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Start and end nodes are needed for a sub-transition."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "No playback resource set at path: %s."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid ""
+"Select and move nodes.\n"
+"RMB to add new nodes.\n"
+"Shift+LMB to create connections."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Create new nodes."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Connect nodes."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Remove selected node or transition."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Toggle autoplay this animation on start, restart or seek to zero."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Set the end animation. This is useful for sub-transitions."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Transition: "
+msgstr ""
+
+#: editor/plugins/animation_tree_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "AnimationTree"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Import Animations..."
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Filters..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Contents:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "View Files"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Connection error, please try again."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't connect to host:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "No response from host:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, return code:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, too many redirects"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Bad download hash, assuming file has been tampered with."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Expected:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Got:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Failed sha256 hash check"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Asset Download Error:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Downloading (%s / %s)..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Downloading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Resolving..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Error making request"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Idle"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Retry"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download Error"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download for this asset is already in progress!"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "First"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Previous"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Next"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Last"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "All"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+msgid "Sort:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/project_settings_editor.cpp
+msgid "Category:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Support..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid ""
+"Can't determine a save path for lightmap images.\n"
+"Save your scene (for images to be saved in the same dir), or pick a save "
+"path from the BakedLightmap properties."
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid ""
+"No meshes to bake. Make sure they contain an UV2 channel and that the 'Bake "
+"Light' flag is on."
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid "Failed creating lightmap images, make sure path is writable."
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid "Bake Lightmaps"
+msgstr ""
+
+#: editor/plugins/camera_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+msgid "Preview"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move vertical guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create new vertical guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Remove vertical guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move horizontal guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create new horizontal guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Remove horizontal guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create new horizontal and vertical guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move pivot"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move anchor"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Resize CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchors only"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors and Margins"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Toggle snapping."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snapping Options"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to grid"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Smart snapping"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to parent"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to node anchor"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to node sides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to node center"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to other nodes"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Custom Bone(s) from Node(s)"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Custom Bones"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Helpers"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Rulers"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Origin"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Viewport"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Layout"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert keys."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Multiply grid step by 2"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Divide grid step by 2"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Cannot instantiate multiple nodes without root."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change default type"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Polygon3D"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+msgid "CPUParticles"
+msgstr ""
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emission Points From Mesh"
+msgstr ""
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emission Points From Node"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Flat0"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Flat1"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Ease in"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Ease out"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Smoothstep"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Modify Curve Point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Modify Curve Tangent"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Load Curve Preset"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Add point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Remove point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Left linear"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Right linear"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Load preset"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Remove Curve Point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Toggle Curve Linear Tangent"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Hold Shift to edit tangents individually"
+msgstr ""
+
+#: editor/plugins/gi_probe_editor_plugin.cpp
+msgid "Bake GI Probe"
+msgstr ""
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Contained Mesh is not of type ArrayMesh."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "UV Unwrap failed, mesh may not be manifold?"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "No mesh to debug."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Model has no UV in this layer"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh..."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "View UV1"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "View UV2"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Unwrap UV2 for Lightmap/AO"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generating Visibility Rect"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Can only set point into a ParticlesMaterial process material"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image..."
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generate Visibility Rect"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Particles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generation Time (sec):"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Emission Mask"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Capture from Pixel"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Emission Colors"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Points:"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Surface Points"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Surface Points+Normal (Directed)"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Source: "
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "A processor material of type 'ParticlesMaterial' is required."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generating AABB"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generate Visibility AABB"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Out-Control from Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove In-Control from Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp editor/plugins/theme_editor_plugin.cpp
+#: editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Mirror Handle Angles"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Mirror Handle Lengths"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Position"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Position"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Position"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove Out-Control Point"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove In-Control Point"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/physical_bone_plugin.cpp
+msgid "Move joint"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Sync Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon & UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Internal Vertex"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Remove Internal Vertex"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Add Custom Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Remove Custom Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Open Polygon 2D UV editor."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Points"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygons"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Points"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create a custom polygon. Enables custom polygon rendering."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint weights with specified intensity."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Unpaint weights with specified intensity."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Radius:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Settings"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Configure Grid:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset X:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset Y:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step X:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step Y:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Sync Bones to Polygon"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
+#: editor/scene_tree_editor.cpp
+msgid "Type:"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ResourcePreloader"
+msgstr ""
+
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "AnimationTree has no path set to an AnimationPlayer"
+msgstr ""
+
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "Path to AnimationPlayer is invalid"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Files"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close and save changes?"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error writing TextFile:"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error could not load file."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving file!"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error Saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error Importing"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "New TextFile..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open File"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save File As..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid " Class Reference"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Toggle alphabetical sorting of the method list."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Sort"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Move Up"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Move Down"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "File"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Copy Script Path"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "History Previous"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Other Tabs"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Toggle Scripts Panel"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+msgid "Find Next"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Debug with External Editor"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open Godot online documentation"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Discard"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Results"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Line"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "(ignore)"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "à·à·Šâ€à¶»à·’à¶­:"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Only resources from filesystem can be dropped."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Lookup Symbol"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Convert Case"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Uppercase"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Lowercase"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Capitalize"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Syntax Highlighter"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
+#: scene/gui/text_edit.cpp
+msgid "Cut"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
+#: scene/gui/text_edit.cpp
+msgid "Select All"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Delete Line"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Fold/Unfold Line"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Fold All Lines"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Unfold All Lines"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Convert Indent to Spaces"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Convert Indent to Tabs"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Find in Files..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Line..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: editor/plugins/shader_editor_plugin.cpp
+msgid "Shader"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "This skeleton has no bones, create some children Bone2D nodes."
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Skeleton2D"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Make Rest Pose (From Bones)"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Set Bones to Rest Pose"
+msgstr ""
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Create physical bones"
+msgstr ""
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Skeleton"
+msgstr ""
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Create physical skeleton"
+msgstr ""
+
+#: editor/plugins/skeleton_ik_editor_plugin.cpp
+msgid "Play IK"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling: "
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translating: "
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Objects Drawn"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Material Changes"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Shader Changes"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Surface Changes"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Draw Calls"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Vertices"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "FPS"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Lock View Rotation"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Unshaded"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Environment"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Gizmos"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Information"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View FPS"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Half Resolution"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Doppler Enable"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Cinematic Preview"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Left"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Right"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Forward"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Backwards"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Up"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Down"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Speed Modifier"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Select Mode (Q)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Drag: Rotate\n"
+"Alt+Drag: Move\n"
+"Alt+RMB: Depth list selection"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Space Mode (%s)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Mode (%s)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Tool Select"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Tool Move"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Tool Rotate"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Tool Scale"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Toggle Freelook"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap object to floor"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog..."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Settings"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Sprite is empty!"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Can't convert a sprite using animation frames to mesh."
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Invalid geometry, can't replace by mesh."
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Sprite"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Convert to 2D Mesh"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create 2D Mesh"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Simplification: "
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Grow (Pixels): "
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Update Preview"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Settings:"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Move (Before)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Move (After)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "SpriteFrames"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Region Rect"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: scene/resources/visual_shader.cpp
+msgid "None"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Sep.:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "TextureRegion"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove All Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove All"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Edit theme..."
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Theme editing menu."
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create From Current Editor Theme"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Radio Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Radio Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Has,Many,Options"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
+msgid "Style"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase Selection"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Fix Invalid Tiles"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Cut Selection"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Line Draw"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rectangle Paint"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket Fill"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find Tile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint Tile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Copy Selection"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate left"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate right"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Flip horizontally"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Flip vertically"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Clear transform"
+msgstr "Anim පරිවර්තනය වෙනස් කරන්න"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Texture(s) to TileSet."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove selected Texture from TileSet."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Erase bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new polygon."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "You haven't selected a texture to remove."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Texture"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Drag handles to edit Rect.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "à¶­à·à¶»à·à¶œà¶­à·Š යතුරු මක෠දමන්න"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select current edited sub-tile.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete polygon."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to use as icon, this will be also used on invalid autotile "
+"bindings.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its priority.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "à·ƒà·à¶¯à¶±à·Šà¶±"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Tile"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "This property can't be changed."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "TileSet"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vertex"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Fragment"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Light"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "VisualShader"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Runnable"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Delete patch '%s' from list?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Delete preset '%s'?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export templates for this platform are missing/corrupted:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Presets"
+msgstr ""
+
+#: editor/project_export.cpp editor/project_settings_editor.cpp
+msgid "Add..."
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export Path"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export all resources in the project"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export selected scenes (and dependencies)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export selected resources (and dependencies)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Resources to export:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma separated, e.g: *.json, *.txt)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid ""
+"Filters to exclude files from project (comma separated, e.g: *.json, *.txt)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Patches"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Make Patch"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Features"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Custom (comma-separated):"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Feature List:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export templates for this platform are missing:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export With Debug"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "The path does not exist."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Please choose an empty folder."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Please choose a 'project.godot' or '.zip' file."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Directory already contains a Godot project."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Imported Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Invalid Project Name."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Couldn't create folder."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "There is already a folder in this path with the specified name."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "It would be a good idea to name your project."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Couldn't load project.godot in project path (error %d). It may be missing or "
+"corrupted."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Couldn't edit project.godot in project path."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Couldn't create project.godot in project path."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Rename Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Import & Edit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Create & Edit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Install & Edit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Create folder"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Installation Path:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Can't open project at '%s'."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Can't run project: no main scene defined.\n"
+"Please edit the project and set the main scene in \"Project Settings\" under "
+"the \"Application\" category."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Can't run project: Assets need to be imported.\n"
+"Please edit the project to trigger the initial import."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Language changed.\n"
+"The UI will update next time the editor or project manager starts."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project List"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Templates"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Exit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Restart Now"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Can't run project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"You don't currently have any projects.\n"
+"Would you like to explore the official example projects in the Asset Library?"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Key "
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid ""
+"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
+"'\"'"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Action '%s' already exists!"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Change Action deadzone"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "All Devices"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Device"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Press a Key..."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Left Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Right Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Left Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Right Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "X Button 1"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "X Button 2"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joypad Axis Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Axis"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joypad Button Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Erase Input Action"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Left Button."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Right Button."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Middle Button."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Up."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Down."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Global Property"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Select a setting item first!"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "No property '%s' exists."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Setting '%s' is internal, and it can't be deleted."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Delete Item"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid ""
+"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
+"'\"'."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Already existing"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Settings saved OK."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Override for Feature"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Changed Locale Filter"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Changed Locale Filter Mode"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Project Settings (project.godot)"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Override For..."
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Editor must be restarted for changes to take effect"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Input Map"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Action:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Action"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Deadzone"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Device:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Localization"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Translations"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Translations:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remaps"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Resources:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Locale"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Locales Filter"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Show all locales"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Show only selected locales"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Filter mode:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Locales:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "File..."
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Dir..."
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Select Node"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Pick a Node"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: editor/property_selector.cpp
+msgid "Select Property"
+msgstr ""
+
+#: editor/property_selector.cpp
+msgid "Select Virtual Method"
+msgstr ""
+
+#: editor/property_selector.cpp
+msgid "Select Method"
+msgstr ""
+
+#: editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr ""
+
+#: editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+
+#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Batch Rename"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Prefix"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Advanced options"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Substitute"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Node name"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Node's parent name, if available"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Node type"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Current scene name"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Root node name"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid ""
+"Sequential integer counter.\n"
+"Compare counter options."
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Per Level counter"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "If set the counter restarts for each group of child nodes"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Initial value for the counter"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Step"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Amount by which counter is incremented for each node"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Padding"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid ""
+"Minimum number of digits for the counter.\n"
+"Missing digits are padded with leading zeros."
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Regular Expressions"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Post-Process"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Keep"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "CamelCase to under_scored"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "under_scored to CamelCase"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Case"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "To Lowercase"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "To Uppercase"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Reset"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Error"
+msgstr ""
+
+#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Script"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can not perform with the root node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Save New Scene As..."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Create Root Node:"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "2D Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "3D Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "User Interface"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Custom Node"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Sub-Resources"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Extend Script"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Make Scene Root"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Copy Node Path"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Remote"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Local"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Toggle Visible"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Node configuration warning:"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node has connection(s) and group(s).\n"
+"Click to show signals dock."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node has connections.\n"
+"Click to show signals dock."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node is in group(s).\n"
+"Click to show groups dock."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp editor/script_create_dialog.cpp
+msgid "Open Script"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node is locked.\n"
+"Click to unlock it."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Children are not selectable.\n"
+"Click to make selectable."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Toggle Visibility"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"AnimationPlayer is pinned.\n"
+"Click to unpin."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Node Configuration Warning!"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Error loading template '%s'"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Error - Could not create script in filesystem."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Open Script/Choose Location"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Directory of the same name exists"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "File exists, will be reused"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Wrong extension chosen"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid Path"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid inherited parent name or path"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Script valid"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Allowed: a-z, A-Z, 0-9 and _"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Built-in script (into scene file)"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Create new script file"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Load existing script file"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Inherits"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Class Name"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Template"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Built-in Script"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Remote "
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Stack Trace"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Pick one or more items from the list to display the graph."
+msgstr ""
+
+#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp
+msgid "Errors"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Copy Error"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Binding"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change AudioStreamPlayer3D Emission Angle"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier AABB"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Particles AABB"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Cylinder Shape Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Cylinder Shape Height"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Cylinder Radius"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Cylinder Height"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Torus Inner Radius"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Torus Outer Radius"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Select the dynamic library for this entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Select dependencies of the library for this entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Remove current entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Double click to create a new entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Platform:"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Platform"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Dynamic Library"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Add an architecture entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "GDNativeLibrary"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Library"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Status"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Libraries: "
+msgstr ""
+
+#: modules/gdnative/register_types.cpp
+msgid "GDNative"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Step argument is zero!"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not a script with an instance"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not based on a script"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not based on a resource file"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Object can't provide a length."
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Next Plane"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Previous Plane"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Plane:"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Next Floor"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Previous Floor"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Floor:"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Delete Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Fill Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Duplicate Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Grid Map"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Snap View"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Disabled"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Above"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Below"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit X Axis"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit Y Axis"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit Z Axis"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate X"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate Y"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate Z"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate X"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate Y"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate Z"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Clear Rotation"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Create Area"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Create Exterior Connector"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Erase Area"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clear Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Fill Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Settings"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Pick Distance:"
+msgstr ""
+
+#: modules/mono/csharp_script.cpp
+msgid "Class name can't be a reserved keyword"
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Generating solution..."
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Generating C# project..."
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Failed to create solution."
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Failed to save solution."
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Done"
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Failed to create C# project."
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Mono"
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "About C# support"
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Create C# solution"
+msgstr ""
+
+#: modules/mono/editor/mono_bottom_panel.cpp
+msgid "Builds"
+msgstr ""
+
+#: modules/mono/editor/mono_bottom_panel.cpp
+msgid "Build Project"
+msgstr ""
+
+#: modules/mono/editor/mono_bottom_panel.cpp
+msgid "Warnings"
+msgstr ""
+
+#: modules/mono/editor/mono_bottom_panel.cpp
+msgid "View log"
+msgstr ""
+
+#: modules/mono/mono_gd/gd_mono_utils.cpp
+msgid "End of inner exception stack trace"
+msgstr ""
+
+#: modules/recast/navigation_mesh_editor_plugin.cpp
+msgid "Bake NavMesh"
+msgstr ""
+
+#: modules/recast/navigation_mesh_editor_plugin.cpp
+msgid "Clear the navigation mesh."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Setting up Configuration..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Calculating grid size..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating heightfield..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Marking walkable triangles..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Constructing compact heightfield..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Eroding walkable area..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Partitioning..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating contours..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating polymesh..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Converting to native navigation mesh..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Navigation Mesh Generator Setup:"
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Parsing Geometry..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Done!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Signal Arguments"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Argument Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Argument name"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Set Variable Default Value"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Set Variable Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove VisualScript Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Duplicate VisualScript Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Base Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Move Node(s)"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove VisualScript Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Node Data"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Node Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Script already has function '%s'"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Input Value"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Can't copy the function node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Clipboard is empty!"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste VisualScript Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Member"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Search VisualScript"
+msgstr ""
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Get %s"
+msgstr ""
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Set %s"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Run in Browser"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Run exported HTML in the system's default browser."
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not write file:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not open template for export:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Invalid export template:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not read custom HTML shell:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not read boot splash image file:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Using default boot splash image."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+
+#: scene/2d/collision_object_2d.cpp
+msgid ""
+"This node has no shape, so it can't collide or interact with other objects.\n"
+"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
+"define its shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp scene/3d/particles.cpp
+msgid ""
+"A material to process the particles is not assigned, so no behavior is "
+"imprinted."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+
+#: scene/2d/physics_body_2d.cpp
+msgid ""
+"Size changes to RigidBody2D (in character or rigid modes) will be overridden "
+"by the physics engine when running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+
+#: scene/2d/skeleton_2d.cpp
+msgid "This Bone2D chain should end at a Skeleton2D node."
+msgstr ""
+
+#: scene/2d/skeleton_2d.cpp
+msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
+msgstr ""
+
+#: scene/2d/skeleton_2d.cpp
+msgid ""
+"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
+msgstr ""
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRCamera must have an ARVROrigin node as its parent"
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRController must have an ARVROrigin node as its parent"
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid ""
+"The controller id must not be 0 or this controller will not be bound to an "
+"actual controller"
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRAnchor must have an ARVROrigin node as its parent"
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid ""
+"The anchor id must not be 0 or this anchor will not be bound to an actual "
+"anchor"
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVROrigin requires an ARVRCamera child node"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "%d%%"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "(Time Left: %d:%02d s)"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Plotting Meshes: "
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Plotting Lights:"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp
+msgid "Finishing Plot"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Lighting Meshes: "
+msgstr ""
+
+#: scene/3d/collision_object.cpp
+msgid ""
+"This node has no shape, so it can't collide or interact with other objects.\n"
+"Consider adding a CollisionShape or CollisionPolygon as a child to define "
+"its shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr ""
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
+#: scene/3d/gi_probe.cpp
+msgid "Plotting Meshes"
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+
+#: scene/3d/particles.cpp
+msgid ""
+"Nothing is visible because meshes have not been assigned to draw passes."
+msgstr ""
+
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
+#: scene/3d/physics_body.cpp
+msgid ""
+"Size changes to RigidBody (in character or rigid modes) will be overridden "
+"by the physics engine when running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+
+#: scene/3d/remote_transform.cpp
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid "WorldEnvironment needs an Environment resource."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set "
+"this environment's Background Mode to Canvas (for 2D scenes)."
+msgstr ""
+
+#: scene/3d/soft_body.cpp
+msgid "This body will be ignored until you set a mesh"
+msgstr ""
+
+#: scene/3d/soft_body.cpp
+msgid ""
+"Size changes to SoftBody will be overridden by the physics engine when "
+"running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+
+#: scene/3d/vehicle_body.cpp
+msgid ""
+"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use "
+"it as a child of a VehicleBody."
+msgstr ""
+
+#: scene/animation/animation_blend_tree.cpp
+msgid "On BlendTree node '%s', animation not found: '%s'"
+msgstr ""
+
+#: scene/animation/animation_blend_tree.cpp
+msgid "Animation not found: '%s'"
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "In node '%s', invalid animation: '%s'."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Invalid animation: '%s'."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Nothing connected to input '%s' of node '%s'."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "A root AnimationNode for the graph is not set."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Path to an AnimationPlayer node containing animations is not set."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "AnimationPlayer root is not a valid node."
+msgstr ""
+
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
+#: scene/gui/color_picker.cpp
+msgid "Raw Mode"
+msgstr ""
+
+#: scene/gui/color_picker.cpp
+msgid "Add current color as a preset"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr ""
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
+#: scene/gui/scroll_container.cpp
+msgid ""
+"ScrollContainer is intended to work with a single child control.\n"
+"Use a container as child (VBox,HBox,etc), or a Control and set the custom "
+"minimum size manually."
+msgstr ""
+
+#: scene/gui/tree.cpp
+msgid "(Other)"
+msgstr ""
+
+#: scene/main/scene_tree.cpp
+msgid ""
+"Default Environment as specified in Project Settings (Rendering -> "
+"Environment -> Default Environment) could not be loaded."
+msgstr ""
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+msgid "Error initializing FreeType."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+msgid "Unknown font format."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+msgid "Error loading font."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+msgid "Invalid font size."
+msgstr ""
+
+#: scene/resources/visual_shader.cpp
+msgid "Input"
+msgstr ""
+
+#: scene/resources/visual_shader_nodes.cpp
+msgid "Invalid source for shader."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Assignment to function."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Assignment to uniform."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Varyings can only be assigned in vertex function."
+msgstr ""
diff --git a/editor/translations/sk.po b/editor/translations/sk.po
index fd3f69f1d2..815802416a 100644
--- a/editor/translations/sk.po
+++ b/editor/translations/sk.po
@@ -1,21 +1,23 @@
# Slovak translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# J08nY <johnenter@gmail.com>, 2016.
# MineGame 159 <minegame459@gmail.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-06-18 08:43+0000\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:42+0100\n"
"Last-Translator: MineGame 159 <minegame459@gmail.com>\n"
"Language-Team: Slovak <https://hosted.weblate.org/projects/godot-engine/"
"godot/sk/>\n"
"Language: sk\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-"X-Generator: Weblate 3.0.1\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -23,7 +25,7 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr "Chybný argument convert(), použite TYPE_* konštanty."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr "Nedostatok bajtov na dekódovanie, možný chybný formát."
@@ -254,7 +256,6 @@ msgstr ""
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -383,8 +384,7 @@ msgstr "Zmeniť veľkosť výberu"
msgid "Scale From Cursor"
msgstr "Zmeniť veľkosť od kurzora"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Duplikovať výber"
@@ -398,11 +398,13 @@ msgid "Delete Selection"
msgstr "Všetky vybrané"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+#, fuzzy
+msgid "Go to Next Step"
msgstr "PrejsÅ¥ na Äalší krok"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+#, fuzzy
+msgid "Go to Previous Step"
msgstr "Prejsť na predchádzajúci krok"
#: editor/animation_track_editor.cpp
@@ -505,11 +507,11 @@ msgstr ""
msgid "Replaced %d occurrence(s)."
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr ""
@@ -525,15 +527,19 @@ msgstr ""
msgid "Selection Only"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr ""
@@ -542,10 +548,10 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Zoom:"
+msgid "Font Size:"
msgstr ""
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr ""
@@ -576,6 +582,7 @@ msgstr ""
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -655,7 +662,7 @@ msgid "Edit Connection: "
msgstr "Upraviť výber krivky"
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -702,23 +709,20 @@ msgid "Recent:"
msgstr ""
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr ""
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr ""
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "Popis:"
@@ -753,8 +757,7 @@ msgid "Resource"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr ""
@@ -775,9 +778,10 @@ msgid "Search Replacement Resource:"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -807,7 +811,7 @@ msgid "Error loading:"
msgstr ""
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+msgid "Load failed due to missing dependencies:"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -866,14 +870,6 @@ msgstr ""
msgid "Thanks from the Godot community!"
msgstr ""
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr ""
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr ""
@@ -965,7 +961,7 @@ msgid "Uncompressing Assets"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+msgid "Package installed successfully!"
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1049,8 +1045,7 @@ msgid "Bus options"
msgstr ""
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr ""
@@ -1210,7 +1205,7 @@ msgid "Add AutoLoad"
msgstr ""
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "Cesta:"
@@ -1218,8 +1213,8 @@ msgstr "Cesta:"
msgid "Node Name:"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr ""
@@ -1289,12 +1284,17 @@ msgid "Template file not found:"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+#, fuzzy
+msgid "Select Current Folder"
+msgstr "Vytvoriť adresár"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
#, fuzzy
-msgid "Select Current Folder"
+msgid "Select This Folder"
msgstr "Vytvoriť adresár"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1303,13 +1303,14 @@ msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr "Otvoriť súbor"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
-msgstr ""
+#, fuzzy
+msgid "Show in File Manager"
+msgstr "Otvoriť súbor"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
@@ -1345,7 +1346,8 @@ msgid "Open a File or Directory"
msgstr "OtvoriÅ¥ súbor / prieÄinok"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Uložiť"
@@ -1403,8 +1405,7 @@ msgstr "PrieÄinky a Súbory:"
msgid "Preview:"
msgstr ""
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "Súbor:"
@@ -1420,24 +1421,11 @@ msgstr ""
msgid "(Re)Importing Assets"
msgstr ""
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "Zoznam tried:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr ""
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr ""
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "Trieda:"
@@ -1454,28 +1442,30 @@ msgid "Brief Description:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Members"
+msgid "Properties"
msgstr ""
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
+#: editor/editor_help.cpp
+msgid "Properties:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
+msgid "Methods"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods:"
+msgid "Methods:"
msgstr ""
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr ""
+#, fuzzy
+msgid "Theme Properties"
+msgstr "Filter:"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr ""
+#, fuzzy
+msgid "Theme Properties:"
+msgstr "Filter:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1506,7 +1496,12 @@ msgstr "Konštanty:"
#: editor/editor_help.cpp
#, fuzzy
-msgid "Description"
+msgid "Class Description"
+msgstr "Popis:"
+
+#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
msgstr "Popis:"
#: editor/editor_help.cpp
@@ -1521,12 +1516,13 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr ""
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "Popis:"
#: editor/editor_help.cpp
#, fuzzy
-msgid "Property Description:"
+msgid "Property Descriptions:"
msgstr "Popis:"
#: editor/editor_help.cpp
@@ -1536,12 +1532,14 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr ""
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "Popis:"
#: editor/editor_help.cpp
-msgid "Method Description:"
-msgstr ""
+#, fuzzy
+msgid "Method Descriptions:"
+msgstr "Popis:"
#: editor/editor_help.cpp
msgid ""
@@ -1549,11 +1547,55 @@ msgid ""
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-#: editor/editor_inspector.cpp
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "Signály:"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Constants Only"
+msgstr "Konštanty:"
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
msgstr ""
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Class"
+msgstr "Trieda:"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1588,6 +1630,11 @@ msgstr ""
msgid "Error saving resource!"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr ""
@@ -1642,10 +1689,20 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr ""
@@ -1875,6 +1932,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1915,6 +1978,11 @@ msgstr ""
msgid "Default"
msgstr ""
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Play This Scene"
msgstr ""
@@ -1998,7 +2066,7 @@ msgstr ""
#: editor/editor_node.cpp
#, fuzzy
-msgid "Save all Scenes"
+msgid "Save All Scenes"
msgstr "Uložiť súbor"
#: editor/editor_node.cpp
@@ -2027,7 +2095,7 @@ msgid "Undo"
msgstr "Späť"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -2051,7 +2119,7 @@ msgstr ""
msgid "Export"
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr ""
@@ -2064,6 +2132,7 @@ msgid "Quit to Project List"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr ""
@@ -2171,10 +2240,6 @@ msgstr ""
msgid "Help"
msgstr ""
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2269,21 +2334,21 @@ msgstr ""
msgid "Disable Update Spinner"
msgstr ""
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr ""
#: editor/editor_node.cpp
-msgid "Node"
+msgid "FileSystem"
msgstr ""
#: editor/editor_node.cpp
-msgid "FileSystem"
+msgid "Inspector"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Node"
msgstr ""
#: editor/editor_node.cpp
@@ -2424,7 +2489,7 @@ msgstr ""
msgid "Physics Frame %"
msgstr ""
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr ""
@@ -2448,7 +2513,7 @@ msgstr ""
msgid "Calls"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2460,20 +2525,44 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "Nesprávna veľkosť písma."
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
#, fuzzy
msgid "New Script"
msgstr "Popis:"
@@ -2486,10 +2575,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2498,7 +2583,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "Vložiť"
@@ -2782,6 +2868,10 @@ msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr ""
#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
@@ -2817,8 +2907,8 @@ msgstr ""
msgid "Unable to update dependencies:"
msgstr ""
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2826,10 +2916,6 @@ msgid "Provided name contains invalid characters"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr ""
@@ -2854,29 +2940,22 @@ msgid "Duplicating folder:"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr ""
+#, fuzzy
+msgid "Open Scene(s)"
+msgstr "Otvoriť súbor(y)"
#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
+msgid "Instance"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Move To..."
+msgid "Add to favorites"
msgstr ""
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open Scene(s)"
-msgstr "Otvoriť súbor(y)"
-
-#: editor/filesystem_dock.cpp
-msgid "Instance"
-msgstr ""
+msgid "Remove from favorites"
+msgstr "Všetky vybrané"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -2886,11 +2965,19 @@ msgstr ""
msgid "View Owners..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr ""
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr ""
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
msgstr "Popis:"
@@ -2900,6 +2987,14 @@ msgstr "Popis:"
msgid "New Resource..."
msgstr "Vytvoriť adresár"
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr ""
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -2920,24 +3015,15 @@ msgid "Re-Scan Filesystem"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Toggle folder status as Favorite."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Show current scene file."
-msgstr "Vytvoriť adresár"
-
-#: editor/filesystem_dock.cpp
-msgid "Instance the selected scene(s) as child of the selected node."
+msgid "Toggle split mode"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
+msgid "Search files"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Search files"
+msgid "Instance the selected scene(s) as child of the selected node."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2946,7 +3032,7 @@ msgid ""
"Please Wait..."
msgstr ""
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr ""
@@ -2963,28 +3049,22 @@ msgid "Create Script"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Find in files"
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Find: "
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Whole words"
-msgstr ""
+#, fuzzy
+msgid "Find in Files"
+msgstr "Súbor:"
#: editor/find_in_files.cpp
-msgid "Match case"
+msgid "Find:"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+#, fuzzy
+msgid "Folder:"
+msgstr "Vytvoriť adresár"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Filter: "
+msgid "Filters:"
msgstr "Filter:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -3001,6 +3081,10 @@ msgid "Cancel"
msgstr ""
#: editor/find_in_files.cpp
+msgid "Find: "
+msgstr ""
+
+#: editor/find_in_files.cpp
msgid "Replace: "
msgstr ""
@@ -3021,8 +3105,9 @@ msgid "Group name already exists."
msgstr ""
#: editor/groups_editor.cpp
-msgid "invalid Group name."
-msgstr ""
+#, fuzzy
+msgid "Invalid group name."
+msgstr "Nesprávna veľkosť písma."
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
@@ -3159,18 +3244,14 @@ msgstr ""
msgid "Failed to load resource."
msgstr ""
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr ""
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
-msgstr ""
+#, fuzzy
+msgid "Collapse All Properties"
+msgstr "Filter:"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -3214,6 +3295,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr ""
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr ""
@@ -3276,45 +3361,47 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
-msgstr ""
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
+msgstr "Vytvoriť adresár"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
-msgstr ""
+#, fuzzy
+msgid "Edit Polygon"
+msgstr "Signály:"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
-msgstr ""
+#, fuzzy
+msgid "Remove Polygon And Point"
+msgstr "Všetky vybrané"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr ""
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr "Všetky vybrané"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
#, fuzzy
-msgid "Delete points"
+msgid "Erase points."
msgstr "Všetky vybrané"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3329,7 +3416,7 @@ msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Load.."
+msgid "Load..."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3358,15 +3445,9 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Všetky vybrané"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "Všetky vybrané"
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3405,9 +3486,8 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3442,7 +3522,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add Node.."
+msgid "Add Node..."
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3716,7 +3796,7 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "Odstrániť výber"
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3784,10 +3864,6 @@ msgid "Amount:"
msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr ""
@@ -3987,7 +4063,7 @@ msgstr ""
msgid "Plugins"
msgstr ""
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr ""
@@ -4115,6 +4191,10 @@ msgid "Resize CanvasItem"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
msgstr ""
@@ -4135,15 +4215,15 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom out"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom reset"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom in"
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -4175,6 +4255,10 @@ msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4269,6 +4353,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "Všetky vybrané"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr ""
@@ -4319,6 +4408,10 @@ msgid "Show Viewport"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr ""
@@ -4387,7 +4480,16 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "Vytvoriť adresár"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
msgstr ""
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
@@ -4493,35 +4595,9 @@ msgid "Item List Editor"
msgstr ""
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr ""
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr ""
@@ -4755,12 +4831,12 @@ msgid "Populate"
msgstr ""
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
+msgid "Generating Visibility Rect"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -4789,6 +4865,11 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr ""
@@ -4858,11 +4939,11 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Convert to CPUParticles"
+msgid "Generate AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -4887,6 +4968,10 @@ msgid "Add Point to Curve"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr ""
@@ -4914,6 +4999,10 @@ msgid "Click: Add Point"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr ""
@@ -4929,11 +5018,6 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr ""
@@ -4994,6 +5078,10 @@ msgstr "Všetky vybrané"
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5005,7 +5093,13 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync bones"
+msgid "Sync Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5017,30 +5111,26 @@ msgid "Create Polygon & UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "Popis:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
+msgid "Remove Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split already exists."
+msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Add Split"
+msgid "Add Custom Polygon"
msgstr "Signály:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "Nesprávna veľkosť písma."
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Remove Split"
+msgid "Remove Custom Polygon"
msgstr "Všetky vybrané"
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5048,10 +5138,20 @@ msgid "Transform UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
+#, fuzzy
+msgid "Transform Polygon"
+msgstr "Vytvoriť adresár"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Open Polygon 2D UV editor."
+msgstr "Otvorit prieÄinok"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
msgstr ""
@@ -5060,12 +5160,14 @@ msgid "UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Poly"
-msgstr ""
+#, fuzzy
+msgid "Points"
+msgstr "Všetky vybrané"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Splits"
-msgstr ""
+#, fuzzy
+msgid "Polygons"
+msgstr "Signály:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Bones"
@@ -5073,12 +5175,8 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
-msgstr "Vytvoriť adresár"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
-msgstr ""
+msgid "Move Points"
+msgstr "Všetky vybrané"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
@@ -5105,19 +5203,21 @@ msgid "Scale Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Select a split to erase it"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5141,6 +5241,11 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr ""
@@ -5198,22 +5303,22 @@ msgid "Paste Resource"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr ""
@@ -5243,6 +5348,10 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Error could not load file."
msgstr ""
@@ -5251,19 +5360,19 @@ msgid "Error saving file!"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
+msgid "Error while saving theme."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+msgid "Error Saving"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
+msgid "Error importing theme."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+msgid "Error Importing"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5286,6 +5395,14 @@ msgid "Import Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr ""
@@ -5328,8 +5445,8 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile"
-msgstr "Súbor:"
+msgid "Open..."
+msgstr "Otvoriť"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5344,11 +5461,7 @@ msgid "Copy Script Path"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+msgid "History Previous"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5361,15 +5474,15 @@ msgid "Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Reload Theme"
+msgid "Import Theme..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme"
+msgid "Reload Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
+msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5419,7 +5532,7 @@ msgid "Keep Debugger Open"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5427,10 +5540,6 @@ msgid "Open Godot online documentation"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -5465,17 +5574,9 @@ msgid "Debugger"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search results"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search in files"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
+#, fuzzy
+msgid "Search Results"
+msgstr "Vložiť"
#: editor/plugins/script_text_editor.cpp
msgid "Line"
@@ -5486,6 +5587,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "Všetky vybrané"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr ""
@@ -5517,10 +5627,6 @@ msgstr ""
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5572,11 +5678,11 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5593,35 +5699,30 @@ msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr ""
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "PrejsÅ¥ na Äalší krok"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr ""
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "Prejsť na predchádzajúci krok"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
-msgstr ""
+#, fuzzy
+msgid "Go to Function..."
+msgstr "Všetky vybrané"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5713,6 +5814,14 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -5878,6 +5987,10 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -5980,10 +6093,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap To Floor"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6100,6 +6209,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
msgstr ""
@@ -6215,11 +6328,16 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6386,6 +6504,11 @@ msgid "Fix Invalid Tiles"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "Všetky vybrané"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6431,32 +6554,36 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "Odstrániť výber"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
+msgid "Rotate left"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate right"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip vertically"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Clear transform"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr "Všetky vybrané"
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6468,25 +6595,47 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "Vložiť"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "Všetky vybrané"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "Vytvoriť adresár"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "Všetky vybrané"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6494,7 +6643,12 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Všetky vybrané"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6504,16 +6658,27 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "Všetky vybrané"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr ""
+msgstr "Vytvoriť adresár"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "Všetky vybrané"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr "Vytvoriť adresár"
@@ -6531,12 +6696,99 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr "Vytvoriť adresár"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Vytvoriť adresár"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "Súbor:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Signály:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Signály:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Signály:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "Vložiť"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Všetky vybrané"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "Všetky vybrané"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "Všetky vybrané"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "Súbor:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Vytvoriť adresár"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Vytvoriť adresár"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "This property can't be changed."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Tile Set"
+msgid "TileSet"
msgstr "Súbor:"
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6572,6 +6824,14 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6580,6 +6840,10 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+msgid "Export Path"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6634,10 +6898,47 @@ msgid "Feature List:"
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "Popis:"
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr ""
#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -6768,7 +7069,7 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
-msgid "Can't open project"
+msgid "Can't open project at '%s'."
msgstr ""
#: editor/project_manager.cpp
@@ -6777,6 +7078,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7095,10 +7414,6 @@ msgstr ""
msgid "General"
msgstr ""
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7234,10 +7549,6 @@ msgstr "Vložiť"
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr ""
@@ -7321,7 +7632,7 @@ msgid "Step"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7330,7 +7641,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7370,7 +7681,7 @@ msgstr ""
msgid "Reset"
msgstr ""
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7429,6 +7740,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
#, fuzzy
msgid "Clear Script"
msgstr "Popis:"
@@ -7466,6 +7781,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7539,6 +7860,11 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Open documentation"
+msgstr "Popis:"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr ""
@@ -7547,12 +7873,13 @@ msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Change Type"
-msgstr ""
+#, fuzzy
+msgid "Extend Script"
+msgstr "Popis:"
#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
@@ -7703,6 +8030,10 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -7797,19 +8128,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -7841,18 +8160,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -8050,7 +8357,8 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+#, fuzzy
+msgid "Step argument is zero!"
msgstr "argument \"step\"/krok je nulový!"
#: modules/gdscript/gdscript_functions.cpp
@@ -8276,11 +8584,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -8557,6 +8861,10 @@ msgid "Base Type:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr ""
@@ -8658,11 +8966,11 @@ msgid "Search VisualScript"
msgstr "Vložiť"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8746,6 +9054,12 @@ msgstr ""
"Musíte nastaviť tvar objektu CollisionShape2D aby fungoval. Prosím, vytvorte "
"preň tvarový objekt!"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -8786,6 +9100,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -8903,6 +9223,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -8922,6 +9252,26 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -8954,7 +9304,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9008,6 +9358,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr ""
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr ""
@@ -9024,10 +9378,6 @@ msgstr ""
msgid "Please Confirm..."
msgstr ""
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr ""
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9035,6 +9385,10 @@ msgid ""
"hide upon running."
msgstr ""
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9080,10 +9434,6 @@ msgstr "Nesprávna veľkosť písma."
msgid "Input"
msgstr ""
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
@@ -9101,6 +9451,25 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Add Split"
+#~ msgstr "Signály:"
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "Všetky vybrané"
+
+#, fuzzy
+#~ msgid "New TextFile"
+#~ msgstr "Súbor:"
+
+#~ msgid "Class List:"
+#~ msgstr "Zoznam tried:"
+
+#, fuzzy
+#~ msgid "Show current scene file."
+#~ msgstr "Vytvoriť adresár"
+
#~ msgid "Disabled"
#~ msgstr "Vypnuté"
diff --git a/editor/translations/sl.po b/editor/translations/sl.po
index 707fc575e7..686338f198 100644
--- a/editor/translations/sl.po
+++ b/editor/translations/sl.po
@@ -1,25 +1,28 @@
# Slovenian translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# matevž lapajne <sivar.lapajne@gmail.com>, 2016-2018.
# Matjaž Vitas <matjaz.vitas@gmail.com>, 2017-2018.
# Miha Komatar <miha.komatar@gmail.com>, 2018.
# Simon Å ander <simon.sand3r@gmail.com>, 2017.
# Yahara Octanis <yaharao55@gmail.com>, 2018.
+# Tine Jozelj <tine@tjo.space>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-06-27 13:43+0000\n"
-"Last-Translator: matevž lapajne <sivar.lapajne@gmail.com>\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:43+0100\n"
+"Last-Translator: Tine Jozelj <tine@tjo.space>\n"
"Language-Team: Slovenian <https://hosted.weblate.org/projects/godot-engine/"
"godot/sl/>\n"
"Language: sl\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
"%100==4 ? 2 : 3;\n"
-"X-Generator: Weblate 3.1-dev\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -27,7 +30,7 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr "Neveljavena vrsta argumenta za convert(), uporabite TYPE_* konstanto."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr "Ni dovolj pomnilnika za dekodiranje bajtov, ali neveljaven format."
@@ -38,7 +41,7 @@ msgstr ""
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "self nemore biti uporabljen, ker instanca ni null (ni podano)"
#: core/math/expression.cpp
#, fuzzy
@@ -55,13 +58,12 @@ msgid "Invalid named index '%s' for base type %s"
msgstr ""
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid arguments to construct '%s'"
-msgstr ": Neveljaven argument od tipa: "
+msgstr "Neveljavni argumenti za construct '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "Na klic '%s':"
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -70,35 +72,31 @@ msgstr "Prosto"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "Uravnoteženo"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Mirror"
-msgstr "Napaka!"
+msgstr "Zrcali"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "V Animacijo Vstavi KljuÄ"
+msgstr "Vstavi KljuÄ Tukaj"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "Podvoji izbrano"
+msgstr "Podvoji Izbran/e KljuÄ/e"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "Izbriši Izbrano"
+msgstr "IzbriÅ¡i Izbran/e KljuÄ/e"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
-msgstr "Animacija Podvoji kljuÄe"
+msgstr "Animiraj Podvojene kljuÄe"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Delete Keys"
-msgstr "Animacija IzbriÅ¡i kljuÄe"
+msgstr "Animiraj Izbrisane kljuÄe"
#: editor/animation_track_editor.cpp
msgid "Anim Change Keyframe Time"
@@ -271,7 +269,6 @@ msgstr "Ustvarim %d NOVO sled in vstavim kljuÄe?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -405,8 +402,7 @@ msgstr "PoveÄaj izbiro"
msgid "Scale From Cursor"
msgstr "PoveÄaj iz kazalca"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Podvoji izbrano"
@@ -420,11 +416,13 @@ msgid "Delete Selection"
msgstr "Izbriši Izbrano"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+#, fuzzy
+msgid "Go to Next Step"
msgstr "Pojdi na naslednji korak"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+#, fuzzy
+msgid "Go to Previous Step"
msgstr "Pojdi na prejšnji korak"
#: editor/animation_track_editor.cpp
@@ -527,11 +525,11 @@ msgstr "Ni Zadetkov"
msgid "Replaced %d occurrence(s)."
msgstr "Zamenjana %d ponovitev/e."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Ujemanje Velikih ÄŒrk"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "Cele Besede"
@@ -547,15 +545,19 @@ msgstr "Zamenjaj Vse"
msgid "Selection Only"
msgstr "Samo Izbira"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Približaj"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "Oddalji"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "Ponastavi PoveÄavo/PomanjÅ¡avo"
@@ -564,11 +566,10 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "Približaj"
+msgid "Font Size:"
+msgstr ""
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Vrstica:"
@@ -601,6 +602,7 @@ msgstr "Dodaj"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -681,7 +683,7 @@ msgid "Edit Connection: "
msgstr "Napaka Pri Povezavi"
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -730,23 +732,20 @@ msgid "Recent:"
msgstr "Nedavni:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Iskanje:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "Zadetki:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "Opis:"
@@ -785,8 +784,7 @@ msgid "Resource"
msgstr "Viri"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "Pot"
@@ -807,9 +805,10 @@ msgid "Search Replacement Resource:"
msgstr "Iskanje Nadomestnih Virov:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -841,7 +840,8 @@ msgid "Error loading:"
msgstr "Napaka pri nalaganju:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+#, fuzzy
+msgid "Load failed due to missing dependencies:"
msgstr "Nalaganje scene je spodletelo zaradi manjkajoÄih odvisnosti:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -900,14 +900,6 @@ msgstr "Spremeni Slovarsko Vrednost"
msgid "Thanks from the Godot community!"
msgstr "Zahvaljujemo se vam iz skupnosti Godota!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr ""
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Godot Engine sodelovci"
@@ -1001,7 +993,8 @@ msgid "Uncompressing Assets"
msgstr "Razširjenje Dodatkov"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+#, fuzzy
+msgid "Package installed successfully!"
msgstr "Paket je UspeÅ¡no NameÅ¡Äen!"
#: editor/editor_asset_installer.cpp
@@ -1083,8 +1076,7 @@ msgid "Bus options"
msgstr "Možnosti Vodila"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "Podvoji"
@@ -1245,7 +1237,7 @@ msgid "Add AutoLoad"
msgstr "Dodaj SamodejnoNalaganje"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "Pot:"
@@ -1253,8 +1245,8 @@ msgstr "Pot:"
msgid "Node Name:"
msgstr "Ime Gradnika:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "Ime"
@@ -1324,12 +1316,17 @@ msgid "Template file not found:"
msgstr "Predloge ni mogoÄe najti:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Izberite Trenutno Mapo"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "Datoteka Obstaja, Prepišem?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "Izberite Trenutno Mapo"
+#, fuzzy
+msgid "Select This Folder"
+msgstr "Izberite mapo"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
@@ -1337,12 +1334,13 @@ msgstr "Kopiraj Pot"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr "Pokaži V Upravitelju Datotek"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+#, fuzzy
+msgid "Show in File Manager"
msgstr "Pokaži V Upravitelju Datotek"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1378,7 +1376,8 @@ msgid "Open a File or Directory"
msgstr "Odpri Datoteko ali Mapo"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Shrani"
@@ -1436,8 +1435,7 @@ msgstr "Mape & Datoteke:"
msgid "Preview:"
msgstr "Predogled:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "Datoteka:"
@@ -1453,24 +1451,11 @@ msgstr "BranjeVirov"
msgid "(Re)Importing Assets"
msgstr "Uvoz Dodatkov"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "IÅ¡Äi PomoÄ"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "Seznam Razredov:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "IÅ¡Äi Razrede"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "Vrh"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "Razred:"
@@ -1487,28 +1472,31 @@ msgid "Brief Description:"
msgstr "Kratek Opis:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "ÄŒlani"
+msgid "Properties"
+msgstr "Lastnosti"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "ÄŒlani:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "Javne Metode"
+msgid "Methods"
+msgstr "Metode"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "Javne Metode:"
+#, fuzzy
+msgid "Methods:"
+msgstr "Metode"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "Elementi GUI Teme"
+#, fuzzy
+msgid "Theme Properties"
+msgstr "Lastnosti"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "Elementi GUI Teme:"
+#, fuzzy
+msgid "Theme Properties:"
+msgstr "Lastnosti"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1535,10 +1523,16 @@ msgid "Constants:"
msgstr "Konstante:"
#: editor/editor_help.cpp
-msgid "Description"
+#, fuzzy
+msgid "Class Description"
msgstr "Opis"
#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
+msgstr "Opis:"
+
+#: editor/editor_help.cpp
msgid "Online Tutorials:"
msgstr "Spletne Vaje:"
@@ -1552,11 +1546,13 @@ msgstr ""
"url][/color] ali [color=$color][url=$url2]zahtevate enega[/url][/color]."
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "Lastnosti"
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "Opis lastnosti:"
#: editor/editor_help.cpp
-msgid "Property Description:"
+#, fuzzy
+msgid "Property Descriptions:"
msgstr "Opis lastnosti:"
#: editor/editor_help.cpp
@@ -1568,11 +1564,13 @@ msgstr ""
"$url]prispevkom[/url][/color]!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "Metode"
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "Opis Metode:"
#: editor/editor_help.cpp
-msgid "Method Description:"
+#, fuzzy
+msgid "Method Descriptions:"
msgstr "Opis Metode:"
#: editor/editor_help.cpp
@@ -1583,12 +1581,61 @@ msgstr ""
"Trenutno ni opisa za to metodo. Pomagajte nam s [color=$color][url="
"$url]prispevkom[/url][/color]!"
-#: editor/editor_inspector.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "IÅ¡Äi PomoÄ"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Display All"
+msgstr "Zamenjaj Vse"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Classes Only"
+msgstr "Razredi"
+
+#: editor/editor_help_search.cpp
#, fuzzy
-msgid "Property: "
+msgid "Methods Only"
+msgstr "Metode"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "Signali"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Constants Only"
+msgstr "Konstante"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Properties Only"
msgstr "Lastnosti"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Theme Properties Only"
+msgstr "Lastnosti"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Member Type"
+msgstr "ÄŒlani"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Class"
+msgstr "Razred:"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1622,6 +1669,11 @@ msgstr "Izvoz projekta ni uspelo s kodno napako %d."
msgid "Error saving resource!"
msgstr "Napaka pri shranjevanju virov!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "Shrani Vire Kot..."
@@ -1676,12 +1728,22 @@ msgstr "Te operacije ne moremo storiti brez osnovnega drevesa."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
"Ni mogoÄe shraniti scene. Najverjetneje odvisnosti (primeri ali dedovanja) "
"ne morejo biti izpolnjene."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr "Knjižnice Modelov ni mogoÄe naložiti za združitev!"
@@ -1934,6 +1996,14 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "Ni mogoÄe naložiti dodatno skripto iz poti: '%s'."
#: editor/editor_node.cpp
+#, fuzzy
+msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"Ni mogoÄe naložiti dodatno skripto iz poti: '%s' Skripta ni v naÄinu orodje."
+
+#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1982,6 +2052,12 @@ msgstr "Izbriši Postavitev"
msgid "Default"
msgstr "Prevzeto"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+#, fuzzy
+msgid "Show in FileSystem"
+msgstr "DatoteÄniSistem"
+
#: editor/editor_node.cpp
#, fuzzy
msgid "Play This Scene"
@@ -2065,7 +2141,8 @@ msgid "Save Scene"
msgstr "Shrani Prizor"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+#, fuzzy
+msgid "Save All Scenes"
msgstr "Shrani vse Prizore"
#: editor/editor_node.cpp
@@ -2094,7 +2171,7 @@ msgid "Undo"
msgstr "Razveljavi"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Ponovi"
@@ -2118,7 +2195,7 @@ msgstr "Nastavitve Projekta"
msgid "Export"
msgstr "Izvozi"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "Orodja"
@@ -2132,6 +2209,7 @@ msgid "Quit to Project List"
msgstr "Zapri na Seznam Projektov"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "RazhroÅ¡Äevalnik"
@@ -2258,10 +2336,6 @@ msgstr "Upravljaj Izvozne Predloge"
msgid "Help"
msgstr "PomoÄ"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "Razredi"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2356,24 +2430,24 @@ msgstr "Posodobi Spremembe"
msgid "Disable Update Spinner"
msgstr "OnemogoÄi Posodobitve Kolesca"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "Nadzornik"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "Uvozi"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "Gradnik"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "DatoteÄniSistem"
#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr "Nadzornik"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Gradnik"
+
+#: editor/editor_node.cpp
#, fuzzy
msgid "Expand Bottom Panel"
msgstr "Razširi vse"
@@ -2511,7 +2585,7 @@ msgstr "Okvir %"
msgid "Physics Frame %"
msgstr "Fizikalni Okvir %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "ÄŒas:"
@@ -2535,7 +2609,7 @@ msgstr "ÄŒas"
msgid "Calls"
msgstr "Klici"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2547,20 +2621,44 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr "[Prazen]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "Neveljavna Pot"
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr ""
@@ -2572,10 +2670,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2584,7 +2678,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr ""
@@ -2876,6 +2971,11 @@ msgstr ""
"predpomnilnik tipa datoteke!"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "Priljubljene:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
"Ne morem se postaviti na mesto '%s', ker ni bilo najdeno v datoteÄnem "
@@ -2916,19 +3016,15 @@ msgstr "Napaka pri podvajanju:"
msgid "Unable to update dependencies:"
msgstr "Odvisnosti ni mogoÄe posodobiti:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "Ime ni na voljo"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "Ime ni doloÄeno."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "Vnešeno ime vsebuje neveljavne znake"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "Ime ni doloÄeno."
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "Ime vsebuje neveljavne znake."
@@ -2953,22 +3049,6 @@ msgid "Duplicating folder:"
msgstr "Podvajanje mape:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "Razširi vse"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "SkrÄi vse"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "Preimenuj..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "Premakni V..."
-
-#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
msgstr "Odpri Prizor(e)"
@@ -2977,6 +3057,16 @@ msgid "Instance"
msgstr "Primer"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Add to favorites"
+msgstr "Priljubljene:"
+
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Remove from favorites"
+msgstr "Odstrani iz Skupine"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "Uredi Odvisnosti..."
@@ -2984,11 +3074,19 @@ msgstr "Uredi Odvisnosti..."
msgid "View Owners..."
msgstr "Poglej Lastnike..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "Preimenuj..."
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "Podvoji..."
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr "Premakni V..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
msgstr "Hitro Odpri Skripto..."
@@ -2998,6 +3096,16 @@ msgstr "Hitro Odpri Skripto..."
msgid "New Resource..."
msgstr "Shrani Vire Kot..."
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Expand All"
+msgstr "Razširi vse"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Collapse All"
+msgstr "SkrÄi vse"
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -3019,13 +3127,13 @@ msgstr "Ponovno Preglej DatoteÄni Sistem"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "Nastavi mapo status kot Priljubljeno"
+msgid "Toggle split mode"
+msgstr "Preklopi NaÄin"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Show current scene file."
-msgstr "Izberi trenutno pod-ploÅ¡Äo v urejanju."
+msgid "Search files"
+msgstr "IÅ¡Äi Razrede"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
@@ -3033,15 +3141,6 @@ msgstr ""
"Naredi primer iz izbranih prizorov, ki bo naslednik izbranega gradnika."
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "IÅ¡Äi Razrede"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3049,7 +3148,7 @@ msgstr ""
"Pregledovanje Datotek,\n"
"Prosimo, PoÄakajte..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "Premakni"
@@ -3068,31 +3167,22 @@ msgstr ""
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find in files"
+msgid "Find in Files"
msgstr "%d veÄ datotek"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find: "
+msgid "Find:"
msgstr "Najdi"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Whole words"
-msgstr "Cele Besede"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "Ujemanje Velikih ÄŒrk"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "Ustvarite Mapo"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Filter: "
+msgid "Filters:"
msgstr "Filtri..."
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -3110,6 +3200,11 @@ msgstr "PrekliÄi"
#: editor/find_in_files.cpp
#, fuzzy
+msgid "Find: "
+msgstr "Najdi"
+
+#: editor/find_in_files.cpp
+#, fuzzy
msgid "Replace: "
msgstr "Zamenjaj"
@@ -3135,7 +3230,7 @@ msgstr "NAPAKA: Animacija s tem imenom že obstaja!"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr "Neveljavno ime."
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3274,17 +3369,14 @@ msgstr "Ponovno Uvozi"
msgid "Failed to load resource."
msgstr "Napaka pri nalaganju vira."
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr ""
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+#, fuzzy
+msgid "Expand All Properties"
msgstr "Razširi vse lastnosti"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+#, fuzzy
+msgid "Collapse All Properties"
msgstr "SkrÄi vse lastnosti"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3330,6 +3422,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "Naloži obstojeÄi vir iz spomina in ga uredi."
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "Shrani trenutno urejani vir."
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "Pojdi na prejšnji urejani objekt v zgodovini."
@@ -3395,14 +3491,14 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
msgstr "Ustvarite Poligon"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+#, fuzzy
+msgid "Edit Polygon"
msgstr "Uredi Poligon"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3410,25 +3506,28 @@ msgid "Insert Point"
msgstr "Ustavi ToÄko"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+#, fuzzy
+msgid "Edit Polygon (Remove Point)"
msgstr "Uredi Poligon (Odstrani ToÄko)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+#, fuzzy
+msgid "Remove Polygon And Point"
msgstr "Odstrani Poligon in ToÄko"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "Ustvari nov poligon od zaÄetka"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr "IzbriÅ¡i toÄke"
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#, fuzzy
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
"Uredi obstojeÄi poligon:\n"
"LMG: Premakni ToÄko.\n"
@@ -3436,7 +3535,9 @@ msgstr ""
"DMG: ZbriÅ¡i ToÄko."
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#, fuzzy
+msgid "Erase points."
msgstr "IzbriÅ¡i toÄke"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3452,7 +3553,7 @@ msgstr "Dodaj Animacijo"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
+msgid "Load..."
msgstr "Naloži"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3481,15 +3582,9 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "IzbriÅ¡i toÄke"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "IzbriÅ¡i toÄke"
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3530,10 +3625,9 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr ""
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Zmešaj:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3567,7 +3661,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
-msgid "Add Node.."
+msgid "Add Node..."
msgstr "Dodaj vozliÅ¡Äe"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3847,7 +3941,7 @@ msgstr "Poveži se z Gradnikom:"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "Odstrani izbrano sled."
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3915,10 +4009,6 @@ msgid "Amount:"
msgstr "KoliÄina:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "Zmešaj:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "Zmešaj 0:"
@@ -4121,7 +4211,7 @@ msgstr "Vse"
msgid "Plugins"
msgstr "VtiÄniki"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "Razvrsti:"
@@ -4256,6 +4346,11 @@ msgstr "Uredi Platno Stvari"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Scale CanvasItem"
+msgstr "Uredi Platno Stvari"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Move CanvasItem"
msgstr "Uredi Platno Stvari"
@@ -4276,21 +4371,19 @@ msgid "Paste Pose"
msgstr "Prilepi Pozicijo"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "Oddalji"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "Oddalji"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Približaj"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr "Izberi NaÄin"
@@ -4321,6 +4414,11 @@ msgid "Rotate Mode"
msgstr "NaÄin Vrtenja"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "NaÄin Obsega (R)"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4420,6 +4518,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "Posameznik"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr ""
@@ -4471,6 +4574,10 @@ msgid "Show Viewport"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr ""
@@ -4540,8 +4647,17 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr ""
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "Ustvarite Poligon"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Uredi Poligon"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Uredi Poligon (Odstrani ToÄko)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
@@ -4642,35 +4758,9 @@ msgid "Item List Editor"
msgstr ""
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr ""
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr "Model je prazen!"
@@ -4902,12 +4992,12 @@ msgid "Populate"
msgstr ""
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
+msgid "Generating Visibility Rect"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -4936,6 +5026,11 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr ""
@@ -5005,11 +5100,11 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Convert to CPUParticles"
+msgid "Generate AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -5034,6 +5129,11 @@ msgid "Add Point to Curve"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "Uredi krivuljo vozliÅ¡Äa"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr ""
@@ -5061,6 +5161,10 @@ msgid "Click: Add Point"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr ""
@@ -5076,11 +5180,6 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr ""
@@ -5137,6 +5236,10 @@ msgstr "Odstrani ToÄko Izven Nadzora"
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5148,7 +5251,13 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync bones"
+msgid "Sync Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5161,40 +5270,46 @@ msgid "Create Polygon & UV"
msgstr "Ustvarite Poligon"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "Ustvari nov vodoravni vodnik"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
+#, fuzzy
+msgid "Remove Internal Vertex"
+msgstr "Odstranite navpiÄni vodnik"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "SamodejnoNalaganje '%s' že obstaja!"
+msgid "Add Custom Polygon"
+msgstr "Uredi Poligon"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Add Split"
-msgstr "Dodaj toÄko"
+msgid "Remove Custom Polygon"
+msgstr "Odstrani Poligon in ToÄko"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Invalid Split: "
-msgstr "Neveljavna Pot"
+msgid "Transform UV Map"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Odstrani toÄko"
+msgid "Transform Polygon"
+msgstr "Preoblikovanje"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Transform UV Map"
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
-msgstr ""
+#, fuzzy
+msgid "Open Polygon 2D UV editor."
+msgstr "Odpri 2D Urejevalnik"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
@@ -5206,12 +5321,13 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "Uredi Poligon"
+msgid "Points"
+msgstr "Odstrani toÄko"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Splits"
-msgstr ""
+#, fuzzy
+msgid "Polygons"
+msgstr "Uredi Poligon"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Bones"
@@ -5219,12 +5335,8 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
-msgstr "Ustvarite Poligon"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
-msgstr ""
+msgid "Move Points"
+msgstr "Odstrani toÄko"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
@@ -5251,20 +5363,21 @@ msgid "Scale Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "Izberite Mapo za Skeniranje"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5289,6 +5402,11 @@ msgid "Grid Settings"
msgstr "Nastavitve Urejevalnika"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr ""
@@ -5351,22 +5469,22 @@ msgid "Paste Resource"
msgstr "Prilepi Vir"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr ""
@@ -5399,6 +5517,11 @@ msgstr "Napaka pri shranjevanju PloÅ¡ÄnegaNiza!"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
+msgid "Error: could not load file."
+msgstr "Mape ni mogoÄe ustvariti."
+
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Error could not load file."
msgstr "Mape ni mogoÄe ustvariti."
@@ -5408,20 +5531,24 @@ msgid "Error saving file!"
msgstr "Napaka pri shranjevanju PloÅ¡ÄnegaNiza!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr ""
+#, fuzzy
+msgid "Error while saving theme."
+msgstr "Napaka med shranjevanjem."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
-msgstr ""
+#, fuzzy
+msgid "Error Saving"
+msgstr "Napaka pri premikanju:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr ""
+#, fuzzy
+msgid "Error importing theme."
+msgstr "Napaka nalaganja pisave."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
-msgstr ""
+#, fuzzy
+msgid "Error Importing"
+msgstr "Napaka pri premikanju:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -5443,6 +5570,14 @@ msgid "Import Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr ""
@@ -5484,8 +5619,8 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile"
-msgstr "Ogled datotek"
+msgid "Open..."
+msgstr "Odpri"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5500,12 +5635,9 @@ msgid "Copy Script Path"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
-msgstr ""
+#, fuzzy
+msgid "History Previous"
+msgstr "Prejšnji zavihek"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
@@ -5517,15 +5649,16 @@ msgid "Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Reload Theme"
-msgstr ""
+#, fuzzy
+msgid "Import Theme..."
+msgstr "Uvažanje Prizora..."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme"
+msgid "Reload Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
+msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5575,18 +5708,15 @@ msgid "Keep Debugger Open"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
-msgstr ""
+#, fuzzy
+msgid "Debug with External Editor"
+msgstr "Odpri naslednji Urejevalnik"
#: editor/plugins/script_editor_plugin.cpp
msgid "Open Godot online documentation"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -5622,19 +5752,9 @@ msgstr "RazhroÅ¡Äevalnik"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Search results"
+msgid "Search Results"
msgstr "IÅ¡Äi PomoÄ"
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "IÅ¡Äi Razrede"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
@@ -5645,6 +5765,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "Dodaj Funkcijo"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr ""
@@ -5676,10 +5805,6 @@ msgstr ""
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5731,11 +5856,11 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5752,20 +5877,14 @@ msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr ""
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "Pojdi na naslednji korak"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr ""
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "Preklopi na Zaustavitev"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
@@ -5773,16 +5892,18 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr "Filtriraj datoteke..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
-msgstr ""
+#, fuzzy
+msgid "Go to Function..."
+msgstr "Odstrani Funkcijo"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
-msgstr ""
+#, fuzzy
+msgid "Go to Line..."
+msgstr "Pojdi na Vrstico"
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
@@ -5876,6 +5997,14 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -6041,6 +6170,10 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -6143,11 +6276,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap To Floor"
-msgstr "Pripni na mrežo"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Preklopi Svobodni Pregled"
@@ -6264,6 +6392,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
msgid "Sprite is empty!"
@@ -6381,12 +6513,17 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr "NaÄin Postavljanja:"
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
-msgstr ""
+#: scene/resources/visual_shader.cpp
+msgid "None"
+msgstr "NiÄ"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Pixel Snap"
@@ -6550,6 +6687,11 @@ msgid "Fix Invalid Tiles"
msgstr "Neveljavno ime."
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "PoÄisti izbrano"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6596,33 +6738,40 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "Odstrani izbrano"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr ""
+#, fuzzy
+msgid "Rotate left"
+msgstr "NaÄin Vrtenja"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr ""
+#, fuzzy
+msgid "Rotate right"
+msgstr "NaÄin Vrtenja"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Flip vertically"
msgstr ""
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Clear transform"
+msgstr "Preoblikovanje"
+
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr "Dodaj Gradnik(e) iz Drevesa"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr "Odstrani trenutni vnos"
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6634,25 +6783,47 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "Prilepi animacijo"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "IzbriÅ¡i toÄke"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "Ustvarite Poligon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "Odstrani trenutni vnos"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6660,7 +6831,12 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Odstrani Predlogo"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6670,16 +6846,27 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "Izbrišem izbrane datoteke?"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr ""
+msgstr "Izberi trenutno pod-ploÅ¡Äo v urejanju."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "IzbriÅ¡i toÄke"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr "Izberi trenutno pod-ploÅ¡Äo v urejanju."
@@ -6698,12 +6885,101 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr "Izberi trenutno pod-ploÅ¡Äo v urejanju."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Ustvarite Mapo"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "Uredi Filtre"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Uredi Poligon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Uredi Poligon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Uredi Poligon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "Prilepi animacijo"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Odstrani Predlogo"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "Odstrani Poligon in ToÄko"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "Odstrani ToÄko Izven Nadzora"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "Odstrani Animacijo"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "Uredi Filtre"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Ustvarite Poligon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Ustvarite Poligon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "This property can't be changed."
msgstr "Ta operacija ni mogoÄa brez scene."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
-msgstr ""
+#, fuzzy
+msgid "TileSet"
+msgstr "Izvozi PloÅ¡Äno Zbirko"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
@@ -6738,6 +7014,15 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Exporting All"
+msgstr "Izvozi"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6746,6 +7031,11 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "Izvozi Projekt"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6800,10 +7090,50 @@ msgid "Feature List:"
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "Zaženi Skripto"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Script Export Mode:"
+msgstr "Izvozi Projekt"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export mode?"
+msgstr "Izvozi Projekt"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Export All"
+msgstr "Izvozi"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -6932,8 +7262,9 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
-msgid "Can't open project"
-msgstr ""
+#, fuzzy
+msgid "Can't open project at '%s'."
+msgstr "Ni mogoÄe odpreti '%s'."
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
@@ -6941,6 +7272,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7257,10 +7606,6 @@ msgstr ""
msgid "General"
msgstr ""
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7394,10 +7739,6 @@ msgstr ""
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr "Izberi Lastnost"
@@ -7488,7 +7829,7 @@ msgid "Step"
msgstr "Korak (s):"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7497,7 +7838,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7538,7 +7879,7 @@ msgstr ""
msgid "Reset"
msgstr "Ponastavi PoveÄavo/PomanjÅ¡avo"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7597,6 +7938,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr ""
@@ -7633,6 +7978,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7707,6 +8058,11 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Open documentation"
+msgstr "Odpri Nedavne"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr ""
@@ -7715,12 +8071,13 @@ msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Change Type"
-msgstr ""
+#, fuzzy
+msgid "Extend Script"
+msgstr "Zaženi Skripto"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -7873,6 +8230,11 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Filename is empty"
+msgstr "Model je prazen!"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -7961,19 +8323,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -8005,18 +8355,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -8216,7 +8554,8 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+#, fuzzy
+msgid "Step argument is zero!"
msgstr "stopnja argumenta je niÄ!"
#: modules/gdscript/gdscript_functions.cpp
@@ -8440,11 +8779,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -8723,6 +9058,10 @@ msgid "Base Type:"
msgstr "Osnovni Tip:"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "ÄŒlani:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "Na voljo Nodes:"
@@ -8825,11 +9164,11 @@ msgid "Search VisualScript"
msgstr "Odstrani Gradnik VizualnaSkripta"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8919,6 +9258,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -8957,6 +9302,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -9074,6 +9425,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -9093,6 +9454,26 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9125,7 +9506,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9184,6 +9565,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr "Drevo animacije ni veljavno."
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr "Neobdelan naÄin"
@@ -9200,10 +9585,6 @@ msgstr "Opozorilo!"
msgid "Please Confirm..."
msgstr "Prosimo Potrdite..."
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr "Izberite mapo"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9214,6 +9595,10 @@ msgstr ""
"ali katerih izmed popup*() funkcij. Spreminjanje vidnosti za urejanje je "
"sprejemljivo, vendar se bodo ob zagonu skrila."
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9260,14 +9645,9 @@ msgstr "Neveljavna velikost pisave."
msgid "Input"
msgstr "Dodaj Vnos"
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for shader."
-msgstr "Neveljavna velikost pisave."
+msgstr "Neveljaven vir za shader."
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
@@ -9281,6 +9661,105 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Split already exists."
+#~ msgstr "SamodejnoNalaganje '%s' že obstaja!"
+
+#, fuzzy
+#~ msgid "Add Split"
+#~ msgstr "Dodaj toÄko"
+
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr "Neveljavna Pot"
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "Odstrani toÄko"
+
+#, fuzzy
+#~ msgid "Poly"
+#~ msgstr "Uredi Poligon"
+
+#, fuzzy
+#~ msgid "Select a split to erase it."
+#~ msgstr "Izberite Mapo za Skeniranje"
+
+#~ msgid "No name provided"
+#~ msgstr "Ime ni na voljo"
+
+#, fuzzy
+#~ msgid "Add Node.."
+#~ msgstr "Dodaj vozliÅ¡Äe"
+
+#~ msgid "Create Poly"
+#~ msgstr "Ustvarite Poligon"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "Ustvari nov poligon od zaÄetka"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "Oddalji"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "Približaj"
+
+#, fuzzy
+#~ msgid "New TextFile"
+#~ msgstr "Ogled datotek"
+
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Približaj"
+
+#~ msgid "Class List:"
+#~ msgstr "Seznam Razredov:"
+
+#~ msgid "Search Classes"
+#~ msgstr "IÅ¡Äi Razrede"
+
+#~ msgid "Public Methods"
+#~ msgstr "Javne Metode"
+
+#~ msgid "Public Methods:"
+#~ msgstr "Javne Metode:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "Elementi GUI Teme"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "Elementi GUI Teme:"
+
+#, fuzzy
+#~ msgid "Property: "
+#~ msgstr "Lastnosti"
+
+#, fuzzy
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "Nastavi mapo status kot Priljubljeno"
+
+#, fuzzy
+#~ msgid "Show current scene file."
+#~ msgstr "Izberi trenutno pod-ploÅ¡Äo v urejanju."
+
+#, fuzzy
+#~ msgid "Whole words"
+#~ msgstr "Cele Besede"
+
+#, fuzzy
+#~ msgid "Match case"
+#~ msgstr "Ujemanje Velikih ÄŒrk"
+
+#, fuzzy
+#~ msgid "Search in files"
+#~ msgstr "IÅ¡Äi Razrede"
+
+#, fuzzy
+#~ msgid "Snap To Floor"
+#~ msgstr "Pripni na mrežo"
+
#~ msgid "Disabled"
#~ msgstr "OnemogoÄen"
@@ -9305,9 +9784,6 @@ msgstr ""
#~ msgid "Anim Track Change Wrap Mode"
#~ msgstr "Animacija Spremeni naÄin ovijanja sledi"
-#~ msgid "Edit Node Curve"
-#~ msgstr "Uredi krivuljo vozliÅ¡Äa"
-
#~ msgid "Edit Selection Curve"
#~ msgstr "Uredi Krivulje izbora"
@@ -9368,15 +9844,9 @@ msgstr ""
#~ msgid "I see..."
#~ msgstr "Vidim..."
-#~ msgid "Can't open '%s'."
-#~ msgstr "Ni mogoÄe odpreti '%s'."
-
#~ msgid "Ugh"
#~ msgstr "Uh"
-#~ msgid "Save the currently edited resource."
-#~ msgstr "Shrani trenutno urejani vir."
-
#~ msgid "Stop Profiling"
#~ msgstr "Ustavi Modeliranje"
diff --git a/editor/translations/sq.po b/editor/translations/sq.po
new file mode 100644
index 0000000000..241a056ac4
--- /dev/null
+++ b/editor/translations/sq.po
@@ -0,0 +1,9246 @@
+# Albanian translation of the Godot Engine editor
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
+# This file is distributed under the same license as the Godot source code.
+# Igli <iglibh@outlook.com>, 2018.
+msgid ""
+msgstr ""
+"Project-Id-Version: Godot Engine editor\n"
+"PO-Revision-Date: 2018-12-29 12:09+0000\n"
+"Last-Translator: Igli <iglibh@outlook.com>\n"
+"Language-Team: Albanian <https://hosted.weblate.org/projects/godot-engine/"
+"godot/sq/>\n"
+"Language: sq\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 3.4-dev\n"
+
+#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Invalid type argument to convert(), use TYPE_* constants."
+msgstr ""
+"Lloji i argumentit i gabuar për t'u konvertuar, përdor TYPE_* konstantet."
+
+#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
+#: modules/mono/glue/gd_glue.cpp
+#: modules/visual_script/visual_script_builtin_funcs.cpp
+msgid "Not enough bytes for decoding bytes, or invalid format."
+msgstr "Jo mjaftueshëm bite për çkodim të biteve, ose format i gabuar."
+
+#: core/math/expression.cpp
+msgid "Invalid input %i (not passed) in expression"
+msgstr "Input i gabuar %i (nuk kaloi) në shprehje"
+
+#: core/math/expression.cpp
+msgid "self can't be used because instance is null (not passed)"
+msgstr "self nuk mund të përdoret sepse instance është null (nuk kaloi)"
+
+#: core/math/expression.cpp
+msgid "Invalid operands to operator %s, %s and %s."
+msgstr "Operandë të gabuar për operatorët %s, %s dhe %s."
+
+#: core/math/expression.cpp
+msgid "Invalid index of type %s for base type %s"
+msgstr "Index i gabuar i llojit %s për llojin bazë %s"
+
+#: core/math/expression.cpp
+msgid "Invalid named index '%s' for base type %s"
+msgstr "Index i emërtuar gabimisht '%s' për llojin bazë %s"
+
+#: core/math/expression.cpp
+msgid "Invalid arguments to construct '%s'"
+msgstr "Argument i gabuar për të ndërtuar '%s'"
+
+#: core/math/expression.cpp
+msgid "On call to '%s':"
+msgstr "Në thërritje të '%s':"
+
+#: editor/animation_bezier_editor.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Free"
+msgstr "Falas"
+
+#: editor/animation_bezier_editor.cpp
+msgid "Balanced"
+msgstr "I balancuar"
+
+#: editor/animation_bezier_editor.cpp
+msgid "Mirror"
+msgstr "Pasqyrë"
+
+#: editor/animation_bezier_editor.cpp
+msgid "Insert Key Here"
+msgstr "Vendos Key Këtu"
+
+#: editor/animation_bezier_editor.cpp
+msgid "Duplicate Selected Key(s)"
+msgstr "Dyfisho Key(s) të Selektuar"
+
+#: editor/animation_bezier_editor.cpp
+msgid "Delete Selected Key(s)"
+msgstr "Fshi Key(s) të Selektuar"
+
+#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
+msgid "Anim Duplicate Keys"
+msgstr ""
+
+#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
+msgid "Anim Delete Keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Keyframe Time"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Transition"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Transform"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Keyframe Value"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Change Call"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Property Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "3D Transform Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Call Method Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Bezier Curve Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Audio Playback Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation Playback Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Add Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation Length Time (seconds)"
+msgstr "Kohëzgjatja e Animacionit (sekonda)"
+
+#: editor/animation_track_editor.cpp
+msgid "Animation Looping"
+msgstr "Përsëritje Animacioni"
+
+#: editor/animation_track_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Functions:"
+msgstr "Funksionet:"
+
+#: editor/animation_track_editor.cpp
+msgid "Audio Clips:"
+msgstr "Klipe Audio:"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Clips:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Toggle this track on/off."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Update Mode (How this property is set)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Interpolation Mode"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Remove this track."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Time (s): "
+msgstr "Koha (s): "
+
+#: editor/animation_track_editor.cpp
+msgid "Continuous"
+msgstr "I vazhdueshëm:"
+
+#: editor/animation_track_editor.cpp
+msgid "Discrete"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Trigger"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Capture"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Nearest"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
+#: editor/property_editor.cpp
+msgid "Linear"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Cubic"
+msgstr "Kubik"
+
+#: editor/animation_track_editor.cpp
+msgid "Clamp Loop Interp"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Wrap Loop Interp"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key"
+msgstr "Vendos Key"
+
+#: editor/animation_track_editor.cpp
+msgid "Duplicate Key(s)"
+msgstr "Dyfisho Key(s)"
+
+#: editor/animation_track_editor.cpp
+msgid "Delete Key(s)"
+msgstr "Fshi Key(s)"
+
+#: editor/animation_track_editor.cpp
+msgid "Remove Anim Track"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Create NEW track for %s and insert key?"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Create %d NEW tracks and insert keys?"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/create_dialog.cpp
+#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
+#: editor/plugin_config_dialog.cpp
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
+msgid "Create"
+msgstr "Krijo"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "AnimationPlayer can't animate itself, only other players."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Create & Insert"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert Track & Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Insert Key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Transform tracks only apply to Spatial-based nodes."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid ""
+"Audio tracks can only point to nodes of type:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation tracks can only point to AnimationPlayer nodes."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "An animation player can't animate itself, only other players."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Not possible to add a new track without a root"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Track path is invalid, so can't add a key."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Track is not of type Spatial, can't insert key"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Track path is invalid, so can't add a method key."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Method not found in object: "
+msgstr "Metoda nuk u gjet në objekt: "
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Move Keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clipboard is empty"
+msgstr "Clipboard-i është bosh"
+
+#: editor/animation_track_editor.cpp
+msgid "Anim Scale Keys"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid ""
+"This option does not work for Bezier editing, as it's only a single track."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Only show tracks from nodes selected in tree."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Group tracks by node or display them as plain list."
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Snap (s): "
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Animation step value."
+msgstr "Vlera e hapit për animacionin."
+
+#: editor/animation_track_editor.cpp editor/editor_properties.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+#: editor/project_manager.cpp editor/project_settings_editor.cpp
+#: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp
+msgid "Edit"
+msgstr "Ndrysho"
+
+#: editor/animation_track_editor.cpp
+msgid "Animation properties."
+msgstr "Karakteristikat e animacionit."
+
+#: editor/animation_track_editor.cpp
+msgid "Copy Tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Paste Tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Scale Selection"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Scale From Cursor"
+msgstr ""
+
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Duplicate Selection"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Duplicate Transposed"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Delete Selection"
+msgstr "Fshi të Selektuarat"
+
+#: editor/animation_track_editor.cpp
+msgid "Go to Next Step"
+msgstr "Shko tek Hapi Tjetër"
+
+#: editor/animation_track_editor.cpp
+msgid "Go to Previous Step"
+msgstr "Shko tek Hapi i Mëparshëm"
+
+#: editor/animation_track_editor.cpp
+msgid "Optimize Animation"
+msgstr "Përmirëso Animacionin"
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up Animation"
+msgstr "Pastro Animacionin"
+
+#: editor/animation_track_editor.cpp
+msgid "Pick the node that will be animated:"
+msgstr "Zgjidh Node që do të animohet:"
+
+#: editor/animation_track_editor.cpp
+msgid "Use Bezier Curves"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Anim. Optimizer"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Max. Linear Error:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Max. Angular Error:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Max Optimizable Angle:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Optimize"
+msgstr "Përmirëso"
+
+#: editor/animation_track_editor.cpp
+msgid "Remove invalid keys"
+msgstr "Fshi keys të gabuar"
+
+#: editor/animation_track_editor.cpp
+msgid "Remove unresolved and empty tracks"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-up all animations"
+msgstr "Pastro të gjithë animacionet"
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up Animation(s) (NO UNDO!)"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Clean-Up"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Scale Ratio:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp
+msgid "Select tracks to copy:"
+msgstr ""
+
+#: editor/animation_track_editor.cpp editor/editor_properties.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Copy"
+msgstr ""
+
+#: editor/array_property_edit.cpp
+msgid "Resize Array"
+msgstr ""
+
+#: editor/array_property_edit.cpp
+msgid "Change Array Value Type"
+msgstr ""
+
+#: editor/array_property_edit.cpp
+msgid "Change Array Value"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Go to Line"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Line Number:"
+msgstr ""
+
+#: editor/code_editor.cpp editor/editor_help.cpp
+msgid "No Matches"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Replaced %d occurrence(s)."
+msgstr ""
+
+#: editor/code_editor.cpp editor/find_in_files.cpp
+msgid "Match Case"
+msgstr ""
+
+#: editor/code_editor.cpp editor/find_in_files.cpp
+msgid "Whole Words"
+msgstr ""
+
+#: editor/code_editor.cpp editor/rename_dialog.cpp
+msgid "Replace"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Replace All"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Selection Only"
+msgstr ""
+
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom In"
+msgstr ""
+
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Out"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Reset Zoom"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Warnings:"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Font Size:"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Line:"
+msgstr ""
+
+#: editor/code_editor.cpp
+msgid "Col:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Method in target Node must be specified!"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid ""
+"Target method not found! Specify a valid method or attach a script to target "
+"Node."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect To Node:"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
+#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
+msgid "Add"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/dependency_editor.cpp
+#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
+#: editor/project_settings_editor.cpp
+msgid "Remove"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Add Extra Call Argument:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Extra Call Arguments:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Path to Node:"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Make Function"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Deferred"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Oneshot"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/dependency_editor.cpp
+#: editor/export_template_manager.cpp editor/groups_editor.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_export.cpp
+#: editor/project_settings_editor.cpp editor/property_editor.cpp
+#: editor/run_settings_dialog.cpp editor/settings_config_dialog.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Close"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect '%s' to '%s'"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect '%s' from '%s'"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect all from signal: '%s'"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect..."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Disconnect"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Connect Signal: "
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Edit Connection: "
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr ""
+
+#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
+msgid "Signals"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Are you sure you want to remove all connections from this signal?"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Disconnect All"
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Edit..."
+msgstr ""
+
+#: editor/connections_dialog.cpp
+msgid "Go To Method"
+msgstr ""
+
+#: editor/create_dialog.cpp
+msgid "Change %s Type"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/project_settings_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change"
+msgstr ""
+
+#: editor/create_dialog.cpp
+msgid "Create New %s"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp
+msgid "Favorites:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/editor_file_dialog.cpp
+msgid "Recent:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Search:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Matches:"
+msgstr ""
+
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Description:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Search Replacement For:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Dependencies For:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid ""
+"Scene '%s' is currently being edited.\n"
+"Changes will not take effect unless reloaded."
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid ""
+"Resource '%s' is in use.\n"
+"Changes will take effect when reloaded."
+msgstr ""
+
+#: editor/dependency_editor.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Dependencies"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Resource"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
+msgid "Path"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Dependencies:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Fix Broken"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Dependency Editor"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Search Replacement Resource:"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
+#: modules/visual_script/visual_script_property_selector.cpp
+#: scene/gui/file_dialog.cpp
+msgid "Open"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Owners Of:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Remove selected files from the project? (no undo)"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid ""
+"The files being removed are required by other resources in order for them to "
+"work.\n"
+"Remove them anyway? (no undo)"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/export_template_manager.cpp
+msgid "Cannot remove:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Error loading:"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Load failed due to missing dependencies:"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_node.cpp
+msgid "Open Anyway"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Which action should be taken?"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Fix Dependencies"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Errors loading!"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Permanently delete %d item(s)? (No undo!)"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Owns"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Resources Without Explicit Ownership:"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_node.cpp
+msgid "Orphan Resource Explorer"
+msgstr ""
+
+#: editor/dependency_editor.cpp
+msgid "Delete selected files?"
+msgstr ""
+
+#: editor/dependency_editor.cpp editor/editor_audio_buses.cpp
+#: editor/editor_file_dialog.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/item_list_editor_plugin.cpp
+#: editor/project_export.cpp editor/project_settings_editor.cpp
+#: editor/scene_tree_dock.cpp
+msgid "Delete"
+msgstr ""
+
+#: editor/dictionary_property_edit.cpp
+msgid "Change Dictionary Key"
+msgstr ""
+
+#: editor/dictionary_property_edit.cpp
+msgid "Change Dictionary Value"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Thanks from the Godot community!"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Godot Engine contributors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Project Founders"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Lead Developer"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Project Manager "
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Developers"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Authors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Platinum Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Gold Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Mini Sponsors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Gold Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Silver Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Bronze Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Donors"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "License"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Thirdparty License"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid ""
+"Godot Engine relies on a number of thirdparty free and open source "
+"libraries, all compatible with the terms of its MIT license. The following "
+"is an exhaustive list of all such thirdparty components with their "
+"respective copyright statements and license terms."
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "All Components"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Components"
+msgstr ""
+
+#: editor/editor_about.cpp
+msgid "Licenses"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp editor/project_manager.cpp
+msgid "Error opening package file, not in zip format."
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+msgid "Uncompressing Assets"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp editor/project_manager.cpp
+msgid "Package installed successfully!"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Success!"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Install"
+msgstr ""
+
+#: editor/editor_asset_installer.cpp
+msgid "Package Installer"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Speakers"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Rename Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Change Audio Bus Volume"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Solo"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Mute"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Toggle Audio Bus Bypass Effects"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Select Audio Bus Send"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Audio Bus Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Move Bus Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Bus Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Audio Bus, Drag and Drop to rearrange."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Solo"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Mute"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Bypass"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Bus options"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Duplicate"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Reset Volume"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Effect"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Audio"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Master bus can't be deleted!"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Delete Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Duplicate Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Reset Bus Volume"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Move Audio Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Save Audio Bus Layout As..."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Location for New Layout..."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Open Audio Bus Layout"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "There is no 'res://default_bus_layout.tres' file."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Invalid file, not an audio bus layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Add Bus"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Create a new Bus Layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/editor_properties.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/property_editor.cpp
+#: editor/script_create_dialog.cpp
+msgid "Load"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Load an existing Bus Layout."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Save As"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Save this Bus Layout to a file."
+msgstr ""
+
+#: editor/editor_audio_buses.cpp editor/import_dock.cpp
+msgid "Load Default"
+msgstr ""
+
+#: editor/editor_audio_buses.cpp
+msgid "Load the default Bus Layout."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Valid characters:"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing engine class name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing buit-in type name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid name. Must not collide with an existing global constant name."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Autoload '%s' already exists!"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Rename Autoload"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Toggle AutoLoad Globals"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Move Autoload"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Remove Autoload"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Enable"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Rearrange Autoloads"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Invalid Path."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "File does not exist."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Not in resource path."
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Add AutoLoad"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
+msgid "Path:"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Node Name:"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
+msgid "Name"
+msgstr ""
+
+#: editor/editor_autoload_settings.cpp
+msgid "Singleton"
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "Updating Scene"
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "Storing local changes..."
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "Updating scene..."
+msgstr ""
+
+#: editor/editor_data.cpp editor/editor_properties.cpp
+msgid "[empty]"
+msgstr ""
+
+#: editor/editor_data.cpp
+msgid "[unsaved]"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp
+msgid "Please select a base directory first"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp
+msgid "Choose a Directory"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
+msgid "Create Folder"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp
+#: scene/gui/file_dialog.cpp
+msgid "Name:"
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
+#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
+msgid "Could not create folder."
+msgstr ""
+
+#: editor/editor_dir_dialog.cpp
+msgid "Choose"
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid "Storing File:"
+msgstr ""
+
+#: editor/editor_export.cpp
+msgid "Packing"
+msgstr ""
+
+#: editor/editor_export.cpp platform/javascript/export/export.cpp
+msgid "Template file not found:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "File Exists, Overwrite?"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select This Folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "Copy Path"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "Open in File Manager"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+#: editor/project_manager.cpp
+msgid "Show in File Manager"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
+msgid "New Folder..."
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Refresh"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "All Recognized"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "All Files (*)"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a File"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open File(s)"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a Directory"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Open a File or Directory"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/editor_node.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
+msgid "Save"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Save a File"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Back"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Forward"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Go Up"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Hidden Files"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Favorite"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Toggle Mode"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Focus Path"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Move Favorite Up"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp
+msgid "Move Favorite Down"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Go to parent folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Directories & Files:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
+#: editor/plugins/style_box_editor_plugin.cpp
+msgid "Preview:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "File:"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Must use a valid extension."
+msgstr ""
+
+#: editor/editor_file_system.cpp
+msgid "ScanSources"
+msgstr ""
+
+#: editor/editor_file_system.cpp
+msgid "(Re)Importing Assets"
+msgstr ""
+
+#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
+msgid "Top"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class:"
+msgstr ""
+
+#: editor/editor_help.cpp editor/scene_tree_editor.cpp
+msgid "Inherits:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Inherited by:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Brief Description:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Properties"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Methods"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Methods:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Theme Properties"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Theme Properties:"
+msgstr ""
+
+#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
+msgid "Signals:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Enumerations"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Enumerations:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "enum "
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Constants"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Constants:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class Description"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Online Tutorials:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid ""
+"There are currently no tutorials for this class, you can [color=$color][url="
+"$url]contribute one[/url][/color] or [color=$color][url=$url2]request one[/"
+"url][/color]."
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Property Descriptions"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Property Descriptions:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid ""
+"There is currently no description for this property. Please help us by "
+"[color=$color][url=$url]contributing one[/url][/color]!"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Method Descriptions"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Method Descriptions:"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid ""
+"There is currently no description for this method. Please help us by [color="
+"$color][url=$url]contributing one[/url][/color]!"
+msgstr ""
+
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr ""
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
+msgid "Set"
+msgstr ""
+
+#: editor/editor_inspector.cpp
+msgid "Set Multiple:"
+msgstr ""
+
+#: editor/editor_log.cpp
+msgid "Output:"
+msgstr ""
+
+#: editor/editor_log.cpp editor/editor_profiler.cpp
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/property_editor.cpp editor/scene_tree_dock.cpp
+#: editor/script_editor_debugger.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp scene/gui/line_edit.cpp
+#: scene/gui/text_edit.cpp
+msgid "Clear"
+msgstr ""
+
+#: editor/editor_log.cpp
+msgid "Clear Output"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Project export failed with error code %d."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Error saving resource!"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Save Resource As..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't open file for writing:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Requested file format unknown:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error while saving."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Can't open '%s'. The file could have been moved or deleted."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error while parsing '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unexpected end of file '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Missing '%s' or its dependencies."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error while loading '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Saving Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Analyzing"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Creating Thumbnail"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a tree root."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
+"be satisfied."
+msgstr ""
+
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't load MeshLibrary for merging!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error saving MeshLibrary!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't load TileSet for merging!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error saving TileSet!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Error trying to save layout!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Default editor layout overridden."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Layout name not found!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Restored default layout to base settings."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource belongs to a scene that was imported, so it's not editable.\n"
+"Please read the documentation relevant to importing scenes to better "
+"understand this workflow."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource belongs to a scene that was instanced or inherited.\n"
+"Changes to it will not be kept when saving the current scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This resource was imported, so it's not editable. Change its settings in the "
+"import panel and then re-import."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This scene was imported, so changes to it will not be kept.\n"
+"Instancing it or inheriting will allow making changes to it.\n"
+"Please read the documentation relevant to importing scenes to better "
+"understand this workflow."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This is a remote object so changes to it will not be kept.\n"
+"Please read the documentation relevant to debugging to better understand "
+"this workflow."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "There is no defined scene to run."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"No main scene has ever been defined, select one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' does not exist, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Selected scene '%s' is not a scene file, select a valid one?\n"
+"You can change it later in \"Project Settings\" under the 'application' "
+"category."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Current scene was never saved, please save it prior to running."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Could not start subprocess!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Base Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Open Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Open Script..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save & Close"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save changes to '%s' before closing?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save Scene As..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "No"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Yes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This scene has never been saved. Save before running?"
+msgstr ""
+
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "This operation can't be done without a scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export Mesh Library"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a root node."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export Tile Set"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This operation can't be done without a selected node."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Current scene not saved. Open anyway?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Can't reload a scene that was never saved."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Revert"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "This action cannot be undone. Revert anyway?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quick Run Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quit"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Exit the editor?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Project Manager?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save & Quit"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save changes to the following scene(s) before quitting?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save changes the following scene(s) before opening Project Manager?"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"This option is deprecated. Situations where refresh must be forced are now "
+"considered a bug. Please report."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Pick a Main Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to find script field for addon plugin at: 'res://addons/%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to load addon script from path: '%s'."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Unable to load addon script from path: '%s' Script is not in tool mode."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Scene '%s' was automatically imported, so it can't be modified.\n"
+"To make changes to it, a new inherited scene can be created."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Error loading scene, it must be inside the project path. Use 'Import' to "
+"open the scene, then save it inside the project path."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Scene '%s' has broken dependencies:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Clear Recent Scenes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save Layout"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Delete Layout"
+msgstr ""
+
+#: editor/editor_node.cpp editor/import_dock.cpp
+#: editor/script_create_dialog.cpp
+msgid "Default"
+msgstr ""
+
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play This Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Close Tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Switch Scene Tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "%d more files or folders"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "%d more folders"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "%d more files"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Dock Position"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Distraction Free Mode"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Toggle distraction-free mode."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Add a new scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Go to previously opened scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Next tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Previous tab"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Filter Files..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Operations with scene files."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "New Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "New Inherited Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Scene..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Save All Scenes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Close Scene"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Open Recent"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Convert To..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "MeshLibrary..."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "TileSet..."
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Undo"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Redo"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Revert Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Miscellaneous project or scene-wide tools."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Project"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Project Settings"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_export.cpp
+msgid "Export"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
+msgid "Tools"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Project Data Folder"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Quit to Project List"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
+msgid "Debug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Deploy with Remote Debug"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When exporting or deploying, the resulting executable will attempt to "
+"connect to the IP of this computer in order to be debugged."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Small Deploy with Network FS"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When this option is enabled, export or deploy will produce a minimal "
+"executable.\n"
+"The filesystem will be provided from the project by the editor over the "
+"network.\n"
+"On Android, deploy will use the USB cable for faster performance. This "
+"option speeds up testing for games with a large footprint."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Visible Collision Shapes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the "
+"running game if this option is turned on."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Visible Navigation"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"Navigation meshes and polygons will be visible on the running game if this "
+"option is turned on."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Sync Scene Changes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any changes made to the scene in the editor "
+"will be replicated in the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Sync Script Changes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
+"When this option is turned on, any script that is saved will be reloaded on "
+"the running game.\n"
+"When used remotely on a device, this is more efficient with network "
+"filesystem."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Editor"
+msgstr ""
+
+#: editor/editor_node.cpp editor/settings_config_dialog.cpp
+msgid "Editor Settings"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Editor Layout"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Toggle Fullscreen"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Editor Data/Settings Folder"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Editor Data Folder"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Editor Settings Folder"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_export.cpp
+msgid "Manage Export Templates"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Help"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/shader_editor_plugin.cpp editor/plugins/text_editor.cpp
+#: editor/project_settings_editor.cpp editor/rename_dialog.cpp
+msgid "Search"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Online Docs"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Q&A"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Issue Tracker"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
+msgid "Community"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "About"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play the project."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Pause the scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Pause Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Stop the scene."
+msgstr ""
+
+#: editor/editor_node.cpp editor/editor_profiler.cpp
+msgid "Stop"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play the edited scene."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play custom scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Play Custom Scene"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Changing the video driver requires restarting the editor."
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_settings_editor.cpp
+#: editor/settings_config_dialog.cpp
+msgid "Save & Restart"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Spins when the editor window repaints!"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Update Always"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Update Changes"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Disable Update Spinner"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
+#: editor/project_manager.cpp
+msgid "Import"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "FileSystem"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Expand Bottom Panel"
+msgstr ""
+
+#: editor/editor_node.cpp scene/resources/visual_shader.cpp
+msgid "Output"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Don't Save"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Import Templates From ZIP File"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_export.cpp
+msgid "Export Project"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Export Library"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Merge With Existing"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Password:"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open & Run a Script"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "New Inherited"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Load Errors"
+msgstr ""
+
+#: editor/editor_node.cpp editor/plugins/tile_map_editor_plugin.cpp
+msgid "Select"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open 2D Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open 3D Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open Script Editor"
+msgstr ""
+
+#: editor/editor_node.cpp editor/project_manager.cpp
+msgid "Open Asset Library"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open the next Editor"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Open the previous Editor"
+msgstr ""
+
+#: editor/editor_plugin.cpp
+msgid "Creating Mesh Previews"
+msgstr ""
+
+#: editor/editor_plugin.cpp
+msgid "Thumbnail..."
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Edit Plugin"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Installed Plugins:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+msgid "Update"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Version:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp editor/plugin_config_dialog.cpp
+msgid "Author:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Status:"
+msgstr ""
+
+#: editor/editor_plugin_settings.cpp
+msgid "Edit:"
+msgstr ""
+
+#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
+#: editor/rename_dialog.cpp
+msgid "Start"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Measure:"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Frame Time (sec)"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Average Time (sec)"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Frame %"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Physics Frame %"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Time:"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Inclusive"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Self"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Frame #:"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Time"
+msgstr ""
+
+#: editor/editor_profiler.cpp
+msgid "Calls"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "On"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Layer"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Bit %d, value %d"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "[Empty]"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Invalid RID"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Pick a Viewport"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "New Script"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "New %s"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Make Unique"
+msgstr ""
+
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
+msgid "Paste"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Convert To %s"
+msgstr ""
+
+#: editor/editor_properties.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Open Editor"
+msgstr ""
+
+#: editor/editor_properties.cpp editor/property_editor.cpp
+msgid "Selected node is not a Viewport!"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Size: "
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Page: "
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "New Key:"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "New Value:"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+msgid "Add Key/Value Pair"
+msgstr ""
+
+#: editor/editor_properties_array_dict.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Item"
+msgstr ""
+
+#: editor/editor_run_native.cpp
+msgid "Select device from the list"
+msgstr ""
+
+#: editor/editor_run_native.cpp
+msgid ""
+"No runnable export preset found for this platform.\n"
+"Please add a runnable preset in the export menu."
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Write your logic in the _run() method."
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "There is an edited scene already."
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Couldn't instance script:"
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Did you forget the 'tool' keyword?"
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Couldn't run script:"
+msgstr ""
+
+#: editor/editor_run_script.cpp
+msgid "Did you forget the '_run' method?"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp
+msgid "Select Node(s) to Import"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp
+msgid "Scene Path:"
+msgstr ""
+
+#: editor/editor_sub_scene.cpp
+msgid "Import From Node:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Re-Download"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Uninstall"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "(Installed)"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "(Missing)"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "(Current)"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Retrieving mirrors, please wait..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Remove template version '%s'?"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Can't open export templates zip."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Invalid version.txt format inside templates: %s."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "No version.txt found inside templates."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Error creating path for templates:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Extracting Export Templates"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Importing:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid ""
+"No download links found for this version. Direct download is only available "
+"for official releases."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't connect."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "No response."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request Failed."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Redirect Loop."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Failed:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Download Complete."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid ""
+"Templates installation failed. The problematic templates archives can be "
+"found at '%s'."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Error requesting url: "
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Connecting to Mirror..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Disconnected"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Resolving"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Can't Resolve"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Connecting..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Can't Connect"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Connected"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Requesting..."
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Downloading"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Connection Error"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "SSL Handshake Error"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Current Version:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Installed Versions:"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Install From File"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Remove Template"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Select template file"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Export Template Manager"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Download Templates"
+msgstr ""
+
+#: editor/export_template_manager.cpp
+msgid "Select mirror from list: (Shift+Click: Open in Browser)"
+msgstr ""
+
+#: editor/file_type_cache.cpp
+msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Cannot navigate to '%s' as it has not been found in the file system!"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "View items as a grid of thumbnails."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "View items as a list."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Status: Import of file failed. Please fix file and reimport manually."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Cannot move/rename resources root."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Cannot move a folder into itself."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Error moving:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Error duplicating:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Unable to update dependencies:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Provided name contains invalid characters"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Name contains invalid characters."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "A file or folder with this name already exists."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Renaming file:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Renaming folder:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicating file:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicating folder:"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Open Scene(s)"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Instance"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Add to favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Remove from favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Edit Dependencies..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "View Owners..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Duplicate..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+msgid "New Script..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "New Resource..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/project_manager.cpp editor/rename_dialog.cpp
+#: editor/scene_tree_dock.cpp
+msgid "Rename"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Previous Directory"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Next Directory"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Re-Scan Filesystem"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Toggle split mode"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Search files"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Instance the selected scene(s) as child of the selected node."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid ""
+"Scanning Files,\n"
+"Please Wait..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Move"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "There is already file or folder with the same name in this location."
+msgstr ""
+
+#: editor/filesystem_dock.cpp
+msgid "Overwrite"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+msgid "Create Script"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Find in Files"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Find:"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Folder:"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Filters:"
+msgstr ""
+
+#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+msgid "Find..."
+msgstr ""
+
+#: editor/find_in_files.cpp editor/plugins/script_text_editor.cpp
+msgid "Replace..."
+msgstr ""
+
+#: editor/find_in_files.cpp editor/progress_dialog.cpp scene/gui/dialogs.cpp
+msgid "Cancel"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Find: "
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Replace: "
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Replace all (no undo)"
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Searching..."
+msgstr ""
+
+#: editor/find_in_files.cpp
+msgid "Search complete"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Group name already exists."
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Invalid group name."
+msgstr ""
+
+#: editor/groups_editor.cpp editor/node_dock.cpp
+msgid "Groups"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Nodes not in Group"
+msgstr ""
+
+#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
+msgid "Filter nodes"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Nodes in Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Add to Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Remove from Group"
+msgstr ""
+
+#: editor/groups_editor.cpp
+msgid "Manage Groups"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Single Scene"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Materials"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Materials"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Materials+Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import with Separate Objects+Materials+Animations"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Multiple Scenes"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Import as Multiple Scenes+Materials"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Import Scene"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Importing Scene..."
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Generating Lightmaps"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Generating for Mesh: "
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Running Custom Script..."
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Couldn't load post-import script:"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Invalid/broken script for post-import (check console):"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Error running post-import script:"
+msgstr ""
+
+#: editor/import/resource_importer_scene.cpp
+msgid "Saving..."
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Set as Default for '%s'"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Clear Default for '%s'"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid " Files"
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Import As:"
+msgstr ""
+
+#: editor/import_dock.cpp editor/property_editor.cpp
+msgid "Preset..."
+msgstr ""
+
+#: editor/import_dock.cpp
+msgid "Reimport"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Failed to load resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Expand All Properties"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Collapse All Properties"
+msgstr ""
+
+#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save As..."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Copy Params"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Paste Params"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Edit Resource Clipboard"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Copy Resource"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Make Built-In"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Make Sub-Resources Unique"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Open in Help"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Create a new resource in memory and edit it."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Load an existing resource from disk and edit it."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Go to the previous edited object in history."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Go to the next edited object in history."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "History of recently edited objects."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Object properties."
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Filter properties"
+msgstr ""
+
+#: editor/inspector_dock.cpp
+msgid "Changes may be lost!"
+msgstr ""
+
+#: editor/multi_node_edit.cpp
+msgid "MultiNode Set"
+msgstr ""
+
+#: editor/node_dock.cpp
+msgid "Select a Node to edit Signals and Groups."
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Edit a Plugin"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Create a Plugin"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Plugin Name:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Subfolder:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Language:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Script Name:"
+msgstr ""
+
+#: editor/plugin_config_dialog.cpp
+msgid "Activate now?"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Edit Polygon"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Insert Point"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Edit Polygon (Remove Point)"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid "Remove Polygon And Point"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+msgid ""
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
+msgstr ""
+
+#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Animation"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Load..."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "This type of node can't be used. Only root nodes are allowed."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid ""
+"AnimationTree is inactive.\n"
+"Activate to enable playback, check node warnings if activation fails."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Set the blending position within the space"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Select and move points, create points with RMB."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Point"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Open Animation Node"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Triangle already exists"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "BlendSpace2D does not belong to an AnimationTree node."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "No triangles exist, so no blending can take place."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create triangles by connecting points."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Erase points and triangles."
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Generate blend triangles automatically (instead of manually)"
+msgstr ""
+
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Edit Filters"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Output node can't be added to the blend tree."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Unable to connect, port may be in use or connection may be invalid."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "No animation player set, so unable to retrieve track names."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Player path set is invalid, so unable to retrieve track names."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid ""
+"Animation player has no valid root node path, so unable to retrieve track "
+"names."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Add Node..."
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "Edit Filtered Tracks:"
+msgstr ""
+
+#: editor/plugins/animation_blend_tree_editor_plugin.cpp
+msgid "Enable filtering"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Toggle Autoplay"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Animation Name:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New Anim"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Animation Name:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Delete Animation?"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Remove Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Invalid animation name!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation name already exists!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Rename Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Next Changed"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Change Blend Time"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Load Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Duplicate Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation to copy!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation resource on clipboard!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pasted Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Paste Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "No animation to edit!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from current pos. (A)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation backwards from end. (Shift+A)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Stop animation playback. (S)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from start. (Shift+D)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Play selected animation from current pos. (D)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation position (in seconds)."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Scale animation playback globally for the node."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Tools"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "New"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Edit Transitions..."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Open in Inspector"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Display list of animations in player."
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Autoplay on Load"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Onion Skinning"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Enable Onion Skinning"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Directions"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Past"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Future"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Depth"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "1 step"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "2 steps"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "3 steps"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Differences Only"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Force White Modulate"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Include Gizmos (3D)"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Pin AnimationPlayer"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Create New Animation"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Animation Name:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/script_create_dialog.cpp
+msgid "Error!"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Blend Times:"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Next (Auto Queue):"
+msgstr ""
+
+#: editor/plugins/animation_player_editor_plugin.cpp
+msgid "Cross-Animation Blend Times"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "End"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Immediate"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Sync"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "At End"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Travel"
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Start and end nodes are needed for a sub-transition."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "No playback resource set at path: %s."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid ""
+"Select and move nodes.\n"
+"RMB to add new nodes.\n"
+"Shift+LMB to create connections."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Create new nodes."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Connect nodes."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Remove selected node or transition."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Toggle autoplay this animation on start, restart or seek to zero."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Set the end animation. This is useful for sub-transitions."
+msgstr ""
+
+#: editor/plugins/animation_state_machine_editor.cpp
+msgid "Transition: "
+msgstr ""
+
+#: editor/plugins/animation_tree_editor_plugin.cpp
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "AnimationTree"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "New name:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Scale:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Fade In (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Fade Out (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Mix"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Auto Restart:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Restart (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Random Restart (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Start!"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Amount:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend 0:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend 1:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "X-Fade Time (s):"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Current:"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Add Input"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Clear Auto-Advance"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Set Auto-Advance"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Delete Input"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation tree is valid."
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation tree is invalid."
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Animation Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "OneShot Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Mix Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend2 Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend3 Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend4 Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "TimeScale Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "TimeSeek Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Transition Node"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Import Animations..."
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Edit Node Filters"
+msgstr ""
+
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Filters..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Contents:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "View Files"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't resolve hostname:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Connection error, please try again."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Can't connect to host:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "No response from host:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, return code:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Request failed, too many redirects"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Bad download hash, assuming file has been tampered with."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Expected:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Got:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Failed sha256 hash check"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Asset Download Error:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Downloading (%s / %s)..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Downloading..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Resolving..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Error making request"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Idle"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Retry"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download Error"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Download for this asset is already in progress!"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "First"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Previous"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Next"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Last"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "All"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/project_settings_editor.cpp
+msgid "Plugins"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
+msgid "Sort:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Reverse"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/project_settings_editor.cpp
+msgid "Category:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Site:"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Support..."
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Official"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Testing"
+msgstr ""
+
+#: editor/plugins/asset_library_editor_plugin.cpp
+msgid "Assets ZIP File"
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid ""
+"Can't determine a save path for lightmap images.\n"
+"Save your scene (for images to be saved in the same dir), or pick a save "
+"path from the BakedLightmap properties."
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid ""
+"No meshes to bake. Make sure they contain an UV2 channel and that the 'Bake "
+"Light' flag is on."
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid "Failed creating lightmap images, make sure path is writable."
+msgstr ""
+
+#: editor/plugins/baked_lightmap_editor_plugin.cpp
+msgid "Bake Lightmaps"
+msgstr ""
+
+#: editor/plugins/camera_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
+msgid "Preview"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Configure Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Grid Offset:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Grid Step:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Offset:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotation Step:"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move vertical guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create new vertical guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Remove vertical guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move horizontal guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create new horizontal guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Remove horizontal guide"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Create new horizontal and vertical guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move pivot"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move anchor"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Resize CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Anchors only"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors and Margins"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change Anchors"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Paste Pose"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Select Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Drag: Rotate"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+Drag: Move"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Alt+RMB: Depth list selection"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Move Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Rotate Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Show a list of all objects at the position clicked\n"
+"(same as Alt+RMB in select mode)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Click to change object's rotation pivot."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Pan Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Toggle snapping."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snapping Options"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to grid"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Rotation Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Configure Snap..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap Relative"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Use Pixel Snap"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Smart snapping"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to parent"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to node anchor"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to node sides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to node center"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to other nodes"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Snap to guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Lock the selected object in place (can't be moved)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Unlock the selected object (can be moved)."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Makes sure the object's children are not selectable."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Restores the object's children's ability to be selected."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Bones"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make IK Chain"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear IK Chain"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Make Custom Bone(s) from Node(s)"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Custom Bones"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Show Grid"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Helpers"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Rulers"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Guides"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Origin"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Viewport"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Center Selection"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Frame Selection"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Layout"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert keys."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Insert Key (Existing Tracks)"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Copy Pose"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Clear Pose"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Multiply grid step by 2"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Divide grid step by 2"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Add %s"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Adding %s..."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Cannot instantiate multiple nodes without root."
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Create Node"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "Error instancing scene from %s"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Change default type"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid ""
+"Drag & drop + Shift : Add node as sibling\n"
+"Drag & drop + Alt : Change node type"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Create Polygon3D"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr ""
+
+#: editor/plugins/collision_shape_2d_editor_plugin.cpp
+msgid "Set Handle"
+msgstr ""
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+msgid "CPUParticles"
+msgstr ""
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emission Points From Mesh"
+msgstr ""
+
+#: editor/plugins/cpu_particles_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emission Points From Node"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Flat0"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Flat1"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Ease in"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Ease out"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Smoothstep"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Modify Curve Point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Modify Curve Tangent"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Load Curve Preset"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Add point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Remove point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Left linear"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Right linear"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Load preset"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Remove Curve Point"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Toggle Curve Linear Tangent"
+msgstr ""
+
+#: editor/plugins/curve_editor_plugin.cpp
+msgid "Hold Shift to edit tangents individually"
+msgstr ""
+
+#: editor/plugins/gi_probe_editor_plugin.cpp
+msgid "Bake GI Probe"
+msgstr ""
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Item %d"
+msgstr ""
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Items"
+msgstr ""
+
+#: editor/plugins/item_list_editor_plugin.cpp
+msgid "Item List Editor"
+msgstr ""
+
+#: editor/plugins/light_occluder_2d_editor_plugin.cpp
+msgid "Create Occluder Polygon"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh is empty!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Trimesh Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Static Convex Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "This doesn't work on scene root!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Shape"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Navigation Mesh"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Contained Mesh is not of type ArrayMesh."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "UV Unwrap failed, mesh may not be manifold?"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "No mesh to debug."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Model has no UV in this layer"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "MeshInstance lacks a Mesh!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh has not surface to create outlines from!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh primitive type is not PRIMITIVE_TRIANGLES!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Could not create outline!"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Mesh"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Static Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Static Body"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Trimesh Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Convex Collision Sibling"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh..."
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "View UV1"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "View UV2"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Unwrap UV2 for Lightmap/AO"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Create Outline Mesh"
+msgstr ""
+
+#: editor/plugins/mesh_instance_editor_plugin.cpp
+msgid "Outline Size:"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Remove item %d?"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add Item"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Remove Selected Item"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Import from Scene"
+msgstr ""
+
+#: editor/plugins/mesh_library_editor_plugin.cpp
+msgid "Update from Scene"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and no MultiMesh set in node)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No mesh source specified (and MultiMesh contains no Mesh)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (invalid path)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (not a MeshInstance)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh source is invalid (contains no Mesh resource)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "No surface source specified."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (invalid path)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no geometry)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Surface source is invalid (no faces)."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Parent has no solid faces to populate."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Couldn't map area."
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Source Mesh:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Select a Target Surface:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate Surface"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate MultiMesh"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Target Surface:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Source Mesh:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "X-Axis"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Y-Axis"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Z-Axis"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Mesh Up Axis:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Rotation:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Tilt:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Random Scale:"
+msgstr ""
+
+#: editor/plugins/multimesh_editor_plugin.cpp
+msgid "Populate"
+msgstr ""
+
+#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generating Visibility Rect"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Can only set point into a ParticlesMaterial process material"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Error loading image:"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "No pixels with transparency > 128 in image..."
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generate Visibility Rect"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Load Emission Mask"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Clear Emission Mask"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Particles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Generated Point Count:"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generation Time (sec):"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Emission Mask"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Capture from Pixel"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+msgid "Emission Colors"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Faces contain no area!"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "No faces!"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Node does not contain geometry (faces)."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Create Emitter"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Points:"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Surface Points"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Surface Points+Normal (Directed)"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Volume"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Emission Source: "
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "A processor material of type 'ParticlesMaterial' is required."
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generating AABB"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generate AABB"
+msgstr ""
+
+#: editor/plugins/particles_editor_plugin.cpp
+msgid "Generate Visibility AABB"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Point from Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove Out-Control from Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Remove In-Control from Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Add Point to Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Point in Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move In-Control in Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Move Out-Control in Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Select Points"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Shift+Drag: Select Control Points"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Click: Add Point"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Right Click: Delete Point"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Select Control Points (Shift+Drag)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Add Point (in empty space)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Delete Point"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Close Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp editor/plugins/theme_editor_plugin.cpp
+#: editor/project_export.cpp
+msgid "Options"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Mirror Handle Angles"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Mirror Handle Lengths"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Curve Point #"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Point Position"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve In Position"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Set Curve Out Position"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Path"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove Path Point"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove Out-Control Point"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Remove In-Control Point"
+msgstr ""
+
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/physical_bone_plugin.cpp
+msgid "Move joint"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Sync Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create UV Map"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon & UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Internal Vertex"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Remove Internal Vertex"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Add Custom Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Remove Custom Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Open Polygon 2D UV editor."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon 2D UV Editor"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Points"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygons"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Points"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Ctrl: Rotate"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift: Move All"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Shift+Ctrl: Scale"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Rotate Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Scale Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create a custom polygon. Enables custom polygon rendering."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint weights with specified intensity."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Unpaint weights with specified intensity."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Radius:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Polygon->UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "UV->Polygon"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Clear UV"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Settings"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Enable Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Configure Grid:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset X:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Offset Y:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step X:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Grid Step Y:"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Sync Bones to Polygon"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ERROR: Couldn't load resource!"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Add Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Rename Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Delete Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Resource clipboard is empty!"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "Paste Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_editor.cpp
+msgid "Instance:"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
+#: editor/scene_tree_editor.cpp
+msgid "Type:"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Load Resource"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
+msgid "ResourcePreloader"
+msgstr ""
+
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "AnimationTree has no path set to an AnimationPlayer"
+msgstr ""
+
+#: editor/plugins/root_motion_editor_plugin.cpp
+msgid "Path to AnimationPlayer is invalid"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Clear Recent Files"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close and save changes?"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error writing TextFile:"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error could not load file."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving file!"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error Saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error importing theme."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error Importing"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "New TextFile..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open File"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save File As..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme As..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid " Class Reference"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Toggle alphabetical sorting of the method list."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Sort"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Move Up"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Move Down"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Next script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Previous script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "File"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save All"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Soft Reload Script"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Copy Script Path"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "History Previous"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "History Next"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Reload Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Save Theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Docs"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close All"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Close Other Tabs"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+msgid "Run"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Toggle Scripts Panel"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#: editor/plugins/script_text_editor.cpp
+msgid "Find Next"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Step Over"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Step Into"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Break"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/script_editor_debugger.cpp
+msgid "Continue"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Keep Debugger Open"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Debug with External Editor"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Open Godot online documentation"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search the reference documentation."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Go to previous edited document."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Go to next edited document."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Discard"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid ""
+"The following files are newer on disk.\n"
+"What action should be taken?:"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Reload"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Resave"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp
+msgid "Debugger"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Results"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Line"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "(ignore)"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Only resources from filesystem can be dropped."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Lookup Symbol"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Pick Color"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Convert Case"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Uppercase"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Lowercase"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Capitalize"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Syntax Highlighter"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
+#: scene/gui/text_edit.cpp
+msgid "Cut"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
+#: scene/gui/text_edit.cpp
+msgid "Select All"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Delete Line"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Indent Left"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Indent Right"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Toggle Comment"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Fold/Unfold Line"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Fold All Lines"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Unfold All Lines"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Clone Down"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Complete Symbol"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Trim Trailing Whitespace"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Convert Indent to Spaces"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Convert Indent to Tabs"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Auto Indent"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Toggle Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Remove All Breakpoints"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Next Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Previous Breakpoint"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Find Previous"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Find in Files..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Line..."
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Contextual Help"
+msgstr ""
+
+#: editor/plugins/shader_editor_plugin.cpp
+msgid "Shader"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "This skeleton has no bones, create some children Bone2D nodes."
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Skeleton2D"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Make Rest Pose (From Bones)"
+msgstr ""
+
+#: editor/plugins/skeleton_2d_editor_plugin.cpp
+msgid "Set Bones to Rest Pose"
+msgstr ""
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Create physical bones"
+msgstr ""
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Skeleton"
+msgstr ""
+
+#: editor/plugins/skeleton_editor_plugin.cpp
+msgid "Create physical skeleton"
+msgstr ""
+
+#: editor/plugins/skeleton_ik_editor_plugin.cpp
+msgid "Play IK"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Orthogonal"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Aborted."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "X-Axis Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Y-Axis Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Z-Axis Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Plane Transform."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scaling: "
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translating: "
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotating %s degrees."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Keying is disabled (no key inserted)."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Animation Key Inserted."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Objects Drawn"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Material Changes"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Shader Changes"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Surface Changes"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Draw Calls"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Vertices"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "FPS"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Align with view"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "No parent to instance a child at."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
+msgid "This operation requires a single selected node."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Lock View Rotation"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Normal"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Wireframe"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Overdraw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Display Unshaded"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Environment"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Gizmos"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Information"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View FPS"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Half Resolution"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Audio Listener"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Doppler Enable"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Cinematic Preview"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Left"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Right"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Forward"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Backwards"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Up"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Down"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Freelook Speed Modifier"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "XForm Dialog"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Select Mode (Q)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid ""
+"Drag: Rotate\n"
+"Alt+Drag: Move\n"
+"Alt+RMB: Depth list selection"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Move Mode (W)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Mode (E)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Mode (R)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Coords"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Local Space Mode (%s)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Mode (%s)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Bottom View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Top View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rear View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Front View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Left View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Right View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Switch Perspective/Orthogonal view"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Insert Animation Key"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Origin"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Focus Selection"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Align Selection With View"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Tool Select"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Tool Move"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Tool Rotate"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Tool Scale"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Toggle Freelook"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap object to floor"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Dialog..."
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "1 Viewport"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "2 Viewports (Alt)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "3 Viewports (Alt)"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "4 Viewports"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Gizmos"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Origin"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Grid"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Settings"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap Settings"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate Snap:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate Snap (deg.):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale Snap (%):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Viewport Settings"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Perspective FOV (deg.):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Near:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Z-Far:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Change"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Translate:"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Rotate (deg.):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Scale (ratio):"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Transform Type"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pre"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Post"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Sprite is empty!"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Can't convert a sprite using animation frames to mesh."
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Invalid geometry, can't replace by mesh."
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Sprite"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Convert to 2D Mesh"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Create 2D Mesh"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Simplification: "
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Grow (Pixels): "
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Update Preview"
+msgstr ""
+
+#: editor/plugins/sprite_editor_plugin.cpp
+msgid "Settings:"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "ERROR: Couldn't load frame resource!"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Frame"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Resource clipboard is empty or not a texture!"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Paste Frame"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Add Empty"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation Loop"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Change Animation FPS"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "(empty)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animations"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Speed (FPS):"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Loop"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Animation Frames"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (Before)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Insert Empty (After)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Move (Before)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "Move (After)"
+msgstr ""
+
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+msgid "SpriteFrames"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Region Rect"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Snap Mode:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: scene/resources/visual_shader.cpp
+msgid "None"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Pixel Snap"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Grid Snap"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Auto Slice"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Offset:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Step:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Sep.:"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "TextureRegion"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Can't save theme to file:"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add All Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add All"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove All Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove All"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Edit theme..."
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Theme editing menu."
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Add Class Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Remove Class Items"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Template"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create Empty Editor Template"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Create From Current Editor Theme"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio1"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "CheckBox Radio2"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Check Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Radio Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Checked Radio Item"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Has"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Many"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Has,Many,Options"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 1"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 2"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Tab 3"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Data Type:"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Icon"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp editor/rename_dialog.cpp
+msgid "Style"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Font"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Color"
+msgstr ""
+
+#: editor/plugins/theme_editor_plugin.cpp
+msgid "Constant"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase Selection"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Fix Invalid Tiles"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Cut Selection"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint TileMap"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Line Draw"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rectangle Paint"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Bucket Fill"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Erase TileMap"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Find Tile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Transpose"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror X"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Mirror Y"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Paint Tile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Pick Tile"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Copy Selection"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate left"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate right"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Flip horizontally"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Flip vertically"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Clear transform"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Add Texture(s) to TileSet."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove selected Texture from TileSet."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from Scene"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from Scene"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Erase bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new polygon."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "You haven't selected a texture to remove."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Merge from scene?"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Texture"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Drag handles to edit Rect.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete selected Rect."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select current edited sub-tile.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete polygon."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to use as icon, this will be also used on invalid autotile "
+"bindings.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its priority.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Krijo"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Fshi keys të gabuar"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "This property can't be changed."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "TileSet"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Vertex"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Fragment"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "Light"
+msgstr ""
+
+#: editor/plugins/visual_shader_editor_plugin.cpp
+msgid "VisualShader"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Runnable"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Delete patch '%s' from list?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Delete preset '%s'?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export templates for this platform are missing/corrupted:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Presets"
+msgstr ""
+
+#: editor/project_export.cpp editor/project_settings_editor.cpp
+msgid "Add..."
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export Path"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Resources"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export all resources in the project"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export selected scenes (and dependencies)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export selected resources (and dependencies)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Resources to export:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid ""
+"Filters to export non-resource files (comma separated, e.g: *.json, *.txt)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid ""
+"Filters to exclude files from project (comma separated, e.g: *.json, *.txt)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Patches"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Make Patch"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Features"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Custom (comma-separated):"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Feature List:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export PCK/Zip"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export templates for this platform are missing:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export With Debug"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "The path does not exist."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Please choose an empty folder."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Please choose a 'project.godot' or '.zip' file."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Directory already contains a Godot project."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Imported Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Invalid Project Name."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Couldn't create folder."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "There is already a folder in this path with the specified name."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "It would be a good idea to name your project."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Invalid project path (changed anything?)."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Couldn't load project.godot in project path (error %d). It may be missing or "
+"corrupted."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Couldn't edit project.godot in project path."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Couldn't create project.godot in project path."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "The following files failed extraction from package:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Rename Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "New Game Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Import Existing Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Import & Edit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Create New Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Create & Edit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Install Project:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Install & Edit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Name:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Create folder"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Path:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Installation Path:"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Browse"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Unnamed Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Can't open project at '%s'."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Are you sure to open more than one project?"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Can't run project: no main scene defined.\n"
+"Please edit the project and set the main scene in \"Project Settings\" under "
+"the \"Application\" category."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Can't run project: Assets need to be imported.\n"
+"Please edit the project to trigger the initial import."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Are you sure to run more than one project?"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Remove project from the list? (Folder contents will not be modified)"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"Language changed.\n"
+"The UI will update next time the editor or project manager starts."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"You are about the scan %s folders for existing Godot projects. Do you "
+"confirm?"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project Manager"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Project List"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Scan"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Select a Folder to Scan"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "New Project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Templates"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Exit"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Restart Now"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid "Can't run project"
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"You don't currently have any projects.\n"
+"Would you like to explore the official example projects in the Asset Library?"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Key "
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joy Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joy Axis"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Mouse Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid ""
+"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
+"'\"'"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Action '%s' already exists!"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Rename Input Action Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Change Action deadzone"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Input Action Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "All Devices"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Device"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Shift+"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Alt+"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Control+"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Press a Key..."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Mouse Button Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Left Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Right Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Middle Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Up Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Down Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Left Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Right Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "X Button 1"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "X Button 2"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joypad Axis Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Axis"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Joypad Button Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Erase Input Action"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Erase Input Action Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Event"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Button"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Left Button."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Right Button."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Middle Button."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Up."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Wheel Down."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Global Property"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Select a setting item first!"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "No property '%s' exists."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Setting '%s' is internal, and it can't be deleted."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Delete Item"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid ""
+"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
+"'\"'."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Already existing"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Input Action"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Error saving settings."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Settings saved OK."
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Override for Feature"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Translation"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Translation"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Add Remapped Path"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Resource Remap Add Remap"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Change Resource Remap Language"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Resource Remap"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remove Resource Remap Option"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Changed Locale Filter"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Changed Locale Filter Mode"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Project Settings (project.godot)"
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "General"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Override For..."
+msgstr ""
+
+#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
+msgid "Editor must be restarted for changes to take effect"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Input Map"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Action:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Action"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Deadzone"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Device:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Index:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Localization"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Translations"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Translations:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remaps"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Resources:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Remaps by Locale:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Locale"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Locales Filter"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Show all locales"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Show only selected locales"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Filter mode:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "Locales:"
+msgstr ""
+
+#: editor/project_settings_editor.cpp
+msgid "AutoLoad"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Ease In"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Ease Out"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Zero"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Easing In-Out"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Easing Out-In"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "File..."
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Dir..."
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Assign"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Select Node"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Error loading file: Not a resource!"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Pick a Node"
+msgstr ""
+
+#: editor/property_editor.cpp
+msgid "Bit %d, val %d."
+msgstr ""
+
+#: editor/property_selector.cpp
+msgid "Select Property"
+msgstr ""
+
+#: editor/property_selector.cpp
+msgid "Select Virtual Method"
+msgstr ""
+
+#: editor/property_selector.cpp
+msgid "Select Method"
+msgstr ""
+
+#: editor/pvrtc_compress.cpp
+msgid "Could not execute PVRTC tool:"
+msgstr ""
+
+#: editor/pvrtc_compress.cpp
+msgid "Can't load back converted image using PVRTC tool:"
+msgstr ""
+
+#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Batch Rename"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Prefix"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Suffix"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Advanced options"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Substitute"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Node name"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Node's parent name, if available"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Node type"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Current scene name"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Root node name"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid ""
+"Sequential integer counter.\n"
+"Compare counter options."
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Per Level counter"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "If set the counter restarts for each group of child nodes"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Initial value for the counter"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Step"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Amount by which counter is incremented for each node"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Padding"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid ""
+"Minimum number of digits for the counter.\n"
+"Missing digits are padded with leading zeros."
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Regular Expressions"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Post-Process"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Keep"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "CamelCase to under_scored"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "under_scored to CamelCase"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Case"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "To Lowercase"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "To Uppercase"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Reset"
+msgstr ""
+
+#: editor/rename_dialog.cpp
+msgid "Error"
+msgstr ""
+
+#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Reparent Node"
+msgstr ""
+
+#: editor/reparent_dialog.cpp
+msgid "Reparent Location (Select new Parent):"
+msgstr ""
+
+#: editor/reparent_dialog.cpp
+msgid "Keep Global Transform"
+msgstr ""
+
+#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp
+msgid "Reparent"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Run Mode:"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Current Scene"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Main Scene"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Main Scene Arguments:"
+msgstr ""
+
+#: editor/run_settings_dialog.cpp
+msgid "Scene Run Settings"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "No parent to instance the scenes at."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Error loading scene from %s"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Cannot instance the scene '%s' because the current scene exists within one "
+"of its nodes."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Instance Scene(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Script"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "This operation can't be done on the tree root."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Move Node In Parent"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Move Nodes In Parent"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Duplicate Node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete Node(s)?"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can not perform with the root node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "This operation can't be done on instanced scenes."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Save New Scene As..."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Editable Children"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Load As Placeholder"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Make Local"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Create Root Node:"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "2D Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "3D Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "User Interface"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Custom Node"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes from a foreign scene!"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Can't operate on nodes the current scene inherits from!"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Attach Script"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Remove Node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Couldn't save new scene. Likely dependencies (instances) couldn't be "
+"satisfied."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Error saving scene."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Error duplicating scene to save it."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Sub-Resources"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Inheritance"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete Node(s)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Add Child Node"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Change Type"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Extend Script"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Make Scene Root"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Merge From Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp editor/script_editor_debugger.cpp
+msgid "Save Branch as Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Copy Node Path"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Delete (No Confirm)"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Add/Create a New Node"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid ""
+"Instance a scene file as a Node. Creates an inherited scene if no root node "
+"exists."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Attach a new or existing script for the selected node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear a script for the selected node."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Remote"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Local"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
+msgid "Clear Inheritance? (No Undo!)"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Toggle Visible"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Node configuration warning:"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node has connection(s) and group(s).\n"
+"Click to show signals dock."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node has connections.\n"
+"Click to show signals dock."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node is in group(s).\n"
+"Click to show groups dock."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp editor/script_create_dialog.cpp
+msgid "Open Script"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Node is locked.\n"
+"Click to unlock it."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"Children are not selectable.\n"
+"Click to make selectable."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Toggle Visibility"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid ""
+"AnimationPlayer is pinned.\n"
+"Click to unpin."
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Invalid node name, the following characters are not allowed:"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Rename Node"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Scene Tree (Nodes):"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Node Configuration Warning!"
+msgstr ""
+
+#: editor/scene_tree_editor.cpp
+msgid "Select a Node"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Error loading template '%s'"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Error - Could not create script in filesystem."
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Error loading script from %s"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "N/A"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Open Script/Choose Location"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Path is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Path is not local"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid base path"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Directory of the same name exists"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "File exists, will be reused"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid extension"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Wrong extension chosen"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid Path"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid class name"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Invalid inherited parent name or path"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Script valid"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Allowed: a-z, A-Z, 0-9 and _"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Built-in script (into scene file)"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Create new script file"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Load existing script file"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Language"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Inherits"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Class Name"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Template"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Built-in Script"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
+msgid "Attach Node Script"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Remote "
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Bytes:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Stack Trace"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Pick one or more items from the list to display the graph."
+msgstr ""
+
+#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp
+msgid "Errors"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Child Process Connected"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Copy Error"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Inspect Previous Instance"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Inspect Next Instance"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Stack Frames"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Profiler"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Monitor"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Value"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Monitors"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "List of Video Memory Usage by Resource:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Total:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Video Mem"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Resource Path"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Type"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Format"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Usage"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Misc"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Clicked Control:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Clicked Control Type:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Live Edit Root:"
+msgstr ""
+
+#: editor/script_editor_debugger.cpp
+msgid "Set From Tree"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Shortcuts"
+msgstr ""
+
+#: editor/settings_config_dialog.cpp
+msgid "Binding"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Light Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change AudioStreamPlayer3D Emission Angle"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Camera FOV"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Camera Size"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Notifier AABB"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Particles AABB"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Probe Extents"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
+msgid "Change Sphere Shape Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
+msgid "Change Box Shape Extents"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Capsule Shape Height"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Cylinder Shape Radius"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Cylinder Shape Height"
+msgstr ""
+
+#: editor/spatial_editor_gizmos.cpp
+msgid "Change Ray Shape Length"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Cylinder Radius"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Cylinder Height"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Torus Inner Radius"
+msgstr ""
+
+#: modules/csg/csg_gizmos.cpp
+msgid "Change Torus Outer Radius"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Select the dynamic library for this entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Select dependencies of the library for this entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Remove current entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Double click to create a new entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Platform:"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Platform"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Dynamic Library"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "Add an architecture entry"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_editor_plugin.cpp
+msgid "GDNativeLibrary"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Library"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Status"
+msgstr ""
+
+#: modules/gdnative/gdnative_library_singleton_editor.cpp
+msgid "Libraries: "
+msgstr ""
+
+#: modules/gdnative/register_types.cpp
+msgid "GDNative"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Step argument is zero!"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not a script with an instance"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not based on a script"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Not based on a resource file"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (missing @path)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (can't load script at @path)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary format (invalid script at @path)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Invalid instance dictionary (invalid subclasses)"
+msgstr ""
+
+#: modules/gdscript/gdscript_functions.cpp
+msgid "Object can't provide a length."
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Next Plane"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Previous Plane"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Plane:"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Next Floor"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Previous Floor"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Floor:"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Delete Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Fill Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Duplicate Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Grid Map"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Snap View"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Disabled"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Above"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clip Below"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit X Axis"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit Y Axis"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Edit Z Axis"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate X"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate Y"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Rotate Z"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate X"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate Y"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Back Rotate Z"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Cursor Clear Rotation"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Create Area"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Create Exterior Connector"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Erase Area"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Clear Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Fill Selection"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "GridMap Settings"
+msgstr ""
+
+#: modules/gridmap/grid_map_editor_plugin.cpp
+msgid "Pick Distance:"
+msgstr ""
+
+#: modules/mono/csharp_script.cpp
+msgid "Class name can't be a reserved keyword"
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Generating solution..."
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Generating C# project..."
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Failed to create solution."
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Failed to save solution."
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Done"
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Failed to create C# project."
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Mono"
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "About C# support"
+msgstr ""
+
+#: modules/mono/editor/godotsharp_editor.cpp
+msgid "Create C# solution"
+msgstr ""
+
+#: modules/mono/editor/mono_bottom_panel.cpp
+msgid "Builds"
+msgstr ""
+
+#: modules/mono/editor/mono_bottom_panel.cpp
+msgid "Build Project"
+msgstr ""
+
+#: modules/mono/editor/mono_bottom_panel.cpp
+msgid "Warnings"
+msgstr ""
+
+#: modules/mono/editor/mono_bottom_panel.cpp
+msgid "View log"
+msgstr ""
+
+#: modules/mono/mono_gd/gd_mono_utils.cpp
+msgid "End of inner exception stack trace"
+msgstr ""
+
+#: modules/recast/navigation_mesh_editor_plugin.cpp
+msgid "Bake NavMesh"
+msgstr ""
+
+#: modules/recast/navigation_mesh_editor_plugin.cpp
+msgid "Clear the navigation mesh."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Setting up Configuration..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Calculating grid size..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating heightfield..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Marking walkable triangles..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Constructing compact heightfield..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Eroding walkable area..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Partitioning..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating contours..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Creating polymesh..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Converting to native navigation mesh..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Navigation Mesh Generator Setup:"
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Parsing Geometry..."
+msgstr ""
+
+#: modules/recast/navigation_mesh_generator.cpp
+msgid "Done!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"A node yielded without working memory, please read the docs on how to yield "
+"properly!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Node yielded, but did not return a function state in the first working "
+"memory."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid ""
+"Return value must be assigned to first element of node working memory! Fix "
+"your node please."
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Node returned an invalid sequence output: "
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Found sequence bit but not the node in the stack, report bug!"
+msgstr ""
+
+#: modules/visual_script/visual_script.cpp
+msgid "Stack overflow with stack depth: "
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Signal Arguments"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Argument Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Argument name"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Set Variable Default Value"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Set Variable Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Variables:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name is not a valid identifier:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Name already in use by another func/var/signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Rename Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Expression"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove VisualScript Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Duplicate VisualScript Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a simple reference to the node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold %s to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Hold Ctrl to drop a Variable Setter."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Preload Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Node(s) From Tree"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Getter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Add Setter Property"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Base Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Move Node(s)"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove VisualScript Node"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Node Data"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Connect Node Sequence"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Script already has function '%s'"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Change Input Value"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Can't copy the function node."
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Clipboard is empty!"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste VisualScript Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Function"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Variable"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Remove Signal"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Editing Signal:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Base Type:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Available Nodes:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Select or create a function to edit graph"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Signal Arguments:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Variable:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Delete Selected"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Find Node Type"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Copy Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Cut Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Paste Nodes"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
+msgid "Edit Member"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Input type not iterable: "
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid"
+msgstr ""
+
+#: modules/visual_script/visual_script_flow_control.cpp
+msgid "Iterator became invalid: "
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name."
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Base object is not a Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Path does not lead Node!"
+msgstr ""
+
+#: modules/visual_script/visual_script_func_nodes.cpp
+msgid "Invalid index property name '%s' in node %s."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid argument of type: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ": Invalid arguments: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableGet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "VariableSet not found in script: "
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid "Custom node has no _step() method, can't process graph."
+msgstr ""
+
+#: modules/visual_script/visual_script_nodes.cpp
+msgid ""
+"Invalid return value from _step(), must be integer (seq out), or string "
+"(error)."
+msgstr ""
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Search VisualScript"
+msgstr ""
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Get %s"
+msgstr ""
+
+#: modules/visual_script/visual_script_property_selector.cpp
+msgid "Set %s"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Run in Browser"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Run exported HTML in the system's default browser."
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not write file:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not open template for export:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Invalid export template:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not read custom HTML shell:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Could not read boot splash image file:"
+msgstr ""
+
+#: platform/javascript/export/export.cpp
+msgid "Using default boot splash image."
+msgstr ""
+
+#: scene/2d/animated_sprite.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite to display frames."
+msgstr ""
+
+#: scene/2d/canvas_modulate.cpp
+msgid ""
+"Only one visible CanvasModulate is allowed per scene (or set of instanced "
+"scenes). The first created one will work, while the rest will be ignored."
+msgstr ""
+
+#: scene/2d/collision_object_2d.cpp
+msgid ""
+"This node has no shape, so it can't collide or interact with other objects.\n"
+"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
+"define its shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid ""
+"CollisionPolygon2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_polygon_2d.cpp
+msgid "An empty CollisionPolygon2D has no effect on collision."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"CollisionShape2D only serves to provide a collision shape to a "
+"CollisionObject2D derived node. Please only use it as a child of Area2D, "
+"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."
+msgstr ""
+
+#: scene/2d/collision_shape_2d.cpp
+msgid ""
+"A shape must be provided for CollisionShape2D to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
+#: scene/2d/light_2d.cpp
+msgid ""
+"A texture with the shape of the light must be supplied to the 'texture' "
+"property."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid ""
+"An occluder polygon must be set (or drawn) for this occluder to take effect."
+msgstr ""
+
+#: scene/2d/light_occluder_2d.cpp
+msgid "The occluder polygon for this occluder is empty. Please draw a polygon!"
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"A NavigationPolygon resource must be set or created for this node to work. "
+"Please set a property or draw a polygon."
+msgstr ""
+
+#: scene/2d/navigation_polygon.cpp
+msgid ""
+"NavigationPolygonInstance must be a child or grandchild to a Navigation2D "
+"node. It only provides navigation data."
+msgstr ""
+
+#: scene/2d/parallax_layer.cpp
+msgid ""
+"ParallaxLayer node only works when set as child of a ParallaxBackground node."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp scene/3d/particles.cpp
+msgid ""
+"A material to process the particles is not assigned, so no behavior is "
+"imprinted."
+msgstr ""
+
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
+#: scene/2d/path_2d.cpp
+msgid "PathFollow2D only works when set as a child of a Path2D node."
+msgstr ""
+
+#: scene/2d/physics_body_2d.cpp
+msgid ""
+"Size changes to RigidBody2D (in character or rigid modes) will be overridden "
+"by the physics engine when running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+
+#: scene/2d/remote_transform_2d.cpp
+msgid "Path property must point to a valid Node2D node to work."
+msgstr ""
+
+#: scene/2d/skeleton_2d.cpp
+msgid "This Bone2D chain should end at a Skeleton2D node."
+msgstr ""
+
+#: scene/2d/skeleton_2d.cpp
+msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
+msgstr ""
+
+#: scene/2d/skeleton_2d.cpp
+msgid ""
+"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
+msgstr ""
+
+#: scene/2d/visibility_notifier_2d.cpp
+msgid ""
+"VisibilityEnable2D works best when used with the edited scene root directly "
+"as parent."
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRCamera must have an ARVROrigin node as its parent"
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRController must have an ARVROrigin node as its parent"
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid ""
+"The controller id must not be 0 or this controller will not be bound to an "
+"actual controller"
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVRAnchor must have an ARVROrigin node as its parent"
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid ""
+"The anchor id must not be 0 or this anchor will not be bound to an actual "
+"anchor"
+msgstr ""
+
+#: scene/3d/arvr_nodes.cpp
+msgid "ARVROrigin requires an ARVRCamera child node"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "%d%%"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "(Time Left: %d:%02d s)"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Plotting Meshes: "
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Plotting Lights:"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp
+msgid "Finishing Plot"
+msgstr ""
+
+#: scene/3d/baked_lightmap.cpp
+msgid "Lighting Meshes: "
+msgstr ""
+
+#: scene/3d/collision_object.cpp
+msgid ""
+"This node has no shape, so it can't collide or interact with other objects.\n"
+"Consider adding a CollisionShape or CollisionPolygon as a child to define "
+"its shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid ""
+"CollisionPolygon only serves to provide a collision shape to a "
+"CollisionObject derived node. Please only use it as a child of Area, "
+"StaticBody, RigidBody, KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_polygon.cpp
+msgid "An empty CollisionPolygon has no effect on collision."
+msgstr ""
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"CollisionShape only serves to provide a collision shape to a CollisionObject "
+"derived node. Please only use it as a child of Area, StaticBody, RigidBody, "
+"KinematicBody, etc. to give them a shape."
+msgstr ""
+
+#: scene/3d/collision_shape.cpp
+msgid ""
+"A shape must be provided for CollisionShape to function. Please create a "
+"shape resource for it!"
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
+#: scene/3d/gi_probe.cpp
+msgid "Plotting Meshes"
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid "A NavigationMesh resource must be set or created for this node to work."
+msgstr ""
+
+#: scene/3d/navigation_mesh.cpp
+msgid ""
+"NavigationMeshInstance must be a child or grandchild to a Navigation node. "
+"It only provides navigation data."
+msgstr ""
+
+#: scene/3d/particles.cpp
+msgid ""
+"Nothing is visible because meshes have not been assigned to draw passes."
+msgstr ""
+
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
+#: scene/3d/physics_body.cpp
+msgid ""
+"Size changes to RigidBody (in character or rigid modes) will be overridden "
+"by the physics engine when running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+
+#: scene/3d/remote_transform.cpp
+msgid "Path property must point to a valid Spatial node to work."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid "WorldEnvironment needs an Environment resource."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."
+msgstr ""
+
+#: scene/3d/scenario_fx.cpp
+msgid ""
+"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set "
+"this environment's Background Mode to Canvas (for 2D scenes)."
+msgstr ""
+
+#: scene/3d/soft_body.cpp
+msgid "This body will be ignored until you set a mesh"
+msgstr ""
+
+#: scene/3d/soft_body.cpp
+msgid ""
+"Size changes to SoftBody will be overridden by the physics engine when "
+"running.\n"
+"Change the size in children collision shapes instead."
+msgstr ""
+
+#: scene/3d/sprite_3d.cpp
+msgid ""
+"A SpriteFrames resource must be created or set in the 'Frames' property in "
+"order for AnimatedSprite3D to display frames."
+msgstr ""
+
+#: scene/3d/vehicle_body.cpp
+msgid ""
+"VehicleWheel serves to provide a wheel system to a VehicleBody. Please use "
+"it as a child of a VehicleBody."
+msgstr ""
+
+#: scene/animation/animation_blend_tree.cpp
+msgid "On BlendTree node '%s', animation not found: '%s'"
+msgstr ""
+
+#: scene/animation/animation_blend_tree.cpp
+msgid "Animation not found: '%s'"
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "In node '%s', invalid animation: '%s'."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Invalid animation: '%s'."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Nothing connected to input '%s' of node '%s'."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "A root AnimationNode for the graph is not set."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Path to an AnimationPlayer node containing animations is not set."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
+msgstr ""
+
+#: scene/animation/animation_tree.cpp
+msgid "AnimationPlayer root is not a valid node."
+msgstr ""
+
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
+#: scene/gui/color_picker.cpp
+msgid "Raw Mode"
+msgstr ""
+
+#: scene/gui/color_picker.cpp
+msgid "Add current color as a preset"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Alert!"
+msgstr ""
+
+#: scene/gui/dialogs.cpp
+msgid "Please Confirm..."
+msgstr ""
+
+#: scene/gui/popup.cpp
+msgid ""
+"Popups will hide by default unless you call popup() or any of the popup*() "
+"functions. Making them visible for editing is fine though, but they will "
+"hide upon running."
+msgstr ""
+
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
+#: scene/gui/scroll_container.cpp
+msgid ""
+"ScrollContainer is intended to work with a single child control.\n"
+"Use a container as child (VBox,HBox,etc), or a Control and set the custom "
+"minimum size manually."
+msgstr ""
+
+#: scene/gui/tree.cpp
+msgid "(Other)"
+msgstr ""
+
+#: scene/main/scene_tree.cpp
+msgid ""
+"Default Environment as specified in Project Settings (Rendering -> "
+"Environment -> Default Environment) could not be loaded."
+msgstr ""
+
+#: scene/main/viewport.cpp
+msgid ""
+"This viewport is not set as render target. If you intend for it to display "
+"its contents directly to the screen, make it a child of a Control so it can "
+"obtain a size. Otherwise, make it a RenderTarget and assign its internal "
+"texture to some node for display."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+msgid "Error initializing FreeType."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+msgid "Unknown font format."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+msgid "Error loading font."
+msgstr ""
+
+#: scene/resources/dynamic_font.cpp
+msgid "Invalid font size."
+msgstr ""
+
+#: scene/resources/visual_shader.cpp
+msgid "Input"
+msgstr ""
+
+#: scene/resources/visual_shader_nodes.cpp
+msgid "Invalid source for shader."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Assignment to function."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Assignment to uniform."
+msgstr ""
+
+#: servers/visual/shader_language.cpp
+msgid "Varyings can only be assigned in vertex function."
+msgstr ""
diff --git a/editor/translations/sr_Cyrl.po b/editor/translations/sr_Cyrl.po
index aa41c3e609..6370ea4abd 100644
--- a/editor/translations/sr_Cyrl.po
+++ b/editor/translations/sr_Cyrl.po
@@ -1,6 +1,6 @@
# Serbian (cyrillic) translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# ÐлекÑандар Урошевић <nicecubedude@gmail.com>, 2017.
@@ -25,7 +25,7 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr ""
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
@@ -269,7 +269,6 @@ msgstr "Ðаправите %d нових трака и убаците кључе
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -403,8 +402,7 @@ msgstr "Увећај одабрано"
msgid "Scale From Cursor"
msgstr "Увећај од курÑора"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Дуплирај одабрано"
@@ -418,11 +416,13 @@ msgid "Delete Selection"
msgstr "Центрирај одабрано"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+#, fuzzy
+msgid "Go to Next Step"
msgstr "Идите на Ñледећи корак"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+#, fuzzy
+msgid "Go to Previous Step"
msgstr "Идите на претходни корак"
#: editor/animation_track_editor.cpp
@@ -525,11 +525,11 @@ msgstr "Ðема подудара"
msgid "Replaced %d occurrence(s)."
msgstr "Замени %d појаве/а."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Подударање великих и малих Ñлова"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "Целе речи"
@@ -545,15 +545,19 @@ msgstr "Замени Ñве"
msgid "Selection Only"
msgstr "Само одабрано"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Увеличај"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "Умањи"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "РеÑетуј увеличање"
@@ -563,10 +567,10 @@ msgstr ""
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "Увеличај"
+msgid "Font Size:"
+msgstr "Поглед иÑпред"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Линија:"
@@ -599,6 +603,7 @@ msgstr "Додај"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -680,7 +685,7 @@ msgid "Edit Connection: "
msgstr "Повезивање не уÑпешно"
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -731,23 +736,20 @@ msgid "Recent:"
msgstr "ЧеÑте:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Тражи:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "Подударање:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "ОпиÑ:"
@@ -786,8 +788,7 @@ msgid "Resource"
msgstr "РеÑурÑ"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "Пут"
@@ -808,9 +809,10 @@ msgid "Search Replacement Resource:"
msgstr "Потражи замену за реÑурÑ:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -843,7 +845,8 @@ msgid "Error loading:"
msgstr "Грешка при учитавању:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+#, fuzzy
+msgid "Load failed due to missing dependencies:"
msgstr "Сцена је неуÑпешно очитана због недоÑтајућих завиÑноÑти:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -902,14 +905,6 @@ msgstr "Промени вредноÑÑ‚ речника"
msgid "Thanks from the Godot community!"
msgstr "Хвала од Godot заједнице!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr ""
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Godot Engine Ñарадници"
@@ -1004,7 +999,8 @@ msgid "Uncompressing Assets"
msgstr "ДекомпреÑија ÑредÑтва"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+#, fuzzy
+msgid "Package installed successfully!"
msgstr "Пакет је инÑталиран уÑпешно!"
#: editor/editor_asset_installer.cpp
@@ -1087,8 +1083,7 @@ msgid "Bus options"
msgstr "ПоÑтавке баÑа"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "Дуплирај"
@@ -1247,7 +1242,7 @@ msgid "Add AutoLoad"
msgstr "Додај аутоматÑко учитавање"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "Пут:"
@@ -1255,8 +1250,8 @@ msgstr "Пут:"
msgid "Node Name:"
msgstr "Име чвора:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "Име"
@@ -1328,12 +1323,17 @@ msgid "Template file not found:"
msgstr "ШаблонÑка датотека није пронађена:\n"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Одабери тренутни директоријум"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "Датотека поÑтоји, препиши?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "Одабери тренутни директоријум"
+#, fuzzy
+msgid "Select This Folder"
+msgstr "Одабери овај директоријум"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
@@ -1341,12 +1341,13 @@ msgstr "Копирај пут"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr "Покажи у менаџеру датотека"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+#, fuzzy
+msgid "Show in File Manager"
msgstr "Покажи у менаџеру датотека"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1382,7 +1383,8 @@ msgid "Open a File or Directory"
msgstr "Отвори датотеку или директоријум"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Сачувај"
@@ -1440,8 +1442,7 @@ msgstr "Директоријуми и датотеке:"
msgid "Preview:"
msgstr "Преглед:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "Датотека:"
@@ -1457,24 +1458,11 @@ msgstr "Скенирање извора"
msgid "(Re)Importing Assets"
msgstr "(Поновно) Увожење ÑредÑтава"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "Потражи помоћ"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "ЛиÑта клаÑа:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "Потражи клаÑе"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "Врх"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "КлаÑа:"
@@ -1491,28 +1479,31 @@ msgid "Brief Description:"
msgstr "Кратак опиÑ:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "Чланови"
+msgid "Properties"
+msgstr "ОÑобине"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "Чланови:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "Јавне методе"
+msgid "Methods"
+msgstr "Методе"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "Јавне методе:"
+#, fuzzy
+msgid "Methods:"
+msgstr "Методе"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "Ставке теме графичког интерфејÑа"
+#, fuzzy
+msgid "Theme Properties"
+msgstr "ОÑобине"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "Ставке теме графичког интерфејÑа:"
+#, fuzzy
+msgid "Theme Properties:"
+msgstr "ОÑобине"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1539,11 +1530,17 @@ msgid "Constants:"
msgstr "КонÑтанте:"
#: editor/editor_help.cpp
-msgid "Description"
+#, fuzzy
+msgid "Class Description"
msgstr "ОпиÑ"
#: editor/editor_help.cpp
#, fuzzy
+msgid "Class Description:"
+msgstr "ОпиÑ:"
+
+#: editor/editor_help.cpp
+#, fuzzy
msgid "Online Tutorials:"
msgstr "Онлајн документација"
@@ -1558,11 +1555,13 @@ msgstr ""
"$color][url=$url]напиÑати једну[/url][/color]!"
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "ОÑобине"
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "ÐžÐ¿Ð¸Ñ Ð¾Ñобине:"
#: editor/editor_help.cpp
-msgid "Property Description:"
+#, fuzzy
+msgid "Property Descriptions:"
msgstr "ÐžÐ¿Ð¸Ñ Ð¾Ñобине:"
#: editor/editor_help.cpp
@@ -1574,11 +1573,13 @@ msgstr ""
"$color][url=$url]напиÑати једну[/url][/color]!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "Методе"
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "ÐžÐ¿Ð¸Ñ Ð¼ÐµÑ‚Ð¾Ð´Ðµ:"
#: editor/editor_help.cpp
-msgid "Method Description:"
+#, fuzzy
+msgid "Method Descriptions:"
msgstr "ÐžÐ¿Ð¸Ñ Ð¼ÐµÑ‚Ð¾Ð´Ðµ:"
#: editor/editor_help.cpp
@@ -1589,12 +1590,61 @@ msgstr ""
"Тренутно нема опиÑа ове методе. Молимо помозите нама тако што ћете [color="
"$color][url=$url]напиÑати једну[/url][/color]!"
-#: editor/editor_inspector.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Потражи помоћ"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Display All"
+msgstr "Прикажи нормалу"
+
+#: editor/editor_help_search.cpp
#, fuzzy
-msgid "Property: "
+msgid "Classes Only"
+msgstr "КлаÑе"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Methods Only"
+msgstr "Методе"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "Сигнали"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Constants Only"
+msgstr "КонÑтанте"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Properties Only"
msgstr "ОÑобине"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Theme Properties Only"
+msgstr "ОÑобине"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Member Type"
+msgstr "Чланови"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Class"
+msgstr "КлаÑа:"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1629,6 +1679,11 @@ msgstr ""
msgid "Error saving resource!"
msgstr "Грешка при чувању реÑурÑа!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "Сачувај реÑÑƒÑ€Ñ ÐºÐ°Ð¾..."
@@ -1682,12 +1737,22 @@ msgid "This operation can't be done without a tree root."
msgstr "Ова операција Ñе не може обавити без корена дрвета."
#: editor/editor_node.cpp
+msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
#, fuzzy
msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr "Ðе могу Ñачувати Ñцену. Вероватно завиÑноÑти ниÑу задовољене."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr "Ðе могу учитати MeshLibrary за Ñпајање!"
@@ -1939,6 +2004,15 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "ÐеуÑпех при учитавању Ñкриптице додатка Ñа путем „%s“."
#: editor/editor_node.cpp
+#, fuzzy
+msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"ÐеуÑпех при учитавању Ñкриптице додатка Ñа путем „%s“. Скриптица није у "
+"режиму алатке."
+
+#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1989,6 +2063,12 @@ msgstr "Обирши раÑпоред"
msgid "Default"
msgstr "Уобичајено"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+#, fuzzy
+msgid "Show in FileSystem"
+msgstr "Покажи у менаџеру датотека"
+
#: editor/editor_node.cpp
#, fuzzy
msgid "Play This Scene"
@@ -2072,7 +2152,8 @@ msgid "Save Scene"
msgstr "Сачувај Ñцену"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+#, fuzzy
+msgid "Save All Scenes"
msgstr "Сачувај Ñве Ñцене"
#: editor/editor_node.cpp
@@ -2101,7 +2182,7 @@ msgid "Undo"
msgstr "Опозови"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Поново уради"
@@ -2125,7 +2206,7 @@ msgstr "ПоÑтавке пројекта"
msgid "Export"
msgstr "Извоз"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "Ðлати"
@@ -2139,6 +2220,7 @@ msgid "Quit to Project List"
msgstr "Изађи у лиÑту пројекта"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "Дебаг"
@@ -2267,10 +2349,6 @@ msgstr "Управљај извозним шаблонима"
msgid "Help"
msgstr "Помоћ"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "КлаÑе"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2365,24 +2443,24 @@ msgstr "Ðжурирај промене"
msgid "Disable Update Spinner"
msgstr "ИÑкључи индикатор ажурирања"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "ИнÑпектор"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "Увоз"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "Чвор"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "Датотечни ÑиÑтем"
#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr "ИнÑпектор"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Чвор"
+
+#: editor/editor_node.cpp
#, fuzzy
msgid "Expand Bottom Panel"
msgstr "Прошири Ñве"
@@ -2520,7 +2598,7 @@ msgstr "Слика %"
msgid "Physics Frame %"
msgstr "Слика физике %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "Време:"
@@ -2546,7 +2624,7 @@ msgstr "Време:"
msgid "Calls"
msgstr "Позиви цртања"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2558,21 +2636,45 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
#, fuzzy
msgid "[Empty]"
msgstr "Додај празан"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "Ðеважеће име."
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr ""
@@ -2584,10 +2686,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2596,7 +2694,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "Ðалепи"
@@ -2891,6 +2990,11 @@ msgstr ""
"кеш(cache) типа!"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "Омиљене:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr "ÐеуÑпех навигације у „%s“ пошто није пронађен у датотечном ÑиÑтему!"
@@ -2936,19 +3040,15 @@ msgstr "Грешка при учитавању:"
msgid "Unable to update dependencies:"
msgstr "Ðије могуће ажурирати завиÑноÑти:\n"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "Име није дато"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "Име није дато."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "Дато име Ñадржи неважећа Ñлова"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "Име није дато."
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "Дато име Ñадржи неважећа Ñлова."
@@ -2975,22 +3075,6 @@ msgid "Duplicating folder:"
msgstr "Преименовање директоријума:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "Прошири Ñве"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "Умањи Ñве"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "Преименуј..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "Помери у..."
-
-#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Open Scene(s)"
msgstr "Отвори Ñцену"
@@ -3000,6 +3084,16 @@ msgid "Instance"
msgstr "Додај инÑтанцу"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Add to favorites"
+msgstr "Омиљене:"
+
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Remove from favorites"
+msgstr "Обриши из групе"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "Измени завиÑноÑти..."
@@ -3007,12 +3101,20 @@ msgstr "Измени завиÑноÑти..."
msgid "View Owners..."
msgstr "Погледај влаÑнике..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "Преименуј..."
+
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Duplicate..."
msgstr "Дуплирај"
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr "Помери у..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
msgstr "Брзо отварање Ñкриптице..."
@@ -3022,6 +3124,16 @@ msgstr "Брзо отварање Ñкриптице..."
msgid "New Resource..."
msgstr "Сачувај реÑÑƒÑ€Ñ ÐºÐ°Ð¾..."
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Expand All"
+msgstr "Прошири Ñве"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Collapse All"
+msgstr "Умањи Ñве"
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -3043,28 +3155,19 @@ msgstr "Поново Ñкенирај датотеке"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "Директоријум као омиљени"
+msgid "Toggle split mode"
+msgstr "Промени режим"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Show current scene file."
-msgstr "Сачувај тренутно измењени реÑурÑ."
+msgid "Search files"
+msgstr "Потражи клаÑе"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr "Ðаправи Ñледећу Ñцену/е као дете одабраног чвора."
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "Потражи клаÑе"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3072,7 +3175,7 @@ msgstr ""
"Скенирање датотека,\n"
"Молим Ñачекајте..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "Помери"
@@ -3091,31 +3194,22 @@ msgstr "Ðаправи Ñкриптицу"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find in files"
+msgid "Find in Files"
msgstr "Ðађи плочицу"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find: "
+msgid "Find:"
msgstr "Ðађи"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Whole words"
-msgstr "Целе речи"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "Подударање великих и малих Ñлова"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "ПреÑавији линију"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Filter: "
+msgid "Filters:"
msgstr "Филтери..."
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -3133,6 +3227,11 @@ msgstr ""
#: editor/find_in_files.cpp
#, fuzzy
+msgid "Find: "
+msgstr "Ðађи"
+
+#: editor/find_in_files.cpp
+#, fuzzy
msgid "Replace: "
msgstr "Замени"
@@ -3158,7 +3257,7 @@ msgstr "Грешка: име анимације већ поÑтоји!"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr "Ðеважеће име."
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3299,17 +3398,14 @@ msgstr "Поново увези"
msgid "Failed to load resource."
msgstr "Грешка при учитавању реÑурÑа."
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr ""
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+#, fuzzy
+msgid "Expand All Properties"
msgstr "Прошири Ñве"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+#, fuzzy
+msgid "Collapse All Properties"
msgstr "Умањи Ñве"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3355,6 +3451,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "Учитај поÑтојећи реÑÑƒÑ€Ñ Ñа диÑка и измени га."
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "Сачувај тренутно измењени реÑурÑ."
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "Иди на претходно измењен објекат у иÑторијату."
@@ -3419,14 +3519,14 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
msgstr "Ðаправи полигон"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+#, fuzzy
+msgid "Edit Polygon"
msgstr "Измени полигон"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3434,25 +3534,28 @@ msgid "Insert Point"
msgstr "Уметни тачку"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+#, fuzzy
+msgid "Edit Polygon (Remove Point)"
msgstr "Уреди полигон (обриши тачку)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+#, fuzzy
+msgid "Remove Polygon And Point"
msgstr "Обриши полигон и тачку"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "Ðаправи нови полигон од почетка"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr "Обриши тачке"
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#, fuzzy
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
"Измени поÑтојећи полигон:\n"
"Леви таÑтер миша: помери тачку.\n"
@@ -3460,8 +3563,10 @@ msgstr ""
"ДеÑни таÑтер миша: обриши тачку."
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
-msgstr "Обриши тачке"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#, fuzzy
+msgid "Erase points."
+msgstr "ДеÑни таÑтер миша: обриши тачку."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3476,7 +3581,7 @@ msgstr "Додај анимацију"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
+msgid "Load..."
msgstr "Учитај"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3505,15 +3610,9 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Обриши тачке"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "ДеÑни таÑтер миша: обриши тачку."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3555,10 +3654,9 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr "Залепи"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Мешавина:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3591,7 +3689,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add Node.."
+msgid "Add Node..."
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3871,7 +3969,7 @@ msgstr "Повежи Ñа чвором:"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "Обриши одабрану траку."
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3940,10 +4038,6 @@ msgid "Amount:"
msgstr "Количина:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "Мешавина:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "Мешавина 0:"
@@ -4145,7 +4239,7 @@ msgstr "Ñви"
msgid "Plugins"
msgstr "Прикључци"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "Сортирање:"
@@ -4274,6 +4368,11 @@ msgstr "Уреди CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Scale CanvasItem"
+msgstr "Уреди CanvasItem"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Move CanvasItem"
msgstr "Уреди CanvasItem"
@@ -4294,21 +4393,19 @@ msgid "Paste Pose"
msgstr "Ðалепи позу"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "Умањи"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "Умањи"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Увеличај"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr "Одабери режим"
@@ -4338,6 +4435,11 @@ msgid "Rotate Mode"
msgstr "Режим ротације"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "Режим Ñкалирања (R)"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4437,6 +4539,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr "Врати могућноÑÑ‚ бирања деце објекта."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "Синглетон"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "Покажи коÑти"
@@ -4490,6 +4597,10 @@ msgid "Show Viewport"
msgstr "1 прозор"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr "Центрирај одабрано"
@@ -4561,8 +4672,17 @@ msgstr ""
"Превуците и иÑпуÑтите + Alt: Промени тип чвора"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr "Ðаправи Poly3D"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "Ðаправи полигон"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Измени полигон"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Уреди полигон (обриши тачку)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
@@ -4664,37 +4784,9 @@ msgid "Item List Editor"
msgstr "Уредник Ñтвари лиÑте"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"OccluderPolygon2D не поÑтоји на овом чвору.\n"
-"Ðаправи и додели један?"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr "Ðаправи оÑенчен полигон"
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr "Ðаправи нови полигон од почетка."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "Измени поÑтојећи полигон:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "Леви таÑтер миша: помери тачку."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr "Ctrl+леви таÑтер миша: одÑеци дуж."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "ДеÑни таÑтер миша: обриши тачку."
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr "Мрежа је празна!"
@@ -4928,13 +5020,14 @@ msgid "Populate"
msgstr "Попуни"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr "Ðаправи навигациони полигон"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr "ГенериÑање оÑног поравнаног граничниог оквира (AABB)"
+#, fuzzy
+msgid "Generating Visibility Rect"
+msgstr "Генериши правоугаоник видљивоÑти"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -4962,6 +5055,12 @@ msgstr "ОчиÑти маÑку емиÑије"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "Convert to CPUParticles"
+msgstr "Претвори у велика Ñлова"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr "ЧеÑтице"
@@ -5031,13 +5130,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr "ПроцеÑор материјала типа „ParticlesMaterial“ је неопходан."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
-msgstr "Генериши оÑно поравнан гранични оквир (AABB)"
+msgid "Generating AABB"
+msgstr "ГенериÑање оÑног поравнаног граничниог оквира (AABB)"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "Претвори у велика Ñлова"
+msgid "Generate AABB"
+msgstr "Генериши оÑно поравнан гранични оквир (AABB)"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5061,6 +5159,11 @@ msgid "Add Point to Curve"
msgstr "Уметни тачку у криву"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "Затвори криву"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr "Помери тачку у криви"
@@ -5088,6 +5191,11 @@ msgid "Click: Add Point"
msgstr "Клик: уметни тачку"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Left Click: Split Segment (in curve)"
+msgstr "Подели Ñегмент (у криви)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr "ДеÑни клик: обриши тачку"
@@ -5103,11 +5211,6 @@ msgstr "Додај тачку (у празном проÑтору)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr "Подели Ñегмент (у криви)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "Обриши тачку"
@@ -5164,6 +5267,10 @@ msgstr "Обриши тачку контроле излаза"
msgid "Remove In-Control Point"
msgstr "Обриши тачку контроле улаза"
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Подели Ñегмент (у криви)"
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5176,10 +5283,16 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Sync bones"
+msgid "Sync Bones"
msgstr "Покажи коÑти"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr "Ðаправи UV мапу"
@@ -5189,42 +5302,48 @@ msgid "Create Polygon & UV"
msgstr "Ðаправи полигон"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "Ðаправи нови хоризонтални водич"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "ÐутоматÑко учитавање '%s' већ поÑтоји!"
+msgid "Remove Internal Vertex"
+msgstr "Обриши тачку контроле улаза"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Add Split"
-msgstr "Додај тачку"
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "Ðеважећи пут."
+msgid "Add Custom Polygon"
+msgstr "Измени полигон"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Обриши тачку"
+msgid "Remove Custom Polygon"
+msgstr "Обриши полигон и тачку"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr "ТранÑформиши UV мапу"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
+#, fuzzy
+msgid "Transform Polygon"
+msgstr "Тип транÑформације"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Open Polygon 2D UV editor."
+msgstr "Уредник UV 2Д полигона"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
msgstr "Уредник UV 2Д полигона"
@@ -5234,13 +5353,13 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "Измени полигон"
+msgid "Points"
+msgstr "Помери тачку"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Splits"
-msgstr "Раздели пут"
+msgid "Polygons"
+msgstr "Полигон->UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -5249,11 +5368,7 @@ msgstr "Ðаправи коÑти"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
-msgstr "Ðаправи полигон"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Move Points"
msgstr "Помери тачку"
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5281,19 +5396,21 @@ msgid "Scale Polygon"
msgstr "Скалирај полигон"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Select a split to erase it"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5318,6 +5435,11 @@ msgid "Grid Settings"
msgstr "ПоÑтавке"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "Залепи"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr "Укључи лепљење"
@@ -5381,22 +5503,22 @@ msgid "Paste Resource"
msgstr "Ðалепи реÑурÑе"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr "Тип:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr "Учитај реÑурÑ"
@@ -5433,6 +5555,11 @@ msgstr "Грешка при чувању TileSet!"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
+msgid "Error: could not load file."
+msgstr "ÐеуÑпех при тражењу плочице:"
+
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Error could not load file."
msgstr "ÐеуÑпех при тражењу плочице:"
@@ -5442,19 +5569,23 @@ msgid "Error saving file!"
msgstr "Грешка при чувању TileSet!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
+#, fuzzy
+msgid "Error while saving theme."
msgstr "Грешка при чувању теме"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+#, fuzzy
+msgid "Error Saving"
msgstr "Грешка при чувању"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
+#, fuzzy
+msgid "Error importing theme."
msgstr "Грешка при увозу теме"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+#, fuzzy
+msgid "Error Importing"
msgstr "Грешка при увозу"
#: editor/plugins/script_editor_plugin.cpp
@@ -5477,6 +5608,14 @@ msgid "Import Theme"
msgstr "Увези тему"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Грешка при чувању теме"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Грешка при чувању"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr "Сачувај тему као..."
@@ -5518,8 +5657,8 @@ msgstr "Датотека"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile"
-msgstr "Погледај датотеке"
+msgid "Open..."
+msgstr "Отвори"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5536,11 +5675,7 @@ msgstr "Копирај пут"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Show In File System"
-msgstr "Покажи у менаџеру датотека"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+msgid "History Previous"
msgstr "ИÑторија претходно"
#: editor/plugins/script_editor_plugin.cpp
@@ -5554,6 +5689,11 @@ msgid "Theme"
msgstr "Сачувај тему"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Import Theme..."
+msgstr "Увези тему"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
msgstr "Поново учитај тему"
@@ -5562,10 +5702,6 @@ msgid "Save Theme"
msgstr "Сачувај тему"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "Сачувај тему као"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "Затвори документацију"
@@ -5612,7 +5748,8 @@ msgid "Keep Debugger Open"
msgstr "ОÑтави дебагер отвореним"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+#, fuzzy
+msgid "Debug with External Editor"
msgstr "Дебагуј Ñа Ñпољашњим уредником"
#: editor/plugins/script_editor_plugin.cpp
@@ -5620,10 +5757,6 @@ msgid "Open Godot online documentation"
msgstr "Отвори Godot онлајн документацију"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr "Претражи хијерархију клаÑа."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Претражи документацију."
@@ -5661,21 +5794,9 @@ msgstr "Дебагер"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Search results"
+msgid "Search Results"
msgstr "Потражи помоћ"
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "Потражи клаÑе"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-"Уграђене Ñкриптице Ñе могу Ñамо уређивати када је учитана Ñцена којој "
-"припадају"
-
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
@@ -5686,6 +5807,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "Иди на функцију..."
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr "Само реÑурÑи из датотечног ÑиÑтема Ñе могу убацити."
@@ -5718,10 +5848,6 @@ msgstr "Велика Ñлова"
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5774,11 +5900,13 @@ msgid "Trim Trailing Whitespace"
msgstr "Обриши празнине Ñа крајева"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+#, fuzzy
+msgid "Convert Indent to Spaces"
msgstr "Претвори увучени ред у размаке"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+#, fuzzy
+msgid "Convert Indent to Tabs"
msgstr "Претвори увучени ред у TAB карактере"
#: editor/plugins/script_text_editor.cpp
@@ -5795,36 +5923,32 @@ msgid "Remove All Breakpoints"
msgstr "Обриши Ñве прекидне тачке"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
+#, fuzzy
+msgid "Go to Next Breakpoint"
msgstr "Иди на Ñледећу прекудну тачку"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
+#, fuzzy
+msgid "Go to Previous Breakpoint"
msgstr "Иди на претходну прекидну тачку"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr "Претвори у велика Ñлова"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr "Претвори у мала Ñлова"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr "Ðађи претходни"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr "Филтрирај датотеке..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+#, fuzzy
+msgid "Go to Function..."
msgstr "Иди на функцију..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+#, fuzzy
+msgid "Go to Line..."
msgstr "Иди на линију..."
#: editor/plugins/script_text_editor.cpp
@@ -5921,6 +6045,14 @@ msgid "Animation Key Inserted."
msgstr "Ðнимациони кључ убачен."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr "Ðацртани објекти"
@@ -6087,6 +6219,11 @@ msgid "Freelook Speed Modifier"
msgstr "Брзина Ñлободног погледа"
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "Прикажи информације"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "XForm дијалог"
@@ -6192,11 +6329,6 @@ msgid "Tool Scale"
msgstr "Ðлат Ñкалирања"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap To Floor"
-msgstr "Залепи за мрежу"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Укљ./ИÑкљ. режим Ñлободног гледања"
@@ -6314,6 +6446,10 @@ msgstr "Пре"
msgid "Post"
msgstr "ПоÑле"
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
msgid "Sprite is empty!"
@@ -6435,11 +6571,18 @@ msgid "Set Region Rect"
msgstr "ПоÑтави правоугаони регион"
#: editor/plugins/texture_region_editor_plugin.cpp
+#, fuzzy
+msgid "Set Margin"
+msgstr "ПоÑтави дршку"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr "Режим лепљења:"
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+#, fuzzy
+msgid "None"
msgstr "<Ðиједан>"
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6612,6 +6755,11 @@ msgid "Fix Invalid Tiles"
msgstr "Ðеважеће име."
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "Центрирај одабрано"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr "Цртај TileMap"
@@ -6659,32 +6807,39 @@ msgstr "Одабери плочицу"
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "Обриши одабрано"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr "Ротирај 0 Ñтепени"
+#, fuzzy
+msgid "Rotate left"
+msgstr "Режим ротације"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Rotate right"
+msgstr "Ротирај полигон"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr "Ротирај 90 Ñтепени"
+msgid "Flip horizontally"
+msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
-msgstr "Ротирај 180 Ñтепени"
+msgid "Flip vertically"
+msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
-msgstr "Ротирај 270 Ñтепени"
+#, fuzzy
+msgid "Clear transform"
+msgstr "ТранÑформација"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr "Обриши тачку криве"
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6697,26 +6852,48 @@ msgid "Merge from Scene"
msgstr "Споји од Ñцене"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "Ðалепи анимацију"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "ДеÑни таÑтер миша: обриши тачку."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "Ðаправи нови полигон од почетка."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "Обриши тачку криве"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
-msgstr "Ðаправи од Ñцене?"
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -6724,7 +6901,12 @@ msgid "Merge from scene?"
msgstr "Споји из Ñцене?"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Обриши шаблон"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6734,16 +6916,27 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "Обриши одабране датотеке?"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr ""
+msgstr "Сачувај тренутно измењени реÑурÑ."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "Обриши тачке"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr "Сачувај тренутно измењени реÑурÑ."
@@ -6762,12 +6955,101 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr "Сачувај тренутно измењени реÑурÑ."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Set Tile Region"
+msgstr "ПоÑтави правоугаони регион"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Ðаправи директоријум"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "Уреди филтере"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Измени поÑтојећи полигон:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Измени полигон"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Ðаправи навигациони полигон"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "Ðалепи анимацију"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Обриши шаблон"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "Обриши полигон и тачку"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "Ðаправи оÑенчен полигон"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "Ðаправи навигациони полигон"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "Уреди филтере"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Ðаправи навигациони полигон"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Ðаправи оÑенчен полигон"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "This property can't be changed."
msgstr "Ова операција Ñе не може обавити без Ñцене."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Tile Set"
+msgid "TileSet"
msgstr "TileSet..."
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6807,6 +7089,15 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr "Извозни шаблони за ову платформу или ниÑу пронађени или Ñу иÑкварене:"
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Exporting All"
+msgstr "Извоз"
+
+#: editor/project_export.cpp
#, fuzzy
msgid "Presets"
msgstr "ПоÑтавке"
@@ -6816,6 +7107,11 @@ msgid "Add..."
msgstr "Додај..."
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "Извези пројекат"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr "РеÑурÑи"
@@ -6875,10 +7171,50 @@ msgid "Feature List:"
msgstr "ЛиÑта карактериÑтика:"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "Покрени Ñкриптицу"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Script Export Mode:"
+msgstr "Режим извоза:"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr "Извоз PCK/Zip"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export mode?"
+msgstr "Режим извоза:"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Export All"
+msgstr "Извоз"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr "Извозни шаблони за ову платформу ниÑу пронађени:"
@@ -7010,8 +7346,9 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
-msgid "Can't open project"
-msgstr ""
+#, fuzzy
+msgid "Can't open project at '%s'."
+msgstr "Ðе могу отворити '%s'."
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
@@ -7019,6 +7356,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7334,10 +7689,6 @@ msgstr ""
msgid "General"
msgstr ""
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7471,10 +7822,6 @@ msgstr ""
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr ""
@@ -7565,7 +7912,7 @@ msgid "Step"
msgstr "Корак:"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7574,7 +7921,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7617,7 +7964,7 @@ msgstr "Велика Ñлова"
msgid "Reset"
msgstr "РеÑетуј увеличање"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr "Грешка"
@@ -7676,6 +8023,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr ""
@@ -7712,6 +8063,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7788,6 +8145,11 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Open documentation"
+msgstr "Отвори Godot онлајн документацију"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr ""
@@ -7796,12 +8158,13 @@ msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Change Type"
-msgstr ""
+#, fuzzy
+msgid "Extend Script"
+msgstr "Покрени Ñкриптицу"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -7954,6 +8317,11 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Filename is empty"
+msgstr "Мрежа је празна!"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -8042,19 +8410,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -8087,18 +8443,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -8299,7 +8643,7 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+msgid "Step argument is zero!"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
@@ -8531,13 +8875,8 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr "ИÑпеци!"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-#, fuzzy
-msgid "Bake the navigation mesh."
-msgstr "ИÑпеци навигациону мрежу.\n"
+msgid "Bake NavMesh"
+msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8808,6 +9147,10 @@ msgid "Base Type:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "Чланови:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr ""
@@ -8908,11 +9251,11 @@ msgid "Search VisualScript"
msgstr "Потражи помоћ"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8996,6 +9339,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -9034,6 +9383,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -9151,6 +9506,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -9170,6 +9535,26 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9202,7 +9587,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9260,6 +9645,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr "Ðнимационо дрво није важеће."
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr ""
@@ -9276,10 +9665,6 @@ msgstr ""
msgid "Please Confirm..."
msgstr ""
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr "Одабери овај директоријум"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9287,6 +9672,10 @@ msgid ""
"hide upon running."
msgstr ""
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9333,11 +9722,6 @@ msgstr "Ðеважећа величина фонта."
msgid "Input"
msgstr "Додај улаз"
-#: scene/resources/visual_shader.cpp
-#, fuzzy
-msgid "None"
-msgstr "<Ðиједан>"
-
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
@@ -9355,6 +9739,164 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Split already exists."
+#~ msgstr "ÐутоматÑко учитавање '%s' већ поÑтоји!"
+
+#, fuzzy
+#~ msgid "Add Split"
+#~ msgstr "Додај тачку"
+
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr "Ðеважећи пут."
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "Обриши тачку"
+
+#, fuzzy
+#~ msgid "Poly"
+#~ msgstr "Измени полигон"
+
+#, fuzzy
+#~ msgid "Splits"
+#~ msgstr "Раздели пут"
+
+#~ msgid "No name provided"
+#~ msgstr "Име није дато"
+
+#~ msgid "Create from scene?"
+#~ msgstr "Ðаправи од Ñцене?"
+
+#~ msgid "Create Poly"
+#~ msgstr "Ðаправи полигон"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "Ðаправи нови полигон од почетка"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "Умањи"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "Увеличај"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "Ðаправи Poly3D"
+
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "OccluderPolygon2D не поÑтоји на овом чвору.\n"
+#~ "Ðаправи и додели један?"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "Леви таÑтер миша: помери тачку."
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "Ctrl+леви таÑтер миша: одÑеци дуж."
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "ДеÑни таÑтер миша: обриши тачку."
+
+#, fuzzy
+#~ msgid "New TextFile"
+#~ msgstr "Погледај датотеке"
+
+#~ msgid "Save Theme As"
+#~ msgstr "Сачувај тему као"
+
+#~ msgid "<None>"
+#~ msgstr "<Ðиједан>"
+
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Увеличај"
+
+#~ msgid "Class List:"
+#~ msgstr "ЛиÑта клаÑа:"
+
+#~ msgid "Search Classes"
+#~ msgstr "Потражи клаÑе"
+
+#~ msgid "Public Methods"
+#~ msgstr "Јавне методе"
+
+#~ msgid "Public Methods:"
+#~ msgstr "Јавне методе:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "Ставке теме графичког интерфејÑа"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "Ставке теме графичког интерфејÑа:"
+
+#, fuzzy
+#~ msgid "Property: "
+#~ msgstr "ОÑобине"
+
+#, fuzzy
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "Директоријум као омиљени"
+
+#, fuzzy
+#~ msgid "Show current scene file."
+#~ msgstr "Сачувај тренутно измењени реÑурÑ."
+
+#, fuzzy
+#~ msgid "Whole words"
+#~ msgstr "Целе речи"
+
+#, fuzzy
+#~ msgid "Match case"
+#~ msgstr "Подударање великих и малих Ñлова"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "Претражи хијерархију клаÑа."
+
+#, fuzzy
+#~ msgid "Search in files"
+#~ msgstr "Потражи клаÑе"
+
+#~ msgid ""
+#~ "Built-in scripts can only be edited when the scene they belong to is "
+#~ "loaded"
+#~ msgstr ""
+#~ "Уграђене Ñкриптице Ñе могу Ñамо уређивати када је учитана Ñцена којој "
+#~ "припадају"
+
+#~ msgid "Convert To Uppercase"
+#~ msgstr "Претвори у велика Ñлова"
+
+#~ msgid "Convert To Lowercase"
+#~ msgstr "Претвори у мала Ñлова"
+
+#, fuzzy
+#~ msgid "Snap To Floor"
+#~ msgstr "Залепи за мрежу"
+
+#~ msgid "Rotate 0 degrees"
+#~ msgstr "Ротирај 0 Ñтепени"
+
+#~ msgid "Rotate 90 degrees"
+#~ msgstr "Ротирај 90 Ñтепени"
+
+#~ msgid "Rotate 180 degrees"
+#~ msgstr "Ротирај 180 Ñтепени"
+
+#~ msgid "Rotate 270 degrees"
+#~ msgstr "Ротирај 270 Ñтепени"
+
+#~ msgid "Bake!"
+#~ msgstr "ИÑпеци!"
+
+#, fuzzy
+#~ msgid "Bake the navigation mesh."
+#~ msgstr "ИÑпеци навигациону мрежу.\n"
+
#~ msgid "Change Scalar Constant"
#~ msgstr "Промени Ñкаларну конÑтанту"
@@ -9544,15 +10086,9 @@ msgstr ""
#~ msgid "I see..."
#~ msgstr "Разумем..."
-#~ msgid "Can't open '%s'."
-#~ msgstr "Ðе могу отворити '%s'."
-
#~ msgid "Ugh"
#~ msgstr "Уф"
-#~ msgid "Save the currently edited resource."
-#~ msgstr "Сачувај тренутно измењени реÑурÑ."
-
#~ msgid "Stop Profiling"
#~ msgstr "ЗауÑтави профилирање"
@@ -9679,9 +10215,6 @@ msgstr ""
#~ msgid "Clear Emitter"
#~ msgstr "ОчиÑти емитер"
-#~ msgid "Fold Line"
-#~ msgstr "ПреÑавији линију"
-
#~ msgid "Cannot navigate to '"
#~ msgstr "Ðе могу прећи у '"
diff --git a/editor/translations/sr_Latn.po b/editor/translations/sr_Latn.po
index d0458037ba..63000c9397 100644
--- a/editor/translations/sr_Latn.po
+++ b/editor/translations/sr_Latn.po
@@ -1,23 +1,25 @@
# Serbian (latin) translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
-#
# Milos Ponjavusic <brane@branegames.com>, 2018.
-#
+# BLu <blmasfon@gmail.com>, 2018.
+# Vojislav Bajakic <ch3d4.ns@gmail.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-05-15 08:41+0000\n"
-"Last-Translator: Milos Ponjavusic <brane@branegames.com>\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:42+0100\n"
+"Last-Translator: Vojislav Bajakic <ch3d4.ns@gmail.com>\n"
"Language-Team: Serbian (latin) <https://hosted.weblate.org/projects/godot-"
"engine/godot/sr_Latn/>\n"
"Language: sr_Latn\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 3.0-dev\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -25,7 +27,7 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr ""
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
@@ -83,7 +85,7 @@ msgstr "Uduplaj Selekciju"
#: editor/animation_bezier_editor.cpp
msgid "Delete Selected Key(s)"
-msgstr ""
+msgstr "IzbriÅ¡i oznaÄeni kljuÄ(eve)"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -256,7 +258,6 @@ msgstr "Napravi %d novih kanala i dodaj kljuÄeve?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -384,8 +385,7 @@ msgstr "Skaliraj Selekciju"
msgid "Scale From Cursor"
msgstr "Skaliraj od Kursora"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Uduplaj Selekciju"
@@ -399,11 +399,13 @@ msgid "Delete Selection"
msgstr "Uduplaj Selekciju"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+#, fuzzy
+msgid "Go to Next Step"
msgstr "Otiđi Na Sljedeći Korak"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+#, fuzzy
+msgid "Go to Previous Step"
msgstr "Otiđi Na Prethodni Korak"
#: editor/animation_track_editor.cpp
@@ -506,11 +508,11 @@ msgstr ""
msgid "Replaced %d occurrence(s)."
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr ""
@@ -526,15 +528,19 @@ msgstr ""
msgid "Selection Only"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr ""
@@ -543,10 +549,10 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Zoom:"
+msgid "Font Size:"
msgstr ""
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr ""
@@ -577,6 +583,7 @@ msgstr ""
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -655,7 +662,7 @@ msgid "Edit Connection: "
msgstr "Izmjeni Selekciju Krivulje"
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -701,23 +708,20 @@ msgid "Recent:"
msgstr ""
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr ""
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr ""
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr ""
@@ -752,8 +756,7 @@ msgid "Resource"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr ""
@@ -774,9 +777,10 @@ msgid "Search Replacement Resource:"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -806,7 +810,7 @@ msgid "Error loading:"
msgstr ""
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+msgid "Load failed due to missing dependencies:"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -865,14 +869,6 @@ msgstr ""
msgid "Thanks from the Godot community!"
msgstr ""
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr ""
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr ""
@@ -962,7 +958,7 @@ msgid "Uncompressing Assets"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+msgid "Package installed successfully!"
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1044,8 +1040,7 @@ msgid "Bus options"
msgstr ""
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr ""
@@ -1204,7 +1199,7 @@ msgid "Add AutoLoad"
msgstr ""
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr ""
@@ -1212,8 +1207,8 @@ msgstr ""
msgid "Node Name:"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr ""
@@ -1283,11 +1278,15 @@ msgid "Template file not found:"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
+msgid "Select This Folder"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1295,12 +1294,12 @@ msgid "Copy Path"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+msgid "Show in File Manager"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1336,7 +1335,8 @@ msgid "Open a File or Directory"
msgstr ""
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr ""
@@ -1394,8 +1394,7 @@ msgstr ""
msgid "Preview:"
msgstr ""
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr ""
@@ -1411,24 +1410,11 @@ msgstr ""
msgid "(Re)Importing Assets"
msgstr ""
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr ""
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr ""
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr ""
@@ -1445,27 +1431,27 @@ msgid "Brief Description:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Members"
+msgid "Properties"
msgstr ""
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
+#: editor/editor_help.cpp
+msgid "Properties:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
+msgid "Methods"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods:"
+msgid "Methods:"
msgstr ""
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
+msgid "Theme Properties"
msgstr ""
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
+msgid "Theme Properties:"
msgstr ""
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
@@ -1493,7 +1479,11 @@ msgid "Constants:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Description"
+msgid "Class Description"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
msgstr ""
#: editor/editor_help.cpp
@@ -1508,11 +1498,11 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Properties"
+msgid "Property Descriptions"
msgstr ""
#: editor/editor_help.cpp
-msgid "Property Description:"
+msgid "Property Descriptions:"
msgstr ""
#: editor/editor_help.cpp
@@ -1522,11 +1512,11 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Methods"
+msgid "Method Descriptions"
msgstr ""
#: editor/editor_help.cpp
-msgid "Method Description:"
+msgid "Method Descriptions:"
msgstr ""
#: editor/editor_help.cpp
@@ -1535,11 +1525,53 @@ msgid ""
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-#: editor/editor_inspector.cpp
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
msgstr ""
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Constants Only"
+msgstr "Kontanta"
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr ""
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1573,6 +1605,11 @@ msgstr ""
msgid "Error saving resource!"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr ""
@@ -1627,10 +1664,20 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr ""
@@ -1858,6 +1905,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1898,6 +1951,11 @@ msgstr ""
msgid "Default"
msgstr ""
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Play This Scene"
msgstr ""
@@ -1979,7 +2037,7 @@ msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2008,7 +2066,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -2032,7 +2090,7 @@ msgstr ""
msgid "Export"
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr ""
@@ -2045,6 +2103,7 @@ msgid "Quit to Project List"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr ""
@@ -2152,10 +2211,6 @@ msgstr ""
msgid "Help"
msgstr ""
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2178,11 +2233,11 @@ msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
-msgstr ""
+msgstr "Zajednica"
#: editor/editor_node.cpp
msgid "About"
-msgstr ""
+msgstr "O nama / O Godou"
#: editor/editor_node.cpp
msgid "Play the project."
@@ -2249,21 +2304,21 @@ msgstr ""
msgid "Disable Update Spinner"
msgstr ""
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr ""
#: editor/editor_node.cpp
-msgid "Node"
+msgid "FileSystem"
msgstr ""
#: editor/editor_node.cpp
-msgid "FileSystem"
+msgid "Inspector"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Node"
msgstr ""
#: editor/editor_node.cpp
@@ -2400,7 +2455,7 @@ msgstr ""
msgid "Physics Frame %"
msgstr ""
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr ""
@@ -2424,7 +2479,7 @@ msgstr ""
msgid "Calls"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2436,20 +2491,43 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Invalid RID"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr ""
@@ -2461,10 +2539,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2473,7 +2547,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr ""
@@ -2754,6 +2829,10 @@ msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr ""
#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
@@ -2789,8 +2868,8 @@ msgstr ""
msgid "Unable to update dependencies:"
msgstr ""
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2798,10 +2877,6 @@ msgid "Provided name contains invalid characters"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr ""
@@ -2826,27 +2901,19 @@ msgid "Duplicating folder:"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
+msgid "Open Scene(s)"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Move To..."
+msgid "Instance"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Open Scene(s)"
+msgid "Add to favorites"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Instance"
+msgid "Remove from favorites"
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2857,11 +2924,19 @@ msgstr ""
msgid "View Owners..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr ""
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr ""
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -2869,6 +2944,14 @@ msgstr ""
msgid "New Resource..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr ""
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -2889,11 +2972,11 @@ msgid "Re-Scan Filesystem"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Toggle folder status as Favorite."
+msgid "Toggle split mode"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Show current scene file."
+msgid "Search files"
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2901,20 +2984,12 @@ msgid "Instance the selected scene(s) as child of the selected node."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Search files"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
msgstr ""
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr ""
@@ -2931,27 +3006,19 @@ msgid "Create Script"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Find in files"
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Find: "
+msgid "Find in Files"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Whole words"
+msgid "Find:"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Match case"
+msgid "Folder:"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Filter: "
+msgid "Filters:"
msgstr ""
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -2968,6 +3035,10 @@ msgid "Cancel"
msgstr ""
#: editor/find_in_files.cpp
+msgid "Find: "
+msgstr ""
+
+#: editor/find_in_files.cpp
msgid "Replace: "
msgstr ""
@@ -2988,7 +3059,7 @@ msgid "Group name already exists."
msgstr ""
#: editor/groups_editor.cpp
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr ""
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3124,17 +3195,12 @@ msgstr ""
msgid "Failed to load resource."
msgstr ""
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr ""
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+msgid "Collapse All Properties"
msgstr ""
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3179,6 +3245,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr ""
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr ""
@@ -3239,44 +3309,45 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
-msgstr ""
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
+msgstr "Napravi"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
-msgstr ""
+#, fuzzy
+msgid "Edit Polygon"
+msgstr "Napravi"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+msgid "Remove Polygon And Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr ""
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr "Napravi"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3291,7 +3362,7 @@ msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Load.."
+msgid "Load..."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3320,13 +3391,8 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Napravi"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-msgid "Erase points."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3367,9 +3433,8 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3403,7 +3468,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add Node.."
+msgid "Add Node..."
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3672,7 +3737,7 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "Obriši Selekciju"
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3740,10 +3805,6 @@ msgid "Amount:"
msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr ""
@@ -3941,7 +4002,7 @@ msgstr ""
msgid "Plugins"
msgstr ""
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr ""
@@ -4065,6 +4126,10 @@ msgid "Resize CanvasItem"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
msgstr ""
@@ -4085,15 +4150,15 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom out"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom reset"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom in"
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -4125,6 +4190,10 @@ msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4219,6 +4288,10 @@ msgid "Restores the object's children's ability to be selected."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr ""
@@ -4269,6 +4342,10 @@ msgid "Show Viewport"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr ""
@@ -4338,7 +4415,16 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "Napravi"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
msgstr ""
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
@@ -4440,35 +4526,9 @@ msgid "Item List Editor"
msgstr ""
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr ""
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr ""
@@ -4700,12 +4760,12 @@ msgid "Populate"
msgstr ""
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
+msgid "Generating Visibility Rect"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -4734,6 +4794,11 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr ""
@@ -4803,11 +4868,11 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Convert to CPUParticles"
+msgid "Generate AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -4832,6 +4897,11 @@ msgid "Add Point to Curve"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "Izmjeni Krivulju ÄŒvora"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr ""
@@ -4859,6 +4929,10 @@ msgid "Click: Add Point"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr ""
@@ -4874,11 +4948,6 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr ""
@@ -4935,6 +5004,10 @@ msgstr ""
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
msgid "Move joint"
msgstr ""
@@ -4945,77 +5018,85 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync bones"
+msgid "Sync Bones"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create UV Map"
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create Polygon & UV"
+msgid "Create UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
+msgid "Create Polygon & UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
+msgid "Create Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split already exists."
+msgid "Remove Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Add Split"
+msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Invalid Split: "
-msgstr ""
+#, fuzzy
+msgid "Add Custom Polygon"
+msgstr "Napravi"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Obriši Selekciju"
+msgid "Remove Custom Polygon"
+msgstr "Napravi"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
-msgstr ""
+#, fuzzy
+msgid "Transform Polygon"
+msgstr "Napravi"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Polygon 2D UV Editor"
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UV"
+msgid "Open Polygon 2D UV editor."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Poly"
+msgid "Polygon 2D UV Editor"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Splits"
+msgid "UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Bones"
+msgid "Points"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
+msgid "Polygons"
msgstr "Napravi"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Move Points"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5043,19 +5124,21 @@ msgid "Scale Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Select a split to erase it"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5079,6 +5162,11 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr ""
@@ -5136,22 +5224,22 @@ msgid "Paste Resource"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr ""
@@ -5181,6 +5269,10 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Error could not load file."
msgstr ""
@@ -5189,19 +5281,19 @@ msgid "Error saving file!"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
+msgid "Error while saving theme."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+msgid "Error Saving"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
+msgid "Error importing theme."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+msgid "Error Importing"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5221,6 +5313,14 @@ msgid "Import Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr ""
@@ -5261,7 +5361,7 @@ msgid "File"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile"
+msgid "Open..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5277,11 +5377,7 @@ msgid "Copy Script Path"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+msgid "History Previous"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5294,15 +5390,15 @@ msgid "Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Reload Theme"
+msgid "Import Theme..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme"
+msgid "Reload Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
+msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5352,7 +5448,7 @@ msgid "Keep Debugger Open"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5360,10 +5456,6 @@ msgid "Open Godot online documentation"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -5398,16 +5490,7 @@ msgid "Debugger"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search results"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search in files"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
+msgid "Search Results"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5420,6 +5503,14 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr ""
@@ -5451,10 +5542,6 @@ msgstr ""
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5506,11 +5593,11 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5527,35 +5614,29 @@ msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr ""
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "Otiđi Na Sljedeći Korak"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr ""
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "Otiđi Na Prethodni Korak"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+msgid "Go to Function..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5647,6 +5728,14 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -5811,6 +5900,10 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -5910,10 +6003,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap To Floor"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6030,6 +6119,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
msgstr ""
@@ -6144,11 +6237,16 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6312,6 +6410,11 @@ msgid "Fix Invalid Tiles"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "Uduplaj Selekciju"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6357,32 +6460,38 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "Obriši Selekciju"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
+msgid "Rotate left"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
+msgid "Rotate right"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Flip vertically"
msgstr ""
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Clear transform"
+msgstr "Animacija Promjeni Transformaciju"
+
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove current Texture from TileSet"
-msgstr ""
+#, fuzzy
+msgid "Remove selected Texture from TileSet."
+msgstr "Obriši Selekciju"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -6393,25 +6502,45 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Paste bitmask."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Erase bitmask."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "Napravi"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "Obriši Selekciju"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6419,7 +6548,12 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Obriši Selekciju"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6429,15 +6563,25 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "IzbriÅ¡i oznaÄeni kljuÄ(eve)"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "Napravi"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr ""
@@ -6455,11 +6599,92 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Napravi"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Napravi"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Napravi"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Napravi"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Obriši Selekciju"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Napravi"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Napravi"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "This property can't be changed."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
+msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6495,6 +6720,14 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6503,6 +6736,10 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+msgid "Export Path"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6557,10 +6794,46 @@ msgid "Feature List:"
msgstr ""
#: editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr ""
#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -6687,7 +6960,7 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
-msgid "Can't open project"
+msgid "Can't open project at '%s'."
msgstr ""
#: editor/project_manager.cpp
@@ -6696,6 +6969,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7008,11 +7299,7 @@ msgstr ""
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "General"
-msgstr ""
-
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
+msgstr "Opšti deo"
#: editor/project_settings_editor.cpp
msgid "Override For..."
@@ -7147,10 +7434,6 @@ msgstr ""
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr ""
@@ -7235,7 +7518,7 @@ msgid "Step"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7244,7 +7527,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7284,7 +7567,7 @@ msgstr ""
msgid "Reset"
msgstr ""
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7343,6 +7626,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr ""
@@ -7379,6 +7666,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7449,6 +7742,10 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr ""
@@ -7457,11 +7754,11 @@ msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Change Type"
+msgid "Extend Script"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -7611,6 +7908,10 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -7699,19 +8000,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -7743,18 +8032,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -7951,7 +8228,7 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+msgid "Step argument is zero!"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
@@ -8173,11 +8450,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -8447,6 +8720,10 @@ msgid "Base Type:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr ""
@@ -8545,11 +8822,11 @@ msgid "Search VisualScript"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8627,6 +8904,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -8665,6 +8948,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -8782,6 +9071,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -8801,6 +9100,26 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -8833,7 +9152,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -8886,6 +9205,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr ""
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr ""
@@ -8902,10 +9225,6 @@ msgstr ""
msgid "Please Confirm..."
msgstr ""
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr ""
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -8913,6 +9232,10 @@ msgid ""
"hide upon running."
msgstr ""
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -8958,10 +9281,6 @@ msgstr ""
msgid "Input"
msgstr ""
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for shader."
msgstr ""
@@ -8978,6 +9297,10 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "Obriši Selekciju"
+
#~ msgid "Disabled"
#~ msgstr "Onemogućeno"
@@ -8999,9 +9322,6 @@ msgstr ""
#~ msgid "Anim Track Change Wrap Mode"
#~ msgstr "Animacija Promjeni Režim Omotavanja Kanala"
-#~ msgid "Edit Node Curve"
-#~ msgstr "Izmjeni Krivulju ÄŒvora"
-
#~ msgid "Anim Add Key"
#~ msgstr "Animacija Dodaj KljuÄ"
diff --git a/editor/translations/sv.po b/editor/translations/sv.po
index c9f39bdd5d..0e72210af0 100644
--- a/editor/translations/sv.po
+++ b/editor/translations/sv.po
@@ -1,6 +1,6 @@
# Swedish translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# bergmarklund <davemcgroin@gmail.com>, 2017, 2018.
# Christoffer Sundbom <christoffer_karlsson@live.se>, 2017.
@@ -12,15 +12,17 @@
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-08-06 18:43+0000\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:42+0100\n"
"Last-Translator: Daniel K <danielkimblad@hotmail.com>\n"
"Language-Team: Swedish <https://hosted.weblate.org/projects/godot-engine/"
"godot/sv/>\n"
"Language: sv\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.1.1\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -28,7 +30,7 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr ""
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
@@ -269,7 +271,6 @@ msgstr "Skapa %d NYA spår och infoga nycklar?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -404,8 +405,7 @@ msgstr "Skala urval"
msgid "Scale From Cursor"
msgstr "Skala Från Muspekare"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Duplicera urval"
@@ -420,11 +420,13 @@ msgid "Delete Selection"
msgstr "Duplicera urval"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+#, fuzzy
+msgid "Go to Next Step"
msgstr "Gå Till Nästa Steg"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+#, fuzzy
+msgid "Go to Previous Step"
msgstr "Ge Till Föregående Steg"
#: editor/animation_track_editor.cpp
@@ -540,12 +542,12 @@ msgstr "Inga matchningar"
msgid "Replaced %d occurrence(s)."
msgstr "Ersatte %d förekomst(er)."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
#, fuzzy
msgid "Match Case"
msgstr "Matcha gemener/versaler"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "Hela Ord"
@@ -562,15 +564,19 @@ msgstr "Ersätt Alla"
msgid "Selection Only"
msgstr "Endast Urval"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Zooma In"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "Zooma Ut"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "Återställ Zoom"
@@ -581,10 +587,10 @@ msgstr "Varning"
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "Zooma In"
+msgid "Font Size:"
+msgstr "Vy framifrån"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Rad:"
@@ -619,6 +625,7 @@ msgstr "Lägg till"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -705,7 +712,7 @@ msgid "Edit Connection: "
msgstr "Anslutningsfel"
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -759,24 +766,21 @@ msgid "Recent:"
msgstr "Senaste:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Sök:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#, fuzzy
msgid "Matches:"
msgstr "Matchar:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "Beskrivning:"
@@ -819,8 +823,7 @@ msgid "Resource"
msgstr "Resurs"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
#, fuzzy
msgid "Path"
msgstr "Sökväg"
@@ -846,9 +849,10 @@ msgid "Search Replacement Resource:"
msgstr "Sök Ersättningsresurs:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
#, fuzzy
@@ -886,7 +890,7 @@ msgstr "Fel vid laddning:"
#: editor/dependency_editor.cpp
#, fuzzy
-msgid "Scene failed to load due to missing dependencies:"
+msgid "Load failed due to missing dependencies:"
msgstr "Scenen misslyckades att ladda på grund av att beroenden saknas:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -955,14 +959,6 @@ msgstr "Ändra Ordboksvärde"
msgid "Thanks from the Godot community!"
msgstr "Tack från Godot-gemenskapen!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "OK"
-
#: editor/editor_about.cpp
#, fuzzy
msgid "Godot Engine contributors"
@@ -1073,7 +1069,7 @@ msgstr "Dekomprimerar Tillgångar"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
#, fuzzy
-msgid "Package Installed Successfully!"
+msgid "Package installed successfully!"
msgstr "Paketet installerades!"
#: editor/editor_asset_installer.cpp
@@ -1170,8 +1166,7 @@ msgid "Bus options"
msgstr "Buss-alternativ"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "Duplicera"
@@ -1365,7 +1360,7 @@ msgid "Add AutoLoad"
msgstr "Lägg till AutoLoad"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
#, fuzzy
msgid "Path:"
msgstr "Sökväg:"
@@ -1375,8 +1370,8 @@ msgstr "Sökväg:"
msgid "Node Name:"
msgstr "Node Namn:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "Namn"
@@ -1455,13 +1450,18 @@ msgstr "Mallfil hittades inte:\n"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
#, fuzzy
+msgid "Select Current Folder"
+msgstr "Skapa Mapp"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+#, fuzzy
msgid "File Exists, Overwrite?"
msgstr "Filen finns redan, skriv över?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
#, fuzzy
-msgid "Select Current Folder"
-msgstr "Skapa Mapp"
+msgid "Select This Folder"
+msgstr "Välj en Node"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
@@ -1470,13 +1470,13 @@ msgstr "Kopiera Sökvägen"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr "Visa I Filhanteraren"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
#, fuzzy
-msgid "Show In File Manager"
+msgid "Show in File Manager"
msgstr "Visa I Filhanteraren"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1514,7 +1514,8 @@ msgid "Open a File or Directory"
msgstr "Öppna en Fil eller Katalog"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Spara"
@@ -1576,8 +1577,7 @@ msgstr "Kataloger & Filer:"
msgid "Preview:"
msgstr "Förhandsvisning:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "Fil:"
@@ -1596,26 +1596,11 @@ msgstr "ScanSources"
msgid "(Re)Importing Assets"
msgstr "(Om)Importerar Tillgångar"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "Sök Hjälp"
-
-#: editor/editor_help.cpp
-#, fuzzy
-msgid "Class List:"
-msgstr "Klasslista:"
-
-#: editor/editor_help.cpp
-#, fuzzy
-msgid "Search Classes"
-msgstr "Sök Klasser"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "Topp"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
#, fuzzy
msgid "Class:"
msgstr "Klass:"
@@ -1636,31 +1621,32 @@ msgstr "Kort Beskrivning:"
#: editor/editor_help.cpp
#, fuzzy
-msgid "Members"
-msgstr "Medlemmar"
+msgid "Properties"
+msgstr "Egenskaper"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-#, fuzzy
-msgid "Members:"
-msgstr "Medlemmar:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr ""
#: editor/editor_help.cpp
#, fuzzy
-msgid "Public Methods"
-msgstr "Publika Metoder"
+msgid "Methods"
+msgstr "Metoder"
#: editor/editor_help.cpp
#, fuzzy
-msgid "Public Methods:"
-msgstr "Publika Metoder:"
+msgid "Methods:"
+msgstr "Metoder"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr ""
+#, fuzzy
+msgid "Theme Properties"
+msgstr "Egenskaper"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr ""
+#, fuzzy
+msgid "Theme Properties:"
+msgstr "Egenskaper"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
#, fuzzy
@@ -1690,11 +1676,17 @@ msgid "Constants:"
msgstr "Konstanter:"
#: editor/editor_help.cpp
-msgid "Description"
+#, fuzzy
+msgid "Class Description"
msgstr "Beskrivning"
#: editor/editor_help.cpp
#, fuzzy
+msgid "Class Description:"
+msgstr "Beskrivning:"
+
+#: editor/editor_help.cpp
+#, fuzzy
msgid "Online Tutorials:"
msgstr "Dokumentation Online"
@@ -1710,12 +1702,12 @@ msgstr ""
#: editor/editor_help.cpp
#, fuzzy
-msgid "Properties"
-msgstr "Egenskaper"
+msgid "Property Descriptions"
+msgstr "Egenskapsbeskrivning:"
#: editor/editor_help.cpp
#, fuzzy
-msgid "Property Description:"
+msgid "Property Descriptions:"
msgstr "Egenskapsbeskrivning:"
#: editor/editor_help.cpp
@@ -1729,12 +1721,12 @@ msgstr ""
#: editor/editor_help.cpp
#, fuzzy
-msgid "Methods"
-msgstr "Metoder"
+msgid "Method Descriptions"
+msgstr "Metodbeskrivning:"
#: editor/editor_help.cpp
#, fuzzy
-msgid "Method Description:"
+msgid "Method Descriptions:"
msgstr "Metodbeskrivning:"
#: editor/editor_help.cpp
@@ -1746,12 +1738,61 @@ msgstr ""
"Det finns för närvarande ingen beskrivning för denna metod. Snälla hjälp oss "
"genom att [color=$color][url=$url]bidra med en[/url][/color]!"
-#: editor/editor_inspector.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Sök Hjälp"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Display All"
+msgstr "Ersätt Alla"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Classes Only"
+msgstr "Klasser"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Methods Only"
+msgstr "Metoder"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "Signaler"
+
+#: editor/editor_help_search.cpp
#, fuzzy
-msgid "Property: "
+msgid "Constants Only"
+msgstr "Konstanter"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Properties Only"
msgstr "Egenskaper"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Theme Properties Only"
+msgstr "Egenskaper"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Member Type"
+msgstr "Medlemmar"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Class"
+msgstr "Klass:"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1789,6 +1830,11 @@ msgstr "Projekt exporten misslyckades med följande felmeddelande %d."
msgid "Error saving resource!"
msgstr "Fel vid sparande av resurs!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "OK"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "Spara Resurs Som..."
@@ -1851,6 +1897,12 @@ msgid "This operation can't be done without a tree root."
msgstr "Åtgärden kan inte göras utan en trädrot."
#: editor/editor_node.cpp
+msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
#, fuzzy
msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
@@ -1859,6 +1911,10 @@ msgstr ""
"Kunde inte spara scenen. Förmodligen kunde inte beroenden (instanser) "
"uppfyllas."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
#, fuzzy
msgid "Can't load MeshLibrary for merging!"
@@ -2152,6 +2208,15 @@ msgstr "Kunde inte ladda addon script från sökväg: '%s'"
#: editor/editor_node.cpp
#, fuzzy
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"Kunde inte ladda addon script från sökväg: '%s' Skript är inte i "
+"verktygsläge."
+
+#: editor/editor_node.cpp
+#, fuzzy
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
"Kunde inte ladda addon script från sökväg: '%s' Bastyp är inte EditorPlugin."
@@ -2205,6 +2270,12 @@ msgstr "Ta bort Layout"
msgid "Default"
msgstr "Standard"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+#, fuzzy
+msgid "Show in FileSystem"
+msgstr "Visa i Filsystemet"
+
#: editor/editor_node.cpp
#, fuzzy
msgid "Play This Scene"
@@ -2294,7 +2365,8 @@ msgid "Save Scene"
msgstr "Spara Scen"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+#, fuzzy
+msgid "Save All Scenes"
msgstr "Spara alla Scener"
#: editor/editor_node.cpp
@@ -2326,7 +2398,7 @@ msgid "Undo"
msgstr "Ã…ngra"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
#, fuzzy
msgid "Redo"
msgstr "Ã…ngra"
@@ -2352,7 +2424,7 @@ msgstr "Projektinställningar"
msgid "Export"
msgstr "Exportera"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "Verktyg"
@@ -2367,6 +2439,7 @@ msgid "Quit to Project List"
msgstr "Avsluta till Projektlistan"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
#, fuzzy
msgid "Debug"
msgstr "Debugga"
@@ -2477,11 +2550,6 @@ msgstr ""
msgid "Help"
msgstr "Hjälp"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Classes"
-msgstr "Klasser"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2582,26 +2650,26 @@ msgstr "Uppdatera Ändringar"
msgid "Disable Update Spinner"
msgstr ""
-#: editor/editor_node.cpp
-#, fuzzy
-msgid "Inspector"
-msgstr "Inspektör"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "Importera"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "Node"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr ""
#: editor/editor_node.cpp
#, fuzzy
+msgid "Inspector"
+msgstr "Inspektör"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Node"
+
+#: editor/editor_node.cpp
+#, fuzzy
msgid "Expand Bottom Panel"
msgstr "Expandera alla"
@@ -2741,7 +2809,7 @@ msgstr ""
msgid "Physics Frame %"
msgstr ""
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "Tid:"
@@ -2766,7 +2834,7 @@ msgstr "Tid:"
msgid "Calls"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
#, fuzzy
msgid "On"
msgstr "PÃ¥"
@@ -2779,21 +2847,45 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
#, fuzzy
-msgid "Assign.."
+msgid "Assign..."
msgstr "Tilldela"
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "Ogiltig Sökväg"
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
#, fuzzy
msgid "New Script"
msgstr "Nytt Skript"
@@ -2806,11 +2898,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-#, fuzzy
-msgid "Show in File System"
-msgstr "Visa i Filsystemet"
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2819,7 +2906,8 @@ msgstr "Visa i Filsystemet"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "Klistra in"
@@ -3128,6 +3216,11 @@ msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr ""
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "Favoriter:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
@@ -3166,8 +3259,8 @@ msgstr "Fel vid laddning:"
msgid "Unable to update dependencies:"
msgstr "Scen '%s' har trasiga beroenden:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -3175,10 +3268,6 @@ msgid "Provided name contains invalid characters"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr ""
@@ -3209,32 +3298,23 @@ msgstr "Byter namn på mappen:"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Expand all"
-msgstr "Expandera alla"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
-msgid "Rename..."
-msgstr "Byt namn..."
+msgid "Open Scene(s)"
+msgstr "Öppna Scen"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Move To..."
-msgstr "Flytta Till..."
+msgid "Instance"
+msgstr "Instans"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open Scene(s)"
-msgstr "Öppna Scen"
+msgid "Add to favorites"
+msgstr "Favoriter:"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Instance"
-msgstr "Instans"
+msgid "Remove from favorites"
+msgstr "Ta bort från Grupp"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -3245,6 +3325,11 @@ msgstr ""
msgid "View Owners..."
msgstr "Visa Ägare..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#, fuzzy
+msgid "Rename..."
+msgstr "Byt namn..."
+
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Duplicate..."
@@ -3252,6 +3337,11 @@ msgstr "Duplicera"
#: editor/filesystem_dock.cpp
#, fuzzy
+msgid "Move To..."
+msgstr "Flytta Till..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "New Script..."
msgstr "Nytt Skript"
@@ -3260,6 +3350,16 @@ msgstr "Nytt Skript"
msgid "New Resource..."
msgstr "Spara Resurs Som..."
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Expand All"
+msgstr "Expandera alla"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Collapse All"
+msgstr "Stäng Alla"
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -3281,13 +3381,13 @@ msgstr ""
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "Växla Favorit"
+msgid "Toggle split mode"
+msgstr "Växla Läge"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Show current scene file."
-msgstr "Skapa Mapp"
+msgid "Search files"
+msgstr "Sök Klasser"
#: editor/filesystem_dock.cpp
#, fuzzy
@@ -3295,21 +3395,12 @@ msgid "Instance the selected scene(s) as child of the selected node."
msgstr "Instansiera valda scen(er) som barn till vald Node."
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "Sök Klasser"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
msgstr ""
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "Flytta"
@@ -3328,31 +3419,22 @@ msgstr "Skapa Skript"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find in files"
+msgid "Find in Files"
msgstr "%d fler filer"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find: "
+msgid "Find:"
msgstr "Hitta"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Whole words"
-msgstr "Hela Ord"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "Matcha gemener/versaler"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "Skapa Mapp"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Filter: "
+msgid "Filters:"
msgstr "Filtrera noder"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -3373,6 +3455,11 @@ msgstr "Avbryt"
#: editor/find_in_files.cpp
#, fuzzy
+msgid "Find: "
+msgstr "Hitta"
+
+#: editor/find_in_files.cpp
+#, fuzzy
msgid "Replace: "
msgstr "Ersätt"
@@ -3398,7 +3485,7 @@ msgstr "ERROR: Animationsnamn finns redan!"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr "Ogiltigt namn."
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3542,19 +3629,15 @@ msgstr ""
msgid "Failed to load resource."
msgstr "Misslyckades att ladda resurs."
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "Ok"
-
#: editor/inspector_dock.cpp
#, fuzzy
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr "Expandera alla"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
-msgstr ""
+#, fuzzy
+msgid "Collapse All Properties"
+msgstr "Expandera alla"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -3603,6 +3686,11 @@ msgid "Load an existing resource from disk and edit it."
msgstr ""
#: editor/inspector_dock.cpp
+#, fuzzy
+msgid "Save the currently edited resource."
+msgstr "Spara den nuvarande animationen"
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr ""
@@ -3671,14 +3759,14 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
-msgstr ""
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
+msgstr "Skapa Prenumeration"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+#, fuzzy
+msgid "Edit Polygon"
msgstr "Redigera Polygon"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3686,30 +3774,33 @@ msgid "Insert Point"
msgstr "Infoga Punkt"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+#, fuzzy
+msgid "Edit Polygon (Remove Point)"
msgstr "Redigera Polygon (ta bort punkt)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+#, fuzzy
+msgid "Remove Polygon And Point"
msgstr "Ta bort Polygon och Punkt"
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
#, fuzzy
-msgid "Create a new polygon from scratch"
-msgstr "Skapa ny polygon från grunden"
+msgid "Create points."
+msgstr "Radera punkter"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#, fuzzy
+msgid "Erase points."
msgstr "Radera punkter"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3725,7 +3816,7 @@ msgstr "Lägg till Animation"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
+msgid "Load..."
msgstr "Ladda"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3754,15 +3845,9 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Radera punkter"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "Radera punkter"
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3803,9 +3888,8 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3841,7 +3925,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
-msgid "Add Node.."
+msgid "Add Node..."
msgstr "Lägg Till Node"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -4129,7 +4213,7 @@ msgstr "Anslut Noder"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "Ta bort valt spår."
#: editor/plugins/animation_state_machine_editor.cpp
@@ -4200,10 +4284,6 @@ msgid "Amount:"
msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr ""
@@ -4412,7 +4492,7 @@ msgstr "Alla"
msgid "Plugins"
msgstr ""
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "Sortera:"
@@ -4540,6 +4620,10 @@ msgid "Resize CanvasItem"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
msgstr ""
@@ -4560,21 +4644,19 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "Zooma Ut"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "Zooma Ut"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Zooma In"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4603,6 +4685,11 @@ msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "Växla Läge"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4700,6 +4787,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr "Återställer objektets barns egenskap att väljas."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "Singleton"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr ""
@@ -4750,6 +4842,10 @@ msgid "Show Viewport"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr ""
@@ -4823,8 +4919,17 @@ msgstr ""
"Dra & släpp + Alt: Ändra Node-Typ"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr ""
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "Skapa Prenumeration"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Redigera Polygon"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Redigera Polygon (ta bort punkt)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
@@ -4927,38 +5032,9 @@ msgid "Item List Editor"
msgstr ""
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-#, fuzzy
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"Ingen OccluderPolygon2D resurs på denna Node.\n"
-"Skapa och tilldela en?"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr ""
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr ""
@@ -5199,12 +5275,12 @@ msgid "Populate"
msgstr ""
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
+msgid "Generating Visibility Rect"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -5234,6 +5310,12 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
#, fuzzy
+msgid "Convert to CPUParticles"
+msgstr "Konvertera till Versaler"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
msgid "Particles"
msgstr "Partiklar"
@@ -5304,13 +5386,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "Konvertera till Versaler"
+msgid "Generate AABB"
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5334,6 +5415,11 @@ msgid "Add Point to Curve"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "Redigera Nodkurva"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr ""
@@ -5361,6 +5447,10 @@ msgid "Click: Add Point"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr ""
@@ -5376,11 +5466,6 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr ""
@@ -5438,6 +5523,10 @@ msgstr ""
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5449,7 +5538,13 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync bones"
+msgid "Sync Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5461,39 +5556,42 @@ msgid "Create Polygon & UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
+msgid "Create Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
+msgid "Remove Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Split already exists."
-msgstr "Autoload '%s' finns redan!"
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Add Split"
-msgstr "Lägg till Signal"
+msgid "Add Custom Polygon"
+msgstr "Redigera Polygon"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "Ogiltig Sökväg"
+msgid "Remove Custom Polygon"
+msgstr "Ta bort Polygon och Punkt"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Transform UV Map"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Ta Bort Mall"
+msgid "Transform Polygon"
+msgstr "Transformera"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Transform UV Map"
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
+msgid "Open Polygon 2D UV editor."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5506,12 +5604,13 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "Redigera Polygon"
+msgid "Points"
+msgstr "Flytta Ner"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Splits"
-msgstr ""
+#, fuzzy
+msgid "Polygons"
+msgstr "Redigera Polygon"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Bones"
@@ -5519,12 +5618,8 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
-msgstr "Skapa Prenumeration"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
-msgstr ""
+msgid "Move Points"
+msgstr "Flytta Ner"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
@@ -5551,20 +5646,21 @@ msgid "Scale Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "Välj en mapp att skanna"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5589,6 +5685,11 @@ msgid "Grid Settings"
msgstr "Inställningar"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr ""
@@ -5646,11 +5747,6 @@ msgid "Paste Resource"
msgstr "Klistra in Resurs"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
#, fuzzy
msgid "Instance:"
@@ -5658,12 +5754,17 @@ msgstr "Instans:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
#, fuzzy
msgid "Type:"
msgstr "Typ:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr "Ladda Resurs"
@@ -5699,6 +5800,11 @@ msgstr "Fel vid sparande av TileSet!"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
+msgid "Error: could not load file."
+msgstr "Fel - Kunde inte skapa Skript i filsystemet."
+
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Error could not load file."
msgstr "Fel - Kunde inte skapa Skript i filsystemet."
@@ -5708,21 +5814,24 @@ msgid "Error saving file!"
msgstr "Fel vid sparande av TileSet!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr ""
+#, fuzzy
+msgid "Error while saving theme."
+msgstr "Fel vid sparande."
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Error saving"
+msgid "Error Saving"
msgstr "Fel vid sparande"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr ""
+#, fuzzy
+msgid "Error importing theme."
+msgstr "Fel vid sparande av scenen."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
-msgstr ""
+#, fuzzy
+msgid "Error Importing"
+msgstr "Fel vid laddning:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -5745,6 +5854,15 @@ msgid "Import Theme"
msgstr "Importera Tema"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Error saving"
+msgstr "Fel vid sparande"
+
+#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "Save Theme As..."
msgstr "Spara Tema Som..."
@@ -5792,8 +5910,8 @@ msgstr "Fil"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile"
-msgstr "Visa Filer"
+msgid "Open..."
+msgstr "Öppen"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5810,12 +5928,8 @@ msgstr "Kopiera Sökvägen"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Show In File System"
-msgstr "Visa i Filsystemet"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
-msgstr ""
+msgid "History Previous"
+msgstr "Föregående flik"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
@@ -5829,6 +5943,11 @@ msgstr "Spara Tema"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
+msgid "Import Theme..."
+msgstr "Importera Tema"
+
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Reload Theme"
msgstr "Ladda om Tema"
@@ -5838,11 +5957,6 @@ msgid "Save Theme"
msgstr "Spara Tema"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Save Theme As"
-msgstr "Spara Tema Som"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr ""
@@ -5891,7 +6005,7 @@ msgid "Keep Debugger Open"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5899,10 +6013,6 @@ msgid "Open Godot online documentation"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -5941,19 +6051,9 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Search results"
+msgid "Search Results"
msgstr "Sök Hjälp"
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "Sök Klasser"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
@@ -5964,6 +6064,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "Funktion:"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr ""
@@ -5999,10 +6108,6 @@ msgstr ""
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
#, fuzzy
@@ -6057,12 +6162,14 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
-msgstr ""
+#, fuzzy
+msgid "Convert Indent to Spaces"
+msgstr "Konvertera till Versaler"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
-msgstr ""
+#, fuzzy
+msgid "Convert Indent to Tabs"
+msgstr "Konvertera till %s"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -6079,22 +6186,14 @@ msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Convert To Uppercase"
-msgstr "Konvertera till Versaler"
+msgid "Go to Next Breakpoint"
+msgstr "Gå Till Nästa Steg"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Convert To Lowercase"
-msgstr "Konvertera till Gemener"
+msgid "Go to Previous Breakpoint"
+msgstr "Ge Till Föregående Steg"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
@@ -6102,16 +6201,18 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr "Filtrera Filer..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
-msgstr ""
+#, fuzzy
+msgid "Go to Function..."
+msgstr "Ta bort Funktion"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
-msgstr ""
+#, fuzzy
+msgid "Go to Line..."
+msgstr "GÃ¥ till Rad"
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
@@ -6212,6 +6313,15 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "Pitch"
+msgstr "Växla"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -6392,6 +6502,11 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "Visa Information"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -6498,10 +6613,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap To Floor"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6619,6 +6730,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
msgid "Sprite is empty!"
@@ -6741,11 +6856,16 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6919,6 +7039,11 @@ msgid "Fix Invalid Tiles"
msgstr "Ogiltigt namn."
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "Rensa Urval"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6967,32 +7092,37 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "Ta bort Urval"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
+msgid "Rotate left"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate right"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr "Rotera 90 grader"
+msgid "Flip horizontally"
+msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
-msgstr "Rotera 180 grader"
+msgid "Flip vertically"
+msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
-msgstr "Rotera 270 grader"
+#, fuzzy
+msgid "Clear transform"
+msgstr "Transformera"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr "Flytta nuvarande spår upp."
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -7004,33 +7134,60 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "Klistra in Animation"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "Radera punkter"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "Skapa Prenumeration"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "Flytta nuvarande spår upp."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
-msgstr "Skapa från scen?"
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Ta Bort Mall"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -7040,16 +7197,27 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "Ta bort valda filer?"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr ""
+msgstr "Skapa Mapp"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "Radera punkter"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr "Skapa Mapp"
@@ -7068,12 +7236,99 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr "Skapa Mapp"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Skapa Mapp"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "Redigera Filter"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Redigera Polygon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Redigera Polygon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Redigera Polygon"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "Klistra in Animation"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Ta Bort Mall"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "Ta bort Polygon och Punkt"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "Ta bort Animation"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "Redigera Filter"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Skapa Prenumeration"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Skapa Prenumeration"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "This property can't be changed."
msgstr "Åtgärden kan inte göras utan en scen."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Tile Set"
+msgid "TileSet"
msgstr "TileSet..."
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -7110,6 +7365,15 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Exporting All"
+msgstr "Exportera"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -7118,6 +7382,11 @@ msgid "Add..."
msgstr "Lägg till..."
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "Exportera Projekt"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr "Resurser"
@@ -7175,10 +7444,50 @@ msgstr ""
#: editor/project_export.cpp
#, fuzzy
+msgid "Script"
+msgstr "Nytt Skript"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Script Export Mode:"
+msgstr "Exportera Projekt"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
+#, fuzzy
msgid "Export PCK/Zip"
msgstr "Exportera PCK/Zip"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export mode?"
+msgstr "Exportera Projekt"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Export All"
+msgstr "Exportera"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -7322,7 +7631,7 @@ msgstr "Namnlöst Projekt"
#: editor/project_manager.cpp
#, fuzzy
-msgid "Can't open project"
+msgid "Can't open project at '%s'."
msgstr "Kan inte öppna projekt"
#: editor/project_manager.cpp
@@ -7331,6 +7640,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7664,10 +7991,6 @@ msgstr ""
msgid "General"
msgstr "Allmänt"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7809,10 +8132,6 @@ msgstr "Välj en Node"
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr ""
@@ -7902,7 +8221,7 @@ msgid "Step"
msgstr "Steg (s):"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7911,7 +8230,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7954,7 +8273,7 @@ msgstr "Versaler"
msgid "Reset"
msgstr "Återställ Zoom"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
#, fuzzy
msgid "Error"
msgstr "Fel"
@@ -8017,6 +8336,11 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Instance Child Scene"
+msgstr "Instansiera Barn-Scen"
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr ""
@@ -8059,6 +8383,12 @@ msgid "Save New Scene As..."
msgstr "Spara Ny Scen Som..."
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
#, fuzzy
msgid "Editable Children"
msgstr "Redigerbara Barn"
@@ -8140,6 +8470,11 @@ msgstr ""
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Open documentation"
+msgstr "Öppna Senaste"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Delete Node(s)"
msgstr "Ta bort Nod(er)"
@@ -8150,13 +8485,13 @@ msgstr "Lägg till Barn-Node"
#: editor/scene_tree_dock.cpp
#, fuzzy
-msgid "Instance Child Scene"
-msgstr "Instansiera Barn-Scen"
+msgid "Change Type"
+msgstr "Ändra Typ"
#: editor/scene_tree_dock.cpp
#, fuzzy
-msgid "Change Type"
-msgstr "Ändra Typ"
+msgid "Extend Script"
+msgstr "Öppna Skript"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -8321,6 +8656,11 @@ msgid "Path is empty"
msgstr "Sökvägen är tom"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Filename is empty"
+msgstr "Sökvägen är tom"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -8417,22 +8757,8 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr "Varning"
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr "Fel:"
-
-#: editor/script_editor_debugger.cpp
-#, fuzzy
-msgid "Source:"
-msgstr "Källa:"
-
-#: editor/script_editor_debugger.cpp
-#, fuzzy
-msgid "Function:"
-msgstr "Funktion:"
+msgid "Stack Trace"
+msgstr ""
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8466,20 +8792,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-#, fuzzy
-msgid "Variable"
-msgstr "Variabel"
-
-#: editor/script_editor_debugger.cpp
-#, fuzzy
-msgid "Errors:"
-msgstr "Fel:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -8686,7 +8998,7 @@ msgid "GDNative"
msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+msgid "Step argument is zero!"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
@@ -8926,11 +9238,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -9218,6 +9526,11 @@ msgstr ""
#: modules/visual_script/visual_script_editor.cpp
#, fuzzy
+msgid "Members:"
+msgstr "Medlemmar:"
+
+#: modules/visual_script/visual_script_editor.cpp
+#, fuzzy
msgid "Available Nodes:"
msgstr "Tillgängliga Noder:"
@@ -9323,11 +9636,11 @@ msgid "Search VisualScript"
msgstr "Fäst Skript"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -9418,6 +9731,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -9462,6 +9781,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
#, fuzzy
msgid "PathFollow2D only works when set as a child of a Path2D node."
@@ -9593,6 +9918,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -9612,6 +9947,30 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+"PathFollow2D fungerar bara när den är satt som ett barn till en Path2D-Node."
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+"PathFollow2D fungerar bara när den är satt som ett barn till en Path2D-Node."
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9644,7 +10003,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9701,6 +10060,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr ""
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
#, fuzzy
msgid "Raw Mode"
@@ -9721,11 +10084,6 @@ msgstr "Varning!"
msgid "Please Confirm..."
msgstr "Vänligen Bekräfta..."
-#: scene/gui/file_dialog.cpp
-#, fuzzy
-msgid "Select this Folder"
-msgstr "Välj en Node"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9733,6 +10091,10 @@ msgid ""
"hide upon running."
msgstr ""
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9782,10 +10144,6 @@ msgstr "Ogiltig teckenstorlek."
msgid "Input"
msgstr ""
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
@@ -9804,6 +10162,151 @@ msgid "Varyings can only be assigned in vertex function."
msgstr ""
#, fuzzy
+#~ msgid "Split already exists."
+#~ msgstr "Autoload '%s' finns redan!"
+
+#, fuzzy
+#~ msgid "Add Split"
+#~ msgstr "Lägg till Signal"
+
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr "Ogiltig Sökväg"
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "Ta Bort Mall"
+
+#, fuzzy
+#~ msgid "Poly"
+#~ msgstr "Redigera Polygon"
+
+#, fuzzy
+#~ msgid "Select a split to erase it."
+#~ msgstr "Välj en mapp att skanna"
+
+#, fuzzy
+#~ msgid "Add Node.."
+#~ msgstr "Lägg Till Node"
+
+#~ msgid "Create from scene?"
+#~ msgstr "Skapa från scen?"
+
+#, fuzzy
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "Skapa ny polygon från grunden"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "Zooma Ut"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "Zooma In"
+
+#, fuzzy
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "Ingen OccluderPolygon2D resurs på denna Node.\n"
+#~ "Skapa och tilldela en?"
+
+#, fuzzy
+#~ msgid "New TextFile"
+#~ msgstr "Visa Filer"
+
+#, fuzzy
+#~ msgid "Save Theme As"
+#~ msgstr "Spara Tema Som"
+
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Zooma In"
+
+#, fuzzy
+#~ msgid "Class List:"
+#~ msgstr "Klasslista:"
+
+#, fuzzy
+#~ msgid "Search Classes"
+#~ msgstr "Sök Klasser"
+
+#, fuzzy
+#~ msgid "Public Methods"
+#~ msgstr "Publika Metoder"
+
+#, fuzzy
+#~ msgid "Public Methods:"
+#~ msgstr "Publika Metoder:"
+
+#, fuzzy
+#~ msgid "Property: "
+#~ msgstr "Egenskaper"
+
+#, fuzzy
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "Växla Favorit"
+
+#, fuzzy
+#~ msgid "Show current scene file."
+#~ msgstr "Skapa Mapp"
+
+#, fuzzy
+#~ msgid "Whole words"
+#~ msgstr "Hela Ord"
+
+#, fuzzy
+#~ msgid "Match case"
+#~ msgstr "Matcha gemener/versaler"
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#, fuzzy
+#~ msgid "Show In File System"
+#~ msgstr "Visa i Filsystemet"
+
+#, fuzzy
+#~ msgid "Search in files"
+#~ msgstr "Sök Klasser"
+
+#, fuzzy
+#~ msgid "Convert To Uppercase"
+#~ msgstr "Konvertera till Versaler"
+
+#, fuzzy
+#~ msgid "Convert To Lowercase"
+#~ msgstr "Konvertera till Gemener"
+
+#~ msgid "Rotate 90 degrees"
+#~ msgstr "Rotera 90 grader"
+
+#~ msgid "Rotate 180 degrees"
+#~ msgstr "Rotera 180 grader"
+
+#~ msgid "Rotate 270 degrees"
+#~ msgstr "Rotera 270 grader"
+
+#~ msgid "Warning"
+#~ msgstr "Varning"
+
+#~ msgid "Error:"
+#~ msgstr "Fel:"
+
+#, fuzzy
+#~ msgid "Source:"
+#~ msgstr "Källa:"
+
+#, fuzzy
+#~ msgid "Variable"
+#~ msgstr "Variabel"
+
+#, fuzzy
+#~ msgid "Errors:"
+#~ msgstr "Fel:"
+
+#, fuzzy
#~ msgid "Change Comment"
#~ msgstr "Ändra Kommentar"
@@ -9831,9 +10334,6 @@ msgstr ""
#~ msgid "Anim Track Change Wrap Mode"
#~ msgstr "Anim Spåra Ändra Linda om Läge"
-#~ msgid "Edit Node Curve"
-#~ msgstr "Redigera Nodkurva"
-
#~ msgid "Edit Selection Curve"
#~ msgstr "Redigera Urvalsurva"
@@ -9906,10 +10406,6 @@ msgstr ""
#~ msgstr "Kör Skript"
#, fuzzy
-#~ msgid "Save the current animation"
-#~ msgstr "Spara den nuvarande animationen"
-
-#, fuzzy
#~ msgid "Copy Animation"
#~ msgstr "Kopiera Animation"
@@ -9933,10 +10429,6 @@ msgstr ""
#~ msgstr "Sekvens"
#, fuzzy
-#~ msgid "Switch"
-#~ msgstr "Växla"
-
-#, fuzzy
#~ msgid "Iterator"
#~ msgstr "Iterator"
diff --git a/editor/translations/ta.po b/editor/translations/ta.po
index c3084b15ba..22071147f0 100644
--- a/editor/translations/ta.po
+++ b/editor/translations/ta.po
@@ -1,6 +1,6 @@
# Tamil translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Senthil Kumar K <logickumar@gmail.com>, 2017.
@@ -8,15 +8,17 @@
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2017-12-20 15:43+0000\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:43+0100\n"
"Last-Translator: Senthil Kumar K <logickumar@gmail.com>\n"
"Language-Team: Tamil <https://hosted.weblate.org/projects/godot-engine/godot/"
"ta/>\n"
"Language: ta\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.18\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -24,7 +26,7 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr ""
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
@@ -255,7 +257,6 @@ msgstr ""
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -383,8 +384,7 @@ msgstr ""
msgid "Scale From Cursor"
msgstr ""
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr ""
@@ -398,11 +398,11 @@ msgid "Delete Selection"
msgstr "அனைதà¯à®¤à¯ தேரà¯à®µà¯à®•ளà¯"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+msgid "Go to Next Step"
msgstr ""
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+msgid "Go to Previous Step"
msgstr ""
#: editor/animation_track_editor.cpp
@@ -505,11 +505,11 @@ msgstr ""
msgid "Replaced %d occurrence(s)."
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr ""
@@ -525,15 +525,19 @@ msgstr ""
msgid "Selection Only"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr ""
@@ -542,10 +546,10 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Zoom:"
+msgid "Font Size:"
msgstr ""
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr ""
@@ -576,6 +580,7 @@ msgstr ""
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -654,7 +659,7 @@ msgid "Edit Connection: "
msgstr "தேரà¯à®µà¯ வளைவை [Selection Curve] திரà¯à®¤à¯à®¤à¯"
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -700,23 +705,20 @@ msgid "Recent:"
msgstr ""
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr ""
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr ""
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr ""
@@ -751,8 +753,7 @@ msgid "Resource"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr ""
@@ -773,9 +774,10 @@ msgid "Search Replacement Resource:"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -805,7 +807,7 @@ msgid "Error loading:"
msgstr ""
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+msgid "Load failed due to missing dependencies:"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -864,14 +866,6 @@ msgstr ""
msgid "Thanks from the Godot community!"
msgstr ""
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr ""
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr ""
@@ -961,7 +955,7 @@ msgid "Uncompressing Assets"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+msgid "Package installed successfully!"
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1043,8 +1037,7 @@ msgid "Bus options"
msgstr ""
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr ""
@@ -1203,7 +1196,7 @@ msgid "Add AutoLoad"
msgstr ""
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr ""
@@ -1211,8 +1204,8 @@ msgstr ""
msgid "Node Name:"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr ""
@@ -1282,11 +1275,15 @@ msgid "Template file not found:"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
+msgid "Select This Folder"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1294,12 +1291,12 @@ msgid "Copy Path"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+msgid "Show in File Manager"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1335,7 +1332,8 @@ msgid "Open a File or Directory"
msgstr ""
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr ""
@@ -1393,8 +1391,7 @@ msgstr ""
msgid "Preview:"
msgstr ""
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr ""
@@ -1410,24 +1407,11 @@ msgstr ""
msgid "(Re)Importing Assets"
msgstr ""
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr ""
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr ""
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr ""
@@ -1444,27 +1428,27 @@ msgid "Brief Description:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Members"
+msgid "Properties"
msgstr ""
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
+#: editor/editor_help.cpp
+msgid "Properties:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
+msgid "Methods"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods:"
+msgid "Methods:"
msgstr ""
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
+msgid "Theme Properties"
msgstr ""
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
+msgid "Theme Properties:"
msgstr ""
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
@@ -1492,7 +1476,11 @@ msgid "Constants:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Description"
+msgid "Class Description"
+msgstr ""
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
msgstr ""
#: editor/editor_help.cpp
@@ -1507,11 +1495,11 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Properties"
+msgid "Property Descriptions"
msgstr ""
#: editor/editor_help.cpp
-msgid "Property Description:"
+msgid "Property Descriptions:"
msgstr ""
#: editor/editor_help.cpp
@@ -1521,11 +1509,11 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Methods"
+msgid "Method Descriptions"
msgstr ""
#: editor/editor_help.cpp
-msgid "Method Description:"
+msgid "Method Descriptions:"
msgstr ""
#: editor/editor_help.cpp
@@ -1534,11 +1522,52 @@ msgid ""
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-#: editor/editor_inspector.cpp
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr ""
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
msgstr ""
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1572,6 +1601,11 @@ msgstr ""
msgid "Error saving resource!"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr ""
@@ -1626,10 +1660,20 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr ""
@@ -1857,6 +1901,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1897,6 +1947,11 @@ msgstr ""
msgid "Default"
msgstr ""
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Play This Scene"
msgstr ""
@@ -1978,7 +2033,7 @@ msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2007,7 +2062,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -2031,7 +2086,7 @@ msgstr ""
msgid "Export"
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr ""
@@ -2044,6 +2099,7 @@ msgid "Quit to Project List"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr ""
@@ -2151,10 +2207,6 @@ msgstr ""
msgid "Help"
msgstr ""
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2248,21 +2300,21 @@ msgstr ""
msgid "Disable Update Spinner"
msgstr ""
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr ""
#: editor/editor_node.cpp
-msgid "Node"
+msgid "FileSystem"
msgstr ""
#: editor/editor_node.cpp
-msgid "FileSystem"
+msgid "Inspector"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Node"
msgstr ""
#: editor/editor_node.cpp
@@ -2399,7 +2451,7 @@ msgstr ""
msgid "Physics Frame %"
msgstr ""
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr ""
@@ -2423,7 +2475,7 @@ msgstr ""
msgid "Calls"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2435,20 +2487,43 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Invalid RID"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr ""
@@ -2460,10 +2535,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2472,7 +2543,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr ""
@@ -2753,6 +2825,10 @@ msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr ""
#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr ""
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
@@ -2788,8 +2864,8 @@ msgstr ""
msgid "Unable to update dependencies:"
msgstr ""
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2797,10 +2873,6 @@ msgid "Provided name contains invalid characters"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr ""
@@ -2825,27 +2897,19 @@ msgid "Duplicating folder:"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
+msgid "Open Scene(s)"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Move To..."
+msgid "Instance"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Open Scene(s)"
+msgid "Add to favorites"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Instance"
+msgid "Remove from favorites"
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2856,12 +2920,20 @@ msgstr ""
msgid "View Owners..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr ""
+
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Duplicate..."
msgstr "அசைவூடà¯à®Ÿà¯ போலிபசà¯à®šà®¾à®µà®¿à®•ளà¯"
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
msgstr ""
@@ -2869,6 +2941,14 @@ msgstr ""
msgid "New Resource..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr ""
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -2889,11 +2969,11 @@ msgid "Re-Scan Filesystem"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Toggle folder status as Favorite."
+msgid "Toggle split mode"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Show current scene file."
+msgid "Search files"
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2901,20 +2981,12 @@ msgid "Instance the selected scene(s) as child of the selected node."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Search files"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
msgstr ""
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr ""
@@ -2931,27 +3003,19 @@ msgid "Create Script"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Find in files"
+msgid "Find in Files"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Find: "
+msgid "Find:"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Whole words"
+msgid "Folder:"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Match case"
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Filter: "
+msgid "Filters:"
msgstr ""
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -2968,6 +3032,10 @@ msgid "Cancel"
msgstr ""
#: editor/find_in_files.cpp
+msgid "Find: "
+msgstr ""
+
+#: editor/find_in_files.cpp
msgid "Replace: "
msgstr ""
@@ -2988,7 +3056,7 @@ msgid "Group name already exists."
msgstr ""
#: editor/groups_editor.cpp
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr ""
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3124,17 +3192,12 @@ msgstr ""
msgid "Failed to load resource."
msgstr ""
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr ""
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+msgid "Collapse All Properties"
msgstr ""
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3179,6 +3242,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr ""
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr ""
@@ -3239,14 +3306,12 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+msgid "Edit Polygon"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3254,29 +3319,29 @@ msgid "Insert Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+msgid "Remove Polygon And Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3291,7 +3356,7 @@ msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Load.."
+msgid "Load..."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3320,12 +3385,8 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-msgid "Create points."
-msgstr ""
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-msgid "Erase points."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3365,9 +3426,8 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3401,7 +3461,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add Node.."
+msgid "Add Node..."
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3669,7 +3729,7 @@ msgid "Connect nodes."
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3737,10 +3797,6 @@ msgid "Amount:"
msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr ""
@@ -3938,7 +3994,7 @@ msgstr ""
msgid "Plugins"
msgstr ""
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr ""
@@ -4062,6 +4118,10 @@ msgid "Resize CanvasItem"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
msgstr ""
@@ -4082,15 +4142,15 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom out"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom reset"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom in"
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -4122,6 +4182,10 @@ msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4216,6 +4280,10 @@ msgid "Restores the object's children's ability to be selected."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr ""
@@ -4266,6 +4334,10 @@ msgid "Show Viewport"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr ""
@@ -4334,7 +4406,15 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
+msgid "Create Polygon3D"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
msgstr ""
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
@@ -4436,35 +4516,9 @@ msgid "Item List Editor"
msgstr ""
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr ""
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr ""
@@ -4696,12 +4750,12 @@ msgid "Populate"
msgstr ""
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
+msgid "Generating Visibility Rect"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -4730,6 +4784,11 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr ""
@@ -4799,11 +4858,11 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Convert to CPUParticles"
+msgid "Generate AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -4828,6 +4887,11 @@ msgid "Add Point to Curve"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "கண௠வளைவை[Node Curve] திரà¯à®¤à¯à®¤à¯"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr ""
@@ -4855,6 +4919,10 @@ msgid "Click: Add Point"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr ""
@@ -4870,11 +4938,6 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr ""
@@ -4931,6 +4994,10 @@ msgstr ""
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
msgid "Move joint"
msgstr ""
@@ -4941,7 +5008,13 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync bones"
+msgid "Sync Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -4953,63 +5026,63 @@ msgid "Create Polygon & UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
+msgid "Create Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
+msgid "Remove Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split already exists."
+msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Add Split"
+msgid "Add Custom Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Invalid Split: "
+msgid "Remove Custom Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Remove Split"
+msgid "Transform UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Transform UV Map"
+msgid "Transform Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Polygon 2D UV Editor"
+msgid "Open Polygon 2D UV editor."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UV"
+msgid "Polygon 2D UV Editor"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Poly"
+msgid "UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Splits"
+msgid "Points"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Bones"
+msgid "Polygons"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create Polygon"
+msgid "Bones"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Move Points"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5037,19 +5110,21 @@ msgid "Scale Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Select a split to erase it"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5073,6 +5148,11 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr ""
@@ -5130,22 +5210,22 @@ msgid "Paste Resource"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr ""
@@ -5175,6 +5255,10 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Error could not load file."
msgstr ""
@@ -5183,19 +5267,19 @@ msgid "Error saving file!"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
+msgid "Error while saving theme."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+msgid "Error Saving"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
+msgid "Error importing theme."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+msgid "Error Importing"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5215,6 +5299,14 @@ msgid "Import Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr ""
@@ -5255,7 +5347,7 @@ msgid "File"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile"
+msgid "Open..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5271,11 +5363,7 @@ msgid "Copy Script Path"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+msgid "History Previous"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5288,15 +5376,15 @@ msgid "Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Reload Theme"
+msgid "Import Theme..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme"
+msgid "Reload Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
+msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5346,7 +5434,7 @@ msgid "Keep Debugger Open"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5354,10 +5442,6 @@ msgid "Open Godot online documentation"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -5392,24 +5476,23 @@ msgid "Debugger"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search results"
+msgid "Search Results"
msgstr ""
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search in files"
+#: editor/plugins/script_text_editor.cpp
+msgid "Line"
msgstr ""
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
+#: editor/plugins/script_text_editor.cpp
+msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Line"
+msgid "Go to Function"
msgstr ""
-#: editor/plugins/script_text_editor.cpp
-msgid "(ignore)"
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5444,10 +5527,6 @@ msgstr ""
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5499,11 +5578,11 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5520,19 +5599,11 @@ msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
+msgid "Go to Next Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
+msgid "Go to Previous Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5540,15 +5611,15 @@ msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+msgid "Go to Function..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5640,6 +5711,14 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -5804,6 +5883,10 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -5903,10 +5986,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap To Floor"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6023,6 +6102,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
msgstr ""
@@ -6136,11 +6219,16 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6304,6 +6392,11 @@ msgid "Fix Invalid Tiles"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "அனைதà¯à®¤à¯ தேரà¯à®µà¯à®•ளà¯"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6349,31 +6442,36 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "அனைதà¯à®¤à¯ தேரà¯à®µà¯à®•ளà¯"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
+msgid "Rotate left"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
+msgid "Rotate right"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Flip vertically"
msgstr ""
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Clear transform"
+msgstr "உரà¯à®®à®¾à®±à¯à®±à®®à¯ அசைவூடà¯à®Ÿà¯"
+
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6385,17 +6483,35 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Paste bitmask."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Erase bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new polygon."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove selected texture? This will remove all tiles which use it."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6403,7 +6519,7 @@ msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6411,7 +6527,11 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+msgid "Remove Texture"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6421,15 +6541,25 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "அனைதà¯à®¤à¯ தேரà¯à®µà¯à®•ளà¯"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "அனைதà¯à®¤à¯ தேரà¯à®µà¯à®•ளà¯"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr ""
@@ -6447,11 +6577,85 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Tile"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Tile"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "This property can't be changed."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
+msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6487,6 +6691,14 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6495,6 +6707,10 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+msgid "Export Path"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6549,10 +6765,46 @@ msgid "Feature List:"
msgstr ""
#: editor/project_export.cpp
+msgid "Script"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr ""
#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -6679,7 +6931,7 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
-msgid "Can't open project"
+msgid "Can't open project at '%s'."
msgstr ""
#: editor/project_manager.cpp
@@ -6688,6 +6940,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7001,10 +7271,6 @@ msgstr ""
msgid "General"
msgstr ""
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7138,10 +7404,6 @@ msgstr ""
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr ""
@@ -7226,7 +7488,7 @@ msgid "Step"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7235,7 +7497,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7275,7 +7537,7 @@ msgstr ""
msgid "Reset"
msgstr ""
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7334,6 +7596,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr ""
@@ -7370,6 +7636,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7440,6 +7712,10 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr ""
@@ -7448,11 +7724,11 @@ msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Change Type"
+msgid "Extend Script"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -7602,6 +7878,10 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -7690,19 +7970,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -7734,18 +8002,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -7942,7 +8198,7 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+msgid "Step argument is zero!"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
@@ -8164,11 +8420,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -8438,6 +8690,10 @@ msgid "Base Type:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr ""
@@ -8536,11 +8792,11 @@ msgid "Search VisualScript"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8618,6 +8874,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -8656,6 +8918,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -8773,6 +9041,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -8792,6 +9070,26 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -8824,7 +9122,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -8877,6 +9175,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr ""
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr ""
@@ -8893,10 +9195,6 @@ msgstr ""
msgid "Please Confirm..."
msgstr ""
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr ""
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -8904,6 +9202,10 @@ msgid ""
"hide upon running."
msgstr ""
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -8949,10 +9251,6 @@ msgstr ""
msgid "Input"
msgstr ""
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for shader."
msgstr ""
@@ -8987,8 +9285,5 @@ msgstr ""
#~ msgid "Anim Track Change Wrap Mode"
#~ msgstr "அசைவூடà¯à®Ÿà¯ பாதை மறை[wrap] விதம௠மாறà¯à®±à¯"
-#~ msgid "Edit Node Curve"
-#~ msgstr "கண௠வளைவை[Node Curve] திரà¯à®¤à¯à®¤à¯"
-
#~ msgid "Move Add Key"
#~ msgstr "சேர௠மà¯à®•à¯à®•ியபà¯à®ªà¯à®³à¯à®³à®¿à®¯à¯ˆ நகரà¯à®¤à¯à®¤à¯"
diff --git a/editor/translations/th.po b/editor/translations/th.po
index 7828977638..4a7cc010a3 100644
--- a/editor/translations/th.po
+++ b/editor/translations/th.po
@@ -1,6 +1,6 @@
# Thai translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Kaveeta Vivatchai <goodytong@gmail.com>, 2017.
@@ -9,15 +9,17 @@
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-03-10 03:46+0000\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:43+0100\n"
"Last-Translator: Poommetee Ketson <poommetee@protonmail.com>\n"
"Language-Team: Thai <https://hosted.weblate.org/projects/godot-engine/godot/"
"th/>\n"
"Language: th\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 2.20-dev\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -25,7 +27,7 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr "ตัวà¹à¸›à¸£à¹ƒà¸™ convert() ผิดพลาด ใช้ค่าคงที่ TYPE_* เท่านั้น"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr "ไบต์ไม่ครบหรือผิดรูปà¹à¸šà¸š ไม่สามารถà¹à¸›à¸¥à¸‡à¸„่าได้"
@@ -272,7 +274,6 @@ msgstr "เพิ่ม %d à¹à¸—ร็à¸à¹ƒà¸«à¸¡à¹ˆà¹à¸¥à¸°à¹€à¸žà¸´à¹ˆà¸¡à¸
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -407,8 +408,7 @@ msgstr "ปรับอัตราส่วนเวลาคีย์ที่
msgid "Scale From Cursor"
msgstr "ปรับอัตราส่วนเวลาตามเคอร์เซอร์"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "ทำซ้ำที่เลือà¸"
@@ -422,11 +422,13 @@ msgid "Delete Selection"
msgstr "ลบสิ่งที่เลือà¸"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+#, fuzzy
+msgid "Go to Next Step"
msgstr "ถัดไป"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+#, fuzzy
+msgid "Go to Previous Step"
msgstr "à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²"
#: editor/animation_track_editor.cpp
@@ -529,11 +531,11 @@ msgstr "ไม่พบ"
msgid "Replaced %d occurrence(s)."
msgstr "à¹à¸—นที่à¹à¸¥à¹‰à¸§ %d ครั้ง"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "ตรงตามอัà¸à¸©à¸£à¸žà¸´à¸¡à¸žà¹Œà¹€à¸¥à¹‡à¸-ใหà¸à¹ˆ"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "ทั้งคำ"
@@ -549,15 +551,19 @@ msgstr "à¹à¸—นที่ทั้งหมด"
msgid "Selection Only"
msgstr "เฉพาะที่à¸à¸³à¸¥à¸±à¸‡à¹€à¸¥à¸·à¸­à¸"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "ขยาย"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "ย่อ"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "รีเซ็ตซูม"
@@ -568,10 +574,10 @@ msgstr "คำเตือน"
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "ซูม (%):"
+msgid "Font Size:"
+msgstr "ขนาดฟอนต์ต้นฉบับ:"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "บรรทัด:"
@@ -602,6 +608,7 @@ msgstr "เพิ่ม"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -683,7 +690,7 @@ msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¹‚ยง"
#: editor/connections_dialog.cpp
#, fuzzy
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "ยืนยันà¸à¸²à¸£à¸£à¸±à¸™à¹‚ปรเจà¸à¸•์มาà¸à¸à¸§à¹ˆà¸² 1 โปรเจà¸à¸•์?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -732,23 +739,20 @@ msgid "Recent:"
msgstr "ล่าสุด:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "ค้นหา:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "พบ:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "รายละเอียด:"
@@ -787,8 +791,7 @@ msgid "Resource"
msgstr "รีซอร์ส"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡"
@@ -809,9 +812,10 @@ msgid "Search Replacement Resource:"
msgstr "ค้นหารีซอร์สมาà¹à¸—นที่:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -843,7 +847,8 @@ msgid "Error loading:"
msgstr "ผิดพลาดขณะโหลด:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+#, fuzzy
+msgid "Load failed due to missing dependencies:"
msgstr "โหลดฉาà¸à¹„ม่ได้เนื่องจาà¸à¸à¸²à¸£à¸­à¹‰à¸²à¸‡à¸­à¸´à¸‡à¸ªà¸¹à¸à¸«à¸²à¸¢:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -902,14 +907,6 @@ msgstr "à¹à¸à¹‰à¹„ขค่าดิà¸à¸Šà¸±à¸™à¸™à¸²à¸£à¸µ"
msgid "Thanks from the Godot community!"
msgstr "ขอขอบคุณจาà¸à¸Šà¸¸à¸¡à¸Šà¸™à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰ Godot!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "ตà¸à¸¥à¸‡"
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "ผู้ช่วยพัฒนา Godot Engine"
@@ -1002,7 +999,8 @@ msgid "Uncompressing Assets"
msgstr "à¸à¸³à¸¥à¸±à¸‡à¸„ลายบีบอัด"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+#, fuzzy
+msgid "Package installed successfully!"
msgstr "ติดตั้งà¹à¸žà¸„เà¸à¸ˆà¹€à¸ªà¸£à¹‡à¸ˆà¸ªà¸¡à¸šà¸¹à¸£à¸“์!"
#: editor/editor_asset_installer.cpp
@@ -1084,8 +1082,7 @@ msgid "Bus options"
msgstr "ตัวเลือภBus"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "ทำซ้ำ"
@@ -1244,7 +1241,7 @@ msgid "Add AutoLoad"
msgstr "เพิ่มออโต้โหลด"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡:"
@@ -1252,8 +1249,8 @@ msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡:"
msgid "Node Name:"
msgstr "ชื่อโหนด:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "ชื่อ"
@@ -1323,12 +1320,17 @@ msgid "Template file not found:"
msgstr "ไม่พบà¹à¸¡à¹ˆà¹à¸šà¸š:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "เลือà¸à¹‚ฟลเดอร์ปัจจุบัน"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "มีไฟล์นี้อยู่à¹à¸¥à¹‰à¸§ จะเขียนทับหรือไม่?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "เลือà¸à¹‚ฟลเดอร์ปัจจุบัน"
+#, fuzzy
+msgid "Select This Folder"
+msgstr "เลือà¸à¹‚ฟลเดอร์นี้"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
@@ -1336,12 +1338,13 @@ msgstr "คัดลอà¸à¸•ำà¹à¸«à¸™à¹ˆà¸‡"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr "à¹à¸ªà¸”งในตัวจัดà¸à¸²à¸£à¹„ฟล์"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+#, fuzzy
+msgid "Show in File Manager"
msgstr "à¹à¸ªà¸”งในตัวจัดà¸à¸²à¸£à¹„ฟล์"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1377,7 +1380,8 @@ msgid "Open a File or Directory"
msgstr "เปิดไฟล์หรือโฟลเดอร์"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "บันทึà¸"
@@ -1435,8 +1439,7 @@ msgstr "ไฟล์à¹à¸¥à¸°à¹‚ฟลเดอร์:"
msgid "Preview:"
msgstr "ตัวอย่าง:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "ไฟล์:"
@@ -1452,24 +1455,11 @@ msgstr "สà¹à¸à¸™à¸•้นฉบับ"
msgid "(Re)Importing Assets"
msgstr "นำเข้าทรัพยาà¸à¸£(อีà¸à¸„รั้ง)"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "ค้นหาในคู่มือ"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "รายชื่อคลาส:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "ค้นหาคลาส"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "บนสุด"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "คลาส:"
@@ -1486,28 +1476,31 @@ msgid "Brief Description:"
msgstr "รายละเอียด:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "ตัวà¹à¸›à¸£"
+msgid "Properties"
+msgstr "คุณสมบัติ"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "ตัวà¹à¸›à¸£:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr "คุณสมบัติ:"
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "เมท็อด"
+msgid "Methods"
+msgstr "รายชื่อเมท็อด"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "เมท็อด:"
+#, fuzzy
+msgid "Methods:"
+msgstr "รายชื่อเมท็อด"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "ตัวà¹à¸›à¸£à¸˜à¸µà¸¡"
+#, fuzzy
+msgid "Theme Properties"
+msgstr "คุณสมบัติ"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "ตัวà¹à¸›à¸£à¸˜à¸µà¸¡:"
+#, fuzzy
+msgid "Theme Properties:"
+msgstr "คุณสมบัติ:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1534,10 +1527,16 @@ msgid "Constants:"
msgstr "ค่าคงที่:"
#: editor/editor_help.cpp
-msgid "Description"
+#, fuzzy
+msgid "Class Description"
msgstr "รายละเอียด"
#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
+msgstr "รายละเอียด:"
+
+#: editor/editor_help.cpp
msgid "Online Tutorials:"
msgstr "สอนใช้งานออนไลน์:"
@@ -1551,11 +1550,13 @@ msgstr ""
"color] หรือ [color=$color][url=$url2]ขอให้จัดทำ[/url][/color]"
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "คุณสมบัติ"
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "รายละเอียดตัวà¹à¸›à¸£:"
#: editor/editor_help.cpp
-msgid "Property Description:"
+#, fuzzy
+msgid "Property Descriptions:"
msgstr "รายละเอียดตัวà¹à¸›à¸£:"
#: editor/editor_help.cpp
@@ -1565,11 +1566,13 @@ msgid ""
msgstr "คุณสมบัตินี้ยังไม่มีคำอธิบาย โปรดช่วย[color=$color][url=$url]à¹à¸à¹‰à¹„ข[/url][/color]!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "รายชื่อเมท็อด"
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "รายละเอียดเมท็อด:"
#: editor/editor_help.cpp
-msgid "Method Description:"
+#, fuzzy
+msgid "Method Descriptions:"
msgstr "รายละเอียดเมท็อด:"
#: editor/editor_help.cpp
@@ -1578,12 +1581,61 @@ msgid ""
"$color][url=$url]contributing one[/url][/color]!"
msgstr "เมท็อดนี้ยังไม่มีคำอธิบาย โปรดช่วย[color=$color][url=$url]à¹à¸à¹‰à¹„ข[/url][/color]!"
-#: editor/editor_inspector.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "ค้นหาในคู่มือ"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Display All"
+msgstr "à¹à¸ªà¸”งปà¸à¸•ิ"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Classes Only"
+msgstr "คลาส"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Methods Only"
+msgstr "รายชื่อเมท็อด"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "สัà¸à¸à¸²à¸“"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Constants Only"
+msgstr "ค่าคงที่"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Properties Only"
+msgstr "คุณสมบัติ"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Theme Properties Only"
+msgstr "คุณสมบัติ"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Member Type"
+msgstr "ตัวà¹à¸›à¸£"
+
+#: editor/editor_help_search.cpp
#, fuzzy
-msgid "Property: "
+msgid "Class"
+msgstr "คลาส:"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
msgstr "คุณสมบัติ:"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr "à¸à¸³à¸«à¸™à¸”"
@@ -1617,6 +1669,11 @@ msgstr ""
msgid "Error saving resource!"
msgstr "บันทึà¸à¸£à¸µà¸‹à¸­à¸£à¹Œà¸ªà¸œà¸´à¸”พลาด!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "ตà¸à¸¥à¸‡"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "บันทึà¸à¸£à¸µà¸‹à¸­à¸£à¹Œà¸ªà¹€à¸›à¹‡à¸™..."
@@ -1671,10 +1728,20 @@ msgstr "ทำไม่ได้ถ้าไม่มีฉาà¸"
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr "บันทึà¸à¸‰à¸²à¸à¹„ม่ได้ อาจจะมีà¸à¸²à¸£à¸­à¹‰à¸²à¸‡à¸­à¸´à¸‡à¹„ม่สมบูรณ์ (อินสà¹à¸•นซ์หรือà¸à¸²à¸£à¸ªà¸·à¸šà¸—อด)"
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr "โหลด MeshLibrary เพื่อรวมไม่ได้!"
@@ -1917,6 +1984,13 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "ไม่สามารถโหลดสคริปต์จาà¸: '%s'"
#: editor/editor_node.cpp
+#, fuzzy
+msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr "ไม่สามารถโหลดสคริปต์จาà¸: '%s' ไม่ใช่สคริปต์ tool"
+
+#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr "ไม่สามารถโหลดสคริปต์จาà¸: '%s' ไม่ได้สืบทอดจาภEditorPlugin"
@@ -1962,6 +2036,12 @@ msgstr "ลบเลย์เอาต์"
msgid "Default"
msgstr "ค่าเริ่มต้น"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+#, fuzzy
+msgid "Show in FileSystem"
+msgstr "เปิดในตัวจัดà¸à¸²à¸£à¹„ฟล์"
+
#: editor/editor_node.cpp
#, fuzzy
msgid "Play This Scene"
@@ -2045,7 +2125,8 @@ msgid "Save Scene"
msgstr "บันทึà¸à¸‰à¸²à¸"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+#, fuzzy
+msgid "Save All Scenes"
msgstr "บันทึà¸à¸—ุà¸à¸‰à¸²à¸"
#: editor/editor_node.cpp
@@ -2074,7 +2155,7 @@ msgid "Undo"
msgstr "เลิà¸à¸—ำ"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "ทำซ้ำ"
@@ -2098,7 +2179,7 @@ msgstr "ตัวเลือà¸à¹‚ปรเจà¸à¸•์"
msgid "Export"
msgstr "ส่งออà¸"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "เครื่องมือ"
@@ -2112,6 +2193,7 @@ msgid "Quit to Project List"
msgstr "ปิดà¹à¸¥à¸°à¸à¸¥à¸±à¸šà¸ªà¸¹à¹ˆà¸£à¸²à¸¢à¸Šà¸·à¹ˆà¸­à¹‚ปรเจà¸à¸•์"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "à¹à¸à¹‰à¸ˆà¸¸à¸”บà¸à¸žà¸£à¹ˆà¸­à¸‡"
@@ -2228,10 +2310,6 @@ msgstr "จัดà¸à¸²à¸£à¹à¸¡à¹ˆà¹à¸šà¸šà¸ªà¹ˆà¸‡à¸­à¸­à¸"
msgid "Help"
msgstr "ช่วยเหลือ"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "คลาส"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2326,24 +2404,24 @@ msgstr "อัพเดทเมื่อเปลี่ยนà¹à¸›à¸¥à¸‡"
msgid "Disable Update Spinner"
msgstr "ปิดà¸à¸²à¸£à¸­à¸±à¸žà¹€à¸”ทตัวหมุน"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "คุณสมบัติ"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "นำเข้า"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "โหนด"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "ระบบไฟล์"
#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr "คุณสมบัติ"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "โหนด"
+
+#: editor/editor_node.cpp
#, fuzzy
msgid "Expand Bottom Panel"
msgstr "ขยายโฟลเดอร์"
@@ -2481,7 +2559,7 @@ msgstr "% ของเฟรม"
msgid "Physics Frame %"
msgstr "% ของเฟรมฟิสิà¸à¸ªà¹Œ"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "เวลา:"
@@ -2505,7 +2583,7 @@ msgstr "เวลา"
msgid "Calls"
msgstr "จำนวนครั้ง"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr "เปิด"
@@ -2518,21 +2596,45 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr "บิต %d, ค่า %d"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr "[ว่างเปล่า]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
#, fuzzy
-msgid "Assign.."
+msgid "Assign..."
msgstr "ระบุ"
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸œà¸´à¸”พลาด"
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr "เลือภViewport"
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr "สคริปต์ใหม่"
@@ -2544,10 +2646,6 @@ msgstr "%s ใหม่"
msgid "Make Unique"
msgstr "ไม่ใช้ร่วมà¸à¸±à¸šà¸§à¸±à¸•ถุอื่น"
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr "เปิดในตัวจัดà¸à¸²à¸£à¹„ฟล์"
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2556,7 +2654,8 @@ msgstr "เปิดในตัวจัดà¸à¸²à¸£à¹„ฟล์"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "วาง"
@@ -2845,6 +2944,11 @@ msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr "เปิดไฟล์ file_type_cache.cch เพื่อเขียนไม่ได้ จะไม่บันทึà¸à¹à¸„ชของชนิดไฟล์!"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "ที่ชื่นชอบ:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr "ไม่สามารถไปยัง '%s' เนื่องจาà¸à¹„ม่พบในระบบ!"
@@ -2882,8 +2986,8 @@ msgstr "ผิดพลาดขณะทำซ้ำ:"
msgid "Unable to update dependencies:"
msgstr "ไม่สามารถอัพเดทà¸à¸²à¸£à¸­à¹‰à¸²à¸‡à¸­à¸´à¸‡:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
msgstr "ไม่ได้ระบุชื่อ"
#: editor/filesystem_dock.cpp
@@ -2891,10 +2995,6 @@ msgid "Provided name contains invalid characters"
msgstr "ไม่สามารถใช้อัà¸à¸©à¸£à¸šà¸²à¸‡à¸•ัวในชื่อได้"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "ไม่ได้ระบุชื่อ"
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "อัà¸à¸©à¸£à¸šà¸²à¸‡à¸•ัวใช้ไม่ได้"
@@ -2919,22 +3019,6 @@ msgid "Duplicating folder:"
msgstr "ทำซ้ำโฟลเดอร์:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "ขยายโฟลเดอร์"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "ยุบโฟลเดอร์"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "เปลี่ยนชื่อ..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "ย้ายไป..."
-
-#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
msgstr "เปิดไฟล์ฉาà¸"
@@ -2943,6 +3027,16 @@ msgid "Instance"
msgstr "อินสà¹à¸•นซ์"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Add to favorites"
+msgstr "ที่ชื่นชอบ:"
+
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Remove from favorites"
+msgstr "ลบออà¸à¸ˆà¸²à¸à¸à¸¥à¸¸à¹ˆà¸¡"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¸­à¹‰à¸²à¸‡à¸­à¸´à¸‡..."
@@ -2950,11 +3044,19 @@ msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¸­à¹‰à¸²à¸‡à¸­à¸´à¸‡..."
msgid "View Owners..."
msgstr "ดูเจ้าของ..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "เปลี่ยนชื่อ..."
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "ทำซ้ำ..."
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr "ย้ายไป..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
msgstr "สคริปต์ใหม่"
@@ -2964,6 +3066,16 @@ msgstr "สคริปต์ใหม่"
msgid "New Resource..."
msgstr "บันทึà¸à¸£à¸µà¸‹à¸­à¸£à¹Œà¸ªà¹€à¸›à¹‡à¸™..."
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Expand All"
+msgstr "ขยายโฟลเดอร์"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Collapse All"
+msgstr "ยุบโฟลเดอร์"
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -2985,28 +3097,19 @@ msgstr "สà¹à¸à¸™à¸£à¸°à¸šà¸šà¹„ฟล์ใหม่"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "สลับà¸à¸²à¸£à¹€à¸›à¹‡à¸™à¹‚ฟลเดอร์ที่ชื่นชอบ"
+msgid "Toggle split mode"
+msgstr "สลับโหมด"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Show current scene file."
-msgstr "เลือà¸à¹„ทล์ย่อยที่à¸à¸³à¸¥à¸±à¸‡à¸›à¸£à¸±à¸šà¹à¸•่ง"
+msgid "Search files"
+msgstr "ค้นหาคลาส"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr "อินสà¹à¸•นซ์ฉาà¸à¸—ี่เลือà¸à¹ƒà¸«à¹‰à¹€à¸›à¹‡à¸™à¹‚หนดลูà¸à¸‚องโหนดที่เลือà¸"
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "ค้นหาคลาส"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3014,7 +3117,7 @@ msgstr ""
"à¸à¸³à¸¥à¸±à¸‡à¸ªà¹à¸à¸™à¹„ฟล์,\n"
"à¸à¸£à¸¸à¸“ารอ..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "ย้าย"
@@ -3033,32 +3136,23 @@ msgstr "สร้างสคริปต์"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find in files"
+msgid "Find in Files"
msgstr "ค้นหา tile"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find: "
+msgid "Find:"
msgstr "ค้นหา"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Whole words"
-msgstr "ทั้งคำ"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "ตรงตามอัà¸à¸©à¸£à¸žà¸´à¸¡à¸žà¹Œà¹€à¸¥à¹‡à¸-ใหà¸à¹ˆ"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "ซ่อน"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Filter: "
-msgstr "ตัวà¸à¸£à¸­à¸‡:"
+msgid "Filters:"
+msgstr "ตัวà¸à¸£à¸­à¸‡"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3075,6 +3169,11 @@ msgstr "ยà¸à¹€à¸¥à¸´à¸"
#: editor/find_in_files.cpp
#, fuzzy
+msgid "Find: "
+msgstr "ค้นหา"
+
+#: editor/find_in_files.cpp
+#, fuzzy
msgid "Replace: "
msgstr "à¹à¸—นที่"
@@ -3100,7 +3199,7 @@ msgstr "ผิดพลาด: มีชื่อà¹à¸­à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¸™à
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr "ชื่อผิดพลาด"
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3239,17 +3338,14 @@ msgstr "นำเข้าใหม่"
msgid "Failed to load resource."
msgstr "โหลดรีซอร์สไม่ได้"
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "ตà¸à¸¥à¸‡"
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+#, fuzzy
+msgid "Expand All Properties"
msgstr "ขยายคุณสมบัติทั้งหมด"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+#, fuzzy
+msgid "Collapse All Properties"
msgstr "ยุบคุณสมบัติทั้งหมด"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3295,6 +3391,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "โหลดรีซอร์สที่มีอยู่à¹à¸¥à¹‰à¸§à¹ƒà¸™à¸”ิสà¸à¹Œà¹à¸¥à¸°à¸—ำà¸à¸²à¸£à¸›à¸£à¸±à¸šà¹à¸•่ง"
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "บันทึà¸à¸£à¸µà¸‹à¸­à¸£à¹Œà¸ªà¸—ี่à¸à¸³à¸¥à¸±à¸‡à¸›à¸£à¸±à¸šà¹à¸•่ง"
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "ไปยังวัตถุที่ปรับà¹à¸•่งà¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²"
@@ -3361,14 +3461,14 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
msgstr "สร้างรูปหลายเหลี่ยม"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+#, fuzzy
+msgid "Edit Polygon"
msgstr "à¹à¸à¹‰à¹„ขรูปหลายเหลี่ยม"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3376,25 +3476,28 @@ msgid "Insert Point"
msgstr "à¹à¸—รà¸à¸ˆà¸¸à¸”"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+#, fuzzy
+msgid "Edit Polygon (Remove Point)"
msgstr "à¹à¸à¹‰à¹„ขรูปหลายเหลี่ยม (ลบจุด)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+#, fuzzy
+msgid "Remove Polygon And Point"
msgstr "ลบรูปหลายเหลี่ยมà¹à¸¥à¸°à¸ˆà¸¸à¸”"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "สร้างรูปหลายเหลี่ยมใหม่ตั้งà¹à¸•่ต้น"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr "ลบจุด"
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#, fuzzy
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
"à¹à¸à¹‰à¹„ขรูปหลายเหลี่ยม:\n"
"เมาส์ซ้าย: ย้ายจุด\n"
@@ -3402,8 +3505,10 @@ msgstr ""
"เมาส์ขวา: ลบจุด"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
-msgstr "ลบจุด"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#, fuzzy
+msgid "Erase points."
+msgstr "คลิà¸à¸‚วา: ลบจุด"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3418,7 +3523,7 @@ msgstr "เพิ่มà¹à¸­à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
+msgid "Load..."
msgstr "โหลด"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3447,15 +3552,9 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "ลบจุด"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "คลิà¸à¸‚วา: ลบจุด"
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3498,10 +3597,9 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr "จำà¸à¸±à¸”à¸à¸²à¸£à¹€à¸„ลื่อนย้าย"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "ผสม:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3535,7 +3633,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
-msgid "Add Node.."
+msgid "Add Node..."
msgstr "เพิ่มโหนด"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3817,7 +3915,7 @@ msgstr "เชื่อมโหนด"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "ลบà¹à¸—ร็à¸à¸—ี่เลือà¸"
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3885,10 +3983,6 @@ msgid "Amount:"
msgstr "จำนวน:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "ผสม:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "ผสม 0:"
@@ -4090,7 +4184,7 @@ msgstr "ทั้งหมด"
msgid "Plugins"
msgstr "ปลั๊à¸à¸­à¸´à¸™"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "เรียงตาม:"
@@ -4222,6 +4316,11 @@ msgstr "à¹à¸à¹‰à¹„ข CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Scale CanvasItem"
+msgstr "à¹à¸à¹‰à¹„ข CanvasItem"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Move CanvasItem"
msgstr "à¹à¸à¹‰à¹„ข CanvasItem"
@@ -4242,21 +4341,19 @@ msgid "Paste Pose"
msgstr "วางท่าทาง"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "ย่อ"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "รีเซ็ตà¸à¸²à¸£à¸‹à¸¹à¸¡"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "ขยาย"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr "โหมดเลือà¸"
@@ -4285,6 +4382,11 @@ msgid "Rotate Mode"
msgstr "โหมดหมุน"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "โหมดปรับขนาด (R)"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4384,6 +4486,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr "ทำให้เลือà¸à¹‚หนดลูà¸à¹„ด้เหมือนเดิม"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "โครงà¸à¸£à¸°à¸”ูà¸..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "à¹à¸ªà¸”งà¸à¸£à¸°à¸”ูà¸"
@@ -4437,6 +4544,10 @@ msgid "Show Viewport"
msgstr "1 มุมมอง"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr "ให้สิ่งที่เลือà¸à¸­à¸¢à¸¹à¹ˆà¸à¸¥à¸²à¸‡à¸ˆà¸­"
@@ -4508,8 +4619,17 @@ msgstr ""
"ลาภ& วาง + Alt: เปลี่ยนประเภทโหนด"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr "à¹à¸à¹‰à¹„ขรูปหลายเหลี่ยม 3D"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "สร้างรูปหลายเหลี่ยม"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "à¹à¸à¹‰à¹„ขรูปหลายเหลี่ยม"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "à¹à¸à¹‰à¹„ขรูปหลายเหลี่ยม (ลบจุด)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
@@ -4611,37 +4731,9 @@ msgid "Item List Editor"
msgstr "à¹à¸à¹‰à¹„ขรายชื่อไอเทม"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"ไม่มี OccluderPolygon2D ในโหนดนี้\n"
-"สร้างà¹à¸¥à¸°à¸à¸³à¸«à¸™à¸”?"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr "สร้างรูปหลายเหลี่ยมà¸à¸±à¹‰à¸™à¹à¸ªà¸‡"
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr "สร้างรูปหลายเหลี่ยมจาà¸à¸„วามว่างเปล่า"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "à¹à¸à¹‰à¹„ขรูปหลายเหลี่ยมเดิม:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "คลิà¸à¸‹à¹‰à¸²à¸¢: ย้ายจุด"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr "Ctrl+คลิà¸à¸‹à¹‰à¸²à¸¢: à¹à¸¢à¸à¸ªà¹ˆà¸§à¸™"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "คลิà¸à¸‚วา: ลบจุด"
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr "Mesh ว่างเปล่า!"
@@ -4873,13 +4965,14 @@ msgid "Populate"
msgstr "สร้าง"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr "สร้างรูปทรงนำทาง"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr "สร้างเส้นà¸à¸£à¸­à¸š"
+#, fuzzy
+msgid "Generating Visibility Rect"
+msgstr "สร้างà¸à¸£à¸­à¸šà¸à¸²à¸£à¸¡à¸­à¸‡à¹€à¸«à¹‡à¸™"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -4907,6 +5000,12 @@ msgstr "ลบ Mask à¸à¸²à¸£à¸›à¸¥à¹ˆà¸­à¸¢"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "Convert to CPUParticles"
+msgstr "à¹à¸›à¸¥à¸‡à¹€à¸›à¹‡à¸™à¸•ัวพิมพ์ใหà¸à¹ˆ"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr "อนุภาค"
@@ -4976,13 +5075,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr "ต้องà¸à¸²à¸£à¸§à¸±à¸ªà¸”ุประเภท 'ParticlesMaterial'"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr "สร้างเส้นà¸à¸£à¸­à¸š"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "à¹à¸›à¸¥à¸‡à¹€à¸›à¹‡à¸™à¸•ัวพิมพ์ใหà¸à¹ˆ"
+msgid "Generate AABB"
+msgstr "สร้างเส้นà¸à¸£à¸­à¸š"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5006,6 +5104,11 @@ msgid "Add Point to Curve"
msgstr "เพิ่มจุดในเส้นโค้ง"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "ปิดเส้นโค้ง"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr "ย้ายจุดในเส้นโค้ง"
@@ -5033,6 +5136,11 @@ msgid "Click: Add Point"
msgstr "คลิà¸: เพิ่มจุด"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Left Click: Split Segment (in curve)"
+msgstr "à¹à¸¢à¸à¸ªà¹ˆà¸§à¸™ (ในเส้นโค้ง)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr "คลิà¸à¸‚วา: ลบจุด"
@@ -5048,11 +5156,6 @@ msgstr "เพิ่มจุด (ในที่ว่าง)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr "à¹à¸¢à¸à¸ªà¹ˆà¸§à¸™ (ในเส้นโค้ง)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "ลบจุด"
@@ -5109,6 +5212,10 @@ msgstr "ลบจุดควบคุมขาออà¸"
msgid "Remove In-Control Point"
msgstr "ลบจุดควบคุมขาเข้า"
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "à¹à¸¢à¸à¸ªà¹ˆà¸§à¸™ (ในเส้นโค้ง)"
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5121,10 +5228,16 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Sync bones"
+msgid "Sync Bones"
msgstr "à¹à¸ªà¸”งà¸à¸£à¸°à¸”ูà¸"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr "สร้าง UV Map"
@@ -5134,42 +5247,48 @@ msgid "Create Polygon & UV"
msgstr "สร้างรูปหลายเหลี่ยม"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "สร้างเส้นนำà¹à¸™à¸§à¸™à¸­à¸™"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "มีà¸à¸²à¸£à¸à¸£à¸°à¸—ำ '%s' อยู่à¹à¸¥à¹‰à¸§!"
+msgid "Remove Internal Vertex"
+msgstr "ลบจุดควบคุมขาเข้า"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Add Split"
-msgstr "เพิ่มจุด"
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸—ี่อยู่ไม่ถูà¸à¸•้อง!"
+msgid "Add Custom Polygon"
+msgstr "à¹à¸à¹‰à¹„ขรูปหลายเหลี่ยม"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "ลบจุด"
+msgid "Remove Custom Polygon"
+msgstr "ลบรูปหลายเหลี่ยมà¹à¸¥à¸°à¸ˆà¸¸à¸”"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr "เคลื่อนย้าย UV Map"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
+#, fuzzy
+msgid "Transform Polygon"
+msgstr "ประเภทà¸à¸²à¸£à¹€à¸„ลื่อนย้าย"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Open Polygon 2D UV editor."
+msgstr "à¹à¸à¹‰à¹„ข UV รูปหลายเหลี่ยม 2D"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
msgstr "à¹à¸à¹‰à¹„ข UV รูปหลายเหลี่ยม 2D"
@@ -5179,13 +5298,13 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "à¹à¸à¹‰à¹„ขรูปหลายเหลี่ยม"
+msgid "Points"
+msgstr "ย้ายจุด"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Splits"
-msgstr "ตัดเส้น"
+msgid "Polygons"
+msgstr "รูปหลายเหลี่ยม->UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -5194,11 +5313,7 @@ msgstr "สร้างà¸à¸£à¸°à¸”ูà¸"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
-msgstr "สร้างรูปหลายเหลี่ยม"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Move Points"
msgstr "ย้ายจุด"
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5226,20 +5341,21 @@ msgid "Scale Polygon"
msgstr "ปรับขนาดรูปหลายเหลี่ยม"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "à¸à¸£à¸¸à¸“าเลือà¸à¸•ัวเลือà¸à¸à¹ˆà¸­à¸™!"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5264,6 +5380,11 @@ msgid "Grid Settings"
msgstr "à¸à¸²à¸£à¸•ั้งค่า GridMap"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "จำà¸à¸±à¸”à¸à¸²à¸£à¹€à¸„ลื่อนย้าย"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr "จำà¸à¸±à¸”à¸à¸²à¸£à¹€à¸„ลื่อนย้าย"
@@ -5327,22 +5448,22 @@ msgid "Paste Resource"
msgstr "วางรีซอร์ส"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "เปิดในโปรà¹à¸à¸£à¸¡à¹à¸à¹‰à¹„ข"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr "อินสà¹à¸•นซ์:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr "ประเภท:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "เปิดในโปรà¹à¸à¸£à¸¡à¹à¸à¹‰à¹„ข"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr "โหลดรีซอร์ส"
@@ -5375,6 +5496,11 @@ msgstr "ผิดพลาดขณะย้ายไฟล์:\n"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
+msgid "Error: could not load file."
+msgstr "โหลดภาพไม่ได้"
+
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Error could not load file."
msgstr "โหลดภาพไม่ได้"
@@ -5384,19 +5510,23 @@ msgid "Error saving file!"
msgstr "ผิดพลาดขณะบันทึภTileSet!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
+#, fuzzy
+msgid "Error while saving theme."
msgstr "ผิดพลาดขณะบันทึà¸à¸˜à¸µà¸¡"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+#, fuzzy
+msgid "Error Saving"
msgstr "ผิดพลาดขณะบันทึà¸"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
+#, fuzzy
+msgid "Error importing theme."
msgstr "ผิดพลาดขณะนำเข้าธีม"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+#, fuzzy
+msgid "Error Importing"
msgstr "ผิดพลาดขณะนำเข้า"
#: editor/plugins/script_editor_plugin.cpp
@@ -5419,6 +5549,14 @@ msgid "Import Theme"
msgstr "นำเข้าธีม"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "ผิดพลาดขณะบันทึà¸à¸˜à¸µà¸¡"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "ผิดพลาดขณะบันทึà¸"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr "บันทึà¸à¸˜à¸µà¸¡à¹€à¸›à¹‡à¸™"
@@ -5460,8 +5598,8 @@ msgstr "ไฟล์"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile"
-msgstr "ดูไฟล์"
+msgid "Open..."
+msgstr "เปิด"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5476,11 +5614,8 @@ msgid "Copy Script Path"
msgstr "คัดลอà¸à¸•ำà¹à¸«à¸™à¹ˆà¸‡à¸ªà¸„ริปต์"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr "เปิดในตัวจัดà¸à¸²à¸£à¹„ฟล์"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+#, fuzzy
+msgid "History Previous"
msgstr "ประวัติà¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²"
#: editor/plugins/script_editor_plugin.cpp
@@ -5493,6 +5628,11 @@ msgid "Theme"
msgstr "ธีม"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Import Theme..."
+msgstr "นำเข้าธีม"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
msgstr "โหลดธีมใหม่"
@@ -5501,10 +5641,6 @@ msgid "Save Theme"
msgstr "บันทึà¸à¸˜à¸µà¸¡"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "บันทึà¸à¸˜à¸µà¸¡à¹€à¸›à¹‡à¸™"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "ปิดคู่มือ"
@@ -5551,7 +5687,8 @@ msgid "Keep Debugger Open"
msgstr "เปิดตัวà¹à¸à¹‰à¹„ขจุดบà¸à¸žà¸£à¹ˆà¸­à¸‡à¸„้างไว้"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+#, fuzzy
+msgid "Debug with External Editor"
msgstr "à¹à¸à¹‰à¸ˆà¸¸à¸”บà¸à¸žà¸£à¹ˆà¸­à¸‡à¸”้วยโปรà¹à¸à¸£à¸¡à¸­à¸·à¹ˆà¸™"
#: editor/plugins/script_editor_plugin.cpp
@@ -5559,10 +5696,6 @@ msgid "Open Godot online documentation"
msgstr "เปิดคู่มือ"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr "ค้นหาคลาส"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "ค้นหาคู่มือ"
@@ -5600,19 +5733,9 @@ msgstr "ตัวà¹à¸à¹‰à¹„ขจุดบà¸à¸žà¸£à¹ˆà¸­à¸‡"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Search results"
+msgid "Search Results"
msgstr "ค้นหาในคู่มือ"
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "ค้นหาคลาส"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr "สคริปต์à¸à¸±à¸‡à¸ˆà¸°à¹à¸à¹‰à¹„ขได้ต่อเมื่อฉาà¸à¸—ี่à¸à¸±à¸‡à¸ªà¸„ริปต์นั้นถูà¸à¹€à¸›à¸´à¸”อยู่"
-
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
@@ -5623,6 +5746,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "ไปยังฟังà¸à¹Œà¸Šà¸±à¸™..."
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr "สามารถวางรีซอร์สจาà¸à¸£à¸°à¸šà¸šà¹„ฟล์ได้เท่านั้น"
@@ -5655,10 +5787,6 @@ msgstr "อัà¸à¸©à¸£à¹à¸£à¸à¸žà¸´à¸¡à¸žà¹Œà¹ƒà¸«à¸à¹ˆ"
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5710,11 +5838,13 @@ msgid "Trim Trailing Whitespace"
msgstr "ลบตัวอัà¸à¸©à¸£à¸—ี่มองไม่เห็น"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+#, fuzzy
+msgid "Convert Indent to Spaces"
msgstr "ใช้เว้นวรรคเป็นย่อหน้า"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+#, fuzzy
+msgid "Convert Indent to Tabs"
msgstr "ใช้à¹à¸—็บเป็นย่อหน้า"
#: editor/plugins/script_text_editor.cpp
@@ -5731,36 +5861,32 @@ msgid "Remove All Breakpoints"
msgstr "ลบจุดพัà¸à¸—ั้งหมด"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
+#, fuzzy
+msgid "Go to Next Breakpoint"
msgstr "ไปจุดพัà¸à¸–ัดไป"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
+#, fuzzy
+msgid "Go to Previous Breakpoint"
msgstr "ไปจุดพัà¸à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr "à¹à¸›à¸¥à¸‡à¹€à¸›à¹‡à¸™à¸•ัวพิมพ์ใหà¸à¹ˆ"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr "à¹à¸›à¸¥à¸‡à¹€à¸›à¹‡à¸™à¸•ัวพิมพ์เล็à¸"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr "ค้นหาà¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr "คัดà¸à¸£à¸­à¸‡à¹„ฟล์..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+#, fuzzy
+msgid "Go to Function..."
msgstr "ไปยังฟังà¸à¹Œà¸Šà¸±à¸™..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+#, fuzzy
+msgid "Go to Line..."
msgstr "ไปยังบรรทัด..."
#: editor/plugins/script_text_editor.cpp
@@ -5857,6 +5983,14 @@ msgid "Animation Key Inserted."
msgstr "à¹à¸—รà¸à¸„ีย์à¹à¸­à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr "เสียงสูงต่ำ"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr "จำนวนวัตถุที่วาด"
@@ -6023,6 +6157,11 @@ msgid "Freelook Speed Modifier"
msgstr "ปรับความเร็วมุมมองอิสระ"
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "à¹à¸ªà¸”งข้อมูล"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "เครื่องมือเคลื่อนย้าย"
@@ -6125,11 +6264,6 @@ msgid "Tool Scale"
msgstr "เครื่องมือปรับขนาด"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap To Floor"
-msgstr "จำà¸à¸±à¸”ด้วยเส้นตาราง"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "เปิด/ปิดมุมมองอิสระ"
@@ -6247,6 +6381,10 @@ msgstr "à¸à¹ˆà¸­à¸™"
msgid "Post"
msgstr "หลัง"
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
msgid "Sprite is empty!"
@@ -6367,11 +6505,18 @@ msgid "Set Region Rect"
msgstr "à¸à¸³à¸«à¸™à¸”ขอบเขต Texture"
#: editor/plugins/texture_region_editor_plugin.cpp
+#, fuzzy
+msgid "Set Margin"
+msgstr "ปรับขนาดรูปร่าง"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr "โหมดà¸à¸²à¸£à¸ˆà¸³à¸à¸±à¸”:"
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+#, fuzzy
+msgid "None"
msgstr "<ไม่มี>"
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6540,6 +6685,11 @@ msgid "Fix Invalid Tiles"
msgstr "ชื่อผิดพลาด"
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "ให้สิ่งที่เลือà¸à¸­à¸¢à¸¹à¹ˆà¸à¸¥à¸²à¸‡à¸ˆà¸­"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr "วาด TileMap"
@@ -6586,33 +6736,40 @@ msgstr "เลือภTile"
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "ลบที่เลือà¸"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr "หมุน 0 องศา"
+#, fuzzy
+msgid "Rotate left"
+msgstr "โหมดหมุน"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Rotate right"
+msgstr "ย้ายไปขวา"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr "หมุน 90 องศา"
+msgid "Flip horizontally"
+msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
-msgstr "หมุน 180 องศา"
+msgid "Flip vertically"
+msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
-msgstr "หมุน 270 องศา"
+#, fuzzy
+msgid "Clear transform"
+msgstr "เคลื่อนย้าย"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr "เพิ่มโหนดจาà¸à¸œà¸±à¸‡"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr "ลบรายà¸à¸²à¸£"
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6624,33 +6781,60 @@ msgid "Merge from Scene"
msgstr "รวมจาà¸à¸‰à¸²à¸"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
-msgstr "เลือà¸à¸£à¸¹à¸›à¸ à¸²à¸žà¸¢à¹ˆà¸­à¸¢à¹€à¸žà¸·à¹ˆà¸­à¸—ำเป็นไอคอน ภาพนี้จะใช้à¹à¸ªà¸”งเมื่อà¸à¸²à¸£"
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "วางà¹à¸­à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "คลิà¸à¸‚วา: ลบจุด"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "สร้างรูปหลายเหลี่ยมจาà¸à¸„วามว่างเปล่า"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "ลบรายà¸à¸²à¸£"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
-msgstr "สร้างจาà¸à¸‰à¸²à¸?"
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
msgstr "รวมจาà¸à¸‰à¸²à¸?"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "ลบà¹à¸¡à¹ˆà¹à¸šà¸š"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6661,13 +6845,8 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
-"Click on another Tile to edit it."
-msgstr ""
-"คลิà¸à¸‹à¹‰à¸²à¸¢: à¸à¸³à¸«à¸™à¸”ค่าบิต เปิด\n"
-"คลิà¸à¸‚วา: à¸à¸³à¸«à¸™à¸”ค่าบิต ปิด"
+msgid "Delete selected Rect."
+msgstr "ลบไฟล์ที่เลือ�"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -6678,6 +6857,21 @@ msgstr "เลือà¸à¹„ทล์ย่อยที่à¸à¸³à¸¥à¸±à¸‡à¸›à¸£à¸±
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid "Delete polygon."
+msgstr "ลบจุด"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid ""
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
+"Click on another Tile to edit it."
+msgstr ""
+"คลิà¸à¸‹à¹‰à¸²à¸¢: à¸à¸³à¸«à¸™à¸”ค่าบิต เปิด\n"
+"คลิà¸à¸‚วา: à¸à¸³à¸«à¸™à¸”ค่าบิต ปิด"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
"Select sub-tile to use as icon, this will be also used on invalid autotile "
"bindings.\n"
@@ -6693,11 +6887,101 @@ msgstr "เลือà¸à¹„ทล์ย่อยเพื่อจัดลำด
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr "เลือà¸à¹„ทล์ย่อยเพื่อจัดลำดับความสำคัà¸"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Set Tile Region"
+msgstr "à¸à¸³à¸«à¸™à¸”ขอบเขต Texture"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "สร้างโฟลเดอร์"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "à¹à¸à¹‰à¹„ขตัวà¸à¸£à¸­à¸‡"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "à¹à¸à¹‰à¹„ขรูปหลายเหลี่ยมเดิม:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "à¹à¸à¹‰à¹„ขรูปหลายเหลี่ยม"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "สร้างรูปทรงนำทาง"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "วางà¹à¸­à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "ลบà¹à¸¡à¹ˆà¹à¸šà¸š"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "ลบรูปหลายเหลี่ยมà¹à¸¥à¸°à¸ˆà¸¸à¸”"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "สร้างรูปหลายเหลี่ยมà¸à¸±à¹‰à¸™à¹à¸ªà¸‡"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "สร้างรูปทรงนำทาง"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "à¹à¸à¹‰à¹„ขตัวà¸à¸£à¸­à¸‡"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "สร้างรูปทรงนำทาง"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "สร้างรูปหลายเหลี่ยมà¸à¸±à¹‰à¸™à¹à¸ªà¸‡"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "This property can't be changed."
msgstr "ทำไม่ได้ถ้าไม่มีฉาà¸"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
+#, fuzzy
+msgid "TileSet"
msgstr "Tile Set"
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6737,6 +7021,16 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr "à¹à¸¡à¹ˆà¹à¸šà¸šà¸ªà¹ˆà¸‡à¸­à¸­à¸à¸ªà¸³à¸«à¸£à¸±à¸šà¹à¸žà¸¥à¸•ฟอร์มนี้สูà¸à¸«à¸²à¸¢/เสียหาย:"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Release"
+msgstr "เพิ่งปล่อย"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Exporting All"
+msgstr "ส่งออà¸à¸ªà¸³à¸«à¸£à¸±à¸š %s"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr "à¸à¸²à¸£à¸ªà¹ˆà¸‡à¸­à¸­à¸"
@@ -6745,6 +7039,11 @@ msgid "Add..."
msgstr "เพิ่ม..."
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "ส่งออà¸à¹‚ปรเจà¸à¸•์"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr "รีซอร์ส"
@@ -6799,10 +7098,49 @@ msgid "Feature List:"
msgstr "รายชื่อฟีเจอร์:"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "สคริปต์ใหม่"
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "โหมดส่งออà¸à¸ªà¸„ริปต์:"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr "ตัวอัà¸à¸©à¸£"
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr "คอมไพล์à¹à¸¥à¹‰à¸§"
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "เข้ารหัส (ใส่คีย์ด้านล่าง)"
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "คีย์เข้ารหัสสคริปต์ (256 บิต à¸à¸²à¸™ 16):"
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr "ส่งออภPCK/Zip"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export mode?"
+msgstr "วิธีà¸à¸²à¸£à¸ªà¹ˆà¸‡à¸­à¸­à¸:"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Export All"
+msgstr "ส่งออà¸"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr "ไม่พบà¹à¸¡à¹ˆà¹à¸šà¸šà¸ªà¹ˆà¸‡à¸­à¸­à¸à¸ªà¸³à¸«à¸£à¸±à¸šà¹à¸žà¸¥à¸•ฟอร์มนี้:"
@@ -6934,7 +7272,8 @@ msgid "Unnamed Project"
msgstr "โปรเจà¸à¸•์ไม่มีชื่อ"
#: editor/project_manager.cpp
-msgid "Can't open project"
+#, fuzzy
+msgid "Can't open project at '%s'."
msgstr "ไม่สามารถเปิดโปรเจà¸à¸•์"
#: editor/project_manager.cpp
@@ -6943,6 +7282,24 @@ msgstr "ยืนยันà¸à¸²à¸£à¹€à¸›à¸´à¸”โปรเจà¸à¸•์มาà¸
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7270,10 +7627,6 @@ msgstr "ตัวเลือà¸à¹‚ปรเจà¸à¸•์ (project.godot)"
msgid "General"
msgstr "ทั่วไป"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr "คุณสมบัติ:"
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr "à¸à¸³à¸«à¸™à¸”เฉพาะ..."
@@ -7407,10 +7760,6 @@ msgstr "เลือà¸à¹‚หนด"
msgid "Bit %d, val %d."
msgstr "บิต %d, ค่า %d"
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr "คุณสมบัติ:"
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr "เลือà¸à¸„ุณสมบัติ"
@@ -7501,7 +7850,7 @@ msgid "Step"
msgstr "ขนาด:"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7510,7 +7859,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7555,7 +7904,7 @@ msgstr "ตัวพิมพ์ใหà¸à¹ˆ"
msgid "Reset"
msgstr "รีเซ็ตซูม"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr "ผิดพลาด"
@@ -7614,6 +7963,10 @@ msgid "Instance Scene(s)"
msgstr "อินสà¹à¸•นซ์ฉาà¸"
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "อินสà¹à¸•นซ์ฉาà¸à¸¥à¸¹à¸"
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr "ลบสคริปต์"
@@ -7650,6 +8003,12 @@ msgid "Save New Scene As..."
msgstr "บันทึà¸à¸‰à¸²à¸à¹ƒà¸«à¸¡à¹ˆà¹€à¸›à¹‡à¸™..."
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr "à¹à¸à¹‰à¹„ขโหนดลูà¸à¹„ด้"
@@ -7726,6 +8085,11 @@ msgid "Clear Inheritance"
msgstr "ลบà¸à¸²à¸£à¸ªà¸·à¸šà¸—อด"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Open documentation"
+msgstr "เปิดคู่มือ"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr "ลบโหนด"
@@ -7734,15 +8098,16 @@ msgid "Add Child Node"
msgstr "เพิ่มโหนดลูà¸"
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
-msgstr "อินสà¹à¸•นซ์ฉาà¸à¸¥à¸¹à¸"
-
-#: editor/scene_tree_dock.cpp
msgid "Change Type"
msgstr "เปลี่ยนประเภท"
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Extend Script"
+msgstr "เปิดสคริปต์"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Make Scene Root"
msgstr "เข้าใจ!"
@@ -7905,6 +8270,11 @@ msgid "Path is empty"
msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸—ี่อยู่ว่างเปล่า"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Filename is empty"
+msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸šà¸±à¸™à¸—ึà¸à¸§à¹ˆà¸²à¸‡à¹€à¸›à¸¥à¹ˆà¸²!"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸—ี่อยู่ไม่ใช่ภายใน"
@@ -7993,20 +8363,9 @@ msgid "Bytes:"
msgstr "ไบต์:"
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr "คำเตือน"
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr "ผิดพลาด:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr "ต้นฉบับ:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
-msgstr "ฟังà¸à¹Œà¸Šà¸±à¸™:"
+#, fuzzy
+msgid "Stack Trace"
+msgstr "สà¹à¸•ค"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8037,18 +8396,6 @@ msgid "Stack Frames"
msgstr "สà¹à¸•ค"
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr "ตัวà¹à¸›à¸£"
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr "ข้อผิดพลาด:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr "สà¹à¸•ค (ถ้ามี):"
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr "ประสิทธิภาพ"
@@ -8252,7 +8599,8 @@ msgid "GDNative"
msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+#, fuzzy
+msgid "Step argument is zero!"
msgstr "ตัวà¹à¸›à¸£ step เป็นศูนย์!"
#: modules/gdscript/gdscript_functions.cpp
@@ -8475,12 +8823,8 @@ msgid "End of inner exception stack trace"
msgstr "สิ้นสุดสà¹à¸•คข้อผิดพลาดภายใน"
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr "สร้าง!"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
-msgstr "สร้าง Mesh นำทาง"
+msgid "Bake NavMesh"
+msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8752,6 +9096,10 @@ msgid "Base Type:"
msgstr "ชนิด:"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "ตัวà¹à¸›à¸£:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "โหนดที่มีให้ใช้:"
@@ -8852,11 +9200,11 @@ msgid "Search VisualScript"
msgstr "ลบโหนด"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
-msgstr "รับ"
+msgid "Get %s"
+msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8945,6 +9293,12 @@ msgid ""
"shape resource for it!"
msgstr "ต้องมีรูปทรงเพื่อให้ CollisionShape2D ทำงานได้ à¸à¸£à¸¸à¸“าสร้างรูปทรง!"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -8986,6 +9340,12 @@ msgid ""
"imprinted."
msgstr "ไม่ได้à¸à¸³à¸«à¸™à¸”วัสดุให้à¸à¸±à¸šà¸­à¸™à¸¸à¸ à¸²à¸„"
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr "PathFollow2D จะทำงานได้ต้องเป็นโหนดลูà¸à¸‚องโหนด Path2D"
@@ -9112,6 +9472,17 @@ msgid ""
"shape resource for it!"
msgstr "ต้องมีรูปทรงเพื่อให้ CollisionShape ทำงานได้ à¸à¸£à¸¸à¸“าสร้างรูปทรง!"
+#: scene/3d/cpu_particles.cpp
+#, fuzzy
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr "ไม่มีà¸à¸²à¸£à¹à¸ªà¸”งผลเนื่องจาà¸à¹„ม่ได้à¸à¸³à¸«à¸™à¸” mesh ใน draw pass"
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr "วางà¹à¸™à¸§ meshes"
@@ -9133,6 +9504,28 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr "ไม่มีà¸à¸²à¸£à¹à¸ªà¸”งผลเนื่องจาà¸à¹„ม่ได้à¸à¸³à¸«à¸™à¸” mesh ใน draw pass"
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr "PathFollow2D จะทำงานได้ต้องเป็นโหนดลูà¸à¸‚องโหนด Path2D"
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr "PathFollow2D จะทำงานได้ต้องเป็นโหนดลูà¸à¸‚องโหนด Path2D"
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9168,7 +9561,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
#, fuzzy
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9228,6 +9621,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr "ผังà¹à¸­à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¹„ม่ถูà¸à¸•้อง"
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr "โหมด Raw"
@@ -9244,10 +9641,6 @@ msgstr "à¹à¸ˆà¹‰à¸‡à¹€à¸•ือน!"
msgid "Please Confirm..."
msgstr "à¸à¸£à¸¸à¸“ายืนยัน..."
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr "เลือà¸à¹‚ฟลเดอร์นี้"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9257,6 +9650,10 @@ msgstr ""
"ปà¸à¸•ิป๊อปอัพจะถูà¸à¸‹à¹ˆà¸­à¸™à¸ˆà¸™à¸à¸§à¹ˆà¸²à¸ˆà¸°à¸¡à¸µà¸à¸²à¸£à¹€à¸£à¸µà¸¢à¸à¹ƒà¸Šà¹‰à¸Ÿà¸±à¸‡à¸à¹Œà¸Šà¸±à¸™ popup() หรือ popup*() "
"โดยขณะà¹à¸à¹‰à¹„ขสามารถเปิดให้มองเห็นได้ à¹à¸•่เมื่อเริ่มโปรà¹à¸à¸£à¸¡à¸›à¹Šà¸­à¸›à¸­à¸±à¸žà¸ˆà¸°à¸–ูà¸à¸‹à¹ˆà¸­à¸™"
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9311,11 +9708,6 @@ msgstr "ขนาดฟอนต์ผิดพลาด"
msgid "Input"
msgstr "เพิ่มอินพุต"
-#: scene/resources/visual_shader.cpp
-#, fuzzy
-msgid "None"
-msgstr "<ไม่มี>"
-
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
@@ -9333,6 +9725,208 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Split already exists."
+#~ msgstr "มีà¸à¸²à¸£à¸à¸£à¸°à¸—ำ '%s' อยู่à¹à¸¥à¹‰à¸§!"
+
+#, fuzzy
+#~ msgid "Add Split"
+#~ msgstr "เพิ่มจุด"
+
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸—ี่อยู่ไม่ถูà¸à¸•้อง!"
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "ลบจุด"
+
+#, fuzzy
+#~ msgid "Poly"
+#~ msgstr "à¹à¸à¹‰à¹„ขรูปหลายเหลี่ยม"
+
+#, fuzzy
+#~ msgid "Splits"
+#~ msgstr "ตัดเส้น"
+
+#, fuzzy
+#~ msgid "Select a split to erase it."
+#~ msgstr "à¸à¸£à¸¸à¸“าเลือà¸à¸•ัวเลือà¸à¸à¹ˆà¸­à¸™!"
+
+#~ msgid "No name provided"
+#~ msgstr "ไม่ได้ระบุชื่อ"
+
+#, fuzzy
+#~ msgid "Add Node.."
+#~ msgstr "เพิ่มโหนด"
+
+#~ msgid "Create from scene?"
+#~ msgstr "สร้างจาà¸à¸‰à¸²à¸?"
+
+#~ msgid "Create Poly"
+#~ msgstr "สร้างรูปหลายเหลี่ยม"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "สร้างรูปหลายเหลี่ยมใหม่ตั้งà¹à¸•่ต้น"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "ย่อ"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "ขยาย"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "à¹à¸à¹‰à¹„ขรูปหลายเหลี่ยม 3D"
+
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "ไม่มี OccluderPolygon2D ในโหนดนี้\n"
+#~ "สร้างà¹à¸¥à¸°à¸à¸³à¸«à¸™à¸”?"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "คลิà¸à¸‹à¹‰à¸²à¸¢: ย้ายจุด"
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "Ctrl+คลิà¸à¸‹à¹‰à¸²à¸¢: à¹à¸¢à¸à¸ªà¹ˆà¸§à¸™"
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "คลิà¸à¸‚วา: ลบจุด"
+
+#, fuzzy
+#~ msgid "New TextFile"
+#~ msgstr "ดูไฟล์"
+
+#~ msgid "Save Theme As"
+#~ msgstr "บันทึà¸à¸˜à¸µà¸¡à¹€à¸›à¹‡à¸™"
+
+#~ msgid "<None>"
+#~ msgstr "<ไม่มี>"
+
+#~ msgid ""
+#~ "Select sub-tile to use as icon, this will be also used on invalid "
+#~ "autotile bindings."
+#~ msgstr "เลือà¸à¸£à¸¹à¸›à¸ à¸²à¸žà¸¢à¹ˆà¸­à¸¢à¹€à¸žà¸·à¹ˆà¸­à¸—ำเป็นไอคอน ภาพนี้จะใช้à¹à¸ªà¸”งเมื่อà¸à¸²à¸£"
+
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "ซูม (%):"
+
+#~ msgid "Class List:"
+#~ msgstr "รายชื่อคลาส:"
+
+#~ msgid "Search Classes"
+#~ msgstr "ค้นหาคลาส"
+
+#~ msgid "Public Methods"
+#~ msgstr "เมท็อด"
+
+#~ msgid "Public Methods:"
+#~ msgstr "เมท็อด:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "ตัวà¹à¸›à¸£à¸˜à¸µà¸¡"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "ตัวà¹à¸›à¸£à¸˜à¸µà¸¡:"
+
+#, fuzzy
+#~ msgid "Property: "
+#~ msgstr "คุณสมบัติ:"
+
+#, fuzzy
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "สลับà¸à¸²à¸£à¹€à¸›à¹‡à¸™à¹‚ฟลเดอร์ที่ชื่นชอบ"
+
+#, fuzzy
+#~ msgid "Show current scene file."
+#~ msgstr "เลือà¸à¹„ทล์ย่อยที่à¸à¸³à¸¥à¸±à¸‡à¸›à¸£à¸±à¸šà¹à¸•่ง"
+
+#, fuzzy
+#~ msgid "Whole words"
+#~ msgstr "ทั้งคำ"
+
+#, fuzzy
+#~ msgid "Match case"
+#~ msgstr "ตรงตามอัà¸à¸©à¸£à¸žà¸´à¸¡à¸žà¹Œà¹€à¸¥à¹‡à¸-ใหà¸à¹ˆ"
+
+#, fuzzy
+#~ msgid "Filter: "
+#~ msgstr "ตัวà¸à¸£à¸­à¸‡:"
+
+#~ msgid "Ok"
+#~ msgstr "ตà¸à¸¥à¸‡"
+
+#~ msgid "Show In File System"
+#~ msgstr "เปิดในตัวจัดà¸à¸²à¸£à¹„ฟล์"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "ค้นหาคลาส"
+
+#, fuzzy
+#~ msgid "Search in files"
+#~ msgstr "ค้นหาคลาส"
+
+#~ msgid ""
+#~ "Built-in scripts can only be edited when the scene they belong to is "
+#~ "loaded"
+#~ msgstr "สคริปต์à¸à¸±à¸‡à¸ˆà¸°à¹à¸à¹‰à¹„ขได้ต่อเมื่อฉาà¸à¸—ี่à¸à¸±à¸‡à¸ªà¸„ริปต์นั้นถูà¸à¹€à¸›à¸´à¸”อยู่"
+
+#~ msgid "Convert To Uppercase"
+#~ msgstr "à¹à¸›à¸¥à¸‡à¹€à¸›à¹‡à¸™à¸•ัวพิมพ์ใหà¸à¹ˆ"
+
+#~ msgid "Convert To Lowercase"
+#~ msgstr "à¹à¸›à¸¥à¸‡à¹€à¸›à¹‡à¸™à¸•ัวพิมพ์เล็à¸"
+
+#, fuzzy
+#~ msgid "Snap To Floor"
+#~ msgstr "จำà¸à¸±à¸”ด้วยเส้นตาราง"
+
+#~ msgid "Rotate 0 degrees"
+#~ msgstr "หมุน 0 องศา"
+
+#~ msgid "Rotate 90 degrees"
+#~ msgstr "หมุน 90 องศา"
+
+#~ msgid "Rotate 180 degrees"
+#~ msgstr "หมุน 180 องศา"
+
+#~ msgid "Rotate 270 degrees"
+#~ msgstr "หมุน 270 องศา"
+
+#~ msgid "Warning"
+#~ msgstr "คำเตือน"
+
+#~ msgid "Error:"
+#~ msgstr "ผิดพลาด:"
+
+#~ msgid "Source:"
+#~ msgstr "ต้นฉบับ:"
+
+#~ msgid "Function:"
+#~ msgstr "ฟังà¸à¹Œà¸Šà¸±à¸™:"
+
+#~ msgid "Variable"
+#~ msgstr "ตัวà¹à¸›à¸£"
+
+#~ msgid "Errors:"
+#~ msgstr "ข้อผิดพลาด:"
+
+#~ msgid "Stack Trace (if applicable):"
+#~ msgstr "สà¹à¸•ค (ถ้ามี):"
+
+#~ msgid "Bake!"
+#~ msgstr "สร้าง!"
+
+#~ msgid "Bake the navigation mesh."
+#~ msgstr "สร้าง Mesh นำทาง"
+
+#~ msgid "Get"
+#~ msgstr "รับ"
+
#~ msgid "Change Scalar Constant"
#~ msgstr "à¹à¸à¹‰à¹„ขค่าคงที่สเà¸à¸¥à¸²à¸£à¹Œ"
@@ -9534,9 +10128,6 @@ msgstr ""
#~ msgid "Run Script"
#~ msgstr "รันสคริปต์"
-#~ msgid "Save the currently edited resource."
-#~ msgstr "บันทึà¸à¸£à¸µà¸‹à¸­à¸£à¹Œà¸ªà¸—ี่à¸à¸³à¸¥à¸±à¸‡à¸›à¸£à¸±à¸šà¹à¸•่ง"
-
#~ msgid "Stop Profiling"
#~ msgstr "หยุดบันทึà¸"
@@ -9733,9 +10324,6 @@ msgstr ""
#~ msgid "Clear Emitter"
#~ msgstr "ลบตัวปะทุ"
-#~ msgid "Fold Line"
-#~ msgstr "ซ่อน"
-
#~ msgid " "
#~ msgstr " "
@@ -9822,9 +10410,6 @@ msgstr ""
#~ msgid "Could not save atlas subtexture:"
#~ msgstr "บันทึภtexture ย่อยของ atlas ไม่ได้:"
-#~ msgid "Exporting for %s"
-#~ msgstr "ส่งออà¸à¸ªà¸³à¸«à¸£à¸±à¸š %s"
-
#~ msgid "Setting Up..."
#~ msgstr "à¸à¸³à¸¥à¸±à¸‡à¸•ั้งค่า..."
@@ -9929,9 +10514,6 @@ msgstr ""
#~ msgid "Source Font:"
#~ msgstr "ฟอนต์ต้นฉบับ:"
-#~ msgid "Source Font Size:"
-#~ msgstr "ขนาดฟอนต์ต้นฉบับ:"
-
#~ msgid "Dest Resource:"
#~ msgstr "นำเข้ามาเป็นรีซอร์ส:"
@@ -10004,9 +10586,6 @@ msgstr ""
#~ msgid "Start(s)"
#~ msgstr "เริ่ม"
-#~ msgid "Filters"
-#~ msgstr "ตัวà¸à¸£à¸­à¸‡"
-
#~ msgid "Source path is empty."
#~ msgstr "ที่อยู่ไฟล์ต้นฉบับว่างเปล่า"
@@ -10270,15 +10849,9 @@ msgstr ""
#~ msgid "Stereo"
#~ msgstr "สเตอริโอ"
-#~ msgid "Pitch"
-#~ msgstr "เสียงสูงต่ำ"
-
#~ msgid "Window"
#~ msgstr "หน้าต่าง"
-#~ msgid "Move Right"
-#~ msgstr "ย้ายไปขวา"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "ปรับขนาดเป็น %s%%"
@@ -10349,9 +10922,6 @@ msgstr ""
#~ msgid "just pressed"
#~ msgstr "เพิ่งà¸à¸”"
-#~ msgid "just released"
-#~ msgstr "เพิ่งปล่อย"
-
#~ msgid ""
#~ "Couldn't read the certificate file. Are the path and password both "
#~ "correct?"
@@ -10610,21 +11180,6 @@ msgstr ""
#~ msgid "Trailing Silence:"
#~ msgstr "ส่วนที่เงียบตรงปลาย:"
-#~ msgid "Script Export Mode:"
-#~ msgstr "โหมดส่งออà¸à¸ªà¸„ริปต์:"
-
-#~ msgid "Text"
-#~ msgstr "ตัวอัà¸à¸©à¸£"
-
-#~ msgid "Compiled"
-#~ msgstr "คอมไพล์à¹à¸¥à¹‰à¸§"
-
-#~ msgid "Encrypted (Provide Key Below)"
-#~ msgstr "เข้ารหัส (ใส่คีย์ด้านล่าง)"
-
-#~ msgid "Script Encryption Key (256-bits as hex):"
-#~ msgstr "คีย์เข้ารหัสสคริปต์ (256 บิต à¸à¸²à¸™ 16):"
-
#~ msgid "Export Project PCK"
#~ msgstr "ส่งออภPCK โปรเจà¸à¸•์"
diff --git a/editor/translations/tr.po b/editor/translations/tr.po
index 6b9de6a394..45904886f7 100644
--- a/editor/translations/tr.po
+++ b/editor/translations/tr.po
@@ -1,6 +1,6 @@
# Turkish translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# Aprın Çor Tigin <kabusturk38@gmail.com>, 2016-2017.
# Aykut YILDIRIM <aykutyildirim@windowslive.com>, 2018.
@@ -18,18 +18,21 @@
# stnmycri <satenmeycri@gmail.com>, 2017-2018.
# Yavuz Günay <yavuzgunay@gmail.com>, 2017.
# Onur Sanır <onursanir@gmail.com>, 2018.
+# Oğuzhan Özdemir <ozdemiroguzhan0@gmail.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-07-07 20:42+0000\n"
-"Last-Translator: Onur Sanır <onursanir@gmail.com>\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:43+0100\n"
+"Last-Translator: Oğuzhan Özdemir <ozdemiroguzhan0@gmail.com>\n"
"Language-Team: Turkish <https://hosted.weblate.org/projects/godot-engine/"
"godot/tr/>\n"
"Language: tr\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.1-dev\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -38,7 +41,7 @@ msgstr ""
"convert() için geçersiz türde değiştirgen, TYPE_* sabitlerini kullanın."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr "Byte kodu çözmek için yetersiz byte, ya da Geçersiz format."
@@ -81,7 +84,7 @@ msgstr "Ücretsiz"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "DengelenmiÅŸ"
#: editor/animation_bezier_editor.cpp
#, fuzzy
@@ -89,7 +92,6 @@ msgid "Mirror"
msgstr "X'e Aynala"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
msgstr "Anahtar Gir"
@@ -285,7 +287,6 @@ msgstr "%d YENİ izler oluştur ve anahtarlar gir?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -420,8 +421,7 @@ msgstr "Seçimi Ölçekle"
msgid "Scale From Cursor"
msgstr "İmleçten Ölçekle"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Seçimi Çoğalt"
@@ -435,11 +435,13 @@ msgid "Delete Selection"
msgstr "Seçilenleri Sil"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+#, fuzzy
+msgid "Go to Next Step"
msgstr "Sonraki Adıma Git"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+#, fuzzy
+msgid "Go to Previous Step"
msgstr "Önceki Adıma Git"
#: editor/animation_track_editor.cpp
@@ -542,11 +544,11 @@ msgstr "EÅŸleÅŸme Yok"
msgid "Replaced %d occurrence(s)."
msgstr "DeÄŸiÅŸtirildi %d oluÅŸ(sn)."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Büyük/Küçük Harf Eşleştir"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "Tam Kelimeler"
@@ -562,15 +564,19 @@ msgstr "Tümünü Değiştir"
msgid "Selection Only"
msgstr "Yalnızca Seçim"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Yaklaştır"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "Uzaklaştır"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "Yaklaşmayı Sıfırla"
@@ -581,10 +587,10 @@ msgstr "Uyarılar"
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "YaklaÅŸ (%):"
+msgid "Font Size:"
+msgstr "Kaynak Yazı Türü Boyutu:"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Satır:"
@@ -617,6 +623,7 @@ msgstr "Ekle"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -698,7 +705,7 @@ msgstr "Bağlantıları Düzenle"
#: editor/connections_dialog.cpp
#, fuzzy
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "Birden fazla projeyi çalıştırmaya kararlı mısınız?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -747,23 +754,20 @@ msgid "Recent:"
msgstr "Yakın zamanda:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Ara:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "EÅŸleÅŸmeler:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "Açıklama:"
@@ -802,8 +806,7 @@ msgid "Resource"
msgstr "Kaynak"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "Yol"
@@ -824,9 +827,10 @@ msgid "Search Replacement Resource:"
msgstr "Yerine Geçecek Kaynak Ara:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -858,7 +862,8 @@ msgid "Error loading:"
msgstr "Yüklerken hata:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+#, fuzzy
+msgid "Load failed due to missing dependencies:"
msgstr "Sahnedeki kayıp bağımlılıklar yüzünden sahneyi yükleme başarısız oldu:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -917,14 +922,6 @@ msgstr "Sözlükteki Değeri Değiştir"
msgid "Thanks from the Godot community!"
msgstr "Godot topluluğundan teşekkürler!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "Tamam"
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Godot Oyun Motoru katkı sağlayanlar"
@@ -1018,7 +1015,8 @@ msgid "Uncompressing Assets"
msgstr "Varlıklar Çıkartılıyor"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+#, fuzzy
+msgid "Package installed successfully!"
msgstr "Paket Başarı ile Kuruldu!"
#: editor/editor_asset_installer.cpp
@@ -1100,8 +1098,7 @@ msgid "Bus options"
msgstr "Bus ayarları"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "Çoğalt"
@@ -1260,7 +1257,7 @@ msgid "Add AutoLoad"
msgstr "KendindenYüklenme Ekle"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "Dosya yolu:"
@@ -1268,8 +1265,8 @@ msgstr "Dosya yolu:"
msgid "Node Name:"
msgstr "Düğüm adı:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "Ad"
@@ -1339,12 +1336,17 @@ msgid "Template file not found:"
msgstr "Şablon dosyası bulunamadı:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Geçerli Klasörü Seç"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "Dosya var. Üzerine Yazılsın mı?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "Geçerli Klasörü Seç"
+#, fuzzy
+msgid "Select This Folder"
+msgstr "Bu Klasörü Seç"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
@@ -1352,12 +1354,13 @@ msgstr "Dosya Yolunu Tıpkıla"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr "Dosya Yöneticisinde Göster"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+#, fuzzy
+msgid "Show in File Manager"
msgstr "Dosya Yöneticisinde Göster"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1393,7 +1396,8 @@ msgid "Open a File or Directory"
msgstr "Bir Dosya ya da Dizin Aç"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Kaydet"
@@ -1451,8 +1455,7 @@ msgstr "Dizinler & Dosyalar:"
msgid "Preview:"
msgstr "Önizleme:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "Dosya:"
@@ -1468,24 +1471,11 @@ msgstr "KaynaklarıTara"
msgid "(Re)Importing Assets"
msgstr "Varlıklar Yeniden-İçe Aktarılıyor"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "Yardım Ara"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "Sınıf Listesi:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "Sınıfları Ara"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "Üst"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "Sınıf:"
@@ -1502,28 +1492,31 @@ msgid "Brief Description:"
msgstr "Kısa Açıklama:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "Üyeler"
+msgid "Properties"
+msgstr "Özellikler"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "Üyeler:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr "Özellikler:"
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "Açık Metodlar"
+msgid "Methods"
+msgstr "Metotlar"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "Açık Metotlar:"
+#, fuzzy
+msgid "Methods:"
+msgstr "Metotlar"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "Grafik Arayüzü Tema Öğeleri"
+#, fuzzy
+msgid "Theme Properties"
+msgstr "Özellikler"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "Grafik Arayüzü Tema Öğeleri:"
+#, fuzzy
+msgid "Theme Properties:"
+msgstr "Özellikler:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1550,10 +1543,16 @@ msgid "Constants:"
msgstr "Sabitler:"
#: editor/editor_help.cpp
-msgid "Description"
+#, fuzzy
+msgid "Class Description"
msgstr "Açıklama"
#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
+msgstr "Açıklama:"
+
+#: editor/editor_help.cpp
msgid "Online Tutorials:"
msgstr "Çevrimiçi Rehberler:"
@@ -1568,11 +1567,13 @@ msgstr ""
"[color=$color][url=$url2]öneride bulunabilirsiniz[/url][/color]."
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "Özellikler"
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "Özellik Açıklaması:"
#: editor/editor_help.cpp
-msgid "Property Description:"
+#, fuzzy
+msgid "Property Descriptions:"
msgstr "Özellik Açıklaması:"
#: editor/editor_help.cpp
@@ -1584,11 +1585,13 @@ msgstr ""
"bulunarak[/url][/color] yardım edebilirsiniz!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "Metotlar"
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "Metot Açıklaması:"
#: editor/editor_help.cpp
-msgid "Method Description:"
+#, fuzzy
+msgid "Method Descriptions:"
msgstr "Metot Açıklaması:"
#: editor/editor_help.cpp
@@ -1599,12 +1602,61 @@ msgstr ""
"Bu metot için henüz bir açıklama yok. Bize [color=$color][url=$url]katkıda "
"bulunarak[/url][/color] yardım edebilirsiniz!"
-#: editor/editor_inspector.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Yardım Ara"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Display All"
+msgstr "Olağanı Görüntüle"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Classes Only"
+msgstr "Sınıflar"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Methods Only"
+msgstr "Metotlar"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "Sinyaller"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Constants Only"
+msgstr "Sabitler"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Properties Only"
+msgstr "Özellikler"
+
+#: editor/editor_help_search.cpp
#, fuzzy
-msgid "Property: "
+msgid "Theme Properties Only"
+msgstr "Özellikler"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Member Type"
+msgstr "Üyeler"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Class"
+msgstr "Sınıf:"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
msgstr "Özellik:"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr "Ayarla"
@@ -1638,6 +1690,11 @@ msgstr "Proje dışa aktarımı %d hata koduyla başarısız."
msgid "Error saving resource!"
msgstr "Kaynak kaydedilirken hata!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "Tamam"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "Kaynağı Farklı Kaydet..."
@@ -1692,12 +1749,22 @@ msgstr "Bu işlem bir kök sahne olmadan yapılamaz."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
"Sahne kaydedilemedi. Anlaşılan bağımlılıklar (örnekler ve kalıtımlar) "
"karşılanamadı."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr "Birleştirme için MeshLibrary yüklenemedi!"
@@ -1955,6 +2022,13 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "Yoldaki eklenti betiği yüklenemedi: '%s'."
#: editor/editor_node.cpp
+#, fuzzy
+msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr "Eklenti betiği '%s' yolundan yüklenemedi. Betik araç modunda değil."
+
+#: editor/editor_node.cpp
msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -2001,6 +2075,12 @@ msgstr "Yerleşim Düzenini Sil"
msgid "Default"
msgstr "Varsayılan"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+#, fuzzy
+msgid "Show in FileSystem"
+msgstr "Dosya Sisteminde Göster"
+
#: editor/editor_node.cpp
#, fuzzy
msgid "Play This Scene"
@@ -2084,7 +2164,8 @@ msgid "Save Scene"
msgstr "Sahne Kaydet"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+#, fuzzy
+msgid "Save All Scenes"
msgstr "Tüm Sahneleri Kaydet"
#: editor/editor_node.cpp
@@ -2113,7 +2194,7 @@ msgid "Undo"
msgstr "Geri"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Geri"
@@ -2137,7 +2218,7 @@ msgstr "Proje Ayarları"
msgid "Export"
msgstr "Dışa Aktar"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "Araçlar"
@@ -2151,6 +2232,7 @@ msgid "Quit to Project List"
msgstr "Proje Listesine Çık"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "Hata Ayıklama"
@@ -2279,10 +2361,6 @@ msgstr "Dışa Aktarım Şablonlarını Yönet"
msgid "Help"
msgstr "Yardım"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "Sınıflar"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2377,24 +2455,24 @@ msgstr "Değişiklikleri güncelle"
msgid "Disable Update Spinner"
msgstr "Güncelleme Topacını Devre Dışı Bırak"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "Denetçi"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "İçe Aktar"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "Düğüm"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "DosyaSistemi"
#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr "Denetçi"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Düğüm"
+
+#: editor/editor_node.cpp
#, fuzzy
msgid "Expand Bottom Panel"
msgstr "Hepsini geniÅŸlet"
@@ -2532,7 +2610,7 @@ msgstr "Kare %"
msgid "Physics Frame %"
msgstr "Fizik Kare %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "Süre:"
@@ -2556,7 +2634,7 @@ msgstr "Zaman"
msgid "Calls"
msgstr "Çağrılar"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr "Açık"
@@ -2569,21 +2647,45 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr "Bit %d, val %d."
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr "[BoÅŸ]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
#, fuzzy
-msgid "Assign.."
+msgid "Assign..."
msgstr "Ata"
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "Geçersiz Yol"
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr "Bir Görüntükapısı Seçin"
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr "Yeni Betik"
@@ -2595,10 +2697,6 @@ msgstr "Yeni %s"
msgid "Make Unique"
msgstr "Benzersiz Yap"
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr "Dosya Sisteminde Göster"
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2607,7 +2705,8 @@ msgstr "Dosya Sisteminde Göster"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "Yapıştır"
@@ -2900,6 +2999,11 @@ msgstr ""
"kaydedilmiyor!"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "BeÄŸeniler:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr "Gidilemiyor. '%s' bu dosya sisteminde bulunamadı!"
@@ -2939,19 +3043,15 @@ msgstr "Çoğaltılırken hata:"
msgid "Unable to update dependencies:"
msgstr "Bağımlılıklar güncellenemedi:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "İsim sağlanmadı"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "SaÄŸlanan isim yok."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "Sağlanan isim geçersiz karakterler içeriyor"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "SaÄŸlanan isim yok."
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "İsim geçersiz karkterler içeriyor."
@@ -2976,22 +3076,6 @@ msgid "Duplicating folder:"
msgstr "Klasör çoğaltılıyor:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "Hepsini geniÅŸlet"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "Hepsini daralt"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "Yeniden Adlandır..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "Şuraya Taşı..."
-
-#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
msgstr "Sahne(ler) Aç"
@@ -3000,6 +3084,16 @@ msgid "Instance"
msgstr "Örnek"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Add to favorites"
+msgstr "BeÄŸeniler:"
+
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Remove from favorites"
+msgstr "Öbekten Kaldır"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "Bağımlılıkları Düzenle..."
@@ -3007,11 +3101,19 @@ msgstr "Bağımlılıkları Düzenle..."
msgid "View Owners..."
msgstr "Sahipleri Görüntüle..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "Yeniden Adlandır..."
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "Çoğalt..."
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr "Şuraya Taşı..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
msgstr "Yeni Betik"
@@ -3021,6 +3123,16 @@ msgstr "Yeni Betik"
msgid "New Resource..."
msgstr "Kaynağı Farklı Kaydet..."
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Expand All"
+msgstr "Hepsini geniÅŸlet"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Collapse All"
+msgstr "Hepsini daralt"
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -3042,28 +3154,19 @@ msgstr "Dosya Düzenini Yeniden Tara"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "Klasör durumunu Beğenilen olarak değiştir"
+msgid "Toggle split mode"
+msgstr "Aç / Kapat Biçimi"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Show current scene file."
-msgstr "Şuanki düzenlenmiş alt-döşemeyi seç."
+msgid "Search files"
+msgstr "Sınıfları Ara"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr "Seçilen sahneyi/sahneleri seçilen düğüme çocuk olarak örneklendir."
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "Sınıfları Ara"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3071,7 +3174,7 @@ msgstr ""
"Dosyalar Taranıyor,\n"
"Lütfen Bekleyiniz..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "Taşı"
@@ -3090,32 +3193,23 @@ msgstr "Betik OluÅŸtur"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find in files"
+msgid "Find in Files"
msgstr "Döşentiyi Bul"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find: "
+msgid "Find:"
msgstr "Bul"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Whole words"
-msgstr "Tam Kelimeler"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "Büyük/Küçük Harf Eşleştir"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "Satırı Katla"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Filter: "
-msgstr "Süzgeç:"
+msgid "Filters:"
+msgstr "Süzgeçler"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3132,6 +3226,11 @@ msgstr "Vazgeç"
#: editor/find_in_files.cpp
#, fuzzy
+msgid "Find: "
+msgstr "Bul"
+
+#: editor/find_in_files.cpp
+#, fuzzy
msgid "Replace: "
msgstr "DeÄŸiÅŸtir"
@@ -3157,7 +3256,7 @@ msgstr "HATA: Bu animasyon adı zaten var!"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr "Geçersiz ad."
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3298,17 +3397,14 @@ msgstr "Yeniden İçe Aktar"
msgid "Failed to load resource."
msgstr "Kaynak yükleme başarısız oldu."
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "Tamam"
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+#, fuzzy
+msgid "Expand All Properties"
msgstr "Tüm özellikleri genişlet"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+#, fuzzy
+msgid "Collapse All Properties"
msgstr "Tüm özellikleri daralt"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3354,6 +3450,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "Var olan bir kaynağı diskten yükleyin ve düzenleyin."
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "Düzenlenen kaynağı kaydedin."
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "Geçmişte bir önceki düzenlenmiş nesneye gidin."
@@ -3420,14 +3520,14 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
msgstr "Çoklu Oluşturun"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+#, fuzzy
+msgid "Edit Polygon"
msgstr "Çokluyu Düzenleyin"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3435,25 +3535,28 @@ msgid "Insert Point"
msgstr "Nokta YerleÅŸtir"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+#, fuzzy
+msgid "Edit Polygon (Remove Point)"
msgstr "Çokluyu Düzenleyin (Noktayı Silin)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+#, fuzzy
+msgid "Remove Polygon And Point"
msgstr "Çokluyu ve Noktayı Kaldır"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "Sıfırdan yeni bir çokgen oluşturun"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr "Noktaları sil"
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#, fuzzy
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
"Varolan çokgeni düzenle:\n"
"FareSolTık: Noktayı Taşı.\n"
@@ -3461,8 +3564,10 @@ msgstr ""
"FareSağTık: Noktayı Sil."
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
-msgstr "Noktaları sil"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#, fuzzy
+msgid "Erase points."
+msgstr "RMB: Noktayı Sil."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3477,7 +3582,7 @@ msgstr "Animasyon Ekle"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
+msgid "Load..."
msgstr "Yükle"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3506,15 +3611,9 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Noktaları sil"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "RMB: Noktayı Sil."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3557,10 +3656,9 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr "Yapış"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Karışma:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3594,7 +3692,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
-msgid "Add Node.."
+msgid "Add Node..."
msgstr "Düğüm Ekle"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3876,7 +3974,7 @@ msgstr "Düğümleri Bağla"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "Seçilen izleri sil."
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3944,10 +4042,6 @@ msgid "Amount:"
msgstr "DeÄŸer:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "Karışma:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "Karışma 0:"
@@ -4149,7 +4243,7 @@ msgstr "Hepsi"
msgid "Plugins"
msgstr "Eklentiler"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "Sırala:"
@@ -4285,6 +4379,11 @@ msgstr "CanvasItem Düzenle"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
+msgid "Scale CanvasItem"
+msgstr "CanvasItem Düzenle"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Move CanvasItem"
msgstr "CanvasItem Düzenle"
@@ -4305,21 +4404,19 @@ msgid "Paste Pose"
msgstr "Duruşu Yapıştır"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "Uzaklaştır"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "Yakınlaşmayı Sıfırla"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Yaklaştır"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr "Kip Seç"
@@ -4350,6 +4447,11 @@ msgid "Rotate Mode"
msgstr "Döndürme Biçimi"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "Ölçek Biçimi (R)"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4449,6 +4551,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr "Nesnenin çocuğunun seçilebilme yeteneğini geri kazandırır."
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "İskelet..."
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "Kemikleri Göster"
@@ -4500,6 +4607,10 @@ msgid "Show Viewport"
msgstr "Görüntükapısını Göster"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr "İçre Seçimi"
@@ -4571,8 +4682,17 @@ msgstr ""
"Sürükle & bırak + Alt: Düğüm türünü değiştir"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr "Çoklu3B Oluştur"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "Çoklu Oluşturun"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Çokluyu Düzenleyin"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Çokluyu Düzenleyin (Noktayı Silin)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
@@ -4674,37 +4794,9 @@ msgid "Item List Editor"
msgstr "Öğe Dizelgesi Düzenleyicisi"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"Bu düğümde OccluderPolygon2D kaynağı yok.\n"
-"OluÅŸtur ve bir tane ata?"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr "Engelleyici Çokgeni Oluştur"
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr "Sıfırdan yeni bir çokgen oluşturun."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "Var olan çokgeni düzenleyin:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "LMB: Taşıma Noktası."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr "Ctrl + LMB: Parçayı Böl."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "RMB: Noktayı Sil."
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr "Örüntü boş!"
@@ -4936,13 +5028,14 @@ msgid "Populate"
msgstr "Doldur"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr "Yönlendirici Çokgeni Oluştur"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr "AABB Üretimi"
+#, fuzzy
+msgid "Generating Visibility Rect"
+msgstr "Görünebilirlik Dikdörtgeni Üret"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -4970,6 +5063,12 @@ msgstr "Yayma Maskesini Temizle"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "Convert to CPUParticles"
+msgstr "Büyük Harfe Dönüştür"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr "Parçacıklar"
@@ -5039,13 +5138,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr "Bir işlemci malzeme türü 'ParticlesMaterial' gereklidir."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
-msgstr "AABB Üret"
+msgid "Generating AABB"
+msgstr "AABB Üretimi"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "Büyük Harfe Dönüştür"
+msgid "Generate AABB"
+msgstr "AABB Üret"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5069,6 +5167,11 @@ msgid "Add Point to Curve"
msgstr "Noktayı Eğriye Ekle"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "EÄŸriyi Kapat"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr "Noktayı Eğriye Taşı"
@@ -5096,6 +5199,11 @@ msgid "Click: Add Point"
msgstr "Tıkla: Nokta Ekle"
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Left Click: Split Segment (in curve)"
+msgstr "Parçayı Ayır (eğriye göre)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr "Sağ tıkla: Nokta Sil"
@@ -5111,11 +5219,6 @@ msgstr "Nokta Ekle (boÅŸlukta)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr "Parçayı Ayır (eğriye göre)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "Noktayı Sil"
@@ -5172,6 +5275,10 @@ msgstr "Çıkış-Kontrol Noktası Kaldır"
msgid "Remove In-Control Point"
msgstr "Giriş-Kontrol Noktasını Kaldır"
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Parçayı Ayır (eğriye göre)"
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5184,10 +5291,16 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Sync bones"
+msgid "Sync Bones"
msgstr "Kemikleri Göster"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr "UV Haritası Oluştur"
@@ -5197,42 +5310,48 @@ msgid "Create Polygon & UV"
msgstr "Çoklu Oluşturun"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "Yeni yatay kılavuz oluştur"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "İşlem '%s' zaten var!"
+msgid "Remove Internal Vertex"
+msgstr "Giriş-Kontrol Noktasını Kaldır"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Add Split"
-msgstr "Nokta Ekle"
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "Geçersiz yol!"
+msgid "Add Custom Polygon"
+msgstr "Çokluyu Düzenleyin"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Noktayı kaldır"
+msgid "Remove Custom Polygon"
+msgstr "Çokluyu ve Noktayı Kaldır"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr "UV Haritasını Dönüştür"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
+#, fuzzy
+msgid "Transform Polygon"
+msgstr "Dönüştürme Türü"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Open Polygon 2D UV editor."
+msgstr "Çokgen 2B UV Düzenleyicisi"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
msgstr "Çokgen 2B UV Düzenleyicisi"
@@ -5242,13 +5361,13 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "Çokluyu Düzenleyin"
+msgid "Points"
+msgstr "Noktayı Taşı"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Splits"
-msgstr "Yolu Ayır"
+msgid "Polygons"
+msgstr "Çokgen->UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -5257,11 +5376,7 @@ msgstr "Kemik Yap"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
-msgstr "Çoklu Oluşturun"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Move Points"
msgstr "Noktayı Taşı"
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5289,20 +5404,21 @@ msgid "Scale Polygon"
msgstr "Çokgeni Ölçekle"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "Önce bir ayar öğesi seçin!"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5327,6 +5443,11 @@ msgid "Grid Settings"
msgstr "IzgaraHaritası Ayarları"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "Yapış"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr "Yapışmayı Enkinleştir"
@@ -5390,22 +5511,22 @@ msgid "Paste Resource"
msgstr "Kaynağı Yapıştır"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "Düzenleyicide Aç"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr "Örnek:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr "Tür:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Düzenleyicide Aç"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr "Kaynak Yükle"
@@ -5438,6 +5559,11 @@ msgstr "Bediz yüklenirken sorun oluştu:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
+msgid "Error: could not load file."
+msgstr "Bediz yüklenemedi"
+
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Error could not load file."
msgstr "Bediz yüklenemedi"
@@ -5447,19 +5573,23 @@ msgid "Error saving file!"
msgstr "TileSet kaydedilirken hata!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
+#, fuzzy
+msgid "Error while saving theme."
msgstr "Tema kaydedilirken hata"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+#, fuzzy
+msgid "Error Saving"
msgstr "Kaydedilirken hata"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
+#, fuzzy
+msgid "Error importing theme."
msgstr "Tema içe aktarılırken hata"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+#, fuzzy
+msgid "Error Importing"
msgstr "İçe aktarılırken hata"
#: editor/plugins/script_editor_plugin.cpp
@@ -5482,6 +5612,14 @@ msgid "Import Theme"
msgstr "Kalıbı İçe Aktar"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Tema kaydedilirken hata"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Kaydedilirken hata"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr "Temayı Farklı Kaydet..."
@@ -5523,8 +5661,8 @@ msgstr "Dosya"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile"
-msgstr "Dosyaları Görüntüle"
+msgid "Open..."
+msgstr "Aç"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5539,11 +5677,8 @@ msgid "Copy Script Path"
msgstr "Betik Yolunu Kopyala"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr "Dosya Sisteminde Göster"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+#, fuzzy
+msgid "History Previous"
msgstr "Öceki Geçmiş"
#: editor/plugins/script_editor_plugin.cpp
@@ -5556,6 +5691,11 @@ msgid "Theme"
msgstr "Kalıp"
#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Import Theme..."
+msgstr "Kalıbı İçe Aktar"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
msgstr "Kalıbı Yeniden Yükle"
@@ -5564,10 +5704,6 @@ msgid "Save Theme"
msgstr "Kalıbı Kaydet"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "Temayı Farklı Kaydet"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "Belgeleri Kapat"
@@ -5614,7 +5750,8 @@ msgid "Keep Debugger Open"
msgstr "Hata Ayıklayıcıyı Açık Tut"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+#, fuzzy
+msgid "Debug with External Editor"
msgstr "Harici düzenleyici ile hata ayıkla"
#: editor/plugins/script_editor_plugin.cpp
@@ -5622,10 +5759,6 @@ msgid "Open Godot online documentation"
msgstr "Çevrimiçi Godot dökümanlarını aç"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr "Sınıf hiyerarşisi ara."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "BaÅŸvuru belgelerinde arama yap."
@@ -5663,21 +5796,9 @@ msgstr "Hata Ayıklayıcı"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Search results"
+msgid "Search Results"
msgstr "Yardım Ara"
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "Sınıfları Ara"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-"Gömülü betik dosyaları yalnızca ait oldukları sahne yüklendiğinde "
-"düzenlenebilirler"
-
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
@@ -5688,6 +5809,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "İşleve Git..."
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr "Sadece dosya sisteminden kaynaklar bırakılabilir."
@@ -5720,10 +5850,6 @@ msgstr "Büyük harfe çevirme"
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5775,11 +5901,13 @@ msgid "Trim Trailing Whitespace"
msgstr "İzleyenin Boşluklarını Kırp"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+#, fuzzy
+msgid "Convert Indent to Spaces"
msgstr "Girintileri Boşluklara Dönüştür"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+#, fuzzy
+msgid "Convert Indent to Tabs"
msgstr "Girintileri Sekmelere Dönüştür"
#: editor/plugins/script_text_editor.cpp
@@ -5796,36 +5924,32 @@ msgid "Remove All Breakpoints"
msgstr "Tüm Kesme Noktalarını Kaldır"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
+#, fuzzy
+msgid "Go to Next Breakpoint"
msgstr "Sonraki Kesme Noktasına Git"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
+#, fuzzy
+msgid "Go to Previous Breakpoint"
msgstr "Önceki Kesme Noktasına Git"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr "Büyük Harfe Dönüştür"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr "Küçük Harfe Dönüştür"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr "Öncekini Bul"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr "Dosyaları Süz..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+#, fuzzy
+msgid "Go to Function..."
msgstr "İşleve Git..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+#, fuzzy
+msgid "Go to Line..."
msgstr "Dizeye Git..."
#: editor/plugins/script_text_editor.cpp
@@ -5922,6 +6046,14 @@ msgid "Animation Key Inserted."
msgstr "Animasyon Anahtarı Eklendi."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr "Perde"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr "Çizilmiş Nesneler"
@@ -6088,6 +6220,11 @@ msgid "Freelook Speed Modifier"
msgstr "Serbestbakış Hız Değiştirici"
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "Bilgi Göster"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "XForm İletişim Kutusu"
@@ -6190,11 +6327,6 @@ msgid "Tool Scale"
msgstr "Ölçek Aracı"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap To Floor"
-msgstr "Izgaraya yapış"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "Serbestbakış Aç / Kapat"
@@ -6312,6 +6444,10 @@ msgstr "Öncesi"
msgid "Post"
msgstr "Sonrası"
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
msgid "Sprite is empty!"
@@ -6432,11 +6568,18 @@ msgid "Set Region Rect"
msgstr "Dikdörtgen Bölgesini Ayarla"
#: editor/plugins/texture_region_editor_plugin.cpp
+#, fuzzy
+msgid "Set Margin"
+msgstr "Tutamacı Ayarla"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr "Yapışma Kipi:"
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+#, fuzzy
+msgid "None"
msgstr "<Yok>"
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6602,6 +6745,11 @@ msgid "Fix Invalid Tiles"
msgstr "Geçersiz ad."
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "İçre Seçimi"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr "TileMap'i Boya"
@@ -6648,33 +6796,40 @@ msgstr "Karo Seç"
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "Seçimi Kaldır"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr "0 Düzeyde Döndür"
+#, fuzzy
+msgid "Rotate left"
+msgstr "Döndürme Biçimi"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Rotate right"
+msgstr "Sağa Taşı"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr "90 Düzeyde Döndür"
+msgid "Flip horizontally"
+msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
-msgstr "180 Düzeyde Döndür"
+msgid "Flip vertically"
+msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
-msgstr "270 Düzeyde Döndür"
+#, fuzzy
+msgid "Clear transform"
+msgstr "Dönüşüm"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr "Ağaçtan Düğüm(ler) Ekle"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr "Mevcut giriyi kaldır"
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6686,35 +6841,60 @@ msgid "Merge from Scene"
msgstr "Sahneden BirleÅŸtir"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
msgstr ""
-"Simge olarak kullanmak işin alt-karo seç, bu aynı zamanda geçersiz oto-karo "
-"bağlantılarında kullanılacaktır."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "Animasyonu Yapıştır"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "RMB: Noktayı Sil."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "Sıfırdan yeni bir çokgen oluşturun."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "Mevcut giriyi kaldır"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
-msgstr "Sahneden mi oluÅŸturulsun?"
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
msgstr "Sahneden birleÅŸtirilsin mi?"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Şablonu Kaldır"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6725,13 +6905,8 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
-"Click on another Tile to edit it."
-msgstr ""
-"LMB: bit'i aç.\n"
-"RMB: bit'i kapat."
+msgid "Delete selected Rect."
+msgstr "Seçili dosyalar silinsin mi?"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
@@ -6742,6 +6917,21 @@ msgstr "Şuanki düzenlenmiş alt-döşemeyi seç."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid "Delete polygon."
+msgstr "Noktaları sil"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid ""
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
+"Click on another Tile to edit it."
+msgstr ""
+"LMB: bit'i aç.\n"
+"RMB: bit'i kapat."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
"Select sub-tile to use as icon, this will be also used on invalid autotile "
"bindings.\n"
@@ -6759,11 +6949,101 @@ msgstr "Önceliğini değiştirmek için alt-karo seçin."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr "Önceliğini değiştirmek için alt-karo seçin."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Set Tile Region"
+msgstr "Dikdörtgen Bölgesini Ayarla"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Klasör Oluştur"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "Süzgeçleri Düzenle"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Var olan çokgeni düzenleyin:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Çokluyu Düzenleyin"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Yönlendirici Çokgeni Oluştur"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "Animasyonu Yapıştır"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Şablonu Kaldır"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "Çokluyu ve Noktayı Kaldır"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "Engelleyici Çokgeni Oluştur"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "Yönlendirici Çokgeni Oluştur"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "Süzgeçleri Düzenle"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Yönlendirici Çokgeni Oluştur"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Engelleyici Çokgeni Oluştur"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "This property can't be changed."
msgstr "Bu işlem bir sahne olmadan yapılamaz."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
+#, fuzzy
+msgid "TileSet"
msgstr "Karo Takımı"
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6802,6 +7082,16 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr "Bu platform için dışa aktarma şablonu eksik/bozuk:"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Release"
+msgstr "yeni bırakıldı"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Exporting All"
+msgstr "%s için Dışa Aktarım"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr "Önayarlar"
@@ -6810,6 +7100,11 @@ msgid "Add..."
msgstr "Ekle..."
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "Ön Ayarları Dışa Aktar:"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr "Kaynaklar"
@@ -6868,10 +7163,49 @@ msgid "Feature List:"
msgstr "Özellik Listesi:"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "Yeni Betik"
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "Betik Dışa Aktarım Biçimi:"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr "Yazı"
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr "DerlenmiÅŸ"
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "Şifreli (Açarı Aşağıda Belirtin)"
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "Betik Şifreleme Açarı (Hex olarak 256-bit):"
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr "PCK/Zip Dışa Aktar"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export mode?"
+msgstr "Dışa Aktarma Biçimi:"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Export All"
+msgstr "Dışa Aktar"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr "Bu platform için dışa aktarma şablonu eksik:"
@@ -7002,7 +7336,8 @@ msgid "Unnamed Project"
msgstr "Adsız Proje"
#: editor/project_manager.cpp
-msgid "Can't open project"
+#, fuzzy
+msgid "Can't open project at '%s'."
msgstr "Proje Açılamadı"
#: editor/project_manager.cpp
@@ -7011,6 +7346,24 @@ msgstr "Birden fazla proje açmakta kararlı mısınız?"
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7345,10 +7698,6 @@ msgstr "Proje Ayarları (proje.godot)"
msgid "General"
msgstr "Genel"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr "Özellik:"
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr "Şunun Üzerine Yaz..."
@@ -7481,10 +7830,6 @@ msgstr "Bir Düğüm Seç"
msgid "Bit %d, val %d."
msgstr "Bit %d, val %d."
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr "Özellikler:"
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr "Özellik Seç"
@@ -7575,7 +7920,7 @@ msgid "Step"
msgstr "Adım:"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7584,7 +7929,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7629,7 +7974,7 @@ msgstr "Büyük harf"
msgid "Reset"
msgstr "Yaklaşmayı Sıfırla"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr "Hata"
@@ -7690,6 +8035,10 @@ msgid "Instance Scene(s)"
msgstr "Sahne(leri) Örnekle"
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "Çocuk Sahnesini Örnekle"
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr "BetiÄŸi Temizle"
@@ -7726,6 +8075,12 @@ msgid "Save New Scene As..."
msgstr "Yeni Sahneyi Farklı Kaydet ..."
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr "Düzenlenebilir Çocuklar"
@@ -7802,6 +8157,11 @@ msgid "Clear Inheritance"
msgstr "Kalıtı Temizle"
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Open documentation"
+msgstr "Çevrimiçi Godot dökümanlarını aç"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr "Düğümleri Sil"
@@ -7810,15 +8170,16 @@ msgid "Add Child Node"
msgstr "Çocuk Düğüm Ekle"
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
-msgstr "Çocuk Sahnesini Örnekle"
-
-#: editor/scene_tree_dock.cpp
msgid "Change Type"
msgstr "Türü Değiştir"
#: editor/scene_tree_dock.cpp
#, fuzzy
+msgid "Extend Script"
+msgstr "Betik Aç"
+
+#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Make Scene Root"
msgstr "Anlamlı!"
@@ -7983,6 +8344,11 @@ msgid "Path is empty"
msgstr "Yol boÅŸ"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Filename is empty"
+msgstr "Kayıt yolu boş!"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr "Yol yerel deÄŸil"
@@ -8071,20 +8437,9 @@ msgid "Bytes:"
msgstr "Baytlar:"
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr "Uyarı"
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr "Hata:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr "Kaynak:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
-msgstr "Fonksiyon:"
+#, fuzzy
+msgid "Stack Trace"
+msgstr "Çerçeveleri Yığ"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8115,18 +8470,6 @@ msgid "Stack Frames"
msgstr "Çerçeveleri Yığ"
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr "DeÄŸiÅŸken"
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr "Hatalar:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr "İzi Yığ (uygulanabilirse):"
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr "Kesitçi"
@@ -8330,7 +8673,8 @@ msgid "GDNative"
msgstr "GDYerel"
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+#, fuzzy
+msgid "Step argument is zero!"
msgstr "adım değiştirgeni sıfır!"
#: modules/gdscript/gdscript_functions.cpp
@@ -8553,12 +8897,8 @@ msgid "End of inner exception stack trace"
msgstr "İç özel durum yığını izlemesinin sonu"
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr "PiÅŸir!"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
-msgstr "Yönlendirici örüntüsünü pişir."
+msgid "Bake NavMesh"
+msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8839,6 +9179,10 @@ msgid "Base Type:"
msgstr "Taban Türü:"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "Üyeler:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "Kullanılabilir Düğümler:"
@@ -8941,11 +9285,11 @@ msgid "Search VisualScript"
msgstr "GörselBetik Düğümü Kaldır"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
-msgstr "Al"
+msgid "Get %s"
+msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -9042,6 +9386,12 @@ msgstr ""
"CollisionShape2D'nin işlevini yerine getirmesi için ona bir şekil sağlanması "
"gerekmektedir. Lütfen onun için bir şekil kaynağı oluşturun!"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -9091,6 +9441,12 @@ msgstr ""
"Parçacıkları işlemek için bir materyal atanmış değil, bu yüzden etki eden "
"davranış yok."
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -9231,6 +9587,18 @@ msgstr ""
"CollisionShape'in çalışması için bir şekil verilmelidir. Lütfen bunun için "
"bir şekil kaynağı oluşturun!"
+#: scene/3d/cpu_particles.cpp
+#, fuzzy
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+"Hiçbirşey görünebilir değil çünkü örüntüler çizim geçişlerine atanmış değil."
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr "Örüntüler Haritalanıyor"
@@ -9255,6 +9623,30 @@ msgid ""
msgstr ""
"Hiçbirşey görünebilir değil çünkü örüntüler çizim geçişlerine atanmış değil."
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+"PathFollow2D yalnızca Path2D düğümünün çocuğu olarak ayarlanınca çalışır."
+
+#: scene/3d/path.cpp
+#, fuzzy
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+"PathFollow2D yalnızca Path2D düğümünün çocuğu olarak ayarlanınca çalışır."
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9296,7 +9688,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
#, fuzzy
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9363,6 +9755,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr "Animasyon ağacı geçersizdir."
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr "Ham Kip"
@@ -9379,10 +9775,6 @@ msgstr "Uyarı!"
msgid "Please Confirm..."
msgstr "Lütfen Doğrulayın..."
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr "Bu Klasörü Seç"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9393,6 +9785,10 @@ msgstr ""
"olarak gizlenecektir. Onları düzenleme için görünür kılmak da iyidir, ancak "
"çalışırken gizlenecekler."
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9448,11 +9844,6 @@ msgstr "Geçersiz yazıtipi boyutu."
msgid "Input"
msgstr "GiriÅŸ Ekle"
-#: scene/resources/visual_shader.cpp
-#, fuzzy
-msgid "None"
-msgstr "<Yok>"
-
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
@@ -9470,6 +9861,212 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Split already exists."
+#~ msgstr "İşlem '%s' zaten var!"
+
+#, fuzzy
+#~ msgid "Add Split"
+#~ msgstr "Nokta Ekle"
+
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr "Geçersiz yol!"
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "Noktayı kaldır"
+
+#, fuzzy
+#~ msgid "Poly"
+#~ msgstr "Çokluyu Düzenleyin"
+
+#, fuzzy
+#~ msgid "Splits"
+#~ msgstr "Yolu Ayır"
+
+#, fuzzy
+#~ msgid "Select a split to erase it."
+#~ msgstr "Önce bir ayar öğesi seçin!"
+
+#~ msgid "No name provided"
+#~ msgstr "İsim sağlanmadı"
+
+#, fuzzy
+#~ msgid "Add Node.."
+#~ msgstr "Düğüm Ekle"
+
+#~ msgid "Create from scene?"
+#~ msgstr "Sahneden mi oluÅŸturulsun?"
+
+#~ msgid "Create Poly"
+#~ msgstr "Çoklu Oluşturun"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "Sıfırdan yeni bir çokgen oluşturun"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "Uzaklaştır"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "Yaklaştır"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "Çoklu3B Oluştur"
+
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "Bu düğümde OccluderPolygon2D kaynağı yok.\n"
+#~ "OluÅŸtur ve bir tane ata?"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "LMB: Taşıma Noktası."
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "Ctrl + LMB: Parçayı Böl."
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "RMB: Noktayı Sil."
+
+#, fuzzy
+#~ msgid "New TextFile"
+#~ msgstr "Dosyaları Görüntüle"
+
+#~ msgid "Save Theme As"
+#~ msgstr "Temayı Farklı Kaydet"
+
+#~ msgid "<None>"
+#~ msgstr "<Yok>"
+
+#~ msgid ""
+#~ "Select sub-tile to use as icon, this will be also used on invalid "
+#~ "autotile bindings."
+#~ msgstr ""
+#~ "Simge olarak kullanmak işin alt-karo seç, bu aynı zamanda geçersiz oto-"
+#~ "karo bağlantılarında kullanılacaktır."
+
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "YaklaÅŸ (%):"
+
+#~ msgid "Class List:"
+#~ msgstr "Sınıf Listesi:"
+
+#~ msgid "Search Classes"
+#~ msgstr "Sınıfları Ara"
+
+#~ msgid "Public Methods"
+#~ msgstr "Açık Metodlar"
+
+#~ msgid "Public Methods:"
+#~ msgstr "Açık Metotlar:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "Grafik Arayüzü Tema Öğeleri"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "Grafik Arayüzü Tema Öğeleri:"
+
+#, fuzzy
+#~ msgid "Property: "
+#~ msgstr "Özellik:"
+
+#, fuzzy
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "Klasör durumunu Beğenilen olarak değiştir"
+
+#, fuzzy
+#~ msgid "Show current scene file."
+#~ msgstr "Şuanki düzenlenmiş alt-döşemeyi seç."
+
+#, fuzzy
+#~ msgid "Whole words"
+#~ msgstr "Tam Kelimeler"
+
+#, fuzzy
+#~ msgid "Match case"
+#~ msgstr "Büyük/Küçük Harf Eşleştir"
+
+#, fuzzy
+#~ msgid "Filter: "
+#~ msgstr "Süzgeç:"
+
+#~ msgid "Ok"
+#~ msgstr "Tamam"
+
+#~ msgid "Show In File System"
+#~ msgstr "Dosya Sisteminde Göster"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "Sınıf hiyerarşisi ara."
+
+#, fuzzy
+#~ msgid "Search in files"
+#~ msgstr "Sınıfları Ara"
+
+#~ msgid ""
+#~ "Built-in scripts can only be edited when the scene they belong to is "
+#~ "loaded"
+#~ msgstr ""
+#~ "Gömülü betik dosyaları yalnızca ait oldukları sahne yüklendiğinde "
+#~ "düzenlenebilirler"
+
+#~ msgid "Convert To Uppercase"
+#~ msgstr "Büyük Harfe Dönüştür"
+
+#~ msgid "Convert To Lowercase"
+#~ msgstr "Küçük Harfe Dönüştür"
+
+#, fuzzy
+#~ msgid "Snap To Floor"
+#~ msgstr "Izgaraya yapış"
+
+#~ msgid "Rotate 0 degrees"
+#~ msgstr "0 Düzeyde Döndür"
+
+#~ msgid "Rotate 90 degrees"
+#~ msgstr "90 Düzeyde Döndür"
+
+#~ msgid "Rotate 180 degrees"
+#~ msgstr "180 Düzeyde Döndür"
+
+#~ msgid "Rotate 270 degrees"
+#~ msgstr "270 Düzeyde Döndür"
+
+#~ msgid "Warning"
+#~ msgstr "Uyarı"
+
+#~ msgid "Error:"
+#~ msgstr "Hata:"
+
+#~ msgid "Source:"
+#~ msgstr "Kaynak:"
+
+#~ msgid "Function:"
+#~ msgstr "Fonksiyon:"
+
+#~ msgid "Variable"
+#~ msgstr "DeÄŸiÅŸken"
+
+#~ msgid "Errors:"
+#~ msgstr "Hatalar:"
+
+#~ msgid "Stack Trace (if applicable):"
+#~ msgstr "İzi Yığ (uygulanabilirse):"
+
+#~ msgid "Bake!"
+#~ msgstr "PiÅŸir!"
+
+#~ msgid "Bake the navigation mesh."
+#~ msgstr "Yönlendirici örüntüsünü pişir."
+
+#~ msgid "Get"
+#~ msgstr "Al"
+
#~ msgid "Change Scalar Constant"
#~ msgstr "Basamaklı Sabiti Değiştir"
@@ -9671,9 +10268,6 @@ msgstr ""
#~ msgid "Run Script"
#~ msgstr "Betiği Çalıştır"
-#~ msgid "Save the currently edited resource."
-#~ msgstr "Düzenlenen kaynağı kaydedin."
-
#~ msgid "Stop Profiling"
#~ msgstr "Kesitlemeyi Durdur"
@@ -9874,9 +10468,6 @@ msgstr ""
#~ msgid "Clear Emitter"
#~ msgstr "Yayıcıyı Temizle"
-#~ msgid "Fold Line"
-#~ msgstr "Satırı Katla"
-
#~ msgid " "
#~ msgstr " "
@@ -9961,9 +10552,6 @@ msgstr ""
#~ msgid "Could not save atlas subtexture:"
#~ msgstr "Atlas alt dokusu kaydedilemedi:"
-#~ msgid "Exporting for %s"
-#~ msgstr "%s için Dışa Aktarım"
-
#~ msgid "Setting Up..."
#~ msgstr "Kurulum..."
@@ -10062,9 +10650,6 @@ msgstr ""
#~ msgid "Source Font:"
#~ msgstr "Yazı Türü Kaynağı:"
-#~ msgid "Source Font Size:"
-#~ msgstr "Kaynak Yazı Türü Boyutu:"
-
#~ msgid "Dest Resource:"
#~ msgstr "Varış Kaynağı:"
@@ -10141,9 +10726,6 @@ msgstr ""
#~ msgid "Start(s)"
#~ msgstr "Başlangıç(lar)"
-#~ msgid "Filters"
-#~ msgstr "Süzgeçler"
-
#~ msgid "Source path is empty."
#~ msgstr "Kaynak yol boÅŸ."
@@ -10418,15 +11000,9 @@ msgstr ""
#~ msgid "Stereo"
#~ msgstr "Çiftli"
-#~ msgid "Pitch"
-#~ msgstr "Perde"
-
#~ msgid "Window"
#~ msgstr "Pencere"
-#~ msgid "Move Right"
-#~ msgstr "Sağa Taşı"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "Şuna %s%% Ölçeklendiriliyor."
@@ -10491,9 +11067,6 @@ msgstr ""
#~ msgid "just pressed"
#~ msgstr "yeni basıldı"
-#~ msgid "just released"
-#~ msgstr "yeni bırakıldı"
-
#, fuzzy
#~ msgid ""
#~ "Couldn't read the certificate file. Are the path and password both "
@@ -10799,21 +11372,6 @@ msgstr ""
#~ msgid "Trailing Silence:"
#~ msgstr "Sessizliği İzliyor:"
-#~ msgid "Script Export Mode:"
-#~ msgstr "Betik Dışa Aktarım Biçimi:"
-
-#~ msgid "Text"
-#~ msgstr "Yazı"
-
-#~ msgid "Compiled"
-#~ msgstr "DerlenmiÅŸ"
-
-#~ msgid "Encrypted (Provide Key Below)"
-#~ msgstr "Şifreli (Açarı Aşağıda Belirtin)"
-
-#~ msgid "Script Encryption Key (256-bits as hex):"
-#~ msgstr "Betik Şifreleme Açarı (Hex olarak 256-bit):"
-
#~ msgid "Export Project PCK"
#~ msgstr "Tasarı PCK Dışa Aktar"
@@ -10823,9 +11381,6 @@ msgstr ""
#~ msgid "Project Export"
#~ msgstr "Tasarı Dışa Aktar"
-#~ msgid "Export Preset:"
-#~ msgstr "Ön Ayarları Dışa Aktar:"
-
#~ msgid "BakedLightInstance does not contain a BakedLight resource."
#~ msgstr "BakedLightInstance, bir BakedLight kaynağı içermez."
diff --git a/editor/translations/uk.po b/editor/translations/uk.po
index 153d01f551..ca8452b9f4 100644
--- a/editor/translations/uk.po
+++ b/editor/translations/uk.po
@@ -1,27 +1,31 @@
# Ukrainian translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# Aleksandr <XpycT.TOP@gmail.com>, 2017.
-# Yuri Chornoivan <yurchor@ukr.net>, 2018.
+# Yuri Chornoivan <yurchor@ukr.net>, 2018, 2019.
# Ðндрій Бандура <andriykopanytsia@gmail.com>, 2018.
# Гидеон Теон <t.kudely94@gmail.com>, 2017.
-# МакÑим Якимчук <xpinovo@gmail.com>, 2018.
+# МакÑим Якимчук <xpinovo@gmail.com>, 2018, 2019.
# ÐœÐ°Ñ€Ñ Ð¯Ð¼Ð±Ð°Ñ€ <mjambarmeta@gmail.com>, 2017-2018.
# ОлекÑандр Пилипчук <pilipchukap@rambler.ru>, 2018.
+# Kirill Omelchenko <kirill.omelchenko@gmail.com>, 2018.
+# ÐлекÑандр <ol-vin@mail.ru>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Ukrainian (Godot Engine)\n"
-"PO-Revision-Date: 2018-07-26 10:17+0000\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2019-01-13 15:07+0000\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/godot-engine/"
"godot/uk/>\n"
"Language: uk\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 3.1-dev\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -30,41 +34,39 @@ msgstr ""
"Ðекоректний аргумент типу у convert(), Ñлід викориÑтовувати Ñталі TYPE_*."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr "ÐедоÑтатньо байтів Ð´Ð»Ñ Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ вказано некоректний формат."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Ðекоректні вхідні дані %i (не передано) у виразі"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
msgstr ""
+"не можна викориÑтовувати self, оÑкільки екземплÑÑ€ Ñ” порожнім (не передано)"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "Ðекоректна назва влаÑтивоÑті індекÑу, «%s», у вузлі %s."
+msgstr "Ðекоректні операнди оператора %s, %s Ñ– %s."
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid index of type %s for base type %s"
-msgstr "Ðекоректна назва влаÑтивоÑті індекÑу, «%s», у вузлі %s."
+msgstr "Ðекоректний Ñ–Ð½Ð´ÐµÐºÑ Ñ‚Ð¸Ð¿Ñƒ %s Ð´Ð»Ñ Ð±Ð°Ð·Ð¾Ð²Ð¾Ð³Ð¾ типу %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "Ðекоректний іменований Ñ–Ð½Ð´ÐµÐºÑ Â«%s» Ð´Ð»Ñ Ð±Ð°Ð·Ð¾Ð²Ð¾Ð³Ð¾ типу %s"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid arguments to construct '%s'"
-msgstr ": Ðеправильний тип аргументу: "
+msgstr "Ðекоректні аргументи Ð´Ð»Ñ Ð¿Ð¾Ð±ÑƒÐ´Ð¾Ð²Ð¸ «%s»"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "При виклику «%s»:"
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -73,27 +75,23 @@ msgstr "Вивільнити"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "ЗбаланÑована"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Mirror"
-msgstr "Віддзеркалити за X"
+msgstr "Віддзеркалити"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "Ð’Ñтавити ключ"
+msgstr "Тут Ñлід вÑтавити ключ"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "Дублювати виділене"
+msgstr "Дублювати позначені ключі"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "Вилучити вибране"
+msgstr "Вилучити позначені ключі"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -124,46 +122,40 @@ msgid "Anim Change Call"
msgstr "Змінити виклик анімації"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Property Track"
-msgstr "ВлаÑтивіÑть:"
+msgstr "Доріжка влаÑтивоÑтей"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "3D Transform Track"
-msgstr "Тип перетвореннÑ"
+msgstr "Доріжка проÑторового перетвореннÑ"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "Доріжка виклику методів"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "Доріжка кривої Безьє"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "Доріжка Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð²ÑƒÐºÑƒ"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Playback Track"
-msgstr "Зупинити Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð°Ð½Ñ–Ð¼Ð°Ñ†Ñ–Ñ—. (S)"
+msgstr "Доріжка Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð°Ð½Ñ–Ð¼Ð°Ñ†Ñ–Ñ—"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
-msgstr "Додати нову доріжку"
+msgstr "Додати доріжку"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Length Time (seconds)"
-msgstr "ТриваліÑть анімації (в Ñекундах)."
+msgstr "ТриваліÑть анімації (у Ñекундах)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "МаÑÑˆÑ‚Ð°Ð±ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð½Ñ–Ð¼Ð°Ñ†Ñ–Ñ—."
+msgstr "ЦиклічніÑть анімації"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -171,41 +163,36 @@ msgid "Functions:"
msgstr "Функції:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Audio Clips:"
-msgstr "ПроÑÐ»ÑƒÑ…Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð²ÑƒÐºÑƒ"
+msgstr "Звукові кліпи:"
#: editor/animation_track_editor.cpp
msgid "Anim Clips:"
-msgstr ""
+msgstr "Кліпи анімації:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Toggle this track on/off."
-msgstr "Перемкнути режим без відволіканнÑ."
+msgstr "Увімкнути або вимкнути цю доріжку."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "Оновити режим (ÑпоÑіб вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ†Ñ–Ñ”Ñ— влаÑтивоÑті)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Interpolation Mode"
-msgstr "Ðнімаційний вузол"
+msgstr "Режим інтерполÑції"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "Режим Ð·Ð°Ñ†Ð¸ÐºÐ»ÐµÐ½Ð½Ñ (інтерполÑÑ†Ñ–Ñ Ð²Ð·Ð°Ñ”Ð¼Ð¾Ð´Ñ–Ñ— ÐºÑ–Ð½Ñ†Ñ Ñ–Ð· початком у циклі)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "Вилучити обрану доріжку."
+msgstr "Вилучити цю доріжку."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "Ð§Ð°Ñ X-Fade (Ñ):"
+msgstr "Ð§Ð°Ñ (Ñ): "
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -220,13 +207,12 @@ msgid "Trigger"
msgstr "Триґер"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Capture"
-msgstr "МожливоÑті"
+msgstr "ЗахопленнÑ"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "Ðайближча"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
@@ -235,15 +221,15 @@ msgstr "Лінійний"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr ""
+msgstr "Кубічна"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
-msgstr ""
+msgstr "ЗатиÑнута інтерполÑÑ†Ñ–Ñ Ñ†Ð¸ÐºÐ»Ñƒ"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "Загорнута інтерполÑÑ†Ñ–Ñ Ñ†Ð¸ÐºÐ»Ñƒ"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -251,14 +237,12 @@ msgid "Insert Key"
msgstr "Ð’Ñтавити ключ"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "Дублювати вузли"
+msgstr "Дублювати ключі"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "Вилучити вузли"
+msgstr "Вилучити ключі"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -276,7 +260,6 @@ msgstr "Створити %d нові доріжки Ñ– вÑтавити ключ
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -288,7 +271,7 @@ msgstr "Ð’Ñтавити анімацію"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
-msgstr ""
+msgstr "AnimationPlayer не може анімувати Ñебе, лише інших відтворювачів."
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
@@ -304,7 +287,7 @@ msgstr "Ð’Ñтавити ключ анімації"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr ""
+msgstr "Доріжки Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð°ÑтоÑовуютьÑÑ Ð»Ð¸ÑˆÐµ до вузлів на оÑнові Spatial."
#: editor/animation_track_editor.cpp
msgid ""
@@ -313,44 +296,48 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"Звукові доріжки можуть вказувати лише на вузли таких типів:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "Доріжки анімації можуть вказувати лише на взули AnimationPlayer."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
msgstr ""
+"Відтворювач анімації не може відтворювати Ñам Ñебе, лише інші відтворювачі "
+"анімації."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "Ðе можна додавати нові доріжки без кореневого запиÑу"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "ШлÑÑ… доріжки Ñ” некоректним, отже не можна додавати ключ."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "Доріжка не належить до типу Spatial, не можна вÑтавлÑти ключ"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
-msgstr ""
+msgstr "ШлÑÑ… доріжки Ñ” некоректним, отже не можна додавати ключ методу."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Method not found in object: "
-msgstr "Ðе знайдено VariableGet у Ñкрипті: "
+msgstr "Ðе знайдено метод у об'єкті: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
msgstr "ПереміÑтити ключі анімації"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clipboard is empty"
-msgstr "Буфер обміну порожній!"
+msgstr "Буфер обміну порожній"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
@@ -360,24 +347,25 @@ msgstr "МаÑÑˆÑ‚Ð°Ð±ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ»ÑŽÑ‡Ñ–Ð² анімації"
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
msgstr ""
+"Цей параметр не працює Ð´Ð»Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÑ€Ð¸Ð²Ð¸Ñ… Безьє, оÑкільки це лише "
+"одинарна доріжка."
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "Показувати доріжки лише Ð´Ð»Ñ Ð²ÑƒÐ·Ð»Ñ–Ð², Ñкі позначено у ієрархії."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
msgstr ""
+"Групувати доріжки за вузлами або показувати Ñ—Ñ… у форматі проÑтого ÑпиÑку."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap (s): "
-msgstr "Крок (Ñек.):"
+msgstr "ÐŸÑ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð½Ñ (Ñ): "
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "Дерево анімації Ñ” дійÑним."
+msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÑ€Ð¾ÐºÑƒ анімації."
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -389,19 +377,16 @@ msgid "Edit"
msgstr "Редагувати"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "Дерево анімації"
+msgstr "ВлаÑтивоÑті анімації."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "Копіювати параметри"
+msgstr "Копіювати доріжки"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "Ð’Ñтавити параметри"
+msgstr "Ð’Ñтавити доріжки"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -411,8 +396,7 @@ msgstr "Вибір маÑштабу"
msgid "Scale From Cursor"
msgstr "МаÑштаб від курÑору"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Дублювати виділене"
@@ -421,17 +405,16 @@ msgid "Duplicate Transposed"
msgstr "Дублювати транÑпоноване"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
-msgstr "Вилучити вибране"
+msgstr "Вилучити позначене"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
-msgstr "Перейти до наÑтупного кроку"
+msgid "Go to Next Step"
+msgstr "До наÑтупного кроку"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
-msgstr "ПовернутиÑÑ Ð´Ð¾ попереднього кроку"
+msgid "Go to Previous Step"
+msgstr "До попереднього кроку"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
@@ -443,11 +426,11 @@ msgstr "ÐžÑ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð°Ð½Ñ–Ð¼Ð°Ñ†Ñ–Ñ—"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "Виберіть вузол, Ñкий буде анімовано:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "ВикориÑтовувати криві Безьє"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
@@ -455,7 +438,7 @@ msgstr "Оптимізатор Ðнімації"
#: editor/animation_track_editor.cpp
msgid "Max. Linear Error:"
-msgstr "МакÑимальна лінійна похибка:"
+msgstr "МакÑ. лінійна похибка:"
#: editor/animation_track_editor.cpp
msgid "Max. Angular Error:"
@@ -495,7 +478,7 @@ msgstr "Ð¡Ð¿Ñ–Ð²Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð¼Ð°Ñштабу:"
#: editor/animation_track_editor.cpp
msgid "Select tracks to copy:"
-msgstr ""
+msgstr "Виберіть доріжки Ð´Ð»Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ:"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -533,11 +516,11 @@ msgstr "Ðемає збігів"
msgid "Replaced %d occurrence(s)."
msgstr "Замінено %d випадок(-ів)."
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "Враховувати регіÑтр"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "Цілі Ñлова"
@@ -553,29 +536,31 @@ msgstr "Замінити вÑÑ–"
msgid "Selection Only"
msgstr "Тільки виділити"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Збільшувати"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "ЗменшеннÑ"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "Скинути маÑштаб"
#: editor/code_editor.cpp
-#, fuzzy
msgid "Warnings:"
-msgstr "ПопередженнÑ"
+msgstr "ПопередженнÑ:"
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "Збільшувати"
+msgid "Font Size:"
+msgstr "Розмір шрифту:"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "РÑдок:"
@@ -608,6 +593,7 @@ msgstr "Додати"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -664,9 +650,8 @@ msgid "Disconnect '%s' from '%s'"
msgstr "Від'єднати '%s' від '%s'"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect all from signal: '%s'"
-msgstr "Від'єднати '%s' від '%s'"
+msgstr "Від'єднати уÑе від Ñигналу: «%s»"
#: editor/connections_dialog.cpp
msgid "Connect..."
@@ -678,19 +663,16 @@ msgid "Disconnect"
msgstr "Роз'єднати"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect Signal: "
-msgstr "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñигналу:"
+msgstr "З'єднати Ñигнал: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection: "
-msgstr "Помилка з'єднаннÑ"
+msgstr "Редагувати з’єднаннÑ: "
#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "Are you sure you want to remove all connections from the \""
-msgstr "Ви Ñправді хочете запуÑтити декілька проектів одночаÑно?"
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr "Ви Ñправді хочете вилучити уÑÑ– з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· Ñигналу «%s»?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -698,22 +680,19 @@ msgstr "Сигнали"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr ""
+msgstr "Ви Ñправді хочете вилучити уÑÑ– з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· цього Ñигналу?"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "Роз'єднати"
+msgstr "Роз'єднати уÑÑ–"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit..."
-msgstr "Редагувати"
+msgstr "Змінити…"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "Методи"
+msgstr "Перейти до методу"
#: editor/create_dialog.cpp
msgid "Change %s Type"
@@ -738,23 +717,20 @@ msgid "Recent:"
msgstr "Ðещодавні:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Пошук:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "Збіги:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "ОпиÑ:"
@@ -793,8 +769,7 @@ msgid "Resource"
msgstr "РеÑурÑ"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "ШлÑÑ…"
@@ -815,9 +790,10 @@ msgid "Search Replacement Resource:"
msgstr "Знайти замінний реÑурÑ:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -850,8 +826,8 @@ msgid "Error loading:"
msgstr "Помилка завантаженнÑ:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
-msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ у зв'Ñзку з відÑутніми залежноÑÑ‚Ñми Ñцени:"
+msgid "Load failed due to missing dependencies:"
+msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ через неÑтачу залежноÑтей:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -909,14 +885,6 @@ msgstr "Змінити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñловника"
msgid "Thanks from the Godot community!"
msgstr "СпаÑибі від Ñпільноти Godot!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "Гаразд"
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Ðвтори Ñ€ÑƒÑˆÑ–Ñ Godot"
@@ -1010,8 +978,8 @@ msgid "Uncompressing Assets"
msgstr "Ð Ð¾Ð·Ð¿Ð°ÐºÐ¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ñ–Ð²"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
-msgstr "Пакет вÑтановлений уÑпішно!"
+msgid "Package installed successfully!"
+msgstr "Пакунок уÑпішно вÑтановлено!"
#: editor/editor_asset_installer.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -1092,8 +1060,7 @@ msgid "Bus options"
msgstr "Опції шини"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "Дублювати"
@@ -1256,7 +1223,7 @@ msgid "Add AutoLoad"
msgstr "Додати автозавантаженнÑ"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "ШлÑÑ…:"
@@ -1264,8 +1231,8 @@ msgstr "ШлÑÑ…:"
msgid "Node Name:"
msgstr "Ім'Ñ Ð’ÑƒÐ·Ð»Ð°:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "Ім'Ñ"
@@ -1335,26 +1302,29 @@ msgid "Template file not found:"
msgstr "Файл шаблону не знайдено:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Вибрати поточну теку"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "Файл Ñ–Ñнує, перезапиÑати його?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "Вибрати поточну теку"
+msgid "Select This Folder"
+msgstr "Вибрати цю теку"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
msgstr "Копіювати шлÑÑ…"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Open In File Manager"
-msgstr "Показати в файловому менеджері"
+msgid "Open in File Manager"
+msgstr "Відкрити у менеджері файлів"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
-msgstr "Показати в файловому менеджері"
+msgid "Show in File Manager"
+msgstr "Показати у менеджері файлів"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
@@ -1389,7 +1359,8 @@ msgid "Open a File or Directory"
msgstr "Відкрити файл або каталог"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "Зберегти"
@@ -1447,8 +1418,7 @@ msgstr "Каталоги та файли:"
msgid "Preview:"
msgstr "Попередній переглÑд:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "Файл:"
@@ -1464,24 +1434,11 @@ msgstr "Сканувати Ñирці"
msgid "(Re)Importing Assets"
msgstr "Ð†Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ñ–Ð²"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "Пошук довідки"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "СпиÑок клаÑів:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "Пошук клаÑів"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "Верхівка"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "КлаÑ:"
@@ -1498,28 +1455,28 @@ msgid "Brief Description:"
msgstr "СтиÑлий опиÑ:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "Члени"
+msgid "Properties"
+msgstr "ВлаÑтивоÑті"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "Члени:"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr "ВлаÑтивоÑті:"
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "Публічні методи"
+msgid "Methods"
+msgstr "Методи"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "Публічні методи:"
+msgid "Methods:"
+msgstr "Методи:"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "Тема елементів ГІК"
+msgid "Theme Properties"
+msgstr "ВлаÑтивоÑті теми"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "Тема елементів ГІК:"
+msgid "Theme Properties:"
+msgstr "ВлаÑтивоÑті теми:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1546,12 +1503,16 @@ msgid "Constants:"
msgstr "КонÑтанти:"
#: editor/editor_help.cpp
-msgid "Description"
-msgstr "ОпиÑ"
+msgid "Class Description"
+msgstr "ÐžÐ¿Ð¸Ñ ÐºÐ»Ð°Ñу"
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
+msgstr "ÐžÐ¿Ð¸Ñ ÐºÐ»Ð°Ñу:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
-msgstr "Підручники у інтернеті:"
+msgstr "Підручники в інтернеті:"
#: editor/editor_help.cpp
msgid ""
@@ -1564,12 +1525,12 @@ msgstr ""
"щодо їхнього ÑтвореннÑ[/url][/color]."
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "ВлаÑтивоÑті"
+msgid "Property Descriptions"
+msgstr "ОпиÑи влаÑтивоÑтей"
#: editor/editor_help.cpp
-msgid "Property Description:"
-msgstr "ÐžÐ¿Ð¸Ñ Ð²Ð»Ð°ÑтивоÑтей:"
+msgid "Property Descriptions:"
+msgstr "ОпиÑи влаÑтивоÑтей:"
#: editor/editor_help.cpp
msgid ""
@@ -1580,12 +1541,12 @@ msgstr ""
"[url=$url]Ñтворіть його[/url][/color]!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "Методи"
+msgid "Method Descriptions"
+msgstr "ОпиÑи методів"
#: editor/editor_help.cpp
-msgid "Method Description:"
-msgstr "ÐžÐ¿Ð¸Ñ Ð¼ÐµÑ‚Ð¾Ð´Ñ–Ð²:"
+msgid "Method Descriptions:"
+msgstr "ОпиÑи методів:"
#: editor/editor_help.cpp
msgid ""
@@ -1595,18 +1556,58 @@ msgstr ""
"У поточній верÑÑ–Ñ— немає опиÑу цього методу. Будь лаÑка, [color=$color][url="
"$url]Ñтворіть його[/url][/color]!"
-#: editor/editor_inspector.cpp
-#, fuzzy
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Пошук довідки"
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr "Показати уÑе"
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr "Лише клаÑи"
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr "Лише методи"
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr "Лише Ñигнали"
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr "Лише Ñталі"
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr "Лише влаÑтивоÑті"
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr "Лише влаÑтивоÑті теми"
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr "Тип члена"
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr "КлаÑ"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
msgstr "ВлаÑтивіÑть:"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr "Множина"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "Ð’Ñтановити кратніÑть:"
#: editor/editor_log.cpp
msgid "Output:"
@@ -1634,6 +1635,11 @@ msgstr "Ðе вдалоÑÑ ÐµÐºÑпортувати проект, код пом
msgid "Error saving resource!"
msgstr "Помилка Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ñ€ÐµÑурÑу!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "Гаразд"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "Зберегти реÑÑƒÑ€Ñ Ñк..."
@@ -1652,7 +1658,7 @@ msgstr "Помилка при збереженні."
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
-msgstr ""
+msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ «%s». Файл могло бути переÑунуто або вилучено."
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
@@ -1688,12 +1694,24 @@ msgstr "Ð¦Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð½Ðµ може бути виконана без кÐ
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+"Цю Ñцену неможливо зберегти через циклічне Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ ÐµÐºÐ·ÐµÐ¼Ð¿Ð»Ñра.\n"
+"Будь лаÑка, приберіть це включеннÑ, потім повторіть Ñпробу збереженнÑ."
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
"Ðе вдалоÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ Ñцену. Вірогідно, залежноÑті (екземплÑри або "
"уÑпадковані) не задоволені."
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr "Ðеможливо перезапиÑати Ñцену, Ñка Ñ” ще відкритою!"
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ бібліотеку Ñіток Ð´Ð»Ñ Ð·Ð»Ð¸Ñ‚Ñ‚Ñ!"
@@ -1952,6 +1970,14 @@ msgstr "Ðеможливо завантажити Ð´Ð¾Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ ÑкриÐ
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+"Ðеможливо завантажити Ñкрипт Ð´Ð¾Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ð· шлÑху «%s». ЗдаєтьÑÑ, у коді Ñ” "
+"помилка, будь лаÑка, перевірте ÑинтакÑиÑ."
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
"Ðе вдаєтьÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ Ñкрипт Ð´Ð¾Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ð· шлÑху: '%s' Базовий тип не Ñ” "
@@ -2001,15 +2027,18 @@ msgstr "Видалити компонуваннÑ"
msgid "Default"
msgstr "Типовий"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr "Показати у файловій ÑиÑтемі"
+
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play This Scene"
-msgstr "Відтворити Ñцену"
+msgstr "Відтворити цю Ñцену"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "Закрити інші вкладки"
+msgstr "Закрити вкладку"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2084,7 +2113,7 @@ msgid "Save Scene"
msgstr "Зберегти Ñцену"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+msgid "Save All Scenes"
msgstr "Зберегти вÑÑ– Ñцени"
#: editor/editor_node.cpp
@@ -2113,7 +2142,7 @@ msgid "Undo"
msgstr "СкаÑувати"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Повернути"
@@ -2137,20 +2166,20 @@ msgstr "Параметри проекту"
msgid "Export"
msgstr "ЕкÑпортуваннÑ"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "ІнÑтрументи"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "Відкрити менеджер проектів?"
+msgstr "Ð’Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ñ‚ÐµÐºÐ¸ даних проекту"
#: editor/editor_node.cpp
msgid "Quit to Project List"
msgstr "Вийти в ÑпиÑок проектів"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "ДіагноÑтика"
@@ -2258,18 +2287,16 @@ msgid "Toggle Fullscreen"
msgstr "Перемикач повноекранного режиму"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Data/Settings Folder"
-msgstr "Параметри редактора"
+msgstr "Ð’Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ñ‚ÐµÐºÐ¸ даних/параметрів редактора"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "Ð’Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ñ‚ÐµÐºÐ¸ даних редактора"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Settings Folder"
-msgstr "Параметри редактора"
+msgstr "Відкрити теку параметрів редактора"
#: editor/editor_node.cpp editor/project_export.cpp
msgid "Manage Export Templates"
@@ -2279,10 +2306,6 @@ msgstr "Ð£Ð¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð°Ð¼Ð¸ екÑпорту"
msgid "Help"
msgstr "Довідка"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "КлаÑи"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2353,13 +2376,12 @@ msgstr "Відтворити вибіркову Ñцену"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr ""
+msgstr "Зміна відеодрайвера потребує перезапуÑку редактора."
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Save & Restart"
-msgstr "Зберегти та вийти"
+msgstr "Зберегти Ñ– перезапуÑтити"
#: editor/editor_node.cpp
msgid "Spins when the editor window repaints!"
@@ -2377,27 +2399,26 @@ msgstr "Оновлювати зміни"
msgid "Disable Update Spinner"
msgstr "Вимкнути Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð»Ñ–Ñ‡Ð¸Ð»ÑŒÐ½Ð¸ÐºÐ°"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "ІнÑпектор"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "Імпортувати"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "Вузол"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "Файлова ÑиÑтема"
#: editor/editor_node.cpp
-#, fuzzy
+msgid "Inspector"
+msgstr "ІнÑпектор"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "Вузол"
+
+#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
-msgstr "Розгорнути вÑе"
+msgstr "Розгорнути нижню панель"
#: editor/editor_node.cpp scene/resources/visual_shader.cpp
msgid "Output"
@@ -2476,9 +2497,8 @@ msgid "Thumbnail..."
msgstr "Мініатюра..."
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit Plugin"
-msgstr "Редагувати полігон"
+msgstr "Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ°"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
@@ -2502,15 +2522,13 @@ msgid "Status:"
msgstr "СтатуÑ:"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit:"
-msgstr "Редагувати"
+msgstr "Редагувати:"
#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Start"
-msgstr "Почати!"
+msgstr "Початок"
#: editor/editor_profiler.cpp
msgid "Measure:"
@@ -2532,7 +2550,7 @@ msgstr "Кадр %"
msgid "Physics Frame %"
msgstr "Фізичний кадр %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "ЧаÑ:"
@@ -2556,34 +2574,65 @@ msgstr "ЧаÑ"
msgid "Calls"
msgstr "Виклики"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr "Увімкнено"
#: editor/editor_properties.cpp
msgid "Layer"
-msgstr ""
+msgstr "Шар"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Bit %d, value %d"
-msgstr "Біт %d, Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d."
+msgstr "Біт %d, Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr "[Порожньо]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
+msgid "Assign..."
+msgstr "Призначити…"
+
+#: editor/editor_properties.cpp
#, fuzzy
-msgid "Assign.."
-msgstr "Призначити"
+msgid "Invalid RID"
+msgstr "Ðеправильний шлÑÑ…"
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+"Тип вибраного реÑурÑу (%s) не відповідає типу, Ñкий Ñ” очікуваним Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— "
+"влаÑтивоÑті (%s)."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+"Ðеможливо Ñтворити ViewportTexture на оÑнові реÑурÑів, Ñкі збережено Ñк "
+"файл.\n"
+"РеÑÑƒÑ€Ñ Ð¼Ð°Ñ” належати до Ñцени."
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+"Ðеможливо Ñтворити ViewportTexture на оÑнові цього реÑурÑу, оÑкільки його не "
+"вÑтановлено Ñк локальний щодо Ñцени.\n"
+"Будь лаÑка, увімкніть влаÑтивіÑть «Локальний щодо Ñцени» Ð´Ð»Ñ Ð½ÑŒÐ¾Ð³Ð¾ (Ñ– уÑÑ–Ñ… "
+"реÑурÑів, що його міÑÑ‚Ñть, аж до вузла)."
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr "Виберіть панель переглÑду"
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr "Ðовий Ñкрипт"
@@ -2595,10 +2644,6 @@ msgstr "Ðовий %s"
msgid "Make Unique"
msgstr "Зробити унікальним"
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr "Показати в файловій ÑиÑтемі"
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2607,7 +2652,8 @@ msgstr "Показати в файловій ÑиÑтемі"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "Ð’Ñтавити"
@@ -2620,9 +2666,8 @@ msgstr "Перетворити на %s"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Open Editor"
-msgstr "Відкрити в редакторі"
+msgstr "Відкрити вікно редактора"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Selected node is not a Viewport!"
@@ -2630,25 +2675,23 @@ msgstr "Позначений вузол не Ñ” панеллю переглÑдÑ
#: editor/editor_properties_array_dict.cpp
msgid "Size: "
-msgstr ""
+msgstr "Розмір: "
#: editor/editor_properties_array_dict.cpp
msgid "Page: "
-msgstr ""
+msgstr "Сторінка: "
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Key:"
-msgstr "Ðова назва:"
+msgstr "Ðовий ключ:"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Value:"
-msgstr "Ðова назва:"
+msgstr "Ðове значеннÑ:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
-msgstr ""
+msgstr "Додати пару ключ-значеннÑ"
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -2734,16 +2777,15 @@ msgstr "ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð·ÐµÑ€ÐºÐ°Ð», будь лаÑка, зачекайт
#: editor/export_template_manager.cpp
msgid "Remove template version '%s'?"
-msgstr "Видалити верÑÑ–ÑŽ шаблону '%s'?"
+msgstr "Вилучити верÑÑ–ÑŽ шаблону '%s'?"
#: editor/export_template_manager.cpp
msgid "Can't open export templates zip."
msgstr "Ðеможливо відкрити ZIP-файл шаблону екÑпорту."
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Invalid version.txt format inside templates: %s."
-msgstr "Ðеправильний формат version.txt у шаблонах."
+msgstr "Ðеправильний формат version.txt у шаблонах: %s."
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
@@ -2808,6 +2850,8 @@ msgid ""
"Templates installation failed. The problematic templates archives can be "
"found at '%s'."
msgstr ""
+"Ðе вдалоÑÑ Ð²Ñтановити шаблони. Проблемні архіви із шаблонами можна знайти "
+"тут: «%s»."
#: editor/export_template_manager.cpp
msgid "Error requesting url: "
@@ -2873,7 +2917,7 @@ msgstr "Ð’Ñтановити з файлу"
#: editor/export_template_manager.cpp
msgid "Remove Template"
-msgstr "Видалити шаблон"
+msgstr "Вилучити шаблон"
#: editor/export_template_manager.cpp
msgid "Select template file"
@@ -2888,9 +2932,8 @@ msgid "Download Templates"
msgstr "Завантажити шаблони"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr "Виберіть дзеркало зі ÑпиÑку: "
+msgstr "Виберіть дзеркало зі ÑпиÑку: (Shift+клацаннÑ: відкрити у браузері)"
#: editor/file_type_cache.cpp
msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
@@ -2899,19 +2942,21 @@ msgstr ""
"тип кешу!"
#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr "Вибране"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
"Ðеможливо перейти до '%s' , оÑкільки він не був знайдений в файловій ÑиÑтемі!"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a grid of thumbnails."
-msgstr "ПереглÑд елементів у виглÑді Ñітки мініатюр"
+msgstr "ПереглÑд елементів у виглÑді Ñітки еÑкізів."
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a list."
-msgstr "ПереглÑд елементів Ñк ÑпиÑок"
+msgstr "ПереглÑд елементів Ñк ÑпиÑок."
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
@@ -2939,19 +2984,15 @@ msgstr "Помилка дублюваннÑ:"
msgid "Unable to update dependencies:"
msgstr "Ðеможливо оновити залежноÑті:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "Ім'Ñ Ð½Ðµ вказано"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "Ім'Ñ Ð½Ðµ вказано."
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "Ðадане ім'Ñ Ð¼Ñ–Ñтить некоректні Ñимволи"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "Ім'Ñ Ð½Ðµ вказано."
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "Ðазва міÑтить некоректні Ñимволи."
@@ -2976,22 +3017,6 @@ msgid "Duplicating folder:"
msgstr "Ð”ÑƒÐ±Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ñ‚ÐµÐºÐ¸:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "Розгорнути вÑе"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "Згорнути вÑе"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "Перейменувати..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "ПереміÑтити до..."
-
-#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
msgstr "Відкрити Ñцену(и)"
@@ -3000,6 +3025,14 @@ msgid "Instance"
msgstr "ЕкземплÑÑ€"
#: editor/filesystem_dock.cpp
+msgid "Add to favorites"
+msgstr "Додати до вибраного"
+
+#: editor/filesystem_dock.cpp
+msgid "Remove from favorites"
+msgstr "Вилучити з вибраного"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "Редагувати залежноÑті..."
@@ -3007,19 +3040,33 @@ msgstr "Редагувати залежноÑті..."
msgid "View Owners..."
msgstr "ПереглÑнути влаÑників..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "Перейменувати..."
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "Дублювати..."
#: editor/filesystem_dock.cpp
-#, fuzzy
+msgid "Move To..."
+msgstr "ПереміÑтити до..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
-msgstr "Ðовий Ñкрипт"
+msgstr "Створити Ñкрипт…"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "Зберегти реÑÑƒÑ€Ñ Ñк..."
+msgstr "Створити реÑурÑ…"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr "Розгорнути вÑе"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr "Згорнути вÑе"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3041,29 +3088,18 @@ msgid "Re-Scan Filesystem"
msgstr "ПереÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²Ð¾Ñ— ÑиÑтеми"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "Переключити ÑÑ‚Ð°Ñ‚ÑƒÑ Ñ‚ÐµÐºÐ¸ Ñк обране"
+msgid "Toggle split mode"
+msgstr "Перемкнути режим поділу"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Show current scene file."
-msgstr "Вибрати поточну редаговану вкладену плитку."
+msgid "Search files"
+msgstr "Шукати файли"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr "Додати вибрану Ñцену(и), Ñк нащадка вибраного вузла."
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "Пошук клаÑів"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3071,51 +3107,37 @@ msgstr ""
"Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð²,\n"
"будь лаÑка, зачекайте..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "ПереміÑтити"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "There is already file or folder with the same name in this location."
-msgstr "У вказаному каталозі вже міÑтитьÑÑ Ñ‚ÐµÐºÐ° із вказано назвою."
+msgstr "У вказаному каталозі вже міÑтитьÑÑ Ñ‚ÐµÐºÐ° або файл із вказано назвою."
#: editor/filesystem_dock.cpp
msgid "Overwrite"
-msgstr ""
+msgstr "ПерезапиÑати"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
-msgstr "Створити Ñценарій"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find in files"
-msgstr "Знайти плитку"
+msgstr "Створити Ñкрипт"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find: "
-msgstr "Знайти"
+msgid "Find in Files"
+msgstr "Знайти у файлах"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Whole words"
-msgstr "Цілі Ñлова"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "Враховувати регіÑтр"
+msgid "Find:"
+msgstr "Знайти:"
#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "Тека:"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Filter: "
-msgstr "Режим фільтруваннÑ:"
+msgid "Filters:"
+msgstr "Фільтри:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3131,52 +3153,48 @@ msgid "Cancel"
msgstr "СкаÑувати"
#: editor/find_in_files.cpp
-#, fuzzy
+msgid "Find: "
+msgstr "Знайти: "
+
+#: editor/find_in_files.cpp
msgid "Replace: "
-msgstr "Замінити"
+msgstr "Замінити: "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace all (no undo)"
-msgstr "Замінити вÑÑ–"
+msgstr "Замінити вÑе (без ÑкаÑовуваннÑ)"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Searching..."
-msgstr "ЗбереженнÑ..."
+msgstr "Шукаємо…"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Search complete"
-msgstr "Шукати текÑÑ‚"
+msgstr "Пошук завершено"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group name already exists."
-msgstr "ПОМИЛКÐ: Ðазва анімації вже Ñ–Ñнує!"
+msgstr "Група із такою назвою вже Ñ–Ñнує."
#: editor/groups_editor.cpp
-#, fuzzy
-msgid "invalid Group name."
-msgstr "Ðекоректна назва."
+msgid "Invalid group name."
+msgstr "ÐеприпуÑтима назва групи."
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "Групи"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes not in Group"
-msgstr "Додати до групи"
+msgstr "Вузли поза групою"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
msgid "Filter nodes"
msgstr "Фільтрувати вузли"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes in Group"
-msgstr "Додати до групи"
+msgstr "Вузли у групі"
#: editor/groups_editor.cpp
msgid "Add to Group"
@@ -3187,9 +3205,8 @@ msgid "Remove from Group"
msgstr "Вилучити з групи"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Manage Groups"
-msgstr "Групи"
+msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ñ€ÑƒÐ¿Ð°Ð¼Ð¸"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Single Scene"
@@ -3296,17 +3313,12 @@ msgstr "Переімпортувати"
msgid "Failed to load resource."
msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ реÑурÑ."
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "Гаразд"
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr "Розгорнути вÑÑ– влаÑтивоÑті"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+msgid "Collapse All Properties"
msgstr "Згорнути вÑÑ– влаÑтивоÑті"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3323,9 +3335,8 @@ msgid "Paste Params"
msgstr "Ð’Ñтавити параметри"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Edit Resource Clipboard"
-msgstr "Ð’ буфері обміну немає реÑурÑу!"
+msgstr "Редагувати буфер реÑурÑів"
#: editor/inspector_dock.cpp
msgid "Copy Resource"
@@ -3352,6 +3363,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "Завантажити наÑвний реÑÑƒÑ€Ñ Ñ–Ð· диÑка та відредагувати його."
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "Зберегти поточний редагований реÑурÑ."
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "Перейти до попереднього редагованого об'єкта в Ñ–Ñторії."
@@ -3368,9 +3383,8 @@ msgid "Object properties."
msgstr "ВлаÑтивоÑті об'єкта."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Filter properties"
-msgstr "Фільтрувати вузли"
+msgstr "Фільтрувати влаÑтивоÑті"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
@@ -3385,47 +3399,40 @@ msgid "Select a Node to edit Signals and Groups."
msgstr "Виберіть вузол Ð´Ð»Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñигналів та груп."
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Edit a Plugin"
-msgstr "Редагувати полігон"
+msgstr "Редагувати додаток"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Create a Plugin"
-msgstr "Створити розв'Ñзок C#"
+msgstr "Створити додаток"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Plugin Name:"
-msgstr "Плаґіни"
+msgstr "Ðазва додатка:"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
-msgstr ""
+msgstr "Підтека:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Language:"
-msgstr "Мова"
+msgstr "Мова:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Script Name:"
-msgstr "Скрипт є коректним"
+msgstr "Ðазва Ñкрипту:"
#: editor/plugin_config_dialog.cpp
msgid "Activate now?"
-msgstr ""
+msgstr "ЗадіÑти зараз?"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
msgstr "Створити полігон"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+msgid "Edit Polygon"
msgstr "Редагувати полігон"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3433,34 +3440,33 @@ msgid "Insert Point"
msgstr "Ð’Ñтавити точку"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr "Редагувати полігон (вилучити точку)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+msgid "Remove Polygon And Point"
msgstr "Вилучити полігон та точку"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ полігону з нулÑ"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr "Створити точки."
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
-"Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ñнуючого полігону:\n"
-"ЛКМ: переміÑтити точку.\n"
-"Ctrl+ЛКМ: розділити Ñегмент.\n"
-"ПКМ: видалити точку."
+"Редагувати точки.\n"
+"ЛКМ: переміÑтити точку\n"
+"ПКМ: вилучити точку"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
-msgstr "Видалити точки"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr "Витерти точки."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3474,15 +3480,16 @@ msgstr "Ð”Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð°Ð½Ñ–Ð¼Ð°Ñ†Ñ–Ñ—"
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Load.."
-msgstr "Завантажити"
+msgid "Load..."
+msgstr "Завантажити…"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "This type of node can't be used. Only root nodes are allowed."
msgstr ""
+"Ðе можна викориÑтовувати цей тип вузлів. Можна викориÑтовувати лише кореневі "
+"вузли."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3492,72 +3499,67 @@ msgid ""
"AnimationTree is inactive.\n"
"Activate to enable playback, check node warnings if activation fails."
msgstr ""
+"AnimationTree є неактивним.\n"
+"Ðктивуйте, щоб уможливити відтвореннÑ. ОзнайомтеÑÑ Ñ–Ð· попередженнÑми щодо "
+"вузлів, Ñкщо не вдаєтьÑÑ Ð°ÐºÑ‚Ð¸Ð²ÑƒÐ²Ð°Ñ‚Ð¸."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Set the blending position within the space"
-msgstr ""
+msgstr "Ð’Ñтановити позицію Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñƒ проÑторі"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Select and move points, create points with RMB."
msgstr ""
+"Виберіть Ñ– переÑуньте точки. Створити точки можна за допомогою ÐºÐ»Ð°Ñ†Ð°Ð½Ð½Ñ "
+"правою кнопкою миші."
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Видалити точки"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "ПКМ: Стерти точку."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr "Увімкнути Ð¿Ñ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð½Ñ Ñ– показати Ñітку."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Point"
-msgstr "ПереміÑтити точку"
+msgstr "Точка"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Open Animation Node"
-msgstr "Ðнімаційний вузол"
+msgstr "Відкрити вузол анімації"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists"
-msgstr "Ð—Ð°Ð¿Ð¸Ñ Ð´Ñ–Ñ— «%s» вже Ñ–Ñнує!"
+msgstr "Трикутник вже Ñ–Ñнує"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "BlendSpace2D does not belong to an AnimationTree node."
-msgstr ""
+msgstr "BlendSpace2D не належить до вузла AnimationTree."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "No triangles exist, so no blending can take place."
-msgstr ""
+msgstr "Трикутників не Ñ–Ñнує, отже Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð½Ðµ Ñ” можливим."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create triangles by connecting points."
-msgstr ""
+msgstr "Створити трикутники з'єднаннÑм точок."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Erase points and triangles."
-msgstr ""
+msgstr "Вилучити точки і трикутники."
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Generate blend triangles automatically (instead of manually)"
-msgstr ""
+msgstr "Створити трикутники Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾ (а не вручну)"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr "ПрилипаннÑ"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "Змішувати:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3566,20 +3568,25 @@ msgstr "Редагувати фільтри"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Output node can't be added to the blend tree."
-msgstr ""
+msgstr "Вузол Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð½Ðµ можна додавати до дерева злиттÑ."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Unable to connect, port may be in use or connection may be invalid."
msgstr ""
+"Ðе вдалоÑÑ Ð·'єднати. Можливо, порт вже викориÑтано або з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ” "
+"некоректним."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
msgstr ""
+"Ðе вÑтановлено відтворювача анімації, отже неможливо отримати назви доріжок."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Player path set is invalid, so unable to retrieve track names."
msgstr ""
+"Ðабір шлÑхів відтворювача Ñ” некоректним, тому неможливо отримати назви "
+"доріжок."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
@@ -3587,23 +3594,22 @@ msgid ""
"Animation player has no valid root node path, so unable to retrieve track "
"names."
msgstr ""
+"Відтворювач анімації не має коректного шлÑху до кореневого вузла, тому "
+"неможливо отримати назви доріжок."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Add Node.."
-msgstr "Додати вузол"
+msgid "Add Node..."
+msgstr "Додати вузол…"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filtered Tracks:"
-msgstr "Редагувати фільтри"
+msgstr "Редагувати фільтровані доріжки:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Enable filtering"
-msgstr "Редагований дочірній елемент"
+msgstr "Увімкнути фільтруваннÑ"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
@@ -3631,14 +3637,12 @@ msgid "Remove Animation"
msgstr "Вилучити анімацію"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Invalid animation name!"
-msgstr "ПОМИЛКÐ: неправильне ім'Ñ Ð°Ð½Ñ–Ð¼Ð°Ñ†Ñ–Ñ—!"
+msgstr "Ðекоректна назва анімації!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Animation name already exists!"
-msgstr "ПОМИЛКÐ: Ðазва анімації вже Ñ–Ñнує!"
+msgstr "ÐÐ½Ñ–Ð¼Ð°Ñ†Ñ–Ñ Ñ–Ð· такою назвою вже Ñ–Ñнує!"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -3662,14 +3666,12 @@ msgid "Duplicate Animation"
msgstr "Дублювати анімацію"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to copy!"
-msgstr "ПОМИЛКÐ: Ðемає анімації Ð´Ð»Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ!"
+msgstr "Ðемає анімації Ð´Ð»Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation resource on clipboard!"
-msgstr "ПОМИЛКÐ: Ðемає анімаційного реÑурÑу в буфері обміну!"
+msgstr "У буфері обміну немає реÑурÑу анімації!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
@@ -3680,9 +3682,8 @@ msgid "Paste Animation"
msgstr "Ð’Ñтавити анімацію"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to edit!"
-msgstr "ПОМИЛКÐ: Ðемає анімації Ð´Ð»Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ!"
+msgstr "Ðемає анімації Ð´Ð»Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
@@ -3727,14 +3728,12 @@ msgid "New"
msgstr "Ðовий"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Transitions..."
-msgstr "Переходи"
+msgstr "Редагувати переходи…"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Open in Inspector"
-msgstr "Відкрити в редакторі"
+msgstr "Відкрити в інÑпекторі"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Display list of animations in player."
@@ -3793,9 +3792,8 @@ msgid "Include Gizmos (3D)"
msgstr "Включити ÒÑ–Ð·Ð¼Ð¾Ñ (3D)"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Pin AnimationPlayer"
-msgstr "Ð’Ñтавити анімацію"
+msgstr "Пришпилити AnimationPlayer"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Create New Animation"
@@ -3827,32 +3825,31 @@ msgstr "Ð§Ð°Ñ Ð¼Ñ–Ð¶ анімаціÑми"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "End"
-msgstr ""
+msgstr "Кінець"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Immediate"
-msgstr ""
+msgstr "Ðегайно"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Sync"
-msgstr ""
+msgstr "Синхронізувати"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "At End"
-msgstr ""
+msgstr "Ðа кінець"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Travel"
-msgstr ""
+msgstr "Подорож"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Start and end nodes are needed for a sub-transition."
-msgstr ""
+msgstr "Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð¼Ñ–Ð¶Ð½Ð¾Ð³Ð¾ переходу потрібен початковий Ñ– кінцевий вузол."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "No playback resource set at path: %s."
-msgstr "Ðе в реÑурÑному шлÑху."
+msgstr "Ðе вÑтановлено реÑурÑу Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñƒ шлÑху: %s."
#: editor/plugins/animation_state_machine_editor.cpp
msgid ""
@@ -3860,34 +3857,35 @@ msgid ""
"RMB to add new nodes.\n"
"Shift+LMB to create connections."
msgstr ""
+"Позначте Ñ– переÑуньте вузли.\n"
+"ÐšÐ»Ð°Ñ†Ð°Ð½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð¾ÑŽ — додати нові вузли.\n"
+"Shift+ÐºÐ»Ð°Ñ†Ð°Ð½Ð½Ñ Ð»Ñ–Ð²Ð¾ÑŽ — Ñтворити з'єднаннÑ."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "Створити новий %s"
+msgstr "Створити вузли."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Connect nodes."
-msgstr "Приєднати вузли"
+msgstr "З'єднати вузли."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
-msgid "Remove selected node or transition"
-msgstr "Вилучити обрану доріжку."
+msgid "Remove selected node or transition."
+msgstr "Вилучити позначений вузол або перехід."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
msgstr ""
+"Увімкнути або вимкнути автоматичне Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ†Ñ–Ñ”Ñ— анімації при запуÑку, "
+"перезапуÑку або позиціюванні на нуль."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set the end animation. This is useful for sub-transitions."
-msgstr ""
+msgstr "Ð’Ñтановити кінець анімації. КориÑно Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð¼Ñ–Ð¶Ð½Ð¸Ñ… переходів."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "Перехід"
+msgstr "Перехід: "
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3941,10 +3939,6 @@ msgid "Amount:"
msgstr "ОбÑÑг:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "Змішувати:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "Ð—Ð¼Ñ–ÑˆÑƒÐ²Ð°Ð½Ð½Ñ 0:"
@@ -4085,14 +4079,12 @@ msgid "Asset Download Error:"
msgstr "Помилка Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ñƒ:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading (%s / %s)..."
-msgstr "ЗавантаженнÑ"
+msgstr "ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ (%s з %s)…"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading..."
-msgstr "ЗавантаженнÑ"
+msgstr "ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…â€¦"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Resolving..."
@@ -4119,14 +4111,12 @@ msgid "Download for this asset is already in progress!"
msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ активу вже виконуєтьÑÑ!"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "First"
-msgstr "перший"
+msgstr "Перший"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Previous"
-msgstr "ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ð²ÐºÐ»Ð°Ð´ÐºÐ°"
+msgstr "Ðазад"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Next"
@@ -4134,7 +4124,7 @@ msgstr "Далі"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Last"
-msgstr ""
+msgstr "ОÑтанній"
#: editor/plugins/asset_library_editor_plugin.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -4144,9 +4134,9 @@ msgstr "Ð’Ñе"
#: editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_settings_editor.cpp
msgid "Plugins"
-msgstr "Плаґіни"
+msgstr "Плаґіни (додатки)"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "Сортувати:"
@@ -4261,29 +4251,28 @@ msgid "Create new horizontal and vertical guides"
msgstr "Створити нові горизонтальні та вертикальні напрÑмні"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move pivot"
-msgstr "ПереміÑтити опорну точку"
+msgstr "ПереÑунути опорну точку"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Rotate CanvasItem"
-msgstr "Редагувати CanvasItem"
+msgstr "Обертати CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move anchor"
-msgstr "ПереміÑтити дію"
+msgstr "ПереÑунути прив'Ñзку"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Resize CanvasItem"
-msgstr "Редагувати CanvasItem"
+msgstr "Змінити розмір CanvasItem"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr "МаÑштабувати CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move CanvasItem"
-msgstr "Редагувати CanvasItem"
+msgstr "ПереÑунути CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -4302,19 +4291,18 @@ msgid "Paste Pose"
msgstr "Ð’Ñтавити позу"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "ЗменшеннÑ"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom reset"
-msgstr "ЗменшеннÑ"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
+"ПопередженнÑ: дані щодо Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° розміру дочірніх об'єктів "
+"визначаютьÑÑ Ð»Ð¸ÑˆÐµ їхнім батьківÑьким об'єктом."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Збільшувати"
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
+msgstr "Відновити початковий маÑштаб"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
@@ -4347,6 +4335,10 @@ msgid "Rotate Mode"
msgstr "Режим повороту"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr "Режим маÑштабуваннÑ"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4364,16 +4356,14 @@ msgid "Pan Mode"
msgstr "Режим панорамуваннÑ"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle snapping."
-msgstr "Перемикає прив'ÑзуваннÑ"
+msgstr "Увімкнути або вимкнути прив'ÑзуваннÑ."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Snap"
msgstr "За допомогою функції прив'Ñзки"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snapping Options"
msgstr "Параметри прив'Ñзки"
@@ -4415,9 +4405,8 @@ msgid "Snap to node sides"
msgstr "ÐŸÑ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð½Ñ Ð´Ð¾ боків вузла"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to node center"
-msgstr "ÐŸÑ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð½Ñ Ð´Ð¾ прив'Ñзки вузла"
+msgstr "ÐŸÑ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð½Ñ Ð´Ð¾ центру вузла"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to other nodes"
@@ -4446,6 +4435,10 @@ msgid "Restores the object's children's ability to be selected."
msgstr "Відновлює можливіÑть вибору нащадків об'єкта."
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr "Параметри каркаÑа"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "Показати кіÑтки"
@@ -4459,12 +4452,11 @@ msgstr "ОчиÑтити ІК-ланцюг"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make Custom Bone(s) from Node(s)"
-msgstr ""
+msgstr "Створити нетипові кіÑтки з вузлів"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Custom Bones"
-msgstr "ОчиÑтити кіÑтки"
+msgstr "ОчиÑтити нетипові кіÑтки"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -4497,6 +4489,10 @@ msgid "Show Viewport"
msgstr "Показати панель переглÑду"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr "Показати піктограми Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° блокуваннÑ"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr "Центрувати на вибраному"
@@ -4509,9 +4505,8 @@ msgid "Layout"
msgstr "Макет"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Insert keys."
-msgstr "Ð’Ñтавити ключі"
+msgstr "Ð’Ñтавити ключі."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
@@ -4569,17 +4564,24 @@ msgstr ""
"ПеретÑг + Alt : Змінити тип вузла"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr "Створити полігон3D"
+msgid "Create Polygon3D"
+msgstr "Створити Polygon3D"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "Редагувати полігон"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "Редагувати полігон (вилучити точку)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
msgstr "Ð’Ñтановити обробник"
#: editor/plugins/cpu_particles_editor_plugin.cpp
-#, fuzzy
msgid "CPUParticles"
-msgstr "ЧаÑтинки"
+msgstr "CPUParticles"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
@@ -4672,37 +4674,9 @@ msgid "Item List Editor"
msgstr "Редактор ÑпиÑку елементів"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"Цей вузол не має реÑурÑу OccluderPolygon2D.\n"
-"Створити і призначити?"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr "Створено затінювальний полігон"
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr "Створити новий полігон з нулÑ."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ñнуючого полігону:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "ЛКМ: ПереміÑтити точку."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr "CTRL+ЛКМ: Розділити Ñегмент."
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "ПКМ: Стерти точку."
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr "Сітка порожнÑ!"
@@ -4737,7 +4711,7 @@ msgstr "Вбудована Ñітка не має типу ArrayMesh."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "UV Unwrap failed, mesh may not be manifold?"
-msgstr "UV розгортка не вдалаÑÑ, можливо у поліÑеткі не однозв'Ñзна форма?"
+msgstr "UV-розгортка не вдалаÑÑ, можливо у поліÑеткі не однозв'Ñзна форма?"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "No mesh to debug."
@@ -4934,13 +4908,13 @@ msgid "Populate"
msgstr "Заповнити"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð°Ð²Ñ–Ð³Ð°Ñ†Ñ–Ð¹Ð½Ð¾Ð³Ð¾ полігону"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ AABB"
+msgid "Generating Visibility Rect"
+msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ð°Ñті видимоÑті"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -4969,6 +4943,11 @@ msgstr "ОчиÑтити маÑку випромінюваннÑ"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr "Перетворити на CPUParticles"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr "ЧаÑтинки"
@@ -5038,13 +5017,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr "Потрібен матеріал типу 'ParticlesMaterial'."
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
-msgstr "Генерувати AABB"
+msgid "Generating AABB"
+msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ AABB"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "Конвертувати у ВЕРХÐІЙ РЕГІСТР"
+msgid "Generate AABB"
+msgstr "Генерувати AABB"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5068,6 +5046,10 @@ msgid "Add Point to Curve"
msgstr "Ð”Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ до кривої"
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr "Розділити криву"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr "ПереміÑтити точку на криву"
@@ -5095,6 +5077,10 @@ msgid "Click: Add Point"
msgstr "Клацніть: Додати точку"
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr "ÐšÐ»Ð°Ñ†Ð°Ð½Ð½Ñ Ð»Ñ–Ð²Ð¾ÑŽ: розділити Ñегмент (кривої)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr "Клацніть правою кнопкою миші: видалити точку"
@@ -5110,11 +5096,6 @@ msgstr "Додати точку (в порожньому проÑторі)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr "Розділити Ñегмент (кривої)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "Вилучити точку"
@@ -5132,12 +5113,12 @@ msgstr "Параметри"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Angles"
-msgstr ""
+msgstr "Віддзеркалити кути елемента керуваннÑ"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Lengths"
-msgstr ""
+msgstr "Віддзеркалити довжини елемента керуваннÑ"
#: editor/plugins/path_editor_plugin.cpp
msgid "Curve Point #"
@@ -5171,97 +5152,104 @@ msgstr "Вилучити вихідну керувальну точку"
msgid "Remove In-Control Point"
msgstr "Вилучити вхідну керувальну точку"
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "Розділити Ñегмент (кривої)"
+
#: editor/plugins/physical_bone_plugin.cpp
-#, fuzzy
msgid "Move joint"
-msgstr "ПереміÑтити точку"
+msgstr "ПереÑунути з'єднаннÑ"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
-msgstr ""
+msgstr "ВлаÑтивіÑть skeleton Polygon2D не вказує на вузол Skeleton2D"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Sync bones"
-msgstr "Показати кіÑтки"
+msgid "Sync Bones"
+msgstr "Синхронізувати кіÑтки"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr ""
+"У цьому багатокутнику немає текÑтури.\n"
+"Ð”Ð»Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ UV Ñлід вÑтановити текÑтуру."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
-msgstr "Створити UV карту"
+msgstr "Створити UV-карту"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon & UV"
-msgstr "Створити полігон"
+msgstr "Створити полігон і UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "Створити нову горизонтальну напрÑмну"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
+#, fuzzy
+msgid "Remove Internal Vertex"
+msgstr "Вилучити вхідну керувальну точку"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "Ð—Ð°Ð¿Ð¸Ñ Ð´Ñ–Ñ— «%s» вже Ñ–Ñнує!"
+msgid "Add Custom Polygon"
+msgstr "Редагувати полігон"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Add Split"
-msgstr "Додати точку"
+msgid "Remove Custom Polygon"
+msgstr "Вилучити полігон зіткненнÑ"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Invalid Split: "
-msgstr "Ðеправильний шлÑÑ…"
+msgid "Transform UV Map"
+msgstr "Перетворити UV-карту"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Remove Split"
-msgstr "Вилучити точку"
+msgid "Transform Polygon"
+msgstr "Перетворити багатокутник"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Transform UV Map"
-msgstr "Перетворити UV карту"
+msgid "Paint Bone Weights"
+msgstr "Малювати ваги кіÑток"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
-msgstr ""
+msgid "Open Polygon 2D UV editor."
+msgstr "Відкрити вікно редактора плоÑких полігонів UV."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
-msgstr "Polygon 2D UV редактор"
+msgstr "Редактор плоÑких полігонів UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "UV"
-msgstr ""
+msgstr "UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "Редагувати полігон"
+msgid "Points"
+msgstr "Точка"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Splits"
-msgstr "Розділити шлÑÑ…"
+msgid "Polygons"
+msgstr "Полігон -> UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Bones"
-msgstr "Зробити кіÑтки"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Create Polygon"
-msgstr "Створити полігон"
+msgstr "КіÑтки"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
-msgstr "ПереміÑтити точку"
+msgid "Move Points"
+msgstr "ПереміÑтити точки"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
@@ -5288,25 +5276,26 @@ msgid "Scale Polygon"
msgstr "МаÑштабувати полігон"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "Спочатку виберіть елемент параметра!"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
-msgstr ""
+msgid "Paint weights with specified intensity."
+msgstr "Малювати ваги вказаною інтенÑивніÑтю."
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
-msgstr ""
+msgid "Unpaint weights with specified intensity."
+msgstr "СкаÑувати Ð¼Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ð°Ð³Ð¸ вказаною інтенÑивніÑтю."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Radius:"
-msgstr ""
+msgstr "РадіуÑ:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon->UV"
@@ -5321,9 +5310,13 @@ msgid "Clear UV"
msgstr "ОчиÑтити UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Settings"
-msgstr "Параметри GridMap"
+msgstr "Параметри Ñітки"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "ПрилипаннÑ"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
@@ -5334,34 +5327,28 @@ msgid "Grid"
msgstr "Сітка"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Configure Grid:"
-msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ð²'Ñзки"
+msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ñітки:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset X:"
-msgstr "ВідÑтуп Ñітки:"
+msgstr "ВідÑтуп Ñітки за X:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset Y:"
-msgstr "ВідÑтуп Ñітки:"
+msgstr "ВідÑтуп Ñітки за Y:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step X:"
-msgstr "Крок Ñітки:"
+msgstr "Крок Ñітки за X:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step Y:"
-msgstr "Крок Ñітки:"
+msgstr "Крок Ñітки за Y:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Sync Bones to Polygon"
-msgstr "МаÑштабувати полігон"
+msgstr "Синхронізувати кіÑтки з полігоном"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "ERROR: Couldn't load resource!"
@@ -5389,22 +5376,22 @@ msgid "Paste Resource"
msgstr "Ð’Ñтавити реÑурÑ"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "Відкрити в редакторі"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr "ЕкземплÑÑ€:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr "Тип:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "Відкрити в редакторі"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr "Завантажити реÑурÑ"
@@ -5415,12 +5402,11 @@ msgstr "Передзавантажувач реÑурÑів"
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "AnimationTree has no path set to an AnimationPlayer"
-msgstr ""
+msgstr "AnimationTree не міÑтить вÑтановлено шлÑху до AnimationPlayer"
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Path to AnimationPlayer is invalid"
-msgstr "Дерево анімації недійÑне."
+msgstr "ШлÑÑ… до AnimationPlayer Ñ” некоректним"
#: editor/plugins/script_editor_plugin.cpp
msgid "Clear Recent Files"
@@ -5431,56 +5417,62 @@ msgid "Close and save changes?"
msgstr "Закрити та зберегти зміни?"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error writing TextFile:"
-msgstr "Помилка Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð°Ð±Ð¾Ñ€Ñƒ тайлів!"
+msgstr "Помилка під Ñ‡Ð°Ñ Ñпроби запиÑати TextFile:"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr "Помилка: не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ файл."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error could not load file."
-msgstr "Помилка: не вдалоÑÑ Ñтворити Ñкрипт у файловій ÑиÑтемі."
+msgstr "Помилка: не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ файл."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error saving file!"
-msgstr "Помилка Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð°Ð±Ð¾Ñ€Ñƒ тайлів!"
+msgstr "Помилка під Ñ‡Ð°Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð°!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr "Помилка під Ñ‡Ð°Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‚ÐµÐ¼Ð¸"
+msgid "Error while saving theme."
+msgstr "Помилка під Ñ‡Ð°Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‚ÐµÐ¼Ð¸."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+msgid "Error Saving"
msgstr "Помилка збереженнÑ"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr "Помилка Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚ÐµÐ¼Ð¸"
+msgid "Error importing theme."
+msgstr "Помилка Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚ÐµÐ¼Ð¸."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+msgid "Error Importing"
msgstr "Помилка імпортуваннÑ"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New TextFile..."
-msgstr "Створити теку..."
+msgstr "Створити текÑтовий файл…"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open File"
msgstr "Відкрити файл"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Save File As..."
-msgstr "Зберегти Ñк..."
+msgstr "Зберегти файл Ñк…"
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme"
msgstr "Імпортувати тему"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "Помилка під Ñ‡Ð°Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‚ÐµÐ¼Ð¸"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "Помилка збереженнÑ"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr "Зберегти тему Ñк..."
@@ -5490,7 +5482,7 @@ msgstr " ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° клаÑ"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
-msgstr ""
+msgstr "Увімкнути або вимкнути упорÑÐ´ÐºÐ¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð° абеткою у ÑпиÑку методів."
#: editor/plugins/script_editor_plugin.cpp
msgid "Sort"
@@ -5510,20 +5502,19 @@ msgstr "ПереміÑтити вниз"
#: editor/plugins/script_editor_plugin.cpp
msgid "Next script"
-msgstr "ÐаÑтупний Ñценарій"
+msgstr "ÐаÑтупний Ñкрипт"
#: editor/plugins/script_editor_plugin.cpp
msgid "Previous script"
-msgstr "Попередній Ñценарій"
+msgstr "Попередній Ñкрипт"
#: editor/plugins/script_editor_plugin.cpp
msgid "File"
msgstr "Файл"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "New TextFile"
-msgstr "ПереглÑд файлів"
+msgid "Open..."
+msgstr "Відкрити..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5531,19 +5522,15 @@ msgstr "Зберегти вÑе"
#: editor/plugins/script_editor_plugin.cpp
msgid "Soft Reload Script"
-msgstr "М'Ñко перезавантажити Ñценарії"
+msgstr "М'Ñко перезавантажити Ñкрипт"
#: editor/plugins/script_editor_plugin.cpp
msgid "Copy Script Path"
msgstr "Копіювати шлÑÑ… до Ñкрипту"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr "Показати в файловій ÑиÑтемі"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
-msgstr "Попередній файл"
+msgid "History Previous"
+msgstr "Попередній у журналі"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
@@ -5555,6 +5542,10 @@ msgid "Theme"
msgstr "Тема"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme..."
+msgstr "Імпортувати тему…"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
msgstr "Перезавантажити тему"
@@ -5563,10 +5554,6 @@ msgid "Save Theme"
msgstr "Зберегти тему"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "Зберегти тему Ñк"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "Закрити документацію"
@@ -5584,7 +5571,7 @@ msgstr "ЗапуÑтити"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle Scripts Panel"
-msgstr "Перемкнути панель Ñценаріїв"
+msgstr "Перемкнути панель Ñкриптів"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -5613,7 +5600,7 @@ msgid "Keep Debugger Open"
msgstr "Залишити зневаджувач відкритим"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr "Ð—Ð½ÐµÐ²Ð°Ð´Ð¶ÐµÐ½Ð½Ñ Ð·Ð° допомогою зовнішнього редактора"
#: editor/plugins/script_editor_plugin.cpp
@@ -5621,10 +5608,6 @@ msgid "Open Godot online documentation"
msgstr "Відкрити онлайнову документацію Godot"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr "Пошук в ієрархії клаÑів."
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "Пошук довідкової документації."
@@ -5661,39 +5644,32 @@ msgid "Debugger"
msgstr "Зневаджувач"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search results"
-msgstr "Пошук довідки"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "Пошук клаÑів"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-"Вбудовані Ñкрипти можна змінити тільки тоді, коли завантажено Ñцену, до Ñкої "
-"вони належать"
+msgid "Search Results"
+msgstr "Результати пошуку"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Line"
-msgstr "РÑдок:"
+msgstr "РÑдок"
#: editor/plugins/script_text_editor.cpp
msgid "(ignore)"
-msgstr ""
+msgstr "(ігнорувати)"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function"
+msgstr "Перейти до функції"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr "Стандартний"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr "Можна перетÑгнути тільки реÑÑƒÑ€Ñ Ð· файлової ÑиÑтеми."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Lookup Symbol"
-msgstr "Завершити Ñимвол"
+msgstr "Шукати Ñимвол"
#: editor/plugins/script_text_editor.cpp
msgid "Pick Color"
@@ -5717,11 +5693,7 @@ msgstr "З Великої"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Syntax Highlighter"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
+msgstr "ЗаÑіб підÑÐ²Ñ–Ñ‡ÑƒÐ²Ð°Ð½Ð½Ñ ÑинтакÑиÑу"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
@@ -5774,11 +5746,11 @@ msgid "Trim Trailing Whitespace"
msgstr "Обрізати кінцевий пробіл"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr "Перетворити відÑтуп на пропуÑки"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr "Перетворити відÑтуп на табулÑції"
#: editor/plugins/script_text_editor.cpp
@@ -5795,36 +5767,27 @@ msgid "Remove All Breakpoints"
msgstr "Вилучити вÑÑ– точки зупинки"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
+msgid "Go to Next Breakpoint"
msgstr "Перейти до наÑтупної точки зупинки"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
+msgid "Go to Previous Breakpoint"
msgstr "Перейти до попередньої точки зупинки"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr "Конвертувати у ВЕРХÐІЙ РЕГІСТР"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr "Конвертувати в нижній регіÑтр"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr "Знайти попереднє"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Find in files..."
-msgstr "Фільтрувати файли..."
+msgid "Find in Files..."
+msgstr "Знайти у файлах…"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
+msgid "Go to Function..."
msgstr "Перейти до функції..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+msgid "Go to Line..."
msgstr "Перейти до Ñ€Ñдка..."
#: editor/plugins/script_text_editor.cpp
@@ -5837,40 +5800,35 @@ msgstr "Шейдер"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "This skeleton has no bones, create some children Bone2D nodes."
-msgstr ""
+msgstr "У цього каркаÑа немає кіÑток, Ñтворіть хоч ÑкіÑÑŒ дочірні вузли Bone2D."
#: editor/plugins/skeleton_2d_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton2D"
-msgstr "Одинак (шаблон проектуваннÑ)"
+msgstr "ПлоÑкий каркаÑ"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Make Rest Pose (From Bones)"
-msgstr ""
+msgstr "Створити вільну позу (з кіÑток)"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Set Bones to Rest Pose"
-msgstr ""
+msgstr "Ð’Ñтановити кіÑтки Ð´Ð»Ñ Ð²Ñ–Ð»ÑŒÐ½Ð¾Ñ— пози"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical bones"
-msgstr "Створити навігаційну Ñітку"
+msgstr "Створити фізичний кіÑÑ‚Ñк"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton"
-msgstr "Одинак (шаблон проектуваннÑ)"
+msgstr "КаркаÑ"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical skeleton"
-msgstr "Створити розв'Ñзок C#"
+msgstr "Створити фізичний каркаÑ"
#: editor/plugins/skeleton_ik_editor_plugin.cpp
-#, fuzzy
msgid "Play IK"
-msgstr "Відтворити"
+msgstr "Відтворити IK"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Orthogonal"
@@ -5921,6 +5879,14 @@ msgid "Animation Key Inserted."
msgstr "Ð’Ñтавлено ключ анімації."
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr "ХилитаннÑ"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr "ВідхиленнÑ"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr "Ðамальовано об'єктів"
@@ -6005,9 +5971,8 @@ msgid "This operation requires a single selected node."
msgstr "Ð¦Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð²Ð¸Ð¼Ð°Ð³Ð°Ñ” одного обраного вузла."
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Lock View Rotation"
-msgstr "ПереглÑд відомоÑтей"
+msgstr "ЗафікÑувати Ð¾Ð±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Normal"
@@ -6054,9 +6019,8 @@ msgid "Doppler Enable"
msgstr "Ефект Доплера"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Cinematic Preview"
-msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½ÑŒÐ¾Ð³Ð¾ переглÑду Ñітки"
+msgstr "Кінематичний переглÑд"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
@@ -6087,6 +6051,10 @@ msgid "Freelook Speed Modifier"
msgstr "Коефіцієнт швидкоÑті оглÑду"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду заблоковано"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "Вікно XForm"
@@ -6189,11 +6157,6 @@ msgid "Tool Scale"
msgstr "ІнÑтрумент маÑштабуваннÑ"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap To Floor"
-msgstr "Прив'Ñзати до Ñітки"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "ÐŸÐµÑ€ÐµÐ¼Ð¸ÐºÐ°Ð½Ð½Ñ Ð¾Ð³Ð»Ñду"
@@ -6203,7 +6166,7 @@ msgstr "ПеретвореннÑ"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap object to floor"
-msgstr ""
+msgstr "Приліпити об'єкт до підлоги"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Dialog..."
@@ -6234,9 +6197,8 @@ msgid "4 Viewports"
msgstr "4 панелі переглÑду"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Gizmos"
-msgstr "ПереглÑд гаджетів"
+msgstr "Гаджети"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Origin"
@@ -6311,51 +6273,51 @@ msgstr "До"
msgid "Post"
msgstr "ПіÑлÑ"
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr "Штука без назви"
+
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite is empty!"
-msgstr "Сітка порожнÑ!"
+msgstr "Спрайт порожній!"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Can't convert a sprite using animation frames to mesh."
msgstr ""
+"Ðеможливо перетворити Ñпрайт, викориÑтовуючи кадри анімації Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ "
+"Ñітки."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't replace by mesh."
-msgstr ""
+msgstr "Ðекоректна геометріÑ, неможливо замінити Ñіткою."
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite"
-msgstr "Кадри Ñпрайта"
+msgstr "Спрайт"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to 2D Mesh"
-msgstr "Перетворити на %s"
+msgstr "Перетворити на плоÑку Ñітку"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create 2D Mesh"
-msgstr "Створити Ñітку обведеннÑ"
+msgstr "Створити плоÑку Ñітку"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Simplification: "
-msgstr ""
+msgstr "СпрощеннÑ: "
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Grow (Pixels): "
-msgstr ""
+msgstr "ЗроÑÑ‚Ð°Ð½Ð½Ñ (пікÑелі): "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Update Preview"
-msgstr "Попередній переглÑд"
+msgstr "Оновити переглÑд"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Settings:"
-msgstr "Параметри"
+msgstr "Параметри:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
@@ -6430,12 +6392,17 @@ msgid "Set Region Rect"
msgstr "Ð’Ñтановити прÑмокутник облаÑті"
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr "Ð’Ñтановити поле"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr "Режим прилипаннÑ:"
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
-msgstr "<Ðемає>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
+msgstr "Ðемає"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Pixel Snap"
@@ -6459,12 +6426,11 @@ msgstr "Крок:"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Sep.:"
-msgstr ""
+msgstr "Інт.:"
#: editor/plugins/texture_region_editor_plugin.cpp
-#, fuzzy
msgid "TextureRegion"
-msgstr "ОблаÑть текÑтури"
+msgstr "TextureRegion"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Can't save theme to file:"
@@ -6595,9 +6561,12 @@ msgid "Erase Selection"
msgstr "Витерти позначене"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Fix Invalid Tiles"
-msgstr "Ðекоректна назва."
+msgstr "Виправити некоректні плитки"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Cut Selection"
+msgstr "Вирізати позначене"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
@@ -6620,7 +6589,6 @@ msgid "Erase TileMap"
msgstr "Витерти карту плиток"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Find Tile"
msgstr "Знайти плитку"
@@ -6645,35 +6613,36 @@ msgid "Pick Tile"
msgstr "Вибрати плитку"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
-msgid "Move Selection"
-msgstr "Вилучити виділене"
+msgid "Copy Selection"
+msgstr "Копіювати позначене"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð½Ð° 0 градуÑів"
+msgid "Rotate left"
+msgstr "Обертати ліворуч"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð½Ð° 90 градуÑів"
+msgid "Rotate right"
+msgstr "Обертати праворуч"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
-msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð½Ð° 180 градуÑів"
+msgid "Flip horizontally"
+msgstr "Відзеркалити горизонтально"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
-msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð½Ð° 270 градуÑів"
+msgid "Flip vertically"
+msgstr "Віддзеркалити вертикально"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Clear transform"
+msgstr "ЗнÑти перетвореннÑ"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Add Texture(s) to TileSet"
-msgstr "Додати вузли з дерева"
+msgid "Add Texture(s) to TileSet."
+msgstr "Додати текÑтури до TileSet."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
-msgid "Remove current Texture from TileSet"
-msgstr "Видалити поточне поле"
+msgid "Remove selected Texture from TileSet."
+msgstr "Вилучити поточну текÑтуру з TileSet."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -6684,104 +6653,213 @@ msgid "Merge from Scene"
msgstr "Об'єднати зі Ñцени"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
-msgstr ""
-"Виберіть підплитку Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ñк піктограми. Її також буде викориÑтано "
-"Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¸Ñ… прив'Ñзок у режимі автоплитки."
+msgid "Copy bitmask."
+msgstr "Копіювати бітову маÑку."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste bitmask."
+msgstr "Ð’Ñтавити бітову маÑку."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Erase bitmask."
+msgstr "Витерти бітову маÑку."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new polygon."
+msgstr "Створити новий полігон."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Keep polygon inside region Rect."
+msgstr "Утримувати полігон вÑередині Rect облаÑті."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
+"Увімкнути Ð¿Ñ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð½Ñ Ñ– показати Ñітку (можна налаштувати за допомогою "
+"«ІнÑпектора»)."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr "Показати назви плиток (Ñкщо затиÑнути клавішу Alt)"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove selected texture? This will remove all tiles which use it."
msgstr ""
+"Вилучити позначену текÑтуру? ÐаÑлідком буде Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ ÑƒÑÑ–Ñ… плиток, у Ñких Ñ—Ñ— "
+"викориÑтано."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
-msgstr ""
+msgstr "Вами не позначено текÑтури Ð´Ð»Ñ Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
-msgstr "Створити зі Ñцени?"
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr ""
+"Створити на оÑнові Ñцени? У результаті буде перезапиÑано уÑÑ– поточні плитки."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
msgstr "Об'єднати зі Ñцени?"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
-msgstr ""
+msgid "Remove Texture"
+msgstr "Вилучити текÑтуру"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
+msgstr "%s файлів не додано, оÑкільки вони вже були у ÑпиÑку."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Drag handles to edit Rect.\n"
"Click on another Tile to edit it."
msgstr ""
+"ПеретÑгніть елементи керуваннÑ, щоб змінити прÑмокутник.\n"
+"Клацніть на іншій плитці, щоб редагувати її."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete selected Rect."
+msgstr "Вилучити позначений Rect."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
-"Ліва кнопка: вÑтановити.\n"
-"Права кнопка: знÑти."
+"Вибрати поточну редаговану вкладену плитку.\n"
+"Клацніть на іншій плитці, щоб редагувати її."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete polygon."
+msgstr "Видалити полігон."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
-msgstr "Вибрати поточну редаговану вкладену плитку."
+msgstr ""
+"Ліва кнопка: вÑтановити біт.\n"
+"Права кнопка: знÑти біт.\n"
+"Клацніть на іншій плитці, щоб редагувати її."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to use as icon, this will be also used on invalid autotile "
"bindings.\n"
"Click on another Tile to edit it."
msgstr ""
"Виберіть підплитку Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ñк піктограми. Її також буде викориÑтано "
-"Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¸Ñ… прив'Ñзок у режимі автоплитки."
+"Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¸Ñ… прив'Ñзок у режимі автоплитки.\n"
+"Клацніть на іншій плитці, щоб редагувати її."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to change its priority.\n"
"Click on another Tile to edit it."
-msgstr "Позначте підплитку Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸ Ñ—Ñ— пріоритетноÑті."
+msgstr ""
+"Позначте підплитку Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸ Ñ—Ñ— пріоритетноÑті.\n"
+"Клацніть на іншій плитці, щоб редагувати її."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+"Позначте підплитку Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸ Ñ—Ñ— z-індекÑу.\n"
+"Клацніть на іншій плитці, щоб редагувати її."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr "Ð’Ñтановити облаÑть плитки"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Tile"
+msgstr "Створити плитку"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr "Ð’Ñтановити піктограму плитки"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr "Редагувати бітову маÑку плитки"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Collision Polygon"
+msgstr "Редагувати полігон зіткненнÑ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Occlusion Polygon"
+msgstr "Редагувати полігон перешкоди"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Navigation Polygon"
+msgstr "Редагувати навігаційний полігон"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste Tile Bitmask"
+msgstr "Ð’Ñтавити бітову маÑку плитки"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr "Спорожнити бітову маÑку плитки"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Tile"
+msgstr "Вилучити плитку"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr "Вилучити полігон зіткненнÑ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr "Вилучити полігон перешкоди"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr "Вилучити навігаційний полігон"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr "Редагувати пріоритетніÑть плитки"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr "Редагувати z-Ñ–Ð½Ð´ÐµÐºÑ Ð¿Ð»Ð¸Ñ‚ÐºÐ¸"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Collision Polygon"
+msgstr "Створити полігон зіткненнÑ"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create Occlusion Polygon"
+msgstr "Створити полігон перешкоди"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "This property can't be changed."
-msgstr "Ð¦Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð½Ðµ може бути виконана без Ñцени."
+msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ†Ñ–Ñ”Ñ— влаÑтивоÑті не можна змінювати."
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
-msgstr "Ðабір плитки"
+msgid "TileSet"
+msgstr "Ðабір плиток"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vertex"
-msgstr "Вершини"
+msgstr "Вершина"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Fragment"
-msgstr ""
+msgstr "Фрагмент"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Light"
-msgstr "Справа"
+msgstr "Світло"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "VisualShader"
-msgstr "Шейдер"
+msgstr "VisualShader"
#: editor/project_export.cpp
msgid "Runnable"
@@ -6801,6 +6879,14 @@ msgstr ""
"Ðе виÑтачає шаблонів екÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ð¸ або шаблони пошкоджено:"
#: editor/project_export.cpp
+msgid "Release"
+msgstr "ВипуÑк"
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr "ЕкÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÑƒÑього"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr "Ðабори"
@@ -6809,6 +6895,10 @@ msgid "Add..."
msgstr "Додати..."
#: editor/project_export.cpp
+msgid "Export Path"
+msgstr "ШлÑÑ… екÑпорту"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr "РеÑурÑи"
@@ -6867,10 +6957,46 @@ msgid "Feature List:"
msgstr "СпиÑок можливоÑтей:"
#: editor/project_export.cpp
+msgid "Script"
+msgstr "Скрипт"
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "Режим екÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñкрипту:"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr "ТекÑÑ‚"
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr "Зібрано"
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "Зашифровано (ключ можна вказати нижче)"
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr "Ðекоректний ключ ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ (ключ має ÑкладатиÑÑ Ñ–Ð· 64 Ñимволів)"
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "Ключ ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñкрипту (256-бітове шіÑтнадцÑткове чиÑло):"
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr "ЕкÑпортувати PCK/Zip"
#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr "Режим екÑпортуваннÑ?"
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr "ЕкÑпортувати уÑе"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr "Ðемає шаблонів екÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— платформи:"
@@ -6883,22 +7009,20 @@ msgid "The path does not exist."
msgstr "ШлÑху не Ñ–Ñнує."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
-msgstr "Будь лаÑка, виберіть теку, у Ñкій не міÑтитьÑÑ Ñ„Ð°Ð¹Ð»Ð° «project.godot»."
+msgstr "Ðекоректний файл проекту «.zip»: у ньому немає файла «project.godot»."
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "Будь лаÑка, виберіть порожню теку."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "Будь лаÑка, виберіть файл «project.godot»."
+msgstr "Будь лаÑка, виберіть файл «project.godot» або «.zip»."
#: editor/project_manager.cpp
msgid "Directory already contains a Godot project."
-msgstr ""
+msgstr "У каталозі вже міÑтитьÑÑ Ð¿Ñ€Ð¾ÐµÐºÑ‚ Godot."
#: editor/project_manager.cpp
msgid "Imported Project"
@@ -6989,9 +7113,8 @@ msgid "Project Path:"
msgstr "ШлÑÑ… проекту:"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Project Installation Path:"
-msgstr "ШлÑÑ… проекту:"
+msgstr "ШлÑÑ… вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ñƒ:"
#: editor/project_manager.cpp
msgid "Browse"
@@ -7002,8 +7125,8 @@ msgid "Unnamed Project"
msgstr "Проект без назви"
#: editor/project_manager.cpp
-msgid "Can't open project"
-msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ проект"
+msgid "Can't open project at '%s'."
+msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ проект у «%s»."
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
@@ -7011,6 +7134,34 @@ msgstr "Ви Ñправді хочете відкрити декілька прÐ
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+"Вказаний нижче файл параметрів проекту було Ñтворено у заÑтарілій верÑÑ–Ñ— "
+"рушіÑ. Його доведетьÑÑ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ до поточної верÑÑ–Ñ—:\n"
+"\n"
+"%s\n"
+"\n"
+"Хочете виконати таке перетвореннÑ?\n"
+"ПопередженнÑ: у результаті Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð²Ð¸ втратите можливіÑть Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ "
+"проекту у заÑтарілих верÑÑ–ÑÑ… рушіÑ."
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+"Параметри цього проекту було Ñтворено за допомогою Ñ€ÑƒÑˆÑ–Ñ Ð½Ð¾Ð²Ñ–ÑˆÐ¾Ñ— верÑÑ–Ñ—. Ці "
+"параметри Ñ” неÑуміÑними із верÑією, Ñкою ви зараз кориÑтуєтеÑÑ."
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7113,7 +7264,6 @@ msgid "Mouse Button"
msgstr "Кнопка миші"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid ""
"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
@@ -7130,18 +7280,16 @@ msgid "Rename Input Action Event"
msgstr "Перейменувати подію за вхідною дією"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Change Action deadzone"
-msgstr "Змінити ім'Ñ Ð°Ð½Ñ–Ð¼Ð°Ñ†Ñ–Ñ—:"
+msgstr "Змінити «мертву» зону дії"
#: editor/project_settings_editor.cpp
msgid "Add Input Action Event"
msgstr "Додати подію за вхідною дією"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "All Devices"
-msgstr "ПриÑтрій"
+msgstr "УÑÑ– приÑтрої"
#: editor/project_settings_editor.cpp
msgid "Device"
@@ -7188,24 +7336,20 @@ msgid "Wheel Down Button"
msgstr "Кнопка коліщатка вниз"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Left Button"
-msgstr "Кнопка коліщатка вгору"
+msgstr "Кнопка коліщатка ліворуч"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Right Button"
-msgstr "Права кнопка"
+msgstr "Кнопка коліщатка праворуч"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 1"
-msgstr "Кнопка 6"
+msgstr "Кнопка X 1"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 2"
-msgstr "Кнопка 6"
+msgstr "Кнопка X 2"
#: editor/project_settings_editor.cpp
msgid "Joypad Axis Index:"
@@ -7347,17 +7491,13 @@ msgstr "Параметри проекту (project.godot)"
msgid "General"
msgstr "\"Загальне\""
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr "ВлаÑтивіÑть:"
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr "Перевизначити на..."
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Editor must be restarted for changes to take effect"
-msgstr ""
+msgstr "Щоб зміни набули чинноÑті редактор Ñлід перезапуÑтити"
#: editor/project_settings_editor.cpp
msgid "Input Map"
@@ -7368,13 +7508,12 @@ msgid "Action:"
msgstr "ДіÑ:"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Action"
-msgstr "ДіÑ:"
+msgstr "ДіÑ"
#: editor/project_settings_editor.cpp
msgid "Deadzone"
-msgstr ""
+msgstr "«Мертва» зона"
#: editor/project_settings_editor.cpp
msgid "Device:"
@@ -7484,10 +7623,6 @@ msgstr "Вибрати вузол"
msgid "Bit %d, val %d."
msgstr "Біт %d, Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d."
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr "ВлаÑтивоÑті:"
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr "Вибір влаÑтивоÑті"
@@ -7510,129 +7645,124 @@ msgstr ""
"Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ перетворене Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð° допомогою заÑобу PVRTC:"
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Batch Rename"
-msgstr "Перейменувати"
+msgstr "Пакетне перейменуваннÑ"
#: editor/rename_dialog.cpp
msgid "Prefix"
-msgstr ""
+msgstr "ПрефікÑ"
#: editor/rename_dialog.cpp
msgid "Suffix"
-msgstr ""
+msgstr "СуфікÑ"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Advanced options"
-msgstr "Параметри прив'Ñзки"
+msgstr "Додаткові параметри"
#: editor/rename_dialog.cpp
msgid "Substitute"
-msgstr ""
+msgstr "ПідÑтавити"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node name"
-msgstr "Ім'Ñ Ð’ÑƒÐ·Ð»Ð°:"
+msgstr "Ðазва вузла"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
-msgstr ""
+msgstr "Ðазва батьківÑького запиÑу вузла, Ñкщо такий Ñ”"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node type"
-msgstr "Знайти тип вузла"
+msgstr "Тип вузлів"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Current scene name"
-msgstr "Поточна Ñцена"
+msgstr "Ðазва поточної Ñцени"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Root node name"
-msgstr "Перейменувати"
+msgstr "Ðазва кореневого вузла"
#: editor/rename_dialog.cpp
msgid ""
"Sequential integer counter.\n"
"Compare counter options."
msgstr ""
+"ПоÑлідовний цілочиÑельний лічильник.\n"
+"ПорівнÑйте параметри лічильника."
#: editor/rename_dialog.cpp
msgid "Per Level counter"
-msgstr ""
+msgstr "Лічильник на рівень"
#: editor/rename_dialog.cpp
msgid "If set the counter restarts for each group of child nodes"
msgstr ""
+"Якщо позначено, лічильник перезапуÑкатиметьÑÑ Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ñ— групи дочірніх "
+"вузлів"
#: editor/rename_dialog.cpp
msgid "Initial value for the counter"
-msgstr ""
+msgstr "Початкове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð»Ñ–Ñ‡Ð¸Ð»ÑŒÐ½Ð¸ÐºÐ°"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Step"
-msgstr "Крок:"
+msgstr "Крок"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
-msgstr ""
+msgid "Amount by which counter is incremented for each node"
+msgstr "Величина, на Ñку збільшуєтьÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð»Ñ–Ñ‡Ð¸Ð»ÑŒÐ½Ð¸ÐºÐ° Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ вузла"
#: editor/rename_dialog.cpp
msgid "Padding"
-msgstr ""
+msgstr "ФаÑка"
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
+"Мінімальна кількіÑть цифр Ð´Ð»Ñ Ð»Ñ–Ñ‡Ð¸Ð»ÑŒÐ½Ð¸ÐºÐ°.\n"
+"Якщо цифр буде менше, Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð¾Ð¿Ð¾Ð²Ð½ÑŽÐ²Ð°Ñ‚Ð¸Ð¼ÐµÑ‚ÑŒÑÑ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÐ¾Ð²Ð¸Ð¼Ð¸ нулÑми."
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Regular Expressions"
-msgstr "Змінити вираз"
+msgstr "Формальні вирази"
#: editor/rename_dialog.cpp
msgid "Post-Process"
-msgstr ""
+msgstr "ПоÑÑ‚-обробка"
#: editor/rename_dialog.cpp
msgid "Keep"
-msgstr ""
+msgstr "Ðе змінювати"
#: editor/rename_dialog.cpp
msgid "CamelCase to under_scored"
-msgstr ""
+msgstr "ГорбатийРегіÑтр у під_креÑлюваннÑ"
#: editor/rename_dialog.cpp
msgid "under_scored to CamelCase"
-msgstr ""
+msgstr "під_креÑÐ»ÑŽÐ²Ð°Ð½Ð½Ñ Ñƒ ГорбатийРегіÑтр"
#: editor/rename_dialog.cpp
msgid "Case"
-msgstr ""
+msgstr "РегіÑтр"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Lowercase"
msgstr "нижній регіÑтр"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Uppercase"
msgstr "ВЕРХÐІЙ РЕГІСТР"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Reset"
-msgstr "Скинути маÑштаб"
+msgstr "Скинути"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr "Помилка"
@@ -7693,6 +7823,10 @@ msgid "Instance Scene(s)"
msgstr "Сцени екземплÑра"
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "Створити екземплÑÑ€ дочірньої Ñцени"
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr "Вилучити Ñкрипт"
@@ -7729,6 +7863,14 @@ msgid "Save New Scene As..."
msgstr "Зберегти нову Ñцену Ñк..."
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+"Ð’Ð¸Ð¼Ð¸ÐºÐ°Ð½Ð½Ñ Â«editable_instance» призведе до Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ð¾Ð²Ð¸Ñ… значень Ð´Ð»Ñ "
+"уÑÑ–Ñ… влаÑтивоÑтей вузла."
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr "Редагований дочірній елемент"
@@ -7737,34 +7879,28 @@ msgid "Load As Placeholder"
msgstr "Завантажити Ñк заповнювач"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make Local"
-msgstr "Локальний"
+msgstr "Зробити локальним"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "Створити вузол"
+msgstr "Створити кореневий вузол:"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "2D Scene"
-msgstr "Сцена"
+msgstr "ПлоÑка Ñцена"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "3D Scene"
-msgstr "Сцена"
+msgstr "ПроÑторова Ñцена"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "User Interface"
-msgstr "УÑунути уÑпадкуваннÑ"
+msgstr "Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Custom Node"
-msgstr "Вирізати вузли"
+msgstr "Ðетиповий вузол"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
@@ -7807,6 +7943,10 @@ msgid "Clear Inheritance"
msgstr "УÑунути уÑпадкуваннÑ"
#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr "Відкрити документацію"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr "Вилучити вузли"
@@ -7815,17 +7955,16 @@ msgid "Add Child Node"
msgstr "Додати дочірній вузол"
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
-msgstr "Створити екземплÑÑ€ дочірньої Ñцени"
-
-#: editor/scene_tree_dock.cpp
msgid "Change Type"
msgstr "Змінити тип"
#: editor/scene_tree_dock.cpp
-#, fuzzy
+msgid "Extend Script"
+msgstr "Розширити Ñкрипт"
+
+#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
-msgstr "У цьому Ñ” ÑенÑ!"
+msgstr "Зробити кореневим Ð´Ð»Ñ Ñцени"
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
@@ -7876,7 +8015,6 @@ msgid "Clear Inheritance? (No Undo!)"
msgstr "Вилучити уÑпадковуваннÑ? (Без можливоÑті ÑкаÑувати!)"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Toggle Visible"
msgstr "Перемкнути видиміÑть"
@@ -7885,12 +8023,11 @@ msgid "Node configuration warning:"
msgstr "ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ Ñ‰Ð¾Ð´Ð¾ Ð½Ð°Ð»Ð°ÑˆÑ‚Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð²ÑƒÐ·Ð»Ð°:"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node has connection(s) and group(s).\n"
"Click to show signals dock."
msgstr ""
-"Вузол міÑтить з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ– групи\n"
+"Вузол міÑтить з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ– групи.\n"
"Клацніть, щоб переглÑнути панель Ñигналів."
#: editor/scene_tree_editor.cpp
@@ -7910,27 +8047,24 @@ msgstr ""
"Клацніть, щоб переглÑнути панель груп."
#: editor/scene_tree_editor.cpp editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script"
msgstr "Відкрити Ñкрипт"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node is locked.\n"
"Click to unlock it."
msgstr ""
"Вузол заблоковано.\n"
-"ÐатиÑніть, щоб розблокувати"
+"ÐатиÑніть, щоб розблокувати."
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Children are not selectable.\n"
"Click to make selectable."
msgstr ""
"Дочірні об'єкти не можна позначити.\n"
-"Клацніть, щоб зробити Ñ—Ñ… придатними до позначеннÑ"
+"Клацніть, щоб зробити Ñ—Ñ… придатними до позначеннÑ."
#: editor/scene_tree_editor.cpp
msgid "Toggle Visibility"
@@ -7941,6 +8075,8 @@ msgid ""
"AnimationPlayer is pinned.\n"
"Click to unpin."
msgstr ""
+"AnimationPlayer пришпилено.\n"
+"ÐатиÑніть, щоб відшпилити."
#: editor/scene_tree_editor.cpp
msgid "Invalid node name, the following characters are not allowed:"
@@ -7979,15 +8115,18 @@ msgid "N/A"
msgstr "Ð/З"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script/Choose Location"
-msgstr "Відкрити редактор Ñкриптів"
+msgstr "Відкрити Ñкрипт або вибрати міÑце"
#: editor/script_create_dialog.cpp
msgid "Path is empty"
msgstr "Порожній шлÑÑ…"
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr "Ðазва файла Ñ” порожньою"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr "ШлÑÑ… не Ñ” локальним"
@@ -8076,20 +8215,8 @@ msgid "Bytes:"
msgstr "Байтів:"
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr "ПопередженнÑ"
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr "Помилка:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr "Джерело:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
-msgstr "ФункціÑ:"
+msgid "Stack Trace"
+msgstr "ТраÑÑƒÐ²Ð°Ð½Ð½Ñ Ñтека"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8120,18 +8247,6 @@ msgid "Stack Frames"
msgstr "СтоÑувати кадри"
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr "Змінна"
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr "Помилки:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr "ТраÑÑƒÐ²Ð°Ð½Ð½Ñ Ñтека (Ñкщо заÑтоÑовне):"
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr "ЗаÑіб профілюваннÑ"
@@ -8220,9 +8335,8 @@ msgid "Change Camera Size"
msgstr "Змінити розмір камери"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Notifier AABB"
-msgstr "Змінити розміри заÑобу ÑповіщеннÑ"
+msgstr "Змінити AABB ÑповіщеннÑ"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Particles AABB"
@@ -8249,38 +8363,32 @@ msgid "Change Capsule Shape Height"
msgstr "Змінити виÑоту форми капÑули"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Radius"
-msgstr "Змінити Ñ€Ð°Ð´Ñ–ÑƒÑ Ñ„Ð¾Ñ€Ð¼Ð¸ капÑули"
+msgstr "Змінити Ñ€Ð°Ð´Ñ–ÑƒÑ Ñ„Ð¾Ñ€Ð¼Ð¸ циліндра"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Height"
-msgstr "Змінити виÑоту форми капÑули"
+msgstr "Змінити виÑоту форми циліндра"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Ray Shape Length"
msgstr "Змінити довжину форми променÑ"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Radius"
-msgstr "Змінити Ñ€Ð°Ð´Ñ–ÑƒÑ Ð¾ÑвітленнÑ"
+msgstr "Змінити Ñ€Ð°Ð´Ñ–ÑƒÑ Ñ†Ð¸Ð»Ñ–Ð½Ð´Ñ€Ð°"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Height"
-msgstr "Змінити виÑоту форми капÑули"
+msgstr "Змінити виÑоту циліндра"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Inner Radius"
-msgstr "Змінити Ñ€Ð°Ð´Ñ–ÑƒÑ Ñферичної форми"
+msgstr "Змінити внутрішній Ñ€Ð°Ð´Ñ–ÑƒÑ Ñ‚Ð¾Ñ€Ð°"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Outer Radius"
-msgstr "Змінити Ñ€Ð°Ð´Ñ–ÑƒÑ Ð¾ÑвітленнÑ"
+msgstr "Змінити зовнішній Ñ€Ð°Ð´Ñ–ÑƒÑ Ñ‚Ð¾Ñ€Ð°"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select the dynamic library for this entry"
@@ -8332,11 +8440,11 @@ msgstr "Бібліотеки: "
#: modules/gdnative/register_types.cpp
msgid "GDNative"
-msgstr "GD Native"
+msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
-msgstr "аргумент кроку дорівнює нулеві!"
+msgid "Step argument is zero!"
+msgstr "Ðргумент кроку дорівнює нулеві!"
#: modules/gdscript/gdscript_functions.cpp
msgid "Not a script with an instance"
@@ -8401,9 +8509,8 @@ msgid "GridMap Delete Selection"
msgstr "Ð’Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¾Ð³Ð¾ GridMap"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Fill Selection"
-msgstr "Ð’Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¾Ð³Ð¾ GridMap"
+msgstr "Вибір Ð·Ð°Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ GridMap"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Duplicate Selection"
@@ -8486,9 +8593,8 @@ msgid "Clear Selection"
msgstr "ОчиÑтити позначене"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Fill Selection"
-msgstr "УÑе позначене"
+msgstr "Заповнити позначене"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Settings"
@@ -8559,12 +8665,8 @@ msgid "End of inner exception stack trace"
msgstr "Кінець траÑÑƒÐ²Ð°Ð½Ð½Ñ Ñтека Ð´Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ виключеннÑ"
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr "Запекти!"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
-msgstr "Створити навігаційну Ñітку."
+msgid "Bake NavMesh"
+msgstr "Запекти NavMesh"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8791,14 +8893,12 @@ msgid "Connect Nodes"
msgstr "Приєднати вузли"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Data"
-msgstr "Приєднати вузли"
+msgstr "Приєднати дані вузла"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Sequence"
-msgstr "Приєднати вузли"
+msgstr "Приєднати поÑлідовніÑть вузлів"
#: modules/visual_script/visual_script_editor.cpp
msgid "Script already has function '%s'"
@@ -8845,6 +8945,10 @@ msgid "Base Type:"
msgstr "Базовий тип:"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "Члени:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "ДоÑтупні вузли:"
@@ -8881,9 +8985,8 @@ msgid "Paste Nodes"
msgstr "Ð’Ñтавити вузли"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
-msgstr "Члени"
+msgstr "Редагувати член"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Input type not iterable: "
@@ -8942,17 +9045,16 @@ msgstr ""
"out) або Ñ€Ñдок (error)."
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Search VisualScript"
-msgstr "Вилучити вузол VisualScript"
+msgstr "Шукати VisualScript"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
-msgstr "Отримати"
+msgid "Get %s"
+msgstr "Отримати %s"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
-msgstr ""
+msgid "Set %s"
+msgstr "Ð’Ñтановити %s"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -9003,14 +9105,13 @@ msgstr ""
"CanvasModulate. Працюватиме перший зі Ñтворених, решту буде проігноровано."
#: scene/2d/collision_object_2d.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
"define its shape."
msgstr ""
-"У цього вузла немає дочірніх форм, отже він не може взаємодіÑти із "
-"проÑтором.\n"
+"У цього вузла немає форми, отже він не може взаємодіÑти із іншими "
+"об'єктами.\n"
"Спробуйте додати дочірні вузли CollisionShape2D або CollisionPolygon2D Ð´Ð»Ñ "
"Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¹Ð¾Ð³Ð¾ форми."
@@ -9046,6 +9147,14 @@ msgstr ""
"Ð”Ð»Ñ Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ñ†ÐµÐ·Ð´Ð°Ñ‚Ð½Ð¾Ñті CollisionShape2D Ñлід надати форму. Будь "
"лаÑка, Ñтворіть реÑÑƒÑ€Ñ Ñ„Ð¾Ñ€Ð¼Ð¸ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ елемента!"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+"ÐÐ½Ñ–Ð¼Ð°Ñ†Ñ–Ñ CPUParticles2D потребує викориÑÑ‚Ð°Ð½Ð½Ñ CanvasItemMaterial із "
+"увімкненим параметром «ÐÐ½Ñ–Ð¼Ð°Ñ†Ñ–Ñ Ñ‡Ð°Ñток»."
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -9097,6 +9206,14 @@ msgstr ""
"Ðе визначено матеріалу Ð´Ð»Ñ Ð¾Ð±Ñ€Ð¾Ð±ÐºÐ¸ чаÑток, тому ніÑкої поведінки не "
"відтворюватиметьÑÑ."
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+"ÐÐ½Ñ–Ð¼Ð°Ñ†Ñ–Ñ Particles2D потребує викориÑÑ‚Ð°Ð½Ð½Ñ CanvasItemMaterial із увімкненим "
+"параметром «ÐÐ½Ñ–Ð¼Ð°Ñ†Ñ–Ñ Ñ‡Ð°Ñток»."
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr "PathFollow2D працюватиме лише Ñк дочірній елемент вузла Path2D."
@@ -9119,16 +9236,18 @@ msgstr ""
#: scene/2d/skeleton_2d.cpp
msgid "This Bone2D chain should end at a Skeleton2D node."
-msgstr ""
+msgstr "Цей ланцюжок Bone2D має завершуватиÑÑ Ð²ÑƒÐ·Ð»Ð¾Ð¼ Skeleton2D."
#: scene/2d/skeleton_2d.cpp
msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
-msgstr ""
+msgstr "Bone2D працює лише із Skeleton2D або іншим батьківÑьким вузлом Bone2D."
#: scene/2d/skeleton_2d.cpp
msgid ""
"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
msgstr ""
+"Цій кіÑтці бракує належної пози REST. Перейдіть до вузла Skeleton2D Ñ– "
+"вÑтановіть Ñ—Ñ—."
#: scene/2d/visibility_notifier_2d.cpp
msgid ""
@@ -9195,14 +9314,13 @@ msgid "Lighting Meshes: "
msgstr "ОÑÐ²Ñ–Ñ‚Ð»ÐµÐ½Ð½Ñ Ñітки: "
#: scene/3d/collision_object.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape or CollisionPolygon as a child to define "
"its shape."
msgstr ""
-"У цього вузла немає дочірніх форм, отже він не може взаємодіÑти із "
-"проÑтором.\n"
+"У цього вузла немає форми, отже він не може ÑтикатиÑÑ Ð°Ð±Ð¾ взаємодіÑти із "
+"іншими об'єктами.\n"
"Спробуйте додати дочірні вузли CollisionShape або CollisionPolygon Ð´Ð»Ñ "
"Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¹Ð¾Ð³Ð¾ форми."
@@ -9238,6 +9356,18 @@ msgstr ""
"Ð”Ð»Ñ Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ñ†ÐµÐ·Ð´Ð°Ñ‚Ð½Ð¾Ñті CollisionShape Ñлід надати форму. Будь "
"лаÑка, Ñтворіть реÑÑƒÑ€Ñ Ñ„Ð¾Ñ€Ð¼Ð¸ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ елемента!"
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr "Ðічого не видно, оÑкільки не призначено Ñітки."
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+"ÐÐ½Ñ–Ð¼Ð°Ñ†Ñ–Ñ CPUParticles потребує викориÑÑ‚Ð°Ð½Ð½Ñ SpatialMaterial із увімкненим "
+"параметром «ЧаÑтки дошки»."
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr "Побудова Ñітки"
@@ -9245,8 +9375,8 @@ msgstr "Побудова Ñітки"
#: scene/3d/navigation_mesh.cpp
msgid "A NavigationMesh resource must be set or created for this node to work."
msgstr ""
-"РеÑÑƒÑ€Ñ Ðавігаційна Ñітка повинен бути вÑтановлений або Ñтворений Ð´Ð»Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ "
-"цього вузла."
+"Ð”Ð»Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ цього вузла Ñлід вÑтановити або Ñтворити реÑÑƒÑ€Ñ Â«Ðавігаційна "
+"Ñітка»."
#: scene/3d/navigation_mesh.cpp
msgid ""
@@ -9262,6 +9392,29 @@ msgid ""
msgstr ""
"Ðічого не видно, оÑкільки Ñітки не було пов'Ñзано із проходами малюваннÑ."
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+"ÐÐ½Ñ–Ð¼Ð°Ñ†Ñ–Ñ Ñ‡Ð°Ñток потребує викориÑÑ‚Ð°Ð½Ð½Ñ SpatialMaterial із увімкненим "
+"параметром «ЧаÑтки дошки»."
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr "PathFollow працюватиме лише Ñк дочірній елемент вузла Path."
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr "OrientedPathFollow працюватиме лише Ñк дочірній елемент вузла Path."
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+"OrientedPathFollow потребує Ð²Ð¼Ð¸ÐºÐ°Ð½Ð½Ñ Â«Up Vector» у його батьківÑькому Path."
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9300,17 +9453,15 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid "This body will be ignored until you set a mesh"
-msgstr ""
+msgstr "Це тіло буде проігноровано, аж доки ви не вÑтановите Ñітку"
#: scene/3d/soft_body.cpp
-#, fuzzy
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
-"Зміни розмірів RigidBody (у режимах character або rigid) буде перевизначено "
-"фізичним рушієм під Ñ‡Ð°Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸.\n"
+"Зміни розмірів SoftBody буде перевизначено фізичним рушієм під Ñ‡Ð°Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸.\n"
"ЗаміÑть цієї зміни, вам варто змінити розміри дочірніх форм зіткненнÑ."
#: scene/3d/sprite_3d.cpp
@@ -9331,44 +9482,45 @@ msgstr ""
#: scene/animation/animation_blend_tree.cpp
msgid "On BlendTree node '%s', animation not found: '%s'"
-msgstr ""
+msgstr "У вузлі BlendTree «%s» не знайдено анімації: «%s»"
#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "ІнÑтрументи анімації"
+msgstr "Ðе знайдено анімації: «%s»"
#: scene/animation/animation_tree.cpp
msgid "In node '%s', invalid animation: '%s'."
-msgstr ""
+msgstr "У вузлі «%s», некоректна анімаціÑ: «%s»."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "ПОМИЛКÐ: неправильне ім'Ñ Ð°Ð½Ñ–Ð¼Ð°Ñ†Ñ–Ñ—!"
+msgstr "Ðекоректна анімаціÑ: «%s»."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "Від'єднати '%s' від '%s'"
+msgstr "Ðічого не з'єднано із входом «%s» вузла «%s»."
#: scene/animation/animation_tree.cpp
msgid "A root AnimationNode for the graph is not set."
-msgstr ""
+msgstr "Кореневий елемент AnimationNode Ð´Ð»Ñ Ð³Ñ€Ð°Ñ„Ñƒ не вÑтановлено."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Path to an AnimationPlayer node containing animations is not set."
-msgstr "Виберіть AnimationPlayer з дерева Ñцен Ð´Ð»Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð½Ñ–Ð¼Ð°Ñ†Ñ–Ñ—."
+msgstr "ШлÑÑ… до вузла AnimationPlayer, де міÑÑ‚ÑтьÑÑ Ð°Ð½Ñ–Ð¼Ð°Ñ†Ñ–Ñ—, не вÑтановлено."
#: scene/animation/animation_tree.cpp
msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
msgstr ""
+"ШлÑÑ…, вÑтановлений Ð´Ð»Ñ AnimationPlayer, не веде до вузла AnimationPlayer."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "AnimationPlayer root is not a valid node."
-msgstr "Дерево анімації недійÑне."
+msgstr "Кореневий елемент AnimationPlayer не є коректним вузлом."
+
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+"Цей вузол вважаєтьÑÑ Ð·Ð°Ñтарілим. СкориÑтайтеÑÑ Ð·Ð°Ð¼Ñ–Ñть нього AnimationTree."
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
@@ -9386,10 +9538,6 @@ msgstr "Увага!"
msgid "Please Confirm..."
msgstr "Будь лаÑка, підтвердьте..."
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr "Обрати цю теку"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9400,6 +9548,10 @@ msgstr ""
"ÑкуÑÑŒ із функцій popup*(). Втім, робити Ñ—Ñ… видимими Ð´Ð»Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ â€” звична "
"практика. Втім, Ñлід пам'Ñтати, що під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку Ñ—Ñ… буде приховано."
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr "Якщо exp_edit має Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ true, min_value має бути > 0."
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9452,31 +9604,222 @@ msgid "Invalid font size."
msgstr "Ðекоректний розмір шрифту."
#: scene/resources/visual_shader.cpp
-#, fuzzy
msgid "Input"
-msgstr "Додати вхід"
-
-#: scene/resources/visual_shader.cpp
-#, fuzzy
-msgid "None"
-msgstr "<Ðемає>"
+msgstr "Вхідні дані"
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for shader."
-msgstr "Ðекоректний розмір шрифту."
+msgstr "Ðекоректне джерело програми побудови тіней."
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
-msgstr ""
+msgstr "ÐŸÑ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ð¹Ð½Ð¾Ð³Ð¾."
#: servers/visual/shader_language.cpp
msgid "Assignment to uniform."
-msgstr ""
+msgstr "ÐŸÑ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¾Ð´Ð½Ð¾Ñ€Ñ–Ð´Ð½Ð¾Ð³Ð¾."
#: servers/visual/shader_language.cpp
msgid "Varyings can only be assigned in vertex function."
-msgstr ""
+msgstr "Змінні величини можна пов'Ñзувати лише із функцією вузлів."
+
+#~ msgid "Split point with itself."
+#~ msgstr "Розділити точку."
+
+#~ msgid "Split can't form an existing edge."
+#~ msgstr "Поділ не може Ñтворювати наÑвного ребра."
+
+#~ msgid "Split already exists."
+#~ msgstr "Поділ вже Ñ–Ñнує."
+
+#~ msgid "Add Split"
+#~ msgstr "Додати поділ"
+
+#~ msgid "Invalid Split: "
+#~ msgstr "Ðекоректний поділ: "
+
+#~ msgid "Remove Split"
+#~ msgstr "Вилучити поділ"
+
+#~ msgid "Poly"
+#~ msgstr "Полігон"
+
+#~ msgid "Splits"
+#~ msgstr "ДробленнÑ"
+
+#~ msgid "Connect two points to make a split."
+#~ msgstr "З'єднайте дві точки Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ñ€Ñ–Ð·Ñƒ."
+
+#~ msgid "Select a split to erase it."
+#~ msgstr "Виберіть поділ Ð´Ð»Ñ Ð¹Ð¾Ð³Ð¾ витираннÑ."
+
+#~ msgid "No name provided"
+#~ msgstr "Ім'Ñ Ð½Ðµ вказано"
+
+#~ msgid "Add Node.."
+#~ msgstr "Додати вузол…"
+
+#~ msgid "Create from scene?"
+#~ msgstr "Створити зі Ñцени?"
+
+#~ msgid "Create Poly"
+#~ msgstr "Створити полігон"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ полігону з нулÑ"
+
+#~ msgid "Zoom out"
+#~ msgstr "Зменшити"
+
+#~ msgid "Zoom in"
+#~ msgstr "Збільшити"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "Створити полігон3D"
+
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "Цей вузол не має реÑурÑу OccluderPolygon2D.\n"
+#~ "Створити і призначити?"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "ЛКМ: ПереміÑтити точку."
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "CTRL+ЛКМ: Розділити Ñегмент."
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "ПКМ: Стерти точку."
+
+#~ msgid "New TextFile"
+#~ msgstr "Ðовий текÑтовий файл"
+
+#~ msgid "Save Theme As"
+#~ msgstr "Зберегти тему Ñк"
+
+#~ msgid "<None>"
+#~ msgstr "<Ðемає>"
+
+#~ msgid ""
+#~ "Select sub-tile to use as icon, this will be also used on invalid "
+#~ "autotile bindings."
+#~ msgstr ""
+#~ "Виберіть підплитку Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ñк піктограми. Її також буде "
+#~ "викориÑтано Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¸Ñ… прив'Ñзок у режимі автоплитки."
+
+#~ msgid "Zoom:"
+#~ msgstr "МаÑштаб:"
+
+#~ msgid "Are you sure you want to remove all connections from the \""
+#~ msgstr "Ви Ñправді хочете вилучити уÑÑ– з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· Ñигналу \""
+
+#~ msgid "Class List:"
+#~ msgstr "СпиÑок клаÑів:"
+
+#~ msgid "Search Classes"
+#~ msgstr "Пошук клаÑів"
+
+#~ msgid "Public Methods"
+#~ msgstr "Публічні методи"
+
+#~ msgid "Public Methods:"
+#~ msgstr "Публічні методи:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "Тема елементів ГІК"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "Тема елементів ГІК:"
+
+#~ msgid "Property: "
+#~ msgstr "ВлаÑтивіÑть: "
+
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "Перемкнути Ñтан теки Ñк вибраної."
+
+#~ msgid "Show current scene file."
+#~ msgstr "Показати файл поточної Ñцени."
+
+#~ msgid "Enter tree-view."
+#~ msgstr "Увійти до ієрархічного ÑпиÑку."
+
+#~ msgid "Whole words"
+#~ msgstr "Цілі Ñлова"
+
+#~ msgid "Match case"
+#~ msgstr "Із ураховуваннÑм регіÑтру"
+
+#~ msgid "Ok"
+#~ msgstr "Гаразд"
+
+#~ msgid "Show In File System"
+#~ msgstr "Показати в файловій ÑиÑтемі"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "Пошук в ієрархії клаÑів."
+
+#~ msgid "Search in files"
+#~ msgstr "Шукати у файлах"
+
+#~ msgid ""
+#~ "Built-in scripts can only be edited when the scene they belong to is "
+#~ "loaded"
+#~ msgstr ""
+#~ "Вбудовані Ñкрипти можна змінити тільки тоді, коли завантажено Ñцену, до "
+#~ "Ñкої вони належать"
+
+#~ msgid "Convert To Uppercase"
+#~ msgstr "Конвертувати у ВЕРХÐІЙ РЕГІСТР"
+
+#~ msgid "Convert To Lowercase"
+#~ msgstr "Конвертувати в нижній регіÑтр"
+
+#~ msgid "Snap To Floor"
+#~ msgstr "Приліпити до підлоги"
+
+#~ msgid "Rotate 0 degrees"
+#~ msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð½Ð° 0 градуÑів"
+
+#~ msgid "Rotate 90 degrees"
+#~ msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð½Ð° 90 градуÑів"
+
+#~ msgid "Rotate 180 degrees"
+#~ msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð½Ð° 180 градуÑів"
+
+#~ msgid "Rotate 270 degrees"
+#~ msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð½Ð° 270 градуÑів"
+
+#~ msgid "Warning"
+#~ msgstr "ПопередженнÑ"
+
+#~ msgid "Error:"
+#~ msgstr "Помилка:"
+
+#~ msgid "Source:"
+#~ msgstr "Джерело:"
+
+#~ msgid "Function:"
+#~ msgstr "ФункціÑ:"
+
+#~ msgid "Variable"
+#~ msgstr "Змінна"
+
+#~ msgid "Errors:"
+#~ msgstr "Помилки:"
+
+#~ msgid "Stack Trace (if applicable):"
+#~ msgstr "ТраÑÑƒÐ²Ð°Ð½Ð½Ñ Ñтека (Ñкщо заÑтоÑовне):"
+
+#~ msgid "Bake!"
+#~ msgstr "Запекти!"
+
+#~ msgid "Bake the navigation mesh."
+#~ msgstr "Створити навігаційну Ñітку."
+
+#~ msgid "Get"
+#~ msgstr "Отримати"
#~ msgid "Change Scalar Constant"
#~ msgstr "Змінити чиÑлову Ñталу"
@@ -9676,9 +10019,6 @@ msgstr ""
#~ msgid "Run Script"
#~ msgstr "ЗапуÑтити Ñкрипт"
-#~ msgid "Save the currently edited resource."
-#~ msgstr "Зберегти поточний редагований реÑурÑ."
-
#~ msgid "Stop Profiling"
#~ msgstr "Зупинити профілюваннÑ"
@@ -9791,9 +10131,6 @@ msgstr ""
#~ msgid "Sequence"
#~ msgstr "ПоÑлідовніÑть"
-#~ msgid "Switch"
-#~ msgstr "Перемикач"
-
#~ msgid "Iterator"
#~ msgstr "Ітератор"
diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po
index 47be7ef1d1..81f83259b6 100644
--- a/editor/translations/ur_PK.po
+++ b/editor/translations/ur_PK.po
@@ -1,6 +1,6 @@
# Urdu (Pakistan) translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Muhammad Ali <ali@codeonion.com>, 2016.
@@ -8,15 +8,17 @@
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2016-07-01 05:14+0000\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:44+0100\n"
"Last-Translator: Muhammad Ali <ali@codeonion.com>\n"
"Language-Team: Urdu (Pakistan) <https://hosted.weblate.org/projects/godot-"
"engine/godot/ur_PK/>\n"
"Language: ur_PK\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.7-dev\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -25,7 +27,7 @@ msgstr ""
".استمال کیجۓ TYPE_* constants .Ú©Û’ لیے غلط Ûیں convert() دیے گئے ارگمنٹس."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr "یا تو ڈیکوڈ کرنے Ú©Û’ لئے بائیٹس Ú©Ù… Ûیں یا پھر ناقص ÙØ§Ø±Ù…یٹ Ú¾Û’."
@@ -254,7 +256,6 @@ msgstr ""
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -382,8 +383,7 @@ msgstr ""
msgid "Scale From Cursor"
msgstr ""
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr ""
@@ -397,11 +397,11 @@ msgid "Delete Selection"
msgstr ".تمام کا انتخاب"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+msgid "Go to Next Step"
msgstr ""
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+msgid "Go to Previous Step"
msgstr ""
#: editor/animation_track_editor.cpp
@@ -504,11 +504,11 @@ msgstr ""
msgid "Replaced %d occurrence(s)."
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr ""
@@ -524,15 +524,19 @@ msgstr ""
msgid "Selection Only"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr ""
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr ""
@@ -541,10 +545,10 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Zoom:"
+msgid "Font Size:"
msgstr ""
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr ""
@@ -575,6 +579,7 @@ msgstr ""
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -653,7 +658,7 @@ msgid "Edit Connection: "
msgstr ""
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -700,23 +705,20 @@ msgid "Recent:"
msgstr ""
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr ""
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr ""
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr ""
@@ -751,8 +753,7 @@ msgid "Resource"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr ""
@@ -773,9 +774,10 @@ msgid "Search Replacement Resource:"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -805,7 +807,7 @@ msgid "Error loading:"
msgstr ""
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+msgid "Load failed due to missing dependencies:"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -864,14 +866,6 @@ msgstr ""
msgid "Thanks from the Godot community!"
msgstr ""
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr ""
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr ""
@@ -961,7 +955,7 @@ msgid "Uncompressing Assets"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+msgid "Package installed successfully!"
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1045,8 +1039,7 @@ msgid "Bus options"
msgstr ""
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr ""
@@ -1208,7 +1201,7 @@ msgid "Add AutoLoad"
msgstr ""
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr ""
@@ -1216,8 +1209,8 @@ msgstr ""
msgid "Node Name:"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr ""
@@ -1287,11 +1280,15 @@ msgid "Template file not found:"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr ""
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
+msgid "Select This Folder"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1299,12 +1296,13 @@ msgid "Copy Path"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-msgid "Open In File Manager"
-msgstr ""
+#, fuzzy
+msgid "Open in File Manager"
+msgstr "سب سکریپشن بنائیں"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+msgid "Show in File Manager"
msgstr ""
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1340,7 +1338,8 @@ msgid "Open a File or Directory"
msgstr ""
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr ""
@@ -1400,8 +1399,7 @@ msgstr ""
msgid "Preview:"
msgstr ""
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr ""
@@ -1417,24 +1415,11 @@ msgstr ""
msgid "(Re)Importing Assets"
msgstr ""
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr ""
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr ""
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr ""
@@ -1451,27 +1436,28 @@ msgid "Brief Description:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Members"
+msgid "Properties"
msgstr ""
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
+#: editor/editor_help.cpp
+msgid "Properties:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
+msgid "Methods"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods:"
+msgid "Methods:"
msgstr ""
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr ""
+#, fuzzy
+msgid "Theme Properties"
+msgstr ".تمام کا انتخاب"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
+msgid "Theme Properties:"
msgstr ""
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
@@ -1500,7 +1486,12 @@ msgstr ""
#: editor/editor_help.cpp
#, fuzzy
-msgid "Description"
+msgid "Class Description"
+msgstr "سب سکریپشن بنائیں"
+
+#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
msgstr "سب سکریپشن بنائیں"
#: editor/editor_help.cpp
@@ -1515,12 +1506,13 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr ""
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "سب سکریپشن بنائیں"
#: editor/editor_help.cpp
#, fuzzy
-msgid "Property Description:"
+msgid "Property Descriptions:"
msgstr "سب سکریپشن بنائیں"
#: editor/editor_help.cpp
@@ -1530,12 +1522,14 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr ""
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "سب سکریپشن بنائیں"
#: editor/editor_help.cpp
-msgid "Method Description:"
-msgstr ""
+#, fuzzy
+msgid "Method Descriptions:"
+msgstr "سب سکریپشن بنائیں"
#: editor/editor_help.cpp
msgid ""
@@ -1543,11 +1537,52 @@ msgid ""
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-#: editor/editor_inspector.cpp
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
msgstr ""
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr ""
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1582,6 +1617,11 @@ msgstr ""
msgid "Error saving resource!"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr ""
@@ -1636,10 +1676,20 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr ""
@@ -1868,6 +1918,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1908,6 +1964,11 @@ msgstr ""
msgid "Default"
msgstr ""
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr ""
+
#: editor/editor_node.cpp
#, fuzzy
msgid "Play This Scene"
@@ -1990,7 +2051,7 @@ msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+msgid "Save All Scenes"
msgstr ""
#: editor/editor_node.cpp
@@ -2019,7 +2080,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -2043,7 +2104,7 @@ msgstr ""
msgid "Export"
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr ""
@@ -2056,6 +2117,7 @@ msgid "Quit to Project List"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr ""
@@ -2163,10 +2225,6 @@ msgstr ""
msgid "Help"
msgstr ""
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2260,21 +2318,21 @@ msgstr ""
msgid "Disable Update Spinner"
msgstr ""
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr ""
#: editor/editor_node.cpp
-msgid "Node"
+msgid "FileSystem"
msgstr ""
#: editor/editor_node.cpp
-msgid "FileSystem"
+msgid "Inspector"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Node"
msgstr ""
#: editor/editor_node.cpp
@@ -2412,7 +2470,7 @@ msgstr ""
msgid "Physics Frame %"
msgstr ""
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr ""
@@ -2436,7 +2494,7 @@ msgstr ""
msgid "Calls"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2448,20 +2506,43 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid "Invalid RID"
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
#, fuzzy
msgid "New Script"
msgstr "سب سکریپشن بنائیں"
@@ -2474,10 +2555,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2486,7 +2563,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr ""
@@ -2770,6 +2848,11 @@ msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr ""
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "Ù¾Ø³Ù†Ø¯ÛŒØ¯Û Ø§ÙˆÙ¾Ø± منتقل کریں"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
@@ -2805,8 +2888,8 @@ msgstr ""
msgid "Unable to update dependencies:"
msgstr ""
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2814,10 +2897,6 @@ msgid "Provided name contains invalid characters"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr ""
@@ -2842,28 +2921,21 @@ msgid "Duplicating folder:"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
+msgid "Open Scene(s)"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Move To..."
+msgid "Instance"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Open Scene(s)"
+msgid "Add to favorites"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Instance"
-msgstr ""
+#, fuzzy
+msgid "Remove from favorites"
+msgstr ".تمام کا انتخاب"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -2873,11 +2945,19 @@ msgstr ""
msgid "View Owners..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr ""
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr ""
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
msgstr "سب سکریپشن بنائیں"
@@ -2886,6 +2966,14 @@ msgstr "سب سکریپشن بنائیں"
msgid "New Resource..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr ""
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -2906,11 +2994,11 @@ msgid "Re-Scan Filesystem"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Toggle folder status as Favorite."
+msgid "Toggle split mode"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Show current scene file."
+msgid "Search files"
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2918,20 +3006,12 @@ msgid "Instance the selected scene(s) as child of the selected node."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Search files"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
msgstr ""
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr ""
@@ -2948,27 +3028,19 @@ msgid "Create Script"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Find in files"
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Find: "
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Whole words"
+msgid "Find in Files"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Match case"
+msgid "Find:"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Folder: "
+msgid "Folder:"
msgstr ""
#: editor/find_in_files.cpp
-msgid "Filter: "
+msgid "Filters:"
msgstr ""
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -2985,6 +3057,10 @@ msgid "Cancel"
msgstr ""
#: editor/find_in_files.cpp
+msgid "Find: "
+msgstr ""
+
+#: editor/find_in_files.cpp
msgid "Replace: "
msgstr ""
@@ -3005,7 +3081,7 @@ msgid "Group name already exists."
msgstr ""
#: editor/groups_editor.cpp
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr ""
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3141,17 +3217,12 @@ msgstr ""
msgid "Failed to load resource."
msgstr ""
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr ""
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
+msgid "Collapse All Properties"
msgstr ""
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
@@ -3196,6 +3267,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr ""
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr ""
@@ -3257,45 +3332,47 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
-msgstr ""
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
+msgstr "سب سکریپشن بنائیں"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
-msgstr ""
+#, fuzzy
+msgid "Edit Polygon"
+msgstr "سب سکریپشن بنائیں"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
-msgstr ""
+#, fuzzy
+msgid "Remove Polygon And Point"
+msgstr ".تمام کا انتخاب"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr ""
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr ".تمام کا انتخاب"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
#, fuzzy
-msgid "Delete points"
+msgid "Erase points."
msgstr ".تمام کا انتخاب"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3310,7 +3387,7 @@ msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Load.."
+msgid "Load..."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3339,15 +3416,9 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr ".تمام کا انتخاب"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr ".تمام کا انتخاب"
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3386,9 +3457,8 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3422,7 +3492,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add Node.."
+msgid "Add Node..."
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3694,7 +3764,7 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr ".تمام کا انتخاب"
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3761,10 +3831,6 @@ msgid "Amount:"
msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr ""
@@ -3962,7 +4028,7 @@ msgstr ""
msgid "Plugins"
msgstr ""
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr ""
@@ -4091,6 +4157,10 @@ msgid "Resize CanvasItem"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
msgstr ""
@@ -4111,15 +4181,15 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom out"
-msgstr ""
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom reset"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-msgid "Zoom in"
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -4152,6 +4222,11 @@ msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "ایکشن منتقل کریں"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4246,6 +4321,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr ".تمام کا انتخاب"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr ""
@@ -4296,6 +4376,10 @@ msgid "Show Viewport"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr ""
@@ -4364,7 +4448,16 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "سب سکریپشن بنائیں"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
msgstr ""
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
@@ -4469,35 +4562,9 @@ msgid "Item List Editor"
msgstr ""
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr ""
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr ""
@@ -4729,12 +4796,12 @@ msgid "Populate"
msgstr ""
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
+msgid "Generating Visibility Rect"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -4763,6 +4830,11 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr ""
@@ -4832,11 +4904,11 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Convert to CPUParticles"
+msgid "Generate AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -4861,6 +4933,10 @@ msgid "Add Point to Curve"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr ""
@@ -4888,6 +4964,10 @@ msgid "Click: Add Point"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr ""
@@ -4903,11 +4983,6 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr ""
@@ -4968,6 +5043,10 @@ msgstr ".تمام کا انتخاب"
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -4979,40 +5058,44 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync bones"
+msgid "Sync Bones"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create UV Map"
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create Polygon & UV"
+msgid "Create UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
+msgid "Create Polygon & UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "سب سکریپشن بنائیں"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split already exists."
+msgid "Remove Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Add Split"
+msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Invalid Split: "
-msgstr ""
+#, fuzzy
+msgid "Add Custom Polygon"
+msgstr "سب سکریپشن بنائیں"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
+msgid "Remove Custom Polygon"
msgstr ".تمام کا انتخاب"
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5020,39 +5103,46 @@ msgid "Transform UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
-msgstr ""
+#, fuzzy
+msgid "Transform Polygon"
+msgstr "سب سکریپشن بنائیں"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Polygon 2D UV Editor"
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UV"
+msgid "Open Polygon 2D UV editor."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Poly"
+msgid "Polygon 2D UV Editor"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Splits"
+msgid "UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Bones"
-msgstr ""
+#, fuzzy
+msgid "Points"
+msgstr ".تمام کا انتخاب"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
+msgid "Polygons"
msgstr "سب سکریپشن بنائیں"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Bones"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Move Points"
+msgstr ".تمام کا انتخاب"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
msgstr ""
@@ -5077,19 +5167,21 @@ msgid "Scale Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Select a split to erase it"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5113,6 +5205,11 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr ""
@@ -5170,22 +5267,22 @@ msgid "Paste Resource"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr ""
@@ -5215,6 +5312,10 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Error could not load file."
msgstr ""
@@ -5223,19 +5324,19 @@ msgid "Error saving file!"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
+msgid "Error while saving theme."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+msgid "Error Saving"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
+msgid "Error importing theme."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+msgid "Error Importing"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5256,6 +5357,14 @@ msgid "Import Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr ""
@@ -5297,7 +5406,7 @@ msgid "File"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile"
+msgid "Open..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5313,11 +5422,7 @@ msgid "Copy Script Path"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+msgid "History Previous"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5330,15 +5435,15 @@ msgid "Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Reload Theme"
+msgid "Import Theme..."
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme"
+msgid "Reload Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
+msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5388,7 +5493,7 @@ msgid "Keep Debugger Open"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5396,10 +5501,6 @@ msgid "Open Godot online documentation"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -5434,17 +5535,9 @@ msgid "Debugger"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search results"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search in files"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
+#, fuzzy
+msgid "Search Results"
+msgstr "سب سکریپشن بنائیں"
#: editor/plugins/script_text_editor.cpp
msgid "Line"
@@ -5455,6 +5548,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr ".تمام کا انتخاب"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr ""
@@ -5486,10 +5588,6 @@ msgstr ""
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5541,11 +5639,11 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5562,19 +5660,11 @@ msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
+msgid "Go to Next Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
+msgid "Go to Previous Breakpoint"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5582,15 +5672,16 @@ msgid "Find Previous"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
-msgstr ""
+#, fuzzy
+msgid "Go to Function..."
+msgstr ".تمام کا انتخاب"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
+msgid "Go to Line..."
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5683,6 +5774,14 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -5847,6 +5946,10 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -5949,10 +6052,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap To Floor"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6069,6 +6168,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
msgstr ""
@@ -6185,11 +6288,16 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6356,6 +6464,11 @@ msgid "Fix Invalid Tiles"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr ".تمام کا انتخاب"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6401,32 +6514,36 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr ".تمام کا انتخاب"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
+msgid "Rotate left"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate right"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip vertically"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Clear transform"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr ".تمام کا انتخاب"
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6438,25 +6555,46 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Paste bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr ".تمام کا انتخاب"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "سب سکریپشن بنائیں"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr ".تمام کا انتخاب"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6464,7 +6602,12 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr ".تمام کا انتخاب"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6474,15 +6617,25 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr ".تمام کا انتخاب"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr ".تمام کا انتخاب"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr ""
@@ -6500,11 +6653,95 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "سب سکریپشن بنائیں"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "سب سکریپشن بنائیں"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "سب سکریپشن بنائیں"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "سب سکریپشن بنائیں"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr ".تمام کا انتخاب"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr ".تمام کا انتخاب"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr ".تمام کا انتخاب"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr ".تمام کا انتخاب"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "سب سکریپشن بنائیں"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "سب سکریپشن بنائیں"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "This property can't be changed."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
+msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6540,6 +6777,14 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6548,6 +6793,10 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+msgid "Export Path"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6602,10 +6851,47 @@ msgid "Feature List:"
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "سب سکریپشن بنائیں"
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr ""
#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -6735,7 +7021,7 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
-msgid "Can't open project"
+msgid "Can't open project at '%s'."
msgstr ""
#: editor/project_manager.cpp
@@ -6744,6 +7030,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7059,10 +7363,6 @@ msgstr ""
msgid "General"
msgstr ""
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7196,10 +7496,6 @@ msgstr ""
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr ""
@@ -7283,7 +7579,7 @@ msgid "Step"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7292,7 +7588,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7332,7 +7628,7 @@ msgstr ""
msgid "Reset"
msgstr ""
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7391,6 +7687,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
#, fuzzy
msgid "Clear Script"
msgstr "سب سکریپشن بنائیں"
@@ -7428,6 +7728,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7500,15 +7806,15 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Delete Node(s)"
+msgid "Open documentation"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Add Child Node"
+msgid "Delete Node(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -7516,6 +7822,11 @@ msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Extend Script"
+msgstr "سب سکریپشن بنائیں"
+
+#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
msgstr ""
@@ -7664,6 +7975,10 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -7757,19 +8072,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -7801,18 +8104,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -8012,7 +8303,8 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+#, fuzzy
+msgid "Step argument is zero!"
msgstr "سٹیپ Ú©Û’ ارگمنٹس Ø³ÙØ± Ûیں!"
#: modules/gdscript/gdscript_functions.cpp
@@ -8237,11 +8529,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -8515,6 +8803,10 @@ msgid "Base Type:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr ""
@@ -8614,11 +8906,11 @@ msgid "Search VisualScript"
msgstr "سب سکریپشن بنائیں"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8697,6 +8989,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -8735,6 +9033,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -8852,6 +9156,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -8871,6 +9185,26 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -8903,7 +9237,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -8956,6 +9290,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr ""
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr ""
@@ -8972,10 +9310,6 @@ msgstr ""
msgid "Please Confirm..."
msgstr ""
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr ""
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -8983,6 +9317,10 @@ msgid ""
"hide upon running."
msgstr ""
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9028,10 +9366,6 @@ msgstr ""
msgid "Input"
msgstr ""
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
msgid "Invalid source for shader."
msgstr ""
@@ -9049,6 +9383,10 @@ msgid "Varyings can only be assigned in vertex function."
msgstr ""
#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr ".تمام کا انتخاب"
+
+#, fuzzy
#~ msgid "Set pivot at mouse position"
#~ msgstr ".تمام کا انتخاب"
diff --git a/editor/translations/vi.po b/editor/translations/vi.po
index 18d0de7612..8cc9e18c86 100644
--- a/editor/translations/vi.po
+++ b/editor/translations/vi.po
@@ -1,6 +1,6 @@
# Vietnamese translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# 01lifeleft <01lifeleft@gmail.com>, 2018.
# Dlean Jeans <dleanjeans@gmail.com>, 2018.
@@ -11,15 +11,17 @@
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-07-22 06:42+0000\n"
-"Last-Translator: 38569459 <xxx38569459@gmail.com>\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:44+0100\n"
+"Last-Translator: 01lifeleft <01lifeleft@gmail.com>\n"
"Language-Team: Vietnamese <https://hosted.weblate.org/projects/godot-engine/"
"godot/vi/>\n"
"Language: vi\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 3.1-dev\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -27,7 +29,7 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr ""
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
@@ -85,7 +87,7 @@ msgstr "Nhân đôi lá»±a chá»n"
#: editor/animation_bezier_editor.cpp
msgid "Delete Selected Key(s)"
-msgstr ""
+msgstr "Xoá Key(s) được chá»n"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -212,16 +214,17 @@ msgstr ""
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "Gần nhất"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
msgid "Linear"
-msgstr "Tuyến"
+msgstr "Tịnh tuyến"
#: editor/animation_track_editor.cpp
+#, fuzzy
msgid "Cubic"
-msgstr ""
+msgstr "Bậc ba"
#: editor/animation_track_editor.cpp
msgid "Clamp Loop Interp"
@@ -234,7 +237,7 @@ msgstr ""
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key"
-msgstr ""
+msgstr "Chèn Key"
#: editor/animation_track_editor.cpp
#, fuzzy
@@ -262,7 +265,6 @@ msgstr "Tạo %d track mới và chèn key?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -394,8 +396,7 @@ msgstr "Chá»n Scale"
msgid "Scale From Cursor"
msgstr "Scale từ trỠchuột"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "Nhân đôi lá»±a chá»n"
@@ -409,11 +410,13 @@ msgid "Delete Selection"
msgstr "Nhân đôi lá»±a chá»n"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+#, fuzzy
+msgid "Go to Next Step"
msgstr "Äến Step tiếp theo"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+#, fuzzy
+msgid "Go to Previous Step"
msgstr "Äến Step trước đó"
#: editor/animation_track_editor.cpp
@@ -426,7 +429,7 @@ msgstr "Dá»n dẹp Animation"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "Chá»n node để được làm diá»…n hoạt:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
@@ -517,12 +520,12 @@ msgstr "Không tìm thấy"
msgid "Replaced %d occurrence(s)."
msgstr ""
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
#, fuzzy
msgid "Match Case"
msgstr "Trùng khớp"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "Cả từ"
@@ -538,15 +541,19 @@ msgstr "Thay thế tất cả"
msgid "Selection Only"
msgstr "Chỉ lá»±a chá»n"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "Phóng to"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "Thu nhá»"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "Äặt lại phóng"
@@ -555,11 +562,10 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "Phóng to"
+msgid "Font Size:"
+msgstr ""
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "Dòng:"
@@ -593,6 +599,7 @@ msgstr "Thêm"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -676,8 +683,9 @@ msgid "Edit Connection: "
msgstr "Sá»­a Curve đã chá»n"
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
-msgstr ""
+#, fuzzy
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr "Bạn có chắc muốn xóa bỠtất cả kết nối từ tín hiệu này?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -685,7 +693,7 @@ msgstr "Tín hiệu"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr ""
+msgstr "Bạn có chắc muốn xóa bỠtất cả kết nối từ tín hiệu này?"
#: editor/connections_dialog.cpp
#, fuzzy
@@ -694,11 +702,11 @@ msgstr "Hủy kết nối"
#: editor/connections_dialog.cpp
msgid "Edit..."
-msgstr ""
+msgstr "Chỉnh sửa..."
#: editor/connections_dialog.cpp
msgid "Go To Method"
-msgstr ""
+msgstr "Äến Method"
#: editor/create_dialog.cpp
msgid "Change %s Type"
@@ -723,23 +731,20 @@ msgid "Recent:"
msgstr "Gần đây:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "Tìm kiếm:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "Phù hợp:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "Mô tả:"
@@ -775,8 +780,7 @@ msgid "Resource"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr ""
@@ -797,9 +801,10 @@ msgid "Search Replacement Resource:"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -829,7 +834,7 @@ msgid "Error loading:"
msgstr ""
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+msgid "Load failed due to missing dependencies:"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -888,14 +893,6 @@ msgstr ""
msgid "Thanks from the Godot community!"
msgstr ""
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr ""
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr ""
@@ -910,51 +907,51 @@ msgstr ""
#: editor/editor_about.cpp
msgid "Project Manager "
-msgstr ""
+msgstr "Quản lí dự án "
#: editor/editor_about.cpp
msgid "Developers"
-msgstr ""
+msgstr "Nhà phát triển"
#: editor/editor_about.cpp
msgid "Authors"
-msgstr ""
+msgstr "Tác giả"
#: editor/editor_about.cpp
msgid "Platinum Sponsors"
-msgstr ""
+msgstr "Nhà tài trợ Bạch Kim"
#: editor/editor_about.cpp
msgid "Gold Sponsors"
-msgstr ""
+msgstr "Nhà tài trợ Vàng"
#: editor/editor_about.cpp
msgid "Mini Sponsors"
-msgstr ""
+msgstr "Nhà tài trợ Nhá»"
#: editor/editor_about.cpp
msgid "Gold Donors"
-msgstr ""
+msgstr "Ngưá»i á»§ng há»™ Vàng"
#: editor/editor_about.cpp
msgid "Silver Donors"
-msgstr ""
+msgstr "Ngưá»i á»§ng há»™ Bạc"
#: editor/editor_about.cpp
msgid "Bronze Donors"
-msgstr ""
+msgstr "Ngưá»i á»§ng há»™ Äồng"
#: editor/editor_about.cpp
msgid "Donors"
-msgstr ""
+msgstr "Ngưá»i á»§ng há»™"
#: editor/editor_about.cpp
msgid "License"
-msgstr ""
+msgstr "Cấp phép"
#: editor/editor_about.cpp
msgid "Thirdparty License"
-msgstr ""
+msgstr "Cấp phép nhóm thứ ba"
#: editor/editor_about.cpp
msgid ""
@@ -985,7 +982,7 @@ msgid "Uncompressing Assets"
msgstr ""
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+msgid "Package installed successfully!"
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1067,8 +1064,7 @@ msgid "Bus options"
msgstr ""
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr ""
@@ -1204,19 +1200,19 @@ msgstr ""
#: editor/editor_autoload_settings.cpp
msgid "Enable"
-msgstr ""
+msgstr "Mở"
#: editor/editor_autoload_settings.cpp
msgid "Rearrange Autoloads"
-msgstr ""
+msgstr "Sắp xếp lại Autoloads"
#: editor/editor_autoload_settings.cpp
msgid "Invalid Path."
-msgstr ""
+msgstr "ÄÆ°á»ng dẫn sai."
#: editor/editor_autoload_settings.cpp
msgid "File does not exist."
-msgstr ""
+msgstr "File không tồn tại."
#: editor/editor_autoload_settings.cpp
msgid "Not in resource path."
@@ -1224,29 +1220,29 @@ msgstr ""
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
-msgstr ""
+msgstr "Thêm AutoLoad"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
-msgstr ""
+msgstr "ÄÆ°á»ng dẫn:"
#: editor/editor_autoload_settings.cpp
msgid "Node Name:"
-msgstr ""
+msgstr "Tên Node:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
-msgstr ""
+msgstr "Tên"
#: editor/editor_autoload_settings.cpp
msgid "Singleton"
-msgstr ""
+msgstr "Singleton"
#: editor/editor_data.cpp
msgid "Updating Scene"
-msgstr ""
+msgstr "Cập nhật Scene"
#: editor/editor_data.cpp
msgid "Storing local changes..."
@@ -1254,15 +1250,15 @@ msgstr ""
#: editor/editor_data.cpp
msgid "Updating scene..."
-msgstr ""
+msgstr "Äang cập nhật scene..."
#: editor/editor_data.cpp editor/editor_properties.cpp
msgid "[empty]"
-msgstr ""
+msgstr "[rá»—ng]"
#: editor/editor_data.cpp
msgid "[unsaved]"
-msgstr ""
+msgstr "[chưa save]"
#: editor/editor_dir_dialog.cpp
msgid "Please select a base directory first"
@@ -1275,23 +1271,23 @@ msgstr ""
#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
msgid "Create Folder"
-msgstr ""
+msgstr "Tạo Folder"
#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
#: editor/editor_plugin_settings.cpp editor/filesystem_dock.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp
#: scene/gui/file_dialog.cpp
msgid "Name:"
-msgstr ""
+msgstr "Tên:"
#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp
#: editor/filesystem_dock.cpp scene/gui/file_dialog.cpp
msgid "Could not create folder."
-msgstr ""
+msgstr "Không thể tạo folder."
#: editor/editor_dir_dialog.cpp
msgid "Choose"
-msgstr ""
+msgstr "Chá»n"
#: editor/editor_export.cpp
msgid "Storing File:"
@@ -1306,33 +1302,40 @@ msgid "Template file not found:"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "Chá»n Folder hiện tại"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
-msgstr ""
+msgstr "File đã tồn tại, Viết đè?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr ""
+#, fuzzy
+msgid "Select This Folder"
+msgstr "Chá»n folder này"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
-msgstr ""
+msgstr "Copy ÄÆ°á»ng dẫn"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-msgid "Open In File Manager"
-msgstr ""
+#, fuzzy
+msgid "Open in File Manager"
+msgstr "Mở trong Trình quản lí file"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
-msgstr ""
+#, fuzzy
+msgid "Show in File Manager"
+msgstr "Hiển thị trong Trình quản lí file"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
-msgstr ""
+msgstr "Folder Má»›i..."
#: editor/editor_file_dialog.cpp
msgid "Refresh"
-msgstr ""
+msgstr "Làm mới"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "All Recognized"
@@ -1340,91 +1343,95 @@ msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "All Files (*)"
-msgstr ""
+msgstr "Tất cả Files (*)"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a File"
-msgstr ""
+msgstr "Mở một File"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open File(s)"
-msgstr ""
+msgstr "Mở File(s)"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+#, fuzzy
msgid "Open a Directory"
-msgstr ""
+msgstr "Mở má»™t Äịa chỉ"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+#, fuzzy
msgid "Open a File or Directory"
-msgstr ""
+msgstr "Mở má»™t File hoặc Äịa chỉ"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
-msgstr ""
+msgstr "Lưu"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Save a File"
-msgstr ""
+msgstr "Lưu thành File"
#: editor/editor_file_dialog.cpp
msgid "Go Back"
-msgstr ""
+msgstr "Trở lại"
#: editor/editor_file_dialog.cpp
msgid "Go Forward"
-msgstr ""
+msgstr "Tiến tới"
#: editor/editor_file_dialog.cpp
msgid "Go Up"
-msgstr ""
+msgstr "Äi Lên"
#: editor/editor_file_dialog.cpp
msgid "Toggle Hidden Files"
-msgstr ""
+msgstr "Bật tắt File ẩn"
#: editor/editor_file_dialog.cpp
msgid "Toggle Favorite"
-msgstr ""
+msgstr "Bật tắt Ưa thích"
#: editor/editor_file_dialog.cpp
msgid "Toggle Mode"
-msgstr ""
+msgstr "Bật tắt Chức năng"
#: editor/editor_file_dialog.cpp
msgid "Focus Path"
-msgstr ""
+msgstr "Tập trung ÄÆ°á»ng dẫn"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Up"
-msgstr ""
+msgstr "Di chuyển Ưa thích lên"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Down"
-msgstr ""
+msgstr "Di chuyển Ưa thích xuống"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+#, fuzzy
msgid "Go to parent folder"
-msgstr ""
+msgstr "Äến folder parent"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Directories & Files:"
-msgstr ""
+msgstr "Những địa chỉ & File:"
#: editor/editor_file_dialog.cpp editor/plugins/sprite_editor_plugin.cpp
#: editor/plugins/style_box_editor_plugin.cpp
msgid "Preview:"
-msgstr ""
+msgstr "Xem thá»­:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
-msgstr ""
+msgstr "File"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+#, fuzzy
msgid "Must use a valid extension."
-msgstr ""
+msgstr "Phải sử dụng extension có hiệu lực"
#: editor/editor_file_system.cpp
msgid "ScanSources"
@@ -1434,61 +1441,49 @@ msgstr ""
msgid "(Re)Importing Assets"
msgstr ""
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr ""
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
-msgstr ""
+msgstr "Trên đầu"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
-msgstr ""
+msgstr "Class:"
#: editor/editor_help.cpp editor/scene_tree_editor.cpp
msgid "Inherits:"
-msgstr ""
+msgstr "Thừa kế:"
#: editor/editor_help.cpp
msgid "Inherited by:"
-msgstr ""
+msgstr "ÄÆ°á»£c thừa kế bởi:"
#: editor/editor_help.cpp
msgid "Brief Description:"
-msgstr ""
+msgstr "Mô tả ngắn gá»n:"
#: editor/editor_help.cpp
-msgid "Members"
+msgid "Properties"
msgstr ""
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
+#: editor/editor_help.cpp
+msgid "Properties:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
+msgid "Methods"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr ""
+#, fuzzy
+msgid "Methods:"
+msgstr "Äến Method"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
+msgid "Theme Properties"
msgstr ""
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
+msgid "Theme Properties:"
msgstr ""
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
@@ -1516,8 +1511,14 @@ msgid "Constants:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Description"
-msgstr ""
+#, fuzzy
+msgid "Class Description"
+msgstr "Mô tả:"
+
+#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
+msgstr "Mô tả:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1531,12 +1532,14 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr ""
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "Mô tả ngắn gá»n:"
#: editor/editor_help.cpp
-msgid "Property Description:"
-msgstr ""
+#, fuzzy
+msgid "Property Descriptions:"
+msgstr "Mô tả ngắn gá»n:"
#: editor/editor_help.cpp
msgid ""
@@ -1545,12 +1548,14 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr ""
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "Mô tả:"
#: editor/editor_help.cpp
-msgid "Method Description:"
-msgstr ""
+#, fuzzy
+msgid "Method Descriptions:"
+msgstr "Mô tả:"
#: editor/editor_help.cpp
msgid ""
@@ -1558,11 +1563,58 @@ msgid ""
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-#: editor/editor_inspector.cpp
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "Tìm sự giúp đỡ"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Display All"
+msgstr "Thay thế tất cả"
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Methods Only"
+msgstr "Chỉ lá»±a chá»n"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "Tín hiệu"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Constants Only"
+msgstr "Cố định"
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Member Type"
+msgstr "Những Thành viên"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Class"
+msgstr "Class:"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
msgstr ""
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1596,6 +1648,11 @@ msgstr ""
msgid "Error saving resource!"
msgstr ""
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr ""
@@ -1650,10 +1707,20 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr ""
@@ -1755,27 +1822,27 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Open Scene"
-msgstr ""
+msgstr "Mở Scene"
#: editor/editor_node.cpp
msgid "Open Base Scene"
-msgstr ""
+msgstr "Mở Scene Mẫu"
#: editor/editor_node.cpp
msgid "Quick Open Scene..."
-msgstr ""
+msgstr "Mở Scene nhanh..."
#: editor/editor_node.cpp
msgid "Quick Open Script..."
-msgstr ""
+msgstr "Mở Script nhanh..."
#: editor/editor_node.cpp
msgid "Save & Close"
-msgstr ""
+msgstr "Lưu & Äóng"
#: editor/editor_node.cpp
msgid "Save changes to '%s' before closing?"
-msgstr ""
+msgstr "Lưu thay đổi vào '%s' trước khi đóng?"
#: editor/editor_node.cpp
msgid "Save Scene As..."
@@ -1783,11 +1850,11 @@ msgstr "Lưu Scene với tên..."
#: editor/editor_node.cpp
msgid "No"
-msgstr ""
+msgstr "Không"
#: editor/editor_node.cpp
msgid "Yes"
-msgstr ""
+msgstr "Có"
#: editor/editor_node.cpp
msgid "This scene has never been saved. Save before running?"
@@ -1795,59 +1862,61 @@ msgstr "Scene này chưa được lưu. Lưu trước khi chạy?"
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "This operation can't be done without a scene."
-msgstr ""
+msgstr "Thao tác này phải có scene mới làm được."
#: editor/editor_node.cpp
msgid "Export Mesh Library"
-msgstr ""
+msgstr "Xuất Mesh Library"
#: editor/editor_node.cpp
msgid "This operation can't be done without a root node."
-msgstr ""
+msgstr "Thao tác này phải có root node mới làm được."
#: editor/editor_node.cpp
msgid "Export Tile Set"
-msgstr ""
+msgstr "Xuất Tile Set"
#: editor/editor_node.cpp
msgid "This operation can't be done without a selected node."
-msgstr ""
+msgstr "Thao tác này phải có node được chá»n má»›i làm được."
#: editor/editor_node.cpp
msgid "Current scene not saved. Open anyway?"
-msgstr ""
+msgstr "Scene hiện tại chưa save. Kệ mở luôn?"
#: editor/editor_node.cpp
msgid "Can't reload a scene that was never saved."
-msgstr ""
+msgstr "Không thể reload má»™t scene mà chưa save bao giá»."
#: editor/editor_node.cpp
+#, fuzzy
msgid "Revert"
-msgstr ""
+msgstr "Trở lại"
#: editor/editor_node.cpp
+#, fuzzy
msgid "This action cannot be undone. Revert anyway?"
-msgstr ""
+msgstr "Hành động này không thể hoàn tác. Kệ trở lại luôn?"
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
-msgstr ""
+msgstr "Chạy Scene nhanh..."
#: editor/editor_node.cpp
msgid "Quit"
-msgstr ""
+msgstr "Thoát"
#: editor/editor_node.cpp
msgid "Exit the editor?"
-msgstr ""
+msgstr "Thoát editor?"
#: editor/editor_node.cpp
msgid "Open Project Manager?"
-msgstr ""
+msgstr "Mở Project Manager?"
#: editor/editor_node.cpp
msgid "Save & Quit"
-msgstr ""
+msgstr "Lưu & Thoát"
#: editor/editor_node.cpp
msgid "Save changes to the following scene(s) before quitting?"
@@ -1862,10 +1931,12 @@ msgid ""
"This option is deprecated. Situations where refresh must be forced are now "
"considered a bug. Please report."
msgstr ""
+"Tùy chỉnh này đã quá date. Những tùy huống mà phải bị bắt phải refresh bây "
+"giỠđược xem là lỗi. Xin hãy báo lại."
#: editor/editor_node.cpp
msgid "Pick a Main Scene"
-msgstr ""
+msgstr "Chá»n má»™t Scene chính"
#: editor/editor_node.cpp
msgid "Unable to enable addon plugin at: '%s' parsing of config failed."
@@ -1881,6 +1952,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1923,6 +2000,12 @@ msgstr ""
msgid "Default"
msgstr ""
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+#, fuzzy
+msgid "Show in FileSystem"
+msgstr "Quét lại hệ thống tập tin"
+
#: editor/editor_node.cpp
msgid "Play This Scene"
msgstr ""
@@ -2005,8 +2088,9 @@ msgid "Save Scene"
msgstr ""
#: editor/editor_node.cpp
-msgid "Save all Scenes"
-msgstr ""
+#, fuzzy
+msgid "Save All Scenes"
+msgstr "Lưu Scene với tên..."
#: editor/editor_node.cpp
msgid "Close Scene"
@@ -2034,7 +2118,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -2058,7 +2142,7 @@ msgstr ""
msgid "Export"
msgstr ""
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr ""
@@ -2072,6 +2156,7 @@ msgid "Quit to Project List"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr ""
@@ -2179,10 +2264,6 @@ msgstr ""
msgid "Help"
msgstr ""
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2278,21 +2359,21 @@ msgstr ""
msgid "Disable Update Spinner"
msgstr ""
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "Nhập từ bên ngoài"
#: editor/editor_node.cpp
-msgid "Node"
+msgid "FileSystem"
msgstr ""
#: editor/editor_node.cpp
-msgid "FileSystem"
+msgid "Inspector"
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid "Node"
msgstr ""
#: editor/editor_node.cpp
@@ -2430,7 +2511,7 @@ msgstr ""
msgid "Physics Frame %"
msgstr ""
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr ""
@@ -2454,7 +2535,7 @@ msgstr ""
msgid "Calls"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2466,20 +2547,44 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "ÄÆ°á»ng dẫn sai."
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr ""
@@ -2491,10 +2596,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2503,7 +2604,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr ""
@@ -2596,7 +2698,7 @@ msgstr "Nhập từ Node:"
#: editor/export_template_manager.cpp
msgid "Re-Download"
-msgstr ""
+msgstr "Tải lại"
#: editor/export_template_manager.cpp
msgid "Uninstall"
@@ -2604,20 +2706,20 @@ msgstr ""
#: editor/export_template_manager.cpp
msgid "(Installed)"
-msgstr ""
+msgstr "(Äã cài đặt)"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Download"
-msgstr ""
+msgstr "Tải"
#: editor/export_template_manager.cpp
msgid "(Missing)"
-msgstr ""
+msgstr "(Thiếu)"
#: editor/export_template_manager.cpp
msgid "(Current)"
-msgstr ""
+msgstr "(Hiện tại)"
#: editor/export_template_manager.cpp
msgid "Retrieving mirrors, please wait..."
@@ -2637,7 +2739,7 @@ msgstr ""
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
-msgstr ""
+msgstr "Không thấy version.txt trong templates."
#: editor/export_template_manager.cpp
msgid "Error creating path for templates:"
@@ -2665,17 +2767,17 @@ msgstr ""
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Can't connect."
-msgstr ""
+msgstr "Không thể kết nối."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "No response."
-msgstr ""
+msgstr "Không phản hồi."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request Failed."
-msgstr ""
+msgstr "Yêu cầu thất bại."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -2685,11 +2787,11 @@ msgstr ""
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Failed:"
-msgstr ""
+msgstr "Thất bại."
#: editor/export_template_manager.cpp
msgid "Download Complete."
-msgstr ""
+msgstr "Tải xong."
#: editor/export_template_manager.cpp
msgid ""
@@ -2707,7 +2809,7 @@ msgstr ""
#: editor/export_template_manager.cpp
msgid "Disconnected"
-msgstr ""
+msgstr "Äứt kết nối"
#: editor/export_template_manager.cpp
msgid "Resolving"
@@ -2720,7 +2822,7 @@ msgstr ""
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Connecting..."
-msgstr ""
+msgstr "Äang kết nối..."
#: editor/export_template_manager.cpp
msgid "Can't Connect"
@@ -2733,39 +2835,39 @@ msgstr ""
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Requesting..."
-msgstr ""
+msgstr "Äang yêu cầu..."
#: editor/export_template_manager.cpp
msgid "Downloading"
-msgstr ""
+msgstr "Äang tải"
#: editor/export_template_manager.cpp
msgid "Connection Error"
-msgstr ""
+msgstr "Kết nối bị lỗi"
#: editor/export_template_manager.cpp
msgid "SSL Handshake Error"
-msgstr ""
+msgstr "Lá»—i SSL Handshake"
#: editor/export_template_manager.cpp
msgid "Current Version:"
-msgstr ""
+msgstr "Phiên bản hiện tại:"
#: editor/export_template_manager.cpp
msgid "Installed Versions:"
-msgstr ""
+msgstr "Phiên bản đã cài:"
#: editor/export_template_manager.cpp
msgid "Install From File"
-msgstr ""
+msgstr "Cài đặt từ File"
#: editor/export_template_manager.cpp
msgid "Remove Template"
-msgstr ""
+msgstr "Xóa Template"
#: editor/export_template_manager.cpp
msgid "Select template file"
-msgstr ""
+msgstr "Chá»n file template"
#: editor/export_template_manager.cpp
msgid "Export Template Manager"
@@ -2773,7 +2875,7 @@ msgstr ""
#: editor/export_template_manager.cpp
msgid "Download Templates"
-msgstr ""
+msgstr "Tải Templates"
#: editor/export_template_manager.cpp
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
@@ -2784,6 +2886,11 @@ msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr ""
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "Ưa thích:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
@@ -2819,8 +2926,8 @@ msgstr ""
msgid "Unable to update dependencies:"
msgstr ""
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2828,10 +2935,6 @@ msgid "Provided name contains invalid characters"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "Tên có kí tự không hợp lệ."
@@ -2856,22 +2959,6 @@ msgid "Duplicating folder:"
msgstr "Tạo bản sao folder:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "Mở rộng tất cả"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "Thu gá»n tất cả"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "Äổi tên..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "Di chuyển đến..."
-
-#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
msgstr "Mở Scene"
@@ -2880,6 +2967,16 @@ msgid "Instance"
msgstr "Thêm vào scene"
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Add to favorites"
+msgstr "Ưa thích:"
+
+#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Remove from favorites"
+msgstr "Xóa khá»i Nhóm"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "Chỉnh sửa các File phụ thuộc..."
@@ -2887,11 +2984,19 @@ msgstr "Chỉnh sửa các File phụ thuộc..."
msgid "View Owners..."
msgstr "Xem các scene sở hữu..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "Äổi tên..."
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "Nhân đôi..."
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr "Di chuyển đến..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
msgstr "Tạo Script"
@@ -2900,6 +3005,16 @@ msgstr "Tạo Script"
msgid "New Resource..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Expand All"
+msgstr "Mở rộng tất cả"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Collapse All"
+msgstr "Thu gá»n tất cả"
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -2921,27 +3036,19 @@ msgstr "Quét lại hệ thống tập tin"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "(Bá») Chá»n thư mục Hay sá»­ dụng"
+msgid "Toggle split mode"
+msgstr "Bật tắt Chức năng"
#: editor/filesystem_dock.cpp
-msgid "Show current scene file."
-msgstr ""
+#, fuzzy
+msgid "Search files"
+msgstr "Tìm kiếm:"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "Tìm kiếm:"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -2949,7 +3056,7 @@ msgstr ""
"Äang quét file,\n"
"ChỠmôt chút..."
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "Di chuyển"
@@ -2967,31 +3074,24 @@ msgid "Create Script"
msgstr "Tạo Script"
#: editor/find_in_files.cpp
-msgid "Find in files"
-msgstr ""
+#, fuzzy
+msgid "Find in Files"
+msgstr "Tìm..."
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find: "
+msgid "Find:"
msgstr "Tìm tiếp theo"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Whole words"
-msgstr "Cả từ"
+msgid "Folder:"
+msgstr "Tạo Folder"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Match case"
-msgstr "Trùng khớp"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
-
-#: editor/find_in_files.cpp
-msgid "Filter: "
-msgstr ""
+msgid "Filters:"
+msgstr "Lá»c..."
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3008,6 +3108,11 @@ msgstr ""
#: editor/find_in_files.cpp
#, fuzzy
+msgid "Find: "
+msgstr "Tìm tiếp theo"
+
+#: editor/find_in_files.cpp
+#, fuzzy
msgid "Replace: "
msgstr "Thay thế"
@@ -3032,7 +3137,7 @@ msgstr "LỖI: Tên animation trùng lặp!"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr "Kích thước font không hợp lệ."
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3170,18 +3275,14 @@ msgstr ""
msgid "Failed to load resource."
msgstr ""
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr ""
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
-msgstr ""
+#, fuzzy
+msgid "Collapse All Properties"
+msgstr "Thu gá»n tất cả"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -3226,6 +3327,11 @@ msgid "Load an existing resource from disk and edit it."
msgstr ""
#: editor/inspector_dock.cpp
+#, fuzzy
+msgid "Save the currently edited resource."
+msgstr "Lưu animation này"
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr ""
@@ -3287,44 +3393,45 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
-msgstr ""
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
+msgstr "Tạo"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
-msgstr ""
+#, fuzzy
+msgid "Edit Polygon"
+msgstr "Tạo"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+msgid "Remove Polygon And Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr ""
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr "Tạo Script"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3339,7 +3446,7 @@ msgstr "Thêm Animation"
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-msgid "Load.."
+msgid "Load..."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3368,13 +3475,8 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "Tạo Script"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-msgid "Erase points."
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3416,9 +3518,8 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3452,7 +3553,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add Node.."
+msgid "Add Node..."
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3611,43 +3712,44 @@ msgstr "Xem Khung hình Liên tiếp"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Directions"
-msgstr ""
+msgstr "Hướng đi"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Past"
-msgstr ""
+msgstr "Quá khứ"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Future"
-msgstr ""
+msgstr "Tương lai"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Depth"
-msgstr ""
+msgstr "Chiá»u sâu"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "1 step"
-msgstr ""
+msgstr "1 bước"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "2 steps"
-msgstr ""
+msgstr "2 bước"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "3 steps"
-msgstr ""
+msgstr "3 bước"
#: editor/plugins/animation_player_editor_plugin.cpp
+#, fuzzy
msgid "Differences Only"
-msgstr ""
+msgstr "Chỉ khác biệt"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Force White Modulate"
-msgstr ""
+msgstr "Bắt buộc Modulate trắng"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Include Gizmos (3D)"
-msgstr ""
+msgstr "Kèm Gizmos (3D)"
#: editor/plugins/animation_player_editor_plugin.cpp
#, fuzzy
@@ -3656,11 +3758,11 @@ msgstr "Dán Animation"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Create New Animation"
-msgstr ""
+msgstr "Tạo Animation mới"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Animation Name:"
-msgstr ""
+msgstr "Tên Animation:"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
@@ -3668,7 +3770,7 @@ msgstr ""
#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
#: editor/script_create_dialog.cpp
msgid "Error!"
-msgstr ""
+msgstr "Lá»—i!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Blend Times:"
@@ -3692,7 +3794,7 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Sync"
-msgstr ""
+msgstr "Äồng bá»™ hoá"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "At End"
@@ -3718,9 +3820,8 @@ msgid ""
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "Tạo %s Mới"
+msgstr "Tạo nodes mới."
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
@@ -3729,43 +3830,45 @@ msgstr "Kết nối đến Node:"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "Bá» track Ä‘ang chá»n."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
msgstr ""
+"Bật tắt tự động chạy của animation này khi bắt đầu, khởi động lại hoặc lùi "
+"vá» 0."
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set the end animation. This is useful for sub-transitions."
-msgstr ""
+msgstr "Äặt kết thúc animation. Hữu dụng cho sub-transitions."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "Chuyển tiếp"
+msgstr "Chuyển tiếp: "
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "AnimationTree"
-msgstr ""
+msgstr "AnimationTree"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "New name:"
-msgstr ""
+msgstr "Tên mới:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Scale:"
-msgstr ""
+msgstr "Tỷ lệ:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#, fuzzy
msgid "Fade In (s):"
-msgstr ""
+msgstr "Tăng dần (s):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Fade Out (s):"
-msgstr ""
+msgstr "Giảm dần (s):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend"
@@ -3777,28 +3880,24 @@ msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Auto Restart:"
-msgstr ""
+msgstr "Tự khởi động lại:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Restart (s):"
-msgstr ""
+msgstr "Khởi động lại (s):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Random Restart (s):"
-msgstr ""
+msgstr "Khởi động lại ngẫu nhiên (s):"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Start!"
-msgstr ""
+msgstr "Chạy!"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Amount:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr ""
+msgstr "Số lượng:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
@@ -3814,35 +3913,36 @@ msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Current:"
-msgstr ""
+msgstr "Hiện tại:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Add Input"
-msgstr ""
+msgstr "Thêm Input"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Clear Auto-Advance"
-msgstr ""
+msgstr "Xoá Auto-Advance"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Set Auto-Advance"
-msgstr ""
+msgstr "Äặt Auto-Advance"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Delete Input"
-msgstr ""
+msgstr "Xoá Input"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Animation tree is valid."
-msgstr ""
+msgstr "Animation tree khả dụng."
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Animation tree is invalid."
-msgstr ""
+msgstr "Animation tree vô hiệu."
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#, fuzzy
msgid "Animation Node"
-msgstr ""
+msgstr "Animation Node"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "OneShot Node"
@@ -3882,19 +3982,19 @@ msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Edit Node Filters"
-msgstr ""
+msgstr "Chỉnh sá»­a lá»c Node"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Filters..."
-msgstr ""
+msgstr "Lá»c..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Contents:"
-msgstr ""
+msgstr "Ná»™i dung:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "View Files"
-msgstr ""
+msgstr "Xem Files"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Can't resolve hostname:"
@@ -3906,19 +4006,20 @@ msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Can't connect to host:"
-msgstr ""
+msgstr "Không thể kết nối tới host:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "No response from host:"
-msgstr ""
+msgstr "Không có phản hồi từ host:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Request failed, return code:"
-msgstr ""
+msgstr "Yêu cầu thất bại, trả lại code:"
#: editor/plugins/asset_library_editor_plugin.cpp
+#, fuzzy
msgid "Request failed, too many redirects"
-msgstr ""
+msgstr "Yêu cầu thất bại, gá»­i lại quá nhiá»u"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Bad download hash, assuming file has been tampered with."
@@ -3926,11 +4027,11 @@ msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Expected:"
-msgstr ""
+msgstr "Mong đợi:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Got:"
-msgstr ""
+msgstr "Nhận được:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Failed sha256 hash check"
@@ -3942,31 +4043,31 @@ msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Downloading (%s / %s)..."
-msgstr ""
+msgstr "Äang tải (%s / %s)..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Downloading..."
-msgstr ""
+msgstr "Äang tải..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Resolving..."
-msgstr ""
+msgstr "Äang giải thuật..."
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Error making request"
-msgstr ""
+msgstr "Lỗi tạo yêu cầu"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Idle"
-msgstr ""
+msgstr "Chạy không"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Retry"
-msgstr ""
+msgstr "Thử lại"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Download Error"
-msgstr ""
+msgstr "Lỗi tải"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Download for this asset is already in progress!"
@@ -3974,7 +4075,7 @@ msgstr ""
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "First"
-msgstr ""
+msgstr "Äầu tiên"
#: editor/plugins/asset_library_editor_plugin.cpp
#, fuzzy
@@ -3988,19 +4089,19 @@ msgstr "Tìm tiếp theo"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Last"
-msgstr ""
+msgstr "Cuối cùng"
#: editor/plugins/asset_library_editor_plugin.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "All"
-msgstr ""
+msgstr "Tất cả"
#: editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_settings_editor.cpp
msgid "Plugins"
msgstr ""
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr ""
@@ -4125,6 +4226,10 @@ msgid "Resize CanvasItem"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
msgstr ""
@@ -4145,21 +4250,19 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "Thu nhá»"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "Thu nhá»"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "Phóng to"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4188,6 +4291,11 @@ msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "Bật tắt Chức năng"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4282,6 +4390,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "Xóa Point"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr ""
@@ -4332,6 +4445,10 @@ msgid "Show Viewport"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr ""
@@ -4370,11 +4487,11 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Add %s"
-msgstr ""
+msgstr "Thêm %s"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Adding %s..."
-msgstr ""
+msgstr "Äang thêm %s..."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Cannot instantiate multiple nodes without root."
@@ -4392,7 +4509,7 @@ msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Change default type"
-msgstr ""
+msgstr "Äổi dạng mặc định"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid ""
@@ -4401,7 +4518,16 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "Tạo"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
msgstr ""
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
@@ -4503,35 +4629,9 @@ msgid "Item List Editor"
msgstr ""
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr ""
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr ""
@@ -4732,15 +4832,15 @@ msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "X-Axis"
-msgstr ""
+msgstr "Trục-X"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Y-Axis"
-msgstr ""
+msgstr "Trục-Y"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Z-Axis"
-msgstr ""
+msgstr "Trục-Z"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Mesh Up Axis:"
@@ -4763,12 +4863,12 @@ msgid "Populate"
msgstr ""
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
+msgid "Generating Visibility Rect"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -4797,6 +4897,11 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr ""
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr ""
@@ -4866,11 +4971,11 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Convert to CPUParticles"
+msgid "Generate AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
@@ -4895,6 +5000,11 @@ msgid "Add Point to Curve"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "Sá»­a Node Curve"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr ""
@@ -4922,6 +5032,10 @@ msgid "Click: Add Point"
msgstr "Nhấp: Tạo Point"
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr "Nhấp chuột phải: Xóa Point"
@@ -4937,11 +5051,6 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "Xóa Point"
@@ -4998,6 +5107,10 @@ msgstr ""
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5009,81 +5122,90 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync bones"
+msgid "Sync Bones"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create UV Map"
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create Polygon & UV"
+msgid "Create UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
+msgid "Create Polygon & UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
+msgid "Create Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split already exists."
+msgid "Remove Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Add Split"
+msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "Kích thước font không hợp lệ."
+msgid "Add Custom Polygon"
+msgstr "Tạo"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "Bá» lá»±a chá»n"
+msgid "Remove Custom Polygon"
+msgstr "Xóa Animation"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
-msgstr ""
+#, fuzzy
+msgid "Transform Polygon"
+msgstr "Tạo"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Polygon 2D UV Editor"
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UV"
+msgid "Open Polygon 2D UV editor."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Poly"
+msgid "Polygon 2D UV Editor"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Splits"
+msgid "UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Bones"
-msgstr ""
+#, fuzzy
+msgid "Points"
+msgstr "Di chuyển đến..."
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
+msgid "Polygons"
msgstr "Tạo"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Bones"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Move Points"
+msgstr "Di chuyển đến..."
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
msgstr ""
@@ -5108,20 +5230,21 @@ msgid "Scale Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "Chá»n má»™t Folder để Quét"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5145,6 +5268,11 @@ msgid "Grid Settings"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr ""
@@ -5202,22 +5330,22 @@ msgid "Paste Resource"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr ""
@@ -5247,6 +5375,10 @@ msgid "Error writing TextFile:"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Error could not load file."
msgstr ""
@@ -5256,20 +5388,24 @@ msgid "Error saving file!"
msgstr "Lỗi tải font."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr ""
+#, fuzzy
+msgid "Error while saving theme."
+msgstr "Lỗi khi lưu scene."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
-msgstr ""
+#, fuzzy
+msgid "Error Saving"
+msgstr "Lỗi di chuyển:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr ""
+#, fuzzy
+msgid "Error importing theme."
+msgstr "Lỗi khi lưu scene."
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
-msgstr ""
+#, fuzzy
+msgid "Error Importing"
+msgstr "Lỗi di chuyển:"
#: editor/plugins/script_editor_plugin.cpp
msgid "New TextFile..."
@@ -5290,6 +5426,14 @@ msgid "Import Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr ""
@@ -5330,8 +5474,9 @@ msgid "File"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "New TextFile"
-msgstr ""
+#, fuzzy
+msgid "Open..."
+msgstr "Mở"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5346,12 +5491,9 @@ msgid "Copy Script Path"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
-msgstr ""
+#, fuzzy
+msgid "History Previous"
+msgstr "Thư mục trước"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
@@ -5363,6 +5505,10 @@ msgid "Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme..."
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
msgstr ""
@@ -5371,10 +5517,6 @@ msgid "Save Theme"
msgstr "Lưu Theme"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "Lưu Theme thành"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "Äóng Docs"
@@ -5421,7 +5563,7 @@ msgid "Keep Debugger Open"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5429,10 +5571,6 @@ msgid "Open Godot online documentation"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -5467,18 +5605,9 @@ msgid "Debugger"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search results"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Search in files"
-msgstr "Äổi tên file:"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
+msgid "Search Results"
+msgstr "Tìm sự giúp đỡ"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
@@ -5490,6 +5619,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "Thêm Hàm"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr ""
@@ -5521,10 +5659,6 @@ msgstr ""
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5576,11 +5710,11 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
+msgid "Convert Indent to Tabs"
msgstr ""
#: editor/plugins/script_text_editor.cpp
@@ -5597,20 +5731,14 @@ msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr ""
+#, fuzzy
+msgid "Go to Next Breakpoint"
+msgstr "Äến Step tiếp theo"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr ""
+#, fuzzy
+msgid "Go to Previous Breakpoint"
+msgstr "Äến Step trước đó"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
@@ -5618,16 +5746,18 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr "Tìm..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
-msgstr ""
+#, fuzzy
+msgid "Go to Function..."
+msgstr "Xoá Function"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
-msgstr ""
+#, fuzzy
+msgid "Go to Line..."
+msgstr "Äến Dòng"
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
@@ -5719,6 +5849,14 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -5883,6 +6021,10 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -5982,10 +6124,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap To Floor"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6102,6 +6240,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
msgstr ""
@@ -6216,14 +6358,19 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "Snap Mode:"
+msgid "Set Margin"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+#: scene/resources/visual_shader.cpp
+msgid "None"
+msgstr "Không có"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Pixel Snap"
msgstr ""
@@ -6384,6 +6531,11 @@ msgid "Fix Invalid Tiles"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "Nhân đôi lá»±a chá»n"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6430,61 +6582,89 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
-msgstr "Bá» lá»±a chá»n"
+msgid "Copy Selection"
+msgstr "Di chuyển Lá»±a chá»n"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
+msgid "Rotate left"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
+msgid "Rotate right"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Flip vertically"
msgstr ""
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Clear transform"
+msgstr "Äổi Transform Animation"
+
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Add Texture(s) to TileSet"
-msgstr ""
+#, fuzzy
+msgid "Add Texture(s) to TileSet."
+msgstr "Chèn Texture(s) vào TileSet"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove current Texture from TileSet"
-msgstr ""
+#, fuzzy
+msgid "Remove selected Texture from TileSet."
+msgstr "Xóa Texture hiện tại từ TileSet"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
-msgstr ""
+msgstr "Tạo từ Scene"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from Scene"
+msgstr "Gộp từ Scene"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Copy bitmask."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "Dán Animation"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Erase bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "Tạo"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "Xóa Texture hiện tại từ TileSet"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6492,7 +6672,12 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "Xóa Template"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6502,15 +6687,25 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "Xoá lá»±a chá»n"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "Tạo"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr ""
@@ -6528,13 +6723,98 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "This property can't be changed."
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "Tạo Folder"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "Chỉnh Thá»i gian Chuyển Animation"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "Tạo"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "Tạo"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "Tạo"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "Dán Animation"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
+#, fuzzy
+msgid "Remove Tile"
+msgstr "Xóa Template"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Collision Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "Xóa Animation"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Priority"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
msgstr ""
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "Tạo"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "Tạo"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "This property can't be changed."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "TileSet"
+msgstr "Xuất Tile Set"
+
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vertex"
msgstr ""
@@ -6568,6 +6848,14 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6576,6 +6864,11 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "Xuất Tile Set"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6630,10 +6923,50 @@ msgid "Feature List:"
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "Tạo Script"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Script Export Mode:"
+msgstr "Nhập từ Node:"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export mode?"
+msgstr "Nhập từ Node:"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Export All"
+msgstr "Xuất Tile Set"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -6761,8 +7094,9 @@ msgid "Unnamed Project"
msgstr ""
#: editor/project_manager.cpp
-msgid "Can't open project"
-msgstr ""
+#, fuzzy
+msgid "Can't open project at '%s'."
+msgstr "Không thể chạy project"
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
@@ -6770,6 +7104,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7087,10 +7439,6 @@ msgstr ""
msgid "General"
msgstr "Tổng quan"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7224,10 +7572,6 @@ msgstr ""
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr ""
@@ -7315,7 +7659,7 @@ msgid "Step"
msgstr "Bước (s):"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7324,7 +7668,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7365,7 +7709,7 @@ msgstr ""
msgid "Reset"
msgstr "Äặt lại phóng"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7424,6 +7768,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr ""
@@ -7441,11 +7789,11 @@ msgstr ""
#: editor/scene_tree_dock.cpp
msgid "Duplicate Node(s)"
-msgstr ""
+msgstr "Nhân đôi Node(s)"
#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)?"
-msgstr ""
+msgstr "Xóa Node(s)?"
#: editor/scene_tree_dock.cpp
msgid "Can not perform with the root node."
@@ -7460,6 +7808,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7472,27 +7826,24 @@ msgid "Make Local"
msgstr ""
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "Kết nối đến Node:"
+msgstr "Tạo Root Node:"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "2D Scene"
-msgstr "Tạo Scene Mới"
+msgstr "2D Scene"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "3D Scene"
-msgstr "Tạo Scene Mới"
+msgstr "3D Scene"
#: editor/scene_tree_dock.cpp
msgid "User Interface"
-msgstr ""
+msgstr "Giao diện ngưá»i dùng"
#: editor/scene_tree_dock.cpp
msgid "Custom Node"
-msgstr ""
+msgstr "Node tùy chá»n"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
@@ -7504,11 +7855,11 @@ msgstr ""
#: editor/scene_tree_dock.cpp
msgid "Attach Script"
-msgstr ""
+msgstr "Äính kèm Script"
#: editor/scene_tree_dock.cpp
msgid "Remove Node(s)"
-msgstr ""
+msgstr "Xóa Node(s)"
#: editor/scene_tree_dock.cpp
msgid ""
@@ -7518,7 +7869,7 @@ msgstr ""
#: editor/scene_tree_dock.cpp
msgid "Error saving scene."
-msgstr ""
+msgstr "Lỗi khi lưu scene."
#: editor/scene_tree_dock.cpp
msgid "Error duplicating scene to save it."
@@ -7533,15 +7884,15 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Delete Node(s)"
+msgid "Open documentation"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Add Child Node"
-msgstr ""
+msgid "Delete Node(s)"
+msgstr "Xóa Node(s)"
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
@@ -7549,6 +7900,11 @@ msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Extend Script"
+msgstr "Tạo Script"
+
+#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
msgstr ""
@@ -7696,6 +8052,10 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -7784,19 +8144,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -7828,18 +8176,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -8038,7 +8374,7 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+msgid "Step argument is zero!"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
@@ -8261,11 +8597,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -8388,27 +8720,27 @@ msgstr ""
#: modules/visual_script/visual_script_editor.cpp
msgid "Rename Function"
-msgstr ""
+msgstr "Äổi tên Hàm"
#: modules/visual_script/visual_script_editor.cpp
msgid "Rename Variable"
-msgstr ""
+msgstr "Äổi tên Biến"
#: modules/visual_script/visual_script_editor.cpp
msgid "Rename Signal"
-msgstr ""
+msgstr "Äổi tên Tín hiệu"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Function"
-msgstr ""
+msgstr "Thêm Hàm"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Variable"
-msgstr ""
+msgstr "Thêm Biến"
#: modules/visual_script/visual_script_editor.cpp
msgid "Add Signal"
-msgstr ""
+msgstr "Thêm Tín hiệu"
#: modules/visual_script/visual_script_editor.cpp
msgid "Change Expression"
@@ -8472,7 +8804,7 @@ msgstr ""
#: modules/visual_script/visual_script_editor.cpp
msgid "Move Node(s)"
-msgstr ""
+msgstr "Di chuyển Node(s)"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove VisualScript Node"
@@ -8514,31 +8846,35 @@ msgstr ""
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Function"
-msgstr ""
+msgstr "Xoá Function"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Variable"
-msgstr ""
+msgstr "Xoá Variable"
#: modules/visual_script/visual_script_editor.cpp
msgid "Editing Variable:"
-msgstr ""
+msgstr "Chỉnh sửa Variable:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Remove Signal"
-msgstr ""
+msgstr "Xoá Signal"
#: modules/visual_script/visual_script_editor.cpp
msgid "Editing Signal:"
-msgstr ""
+msgstr "Chỉnh sửa Signal:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Base Type:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "Những Thành viên:"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
-msgstr ""
+msgstr "Nodes khả dụng:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Select or create a function to edit graph"
@@ -8550,15 +8886,15 @@ msgstr ""
#: modules/visual_script/visual_script_editor.cpp
msgid "Edit Variable:"
-msgstr ""
+msgstr "Chỉnh sửa Variable:"
#: modules/visual_script/visual_script_editor.cpp
msgid "Delete Selected"
-msgstr ""
+msgstr "Xoá lá»±a chá»n"
#: modules/visual_script/visual_script_editor.cpp
msgid "Find Node Type"
-msgstr ""
+msgstr "Tìm loại Node"
#: modules/visual_script/visual_script_editor.cpp
msgid "Copy Nodes"
@@ -8632,19 +8968,19 @@ msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search VisualScript"
-msgstr ""
+msgstr "Tìm VisualScript"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
-msgstr ""
+msgstr "Chạy trong Trình duyệt web"
#: platform/javascript/export/export.cpp
msgid "Run exported HTML in the system's default browser."
@@ -8652,7 +8988,7 @@ msgstr ""
#: platform/javascript/export/export.cpp
msgid "Could not write file:"
-msgstr ""
+msgstr "Không viết được file:"
#: platform/javascript/export/export.cpp
msgid "Could not open template for export:"
@@ -8668,11 +9004,11 @@ msgstr ""
#: platform/javascript/export/export.cpp
msgid "Could not read boot splash image file:"
-msgstr ""
+msgstr "Không Ä‘á»c được file hình khởi động:"
#: platform/javascript/export/export.cpp
msgid "Using default boot splash image."
-msgstr ""
+msgstr "Sử dụng hình khởi động mặc định."
#: scene/2d/animated_sprite.cpp
msgid ""
@@ -8717,6 +9053,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -8755,6 +9097,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -8872,6 +9220,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -8891,6 +9249,26 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -8923,7 +9301,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -8945,23 +9323,20 @@ msgid "On BlendTree node '%s', animation not found: '%s'"
msgstr ""
#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "Các Công cụ Animation"
+msgstr "Không tìm thấy Animation: '%s'"
#: scene/animation/animation_tree.cpp
msgid "In node '%s', invalid animation: '%s'."
-msgstr ""
+msgstr "Trong node '%s', animation vô hiệu: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "LỖI: Tên animation không hợp lệ!"
+msgstr "Animation vô hiệu: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "Hủy kết nối '%s' từ '%s'"
+msgstr "Không có kết nối đến input '%s' của node '%s'."
#: scene/animation/animation_tree.cpp
msgid "A root AnimationNode for the graph is not set."
@@ -8980,6 +9355,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr ""
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr ""
@@ -8996,10 +9375,6 @@ msgstr "Cảnh báo!"
msgid "Please Confirm..."
msgstr "Xin hãy xác nhận..."
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr "Chá»n folder này"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9010,6 +9385,10 @@ msgstr ""
"có dạng popup*(). Có thể để popup nhìn thấy được để chỉnh sửa, nhưng chúng "
"sẽ ẩn khi chạy."
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9053,16 +9432,11 @@ msgstr "Kích thước font không hợp lệ."
#: scene/resources/visual_shader.cpp
msgid "Input"
-msgstr ""
-
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
+msgstr "Nhập"
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for shader."
-msgstr "Kích thước font không hợp lệ."
+msgstr "nguồn vô hiệu cho shader."
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
@@ -9076,6 +9450,70 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr "Kích thước font không hợp lệ."
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "Bá» lá»±a chá»n"
+
+#, fuzzy
+#~ msgid "Select a split to erase it."
+#~ msgstr "Chá»n má»™t Folder để Quét"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "Thu nhá»"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "Phóng to"
+
+#~ msgid "Save Theme As"
+#~ msgstr "Lưu Theme thành"
+
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Phóng to"
+
+#~ msgid "Are you sure you want to remove all connections from the \""
+#~ msgstr "Bạn có chắc muốn xóa bỠtất cả kết nối từ \""
+
+#~ msgid "Class List:"
+#~ msgstr "Danh sách Class:"
+
+#~ msgid "Search Classes"
+#~ msgstr "Tìm Class"
+
+#, fuzzy
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "(Bá») Chá»n thư mục Hay sá»­ dụng"
+
+#, fuzzy
+#~ msgid "Whole words"
+#~ msgstr "Cả từ"
+
+#, fuzzy
+#~ msgid "Match case"
+#~ msgstr "Trùng khớp"
+
+#, fuzzy
+#~ msgid "Search in files"
+#~ msgstr "Äổi tên file:"
+
+#~ msgid "Rotate 0 degrees"
+#~ msgstr "Xoay 0 độ"
+
+#~ msgid "Rotate 90 degrees"
+#~ msgstr "Xoay 90 độ"
+
+#~ msgid "Rotate 180 degrees"
+#~ msgstr "Xoay 180 độ"
+
+#~ msgid "Rotate 270 degrees"
+#~ msgstr "Xoay 270 độ"
+
#~ msgid "Disabled"
#~ msgstr "Tắt"
@@ -9094,9 +9532,6 @@ msgstr ""
#~ msgid "Anim Track Change Interpolation"
#~ msgstr "Äổi phép ná»™i suy Anim Track"
-#~ msgid "Edit Node Curve"
-#~ msgstr "Sá»­a Node Curve"
-
#~ msgid "Anim Add Key"
#~ msgstr "Thêm Key Anim"
@@ -9160,9 +9595,3 @@ msgstr ""
#~ msgid "Load an animation from disk."
#~ msgstr "Load một animation từ disk."
-
-#~ msgid "Save the current animation"
-#~ msgstr "Lưu animation này"
-
-#~ msgid "Edit Target Blend Times"
-#~ msgstr "Chỉnh Thá»i gian Chuyển Animation"
diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po
index d1d840a745..54736f34ac 100644
--- a/editor/translations/zh_CN.po
+++ b/editor/translations/zh_CN.po
@@ -1,6 +1,6 @@
# Chinese (Simplified) translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# 360119124 <360119124@qq.com>, 2018.
# æŸ æª¬æ€æ‰‹ <lemonkiller@gmail.com>, 2018.
@@ -13,7 +13,7 @@
# Geequlim <geequlim@gmail.com>, 2016-2018.
# jie Shi <meishijiemeimeimei@gmail.com>, 2018.
# Jingtian Pan <panjingtian@126.com>, 2018.
-# lalalaring <783482203@qq.com>, 2017.
+# lalalaring <783482203@qq.com>, 2017, 2018.
# Luo Jun <vipsbpig@gmail.com>, 2016-2017, 2018.
# oberon-tonya <360119124@qq.com>, 2016.
# plumsky <x-wolf@163.com>, 2018.
@@ -27,12 +27,22 @@
# Zae Chao <zae.vito@live.com>, 2018.
# zwj36028 <23732399@qq.com>, 2018.
# Hobr <mkowes@vip.qq.com>, 2018.
+# Dante Lucifer <firecloud888@gmail.com>, 2018.
+# carlcc <carlmarxchen@foxmail.com>, 2018.
+# AColdCube <761397398@qq.com>, 2018.
+# å°è è粑粑 <2062152083@qq.com>, 2018.
+# 刘庆文 <liuqingwen@163.com>, 2018.
+# Haowen Liu <liu.haowen.andy@gmail.com>, 2018.
+# tangdou1 <1093505442@qq.com>, 2018.
+# yzt <834950797@qq.com>, 2018.
+# DKLost <514dklost@gmail.com>, 2018.
+# thanksshu <hezihanshangyuan@gmail.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Chinese (Simplified) (Godot Engine)\n"
"POT-Creation-Date: 2018-01-20 12:15+0200\n"
-"PO-Revision-Date: 2018-07-27 02:37+0000\n"
-"Last-Translator: Hobr <mkowes@vip.qq.com>\n"
+"PO-Revision-Date: 2018-12-18 01:28+0000\n"
+"Last-Translator: thanksshu <hezihanshangyuan@gmail.com>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
"godot-engine/godot/zh_Hans/>\n"
"Language: zh_CN\n"
@@ -40,7 +50,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 3.1-dev\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -48,41 +58,38 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr "convertå‡½æ•°å‚æ•°ç±»åž‹éžæ³•,请传入以“TYPE_â€æ‰“头的常é‡ã€‚"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr "没有足够的字节æ¥è§£ç æˆ–æ ¼å¼ä¸æ­£ç¡®ã€‚"
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "表达å¼ä¸­æœ‰éžæ³•的输入 %i (未通过)"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr ""
+msgstr "自身无法使用因为实例为空"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "'%s'这个属性å的在节点'%s'中ä¸å­˜åœ¨ã€‚"
+msgstr "è¿ç®—符%s,%s和%sçš„æ“作数无效。"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid index of type %s for base type %s"
-msgstr "'%s'这个属性å的在节点'%s'中ä¸å­˜åœ¨ã€‚"
+msgstr "无效内存地å€ç±»åž‹ %s,基类 %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr ""
+msgstr "对基础类型 %s éžæ³•的具å索引 '%s'"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid arguments to construct '%s'"
-msgstr "ï¼šæ— æ•ˆå‚æ•°ç±»åž‹ï¼š "
+msgstr "ï¼šæ— æ•ˆå‚æ•°ç±»åž‹ï¼š '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr ""
+msgstr "在对 '%s' 的调用中:"
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -91,27 +98,23 @@ msgstr "释放"
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "平衡的"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Mirror"
-msgstr "沿X轴翻转"
+msgstr "镜åƒ"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Insert Key Here"
-msgstr "æ’入关键帧"
+msgstr "此处æ’入帧"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Duplicate Selected Key(s)"
-msgstr "å¤åˆ¶é€‰ä¸­é¡¹"
+msgstr "å¤åˆ¶å·²é€‰å¸§"
#: editor/animation_bezier_editor.cpp
-#, fuzzy
msgid "Delete Selected Key(s)"
-msgstr "删除已选中"
+msgstr "删除已选帧"
#: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp
msgid "Anim Duplicate Keys"
@@ -142,46 +145,40 @@ msgid "Anim Change Call"
msgstr "修改回调"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Property Track"
-msgstr "属性:"
+msgstr "属性轨é“"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "3D Transform Track"
-msgstr "å˜æ¢ç±»åž‹"
+msgstr "3Då˜æ¢è½¨é“"
#: editor/animation_track_editor.cpp
msgid "Call Method Track"
-msgstr ""
+msgstr "调用方法轨é“"
#: editor/animation_track_editor.cpp
msgid "Bezier Curve Track"
-msgstr ""
+msgstr "è´å¡žå°”曲线轨迹"
#: editor/animation_track_editor.cpp
msgid "Audio Playback Track"
-msgstr ""
+msgstr "音频回放轨é“"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Playback Track"
-msgstr "åœæ­¢åŠ¨ç”»å›žæ”¾ã€‚(S)"
+msgstr "动画回放轨é“"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Add Track"
msgstr "添加轨é“"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Length Time (seconds)"
-msgstr "动画时长(秒)。"
+msgstr "动画时长(秒)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation Looping"
-msgstr "动画时间缩放。"
+msgstr "动画循环"
#: editor/animation_track_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
@@ -189,42 +186,36 @@ msgid "Functions:"
msgstr "函数:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Audio Clips:"
-msgstr "音频监å¬å™¨"
+msgstr "音频剪辑:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Clips:"
-msgstr "片段"
+msgstr "动画剪辑:"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Toggle this track on/off."
-msgstr "åˆ‡æ¢æ— å¹²æ‰°æ¨¡å¼ã€‚"
+msgstr "切æ¢å½“å‰è½¨é“开关。"
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
-msgstr ""
+msgstr "更新模å¼ï¼ˆå¦‚何设置此属性)"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Interpolation Mode"
-msgstr "动画节点"
+msgstr "æ’值模å¼"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
+msgstr "循环包裹模å¼ï¼ˆæ’入开始循环结æŸï¼‰"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Remove this track."
-msgstr "移除选中轨é“。"
+msgstr "移除当å‰è½¨é“。"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Time (s): "
-msgstr "X-Fade(äº¤å‰æ·¡åŒ–)æ—¶é—´(s):"
+msgstr "时间(秒): "
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -239,13 +230,12 @@ msgid "Trigger"
msgstr "触å‘器"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Capture"
-msgstr "功能"
+msgstr "截图"
#: editor/animation_track_editor.cpp
msgid "Nearest"
-msgstr ""
+msgstr "最近的"
#: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp
#: editor/property_editor.cpp
@@ -254,16 +244,15 @@ msgstr "线性"
#: editor/animation_track_editor.cpp
msgid "Cubic"
-msgstr ""
+msgstr "立方体"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clamp Loop Interp"
-msgstr "修改动画循环"
+msgstr "切断循环æ’值器"
#: editor/animation_track_editor.cpp
msgid "Wrap Loop Interp"
-msgstr ""
+msgstr "环绕间隔"
#: editor/animation_track_editor.cpp
#: editor/plugins/canvas_item_editor_plugin.cpp
@@ -271,14 +260,12 @@ msgid "Insert Key"
msgstr "æ’入关键帧"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Duplicate Key(s)"
-msgstr "å¤åˆ¶èŠ‚ç‚¹"
+msgstr "å¤åˆ¶å¸§"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Key(s)"
-msgstr "删除节点"
+msgstr "删除帧"
#: editor/animation_track_editor.cpp
msgid "Remove Anim Track"
@@ -296,7 +283,6 @@ msgstr "创建%d个新轨é“å¹¶æ’入关键帧?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -308,7 +294,7 @@ msgstr "æ’入动画"
#: editor/animation_track_editor.cpp
msgid "AnimationPlayer can't animate itself, only other players."
-msgstr ""
+msgstr "动画播放器ä¸èƒ½å¯¹è‡ªå·±åšåŠ¨ç”»ï¼Œåªæœ‰å…¶å®ƒæ’­æ”¾å™¨æ‰å¯ä»¥ã€‚"
#: editor/animation_track_editor.cpp
msgid "Anim Create & Insert"
@@ -324,7 +310,7 @@ msgstr "æ’入关键帧"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr ""
+msgstr "å˜æ¢è½¨è¿¹ä»…适用于基于空间的节点。"
#: editor/animation_track_editor.cpp
msgid ""
@@ -333,44 +319,46 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"音轨åªèƒ½æŒ‡å‘以下类型的节点:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "动画轨迹åªèƒ½æŒ‡å‘AnimationPlayer节点。"
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
-msgstr ""
+msgstr "动画播放器ä¸èƒ½æ’­æ”¾æœ¬èº«ï¼Œåªèƒ½æ’­æ”¾å…¶ä»–播放器。"
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "无法在没有root的情况下添加新轨é“"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "轨é“路径无效,因此无法添加键。"
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "Track䏿˜¯Spatial类型,ä¸èƒ½ä½œä¸ºé”®å€¼æ’å…¥"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
-msgstr ""
+msgstr "跟踪路径无效,所以ä¸èƒ½æ·»åŠ æ–¹æ³•å¸§ã€‚"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Method not found in object: "
-msgstr "脚本中未找到VariableGet: "
+msgstr "方法未找到: "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
msgstr "移动关键帧"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clipboard is empty"
-msgstr "å‰ªè´´æ¿æ˜¯ç©ºçš„ ï¼"
+msgstr "å‰ªè´´æ¿æ˜¯ç©ºçš„"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
@@ -379,25 +367,23 @@ msgstr "缩放关键帧"
#: editor/animation_track_editor.cpp
msgid ""
"This option does not work for Bezier editing, as it's only a single track."
-msgstr ""
+msgstr "此选项ä¸é€‚用于Bezierç¼–è¾‘ï¼Œå› ä¸ºå®ƒåªæ˜¯ä¸€ä¸ªè½¨è¿¹ã€‚"
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr ""
+msgstr "仅显示在树中选择的节点的轨é“。"
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr ""
+msgstr "按节点分组或将它们显示为普通列表。"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Snap (s): "
-msgstr "å¸é™„(åƒç´ ï¼‰ï¼š"
+msgstr "å¸é™„: "
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation step value."
-msgstr "动画树å¯ç”¨ã€‚"
+msgstr "动画步进值。"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -409,19 +395,16 @@ msgid "Edit"
msgstr "编辑"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "动画树"
+msgstr "动画属性。"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "æ‹·è´å‚æ•°"
+msgstr "å¤åˆ¶è½¨é“"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "粘贴帧"
+msgstr "粘贴轨é“"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -431,8 +414,7 @@ msgstr "缩放选中项"
msgid "Scale From Cursor"
msgstr "通过光标缩放"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "å¤åˆ¶é€‰ä¸­é¡¹"
@@ -441,17 +423,16 @@ msgid "Duplicate Transposed"
msgstr "å¤åˆ¶å¹¶è½¬ç½®"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
-msgstr "删除已选中"
+msgstr "删除已选中项"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+msgid "Go to Next Step"
msgstr "å‰å¾€ä¸‹ä¸€æ­¥"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
-msgstr "å‰å¾€ä¸Šä¸€æ­¥"
+msgid "Go to Previous Step"
+msgstr "返回上一步"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
@@ -463,11 +444,11 @@ msgstr "清空动画"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "选å–动画中的节点:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "使用è´å¡žå°”曲线"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
@@ -515,7 +496,7 @@ msgstr "缩放比率:"
#: editor/animation_track_editor.cpp
msgid "Select tracks to copy:"
-msgstr ""
+msgstr "选择è¦å¤åˆ¶çš„轨é“:"
#: editor/animation_track_editor.cpp editor/editor_properties.cpp
#: editor/plugins/animation_player_editor_plugin.cpp
@@ -553,11 +534,11 @@ msgstr "无匹é…项"
msgid "Replaced %d occurrence(s)."
msgstr "替æ¢äº†%d项。"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "大å°å†™åŒ¹é…"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "全字匹é…"
@@ -573,29 +554,31 @@ msgstr "全部替æ¢"
msgid "Selection Only"
msgstr "仅选中"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "放大"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "缩å°"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "é‡ç½®ç¼©æ”¾"
#: editor/code_editor.cpp
-#, fuzzy
msgid "Warnings:"
-msgstr "警告"
+msgstr "警告:"
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "缩放(%):"
+msgid "Font Size:"
+msgstr "字体大å°:"
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "行:"
@@ -626,6 +609,7 @@ msgstr "添加"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -682,9 +666,8 @@ msgid "Disconnect '%s' from '%s'"
msgstr "å–æ¶ˆ'%s'的连接'%s'"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect all from signal: '%s'"
-msgstr "å–æ¶ˆ'%s'的连接'%s'"
+msgstr "å–æ¶ˆå¹¿æ’­ '%s' 的所有连接"
#: editor/connections_dialog.cpp
msgid "Connect..."
@@ -696,19 +679,16 @@ msgid "Disconnect"
msgstr "删除信å·è¿žæŽ¥"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Connect Signal: "
-msgstr "连接信å·:"
+msgstr "连接信å·ï¼š "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit Connection: "
-msgstr "编辑事件连接"
+msgstr "编辑广播订阅: "
#: editor/connections_dialog.cpp
-#, fuzzy
-msgid "Are you sure you want to remove all connections from the \""
-msgstr "æ‚¨ç¡®å®šè¦æ‰§è¡Œå¤šä¸ªé¡¹ç›®å—?"
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
+msgstr "你确定è¦ä»Žä¿¡å· “%s†中移除所有连接å—?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -716,22 +696,19 @@ msgstr "ä¿¡å·"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr ""
+msgstr "你确定è¦ä»Žè¯¥å¹¿æ’­ä¿¡å·ä¸­ç§»é™¤æ‰€æœ‰è¿žæŽ¥å—?"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Disconnect All"
-msgstr "删除信å·è¿žæŽ¥"
+msgstr "å–æ¶ˆæ‰€æœ‰å¹¿æ’­ä¿¡å·è¿žæŽ¥"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Edit..."
-msgstr "编辑"
+msgstr "编辑…"
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "方法"
+msgstr "定ä½åˆ°æ–¹æ³•"
#: editor/create_dialog.cpp
msgid "Change %s Type"
@@ -756,23 +733,20 @@ msgid "Recent:"
msgstr "最近文件:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "æœç´¢:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "匹é…项:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "æè¿°:"
@@ -807,8 +781,7 @@ msgid "Resource"
msgstr "资æº"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "路径"
@@ -829,9 +802,10 @@ msgid "Search Replacement Resource:"
msgstr "查找替æ¢èµ„æº:"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -861,8 +835,8 @@ msgid "Error loading:"
msgstr "加载出错:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
-msgstr "加载场景失败,找ä¸åˆ°ä»¥ä¸‹ä¾èµ–项目:"
+msgid "Load failed due to missing dependencies:"
+msgstr "由于缺少ä¾èµ–项, 加载失败:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -920,14 +894,6 @@ msgstr "改å˜å­—典的值"
msgid "Thanks from the Godot community!"
msgstr "感谢Godot社区!"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "好的"
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Godot引擎贡献者"
@@ -1019,7 +985,8 @@ msgid "Uncompressing Assets"
msgstr "无压缩资æº"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+#, fuzzy
+msgid "Package installed successfully!"
msgstr "软件包安装æˆåŠŸï¼"
#: editor/editor_asset_installer.cpp
@@ -1101,8 +1068,7 @@ msgid "Bus options"
msgstr "音频总线选项"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "æ‹·è´"
@@ -1261,7 +1227,7 @@ msgid "Add AutoLoad"
msgstr "添加Autoload"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "路径:"
@@ -1269,8 +1235,8 @@ msgstr "路径:"
msgid "Node Name:"
msgstr "节点åç§°:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "åç§°"
@@ -1340,26 +1306,29 @@ msgid "Template file not found:"
msgstr "找ä¸åˆ°æ¨¡æ¿æ–‡ä»¶:"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "选择当å‰ç›®å½•"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "文件已存在,确定è¦è¦†ç›–它å—?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "选择当å‰ç›®å½•"
+msgid "Select This Folder"
+msgstr "选择此文件夹"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
msgstr "æ‹·è´è·¯å¾„"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Open In File Manager"
-msgstr "在资æºç®¡ç†å™¨ä¸­æ‰“å¼€"
+msgid "Open in File Manager"
+msgstr "在文件管ç†å™¨ä¸­æ‰“å¼€"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
-msgstr "在资æºç®¡ç†å™¨ä¸­æ‰“å¼€"
+msgid "Show in File Manager"
+msgstr "在文件管ç†å™¨ä¸­æ˜¾ç¤º"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
@@ -1383,7 +1352,7 @@ msgstr "打开å•个文件"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open File(s)"
-msgstr "打开文件"
+msgstr "打开一个或多个文件"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a Directory"
@@ -1394,7 +1363,8 @@ msgid "Open a File or Directory"
msgstr "打开文件或目录"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "ä¿å­˜"
@@ -1452,8 +1422,7 @@ msgstr "目录|文件:"
msgid "Preview:"
msgstr "预览:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "文件:"
@@ -1469,24 +1438,11 @@ msgstr "æ‰«ææºæ–‡ä»¶"
msgid "(Re)Importing Assets"
msgstr "导入(釿–°)资æº"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "æœç´¢å¸®åŠ©"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "类型列表:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "æœç´¢ç±»åž‹"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
msgid "Top"
msgstr "顶部"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "ç±»:"
@@ -1503,28 +1459,28 @@ msgid "Brief Description:"
msgstr "简介:"
#: editor/editor_help.cpp
-msgid "Members"
-msgstr "æˆå‘˜"
+msgid "Properties"
+msgstr "属性"
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
-msgstr "æˆå‘˜ï¼š"
+#: editor/editor_help.cpp
+msgid "Properties:"
+msgstr "属性:"
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr "公共方法"
+msgid "Methods"
+msgstr "方法"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "公共方法:"
+msgid "Methods:"
+msgstr "方法:"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "GUI主题项目"
+msgid "Theme Properties"
+msgstr "主题属性"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "GUI主题:"
+msgid "Theme Properties:"
+msgstr "Theme Properties:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1551,8 +1507,12 @@ msgid "Constants:"
msgstr "常é‡:"
#: editor/editor_help.cpp
-msgid "Description"
-msgstr "æè¿°"
+msgid "Class Description"
+msgstr "类说明"
+
+#: editor/editor_help.cpp
+msgid "Class Description:"
+msgstr "类说明:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1568,12 +1528,12 @@ msgstr ""
"url][/color]的方å¼å¸®åŠ©æˆ‘ä»¬å®Œå–„æ–‡æ¡£ã€‚"
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr "属性"
+msgid "Property Descriptions"
+msgstr "属性说明"
#: editor/editor_help.cpp
-msgid "Property Description:"
-msgstr "属性æè¿°ï¼š"
+msgid "Property Descriptions:"
+msgstr "属性说明:"
#: editor/editor_help.cpp
msgid ""
@@ -1584,12 +1544,12 @@ msgstr ""
"[/color]!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "方法"
+msgid "Method Descriptions"
+msgstr "方法说明"
#: editor/editor_help.cpp
-msgid "Method Description:"
-msgstr "方法æè¿°:"
+msgid "Method Descriptions:"
+msgstr "方法说明:"
#: editor/editor_help.cpp
msgid ""
@@ -1599,18 +1559,58 @@ msgstr ""
"当剿²¡æœ‰æ­¤æ–¹æ³•çš„æè¿°ã€‚请帮助我们通过 [color=$color] [url=$url] 贡献一个 [/"
"url][/color]!"
-#: editor/editor_inspector.cpp
-#, fuzzy
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "æœç´¢å¸®åŠ©"
+
+#: editor/editor_help_search.cpp
+msgid "Display All"
+msgstr "全部显示"
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr "ä»…é™ç±»"
+
+#: editor/editor_help_search.cpp
+msgid "Methods Only"
+msgstr "仅方法"
+
+#: editor/editor_help_search.cpp
+msgid "Signals Only"
+msgstr "ä»…ä¿¡å·"
+
+#: editor/editor_help_search.cpp
+msgid "Constants Only"
+msgstr "仅常é‡"
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr "仅属性"
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr "仅主题属性"
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr "æˆå‘˜ç±»åž‹"
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr "ç±»"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
msgstr "属性:"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr "Set"
#: editor/editor_inspector.cpp
msgid "Set Multiple:"
-msgstr ""
+msgstr "设置乘数:"
#: editor/editor_log.cpp
msgid "Output:"
@@ -1638,6 +1638,11 @@ msgstr "é¡¹ç›®å¯¼å‡ºå¤±è´¥ï¼Œé”™è¯¯ä»£ç  %d。"
msgid "Error saving resource!"
msgstr "ä¿å­˜èµ„æºå‡ºé”™ï¼"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "好的"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "资æºå¦å­˜ä¸º..."
@@ -1656,7 +1661,7 @@ msgstr "ä¿å­˜å‡ºé”™ã€‚"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
-msgstr ""
+msgstr "ä¸èƒ½æ‰“å¼€ '%s' 。文件å¯èƒ½å·²è¢«ç§»åŠ¨æˆ–åˆ é™¤ã€‚"
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
@@ -1692,10 +1697,22 @@ msgstr "æ­¤æ“ä½œå¿…é¡»åœ¨æ‰“å¼€ä¸€ä¸ªåœºæ™¯åŽæ‰èƒ½æ‰§è¡Œã€‚"
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+"无法ä¿å­˜æ­¤åœºæ™¯ï¼Œå› ä¸ºåŒ…å«å¾ªçŽ¯å®žä¾‹åŒ–ã€‚\n"
+"请解决它,然åŽå°è¯•冿¬¡ä¿å­˜ã€‚"
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr "无法ä¿å­˜åœºæ™¯ï¼Œä¾èµ–项(实例或基类)验è¯å¤±è´¥ã€‚"
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr "无法覆盖ä»å¤„于打开状æ€çš„场景!"
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr "无法加载è¦åˆå¹¶çš„MeshLibraryï¼"
@@ -1865,7 +1882,7 @@ msgstr "éœ€è¦æœ‰æ ¹èŠ‚ç‚¹æ‰èƒ½å®Œæˆæ­¤æ“作。"
#: editor/editor_node.cpp
msgid "Export Tile Set"
-msgstr "导出砖å—集(Tile Set)"
+msgstr "导出ç£è´´é›†"
#: editor/editor_node.cpp
msgid "This operation can't be done without a selected node."
@@ -1939,6 +1956,12 @@ msgstr "无法从路径中加载æ’件脚本: \"%s\"。"
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr "无法从路径加载æ’件脚本: ‘%s’ 脚本看上去似乎有代ç é”™è¯¯ï¼Œè¯·æ£€æŸ¥å…¶è¯­æ³•。"
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr "无法从路径加载æ’件脚本: \"%s\" åŸºç±»åž‹ä¸æ˜¯ EditorPlugin 的。"
@@ -1982,15 +2005,18 @@ msgstr "删除布局"
msgid "Default"
msgstr "默认"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+msgid "Show in FileSystem"
+msgstr "在文件系统中显示"
+
#: editor/editor_node.cpp
-#, fuzzy
msgid "Play This Scene"
-msgstr "è¿è¡Œåœºæ™¯"
+msgstr "è¿è¡Œæ­¤åœºæ™¯"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Close Tab"
-msgstr "关闭其他标签页"
+msgstr "关闭标签页"
#: editor/editor_node.cpp
msgid "Switch Scene Tab"
@@ -2010,7 +2036,7 @@ msgstr "%d 个文件未展示"
#: editor/editor_node.cpp
msgid "Dock Position"
-msgstr "åœé ä½ç½®"
+msgstr "颿¿ä½ç½®"
#: editor/editor_node.cpp
msgid "Distraction Free Mode"
@@ -2065,7 +2091,7 @@ msgid "Save Scene"
msgstr "ä¿å­˜åœºæ™¯"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+msgid "Save All Scenes"
msgstr "ä¿å­˜æ‰€æœ‰åœºæ™¯"
#: editor/editor_node.cpp
@@ -2094,7 +2120,7 @@ msgid "Undo"
msgstr "撤销"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "é‡åš"
@@ -2118,20 +2144,20 @@ msgstr "项目设置"
msgid "Export"
msgstr "导出"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
-msgstr "工具(tools)"
+msgstr "工具"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "打开项目管ç†å™¨ï¼Ÿ"
+msgstr "æ‰“å¼€é¡¹ç›®æ•°æ®æ–‡ä»¶å¤¹"
#: editor/editor_node.cpp
msgid "Quit to Project List"
msgstr "退出到项目列表"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr "调试"
@@ -2229,18 +2255,16 @@ msgid "Toggle Fullscreen"
msgstr "免屿¨¡å¼"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Data/Settings Folder"
-msgstr "编辑器设置"
+msgstr "打开“编辑器设置/æ•°æ®\"文件夹"
#: editor/editor_node.cpp
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "æ‰“å¼€ç¼–è¾‘å™¨æ•°æ®æ–‡ä»¶å¤¹"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Editor Settings Folder"
-msgstr "编辑器设置"
+msgstr "æ‰“å¼€â€œç¼–è¾‘å™¨è®¾ç½®â€æ–‡ä»¶å¤¹"
#: editor/editor_node.cpp editor/project_export.cpp
msgid "Manage Export Templates"
@@ -2250,10 +2274,6 @@ msgstr "管ç†å¯¼å‡ºæ¨¡æ¿"
msgid "Help"
msgstr "帮助"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr "类型"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2324,13 +2344,12 @@ msgstr "è¿è¡Œè‡ªå®šä¹‰åœºæ™¯"
#: editor/editor_node.cpp
msgid "Changing the video driver requires restarting the editor."
-msgstr ""
+msgstr "改å˜è§†é¢‘驱动需è¦é‡å¯ç¼–辑器。"
#: editor/editor_node.cpp editor/project_settings_editor.cpp
#: editor/settings_config_dialog.cpp
-#, fuzzy
msgid "Save & Restart"
-msgstr "ä¿å­˜å¹¶é‡æ–°å¯¼å…¥"
+msgstr "ä¿å­˜å¹¶é‡å¯"
#: editor/editor_node.cpp
msgid "Spins when the editor window repaints!"
@@ -2348,27 +2367,26 @@ msgstr "有更改时更新UI"
msgid "Disable Update Spinner"
msgstr "ç¦ç”¨è‡ªåŠ¨æ›´æ–°"
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "å±žæ€§é¢æ¿"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "导入"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr "节点"
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "文件系统"
#: editor/editor_node.cpp
-#, fuzzy
+msgid "Inspector"
+msgstr "å±žæ€§é¢æ¿"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr "节点"
+
+#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
-msgstr "展开所有"
+msgstr "å±•å¼€åº•éƒ¨é¢æ¿"
#: editor/editor_node.cpp scene/resources/visual_shader.cpp
msgid "Output"
@@ -2447,9 +2465,8 @@ msgid "Thumbnail..."
msgstr "缩略图..."
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit Plugin"
-msgstr "编辑多边形"
+msgstr "编辑æ’ä»¶"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
@@ -2473,15 +2490,13 @@ msgid "Status:"
msgstr "状æ€ï¼š"
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit:"
-msgstr "编辑"
+msgstr "编辑:"
#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Start"
-msgstr "开始ï¼"
+msgstr "开始"
#: editor/editor_profiler.cpp
msgid "Measure:"
@@ -2503,7 +2518,7 @@ msgstr "渲染速度"
msgid "Physics Frame %"
msgstr "物ç†å¸§é€Ÿçއ %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "æ—¶é—´:"
@@ -2527,34 +2542,62 @@ msgstr "æ—¶é—´"
msgid "Calls"
msgstr "调用次数"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr "å¯ç”¨"
#: editor/editor_properties.cpp
msgid "Layer"
-msgstr ""
+msgstr "层"
#: editor/editor_properties.cpp
-#, fuzzy
msgid "Bit %d, value %d"
-msgstr "(Bit)ä½ %d, val %d."
+msgstr "æ¯”ç‰¹ä½ %d ,值 %d"
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr "[空]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
#, fuzzy
-msgid "Assign.."
-msgstr "分é…"
+msgid "Assign..."
+msgstr "分é……。"
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "è·¯å¾„éžæ³•"
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr "被选择的资æºï¼ˆ%s)并ä¸èƒ½åŒ¹é…此属性(%s)应有的类型。"
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+"无法在ä¿å­˜ä¸ºæ–‡ä»¶çš„资æºä¸Šåˆ›å»ºè§†å›¾çº¹ç†ã€‚\n"
+"资æºéœ€è¦å±žäºŽåœºæ™¯ã€‚"
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
+msgstr ""
+"无法在此资æºä¸Šåˆ›å»ºè§†å›¾çº¹ç†, 因为它未设置为本地到场景。\n"
+"请打开上é¢çš„ `本地到场景` 属性 (以åŠåŒ…å«å®ƒçš„æ‰€æœ‰èµ„æºåˆ°èŠ‚ç‚¹)。"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr "选择1个视å£"
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr "新建脚本"
@@ -2566,10 +2609,6 @@ msgstr "新建%s"
msgid "Make Unique"
msgstr "转æ¢ä¸ºç‹¬ç«‹èµ„æº"
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr "在资æºç®¡ç†å™¨ä¸­å±•示"
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2578,7 +2617,8 @@ msgstr "在资æºç®¡ç†å™¨ä¸­å±•示"
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "粘贴"
@@ -2591,36 +2631,32 @@ msgstr "转æ¢ä¸º%s"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Open Editor"
-msgstr "在编辑器中打开"
+msgstr "打开编辑器"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Selected node is not a Viewport!"
msgstr "é€‰å®šçš„èŠ‚ç‚¹ä¸æ˜¯ä¸€ä¸ªViewport节点ï¼"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "Size: "
-msgstr "å•元尺寸:"
+msgstr "尺寸: "
#: editor/editor_properties_array_dict.cpp
msgid "Page: "
-msgstr ""
+msgstr "页: "
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Key:"
-msgstr "æ–°åç§°:"
+msgstr "新建帧:"
#: editor/editor_properties_array_dict.cpp
-#, fuzzy
msgid "New Value:"
-msgstr "æ–°åç§°:"
+msgstr "新建值:"
#: editor/editor_properties_array_dict.cpp
msgid "Add Key/Value Pair"
-msgstr ""
+msgstr "添加帧/值对"
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
@@ -2713,9 +2749,8 @@ msgid "Can't open export templates zip."
msgstr "无法打开ZIP导出模æ¿ã€‚"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Invalid version.txt format inside templates: %s."
-msgstr "æ¨¡æ¿æ–‡ä»¶ä¸­çš„version.txtä¸åˆæ³•。"
+msgstr "æ¨¡æ¿æ–‡ä»¶ï¼š %s 中的 version.txt æ ¼å¼ä¸åˆæ³•。"
#: editor/export_template_manager.cpp
msgid "No version.txt found inside templates."
@@ -2737,7 +2772,7 @@ msgstr "导入:"
msgid ""
"No download links found for this version. Direct download is only available "
"for official releases."
-msgstr "当å‰ç‰ˆæœ¬æ²¡æœ‰ä¸‹è½½é“¾æŽ¥ã€‚ç›´é“¾ä¸‹è½½åªæä¾›å®˜æ–¹æ­£å¼ç‰ˆã€‚"
+msgstr "没有找到这个版本的下载链接。直接下载åªé€‚用于正å¼ç‰ˆæœ¬ã€‚"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -2777,7 +2812,7 @@ msgstr "下载完æˆã€‚"
msgid ""
"Templates installation failed. The problematic templates archives can be "
"found at '%s'."
-msgstr ""
+msgstr "模æ¿å®‰è£…失败。å¯ä»¥åœ¨ '%s' ä¸­æ‰¾åˆ°è¿™äº›é—®é¢˜æ¨¡æ¿æ–‡æ¡£ã€‚"
#: editor/export_template_manager.cpp
msgid "Error requesting url: "
@@ -2858,27 +2893,28 @@ msgid "Download Templates"
msgstr "下载模æ¿"
#: editor/export_template_manager.cpp
-#, fuzzy
msgid "Select mirror from list: (Shift+Click: Open in Browser)"
-msgstr "从列表中选择镜åƒ: "
+msgstr "从列表中选择镜åƒï¼šï¼ˆShift+å•击:在æµè§ˆå™¨ä¸­æ‰“开)"
#: editor/file_type_cache.cpp
msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr "无法以å¯å†™æ–¹å¼æ‰“å¼€file_type_cache.cchï¼"
#: editor/filesystem_dock.cpp
+msgid "Favorites"
+msgstr "æ”¶è—夹"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr "因为文件系统没找到文件,ä¸èƒ½å®šä½åˆ°'%s'ï¼"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a grid of thumbnails."
-msgstr "将项目作为缩略图的网格查看"
+msgstr "ä»¥ç½‘æ ¼ç¼©ç•¥å›¾å½¢å¼æŸ¥çœ‹æ‰€æœ‰é¡¹ã€‚"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "View items as a list."
-msgstr "将项目作为列表查看"
+msgstr "ä»¥åˆ—è¡¨çš„å½¢å¼æŸ¥çœ‹æ‰€æœ‰é¡¹ã€‚"
#: editor/filesystem_dock.cpp
msgid "Status: Import of file failed. Please fix file and reimport manually."
@@ -2904,19 +2940,15 @@ msgstr "å¤åˆ¶å‡ºé”™:"
msgid "Unable to update dependencies:"
msgstr "无法更新ä¾èµ–:"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
-msgstr "未æä¾›åç§°"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
+msgstr "没有æä¾›ä»»ä½•å称。"
#: editor/filesystem_dock.cpp
msgid "Provided name contains invalid characters"
msgstr "æä¾›çš„åç§°åŒ…å«æ— æ•ˆå­—符"
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr "没有æä¾›ä»»ä½•å称。"
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr "åç§°åŒ…å«æ— æ•ˆå­—符。"
@@ -2941,22 +2973,6 @@ msgid "Duplicating folder:"
msgstr "å¤åˆ¶æ–‡ä»¶å¤¹:"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr "展开所有"
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr "收起所有"
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr "é‡å‘½å为..."
-
-#: editor/filesystem_dock.cpp
-msgid "Move To..."
-msgstr "移动..."
-
-#: editor/filesystem_dock.cpp
msgid "Open Scene(s)"
msgstr "打开场景"
@@ -2965,6 +2981,14 @@ msgid "Instance"
msgstr "创建实例节点"
#: editor/filesystem_dock.cpp
+msgid "Add to favorites"
+msgstr "添加到收è—夹"
+
+#: editor/filesystem_dock.cpp
+msgid "Remove from favorites"
+msgstr "从收è—夹中删除"
+
+#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
msgstr "编辑ä¾èµ–..."
@@ -2972,19 +2996,33 @@ msgstr "编辑ä¾èµ–..."
msgid "View Owners..."
msgstr "查看所有者..."
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr "é‡å‘½å为..."
+
#: editor/filesystem_dock.cpp
msgid "Duplicate..."
msgstr "æ‹·è´..."
#: editor/filesystem_dock.cpp
-#, fuzzy
+msgid "Move To..."
+msgstr "移动..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "New Script..."
-msgstr "新建脚本"
+msgstr "新建脚本…"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "New Resource..."
-msgstr "资æºå¦å­˜ä¸º..."
+msgstr "新建资æºâ€¦"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr "全部展开"
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Collapse All"
+msgstr "全部折å "
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3006,29 +3044,18 @@ msgid "Re-Scan Filesystem"
msgstr "釿–°æ‰«ææ–‡ä»¶ç³»ç»Ÿ"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "æ”¶è—目录"
+msgid "Toggle split mode"
+msgstr "åˆ‡æ¢æ‹†åˆ†æ¨¡å¼"
#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Show current scene file."
-msgstr "ä¿å­˜å½“å‰ç¼–辑的å­åœ°ç –(sub-tile)。"
+msgid "Search files"
+msgstr "æœç´¢æ–‡ä»¶"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr "将选中的场景实例为选中节点的å­èŠ‚ç‚¹ã€‚"
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "æœç´¢ç±»åž‹"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
@@ -3036,51 +3063,37 @@ msgstr ""
"æ‰«ææ–‡ä»¶ï¼Œ\n"
"请ç¨å€™ã€‚"
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "移动"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "There is already file or folder with the same name in this location."
-msgstr "已存在与给定å称相åŒçš„目录。"
+msgstr "当å‰ä½ç½®å·²å­˜åœ¨ç›¸åŒå字的文件或目录。"
#: editor/filesystem_dock.cpp
msgid "Overwrite"
-msgstr ""
+msgstr "覆盖"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
msgstr "创建脚本"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find in files"
-msgstr "查找砖å—"
+msgid "Find in Files"
+msgstr "在文件中查找"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Find: "
-msgstr "查找"
+msgid "Find:"
+msgstr "查找:"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Whole words"
-msgstr "全字匹é…"
+msgid "Folder:"
+msgstr "文件夹:"
#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "大å°å†™åŒ¹é…"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Filter: "
-msgstr "筛选:"
+msgid "Filters:"
+msgstr "筛选:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3096,52 +3109,48 @@ msgid "Cancel"
msgstr "å–æ¶ˆ"
#: editor/find_in_files.cpp
-#, fuzzy
+msgid "Find: "
+msgstr "查找: "
+
+#: editor/find_in_files.cpp
msgid "Replace: "
-msgstr "替æ¢"
+msgstr "替æ¢ï¼š "
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Replace all (no undo)"
-msgstr "全部替æ¢"
+msgstr "全部替æ¢ï¼ˆæ— æ³•撤销)"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Searching..."
-msgstr "ä¿å­˜ä¸­..."
+msgstr "æœç´¢ä¸­â€¦"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Search complete"
-msgstr "æœç´¢æ–‡æœ¬"
+msgstr "æœç´¢å®Œæ¯•"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Group name already exists."
-msgstr "错误:已存在åŒå动画ï¼"
+msgstr "分组å称已存在。"
#: editor/groups_editor.cpp
-#, fuzzy
-msgid "invalid Group name."
-msgstr "åç§°éžæ³•:。"
+msgid "Invalid group name."
+msgstr "ç»„åæ— æ•ˆã€‚"
#: editor/groups_editor.cpp editor/node_dock.cpp
msgid "Groups"
msgstr "分组"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes not in Group"
-msgstr "节点分组"
+msgstr "ä¸åœ¨åˆ†ç»„中的节点"
#: editor/groups_editor.cpp editor/scene_tree_dock.cpp
msgid "Filter nodes"
msgstr "筛选节点"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Nodes in Group"
-msgstr "节点分组"
+msgstr "分组中的节点"
#: editor/groups_editor.cpp
msgid "Add to Group"
@@ -3152,9 +3161,8 @@ msgid "Remove from Group"
msgstr "从分组中移除"
#: editor/groups_editor.cpp
-#, fuzzy
msgid "Manage Groups"
-msgstr "图片分组"
+msgstr "管ç†åˆ†ç»„"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Single Scene"
@@ -3186,7 +3194,7 @@ msgstr "与独立的æè´¨å’ŒåŠ¨ç”»ä¸€åŒå¯¼å…¥"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects+Materials+Animations"
-msgstr "ä¸Žç‹¬ç«‹çš„ç‰©ä½“ã€æè´¨å’ŒåŠ¨ç”»ä¸€åŒå¯¼å…¥"
+msgstr "使用å•独的对象 + æè´¨ + 动画导入"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Multiple Scenes"
@@ -3261,18 +3269,13 @@ msgstr "釿–°å¯¼å…¥"
msgid "Failed to load resource."
msgstr "加载资æºå¤±è´¥ã€‚"
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "好的"
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr "展开所有属性"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
-msgstr "收起所有属性"
+msgid "Collapse All Properties"
+msgstr "æŠ˜å æ‰€æœ‰å±žæ€§"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -3288,9 +3291,8 @@ msgid "Paste Params"
msgstr "粘贴帧"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Edit Resource Clipboard"
-msgstr "资æºå‰ªåˆ‡æ¿ä¸­æ— å†…容ï¼"
+msgstr "编辑资æºå‰ªè´´æ¿"
#: editor/inspector_dock.cpp
msgid "Copy Resource"
@@ -3317,6 +3319,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr "从ç£ç›˜ä¸­åŠ è½½èµ„æºå¹¶ç¼–辑。"
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr "ä¿å­˜å½“å‰ç¼–辑的资æºã€‚"
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr "å‰å¾€ä¸Šä¸€ä¸ªç¼–辑对象。"
@@ -3333,9 +3339,8 @@ msgid "Object properties."
msgstr "对象属性。"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Filter properties"
-msgstr "筛选节点"
+msgstr "属性筛选"
#: editor/inspector_dock.cpp
msgid "Changes may be lost!"
@@ -3350,47 +3355,40 @@ msgid "Select a Node to edit Signals and Groups."
msgstr "请选择一个节点æ¥è®¾ç½®ä¿¡å·æˆ–分组。"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Edit a Plugin"
-msgstr "编辑多边形"
+msgstr "编辑一个æ’ä»¶"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Create a Plugin"
-msgstr "创建C#解决方案"
+msgstr "创建一个æ’ä»¶"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Plugin Name:"
-msgstr "æ’件列表"
+msgstr "æ’ä»¶å:"
#: editor/plugin_config_dialog.cpp
msgid "Subfolder:"
-msgstr ""
+msgstr "å­æ–‡ä»¶å¤¹ï¼š"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Language:"
-msgstr "语言"
+msgstr "语言:"
#: editor/plugin_config_dialog.cpp
-#, fuzzy
msgid "Script Name:"
-msgstr "脚本å¯ç”¨"
+msgstr "脚本å:"
#: editor/plugin_config_dialog.cpp
msgid "Activate now?"
-msgstr ""
+msgstr "现在激活å—?"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Create Polygon"
msgstr "创建多边形"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
+msgid "Edit Polygon"
msgstr "编辑多边形"
#: editor/plugins/abstract_polygon_2d_editor.cpp
@@ -3398,34 +3396,33 @@ msgid "Insert Point"
msgstr "æ’入点"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr "编辑多边形(移除顶点)"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
+msgid "Remove Polygon And Point"
msgstr "移除多边形åŠé¡¶ç‚¹"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr "创建一个新的多边形"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+msgid "Create points."
+msgstr "创建点。"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
-"编辑多边形:\n"
-"LMB: 移动点。\n"
-"Ctrl + LMB: 分离片段。\n"
-"人民å¸ï¼š 擦除点。"
+"编辑点:\n"
+"鼠标左键: 移动点\n"
+"é¼ æ ‡å³é”®ï¼š 擦除点"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Delete points"
-msgstr "删除点"
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+msgid "Erase points."
+msgstr "擦除点。"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3440,14 +3437,14 @@ msgstr "添加动画"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
-msgstr "加载"
+msgid "Load..."
+msgstr "加载..."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "This type of node can't be used. Only root nodes are allowed."
-msgstr ""
+msgstr "此类型的节点ä¸èƒ½è¢«ä½¿ç”¨ã€‚ä»…å…许使用根节点。"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3457,73 +3454,64 @@ msgid ""
"AnimationTree is inactive.\n"
"Activate to enable playback, check node warnings if activation fails."
msgstr ""
+"AnimationTree å¤„äºŽéžæ¿€æ´»çжæ€ã€‚\n"
+"激活以使用播放功能,如果激活失败请检查节点警告信æ¯ã€‚"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Set the blending position within the space"
-msgstr ""
+msgstr "在此空间下设置ä½ç½®æ··åˆçжæ€"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Select and move points, create points with RMB."
-msgstr ""
+msgstr "选择并移动点,使用 RMB 创建点。"
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "删除点"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "é¼ æ ‡å³é”®:移除点。"
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr "å¯ç”¨å¸é™„并显示网格。"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Point"
-msgstr "移动点"
+msgstr "点"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Open Animation Node"
-msgstr "动画节点"
+msgstr "打开动画节点"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists"
-msgstr "动作%s已存在ï¼"
+msgstr "三角形已ç»å­˜åœ¨"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "BlendSpace2D does not belong to an AnimationTree node."
-msgstr ""
+msgstr "BlendSpace2D ä¸å±žäºŽä»»ä½• AnimationTree 节点。"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "No triangles exist, so no blending can take place."
-msgstr ""
+msgstr "ä¸å­˜åœ¨ä»»ä½•三角形,因此ä¸ä¼šæœ‰ä»»ä½•混效果åˆäº§ç”Ÿã€‚"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Create triangles by connecting points."
-msgstr ""
+msgstr "通过连接点创建三角形。"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Erase points and triangles."
-msgstr "正在解æžç¬¬%d个三角形:"
+msgstr "擦除点和三角形。"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Generate blend triangles automatically (instead of manually)"
-msgstr ""
+msgstr "自动创建混åˆä¸‰è§’å½¢ï¼ˆéžæ‰‹åŠ¨ï¼‰"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
-msgstr "å¸é™„"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
+msgstr "æ··åˆ:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3532,44 +3520,41 @@ msgstr "编辑筛选器"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Output node can't be added to the blend tree."
-msgstr ""
+msgstr "输出节点ä¸èƒ½è¢«æ·»åŠ åˆ°æ··åˆæ ‘。"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Unable to connect, port may be in use or connection may be invalid."
-msgstr ""
+msgstr "无法连接,端å£å¯èƒ½è¢«å ç”¨æˆ–者连接无效。"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "No animation player set, so unable to retrieve track names."
-msgstr ""
+msgstr "没有设置动画播放器,因此无法获å–轨é“å称。"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Player path set is invalid, so unable to retrieve track names."
-msgstr ""
+msgstr "无效的播放器路劲设置,因此无法获å–轨é“å称。"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
msgid ""
"Animation player has no valid root node path, so unable to retrieve track "
"names."
-msgstr ""
+msgstr "åŠ¨ç”»æ’­æ”¾å™¨æ²¡æœ‰åˆæ³•的根节点路径,因此无法获å–轨é“å称。"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
-msgid "Add Node.."
-msgstr "添加节点"
+msgid "Add Node..."
+msgstr "添加节点.."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filtered Tracks:"
-msgstr "编辑筛选器"
+msgstr "编辑轨é“过滤器:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Enable filtering"
-msgstr "å…许编辑å­å­™èŠ‚ç‚¹"
+msgstr "å…许过滤"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Toggle Autoplay"
@@ -3597,14 +3582,12 @@ msgid "Remove Animation"
msgstr "移除动画"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Invalid animation name!"
-msgstr "错误:动画åä¸åˆæ³•ï¼"
+msgstr "无效的动画åç§°ï¼"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Animation name already exists!"
-msgstr "错误:已存在åŒå动画ï¼"
+msgstr "动画å称已存在ï¼"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -3628,14 +3611,12 @@ msgid "Duplicate Animation"
msgstr "å¤åˆ¶åŠ¨ç”»"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to copy!"
-msgstr "错误:没有拷è´çš„动画ï¼"
+msgstr "æ²¡æœ‰éœ€è¦æ‹·è´çš„动画ï¼"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation resource on clipboard!"
-msgstr "错误:剪切æ¿ä¸­æ²¡æœ‰åŠ¨ç”»èµ„æºï¼"
+msgstr "剪切æ¿ä¸­ä¸å­˜åœ¨åŠ¨ç”»èµ„æºï¼"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Pasted Animation"
@@ -3646,9 +3627,8 @@ msgid "Paste Animation"
msgstr "粘贴动画"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to edit!"
-msgstr "错误:没有选中è¦ç¼–辑的动画ï¼"
+msgstr "没有动画需è¦ç¼–辑ï¼"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
@@ -3692,14 +3672,12 @@ msgid "New"
msgstr "新建"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Transitions..."
-msgstr "编辑事件连接"
+msgstr "编辑过渡方å¼â€¦"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Open in Inspector"
-msgstr "在编辑器中打开"
+msgstr "在属性检查器中打开"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Display list of animations in player."
@@ -3758,9 +3736,8 @@ msgid "Include Gizmos (3D)"
msgstr "包括3D控制器"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Pin AnimationPlayer"
-msgstr "粘贴动画"
+msgstr "固定 AnimationPlayer"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Create New Animation"
@@ -3791,34 +3768,32 @@ msgid "Cross-Animation Blend Times"
msgstr "跨动画时间混åˆ"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "End"
msgstr "终点"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Immediate"
-msgstr ""
+msgstr "å³åˆ»"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Sync"
-msgstr ""
+msgstr "åŒæ­¥"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "At End"
-msgstr ""
+msgstr "在终点"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Travel"
-msgstr ""
+msgstr "行程"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Start and end nodes are needed for a sub-transition."
-msgstr ""
+msgstr "å­è¿‡æ¸¡åŠ¨ç”»éœ€è¦å¼€å§‹å’Œç»“æŸèŠ‚ç‚¹ã€‚"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "No playback resource set at path: %s."
-msgstr "ä¸åœ¨èµ„æºè·¯å¾„下。"
+msgstr "在路径: %s 下没有任何播放资æºã€‚"
#: editor/plugins/animation_state_machine_editor.cpp
msgid ""
@@ -3826,34 +3801,34 @@ msgid ""
"RMB to add new nodes.\n"
"Shift+LMB to create connections."
msgstr ""
+"选择并移动节点。\n"
+"é¼ æ ‡å³é”®æ·»åŠ æ–°èŠ‚ç‚¹ã€‚\n"
+"Shift+鼠标左键创建连接。"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "创建新的 %s"
+msgstr "创建新节点。"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Connect nodes."
-msgstr "连接节点"
+msgstr "连接节点。"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
-msgstr "移除选中轨é“。"
+msgid "Remove selected node or transition."
+msgstr "移除选中的节点或过渡动画"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Toggle autoplay this animation on start, restart or seek to zero."
-msgstr ""
+msgstr "开坿ˆ–关闭动画的自动播放,在开始,é‡å¯æˆ–者æœç´¢0ä½ç½®å¤„。"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Set the end animation. This is useful for sub-transitions."
-msgstr ""
+msgstr "设置终点结æŸåŠ¨ç”»ã€‚è¿™å¯¹äºŽå­è¿‡æ¸¡åŠ¨ç”»éžå¸¸æœ‰ç”¨ã€‚"
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "过渡"
+msgstr "过渡: "
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3907,10 +3882,6 @@ msgid "Amount:"
msgstr "æ•°é‡:"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr "æ··åˆ:"
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr "æ··åˆ0:"
@@ -4051,14 +4022,12 @@ msgid "Asset Download Error:"
msgstr "资æºä¸‹è½½å‡ºé”™:"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading (%s / %s)..."
-msgstr "正在下载"
+msgstr "下载中( %s / %s )…"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Downloading..."
-msgstr "正在下载"
+msgstr "下载中…"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Resolving..."
@@ -4085,14 +4054,12 @@ msgid "Download for this asset is already in progress!"
msgstr "æ­¤èµ„æºæ–‡ä»¶æ­£åœ¨ä¸‹è½½ä¸­ï¼"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "First"
-msgstr "首先"
+msgstr "第一项"
#: editor/plugins/asset_library_editor_plugin.cpp
-#, fuzzy
msgid "Previous"
-msgstr "上一个目录"
+msgstr "上一个"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Next"
@@ -4100,7 +4067,7 @@ msgstr "下一项"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Last"
-msgstr ""
+msgstr "最åŽä¸€é¡¹"
#: editor/plugins/asset_library_editor_plugin.cpp
#: modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -4112,7 +4079,7 @@ msgstr "全部"
msgid "Plugins"
msgstr "æ’ä»¶"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "排åº:"
@@ -4223,29 +4190,28 @@ msgid "Create new horizontal and vertical guides"
msgstr "创建垂直水平标尺"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move pivot"
-msgstr "移动旋转中心ä½ç½®"
+msgstr "移动轴心点"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Rotate CanvasItem"
-msgstr "编辑CanvasItem"
+msgstr "旋转 CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move anchor"
-msgstr "移动动作"
+msgstr "移动锚点"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Resize CanvasItem"
-msgstr "编辑CanvasItem"
+msgstr "调整 CanvasItem 尺寸"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr "缩放包å«é¡¹"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Move CanvasItem"
-msgstr "编辑CanvasItem"
+msgstr "移动 CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Anchors only"
@@ -4265,20 +4231,18 @@ msgstr "粘贴姿势"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
-msgid "Zoom out"
-msgstr "缩å°"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr "警告:容器中的å­çº§åªèƒ½ç”±å®ƒçš„父级确定ä½ç½®ä¸Žå¤§å°ã€‚"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom reset"
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
+msgid "Zoom Reset"
msgstr "é‡ç½®ç¼©æ”¾"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "放大"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr "选择模å¼"
@@ -4307,6 +4271,10 @@ msgid "Rotate Mode"
msgstr "旋转模å¼"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale Mode"
+msgstr "缩放模å¼"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4322,16 +4290,14 @@ msgid "Pan Mode"
msgstr "移动画布"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Toggle snapping."
-msgstr "切æ¢å¸é™„"
+msgstr "开关å¸é™„。"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Use Snap"
msgstr "使用å¸é™„"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snapping Options"
msgstr "å¸é™„选项"
@@ -4373,9 +4339,8 @@ msgid "Snap to node sides"
msgstr "å¸é™„到nodeè¾¹"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Snap to node center"
-msgstr "å¸é™„到node锚点"
+msgstr "å¸é™„到节点中心ä½ç½®"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Snap to other nodes"
@@ -4404,6 +4369,10 @@ msgid "Restores the object's children's ability to be selected."
msgstr "æ¢å¤èŠ‚ç‚¹çš„å­å­™èƒ½å¤Ÿè¢«é€‰ä¸­ã€‚"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Skeleton Options"
+msgstr "骨架选项"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr "显示骨骼"
@@ -4417,12 +4386,11 @@ msgstr "清除IK链"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Make Custom Bone(s) from Node(s)"
-msgstr ""
+msgstr "从节点制作自定义骨骼"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Clear Custom Bones"
-msgstr "清除骨骼"
+msgstr "清除自定义骨骼"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -4455,6 +4423,10 @@ msgid "Show Viewport"
msgstr "显示视图窗å£"
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr "显示组和é”定图标"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr "居中显示选中节点"
@@ -4467,9 +4439,8 @@ msgid "Layout"
msgstr "布局"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Insert keys."
-msgstr "æ’入关键帧"
+msgstr "æ’入帧。"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
@@ -4526,17 +4497,24 @@ msgstr ""
"拖放+ Alt:更改节点类型"
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
-msgstr "创建 Poly3D (多边型3D)"
+msgid "Create Polygon3D"
+msgstr "创建3D多边形"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr "编辑多边形"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
+msgstr "编辑多边形(移除顶点)"
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
msgid "Set Handle"
msgstr "设置处ç†ç¨‹åº"
#: editor/plugins/cpu_particles_editor_plugin.cpp
-#, fuzzy
msgid "CPUParticles"
-msgstr "ç²’å­"
+msgstr "CPUç²’å­"
#: editor/plugins/cpu_particles_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
@@ -4550,11 +4528,11 @@ msgstr "从节点创建å‘射器(Emission)"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Flat0"
-msgstr "Flat0"
+msgstr "å¹³é¢0"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Flat1"
-msgstr "Flat1"
+msgstr "å¹³é¢1"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Ease in"
@@ -4629,37 +4607,9 @@ msgid "Item List Editor"
msgstr "列表编辑器"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-"在这个节点上没有 OccluderPolygon2D 资æºã€‚\n"
-"创建和分é…一个å—?"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr "添加é®å…‰å¤šè¾¹å½¢"
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr "从头开始创建一个新的多边形。"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr "编辑已存在的多边形:"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr "鼠标左键:移动点。"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr "Ctrl+鼠标左键:分割视图å—。"
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr "é¼ æ ‡å³é”®:移除点。"
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr "Mesh为空ï¼"
@@ -4727,7 +4677,7 @@ msgstr "创建轮廓(outlines)"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh"
-msgstr "Mesh"
+msgstr "网络"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Static Body"
@@ -4891,13 +4841,13 @@ msgid "Populate"
msgstr "å¡«å……"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr "创建导航多边形"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
-msgstr "正在生æˆAABB"
+msgid "Generating Visibility Rect"
+msgstr "生æˆå¯è§†åŒ–区域"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -4925,6 +4875,11 @@ msgstr "清除Emission Mask(å‘å°„å±è”½ï¼‰"
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+msgid "Convert to CPUParticles"
+msgstr "转æ¢ä¸º CPU ç²’å­"
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr "ç²’å­"
@@ -4994,13 +4949,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr "需è¦ä½¿ç”¨â€œParticlesMaterialâ€ç±»åž‹çš„å¤„ç†æè´¨ã€‚"
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
-msgstr "生æˆAABB"
+msgid "Generating AABB"
+msgstr "正在生æˆAABB"
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "转æ¢ä¸ºå¤§å†™"
+msgid "Generate AABB"
+msgstr "生æˆAABB"
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5024,6 +4978,10 @@ msgid "Add Point to Curve"
msgstr "呿›²çº¿æ·»åŠ é¡¶ç‚¹"
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Split Curve"
+msgstr "拆分曲线"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr "在曲线中移动顶点"
@@ -5051,6 +5009,10 @@ msgid "Click: Add Point"
msgstr "鼠标左键:添加点"
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr "鼠标左键:拆分片段(曲线内)"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr "é¼ æ ‡å³é”®:删除点"
@@ -5066,11 +5028,6 @@ msgstr "添加点(在空白处)"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr "拆分(曲线)"
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr "删除顶点"
@@ -5088,12 +5045,12 @@ msgstr "选项"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Angles"
-msgstr ""
+msgstr "é•œåƒæ‰‹æŸ„角度"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Mirror Handle Lengths"
-msgstr ""
+msgstr "é•œåƒæ‰‹æŸ„长度"
#: editor/plugins/path_editor_plugin.cpp
msgid "Curve Point #"
@@ -5127,65 +5084,76 @@ msgstr "移除曲线外控制点"
msgid "Remove In-Control Point"
msgstr "移除曲线内控制点"
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr "拆分(曲线)"
+
#: editor/plugins/physical_bone_plugin.cpp
-#, fuzzy
msgid "Move joint"
-msgstr "移动点"
+msgstr "移动关节"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
-msgstr ""
+msgstr "Polygon2D 的骨架属性并没有指å‘一个 Skeleton2D 节点"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Sync bones"
-msgstr "显示骨骼"
+msgid "Sync Bones"
+msgstr "åŒæ­¥éª¨éª¼"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
+msgstr "此多边形没有贴图,请先为它设置贴图åŽå†å°è¯•编辑UV。"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr "创建UV贴图"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon & UV"
-msgstr "创建多边形"
+msgstr "创建多边形和 UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
-msgstr ""
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
-msgstr ""
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "创建水平标尺"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "动作%s已存在ï¼"
+msgid "Remove Internal Vertex"
+msgstr "移除曲线内控制点"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Add Split"
-msgstr "添加顶点"
+msgid "Invalid Polygon (need 3 different vertices)"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "è·¯å¾„éžæ³•ï¼"
+msgid "Add Custom Polygon"
+msgstr "编辑多边形"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "移除顶点"
+msgid "Remove Custom Polygon"
+msgstr "移除多边形åŠé¡¶ç‚¹"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
msgstr "å˜æ¢UV贴图"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
-msgstr ""
+msgid "Transform Polygon"
+msgstr "å¤šè¾¹å½¢å˜æ¢"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Paint Bone Weights"
+msgstr "绘制骨骼æƒé‡"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Open Polygon 2D UV editor."
+msgstr "打开2D多边形UV编辑器。"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
@@ -5193,35 +5161,29 @@ msgstr "2D多边形UV编辑器"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "UV"
-msgstr ""
+msgstr "UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Poly"
-msgstr "编辑多边形"
+msgid "Points"
+msgstr "点"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Splits"
-msgstr "拆分路径"
+msgid "Polygons"
+msgstr "多边形->UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Bones"
-msgstr "添加骨骼"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Create Polygon"
-msgstr "创建多边形"
+msgstr "骨骼"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Move Points"
msgstr "移动点"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
-msgstr "Ctrl:旋转"
+msgstr "Ctrl:旋转"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Shift: Move All"
@@ -5244,25 +5206,27 @@ msgid "Scale Polygon"
msgstr "缩放多边形"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Select a split to erase it"
-msgstr "请先选择一个设置项目 ï¼"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
-msgstr ""
+msgid "Paint weights with specified intensity."
+msgstr "使用指定的强度进行æƒé‡ç»˜åˆ¶ã€‚"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
-msgstr ""
+#, fuzzy
+msgid "Unpaint weights with specified intensity."
+msgstr "使用指定强度清除æƒé‡ç»˜åˆ¶ã€‚"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Radius:"
-msgstr ""
+msgstr "åŠå¾„:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon->UV"
@@ -5277,9 +5241,13 @@ msgid "Clear UV"
msgstr "清除UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Settings"
-msgstr "GridMap设置"
+msgstr "网格设置"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr "å¸é™„"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
@@ -5290,34 +5258,28 @@ msgid "Grid"
msgstr "网格"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Configure Grid:"
-msgstr "设置å¸é™„"
+msgstr "é…置网格:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset X:"
-msgstr "网格åç§»é‡:"
+msgstr "网格 X å移:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset Y:"
-msgstr "网格åç§»é‡:"
+msgstr "网格 Y å移:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step X:"
-msgstr "网格大å°:"
+msgstr "网格 X 步进:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step Y:"
-msgstr "网格大å°:"
+msgstr "网格 Y 步进:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Sync Bones to Polygon"
-msgstr "缩放多边形"
+msgstr "åŒæ­¥éª¨éª¼åˆ°å¤šè¾¹å½¢"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "ERROR: Couldn't load resource!"
@@ -5345,22 +5307,22 @@ msgid "Paste Resource"
msgstr "粘贴资æº"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr "在编辑器中打开"
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr "实例:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr "类型:"
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr "在编辑器中打开"
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr "加载资æº"
@@ -5371,12 +5333,11 @@ msgstr "预加载资æº"
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "AnimationTree has no path set to an AnimationPlayer"
-msgstr ""
+msgstr "AnimationTree 没有设置路径到一个 AnimationPlayer"
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Path to AnimationPlayer is invalid"
-msgstr "动画树ä¸å¯ç”¨ã€‚"
+msgstr "AnimationPlayer 路径无效"
#: editor/plugins/script_editor_plugin.cpp
msgid "Clear Recent Files"
@@ -5387,48 +5348,46 @@ msgid "Close and save changes?"
msgstr "关闭并ä¿å­˜æ›´æ”¹å—?"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error writing TextFile:"
-msgstr "移动文件时出错:\n"
+msgstr "写入文本文件时出错:"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error: could not load file."
+msgstr "错误:无法加载文件。"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error could not load file."
-msgstr "无法加载图片"
+msgstr "错误,无法加载文件。"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error saving file!"
-msgstr "ä¿å­˜ç –å—集失败ï¼"
+msgstr "ä¿å­˜æ–‡ä»¶æ—¶å‡ºé”™ï¼"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr "ä¿å­˜ä¸»é¢˜å‡ºé”™"
+msgid "Error while saving theme."
+msgstr "ä¿å­˜ä¸»é¢˜å‡ºé”™ã€‚"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
+msgid "Error Saving"
msgstr "ä¿å­˜å‡ºé”™"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr "导入主题出错"
+msgid "Error importing theme."
+msgstr "导入主题出错。"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
+msgid "Error Importing"
msgstr "导入出错"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New TextFile..."
-msgstr "新建文件夹 ..."
+msgstr "新建文本文档..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open File"
-msgstr "打开å•个文件"
+msgstr "打开文件"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Save File As..."
msgstr "å¦å­˜ä¸º..."
@@ -5437,6 +5396,14 @@ msgid "Import Theme"
msgstr "导入主题"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr "ä¿å­˜ä¸»é¢˜å‡ºé”™"
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr "ä¿å­˜å‡ºé”™"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr "主题å¦å­˜ä¸º..."
@@ -5446,7 +5413,7 @@ msgstr " 类引用"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
-msgstr ""
+msgstr "åˆ‡æ¢æŒ‰å­—æ¯è¡¨æŽ’åºæ–¹å¼æŽ’列方法。"
#: editor/plugins/script_editor_plugin.cpp
msgid "Sort"
@@ -5477,9 +5444,8 @@ msgid "File"
msgstr "文件"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "New TextFile"
-msgstr "查看文件"
+msgid "Open..."
+msgstr "打开…"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5494,11 +5460,7 @@ msgid "Copy Script Path"
msgstr "æ‹·è´è„šæœ¬è·¯å¾„"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr "在资æºç®¡ç†å™¨ä¸­æ˜¾ç¤º"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
+msgid "History Previous"
msgstr "åŽé€€"
#: editor/plugins/script_editor_plugin.cpp
@@ -5511,6 +5473,10 @@ msgid "Theme"
msgstr "主题"
#: editor/plugins/script_editor_plugin.cpp
+msgid "Import Theme..."
+msgstr "导入主题…"
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Reload Theme"
msgstr "釿–°åŠ è½½ä¸»é¢˜"
@@ -5519,10 +5485,6 @@ msgid "Save Theme"
msgstr "ä¿å­˜ä¸»é¢˜"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
-msgstr "主题å¦å­˜ä¸º"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Close Docs"
msgstr "关闭文档"
@@ -5569,7 +5531,7 @@ msgid "Keep Debugger Open"
msgstr "ä¿æŒè°ƒè¯•器打开"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr "使用外部编辑器进行调试"
#: editor/plugins/script_editor_plugin.cpp
@@ -5577,10 +5539,6 @@ msgid "Open Godot online documentation"
msgstr "打开Godot在线文档"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr "æœç´¢ç±»ã€‚"
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr "æœç´¢æ–‡æ¡£ã€‚"
@@ -5617,37 +5575,32 @@ msgid "Debugger"
msgstr "调试器"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search results"
-msgstr "æœç´¢å¸®åŠ©"
-
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "æœç´¢ç±»åž‹"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr "å†…å»ºè„šæœ¬åªæœ‰åœ¨å…¶æ‰€å±žçš„节点读å–åŽæ‰èƒ½è¢«ä¿®æ”¹"
+msgid "Search Results"
+msgstr "æœç´¢ç»“æžœ"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Line"
-msgstr "行:"
+msgstr "行"
#: editor/plugins/script_text_editor.cpp
msgid "(ignore)"
-msgstr ""
+msgstr "(忽略)"
+
+#: editor/plugins/script_text_editor.cpp
+msgid "Go to Function"
+msgstr "转到函数"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr "标准"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
-msgstr "åªå¯ä»¥æ‹–入文件系统的资æºã€‚"
+msgstr "åªå¯ä»¥æ‹–拽æ¥è‡ªæ–‡ä»¶ç³»ç»Ÿä¸­çš„资æºã€‚"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Lookup Symbol"
-msgstr "代ç è¡¥å…¨"
+msgstr "查找标记"
#: editor/plugins/script_text_editor.cpp
msgid "Pick Color"
@@ -5671,11 +5624,7 @@ msgstr "首字æ¯å¤§å†™"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Syntax Highlighter"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
+msgstr "语法高亮显示"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
@@ -5728,12 +5677,12 @@ msgid "Trim Trailing Whitespace"
msgstr "修剪行åŽç©ºç™½"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
+msgid "Convert Indent to Spaces"
msgstr "将缩进转为空格"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
-msgstr "将缩进转为Tab"
+msgid "Convert Indent to Tabs"
+msgstr "将缩进转为Tabs"
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
@@ -5749,37 +5698,28 @@ msgid "Remove All Breakpoints"
msgstr "移除所有断点"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
+msgid "Go to Next Breakpoint"
msgstr "å‰å¾€ä¸‹ä¸€ä¸ªæ–­ç‚¹"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
+msgid "Go to Previous Breakpoint"
msgstr "å‰å¾€ä¸Šä¸€ä¸ªæ–­ç‚¹"
#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Uppercase"
-msgstr "转æ¢ä¸ºå¤§å†™"
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Convert To Lowercase"
-msgstr "转æ¢ä¸ºå°å†™"
-
-#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr "查找上一项"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
-msgid "Find in files..."
-msgstr "筛选文件..."
+msgid "Find in Files..."
+msgstr "在文件中查找..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
-msgstr "å‰å¾€å‡½æ•°..."
+msgid "Go to Function..."
+msgstr "转到函数..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
-msgstr "å‰å¾€è¡Œ..."
+msgid "Go to Line..."
+msgstr "转到行..."
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
@@ -5791,40 +5731,35 @@ msgstr "ç€è‰²å™¨"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "This skeleton has no bones, create some children Bone2D nodes."
-msgstr ""
+msgstr "该骨架没有骨骼绑定,请创建一些 Bone2D 骨骼å­èŠ‚ç‚¹ã€‚"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton2D"
-msgstr "骨骼..."
+msgstr "2D 骨骼节点"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Make Rest Pose (From Bones)"
-msgstr ""
+msgstr "制作放æ¾å§¿åŠ¿ï¼ˆä»Žéª¨éª¼ï¼‰"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Set Bones to Rest Pose"
-msgstr ""
+msgstr "将骨骼é‡ç½®ä¸ºæ”¾æ¾å§¿åŠ¿"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical bones"
-msgstr "创建导航Mesh(网格)"
+msgstr "创建物ç†éª¨éª¼"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton"
-msgstr "骨骼..."
+msgstr "骨架"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical skeleton"
-msgstr "创建C#解决方案"
+msgstr "创建物ç†éª¨æž¶"
#: editor/plugins/skeleton_ik_editor_plugin.cpp
-#, fuzzy
msgid "Play IK"
-msgstr "播放"
+msgstr "播放 IK"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Orthogonal"
@@ -5875,6 +5810,14 @@ msgid "Animation Key Inserted."
msgstr "æ’入动画键。"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr "音调"
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr "å航"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr "绘制的对象"
@@ -5959,9 +5902,8 @@ msgid "This operation requires a single selected node."
msgstr "æ­¤æ“作åªèƒ½åº”用于å•个选中节点。"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Lock View Rotation"
-msgstr "查看信æ¯"
+msgstr "é”定视角旋转"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Normal"
@@ -6008,9 +5950,8 @@ msgid "Doppler Enable"
msgstr "å¯ç”¨å¤šæ™®å‹’效应"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Cinematic Preview"
-msgstr "创建网格预览"
+msgstr "影片预览"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
@@ -6041,6 +5982,10 @@ msgid "Freelook Speed Modifier"
msgstr "自由视图速度调整"
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr "é”定视角旋转"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr "XFormå¯¹è¯æ¡†"
@@ -6143,11 +6088,6 @@ msgid "Tool Scale"
msgstr "缩放工具"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
-msgid "Snap To Floor"
-msgstr "å¸é™„到网格"
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr "切æ¢è‡ªç”±è§‚察模å¼"
@@ -6157,7 +6097,7 @@ msgstr "å˜æ¢"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap object to floor"
-msgstr ""
+msgstr "å¸é™„物体到地é¢"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Dialog..."
@@ -6188,9 +6128,8 @@ msgid "4 Viewports"
msgstr "4个视å£"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Gizmos"
-msgstr "Gizmos(å¯è§†åŒ–调试工具)"
+msgstr "Gizmos(å°å·¥å…·ï¼‰"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Origin"
@@ -6265,52 +6204,49 @@ msgstr "å‰ï¼ˆper)"
msgid "Post"
msgstr "å‘布(Post)"
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite is empty!"
-msgstr "ä¿å­˜è·¯å¾„为空ï¼"
+msgstr "Sprite 是空的ï¼"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Can't convert a sprite using animation frames to mesh."
-msgstr ""
+msgstr "无法使用动画帧转æ¢ç²¾çµä¸ºç½‘格。"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't replace by mesh."
-msgstr ""
+msgstr "无效的几何体,无法使用网格替æ¢ã€‚"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite"
-msgstr "动画帧"
+msgstr "Sprite ç²¾çµ"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to 2D Mesh"
-msgstr "转æ¢ä¸º%s"
+msgstr "转æ¢ä¸º 2D 网格"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create 2D Mesh"
-msgstr "创建轮廓网格(Outline Mesh)"
+msgstr "创建 2D 网格"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Simplification: "
-msgstr ""
+msgstr "简å•化: "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Grow (Pixels): "
-msgstr "å¸é™„(åƒç´ ï¼‰ï¼š"
+msgstr "扩展(åƒç´ ï¼‰ï¼š "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Update Preview"
-msgstr "预览精çµé›†"
+msgstr "更新预览"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Settings:"
-msgstr "设置"
+msgstr "设置:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
@@ -6385,11 +6321,17 @@ msgid "Set Region Rect"
msgstr "设置纹ç†åŒºåŸŸ"
#: editor/plugins/texture_region_editor_plugin.cpp
+#, fuzzy
+msgid "Set Margin"
+msgstr "设置处ç†ç¨‹åº"
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr "å¸é™„模å¼:"
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr "æ— "
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6414,12 +6356,11 @@ msgstr "步长(秒):"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Sep.:"
-msgstr ""
+msgstr "乿œˆï¼š"
#: editor/plugins/texture_region_editor_plugin.cpp
-#, fuzzy
msgid "TextureRegion"
-msgstr "纹ç†åŒºåŸŸ"
+msgstr "TextureRegion 纹ç†åŒºåŸŸ"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Can't save theme to file:"
@@ -6550,9 +6491,12 @@ msgid "Erase Selection"
msgstr "擦除选中"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Fix Invalid Tiles"
-msgstr "åç§°éžæ³•:。"
+msgstr "ä¿®å¤æ— æ•ˆçš„ç£è´´"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Cut Selection"
+msgstr "切割选择"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
@@ -6575,9 +6519,8 @@ msgid "Erase TileMap"
msgstr "擦除砖å—地图"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Find Tile"
-msgstr "查找砖å—"
+msgstr "查找ç£è´´"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Transpose"
@@ -6593,42 +6536,45 @@ msgstr "沿Y轴翻转"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint Tile"
-msgstr "绘制砖å—地图"
+msgstr "绘制ç£è´´"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Pick Tile"
-msgstr "选择砖å—(Tile)"
+msgstr "选择ç£è´´"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
-msgid "Move Selection"
-msgstr "移除选中项"
+msgid "Copy Selection"
+msgstr "å¤åˆ¶é€‰æ‹©"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Rotate left"
+msgstr "å‘左旋转"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
-msgstr "旋转0度"
+msgid "Rotate right"
+msgstr "å‘峿—‹è½¬"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
-msgstr "旋转90度"
+msgid "Flip horizontally"
+msgstr "水平翻转"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
-msgstr "旋转180度"
+msgid "Flip vertically"
+msgstr "垂直翻转"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
-msgstr "旋转270度"
+msgid "Clear transform"
+msgstr "æ¸…é™¤å˜æ¢"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Add Texture(s) to TileSet"
-msgstr "从树中添加节点"
+msgid "Add Texture(s) to TileSet."
+msgstr "添加纹ç†åˆ°ç£è´´é›†"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
-msgstr "删除当å‰é…置项"
+msgid "Remove selected Texture from TileSet."
+msgstr "从ç£è´´é›†ä¸­åˆ é™¤å½“å‰çº¹ç†"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -6639,86 +6585,212 @@ msgid "Merge from Scene"
msgstr "从场景中åˆå¹¶"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
-msgstr ""
-"请选择一个å­åœ°ç –(sub-tile)作为图标,此图标还会被绑定为无效的地砖(autotile)。"
+msgid "Copy bitmask."
+msgstr "å¤åˆ¶ä½æŽ©ç ã€‚"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
-msgstr ""
+msgid "Paste bitmask."
+msgstr "ç²˜è´´ä½æŽ©ç ã€‚"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Erase bitmask."
+msgstr "æ“¦é™¤ä½æŽ©ç ã€‚"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Create a new polygon."
+msgstr "创建新多边形。"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
+msgstr "使多边形ä½äºŽçº¹ç†åŒºåŸŸä¸­ã€‚"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
+"å¯ç”¨å¸é™„并显示网格\n"
+"ï¼ˆè¯·é€šè¿‡å±žæ€§é¢æ¿è®¾ç½®ï¼‰ã€‚"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Display Tile Names (Hold Alt Key)"
+msgstr "显示ç£è´´çš„åå­—ï¼ˆæŒ‰ä½ Alt 键)"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "确定移除选中的纹ç†ä»¥åŠã€æ‰€æœ‰ã€‘使用它的ã€ç£è´´é›†ã€‘å—?"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
-msgstr ""
+msgstr "请先选择è¦ç§»é™¤çš„纹ç†ã€‚"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
-msgstr "从场景中创建?"
+msgid "Create from scene? This will overwrite all current tiles."
+msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Merge from scene?"
msgstr "确定è¦åˆå¹¶åœºæ™¯ï¼Ÿ"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
-msgstr ""
+#, fuzzy
+msgid "Remove Texture"
+msgstr "移除模æ¿"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
+msgstr "%s 文件没有被添加,因为已添加在列表中。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Drag handles to edit Rect.\n"
"Click on another Tile to edit it."
msgstr ""
+"拖拽手柄以编辑举行。\n"
+"点击å¦ä¸€ä¸ªç£è´´è¿›è¡Œç¼–辑。"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete selected Rect."
+msgstr "删除选中的Rect。"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
msgstr ""
-"鼠标左键: å¯ç”¨è¯¥bit。\n"
-"é¼ æ ‡å³é”®ï¼š ç¦ç”¨è¯¥bit。"
+"选择当å‰ç¼–辑状æ€ä¸‹çš„å­ç£è´´ã€‚\n"
+"点击选择å¦ä¸€ä¸ªç£è´´è¿›è¡Œç¼–辑。"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Delete polygon."
+msgstr "删除多边形。"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
-msgstr "ä¿å­˜å½“å‰ç¼–辑的å­åœ°ç –(sub-tile)。"
+msgstr ""
+"鼠标左键: å¯ç”¨æ¯”特。\n"
+"é¼ æ ‡å³é”®ï¼š 关闭比特。\n"
+"点击å¦ä¸€ä¸ªç£è´´è¿›è¡Œç¼–辑。"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to use as icon, this will be also used on invalid autotile "
"bindings.\n"
"Click on another Tile to edit it."
msgstr ""
-"请选择一个å­åœ°ç –(sub-tile)作为图标,此图标还会被绑定为无效的地砖(autotile)。"
+"选择一个å­ç£è´´ä½œä¸ºå›¾æ ‡ï¼Œæ­¤å›¾æ ‡è¿˜ä¼šç»‘定到无效的自动ç£è´´ä¸Šã€‚\n"
+"点击选择å¦ä¸€ä¸ªç£è´´è¿›è¡Œç¼–辑。"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select sub-tile to change its priority.\n"
"Click on another Tile to edit it."
-msgstr "选择è¦ä¿®æ”¹ä¼˜å…ˆçº§çš„å­åœ°ç –(sub-tile)。"
+msgstr ""
+"选择并修改å­ç£è´´çš„优先级。\n"
+"点击选择å¦ä¸€ä¸ªç£è´´è¿›è¡Œç¼–辑。"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr ""
+"选择并修改å­ç£è´´çš„优先级。\n"
+"点击选择å¦ä¸€ä¸ªç£è´´è¿›è¡Œç¼–辑。"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Set Tile Region"
+msgstr "设置纹ç†åŒºåŸŸ"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid "Create Tile"
+msgstr "新建目录"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "编辑筛选器"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "编辑已存在的多边形:"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "编辑多边形"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "创建导航多边形"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "ç²˜è´´ä½æŽ©ç ã€‚"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "移除模æ¿"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "移除多边形åŠé¡¶ç‚¹"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "添加é®å…‰å¤šè¾¹å½¢"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "创建导航多边形"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "编辑筛选器"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "创建导航多边形"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "添加é®å…‰å¤šè¾¹å½¢"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "This property can't be changed."
-msgstr "æ­¤æ“ä½œå¿…é¡»åœ¨æ‰“å¼€ä¸€ä¸ªåœºæ™¯åŽæ‰èƒ½æ‰§è¡Œã€‚"
+msgstr "ä¸èƒ½ä¿®æ”¹è¯¥å±žæ€§ã€‚"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
+#, fuzzy
+msgid "TileSet"
msgstr "ç –å—集"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vertex"
msgstr "顶点"
@@ -6727,14 +6799,12 @@ msgid "Fragment"
msgstr "片段"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Light"
-msgstr "峿–¹"
+msgstr "ç¯å…‰"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "VisualShader"
-msgstr "ç€è‰²å™¨"
+msgstr "å¯è§†ç€è‰²å™¨"
#: editor/project_export.cpp
msgid "Runnable"
@@ -6753,6 +6823,14 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr "没有此平å°çš„导出模æ¿:"
#: editor/project_export.cpp
+msgid "Release"
+msgstr "å‘行"
+
+#: editor/project_export.cpp
+msgid "Exporting All"
+msgstr "全部导出"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr "预设"
@@ -6761,6 +6839,10 @@ msgid "Add..."
msgstr "添加..."
#: editor/project_export.cpp
+msgid "Export Path"
+msgstr "导出路径"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr "资æº"
@@ -6815,10 +6897,47 @@ msgid "Feature List:"
msgstr "功能列表:"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Script"
+msgstr "新建脚本"
+
+#: editor/project_export.cpp
+msgid "Script Export Mode:"
+msgstr "脚本导出方å¼:"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr "文本"
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr "编译"
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr "使用下列密ç åР坆"
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr "脚本密匙(256ä½16进制ç ï¼‰:"
+
+#: editor/project_export.cpp
msgid "Export PCK/Zip"
msgstr "导出 PCK/ZIP"
#: editor/project_export.cpp
+msgid "Export mode?"
+msgstr "导出模å¼ï¼Ÿ"
+
+#: editor/project_export.cpp
+msgid "Export All"
+msgstr "全部导出"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr "没有下列平å°çš„导出模æ¿:"
@@ -6831,22 +6950,20 @@ msgid "The path does not exist."
msgstr "路径ä¸å­˜åœ¨ã€‚"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
-msgstr "请选择一个ä¸åŒ…å«'project.godot'文件的文件夹。"
+msgstr "无效的“.zipâ€é¡¹ç›®æ–‡ä»¶ï¼Œæ²¡æœ‰åŒ…å«ä¸€ä¸ªâ€œproject.godotâ€æ–‡ä»¶ã€‚"
#: editor/project_manager.cpp
msgid "Please choose an empty folder."
msgstr "请选择一个空目录。"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "请选择一个'project.godot'文件。"
+msgstr "请选择一个“project.godotâ€æˆ–者“.zipâ€æ–‡ä»¶ã€‚"
#: editor/project_manager.cpp
msgid "Directory already contains a Godot project."
-msgstr ""
+msgstr "文件夹已ç»åŒ…å«äº†ä¸€ä¸ªGodot项目。"
#: editor/project_manager.cpp
msgid "Imported Project"
@@ -6936,9 +7053,8 @@ msgid "Project Path:"
msgstr "项目目录:"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Project Installation Path:"
-msgstr "项目目录:"
+msgstr "项目安装路径:"
#: editor/project_manager.cpp
msgid "Browse"
@@ -6949,7 +7065,8 @@ msgid "Unnamed Project"
msgstr "未命å项目"
#: editor/project_manager.cpp
-msgid "Can't open project"
+#, fuzzy
+msgid "Can't open project at '%s'."
msgstr "无法打开项目"
#: editor/project_manager.cpp
@@ -6958,6 +7075,24 @@ msgstr "æ‚¨ç¡®å®šè¦æ‰“开多个项目å—?"
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7056,11 +7191,11 @@ msgid "Mouse Button"
msgstr "鼠标按键"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid ""
"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
-msgstr "无效的æ“作å称。它ä¸èƒ½æ˜¯ç©ºçš„也ä¸èƒ½åŒ…å« '/', ':', '=', '\\' 或者 '\"'。"
+msgstr ""
+"无效的æ“作å称。æ“作åä¸èƒ½ä¸ºç©ºï¼Œä¹Ÿä¸èƒ½åŒ…å« '/', ':', '=', '\\' 或者空字符串"
#: editor/project_settings_editor.cpp
msgid "Action '%s' already exists!"
@@ -7071,18 +7206,16 @@ msgid "Rename Input Action Event"
msgstr "é‡å‘½å输入事件"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Change Action deadzone"
-msgstr "é‡å‘½å动画:"
+msgstr "æ”¹å˜æ“作隔离区"
#: editor/project_settings_editor.cpp
msgid "Add Input Action Event"
msgstr "添加输入事件"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "All Devices"
-msgstr "设备"
+msgstr "所有设备"
#: editor/project_settings_editor.cpp
msgid "Device"
@@ -7129,24 +7262,20 @@ msgid "Wheel Down Button"
msgstr "滚轮å‘下"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Left Button"
-msgstr "滚轮å‘上"
+msgstr "滚轮左键"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Right Button"
-msgstr "å³é”®"
+msgstr "滚轮å³é”®"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 1"
-msgstr "按键 6"
+msgstr "X 按键 1"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 2"
-msgstr "按键 6"
+msgstr "X 按键 2"
#: editor/project_settings_editor.cpp
msgid "Joypad Axis Index:"
@@ -7286,17 +7415,13 @@ msgstr "项目设置(project.godot)"
msgid "General"
msgstr "常规"
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr "属性:"
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr "é‡å†™çš„......"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Editor must be restarted for changes to take effect"
-msgstr ""
+msgstr "编辑器需è¦é‡å¯ä»¥è®©ä¿®æ”¹ç”Ÿæ•ˆ"
#: editor/project_settings_editor.cpp
msgid "Input Map"
@@ -7312,7 +7437,7 @@ msgstr "动作"
#: editor/project_settings_editor.cpp
msgid "Deadzone"
-msgstr ""
+msgstr "隔离区"
#: editor/project_settings_editor.cpp
msgid "Device:"
@@ -7422,10 +7547,6 @@ msgstr "选择一个节点"
msgid "Bit %d, val %d."
msgstr "(Bit)ä½ %d, val %d."
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr "属性:"
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr "选择属性"
@@ -7447,97 +7568,92 @@ msgid "Can't load back converted image using PVRTC tool:"
msgstr "无法加载使用PVRTC工具转æ¢çš„图片:"
#: editor/rename_dialog.cpp editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Batch Rename"
-msgstr "é‡å‘½å"
+msgstr "批é‡é‡å‘½å"
#: editor/rename_dialog.cpp
msgid "Prefix"
-msgstr ""
+msgstr "å‰ç¼€"
#: editor/rename_dialog.cpp
msgid "Suffix"
-msgstr ""
+msgstr "åŽç¼€"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Advanced options"
-msgstr "å¸é™„选项"
+msgstr "高级选项"
#: editor/rename_dialog.cpp
msgid "Substitute"
-msgstr ""
+msgstr "替æ¢"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node name"
-msgstr "节点åç§°:"
+msgstr "节点åç§°"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
-msgstr ""
+msgstr "父节点的å称,如果有的è¯"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node type"
-msgstr "查找节点类型"
+msgstr "节点类型"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Current scene name"
-msgstr "当å‰åœºæ™¯"
+msgstr "当å‰åœºæ™¯åç§°"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Root node name"
-msgstr "节点åç§°:"
+msgstr "根节点åç§°"
#: editor/rename_dialog.cpp
msgid ""
"Sequential integer counter.\n"
"Compare counter options."
msgstr ""
+"é¡ºåºæ•´æ•°è®¡æ•°å™¨ã€‚\n"
+"比较计数器的选项。"
#: editor/rename_dialog.cpp
msgid "Per Level counter"
-msgstr ""
+msgstr "æ¯ä¸ªçº§åˆ«è®¡æ•°å™¨"
#: editor/rename_dialog.cpp
msgid "If set the counter restarts for each group of child nodes"
-msgstr ""
+msgstr "如果设置了计数器,则é‡å¯æ¯ç»„å­èŠ‚ç‚¹"
#: editor/rename_dialog.cpp
msgid "Initial value for the counter"
-msgstr ""
+msgstr "计数器åˆå§‹å€¼"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Step"
-msgstr "步长(秒):"
+msgstr "步长"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
-msgstr ""
+msgid "Amount by which counter is incremented for each node"
+msgstr "由计数器增é‡å¾—到的æ¯ä¸ªèŠ‚ç‚¹çš„æ€»é‡"
#: editor/rename_dialog.cpp
msgid "Padding"
-msgstr ""
+msgstr "å¡«å……"
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
+"计数器数字的最少个数。\n"
+"丢失的数字用0填充在头部。"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Regular Expressions"
-msgstr "更改表达å¼"
+msgstr "正则表达å¼"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Post-Process"
-msgstr "åŽå¤„ç†è„šæœ¬:"
+msgstr "åŽæœŸå¤„ç†"
#: editor/rename_dialog.cpp
msgid "Keep"
@@ -7545,32 +7661,29 @@ msgstr "ä¿æŒä¸å˜"
#: editor/rename_dialog.cpp
msgid "CamelCase to under_scored"
-msgstr ""
+msgstr "驼峰å¼è½¬ä¸ºä¸‹æ¨ªçº¿æ–¹å¼"
#: editor/rename_dialog.cpp
msgid "under_scored to CamelCase"
-msgstr ""
+msgstr "下横线方å¼è½¬ä¸ºé©¼å³°å¼"
#: editor/rename_dialog.cpp
msgid "Case"
-msgstr ""
+msgstr "大å°å†™"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Lowercase"
-msgstr "å°å†™"
+msgstr "转为å°å†™"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Uppercase"
-msgstr "大写"
+msgstr "转为大写"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Reset"
-msgstr "é‡ç½®ç¼©æ”¾"
+msgstr "é‡ç½®"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr "错误"
@@ -7629,6 +7742,10 @@ msgid "Instance Scene(s)"
msgstr "实例化场景"
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr "实例化å­åœºæ™¯"
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr "清除脚本"
@@ -7665,6 +7782,12 @@ msgid "Save New Scene As..."
msgstr "将新场景å¦å­˜ä¸º..."
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr "ç¦ç”¨â€œå¯ç¼–辑实例â€å°†å¯¼è‡´èŠ‚ç‚¹çš„æ‰€æœ‰å±žæ€§æ¢å¤ä¸ºå…¶é»˜è®¤å€¼ã€‚"
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr "å…许编辑å­å­™èŠ‚ç‚¹"
@@ -7677,29 +7800,24 @@ msgid "Make Local"
msgstr "使用本地"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "新节点"
+msgstr "创建根节点:"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "2D Scene"
-msgstr "场景"
+msgstr "2D 场景"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "3D Scene"
-msgstr "场景"
+msgstr "3D 场景"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "User Interface"
-msgstr "清除继承"
+msgstr "用户界é¢"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Custom Node"
-msgstr "剪切节点"
+msgstr "自定义节点"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
@@ -7740,6 +7858,10 @@ msgid "Clear Inheritance"
msgstr "清除继承"
#: editor/scene_tree_dock.cpp
+msgid "Open documentation"
+msgstr "打开Godot文档"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr "删除节点"
@@ -7748,15 +7870,14 @@ msgid "Add Child Node"
msgstr "添加å­èŠ‚ç‚¹"
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
-msgstr "实例化å­åœºæ™¯"
-
-#: editor/scene_tree_dock.cpp
msgid "Change Type"
msgstr "更改类型"
#: editor/scene_tree_dock.cpp
-#, fuzzy
+msgid "Extend Script"
+msgstr "打开脚本"
+
+#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
msgstr "创建场景根节点"
@@ -7807,21 +7928,19 @@ msgid "Clear Inheritance? (No Undo!)"
msgstr "ç¡®å®šè¦æ¸…除继承å—?(无法撤销ï¼ï¼‰"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Toggle Visible"
-msgstr "åˆ‡æ¢ éšè—/å¯è§"
+msgstr "切æ¢å¯è§æ€§"
#: editor/scene_tree_editor.cpp
msgid "Node configuration warning:"
msgstr "节点é…置警告:"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node has connection(s) and group(s).\n"
"Click to show signals dock."
msgstr ""
-"节点具有信å·è¿žæŽ¥å’Œç»„\n"
+"节点具有信å·è¿žæŽ¥å’Œåˆ†ç»„。\n"
"å•å‡»ä»¥æ˜¾ç¤ºä¿¡å·æŽ¥å£ã€‚"
#: editor/scene_tree_editor.cpp
@@ -7841,27 +7960,24 @@ msgstr ""
"å•击显示分组æ ã€‚"
#: editor/scene_tree_editor.cpp editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script"
msgstr "打开脚本"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node is locked.\n"
"Click to unlock it."
msgstr ""
-"节点已é”定\n"
-"点击å¯è§£é”"
+"节点已é”定。\n"
+"点击å¯è§£é”。"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Children are not selectable.\n"
"Click to make selectable."
msgstr ""
"å­èŠ‚ç‚¹æ— æ³•é€‰æ‹©ã€‚\n"
-"å•击使其å¯é€‰"
+"å•击使其å¯é€‰ã€‚"
#: editor/scene_tree_editor.cpp
msgid "Toggle Visibility"
@@ -7872,6 +7988,8 @@ msgid ""
"AnimationPlayer is pinned.\n"
"Click to unpin."
msgstr ""
+"动画播放器被固定。\n"
+"ç‚¹å‡»å–æ¶ˆå›ºå®šã€‚"
#: editor/scene_tree_editor.cpp
msgid "Invalid node name, the following characters are not allowed:"
@@ -7910,15 +8028,18 @@ msgid "N/A"
msgstr "N/A"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script/Choose Location"
-msgstr "打开脚本编辑器"
+msgstr "打开脚本/选择ä½ç½®"
#: editor/script_create_dialog.cpp
msgid "Path is empty"
msgstr "文件路径为空"
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr "文件å为空"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr "必须是项目内的路径"
@@ -8007,20 +8128,8 @@ msgid "Bytes:"
msgstr "字节:"
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr "警告"
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr "错误:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr "æº:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
-msgstr "函数:"
+msgid "Stack Trace"
+msgstr "栈追踪"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8051,18 +8160,6 @@ msgid "Stack Frames"
msgstr "堆栈帧(Stack Frames)"
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr "å˜é‡"
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr "错误:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr "调用堆栈(若适用):"
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr "性能分æž"
@@ -8104,7 +8201,7 @@ msgstr "æ ¼å¼"
#: editor/script_editor_debugger.cpp
msgid "Usage"
-msgstr "用é‡"
+msgstr "用法"
#: editor/script_editor_debugger.cpp
msgid "Misc"
@@ -8151,9 +8248,8 @@ msgid "Change Camera Size"
msgstr "ä¿®æ”¹æ‘„åƒæœºå°ºå¯¸"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Notifier AABB"
-msgstr "修改通知器级别"
+msgstr "修改通知器 AABB"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Particles AABB"
@@ -8180,12 +8276,10 @@ msgid "Change Capsule Shape Height"
msgstr "修改胶囊体高度"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Radius"
msgstr "修改胶囊体åŠå¾„"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Height"
msgstr "修改胶囊体高度"
@@ -8194,24 +8288,20 @@ msgid "Change Ray Shape Length"
msgstr "修改射线形状长度"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Radius"
-msgstr "设置光照åŠå¾„"
+msgstr "改å˜åœ†æŸ±ä½“åŠå¾„"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Height"
msgstr "修改胶囊体高度"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Inner Radius"
-msgstr "更改çƒä½“åŠå¾„"
+msgstr "更改圆环内åŠå¾„"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Outer Radius"
-msgstr "设置光照åŠå¾„"
+msgstr "更改圆环外åŠå¾„"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select the dynamic library for this entry"
@@ -8266,8 +8356,8 @@ msgid "GDNative"
msgstr "GDNative"
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
-msgstr "step傿•°ä¸º0ï¼"
+msgid "Step argument is zero!"
+msgstr "Step傿•°ä¸º 0 ï¼"
#: modules/gdscript/gdscript_functions.cpp
msgid "Not a script with an instance"
@@ -8330,9 +8420,8 @@ msgid "GridMap Delete Selection"
msgstr "删除选择的GridMap"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Fill Selection"
-msgstr "删除选择的GridMap"
+msgstr "填充选择网格地图"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Duplicate Selection"
@@ -8415,9 +8504,8 @@ msgid "Clear Selection"
msgstr "清空选中"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Fill Selection"
-msgstr "所有选中项"
+msgstr "填充已选"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Settings"
@@ -8488,12 +8576,8 @@ msgid "End of inner exception stack trace"
msgstr "内部异常堆栈追朔结æŸ"
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr "烘焙ï¼"
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
-msgstr "烘焙导航网格(mesh)。"
+msgid "Bake NavMesh"
+msgstr "烘焙导航网"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8711,14 +8795,12 @@ msgid "Connect Nodes"
msgstr "连接节点"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Data"
-msgstr "连接节点"
+msgstr "连接节点数æ®"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Connect Node Sequence"
-msgstr "连接节点"
+msgstr "连接节点åºåˆ—"
#: modules/visual_script/visual_script_editor.cpp
msgid "Script already has function '%s'"
@@ -8765,6 +8847,10 @@ msgid "Base Type:"
msgstr "基础类型:"
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr "æˆå‘˜ï¼š"
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr "有效节点:"
@@ -8801,9 +8887,8 @@ msgid "Paste Nodes"
msgstr "粘贴节点"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
-msgstr "æˆå‘˜"
+msgstr "编辑æˆå‘˜"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Input type not iterable: "
@@ -8860,17 +8945,16 @@ msgid ""
msgstr "_step()的返回值无效,必须是整形(seq out)或字符串(error)。"
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Search VisualScript"
-msgstr "删除 VisualScript 节点"
+msgstr "æœç´¢å¯è§†åŒ–脚本节点"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
-msgstr "获å–"
+msgid "Get %s"
+msgstr "得到 %s"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
-msgstr ""
+msgid "Set %s"
+msgstr "设值 %s"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -8921,14 +9005,14 @@ msgstr ""
"节点能正常工作,其余的将被忽略。"
#: scene/2d/collision_object_2d.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
"define its shape."
msgstr ""
-"该节点没有æè¿°å…¶å½¢çŠ¶çš„å­èŠ‚ç‚¹ï¼Œå› æ­¤å®ƒå°†æ— æ³•è¿›è¡Œç¢°æ’žäº¤äº’ã€‚\n"
-"请添加CollisionShape2D或CollisionPolygon2D类型的å­èŠ‚ç‚¹æ¥å®šä¹‰å®ƒçš„形状。"
+"该节点没有æè¿°å…¶å½¢çŠ¶çš„å­èŠ‚ç‚¹ï¼Œå› æ­¤å®ƒæ— æ³•ä¸Žå…¶å®ƒç‰©ä½“äº§ç”Ÿç¢°æ’žæˆ–è€…è¿›è¡Œäº¤äº’ã€‚\n"
+"请添加一个 CollisionShape2D 或 CollisionPolygon2D 类型的å­èŠ‚ç‚¹æ¥å®šä¹‰å®ƒçš„å½¢"
+"状。"
#: scene/2d/collision_polygon_2d.cpp
msgid ""
@@ -8958,6 +9042,12 @@ msgid ""
"shape resource for it!"
msgstr "形状资æºå¿…须是通过CollisionShape2D节点的shape属性创建的ï¼"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr "CPUParticles2D动画需è¦ä½¿ç”¨å¯ç”¨äº†â€œç²’å­åŠ¨ç”»â€çš„CanvasItemMaterial。"
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -9000,6 +9090,12 @@ msgid ""
"imprinted."
msgstr "ç²’å­æè´¨æ²¡æœ‰æŒ‡å®šï¼Œè¯¥è¡Œä¸ºæ— æ•ˆã€‚"
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr "Particles2D 动画需è¦ä½¿ç”¨å¯ç”¨äº†â€œç²’å­åŠ¨ç”»â€çš„CanvasItemMaterial。"
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr "PathFollow2Dç±»åž‹çš„èŠ‚ç‚¹åªæœ‰ä½œä¸ºPath2Dçš„å­èŠ‚ç‚¹èŠ‚æ‰èƒ½æ­£å¸¸å·¥ä½œã€‚"
@@ -9020,16 +9116,17 @@ msgstr "Path属性必须指å‘ä¸€ä¸ªåˆæ³•çš„Node2D节点æ‰èƒ½æ­£å¸¸å·¥ä½œã€‚"
#: scene/2d/skeleton_2d.cpp
msgid "This Bone2D chain should end at a Skeleton2D node."
-msgstr ""
+msgstr "该 Bone2D 链æ¡åº”该以一个 Skeleton2D 节点结æŸã€‚"
#: scene/2d/skeleton_2d.cpp
msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
msgstr ""
+"Bone2D 节点仅适用于一个 Skeleton2D 节点或者å¦ä¸€ä¸ªä½œä¸ºçˆ¶èŠ‚ç‚¹çš„ Bone2D 节点。"
#: scene/2d/skeleton_2d.cpp
msgid ""
"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
-msgstr ""
+msgstr "该骨骼没有一个åˆé€‚çš„ REST 姿势。请到 Skeleton2D 节点中设置一个。"
#: scene/2d/visibility_notifier_2d.cpp
msgid ""
@@ -9090,14 +9187,13 @@ msgid "Lighting Meshes: "
msgstr "正在对网格进行照明 "
#: scene/3d/collision_object.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape or CollisionPolygon as a child to define "
"its shape."
msgstr ""
-"该节点没有æè¿°å…¶å½¢çŠ¶çš„å­èŠ‚ç‚¹ï¼Œå› æ­¤å®ƒå°†æ— æ³•è¿›è¡Œç¢°æ’žäº¤äº’ã€‚\n"
-"请添加CollisionShape或CollisionPolygon类型的å­èŠ‚ç‚¹æ¥å®šä¹‰å®ƒçš„形状。"
+"该节点没有æè¿°å…¶å½¢çŠ¶çš„å­èŠ‚ç‚¹ï¼Œå› æ­¤å®ƒæ— æ³•ä¸Žå…¶å®ƒç‰©ä½“äº§ç”Ÿç¢°æ’žæˆ–è€…è¿›è¡Œäº¤äº’ã€‚\n"
+"请添加一个 CollisionShape 或 CollisionPolygon 类型的å­èŠ‚ç‚¹æ¥å®šä¹‰å®ƒçš„形状。"
#: scene/3d/collision_polygon.cpp
msgid ""
@@ -9129,6 +9225,16 @@ msgstr ""
"CollisionShape节点必须拥有一个形状æ‰èƒ½è¿›è¡Œç¢°æ’žæ£€æµ‹å·¥ä½œï¼Œè¯·ä¸ºå®ƒåˆ›å»ºä¸€ä¸ªå½¢çŠ¶èµ„"
"æºï¼"
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr "无物å¯è§ï¼Œå› ä¸ºæ²¡æœ‰æŒ‡å®šç½‘格。"
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr "CPUParticles动画需è¦ä½¿ç”¨å¯åŠ¨äº†â€œBillboard Particlesâ€çš„SpatialMaterial。"
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr "正在绘制网格"
@@ -9149,6 +9255,27 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr "ç²’å­ä¸å¯è§ï¼Œå› ä¸ºæ²¡æœ‰ç½‘æ ¼(meshe)指定到绘制通é“(draw passes)。"
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr "ç²’å­åŠ¨ç”»éœ€è¦ä½¿ç”¨å¯ç”¨äº†â€œBillboard Particlesâ€çš„SpatialMaterial。"
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr "PathFollowç±»åž‹çš„èŠ‚ç‚¹åªæœ‰ä½œä¸ºPath类型节点的å­èŠ‚ç‚¹æ‰èƒ½æ­£å¸¸å·¥ä½œã€‚"
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+"OrientedPathFollow ç±»åž‹çš„èŠ‚ç‚¹åªæœ‰ä½œä¸ºPath类型节点的å­èŠ‚ç‚¹æ‰èƒ½æ­£å¸¸å·¥ä½œã€‚"
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr "OrientedPathFollow 需è¦åœ¨å…¶çˆ¶è·¯å¾„中å¯ç”¨â€œUp Vectorsâ€ã€‚"
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9182,18 +9309,16 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid "This body will be ignored until you set a mesh"
-msgstr ""
+msgstr "这个物体将被忽略,除éžè®¾ç½®ä¸€ä¸ªç½‘æ ¼"
#: scene/3d/soft_body.cpp
-#, fuzzy
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
-"对RigidBody(在character或rigid模å¼ä¸‹ï¼‰çš„尺寸修改,在è¿è¡Œæ—¶ä¼šè¢«ç‰©ç†å¼•擎的覆"
-"盖。\n"
-"建议您修改å­èŠ‚ç‚¹çš„ç¢°æ’žå½¢çŠ¶ã€‚"
+"对 SoftBody 尺寸的修改,将会在è¿è¡Œæ—¶è¢«ç‰©ç†å¼•擎所覆盖。\n"
+"建议修改å­èŠ‚ç‚¹çš„ç¢°æ’žä½“å½¢çŠ¶å°ºå¯¸ã€‚"
#: scene/3d/sprite_3d.cpp
msgid ""
@@ -9213,44 +9338,43 @@ msgstr ""
#: scene/animation/animation_blend_tree.cpp
msgid "On BlendTree node '%s', animation not found: '%s'"
-msgstr ""
+msgstr "在 BlendTree 节点 '%s' 上没有å‘现动画: '%s'"
#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "动画工具"
+msgstr "没有动画: '%s'"
#: scene/animation/animation_tree.cpp
msgid "In node '%s', invalid animation: '%s'."
-msgstr ""
+msgstr "在节点 '%s' 上的动画无效: '%s' 。"
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "错误:动画åä¸åˆæ³•ï¼"
+msgstr "无效动画: '%s' 。"
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "å–æ¶ˆ'%s'的连接'%s'"
+msgstr "没有任何物体连接到节点 '%s' 的输入 '%s' 。"
#: scene/animation/animation_tree.cpp
msgid "A root AnimationNode for the graph is not set."
-msgstr ""
+msgstr "图表没有设置动画节点作为根节点。"
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Path to an AnimationPlayer node containing animations is not set."
-msgstr "在场景树中选择一个AnimationPlayeræ¥ç¼–辑动画。"
+msgstr "包å«åŠ¨ç”»çš„ AnimationPlayer 节点没有设置路径。"
#: scene/animation/animation_tree.cpp
msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
-msgstr ""
+msgstr "动画播放器的路径没有加载一个 AnimationPlayer 节点。"
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "AnimationPlayer root is not a valid node."
-msgstr "动画树ä¸å¯ç”¨ã€‚"
+msgstr "AnimationPlayer çš„æ ¹èŠ‚ç‚¹ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆçš„节点。"
+
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr "这个节点已被弃用。请使用Animation Tree代替。"
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
@@ -9268,10 +9392,6 @@ msgstr "æç¤ºï¼"
msgid "Please Confirm..."
msgstr "请确认..."
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr "选择当å‰ç›®å½•"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9281,6 +9401,10 @@ msgstr ""
"Popupå¯¹è±¡é»˜è®¤ä¿æŒéšè—,除éžä½ è°ƒç”¨popup()或其他popup相关方法。编辑时å¯ä»¥è®©å®ƒä»¬"
"ä¿æŒå¯è§ï¼Œä½†å®ƒåœ¨è¿è¡Œæ—¶ä»¬ä¼šè‡ªåЍéšè—。"
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr "如果exp_edit为true, 则min_value必须为>0。"
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9328,31 +9452,223 @@ msgid "Invalid font size."
msgstr "字体大å°éžæ³•。"
#: scene/resources/visual_shader.cpp
-#, fuzzy
msgid "Input"
-msgstr "添加输入事件"
-
-#: scene/resources/visual_shader.cpp
-#, fuzzy
-msgid "None"
-msgstr "æ— "
+msgstr "输入"
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for shader."
-msgstr "输入æºéžæ³•ï¼"
+msgstr "éžæ³•çš„ç€è‰²å™¨æºã€‚"
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
-msgstr ""
+msgstr "对函数的赋值。"
#: servers/visual/shader_language.cpp
msgid "Assignment to uniform."
-msgstr ""
+msgstr "对uniform的赋值。"
#: servers/visual/shader_language.cpp
msgid "Varyings can only be assigned in vertex function."
-msgstr ""
+msgstr "å˜é‡åªèƒ½åœ¨é¡¶ç‚¹å‡½æ•°ä¸­æŒ‡å®šã€‚"
+
+#~ msgid "Split point with itself."
+#~ msgstr "拆分点本身。"
+
+#~ msgid "Split can't form an existing edge."
+#~ msgstr "ä¸èƒ½ä»Žå·²å­˜åœ¨çš„边上拆分。"
+
+#~ msgid "Split already exists."
+#~ msgstr "拆分已存在。"
+
+#~ msgid "Add Split"
+#~ msgstr "添加分裂"
+
+#~ msgid "Invalid Split: "
+#~ msgstr "无效拆分: "
+
+#~ msgid "Remove Split"
+#~ msgstr "移除拆分"
+
+#~ msgid "Poly"
+#~ msgstr "多边形"
+
+#~ msgid "Splits"
+#~ msgstr "拆分"
+
+#~ msgid "Connect two points to make a split."
+#~ msgstr "连接两个点以进行分割。"
+
+#~ msgid "Select a split to erase it."
+#~ msgstr "选择一个拆分以擦除它。"
+
+#~ msgid "No name provided"
+#~ msgstr "未æä¾›åç§°"
+
+#~ msgid "Add Node.."
+#~ msgstr "添加节点.."
+
+#~ msgid "Create from scene?"
+#~ msgstr "从场景中创建?"
+
+#~ msgid "Create Poly"
+#~ msgstr "创建多边形"
+
+#~ msgid "Create a new polygon from scratch"
+#~ msgstr "创建一个新的多边形"
+
+#~ msgid "Zoom out"
+#~ msgstr "缩å°"
+
+#~ msgid "Zoom in"
+#~ msgstr "放大"
+
+#~ msgid "Create Poly3D"
+#~ msgstr "创建 Poly3D (多边型3D)"
+
+#~ msgid ""
+#~ "No OccluderPolygon2D resource on this node.\n"
+#~ "Create and assign one?"
+#~ msgstr ""
+#~ "在这个节点上没有 OccluderPolygon2D 资æºã€‚\n"
+#~ "创建和分é…一个å—?"
+
+#~ msgid "LMB: Move Point."
+#~ msgstr "鼠标左键:移动点。"
+
+#~ msgid "Ctrl+LMB: Split Segment."
+#~ msgstr "Ctrl+鼠标左键:分割视图å—。"
+
+#~ msgid "RMB: Erase Point."
+#~ msgstr "é¼ æ ‡å³é”®:移除点。"
+
+#~ msgid "New TextFile"
+#~ msgstr "新建文本文件"
+
+#~ msgid "Save Theme As"
+#~ msgstr "主题å¦å­˜ä¸º"
+
+#~ msgid "<None>"
+#~ msgstr "æ— "
+
+#~ msgid ""
+#~ "Select sub-tile to use as icon, this will be also used on invalid "
+#~ "autotile bindings."
+#~ msgstr ""
+#~ "请选择一个å­åœ°ç –(sub-tile)作为图标,此图标还会被绑定为无效的地砖"
+#~ "(autotile)。"
+
+#~ msgid "Zoom:"
+#~ msgstr "缩放:"
+
+#~ msgid "Are you sure you want to remove all connections from the \""
+#~ msgstr "您确定è¦ç§»é™¤æ‰€æœ‰å¹¿æ’­è¿žæŽ¥ä»Ž \""
+
+#~ msgid "Class List:"
+#~ msgstr "类型列表:"
+
+#~ msgid "Search Classes"
+#~ msgstr "æœç´¢ç±»åž‹"
+
+#~ msgid "Public Methods"
+#~ msgstr "公共方法"
+
+#~ msgid "Public Methods:"
+#~ msgstr "公共方法:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "GUI主题项目"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "GUI主题:"
+
+#~ msgid "Property: "
+#~ msgstr "属性: "
+
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "开关文件夹的收è—状æ€ã€‚"
+
+#~ msgid "Show current scene file."
+#~ msgstr "显示当å‰åœºæ™¯æ–‡ä»¶ã€‚"
+
+#~ msgid "Enter tree-view."
+#~ msgstr "进入树形查看器。"
+
+#~ msgid "Whole words"
+#~ msgstr "全字匹é…"
+
+#~ msgid "Match case"
+#~ msgstr "匹é…大å°å†™"
+
+#~ msgid "Filter: "
+#~ msgstr "过滤: "
+
+#~ msgid "Ok"
+#~ msgstr "好的"
+
+#~ msgid "Show In File System"
+#~ msgstr "在资æºç®¡ç†å™¨ä¸­æ˜¾ç¤º"
+
+#~ msgid "Search the class hierarchy."
+#~ msgstr "æœç´¢ç±»ã€‚"
+
+#~ msgid "Search in files"
+#~ msgstr "在文件中æœç´¢"
+
+#~ msgid ""
+#~ "Built-in scripts can only be edited when the scene they belong to is "
+#~ "loaded"
+#~ msgstr "å†…å»ºè„šæœ¬åªæœ‰åœ¨å…¶æ‰€å±žåœºæ™¯åŠ è½½å®ŒåŽæ‰å¯ä»¥ç¼–辑"
+
+#~ msgid "Convert To Uppercase"
+#~ msgstr "转æ¢ä¸ºå¤§å†™"
+
+#~ msgid "Convert To Lowercase"
+#~ msgstr "转æ¢ä¸ºå°å†™"
+
+#~ msgid "Snap To Floor"
+#~ msgstr "å¸é™„到地é¢"
+
+#~ msgid "Rotate 0 degrees"
+#~ msgstr "旋转0度"
+
+#~ msgid "Rotate 90 degrees"
+#~ msgstr "旋转90度"
+
+#~ msgid "Rotate 180 degrees"
+#~ msgstr "旋转180度"
+
+#~ msgid "Rotate 270 degrees"
+#~ msgstr "旋转270度"
+
+#~ msgid "Warning"
+#~ msgstr "警告"
+
+#~ msgid "Error:"
+#~ msgstr "错误:"
+
+#~ msgid "Source:"
+#~ msgstr "æº:"
+
+#~ msgid "Function:"
+#~ msgstr "函数:"
+
+#~ msgid "Variable"
+#~ msgstr "å˜é‡"
+
+#~ msgid "Errors:"
+#~ msgstr "错误:"
+
+#~ msgid "Stack Trace (if applicable):"
+#~ msgstr "调用堆栈(若适用):"
+
+#~ msgid "Bake!"
+#~ msgstr "烘焙ï¼"
+
+#~ msgid "Bake the navigation mesh."
+#~ msgstr "烘焙导航网格(mesh)。"
+
+#~ msgid "Get"
+#~ msgstr "获å–"
#~ msgid "Change Scalar Constant"
#~ msgstr "修改Scalar常é‡ç³»æ•°"
@@ -9558,9 +9874,6 @@ msgstr ""
#~ msgid "Run Script"
#~ msgstr "è¿è¡Œè„šæœ¬"
-#~ msgid "Save the currently edited resource."
-#~ msgstr "ä¿å­˜å½“å‰ç¼–辑的资æºã€‚"
-
#~ msgid "Stop Profiling"
#~ msgstr "åœæ­¢"
@@ -9856,9 +10169,6 @@ msgstr ""
#~ msgid "Could not save atlas subtexture:"
#~ msgstr "无法ä¿å­˜ç²¾çµé›†å­è´´å›¾:"
-#~ msgid "Exporting for %s"
-#~ msgstr "正在导出 %s"
-
#~ msgid "Setting Up..."
#~ msgstr "é…ç½®..."
@@ -9963,9 +10273,6 @@ msgstr ""
#~ msgid "Source Font:"
#~ msgstr "æºå­—体文件:"
-#~ msgid "Source Font Size:"
-#~ msgstr "æºå­—体大å°:"
-
#~ msgid "Dest Resource:"
#~ msgstr "目标资æº:"
@@ -10042,9 +10349,6 @@ msgstr ""
#~ msgid "Start(s)"
#~ msgstr "起点"
-#~ msgid "Filters"
-#~ msgstr "筛选"
-
#~ msgid "Source path is empty."
#~ msgstr "æºè·¯å¾„为空。"
@@ -10315,15 +10619,9 @@ msgstr ""
#~ msgid "Stereo"
#~ msgstr "立体声"
-#~ msgid "Pitch"
-#~ msgstr "音调"
-
#~ msgid "Window"
#~ msgstr "窗å£"
-#~ msgid "Move Right"
-#~ msgstr "å‘å³ç§»åЍ"
-
#~ msgid "Scaling to %s%%."
#~ msgstr "缩放到%s%%。"
@@ -10400,9 +10698,6 @@ msgstr ""
#~ msgid "just pressed"
#~ msgstr "正好按下"
-#~ msgid "just released"
-#~ msgstr "刚好释放"
-
#~ msgid ""
#~ "Couldn't read the certificate file. Are the path and password both "
#~ "correct?"
@@ -10703,21 +10998,6 @@ msgstr ""
#~ msgid "Trailing Silence:"
#~ msgstr "å°¾éšæ²‰é»˜(Trailing Silence):"
-#~ msgid "Script Export Mode:"
-#~ msgstr "脚本导出方å¼:"
-
-#~ msgid "Text"
-#~ msgstr "文本"
-
-#~ msgid "Compiled"
-#~ msgstr "编译"
-
-#~ msgid "Encrypted (Provide Key Below)"
-#~ msgstr "使用下列密ç åР坆"
-
-#~ msgid "Script Encryption Key (256-bits as hex):"
-#~ msgstr "脚本密匙(256ä½16进制ç ï¼‰:"
-
#~ msgid "Export Project PCK"
#~ msgstr "导出项目PCK文件"
@@ -10727,9 +11007,6 @@ msgstr ""
#~ msgid "Project Export"
#~ msgstr "项目导出"
-#~ msgid "Export Preset:"
-#~ msgstr "导出预设:"
-
#~ msgid "BakedLightInstance does not contain a BakedLight resource."
#~ msgstr "BakedLightInstance未包å«BakedLight资æºã€‚"
@@ -10784,11 +11061,6 @@ msgstr ""
#~ msgid "Scale Region Editor"
#~ msgstr "缩放区域编辑"
-#~ msgid ""
-#~ "No texture in this node.\n"
-#~ "Set a texture to be able to edit region."
-#~ msgstr "此节点没有贴图,请先为它设置贴图åŽå†è¯•。"
-
#~ msgid "Inherit Scene"
#~ msgstr "继承场景"
diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po
index 9897e6f5a5..90e222dcb2 100644
--- a/editor/translations/zh_HK.po
+++ b/editor/translations/zh_HK.po
@@ -1,6 +1,6 @@
# Chinese (Hong Kong) translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
#
# Wesley (zx-wt) <ZX_WT@ymail.com>, 2016-2017.
@@ -8,7 +8,8 @@
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2017-11-26 14:45+0000\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:44+0100\n"
"Last-Translator: zx-wt <ZX_WT@ymail.com>\n"
"Language-Team: Chinese (Hong Kong) <https://hosted.weblate.org/projects/"
"godot-engine/godot/zh_Hant_HK/>\n"
@@ -17,7 +18,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 2.18-dev\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -25,7 +26,7 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr ""
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
@@ -269,7 +270,6 @@ msgstr "新增 %d 個新軌跡並æ’入關éµå¹€ï¼Ÿ"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
#, fuzzy
@@ -408,8 +408,7 @@ msgstr "縮放selection"
msgid "Scale From Cursor"
msgstr "由鼠標縮放"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
#, fuzzy
msgid "Duplicate Selection"
msgstr "複製 Selection"
@@ -426,12 +425,12 @@ msgstr "刪除é¸ä¸­æª”案"
#: editor/animation_track_editor.cpp
#, fuzzy
-msgid "Goto Next Step"
+msgid "Go to Next Step"
msgstr "跳到下一步"
#: editor/animation_track_editor.cpp
#, fuzzy
-msgid "Goto Prev Step"
+msgid "Go to Previous Step"
msgstr "跳到上一步"
#: editor/animation_track_editor.cpp
@@ -543,11 +542,11 @@ msgstr "沒有相åŒ"
msgid "Replaced %d occurrence(s)."
msgstr "å–代了 %d 個。"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "符åˆå¤§å°å¯«"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "完整詞語"
@@ -564,15 +563,19 @@ msgstr "全部å–代"
msgid "Selection Only"
msgstr "åªé™é¸ä¸­"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "放大"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "縮å°"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "é‡è¨­ç¸®æ”¾æ¯”例"
@@ -581,11 +584,10 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "放大"
+msgid "Font Size:"
+msgstr ""
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
#, fuzzy
msgid "Line:"
msgstr "行:"
@@ -617,6 +619,7 @@ msgstr "添加"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -698,7 +701,7 @@ msgid "Edit Connection: "
msgstr "編輯連接"
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -750,23 +753,20 @@ msgid "Recent:"
msgstr "最近:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "æœå°‹ï¼š"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "å»åˆï¼š"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "æè¿°ï¼š"
@@ -801,8 +801,7 @@ msgid "Resource"
msgstr "資æº"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "路徑"
@@ -823,9 +822,10 @@ msgid "Search Replacement Resource:"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -857,7 +857,7 @@ msgid "Error loading:"
msgstr "載入錯誤:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+msgid "Load failed due to missing dependencies:"
msgstr ""
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -918,14 +918,6 @@ msgstr "動畫變化數值"
msgid "Thanks from the Godot community!"
msgstr "Godot社å€çš„æ„Ÿè¬ï¼"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr "OK"
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Godot Engine è²¢ç»è€…"
@@ -1024,7 +1016,7 @@ msgid "Uncompressing Assets"
msgstr "導入中:"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+msgid "Package installed successfully!"
msgstr ""
#: editor/editor_asset_installer.cpp
@@ -1112,8 +1104,7 @@ msgid "Bus options"
msgstr "é¸é …"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "複製"
@@ -1292,7 +1283,7 @@ msgid "Add AutoLoad"
msgstr "新增AutoLoad"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "路徑:"
@@ -1300,8 +1291,8 @@ msgstr "路徑:"
msgid "Node Name:"
msgstr ""
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "å稱"
@@ -1373,13 +1364,18 @@ msgid "Template file not found:"
msgstr "未找到佈局å稱ï¼"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+#, fuzzy
+msgid "Select Current Folder"
+msgstr "新增資料夾"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "檔案已存在, è¦è¦†è“‹å—Ž?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
#, fuzzy
-msgid "Select Current Folder"
-msgstr "新增資料夾"
+msgid "Select This Folder"
+msgstr "鏿“‡æ¨¡å¼"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
@@ -1387,13 +1383,14 @@ msgstr "複製路徑"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr "開啟 Project Manager?"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
-msgstr ""
+#, fuzzy
+msgid "Show in File Manager"
+msgstr "開啟 Project Manager?"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
@@ -1429,7 +1426,8 @@ msgid "Open a File or Directory"
msgstr "鏿“‡è³‡æ–™å¤¾/檔案"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "儲存"
@@ -1490,8 +1488,7 @@ msgstr "資料夾和檔案:"
msgid "Preview:"
msgstr "é è¦½:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "檔案:"
@@ -1508,26 +1505,12 @@ msgstr ""
msgid "(Re)Importing Assets"
msgstr "導入中:"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search Help"
-msgstr "在幫助檔æœå°‹"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr ""
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr ""
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Top"
msgstr "最頂"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr ""
@@ -1545,29 +1528,32 @@ msgid "Brief Description:"
msgstr "簡述:"
#: editor/editor_help.cpp
-msgid "Members"
+msgid "Properties"
msgstr ""
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
+#: editor/editor_help.cpp
+msgid "Properties:"
msgstr ""
#: editor/editor_help.cpp
#, fuzzy
-msgid "Public Methods"
+msgid "Methods"
msgstr "鏿“‡æ¨¡å¼"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr ""
+#, fuzzy
+msgid "Methods:"
+msgstr "鏿“‡æ¨¡å¼"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr ""
+#, fuzzy
+msgid "Theme Properties"
+msgstr "篩é¸:"
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr ""
+#, fuzzy
+msgid "Theme Properties:"
+msgstr "篩é¸:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1598,7 +1584,12 @@ msgstr ""
#: editor/editor_help.cpp
#, fuzzy
-msgid "Description"
+msgid "Class Description"
+msgstr "æè¿°ï¼š"
+
+#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
msgstr "æè¿°ï¼š"
#: editor/editor_help.cpp
@@ -1614,12 +1605,14 @@ msgid ""
msgstr ""
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr ""
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "簡述:"
#: editor/editor_help.cpp
-msgid "Property Description:"
-msgstr ""
+#, fuzzy
+msgid "Property Descriptions:"
+msgstr "簡述:"
#: editor/editor_help.cpp
msgid ""
@@ -1629,12 +1622,13 @@ msgstr ""
#: editor/editor_help.cpp
#, fuzzy
-msgid "Methods"
-msgstr "鏿“‡æ¨¡å¼"
+msgid "Method Descriptions"
+msgstr "æè¿°ï¼š"
#: editor/editor_help.cpp
-msgid "Method Description:"
-msgstr ""
+#, fuzzy
+msgid "Method Descriptions:"
+msgstr "æè¿°ï¼š"
#: editor/editor_help.cpp
msgid ""
@@ -1642,12 +1636,59 @@ msgid ""
"$color][url=$url]contributing one[/url][/color]!"
msgstr ""
-#: editor/editor_inspector.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
+msgid "Search Help"
+msgstr "在幫助檔æœå°‹"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Display All"
+msgstr "全部å–代"
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
#, fuzzy
-msgid "Property: "
+msgid "Methods Only"
msgstr "鏿“‡æ¨¡å¼"
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "訊號"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Constants Only"
+msgstr "常數"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Properties Only"
+msgstr "鏿“‡æ¨¡å¼"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Theme Properties Only"
+msgstr "鏿“‡æ¨¡å¼"
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Class"
+msgstr ""
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1683,6 +1724,11 @@ msgstr ""
msgid "Error saving resource!"
msgstr "å„²å­˜è³‡æºæ™‚出ç¾éŒ¯èª¤ï¼"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr "OK"
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "把資æºå¦å­˜ç‚º..."
@@ -1743,10 +1789,20 @@ msgstr "ä¸èƒ½åŸ·è¡Œé€™å€‹å‹•作,因為沒有tree root."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
#, fuzzy
msgid "Can't load MeshLibrary for merging!"
@@ -1992,6 +2048,12 @@ msgstr "載入字形出ç¾éŒ¯èª¤"
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -2033,6 +2095,12 @@ msgstr "刪除佈局"
msgid "Default"
msgstr "é è¨­"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+#, fuzzy
+msgid "Show in FileSystem"
+msgstr "檔案系統"
+
#: editor/editor_node.cpp
#, fuzzy
msgid "Play This Scene"
@@ -2124,7 +2192,8 @@ msgid "Save Scene"
msgstr "儲存場景"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+#, fuzzy
+msgid "Save All Scenes"
msgstr "儲存所有場景"
#: editor/editor_node.cpp
@@ -2153,7 +2222,7 @@ msgid "Undo"
msgstr "復原"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "é‡è£½"
@@ -2177,7 +2246,7 @@ msgstr "專案設定"
msgid "Export"
msgstr "匯出"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "工具"
@@ -2191,6 +2260,7 @@ msgid "Quit to Project List"
msgstr "回到專案列表"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr ""
@@ -2302,10 +2372,6 @@ msgstr "管ç†è¼¸å‡ºç¯„本"
msgid "Help"
msgstr "幫助"
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2402,24 +2468,24 @@ msgstr "當改變時更新"
msgid "Disable Update Spinner"
msgstr ""
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr "監視器"
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr "å°Žå…¥"
#: editor/editor_node.cpp
-msgid "Node"
-msgstr ""
-
-#: editor/editor_node.cpp
msgid "FileSystem"
msgstr "檔案系統"
#: editor/editor_node.cpp
+msgid "Inspector"
+msgstr "監視器"
+
+#: editor/editor_node.cpp
+msgid "Node"
+msgstr ""
+
+#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
msgstr ""
@@ -2562,7 +2628,7 @@ msgstr "å¹€ %"
msgid "Physics Frame %"
msgstr "物ç†å¹€ %"
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr "時間:"
@@ -2587,7 +2653,7 @@ msgstr "時間:"
msgid "Calls"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2599,20 +2665,44 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "有效的路徑"
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
#, fuzzy
msgid "New Script"
msgstr "下一個腳本"
@@ -2625,10 +2715,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2637,7 +2723,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr "貼上"
@@ -2941,6 +3028,11 @@ msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr ""
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "最愛:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
@@ -2978,8 +3070,8 @@ msgstr "載入錯誤:"
msgid "Unable to update dependencies:"
msgstr ""
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2987,10 +3079,6 @@ msgid "Provided name contains invalid characters"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Name contains invalid characters."
msgstr "有效字符:"
@@ -3019,31 +3107,23 @@ msgid "Duplicating folder:"
msgstr "複製"
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr ""
+#, fuzzy
+msgid "Open Scene(s)"
+msgstr "開啓場景"
#: editor/filesystem_dock.cpp
-msgid "Collapse all"
+msgid "Instance"
msgstr ""
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
-msgid "Rename..."
-msgstr "釿–°å‘½å..."
-
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Move To..."
-msgstr "æ¬åˆ°..."
+msgid "Add to favorites"
+msgstr "最愛:"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open Scene(s)"
-msgstr "開啓場景"
-
-#: editor/filesystem_dock.cpp
-msgid "Instance"
-msgstr ""
+msgid "Remove from favorites"
+msgstr "åªé™é¸ä¸­"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -3053,6 +3133,11 @@ msgstr ""
msgid "View Owners..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#, fuzzy
+msgid "Rename..."
+msgstr "釿–°å‘½å..."
+
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Duplicate..."
@@ -3060,6 +3145,11 @@ msgstr "複製"
#: editor/filesystem_dock.cpp
#, fuzzy
+msgid "Move To..."
+msgstr "æ¬åˆ°..."
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "New Script..."
msgstr "下一個腳本"
@@ -3068,6 +3158,15 @@ msgstr "下一個腳本"
msgid "New Resource..."
msgstr "把資æºå¦å­˜ç‚º..."
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Collapse All"
+msgstr "關閉"
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -3089,34 +3188,25 @@ msgstr ""
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "(ä¸ï¼‰é¡¯ç¤ºæœ€æ„›"
+msgid "Toggle split mode"
+msgstr "(ä¸ï¼‰é¡¯ç¤ºéš±è—的文件"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Show current scene file."
-msgstr "新增資料夾"
+msgid "Search files"
+msgstr "在幫助檔æœå°‹"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "在幫助檔æœå°‹"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
msgstr ""
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr "移動"
@@ -3134,31 +3224,22 @@ msgstr ""
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find in files"
+msgid "Find in Files"
msgstr "多 %d 檔案"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find: "
+msgid "Find:"
msgstr "尋找"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Whole words"
-msgstr "完整詞語"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "符åˆå¤§å°å¯«"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "新增資料夾"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Filter: "
+msgid "Filters:"
msgstr "篩é¸:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -3176,6 +3257,11 @@ msgstr "å–æ¶ˆ"
#: editor/find_in_files.cpp
#, fuzzy
+msgid "Find: "
+msgstr "尋找"
+
+#: editor/find_in_files.cpp
+#, fuzzy
msgid "Replace: "
msgstr "å–代"
@@ -3201,7 +3287,7 @@ msgstr "錯誤:動畫å稱已存在ï¼"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr "無效å稱"
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3342,18 +3428,14 @@ msgstr "å°Žå…¥"
msgid "Failed to load resource."
msgstr "資æºåŠ è¼‰å¤±æ•—ã€‚"
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr "Ok"
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+msgid "Expand All Properties"
msgstr ""
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
-msgstr ""
+#, fuzzy
+msgid "Collapse All Properties"
+msgstr "篩é¸:"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -3402,6 +3484,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr ""
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr ""
@@ -3468,46 +3554,48 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
-msgstr ""
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
+msgstr "縮放selection"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
-msgstr ""
+#, fuzzy
+msgid "Edit Polygon"
+msgstr "æ’ä»¶"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
-msgstr ""
+#, fuzzy
+msgid "Remove Polygon And Point"
+msgstr "åªé™é¸ä¸­"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr ""
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr "刪除"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
#, fuzzy
-msgid "Delete points"
-msgstr "刪除"
+msgid "Erase points."
+msgstr "縮放selection"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3523,7 +3611,7 @@ msgstr "新增動畫"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
+msgid "Load..."
msgstr "載入"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3552,15 +3640,9 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "刪除"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "縮放selection"
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3601,9 +3683,8 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3639,7 +3720,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
#, fuzzy
-msgid "Add Node.."
+msgid "Add Node..."
msgstr "新增節點"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3923,7 +4004,7 @@ msgstr "連到:"
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "移除被é¸å–的軌迹。"
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3992,10 +4073,6 @@ msgid "Amount:"
msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr ""
@@ -4200,7 +4277,7 @@ msgstr "全部"
msgid "Plugins"
msgstr "æ’ä»¶"
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "排åºï¼š"
@@ -4329,6 +4406,10 @@ msgid "Resize CanvasItem"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
msgstr ""
@@ -4349,21 +4430,19 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "縮å°"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "縮å°"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "放大"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr "鏿“‡æ¨¡å¼"
@@ -4392,6 +4471,11 @@ msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "鏿“‡æ¨¡å¼"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4487,6 +4571,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "åªé™é¸ä¸­"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr ""
@@ -4538,6 +4627,10 @@ msgid "Show Viewport"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr ""
@@ -4608,7 +4701,16 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "縮放selection"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
msgstr ""
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
@@ -4715,35 +4817,9 @@ msgid "Item List Editor"
msgstr ""
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr ""
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr ""
@@ -4977,12 +5053,12 @@ msgid "Populate"
msgstr ""
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
+msgid "Generating Visibility Rect"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -5011,6 +5087,12 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "Convert to CPUParticles"
+msgstr "轉為..."
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr ""
@@ -5080,13 +5162,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "轉為..."
+msgid "Generate AABB"
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -5110,6 +5191,11 @@ msgid "Add Point to Curve"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "編輯Node Curve"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr ""
@@ -5137,6 +5223,10 @@ msgid "Click: Add Point"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr ""
@@ -5152,11 +5242,6 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr ""
@@ -5217,6 +5302,10 @@ msgstr "åªé™é¸ä¸­"
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5228,7 +5317,13 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync bones"
+msgid "Sync Bones"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5240,40 +5335,45 @@ msgid "Create Polygon & UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
+#, fuzzy
+msgid "Create Internal Vertex"
+msgstr "新增"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+msgid "Remove Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
+msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Split already exists."
-msgstr "AutoLoad '%s'已存在ï¼"
+msgid "Add Custom Polygon"
+msgstr "æ’ä»¶"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Add Split"
-msgstr "新增訊號"
+msgid "Remove Custom Polygon"
+msgstr "åªé™é¸ä¸­"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Invalid Split: "
-msgstr "有效的路徑"
+msgid "Transform UV Map"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
-msgstr "åªé™é¸ä¸­"
+msgid "Transform Polygon"
+msgstr "縮放selection"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Transform UV Map"
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
-msgstr ""
+#, fuzzy
+msgid "Open Polygon 2D UV editor."
+msgstr "開啟資料夾"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
@@ -5284,12 +5384,14 @@ msgid "UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Poly"
-msgstr ""
+#, fuzzy
+msgid "Points"
+msgstr "下移"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Splits"
-msgstr ""
+#, fuzzy
+msgid "Polygons"
+msgstr "æ’ä»¶"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Bones"
@@ -5297,12 +5399,8 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
-msgstr "縮放selection"
-
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
-msgstr ""
+msgid "Move Points"
+msgstr "下移"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
@@ -5329,19 +5427,21 @@ msgid "Scale Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Select a split to erase it"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5366,6 +5466,11 @@ msgid "Grid Settings"
msgstr "設定"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr ""
@@ -5423,22 +5528,22 @@ msgid "Paste Resource"
msgstr "複製資æº"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr ""
@@ -5472,6 +5577,11 @@ msgstr "儲存TileSet時出ç¾éŒ¯èª¤ï¼"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
+msgid "Error: could not load file."
+msgstr "無法新增資料夾"
+
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Error could not load file."
msgstr "無法新增資料夾"
@@ -5481,20 +5591,24 @@ msgid "Error saving file!"
msgstr "儲存TileSet時出ç¾éŒ¯èª¤ï¼"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr ""
+#, fuzzy
+msgid "Error while saving theme."
+msgstr "儲存時出ç¾éŒ¯èª¤"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
-msgstr ""
+#, fuzzy
+msgid "Error Saving"
+msgstr "載入錯誤:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr ""
+#, fuzzy
+msgid "Error importing theme."
+msgstr "載入場景時出ç¾éŒ¯èª¤"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
-msgstr ""
+#, fuzzy
+msgid "Error Importing"
+msgstr "載入錯誤:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -5516,6 +5630,14 @@ msgid "Import Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr ""
@@ -5558,8 +5680,8 @@ msgstr "檔案"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile"
-msgstr "檔案"
+msgid "Open..."
+msgstr "開啟"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5576,12 +5698,8 @@ msgstr "複製路徑"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Show In File System"
-msgstr "檔案系統"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
-msgstr ""
+msgid "History Previous"
+msgstr "上一個tab"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
@@ -5593,15 +5711,16 @@ msgid "Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Reload Theme"
-msgstr ""
+#, fuzzy
+msgid "Import Theme..."
+msgstr "如來如此"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme"
+msgid "Reload Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
+msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5654,7 +5773,7 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr "è¦é›¢é–‹ç·¨è¼¯å™¨å—Ž?"
#: editor/plugins/script_editor_plugin.cpp
@@ -5662,10 +5781,6 @@ msgid "Open Godot online documentation"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -5702,19 +5817,9 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Search results"
+msgid "Search Results"
msgstr "在幫助檔æœå°‹"
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "儲存TileSet時出ç¾éŒ¯èª¤ï¼"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
@@ -5725,6 +5830,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "行為"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr ""
@@ -5757,10 +5871,6 @@ msgstr ""
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5814,12 +5924,14 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
-msgstr ""
+#, fuzzy
+msgid "Convert Indent to Spaces"
+msgstr "轉為..."
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
-msgstr ""
+#, fuzzy
+msgid "Convert Indent to Tabs"
+msgstr "轉為..."
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
@@ -5835,22 +5947,14 @@ msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Convert To Uppercase"
-msgstr "轉為..."
+msgid "Go to Next Breakpoint"
+msgstr "跳到下一步"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Convert To Lowercase"
-msgstr "轉為..."
+msgid "Go to Previous Breakpoint"
+msgstr "跳到上一步"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
@@ -5858,16 +5962,18 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr "ç¯©é¸æª”案..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
-msgstr ""
+#, fuzzy
+msgid "Go to Function..."
+msgstr "åªé™é¸ä¸­"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
-msgstr ""
+#, fuzzy
+msgid "Go to Line..."
+msgstr "跳到行"
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
@@ -5961,6 +6067,14 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -6133,6 +6247,11 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
+msgid "View Rotation Locked"
+msgstr "本地化"
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -6236,10 +6355,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap To Floor"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Toggle Freelook"
msgstr "全螢幕"
@@ -6357,6 +6472,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
#, fuzzy
msgid "Sprite is empty!"
@@ -6476,11 +6595,16 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6649,6 +6773,11 @@ msgid "Fix Invalid Tiles"
msgstr "無效å稱"
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "åªé™é¸ä¸­"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6696,33 +6825,37 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "移除é¸é …"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
+msgid "Rotate left"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
+msgid "Rotate right"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Flip vertically"
+msgstr ""
+
+#: editor/plugins/tile_map_editor_plugin.cpp
+msgid "Clear transform"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr "由主幹新增節點"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr "åªé™é¸ä¸­"
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6734,25 +6867,47 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "貼上動畫"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "縮放selection"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "縮放selection"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "åªé™é¸ä¸­"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6760,7 +6915,12 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "移除é¸é …"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6770,16 +6930,27 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "è¦åˆªé™¤é¸ä¸­æª”案?"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr ""
+msgstr "新增資料夾"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "刪除"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr "新增資料夾"
@@ -6798,12 +6969,100 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr "新增資料夾"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "新增資料夾"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "檔案"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "æ’ä»¶"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "æ’ä»¶"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "æ’ä»¶"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "貼上動畫"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "移除é¸é …"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "åªé™é¸ä¸­"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Occlusion Polygon"
+msgstr "åªé™é¸ä¸­"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Navigation Polygon"
+msgstr "移除動畫"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "檔案"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "縮放selection"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "縮放selection"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "This property can't be changed."
msgstr "ä¸èƒ½åŸ·è¡Œé€™å€‹å‹•作,因為沒有tree root."
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Tile Set"
+msgid "TileSet"
msgstr "TileSet..."
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6842,6 +7101,15 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Exporting All"
+msgstr "匯出"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6850,6 +7118,11 @@ msgid "Add..."
msgstr "添加..."
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "匯出"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr "資æº"
@@ -6907,10 +7180,50 @@ msgstr ""
#: editor/project_export.cpp
#, fuzzy
+msgid "Script"
+msgstr "下一個腳本"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Script Export Mode:"
+msgstr "匯出"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr "文字"
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
+#, fuzzy
msgid "Export PCK/Zip"
msgstr "匯出"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export mode?"
+msgstr "匯出"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Export All"
+msgstr "匯出"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -7046,7 +7359,7 @@ msgstr ""
#: editor/project_manager.cpp
#, fuzzy
-msgid "Can't open project"
+msgid "Can't open project at '%s'."
msgstr "ä¸èƒ½é€£æŽ¥ã€‚"
#: editor/project_manager.cpp
@@ -7055,6 +7368,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7379,10 +7710,6 @@ msgstr ""
msgid "General"
msgstr ""
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
-
#: editor/project_settings_editor.cpp
msgid "Override For..."
msgstr ""
@@ -7518,10 +7845,6 @@ msgstr "貼上"
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
#, fuzzy
msgid "Select Property"
@@ -7612,7 +7935,7 @@ msgid "Step"
msgstr ""
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7621,7 +7944,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7664,7 +7987,7 @@ msgstr "轉為..."
msgid "Reset"
msgstr "é‡è¨­ç¸®æ”¾æ¯”例"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7723,6 +8046,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
#, fuzzy
msgid "Clear Script"
msgstr "下一個腳本"
@@ -7760,6 +8087,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7836,6 +8169,11 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Open documentation"
+msgstr "開啓最近的"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr ""
@@ -7844,12 +8182,13 @@ msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Change Type"
-msgstr ""
+#, fuzzy
+msgid "Extend Script"
+msgstr "下一個腳本"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -8006,6 +8345,11 @@ msgid "Path is empty"
msgstr "路徑為空"
#: editor/script_create_dialog.cpp
+#, fuzzy
+msgid "Filename is empty"
+msgstr "路徑為空"
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -8103,19 +8447,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr "錯誤:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr "來æº:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -8148,18 +8480,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr "錯誤:"
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -8360,7 +8680,7 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+msgid "Step argument is zero!"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
@@ -8596,11 +8916,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -8885,6 +9201,10 @@ msgid "Base Type:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr ""
@@ -8986,11 +9306,11 @@ msgid "Search VisualScript"
msgstr "貼上"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -9075,6 +9395,12 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -9113,6 +9439,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -9230,6 +9562,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -9249,6 +9591,26 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9281,7 +9643,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9338,6 +9700,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr ""
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr ""
@@ -9354,11 +9720,6 @@ msgstr "警告!"
msgid "Please Confirm..."
msgstr "請確èª..."
-#: scene/gui/file_dialog.cpp
-#, fuzzy
-msgid "Select this Folder"
-msgstr "鏿“‡æ¨¡å¼"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9366,6 +9727,10 @@ msgid ""
"hide upon running."
msgstr ""
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9411,10 +9776,6 @@ msgstr "無效字型"
msgid "Input"
msgstr ""
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
@@ -9432,6 +9793,86 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Split already exists."
+#~ msgstr "AutoLoad '%s'已存在ï¼"
+
+#, fuzzy
+#~ msgid "Add Split"
+#~ msgstr "新增訊號"
+
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr "有效的路徑"
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "åªé™é¸ä¸­"
+
+#, fuzzy
+#~ msgid "Add Node.."
+#~ msgstr "新增節點"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "縮å°"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "放大"
+
+#, fuzzy
+#~ msgid "New TextFile"
+#~ msgstr "檔案"
+
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "放大"
+
+#, fuzzy
+#~ msgid "Public Methods"
+#~ msgstr "鏿“‡æ¨¡å¼"
+
+#, fuzzy
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "(ä¸ï¼‰é¡¯ç¤ºæœ€æ„›"
+
+#, fuzzy
+#~ msgid "Show current scene file."
+#~ msgstr "新增資料夾"
+
+#, fuzzy
+#~ msgid "Whole words"
+#~ msgstr "完整詞語"
+
+#, fuzzy
+#~ msgid "Match case"
+#~ msgstr "符åˆå¤§å°å¯«"
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#, fuzzy
+#~ msgid "Search in files"
+#~ msgstr "儲存TileSet時出ç¾éŒ¯èª¤ï¼"
+
+#, fuzzy
+#~ msgid "Convert To Uppercase"
+#~ msgstr "轉為..."
+
+#, fuzzy
+#~ msgid "Convert To Lowercase"
+#~ msgstr "轉為..."
+
+#~ msgid "Error:"
+#~ msgstr "錯誤:"
+
+#~ msgid "Source:"
+#~ msgstr "來æº:"
+
+#~ msgid "Errors:"
+#~ msgstr "錯誤:"
+
#~ msgid "Disabled"
#~ msgstr "å·²åœç”¨"
@@ -9453,9 +9894,6 @@ msgstr ""
#~ msgid "Anim Track Change Value Mode"
#~ msgstr "動畫軌跡變化數值模å¼"
-#~ msgid "Edit Node Curve"
-#~ msgstr "編輯Node Curve"
-
#~ msgid "Edit Selection Curve"
#~ msgstr "編輯Selection Curve"
@@ -9506,9 +9944,6 @@ msgstr ""
#~ msgid "Thanks!"
#~ msgstr "多è¬!"
-#~ msgid "I see..."
-#~ msgstr "如來如此"
-
#, fuzzy
#~ msgid "Can't open '%s'."
#~ msgstr "ä¸èƒ½é€£æŽ¥ã€‚"
@@ -9613,9 +10048,6 @@ msgstr ""
#~ msgid "Removed:"
#~ msgstr "已移除:"
-#~ msgid "Error loading scene."
-#~ msgstr "載入場景時出ç¾éŒ¯èª¤"
-
#, fuzzy
#~ msgid "Tiles"
#~ msgstr "檔案"
@@ -9677,9 +10109,6 @@ msgstr ""
#~ msgid "Images:"
#~ msgstr "圖片:"
-#~ msgid "Text"
-#~ msgstr "文字"
-
#~ msgid "File exists"
#~ msgstr "檔案已存在"
diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po
index 5ce0ea7f67..c752f09422 100644
--- a/editor/translations/zh_TW.po
+++ b/editor/translations/zh_TW.po
@@ -1,6 +1,6 @@
# Chinese (Taiwan) translation of the Godot Engine editor
-# Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.
-# Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)
+# Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.
+# Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)
# This file is distributed under the same license as the Godot source code.
# Allen H <w84miracle@gmail.com>, 2017.
# Billy SU <g4691821@gmail.com>, 2018.
@@ -11,18 +11,21 @@
# popcade <popcade@gmail.com>, 2016.
# Qing <icinriiq@gmail.com>, 2018.
# Sam Pan <sampan66@gmail.com>, 2016.
+# ken l <macauhome@gmail.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-07-15 16:35+0000\n"
-"Last-Translator: Kisaragi Hiu <mail@kisaragi-hiu.com>\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2018-12-13 14:44+0100\n"
+"Last-Translator: ken l <macauhome@gmail.com>\n"
"Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/"
"godot-engine/godot/zh_Hant/>\n"
"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8-bit\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 3.1-dev\n"
+"X-Generator: Poedit 2.2\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -30,7 +33,7 @@ msgid "Invalid type argument to convert(), use TYPE_* constants."
msgstr ""
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
-#: modules/mono/glue/glue_header.h
+#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr "解碼字節ä½å…ƒä¸è¶³ï¼Œæˆ–為無效格å¼ã€‚"
@@ -265,7 +268,6 @@ msgstr "創建 %d 個新軌並æ’入畫格?"
#: editor/editor_audio_buses.cpp editor/editor_plugin_settings.cpp
#: editor/plugin_config_dialog.cpp
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
#: editor/plugins/mesh_instance_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp editor/script_create_dialog.cpp
msgid "Create"
@@ -399,8 +401,7 @@ msgstr "縮放所é¸"
msgid "Scale From Cursor"
msgstr "由游標ä½ç½®ç¸®æ”¾"
-#: editor/animation_track_editor.cpp editor/plugins/tile_map_editor_plugin.cpp
-#: modules/gridmap/grid_map_editor_plugin.cpp
+#: editor/animation_track_editor.cpp modules/gridmap/grid_map_editor_plugin.cpp
msgid "Duplicate Selection"
msgstr "複製所é¸"
@@ -414,11 +415,13 @@ msgid "Delete Selection"
msgstr "複製所é¸"
#: editor/animation_track_editor.cpp
-msgid "Goto Next Step"
+#, fuzzy
+msgid "Go to Next Step"
msgstr "往下一步"
#: editor/animation_track_editor.cpp
-msgid "Goto Prev Step"
+#, fuzzy
+msgid "Go to Previous Step"
msgstr "往上一步"
#: editor/animation_track_editor.cpp
@@ -522,11 +525,11 @@ msgstr "ç„¡ç¬¦åˆæ¢ä»¶"
msgid "Replaced %d occurrence(s)."
msgstr "å–代了 %d 個"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Match Case"
msgstr "符åˆå¤§å°å¯«"
-#: editor/code_editor.cpp
+#: editor/code_editor.cpp editor/find_in_files.cpp
msgid "Whole Words"
msgstr "整個字"
@@ -542,15 +545,19 @@ msgstr "å–代全部"
msgid "Selection Only"
msgstr "åƒ…é¸æ“‡å€åŸŸ"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom In"
msgstr "放大"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
msgid "Zoom Out"
msgstr "縮å°"
-#: editor/code_editor.cpp editor/plugins/tile_set_editor_plugin.cpp
+#: editor/code_editor.cpp
msgid "Reset Zoom"
msgstr "é‡è¨­ç¸®æ”¾å¤§å°"
@@ -559,11 +566,10 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "放大"
+msgid "Font Size:"
+msgstr ""
-#: editor/code_editor.cpp editor/script_editor_debugger.cpp
+#: editor/code_editor.cpp
msgid "Line:"
msgstr "行:"
@@ -594,6 +600,7 @@ msgstr "新增"
#: editor/connections_dialog.cpp editor/dependency_editor.cpp
#: editor/groups_editor.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp
#: editor/project_settings_editor.cpp
msgid "Remove"
@@ -675,7 +682,7 @@ msgid "Edit Connection: "
msgstr "連接..."
#: editor/connections_dialog.cpp
-msgid "Are you sure you want to remove all connections from the \""
+msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr ""
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
@@ -723,23 +730,20 @@ msgid "Recent:"
msgstr "最近存å–:"
#: editor/create_dialog.cpp editor/plugins/asset_library_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/project_manager.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Search:"
msgstr "æœå°‹:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp
+#: editor/create_dialog.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Matches:"
msgstr "ç¬¦åˆæ¢ä»¶:"
-#: editor/create_dialog.cpp editor/editor_help.cpp
-#: editor/plugin_config_dialog.cpp
+#: editor/create_dialog.cpp editor/plugin_config_dialog.cpp
#: editor/plugins/asset_library_editor_plugin.cpp editor/property_selector.cpp
-#: editor/script_editor_debugger.cpp
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Description:"
msgstr "æè¿°:"
@@ -778,8 +782,7 @@ msgid "Resource"
msgstr "資æº"
#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp
-#: editor/project_manager.cpp editor/project_settings_editor.cpp
-#: editor/script_create_dialog.cpp
+#: editor/project_settings_editor.cpp editor/script_create_dialog.cpp
msgid "Path"
msgstr "路徑"
@@ -800,9 +803,10 @@ msgid "Search Replacement Resource:"
msgstr "æœå°‹æ›¿ä»£è³‡æºï¼š"
#: editor/dependency_editor.cpp editor/editor_file_dialog.cpp
-#: editor/editor_help.cpp editor/editor_node.cpp editor/filesystem_dock.cpp
-#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp
-#: editor/quick_open.cpp editor/script_create_dialog.cpp
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/property_selector.cpp editor/quick_open.cpp
+#: editor/script_create_dialog.cpp
#: modules/visual_script/visual_script_property_selector.cpp
#: scene/gui/file_dialog.cpp
msgid "Open"
@@ -834,7 +838,8 @@ msgid "Error loading:"
msgstr "載入時發生錯誤:"
#: editor/dependency_editor.cpp
-msgid "Scene failed to load due to missing dependencies:"
+#, fuzzy
+msgid "Load failed due to missing dependencies:"
msgstr "場景缺少了æŸäº›è³‡æºä»¥è‡³æ–¼ç„¡æ³•載入"
#: editor/dependency_editor.cpp editor/editor_node.cpp
@@ -896,14 +901,6 @@ msgstr "改變字典 value"
msgid "Thanks from the Godot community!"
msgstr "Godot 社群感è¬ä½ !"
-#: editor/editor_about.cpp editor/editor_node.cpp editor/inspector_dock.cpp
-#: editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/plugins/script_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
-#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp
-msgid "OK"
-msgstr ""
-
#: editor/editor_about.cpp
msgid "Godot Engine contributors"
msgstr "Godot Engine è²¢ç»è€…"
@@ -998,7 +995,8 @@ msgid "Uncompressing Assets"
msgstr "正在解壓縮素æ"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
-msgid "Package Installed Successfully!"
+#, fuzzy
+msgid "Package installed successfully!"
msgstr "å¥—ä»¶å®‰è£æˆåŠŸ!"
#: editor/editor_asset_installer.cpp
@@ -1086,8 +1084,7 @@ msgid "Bus options"
msgstr "Bus é¸é …"
#: editor/editor_audio_buses.cpp editor/filesystem_dock.cpp
-#: editor/plugins/animation_player_editor_plugin.cpp
-#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "Duplicate"
msgstr "製作複本"
@@ -1252,7 +1249,7 @@ msgid "Add AutoLoad"
msgstr "新增 AutoLoad"
#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/plugins/animation_tree_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Path:"
msgstr "路徑:"
@@ -1260,8 +1257,8 @@ msgstr "路徑:"
msgid "Node Name:"
msgstr "節點å稱:"
-#: editor/editor_autoload_settings.cpp editor/editor_profiler.cpp
-#: editor/project_manager.cpp editor/settings_config_dialog.cpp
+#: editor/editor_autoload_settings.cpp editor/editor_help_search.cpp
+#: editor/editor_profiler.cpp editor/settings_config_dialog.cpp
msgid "Name"
msgstr "å稱"
@@ -1333,12 +1330,17 @@ msgid "Template file not found:"
msgstr ""
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
+msgid "Select Current Folder"
+msgstr "鏿“‡ç›®å‰çš„資料夾"
+
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File Exists, Overwrite?"
msgstr "檔案已經存在, è¦è¦†å¯«å—Ž?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-msgid "Select Current Folder"
-msgstr "鏿“‡ç›®å‰çš„資料夾"
+#, fuzzy
+msgid "Select This Folder"
+msgstr "鏿“‡æ­¤è³‡æ–™å¤¾"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
@@ -1346,12 +1348,13 @@ msgstr "複製路徑"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open In File Manager"
+msgid "Open in File Manager"
msgstr "在檔案管ç†å“¡å…§é¡¯ç¤º"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-msgid "Show In File Manager"
+#, fuzzy
+msgid "Show in File Manager"
msgstr "在檔案管ç†å“¡å…§é¡¯ç¤º"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
@@ -1387,7 +1390,8 @@ msgid "Open a File or Directory"
msgstr "開啟檔案或資料夾"
#: editor/editor_file_dialog.cpp editor/editor_node.cpp
-#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+#: editor/editor_properties.cpp editor/inspector_dock.cpp
+#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp
msgid "Save"
msgstr "儲存"
@@ -1447,8 +1451,7 @@ msgstr "資料夾 & 檔案:"
msgid "Preview:"
msgstr "é è¦½:"
-#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp
-#: scene/gui/file_dialog.cpp
+#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "File:"
msgstr "檔案:"
@@ -1465,25 +1468,12 @@ msgstr ""
msgid "(Re)Importing Assets"
msgstr "(釿–°)載入素æ"
-#: editor/editor_help.cpp editor/editor_node.cpp
-#: editor/plugins/script_editor_plugin.cpp
-msgid "Search Help"
-msgstr "æœå°‹å¹«åŠ©"
-
-#: editor/editor_help.cpp
-msgid "Class List:"
-msgstr "Class 列表:"
-
-#: editor/editor_help.cpp
-msgid "Search Classes"
-msgstr "æœå°‹ Class"
-
#: editor/editor_help.cpp editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "Top"
msgstr "上é¢"
-#: editor/editor_help.cpp editor/property_editor.cpp
+#: editor/editor_help.cpp
msgid "Class:"
msgstr "Class:"
@@ -1500,28 +1490,31 @@ msgid "Brief Description:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Members"
+msgid "Properties"
msgstr ""
-#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
-msgid "Members:"
+#: editor/editor_help.cpp
+msgid "Properties:"
msgstr ""
#: editor/editor_help.cpp
-msgid "Public Methods"
-msgstr ""
+msgid "Methods"
+msgstr "方法"
#: editor/editor_help.cpp
-msgid "Public Methods:"
-msgstr "公開 method:"
+#, fuzzy
+msgid "Methods:"
+msgstr "方法"
#: editor/editor_help.cpp
-msgid "GUI Theme Items"
-msgstr "介é¢ä¸»é¡Œé …ç›®"
+#, fuzzy
+msgid "Theme Properties"
+msgstr "éŽæ¿¾æª”案..."
#: editor/editor_help.cpp
-msgid "GUI Theme Items:"
-msgstr "介é¢ä¸»é¡Œé …ç›®:"
+#, fuzzy
+msgid "Theme Properties:"
+msgstr "éŽæ¿¾æª”案..."
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1548,7 +1541,13 @@ msgid "Constants:"
msgstr "定數:"
#: editor/editor_help.cpp
-msgid "Description"
+#, fuzzy
+msgid "Class Description"
+msgstr "æè¿°:"
+
+#: editor/editor_help.cpp
+#, fuzzy
+msgid "Class Description:"
msgstr "æè¿°:"
#: editor/editor_help.cpp
@@ -1565,12 +1564,13 @@ msgstr ""
"color]或[color=$color][url=$url2]è¦æ±‚一個[/url][/color]。"
#: editor/editor_help.cpp
-msgid "Properties"
-msgstr ""
+#, fuzzy
+msgid "Property Descriptions"
+msgstr "Property 說明:"
#: editor/editor_help.cpp
#, fuzzy
-msgid "Property Description:"
+msgid "Property Descriptions:"
msgstr "Property 說明:"
#: editor/editor_help.cpp
@@ -1582,11 +1582,13 @@ msgstr ""
"color]一個!"
#: editor/editor_help.cpp
-msgid "Methods"
-msgstr "方法"
+#, fuzzy
+msgid "Method Descriptions"
+msgstr "Method 說明:"
#: editor/editor_help.cpp
-msgid "Method Description:"
+#, fuzzy
+msgid "Method Descriptions:"
msgstr "Method 說明:"
#: editor/editor_help.cpp
@@ -1597,11 +1599,57 @@ msgstr ""
"ç›®å‰æ²’有這個 method 的說明。請幫我們[color=$color][url=$url]è²¢ç»[/url][/"
"color]一個!"
-#: editor/editor_inspector.cpp
-msgid "Property: "
+#: editor/editor_help_search.cpp editor/editor_node.cpp
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Search Help"
+msgstr "æœå°‹å¹«åŠ©"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Display All"
+msgstr "å–代全部"
+
+#: editor/editor_help_search.cpp
+msgid "Classes Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Methods Only"
+msgstr "方法"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Signals Only"
+msgstr "信號"
+
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Constants Only"
+msgstr "定數"
+
+#: editor/editor_help_search.cpp
+msgid "Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Theme Properties Only"
+msgstr ""
+
+#: editor/editor_help_search.cpp
+msgid "Member Type"
msgstr ""
-#: editor/editor_inspector.cpp editor/property_editor.cpp
+#: editor/editor_help_search.cpp
+#, fuzzy
+msgid "Class"
+msgstr "Class:"
+
+#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
+msgid "Property:"
+msgstr ""
+
+#: editor/editor_inspector.cpp
msgid "Set"
msgstr ""
@@ -1636,6 +1684,11 @@ msgstr "專案輸出失敗,錯誤代碼是 %d。"
msgid "Error saving resource!"
msgstr "儲存資æºéŒ¯èª¤!"
+#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: scene/gui/dialogs.cpp
+msgid "OK"
+msgstr ""
+
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Save Resource As..."
msgstr "å¦å­˜è³‡æºç‚º..."
@@ -1693,10 +1746,20 @@ msgstr "æ­¤æ“作無法復原, 確定è¦é‚„原嗎?"
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
+#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+msgid "Can't overwrite scene that is still open!"
+msgstr ""
+
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
msgstr ""
@@ -1926,6 +1989,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"Unable to load addon script from path: '%s' There seems to be an error in "
+"the code, please check the syntax."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Unable to load addon script from path: '%s' Base type is not EditorPlugin."
msgstr ""
@@ -1967,6 +2036,12 @@ msgstr ""
msgid "Default"
msgstr "é è¨­"
+#: editor/editor_node.cpp editor/editor_properties.cpp
+#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
+#, fuzzy
+msgid "Show in FileSystem"
+msgstr "在檔案管ç†å“¡å…§é¡¯ç¤º"
+
#: editor/editor_node.cpp
#, fuzzy
msgid "Play This Scene"
@@ -2055,7 +2130,8 @@ msgid "Save Scene"
msgstr "儲存場景"
#: editor/editor_node.cpp
-msgid "Save all Scenes"
+#, fuzzy
+msgid "Save All Scenes"
msgstr "儲存全部場景"
#: editor/editor_node.cpp
@@ -2084,7 +2160,7 @@ msgid "Undo"
msgstr "復原"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "å–æ¶ˆã€Œå¾©åŽŸã€"
@@ -2109,7 +2185,7 @@ msgstr "專案設定"
msgid "Export"
msgstr "輸出"
-#: editor/editor_node.cpp
+#: editor/editor_node.cpp editor/plugins/tile_set_editor_plugin.cpp
msgid "Tools"
msgstr "工具"
@@ -2123,6 +2199,7 @@ msgid "Quit to Project List"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
+#: editor/project_export.cpp
msgid "Debug"
msgstr ""
@@ -2230,10 +2307,6 @@ msgstr ""
msgid "Help"
msgstr ""
-#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
-msgid "Classes"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -2256,11 +2329,11 @@ msgstr ""
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
msgid "Community"
-msgstr ""
+msgstr "社å€"
#: editor/editor_node.cpp
msgid "About"
-msgstr ""
+msgstr "關於"
#: editor/editor_node.cpp
msgid "Play the project."
@@ -2328,25 +2401,25 @@ msgstr ""
msgid "Disable Update Spinner"
msgstr ""
-#: editor/editor_node.cpp
-msgid "Inspector"
-msgstr ""
-
#: editor/editor_node.cpp editor/plugins/asset_library_editor_plugin.cpp
#: editor/project_manager.cpp
msgid "Import"
msgstr ""
#: editor/editor_node.cpp
-#, fuzzy
-msgid "Node"
-msgstr "節點"
+msgid "FileSystem"
+msgstr ""
#: editor/editor_node.cpp
-msgid "FileSystem"
+msgid "Inspector"
msgstr ""
#: editor/editor_node.cpp
+#, fuzzy
+msgid "Node"
+msgstr "節點"
+
+#: editor/editor_node.cpp
msgid "Expand Bottom Panel"
msgstr ""
@@ -2481,7 +2554,7 @@ msgstr ""
msgid "Physics Frame %"
msgstr ""
-#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp
+#: editor/editor_profiler.cpp
msgid "Time:"
msgstr ""
@@ -2505,7 +2578,7 @@ msgstr ""
msgid "Calls"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "On"
msgstr ""
@@ -2517,20 +2590,44 @@ msgstr ""
msgid "Bit %d, value %d"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
+#: editor/editor_properties.cpp
msgid "[Empty]"
msgstr ""
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
-msgid "Assign.."
+msgid "Assign..."
+msgstr ""
+
+#: editor/editor_properties.cpp
+#, fuzzy
+msgid "Invalid RID"
+msgstr "無效的路徑"
+
+#: editor/editor_properties.cpp
+msgid ""
+"The selected resource (%s) does not match any type expected for this "
+"property (%s)."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on resources saved as a file.\n"
+"Resource needs to belong to a scene."
+msgstr ""
+
+#: editor/editor_properties.cpp
+msgid ""
+"Can't create a ViewportTexture on this resource because it's not set as "
+"local to scene.\n"
+"Please switch on the 'local to scene' property on it (and all resources "
+"containing it up to a node)."
msgstr ""
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
msgstr ""
-#: editor/editor_properties.cpp editor/plugins/script_editor_plugin.cpp
-#: editor/property_editor.cpp
+#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "New Script"
msgstr ""
@@ -2542,10 +2639,6 @@ msgstr ""
msgid "Make Unique"
msgstr ""
-#: editor/editor_properties.cpp editor/property_editor.cpp
-msgid "Show in File System"
-msgstr ""
-
#: editor/editor_properties.cpp
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -2554,7 +2647,8 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
-#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp
+#: editor/plugins/sprite_frames_editor_plugin.cpp
+#: editor/plugins/tile_map_editor_plugin.cpp editor/property_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Paste"
msgstr ""
@@ -2849,6 +2943,11 @@ msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr ""
#: editor/filesystem_dock.cpp
+#, fuzzy
+msgid "Favorites"
+msgstr "我的最愛:"
+
+#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
msgstr ""
@@ -2887,8 +2986,8 @@ msgstr "載入時發生錯誤:"
msgid "Unable to update dependencies:"
msgstr "場景缺少了æŸäº›è³‡æºä»¥è‡³æ–¼ç„¡æ³•載入"
-#: editor/filesystem_dock.cpp
-msgid "No name provided"
+#: editor/filesystem_dock.cpp editor/scene_tree_editor.cpp
+msgid "No name provided."
msgstr ""
#: editor/filesystem_dock.cpp
@@ -2896,10 +2995,6 @@ msgid "Provided name contains invalid characters"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "No name provided."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
msgid "Name contains invalid characters."
msgstr ""
@@ -2926,29 +3021,23 @@ msgid "Duplicating folder:"
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Expand all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-msgid "Collapse all"
-msgstr ""
-
-#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
-msgid "Rename..."
-msgstr ""
+#, fuzzy
+msgid "Open Scene(s)"
+msgstr "開啟場景"
#: editor/filesystem_dock.cpp
-msgid "Move To..."
+msgid "Instance"
msgstr ""
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Open Scene(s)"
-msgstr "開啟場景"
+msgid "Add to favorites"
+msgstr "我的最愛:"
#: editor/filesystem_dock.cpp
-msgid "Instance"
-msgstr ""
+#, fuzzy
+msgid "Remove from favorites"
+msgstr "移除"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -2958,12 +3047,20 @@ msgstr ""
msgid "View Owners..."
msgstr ""
+#: editor/filesystem_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
+msgid "Rename..."
+msgstr ""
+
#: editor/filesystem_dock.cpp
#, fuzzy
msgid "Duplicate..."
msgstr "複製動畫關éµç•«æ ¼"
#: editor/filesystem_dock.cpp
+msgid "Move To..."
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
#, fuzzy
msgid "New Script..."
msgstr "新增資料夾..."
@@ -2973,6 +3070,15 @@ msgstr "新增資料夾..."
msgid "New Resource..."
msgstr "å¦å­˜è³‡æºç‚º..."
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+msgid "Expand All"
+msgstr ""
+
+#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
+#, fuzzy
+msgid "Collapse All"
+msgstr "å–代全部"
+
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
#: editor/project_manager.cpp editor/rename_dialog.cpp
@@ -2994,34 +3100,25 @@ msgstr ""
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Toggle folder status as Favorite."
-msgstr "åˆ‡æ›æœ€æ„›"
+msgid "Toggle split mode"
+msgstr "åˆ‡æ›æ¨¡å¼"
#: editor/filesystem_dock.cpp
#, fuzzy
-msgid "Show current scene file."
-msgstr "新增資料夾"
+msgid "Search files"
+msgstr "æœå°‹ Class"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
msgstr ""
#: editor/filesystem_dock.cpp
-msgid "Enter tree-view."
-msgstr ""
-
-#: editor/filesystem_dock.cpp
-#, fuzzy
-msgid "Search files"
-msgstr "æœå°‹ Class"
-
-#: editor/filesystem_dock.cpp
msgid ""
"Scanning Files,\n"
"Please Wait..."
msgstr ""
-#: editor/filesystem_dock.cpp editor/plugins/tile_map_editor_plugin.cpp
+#: editor/filesystem_dock.cpp
msgid "Move"
msgstr ""
@@ -3039,31 +3136,22 @@ msgstr ""
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find in files"
+msgid "Find in Files"
msgstr "還有 %d 個檔案"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Find: "
+msgid "Find:"
msgstr "尋找"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Whole words"
-msgstr "整個字"
-
-#: editor/find_in_files.cpp
-#, fuzzy
-msgid "Match case"
-msgstr "符åˆå¤§å°å¯«"
-
-#: editor/find_in_files.cpp
-msgid "Folder: "
-msgstr ""
+msgid "Folder:"
+msgstr "新增資料夾"
#: editor/find_in_files.cpp
#, fuzzy
-msgid "Filter: "
+msgid "Filters:"
msgstr "éŽæ¿¾å™¨:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
@@ -3081,6 +3169,11 @@ msgstr ""
#: editor/find_in_files.cpp
#, fuzzy
+msgid "Find: "
+msgstr "尋找"
+
+#: editor/find_in_files.cpp
+#, fuzzy
msgid "Replace: "
msgstr "å–代"
@@ -3106,7 +3199,7 @@ msgstr "Autoload「%sã€å·²ç¶“存在!"
#: editor/groups_editor.cpp
#, fuzzy
-msgid "invalid Group name."
+msgid "Invalid group name."
msgstr "ä¸èƒ½ä½¿ç”¨çš„å稱。"
#: editor/groups_editor.cpp editor/node_dock.cpp
@@ -3244,18 +3337,15 @@ msgstr ""
msgid "Failed to load resource."
msgstr ""
-#: editor/inspector_dock.cpp editor/plugins/canvas_item_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp
-msgid "Ok"
-msgstr ""
-
#: editor/inspector_dock.cpp
-msgid "Expand all properties"
+#, fuzzy
+msgid "Expand All Properties"
msgstr "展開所有屬性"
#: editor/inspector_dock.cpp
-msgid "Collapse all properties"
-msgstr ""
+#, fuzzy
+msgid "Collapse All Properties"
+msgstr "展開所有屬性"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -3300,6 +3390,10 @@ msgid "Load an existing resource from disk and edit it."
msgstr ""
#: editor/inspector_dock.cpp
+msgid "Save the currently edited resource."
+msgstr ""
+
+#: editor/inspector_dock.cpp
msgid "Go to the previous edited object in history."
msgstr ""
@@ -3362,46 +3456,48 @@ msgid "Activate now?"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create Poly"
-msgstr ""
+#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Create Polygon"
+msgstr "新增資料夾"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly"
-msgstr ""
+#, fuzzy
+msgid "Edit Polygon"
+msgstr "新增資料夾"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Insert Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-#: editor/plugins/collision_polygon_editor_plugin.cpp
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit Poly (Remove Point)"
+msgid "Edit Polygon (Remove Point)"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Remove Poly And Point"
-msgstr ""
+#, fuzzy
+msgid "Remove Polygon And Point"
+msgstr "移除"
#: editor/plugins/abstract_polygon_2d_editor.cpp
-msgid "Create a new polygon from scratch"
-msgstr ""
+#: editor/plugins/animation_blend_space_1d_editor.cpp
+#: editor/plugins/animation_blend_space_2d_editor.cpp
+#, fuzzy
+msgid "Create points."
+msgstr "刪除"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
-"Edit existing polygon:\n"
-"LMB: Move Point.\n"
-"Ctrl+LMB: Split Segment.\n"
-"RMB: Erase Point."
+"Edit points.\n"
+"LMB: Move Point\n"
+"RMB: Erase Point"
msgstr ""
#: editor/plugins/abstract_polygon_2d_editor.cpp
+#: editor/plugins/animation_blend_space_1d_editor.cpp
#, fuzzy
-msgid "Delete points"
-msgstr "刪除"
+msgid "Erase points."
+msgstr "æ‰€æœ‰çš„é¸æ“‡"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3416,7 +3512,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Load.."
+msgid "Load..."
msgstr "載入"
#: editor/plugins/animation_blend_space_1d_editor.cpp
@@ -3445,15 +3541,9 @@ msgid "Select and move points, create points with RMB."
msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
-msgid "Create points."
-msgstr "刪除"
-
-#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
-msgid "Erase points."
-msgstr "æ‰€æœ‰çš„é¸æ“‡"
+#: editor/plugins/animation_blend_space_2d_editor.cpp scene/gui/graph_edit.cpp
+msgid "Enable snap and show grid."
+msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3494,9 +3584,8 @@ msgid "Generate blend triangles automatically (instead of manually)"
msgstr ""
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#: editor/plugins/polygon_2d_editor_plugin.cpp
-#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap"
+#: editor/plugins/animation_tree_player_editor_plugin.cpp
+msgid "Blend:"
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3531,7 +3620,7 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-msgid "Add Node.."
+msgid "Add Node..."
msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
@@ -3810,7 +3899,7 @@ msgstr "連接..."
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
-msgid "Remove selected node or transition"
+msgid "Remove selected node or transition."
msgstr "ç§»é™¤é¸æ“‡çš„動畫軌。"
#: editor/plugins/animation_state_machine_editor.cpp
@@ -3878,10 +3967,6 @@ msgid "Amount:"
msgstr ""
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-msgid "Blend:"
-msgstr ""
-
-#: editor/plugins/animation_tree_player_editor_plugin.cpp
msgid "Blend 0:"
msgstr ""
@@ -4084,7 +4169,7 @@ msgstr "全部"
msgid "Plugins"
msgstr ""
-#: editor/plugins/asset_library_editor_plugin.cpp
+#: editor/plugins/asset_library_editor_plugin.cpp editor/project_manager.cpp
msgid "Sort:"
msgstr "排åº:"
@@ -4211,6 +4296,10 @@ msgid "Resize CanvasItem"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Scale CanvasItem"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
msgstr ""
@@ -4231,21 +4320,19 @@ msgid "Paste Pose"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom out"
-msgstr "縮å°"
+msgid ""
+"Warning: Children of a container get their position and size determined only "
+"by their parent."
+msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#: editor/plugins/texture_region_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp scene/gui/graph_edit.cpp
#, fuzzy
-msgid "Zoom reset"
+msgid "Zoom Reset"
msgstr "縮å°"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
-msgid "Zoom in"
-msgstr "放大"
-
-#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Select Mode"
msgstr ""
@@ -4274,6 +4361,11 @@ msgid "Rotate Mode"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Scale Mode"
+msgstr "åˆ‡æ›æ¨¡å¼"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid ""
"Show a list of all objects at the position clicked\n"
@@ -4368,6 +4460,11 @@ msgid "Restores the object's children's ability to be selected."
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
+msgid "Skeleton Options"
+msgstr "單例"
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
msgstr ""
@@ -4418,6 +4515,10 @@ msgid "Show Viewport"
msgstr ""
#: editor/plugins/canvas_item_editor_plugin.cpp
+msgid "Show Group And Lock Icons"
+msgstr ""
+
+#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
msgstr ""
@@ -4487,7 +4588,16 @@ msgid ""
msgstr ""
#: editor/plugins/collision_polygon_editor_plugin.cpp
-msgid "Create Poly3D"
+#, fuzzy
+msgid "Create Polygon3D"
+msgstr "新增資料夾"
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly"
+msgstr ""
+
+#: editor/plugins/collision_polygon_editor_plugin.cpp
+msgid "Edit Poly (Remove Point)"
msgstr ""
#: editor/plugins/collision_shape_2d_editor_plugin.cpp
@@ -4593,35 +4703,9 @@ msgid "Item List Editor"
msgstr ""
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid ""
-"No OccluderPolygon2D resource on this node.\n"
-"Create and assign one?"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
msgstr ""
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Create a new polygon from scratch."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Edit existing polygon:"
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "LMB: Move Point."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "Ctrl+LMB: Split Segment."
-msgstr ""
-
-#: editor/plugins/light_occluder_2d_editor_plugin.cpp
-msgid "RMB: Erase Point."
-msgstr ""
-
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Mesh is empty!"
msgstr ""
@@ -4855,12 +4939,12 @@ msgid "Populate"
msgstr ""
#: editor/plugins/navigation_polygon_editor_plugin.cpp
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create Navigation Polygon"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
-#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generating AABB"
+msgid "Generating Visibility Rect"
msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -4889,6 +4973,12 @@ msgstr ""
#: editor/plugins/particles_2d_editor_plugin.cpp
#: editor/plugins/particles_editor_plugin.cpp
+#, fuzzy
+msgid "Convert to CPUParticles"
+msgstr "è½‰æ›æˆ..."
+
+#: editor/plugins/particles_2d_editor_plugin.cpp
+#: editor/plugins/particles_editor_plugin.cpp
msgid "Particles"
msgstr ""
@@ -4958,13 +5048,12 @@ msgid "A processor material of type 'ParticlesMaterial' is required."
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-msgid "Generate AABB"
+msgid "Generating AABB"
msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
-#, fuzzy
-msgid "Convert to CPUParticles"
-msgstr "è½‰æ›æˆ..."
+msgid "Generate AABB"
+msgstr ""
#: editor/plugins/particles_editor_plugin.cpp
msgid "Generate Visibility AABB"
@@ -4988,6 +5077,11 @@ msgid "Add Point to Curve"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Split Curve"
+msgstr "編輯節點曲線"
+
+#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Move Point in Curve"
msgstr ""
@@ -5015,6 +5109,10 @@ msgid "Click: Add Point"
msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
+msgid "Left Click: Split Segment (in curve)"
+msgstr ""
+
+#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
msgstr ""
@@ -5030,11 +5128,6 @@ msgstr ""
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
-msgid "Split Segment (in curve)"
-msgstr ""
-
-#: editor/plugins/path_2d_editor_plugin.cpp
-#: editor/plugins/path_editor_plugin.cpp
msgid "Delete Point"
msgstr ""
@@ -5094,6 +5187,10 @@ msgstr ""
msgid "Remove In-Control Point"
msgstr ""
+#: editor/plugins/path_editor_plugin.cpp
+msgid "Split Segment (in curve)"
+msgstr ""
+
#: editor/plugins/physical_bone_plugin.cpp
#, fuzzy
msgid "Move joint"
@@ -5105,42 +5202,43 @@ msgid ""
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Sync bones"
+msgid "Sync Bones"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create UV Map"
+msgid ""
+"No texture in this polygon.\n"
+"Set a texture to be able to edit UV."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Create Polygon & UV"
+msgid "Create UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split point with itself."
+msgid "Create Polygon & UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Split can't form an existing edge."
+msgid "Create Internal Vertex"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
-msgid "Split already exists."
-msgstr "Autoload「%sã€å·²ç¶“存在!"
+msgid "Remove Internal Vertex"
+msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Add Split"
+msgid "Invalid Polygon (need 3 different vertices)"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Invalid Split: "
-msgstr "無效的路徑"
+msgid "Add Custom Polygon"
+msgstr "新增資料夾"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Remove Split"
+msgid "Remove Custom Polygon"
msgstr "移除"
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5148,39 +5246,46 @@ msgid "Transform UV Map"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint bone weights"
-msgstr ""
+#, fuzzy
+msgid "Transform Polygon"
+msgstr "新增資料夾"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Polygon 2D UV Editor"
+msgid "Paint Bone Weights"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UV"
+msgid "Open Polygon 2D UV editor."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Poly"
+msgid "Polygon 2D UV Editor"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Splits"
+msgid "UV"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Bones"
-msgstr ""
+#, fuzzy
+msgid "Points"
+msgstr "移除"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
-msgid "Create Polygon"
+msgid "Polygons"
msgstr "新增資料夾"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Move Point"
+msgid "Bones"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#, fuzzy
+msgid "Move Points"
+msgstr "移除"
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
msgstr ""
@@ -5205,19 +5310,21 @@ msgid "Scale Polygon"
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Connect two points to make a split"
+msgid "Create a custom polygon. Enables custom polygon rendering."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Select a split to erase it"
+msgid ""
+"Remove a custom polygon. If none remain, custom polygon rendering is "
+"disabled."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "Paint weights with specified intensity"
+msgid "Paint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
-msgid "UnPaint weights with specified intensity"
+msgid "Unpaint weights with specified intensity."
msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
@@ -5242,6 +5349,11 @@ msgid "Grid Settings"
msgstr "專案設定"
#: editor/plugins/polygon_2d_editor_plugin.cpp
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Snap"
+msgstr ""
+
+#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
msgstr ""
@@ -5299,22 +5411,22 @@ msgid "Paste Resource"
msgstr "貼上資æº"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
-msgid "Open in Editor"
-msgstr ""
-
-#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/scene_tree_editor.cpp
msgid "Instance:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp editor/project_settings_editor.cpp
-#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp
+#: editor/scene_tree_editor.cpp
msgid "Type:"
msgstr ""
#: editor/plugins/resource_preloader_editor_plugin.cpp
+#: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp
+msgid "Open in Editor"
+msgstr ""
+
+#: editor/plugins/resource_preloader_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "Load Resource"
msgstr ""
@@ -5348,6 +5460,11 @@ msgstr "載入場景時發生錯誤"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
+msgid "Error: could not load file."
+msgstr "無法新增資料夾"
+
+#: editor/plugins/script_editor_plugin.cpp
+#, fuzzy
msgid "Error could not load file."
msgstr "無法新增資料夾"
@@ -5357,20 +5474,24 @@ msgid "Error saving file!"
msgstr "儲存資æºéŒ¯èª¤!"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error while saving theme"
-msgstr ""
+#, fuzzy
+msgid "Error while saving theme."
+msgstr "儲存中發生了錯誤。"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error saving"
-msgstr ""
+#, fuzzy
+msgid "Error Saving"
+msgstr "載入時發生錯誤:"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing theme"
-msgstr ""
+#, fuzzy
+msgid "Error importing theme."
+msgstr "讀å–字體錯誤。"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Error importing"
-msgstr ""
+#, fuzzy
+msgid "Error Importing"
+msgstr "載入時發生錯誤:"
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -5392,6 +5513,14 @@ msgid "Import Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
+msgid "Error while saving theme"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
+msgid "Error saving"
+msgstr ""
+
+#: editor/plugins/script_editor_plugin.cpp
msgid "Save Theme As..."
msgstr ""
@@ -5434,8 +5563,8 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "New TextFile"
-msgstr "éŽæ¿¾æª”案..."
+msgid "Open..."
+msgstr "開啟"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5450,12 +5579,9 @@ msgid "Copy Script Path"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Show In File System"
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid "History Prev"
-msgstr ""
+#, fuzzy
+msgid "History Previous"
+msgstr "上個分é "
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
@@ -5467,15 +5593,16 @@ msgid "Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Reload Theme"
-msgstr ""
+#, fuzzy
+msgid "Import Theme..."
+msgstr "我知é“了"
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme"
+msgid "Reload Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Save Theme As"
+msgid "Save Theme"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
@@ -5526,7 +5653,7 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Debug with external editor"
+msgid "Debug with External Editor"
msgstr "離開編輯器嗎?"
#: editor/plugins/script_editor_plugin.cpp
@@ -5534,10 +5661,6 @@ msgid "Open Godot online documentation"
msgstr ""
#: editor/plugins/script_editor_plugin.cpp
-msgid "Search the class hierarchy."
-msgstr ""
-
-#: editor/plugins/script_editor_plugin.cpp
msgid "Search the reference documentation."
msgstr ""
@@ -5573,19 +5696,9 @@ msgstr ""
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
-msgid "Search results"
+msgid "Search Results"
msgstr "æœå°‹å¹«åŠ©"
-#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
-msgid "Search in files"
-msgstr "æœå°‹ Class"
-
-#: editor/plugins/script_editor_plugin.cpp
-msgid ""
-"Built-in scripts can only be edited when the scene they belong to is loaded"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp
#, fuzzy
msgid "Line"
@@ -5596,6 +5709,15 @@ msgid "(ignore)"
msgstr ""
#: editor/plugins/script_text_editor.cpp
+#, fuzzy
+msgid "Go to Function"
+msgstr "建立函å¼"
+
+#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
+msgid "Standard"
+msgstr ""
+
+#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr ""
@@ -5628,10 +5750,6 @@ msgstr ""
msgid "Syntax Highlighter"
msgstr ""
-#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
-msgid "Standard"
-msgstr ""
-
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
msgid "Cut"
@@ -5685,12 +5803,14 @@ msgid "Trim Trailing Whitespace"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Spaces"
-msgstr ""
+#, fuzzy
+msgid "Convert Indent to Spaces"
+msgstr "è½‰æ›æˆ..."
#: editor/plugins/script_text_editor.cpp
-msgid "Convert Indent To Tabs"
-msgstr ""
+#, fuzzy
+msgid "Convert Indent to Tabs"
+msgstr "è½‰æ›æˆ..."
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
@@ -5706,22 +5826,14 @@ msgid "Remove All Breakpoints"
msgstr ""
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Next Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
-msgid "Goto Previous Breakpoint"
-msgstr ""
-
-#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Convert To Uppercase"
-msgstr "è½‰æ›æˆ..."
+msgid "Go to Next Breakpoint"
+msgstr "往下一步"
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Convert To Lowercase"
-msgstr "è½‰æ›æˆ..."
+msgid "Go to Previous Breakpoint"
+msgstr "往上一步"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
@@ -5729,16 +5841,18 @@ msgstr ""
#: editor/plugins/script_text_editor.cpp
#, fuzzy
-msgid "Find in files..."
+msgid "Find in Files..."
msgstr "éŽæ¿¾æª”案..."
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Function..."
-msgstr ""
+#, fuzzy
+msgid "Go to Function..."
+msgstr "建立函å¼"
#: editor/plugins/script_text_editor.cpp
-msgid "Goto Line..."
-msgstr ""
+#, fuzzy
+msgid "Go to Line..."
+msgstr "å‰å¾€ç¬¬...行"
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
@@ -5832,6 +5946,14 @@ msgid "Animation Key Inserted."
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Pitch"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Yaw"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
msgstr ""
@@ -6000,6 +6122,10 @@ msgid "Freelook Speed Modifier"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
+msgid "View Rotation Locked"
+msgstr ""
+
+#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
msgstr ""
@@ -6101,10 +6227,6 @@ msgid "Tool Scale"
msgstr ""
#: editor/plugins/spatial_editor_plugin.cpp
-msgid "Snap To Floor"
-msgstr ""
-
-#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
msgstr ""
@@ -6221,6 +6343,10 @@ msgstr ""
msgid "Post"
msgstr ""
+#: editor/plugins/spatial_editor_plugin.cpp
+msgid "Name-less gizmo"
+msgstr ""
+
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Sprite is empty!"
msgstr ""
@@ -6338,11 +6464,16 @@ msgid "Set Region Rect"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
+msgid "Set Margin"
+msgstr ""
+
+#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Snap Mode:"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
-msgid "<None>"
+#: scene/resources/visual_shader.cpp
+msgid "None"
msgstr ""
#: editor/plugins/texture_region_editor_plugin.cpp
@@ -6509,6 +6640,11 @@ msgid "Fix Invalid Tiles"
msgstr "ä¸èƒ½ä½¿ç”¨çš„å稱。"
#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Cut Selection"
+msgstr "æ‰€æœ‰çš„é¸æ“‡"
+
+#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
msgstr ""
@@ -6556,32 +6692,37 @@ msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
-msgid "Move Selection"
+msgid "Copy Selection"
msgstr "移除所é¸"
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 0 degrees"
+msgid "Rotate left"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 90 degrees"
+msgid "Rotate right"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 180 degrees"
+msgid "Flip horizontally"
msgstr ""
#: editor/plugins/tile_map_editor_plugin.cpp
-msgid "Rotate 270 degrees"
+msgid "Flip vertically"
msgstr ""
+#: editor/plugins/tile_map_editor_plugin.cpp
+#, fuzzy
+msgid "Clear transform"
+msgstr "動畫更改座標"
+
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Add Texture(s) to TileSet"
+msgid "Add Texture(s) to TileSet."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
-msgid "Remove current Texture from TileSet"
+msgid "Remove selected Texture from TileSet."
msgstr "移除"
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6593,25 +6734,47 @@ msgid "Merge from Scene"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid ""
-"Select sub-tile to use as icon, this will be also used on invalid autotile "
-"bindings."
+msgid "Copy bitmask."
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste bitmask."
+msgstr "è²¼ä¸Šåƒæ•¸"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Erase bitmask."
+msgstr "æ‰€æœ‰çš„é¸æ“‡"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create a new polygon."
+msgstr "新增資料夾"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Keep polygon inside region Rect."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Display tile's names (hold Alt Key)"
+msgid "Enable snap and show grid (configurable via the Inspector)."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Remove Selected Textue and ALL TILES wich uses it?"
+msgid "Display Tile Names (Hold Alt Key)"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove selected texture? This will remove all tiles which use it."
+msgstr "移除"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Create from scene?"
+msgid "Create from scene? This will overwrite all current tiles."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6619,7 +6782,12 @@ msgid "Merge from scene?"
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid " file(s) was not added because was already on the list."
+#, fuzzy
+msgid "Remove Texture"
+msgstr "移除"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "%s file(s) were not added because was already on the list."
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -6629,16 +6797,27 @@ msgid ""
msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete selected Rect."
+msgstr "ç¢ºå®šåˆªé™¤æ‰€é¸æ“‡çš„æª”案嗎?"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid ""
-"LMB: set bit on.\n"
-"RMB: set bit off.\n"
+"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr ""
+msgstr "新增資料夾"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Delete polygon."
+msgstr "刪除"
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
msgid ""
-"Select current edited sub-tile.\n"
+"LMB: Set bit on.\n"
+"RMB: Set bit off.\n"
"Click on another Tile to edit it."
msgstr "新增資料夾"
@@ -6657,11 +6836,97 @@ msgstr ""
#: editor/plugins/tile_set_editor_plugin.cpp
#, fuzzy
+msgid ""
+"Select sub-tile to change its z index.\n"
+"Click on another Tile to edit it."
+msgstr "新增資料夾"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Region"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Tile"
+msgstr "新增資料夾"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Set Tile Icon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Bitmask"
+msgstr "éŽæ¿¾æª”案..."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Collision Polygon"
+msgstr "新增資料夾"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Occlusion Polygon"
+msgstr "新增資料夾"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Navigation Polygon"
+msgstr "新增資料夾"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Paste Tile Bitmask"
+msgstr "è²¼ä¸Šåƒæ•¸"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Clear Tile Bitmask"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Tile"
+msgstr "移除"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Remove Collision Polygon"
+msgstr "移除"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Occlusion Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Remove Navigation Polygon"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Edit Tile Priority"
+msgstr "éŽæ¿¾æª”案..."
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+msgid "Edit Tile Z Index"
+msgstr ""
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Collision Polygon"
+msgstr "新增資料夾"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
+msgid "Create Occlusion Polygon"
+msgstr "新增資料夾"
+
+#: editor/plugins/tile_set_editor_plugin.cpp
+#, fuzzy
msgid "This property can't be changed."
msgstr "æ­¤æ“作無法在沒有根節點的情æ³ä¸‹é€²è¡Œã€‚"
#: editor/plugins/tile_set_editor_plugin.cpp
-msgid "Tile Set"
+msgid "TileSet"
msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -6698,6 +6963,15 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr ""
#: editor/project_export.cpp
+msgid "Release"
+msgstr ""
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Exporting All"
+msgstr "輸出"
+
+#: editor/project_export.cpp
msgid "Presets"
msgstr ""
@@ -6706,6 +6980,11 @@ msgid "Add..."
msgstr ""
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export Path"
+msgstr "輸出"
+
+#: editor/project_export.cpp
msgid "Resources"
msgstr ""
@@ -6762,10 +7041,50 @@ msgstr "方法:"
#: editor/project_export.cpp
#, fuzzy
+msgid "Script"
+msgstr "開啟最近存å–"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Script Export Mode:"
+msgstr "輸出"
+
+#: editor/project_export.cpp
+msgid "Text"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Compiled"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Encrypted (Provide Key Below)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Invalid Encryption Key (must be 64 characters long)"
+msgstr ""
+
+#: editor/project_export.cpp
+msgid "Script Encryption Key (256-bits as hex):"
+msgstr ""
+
+#: editor/project_export.cpp
+#, fuzzy
msgid "Export PCK/Zip"
msgstr "輸出"
#: editor/project_export.cpp
+#, fuzzy
+msgid "Export mode?"
+msgstr "輸出"
+
+#: editor/project_export.cpp
+#, fuzzy
+msgid "Export All"
+msgstr "輸出"
+
+#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
msgstr ""
@@ -6899,7 +7218,7 @@ msgstr ""
#: editor/project_manager.cpp
#, fuzzy
-msgid "Can't open project"
+msgid "Can't open project at '%s'."
msgstr "連接..."
#: editor/project_manager.cpp
@@ -6908,6 +7227,24 @@ msgstr ""
#: editor/project_manager.cpp
msgid ""
+"The following project settings file was generated by an older engine "
+"version, and needs to be converted for this version:\n"
+"\n"
+"%s\n"
+"\n"
+"Do you want to convert it?\n"
+"Warning: You will not be able to open the project with previous versions of "
+"the engine anymore."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
+"The project settings were created by a newer engine version, whose settings "
+"are not compatible with this version."
+msgstr ""
+
+#: editor/project_manager.cpp
+msgid ""
"Can't run project: no main scene defined.\n"
"Please edit the project and set the main scene in \"Project Settings\" under "
"the \"Application\" category."
@@ -7225,11 +7562,7 @@ msgstr "專案設定"
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "General"
-msgstr ""
-
-#: editor/project_settings_editor.cpp editor/property_editor.cpp
-msgid "Property:"
-msgstr ""
+msgstr "一般"
#: editor/project_settings_editor.cpp
msgid "Override For..."
@@ -7365,10 +7698,6 @@ msgstr ""
msgid "Bit %d, val %d."
msgstr ""
-#: editor/property_editor.cpp
-msgid "Properties:"
-msgstr ""
-
#: editor/property_selector.cpp
msgid "Select Property"
msgstr ""
@@ -7457,7 +7786,7 @@ msgid "Step"
msgstr "步驟 :"
#: editor/rename_dialog.cpp
-msgid "Ammount by which counter is incremented for each node"
+msgid "Amount by which counter is incremented for each node"
msgstr ""
#: editor/rename_dialog.cpp
@@ -7466,7 +7795,7 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid ""
-"Minium number of digits for the counter.\n"
+"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
@@ -7509,7 +7838,7 @@ msgstr "è½‰æ›æˆ..."
msgid "Reset"
msgstr "é‡è¨­ç¸®æ”¾å¤§å°"
-#: editor/rename_dialog.cpp editor/script_editor_debugger.cpp
+#: editor/rename_dialog.cpp
msgid "Error"
msgstr ""
@@ -7568,6 +7897,10 @@ msgid "Instance Scene(s)"
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid "Instance Child Scene"
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Clear Script"
msgstr ""
@@ -7604,6 +7937,12 @@ msgid "Save New Scene As..."
msgstr ""
#: editor/scene_tree_dock.cpp
+msgid ""
+"Disabling \"editable_instance\" will cause all properties of the node to be "
+"reverted to their default."
+msgstr ""
+
+#: editor/scene_tree_dock.cpp
msgid "Editable Children"
msgstr ""
@@ -7678,6 +8017,11 @@ msgid "Clear Inheritance"
msgstr ""
#: editor/scene_tree_dock.cpp
+#, fuzzy
+msgid "Open documentation"
+msgstr "開啟最近存å–"
+
+#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
msgstr ""
@@ -7686,12 +8030,13 @@ msgid "Add Child Node"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Instance Child Scene"
+msgid "Change Type"
msgstr ""
#: editor/scene_tree_dock.cpp
-msgid "Change Type"
-msgstr ""
+#, fuzzy
+msgid "Extend Script"
+msgstr "開啟最近存å–"
#: editor/scene_tree_dock.cpp
#, fuzzy
@@ -7846,6 +8191,10 @@ msgid "Path is empty"
msgstr ""
#: editor/script_create_dialog.cpp
+msgid "Filename is empty"
+msgstr ""
+
+#: editor/script_create_dialog.cpp
msgid "Path is not local"
msgstr ""
@@ -7937,19 +8286,7 @@ msgid "Bytes:"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Warning"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Error:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Source:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Function:"
+msgid "Stack Trace"
msgstr ""
#: editor/script_editor_debugger.cpp
@@ -7982,18 +8319,6 @@ msgid "Stack Frames"
msgstr ""
#: editor/script_editor_debugger.cpp
-msgid "Variable"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Errors:"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
-msgid "Stack Trace (if applicable):"
-msgstr ""
-
-#: editor/script_editor_debugger.cpp
msgid "Profiler"
msgstr ""
@@ -8202,7 +8527,8 @@ msgid "GDNative"
msgstr ""
#: modules/gdscript/gdscript_functions.cpp
-msgid "step argument is zero!"
+#, fuzzy
+msgid "Step argument is zero!"
msgstr "step引數為0!"
#: modules/gdscript/gdscript_functions.cpp
@@ -8441,11 +8767,7 @@ msgid "End of inner exception stack trace"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake!"
-msgstr ""
-
-#: modules/recast/navigation_mesh_editor_plugin.cpp
-msgid "Bake the navigation mesh."
+msgid "Bake NavMesh"
msgstr ""
#: modules/recast/navigation_mesh_editor_plugin.cpp
@@ -8722,6 +9044,10 @@ msgid "Base Type:"
msgstr ""
#: modules/visual_script/visual_script_editor.cpp
+msgid "Members:"
+msgstr ""
+
+#: modules/visual_script/visual_script_editor.cpp
msgid "Available Nodes:"
msgstr ""
@@ -8822,11 +9148,11 @@ msgid "Search VisualScript"
msgstr "æœå°‹å¹«åŠ©"
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Get"
+msgid "Get %s"
msgstr ""
#: modules/visual_script/visual_script_property_selector.cpp
-msgid "Set "
+msgid "Set %s"
msgstr ""
#: platform/javascript/export/export.cpp
@@ -8915,6 +9241,12 @@ msgid ""
"shape resource for it!"
msgstr "CollisionShape2D必須被賦予形狀æ‰èƒ½é‹ä½œï¼Œè«‹ç‚ºå®ƒå»ºç«‹å€‹å½¢ç‹€å§ï¼"
+#: scene/2d/cpu_particles_2d.cpp
+msgid ""
+"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/light_2d.cpp
msgid ""
"A texture with the shape of the light must be supplied to the 'texture' "
@@ -8953,6 +9285,12 @@ msgid ""
"imprinted."
msgstr ""
+#: scene/2d/particles_2d.cpp
+msgid ""
+"Particles2D animation requires the usage of a CanvasItemMaterial with "
+"\"Particles Animation\" enabled."
+msgstr ""
+
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
msgstr ""
@@ -9070,6 +9408,16 @@ msgid ""
"shape resource for it!"
msgstr ""
+#: scene/3d/cpu_particles.cpp
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr ""
+
+#: scene/3d/cpu_particles.cpp
+msgid ""
+"CPUParticles animation requires the usage of a SpatialMaterial with "
+"\"Billboard Particles\" enabled."
+msgstr ""
+
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
msgstr ""
@@ -9089,6 +9437,26 @@ msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+#: scene/3d/particles.cpp
+msgid ""
+"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
+"Particles\" enabled."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "PathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid "OrientedPathFollow only works when set as a child of a Path node."
+msgstr ""
+
+#: scene/3d/path.cpp
+msgid ""
+"OrientedPathFollow requires \"Up Vector\" enabled in its parent Path's Curve "
+"resource."
+msgstr ""
+
#: scene/3d/physics_body.cpp
msgid ""
"Size changes to RigidBody (in character or rigid modes) will be overridden "
@@ -9121,7 +9489,7 @@ msgstr ""
#: scene/3d/soft_body.cpp
msgid ""
-"Size changes to SoftBody will be overriden by the physics engine when "
+"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
@@ -9178,6 +9546,10 @@ msgstr ""
msgid "AnimationPlayer root is not a valid node."
msgstr ""
+#: scene/animation/animation_tree_player.cpp
+msgid "This node has been deprecated. Use AnimationTree instead."
+msgstr ""
+
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
msgstr ""
@@ -9194,10 +9566,6 @@ msgstr "警告!"
msgid "Please Confirm..."
msgstr "請確èª..."
-#: scene/gui/file_dialog.cpp
-msgid "Select this Folder"
-msgstr "鏿“‡æ­¤è³‡æ–™å¤¾"
-
#: scene/gui/popup.cpp
msgid ""
"Popups will hide by default unless you call popup() or any of the popup*() "
@@ -9205,6 +9573,10 @@ msgid ""
"hide upon running."
msgstr ""
+#: scene/gui/range.cpp
+msgid "If exp_edit is true min_value must be > 0."
+msgstr ""
+
#: scene/gui/scroll_container.cpp
msgid ""
"ScrollContainer is intended to work with a single child control.\n"
@@ -9252,10 +9624,6 @@ msgstr "無效的字體大å°ã€‚"
msgid "Input"
msgstr ""
-#: scene/resources/visual_shader.cpp
-msgid "None"
-msgstr ""
-
#: scene/resources/visual_shader_nodes.cpp
#, fuzzy
msgid "Invalid source for shader."
@@ -9273,6 +9641,77 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Split already exists."
+#~ msgstr "Autoload「%sã€å·²ç¶“存在!"
+
+#, fuzzy
+#~ msgid "Invalid Split: "
+#~ msgstr "無效的路徑"
+
+#, fuzzy
+#~ msgid "Remove Split"
+#~ msgstr "移除"
+
+#, fuzzy
+#~ msgid "Zoom out"
+#~ msgstr "縮å°"
+
+#, fuzzy
+#~ msgid "Zoom in"
+#~ msgstr "放大"
+
+#, fuzzy
+#~ msgid "New TextFile"
+#~ msgstr "éŽæ¿¾æª”案..."
+
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "放大"
+
+#~ msgid "Class List:"
+#~ msgstr "Class 列表:"
+
+#~ msgid "Search Classes"
+#~ msgstr "æœå°‹ Class"
+
+#~ msgid "Public Methods:"
+#~ msgstr "公開 method:"
+
+#~ msgid "GUI Theme Items"
+#~ msgstr "介é¢ä¸»é¡Œé …ç›®"
+
+#~ msgid "GUI Theme Items:"
+#~ msgstr "介é¢ä¸»é¡Œé …ç›®:"
+
+#, fuzzy
+#~ msgid "Toggle folder status as Favorite."
+#~ msgstr "åˆ‡æ›æœ€æ„›"
+
+#, fuzzy
+#~ msgid "Show current scene file."
+#~ msgstr "新增資料夾"
+
+#, fuzzy
+#~ msgid "Whole words"
+#~ msgstr "整個字"
+
+#, fuzzy
+#~ msgid "Match case"
+#~ msgstr "符åˆå¤§å°å¯«"
+
+#, fuzzy
+#~ msgid "Search in files"
+#~ msgstr "æœå°‹ Class"
+
+#, fuzzy
+#~ msgid "Convert To Uppercase"
+#~ msgstr "è½‰æ›æˆ..."
+
+#, fuzzy
+#~ msgid "Convert To Lowercase"
+#~ msgstr "è½‰æ›æˆ..."
+
#~ msgid "Disabled"
#~ msgstr "å·²åœç”¨"
@@ -9298,9 +9737,6 @@ msgstr ""
#~ msgid "Anim Track Change Wrap Mode"
#~ msgstr "å‹•ç•«è»Œé“æ›´æ”¹ç’°ç¹žæ¨¡å¼"
-#~ msgid "Edit Node Curve"
-#~ msgstr "編輯節點曲線"
-
#~ msgid "Edit Selection Curve"
#~ msgstr "ç·¨è¼¯æ‰€é¸æ›²ç·š"
@@ -9362,9 +9798,6 @@ msgstr ""
#~ msgid "Thanks!"
#~ msgstr "è¬è¬!"
-#~ msgid "I see..."
-#~ msgstr "我知é“了"
-
#~ msgid "Can't open '%s'."
#~ msgstr "無法開啟 \"%s\"。"
diff --git a/gles_builders.py b/gles_builders.py
index f9fd6d3fa2..e56ccc4431 100644
--- a/gles_builders.py
+++ b/gles_builders.py
@@ -231,9 +231,9 @@ def build_legacygl_header(filename, include, class_suffix, output_attribs, gles2
fd.write("\t_FORCE_INLINE_ void set_conditional(Conditionals p_conditional,bool p_enable) { _set_conditional(p_conditional,p_enable); }\n\n")
fd.write("\t#ifdef DEBUG_ENABLED\n ")
fd.write("\t#define _FU if (get_uniform(p_uniform)<0) return; if (!is_version_valid()) return; ERR_FAIL_COND( get_active()!=this ); \n\n ")
- fd.write("\t#else\n ")
+ fd.write("\t#else\n ")
fd.write("\t#define _FU if (get_uniform(p_uniform)<0) return; \n\n ")
- fd.write("\t#endif\n")
+ fd.write("\t#endif\n")
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, float p_value) { _FU glUniform1f(get_uniform(p_uniform),p_value); }\n\n")
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, double p_value) { _FU glUniform1f(get_uniform(p_uniform),p_value); }\n\n")
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, uint8_t p_value) { _FU glUniform1i(get_uniform(p_uniform),p_value); }\n\n")
diff --git a/main/default_controller_mappings.h b/main/default_controller_mappings.h
index 6319b875eb..15fc6fa361 100644
--- a/main/default_controller_mappings.h
+++ b/main/default_controller_mappings.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/input_default.cpp b/main/input_default.cpp
index b1084900d6..18b4649f4d 100644
--- a/main/input_default.cpp
+++ b/main/input_default.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -280,7 +280,7 @@ void InputDefault::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool
Ref<InputEventMouseButton> mb = p_event;
- if (mb.is_valid() && !mb->is_doubleclick()) {
+ if (mb.is_valid()) {
if (mb->is_pressed()) {
mouse_button_mask |= (1 << (mb->get_button_index() - 1));
@@ -1084,7 +1084,7 @@ Array InputDefault::get_connected_joypads() {
return ret;
}
-static const char *_buttons[] = {
+static const char *_buttons[JOY_BUTTON_MAX] = {
"Face Button Bottom",
"Face Button Right",
"Face Button Left",
@@ -1103,7 +1103,7 @@ static const char *_buttons[] = {
"DPAD Right"
};
-static const char *_axes[] = {
+static const char *_axes[JOY_AXIS_MAX] = {
"Left Stick X",
"Left Stick Y",
"Right Stick X",
@@ -1111,7 +1111,9 @@ static const char *_axes[] = {
"",
"",
"L2",
- "R2"
+ "R2",
+ "",
+ ""
};
String InputDefault::get_joy_button_string(int p_button) {
diff --git a/main/input_default.h b/main/input_default.h
index b6767669f0..75dd1e67f6 100644
--- a/main/input_default.h
+++ b/main/input_default.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/main.cpp b/main/main.cpp
index ca1b03392a..cbf30af38c 100644
--- a/main/main.cpp
+++ b/main/main.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -205,8 +205,8 @@ void finalize_physics() {
void Main::print_help(const char *p_binary) {
print_line(String(VERSION_NAME) + " v" + get_full_version_string() + " - https://godotengine.org");
- OS::get_singleton()->print("(c) 2007-2018 Juan Linietsky, Ariel Manzur.\n");
- OS::get_singleton()->print("(c) 2014-2018 Godot Engine contributors.\n");
+ OS::get_singleton()->print("(c) 2007-2019 Juan Linietsky, Ariel Manzur.\n");
+ OS::get_singleton()->print("(c) 2014-2019 Godot Engine contributors.\n");
OS::get_singleton()->print("\n");
OS::get_singleton()->print("Usage: %s [options] [path to scene or 'project.godot' file]\n", p_binary);
OS::get_singleton()->print("\n");
@@ -880,6 +880,9 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
GLOBAL_DEF("rendering/quality/driver/driver_fallback", "Best");
ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/driver/driver_fallback", PropertyInfo(Variant::STRING, "rendering/quality/driver/driver_fallback", PROPERTY_HINT_ENUM, "Best,Never"));
+ // Assigning here even though it's GLES2-specific, to be sure that it appears in docs
+ GLOBAL_DEF("rendering/quality/2d/gles2_use_nvidia_rect_flicker_workaround", false);
+
GLOBAL_DEF("display/window/size/width", 1024);
ProjectSettings::get_singleton()->set_custom_property_info("display/window/size/width", PropertyInfo(Variant::INT, "display/window/size/width", PROPERTY_HINT_RANGE, "0,7680,or_greater")); // 8K resolution
GLOBAL_DEF("display/window/size/height", 600);
@@ -1029,8 +1032,6 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
message_queue = memnew(MessageQueue);
- ProjectSettings::get_singleton()->register_global_defaults();
-
if (p_second_phase)
return setup2();
@@ -1230,6 +1231,7 @@ Error Main::setup2(Thread::ID p_main_tid_override) {
register_driver_types();
+ // This loads global classes, so it must happen before custom loaders and savers are registered
ScriptServer::init_languages();
MAIN_PRINT("Main: Load Translations");
@@ -1489,6 +1491,9 @@ bool Main::start() {
}
#endif
+ ResourceLoader::add_custom_loaders();
+ ResourceSaver::add_custom_savers();
+
if (!project_manager && !editor) { // game
if (game_path != "" || script != "") {
//autoload
@@ -1697,12 +1702,17 @@ bool Main::start() {
#ifdef TOOLS_ENABLED
if (editor) {
- Error serr = editor_node->load_scene(local_game_path);
- if (serr != OK)
- ERR_PRINT("Failed to load scene");
+ if (game_path != GLOBAL_GET("application/run/main_scene") || !editor_node->has_scenes_in_session()) {
+ Error serr = editor_node->load_scene(local_game_path);
+ if (serr != OK)
+ ERR_PRINT("Failed to load scene");
+ }
OS::get_singleton()->set_context(OS::CONTEXT_EDITOR);
}
#endif
+ if (!editor) {
+ OS::get_singleton()->set_context(OS::CONTEXT_ENGINE);
+ }
}
if (!project_manager && !editor) { // game
@@ -1925,7 +1935,7 @@ bool Main::iteration() {
}
int target_fps = Engine::get_singleton()->get_target_fps();
- if (target_fps > 0) {
+ if (target_fps > 0 && !Engine::get_singleton()->is_editor_hint()) {
uint64_t time_step = 1000000L / target_fps;
target_ticks += time_step;
uint64_t current_ticks = OS::get_singleton()->get_ticks_usec();
@@ -1956,11 +1966,13 @@ void Main::force_redraw() {
* so that the engine closes cleanly without leaking memory or crashing.
* The order matters as some of those steps are linked with each other.
*/
-
void Main::cleanup() {
ERR_FAIL_COND(!_start_success);
+ ResourceLoader::remove_custom_loaders();
+ ResourceSaver::remove_custom_savers();
+
message_queue->flush();
memdelete(message_queue);
@@ -1992,6 +2004,8 @@ void Main::cleanup() {
memdelete(arvr_server);
}
+ ImageLoader::cleanup();
+
unregister_driver_types();
unregister_module_types();
unregister_platform_apis();
diff --git a/main/main.h b/main/main.h
index 23a19dddec..01fc259a8a 100644
--- a/main/main.h
+++ b/main/main.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/performance.cpp b/main/performance.cpp
index aab3a8646f..49a08aa8d1 100644
--- a/main/performance.cpp
+++ b/main/performance.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/performance.h b/main/performance.h
index 41822562c5..850c4c2d52 100644
--- a/main/performance.h
+++ b/main/performance.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/splash_editor.png b/main/splash_editor.png
index d5bc2f1ce6..d8677f1749 100644
--- a/main/splash_editor.png
+++ b/main/splash_editor.png
Binary files differ
diff --git a/main/tests/test_astar.cpp b/main/tests/test_astar.cpp
index 8b48f075bc..d34ff0d95e 100644
--- a/main/tests/test_astar.cpp
+++ b/main/tests/test_astar.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/tests/test_astar.h b/main/tests/test_astar.h
index 6458f9efb1..0b3e4d6c9d 100644
--- a/main/tests/test_astar.h
+++ b/main/tests/test_astar.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/tests/test_gdscript.cpp b/main/tests/test_gdscript.cpp
index 4d2fa2a26d..60f9568fbd 100644
--- a/main/tests/test_gdscript.cpp
+++ b/main/tests/test_gdscript.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/tests/test_gdscript.h b/main/tests/test_gdscript.h
index 0a052c8db5..6b98f7cc41 100644
--- a/main/tests/test_gdscript.h
+++ b/main/tests/test_gdscript.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/tests/test_gui.cpp b/main/tests/test_gui.cpp
index 271353f1dd..a71b9cdc69 100644
--- a/main/tests/test_gui.cpp
+++ b/main/tests/test_gui.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/tests/test_gui.h b/main/tests/test_gui.h
index 25dfa3bc2b..1752818981 100644
--- a/main/tests/test_gui.h
+++ b/main/tests/test_gui.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/tests/test_image.cpp b/main/tests/test_image.cpp
index 979e590ab8..ee4f43bae0 100644
--- a/main/tests/test_image.cpp
+++ b/main/tests/test_image.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/tests/test_image.h b/main/tests/test_image.h
index 381edf7ef9..b9b3c0cb48 100644
--- a/main/tests/test_image.h
+++ b/main/tests/test_image.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/tests/test_io.cpp b/main/tests/test_io.cpp
deleted file mode 100644
index 4e43ee6a54..0000000000
--- a/main/tests/test_io.cpp
+++ /dev/null
@@ -1,133 +0,0 @@
-/*************************************************************************/
-/* test_io.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "test_io.h"
-
-#ifdef MINIZIP_ENABLED
-
-#include "core/io/resource_loader.h"
-#include "core/io/resource_saver.h"
-#include "core/os/dir_access.h"
-#include "core/os/main_loop.h"
-#include "core/os/os.h"
-#include "core/print_string.h"
-#include "core/project_settings.h"
-#include "scene/resources/texture.h"
-
-#include "core/io/file_access_memory.h"
-
-namespace TestIO {
-
-class TestMainLoop : public MainLoop {
-
- bool quit;
-
-public:
- virtual void input_event(const Ref<InputEvent> &p_event) {
- }
- virtual bool idle(float p_time) {
- return false;
- }
-
- virtual void request_quit() {
-
- quit = true;
- }
- virtual void init() {
-
- quit = true;
- }
- virtual bool iteration(float p_time) {
-
- return quit;
- }
- virtual void finish() {
- }
-};
-
-MainLoop *test() {
-
- print_line("this is test io");
- DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
- da->change_dir(".");
- print_line("Opening current dir " + da->get_current_dir());
- String entry;
- da->list_dir_begin();
- while ((entry = da->get_next()) != "") {
-
- print_line("entry " + entry + " is dir: " + Variant(da->current_is_dir()));
- };
- da->list_dir_end();
-
- RES texture = ResourceLoader::load("test_data/rock.png");
- ERR_FAIL_COND_V(texture.is_null(), NULL);
-
- ResourceSaver::save("test_data/rock.xml", texture);
-
- print_line("localize paths");
- print_line(ProjectSettings::get_singleton()->localize_path("algo.xml"));
- print_line(ProjectSettings::get_singleton()->localize_path("c:\\windows\\algo.xml"));
- print_line(ProjectSettings::get_singleton()->localize_path(ProjectSettings::get_singleton()->get_resource_path() + "/something/something.xml"));
- print_line(ProjectSettings::get_singleton()->localize_path("somedir/algo.xml"));
-
- {
-
- FileAccess *z = FileAccess::open("test_data/archive.zip", FileAccess::READ);
- int len = z->get_len();
- Vector<uint8_t> zip;
- zip.resize(len);
- z->get_buffer(zip.ptrw(), len);
- z->close();
- memdelete(z);
-
- FileAccessMemory::register_file("a_package", zip);
- FileAccess::make_default<FileAccessMemory>(FileAccess::ACCESS_RESOURCES);
- FileAccess::make_default<FileAccessMemory>(FileAccess::ACCESS_FILESYSTEM);
- FileAccess::make_default<FileAccessMemory>(FileAccess::ACCESS_USERDATA);
-
- print_line("archive test");
- };
-
- print_line("test done");
-
- return memnew(TestMainLoop);
-}
-} // namespace TestIO
-
-#else
-
-namespace TestIO {
-
-MainLoop *test() {
-
- return NULL;
-}
-} // namespace TestIO
-#endif
diff --git a/main/tests/test_main.cpp b/main/tests/test_main.cpp
index 714a254371..49f5cc5a18 100644
--- a/main/tests/test_main.cpp
+++ b/main/tests/test_main.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -37,7 +37,6 @@
#include "test_gdscript.h"
#include "test_gui.h"
#include "test_image.h"
-#include "test_io.h"
#include "test_math.h"
#include "test_oa_hash_map.h"
#include "test_ordered_hash_map.h"
@@ -57,7 +56,6 @@ const char **tests_get_names() {
"render",
"oa_hash_map",
"gui",
- "io",
"shaderlang",
"gd_tokenizer",
"gd_parser",
@@ -111,11 +109,6 @@ MainLoop *test_main(String p_test, const List<String> &p_args) {
}
#endif
- if (p_test == "io") {
-
- return TestIO::test();
- }
-
if (p_test == "shaderlang") {
return TestShaderLang::test();
diff --git a/main/tests/test_main.h b/main/tests/test_main.h
index 55ab4daeb8..521284bec8 100644
--- a/main/tests/test_main.h
+++ b/main/tests/test_main.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/tests/test_math.cpp b/main/tests/test_math.cpp
index a48fdbe4e3..a082abcaba 100644
--- a/main/tests/test_math.cpp
+++ b/main/tests/test_math.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -444,14 +444,11 @@ MainLoop *test() {
float bb = (rgbe >> 18) & 0x1ff;
float eb = (rgbe >> 27);
float mb = Math::pow(2, eb - 15.0 - 9.0);
- ;
float rd = rb * mb;
float gd = gb * mb;
float bd = bb * mb;
print_line("RGBE: " + Color(rd, gd, bd));
-
- return NULL;
}
print_line("Dvectors: " + itos(MemoryPool::allocs_used));
@@ -482,8 +479,6 @@ MainLoop *test() {
print_line("later Mem used: " + itos(MemoryPool::total_memory));
print_line("Mlater Ax mem used: " + itos(MemoryPool::max_memory));
- return NULL;
-
List<String> cmdlargs = OS::get_singleton()->get_cmdline_args();
if (cmdlargs.empty()) {
@@ -492,6 +487,11 @@ MainLoop *test() {
}
String test = cmdlargs.back()->get();
+ if (test == "math") {
+ // Not a file name but the test name, abort.
+ // FIXME: This test is ugly as heck, needs fixing :)
+ return NULL;
+ }
FileAccess *fa = FileAccess::open(test, FileAccess::READ);
@@ -516,8 +516,6 @@ MainLoop *test() {
print_line("Found class: " + getclass.get_class());
}
- return NULL;
-
{
Vector<int> hashes;
@@ -557,13 +555,10 @@ MainLoop *test() {
}
print_line("DONE");
-
- return NULL;
}
- {
+ {
print_line("NUM: " + itos(-128));
- return NULL;
}
{
@@ -593,7 +588,6 @@ MainLoop *test() {
print_line("after v: " + v + " a: " + rtos(a));
}
- return NULL;
String ret;
List<String> args;
@@ -602,7 +596,6 @@ MainLoop *test() {
print_line("error: " + itos(err));
print_line(ret);
- return NULL;
Basis m3;
m3.rotate(Vector3(1, 0, 0), 0.2);
m3.rotate(Vector3(0, 1, 0), 1.77);
@@ -611,17 +604,13 @@ MainLoop *test() {
m32.set_euler(m3.get_euler());
print_line("ELEULEEEEEEEEEEEEEEEEEER: " + m3.get_euler() + " vs " + m32.get_euler());
- return NULL;
-
{
-
Dictionary d;
d["momo"] = 1;
Dictionary b = d;
b["44"] = 4;
}
- return NULL;
print_line("inters: " + rtos(Geometry::segment_intersects_circle(Vector2(-5, 0), Vector2(-2, 0), Vector2(), 1.0)));
print_line("cross: " + Vector3(1, 2, 3).cross(Vector3(4, 5, 7)));
diff --git a/main/tests/test_math.h b/main/tests/test_math.h
index 2d0c6c461f..9f1e96358f 100644
--- a/main/tests/test_math.h
+++ b/main/tests/test_math.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/tests/test_oa_hash_map.cpp b/main/tests/test_oa_hash_map.cpp
index deaba285cf..070420e432 100644
--- a/main/tests/test_oa_hash_map.cpp
+++ b/main/tests/test_oa_hash_map.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -95,7 +95,7 @@ MainLoop *test() {
// stress test / test for issue #22928
{
OAHashMap<int, int> map;
- int dummy;
+ int dummy = 0;
const int N = 1000;
uint32_t *keys = new uint32_t[N];
diff --git a/main/tests/test_oa_hash_map.h b/main/tests/test_oa_hash_map.h
index 677021f933..fb43dc325f 100644
--- a/main/tests/test_oa_hash_map.h
+++ b/main/tests/test_oa_hash_map.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/tests/test_ordered_hash_map.cpp b/main/tests/test_ordered_hash_map.cpp
index cad52ceedf..6aef94efe3 100644
--- a/main/tests/test_ordered_hash_map.cpp
+++ b/main/tests/test_ordered_hash_map.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/tests/test_ordered_hash_map.h b/main/tests/test_ordered_hash_map.h
index 6723e70b79..731a36a716 100644
--- a/main/tests/test_ordered_hash_map.h
+++ b/main/tests/test_ordered_hash_map.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/tests/test_physics.cpp b/main/tests/test_physics.cpp
index c869b268b0..84f504a78d 100644
--- a/main/tests/test_physics.cpp
+++ b/main/tests/test_physics.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/tests/test_physics.h b/main/tests/test_physics.h
index c260bf9fcc..699e31f492 100644
--- a/main/tests/test_physics.h
+++ b/main/tests/test_physics.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/tests/test_physics_2d.cpp b/main/tests/test_physics_2d.cpp
index 8245ee276e..9a2bf0107a 100644
--- a/main/tests/test_physics_2d.cpp
+++ b/main/tests/test_physics_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/tests/test_physics_2d.h b/main/tests/test_physics_2d.h
index 52669777c0..3a513f4d6e 100644
--- a/main/tests/test_physics_2d.h
+++ b/main/tests/test_physics_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/tests/test_render.cpp b/main/tests/test_render.cpp
index ebf6d363be..826d544f13 100644
--- a/main/tests/test_render.cpp
+++ b/main/tests/test_render.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/tests/test_render.h b/main/tests/test_render.h
index 717074021c..3810760b56 100644
--- a/main/tests/test_render.h
+++ b/main/tests/test_render.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/tests/test_shader_lang.cpp b/main/tests/test_shader_lang.cpp
index 9df5973376..ebaf7fd602 100644
--- a/main/tests/test_shader_lang.cpp
+++ b/main/tests/test_shader_lang.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -180,7 +180,7 @@ static String dump_node_code(SL::Node *p_node, int p_level) {
String scode = dump_node_code(bnode->statements[i], p_level);
- if (bnode->statements[i]->type == SL::Node::TYPE_CONTROL_FLOW || bnode->statements[i]->type == SL::Node::TYPE_CONTROL_FLOW) {
+ if (bnode->statements[i]->type == SL::Node::TYPE_CONTROL_FLOW) {
code += scode; //use directly
} else {
code += _mktab(p_level) + scode + ";\n";
diff --git a/main/tests/test_shader_lang.h b/main/tests/test_shader_lang.h
index e99858fdc6..79213aa96f 100644
--- a/main/tests/test_shader_lang.h
+++ b/main/tests/test_shader_lang.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/tests/test_string.cpp b/main/tests/test_string.cpp
index 7e19c7bf3e..511646db0a 100644
--- a/main/tests/test_string.cpp
+++ b/main/tests/test_string.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -942,8 +942,110 @@ bool test_30() {
OS::get_singleton()->print("Capitalize %ls: %ls, %s\n", input.c_str(), output.c_str(), success ? "OK" : "FAIL");
return state;
+}
+
+bool test_31() {
+ bool state = true;
+ bool success;
+
+ String a = "";
+ success = a[0] == 0;
+ OS::get_singleton()->print("Is 0 String[0]:, %s\n", success ? "OK" : "FAIL");
+ if (!success) state = false;
+
+ String b = "Godot";
+ success = b[b.size()] == 0;
+ OS::get_singleton()->print("Is 0 String[size()]:, %s\n", success ? "OK" : "FAIL");
+ if (!success) state = false;
+
+ const String c = "";
+ success = c[0] == 0;
+ OS::get_singleton()->print("Is 0 const String[0]:, %s\n", success ? "OK" : "FAIL");
+ if (!success) state = false;
+
+ const String d = "Godot";
+ success = d[d.size()] == 0;
+ OS::get_singleton()->print("Is 0 const String[size()]:, %s\n", success ? "OK" : "FAIL");
+ if (!success) state = false;
+
+ return state;
};
+bool test_32() {
+
+#define STRIP_TEST(x) \
+ { \
+ bool success = x; \
+ state = state && success; \
+ if (!success) { \
+ OS::get_singleton()->print("\tfailed at: %s\n", #x); \
+ } \
+ }
+
+ OS::get_singleton()->print("\n\nTest 32: lstrip and rstrip\n");
+ bool state = true;
+
+ // strip none
+ STRIP_TEST(String("abc").lstrip("") == "abc");
+ STRIP_TEST(String("abc").rstrip("") == "abc");
+ // strip one
+ STRIP_TEST(String("abc").lstrip("a") == "bc");
+ STRIP_TEST(String("abc").rstrip("c") == "ab");
+ // strip lots
+ STRIP_TEST(String("bababbababccc").lstrip("ab") == "ccc");
+ STRIP_TEST(String("aaabcbcbcbbcbbc").rstrip("cb") == "aaa");
+ // strip empty string
+ STRIP_TEST(String("").lstrip("") == "");
+ STRIP_TEST(String("").rstrip("") == "");
+ // strip to empty string
+ STRIP_TEST(String("abcabcabc").lstrip("bca") == "");
+ STRIP_TEST(String("abcabcabc").rstrip("bca") == "");
+ // don't strip wrong end
+ STRIP_TEST(String("abc").lstrip("c") == "abc");
+ STRIP_TEST(String("abca").lstrip("a") == "bca");
+ STRIP_TEST(String("abc").rstrip("a") == "abc");
+ STRIP_TEST(String("abca").rstrip("a") == "abc");
+ // in utf-8 "¿" has the same first byte as "µ"
+ // and the same second as "ÿ"
+ STRIP_TEST(String::utf8("¿").lstrip(String::utf8("µÿ")) == String::utf8("¿"));
+ STRIP_TEST(String::utf8("¿").rstrip(String::utf8("µÿ")) == String::utf8("¿"));
+ STRIP_TEST(String::utf8("µ¿ÿ").lstrip(String::utf8("µÿ")) == String::utf8("¿ÿ"));
+ STRIP_TEST(String::utf8("µ¿ÿ").rstrip(String::utf8("µÿ")) == String::utf8("µ¿"));
+
+ // the above tests repeated with additional superfluous strip chars
+
+ // strip none
+ STRIP_TEST(String("abc").lstrip("qwjkl") == "abc");
+ STRIP_TEST(String("abc").rstrip("qwjkl") == "abc");
+ // strip one
+ STRIP_TEST(String("abc").lstrip("qwajkl") == "bc");
+ STRIP_TEST(String("abc").rstrip("qwcjkl") == "ab");
+ // strip lots
+ STRIP_TEST(String("bababbababccc").lstrip("qwabjkl") == "ccc");
+ STRIP_TEST(String("aaabcbcbcbbcbbc").rstrip("qwcbjkl") == "aaa");
+ // strip empty string
+ STRIP_TEST(String("").lstrip("qwjkl") == "");
+ STRIP_TEST(String("").rstrip("qwjkl") == "");
+ // strip to empty string
+ STRIP_TEST(String("abcabcabc").lstrip("qwbcajkl") == "");
+ STRIP_TEST(String("abcabcabc").rstrip("qwbcajkl") == "");
+ // don't strip wrong end
+ STRIP_TEST(String("abc").lstrip("qwcjkl") == "abc");
+ STRIP_TEST(String("abca").lstrip("qwajkl") == "bca");
+ STRIP_TEST(String("abc").rstrip("qwajkl") == "abc");
+ STRIP_TEST(String("abca").rstrip("qwajkl") == "abc");
+ // in utf-8 "¿" has the same first byte as "µ"
+ // and the same second as "ÿ"
+ STRIP_TEST(String::utf8("¿").lstrip(String::utf8("qwaµÿjkl")) == String::utf8("¿"));
+ STRIP_TEST(String::utf8("¿").rstrip(String::utf8("qwaµÿjkl")) == String::utf8("¿"));
+ STRIP_TEST(String::utf8("µ¿ÿ").lstrip(String::utf8("qwaµÿjkl")) == String::utf8("¿ÿ"));
+ STRIP_TEST(String::utf8("µ¿ÿ").rstrip(String::utf8("qwaµÿjkl")) == String::utf8("µ¿"));
+
+ return state;
+
+#undef STRIP_TEST
+}
+
typedef bool (*TestFunc)(void);
TestFunc test_funcs[] = {
@@ -978,6 +1080,8 @@ TestFunc test_funcs[] = {
test_28,
test_29,
test_30,
+ test_31,
+ test_32,
0
};
diff --git a/main/tests/test_string.h b/main/tests/test_string.h
index e293e96604..a8adb3a890 100644
--- a/main/tests/test_string.h
+++ b/main/tests/test_string.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/timer_sync.cpp b/main/timer_sync.cpp
index 275465914e..5ee834880f 100644
--- a/main/timer_sync.cpp
+++ b/main/timer_sync.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/main/timer_sync.h b/main/timer_sync.h
index 75fbe6a9dc..fcce6d7a9a 100644
--- a/main/timer_sync.h
+++ b/main/timer_sync.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/methods.py b/methods.py
index 111a2347be..f8fc6c64ef 100644
--- a/methods.py
+++ b/methods.py
@@ -6,7 +6,7 @@ import glob
import string
import datetime
import subprocess
-from compat import iteritems, isbasestring
+from compat import iteritems, isbasestring, decode_utf8
def add_source_files(self, sources, filetype, lib_env=None, shared=False):
@@ -591,7 +591,7 @@ def generate_vs_project(env, num_jobs):
release_debug_targets = ['bin\\godot.windows.opt.tools.32.exe'] + ['bin\\godot.windows.opt.tools.64.exe']
targets = debug_targets + release_targets + release_debug_targets
if not env.get('MSVS'):
- env['MSVS']['PROJECTSUFFIX'] = '.vcxproj'
+ env['MSVS']['PROJECTSUFFIX'] = '.vcxproj'
env['MSVS']['SOLUTIONSUFFIX'] = '.sln'
env.MSVSProject(
target=['#godot' + env['MSVSPROJECTSUFFIX']],
@@ -628,3 +628,27 @@ def CommandNoCache(env, target, sources, command, **args):
result = env.Command(target, sources, command, **args)
env.NoCache(result)
return result
+
+def detect_darwin_sdk_path(platform, env):
+ sdk_name = ''
+ if platform == 'osx':
+ sdk_name = 'macosx'
+ var_name = 'MACOS_SDK_PATH'
+ elif platform == 'iphone':
+ sdk_name = 'iphoneos'
+ var_name = 'IPHONESDK'
+ elif platform == 'iphonesimulator':
+ sdk_name = 'iphonesimulator'
+ var_name = 'IPHONESDK'
+ else:
+ raise Exception("Invalid platform argument passed to detect_darwin_sdk_path")
+
+ if not env[var_name]:
+ try:
+ sdk_path = decode_utf8(subprocess.check_output(['xcrun', '--sdk', sdk_name, '--show-sdk-path']).strip())
+ if sdk_path:
+ env[var_name] = sdk_path
+ except (subprocess.CalledProcessError, OSError) as e:
+ print("Failed to find SDK path while running xcrun --sdk {} --show-sdk-path.".format(sdk_name))
+ raise
+
diff --git a/misc/dist/document_icon.svg b/misc/dist/document_icon.svg
deleted file mode 100644
index 2652110fa5..0000000000
--- a/misc/dist/document_icon.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024">
-<path d="M159.143 69.856v884.288h705.714v-665.51L646.08 69.856z" fill="#fff" stroke="#d2d2d2" stroke-width="20"/>
-<g stroke-width=".32">
- <path d="M723.128 594.284s-.701-4.304-1.111-4.265l-78.083 7.534a12.691 12.691 0 0 0-11.474 11.78l-2.145 30.747-60.408 4.31-4.11-27.866c-.914-6.198-6.326-10.87-12.591-10.87h-82.412c-6.263 0-11.675 4.672-12.59 10.87l-4.111 27.865-60.408-4.31-2.145-30.745a12.692 12.692 0 0 0-11.475-11.783l-78.12-7.532c-.404-.039-.7 4.269-1.104 4.269l-.105 16.897 66.161 10.67 2.167 31.02c.438 6.28 5.505 11.357 11.79 11.808l83.194 5.935c.315.022.626.035.937.035 6.252 0 11.655-4.675 12.57-10.873l4.228-28.671h60.436l4.228 28.671c.913 6.196 6.323 10.87 12.583 10.87.307 0 .613-.01.913-.032l83.206-5.935c6.282-.45 11.351-5.528 11.79-11.808l2.164-31.02 66.133-10.717z" fill="#fff"/>
- <path d="M300.84 466.87v127.413c.233.003.466.011.697.033l78.113 7.531a8.41 8.41 0 0 1 7.583 7.789l2.409 34.481 68.138 4.862 4.694-31.825a8.41 8.41 0 0 1 8.321-7.184h82.412a8.41 8.41 0 0 1 8.32 7.184l4.693 31.825 68.14-4.862 2.407-34.481a8.414 8.414 0 0 1 7.583-7.789l78.082-7.531c.231-.022.462-.03.695-.033v-10.166l.033-.01V466.87h.289c10.348-13.207 19.923-27.124 29.105-41.972-12.195-20.76-27.137-39.313-43.109-56.502-14.813 7.456-29.2 15.903-42.79 24.891-6.8-6.759-14.458-12.288-21.981-18.067-7.392-5.937-15.722-10.29-23.622-15.361 2.352-17.517 3.515-34.762 3.983-52.76-20.385-10.26-42.123-17.062-64.111-21.947-8.779 14.754-16.807 30.732-23.799 46.352-8.291-1.385-16.621-1.899-24.962-1.998v-.013c-.058 0-.112.013-.162.013-.052 0-.106-.013-.157-.013v.013c-8.356.1-16.68.613-24.973 1.998-6.988-15.62-15.012-31.598-23.804-46.352-21.977 4.885-43.717 11.688-64.1 21.947.466 17.998 1.63 35.243 3.988 52.76-7.916 5.071-16.235 9.424-23.629 15.36-7.512 5.78-15.184 11.31-21.986 18.068-13.589-8.988-27.972-17.435-42.79-24.89-15.971 17.188-30.905 35.74-43.104 56.501 9.178 14.848 18.76 28.765 29.105 41.972z" fill="#478cbf"/>
- <path d="M653.052 617.91l-2.42 34.664a8.413 8.413 0 0 1-7.792 7.803l-83.204 5.937a8.412 8.412 0 0 1-8.92-7.165l-4.77-32.357h-67.89l-4.772 32.358c-.64 4.354-4.534 7.486-8.92 7.164l-83.203-5.937a8.413 8.413 0 0 1-7.792-7.803l-2.42-34.665-70.238-6.772c.033 7.55.13 15.819.13 17.465 0 74.181 94.102 109.836 211.016 110.246h.287c116.915-.41 210.984-36.065 210.984-110.246 0-1.676.101-9.912.136-17.465z" fill="#478cbf"/>
- <path d="M448.344 518.591c0 26.01-21.074 47.078-47.074 47.078-25.987 0-47.067-21.069-47.067-47.078 0-25.991 21.08-47.05 47.067-47.05 26 0 47.074 21.059 47.074 47.05" fill="#fff"/>
- <path d="M437.017 521.384c0 17.251-13.982 31.233-31.246 31.233-17.256 0-31.247-13.982-31.247-31.233 0-17.252 13.99-31.247 31.247-31.247 17.264 0 31.246 13.995 31.246 31.247" fill="#414042"/>
- <path d="M511.997 569.952c-8.37 0-15.152-6.168-15.152-13.77v-43.336c0-7.596 6.783-13.77 15.152-13.77 8.368 0 15.166 6.174 15.166 13.77v43.336c0 7.602-6.798 13.77-15.166 13.77M575.657 518.591c0 26.01 21.074 47.078 47.078 47.078 25.985 0 47.063-21.069 47.063-47.078 0-25.991-21.078-47.05-47.063-47.05-26.004 0-47.078 21.059-47.078 47.05" fill="#fff"/>
- <path d="M586.987 521.384c0 17.251 13.978 31.233 31.23 31.233 17.268 0 31.245-13.982 31.245-31.233 0-17.252-13.977-31.247-31.246-31.247-17.251 0-31.23 13.995-31.23 31.247" fill="#414042"/>
-</g>
-</svg> \ No newline at end of file
diff --git a/misc/dist/document_icons/gdscript.svg b/misc/dist/document_icons/gdscript.svg
new file mode 100644
index 0000000000..ec65eb098a
--- /dev/null
+++ b/misc/dist/document_icons/gdscript.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024"><path d="M812.681 293.783c-23.575-32.543-141.93-39.865-197.505-34.983 2.17-68.048 31.457-117.656-37.966-177.026M161.89 49.151H464c77.128-2.02 126.554 37.835 178.444 84.881l123.665 109.83c63.819 56.94 89.13 110.625 96 188.174v542.886H161.89z" fill="#eff1f5" stroke="#9f9fa1" stroke-width="19.603" stroke-linecap="round" stroke-linejoin="round"/><text style="line-height:1.25;-inkscape-font-specification:'Montserrat Ultra-Bold'" x="207.666" y="878.644" font-weight="800" font-size="16" font-family="Montserrat" letter-spacing="0" word-spacing="0" fill="#333f67"><tspan x="207.666" y="878.644" font-size="112">GDSCRIPT</tspan></text><path d="M481.818 300.713l-17.037 68.149a150.92 150.92 0 0 0-20.81 8.43l-60.015-36.021-42.683 42.683 36.079 60.19a150.92 150.92 0 0 0-8.608 20.693l-68.031 16.978v60.368l68.149 17.037a150.92 150.92 0 0 0 8.43 20.752l-36.021 60.072 42.683 42.683 60.19-36.079a150.92 150.92 0 0 0 20.693 8.608l16.978 68.031h60.368l17.037-68.149a150.92 150.92 0 0 0 20.752-8.43l60.072 36.021 42.683-42.683-36.079-60.19a150.92 150.92 0 0 0 8.608-20.693l68.031-16.978v-60.368l-68.149-17.037a150.92 150.92 0 0 0-8.43-20.752l36.021-60.072-42.683-42.683-60.19 36.079a150.92 150.92 0 0 0-20.693-8.608l-16.978-68.031h-60.368zm30.184 150.92A60.368 60.368 0 0 1 572.37 512a60.368 60.368 0 0 1-60.368 60.368A60.368 60.368 0 0 1 451.634 512a60.368 60.368 0 0 1 60.368-60.368z" fill="#478cbf"/></svg> \ No newline at end of file
diff --git a/misc/dist/document_icons/gdscript_extra_small.svg b/misc/dist/document_icons/gdscript_extra_small.svg
new file mode 100644
index 0000000000..1c3545ef9d
--- /dev/null
+++ b/misc/dist/document_icons/gdscript_extra_small.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M12.698 4.59c-.368-.508-2.218-.623-3.086-.546.034-1.064.492-1.839-.593-2.766m-6.49-.51H7.25c1.205-.032 1.977.591 2.788 1.326L11.97 3.81c.998.89 1.393 1.729 1.5 2.94v8.483H2.53z" fill="#eff1f5" stroke="#9f9fa1" stroke-linecap="round" stroke-linejoin="round"/><path d="M7.39 4.721l-.346 1.38a3.056 3.056 0 0 0-.421.171l-1.216-.73-.864.865.73 1.219a3.056 3.056 0 0 0-.174.419l-1.377.344V9.61l1.38.345a3.056 3.056 0 0 0 .17.42l-.729 1.217.864.864 1.22-.73a3.056 3.056 0 0 0 .418.174l.344 1.377h1.222l.345-1.38a3.056 3.056 0 0 0 .42-.17l1.217.73.864-.865-.73-1.219a3.056 3.056 0 0 0 .174-.42l1.378-.343V8.39l-1.38-.345a3.056 3.056 0 0 0-.17-.42l.729-1.217-.865-.864-1.219.73a3.056 3.056 0 0 0-.419-.174L8.611 4.72H7.39zM8 7.777A1.222 1.222 0 0 1 9.223 9 1.222 1.222 0 0 1 8 10.222 1.222 1.222 0 0 1 6.778 9 1.222 1.222 0 0 1 8 7.777z" fill="#478cbf"/></svg> \ No newline at end of file
diff --git a/misc/dist/document_icons/gdscript_small.svg b/misc/dist/document_icons/gdscript_small.svg
new file mode 100644
index 0000000000..468f4243a2
--- /dev/null
+++ b/misc/dist/document_icons/gdscript_small.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32"><path d="M25.396 9.18c-.736-1.016-4.435-1.245-6.172-1.093.068-2.126.983-3.676-1.186-5.532M5.059 1.536H14.5c2.41-.063 3.955 1.182 5.576 2.652l3.865 3.433c1.994 1.779 2.785 3.457 3 5.88v16.965H5.059z" fill="#eff1f5" stroke="#9f9fa1" stroke-linecap="round" stroke-linejoin="round"/><path d="M15.057 11.397l-.532 2.13a4.716 4.716 0 0 0-.65.263l-1.876-1.126-1.334 1.334 1.128 1.881a4.716 4.716 0 0 0-.27.647l-2.125.53v1.887l2.13.532a4.716 4.716 0 0 0 .263.649L10.665 22 12 23.335l1.881-1.127a4.716 4.716 0 0 0 .647.269l.53 2.125h1.887l.532-2.13a4.716 4.716 0 0 0 .649-.263l1.877 1.126 1.334-1.334-1.128-1.88a4.716 4.716 0 0 0 .27-.647l2.125-.531v-1.886l-2.13-.533a4.716 4.716 0 0 0-.263-.648l1.126-1.878-1.334-1.333-1.881 1.127a4.716 4.716 0 0 0-.647-.269l-.53-2.126h-1.887zm.944 4.716A1.887 1.887 0 0 1 17.887 18a1.887 1.887 0 0 1-1.886 1.886A1.887 1.887 0 0 1 14.114 18a1.887 1.887 0 0 1 1.887-1.887z" fill="#478cbf"/></svg> \ No newline at end of file
diff --git a/misc/dist/document_icons/project.svg b/misc/dist/document_icons/project.svg
new file mode 100644
index 0000000000..aa9b936f27
--- /dev/null
+++ b/misc/dist/document_icons/project.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024"><path d="M812.681 293.783c-23.575-32.542-141.93-39.864-197.505-34.983 2.17-68.048 31.457-117.655-37.966-177.025M161.89 49.15H464c77.128-2.02 126.554 37.836 178.444 84.882l123.665 109.83c63.819 56.94 89.13 110.624 96 188.174v542.885H161.89z" fill="#eff1f5" stroke="#9f9fa1" stroke-width="19.603" stroke-linecap="round" stroke-linejoin="round"/><g stroke-width=".32"><path d="M712.572 590.17s-.666-4.089-1.056-4.052l-74.179 7.157a12.056 12.056 0 0 0-10.9 11.191l-2.038 29.21-57.387 4.094-3.905-26.472c-.868-5.888-6.01-10.327-11.961-10.327h-78.292c-5.95 0-11.09 4.439-11.96 10.327l-3.906 26.472-57.387-4.095-2.038-29.208a12.057 12.057 0 0 0-10.901-11.194l-74.214-7.155c-.384-.037-.665 4.056-1.049 4.056l-.1 16.052 62.853 10.136 2.059 29.47c.416 5.965 5.23 10.788 11.2 11.217l79.035 5.638c.299.021.594.033.89.033 5.94 0 11.072-4.44 11.941-10.329l4.017-27.237h57.414l4.017 27.237c.867 5.886 6.006 10.326 11.953 10.326.292 0 .583-.009.868-.03l79.046-5.638c5.967-.428 10.783-5.252 11.2-11.218l2.056-29.469 62.826-10.18z" fill="#fff"/><path d="M311.398 469.127v121.042c.221.003.443.01.662.031l74.207 7.155a7.99 7.99 0 0 1 7.204 7.4l2.289 32.756 64.731 4.619 4.46-30.234a7.99 7.99 0 0 1 7.904-6.824h78.292a7.99 7.99 0 0 1 7.904 6.824l4.458 30.234 64.733-4.619 2.287-32.757a7.993 7.993 0 0 1 7.203-7.4l74.178-7.154c.22-.02.44-.028.66-.031v-9.658l.032-.01V469.128h.275c9.83-12.547 18.926-25.768 27.65-39.874-11.586-19.722-25.78-37.347-40.954-53.677-14.073 7.083-27.74 15.108-40.65 23.647-6.46-6.421-13.736-11.674-20.883-17.164-7.022-5.64-14.936-9.775-22.44-14.593 2.234-16.641 3.339-33.024 3.783-50.122-19.366-9.747-40.017-16.209-60.905-20.85-8.34 14.017-15.967 29.196-22.61 44.035-7.876-1.316-15.79-1.804-23.713-1.898v-.013c-.055 0-.107.013-.154.013-.05 0-.1-.013-.15-.013v.013c-7.937.095-15.845.582-23.724 1.898-6.638-14.84-14.261-30.018-22.613-44.035-20.879 4.641-41.532 11.104-60.895 20.85.442 17.098 1.548 33.48 3.788 50.122-7.52 4.818-15.423 8.953-22.447 14.592-7.137 5.491-14.425 10.745-20.887 17.165-12.91-8.539-26.573-16.564-40.65-23.646-15.173 16.329-29.36 33.953-40.95 53.676 8.72 14.106 17.823 27.327 27.65 39.874z" fill="#478cbf"/><path d="M646 612.615l-2.3 32.93a7.992 7.992 0 0 1-7.402 7.413l-79.044 5.64a7.991 7.991 0 0 1-8.474-6.806l-4.531-30.74h-64.496l-4.533 30.74c-.608 4.137-4.308 7.112-8.474 6.806l-79.043-5.64a7.992 7.992 0 0 1-7.402-7.413l-2.3-32.931-66.726-6.434c.032 7.173.124 15.028.124 16.592 0 70.472 89.397 104.344 200.465 104.734h.273c111.07-.39 200.435-34.262 200.435-104.734 0-1.592.096-9.416.129-16.592z" fill="#478cbf"/><path d="M451.527 518.261c0 24.71-20.02 44.725-44.72 44.725-24.688 0-44.714-20.016-44.714-44.725 0-24.691 20.026-44.697 44.713-44.697 24.7 0 44.72 20.006 44.72 44.697" fill="#fff"/><path d="M440.766 520.915c0 16.388-13.283 29.671-29.684 29.671-16.393 0-29.684-13.283-29.684-29.671 0-16.39 13.29-29.685 29.684-29.685 16.401 0 29.684 13.295 29.684 29.685" fill="#414042"/><path d="M511.997 567.054c-7.951 0-14.394-5.86-14.394-13.081v-41.17c0-7.216 6.444-13.08 14.394-13.08s14.408 5.864 14.408 13.08v41.17c0 7.222-6.458 13.081-14.408 13.081m60.477-48.793c0 24.71 20.02 44.725 44.724 44.725 24.686 0 44.71-20.016 44.71-44.725 0-24.691-20.024-44.697-44.71-44.697-24.704 0-44.724 20.006-44.724 44.697" fill="#fff"/><path d="M583.238 520.915c0 16.388 13.279 29.671 29.668 29.671 16.405 0 29.683-13.283 29.683-29.671 0-16.39-13.278-29.685-29.684-29.685-16.388 0-29.668 13.295-29.668 29.685" fill="#414042"/></g><text style="line-height:1.25;-inkscape-font-specification:'Montserrat Ultra-Bold'" x="234.416" y="878.644" font-weight="800" font-size="16" font-family="Montserrat" letter-spacing="0" word-spacing="0" fill="#333f67"><tspan x="234.416" y="878.644" font-size="112">PROJECT</tspan></text></svg> \ No newline at end of file
diff --git a/misc/dist/document_icons/project_extra_small.svg b/misc/dist/document_icons/project_extra_small.svg
new file mode 100644
index 0000000000..5482d27033
--- /dev/null
+++ b/misc/dist/document_icons/project_extra_small.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M12.698 4.59c-.368-.508-2.218-.623-3.086-.546.034-1.064.492-1.839-.593-2.766m-6.49-.51H7.25c1.205-.032 1.977.591 2.788 1.326L11.97 3.81c.998.89 1.393 1.729 1.5 2.94v8.483H2.53z" fill="#eff1f5" stroke="#9f9fa1" stroke-linecap="round" stroke-linejoin="round"/><g stroke-width=".32"><path d="M12.062 10.583s-.014-.083-.022-.082l-1.502.145a.244.244 0 0 0-.22.226l-.042.592-1.162.083-.079-.536a.246.246 0 0 0-.242-.21H7.208c-.12 0-.225.09-.243.21l-.079.536-1.162-.083-.041-.592a.244.244 0 0 0-.22-.226L3.958 10.5c-.007-.001-.013.082-.02.082l-.003.325 1.273.205.042.597c.008.12.105.218.226.227l1.6.114h.019c.12 0 .224-.089.242-.208l.081-.552h1.163l.08.552a.246.246 0 0 0 .26.208l1.601-.114a.246.246 0 0 0 .227-.227l.042-.597 1.272-.206z" fill="#fff"/><path d="M3.938 8.132v2.45l.013.001 1.503.145a.162.162 0 0 1 .146.15l.046.663 1.311.094.09-.612a.162.162 0 0 1 .16-.138h1.586a.162.162 0 0 1 .16.138l.09.612 1.311-.094.046-.663a.162.162 0 0 1 .146-.15l1.502-.145h.014V8.132h.006c.2-.254.383-.522.56-.808a6.285 6.285 0 0 0-.83-1.087 8.105 8.105 0 0 0-.823.48c-.13-.13-.278-.237-.422-.348-.143-.115-.303-.198-.455-.296a9.38 9.38 0 0 0 .077-1.015 5.275 5.275 0 0 0-1.234-.422 8.781 8.781 0 0 0-.457.892 3.13 3.13 0 0 0-.48-.039H8h-.003c-.16.002-.32.012-.48.039a8.71 8.71 0 0 0-.458-.892 5.276 5.276 0 0 0-1.233.422c.009.346.031.678.076 1.015-.152.098-.312.181-.454.296-.145.11-.292.217-.423.347a8.093 8.093 0 0 0-.823-.479c-.307.331-.595.688-.83 1.087.177.286.361.554.56.808z" fill="#478cbf"/><path d="M10.714 11.037l-.047.667a.162.162 0 0 1-.15.15l-1.6.114a.162.162 0 0 1-.172-.137l-.092-.623H7.347l-.092.623a.162.162 0 0 1-.171.137l-1.6-.114a.162.162 0 0 1-.15-.15l-.047-.667-1.351-.13.002.336c0 1.427 1.81 2.113 4.06 2.12h.005c2.25-.007 4.059-.693 4.059-2.12l.002-.336z" fill="#478cbf"/><path d="M6.776 9.127a.905.905 0 1 1-1.811 0 .905.905 0 0 1 1.81 0" fill="#fff"/><path d="M6.558 9.18a.6.6 0 1 1-1.202 0 .6.6 0 0 1 1.202 0" fill="#414042"/><path d="M8 10.115c-.16 0-.291-.119-.291-.265v-.834c0-.146.13-.265.291-.265.161 0 .292.119.292.265v.834c0 .146-.13.265-.292.265m1.225-.988a.906.906 0 1 0 1.81 0 .906.906 0 0 0-1.81 0" fill="#fff"/><path d="M9.443 9.18a.6.6 0 1 0 1.201 0 .6.6 0 0 0-1.201 0" fill="#414042"/></g></svg> \ No newline at end of file
diff --git a/misc/dist/document_icons/project_small.svg b/misc/dist/document_icons/project_small.svg
new file mode 100644
index 0000000000..76f501b80d
--- /dev/null
+++ b/misc/dist/document_icons/project_small.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32"><path d="M25.396 9.18c-.736-1.016-4.435-1.245-6.172-1.093.068-2.126.983-3.676-1.186-5.532M5.059 1.536H14.5c2.41-.063 3.955 1.182 5.576 2.652l3.865 3.433c1.994 1.779 2.785 3.457 3 5.88v16.965H5.059z" fill="#eff1f5" stroke="#9f9fa1" stroke-linecap="round" stroke-linejoin="round"/><g stroke-width=".32"><path d="M22.268 20.443s-.02-.128-.033-.127l-2.318.224a.377.377 0 0 0-.34.35l-.064.912-1.793.128-.122-.827a.38.38 0 0 0-.374-.323h-2.447a.38.38 0 0 0-.374.323l-.122.827-1.793-.128-.064-.913a.377.377 0 0 0-.34-.35l-2.32-.223c-.011-.001-.02.127-.032.127l-.003.501 1.964.317.064.921a.38.38 0 0 0 .35.35l2.47.177h.028a.38.38 0 0 0 .373-.322l.125-.851h1.795l.125.851a.38.38 0 0 0 .4.322l2.471-.176a.38.38 0 0 0 .35-.351l.064-.92 1.964-.32z" fill="#fff"/><path d="M9.732 16.66v3.783h.02l2.32.224a.25.25 0 0 1 .224.231l.072 1.024 2.023.144.14-.945a.25.25 0 0 1 .246-.213h2.447a.25.25 0 0 1 .247.213l.14.945 2.022-.144.072-1.024a.25.25 0 0 1 .225-.23l2.318-.225h.02v-.302h.001V16.66h.009c.307-.392.591-.805.864-1.246a9.7 9.7 0 0 0-1.28-1.677c-.44.22-.867.472-1.27.738-.202-.2-.43-.364-.653-.536-.22-.176-.466-.305-.701-.456.07-.52.104-1.032.118-1.566a8.14 8.14 0 0 0-1.903-.652c-.26.438-.499.913-.707 1.376a4.832 4.832 0 0 0-.74-.059h-.01a4.837 4.837 0 0 0-.742.06 13.44 13.44 0 0 0-.706-1.377 8.142 8.142 0 0 0-1.903.652c.014.534.048 1.046.118 1.566-.235.15-.482.28-.701.456-.223.172-.451.336-.653.536-.403-.266-.83-.517-1.27-.738a9.704 9.704 0 0 0-1.28 1.677c.273.44.557.854.864 1.246z" fill="#478cbf"/><path d="M20.188 21.144l-.072 1.029a.25.25 0 0 1-.231.232l-2.47.176a.25.25 0 0 1-.265-.213l-.142-.96h-2.015l-.142.96a.25.25 0 0 1-.265.213l-2.47-.176a.25.25 0 0 1-.231-.232l-.072-1.03-2.085-.2c0 .224.004.47.004.518 0 2.203 2.793 3.261 6.264 3.273h.009c3.47-.012 6.263-1.07 6.263-3.273l.004-.518z" fill="#478cbf"/><path d="M14.11 18.195a1.397 1.397 0 1 1-2.794.001 1.397 1.397 0 0 1 2.795 0" fill="#fff"/><path d="M13.774 18.278a.927.927 0 1 1-1.854 0 .927.927 0 0 1 1.854 0" fill="#414042"/><path d="M16 19.72c-.248 0-.45-.183-.45-.409v-1.286c0-.226.202-.409.45-.409.249 0 .45.183.45.409v1.286c0 .226-.201.41-.45.41m1.89-1.526a1.397 1.397 0 1 0 2.795 0 1.397 1.397 0 0 0-2.795 0" fill="#fff"/><path d="M18.227 18.278a.927.927 0 1 0 1.854 0 .927.927 0 0 0-1.854 0" fill="#414042"/></g></svg> \ No newline at end of file
diff --git a/misc/dist/document_icons/resource.svg b/misc/dist/document_icons/resource.svg
new file mode 100644
index 0000000000..2555e8f5c0
--- /dev/null
+++ b/misc/dist/document_icons/resource.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024"><path d="M812.681 293.783c-23.575-32.543-141.93-39.865-197.505-34.983 2.17-68.048 31.457-117.656-37.966-177.026M161.89 49.151H464c77.128-2.02 126.554 37.835 178.444 84.881l123.665 109.83c63.819 56.94 89.13 110.625 96 188.174v542.886H161.89z" fill="#eff1f5" stroke="#9f9fa1" stroke-width="19.603" stroke-linecap="round" stroke-linejoin="round"/><text style="line-height:1.25;-inkscape-font-specification:'Montserrat Ultra-Bold'" x="183.282" y="878.644" font-weight="800" font-size="16" letter-spacing="0" word-spacing="0" font-family="Montserrat" fill="#333f67"><tspan x="183.282" y="878.644" font-size="112">RESOURCE</tspan></text><path style="text-indent:0;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;isolation:auto;mix-blend-mode:normal" d="M510.825 290.281a31.683 31.683 0 0 0-12.994 3.28L307.75 388.6a31.683 31.683 0 0 0-17.51 28.339v190.08a31.683 31.683 0 0 0 17.51 28.338l190.08 95.04a31.683 31.683 0 0 0 28.338 0l190.08-95.04a31.683 31.683 0 0 0 17.51-28.338V416.94a31.683 31.683 0 0 0-17.51-28.34l-190.08-95.04a31.683 31.683 0 0 0-15.345-3.279zM512 357.354l119.234 59.587-43.747 21.904-119.234-59.647L512 357.356zm-158.4 110.88l126.72 63.36v119.234l-126.72-63.36zm316.8 0v119.234l-126.72 63.36V531.594z" color="#000" white-space="normal" fill-rule="evenodd" fill="#478cbf"/></svg> \ No newline at end of file
diff --git a/misc/dist/document_icons/resource_extra_small.svg b/misc/dist/document_icons/resource_extra_small.svg
new file mode 100644
index 0000000000..4ba41b0073
--- /dev/null
+++ b/misc/dist/document_icons/resource_extra_small.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M12.698 4.59c-.368-.508-2.218-.623-3.086-.546.034-1.064.492-1.839-.593-2.766m-6.49-.51H7.25c1.205-.032 1.977.591 2.788 1.326L11.97 3.81c.998.89 1.393 1.729 1.5 2.94v8.483H2.53z" fill="#eff1f5" stroke="#9f9fa1" stroke-linecap="round" stroke-linejoin="round"/><path style="text-indent:0;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;isolation:auto;mix-blend-mode:normal" d="M7.976 4.51a.642.642 0 0 0-.263.067L3.864 6.5a.642.642 0 0 0-.354.574v3.849a.642.642 0 0 0 .354.574l3.85 1.924a.642.642 0 0 0 .573 0l3.85-1.924a.642.642 0 0 0 .354-.574v-3.85a.642.642 0 0 0-.355-.573L8.287 4.576a.642.642 0 0 0-.31-.066zM8 5.868l2.415 1.207-.886.444L7.114 6.31 8 5.868zM4.793 8.114l2.566 1.283v2.414l-2.566-1.283zm6.415 0v2.414l-2.566 1.283V9.397z" color="#000" white-space="normal" fill="#478cbf" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/misc/dist/document_icons/resource_small.svg b/misc/dist/document_icons/resource_small.svg
new file mode 100644
index 0000000000..502a4c6c36
--- /dev/null
+++ b/misc/dist/document_icons/resource_small.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32"><path d="M25.396 9.18c-.736-1.016-4.435-1.245-6.172-1.093.068-2.126.983-3.676-1.186-5.532M5.059 1.536H14.5c2.41-.063 3.955 1.182 5.576 2.652l3.865 3.433c1.994 1.779 2.785 3.457 3 5.88v16.965H5.059z" fill="#eff1f5" stroke="#9f9fa1" stroke-linecap="round" stroke-linejoin="round"/><path style="text-indent:0;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;isolation:auto;mix-blend-mode:normal" d="M15.964 11.071a.99.99 0 0 0-.406.103l-5.94 2.97a.99.99 0 0 0-.547.885v5.94a.99.99 0 0 0 .547.886l5.94 2.97a.99.99 0 0 0 .885 0l5.94-2.97a.99.99 0 0 0 .547-.886v-5.94a.99.99 0 0 0-.547-.885l-5.94-2.97a.99.99 0 0 0-.48-.103zM16 13.167l3.726 1.862-1.367.685-3.727-1.864 1.368-.683zm-4.95 3.465l3.96 1.98v3.726l-3.96-1.98zm9.9 0v3.726l-3.96 1.98v-3.726z" color="#000" white-space="normal" fill="#478cbf" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/misc/dist/document_icons/scene.svg b/misc/dist/document_icons/scene.svg
new file mode 100644
index 0000000000..a4e1ca809e
--- /dev/null
+++ b/misc/dist/document_icons/scene.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024"><path d="M812.681 293.783c-23.575-32.542-141.93-39.864-197.505-34.983 2.17-68.048 31.457-117.655-37.966-177.025M161.89 49.15H464c77.128-2.02 126.554 37.836 178.444 84.882l123.665 109.83c63.819 56.94 89.13 110.624 96 188.174v542.885H161.89z" fill="#eff1f5" stroke="#9f9fa1" stroke-width="19.603" stroke-linecap="round" stroke-linejoin="round"/><text style="line-height:1.25;-inkscape-font-specification:'Montserrat Ultra-Bold'" x="315.088" y="878.644" font-weight="800" font-size="16" font-family="Montserrat" letter-spacing="0" word-spacing="0" fill="#333f67"><tspan x="315.088" y="878.644" font-size="112">SCENE</tspan></text><path d="M714.504 315.805l-67.735 9.904 24.7 57.361 51.76-7.546zm-127.458 18.57l-59.719 8.725 24.702 57.419 59.719-8.725zm-119.498 17.45l-59.719 8.725 24.701 57.419 59.72-8.725zm-119.438 17.45l-51.76 7.546 8.725 59.719 67.736-9.904zm-43.036 97.449v181.104c0 33.34 27.027 60.368 60.368 60.368H727.65V466.724z" fill="#478cbf"/></svg> \ No newline at end of file
diff --git a/misc/dist/document_icons/scene_extra_small.svg b/misc/dist/document_icons/scene_extra_small.svg
new file mode 100644
index 0000000000..155aa843b2
--- /dev/null
+++ b/misc/dist/document_icons/scene_extra_small.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M12.698 4.59c-.368-.508-2.218-.623-3.086-.546.034-1.064.492-1.839-.593-2.766m-6.49-.51H7.25c1.205-.032 1.977.591 2.788 1.326L11.97 3.81c.998.89 1.393 1.729 1.5 2.94v8.483H2.53z" fill="#eff1f5" stroke="#9f9fa1" stroke-linecap="round" stroke-linejoin="round"/><path d="M12.101 5.027l-1.372.2.5 1.162 1.049-.153zm-2.581.376l-1.21.177.5 1.162 1.21-.176zm-2.42.353l-1.21.177.501 1.163 1.21-.177zm-2.419.354l-1.048.152.177 1.21 1.372-.2zM3.81 8.083v3.667c0 .676.547 1.223 1.222 1.223h7.335v-4.89z" fill="#478cbf"/></svg> \ No newline at end of file
diff --git a/misc/dist/document_icons/scene_small.svg b/misc/dist/document_icons/scene_small.svg
new file mode 100644
index 0000000000..d36d42f458
--- /dev/null
+++ b/misc/dist/document_icons/scene_small.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32"><path d="M25.396 9.18c-.736-1.016-4.435-1.245-6.172-1.093.068-2.126.983-3.676-1.186-5.532M5.059 1.536H14.5c2.41-.063 3.955 1.182 5.576 2.652l3.865 3.433c1.994 1.779 2.785 3.457 3 5.88v16.965H5.059z" fill="#eff1f5" stroke="#9f9fa1" stroke-linecap="round" stroke-linejoin="round"/><path d="M22.329 11.869l-2.117.31.772 1.792 1.617-.236zm-3.983.58l-1.867.273.772 1.794 1.867-.273zm-3.735.545l-1.866.273.772 1.794 1.866-.272zm-3.732.546l-1.618.235.273 1.867 2.117-.31zm-1.345 3.045v5.66c0 1.041.845 1.886 1.887 1.886H22.74v-7.546z" fill="#478cbf"/></svg> \ No newline at end of file
diff --git a/misc/dist/ios_xcode/godot_ios/dummy.cpp b/misc/dist/ios_xcode/godot_ios/dummy.cpp
index 61de772b44..7b52e926b0 100644
--- a/misc/dist/ios_xcode/godot_ios/dummy.cpp
+++ b/misc/dist/ios_xcode/godot_ios/dummy.cpp
@@ -1 +1,31 @@
+/*************************************************************************/
+/* dummy.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
$cpp_code
diff --git a/misc/dist/linux/godot.6 b/misc/dist/linux/godot.6
index 50cb420e4e..e6fd1b9991 100644
--- a/misc/dist/linux/godot.6
+++ b/misc/dist/linux/godot.6
@@ -1,4 +1,4 @@
-.TH GODOT "6" "Februaryot 2018" "godot 3.1" "Games"
+.TH GODOT "6" "January 2019" "godot 3.1" "Games"
.SH NAME
godot \- multi\-platform 2D and 3D game engine with a feature\-rich editor
.SH SYNOPSIS
@@ -149,7 +149,7 @@ Build the scripting solutions (e.g. for C# projects).
Generate JSON dump of the Godot API for GDNative bindings.
.TP
\fB\-\-test\fR <test>
-Run a unit test ('string', 'math', 'physics', 'physics_2d', 'render', 'oa_hash_map', 'gui', 'io', 'shaderlang', 'gd_tokenizer', 'gd_parser', 'gd_compiler', 'gd_bytecode', 'image', 'ordered_hash_map').
+Run a unit test ('string', 'math', 'physics', 'physics_2d', 'render', 'oa_hash_map', 'gui', 'shaderlang', 'gd_tokenizer', 'gd_parser', 'gd_compiler', 'gd_bytecode', 'image', 'ordered_hash_map').
.SH FILES
XDG_DATA_CONFIG/godot/ or ~/.config/godot/
.RS
diff --git a/misc/dist/linux/org.godotengine.Godot.appdata.xml b/misc/dist/linux/org.godotengine.Godot.appdata.xml
index c11317cd35..09d5468d70 100644
--- a/misc/dist/linux/org.godotengine.Godot.appdata.xml
+++ b/misc/dist/linux/org.godotengine.Godot.appdata.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright 2017-2018 Rémi Verschelde <akien@godotengine.org> -->
+<!-- Copyright 2017-2019 Rémi Verschelde <akien@godotengine.org> -->
<component type="desktop">
<id>org.godotengine.Godot</id>
<metadata_license>CC0-1.0</metadata_license>
diff --git a/misc/dist/osx_tools.app/Contents/Info.plist b/misc/dist/osx_tools.app/Contents/Info.plist
index faa929b818..97d769c824 100755
--- a/misc/dist/osx_tools.app/Contents/Info.plist
+++ b/misc/dist/osx_tools.app/Contents/Info.plist
@@ -9,7 +9,7 @@
<key>CFBundleName</key>
<string>Godot</string>
<key>CFBundleGetInfoString</key>
- <string>(c) 2007-2018 Juan Linietsky, Ariel Manzur.</string>
+ <string>(c) 2007-2019 Juan Linietsky, Ariel Manzur &amp; Godot Engine contributors</string>
<key>CFBundleIconFile</key>
<string>Godot.icns</string>
<key>CFBundleIdentifier</key>
@@ -25,7 +25,7 @@
<key>CFBundleVersion</key>
<string>3.0</string>
<key>NSHumanReadableCopyright</key>
- <string>© 2007-2018 Juan Linietsky, Ariel Manzur.</string>
+ <string>© 2007-2019 Juan Linietsky, Ariel Manzur &amp; Godot Engine contributors</string>
<key>LSMinimumSystemVersion</key>
<string>10.9.0</string>
<key>LSMinimumSystemVersionByArchitecture</key>
@@ -72,22 +72,67 @@
<key>UTTypeDescription</key>
<string>Godot Scene</string>
<key>UTTypeIconFile</key>
- <string>Document.icns</string>
+ <string>Scene.icns</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
- <key>com.apple.ostype</key>
- <string>TSCN</string>
<key>public.filename-extension</key>
<array>
<string>scn</string>
<string>tscn</string>
</array>
<key>public.mime-type</key>
- <string>scene/x-scn</string>
+ <string>application/x-godot-scene</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeIdentifier</key>
+ <string>public.gd</string>
+ <key>UTTypeReferenceURL</key>
+ <string></string>
+ <key>UTTypeDescription</key>
+ <string>Godot Script</string>
+ <key>UTTypeIconFile</key>
+ <string>GDScript.icns</string>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ </array>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>gd</string>
+ </array>
+ <key>public.mime-type</key>
+ <string>text/x-gdscript</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeIdentifier</key>
+ <string>public.res</string>
+ <key>UTTypeReferenceURL</key>
+ <string></string>
+ <key>UTTypeDescription</key>
+ <string>Godot Resource</string>
+ <key>UTTypeIconFile</key>
+ <string>Resource.icns</string>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ </array>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>res</string>
+ <string>tres</string>
+ </array>
+ <key>public.mime-type</key>
+ <string>application/x-godot-resource</string>
</dict>
</dict>
<dict>
@@ -98,21 +143,19 @@
<key>UTTypeDescription</key>
<string>Godot Project</string>
<key>UTTypeIconFile</key>
- <string>Document.icns</string>
+ <string>Project.icns</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
- <key>com.apple.ostype</key>
- <string>GODP</string>
<key>public.filename-extension</key>
<array>
<string>godot</string>
</array>
<key>public.mime-type</key>
- <string>project/x-godot</string>
+ <string>text/x-godot-project</string>
</dict>
</dict>
</array>
diff --git a/misc/dist/osx_tools.app/Contents/Resources/Document.icns b/misc/dist/osx_tools.app/Contents/Resources/Document.icns
deleted file mode 100644
index 06d7c65298..0000000000
--- a/misc/dist/osx_tools.app/Contents/Resources/Document.icns
+++ /dev/null
Binary files differ
diff --git a/misc/dist/osx_tools.app/Contents/Resources/GDScript.icns b/misc/dist/osx_tools.app/Contents/Resources/GDScript.icns
new file mode 100644
index 0000000000..b08e8df339
--- /dev/null
+++ b/misc/dist/osx_tools.app/Contents/Resources/GDScript.icns
Binary files differ
diff --git a/misc/dist/osx_tools.app/Contents/Resources/Project.icns b/misc/dist/osx_tools.app/Contents/Resources/Project.icns
new file mode 100644
index 0000000000..10e31528e4
--- /dev/null
+++ b/misc/dist/osx_tools.app/Contents/Resources/Project.icns
Binary files differ
diff --git a/misc/dist/osx_tools.app/Contents/Resources/Resource.icns b/misc/dist/osx_tools.app/Contents/Resources/Resource.icns
new file mode 100644
index 0000000000..9648cb616e
--- /dev/null
+++ b/misc/dist/osx_tools.app/Contents/Resources/Resource.icns
Binary files differ
diff --git a/misc/dist/osx_tools.app/Contents/Resources/Scene.icns b/misc/dist/osx_tools.app/Contents/Resources/Scene.icns
new file mode 100644
index 0000000000..c8c3dee07e
--- /dev/null
+++ b/misc/dist/osx_tools.app/Contents/Resources/Scene.icns
Binary files differ
diff --git a/misc/dist/uwp_template/Assets/SplashScreen.scale-100.png b/misc/dist/uwp_template/Assets/SplashScreen.scale-100.png
index 0c27fda8e7..a4dd3d7175 100644
--- a/misc/dist/uwp_template/Assets/SplashScreen.scale-100.png
+++ b/misc/dist/uwp_template/Assets/SplashScreen.scale-100.png
Binary files differ
diff --git a/misc/scripts/fix_headers.py b/misc/scripts/fix_headers.py
index 48b9628b1f..823c9acfde 100644..100755
--- a/misc/scripts/fix_headers.py
+++ b/misc/scripts/fix_headers.py
@@ -9,8 +9,8 @@ header = """\
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/misc/travis/scons-local-osx.sh b/misc/travis/scons-local-osx.sh
deleted file mode 100755
index fe7b43aadc..0000000000
--- a/misc/travis/scons-local-osx.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-
-echo
-echo "Download and install Scons local package ..."
-echo
-
-echo "Downloading sources ..."
-curl -L -O https://downloads.sourceforge.net/scons/scons-local-3.0.1.zip # latest version available here: http://scons.org/pages/download.html
-
-echo "Extracting to build directory ..."
-unzip -qq -n scons-local-3.0.1.zip -d $TRAVIS_BUILD_DIR/scons-local
-
-echo "Installing symlinks ..."
-ln -s $TRAVIS_BUILD_DIR/scons-local/scons.py /usr/local/bin/scons
-
-echo
-echo "Done!"
-echo
diff --git a/modules/bmp/image_loader_bmp.cpp b/modules/bmp/image_loader_bmp.cpp
index 063508a25f..a8172c7f52 100644
--- a/modules/bmp/image_loader_bmp.cpp
+++ b/modules/bmp/image_loader_bmp.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bmp/image_loader_bmp.h b/modules/bmp/image_loader_bmp.h
index e0e50859fc..d6899061d0 100644
--- a/modules/bmp/image_loader_bmp.h
+++ b/modules/bmp/image_loader_bmp.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bmp/register_types.cpp b/modules/bmp/register_types.cpp
index 1f68a03e85..a1e3f386f4 100644
--- a/modules/bmp/register_types.cpp
+++ b/modules/bmp/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bmp/register_types.h b/modules/bmp/register_types.h
index d8755db397..cd2a5c0570 100644
--- a/modules/bmp/register_types.h
+++ b/modules/bmp/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/area_bullet.cpp b/modules/bullet/area_bullet.cpp
index a0486443c2..a6872d81d7 100644
--- a/modules/bullet/area_bullet.cpp
+++ b/modules/bullet/area_bullet.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/area_bullet.h b/modules/bullet/area_bullet.h
index 1c5962cfe3..0942212b9e 100644
--- a/modules/bullet/area_bullet.h
+++ b/modules/bullet/area_bullet.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/btRayShape.cpp b/modules/bullet/btRayShape.cpp
index 6cc63d79ce..935d86daa6 100644
--- a/modules/bullet/btRayShape.cpp
+++ b/modules/bullet/btRayShape.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/btRayShape.h b/modules/bullet/btRayShape.h
index a44c30db4b..7fedb74083 100644
--- a/modules/bullet/btRayShape.h
+++ b/modules/bullet/btRayShape.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/bullet_physics_server.cpp b/modules/bullet/bullet_physics_server.cpp
index 315afe3d72..44ea061f51 100644
--- a/modules/bullet/bullet_physics_server.cpp
+++ b/modules/bullet/bullet_physics_server.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -1471,6 +1471,22 @@ bool BulletPhysicsServer::generic_6dof_joint_get_flag(RID p_joint, Vector3::Axis
return generic_6dof_joint->get_flag(p_axis, p_flag);
}
+void BulletPhysicsServer::generic_6dof_joint_set_precision(RID p_joint, int p_precision) {
+ JointBullet *joint = joint_owner.get(p_joint);
+ ERR_FAIL_COND(!joint);
+ ERR_FAIL_COND(joint->get_type() != JOINT_6DOF);
+ Generic6DOFJointBullet *generic_6dof_joint = static_cast<Generic6DOFJointBullet *>(joint);
+ generic_6dof_joint->set_precision(p_precision);
+}
+
+int BulletPhysicsServer::generic_6dof_joint_get_precision(RID p_joint) {
+ JointBullet *joint = joint_owner.get(p_joint);
+ ERR_FAIL_COND_V(!joint, 0);
+ ERR_FAIL_COND_V(joint->get_type() != JOINT_6DOF, 0);
+ Generic6DOFJointBullet *generic_6dof_joint = static_cast<Generic6DOFJointBullet *>(joint);
+ return generic_6dof_joint->get_precision();
+}
+
void BulletPhysicsServer::free(RID p_rid) {
if (shape_owner.owns(p_rid)) {
diff --git a/modules/bullet/bullet_physics_server.h b/modules/bullet/bullet_physics_server.h
index c8c782267e..1b74cbf3fc 100644
--- a/modules/bullet/bullet_physics_server.h
+++ b/modules/bullet/bullet_physics_server.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -375,6 +375,9 @@ public:
virtual void generic_6dof_joint_set_flag(RID p_joint, Vector3::Axis p_axis, G6DOFJointAxisFlag p_flag, bool p_enable);
virtual bool generic_6dof_joint_get_flag(RID p_joint, Vector3::Axis p_axis, G6DOFJointAxisFlag p_flag);
+ virtual void generic_6dof_joint_set_precision(RID p_joint, int precision);
+ virtual int generic_6dof_joint_get_precision(RID p_joint);
+
/* MISC */
virtual void free(RID p_rid);
diff --git a/modules/bullet/bullet_types_converter.cpp b/modules/bullet/bullet_types_converter.cpp
index f9b7126173..fc007169c0 100644
--- a/modules/bullet/bullet_types_converter.cpp
+++ b/modules/bullet/bullet_types_converter.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/bullet_types_converter.h b/modules/bullet/bullet_types_converter.h
index 84321fe837..57c3300b3d 100644
--- a/modules/bullet/bullet_types_converter.h
+++ b/modules/bullet/bullet_types_converter.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/bullet_utilities.h b/modules/bullet/bullet_utilities.h
index 553c1d0384..01a11ca63c 100644
--- a/modules/bullet/bullet_utilities.h
+++ b/modules/bullet/bullet_utilities.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/collision_object_bullet.cpp b/modules/bullet/collision_object_bullet.cpp
index 441fa7c8af..91a5ed095a 100644
--- a/modules/bullet/collision_object_bullet.cpp
+++ b/modules/bullet/collision_object_bullet.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/collision_object_bullet.h b/modules/bullet/collision_object_bullet.h
index 4a0c805ce5..2d4e5c4f1a 100644
--- a/modules/bullet/collision_object_bullet.h
+++ b/modules/bullet/collision_object_bullet.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/cone_twist_joint_bullet.cpp b/modules/bullet/cone_twist_joint_bullet.cpp
index ecacce0bee..d9a82d6179 100644
--- a/modules/bullet/cone_twist_joint_bullet.cpp
+++ b/modules/bullet/cone_twist_joint_bullet.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/cone_twist_joint_bullet.h b/modules/bullet/cone_twist_joint_bullet.h
index d6040fd6ec..7450a2e166 100644
--- a/modules/bullet/cone_twist_joint_bullet.h
+++ b/modules/bullet/cone_twist_joint_bullet.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/constraint_bullet.cpp b/modules/bullet/constraint_bullet.cpp
index d15fb8de01..f3f3907ada 100644
--- a/modules/bullet/constraint_bullet.cpp
+++ b/modules/bullet/constraint_bullet.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/constraint_bullet.h b/modules/bullet/constraint_bullet.h
index ed3a318cbc..f6ac3e80c2 100644
--- a/modules/bullet/constraint_bullet.h
+++ b/modules/bullet/constraint_bullet.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/generic_6dof_joint_bullet.cpp b/modules/bullet/generic_6dof_joint_bullet.cpp
index a94b88d566..8fed933854 100644
--- a/modules/bullet/generic_6dof_joint_bullet.cpp
+++ b/modules/bullet/generic_6dof_joint_bullet.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -265,3 +265,11 @@ bool Generic6DOFJointBullet::get_flag(Vector3::Axis p_axis, PhysicsServer::G6DOF
ERR_FAIL_INDEX_V(p_axis, 3, false);
return flags[p_axis][p_flag];
}
+
+void Generic6DOFJointBullet::set_precision(int p_precision) {
+ sixDOFConstraint->setOverrideNumSolverIterations(MAX(1, p_precision));
+}
+
+int Generic6DOFJointBullet::get_precision() const {
+ return sixDOFConstraint->getOverrideNumSolverIterations();
+}
diff --git a/modules/bullet/generic_6dof_joint_bullet.h b/modules/bullet/generic_6dof_joint_bullet.h
index 176127ed6c..478a39f103 100644
--- a/modules/bullet/generic_6dof_joint_bullet.h
+++ b/modules/bullet/generic_6dof_joint_bullet.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -68,6 +68,9 @@ public:
void set_flag(Vector3::Axis p_axis, PhysicsServer::G6DOFJointAxisFlag p_flag, bool p_value);
bool get_flag(Vector3::Axis p_axis, PhysicsServer::G6DOFJointAxisFlag p_flag) const;
+
+ void set_precision(int p_precision);
+ int get_precision() const;
};
#endif
diff --git a/modules/bullet/godot_collision_configuration.cpp b/modules/bullet/godot_collision_configuration.cpp
index 919c3152d7..a77cf4ebd1 100644
--- a/modules/bullet/godot_collision_configuration.cpp
+++ b/modules/bullet/godot_collision_configuration.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/godot_collision_configuration.h b/modules/bullet/godot_collision_configuration.h
index 11012c5f6d..82fb74f121 100644
--- a/modules/bullet/godot_collision_configuration.h
+++ b/modules/bullet/godot_collision_configuration.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/godot_collision_dispatcher.cpp b/modules/bullet/godot_collision_dispatcher.cpp
index 1815f2152e..5cb50d685f 100644
--- a/modules/bullet/godot_collision_dispatcher.cpp
+++ b/modules/bullet/godot_collision_dispatcher.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/godot_collision_dispatcher.h b/modules/bullet/godot_collision_dispatcher.h
index 1faaa68626..d5fb3526fe 100644
--- a/modules/bullet/godot_collision_dispatcher.h
+++ b/modules/bullet/godot_collision_dispatcher.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/godot_motion_state.h b/modules/bullet/godot_motion_state.h
index 5844ef8bf3..188389b33c 100644
--- a/modules/bullet/godot_motion_state.h
+++ b/modules/bullet/godot_motion_state.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/godot_ray_world_algorithm.cpp b/modules/bullet/godot_ray_world_algorithm.cpp
index 27ee44d1bd..449f625e17 100644
--- a/modules/bullet/godot_ray_world_algorithm.cpp
+++ b/modules/bullet/godot_ray_world_algorithm.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/godot_ray_world_algorithm.h b/modules/bullet/godot_ray_world_algorithm.h
index 7383dad2bf..3285d0c962 100644
--- a/modules/bullet/godot_ray_world_algorithm.h
+++ b/modules/bullet/godot_ray_world_algorithm.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/godot_result_callbacks.cpp b/modules/bullet/godot_result_callbacks.cpp
index 3b44ab838e..7babfcc133 100644
--- a/modules/bullet/godot_result_callbacks.cpp
+++ b/modules/bullet/godot_result_callbacks.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -102,6 +102,9 @@ bool GodotAllConvexResultCallback::needsCollision(btBroadphaseProxy *proxy0) con
}
btScalar GodotAllConvexResultCallback::addSingleResult(btCollisionWorld::LocalConvexResult &convexResult, bool normalInWorldSpace) {
+ if (count >= m_resultMax)
+ return 1; // not used by bullet
+
CollisionObjectBullet *gObj = static_cast<CollisionObjectBullet *>(convexResult.m_hitCollisionObject->getUserPointer());
PhysicsDirectSpaceState::ShapeResult &result = m_results[count];
@@ -172,6 +175,9 @@ btScalar GodotClosestConvexResultCallback::addSingleResult(btCollisionWorld::Loc
}
bool GodotAllContactResultCallback::needsCollision(btBroadphaseProxy *proxy0) const {
+ if (m_count >= m_resultMax)
+ return false;
+
const bool needs = GodotFilterCallback::test_collision_filters(m_collisionFilterGroup, m_collisionFilterMask, proxy0->m_collisionFilterGroup, proxy0->m_collisionFilterMask);
if (needs) {
btCollisionObject *btObj = static_cast<btCollisionObject *>(proxy0->m_clientObject);
@@ -249,6 +255,8 @@ bool GodotContactPairContactResultCallback::needsCollision(btBroadphaseProxy *pr
}
btScalar GodotContactPairContactResultCallback::addSingleResult(btManifoldPoint &cp, const btCollisionObjectWrapper *colObj0Wrap, int partId0, int index0, const btCollisionObjectWrapper *colObj1Wrap, int partId1, int index1) {
+ if (m_count >= m_resultMax)
+ return 1; // not used by bullet
if (m_self_object == colObj0Wrap->getCollisionObject()) {
B_TO_G(cp.m_localPointA, m_results[m_count * 2 + 0]); // Local contact
@@ -296,6 +304,7 @@ btScalar GodotRestInfoContactResultCallback::addSingleResult(btManifoldPoint &cp
colObj = static_cast<CollisionObjectBullet *>(colObj1Wrap->getCollisionObject()->getUserPointer());
m_result->shape = cp.m_index1;
B_TO_G(cp.getPositionWorldOnB(), m_result->point);
+ B_TO_G(cp.m_normalWorldOnB, m_result->normal);
m_rest_info_bt_point = cp.getPositionWorldOnB();
m_rest_info_collision_object = colObj1Wrap->getCollisionObject();
} else {
diff --git a/modules/bullet/godot_result_callbacks.h b/modules/bullet/godot_result_callbacks.h
index 73e1fc9627..f292b0a797 100644
--- a/modules/bullet/godot_result_callbacks.h
+++ b/modules/bullet/godot_result_callbacks.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/hinge_joint_bullet.cpp b/modules/bullet/hinge_joint_bullet.cpp
index 3a4459a581..7b99d3d89f 100644
--- a/modules/bullet/hinge_joint_bullet.cpp
+++ b/modules/bullet/hinge_joint_bullet.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/hinge_joint_bullet.h b/modules/bullet/hinge_joint_bullet.h
index ca87c8dd8c..6555c23848 100644
--- a/modules/bullet/hinge_joint_bullet.h
+++ b/modules/bullet/hinge_joint_bullet.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/joint_bullet.cpp b/modules/bullet/joint_bullet.cpp
index aaeb9f9ce7..a52b05f5c4 100644
--- a/modules/bullet/joint_bullet.cpp
+++ b/modules/bullet/joint_bullet.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/joint_bullet.h b/modules/bullet/joint_bullet.h
index 4a5333fb85..d2c2796367 100644
--- a/modules/bullet/joint_bullet.h
+++ b/modules/bullet/joint_bullet.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/pin_joint_bullet.cpp b/modules/bullet/pin_joint_bullet.cpp
index 183a7e75b9..58b090006a 100644
--- a/modules/bullet/pin_joint_bullet.cpp
+++ b/modules/bullet/pin_joint_bullet.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/pin_joint_bullet.h b/modules/bullet/pin_joint_bullet.h
index 648010bf78..7c0c5be329 100644
--- a/modules/bullet/pin_joint_bullet.h
+++ b/modules/bullet/pin_joint_bullet.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/register_types.cpp b/modules/bullet/register_types.cpp
index 31e5f6784e..03fb75cc82 100644
--- a/modules/bullet/register_types.cpp
+++ b/modules/bullet/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/register_types.h b/modules/bullet/register_types.h
index 226bcd9402..ebb875eb1f 100644
--- a/modules/bullet/register_types.h
+++ b/modules/bullet/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/rid_bullet.h b/modules/bullet/rid_bullet.h
index a9351d7728..91ad8164e6 100644
--- a/modules/bullet/rid_bullet.h
+++ b/modules/bullet/rid_bullet.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/rigid_body_bullet.cpp b/modules/bullet/rigid_body_bullet.cpp
index 85659e1523..09177205b4 100644
--- a/modules/bullet/rigid_body_bullet.cpp
+++ b/modules/bullet/rigid_body_bullet.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -268,6 +268,7 @@ RigidBodyBullet::RigidBodyBullet() :
can_integrate_forces(false),
maxCollisionsDetection(0),
collisionsCount(0),
+ prev_collision_count(0),
maxAreasWhereIam(10),
areaWhereIamCount(0),
countGravityPointSpaces(0),
@@ -293,6 +294,9 @@ RigidBodyBullet::RigidBodyBullet() :
areasWhereIam.write[i] = NULL;
}
btBody->setSleepingThresholds(0.2, 0.2);
+
+ prev_collision_traces = &collision_traces_1;
+ curr_collision_traces = &collision_traces_2;
}
RigidBodyBullet::~RigidBodyBullet() {
@@ -410,7 +414,14 @@ void RigidBodyBullet::on_collision_filters_change() {
}
void RigidBodyBullet::on_collision_checker_start() {
+
+ prev_collision_count = collisionsCount;
collisionsCount = 0;
+
+ // Swap array
+ Vector<RigidBodyBullet *> *s = prev_collision_traces;
+ prev_collision_traces = curr_collision_traces;
+ curr_collision_traces = s;
}
void RigidBodyBullet::on_collision_checker_end() {
@@ -433,10 +444,20 @@ bool RigidBodyBullet::add_collision_object(RigidBodyBullet *p_otherObject, const
cd.other_object_shape = p_other_shape_index;
cd.local_shape = p_local_shape_index;
+ curr_collision_traces->write[collisionsCount] = p_otherObject;
+
++collisionsCount;
return true;
}
+bool RigidBodyBullet::was_colliding(RigidBodyBullet *p_other_object) {
+ for (int i = prev_collision_count - 1; 0 <= i; --i) {
+ if ((*prev_collision_traces)[i] == p_other_object)
+ return true;
+ }
+ return false;
+}
+
void RigidBodyBullet::assert_no_constraints() {
if (btBody->getNumConstraintRefs()) {
WARN_PRINT("A body with a joints is destroyed. Please check the implementation in order to destroy the joint before the body.");
diff --git a/modules/bullet/rigid_body_bullet.h b/modules/bullet/rigid_body_bullet.h
index 26e5018c87..784e99ab86 100644
--- a/modules/bullet/rigid_body_bullet.h
+++ b/modules/bullet/rigid_body_bullet.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -205,9 +205,15 @@ private:
bool can_integrate_forces;
Vector<CollisionData> collisions;
+ Vector<RigidBodyBullet *> collision_traces_1;
+ Vector<RigidBodyBullet *> collision_traces_2;
+ Vector<RigidBodyBullet *> *prev_collision_traces;
+ Vector<RigidBodyBullet *> *curr_collision_traces;
+
// these parameters are used to avoid vector resize
int maxCollisionsDetection;
int collisionsCount;
+ int prev_collision_count;
Vector<AreaBullet *> areasWhereIam;
// these parameters are used to avoid vector resize
@@ -244,9 +250,17 @@ public:
virtual void on_collision_checker_end();
void set_max_collisions_detection(int p_maxCollisionsDetection) {
+
+ ERR_FAIL_COND(0 > p_maxCollisionsDetection);
+
maxCollisionsDetection = p_maxCollisionsDetection;
+
collisions.resize(p_maxCollisionsDetection);
+ collision_traces_1.resize(p_maxCollisionsDetection);
+ collision_traces_2.resize(p_maxCollisionsDetection);
+
collisionsCount = 0;
+ prev_collision_count = MIN(prev_collision_count, p_maxCollisionsDetection);
}
int get_max_collisions_detection() {
return maxCollisionsDetection;
@@ -254,6 +268,7 @@ public:
bool can_add_collision() { return collisionsCount < maxCollisionsDetection; }
bool add_collision_object(RigidBodyBullet *p_otherObject, const Vector3 &p_hitWorldLocation, const Vector3 &p_hitLocalLocation, const Vector3 &p_hitNormal, const float &p_appliedImpulse, int p_other_shape_index, int p_local_shape_index);
+ bool was_colliding(RigidBodyBullet *p_other_object);
void assert_no_constraints();
diff --git a/modules/bullet/shape_bullet.cpp b/modules/bullet/shape_bullet.cpp
index 8bb621a863..1aba31f03d 100644
--- a/modules/bullet/shape_bullet.cpp
+++ b/modules/bullet/shape_bullet.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -461,7 +461,47 @@ void HeightMapShapeBullet::set_data(const Variant &p_data) {
int l_width = d["width"];
int l_depth = d["depth"];
- PoolVector<real_t> l_heights = d["heights"];
+
+ // TODO This code will need adjustments if real_t is set to `double`,
+ // because that precision is unnecessary for a heightmap and Bullet doesn't support it...
+
+ PoolVector<real_t> l_heights;
+ Variant l_heights_v = d["heights"];
+
+ if (l_heights_v.get_type() == Variant::POOL_REAL_ARRAY) {
+ // Ready-to-use heights can be passed
+
+ l_heights = l_heights_v;
+
+ } else if (l_heights_v.get_type() == Variant::OBJECT) {
+ // If an image is passed, we have to convert it to a format Bullet supports.
+ // this would be expensive to do with a script, so it's nice to have it here.
+
+ Ref<Image> l_image = l_heights_v;
+ ERR_FAIL_COND(l_image.is_null());
+
+ // Float is the only common format between Godot and Bullet that can be used for decent collision.
+ // (Int16 would be nice too but we still don't have it)
+ // We could convert here automatically but it's better to not be intrusive and let the caller do it if necessary.
+ ERR_FAIL_COND(l_image->get_format() != Image::FORMAT_RF);
+
+ PoolByteArray im_data = l_image->get_data();
+
+ l_heights.resize(l_image->get_width() * l_image->get_height());
+
+ PoolRealArray::Write w = l_heights.write();
+ PoolByteArray::Read r = im_data.read();
+ float *rp = (float *)r.ptr();
+ // At this point, `rp` could be used directly for Bullet, but I don't know how safe it would be.
+
+ for (int i = 0; i < l_heights.size(); ++i) {
+ w[i] = rp[i];
+ }
+
+ } else {
+ ERR_EXPLAIN("Expected PoolRealArray or float Image.");
+ ERR_FAIL();
+ }
ERR_FAIL_COND(l_width <= 0);
ERR_FAIL_COND(l_depth <= 0);
@@ -497,19 +537,8 @@ PhysicsServer::ShapeType HeightMapShapeBullet::get_type() const {
void HeightMapShapeBullet::setup(PoolVector<real_t> &p_heights, int p_width, int p_depth, real_t p_min_height, real_t p_max_height) {
// TODO cell size must be tweaked using localScaling, which is a shared property for all Bullet shapes
- { // Copy
-
- // TODO If Godot supported 16-bit integer image format, we could share the same memory block for heightfields
- // without having to copy anything, optimizing memory and loading performance (Bullet only reads and doesn't take ownership of the data).
-
- const int heights_size = p_heights.size();
- heights.resize(heights_size);
- PoolVector<real_t>::Read p_heights_r = p_heights.read();
- PoolVector<real_t>::Write heights_w = heights.write();
- for (int i = heights_size - 1; 0 <= i; --i) {
- heights_w[i] = p_heights_r[i];
- }
- }
+ // If this array is resized outside of here, it should be preserved due to CoW
+ heights = p_heights;
width = p_width;
depth = p_depth;
diff --git a/modules/bullet/shape_bullet.h b/modules/bullet/shape_bullet.h
index 9a1c8f5bfa..39d0ba7b95 100644
--- a/modules/bullet/shape_bullet.h
+++ b/modules/bullet/shape_bullet.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/shape_owner_bullet.cpp b/modules/bullet/shape_owner_bullet.cpp
index d6ba5d81bc..d504db1844 100644
--- a/modules/bullet/shape_owner_bullet.cpp
+++ b/modules/bullet/shape_owner_bullet.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/shape_owner_bullet.h b/modules/bullet/shape_owner_bullet.h
index 72ddbc482c..02852bc03d 100644
--- a/modules/bullet/shape_owner_bullet.h
+++ b/modules/bullet/shape_owner_bullet.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/slider_joint_bullet.cpp b/modules/bullet/slider_joint_bullet.cpp
index 9016ec3bf5..45be0578d9 100644
--- a/modules/bullet/slider_joint_bullet.cpp
+++ b/modules/bullet/slider_joint_bullet.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/slider_joint_bullet.h b/modules/bullet/slider_joint_bullet.h
index d532906c0d..fa9ea3f782 100644
--- a/modules/bullet/slider_joint_bullet.h
+++ b/modules/bullet/slider_joint_bullet.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/soft_body_bullet.cpp b/modules/bullet/soft_body_bullet.cpp
index 94f350210f..88190f8e9e 100644
--- a/modules/bullet/soft_body_bullet.cpp
+++ b/modules/bullet/soft_body_bullet.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/soft_body_bullet.h b/modules/bullet/soft_body_bullet.h
index d04bfca046..5e05c266a8 100644
--- a/modules/bullet/soft_body_bullet.h
+++ b/modules/bullet/soft_body_bullet.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/bullet/space_bullet.cpp b/modules/bullet/space_bullet.cpp
index ab2d1781ad..ab841e4acf 100644
--- a/modules/bullet/space_bullet.cpp
+++ b/modules/bullet/space_bullet.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -786,16 +786,22 @@ void SpaceBullet::check_body_collision() {
}
const int numContacts = contactManifold->getNumContacts();
+
+ /// Since I don't need report all contacts for these objects,
+ /// So report only the first
#define REPORT_ALL_CONTACTS 0
#if REPORT_ALL_CONTACTS
for (int j = 0; j < numContacts; j++) {
btManifoldPoint &pt = contactManifold->getContactPoint(j);
#else
- // Since I don't need report all contacts for these objects, I'll report only the first
if (numContacts) {
btManifoldPoint &pt = contactManifold->getContactPoint(0);
#endif
- if (pt.getDistance() <= 0.0) {
+ if (
+ pt.getDistance() <= 0.0 ||
+ bodyA->was_colliding(bodyB) ||
+ bodyB->was_colliding(bodyA)) {
+
Vector3 collisionWorldPosition;
Vector3 collisionLocalPosition;
Vector3 normalOnB;
diff --git a/modules/bullet/space_bullet.h b/modules/bullet/space_bullet.h
index c3d55cbbb1..9f36c63982 100644
--- a/modules/bullet/space_bullet.h
+++ b/modules/bullet/space_bullet.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/csg/csg.cpp b/modules/csg/csg.cpp
index 88f3c0338a..12282b4730 100644
--- a/modules/csg/csg.cpp
+++ b/modules/csg/csg.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/csg/csg.h b/modules/csg/csg.h
index 5d6432eca8..ac16575e82 100644
--- a/modules/csg/csg.h
+++ b/modules/csg/csg.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/csg/csg_gizmos.cpp b/modules/csg/csg_gizmos.cpp
index 5864d02615..3044887ef5 100644
--- a/modules/csg/csg_gizmos.cpp
+++ b/modules/csg/csg_gizmos.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -356,5 +356,5 @@ void CSGShapeSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
EditorPluginCSG::EditorPluginCSG(EditorNode *p_editor) {
Ref<CSGShapeSpatialGizmoPlugin> gizmo_plugin = Ref<CSGShapeSpatialGizmoPlugin>(memnew(CSGShapeSpatialGizmoPlugin));
- SpatialEditor::get_singleton()->register_gizmo_plugin(gizmo_plugin);
+ SpatialEditor::get_singleton()->add_gizmo_plugin(gizmo_plugin);
}
diff --git a/modules/csg/csg_gizmos.h b/modules/csg/csg_gizmos.h
index d65d1f58c1..b208c39938 100644
--- a/modules/csg/csg_gizmos.h
+++ b/modules/csg/csg_gizmos.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/csg/csg_shape.cpp b/modules/csg/csg_shape.cpp
index 23d879e1cd..a13f731c11 100644
--- a/modules/csg/csg_shape.cpp
+++ b/modules/csg/csg_shape.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -47,18 +47,77 @@ void CSGShape::set_use_collision(bool p_enable) {
PhysicsServer::get_singleton()->body_set_state(root_collision_instance, PhysicsServer::BODY_STATE_TRANSFORM, get_global_transform());
PhysicsServer::get_singleton()->body_add_shape(root_collision_instance, root_collision_shape->get_rid());
PhysicsServer::get_singleton()->body_set_space(root_collision_instance, get_world()->get_space());
+ PhysicsServer::get_singleton()->body_attach_object_instance_id(root_collision_instance, get_instance_id());
+ set_collision_layer(collision_layer);
+ set_collision_mask(collision_mask);
_make_dirty(); //force update
} else {
PhysicsServer::get_singleton()->free(root_collision_instance);
root_collision_instance = RID();
root_collision_shape.unref();
}
+ _change_notify();
}
bool CSGShape::is_using_collision() const {
return use_collision;
}
+void CSGShape::set_collision_layer(uint32_t p_layer) {
+ collision_layer = p_layer;
+ if (root_collision_instance.is_valid()) {
+ PhysicsServer::get_singleton()->body_set_collision_layer(root_collision_instance, p_layer);
+ }
+}
+
+uint32_t CSGShape::get_collision_layer() const {
+
+ return collision_layer;
+}
+
+void CSGShape::set_collision_mask(uint32_t p_mask) {
+
+ collision_mask = p_mask;
+ if (root_collision_instance.is_valid()) {
+ PhysicsServer::get_singleton()->body_set_collision_mask(root_collision_instance, p_mask);
+ }
+}
+
+uint32_t CSGShape::get_collision_mask() const {
+
+ return collision_mask;
+}
+
+void CSGShape::set_collision_mask_bit(int p_bit, bool p_value) {
+
+ uint32_t mask = get_collision_mask();
+ if (p_value)
+ mask |= 1 << p_bit;
+ else
+ mask &= ~(1 << p_bit);
+ set_collision_mask(mask);
+}
+
+bool CSGShape::get_collision_mask_bit(int p_bit) const {
+
+ return get_collision_mask() & (1 << p_bit);
+}
+
+void CSGShape::set_collision_layer_bit(int p_bit, bool p_value) {
+
+ uint32_t mask = get_collision_layer();
+ if (p_value)
+ mask |= 1 << p_bit;
+ else
+ mask &= ~(1 << p_bit);
+ set_collision_layer(mask);
+}
+
+bool CSGShape::get_collision_layer_bit(int p_bit) const {
+
+ return get_collision_layer() & (1 << p_bit);
+}
+
bool CSGShape::is_root_shape() const {
return !parent;
@@ -196,18 +255,6 @@ void CSGShape::mikktGetTexCoord(const SMikkTSpaceContext *pContext, float fvTexc
fvTexcOut[1] = t.y;
}
-void CSGShape::mikktSetTSpaceBasic(const SMikkTSpaceContext *pContext, const float fvTangent[], const float fSign, const int iFace, const int iVert) {
- ShapeUpdateSurface &surface = *((ShapeUpdateSurface *)pContext->m_pUserData);
-
- int i = (iFace * 3 + iVert) * 4;
-
- // Godot seems to want the tangent flipped because our handedness is reversed..
- surface.tansw[i++] = -fvTangent[0];
- surface.tansw[i++] = -fvTangent[1];
- surface.tansw[i++] = -fvTangent[2];
- surface.tansw[i++] = fSign;
-}
-
void CSGShape::mikktSetTSpaceDefault(const SMikkTSpaceContext *pContext, const float fvTangent[], const float fvBiTangent[], const float fMagS, const float fMagT,
const tbool bIsOrientationPreserving, const int iFace, const int iVert) {
@@ -216,14 +263,13 @@ void CSGShape::mikktSetTSpaceDefault(const SMikkTSpaceContext *pContext, const f
int i = iFace * 3 + iVert;
Vector3 normal = surface.normalsw[i];
Vector3 tangent = Vector3(fvTangent[0], fvTangent[1], fvTangent[2]);
- Vector3 bitangent = Vector3(fvBiTangent[0], fvBiTangent[1], fvBiTangent[2]);
+ Vector3 bitangent = Vector3(-fvBiTangent[0], -fvBiTangent[1], -fvBiTangent[2]); // for some reason these are reversed, something with the coordinate system in Godot
float d = bitangent.dot(normal.cross(tangent));
- // Godot seems to want the tangent flipped because our handedness is reversed..
i *= 4;
- surface.tansw[i++] = -tangent.x;
- surface.tansw[i++] = -tangent.y;
- surface.tansw[i++] = -tangent.z;
+ surface.tansw[i++] = tangent.x;
+ surface.tansw[i++] = tangent.y;
+ surface.tansw[i++] = tangent.z;
surface.tansw[i++] = d < 0 ? -1 : 1;
}
@@ -470,6 +516,9 @@ void CSGShape::_notification(int p_what) {
PhysicsServer::get_singleton()->body_set_state(root_collision_instance, PhysicsServer::BODY_STATE_TRANSFORM, get_global_transform());
PhysicsServer::get_singleton()->body_add_shape(root_collision_instance, root_collision_shape->get_rid());
PhysicsServer::get_singleton()->body_set_space(root_collision_instance, get_world()->get_space());
+ PhysicsServer::get_singleton()->body_attach_object_instance_id(root_collision_instance, get_instance_id());
+ set_collision_layer(collision_layer);
+ set_collision_mask(collision_mask);
}
_make_dirty();
@@ -488,7 +537,7 @@ void CSGShape::_notification(int p_what) {
parent->_make_dirty();
parent = NULL;
- if (use_collision && is_root_shape()) {
+ if (use_collision && is_root_shape() && root_collision_instance.is_valid()) {
PhysicsServer::get_singleton()->free(root_collision_instance);
root_collision_instance = RID();
root_collision_shape.unref();
@@ -517,9 +566,12 @@ bool CSGShape::is_calculating_tangents() const {
}
void CSGShape::_validate_property(PropertyInfo &property) const {
- if (is_inside_tree() && property.name.begins_with("use_collision") && !is_root_shape()) {
+ bool is_collision_prefixed = property.name.begins_with("collision_");
+ if ((is_collision_prefixed || property.name.begins_with("use_collision")) && is_inside_tree() && !is_root_shape()) {
//hide collision if not root
property.usage = PROPERTY_USAGE_NOEDITOR;
+ } else if (is_collision_prefixed && !bool(get("use_collision"))) {
+ property.usage = PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL;
}
}
@@ -531,34 +583,52 @@ void CSGShape::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_operation", "operation"), &CSGShape::set_operation);
ClassDB::bind_method(D_METHOD("get_operation"), &CSGShape::get_operation);
+ ClassDB::bind_method(D_METHOD("set_snap", "snap"), &CSGShape::set_snap);
+ ClassDB::bind_method(D_METHOD("get_snap"), &CSGShape::get_snap);
+
ClassDB::bind_method(D_METHOD("set_use_collision", "operation"), &CSGShape::set_use_collision);
ClassDB::bind_method(D_METHOD("is_using_collision"), &CSGShape::is_using_collision);
- ClassDB::bind_method(D_METHOD("set_snap", "snap"), &CSGShape::set_snap);
- ClassDB::bind_method(D_METHOD("get_snap"), &CSGShape::get_snap);
+ ClassDB::bind_method(D_METHOD("set_collision_layer", "layer"), &CSGShape::set_collision_layer);
+ ClassDB::bind_method(D_METHOD("get_collision_layer"), &CSGShape::get_collision_layer);
+
+ ClassDB::bind_method(D_METHOD("set_collision_mask", "mask"), &CSGShape::set_collision_mask);
+ ClassDB::bind_method(D_METHOD("get_collision_mask"), &CSGShape::get_collision_mask);
+
+ ClassDB::bind_method(D_METHOD("set_collision_mask_bit", "bit", "value"), &CSGShape::set_collision_mask_bit);
+ ClassDB::bind_method(D_METHOD("get_collision_mask_bit", "bit"), &CSGShape::get_collision_mask_bit);
+
+ ClassDB::bind_method(D_METHOD("set_collision_layer_bit", "bit", "value"), &CSGShape::set_collision_layer_bit);
+ ClassDB::bind_method(D_METHOD("get_collision_layer_bit", "bit"), &CSGShape::get_collision_layer_bit);
ClassDB::bind_method(D_METHOD("set_calculate_tangents", "enabled"), &CSGShape::set_calculate_tangents);
ClassDB::bind_method(D_METHOD("is_calculating_tangents"), &CSGShape::is_calculating_tangents);
ADD_PROPERTY(PropertyInfo(Variant::INT, "operation", PROPERTY_HINT_ENUM, "Union,Intersection,Subtraction"), "set_operation", "get_operation");
- ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_collision"), "set_use_collision", "is_using_collision");
ADD_PROPERTY(PropertyInfo(Variant::REAL, "snap", PROPERTY_HINT_RANGE, "0.0001,1,0.001"), "set_snap", "get_snap");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "calculate_tangents"), "set_calculate_tangents", "is_calculating_tangents");
+ ADD_GROUP("Collision", "collision_");
+ ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_collision"), "set_use_collision", "is_using_collision");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_layer", PROPERTY_HINT_LAYERS_3D_PHYSICS), "set_collision_layer", "get_collision_layer");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_mask", PROPERTY_HINT_LAYERS_3D_PHYSICS), "set_collision_mask", "get_collision_mask");
+
BIND_ENUM_CONSTANT(OPERATION_UNION);
BIND_ENUM_CONSTANT(OPERATION_INTERSECTION);
BIND_ENUM_CONSTANT(OPERATION_SUBTRACTION);
}
CSGShape::CSGShape() {
+ operation = OPERATION_UNION;
+ parent = NULL;
brush = NULL;
- set_notify_local_transform(true);
dirty = false;
- parent = NULL;
- use_collision = false;
- operation = OPERATION_UNION;
snap = 0.001;
+ use_collision = false;
+ collision_layer = 1;
+ collision_mask = 1;
calculate_tangents = true;
+ set_notify_local_transform(true);
}
CSGShape::~CSGShape() {
@@ -1062,9 +1132,9 @@ CSGBrush *CSGBox::_build_brush() {
for (int k = 0; k < 3; k++) {
if (i < 3)
- face_points[j][(i + k) % 3] = v[k] * (i >= 3 ? -1 : 1);
+ face_points[j][(i + k) % 3] = v[k];
else
- face_points[3 - j][(i + k) % 3] = v[k] * (i >= 3 ? -1 : 1);
+ face_points[3 - j][(i + k) % 3] = -v[k];
}
}
@@ -1666,6 +1736,24 @@ CSGBrush *CSGPolygon::_build_brush() {
Path *path = NULL;
Ref<Curve3D> curve;
+ // get bounds for our polygon
+ Vector2 final_polygon_min;
+ Vector2 final_polygon_max;
+ for (int i = 0; i < final_polygon.size(); i++) {
+ Vector2 p = final_polygon[i];
+ if (i == 0) {
+ final_polygon_min = p;
+ final_polygon_max = final_polygon_min;
+ } else {
+ if (p.x < final_polygon_min.x) final_polygon_min.x = p.x;
+ if (p.y < final_polygon_min.y) final_polygon_min.y = p.y;
+
+ if (p.x > final_polygon_max.x) final_polygon_max.x = p.x;
+ if (p.y > final_polygon_max.y) final_polygon_max.y = p.y;
+ }
+ }
+ Vector2 final_polygon_size = final_polygon_max - final_polygon_min;
+
if (mode == MODE_PATH) {
if (!has_node(path_node))
return NULL;
@@ -1757,6 +1845,10 @@ CSGBrush *CSGPolygon::_build_brush() {
v.z -= depth;
}
facesw[face * 3 + k] = v;
+ uvsw[face * 3 + k] = (p - final_polygon_min) / final_polygon_size;
+ if (i == 0) {
+ uvsw[face * 3 + k].x = 1.0 - uvsw[face * 3 + k].x; /* flip x */
+ }
}
smoothw[face] = false;
@@ -1888,6 +1980,7 @@ CSGBrush *CSGPolygon::_build_brush() {
Vector2 p = final_polygon[triangles[j + src[k]]];
Vector3 v = Vector3(p.x, p.y, 0);
facesw[face * 3 + k] = v;
+ uvsw[face * 3 + k] = (p - final_polygon_min) / final_polygon_size;
}
smoothw[face] = false;
@@ -1905,6 +1998,8 @@ CSGBrush *CSGPolygon::_build_brush() {
Vector2 p = final_polygon[triangles[j + src[k]]];
Vector3 v = Vector3(normali_n.x * p.x, p.y, normali_n.z * p.x);
facesw[face * 3 + k] = v;
+ uvsw[face * 3 + k] = (p - final_polygon_min) / final_polygon_size;
+ uvsw[face * 3 + k].x = 1.0 - uvsw[face * 3 + k].x; /* flip x */
}
smoothw[face] = false;
@@ -1990,10 +2085,10 @@ CSGBrush *CSGPolygon::_build_brush() {
};
Vector2 u[4] = {
- Vector2(u1, 0),
Vector2(u1, 1),
- Vector2(u2, 1),
- Vector2(u2, 0)
+ Vector2(u1, 0),
+ Vector2(u2, 0),
+ Vector2(u2, 1)
};
// face 1
@@ -2036,6 +2131,7 @@ CSGBrush *CSGPolygon::_build_brush() {
Vector2 p = final_polygon[triangles[j + src[k]]];
Vector3 v = Vector3(p.x, p.y, 0);
facesw[face * 3 + k] = xf.xform(v);
+ uvsw[face * 3 + k] = (p - final_polygon_min) / final_polygon_size;
}
smoothw[face] = false;
@@ -2053,6 +2149,8 @@ CSGBrush *CSGPolygon::_build_brush() {
Vector2 p = final_polygon[triangles[j + src[k]]];
Vector3 v = Vector3(p.x, p.y, 0);
facesw[face * 3 + k] = xf.xform(v);
+ uvsw[face * 3 + k] = (p - final_polygon_min) / final_polygon_size;
+ uvsw[face * 3 + k].x = 1.0 - uvsw[face * 3 + k].x; /* flip x */
}
smoothw[face] = false;
@@ -2077,6 +2175,9 @@ CSGBrush *CSGPolygon::_build_brush() {
} else {
aabb.expand_to(facesw[i]);
}
+
+ // invert UVs on the Y-axis OpenGL = upside down
+ uvsw[i].y = 1.0 - uvsw[i].y;
}
}
diff --git a/modules/csg/csg_shape.h b/modules/csg/csg_shape.h
index 0a4bb5f665..df503faf2e 100644
--- a/modules/csg/csg_shape.h
+++ b/modules/csg/csg_shape.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -61,6 +61,8 @@ private:
float snap;
bool use_collision;
+ uint32_t collision_layer;
+ uint32_t collision_mask;
Ref<ConcavePolygonShape> root_collision_shape;
RID root_collision_instance;
@@ -97,7 +99,6 @@ private:
static void mikktGetPosition(const SMikkTSpaceContext *pContext, float fvPosOut[], const int iFace, const int iVert);
static void mikktGetNormal(const SMikkTSpaceContext *pContext, float fvNormOut[], const int iFace, const int iVert);
static void mikktGetTexCoord(const SMikkTSpaceContext *pContext, float fvTexcOut[], const int iFace, const int iVert);
- static void mikktSetTSpaceBasic(const SMikkTSpaceContext *pContext, const float fvTangent[], const float fSign, const int iFace, const int iVert);
static void mikktSetTSpaceDefault(const SMikkTSpaceContext *pContext, const float fvTangent[], const float fvBiTangent[], const float fMagS, const float fMagT,
const tbool bIsOrientationPreserving, const int iFace, const int iVert);
@@ -127,6 +128,18 @@ public:
void set_use_collision(bool p_enable);
bool is_using_collision() const;
+ void set_collision_layer(uint32_t p_layer);
+ uint32_t get_collision_layer() const;
+
+ void set_collision_mask(uint32_t p_mask);
+ uint32_t get_collision_mask() const;
+
+ void set_collision_layer_bit(int p_bit, bool p_value);
+ bool get_collision_layer_bit(int p_bit) const;
+
+ void set_collision_mask_bit(int p_bit, bool p_value);
+ bool get_collision_mask_bit(int p_bit) const;
+
void set_snap(float p_snap);
float get_snap() const;
diff --git a/modules/csg/doc_classes/CSGCombiner.xml b/modules/csg/doc_classes/CSGCombiner.xml
index 1cfaa74b7d..69c5df5840 100644
--- a/modules/csg/doc_classes/CSGCombiner.xml
+++ b/modules/csg/doc_classes/CSGCombiner.xml
@@ -4,7 +4,7 @@
A CSG node that allows you to combine other CSG modifiers.
</brief_description>
<description>
- For complex arrangements of shapes it is sometimes needed to add structure to your CSG nodes. The CSGCombiner node allows you to create this structure. The node encapsulates the result of the CSG operations of its children. In this way it is possible to do operations on one set of shapes that are children of one CSGCombiner node, and a set of separate operations on a second set of shapes that are children of a second CSGCombiner node, and then do an operation that takes the two end results as their input to create the final shape.
+ For complex arrangements of shapes, it is sometimes needed to add structure to your CSG nodes. The CSGCombiner node allows you to create this structure. The node encapsulates the result of the CSG operations of its children. In this way, it is possible to do operations on one set of shapes that are children of one CSGCombiner node, and a set of separate operations on a second set of shapes that are children of a second CSGCombiner node, and then do an operation that takes the two end results as its input to create the final shape.
</description>
<tutorials>
</tutorials>
diff --git a/modules/csg/doc_classes/CSGMesh.xml b/modules/csg/doc_classes/CSGMesh.xml
index 419214b7e6..58e2bc1c4b 100644
--- a/modules/csg/doc_classes/CSGMesh.xml
+++ b/modules/csg/doc_classes/CSGMesh.xml
@@ -4,7 +4,7 @@
A CSG Mesh shape that uses a mesh resource.
</brief_description>
<description>
- This CSG node allows you to use any mesh resource as a CSG shape provided it is closed, does not self-intersect, does not contain internal faces and has no edges that connect to more then two faces.
+ This CSG node allows you to use any mesh resource as a CSG shape, provided it is closed, does not self-intersect, does not contain internal faces and has no edges that connect to more then two faces.
</description>
<tutorials>
</tutorials>
diff --git a/modules/csg/doc_classes/CSGShape.xml b/modules/csg/doc_classes/CSGShape.xml
index ac3c2342fc..56087cbb82 100644
--- a/modules/csg/doc_classes/CSGShape.xml
+++ b/modules/csg/doc_classes/CSGShape.xml
@@ -11,6 +11,24 @@
<demos>
</demos>
<methods>
+ <method name="get_collision_layer_bit" qualifiers="const">
+ <return type="bool">
+ </return>
+ <argument index="0" name="bit" type="int">
+ </argument>
+ <description>
+ Returns an individual bit on the collision mask.
+ </description>
+ </method>
+ <method name="get_collision_mask_bit" qualifiers="const">
+ <return type="bool">
+ </return>
+ <argument index="0" name="bit" type="int">
+ </argument>
+ <description>
+ Returns an individual bit on the collision mask.
+ </description>
+ </method>
<method name="is_root_shape" qualifiers="const">
<return type="bool">
</return>
@@ -18,11 +36,41 @@
Returns true if this is a root shape and is thus the object that is rendered.
</description>
</method>
+ <method name="set_collision_layer_bit">
+ <return type="void">
+ </return>
+ <argument index="0" name="bit" type="int">
+ </argument>
+ <argument index="1" name="value" type="bool">
+ </argument>
+ <description>
+ Sets individual bits on the layer mask. Use this if you only need to change one layer's value.
+ </description>
+ </method>
+ <method name="set_collision_mask_bit">
+ <return type="void">
+ </return>
+ <argument index="0" name="bit" type="int">
+ </argument>
+ <argument index="1" name="value" type="bool">
+ </argument>
+ <description>
+ Sets individual bits on the collision mask. Use this if you only need to change one layer's value.
+ </description>
+ </method>
</methods>
<members>
<member name="calculate_tangents" type="bool" setter="set_calculate_tangents" getter="is_calculating_tangents">
Calculate tangents for the CSG shape which allows the use of normal maps. This is only applied on the root shape, this setting is ignored on any child.
</member>
+ <member name="collision_layer" type="int" setter="set_collision_layer" getter="get_collision_layer">
+ The physics layers this area is in.
+ Collidable objects can exist in any of 32 different layers. These layers work like a tagging system, and are not visual. A collidable can use these layers to select with which objects it can collide, using the collision_mask property.
+ A contact is detected if object A is in any of the layers that object B scans, or object B is in any layer scanned by object A.
+ </member>
+ <member name="collision_mask" type="int" setter="set_collision_mask" getter="get_collision_mask">
+ The physics layers this CSG shape scans for collisions.
+ </member>
<member name="operation" type="int" setter="set_operation" getter="get_operation" enum="CSGShape.Operation">
The operation that is performed on this shape. This is ignored for the first CSG child node as the operation is between this node and the previous child of this nodes parent.
</member>
diff --git a/modules/csg/register_types.cpp b/modules/csg/register_types.cpp
index 0dea09808a..33e29ec43e 100644
--- a/modules/csg/register_types.cpp
+++ b/modules/csg/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/csg/register_types.h b/modules/csg/register_types.h
index 49490d31d3..9e112b72f0 100644
--- a/modules/csg/register_types.h
+++ b/modules/csg/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/cvtt/image_compress_cvtt.cpp b/modules/cvtt/image_compress_cvtt.cpp
index 732b9cf733..0a70ff535f 100644
--- a/modules/cvtt/image_compress_cvtt.cpp
+++ b/modules/cvtt/image_compress_cvtt.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/cvtt/image_compress_cvtt.h b/modules/cvtt/image_compress_cvtt.h
index fe912ad3bb..a4a9641236 100644
--- a/modules/cvtt/image_compress_cvtt.h
+++ b/modules/cvtt/image_compress_cvtt.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/cvtt/register_types.cpp b/modules/cvtt/register_types.cpp
index c96fbbf340..40381e75d2 100644
--- a/modules/cvtt/register_types.cpp
+++ b/modules/cvtt/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/cvtt/register_types.h b/modules/cvtt/register_types.h
index 73de9728d3..63cf172e63 100644
--- a/modules/cvtt/register_types.h
+++ b/modules/cvtt/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/dds/register_types.cpp b/modules/dds/register_types.cpp
index d6351fb6fe..66ce3ce35d 100644
--- a/modules/dds/register_types.cpp
+++ b/modules/dds/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -32,15 +32,16 @@
#include "texture_loader_dds.h"
-static ResourceFormatDDS *resource_loader_dds = NULL;
+static Ref<ResourceFormatDDS> resource_loader_dds;
void register_dds_types() {
- resource_loader_dds = memnew(ResourceFormatDDS);
+ resource_loader_dds.instance();
ResourceLoader::add_resource_format_loader(resource_loader_dds);
}
void unregister_dds_types() {
- memdelete(resource_loader_dds);
+ ResourceLoader::remove_resource_format_loader(resource_loader_dds);
+ resource_loader_dds.unref();
}
diff --git a/modules/dds/register_types.h b/modules/dds/register_types.h
index c7f7839c24..ae58fc435e 100644
--- a/modules/dds/register_types.h
+++ b/modules/dds/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/dds/texture_loader_dds.cpp b/modules/dds/texture_loader_dds.cpp
index 53e9773791..a063942269 100644
--- a/modules/dds/texture_loader_dds.cpp
+++ b/modules/dds/texture_loader_dds.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/dds/texture_loader_dds.h b/modules/dds/texture_loader_dds.h
index 4e2593c744..585f2891bf 100644
--- a/modules/dds/texture_loader_dds.h
+++ b/modules/dds/texture_loader_dds.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -35,6 +35,7 @@
#include "scene/resources/texture.h"
class ResourceFormatDDS : public ResourceFormatLoader {
+ GDCLASS(ResourceFormatDDS, ResourceFormatLoader)
public:
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
virtual void get_recognized_extensions(List<String> *p_extensions) const;
diff --git a/modules/enet/doc_classes/NetworkedMultiplayerENet.xml b/modules/enet/doc_classes/NetworkedMultiplayerENet.xml
index e057a435ac..4976a90945 100644
--- a/modules/enet/doc_classes/NetworkedMultiplayerENet.xml
+++ b/modules/enet/doc_classes/NetworkedMultiplayerENet.xml
@@ -4,7 +4,7 @@
PacketPeer implementation using the ENet library.
</brief_description>
<description>
- A PacketPeer implementation that should be passed to [method SceneTree.set_network_peer] after being initialized as either a client or server. Events can then be handled by connecting to [SceneTree] signals.
+ A PacketPeer implementation that should be passed to [member SceneTree.network_peer] after being initialized as either a client or server. Events can then be handled by connecting to [SceneTree] signals.
</description>
<tutorials>
<link>https://docs.godotengine.org/en/latest/tutorials/networking/high_level_multiplayer.html</link>
diff --git a/modules/enet/networked_multiplayer_enet.cpp b/modules/enet/networked_multiplayer_enet.cpp
index 7b5fd854ff..e53846e269 100644
--- a/modules/enet/networked_multiplayer_enet.cpp
+++ b/modules/enet/networked_multiplayer_enet.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/enet/networked_multiplayer_enet.h b/modules/enet/networked_multiplayer_enet.h
index a2b35f2395..957d0830cb 100644
--- a/modules/enet/networked_multiplayer_enet.h
+++ b/modules/enet/networked_multiplayer_enet.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/enet/register_types.cpp b/modules/enet/register_types.cpp
index cde70e8d5c..f2c1451446 100644
--- a/modules/enet/register_types.cpp
+++ b/modules/enet/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/enet/register_types.h b/modules/enet/register_types.h
index bcf0893ae4..8d001b8c30 100644
--- a/modules/enet/register_types.h
+++ b/modules/enet/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/etc/SCsub b/modules/etc/SCsub
index d2c77d6e3c..6e963ef766 100644
--- a/modules/etc/SCsub
+++ b/modules/etc/SCsub
@@ -33,11 +33,6 @@ env_etc.Append(CPPPATH=[thirdparty_dir])
if not env.msvc:
env_etc.Append(CCFLAGS="-std=c++11")
-# -ffast-math seems to be incompatible with etc2comp on recent versions of
-# GCC and Clang
-if '-ffast-math' in env_etc['CCFLAGS']:
- env_etc['CCFLAGS'].remove('-ffast-math')
-
env_thirdparty = env_etc.Clone()
env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources)
diff --git a/modules/etc/image_etc.cpp b/modules/etc/image_etc.cpp
index fbbc765bf2..5410d367db 100644
--- a/modules/etc/image_etc.cpp
+++ b/modules/etc/image_etc.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/etc/image_etc.h b/modules/etc/image_etc.h
index 371c38176f..724d06545b 100644
--- a/modules/etc/image_etc.h
+++ b/modules/etc/image_etc.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/etc/register_types.cpp b/modules/etc/register_types.cpp
index 1d1f0e1b77..584a1fcce8 100644
--- a/modules/etc/register_types.cpp
+++ b/modules/etc/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -33,11 +33,11 @@
#include "image_etc.h"
#include "texture_loader_pkm.h"
-static ResourceFormatPKM *resource_loader_pkm = NULL;
+static Ref<ResourceFormatPKM> resource_loader_pkm;
void register_etc_types() {
- resource_loader_pkm = memnew(ResourceFormatPKM);
+ resource_loader_pkm.instance();
ResourceLoader::add_resource_format_loader(resource_loader_pkm);
_register_etc_compress_func();
@@ -45,5 +45,6 @@ void register_etc_types() {
void unregister_etc_types() {
- memdelete(resource_loader_pkm);
+ ResourceLoader::remove_resource_format_loader(resource_loader_pkm);
+ resource_loader_pkm.unref();
}
diff --git a/modules/etc/register_types.h b/modules/etc/register_types.h
index 4a8513a687..161c37b52f 100644
--- a/modules/etc/register_types.h
+++ b/modules/etc/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/etc/texture_loader_pkm.cpp b/modules/etc/texture_loader_pkm.cpp
index 3041dde876..f302834222 100644
--- a/modules/etc/texture_loader_pkm.cpp
+++ b/modules/etc/texture_loader_pkm.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/etc/texture_loader_pkm.h b/modules/etc/texture_loader_pkm.h
index b5a95767c7..860fe8b5df 100644
--- a/modules/etc/texture_loader_pkm.h
+++ b/modules/etc/texture_loader_pkm.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -35,6 +35,7 @@
#include "scene/resources/texture.h"
class ResourceFormatPKM : public ResourceFormatLoader {
+ GDCLASS(ResourceFormatPKM, ResourceFormatLoader)
public:
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
virtual void get_recognized_extensions(List<String> *p_extensions) const;
diff --git a/modules/freetype/register_types.cpp b/modules/freetype/register_types.cpp
index bde04b714c..108ecab329 100644
--- a/modules/freetype/register_types.cpp
+++ b/modules/freetype/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/freetype/register_types.h b/modules/freetype/register_types.h
index 0cec0e3951..dae7ad1f40 100644
--- a/modules/freetype/register_types.h
+++ b/modules/freetype/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/freetype/uwpdef.h b/modules/freetype/uwpdef.h
index 3887c3e25c..e4d2d223bb 100644
--- a/modules/freetype/uwpdef.h
+++ b/modules/freetype/uwpdef.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/SCsub b/modules/gdnative/SCsub
index fe2d8c7ce9..235f0b97bb 100644
--- a/modules/gdnative/SCsub
+++ b/modules/gdnative/SCsub
@@ -19,6 +19,7 @@ Export('env_gdnative')
SConscript("net/SCsub")
SConscript("arvr/SCsub")
SConscript("pluginscript/SCsub")
+SConscript("videodecoder/SCsub")
from platform_methods import run_in_subprocess
diff --git a/modules/gdnative/android/android_gdn.cpp b/modules/gdnative/android/android_gdn.cpp
index edc948e086..8657935602 100644
--- a/modules/gdnative/android/android_gdn.cpp
+++ b/modules/gdnative/android/android_gdn.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/arvr/arvr_interface_gdnative.cpp b/modules/gdnative/arvr/arvr_interface_gdnative.cpp
index b525725107..01fbc316cf 100644
--- a/modules/gdnative/arvr/arvr_interface_gdnative.cpp
+++ b/modules/gdnative/arvr/arvr_interface_gdnative.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/arvr/arvr_interface_gdnative.h b/modules/gdnative/arvr/arvr_interface_gdnative.h
index 26d0cdf9f4..015d0c8a2a 100644
--- a/modules/gdnative/arvr/arvr_interface_gdnative.h
+++ b/modules/gdnative/arvr/arvr_interface_gdnative.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/arvr/register_types.cpp b/modules/gdnative/arvr/register_types.cpp
index d792e1b4a4..fbebccb4c1 100644
--- a/modules/gdnative/arvr/register_types.cpp
+++ b/modules/gdnative/arvr/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/arvr/register_types.h b/modules/gdnative/arvr/register_types.h
index 4c651b4f76..8fd2600037 100644
--- a/modules/gdnative/arvr/register_types.h
+++ b/modules/gdnative/arvr/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/config.py b/modules/gdnative/config.py
index 701a13d32f..a36e76287a 100644
--- a/modules/gdnative/config.py
+++ b/modules/gdnative/config.py
@@ -13,7 +13,9 @@ def get_doc_classes():
"NativeScript",
"PacketPeerGDNative",
"PluginScript",
+ "ResourceFormatLoaderVideoStreamGDNative",
"StreamPeerGDNative",
+ "VideoStreamGDNative",
]
def get_doc_path():
diff --git a/modules/gdnative/doc_classes/PluginScript.xml b/modules/gdnative/doc_classes/PluginScript.xml
index 27c6adae3f..1876d06c20 100644
--- a/modules/gdnative/doc_classes/PluginScript.xml
+++ b/modules/gdnative/doc_classes/PluginScript.xml
@@ -9,6 +9,13 @@
<demos>
</demos>
<methods>
+ <method name="new" qualifiers="vararg">
+ <return type="Object">
+ </return>
+ <description>
+ Returns a new instance of the script.
+ </description>
+ </method>
</methods>
<constants>
</constants>
diff --git a/modules/gdnative/doc_classes/ResourceFormatLoaderVideoStreamGDNative.xml b/modules/gdnative/doc_classes/ResourceFormatLoaderVideoStreamGDNative.xml
new file mode 100644
index 0000000000..61a7f60499
--- /dev/null
+++ b/modules/gdnative/doc_classes/ResourceFormatLoaderVideoStreamGDNative.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="ResourceFormatLoaderVideoStreamGDNative" inherits="ResourceFormatLoader" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/modules/gdnative/doc_classes/VideoStreamGDNative.xml b/modules/gdnative/doc_classes/VideoStreamGDNative.xml
new file mode 100644
index 0000000000..20575c768b
--- /dev/null
+++ b/modules/gdnative/doc_classes/VideoStreamGDNative.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="VideoStreamGDNative" inherits="VideoStream" category="Core" version="3.1">
+ <brief_description>
+ </brief_description>
+ <description>
+ </description>
+ <tutorials>
+ </tutorials>
+ <demos>
+ </demos>
+ <methods>
+ <method name="get_file">
+ <return type="String">
+ </return>
+ <description>
+ </description>
+ </method>
+ <method name="set_file">
+ <return type="void">
+ </return>
+ <argument index="0" name="file" type="String">
+ </argument>
+ <description>
+ </description>
+ </method>
+ </methods>
+ <constants>
+ </constants>
+</class>
diff --git a/modules/gdnative/gdnative.cpp b/modules/gdnative/gdnative.cpp
index f07fdef488..34325db9fd 100644
--- a/modules/gdnative/gdnative.cpp
+++ b/modules/gdnative/gdnative.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/gdnative.h b/modules/gdnative/gdnative.h
index c5364a72ac..492dc5beaa 100644
--- a/modules/gdnative/gdnative.h
+++ b/modules/gdnative/gdnative.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -161,6 +161,7 @@ public:
};
class GDNativeLibraryResourceLoader : public ResourceFormatLoader {
+ GDCLASS(GDNativeLibraryResourceLoader, ResourceFormatLoader)
public:
virtual RES load(const String &p_path, const String &p_original_path, Error *r_error);
virtual void get_recognized_extensions(List<String> *p_extensions) const;
@@ -169,6 +170,7 @@ public:
};
class GDNativeLibraryResourceSaver : public ResourceFormatSaver {
+ GDCLASS(GDNativeLibraryResourceSaver, ResourceFormatSaver)
public:
virtual Error save(const String &p_path, const RES &p_resource, uint32_t p_flags);
virtual bool recognize(const RES &p_resource) const;
diff --git a/modules/gdnative/gdnative/aabb.cpp b/modules/gdnative/gdnative/aabb.cpp
index 0597e1cdd6..91537290af 100644
--- a/modules/gdnative/gdnative/aabb.cpp
+++ b/modules/gdnative/gdnative/aabb.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/gdnative/array.cpp b/modules/gdnative/gdnative/array.cpp
index a30cc09bf6..18da9d811e 100644
--- a/modules/gdnative/gdnative/array.cpp
+++ b/modules/gdnative/gdnative/array.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/gdnative/basis.cpp b/modules/gdnative/gdnative/basis.cpp
index d88499ade1..4441a03ca1 100644
--- a/modules/gdnative/gdnative/basis.cpp
+++ b/modules/gdnative/gdnative/basis.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/gdnative/color.cpp b/modules/gdnative/gdnative/color.cpp
index 79f0c71b5e..e63129460c 100644
--- a/modules/gdnative/gdnative/color.cpp
+++ b/modules/gdnative/gdnative/color.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/gdnative/dictionary.cpp b/modules/gdnative/gdnative/dictionary.cpp
index 34cc91129e..a18d221a7c 100644
--- a/modules/gdnative/gdnative/dictionary.cpp
+++ b/modules/gdnative/gdnative/dictionary.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/gdnative/gdnative.cpp b/modules/gdnative/gdnative/gdnative.cpp
index 8f10f116e6..98a4fd880c 100644
--- a/modules/gdnative/gdnative/gdnative.cpp
+++ b/modules/gdnative/gdnative/gdnative.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/gdnative/node_path.cpp b/modules/gdnative/gdnative/node_path.cpp
index cf82940e09..c49899fa25 100644
--- a/modules/gdnative/gdnative/node_path.cpp
+++ b/modules/gdnative/gdnative/node_path.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/gdnative/plane.cpp b/modules/gdnative/gdnative/plane.cpp
index be821edcc3..d7fceb7516 100644
--- a/modules/gdnative/gdnative/plane.cpp
+++ b/modules/gdnative/gdnative/plane.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/gdnative/pool_arrays.cpp b/modules/gdnative/gdnative/pool_arrays.cpp
index d55d81b5b6..68e064d829 100644
--- a/modules/gdnative/gdnative/pool_arrays.cpp
+++ b/modules/gdnative/gdnative/pool_arrays.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/gdnative/quat.cpp b/modules/gdnative/gdnative/quat.cpp
index 2594759508..169d0134a8 100644
--- a/modules/gdnative/gdnative/quat.cpp
+++ b/modules/gdnative/gdnative/quat.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/gdnative/rect2.cpp b/modules/gdnative/gdnative/rect2.cpp
index 5cbc2712c3..04ca92f8dd 100644
--- a/modules/gdnative/gdnative/rect2.cpp
+++ b/modules/gdnative/gdnative/rect2.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/gdnative/rid.cpp b/modules/gdnative/gdnative/rid.cpp
index 4374738f48..c13a9fdde2 100644
--- a/modules/gdnative/gdnative/rid.cpp
+++ b/modules/gdnative/gdnative/rid.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/gdnative/string.cpp b/modules/gdnative/gdnative/string.cpp
index 0996633b70..4b8d79305c 100644
--- a/modules/gdnative/gdnative/string.cpp
+++ b/modules/gdnative/gdnative/string.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -74,7 +74,7 @@ void GDAPI godot_string_new_with_wide_string(godot_string *r_dest, const wchar_t
memnew_placement(dest, String(p_contents, p_size));
}
-wchar_t GDAPI *godot_string_operator_index(godot_string *p_self, const godot_int p_idx) {
+const wchar_t GDAPI *godot_string_operator_index(godot_string *p_self, const godot_int p_idx) {
String *self = (String *)p_self;
return &(self->operator[](p_idx));
}
diff --git a/modules/gdnative/gdnative/string_name.cpp b/modules/gdnative/gdnative/string_name.cpp
index b2a86b843c..d2862c5980 100644
--- a/modules/gdnative/gdnative/string_name.cpp
+++ b/modules/gdnative/gdnative/string_name.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/gdnative/transform.cpp b/modules/gdnative/gdnative/transform.cpp
index ee6140c7d0..188c4be1ba 100644
--- a/modules/gdnative/gdnative/transform.cpp
+++ b/modules/gdnative/gdnative/transform.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/gdnative/transform2d.cpp b/modules/gdnative/gdnative/transform2d.cpp
index fa0e15d9d2..b735f64251 100644
--- a/modules/gdnative/gdnative/transform2d.cpp
+++ b/modules/gdnative/gdnative/transform2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/gdnative/variant.cpp b/modules/gdnative/gdnative/variant.cpp
index fd6babfc3a..491abbde9e 100644
--- a/modules/gdnative/gdnative/variant.cpp
+++ b/modules/gdnative/gdnative/variant.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/gdnative/vector2.cpp b/modules/gdnative/gdnative/vector2.cpp
index c7902e06ee..8fa29580d6 100644
--- a/modules/gdnative/gdnative/vector2.cpp
+++ b/modules/gdnative/gdnative/vector2.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/gdnative/vector3.cpp b/modules/gdnative/gdnative/vector3.cpp
index a7e18fa22b..ef86c6f7e9 100644
--- a/modules/gdnative/gdnative/vector3.cpp
+++ b/modules/gdnative/gdnative/vector3.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/gdnative_api.json b/modules/gdnative/gdnative_api.json
index c5a1fa139e..7680471409 100644
--- a/modules/gdnative/gdnative_api.json
+++ b/modules/gdnative/gdnative_api.json
@@ -4755,7 +4755,7 @@
},
{
"name": "godot_string_operator_index",
- "return_type": "wchar_t *",
+ "return_type": "const wchar_t *",
"arguments": [
["godot_string *", "p_self"],
["const godot_int", "p_idx"]
@@ -6374,6 +6374,42 @@
]
}
]
+ },
+ {
+ "name": "videodecoder",
+ "type": "VIDEODECODER",
+ "version": {
+ "major": 0,
+ "minor": 1
+ },
+ "next": null,
+ "api": [
+ {
+ "name": "godot_videodecoder_file_read",
+ "return_type": "godot_int",
+ "arguments": [
+ ["void *", "file_ptr"],
+ ["uint8_t *", "buf"],
+ ["int", "buf_size"]
+ ]
+ },
+ {
+ "name": "godot_videodecoder_file_seek",
+ "return_type": "int64_t",
+ "arguments": [
+ [ "void *", "file_ptr"],
+ ["int64_t", "pos"],
+ ["int", "whence"]
+ ]
+ },
+ {
+ "name": "godot_videodecoder_register_decoder",
+ "return_type": "void",
+ "arguments": [
+ ["const godot_videodecoder_interface_gdnative *", "p_interface"]
+ ]
+ }
+ ]
}
]
}
diff --git a/modules/gdnative/gdnative_builders.py b/modules/gdnative/gdnative_builders.py
index f9d1ed9dc5..cd356ce513 100644
--- a/modules/gdnative/gdnative_builders.py
+++ b/modules/gdnative/gdnative_builders.py
@@ -46,6 +46,7 @@ def _build_gdnative_api_struct_header(api):
'#include <arvr/godot_arvr.h>',
'#include <nativescript/godot_nativescript.h>',
'#include <pluginscript/godot_pluginscript.h>',
+ '#include <videodecoder/godot_videodecoder.h>',
'',
'#define GDNATIVE_API_INIT(options) do { \\\n' + ' \\\n'.join(gdnative_api_init_macro) + ' \\\n } while (0)',
'',
@@ -87,20 +88,20 @@ def _build_gdnative_api_struct_header(api):
ret_val = []
if core['next']:
ret_val += generate_core_extension_struct(core['next'])
-
+
ret_val += [
'typedef struct godot_gdnative_core_' + ('{0}_{1}'.format(core['version']['major'], core['version']['minor'])) + '_api_struct {',
'\tunsigned int type;',
'\tgodot_gdnative_api_version version;',
'\tconst godot_gdnative_api_struct *next;',
]
-
+
for funcdef in core['api']:
args = ', '.join(['%s%s' % (_spaced(t), n) for t, n in funcdef['arguments']])
ret_val.append('\t%s(*%s)(%s);' % (_spaced(funcdef['return_type']), funcdef['name'], args))
-
+
ret_val += ['} godot_gdnative_core_' + '{0}_{1}'.format(core['version']['major'], core['version']['minor']) + '_api_struct;', '']
-
+
return ret_val
@@ -171,26 +172,26 @@ def _build_gdnative_api_struct_source(api):
ret_val += ['};\n']
return ret_val
-
-
+
+
def get_core_struct_definition(core):
ret_val = []
-
+
if core['next']:
ret_val += get_core_struct_definition(core['next'])
-
+
ret_val += [
'extern const godot_gdnative_core_' + ('{0}_{1}_api_struct api_{0}_{1}'.format(core['version']['major'], core['version']['minor'])) + ' = {',
'\tGDNATIVE_' + core['type'] + ',',
'\t{' + str(core['version']['major']) + ', ' + str(core['version']['minor']) + '},',
'\t' + ('NULL' if not core['next'] else ('(const godot_gdnative_api_struct *)& api_{0}_{1}'.format(core['version']['major'], core['version']['minor']))) + ','
]
-
+
for funcdef in core['api']:
ret_val.append('\t%s,' % funcdef['name'])
-
+
ret_val += ['};\n']
-
+
return ret_val
for ext in api['extensions']:
@@ -204,7 +205,7 @@ def _build_gdnative_api_struct_source(api):
out += ['\t(godot_gdnative_api_struct *)&api_extension_' + name + '_struct,']
out += ['};\n']
-
+
if api['core']['next']:
out += get_core_struct_definition(api['core']['next'])
@@ -244,6 +245,7 @@ def _build_gdnative_wrapper_code(api):
'#include <nativescript/godot_nativescript.h>',
'#include <pluginscript/godot_pluginscript.h>',
'#include <arvr/godot_arvr.h>',
+ '#include <videodecoder/godot_videodecoder.h>',
'',
'#include <gdnative_api_struct.gen.h>',
'',
diff --git a/modules/gdnative/gdnative_library_editor_plugin.cpp b/modules/gdnative/gdnative_library_editor_plugin.cpp
index 6424b66d1e..e2a69b1635 100644
--- a/modules/gdnative/gdnative_library_editor_plugin.cpp
+++ b/modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/gdnative_library_editor_plugin.h b/modules/gdnative/gdnative_library_editor_plugin.h
index 04d2911d8b..e7d50ba29f 100644
--- a/modules/gdnative/gdnative_library_editor_plugin.h
+++ b/modules/gdnative/gdnative_library_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/gdnative_library_singleton_editor.cpp b/modules/gdnative/gdnative_library_singleton_editor.cpp
index 0aafb95e2e..55bc16fccc 100644
--- a/modules/gdnative/gdnative_library_singleton_editor.cpp
+++ b/modules/gdnative/gdnative_library_singleton_editor.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/gdnative_library_singleton_editor.h b/modules/gdnative/gdnative_library_singleton_editor.h
index d3b5ba3846..cf5ab23501 100644
--- a/modules/gdnative/gdnative_library_singleton_editor.h
+++ b/modules/gdnative/gdnative_library_singleton_editor.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/include/android/godot_android.h b/modules/gdnative/include/android/godot_android.h
index 832dac9ac3..32e86838be 100644
--- a/modules/gdnative/include/android/godot_android.h
+++ b/modules/gdnative/include/android/godot_android.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/include/arvr/godot_arvr.h b/modules/gdnative/include/arvr/godot_arvr.h
index 63de62b507..0d14f3743f 100644
--- a/modules/gdnative/include/arvr/godot_arvr.h
+++ b/modules/gdnative/include/arvr/godot_arvr.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/include/gdnative/aabb.h b/modules/gdnative/include/gdnative/aabb.h
index dca5d4bb14..6b9b342f10 100644
--- a/modules/gdnative/include/gdnative/aabb.h
+++ b/modules/gdnative/include/gdnative/aabb.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/include/gdnative/array.h b/modules/gdnative/include/gdnative/array.h
index 876b8f8e8f..10ef8a73d2 100644
--- a/modules/gdnative/include/gdnative/array.h
+++ b/modules/gdnative/include/gdnative/array.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/include/gdnative/basis.h b/modules/gdnative/include/gdnative/basis.h
index 6128bf3ac3..9f1923c02b 100644
--- a/modules/gdnative/include/gdnative/basis.h
+++ b/modules/gdnative/include/gdnative/basis.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/include/gdnative/color.h b/modules/gdnative/include/gdnative/color.h
index 3007dbc6e3..b7837a0940 100644
--- a/modules/gdnative/include/gdnative/color.h
+++ b/modules/gdnative/include/gdnative/color.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/include/gdnative/dictionary.h b/modules/gdnative/include/gdnative/dictionary.h
index faace818ee..7703742899 100644
--- a/modules/gdnative/include/gdnative/dictionary.h
+++ b/modules/gdnative/include/gdnative/dictionary.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/include/gdnative/gdnative.h b/modules/gdnative/include/gdnative/gdnative.h
index 796ced84f4..3c457bf5a7 100644
--- a/modules/gdnative/include/gdnative/gdnative.h
+++ b/modules/gdnative/include/gdnative/gdnative.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/include/gdnative/node_path.h b/modules/gdnative/include/gdnative/node_path.h
index 48fe5b4d3d..a59833b924 100644
--- a/modules/gdnative/include/gdnative/node_path.h
+++ b/modules/gdnative/include/gdnative/node_path.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/include/gdnative/plane.h b/modules/gdnative/include/gdnative/plane.h
index 6c8a6ae1a4..074f127fa8 100644
--- a/modules/gdnative/include/gdnative/plane.h
+++ b/modules/gdnative/include/gdnative/plane.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/include/gdnative/pool_arrays.h b/modules/gdnative/include/gdnative/pool_arrays.h
index 1210039e34..96730ab085 100644
--- a/modules/gdnative/include/gdnative/pool_arrays.h
+++ b/modules/gdnative/include/gdnative/pool_arrays.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/include/gdnative/quat.h b/modules/gdnative/include/gdnative/quat.h
index 634f486e66..7239c13a36 100644
--- a/modules/gdnative/include/gdnative/quat.h
+++ b/modules/gdnative/include/gdnative/quat.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/include/gdnative/rect2.h b/modules/gdnative/include/gdnative/rect2.h
index 47c15c80bd..7652bf054f 100644
--- a/modules/gdnative/include/gdnative/rect2.h
+++ b/modules/gdnative/include/gdnative/rect2.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/include/gdnative/rid.h b/modules/gdnative/include/gdnative/rid.h
index 0942334ee5..4a61cb171f 100644
--- a/modules/gdnative/include/gdnative/rid.h
+++ b/modules/gdnative/include/gdnative/rid.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/include/gdnative/string.h b/modules/gdnative/include/gdnative/string.h
index 95ae42a9ec..f045ac9d58 100644
--- a/modules/gdnative/include/gdnative/string.h
+++ b/modules/gdnative/include/gdnative/string.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -79,7 +79,7 @@ void GDAPI godot_string_new(godot_string *r_dest);
void GDAPI godot_string_new_copy(godot_string *r_dest, const godot_string *p_src);
void GDAPI godot_string_new_with_wide_string(godot_string *r_dest, const wchar_t *p_contents, const int p_size);
-wchar_t GDAPI *godot_string_operator_index(godot_string *p_self, const godot_int p_idx);
+const wchar_t GDAPI *godot_string_operator_index(godot_string *p_self, const godot_int p_idx);
wchar_t GDAPI godot_string_operator_index_const(const godot_string *p_self, const godot_int p_idx);
const wchar_t GDAPI *godot_string_wide_str(const godot_string *p_self);
diff --git a/modules/gdnative/include/gdnative/string_name.h b/modules/gdnative/include/gdnative/string_name.h
index 5068a3d8f9..c6465aff03 100644
--- a/modules/gdnative/include/gdnative/string_name.h
+++ b/modules/gdnative/include/gdnative/string_name.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/include/gdnative/transform.h b/modules/gdnative/include/gdnative/transform.h
index 880f21c88a..e17a18cb43 100644
--- a/modules/gdnative/include/gdnative/transform.h
+++ b/modules/gdnative/include/gdnative/transform.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/include/gdnative/transform2d.h b/modules/gdnative/include/gdnative/transform2d.h
index aed941f139..e53f36a8c3 100644
--- a/modules/gdnative/include/gdnative/transform2d.h
+++ b/modules/gdnative/include/gdnative/transform2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/include/gdnative/variant.h b/modules/gdnative/include/gdnative/variant.h
index 5e71aa9f11..17afd905b4 100644
--- a/modules/gdnative/include/gdnative/variant.h
+++ b/modules/gdnative/include/gdnative/variant.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/include/gdnative/vector2.h b/modules/gdnative/include/gdnative/vector2.h
index af97524dac..9e37b8e0c6 100644
--- a/modules/gdnative/include/gdnative/vector2.h
+++ b/modules/gdnative/include/gdnative/vector2.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/include/gdnative/vector3.h b/modules/gdnative/include/gdnative/vector3.h
index e0299a8a30..61f0c6c62e 100644
--- a/modules/gdnative/include/gdnative/vector3.h
+++ b/modules/gdnative/include/gdnative/vector3.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/include/nativescript/godot_nativescript.h b/modules/gdnative/include/nativescript/godot_nativescript.h
index ba044117e2..f3b9f7fb31 100644
--- a/modules/gdnative/include/nativescript/godot_nativescript.h
+++ b/modules/gdnative/include/nativescript/godot_nativescript.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/include/net/godot_net.h b/modules/gdnative/include/net/godot_net.h
index bfa688592d..89e2771926 100644
--- a/modules/gdnative/include/net/godot_net.h
+++ b/modules/gdnative/include/net/godot_net.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/include/pluginscript/godot_pluginscript.h b/modules/gdnative/include/pluginscript/godot_pluginscript.h
index d1671c014e..968f91ae9f 100644
--- a/modules/gdnative/include/pluginscript/godot_pluginscript.h
+++ b/modules/gdnative/include/pluginscript/godot_pluginscript.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/android/dir_access_android.h b/modules/gdnative/include/videodecoder/godot_videodecoder.h
index 3ac0bd6332..360fc0f5f5 100644
--- a/platform/android/dir_access_android.h
+++ b/modules/gdnative/include/videodecoder/godot_videodecoder.h
@@ -1,5 +1,5 @@
/*************************************************************************/
-/* dir_access_android.h */
+/* godot_videodecoder.h */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
@@ -28,53 +28,48 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
-#ifndef DIR_ACCESS_ANDROID_H
-#define DIR_ACCESS_ANDROID_H
+#ifndef GODOT_NATIVEVIDEODECODER_H
+#define GODOT_NATIVEVIDEODECODER_H
-#ifdef ANDROID_NATIVE_ACTIVITY
+#include <gdnative/gdnative.h>
-#include "core/os/dir_access.h"
-#include <android/asset_manager.h>
-#include <android/log.h>
-#include <android_native_app_glue.h>
-#include <stdio.h>
-
-class DirAccessAndroid : public DirAccess {
-
- AAssetDir *aad;
- String current_dir;
- String current;
-
- static DirAccess *create_fs();
-
-public:
- virtual Error list_dir_begin(); ///< This starts dir listing
- virtual String get_next();
- virtual bool current_is_dir() const;
- virtual bool current_is_hidden() const;
- virtual void list_dir_end(); ///<
-
- virtual int get_drive_count();
- virtual String get_drive(int p_drive);
-
- virtual Error change_dir(String p_dir); ///< can be relative or absolute, return false on success
- virtual String get_current_dir(); ///< return current dir location
-
- virtual bool file_exists(String p_file);
-
- virtual Error make_dir(String p_dir);
-
- virtual Error rename(String p_from, String p_to);
- virtual Error remove(String p_name);
-
- //virtual FileType get_file_type() const;
- size_t get_space_left();
-
- static void make_default();
-
- DirAccessAndroid();
- ~DirAccessAndroid();
-};
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define GODOTAV_API_MAJOR 0
+#define GODOTAV_API_MINOR 1
+
+typedef struct
+{
+ godot_gdnative_api_version version;
+ void *next;
+ void *(*constructor)(godot_object *);
+ void (*destructor)(void *);
+ const char *(*get_plugin_name)(void);
+ const char **(*get_supported_extensions)(int *count);
+ godot_bool (*open_file)(void *, void *); // data struct, and a FileAccess pointer
+ godot_real (*get_length)(const void *);
+ godot_real (*get_playback_position)(const void *);
+ void (*seek)(void *, godot_real);
+ void (*set_audio_track)(void *, godot_int);
+ void (*update)(void *, godot_real);
+ godot_pool_byte_array *(*get_videoframe)(void *);
+ godot_int (*get_audioframe)(void *, float *, int);
+ godot_int (*get_channels)(const void *);
+ godot_int (*get_mix_rate)(const void *);
+ godot_vector2 (*get_texture_size)(const void *);
+} godot_videodecoder_interface_gdnative;
+
+typedef int (*GDNativeAudioMixCallback)(void *, const float *, int);
+
+// FileAccess wrappers for custom FFmpeg IO
+godot_int GDAPI godot_videodecoder_file_read(void *file_ptr, uint8_t *buf, int buf_size);
+int64_t GDAPI godot_videodecoder_file_seek(void *file_ptr, int64_t pos, int whence);
+void GDAPI godot_videodecoder_register_decoder(const godot_videodecoder_interface_gdnative *p_interface);
+
+#ifdef __cplusplus
+}
#endif
-#endif // DIR_ACCESS_ANDROID_H
+
+#endif /* GODOT_NATIVEVIDEODECODER_H */
diff --git a/modules/gdnative/nativescript/api_generator.cpp b/modules/gdnative/nativescript/api_generator.cpp
index 8c6dace847..b99c5d31ab 100644
--- a/modules/gdnative/nativescript/api_generator.cpp
+++ b/modules/gdnative/nativescript/api_generator.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/nativescript/api_generator.h b/modules/gdnative/nativescript/api_generator.h
index de234b2f0d..73310d1974 100644
--- a/modules/gdnative/nativescript/api_generator.h
+++ b/modules/gdnative/nativescript/api_generator.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/nativescript/godot_nativescript.cpp b/modules/gdnative/nativescript/godot_nativescript.cpp
index c39efe126f..863999d6d4 100644
--- a/modules/gdnative/nativescript/godot_nativescript.cpp
+++ b/modules/gdnative/nativescript/godot_nativescript.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/nativescript/nativescript.cpp b/modules/gdnative/nativescript/nativescript.cpp
index eb133502c4..0370060937 100644
--- a/modules/gdnative/nativescript/nativescript.cpp
+++ b/modules/gdnative/nativescript/nativescript.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -294,6 +294,10 @@ MethodInfo NativeScript::get_method_info(const StringName &p_method) const {
return MethodInfo();
}
+bool NativeScript::is_valid() const {
+ return true;
+}
+
bool NativeScript::is_tool() const {
NativeScriptDesc *script_data = get_script_desc();
diff --git a/modules/gdnative/nativescript/nativescript.h b/modules/gdnative/nativescript/nativescript.h
index 51370f5fbf..8dd5ba3b9c 100644
--- a/modules/gdnative/nativescript/nativescript.h
+++ b/modules/gdnative/nativescript/nativescript.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -160,6 +160,7 @@ public:
virtual MethodInfo get_method_info(const StringName &p_method) const;
virtual bool is_tool() const;
+ virtual bool is_valid() const;
virtual ScriptLanguage *get_language() const;
@@ -379,6 +380,7 @@ public:
};
class ResourceFormatLoaderNativeScript : public ResourceFormatLoader {
+ GDCLASS(ResourceFormatLoaderNativeScript, ResourceFormatLoader)
public:
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
virtual void get_recognized_extensions(List<String> *p_extensions) const;
@@ -387,6 +389,7 @@ public:
};
class ResourceFormatSaverNativeScript : public ResourceFormatSaver {
+ GDCLASS(ResourceFormatSaverNativeScript, ResourceFormatSaver)
virtual Error save(const String &p_path, const RES &p_resource, uint32_t p_flags = 0);
virtual bool recognize(const RES &p_resource) const;
virtual void get_recognized_extensions(const RES &p_resource, List<String> *p_extensions) const;
diff --git a/modules/gdnative/nativescript/register_types.cpp b/modules/gdnative/nativescript/register_types.cpp
index 4433c0a638..c602b80646 100644
--- a/modules/gdnative/nativescript/register_types.cpp
+++ b/modules/gdnative/nativescript/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -39,8 +39,8 @@
NativeScriptLanguage *native_script_language;
-ResourceFormatLoaderNativeScript *resource_loader_gdns = NULL;
-ResourceFormatSaverNativeScript *resource_saver_gdns = NULL;
+Ref<ResourceFormatLoaderNativeScript> resource_loader_gdns;
+Ref<ResourceFormatSaverNativeScript> resource_saver_gdns;
void register_nativescript_types() {
native_script_language = memnew(NativeScriptLanguage);
@@ -50,18 +50,20 @@ void register_nativescript_types() {
native_script_language->set_language_index(ScriptServer::get_language_count());
ScriptServer::register_language(native_script_language);
- resource_saver_gdns = memnew(ResourceFormatSaverNativeScript);
+ resource_saver_gdns.instance();
ResourceSaver::add_resource_format_saver(resource_saver_gdns);
- resource_loader_gdns = memnew(ResourceFormatLoaderNativeScript);
+ resource_loader_gdns.instance();
ResourceLoader::add_resource_format_loader(resource_loader_gdns);
}
void unregister_nativescript_types() {
- memdelete(resource_loader_gdns);
+ ResourceLoader::remove_resource_format_loader(resource_loader_gdns);
+ resource_loader_gdns.unref();
- memdelete(resource_saver_gdns);
+ ResourceSaver::remove_resource_format_saver(resource_saver_gdns);
+ resource_saver_gdns.unref();
if (native_script_language) {
ScriptServer::unregister_language(native_script_language);
diff --git a/modules/gdnative/nativescript/register_types.h b/modules/gdnative/nativescript/register_types.h
index 7389010f8e..3d2ce4c431 100644
--- a/modules/gdnative/nativescript/register_types.h
+++ b/modules/gdnative/nativescript/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/net/multiplayer_peer_gdnative.cpp b/modules/gdnative/net/multiplayer_peer_gdnative.cpp
index e2d710b5ad..2466838357 100644
--- a/modules/gdnative/net/multiplayer_peer_gdnative.cpp
+++ b/modules/gdnative/net/multiplayer_peer_gdnative.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/net/multiplayer_peer_gdnative.h b/modules/gdnative/net/multiplayer_peer_gdnative.h
index c8c95b3dd7..7d48dc60d1 100644
--- a/modules/gdnative/net/multiplayer_peer_gdnative.h
+++ b/modules/gdnative/net/multiplayer_peer_gdnative.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/net/packet_peer_gdnative.cpp b/modules/gdnative/net/packet_peer_gdnative.cpp
index ceae79edc0..9adfd841b2 100644
--- a/modules/gdnative/net/packet_peer_gdnative.cpp
+++ b/modules/gdnative/net/packet_peer_gdnative.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/net/packet_peer_gdnative.h b/modules/gdnative/net/packet_peer_gdnative.h
index 71814177ed..742fa4e7d5 100644
--- a/modules/gdnative/net/packet_peer_gdnative.h
+++ b/modules/gdnative/net/packet_peer_gdnative.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/net/register_types.cpp b/modules/gdnative/net/register_types.cpp
index c3fb4d8008..51448bfcd3 100644
--- a/modules/gdnative/net/register_types.cpp
+++ b/modules/gdnative/net/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/net/register_types.h b/modules/gdnative/net/register_types.h
index 9545a2ba8f..4f5b0051b7 100644
--- a/modules/gdnative/net/register_types.h
+++ b/modules/gdnative/net/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/net/stream_peer_gdnative.cpp b/modules/gdnative/net/stream_peer_gdnative.cpp
index 4d1f2ec9a5..1b141fa2e6 100644
--- a/modules/gdnative/net/stream_peer_gdnative.cpp
+++ b/modules/gdnative/net/stream_peer_gdnative.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/net/stream_peer_gdnative.h b/modules/gdnative/net/stream_peer_gdnative.h
index 654234e6ab..f39fdbb1d3 100644
--- a/modules/gdnative/net/stream_peer_gdnative.h
+++ b/modules/gdnative/net/stream_peer_gdnative.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/pluginscript/pluginscript_instance.cpp b/modules/gdnative/pluginscript/pluginscript_instance.cpp
index 13026e8e7a..4b5dcc2c11 100644
--- a/modules/gdnative/pluginscript/pluginscript_instance.cpp
+++ b/modules/gdnative/pluginscript/pluginscript_instance.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/pluginscript/pluginscript_instance.h b/modules/gdnative/pluginscript/pluginscript_instance.h
index 8be6a4ccaa..b279fdad8b 100644
--- a/modules/gdnative/pluginscript/pluginscript_instance.h
+++ b/modules/gdnative/pluginscript/pluginscript_instance.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/pluginscript/pluginscript_language.cpp b/modules/gdnative/pluginscript/pluginscript_language.cpp
index 2b538c4a36..ca1dd66a13 100644
--- a/modules/gdnative/pluginscript/pluginscript_language.cpp
+++ b/modules/gdnative/pluginscript/pluginscript_language.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -417,8 +417,8 @@ void PluginScriptLanguage::unlock() {
PluginScriptLanguage::PluginScriptLanguage(const godot_pluginscript_language_desc *desc) :
_desc(*desc) {
- _resource_loader = memnew(ResourceFormatLoaderPluginScript(this));
- _resource_saver = memnew(ResourceFormatSaverPluginScript(this));
+ _resource_loader = Ref<ResourceFormatLoaderPluginScript>(memnew(ResourceFormatLoaderPluginScript(this)));
+ _resource_saver = Ref<ResourceFormatSaverPluginScript>(memnew(ResourceFormatSaverPluginScript(this)));
// TODO: totally remove _lock attribute if NO_THREADS is set
#ifdef NO_THREADS
@@ -429,8 +429,6 @@ PluginScriptLanguage::PluginScriptLanguage(const godot_pluginscript_language_des
}
PluginScriptLanguage::~PluginScriptLanguage() {
- memdelete(_resource_loader);
- memdelete(_resource_saver);
#ifndef NO_THREADS
if (_lock) {
memdelete(_lock);
diff --git a/modules/gdnative/pluginscript/pluginscript_language.h b/modules/gdnative/pluginscript/pluginscript_language.h
index c4df6f3a33..991be0bf12 100644
--- a/modules/gdnative/pluginscript/pluginscript_language.h
+++ b/modules/gdnative/pluginscript/pluginscript_language.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -48,8 +48,8 @@ class PluginScriptLanguage : public ScriptLanguage {
friend class PluginScript;
friend class PluginScriptInstance;
- ResourceFormatLoaderPluginScript *_resource_loader;
- ResourceFormatSaverPluginScript *_resource_saver;
+ Ref<ResourceFormatLoaderPluginScript> _resource_loader;
+ Ref<ResourceFormatSaverPluginScript> _resource_saver;
const godot_pluginscript_language_desc _desc;
godot_pluginscript_language_data *_data;
@@ -59,8 +59,8 @@ class PluginScriptLanguage : public ScriptLanguage {
public:
virtual String get_name() const;
- _FORCE_INLINE_ ResourceFormatLoaderPluginScript *get_resource_loader() { return _resource_loader; };
- _FORCE_INLINE_ ResourceFormatSaverPluginScript *get_resource_saver() { return _resource_saver; };
+ _FORCE_INLINE_ Ref<ResourceFormatLoaderPluginScript> get_resource_loader() { return _resource_loader; }
+ _FORCE_INLINE_ Ref<ResourceFormatSaverPluginScript> get_resource_saver() { return _resource_saver; }
/* LANGUAGE FUNCTIONS */
virtual void init();
diff --git a/modules/gdnative/pluginscript/pluginscript_loader.cpp b/modules/gdnative/pluginscript/pluginscript_loader.cpp
index 52d5b2b595..c7ff8518b5 100644
--- a/modules/gdnative/pluginscript/pluginscript_loader.cpp
+++ b/modules/gdnative/pluginscript/pluginscript_loader.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/pluginscript/pluginscript_loader.h b/modules/gdnative/pluginscript/pluginscript_loader.h
index 5c17bb932e..69a2ac6bfe 100644
--- a/modules/gdnative/pluginscript/pluginscript_loader.h
+++ b/modules/gdnative/pluginscript/pluginscript_loader.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -39,6 +39,9 @@
class PluginScriptLanguage;
class ResourceFormatLoaderPluginScript : public ResourceFormatLoader {
+
+ GDCLASS(ResourceFormatLoaderPluginScript, ResourceFormatLoader)
+
PluginScriptLanguage *_language;
public:
@@ -50,6 +53,9 @@ public:
};
class ResourceFormatSaverPluginScript : public ResourceFormatSaver {
+
+ GDCLASS(ResourceFormatSaverPluginScript, ResourceFormatSaver)
+
PluginScriptLanguage *_language;
public:
diff --git a/modules/gdnative/pluginscript/pluginscript_script.cpp b/modules/gdnative/pluginscript/pluginscript_script.cpp
index c3a623e9a1..3450a032c5 100644
--- a/modules/gdnative/pluginscript/pluginscript_script.cpp
+++ b/modules/gdnative/pluginscript/pluginscript_script.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -52,6 +52,79 @@
#endif
void PluginScript::_bind_methods() {
+ ClassDB::bind_vararg_method(METHOD_FLAGS_DEFAULT, "new", &PluginScript::_new, MethodInfo(Variant::OBJECT, "new"));
+}
+
+PluginScriptInstance *PluginScript::_create_instance(const Variant **p_args, int p_argcount, Object *p_owner, Variant::CallError &r_error) {
+
+ r_error.error = Variant::CallError::CALL_OK;
+
+ // Create instance
+ PluginScriptInstance *instance = memnew(PluginScriptInstance());
+
+ if (instance->init(this, p_owner)) {
+ _language->lock();
+ _instances.insert(instance->get_owner());
+ _language->unlock();
+ } else {
+ r_error.error = Variant::CallError::CALL_ERROR_INSTANCE_IS_NULL;
+ memdelete(instance);
+ ERR_FAIL_V(NULL);
+ }
+
+ // Construct
+ // TODO: Support arguments in the constructor?
+ // There is currently no way to get the constructor function name of the script.
+ // instance->call("__init__", p_args, p_argcount, r_error);
+ if (p_argcount > 0) {
+ WARN_PRINT("PluginScript doesn't support arguments in the constructor")
+ }
+
+ return instance;
+}
+
+Variant PluginScript::_new(const Variant **p_args, int p_argcount, Variant::CallError &r_error) {
+
+ r_error.error = Variant::CallError::CALL_OK;
+
+ if (!_valid) {
+ r_error.error = Variant::CallError::CALL_ERROR_INVALID_METHOD;
+ return Variant();
+ }
+
+ REF ref;
+ Object *owner = NULL;
+
+ if (get_instance_base_type() == "") {
+ owner = memnew(Reference);
+ } else {
+ owner = ClassDB::instance(get_instance_base_type());
+ }
+
+ if (!owner) {
+ r_error.error = Variant::CallError::CALL_ERROR_INSTANCE_IS_NULL;
+ return Variant();
+ }
+
+ Reference *r = Object::cast_to<Reference>(owner);
+ if (r) {
+ ref = REF(r);
+ }
+
+ PluginScriptInstance *instance = _create_instance(p_args, p_argcount, owner, r_error);
+
+ if (!instance) {
+ if (ref.is_null()) {
+ memdelete(owner); //no owner, sorry
+ }
+ return Variant();
+ }
+
+ if (ref.is_valid()) {
+ return ref;
+ } else {
+ return owner;
+ }
}
#ifdef TOOLS_ENABLED
@@ -129,17 +202,8 @@ ScriptInstance *PluginScript::instance_create(Object *p_this) {
}
}
- PluginScriptInstance *instance = memnew(PluginScriptInstance());
- const bool success = instance->init(this, p_this);
- if (success) {
- _language->lock();
- _instances.insert(instance->get_owner());
- _language->unlock();
- return instance;
- } else {
- memdelete(instance);
- ERR_FAIL_V(NULL);
- }
+ Variant::CallError unchecked_error;
+ return _create_instance(NULL, 0, p_this, unchecked_error);
}
bool PluginScript::instance_has(const Object *p_this) const {
diff --git a/modules/gdnative/pluginscript/pluginscript_script.h b/modules/gdnative/pluginscript/pluginscript_script.h
index 31c6c4d67f..0a84ccba0d 100644
--- a/modules/gdnative/pluginscript/pluginscript_script.h
+++ b/modules/gdnative/pluginscript/pluginscript_script.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -37,8 +37,6 @@
#include "pluginscript_language.h"
#include <pluginscript/godot_pluginscript.h>
-class PyInstance;
-
class PluginScript : public Script {
GDCLASS(PluginScript, Script);
@@ -74,6 +72,9 @@ private:
protected:
static void _bind_methods();
+ PluginScriptInstance *_create_instance(const Variant **p_args, int p_argcount, Object *p_owner, Variant::CallError &r_error);
+ Variant _new(const Variant **p_args, int p_argcount, Variant::CallError &r_error);
+
#ifdef TOOLS_ENABLED
Set<PlaceHolderScriptInstance *> placeholders;
//void _update_placeholder(PlaceHolderScriptInstance *p_placeholder);
@@ -102,6 +103,7 @@ public:
PropertyInfo get_property_info(const StringName &p_property) const;
bool is_tool() const { return _tool; }
+ bool is_valid() const { return true; }
virtual ScriptLanguage *get_language() const;
diff --git a/modules/gdnative/pluginscript/register_types.cpp b/modules/gdnative/pluginscript/register_types.cpp
index e677bc9867..b7ab887e11 100644
--- a/modules/gdnative/pluginscript/register_types.cpp
+++ b/modules/gdnative/pluginscript/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/pluginscript/register_types.h b/modules/gdnative/pluginscript/register_types.h
index 76651aa986..3114fb6b7d 100644
--- a/modules/gdnative/pluginscript/register_types.h
+++ b/modules/gdnative/pluginscript/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/register_types.cpp b/modules/gdnative/register_types.cpp
index 62e87c3651..b38de75caa 100644
--- a/modules/gdnative/register_types.cpp
+++ b/modules/gdnative/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -38,6 +38,7 @@
#include "nativescript/register_types.h"
#include "net/register_types.h"
#include "pluginscript/register_types.h"
+#include "videodecoder/register_types.h"
#include "core/engine.h"
#include "core/io/resource_loader.h"
@@ -299,8 +300,8 @@ GDNativeCallRegistry *GDNativeCallRegistry::singleton;
Vector<Ref<GDNative> > singleton_gdnatives;
-GDNativeLibraryResourceLoader *resource_loader_gdnlib = NULL;
-GDNativeLibraryResourceSaver *resource_saver_gdnlib = NULL;
+Ref<GDNativeLibraryResourceLoader> resource_loader_gdnlib;
+Ref<GDNativeLibraryResourceSaver> resource_saver_gdnlib;
void register_gdnative_types() {
@@ -312,10 +313,10 @@ void register_gdnative_types() {
ClassDB::register_class<GDNativeLibrary>();
ClassDB::register_class<GDNative>();
- resource_loader_gdnlib = memnew(GDNativeLibraryResourceLoader);
- resource_saver_gdnlib = memnew(GDNativeLibraryResourceSaver);
-
+ resource_loader_gdnlib.instance();
ResourceLoader::add_resource_format_loader(resource_loader_gdnlib);
+
+ resource_saver_gdnlib.instance();
ResourceSaver::add_resource_format_saver(resource_saver_gdnlib);
GDNativeCallRegistry::singleton = memnew(GDNativeCallRegistry);
@@ -326,6 +327,7 @@ void register_gdnative_types() {
register_arvr_types();
register_nativescript_types();
register_pluginscript_types();
+ register_videodecoder_types();
// run singletons
@@ -378,6 +380,7 @@ void unregister_gdnative_types() {
}
singleton_gdnatives.clear();
+ unregister_videodecoder_types();
unregister_pluginscript_types();
unregister_nativescript_types();
unregister_arvr_types();
@@ -391,8 +394,11 @@ void unregister_gdnative_types() {
}
#endif
- memdelete(resource_loader_gdnlib);
- memdelete(resource_saver_gdnlib);
+ ResourceLoader::remove_resource_format_loader(resource_loader_gdnlib);
+ resource_loader_gdnlib.unref();
+
+ ResourceSaver::remove_resource_format_saver(resource_saver_gdnlib);
+ resource_saver_gdnlib.unref();
// This is for printing out the sizes of the core types
diff --git a/modules/gdnative/register_types.h b/modules/gdnative/register_types.h
index 4549687f55..9e5cab5581 100644
--- a/modules/gdnative/register_types.h
+++ b/modules/gdnative/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdnative/videodecoder/SCsub b/modules/gdnative/videodecoder/SCsub
new file mode 100644
index 0000000000..8d9c1ff50e
--- /dev/null
+++ b/modules/gdnative/videodecoder/SCsub
@@ -0,0 +1,9 @@
+#!/usr/bin/env python
+
+Import('env')
+Import('env_modules')
+
+env_vsdecoder_gdnative = env_modules.Clone()
+
+env_vsdecoder_gdnative.Append(CPPPATH=['#modules/gdnative/include/'])
+env_vsdecoder_gdnative.add_source_files(env.modules_sources, '*.cpp')
diff --git a/main/tests/test_io.h b/modules/gdnative/videodecoder/register_types.cpp
index ffebd05160..ea78cb1970 100644
--- a/main/tests/test_io.h
+++ b/modules/gdnative/videodecoder/register_types.cpp
@@ -1,5 +1,5 @@
/*************************************************************************/
-/* test_io.h */
+/* register_types.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
@@ -28,18 +28,23 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
-#ifndef TEST_IO_H
-#define TEST_IO_H
+#include "register_types.h"
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
+#include "core/class_db.h"
+#include "video_stream_gdnative.h"
-#include "core/os/main_loop.h"
+static Ref<ResourceFormatLoaderVideoStreamGDNative> resource_loader_vsgdnative;
-namespace TestIO {
+void register_videodecoder_types() {
-MainLoop *test();
+ resource_loader_vsgdnative.instance();
+ ResourceLoader::add_resource_format_loader(resource_loader_vsgdnative, true);
+
+ ClassDB::register_class<VideoStreamGDNative>();
}
-#endif
+void unregister_videodecoder_types() {
+
+ ResourceLoader::remove_resource_format_loader(resource_loader_vsgdnative);
+ resource_loader_vsgdnative.unref();
+}
diff --git a/platform/android/globals/global_defaults.h b/modules/gdnative/videodecoder/register_types.h
index 99da2dd527..dd1943fc47 100644
--- a/platform/android/globals/global_defaults.h
+++ b/modules/gdnative/videodecoder/register_types.h
@@ -1,5 +1,5 @@
/*************************************************************************/
-/* global_defaults.h */
+/* register_types.h */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
@@ -28,4 +28,5 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
-void register_android_global_defaults();
+void register_videodecoder_types();
+void unregister_videodecoder_types();
diff --git a/modules/gdnative/videodecoder/video_stream_gdnative.cpp b/modules/gdnative/videodecoder/video_stream_gdnative.cpp
new file mode 100644
index 0000000000..a1590cef43
--- /dev/null
+++ b/modules/gdnative/videodecoder/video_stream_gdnative.cpp
@@ -0,0 +1,387 @@
+/*************************************************************************/
+/* video_stream_gdnative.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#include "video_stream_gdnative.h"
+
+#include "core/project_settings.h"
+#include "servers/audio_server.h"
+
+VideoDecoderServer *VideoDecoderServer::instance = NULL;
+
+static VideoDecoderServer decoder_server;
+
+const int AUX_BUFFER_SIZE = 1024; // Buffer 1024 samples.
+
+// NOTE: Callbacks for the GDNative libraries.
+extern "C" {
+godot_int GDAPI godot_videodecoder_file_read(void *ptr, uint8_t *buf, int buf_size) {
+ // ptr is a FileAccess
+ FileAccess *file = reinterpret_cast<FileAccess *>(ptr);
+
+ // if file exists
+ if (file) {
+ long bytes_read = file->get_buffer(buf, buf_size);
+ // No bytes to read => EOF
+ if (bytes_read == 0) {
+ return 0;
+ }
+ return bytes_read;
+ }
+ return -1;
+}
+
+int64_t GDAPI godot_videodecoder_file_seek(void *ptr, int64_t pos, int whence) {
+ // file
+ FileAccess *file = reinterpret_cast<FileAccess *>(ptr);
+
+ size_t len = file->get_len();
+ if (file) {
+ switch (whence) {
+ case SEEK_SET: {
+ // Just for explicitness
+ size_t new_pos = static_cast<size_t>(pos);
+ if (new_pos > len) {
+ return -1;
+ }
+ file->seek(new_pos);
+ pos = static_cast<int64_t>(file->get_position());
+ return pos;
+ } break;
+ case SEEK_CUR: {
+ // Just in case it doesn't exist
+ if (pos < 0 && -pos > file->get_position()) {
+ return -1;
+ }
+ pos = pos + static_cast<int>(file->get_position());
+ file->seek(pos);
+ pos = static_cast<int64_t>(file->get_position());
+ return pos;
+ } break;
+ case SEEK_END: {
+ // Just in case something goes wrong
+ if (-pos > len) {
+ return -1;
+ }
+ file->seek_end(pos);
+ pos = static_cast<int64_t>(file->get_position());
+ return pos;
+ } break;
+ default: {
+ // Only 4 possible options, hence default = AVSEEK_SIZE
+ // Asks to return the length of file
+ return static_cast<int64_t>(len);
+ } break;
+ }
+ }
+ // In case nothing works out.
+ return -1;
+}
+
+void GDAPI godot_videodecoder_register_decoder(const godot_videodecoder_interface_gdnative *p_interface) {
+
+ decoder_server.register_decoder_interface(p_interface);
+}
+}
+
+// VideoStreamPlaybackGDNative starts here.
+
+bool VideoStreamPlaybackGDNative::open_file(const String &p_file) {
+ ERR_FAIL_COND_V(interface == NULL, false);
+ file = FileAccess::open(p_file, FileAccess::READ);
+ bool file_opened = interface->open_file(data_struct, file);
+
+ num_channels = interface->get_channels(data_struct);
+ mix_rate = interface->get_mix_rate(data_struct);
+
+ godot_vector2 vec = interface->get_texture_size(data_struct);
+ texture_size = *(Vector2 *)&vec;
+
+ pcm = (float *)memalloc(num_channels * AUX_BUFFER_SIZE * sizeof(float));
+ memset(pcm, 0, num_channels * AUX_BUFFER_SIZE * sizeof(float));
+ pcm_write_idx = -1;
+ samples_decoded = 0;
+
+ texture->create((int)texture_size.width, (int)texture_size.height, Image::FORMAT_RGBA8, Texture::FLAG_FILTER | Texture::FLAG_VIDEO_SURFACE);
+
+ return file_opened;
+}
+
+void VideoStreamPlaybackGDNative::update(float p_delta) {
+ if (!playing || paused) {
+ return;
+ }
+ if (!file) {
+ return;
+ }
+ time += p_delta;
+ ERR_FAIL_COND(interface == NULL);
+ interface->update(data_struct, p_delta);
+
+ if (pcm_write_idx >= 0) {
+ // Previous remains
+ int mixed = mix_callback(mix_udata, pcm, samples_decoded);
+ if (mixed == samples_decoded) {
+ pcm_write_idx = -1;
+ } else {
+ samples_decoded -= mixed;
+ pcm_write_idx += mixed;
+ }
+ }
+ if (pcm_write_idx < 0) {
+ samples_decoded = interface->get_audioframe(data_struct, pcm, AUX_BUFFER_SIZE);
+ pcm_write_idx = mix_callback(mix_udata, pcm, samples_decoded);
+ if (pcm_write_idx == samples_decoded) {
+ pcm_write_idx = -1;
+ } else {
+ samples_decoded -= pcm_write_idx;
+ }
+ }
+
+ while (interface->get_playback_position(data_struct) < time && playing) {
+
+ update_texture();
+ }
+}
+
+void VideoStreamPlaybackGDNative::update_texture() {
+ PoolByteArray *pba = (PoolByteArray *)interface->get_videoframe(data_struct);
+
+ if (pba == NULL) {
+ playing = false;
+ return;
+ }
+
+ Ref<Image> img = memnew(Image(texture_size.width, texture_size.height, 0, Image::FORMAT_RGBA8, *pba));
+
+ texture->set_data(img);
+}
+
+// ctor and dtor
+
+VideoStreamPlaybackGDNative::VideoStreamPlaybackGDNative() :
+ texture(Ref<ImageTexture>(memnew(ImageTexture))),
+ playing(false),
+ paused(false),
+ mix_udata(NULL),
+ mix_callback(NULL),
+ num_channels(-1),
+ time(0),
+ mix_rate(0),
+ delay_compensation(0),
+ pcm(NULL),
+ pcm_write_idx(0),
+ samples_decoded(0),
+ file(NULL),
+ interface(NULL),
+ data_struct(NULL) {}
+
+VideoStreamPlaybackGDNative::~VideoStreamPlaybackGDNative() {
+ cleanup();
+}
+
+void VideoStreamPlaybackGDNative::cleanup() {
+ if (data_struct)
+ interface->destructor(data_struct);
+ if (pcm)
+ memfree(pcm);
+ pcm = NULL;
+ time = 0;
+ num_channels = -1;
+ interface = NULL;
+ data_struct = NULL;
+}
+
+void VideoStreamPlaybackGDNative::set_interface(const godot_videodecoder_interface_gdnative *p_interface) {
+ ERR_FAIL_COND(p_interface == NULL);
+ if (interface != NULL) {
+ cleanup();
+ }
+ interface = p_interface;
+ data_struct = interface->constructor((godot_object *)this);
+}
+
+// controls
+
+bool VideoStreamPlaybackGDNative::is_playing() const {
+ return playing;
+}
+
+bool VideoStreamPlaybackGDNative::is_paused() const {
+ return paused;
+}
+
+void VideoStreamPlaybackGDNative::play() {
+
+ stop();
+
+ playing = true;
+
+ delay_compensation = ProjectSettings::get_singleton()->get("audio/video_delay_compensation_ms");
+ delay_compensation /= 1000.0;
+}
+
+void VideoStreamPlaybackGDNative::stop() {
+ if (playing) {
+ seek(0);
+ }
+ playing = false;
+}
+
+void VideoStreamPlaybackGDNative::seek(float p_time) {
+ ERR_FAIL_COND(interface == NULL);
+ interface->seek(data_struct, p_time);
+}
+
+void VideoStreamPlaybackGDNative::set_paused(bool p_paused) {
+ paused = p_paused;
+}
+
+Ref<Texture> VideoStreamPlaybackGDNative::get_texture() {
+ return texture;
+}
+
+float VideoStreamPlaybackGDNative::get_length() const {
+ ERR_FAIL_COND_V(interface == NULL, 0);
+ return interface->get_length(data_struct);
+}
+
+float VideoStreamPlaybackGDNative::get_playback_position() const {
+
+ ERR_FAIL_COND_V(interface == NULL, 0);
+ return interface->get_playback_position(data_struct);
+}
+
+bool VideoStreamPlaybackGDNative::has_loop() const {
+ // TODO: Implement looping?
+ return false;
+}
+
+void VideoStreamPlaybackGDNative::set_loop(bool p_enable) {
+ // Do nothing
+}
+
+void VideoStreamPlaybackGDNative::set_audio_track(int p_idx) {
+ ERR_FAIL_COND(interface == NULL);
+ interface->set_audio_track(data_struct, p_idx);
+}
+
+void VideoStreamPlaybackGDNative::set_mix_callback(AudioMixCallback p_callback, void *p_userdata) {
+
+ mix_udata = p_userdata;
+ mix_callback = p_callback;
+}
+
+int VideoStreamPlaybackGDNative::get_channels() const {
+ ERR_FAIL_COND_V(interface == NULL, 0);
+
+ return (num_channels > 0) ? num_channels : 0;
+}
+
+int VideoStreamPlaybackGDNative::get_mix_rate() const {
+ ERR_FAIL_COND_V(interface == NULL, 0);
+
+ return mix_rate;
+}
+
+/* --- NOTE VideoStreamGDNative starts here. ----- */
+
+Ref<VideoStreamPlayback> VideoStreamGDNative::instance_playback() {
+ Ref<VideoStreamPlaybackGDNative> pb = memnew(VideoStreamPlaybackGDNative);
+ VideoDecoderGDNative *decoder = decoder_server.get_decoder(file.get_extension().to_lower());
+ if (decoder == NULL)
+ return NULL;
+ pb->set_interface(decoder->interface);
+ pb->set_audio_track(audio_track);
+ if (pb->open_file(file))
+ return pb;
+ return NULL;
+}
+
+void VideoStreamGDNative::set_file(const String &p_file) {
+
+ file = p_file;
+}
+
+String VideoStreamGDNative::get_file() {
+
+ return file;
+}
+
+void VideoStreamGDNative::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("set_file", "file"), &VideoStreamGDNative::set_file);
+ ClassDB::bind_method(D_METHOD("get_file"), &VideoStreamGDNative::get_file);
+
+ ADD_PROPERTY(PropertyInfo(Variant::STRING, "file", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL), "set_file", "get_file");
+}
+
+void VideoStreamGDNative::set_audio_track(int p_track) {
+
+ audio_track = p_track;
+}
+
+/* --- NOTE ResourceFormatLoaderVideoStreamGDNative starts here. ----- */
+
+RES ResourceFormatLoaderVideoStreamGDNative::load(const String &p_path, const String &p_original_path, Error *r_error) {
+ FileAccess *f = FileAccess::open(p_path, FileAccess::READ);
+ if (!f) {
+ if (r_error) {
+ *r_error = ERR_CANT_OPEN;
+ }
+ memdelete(f);
+ return RES();
+ }
+ VideoStreamGDNative *stream = memnew(VideoStreamGDNative);
+ stream->set_file(p_path);
+ Ref<VideoStreamGDNative> ogv_stream = Ref<VideoStreamGDNative>(stream);
+ if (r_error) {
+ *r_error = OK;
+ }
+ return ogv_stream;
+}
+
+void ResourceFormatLoaderVideoStreamGDNative::get_recognized_extensions(List<String> *p_extensions) const {
+ Map<String, int>::Element *el = VideoDecoderServer::get_instance()->get_extensions().front();
+ while (el) {
+ p_extensions->push_back(el->key());
+ el = el->next();
+ }
+}
+
+bool ResourceFormatLoaderVideoStreamGDNative::handles_type(const String &p_type) const {
+ return ClassDB::is_parent_class(p_type, "VideoStream");
+}
+
+String ResourceFormatLoaderVideoStreamGDNative::get_resource_type(const String &p_path) const {
+ String el = p_path.get_extension().to_lower();
+ if (VideoDecoderServer::get_instance()->get_extensions().has(el))
+ return "VideoStreamGDNative";
+ return "";
+}
diff --git a/modules/gdnative/videodecoder/video_stream_gdnative.h b/modules/gdnative/videodecoder/video_stream_gdnative.h
new file mode 100644
index 0000000000..f9dec46b72
--- /dev/null
+++ b/modules/gdnative/videodecoder/video_stream_gdnative.h
@@ -0,0 +1,208 @@
+/*************************************************************************/
+/* video_stream_gdnative.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
+#ifndef VIDEO_STREAM_GDNATIVE_H
+#define VIDEO_STREAM_GDNATIVE_H
+
+#include "../gdnative.h"
+#include "core/os/file_access.h"
+#include "scene/resources/texture.h"
+#include "scene/resources/video_stream.h"
+
+struct VideoDecoderGDNative {
+ const godot_videodecoder_interface_gdnative *interface;
+ String plugin_name;
+ Vector<String> supported_extensions;
+
+ VideoDecoderGDNative() :
+ interface(NULL),
+ plugin_name("none") {}
+
+ VideoDecoderGDNative(const godot_videodecoder_interface_gdnative *p_interface) :
+ interface(p_interface),
+ plugin_name(p_interface->get_plugin_name()) {
+ _get_supported_extensions();
+ }
+
+private:
+ void _get_supported_extensions() {
+ supported_extensions.clear();
+ int num_ext;
+ const char **supported_ext = interface->get_supported_extensions(&num_ext);
+ for (int i = 0; i < num_ext; i++) {
+ supported_extensions.push_back(supported_ext[i]);
+ }
+ }
+};
+
+class VideoDecoderServer {
+private:
+ Vector<VideoDecoderGDNative *> decoders;
+ Map<String, int> extensions;
+
+ static VideoDecoderServer *instance;
+
+public:
+ static VideoDecoderServer *get_instance() {
+ return instance;
+ }
+
+ const Map<String, int> &get_extensions() {
+ return extensions;
+ }
+
+ void register_decoder_interface(const godot_videodecoder_interface_gdnative *p_interface) {
+ VideoDecoderGDNative *decoder = memnew(VideoDecoderGDNative(p_interface));
+ int index = decoders.size();
+ for (int i = 0; i < decoder->supported_extensions.size(); i++) {
+ extensions[decoder->supported_extensions[i]] = index;
+ }
+ decoders.push_back(decoder);
+ }
+
+ VideoDecoderGDNative *get_decoder(const String &extension) {
+ if (extensions.size() == 0 || !extensions.has(extension))
+ return NULL;
+ return decoders[extensions[extension]];
+ }
+
+ VideoDecoderServer() {
+ instance = this;
+ }
+
+ ~VideoDecoderServer() {
+ for (int i = 0; i < decoders.size(); i++) {
+ memdelete(decoders[i]);
+ }
+ decoders.clear();
+ instance = NULL;
+ }
+};
+
+class VideoStreamPlaybackGDNative : public VideoStreamPlayback {
+
+ GDCLASS(VideoStreamPlaybackGDNative, VideoStreamPlayback);
+
+ Ref<ImageTexture> texture;
+ bool playing;
+ bool paused;
+
+ Vector2 texture_size;
+
+ void *mix_udata;
+ AudioMixCallback mix_callback;
+
+ int num_channels;
+ float time;
+ int mix_rate;
+ double delay_compensation;
+
+ float *pcm;
+ int pcm_write_idx;
+ int samples_decoded;
+
+ void cleanup();
+ void update_texture();
+
+protected:
+ String file_name;
+
+ FileAccess *file;
+
+ const godot_videodecoder_interface_gdnative *interface;
+ void *data_struct;
+
+public:
+ VideoStreamPlaybackGDNative();
+ ~VideoStreamPlaybackGDNative();
+
+ void set_interface(const godot_videodecoder_interface_gdnative *p_interface);
+
+ bool open_file(const String &p_file);
+
+ virtual void stop();
+ virtual void play();
+
+ virtual bool is_playing() const;
+
+ virtual void set_paused(bool p_paused);
+ virtual bool is_paused() const;
+
+ virtual void set_loop(bool p_enable);
+ virtual bool has_loop() const;
+
+ virtual float get_length() const;
+
+ virtual float get_playback_position() const;
+ virtual void seek(float p_time);
+
+ virtual void set_audio_track(int p_idx);
+
+ //virtual int mix(int16_t* p_buffer,int p_frames)=0;
+
+ virtual Ref<Texture> get_texture();
+ virtual void update(float p_delta);
+
+ virtual void set_mix_callback(AudioMixCallback p_callback, void *p_userdata);
+ virtual int get_channels() const;
+ virtual int get_mix_rate() const;
+};
+
+class VideoStreamGDNative : public VideoStream {
+
+ GDCLASS(VideoStreamGDNative, VideoStream);
+
+ String file;
+ int audio_track;
+
+protected:
+ static void
+ _bind_methods();
+
+public:
+ void set_file(const String &p_file);
+ String get_file();
+
+ virtual void set_audio_track(int p_track);
+ virtual Ref<VideoStreamPlayback> instance_playback();
+
+ VideoStreamGDNative() {}
+};
+
+class ResourceFormatLoaderVideoStreamGDNative : public ResourceFormatLoader {
+ GDCLASS(ResourceFormatLoaderVideoStreamGDNative, ResourceFormatLoader)
+public:
+ virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
+ virtual void get_recognized_extensions(List<String> *p_extensions) const;
+ virtual bool handles_type(const String &p_type) const;
+ virtual String get_resource_type(const String &p_path) const;
+};
+
+#endif
diff --git a/modules/gdscript/editor/gdscript_highlighter.cpp b/modules/gdscript/editor/gdscript_highlighter.cpp
index e4aee842ba..4f59b06ae6 100644
--- a/modules/gdscript/editor/gdscript_highlighter.cpp
+++ b/modules/gdscript/editor/gdscript_highlighter.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdscript/editor/gdscript_highlighter.h b/modules/gdscript/editor/gdscript_highlighter.h
index b8cb4a65e9..9dc10a5d1b 100644
--- a/modules/gdscript/editor/gdscript_highlighter.h
+++ b/modules/gdscript/editor/gdscript_highlighter.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp
index 159085df34..9d263aa5e1 100644
--- a/modules/gdscript/gdscript.cpp
+++ b/modules/gdscript/gdscript.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -421,31 +421,40 @@ bool GDScript::_update_exports() {
base_cache = Ref<GDScript>();
}
- if (c->extends_used && String(c->extends_file) != "" && String(c->extends_file) != get_path()) {
+ if (c->extends_used) {
+ String path = "";
+ if (String(c->extends_file) != "" && String(c->extends_file) != get_path()) {
+ path = c->extends_file;
+ if (path.is_rel_path()) {
- String path = c->extends_file;
- if (path.is_rel_path()) {
+ String base = get_path();
+ if (base == "" || base.is_rel_path()) {
- String base = get_path();
- if (base == "" || base.is_rel_path()) {
-
- ERR_PRINT(("Could not resolve relative path for parent class: " + path).utf8().get_data());
- } else {
- path = base.get_base_dir().plus_file(path);
+ ERR_PRINT(("Could not resolve relative path for parent class: " + path).utf8().get_data());
+ } else {
+ path = base.get_base_dir().plus_file(path);
+ }
}
+ } else if (c->extends_class.size() != 0) {
+ String base = c->extends_class[0];
+
+ if (ScriptServer::is_global_class(base))
+ path = ScriptServer::get_global_class_path(base);
}
- if (path != get_path()) {
+ if (path != "") {
+ if (path != get_path()) {
- Ref<GDScript> bf = ResourceLoader::load(path);
+ Ref<GDScript> bf = ResourceLoader::load(path);
- if (bf.is_valid()) {
+ if (bf.is_valid()) {
- base_cache = bf;
- bf->inheriters_cache.insert(get_instance_id());
+ base_cache = bf;
+ bf->inheriters_cache.insert(get_instance_id());
+ }
+ } else {
+ ERR_PRINT(("Path extending itself in " + path).utf8().get_data());
}
- } else {
- ERR_PRINT(("Path extending itself in " + path).utf8().get_data());
}
}
@@ -466,20 +475,15 @@ bool GDScript::_update_exports() {
_signals[c->_signals[i].name] = c->_signals[i].arguments;
}
} else {
- for (Set<PlaceHolderScriptInstance *>::Element *E = placeholders.front(); E; E = E->next()) {
- E->get()->set_build_failed(true);
- }
- return false;
- }
- } else {
- if (!valid) {
- for (Set<PlaceHolderScriptInstance *>::Element *E = placeholders.front(); E; E = E->next()) {
- E->get()->set_build_failed(true);
- }
+ placeholder_fallback_enabled = true;
return false;
}
+ } else if (!valid || placeholder_fallback_enabled) {
+ return false;
}
+ placeholder_fallback_enabled = false;
+
if (base_cache.is_valid()) {
if (base_cache->_update_exports()) {
changed = true;
@@ -494,7 +498,6 @@ bool GDScript::_update_exports() {
_update_exports_values(values, propnames);
for (Set<PlaceHolderScriptInstance *>::Element *E = placeholders.front(); E; E = E->next()) {
- E->get()->set_build_failed(false);
E->get()->update(propnames, values);
}
}
@@ -858,7 +861,6 @@ bool GDScript::has_script_signal(const StringName &p_signal) const {
else if (base_cache.is_valid()) {
return base_cache->has_script_signal(p_signal);
}
-
#endif
return false;
}
@@ -899,6 +901,7 @@ GDScript::GDScript() :
tool = false;
#ifdef TOOLS_ENABLED
source_changed_cache = false;
+ placeholder_fallback_enabled = false;
#endif
#ifdef DEBUG_ENABLED
@@ -1667,6 +1670,8 @@ void GDScriptLanguage::reload_tool_script(const Ref<Script> &p_script, bool p_so
//restore state if saved
for (Map<ObjectID, List<Pair<StringName, Variant> > >::Element *F = E->get().front(); F; F = F->next()) {
+ List<Pair<StringName, Variant> > &saved_state = F->get();
+
Object *obj = ObjectDB::get_instance(F->key());
if (!obj)
continue;
@@ -1676,16 +1681,26 @@ void GDScriptLanguage::reload_tool_script(const Ref<Script> &p_script, bool p_so
obj->set_script(RefPtr());
}
obj->set_script(scr.get_ref_ptr());
- if (!obj->get_script_instance()) {
+
+ ScriptInstance *script_instance = obj->get_script_instance();
+
+ if (!script_instance) {
//failed, save reload state for next time if not saved
if (!scr->pending_reload_state.has(obj->get_instance_id())) {
- scr->pending_reload_state[obj->get_instance_id()] = F->get();
+ scr->pending_reload_state[obj->get_instance_id()] = saved_state;
}
continue;
}
- for (List<Pair<StringName, Variant> >::Element *G = F->get().front(); G; G = G->next()) {
- obj->get_script_instance()->set(G->get().first, G->get().second);
+ if (script_instance->is_placeholder() && scr->is_placeholder_fallback_enabled()) {
+ PlaceHolderScriptInstance *placeholder = static_cast<PlaceHolderScriptInstance *>(script_instance);
+ for (List<Pair<StringName, Variant> >::Element *G = saved_state.front(); G; G = G->next()) {
+ placeholder->property_set_fallback(G->get().first, G->get().second);
+ }
+ } else {
+ for (List<Pair<StringName, Variant> >::Element *G = saved_state.front(); G; G = G->next()) {
+ script_instance->set(G->get().first, G->get().second);
+ }
}
scr->pending_reload_state.erase(obj->get_instance_id()); //as it reloaded, remove pending state
diff --git a/modules/gdscript/gdscript.h b/modules/gdscript/gdscript.h
index f344beba9f..86c00c0b59 100644
--- a/modules/gdscript/gdscript.h
+++ b/modules/gdscript/gdscript.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -97,6 +97,7 @@ class GDScript : public Script {
Ref<GDScript> base_cache;
Set<ObjectID> inheriters_cache;
bool source_changed_cache;
+ bool placeholder_fallback_enabled;
void _update_exports_values(Map<StringName, Variant> &values, List<PropertyInfo> &propnames);
#endif
@@ -141,7 +142,7 @@ protected:
static void _bind_methods();
public:
- bool is_valid() const { return valid; }
+ virtual bool is_valid() const { return valid; }
const Map<StringName, Ref<GDScript> > &get_subclasses() const { return subclasses; }
const Map<StringName, Variant> &get_constants() const { return constants; }
@@ -209,6 +210,10 @@ public:
virtual void get_constants(Map<StringName, Variant> *p_constants);
virtual void get_members(Set<StringName> *p_members);
+#ifdef TOOLS_ENABLED
+ virtual bool is_placeholder_fallback_enabled() const { return placeholder_fallback_enabled; }
+#endif
+
GDScript();
~GDScript();
};
@@ -500,6 +505,7 @@ public:
};
class ResourceFormatLoaderGDScript : public ResourceFormatLoader {
+ GDCLASS(ResourceFormatLoaderGDScript, ResourceFormatLoader)
public:
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
virtual void get_recognized_extensions(List<String> *p_extensions) const;
@@ -508,6 +514,7 @@ public:
};
class ResourceFormatSaverGDScript : public ResourceFormatSaver {
+ GDCLASS(ResourceFormatSaverGDScript, ResourceFormatSaver)
public:
virtual Error save(const String &p_path, const RES &p_resource, uint32_t p_flags = 0);
virtual void get_recognized_extensions(const RES &p_resource, List<String> *p_extensions) const;
diff --git a/modules/gdscript/gdscript_compiler.cpp b/modules/gdscript/gdscript_compiler.cpp
index 45319c59e7..e59b57b39a 100644
--- a/modules/gdscript/gdscript_compiler.cpp
+++ b/modules/gdscript/gdscript_compiler.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -132,7 +132,7 @@ GDScriptDataType GDScriptCompiler::_gdtype_from_datatype(const GDScriptParser::D
result.kind = GDScriptDataType::SCRIPT;
result.script_type = p_datatype.script_type;
result.native_type = result.script_type->get_instance_base_type();
- }
+ } break;
case GDScriptParser::DataType::GDSCRIPT: {
result.kind = GDScriptDataType::GDSCRIPT;
result.script_type = p_datatype.script_type;
@@ -486,7 +486,7 @@ int GDScriptCompiler::_parse_expression(CodeGen &codegen, const GDScriptParser::
script = codegen.script;
} else {
StringName name = cn->cast_type.class_type->name;
- if (class_map[name] == codegen.script->subclasses[name]) {
+ if (codegen.script->subclasses.has(name) && class_map[name] == codegen.script->subclasses[name]) {
idx = codegen.get_name_map_pos(name);
idx |= GDScriptFunction::ADDR_TYPE_CLASS_CONSTANT << GDScriptFunction::ADDR_BITS;
} else {
@@ -1183,7 +1183,7 @@ int GDScriptCompiler::_parse_expression(CodeGen &codegen, const GDScriptParser::
script = codegen.script;
} else {
StringName name = assign_type.class_type->name;
- if (class_map[name] == codegen.script->subclasses[name]) {
+ if (codegen.script->subclasses.has(name) && class_map[name] == codegen.script->subclasses[name]) {
idx = codegen.get_name_map_pos(name);
idx |= GDScriptFunction::ADDR_TYPE_CLASS_CONSTANT << GDScriptFunction::ADDR_BITS;
} else {
@@ -1603,13 +1603,13 @@ Error GDScriptCompiler::_parse_block(CodeGen &codegen, const GDScriptParser::Blo
return OK;
}
-Error GDScriptCompiler::_parse_function(Ref<GDScript> p_script, const GDScriptParser::ClassNode *p_class, const GDScriptParser::FunctionNode *p_func, bool p_for_ready) {
+Error GDScriptCompiler::_parse_function(GDScript *p_script, const GDScriptParser::ClassNode *p_class, const GDScriptParser::FunctionNode *p_func, bool p_for_ready) {
Vector<int> bytecode;
CodeGen codegen;
codegen.class_node = p_class;
- codegen.script = p_script.ptr();
+ codegen.script = p_script;
codegen.function_node = p_func;
codegen.stack_max = 0;
codegen.current_line = 0;
@@ -1853,7 +1853,7 @@ Error GDScriptCompiler::_parse_function(Ref<GDScript> p_script, const GDScriptPa
return OK;
}
-Error GDScriptCompiler::_parse_class_level(Ref<GDScript> p_script, Ref<GDScript> p_owner, const GDScriptParser::ClassNode *p_class, bool p_keep_state) {
+Error GDScriptCompiler::_parse_class_level(GDScript *p_script, GDScript *p_owner, const GDScriptParser::ClassNode *p_class, bool p_keep_state) {
if (p_class->owner && p_class->owner->owner) {
// Owner is not root
@@ -1887,7 +1887,7 @@ Error GDScriptCompiler::_parse_class_level(Ref<GDScript> p_script, Ref<GDScript>
p_script->initializer = NULL;
p_script->subclasses.clear();
- p_script->_owner = p_owner.ptr();
+ p_script->_owner = p_owner;
p_script->tool = p_class->tool;
p_script->name = p_class->name;
@@ -1994,7 +1994,7 @@ Error GDScriptCompiler::_parse_class_level(Ref<GDScript> p_script, Ref<GDScript>
StringName name = p_class->_signals[i].name;
- GDScript *c = p_script.ptr();
+ GDScript *c = p_script;
while (c) {
@@ -2054,7 +2054,7 @@ Error GDScriptCompiler::_parse_class_level(Ref<GDScript> p_script, Ref<GDScript>
return OK;
}
-Error GDScriptCompiler::_parse_class_blocks(Ref<GDScript> p_script, const GDScriptParser::ClassNode *p_class, bool p_keep_state) {
+Error GDScriptCompiler::_parse_class_blocks(GDScript *p_script, const GDScriptParser::ClassNode *p_class, bool p_keep_state) {
//parse methods
bool has_initializer = false;
@@ -2159,7 +2159,7 @@ Error GDScriptCompiler::_parse_class_blocks(Ref<GDScript> p_script, const GDScri
return OK;
}
-void GDScriptCompiler::_make_scripts(const Ref<GDScript> p_script, const GDScriptParser::ClassNode *p_class, bool p_keep_state) {
+void GDScriptCompiler::_make_scripts(const GDScript *p_script, const GDScriptParser::ClassNode *p_class, bool p_keep_state) {
Map<StringName, Ref<GDScript> > old_subclasses;
@@ -2178,20 +2178,20 @@ void GDScriptCompiler::_make_scripts(const Ref<GDScript> p_script, const GDScrip
subclass.instance();
}
- subclass->_owner = const_cast<GDScript *>(p_script.ptr());
+ subclass->_owner = const_cast<GDScript *>(p_script);
class_map.insert(name, subclass);
_make_scripts(subclass.ptr(), p_class->subclasses[i], p_keep_state);
}
}
-Error GDScriptCompiler::compile(const GDScriptParser *p_parser, Ref<GDScript> p_script, bool p_keep_state) {
+Error GDScriptCompiler::compile(const GDScriptParser *p_parser, GDScript *p_script, bool p_keep_state) {
err_line = -1;
err_column = -1;
error = "";
parser = p_parser;
- main_script = p_script.ptr();
+ main_script = p_script;
const GDScriptParser::Node *root = parser->get_parse_tree();
ERR_FAIL_COND_V(root->type != GDScriptParser::Node::TYPE_CLASS, ERR_INVALID_DATA);
diff --git a/modules/gdscript/gdscript_compiler.h b/modules/gdscript/gdscript_compiler.h
index 23c6450aa7..8440807a56 100644
--- a/modules/gdscript/gdscript_compiler.h
+++ b/modules/gdscript/gdscript_compiler.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -148,17 +148,17 @@ class GDScriptCompiler {
int _parse_assign_right_expression(CodeGen &codegen, const GDScriptParser::OperatorNode *p_expression, int p_stack_level);
int _parse_expression(CodeGen &codegen, const GDScriptParser::Node *p_expression, int p_stack_level, bool p_root = false, bool p_initializer = false);
Error _parse_block(CodeGen &codegen, const GDScriptParser::BlockNode *p_block, int p_stack_level = 0, int p_break_addr = -1, int p_continue_addr = -1);
- Error _parse_function(Ref<GDScript> p_script, const GDScriptParser::ClassNode *p_class, const GDScriptParser::FunctionNode *p_func, bool p_for_ready = false);
- Error _parse_class_level(Ref<GDScript> p_script, Ref<GDScript> p_owner, const GDScriptParser::ClassNode *p_class, bool p_keep_state);
- Error _parse_class_blocks(Ref<GDScript> p_script, const GDScriptParser::ClassNode *p_class, bool p_keep_state);
- void _make_scripts(const Ref<GDScript> p_script, const GDScriptParser::ClassNode *p_class, bool p_keep_state);
+ Error _parse_function(GDScript *p_script, const GDScriptParser::ClassNode *p_class, const GDScriptParser::FunctionNode *p_func, bool p_for_ready = false);
+ Error _parse_class_level(GDScript *p_script, GDScript *p_owner, const GDScriptParser::ClassNode *p_class, bool p_keep_state);
+ Error _parse_class_blocks(GDScript *p_script, const GDScriptParser::ClassNode *p_class, bool p_keep_state);
+ void _make_scripts(const GDScript *p_script, const GDScriptParser::ClassNode *p_class, bool p_keep_state);
int err_line;
int err_column;
StringName source;
String error;
public:
- Error compile(const GDScriptParser *p_parser, Ref<GDScript> p_script, bool p_keep_state = false);
+ Error compile(const GDScriptParser *p_parser, GDScript *p_script, bool p_keep_state = false);
String get_error() const;
int get_error_line() const;
diff --git a/modules/gdscript/gdscript_editor.cpp b/modules/gdscript/gdscript_editor.cpp
index 068e8d2d92..08ad101967 100644
--- a/modules/gdscript/gdscript_editor.cpp
+++ b/modules/gdscript/gdscript_editor.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -1181,7 +1181,11 @@ static bool _guess_identifier_type(const GDScriptCompletionContext &p_context, c
c.line = op->line;
c.block = blk;
if (_guess_expression_type(p_context, op->arguments[1], r_type)) {
- r_type.type.is_meta_type = false;
+ r_type.type.is_meta_type = false; // Right-hand of `is` will be a meta type, but the left-hand value is not
+ // Not an assignment, it shouldn't carry any value
+ r_type.value = Variant();
+ r_type.assigned_expression = NULL;
+
return true;
}
}
@@ -2442,9 +2446,13 @@ Error GDScriptLanguage::complete_code(const String &p_code, const String &p_base
context._class = parser.get_completion_class();
context.block = parser.get_completion_block();
context.function = parser.get_completion_function();
- context.base = p_owner;
- context.base_path = p_base_path;
context.line = parser.get_completion_line();
+
+ if (!context._class || context._class->owner == NULL) {
+ context.base = p_owner;
+ context.base_path = p_base_path;
+ }
+
bool is_function = false;
switch (parser.get_completion_type()) {
diff --git a/modules/gdscript/gdscript_function.cpp b/modules/gdscript/gdscript_function.cpp
index c67cf124c0..966c02d4ec 100644
--- a/modules/gdscript/gdscript_function.cpp
+++ b/modules/gdscript/gdscript_function.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -370,7 +370,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
}
script = p_instance->script.ptr();
} else {
- script = this->_script.ptr();
+ script = _script;
}
}
@@ -1182,7 +1182,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
GET_VARIANT_PTR(dst, argc + 3);
- const GDScript *gds = _script.ptr();
+ const GDScript *gds = _script;
const Map<StringName, GDScriptFunction *>::Element *E = NULL;
while (gds->base.ptr()) {
@@ -1253,7 +1253,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
gdfs->state.stack_size = _stack_size;
gdfs->state.self = self;
gdfs->state.alloca_size = alloca_size;
- gdfs->state.script = _script;
+ gdfs->state.script = Ref<GDScript>(_script);
gdfs->state.ip = ip + ipofs;
gdfs->state.line = line;
gdfs->state.instance_id = (p_instance && p_instance->get_owner()) ? p_instance->get_owner()->get_instance_id() : 0;
@@ -1760,22 +1760,14 @@ GDScriptFunction::~GDScriptFunction() {
Variant GDScriptFunctionState::_signal_callback(const Variant **p_args, int p_argcount, Variant::CallError &r_error) {
-#ifdef DEBUG_ENABLED
- // Checking this first since it's faster
- if (!state.script.is_valid()) {
- ERR_EXPLAIN("Resumed after yield, but script is gone");
- ERR_FAIL_V(Variant());
- }
-
if (state.instance_id && !ObjectDB::get_instance(state.instance_id)) {
+#ifdef DEBUG_ENABLED
ERR_EXPLAIN("Resumed after yield, but class instance is gone");
ERR_FAIL_V(Variant());
- }
#else
- if (!is_valid()) {
return Variant();
- }
#endif
+ }
Variant arg;
r_error.error = Variant::CallError::CALL_OK;
@@ -1842,9 +1834,6 @@ bool GDScriptFunctionState::is_valid(bool p_extended_check) const {
return false;
if (p_extended_check) {
- //script gone? (checking this first since it's faster)
- if (!state.script.is_valid())
- return false;
//class instance gone?
if (state.instance_id && !ObjectDB::get_instance(state.instance_id))
return false;
@@ -1856,18 +1845,14 @@ bool GDScriptFunctionState::is_valid(bool p_extended_check) const {
Variant GDScriptFunctionState::resume(const Variant &p_arg) {
ERR_FAIL_COND_V(!function, Variant());
-#ifdef DEBUG_ENABLED
- // Checking this first since it's faster
- if (!state.script.is_valid()) {
- ERR_EXPLAIN("Resumed after yield, but script is gone");
- ERR_FAIL_V(Variant());
- }
-
if (state.instance_id && !ObjectDB::get_instance(state.instance_id)) {
+#ifdef DEBUG_ENABLED
ERR_EXPLAIN("Resumed after yield, but class instance is gone");
ERR_FAIL_V(Variant());
- }
+#else
+ return Variant();
#endif
+ }
state.result = p_arg;
Variant::CallError err;
diff --git a/modules/gdscript/gdscript_function.h b/modules/gdscript/gdscript_function.h
index a47070de4f..f4058664ff 100644
--- a/modules/gdscript/gdscript_function.h
+++ b/modules/gdscript/gdscript_function.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -74,8 +74,14 @@ struct GDScriptDataType {
return false;
}
Object *obj = p_variant.operator Object *();
- if (obj && !ClassDB::is_parent_class(obj->get_class_name(), native_type)) {
- return false;
+ if (obj) {
+ if (!ClassDB::is_parent_class(obj->get_class_name(), native_type)) {
+ // Try with underscore prefix
+ StringName underscore_native_type = "_" + native_type;
+ if (!ClassDB::is_parent_class(obj->get_class_name(), underscore_native_type)) {
+ return false;
+ }
+ }
}
return true;
} break;
@@ -225,7 +231,7 @@ private:
bool _static;
MultiplayerAPI::RPCMode rpc_mode;
- Ref<GDScript> _script;
+ GDScript *_script;
StringName name;
Vector<Variant> constants;
@@ -297,7 +303,7 @@ public:
int get_default_argument_addr(int p_idx) const;
GDScriptDataType get_return_type() const;
GDScriptDataType get_argument_type(int p_idx) const;
- GDScript *get_script() const { return const_cast<GDScript *>(_script.ptr()); }
+ GDScript *get_script() const { return _script; }
StringName get_source() const { return source; }
void debug_get_stack_member_state(int p_line, List<Pair<StringName, int> > *r_stackvars) const;
diff --git a/modules/gdscript/gdscript_functions.cpp b/modules/gdscript/gdscript_functions.cpp
index 2f31d59c46..44d44462ca 100644
--- a/modules/gdscript/gdscript_functions.cpp
+++ b/modules/gdscript/gdscript_functions.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -758,22 +758,14 @@ void GDScriptFunctions::call(Function p_func, const Variant **p_args, int p_arg_
r_ret = Variant();
return;
}
+ r_ret = *p_args[0];
VariantParser::StreamString ss;
ss.s = *p_args[0];
String errs;
int line;
- Error err = VariantParser::parse(&ss, r_ret, errs, line);
-
- if (err != OK) {
- r_error.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
- r_error.argument = 0;
- r_error.expected = Variant::STRING;
- r_ret = "Parse error at line " + itos(line) + ": " + errs;
- return;
- }
-
+ (void)VariantParser::parse(&ss, r_ret, errs, line);
} break;
case VAR_TO_BYTES: {
VALIDATE_ARG_COUNT(1);
@@ -890,7 +882,7 @@ void GDScriptFunctions::call(Function p_func, const Variant **p_args, int p_arg_
int incr = *p_args[2];
if (incr == 0) {
- r_ret = RTR("step argument is zero!");
+ r_ret = RTR("Step argument is zero!");
r_error.error = Variant::CallError::CALL_ERROR_INVALID_METHOD;
return;
}
@@ -1573,7 +1565,8 @@ MethodInfo GDScriptFunctions::get_info(Function p_func) {
} break;
case MATH_LERP: {
MethodInfo mi("lerp", PropertyInfo(Variant::NIL, "from"), PropertyInfo(Variant::NIL, "to"), PropertyInfo(Variant::REAL, "weight"));
- mi.return_val.type = Variant::REAL;
+ mi.return_val.type = Variant::NIL;
+ mi.return_val.usage |= PROPERTY_USAGE_NIL_IS_VARIANT;
return mi;
} break;
case MATH_INVERSE_LERP: {
diff --git a/modules/gdscript/gdscript_functions.h b/modules/gdscript/gdscript_functions.h
index 33d5f27230..fcb8f32e54 100644
--- a/modules/gdscript/gdscript_functions.h
+++ b/modules/gdscript/gdscript_functions.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdscript/gdscript_parser.cpp b/modules/gdscript/gdscript_parser.cpp
index a4bda42b16..a012ccad30 100644
--- a/modules/gdscript/gdscript_parser.cpp
+++ b/modules/gdscript/gdscript_parser.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -3752,6 +3752,19 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
BlockNode *block = alloc_node<BlockNode>();
block->parent_class = p_class;
+ FunctionNode *function = alloc_node<FunctionNode>();
+ function->name = name;
+ function->arguments = arguments;
+ function->argument_types = argument_types;
+ function->default_values = default_values;
+ function->_static = _static;
+ function->line = fnline;
+#ifdef DEBUG_ENABLED
+ function->arguments_usage = arguments_usage;
+#endif // DEBUG_ENABLED
+ function->rpc_mode = rpc_mode;
+ rpc_mode = MultiplayerAPI::RPC_MODE_DISABLED;
+
if (name == "_init") {
if (_static) {
@@ -3782,7 +3795,9 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
parenthesis++;
while (true) {
+ current_function = function;
Node *arg = _parse_and_reduce_expression(p_class, _static);
+ current_function = NULL;
cparent->arguments.push_back(arg);
if (tokenizer->get_token() == GDScriptTokenizer::TK_COMMA) {
@@ -3826,19 +3841,7 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
return;
}
- FunctionNode *function = alloc_node<FunctionNode>();
- function->name = name;
function->return_type = return_type;
- function->arguments = arguments;
- function->argument_types = argument_types;
- function->default_values = default_values;
- function->_static = _static;
- function->line = fnline;
-#ifdef DEBUG_ENABLED
- function->arguments_usage = arguments_usage;
-#endif // DEBUG_ENABLED
- function->rpc_mode = rpc_mode;
- rpc_mode = MultiplayerAPI::RPC_MODE_DISABLED;
if (_static)
p_class->static_functions.push_back(function);
@@ -4556,6 +4559,10 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
member.line = tokenizer->get_token_line();
member.usages = 0;
member.rpc_mode = rpc_mode;
+#ifdef TOOLS_ENABLED
+ Variant::CallError ce;
+ member.default_value = Variant::construct(member._export.type, NULL, 0, ce);
+#endif
if (current_class->constant_expressions.has(member.identifier)) {
_set_error("A constant named '" + String(member.identifier) + "' already exists in this class (at line: " +
@@ -5055,7 +5062,7 @@ void GDScriptParser::_determine_inheritance(ClassNode *p_class) {
if (ScriptServer::is_global_class(base)) {
base_script = ResourceLoader::load(ScriptServer::get_global_class_path(base));
if (!base_script.is_valid()) {
- _set_error("Class '" + base + "' could not be fully loaded (script error or cyclic inheritance).", p_class->line);
+ _set_error("Class '" + base + "' could not be fully loaded (script error or cyclic dependency).", p_class->line);
return;
}
p = NULL;
@@ -5384,7 +5391,7 @@ GDScriptParser::DataType GDScriptParser::_resolve_type(const DataType &p_source,
Ref<GDScript> gds = script;
if (gds.is_valid()) {
if (!gds->is_valid()) {
- _set_error("Class '" + id + "' could not be fully loaded (script error or cyclic inheritance).", p_line);
+ _set_error("Class '" + id + "' could not be fully loaded (script error or cyclic dependency).", p_line);
return DataType();
}
result.kind = DataType::GDSCRIPT;
@@ -5743,18 +5750,23 @@ bool GDScriptParser::_is_type_compatible(const DataType &p_container, const Data
if (p_container.kind == DataType::BUILTIN && p_expression.kind == DataType::BUILTIN) {
bool valid = p_container.builtin_type == p_expression.builtin_type;
if (p_allow_implicit_conversion) {
- valid = valid || (p_container.builtin_type == Variant::INT && p_expression.builtin_type == Variant::REAL);
- valid = valid || (p_container.builtin_type == Variant::REAL && p_expression.builtin_type == Variant::INT);
- valid = valid || (p_container.builtin_type == Variant::STRING && p_expression.builtin_type == Variant::NODE_PATH);
- valid = valid || (p_container.builtin_type == Variant::NODE_PATH && p_expression.builtin_type == Variant::STRING);
- valid = valid || (p_container.builtin_type == Variant::BOOL && p_expression.builtin_type == Variant::REAL);
- valid = valid || (p_container.builtin_type == Variant::BOOL && p_expression.builtin_type == Variant::INT);
- valid = valid || (p_container.builtin_type == Variant::INT && p_expression.builtin_type == Variant::BOOL);
- valid = valid || (p_container.builtin_type == Variant::REAL && p_expression.builtin_type == Variant::BOOL);
+ valid = valid || Variant::can_convert_strict(p_expression.builtin_type, p_container.builtin_type);
}
return valid;
}
+ if (p_container.kind == DataType::BUILTIN && p_container.builtin_type == Variant::OBJECT) {
+ // Object built-in is a special case, it's compatible with any object and with null
+ if (p_expression.kind == DataType::BUILTIN && p_expression.builtin_type == Variant::NIL) {
+ return true;
+ }
+ if (p_expression.kind == DataType::BUILTIN) {
+ return false;
+ }
+ // If it's not a built-in, must be an object
+ return true;
+ }
+
if (p_container.kind == DataType::BUILTIN || (p_expression.kind == DataType::BUILTIN && p_expression.builtin_type != Variant::NIL)) {
// Can't mix built-ins with objects
return false;
@@ -5924,7 +5936,7 @@ GDScriptParser::DataType GDScriptParser::_reduce_node_type(Node *p_node) {
int idx = current_function->arguments.find(id->name);
node_type = current_function->argument_types[idx];
} else {
- node_type = _reduce_identifier_type(NULL, id->name, id->line);
+ node_type = _reduce_identifier_type(NULL, id->name, id->line, false);
}
} break;
case Node::TYPE_CAST: {
@@ -6174,7 +6186,7 @@ GDScriptParser::DataType GDScriptParser::_reduce_node_type(Node *p_node) {
result.is_constant = false;
node_type = result;
} else {
- node_type = _reduce_identifier_type(&base_type, member_id->name, op->line);
+ node_type = _reduce_identifier_type(&base_type, member_id->name, op->line, true);
#ifdef DEBUG_ENABLED
if (!node_type.has_type) {
_add_warning(GDScriptWarning::UNSAFE_PROPERTY_ACCESS, op->line, member_id->name.operator String(), base_type.to_string());
@@ -6216,7 +6228,7 @@ GDScriptParser::DataType GDScriptParser::_reduce_node_type(Node *p_node) {
if (check_types && index_type.has_type) {
if (base_type.kind == DataType::BUILTIN) {
// Check if indexing is valid
- bool error = index_type.kind != DataType::BUILTIN;
+ bool error = index_type.kind != DataType::BUILTIN && base_type.builtin_type != Variant::DICTIONARY;
if (!error) {
switch (base_type.builtin_type) {
// Expect int or real as index
@@ -6759,10 +6771,10 @@ GDScriptParser::DataType GDScriptParser::_reduce_function_call_type(const Operat
valid = _get_function_signature(base_type, callee_name, return_type, arg_types,
default_args_count, is_static, is_vararg);
- if (valid) {
- return_type = original_type;
- return_type.is_meta_type = false;
- }
+ return_type = original_type;
+ return_type.is_meta_type = false;
+
+ valid = true; // There's always an initializer, we can asume this is true
}
if (!valid) {
@@ -6821,6 +6833,7 @@ GDScriptParser::DataType GDScriptParser::_reduce_function_call_type(const Operat
} break;
}
+#ifdef DEBUG_ENABLED
if (!check_types) {
return return_type;
}
@@ -6846,11 +6859,9 @@ GDScriptParser::DataType GDScriptParser::_reduce_function_call_type(const Operat
if (!par_type.has_type) {
_mark_line_as_unsafe(p_call->line);
-#ifdef DEBUG_ENABLED
if (par_type.may_yield && p_call->arguments[i]->type == Node::TYPE_OPERATOR) {
_add_warning(GDScriptWarning::FUNCTION_MAY_YIELD, p_call->line, _find_function_name(static_cast<OperatorNode *>(p_call->arguments[i])));
}
-#endif // DEBUG_ENABLED
} else if (!_is_type_compatible(arg_types[i - arg_diff], par_type, true)) {
// Supertypes are acceptable for dynamic compliance
if (!_is_type_compatible(par_type, arg_types[i - arg_diff])) {
@@ -6863,14 +6874,14 @@ GDScriptParser::DataType GDScriptParser::_reduce_function_call_type(const Operat
_mark_line_as_unsafe(p_call->line);
}
} else {
-#ifdef DEBUG_ENABLED
if (arg_type.kind == DataType::BUILTIN && arg_type.builtin_type == Variant::INT && par_type.kind == DataType::BUILTIN && par_type.builtin_type == Variant::REAL) {
_add_warning(GDScriptWarning::NARROWING_CONVERSION, p_call->line, callee_name);
}
-#endif // DEBUG_ENABLED
}
}
+#endif // DEBUG_ENABLED
+
return return_type;
}
@@ -6891,9 +6902,9 @@ bool GDScriptParser::_get_member_type(const DataType &p_base_type, const StringN
if (!base_type.is_meta_type) {
for (int i = 0; i < base->variables.size(); i++) {
- ClassNode::Member m = base->variables[i];
- if (m.identifier == p_member) {
- r_member_type = m.data_type;
+ if (base->variables[i].identifier == p_member) {
+ r_member_type = base->variables[i].data_type;
+ base->variables.write[i].usages += 1;
return true;
}
}
@@ -7088,43 +7099,33 @@ bool GDScriptParser::_get_member_type(const DataType &p_base_type, const StringN
return false;
}
-GDScriptParser::DataType GDScriptParser::_reduce_identifier_type(const DataType *p_base_type, const StringName &p_identifier, int p_line) {
+GDScriptParser::DataType GDScriptParser::_reduce_identifier_type(const DataType *p_base_type, const StringName &p_identifier, int p_line, bool p_is_indexing) {
if (p_base_type && !p_base_type->has_type) {
return DataType();
}
DataType base_type;
+ DataType member_type;
- // Check classes in current file
- ClassNode *base = NULL;
if (!p_base_type) {
- base = current_class;
base_type.has_type = true;
base_type.is_constant = true;
base_type.kind = DataType::CLASS;
- base_type.class_type = base;
+ base_type.class_type = current_class;
} else {
base_type = DataType(*p_base_type);
- if (base_type.kind == DataType::CLASS) {
- base = base_type.class_type;
- }
- }
-
- DataType member_type;
-
- for (int i = 0; i < current_class->variables.size(); i++) {
- if (current_class->variables[i].identifier == p_identifier) {
- member_type = current_class->variables[i].data_type;
- current_class->variables.write[i].usages += 1;
- return member_type;
- }
}
if (_get_member_type(base_type, p_identifier, member_type)) {
return member_type;
}
+ if (p_is_indexing) {
+ // Don't look for globals since this is an indexed identifier
+ return DataType();
+ }
+
if (!p_base_type) {
// Possibly this is a global, check before failing
@@ -7182,7 +7183,7 @@ GDScriptParser::DataType GDScriptParser::_reduce_identifier_type(const DataType
Ref<GDScript> gds = scr;
if (gds.is_valid()) {
if (!gds->is_valid()) {
- _set_error("Class '" + p_identifier + "' could not be fully loaded (script error or cyclic inheritance).");
+ _set_error("Class '" + p_identifier + "' could not be fully loaded (script error or cyclic dependency).");
return DataType();
}
result.kind = DataType::GDSCRIPT;
@@ -8102,6 +8103,7 @@ Error GDScriptParser::_parse(const String &p_base_path) {
check_types = false;
#endif
+#ifdef DEBUG_ENABLED
// Resolve all class-level stuff before getting into function blocks
_check_class_level_types(main_class);
@@ -8116,7 +8118,6 @@ Error GDScriptParser::_parse(const String &p_base_path) {
return ERR_PARSE_ERROR;
}
-#ifdef DEBUG_ENABLED
// Resolve warning ignores
Vector<Pair<int, String> > warning_skips = tokenizer->get_warning_skips();
bool warning_is_error = GLOBAL_GET("debug/gdscript/warnings/treat_warnings_as_errors").booleanize();
diff --git a/modules/gdscript/gdscript_parser.h b/modules/gdscript/gdscript_parser.h
index 8121fb7f85..b4a705c9e7 100644
--- a/modules/gdscript/gdscript_parser.h
+++ b/modules/gdscript/gdscript_parser.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -607,7 +607,7 @@ private:
DataType _reduce_node_type(Node *p_node);
DataType _reduce_function_call_type(const OperatorNode *p_call);
- DataType _reduce_identifier_type(const DataType *p_base_type, const StringName &p_identifier, int p_line);
+ DataType _reduce_identifier_type(const DataType *p_base_type, const StringName &p_identifier, int p_line, bool p_is_indexing);
void _check_class_level_types(ClassNode *p_class);
void _check_class_blocks_types(ClassNode *p_class);
void _check_function_types(FunctionNode *p_function);
diff --git a/modules/gdscript/gdscript_tokenizer.cpp b/modules/gdscript/gdscript_tokenizer.cpp
index c37142b3c1..127a00a9f3 100644
--- a/modules/gdscript/gdscript_tokenizer.cpp
+++ b/modules/gdscript/gdscript_tokenizer.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdscript/gdscript_tokenizer.h b/modules/gdscript/gdscript_tokenizer.h
index cc894fb101..abacdf0322 100644
--- a/modules/gdscript/gdscript_tokenizer.h
+++ b/modules/gdscript/gdscript_tokenizer.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gdscript/register_types.cpp b/modules/gdscript/register_types.cpp
index 26dcbdcf89..b8a13ed91b 100644
--- a/modules/gdscript/register_types.cpp
+++ b/modules/gdscript/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -38,8 +38,8 @@
#include "gdscript_tokenizer.h"
GDScriptLanguage *script_language_gd = NULL;
-ResourceFormatLoaderGDScript *resource_loader_gd = NULL;
-ResourceFormatSaverGDScript *resource_saver_gd = NULL;
+Ref<ResourceFormatLoaderGDScript> resource_loader_gd;
+Ref<ResourceFormatSaverGDScript> resource_saver_gd;
#ifdef TOOLS_ENABLED
@@ -54,20 +54,74 @@ class EditorExportGDScript : public EditorExportPlugin {
public:
virtual void _export_file(const String &p_path, const String &p_type, const Set<String> &p_features) {
- if (!p_path.ends_with(".gd"))
+ int script_mode = EditorExportPreset::MODE_SCRIPT_COMPILED;
+ String script_key;
+
+ const Ref<EditorExportPreset> &preset = get_export_preset();
+
+ if (preset.is_valid()) {
+ script_mode = preset->get_script_export_mode();
+ script_key = preset->get_script_encryption_key().to_lower();
+ }
+
+ if (!p_path.ends_with(".gd") || script_mode == EditorExportPreset::MODE_SCRIPT_TEXT)
return;
Vector<uint8_t> file = FileAccess::get_file_as_array(p_path);
if (file.empty())
return;
+
String txt;
txt.parse_utf8((const char *)file.ptr(), file.size());
file = GDScriptTokenizerBuffer::parse_code_string(txt);
- if (file.empty())
- return;
-
- add_file(p_path.get_basename() + ".gdc", file, true);
+ if (!file.empty()) {
+
+ if (script_mode == EditorExportPreset::MODE_SCRIPT_ENCRYPTED) {
+
+ String tmp_path = EditorSettings::get_singleton()->get_cache_dir().plus_file("script.gde");
+ FileAccess *fa = FileAccess::open(tmp_path, FileAccess::WRITE);
+
+ Vector<uint8_t> key;
+ key.resize(32);
+ for (int i = 0; i < 32; i++) {
+ int v = 0;
+ if (i * 2 < script_key.length()) {
+ CharType ct = script_key[i * 2];
+ if (ct >= '0' && ct <= '9')
+ ct = ct - '0';
+ else if (ct >= 'a' && ct <= 'f')
+ ct = 10 + ct - 'a';
+ v |= ct << 4;
+ }
+
+ if (i * 2 + 1 < script_key.length()) {
+ CharType ct = script_key[i * 2 + 1];
+ if (ct >= '0' && ct <= '9')
+ ct = ct - '0';
+ else if (ct >= 'a' && ct <= 'f')
+ ct = 10 + ct - 'a';
+ v |= ct;
+ }
+ key.write[i] = v;
+ }
+ FileAccessEncrypted *fae = memnew(FileAccessEncrypted);
+ Error err = fae->open_and_parse(fa, key, FileAccessEncrypted::MODE_WRITE_AES256);
+
+ if (err == OK) {
+ fae->store_buffer(file.ptr(), file.size());
+ }
+
+ memdelete(fae);
+
+ file = FileAccess::get_file_as_array(tmp_path);
+ add_file(p_path.get_basename() + ".gde", file, true);
+
+ } else {
+
+ add_file(p_path.get_basename() + ".gdc", file, true);
+ }
+ }
}
};
@@ -87,9 +141,11 @@ void register_gdscript_types() {
script_language_gd = memnew(GDScriptLanguage);
ScriptServer::register_language(script_language_gd);
- resource_loader_gd = memnew(ResourceFormatLoaderGDScript);
+
+ resource_loader_gd.instance();
ResourceLoader::add_resource_format_loader(resource_loader_gd);
- resource_saver_gd = memnew(ResourceFormatSaverGDScript);
+
+ resource_saver_gd.instance();
ResourceSaver::add_resource_format_saver(resource_saver_gd);
#ifdef TOOLS_ENABLED
@@ -104,8 +160,10 @@ void unregister_gdscript_types() {
if (script_language_gd)
memdelete(script_language_gd);
- if (resource_loader_gd)
- memdelete(resource_loader_gd);
- if (resource_saver_gd)
- memdelete(resource_saver_gd);
+
+ ResourceLoader::remove_resource_format_loader(resource_loader_gd);
+ resource_loader_gd.unref();
+
+ ResourceSaver::remove_resource_format_saver(resource_saver_gd);
+ resource_saver_gd.unref();
}
diff --git a/modules/gdscript/register_types.h b/modules/gdscript/register_types.h
index 2b88a67c7e..0f01a4cdab 100644
--- a/modules/gdscript/register_types.h
+++ b/modules/gdscript/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gridmap/doc_classes/GridMap.xml b/modules/gridmap/doc_classes/GridMap.xml
index 9b9088dd82..2ea116d79b 100644
--- a/modules/gridmap/doc_classes/GridMap.xml
+++ b/modules/gridmap/doc_classes/GridMap.xml
@@ -52,7 +52,7 @@
<argument index="2" name="z" type="int">
</argument>
<description>
- The [MeshLibrary] item index located at the grid-based X, Y and Z coordinates. If the cell is empty, [INVALID_CELL_ITEM] will be returned.
+ The [MeshLibrary] item index located at the grid-based X, Y and Z coordinates. If the cell is empty, [constant INVALID_CELL_ITEM] will be returned.
</description>
</method>
<method name="get_cell_item_orientation" qualifiers="const">
@@ -192,13 +192,13 @@
</methods>
<members>
<member name="cell_center_x" type="bool" setter="set_center_x" getter="get_center_x">
- If [code]true[/code] grid items are centered on the X axis.
+ If [code]true[/code], grid items are centered on the X axis.
</member>
<member name="cell_center_y" type="bool" setter="set_center_y" getter="get_center_y">
- If [code]true[/code] grid items are centered on the Y axis.
+ If [code]true[/code], grid items are centered on the Y axis.
</member>
<member name="cell_center_z" type="bool" setter="set_center_z" getter="get_center_z">
- If [code]true[/code] grid items are centered on the Z axis.
+ If [code]true[/code], grid items are centered on the Z axis.
</member>
<member name="cell_octant_size" type="int" setter="set_octant_size" getter="get_octant_size">
The size of each octant measured in number of cells. This applies to all three axis.
diff --git a/modules/gridmap/grid_map.cpp b/modules/gridmap/grid_map.cpp
index 274a2f0249..fe1eac6dc9 100644
--- a/modules/gridmap/grid_map.cpp
+++ b/modules/gridmap/grid_map.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gridmap/grid_map.h b/modules/gridmap/grid_map.h
index 3d8be5c9c7..f4407099f5 100644
--- a/modules/gridmap/grid_map.h
+++ b/modules/gridmap/grid_map.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gridmap/grid_map_editor_plugin.cpp b/modules/gridmap/grid_map_editor_plugin.cpp
index 126b49832a..12c4a18a64 100644
--- a/modules/gridmap/grid_map_editor_plugin.cpp
+++ b/modules/gridmap/grid_map_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gridmap/grid_map_editor_plugin.h b/modules/gridmap/grid_map_editor_plugin.h
index 663274f46e..81a21a76ae 100644
--- a/modules/gridmap/grid_map_editor_plugin.h
+++ b/modules/gridmap/grid_map_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gridmap/register_types.cpp b/modules/gridmap/register_types.cpp
index 030286d651..03db5d323e 100644
--- a/modules/gridmap/register_types.cpp
+++ b/modules/gridmap/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/gridmap/register_types.h b/modules/gridmap/register_types.h
index 4ff107bec8..5a07ea84d9 100644
--- a/modules/gridmap/register_types.h
+++ b/modules/gridmap/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/hdr/image_loader_hdr.cpp b/modules/hdr/image_loader_hdr.cpp
index fc6779ce86..eb424d36f8 100644
--- a/modules/hdr/image_loader_hdr.cpp
+++ b/modules/hdr/image_loader_hdr.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/hdr/image_loader_hdr.h b/modules/hdr/image_loader_hdr.h
index 7175b38cc8..8ebf52def7 100644
--- a/modules/hdr/image_loader_hdr.h
+++ b/modules/hdr/image_loader_hdr.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/hdr/register_types.cpp b/modules/hdr/register_types.cpp
index 8688daad69..8a2b6f14d1 100644
--- a/modules/hdr/register_types.cpp
+++ b/modules/hdr/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/hdr/register_types.h b/modules/hdr/register_types.h
index e064f5d945..57a9058a89 100644
--- a/modules/hdr/register_types.h
+++ b/modules/hdr/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/jpg/image_loader_jpegd.cpp b/modules/jpg/image_loader_jpegd.cpp
index 24d40111cf..5493223cb0 100644
--- a/modules/jpg/image_loader_jpegd.cpp
+++ b/modules/jpg/image_loader_jpegd.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/jpg/image_loader_jpegd.h b/modules/jpg/image_loader_jpegd.h
index b5f0637c9b..9a96fe008d 100644
--- a/modules/jpg/image_loader_jpegd.h
+++ b/modules/jpg/image_loader_jpegd.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/jpg/register_types.cpp b/modules/jpg/register_types.cpp
index 450ac065f4..1febfdebf5 100644
--- a/modules/jpg/register_types.cpp
+++ b/modules/jpg/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/jpg/register_types.h b/modules/jpg/register_types.h
index 6f10c18c12..633160d941 100644
--- a/modules/jpg/register_types.h
+++ b/modules/jpg/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mbedtls/register_types.cpp b/modules/mbedtls/register_types.cpp
index 8548275eec..121ed5eb02 100755
--- a/modules/mbedtls/register_types.cpp
+++ b/modules/mbedtls/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mbedtls/register_types.h b/modules/mbedtls/register_types.h
index 3da0b1f1a0..535dae7999 100755
--- a/modules/mbedtls/register_types.h
+++ b/modules/mbedtls/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mbedtls/stream_peer_mbed_tls.cpp b/modules/mbedtls/stream_peer_mbed_tls.cpp
index 5c81f32e9e..973713f500 100755
--- a/modules/mbedtls/stream_peer_mbed_tls.cpp
+++ b/modules/mbedtls/stream_peer_mbed_tls.cpp
@@ -1,12 +1,12 @@
/*************************************************************************/
-/* stream_peer_openssl.cpp */
+/* stream_peer_mbed_tls.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mbedtls/stream_peer_mbed_tls.h b/modules/mbedtls/stream_peer_mbed_tls.h
index abf87b79cc..3ddbea3ce4 100755
--- a/modules/mbedtls/stream_peer_mbed_tls.h
+++ b/modules/mbedtls/stream_peer_mbed_tls.h
@@ -1,12 +1,12 @@
/*************************************************************************/
-/* stream_peer_openssl.h */
+/* stream_peer_mbed_tls.h */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mobile_vr/mobile_vr_interface.cpp b/modules/mobile_vr/mobile_vr_interface.cpp
index 87e4ddd900..78cc667718 100644
--- a/modules/mobile_vr/mobile_vr_interface.cpp
+++ b/modules/mobile_vr/mobile_vr_interface.cpp
@@ -1,12 +1,12 @@
/*************************************************************************/
-/* mobile_interface.cpp */
+/* mobile_vr_interface.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mobile_vr/mobile_vr_interface.h b/modules/mobile_vr/mobile_vr_interface.h
index 05b6331f94..adc420ea5f 100644
--- a/modules/mobile_vr/mobile_vr_interface.h
+++ b/modules/mobile_vr/mobile_vr_interface.h
@@ -1,12 +1,12 @@
/*************************************************************************/
-/* mobile_interface.h */
+/* mobile_vr_interface.h */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mobile_vr/register_types.cpp b/modules/mobile_vr/register_types.cpp
index edddaa87e1..2ff7987cae 100644
--- a/modules/mobile_vr/register_types.cpp
+++ b/modules/mobile_vr/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mobile_vr/register_types.h b/modules/mobile_vr/register_types.h
index 621f8dea80..340a7a4b2a 100644
--- a/modules/mobile_vr/register_types.h
+++ b/modules/mobile_vr/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/SCsub b/modules/mono/SCsub
index 0e5dd9b4cf..e1f5e2ef28 100644
--- a/modules/mono/SCsub
+++ b/modules/mono/SCsub
@@ -103,6 +103,16 @@ import os
def find_nuget_unix():
+ import os
+
+ if 'NUGET_PATH' in os.environ:
+ hint_path = os.environ['NUGET_PATH']
+ if os.path.isfile(hint_path) and os.access(hint_path, os.X_OK):
+ return hint_path
+ hint_path = os.path.join(hint_path, 'nuget')
+ if os.path.isfile(hint_path) and os.access(hint_path, os.X_OK):
+ return hint_path
+
import os.path
import sys
@@ -129,6 +139,16 @@ def find_nuget_unix():
def find_nuget_windows():
+ import os
+
+ if 'NUGET_PATH' in os.environ:
+ hint_path = os.environ['NUGET_PATH']
+ if os.path.isfile(hint_path) and os.access(hint_path, os.X_OK):
+ return hint_path
+ hint_path = os.path.join(hint_path, 'nuget.exe')
+ if os.path.isfile(hint_path) and os.access(hint_path, os.X_OK):
+ return hint_path
+
import mono_reg_utils as monoreg
mono_root = ''
@@ -160,14 +180,6 @@ def find_nuget_windows():
if os.path.isfile(hint_path) and os.access(hint_path, os.X_OK):
return hint_path
- if 'NUGET_PATH' in os.environ:
- hint_path = os.environ['NUGET_PATH']
- if os.path.isfile(hint_path) and os.access(hint_path, os.X_OK):
- return hint_path
- hint_path = os.path.join(hint_path, 'nuget.exe')
- if os.path.isfile(hint_path) and os.access(hint_path, os.X_OK):
- return hint_path
-
return None
diff --git a/modules/mono/config.py b/modules/mono/config.py
index 189699cca8..a81ecfce70 100644
--- a/modules/mono/config.py
+++ b/modules/mono/config.py
@@ -142,7 +142,9 @@ def configure(env):
copy_file(mono_bin_path, 'bin', mono_dll_name + '.dll')
else:
- sharedlib_ext = '.dylib' if sys.platform == 'darwin' else '.so'
+ is_apple = (sys.platform == 'darwin' or "osxcross" in env)
+
+ sharedlib_ext = '.dylib' if is_apple else '.so'
mono_root = ''
mono_lib_path = ''
@@ -154,7 +156,7 @@ def configure(env):
if os.getenv('MONO64_PREFIX'):
mono_root = os.getenv('MONO64_PREFIX')
- if not mono_root and sys.platform == 'darwin':
+ if not mono_root and is_apple:
# Try with some known directories under OSX
hint_dirs = ['/Library/Frameworks/Mono.framework/Versions/Current', '/usr/local/var/homebrew/linked/mono']
for hint_dir in hint_dirs:
@@ -190,14 +192,14 @@ def configure(env):
if mono_static:
mono_lib_file = os.path.join(mono_lib_path, 'lib' + mono_lib + '.a')
- if sys.platform == 'darwin':
+ if is_apple:
env.Append(LINKFLAGS=['-Wl,-force_load,' + mono_lib_file])
else:
env.Append(LINKFLAGS=['-Wl,-whole-archive', mono_lib_file, '-Wl,-no-whole-archive'])
else:
env.Append(LIBS=[mono_lib])
- if sys.platform == 'darwin':
+ if is_apple:
env.Append(LIBS=['iconv', 'pthread'])
else:
env.Append(LIBS=['m', 'rt', 'dl', 'pthread'])
diff --git a/modules/mono/csharp_script.cpp b/modules/mono/csharp_script.cpp
index 700e518cfc..13f8385745 100644
--- a/modules/mono/csharp_script.cpp
+++ b/modules/mono/csharp_script.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -50,6 +50,7 @@
#include "mono_gd/gd_mono_marshal.h"
#include "signal_awaiter_utils.h"
#include "utils/macros.h"
+#include "utils/mutex_utils.h"
#include "utils/string_utils.h"
#include "utils/thread_local.h"
@@ -378,60 +379,72 @@ static String variant_type_to_managed_name(const String &p_var_type_name) {
return "object";
if (!ClassDB::class_exists(p_var_type_name)) {
- Variant::Type var_types[] = {
- Variant::BOOL,
- Variant::INT,
- Variant::REAL,
- Variant::STRING,
- Variant::VECTOR2,
- Variant::RECT2,
- Variant::VECTOR3,
- Variant::TRANSFORM2D,
- Variant::PLANE,
- Variant::QUAT,
- Variant::AABB,
- Variant::BASIS,
- Variant::TRANSFORM,
- Variant::COLOR,
- Variant::NODE_PATH,
- Variant::_RID
- };
-
- for (int i = 0; i < sizeof(var_types) / sizeof(Variant::Type); i++) {
- if (p_var_type_name == Variant::get_type_name(var_types[i]))
- return p_var_type_name;
- }
+ return p_var_type_name;
+ }
- if (p_var_type_name == "String")
- return "string"; // I prefer this one >:[
+ if (p_var_type_name == Variant::get_type_name(Variant::OBJECT))
+ return "Godot.Object";
- // TODO these will be rewritten later into custom containers
+ if (p_var_type_name == Variant::get_type_name(Variant::REAL)) {
+#ifdef REAL_T_IS_DOUBLE
+ return "double";
+#else
+ return "float";
+#endif
+ }
- if (p_var_type_name == "Array")
- return "object[]";
+ if (p_var_type_name == Variant::get_type_name(Variant::STRING))
+ return "string"; // I prefer this one >:[
- if (p_var_type_name == "Dictionary")
- return "Dictionary<object, object>";
+ if (p_var_type_name == Variant::get_type_name(Variant::DICTIONARY))
+ return "Collections.Dictionary";
- if (p_var_type_name == "PoolByteArray")
- return "byte[]";
- if (p_var_type_name == "PoolIntArray")
- return "int[]";
- if (p_var_type_name == "PoolRealArray")
- return "float[]";
- if (p_var_type_name == "PoolStringArray")
- return "string[]";
- if (p_var_type_name == "PoolVector2Array")
- return "Vector2[]";
- if (p_var_type_name == "PoolVector3Array")
- return "Vector3[]";
- if (p_var_type_name == "PoolColorArray")
- return "Color[]";
+ if (p_var_type_name == Variant::get_type_name(Variant::ARRAY))
+ return "Collections.Array";
- return "object";
+ if (p_var_type_name == Variant::get_type_name(Variant::POOL_BYTE_ARRAY))
+ return "byte[]";
+ if (p_var_type_name == Variant::get_type_name(Variant::POOL_INT_ARRAY))
+ return "int[]";
+ if (p_var_type_name == Variant::get_type_name(Variant::POOL_REAL_ARRAY)) {
+#ifdef REAL_T_IS_DOUBLE
+ return "double[]";
+#else
+ return "float[]";
+#endif
+ }
+ if (p_var_type_name == Variant::get_type_name(Variant::POOL_STRING_ARRAY))
+ return "string[]";
+ if (p_var_type_name == Variant::get_type_name(Variant::POOL_VECTOR2_ARRAY))
+ return "Vector2[]";
+ if (p_var_type_name == Variant::get_type_name(Variant::POOL_VECTOR3_ARRAY))
+ return "Vector3[]";
+ if (p_var_type_name == Variant::get_type_name(Variant::POOL_COLOR_ARRAY))
+ return "Color[]";
+
+ Variant::Type var_types[] = {
+ Variant::BOOL,
+ Variant::INT,
+ Variant::VECTOR2,
+ Variant::RECT2,
+ Variant::VECTOR3,
+ Variant::TRANSFORM2D,
+ Variant::PLANE,
+ Variant::QUAT,
+ Variant::AABB,
+ Variant::BASIS,
+ Variant::TRANSFORM,
+ Variant::COLOR,
+ Variant::NODE_PATH,
+ Variant::_RID
+ };
+
+ for (int i = 0; i < sizeof(var_types) / sizeof(Variant::Type); i++) {
+ if (p_var_type_name == Variant::get_type_name(var_types[i]))
+ return p_var_type_name;
}
- return p_var_type_name;
+ return "object";
}
String CSharpLanguage::make_function(const String &, const String &p_name, const PoolStringArray &p_args) const {
@@ -507,8 +520,7 @@ Vector<ScriptLanguage::StackInfo> CSharpLanguage::stack_trace_get_info(MonoObjec
MonoException *exc = NULL;
- GDMonoUtils::StackTrace_GetFrames st_get_frames = CACHED_METHOD_THUNK(System_Diagnostics_StackTrace, GetFrames);
- MonoArray *frames = st_get_frames(p_stack_trace, (MonoObject **)&exc);
+ MonoArray *frames = invoke_method_thunk(CACHED_METHOD_THUNK(System_Diagnostics_StackTrace, GetFrames), p_stack_trace, (MonoObject **)&exc);
if (exc) {
GDMonoUtils::debug_print_unhandled_exception(exc);
@@ -532,7 +544,7 @@ Vector<ScriptLanguage::StackInfo> CSharpLanguage::stack_trace_get_info(MonoObjec
MonoString *file_name;
int file_line_num;
MonoString *method_decl;
- get_sf_info(frame, &file_name, &file_line_num, &method_decl, (MonoObject **)&exc);
+ invoke_method_thunk(get_sf_info, frame, &file_name, &file_line_num, &method_decl, (MonoObject **)&exc);
if (exc) {
GDMonoUtils::debug_print_unhandled_exception(exc);
@@ -561,10 +573,8 @@ void CSharpLanguage::frame() {
MonoObject *task_scheduler = task_scheduler_handle->get_target();
if (task_scheduler) {
- GDMonoUtils::GodotTaskScheduler_Activate thunk = CACHED_METHOD_THUNK(GodotTaskScheduler, Activate);
-
MonoException *exc = NULL;
- thunk(task_scheduler, (MonoObject **)&exc);
+ invoke_method_thunk(CACHED_METHOD_THUNK(GodotTaskScheduler, Activate), task_scheduler, (MonoObject **)&exc);
if (exc) {
GDMonoUtils::debug_unhandled_exception(exc);
@@ -599,24 +609,20 @@ void CSharpLanguage::reload_all_scripts() {
#ifdef DEBUG_ENABLED
-#ifndef NO_THREADS
- lock->lock();
-#endif
-
List<Ref<CSharpScript> > scripts;
- SelfList<CSharpScript> *elem = script_list.first();
- while (elem) {
- if (elem->self()->get_path().is_resource_file()) {
- scripts.push_back(Ref<CSharpScript>(elem->self())); //cast to gdscript to avoid being erased by accident
+ {
+ SCOPED_MUTEX_LOCK(script_instances_mutex);
+
+ SelfList<CSharpScript> *elem = script_list.first();
+ while (elem) {
+ if (elem->self()->get_path().is_resource_file()) {
+ scripts.push_back(Ref<CSharpScript>(elem->self())); //cast to gdscript to avoid being erased by accident
+ }
+ elem = elem->next();
}
- elem = elem->next();
}
-#ifndef NO_THREADS
- lock->unlock();
-#endif
-
//as scripts are going to be reloaded, must proceed without locking here
scripts.sort_custom<CSharpScriptDepSort>(); //update in inheritance dependency order
@@ -625,6 +631,7 @@ void CSharpLanguage::reload_all_scripts() {
E->get()->load_source_code(E->get()->get_path());
E->get()->reload(true);
}
+
#endif
}
@@ -634,15 +641,17 @@ void CSharpLanguage::reload_tool_script(const Ref<Script> &p_script, bool p_soft
#ifdef TOOLS_ENABLED
MonoReloadNode::get_singleton()->restart_reload_timer();
- reload_assemblies_if_needed(p_soft_reload);
+ if (is_assembly_reloading_needed()) {
+ reload_assemblies(p_soft_reload);
+ }
#endif
}
#ifdef TOOLS_ENABLED
-void CSharpLanguage::reload_assemblies_if_needed(bool p_soft_reload) {
+bool CSharpLanguage::is_assembly_reloading_needed() {
if (!gdmono->is_runtime_initialized())
- return;
+ return false;
GDMonoAssembly *proj_assembly = gdmono->get_project_assembly();
@@ -660,164 +669,208 @@ void CSharpLanguage::reload_assemblies_if_needed(bool p_soft_reload) {
// Maybe it wasn't loaded from the default path, so check this as well
proj_asm_path = GodotSharpDirs::get_res_temp_assemblies_dir().plus_file(name);
if (!FileAccess::exists(proj_asm_path))
- return; // No assembly to load
+ return false; // No assembly to load
}
if (FileAccess::get_modified_time(proj_asm_path) <= proj_assembly->get_modified_time())
- return; // Already up to date
+ return false; // Already up to date
} else {
if (!FileAccess::exists(GodotSharpDirs::get_res_temp_assemblies_dir().plus_file(name)))
- return; // No assembly to load
+ return false; // No assembly to load
}
if (!gdmono->get_core_api_assembly() && gdmono->metadata_is_api_assembly_invalidated(APIAssembly::API_CORE))
- return; // The core API assembly to load is invalidated
+ return false; // The core API assembly to load is invalidated
if (!gdmono->get_editor_api_assembly() && gdmono->metadata_is_api_assembly_invalidated(APIAssembly::API_EDITOR))
- return; // The editor API assembly to load is invalidated
+ return false; // The editor API assembly to load is invalidated
-#ifndef NO_THREADS
- lock->lock();
-#endif
+ return true;
+}
+
+void CSharpLanguage::reload_assemblies(bool p_soft_reload) {
+
+ if (!gdmono->is_runtime_initialized())
+ return;
+
+ // There is no soft reloading with Mono. It's always hard reloading.
List<Ref<CSharpScript> > scripts;
- SelfList<CSharpScript> *elem = script_list.first();
- while (elem) {
- if (elem->self()->get_path().is_resource_file()) {
+ {
+ SCOPED_MUTEX_LOCK(script_instances_mutex);
- scripts.push_back(Ref<CSharpScript>(elem->self())); //cast to CSharpScript to avoid being erased by accident
+ for (SelfList<CSharpScript> *elem = script_list.first(); elem; elem = elem->next()) {
+ if (elem->self()->get_path().is_resource_file()) {
+ // Cast to CSharpScript to avoid being erased by accident
+ scripts.push_back(Ref<CSharpScript>(elem->self()));
+ }
}
- elem = elem->next();
}
-#ifndef NO_THREADS
- lock->unlock();
-#endif
+ List<Ref<CSharpScript> > to_reload;
- //when someone asks you why dynamically typed languages are easier to write....
+ // As scripts are going to be reloaded, must proceed without locking here
- Map<Ref<CSharpScript>, Map<ObjectID, List<Pair<StringName, Variant> > > > to_reload;
+ scripts.sort_custom<CSharpScriptDepSort>(); // Update in inheritance dependency order
- //as scripts are going to be reloaded, must proceed without locking here
+ for (List<Ref<CSharpScript> >::Element *E = scripts.front(); E; E = E->next()) {
- scripts.sort_custom<CSharpScriptDepSort>(); //update in inheritance dependency order
+ Ref<CSharpScript> &script = E->get();
- for (List<Ref<CSharpScript> >::Element *E = scripts.front(); E; E = E->next()) {
+ to_reload.push_back(script);
- to_reload.insert(E->get(), Map<ObjectID, List<Pair<StringName, Variant> > >());
+ // Script::instances are deleted during managed object disposal, which happens on domain finalize.
+ // Only placeholders are kept. Therefore we need to keep a copy before that happens.
- if (!p_soft_reload) {
+ for (Set<Object *>::Element *E = script->instances.front(); E; E = E->next()) {
+ script->pending_reload_instances.insert(E->get()->get_instance_id());
+ }
- //save state and remove script from instances
- Map<ObjectID, List<Pair<StringName, Variant> > > &map = to_reload[E->get()];
+#ifdef TOOLS_ENABLED
+ for (Set<PlaceHolderScriptInstance *>::Element *E = script->placeholders.front(); E; E = E->next()) {
+ script->pending_reload_instances.insert(E->get()->get_owner()->get_instance_id());
+ }
+#endif
- while (E->get()->instances.front()) {
- Object *obj = E->get()->instances.front()->get();
- //save instance info
- List<Pair<StringName, Variant> > state;
- if (obj->get_script_instance()) {
+ // FIXME: What about references? Need to keep them alive if only managed code references them.
- obj->get_script_instance()->get_property_state(state);
+ // Save state and remove script from instances
+ Map<ObjectID, CSharpScript::StateBackup> &owners_map = script->pending_reload_state;
- Ref<MonoGCHandle> gchandle = CAST_CSHARP_INSTANCE(obj->get_script_instance())->gchandle;
- if (gchandle.is_valid())
- gchandle->release();
+ while (script->instances.front()) {
+ Object *obj = script->instances.front()->get();
+ // Save instance info
+ CSharpScript::StateBackup state;
- map[obj->get_instance_id()] = state;
- obj->set_script(RefPtr());
- }
- }
+ ERR_CONTINUE(!obj->get_script_instance());
- //same thing for placeholders
- while (E->get()->placeholders.size()) {
-
- Object *obj = E->get()->placeholders.front()->get()->get_owner();
- //save instance info
- List<Pair<StringName, Variant> > state;
- if (obj->get_script_instance()) {
- obj->get_script_instance()->get_property_state(state);
- map[obj->get_instance_id()] = state;
- obj->set_script(RefPtr());
- } else {
- // no instance found. Let's remove it so we don't loop forever
- E->get()->placeholders.erase(E->get()->placeholders.front()->get());
- }
- }
+ // TODO: Proper state backup (Not only variants, serialize managed state of scripts)
+ obj->get_script_instance()->get_property_state(state.properties);
- for (Map<ObjectID, List<Pair<StringName, Variant> > >::Element *F = E->get()->pending_reload_state.front(); F; F = F->next()) {
- map[F->key()] = F->get(); //pending to reload, use this one instead
- }
+ Ref<MonoGCHandle> gchandle = CAST_CSHARP_INSTANCE(obj->get_script_instance())->gchandle;
+ if (gchandle.is_valid())
+ gchandle->release();
- E->get()->_clear();
+ owners_map[obj->get_instance_id()] = state;
+ obj->set_script(RefPtr()); // Remove script and existing script instances (placeholder are not removed before domain reload)
}
+
+ script->_clear();
}
+ // Do domain reload
if (gdmono->reload_scripts_domain() != OK) {
// Failed to reload the scripts domain
// Make sure to add the scripts back to their owners before returning
- for (Map<Ref<CSharpScript>, Map<ObjectID, List<Pair<StringName, Variant> > > >::Element *E = to_reload.front(); E; E = E->next()) {
- Ref<CSharpScript> scr = E->key();
- for (Map<ObjectID, List<Pair<StringName, Variant> > >::Element *F = E->get().front(); F; F = F->next()) {
+ for (List<Ref<CSharpScript> >::Element *E = to_reload.front(); E; E = E->next()) {
+ Ref<CSharpScript> scr = E->get();
+
+ for (const Map<ObjectID, CSharpScript::StateBackup>::Element *F = scr->pending_reload_state.front(); F; F = F->next()) {
Object *obj = ObjectDB::get_instance(F->key());
+
if (!obj)
continue;
+
+ ObjectID obj_id = obj->get_instance_id();
+
+ // Use a placeholder for now to avoid losing the state when saving a scene
+
obj->set_script(scr.get_ref_ptr());
- // Save reload state for next time if not saved
- if (!scr->pending_reload_state.has(obj->get_instance_id())) {
- scr->pending_reload_state[obj->get_instance_id()] = F->get();
+
+ PlaceHolderScriptInstance *placeholder = scr->placeholder_instance_create(obj);
+ obj->set_script_instance(placeholder);
+
+ // Even though build didn't fail, this tells the placeholder to keep properties and
+ // it allows using property_set_fallback for restoring the state without a valid script.
+ scr->placeholder_fallback_enabled = true;
+
+ // Restore Variant properties state, it will be kept by the placeholder until the next script reloading
+ for (List<Pair<StringName, Variant> >::Element *G = scr->pending_reload_state[obj_id].properties.front(); G; G = G->next()) {
+ placeholder->property_set_fallback(G->get().first, G->get().second, NULL);
}
+
+ scr->pending_reload_state.erase(obj_id);
}
}
return;
}
- for (Map<Ref<CSharpScript>, Map<ObjectID, List<Pair<StringName, Variant> > > >::Element *E = to_reload.front(); E; E = E->next()) {
+ for (List<Ref<CSharpScript> >::Element *E = to_reload.front(); E; E = E->next()) {
- Ref<CSharpScript> scr = E->key();
+ Ref<CSharpScript> scr = E->get();
scr->exports_invalidated = true;
scr->signals_invalidated = true;
scr->reload(p_soft_reload);
scr->update_exports();
- //restore state if saved
- for (Map<ObjectID, List<Pair<StringName, Variant> > >::Element *F = E->get().front(); F; F = F->next()) {
+ {
+#ifdef DEBUG_ENABLED
+ for (Set<ObjectID>::Element *F = scr->pending_reload_instances.front(); F; F = F->next()) {
+ ObjectID obj_id = F->get();
+ Object *obj = ObjectDB::get_instance(obj_id);
+
+ if (!obj) {
+ scr->pending_reload_state.erase(obj_id);
+ continue;
+ }
+
+ ScriptInstance *si = obj->get_script_instance();
- Object *obj = ObjectDB::get_instance(F->key());
- if (!obj)
- continue;
+#ifdef TOOLS_ENABLED
+ if (si) {
+ // If the script instance is not null, then it must be a placeholder.
+ // Non-placeholder script instances are removed in godot_icall_Object_Disposed.
+ CRASH_COND(!si->is_placeholder());
- if (!p_soft_reload) {
- //clear it just in case (may be a pending reload state)
- obj->set_script(RefPtr());
- }
- obj->set_script(scr.get_ref_ptr());
- if (!obj->get_script_instance()) {
- //failed, save reload state for next time if not saved
- if (!scr->pending_reload_state.has(obj->get_instance_id())) {
- scr->pending_reload_state[obj->get_instance_id()] = F->get();
+ if (scr->is_tool() || ScriptServer::is_scripting_enabled()) {
+ // Replace placeholder with a script instance
+
+ CSharpScript::StateBackup &state_backup = scr->pending_reload_state[obj_id];
+
+ // Backup placeholder script instance state before replacing it with a script instance
+ obj->get_script_instance()->get_property_state(state_backup.properties);
+
+ ScriptInstance *script_instance = scr->instance_create(obj);
+
+ if (script_instance) {
+ scr->placeholders.erase(static_cast<PlaceHolderScriptInstance *>(si));
+ obj->set_script_instance(script_instance);
+ }
+
+ // TODO: Restore serialized state
+
+ for (List<Pair<StringName, Variant> >::Element *G = state_backup.properties.front(); G; G = G->next()) {
+ script_instance->set(G->get().first, G->get().second);
+ }
+
+ scr->pending_reload_state.erase(obj_id);
+ }
+
+ continue;
}
- continue;
- }
+#else
+ CRASH_COND(si != NULL);
+#endif
+ // Re-create script instance
- if (scr->valid && scr->is_tool() && obj->get_script_instance()->is_placeholder()) {
- // Script instance was a placeholder, but now the script was built successfully and is a tool script.
- // We have to replace the placeholder with an actual C# script instance.
- scr->placeholders.erase(static_cast<PlaceHolderScriptInstance *>(obj->get_script_instance()));
- ScriptInstance *script_instance = scr->instance_create(obj);
- obj->set_script_instance(script_instance); // Not necessary as it's already done in instance_create, but just in case...
- }
+ obj->set_script(scr.get_ref_ptr()); // will create the script instance as well
- for (List<Pair<StringName, Variant> >::Element *G = F->get().front(); G; G = G->next()) {
- obj->get_script_instance()->set(G->get().first, G->get().second);
+ // TODO: Restore serialized state
+
+ for (List<Pair<StringName, Variant> >::Element *G = scr->pending_reload_state[obj_id].properties.front(); G; G = G->next()) {
+ obj->get_script_instance()->set(G->get().first, G->get().second);
+ }
+
+ scr->pending_reload_state.erase(obj_id);
}
+#endif
- scr->pending_reload_state.erase(obj->get_instance_id()); //as it reloaded, remove pending state
+ scr->pending_reload_instances.clear();
}
-
- //if instance states were saved, set them!
}
+ // FIXME: Hack to refresh editor in order to display new properties and signals. See if there is a better alternative.
if (Engine::get_singleton()->is_editor_hint()) {
EditorNode::get_singleton()->get_inspector()->update_tree();
NodeDock::singleton->update_lists();
@@ -940,27 +993,18 @@ void CSharpLanguage::set_language_index(int p_idx) {
void CSharpLanguage::release_script_gchandle(Ref<MonoGCHandle> &p_gchandle) {
- if (!p_gchandle->is_released()) { // Do not locking unnecessarily
-#ifndef NO_THREADS
- get_singleton()->script_gchandle_release_lock->lock();
-#endif
-
+ if (!p_gchandle->is_released()) { // Do not lock unnecessarily
+ SCOPED_MUTEX_LOCK(get_singleton()->script_gchandle_release_mutex);
p_gchandle->release();
-
-#ifndef NO_THREADS
- get_singleton()->script_gchandle_release_lock->unlock();
-#endif
}
}
-void CSharpLanguage::release_script_gchandle(MonoObject *p_pinned_expected_obj, Ref<MonoGCHandle> &p_gchandle) {
+void CSharpLanguage::release_script_gchandle(MonoObject *p_expected_obj, Ref<MonoGCHandle> &p_gchandle) {
- uint32_t pinned_gchandle = MonoGCHandle::new_strong_handle_pinned(p_pinned_expected_obj); // we might lock after this, so pin it
+ uint32_t pinned_gchandle = MonoGCHandle::new_strong_handle_pinned(p_expected_obj); // We might lock after this, so pin it
- if (!p_gchandle->is_released()) { // Do not locking unnecessarily
-#ifndef NO_THREADS
- get_singleton()->script_gchandle_release_lock->lock();
-#endif
+ if (!p_gchandle->is_released()) { // Do not lock unnecessarily
+ SCOPED_MUTEX_LOCK(get_singleton()->script_gchandle_release_mutex);
MonoObject *target = p_gchandle->get_target();
@@ -968,13 +1012,9 @@ void CSharpLanguage::release_script_gchandle(MonoObject *p_pinned_expected_obj,
// already released and could have been replaced) or if we can't get its target MonoObject*
// (which doesn't necessarily mean it was released, and we want it released in order to
// avoid locking other threads unnecessarily).
- if (target == p_pinned_expected_obj || target == NULL) {
+ if (target == p_expected_obj || target == NULL) {
p_gchandle->release();
}
-
-#ifndef NO_THREADS
- get_singleton()->script_gchandle_release_lock->unlock();
-#endif
}
MonoGCHandle::free_handle(pinned_gchandle);
@@ -990,13 +1030,13 @@ CSharpLanguage::CSharpLanguage() {
gdmono = NULL;
#ifdef NO_THREADS
- lock = NULL;
- gchandle_bind_lock = NULL;
- script_gchandle_release_lock = NULL;
+ script_instances_mutex = NULL;
+ script_gchandle_release_mutex = NULL;
+ language_bind_mutex = NULL;
#else
- lock = Mutex::create();
- script_bind_lock = Mutex::create();
- script_gchandle_release_lock = Mutex::create();
+ script_instances_mutex = Mutex::create();
+ script_gchandle_release_mutex = Mutex::create();
+ language_bind_mutex = Mutex::create();
#endif
lang_idx = -1;
@@ -1006,19 +1046,19 @@ CSharpLanguage::~CSharpLanguage() {
finish();
- if (lock) {
- memdelete(lock);
- lock = NULL;
+ if (script_instances_mutex) {
+ memdelete(script_instances_mutex);
+ script_instances_mutex = NULL;
}
- if (script_bind_lock) {
- memdelete(script_bind_lock);
- script_bind_lock = NULL;
+ if (language_bind_mutex) {
+ memdelete(language_bind_mutex);
+ language_bind_mutex = NULL;
}
- if (script_gchandle_release_lock) {
- memdelete(script_gchandle_release_lock);
- script_gchandle_release_lock = NULL;
+ if (script_gchandle_release_mutex) {
+ memdelete(script_gchandle_release_mutex);
+ script_gchandle_release_mutex = NULL;
}
singleton = NULL;
@@ -1055,15 +1095,12 @@ void *CSharpLanguage::alloc_instance_binding_data(Object *p_object) {
script_binding.wrapper_class = type_class; // cache
script_binding.gchandle = MonoGCHandle::create_strong(mono_object);
-#ifndef NO_THREADS
- script_bind_lock->lock();
-#endif
-
- void *data = (void *)script_bindings.insert(p_object, script_binding);
+ void *data;
-#ifndef NO_THREADS
- script_bind_lock->unlock();
-#endif
+ {
+ SCOPED_MUTEX_LOCK(language_bind_mutex);
+ data = (void *)script_bindings.insert(p_object, script_binding);
+ }
// Tie managed to unmanaged
Reference *ref = Object::cast_to<Reference>(p_object);
@@ -1093,23 +1130,19 @@ void CSharpLanguage::free_instance_binding_data(void *p_data) {
if (finalizing)
return; // inside CSharpLanguage::finish(), all the gchandle bindings are released there
-#ifndef NO_THREADS
- script_bind_lock->lock();
-#endif
-
- Map<Object *, CSharpScriptBinding>::Element *data = (Map<Object *, CSharpScriptBinding>::Element *)p_data;
+ {
+ SCOPED_MUTEX_LOCK(language_bind_mutex);
- // Set the native instance field to IntPtr.Zero, if not yet garbage collected
- MonoObject *mono_object = data->value().gchandle->get_target();
- if (mono_object) {
- CACHED_FIELD(GodotObject, ptr)->set_value_raw(mono_object, NULL);
- }
+ Map<Object *, CSharpScriptBinding>::Element *data = (Map<Object *, CSharpScriptBinding>::Element *)p_data;
- script_bindings.erase(data);
+ // Set the native instance field to IntPtr.Zero, if not yet garbage collected
+ MonoObject *mono_object = data->value().gchandle->get_target();
+ if (mono_object) {
+ CACHED_FIELD(GodotObject, ptr)->set_value_raw(mono_object, NULL);
+ }
-#ifndef NO_THREADS
- script_bind_lock->unlock();
-#endif
+ script_bindings.erase(data);
+ }
}
void CSharpLanguage::refcount_incremented_instance_binding(Object *p_object) {
@@ -1156,7 +1189,7 @@ bool CSharpLanguage::refcount_decremented_instance_binding(Object *p_object) {
return refcount == 0;
Ref<MonoGCHandle> &gchandle = ((Map<Object *, CSharpScriptBinding>::Element *)data)->get().gchandle;
- if (refcount == 1 && !gchandle->is_weak()) { // The managed side also holds a reference, hence 1 instead of 0
+ if (refcount == 1 && gchandle.is_valid() && !gchandle->is_weak()) { // The managed side also holds a reference, hence 1 instead of 0
// If owner owner is no longer referenced by the unmanaged side,
// the managed instance takes responsibility of deleting the owner when GCed.
@@ -1524,7 +1557,7 @@ void CSharpInstance::mono_object_disposed_baseref(MonoObject *p_obj, bool p_is_f
} else {
r_owner_deleted = false;
CSharpLanguage::get_singleton()->release_script_gchandle(p_obj, gchandle);
- if (p_is_finalizer) {
+ if (p_is_finalizer && !GDMono::get_singleton()->is_finalizing_scripts_domain()) {
// If the native instance is still alive, then it was
// referenced from another thread before the finalizer could
// unreference it and delete it, so we want to keep it.
@@ -1651,6 +1684,8 @@ void CSharpInstance::notification(int p_notification) {
// It's safe to call Dispose() multiple times and NOTIFICATION_PREDELETE is guaranteed
// to be sent at least once, which happens right before the call to the destructor.
+ predelete_notified = true;
+
if (base_ref) {
// It's not safe to proceed if the owner derives Reference and the refcount reached 0.
// At this point, Dispose() was already called (manually or from the finalizer) so
@@ -1666,10 +1701,8 @@ void CSharpInstance::notification(int p_notification) {
MonoObject *mono_object = get_mono_object();
ERR_FAIL_NULL(mono_object);
- GDMonoUtils::GodotObject_Dispose thunk = CACHED_METHOD_THUNK(GodotObject, Dispose);
-
MonoException *exc = NULL;
- thunk(mono_object, (MonoObject **)&exc);
+ GDMonoUtils::dispose(mono_object, &exc);
if (exc) {
GDMonoUtils::set_pending_exception(exc);
@@ -1720,12 +1753,35 @@ CSharpInstance::CSharpInstance() :
owner(NULL),
base_ref(false),
ref_dying(false),
- unsafe_referenced(false) {
+ unsafe_referenced(false),
+ predelete_notified(false),
+ destructing_script_instance(false) {
}
CSharpInstance::~CSharpInstance() {
if (gchandle.is_valid()) {
+ if (!predelete_notified && !ref_dying) {
+ // This destructor is not called from the owners destructor.
+ // This could be being called from the owner's set_script_instance method,
+ // meaning this script is being replaced with another one. If this is the case,
+ // we must call Dispose here, because Dispose calls owner->set_script_instance(NULL)
+ // and that would mess up with the new script instance if called later.
+
+ MonoObject *mono_object = gchandle->get_target();
+
+ if (mono_object) {
+ MonoException *exc = NULL;
+ destructing_script_instance = true;
+ GDMonoUtils::dispose(mono_object, &exc);
+ destructing_script_instance = false;
+
+ if (exc) {
+ GDMonoUtils::set_pending_exception(exc);
+ }
+ }
+ }
+
gchandle->release(); // Make sure it's released
}
@@ -1734,9 +1790,7 @@ CSharpInstance::~CSharpInstance() {
}
if (script.is_valid() && owner) {
-#ifndef NO_THREADS
- CSharpLanguage::singleton->lock->lock();
-#endif
+ SCOPED_MUTEX_LOCK(CSharpLanguage::get_singleton()->script_instances_mutex);
#ifdef DEBUG_ENABLED
// CSharpInstance must not be created unless it's going to be added to the list for sure
@@ -1746,10 +1800,6 @@ CSharpInstance::~CSharpInstance() {
#else
script->instances.erase(owner);
#endif
-
-#ifndef NO_THREADS
- CSharpLanguage::singleton->lock->unlock();
-#endif
}
}
@@ -1780,12 +1830,10 @@ void CSharpScript::_update_exports_values(Map<StringName, Variant> &values, List
bool CSharpScript::_update_exports() {
#ifdef TOOLS_ENABLED
- if (!valid) {
- for (Set<PlaceHolderScriptInstance *>::Element *E = placeholders.front(); E; E = E->next()) {
- E->get()->set_build_failed(true);
- }
+ placeholder_fallback_enabled = true; // until proven otherwise
+
+ if (!valid)
return false;
- }
bool changed = false;
@@ -1882,10 +1930,8 @@ bool CSharpScript::_update_exports() {
// Dispose the temporary managed instance
- GDMonoUtils::GodotObject_Dispose thunk = CACHED_METHOD_THUNK(GodotObject, Dispose);
-
MonoException *exc = NULL;
- thunk(tmp_object, (MonoObject **)&exc);
+ GDMonoUtils::dispose(tmp_object, &exc);
if (exc) {
ERR_PRINT("Exception thrown from method Dispose() of temporary MonoObject:");
@@ -1896,6 +1942,8 @@ bool CSharpScript::_update_exports() {
tmp_object = NULL;
}
+ placeholder_fallback_enabled = false;
+
if (placeholders.size()) {
// Update placeholders if any
Map<StringName, Variant> values;
@@ -1903,7 +1951,6 @@ bool CSharpScript::_update_exports() {
_update_exports_values(values, propnames);
for (Set<PlaceHolderScriptInstance *>::Element *E = placeholders.front(); E; E = E->next()) {
- E->get()->set_build_failed(false);
E->get()->update(propnames, values);
}
}
@@ -2312,17 +2359,13 @@ CSharpInstance *CSharpScript::_create_instance(const Variant **p_args, int p_arg
ERR_FAIL_V(NULL);
}
- uint32_t pinned_gchandle = MonoGCHandle::new_strong_handle_pinned(mono_object); // we might lock after this, so pin it
-
-#ifndef NO_THREADS
- CSharpLanguage::singleton->lock->lock();
-#endif
-
- instances.insert(instance->owner);
+ // Tie managed to unmanaged
+ instance->gchandle = MonoGCHandle::create_strong(mono_object);
-#ifndef NO_THREADS
- CSharpLanguage::singleton->lock->unlock();
-#endif
+ {
+ SCOPED_MUTEX_LOCK(CSharpLanguage::get_singleton()->script_instances_mutex);
+ instances.insert(instance->owner);
+ }
CACHED_FIELD(GodotObject, ptr)->set_value_raw(mono_object, instance->owner);
@@ -2330,13 +2373,8 @@ CSharpInstance *CSharpScript::_create_instance(const Variant **p_args, int p_arg
GDMonoMethod *ctor = script_class->get_method(CACHED_STRING_NAME(dotctor), p_argcount);
ctor->invoke(mono_object, p_args);
- // Tie managed to unmanaged
- instance->gchandle = MonoGCHandle::create_strong(mono_object);
-
/* STEP 3, PARTY */
- MonoGCHandle::free_handle(pinned_gchandle);
-
//@TODO make thread safe
return instance;
}
@@ -2411,17 +2449,8 @@ PlaceHolderScriptInstance *CSharpScript::placeholder_instance_create(Object *p_t
bool CSharpScript::instance_has(const Object *p_this) const {
-#ifndef NO_THREADS
- CSharpLanguage::singleton->lock->lock();
-#endif
-
- bool ret = instances.has((Object *)p_this);
-
-#ifndef NO_THREADS
- CSharpLanguage::singleton->lock->unlock();
-#endif
-
- return ret;
+ SCOPED_MUTEX_LOCK(CSharpLanguage::get_singleton()->script_instances_mutex);
+ return instances.has((Object *)p_this);
}
bool CSharpScript::has_source_code() const {
@@ -2444,6 +2473,18 @@ void CSharpScript::set_source_code(const String &p_code) {
#endif
}
+void CSharpScript::get_script_method_list(List<MethodInfo> *p_list) const {
+
+ if (!script_class)
+ return;
+
+ // TODO: Filter out things unsuitable for explicit calls, like constructors.
+ const Vector<GDMonoMethod *> &methods = script_class->get_all_methods();
+ for (int i = 0; i < methods.size(); ++i) {
+ p_list->push_back(methods[i]->get_method_info());
+ }
+}
+
bool CSharpScript::has_method(const StringName &p_method) const {
if (!script_class)
@@ -2452,17 +2493,32 @@ bool CSharpScript::has_method(const StringName &p_method) const {
return script_class->has_fetched_method_unknown_params(p_method);
}
-Error CSharpScript::reload(bool p_keep_state) {
+MethodInfo CSharpScript::get_method_info(const StringName &p_method) const {
-#ifndef NO_THREADS
- CSharpLanguage::singleton->lock->lock();
-#endif
+ if (!script_class)
+ return MethodInfo();
- bool has_instances = instances.size();
+ GDMonoClass *top = script_class;
-#ifndef NO_THREADS
- CSharpLanguage::singleton->lock->unlock();
-#endif
+ while (top && top != native) {
+ GDMonoMethod *params = top->get_fetched_method_unknown_params(p_method);
+ if (params) {
+ return params->get_method_info();
+ }
+
+ top = top->get_parent_class();
+ }
+
+ return MethodInfo();
+}
+
+Error CSharpScript::reload(bool p_keep_state) {
+
+ bool has_instances;
+ {
+ SCOPED_MUTEX_LOCK(CSharpLanguage::get_singleton()->script_instances_mutex);
+ has_instances = instances.size();
+ }
ERR_FAIL_COND_V(!p_keep_state && has_instances, ERR_ALREADY_IN_USE);
@@ -2640,6 +2696,7 @@ CSharpScript::CSharpScript() :
#ifdef TOOLS_ENABLED
source_changed_cache = false;
+ placeholder_fallback_enabled = false;
exports_invalidated = true;
#endif
@@ -2648,35 +2705,19 @@ CSharpScript::CSharpScript() :
_resource_path_changed();
#ifdef DEBUG_ENABLED
-
-#ifndef NO_THREADS
- CSharpLanguage::get_singleton()->lock->lock();
-#endif
-
- CSharpLanguage::get_singleton()->script_list.add(&script_list);
-
-#ifndef NO_THREADS
- CSharpLanguage::get_singleton()->lock->unlock();
+ {
+ SCOPED_MUTEX_LOCK(CSharpLanguage::get_singleton()->script_instances_mutex);
+ CSharpLanguage::get_singleton()->script_list.add(&this->script_list);
+ }
#endif
-
-#endif // DEBUG_ENABLED
}
CSharpScript::~CSharpScript() {
#ifdef DEBUG_ENABLED
-
-#ifndef NO_THREADS
- CSharpLanguage::get_singleton()->lock->lock();
+ SCOPED_MUTEX_LOCK(CSharpLanguage::get_singleton()->script_instances_mutex);
+ CSharpLanguage::get_singleton()->script_list.remove(&this->script_list);
#endif
-
- CSharpLanguage::get_singleton()->script_list.remove(&script_list);
-
-#ifndef NO_THREADS
- CSharpLanguage::get_singleton()->lock->unlock();
-#endif
-
-#endif // DEBUG_ENABLED
}
/*************** RESOURCE ***************/
diff --git a/modules/mono/csharp_script.h b/modules/mono/csharp_script.h
index fc604df2a0..e554e1f41f 100644
--- a/modules/mono/csharp_script.h
+++ b/modules/mono/csharp_script.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -82,6 +82,21 @@ class CSharpScript : public Script {
Set<Object *> instances;
+#ifdef DEBUG_ENABLED
+ Set<ObjectID> pending_reload_instances;
+#endif
+
+ struct StateBackup {
+ // TODO
+ // Replace with buffer containing the serialized state of managed scripts.
+ // Keep variant state backup to use only with script instance placeholders.
+ List<Pair<StringName, Variant> > properties;
+ };
+
+#ifdef TOOLS_ENABLED
+ Map<ObjectID, CSharpScript::StateBackup> pending_reload_state;
+#endif
+
String source;
StringName name;
@@ -100,15 +115,12 @@ class CSharpScript : public Script {
Map<StringName, Variant> exported_members_defval_cache; // member_default_values_cache
Set<PlaceHolderScriptInstance *> placeholders;
bool source_changed_cache;
+ bool placeholder_fallback_enabled;
bool exports_invalidated;
void _update_exports_values(Map<StringName, Variant> &values, List<PropertyInfo> &propnames);
virtual void _placeholder_erased(PlaceHolderScriptInstance *p_placeholder);
#endif
-#ifdef DEBUG_ENABLED
- Map<ObjectID, List<Pair<StringName, Variant> > > pending_reload_state;
-#endif
-
Map<StringName, PropertyInfo> member_info;
void _clear();
@@ -158,15 +170,21 @@ public:
virtual void update_exports();
virtual bool is_tool() const { return tool; }
+ virtual bool is_valid() const { return valid; }
+
virtual Ref<Script> get_base_script() const;
virtual ScriptLanguage *get_language() const;
- /* TODO */ virtual void get_script_method_list(List<MethodInfo> *p_list) const {}
+ virtual void get_script_method_list(List<MethodInfo> *p_list) const;
bool has_method(const StringName &p_method) const;
- /* TODO */ MethodInfo get_method_info(const StringName &p_method) const { return MethodInfo(); }
+ MethodInfo get_method_info(const StringName &p_method) const;
virtual int get_member_line(const StringName &p_member) const;
+#ifdef TOOLS_ENABLED
+ virtual bool is_placeholder_fallback_enabled() const { return placeholder_fallback_enabled; }
+#endif
+
Error load_source_code(const String &p_path);
StringName get_script_name() const;
@@ -184,6 +202,8 @@ class CSharpInstance : public ScriptInstance {
bool base_ref;
bool ref_dying;
bool unsafe_referenced;
+ bool predelete_notified;
+ bool destructing_script_instance;
Ref<CSharpScript> script;
Ref<MonoGCHandle> gchandle;
@@ -204,6 +224,8 @@ class CSharpInstance : public ScriptInstance {
public:
MonoObject *get_mono_object() const;
+ _FORCE_INLINE_ bool is_destructing_script_instance() { return destructing_script_instance; }
+
virtual bool set(const StringName &p_name, const Variant &p_value);
virtual bool get(const StringName &p_name, Variant &r_ret) const;
virtual void get_property_list(List<PropertyInfo> *p_properties) const;
@@ -253,11 +275,9 @@ class CSharpLanguage : public ScriptLanguage {
GDMono *gdmono;
SelfList<CSharpScript>::List script_list;
- Mutex *lock;
- Mutex *script_bind_lock;
- Mutex *script_gchandle_release_lock;
-
- Map<Ref<CSharpScript>, Map<ObjectID, List<Pair<StringName, Variant> > > > to_reload;
+ Mutex *script_instances_mutex;
+ Mutex *script_gchandle_release_mutex;
+ Mutex *language_bind_mutex;
Map<Object *, CSharpScriptBinding> script_bindings;
@@ -294,7 +314,8 @@ public:
bool debug_break_parse(const String &p_file, int p_line, const String &p_error);
#ifdef TOOLS_ENABLED
- void reload_assemblies_if_needed(bool p_soft_reload);
+ bool is_assembly_reloading_needed();
+ void reload_assemblies(bool p_soft_reload);
#endif
void project_assembly_loaded();
@@ -382,6 +403,7 @@ public:
};
class ResourceFormatLoaderCSharpScript : public ResourceFormatLoader {
+ GDCLASS(ResourceFormatLoaderCSharpScript, ResourceFormatLoader)
public:
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
virtual void get_recognized_extensions(List<String> *p_extensions) const;
@@ -390,6 +412,7 @@ public:
};
class ResourceFormatSaverCSharpScript : public ResourceFormatSaver {
+ GDCLASS(ResourceFormatSaverCSharpScript, ResourceFormatSaver)
public:
virtual Error save(const String &p_path, const RES &p_resource, uint32_t p_flags = 0);
virtual void get_recognized_extensions(const RES &p_resource, List<String> *p_extensions) const;
diff --git a/modules/mono/editor/GodotSharpTools/.gitignore b/modules/mono/editor/GodotSharpTools/.gitignore
new file mode 100644
index 0000000000..296ad48834
--- /dev/null
+++ b/modules/mono/editor/GodotSharpTools/.gitignore
@@ -0,0 +1,2 @@
+# nuget packages
+packages \ No newline at end of file
diff --git a/modules/mono/editor/GodotSharpTools/Editor/GodotSharpExport.cs b/modules/mono/editor/GodotSharpTools/Editor/GodotSharpExport.cs
index 5fd708d539..e45dd2025b 100644
--- a/modules/mono/editor/GodotSharpTools/Editor/GodotSharpExport.cs
+++ b/modules/mono/editor/GodotSharpTools/Editor/GodotSharpExport.cs
@@ -30,7 +30,7 @@ namespace GodotSharpTools.Editor
throw new NotSupportedException("Target platform not supported");
}
- templateDirName += debug ? ".debug" : ".release";
+ templateDirName += debug ? ".release_debug" : ".release";
string templateDirPath = Path.Combine(GetTemplatesDir(), templateDirName);
diff --git a/modules/mono/editor/bindings_generator.cpp b/modules/mono/editor/bindings_generator.cpp
index 166b3e1324..0b6a6a327c 100644
--- a/modules/mono/editor/bindings_generator.cpp
+++ b/modules/mono/editor/bindings_generator.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -80,6 +80,7 @@
#define ICALL_GET_METHODBIND ICALL_PREFIX "Object_ClassDB_get_method"
#define C_LOCAL_RET "ret"
+#define C_LOCAL_VARARG_RET "vararg_ret"
#define C_LOCAL_PTRCALL_ARGS "call_args"
#define C_MACRO_OBJECT_CONSTRUCT "GODOTSHARP_INSTANCE_OBJECT"
@@ -96,7 +97,7 @@
#define C_METHOD_MONOARRAY_TO(m_type) C_NS_MONOMARSHAL "::mono_array_to_" #m_type
#define C_METHOD_MONOARRAY_FROM(m_type) C_NS_MONOMARSHAL "::" #m_type "_to_mono_array"
-#define BINDINGS_GENERATOR_VERSION UINT32_C(5)
+#define BINDINGS_GENERATOR_VERSION UINT32_C(6)
const char *BindingsGenerator::TypeInterface::DEFAULT_VARARG_C_IN = "\t%0 %1_in = %1;\n";
@@ -1501,6 +1502,15 @@ Error BindingsGenerator::_generate_glue_method(const BindingsGenerator::TypeInte
String ptrcall_return_type;
String initialization;
+ if (p_imethod.is_vararg && return_type->cname != name_cache.type_Variant) {
+ // VarArg methods always return Variant, but there are some cases in which MethodInfo provides
+ // a specific return type. We trust this information is valid. We need a temporary local to keep
+ // the Variant alive until the method returns. Otherwise, if the returned Variant holds a RefPtr,
+ // it could be deleted too early. This is the case with GDScript.new() which returns OBJECT.
+ // Alternatively, we could just return Variant, but that would result in a worse API.
+ p_output.push_back("\tVariant " C_LOCAL_VARARG_RET ";\n");
+ }
+
if (return_type->is_object_type) {
ptrcall_return_type = return_type->is_reference ? "Ref<Reference>" : return_type->c_type;
initialization = return_type->is_reference ? "" : " = NULL";
@@ -1558,12 +1568,23 @@ Error BindingsGenerator::_generate_glue_method(const BindingsGenerator::TypeInte
if (p_imethod.is_vararg) {
p_output.push_back("\tVariant::CallError vcall_error;\n\t");
- if (!ret_void)
- p_output.push_back(C_LOCAL_RET " = ");
+ if (!ret_void) {
+ // See the comment on the C_LOCAL_VARARG_RET declaration
+ if (return_type->cname != name_cache.type_Variant) {
+ p_output.push_back(C_LOCAL_VARARG_RET " = ");
+ } else {
+ p_output.push_back(C_LOCAL_RET " = ");
+ }
+ }
p_output.push_back(CS_PARAM_METHODBIND "->call(" CS_PARAM_INSTANCE ", ");
p_output.push_back(p_imethod.arguments.size() ? "(const Variant**)" C_LOCAL_PTRCALL_ARGS ".ptr()" : "NULL");
p_output.push_back(", total_length, vcall_error);\n");
+
+ // See the comment on the C_LOCAL_VARARG_RET declaration
+ if (return_type->cname != name_cache.type_Variant) {
+ p_output.push_back("\t" C_LOCAL_RET " = " C_LOCAL_VARARG_RET ";\n");
+ }
} else {
p_output.push_back("\t" CS_PARAM_METHODBIND "->ptrcall(" CS_PARAM_INSTANCE ", ");
p_output.push_back(p_imethod.arguments.size() ? C_LOCAL_PTRCALL_ARGS ", " : "NULL, ");
diff --git a/modules/mono/editor/bindings_generator.h b/modules/mono/editor/bindings_generator.h
index 91c474c4f0..8a1c942f6b 100644
--- a/modules/mono/editor/bindings_generator.h
+++ b/modules/mono/editor/bindings_generator.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/editor/csharp_project.cpp b/modules/mono/editor/csharp_project.cpp
index 416108603b..4397bb9b6a 100644
--- a/modules/mono/editor/csharp_project.cpp
+++ b/modules/mono/editor/csharp_project.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/editor/csharp_project.h b/modules/mono/editor/csharp_project.h
index aeeeff50f0..3d5a65f8da 100644
--- a/modules/mono/editor/csharp_project.h
+++ b/modules/mono/editor/csharp_project.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/editor/dotnet_solution.cpp b/modules/mono/editor/dotnet_solution.cpp
index ab92e2e378..324752cafc 100644
--- a/modules/mono/editor/dotnet_solution.cpp
+++ b/modules/mono/editor/dotnet_solution.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/editor/dotnet_solution.h b/modules/mono/editor/dotnet_solution.h
index 629605ad18..18933364fa 100644
--- a/modules/mono/editor/dotnet_solution.h
+++ b/modules/mono/editor/dotnet_solution.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/editor/godotsharp_builds.cpp b/modules/mono/editor/godotsharp_builds.cpp
index 0f12fc5243..5d9f4d8d54 100644
--- a/modules/mono/editor/godotsharp_builds.cpp
+++ b/modules/mono/editor/godotsharp_builds.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -381,6 +381,9 @@ bool GodotSharpBuilds::build_project_blocking(const String &p_config) {
bool GodotSharpBuilds::editor_build_callback() {
+ if (!FileAccess::exists(GodotSharpDirs::get_project_sln_path()))
+ return true; // No solution to build
+
String scripts_metadata_path_editor = GodotSharpDirs::get_res_metadata_dir().plus_file("scripts_metadata.editor");
String scripts_metadata_path_player = GodotSharpDirs::get_res_metadata_dir().plus_file("scripts_metadata.editor_player");
diff --git a/modules/mono/editor/godotsharp_builds.h b/modules/mono/editor/godotsharp_builds.h
index 7f38b0aa49..2d53583916 100644
--- a/modules/mono/editor/godotsharp_builds.h
+++ b/modules/mono/editor/godotsharp_builds.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/editor/godotsharp_editor.cpp b/modules/mono/editor/godotsharp_editor.cpp
index f27511ad5e..cee4405826 100644
--- a/modules/mono/editor/godotsharp_editor.cpp
+++ b/modules/mono/editor/godotsharp_editor.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -248,8 +248,19 @@ Error GodotSharpEditor::open_in_external_editor(const Ref<Script> &p_script, int
static String vscode_path;
if (vscode_path.empty() || !FileAccess::exists(vscode_path)) {
+ static List<String> vscode_name;
+ vscode_name.push_back("code");
+ vscode_name.push_back("code-oss");
+ vscode_name.push_back("vscode");
+ vscode_name.push_back("vscode-oss");
+ vscode_name.push_back("visual-studio-code");
+ vscode_name.push_back("visual-studio-code-oss");
// Try to search it again if it wasn't found last time or if it was removed from its location
- vscode_path = path_which("code");
+ for (int i = 0; i < vscode_name.size(); i++) {
+ vscode_path = path_which(vscode_name[i]);
+ if (!vscode_path.empty() || FileAccess::exists(vscode_path))
+ break;
+ }
}
List<String> args;
@@ -475,7 +486,9 @@ MonoReloadNode *MonoReloadNode::singleton = NULL;
void MonoReloadNode::_reload_timer_timeout() {
- CSharpLanguage::get_singleton()->reload_assemblies_if_needed(false);
+ if (CSharpLanguage::get_singleton()->is_assembly_reloading_needed()) {
+ CSharpLanguage::get_singleton()->reload_assemblies(false);
+ }
}
void MonoReloadNode::restart_reload_timer() {
@@ -493,7 +506,9 @@ void MonoReloadNode::_notification(int p_what) {
switch (p_what) {
case MainLoop::NOTIFICATION_WM_FOCUS_IN: {
restart_reload_timer();
- CSharpLanguage::get_singleton()->reload_assemblies_if_needed(true);
+ if (CSharpLanguage::get_singleton()->is_assembly_reloading_needed()) {
+ CSharpLanguage::get_singleton()->reload_assemblies(false);
+ }
} break;
default: {
} break;
diff --git a/modules/mono/editor/godotsharp_editor.h b/modules/mono/editor/godotsharp_editor.h
index 9fb0e40132..c9744a9eed 100644
--- a/modules/mono/editor/godotsharp_editor.h
+++ b/modules/mono/editor/godotsharp_editor.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/editor/godotsharp_export.cpp b/modules/mono/editor/godotsharp_export.cpp
index 34c710320a..47341e3555 100644
--- a/modules/mono/editor/godotsharp_export.cpp
+++ b/modules/mono/editor/godotsharp_export.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -85,53 +85,55 @@ void GodotSharpExport::_export_begin(const Set<String> &p_features, bool p_debug
ERR_FAIL_NULL(TOOLS_DOMAIN);
ERR_FAIL_NULL(GDMono::get_singleton()->get_editor_tools_assembly());
- String build_config = p_debug ? "Debug" : "Release";
+ if (FileAccess::exists(GodotSharpDirs::get_project_sln_path())) {
+ String build_config = p_debug ? "Debug" : "Release";
- String scripts_metadata_path = GodotSharpDirs::get_res_metadata_dir().plus_file("scripts_metadata." + String(p_debug ? "debug" : "release"));
- Error metadata_err = CSharpProject::generate_scripts_metadata(GodotSharpDirs::get_project_csproj_path(), scripts_metadata_path);
- ERR_FAIL_COND(metadata_err != OK);
+ String scripts_metadata_path = GodotSharpDirs::get_res_metadata_dir().plus_file("scripts_metadata." + String(p_debug ? "debug" : "release"));
+ Error metadata_err = CSharpProject::generate_scripts_metadata(GodotSharpDirs::get_project_csproj_path(), scripts_metadata_path);
+ ERR_FAIL_COND(metadata_err != OK);
- ERR_FAIL_COND(!_add_file(scripts_metadata_path, scripts_metadata_path));
+ ERR_FAIL_COND(!_add_file(scripts_metadata_path, scripts_metadata_path));
- ERR_FAIL_COND(!GodotSharpBuilds::build_project_blocking(build_config));
+ ERR_FAIL_COND(!GodotSharpBuilds::build_project_blocking(build_config));
- // Add dependency assemblies
+ // Add dependency assemblies
- Map<String, String> dependencies;
+ Map<String, String> dependencies;
- String project_dll_name = ProjectSettings::get_singleton()->get("application/config/name");
- if (project_dll_name.empty()) {
- project_dll_name = "UnnamedProject";
- }
+ String project_dll_name = ProjectSettings::get_singleton()->get("application/config/name");
+ if (project_dll_name.empty()) {
+ project_dll_name = "UnnamedProject";
+ }
- String project_dll_src_dir = GodotSharpDirs::get_res_temp_assemblies_base_dir().plus_file(build_config);
- String project_dll_src_path = project_dll_src_dir.plus_file(project_dll_name + ".dll");
- dependencies.insert(project_dll_name, project_dll_src_path);
+ String project_dll_src_dir = GodotSharpDirs::get_res_temp_assemblies_base_dir().plus_file(build_config);
+ String project_dll_src_path = project_dll_src_dir.plus_file(project_dll_name + ".dll");
+ dependencies.insert(project_dll_name, project_dll_src_path);
- {
- MonoDomain *export_domain = GDMonoUtils::create_domain("GodotEngine.ProjectExportDomain");
- ERR_FAIL_NULL(export_domain);
- _GDMONO_SCOPE_EXIT_DOMAIN_UNLOAD_(export_domain);
+ {
+ MonoDomain *export_domain = GDMonoUtils::create_domain("GodotEngine.ProjectExportDomain");
+ ERR_FAIL_NULL(export_domain);
+ _GDMONO_SCOPE_EXIT_DOMAIN_UNLOAD_(export_domain);
- _GDMONO_SCOPE_DOMAIN_(export_domain);
+ _GDMONO_SCOPE_DOMAIN_(export_domain);
- GDMonoAssembly *scripts_assembly = NULL;
- bool load_success = GDMono::get_singleton()->load_assembly_from(project_dll_name,
- project_dll_src_path, &scripts_assembly, /* refonly: */ true);
+ GDMonoAssembly *scripts_assembly = NULL;
+ bool load_success = GDMono::get_singleton()->load_assembly_from(project_dll_name,
+ project_dll_src_path, &scripts_assembly, /* refonly: */ true);
- ERR_EXPLAIN("Cannot load refonly assembly: " + project_dll_name);
- ERR_FAIL_COND(!load_success);
+ ERR_EXPLAIN("Cannot load refonly assembly: " + project_dll_name);
+ ERR_FAIL_COND(!load_success);
- Vector<String> search_dirs;
- GDMonoAssembly::fill_search_dirs(search_dirs);
- Error depend_error = _get_assembly_dependencies(scripts_assembly, search_dirs, dependencies);
- ERR_FAIL_COND(depend_error != OK);
- }
+ Vector<String> search_dirs;
+ GDMonoAssembly::fill_search_dirs(search_dirs);
+ Error depend_error = _get_assembly_dependencies(scripts_assembly, search_dirs, dependencies);
+ ERR_FAIL_COND(depend_error != OK);
+ }
- for (Map<String, String>::Element *E = dependencies.front(); E; E = E->next()) {
- String depend_src_path = E->value();
- String depend_dst_path = GodotSharpDirs::get_res_assemblies_dir().plus_file(depend_src_path.get_file());
- ERR_FAIL_COND(!_add_file(depend_src_path, depend_dst_path));
+ for (Map<String, String>::Element *E = dependencies.front(); E; E = E->next()) {
+ String depend_src_path = E->value();
+ String depend_dst_path = GodotSharpDirs::get_res_assemblies_dir().plus_file(depend_src_path.get_file());
+ ERR_FAIL_COND(!_add_file(depend_src_path, depend_dst_path));
+ }
}
// Mono specific export template extras (data dir)
diff --git a/modules/mono/editor/godotsharp_export.h b/modules/mono/editor/godotsharp_export.h
index 10d4375567..4dc8ea75d5 100644
--- a/modules/mono/editor/godotsharp_export.h
+++ b/modules/mono/editor/godotsharp_export.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/editor/mono_bottom_panel.cpp b/modules/mono/editor/mono_bottom_panel.cpp
index d7bfa54aba..feebdb380b 100644
--- a/modules/mono/editor/mono_bottom_panel.cpp
+++ b/modules/mono/editor/mono_bottom_panel.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -150,14 +150,21 @@ void MonoBottomPanel::_errors_toggled(bool p_pressed) {
void MonoBottomPanel::_build_project_pressed() {
+ if (!FileAccess::exists(GodotSharpDirs::get_project_sln_path()))
+ return; // No solution to build
+
String scripts_metadata_path = GodotSharpDirs::get_res_metadata_dir().plus_file("scripts_metadata.editor");
Error metadata_err = CSharpProject::generate_scripts_metadata(GodotSharpDirs::get_project_csproj_path(), scripts_metadata_path);
ERR_FAIL_COND(metadata_err != OK);
- GodotSharpBuilds::get_singleton()->build_project_blocking("Tools");
+ bool build_success = GodotSharpBuilds::get_singleton()->build_project_blocking("Tools");
- MonoReloadNode::get_singleton()->restart_reload_timer();
- CSharpLanguage::get_singleton()->reload_assemblies_if_needed(true);
+ if (build_success) {
+ MonoReloadNode::get_singleton()->restart_reload_timer();
+ if (CSharpLanguage::get_singleton()->is_assembly_reloading_needed()) {
+ CSharpLanguage::get_singleton()->reload_assemblies(false);
+ }
+ }
}
void MonoBottomPanel::_view_log_pressed() {
diff --git a/modules/mono/editor/mono_bottom_panel.h b/modules/mono/editor/mono_bottom_panel.h
index 03240e9a13..d3109592a9 100644
--- a/modules/mono/editor/mono_bottom_panel.h
+++ b/modules/mono/editor/mono_bottom_panel.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/editor/mono_build_info.cpp b/modules/mono/editor/mono_build_info.cpp
index e4af2aac4f..b386c06435 100644
--- a/modules/mono/editor/mono_build_info.cpp
+++ b/modules/mono/editor/mono_build_info.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/editor/mono_build_info.h b/modules/mono/editor/mono_build_info.h
index 64ba0f4037..b0ae2ed52e 100644
--- a/modules/mono/editor/mono_build_info.h
+++ b/modules/mono/editor/mono_build_info.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/editor/monodevelop_instance.cpp b/modules/mono/editor/monodevelop_instance.cpp
index 1d858d80bf..3caa56d1d0 100644
--- a/modules/mono/editor/monodevelop_instance.cpp
+++ b/modules/mono/editor/monodevelop_instance.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/editor/monodevelop_instance.h b/modules/mono/editor/monodevelop_instance.h
index 29de4a4735..3b3af9607b 100644
--- a/modules/mono/editor/monodevelop_instance.h
+++ b/modules/mono/editor/monodevelop_instance.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/editor/script_class_parser.cpp b/modules/mono/editor/script_class_parser.cpp
index bc8eed81cf..1281ed669f 100644
--- a/modules/mono/editor/script_class_parser.cpp
+++ b/modules/mono/editor/script_class_parser.cpp
@@ -1,3 +1,33 @@
+/*************************************************************************/
+/* script_class_parser.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
#include "script_class_parser.h"
#include "core/map.h"
@@ -259,6 +289,8 @@ Error ScriptClassParser::_skip_generic_type_params() {
if (err)
return err;
continue;
+ } else if (tk == TK_OP_GREATER) {
+ return OK;
} else if (tk != TK_COMMA) {
error_str = "Unexpected token: " + get_token_name(tk);
error = true;
@@ -312,27 +344,108 @@ Error ScriptClassParser::_parse_class_base(Vector<String> &r_base) {
Token tk = get_token();
+ bool generic = false;
if (tk == TK_OP_LESS) {
- // We don't add it to the base list if it's generic
Error err = _skip_generic_type_params();
if (err)
return err;
- } else if (tk == TK_COMMA) {
+ // We don't add it to the base list if it's generic
+ generic = true;
+ tk = get_token();
+ }
+
+ if (tk == TK_COMMA) {
Error err = _parse_class_base(r_base);
if (err)
return err;
- r_base.push_back(name);
+ } else if (tk == TK_IDENTIFIER && String(value) == "where") {
+ Error err = _parse_type_constraints();
+ if (err) {
+ return err;
+ }
+
+ // An open curly bracket was parsed by _parse_type_constraints, so we can exit
} else if (tk == TK_CURLY_BRACKET_OPEN) {
- r_base.push_back(name);
+ // we are finished when we hit the open curly bracket
} else {
error_str = "Unexpected token: " + get_token_name(tk);
error = true;
return ERR_PARSE_ERROR;
}
+ if (!generic) {
+ r_base.push_back(name);
+ }
+
return OK;
}
+Error ScriptClassParser::_parse_type_constraints() {
+ Token tk = get_token();
+ if (tk != TK_IDENTIFIER) {
+ error_str = "Unexpected token: " + get_token_name(tk);
+ error = true;
+ return ERR_PARSE_ERROR;
+ }
+
+ tk = get_token();
+ if (tk != TK_COLON) {
+ error_str = "Unexpected token: " + get_token_name(tk);
+ error = true;
+ return ERR_PARSE_ERROR;
+ }
+
+ while (true) {
+ tk = get_token();
+ if (tk == TK_IDENTIFIER) {
+ if (String(value) == "where") {
+ return _parse_type_constraints();
+ }
+
+ tk = get_token();
+ if (tk == TK_PERIOD) {
+ while (true) {
+ tk = get_token();
+
+ if (tk != TK_IDENTIFIER) {
+ error_str = "Expected " + get_token_name(TK_IDENTIFIER) + ", found: " + get_token_name(tk);
+ error = true;
+ return ERR_PARSE_ERROR;
+ }
+
+ tk = get_token();
+
+ if (tk != TK_PERIOD)
+ break;
+ }
+ }
+ }
+
+ if (tk == TK_COMMA) {
+ continue;
+ } else if (tk == TK_IDENTIFIER && String(value) == "where") {
+ return _parse_type_constraints();
+ } else if (tk == TK_SYMBOL && String(value) == "(") {
+ tk = get_token();
+ if (tk != TK_SYMBOL || String(value) != ")") {
+ error_str = "Unexpected token: " + get_token_name(tk);
+ error = true;
+ return ERR_PARSE_ERROR;
+ }
+ } else if (tk == TK_OP_LESS) {
+ Error err = _skip_generic_type_params();
+ if (err)
+ return err;
+ } else if (tk == TK_CURLY_BRACKET_OPEN) {
+ return OK;
+ } else {
+ error_str = "Unexpected token: " + get_token_name(tk);
+ error = true;
+ return ERR_PARSE_ERROR;
+ }
+ }
+}
+
Error ScriptClassParser::_parse_namespace_name(String &r_name, int &r_curly_stack) {
Token tk = get_token();
@@ -425,6 +538,16 @@ Error ScriptClassParser::parse(const String &p_code) {
Error err = _skip_generic_type_params();
if (err)
return err;
+ } else if (tk == TK_IDENTIFIER && String(value) == "where") {
+ Error err = _parse_type_constraints();
+ if (err) {
+ return err;
+ }
+
+ // An open curly bracket was parsed by _parse_type_constraints, so we can exit
+ curly_stack++;
+ type_curly_stack++;
+ break;
} else {
error_str = "Unexpected token: " + get_token_name(tk);
error = true;
diff --git a/modules/mono/editor/script_class_parser.h b/modules/mono/editor/script_class_parser.h
index 1e174c28a9..39003336ac 100644
--- a/modules/mono/editor/script_class_parser.h
+++ b/modules/mono/editor/script_class_parser.h
@@ -1,3 +1,33 @@
+/*************************************************************************/
+/* script_class_parser.h */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* https://godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+
#ifndef SCRIPT_CLASS_PARSER_H
#define SCRIPT_CLASS_PARSER_H
@@ -65,6 +95,7 @@ private:
Error _parse_type_full_name(String &r_full_name);
Error _parse_class_base(Vector<String> &r_base);
+ Error _parse_type_constraints();
Error _parse_namespace_name(String &r_name, int &r_curly_stack);
public:
diff --git a/modules/mono/glue/Managed/Files/AABB.cs b/modules/mono/glue/Managed/Files/AABB.cs
index 66490b5e25..33b2b46712 100644
--- a/modules/mono/glue/Managed/Files/AABB.cs
+++ b/modules/mono/glue/Managed/Files/AABB.cs
@@ -407,8 +407,8 @@ namespace Godot
return new AABB(min, max - min);
}
-
- // Constructors
+
+ // Constructors
public AABB(Vector3 position, Vector3 size)
{
_position = position;
diff --git a/modules/mono/glue/Managed/Files/Basis.cs b/modules/mono/glue/Managed/Files/Basis.cs
index a5618cb28d..b318d96bb9 100644
--- a/modules/mono/glue/Managed/Files/Basis.cs
+++ b/modules/mono/glue/Managed/Files/Basis.cs
@@ -13,9 +13,9 @@ namespace Godot
{
private static readonly Basis identity = new Basis
(
- new Vector3(1f, 0f, 0f),
- new Vector3(0f, 1f, 0f),
- new Vector3(0f, 0f, 1f)
+ 1f, 0f, 0f,
+ 0f, 1f, 0f,
+ 0f, 0f, 1f
);
private static readonly Basis[] orthoBases = {
@@ -159,9 +159,9 @@ namespace Godot
{
return new Basis
(
- new Vector3(xAxis.x, yAxis.x, zAxis.x),
- new Vector3(xAxis.y, yAxis.y, zAxis.y),
- new Vector3(xAxis.z, yAxis.z, zAxis.z)
+ xAxis.x, yAxis.x, zAxis.x,
+ xAxis.y, yAxis.y, zAxis.y,
+ xAxis.z, yAxis.z, zAxis.z
);
}
@@ -410,10 +410,12 @@ namespace Godot
);
}
- public Quat Quat() {
+ public Quat Quat()
+ {
real_t trace = _x[0] + _y[1] + _z[2];
- if (trace > 0.0f) {
+ if (trace > 0.0f)
+ {
real_t s = Mathf.Sqrt(trace + 1.0f) * 2f;
real_t inv_s = 1f / s;
return new Quat(
@@ -424,7 +426,8 @@ namespace Godot
);
}
- if (_x[0] > _y[1] && _x[0] > _z[2]) {
+ if (_x[0] > _y[1] && _x[0] > _z[2])
+ {
real_t s = Mathf.Sqrt(_x[0] - _y[1] - _z[2] + 1.0f) * 2f;
real_t inv_s = 1f / s;
return new Quat(
@@ -435,7 +438,8 @@ namespace Godot
);
}
- if (_y[1] > _z[2]) {
+ if (_y[1] > _z[2])
+ {
real_t s = Mathf.Sqrt(-_x[0] + _y[1] - _z[2] + 1.0f) * 2f;
real_t inv_s = 1f / s;
return new Quat(
@@ -444,7 +448,9 @@ namespace Godot
(_y[2] + _z[1]) * inv_s,
(_x[2] - _z[0]) * inv_s
);
- } else {
+ }
+ else
+ {
real_t s = Mathf.Sqrt(-_x[0] - _y[1] + _z[2] + 1.0f) * 2f;
real_t inv_s = 1f / s;
return new Quat(
@@ -502,8 +508,8 @@ namespace Godot
{
var axis_sq = new Vector3(axis.x * axis.x, axis.y * axis.y, axis.z * axis.z);
- real_t cosine = Mathf.Cos( phi);
- real_t sine = Mathf.Sin( phi);
+ real_t cosine = Mathf.Cos(phi);
+ real_t sine = Mathf.Sin(phi);
_x = new Vector3
(
@@ -529,12 +535,17 @@ namespace Godot
public Basis(Vector3 xAxis, Vector3 yAxis, Vector3 zAxis)
{
- _x = xAxis;
- _y = yAxis;
- _z = zAxis;
+ _x = new Vector3(xAxis.x, yAxis.x, zAxis.x);
+ _y = new Vector3(xAxis.y, yAxis.y, zAxis.y);
+ _z = new Vector3(xAxis.z, yAxis.z, zAxis.z);
+ // Same as:
+ // SetAxis(0, xAxis);
+ // SetAxis(1, yAxis);
+ // SetAxis(2, zAxis);
+ // We need to assign the struct fields so we can't do that...
}
- public Basis(real_t xx, real_t xy, real_t xz, real_t yx, real_t yy, real_t yz, real_t zx, real_t zy, real_t zz)
+ internal Basis(real_t xx, real_t xy, real_t xz, real_t yx, real_t yy, real_t yz, real_t zx, real_t zy, real_t zz)
{
_x = new Vector3(xx, xy, xz);
_y = new Vector3(yx, yy, yz);
diff --git a/modules/mono/glue/Managed/Files/Color.cs b/modules/mono/glue/Managed/Files/Color.cs
index 88cb8524b8..88fa3323c2 100644
--- a/modules/mono/glue/Managed/Files/Color.cs
+++ b/modules/mono/glue/Managed/Files/Color.cs
@@ -104,17 +104,26 @@ namespace Godot
}
}
- private static readonly Color black = new Color(0f, 0f, 0f);
-
- public Color Black
+ public static Color ColorN(string name, float alpha = 1f)
{
- get
+ name = name.Replace(" ", String.Empty);
+ name = name.Replace("-", String.Empty);
+ name = name.Replace("_", String.Empty);
+ name = name.Replace("'", String.Empty);
+ name = name.Replace(".", String.Empty);
+ name = name.ToLower();
+
+ if (!Colors.namedColors.ContainsKey(name))
{
- return black;
+ throw new ArgumentOutOfRangeException($"Invalid Color Name: {name}");
}
+
+ Color color = Colors.namedColors[name];
+ color.a = alpha;
+ return color;
}
- public float this [int index]
+ public float this[int index]
{
get
{
@@ -379,7 +388,7 @@ namespace Godot
return txt;
}
-
+
// Constructors
public Color(float r, float g, float b, float a = 1.0f)
{
diff --git a/modules/mono/glue/Managed/Files/Colors.cs b/modules/mono/glue/Managed/Files/Colors.cs
new file mode 100644
index 0000000000..bc2a1a3bd7
--- /dev/null
+++ b/modules/mono/glue/Managed/Files/Colors.cs
@@ -0,0 +1,303 @@
+using System;
+using System.Collections.Generic;
+
+namespace Godot
+{
+ public static class Colors
+ {
+ // Color names and values are derived from core/color_names.inc
+ internal static readonly Dictionary<string, Color> namedColors = new Dictionary<string, Color> {
+ {"aliceblue", new Color(0.94f, 0.97f, 1.00f)},
+ {"antiquewhite", new Color(0.98f, 0.92f, 0.84f)},
+ {"aqua", new Color(0.00f, 1.00f, 1.00f)},
+ {"aquamarine", new Color(0.50f, 1.00f, 0.83f)},
+ {"azure", new Color(0.94f, 1.00f, 1.00f)},
+ {"beige", new Color(0.96f, 0.96f, 0.86f)},
+ {"bisque", new Color(1.00f, 0.89f, 0.77f)},
+ {"black", new Color(0.00f, 0.00f, 0.00f)},
+ {"blanchedalmond", new Color(1.00f, 0.92f, 0.80f)},
+ {"blue", new Color(0.00f, 0.00f, 1.00f)},
+ {"blueviolet", new Color(0.54f, 0.17f, 0.89f)},
+ {"brown", new Color(0.65f, 0.16f, 0.16f)},
+ {"burlywood", new Color(0.87f, 0.72f, 0.53f)},
+ {"cadetblue", new Color(0.37f, 0.62f, 0.63f)},
+ {"chartreuse", new Color(0.50f, 1.00f, 0.00f)},
+ {"chocolate", new Color(0.82f, 0.41f, 0.12f)},
+ {"coral", new Color(1.00f, 0.50f, 0.31f)},
+ {"cornflower", new Color(0.39f, 0.58f, 0.93f)},
+ {"cornsilk", new Color(1.00f, 0.97f, 0.86f)},
+ {"crimson", new Color(0.86f, 0.08f, 0.24f)},
+ {"cyan", new Color(0.00f, 1.00f, 1.00f)},
+ {"darkblue", new Color(0.00f, 0.00f, 0.55f)},
+ {"darkcyan", new Color(0.00f, 0.55f, 0.55f)},
+ {"darkgoldenrod", new Color(0.72f, 0.53f, 0.04f)},
+ {"darkgray", new Color(0.66f, 0.66f, 0.66f)},
+ {"darkgreen", new Color(0.00f, 0.39f, 0.00f)},
+ {"darkkhaki", new Color(0.74f, 0.72f, 0.42f)},
+ {"darkmagenta", new Color(0.55f, 0.00f, 0.55f)},
+ {"darkolivegreen", new Color(0.33f, 0.42f, 0.18f)},
+ {"darkorange", new Color(1.00f, 0.55f, 0.00f)},
+ {"darkorchid", new Color(0.60f, 0.20f, 0.80f)},
+ {"darkred", new Color(0.55f, 0.00f, 0.00f)},
+ {"darksalmon", new Color(0.91f, 0.59f, 0.48f)},
+ {"darkseagreen", new Color(0.56f, 0.74f, 0.56f)},
+ {"darkslateblue", new Color(0.28f, 0.24f, 0.55f)},
+ {"darkslategray", new Color(0.18f, 0.31f, 0.31f)},
+ {"darkturquoise", new Color(0.00f, 0.81f, 0.82f)},
+ {"darkviolet", new Color(0.58f, 0.00f, 0.83f)},
+ {"deeppink", new Color(1.00f, 0.08f, 0.58f)},
+ {"deepskyblue", new Color(0.00f, 0.75f, 1.00f)},
+ {"dimgray", new Color(0.41f, 0.41f, 0.41f)},
+ {"dodgerblue", new Color(0.12f, 0.56f, 1.00f)},
+ {"firebrick", new Color(0.70f, 0.13f, 0.13f)},
+ {"floralwhite", new Color(1.00f, 0.98f, 0.94f)},
+ {"forestgreen", new Color(0.13f, 0.55f, 0.13f)},
+ {"fuchsia", new Color(1.00f, 0.00f, 1.00f)},
+ {"gainsboro", new Color(0.86f, 0.86f, 0.86f)},
+ {"ghostwhite", new Color(0.97f, 0.97f, 1.00f)},
+ {"gold", new Color(1.00f, 0.84f, 0.00f)},
+ {"goldenrod", new Color(0.85f, 0.65f, 0.13f)},
+ {"gray", new Color(0.75f, 0.75f, 0.75f)},
+ {"green", new Color(0.00f, 1.00f, 0.00f)},
+ {"greenyellow", new Color(0.68f, 1.00f, 0.18f)},
+ {"honeydew", new Color(0.94f, 1.00f, 0.94f)},
+ {"hotpink", new Color(1.00f, 0.41f, 0.71f)},
+ {"indianred", new Color(0.80f, 0.36f, 0.36f)},
+ {"indigo", new Color(0.29f, 0.00f, 0.51f)},
+ {"ivory", new Color(1.00f, 1.00f, 0.94f)},
+ {"khaki", new Color(0.94f, 0.90f, 0.55f)},
+ {"lavender", new Color(0.90f, 0.90f, 0.98f)},
+ {"lavenderblush", new Color(1.00f, 0.94f, 0.96f)},
+ {"lawngreen", new Color(0.49f, 0.99f, 0.00f)},
+ {"lemonchiffon", new Color(1.00f, 0.98f, 0.80f)},
+ {"lightblue", new Color(0.68f, 0.85f, 0.90f)},
+ {"lightcoral", new Color(0.94f, 0.50f, 0.50f)},
+ {"lightcyan", new Color(0.88f, 1.00f, 1.00f)},
+ {"lightgoldenrod", new Color(0.98f, 0.98f, 0.82f)},
+ {"lightgray", new Color(0.83f, 0.83f, 0.83f)},
+ {"lightgreen", new Color(0.56f, 0.93f, 0.56f)},
+ {"lightpink", new Color(1.00f, 0.71f, 0.76f)},
+ {"lightsalmon", new Color(1.00f, 0.63f, 0.48f)},
+ {"lightseagreen", new Color(0.13f, 0.70f, 0.67f)},
+ {"lightskyblue", new Color(0.53f, 0.81f, 0.98f)},
+ {"lightslategray", new Color(0.47f, 0.53f, 0.60f)},
+ {"lightsteelblue", new Color(0.69f, 0.77f, 0.87f)},
+ {"lightyellow", new Color(1.00f, 1.00f, 0.88f)},
+ {"lime", new Color(0.00f, 1.00f, 0.00f)},
+ {"limegreen", new Color(0.20f, 0.80f, 0.20f)},
+ {"linen", new Color(0.98f, 0.94f, 0.90f)},
+ {"magenta", new Color(1.00f, 0.00f, 1.00f)},
+ {"maroon", new Color(0.69f, 0.19f, 0.38f)},
+ {"mediumaquamarine", new Color(0.40f, 0.80f, 0.67f)},
+ {"mediumblue", new Color(0.00f, 0.00f, 0.80f)},
+ {"mediumorchid", new Color(0.73f, 0.33f, 0.83f)},
+ {"mediumpurple", new Color(0.58f, 0.44f, 0.86f)},
+ {"mediumseagreen", new Color(0.24f, 0.70f, 0.44f)},
+ {"mediumslateblue", new Color(0.48f, 0.41f, 0.93f)},
+ {"mediumspringgreen", new Color(0.00f, 0.98f, 0.60f)},
+ {"mediumturquoise", new Color(0.28f, 0.82f, 0.80f)},
+ {"mediumvioletred", new Color(0.78f, 0.08f, 0.52f)},
+ {"midnightblue", new Color(0.10f, 0.10f, 0.44f)},
+ {"mintcream", new Color(0.96f, 1.00f, 0.98f)},
+ {"mistyrose", new Color(1.00f, 0.89f, 0.88f)},
+ {"moccasin", new Color(1.00f, 0.89f, 0.71f)},
+ {"navajowhite", new Color(1.00f, 0.87f, 0.68f)},
+ {"navyblue", new Color(0.00f, 0.00f, 0.50f)},
+ {"oldlace", new Color(0.99f, 0.96f, 0.90f)},
+ {"olive", new Color(0.50f, 0.50f, 0.00f)},
+ {"olivedrab", new Color(0.42f, 0.56f, 0.14f)},
+ {"orange", new Color(1.00f, 0.65f, 0.00f)},
+ {"orangered", new Color(1.00f, 0.27f, 0.00f)},
+ {"orchid", new Color(0.85f, 0.44f, 0.84f)},
+ {"palegoldenrod", new Color(0.93f, 0.91f, 0.67f)},
+ {"palegreen", new Color(0.60f, 0.98f, 0.60f)},
+ {"paleturquoise", new Color(0.69f, 0.93f, 0.93f)},
+ {"palevioletred", new Color(0.86f, 0.44f, 0.58f)},
+ {"papayawhip", new Color(1.00f, 0.94f, 0.84f)},
+ {"peachpuff", new Color(1.00f, 0.85f, 0.73f)},
+ {"peru", new Color(0.80f, 0.52f, 0.25f)},
+ {"pink", new Color(1.00f, 0.75f, 0.80f)},
+ {"plum", new Color(0.87f, 0.63f, 0.87f)},
+ {"powderblue", new Color(0.69f, 0.88f, 0.90f)},
+ {"purple", new Color(0.63f, 0.13f, 0.94f)},
+ {"rebeccapurple", new Color(0.40f, 0.20f, 0.60f)},
+ {"red", new Color(1.00f, 0.00f, 0.00f)},
+ {"rosybrown", new Color(0.74f, 0.56f, 0.56f)},
+ {"royalblue", new Color(0.25f, 0.41f, 0.88f)},
+ {"saddlebrown", new Color(0.55f, 0.27f, 0.07f)},
+ {"salmon", new Color(0.98f, 0.50f, 0.45f)},
+ {"sandybrown", new Color(0.96f, 0.64f, 0.38f)},
+ {"seagreen", new Color(0.18f, 0.55f, 0.34f)},
+ {"seashell", new Color(1.00f, 0.96f, 0.93f)},
+ {"sienna", new Color(0.63f, 0.32f, 0.18f)},
+ {"silver", new Color(0.75f, 0.75f, 0.75f)},
+ {"skyblue", new Color(0.53f, 0.81f, 0.92f)},
+ {"slateblue", new Color(0.42f, 0.35f, 0.80f)},
+ {"slategray", new Color(0.44f, 0.50f, 0.56f)},
+ {"snow", new Color(1.00f, 0.98f, 0.98f)},
+ {"springgreen", new Color(0.00f, 1.00f, 0.50f)},
+ {"steelblue", new Color(0.27f, 0.51f, 0.71f)},
+ {"tan", new Color(0.82f, 0.71f, 0.55f)},
+ {"teal", new Color(0.00f, 0.50f, 0.50f)},
+ {"thistle", new Color(0.85f, 0.75f, 0.85f)},
+ {"tomato", new Color(1.00f, 0.39f, 0.28f)},
+ {"turquoise", new Color(0.25f, 0.88f, 0.82f)},
+ {"violet", new Color(0.93f, 0.51f, 0.93f)},
+ {"webgreen", new Color(0.00f, 0.50f, 0.00f)},
+ {"webgray", new Color(0.50f, 0.50f, 0.50f)},
+ {"webmaroon", new Color(0.50f, 0.00f, 0.00f)},
+ {"webpurple", new Color(0.50f, 0.00f, 0.50f)},
+ {"wheat", new Color(0.96f, 0.87f, 0.70f)},
+ {"white", new Color(1.00f, 1.00f, 1.00f)},
+ {"whitesmoke", new Color(0.96f, 0.96f, 0.96f)},
+ {"yellow", new Color(1.00f, 1.00f, 0.00f)},
+ {"yellowgreen", new Color(0.60f, 0.80f, 0.20f)},
+ };
+
+ public static Color AliceBlue { get { return namedColors["aliceblue"]; } }
+ public static Color AntiqueWhite { get { return namedColors["antiquewhite"]; } }
+ public static Color Aqua { get { return namedColors["aqua"]; } }
+ public static Color Aquamarine { get { return namedColors["aquamarine"]; } }
+ public static Color Azure { get { return namedColors["azure"]; } }
+ public static Color Beige { get { return namedColors["beige"]; } }
+ public static Color Bisque { get { return namedColors["bisque"]; } }
+ public static Color Black { get { return namedColors["black"]; } }
+ public static Color BlanchedAlmond { get { return namedColors["blanchedalmond"]; } }
+ public static Color Blue { get { return namedColors["blue"]; } }
+ public static Color BlueViolet { get { return namedColors["blueviolet"]; } }
+ public static Color Brown { get { return namedColors["brown"]; } }
+ public static Color BurlyWood { get { return namedColors["burlywood"]; } }
+ public static Color CadetBlue { get { return namedColors["cadetblue"]; } }
+ public static Color Chartreuse { get { return namedColors["chartreuse"]; } }
+ public static Color Chocolate { get { return namedColors["chocolate"]; } }
+ public static Color Coral { get { return namedColors["coral"]; } }
+ public static Color Cornflower { get { return namedColors["cornflower"]; } }
+ public static Color Cornsilk { get { return namedColors["cornsilk"]; } }
+ public static Color Crimson { get { return namedColors["crimson"]; } }
+ public static Color Cyan { get { return namedColors["cyan"]; } }
+ public static Color DarkBlue { get { return namedColors["darkblue"]; } }
+ public static Color DarkCyan { get { return namedColors["darkcyan"]; } }
+ public static Color DarkGoldenrod { get { return namedColors["darkgoldenrod"]; } }
+ public static Color DarkGray { get { return namedColors["darkgray"]; } }
+ public static Color DarkGreen { get { return namedColors["darkgreen"]; } }
+ public static Color DarkKhaki { get { return namedColors["darkkhaki"]; } }
+ public static Color DarkMagenta { get { return namedColors["darkmagenta"]; } }
+ public static Color DarkOliveGreen { get { return namedColors["darkolivegreen"]; } }
+ public static Color DarkOrange { get { return namedColors["darkorange"]; } }
+ public static Color DarkOrchid { get { return namedColors["darkorchid"]; } }
+ public static Color DarkRed { get { return namedColors["darkred"]; } }
+ public static Color DarkSalmon { get { return namedColors["darksalmon"]; } }
+ public static Color DarkSeagreen { get { return namedColors["darkseagreen"]; } }
+ public static Color DarkSlateBlue { get { return namedColors["darkslateblue"]; } }
+ public static Color DarkSlateGray { get { return namedColors["darkslategray"]; } }
+ public static Color DarkTurquoise { get { return namedColors["darkturquoise"]; } }
+ public static Color DarkViolet { get { return namedColors["darkviolet"]; } }
+ public static Color DeepPink { get { return namedColors["deeppink"]; } }
+ public static Color DeepSkyBlue { get { return namedColors["deepskyblue"]; } }
+ public static Color DimGray { get { return namedColors["dimgray"]; } }
+ public static Color DodgerBlue { get { return namedColors["dodgerblue"]; } }
+ public static Color Firebrick { get { return namedColors["firebrick"]; } }
+ public static Color FloralWhite { get { return namedColors["floralwhite"]; } }
+ public static Color ForestGreen { get { return namedColors["forestgreen"]; } }
+ public static Color Fuchsia { get { return namedColors["fuchsia"]; } }
+ public static Color Gainsboro { get { return namedColors["gainsboro"]; } }
+ public static Color GhostWhite { get { return namedColors["ghostwhite"]; } }
+ public static Color Gold { get { return namedColors["gold"]; } }
+ public static Color Goldenrod { get { return namedColors["goldenrod"]; } }
+ public static Color Gray { get { return namedColors["gray"]; } }
+ public static Color Green { get { return namedColors["green"]; } }
+ public static Color GreenYellow { get { return namedColors["greenyellow"]; } }
+ public static Color Honeydew { get { return namedColors["honeydew"]; } }
+ public static Color HotPink { get { return namedColors["hotpink"]; } }
+ public static Color IndianRed { get { return namedColors["indianred"]; } }
+ public static Color Indigo { get { return namedColors["indigo"]; } }
+ public static Color Ivory { get { return namedColors["ivory"]; } }
+ public static Color Khaki { get { return namedColors["khaki"]; } }
+ public static Color Lavender { get { return namedColors["lavender"]; } }
+ public static Color LavenderBlush { get { return namedColors["lavenderblush"]; } }
+ public static Color LawnGreen { get { return namedColors["lawngreen"]; } }
+ public static Color LemonChiffon { get { return namedColors["lemonchiffon"]; } }
+ public static Color LightBlue { get { return namedColors["lightblue"]; } }
+ public static Color LightCoral { get { return namedColors["lightcoral"]; } }
+ public static Color LightCyan { get { return namedColors["lightcyan"]; } }
+ public static Color LightGoldenrod { get { return namedColors["lightgoldenrod"]; } }
+ public static Color LightGray { get { return namedColors["lightgray"]; } }
+ public static Color LightGreen { get { return namedColors["lightgreen"]; } }
+ public static Color LightPink { get { return namedColors["lightpink"]; } }
+ public static Color LightSalmon { get { return namedColors["lightsalmon"]; } }
+ public static Color LightSeaGreen { get { return namedColors["lightseagreen"]; } }
+ public static Color LightSkyBlue { get { return namedColors["lightskyblue"]; } }
+ public static Color LightSlateGray { get { return namedColors["lightslategray"]; } }
+ public static Color LightSteelBlue { get { return namedColors["lightsteelblue"]; } }
+ public static Color LightYellow { get { return namedColors["lightyellow"]; } }
+ public static Color Lime { get { return namedColors["lime"]; } }
+ public static Color Limegreen { get { return namedColors["limegreen"]; } }
+ public static Color Linen { get { return namedColors["linen"]; } }
+ public static Color Magenta { get { return namedColors["magenta"]; } }
+ public static Color Maroon { get { return namedColors["maroon"]; } }
+ public static Color MediumAquamarine { get { return namedColors["mediumaquamarine"]; } }
+ public static Color MediumBlue { get { return namedColors["mediumblue"]; } }
+ public static Color MediumOrchid { get { return namedColors["mediumorchid"]; } }
+ public static Color MediumPurple { get { return namedColors["mediumpurple"]; } }
+ public static Color MediumSeaGreen { get { return namedColors["mediumseagreen"]; } }
+ public static Color MediumSlateBlue { get { return namedColors["mediumslateblue"]; } }
+ public static Color MediumSpringGreen { get { return namedColors["mediumspringgreen"]; } }
+ public static Color MediumTurquoise { get { return namedColors["mediumturquoise"]; } }
+ public static Color MediumVioletRed { get { return namedColors["mediumvioletred"]; } }
+ public static Color MidnightBlue { get { return namedColors["midnightblue"]; } }
+ public static Color MintCream { get { return namedColors["mintcream"]; } }
+ public static Color MistyRose { get { return namedColors["mistyrose"]; } }
+ public static Color Moccasin { get { return namedColors["moccasin"]; } }
+ public static Color NavajoWhite { get { return namedColors["navajowhite"]; } }
+ public static Color NavyBlue { get { return namedColors["navyblue"]; } }
+ public static Color OldLace { get { return namedColors["oldlace"]; } }
+ public static Color Olive { get { return namedColors["olive"]; } }
+ public static Color OliveDrab { get { return namedColors["olivedrab"]; } }
+ public static Color Orange { get { return namedColors["orange"]; } }
+ public static Color OrangeRed { get { return namedColors["orangered"]; } }
+ public static Color Orchid { get { return namedColors["orchid"]; } }
+ public static Color PaleGoldenrod { get { return namedColors["palegoldenrod"]; } }
+ public static Color PaleGreen { get { return namedColors["palegreen"]; } }
+ public static Color PaleTurquoise { get { return namedColors["paleturquoise"]; } }
+ public static Color PaleVioletRed { get { return namedColors["palevioletred"]; } }
+ public static Color PapayaWhip { get { return namedColors["papayawhip"]; } }
+ public static Color PeachPuff { get { return namedColors["peachpuff"]; } }
+ public static Color Peru { get { return namedColors["peru"]; } }
+ public static Color Pink { get { return namedColors["pink"]; } }
+ public static Color Plum { get { return namedColors["plum"]; } }
+ public static Color PowderBlue { get { return namedColors["powderblue"]; } }
+ public static Color Purple { get { return namedColors["purple"]; } }
+ public static Color RebeccaPurple { get { return namedColors["rebeccapurple"]; } }
+ public static Color Red { get { return namedColors["red"]; } }
+ public static Color RosyBrown { get { return namedColors["rosybrown"]; } }
+ public static Color RoyalBlue { get { return namedColors["royalblue"]; } }
+ public static Color SaddleBrown { get { return namedColors["saddlebrown"]; } }
+ public static Color Salmon { get { return namedColors["salmon"]; } }
+ public static Color SandyBrown { get { return namedColors["sandybrown"]; } }
+ public static Color SeaGreen { get { return namedColors["seagreen"]; } }
+ public static Color SeaShell { get { return namedColors["seashell"]; } }
+ public static Color Sienna { get { return namedColors["sienna"]; } }
+ public static Color Silver { get { return namedColors["silver"]; } }
+ public static Color SkyBlue { get { return namedColors["skyblue"]; } }
+ public static Color SlateBlue { get { return namedColors["slateblue"]; } }
+ public static Color SlateGray { get { return namedColors["slategray"]; } }
+ public static Color Snow { get { return namedColors["snow"]; } }
+ public static Color SpringGreen { get { return namedColors["springgreen"]; } }
+ public static Color SteelBlue { get { return namedColors["steelblue"]; } }
+ public static Color Tan { get { return namedColors["tan"]; } }
+ public static Color Teal { get { return namedColors["teal"]; } }
+ public static Color Thistle { get { return namedColors["thistle"]; } }
+ public static Color Tomato { get { return namedColors["tomato"]; } }
+ public static Color Turquoise { get { return namedColors["turquoise"]; } }
+ public static Color Violet { get { return namedColors["violet"]; } }
+ public static Color WebGreen { get { return namedColors["webgreen"]; } }
+ public static Color WebGray { get { return namedColors["webgray"]; } }
+ public static Color WebMaroon { get { return namedColors["webmaroon"]; } }
+ public static Color WebPurple { get { return namedColors["webpurple"]; } }
+ public static Color Wheat { get { return namedColors["wheat"]; } }
+ public static Color White { get { return namedColors["white"]; } }
+ public static Color WhiteSmoke { get { return namedColors["whitesmoke"]; } }
+ public static Color Yellow { get { return namedColors["yellow"]; } }
+ public static Color YellowGreen { get { return namedColors["yellowgreen"]; } }
+ }
+}
diff --git a/modules/mono/glue/Managed/Files/Mathf.cs b/modules/mono/glue/Managed/Files/Mathf.cs
index a89dfe5f27..dcab3c1ffc 100644
--- a/modules/mono/glue/Managed/Files/Mathf.cs
+++ b/modules/mono/glue/Managed/Files/Mathf.cs
@@ -206,7 +206,7 @@ namespace Godot
public static real_t PosMod(real_t a, real_t b)
{
real_t c = a % b;
- if ((c < 0 && b > 0) || (c > 0 && b < 0))
+ if ((c < 0 && b > 0) || (c > 0 && b < 0))
{
c += b;
}
@@ -219,7 +219,7 @@ namespace Godot
public static int PosMod(int a, int b)
{
int c = a % b;
- if ((c < 0 && b > 0) || (c > 0 && b < 0))
+ if ((c < 0 && b > 0) || (c > 0 && b < 0))
{
c += b;
}
diff --git a/modules/mono/glue/Managed/Files/MathfEx.cs b/modules/mono/glue/Managed/Files/MathfEx.cs
index 739b7fb568..2ef02cc288 100644
--- a/modules/mono/glue/Managed/Files/MathfEx.cs
+++ b/modules/mono/glue/Managed/Files/MathfEx.cs
@@ -29,7 +29,7 @@ namespace Godot
public static int FloorToInt(real_t s)
{
return (int)Math.Floor(s);
- }
+ }
public static int RoundToInt(real_t s)
{
diff --git a/modules/mono/glue/Managed/Files/Plane.cs b/modules/mono/glue/Managed/Files/Plane.cs
index 9611dce11e..f11cd490a9 100644
--- a/modules/mono/glue/Managed/Files/Plane.cs
+++ b/modules/mono/glue/Managed/Files/Plane.cs
@@ -144,7 +144,7 @@ namespace Godot
{
return point - _normal * DistanceTo(point);
}
-
+
// Constants
private static readonly Plane _planeYZ = new Plane(1, 0, 0, 0);
private static readonly Plane _planeXZ = new Plane(0, 1, 0, 0);
@@ -153,8 +153,8 @@ namespace Godot
public static Plane PlaneYZ { get { return _planeYZ; } }
public static Plane PlaneXZ { get { return _planeXZ; } }
public static Plane PlaneXY { get { return _planeXY; } }
-
- // Constructors
+
+ // Constructors
public Plane(real_t a, real_t b, real_t c, real_t d)
{
_normal = new Vector3(a, b, c);
diff --git a/modules/mono/glue/Managed/Files/Quat.cs b/modules/mono/glue/Managed/Files/Quat.cs
index eaa027eb69..fd1ac01083 100644
--- a/modules/mono/glue/Managed/Files/Quat.cs
+++ b/modules/mono/glue/Managed/Files/Quat.cs
@@ -202,7 +202,7 @@ namespace Godot
// Static Readonly Properties
public static Quat Identity { get; } = new Quat(0f, 0f, 0f, 1f);
- // Constructors
+ // Constructors
public Quat(real_t x, real_t y, real_t z, real_t w)
{
this.x = x;
diff --git a/modules/mono/glue/Managed/Files/Rect2.cs b/modules/mono/glue/Managed/Files/Rect2.cs
index cb25c267bc..888f300347 100644
--- a/modules/mono/glue/Managed/Files/Rect2.cs
+++ b/modules/mono/glue/Managed/Files/Rect2.cs
@@ -182,8 +182,8 @@ namespace Godot
return newRect;
}
-
- // Constructors
+
+ // Constructors
public Rect2(Vector2 position, Vector2 size)
{
_position = position;
diff --git a/modules/mono/glue/Managed/Files/StringExtensions.cs b/modules/mono/glue/Managed/Files/StringExtensions.cs
index 21c9be98c1..c194facd0b 100644
--- a/modules/mono/glue/Managed/Files/StringExtensions.cs
+++ b/modules/mono/glue/Managed/Files/StringExtensions.cs
@@ -185,7 +185,7 @@ namespace Godot
int instanceIndex = 0;
int toIndex = 0;
-
+
if (caseSensitive) // Outside while loop to avoid checking multiple times, despite some code duplication.
{
while (true)
@@ -480,9 +480,9 @@ namespace Godot
return false; // Don't start with number plz
}
- bool validChar = instance[i] >= '0' &&
- instance[i] <= '9' || instance[i] >= 'a' &&
- instance[i] <= 'z' || instance[i] >= 'A' &&
+ bool validChar = instance[i] >= '0' &&
+ instance[i] <= '9' || instance[i] >= 'a' &&
+ instance[i] <= 'z' || instance[i] >= 'A' &&
instance[i] <= 'Z' || instance[i] == '_';
if (!validChar)
diff --git a/modules/mono/glue/Managed/Files/Transform.cs b/modules/mono/glue/Managed/Files/Transform.cs
index 068007d7f0..fa85855edd 100644
--- a/modules/mono/glue/Managed/Files/Transform.cs
+++ b/modules/mono/glue/Managed/Files/Transform.cs
@@ -124,16 +124,16 @@ namespace Godot
// Constants
private static readonly Transform _identity = new Transform(Basis.Identity, Vector3.Zero);
- private static readonly Transform _flipX = new Transform(new Basis(new Vector3(-1, 0, 0), new Vector3(0, 1, 0), new Vector3(0, 0, 1)), Vector3.Zero);
- private static readonly Transform _flipY = new Transform(new Basis(new Vector3(1, 0, 0), new Vector3(0, -1, 0), new Vector3(0, 0, 1)), Vector3.Zero);
- private static readonly Transform _flipZ = new Transform(new Basis(new Vector3(1, 0, 0), new Vector3(0, 1, 0), new Vector3(0, 0, -1)), Vector3.Zero);
+ private static readonly Transform _flipX = new Transform(new Basis(-1, 0, 0, 0, 1, 0, 0, 0, 1), Vector3.Zero);
+ private static readonly Transform _flipY = new Transform(new Basis(1, 0, 0, 0, -1, 0, 0, 0, 1), Vector3.Zero);
+ private static readonly Transform _flipZ = new Transform(new Basis(1, 0, 0, 0, 1, 0, 0, 0, -1), Vector3.Zero);
public static Transform Identity { get { return _identity; } }
public static Transform FlipX { get { return _flipX; } }
public static Transform FlipY { get { return _flipY; } }
public static Transform FlipZ { get { return _flipZ; } }
- // Constructors
+ // Constructors
public Transform(Vector3 xAxis, Vector3 yAxis, Vector3 zAxis, Vector3 origin)
{
basis = Basis.CreateFromAxes(xAxis, yAxis, zAxis);
diff --git a/modules/mono/glue/Managed/Files/Transform2D.cs b/modules/mono/glue/Managed/Files/Transform2D.cs
index 8d30833066..c9e5b560b2 100644
--- a/modules/mono/glue/Managed/Files/Transform2D.cs
+++ b/modules/mono/glue/Managed/Files/Transform2D.cs
@@ -261,15 +261,15 @@ namespace Godot
public static Transform2D Identity { get { return _identity; } }
public static Transform2D FlipX { get { return _flipX; } }
public static Transform2D FlipY { get { return _flipY; } }
-
- // Constructors
+
+ // Constructors
public Transform2D(Vector2 xAxis, Vector2 yAxis, Vector2 origin)
{
x = xAxis;
y = yAxis;
o = origin;
}
-
+
public Transform2D(real_t xx, real_t xy, real_t yx, real_t yy, real_t ox, real_t oy)
{
x = new Vector2(xx, xy);
diff --git a/modules/mono/glue/Managed/Files/Vector2.cs b/modules/mono/glue/Managed/Files/Vector2.cs
index 080b8802ba..ce41886bfc 100644
--- a/modules/mono/glue/Managed/Files/Vector2.cs
+++ b/modules/mono/glue/Managed/Files/Vector2.cs
@@ -215,7 +215,7 @@ namespace Godot
x = v.x;
y = v.y;
}
-
+
public Vector2 Slerp(Vector2 b, real_t t)
{
real_t theta = AngleTo(b);
@@ -242,7 +242,7 @@ namespace Godot
private static readonly Vector2 _one = new Vector2(1, 1);
private static readonly Vector2 _negOne = new Vector2(-1, -1);
private static readonly Vector2 _inf = new Vector2(Mathf.Inf, Mathf.Inf);
-
+
private static readonly Vector2 _up = new Vector2(0, -1);
private static readonly Vector2 _down = new Vector2(0, 1);
private static readonly Vector2 _right = new Vector2(1, 0);
diff --git a/modules/mono/glue/Managed/Files/Vector3.cs b/modules/mono/glue/Managed/Files/Vector3.cs
index 6fffe5e4d6..f6ff27989d 100644
--- a/modules/mono/glue/Managed/Files/Vector3.cs
+++ b/modules/mono/glue/Managed/Files/Vector3.cs
@@ -204,9 +204,9 @@ namespace Godot
public Basis Outer(Vector3 b)
{
return new Basis(
- new Vector3(x * b.x, x * b.y, x * b.z),
- new Vector3(y * b.x, y * b.y, y * b.z),
- new Vector3(z * b.x, z * b.y, z * b.z)
+ x * b.x, x * b.y, x * b.z,
+ y * b.x, y * b.y, y * b.z,
+ z * b.x, z * b.y, z * b.z
);
}
@@ -276,13 +276,13 @@ namespace Godot
0f, 0f, z
);
}
-
+
// Constants
private static readonly Vector3 _zero = new Vector3(0, 0, 0);
private static readonly Vector3 _one = new Vector3(1, 1, 1);
private static readonly Vector3 _negOne = new Vector3(-1, -1, -1);
private static readonly Vector3 _inf = new Vector3(Mathf.Inf, Mathf.Inf, Mathf.Inf);
-
+
private static readonly Vector3 _up = new Vector3(0, 1, 0);
private static readonly Vector3 _down = new Vector3(0, -1, 0);
private static readonly Vector3 _right = new Vector3(1, 0, 0);
@@ -294,7 +294,7 @@ namespace Godot
public static Vector3 One { get { return _one; } }
public static Vector3 NegOne { get { return _negOne; } }
public static Vector3 Inf { get { return _inf; } }
-
+
public static Vector3 Up { get { return _up; } }
public static Vector3 Down { get { return _down; } }
public static Vector3 Right { get { return _right; } }
diff --git a/modules/mono/glue/Managed/Properties/AssemblyInfo.cs b/modules/mono/glue/Managed/Properties/AssemblyInfo.cs
index 7ed68acad7..77b3774e81 100644
--- a/modules/mono/glue/Managed/Properties/AssemblyInfo.cs
+++ b/modules/mono/glue/Managed/Properties/AssemblyInfo.cs
@@ -1,7 +1,7 @@
using System.Reflection;
using System.Runtime.CompilerServices;
-// Information about this assembly is defined by the following attributes.
+// Information about this assembly is defined by the following attributes.
// Change them to the values specific to your project.
[assembly: AssemblyTitle("Managed")]
@@ -19,7 +19,7 @@ using System.Runtime.CompilerServices;
[assembly: AssemblyVersion("1.0.*")]
-// The following attributes are used to specify the signing key for the assembly,
+// The following attributes are used to specify the signing key for the assembly,
// if desired. See the Mono documentation for more information about signing.
//[assembly: AssemblyDelaySign(false)]
diff --git a/modules/mono/glue/base_object_glue.cpp b/modules/mono/glue/base_object_glue.cpp
index d718c3cc61..88adc3e256 100644
--- a/modules/mono/glue/base_object_glue.cpp
+++ b/modules/mono/glue/base_object_glue.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -54,8 +54,10 @@ void godot_icall_Object_Disposed(MonoObject *p_obj, Object *p_ptr) {
if (p_ptr->get_script_instance()) {
CSharpInstance *cs_instance = CAST_CSHARP_INSTANCE(p_ptr->get_script_instance());
if (cs_instance) {
- cs_instance->mono_object_disposed(p_obj);
- p_ptr->set_script_instance(NULL);
+ if (!cs_instance->is_destructing_script_instance()) {
+ cs_instance->mono_object_disposed(p_obj);
+ p_ptr->set_script_instance(NULL);
+ }
return;
}
}
@@ -82,12 +84,14 @@ void godot_icall_Reference_Disposed(MonoObject *p_obj, Object *p_ptr, bool p_is_
if (ref->get_script_instance()) {
CSharpInstance *cs_instance = CAST_CSHARP_INSTANCE(ref->get_script_instance());
if (cs_instance) {
- bool r_owner_deleted;
- cs_instance->mono_object_disposed_baseref(p_obj, p_is_finalizer, r_owner_deleted);
- if (!r_owner_deleted && !p_is_finalizer) {
- // If the native instance is still alive and Dispose() was called
- // (instead of the finalizer), then we remove the script instance.
- ref->set_script_instance(NULL);
+ if (!cs_instance->is_destructing_script_instance()) {
+ bool r_owner_deleted;
+ cs_instance->mono_object_disposed_baseref(p_obj, p_is_finalizer, r_owner_deleted);
+ if (!r_owner_deleted && !p_is_finalizer) {
+ // If the native instance is still alive and Dispose() was called
+ // (instead of the finalizer), then we remove the script instance.
+ ref->set_script_instance(NULL);
+ }
}
return;
}
diff --git a/modules/mono/glue/base_object_glue.h b/modules/mono/glue/base_object_glue.h
index 2d4d66ebb8..e126fac6ca 100644
--- a/modules/mono/glue/base_object_glue.h
+++ b/modules/mono/glue/base_object_glue.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/glue/collections_glue.cpp b/modules/mono/glue/collections_glue.cpp
index 059e2ff6de..0e5747a014 100644
--- a/modules/mono/glue/collections_glue.cpp
+++ b/modules/mono/glue/collections_glue.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/glue/collections_glue.h b/modules/mono/glue/collections_glue.h
index b9b1338510..52ca98b7f9 100644
--- a/modules/mono/glue/collections_glue.h
+++ b/modules/mono/glue/collections_glue.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/glue/gd_glue.cpp b/modules/mono/glue/gd_glue.cpp
index 9f5bcecdd9..e49ed876e7 100644
--- a/modules/mono/glue/gd_glue.cpp
+++ b/modules/mono/glue/gd_glue.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/glue/gd_glue.h b/modules/mono/glue/gd_glue.h
index 6f846f221d..00611fef12 100644
--- a/modules/mono/glue/gd_glue.h
+++ b/modules/mono/glue/gd_glue.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/glue/glue_header.h b/modules/mono/glue/glue_header.h
index 69c5c6dcdb..b6e8ac6909 100644
--- a/modules/mono/glue/glue_header.h
+++ b/modules/mono/glue/glue_header.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/glue/nodepath_glue.cpp b/modules/mono/glue/nodepath_glue.cpp
index 422d73104d..2edc43af8d 100644
--- a/modules/mono/glue/nodepath_glue.cpp
+++ b/modules/mono/glue/nodepath_glue.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/glue/nodepath_glue.h b/modules/mono/glue/nodepath_glue.h
index 92579399a6..2192444336 100644
--- a/modules/mono/glue/nodepath_glue.h
+++ b/modules/mono/glue/nodepath_glue.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/glue/rid_glue.cpp b/modules/mono/glue/rid_glue.cpp
index 6c002b5b9d..6a9810d0d4 100644
--- a/modules/mono/glue/rid_glue.cpp
+++ b/modules/mono/glue/rid_glue.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/glue/rid_glue.h b/modules/mono/glue/rid_glue.h
index c725a9b5de..4b593e8a95 100644
--- a/modules/mono/glue/rid_glue.h
+++ b/modules/mono/glue/rid_glue.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/glue/string_glue.cpp b/modules/mono/glue/string_glue.cpp
index e1a2f1affd..a5c72160d7 100644
--- a/modules/mono/glue/string_glue.cpp
+++ b/modules/mono/glue/string_glue.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/glue/string_glue.h b/modules/mono/glue/string_glue.h
index 8b1553e28b..c9052edd40 100644
--- a/modules/mono/glue/string_glue.h
+++ b/modules/mono/glue/string_glue.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/godotsharp_defs.h b/modules/mono/godotsharp_defs.h
index 5a6a2d1742..0d3b96d789 100644
--- a/modules/mono/godotsharp_defs.h
+++ b/modules/mono/godotsharp_defs.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/godotsharp_dirs.cpp b/modules/mono/godotsharp_dirs.cpp
index d3fb2cb640..3943c0c7d7 100644
--- a/modules/mono/godotsharp_dirs.cpp
+++ b/modules/mono/godotsharp_dirs.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/godotsharp_dirs.h b/modules/mono/godotsharp_dirs.h
index 35b564be30..a038e6486c 100644
--- a/modules/mono/godotsharp_dirs.h
+++ b/modules/mono/godotsharp_dirs.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/mono_gc_handle.cpp b/modules/mono/mono_gc_handle.cpp
index f695bddfeb..b6c9b5f7dd 100644
--- a/modules/mono/mono_gc_handle.cpp
+++ b/modules/mono/mono_gc_handle.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/mono_gc_handle.h b/modules/mono/mono_gc_handle.h
index e5aa04e2b8..63b61aff18 100644
--- a/modules/mono/mono_gc_handle.h
+++ b/modules/mono/mono_gc_handle.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/mono_gd/gd_mono.cpp b/modules/mono/mono_gd/gd_mono.cpp
index a80155bd89..a422224fcb 100644
--- a/modules/mono/mono_gd/gd_mono.cpp
+++ b/modules/mono/mono_gd/gd_mono.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/mono_gd/gd_mono.h b/modules/mono/mono_gd/gd_mono.h
index fd9551b6de..6a00b287b0 100644
--- a/modules/mono/mono_gd/gd_mono.h
+++ b/modules/mono/mono_gd/gd_mono.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/mono_gd/gd_mono_assembly.cpp b/modules/mono/mono_gd/gd_mono_assembly.cpp
index 72b0204672..85273bfdb4 100644
--- a/modules/mono/mono_gd/gd_mono_assembly.cpp
+++ b/modules/mono/mono_gd/gd_mono_assembly.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/mono_gd/gd_mono_assembly.h b/modules/mono/mono_gd/gd_mono_assembly.h
index 2af40ec901..8f47ee26f8 100644
--- a/modules/mono/mono_gd/gd_mono_assembly.h
+++ b/modules/mono/mono_gd/gd_mono_assembly.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/mono_gd/gd_mono_class.cpp b/modules/mono/mono_gd/gd_mono_class.cpp
index 4e515cde28..bf2a84c708 100644
--- a/modules/mono/mono_gd/gd_mono_class.cpp
+++ b/modules/mono/mono_gd/gd_mono_class.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -151,6 +151,7 @@ void GDMonoClass::fetch_methods_with_godot_api_checks(GDMonoClass *p_native_base
while ((raw_method = mono_class_get_methods(get_mono_ptr(), &iter)) != NULL) {
StringName name = mono_method_get_name(raw_method);
+ // get_method implicitly fetches methods and adds them to this->methods
GDMonoMethod *method = get_method(raw_method, name);
ERR_CONTINUE(!method);
@@ -449,6 +450,21 @@ const Vector<GDMonoClass *> &GDMonoClass::get_all_delegates() {
return delegates_list;
}
+const Vector<GDMonoMethod *> &GDMonoClass::get_all_methods() {
+
+ if (!method_list_fetched) {
+ void *iter = NULL;
+ MonoMethod *raw_method = NULL;
+ while ((raw_method = mono_class_get_methods(get_mono_ptr(), &iter)) != NULL) {
+ method_list.push_back(memnew(GDMonoMethod(mono_method_get_name(raw_method), raw_method)));
+ }
+
+ method_list_fetched = true;
+ }
+
+ return method_list;
+}
+
GDMonoClass::GDMonoClass(const StringName &p_namespace, const StringName &p_name, MonoClass *p_class, GDMonoAssembly *p_assembly) {
namespace_name = p_namespace;
@@ -460,6 +476,7 @@ GDMonoClass::GDMonoClass(const StringName &p_namespace, const StringName &p_name
attributes = NULL;
methods_fetched = false;
+ method_list_fetched = false;
fields_fetched = false;
properties_fetched = false;
delegates_fetched = false;
@@ -512,4 +529,8 @@ GDMonoClass::~GDMonoClass() {
methods.clear();
}
+
+ for (int i = 0; i < method_list.size(); ++i) {
+ memdelete(method_list[i]);
+ }
}
diff --git a/modules/mono/mono_gd/gd_mono_class.h b/modules/mono/mono_gd/gd_mono_class.h
index 477305d503..08718ec1a4 100644
--- a/modules/mono/mono_gd/gd_mono_class.h
+++ b/modules/mono/mono_gd/gd_mono_class.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -79,9 +79,14 @@ class GDMonoClass {
bool attrs_fetched;
MonoCustomAttrInfo *attributes;
+ // This contains both the original method names and remapped method names from the native Godot identifiers to the C# functions.
+ // Most method-related functions refer to this and it's possible this is unintuitive for outside users; this may be a prime location for refactoring or renaming.
bool methods_fetched;
HashMap<MethodKey, GDMonoMethod *, MethodKey::Hasher> methods;
+ bool method_list_fetched;
+ Vector<GDMonoMethod *> method_list;
+
bool fields_fetched;
Map<StringName, GDMonoField *> fields;
Vector<GDMonoField *> fields_list;
@@ -143,6 +148,8 @@ public:
const Vector<GDMonoClass *> &get_all_delegates();
+ const Vector<GDMonoMethod *> &get_all_methods();
+
~GDMonoClass();
};
diff --git a/modules/mono/mono_gd/gd_mono_class_member.h b/modules/mono/mono_gd/gd_mono_class_member.h
index 008ea0e416..5bd21178ba 100644
--- a/modules/mono/mono_gd/gd_mono_class_member.h
+++ b/modules/mono/mono_gd/gd_mono_class_member.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#ifndef GD_MONO_CLASS_MEMBER_H
#define GD_MONO_CLASS_MEMBER_H
diff --git a/modules/mono/mono_gd/gd_mono_field.cpp b/modules/mono/mono_gd/gd_mono_field.cpp
index 5d9b9213e7..a9d993412e 100644
--- a/modules/mono/mono_gd/gd_mono_field.cpp
+++ b/modules/mono/mono_gd/gd_mono_field.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -423,7 +423,7 @@ void GDMonoField::set_value_from_variant(MonoObject *p_object, const Variant &p_
MonoException *exc = NULL;
GDMonoUtils::IsDictionaryGenericType type_is_dict = CACHED_METHOD_THUNK(MarshalUtils, IsDictionaryGenericType);
- MonoBoolean is_dict = type_is_dict((MonoObject *)reftype, (MonoObject **)&exc);
+ MonoBoolean is_dict = invoke_method_thunk(type_is_dict, (MonoObject *)reftype, (MonoObject **)&exc);
UNLIKELY_UNHANDLED_EXCEPTION(exc);
if (is_dict) {
@@ -435,7 +435,7 @@ void GDMonoField::set_value_from_variant(MonoObject *p_object, const Variant &p_
exc = NULL;
GDMonoUtils::IsArrayGenericType type_is_array = CACHED_METHOD_THUNK(MarshalUtils, IsArrayGenericType);
- MonoBoolean is_array = type_is_array((MonoObject *)reftype, (MonoObject **)&exc);
+ MonoBoolean is_array = invoke_method_thunk(type_is_array, (MonoObject *)reftype, (MonoObject **)&exc);
UNLIKELY_UNHANDLED_EXCEPTION(exc);
if (is_array) {
diff --git a/modules/mono/mono_gd/gd_mono_field.h b/modules/mono/mono_gd/gd_mono_field.h
index a6b368c4d6..319e895ab9 100644
--- a/modules/mono/mono_gd/gd_mono_field.h
+++ b/modules/mono/mono_gd/gd_mono_field.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/mono_gd/gd_mono_header.h b/modules/mono/mono_gd/gd_mono_header.h
index 51d0c9b356..23306d11b9 100644
--- a/modules/mono/mono_gd/gd_mono_header.h
+++ b/modules/mono/mono_gd/gd_mono_header.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/mono_gd/gd_mono_internals.cpp b/modules/mono/mono_gd/gd_mono_internals.cpp
index 505c030ca1..0574b0025d 100644
--- a/modules/mono/mono_gd/gd_mono_internals.cpp
+++ b/modules/mono/mono_gd/gd_mono_internals.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/mono_gd/gd_mono_internals.h b/modules/mono/mono_gd/gd_mono_internals.h
index 50cadcedf6..09cb59ee6b 100644
--- a/modules/mono/mono_gd/gd_mono_internals.h
+++ b/modules/mono/mono_gd/gd_mono_internals.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/mono_gd/gd_mono_log.cpp b/modules/mono/mono_gd/gd_mono_log.cpp
index b7bb2cb2d6..fa4850ca8c 100644
--- a/modules/mono/mono_gd/gd_mono_log.cpp
+++ b/modules/mono/mono_gd/gd_mono_log.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/mono_gd/gd_mono_log.h b/modules/mono/mono_gd/gd_mono_log.h
index 3b4ff07b7b..a477e5edee 100644
--- a/modules/mono/mono_gd/gd_mono_log.h
+++ b/modules/mono/mono_gd/gd_mono_log.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/mono_gd/gd_mono_marshal.cpp b/modules/mono/mono_gd/gd_mono_marshal.cpp
index 2543f5dc47..74395de41c 100644
--- a/modules/mono/mono_gd/gd_mono_marshal.cpp
+++ b/modules/mono/mono_gd/gd_mono_marshal.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -163,7 +163,7 @@ Variant::Type managed_to_variant_type(const ManagedType &p_type) {
MonoException *exc = NULL;
GDMonoUtils::IsDictionaryGenericType type_is_dict = CACHED_METHOD_THUNK(MarshalUtils, IsDictionaryGenericType);
- MonoBoolean is_dict = type_is_dict((MonoObject *)reftype, (MonoObject **)&exc);
+ MonoBoolean is_dict = invoke_method_thunk(type_is_dict, (MonoObject *)reftype, (MonoObject **)&exc);
UNLIKELY_UNHANDLED_EXCEPTION(exc);
if (is_dict) {
@@ -172,7 +172,7 @@ Variant::Type managed_to_variant_type(const ManagedType &p_type) {
exc = NULL;
GDMonoUtils::IsArrayGenericType type_is_array = CACHED_METHOD_THUNK(MarshalUtils, IsArrayGenericType);
- MonoBoolean is_array = type_is_array((MonoObject *)reftype, (MonoObject **)&exc);
+ MonoBoolean is_array = invoke_method_thunk(type_is_array, (MonoObject *)reftype, (MonoObject **)&exc);
UNLIKELY_UNHANDLED_EXCEPTION(exc);
if (is_array) {
@@ -192,8 +192,11 @@ String mono_to_utf8_string(MonoString *p_mono_string) {
MonoError error;
char *utf8 = mono_string_to_utf8_checked(p_mono_string, &error);
- ERR_EXPLAIN("Conversion of MonoString to UTF8 failed.");
- ERR_FAIL_COND_V(!mono_error_ok(&error), String());
+ if (!mono_error_ok(&error)) {
+ ERR_PRINTS(String("Failed to convert MonoString* to UTF-8: ") + mono_error_get_message(&error));
+ mono_error_cleanup(&error);
+ return String();
+ }
String ret = String::utf8(utf8);
@@ -213,7 +216,7 @@ String mono_to_utf16_string(MonoString *p_mono_string) {
ret.set(len, 0);
CharType *src = (CharType *)mono_string_chars(p_mono_string);
- CharType *dst = &(ret.operator[](0));
+ CharType *dst = ret.ptrw();
for (int i = 0; i < len; i++) {
dst[i] = src[i];
@@ -546,7 +549,7 @@ MonoObject *variant_to_mono_object(const Variant *p_var, const ManagedType &p_ty
MonoException *exc = NULL;
GDMonoUtils::IsDictionaryGenericType type_is_dict = CACHED_METHOD_THUNK(MarshalUtils, IsDictionaryGenericType);
- MonoBoolean is_dict = type_is_dict((MonoObject *)reftype, (MonoObject **)&exc);
+ MonoBoolean is_dict = invoke_method_thunk(type_is_dict, (MonoObject *)reftype, (MonoObject **)&exc);
UNLIKELY_UNHANDLED_EXCEPTION(exc);
if (is_dict) {
@@ -555,7 +558,7 @@ MonoObject *variant_to_mono_object(const Variant *p_var, const ManagedType &p_ty
exc = NULL;
GDMonoUtils::IsArrayGenericType type_is_array = CACHED_METHOD_THUNK(MarshalUtils, IsArrayGenericType);
- MonoBoolean is_array = type_is_array((MonoObject *)reftype, (MonoObject **)&exc);
+ MonoBoolean is_array = invoke_method_thunk(type_is_array, (MonoObject *)reftype, (MonoObject **)&exc);
UNLIKELY_UNHANDLED_EXCEPTION(exc);
if (is_array) {
@@ -710,16 +713,14 @@ Variant mono_object_to_variant(MonoObject *p_obj) {
if (CACHED_CLASS(Array) == type_class) {
MonoException *exc = NULL;
- GDMonoUtils::Array_GetPtr get_ptr = CACHED_METHOD_THUNK(Array, GetPtr);
- Array *ptr = get_ptr(p_obj, (MonoObject **)&exc);
+ Array *ptr = invoke_method_thunk(CACHED_METHOD_THUNK(Array, GetPtr), p_obj, (MonoObject **)&exc);
UNLIKELY_UNHANDLED_EXCEPTION(exc);
return ptr ? Variant(*ptr) : Variant();
}
if (CACHED_CLASS(Dictionary) == type_class) {
MonoException *exc = NULL;
- GDMonoUtils::Dictionary_GetPtr get_ptr = CACHED_METHOD_THUNK(Dictionary, GetPtr);
- Dictionary *ptr = get_ptr(p_obj, (MonoObject **)&exc);
+ Dictionary *ptr = invoke_method_thunk(CACHED_METHOD_THUNK(Dictionary, GetPtr), p_obj, (MonoObject **)&exc);
UNLIKELY_UNHANDLED_EXCEPTION(exc);
return ptr ? Variant(*ptr) : Variant();
}
@@ -731,7 +732,7 @@ Variant mono_object_to_variant(MonoObject *p_obj) {
MonoException *exc = NULL;
GDMonoUtils::IsDictionaryGenericType type_is_dict = CACHED_METHOD_THUNK(MarshalUtils, IsDictionaryGenericType);
- MonoBoolean is_dict = type_is_dict((MonoObject *)reftype, (MonoObject **)&exc);
+ MonoBoolean is_dict = invoke_method_thunk(type_is_dict, (MonoObject *)reftype, (MonoObject **)&exc);
UNLIKELY_UNHANDLED_EXCEPTION(exc);
if (is_dict) {
@@ -744,7 +745,7 @@ Variant mono_object_to_variant(MonoObject *p_obj) {
exc = NULL;
GDMonoUtils::IsArrayGenericType type_is_array = CACHED_METHOD_THUNK(MarshalUtils, IsArrayGenericType);
- MonoBoolean is_array = type_is_array((MonoObject *)reftype, (MonoObject **)&exc);
+ MonoBoolean is_array = invoke_method_thunk(type_is_array, (MonoObject *)reftype, (MonoObject **)&exc);
UNLIKELY_UNHANDLED_EXCEPTION(exc);
if (is_array) {
diff --git a/modules/mono/mono_gd/gd_mono_marshal.h b/modules/mono/mono_gd/gd_mono_marshal.h
index 4002f2a225..5e2deea43c 100644
--- a/modules/mono/mono_gd/gd_mono_marshal.h
+++ b/modules/mono/mono_gd/gd_mono_marshal.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/mono_gd/gd_mono_method.cpp b/modules/mono/mono_gd/gd_mono_method.cpp
index 630bda8b4e..071d852ce7 100644
--- a/modules/mono/mono_gd/gd_mono_method.cpp
+++ b/modules/mono/mono_gd/gd_mono_method.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -68,6 +68,10 @@ void GDMonoMethod::_update_signature(MonoMethodSignature *p_method_sig) {
param_types.push_back(param_type);
}
+
+ // clear the cache
+ method_info_fetched = false;
+ method_info = MethodInfo();
}
bool GDMonoMethod::is_static() {
@@ -246,11 +250,34 @@ void GDMonoMethod::get_parameter_types(Vector<ManagedType> &types) const {
}
}
+const MethodInfo &GDMonoMethod::get_method_info() {
+
+ if (!method_info_fetched) {
+ method_info.name = name;
+ method_info.return_val = PropertyInfo(GDMonoMarshal::managed_to_variant_type(return_type), "");
+
+ Vector<StringName> names;
+ get_parameter_names(names);
+
+ for (int i = 0; i < params_count; ++i) {
+ method_info.arguments.push_back(PropertyInfo(GDMonoMarshal::managed_to_variant_type(param_types[i]), names[i]));
+ }
+
+ // TODO: default arguments
+
+ method_info_fetched = true;
+ }
+
+ return method_info;
+}
+
GDMonoMethod::GDMonoMethod(StringName p_name, MonoMethod *p_method) {
name = p_name;
mono_method = p_method;
+ method_info_fetched = false;
+
attrs_fetched = false;
attributes = NULL;
diff --git a/modules/mono/mono_gd/gd_mono_method.h b/modules/mono/mono_gd/gd_mono_method.h
index 444ec2a67d..c4a994177e 100644
--- a/modules/mono/mono_gd/gd_mono_method.h
+++ b/modules/mono/mono_gd/gd_mono_method.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -43,6 +43,9 @@ class GDMonoMethod : public GDMonoClassMember {
ManagedType return_type;
Vector<ManagedType> param_types;
+ bool method_info_fetched;
+ MethodInfo method_info;
+
bool attrs_fetched;
MonoCustomAttrInfo *attributes;
@@ -83,6 +86,8 @@ public:
void get_parameter_names(Vector<StringName> &names) const;
void get_parameter_types(Vector<ManagedType> &types) const;
+ const MethodInfo &get_method_info();
+
GDMonoMethod(StringName p_name, MonoMethod *p_method);
~GDMonoMethod();
};
diff --git a/modules/mono/mono_gd/gd_mono_property.cpp b/modules/mono/mono_gd/gd_mono_property.cpp
index ce66e0c8db..04fd8b8e63 100644
--- a/modules/mono/mono_gd/gd_mono_property.cpp
+++ b/modules/mono/mono_gd/gd_mono_property.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#include "gd_mono_property.h"
#include "gd_mono_class.h"
diff --git a/modules/mono/mono_gd/gd_mono_property.h b/modules/mono/mono_gd/gd_mono_property.h
index b3f1e2114a..934ce68904 100644
--- a/modules/mono/mono_gd/gd_mono_property.h
+++ b/modules/mono/mono_gd/gd_mono_property.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#ifndef GD_MONO_PROPERTY_H
#define GD_MONO_PROPERTY_H
diff --git a/modules/mono/mono_gd/gd_mono_utils.cpp b/modules/mono/mono_gd/gd_mono_utils.cpp
index fe2c09799c..97a00a504d 100644
--- a/modules/mono/mono_gd/gd_mono_utils.cpp
+++ b/modules/mono/mono_gd/gd_mono_utils.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -694,4 +694,8 @@ uint64_t unbox_enum_value(MonoObject *p_boxed, MonoType *p_enum_basetype, bool &
}
}
+void dispose(MonoObject *p_mono_object, MonoException **r_exc) {
+ invoke_method_thunk(CACHED_METHOD_THUNK(GodotObject, Dispose), p_mono_object, (MonoObject **)r_exc);
+}
+
} // namespace GDMonoUtils
diff --git a/modules/mono/mono_gd/gd_mono_utils.h b/modules/mono/mono_gd/gd_mono_utils.h
index f00680ff03..6febc50a5f 100644
--- a/modules/mono/mono_gd/gd_mono_utils.h
+++ b/modules/mono/mono_gd/gd_mono_utils.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -243,6 +243,8 @@ MonoObject *property_get_value(MonoProperty *p_prop, void *p_obj, void **p_param
uint64_t unbox_enum_value(MonoObject *p_boxed, MonoType *p_enum_basetype, bool &r_error);
+void dispose(MonoObject *p_mono_object, MonoException **r_exc);
+
} // namespace GDMonoUtils
#define NATIVE_GDMONOCLASS_NAME(m_class) (GDMonoMarshal::mono_string_to_godot((MonoString *)m_class->get_field(BINDINGS_NATIVE_NAME_FIELD)->get_value(NULL)))
@@ -267,4 +269,93 @@ uint64_t unbox_enum_value(MonoObject *p_boxed, MonoType *p_enum_basetype, bool &
#define GD_MONO_END_RUNTIME_INVOKE \
_runtime_invoke_count_ref -= 1;
+inline void invoke_method_thunk(void (*p_method_thunk)()) {
+ GD_MONO_BEGIN_RUNTIME_INVOKE;
+ p_method_thunk();
+ GD_MONO_END_RUNTIME_INVOKE;
+}
+
+template <class R>
+R invoke_method_thunk(R (*p_method_thunk)()) {
+ GD_MONO_BEGIN_RUNTIME_INVOKE;
+ R r = p_method_thunk();
+ GD_MONO_END_RUNTIME_INVOKE;
+ return r;
+}
+
+template <class P1>
+void invoke_method_thunk(void (*p_method_thunk)(P1), P1 p_arg1) {
+ GD_MONO_BEGIN_RUNTIME_INVOKE;
+ p_method_thunk(p_arg1);
+ GD_MONO_END_RUNTIME_INVOKE;
+}
+
+template <class R, class P1>
+R invoke_method_thunk(R (*p_method_thunk)(P1), P1 p_arg1) {
+ GD_MONO_BEGIN_RUNTIME_INVOKE;
+ R r = p_method_thunk(p_arg1);
+ GD_MONO_END_RUNTIME_INVOKE;
+ return r;
+}
+
+template <class P1, class P2>
+void invoke_method_thunk(void (*p_method_thunk)(P1, P2), P1 p_arg1, P2 p_arg2) {
+ GD_MONO_BEGIN_RUNTIME_INVOKE;
+ p_method_thunk(p_arg1, p_arg2);
+ GD_MONO_END_RUNTIME_INVOKE;
+}
+
+template <class R, class P1, class P2>
+R invoke_method_thunk(R (*p_method_thunk)(P1, P2), P1 p_arg1, P2 p_arg2) {
+ GD_MONO_BEGIN_RUNTIME_INVOKE;
+ R r = p_method_thunk(p_arg1, p_arg2);
+ GD_MONO_END_RUNTIME_INVOKE;
+ return r;
+}
+
+template <class P1, class P2, class P3>
+void invoke_method_thunk(void (*p_method_thunk)(P1, P2, P3), P1 p_arg1, P2 p_arg2, P3 p_arg3) {
+ GD_MONO_BEGIN_RUNTIME_INVOKE;
+ p_method_thunk(p_arg1, p_arg2, p_arg3);
+ GD_MONO_END_RUNTIME_INVOKE;
+}
+
+template <class R, class P1, class P2, class P3>
+R invoke_method_thunk(R (*p_method_thunk)(P1, P2, P3), P1 p_arg1, P2 p_arg2, P3 p_arg3) {
+ GD_MONO_BEGIN_RUNTIME_INVOKE;
+ R r = p_method_thunk(p_arg1, p_arg2, p_arg3);
+ GD_MONO_END_RUNTIME_INVOKE;
+ return r;
+}
+
+template <class P1, class P2, class P3, class P4>
+void invoke_method_thunk(void (*p_method_thunk)(P1, P2, P3, P4), P1 p_arg1, P2 p_arg2, P3 p_arg3, P4 p_arg4) {
+ GD_MONO_BEGIN_RUNTIME_INVOKE;
+ p_method_thunk(p_arg1, p_arg2, p_arg3, p_arg4);
+ GD_MONO_END_RUNTIME_INVOKE;
+}
+
+template <class R, class P1, class P2, class P3, class P4>
+R invoke_method_thunk(R (*p_method_thunk)(P1, P2, P3, P4), P1 p_arg1, P2 p_arg2, P3 p_arg3, P4 p_arg4) {
+ GD_MONO_BEGIN_RUNTIME_INVOKE;
+ R r = p_method_thunk(p_arg1, p_arg2, p_arg3, p_arg4);
+ GD_MONO_END_RUNTIME_INVOKE;
+ return r;
+}
+
+template <class P1, class P2, class P3, class P4, class P5>
+void invoke_method_thunk(void (*p_method_thunk)(P1, P2, P3, P4, P5), P1 p_arg1, P2 p_arg2, P3 p_arg3, P4 p_arg4, P5 p_arg5) {
+ GD_MONO_BEGIN_RUNTIME_INVOKE;
+ p_method_thunk(p_arg1, p_arg2, p_arg3, p_arg4, p_arg5);
+ GD_MONO_END_RUNTIME_INVOKE;
+}
+
+template <class R, class P1, class P2, class P3, class P4, class P5>
+R invoke_method_thunk(R (*p_method_thunk)(P1, P2, P3, P4, P5), P1 p_arg1, P2 p_arg2, P3 p_arg3, P4 p_arg4, P5 p_arg5) {
+ GD_MONO_BEGIN_RUNTIME_INVOKE;
+ R r = p_method_thunk(p_arg1, p_arg2, p_arg3, p_arg4, p_arg5);
+ GD_MONO_END_RUNTIME_INVOKE;
+ return r;
+}
+
#endif // GD_MONOUTILS_H
diff --git a/modules/mono/register_types.cpp b/modules/mono/register_types.cpp
index f6cb143e8e..3607b6f8b3 100644
--- a/modules/mono/register_types.cpp
+++ b/modules/mono/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -35,8 +35,8 @@
#include "csharp_script.h"
CSharpLanguage *script_language_cs = NULL;
-ResourceFormatLoaderCSharpScript *resource_loader_cs = NULL;
-ResourceFormatSaverCSharpScript *resource_saver_cs = NULL;
+Ref<ResourceFormatLoaderCSharpScript> resource_loader_cs;
+Ref<ResourceFormatSaverCSharpScript> resource_saver_cs;
_GodotSharp *_godotsharp = NULL;
@@ -52,9 +52,10 @@ void register_mono_types() {
script_language_cs->set_language_index(ScriptServer::get_language_count());
ScriptServer::register_language(script_language_cs);
- resource_loader_cs = memnew(ResourceFormatLoaderCSharpScript);
+ resource_loader_cs.instance();
ResourceLoader::add_resource_format_loader(resource_loader_cs);
- resource_saver_cs = memnew(ResourceFormatSaverCSharpScript);
+
+ resource_saver_cs.instance();
ResourceSaver::add_resource_format_saver(resource_saver_cs);
}
@@ -63,10 +64,12 @@ void unregister_mono_types() {
if (script_language_cs)
memdelete(script_language_cs);
- if (resource_loader_cs)
- memdelete(resource_loader_cs);
- if (resource_saver_cs)
- memdelete(resource_saver_cs);
+
+ ResourceLoader::remove_resource_format_loader(resource_loader_cs);
+ resource_loader_cs.unref();
+
+ ResourceSaver::remove_resource_format_saver(resource_saver_cs);
+ resource_saver_cs.unref();
if (_godotsharp)
memdelete(_godotsharp);
diff --git a/modules/mono/register_types.h b/modules/mono/register_types.h
index ab8a7d6463..0601e9a382 100644
--- a/modules/mono/register_types.h
+++ b/modules/mono/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/signal_awaiter_utils.cpp b/modules/mono/signal_awaiter_utils.cpp
index fa1fbebb16..5051d83694 100644
--- a/modules/mono/signal_awaiter_utils.cpp
+++ b/modules/mono/signal_awaiter_utils.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -98,11 +98,9 @@ Variant SignalAwaiterHandle::_signal_callback(const Variant **p_args, int p_argc
mono_array_set(signal_args, MonoObject *, i, boxed);
}
- GDMonoUtils::SignalAwaiter_SignalCallback thunk = CACHED_METHOD_THUNK(SignalAwaiter, SignalCallback);
-
MonoException *exc = NULL;
GD_MONO_BEGIN_RUNTIME_INVOKE;
- thunk(get_target(), signal_args, (MonoObject **)&exc);
+ invoke_method_thunk(CACHED_METHOD_THUNK(SignalAwaiter, SignalCallback), get_target(), signal_args, (MonoObject **)&exc);
GD_MONO_END_RUNTIME_INVOKE;
if (exc) {
@@ -129,14 +127,12 @@ SignalAwaiterHandle::SignalAwaiterHandle(MonoObject *p_managed) :
SignalAwaiterHandle::~SignalAwaiterHandle() {
if (!completed) {
- GDMonoUtils::SignalAwaiter_FailureCallback thunk = CACHED_METHOD_THUNK(SignalAwaiter, FailureCallback);
-
MonoObject *awaiter = get_target();
if (awaiter) {
MonoException *exc = NULL;
GD_MONO_BEGIN_RUNTIME_INVOKE;
- thunk(awaiter, (MonoObject **)&exc);
+ invoke_method_thunk(CACHED_METHOD_THUNK(SignalAwaiter, FailureCallback), awaiter, (MonoObject **)&exc);
GD_MONO_END_RUNTIME_INVOKE;
if (exc) {
diff --git a/modules/mono/signal_awaiter_utils.h b/modules/mono/signal_awaiter_utils.h
index 4ec860537b..098008ded7 100644
--- a/modules/mono/signal_awaiter_utils.h
+++ b/modules/mono/signal_awaiter_utils.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/utils/macros.h b/modules/mono/utils/macros.h
index 40b47e8648..94e1193adf 100644
--- a/modules/mono/utils/macros.h
+++ b/modules/mono/utils/macros.h
@@ -1,12 +1,12 @@
/*************************************************************************/
-/* util_macros.h */
+/* macros.h */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -31,15 +31,17 @@
#ifndef UTIL_MACROS_H
#define UTIL_MACROS_H
+#define _GD_VARNAME_CONCAT_B(m_ignore, m_name) m_name
+#define _GD_VARNAME_CONCAT_A(m_a, m_b, m_c) _GD_VARNAME_CONCAT_B(hello there, m_a##m_b##m_c)
+#define _GD_VARNAME_CONCAT(m_a, m_b, m_c) _GD_VARNAME_CONCAT_A(m_a, m_b, m_c)
+#define GD_UNIQUE_NAME(m_name) _GD_VARNAME_CONCAT(m_name, _, __COUNTER__)
+
// noreturn
#if __cpp_static_assert
#define GD_STATIC_ASSERT(m_cond) static_assert((m_cond), "Condition '" #m_cond "' failed")
#else
-#define _GD_STATIC_ASSERT_VARNAME_CONCAT_B(m_ignore, m_name) m_name
-#define _GD_STATIC_ASSERT_VARNAME_CONCAT_A(m_a, m_b) GD_STATIC_ASSERT_VARNAME_CONCAT_B(hello there, m_a##m_b)
-#define _GD_STATIC_ASSERT_VARNAME_CONCAT(m_a, m_b) GD_STATIC_ASSERT_VARNAME_CONCAT_A(m_a, m_b)
-#define GD_STATIC_ASSERT(m_cond) typedef int GD_STATIC_ASSERT_VARNAME_CONCAT(godot_static_assert_, __COUNTER__)[((m_cond) ? 1 : -1)]
+#define GD_STATIC_ASSERT(m_cond) typedef int GD_UNIQUE_NAME(godot_static_assert)[((m_cond) ? 1 : -1)]
#endif
#undef _NO_RETURN_
diff --git a/modules/mono/utils/mono_reg_utils.cpp b/modules/mono/utils/mono_reg_utils.cpp
index 6bb6efa92a..76b250e038 100644
--- a/modules/mono/utils/mono_reg_utils.cpp
+++ b/modules/mono/utils/mono_reg_utils.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/utils/mono_reg_utils.h b/modules/mono/utils/mono_reg_utils.h
index 26f7e2d3c2..25446a4992 100644
--- a/modules/mono/utils/mono_reg_utils.h
+++ b/modules/mono/utils/mono_reg_utils.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/android/globals/global_defaults.cpp b/modules/mono/utils/mutex_utils.h
index efeb8598e5..b8be033cba 100644
--- a/platform/android/globals/global_defaults.cpp
+++ b/modules/mono/utils/mutex_utils.h
@@ -1,12 +1,12 @@
/*************************************************************************/
-/* global_defaults.cpp */
+/* mutex_utils.h */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -28,8 +28,40 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
-#include "global_defaults.h"
-#include "core/project_settings.h"
+#ifndef MUTEX_UTILS_H
+#define MUTEX_UTILS_H
-void register_android_global_defaults() {
-}
+#include "core/error_macros.h"
+#include "core/os/mutex.h"
+
+#include "macros.h"
+
+class ScopedMutexLock {
+ Mutex *mutex;
+
+public:
+ ScopedMutexLock(Mutex *mutex) {
+ this->mutex = mutex;
+#ifndef NO_THREADS
+#ifdef DEBUG_ENABLED
+ CRASH_COND(!mutex);
+#endif
+ this->mutex->lock();
+#endif
+ }
+
+ ~ScopedMutexLock() {
+#ifndef NO_THREADS
+#ifdef DEBUG_ENABLED
+ CRASH_COND(!mutex);
+#endif
+ mutex->unlock();
+#endif
+ }
+};
+
+#define SCOPED_MUTEX_LOCK(m_mutex) ScopedMutexLock GD_UNIQUE_NAME(__scoped_mutex_lock__)(m_mutex);
+
+// TODO: Add version that receives a lambda instead, once C++11 is allowed
+
+#endif // MUTEX_UTILS_H
diff --git a/modules/mono/utils/osx_utils.cpp b/modules/mono/utils/osx_utils.cpp
index f520706a0c..5ed982200f 100644
--- a/modules/mono/utils/osx_utils.cpp
+++ b/modules/mono/utils/osx_utils.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/utils/osx_utils.h b/modules/mono/utils/osx_utils.h
index 68479b4f44..918642f7b2 100644
--- a/modules/mono/utils/osx_utils.h
+++ b/modules/mono/utils/osx_utils.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/utils/path_utils.cpp b/modules/mono/utils/path_utils.cpp
index e663ee3c4a..80f2324e15 100644
--- a/modules/mono/utils/path_utils.cpp
+++ b/modules/mono/utils/path_utils.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/utils/path_utils.h b/modules/mono/utils/path_utils.h
index 3c7b36c0d4..69edf4deb7 100644
--- a/modules/mono/utils/path_utils.h
+++ b/modules/mono/utils/path_utils.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/utils/string_utils.cpp b/modules/mono/utils/string_utils.cpp
index 6900866725..c390f8b9c2 100644
--- a/modules/mono/utils/string_utils.cpp
+++ b/modules/mono/utils/string_utils.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/utils/string_utils.h b/modules/mono/utils/string_utils.h
index ee803bd720..61765ccfd8 100644
--- a/modules/mono/utils/string_utils.h
+++ b/modules/mono/utils/string_utils.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/utils/thread_local.cpp b/modules/mono/utils/thread_local.cpp
index a0e28fca5f..13179bf408 100644
--- a/modules/mono/utils/thread_local.cpp
+++ b/modules/mono/utils/thread_local.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/mono/utils/thread_local.h b/modules/mono/utils/thread_local.h
index d7d98c47e2..276db8830b 100644
--- a/modules/mono/utils/thread_local.h
+++ b/modules/mono/utils/thread_local.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/ogg/register_types.cpp b/modules/ogg/register_types.cpp
index dba5dcc6e2..bea88bd654 100644
--- a/modules/ogg/register_types.cpp
+++ b/modules/ogg/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/ogg/register_types.h b/modules/ogg/register_types.h
index e82c90de0b..84e309455e 100644
--- a/modules/ogg/register_types.h
+++ b/modules/ogg/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/opensimplex/noise_texture.cpp b/modules/opensimplex/noise_texture.cpp
index be522a9ab1..b8126ab775 100644
--- a/modules/opensimplex/noise_texture.cpp
+++ b/modules/opensimplex/noise_texture.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/opensimplex/noise_texture.h b/modules/opensimplex/noise_texture.h
index 2a4c32d633..d1705f4070 100644
--- a/modules/opensimplex/noise_texture.h
+++ b/modules/opensimplex/noise_texture.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/opensimplex/open_simplex_noise.cpp b/modules/opensimplex/open_simplex_noise.cpp
index bfc2732ff4..b2d6b5e718 100644
--- a/modules/opensimplex/open_simplex_noise.cpp
+++ b/modules/opensimplex/open_simplex_noise.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/opensimplex/open_simplex_noise.h b/modules/opensimplex/open_simplex_noise.h
index a9bee266e8..ac4c6e361f 100644
--- a/modules/opensimplex/open_simplex_noise.h
+++ b/modules/opensimplex/open_simplex_noise.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/opensimplex/register_types.cpp b/modules/opensimplex/register_types.cpp
index d1c77da257..e110752109 100644
--- a/modules/opensimplex/register_types.cpp
+++ b/modules/opensimplex/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/opensimplex/register_types.h b/modules/opensimplex/register_types.h
index 5e71a30ea6..733a4812e0 100644
--- a/modules/opensimplex/register_types.h
+++ b/modules/opensimplex/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/opus/audio_stream_opus.cpp b/modules/opus/audio_stream_opus.cpp
index 3920b3cd6e..fda82295de 100644
--- a/modules/opus/audio_stream_opus.cpp
+++ b/modules/opus/audio_stream_opus.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/opus/audio_stream_opus.h b/modules/opus/audio_stream_opus.h
index c004adeb77..f53bff0288 100644
--- a/modules/opus/audio_stream_opus.h
+++ b/modules/opus/audio_stream_opus.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -132,6 +132,7 @@ public:
};
class ResourceFormatLoaderAudioStreamOpus : public ResourceFormatLoader {
+ GDCLASS(ResourceFormatLoaderAudioStreamOpus, ResourceFormatLoader)
public:
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
virtual void get_recognized_extensions(List<String> *p_extensions) const;
diff --git a/modules/opus/register_types.cpp b/modules/opus/register_types.cpp
index f34555841e..be266c8591 100644
--- a/modules/opus/register_types.cpp
+++ b/modules/opus/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -32,7 +32,7 @@
#include "audio_stream_opus.h"
-static ResourceFormatLoaderAudioStreamOpus *opus_stream_loader = NULL;
+static Ref<ResourceFormatLoaderAudioStreamOpus> opus_stream_loader;
void register_opus_types() {
// Sorry guys, do not enable this unless you can figure out a way
diff --git a/modules/opus/register_types.h b/modules/opus/register_types.h
index 84335adfc9..611bbf4fd0 100644
--- a/modules/opus/register_types.h
+++ b/modules/opus/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/opus/stub/register_types.cpp b/modules/opus/stub/register_types.cpp
index fe2bce63ba..e1f6ce7a27 100644
--- a/modules/opus/stub/register_types.cpp
+++ b/modules/opus/stub/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/opus/stub/register_types.h b/modules/opus/stub/register_types.h
index 84335adfc9..611bbf4fd0 100644
--- a/modules/opus/stub/register_types.h
+++ b/modules/opus/stub/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/pvr/register_types.cpp b/modules/pvr/register_types.cpp
index 0991828ef2..c87e631a11 100644
--- a/modules/pvr/register_types.cpp
+++ b/modules/pvr/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -32,15 +32,16 @@
#include "texture_loader_pvr.h"
-static ResourceFormatPVR *resource_loader_pvr = NULL;
+static Ref<ResourceFormatPVR> resource_loader_pvr;
void register_pvr_types() {
- resource_loader_pvr = memnew(ResourceFormatPVR);
+ resource_loader_pvr.instance();
ResourceLoader::add_resource_format_loader(resource_loader_pvr);
}
void unregister_pvr_types() {
- memdelete(resource_loader_pvr);
+ ResourceLoader::remove_resource_format_loader(resource_loader_pvr);
+ resource_loader_pvr.unref();
}
diff --git a/modules/pvr/register_types.h b/modules/pvr/register_types.h
index d187ab5334..cafa11791e 100644
--- a/modules/pvr/register_types.h
+++ b/modules/pvr/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/pvr/texture_loader_pvr.cpp b/modules/pvr/texture_loader_pvr.cpp
index e6718eb4a2..d3f2f3c272 100644
--- a/modules/pvr/texture_loader_pvr.cpp
+++ b/modules/pvr/texture_loader_pvr.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/pvr/texture_loader_pvr.h b/modules/pvr/texture_loader_pvr.h
index c859a4cdda..2808b4ff03 100644
--- a/modules/pvr/texture_loader_pvr.h
+++ b/modules/pvr/texture_loader_pvr.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -35,6 +35,7 @@
#include "scene/resources/texture.h"
class ResourceFormatPVR : public ResourceFormatLoader {
+ GDCLASS(ResourceFormatPVR, ResourceFormatLoader)
public:
virtual RES load(const String &p_path, const String &p_original_path, Error *r_error = NULL);
virtual void get_recognized_extensions(List<String> *p_extensions) const;
diff --git a/modules/recast/navigation_mesh_editor_plugin.cpp b/modules/recast/navigation_mesh_editor_plugin.cpp
index d121a82d9e..a068f3b0f9 100644
--- a/modules/recast/navigation_mesh_editor_plugin.cpp
+++ b/modules/recast/navigation_mesh_editor_plugin.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/recast/navigation_mesh_editor_plugin.h b/modules/recast/navigation_mesh_editor_plugin.h
index 914d9ab8b9..23d35efc15 100644
--- a/modules/recast/navigation_mesh_editor_plugin.h
+++ b/modules/recast/navigation_mesh_editor_plugin.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/recast/navigation_mesh_generator.cpp b/modules/recast/navigation_mesh_generator.cpp
index c1ce2592a4..29f5e4c363 100644
--- a/modules/recast/navigation_mesh_generator.cpp
+++ b/modules/recast/navigation_mesh_generator.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/recast/navigation_mesh_generator.h b/modules/recast/navigation_mesh_generator.h
index 2f2f57d721..3adc01ccda 100644
--- a/modules/recast/navigation_mesh_generator.h
+++ b/modules/recast/navigation_mesh_generator.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/recast/register_types.cpp b/modules/recast/register_types.cpp
index f2f18fc86f..f272cc4236 100644
--- a/modules/recast/register_types.cpp
+++ b/modules/recast/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/recast/register_types.h b/modules/recast/register_types.h
index aaa32e0cdf..0b64143e97 100644
--- a/modules/recast/register_types.h
+++ b/modules/recast/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/regex/regex.cpp b/modules/regex/regex.cpp
index 03ef024587..12091caa5f 100644
--- a/modules/regex/regex.cpp
+++ b/modules/regex/regex.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/regex/regex.h b/modules/regex/regex.h
index 04ebaf6f9e..b0171f74c0 100644
--- a/modules/regex/regex.h
+++ b/modules/regex/regex.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/regex/register_types.cpp b/modules/regex/register_types.cpp
index 73e2c5022d..63687fc0a7 100644
--- a/modules/regex/register_types.cpp
+++ b/modules/regex/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/regex/register_types.h b/modules/regex/register_types.h
index 872e5eece5..ed32322c01 100644
--- a/modules/regex/register_types.h
+++ b/modules/regex/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/register_module_types.h b/modules/register_module_types.h
index f4163418e8..559d66c927 100644
--- a/modules/register_module_types.h
+++ b/modules/register_module_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/squish/config.py b/modules/squish/config.py
index 098f1eafa9..1c8cd12a2d 100644
--- a/modules/squish/config.py
+++ b/modules/squish/config.py
@@ -1,5 +1,5 @@
def can_build(env, platform):
- return env['tools']
+ return True
def configure(env):
pass
diff --git a/modules/squish/image_compress_squish.cpp b/modules/squish/image_compress_squish.cpp
index a08ac7bd28..d89839f06a 100644
--- a/modules/squish/image_compress_squish.cpp
+++ b/modules/squish/image_compress_squish.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -30,8 +30,6 @@
#include "image_compress_squish.h"
-#include "core/print_string.h"
-
#include <squish.h>
void image_decompress_squish(Image *p_image) {
@@ -76,6 +74,7 @@ void image_decompress_squish(Image *p_image) {
p_image->create(p_image->get_width(), p_image->get_height(), p_image->has_mipmaps(), target_format, data);
}
+#ifdef TOOLS_ENABLED
void image_compress_squish(Image *p_image, float p_lossy_quality, Image::CompressSource p_source) {
if (p_image->get_format() >= Image::FORMAT_DXT1)
@@ -204,3 +203,4 @@ void image_compress_squish(Image *p_image, float p_lossy_quality, Image::Compres
p_image->create(p_image->get_width(), p_image->get_height(), p_image->has_mipmaps(), target_format, data);
}
}
+#endif
diff --git a/modules/squish/image_compress_squish.h b/modules/squish/image_compress_squish.h
index dfebdc955f..3047b73b91 100644
--- a/modules/squish/image_compress_squish.h
+++ b/modules/squish/image_compress_squish.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -33,7 +33,9 @@
#include "core/image.h"
+#ifdef TOOLS_ENABLED
void image_compress_squish(Image *p_image, float p_lossy_quality, Image::CompressSource p_source);
+#endif
void image_decompress_squish(Image *p_image);
#endif // IMAGE_COMPRESS_SQUISH_H
diff --git a/modules/squish/register_types.cpp b/modules/squish/register_types.cpp
index d4ed676cce..be91fba4ef 100644
--- a/modules/squish/register_types.cpp
+++ b/modules/squish/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -29,17 +29,14 @@
/*************************************************************************/
#include "register_types.h"
-
-#ifdef TOOLS_ENABLED
-
#include "image_compress_squish.h"
void register_squish_types() {
+#ifdef TOOLS_ENABLED
Image::set_compress_bc_func(image_compress_squish);
+#endif
Image::_image_decompress_bc = image_decompress_squish;
}
void unregister_squish_types() {}
-
-#endif
diff --git a/modules/squish/register_types.h b/modules/squish/register_types.h
index 00f5c345c4..5933146329 100644
--- a/modules/squish/register_types.h
+++ b/modules/squish/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -28,7 +28,5 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
-#ifdef TOOLS_ENABLED
void register_squish_types();
void unregister_squish_types();
-#endif
diff --git a/modules/stb_vorbis/audio_stream_ogg_vorbis.cpp b/modules/stb_vorbis/audio_stream_ogg_vorbis.cpp
index 5dbe0b4b00..292ac5e97e 100644
--- a/modules/stb_vorbis/audio_stream_ogg_vorbis.cpp
+++ b/modules/stb_vorbis/audio_stream_ogg_vorbis.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/stb_vorbis/audio_stream_ogg_vorbis.h b/modules/stb_vorbis/audio_stream_ogg_vorbis.h
index 8b42111847..cbff9d47bb 100644
--- a/modules/stb_vorbis/audio_stream_ogg_vorbis.h
+++ b/modules/stb_vorbis/audio_stream_ogg_vorbis.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/stb_vorbis/register_types.cpp b/modules/stb_vorbis/register_types.cpp
index 514ef4c071..88a1766e47 100644
--- a/modules/stb_vorbis/register_types.cpp
+++ b/modules/stb_vorbis/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/stb_vorbis/register_types.h b/modules/stb_vorbis/register_types.h
index 142be0efdf..736c15e3d8 100644
--- a/modules/stb_vorbis/register_types.h
+++ b/modules/stb_vorbis/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/stb_vorbis/resource_importer_ogg_vorbis.cpp b/modules/stb_vorbis/resource_importer_ogg_vorbis.cpp
index 74f2e68206..6e12bc9bf0 100644
--- a/modules/stb_vorbis/resource_importer_ogg_vorbis.cpp
+++ b/modules/stb_vorbis/resource_importer_ogg_vorbis.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/stb_vorbis/resource_importer_ogg_vorbis.h b/modules/stb_vorbis/resource_importer_ogg_vorbis.h
index 82a03cd207..ca2d662e61 100644
--- a/modules/stb_vorbis/resource_importer_ogg_vorbis.h
+++ b/modules/stb_vorbis/resource_importer_ogg_vorbis.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/svg/image_loader_svg.cpp b/modules/svg/image_loader_svg.cpp
index ccb7d93885..404ca24482 100644
--- a/modules/svg/image_loader_svg.cpp
+++ b/modules/svg/image_loader_svg.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/svg/image_loader_svg.h b/modules/svg/image_loader_svg.h
index ff361ad800..2116079aef 100644
--- a/modules/svg/image_loader_svg.h
+++ b/modules/svg/image_loader_svg.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/svg/register_types.cpp b/modules/svg/register_types.cpp
index 56426662cd..5707c29f60 100644
--- a/modules/svg/register_types.cpp
+++ b/modules/svg/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/svg/register_types.h b/modules/svg/register_types.h
index 015c586c6b..13eb12d2d1 100644
--- a/modules/svg/register_types.h
+++ b/modules/svg/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/tga/image_loader_tga.cpp b/modules/tga/image_loader_tga.cpp
index 9bc24017fc..419229677b 100644
--- a/modules/tga/image_loader_tga.cpp
+++ b/modules/tga/image_loader_tga.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/tga/image_loader_tga.h b/modules/tga/image_loader_tga.h
index 0fe83a54a1..d466ac6e38 100644
--- a/modules/tga/image_loader_tga.h
+++ b/modules/tga/image_loader_tga.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/tga/register_types.cpp b/modules/tga/register_types.cpp
index ac1b56af16..d21c0a51d0 100644
--- a/modules/tga/register_types.cpp
+++ b/modules/tga/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/tga/register_types.h b/modules/tga/register_types.h
index 6483f2576e..445a7f3e31 100644
--- a/modules/tga/register_types.h
+++ b/modules/tga/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/thekla_unwrap/register_types.cpp b/modules/thekla_unwrap/register_types.cpp
index 8e733d1ad2..2c35adfb83 100644
--- a/modules/thekla_unwrap/register_types.cpp
+++ b/modules/thekla_unwrap/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/thekla_unwrap/register_types.h b/modules/thekla_unwrap/register_types.h
index 8a0eab9437..b911eed622 100644
--- a/modules/thekla_unwrap/register_types.h
+++ b/modules/thekla_unwrap/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/theora/register_types.cpp b/modules/theora/register_types.cpp
index 971fe39c44..4b50c3f146 100644
--- a/modules/theora/register_types.cpp
+++ b/modules/theora/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -32,11 +32,11 @@
#include "video_stream_theora.h"
-static ResourceFormatLoaderTheora *resource_loader_theora = NULL;
+static Ref<ResourceFormatLoaderTheora> resource_loader_theora;
void register_theora_types() {
- resource_loader_theora = memnew(ResourceFormatLoaderTheora);
+ resource_loader_theora.instance();
ResourceLoader::add_resource_format_loader(resource_loader_theora, true);
ClassDB::register_class<VideoStreamTheora>();
@@ -44,7 +44,6 @@ void register_theora_types() {
void unregister_theora_types() {
- if (resource_loader_theora) {
- memdelete(resource_loader_theora);
- }
+ ResourceLoader::remove_resource_format_loader(resource_loader_theora);
+ resource_loader_theora.unref();
}
diff --git a/modules/theora/register_types.h b/modules/theora/register_types.h
index 4a81d7743b..e1fd39f679 100644
--- a/modules/theora/register_types.h
+++ b/modules/theora/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/theora/video_stream_theora.cpp b/modules/theora/video_stream_theora.cpp
index 2a6bb0783b..31723c5c76 100644
--- a/modules/theora/video_stream_theora.cpp
+++ b/modules/theora/video_stream_theora.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/theora/video_stream_theora.h b/modules/theora/video_stream_theora.h
index 4be723f85b..85d73d3c0d 100644
--- a/modules/theora/video_stream_theora.h
+++ b/modules/theora/video_stream_theora.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -186,6 +186,7 @@ public:
};
class ResourceFormatLoaderTheora : public ResourceFormatLoader {
+ GDCLASS(ResourceFormatLoaderTheora, ResourceFormatLoader)
public:
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
virtual void get_recognized_extensions(List<String> *p_extensions) const;
diff --git a/modules/tinyexr/image_loader_tinyexr.cpp b/modules/tinyexr/image_loader_tinyexr.cpp
index 63f0781028..e69d9a0ae3 100644
--- a/modules/tinyexr/image_loader_tinyexr.cpp
+++ b/modules/tinyexr/image_loader_tinyexr.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -131,7 +131,7 @@ Error ImageLoaderTinyEXR::load_image(Ref<Image> p_image, FileAccess *f, bool p_f
Image::Format format;
int output_channels = 0;
- if (idxA > 0) {
+ if (idxA != -1) {
imgdata.resize(exr_image.width * exr_image.height * 8); //RGBA16
format = Image::FORMAT_RGBAH;
@@ -187,7 +187,7 @@ Error ImageLoaderTinyEXR::load_image(Ref<Image> p_image, FileAccess *f, bool p_f
const float *b_channel_start = reinterpret_cast<const float *>(tile.images[idxB]);
const float *a_channel_start = NULL;
- if (idxA > 0) {
+ if (idxA != -1) {
a_channel_start = reinterpret_cast<const float *>(tile.images[idxA]);
}
@@ -216,7 +216,7 @@ Error ImageLoaderTinyEXR::load_image(Ref<Image> p_image, FileAccess *f, bool p_f
*row_w++ = Math::make_half_float(color.g);
*row_w++ = Math::make_half_float(color.b);
- if (idxA > 0) {
+ if (idxA != -1) {
*row_w++ = Math::make_half_float(*a_channel++);
}
}
diff --git a/modules/tinyexr/image_loader_tinyexr.h b/modules/tinyexr/image_loader_tinyexr.h
index a6ef9000e5..4003fdc802 100644
--- a/modules/tinyexr/image_loader_tinyexr.h
+++ b/modules/tinyexr/image_loader_tinyexr.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/tinyexr/register_types.cpp b/modules/tinyexr/register_types.cpp
index 61217805cf..5473a55687 100644
--- a/modules/tinyexr/register_types.cpp
+++ b/modules/tinyexr/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/tinyexr/register_types.h b/modules/tinyexr/register_types.h
index 70cd0bfbf8..4c830674f8 100644
--- a/modules/tinyexr/register_types.h
+++ b/modules/tinyexr/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/upnp/register_types.cpp b/modules/upnp/register_types.cpp
index 13088c94dd..abb73a3605 100644
--- a/modules/upnp/register_types.cpp
+++ b/modules/upnp/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/upnp/register_types.h b/modules/upnp/register_types.h
index 2aeb06abc7..3079c26580 100644
--- a/modules/upnp/register_types.h
+++ b/modules/upnp/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/upnp/upnp.cpp b/modules/upnp/upnp.cpp
index 69e054f5c5..05b96d8a30 100644
--- a/modules/upnp/upnp.cpp
+++ b/modules/upnp/upnp.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/upnp/upnp.h b/modules/upnp/upnp.h
index 8f0a972c22..b73908724d 100644
--- a/modules/upnp/upnp.h
+++ b/modules/upnp/upnp.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/upnp/upnpdevice.cpp b/modules/upnp/upnpdevice.cpp
index 8f935fbd82..2fb2102df9 100644
--- a/modules/upnp/upnpdevice.cpp
+++ b/modules/upnp/upnpdevice.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/upnp/upnpdevice.h b/modules/upnp/upnpdevice.h
index e4c5eb691d..20fe5c62fe 100644
--- a/modules/upnp/upnpdevice.h
+++ b/modules/upnp/upnpdevice.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/visual_script/doc_classes/VisualScriptBasicTypeConstant.xml b/modules/visual_script/doc_classes/VisualScriptBasicTypeConstant.xml
index 793291eca2..5ec155fbc6 100644
--- a/modules/visual_script/doc_classes/VisualScriptBasicTypeConstant.xml
+++ b/modules/visual_script/doc_classes/VisualScriptBasicTypeConstant.xml
@@ -4,7 +4,7 @@
A Visual Script node representing a constant from the base types.
</brief_description>
<description>
- A Visual Script node representing a constant from base types, such as [Vector3.AXIS_X].
+ A Visual Script node representing a constant from base types, such as [constant Vector3.AXIS_X].
</description>
<tutorials>
</tutorials>
diff --git a/modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml b/modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml
index 399ba8ef5d..3a1d773058 100644
--- a/modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml
+++ b/modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml
@@ -154,7 +154,7 @@
Return the lesser of the two numbers, also known as their minimum.
</constant>
<constant name="LOGIC_CLAMP" value="46" enum="BuiltinFunc">
- Return the input clamped inside the given range, ensuring the result is never outside it. Equivalent to `min(max(input, range_low), range_high)`
+ Return the input clamped inside the given range, ensuring the result is never outside it. Equivalent to [code]min(max(input, range_low), range_high)[/code].
</constant>
<constant name="LOGIC_NEAREST_PO2" value="47" enum="BuiltinFunc">
Return the nearest power of 2 to the input.
@@ -193,13 +193,13 @@
Serialize a [Variant] to a string.
</constant>
<constant name="STR_TO_VAR" value="59" enum="BuiltinFunc">
- Deserialize a [Variant] from a string serialized using [VAR_TO_STR].
+ Deserialize a [Variant] from a string serialized using [code]VAR_TO_STR[/code].
</constant>
<constant name="VAR_TO_BYTES" value="60" enum="BuiltinFunc">
Serialize a [Variant] to a [PoolByteArray].
</constant>
<constant name="BYTES_TO_VAR" value="61" enum="BuiltinFunc">
- Deserialize a [Variant] from a [PoolByteArray] serialized using [VAR_TO_BYTES].
+ Deserialize a [Variant] from a [PoolByteArray] serialized using [code]VAR_TO_BYTES[/code].
</constant>
<constant name="COLORN" value="62" enum="BuiltinFunc">
Return the [Color] with the given name and alpha ranging from 0 to 1. Note: names are defined in color_names.inc.
diff --git a/modules/visual_script/doc_classes/VisualScriptClassConstant.xml b/modules/visual_script/doc_classes/VisualScriptClassConstant.xml
index 2e3a5b33c0..dc9044e9ed 100644
--- a/modules/visual_script/doc_classes/VisualScriptClassConstant.xml
+++ b/modules/visual_script/doc_classes/VisualScriptClassConstant.xml
@@ -4,7 +4,7 @@
Gets a constant from a given class.
</brief_description>
<description>
- This node returns a constant from a given class, such as [@GlobalScope.TYPE_INT]. See the given class' documentation for available constants.
+ This node returns a constant from a given class, such as [constant @GlobalScope.TYPE_INT]. See the given class' documentation for available constants.
[b]Input Ports:[/b]
none
[b]Output Ports:[/b]
diff --git a/modules/visual_script/doc_classes/VisualScriptCondition.xml b/modules/visual_script/doc_classes/VisualScriptCondition.xml
index 353898c93a..4657436c8f 100644
--- a/modules/visual_script/doc_classes/VisualScriptCondition.xml
+++ b/modules/visual_script/doc_classes/VisualScriptCondition.xml
@@ -4,7 +4,7 @@
A Visual Script node which branches the flow.
</brief_description>
<description>
- A Visual Script node that checks a [bool] input port. If [code]true[/code] it will exit via the “true†sequence port. If [code]false[/code] it will exit via the "false" sequence port. After exiting either, it exits via the “done†port. Sequence ports may be left disconnected.
+ A Visual Script node that checks a [bool] input port. If [code]true[/code], it will exit via the “true†sequence port. If [code]false[/code], it will exit via the "false" sequence port. After exiting either, it exits via the “done†port. Sequence ports may be left disconnected.
[b]Input Ports:[/b]
- Sequence: [code]if (cond) is[/code]
- Data (boolean): [code]cond[/code]
diff --git a/modules/visual_script/doc_classes/VisualScriptCustomNode.xml b/modules/visual_script/doc_classes/VisualScriptCustomNode.xml
index b8e77a1b0f..ff3ed66e81 100644
--- a/modules/visual_script/doc_classes/VisualScriptCustomNode.xml
+++ b/modules/visual_script/doc_classes/VisualScriptCustomNode.xml
@@ -125,12 +125,10 @@
</argument>
<description>
Execute the custom node's logic, returning the index of the output sequence port to use or a [String] when there is an error.
-
The [code]inputs[/code] array contains the values of the input ports.
[code]outputs[/code] is an array whose indices should be set to the respective outputs.
The [code]start_mode[/code] is usually [code]START_MODE_BEGIN_SEQUENCE[/code], unless you have used the STEP_* constants.
[code]working_mem[/code] is an array which can be used to persist information between runs of the custom node.
-
When returning, you can mask the returned value with one of the STEP_* constants.
</description>
</method>
diff --git a/modules/visual_script/doc_classes/VisualScriptReturn.xml b/modules/visual_script/doc_classes/VisualScriptReturn.xml
index 6095520eff..0ca3e3b612 100644
--- a/modules/visual_script/doc_classes/VisualScriptReturn.xml
+++ b/modules/visual_script/doc_classes/VisualScriptReturn.xml
@@ -19,7 +19,7 @@
</methods>
<members>
<member name="return_enabled" type="bool" setter="set_enable_return_value" getter="is_return_value_enabled">
- If [code]true[/code] the [code]return[/code] input port is available.
+ If [code]true[/code], the [code]return[/code] input port is available.
</member>
<member name="return_type" type="int" setter="set_return_type" getter="get_return_type" enum="Variant.Type">
The return value's data type.
diff --git a/modules/visual_script/register_types.cpp b/modules/visual_script/register_types.cpp
index 6e081817f1..24b96223d7 100644
--- a/modules/visual_script/register_types.cpp
+++ b/modules/visual_script/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/visual_script/register_types.h b/modules/visual_script/register_types.h
index 27b3bd649a..05b3164b3c 100644
--- a/modules/visual_script/register_types.h
+++ b/modules/visual_script/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/visual_script/visual_script.cpp b/modules/visual_script/visual_script.cpp
index 186e9e63b1..0027300e9f 100644
--- a/modules/visual_script/visual_script.cpp
+++ b/modules/visual_script/visual_script.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -981,6 +981,10 @@ bool VisualScript::is_tool() const {
return false;
}
+bool VisualScript::is_valid() const {
+ return true; //always valid
+}
+
ScriptLanguage *VisualScript::get_language() const {
return VisualScriptLanguage::singleton;
diff --git a/modules/visual_script/visual_script.h b/modules/visual_script/visual_script.h
index bd666447a3..0768ff61f7 100644
--- a/modules/visual_script/visual_script.h
+++ b/modules/visual_script/visual_script.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -341,6 +341,7 @@ public:
virtual Error reload(bool p_keep_state = false);
virtual bool is_tool() const;
+ virtual bool is_valid() const;
virtual ScriptLanguage *get_language() const;
diff --git a/modules/visual_script/visual_script_builtin_funcs.cpp b/modules/visual_script/visual_script_builtin_funcs.cpp
index 60bc54afe4..9f2d1a49c0 100644
--- a/modules/visual_script/visual_script_builtin_funcs.cpp
+++ b/modules/visual_script/visual_script_builtin_funcs.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/visual_script/visual_script_builtin_funcs.h b/modules/visual_script/visual_script_builtin_funcs.h
index 3345762b9f..2d8454ddd4 100644
--- a/modules/visual_script/visual_script_builtin_funcs.h
+++ b/modules/visual_script/visual_script_builtin_funcs.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/visual_script/visual_script_editor.cpp b/modules/visual_script/visual_script_editor.cpp
index c5f2070963..040d61a31e 100644
--- a/modules/visual_script/visual_script_editor.cpp
+++ b/modules/visual_script/visual_script_editor.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -1923,7 +1923,7 @@ void VisualScriptEditor::drop_data_fw(const Point2 &p_point, const Variant &p_da
}
}
-void VisualScriptEditor::_selected_method(const String &p_method, const String &p_type) {
+void VisualScriptEditor::_selected_method(const String &p_method, const String &p_type, const bool p_connecting) {
Ref<VisualScriptFunctionCall> vsfc = script->get_node(edited_func, selecting_method_id);
if (!vsfc.is_valid())
@@ -3491,6 +3491,7 @@ VisualScriptEditor::VisualScriptEditor() {
edit_menu = memnew(MenuButton);
edit_menu->set_text(TTR("Edit"));
+ edit_menu->set_switch_on_hover(true);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("visual_script_editor/delete_selected"), EDIT_DELETE_NODES);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("visual_script_editor/toggle_breakpoint"), EDIT_TOGGLE_BREAKPOINT);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("visual_script_editor/find_node_type"), EDIT_FIND_NODE_TYPE);
diff --git a/modules/visual_script/visual_script_editor.h b/modules/visual_script/visual_script_editor.h
index ce3245bc28..f4b4a6981d 100644
--- a/modules/visual_script/visual_script_editor.h
+++ b/modules/visual_script/visual_script_editor.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -234,7 +234,7 @@ class VisualScriptEditor : public ScriptEditorBase {
void _comment_node_resized(const Vector2 &p_new_size, int p_node);
int selecting_method_id;
- void _selected_method(const String &p_method, const String &p_type);
+ void _selected_method(const String &p_method, const String &p_type, const bool p_connecting);
void _draw_color_over_button(Object *obj, Color p_color);
void _button_resource_previewed(const String &p_path, const Ref<Texture> &p_preview, const Ref<Texture> &p_small_preview, Variant p_ud);
diff --git a/modules/visual_script/visual_script_expression.cpp b/modules/visual_script/visual_script_expression.cpp
index 868d22b541..23942fdd2a 100644
--- a/modules/visual_script/visual_script_expression.cpp
+++ b/modules/visual_script/visual_script_expression.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/visual_script/visual_script_expression.h b/modules/visual_script/visual_script_expression.h
index 1f41e442c5..3b2e3b9f78 100644
--- a/modules/visual_script/visual_script_expression.h
+++ b/modules/visual_script/visual_script_expression.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/visual_script/visual_script_flow_control.cpp b/modules/visual_script/visual_script_flow_control.cpp
index c3ab949d24..d927b75f89 100644
--- a/modules/visual_script/visual_script_flow_control.cpp
+++ b/modules/visual_script/visual_script_flow_control.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/visual_script/visual_script_flow_control.h b/modules/visual_script/visual_script_flow_control.h
index 40809d488a..a42605a50e 100644
--- a/modules/visual_script/visual_script_flow_control.h
+++ b/modules/visual_script/visual_script_flow_control.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/visual_script/visual_script_func_nodes.cpp b/modules/visual_script/visual_script_func_nodes.cpp
index 1913bfd8c7..7dba8fd488 100644
--- a/modules/visual_script/visual_script_func_nodes.cpp
+++ b/modules/visual_script/visual_script_func_nodes.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/visual_script/visual_script_func_nodes.h b/modules/visual_script/visual_script_func_nodes.h
index 3b522564d4..7b1e7871b6 100644
--- a/modules/visual_script/visual_script_func_nodes.h
+++ b/modules/visual_script/visual_script_func_nodes.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/visual_script/visual_script_nodes.cpp b/modules/visual_script/visual_script_nodes.cpp
index 99748af8a1..1b0e41b2de 100644
--- a/modules/visual_script/visual_script_nodes.cpp
+++ b/modules/visual_script/visual_script_nodes.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/visual_script/visual_script_nodes.h b/modules/visual_script/visual_script_nodes.h
index f7ac995816..b3d199fb38 100644
--- a/modules/visual_script/visual_script_nodes.h
+++ b/modules/visual_script/visual_script_nodes.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/visual_script/visual_script_property_selector.cpp b/modules/visual_script/visual_script_property_selector.cpp
index e5d12cb495..9dc0e4edfa 100644
--- a/modules/visual_script/visual_script_property_selector.cpp
+++ b/modules/visual_script/visual_script_property_selector.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/visual_script/visual_script_property_selector.h b/modules/visual_script/visual_script_property_selector.h
index f974ee3355..1588243bc1 100644
--- a/modules/visual_script/visual_script_property_selector.h
+++ b/modules/visual_script/visual_script_property_selector.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/visual_script/visual_script_yield_nodes.cpp b/modules/visual_script/visual_script_yield_nodes.cpp
index a21fff67fe..962560cc96 100644
--- a/modules/visual_script/visual_script_yield_nodes.cpp
+++ b/modules/visual_script/visual_script_yield_nodes.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/visual_script/visual_script_yield_nodes.h b/modules/visual_script/visual_script_yield_nodes.h
index 4009240581..851bf6aa74 100644
--- a/modules/visual_script/visual_script_yield_nodes.h
+++ b/modules/visual_script/visual_script_yield_nodes.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/vorbis/audio_stream_ogg_vorbis.cpp b/modules/vorbis/audio_stream_ogg_vorbis.cpp
index 5bc82f267f..692705e411 100644
--- a/modules/vorbis/audio_stream_ogg_vorbis.cpp
+++ b/modules/vorbis/audio_stream_ogg_vorbis.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/vorbis/audio_stream_ogg_vorbis.h b/modules/vorbis/audio_stream_ogg_vorbis.h
index 73c4b5f3f4..fa9d5fe664 100644
--- a/modules/vorbis/audio_stream_ogg_vorbis.h
+++ b/modules/vorbis/audio_stream_ogg_vorbis.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -127,6 +127,7 @@ public:
};
class ResourceFormatLoaderAudioStreamOGGVorbis : public ResourceFormatLoader {
+ GDCLASS(ResourceFormatLoaderAudioStreamOGGVorbis, ResourceFormatLoader)
public:
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
virtual void get_recognized_extensions(List<String> *p_extensions) const;
diff --git a/modules/vorbis/register_types.cpp b/modules/vorbis/register_types.cpp
index 0ea1fbe8b2..bc6176a65f 100644
--- a/modules/vorbis/register_types.cpp
+++ b/modules/vorbis/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -32,16 +32,17 @@
#include "audio_stream_ogg_vorbis.h"
-static ResourceFormatLoaderAudioStreamOGGVorbis *vorbis_stream_loader = NULL;
+static Ref<ResourceFormatLoaderAudioStreamOGGVorbis> vorbis_stream_loader;
void register_vorbis_types() {
- vorbis_stream_loader = memnew(ResourceFormatLoaderAudioStreamOGGVorbis);
+ vorbis_stream_loader.instance();
ResourceLoader::add_resource_format_loader(vorbis_stream_loader);
ClassDB::register_class<AudioStreamOGGVorbis>();
}
void unregister_vorbis_types() {
- memdelete(vorbis_stream_loader);
+ ResourceLoader::remove_resource_format_loader(vorbis_stream_loader);
+ vorbis_stream_loader.unref();
}
diff --git a/modules/vorbis/register_types.h b/modules/vorbis/register_types.h
index 3885502da2..0071a2d295 100644
--- a/modules/vorbis/register_types.h
+++ b/modules/vorbis/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/vorbis/stub/register_types.cpp b/modules/vorbis/stub/register_types.cpp
index 02ac9518c8..c38967c60e 100644
--- a/modules/vorbis/stub/register_types.cpp
+++ b/modules/vorbis/stub/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/vorbis/stub/register_types.h b/modules/vorbis/stub/register_types.h
index 3885502da2..0071a2d295 100644
--- a/modules/vorbis/stub/register_types.h
+++ b/modules/vorbis/stub/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/webm/libvpx/SCsub b/modules/webm/libvpx/SCsub
index 98e38b9027..2639d20620 100644
--- a/modules/webm/libvpx/SCsub
+++ b/modules/webm/libvpx/SCsub
@@ -271,10 +271,10 @@ if env["platform"] == 'uwp':
else:
import platform
is_x11_or_server_arm = ((env["platform"] == 'x11' or env["platform"] == 'server') and (platform.machine().startswith('arm') or platform.machine().startswith('aarch')))
- is_ios_x86 = (env["platform"] == 'iphone' and env["ios_sim"])
- is_android_x86 = (env["platform"] == 'android' and env["android_arch"] == 'x86')
+ is_ios_x86 = (env["platform"] == 'iphone' and ("arch" in env and env["arch"].startswith('x86')))
+ is_android_x86 = (env["platform"] == 'android' and env["android_arch"].startswith('x86'))
if is_android_x86:
- cpu_bits = '32'
+ cpu_bits = '32' if env["android_arch"] == 'x86' else '64'
webm_cpu_x86 = not is_x11_or_server_arm and (cpu_bits == '32' or cpu_bits == '64') and (env["platform"] == 'windows' or env["platform"] == 'x11' or env["platform"] == 'osx' or env["platform"] == 'haiku' or is_android_x86 or is_ios_x86)
webm_cpu_arm = is_x11_or_server_arm or (not is_ios_x86 and env["platform"] == 'iphone') or (not is_android_x86 and env["platform"] == 'android')
@@ -350,7 +350,7 @@ if webm_multithread:
env_libvpx.add_source_files(env.modules_sources, libvpx_sources_mt)
if webm_cpu_x86:
- is_clang_or_gcc = ('gcc' in os.path.basename(env["CC"])) or ('clang' in os.path.basename(env["CC"])) or ("OSXCROSS_ROOT" in os.environ)
+ is_clang_or_gcc = ('gcc' in os.path.basename(env["CC"])) or ('clang' in os.path.basename(env["CC"])) or ("osxcross" in env)
env_libvpx_mmx = env_libvpx.Clone()
if cpu_bits == '32' and is_clang_or_gcc:
@@ -379,6 +379,9 @@ if webm_cpu_x86:
env_libvpx.add_source_files(env.modules_sources, libvpx_sources_x86_64asm)
elif webm_cpu_arm:
env_libvpx.add_source_files(env.modules_sources, libvpx_sources_arm)
+ if env["platform"] == 'android':
+ env_libvpx.Append(CPPPATH=[libvpx_dir + "third_party/android"])
+ env_libvpx.add_source_files(env.modules_sources, [libvpx_dir + "third_party/android/cpu-features.c"])
env_libvpx_neon = env_libvpx.Clone()
if env["platform"] == 'android' and env["android_arch"] == 'armv6':
diff --git a/modules/webm/register_types.cpp b/modules/webm/register_types.cpp
index 121b528d5b..ad8e2cf310 100644
--- a/modules/webm/register_types.cpp
+++ b/modules/webm/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -32,11 +32,11 @@
#include "video_stream_webm.h"
-static ResourceFormatLoaderWebm *resource_loader_webm = NULL;
+static Ref<ResourceFormatLoaderWebm> resource_loader_webm;
void register_webm_types() {
- resource_loader_webm = memnew(ResourceFormatLoaderWebm);
+ resource_loader_webm.instance();
ResourceLoader::add_resource_format_loader(resource_loader_webm, true);
ClassDB::register_class<VideoStreamWebm>();
@@ -44,7 +44,6 @@ void register_webm_types() {
void unregister_webm_types() {
- if (resource_loader_webm) {
- memdelete(resource_loader_webm);
- }
+ ResourceLoader::remove_resource_format_loader(resource_loader_webm);
+ resource_loader_webm.unref();
}
diff --git a/modules/webm/register_types.h b/modules/webm/register_types.h
index 102da2b0f5..10811badaf 100644
--- a/modules/webm/register_types.h
+++ b/modules/webm/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/webm/video_stream_webm.cpp b/modules/webm/video_stream_webm.cpp
index 675fc97b55..06f9e39dc7 100644
--- a/modules/webm/video_stream_webm.cpp
+++ b/modules/webm/video_stream_webm.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/webm/video_stream_webm.h b/modules/webm/video_stream_webm.h
index 3739a73114..992095ba4c 100644
--- a/modules/webm/video_stream_webm.h
+++ b/modules/webm/video_stream_webm.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -127,6 +127,7 @@ public:
};
class ResourceFormatLoaderWebm : public ResourceFormatLoader {
+ GDCLASS(ResourceFormatLoaderWebm, ResourceFormatLoader)
public:
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
virtual void get_recognized_extensions(List<String> *p_extensions) const;
diff --git a/modules/webp/SCsub b/modules/webp/SCsub
index 8a4307fbe1..d215f19cef 100644
--- a/modules/webp/SCsub
+++ b/modules/webp/SCsub
@@ -42,7 +42,6 @@ if env['builtin_libwebp']:
"dsp/dec_neon.c",
"dsp/dec_sse2.c",
"dsp/dec_sse41.c",
- "dsp/enc_avx2.c",
"dsp/enc.c",
"dsp/enc_mips32.c",
"dsp/enc_mips_dsp_r2.c",
@@ -90,7 +89,6 @@ if env['builtin_libwebp']:
"enc/backward_references_enc.c",
"enc/config_enc.c",
"enc/cost_enc.c",
- "enc/delta_palettization_enc.c",
"enc/filter_enc.c",
"enc/frame_enc.c",
"enc/histogram_enc.c",
diff --git a/modules/webp/image_loader_webp.cpp b/modules/webp/image_loader_webp.cpp
index 6734ae90d9..928a0dcbd3 100644
--- a/modules/webp/image_loader_webp.cpp
+++ b/modules/webp/image_loader_webp.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/webp/image_loader_webp.h b/modules/webp/image_loader_webp.h
index 256c787a16..0c4e54df09 100644
--- a/modules/webp/image_loader_webp.h
+++ b/modules/webp/image_loader_webp.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/webp/register_types.cpp b/modules/webp/register_types.cpp
index 9a2e83c65d..5055fa2034 100644
--- a/modules/webp/register_types.cpp
+++ b/modules/webp/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/webp/register_types.h b/modules/webp/register_types.h
index 711f5be61d..bf76abf653 100644
--- a/modules/webp/register_types.h
+++ b/modules/webp/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/websocket/doc_classes/WebSocketClient.xml b/modules/websocket/doc_classes/WebSocketClient.xml
index b3ea535495..6b73b80350 100644
--- a/modules/websocket/doc_classes/WebSocketClient.xml
+++ b/modules/websocket/doc_classes/WebSocketClient.xml
@@ -25,7 +25,7 @@
</argument>
<description>
Connect to the given URL requesting one of the given [code]protocols[/code] as sub-protocol.
- If [code]true[/code] is passed as [code]gd_mp_api[/code], the client will behave like a network peer for the [MultiplayerAPI]. Note: connections to non Godot servers will not work, and [signal data_received] will not be emitted when this option is true.
+ If [code]true[/code], is passed as [code]gd_mp_api[/code], the client will behave like a network peer for the [MultiplayerAPI]. Note: connections to non Godot servers will not work, and [signal data_received] will not be emitted when this option is true.
</description>
</method>
<method name="disconnect_from_host">
diff --git a/modules/websocket/doc_classes/WebSocketPeer.xml b/modules/websocket/doc_classes/WebSocketPeer.xml
index cc59706916..5dda012899 100644
--- a/modules/websocket/doc_classes/WebSocketPeer.xml
+++ b/modules/websocket/doc_classes/WebSocketPeer.xml
@@ -20,7 +20,7 @@
<argument index="1" name="reason" type="String" default="&quot;&quot;">
</argument>
<description>
- Close this WebSocket connection. [code]code[/code] is the status code for the closure (see RFC6455 section 7.4 for a list of valid status codes). [reason] is the human readable reason for closing the connection (can be any UTF8 string, must be less than 123 bytes).
+ Close this WebSocket connection. [code]code[/code] is the status code for the closure (see RFC6455 section 7.4 for a list of valid status codes). [code]reason[/code] is the human readable reason for closing the connection (can be any UTF8 string, must be less than 123 bytes).
Note: To achieve a clean close, you will need to keep polling until either [signal WebSocketClient.connection_closed] or [signal WebSocketServer.client_disconnected] is received.
Note: HTML5 export might not support all status codes. Please refer to browsers-specific documentation for more details.
</description>
diff --git a/modules/websocket/emws_client.cpp b/modules/websocket/emws_client.cpp
index 82a577790e..aafae8f1c2 100644
--- a/modules/websocket/emws_client.cpp
+++ b/modules/websocket/emws_client.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#ifdef JAVASCRIPT_ENABLED
#include "emws_client.h"
@@ -205,8 +206,8 @@ int EMWSClient::get_max_packet_size() const {
}
EMWSClient::EMWSClient() {
- _in_buf_size = GLOBAL_GET(WSC_IN_BUF);
- _in_pkt_size = GLOBAL_GET(WSC_IN_PKT);
+ _in_buf_size = nearest_shift((int)GLOBAL_GET(WSC_IN_BUF) - 1) + 10;
+ _in_pkt_size = nearest_shift((int)GLOBAL_GET(WSC_IN_PKT) - 1);
_is_connecting = false;
_peer = Ref<EMWSPeer>(memnew(EMWSPeer));
/* clang-format off */
diff --git a/modules/websocket/emws_client.h b/modules/websocket/emws_client.h
index a21090a1a3..9bc29c1913 100644
--- a/modules/websocket/emws_client.h
+++ b/modules/websocket/emws_client.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#ifndef EMWSCLIENT_H
#define EMWSCLIENT_H
diff --git a/modules/websocket/emws_peer.cpp b/modules/websocket/emws_peer.cpp
index bb97934824..a9f38f1a82 100644
--- a/modules/websocket/emws_peer.cpp
+++ b/modules/websocket/emws_peer.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#ifdef JAVASCRIPT_ENABLED
#include "emws_peer.h"
diff --git a/modules/websocket/emws_peer.h b/modules/websocket/emws_peer.h
index 4beb86d45b..6ceb69a1b7 100644
--- a/modules/websocket/emws_peer.h
+++ b/modules/websocket/emws_peer.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#ifndef EMWSPEER_H
#define EMWSPEER_H
diff --git a/modules/websocket/emws_server.cpp b/modules/websocket/emws_server.cpp
index 09f9c1ceec..0eef1c4ba9 100644
--- a/modules/websocket/emws_server.cpp
+++ b/modules/websocket/emws_server.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#ifdef JAVASCRIPT_ENABLED
#include "emws_server.h"
diff --git a/modules/websocket/emws_server.h b/modules/websocket/emws_server.h
index 2dc455c389..bb101cd155 100644
--- a/modules/websocket/emws_server.h
+++ b/modules/websocket/emws_server.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#ifndef EMWSSERVER_H
#define EMWSSERVER_H
diff --git a/modules/websocket/lws_client.cpp b/modules/websocket/lws_client.cpp
index fa0bb4cfb2..2fbb46f3e2 100644
--- a/modules/websocket/lws_client.cpp
+++ b/modules/websocket/lws_client.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#ifndef JAVASCRIPT_ENABLED
#include "lws_client.h"
diff --git a/modules/websocket/lws_client.h b/modules/websocket/lws_client.h
index fdecb99925..b3a1237550 100644
--- a/modules/websocket/lws_client.h
+++ b/modules/websocket/lws_client.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#ifndef LWSCLIENT_H
#define LWSCLIENT_H
diff --git a/modules/websocket/lws_helper.cpp b/modules/websocket/lws_helper.cpp
index b5216615e9..a652779960 100644
--- a/modules/websocket/lws_helper.cpp
+++ b/modules/websocket/lws_helper.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/websocket/lws_helper.h b/modules/websocket/lws_helper.h
index fd8f85371b..265dc4e6ad 100644
--- a/modules/websocket/lws_helper.h
+++ b/modules/websocket/lws_helper.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#ifndef LWS_HELPER_H
#define LWS_HELPER_H
@@ -60,6 +61,7 @@ void _lws_make_protocols(void *p_obj, lws_callback_function *p_callback, PoolVec
protected: \
struct _LWSRef *_lws_ref; \
struct lws_context *context; \
+ bool _keep_servicing; \
\
static int _lws_gd_callback(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len) { \
\
@@ -71,6 +73,7 @@ protected: \
if (!ref->is_valid) \
return 0; \
CNAME *helper = (CNAME *)ref->obj; \
+ helper->_keep_servicing = true; \
return helper->_handle_cb(wsi, reason, user, in, len); \
} \
\
@@ -91,11 +94,14 @@ public: \
\
void _lws_poll() { \
ERR_FAIL_COND(context == NULL); \
- \
- if (::_lws_poll(context, _lws_ref)) { \
- context = NULL; \
- _lws_ref = NULL; \
- } \
+ do { \
+ _keep_servicing = false; \
+ if (::_lws_poll(context, _lws_ref)) { \
+ context = NULL; \
+ _lws_ref = NULL; \
+ break; \
+ } \
+ } while (_keep_servicing); \
} \
\
protected:
diff --git a/modules/websocket/lws_peer.cpp b/modules/websocket/lws_peer.cpp
index 04e6e7c951..8afcdfe62e 100644
--- a/modules/websocket/lws_peer.cpp
+++ b/modules/websocket/lws_peer.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#ifndef JAVASCRIPT_ENABLED
#include "lws_peer.h"
diff --git a/modules/websocket/lws_peer.h b/modules/websocket/lws_peer.h
index 3ded3810d1..6771c13094 100644
--- a/modules/websocket/lws_peer.h
+++ b/modules/websocket/lws_peer.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#ifndef LWSPEER_H
#define LWSPEER_H
diff --git a/modules/websocket/lws_server.cpp b/modules/websocket/lws_server.cpp
index 0e551eb318..fe7da99a9f 100644
--- a/modules/websocket/lws_server.cpp
+++ b/modules/websocket/lws_server.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#ifndef JAVASCRIPT_ENABLED
#include "lws_server.h"
diff --git a/modules/websocket/lws_server.h b/modules/websocket/lws_server.h
index c43044f194..5096ee0f88 100644
--- a/modules/websocket/lws_server.h
+++ b/modules/websocket/lws_server.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#ifndef LWSSERVER_H
#define LWSSERVER_H
diff --git a/modules/websocket/packet_buffer.h b/modules/websocket/packet_buffer.h
index a3af7f728a..5794288c2b 100644
--- a/modules/websocket/packet_buffer.h
+++ b/modules/websocket/packet_buffer.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/websocket/register_types.cpp b/modules/websocket/register_types.cpp
index 8946faffa9..ed6cc5638e 100644
--- a/modules/websocket/register_types.cpp
+++ b/modules/websocket/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#include "register_types.h"
#include "core/error_macros.h"
#include "core/project_settings.h"
diff --git a/modules/websocket/register_types.h b/modules/websocket/register_types.h
index 89ce93e286..0bcae50d14 100644
--- a/modules/websocket/register_types.h
+++ b/modules/websocket/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,5 +27,6 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
void register_websocket_types();
void unregister_websocket_types();
diff --git a/modules/websocket/websocket_client.cpp b/modules/websocket/websocket_client.cpp
index 6c5018bb79..4ff5404c61 100644
--- a/modules/websocket/websocket_client.cpp
+++ b/modules/websocket/websocket_client.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#include "websocket_client.h"
GDCINULL(WebSocketClient);
diff --git a/modules/websocket/websocket_client.h b/modules/websocket/websocket_client.h
index 948f128e9f..32db719435 100644
--- a/modules/websocket/websocket_client.h
+++ b/modules/websocket/websocket_client.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#ifndef WEBSOCKET_CLIENT_H
#define WEBSOCKET_CLIENT_H
diff --git a/modules/websocket/websocket_macros.h b/modules/websocket/websocket_macros.h
index 45dd30d0ce..56f278187f 100644
--- a/modules/websocket/websocket_macros.h
+++ b/modules/websocket/websocket_macros.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#ifndef WEBSOCKETMACTOS_H
#define WEBSOCKETMACTOS_H
diff --git a/modules/websocket/websocket_multiplayer.cpp b/modules/websocket/websocket_multiplayer.cpp
index 9a95c17e47..7c8cc36fad 100644
--- a/modules/websocket/websocket_multiplayer.cpp
+++ b/modules/websocket/websocket_multiplayer.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#include "websocket_multiplayer.h"
#include "core/os/os.h"
diff --git a/modules/websocket/websocket_multiplayer.h b/modules/websocket/websocket_multiplayer.h
index 3cba0011fc..1aecad97a0 100644
--- a/modules/websocket/websocket_multiplayer.h
+++ b/modules/websocket/websocket_multiplayer.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#ifndef WEBSOCKET_MULTIPLAYER_PEER_H
#define WEBSOCKET_MULTIPLAYER_PEER_H
diff --git a/modules/websocket/websocket_peer.cpp b/modules/websocket/websocket_peer.cpp
index 3ecb32ce19..15df1bf85a 100644
--- a/modules/websocket/websocket_peer.cpp
+++ b/modules/websocket/websocket_peer.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#include "websocket_peer.h"
GDCINULL(WebSocketPeer);
diff --git a/modules/websocket/websocket_peer.h b/modules/websocket/websocket_peer.h
index 4966cdfc72..62c1f3e9a3 100644
--- a/modules/websocket/websocket_peer.h
+++ b/modules/websocket/websocket_peer.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#ifndef WEBSOCKETPEER_H
#define WEBSOCKETPEER_H
diff --git a/modules/websocket/websocket_server.cpp b/modules/websocket/websocket_server.cpp
index c631ed70d5..ef5f6f5c20 100644
--- a/modules/websocket/websocket_server.cpp
+++ b/modules/websocket/websocket_server.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#include "websocket_server.h"
GDCINULL(WebSocketServer);
diff --git a/modules/websocket/websocket_server.h b/modules/websocket/websocket_server.h
index 156f25897c..3f3e46db5a 100644
--- a/modules/websocket/websocket_server.h
+++ b/modules/websocket/websocket_server.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#ifndef WEBSOCKET_H
#define WEBSOCKET_H
diff --git a/modules/xatlas_unwrap/register_types.cpp b/modules/xatlas_unwrap/register_types.cpp
index 57eea4eda6..840dd371ac 100644
--- a/modules/xatlas_unwrap/register_types.cpp
+++ b/modules/xatlas_unwrap/register_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/modules/xatlas_unwrap/register_types.h b/modules/xatlas_unwrap/register_types.h
index fd8d56fa53..9b57fff63b 100644
--- a/modules/xatlas_unwrap/register_types.h
+++ b/modules/xatlas_unwrap/register_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/android/AndroidManifest.xml.template b/platform/android/AndroidManifest.xml.template
index 81f4c15849..d8fb9326ea 100644
--- a/platform/android/AndroidManifest.xml.template
+++ b/platform/android/AndroidManifest.xml.template
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.godot.game"
+ xmlns:tools="http://schemas.android.com/tools"
+ package="com.godot.game"
android:versionCode="1"
android:versionName="1.0"
android:installLocation="auto"
@@ -10,32 +11,29 @@
android:largeScreens="true"
android:xlargeScreens="true"/>
- <application android:label="@string/godot_project_name_string" android:icon="@drawable/icon" android:allowBackup="false" $$ADD_APPATTRIBUTE_CHUNKS$$ >
+ <uses-feature android:glEsVersion="0x00020000" android:required="true" />
+
+$$ADD_PERMISSION_CHUNKS$$
+
+ <application android:label="@string/godot_project_name_string" android:icon="@drawable/icon" android:allowBackup="false" tools:ignore="GoogleAppIndexingWarning" $$ADD_APPATTRIBUTE_CHUNKS$$ >
<activity android:name="org.godotengine.godot.Godot"
android:label="@string/godot_project_name_string"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:launchMode="singleTask"
android:screenOrientation="landscape"
android:configChanges="orientation|keyboardHidden|screenSize|smallestScreenSize"
- android:resizeableActivity="false">
+ android:resizeableActivity="false"
+ tools:ignore="UnusedAttribute">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <service android:name="org.godotengine.godot.GodotDownloaderService" />
-
-
-
+ <service android:name="org.godotengine.godot.GodotDownloaderService" />
$$ADD_APPLICATION_CHUNKS$$
</application>
- <uses-feature android:glEsVersion="0x00020000" android:required="true" />
-
-$$ADD_PERMISSION_CHUNKS$$
-
-<uses-sdk android:minSdkVersion="18" android:targetSdkVersion="27"/>
</manifest>
diff --git a/platform/android/SCsub b/platform/android/SCsub
index da2219b9e4..47d5035224 100644
--- a/platform/android/SCsub
+++ b/platform/android/SCsub
@@ -10,9 +10,7 @@ from detect import get_ndk_version
android_files = [
'os_android.cpp',
- 'godot_android.cpp',
'file_access_android.cpp',
- 'dir_access_android.cpp',
'audio_driver_opensl.cpp',
'file_access_jandroid.cpp',
'dir_access_jandroid.cpp',
@@ -23,12 +21,6 @@ android_files = [
# 'power_android.cpp'
]
-thirdparty_files = [
- 'ifaddrs_android.cpp',
- 'android_native_app_glue.c',
- 'cpu-features.c',
-]
-
env_android = env.Clone()
if env['target'] == "profile":
env_android.Append(CPPFLAGS=['-DPROFILER_ENABLED'])
@@ -39,14 +31,10 @@ for x in android_files:
env_thirdparty = env_android.Clone()
env_thirdparty.disable_warnings()
-for x in thirdparty_files:
- android_objects.append(env_thirdparty.SharedObject(x))
-
-prog = None
+android_objects.append(env_thirdparty.SharedObject('#thirdparty/misc/ifaddrs-android.cc'))
abspath = env.Dir(".").abspath
-
with open_utf8(abspath + "/build.gradle.template", "r") as gradle_basein:
gradle_text = gradle_basein.read()
@@ -111,7 +99,7 @@ for x in env.android_asset_dirs:
gradle_default_config_text = ""
minSdk = 18
-targetSdk = 27
+targetSdk = 28
for x in env.android_default_config:
if x.startswith("minSdkVersion") and int(x.split(" ")[-1]) < minSdk:
@@ -164,6 +152,8 @@ elif env['android_arch'] == 'arm64v8':
lib_arch_dir = 'arm64-v8a'
elif env['android_arch'] == 'x86':
lib_arch_dir = 'x86'
+elif env['android_arch'] == 'x86_64':
+ lib_arch_dir = 'x86_64'
else:
print('WARN: Architecture not suitable for embedding into APK; keeping .so at \\bin')
diff --git a/platform/android/android_native_app_glue.c b/platform/android/android_native_app_glue.c
deleted file mode 100644
index 965f6284cd..0000000000
--- a/platform/android/android_native_app_glue.c
+++ /dev/null
@@ -1,437 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#ifdef ANDROID_NATIVE_ACTIVITY
-
-#include <jni.h>
-
-
-#include <errno.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/resource.h>
-
-#include "android_native_app_glue.h"
-#include <android/log.h>
-
-#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "threaded_app", __VA_ARGS__))
-
-static void free_saved_state(struct android_app* android_app) {
- pthread_mutex_lock(&android_app->mutex);
- if (android_app->savedState != NULL) {
- free(android_app->savedState);
- android_app->savedState = NULL;
- android_app->savedStateSize = 0;
- }
- pthread_mutex_unlock(&android_app->mutex);
-}
-
-int8_t android_app_read_cmd(struct android_app* android_app) {
- int8_t cmd;
- if (read(android_app->msgread, &cmd, sizeof(cmd)) == sizeof(cmd)) {
- switch (cmd) {
- case APP_CMD_SAVE_STATE:
- free_saved_state(android_app);
- break;
- }
- return cmd;
- } else {
- LOGI("No data on command pipe!");
- }
- return -1;
-}
-
-static void print_cur_config(struct android_app* android_app) {
- char lang[2], country[2];
- AConfiguration_getLanguage(android_app->config, lang);
- AConfiguration_getCountry(android_app->config, country);
-
- LOGI("Config: mcc=%d mnc=%d lang=%c%c cnt=%c%c orien=%d touch=%d dens=%d "
- "keys=%d nav=%d keysHid=%d navHid=%d sdk=%d size=%d long=%d "
- "modetype=%d modenight=%d",
- AConfiguration_getMcc(android_app->config),
- AConfiguration_getMnc(android_app->config),
- lang[0], lang[1], country[0], country[1],
- AConfiguration_getOrientation(android_app->config),
- AConfiguration_getTouchscreen(android_app->config),
- AConfiguration_getDensity(android_app->config),
- AConfiguration_getKeyboard(android_app->config),
- AConfiguration_getNavigation(android_app->config),
- AConfiguration_getKeysHidden(android_app->config),
- AConfiguration_getNavHidden(android_app->config),
- AConfiguration_getSdkVersion(android_app->config),
- AConfiguration_getScreenSize(android_app->config),
- AConfiguration_getScreenLong(android_app->config),
- AConfiguration_getUiModeType(android_app->config),
- AConfiguration_getUiModeNight(android_app->config));
-}
-
-void android_app_pre_exec_cmd(struct android_app* android_app, int8_t cmd) {
- switch (cmd) {
- case APP_CMD_INPUT_CHANGED:
- LOGI("APP_CMD_INPUT_CHANGED\n");
- pthread_mutex_lock(&android_app->mutex);
- if (android_app->inputQueue != NULL) {
- AInputQueue_detachLooper(android_app->inputQueue);
- }
- android_app->inputQueue = android_app->pendingInputQueue;
- if (android_app->inputQueue != NULL) {
- LOGI("Attaching input queue to looper");
- AInputQueue_attachLooper(android_app->inputQueue,
- android_app->looper, LOOPER_ID_INPUT, NULL,
- &android_app->inputPollSource);
- }
- pthread_cond_broadcast(&android_app->cond);
- pthread_mutex_unlock(&android_app->mutex);
- break;
-
- case APP_CMD_INIT_WINDOW:
- LOGI("APP_CMD_INIT_WINDOW\n");
- pthread_mutex_lock(&android_app->mutex);
- android_app->window = android_app->pendingWindow;
- pthread_cond_broadcast(&android_app->cond);
- pthread_mutex_unlock(&android_app->mutex);
- break;
-
- case APP_CMD_TERM_WINDOW:
- LOGI("APP_CMD_TERM_WINDOW\n");
- pthread_cond_broadcast(&android_app->cond);
- break;
-
- case APP_CMD_RESUME:
- case APP_CMD_START:
- case APP_CMD_PAUSE:
- case APP_CMD_STOP:
- LOGI("activityState=%d\n", cmd);
- pthread_mutex_lock(&android_app->mutex);
- android_app->activityState = cmd;
- pthread_cond_broadcast(&android_app->cond);
- pthread_mutex_unlock(&android_app->mutex);
- break;
-
- case APP_CMD_CONFIG_CHANGED:
- LOGI("APP_CMD_CONFIG_CHANGED\n");
- AConfiguration_fromAssetManager(android_app->config,
- android_app->activity->assetManager);
- print_cur_config(android_app);
- break;
-
- case APP_CMD_DESTROY:
- LOGI("APP_CMD_DESTROY\n");
- android_app->destroyRequested = 1;
- break;
- }
-}
-
-void android_app_post_exec_cmd(struct android_app* android_app, int8_t cmd) {
- switch (cmd) {
- case APP_CMD_TERM_WINDOW:
- LOGI("APP_CMD_TERM_WINDOW\n");
- pthread_mutex_lock(&android_app->mutex);
- android_app->window = NULL;
- pthread_cond_broadcast(&android_app->cond);
- pthread_mutex_unlock(&android_app->mutex);
- break;
-
- case APP_CMD_SAVE_STATE:
- LOGI("APP_CMD_SAVE_STATE\n");
- pthread_mutex_lock(&android_app->mutex);
- android_app->stateSaved = 1;
- pthread_cond_broadcast(&android_app->cond);
- pthread_mutex_unlock(&android_app->mutex);
- break;
-
- case APP_CMD_RESUME:
- free_saved_state(android_app);
- break;
- }
-}
-
-void app_dummy() {
-
-}
-
-static void android_app_destroy(struct android_app* android_app) {
- LOGI("android_app_destroy!");
- free_saved_state(android_app);
- pthread_mutex_lock(&android_app->mutex);
- if (android_app->inputQueue != NULL) {
- AInputQueue_detachLooper(android_app->inputQueue);
- }
- AConfiguration_delete(android_app->config);
- android_app->destroyed = 1;
- pthread_cond_broadcast(&android_app->cond);
- pthread_mutex_unlock(&android_app->mutex);
- // Can't touch android_app object after this.
-}
-
-static void process_input(struct android_app* app, struct android_poll_source* source) {
- AInputEvent* event = NULL;
- if (AInputQueue_getEvent(app->inputQueue, &event) >= 0) {
- LOGI("New input event: type=%d\n", AInputEvent_getType(event));
- if (AInputQueue_preDispatchEvent(app->inputQueue, event)) {
- return;
- }
- int32_t handled = 0;
- if (app->onInputEvent != NULL) handled = app->onInputEvent(app, event);
- AInputQueue_finishEvent(app->inputQueue, event, handled);
- } else {
- LOGI("Failure reading next input event: %s\n", strerror(errno));
- }
-}
-
-static void process_cmd(struct android_app* app, struct android_poll_source* source) {
- int8_t cmd = android_app_read_cmd(app);
- android_app_pre_exec_cmd(app, cmd);
- if (app->onAppCmd != NULL) app->onAppCmd(app, cmd);
- android_app_post_exec_cmd(app, cmd);
-}
-
-static void* android_app_entry(void* param) {
- struct android_app* android_app = (struct android_app*)param;
-
- android_app->config = AConfiguration_new();
- AConfiguration_fromAssetManager(android_app->config, android_app->activity->assetManager);
-
- print_cur_config(android_app);
-
- android_app->cmdPollSource.id = LOOPER_ID_MAIN;
- android_app->cmdPollSource.app = android_app;
- android_app->cmdPollSource.process = process_cmd;
- android_app->inputPollSource.id = LOOPER_ID_INPUT;
- android_app->inputPollSource.app = android_app;
- android_app->inputPollSource.process = process_input;
-
- ALooper* looper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS);
- ALooper_addFd(looper, android_app->msgread, LOOPER_ID_MAIN, ALOOPER_EVENT_INPUT, NULL,
- &android_app->cmdPollSource);
- android_app->looper = looper;
-
- pthread_mutex_lock(&android_app->mutex);
- android_app->running = 1;
- pthread_cond_broadcast(&android_app->cond);
- pthread_mutex_unlock(&android_app->mutex);
-
- android_main(android_app);
-
- android_app_destroy(android_app);
- return NULL;
-}
-
-// --------------------------------------------------------------------
-// Native activity interaction (called from main thread)
-// --------------------------------------------------------------------
-
-static struct android_app* android_app_create(ANativeActivity* activity,
- void* savedState, size_t savedStateSize) {
- struct android_app* android_app = (struct android_app*)malloc(sizeof(struct android_app));
- memset(android_app, 0, sizeof(struct android_app));
- android_app->activity = activity;
-
- pthread_mutex_init(&android_app->mutex, NULL);
- pthread_cond_init(&android_app->cond, NULL);
-
- if (savedState != NULL) {
- android_app->savedState = malloc(savedStateSize);
- android_app->savedStateSize = savedStateSize;
- memcpy(android_app->savedState, savedState, savedStateSize);
- }
-
- int msgpipe[2];
- if (pipe(msgpipe)) {
- LOGI("could not create pipe: %s", strerror(errno));
- }
- android_app->msgread = msgpipe[0];
- android_app->msgwrite = msgpipe[1];
-
- pthread_attr_t attr;
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- pthread_create(&android_app->thread, &attr, android_app_entry, android_app);
-
- // Wait for thread to start.
- pthread_mutex_lock(&android_app->mutex);
- while (!android_app->running) {
- pthread_cond_wait(&android_app->cond, &android_app->mutex);
- }
- pthread_mutex_unlock(&android_app->mutex);
-
- return android_app;
-}
-
-static void android_app_write_cmd(struct android_app* android_app, int8_t cmd) {
- if (write(android_app->msgwrite, &cmd, sizeof(cmd)) != sizeof(cmd)) {
- LOGI("Failure writing android_app cmd: %s\n", strerror(errno));
- }
-}
-
-static void android_app_set_input(struct android_app* android_app, AInputQueue* inputQueue) {
- pthread_mutex_lock(&android_app->mutex);
- android_app->pendingInputQueue = inputQueue;
- android_app_write_cmd(android_app, APP_CMD_INPUT_CHANGED);
- while (android_app->inputQueue != android_app->pendingInputQueue) {
- pthread_cond_wait(&android_app->cond, &android_app->mutex);
- }
- pthread_mutex_unlock(&android_app->mutex);
-}
-
-static void android_app_set_window(struct android_app* android_app, ANativeWindow* window) {
- pthread_mutex_lock(&android_app->mutex);
- if (android_app->pendingWindow != NULL) {
- android_app_write_cmd(android_app, APP_CMD_TERM_WINDOW);
- }
- android_app->pendingWindow = window;
- if (window != NULL) {
- android_app_write_cmd(android_app, APP_CMD_INIT_WINDOW);
- }
- while (android_app->window != android_app->pendingWindow) {
- pthread_cond_wait(&android_app->cond, &android_app->mutex);
- }
- pthread_mutex_unlock(&android_app->mutex);
-}
-
-static void android_app_set_activity_state(struct android_app* android_app, int8_t cmd) {
- pthread_mutex_lock(&android_app->mutex);
- android_app_write_cmd(android_app, cmd);
- while (android_app->activityState != cmd) {
- pthread_cond_wait(&android_app->cond, &android_app->mutex);
- }
- pthread_mutex_unlock(&android_app->mutex);
-}
-
-static void android_app_free(struct android_app* android_app) {
- pthread_mutex_lock(&android_app->mutex);
- android_app_write_cmd(android_app, APP_CMD_DESTROY);
- while (!android_app->destroyed) {
- pthread_cond_wait(&android_app->cond, &android_app->mutex);
- }
- pthread_mutex_unlock(&android_app->mutex);
-
- close(android_app->msgread);
- close(android_app->msgwrite);
- pthread_cond_destroy(&android_app->cond);
- pthread_mutex_destroy(&android_app->mutex);
- free(android_app);
-}
-
-static void onDestroy(ANativeActivity* activity) {
- LOGI("Destroy: %p\n", activity);
- android_app_free((struct android_app*)activity->instance);
-}
-
-static void onStart(ANativeActivity* activity) {
- LOGI("Start: %p\n", activity);
- android_app_set_activity_state((struct android_app*)activity->instance, APP_CMD_START);
-}
-
-static void onResume(ANativeActivity* activity) {
- LOGI("Resume: %p\n", activity);
- android_app_set_activity_state((struct android_app*)activity->instance, APP_CMD_RESUME);
-}
-
-static void* onSaveInstanceState(ANativeActivity* activity, size_t* outLen) {
- struct android_app* android_app = (struct android_app*)activity->instance;
- void* savedState = NULL;
-
- LOGI("SaveInstanceState: %p\n", activity);
- pthread_mutex_lock(&android_app->mutex);
- android_app->stateSaved = 0;
- android_app_write_cmd(android_app, APP_CMD_SAVE_STATE);
- while (!android_app->stateSaved) {
- pthread_cond_wait(&android_app->cond, &android_app->mutex);
- }
-
- if (android_app->savedState != NULL) {
- savedState = android_app->savedState;
- *outLen = android_app->savedStateSize;
- android_app->savedState = NULL;
- android_app->savedStateSize = 0;
- }
-
- pthread_mutex_unlock(&android_app->mutex);
-
- return savedState;
-}
-
-static void onPause(ANativeActivity* activity) {
- LOGI("Pause: %p\n", activity);
- android_app_set_activity_state((struct android_app*)activity->instance, APP_CMD_PAUSE);
-}
-
-static void onStop(ANativeActivity* activity) {
- LOGI("Stop: %p\n", activity);
- android_app_set_activity_state((struct android_app*)activity->instance, APP_CMD_STOP);
-}
-
-static void onConfigurationChanged(ANativeActivity* activity) {
- struct android_app* android_app = (struct android_app*)activity->instance;
- LOGI("ConfigurationChanged: %p\n", activity);
- android_app_write_cmd(android_app, APP_CMD_CONFIG_CHANGED);
-}
-
-static void onLowMemory(ANativeActivity* activity) {
- struct android_app* android_app = (struct android_app*)activity->instance;
- LOGI("LowMemory: %p\n", activity);
- android_app_write_cmd(android_app, APP_CMD_LOW_MEMORY);
-}
-
-static void onWindowFocusChanged(ANativeActivity* activity, int focused) {
- LOGI("WindowFocusChanged: %p -- %d\n", activity, focused);
- android_app_write_cmd((struct android_app*)activity->instance,
- focused ? APP_CMD_GAINED_FOCUS : APP_CMD_LOST_FOCUS);
-}
-
-static void onNativeWindowCreated(ANativeActivity* activity, ANativeWindow* window) {
- LOGI("NativeWindowCreated: %p -- %p\n", activity, window);
- android_app_set_window((struct android_app*)activity->instance, window);
-}
-
-static void onNativeWindowDestroyed(ANativeActivity* activity, ANativeWindow* window) {
- LOGI("NativeWindowDestroyed: %p -- %p\n", activity, window);
- android_app_set_window((struct android_app*)activity->instance, NULL);
-}
-
-static void onInputQueueCreated(ANativeActivity* activity, AInputQueue* queue) {
- LOGI("InputQueueCreated: %p -- %p\n", activity, queue);
- android_app_set_input((struct android_app*)activity->instance, queue);
-}
-
-static void onInputQueueDestroyed(ANativeActivity* activity, AInputQueue* queue) {
- LOGI("InputQueueDestroyed: %p -- %p\n", activity, queue);
- android_app_set_input((struct android_app*)activity->instance, NULL);
-}
-
-void ANativeActivity_onCreate(ANativeActivity* activity,
- void* savedState, size_t savedStateSize) {
- LOGI("Creating: %p\n", activity);
- activity->callbacks->onDestroy = onDestroy;
- activity->callbacks->onStart = onStart;
- activity->callbacks->onResume = onResume;
- activity->callbacks->onSaveInstanceState = onSaveInstanceState;
- activity->callbacks->onPause = onPause;
- activity->callbacks->onStop = onStop;
- activity->callbacks->onConfigurationChanged = onConfigurationChanged;
- activity->callbacks->onLowMemory = onLowMemory;
- activity->callbacks->onWindowFocusChanged = onWindowFocusChanged;
- activity->callbacks->onNativeWindowCreated = onNativeWindowCreated;
- activity->callbacks->onNativeWindowDestroyed = onNativeWindowDestroyed;
- activity->callbacks->onInputQueueCreated = onInputQueueCreated;
- activity->callbacks->onInputQueueDestroyed = onInputQueueDestroyed;
-
- activity->instance = android_app_create(activity, savedState, savedStateSize);
-}
-#endif
diff --git a/platform/android/android_native_app_glue.h b/platform/android/android_native_app_glue.h
deleted file mode 100644
index 36278d4c66..0000000000
--- a/platform/android/android_native_app_glue.h
+++ /dev/null
@@ -1,351 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#ifndef _ANDROID_NATIVE_APP_GLUE_H
-#define _ANDROID_NATIVE_APP_GLUE_H
-#ifdef ANDROID_NATIVE_ACTIVITY
-
-#include <poll.h>
-#include <pthread.h>
-#include <sched.h>
-
-#include <android/configuration.h>
-#include <android/looper.h>
-#include <android/native_activity.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * The native activity interface provided by <android/native_activity.h>
- * is based on a set of application-provided callbacks that will be called
- * by the Activity's main thread when certain events occur.
- *
- * This means that each one of this callbacks _should_ _not_ block, or they
- * risk having the system force-close the application. This programming
- * model is direct, lightweight, but constraining.
- *
- * The 'threaded_native_app' static library is used to provide a different
- * execution model where the application can implement its own main event
- * loop in a different thread instead. Here's how it works:
- *
- * 1/ The application must provide a function named "android_main()" that
- * will be called when the activity is created, in a new thread that is
- * distinct from the activity's main thread.
- *
- * 2/ android_main() receives a pointer to a valid "android_app" structure
- * that contains references to other important objects, e.g. the
- * ANativeActivity obejct instance the application is running in.
- *
- * 3/ the "android_app" object holds an ALooper instance that already
- * listens to two important things:
- *
- * - activity lifecycle events (e.g. "pause", "resume"). See APP_CMD_XXX
- * declarations below.
- *
- * - input events coming from the AInputQueue attached to the activity.
- *
- * Each of these correspond to an ALooper identifier returned by
- * ALooper_pollOnce with values of LOOPER_ID_MAIN and LOOPER_ID_INPUT,
- * respectively.
- *
- * Your application can use the same ALooper to listen to additional
- * file-descriptors. They can either be callback based, or with return
- * identifiers starting with LOOPER_ID_USER.
- *
- * 4/ Whenever you receive a LOOPER_ID_MAIN or LOOPER_ID_INPUT event,
- * the returned data will point to an android_poll_source structure. You
- * can call the process() function on it, and fill in android_app->onAppCmd
- * and android_app->onInputEvent to be called for your own processing
- * of the event.
- *
- * Alternatively, you can call the low-level functions to read and process
- * the data directly... look at the process_cmd() and process_input()
- * implementations in the glue to see how to do this.
- *
- * See the sample named "native-activity" that comes with the NDK with a
- * full usage example. Also look at the JavaDoc of NativeActivity.
- */
-
-struct android_app;
-
-/**
- * Data associated with an ALooper fd that will be returned as the "outData"
- * when that source has data ready.
- */
-struct android_poll_source {
- // The identifier of this source. May be LOOPER_ID_MAIN or
- // LOOPER_ID_INPUT.
- int32_t id;
-
- // The android_app this ident is associated with.
- struct android_app* app;
-
- // Function to call to perform the standard processing of data from
- // this source.
- void (*process)(struct android_app* app, struct android_poll_source* source);
-};
-
-/**
- * This is the interface for the standard glue code of a threaded
- * application. In this model, the application's code is running
- * in its own thread separate from the main thread of the process.
- * It is not required that this thread be associated with the Java
- * VM, although it will need to be in order to make JNI calls any
- * Java objects.
- */
-struct android_app {
- // The application can place a pointer to its own state object
- // here if it likes.
- void* userData;
-
- // Fill this in with the function to process main app commands (APP_CMD_*)
- void (*onAppCmd)(struct android_app* app, int32_t cmd);
-
- // Fill this in with the function to process input events. At this point
- // the event has already been pre-dispatched, and it will be finished upon
- // return. Return 1 if you have handled the event, 0 for any default
- // dispatching.
- int32_t (*onInputEvent)(struct android_app* app, AInputEvent* event);
-
- // The ANativeActivity object instance that this app is running in.
- ANativeActivity* activity;
-
- // The current configuration the app is running in.
- AConfiguration* config;
-
- // This is the last instance's saved state, as provided at creation time.
- // It is NULL if there was no state. You can use this as you need; the
- // memory will remain around until you call android_app_exec_cmd() for
- // APP_CMD_RESUME, at which point it will be freed and savedState set to NULL.
- // These variables should only be changed when processing a APP_CMD_SAVE_STATE,
- // at which point they will be initialized to NULL and you can malloc your
- // state and place the information here. In that case the memory will be
- // freed for you later.
- void* savedState;
- size_t savedStateSize;
-
- // The ALooper associated with the app's thread.
- ALooper* looper;
-
- // When non-NULL, this is the input queue from which the app will
- // receive user input events.
- AInputQueue* inputQueue;
-
- // When non-NULL, this is the window surface that the app can draw in.
- ANativeWindow* window;
-
- // Current content rectangle of the window; this is the area where the
- // window's content should be placed to be seen by the user.
- ARect contentRect;
-
- // Current state of the app's activity. May be either APP_CMD_START,
- // APP_CMD_RESUME, APP_CMD_PAUSE, or APP_CMD_STOP; see below.
- int activityState;
-
- // This is non-zero when the application's NativeActivity is being
- // destroyed and waiting for the app thread to complete.
- int destroyRequested;
-
- // -------------------------------------------------
- // Below are "private" implementation of the glue code.
-
- pthread_mutex_t mutex;
- pthread_cond_t cond;
-
- int msgread;
- int msgwrite;
-
- pthread_t thread;
-
- struct android_poll_source cmdPollSource;
- struct android_poll_source inputPollSource;
-
- int running;
- int stateSaved;
- int destroyed;
- int redrawNeeded;
- AInputQueue* pendingInputQueue;
- ANativeWindow* pendingWindow;
- ARect pendingContentRect;
-};
-
-enum {
- /**
- * Looper data ID of commands coming from the app's main thread, which
- * is returned as an identifier from ALooper_pollOnce(). The data for this
- * identifier is a pointer to an android_poll_source structure.
- * These can be retrieved and processed with android_app_read_cmd()
- * and android_app_exec_cmd().
- */
- LOOPER_ID_MAIN = 1,
-
- /**
- * Looper data ID of events coming from the AInputQueue of the
- * application's window, which is returned as an identifier from
- * ALooper_pollOnce(). The data for this identifier is a pointer to an
- * android_poll_source structure. These can be read via the inputQueue
- * object of android_app.
- */
- LOOPER_ID_INPUT = 2,
-
- /**
- * Start of user-defined ALooper identifiers.
- */
- LOOPER_ID_USER = 3,
-};
-
-enum {
- /**
- * Command from main thread: the AInputQueue has changed. Upon processing
- * this command, android_app->inputQueue will be updated to the new queue
- * (or NULL).
- */
- APP_CMD_INPUT_CHANGED,
-
- /**
- * Command from main thread: a new ANativeWindow is ready for use. Upon
- * receiving this command, android_app->window will contain the new window
- * surface.
- */
- APP_CMD_INIT_WINDOW,
-
- /**
- * Command from main thread: the existing ANativeWindow needs to be
- * terminated. Upon receiving this command, android_app->window still
- * contains the existing window; after calling android_app_exec_cmd
- * it will be set to NULL.
- */
- APP_CMD_TERM_WINDOW,
-
- /**
- * Command from main thread: the current ANativeWindow has been resized.
- * Please redraw with its new size.
- */
- APP_CMD_WINDOW_RESIZED,
-
- /**
- * Command from main thread: the system needs that the current ANativeWindow
- * be redrawn. You should redraw the window before handing this to
- * android_app_exec_cmd() in order to avoid transient drawing glitches.
- */
- APP_CMD_WINDOW_REDRAW_NEEDED,
-
- /**
- * Command from main thread: the content area of the window has changed,
- * such as from the soft input window being shown or hidden. You can
- * find the new content rect in android_app::contentRect.
- */
- APP_CMD_CONTENT_RECT_CHANGED,
-
- /**
- * Command from main thread: the app's activity window has gained
- * input focus.
- */
- APP_CMD_GAINED_FOCUS,
-
- /**
- * Command from main thread: the app's activity window has lost
- * input focus.
- */
- APP_CMD_LOST_FOCUS,
-
- /**
- * Command from main thread: the current device configuration has changed.
- */
- APP_CMD_CONFIG_CHANGED,
-
- /**
- * Command from main thread: the system is running low on memory.
- * Try to reduce your memory use.
- */
- APP_CMD_LOW_MEMORY,
-
- /**
- * Command from main thread: the app's activity has been started.
- */
- APP_CMD_START,
-
- /**
- * Command from main thread: the app's activity has been resumed.
- */
- APP_CMD_RESUME,
-
- /**
- * Command from main thread: the app should generate a new saved state
- * for itself, to restore from later if needed. If you have saved state,
- * allocate it with malloc and place it in android_app.savedState with
- * the size in android_app.savedStateSize. The will be freed for you
- * later.
- */
- APP_CMD_SAVE_STATE,
-
- /**
- * Command from main thread: the app's activity has been paused.
- */
- APP_CMD_PAUSE,
-
- /**
- * Command from main thread: the app's activity has been stopped.
- */
- APP_CMD_STOP,
-
- /**
- * Command from main thread: the app's activity is being destroyed,
- * and waiting for the app thread to clean up and exit before proceeding.
- */
- APP_CMD_DESTROY,
-};
-
-/**
- * Call when ALooper_pollAll() returns LOOPER_ID_MAIN, reading the next
- * app command message.
- */
-int8_t android_app_read_cmd(struct android_app* android_app);
-
-/**
- * Call with the command returned by android_app_read_cmd() to do the
- * initial pre-processing of the given command. You can perform your own
- * actions for the command after calling this function.
- */
-void android_app_pre_exec_cmd(struct android_app* android_app, int8_t cmd);
-
-/**
- * Call with the command returned by android_app_read_cmd() to do the
- * final post-processing of the given command. You must have done your own
- * actions for the command before calling this function.
- */
-void android_app_post_exec_cmd(struct android_app* android_app, int8_t cmd);
-
-/**
- * Dummy function you can call to ensure glue code isn't stripped.
- */
-void app_dummy();
-
-/**
- * This is the function that application code must implement, representing
- * the main entry to the app.
- */
-extern void android_main(struct android_app* app);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _ANDROID_NATIVE_APP_GLUE_H */
-#endif
diff --git a/platform/android/audio_driver_jandroid.cpp b/platform/android/audio_driver_jandroid.cpp
index 4fab40d534..bcef5b0c85 100644
--- a/platform/android/audio_driver_jandroid.cpp
+++ b/platform/android/audio_driver_jandroid.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -34,8 +34,6 @@
#include "core/project_settings.h"
#include "thread_jandroid.h"
-#ifndef ANDROID_NATIVE_ACTIVITY
-
AudioDriverAndroid *AudioDriverAndroid::s_ad = NULL;
jobject AudioDriverAndroid::io;
@@ -204,5 +202,3 @@ AudioDriverAndroid::AudioDriverAndroid() {
s_ad = this;
active = false;
}
-
-#endif
diff --git a/platform/android/audio_driver_jandroid.h b/platform/android/audio_driver_jandroid.h
index 763f0e9b5a..a5b49e9077 100644
--- a/platform/android/audio_driver_jandroid.h
+++ b/platform/android/audio_driver_jandroid.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -33,8 +33,6 @@
#include "servers/audio_server.h"
-#ifndef ANDROID_NATIVE_ACTIVITY
-
#include "java_glue.h"
class AudioDriverAndroid : public AudioDriver {
@@ -78,5 +76,4 @@ public:
AudioDriverAndroid();
};
-#endif
#endif // AUDIO_DRIVER_ANDROID_H
diff --git a/platform/android/audio_driver_opensl.cpp b/platform/android/audio_driver_opensl.cpp
index 21c61f6ca0..e259380a63 100644
--- a/platform/android/audio_driver_opensl.cpp
+++ b/platform/android/audio_driver_opensl.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/android/audio_driver_opensl.h b/platform/android/audio_driver_opensl.h
index 39e1315a02..77e16e507a 100644
--- a/platform/android/audio_driver_opensl.h
+++ b/platform/android/audio_driver_opensl.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/android/build.gradle.template b/platform/android/build.gradle.template
index 18ffc74fc3..2fea250061 100644
--- a/platform/android/build.gradle.template
+++ b/platform/android/build.gradle.template
@@ -5,7 +5,7 @@ buildscript {
$$GRADLE_REPOSITORY_URLS$$
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.2.0'
+ classpath 'com.android.tools.build:gradle:3.2.1'
$$GRADLE_CLASSPATH$$
}
}
@@ -22,6 +22,7 @@ allprojects {
}
dependencies {
+ implementation "com.android.support:support-core-utils:28.0.0"
$$GRADLE_DEPENDENCIES$$
}
@@ -29,10 +30,10 @@ android {
lintOptions {
abortOnError false
- disable 'MissingTranslation'
+ disable 'MissingTranslation','UnusedResources'
}
- compileSdkVersion 27
+ compileSdkVersion 28
buildToolsVersion "28.0.3"
useLibrary 'org.apache.http.legacy'
diff --git a/platform/android/detect.py b/platform/android/detect.py
index e4cab2fb23..aa48252435 100644
--- a/platform/android/detect.py
+++ b/platform/android/detect.py
@@ -27,7 +27,7 @@ def get_opts():
return [
('ANDROID_NDK_ROOT', 'Path to the Android NDK', os.environ.get("ANDROID_NDK_ROOT", 0)),
('ndk_platform', 'Target platform (android-<api>, e.g. "android-18")', "android-18"),
- EnumVariable('android_arch', 'Target architecture', "armv7", ('armv7', 'armv6', 'arm64v8', 'x86')),
+ EnumVariable('android_arch', 'Target architecture', "armv7", ('armv7', 'armv6', 'arm64v8', 'x86', 'x86_64')),
BoolVariable('android_neon', 'Enable NEON support (armv7 only)', True),
BoolVariable('android_stl', 'Enable Android STL support (for modules)', True)
]
@@ -94,7 +94,7 @@ def configure(env):
## Architecture
- if env['android_arch'] not in ['armv7', 'armv6', 'arm64v8', 'x86']:
+ if env['android_arch'] not in ['armv7', 'armv6', 'arm64v8', 'x86', 'x86_64']:
env['android_arch'] = 'armv7'
neon_text = ""
@@ -110,6 +110,16 @@ def configure(env):
abi_subpath = "i686-linux-android"
arch_subpath = "x86"
env["x86_libtheora_opt_gcc"] = True
+ if env['android_arch'] == 'x86_64':
+ if get_platform(env["ndk_platform"]) < 21:
+ print("WARNING: android_arch=x86_64 is not supported by ndk_platform lower than android-21; setting ndk_platform=android-21")
+ env["ndk_platform"] = "android-21"
+ env['ARCH'] = 'arch-x86_64'
+ env.extra_suffix = ".x86_64" + env.extra_suffix
+ target_subpath = "x86_64-4.9"
+ abi_subpath = "x86_64-linux-android"
+ arch_subpath = "x86_64"
+ env["x86_libtheora_opt_gcc"] = True
elif env['android_arch'] == 'armv6':
env['ARCH'] = 'arch-arm'
env.extra_suffix = ".armv6" + env.extra_suffix
@@ -141,7 +151,7 @@ def configure(env):
if (env["target"].startswith("release")):
if (env["optimize"] == "speed"): #optimize for speed (default)
env.Append(LINKFLAGS=['-O2'])
- env.Append(CPPFLAGS=['-O2', '-DNDEBUG', '-ffast-math', '-funsafe-math-optimizations', '-fomit-frame-pointer'])
+ env.Append(CPPFLAGS=['-O2', '-DNDEBUG', '-fomit-frame-pointer'])
else: #optimize for size
env.Append(CPPFLAGS=['-Os', '-DNDEBUG'])
env.Append(LINKFLAGS=['-Os'])
@@ -223,7 +233,7 @@ def configure(env):
else:
print("Using NDK deprecated headers")
env.Append(CPPFLAGS=["-isystem", lib_sysroot + "/usr/include"])
-
+
env.Append(CPPFLAGS='-fpic -ffunction-sections -funwind-tables -fstack-protector-strong -fvisibility=hidden -fno-strict-aliasing'.split())
env.Append(CPPFLAGS='-DNO_STATVFS -DGLES_ENABLED'.split())
@@ -233,6 +243,9 @@ def configure(env):
# The NDK adds this if targeting API < 21, so we can drop it when Godot targets it at least
env.Append(CPPFLAGS=['-mstackrealign'])
+ elif env['android_arch'] == 'x86_64':
+ target_opts = ['-target', 'x86_64-none-linux-android']
+
elif env["android_arch"] == "armv6":
target_opts = ['-target', 'armv6-none-linux-androideabi']
env.Append(CPPFLAGS='-D__ARM_ARCH_6__ -march=armv6 -mfpu=vfp -mfloat-abi=softfp'.split())
@@ -267,12 +280,12 @@ def configure(env):
env.Append(LINKFLAGS=['-shared', '--sysroot=' + lib_sysroot, '-Wl,--warn-shared-textrel'])
if mt_link:
env.Append(LINKFLAGS=['-Wl,--threads'])
-
+
if env["android_arch"] == "armv7":
env.Append(LINKFLAGS='-Wl,--fix-cortex-a8'.split())
env.Append(LINKFLAGS='-Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now'.split())
env.Append(LINKFLAGS='-Wl,-soname,libgodot_android.so -Wl,--gc-sections'.split())
-
+
env.Append(LINKFLAGS=target_opts)
env.Append(LINKFLAGS=common_opts)
@@ -282,7 +295,7 @@ def configure(env):
'/toolchains/' + target_subpath + '/prebuilt/' + host_subpath + '/' + abi_subpath + '/lib'])
env.Append(CPPPATH=['#platform/android'])
- env.Append(CPPFLAGS=['-DANDROID_ENABLED', '-DUNIX_ENABLED', '-DNO_FCNTL', '-DMPC_FIXED_POINT'])
+ env.Append(CPPFLAGS=['-DANDROID_ENABLED', '-DUNIX_ENABLED', '-DNO_FCNTL'])
env.Append(LIBS=['OpenSLES', 'EGL', 'GLESv3', 'android', 'log', 'z', 'dl'])
# TODO: Move that to opus module's config
diff --git a/platform/android/dir_access_android.cpp b/platform/android/dir_access_android.cpp
deleted file mode 100644
index 402da4527e..0000000000
--- a/platform/android/dir_access_android.cpp
+++ /dev/null
@@ -1,190 +0,0 @@
-/*************************************************************************/
-/* dir_access_android.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifdef ANDROID_NATIVE_ACTIVITY
-#include "dir_access_android.h"
-#include "file_access_android.h"
-
-DirAccess *DirAccessAndroid::create_fs() {
-
- return memnew(DirAccessAndroid);
-}
-
-Error DirAccessAndroid::list_dir_begin() {
-
- list_dir_end();
-
- AAssetDir *aad = AAssetManager_openDir(FileAccessAndroid::asset_manager, current_dir.utf8().get_data());
- if (!aad)
- return ERR_CANT_OPEN; //nothing
-
- return OK;
-}
-
-String DirAccessAndroid::get_next() {
-
- const char *fn = AAssetDir_getNextFileName(aad);
- if (!fn)
- return "";
- String s;
- s.parse_utf8(fn);
- current = s;
- return s;
-}
-
-bool DirAccessAndroid::current_is_dir() const {
-
- String sd;
- if (current_dir == "")
- sd = current;
- else
- sd = current_dir + "/" + current;
-
- AAssetDir *aad2 = AAssetManager_openDir(FileAccessAndroid::asset_manager, sd.utf8().get_data());
- if (aad2) {
-
- AAssetDir_close(aad2);
- return true;
- }
-
- return false;
-}
-
-bool DirAccessAndroid::current_is_hidden() const {
- return current != "." && current != ".." && current.begins_with(".");
-}
-
-void DirAccessAndroid::list_dir_end() {
-
- if (aad == NULL)
- return;
-
- AAssetDir_close(aad);
- aad = NULL;
-}
-
-int DirAccessAndroid::get_drive_count() {
-
- return 0;
-}
-
-String DirAccessAndroid::get_drive(int p_drive) {
-
- return "";
-}
-
-Error DirAccessAndroid::change_dir(String p_dir) {
-
- p_dir = p_dir.simplify_path();
-
- if (p_dir == "" || p_dir == "." || (p_dir == ".." && current_dir == ""))
- return OK;
-
- String new_dir;
-
- if (p_dir.begins_with("/"))
- new_dir = p_dir.substr(1, p_dir.length());
- else if (p_dir.begins_with("res://"))
- new_dir = p_dir.substr(6, p_dir.length());
- else //relative
- new_dir = new_dir + "/" + p_dir;
-
- //test if newdir exists
- new_dir = new_dir.simplify_path();
-
- AAssetDir *aad = AAssetManager_openDir(FileAccessAndroid::asset_manager, new_dir.utf8().get_data());
- if (aad) {
-
- current_dir = new_dir;
- AAssetDir_close(aad);
- return OK;
- }
-
- return ERR_INVALID_PARAMETER;
-}
-
-String DirAccessAndroid::get_current_dir() {
-
- return "/" + current_dir;
-}
-
-bool DirAccessAndroid::file_exists(String p_file) {
-
- String sd;
- if (current_dir == "")
- sd = p_file;
- else
- sd = current_dir + "/" + p_file;
-
- AAsset *a = AAssetManager_open(FileAccessAndroid::asset_manager, sd.utf8().get_data(), AASSET_MODE_STREAMING);
- if (a) {
- AAsset_close(a);
- return true;
- }
-
- return false;
-}
-
-Error DirAccessAndroid::make_dir(String p_dir) {
-
- ERR_FAIL_V(ERR_UNAVAILABLE);
-}
-
-Error DirAccessAndroid::rename(String p_from, String p_to) {
-
- ERR_FAIL_V(ERR_UNAVAILABLE);
-}
-
-Error DirAccessAndroid::remove(String p_name) {
-
- ERR_FAIL_V(ERR_UNAVAILABLE);
-}
-
-//FileType get_file_type() const;
-size_t DirAccessAndroid::get_space_left() {
-
- return 0;
-}
-
-void DirAccessAndroid::make_default() {
-
- instance_func = create_fs;
-}
-
-DirAccessAndroid::DirAccessAndroid() {
-
- aad = NULL;
-}
-
-DirAccessAndroid::~DirAccessAndroid() {
-
- list_dir_end();
-}
-#endif
diff --git a/platform/android/dir_access_jandroid.cpp b/platform/android/dir_access_jandroid.cpp
index 6a95277585..af31c758ee 100644
--- a/platform/android/dir_access_jandroid.cpp
+++ b/platform/android/dir_access_jandroid.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -28,8 +28,6 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
-#ifndef ANDROID_NATIVE_ACTIVITY
-
#include "dir_access_jandroid.h"
#include "core/print_string.h"
#include "file_access_jandroid.h"
@@ -245,4 +243,3 @@ DirAccessJAndroid::~DirAccessJAndroid() {
list_dir_end();
}
-#endif
diff --git a/platform/android/dir_access_jandroid.h b/platform/android/dir_access_jandroid.h
index 1653fb0aa5..1d989dd35e 100644
--- a/platform/android/dir_access_jandroid.h
+++ b/platform/android/dir_access_jandroid.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -31,8 +31,6 @@
#ifndef DIR_ACCESS_JANDROID_H
#define DIR_ACCESS_JANDROID_H
-#ifndef ANDROID_NATIVE_ACTIVITY
-
#include "core/os/dir_access.h"
#include "java_glue.h"
#include <stdio.h>
@@ -87,4 +85,3 @@ public:
};
#endif // DIR_ACCESS_JANDROID_H
-#endif
diff --git a/platform/android/export/export.cpp b/platform/android/export/export.cpp
index 3766f732e4..405fe0b294 100644
--- a/platform/android/export/export.cpp
+++ b/platform/android/export/export.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -551,8 +551,10 @@ class EditorExportAndroid : public EditorExportPlatform {
}
static Vector<String> get_abis() {
- // mips and armv6 are dead (especially for games), so not including them
Vector<String> abis;
+ // We can still build armv6 in theory, but it doesn't make much
+ // sense for games, so disabling for now.
+ //abis.push_back("armeabi");
abis.push_back("armeabi-v7a");
abis.push_back("arm64-v8a");
abis.push_back("x86");
@@ -672,10 +674,13 @@ class EditorExportAndroid : public EditorExportPlatform {
aperms++;
}
- for (int i = 0; i < MAX_USER_PERMISSIONS; i++) {
- String user_perm = p_preset->get("user_permissions/" + itos(i));
- if (user_perm.strip_edges() != "" && user_perm.strip_edges() != "False")
- perms.push_back(user_perm.strip_edges());
+ PoolStringArray user_perms = p_preset->get("permissions/custom_permissions");
+
+ for (int i = 0; i < user_perms.size(); i++) {
+ String user_perm = user_perms[i].strip_edges();
+ if (!user_perm.empty()) {
+ perms.push_back(user_perm);
+ }
}
if (p_give_internet) {
@@ -1104,10 +1109,6 @@ class EditorExportAndroid : public EditorExportPlatform {
}
public:
- enum {
- MAX_USER_PERMISSIONS = 20
- };
-
typedef Error (*EditorExportSaveFunction)(void *p_userdata, const String &p_path, const Vector<uint8_t> &p_data, int p_file, int p_total);
public:
@@ -1119,9 +1120,10 @@ public:
r_features->push_back("etc");
else*/
String driver = ProjectSettings::get_singleton()->get("rendering/quality/driver/driver_name");
- if (driver == "GLES2") {
+ if (driver == "GLES2" || driver == "GLES3") {
r_features->push_back("etc");
- } else {
+ }
+ if (driver == "GLES3") {
r_features->push_back("etc2");
}
@@ -1155,6 +1157,9 @@ public:
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, launcher_icons[i].option_id, PROPERTY_HINT_FILE, "*.png"), ""));
}
+ r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "keystore/debug", PROPERTY_HINT_GLOBAL_FILE, "*.keystore"), ""));
+ r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "keystore/debug_user"), ""));
+ r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "keystore/debug_password"), ""));
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "keystore/release", PROPERTY_HINT_GLOBAL_FILE, "*.keystore"), ""));
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "keystore/release_user"), ""));
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "keystore/release_password"), ""));
@@ -1165,21 +1170,18 @@ public:
Vector<String> abis = get_abis();
for (int i = 0; i < abis.size(); ++i) {
String abi = abis[i];
- bool is_default = (abi == "armeabi-v7a");
+ bool is_default = (abi == "armeabi-v7a" || abi == "arm64-v8a");
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "architectures/" + abi), is_default));
}
+ r_options->push_back(ExportOption(PropertyInfo(Variant::POOL_STRING_ARRAY, "permissions/custom_permissions"), PoolStringArray()));
+
const char **perms = android_perms;
while (*perms) {
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "permissions/" + String(*perms).to_lower()), false));
perms++;
}
-
- for (int i = 0; i < MAX_USER_PERMISSIONS; i++) {
-
- r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "user_permissions/" + itos(i)), false));
- }
}
virtual String get_name() const {
@@ -1418,12 +1420,15 @@ public:
err += "OpenJDK 8 jarsigner not configured in the Editor Settings.\n";
}
- String dk = EditorSettings::get_singleton()->get("export/android/debug_keystore");
+ String dk = p_preset->get("keystore/debug");
if (!FileAccess::exists(dk)) {
- valid = false;
- err += "Debug keystore not configured in the Editor Settings.\n";
+ dk = EditorSettings::get_singleton()->get("export/android/debug_keystore");
+ if (!FileAccess::exists(dk)) {
+ valid = false;
+ err += "Debug keystore not configured in the Editor Settings nor in the preset.\n";
+ }
}
bool apk_expansion = p_preset->get("apk_expansion/enable");
@@ -1565,7 +1570,7 @@ public:
_fix_resources(p_preset, data);
}
- if (file == "res/drawable/icon.png") {
+ if (file == "res/drawable-nodpi-v4/icon.png") {
bool found = false;
for (unsigned int i = 0; i < sizeof(launcher_icons) / sizeof(launcher_icons[0]); ++i) {
String icon_path = String(p_preset->get(launcher_icons[i].option_id)).strip_edges();
@@ -1773,9 +1778,17 @@ public:
String password;
String user;
if (p_debug) {
- keystore = EditorSettings::get_singleton()->get("export/android/debug_keystore");
- password = EditorSettings::get_singleton()->get("export/android/debug_keystore_pass");
- user = EditorSettings::get_singleton()->get("export/android/debug_keystore_user");
+
+ keystore = p_preset->get("keystore/debug");
+ password = p_preset->get("keystore/debug_password");
+ user = p_preset->get("keystore/debug_user");
+
+ if (keystore.empty()) {
+
+ keystore = EditorSettings::get_singleton()->get("export/android/debug_keystore");
+ password = EditorSettings::get_singleton()->get("export/android/debug_keystore_pass");
+ user = EditorSettings::get_singleton()->get("export/android/debug_keystore_user");
+ }
ep.step("Signing debug APK...", 103);
diff --git a/platform/android/export/export.h b/platform/android/export/export.h
index 9d66626866..42f3e70450 100644
--- a/platform/android/export/export.h
+++ b/platform/android/export/export.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/android/file_access_android.cpp b/platform/android/file_access_android.cpp
index 4c7436a5dc..f8a2c73a1e 100644
--- a/platform/android/file_access_android.cpp
+++ b/platform/android/file_access_android.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/android/file_access_android.h b/platform/android/file_access_android.h
index 1ee8697fa4..f8d46ea5d2 100644
--- a/platform/android/file_access_android.h
+++ b/platform/android/file_access_android.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/android/file_access_jandroid.cpp b/platform/android/file_access_jandroid.cpp
index 573200bcf9..63bc5f69d1 100644
--- a/platform/android/file_access_jandroid.cpp
+++ b/platform/android/file_access_jandroid.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -28,8 +28,6 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
-#ifndef ANDROID_NATIVE_ACTIVITY
-
#include "file_access_jandroid.h"
#include "core/os/os.h"
#include "thread_jandroid.h"
@@ -212,5 +210,3 @@ FileAccessJAndroid::~FileAccessJAndroid() {
if (is_open())
close();
}
-
-#endif
diff --git a/platform/android/file_access_jandroid.h b/platform/android/file_access_jandroid.h
index 39c201ba85..304c33ecac 100644
--- a/platform/android/file_access_jandroid.h
+++ b/platform/android/file_access_jandroid.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -31,8 +31,6 @@
#ifndef FILE_ACCESS_JANDROID_H
#define FILE_ACCESS_JANDROID_H
-#ifndef ANDROID_NATIVE_ACTIVITY
-
#include "core/os/file_access.h"
#include "java_glue.h"
class FileAccessJAndroid : public FileAccess {
@@ -81,6 +79,4 @@ public:
~FileAccessJAndroid();
};
-#endif
-
#endif // FILE_ACCESS_JANDROID_H
diff --git a/platform/android/godot_android.cpp b/platform/android/godot_android.cpp
deleted file mode 100644
index c46c6f7804..0000000000
--- a/platform/android/godot_android.cpp
+++ /dev/null
@@ -1,937 +0,0 @@
-/*************************************************************************/
-/* godot_android.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifdef ANDROID_NATIVE_ACTIVITY
-
-#include "core/engine.h"
-#include "core/project_settings.h"
-#include "file_access_android.h"
-#include "main/main.h"
-#include "os_android.h"
-
-#include <EGL/egl.h>
-#include <android/log.h>
-#include <android/sensor.h>
-#include <android/window.h>
-#include <android_native_app_glue.h>
-#include <errno.h>
-#include <jni.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "godot", __VA_ARGS__))
-#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "godot", __VA_ARGS__))
-
-extern "C" {
-JNIEXPORT void JNICALL Java_org_godotengine_godot_Godot_registerSingleton(JNIEnv *env, jobject obj, jstring name, jobject p_object);
-JNIEXPORT void JNICALL Java_org_godotengine_godot_Godot_registerMethod(JNIEnv *env, jobject obj, jstring sname, jstring name, jstring ret, jobjectArray args);
-JNIEXPORT jstring JNICALL Java_org_godotengine_godot_Godot_getGlobal(JNIEnv *env, jobject obj, jstring path);
-};
-
-class JNISingleton : public Object {
-
- GDCLASS(JNISingleton, Object);
-
- struct MethodData {
-
- jmethodID method;
- Variant::Type ret_type;
- Vector<Variant::Type> argtypes;
- };
-
- jobject instance;
- Map<StringName, MethodData> method_map;
- JNIEnv *env;
-
-public:
- void update_env(JNIEnv *p_env) { env = p_env; }
-
- virtual Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Variant::CallError &r_error) {
-
- r_error.error = Variant::CallError::CALL_OK;
-
- Map<StringName, MethodData>::Element *E = method_map.find(p_method);
- if (!E) {
-
- r_error.error = Variant::CallError::CALL_ERROR_INVALID_METHOD;
- return Variant();
- }
-
- int ac = E->get().argtypes.size();
- if (ac < p_argcount) {
-
- r_error.error = Variant::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
- r_error.argument = ac;
- return Variant();
- }
-
- if (ac > p_argcount) {
-
- r_error.error = Variant::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
- r_error.argument = ac;
- return Variant();
- }
-
- for (int i = 0; i < p_argcount; i++) {
-
- if (!Variant::can_convert(p_args[i]->get_type(), E->get().argtypes[i])) {
-
- r_error.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
- r_error.argument = i;
- r_error.expected = E->get().argtypes[i];
- }
- }
-
- jvalue *v = NULL;
-
- if (p_argcount) {
-
- v = (jvalue *)alloca(sizeof(jvalue) * p_argcount);
- }
-
- for (int i = 0; i < p_argcount; i++) {
-
- switch (E->get().argtypes[i]) {
-
- case Variant::BOOL: {
-
- v[i].z = *p_args[i];
- } break;
- case Variant::INT: {
-
- v[i].i = *p_args[i];
- } break;
- case Variant::REAL: {
-
- v[i].f = *p_args[i];
- } break;
- case Variant::STRING: {
-
- String s = *p_args[i];
- jstring jStr = env->NewStringUTF(s.utf8().get_data());
- v[i].l = jStr;
- } break;
- case Variant::STRING_ARRAY: {
-
- PoolVector<String> sarray = *p_args[i];
- jobjectArray arr = env->NewObjectArray(sarray.size(), env->FindClass("java/lang/String"), env->NewStringUTF(""));
-
- for (int j = 0; j < sarray.size(); j++) {
-
- env->SetObjectArrayElement(arr, j, env->NewStringUTF(sarray[i].utf8().get_data()));
- }
- v[i].l = arr;
-
- } break;
- case Variant::INT_ARRAY: {
-
- PoolVector<int> array = *p_args[i];
- jintArray arr = env->NewIntArray(array.size());
- PoolVector<int>::Read r = array.read();
- env->SetIntArrayRegion(arr, 0, array.size(), r.ptr());
- v[i].l = arr;
-
- } break;
- case Variant::REAL_ARRAY: {
-
- PoolVector<float> array = *p_args[i];
- jfloatArray arr = env->NewFloatArray(array.size());
- PoolVector<float>::Read r = array.read();
- env->SetFloatArrayRegion(arr, 0, array.size(), r.ptr());
- v[i].l = arr;
-
- } break;
- default: {
-
- ERR_FAIL_V(Variant());
- } break;
- }
- }
-
- Variant ret;
-
- switch (E->get().ret_type) {
-
- case Variant::NIL: {
-
- env->CallVoidMethodA(instance, E->get().method, v);
- } break;
- case Variant::BOOL: {
-
- ret = env->CallBooleanMethodA(instance, E->get().method, v);
- } break;
- case Variant::INT: {
-
- ret = env->CallIntMethodA(instance, E->get().method, v);
- } break;
- case Variant::REAL: {
-
- ret = env->CallFloatMethodA(instance, E->get().method, v);
- } break;
- case Variant::STRING: {
-
- jobject o = env->CallObjectMethodA(instance, E->get().method, v);
- String singname = env->GetStringUTFChars((jstring)o, NULL);
- } break;
- case Variant::STRING_ARRAY: {
-
- jobjectArray arr = (jobjectArray)env->CallObjectMethodA(instance, E->get().method, v);
-
- int stringCount = env->GetArrayLength(arr);
- PoolVector<String> sarr;
-
- for (int i = 0; i < stringCount; i++) {
- jstring string = (jstring)env->GetObjectArrayElement(arr, i);
- const char *rawString = env->GetStringUTFChars(string, 0);
- sarr.push_back(String(rawString));
- }
-
- ret = sarr;
-
- } break;
- case Variant::INT_ARRAY: {
-
- jintArray arr = (jintArray)env->CallObjectMethodA(instance, E->get().method, v);
-
- int fCount = env->GetArrayLength(arr);
- PoolVector<int> sarr;
- sarr.resize(fCount);
-
- PoolVector<int>::Write w = sarr.write();
- env->GetIntArrayRegion(arr, 0, fCount, w.ptr());
- w = PoolVector<int>::Write();
- ret = sarr;
- } break;
- case Variant::REAL_ARRAY: {
-
- jfloatArray arr = (jfloatArray)env->CallObjectMethodA(instance, E->get().method, v);
-
- int fCount = env->GetArrayLength(arr);
- PoolVector<float> sarr;
- sarr.resize(fCount);
-
- PoolVector<float>::Write w = sarr.write();
- env->GetFloatArrayRegion(arr, 0, fCount, w.ptr());
- w = PoolVector<float>::Write();
- ret = sarr;
- } break;
- default: {
-
- ERR_FAIL_V(Variant());
- } break;
- }
-
- return ret;
- }
-
- jobject get_instance() const {
-
- return instance;
- }
- void set_instance(jobject p_instance) {
-
- instance = p_instance;
- }
-
- void add_method(const StringName &p_name, jmethodID p_method, const Vector<Variant::Type> &p_args, Variant::Type p_ret_type) {
-
- MethodData md;
- md.method = p_method;
- md.argtypes = p_args;
- md.ret_type = p_ret_type;
- method_map[p_name] = md;
- }
-
- JNISingleton() {}
-};
-
-//JNIEnv *JNISingleton::env=NULL;
-
-static HashMap<String, JNISingleton *> jni_singletons;
-
-struct engine {
- struct android_app *app;
- OS_Android *os;
- JNIEnv *jni;
-
- ASensorManager *sensorManager;
- const ASensor *accelerometerSensor;
- const ASensor *magnetometerSensor;
- const ASensor *gyroscopeSensor;
- ASensorEventQueue *sensorEventQueue;
-
- bool display_active;
- bool requested_quit;
- int animating;
- EGLDisplay display;
- EGLSurface surface;
- EGLContext context;
- int32_t width;
- int32_t height;
-};
-
-/**
- * Initialize an EGL context for the current display.
- */
-static int engine_init_display(struct engine *engine, bool p_gl2) {
- // initialize OpenGL ES and EGL
-
- /*
- * Here specify the attributes of the desired configuration.
- * Below, we select an EGLConfig with at least 8 bits per color
- * component compatible with on-screen windows
- */
- const EGLint gl2_attribs[] = {
- // EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
- EGL_BLUE_SIZE, 4,
- EGL_GREEN_SIZE, 4,
- EGL_RED_SIZE, 4,
- EGL_ALPHA_SIZE, 0,
- EGL_DEPTH_SIZE, 16,
- EGL_STENCIL_SIZE, EGL_DONT_CARE,
- EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
- EGL_NONE
- };
-
- const EGLint gl1_attribs[] = {
- // EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
- EGL_BLUE_SIZE, 4,
- EGL_GREEN_SIZE, 4,
- EGL_RED_SIZE, 4,
- EGL_ALPHA_SIZE, 0,
- EGL_DEPTH_SIZE, 16,
- EGL_STENCIL_SIZE, EGL_DONT_CARE,
- EGL_NONE
- };
-
- const EGLint *attribs = p_gl2 ? gl2_attribs : gl1_attribs;
-
- EGLint w, h, dummy, format;
- EGLint numConfigs;
- EGLConfig config;
- EGLSurface surface;
- EGLContext context;
-
- EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-
- eglInitialize(display, 0, 0);
-
- /* Here, the application chooses the configuration it desires. In this
- * sample, we have a very simplified selection process, where we pick
- * the first EGLConfig that matches our criteria */
-
- eglChooseConfig(display, attribs, &config, 1, &numConfigs);
-
- LOGI("Num configs: %i\n", numConfigs);
-
- /* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is
- * guaranteed to be accepted by ANativeWindow_setBuffersGeometry().
- * As soon as we picked a EGLConfig, we can safely reconfigure the
- * ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID. */
- eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);
-
- ANativeWindow_setBuffersGeometry(engine->app->window, 0, 0, format);
- //ANativeWindow_setFlags(engine->app->window, 0, 0, format|);
-
- surface = eglCreateWindowSurface(display, config, engine->app->window, NULL);
-
- const EGLint context_attribs[] = {
- EGL_CONTEXT_CLIENT_VERSION, 2,
- EGL_NONE
- };
- context = eglCreateContext(display, config, EGL_NO_CONTEXT, p_gl2 ? context_attribs : NULL);
-
- if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) {
- LOGW("Unable to eglMakeCurrent");
- return -1;
- }
-
- eglQuerySurface(display, surface, EGL_WIDTH, &w);
- eglQuerySurface(display, surface, EGL_HEIGHT, &h);
-
- //engine->os->set_egl_extensions(eglQueryString(display,EGL_EXTENSIONS));
- engine->os->init_video_mode(w, h);
-
- engine->display = display;
- engine->context = context;
- engine->surface = surface;
- engine->width = w;
- engine->height = h;
- engine->display_active = true;
-
- //engine->state.angle = 0;
-
- // Initialize GL state.
- //glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
- glEnable(GL_CULL_FACE);
- // glShadeModel(GL_SMOOTH);
- glDisable(GL_DEPTH_TEST);
- LOGI("GL Version: %s - %s %s\n", glGetString(GL_VERSION), glGetString(GL_VENDOR), glGetString(GL_RENDERER));
-
- return 0;
-}
-
-static void engine_draw_frame(struct engine *engine) {
- if (engine->display == NULL) {
- // No display.
- return;
- }
-
- // Just fill the screen with a color.
- //glClearColor(0,1,0,1);
- //glClear(GL_COLOR_BUFFER_BIT);
- if (engine->os && engine->os->main_loop_iterate()) {
-
- engine->requested_quit = true;
- return; //should exit instead
- }
-
- eglSwapBuffers(engine->display, engine->surface);
-}
-
-static void engine_term_display(struct engine *engine) {
- if (engine->display != EGL_NO_DISPLAY) {
- eglMakeCurrent(engine->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
- if (engine->context != EGL_NO_CONTEXT) {
- eglDestroyContext(engine->display, engine->context);
- }
- if (engine->surface != EGL_NO_SURFACE) {
- eglDestroySurface(engine->display, engine->surface);
- }
- eglTerminate(engine->display);
- }
-
- engine->animating = 0;
- engine->display = EGL_NO_DISPLAY;
- engine->context = EGL_NO_CONTEXT;
- engine->surface = EGL_NO_SURFACE;
- engine->display_active = false;
-}
-
-/**
- * Process the next input event.
- */
-static int32_t engine_handle_input(struct android_app *app, AInputEvent *event) {
- struct engine *engine = (struct engine *)app->userData;
-
- if (!engine->os)
- return 0;
-
- switch (AInputEvent_getType(event)) {
-
- case AINPUT_EVENT_TYPE_KEY: {
-
- int ac = AKeyEvent_getAction(event);
- switch (ac) {
-
- case AKEY_EVENT_ACTION_DOWN: {
-
- int32_t code = AKeyEvent_getKeyCode(event);
- if (code == AKEYCODE_BACK) {
-
- //AInputQueue_finishEvent(AInputQueue* queue, AInputEvent* event, int handled);
- if (engine->os)
- engine->os->main_loop_request_quit();
- return 1;
- }
-
- } break;
- case AKEY_EVENT_ACTION_UP: {
-
- } break;
- }
-
- } break;
- case AINPUT_EVENT_TYPE_MOTION: {
-
- Vector<OS_Android::TouchPos> touchvec;
-
- int pc = AMotionEvent_getPointerCount(event);
-
- touchvec.resize(pc);
-
- for (int i = 0; i < pc; i++) {
-
- touchvec[i].pos.x = AMotionEvent_getX(event, i);
- touchvec[i].pos.y = AMotionEvent_getY(event, i);
- touchvec[i].id = AMotionEvent_getPointerId(event, i);
- }
-
- //System.out.printf("gaction: %d\n",event.getAction());
- int pidx = (AMotionEvent_getAction(event) & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> 8;
- switch (AMotionEvent_getAction(event) & AMOTION_EVENT_ACTION_MASK) {
-
- case AMOTION_EVENT_ACTION_DOWN: {
- engine->os->process_touch(0, 0, touchvec);
-
- //System.out.printf("action down at: %f,%f\n", event.getX(),event.getY());
- } break;
- case AMOTION_EVENT_ACTION_MOVE: {
- engine->os->process_touch(1, 0, touchvec);
- /*
- for(int i=0;i<event.getPointerCount();i++) {
- System.out.printf("%d - moved to: %f,%f\n",i, event.getX(i),event.getY(i));
- }
- */
- } break;
- case AMOTION_EVENT_ACTION_POINTER_UP: {
-
- engine->os->process_touch(4, pidx, touchvec);
- //System.out.printf("%d - s.up at: %f,%f\n",pointer_idx, event.getX(pointer_idx),event.getY(pointer_idx));
- } break;
- case AMOTION_EVENT_ACTION_POINTER_DOWN: {
- engine->os->process_touch(3, pidx, touchvec);
- //System.out.printf("%d - s.down at: %f,%f\n",pointer_idx, event.getX(pointer_idx),event.getY(pointer_idx));
- } break;
- case AMOTION_EVENT_ACTION_CANCEL:
- case AMOTION_EVENT_ACTION_UP: {
- engine->os->process_touch(2, 0, touchvec);
- /*
- for(int i=0;i<event.getPointerCount();i++) {
- System.out.printf("%d - up! %f,%f\n",i, event.getX(i),event.getY(i));
- }
- */
- } break;
- }
-
- return 1;
- } break;
- }
-
- return 0;
-}
-
-/**
- * Process the next main command.
- */
-
-static void _gfx_init(void *ud, bool p_gl2) {
-
- struct engine *engine = (struct engine *)ud;
- engine_init_display(engine, p_gl2);
-}
-
-static void engine_handle_cmd(struct android_app *app, int32_t cmd) {
- struct engine *engine = (struct engine *)app->userData;
- // LOGI("**** CMD %i\n",cmd);
- switch (cmd) {
- case APP_CMD_SAVE_STATE:
- // The system has asked us to save our current state. Do so.
- //engine->app->savedState = malloc(sizeof(struct saved_state));
- //*((struct saved_state*)engine->app->savedState) = engine->state;
- //engine->app->savedStateSize = sizeof(struct saved_state);
- break;
- case APP_CMD_CONFIG_CHANGED:
- case APP_CMD_WINDOW_RESIZED: {
-
- if (engine->display_active) {
-
- EGLint w, h;
- eglQuerySurface(engine->display, engine->surface, EGL_WIDTH, &w);
- eglQuerySurface(engine->display, engine->surface, EGL_HEIGHT, &h);
- // if (w==engine->os->get_video_mode().width && h==engine->os->get_video_mode().height)
- // break;
-
- engine_term_display(engine);
- }
-
- engine->os->reload_gfx();
- engine_draw_frame(engine);
- engine->animating = 1;
-
- } break;
- case APP_CMD_INIT_WINDOW:
- //The window is being shown, get it ready.
- //LOGI("INIT WINDOW");
- if (engine->app->window != NULL) {
-
- if (engine->os == NULL) {
-
- //do initialization here, when there's OpenGL! hackish but the only way
- engine->os = new OS_Android(_gfx_init, engine);
-
- __android_log_print(ANDROID_LOG_INFO, "godot", "pre asdasd setup...");
-
- Error err = Main::setup("apk", 0, NULL);
-
- String modules = ProjectSettings::get_singleton()->get("android/modules");
- Vector<String> mods = modules.split(",", false);
- mods.push_back("GodotOS");
- __android_log_print(ANDROID_LOG_INFO, "godot", "mod count: %i", mods.size());
-
- if (mods.size()) {
-
- jclass activityClass = engine->jni->FindClass("android/app/NativeActivity");
-
- jmethodID getClassLoader = engine->jni->GetMethodID(activityClass, "getClassLoader", "()Ljava/lang/ClassLoader;");
-
- jobject cls = engine->jni->CallObjectMethod(app->activity->clazz, getClassLoader);
-
- jclass classLoader = engine->jni->FindClass("java/lang/ClassLoader");
-
- jmethodID findClass = engine->jni->GetMethodID(classLoader, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;");
-
- static JNINativeMethod methods[] = {
- { "registerSingleton", "(Ljava/lang/String;Ljava/lang/Object;)V", (void *)&Java_org_godotengine_godot_Godot_registerSingleton },
- { "registerMethod", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V", (void *)&Java_org_godotengine_godot_Godot_registerMethod },
- { "getGlobal", "(Ljava/lang/String;)Ljava/lang/String;", (void *)&Java_org_godotengine_godot_Godot_getGlobal },
- };
-
- jstring gstrClassName = engine->jni->NewStringUTF("org/godotengine/godot/Godot");
- jclass GodotClass = (jclass)engine->jni->CallObjectMethod(cls, findClass, gstrClassName);
-
- __android_log_print(ANDROID_LOG_INFO, "godot", "godot ****^*^*?^*^*class data %x", GodotClass);
-
- engine->jni->RegisterNatives(GodotClass, methods, sizeof(methods) / sizeof(methods[0]));
-
- for (int i = 0; i < mods.size(); i++) {
-
- String m = mods[i];
- //jclass singletonClass = engine->jni->FindClass(m.utf8().get_data());
-
- jstring strClassName = engine->jni->NewStringUTF(m.utf8().get_data());
- jclass singletonClass = (jclass)engine->jni->CallObjectMethod(cls, findClass, strClassName);
-
- __android_log_print(ANDROID_LOG_INFO, "godot", "****^*^*?^*^*class data %x", singletonClass);
- jmethodID initialize = engine->jni->GetStaticMethodID(singletonClass, "initialize", "(Landroid/app/Activity;)Lorg/godotengine/godot/Godot$SingletonBase;");
-
- jobject obj = engine->jni->CallStaticObjectMethod(singletonClass, initialize, app->activity->clazz);
- __android_log_print(ANDROID_LOG_INFO, "godot", "****^*^*?^*^*class instance %x", obj);
- jobject gob = engine->jni->NewGlobalRef(obj);
- }
- }
-
- if (!Main::start())
- return; //should exit instead and print the error
-
- engine->os->main_loop_begin();
- } else {
- //i guess recreate resources?
- engine->os->reload_gfx();
- }
-
- engine->animating = 1;
- engine_draw_frame(engine);
- }
- break;
- case APP_CMD_TERM_WINDOW:
- // The window is being hidden or closed, clean it up.
- //LOGI("TERM WINDOW");
- engine_term_display(engine);
- break;
- case APP_CMD_GAINED_FOCUS:
- // When our app gains focus, we start monitoring the accelerometer.
- if (engine->accelerometerSensor != NULL) {
- ASensorEventQueue_enableSensor(engine->sensorEventQueue,
- engine->accelerometerSensor);
- // We'd like to get 60 events per second (in us).
- ASensorEventQueue_setEventRate(engine->sensorEventQueue,
- engine->accelerometerSensor, (1000L / 60) * 1000);
- }
- // start monitoring gravity
- if (engine->gravitySensor != NULL) {
- ASensorEventQueue_enableSensor(engine->sensorEventQueue,
- engine->gravitySensor);
- // We'd like to get 60 events per second (in us).
- ASensorEventQueue_setEventRate(engine->sensorEventQueue,
- engine->gravitySensor, (1000L / 60) * 1000);
- }
- // Also start monitoring the magnetometer.
- if (engine->magnetometerSensor != NULL) {
- ASensorEventQueue_enableSensor(engine->sensorEventQueue,
- engine->magnetometerSensor);
- // We'd like to get 60 events per second (in us).
- ASensorEventQueue_setEventRate(engine->sensorEventQueue,
- engine->magnetometerSensor, (1000L / 60) * 1000);
- }
- // And the gyroscope.
- if (engine->gyroscopeSensor != NULL) {
- ASensorEventQueue_enableSensor(engine->sensorEventQueue,
- engine->gyroscopeSensor);
- // We'd like to get 60 events per second (in us).
- ASensorEventQueue_setEventRate(engine->sensorEventQueue,
- engine->gyroscopeSensor, (1000L / 60) * 1000);
- }
- engine->animating = 1;
- break;
- case APP_CMD_LOST_FOCUS:
- // When our app loses focus, we stop monitoring the sensors.
- // This is to avoid consuming battery while not being used.
- if (engine->accelerometerSensor != NULL) {
- ASensorEventQueue_disableSensor(engine->sensorEventQueue,
- engine->accelerometerSensor);
- }
- if (engine->gravitySensor != NULL) {
- ASensorEventQueue_disableSensor(engine->sensorEventQueue,
- engine->gravitySensor);
- }
- if (engine->magnetometerSensor != NULL) {
- ASensorEventQueue_disableSensor(engine->sensorEventQueue,
- engine->magnetometerSensor);
- }
- if (engine->gyroscopeSensor != NULL) {
- ASensorEventQueue_disableSensor(engine->sensorEventQueue,
- engine->gyroscopeSensor);
- }
- // Also stop animating.
- engine->animating = 0;
- engine_draw_frame(engine);
- break;
- }
-}
-
-void android_main(struct android_app *app) {
- struct engine engine;
- // Make sure glue isn't stripped.
- app_dummy();
-
- memset(&engine, 0, sizeof(engine));
- app->userData = &engine;
- app->onAppCmd = engine_handle_cmd;
- app->onInputEvent = engine_handle_input;
- engine.app = app;
- engine.requested_quit = false;
- engine.os = NULL;
- engine.display_active = false;
-
- FileAccessAndroid::asset_manager = app->activity->assetManager;
-
- // Prepare to monitor sensors
- engine.sensorManager = ASensorManager_getInstance();
- engine.accelerometerSensor = ASensorManager_getDefaultSensor(engine.sensorManager,
- ASENSOR_TYPE_ACCELEROMETER);
- engine.gravitySensor = ASensorManager_getDefaultSensor(engine.sensorManager,
- ASENSOR_TYPE_GRAVITY);
- engine.magnetometerSensor = ASensorManager_getDefaultSensor(engine.sensorManager,
- ASENSOR_TYPE_MAGNETIC_FIELD);
- engine.gyroscopeSensor = ASensorManager_getDefaultSensor(engine.sensorManager,
- ASENSOR_TYPE_GYROSCOPE);
- engine.sensorEventQueue = ASensorManager_createEventQueue(engine.sensorManager,
- app->looper, LOOPER_ID_USER, NULL, NULL);
-
- ANativeActivity_setWindowFlags(app->activity, AWINDOW_FLAG_FULLSCREEN | AWINDOW_FLAG_KEEP_SCREEN_ON, 0);
-
- app->activity->vm->AttachCurrentThread(&engine.jni, NULL);
-
- // loop waiting for stuff to do.
-
- while (1) {
- // Read all pending events.
- int ident;
- int events;
- struct android_poll_source *source;
-
- // If not animating, we will block forever waiting for events.
- // If animating, we loop until all events are read, then continue
- // to draw the next frame of animation.
-
- int nullmax = 50;
- while ((ident = ALooper_pollAll(engine.animating ? 0 : -1, NULL, &events,
- (void **)&source)) >= 0) {
-
- // Process this event.
-
- if (source != NULL) {
- // LOGI("process\n");
- source->process(app, source);
- } else {
- nullmax--;
- if (nullmax < 0)
- break;
- }
-
- // If a sensor has data, process it now.
- // LOGI("events\n");
- if (ident == LOOPER_ID_USER) {
- if (engine.accelerometerSensor != NULL || engine.magnetometerSensor != NULL || engine.gyroscopeSensor != NULL) {
- ASensorEvent event;
- while (ASensorEventQueue_getEvents(engine.sensorEventQueue,
- &event, 1) > 0) {
-
- if (engine.os) {
- if (event.acceleration != NULL) {
- engine.os->process_accelerometer(Vector3(event.acceleration.x, event.acceleration.y,
- event.acceleration.z));
- }
- if (event.magnetic != NULL) {
- engine.os->process_magnetometer(Vector3(event.magnetic.x, event.magnetic.y,
- event.magnetic.z));
- }
- if (event.vector != NULL) {
- engine.os->process_gyroscope(Vector3(event.vector.x, event.vector.y,
- event.vector.z));
- }
- }
- }
- }
- }
-
- // Check if we are exiting.
- if (app->destroyRequested != 0) {
- if (engine.os) {
- engine.os->main_loop_request_quit();
- }
- app->destroyRequested = 0;
- }
-
- if (engine.requested_quit) {
- engine_term_display(&engine);
- exit(0);
- }
-
- // LOGI("end\n");
- }
-
- // LOGI("engine animating? %i\n",engine.animating);
-
- if (engine.animating) {
- //do os render
-
- engine_draw_frame(&engine);
- //LOGI("TERM WINDOW");
- }
- }
-}
-
-JNIEXPORT void JNICALL Java_org_godotengine_godot_Godot_registerSingleton(JNIEnv *env, jobject obj, jstring name, jobject p_object) {
-
- String singname = env->GetStringUTFChars(name, NULL);
- JNISingleton *s = memnew(JNISingleton);
- s->update_env(env);
- s->set_instance(env->NewGlobalRef(p_object));
- jni_singletons[singname] = s;
-
- Engine::get_singleton()->add_singleton(Engine::Singleton(singname, s));
-}
-
-static Variant::Type get_jni_type(const String &p_type) {
-
- static struct {
- const char *name;
- Variant::Type type;
- } _type_to_vtype[] = {
- { "void", Variant::NIL },
- { "boolean", Variant::BOOL },
- { "int", Variant::INT },
- { "float", Variant::REAL },
- { "java.lang.String", Variant::STRING },
- { "[I", Variant::INT_ARRAY },
- { "[F", Variant::REAL_ARRAY },
- { "[Ljava.lang.String;", Variant::STRING_ARRAY },
- { NULL, Variant::NIL }
- };
-
- int idx = 0;
-
- while (_type_to_vtype[idx].name) {
-
- if (p_type == _type_to_vtype[idx].name)
- return _type_to_vtype[idx].type;
-
- idx++;
- }
-
- return Variant::NIL;
-}
-
-static const char *get_jni_sig(const String &p_type) {
-
- static struct {
- const char *name;
- const char *sig;
- } _type_to_vtype[] = {
- { "void", "V" },
- { "boolean", "Z" },
- { "int", "I" },
- { "float", "F" },
- { "java.lang.String", "Ljava/lang/String;" },
- { "[I", "[I" },
- { "[F", "[F" },
- { "[Ljava.lang.String;", "[Ljava/lang/String;" },
- { NULL, "V" }
- };
-
- int idx = 0;
-
- while (_type_to_vtype[idx].name) {
-
- if (p_type == _type_to_vtype[idx].name)
- return _type_to_vtype[idx].sig;
-
- idx++;
- }
-
- return "";
-}
-
-JNIEXPORT jstring JNICALL Java_org_godotengine_godot_Godot_getGlobal(JNIEnv *env, jobject obj, jstring path) {
-
- String js = env->GetStringUTFChars(path, NULL);
-
- return env->NewStringUTF(ProjectSettings::get_singleton()->get(js).operator String().utf8().get_data());
-}
-
-JNIEXPORT void JNICALL Java_org_godotengine_godot_Godot_registerMethod(JNIEnv *env, jobject obj, jstring sname, jstring name, jstring ret, jobjectArray args) {
-
- String singname = env->GetStringUTFChars(sname, NULL);
-
- ERR_FAIL_COND(!jni_singletons.has(singname));
-
- JNISingleton *s = jni_singletons.get(singname);
-
- String mname = env->GetStringUTFChars(name, NULL);
- String retval = env->GetStringUTFChars(ret, NULL);
- Vector<Variant::Type> types;
- String cs = "(";
-
- int stringCount = env->GetArrayLength(args);
-
- for (int i = 0; i < stringCount; i++) {
-
- jstring string = (jstring)env->GetObjectArrayElement(args, i);
- const char *rawString = env->GetStringUTFChars(string, 0);
- types.push_back(get_jni_type(String(rawString)));
- cs += get_jni_sig(String(rawString));
- }
-
- cs += ")";
- cs += get_jni_sig(retval);
- jclass cls = env->GetObjectClass(s->get_instance());
- jmethodID mid = env->GetMethodID(cls, mname.ascii().get_data(), cs.ascii().get_data());
- if (!mid) {
-
- print_line("RegisterMethod: Failed getting method ID: " + mname);
- }
-
- s->add_method(mname, mid, types, get_jni_type(retval));
-}
-
-#endif
diff --git a/platform/android/ifaddrs_android.cpp b/platform/android/ifaddrs_android.cpp
deleted file mode 100644
index f6d5cdbe77..0000000000
--- a/platform/android/ifaddrs_android.cpp
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * libjingle
- * Copyright 2012, Google Inc.
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "ifaddrs_android.h"
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/utsname.h>
-#include <sys/ioctl.h>
-#include <netinet/in.h>
-#include <net/if.h>
-#include <unistd.h>
-#include <errno.h>
-#include <linux/netlink.h>
-#include <linux/rtnetlink.h>
-
-struct netlinkrequest {
- nlmsghdr header;
- ifaddrmsg msg;
-};
-
-namespace {
-const int kMaxReadSize = 4096;
-}
-
-static int set_ifname(struct ifaddrs* ifaddr, int interface) {
- char buf[IFNAMSIZ] = {0};
- char* name = if_indextoname(interface, buf);
- if (name == NULL) {
- return -1;
- }
- ifaddr->ifa_name = new char[strlen(name) + 1];
- strncpy(ifaddr->ifa_name, name, strlen(name) + 1);
- return 0;
-}
-
-static int set_flags(struct ifaddrs* ifaddr) {
- int fd = socket(AF_INET, SOCK_DGRAM, 0);
- if (fd == -1) {
- return -1;
- }
- ifreq ifr;
- memset(&ifr, 0, sizeof(ifr));
- strncpy(ifr.ifr_name, ifaddr->ifa_name, IFNAMSIZ - 1);
- int rc = ioctl(fd, SIOCGIFFLAGS, &ifr);
- close(fd);
- if (rc == -1) {
- return -1;
- }
- ifaddr->ifa_flags = ifr.ifr_flags;
- return 0;
-}
-
-static int set_addresses(struct ifaddrs* ifaddr, ifaddrmsg* msg, void* data,
- size_t len) {
- if (msg->ifa_family == AF_INET) {
- sockaddr_in* sa = new sockaddr_in;
- sa->sin_family = AF_INET;
- memcpy(&sa->sin_addr, data, len);
- ifaddr->ifa_addr = reinterpret_cast<sockaddr*>(sa);
- } else if (msg->ifa_family == AF_INET6) {
- sockaddr_in6* sa = new sockaddr_in6;
- sa->sin6_family = AF_INET6;
- sa->sin6_scope_id = msg->ifa_index;
- memcpy(&sa->sin6_addr, data, len);
- ifaddr->ifa_addr = reinterpret_cast<sockaddr*>(sa);
- } else {
- return -1;
- }
- return 0;
-}
-
-static int make_prefixes(struct ifaddrs* ifaddr, int family, int prefixlen) {
- char* prefix = NULL;
- if (family == AF_INET) {
- sockaddr_in* mask = new sockaddr_in;
- mask->sin_family = AF_INET;
- memset(&mask->sin_addr, 0, sizeof(in_addr));
- ifaddr->ifa_netmask = reinterpret_cast<sockaddr*>(mask);
- if (prefixlen > 32) {
- prefixlen = 32;
- }
- prefix = reinterpret_cast<char*>(&mask->sin_addr);
- } else if (family == AF_INET6) {
- sockaddr_in6* mask = new sockaddr_in6;
- mask->sin6_family = AF_INET6;
- memset(&mask->sin6_addr, 0, sizeof(in6_addr));
- ifaddr->ifa_netmask = reinterpret_cast<sockaddr*>(mask);
- if (prefixlen > 128) {
- prefixlen = 128;
- }
- prefix = reinterpret_cast<char*>(&mask->sin6_addr);
- } else {
- return -1;
- }
- for (int i = 0; i < (prefixlen / 8); i++) {
- *prefix++ = 0xFF;
- }
- char remainder = 0xff;
- remainder <<= (8 - prefixlen % 8);
- *prefix = remainder;
- return 0;
-}
-
-static int populate_ifaddrs(struct ifaddrs* ifaddr, ifaddrmsg* msg, void* bytes,
- size_t len) {
- if (set_ifname(ifaddr, msg->ifa_index) != 0) {
- return -1;
- }
- if (set_flags(ifaddr) != 0) {
- return -1;
- }
- if (set_addresses(ifaddr, msg, bytes, len) != 0) {
- return -1;
- }
- if (make_prefixes(ifaddr, msg->ifa_family, msg->ifa_prefixlen) != 0) {
- return -1;
- }
- return 0;
-}
-
-int getifaddrs(struct ifaddrs** result) {
- int fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
- if (fd < 0) {
- return -1;
- }
- netlinkrequest ifaddr_request;
- memset(&ifaddr_request, 0, sizeof(ifaddr_request));
- ifaddr_request.header.nlmsg_flags = NLM_F_ROOT | NLM_F_REQUEST;
- ifaddr_request.header.nlmsg_type = RTM_GETADDR;
- ifaddr_request.header.nlmsg_len = NLMSG_LENGTH(sizeof(ifaddrmsg));
- ssize_t count = send(fd, &ifaddr_request, ifaddr_request.header.nlmsg_len, 0);
- if (static_cast<size_t>(count) != ifaddr_request.header.nlmsg_len) {
- close(fd);
- return -1;
- }
- struct ifaddrs* start = NULL;
- struct ifaddrs* current = NULL;
- char buf[kMaxReadSize];
- ssize_t amount_read = recv(fd, &buf, kMaxReadSize, 0);
- while (amount_read > 0) {
- nlmsghdr* header = reinterpret_cast<nlmsghdr*>(&buf[0]);
- size_t header_size = static_cast<size_t>(amount_read);
- for ( ; NLMSG_OK(header, header_size);
- header = NLMSG_NEXT(header, header_size)) {
- switch (header->nlmsg_type) {
- case NLMSG_DONE:
- // Success. Return.
- *result = start;
- close(fd);
- return 0;
- case NLMSG_ERROR:
- close(fd);
- freeifaddrs(start);
- return -1;
- case RTM_NEWADDR: {
- ifaddrmsg* address_msg =
- reinterpret_cast<ifaddrmsg*>(NLMSG_DATA(header));
- rtattr* rta = IFA_RTA(address_msg);
- ssize_t payload_len = IFA_PAYLOAD(header);
- while (RTA_OK(rta, payload_len)) {
- if (rta->rta_type == IFA_ADDRESS) {
- int family = address_msg->ifa_family;
- if (family == AF_INET || family == AF_INET6) {
- ifaddrs* newest = new ifaddrs;
- memset(newest, 0, sizeof(ifaddrs));
- if (current) {
- current->ifa_next = newest;
- } else {
- start = newest;
- }
- if (populate_ifaddrs(newest, address_msg, RTA_DATA(rta),
- RTA_PAYLOAD(rta)) != 0) {
- freeifaddrs(start);
- *result = NULL;
- return -1;
- }
- current = newest;
- }
- }
- rta = RTA_NEXT(rta, payload_len);
- }
- break;
- }
- }
- }
- amount_read = recv(fd, &buf, kMaxReadSize, 0);
- }
- close(fd);
- freeifaddrs(start);
- return -1;
-}
-
-void freeifaddrs(struct ifaddrs* addrs) {
- struct ifaddrs* last = NULL;
- struct ifaddrs* cursor = addrs;
- while (cursor) {
- delete[] cursor->ifa_name;
- delete cursor->ifa_addr;
- delete cursor->ifa_netmask;
- last = cursor;
- cursor = cursor->ifa_next;
- delete last;
- }
-}
diff --git a/platform/android/java/README.md b/platform/android/java/README.md
new file mode 100644
index 0000000000..58d2b10706
--- /dev/null
+++ b/platform/android/java/README.md
@@ -0,0 +1,47 @@
+# Third party libraries
+
+
+## Google's vending library
+
+- Upstream: https://github.com/google/play-licensing/tree/master/lvl_library/src/main/java/com/google/android/vending
+- Version: git (eb57657, 2018) with modifications
+- License: Apache 2.0
+
+Overwrite all files under `com/google/android/vending`
+
+### Modify some files to avoid compile error and lint warning
+
+#### com/google/android/vending/licensing/util/Base64.java
+```
+@@ -338,7 +338,8 @@ public class Base64 {
+ e += 4;
+ }
+
+- assert (e == outBuff.length);
++ if (BuildConfig.DEBUG && e != outBuff.length)
++ throw new RuntimeException();
+ return outBuff;
+ }
+```
+
+#### com/google/android/vending/licensing/LicenseChecker.java
+```
+@@ -29,8 +29,8 @@ import android.os.RemoteException;
+ import android.provider.Settings.Secure;
+ import android.util.Log;
+
+-import com.android.vending.licensing.ILicenseResultListener;
+-import com.android.vending.licensing.ILicensingService;
++import com.google.android.vending.licensing.ILicenseResultListener;
++import com.google.android.vending.licensing.ILicensingService;
+ import com.google.android.vending.licensing.util.Base64;
+ import com.google.android.vending.licensing.util.Base64DecoderException;
+```
+```
+@@ -287,13 +287,15 @@ public class LicenseChecker implements ServiceConnection {
+ if (logResponse) {
+- String android_id = Secure.getString(mContext.getContentResolver(),
+- Secure.ANDROID_ID);
++ String android_id = Secure.ANDROID_ID;
+ Date date = new Date();
+```
diff --git a/platform/android/java/gradle/wrapper/gradle-wrapper.jar b/platform/android/java/gradle/wrapper/gradle-wrapper.jar
index 13372aef5e..f6b961fd5a 100644
--- a/platform/android/java/gradle/wrapper/gradle-wrapper.jar
+++ b/platform/android/java/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/platform/android/java/gradle/wrapper/gradle-wrapper.properties b/platform/android/java/gradle/wrapper/gradle-wrapper.properties
index 6fb3a79546..bf3de21830 100644
--- a/platform/android/java/gradle/wrapper/gradle-wrapper.properties
+++ b/platform/android/java/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,5 @@
-#Sat Jul 29 16:10:03 ICT 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
diff --git a/platform/android/java/gradlew b/platform/android/java/gradlew
index 9d82f78915..cccdd3d517 100755
--- a/platform/android/java/gradlew
+++ b/platform/android/java/gradlew
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+#!/usr/bin/env sh
##############################################################################
##
@@ -6,20 +6,38 @@
##
##############################################################################
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
-warn ( ) {
+warn () {
echo "$*"
}
-die ( ) {
+die () {
echo
echo "$*"
echo
@@ -30,6 +48,7 @@ die ( ) {
cygwin=false
msys=false
darwin=false
+nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
@@ -40,26 +59,11 @@ case "`uname`" in
MINGW* )
msys=true
;;
+ NONSTOP* )
+ nonstop=true
+ ;;
esac
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
@@ -85,7 +89,7 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
@@ -150,11 +154,19 @@ if $cygwin ; then
esac
fi
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
- JVM_OPTS=("$@")
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
+exec "$JAVACMD" "$@"
diff --git a/platform/android/java/gradlew.bat b/platform/android/java/gradlew.bat
index 8a0b282aa6..e95643d6a2 100644
--- a/platform/android/java/gradlew.bat
+++ b/platform/android/java/gradlew.bat
@@ -1,90 +1,84 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windowz variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/platform/android/java/res/drawable-hdpi/notify_panel_notification_icon_bg.png b/platform/android/java/res/drawable-hdpi/notify_panel_notification_icon_bg.png
index 372b763ec5..2c246b04a4 100644
--- a/platform/android/java/res/drawable-hdpi/notify_panel_notification_icon_bg.png
+++ b/platform/android/java/res/drawable-hdpi/notify_panel_notification_icon_bg.png
Binary files differ
diff --git a/platform/android/java/res/drawable-mdpi/notify_panel_notification_icon_bg.png b/platform/android/java/res/drawable-mdpi/notify_panel_notification_icon_bg.png
index c61c440636..8bcd464bed 100644
--- a/platform/android/java/res/drawable-mdpi/notify_panel_notification_icon_bg.png
+++ b/platform/android/java/res/drawable-mdpi/notify_panel_notification_icon_bg.png
Binary files differ
diff --git a/platform/android/java/res/drawable/icon.png b/platform/android/java/res/drawable-nodpi/icon.png
index 6ad9b43117..6ad9b43117 100644
--- a/platform/android/java/res/drawable/icon.png
+++ b/platform/android/java/res/drawable-nodpi/icon.png
Binary files differ
diff --git a/platform/android/java/res/drawable-xhdpi/notify_panel_notification_icon_bg.png b/platform/android/java/res/drawable-xhdpi/notify_panel_notification_icon_bg.png
new file mode 100644
index 0000000000..372b763ec5
--- /dev/null
+++ b/platform/android/java/res/drawable-xhdpi/notify_panel_notification_icon_bg.png
Binary files differ
diff --git a/platform/android/java/res/drawable-xxhdpi/notify_panel_notification_icon_bg.png b/platform/android/java/res/drawable-xxhdpi/notify_panel_notification_icon_bg.png
new file mode 100644
index 0000000000..b458ff3057
--- /dev/null
+++ b/platform/android/java/res/drawable-xxhdpi/notify_panel_notification_icon_bg.png
Binary files differ
diff --git a/platform/android/java/res/layout/downloading_expansion.xml b/platform/android/java/res/layout/downloading_expansion.xml
index d678d94eac..4a9700965f 100644
--- a/platform/android/java/res/layout/downloading_expansion.xml
+++ b/platform/android/java/res/layout/downloading_expansion.xml
@@ -15,7 +15,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
- android:layout_marginLeft="5dp"
+ android:layout_marginStart="5dp"
android:layout_marginTop="10dp"
android:textStyle="bold" />
@@ -23,12 +23,11 @@
android:id="@+id/downloaderDashboard"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:layout_below="@id/statusText"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
- android:layout_height="wrap_content"
+ android:layout_height="0dp"
android:layout_weight="1" >
<TextView
@@ -36,18 +35,15 @@
style="@android:style/TextAppearance.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="5dp"
- android:text="0MB / 0MB" >
- </TextView>
+ android:layout_alignParentStart="true"
+ android:layout_marginStart="5dp" />
<TextView
android:id="@+id/progressAsPercentage"
style="@android:style/TextAppearance.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignRight="@+id/progressBar"
- android:text="0%" />
+ android:layout_alignEnd="@+id/progressBar" />
<ProgressBar
android:id="@+id/progressBar"
@@ -58,24 +54,23 @@
android:layout_marginBottom="10dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
- android:layout_marginTop="10dp"
- android:layout_weight="1" />
+ android:layout_marginTop="10dp" />
<TextView
android:id="@+id/progressAverageSpeed"
style="@android:style/TextAppearance.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_below="@+id/progressBar"
- android:layout_marginLeft="5dp" />
+ android:layout_marginStart="5dp" />
<TextView
android:id="@+id/progressTimeRemaining"
style="@android:style/TextAppearance.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignRight="@+id/progressBar"
+ android:layout_alignEnd="@+id/progressBar"
android:layout_below="@+id/progressBar" />
</RelativeLayout>
@@ -86,33 +81,35 @@
android:orientation="horizontal" >
<Button
- android:id="@+id/pauseButton"
+ android:id="@+id/cancelButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginBottom="10dp"
- android:layout_marginLeft="10dp"
+ android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginTop="10dp"
android:layout_weight="0"
android:minHeight="40dp"
android:minWidth="94dp"
- android:text="@string/text_button_pause" />
+ android:text="@string/text_button_cancel"
+ android:visibility="gone"
+ style="?android:attr/buttonBarButtonStyle" />
<Button
- android:id="@+id/cancelButton"
+ android:id="@+id/pauseButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginBottom="10dp"
- android:layout_marginLeft="5dp"
- android:layout_marginRight="5dp"
+ android:layout_marginStart="10dp"
+ android:layout_marginEnd="5dp"
android:layout_marginTop="10dp"
android:layout_weight="0"
android:minHeight="40dp"
android:minWidth="94dp"
- android:text="@string/text_button_cancel"
- android:visibility="gone" />
+ android:text="@string/text_button_pause"
+ style="?android:attr/buttonBarButtonStyle" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
@@ -151,7 +148,8 @@
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="10dp"
- android:text="@string/text_button_resume_cellular" />
+ android:text="@string/text_button_resume_cellular"
+ style="?android:attr/buttonBarButtonStyle" />
<Button
android:id="@+id/wifiSettingsButton"
@@ -159,7 +157,8 @@
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="10dp"
- android:text="@string/text_button_wifi_settings" />
+ android:text="@string/text_button_wifi_settings"
+ style="?android:attr/buttonBarButtonStyle" />
</LinearLayout>
</LinearLayout>
diff --git a/platform/android/java/res/layout/status_bar_ongoing_event_progress_bar.xml b/platform/android/java/res/layout/status_bar_ongoing_event_progress_bar.xml
index 23bac02294..fae1faeb60 100644
--- a/platform/android/java/res/layout/status_bar_ongoing_event_progress_bar.xml
+++ b/platform/android/java/res/layout/status_bar_ongoing_event_progress_bar.xml
@@ -17,7 +17,8 @@
*/
-->
-<LinearLayout android:layout_width="match_parent"
+<LinearLayout xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
android:layout_height="match_parent"
android:baselineAligned="false"
android:orientation="horizontal" android:id="@+id/notificationLayout" xmlns:android="http://schemas.android.com/apk/res/android">
@@ -32,17 +33,18 @@
android:id="@+id/appIcon"
android:layout_width="fill_parent"
android:layout_height="25dp"
- android:scaleType="centerInside"
- android:layout_alignParentLeft="true"
- android:layout_alignParentTop="true"
- android:src="@android:drawable/stat_sys_download" />
+ android:scaleType="centerInside"
+ android:layout_alignParentStart="true"
+ android:layout_alignParentTop="true"
+ android:src="@android:drawable/stat_sys_download"
+ android:contentDescription="@string/godot_project_name_string" />
<TextView
android:id="@+id/progress_text"
style="@style/NotificationText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_alignParentBottom="true"
android:layout_gravity="center_horizontal"
android:singleLine="true"
@@ -56,15 +58,16 @@
android:clickable="true"
android:focusable="true"
android:paddingTop="10dp"
- android:paddingRight="8dp"
- android:paddingBottom="8dp" >
+ android:paddingEnd="8dp"
+ android:paddingBottom="8dp"
+ tools:ignore="RtlSymmetry">
<TextView
android:id="@+id/title"
style="@style/NotificationTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:singleLine="true"/>
<TextView
@@ -72,8 +75,9 @@
style="@style/NotificationText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:singleLine="true"/>
+ android:layout_alignParentEnd="true"
+ android:singleLine="true"
+ tools:ignore="RelativeOverlap" />
<!-- Only one of progress_bar and paused_text will be visible. -->
<FrameLayout
@@ -87,7 +91,7 @@
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:paddingRight="25dp" />
+ android:paddingEnd="25dp" />
<TextView
android:id="@+id/description"
@@ -95,7 +99,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
- android:paddingRight="25dp"
+ android:paddingEnd="25dp"
android:singleLine="true" />
</FrameLayout>
diff --git a/platform/android/java/res/values-ko/strings.xml b/platform/android/java/res/values-ko/strings.xml
index b997b934b2..fab0bdd753 100644
--- a/platform/android/java/res/values-ko/strings.xml
+++ b/platform/android/java/res/values-ko/strings.xml
@@ -30,7 +30,7 @@
<string name="notification_download_failed">다운로드 실패</string>
- <string name="state_unknown">시작중...</string>
+ <string name="state_unknown">시작중…</string>
<string name="state_idle">다운로드 ì‹œìž‘ì„ ê¸°ë‹¤ë¦¬ëŠ” 중</string>
<string name="state_fetching_url">다운로드할 í•­ëª©ì„ ì°¾ëŠ” 중</string>
<string name="state_connecting">다운로드 ì„œë²„ì— ì—°ê²° 중</string>
diff --git a/platform/android/java/res/values-v11/styles.xml b/platform/android/java/res/values-v11/styles.xml
deleted file mode 100644
index f2013bc0bf..0000000000
--- a/platform/android/java/res/values-v11/styles.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
- <style name="NotificationTextSecondary" parent="NotificationText">
- <item name="android:textSize">12sp</item>
- </style>
-</resources> \ No newline at end of file
diff --git a/platform/android/java/res/values-v9/styles.xml b/platform/android/java/res/values-v9/styles.xml
deleted file mode 100644
index 736e77a5d6..0000000000
--- a/platform/android/java/res/values-v9/styles.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
- <style name="NotificationText" parent="android:TextAppearance.StatusBar.EventContent" />
- <style name="NotificationTitle" parent="android:TextAppearance.StatusBar.EventContent.Title" />
-</resources> \ No newline at end of file
diff --git a/platform/android/java/res/values/strings.xml b/platform/android/java/res/values/strings.xml
index f0ea56148f..a1b81a6186 100644
--- a/platform/android/java/res/values/strings.xml
+++ b/platform/android/java/res/values/strings.xml
@@ -30,7 +30,7 @@
<string name="notification_download_failed">Download unsuccessful</string>
- <string name="state_unknown">Starting...</string>
+ <string name="state_unknown">Starting…</string>
<string name="state_idle">Waiting for download to start</string>
<string name="state_fetching_url">Looking for resources to download</string>
<string name="state_connecting">Connecting to the download server</string>
diff --git a/platform/android/java/src/com/android/vending/licensing/AESObfuscator.java b/platform/android/java/src/com/android/vending/licensing/AESObfuscator.java
deleted file mode 100644
index ee12c68deb..0000000000
--- a/platform/android/java/src/com/android/vending/licensing/AESObfuscator.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.android.vending.licensing;
-
-import com.google.android.vending.licensing.util.Base64;
-import com.google.android.vending.licensing.util.Base64DecoderException;
-
-import java.io.UnsupportedEncodingException;
-import java.security.GeneralSecurityException;
-import java.security.spec.KeySpec;
-
-import javax.crypto.BadPaddingException;
-import javax.crypto.Cipher;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.SecretKey;
-import javax.crypto.SecretKeyFactory;
-import javax.crypto.spec.IvParameterSpec;
-import javax.crypto.spec.PBEKeySpec;
-import javax.crypto.spec.SecretKeySpec;
-
-/**
- * An Obfuscator that uses AES to encrypt data.
- */
-public class AESObfuscator implements Obfuscator {
- private static final String UTF8 = "UTF-8";
- private static final String KEYGEN_ALGORITHM = "PBEWITHSHAAND256BITAES-CBC-BC";
- private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
- private static final byte[] IV =
- { 16, 74, 71, -80, 32, 101, -47, 72, 117, -14, 0, -29, 70, 65, -12, 74 };
- private static final String header = "com.android.vending.licensing.AESObfuscator-1|";
-
- private Cipher mEncryptor;
- private Cipher mDecryptor;
-
- /**
- * @param salt an array of random bytes to use for each (un)obfuscation
- * @param applicationId application identifier, e.g. the package name
- * @param deviceId device identifier. Use as many sources as possible to
- * create this unique identifier.
- */
- public AESObfuscator(byte[] salt, String applicationId, String deviceId) {
- try {
- SecretKeyFactory factory = SecretKeyFactory.getInstance(KEYGEN_ALGORITHM);
- KeySpec keySpec =
- new PBEKeySpec((applicationId + deviceId).toCharArray(), salt, 1024, 256);
- SecretKey tmp = factory.generateSecret(keySpec);
- SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
- mEncryptor = Cipher.getInstance(CIPHER_ALGORITHM);
- mEncryptor.init(Cipher.ENCRYPT_MODE, secret, new IvParameterSpec(IV));
- mDecryptor = Cipher.getInstance(CIPHER_ALGORITHM);
- mDecryptor.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(IV));
- } catch (GeneralSecurityException e) {
- // This can't happen on a compatible Android device.
- throw new RuntimeException("Invalid environment", e);
- }
- }
-
- public String obfuscate(String original, String key) {
- if (original == null) {
- return null;
- }
- try {
- // Header is appended as an integrity check
- return Base64.encode(mEncryptor.doFinal((header + key + original).getBytes(UTF8)));
- } catch (UnsupportedEncodingException e) {
- throw new RuntimeException("Invalid environment", e);
- } catch (GeneralSecurityException e) {
- throw new RuntimeException("Invalid environment", e);
- }
- }
-
- public String unobfuscate(String obfuscated, String key) throws ValidationException {
- if (obfuscated == null) {
- return null;
- }
- try {
- String result = new String(mDecryptor.doFinal(Base64.decode(obfuscated)), UTF8);
- // Check for presence of header. This serves as a final integrity check, for cases
- // where the block size is correct during decryption.
- int headerIndex = result.indexOf(header+key);
- if (headerIndex != 0) {
- throw new ValidationException("Header not found (invalid data or key)" + ":" +
- obfuscated);
- }
- return result.substring(header.length()+key.length(), result.length());
- } catch (Base64DecoderException e) {
- throw new ValidationException(e.getMessage() + ":" + obfuscated);
- } catch (IllegalBlockSizeException e) {
- throw new ValidationException(e.getMessage() + ":" + obfuscated);
- } catch (BadPaddingException e) {
- throw new ValidationException(e.getMessage() + ":" + obfuscated);
- } catch (UnsupportedEncodingException e) {
- throw new RuntimeException("Invalid environment", e);
- }
- }
-}
diff --git a/platform/android/java/src/com/android/vending/licensing/APKExpansionPolicy.java b/platform/android/java/src/com/android/vending/licensing/APKExpansionPolicy.java
deleted file mode 100644
index 17cc7a7cfd..0000000000
--- a/platform/android/java/src/com/android/vending/licensing/APKExpansionPolicy.java
+++ /dev/null
@@ -1,397 +0,0 @@
-
-package com.google.android.vending.licensing;
-
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import org.apache.http.NameValuePair;
-import org.apache.http.client.utils.URLEncodedUtils;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.util.Log;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.Vector;
-
-/**
- * Default policy. All policy decisions are based off of response data received
- * from the licensing service. Specifically, the licensing server sends the
- * following information: response validity period, error retry period, and
- * error retry count.
- * <p>
- * These values will vary based on the the way the application is configured in
- * the Android Market publishing console, such as whether the application is
- * marked as free or is within its refund period, as well as how often an
- * application is checking with the licensing service.
- * <p>
- * Developers who need more fine grained control over their application's
- * licensing policy should implement a custom Policy.
- */
-public class APKExpansionPolicy implements Policy {
-
- private static final String TAG = "APKExpansionPolicy";
- private static final String PREFS_FILE = "com.android.vending.licensing.APKExpansionPolicy";
- private static final String PREF_LAST_RESPONSE = "lastResponse";
- private static final String PREF_VALIDITY_TIMESTAMP = "validityTimestamp";
- private static final String PREF_RETRY_UNTIL = "retryUntil";
- private static final String PREF_MAX_RETRIES = "maxRetries";
- private static final String PREF_RETRY_COUNT = "retryCount";
- private static final String DEFAULT_VALIDITY_TIMESTAMP = "0";
- private static final String DEFAULT_RETRY_UNTIL = "0";
- private static final String DEFAULT_MAX_RETRIES = "0";
- private static final String DEFAULT_RETRY_COUNT = "0";
-
- private static final long MILLIS_PER_MINUTE = 60 * 1000;
-
- private long mValidityTimestamp;
- private long mRetryUntil;
- private long mMaxRetries;
- private long mRetryCount;
- private long mLastResponseTime = 0;
- private int mLastResponse;
- private PreferenceObfuscator mPreferences;
- private Vector<String> mExpansionURLs = new Vector<String>();
- private Vector<String> mExpansionFileNames = new Vector<String>();
- private Vector<Long> mExpansionFileSizes = new Vector<Long>();
-
- /**
- * The design of the protocol supports n files. Currently the market can
- * only deliver two files. To accommodate this, we have these two constants,
- * but the order is the only relevant thing here.
- */
- public static final int MAIN_FILE_URL_INDEX = 0;
- public static final int PATCH_FILE_URL_INDEX = 1;
-
- /**
- * @param context The context for the current application
- * @param obfuscator An obfuscator to be used with preferences.
- */
- public APKExpansionPolicy(Context context, Obfuscator obfuscator) {
- // Import old values
- SharedPreferences sp = context.getSharedPreferences(PREFS_FILE, Context.MODE_PRIVATE);
- mPreferences = new PreferenceObfuscator(sp, obfuscator);
- mLastResponse = Integer.parseInt(
- mPreferences.getString(PREF_LAST_RESPONSE, Integer.toString(Policy.RETRY)));
- mValidityTimestamp = Long.parseLong(mPreferences.getString(PREF_VALIDITY_TIMESTAMP,
- DEFAULT_VALIDITY_TIMESTAMP));
- mRetryUntil = Long.parseLong(mPreferences.getString(PREF_RETRY_UNTIL, DEFAULT_RETRY_UNTIL));
- mMaxRetries = Long.parseLong(mPreferences.getString(PREF_MAX_RETRIES, DEFAULT_MAX_RETRIES));
- mRetryCount = Long.parseLong(mPreferences.getString(PREF_RETRY_COUNT, DEFAULT_RETRY_COUNT));
- }
-
- /**
- * We call this to guarantee that we fetch a fresh policy from the server.
- * This is to be used if the URL is invalid.
- */
- public void resetPolicy() {
- mPreferences.putString(PREF_LAST_RESPONSE, Integer.toString(Policy.RETRY));
- setRetryUntil(DEFAULT_RETRY_UNTIL);
- setMaxRetries(DEFAULT_MAX_RETRIES);
- setRetryCount(Long.parseLong(DEFAULT_RETRY_COUNT));
- setValidityTimestamp(DEFAULT_VALIDITY_TIMESTAMP);
- mPreferences.commit();
- }
-
- /**
- * Process a new response from the license server.
- * <p>
- * This data will be used for computing future policy decisions. The
- * following parameters are processed:
- * <ul>
- * <li>VT: the timestamp that the client should consider the response valid
- * until
- * <li>GT: the timestamp that the client should ignore retry errors until
- * <li>GR: the number of retry errors that the client should ignore
- * </ul>
- *
- * @param response the result from validating the server response
- * @param rawData the raw server response data
- */
- public void processServerResponse(int response,
- com.google.android.vending.licensing.ResponseData rawData) {
-
- // Update retry counter
- if (response != Policy.RETRY) {
- setRetryCount(0);
- } else {
- setRetryCount(mRetryCount + 1);
- }
-
- if (response == Policy.LICENSED) {
- // Update server policy data
- Map<String, String> extras = decodeExtras(rawData.extra);
- mLastResponse = response;
- setValidityTimestamp(Long.toString(System.currentTimeMillis() + MILLIS_PER_MINUTE));
- Set<String> keys = extras.keySet();
- for (String key : keys) {
- if (key.equals("VT")) {
- setValidityTimestamp(extras.get(key));
- } else if (key.equals("GT")) {
- setRetryUntil(extras.get(key));
- } else if (key.equals("GR")) {
- setMaxRetries(extras.get(key));
- } else if (key.startsWith("FILE_URL")) {
- int index = Integer.parseInt(key.substring("FILE_URL".length())) - 1;
- setExpansionURL(index, extras.get(key));
- } else if (key.startsWith("FILE_NAME")) {
- int index = Integer.parseInt(key.substring("FILE_NAME".length())) - 1;
- setExpansionFileName(index, extras.get(key));
- } else if (key.startsWith("FILE_SIZE")) {
- int index = Integer.parseInt(key.substring("FILE_SIZE".length())) - 1;
- setExpansionFileSize(index, Long.parseLong(extras.get(key)));
- }
- }
- } else if (response == Policy.NOT_LICENSED) {
- // Clear out stale policy data
- setValidityTimestamp(DEFAULT_VALIDITY_TIMESTAMP);
- setRetryUntil(DEFAULT_RETRY_UNTIL);
- setMaxRetries(DEFAULT_MAX_RETRIES);
- }
-
- setLastResponse(response);
- mPreferences.commit();
- }
-
- /**
- * Set the last license response received from the server and add to
- * preferences. You must manually call PreferenceObfuscator.commit() to
- * commit these changes to disk.
- *
- * @param l the response
- */
- private void setLastResponse(int l) {
- mLastResponseTime = System.currentTimeMillis();
- mLastResponse = l;
- mPreferences.putString(PREF_LAST_RESPONSE, Integer.toString(l));
- }
-
- /**
- * Set the current retry count and add to preferences. You must manually
- * call PreferenceObfuscator.commit() to commit these changes to disk.
- *
- * @param c the new retry count
- */
- private void setRetryCount(long c) {
- mRetryCount = c;
- mPreferences.putString(PREF_RETRY_COUNT, Long.toString(c));
- }
-
- public long getRetryCount() {
- return mRetryCount;
- }
-
- /**
- * Set the last validity timestamp (VT) received from the server and add to
- * preferences. You must manually call PreferenceObfuscator.commit() to
- * commit these changes to disk.
- *
- * @param validityTimestamp the VT string received
- */
- private void setValidityTimestamp(String validityTimestamp) {
- Long lValidityTimestamp;
- try {
- lValidityTimestamp = Long.parseLong(validityTimestamp);
- } catch (NumberFormatException e) {
- // No response or not parseable, expire in one minute.
- Log.w(TAG, "License validity timestamp (VT) missing, caching for a minute");
- lValidityTimestamp = System.currentTimeMillis() + MILLIS_PER_MINUTE;
- validityTimestamp = Long.toString(lValidityTimestamp);
- }
-
- mValidityTimestamp = lValidityTimestamp;
- mPreferences.putString(PREF_VALIDITY_TIMESTAMP, validityTimestamp);
- }
-
- public long getValidityTimestamp() {
- return mValidityTimestamp;
- }
-
- /**
- * Set the retry until timestamp (GT) received from the server and add to
- * preferences. You must manually call PreferenceObfuscator.commit() to
- * commit these changes to disk.
- *
- * @param retryUntil the GT string received
- */
- private void setRetryUntil(String retryUntil) {
- Long lRetryUntil;
- try {
- lRetryUntil = Long.parseLong(retryUntil);
- } catch (NumberFormatException e) {
- // No response or not parseable, expire immediately
- Log.w(TAG, "License retry timestamp (GT) missing, grace period disabled");
- retryUntil = "0";
- lRetryUntil = 0l;
- }
-
- mRetryUntil = lRetryUntil;
- mPreferences.putString(PREF_RETRY_UNTIL, retryUntil);
- }
-
- public long getRetryUntil() {
- return mRetryUntil;
- }
-
- /**
- * Set the max retries value (GR) as received from the server and add to
- * preferences. You must manually call PreferenceObfuscator.commit() to
- * commit these changes to disk.
- *
- * @param maxRetries the GR string received
- */
- private void setMaxRetries(String maxRetries) {
- Long lMaxRetries;
- try {
- lMaxRetries = Long.parseLong(maxRetries);
- } catch (NumberFormatException e) {
- // No response or not parseable, expire immediately
- Log.w(TAG, "Licence retry count (GR) missing, grace period disabled");
- maxRetries = "0";
- lMaxRetries = 0l;
- }
-
- mMaxRetries = lMaxRetries;
- mPreferences.putString(PREF_MAX_RETRIES, maxRetries);
- }
-
- public long getMaxRetries() {
- return mMaxRetries;
- }
-
- /**
- * Gets the count of expansion URLs. Since expansionURLs are not committed
- * to preferences, this will return zero if there has been no LVL fetch
- * in the current session.
- *
- * @return the number of expansion URLs. (0,1,2)
- */
- public int getExpansionURLCount() {
- return mExpansionURLs.size();
- }
-
- /**
- * Gets the expansion URL. Since these URLs are not committed to
- * preferences, this will always return null if there has not been an LVL
- * fetch in the current session.
- *
- * @param index the index of the URL to fetch. This value will be either
- * MAIN_FILE_URL_INDEX or PATCH_FILE_URL_INDEX
- * @param URL the URL to set
- */
- public String getExpansionURL(int index) {
- if (index < mExpansionURLs.size()) {
- return mExpansionURLs.elementAt(index);
- }
- return null;
- }
-
- /**
- * Sets the expansion URL. Expansion URL's are not committed to preferences,
- * but are instead intended to be stored when the license response is
- * processed by the front-end.
- *
- * @param index the index of the expansion URL. This value will be either
- * MAIN_FILE_URL_INDEX or PATCH_FILE_URL_INDEX
- * @param URL the URL to set
- */
- public void setExpansionURL(int index, String URL) {
- if (index >= mExpansionURLs.size()) {
- mExpansionURLs.setSize(index + 1);
- }
- mExpansionURLs.set(index, URL);
- }
-
- public String getExpansionFileName(int index) {
- if (index < mExpansionFileNames.size()) {
- return mExpansionFileNames.elementAt(index);
- }
- return null;
- }
-
- public void setExpansionFileName(int index, String name) {
- if (index >= mExpansionFileNames.size()) {
- mExpansionFileNames.setSize(index + 1);
- }
- mExpansionFileNames.set(index, name);
- }
-
- public long getExpansionFileSize(int index) {
- if (index < mExpansionFileSizes.size()) {
- return mExpansionFileSizes.elementAt(index);
- }
- return -1;
- }
-
- public void setExpansionFileSize(int index, long size) {
- if (index >= mExpansionFileSizes.size()) {
- mExpansionFileSizes.setSize(index + 1);
- }
- mExpansionFileSizes.set(index, size);
- }
-
- /**
- * {@inheritDoc} This implementation allows access if either:<br>
- * <ol>
- * <li>a LICENSED response was received within the validity period
- * <li>a RETRY response was received in the last minute, and we are under
- * the RETRY count or in the RETRY period.
- * </ol>
- */
- public boolean allowAccess() {
- long ts = System.currentTimeMillis();
- if (mLastResponse == Policy.LICENSED) {
- // Check if the LICENSED response occurred within the validity
- // timeout.
- if (ts <= mValidityTimestamp) {
- // Cached LICENSED response is still valid.
- return true;
- }
- } else if (mLastResponse == Policy.RETRY &&
- ts < mLastResponseTime + MILLIS_PER_MINUTE) {
- // Only allow access if we are within the retry period or we haven't
- // used up our
- // max retries.
- return (ts <= mRetryUntil || mRetryCount <= mMaxRetries);
- }
- return false;
- }
-
- private Map<String, String> decodeExtras(String extras) {
- Map<String, String> results = new HashMap<String, String>();
- try {
- URI rawExtras = new URI("?" + extras);
- List<NameValuePair> extraList = URLEncodedUtils.parse(rawExtras, "UTF-8");
- for (NameValuePair item : extraList) {
- String name = item.getName();
- int i = 0;
- while (results.containsKey(name)) {
- name = item.getName() + ++i;
- }
- results.put(name, item.getValue());
- }
- } catch (URISyntaxException e) {
- Log.w(TAG, "Invalid syntax error while decoding extras data from server.");
- }
- return results;
- }
-
-}
diff --git a/platform/android/java/src/com/android/vending/licensing/ILicenseResultListener.java b/platform/android/java/src/com/android/vending/licensing/ILicenseResultListener.java
deleted file mode 100644
index 63720999a7..0000000000
--- a/platform/android/java/src/com/android/vending/licensing/ILicenseResultListener.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
-*/
-
-/*
- * This file is auto-generated. DO NOT MODIFY.
- * Original file: aidl/ILicenseResultListener.aidl
- */
-package com.google.android.vending.licensing;
-import java.lang.String;
-import android.os.RemoteException;
-import android.os.IBinder;
-import android.os.IInterface;
-import android.os.Binder;
-import android.os.Parcel;
-public interface ILicenseResultListener extends android.os.IInterface
-{
-/** Local-side IPC implementation stub class. */
-public static abstract class Stub extends android.os.Binder implements com.google.android.vending.licensing.ILicenseResultListener
-{
-private static final java.lang.String DESCRIPTOR = "com.android.vending.licensing.ILicenseResultListener";
-/** Construct the stub at attach it to the interface. */
-public Stub()
-{
-this.attachInterface(this, DESCRIPTOR);
-}
-/**
- * Cast an IBinder object into an ILicenseResultListener interface,
- * generating a proxy if needed.
- */
-public static com.google.android.vending.licensing.ILicenseResultListener asInterface(android.os.IBinder obj)
-{
-if ((obj==null)) {
-return null;
-}
-android.os.IInterface iin = (android.os.IInterface)obj.queryLocalInterface(DESCRIPTOR);
-if (((iin!=null)&&(iin instanceof com.google.android.vending.licensing.ILicenseResultListener))) {
-return ((com.google.android.vending.licensing.ILicenseResultListener)iin);
-}
-return new com.google.android.vending.licensing.ILicenseResultListener.Stub.Proxy(obj);
-}
-public android.os.IBinder asBinder()
-{
-return this;
-}
-public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
-{
-switch (code)
-{
-case INTERFACE_TRANSACTION:
-{
-reply.writeString(DESCRIPTOR);
-return true;
-}
-case TRANSACTION_verifyLicense:
-{
-data.enforceInterface(DESCRIPTOR);
-int _arg0;
-_arg0 = data.readInt();
-java.lang.String _arg1;
-_arg1 = data.readString();
-java.lang.String _arg2;
-_arg2 = data.readString();
-this.verifyLicense(_arg0, _arg1, _arg2);
-return true;
-}
-}
-return super.onTransact(code, data, reply, flags);
-}
-private static class Proxy implements com.google.android.vending.licensing.ILicenseResultListener
-{
-private android.os.IBinder mRemote;
-Proxy(android.os.IBinder remote)
-{
-mRemote = remote;
-}
-public android.os.IBinder asBinder()
-{
-return mRemote;
-}
-public java.lang.String getInterfaceDescriptor()
-{
-return DESCRIPTOR;
-}
-public void verifyLicense(int responseCode, java.lang.String signedData, java.lang.String signature) throws android.os.RemoteException
-{
-android.os.Parcel _data = android.os.Parcel.obtain();
-try {
-_data.writeInterfaceToken(DESCRIPTOR);
-_data.writeInt(responseCode);
-_data.writeString(signedData);
-_data.writeString(signature);
-mRemote.transact(Stub.TRANSACTION_verifyLicense, _data, null, IBinder.FLAG_ONEWAY);
-}
-finally {
-_data.recycle();
-}
-}
-}
-static final int TRANSACTION_verifyLicense = (IBinder.FIRST_CALL_TRANSACTION + 0);
-}
-public void verifyLicense(int responseCode, java.lang.String signedData, java.lang.String signature) throws android.os.RemoteException;
-}
diff --git a/platform/android/java/src/com/android/vending/licensing/ILicensingService.java b/platform/android/java/src/com/android/vending/licensing/ILicensingService.java
deleted file mode 100644
index 36afc0537d..0000000000
--- a/platform/android/java/src/com/android/vending/licensing/ILicensingService.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
-*/
-
-/*
- * This file is auto-generated. DO NOT MODIFY.
- * Original file: aidl/ILicensingService.aidl
- */
-package com.google.android.vending.licensing;
-import java.lang.String;
-import android.os.RemoteException;
-import android.os.IBinder;
-import android.os.IInterface;
-import android.os.Binder;
-import android.os.Parcel;
-public interface ILicensingService extends android.os.IInterface
-{
-/** Local-side IPC implementation stub class. */
-public static abstract class Stub extends android.os.Binder implements com.google.android.vending.licensing.ILicensingService
-{
-private static final java.lang.String DESCRIPTOR = "com.android.vending.licensing.ILicensingService";
-/** Construct the stub at attach it to the interface. */
-public Stub()
-{
-this.attachInterface(this, DESCRIPTOR);
-}
-/**
- * Cast an IBinder object into an ILicensingService interface,
- * generating a proxy if needed.
- */
-public static com.google.android.vending.licensing.ILicensingService asInterface(android.os.IBinder obj)
-{
-if ((obj==null)) {
-return null;
-}
-android.os.IInterface iin = (android.os.IInterface)obj.queryLocalInterface(DESCRIPTOR);
-if (((iin!=null)&&(iin instanceof com.google.android.vending.licensing.ILicensingService))) {
-return ((com.google.android.vending.licensing.ILicensingService)iin);
-}
-return new com.google.android.vending.licensing.ILicensingService.Stub.Proxy(obj);
-}
-public android.os.IBinder asBinder()
-{
-return this;
-}
-public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
-{
-switch (code)
-{
-case INTERFACE_TRANSACTION:
-{
-reply.writeString(DESCRIPTOR);
-return true;
-}
-case TRANSACTION_checkLicense:
-{
-data.enforceInterface(DESCRIPTOR);
-long _arg0;
-_arg0 = data.readLong();
-java.lang.String _arg1;
-_arg1 = data.readString();
-com.google.android.vending.licensing.ILicenseResultListener _arg2;
-_arg2 = com.google.android.vending.licensing.ILicenseResultListener.Stub.asInterface(data.readStrongBinder());
-this.checkLicense(_arg0, _arg1, _arg2);
-return true;
-}
-}
-return super.onTransact(code, data, reply, flags);
-}
-private static class Proxy implements com.google.android.vending.licensing.ILicensingService
-{
-private android.os.IBinder mRemote;
-Proxy(android.os.IBinder remote)
-{
-mRemote = remote;
-}
-public android.os.IBinder asBinder()
-{
-return mRemote;
-}
-public java.lang.String getInterfaceDescriptor()
-{
-return DESCRIPTOR;
-}
-public void checkLicense(long nonce, java.lang.String packageName, com.google.android.vending.licensing.ILicenseResultListener listener) throws android.os.RemoteException
-{
-android.os.Parcel _data = android.os.Parcel.obtain();
-try {
-_data.writeInterfaceToken(DESCRIPTOR);
-_data.writeLong(nonce);
-_data.writeString(packageName);
-_data.writeStrongBinder((((listener!=null))?(listener.asBinder()):(null)));
-mRemote.transact(Stub.TRANSACTION_checkLicense, _data, null, IBinder.FLAG_ONEWAY);
-}
-finally {
-_data.recycle();
-}
-}
-}
-static final int TRANSACTION_checkLicense = (IBinder.FIRST_CALL_TRANSACTION + 0);
-}
-public void checkLicense(long nonce, java.lang.String packageName, com.google.android.vending.licensing.ILicenseResultListener listener) throws android.os.RemoteException;
-}
diff --git a/platform/android/java/src/com/android/vending/licensing/LicenseChecker.java b/platform/android/java/src/com/android/vending/licensing/LicenseChecker.java
deleted file mode 100644
index 531cb22f8c..0000000000
--- a/platform/android/java/src/com/android/vending/licensing/LicenseChecker.java
+++ /dev/null
@@ -1,351 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.android.vending.licensing;
-
-import com.google.android.vending.licensing.util.Base64;
-import com.google.android.vending.licensing.util.Base64DecoderException;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.provider.Settings.Secure;
-import android.util.Log;
-
-import java.security.KeyFactory;
-import java.security.NoSuchAlgorithmException;
-import java.security.PublicKey;
-import java.security.SecureRandom;
-import java.security.spec.InvalidKeySpecException;
-import java.security.spec.X509EncodedKeySpec;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.Queue;
-import java.util.Set;
-
-/**
- * Client library for Android Market license verifications.
- * <p>
- * The LicenseChecker is configured via a {@link Policy} which contains the
- * logic to determine whether a user should have access to the application. For
- * example, the Policy can define a threshold for allowable number of server or
- * client failures before the library reports the user as not having access.
- * <p>
- * Must also provide the Base64-encoded RSA public key associated with your
- * developer account. The public key is obtainable from the publisher site.
- */
-public class LicenseChecker implements ServiceConnection {
- private static final String TAG = "LicenseChecker";
-
- private static final String KEY_FACTORY_ALGORITHM = "RSA";
-
- // Timeout value (in milliseconds) for calls to service.
- private static final int TIMEOUT_MS = 10 * 1000;
-
- private static final SecureRandom RANDOM = new SecureRandom();
- private static final boolean DEBUG_LICENSE_ERROR = false;
-
- private ILicensingService mService;
-
- private PublicKey mPublicKey;
- private final Context mContext;
- private final Policy mPolicy;
- /**
- * A handler for running tasks on a background thread. We don't want license
- * processing to block the UI thread.
- */
- private Handler mHandler;
- private final String mPackageName;
- private final String mVersionCode;
- private final Set<LicenseValidator> mChecksInProgress = new HashSet<LicenseValidator>();
- private final Queue<LicenseValidator> mPendingChecks = new LinkedList<LicenseValidator>();
-
- /**
- * @param context a Context
- * @param policy implementation of Policy
- * @param encodedPublicKey Base64-encoded RSA public key
- * @throws IllegalArgumentException if encodedPublicKey is invalid
- */
- public LicenseChecker(Context context, Policy policy, String encodedPublicKey) {
- mContext = context;
- mPolicy = policy;
- mPublicKey = generatePublicKey(encodedPublicKey);
- mPackageName = mContext.getPackageName();
- mVersionCode = getVersionCode(context, mPackageName);
- HandlerThread handlerThread = new HandlerThread("background thread");
- handlerThread.start();
- mHandler = new Handler(handlerThread.getLooper());
- }
-
- /**
- * Generates a PublicKey instance from a string containing the
- * Base64-encoded public key.
- *
- * @param encodedPublicKey Base64-encoded public key
- * @throws IllegalArgumentException if encodedPublicKey is invalid
- */
- private static PublicKey generatePublicKey(String encodedPublicKey) {
- try {
- byte[] decodedKey = Base64.decode(encodedPublicKey);
- KeyFactory keyFactory = KeyFactory.getInstance(KEY_FACTORY_ALGORITHM);
-
- return keyFactory.generatePublic(new X509EncodedKeySpec(decodedKey));
- } catch (NoSuchAlgorithmException e) {
- // This won't happen in an Android-compatible environment.
- throw new RuntimeException(e);
- } catch (Base64DecoderException e) {
- Log.e(TAG, "Could not decode from Base64.");
- throw new IllegalArgumentException(e);
- } catch (InvalidKeySpecException e) {
- Log.e(TAG, "Invalid key specification.");
- throw new IllegalArgumentException(e);
- }
- }
-
- /**
- * Checks if the user should have access to the app. Binds the service if necessary.
- * <p>
- * NOTE: This call uses a trivially obfuscated string (base64-encoded). For best security,
- * we recommend obfuscating the string that is passed into bindService using another method
- * of your own devising.
- * <p>
- * source string: "com.android.vending.licensing.ILicensingService"
- * <p>
- * @param callback
- */
- public synchronized void checkAccess(LicenseCheckerCallback callback) {
- // If we have a valid recent LICENSED response, we can skip asking
- // Market.
- if (mPolicy.allowAccess()) {
- Log.i(TAG, "Using cached license response");
- callback.allow(Policy.LICENSED);
- } else {
- LicenseValidator validator = new LicenseValidator(mPolicy, new NullDeviceLimiter(),
- callback, generateNonce(), mPackageName, mVersionCode);
-
- if (mService == null) {
- Log.i(TAG, "Binding to licensing service.");
- try {
- Intent serviceIntent = new Intent(new String(Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U=")));
- serviceIntent.setPackage("com.android.vending");
- boolean bindResult = mContext
- .bindService(
- serviceIntent,
- this, // ServiceConnection.
- Context.BIND_AUTO_CREATE);
-
- if (bindResult) {
- mPendingChecks.offer(validator);
- } else {
- Log.e(TAG, "Could not bind to service.");
- handleServiceConnectionError(validator);
- }
- } catch (SecurityException e) {
- callback.applicationError(LicenseCheckerCallback.ERROR_MISSING_PERMISSION);
- } catch (Base64DecoderException e) {
- e.printStackTrace();
- }
- } else {
- mPendingChecks.offer(validator);
- runChecks();
- }
- }
- }
-
- private void runChecks() {
- LicenseValidator validator;
- while ((validator = mPendingChecks.poll()) != null) {
- try {
- Log.i(TAG, "Calling checkLicense on service for " + validator.getPackageName());
- mService.checkLicense(
- validator.getNonce(), validator.getPackageName(),
- new ResultListener(validator));
- mChecksInProgress.add(validator);
- } catch (RemoteException e) {
- Log.w(TAG, "RemoteException in checkLicense call.", e);
- handleServiceConnectionError(validator);
- }
- }
- }
-
- private synchronized void finishCheck(LicenseValidator validator) {
- mChecksInProgress.remove(validator);
- if (mChecksInProgress.isEmpty()) {
- cleanupService();
- }
- }
-
- private class ResultListener extends ILicenseResultListener.Stub {
- private final LicenseValidator mValidator;
- private Runnable mOnTimeout;
-
- public ResultListener(LicenseValidator validator) {
- mValidator = validator;
- mOnTimeout = new Runnable() {
- public void run() {
- Log.i(TAG, "Check timed out.");
- handleServiceConnectionError(mValidator);
- finishCheck(mValidator);
- }
- };
- startTimeout();
- }
-
- private static final int ERROR_CONTACTING_SERVER = 0x101;
- private static final int ERROR_INVALID_PACKAGE_NAME = 0x102;
- private static final int ERROR_NON_MATCHING_UID = 0x103;
-
- // Runs in IPC thread pool. Post it to the Handler, so we can guarantee
- // either this or the timeout runs.
- public void verifyLicense(final int responseCode, final String signedData,
- final String signature) {
- mHandler.post(new Runnable() {
- public void run() {
- Log.i(TAG, "Received response.");
- // Make sure it hasn't already timed out.
- if (mChecksInProgress.contains(mValidator)) {
- clearTimeout();
- mValidator.verify(mPublicKey, responseCode, signedData, signature);
- finishCheck(mValidator);
- }
- if (DEBUG_LICENSE_ERROR) {
- boolean logResponse;
- String stringError = null;
- switch (responseCode) {
- case ERROR_CONTACTING_SERVER:
- logResponse = true;
- stringError = "ERROR_CONTACTING_SERVER";
- break;
- case ERROR_INVALID_PACKAGE_NAME:
- logResponse = true;
- stringError = "ERROR_INVALID_PACKAGE_NAME";
- break;
- case ERROR_NON_MATCHING_UID:
- logResponse = true;
- stringError = "ERROR_NON_MATCHING_UID";
- break;
- default:
- logResponse = false;
- }
-
- if (logResponse) {
- String android_id = Secure.getString(mContext.getContentResolver(),
- Secure.ANDROID_ID);
- Date date = new Date();
- Log.d(TAG, "Server Failure: " + stringError);
- Log.d(TAG, "Android ID: " + android_id);
- Log.d(TAG, "Time: " + date.toGMTString());
- }
- }
-
- }
- });
- }
-
- private void startTimeout() {
- Log.i(TAG, "Start monitoring timeout.");
- mHandler.postDelayed(mOnTimeout, TIMEOUT_MS);
- }
-
- private void clearTimeout() {
- Log.i(TAG, "Clearing timeout.");
- mHandler.removeCallbacks(mOnTimeout);
- }
- }
-
- public synchronized void onServiceConnected(ComponentName name, IBinder service) {
- mService = ILicensingService.Stub.asInterface(service);
- runChecks();
- }
-
- public synchronized void onServiceDisconnected(ComponentName name) {
- // Called when the connection with the service has been
- // unexpectedly disconnected. That is, Market crashed.
- // If there are any checks in progress, the timeouts will handle them.
- Log.w(TAG, "Service unexpectedly disconnected.");
- mService = null;
- }
-
- /**
- * Generates policy response for service connection errors, as a result of
- * disconnections or timeouts.
- */
- private synchronized void handleServiceConnectionError(LicenseValidator validator) {
- mPolicy.processServerResponse(Policy.RETRY, null);
-
- if (mPolicy.allowAccess()) {
- validator.getCallback().allow(Policy.RETRY);
- } else {
- validator.getCallback().dontAllow(Policy.RETRY);
- }
- }
-
- /** Unbinds service if necessary and removes reference to it. */
- private void cleanupService() {
- if (mService != null) {
- try {
- mContext.unbindService(this);
- } catch (IllegalArgumentException e) {
- // Somehow we've already been unbound. This is a non-fatal
- // error.
- Log.e(TAG, "Unable to unbind from licensing service (already unbound)");
- }
- mService = null;
- }
- }
-
- /**
- * Inform the library that the context is about to be destroyed, so that any
- * open connections can be cleaned up.
- * <p>
- * Failure to call this method can result in a crash under certain
- * circumstances, such as during screen rotation if an Activity requests the
- * license check or when the user exits the application.
- */
- public synchronized void onDestroy() {
- cleanupService();
- mHandler.getLooper().quit();
- }
-
- /** Generates a nonce (number used once). */
- private int generateNonce() {
- return RANDOM.nextInt();
- }
-
- /**
- * Get version code for the application package name.
- *
- * @param context
- * @param packageName application package name
- * @return the version code or empty string if package not found
- */
- private static String getVersionCode(Context context, String packageName) {
- try {
- return String.valueOf(context.getPackageManager().getPackageInfo(packageName, 0).
- versionCode);
- } catch (NameNotFoundException e) {
- Log.e(TAG, "Package not found. could not get version code.");
- return "";
- }
- }
-}
diff --git a/platform/android/java/src/com/android/vending/licensing/LicenseValidator.java b/platform/android/java/src/com/android/vending/licensing/LicenseValidator.java
deleted file mode 100644
index 61d3c7e79e..0000000000
--- a/platform/android/java/src/com/android/vending/licensing/LicenseValidator.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.android.vending.licensing;
-
-import com.google.android.vending.licensing.util.Base64;
-import com.google.android.vending.licensing.util.Base64DecoderException;
-
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.security.InvalidKeyException;
-import java.security.NoSuchAlgorithmException;
-import java.security.PublicKey;
-import java.security.Signature;
-import java.security.SignatureException;
-
-/**
- * Contains data related to a licensing request and methods to verify
- * and process the response.
- */
-class LicenseValidator {
- private static final String TAG = "LicenseValidator";
-
- // Server response codes.
- private static final int LICENSED = 0x0;
- private static final int NOT_LICENSED = 0x1;
- private static final int LICENSED_OLD_KEY = 0x2;
- private static final int ERROR_NOT_MARKET_MANAGED = 0x3;
- private static final int ERROR_SERVER_FAILURE = 0x4;
- private static final int ERROR_OVER_QUOTA = 0x5;
-
- private static final int ERROR_CONTACTING_SERVER = 0x101;
- private static final int ERROR_INVALID_PACKAGE_NAME = 0x102;
- private static final int ERROR_NON_MATCHING_UID = 0x103;
-
- private final Policy mPolicy;
- private final LicenseCheckerCallback mCallback;
- private final int mNonce;
- private final String mPackageName;
- private final String mVersionCode;
- private final DeviceLimiter mDeviceLimiter;
-
- LicenseValidator(Policy policy, DeviceLimiter deviceLimiter, LicenseCheckerCallback callback,
- int nonce, String packageName, String versionCode) {
- mPolicy = policy;
- mDeviceLimiter = deviceLimiter;
- mCallback = callback;
- mNonce = nonce;
- mPackageName = packageName;
- mVersionCode = versionCode;
- }
-
- public LicenseCheckerCallback getCallback() {
- return mCallback;
- }
-
- public int getNonce() {
- return mNonce;
- }
-
- public String getPackageName() {
- return mPackageName;
- }
-
- private static final String SIGNATURE_ALGORITHM = "SHA1withRSA";
-
- /**
- * Verifies the response from server and calls appropriate callback method.
- *
- * @param publicKey public key associated with the developer account
- * @param responseCode server response code
- * @param signedData signed data from server
- * @param signature server signature
- */
- public void verify(PublicKey publicKey, int responseCode, String signedData, String signature) {
- String userId = null;
- // Skip signature check for unsuccessful requests
- ResponseData data = null;
- if (responseCode == LICENSED || responseCode == NOT_LICENSED ||
- responseCode == LICENSED_OLD_KEY) {
- // Verify signature.
- try {
- Signature sig = Signature.getInstance(SIGNATURE_ALGORITHM);
- sig.initVerify(publicKey);
- sig.update(signedData.getBytes());
-
- if (!sig.verify(Base64.decode(signature))) {
- Log.e(TAG, "Signature verification failed.");
- handleInvalidResponse();
- return;
- }
- } catch (NoSuchAlgorithmException e) {
- // This can't happen on an Android compatible device.
- throw new RuntimeException(e);
- } catch (InvalidKeyException e) {
- handleApplicationError(LicenseCheckerCallback.ERROR_INVALID_PUBLIC_KEY);
- return;
- } catch (SignatureException e) {
- throw new RuntimeException(e);
- } catch (Base64DecoderException e) {
- Log.e(TAG, "Could not Base64-decode signature.");
- handleInvalidResponse();
- return;
- }
-
- // Parse and validate response.
- try {
- data = ResponseData.parse(signedData);
- } catch (IllegalArgumentException e) {
- Log.e(TAG, "Could not parse response.");
- handleInvalidResponse();
- return;
- }
-
- if (data.responseCode != responseCode) {
- Log.e(TAG, "Response codes don't match.");
- handleInvalidResponse();
- return;
- }
-
- if (data.nonce != mNonce) {
- Log.e(TAG, "Nonce doesn't match.");
- handleInvalidResponse();
- return;
- }
-
- if (!data.packageName.equals(mPackageName)) {
- Log.e(TAG, "Package name doesn't match.");
- handleInvalidResponse();
- return;
- }
-
- if (!data.versionCode.equals(mVersionCode)) {
- Log.e(TAG, "Version codes don't match.");
- handleInvalidResponse();
- return;
- }
-
- // Application-specific user identifier.
- userId = data.userId;
- if (TextUtils.isEmpty(userId)) {
- Log.e(TAG, "User identifier is empty.");
- handleInvalidResponse();
- return;
- }
- }
-
- switch (responseCode) {
- case LICENSED:
- case LICENSED_OLD_KEY:
- int limiterResponse = mDeviceLimiter.isDeviceAllowed(userId);
- handleResponse(limiterResponse, data);
- break;
- case NOT_LICENSED:
- handleResponse(Policy.NOT_LICENSED, data);
- break;
- case ERROR_CONTACTING_SERVER:
- Log.w(TAG, "Error contacting licensing server.");
- handleResponse(Policy.RETRY, data);
- break;
- case ERROR_SERVER_FAILURE:
- Log.w(TAG, "An error has occurred on the licensing server.");
- handleResponse(Policy.RETRY, data);
- break;
- case ERROR_OVER_QUOTA:
- Log.w(TAG, "Licensing server is refusing to talk to this device, over quota.");
- handleResponse(Policy.RETRY, data);
- break;
- case ERROR_INVALID_PACKAGE_NAME:
- handleApplicationError(LicenseCheckerCallback.ERROR_INVALID_PACKAGE_NAME);
- break;
- case ERROR_NON_MATCHING_UID:
- handleApplicationError(LicenseCheckerCallback.ERROR_NON_MATCHING_UID);
- break;
- case ERROR_NOT_MARKET_MANAGED:
- handleApplicationError(LicenseCheckerCallback.ERROR_NOT_MARKET_MANAGED);
- break;
- default:
- Log.e(TAG, "Unknown response code for license check.");
- handleInvalidResponse();
- }
- }
-
- /**
- * Confers with policy and calls appropriate callback method.
- *
- * @param response
- * @param rawData
- */
- private void handleResponse(int response, ResponseData rawData) {
- // Update policy data and increment retry counter (if needed)
- mPolicy.processServerResponse(response, rawData);
-
- // Given everything we know, including cached data, ask the policy if we should grant
- // access.
- if (mPolicy.allowAccess()) {
- mCallback.allow(response);
- } else {
- mCallback.dontAllow(response);
- }
- }
-
- private void handleApplicationError(int code) {
- mCallback.applicationError(code);
- }
-
- private void handleInvalidResponse() {
- mCallback.dontAllow(Policy.NOT_LICENSED);
- }
-}
diff --git a/platform/android/java/src/com/android/vending/licensing/PreferenceObfuscator.java b/platform/android/java/src/com/android/vending/licensing/PreferenceObfuscator.java
deleted file mode 100644
index 7c42bfc28a..0000000000
--- a/platform/android/java/src/com/android/vending/licensing/PreferenceObfuscator.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.android.vending.licensing;
-
-import android.content.SharedPreferences;
-import android.util.Log;
-
-/**
- * An wrapper for SharedPreferences that transparently performs data obfuscation.
- */
-public class PreferenceObfuscator {
-
- private static final String TAG = "PreferenceObfuscator";
-
- private final SharedPreferences mPreferences;
- private final Obfuscator mObfuscator;
- private SharedPreferences.Editor mEditor;
-
- /**
- * Constructor.
- *
- * @param sp A SharedPreferences instance provided by the system.
- * @param o The Obfuscator to use when reading or writing data.
- */
- public PreferenceObfuscator(SharedPreferences sp, Obfuscator o) {
- mPreferences = sp;
- mObfuscator = o;
- mEditor = null;
- }
-
- public void putString(String key, String value) {
- if (mEditor == null) {
- mEditor = mPreferences.edit();
- }
- String obfuscatedValue = mObfuscator.obfuscate(value, key);
- mEditor.putString(key, obfuscatedValue);
- }
-
- public String getString(String key, String defValue) {
- String result;
- String value = mPreferences.getString(key, null);
- if (value != null) {
- try {
- result = mObfuscator.unobfuscate(value, key);
- } catch (ValidationException e) {
- // Unable to unobfuscate, data corrupt or tampered
- Log.w(TAG, "Validation error while reading preference: " + key);
- result = defValue;
- }
- } else {
- // Preference not found
- result = defValue;
- }
- return result;
- }
-
- public void commit() {
- if (mEditor != null) {
- mEditor.commit();
- mEditor = null;
- }
- }
-}
diff --git a/platform/android/java/src/com/android/vending/licensing/ResponseData.java b/platform/android/java/src/com/android/vending/licensing/ResponseData.java
deleted file mode 100644
index 2adef3709e..0000000000
--- a/platform/android/java/src/com/android/vending/licensing/ResponseData.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.android.vending.licensing;
-
-import java.util.regex.Pattern;
-
-import android.text.TextUtils;
-
-/**
- * ResponseData from licensing server.
- */
-public class ResponseData {
-
- public int responseCode;
- public int nonce;
- public String packageName;
- public String versionCode;
- public String userId;
- public long timestamp;
- /** Response-specific data. */
- public String extra;
-
- /**
- * Parses response string into ResponseData.
- *
- * @param responseData response data string
- * @throws IllegalArgumentException upon parsing error
- * @return ResponseData object
- */
- public static ResponseData parse(String responseData) {
- // Must parse out main response data and response-specific data.
- int index = responseData.indexOf(':');
- String mainData, extraData;
- if ( -1 == index ) {
- mainData = responseData;
- extraData = "";
- } else {
- mainData = responseData.substring(0, index);
- extraData = index >= responseData.length() ? "" : responseData.substring(index+1);
- }
-
- String [] fields = TextUtils.split(mainData, Pattern.quote("|"));
- if (fields.length < 6) {
- throw new IllegalArgumentException("Wrong number of fields.");
- }
-
- ResponseData data = new ResponseData();
- data.extra = extraData;
- data.responseCode = Integer.parseInt(fields[0]);
- data.nonce = Integer.parseInt(fields[1]);
- data.packageName = fields[2];
- data.versionCode = fields[3];
- // Application-specific user identifier.
- data.userId = fields[4];
- data.timestamp = Long.parseLong(fields[5]);
-
- return data;
- }
-
- @Override
- public String toString() {
- return TextUtils.join("|", new Object [] { responseCode, nonce, packageName, versionCode,
- userId, timestamp });
- }
-}
diff --git a/platform/android/java/src/com/android/vending/licensing/ServerManagedPolicy.java b/platform/android/java/src/com/android/vending/licensing/ServerManagedPolicy.java
deleted file mode 100644
index fbf8cf6d00..0000000000
--- a/platform/android/java/src/com/android/vending/licensing/ServerManagedPolicy.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.android.vending.licensing;
-
-import org.apache.http.NameValuePair;
-import org.apache.http.client.utils.URLEncodedUtils;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.util.Log;
-
-/**
- * Default policy. All policy decisions are based off of response data received
- * from the licensing service. Specifically, the licensing server sends the
- * following information: response validity period, error retry period, and
- * error retry count.
- * <p>
- * These values will vary based on the the way the application is configured in
- * the Android Market publishing console, such as whether the application is
- * marked as free or is within its refund period, as well as how often an
- * application is checking with the licensing service.
- * <p>
- * Developers who need more fine grained control over their application's
- * licensing policy should implement a custom Policy.
- */
-public class ServerManagedPolicy implements Policy {
-
- private static final String TAG = "ServerManagedPolicy";
- private static final String PREFS_FILE = "com.android.vending.licensing.ServerManagedPolicy";
- private static final String PREF_LAST_RESPONSE = "lastResponse";
- private static final String PREF_VALIDITY_TIMESTAMP = "validityTimestamp";
- private static final String PREF_RETRY_UNTIL = "retryUntil";
- private static final String PREF_MAX_RETRIES = "maxRetries";
- private static final String PREF_RETRY_COUNT = "retryCount";
- private static final String DEFAULT_VALIDITY_TIMESTAMP = "0";
- private static final String DEFAULT_RETRY_UNTIL = "0";
- private static final String DEFAULT_MAX_RETRIES = "0";
- private static final String DEFAULT_RETRY_COUNT = "0";
-
- private static final long MILLIS_PER_MINUTE = 60 * 1000;
-
- private long mValidityTimestamp;
- private long mRetryUntil;
- private long mMaxRetries;
- private long mRetryCount;
- private long mLastResponseTime = 0;
- private int mLastResponse;
- private PreferenceObfuscator mPreferences;
-
- /**
- * @param context The context for the current application
- * @param obfuscator An obfuscator to be used with preferences.
- */
- public ServerManagedPolicy(Context context, Obfuscator obfuscator) {
- // Import old values
- SharedPreferences sp = context.getSharedPreferences(PREFS_FILE, Context.MODE_PRIVATE);
- mPreferences = new PreferenceObfuscator(sp, obfuscator);
- mLastResponse = Integer.parseInt(
- mPreferences.getString(PREF_LAST_RESPONSE, Integer.toString(Policy.RETRY)));
- mValidityTimestamp = Long.parseLong(mPreferences.getString(PREF_VALIDITY_TIMESTAMP,
- DEFAULT_VALIDITY_TIMESTAMP));
- mRetryUntil = Long.parseLong(mPreferences.getString(PREF_RETRY_UNTIL, DEFAULT_RETRY_UNTIL));
- mMaxRetries = Long.parseLong(mPreferences.getString(PREF_MAX_RETRIES, DEFAULT_MAX_RETRIES));
- mRetryCount = Long.parseLong(mPreferences.getString(PREF_RETRY_COUNT, DEFAULT_RETRY_COUNT));
- }
-
- /**
- * Process a new response from the license server.
- * <p>
- * This data will be used for computing future policy decisions. The
- * following parameters are processed:
- * <ul>
- * <li>VT: the timestamp that the client should consider the response
- * valid until
- * <li>GT: the timestamp that the client should ignore retry errors until
- * <li>GR: the number of retry errors that the client should ignore
- * </ul>
- *
- * @param response the result from validating the server response
- * @param rawData the raw server response data
- */
- public void processServerResponse(int response, ResponseData rawData) {
-
- // Update retry counter
- if (response != Policy.RETRY) {
- setRetryCount(0);
- } else {
- setRetryCount(mRetryCount + 1);
- }
-
- if (response == Policy.LICENSED) {
- // Update server policy data
- Map<String, String> extras = decodeExtras(rawData.extra);
- mLastResponse = response;
- setValidityTimestamp(extras.get("VT"));
- setRetryUntil(extras.get("GT"));
- setMaxRetries(extras.get("GR"));
- } else if (response == Policy.NOT_LICENSED) {
- // Clear out stale policy data
- setValidityTimestamp(DEFAULT_VALIDITY_TIMESTAMP);
- setRetryUntil(DEFAULT_RETRY_UNTIL);
- setMaxRetries(DEFAULT_MAX_RETRIES);
- }
-
- setLastResponse(response);
- mPreferences.commit();
- }
-
- /**
- * Set the last license response received from the server and add to
- * preferences. You must manually call PreferenceObfuscator.commit() to
- * commit these changes to disk.
- *
- * @param l the response
- */
- private void setLastResponse(int l) {
- mLastResponseTime = System.currentTimeMillis();
- mLastResponse = l;
- mPreferences.putString(PREF_LAST_RESPONSE, Integer.toString(l));
- }
-
- /**
- * Set the current retry count and add to preferences. You must manually
- * call PreferenceObfuscator.commit() to commit these changes to disk.
- *
- * @param c the new retry count
- */
- private void setRetryCount(long c) {
- mRetryCount = c;
- mPreferences.putString(PREF_RETRY_COUNT, Long.toString(c));
- }
-
- public long getRetryCount() {
- return mRetryCount;
- }
-
- /**
- * Set the last validity timestamp (VT) received from the server and add to
- * preferences. You must manually call PreferenceObfuscator.commit() to
- * commit these changes to disk.
- *
- * @param validityTimestamp the VT string received
- */
- private void setValidityTimestamp(String validityTimestamp) {
- Long lValidityTimestamp;
- try {
- lValidityTimestamp = Long.parseLong(validityTimestamp);
- } catch (NumberFormatException e) {
- // No response or not parsable, expire in one minute.
- Log.w(TAG, "License validity timestamp (VT) missing, caching for a minute");
- lValidityTimestamp = System.currentTimeMillis() + MILLIS_PER_MINUTE;
- validityTimestamp = Long.toString(lValidityTimestamp);
- }
-
- mValidityTimestamp = lValidityTimestamp;
- mPreferences.putString(PREF_VALIDITY_TIMESTAMP, validityTimestamp);
- }
-
- public long getValidityTimestamp() {
- return mValidityTimestamp;
- }
-
- /**
- * Set the retry until timestamp (GT) received from the server and add to
- * preferences. You must manually call PreferenceObfuscator.commit() to
- * commit these changes to disk.
- *
- * @param retryUntil the GT string received
- */
- private void setRetryUntil(String retryUntil) {
- Long lRetryUntil;
- try {
- lRetryUntil = Long.parseLong(retryUntil);
- } catch (NumberFormatException e) {
- // No response or not parsable, expire immediately
- Log.w(TAG, "License retry timestamp (GT) missing, grace period disabled");
- retryUntil = "0";
- lRetryUntil = 0l;
- }
-
- mRetryUntil = lRetryUntil;
- mPreferences.putString(PREF_RETRY_UNTIL, retryUntil);
- }
-
- public long getRetryUntil() {
- return mRetryUntil;
- }
-
- /**
- * Set the max retries value (GR) as received from the server and add to
- * preferences. You must manually call PreferenceObfuscator.commit() to
- * commit these changes to disk.
- *
- * @param maxRetries the GR string received
- */
- private void setMaxRetries(String maxRetries) {
- Long lMaxRetries;
- try {
- lMaxRetries = Long.parseLong(maxRetries);
- } catch (NumberFormatException e) {
- // No response or not parsable, expire immediately
- Log.w(TAG, "Licence retry count (GR) missing, grace period disabled");
- maxRetries = "0";
- lMaxRetries = 0l;
- }
-
- mMaxRetries = lMaxRetries;
- mPreferences.putString(PREF_MAX_RETRIES, maxRetries);
- }
-
- public long getMaxRetries() {
- return mMaxRetries;
- }
-
- /**
- * {@inheritDoc}
- *
- * This implementation allows access if either:<br>
- * <ol>
- * <li>a LICENSED response was received within the validity period
- * <li>a RETRY response was received in the last minute, and we are under
- * the RETRY count or in the RETRY period.
- * </ol>
- */
- public boolean allowAccess() {
- long ts = System.currentTimeMillis();
- if (mLastResponse == Policy.LICENSED) {
- // Check if the LICENSED response occurred within the validity timeout.
- if (ts <= mValidityTimestamp) {
- // Cached LICENSED response is still valid.
- return true;
- }
- } else if (mLastResponse == Policy.RETRY &&
- ts < mLastResponseTime + MILLIS_PER_MINUTE) {
- // Only allow access if we are within the retry period or we haven't used up our
- // max retries.
- return (ts <= mRetryUntil || mRetryCount <= mMaxRetries);
- }
- return false;
- }
-
- private Map<String, String> decodeExtras(String extras) {
- Map<String, String> results = new HashMap<String, String>();
- try {
- URI rawExtras = new URI("?" + extras);
- List<NameValuePair> extraList = URLEncodedUtils.parse(rawExtras, "UTF-8");
- for (NameValuePair item : extraList) {
- results.put(item.getName(), item.getValue());
- }
- } catch (URISyntaxException e) {
- Log.w(TAG, "Invalid syntax error while decoding extras data from server.");
- }
- return results;
- }
-
-}
diff --git a/platform/android/java/src/com/android/vending/licensing/util/Base64.java b/platform/android/java/src/com/android/vending/licensing/util/Base64.java
deleted file mode 100644
index a0d2779af2..0000000000
--- a/platform/android/java/src/com/android/vending/licensing/util/Base64.java
+++ /dev/null
@@ -1,570 +0,0 @@
-// Portions copyright 2002, Google, Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.android.vending.licensing.util;
-
-// This code was converted from code at http://iharder.sourceforge.net/base64/
-// Lots of extraneous features were removed.
-/* The original code said:
- * <p>
- * I am placing this code in the Public Domain. Do with it as you will.
- * This software comes with no guarantees or warranties but with
- * plenty of well-wishing instead!
- * Please visit
- * <a href="http://iharder.net/xmlizable">http://iharder.net/xmlizable</a>
- * periodically to check for updates or to contribute improvements.
- * </p>
- *
- * @author Robert Harder
- * @author rharder@usa.net
- * @version 1.3
- */
-
-/**
- * Base64 converter class. This code is not a full-blown MIME encoder;
- * it simply converts binary data to base64 data and back.
- *
- * <p>Note {@link CharBase64} is a GWT-compatible implementation of this
- * class.
- */
-public class Base64 {
- /** Specify encoding (value is {@code true}). */
- public final static boolean ENCODE = true;
-
- /** Specify decoding (value is {@code false}). */
- public final static boolean DECODE = false;
-
- /** The equals sign (=) as a byte. */
- private final static byte EQUALS_SIGN = (byte) '=';
-
- /** The new line character (\n) as a byte. */
- private final static byte NEW_LINE = (byte) '\n';
-
- /**
- * The 64 valid Base64 values.
- */
- private final static byte[] ALPHABET =
- {(byte) 'A', (byte) 'B', (byte) 'C', (byte) 'D', (byte) 'E', (byte) 'F',
- (byte) 'G', (byte) 'H', (byte) 'I', (byte) 'J', (byte) 'K',
- (byte) 'L', (byte) 'M', (byte) 'N', (byte) 'O', (byte) 'P',
- (byte) 'Q', (byte) 'R', (byte) 'S', (byte) 'T', (byte) 'U',
- (byte) 'V', (byte) 'W', (byte) 'X', (byte) 'Y', (byte) 'Z',
- (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e',
- (byte) 'f', (byte) 'g', (byte) 'h', (byte) 'i', (byte) 'j',
- (byte) 'k', (byte) 'l', (byte) 'm', (byte) 'n', (byte) 'o',
- (byte) 'p', (byte) 'q', (byte) 'r', (byte) 's', (byte) 't',
- (byte) 'u', (byte) 'v', (byte) 'w', (byte) 'x', (byte) 'y',
- (byte) 'z', (byte) '0', (byte) '1', (byte) '2', (byte) '3',
- (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8',
- (byte) '9', (byte) '+', (byte) '/'};
-
- /**
- * The 64 valid web safe Base64 values.
- */
- private final static byte[] WEBSAFE_ALPHABET =
- {(byte) 'A', (byte) 'B', (byte) 'C', (byte) 'D', (byte) 'E', (byte) 'F',
- (byte) 'G', (byte) 'H', (byte) 'I', (byte) 'J', (byte) 'K',
- (byte) 'L', (byte) 'M', (byte) 'N', (byte) 'O', (byte) 'P',
- (byte) 'Q', (byte) 'R', (byte) 'S', (byte) 'T', (byte) 'U',
- (byte) 'V', (byte) 'W', (byte) 'X', (byte) 'Y', (byte) 'Z',
- (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e',
- (byte) 'f', (byte) 'g', (byte) 'h', (byte) 'i', (byte) 'j',
- (byte) 'k', (byte) 'l', (byte) 'm', (byte) 'n', (byte) 'o',
- (byte) 'p', (byte) 'q', (byte) 'r', (byte) 's', (byte) 't',
- (byte) 'u', (byte) 'v', (byte) 'w', (byte) 'x', (byte) 'y',
- (byte) 'z', (byte) '0', (byte) '1', (byte) '2', (byte) '3',
- (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8',
- (byte) '9', (byte) '-', (byte) '_'};
-
- /**
- * Translates a Base64 value to either its 6-bit reconstruction value
- * or a negative number indicating some other meaning.
- **/
- private final static byte[] DECODABET = {-9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 0 - 8
- -5, -5, // Whitespace: Tab and Linefeed
- -9, -9, // Decimal 11 - 12
- -5, // Whitespace: Carriage Return
- -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 14 - 26
- -9, -9, -9, -9, -9, // Decimal 27 - 31
- -5, // Whitespace: Space
- -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 33 - 42
- 62, // Plus sign at decimal 43
- -9, -9, -9, // Decimal 44 - 46
- 63, // Slash at decimal 47
- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // Numbers zero through nine
- -9, -9, -9, // Decimal 58 - 60
- -1, // Equals sign at decimal 61
- -9, -9, -9, // Decimal 62 - 64
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, // Letters 'A' through 'N'
- 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // Letters 'O' through 'Z'
- -9, -9, -9, -9, -9, -9, // Decimal 91 - 96
- 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, // Letters 'a' through 'm'
- 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // Letters 'n' through 'z'
- -9, -9, -9, -9, -9 // Decimal 123 - 127
- /* ,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 128 - 139
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 */
- };
-
- /** The web safe decodabet */
- private final static byte[] WEBSAFE_DECODABET =
- {-9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 0 - 8
- -5, -5, // Whitespace: Tab and Linefeed
- -9, -9, // Decimal 11 - 12
- -5, // Whitespace: Carriage Return
- -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 14 - 26
- -9, -9, -9, -9, -9, // Decimal 27 - 31
- -5, // Whitespace: Space
- -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 33 - 44
- 62, // Dash '-' sign at decimal 45
- -9, -9, // Decimal 46-47
- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // Numbers zero through nine
- -9, -9, -9, // Decimal 58 - 60
- -1, // Equals sign at decimal 61
- -9, -9, -9, // Decimal 62 - 64
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, // Letters 'A' through 'N'
- 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // Letters 'O' through 'Z'
- -9, -9, -9, -9, // Decimal 91-94
- 63, // Underscore '_' at decimal 95
- -9, // Decimal 96
- 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, // Letters 'a' through 'm'
- 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // Letters 'n' through 'z'
- -9, -9, -9, -9, -9 // Decimal 123 - 127
- /* ,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 128 - 139
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 */
- };
-
- // Indicates white space in encoding
- private final static byte WHITE_SPACE_ENC = -5;
- // Indicates equals sign in encoding
- private final static byte EQUALS_SIGN_ENC = -1;
-
- /** Defeats instantiation. */
- private Base64() {
- }
-
- /* ******** E N C O D I N G M E T H O D S ******** */
-
- /**
- * Encodes up to three bytes of the array <var>source</var>
- * and writes the resulting four Base64 bytes to <var>destination</var>.
- * The source and destination arrays can be manipulated
- * anywhere along their length by specifying
- * <var>srcOffset</var> and <var>destOffset</var>.
- * This method does not check to make sure your arrays
- * are large enough to accommodate <var>srcOffset</var> + 3 for
- * the <var>source</var> array or <var>destOffset</var> + 4 for
- * the <var>destination</var> array.
- * The actual number of significant bytes in your array is
- * given by <var>numSigBytes</var>.
- *
- * @param source the array to convert
- * @param srcOffset the index where conversion begins
- * @param numSigBytes the number of significant bytes in your array
- * @param destination the array to hold the conversion
- * @param destOffset the index where output will be put
- * @param alphabet is the encoding alphabet
- * @return the <var>destination</var> array
- * @since 1.3
- */
- private static byte[] encode3to4(byte[] source, int srcOffset,
- int numSigBytes, byte[] destination, int destOffset, byte[] alphabet) {
- // 1 2 3
- // 01234567890123456789012345678901 Bit position
- // --------000000001111111122222222 Array position from threeBytes
- // --------| || || || | Six bit groups to index alphabet
- // >>18 >>12 >> 6 >> 0 Right shift necessary
- // 0x3f 0x3f 0x3f Additional AND
-
- // Create buffer with zero-padding if there are only one or two
- // significant bytes passed in the array.
- // We have to shift left 24 in order to flush out the 1's that appear
- // when Java treats a value as negative that is cast from a byte to an int.
- int inBuff =
- (numSigBytes > 0 ? ((source[srcOffset] << 24) >>> 8) : 0)
- | (numSigBytes > 1 ? ((source[srcOffset + 1] << 24) >>> 16) : 0)
- | (numSigBytes > 2 ? ((source[srcOffset + 2] << 24) >>> 24) : 0);
-
- switch (numSigBytes) {
- case 3:
- destination[destOffset] = alphabet[(inBuff >>> 18)];
- destination[destOffset + 1] = alphabet[(inBuff >>> 12) & 0x3f];
- destination[destOffset + 2] = alphabet[(inBuff >>> 6) & 0x3f];
- destination[destOffset + 3] = alphabet[(inBuff) & 0x3f];
- return destination;
- case 2:
- destination[destOffset] = alphabet[(inBuff >>> 18)];
- destination[destOffset + 1] = alphabet[(inBuff >>> 12) & 0x3f];
- destination[destOffset + 2] = alphabet[(inBuff >>> 6) & 0x3f];
- destination[destOffset + 3] = EQUALS_SIGN;
- return destination;
- case 1:
- destination[destOffset] = alphabet[(inBuff >>> 18)];
- destination[destOffset + 1] = alphabet[(inBuff >>> 12) & 0x3f];
- destination[destOffset + 2] = EQUALS_SIGN;
- destination[destOffset + 3] = EQUALS_SIGN;
- return destination;
- default:
- return destination;
- } // end switch
- } // end encode3to4
-
- /**
- * Encodes a byte array into Base64 notation.
- * Equivalent to calling
- * {@code encodeBytes(source, 0, source.length)}
- *
- * @param source The data to convert
- * @since 1.4
- */
- public static String encode(byte[] source) {
- return encode(source, 0, source.length, ALPHABET, true);
- }
-
- /**
- * Encodes a byte array into web safe Base64 notation.
- *
- * @param source The data to convert
- * @param doPadding is {@code true} to pad result with '=' chars
- * if it does not fall on 3 byte boundaries
- */
- public static String encodeWebSafe(byte[] source, boolean doPadding) {
- return encode(source, 0, source.length, WEBSAFE_ALPHABET, doPadding);
- }
-
- /**
- * Encodes a byte array into Base64 notation.
- *
- * @param source The data to convert
- * @param off Offset in array where conversion should begin
- * @param len Length of data to convert
- * @param alphabet is the encoding alphabet
- * @param doPadding is {@code true} to pad result with '=' chars
- * if it does not fall on 3 byte boundaries
- * @since 1.4
- */
- public static String encode(byte[] source, int off, int len, byte[] alphabet,
- boolean doPadding) {
- byte[] outBuff = encode(source, off, len, alphabet, Integer.MAX_VALUE);
- int outLen = outBuff.length;
-
- // If doPadding is false, set length to truncate '='
- // padding characters
- while (doPadding == false && outLen > 0) {
- if (outBuff[outLen - 1] != '=') {
- break;
- }
- outLen -= 1;
- }
-
- return new String(outBuff, 0, outLen);
- }
-
- /**
- * Encodes a byte array into Base64 notation.
- *
- * @param source The data to convert
- * @param off Offset in array where conversion should begin
- * @param len Length of data to convert
- * @param alphabet is the encoding alphabet
- * @param maxLineLength maximum length of one line.
- * @return the BASE64-encoded byte array
- */
- public static byte[] encode(byte[] source, int off, int len, byte[] alphabet,
- int maxLineLength) {
- int lenDiv3 = (len + 2) / 3; // ceil(len / 3)
- int len43 = lenDiv3 * 4;
- byte[] outBuff = new byte[len43 // Main 4:3
- + (len43 / maxLineLength)]; // New lines
-
- int d = 0;
- int e = 0;
- int len2 = len - 2;
- int lineLength = 0;
- for (; d < len2; d += 3, e += 4) {
-
- // The following block of code is the same as
- // encode3to4( source, d + off, 3, outBuff, e, alphabet );
- // but inlined for faster encoding (~20% improvement)
- int inBuff =
- ((source[d + off] << 24) >>> 8)
- | ((source[d + 1 + off] << 24) >>> 16)
- | ((source[d + 2 + off] << 24) >>> 24);
- outBuff[e] = alphabet[(inBuff >>> 18)];
- outBuff[e + 1] = alphabet[(inBuff >>> 12) & 0x3f];
- outBuff[e + 2] = alphabet[(inBuff >>> 6) & 0x3f];
- outBuff[e + 3] = alphabet[(inBuff) & 0x3f];
-
- lineLength += 4;
- if (lineLength == maxLineLength) {
- outBuff[e + 4] = NEW_LINE;
- e++;
- lineLength = 0;
- } // end if: end of line
- } // end for: each piece of array
-
- if (d < len) {
- encode3to4(source, d + off, len - d, outBuff, e, alphabet);
-
- lineLength += 4;
- if (lineLength == maxLineLength) {
- // Add a last newline
- outBuff[e + 4] = NEW_LINE;
- e++;
- }
- e += 4;
- }
-
- assert (e == outBuff.length);
- return outBuff;
- }
-
-
- /* ******** D E C O D I N G M E T H O D S ******** */
-
-
- /**
- * Decodes four bytes from array <var>source</var>
- * and writes the resulting bytes (up to three of them)
- * to <var>destination</var>.
- * The source and destination arrays can be manipulated
- * anywhere along their length by specifying
- * <var>srcOffset</var> and <var>destOffset</var>.
- * This method does not check to make sure your arrays
- * are large enough to accommodate <var>srcOffset</var> + 4 for
- * the <var>source</var> array or <var>destOffset</var> + 3 for
- * the <var>destination</var> array.
- * This method returns the actual number of bytes that
- * were converted from the Base64 encoding.
- *
- *
- * @param source the array to convert
- * @param srcOffset the index where conversion begins
- * @param destination the array to hold the conversion
- * @param destOffset the index where output will be put
- * @param decodabet the decodabet for decoding Base64 content
- * @return the number of decoded bytes converted
- * @since 1.3
- */
- private static int decode4to3(byte[] source, int srcOffset,
- byte[] destination, int destOffset, byte[] decodabet) {
- // Example: Dk==
- if (source[srcOffset + 2] == EQUALS_SIGN) {
- int outBuff =
- ((decodabet[source[srcOffset]] << 24) >>> 6)
- | ((decodabet[source[srcOffset + 1]] << 24) >>> 12);
-
- destination[destOffset] = (byte) (outBuff >>> 16);
- return 1;
- } else if (source[srcOffset + 3] == EQUALS_SIGN) {
- // Example: DkL=
- int outBuff =
- ((decodabet[source[srcOffset]] << 24) >>> 6)
- | ((decodabet[source[srcOffset + 1]] << 24) >>> 12)
- | ((decodabet[source[srcOffset + 2]] << 24) >>> 18);
-
- destination[destOffset] = (byte) (outBuff >>> 16);
- destination[destOffset + 1] = (byte) (outBuff >>> 8);
- return 2;
- } else {
- // Example: DkLE
- int outBuff =
- ((decodabet[source[srcOffset]] << 24) >>> 6)
- | ((decodabet[source[srcOffset + 1]] << 24) >>> 12)
- | ((decodabet[source[srcOffset + 2]] << 24) >>> 18)
- | ((decodabet[source[srcOffset + 3]] << 24) >>> 24);
-
- destination[destOffset] = (byte) (outBuff >> 16);
- destination[destOffset + 1] = (byte) (outBuff >> 8);
- destination[destOffset + 2] = (byte) (outBuff);
- return 3;
- }
- } // end decodeToBytes
-
-
- /**
- * Decodes data from Base64 notation.
- *
- * @param s the string to decode (decoded in default encoding)
- * @return the decoded data
- * @since 1.4
- */
- public static byte[] decode(String s) throws Base64DecoderException {
- byte[] bytes = s.getBytes();
- return decode(bytes, 0, bytes.length);
- }
-
- /**
- * Decodes data from web safe Base64 notation.
- * Web safe encoding uses '-' instead of '+', '_' instead of '/'
- *
- * @param s the string to decode (decoded in default encoding)
- * @return the decoded data
- */
- public static byte[] decodeWebSafe(String s) throws Base64DecoderException {
- byte[] bytes = s.getBytes();
- return decodeWebSafe(bytes, 0, bytes.length);
- }
-
- /**
- * Decodes Base64 content in byte array format and returns
- * the decoded byte array.
- *
- * @param source The Base64 encoded data
- * @return decoded data
- * @since 1.3
- * @throws Base64DecoderException
- */
- public static byte[] decode(byte[] source) throws Base64DecoderException {
- return decode(source, 0, source.length);
- }
-
- /**
- * Decodes web safe Base64 content in byte array format and returns
- * the decoded data.
- * Web safe encoding uses '-' instead of '+', '_' instead of '/'
- *
- * @param source the string to decode (decoded in default encoding)
- * @return the decoded data
- */
- public static byte[] decodeWebSafe(byte[] source)
- throws Base64DecoderException {
- return decodeWebSafe(source, 0, source.length);
- }
-
- /**
- * Decodes Base64 content in byte array format and returns
- * the decoded byte array.
- *
- * @param source The Base64 encoded data
- * @param off The offset of where to begin decoding
- * @param len The length of characters to decode
- * @return decoded data
- * @since 1.3
- * @throws Base64DecoderException
- */
- public static byte[] decode(byte[] source, int off, int len)
- throws Base64DecoderException {
- return decode(source, off, len, DECODABET);
- }
-
- /**
- * Decodes web safe Base64 content in byte array format and returns
- * the decoded byte array.
- * Web safe encoding uses '-' instead of '+', '_' instead of '/'
- *
- * @param source The Base64 encoded data
- * @param off The offset of where to begin decoding
- * @param len The length of characters to decode
- * @return decoded data
- */
- public static byte[] decodeWebSafe(byte[] source, int off, int len)
- throws Base64DecoderException {
- return decode(source, off, len, WEBSAFE_DECODABET);
- }
-
- /**
- * Decodes Base64 content using the supplied decodabet and returns
- * the decoded byte array.
- *
- * @param source The Base64 encoded data
- * @param off The offset of where to begin decoding
- * @param len The length of characters to decode
- * @param decodabet the decodabet for decoding Base64 content
- * @return decoded data
- */
- public static byte[] decode(byte[] source, int off, int len, byte[] decodabet)
- throws Base64DecoderException {
- int len34 = len * 3 / 4;
- byte[] outBuff = new byte[2 + len34]; // Upper limit on size of output
- int outBuffPosn = 0;
-
- byte[] b4 = new byte[4];
- int b4Posn = 0;
- int i = 0;
- byte sbiCrop = 0;
- byte sbiDecode = 0;
- for (i = 0; i < len; i++) {
- sbiCrop = (byte) (source[i + off] & 0x7f); // Only the low seven bits
- sbiDecode = decodabet[sbiCrop];
-
- if (sbiDecode >= WHITE_SPACE_ENC) { // White space Equals sign or better
- if (sbiDecode >= EQUALS_SIGN_ENC) {
- // An equals sign (for padding) must not occur at position 0 or 1
- // and must be the last byte[s] in the encoded value
- if (sbiCrop == EQUALS_SIGN) {
- int bytesLeft = len - i;
- byte lastByte = (byte) (source[len - 1 + off] & 0x7f);
- if (b4Posn == 0 || b4Posn == 1) {
- throw new Base64DecoderException(
- "invalid padding byte '=' at byte offset " + i);
- } else if ((b4Posn == 3 && bytesLeft > 2)
- || (b4Posn == 4 && bytesLeft > 1)) {
- throw new Base64DecoderException(
- "padding byte '=' falsely signals end of encoded value "
- + "at offset " + i);
- } else if (lastByte != EQUALS_SIGN && lastByte != NEW_LINE) {
- throw new Base64DecoderException(
- "encoded value has invalid trailing byte");
- }
- break;
- }
-
- b4[b4Posn++] = sbiCrop;
- if (b4Posn == 4) {
- outBuffPosn += decode4to3(b4, 0, outBuff, outBuffPosn, decodabet);
- b4Posn = 0;
- }
- }
- } else {
- throw new Base64DecoderException("Bad Base64 input character at " + i
- + ": " + source[i + off] + "(decimal)");
- }
- }
-
- // Because web safe encoding allows non padding base64 encodes, we
- // need to pad the rest of the b4 buffer with equal signs when
- // b4Posn != 0. There can be at most 2 equal signs at the end of
- // four characters, so the b4 buffer must have two or three
- // characters. This also catches the case where the input is
- // padded with EQUALS_SIGN
- if (b4Posn != 0) {
- if (b4Posn == 1) {
- throw new Base64DecoderException("single trailing character at offset "
- + (len - 1));
- }
- b4[b4Posn++] = EQUALS_SIGN;
- outBuffPosn += decode4to3(b4, 0, outBuff, outBuffPosn, decodabet);
- }
-
- byte[] out = new byte[outBuffPosn];
- System.arraycopy(outBuff, 0, out, 0, outBuffPosn);
- return out;
- }
-}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/Constants.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/Constants.java
index 2af33b96b9..ff1eee528f 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/Constants.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/Constants.java
@@ -18,119 +18,113 @@ package com.google.android.vending.expansion.downloader;
import java.io.File;
-
/**
* Contains the internal constants that are used in the download manager.
* As a general rule, modifying these constants should be done with care.
*/
-public class Constants {
- /** Tag used for debugging/logging */
- public static final String TAG = "LVLDL";
+public class Constants {
+ /** Tag used for debugging/logging */
+ public static final String TAG = "LVLDL";
- /**
+ /**
* Expansion path where we store obb files
*/
- public static final String EXP_PATH = File.separator + "Android"
- + File.separator + "obb" + File.separator;
-
- // save to private app's data on Android 6.0 to skip requesting permission.
- public static final String EXP_PATH_API23 = File.separator + "Android"
- + File.separator + "data" + File.separator;
-
- /** The intent that gets sent when the service must wake up for a retry */
- public static final String ACTION_RETRY = "android.intent.action.DOWNLOAD_WAKEUP";
+ public static final String EXP_PATH = File.separator + "Android" + File.separator + "obb" + File.separator;
+
+ /** The intent that gets sent when the service must wake up for a retry */
+ public static final String ACTION_RETRY = "android.intent.action.DOWNLOAD_WAKEUP";
- /** the intent that gets sent when clicking a successful download */
- public static final String ACTION_OPEN = "android.intent.action.DOWNLOAD_OPEN";
+ /** the intent that gets sent when clicking a successful download */
+ public static final String ACTION_OPEN = "android.intent.action.DOWNLOAD_OPEN";
- /** the intent that gets sent when clicking an incomplete/failed download */
- public static final String ACTION_LIST = "android.intent.action.DOWNLOAD_LIST";
+ /** the intent that gets sent when clicking an incomplete/failed download */
+ public static final String ACTION_LIST = "android.intent.action.DOWNLOAD_LIST";
- /** the intent that gets sent when deleting the notification of a completed download */
- public static final String ACTION_HIDE = "android.intent.action.DOWNLOAD_HIDE";
+ /** the intent that gets sent when deleting the notification of a completed download */
+ public static final String ACTION_HIDE = "android.intent.action.DOWNLOAD_HIDE";
- /**
+ /**
* When a number has to be appended to the filename, this string is used to separate the
* base filename from the sequence number
*/
- public static final String FILENAME_SEQUENCE_SEPARATOR = "-";
+ public static final String FILENAME_SEQUENCE_SEPARATOR = "-";
- /** The default user agent used for downloads */
- public static final String DEFAULT_USER_AGENT = "Android.LVLDM";
+ /** The default user agent used for downloads */
+ public static final String DEFAULT_USER_AGENT = "Android.LVLDM";
- /** The buffer size used to stream the data */
- public static final int BUFFER_SIZE = 4096;
+ /** The buffer size used to stream the data */
+ public static final int BUFFER_SIZE = 4096;
- /** The minimum amount of progress that has to be done before the progress bar gets updated */
- public static final int MIN_PROGRESS_STEP = 4096;
+ /** The minimum amount of progress that has to be done before the progress bar gets updated */
+ public static final int MIN_PROGRESS_STEP = 4096;
- /** The minimum amount of time that has to elapse before the progress bar gets updated, in ms */
- public static final long MIN_PROGRESS_TIME = 1000;
+ /** The minimum amount of time that has to elapse before the progress bar gets updated, in ms */
+ public static final long MIN_PROGRESS_TIME = 1000;
- /** The maximum number of rows in the database (FIFO) */
- public static final int MAX_DOWNLOADS = 1000;
+ /** The maximum number of rows in the database (FIFO) */
+ public static final int MAX_DOWNLOADS = 1000;
- /**
+ /**
* The number of times that the download manager will retry its network
* operations when no progress is happening before it gives up.
*/
- public static final int MAX_RETRIES = 10;
+ public static final int MAX_RETRIES = 5;
- /**
+ /**
* The minimum amount of time that the download manager accepts for
* a Retry-After response header with a parameter in delta-seconds.
*/
- public static final int MIN_RETRY_AFTER = 30; // 30s
+ public static final int MIN_RETRY_AFTER = 30; // 30s
- /**
+ /**
* The maximum amount of time that the download manager accepts for
* a Retry-After response header with a parameter in delta-seconds.
*/
- public static final int MAX_RETRY_AFTER = 24 * 60 * 60; // 24h
+ public static final int MAX_RETRY_AFTER = 24 * 60 * 60; // 24h
- /**
+ /**
* The maximum number of redirects.
*/
- public static final int MAX_REDIRECTS = 5; // can't be more than 7.
+ public static final int MAX_REDIRECTS = 5; // can't be more than 7.
- /**
+ /**
* The time between a failure and the first retry after an IOException.
* Each subsequent retry grows exponentially, doubling each time.
* The time is in seconds.
*/
- public static final int RETRY_FIRST_DELAY = 30;
+ public static final int RETRY_FIRST_DELAY = 30;
+
+ /** Enable separate connectivity logging */
+ public static final boolean LOGX = true;
- /** Enable separate connectivity logging */
- public static final boolean LOGX = true;
+ /** Enable verbose logging */
+ public static final boolean LOGV = false;
- /** Enable verbose logging */
- public static final boolean LOGV = false;
-
- /** Enable super-verbose logging */
- private static final boolean LOCAL_LOGVV = false;
- public static final boolean LOGVV = LOCAL_LOGVV && LOGV;
-
- /**
+ /** Enable super-verbose logging */
+ private static final boolean LOCAL_LOGVV = false;
+ public static final boolean LOGVV = LOCAL_LOGVV && LOGV;
+
+ /**
* This download has successfully completed.
* Warning: there might be other status values that indicate success
* in the future.
* Use isSucccess() to capture the entire category.
*/
- public static final int STATUS_SUCCESS = 200;
+ public static final int STATUS_SUCCESS = 200;
- /**
+ /**
* This request couldn't be parsed. This is also used when processing
* requests with unknown/unsupported URI schemes.
*/
- public static final int STATUS_BAD_REQUEST = 400;
+ public static final int STATUS_BAD_REQUEST = 400;
- /**
+ /**
* This download can't be performed because the content type cannot be
* handled.
*/
- public static final int STATUS_NOT_ACCEPTABLE = 406;
+ public static final int STATUS_NOT_ACCEPTABLE = 406;
- /**
+ /**
* This download cannot be performed because the length cannot be
* determined accurately. This is the code for the HTTP error "Length
* Required", which is typically used when making requests that require
@@ -139,102 +133,101 @@ public class Constants {
* accurately (therefore making it impossible to know when a download
* completes).
*/
- public static final int STATUS_LENGTH_REQUIRED = 411;
+ public static final int STATUS_LENGTH_REQUIRED = 411;
- /**
+ /**
* This download was interrupted and cannot be resumed.
* This is the code for the HTTP error "Precondition Failed", and it is
* also used in situations where the client doesn't have an ETag at all.
*/
- public static final int STATUS_PRECONDITION_FAILED = 412;
+ public static final int STATUS_PRECONDITION_FAILED = 412;
- /**
+ /**
* The lowest-valued error status that is not an actual HTTP status code.
*/
- public static final int MIN_ARTIFICIAL_ERROR_STATUS = 488;
+ public static final int MIN_ARTIFICIAL_ERROR_STATUS = 488;
- /**
+ /**
* The requested destination file already exists.
*/
- public static final int STATUS_FILE_ALREADY_EXISTS_ERROR = 488;
+ public static final int STATUS_FILE_ALREADY_EXISTS_ERROR = 488;
- /**
+ /**
* Some possibly transient error occurred, but we can't resume the download.
*/
- public static final int STATUS_CANNOT_RESUME = 489;
+ public static final int STATUS_CANNOT_RESUME = 489;
- /**
+ /**
* This download was canceled
*/
- public static final int STATUS_CANCELED = 490;
+ public static final int STATUS_CANCELED = 490;
- /**
+ /**
* This download has completed with an error.
* Warning: there will be other status values that indicate errors in
* the future. Use isStatusError() to capture the entire category.
*/
- public static final int STATUS_UNKNOWN_ERROR = 491;
+ public static final int STATUS_UNKNOWN_ERROR = 491;
- /**
+ /**
* This download couldn't be completed because of a storage issue.
* Typically, that's because the filesystem is missing or full.
* Use the more specific {@link #STATUS_INSUFFICIENT_SPACE_ERROR}
* and {@link #STATUS_DEVICE_NOT_FOUND_ERROR} when appropriate.
*/
- public static final int STATUS_FILE_ERROR = 492;
+ public static final int STATUS_FILE_ERROR = 492;
- /**
+ /**
* This download couldn't be completed because of an HTTP
* redirect response that the download manager couldn't
* handle.
*/
- public static final int STATUS_UNHANDLED_REDIRECT = 493;
+ public static final int STATUS_UNHANDLED_REDIRECT = 493;
- /**
+ /**
* This download couldn't be completed because of an
* unspecified unhandled HTTP code.
*/
- public static final int STATUS_UNHANDLED_HTTP_CODE = 494;
+ public static final int STATUS_UNHANDLED_HTTP_CODE = 494;
- /**
+ /**
* This download couldn't be completed because of an
* error receiving or processing data at the HTTP level.
*/
- public static final int STATUS_HTTP_DATA_ERROR = 495;
+ public static final int STATUS_HTTP_DATA_ERROR = 495;
- /**
+ /**
* This download couldn't be completed because of an
* HttpException while setting up the request.
*/
- public static final int STATUS_HTTP_EXCEPTION = 496;
+ public static final int STATUS_HTTP_EXCEPTION = 496;
- /**
+ /**
* This download couldn't be completed because there were
* too many redirects.
*/
- public static final int STATUS_TOO_MANY_REDIRECTS = 497;
+ public static final int STATUS_TOO_MANY_REDIRECTS = 497;
- /**
+ /**
* This download couldn't be completed due to insufficient storage
* space. Typically, this is because the SD card is full.
*/
- public static final int STATUS_INSUFFICIENT_SPACE_ERROR = 498;
+ public static final int STATUS_INSUFFICIENT_SPACE_ERROR = 498;
- /**
+ /**
* This download couldn't be completed because no external storage
* device was found. Typically, this is because the SD card is not
* mounted.
*/
- public static final int STATUS_DEVICE_NOT_FOUND_ERROR = 499;
+ public static final int STATUS_DEVICE_NOT_FOUND_ERROR = 499;
- /**
+ /**
* The wake duration to check to see if a download is possible.
*/
- public static final long WATCHDOG_WAKE_TIMER = 60*1000;
+ public static final long WATCHDOG_WAKE_TIMER = 60 * 1000;
- /**
+ /**
* The wake duration to check to see if the process was killed.
*/
- public static final long ACTIVE_THREAD_WATCHDOG = 5*1000;
-
+ public static final long ACTIVE_THREAD_WATCHDOG = 5 * 1000;
} \ No newline at end of file
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloadProgressInfo.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloadProgressInfo.java
index 9cb294d721..9a78a6d3df 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloadProgressInfo.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloadProgressInfo.java
@@ -19,7 +19,6 @@ package com.google.android.vending.expansion.downloader;
import android.os.Parcel;
import android.os.Parcelable;
-
/**
* This class contains progress information about the active download(s).
*
@@ -31,50 +30,49 @@ import android.os.Parcelable;
* as the progress so far, time remaining and current speed.
*/
public class DownloadProgressInfo implements Parcelable {
- public long mOverallTotal;
- public long mOverallProgress;
- public long mTimeRemaining; // time remaining
- public float mCurrentSpeed; // speed in KB/S
-
- @Override
- public int describeContents() {
- return 0;
- }
+ public long mOverallTotal;
+ public long mOverallProgress;
+ public long mTimeRemaining; // time remaining
+ public float mCurrentSpeed; // speed in KB/S
- @Override
- public void writeToParcel(Parcel p, int i) {
- p.writeLong(mOverallTotal);
- p.writeLong(mOverallProgress);
- p.writeLong(mTimeRemaining);
- p.writeFloat(mCurrentSpeed);
- }
+ @Override
+ public int describeContents() {
+ return 0;
+ }
- public DownloadProgressInfo(Parcel p) {
- mOverallTotal = p.readLong();
- mOverallProgress = p.readLong();
- mTimeRemaining = p.readLong();
- mCurrentSpeed = p.readFloat();
- }
+ @Override
+ public void writeToParcel(Parcel p, int i) {
+ p.writeLong(mOverallTotal);
+ p.writeLong(mOverallProgress);
+ p.writeLong(mTimeRemaining);
+ p.writeFloat(mCurrentSpeed);
+ }
- public DownloadProgressInfo(long overallTotal, long overallProgress,
- long timeRemaining,
- float currentSpeed) {
- this.mOverallTotal = overallTotal;
- this.mOverallProgress = overallProgress;
- this.mTimeRemaining = timeRemaining;
- this.mCurrentSpeed = currentSpeed;
- }
+ public DownloadProgressInfo(Parcel p) {
+ mOverallTotal = p.readLong();
+ mOverallProgress = p.readLong();
+ mTimeRemaining = p.readLong();
+ mCurrentSpeed = p.readFloat();
+ }
- public static final Creator<DownloadProgressInfo> CREATOR = new Creator<DownloadProgressInfo>() {
- @Override
- public DownloadProgressInfo createFromParcel(Parcel parcel) {
- return new DownloadProgressInfo(parcel);
- }
+ public DownloadProgressInfo(long overallTotal, long overallProgress,
+ long timeRemaining,
+ float currentSpeed) {
+ this.mOverallTotal = overallTotal;
+ this.mOverallProgress = overallProgress;
+ this.mTimeRemaining = timeRemaining;
+ this.mCurrentSpeed = currentSpeed;
+ }
- @Override
- public DownloadProgressInfo[] newArray(int i) {
- return new DownloadProgressInfo[i];
- }
- };
+ public static final Creator<DownloadProgressInfo> CREATOR = new Creator<DownloadProgressInfo>() {
+ @Override
+ public DownloadProgressInfo createFromParcel(Parcel parcel) {
+ return new DownloadProgressInfo(parcel);
+ }
+ @Override
+ public DownloadProgressInfo[] newArray(int i) {
+ return new DownloadProgressInfo[i];
+ }
+ };
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderClientMarshaller.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderClientMarshaller.java
index 2201751254..146426ef83 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderClientMarshaller.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderClientMarshaller.java
@@ -32,13 +32,13 @@ import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;
-
+import java.lang.ref.WeakReference;
/**
* This class binds the service API to your application client. It contains the IDownloaderClient proxy,
* which is used to call functions in your client as well as the Stub, which is used to call functions
* in the client implementation of IDownloaderClient.
- *
+ *
* <p>The IPC is implemented using an Android Messenger and a service Binder. The connect method
* should be called whenever the client wants to bind to the service. It opens up a service connection
* that ends up calling the onServiceConnected client API that passes the service messenger
@@ -58,162 +58,176 @@ import android.util.Log;
* interface.
*/
public class DownloaderClientMarshaller {
- public static final int MSG_ONDOWNLOADSTATE_CHANGED = 10;
- public static final int MSG_ONDOWNLOADPROGRESS = 11;
- public static final int MSG_ONSERVICECONNECTED = 12;
+ public static final int MSG_ONDOWNLOADSTATE_CHANGED = 10;
+ public static final int MSG_ONDOWNLOADPROGRESS = 11;
+ public static final int MSG_ONSERVICECONNECTED = 12;
+
+ public static final String PARAM_NEW_STATE = "newState";
+ public static final String PARAM_PROGRESS = "progress";
+ public static final String PARAM_MESSENGER = DownloaderService.EXTRA_MESSAGE_HANDLER;
- public static final String PARAM_NEW_STATE = "newState";
- public static final String PARAM_PROGRESS = "progress";
- public static final String PARAM_MESSENGER = DownloaderService.EXTRA_MESSAGE_HANDLER;
+ public static final int NO_DOWNLOAD_REQUIRED = DownloaderService.NO_DOWNLOAD_REQUIRED;
+ public static final int LVL_CHECK_REQUIRED = DownloaderService.LVL_CHECK_REQUIRED;
+ public static final int DOWNLOAD_REQUIRED = DownloaderService.DOWNLOAD_REQUIRED;
- public static final int NO_DOWNLOAD_REQUIRED = DownloaderService.NO_DOWNLOAD_REQUIRED;
- public static final int LVL_CHECK_REQUIRED = DownloaderService.LVL_CHECK_REQUIRED;
- public static final int DOWNLOAD_REQUIRED = DownloaderService.DOWNLOAD_REQUIRED;
+ private static class Proxy implements IDownloaderClient {
+ private Messenger mServiceMessenger;
- private static class Proxy implements IDownloaderClient {
- private Messenger mServiceMessenger;
+ @Override
+ public void onDownloadStateChanged(int newState) {
+ Bundle params = new Bundle(1);
+ params.putInt(PARAM_NEW_STATE, newState);
+ send(MSG_ONDOWNLOADSTATE_CHANGED, params);
+ }
- @Override
- public void onDownloadStateChanged(int newState) {
- Bundle params = new Bundle(1);
- params.putInt(PARAM_NEW_STATE, newState);
- send(MSG_ONDOWNLOADSTATE_CHANGED, params);
- }
+ @Override
+ public void onDownloadProgress(DownloadProgressInfo progress) {
+ Bundle params = new Bundle(1);
+ params.putParcelable(PARAM_PROGRESS, progress);
+ send(MSG_ONDOWNLOADPROGRESS, params);
+ }
- @Override
- public void onDownloadProgress(DownloadProgressInfo progress) {
- Bundle params = new Bundle(1);
- params.putParcelable(PARAM_PROGRESS, progress);
- send(MSG_ONDOWNLOADPROGRESS, params);
- }
+ private void send(int method, Bundle params) {
+ Message m = Message.obtain(null, method);
+ m.setData(params);
+ try {
+ mServiceMessenger.send(m);
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
+ }
- private void send(int method, Bundle params) {
- Message m = Message.obtain(null, method);
- m.setData(params);
- try {
- mServiceMessenger.send(m);
- } catch (RemoteException e) {
- e.printStackTrace();
- }
- }
-
- public Proxy(Messenger msg) {
- mServiceMessenger = msg;
- }
+ public Proxy(Messenger msg) {
+ mServiceMessenger = msg;
+ }
- @Override
- public void onServiceConnected(Messenger m) {
- /**
+ @Override
+ public void onServiceConnected(Messenger m) {
+ /**
* This is never called through the proxy.
*/
- }
- }
+ }
+ }
- private static class Stub implements IStub {
- private IDownloaderClient mItf = null;
- private Class<?> mDownloaderServiceClass;
- private boolean mBound;
- private Messenger mServiceMessenger;
- private Context mContext;
- /**
+ private static class Stub implements IStub {
+ private IDownloaderClient mItf = null;
+ private Class<?> mDownloaderServiceClass;
+ private boolean mBound;
+ private Messenger mServiceMessenger;
+ private Context mContext;
+ /**
* Target we publish for clients to send messages to IncomingHandler.
*/
- final Messenger mMessenger = new Messenger(new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_ONDOWNLOADPROGRESS:
- Bundle bun = msg.getData();
- if ( null != mContext ) {
- bun.setClassLoader(mContext.getClassLoader());
- DownloadProgressInfo dpi = (DownloadProgressInfo) msg.getData()
- .getParcelable(PARAM_PROGRESS);
- mItf.onDownloadProgress(dpi);
- }
- break;
- case MSG_ONDOWNLOADSTATE_CHANGED:
- mItf.onDownloadStateChanged(msg.getData().getInt(PARAM_NEW_STATE));
- break;
- case MSG_ONSERVICECONNECTED:
- mItf.onServiceConnected(
- (Messenger) msg.getData().getParcelable(PARAM_MESSENGER));
- break;
- }
- }
- });
+ private final MessengerHandlerClient mMsgHandler = new MessengerHandlerClient(this);
+ final Messenger mMessenger = new Messenger(mMsgHandler);
+
+ private static class MessengerHandlerClient extends Handler {
+ private final WeakReference<Stub> mDownloader;
+ public MessengerHandlerClient(Stub downloader) {
+ mDownloader = new WeakReference<>(downloader);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ Stub downloader = mDownloader.get();
+ if (downloader != null) {
+ downloader.handleMessage(msg);
+ }
+ }
+ }
- public Stub(IDownloaderClient itf, Class<?> downloaderService) {
- mItf = itf;
- mDownloaderServiceClass = downloaderService;
- }
+ private void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_ONDOWNLOADPROGRESS:
+ Bundle bun = msg.getData();
+ if (null != mContext) {
+ bun.setClassLoader(mContext.getClassLoader());
+ DownloadProgressInfo dpi = (DownloadProgressInfo)msg.getData()
+ .getParcelable(PARAM_PROGRESS);
+ mItf.onDownloadProgress(dpi);
+ }
+ break;
+ case MSG_ONDOWNLOADSTATE_CHANGED:
+ mItf.onDownloadStateChanged(msg.getData().getInt(PARAM_NEW_STATE));
+ break;
+ case MSG_ONSERVICECONNECTED:
+ mItf.onServiceConnected(
+ (Messenger)msg.getData().getParcelable(PARAM_MESSENGER));
+ break;
+ }
+ }
- /**
+ public Stub(IDownloaderClient itf, Class<?> downloaderService) {
+ mItf = itf;
+ mDownloaderServiceClass = downloaderService;
+ }
+
+ /**
* Class for interacting with the main interface of the service.
*/
- private ServiceConnection mConnection = new ServiceConnection() {
- public void onServiceConnected(ComponentName className, IBinder service) {
- // This is called when the connection with the service has been
- // established, giving us the object we can use to
- // interact with the service. We are communicating with the
- // service using a Messenger, so here we get a client-side
- // representation of that from the raw IBinder object.
- mServiceMessenger = new Messenger(service);
- mItf.onServiceConnected(
- mServiceMessenger);
- }
+ private ServiceConnection mConnection = new ServiceConnection() {
+ public void onServiceConnected(ComponentName className, IBinder service) {
+ // This is called when the connection with the service has been
+ // established, giving us the object we can use to
+ // interact with the service. We are communicating with the
+ // service using a Messenger, so here we get a client-side
+ // representation of that from the raw IBinder object.
+ mServiceMessenger = new Messenger(service);
+ mItf.onServiceConnected(
+ mServiceMessenger);
+ }
- public void onServiceDisconnected(ComponentName className) {
- // This is called when the connection with the service has been
- // unexpectedly disconnected -- that is, its process crashed.
- mServiceMessenger = null;
- }
- };
+ public void onServiceDisconnected(ComponentName className) {
+ // This is called when the connection with the service has been
+ // unexpectedly disconnected -- that is, its process crashed.
+ mServiceMessenger = null;
+ }
+ };
- @Override
- public void connect(Context c) {
- mContext = c;
- Intent bindIntent = new Intent(c, mDownloaderServiceClass);
- bindIntent.putExtra(PARAM_MESSENGER, mMessenger);
- if ( !c.bindService(bindIntent, mConnection, Context.BIND_DEBUG_UNBIND) ) {
- if ( Constants.LOGVV ) {
- Log.d(Constants.TAG, "Service Unbound");
- }
- } else {
- mBound = true;
- }
-
- }
+ @Override
+ public void connect(Context c) {
+ mContext = c;
+ Intent bindIntent = new Intent(c, mDownloaderServiceClass);
+ bindIntent.putExtra(PARAM_MESSENGER, mMessenger);
+ if (!c.bindService(bindIntent, mConnection, Context.BIND_DEBUG_UNBIND)) {
+ if (Constants.LOGVV) {
+ Log.d(Constants.TAG, "Service Unbound");
+ }
+ } else {
+ mBound = true;
+ }
+ }
- @Override
- public void disconnect(Context c) {
- if (mBound) {
- c.unbindService(mConnection);
- mBound = false;
- }
- mContext = null;
- }
+ @Override
+ public void disconnect(Context c) {
+ if (mBound) {
+ c.unbindService(mConnection);
+ mBound = false;
+ }
+ mContext = null;
+ }
- @Override
- public Messenger getMessenger() {
- return mMessenger;
- }
- }
+ @Override
+ public Messenger getMessenger() {
+ return mMessenger;
+ }
+ }
- /**
+ /**
* Returns a proxy that will marshal calls to IDownloaderClient methods
- *
+ *
* @param msg
* @return
*/
- public static IDownloaderClient CreateProxy(Messenger msg) {
- return new Proxy(msg);
- }
+ public static IDownloaderClient CreateProxy(Messenger msg) {
+ return new Proxy(msg);
+ }
- /**
+ /**
* Returns a stub object that, when connected, will listen for marshaled
* {@link IDownloaderClient} methods and translate them into calls to the supplied
* interface.
- *
+ *
* @param itf An implementation of IDownloaderClient that will be called
* when remote method calls are unmarshaled.
* @param downloaderService The class for your implementation of {@link
@@ -221,11 +235,11 @@ public class DownloaderClientMarshaller {
* @return The {@link IStub} that allows you to connect to the service such that
* your {@link IDownloaderClient} receives status updates.
*/
- public static IStub CreateStub(IDownloaderClient itf, Class<?> downloaderService) {
- return new Stub(itf, downloaderService);
- }
-
- /**
+ public static IStub CreateStub(IDownloaderClient itf, Class<?> downloaderService) {
+ return new Stub(itf, downloaderService);
+ }
+
+ /**
* Starts the download if necessary. This function starts a flow that does `
* many things. 1) Checks to see if the APK version has been checked and
* the metadata database updated 2) If the APK version does not match,
@@ -237,7 +251,7 @@ public class DownloaderClientMarshaller {
* to wait to hear about any updated APK expansion files. Note that this does
* mean that the application MUST be run for the first time with a network
* connection, even if Market delivers all of the files.
- *
+ *
* @param context Your application Context.
* @param notificationClient A PendingIntent to start the Activity in your application
* that shows the download progress and which will also start the application when download
@@ -248,30 +262,29 @@ public class DownloaderClientMarshaller {
* #DOWNLOAD_REQUIRED}.
* @throws NameNotFoundException
*/
- public static int startDownloadServiceIfRequired(Context context, PendingIntent notificationClient,
- Class<?> serviceClass)
- throws NameNotFoundException {
- return DownloaderService.startDownloadServiceIfRequired(context, notificationClient,
- serviceClass);
- }
-
- /**
+ public static int startDownloadServiceIfRequired(Context context, PendingIntent notificationClient,
+ Class<?> serviceClass)
+ throws NameNotFoundException {
+ return DownloaderService.startDownloadServiceIfRequired(context, notificationClient,
+ serviceClass);
+ }
+
+ /**
* This version assumes that the intent contains the pending intent as a parameter. This
* is used for responding to alarms.
- * <p>The pending intent must be in an extra with the key {@link
+ * <p>The pending intent must be in an extra with the key {@link
* impl.DownloaderService#EXTRA_PENDING_INTENT}.
- *
+ *
* @param context
* @param notificationClient
* @param serviceClass the class of the service to start
* @return
* @throws NameNotFoundException
*/
- public static int startDownloadServiceIfRequired(Context context, Intent notificationClient,
- Class<?> serviceClass)
- throws NameNotFoundException {
- return DownloaderService.startDownloadServiceIfRequired(context, notificationClient,
- serviceClass);
- }
-
+ public static int startDownloadServiceIfRequired(Context context, Intent notificationClient,
+ Class<?> serviceClass)
+ throws NameNotFoundException {
+ return DownloaderService.startDownloadServiceIfRequired(context, notificationClient,
+ serviceClass);
+ }
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderServiceMarshaller.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderServiceMarshaller.java
index 054eaa9895..f75debe32d 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderServiceMarshaller.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/DownloaderServiceMarshaller.java
@@ -25,7 +25,7 @@ import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
-
+import java.lang.ref.WeakReference;
/**
* This class is used by the client activity to proxy requests to the Downloader
@@ -38,144 +38,156 @@ import android.os.RemoteException;
*/
public class DownloaderServiceMarshaller {
- public static final int MSG_REQUEST_ABORT_DOWNLOAD =
- 1;
- public static final int MSG_REQUEST_PAUSE_DOWNLOAD =
- 2;
- public static final int MSG_SET_DOWNLOAD_FLAGS =
- 3;
- public static final int MSG_REQUEST_CONTINUE_DOWNLOAD =
- 4;
- public static final int MSG_REQUEST_DOWNLOAD_STATE =
- 5;
- public static final int MSG_REQUEST_CLIENT_UPDATE =
- 6;
-
- public static final String PARAMS_FLAGS = "flags";
- public static final String PARAM_MESSENGER = DownloaderService.EXTRA_MESSAGE_HANDLER;
-
- private static class Proxy implements IDownloaderService {
- private Messenger mMsg;
-
- private void send(int method, Bundle params) {
- Message m = Message.obtain(null, method);
- m.setData(params);
- try {
- mMsg.send(m);
- } catch (RemoteException e) {
- e.printStackTrace();
- }
- }
-
- public Proxy(Messenger msg) {
- mMsg = msg;
- }
-
- @Override
- public void requestAbortDownload() {
- send(MSG_REQUEST_ABORT_DOWNLOAD, new Bundle());
- }
-
- @Override
- public void requestPauseDownload() {
- send(MSG_REQUEST_PAUSE_DOWNLOAD, new Bundle());
- }
-
- @Override
- public void setDownloadFlags(int flags) {
- Bundle params = new Bundle();
- params.putInt(PARAMS_FLAGS, flags);
- send(MSG_SET_DOWNLOAD_FLAGS, params);
- }
-
- @Override
- public void requestContinueDownload() {
- send(MSG_REQUEST_CONTINUE_DOWNLOAD, new Bundle());
- }
-
- @Override
- public void requestDownloadStatus() {
- send(MSG_REQUEST_DOWNLOAD_STATE, new Bundle());
- }
-
- @Override
- public void onClientUpdated(Messenger clientMessenger) {
- Bundle bundle = new Bundle(1);
- bundle.putParcelable(PARAM_MESSENGER, clientMessenger);
- send(MSG_REQUEST_CLIENT_UPDATE, bundle);
- }
- }
-
- private static class Stub implements IStub {
- private IDownloaderService mItf = null;
- final Messenger mMessenger = new Messenger(new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_REQUEST_ABORT_DOWNLOAD:
- mItf.requestAbortDownload();
- break;
- case MSG_REQUEST_CONTINUE_DOWNLOAD:
- mItf.requestContinueDownload();
- break;
- case MSG_REQUEST_PAUSE_DOWNLOAD:
- mItf.requestPauseDownload();
- break;
- case MSG_SET_DOWNLOAD_FLAGS:
- mItf.setDownloadFlags(msg.getData().getInt(PARAMS_FLAGS));
- break;
- case MSG_REQUEST_DOWNLOAD_STATE:
- mItf.requestDownloadStatus();
- break;
- case MSG_REQUEST_CLIENT_UPDATE:
- mItf.onClientUpdated((Messenger) msg.getData().getParcelable(
- PARAM_MESSENGER));
- break;
- }
- }
- });
-
- public Stub(IDownloaderService itf) {
- mItf = itf;
- }
-
- @Override
- public Messenger getMessenger() {
- return mMessenger;
- }
-
- @Override
- public void connect(Context c) {
-
- }
-
- @Override
- public void disconnect(Context c) {
-
- }
- }
-
- /**
+ public static final int MSG_REQUEST_ABORT_DOWNLOAD =
+ 1;
+ public static final int MSG_REQUEST_PAUSE_DOWNLOAD =
+ 2;
+ public static final int MSG_SET_DOWNLOAD_FLAGS =
+ 3;
+ public static final int MSG_REQUEST_CONTINUE_DOWNLOAD =
+ 4;
+ public static final int MSG_REQUEST_DOWNLOAD_STATE =
+ 5;
+ public static final int MSG_REQUEST_CLIENT_UPDATE =
+ 6;
+
+ public static final String PARAMS_FLAGS = "flags";
+ public static final String PARAM_MESSENGER = DownloaderService.EXTRA_MESSAGE_HANDLER;
+
+ private static class Proxy implements IDownloaderService {
+ private Messenger mMsg;
+
+ private void send(int method, Bundle params) {
+ Message m = Message.obtain(null, method);
+ m.setData(params);
+ try {
+ mMsg.send(m);
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public Proxy(Messenger msg) {
+ mMsg = msg;
+ }
+
+ @Override
+ public void requestAbortDownload() {
+ send(MSG_REQUEST_ABORT_DOWNLOAD, new Bundle());
+ }
+
+ @Override
+ public void requestPauseDownload() {
+ send(MSG_REQUEST_PAUSE_DOWNLOAD, new Bundle());
+ }
+
+ @Override
+ public void setDownloadFlags(int flags) {
+ Bundle params = new Bundle();
+ params.putInt(PARAMS_FLAGS, flags);
+ send(MSG_SET_DOWNLOAD_FLAGS, params);
+ }
+
+ @Override
+ public void requestContinueDownload() {
+ send(MSG_REQUEST_CONTINUE_DOWNLOAD, new Bundle());
+ }
+
+ @Override
+ public void requestDownloadStatus() {
+ send(MSG_REQUEST_DOWNLOAD_STATE, new Bundle());
+ }
+
+ @Override
+ public void onClientUpdated(Messenger clientMessenger) {
+ Bundle bundle = new Bundle(1);
+ bundle.putParcelable(PARAM_MESSENGER, clientMessenger);
+ send(MSG_REQUEST_CLIENT_UPDATE, bundle);
+ }
+ }
+
+ private static class Stub implements IStub {
+ private IDownloaderService mItf = null;
+ private final MessengerHandlerServer mMsgHandler = new MessengerHandlerServer(this);
+ final Messenger mMessenger = new Messenger(mMsgHandler);
+
+ private static class MessengerHandlerServer extends Handler {
+ private final WeakReference<Stub> mDownloader;
+ public MessengerHandlerServer(Stub downloader) {
+ mDownloader = new WeakReference<>(downloader);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ Stub downloader = mDownloader.get();
+ if (downloader != null) {
+ downloader.handleMessage(msg);
+ }
+ }
+ }
+
+ private void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_REQUEST_ABORT_DOWNLOAD:
+ mItf.requestAbortDownload();
+ break;
+ case MSG_REQUEST_CONTINUE_DOWNLOAD:
+ mItf.requestContinueDownload();
+ break;
+ case MSG_REQUEST_PAUSE_DOWNLOAD:
+ mItf.requestPauseDownload();
+ break;
+ case MSG_SET_DOWNLOAD_FLAGS:
+ mItf.setDownloadFlags(msg.getData().getInt(PARAMS_FLAGS));
+ break;
+ case MSG_REQUEST_DOWNLOAD_STATE:
+ mItf.requestDownloadStatus();
+ break;
+ case MSG_REQUEST_CLIENT_UPDATE:
+ mItf.onClientUpdated((Messenger)msg.getData().getParcelable(
+ PARAM_MESSENGER));
+ break;
+ }
+ }
+
+ public Stub(IDownloaderService itf) {
+ mItf = itf;
+ }
+
+ @Override
+ public Messenger getMessenger() {
+ return mMessenger;
+ }
+
+ @Override
+ public void connect(Context c) {
+ }
+
+ @Override
+ public void disconnect(Context c) {
+ }
+ }
+
+ /**
* Returns a proxy that will marshall calls to IDownloaderService methods
- *
+ *
* @param ctx
* @return
*/
- public static IDownloaderService CreateProxy(Messenger msg) {
- return new Proxy(msg);
- }
+ public static IDownloaderService CreateProxy(Messenger msg) {
+ return new Proxy(msg);
+ }
- /**
+ /**
* Returns a stub object that, when connected, will listen for marshalled
* IDownloaderService methods and translate them into calls to the supplied
* interface.
- *
+ *
* @param itf An implementation of IDownloaderService that will be called
* when remote method calls are unmarshalled.
* @return
*/
- public static IStub CreateStub(IDownloaderService itf) {
- return new Stub(itf);
- }
-
+ public static IStub CreateStub(IDownloaderService itf) {
+ return new Stub(itf);
+ }
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/Helpers.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/Helpers.java
index fb56f917be..cd8726533f 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/Helpers.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/Helpers.java
@@ -16,8 +16,7 @@
package com.google.android.vending.expansion.downloader;
-import com.godot.game.R;
-
+import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.os.Environment;
@@ -25,6 +24,8 @@ import android.os.StatFs;
import android.os.SystemClock;
import android.util.Log;
+import com.godot.game.R;
+
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
@@ -39,273 +40,316 @@ import java.util.regex.Pattern;
*/
public class Helpers {
- public static Random sRandom = new Random(SystemClock.uptimeMillis());
+ public static Random sRandom = new Random(SystemClock.uptimeMillis());
- /** Regex used to parse content-disposition headers */
- private static final Pattern CONTENT_DISPOSITION_PATTERN = Pattern
- .compile("attachment;\\s*filename\\s*=\\s*\"([^\"]*)\"");
+ /** Regex used to parse content-disposition headers */
+ private static final Pattern CONTENT_DISPOSITION_PATTERN = Pattern
+ .compile("attachment;\\s*filename\\s*=\\s*\"([^\"]*)\"");
- private Helpers() {
- }
+ private Helpers() {
+ }
- /*
- * Parse the Content-Disposition HTTP Header. The format of the header is
- * defined here: http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html This
- * header provides a filename for content that is going to be downloaded to
- * the file system. We only support the attachment type.
+ /*
+ * Parse the Content-Disposition HTTP Header. The format of the header is defined here:
+ * http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html This header provides a filename for
+ * content that is going to be downloaded to the file system. We only support the attachment
+ * type.
*/
- static String parseContentDisposition(String contentDisposition) {
- try {
- Matcher m = CONTENT_DISPOSITION_PATTERN.matcher(contentDisposition);
- if (m.find()) {
- return m.group(1);
- }
- } catch (IllegalStateException ex) {
- // This function is defined as returning null when it can't parse
- // the header
- }
- return null;
- }
+ static String parseContentDisposition(String contentDisposition) {
+ try {
+ Matcher m = CONTENT_DISPOSITION_PATTERN.matcher(contentDisposition);
+ if (m.find()) {
+ return m.group(1);
+ }
+ } catch (IllegalStateException ex) {
+ // This function is defined as returning null when it can't parse
+ // the header
+ }
+ return null;
+ }
- /**
+ /**
* @return the root of the filesystem containing the given path
*/
- public static File getFilesystemRoot(String path) {
- File cache = Environment.getDownloadCacheDirectory();
- if (path.startsWith(cache.getPath())) {
- return cache;
- }
- File external = Environment.getExternalStorageDirectory();
- if (path.startsWith(external.getPath())) {
- return external;
- }
- throw new IllegalArgumentException(
- "Cannot determine filesystem root for " + path);
- }
+ public static File getFilesystemRoot(String path) {
+ File cache = Environment.getDownloadCacheDirectory();
+ if (path.startsWith(cache.getPath())) {
+ return cache;
+ }
+ File external = Environment.getExternalStorageDirectory();
+ if (path.startsWith(external.getPath())) {
+ return external;
+ }
+ throw new IllegalArgumentException(
+ "Cannot determine filesystem root for " + path);
+ }
- public static boolean isExternalMediaMounted() {
- if (!Environment.getExternalStorageState().equals(
- Environment.MEDIA_MOUNTED)) {
- // No SD card found.
- if ( Constants.LOGVV ) {
- Log.d(Constants.TAG, "no external storage");
- }
- return false;
- }
- return true;
- }
+ public static boolean isExternalMediaMounted() {
+ if (!Environment.getExternalStorageState().equals(
+ Environment.MEDIA_MOUNTED)) {
+ // No SD card found.
+ if (Constants.LOGVV) {
+ Log.d(Constants.TAG, "no external storage");
+ }
+ return false;
+ }
+ return true;
+ }
- /**
- * @return the number of bytes available on the filesystem rooted at the
- * given File
+ /**
+ * @return the number of bytes available on the filesystem rooted at the given File
*/
- public static long getAvailableBytes(File root) {
- StatFs stat = new StatFs(root.getPath());
- // put a bit of margin (in case creating the file grows the system by a
- // few blocks)
- long availableBlocks = (long) stat.getAvailableBlocks() - 4;
- return stat.getBlockSize() * availableBlocks;
- }
+ public static long getAvailableBytes(File root) {
+ StatFs stat = new StatFs(root.getPath());
+ // put a bit of margin (in case creating the file grows the system by a
+ // few blocks)
+ long availableBlocks = (long)stat.getAvailableBlocks() - 4;
+ return stat.getBlockSize() * availableBlocks;
+ }
- /**
+ /**
* Checks whether the filename looks legitimate
*/
- public static boolean isFilenameValid(String filename) {
- filename = filename.replaceFirst("/+", "/"); // normalize leading
- // slashes
- return filename.startsWith(Environment.getDownloadCacheDirectory().toString())
- || filename.startsWith(Environment.getExternalStorageDirectory().toString());
- }
+ public static boolean isFilenameValid(String filename) {
+ filename = filename.replaceFirst("/+", "/"); // normalize leading
+ // slashes
+ return filename.startsWith(Environment.getDownloadCacheDirectory().toString()) || filename.startsWith(Environment.getExternalStorageDirectory().toString());
+ }
- /*
+ /*
* Delete the given file from device
*/
- /* package */static void deleteFile(String path) {
- try {
- File file = new File(path);
- file.delete();
- } catch (Exception e) {
- Log.w(Constants.TAG, "file: '" + path + "' couldn't be deleted", e);
- }
- }
+ /* package */ static void deleteFile(String path) {
+ try {
+ File file = new File(path);
+ file.delete();
+ } catch (Exception e) {
+ Log.w(Constants.TAG, "file: '" + path + "' couldn't be deleted", e);
+ }
+ }
- /**
- * Showing progress in MB here. It would be nice to choose the unit (KB, MB,
- * GB) based on total file size, but given what we know about the expected
- * ranges of file sizes for APK expansion files, it's probably not necessary.
- *
+ /**
+ * Showing progress in MB here. It would be nice to choose the unit (KB, MB, GB) based on total
+ * file size, but given what we know about the expected ranges of file sizes for APK expansion
+ * files, it's probably not necessary.
+ *
* @param overallProgress
* @param overallTotal
* @return
*/
- static public String getDownloadProgressString(long overallProgress, long overallTotal) {
- if (overallTotal == 0) {
- if ( Constants.LOGVV ) {
- Log.e(Constants.TAG, "Notification called when total is zero");
- }
- return "";
- }
- return String.format("%.2f",
- (float) overallProgress / (1024.0f * 1024.0f))
- + "MB /" +
- String.format("%.2f", (float) overallTotal /
- (1024.0f * 1024.0f)) + "MB";
- }
+ static public String getDownloadProgressString(long overallProgress, long overallTotal) {
+ if (overallTotal == 0) {
+ if (Constants.LOGVV) {
+ Log.e(Constants.TAG, "Notification called when total is zero");
+ }
+ return "";
+ }
+ return String.format(Locale.ENGLISH, "%.2f",
+ (float)overallProgress / (1024.0f * 1024.0f)) +
+ "MB /" +
+ String.format(Locale.ENGLISH, "%.2f", (float)overallTotal / (1024.0f * 1024.0f)) + "MB";
+ }
- /**
+ /**
* Adds a percentile to getDownloadProgressString.
- *
+ *
* @param overallProgress
* @param overallTotal
* @return
*/
- static public String getDownloadProgressStringNotification(long overallProgress,
- long overallTotal) {
- if (overallTotal == 0) {
- if ( Constants.LOGVV ) {
- Log.e(Constants.TAG, "Notification called when total is zero");
- }
- return "";
- }
- return getDownloadProgressString(overallProgress, overallTotal) + " (" +
- getDownloadProgressPercent(overallProgress, overallTotal) + ")";
- }
+ static public String getDownloadProgressStringNotification(long overallProgress,
+ long overallTotal) {
+ if (overallTotal == 0) {
+ if (Constants.LOGVV) {
+ Log.e(Constants.TAG, "Notification called when total is zero");
+ }
+ return "";
+ }
+ return getDownloadProgressString(overallProgress, overallTotal) + " (" +
+ getDownloadProgressPercent(overallProgress, overallTotal) + ")";
+ }
- public static String getDownloadProgressPercent(long overallProgress, long overallTotal) {
- if (overallTotal == 0) {
- if ( Constants.LOGVV ) {
- Log.e(Constants.TAG, "Notification called when total is zero");
- }
- return "";
- }
- return Long.toString(overallProgress * 100 / overallTotal) + "%";
- }
+ public static String getDownloadProgressPercent(long overallProgress, long overallTotal) {
+ if (overallTotal == 0) {
+ if (Constants.LOGVV) {
+ Log.e(Constants.TAG, "Notification called when total is zero");
+ }
+ return "";
+ }
+ return Long.toString(overallProgress * 100 / overallTotal) + "%";
+ }
- public static String getSpeedString(float bytesPerMillisecond) {
- return String.format("%.2f", bytesPerMillisecond * 1000 / 1024);
- }
+ public static String getSpeedString(float bytesPerMillisecond) {
+ return String.format(Locale.ENGLISH, "%.2f", bytesPerMillisecond * 1000 / 1024);
+ }
- public static String getTimeRemaining(long durationInMilliseconds) {
- SimpleDateFormat sdf;
- if (durationInMilliseconds > 1000 * 60 * 60) {
- sdf = new SimpleDateFormat("HH:mm", Locale.getDefault());
- } else {
- sdf = new SimpleDateFormat("mm:ss", Locale.getDefault());
- }
- return sdf.format(new Date(durationInMilliseconds - TimeZone.getDefault().getRawOffset()));
- }
+ public static String getTimeRemaining(long durationInMilliseconds) {
+ SimpleDateFormat sdf;
+ if (durationInMilliseconds > 1000 * 60 * 60) {
+ sdf = new SimpleDateFormat("HH:mm", Locale.getDefault());
+ } else {
+ sdf = new SimpleDateFormat("mm:ss", Locale.getDefault());
+ }
+ return sdf.format(new Date(durationInMilliseconds - TimeZone.getDefault().getRawOffset()));
+ }
- /**
- * Returns the file name (without full path) for an Expansion APK file from
- * the given context.
- *
+ /**
+ * Returns the file name (without full path) for an Expansion APK file from the given context.
+ *
* @param c the context
* @param mainFile true for main file, false for patch file
* @param versionCode the version of the file
* @return String the file name of the expansion file
*/
- public static String getExpansionAPKFileName(Context c, boolean mainFile, int versionCode) {
- return (mainFile ? "main." : "patch.") + versionCode + "." + c.getPackageName() + ".obb";
- }
+ public static String getExpansionAPKFileName(Context c, boolean mainFile, int versionCode) {
+ return (mainFile ? "main." : "patch.") + versionCode + "." + c.getPackageName() + ".obb";
+ }
- /**
- * Returns the filename (where the file should be saved) from info about a
- * download
+ /**
+ * Returns the filename (where the file should be saved) from info about a download
*/
- static public String generateSaveFileName(Context c, String fileName) {
- String path = getSaveFilePath(c)
- + File.separator + fileName;
- return path;
- }
+ static public String generateSaveFileName(Context c, String fileName) {
+ String path = getSaveFilePath(c) + File.separator + fileName;
+ return path;
+ }
- static public String getSaveFilePath(Context c) {
- File root = Environment.getExternalStorageDirectory();
- // this makes several issues with Android SDK >= 23 devices.
- // https://github.com/danikula/Google-Play-Expansion-File/commit/93a03bd34acad67c6ea34cfb6c3f02c93bdcea85
- // https://issuetracker.google.com/issues/37075181
- //String path = Build.VERSION.SDK_INT >= 23 ? Constants.EXP_PATH_API23 : Constants.EXP_PATH;
- String path = Constants.EXP_PATH;
- return root.toString() + path + c.getPackageName();
- }
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+ static public String getSaveFilePath(Context c) {
+ // This technically existed since Honeycomb, but it is critical
+ // on KitKat and greater versions since it will create the
+ // directory if needed
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ return c.getObbDir().toString();
+ } else {
+ File root = Environment.getExternalStorageDirectory();
+ String path = root.toString() + Constants.EXP_PATH + c.getPackageName();
+ return path;
+ }
+ }
- /**
- * Helper function to ascertain the existence of a file and return
- * true/false appropriately
- *
+ /**
+ * Helper function to ascertain the existence of a file and return true/false appropriately
+ *
* @param c the app/activity/service context
* @param fileName the name (sans path) of the file to query
* @param fileSize the size that the file must match
- * @param deleteFileOnMismatch if the file sizes do not match, delete the
- * file
+ * @param deleteFileOnMismatch if the file sizes do not match, delete the file
+ * @return true if it does exist, false otherwise
+ */
+ static public boolean doesFileExist(Context c, String fileName, long fileSize,
+ boolean deleteFileOnMismatch) {
+ // the file may have been delivered by Play --- let's make sure
+ // it's the size we expect
+ File fileForNewFile = new File(Helpers.generateSaveFileName(c, fileName));
+ if (fileForNewFile.exists()) {
+ if (fileForNewFile.length() == fileSize) {
+ return true;
+ }
+ if (deleteFileOnMismatch) {
+ // delete the file --- we won't be able to resume
+ // because we cannot confirm the integrity of the file
+ fileForNewFile.delete();
+ }
+ }
+ return false;
+ }
+
+ public static final int FS_READABLE = 0;
+ public static final int FS_DOES_NOT_EXIST = 1;
+ public static final int FS_CANNOT_READ = 2;
+
+ /**
+ * Helper function to ascertain whether a file can be read.
+ *
+ * @param c the app/activity/service context
+ * @param fileName the name (sans path) of the file to query
* @return true if it does exist, false otherwise
*/
- static public boolean doesFileExist(Context c, String fileName, long fileSize,
- boolean deleteFileOnMismatch) {
- // the file may have been delivered by Market --- let's make sure
- // it's the size we expect
- File fileForNewFile = new File(Helpers.generateSaveFileName(c, fileName));
- if (fileForNewFile.exists()) {
- if (fileForNewFile.length() == fileSize) {
- return true;
- }
- if (deleteFileOnMismatch) {
- // delete the file --- we won't be able to resume
- // because we cannot confirm the integrity of the file
- fileForNewFile.delete();
- }
- }
- return false;
- }
+ static public int getFileStatus(Context c, String fileName) {
+ // the file may have been delivered by Play --- let's make sure
+ // it's the size we expect
+ File fileForNewFile = new File(Helpers.generateSaveFileName(c, fileName));
+ int returnValue;
+ if (fileForNewFile.exists()) {
+ if (fileForNewFile.canRead()) {
+ returnValue = FS_READABLE;
+ } else {
+ returnValue = FS_CANNOT_READ;
+ }
+ } else {
+ returnValue = FS_DOES_NOT_EXIST;
+ }
+ return returnValue;
+ }
+
+ /**
+ * Helper function to ascertain whether the application has the correct access to the OBB
+ * directory to allow an OBB file to be written.
+ *
+ * @param c the app/activity/service context
+ * @return true if the application can write an OBB file, false otherwise
+ */
+ static public boolean canWriteOBBFile(Context c) {
+ String path = getSaveFilePath(c);
+ File fileForNewFile = new File(path);
+ boolean canWrite;
+ if (fileForNewFile.exists()) {
+ canWrite = fileForNewFile.isDirectory() && fileForNewFile.canWrite();
+ } else {
+ canWrite = fileForNewFile.mkdirs();
+ }
+ return canWrite;
+ }
- /**
- * Converts download states that are returned by the {@link
- * IDownloaderClient#onDownloadStateChanged} callback into usable strings.
- * This is useful if using the state strings built into the library to display user messages.
+ /**
+ * Converts download states that are returned by the
+ * {@link IDownloaderClient#onDownloadStateChanged} callback into usable strings. This is useful
+ * if using the state strings built into the library to display user messages.
+ *
* @param state One of the STATE_* constants from {@link IDownloaderClient}.
* @return string resource ID for the corresponding string.
*/
- static public int getDownloaderStringResourceIDFromState(int state) {
- switch (state) {
- case IDownloaderClient.STATE_IDLE:
- return R.string.state_idle;
- case IDownloaderClient.STATE_FETCHING_URL:
- return R.string.state_fetching_url;
- case IDownloaderClient.STATE_CONNECTING:
- return R.string.state_connecting;
- case IDownloaderClient.STATE_DOWNLOADING:
- return R.string.state_downloading;
- case IDownloaderClient.STATE_COMPLETED:
- return R.string.state_completed;
- case IDownloaderClient.STATE_PAUSED_NETWORK_UNAVAILABLE:
- return R.string.state_paused_network_unavailable;
- case IDownloaderClient.STATE_PAUSED_BY_REQUEST:
- return R.string.state_paused_by_request;
- case IDownloaderClient.STATE_PAUSED_WIFI_DISABLED_NEED_CELLULAR_PERMISSION:
- return R.string.state_paused_wifi_disabled;
- case IDownloaderClient.STATE_PAUSED_NEED_CELLULAR_PERMISSION:
- return R.string.state_paused_wifi_unavailable;
- case IDownloaderClient.STATE_PAUSED_WIFI_DISABLED:
- return R.string.state_paused_wifi_disabled;
- case IDownloaderClient.STATE_PAUSED_NEED_WIFI:
- return R.string.state_paused_wifi_unavailable;
- case IDownloaderClient.STATE_PAUSED_ROAMING:
- return R.string.state_paused_roaming;
- case IDownloaderClient.STATE_PAUSED_NETWORK_SETUP_FAILURE:
- return R.string.state_paused_network_setup_failure;
- case IDownloaderClient.STATE_PAUSED_SDCARD_UNAVAILABLE:
- return R.string.state_paused_sdcard_unavailable;
- case IDownloaderClient.STATE_FAILED_UNLICENSED:
- return R.string.state_failed_unlicensed;
- case IDownloaderClient.STATE_FAILED_FETCHING_URL:
- return R.string.state_failed_fetching_url;
- case IDownloaderClient.STATE_FAILED_SDCARD_FULL:
- return R.string.state_failed_sdcard_full;
- case IDownloaderClient.STATE_FAILED_CANCELED:
- return R.string.state_failed_cancelled;
- default:
- return R.string.state_unknown;
- }
- }
-
+ static public int getDownloaderStringResourceIDFromState(int state) {
+ switch (state) {
+ case IDownloaderClient.STATE_IDLE:
+ return R.string.state_idle;
+ case IDownloaderClient.STATE_FETCHING_URL:
+ return R.string.state_fetching_url;
+ case IDownloaderClient.STATE_CONNECTING:
+ return R.string.state_connecting;
+ case IDownloaderClient.STATE_DOWNLOADING:
+ return R.string.state_downloading;
+ case IDownloaderClient.STATE_COMPLETED:
+ return R.string.state_completed;
+ case IDownloaderClient.STATE_PAUSED_NETWORK_UNAVAILABLE:
+ return R.string.state_paused_network_unavailable;
+ case IDownloaderClient.STATE_PAUSED_BY_REQUEST:
+ return R.string.state_paused_by_request;
+ case IDownloaderClient.STATE_PAUSED_WIFI_DISABLED_NEED_CELLULAR_PERMISSION:
+ return R.string.state_paused_wifi_disabled;
+ case IDownloaderClient.STATE_PAUSED_NEED_CELLULAR_PERMISSION:
+ return R.string.state_paused_wifi_unavailable;
+ case IDownloaderClient.STATE_PAUSED_WIFI_DISABLED:
+ return R.string.state_paused_wifi_disabled;
+ case IDownloaderClient.STATE_PAUSED_NEED_WIFI:
+ return R.string.state_paused_wifi_unavailable;
+ case IDownloaderClient.STATE_PAUSED_ROAMING:
+ return R.string.state_paused_roaming;
+ case IDownloaderClient.STATE_PAUSED_NETWORK_SETUP_FAILURE:
+ return R.string.state_paused_network_setup_failure;
+ case IDownloaderClient.STATE_PAUSED_SDCARD_UNAVAILABLE:
+ return R.string.state_paused_sdcard_unavailable;
+ case IDownloaderClient.STATE_FAILED_UNLICENSED:
+ return R.string.state_failed_unlicensed;
+ case IDownloaderClient.STATE_FAILED_FETCHING_URL:
+ return R.string.state_failed_fetching_url;
+ case IDownloaderClient.STATE_FAILED_SDCARD_FULL:
+ return R.string.state_failed_sdcard_full;
+ case IDownloaderClient.STATE_FAILED_CANCELED:
+ return R.string.state_failed_cancelled;
+ default:
+ return R.string.state_unknown;
+ }
+ }
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/IDownloaderClient.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/IDownloaderClient.java
index b8511a62a0..bae93f633a 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/IDownloaderClient.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/IDownloaderClient.java
@@ -23,26 +23,26 @@ import android.os.Messenger;
* downloader. It is used to pass status from the service to the client.
*/
public interface IDownloaderClient {
- static final int STATE_IDLE = 1;
- static final int STATE_FETCHING_URL = 2;
- static final int STATE_CONNECTING = 3;
- static final int STATE_DOWNLOADING = 4;
- static final int STATE_COMPLETED = 5;
+ static final int STATE_IDLE = 1;
+ static final int STATE_FETCHING_URL = 2;
+ static final int STATE_CONNECTING = 3;
+ static final int STATE_DOWNLOADING = 4;
+ static final int STATE_COMPLETED = 5;
- static final int STATE_PAUSED_NETWORK_UNAVAILABLE = 6;
- static final int STATE_PAUSED_BY_REQUEST = 7;
+ static final int STATE_PAUSED_NETWORK_UNAVAILABLE = 6;
+ static final int STATE_PAUSED_BY_REQUEST = 7;
- /**
+ /**
* Both STATE_PAUSED_WIFI_DISABLED_NEED_CELLULAR_PERMISSION and
* STATE_PAUSED_NEED_CELLULAR_PERMISSION imply that Wi-Fi is unavailable and
* cellular permission will restart the service. Wi-Fi disabled means that
* the Wi-Fi manager is returning that Wi-Fi is not enabled, while in the
* other case Wi-Fi is enabled but not available.
*/
- static final int STATE_PAUSED_WIFI_DISABLED_NEED_CELLULAR_PERMISSION = 8;
- static final int STATE_PAUSED_NEED_CELLULAR_PERMISSION = 9;
+ static final int STATE_PAUSED_WIFI_DISABLED_NEED_CELLULAR_PERMISSION = 8;
+ static final int STATE_PAUSED_NEED_CELLULAR_PERMISSION = 9;
- /**
+ /**
* Both STATE_PAUSED_WIFI_DISABLED and STATE_PAUSED_NEED_WIFI imply that
* Wi-Fi is unavailable and cellular permission will NOT restart the
* service. Wi-Fi disabled means that the Wi-Fi manager is returning that
@@ -53,27 +53,27 @@ public interface IDownloaderClient {
* developers with very large payloads do not allow these payloads to be
* downloaded over cellular connections.
*/
- static final int STATE_PAUSED_WIFI_DISABLED = 10;
- static final int STATE_PAUSED_NEED_WIFI = 11;
+ static final int STATE_PAUSED_WIFI_DISABLED = 10;
+ static final int STATE_PAUSED_NEED_WIFI = 11;
- static final int STATE_PAUSED_ROAMING = 12;
+ static final int STATE_PAUSED_ROAMING = 12;
- /**
+ /**
* Scary case. We were on a network that redirected us to another website
* that delivered us the wrong file.
*/
- static final int STATE_PAUSED_NETWORK_SETUP_FAILURE = 13;
+ static final int STATE_PAUSED_NETWORK_SETUP_FAILURE = 13;
- static final int STATE_PAUSED_SDCARD_UNAVAILABLE = 14;
+ static final int STATE_PAUSED_SDCARD_UNAVAILABLE = 14;
- static final int STATE_FAILED_UNLICENSED = 15;
- static final int STATE_FAILED_FETCHING_URL = 16;
- static final int STATE_FAILED_SDCARD_FULL = 17;
- static final int STATE_FAILED_CANCELED = 18;
+ static final int STATE_FAILED_UNLICENSED = 15;
+ static final int STATE_FAILED_FETCHING_URL = 16;
+ static final int STATE_FAILED_SDCARD_FULL = 17;
+ static final int STATE_FAILED_CANCELED = 18;
- static final int STATE_FAILED = 19;
+ static final int STATE_FAILED = 19;
- /**
+ /**
* Called internally by the stub when the service is bound to the client.
* <p>
* Critical implementation detail. In onServiceConnected we create the
@@ -86,13 +86,13 @@ public interface IDownloaderClient {
* instance of {@link IDownloaderService}, then call
* {@link IDownloaderService#onClientUpdated} with the Messenger retrieved
* from your {@link IStub} proxy object.
- *
+ *
* @param m the service Messenger. This Messenger is used to call the
* service API from the client.
*/
- void onServiceConnected(Messenger m);
+ void onServiceConnected(Messenger m);
- /**
+ /**
* Called when the download state changes. Depending on the state, there may
* be user requests. The service is free to change the download state in the
* middle of a user request, so the client should be able to handle this.
@@ -109,18 +109,18 @@ public interface IDownloaderClient {
* cellular connections with appropriate warnings. If the application
* suddenly starts downloading, the application should revert to showing the
* progress again, rather than leaving up the download over cellular UI up.
- *
+ *
* @param newState one of the STATE_* values defined in IDownloaderClient
*/
- void onDownloadStateChanged(int newState);
+ void onDownloadStateChanged(int newState);
- /**
+ /**
* Shows the download progress. This is intended to be used to fill out a
* client UI. This progress should only be shown in a few states such as
* STATE_DOWNLOADING.
- *
+ *
* @param progress the DownloadProgressInfo object containing the current
* progress of all downloads.
*/
- void onDownloadProgress(DownloadProgressInfo progress);
+ void onDownloadProgress(DownloadProgressInfo progress);
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/IDownloaderService.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/IDownloaderService.java
index 4789afe19c..a84fb32728 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/IDownloaderService.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/IDownloaderService.java
@@ -31,53 +31,53 @@ import android.os.Messenger;
* should immediately call {@link #onClientUpdated}.
*/
public interface IDownloaderService {
- /**
+ /**
* Set this flag in response to the
* IDownloaderClient.STATE_PAUSED_NEED_CELLULAR_PERMISSION state and then
* call RequestContinueDownload to resume a download
*/
- public static final int FLAGS_DOWNLOAD_OVER_CELLULAR = 1;
+ public static final int FLAGS_DOWNLOAD_OVER_CELLULAR = 1;
- /**
+ /**
* Request that the service abort the current download. The service should
* respond by changing the state to {@link IDownloaderClient.STATE_ABORTED}.
*/
- void requestAbortDownload();
+ void requestAbortDownload();
- /**
+ /**
* Request that the service pause the current download. The service should
* respond by changing the state to
* {@link IDownloaderClient.STATE_PAUSED_BY_REQUEST}.
*/
- void requestPauseDownload();
+ void requestPauseDownload();
- /**
+ /**
* Request that the service continue a paused download, when in any paused
* or failed state, including
* {@link IDownloaderClient.STATE_PAUSED_BY_REQUEST}.
*/
- void requestContinueDownload();
+ void requestContinueDownload();
- /**
+ /**
* Set the flags for this download (e.g.
* {@link DownloaderService.FLAGS_DOWNLOAD_OVER_CELLULAR}).
- *
+ *
* @param flags
*/
- void setDownloadFlags(int flags);
+ void setDownloadFlags(int flags);
- /**
+ /**
* Requests that the download status be sent to the client.
*/
- void requestDownloadStatus();
+ void requestDownloadStatus();
- /**
+ /**
* Call this when you get {@link
* IDownloaderClient.onServiceConnected(Messenger m)} from the
* DownloaderClient to register the client with the service. It will
* automatically send the current status to the client.
- *
+ *
* @param clientMessenger
*/
- void onClientUpdated(Messenger clientMessenger);
+ void onClientUpdated(Messenger clientMessenger);
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/IStub.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/IStub.java
index d5bc3a843e..dcdef1bfcf 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/IStub.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/IStub.java
@@ -33,9 +33,9 @@ import android.os.Messenger;
* {@link IDownloaderService#onClientUpdated}.
*/
public interface IStub {
- Messenger getMessenger();
+ Messenger getMessenger();
- void connect(Context c);
+ void connect(Context c);
- void disconnect(Context c);
+ void disconnect(Context c);
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/SystemFacade.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/SystemFacade.java
index 12edd97ab2..c5577d4c2a 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/SystemFacade.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/SystemFacade.java
@@ -16,6 +16,7 @@
package com.google.android.vending.expansion.downloader;
+import android.annotation.SuppressLint;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
@@ -30,94 +31,96 @@ import android.util.Log;
* Contains useful helper functions, typically tied to the application context.
*/
class SystemFacade {
- private Context mContext;
- private NotificationManager mNotificationManager;
-
- public SystemFacade(Context context) {
- mContext = context;
- mNotificationManager = (NotificationManager)
- mContext.getSystemService(Context.NOTIFICATION_SERVICE);
- }
-
- public long currentTimeMillis() {
- return System.currentTimeMillis();
- }
-
- public Integer getActiveNetworkType() {
- ConnectivityManager connectivity =
- (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
- if (connectivity == null) {
- Log.w(Constants.TAG, "couldn't get connectivity manager");
- return null;
- }
-
- NetworkInfo activeInfo = connectivity.getActiveNetworkInfo();
- if (activeInfo == null) {
- if (Constants.LOGVV) {
- Log.v(Constants.TAG, "network is not available");
- }
- return null;
- }
- return activeInfo.getType();
- }
-
- public boolean isNetworkRoaming() {
- ConnectivityManager connectivity =
- (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
- if (connectivity == null) {
- Log.w(Constants.TAG, "couldn't get connectivity manager");
- return false;
- }
-
- NetworkInfo info = connectivity.getActiveNetworkInfo();
- boolean isMobile = (info != null && info.getType() == ConnectivityManager.TYPE_MOBILE);
- TelephonyManager tm = (TelephonyManager) mContext
- .getSystemService(Context.TELEPHONY_SERVICE);
- if (null == tm) {
- Log.w(Constants.TAG, "couldn't get telephony manager");
- return false;
- }
- boolean isRoaming = isMobile && tm.isNetworkRoaming();
- if (Constants.LOGVV && isRoaming) {
- Log.v(Constants.TAG, "network is roaming");
- }
- return isRoaming;
- }
-
- public Long getMaxBytesOverMobile() {
- return (long) Integer.MAX_VALUE;
- }
-
- public Long getRecommendedMaxBytesOverMobile() {
- return 2097152L;
- }
-
- public void sendBroadcast(Intent intent) {
- mContext.sendBroadcast(intent);
- }
-
- public boolean userOwnsPackage(int uid, String packageName) throws NameNotFoundException {
- return mContext.getPackageManager().getApplicationInfo(packageName, 0).uid == uid;
- }
-
- public void postNotification(long id, Notification notification) {
- /**
+ private Context mContext;
+ private NotificationManager mNotificationManager;
+
+ public SystemFacade(Context context) {
+ mContext = context;
+ mNotificationManager = (NotificationManager)
+ mContext.getSystemService(Context.NOTIFICATION_SERVICE);
+ }
+
+ public long currentTimeMillis() {
+ return System.currentTimeMillis();
+ }
+
+ public Integer getActiveNetworkType() {
+ ConnectivityManager connectivity =
+ (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
+ if (connectivity == null) {
+ Log.w(Constants.TAG, "couldn't get connectivity manager");
+ return null;
+ }
+
+ @SuppressLint("MissingPermission")
+ NetworkInfo activeInfo = connectivity.getActiveNetworkInfo();
+ if (activeInfo == null) {
+ if (Constants.LOGVV) {
+ Log.v(Constants.TAG, "network is not available");
+ }
+ return null;
+ }
+ return activeInfo.getType();
+ }
+
+ public boolean isNetworkRoaming() {
+ ConnectivityManager connectivity =
+ (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
+ if (connectivity == null) {
+ Log.w(Constants.TAG, "couldn't get connectivity manager");
+ return false;
+ }
+
+ @SuppressLint("MissingPermission")
+ NetworkInfo info = connectivity.getActiveNetworkInfo();
+ boolean isMobile = (info != null && info.getType() == ConnectivityManager.TYPE_MOBILE);
+ TelephonyManager tm = (TelephonyManager)mContext
+ .getSystemService(Context.TELEPHONY_SERVICE);
+ if (null == tm) {
+ Log.w(Constants.TAG, "couldn't get telephony manager");
+ return false;
+ }
+ boolean isRoaming = isMobile && tm.isNetworkRoaming();
+ if (Constants.LOGVV && isRoaming) {
+ Log.v(Constants.TAG, "network is roaming");
+ }
+ return isRoaming;
+ }
+
+ public Long getMaxBytesOverMobile() {
+ return (long)Integer.MAX_VALUE;
+ }
+
+ public Long getRecommendedMaxBytesOverMobile() {
+ return 2097152L;
+ }
+
+ public void sendBroadcast(Intent intent) {
+ mContext.sendBroadcast(intent);
+ }
+
+ public boolean userOwnsPackage(int uid, String packageName) throws NameNotFoundException {
+ return mContext.getPackageManager().getApplicationInfo(packageName, 0).uid == uid;
+ }
+
+ public void postNotification(long id, Notification notification) {
+ /**
* TODO: The system notification manager takes ints, not longs, as IDs,
* but the download manager uses IDs take straight from the database,
* which are longs. This will have to be dealt with at some point.
*/
- mNotificationManager.notify((int) id, notification);
- }
+ mNotificationManager.notify((int)id, notification);
+ }
- public void cancelNotification(long id) {
- mNotificationManager.cancel((int) id);
- }
+ public void cancelNotification(long id) {
+ mNotificationManager.cancel((int)id);
+ }
- public void cancelAllNotifications() {
- mNotificationManager.cancelAll();
- }
+ public void cancelAllNotifications() {
+ mNotificationManager.cancelAll();
+ }
- public void startThread(Thread thread) {
- thread.start();
- }
+ public void startThread(Thread thread) {
+ thread.start();
+ }
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/AndroidHttpClient.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/AndroidHttpClient.java
deleted file mode 100644
index 4667acce67..0000000000
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/AndroidHttpClient.java
+++ /dev/null
@@ -1,536 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * This is a port of AndroidHttpClient to pre-Froyo devices, that takes advantage of
- * the SSLSessionCache added Froyo devices using reflection.
- */
-
-package com.google.android.vending.expansion.downloader.impl;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.net.URI;
-import java.util.zip.GZIPInputStream;
-import java.util.zip.GZIPOutputStream;
-
-import org.apache.http.Header;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpEntityEnclosingRequest;
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpRequestInterceptor;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.ResponseHandler;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.params.HttpClientParams;
-import org.apache.http.client.protocol.ClientContext;
-import org.apache.http.conn.ClientConnectionManager;
-import org.apache.http.conn.scheme.PlainSocketFactory;
-import org.apache.http.conn.scheme.Scheme;
-import org.apache.http.conn.scheme.SchemeRegistry;
-import org.apache.http.conn.scheme.SocketFactory;
-import org.apache.http.conn.ssl.SSLSocketFactory;
-import org.apache.http.entity.AbstractHttpEntity;
-import org.apache.http.entity.ByteArrayEntity;
-import org.apache.http.impl.client.DefaultHttpClient;
-import org.apache.http.impl.client.RequestWrapper;
-import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
-import org.apache.http.params.BasicHttpParams;
-import org.apache.http.params.HttpConnectionParams;
-import org.apache.http.params.HttpParams;
-import org.apache.http.params.HttpProtocolParams;
-import org.apache.http.protocol.BasicHttpContext;
-import org.apache.http.protocol.BasicHttpProcessor;
-import org.apache.http.protocol.HttpContext;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.net.SSLCertificateSocketFactory;
-import android.os.Looper;
-import android.util.Log;
-
-/**
- * Subclass of the Apache {@link DefaultHttpClient} that is configured with
- * reasonable default settings and registered schemes for Android, and
- * also lets the user add {@link HttpRequestInterceptor} classes.
- * Don't create this directly, use the {@link #newInstance} factory method.
- *
- * <p>This client processes cookies but does not retain them by default.
- * To retain cookies, simply add a cookie store to the HttpContext:</p>
- *
- * <pre>context.setAttribute(ClientContext.COOKIE_STORE, cookieStore);</pre>
- */
-public final class AndroidHttpClient implements HttpClient {
-
- static Class<?> sSslSessionCacheClass;
- static {
- // if we are on Froyo+ devices, we can take advantage of the SSLSessionCache
- try {
- sSslSessionCacheClass = Class.forName("android.net.SSLSessionCache");
- } catch (Exception e) {
-
- }
- }
-
- // Gzip of data shorter than this probably won't be worthwhile
- public static long DEFAULT_SYNC_MIN_GZIP_BYTES = 256;
-
- // Default connection and socket timeout of 60 seconds. Tweak to taste.
- private static final int SOCKET_OPERATION_TIMEOUT = 60 * 1000;
-
- private static final String TAG = "AndroidHttpClient";
-
-
- /** Interceptor throws an exception if the executing thread is blocked */
- private static final HttpRequestInterceptor sThreadCheckInterceptor =
- new HttpRequestInterceptor() {
- public void process(HttpRequest request, HttpContext context) {
- // Prevent the HttpRequest from being sent on the main thread
- if (Looper.myLooper() != null && Looper.myLooper() == Looper.getMainLooper() ) {
- throw new RuntimeException("This thread forbids HTTP requests");
- }
- }
- };
-
- /**
- * Create a new HttpClient with reasonable defaults (which you can update).
- *
- * @param userAgent to report in your HTTP requests
- * @param context to use for caching SSL sessions (may be null for no caching)
- * @return AndroidHttpClient for you to use for all your requests.
- */
- public static AndroidHttpClient newInstance(String userAgent, Context context) {
- HttpParams params = new BasicHttpParams();
-
- // Turn off stale checking. Our connections break all the time anyway,
- // and it's not worth it to pay the penalty of checking every time.
- HttpConnectionParams.setStaleCheckingEnabled(params, false);
-
- HttpConnectionParams.setConnectionTimeout(params, SOCKET_OPERATION_TIMEOUT);
- HttpConnectionParams.setSoTimeout(params, SOCKET_OPERATION_TIMEOUT);
- HttpConnectionParams.setSocketBufferSize(params, 8192);
-
- // Don't handle redirects -- return them to the caller. Our code
- // often wants to re-POST after a redirect, which we must do ourselves.
- HttpClientParams.setRedirecting(params, false);
-
- Object sessionCache = null;
- // Use a session cache for SSL sockets -- Froyo only
- if ( null != context && null != sSslSessionCacheClass ) {
- Constructor<?> ct;
- try {
- ct = sSslSessionCacheClass.getConstructor(Context.class);
- sessionCache = ct.newInstance(context);
- } catch (SecurityException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (NoSuchMethodException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IllegalArgumentException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (InstantiationException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
-
- // Set the specified user agent and register standard protocols.
- HttpProtocolParams.setUserAgent(params, userAgent);
- SchemeRegistry schemeRegistry = new SchemeRegistry();
- schemeRegistry.register(new Scheme("http",
- PlainSocketFactory.getSocketFactory(), 80));
- SocketFactory sslCertificateSocketFactory = null;
- if ( null != sessionCache ) {
- Method getHttpSocketFactoryMethod;
- try {
- getHttpSocketFactoryMethod = SSLCertificateSocketFactory.class.getDeclaredMethod("getHttpSocketFactory",Integer.TYPE, sSslSessionCacheClass);
- sslCertificateSocketFactory = (SocketFactory)getHttpSocketFactoryMethod.invoke(null, SOCKET_OPERATION_TIMEOUT, sessionCache);
- } catch (SecurityException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (NoSuchMethodException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IllegalArgumentException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- if ( null == sslCertificateSocketFactory ) {
- sslCertificateSocketFactory = SSLSocketFactory.getSocketFactory();
- }
- schemeRegistry.register(new Scheme("https",
- sslCertificateSocketFactory, 443));
-
- ClientConnectionManager manager =
- new ThreadSafeClientConnManager(params, schemeRegistry);
-
- // We use a factory method to modify superclass initialization
- // parameters without the funny call-a-static-method dance.
- return new AndroidHttpClient(manager, params);
- }
-
- /**
- * Create a new HttpClient with reasonable defaults (which you can update).
- * @param userAgent to report in your HTTP requests.
- * @return AndroidHttpClient for you to use for all your requests.
- */
- public static AndroidHttpClient newInstance(String userAgent) {
- return newInstance(userAgent, null /* session cache */);
- }
-
- private final HttpClient delegate;
-
- private RuntimeException mLeakedException = new IllegalStateException(
- "AndroidHttpClient created and never closed");
-
- private AndroidHttpClient(ClientConnectionManager ccm, HttpParams params) {
- this.delegate = new DefaultHttpClient(ccm, params) {
- @Override
- protected BasicHttpProcessor createHttpProcessor() {
- // Add interceptor to prevent making requests from main thread.
- BasicHttpProcessor processor = super.createHttpProcessor();
- processor.addRequestInterceptor(sThreadCheckInterceptor);
- processor.addRequestInterceptor(new CurlLogger());
-
- return processor;
- }
-
- @Override
- protected HttpContext createHttpContext() {
- // Same as DefaultHttpClient.createHttpContext() minus the
- // cookie store.
- HttpContext context = new BasicHttpContext();
- context.setAttribute(
- ClientContext.AUTHSCHEME_REGISTRY,
- getAuthSchemes());
- context.setAttribute(
- ClientContext.COOKIESPEC_REGISTRY,
- getCookieSpecs());
- context.setAttribute(
- ClientContext.CREDS_PROVIDER,
- getCredentialsProvider());
- return context;
- }
- };
- }
-
- @Override
- protected void finalize() throws Throwable {
- super.finalize();
- if (mLeakedException != null) {
- Log.e(TAG, "Leak found", mLeakedException);
- mLeakedException = null;
- }
- }
-
- /**
- * Modifies a request to indicate to the server that we would like a
- * gzipped response. (Uses the "Accept-Encoding" HTTP header.)
- * @param request the request to modify
- * @see #getUngzippedContent
- */
- public static void modifyRequestToAcceptGzipResponse(HttpRequest request) {
- request.addHeader("Accept-Encoding", "gzip");
- }
-
- /**
- * Gets the input stream from a response entity. If the entity is gzipped
- * then this will get a stream over the uncompressed data.
- *
- * @param entity the entity whose content should be read
- * @return the input stream to read from
- * @throws IOException
- */
- public static InputStream getUngzippedContent(HttpEntity entity)
- throws IOException {
- InputStream responseStream = entity.getContent();
- if (responseStream == null) return responseStream;
- Header header = entity.getContentEncoding();
- if (header == null) return responseStream;
- String contentEncoding = header.getValue();
- if (contentEncoding == null) return responseStream;
- if (contentEncoding.contains("gzip")) responseStream
- = new GZIPInputStream(responseStream);
- return responseStream;
- }
-
- /**
- * Release resources associated with this client. You must call this,
- * or significant resources (sockets and memory) may be leaked.
- */
- public void close() {
- if (mLeakedException != null) {
- getConnectionManager().shutdown();
- mLeakedException = null;
- }
- }
-
- public HttpParams getParams() {
- return delegate.getParams();
- }
-
- public ClientConnectionManager getConnectionManager() {
- return delegate.getConnectionManager();
- }
-
- public HttpResponse execute(HttpUriRequest request) throws IOException {
- return delegate.execute(request);
- }
-
- public HttpResponse execute(HttpUriRequest request, HttpContext context)
- throws IOException {
- return delegate.execute(request, context);
- }
-
- public HttpResponse execute(HttpHost target, HttpRequest request)
- throws IOException {
- return delegate.execute(target, request);
- }
-
- public HttpResponse execute(HttpHost target, HttpRequest request,
- HttpContext context) throws IOException {
- return delegate.execute(target, request, context);
- }
-
- public <T> T execute(HttpUriRequest request,
- ResponseHandler<? extends T> responseHandler)
- throws IOException, ClientProtocolException {
- return delegate.execute(request, responseHandler);
- }
-
- public <T> T execute(HttpUriRequest request,
- ResponseHandler<? extends T> responseHandler, HttpContext context)
- throws IOException, ClientProtocolException {
- return delegate.execute(request, responseHandler, context);
- }
-
- public <T> T execute(HttpHost target, HttpRequest request,
- ResponseHandler<? extends T> responseHandler) throws IOException,
- ClientProtocolException {
- return delegate.execute(target, request, responseHandler);
- }
-
- public <T> T execute(HttpHost target, HttpRequest request,
- ResponseHandler<? extends T> responseHandler, HttpContext context)
- throws IOException, ClientProtocolException {
- return delegate.execute(target, request, responseHandler, context);
- }
-
- /**
- * Compress data to send to server.
- * Creates a Http Entity holding the gzipped data.
- * The data will not be compressed if it is too short.
- * @param data The bytes to compress
- * @return Entity holding the data
- */
- public static AbstractHttpEntity getCompressedEntity(byte data[], ContentResolver resolver)
- throws IOException {
- AbstractHttpEntity entity;
- if (data.length < getMinGzipSize(resolver)) {
- entity = new ByteArrayEntity(data);
- } else {
- ByteArrayOutputStream arr = new ByteArrayOutputStream();
- OutputStream zipper = new GZIPOutputStream(arr);
- zipper.write(data);
- zipper.close();
- entity = new ByteArrayEntity(arr.toByteArray());
- entity.setContentEncoding("gzip");
- }
- return entity;
- }
-
- /**
- * Retrieves the minimum size for compressing data.
- * Shorter data will not be compressed.
- */
- public static long getMinGzipSize(ContentResolver resolver) {
- return DEFAULT_SYNC_MIN_GZIP_BYTES; // For now, this is just a constant.
- }
-
- /* cURL logging support. */
-
- /**
- * Logging tag and level.
- */
- private static class LoggingConfiguration {
-
- private final String tag;
- private final int level;
-
- private LoggingConfiguration(String tag, int level) {
- this.tag = tag;
- this.level = level;
- }
-
- /**
- * Returns true if logging is turned on for this configuration.
- */
- private boolean isLoggable() {
- return Log.isLoggable(tag, level);
- }
-
- /**
- * Prints a message using this configuration.
- */
- private void println(String message) {
- Log.println(level, tag, message);
- }
- }
-
- /** cURL logging configuration. */
- private volatile LoggingConfiguration curlConfiguration;
-
- /**
- * Enables cURL request logging for this client.
- *
- * @param name to log messages with
- * @param level at which to log messages (see {@link android.util.Log})
- */
- public void enableCurlLogging(String name, int level) {
- if (name == null) {
- throw new NullPointerException("name");
- }
- if (level < Log.VERBOSE || level > Log.ASSERT) {
- throw new IllegalArgumentException("Level is out of range ["
- + Log.VERBOSE + ".." + Log.ASSERT + "]");
- }
-
- curlConfiguration = new LoggingConfiguration(name, level);
- }
-
- /**
- * Disables cURL logging for this client.
- */
- public void disableCurlLogging() {
- curlConfiguration = null;
- }
-
- /**
- * Logs cURL commands equivalent to requests.
- */
- private class CurlLogger implements HttpRequestInterceptor {
- public void process(HttpRequest request, HttpContext context)
- throws HttpException, IOException {
- LoggingConfiguration configuration = curlConfiguration;
- if (configuration != null
- && configuration.isLoggable()
- && request instanceof HttpUriRequest) {
- // Never print auth token -- we used to check ro.secure=0 to
- // enable that, but can't do that in unbundled code.
- configuration.println(toCurl((HttpUriRequest) request, false));
- }
- }
- }
-
- /**
- * Generates a cURL command equivalent to the given request.
- */
- private static String toCurl(HttpUriRequest request, boolean logAuthToken) throws IOException {
- StringBuilder builder = new StringBuilder();
-
- builder.append("curl ");
-
- for (Header header: request.getAllHeaders()) {
- if (!logAuthToken
- && (header.getName().equals("Authorization") ||
- header.getName().equals("Cookie"))) {
- continue;
- }
- builder.append("--header \"");
- builder.append(header.toString().trim());
- builder.append("\" ");
- }
-
- URI uri = request.getURI();
-
- // If this is a wrapped request, use the URI from the original
- // request instead. getURI() on the wrapper seems to return a
- // relative URI. We want an absolute URI.
- if (request instanceof RequestWrapper) {
- HttpRequest original = ((RequestWrapper) request).getOriginal();
- if (original instanceof HttpUriRequest) {
- uri = ((HttpUriRequest) original).getURI();
- }
- }
-
- builder.append("\"");
- builder.append(uri);
- builder.append("\"");
-
- if (request instanceof HttpEntityEnclosingRequest) {
- HttpEntityEnclosingRequest entityRequest =
- (HttpEntityEnclosingRequest) request;
- HttpEntity entity = entityRequest.getEntity();
- if (entity != null && entity.isRepeatable()) {
- if (entity.getContentLength() < 1024) {
- ByteArrayOutputStream stream = new ByteArrayOutputStream();
- entity.writeTo(stream);
- String entityString = stream.toString();
-
- // TODO: Check the content type, too.
- builder.append(" --data-ascii \"")
- .append(entityString)
- .append("\"");
- } else {
- builder.append(" [TOO MUCH DATA TO INCLUDE]");
- }
- }
- }
-
- return builder.toString();
- }
-
- /**
- * Returns the date of the given HTTP date string. This method can identify
- * and parse the date formats emitted by common HTTP servers, such as
- * <a href="http://www.ietf.org/rfc/rfc0822.txt">RFC 822</a>,
- * <a href="http://www.ietf.org/rfc/rfc0850.txt">RFC 850</a>,
- * <a href="http://www.ietf.org/rfc/rfc1036.txt">RFC 1036</a>,
- * <a href="http://www.ietf.org/rfc/rfc1123.txt">RFC 1123</a> and
- * <a href="http://www.opengroup.org/onlinepubs/007908799/xsh/asctime.html">ANSI
- * C's asctime()</a>.
- *
- * @return the number of milliseconds since Jan. 1, 1970, midnight GMT.
- * @throws IllegalArgumentException if {@code dateString} is not a date or
- * of an unsupported format.
- */
- public static long parseDate(String dateString) {
- return HttpDateTime.parse(dateString);
- }
-} \ No newline at end of file
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/CustomIntentService.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/CustomIntentService.java
index b77af7e085..6346d7703a 100755
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/CustomIntentService.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/CustomIntentService.java
@@ -32,81 +32,80 @@ import android.util.Log;
* intent, it does not queue up batches of intents of the same type.
*/
public abstract class CustomIntentService extends Service {
- private String mName;
- private boolean mRedelivery;
- private volatile ServiceHandler mServiceHandler;
- private volatile Looper mServiceLooper;
- private static final String LOG_TAG = "CancellableIntentService";
- private static final int WHAT_MESSAGE = -10;
+ private String mName;
+ private boolean mRedelivery;
+ private volatile ServiceHandler mServiceHandler;
+ private volatile Looper mServiceLooper;
+ private static final String LOG_TAG = "CustomIntentService";
+ private static final int WHAT_MESSAGE = -10;
- public CustomIntentService(String paramString) {
- this.mName = paramString;
- }
+ public CustomIntentService(String paramString) {
+ this.mName = paramString;
+ }
- @Override
- public IBinder onBind(Intent paramIntent) {
- return null;
- }
+ @Override
+ public IBinder onBind(Intent paramIntent) {
+ return null;
+ }
- @Override
- public void onCreate() {
- super.onCreate();
- HandlerThread localHandlerThread = new HandlerThread("IntentService["
- + this.mName + "]");
- localHandlerThread.start();
- this.mServiceLooper = localHandlerThread.getLooper();
- this.mServiceHandler = new ServiceHandler(this.mServiceLooper);
- }
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ HandlerThread localHandlerThread = new HandlerThread("IntentService[" + this.mName + "]");
+ localHandlerThread.start();
+ this.mServiceLooper = localHandlerThread.getLooper();
+ this.mServiceHandler = new ServiceHandler(this.mServiceLooper);
+ }
- @Override
- public void onDestroy() {
- Thread localThread = this.mServiceLooper.getThread();
- if ((localThread != null) && (localThread.isAlive())) {
- localThread.interrupt();
- }
- this.mServiceLooper.quit();
- Log.d(LOG_TAG, "onDestroy");
- }
+ @Override
+ public void onDestroy() {
+ Thread localThread = this.mServiceLooper.getThread();
+ if ((localThread != null) && (localThread.isAlive())) {
+ localThread.interrupt();
+ }
+ this.mServiceLooper.quit();
+ Log.d(LOG_TAG, "onDestroy");
+ }
- protected abstract void onHandleIntent(Intent paramIntent);
+ protected abstract void onHandleIntent(Intent paramIntent);
- protected abstract boolean shouldStop();
+ protected abstract boolean shouldStop();
- @Override
- public void onStart(Intent paramIntent, int startId) {
- if (!this.mServiceHandler.hasMessages(WHAT_MESSAGE)) {
- Message localMessage = this.mServiceHandler.obtainMessage();
- localMessage.arg1 = startId;
- localMessage.obj = paramIntent;
- localMessage.what = WHAT_MESSAGE;
- this.mServiceHandler.sendMessage(localMessage);
- }
- }
+ @Override
+ public void onStart(Intent paramIntent, int startId) {
+ if (!this.mServiceHandler.hasMessages(WHAT_MESSAGE)) {
+ Message localMessage = this.mServiceHandler.obtainMessage();
+ localMessage.arg1 = startId;
+ localMessage.obj = paramIntent;
+ localMessage.what = WHAT_MESSAGE;
+ this.mServiceHandler.sendMessage(localMessage);
+ }
+ }
- @Override
- public int onStartCommand(Intent paramIntent, int flags, int startId) {
- onStart(paramIntent, startId);
- return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
- }
+ @Override
+ public int onStartCommand(Intent paramIntent, int flags, int startId) {
+ onStart(paramIntent, startId);
+ return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
+ }
- public void setIntentRedelivery(boolean enabled) {
- this.mRedelivery = enabled;
- }
+ public void setIntentRedelivery(boolean enabled) {
+ this.mRedelivery = enabled;
+ }
- private final class ServiceHandler extends Handler {
- public ServiceHandler(Looper looper) {
- super(looper);
- }
+ private final class ServiceHandler extends Handler {
+ public ServiceHandler(Looper looper) {
+ super(looper);
+ }
- @Override
- public void handleMessage(Message paramMessage) {
- CustomIntentService.this
- .onHandleIntent((Intent) paramMessage.obj);
- if (shouldStop()) {
- Log.d(LOG_TAG, "stopSelf");
- CustomIntentService.this.stopSelf(paramMessage.arg1);
- Log.d(LOG_TAG, "afterStopSelf");
- }
- }
- }
+ @Override
+ public void handleMessage(Message paramMessage) {
+ CustomIntentService.this
+ .onHandleIntent((Intent)paramMessage.obj);
+ if (shouldStop()) {
+ Log.d(LOG_TAG, "stopSelf");
+ CustomIntentService.this.stopSelf(paramMessage.arg1);
+ Log.d(LOG_TAG, "afterStopSelf");
+ }
+ }
+ }
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/CustomNotificationFactory.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/CustomNotificationFactory.java
deleted file mode 100644
index e2673a9dd7..0000000000
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/CustomNotificationFactory.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.android.vending.expansion.downloader.impl;
-
-/**
- * Uses the class-loader model to utilize the updated notification builders in
- * Honeycomb while maintaining a compatible version for older devices.
- */
-public class CustomNotificationFactory {
- static public DownloadNotification.ICustomNotification createCustomNotification() {
- if (android.os.Build.VERSION.SDK_INT > 13)
- return new V14CustomNotification();
- else
- throw new RuntimeException();
- }
-}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadInfo.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadInfo.java
index 45111b16a3..0e72b7ae77 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadInfo.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadInfo.java
@@ -25,68 +25,68 @@ import android.util.Log;
* Representation of information about an individual download from the database.
*/
public class DownloadInfo {
- public String mUri;
- public final int mIndex;
- public final String mFileName;
- public String mETag;
- public long mTotalBytes;
- public long mCurrentBytes;
- public long mLastMod;
- public int mStatus;
- public int mControl;
- public int mNumFailed;
- public int mRetryAfter;
- public int mRedirectCount;
+ public String mUri;
+ public final int mIndex;
+ public final String mFileName;
+ public String mETag;
+ public long mTotalBytes;
+ public long mCurrentBytes;
+ public long mLastMod;
+ public int mStatus;
+ public int mControl;
+ public int mNumFailed;
+ public int mRetryAfter;
+ public int mRedirectCount;
- boolean mInitialized;
+ boolean mInitialized;
- public int mFuzz;
+ public int mFuzz;
- public DownloadInfo(int index, String fileName, String pkg) {
- mFuzz = Helpers.sRandom.nextInt(1001);
- mFileName = fileName;
- mIndex = index;
- }
+ public DownloadInfo(int index, String fileName, String pkg) {
+ mFuzz = Helpers.sRandom.nextInt(1001);
+ mFileName = fileName;
+ mIndex = index;
+ }
- public void resetDownload() {
- mCurrentBytes = 0;
- mETag = "";
- mLastMod = 0;
- mStatus = 0;
- mControl = 0;
- mNumFailed = 0;
- mRetryAfter = 0;
- mRedirectCount = 0;
- }
+ public void resetDownload() {
+ mCurrentBytes = 0;
+ mETag = "";
+ mLastMod = 0;
+ mStatus = 0;
+ mControl = 0;
+ mNumFailed = 0;
+ mRetryAfter = 0;
+ mRedirectCount = 0;
+ }
- /**
+ /**
* Returns the time when a download should be restarted.
*/
- public long restartTime(long now) {
- if (mNumFailed == 0) {
- return now;
- }
- if (mRetryAfter > 0) {
- return mLastMod + mRetryAfter;
- }
- return mLastMod +
- Constants.RETRY_FIRST_DELAY *
- (1000 + mFuzz) * (1 << (mNumFailed - 1));
- }
+ public long restartTime(long now) {
+ if (mNumFailed == 0) {
+ return now;
+ }
+ if (mRetryAfter > 0) {
+ return mLastMod + mRetryAfter;
+ }
+ return mLastMod +
+ Constants.RETRY_FIRST_DELAY *
+ (1000 + mFuzz) * (1 << (mNumFailed - 1));
+ }
- public void logVerboseInfo() {
- Log.v(Constants.TAG, "Service adding new entry");
- Log.v(Constants.TAG, "FILENAME: " + mFileName);
- Log.v(Constants.TAG, "URI : " + mUri);
- Log.v(Constants.TAG, "FILENAME: " + mFileName);
- Log.v(Constants.TAG, "CONTROL : " + mControl);
- Log.v(Constants.TAG, "STATUS : " + mStatus);
- Log.v(Constants.TAG, "FAILED_C: " + mNumFailed);
- Log.v(Constants.TAG, "RETRY_AF: " + mRetryAfter);
- Log.v(Constants.TAG, "REDIRECT: " + mRedirectCount);
- Log.v(Constants.TAG, "LAST_MOD: " + mLastMod);
- Log.v(Constants.TAG, "TOTAL : " + mTotalBytes);
- Log.v(Constants.TAG, "CURRENT : " + mCurrentBytes);
- Log.v(Constants.TAG, "ETAG : " + mETag);
- }
+ public void logVerboseInfo() {
+ Log.v(Constants.TAG, "Service adding new entry");
+ Log.v(Constants.TAG, "FILENAME: " + mFileName);
+ Log.v(Constants.TAG, "URI : " + mUri);
+ Log.v(Constants.TAG, "FILENAME: " + mFileName);
+ Log.v(Constants.TAG, "CONTROL : " + mControl);
+ Log.v(Constants.TAG, "STATUS : " + mStatus);
+ Log.v(Constants.TAG, "FAILED_C: " + mNumFailed);
+ Log.v(Constants.TAG, "RETRY_AF: " + mRetryAfter);
+ Log.v(Constants.TAG, "REDIRECT: " + mRedirectCount);
+ Log.v(Constants.TAG, "LAST_MOD: " + mLastMod);
+ Log.v(Constants.TAG, "TOTAL : " + mTotalBytes);
+ Log.v(Constants.TAG, "CURRENT : " + mCurrentBytes);
+ Log.v(Constants.TAG, "ETAG : " + mETag);
+ }
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadNotification.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadNotification.java
index a9f674803c..099e3f05b3 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadNotification.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadNotification.java
@@ -22,11 +22,12 @@ import com.google.android.vending.expansion.downloader.DownloaderClientMarshalle
import com.google.android.vending.expansion.downloader.Helpers;
import com.google.android.vending.expansion.downloader.IDownloaderClient;
-import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
+import android.os.Build;
import android.os.Messenger;
+import android.support.v4.app.NotificationCompat;
/**
* This class handles displaying the notification associated with the download
@@ -41,190 +42,183 @@ import android.os.Messenger;
*/
public class DownloadNotification implements IDownloaderClient {
- private int mState;
- private final Context mContext;
- private final NotificationManager mNotificationManager;
- private String mCurrentTitle;
-
- private IDownloaderClient mClientProxy;
- final ICustomNotification mCustomNotification;
- private Notification.Builder mNotificationBuilder;
- private Notification.Builder mCurrentNotificationBuilder;
- private CharSequence mLabel;
- private String mCurrentText;
- private PendingIntent mContentIntent;
- private DownloadProgressInfo mProgressInfo;
-
- static final String LOGTAG = "DownloadNotification";
- static final int NOTIFICATION_ID = LOGTAG.hashCode();
-
- public PendingIntent getClientIntent() {
- return mContentIntent;
- }
-
- public void setClientIntent(PendingIntent mClientIntent) {
- this.mContentIntent = mClientIntent;
- }
-
- public void resendState() {
- if (null != mClientProxy) {
- mClientProxy.onDownloadStateChanged(mState);
- }
- }
-
- @Override
- public void onDownloadStateChanged(int newState) {
- if (null != mClientProxy) {
- mClientProxy.onDownloadStateChanged(newState);
- }
- if (newState != mState) {
- mState = newState;
- if (newState == IDownloaderClient.STATE_IDLE || null == mContentIntent) {
- return;
- }
- int stringDownloadID;
- int iconResource;
- boolean ongoingEvent;
-
- // get the new title string and paused text
- switch (newState) {
- case 0:
- iconResource = android.R.drawable.stat_sys_warning;
- stringDownloadID = R.string.state_unknown;
- ongoingEvent = false;
- break;
-
- case IDownloaderClient.STATE_DOWNLOADING:
- iconResource = android.R.drawable.stat_sys_download;
- stringDownloadID = Helpers.getDownloaderStringResourceIDFromState(newState);
- ongoingEvent = true;
- break;
-
- case IDownloaderClient.STATE_FETCHING_URL:
- case IDownloaderClient.STATE_CONNECTING:
- iconResource = android.R.drawable.stat_sys_download_done;
- stringDownloadID = Helpers.getDownloaderStringResourceIDFromState(newState);
- ongoingEvent = true;
- break;
-
- case IDownloaderClient.STATE_COMPLETED:
- case IDownloaderClient.STATE_PAUSED_BY_REQUEST:
- iconResource = android.R.drawable.stat_sys_download_done;
- stringDownloadID = Helpers.getDownloaderStringResourceIDFromState(newState);
- ongoingEvent = false;
- break;
-
- case IDownloaderClient.STATE_FAILED:
- case IDownloaderClient.STATE_FAILED_CANCELED:
- case IDownloaderClient.STATE_FAILED_FETCHING_URL:
- case IDownloaderClient.STATE_FAILED_SDCARD_FULL:
- case IDownloaderClient.STATE_FAILED_UNLICENSED:
- iconResource = android.R.drawable.stat_sys_warning;
- stringDownloadID = Helpers.getDownloaderStringResourceIDFromState(newState);
- ongoingEvent = false;
- break;
-
- default:
- iconResource = android.R.drawable.stat_sys_warning;
- stringDownloadID = Helpers.getDownloaderStringResourceIDFromState(newState);
- ongoingEvent = true;
- break;
- }
- mCurrentText = mContext.getString(stringDownloadID);
- mCurrentTitle = mLabel.toString();
- mCurrentNotificationBuilder.setTicker(mLabel + ": " + mCurrentText);
- mCurrentNotificationBuilder.setSmallIcon(iconResource);
- mCurrentNotificationBuilder.setContentTitle(mCurrentTitle);
- mCurrentNotificationBuilder.setContentText(mCurrentText);
- mCurrentNotificationBuilder.setContentIntent(mContentIntent);
- mCurrentNotificationBuilder.setOngoing(ongoingEvent);
- mCurrentNotificationBuilder.setAutoCancel(!ongoingEvent);
- mNotificationManager.notify(NOTIFICATION_ID, mCurrentNotificationBuilder.build());
- }
- }
-
- @Override
- public void onDownloadProgress(DownloadProgressInfo progress) {
- mProgressInfo = progress;
- if (null != mClientProxy) {
- mClientProxy.onDownloadProgress(progress);
- }
- if (progress.mOverallTotal <= 0) {
- // we just show the text
- mNotificationBuilder.setTicker(mCurrentTitle);
- mNotificationBuilder.setSmallIcon(android.R.drawable.stat_sys_download);
- mNotificationBuilder.setContentTitle(mCurrentTitle);
- mNotificationBuilder.setContentText(mCurrentText);
- mNotificationBuilder.setContentIntent(mContentIntent);
- mCurrentNotificationBuilder = mNotificationBuilder;
- } else {
- mCustomNotification.setCurrentBytes(progress.mOverallProgress);
- mCustomNotification.setTotalBytes(progress.mOverallTotal);
- mCustomNotification.setIcon(android.R.drawable.stat_sys_download);
- mCustomNotification.setPendingIntent(mContentIntent);
- mCustomNotification.setTicker(mLabel + ": " + mCurrentText);
- mCustomNotification.setTitle(mLabel);
- mCustomNotification.setTimeRemaining(progress.mTimeRemaining);
- mCurrentNotificationBuilder = mCustomNotification.updateNotification(mContext);
- }
- mNotificationManager.notify(NOTIFICATION_ID, mCurrentNotificationBuilder.build());
- }
-
- public interface ICustomNotification {
- void setTitle(CharSequence title);
-
- void setTicker(CharSequence ticker);
-
- void setPendingIntent(PendingIntent mContentIntent);
-
- void setTotalBytes(long totalBytes);
-
- void setCurrentBytes(long currentBytes);
-
- void setIcon(int iconResource);
-
- void setTimeRemaining(long timeRemaining);
-
- Notification.Builder updateNotification(Context c);
- }
-
- /**
+ private int mState;
+ private final Context mContext;
+ private final NotificationManager mNotificationManager;
+ private CharSequence mCurrentTitle;
+
+ private IDownloaderClient mClientProxy;
+ private NotificationCompat.Builder mActiveDownloadBuilder;
+ private NotificationCompat.Builder mBuilder;
+ private NotificationCompat.Builder mCurrentBuilder;
+ private CharSequence mLabel;
+ private String mCurrentText;
+ private DownloadProgressInfo mProgressInfo;
+ private PendingIntent mContentIntent;
+
+ static final String LOGTAG = "DownloadNotification";
+ static final int NOTIFICATION_ID = LOGTAG.hashCode();
+
+ public PendingIntent getClientIntent() {
+ return mContentIntent;
+ }
+
+ public void setClientIntent(PendingIntent clientIntent) {
+ this.mBuilder.setContentIntent(clientIntent);
+ this.mActiveDownloadBuilder.setContentIntent(clientIntent);
+ this.mContentIntent = clientIntent;
+ }
+
+ public void resendState() {
+ if (null != mClientProxy) {
+ mClientProxy.onDownloadStateChanged(mState);
+ }
+ }
+
+ @Override
+ public void onDownloadStateChanged(int newState) {
+ if (null != mClientProxy) {
+ mClientProxy.onDownloadStateChanged(newState);
+ }
+ if (newState != mState) {
+ mState = newState;
+ if (newState == IDownloaderClient.STATE_IDLE || null == mContentIntent) {
+ return;
+ }
+ int stringDownloadID;
+ int iconResource;
+ boolean ongoingEvent;
+
+ // get the new title string and paused text
+ switch (newState) {
+ case 0:
+ iconResource = android.R.drawable.stat_sys_warning;
+ stringDownloadID = R.string.state_unknown;
+ ongoingEvent = false;
+ break;
+
+ case IDownloaderClient.STATE_DOWNLOADING:
+ iconResource = android.R.drawable.stat_sys_download;
+ stringDownloadID = Helpers.getDownloaderStringResourceIDFromState(newState);
+ ongoingEvent = true;
+ break;
+
+ case IDownloaderClient.STATE_FETCHING_URL:
+ case IDownloaderClient.STATE_CONNECTING:
+ iconResource = android.R.drawable.stat_sys_download_done;
+ stringDownloadID = Helpers.getDownloaderStringResourceIDFromState(newState);
+ ongoingEvent = true;
+ break;
+
+ case IDownloaderClient.STATE_COMPLETED:
+ case IDownloaderClient.STATE_PAUSED_BY_REQUEST:
+ iconResource = android.R.drawable.stat_sys_download_done;
+ stringDownloadID = Helpers.getDownloaderStringResourceIDFromState(newState);
+ ongoingEvent = false;
+ break;
+
+ case IDownloaderClient.STATE_FAILED:
+ case IDownloaderClient.STATE_FAILED_CANCELED:
+ case IDownloaderClient.STATE_FAILED_FETCHING_URL:
+ case IDownloaderClient.STATE_FAILED_SDCARD_FULL:
+ case IDownloaderClient.STATE_FAILED_UNLICENSED:
+ iconResource = android.R.drawable.stat_sys_warning;
+ stringDownloadID = Helpers.getDownloaderStringResourceIDFromState(newState);
+ ongoingEvent = false;
+ break;
+
+ default:
+ iconResource = android.R.drawable.stat_sys_warning;
+ stringDownloadID = Helpers.getDownloaderStringResourceIDFromState(newState);
+ ongoingEvent = true;
+ break;
+ }
+
+ mCurrentText = mContext.getString(stringDownloadID);
+ mCurrentTitle = mLabel;
+ mCurrentBuilder.setTicker(mLabel + ": " + mCurrentText);
+ mCurrentBuilder.setSmallIcon(iconResource);
+ mCurrentBuilder.setContentTitle(mCurrentTitle);
+ mCurrentBuilder.setContentText(mCurrentText);
+ if (ongoingEvent) {
+ mCurrentBuilder.setOngoing(true);
+ } else {
+ mCurrentBuilder.setOngoing(false);
+ mCurrentBuilder.setAutoCancel(true);
+ }
+ mNotificationManager.notify(NOTIFICATION_ID, mCurrentBuilder.build());
+ }
+ }
+
+ @Override
+ public void onDownloadProgress(DownloadProgressInfo progress) {
+ mProgressInfo = progress;
+ if (null != mClientProxy) {
+ mClientProxy.onDownloadProgress(progress);
+ }
+ if (progress.mOverallTotal <= 0) {
+ // we just show the text
+ mBuilder.setTicker(mCurrentTitle);
+ mBuilder.setSmallIcon(android.R.drawable.stat_sys_download);
+ mBuilder.setContentTitle(mCurrentTitle);
+ mBuilder.setContentText(mCurrentText);
+ mCurrentBuilder = mBuilder;
+ } else {
+ mActiveDownloadBuilder.setProgress((int)progress.mOverallTotal, (int)progress.mOverallProgress, false);
+ mActiveDownloadBuilder.setContentText(Helpers.getDownloadProgressString(progress.mOverallProgress, progress.mOverallTotal));
+ mActiveDownloadBuilder.setSmallIcon(android.R.drawable.stat_sys_download);
+ mActiveDownloadBuilder.setTicker(mLabel + ": " + mCurrentText);
+ mActiveDownloadBuilder.setContentTitle(mLabel);
+ mActiveDownloadBuilder.setContentInfo(mContext.getString(R.string.time_remaining_notification,
+ Helpers.getTimeRemaining(progress.mTimeRemaining)));
+ mCurrentBuilder = mActiveDownloadBuilder;
+ }
+ mNotificationManager.notify(NOTIFICATION_ID, mCurrentBuilder.build());
+ }
+
+ /**
* Called in response to onClientUpdated. Creates a new proxy and notifies
* it of the current state.
- *
+ *
* @param msg the client Messenger to notify
*/
- public void setMessenger(Messenger msg) {
- mClientProxy = DownloaderClientMarshaller.CreateProxy(msg);
- if (null != mProgressInfo) {
- mClientProxy.onDownloadProgress(mProgressInfo);
- }
- if (mState != -1) {
- mClientProxy.onDownloadStateChanged(mState);
- }
- }
-
- /**
+ public void setMessenger(Messenger msg) {
+ mClientProxy = DownloaderClientMarshaller.CreateProxy(msg);
+ if (null != mProgressInfo) {
+ mClientProxy.onDownloadProgress(mProgressInfo);
+ }
+ if (mState != -1) {
+ mClientProxy.onDownloadStateChanged(mState);
+ }
+ }
+
+ /**
* Constructor
- *
+ *
* @param ctx The context to use to obtain access to the Notification
* Service
*/
- DownloadNotification(Context ctx, CharSequence applicationLabel) {
- mState = -1;
- mContext = ctx;
- mLabel = applicationLabel;
- mNotificationManager = (NotificationManager)
- mContext.getSystemService(Context.NOTIFICATION_SERVICE);
- mCustomNotification = CustomNotificationFactory
- .createCustomNotification();
- mNotificationBuilder = new Notification.Builder(ctx);
- mCurrentNotificationBuilder = mNotificationBuilder;
-
- }
-
- @Override
- public void onServiceConnected(Messenger m) {
- }
-
+ DownloadNotification(Context ctx, CharSequence applicationLabel) {
+ mState = -1;
+ mContext = ctx;
+ mLabel = applicationLabel;
+ mNotificationManager = (NotificationManager)
+ mContext.getSystemService(Context.NOTIFICATION_SERVICE);
+ mActiveDownloadBuilder = new NotificationCompat.Builder(ctx);
+ mBuilder = new NotificationCompat.Builder(ctx);
+
+ // Set Notification category and priorities to something that makes sense for a long
+ // lived background task.
+ mActiveDownloadBuilder.setPriority(NotificationCompat.PRIORITY_LOW);
+ mActiveDownloadBuilder.setCategory(NotificationCompat.CATEGORY_PROGRESS);
+
+ mBuilder.setPriority(NotificationCompat.PRIORITY_LOW);
+ mBuilder.setCategory(NotificationCompat.CATEGORY_PROGRESS);
+
+ mCurrentBuilder = mBuilder;
+ }
+
+ @Override
+ public void onServiceConnected(Messenger m) {
+ }
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadThread.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadThread.java
index 056d1eca0b..2fa146408b 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadThread.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadThread.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,14 +20,7 @@ import com.google.android.vending.expansion.downloader.Constants;
import com.google.android.vending.expansion.downloader.Helpers;
import com.google.android.vending.expansion.downloader.IDownloaderClient;
-import org.apache.http.Header;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.conn.params.ConnRouteParams;
-
import android.content.Context;
-import android.net.Proxy;
import android.os.PowerManager;
import android.os.Process;
import android.util.Log;
@@ -38,8 +31,8 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.SyncFailedException;
-import java.net.URI;
-import java.net.URISyntaxException;
+import java.net.HttpURLConnection;
+import java.net.URL;
import java.util.Locale;
/**
@@ -47,917 +40,794 @@ import java.util.Locale;
*/
public class DownloadThread {
- private Context mContext;
- private DownloadInfo mInfo;
- private DownloaderService mService;
- private final DownloadsDB mDB;
- private final DownloadNotification mNotification;
- private String mUserAgent;
-
- public DownloadThread(DownloadInfo info, DownloaderService service,
- DownloadNotification notification) {
- mContext = service;
- mInfo = info;
- mService = service;
- mNotification = notification;
- mDB = DownloadsDB.getDB(service);
- mUserAgent = "APKXDL (Linux; U; Android " + android.os.Build.VERSION.RELEASE + ";"
- + Locale.getDefault().toString() + "; " + android.os.Build.DEVICE + "/"
- + android.os.Build.ID + ")" +
- service.getPackageName();
- }
-
- /**
+ private Context mContext;
+ private DownloadInfo mInfo;
+ private DownloaderService mService;
+ private final DownloadsDB mDB;
+ private final DownloadNotification mNotification;
+ private String mUserAgent;
+
+ public DownloadThread(DownloadInfo info, DownloaderService service,
+ DownloadNotification notification) {
+ mContext = service;
+ mInfo = info;
+ mService = service;
+ mNotification = notification;
+ mDB = DownloadsDB.getDB(service);
+ mUserAgent = "APKXDL (Linux; U; Android " + android.os.Build.VERSION.RELEASE + ";" + Locale.getDefault().toString() + "; " + android.os.Build.DEVICE + "/" + android.os.Build.ID + ")" +
+ service.getPackageName();
+ }
+
+ /**
* Returns the default user agent
*/
- private String userAgent() {
- return mUserAgent;
- }
+ private String userAgent() {
+ return mUserAgent;
+ }
- /**
+ /**
* State for the entire run() method.
*/
- private static class State {
- public String mFilename;
- public FileOutputStream mStream;
- public boolean mCountRetry = false;
- public int mRetryAfter = 0;
- public int mRedirectCount = 0;
- public String mNewUri;
- public boolean mGotData = false;
- public String mRequestUri;
-
- public State(DownloadInfo info, DownloaderService service) {
- mRedirectCount = info.mRedirectCount;
- mRequestUri = info.mUri;
- mFilename = service.generateTempSaveFileName(info.mFileName);
- }
- }
-
- /**
+ private static class State {
+ public String mFilename;
+ public FileOutputStream mStream;
+ public boolean mCountRetry = false;
+ public int mRetryAfter = 0;
+ public int mRedirectCount = 0;
+ public String mNewUri;
+ public boolean mGotData = false;
+ public String mRequestUri;
+
+ public State(DownloadInfo info, DownloaderService service) {
+ mRedirectCount = info.mRedirectCount;
+ mRequestUri = info.mUri;
+ mFilename = service.generateTempSaveFileName(info.mFileName);
+ }
+ }
+
+ /**
* State within executeDownload()
*/
- private static class InnerState {
- public int mBytesSoFar = 0;
- public int mBytesThisSession = 0;
- public String mHeaderETag;
- public boolean mContinuingDownload = false;
- public String mHeaderContentLength;
- public String mHeaderContentDisposition;
- public String mHeaderContentLocation;
- public int mBytesNotified = 0;
- public long mTimeLastNotification = 0;
- }
-
- /**
+ private static class InnerState {
+ public int mBytesSoFar = 0;
+ public int mBytesThisSession = 0;
+ public String mHeaderETag;
+ public boolean mContinuingDownload = false;
+ public String mHeaderContentLength;
+ public String mHeaderContentDisposition;
+ public String mHeaderContentLocation;
+ public int mBytesNotified = 0;
+ public long mTimeLastNotification = 0;
+ }
+
+ /**
* Raised from methods called by run() to indicate that the current request
* should be stopped immediately. Note the message passed to this exception
* will be logged and therefore must be guaranteed not to contain any PII,
* meaning it generally can't include any information about the request URI,
* headers, or destination filename.
*/
- private class StopRequest extends Throwable {
- /**
- *
- */
- private static final long serialVersionUID = 6338592678988347973L;
- public int mFinalStatus;
-
- public StopRequest(int finalStatus, String message) {
- super(message);
- mFinalStatus = finalStatus;
- }
-
- public StopRequest(int finalStatus, String message, Throwable throwable) {
- super(message, throwable);
- mFinalStatus = finalStatus;
- }
- }
-
- /**
+ private class StopRequest extends Throwable {
+
+ private static final long serialVersionUID = 6338592678988347973L;
+ public int mFinalStatus;
+
+ public StopRequest(int finalStatus, String message) {
+ super(message);
+ mFinalStatus = finalStatus;
+ }
+
+ public StopRequest(int finalStatus, String message, Throwable throwable) {
+ super(message, throwable);
+ mFinalStatus = finalStatus;
+ }
+ }
+
+ /**
* Raised from methods called by executeDownload() to indicate that the
* download should be retried immediately.
*/
- private class RetryDownload extends Throwable {
-
- /**
- *
- */
- private static final long serialVersionUID = 6196036036517540229L;
- }
-
- /**
- * Returns the preferred proxy to be used by clients. This is a wrapper
- * around {@link android.net.Proxy#getHost()}. Currently no proxy will be
- * returned for localhost or if the active network is Wi-Fi.
- *
- * @param context the context which will be passed to
- * {@link android.net.Proxy#getHost()}
- * @param url the target URL for the request
- * @note Calling this method requires permission
- * android.permission.ACCESS_NETWORK_STATE
- * @return The preferred proxy to be used by clients, or null if there is no
- * proxy.
- */
- public HttpHost getPreferredHttpHost(Context context,
- String url) {
- if (!isLocalHost(url) && !mService.isWiFi()) {
- final String proxyHost = Proxy.getHost(context);
- if (proxyHost != null) {
- return new HttpHost(proxyHost, Proxy.getPort(context), "http");
- }
- }
-
- return null;
- }
-
- static final private boolean isLocalHost(String url) {
- if (url == null) {
- return false;
- }
-
- try {
- final URI uri = URI.create(url);
- final String host = uri.getHost();
- if (host != null) {
- // TODO: InetAddress.isLoopbackAddress should be used to check
- // for localhost. However no public factory methods exist which
- // can be used without triggering DNS lookup if host is not
- // localhost.
- if (host.equalsIgnoreCase("localhost") ||
- host.equals("127.0.0.1") ||
- host.equals("[::1]")) {
- return true;
- }
- }
- } catch (IllegalArgumentException iex) {
- // Ignore (URI.create)
- }
-
- return false;
- }
-
- /**
+ private class RetryDownload extends Throwable {
+
+ private static final long serialVersionUID = 6196036036517540229L;
+ }
+
+ /**
* Executes the download in a separate thread
*/
- public void run() {
- Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
-
- State state = new State(mInfo, mService);
- AndroidHttpClient client = null;
- PowerManager.WakeLock wakeLock = null;
- int finalStatus = DownloaderService.STATUS_UNKNOWN_ERROR;
-
- try {
- PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
- wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, Constants.TAG);
- wakeLock.acquire();
-
- if (Constants.LOGV) {
- Log.v(Constants.TAG, "initiating download for " + mInfo.mFileName);
- Log.v(Constants.TAG, " at " + mInfo.mUri);
- }
-
- client = AndroidHttpClient.newInstance(userAgent(), mContext);
-
- boolean finished = false;
- while (!finished) {
- if (Constants.LOGV) {
- Log.v(Constants.TAG, "initiating download for " + mInfo.mFileName);
- Log.v(Constants.TAG, " at " + mInfo.mUri);
- }
- // Set or unset proxy, which may have changed since last GET
- // request.
- // setDefaultProxy() supports null as proxy parameter.
- ConnRouteParams.setDefaultProxy(client.getParams(),
- getPreferredHttpHost(mContext, state.mRequestUri));
- HttpGet request = new HttpGet(state.mRequestUri);
- try {
- executeDownload(state, client, request);
- finished = true;
- } catch (RetryDownload exc) {
- // fall through
- } finally {
- request.abort();
- request = null;
- }
- }
-
- if (Constants.LOGV) {
- Log.v(Constants.TAG, "download completed for " + mInfo.mFileName);
- Log.v(Constants.TAG, " at " + mInfo.mUri);
- }
- finalizeDestinationFile(state);
- finalStatus = DownloaderService.STATUS_SUCCESS;
- } catch (StopRequest error) {
- // remove the cause before printing, in case it contains PII
- Log.w(Constants.TAG,
- "Aborting request for download " + mInfo.mFileName + ": " + error.getMessage());
- error.printStackTrace();
- finalStatus = error.mFinalStatus;
- // fall through to finally block
- } catch (Throwable ex) { // sometimes the socket code throws unchecked
- // exceptions
- Log.w(Constants.TAG, "Exception for " + mInfo.mFileName + ": " + ex);
- finalStatus = DownloaderService.STATUS_UNKNOWN_ERROR;
- // falls through to the code that reports an error
- } finally {
- if (wakeLock != null) {
- wakeLock.release();
- wakeLock = null;
- }
- if (client != null) {
- client.close();
- client = null;
- }
- cleanupDestination(state, finalStatus);
- notifyDownloadCompleted(finalStatus, state.mCountRetry, state.mRetryAfter,
- state.mRedirectCount, state.mGotData, state.mFilename);
- }
- }
-
- /**
+ public void run() {
+ Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
+
+ State state = new State(mInfo, mService);
+ PowerManager.WakeLock wakeLock = null;
+ int finalStatus = DownloaderService.STATUS_UNKNOWN_ERROR;
+
+ try {
+ PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
+ wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "org.godot.game:wakelock");
+ wakeLock.acquire(20 * 60 * 1000L /*20 minutes*/);
+
+ if (Constants.LOGV) {
+ Log.v(Constants.TAG, "initiating download for " + mInfo.mFileName);
+ Log.v(Constants.TAG, " at " + mInfo.mUri);
+ }
+
+ boolean finished = false;
+ while (!finished) {
+ if (Constants.LOGV) {
+ Log.v(Constants.TAG, "initiating download for " + mInfo.mFileName);
+ Log.v(Constants.TAG, " at " + mInfo.mUri);
+ }
+ // Set or unset proxy, which may have changed since last GET
+ // request.
+ // setDefaultProxy() supports null as proxy parameter.
+ URL url = new URL(state.mRequestUri);
+ HttpURLConnection request = (HttpURLConnection)url.openConnection();
+ request.setRequestProperty("User-Agent", userAgent());
+ try {
+ executeDownload(state, request);
+ finished = true;
+ } catch (RetryDownload exc) {
+ // fall through
+ } finally {
+ request.disconnect();
+ request = null;
+ }
+ }
+
+ if (Constants.LOGV) {
+ Log.v(Constants.TAG, "download completed for " + mInfo.mFileName);
+ Log.v(Constants.TAG, " at " + mInfo.mUri);
+ }
+ finalizeDestinationFile(state);
+ finalStatus = DownloaderService.STATUS_SUCCESS;
+ } catch (StopRequest error) {
+ // remove the cause before printing, in case it contains PII
+ Log.w(Constants.TAG,
+ "Aborting request for download " + mInfo.mFileName + ": " + error.getMessage());
+ error.printStackTrace();
+ finalStatus = error.mFinalStatus;
+ // fall through to finally block
+ } catch (Throwable ex) { // sometimes the socket code throws unchecked
+ // exceptions
+ Log.w(Constants.TAG, "Exception for " + mInfo.mFileName + ": " + ex);
+ finalStatus = DownloaderService.STATUS_UNKNOWN_ERROR;
+ // falls through to the code that reports an error
+ } finally {
+ if (wakeLock != null) {
+ wakeLock.release();
+ wakeLock = null;
+ }
+ cleanupDestination(state, finalStatus);
+ notifyDownloadCompleted(finalStatus, state.mCountRetry, state.mRetryAfter,
+ state.mRedirectCount, state.mGotData, state.mFilename);
+ }
+ }
+
+ /**
* Fully execute a single download request - setup and send the request,
* handle the response, and transfer the data to the destination file.
*/
- private void executeDownload(State state, AndroidHttpClient client, HttpGet request)
- throws StopRequest, RetryDownload {
- InnerState innerState = new InnerState();
- byte data[] = new byte[Constants.BUFFER_SIZE];
+ private void executeDownload(State state, HttpURLConnection request)
+ throws StopRequest, RetryDownload {
+ InnerState innerState = new InnerState();
+ byte data[] = new byte[Constants.BUFFER_SIZE];
- checkPausedOrCanceled(state);
+ checkPausedOrCanceled(state);
- setupDestinationFile(state, innerState);
- addRequestHeaders(innerState, request);
+ setupDestinationFile(state, innerState);
+ addRequestHeaders(innerState, request);
- // check just before sending the request to avoid using an invalid
- // connection at all
- checkConnectivity(state);
+ // check just before sending the request to avoid using an invalid
+ // connection at all
+ checkConnectivity(state);
- mNotification.onDownloadStateChanged(IDownloaderClient.STATE_CONNECTING);
- HttpResponse response = sendRequest(state, client, request);
- handleExceptionalStatus(state, innerState, response);
+ mNotification.onDownloadStateChanged(IDownloaderClient.STATE_CONNECTING);
+ int responseCode = sendRequest(state, request);
+ handleExceptionalStatus(state, innerState, request, responseCode);
- if (Constants.LOGV) {
- Log.v(Constants.TAG, "received response for " + mInfo.mUri);
- }
+ if (Constants.LOGV) {
+ Log.v(Constants.TAG, "received response for " + mInfo.mUri);
+ }
- processResponseHeaders(state, innerState, response);
- InputStream entityStream = openResponseEntity(state, response);
- mNotification.onDownloadStateChanged(IDownloaderClient.STATE_DOWNLOADING);
- transferData(state, innerState, data, entityStream);
- }
+ processResponseHeaders(state, innerState, request);
+ InputStream entityStream = openResponseEntity(state, request);
+ mNotification.onDownloadStateChanged(IDownloaderClient.STATE_DOWNLOADING);
+ transferData(state, innerState, data, entityStream);
+ }
- /**
+ /**
* Check if current connectivity is valid for this request.
*/
- private void checkConnectivity(State state) throws StopRequest {
- switch (mService.getNetworkAvailabilityState(mDB)) {
- case DownloaderService.NETWORK_OK:
- return;
- case DownloaderService.NETWORK_NO_CONNECTION:
- throw new StopRequest(DownloaderService.STATUS_WAITING_FOR_NETWORK,
- "waiting for network to return");
- case DownloaderService.NETWORK_TYPE_DISALLOWED_BY_REQUESTOR:
- throw new StopRequest(
- DownloaderService.STATUS_QUEUED_FOR_WIFI_OR_CELLULAR_PERMISSION,
- "waiting for wifi or for download over cellular to be authorized");
- case DownloaderService.NETWORK_CANNOT_USE_ROAMING:
- throw new StopRequest(DownloaderService.STATUS_WAITING_FOR_NETWORK,
- "roaming is not allowed");
- case DownloaderService.NETWORK_UNUSABLE_DUE_TO_SIZE:
- throw new StopRequest(DownloaderService.STATUS_QUEUED_FOR_WIFI, "waiting for wifi");
- }
- }
-
- /**
+ private void checkConnectivity(State state) throws StopRequest {
+ switch (mService.getNetworkAvailabilityState(mDB)) {
+ case DownloaderService.NETWORK_OK:
+ return;
+ case DownloaderService.NETWORK_NO_CONNECTION:
+ throw new StopRequest(DownloaderService.STATUS_WAITING_FOR_NETWORK,
+ "waiting for network to return");
+ case DownloaderService.NETWORK_TYPE_DISALLOWED_BY_REQUESTOR:
+ throw new StopRequest(
+ DownloaderService.STATUS_QUEUED_FOR_WIFI_OR_CELLULAR_PERMISSION,
+ "waiting for wifi or for download over cellular to be authorized");
+ case DownloaderService.NETWORK_CANNOT_USE_ROAMING:
+ throw new StopRequest(DownloaderService.STATUS_WAITING_FOR_NETWORK,
+ "roaming is not allowed");
+ case DownloaderService.NETWORK_UNUSABLE_DUE_TO_SIZE:
+ throw new StopRequest(DownloaderService.STATUS_QUEUED_FOR_WIFI, "waiting for wifi");
+ }
+ }
+
+ /**
* Transfer as much data as possible from the HTTP response to the
* destination file.
- *
+ *
* @param data buffer to use to read data
* @param entityStream stream for reading the HTTP response entity
*/
- private void transferData(State state, InnerState innerState, byte[] data,
- InputStream entityStream) throws StopRequest {
- for (;;) {
- int bytesRead = readFromResponse(state, innerState, data, entityStream);
- if (bytesRead == -1) { // success, end of stream already reached
- handleEndOfStream(state, innerState);
- return;
- }
-
- state.mGotData = true;
- writeDataToDestination(state, data, bytesRead);
- innerState.mBytesSoFar += bytesRead;
- innerState.mBytesThisSession += bytesRead;
- reportProgress(state, innerState);
-
- checkPausedOrCanceled(state);
- }
- }
-
- /**
+ private void transferData(State state, InnerState innerState, byte[] data,
+ InputStream entityStream) throws StopRequest {
+ for (;;) {
+ int bytesRead = readFromResponse(state, innerState, data, entityStream);
+ if (bytesRead == -1) { // success, end of stream already reached
+ handleEndOfStream(state, innerState);
+ return;
+ }
+
+ state.mGotData = true;
+ writeDataToDestination(state, data, bytesRead);
+ innerState.mBytesSoFar += bytesRead;
+ innerState.mBytesThisSession += bytesRead;
+ reportProgress(state, innerState);
+
+ checkPausedOrCanceled(state);
+ }
+ }
+
+ /**
* Called after a successful completion to take any necessary action on the
* downloaded file.
*/
- private void finalizeDestinationFile(State state) throws StopRequest {
- syncDestination(state);
- String tempFilename = state.mFilename;
- String finalFilename = Helpers.generateSaveFileName(mService, mInfo.mFileName);
- if (!state.mFilename.equals(finalFilename)) {
- File startFile = new File(tempFilename);
- File destFile = new File(finalFilename);
- if (mInfo.mTotalBytes != -1 && mInfo.mCurrentBytes == mInfo.mTotalBytes) {
- if (!startFile.renameTo(destFile)) {
- throw new StopRequest(DownloaderService.STATUS_FILE_ERROR,
- "unable to finalize destination file");
- }
- } else {
- throw new StopRequest(DownloaderService.STATUS_FILE_DELIVERED_INCORRECTLY,
- "file delivered with incorrect size. probably due to network not browser configured");
- }
- }
- }
-
- /**
+ private void finalizeDestinationFile(State state) throws StopRequest {
+ syncDestination(state);
+ String tempFilename = state.mFilename;
+ String finalFilename = Helpers.generateSaveFileName(mService, mInfo.mFileName);
+ if (!state.mFilename.equals(finalFilename)) {
+ File startFile = new File(tempFilename);
+ File destFile = new File(finalFilename);
+ if (mInfo.mTotalBytes != -1 && mInfo.mCurrentBytes == mInfo.mTotalBytes) {
+ if (!startFile.renameTo(destFile)) {
+ throw new StopRequest(DownloaderService.STATUS_FILE_ERROR,
+ "unable to finalize destination file");
+ }
+ } else {
+ throw new StopRequest(DownloaderService.STATUS_FILE_DELIVERED_INCORRECTLY,
+ "file delivered with incorrect size. probably due to network not browser configured");
+ }
+ }
+ }
+
+ /**
* Called just before the thread finishes, regardless of status, to take any
* necessary action on the downloaded file.
*/
- private void cleanupDestination(State state, int finalStatus) {
- closeDestination(state);
- if (state.mFilename != null && DownloaderService.isStatusError(finalStatus)) {
- new File(state.mFilename).delete();
- state.mFilename = null;
- }
- }
-
- /**
+ private void cleanupDestination(State state, int finalStatus) {
+ closeDestination(state);
+ if (state.mFilename != null && DownloaderService.isStatusError(finalStatus)) {
+ new File(state.mFilename).delete();
+ state.mFilename = null;
+ }
+ }
+
+ /**
* Sync the destination file to storage.
*/
- private void syncDestination(State state) {
- FileOutputStream downloadedFileStream = null;
- try {
- downloadedFileStream = new FileOutputStream(state.mFilename, true);
- downloadedFileStream.getFD().sync();
- } catch (FileNotFoundException ex) {
- Log.w(Constants.TAG, "file " + state.mFilename + " not found: " + ex);
- } catch (SyncFailedException ex) {
- Log.w(Constants.TAG, "file " + state.mFilename + " sync failed: " + ex);
- } catch (IOException ex) {
- Log.w(Constants.TAG, "IOException trying to sync " + state.mFilename + ": " + ex);
- } catch (RuntimeException ex) {
- Log.w(Constants.TAG, "exception while syncing file: ", ex);
- } finally {
- if (downloadedFileStream != null) {
- try {
- downloadedFileStream.close();
- } catch (IOException ex) {
- Log.w(Constants.TAG, "IOException while closing synced file: ", ex);
- } catch (RuntimeException ex) {
- Log.w(Constants.TAG, "exception while closing file: ", ex);
- }
- }
- }
- }
-
- /**
+ private void syncDestination(State state) {
+ FileOutputStream downloadedFileStream = null;
+ try {
+ downloadedFileStream = new FileOutputStream(state.mFilename, true);
+ downloadedFileStream.getFD().sync();
+ } catch (FileNotFoundException ex) {
+ Log.w(Constants.TAG, "file " + state.mFilename + " not found: " + ex);
+ } catch (SyncFailedException ex) {
+ Log.w(Constants.TAG, "file " + state.mFilename + " sync failed: " + ex);
+ } catch (IOException ex) {
+ Log.w(Constants.TAG, "IOException trying to sync " + state.mFilename + ": " + ex);
+ } catch (RuntimeException ex) {
+ Log.w(Constants.TAG, "exception while syncing file: ", ex);
+ } finally {
+ if (downloadedFileStream != null) {
+ try {
+ downloadedFileStream.close();
+ } catch (IOException ex) {
+ Log.w(Constants.TAG, "IOException while closing synced file: ", ex);
+ } catch (RuntimeException ex) {
+ Log.w(Constants.TAG, "exception while closing file: ", ex);
+ }
+ }
+ }
+ }
+
+ /**
* Close the destination output stream.
*/
- private void closeDestination(State state) {
- try {
- // close the file
- if (state.mStream != null) {
- state.mStream.close();
- state.mStream = null;
- }
- } catch (IOException ex) {
- if (Constants.LOGV) {
- Log.v(Constants.TAG, "exception when closing the file after download : " + ex);
- }
- // nothing can really be done if the file can't be closed
- }
- }
-
- /**
+ private void closeDestination(State state) {
+ try {
+ // close the file
+ if (state.mStream != null) {
+ state.mStream.close();
+ state.mStream = null;
+ }
+ } catch (IOException ex) {
+ if (Constants.LOGV) {
+ Log.v(Constants.TAG, "exception when closing the file after download : " + ex);
+ }
+ // nothing can really be done if the file can't be closed
+ }
+ }
+
+ /**
* Check if the download has been paused or canceled, stopping the request
* appropriately if it has been.
*/
- private void checkPausedOrCanceled(State state) throws StopRequest {
- if (mService.getControl() == DownloaderService.CONTROL_PAUSED) {
- int status = mService.getStatus();
- switch (status) {
- case DownloaderService.STATUS_PAUSED_BY_APP:
- throw new StopRequest(mService.getStatus(),
- "download paused");
- }
- }
- }
-
- /**
+ private void checkPausedOrCanceled(State state) throws StopRequest {
+ if (mService.getControl() == DownloaderService.CONTROL_PAUSED) {
+ int status = mService.getStatus();
+ switch (status) {
+ case DownloaderService.STATUS_PAUSED_BY_APP:
+ throw new StopRequest(mService.getStatus(),
+ "download paused");
+ }
+ }
+ }
+
+ /**
* Report download progress through the database if necessary.
*/
- private void reportProgress(State state, InnerState innerState) {
- long now = System.currentTimeMillis();
- if (innerState.mBytesSoFar - innerState.mBytesNotified
- > Constants.MIN_PROGRESS_STEP
- && now - innerState.mTimeLastNotification
- > Constants.MIN_PROGRESS_TIME) {
- // we store progress updates to the database here
- mInfo.mCurrentBytes = innerState.mBytesSoFar;
- mDB.updateDownloadCurrentBytes(mInfo);
-
- innerState.mBytesNotified = innerState.mBytesSoFar;
- innerState.mTimeLastNotification = now;
-
- long totalBytesSoFar = innerState.mBytesThisSession + mService.mBytesSoFar;
-
- if (Constants.LOGVV) {
- Log.v(Constants.TAG, "downloaded " + mInfo.mCurrentBytes + " out of "
- + mInfo.mTotalBytes);
- Log.v(Constants.TAG, " total " + totalBytesSoFar + " out of "
- + mService.mTotalLength);
- }
-
- mService.notifyUpdateBytes(totalBytesSoFar);
- }
- }
-
- /**
+ private void reportProgress(State state, InnerState innerState) {
+ long now = System.currentTimeMillis();
+ if (innerState.mBytesSoFar - innerState.mBytesNotified > Constants.MIN_PROGRESS_STEP && now - innerState.mTimeLastNotification > Constants.MIN_PROGRESS_TIME) {
+ // we store progress updates to the database here
+ mInfo.mCurrentBytes = innerState.mBytesSoFar;
+ mDB.updateDownloadCurrentBytes(mInfo);
+
+ innerState.mBytesNotified = innerState.mBytesSoFar;
+ innerState.mTimeLastNotification = now;
+
+ long totalBytesSoFar = innerState.mBytesThisSession + mService.mBytesSoFar;
+
+ if (Constants.LOGVV) {
+ Log.v(Constants.TAG, "downloaded " + mInfo.mCurrentBytes + " out of " + mInfo.mTotalBytes);
+ Log.v(Constants.TAG, " total " + totalBytesSoFar + " out of " + mService.mTotalLength);
+ }
+
+ mService.notifyUpdateBytes(totalBytesSoFar);
+ }
+ }
+
+ /**
* Write a data buffer to the destination file.
- *
+ *
* @param data buffer containing the data to write
* @param bytesRead how many bytes to write from the buffer
*/
- private void writeDataToDestination(State state, byte[] data, int bytesRead)
- throws StopRequest {
- for (;;) {
- try {
- if (state.mStream == null) {
- state.mStream = new FileOutputStream(state.mFilename, true);
- }
- state.mStream.write(data, 0, bytesRead);
- // we close after every write --- this may be too inefficient
- closeDestination(state);
- return;
- } catch (IOException ex) {
- if (!Helpers.isExternalMediaMounted()) {
- throw new StopRequest(DownloaderService.STATUS_DEVICE_NOT_FOUND_ERROR,
- "external media not mounted while writing destination file");
- }
-
- long availableBytes =
- Helpers.getAvailableBytes(Helpers.getFilesystemRoot(state.mFilename));
- if (availableBytes < bytesRead) {
- throw new StopRequest(DownloaderService.STATUS_INSUFFICIENT_SPACE_ERROR,
- "insufficient space while writing destination file", ex);
- }
- throw new StopRequest(DownloaderService.STATUS_FILE_ERROR,
- "while writing destination file: " + ex.toString(), ex);
- }
- }
- }
-
- /**
+ private void writeDataToDestination(State state, byte[] data, int bytesRead)
+ throws StopRequest {
+ for (;;) {
+ try {
+ if (state.mStream == null) {
+ state.mStream = new FileOutputStream(state.mFilename, true);
+ }
+ state.mStream.write(data, 0, bytesRead);
+ // we close after every write --- this may be too inefficient
+ closeDestination(state);
+ return;
+ } catch (IOException ex) {
+ if (!Helpers.isExternalMediaMounted()) {
+ throw new StopRequest(DownloaderService.STATUS_DEVICE_NOT_FOUND_ERROR,
+ "external media not mounted while writing destination file");
+ }
+
+ long availableBytes =
+ Helpers.getAvailableBytes(Helpers.getFilesystemRoot(state.mFilename));
+ if (availableBytes < bytesRead) {
+ throw new StopRequest(DownloaderService.STATUS_INSUFFICIENT_SPACE_ERROR,
+ "insufficient space while writing destination file", ex);
+ }
+ throw new StopRequest(DownloaderService.STATUS_FILE_ERROR,
+ "while writing destination file: " + ex.toString(), ex);
+ }
+ }
+ }
+
+ /**
* Called when we've reached the end of the HTTP response stream, to update
* the database and check for consistency.
*/
- private void handleEndOfStream(State state, InnerState innerState) throws StopRequest {
- mInfo.mCurrentBytes = innerState.mBytesSoFar;
- // this should always be set from the market
- // if ( innerState.mHeaderContentLength == null ) {
- // mInfo.mTotalBytes = innerState.mBytesSoFar;
- // }
- mDB.updateDownload(mInfo);
-
- boolean lengthMismatched = (innerState.mHeaderContentLength != null)
- && (innerState.mBytesSoFar != Integer.parseInt(innerState.mHeaderContentLength));
- if (lengthMismatched) {
- if (cannotResume(innerState)) {
- throw new StopRequest(DownloaderService.STATUS_CANNOT_RESUME,
- "mismatched content length");
- } else {
- throw new StopRequest(getFinalStatusForHttpError(state),
- "closed socket before end of file");
- }
- }
- }
-
- private boolean cannotResume(InnerState innerState) {
- return innerState.mBytesSoFar > 0 && innerState.mHeaderETag == null;
- }
-
- /**
+ private void handleEndOfStream(State state, InnerState innerState) throws StopRequest {
+ mInfo.mCurrentBytes = innerState.mBytesSoFar;
+ // this should always be set from the market
+ // if ( innerState.mHeaderContentLength == null ) {
+ // mInfo.mTotalBytes = innerState.mBytesSoFar;
+ // }
+ mDB.updateDownload(mInfo);
+
+ boolean lengthMismatched = (innerState.mHeaderContentLength != null) && (innerState.mBytesSoFar != Integer.parseInt(innerState.mHeaderContentLength));
+ if (lengthMismatched) {
+ if (cannotResume(innerState)) {
+ throw new StopRequest(DownloaderService.STATUS_CANNOT_RESUME,
+ "mismatched content length");
+ } else {
+ throw new StopRequest(getFinalStatusForHttpError(state),
+ "closed socket before end of file");
+ }
+ }
+ }
+
+ private boolean cannotResume(InnerState innerState) {
+ return innerState.mBytesSoFar > 0 && innerState.mHeaderETag == null;
+ }
+
+ /**
* Read some data from the HTTP response stream, handling I/O errors.
- *
+ *
* @param data buffer to use to read data
* @param entityStream stream for reading the HTTP response entity
* @return the number of bytes actually read or -1 if the end of the stream
* has been reached
*/
- private int readFromResponse(State state, InnerState innerState, byte[] data,
- InputStream entityStream) throws StopRequest {
- try {
- return entityStream.read(data);
- } catch (IOException ex) {
- logNetworkState();
- mInfo.mCurrentBytes = innerState.mBytesSoFar;
- mDB.updateDownload(mInfo);
- if (cannotResume(innerState)) {
- String message = "while reading response: " + ex.toString()
- + ", can't resume interrupted download with no ETag";
- throw new StopRequest(DownloaderService.STATUS_CANNOT_RESUME,
- message, ex);
- } else {
- throw new StopRequest(getFinalStatusForHttpError(state),
- "while reading response: " + ex.toString(), ex);
- }
- }
- }
-
- /**
+ private int readFromResponse(State state, InnerState innerState, byte[] data,
+ InputStream entityStream) throws StopRequest {
+ try {
+ return entityStream.read(data);
+ } catch (IOException ex) {
+ logNetworkState();
+ mInfo.mCurrentBytes = innerState.mBytesSoFar;
+ mDB.updateDownload(mInfo);
+ if (cannotResume(innerState)) {
+ String message = "while reading response: " + ex.toString() + ", can't resume interrupted download with no ETag";
+ throw new StopRequest(DownloaderService.STATUS_CANNOT_RESUME,
+ message, ex);
+ } else {
+ throw new StopRequest(getFinalStatusForHttpError(state),
+ "while reading response: " + ex.toString(), ex);
+ }
+ }
+ }
+
+ /**
* Open a stream for the HTTP response entity, handling I/O errors.
- *
+ *
* @return an InputStream to read the response entity
*/
- private InputStream openResponseEntity(State state, HttpResponse response)
- throws StopRequest {
- try {
- return response.getEntity().getContent();
- } catch (IOException ex) {
- logNetworkState();
- throw new StopRequest(getFinalStatusForHttpError(state),
- "while getting entity: " + ex.toString(), ex);
- }
- }
-
- private void logNetworkState() {
- if (Constants.LOGX) {
- Log.i(Constants.TAG,
- "Net "
- + (mService.getNetworkAvailabilityState(mDB) == DownloaderService.NETWORK_OK ? "Up"
- : "Down"));
- }
- }
-
- /**
+ private InputStream openResponseEntity(State state, HttpURLConnection response)
+ throws StopRequest {
+ try {
+ return response.getInputStream();
+ } catch (IOException ex) {
+ logNetworkState();
+ throw new StopRequest(getFinalStatusForHttpError(state),
+ "while getting entity: " + ex.toString(), ex);
+ }
+ }
+
+ private void logNetworkState() {
+ if (Constants.LOGX) {
+ Log.i(Constants.TAG,
+ "Net " + (mService.getNetworkAvailabilityState(mDB) == DownloaderService.NETWORK_OK ? "Up" : "Down"));
+ }
+ }
+
+ /**
* Read HTTP response headers and take appropriate action, including setting
* up the destination file and updating the database.
*/
- private void processResponseHeaders(State state, InnerState innerState, HttpResponse response)
- throws StopRequest {
- if (innerState.mContinuingDownload) {
- // ignore response headers on resume requests
- return;
- }
-
- readResponseHeaders(state, innerState, response);
-
- try {
- state.mFilename = mService.generateSaveFile(mInfo.mFileName, mInfo.mTotalBytes);
- } catch (DownloaderService.GenerateSaveFileError exc) {
- throw new StopRequest(exc.mStatus, exc.mMessage);
- }
- try {
- state.mStream = new FileOutputStream(state.mFilename);
- } catch (FileNotFoundException exc) {
- // make sure the directory exists
- File pathFile = new File(Helpers.getSaveFilePath(mService));
- try {
- if (pathFile.mkdirs()) {
- state.mStream = new FileOutputStream(state.mFilename);
- }
- } catch (Exception ex) {
- throw new StopRequest(DownloaderService.STATUS_FILE_ERROR,
- "while opening destination file: " + exc.toString(), exc);
- }
- }
- if (Constants.LOGV) {
- Log.v(Constants.TAG, "writing " + mInfo.mUri + " to " + state.mFilename);
- }
-
- updateDatabaseFromHeaders(state, innerState);
- // check connectivity again now that we know the total size
- checkConnectivity(state);
- }
-
- /**
+ private void processResponseHeaders(State state, InnerState innerState, HttpURLConnection response)
+ throws StopRequest {
+ if (innerState.mContinuingDownload) {
+ // ignore response headers on resume requests
+ return;
+ }
+
+ readResponseHeaders(state, innerState, response);
+
+ try {
+ state.mFilename = mService.generateSaveFile(mInfo.mFileName, mInfo.mTotalBytes);
+ } catch (DownloaderService.GenerateSaveFileError exc) {
+ throw new StopRequest(exc.mStatus, exc.mMessage);
+ }
+ try {
+ state.mStream = new FileOutputStream(state.mFilename);
+ } catch (FileNotFoundException exc) {
+ // make sure the directory exists
+ File pathFile = new File(Helpers.getSaveFilePath(mService));
+ try {
+ if (pathFile.mkdirs()) {
+ state.mStream = new FileOutputStream(state.mFilename);
+ }
+ } catch (Exception ex) {
+ throw new StopRequest(DownloaderService.STATUS_FILE_ERROR,
+ "while opening destination file: " + exc.toString(), exc);
+ }
+ }
+ if (Constants.LOGV) {
+ Log.v(Constants.TAG, "writing " + mInfo.mUri + " to " + state.mFilename);
+ }
+
+ updateDatabaseFromHeaders(state, innerState);
+ // check connectivity again now that we know the total size
+ checkConnectivity(state);
+ }
+
+ /**
* Update necessary database fields based on values of HTTP response headers
* that have been read.
*/
- private void updateDatabaseFromHeaders(State state, InnerState innerState) {
- mInfo.mETag = innerState.mHeaderETag;
- mDB.updateDownload(mInfo);
- }
+ private void updateDatabaseFromHeaders(State state, InnerState innerState) {
+ mInfo.mETag = innerState.mHeaderETag;
+ mDB.updateDownload(mInfo);
+ }
- /**
+ /**
* Read headers from the HTTP response and store them into local state.
*/
- private void readResponseHeaders(State state, InnerState innerState, HttpResponse response)
- throws StopRequest {
- Header header = response.getFirstHeader("Content-Disposition");
- if (header != null) {
- innerState.mHeaderContentDisposition = header.getValue();
- }
- header = response.getFirstHeader("Content-Location");
- if (header != null) {
- innerState.mHeaderContentLocation = header.getValue();
- }
- header = response.getFirstHeader("ETag");
- if (header != null) {
- innerState.mHeaderETag = header.getValue();
- }
- String headerTransferEncoding = null;
- header = response.getFirstHeader("Transfer-Encoding");
- if (header != null) {
- headerTransferEncoding = header.getValue();
- }
- String headerContentType = null;
- header = response.getFirstHeader("Content-Type");
- if (header != null) {
- headerContentType = header.getValue();
- if (!headerContentType.equals("application/vnd.android.obb")) {
- throw new StopRequest(DownloaderService.STATUS_FILE_DELIVERED_INCORRECTLY,
- "file delivered with incorrect Mime type");
- }
- }
-
- if (headerTransferEncoding == null) {
- header = response.getFirstHeader("Content-Length");
- if (header != null) {
- innerState.mHeaderContentLength = header.getValue();
- // this is always set from Market
- long contentLength = Long.parseLong(innerState.mHeaderContentLength);
- if (contentLength != -1 && contentLength != mInfo.mTotalBytes) {
- // we're most likely on a bad wifi connection -- we should
- // probably
- // also look at the mime type --- but the size mismatch is
- // enough
- // to tell us that something is wrong here
- Log.e(Constants.TAG, "Incorrect file size delivered.");
- }
- }
- } else {
- // Ignore content-length with transfer-encoding - 2616 4.4 3
- if (Constants.LOGVV) {
- Log.v(Constants.TAG,
- "ignoring content-length because of xfer-encoding");
- }
- }
- if (Constants.LOGVV) {
- Log.v(Constants.TAG, "Content-Disposition: " +
- innerState.mHeaderContentDisposition);
- Log.v(Constants.TAG, "Content-Length: " + innerState.mHeaderContentLength);
- Log.v(Constants.TAG, "Content-Location: " + innerState.mHeaderContentLocation);
- Log.v(Constants.TAG, "ETag: " + innerState.mHeaderETag);
- Log.v(Constants.TAG, "Transfer-Encoding: " + headerTransferEncoding);
- }
-
- boolean noSizeInfo = innerState.mHeaderContentLength == null
- && (headerTransferEncoding == null
- || !headerTransferEncoding.equalsIgnoreCase("chunked"));
- if (noSizeInfo) {
- throw new StopRequest(DownloaderService.STATUS_HTTP_DATA_ERROR,
- "can't know size of download, giving up");
- }
- }
-
- /**
+ private void readResponseHeaders(State state, InnerState innerState, HttpURLConnection response)
+ throws StopRequest {
+ String value = response.getHeaderField("Content-Disposition");
+ if (value != null) {
+ innerState.mHeaderContentDisposition = value;
+ }
+ value = response.getHeaderField("Content-Location");
+ if (value != null) {
+ innerState.mHeaderContentLocation = value;
+ }
+ value = response.getHeaderField("ETag");
+ if (value != null) {
+ innerState.mHeaderETag = value;
+ }
+ String headerTransferEncoding = null;
+ value = response.getHeaderField("Transfer-Encoding");
+ if (value != null) {
+ headerTransferEncoding = value;
+ }
+ String headerContentType = null;
+ value = response.getHeaderField("Content-Type");
+ if (value != null) {
+ headerContentType = value;
+ if (!headerContentType.equals("application/vnd.android.obb")) {
+ throw new StopRequest(DownloaderService.STATUS_FILE_DELIVERED_INCORRECTLY,
+ "file delivered with incorrect Mime type");
+ }
+ }
+
+ if (headerTransferEncoding == null) {
+ long contentLength = response.getContentLength();
+ if (value != null) {
+ // this is always set from Market
+ if (contentLength != -1 && contentLength != mInfo.mTotalBytes) {
+ // we're most likely on a bad wifi connection -- we should
+ // probably
+ // also look at the mime type --- but the size mismatch is
+ // enough
+ // to tell us that something is wrong here
+ Log.e(Constants.TAG, "Incorrect file size delivered.");
+ } else {
+ innerState.mHeaderContentLength = Long.toString(contentLength);
+ }
+ }
+ } else {
+ // Ignore content-length with transfer-encoding - 2616 4.4 3
+ if (Constants.LOGVV) {
+ Log.v(Constants.TAG,
+ "ignoring content-length because of xfer-encoding");
+ }
+ }
+ if (Constants.LOGVV) {
+ Log.v(Constants.TAG, "Content-Disposition: " +
+ innerState.mHeaderContentDisposition);
+ Log.v(Constants.TAG, "Content-Length: " + innerState.mHeaderContentLength);
+ Log.v(Constants.TAG, "Content-Location: " + innerState.mHeaderContentLocation);
+ Log.v(Constants.TAG, "ETag: " + innerState.mHeaderETag);
+ Log.v(Constants.TAG, "Transfer-Encoding: " + headerTransferEncoding);
+ }
+
+ boolean noSizeInfo = innerState.mHeaderContentLength == null && (headerTransferEncoding == null || !headerTransferEncoding.equalsIgnoreCase("chunked"));
+ if (noSizeInfo) {
+ throw new StopRequest(DownloaderService.STATUS_HTTP_DATA_ERROR,
+ "can't know size of download, giving up");
+ }
+ }
+
+ /**
* Check the HTTP response status and handle anything unusual (e.g. not
* 200/206).
*/
- private void handleExceptionalStatus(State state, InnerState innerState, HttpResponse response)
- throws StopRequest, RetryDownload {
- int statusCode = response.getStatusLine().getStatusCode();
- if (statusCode == 503 && mInfo.mNumFailed < Constants.MAX_RETRIES) {
- handleServiceUnavailable(state, response);
- }
- if (statusCode == 301 || statusCode == 302 || statusCode == 303 || statusCode == 307) {
- handleRedirect(state, response, statusCode);
- }
-
- int expectedStatus = innerState.mContinuingDownload ? 206
- : DownloaderService.STATUS_SUCCESS;
- if (statusCode != expectedStatus) {
- handleOtherStatus(state, innerState, statusCode);
- } else {
- // no longer redirected
- state.mRedirectCount = 0;
- }
- }
-
- /**
+ private void handleExceptionalStatus(State state, InnerState innerState, HttpURLConnection connection, int responseCode)
+ throws StopRequest, RetryDownload {
+ if (responseCode == 503 && mInfo.mNumFailed < Constants.MAX_RETRIES) {
+ handleServiceUnavailable(state, connection);
+ }
+ int expectedStatus = innerState.mContinuingDownload ? 206 : DownloaderService.STATUS_SUCCESS;
+ if (responseCode != expectedStatus) {
+ handleOtherStatus(state, innerState, responseCode);
+ } else {
+ // no longer redirected
+ state.mRedirectCount = 0;
+ }
+ }
+
+ /**
* Handle a status that we don't know how to deal with properly.
*/
- private void handleOtherStatus(State state, InnerState innerState, int statusCode)
- throws StopRequest {
- int finalStatus;
- if (DownloaderService.isStatusError(statusCode)) {
- finalStatus = statusCode;
- } else if (statusCode >= 300 && statusCode < 400) {
- finalStatus = DownloaderService.STATUS_UNHANDLED_REDIRECT;
- } else if (innerState.mContinuingDownload && statusCode == DownloaderService.STATUS_SUCCESS) {
- finalStatus = DownloaderService.STATUS_CANNOT_RESUME;
- } else {
- finalStatus = DownloaderService.STATUS_UNHANDLED_HTTP_CODE;
- }
- throw new StopRequest(finalStatus, "http error " + statusCode);
- }
-
- /**
- * Handle a 3xx redirect status.
- */
- private void handleRedirect(State state, HttpResponse response, int statusCode)
- throws StopRequest, RetryDownload {
- if (Constants.LOGVV) {
- Log.v(Constants.TAG, "got HTTP redirect " + statusCode);
- }
- if (state.mRedirectCount >= Constants.MAX_REDIRECTS) {
- throw new StopRequest(DownloaderService.STATUS_TOO_MANY_REDIRECTS, "too many redirects");
- }
- Header header = response.getFirstHeader("Location");
- if (header == null) {
- return;
- }
- if (Constants.LOGVV) {
- Log.v(Constants.TAG, "Location :" + header.getValue());
- }
-
- String newUri;
- try {
- newUri = new URI(mInfo.mUri).resolve(new URI(header.getValue())).toString();
- } catch (URISyntaxException ex) {
- if (Constants.LOGV) {
- Log.d(Constants.TAG, "Couldn't resolve redirect URI " + header.getValue()
- + " for " + mInfo.mUri);
- }
- throw new StopRequest(DownloaderService.STATUS_HTTP_DATA_ERROR,
- "Couldn't resolve redirect URI");
- }
- ++state.mRedirectCount;
- state.mRequestUri = newUri;
- if (statusCode == 301 || statusCode == 303) {
- // use the new URI for all future requests (should a retry/resume be
- // necessary)
- state.mNewUri = newUri;
- }
- throw new RetryDownload();
- }
-
- /**
+ private void handleOtherStatus(State state, InnerState innerState, int statusCode)
+ throws StopRequest {
+ int finalStatus;
+ if (DownloaderService.isStatusError(statusCode)) {
+ finalStatus = statusCode;
+ } else if (statusCode >= 300 && statusCode < 400) {
+ finalStatus = DownloaderService.STATUS_UNHANDLED_REDIRECT;
+ } else if (innerState.mContinuingDownload && statusCode == DownloaderService.STATUS_SUCCESS) {
+ finalStatus = DownloaderService.STATUS_CANNOT_RESUME;
+ } else {
+ finalStatus = DownloaderService.STATUS_UNHANDLED_HTTP_CODE;
+ }
+ throw new StopRequest(finalStatus, "http error " + statusCode);
+ }
+
+ /**
* Add headers for this download to the HTTP request to allow for resume.
*/
- private void addRequestHeaders(InnerState innerState, HttpGet request) {
- if (innerState.mContinuingDownload) {
- if (innerState.mHeaderETag != null) {
- request.addHeader("If-Match", innerState.mHeaderETag);
- }
- request.addHeader("Range", "bytes=" + innerState.mBytesSoFar + "-");
- }
- }
-
- /**
+ private void addRequestHeaders(InnerState innerState, HttpURLConnection request) {
+ if (innerState.mContinuingDownload) {
+ if (innerState.mHeaderETag != null) {
+ request.setRequestProperty("If-Match", innerState.mHeaderETag);
+ }
+ request.setRequestProperty("Range", "bytes=" + innerState.mBytesSoFar + "-");
+ }
+ }
+
+ /**
* Handle a 503 Service Unavailable status by processing the Retry-After
* header.
*/
- private void handleServiceUnavailable(State state, HttpResponse response) throws StopRequest {
- if (Constants.LOGVV) {
- Log.v(Constants.TAG, "got HTTP response code 503");
- }
- state.mCountRetry = true;
- Header header = response.getFirstHeader("Retry-After");
- if (header != null) {
- try {
- if (Constants.LOGVV) {
- Log.v(Constants.TAG, "Retry-After :" + header.getValue());
- }
- state.mRetryAfter = Integer.parseInt(header.getValue());
- if (state.mRetryAfter < 0) {
- state.mRetryAfter = 0;
- } else {
- if (state.mRetryAfter < Constants.MIN_RETRY_AFTER) {
- state.mRetryAfter = Constants.MIN_RETRY_AFTER;
- } else if (state.mRetryAfter > Constants.MAX_RETRY_AFTER) {
- state.mRetryAfter = Constants.MAX_RETRY_AFTER;
- }
- state.mRetryAfter += Helpers.sRandom.nextInt(Constants.MIN_RETRY_AFTER + 1);
- state.mRetryAfter *= 1000;
- }
- } catch (NumberFormatException ex) {
- // ignored - retryAfter stays 0 in this case.
- }
- }
- throw new StopRequest(DownloaderService.STATUS_WAITING_TO_RETRY,
- "got 503 Service Unavailable, will retry later");
- }
-
- /**
+ private void handleServiceUnavailable(State state, HttpURLConnection connection) throws StopRequest {
+ if (Constants.LOGVV) {
+ Log.v(Constants.TAG, "got HTTP response code 503");
+ }
+ state.mCountRetry = true;
+ String retryAfterValue = connection.getHeaderField("Retry-After");
+ if (retryAfterValue != null) {
+ try {
+ if (Constants.LOGVV) {
+ Log.v(Constants.TAG, "Retry-After :" + retryAfterValue);
+ }
+ state.mRetryAfter = Integer.parseInt(retryAfterValue);
+ if (state.mRetryAfter < 0) {
+ state.mRetryAfter = 0;
+ } else {
+ if (state.mRetryAfter < Constants.MIN_RETRY_AFTER) {
+ state.mRetryAfter = Constants.MIN_RETRY_AFTER;
+ } else if (state.mRetryAfter > Constants.MAX_RETRY_AFTER) {
+ state.mRetryAfter = Constants.MAX_RETRY_AFTER;
+ }
+ state.mRetryAfter += Helpers.sRandom.nextInt(Constants.MIN_RETRY_AFTER + 1);
+ state.mRetryAfter *= 1000;
+ }
+ } catch (NumberFormatException ex) {
+ // ignored - retryAfter stays 0 in this case.
+ }
+ }
+ throw new StopRequest(DownloaderService.STATUS_WAITING_TO_RETRY,
+ "got 503 Service Unavailable, will retry later");
+ }
+
+ /**
* Send the request to the server, handling any I/O exceptions.
*/
- private HttpResponse sendRequest(State state, AndroidHttpClient client, HttpGet request)
- throws StopRequest {
- try {
- return client.execute(request);
- } catch (IllegalArgumentException ex) {
- throw new StopRequest(DownloaderService.STATUS_HTTP_DATA_ERROR,
- "while trying to execute request: " + ex.toString(), ex);
- } catch (IOException ex) {
- logNetworkState();
- throw new StopRequest(getFinalStatusForHttpError(state),
- "while trying to execute request: " + ex.toString(), ex);
- }
- }
-
- private int getFinalStatusForHttpError(State state) {
- if (mService.getNetworkAvailabilityState(mDB) != DownloaderService.NETWORK_OK) {
- return DownloaderService.STATUS_WAITING_FOR_NETWORK;
- } else if (mInfo.mNumFailed < Constants.MAX_RETRIES) {
- state.mCountRetry = true;
- return DownloaderService.STATUS_WAITING_TO_RETRY;
- } else {
- Log.w(Constants.TAG, "reached max retries for " + mInfo.mNumFailed);
- return DownloaderService.STATUS_HTTP_DATA_ERROR;
- }
- }
-
- /**
+ private int sendRequest(State state, HttpURLConnection request)
+ throws StopRequest {
+ try {
+ return request.getResponseCode();
+ } catch (IllegalArgumentException ex) {
+ throw new StopRequest(DownloaderService.STATUS_HTTP_DATA_ERROR,
+ "while trying to execute request: " + ex.toString(), ex);
+ } catch (IOException ex) {
+ logNetworkState();
+ throw new StopRequest(getFinalStatusForHttpError(state),
+ "while trying to execute request: " + ex.toString(), ex);
+ }
+ }
+
+ private int getFinalStatusForHttpError(State state) {
+ if (mService.getNetworkAvailabilityState(mDB) != DownloaderService.NETWORK_OK) {
+ return DownloaderService.STATUS_WAITING_FOR_NETWORK;
+ } else if (mInfo.mNumFailed < Constants.MAX_RETRIES) {
+ state.mCountRetry = true;
+ return DownloaderService.STATUS_WAITING_TO_RETRY;
+ } else {
+ Log.w(Constants.TAG, "reached max retries for " + mInfo.mNumFailed);
+ return DownloaderService.STATUS_HTTP_DATA_ERROR;
+ }
+ }
+
+ /**
* Prepare the destination file to receive data. If the file already exists,
* we'll set up appropriately for resumption.
*/
- private void setupDestinationFile(State state, InnerState innerState)
- throws StopRequest {
- if (state.mFilename != null) { // only true if we've already run a
- // thread for this download
- if (!Helpers.isFilenameValid(state.mFilename)) {
- // this should never happen
- throw new StopRequest(DownloaderService.STATUS_FILE_ERROR,
- "found invalid internal destination filename");
- }
- // We're resuming a download that got interrupted
- File f = new File(state.mFilename);
- if (f.exists()) {
- long fileLength = f.length();
- if (fileLength == 0) {
- // The download hadn't actually started, we can restart from
- // scratch
- f.delete();
- state.mFilename = null;
- } else if (mInfo.mETag == null) {
- // This should've been caught upon failure
- f.delete();
- throw new StopRequest(DownloaderService.STATUS_CANNOT_RESUME,
- "Trying to resume a download that can't be resumed");
- } else {
- // All right, we'll be able to resume this download
- try {
- state.mStream = new FileOutputStream(state.mFilename, true);
- } catch (FileNotFoundException exc) {
- throw new StopRequest(DownloaderService.STATUS_FILE_ERROR,
- "while opening destination for resuming: " + exc.toString(), exc);
- }
- innerState.mBytesSoFar = (int) fileLength;
- if (mInfo.mTotalBytes != -1) {
- innerState.mHeaderContentLength = Long.toString(mInfo.mTotalBytes);
- }
- innerState.mHeaderETag = mInfo.mETag;
- innerState.mContinuingDownload = true;
- }
- }
- }
-
- if (state.mStream != null) {
- closeDestination(state);
- }
- }
-
- /**
+ private void setupDestinationFile(State state, InnerState innerState)
+ throws StopRequest {
+ if (state.mFilename != null) { // only true if we've already run a
+ // thread for this download
+ if (!Helpers.isFilenameValid(state.mFilename)) {
+ // this should never happen
+ throw new StopRequest(DownloaderService.STATUS_FILE_ERROR,
+ "found invalid internal destination filename");
+ }
+ // We're resuming a download that got interrupted
+ File f = new File(state.mFilename);
+ if (f.exists()) {
+ long fileLength = f.length();
+ if (fileLength == 0) {
+ // The download hadn't actually started, we can restart from
+ // scratch
+ f.delete();
+ state.mFilename = null;
+ } else if (mInfo.mETag == null) {
+ // This should've been caught upon failure
+ f.delete();
+ throw new StopRequest(DownloaderService.STATUS_CANNOT_RESUME,
+ "Trying to resume a download that can't be resumed");
+ } else {
+ // All right, we'll be able to resume this download
+ try {
+ state.mStream = new FileOutputStream(state.mFilename, true);
+ } catch (FileNotFoundException exc) {
+ throw new StopRequest(DownloaderService.STATUS_FILE_ERROR,
+ "while opening destination for resuming: " + exc.toString(), exc);
+ }
+ innerState.mBytesSoFar = (int)fileLength;
+ if (mInfo.mTotalBytes != -1) {
+ innerState.mHeaderContentLength = Long.toString(mInfo.mTotalBytes);
+ }
+ innerState.mHeaderETag = mInfo.mETag;
+ innerState.mContinuingDownload = true;
+ }
+ }
+ }
+
+ if (state.mStream != null) {
+ closeDestination(state);
+ }
+ }
+
+ /**
* Stores information about the completed download, and notifies the
* initiating application.
*/
- private void notifyDownloadCompleted(
- int status, boolean countRetry, int retryAfter, int redirectCount, boolean gotData,
- String filename) {
- updateDownloadDatabase(
- status, countRetry, retryAfter, redirectCount, gotData, filename);
- if (DownloaderService.isStatusCompleted(status)) {
- // TBD: send status update?
- }
- }
-
- private void updateDownloadDatabase(
- int status, boolean countRetry, int retryAfter, int redirectCount, boolean gotData,
- String filename) {
- mInfo.mStatus = status;
- mInfo.mRetryAfter = retryAfter;
- mInfo.mRedirectCount = redirectCount;
- mInfo.mLastMod = System.currentTimeMillis();
- if (!countRetry) {
- mInfo.mNumFailed = 0;
- } else if (gotData) {
- mInfo.mNumFailed = 1;
- } else {
- mInfo.mNumFailed++;
- }
- mDB.updateDownload(mInfo);
- }
-
+ private void notifyDownloadCompleted(
+ int status, boolean countRetry, int retryAfter, int redirectCount, boolean gotData,
+ String filename) {
+ updateDownloadDatabase(
+ status, countRetry, retryAfter, redirectCount, gotData, filename);
+ if (DownloaderService.isStatusCompleted(status)) {
+ // TBD: send status update?
+ }
+ }
+
+ private void updateDownloadDatabase(
+ int status, boolean countRetry, int retryAfter, int redirectCount, boolean gotData,
+ String filename) {
+ mInfo.mStatus = status;
+ mInfo.mRetryAfter = retryAfter;
+ mInfo.mRedirectCount = redirectCount;
+ mInfo.mLastMod = System.currentTimeMillis();
+ if (!countRetry) {
+ mInfo.mNumFailed = 0;
+ } else if (gotData) {
+ mInfo.mNumFailed = 1;
+ } else {
+ mInfo.mNumFailed++;
+ }
+ mDB.updateDownload(mInfo);
+ }
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloaderService.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloaderService.java
index e83faa2756..25a561ccd4 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloaderService.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloaderService.java
@@ -29,6 +29,7 @@ import com.google.android.vending.licensing.LicenseChecker;
import com.google.android.vending.licensing.LicenseCheckerCallback;
import com.google.android.vending.licensing.Policy;
+import android.annotation.SuppressLint;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
@@ -61,82 +62,82 @@ import java.io.File;
*/
public abstract class DownloaderService extends CustomIntentService implements IDownloaderService {
- public DownloaderService() {
- super("LVLDownloadService");
- }
+ public DownloaderService() {
+ super("LVLDownloadService");
+ }
- private static final String LOG_TAG = "LVLDL";
+ private static final String LOG_TAG = "LVLDL";
- // the following NETWORK_* constants are used to indicates specific reasons
- // for disallowing a
- // download from using a network, since specific causes can require special
- // handling
+ // the following NETWORK_* constants are used to indicates specific reasons
+ // for disallowing a
+ // download from using a network, since specific causes can require special
+ // handling
- /**
+ /**
* The network is usable for the given download.
*/
- public static final int NETWORK_OK = 1;
+ public static final int NETWORK_OK = 1;
- /**
+ /**
* There is no network connectivity.
*/
- public static final int NETWORK_NO_CONNECTION = 2;
+ public static final int NETWORK_NO_CONNECTION = 2;
- /**
+ /**
* The download exceeds the maximum size for this network.
*/
- public static final int NETWORK_UNUSABLE_DUE_TO_SIZE = 3;
+ public static final int NETWORK_UNUSABLE_DUE_TO_SIZE = 3;
- /**
+ /**
* The download exceeds the recommended maximum size for this network, the
* user must confirm for this download to proceed without WiFi.
*/
- public static final int NETWORK_RECOMMENDED_UNUSABLE_DUE_TO_SIZE = 4;
+ public static final int NETWORK_RECOMMENDED_UNUSABLE_DUE_TO_SIZE = 4;
- /**
+ /**
* The current connection is roaming, and the download can't proceed over a
* roaming connection.
*/
- public static final int NETWORK_CANNOT_USE_ROAMING = 5;
+ public static final int NETWORK_CANNOT_USE_ROAMING = 5;
- /**
+ /**
* The app requesting the download specific that it can't use the current
* network connection.
*/
- public static final int NETWORK_TYPE_DISALLOWED_BY_REQUESTOR = 6;
+ public static final int NETWORK_TYPE_DISALLOWED_BY_REQUESTOR = 6;
- /**
+ /**
* For intents used to notify the user that a download exceeds a size
* threshold, if this extra is true, WiFi is required for this download
* size; otherwise, it is only recommended.
*/
- public static final String EXTRA_IS_WIFI_REQUIRED = "isWifiRequired";
- public static final String EXTRA_FILE_NAME = "downloadId";
+ public static final String EXTRA_IS_WIFI_REQUIRED = "isWifiRequired";
+ public static final String EXTRA_FILE_NAME = "downloadId";
- /**
+ /**
* Used with DOWNLOAD_STATUS
*/
- public static final String EXTRA_STATUS_STATE = "ESS";
- public static final String EXTRA_STATUS_TOTAL_SIZE = "ETS";
- public static final String EXTRA_STATUS_CURRENT_FILE_SIZE = "CFS";
- public static final String EXTRA_STATUS_TOTAL_PROGRESS = "TFP";
- public static final String EXTRA_STATUS_CURRENT_PROGRESS = "CFP";
+ public static final String EXTRA_STATUS_STATE = "ESS";
+ public static final String EXTRA_STATUS_TOTAL_SIZE = "ETS";
+ public static final String EXTRA_STATUS_CURRENT_FILE_SIZE = "CFS";
+ public static final String EXTRA_STATUS_TOTAL_PROGRESS = "TFP";
+ public static final String EXTRA_STATUS_CURRENT_PROGRESS = "CFP";
- public static final String ACTION_DOWNLOADS_CHANGED = "downloadsChanged";
+ public static final String ACTION_DOWNLOADS_CHANGED = "downloadsChanged";
- /**
+ /**
* Broadcast intent action sent by the download manager when a download
* completes.
*/
- public final static String ACTION_DOWNLOAD_COMPLETE = "lvldownloader.intent.action.DOWNLOAD_COMPLETE";
+ public final static String ACTION_DOWNLOAD_COMPLETE = "lvldownloader.intent.action.DOWNLOAD_COMPLETE";
- /**
+ /**
* Broadcast intent action sent by the download manager when download status
* changes.
*/
- public final static String ACTION_DOWNLOAD_STATUS = "lvldownloader.intent.action.DOWNLOAD_STATUS";
+ public final static String ACTION_DOWNLOAD_STATUS = "lvldownloader.intent.action.DOWNLOAD_STATUS";
- /*
+ /*
* Lists the states that the download manager can set on a download to
* notify applications of the download progress. The codes follow the HTTP
* families:<br> 1xx: informational<br> 2xx: success<br> 3xx: redirects (not
@@ -144,503 +145,498 @@ public abstract class DownloaderService extends CustomIntentService implements I
* errors
*/
- /**
+ /**
* Returns whether the status is informational (i.e. 1xx).
*/
- public static boolean isStatusInformational(int status) {
- return (status >= 100 && status < 200);
- }
+ public static boolean isStatusInformational(int status) {
+ return (status >= 100 && status < 200);
+ }
- /**
+ /**
* Returns whether the status is a success (i.e. 2xx).
*/
- public static boolean isStatusSuccess(int status) {
- return (status >= 200 && status < 300);
- }
+ public static boolean isStatusSuccess(int status) {
+ return (status >= 200 && status < 300);
+ }
- /**
+ /**
* Returns whether the status is an error (i.e. 4xx or 5xx).
*/
- public static boolean isStatusError(int status) {
- return (status >= 400 && status < 600);
- }
+ public static boolean isStatusError(int status) {
+ return (status >= 400 && status < 600);
+ }
- /**
+ /**
* Returns whether the status is a client error (i.e. 4xx).
*/
- public static boolean isStatusClientError(int status) {
- return (status >= 400 && status < 500);
- }
+ public static boolean isStatusClientError(int status) {
+ return (status >= 400 && status < 500);
+ }
- /**
+ /**
* Returns whether the status is a server error (i.e. 5xx).
*/
- public static boolean isStatusServerError(int status) {
- return (status >= 500 && status < 600);
- }
+ public static boolean isStatusServerError(int status) {
+ return (status >= 500 && status < 600);
+ }
- /**
+ /**
* Returns whether the download has completed (either with success or
* error).
*/
- public static boolean isStatusCompleted(int status) {
- return (status >= 200 && status < 300)
- || (status >= 400 && status < 600);
- }
+ public static boolean isStatusCompleted(int status) {
+ return (status >= 200 && status < 300) || (status >= 400 && status < 600);
+ }
- /**
+ /**
* This download hasn't stated yet
*/
- public static final int STATUS_PENDING = 190;
+ public static final int STATUS_PENDING = 190;
- /**
+ /**
* This download has started
*/
- public static final int STATUS_RUNNING = 192;
+ public static final int STATUS_RUNNING = 192;
- /**
+ /**
* This download has been paused by the owning app.
*/
- public static final int STATUS_PAUSED_BY_APP = 193;
+ public static final int STATUS_PAUSED_BY_APP = 193;
- /**
+ /**
* This download encountered some network error and is waiting before
* retrying the request.
*/
- public static final int STATUS_WAITING_TO_RETRY = 194;
+ public static final int STATUS_WAITING_TO_RETRY = 194;
- /**
+ /**
* This download is waiting for network connectivity to proceed.
*/
- public static final int STATUS_WAITING_FOR_NETWORK = 195;
+ public static final int STATUS_WAITING_FOR_NETWORK = 195;
- /**
+ /**
* This download is waiting for a Wi-Fi connection to proceed or for
* permission to download over cellular.
*/
- public static final int STATUS_QUEUED_FOR_WIFI_OR_CELLULAR_PERMISSION = 196;
+ public static final int STATUS_QUEUED_FOR_WIFI_OR_CELLULAR_PERMISSION = 196;
- /**
+ /**
* This download is waiting for a Wi-Fi connection to proceed.
*/
- public static final int STATUS_QUEUED_FOR_WIFI = 197;
+ public static final int STATUS_QUEUED_FOR_WIFI = 197;
- /**
+ /**
* This download has successfully completed. Warning: there might be other
* status values that indicate success in the future. Use isSucccess() to
* capture the entire category.
- *
+ *
* @hide
*/
- public static final int STATUS_SUCCESS = 200;
+ public static final int STATUS_SUCCESS = 200;
- /**
+ /**
* The requested URL is no longer available
*/
- public static final int STATUS_FORBIDDEN = 403;
+ public static final int STATUS_FORBIDDEN = 403;
- /**
+ /**
* The file was delivered incorrectly
*/
- public static final int STATUS_FILE_DELIVERED_INCORRECTLY = 487;
+ public static final int STATUS_FILE_DELIVERED_INCORRECTLY = 487;
- /**
+ /**
* The requested destination file already exists.
*/
- public static final int STATUS_FILE_ALREADY_EXISTS_ERROR = 488;
+ public static final int STATUS_FILE_ALREADY_EXISTS_ERROR = 488;
- /**
+ /**
* Some possibly transient error occurred, but we can't resume the download.
*/
- public static final int STATUS_CANNOT_RESUME = 489;
+ public static final int STATUS_CANNOT_RESUME = 489;
- /**
+ /**
* This download was canceled
- *
+ *
* @hide
*/
- public static final int STATUS_CANCELED = 490;
+ public static final int STATUS_CANCELED = 490;
- /**
+ /**
* This download has completed with an error. Warning: there will be other
* status values that indicate errors in the future. Use isStatusError() to
* capture the entire category.
*/
- public static final int STATUS_UNKNOWN_ERROR = 491;
+ public static final int STATUS_UNKNOWN_ERROR = 491;
- /**
+ /**
* This download couldn't be completed because of a storage issue.
* Typically, that's because the filesystem is missing or full. Use the more
* specific {@link #STATUS_INSUFFICIENT_SPACE_ERROR} and
* {@link #STATUS_DEVICE_NOT_FOUND_ERROR} when appropriate.
- *
+ *
* @hide
*/
- public static final int STATUS_FILE_ERROR = 492;
+ public static final int STATUS_FILE_ERROR = 492;
- /**
+ /**
* This download couldn't be completed because of an HTTP redirect response
* that the download manager couldn't handle.
- *
+ *
* @hide
*/
- public static final int STATUS_UNHANDLED_REDIRECT = 493;
+ public static final int STATUS_UNHANDLED_REDIRECT = 493;
- /**
+ /**
* This download couldn't be completed because of an unspecified unhandled
* HTTP code.
- *
+ *
* @hide
*/
- public static final int STATUS_UNHANDLED_HTTP_CODE = 494;
+ public static final int STATUS_UNHANDLED_HTTP_CODE = 494;
- /**
+ /**
* This download couldn't be completed because of an error receiving or
* processing data at the HTTP level.
- *
+ *
* @hide
*/
- public static final int STATUS_HTTP_DATA_ERROR = 495;
+ public static final int STATUS_HTTP_DATA_ERROR = 495;
- /**
+ /**
* This download couldn't be completed because of an HttpException while
* setting up the request.
- *
+ *
* @hide
*/
- public static final int STATUS_HTTP_EXCEPTION = 496;
+ public static final int STATUS_HTTP_EXCEPTION = 496;
- /**
+ /**
* This download couldn't be completed because there were too many
* redirects.
- *
+ *
* @hide
*/
- public static final int STATUS_TOO_MANY_REDIRECTS = 497;
+ public static final int STATUS_TOO_MANY_REDIRECTS = 497;
- /**
+ /**
* This download couldn't be completed due to insufficient storage space.
* Typically, this is because the SD card is full.
- *
+ *
* @hide
*/
- public static final int STATUS_INSUFFICIENT_SPACE_ERROR = 498;
+ public static final int STATUS_INSUFFICIENT_SPACE_ERROR = 498;
- /**
+ /**
* This download couldn't be completed because no external storage device
* was found. Typically, this is because the SD card is not mounted.
- *
+ *
* @hide
*/
- public static final int STATUS_DEVICE_NOT_FOUND_ERROR = 499;
+ public static final int STATUS_DEVICE_NOT_FOUND_ERROR = 499;
- /**
+ /**
* This download is allowed to run.
- *
+ *
* @hide
*/
- public static final int CONTROL_RUN = 0;
+ public static final int CONTROL_RUN = 0;
- /**
+ /**
* This download must pause at the first opportunity.
- *
+ *
* @hide
*/
- public static final int CONTROL_PAUSED = 1;
+ public static final int CONTROL_PAUSED = 1;
- /**
+ /**
* This download is visible but only shows in the notifications while it's
* in progress.
- *
+ *
* @hide
*/
- public static final int VISIBILITY_VISIBLE = 0;
+ public static final int VISIBILITY_VISIBLE = 0;
- /**
+ /**
* This download is visible and shows in the notifications while in progress
* and after completion.
- *
+ *
* @hide
*/
- public static final int VISIBILITY_VISIBLE_NOTIFY_COMPLETED = 1;
+ public static final int VISIBILITY_VISIBLE_NOTIFY_COMPLETED = 1;
- /**
+ /**
* This download doesn't show in the UI or in the notifications.
- *
+ *
* @hide
*/
- public static final int VISIBILITY_HIDDEN = 2;
+ public static final int VISIBILITY_HIDDEN = 2;
- /**
- * Bit flag for {@link #setAllowedNetworkTypes} corresponding to
+ /**
+ * Bit flag for setAllowedNetworkTypes corresponding to
* {@link ConnectivityManager#TYPE_MOBILE}.
*/
- public static final int NETWORK_MOBILE = 1 << 0;
+ public static final int NETWORK_MOBILE = 1 << 0;
- /**
- * Bit flag for {@link #setAllowedNetworkTypes} corresponding to
+ /**
+ * Bit flag for setAllowedNetworkTypes corresponding to
* {@link ConnectivityManager#TYPE_WIFI}.
*/
- public static final int NETWORK_WIFI = 1 << 1;
+ public static final int NETWORK_WIFI = 1 << 1;
- private final static String TEMP_EXT = ".tmp";
+ private final static String TEMP_EXT = ".tmp";
- /**
+ /**
* Service thread status
*/
- private static boolean sIsRunning;
+ private static boolean sIsRunning;
- @Override
- public IBinder onBind(Intent paramIntent) {
- Log.d(Constants.TAG, "Service Bound");
- return this.mServiceMessenger.getBinder();
- }
+ @Override
+ public IBinder onBind(Intent paramIntent) {
+ Log.d(Constants.TAG, "Service Bound");
+ return this.mServiceMessenger.getBinder();
+ }
- /**
+ /**
* Network state.
*/
- private boolean mIsConnected;
- private boolean mIsFailover;
- private boolean mIsCellularConnection;
- private boolean mIsRoaming;
- private boolean mIsAtLeast3G;
- private boolean mIsAtLeast4G;
- private boolean mStateChanged;
+ private boolean mIsConnected;
+ private boolean mIsFailover;
+ private boolean mIsCellularConnection;
+ private boolean mIsRoaming;
+ private boolean mIsAtLeast3G;
+ private boolean mIsAtLeast4G;
+ private boolean mStateChanged;
- /**
+ /**
* Download state
*/
- private int mControl;
- private int mStatus;
+ private int mControl;
+ private int mStatus;
- public boolean isWiFi() {
- return mIsConnected && !mIsCellularConnection;
- }
+ public boolean isWiFi() {
+ return mIsConnected && !mIsCellularConnection;
+ }
- /**
+ /**
* Bindings to important services
*/
- private ConnectivityManager mConnectivityManager;
- private WifiManager mWifiManager;
+ private ConnectivityManager mConnectivityManager;
+ private WifiManager mWifiManager;
- /**
+ /**
* Package we are downloading for (defaults to package of application)
*/
- private PackageInfo mPackageInfo;
+ private PackageInfo mPackageInfo;
- /**
+ /**
* Byte counts
*/
- long mBytesSoFar;
- long mTotalLength;
- int mFileCount;
+ long mBytesSoFar;
+ long mTotalLength;
+ int mFileCount;
- /**
+ /**
* Used for calculating time remaining and speed
*/
- long mBytesAtSample;
- long mMillisecondsAtSample;
- float mAverageDownloadSpeed;
+ long mBytesAtSample;
+ long mMillisecondsAtSample;
+ float mAverageDownloadSpeed;
- /**
+ /**
* Our binding to the network state broadcasts
*/
- private BroadcastReceiver mConnReceiver;
- final private IStub mServiceStub = DownloaderServiceMarshaller.CreateStub(this);
- final private Messenger mServiceMessenger = mServiceStub.getMessenger();
- private Messenger mClientMessenger;
- private DownloadNotification mNotification;
- private PendingIntent mPendingIntent;
- private PendingIntent mAlarmIntent;
+ private BroadcastReceiver mConnReceiver;
+ final private IStub mServiceStub = DownloaderServiceMarshaller.CreateStub(this);
+ final private Messenger mServiceMessenger = mServiceStub.getMessenger();
+ private Messenger mClientMessenger;
+ private DownloadNotification mNotification;
+ private PendingIntent mPendingIntent;
+ private PendingIntent mAlarmIntent;
- /**
+ /**
* Updates the network type based upon the type and subtype returned from
* the connectivity manager. Subtype is only used for cellular signals.
- *
+ *
* @param type
* @param subType
*/
- private void updateNetworkType(int type, int subType) {
- switch (type) {
- case ConnectivityManager.TYPE_WIFI:
- case ConnectivityManager.TYPE_ETHERNET:
- case ConnectivityManager.TYPE_BLUETOOTH:
- mIsCellularConnection = false;
- mIsAtLeast3G = false;
- mIsAtLeast4G = false;
- break;
- case ConnectivityManager.TYPE_WIMAX:
- mIsCellularConnection = true;
- mIsAtLeast3G = true;
- mIsAtLeast4G = true;
- break;
- case ConnectivityManager.TYPE_MOBILE:
- mIsCellularConnection = true;
- switch (subType) {
- case TelephonyManager.NETWORK_TYPE_1xRTT:
- case TelephonyManager.NETWORK_TYPE_CDMA:
- case TelephonyManager.NETWORK_TYPE_EDGE:
- case TelephonyManager.NETWORK_TYPE_GPRS:
- case TelephonyManager.NETWORK_TYPE_IDEN:
- mIsAtLeast3G = false;
- mIsAtLeast4G = false;
- break;
- case TelephonyManager.NETWORK_TYPE_HSDPA:
- case TelephonyManager.NETWORK_TYPE_HSUPA:
- case TelephonyManager.NETWORK_TYPE_HSPA:
- case TelephonyManager.NETWORK_TYPE_EVDO_0:
- case TelephonyManager.NETWORK_TYPE_EVDO_A:
- case TelephonyManager.NETWORK_TYPE_UMTS:
- mIsAtLeast3G = true;
- mIsAtLeast4G = false;
- break;
- case TelephonyManager.NETWORK_TYPE_LTE: // 4G
- case TelephonyManager.NETWORK_TYPE_EHRPD: // 3G ++ interop
- // with 4G
- case TelephonyManager.NETWORK_TYPE_HSPAP: // 3G ++ but
- // marketed as
- // 4G
- mIsAtLeast3G = true;
- mIsAtLeast4G = true;
- break;
- default:
- mIsCellularConnection = false;
- mIsAtLeast3G = false;
- mIsAtLeast4G = false;
- }
- }
- }
-
- private void updateNetworkState(NetworkInfo info) {
- boolean isConnected = mIsConnected;
- boolean isFailover = mIsFailover;
- boolean isCellularConnection = mIsCellularConnection;
- boolean isRoaming = mIsRoaming;
- boolean isAtLeast3G = mIsAtLeast3G;
- if (null != info) {
- mIsRoaming = info.isRoaming();
- mIsFailover = info.isFailover();
- mIsConnected = info.isConnected();
- updateNetworkType(info.getType(), info.getSubtype());
- } else {
- mIsRoaming = false;
- mIsFailover = false;
- mIsConnected = false;
- updateNetworkType(-1, -1);
- }
- mStateChanged = (mStateChanged || isConnected != mIsConnected
- || isFailover != mIsFailover
- || isCellularConnection != mIsCellularConnection
- || isRoaming != mIsRoaming || isAtLeast3G != mIsAtLeast3G);
- if (Constants.LOGVV) {
- if (mStateChanged) {
- Log.v(LOG_TAG, "Network state changed: ");
- Log.v(LOG_TAG, "Starting State: " +
- (isConnected ? "Connected " : "Not Connected ") +
- (isCellularConnection ? "Cellular " : "WiFi ") +
- (isRoaming ? "Roaming " : "Local ") +
- (isAtLeast3G ? "3G+ " : "<3G "));
- Log.v(LOG_TAG, "Ending State: " +
- (mIsConnected ? "Connected " : "Not Connected ") +
- (mIsCellularConnection ? "Cellular " : "WiFi ") +
- (mIsRoaming ? "Roaming " : "Local ") +
- (mIsAtLeast3G ? "3G+ " : "<3G "));
-
- if (isServiceRunning()) {
- if (mIsRoaming) {
- mStatus = STATUS_WAITING_FOR_NETWORK;
- mControl = CONTROL_PAUSED;
- } else if (mIsCellularConnection) {
- DownloadsDB db = DownloadsDB.getDB(this);
- int flags = db.getFlags();
- if (0 == (flags & FLAGS_DOWNLOAD_OVER_CELLULAR)) {
- mStatus = STATUS_QUEUED_FOR_WIFI;
- mControl = CONTROL_PAUSED;
- }
- }
- }
-
- }
- }
- }
-
- /**
+ private void updateNetworkType(int type, int subType) {
+ switch (type) {
+ case ConnectivityManager.TYPE_WIFI:
+ case ConnectivityManager.TYPE_ETHERNET:
+ case ConnectivityManager.TYPE_BLUETOOTH:
+ mIsCellularConnection = false;
+ mIsAtLeast3G = false;
+ mIsAtLeast4G = false;
+ break;
+ case ConnectivityManager.TYPE_WIMAX:
+ mIsCellularConnection = true;
+ mIsAtLeast3G = true;
+ mIsAtLeast4G = true;
+ break;
+ case ConnectivityManager.TYPE_MOBILE:
+ mIsCellularConnection = true;
+ switch (subType) {
+ case TelephonyManager.NETWORK_TYPE_1xRTT:
+ case TelephonyManager.NETWORK_TYPE_CDMA:
+ case TelephonyManager.NETWORK_TYPE_EDGE:
+ case TelephonyManager.NETWORK_TYPE_GPRS:
+ case TelephonyManager.NETWORK_TYPE_IDEN:
+ mIsAtLeast3G = false;
+ mIsAtLeast4G = false;
+ break;
+ case TelephonyManager.NETWORK_TYPE_HSDPA:
+ case TelephonyManager.NETWORK_TYPE_HSUPA:
+ case TelephonyManager.NETWORK_TYPE_HSPA:
+ case TelephonyManager.NETWORK_TYPE_EVDO_0:
+ case TelephonyManager.NETWORK_TYPE_EVDO_A:
+ case TelephonyManager.NETWORK_TYPE_UMTS:
+ mIsAtLeast3G = true;
+ mIsAtLeast4G = false;
+ break;
+ case TelephonyManager.NETWORK_TYPE_LTE: // 4G
+ case TelephonyManager.NETWORK_TYPE_EHRPD: // 3G ++ interop
+ // with 4G
+ case TelephonyManager.NETWORK_TYPE_HSPAP: // 3G ++ but
+ // marketed as
+ // 4G
+ mIsAtLeast3G = true;
+ mIsAtLeast4G = true;
+ break;
+ default:
+ mIsCellularConnection = false;
+ mIsAtLeast3G = false;
+ mIsAtLeast4G = false;
+ }
+ }
+ }
+
+ private void updateNetworkState(NetworkInfo info) {
+ boolean isConnected = mIsConnected;
+ boolean isFailover = mIsFailover;
+ boolean isCellularConnection = mIsCellularConnection;
+ boolean isRoaming = mIsRoaming;
+ boolean isAtLeast3G = mIsAtLeast3G;
+ if (null != info) {
+ mIsRoaming = info.isRoaming();
+ mIsFailover = info.isFailover();
+ mIsConnected = info.isConnected();
+ updateNetworkType(info.getType(), info.getSubtype());
+ } else {
+ mIsRoaming = false;
+ mIsFailover = false;
+ mIsConnected = false;
+ updateNetworkType(-1, -1);
+ }
+ mStateChanged = (mStateChanged || isConnected != mIsConnected || isFailover != mIsFailover || isCellularConnection != mIsCellularConnection || isRoaming != mIsRoaming || isAtLeast3G != mIsAtLeast3G);
+ if (Constants.LOGVV) {
+ if (mStateChanged) {
+ Log.v(LOG_TAG, "Network state changed: ");
+ Log.v(LOG_TAG, "Starting State: " +
+ (isConnected ? "Connected " : "Not Connected ") +
+ (isCellularConnection ? "Cellular " : "WiFi ") +
+ (isRoaming ? "Roaming " : "Local ") +
+ (isAtLeast3G ? "3G+ " : "<3G "));
+ Log.v(LOG_TAG, "Ending State: " +
+ (mIsConnected ? "Connected " : "Not Connected ") +
+ (mIsCellularConnection ? "Cellular " : "WiFi ") +
+ (mIsRoaming ? "Roaming " : "Local ") +
+ (mIsAtLeast3G ? "3G+ " : "<3G "));
+
+ if (isServiceRunning()) {
+ if (mIsRoaming) {
+ mStatus = STATUS_WAITING_FOR_NETWORK;
+ mControl = CONTROL_PAUSED;
+ } else if (mIsCellularConnection) {
+ DownloadsDB db = DownloadsDB.getDB(this);
+ int flags = db.getFlags();
+ if (0 == (flags & FLAGS_DOWNLOAD_OVER_CELLULAR)) {
+ mStatus = STATUS_QUEUED_FOR_WIFI;
+ mControl = CONTROL_PAUSED;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
* Polls the network state, setting the flags appropriately.
*/
- void pollNetworkState() {
- if (null == mConnectivityManager) {
- mConnectivityManager = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
- }
- if (null == mWifiManager) {
- mWifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
- }
- if (mConnectivityManager == null) {
- Log.w(Constants.TAG,
- "couldn't get connectivity manager to poll network state");
- } else {
- NetworkInfo activeInfo = mConnectivityManager
- .getActiveNetworkInfo();
- updateNetworkState(activeInfo);
- }
- }
-
- public static final int NO_DOWNLOAD_REQUIRED = 0;
- public static final int LVL_CHECK_REQUIRED = 1;
- public static final int DOWNLOAD_REQUIRED = 2;
-
- public static final String EXTRA_PACKAGE_NAME = "EPN";
- public static final String EXTRA_PENDING_INTENT = "EPI";
- public static final String EXTRA_MESSAGE_HANDLER = "EMH";
-
- /**
+ void pollNetworkState() {
+ if (null == mConnectivityManager) {
+ mConnectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
+ }
+ if (null == mWifiManager) {
+ mWifiManager = (WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);
+ }
+ if (mConnectivityManager == null) {
+ Log.w(Constants.TAG,
+ "couldn't get connectivity manager to poll network state");
+ } else {
+ @SuppressLint("MissingPermission")
+ NetworkInfo activeInfo = mConnectivityManager
+ .getActiveNetworkInfo();
+ updateNetworkState(activeInfo);
+ }
+ }
+
+ public static final int NO_DOWNLOAD_REQUIRED = 0;
+ public static final int LVL_CHECK_REQUIRED = 1;
+ public static final int DOWNLOAD_REQUIRED = 2;
+
+ public static final String EXTRA_PACKAGE_NAME = "EPN";
+ public static final String EXTRA_PENDING_INTENT = "EPI";
+ public static final String EXTRA_MESSAGE_HANDLER = "EMH";
+
+ /**
* Returns true if the LVL check is required
- *
+ *
* @param db a downloads DB synchronized with the latest state
* @param pi the package info for the project
* @return returns true if the filenames need to be returned
*/
- private static boolean isLVLCheckRequired(DownloadsDB db, PackageInfo pi) {
- // we need to update the LVL check and get a successful status to
- // proceed
- if (db.mVersionCode != pi.versionCode) {
- return true;
- }
- return false;
- }
+ private static boolean isLVLCheckRequired(DownloadsDB db, PackageInfo pi) {
+ // we need to update the LVL check and get a successful status to
+ // proceed
+ if (db.mVersionCode != pi.versionCode) {
+ return true;
+ }
+ return false;
+ }
- /**
+ /**
* Careful! Only use this internally.
- *
+ *
* @return whether we think the service is running
*/
- private static synchronized boolean isServiceRunning() {
- return sIsRunning;
- }
-
- private static synchronized void setServiceRunning(boolean isRunning) {
- sIsRunning = isRunning;
- }
-
- public static int startDownloadServiceIfRequired(Context context,
- Intent intent, Class<?> serviceClass) throws NameNotFoundException {
- final PendingIntent pendingIntent = (PendingIntent) intent
- .getParcelableExtra(EXTRA_PENDING_INTENT);
- return startDownloadServiceIfRequired(context, pendingIntent,
- serviceClass);
- }
-
- public static int startDownloadServiceIfRequired(Context context,
- PendingIntent pendingIntent, Class<?> serviceClass)
- throws NameNotFoundException
- {
- String packageName = context.getPackageName();
- String className = serviceClass.getName();
-
- return startDownloadServiceIfRequired(context, pendingIntent,
- packageName, className);
- }
-
- /**
+ private static synchronized boolean isServiceRunning() {
+ return sIsRunning;
+ }
+
+ private static synchronized void setServiceRunning(boolean isRunning) {
+ sIsRunning = isRunning;
+ }
+
+ public static int startDownloadServiceIfRequired(Context context,
+ Intent intent, Class<?> serviceClass) throws NameNotFoundException {
+ final PendingIntent pendingIntent = (PendingIntent)intent
+ .getParcelableExtra(EXTRA_PENDING_INTENT);
+ return startDownloadServiceIfRequired(context, pendingIntent,
+ serviceClass);
+ }
+
+ public static int startDownloadServiceIfRequired(Context context,
+ PendingIntent pendingIntent, Class<?> serviceClass)
+ throws NameNotFoundException {
+ String packageName = context.getPackageName();
+ String className = serviceClass.getName();
+
+ return startDownloadServiceIfRequired(context, pendingIntent,
+ packageName, className);
+ }
+
+ /**
* Starts the download if necessary. This function starts a flow that does `
* many things. 1) Checks to see if the APK version has been checked and the
* metadata database updated 2) If the APK version does not match, checks
@@ -652,690 +648,673 @@ public abstract class DownloaderService extends CustomIntentService implements I
* to wait to hear about any updated APK expansion files. Note that this
* does mean that the application MUST be run for the first time with a
* network connection, even if Market delivers all of the files.
- *
+ *
* @param context
- * @param thisIntent
+ * @param pendingIntent
* @return true if the app should wait for more guidance from the
* downloader, false if the app can continue
* @throws NameNotFoundException
*/
- public static int startDownloadServiceIfRequired(Context context,
- PendingIntent pendingIntent, String classPackage, String className)
- throws NameNotFoundException {
- // first: do we need to do an LVL update?
- // we begin by getting our APK version from the package manager
- final PackageInfo pi = context.getPackageManager().getPackageInfo(
- context.getPackageName(), 0);
-
- int status = NO_DOWNLOAD_REQUIRED;
-
- // the database automatically reads the metadata for version code
- // and download status when the instance is created
- DownloadsDB db = DownloadsDB.getDB(context);
-
- // we need to update the LVL check and get a successful status to
- // proceed
- if (isLVLCheckRequired(db, pi)) {
- status = LVL_CHECK_REQUIRED;
- }
- // we don't have to update LVL. do we still have a download to start?
- if (db.mStatus == 0) {
- DownloadInfo[] infos = db.getDownloads();
- if (null != infos) {
- for (DownloadInfo info : infos) {
- if (!Helpers.doesFileExist(context, info.mFileName, info.mTotalBytes, true)) {
- status = DOWNLOAD_REQUIRED;
- db.updateStatus(-1);
- break;
- }
- }
- }
- } else {
- status = DOWNLOAD_REQUIRED;
- }
- switch (status) {
- case DOWNLOAD_REQUIRED:
- case LVL_CHECK_REQUIRED:
- Intent fileIntent = new Intent();
- fileIntent.setClassName(classPackage, className);
- fileIntent.putExtra(EXTRA_PENDING_INTENT, pendingIntent);
- context.startService(fileIntent);
- break;
- }
- return status;
- }
-
- @Override
- public void requestAbortDownload() {
- mControl = CONTROL_PAUSED;
- mStatus = STATUS_CANCELED;
- }
-
- @Override
- public void requestPauseDownload() {
- mControl = CONTROL_PAUSED;
- mStatus = STATUS_PAUSED_BY_APP;
- }
-
- @Override
- public void setDownloadFlags(int flags) {
- DownloadsDB.getDB(this).updateFlags(flags);
- }
-
- @Override
- public void requestContinueDownload() {
- if (mControl == CONTROL_PAUSED) {
- mControl = CONTROL_RUN;
- }
- Intent fileIntent = new Intent(this, this.getClass());
- fileIntent.putExtra(EXTRA_PENDING_INTENT, mPendingIntent);
- this.startService(fileIntent);
- }
-
- public abstract String getPublicKey();
-
- public abstract byte[] getSALT();
-
- public abstract String getAlarmReceiverClassName();
-
- private class LVLRunnable implements Runnable {
- LVLRunnable(Context context, PendingIntent intent) {
- mContext = context;
- mPendingIntent = intent;
- }
-
- final Context mContext;
-
- @Override
- public void run() {
- setServiceRunning(true);
- mNotification.onDownloadStateChanged(IDownloaderClient.STATE_FETCHING_URL);
- String deviceId = Secure.getString(mContext.getContentResolver(),
- Secure.ANDROID_ID);
-
- final APKExpansionPolicy aep = new APKExpansionPolicy(mContext,
- new AESObfuscator(getSALT(), mContext.getPackageName(), deviceId));
-
- // reset our policy back to the start of the world to force a
- // re-check
- aep.resetPolicy();
-
- // let's try and get the OBB file from LVL first
- // Construct the LicenseChecker with a Policy.
- final LicenseChecker checker = new LicenseChecker(mContext, aep,
- getPublicKey() // Your public licensing key.
- );
- checker.checkAccess(new LicenseCheckerCallback() {
-
- @Override
- public void allow(int reason) {
- try {
- int count = aep.getExpansionURLCount();
- DownloadsDB db = DownloadsDB.getDB(mContext);
- int status = 0;
- if (count != 0) {
- for (int i = 0; i < count; i++) {
- String currentFileName = aep
- .getExpansionFileName(i);
- if (null != currentFileName) {
- DownloadInfo di = new DownloadInfo(i,
- currentFileName, mContext.getPackageName());
-
- long fileSize = aep.getExpansionFileSize(i);
- if (handleFileUpdated(db, i, currentFileName,
- fileSize)) {
- status |= -1;
- di.resetDownload();
- di.mUri = aep.getExpansionURL(i);
- di.mTotalBytes = fileSize;
- di.mStatus = status;
- db.updateDownload(di);
- } else {
- // we need to read the download
- // information
- // from
- // the database
- DownloadInfo dbdi = db
- .getDownloadInfoByFileName(di.mFileName);
- if (null == dbdi) {
- // the file exists already and is
- // the
- // correct size
- // was delivered by Market or
- // through
- // another mechanism
- Log.d(LOG_TAG, "file " + di.mFileName
- + " found. Not downloading.");
- di.mStatus = STATUS_SUCCESS;
- di.mTotalBytes = fileSize;
- di.mCurrentBytes = fileSize;
- di.mUri = aep.getExpansionURL(i);
- db.updateDownload(di);
- } else if (dbdi.mStatus != STATUS_SUCCESS) {
- // we just update the URL
- dbdi.mUri = aep.getExpansionURL(i);
- db.updateDownload(dbdi);
- status |= -1;
- }
- }
- }
- }
- }
- // first: do we need to do an LVL update?
- // we begin by getting our APK version from the package
- // manager
- PackageInfo pi;
- try {
- pi = mContext.getPackageManager().getPackageInfo(
- mContext.getPackageName(), 0);
- db.updateMetadata(pi.versionCode, status);
- Class<?> serviceClass = DownloaderService.this.getClass();
- switch (startDownloadServiceIfRequired(mContext, mPendingIntent,
- serviceClass)) {
- case NO_DOWNLOAD_REQUIRED:
- mNotification
- .onDownloadStateChanged(IDownloaderClient.STATE_COMPLETED);
- break;
- case LVL_CHECK_REQUIRED:
- // DANGER WILL ROBINSON!
- Log.e(LOG_TAG, "In LVL checking loop!");
- mNotification
- .onDownloadStateChanged(IDownloaderClient.STATE_FAILED_UNLICENSED);
- throw new RuntimeException(
- "Error with LVL checking and database integrity");
- case DOWNLOAD_REQUIRED:
- // do nothing. the download will notify the
- // application
- // when things are done
- break;
- }
- } catch (NameNotFoundException e1) {
- e1.printStackTrace();
- throw new RuntimeException(
- "Error with getting information from package name");
- }
- } finally {
- setServiceRunning(false);
- }
- }
-
- @Override
- public void dontAllow(int reason) {
- try
- {
- switch (reason) {
- case Policy.NOT_LICENSED:
- mNotification
- .onDownloadStateChanged(IDownloaderClient.STATE_FAILED_UNLICENSED);
- break;
- case Policy.RETRY:
- mNotification
- .onDownloadStateChanged(IDownloaderClient.STATE_FAILED_FETCHING_URL);
- break;
- }
- } finally {
- setServiceRunning(false);
- }
-
- }
-
- @Override
- public void applicationError(int errorCode) {
- try {
- mNotification
- .onDownloadStateChanged(IDownloaderClient.STATE_FAILED_FETCHING_URL);
- } finally {
- setServiceRunning(false);
- }
- }
-
- });
-
- }
-
- };
-
- /**
+ public static int startDownloadServiceIfRequired(Context context,
+ PendingIntent pendingIntent, String classPackage, String className)
+ throws NameNotFoundException {
+ // first: do we need to do an LVL update?
+ // we begin by getting our APK version from the package manager
+ final PackageInfo pi = context.getPackageManager().getPackageInfo(
+ context.getPackageName(), 0);
+
+ int status = NO_DOWNLOAD_REQUIRED;
+
+ // the database automatically reads the metadata for version code
+ // and download status when the instance is created
+ DownloadsDB db = DownloadsDB.getDB(context);
+
+ // we need to update the LVL check and get a successful status to
+ // proceed
+ if (isLVLCheckRequired(db, pi)) {
+ status = LVL_CHECK_REQUIRED;
+ }
+ // we don't have to update LVL. do we still have a download to start?
+ if (db.mStatus == 0) {
+ DownloadInfo[] infos = db.getDownloads();
+ if (null != infos) {
+ for (DownloadInfo info : infos) {
+ if (!Helpers.doesFileExist(context, info.mFileName, info.mTotalBytes, true)) {
+ status = DOWNLOAD_REQUIRED;
+ db.updateStatus(-1);
+ break;
+ }
+ }
+ }
+ } else {
+ status = DOWNLOAD_REQUIRED;
+ }
+ switch (status) {
+ case DOWNLOAD_REQUIRED:
+ case LVL_CHECK_REQUIRED:
+ Intent fileIntent = new Intent();
+ fileIntent.setClassName(classPackage, className);
+ fileIntent.putExtra(EXTRA_PENDING_INTENT, pendingIntent);
+ context.startService(fileIntent);
+ break;
+ }
+ return status;
+ }
+
+ @Override
+ public void requestAbortDownload() {
+ mControl = CONTROL_PAUSED;
+ mStatus = STATUS_CANCELED;
+ }
+
+ @Override
+ public void requestPauseDownload() {
+ mControl = CONTROL_PAUSED;
+ mStatus = STATUS_PAUSED_BY_APP;
+ }
+
+ @Override
+ public void setDownloadFlags(int flags) {
+ DownloadsDB.getDB(this).updateFlags(flags);
+ }
+
+ @Override
+ public void requestContinueDownload() {
+ if (mControl == CONTROL_PAUSED) {
+ mControl = CONTROL_RUN;
+ }
+ Intent fileIntent = new Intent(this, this.getClass());
+ fileIntent.putExtra(EXTRA_PENDING_INTENT, mPendingIntent);
+ this.startService(fileIntent);
+ }
+
+ public abstract String getPublicKey();
+
+ public abstract byte[] getSALT();
+
+ public abstract String getAlarmReceiverClassName();
+
+ private class LVLRunnable implements Runnable {
+ LVLRunnable(Context context, PendingIntent intent) {
+ mContext = context;
+ mPendingIntent = intent;
+ }
+
+ final Context mContext;
+
+ @Override
+ public void run() {
+ setServiceRunning(true);
+ mNotification.onDownloadStateChanged(IDownloaderClient.STATE_FETCHING_URL);
+ String deviceId = Secure.ANDROID_ID;
+
+ final APKExpansionPolicy aep = new APKExpansionPolicy(mContext,
+ new AESObfuscator(getSALT(), mContext.getPackageName(), deviceId));
+
+ // reset our policy back to the start of the world to force a
+ // re-check
+ aep.resetPolicy();
+
+ // let's try and get the OBB file from LVL first
+ // Construct the LicenseChecker with a Policy.
+ final LicenseChecker checker = new LicenseChecker(mContext, aep,
+ getPublicKey() // Your public licensing key.
+ );
+ checker.checkAccess(new LicenseCheckerCallback() {
+ @Override
+ public void allow(int reason) {
+ try {
+ int count = aep.getExpansionURLCount();
+ DownloadsDB db = DownloadsDB.getDB(mContext);
+ int status = 0;
+ if (count != 0) {
+ for (int i = 0; i < count; i++) {
+ String currentFileName = aep
+ .getExpansionFileName(i);
+ if (null != currentFileName) {
+ DownloadInfo di = new DownloadInfo(i,
+ currentFileName, mContext.getPackageName());
+
+ long fileSize = aep.getExpansionFileSize(i);
+ if (handleFileUpdated(db, i, currentFileName,
+ fileSize)) {
+ status |= -1;
+ di.resetDownload();
+ di.mUri = aep.getExpansionURL(i);
+ di.mTotalBytes = fileSize;
+ di.mStatus = status;
+ db.updateDownload(di);
+ } else {
+ // we need to read the download
+ // information
+ // from
+ // the database
+ DownloadInfo dbdi = db
+ .getDownloadInfoByFileName(di.mFileName);
+ if (null == dbdi) {
+ // the file exists already and is
+ // the
+ // correct size
+ // was delivered by Market or
+ // through
+ // another mechanism
+ Log.d(LOG_TAG, "file " + di.mFileName + " found. Not downloading.");
+ di.mStatus = STATUS_SUCCESS;
+ di.mTotalBytes = fileSize;
+ di.mCurrentBytes = fileSize;
+ di.mUri = aep.getExpansionURL(i);
+ db.updateDownload(di);
+ } else if (dbdi.mStatus != STATUS_SUCCESS) {
+ // we just update the URL
+ dbdi.mUri = aep.getExpansionURL(i);
+ db.updateDownload(dbdi);
+ status |= -1;
+ }
+ }
+ }
+ }
+ }
+ // first: do we need to do an LVL update?
+ // we begin by getting our APK version from the package
+ // manager
+ PackageInfo pi;
+ try {
+ pi = mContext.getPackageManager().getPackageInfo(
+ mContext.getPackageName(), 0);
+ db.updateMetadata(pi.versionCode, status);
+ Class<?> serviceClass = DownloaderService.this.getClass();
+ switch (startDownloadServiceIfRequired(mContext, mPendingIntent,
+ serviceClass)) {
+ case NO_DOWNLOAD_REQUIRED:
+ mNotification
+ .onDownloadStateChanged(IDownloaderClient.STATE_COMPLETED);
+ break;
+ case LVL_CHECK_REQUIRED:
+ // DANGER WILL ROBINSON!
+ Log.e(LOG_TAG, "In LVL checking loop!");
+ mNotification
+ .onDownloadStateChanged(IDownloaderClient.STATE_FAILED_UNLICENSED);
+ throw new RuntimeException(
+ "Error with LVL checking and database integrity");
+ case DOWNLOAD_REQUIRED:
+ // do nothing. the download will notify the
+ // application
+ // when things are done
+ break;
+ }
+ } catch (NameNotFoundException e1) {
+ e1.printStackTrace();
+ throw new RuntimeException(
+ "Error with getting information from package name");
+ }
+ } finally {
+ setServiceRunning(false);
+ }
+ }
+
+ @Override
+ public void dontAllow(int reason) {
+ try {
+ switch (reason) {
+ case Policy.NOT_LICENSED:
+ mNotification
+ .onDownloadStateChanged(IDownloaderClient.STATE_FAILED_UNLICENSED);
+ break;
+ case Policy.RETRY:
+ mNotification
+ .onDownloadStateChanged(IDownloaderClient.STATE_FAILED_FETCHING_URL);
+ break;
+ }
+ } finally {
+ setServiceRunning(false);
+ }
+ }
+
+ @Override
+ public void applicationError(int errorCode) {
+ try {
+ mNotification
+ .onDownloadStateChanged(IDownloaderClient.STATE_FAILED_FETCHING_URL);
+ } finally {
+ setServiceRunning(false);
+ }
+ }
+ });
+ }
+ };
+
+ /**
* Updates the LVL information from the server.
- *
+ *
* @param context
*/
- public void updateLVL(final Context context) {
- Context c = context.getApplicationContext();
- Handler h = new Handler(c.getMainLooper());
- h.post(new LVLRunnable(c, mPendingIntent));
- }
+ public void updateLVL(final Context context) {
+ Context c = context.getApplicationContext();
+ Handler h = new Handler(c.getMainLooper());
+ h.post(new LVLRunnable(c, mPendingIntent));
+ }
- /**
+ /**
* The APK has been updated and a filename has been sent down from the
* Market call. If the file has the same name as the previous file, we do
* nothing as the file is guaranteed to be the same. If the file does not
* have the same name, we download it if it hasn't already been delivered by
* Market.
- *
+ *
* @param index the index of the file from market (0 = main, 1 = patch)
* @param filename the name of the new file
* @param fileSize the size of the new file
* @return
*/
- public boolean handleFileUpdated(DownloadsDB db, int index,
- String filename, long fileSize) {
- DownloadInfo di = db.getDownloadInfoByFileName(filename);
- if (null != di) {
- String oldFile = di.mFileName;
- // cleanup
- if (null != oldFile) {
- if (filename.equals(oldFile)) {
- return false;
- }
-
- // remove partially downloaded file if it is there
- String deleteFile = Helpers.generateSaveFileName(this, oldFile);
- File f = new File(deleteFile);
- if (f.exists())
- f.delete();
- }
- }
- return !Helpers.doesFileExist(this, filename, fileSize, true);
- }
-
- private void scheduleAlarm(long wakeUp) {
- AlarmManager alarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
- if (alarms == null) {
- Log.e(Constants.TAG, "couldn't get alarm manager");
- return;
- }
-
- if (Constants.LOGV) {
- Log.v(Constants.TAG, "scheduling retry in " + wakeUp + "ms");
- }
-
- String className = getAlarmReceiverClassName();
- Intent intent = new Intent(Constants.ACTION_RETRY);
- intent.putExtra(EXTRA_PENDING_INTENT, mPendingIntent);
- intent.setClassName(this.getPackageName(),
- className);
- mAlarmIntent = PendingIntent.getBroadcast(this, 0, intent,
- PendingIntent.FLAG_ONE_SHOT);
- alarms.set(
- AlarmManager.RTC_WAKEUP,
- System.currentTimeMillis() + wakeUp, mAlarmIntent
- );
- }
-
- private void cancelAlarms() {
- if (null != mAlarmIntent) {
- AlarmManager alarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
- if (alarms == null) {
- Log.e(Constants.TAG, "couldn't get alarm manager");
- return;
- }
- alarms.cancel(mAlarmIntent);
- mAlarmIntent = null;
- }
- }
-
- /**
+ public boolean handleFileUpdated(DownloadsDB db, int index,
+ String filename, long fileSize) {
+ DownloadInfo di = db.getDownloadInfoByFileName(filename);
+ if (null != di) {
+ String oldFile = di.mFileName;
+ // cleanup
+ if (null != oldFile) {
+ if (filename.equals(oldFile)) {
+ return false;
+ }
+
+ // remove partially downloaded file if it is there
+ String deleteFile = Helpers.generateSaveFileName(this, oldFile);
+ File f = new File(deleteFile);
+ if (f.exists())
+ f.delete();
+ }
+ }
+ return !Helpers.doesFileExist(this, filename, fileSize, true);
+ }
+
+ private void scheduleAlarm(long wakeUp) {
+ AlarmManager alarms = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
+ if (alarms == null) {
+ Log.e(Constants.TAG, "couldn't get alarm manager");
+ return;
+ }
+
+ if (Constants.LOGV) {
+ Log.v(Constants.TAG, "scheduling retry in " + wakeUp + "ms");
+ }
+
+ String className = getAlarmReceiverClassName();
+ Intent intent = new Intent(Constants.ACTION_RETRY);
+ intent.putExtra(EXTRA_PENDING_INTENT, mPendingIntent);
+ intent.setClassName(this.getPackageName(),
+ className);
+ mAlarmIntent = PendingIntent.getBroadcast(this, 0, intent,
+ PendingIntent.FLAG_ONE_SHOT);
+ alarms.set(
+ AlarmManager.RTC_WAKEUP,
+ System.currentTimeMillis() + wakeUp, mAlarmIntent);
+ }
+
+ private void cancelAlarms() {
+ if (null != mAlarmIntent) {
+ AlarmManager alarms = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
+ if (alarms == null) {
+ Log.e(Constants.TAG, "couldn't get alarm manager");
+ return;
+ }
+ alarms.cancel(mAlarmIntent);
+ mAlarmIntent = null;
+ }
+ }
+
+ /**
* We use this to track network state, such as when WiFi, Cellular, etc. is
* enabled when downloads are paused or in progress.
*/
- private class InnerBroadcastReceiver extends BroadcastReceiver {
- final Service mService;
-
- InnerBroadcastReceiver(Service service) {
- mService = service;
- }
-
- @Override
- public void onReceive(Context context, Intent intent) {
- pollNetworkState();
- if (mStateChanged
- && !isServiceRunning()) {
- Log.d(Constants.TAG, "InnerBroadcastReceiver Called");
- Intent fileIntent = new Intent(context, mService.getClass());
- fileIntent.putExtra(EXTRA_PENDING_INTENT, mPendingIntent);
- // send a new intent to the service
- context.startService(fileIntent);
- }
- }
- };
-
- /**
+ private class InnerBroadcastReceiver extends BroadcastReceiver {
+ final Service mService;
+
+ InnerBroadcastReceiver(Service service) {
+ mService = service;
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ pollNetworkState();
+ if (mStateChanged && !isServiceRunning()) {
+ Log.d(Constants.TAG, "InnerBroadcastReceiver Called");
+ Intent fileIntent = new Intent(context, mService.getClass());
+ fileIntent.putExtra(EXTRA_PENDING_INTENT, mPendingIntent);
+ // send a new intent to the service
+ context.startService(fileIntent);
+ }
+ }
+ };
+
+ /**
* This is the main thread for the Downloader. This thread is responsible
* for queuing up downloads and other goodness.
*/
- @Override
- protected void onHandleIntent(Intent intent) {
- setServiceRunning(true);
- try {
- // the database automatically reads the metadata for version code
- // and download status when the instance is created
- DownloadsDB db = DownloadsDB.getDB(this);
- final PendingIntent pendingIntent = (PendingIntent) intent
- .getParcelableExtra(EXTRA_PENDING_INTENT);
-
- if (null != pendingIntent)
- {
- mNotification.setClientIntent(pendingIntent);
- mPendingIntent = pendingIntent;
- } else if (null != mPendingIntent) {
- mNotification.setClientIntent(mPendingIntent);
- } else {
- Log.e(LOG_TAG, "Downloader started in bad state without notification intent.");
- return;
- }
-
- // when the LVL check completes, a successful response will update
- // the service
- if (isLVLCheckRequired(db, mPackageInfo)) {
- updateLVL(this);
- return;
- }
-
- // get each download
- DownloadInfo[] infos = db.getDownloads();
- mBytesSoFar = 0;
- mTotalLength = 0;
- mFileCount = infos.length;
- for (DownloadInfo info : infos) {
- // We do an (simple) integrity check on each file, just to make
- // sure
- if (info.mStatus == STATUS_SUCCESS) {
- // verify that the file matches the state
- if (!Helpers.doesFileExist(this, info.mFileName, info.mTotalBytes, true)) {
- info.mStatus = 0;
- info.mCurrentBytes = 0;
- }
- }
- // get aggregate data
- mTotalLength += info.mTotalBytes;
- mBytesSoFar += info.mCurrentBytes;
- }
-
- // loop through all downloads and fetch them
- pollNetworkState();
- if (null == mConnReceiver) {
-
- /**
+ @Override
+ protected void onHandleIntent(Intent intent) {
+ setServiceRunning(true);
+ try {
+ // the database automatically reads the metadata for version code
+ // and download status when the instance is created
+ DownloadsDB db = DownloadsDB.getDB(this);
+ final PendingIntent pendingIntent = (PendingIntent)intent
+ .getParcelableExtra(EXTRA_PENDING_INTENT);
+
+ if (null != pendingIntent) {
+ mNotification.setClientIntent(pendingIntent);
+ mPendingIntent = pendingIntent;
+ } else if (null != mPendingIntent) {
+ mNotification.setClientIntent(mPendingIntent);
+ } else {
+ Log.e(LOG_TAG, "Downloader started in bad state without notification intent.");
+ return;
+ }
+
+ // when the LVL check completes, a successful response will update
+ // the service
+ if (isLVLCheckRequired(db, mPackageInfo)) {
+ updateLVL(this);
+ return;
+ }
+
+ // get each download
+ DownloadInfo[] infos = db.getDownloads();
+ mBytesSoFar = 0;
+ mTotalLength = 0;
+ mFileCount = infos.length;
+ for (DownloadInfo info : infos) {
+ // We do an (simple) integrity check on each file, just to make
+ // sure
+ if (info.mStatus == STATUS_SUCCESS) {
+ // verify that the file matches the state
+ if (!Helpers.doesFileExist(this, info.mFileName, info.mTotalBytes, true)) {
+ info.mStatus = 0;
+ info.mCurrentBytes = 0;
+ }
+ }
+ // get aggregate data
+ mTotalLength += info.mTotalBytes;
+ mBytesSoFar += info.mCurrentBytes;
+ }
+
+ // loop through all downloads and fetch them
+ pollNetworkState();
+ if (null == mConnReceiver) {
+
+ /**
* We use this to track network state, such as when WiFi,
* Cellular, etc. is enabled when downloads are paused or in
* progress.
*/
- mConnReceiver = new InnerBroadcastReceiver(this);
- IntentFilter intentFilter = new IntentFilter(
- ConnectivityManager.CONNECTIVITY_ACTION);
- intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
- registerReceiver(mConnReceiver, intentFilter);
- }
-
- for (DownloadInfo info : infos) {
- long startingCount = info.mCurrentBytes;
-
- if (info.mStatus != STATUS_SUCCESS) {
- DownloadThread dt = new DownloadThread(info, this, mNotification);
- cancelAlarms();
- scheduleAlarm(Constants.ACTIVE_THREAD_WATCHDOG);
- dt.run();
- cancelAlarms();
- }
- db.updateFromDb(info);
- boolean setWakeWatchdog = false;
- int notifyStatus;
- switch (info.mStatus) {
- case STATUS_FORBIDDEN:
- // the URL is out of date
- updateLVL(this);
- return;
- case STATUS_SUCCESS:
- mBytesSoFar += info.mCurrentBytes - startingCount;
- db.updateMetadata(mPackageInfo.versionCode, 0);
- continue;
- case STATUS_FILE_DELIVERED_INCORRECTLY:
- // we may be on a network that is returning us a web
- // page on redirect
- notifyStatus = IDownloaderClient.STATE_PAUSED_NETWORK_SETUP_FAILURE;
- info.mCurrentBytes = 0;
- db.updateDownload(info);
- setWakeWatchdog = true;
- break;
- case STATUS_PAUSED_BY_APP:
- notifyStatus = IDownloaderClient.STATE_PAUSED_BY_REQUEST;
- break;
- case STATUS_WAITING_FOR_NETWORK:
- case STATUS_WAITING_TO_RETRY:
- notifyStatus = IDownloaderClient.STATE_PAUSED_NETWORK_UNAVAILABLE;
- setWakeWatchdog = true;
- break;
- case STATUS_QUEUED_FOR_WIFI_OR_CELLULAR_PERMISSION:
- case STATUS_QUEUED_FOR_WIFI:
- // look for more detail here
- if (null != mWifiManager) {
- if (!mWifiManager.isWifiEnabled()) {
- notifyStatus = IDownloaderClient.STATE_PAUSED_WIFI_DISABLED_NEED_CELLULAR_PERMISSION;
- setWakeWatchdog = true;
- break;
- }
- }
- notifyStatus = IDownloaderClient.STATE_PAUSED_NEED_CELLULAR_PERMISSION;
- setWakeWatchdog = true;
- break;
- case STATUS_CANCELED:
- notifyStatus = IDownloaderClient.STATE_FAILED_CANCELED;
- setWakeWatchdog = true;
- break;
-
- case STATUS_INSUFFICIENT_SPACE_ERROR:
- notifyStatus = IDownloaderClient.STATE_FAILED_SDCARD_FULL;
- setWakeWatchdog = true;
- break;
-
- case STATUS_DEVICE_NOT_FOUND_ERROR:
- notifyStatus = IDownloaderClient.STATE_PAUSED_SDCARD_UNAVAILABLE;
- setWakeWatchdog = true;
- break;
-
- default:
- notifyStatus = IDownloaderClient.STATE_FAILED;
- break;
- }
- if (setWakeWatchdog) {
- scheduleAlarm(Constants.WATCHDOG_WAKE_TIMER);
- } else {
- cancelAlarms();
- }
- // failure or pause state
- mNotification.onDownloadStateChanged(notifyStatus);
- return;
- }
-
- // all downloads complete
- mNotification.onDownloadStateChanged(IDownloaderClient.STATE_COMPLETED);
- } finally {
- setServiceRunning(false);
- }
- }
-
- @Override
- public void onDestroy() {
- if (null != mConnReceiver) {
- unregisterReceiver(mConnReceiver);
- mConnReceiver = null;
- }
- mServiceStub.disconnect(this);
- super.onDestroy();
- }
-
- public int getNetworkAvailabilityState(DownloadsDB db) {
- if (mIsConnected) {
- if (!mIsCellularConnection)
- return NETWORK_OK;
- int flags = db.mFlags;
- if (mIsRoaming)
- return NETWORK_CANNOT_USE_ROAMING;
- if (0 != (flags & FLAGS_DOWNLOAD_OVER_CELLULAR)) {
- return NETWORK_OK;
- } else {
- return NETWORK_TYPE_DISALLOWED_BY_REQUESTOR;
- }
- }
- return NETWORK_NO_CONNECTION;
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
- try {
- mPackageInfo = getPackageManager().getPackageInfo(
- getPackageName(), 0);
- ApplicationInfo ai = getApplicationInfo();
- CharSequence applicationLabel = getPackageManager().getApplicationLabel(ai);
- mNotification = new DownloadNotification(this, applicationLabel);
-
- } catch (NameNotFoundException e) {
- e.printStackTrace();
- }
- }
-
- /**
+ mConnReceiver = new InnerBroadcastReceiver(this);
+ IntentFilter intentFilter = new IntentFilter(
+ ConnectivityManager.CONNECTIVITY_ACTION);
+ intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
+ registerReceiver(mConnReceiver, intentFilter);
+ }
+
+ for (DownloadInfo info : infos) {
+ long startingCount = info.mCurrentBytes;
+
+ if (info.mStatus != STATUS_SUCCESS) {
+ DownloadThread dt = new DownloadThread(info, this, mNotification);
+ cancelAlarms();
+ scheduleAlarm(Constants.ACTIVE_THREAD_WATCHDOG);
+ dt.run();
+ cancelAlarms();
+ }
+ db.updateFromDb(info);
+ boolean setWakeWatchdog = false;
+ int notifyStatus;
+ switch (info.mStatus) {
+ case STATUS_FORBIDDEN:
+ // the URL is out of date
+ updateLVL(this);
+ return;
+ case STATUS_SUCCESS:
+ mBytesSoFar += info.mCurrentBytes - startingCount;
+ db.updateMetadata(mPackageInfo.versionCode, 0);
+ continue;
+ case STATUS_FILE_DELIVERED_INCORRECTLY:
+ // we may be on a network that is returning us a web
+ // page on redirect
+ notifyStatus = IDownloaderClient.STATE_PAUSED_NETWORK_SETUP_FAILURE;
+ info.mCurrentBytes = 0;
+ db.updateDownload(info);
+ setWakeWatchdog = true;
+ break;
+ case STATUS_PAUSED_BY_APP:
+ notifyStatus = IDownloaderClient.STATE_PAUSED_BY_REQUEST;
+ break;
+ case STATUS_WAITING_FOR_NETWORK:
+ case STATUS_WAITING_TO_RETRY:
+ notifyStatus = IDownloaderClient.STATE_PAUSED_NETWORK_UNAVAILABLE;
+ setWakeWatchdog = true;
+ break;
+ case STATUS_QUEUED_FOR_WIFI_OR_CELLULAR_PERMISSION:
+ case STATUS_QUEUED_FOR_WIFI:
+ // look for more detail here
+ if (null != mWifiManager) {
+ if (!mWifiManager.isWifiEnabled()) {
+ notifyStatus = IDownloaderClient.STATE_PAUSED_WIFI_DISABLED_NEED_CELLULAR_PERMISSION;
+ setWakeWatchdog = true;
+ break;
+ }
+ }
+ notifyStatus = IDownloaderClient.STATE_PAUSED_NEED_CELLULAR_PERMISSION;
+ setWakeWatchdog = true;
+ break;
+ case STATUS_CANCELED:
+ notifyStatus = IDownloaderClient.STATE_FAILED_CANCELED;
+ setWakeWatchdog = true;
+ break;
+
+ case STATUS_INSUFFICIENT_SPACE_ERROR:
+ notifyStatus = IDownloaderClient.STATE_FAILED_SDCARD_FULL;
+ setWakeWatchdog = true;
+ break;
+
+ case STATUS_DEVICE_NOT_FOUND_ERROR:
+ notifyStatus = IDownloaderClient.STATE_PAUSED_SDCARD_UNAVAILABLE;
+ setWakeWatchdog = true;
+ break;
+
+ default:
+ notifyStatus = IDownloaderClient.STATE_FAILED;
+ break;
+ }
+ if (setWakeWatchdog) {
+ scheduleAlarm(Constants.WATCHDOG_WAKE_TIMER);
+ } else {
+ cancelAlarms();
+ }
+ // failure or pause state
+ mNotification.onDownloadStateChanged(notifyStatus);
+ return;
+ }
+
+ // all downloads complete
+ mNotification.onDownloadStateChanged(IDownloaderClient.STATE_COMPLETED);
+ } finally {
+ setServiceRunning(false);
+ }
+ }
+
+ @Override
+ public void onDestroy() {
+ if (null != mConnReceiver) {
+ unregisterReceiver(mConnReceiver);
+ mConnReceiver = null;
+ }
+ mServiceStub.disconnect(this);
+ super.onDestroy();
+ }
+
+ public int getNetworkAvailabilityState(DownloadsDB db) {
+ if (mIsConnected) {
+ if (!mIsCellularConnection)
+ return NETWORK_OK;
+ int flags = db.mFlags;
+ if (mIsRoaming)
+ return NETWORK_CANNOT_USE_ROAMING;
+ if (0 != (flags & FLAGS_DOWNLOAD_OVER_CELLULAR)) {
+ return NETWORK_OK;
+ } else {
+ return NETWORK_TYPE_DISALLOWED_BY_REQUESTOR;
+ }
+ }
+ return NETWORK_NO_CONNECTION;
+ }
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ try {
+ mPackageInfo = getPackageManager().getPackageInfo(
+ getPackageName(), 0);
+ ApplicationInfo ai = getApplicationInfo();
+ CharSequence applicationLabel = getPackageManager().getApplicationLabel(ai);
+ mNotification = new DownloadNotification(this, applicationLabel);
+
+ } catch (NameNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
* Exception thrown from methods called by generateSaveFile() for any fatal
* error.
*/
- public static class GenerateSaveFileError extends Exception {
- private static final long serialVersionUID = 3465966015408936540L;
- int mStatus;
- String mMessage;
+ public static class GenerateSaveFileError extends Exception {
+ private static final long serialVersionUID = 3465966015408936540L;
+ int mStatus;
+ String mMessage;
- public GenerateSaveFileError(int status, String message) {
- mStatus = status;
- mMessage = message;
- }
- }
+ public GenerateSaveFileError(int status, String message) {
+ mStatus = status;
+ mMessage = message;
+ }
+ }
- /**
+ /**
* Returns the filename (where the file should be saved) from info about a
* download
*/
- public String generateTempSaveFileName(String fileName) {
- String path = Helpers.getSaveFilePath(this)
- + File.separator + fileName + TEMP_EXT;
- return path;
- }
+ public String generateTempSaveFileName(String fileName) {
+ String path = Helpers.getSaveFilePath(this) + File.separator + fileName + TEMP_EXT;
+ return path;
+ }
- /**
+ /**
* Creates a filename (where the file should be saved) from info about a
* download.
*/
- public String generateSaveFile(String filename, long filesize)
- throws GenerateSaveFileError {
- String path = generateTempSaveFileName(filename);
- File expPath = new File(path);
- if (!Helpers.isExternalMediaMounted()) {
- Log.d(Constants.TAG, "External media not mounted: " + path);
- throw new GenerateSaveFileError(STATUS_DEVICE_NOT_FOUND_ERROR,
- "external media is not yet mounted");
-
- }
- if (expPath.exists()) {
- Log.d(Constants.TAG, "File already exists: " + path);
- throw new GenerateSaveFileError(STATUS_FILE_ALREADY_EXISTS_ERROR,
- "requested destination file already exists");
- }
- if (Helpers.getAvailableBytes(Helpers.getFilesystemRoot(path)) < filesize) {
- throw new GenerateSaveFileError(STATUS_INSUFFICIENT_SPACE_ERROR,
- "insufficient space on external storage");
- }
- return path;
- }
-
- /**
+ public String generateSaveFile(String filename, long filesize)
+ throws GenerateSaveFileError {
+ String path = generateTempSaveFileName(filename);
+ File expPath = new File(path);
+ if (!Helpers.isExternalMediaMounted()) {
+ Log.d(Constants.TAG, "External media not mounted: " + path);
+ throw new GenerateSaveFileError(STATUS_DEVICE_NOT_FOUND_ERROR,
+ "external media is not yet mounted");
+ }
+ if (expPath.exists()) {
+ Log.d(Constants.TAG, "File already exists: " + path);
+ throw new GenerateSaveFileError(STATUS_FILE_ALREADY_EXISTS_ERROR,
+ "requested destination file already exists");
+ }
+ if (Helpers.getAvailableBytes(Helpers.getFilesystemRoot(path)) < filesize) {
+ throw new GenerateSaveFileError(STATUS_INSUFFICIENT_SPACE_ERROR,
+ "insufficient space on external storage");
+ }
+ return path;
+ }
+
+ /**
* @return a non-localized string appropriate for logging corresponding to
* one of the NETWORK_* constants.
*/
- public String getLogMessageForNetworkError(int networkError) {
- switch (networkError) {
- case NETWORK_RECOMMENDED_UNUSABLE_DUE_TO_SIZE:
- return "download size exceeds recommended limit for mobile network";
+ public String getLogMessageForNetworkError(int networkError) {
+ switch (networkError) {
+ case NETWORK_RECOMMENDED_UNUSABLE_DUE_TO_SIZE:
+ return "download size exceeds recommended limit for mobile network";
- case NETWORK_UNUSABLE_DUE_TO_SIZE:
- return "download size exceeds limit for mobile network";
+ case NETWORK_UNUSABLE_DUE_TO_SIZE:
+ return "download size exceeds limit for mobile network";
- case NETWORK_NO_CONNECTION:
- return "no network connection available";
+ case NETWORK_NO_CONNECTION:
+ return "no network connection available";
- case NETWORK_CANNOT_USE_ROAMING:
- return "download cannot use the current network connection because it is roaming";
+ case NETWORK_CANNOT_USE_ROAMING:
+ return "download cannot use the current network connection because it is roaming";
- case NETWORK_TYPE_DISALLOWED_BY_REQUESTOR:
- return "download was requested to not use the current network type";
+ case NETWORK_TYPE_DISALLOWED_BY_REQUESTOR:
+ return "download was requested to not use the current network type";
- default:
- return "unknown error with network connectivity";
- }
- }
+ default:
+ return "unknown error with network connectivity";
+ }
+ }
- public int getControl() {
- return mControl;
- }
+ public int getControl() {
+ return mControl;
+ }
- public int getStatus() {
- return mStatus;
- }
+ public int getStatus() {
+ return mStatus;
+ }
- /**
+ /**
* Calculating a moving average for the speed so we don't get jumpy
* calculations for time etc.
*/
- static private final float SMOOTHING_FACTOR = 0.005f;
-
- public void notifyUpdateBytes(long totalBytesSoFar) {
- long timeRemaining;
- long currentTime = SystemClock.uptimeMillis();
- if (0 != mMillisecondsAtSample) {
- // we have a sample.
- long timePassed = currentTime - mMillisecondsAtSample;
- long bytesInSample = totalBytesSoFar - mBytesAtSample;
- float currentSpeedSample = (float) bytesInSample / (float) timePassed;
- if (0 != mAverageDownloadSpeed) {
- mAverageDownloadSpeed = SMOOTHING_FACTOR * currentSpeedSample
- + (1 - SMOOTHING_FACTOR) * mAverageDownloadSpeed;
- } else {
- mAverageDownloadSpeed = currentSpeedSample;
- }
- timeRemaining = (long) ((mTotalLength - totalBytesSoFar) / mAverageDownloadSpeed);
- } else {
- timeRemaining = -1;
- }
- mMillisecondsAtSample = currentTime;
- mBytesAtSample = totalBytesSoFar;
- mNotification.onDownloadProgress(
- new DownloadProgressInfo(mTotalLength,
- totalBytesSoFar,
- timeRemaining,
- mAverageDownloadSpeed)
- );
-
- }
-
- @Override
- protected boolean shouldStop() {
- // the database automatically reads the metadata for version code
- // and download status when the instance is created
- DownloadsDB db = DownloadsDB.getDB(this);
- if (db.mStatus == 0) {
- return true;
- }
- return false;
- }
-
- @Override
- public void requestDownloadStatus() {
- mNotification.resendState();
- }
-
- @Override
- public void onClientUpdated(Messenger clientMessenger) {
- this.mClientMessenger = clientMessenger;
- mNotification.setMessenger(mClientMessenger);
- }
-
+ static private final float SMOOTHING_FACTOR = 0.005f;
+
+ public void notifyUpdateBytes(long totalBytesSoFar) {
+ long timeRemaining;
+ long currentTime = SystemClock.uptimeMillis();
+ if (0 != mMillisecondsAtSample) {
+ // we have a sample.
+ long timePassed = currentTime - mMillisecondsAtSample;
+ long bytesInSample = totalBytesSoFar - mBytesAtSample;
+ float currentSpeedSample = (float)bytesInSample / (float)timePassed;
+ if (0 != mAverageDownloadSpeed) {
+ mAverageDownloadSpeed = SMOOTHING_FACTOR * currentSpeedSample + (1 - SMOOTHING_FACTOR) * mAverageDownloadSpeed;
+ } else {
+ mAverageDownloadSpeed = currentSpeedSample;
+ }
+ timeRemaining = (long)((mTotalLength - totalBytesSoFar) / mAverageDownloadSpeed);
+ } else {
+ timeRemaining = -1;
+ }
+ mMillisecondsAtSample = currentTime;
+ mBytesAtSample = totalBytesSoFar;
+ mNotification.onDownloadProgress(
+ new DownloadProgressInfo(mTotalLength,
+ totalBytesSoFar,
+ timeRemaining,
+ mAverageDownloadSpeed));
+ }
+
+ @Override
+ protected boolean shouldStop() {
+ // the database automatically reads the metadata for version code
+ // and download status when the instance is created
+ DownloadsDB db = DownloadsDB.getDB(this);
+ if (db.mStatus == 0) {
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void requestDownloadStatus() {
+ mNotification.resendState();
+ }
+
+ @Override
+ public void onClientUpdated(Messenger clientMessenger) {
+ this.mClientMessenger = clientMessenger;
+ mNotification.setMessenger(mClientMessenger);
+ }
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadsDB.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadsDB.java
index 250299c400..5d8dce0bac 100755
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadsDB.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/DownloadsDB.java
@@ -27,484 +27,443 @@ import android.provider.BaseColumns;
import android.util.Log;
public class DownloadsDB {
- private static final String DATABASE_NAME = "DownloadsDB";
- private static final int DATABASE_VERSION = 7;
- public static final String LOG_TAG = DownloadsDB.class.getName();
- final SQLiteOpenHelper mHelper;
- SQLiteStatement mGetDownloadByIndex;
- SQLiteStatement mUpdateCurrentBytes;
- private static DownloadsDB mDownloadsDB;
- long mMetadataRowID = -1;
- int mVersionCode = -1;
- int mStatus = -1;
- int mFlags;
-
- static public synchronized DownloadsDB getDB(Context paramContext) {
- if (null == mDownloadsDB) {
- return new DownloadsDB(paramContext);
- }
- return mDownloadsDB;
- }
-
- private SQLiteStatement getDownloadByIndexStatement() {
- if (null == mGetDownloadByIndex) {
- mGetDownloadByIndex = mHelper.getReadableDatabase().compileStatement(
- "SELECT " + BaseColumns._ID + " FROM "
- + DownloadColumns.TABLE_NAME + " WHERE "
- + DownloadColumns.INDEX + " = ?");
- }
- return mGetDownloadByIndex;
- }
-
- private SQLiteStatement getUpdateCurrentBytesStatement() {
- if (null == mUpdateCurrentBytes) {
- mUpdateCurrentBytes = mHelper.getReadableDatabase().compileStatement(
- "UPDATE " + DownloadColumns.TABLE_NAME + " SET " + DownloadColumns.CURRENTBYTES
- + " = ?" +
- " WHERE " + DownloadColumns.INDEX + " = ?");
- }
- return mUpdateCurrentBytes;
- }
-
- private DownloadsDB(Context paramContext) {
- this.mHelper = new DownloadsContentDBHelper(paramContext);
- final SQLiteDatabase sqldb = mHelper.getReadableDatabase();
- // Query for the version code, the row ID of the metadata (for future
- // updating) the status and the flags
- Cursor cur = sqldb.rawQuery("SELECT " +
- MetadataColumns.APKVERSION + "," +
- BaseColumns._ID + "," +
- MetadataColumns.DOWNLOAD_STATUS + "," +
- MetadataColumns.FLAGS +
- " FROM "
- + MetadataColumns.TABLE_NAME + " LIMIT 1", null);
- if (null != cur && cur.moveToFirst()) {
- mVersionCode = cur.getInt(0);
- mMetadataRowID = cur.getLong(1);
- mStatus = cur.getInt(2);
- mFlags = cur.getInt(3);
- cur.close();
- }
- mDownloadsDB = this;
- }
-
- protected DownloadInfo getDownloadInfoByFileName(String fileName) {
- final SQLiteDatabase sqldb = mHelper.getReadableDatabase();
- Cursor itemcur = null;
- try {
- itemcur = sqldb.query(DownloadColumns.TABLE_NAME, DC_PROJECTION,
- DownloadColumns.FILENAME + " = ?",
- new String[] {
- fileName
- }, null, null, null);
- if (null != itemcur && itemcur.moveToFirst()) {
- return getDownloadInfoFromCursor(itemcur);
- }
- } finally {
- if (null != itemcur)
- itemcur.close();
- }
- return null;
- }
-
- public long getIDForDownloadInfo(final DownloadInfo di) {
- return getIDByIndex(di.mIndex);
- }
-
- public long getIDByIndex(int index) {
- SQLiteStatement downloadByIndex = getDownloadByIndexStatement();
- downloadByIndex.clearBindings();
- downloadByIndex.bindLong(1, index);
- try {
- return downloadByIndex.simpleQueryForLong();
- } catch (SQLiteDoneException e) {
- return -1;
- }
- }
-
- public void updateDownloadCurrentBytes(final DownloadInfo di) {
- SQLiteStatement downloadCurrentBytes = getUpdateCurrentBytesStatement();
- downloadCurrentBytes.clearBindings();
- downloadCurrentBytes.bindLong(1, di.mCurrentBytes);
- downloadCurrentBytes.bindLong(2, di.mIndex);
- downloadCurrentBytes.execute();
- }
-
- public void close() {
- this.mHelper.close();
- }
-
- protected static class DownloadsContentDBHelper extends SQLiteOpenHelper {
- DownloadsContentDBHelper(Context paramContext) {
- super(paramContext, DATABASE_NAME, null, DATABASE_VERSION);
- }
-
- private String createTableQueryFromArray(String paramString,
- String[][] paramArrayOfString) {
- StringBuilder localStringBuilder = new StringBuilder();
- localStringBuilder.append("CREATE TABLE ");
- localStringBuilder.append(paramString);
- localStringBuilder.append(" (");
- int i = paramArrayOfString.length;
- for (int j = 0;; j++) {
- if (j >= i) {
- localStringBuilder
- .setLength(localStringBuilder.length() - 1);
- localStringBuilder.append(");");
- return localStringBuilder.toString();
- }
- String[] arrayOfString = paramArrayOfString[j];
- localStringBuilder.append(' ');
- localStringBuilder.append(arrayOfString[0]);
- localStringBuilder.append(' ');
- localStringBuilder.append(arrayOfString[1]);
- localStringBuilder.append(',');
- }
- }
-
- /**
+ private static final String DATABASE_NAME = "DownloadsDB";
+ private static final int DATABASE_VERSION = 7;
+ public static final String LOG_TAG = DownloadsDB.class.getName();
+ final SQLiteOpenHelper mHelper;
+ SQLiteStatement mGetDownloadByIndex;
+ SQLiteStatement mUpdateCurrentBytes;
+ private static DownloadsDB mDownloadsDB;
+ long mMetadataRowID = -1;
+ int mVersionCode = -1;
+ int mStatus = -1;
+ int mFlags;
+
+ static public synchronized DownloadsDB getDB(Context paramContext) {
+ if (null == mDownloadsDB) {
+ return new DownloadsDB(paramContext);
+ }
+ return mDownloadsDB;
+ }
+
+ private SQLiteStatement getDownloadByIndexStatement() {
+ if (null == mGetDownloadByIndex) {
+ mGetDownloadByIndex = mHelper.getReadableDatabase().compileStatement(
+ "SELECT " + BaseColumns._ID + " FROM " + DownloadColumns.TABLE_NAME + " WHERE " + DownloadColumns.INDEX + " = ?");
+ }
+ return mGetDownloadByIndex;
+ }
+
+ private SQLiteStatement getUpdateCurrentBytesStatement() {
+ if (null == mUpdateCurrentBytes) {
+ mUpdateCurrentBytes = mHelper.getReadableDatabase().compileStatement(
+ "UPDATE " + DownloadColumns.TABLE_NAME + " SET " + DownloadColumns.CURRENTBYTES + " = ?"
+ +
+ " WHERE " + DownloadColumns.INDEX + " = ?");
+ }
+ return mUpdateCurrentBytes;
+ }
+
+ private DownloadsDB(Context paramContext) {
+ this.mHelper = new DownloadsContentDBHelper(paramContext);
+ final SQLiteDatabase sqldb = mHelper.getReadableDatabase();
+ // Query for the version code, the row ID of the metadata (for future
+ // updating) the status and the flags
+ Cursor cur = sqldb.rawQuery("SELECT " +
+ MetadataColumns.APKVERSION + "," +
+ BaseColumns._ID + "," +
+ MetadataColumns.DOWNLOAD_STATUS + "," +
+ MetadataColumns.FLAGS +
+ " FROM " + MetadataColumns.TABLE_NAME + " LIMIT 1",
+ null);
+ if (null != cur && cur.moveToFirst()) {
+ mVersionCode = cur.getInt(0);
+ mMetadataRowID = cur.getLong(1);
+ mStatus = cur.getInt(2);
+ mFlags = cur.getInt(3);
+ cur.close();
+ }
+ mDownloadsDB = this;
+ }
+
+ protected DownloadInfo getDownloadInfoByFileName(String fileName) {
+ final SQLiteDatabase sqldb = mHelper.getReadableDatabase();
+ Cursor itemcur = null;
+ try {
+ itemcur = sqldb.query(DownloadColumns.TABLE_NAME, DC_PROJECTION,
+ DownloadColumns.FILENAME + " = ?",
+ new String[] {
+ fileName },
+ null, null, null);
+ if (null != itemcur && itemcur.moveToFirst()) {
+ return getDownloadInfoFromCursor(itemcur);
+ }
+ } finally {
+ if (null != itemcur)
+ itemcur.close();
+ }
+ return null;
+ }
+
+ public long getIDForDownloadInfo(final DownloadInfo di) {
+ return getIDByIndex(di.mIndex);
+ }
+
+ public long getIDByIndex(int index) {
+ SQLiteStatement downloadByIndex = getDownloadByIndexStatement();
+ downloadByIndex.clearBindings();
+ downloadByIndex.bindLong(1, index);
+ try {
+ return downloadByIndex.simpleQueryForLong();
+ } catch (SQLiteDoneException e) {
+ return -1;
+ }
+ }
+
+ public void updateDownloadCurrentBytes(final DownloadInfo di) {
+ SQLiteStatement downloadCurrentBytes = getUpdateCurrentBytesStatement();
+ downloadCurrentBytes.clearBindings();
+ downloadCurrentBytes.bindLong(1, di.mCurrentBytes);
+ downloadCurrentBytes.bindLong(2, di.mIndex);
+ downloadCurrentBytes.execute();
+ }
+
+ public void close() {
+ this.mHelper.close();
+ }
+
+ protected static class DownloadsContentDBHelper extends SQLiteOpenHelper {
+ DownloadsContentDBHelper(Context paramContext) {
+ super(paramContext, DATABASE_NAME, null, DATABASE_VERSION);
+ }
+
+ private String createTableQueryFromArray(String paramString,
+ String[][] paramArrayOfString) {
+ StringBuilder localStringBuilder = new StringBuilder();
+ localStringBuilder.append("CREATE TABLE ");
+ localStringBuilder.append(paramString);
+ localStringBuilder.append(" (");
+ int i = paramArrayOfString.length;
+ for (int j = 0;; j++) {
+ if (j >= i) {
+ localStringBuilder
+ .setLength(localStringBuilder.length() - 1);
+ localStringBuilder.append(");");
+ return localStringBuilder.toString();
+ }
+ String[] arrayOfString = paramArrayOfString[j];
+ localStringBuilder.append(' ');
+ localStringBuilder.append(arrayOfString[0]);
+ localStringBuilder.append(' ');
+ localStringBuilder.append(arrayOfString[1]);
+ localStringBuilder.append(',');
+ }
+ }
+
+ /**
* These two arrays must match and have the same order. For every Schema
* there must be a corresponding table name.
*/
- static final private String[][][] sSchemas = {
- DownloadColumns.SCHEMA, MetadataColumns.SCHEMA
- };
+ static final private String[][][] sSchemas = {
+ DownloadColumns.SCHEMA, MetadataColumns.SCHEMA
+ };
- static final private String[] sTables = {
- DownloadColumns.TABLE_NAME, MetadataColumns.TABLE_NAME
- };
+ static final private String[] sTables = {
+ DownloadColumns.TABLE_NAME, MetadataColumns.TABLE_NAME
+ };
- /**
+ /**
* Goes through all of the tables in sTables and drops each table if it
* exists. Altered to no longer make use of reflection.
*/
- private void dropTables(SQLiteDatabase paramSQLiteDatabase) {
- for (String table : sTables) {
- try {
- paramSQLiteDatabase.execSQL("DROP TABLE IF EXISTS " + table);
- } catch (Exception localException) {
- localException.printStackTrace();
- }
- }
- }
-
- /**
+ private void dropTables(SQLiteDatabase paramSQLiteDatabase) {
+ for (String table : sTables) {
+ try {
+ paramSQLiteDatabase.execSQL("DROP TABLE IF EXISTS " + table);
+ } catch (Exception localException) {
+ localException.printStackTrace();
+ }
+ }
+ }
+
+ /**
* Goes through all of the tables in sTables and creates a database with
* the corresponding schema described in sSchemas. Altered to no longer
* make use of reflection.
*/
- public void onCreate(SQLiteDatabase paramSQLiteDatabase) {
- int numSchemas = sSchemas.length;
- for (int i = 0; i < numSchemas; i++) {
- try {
- String[][] schema = (String[][]) sSchemas[i];
- paramSQLiteDatabase.execSQL(createTableQueryFromArray(
- sTables[i], schema));
- } catch (Exception localException) {
- while (true)
- localException.printStackTrace();
- }
- }
- }
-
- public void onUpgrade(SQLiteDatabase paramSQLiteDatabase,
- int paramInt1, int paramInt2) {
- Log.w(DownloadsContentDBHelper.class.getName(),
- "Upgrading database from version " + paramInt1 + " to "
- + paramInt2 + ", which will destroy all old data");
- dropTables(paramSQLiteDatabase);
- onCreate(paramSQLiteDatabase);
- }
- }
-
- public static class MetadataColumns implements BaseColumns {
- public static final String APKVERSION = "APKVERSION";
- public static final String DOWNLOAD_STATUS = "DOWNLOADSTATUS";
- public static final String FLAGS = "DOWNLOADFLAGS";
-
- public static final String[][] SCHEMA = {
- {
- BaseColumns._ID, "INTEGER PRIMARY KEY"
- },
- {
- APKVERSION, "INTEGER"
- }, {
- DOWNLOAD_STATUS, "INTEGER"
- },
- {
- FLAGS, "INTEGER"
- }
- };
- public static final String TABLE_NAME = "MetadataColumns";
- public static final String _ID = "MetadataColumns._id";
- }
-
- public static class DownloadColumns implements BaseColumns {
- public static final String INDEX = "FILEIDX";
- public static final String URI = "URI";
- public static final String FILENAME = "FN";
- public static final String ETAG = "ETAG";
-
- public static final String TOTALBYTES = "TOTALBYTES";
- public static final String CURRENTBYTES = "CURRENTBYTES";
- public static final String LASTMOD = "LASTMOD";
-
- public static final String STATUS = "STATUS";
- public static final String CONTROL = "CONTROL";
- public static final String NUM_FAILED = "FAILCOUNT";
- public static final String RETRY_AFTER = "RETRYAFTER";
- public static final String REDIRECT_COUNT = "REDIRECTCOUNT";
-
- public static final String[][] SCHEMA = {
- {
- BaseColumns._ID, "INTEGER PRIMARY KEY"
- },
- {
- INDEX, "INTEGER UNIQUE"
- }, {
- URI, "TEXT"
- },
- {
- FILENAME, "TEXT UNIQUE"
- }, {
- ETAG, "TEXT"
- },
- {
- TOTALBYTES, "INTEGER"
- }, {
- CURRENTBYTES, "INTEGER"
- },
- {
- LASTMOD, "INTEGER"
- }, {
- STATUS, "INTEGER"
- },
- {
- CONTROL, "INTEGER"
- }, {
- NUM_FAILED, "INTEGER"
- },
- {
- RETRY_AFTER, "INTEGER"
- }, {
- REDIRECT_COUNT, "INTEGER"
- }
- };
- public static final String TABLE_NAME = "DownloadColumns";
- public static final String _ID = "DownloadColumns._id";
- }
-
- private static final String[] DC_PROJECTION = {
- DownloadColumns.FILENAME,
- DownloadColumns.URI, DownloadColumns.ETAG,
- DownloadColumns.TOTALBYTES, DownloadColumns.CURRENTBYTES,
- DownloadColumns.LASTMOD, DownloadColumns.STATUS,
- DownloadColumns.CONTROL, DownloadColumns.NUM_FAILED,
- DownloadColumns.RETRY_AFTER, DownloadColumns.REDIRECT_COUNT,
- DownloadColumns.INDEX
- };
-
- private static final int FILENAME_IDX = 0;
- private static final int URI_IDX = 1;
- private static final int ETAG_IDX = 2;
- private static final int TOTALBYTES_IDX = 3;
- private static final int CURRENTBYTES_IDX = 4;
- private static final int LASTMOD_IDX = 5;
- private static final int STATUS_IDX = 6;
- private static final int CONTROL_IDX = 7;
- private static final int NUM_FAILED_IDX = 8;
- private static final int RETRY_AFTER_IDX = 9;
- private static final int REDIRECT_COUNT_IDX = 10;
- private static final int INDEX_IDX = 11;
-
- /**
+ public void onCreate(SQLiteDatabase paramSQLiteDatabase) {
+ int numSchemas = sSchemas.length;
+ for (int i = 0; i < numSchemas; i++) {
+ try {
+ String[][] schema = (String[][])sSchemas[i];
+ paramSQLiteDatabase.execSQL(createTableQueryFromArray(
+ sTables[i], schema));
+ } catch (Exception localException) {
+ while (true)
+ localException.printStackTrace();
+ }
+ }
+ }
+
+ public void onUpgrade(SQLiteDatabase paramSQLiteDatabase,
+ int paramInt1, int paramInt2) {
+ Log.w(DownloadsContentDBHelper.class.getName(),
+ "Upgrading database from version " + paramInt1 + " to " + paramInt2 + ", which will destroy all old data");
+ dropTables(paramSQLiteDatabase);
+ onCreate(paramSQLiteDatabase);
+ }
+ }
+
+ public static class MetadataColumns implements BaseColumns {
+ public static final String APKVERSION = "APKVERSION";
+ public static final String DOWNLOAD_STATUS = "DOWNLOADSTATUS";
+ public static final String FLAGS = "DOWNLOADFLAGS";
+
+ public static final String[][] SCHEMA = {
+ { BaseColumns._ID, "INTEGER PRIMARY KEY" },
+ { APKVERSION, "INTEGER" }, { DOWNLOAD_STATUS, "INTEGER" },
+ { FLAGS, "INTEGER" }
+ };
+ public static final String TABLE_NAME = "MetadataColumns";
+ public static final String _ID = "MetadataColumns._id";
+ }
+
+ public static class DownloadColumns implements BaseColumns {
+ public static final String INDEX = "FILEIDX";
+ public static final String URI = "URI";
+ public static final String FILENAME = "FN";
+ public static final String ETAG = "ETAG";
+
+ public static final String TOTALBYTES = "TOTALBYTES";
+ public static final String CURRENTBYTES = "CURRENTBYTES";
+ public static final String LASTMOD = "LASTMOD";
+
+ public static final String STATUS = "STATUS";
+ public static final String CONTROL = "CONTROL";
+ public static final String NUM_FAILED = "FAILCOUNT";
+ public static final String RETRY_AFTER = "RETRYAFTER";
+ public static final String REDIRECT_COUNT = "REDIRECTCOUNT";
+
+ public static final String[][] SCHEMA = {
+ { BaseColumns._ID, "INTEGER PRIMARY KEY" },
+ { INDEX, "INTEGER UNIQUE" }, { URI, "TEXT" },
+ { FILENAME, "TEXT UNIQUE" }, { ETAG, "TEXT" },
+ { TOTALBYTES, "INTEGER" }, { CURRENTBYTES, "INTEGER" },
+ { LASTMOD, "INTEGER" }, { STATUS, "INTEGER" },
+ { CONTROL, "INTEGER" }, { NUM_FAILED, "INTEGER" },
+ { RETRY_AFTER, "INTEGER" }, { REDIRECT_COUNT, "INTEGER" }
+ };
+ public static final String TABLE_NAME = "DownloadColumns";
+ public static final String _ID = "DownloadColumns._id";
+ }
+
+ private static final String[] DC_PROJECTION = {
+ DownloadColumns.FILENAME,
+ DownloadColumns.URI, DownloadColumns.ETAG,
+ DownloadColumns.TOTALBYTES, DownloadColumns.CURRENTBYTES,
+ DownloadColumns.LASTMOD, DownloadColumns.STATUS,
+ DownloadColumns.CONTROL, DownloadColumns.NUM_FAILED,
+ DownloadColumns.RETRY_AFTER, DownloadColumns.REDIRECT_COUNT,
+ DownloadColumns.INDEX
+ };
+
+ private static final int FILENAME_IDX = 0;
+ private static final int URI_IDX = 1;
+ private static final int ETAG_IDX = 2;
+ private static final int TOTALBYTES_IDX = 3;
+ private static final int CURRENTBYTES_IDX = 4;
+ private static final int LASTMOD_IDX = 5;
+ private static final int STATUS_IDX = 6;
+ private static final int CONTROL_IDX = 7;
+ private static final int NUM_FAILED_IDX = 8;
+ private static final int RETRY_AFTER_IDX = 9;
+ private static final int REDIRECT_COUNT_IDX = 10;
+ private static final int INDEX_IDX = 11;
+
+ /**
* This function will add a new file to the database if it does not exist.
- *
+ *
* @param di DownloadInfo that we wish to store
* @return the row id of the record to be updated/inserted, or -1
*/
- public boolean updateDownload(DownloadInfo di) {
- ContentValues cv = new ContentValues();
- cv.put(DownloadColumns.INDEX, di.mIndex);
- cv.put(DownloadColumns.FILENAME, di.mFileName);
- cv.put(DownloadColumns.URI, di.mUri);
- cv.put(DownloadColumns.ETAG, di.mETag);
- cv.put(DownloadColumns.TOTALBYTES, di.mTotalBytes);
- cv.put(DownloadColumns.CURRENTBYTES, di.mCurrentBytes);
- cv.put(DownloadColumns.LASTMOD, di.mLastMod);
- cv.put(DownloadColumns.STATUS, di.mStatus);
- cv.put(DownloadColumns.CONTROL, di.mControl);
- cv.put(DownloadColumns.NUM_FAILED, di.mNumFailed);
- cv.put(DownloadColumns.RETRY_AFTER, di.mRetryAfter);
- cv.put(DownloadColumns.REDIRECT_COUNT, di.mRedirectCount);
- return updateDownload(di, cv);
- }
-
- public boolean updateDownload(DownloadInfo di, ContentValues cv) {
- long id = di == null ? -1 : getIDForDownloadInfo(di);
- try {
- final SQLiteDatabase sqldb = mHelper.getWritableDatabase();
- if (id != -1) {
- if (1 != sqldb.update(DownloadColumns.TABLE_NAME,
- cv, DownloadColumns._ID + " = " + id, null)) {
- return false;
- }
- } else {
- return -1 != sqldb.insert(DownloadColumns.TABLE_NAME,
- DownloadColumns.URI, cv);
- }
- } catch (android.database.sqlite.SQLiteException ex) {
- ex.printStackTrace();
- }
- return false;
- }
-
- public int getLastCheckedVersionCode() {
- return mVersionCode;
- }
-
- public boolean isDownloadRequired() {
- final SQLiteDatabase sqldb = mHelper.getReadableDatabase();
- Cursor cur = sqldb.rawQuery("SELECT Count(*) FROM "
- + DownloadColumns.TABLE_NAME + " WHERE "
- + DownloadColumns.STATUS + " <> 0", null);
- try {
- if (null != cur && cur.moveToFirst()) {
- return 0 == cur.getInt(0);
- }
- } finally {
- if (null != cur)
- cur.close();
- }
- return true;
- }
-
- public int getFlags() {
- return mFlags;
- }
-
- public boolean updateFlags(int flags) {
- if (mFlags != flags) {
- ContentValues cv = new ContentValues();
- cv.put(MetadataColumns.FLAGS, flags);
- if (updateMetadata(cv)) {
- mFlags = flags;
- return true;
- } else {
- return false;
- }
- } else {
- return true;
- }
- };
-
- public boolean updateStatus(int status) {
- if (mStatus != status) {
- ContentValues cv = new ContentValues();
- cv.put(MetadataColumns.DOWNLOAD_STATUS, status);
- if (updateMetadata(cv)) {
- mStatus = status;
- return true;
- } else {
- return false;
- }
- } else {
- return true;
- }
- };
-
- public boolean updateMetadata(ContentValues cv) {
- final SQLiteDatabase sqldb = mHelper.getWritableDatabase();
- if (-1 == this.mMetadataRowID) {
- long newID = sqldb.insert(MetadataColumns.TABLE_NAME,
- MetadataColumns.APKVERSION, cv);
- if (-1 == newID)
- return false;
- mMetadataRowID = newID;
- } else {
- if (0 == sqldb.update(MetadataColumns.TABLE_NAME, cv,
- BaseColumns._ID + " = " + mMetadataRowID, null))
- return false;
- }
- return true;
- }
-
- public boolean updateMetadata(int apkVersion, int downloadStatus) {
- ContentValues cv = new ContentValues();
- cv.put(MetadataColumns.APKVERSION, apkVersion);
- cv.put(MetadataColumns.DOWNLOAD_STATUS, downloadStatus);
- if (updateMetadata(cv)) {
- mVersionCode = apkVersion;
- mStatus = downloadStatus;
- return true;
- } else {
- return false;
- }
- };
-
- public boolean updateFromDb(DownloadInfo di) {
- final SQLiteDatabase sqldb = mHelper.getReadableDatabase();
- Cursor cur = null;
- try {
- cur = sqldb.query(DownloadColumns.TABLE_NAME, DC_PROJECTION,
- DownloadColumns.FILENAME + "= ?",
- new String[] {
- di.mFileName
- }, null, null, null);
- if (null != cur && cur.moveToFirst()) {
- setDownloadInfoFromCursor(di, cur);
- return true;
- }
- return false;
- } finally {
- if (null != cur) {
- cur.close();
- }
- }
- }
-
- public void setDownloadInfoFromCursor(DownloadInfo di, Cursor cur) {
- di.mUri = cur.getString(URI_IDX);
- di.mETag = cur.getString(ETAG_IDX);
- di.mTotalBytes = cur.getLong(TOTALBYTES_IDX);
- di.mCurrentBytes = cur.getLong(CURRENTBYTES_IDX);
- di.mLastMod = cur.getLong(LASTMOD_IDX);
- di.mStatus = cur.getInt(STATUS_IDX);
- di.mControl = cur.getInt(CONTROL_IDX);
- di.mNumFailed = cur.getInt(NUM_FAILED_IDX);
- di.mRetryAfter = cur.getInt(RETRY_AFTER_IDX);
- di.mRedirectCount = cur.getInt(REDIRECT_COUNT_IDX);
- }
-
- public DownloadInfo getDownloadInfoFromCursor(Cursor cur) {
- DownloadInfo di = new DownloadInfo(cur.getInt(INDEX_IDX),
- cur.getString(FILENAME_IDX), this.getClass().getPackage()
- .getName());
- setDownloadInfoFromCursor(di, cur);
- return di;
- }
-
- public DownloadInfo[] getDownloads() {
- final SQLiteDatabase sqldb = mHelper.getReadableDatabase();
- Cursor cur = null;
- try {
- cur = sqldb.query(DownloadColumns.TABLE_NAME, DC_PROJECTION, null,
- null, null, null, null);
- if (null != cur && cur.moveToFirst()) {
- DownloadInfo[] retInfos = new DownloadInfo[cur.getCount()];
- int idx = 0;
- do {
- DownloadInfo di = getDownloadInfoFromCursor(cur);
- retInfos[idx++] = di;
- } while (cur.moveToNext());
- return retInfos;
- }
- return null;
- } finally {
- if (null != cur) {
- cur.close();
- }
- }
- }
-
+ public boolean updateDownload(DownloadInfo di) {
+ ContentValues cv = new ContentValues();
+ cv.put(DownloadColumns.INDEX, di.mIndex);
+ cv.put(DownloadColumns.FILENAME, di.mFileName);
+ cv.put(DownloadColumns.URI, di.mUri);
+ cv.put(DownloadColumns.ETAG, di.mETag);
+ cv.put(DownloadColumns.TOTALBYTES, di.mTotalBytes);
+ cv.put(DownloadColumns.CURRENTBYTES, di.mCurrentBytes);
+ cv.put(DownloadColumns.LASTMOD, di.mLastMod);
+ cv.put(DownloadColumns.STATUS, di.mStatus);
+ cv.put(DownloadColumns.CONTROL, di.mControl);
+ cv.put(DownloadColumns.NUM_FAILED, di.mNumFailed);
+ cv.put(DownloadColumns.RETRY_AFTER, di.mRetryAfter);
+ cv.put(DownloadColumns.REDIRECT_COUNT, di.mRedirectCount);
+ return updateDownload(di, cv);
+ }
+
+ public boolean updateDownload(DownloadInfo di, ContentValues cv) {
+ long id = di == null ? -1 : getIDForDownloadInfo(di);
+ try {
+ final SQLiteDatabase sqldb = mHelper.getWritableDatabase();
+ if (id != -1) {
+ if (1 != sqldb.update(DownloadColumns.TABLE_NAME,
+ cv, DownloadColumns._ID + " = " + id, null)) {
+ return false;
+ }
+ } else {
+ return -1 != sqldb.insert(DownloadColumns.TABLE_NAME,
+ DownloadColumns.URI, cv);
+ }
+ } catch (android.database.sqlite.SQLiteException ex) {
+ ex.printStackTrace();
+ }
+ return false;
+ }
+
+ public int getLastCheckedVersionCode() {
+ return mVersionCode;
+ }
+
+ public boolean isDownloadRequired() {
+ final SQLiteDatabase sqldb = mHelper.getReadableDatabase();
+ Cursor cur = sqldb.rawQuery("SELECT Count(*) FROM " + DownloadColumns.TABLE_NAME + " WHERE " + DownloadColumns.STATUS + " <> 0", null);
+ try {
+ if (null != cur && cur.moveToFirst()) {
+ return 0 == cur.getInt(0);
+ }
+ } finally {
+ if (null != cur)
+ cur.close();
+ }
+ return true;
+ }
+
+ public int getFlags() {
+ return mFlags;
+ }
+
+ public boolean updateFlags(int flags) {
+ if (mFlags != flags) {
+ ContentValues cv = new ContentValues();
+ cv.put(MetadataColumns.FLAGS, flags);
+ if (updateMetadata(cv)) {
+ mFlags = flags;
+ return true;
+ } else {
+ return false;
+ }
+ } else {
+ return true;
+ }
+ };
+
+ public boolean updateStatus(int status) {
+ if (mStatus != status) {
+ ContentValues cv = new ContentValues();
+ cv.put(MetadataColumns.DOWNLOAD_STATUS, status);
+ if (updateMetadata(cv)) {
+ mStatus = status;
+ return true;
+ } else {
+ return false;
+ }
+ } else {
+ return true;
+ }
+ };
+
+ public boolean updateMetadata(ContentValues cv) {
+ final SQLiteDatabase sqldb = mHelper.getWritableDatabase();
+ if (-1 == this.mMetadataRowID) {
+ long newID = sqldb.insert(MetadataColumns.TABLE_NAME,
+ MetadataColumns.APKVERSION, cv);
+ if (-1 == newID)
+ return false;
+ mMetadataRowID = newID;
+ } else {
+ if (0 == sqldb.update(MetadataColumns.TABLE_NAME, cv,
+ BaseColumns._ID + " = " + mMetadataRowID, null))
+ return false;
+ }
+ return true;
+ }
+
+ public boolean updateMetadata(int apkVersion, int downloadStatus) {
+ ContentValues cv = new ContentValues();
+ cv.put(MetadataColumns.APKVERSION, apkVersion);
+ cv.put(MetadataColumns.DOWNLOAD_STATUS, downloadStatus);
+ if (updateMetadata(cv)) {
+ mVersionCode = apkVersion;
+ mStatus = downloadStatus;
+ return true;
+ } else {
+ return false;
+ }
+ };
+
+ public boolean updateFromDb(DownloadInfo di) {
+ final SQLiteDatabase sqldb = mHelper.getReadableDatabase();
+ Cursor cur = null;
+ try {
+ cur = sqldb.query(DownloadColumns.TABLE_NAME, DC_PROJECTION,
+ DownloadColumns.FILENAME + "= ?",
+ new String[] {
+ di.mFileName },
+ null, null, null);
+ if (null != cur && cur.moveToFirst()) {
+ setDownloadInfoFromCursor(di, cur);
+ return true;
+ }
+ return false;
+ } finally {
+ if (null != cur) {
+ cur.close();
+ }
+ }
+ }
+
+ public void setDownloadInfoFromCursor(DownloadInfo di, Cursor cur) {
+ di.mUri = cur.getString(URI_IDX);
+ di.mETag = cur.getString(ETAG_IDX);
+ di.mTotalBytes = cur.getLong(TOTALBYTES_IDX);
+ di.mCurrentBytes = cur.getLong(CURRENTBYTES_IDX);
+ di.mLastMod = cur.getLong(LASTMOD_IDX);
+ di.mStatus = cur.getInt(STATUS_IDX);
+ di.mControl = cur.getInt(CONTROL_IDX);
+ di.mNumFailed = cur.getInt(NUM_FAILED_IDX);
+ di.mRetryAfter = cur.getInt(RETRY_AFTER_IDX);
+ di.mRedirectCount = cur.getInt(REDIRECT_COUNT_IDX);
+ }
+
+ public DownloadInfo getDownloadInfoFromCursor(Cursor cur) {
+ DownloadInfo di = new DownloadInfo(cur.getInt(INDEX_IDX),
+ cur.getString(FILENAME_IDX), this.getClass().getPackage().getName());
+ setDownloadInfoFromCursor(di, cur);
+ return di;
+ }
+
+ public DownloadInfo[] getDownloads() {
+ final SQLiteDatabase sqldb = mHelper.getReadableDatabase();
+ Cursor cur = null;
+ try {
+ cur = sqldb.query(DownloadColumns.TABLE_NAME, DC_PROJECTION, null,
+ null, null, null, null);
+ if (null != cur && cur.moveToFirst()) {
+ DownloadInfo[] retInfos = new DownloadInfo[cur.getCount()];
+ int idx = 0;
+ do {
+ DownloadInfo di = getDownloadInfoFromCursor(cur);
+ retInfos[idx++] = di;
+ } while (cur.moveToNext());
+ return retInfos;
+ }
+ return null;
+ } finally {
+ if (null != cur) {
+ cur.close();
+ }
+ }
+ }
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/HttpDateTime.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/HttpDateTime.java
index 3f440e9893..02bd1f27f6 100644
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/HttpDateTime.java
+++ b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/HttpDateTime.java
@@ -27,7 +27,7 @@ import java.util.regex.Pattern;
*/
public final class HttpDateTime {
- /*
+ /*
* Regular expression for parsing HTTP-date. Wdy, DD Mon YYYY HH:MM:SS GMT
* RFC 822, updated by RFC 1123 Weekday, DD-Mon-YY HH:MM:SS GMT RFC 850,
* obsoleted by RFC 1036 Wdy Mon DD HH:MM:SS YYYY ANSI C's asctime() format
@@ -37,164 +37,155 @@ public final class HttpDateTime {
* (SP)D HH:MM:SS YYYY Wdy Mon DD HH:MM:SS YYYY GMT HH can be H if the first
* digit is zero. Mon can be the full name of the month.
*/
- private static final String HTTP_DATE_RFC_REGEXP =
- "([0-9]{1,2})[- ]([A-Za-z]{3,9})[- ]([0-9]{2,4})[ ]"
- + "([0-9]{1,2}:[0-9][0-9]:[0-9][0-9])";
+ private static final String HTTP_DATE_RFC_REGEXP =
+ "([0-9]{1,2})[- ]([A-Za-z]{3,9})[- ]([0-9]{2,4})[ ]"
+ + "([0-9]{1,2}:[0-9][0-9]:[0-9][0-9])";
- private static final String HTTP_DATE_ANSIC_REGEXP =
- "[ ]([A-Za-z]{3,9})[ ]+([0-9]{1,2})[ ]"
- + "([0-9]{1,2}:[0-9][0-9]:[0-9][0-9])[ ]([0-9]{2,4})";
+ private static final String HTTP_DATE_ANSIC_REGEXP =
+ "[ ]([A-Za-z]{3,9})[ ]+([0-9]{1,2})[ ]"
+ + "([0-9]{1,2}:[0-9][0-9]:[0-9][0-9])[ ]([0-9]{2,4})";
- /**
+ /**
* The compiled version of the HTTP-date regular expressions.
*/
- private static final Pattern HTTP_DATE_RFC_PATTERN =
- Pattern.compile(HTTP_DATE_RFC_REGEXP);
- private static final Pattern HTTP_DATE_ANSIC_PATTERN =
- Pattern.compile(HTTP_DATE_ANSIC_REGEXP);
-
- private static class TimeOfDay {
- TimeOfDay(int h, int m, int s) {
- this.hour = h;
- this.minute = m;
- this.second = s;
- }
-
- int hour;
- int minute;
- int second;
- }
-
- public static long parse(String timeString)
- throws IllegalArgumentException {
-
- int date = 1;
- int month = Calendar.JANUARY;
- int year = 1970;
- TimeOfDay timeOfDay;
-
- Matcher rfcMatcher = HTTP_DATE_RFC_PATTERN.matcher(timeString);
- if (rfcMatcher.find()) {
- date = getDate(rfcMatcher.group(1));
- month = getMonth(rfcMatcher.group(2));
- year = getYear(rfcMatcher.group(3));
- timeOfDay = getTime(rfcMatcher.group(4));
- } else {
- Matcher ansicMatcher = HTTP_DATE_ANSIC_PATTERN.matcher(timeString);
- if (ansicMatcher.find()) {
- month = getMonth(ansicMatcher.group(1));
- date = getDate(ansicMatcher.group(2));
- timeOfDay = getTime(ansicMatcher.group(3));
- year = getYear(ansicMatcher.group(4));
- } else {
- throw new IllegalArgumentException();
- }
- }
-
- // FIXME: Y2038 BUG!
- if (year >= 2038) {
- year = 2038;
- month = Calendar.JANUARY;
- date = 1;
- }
-
- Time time = new Time(Time.TIMEZONE_UTC);
- time.set(timeOfDay.second, timeOfDay.minute, timeOfDay.hour, date,
- month, year);
- return time.toMillis(false /* use isDst */);
- }
-
- private static int getDate(String dateString) {
- if (dateString.length() == 2) {
- return (dateString.charAt(0) - '0') * 10
- + (dateString.charAt(1) - '0');
- } else {
- return (dateString.charAt(0) - '0');
- }
- }
-
- /*
+ private static final Pattern HTTP_DATE_RFC_PATTERN =
+ Pattern.compile(HTTP_DATE_RFC_REGEXP);
+ private static final Pattern HTTP_DATE_ANSIC_PATTERN =
+ Pattern.compile(HTTP_DATE_ANSIC_REGEXP);
+
+ private static class TimeOfDay {
+ TimeOfDay(int h, int m, int s) {
+ this.hour = h;
+ this.minute = m;
+ this.second = s;
+ }
+
+ int hour;
+ int minute;
+ int second;
+ }
+
+ public static long parse(String timeString)
+ throws IllegalArgumentException {
+
+ int date = 1;
+ int month = Calendar.JANUARY;
+ int year = 1970;
+ TimeOfDay timeOfDay;
+
+ Matcher rfcMatcher = HTTP_DATE_RFC_PATTERN.matcher(timeString);
+ if (rfcMatcher.find()) {
+ date = getDate(rfcMatcher.group(1));
+ month = getMonth(rfcMatcher.group(2));
+ year = getYear(rfcMatcher.group(3));
+ timeOfDay = getTime(rfcMatcher.group(4));
+ } else {
+ Matcher ansicMatcher = HTTP_DATE_ANSIC_PATTERN.matcher(timeString);
+ if (ansicMatcher.find()) {
+ month = getMonth(ansicMatcher.group(1));
+ date = getDate(ansicMatcher.group(2));
+ timeOfDay = getTime(ansicMatcher.group(3));
+ year = getYear(ansicMatcher.group(4));
+ } else {
+ throw new IllegalArgumentException();
+ }
+ }
+
+ // FIXME: Y2038 BUG!
+ if (year >= 2038) {
+ year = 2038;
+ month = Calendar.JANUARY;
+ date = 1;
+ }
+
+ Time time = new Time(Time.TIMEZONE_UTC);
+ time.set(timeOfDay.second, timeOfDay.minute, timeOfDay.hour, date,
+ month, year);
+ return time.toMillis(false /* use isDst */);
+ }
+
+ private static int getDate(String dateString) {
+ if (dateString.length() == 2) {
+ return (dateString.charAt(0) - '0') * 10 + (dateString.charAt(1) - '0');
+ } else {
+ return (dateString.charAt(0) - '0');
+ }
+ }
+
+ /*
* jan = 9 + 0 + 13 = 22 feb = 5 + 4 + 1 = 10 mar = 12 + 0 + 17 = 29 apr = 0
* + 15 + 17 = 32 may = 12 + 0 + 24 = 36 jun = 9 + 20 + 13 = 42 jul = 9 + 20
* + 11 = 40 aug = 0 + 20 + 6 = 26 sep = 18 + 4 + 15 = 37 oct = 14 + 2 + 19
* = 35 nov = 13 + 14 + 21 = 48 dec = 3 + 4 + 2 = 9
*/
- private static int getMonth(String monthString) {
- int hash = Character.toLowerCase(monthString.charAt(0)) +
- Character.toLowerCase(monthString.charAt(1)) +
- Character.toLowerCase(monthString.charAt(2)) - 3 * 'a';
- switch (hash) {
- case 22:
- return Calendar.JANUARY;
- case 10:
- return Calendar.FEBRUARY;
- case 29:
- return Calendar.MARCH;
- case 32:
- return Calendar.APRIL;
- case 36:
- return Calendar.MAY;
- case 42:
- return Calendar.JUNE;
- case 40:
- return Calendar.JULY;
- case 26:
- return Calendar.AUGUST;
- case 37:
- return Calendar.SEPTEMBER;
- case 35:
- return Calendar.OCTOBER;
- case 48:
- return Calendar.NOVEMBER;
- case 9:
- return Calendar.DECEMBER;
- default:
- throw new IllegalArgumentException();
- }
- }
-
- private static int getYear(String yearString) {
- if (yearString.length() == 2) {
- int year = (yearString.charAt(0) - '0') * 10
- + (yearString.charAt(1) - '0');
- if (year >= 70) {
- return year + 1900;
- } else {
- return year + 2000;
- }
- } else if (yearString.length() == 3) {
- // According to RFC 2822, three digit years should be added to 1900.
- int year = (yearString.charAt(0) - '0') * 100
- + (yearString.charAt(1) - '0') * 10
- + (yearString.charAt(2) - '0');
- return year + 1900;
- } else if (yearString.length() == 4) {
- return (yearString.charAt(0) - '0') * 1000
- + (yearString.charAt(1) - '0') * 100
- + (yearString.charAt(2) - '0') * 10
- + (yearString.charAt(3) - '0');
- } else {
- return 1970;
- }
- }
-
- private static TimeOfDay getTime(String timeString) {
- // HH might be H
- int i = 0;
- int hour = timeString.charAt(i++) - '0';
- if (timeString.charAt(i) != ':')
- hour = hour * 10 + (timeString.charAt(i++) - '0');
- // Skip ':'
- i++;
-
- int minute = (timeString.charAt(i++) - '0') * 10
- + (timeString.charAt(i++) - '0');
- // Skip ':'
- i++;
-
- int second = (timeString.charAt(i++) - '0') * 10
- + (timeString.charAt(i++) - '0');
-
- return new TimeOfDay(hour, minute, second);
- }
+ private static int getMonth(String monthString) {
+ int hash = Character.toLowerCase(monthString.charAt(0)) +
+ Character.toLowerCase(monthString.charAt(1)) +
+ Character.toLowerCase(monthString.charAt(2)) - 3 * 'a';
+ switch (hash) {
+ case 22:
+ return Calendar.JANUARY;
+ case 10:
+ return Calendar.FEBRUARY;
+ case 29:
+ return Calendar.MARCH;
+ case 32:
+ return Calendar.APRIL;
+ case 36:
+ return Calendar.MAY;
+ case 42:
+ return Calendar.JUNE;
+ case 40:
+ return Calendar.JULY;
+ case 26:
+ return Calendar.AUGUST;
+ case 37:
+ return Calendar.SEPTEMBER;
+ case 35:
+ return Calendar.OCTOBER;
+ case 48:
+ return Calendar.NOVEMBER;
+ case 9:
+ return Calendar.DECEMBER;
+ default:
+ throw new IllegalArgumentException();
+ }
+ }
+
+ private static int getYear(String yearString) {
+ if (yearString.length() == 2) {
+ int year = (yearString.charAt(0) - '0') * 10 + (yearString.charAt(1) - '0');
+ if (year >= 70) {
+ return year + 1900;
+ } else {
+ return year + 2000;
+ }
+ } else if (yearString.length() == 3) {
+ // According to RFC 2822, three digit years should be added to 1900.
+ int year = (yearString.charAt(0) - '0') * 100 + (yearString.charAt(1) - '0') * 10 + (yearString.charAt(2) - '0');
+ return year + 1900;
+ } else if (yearString.length() == 4) {
+ return (yearString.charAt(0) - '0') * 1000 + (yearString.charAt(1) - '0') * 100 + (yearString.charAt(2) - '0') * 10 + (yearString.charAt(3) - '0');
+ } else {
+ return 1970;
+ }
+ }
+
+ private static TimeOfDay getTime(String timeString) {
+ // HH might be H
+ int i = 0;
+ int hour = timeString.charAt(i++) - '0';
+ if (timeString.charAt(i) != ':')
+ hour = hour * 10 + (timeString.charAt(i++) - '0');
+ // Skip ':'
+ i++;
+
+ int minute = (timeString.charAt(i++) - '0') * 10 + (timeString.charAt(i++) - '0');
+ // Skip ':'
+ i++;
+
+ int second = (timeString.charAt(i++) - '0') * 10 + (timeString.charAt(i++) - '0');
+
+ return new TimeOfDay(hour, minute, second);
+ }
}
diff --git a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/V14CustomNotification.java b/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/V14CustomNotification.java
deleted file mode 100644
index 56b2331e31..0000000000
--- a/platform/android/java/src/com/google/android/vending/expansion/downloader/impl/V14CustomNotification.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.android.vending.expansion.downloader.impl;
-
-import com.godot.game.R;
-import com.google.android.vending.expansion.downloader.Helpers;
-
-import android.app.Notification;
-import android.app.PendingIntent;
-import android.content.Context;
-
-public class V14CustomNotification implements DownloadNotification.ICustomNotification {
-
- CharSequence mTitle;
- CharSequence mTicker;
- int mIcon;
- long mTotalKB = -1;
- long mCurrentKB = -1;
- long mTimeRemaining;
- PendingIntent mPendingIntent;
-
- @Override
- public void setIcon(int icon) {
- mIcon = icon;
- }
-
- @Override
- public void setTitle(CharSequence title) {
- mTitle = title;
- }
-
- @Override
- public void setTotalBytes(long totalBytes) {
- mTotalKB = totalBytes;
- }
-
- @Override
- public void setCurrentBytes(long currentBytes) {
- mCurrentKB = currentBytes;
- }
-
- void setProgress(Notification.Builder builder) {
-
- }
-
- @Override
- public Notification.Builder updateNotification(Context c) {
- Notification.Builder builder = new Notification.Builder(c);
- builder.setContentTitle(mTitle);
- if (mTotalKB > 0 && -1 != mCurrentKB) {
- builder.setProgress((int) (mTotalKB >> 8), (int) (mCurrentKB >> 8), false);
- } else {
- builder.setProgress(0, 0, true);
- }
- builder.setContentText(Helpers.getDownloadProgressString(mCurrentKB, mTotalKB));
- builder.setContentInfo(c.getString(R.string.time_remaining_notification,
- Helpers.getTimeRemaining(mTimeRemaining)));
- if (mIcon != 0) {
- builder.setSmallIcon(mIcon);
- } else {
- int iconResource = android.R.drawable.stat_sys_download;
- builder.setSmallIcon(iconResource);
- }
- builder.setOngoing(true);
- builder.setTicker(mTicker);
- builder.setContentIntent(mPendingIntent);
- builder.setOnlyAlertOnce(true);
-
- return builder;
- }
-
- @Override
- public void setPendingIntent(PendingIntent contentIntent) {
- mPendingIntent = contentIntent;
- }
-
- @Override
- public void setTicker(CharSequence ticker) {
- mTicker = ticker;
- }
-
- @Override
- public void setTimeRemaining(long timeRemaining) {
- mTimeRemaining = timeRemaining;
- }
-
-}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/AESObfuscator.java b/platform/android/java/src/com/google/android/vending/licensing/AESObfuscator.java
new file mode 100644
index 0000000000..feba3034c3
--- /dev/null
+++ b/platform/android/java/src/com/google/android/vending/licensing/AESObfuscator.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.android.vending.licensing;
+
+import com.google.android.vending.licensing.util.Base64;
+import com.google.android.vending.licensing.util.Base64DecoderException;
+
+import java.io.UnsupportedEncodingException;
+import java.security.GeneralSecurityException;
+import java.security.spec.KeySpec;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.PBEKeySpec;
+import javax.crypto.spec.SecretKeySpec;
+
+/**
+ * An Obfuscator that uses AES to encrypt data.
+ */
+public class AESObfuscator implements Obfuscator {
+ private static final String UTF8 = "UTF-8";
+ private static final String KEYGEN_ALGORITHM = "PBEWITHSHAAND256BITAES-CBC-BC";
+ private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
+ private static final byte[] IV = { 16, 74, 71, -80, 32, 101, -47, 72, 117, -14, 0, -29, 70, 65, -12, 74 };
+ private static final String header = "com.google.android.vending.licensing.AESObfuscator-1|";
+
+ private Cipher mEncryptor;
+ private Cipher mDecryptor;
+
+ /**
+ * @param salt an array of random bytes to use for each (un)obfuscation
+ * @param applicationId application identifier, e.g. the package name
+ * @param deviceId device identifier. Use as many sources as possible to
+ * create this unique identifier.
+ */
+ public AESObfuscator(byte[] salt, String applicationId, String deviceId) {
+ try {
+ SecretKeyFactory factory = SecretKeyFactory.getInstance(KEYGEN_ALGORITHM);
+ KeySpec keySpec =
+ new PBEKeySpec((applicationId + deviceId).toCharArray(), salt, 1024, 256);
+ SecretKey tmp = factory.generateSecret(keySpec);
+ SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
+ mEncryptor = Cipher.getInstance(CIPHER_ALGORITHM);
+ mEncryptor.init(Cipher.ENCRYPT_MODE, secret, new IvParameterSpec(IV));
+ mDecryptor = Cipher.getInstance(CIPHER_ALGORITHM);
+ mDecryptor.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(IV));
+ } catch (GeneralSecurityException e) {
+ // This can't happen on a compatible Android device.
+ throw new RuntimeException("Invalid environment", e);
+ }
+ }
+
+ public String obfuscate(String original, String key) {
+ if (original == null) {
+ return null;
+ }
+ try {
+ // Header is appended as an integrity check
+ return Base64.encode(mEncryptor.doFinal((header + key + original).getBytes(UTF8)));
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException("Invalid environment", e);
+ } catch (GeneralSecurityException e) {
+ throw new RuntimeException("Invalid environment", e);
+ }
+ }
+
+ public String unobfuscate(String obfuscated, String key) throws ValidationException {
+ if (obfuscated == null) {
+ return null;
+ }
+ try {
+ String result = new String(mDecryptor.doFinal(Base64.decode(obfuscated)), UTF8);
+ // Check for presence of header. This serves as a final integrity check, for cases
+ // where the block size is correct during decryption.
+ int headerIndex = result.indexOf(header + key);
+ if (headerIndex != 0) {
+ throw new ValidationException("Header not found (invalid data or key)"
+ + ":" +
+ obfuscated);
+ }
+ return result.substring(header.length() + key.length(), result.length());
+ } catch (Base64DecoderException e) {
+ throw new ValidationException(e.getMessage() + ":" + obfuscated);
+ } catch (IllegalBlockSizeException e) {
+ throw new ValidationException(e.getMessage() + ":" + obfuscated);
+ } catch (BadPaddingException e) {
+ throw new ValidationException(e.getMessage() + ":" + obfuscated);
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException("Invalid environment", e);
+ }
+ }
+}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/APKExpansionPolicy.java b/platform/android/java/src/com/google/android/vending/licensing/APKExpansionPolicy.java
new file mode 100644
index 0000000000..2c60e7e4b8
--- /dev/null
+++ b/platform/android/java/src/com/google/android/vending/licensing/APKExpansionPolicy.java
@@ -0,0 +1,413 @@
+
+package com.google.android.vending.licensing;
+
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.util.Log;
+
+import com.google.android.vending.licensing.util.URIQueryDecoder;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.Vector;
+
+/**
+ * Default policy. All policy decisions are based off of response data received
+ * from the licensing service. Specifically, the licensing server sends the
+ * following information: response validity period, error retry period,
+ * error retry count and a URL for restoring app access in unlicensed cases.
+ * <p>
+ * These values will vary based on the the way the application is configured in
+ * the Google Play publishing console, such as whether the application is
+ * marked as free or is within its refund period, as well as how often an
+ * application is checking with the licensing service.
+ * <p>
+ * Developers who need more fine grained control over their application's
+ * licensing policy should implement a custom Policy.
+ */
+public class APKExpansionPolicy implements Policy {
+
+ private static final String TAG = "APKExpansionPolicy";
+ private static final String PREFS_FILE = "com.google.android.vending.licensing.APKExpansionPolicy";
+ private static final String PREF_LAST_RESPONSE = "lastResponse";
+ private static final String PREF_VALIDITY_TIMESTAMP = "validityTimestamp";
+ private static final String PREF_RETRY_UNTIL = "retryUntil";
+ private static final String PREF_MAX_RETRIES = "maxRetries";
+ private static final String PREF_RETRY_COUNT = "retryCount";
+ private static final String PREF_LICENSING_URL = "licensingUrl";
+ private static final String DEFAULT_VALIDITY_TIMESTAMP = "0";
+ private static final String DEFAULT_RETRY_UNTIL = "0";
+ private static final String DEFAULT_MAX_RETRIES = "0";
+ private static final String DEFAULT_RETRY_COUNT = "0";
+
+ private static final long MILLIS_PER_MINUTE = 60 * 1000;
+
+ private long mValidityTimestamp;
+ private long mRetryUntil;
+ private long mMaxRetries;
+ private long mRetryCount;
+ private long mLastResponseTime = 0;
+ private int mLastResponse;
+ private String mLicensingUrl;
+ private PreferenceObfuscator mPreferences;
+ private Vector<String> mExpansionURLs = new Vector<String>();
+ private Vector<String> mExpansionFileNames = new Vector<String>();
+ private Vector<Long> mExpansionFileSizes = new Vector<Long>();
+
+ /**
+ * The design of the protocol supports n files. Currently the market can
+ * only deliver two files. To accommodate this, we have these two constants,
+ * but the order is the only relevant thing here.
+ */
+ public static final int MAIN_FILE_URL_INDEX = 0;
+ public static final int PATCH_FILE_URL_INDEX = 1;
+
+ /**
+ * @param context The context for the current application
+ * @param obfuscator An obfuscator to be used with preferences.
+ */
+ public APKExpansionPolicy(Context context, Obfuscator obfuscator) {
+ // Import old values
+ SharedPreferences sp = context.getSharedPreferences(PREFS_FILE, Context.MODE_PRIVATE);
+ mPreferences = new PreferenceObfuscator(sp, obfuscator);
+ mLastResponse = Integer.parseInt(
+ mPreferences.getString(PREF_LAST_RESPONSE, Integer.toString(Policy.RETRY)));
+ mValidityTimestamp = Long.parseLong(mPreferences.getString(PREF_VALIDITY_TIMESTAMP,
+ DEFAULT_VALIDITY_TIMESTAMP));
+ mRetryUntil = Long.parseLong(mPreferences.getString(PREF_RETRY_UNTIL, DEFAULT_RETRY_UNTIL));
+ mMaxRetries = Long.parseLong(mPreferences.getString(PREF_MAX_RETRIES, DEFAULT_MAX_RETRIES));
+ mRetryCount = Long.parseLong(mPreferences.getString(PREF_RETRY_COUNT, DEFAULT_RETRY_COUNT));
+ mLicensingUrl = mPreferences.getString(PREF_LICENSING_URL, null);
+ }
+
+ /**
+ * We call this to guarantee that we fetch a fresh policy from the server.
+ * This is to be used if the URL is invalid.
+ */
+ public void resetPolicy() {
+ mPreferences.putString(PREF_LAST_RESPONSE, Integer.toString(Policy.RETRY));
+ setRetryUntil(DEFAULT_RETRY_UNTIL);
+ setMaxRetries(DEFAULT_MAX_RETRIES);
+ setRetryCount(Long.parseLong(DEFAULT_RETRY_COUNT));
+ setValidityTimestamp(DEFAULT_VALIDITY_TIMESTAMP);
+ mPreferences.commit();
+ }
+
+ /**
+ * Process a new response from the license server.
+ * <p>
+ * This data will be used for computing future policy decisions. The
+ * following parameters are processed:
+ * <ul>
+ * <li>VT: the timestamp that the client should consider the response valid
+ * until
+ * <li>GT: the timestamp that the client should ignore retry errors until
+ * <li>GR: the number of retry errors that the client should ignore
+ * <li>LU: a deep link URL that can enable access for unlicensed apps (e.g.
+ * buy app on the Play Store)
+ * </ul>
+ *
+ * @param response the result from validating the server response
+ * @param rawData the raw server response data
+ */
+ public void processServerResponse(int response,
+ com.google.android.vending.licensing.ResponseData rawData) {
+
+ // Update retry counter
+ if (response != Policy.RETRY) {
+ setRetryCount(0);
+ } else {
+ setRetryCount(mRetryCount + 1);
+ }
+
+ // Update server policy data
+ Map<String, String> extras = decodeExtras(rawData);
+ if (response == Policy.LICENSED) {
+ mLastResponse = response;
+ // Reset the licensing URL since it is only applicable for NOT_LICENSED responses.
+ setLicensingUrl(null);
+ setValidityTimestamp(Long.toString(System.currentTimeMillis() + MILLIS_PER_MINUTE));
+ Set<String> keys = extras.keySet();
+ for (String key : keys) {
+ if (key.equals("VT")) {
+ setValidityTimestamp(extras.get(key));
+ } else if (key.equals("GT")) {
+ setRetryUntil(extras.get(key));
+ } else if (key.equals("GR")) {
+ setMaxRetries(extras.get(key));
+ } else if (key.startsWith("FILE_URL")) {
+ int index = Integer.parseInt(key.substring("FILE_URL".length())) - 1;
+ setExpansionURL(index, extras.get(key));
+ } else if (key.startsWith("FILE_NAME")) {
+ int index = Integer.parseInt(key.substring("FILE_NAME".length())) - 1;
+ setExpansionFileName(index, extras.get(key));
+ } else if (key.startsWith("FILE_SIZE")) {
+ int index = Integer.parseInt(key.substring("FILE_SIZE".length())) - 1;
+ setExpansionFileSize(index, Long.parseLong(extras.get(key)));
+ }
+ }
+ } else if (response == Policy.NOT_LICENSED) {
+ // Clear out stale retry params
+ setValidityTimestamp(DEFAULT_VALIDITY_TIMESTAMP);
+ setRetryUntil(DEFAULT_RETRY_UNTIL);
+ setMaxRetries(DEFAULT_MAX_RETRIES);
+ // Update the licensing URL
+ setLicensingUrl(extras.get("LU"));
+ }
+
+ setLastResponse(response);
+ mPreferences.commit();
+ }
+
+ /**
+ * Set the last license response received from the server and add to
+ * preferences. You must manually call PreferenceObfuscator.commit() to
+ * commit these changes to disk.
+ *
+ * @param l the response
+ */
+ private void setLastResponse(int l) {
+ mLastResponseTime = System.currentTimeMillis();
+ mLastResponse = l;
+ mPreferences.putString(PREF_LAST_RESPONSE, Integer.toString(l));
+ }
+
+ /**
+ * Set the current retry count and add to preferences. You must manually
+ * call PreferenceObfuscator.commit() to commit these changes to disk.
+ *
+ * @param c the new retry count
+ */
+ private void setRetryCount(long c) {
+ mRetryCount = c;
+ mPreferences.putString(PREF_RETRY_COUNT, Long.toString(c));
+ }
+
+ public long getRetryCount() {
+ return mRetryCount;
+ }
+
+ /**
+ * Set the last validity timestamp (VT) received from the server and add to
+ * preferences. You must manually call PreferenceObfuscator.commit() to
+ * commit these changes to disk.
+ *
+ * @param validityTimestamp the VT string received
+ */
+ private void setValidityTimestamp(String validityTimestamp) {
+ Long lValidityTimestamp;
+ try {
+ lValidityTimestamp = Long.parseLong(validityTimestamp);
+ } catch (NumberFormatException e) {
+ // No response or not parseable, expire in one minute.
+ Log.w(TAG, "License validity timestamp (VT) missing, caching for a minute");
+ lValidityTimestamp = System.currentTimeMillis() + MILLIS_PER_MINUTE;
+ validityTimestamp = Long.toString(lValidityTimestamp);
+ }
+
+ mValidityTimestamp = lValidityTimestamp;
+ mPreferences.putString(PREF_VALIDITY_TIMESTAMP, validityTimestamp);
+ }
+
+ public long getValidityTimestamp() {
+ return mValidityTimestamp;
+ }
+
+ /**
+ * Set the retry until timestamp (GT) received from the server and add to
+ * preferences. You must manually call PreferenceObfuscator.commit() to
+ * commit these changes to disk.
+ *
+ * @param retryUntil the GT string received
+ */
+ private void setRetryUntil(String retryUntil) {
+ Long lRetryUntil;
+ try {
+ lRetryUntil = Long.parseLong(retryUntil);
+ } catch (NumberFormatException e) {
+ // No response or not parseable, expire immediately
+ Log.w(TAG, "License retry timestamp (GT) missing, grace period disabled");
+ retryUntil = "0";
+ lRetryUntil = 0l;
+ }
+
+ mRetryUntil = lRetryUntil;
+ mPreferences.putString(PREF_RETRY_UNTIL, retryUntil);
+ }
+
+ public long getRetryUntil() {
+ return mRetryUntil;
+ }
+
+ /**
+ * Set the max retries value (GR) as received from the server and add to
+ * preferences. You must manually call PreferenceObfuscator.commit() to
+ * commit these changes to disk.
+ *
+ * @param maxRetries the GR string received
+ */
+ private void setMaxRetries(String maxRetries) {
+ Long lMaxRetries;
+ try {
+ lMaxRetries = Long.parseLong(maxRetries);
+ } catch (NumberFormatException e) {
+ // No response or not parseable, expire immediately
+ Log.w(TAG, "Licence retry count (GR) missing, grace period disabled");
+ maxRetries = "0";
+ lMaxRetries = 0l;
+ }
+
+ mMaxRetries = lMaxRetries;
+ mPreferences.putString(PREF_MAX_RETRIES, maxRetries);
+ }
+
+ public long getMaxRetries() {
+ return mMaxRetries;
+ }
+
+ /**
+ * Set the licensing URL that displays a Play Store UI for the user to regain app access.
+ *
+ * @param url the LU string received
+ */
+ private void setLicensingUrl(String url) {
+ mLicensingUrl = url;
+ mPreferences.putString(PREF_LICENSING_URL, url);
+ }
+
+ public String getLicensingUrl() {
+ return mLicensingUrl;
+ }
+
+ /**
+ * Gets the count of expansion URLs. Since expansionURLs are not committed
+ * to preferences, this will return zero if there has been no LVL fetch
+ * in the current session.
+ *
+ * @return the number of expansion URLs. (0,1,2)
+ */
+ public int getExpansionURLCount() {
+ return mExpansionURLs.size();
+ }
+
+ /**
+ * Gets the expansion URL. Since these URLs are not committed to
+ * preferences, this will always return null if there has not been an LVL
+ * fetch in the current session.
+ *
+ * @param index the index of the URL to fetch. This value will be either
+ * MAIN_FILE_URL_INDEX or PATCH_FILE_URL_INDEX
+ */
+ public String getExpansionURL(int index) {
+ if (index < mExpansionURLs.size()) {
+ return mExpansionURLs.elementAt(index);
+ }
+ return null;
+ }
+
+ /**
+ * Sets the expansion URL. Expansion URL's are not committed to preferences,
+ * but are instead intended to be stored when the license response is
+ * processed by the front-end.
+ *
+ * @param index the index of the expansion URL. This value will be either
+ * MAIN_FILE_URL_INDEX or PATCH_FILE_URL_INDEX
+ * @param URL the URL to set
+ */
+ public void setExpansionURL(int index, String URL) {
+ if (index >= mExpansionURLs.size()) {
+ mExpansionURLs.setSize(index + 1);
+ }
+ mExpansionURLs.set(index, URL);
+ }
+
+ public String getExpansionFileName(int index) {
+ if (index < mExpansionFileNames.size()) {
+ return mExpansionFileNames.elementAt(index);
+ }
+ return null;
+ }
+
+ public void setExpansionFileName(int index, String name) {
+ if (index >= mExpansionFileNames.size()) {
+ mExpansionFileNames.setSize(index + 1);
+ }
+ mExpansionFileNames.set(index, name);
+ }
+
+ public long getExpansionFileSize(int index) {
+ if (index < mExpansionFileSizes.size()) {
+ return mExpansionFileSizes.elementAt(index);
+ }
+ return -1;
+ }
+
+ public void setExpansionFileSize(int index, long size) {
+ if (index >= mExpansionFileSizes.size()) {
+ mExpansionFileSizes.setSize(index + 1);
+ }
+ mExpansionFileSizes.set(index, size);
+ }
+
+ /**
+ * {@inheritDoc} This implementation allows access if either:<br>
+ * <ol>
+ * <li>a LICENSED response was received within the validity period
+ * <li>a RETRY response was received in the last minute, and we are under
+ * the RETRY count or in the RETRY period.
+ * </ol>
+ */
+ public boolean allowAccess() {
+ long ts = System.currentTimeMillis();
+ if (mLastResponse == Policy.LICENSED) {
+ // Check if the LICENSED response occurred within the validity
+ // timeout.
+ if (ts <= mValidityTimestamp) {
+ // Cached LICENSED response is still valid.
+ return true;
+ }
+ } else if (mLastResponse == Policy.RETRY &&
+ ts < mLastResponseTime + MILLIS_PER_MINUTE) {
+ // Only allow access if we are within the retry period or we haven't
+ // used up our
+ // max retries.
+ return (ts <= mRetryUntil || mRetryCount <= mMaxRetries);
+ }
+ return false;
+ }
+
+ private Map<String, String> decodeExtras(
+ com.google.android.vending.licensing.ResponseData rawData) {
+ Map<String, String> results = new HashMap<String, String>();
+ if (rawData == null) {
+ return results;
+ }
+
+ try {
+ URI rawExtras = new URI("?" + rawData.extra);
+ URIQueryDecoder.DecodeQuery(rawExtras, results);
+ } catch (URISyntaxException e) {
+ Log.w(TAG, "Invalid syntax error while decoding extras data from server.");
+ }
+ return results;
+ }
+}
diff --git a/platform/android/java/src/com/android/vending/licensing/DeviceLimiter.java b/platform/android/java/src/com/google/android/vending/licensing/DeviceLimiter.java
index e5c5e2d7ca..2384b8b82f 100644
--- a/platform/android/java/src/com/android/vending/licensing/DeviceLimiter.java
+++ b/platform/android/java/src/com/google/android/vending/licensing/DeviceLimiter.java
@@ -37,11 +37,11 @@ package com.google.android.vending.licensing;
*/
public interface DeviceLimiter {
- /**
+ /**
* Checks if this device is allowed to use the given user's license.
*
* @param userId the user whose license the server responded with
* @return LICENSED if the device is allowed, NOT_LICENSED if not, RETRY if an error occurs
*/
- int isDeviceAllowed(String userId);
+ int isDeviceAllowed(String userId);
}
diff --git a/platform/android/java/src/com/android/vending/licensing/ILicenseResultListener.aidl b/platform/android/java/src/com/google/android/vending/licensing/ILicenseResultListener.aidl
index c816558afc..c816558afc 100644
--- a/platform/android/java/src/com/android/vending/licensing/ILicenseResultListener.aidl
+++ b/platform/android/java/src/com/google/android/vending/licensing/ILicenseResultListener.aidl
diff --git a/platform/android/java/src/com/google/android/vending/licensing/ILicenseResultListener.java b/platform/android/java/src/com/google/android/vending/licensing/ILicenseResultListener.java
new file mode 100644
index 0000000000..89edeae1b4
--- /dev/null
+++ b/platform/android/java/src/com/google/android/vending/licensing/ILicenseResultListener.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+/*
+ * This file is auto-generated. DO NOT MODIFY.
+ * Original file: aidl/ILicenseResultListener.aidl
+ */
+package com.google.android.vending.licensing;
+import java.lang.String;
+import android.os.RemoteException;
+import android.os.IBinder;
+import android.os.IInterface;
+import android.os.Binder;
+import android.os.Parcel;
+public interface ILicenseResultListener extends android.os.IInterface {
+ /** Local-side IPC implementation stub class. */
+ public static abstract class Stub extends android.os.Binder implements com.google.android.vending.licensing.ILicenseResultListener {
+ private static final java.lang.String DESCRIPTOR = "com.android.vending.licensing.ILicenseResultListener";
+ /** Construct the stub at attach it to the interface. */
+ public Stub() {
+ this.attachInterface(this, DESCRIPTOR);
+ }
+ /**
+ * Cast an IBinder object into an ILicenseResultListener interface,
+ * generating a proxy if needed.
+ */
+ public static com.google.android.vending.licensing.ILicenseResultListener asInterface(android.os.IBinder obj) {
+ if ((obj == null)) {
+ return null;
+ }
+ android.os.IInterface iin = (android.os.IInterface)obj.queryLocalInterface(DESCRIPTOR);
+ if (((iin != null) && (iin instanceof com.google.android.vending.licensing.ILicenseResultListener))) {
+ return ((com.google.android.vending.licensing.ILicenseResultListener)iin);
+ }
+ return new com.google.android.vending.licensing.ILicenseResultListener.Stub.Proxy(obj);
+ }
+ public android.os.IBinder asBinder() {
+ return this;
+ }
+ public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException {
+ switch (code) {
+ case INTERFACE_TRANSACTION: {
+ reply.writeString(DESCRIPTOR);
+ return true;
+ }
+ case TRANSACTION_verifyLicense: {
+ data.enforceInterface(DESCRIPTOR);
+ int _arg0;
+ _arg0 = data.readInt();
+ java.lang.String _arg1;
+ _arg1 = data.readString();
+ java.lang.String _arg2;
+ _arg2 = data.readString();
+ this.verifyLicense(_arg0, _arg1, _arg2);
+ return true;
+ }
+ }
+ return super.onTransact(code, data, reply, flags);
+ }
+ private static class Proxy implements com.google.android.vending.licensing.ILicenseResultListener {
+ private android.os.IBinder mRemote;
+ Proxy(android.os.IBinder remote) {
+ mRemote = remote;
+ }
+ public android.os.IBinder asBinder() {
+ return mRemote;
+ }
+ public java.lang.String getInterfaceDescriptor() {
+ return DESCRIPTOR;
+ }
+ public void verifyLicense(int responseCode, java.lang.String signedData, java.lang.String signature) throws android.os.RemoteException {
+ android.os.Parcel _data = android.os.Parcel.obtain();
+ try {
+ _data.writeInterfaceToken(DESCRIPTOR);
+ _data.writeInt(responseCode);
+ _data.writeString(signedData);
+ _data.writeString(signature);
+ mRemote.transact(Stub.TRANSACTION_verifyLicense, _data, null, IBinder.FLAG_ONEWAY);
+ } finally {
+ _data.recycle();
+ }
+ }
+ }
+ static final int TRANSACTION_verifyLicense = (IBinder.FIRST_CALL_TRANSACTION + 0);
+ }
+ public void verifyLicense(int responseCode, java.lang.String signedData, java.lang.String signature) throws android.os.RemoteException;
+}
diff --git a/platform/android/java/src/com/android/vending/licensing/ILicensingService.aidl b/platform/android/java/src/com/google/android/vending/licensing/ILicensingService.aidl
index 664510ce0c..664510ce0c 100644
--- a/platform/android/java/src/com/android/vending/licensing/ILicensingService.aidl
+++ b/platform/android/java/src/com/google/android/vending/licensing/ILicensingService.aidl
diff --git a/platform/android/java/src/com/google/android/vending/licensing/ILicensingService.java b/platform/android/java/src/com/google/android/vending/licensing/ILicensingService.java
new file mode 100644
index 0000000000..8b7cc83541
--- /dev/null
+++ b/platform/android/java/src/com/google/android/vending/licensing/ILicensingService.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+/*
+ * This file is auto-generated. DO NOT MODIFY.
+ * Original file: aidl/ILicensingService.aidl
+ */
+package com.google.android.vending.licensing;
+import java.lang.String;
+import android.os.RemoteException;
+import android.os.IBinder;
+import android.os.IInterface;
+import android.os.Binder;
+import android.os.Parcel;
+public interface ILicensingService extends android.os.IInterface {
+ /** Local-side IPC implementation stub class. */
+ public static abstract class Stub extends android.os.Binder implements com.google.android.vending.licensing.ILicensingService {
+ private static final java.lang.String DESCRIPTOR = "com.android.vending.licensing.ILicensingService";
+ /** Construct the stub at attach it to the interface. */
+ public Stub() {
+ this.attachInterface(this, DESCRIPTOR);
+ }
+ /**
+ * Cast an IBinder object into an ILicensingService interface,
+ * generating a proxy if needed.
+ */
+ public static com.google.android.vending.licensing.ILicensingService asInterface(android.os.IBinder obj) {
+ if ((obj == null)) {
+ return null;
+ }
+ android.os.IInterface iin = (android.os.IInterface)obj.queryLocalInterface(DESCRIPTOR);
+ if (((iin != null) && (iin instanceof com.google.android.vending.licensing.ILicensingService))) {
+ return ((com.google.android.vending.licensing.ILicensingService)iin);
+ }
+ return new com.google.android.vending.licensing.ILicensingService.Stub.Proxy(obj);
+ }
+ public android.os.IBinder asBinder() {
+ return this;
+ }
+ public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException {
+ switch (code) {
+ case INTERFACE_TRANSACTION: {
+ reply.writeString(DESCRIPTOR);
+ return true;
+ }
+ case TRANSACTION_checkLicense: {
+ data.enforceInterface(DESCRIPTOR);
+ long _arg0;
+ _arg0 = data.readLong();
+ java.lang.String _arg1;
+ _arg1 = data.readString();
+ com.google.android.vending.licensing.ILicenseResultListener _arg2;
+ _arg2 = com.google.android.vending.licensing.ILicenseResultListener.Stub.asInterface(data.readStrongBinder());
+ this.checkLicense(_arg0, _arg1, _arg2);
+ return true;
+ }
+ }
+ return super.onTransact(code, data, reply, flags);
+ }
+ private static class Proxy implements com.google.android.vending.licensing.ILicensingService {
+ private android.os.IBinder mRemote;
+ Proxy(android.os.IBinder remote) {
+ mRemote = remote;
+ }
+ public android.os.IBinder asBinder() {
+ return mRemote;
+ }
+ public java.lang.String getInterfaceDescriptor() {
+ return DESCRIPTOR;
+ }
+ public void checkLicense(long nonce, java.lang.String packageName, com.google.android.vending.licensing.ILicenseResultListener listener) throws android.os.RemoteException {
+ android.os.Parcel _data = android.os.Parcel.obtain();
+ try {
+ _data.writeInterfaceToken(DESCRIPTOR);
+ _data.writeLong(nonce);
+ _data.writeString(packageName);
+ _data.writeStrongBinder((((listener != null)) ? (listener.asBinder()) : (null)));
+ mRemote.transact(Stub.TRANSACTION_checkLicense, _data, null, IBinder.FLAG_ONEWAY);
+ } finally {
+ _data.recycle();
+ }
+ }
+ }
+ static final int TRANSACTION_checkLicense = (IBinder.FIRST_CALL_TRANSACTION + 0);
+ }
+ public void checkLicense(long nonce, java.lang.String packageName, com.google.android.vending.licensing.ILicenseResultListener listener) throws android.os.RemoteException;
+}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/LicenseChecker.java b/platform/android/java/src/com/google/android/vending/licensing/LicenseChecker.java
new file mode 100644
index 0000000000..38aab9f4f5
--- /dev/null
+++ b/platform/android/java/src/com/google/android/vending/licensing/LicenseChecker.java
@@ -0,0 +1,387 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.android.vending.licensing;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.provider.Settings.Secure;
+import android.util.Log;
+
+import com.google.android.vending.licensing.ILicenseResultListener;
+import com.google.android.vending.licensing.ILicensingService;
+import com.google.android.vending.licensing.util.Base64;
+import com.google.android.vending.licensing.util.Base64DecoderException;
+
+import java.security.KeyFactory;
+import java.security.NoSuchAlgorithmException;
+import java.security.PublicKey;
+import java.security.SecureRandom;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.Set;
+
+/**
+ * Client library for Google Play license verifications.
+ * <p>
+ * The LicenseChecker is configured via a {@link Policy} which contains the logic to determine
+ * whether a user should have access to the application. For example, the Policy can define a
+ * threshold for allowable number of server or client failures before the library reports the user
+ * as not having access.
+ * <p>
+ * Must also provide the Base64-encoded RSA public key associated with your developer account. The
+ * public key is obtainable from the publisher site.
+ */
+public class LicenseChecker implements ServiceConnection {
+ private static final String TAG = "LicenseChecker";
+
+ private static final String KEY_FACTORY_ALGORITHM = "RSA";
+
+ // Timeout value (in milliseconds) for calls to service.
+ private static final int TIMEOUT_MS = 10 * 1000;
+
+ private static final SecureRandom RANDOM = new SecureRandom();
+ private static final boolean DEBUG_LICENSE_ERROR = false;
+
+ private ILicensingService mService;
+
+ private PublicKey mPublicKey;
+ private final Context mContext;
+ private final Policy mPolicy;
+ /**
+ * A handler for running tasks on a background thread. We don't want license processing to block
+ * the UI thread.
+ */
+ private Handler mHandler;
+ private final String mPackageName;
+ private final String mVersionCode;
+ private final Set<LicenseValidator> mChecksInProgress = new HashSet<LicenseValidator>();
+ private final Queue<LicenseValidator> mPendingChecks = new LinkedList<LicenseValidator>();
+
+ /**
+ * @param context a Context
+ * @param policy implementation of Policy
+ * @param encodedPublicKey Base64-encoded RSA public key
+ * @throws IllegalArgumentException if encodedPublicKey is invalid
+ */
+ public LicenseChecker(Context context, Policy policy, String encodedPublicKey) {
+ mContext = context;
+ mPolicy = policy;
+ mPublicKey = generatePublicKey(encodedPublicKey);
+ mPackageName = mContext.getPackageName();
+ mVersionCode = getVersionCode(context, mPackageName);
+ HandlerThread handlerThread = new HandlerThread("background thread");
+ handlerThread.start();
+ mHandler = new Handler(handlerThread.getLooper());
+ }
+
+ /**
+ * Generates a PublicKey instance from a string containing the Base64-encoded public key.
+ *
+ * @param encodedPublicKey Base64-encoded public key
+ * @throws IllegalArgumentException if encodedPublicKey is invalid
+ */
+ private static PublicKey generatePublicKey(String encodedPublicKey) {
+ try {
+ byte[] decodedKey = Base64.decode(encodedPublicKey);
+ KeyFactory keyFactory = KeyFactory.getInstance(KEY_FACTORY_ALGORITHM);
+
+ return keyFactory.generatePublic(new X509EncodedKeySpec(decodedKey));
+ } catch (NoSuchAlgorithmException e) {
+ // This won't happen in an Android-compatible environment.
+ throw new RuntimeException(e);
+ } catch (Base64DecoderException e) {
+ Log.e(TAG, "Could not decode from Base64.");
+ throw new IllegalArgumentException(e);
+ } catch (InvalidKeySpecException e) {
+ Log.e(TAG, "Invalid key specification.");
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ /**
+ * Checks if the user should have access to the app. Binds the service if necessary.
+ * <p>
+ * NOTE: This call uses a trivially obfuscated string (base64-encoded). For best security, we
+ * recommend obfuscating the string that is passed into bindService using another method of your
+ * own devising.
+ * <p>
+ * source string: "com.android.vending.licensing.ILicensingService"
+ * <p>
+ *
+ * @param callback
+ */
+ public synchronized void checkAccess(LicenseCheckerCallback callback) {
+ // If we have a valid recent LICENSED response, we can skip asking
+ // Market.
+ if (mPolicy.allowAccess()) {
+ Log.i(TAG, "Using cached license response");
+ callback.allow(Policy.LICENSED);
+ } else {
+ LicenseValidator validator = new LicenseValidator(mPolicy, new NullDeviceLimiter(),
+ callback, generateNonce(), mPackageName, mVersionCode);
+
+ if (mService == null) {
+ Log.i(TAG, "Binding to licensing service.");
+ try {
+ boolean bindResult = mContext
+ .bindService(
+ new Intent(
+ new String(
+ // Base64 encoded -
+ // com.android.vending.licensing.ILicensingService
+ // Consider encoding this in another way in your
+ // code to improve security
+ Base64.decode(
+ "Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U=")))
+ // As of Android 5.0, implicit
+ // Service Intents are no longer
+ // allowed because it's not
+ // possible for the user to
+ // participate in disambiguating
+ // them. This does mean we break
+ // compatibility with Android
+ // Cupcake devices with this
+ // release, since setPackage was
+ // added in Donut.
+ .setPackage(
+ new String(
+ // Base64
+ // encoded -
+ // com.android.vending
+ Base64.decode(
+ "Y29tLmFuZHJvaWQudmVuZGluZw=="))),
+ this, // ServiceConnection.
+ Context.BIND_AUTO_CREATE);
+ if (bindResult) {
+ mPendingChecks.offer(validator);
+ } else {
+ Log.e(TAG, "Could not bind to service.");
+ handleServiceConnectionError(validator);
+ }
+ } catch (SecurityException e) {
+ callback.applicationError(LicenseCheckerCallback.ERROR_MISSING_PERMISSION);
+ } catch (Base64DecoderException e) {
+ e.printStackTrace();
+ }
+ } else {
+ mPendingChecks.offer(validator);
+ runChecks();
+ }
+ }
+ }
+
+ /**
+ * Triggers the last deep link licensing URL returned from the server, which redirects users to a
+ * page which enables them to gain access to the app. If no such URL is returned by the server, it
+ * will go to the details page of the app in the Play Store.
+ */
+ public void followLastLicensingUrl(Context context) {
+ String licensingUrl = mPolicy.getLicensingUrl();
+ if (licensingUrl == null) {
+ licensingUrl = "https://play.google.com/store/apps/details?id=" + context.getPackageName();
+ }
+ Intent marketIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(licensingUrl));
+ context.startActivity(marketIntent);
+ }
+
+ private void runChecks() {
+ LicenseValidator validator;
+ while ((validator = mPendingChecks.poll()) != null) {
+ try {
+ Log.i(TAG, "Calling checkLicense on service for " + validator.getPackageName());
+ mService.checkLicense(
+ validator.getNonce(), validator.getPackageName(),
+ new ResultListener(validator));
+ mChecksInProgress.add(validator);
+ } catch (RemoteException e) {
+ Log.w(TAG, "RemoteException in checkLicense call.", e);
+ handleServiceConnectionError(validator);
+ }
+ }
+ }
+
+ private synchronized void finishCheck(LicenseValidator validator) {
+ mChecksInProgress.remove(validator);
+ if (mChecksInProgress.isEmpty()) {
+ cleanupService();
+ }
+ }
+
+ private class ResultListener extends ILicenseResultListener.Stub {
+ private final LicenseValidator mValidator;
+ private Runnable mOnTimeout;
+
+ public ResultListener(LicenseValidator validator) {
+ mValidator = validator;
+ mOnTimeout = new Runnable() {
+ public void run() {
+ Log.i(TAG, "Check timed out.");
+ handleServiceConnectionError(mValidator);
+ finishCheck(mValidator);
+ }
+ };
+ startTimeout();
+ }
+
+ private static final int ERROR_CONTACTING_SERVER = 0x101;
+ private static final int ERROR_INVALID_PACKAGE_NAME = 0x102;
+ private static final int ERROR_NON_MATCHING_UID = 0x103;
+
+ // Runs in IPC thread pool. Post it to the Handler, so we can guarantee
+ // either this or the timeout runs.
+ public void verifyLicense(final int responseCode, final String signedData,
+ final String signature) {
+ mHandler.post(new Runnable() {
+ public void run() {
+ Log.i(TAG, "Received response.");
+ // Make sure it hasn't already timed out.
+ if (mChecksInProgress.contains(mValidator)) {
+ clearTimeout();
+ mValidator.verify(mPublicKey, responseCode, signedData, signature);
+ finishCheck(mValidator);
+ }
+ if (DEBUG_LICENSE_ERROR) {
+ boolean logResponse;
+ String stringError = null;
+ switch (responseCode) {
+ case ERROR_CONTACTING_SERVER:
+ logResponse = true;
+ stringError = "ERROR_CONTACTING_SERVER";
+ break;
+ case ERROR_INVALID_PACKAGE_NAME:
+ logResponse = true;
+ stringError = "ERROR_INVALID_PACKAGE_NAME";
+ break;
+ case ERROR_NON_MATCHING_UID:
+ logResponse = true;
+ stringError = "ERROR_NON_MATCHING_UID";
+ break;
+ default:
+ logResponse = false;
+ }
+
+ if (logResponse) {
+ String android_id = Secure.ANDROID_ID;
+ Date date = new Date();
+ Log.d(TAG, "Server Failure: " + stringError);
+ Log.d(TAG, "Android ID: " + android_id);
+ Log.d(TAG, "Time: " + date.toGMTString());
+ }
+ }
+ }
+ });
+ }
+
+ private void startTimeout() {
+ Log.i(TAG, "Start monitoring timeout.");
+ mHandler.postDelayed(mOnTimeout, TIMEOUT_MS);
+ }
+
+ private void clearTimeout() {
+ Log.i(TAG, "Clearing timeout.");
+ mHandler.removeCallbacks(mOnTimeout);
+ }
+ }
+
+ public synchronized void onServiceConnected(ComponentName name, IBinder service) {
+ mService = ILicensingService.Stub.asInterface(service);
+ runChecks();
+ }
+
+ public synchronized void onServiceDisconnected(ComponentName name) {
+ // Called when the connection with the service has been
+ // unexpectedly disconnected. That is, Market crashed.
+ // If there are any checks in progress, the timeouts will handle them.
+ Log.w(TAG, "Service unexpectedly disconnected.");
+ mService = null;
+ }
+
+ /**
+ * Generates policy response for service connection errors, as a result of disconnections or
+ * timeouts.
+ */
+ private synchronized void handleServiceConnectionError(LicenseValidator validator) {
+ mPolicy.processServerResponse(Policy.RETRY, null);
+
+ if (mPolicy.allowAccess()) {
+ validator.getCallback().allow(Policy.RETRY);
+ } else {
+ validator.getCallback().dontAllow(Policy.RETRY);
+ }
+ }
+
+ /** Unbinds service if necessary and removes reference to it. */
+ private void cleanupService() {
+ if (mService != null) {
+ try {
+ mContext.unbindService(this);
+ } catch (IllegalArgumentException e) {
+ // Somehow we've already been unbound. This is a non-fatal
+ // error.
+ Log.e(TAG, "Unable to unbind from licensing service (already unbound)");
+ }
+ mService = null;
+ }
+ }
+
+ /**
+ * Inform the library that the context is about to be destroyed, so that any open connections
+ * can be cleaned up.
+ * <p>
+ * Failure to call this method can result in a crash under certain circumstances, such as during
+ * screen rotation if an Activity requests the license check or when the user exits the
+ * application.
+ */
+ public synchronized void onDestroy() {
+ cleanupService();
+ mHandler.getLooper().quit();
+ }
+
+ /** Generates a nonce (number used once). */
+ private int generateNonce() {
+ return RANDOM.nextInt();
+ }
+
+ /**
+ * Get version code for the application package name.
+ *
+ * @param context
+ * @param packageName application package name
+ * @return the version code or empty string if package not found
+ */
+ private static String getVersionCode(Context context, String packageName) {
+ try {
+ return String.valueOf(
+ context.getPackageManager().getPackageInfo(packageName, 0).versionCode);
+ } catch (NameNotFoundException e) {
+ Log.e(TAG, "Package not found. could not get version code.");
+ return "";
+ }
+ }
+}
diff --git a/platform/android/java/src/com/android/vending/licensing/LicenseCheckerCallback.java b/platform/android/java/src/com/google/android/vending/licensing/LicenseCheckerCallback.java
index b250a7147b..dc2c2d70bf 100644
--- a/platform/android/java/src/com/android/vending/licensing/LicenseCheckerCallback.java
+++ b/platform/android/java/src/com/google/android/vending/licensing/LicenseCheckerCallback.java
@@ -34,34 +34,34 @@ package com.google.android.vending.licensing;
*/
public interface LicenseCheckerCallback {
- /**
+ /**
* Allow use. App should proceed as normal.
- *
+ *
* @param reason Policy.LICENSED or Policy.RETRY typically. (although in
* theory the policy can return Policy.NOT_LICENSED here as well)
*/
- public void allow(int reason);
+ public void allow(int reason);
- /**
+ /**
* Don't allow use. App should inform user and take appropriate action.
- *
+ *
* @param reason Policy.NOT_LICENSED or Policy.RETRY. (although in theory
* the policy can return Policy.LICENSED here as well ---
* perhaps the call to the LVL took too long, for example)
*/
- public void dontAllow(int reason);
+ public void dontAllow(int reason);
- /** Application error codes. */
- public static final int ERROR_INVALID_PACKAGE_NAME = 1;
- public static final int ERROR_NON_MATCHING_UID = 2;
- public static final int ERROR_NOT_MARKET_MANAGED = 3;
- public static final int ERROR_CHECK_IN_PROGRESS = 4;
- public static final int ERROR_INVALID_PUBLIC_KEY = 5;
- public static final int ERROR_MISSING_PERMISSION = 6;
+ /** Application error codes. */
+ public static final int ERROR_INVALID_PACKAGE_NAME = 1;
+ public static final int ERROR_NON_MATCHING_UID = 2;
+ public static final int ERROR_NOT_MARKET_MANAGED = 3;
+ public static final int ERROR_CHECK_IN_PROGRESS = 4;
+ public static final int ERROR_INVALID_PUBLIC_KEY = 5;
+ public static final int ERROR_MISSING_PERMISSION = 6;
- /**
+ /**
* Error in application code. Caller did not call or set up license checker
* correctly. Should be considered fatal.
*/
- public void applicationError(int errorCode);
+ public void applicationError(int errorCode);
}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/LicenseValidator.java b/platform/android/java/src/com/google/android/vending/licensing/LicenseValidator.java
new file mode 100644
index 0000000000..77f7dc7295
--- /dev/null
+++ b/platform/android/java/src/com/google/android/vending/licensing/LicenseValidator.java
@@ -0,0 +1,232 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.android.vending.licensing;
+
+import com.google.android.vending.licensing.util.Base64;
+import com.google.android.vending.licensing.util.Base64DecoderException;
+
+import android.text.TextUtils;
+import android.util.Log;
+
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.PublicKey;
+import java.security.Signature;
+import java.security.SignatureException;
+
+/**
+ * Contains data related to a licensing request and methods to verify
+ * and process the response.
+ */
+class LicenseValidator {
+ private static final String TAG = "LicenseValidator";
+
+ // Server response codes.
+ private static final int LICENSED = 0x0;
+ private static final int NOT_LICENSED = 0x1;
+ private static final int LICENSED_OLD_KEY = 0x2;
+ private static final int ERROR_NOT_MARKET_MANAGED = 0x3;
+ private static final int ERROR_SERVER_FAILURE = 0x4;
+ private static final int ERROR_OVER_QUOTA = 0x5;
+
+ private static final int ERROR_CONTACTING_SERVER = 0x101;
+ private static final int ERROR_INVALID_PACKAGE_NAME = 0x102;
+ private static final int ERROR_NON_MATCHING_UID = 0x103;
+
+ private final Policy mPolicy;
+ private final LicenseCheckerCallback mCallback;
+ private final int mNonce;
+ private final String mPackageName;
+ private final String mVersionCode;
+ private final DeviceLimiter mDeviceLimiter;
+
+ LicenseValidator(Policy policy, DeviceLimiter deviceLimiter, LicenseCheckerCallback callback,
+ int nonce, String packageName, String versionCode) {
+ mPolicy = policy;
+ mDeviceLimiter = deviceLimiter;
+ mCallback = callback;
+ mNonce = nonce;
+ mPackageName = packageName;
+ mVersionCode = versionCode;
+ }
+
+ public LicenseCheckerCallback getCallback() {
+ return mCallback;
+ }
+
+ public int getNonce() {
+ return mNonce;
+ }
+
+ public String getPackageName() {
+ return mPackageName;
+ }
+
+ private static final String SIGNATURE_ALGORITHM = "SHA1withRSA";
+
+ /**
+ * Verifies the response from server and calls appropriate callback method.
+ *
+ * @param publicKey public key associated with the developer account
+ * @param responseCode server response code
+ * @param signedData signed data from server
+ * @param signature server signature
+ */
+ public void verify(PublicKey publicKey, int responseCode, String signedData, String signature) {
+ String userId = null;
+ // Skip signature check for unsuccessful requests
+ ResponseData data = null;
+ if (responseCode == LICENSED || responseCode == NOT_LICENSED ||
+ responseCode == LICENSED_OLD_KEY) {
+ // Verify signature.
+ try {
+ if (TextUtils.isEmpty(signedData)) {
+ Log.e(TAG, "Signature verification failed: signedData is empty. "
+ +
+ "(Device not signed-in to any Google accounts?)");
+ handleInvalidResponse();
+ return;
+ }
+
+ Signature sig = Signature.getInstance(SIGNATURE_ALGORITHM);
+ sig.initVerify(publicKey);
+ sig.update(signedData.getBytes());
+
+ if (!sig.verify(Base64.decode(signature))) {
+ Log.e(TAG, "Signature verification failed.");
+ handleInvalidResponse();
+ return;
+ }
+ } catch (NoSuchAlgorithmException e) {
+ // This can't happen on an Android compatible device.
+ throw new RuntimeException(e);
+ } catch (InvalidKeyException e) {
+ handleApplicationError(LicenseCheckerCallback.ERROR_INVALID_PUBLIC_KEY);
+ return;
+ } catch (SignatureException e) {
+ throw new RuntimeException(e);
+ } catch (Base64DecoderException e) {
+ Log.e(TAG, "Could not Base64-decode signature.");
+ handleInvalidResponse();
+ return;
+ }
+
+ // Parse and validate response.
+ try {
+ data = ResponseData.parse(signedData);
+ } catch (IllegalArgumentException e) {
+ Log.e(TAG, "Could not parse response.");
+ handleInvalidResponse();
+ return;
+ }
+
+ if (data.responseCode != responseCode) {
+ Log.e(TAG, "Response codes don't match.");
+ handleInvalidResponse();
+ return;
+ }
+
+ if (data.nonce != mNonce) {
+ Log.e(TAG, "Nonce doesn't match.");
+ handleInvalidResponse();
+ return;
+ }
+
+ if (!data.packageName.equals(mPackageName)) {
+ Log.e(TAG, "Package name doesn't match.");
+ handleInvalidResponse();
+ return;
+ }
+
+ if (!data.versionCode.equals(mVersionCode)) {
+ Log.e(TAG, "Version codes don't match.");
+ handleInvalidResponse();
+ return;
+ }
+
+ // Application-specific user identifier.
+ userId = data.userId;
+ if (TextUtils.isEmpty(userId)) {
+ Log.e(TAG, "User identifier is empty.");
+ handleInvalidResponse();
+ return;
+ }
+ }
+
+ switch (responseCode) {
+ case LICENSED:
+ case LICENSED_OLD_KEY:
+ int limiterResponse = mDeviceLimiter.isDeviceAllowed(userId);
+ handleResponse(limiterResponse, data);
+ break;
+ case NOT_LICENSED:
+ handleResponse(Policy.NOT_LICENSED, data);
+ break;
+ case ERROR_CONTACTING_SERVER:
+ Log.w(TAG, "Error contacting licensing server.");
+ handleResponse(Policy.RETRY, data);
+ break;
+ case ERROR_SERVER_FAILURE:
+ Log.w(TAG, "An error has occurred on the licensing server.");
+ handleResponse(Policy.RETRY, data);
+ break;
+ case ERROR_OVER_QUOTA:
+ Log.w(TAG, "Licensing server is refusing to talk to this device, over quota.");
+ handleResponse(Policy.RETRY, data);
+ break;
+ case ERROR_INVALID_PACKAGE_NAME:
+ handleApplicationError(LicenseCheckerCallback.ERROR_INVALID_PACKAGE_NAME);
+ break;
+ case ERROR_NON_MATCHING_UID:
+ handleApplicationError(LicenseCheckerCallback.ERROR_NON_MATCHING_UID);
+ break;
+ case ERROR_NOT_MARKET_MANAGED:
+ handleApplicationError(LicenseCheckerCallback.ERROR_NOT_MARKET_MANAGED);
+ break;
+ default:
+ Log.e(TAG, "Unknown response code for license check.");
+ handleInvalidResponse();
+ }
+ }
+
+ /**
+ * Confers with policy and calls appropriate callback method.
+ *
+ * @param response
+ * @param rawData
+ */
+ private void handleResponse(int response, ResponseData rawData) {
+ // Update policy data and increment retry counter (if needed)
+ mPolicy.processServerResponse(response, rawData);
+
+ // Given everything we know, including cached data, ask the policy if we should grant
+ // access.
+ if (mPolicy.allowAccess()) {
+ mCallback.allow(response);
+ } else {
+ mCallback.dontAllow(response);
+ }
+ }
+
+ private void handleApplicationError(int code) {
+ mCallback.applicationError(code);
+ }
+
+ private void handleInvalidResponse() {
+ mCallback.dontAllow(Policy.NOT_LICENSED);
+ }
+}
diff --git a/platform/android/java/src/com/android/vending/licensing/NullDeviceLimiter.java b/platform/android/java/src/com/google/android/vending/licensing/NullDeviceLimiter.java
index d87af3153f..a43e454228 100644
--- a/platform/android/java/src/com/android/vending/licensing/NullDeviceLimiter.java
+++ b/platform/android/java/src/com/google/android/vending/licensing/NullDeviceLimiter.java
@@ -26,7 +26,7 @@ package com.google.android.vending.licensing;
*/
public class NullDeviceLimiter implements DeviceLimiter {
- public int isDeviceAllowed(String userId) {
- return Policy.LICENSED;
- }
+ public int isDeviceAllowed(String userId) {
+ return Policy.LICENSED;
+ }
}
diff --git a/platform/android/java/src/com/android/vending/licensing/Obfuscator.java b/platform/android/java/src/com/google/android/vending/licensing/Obfuscator.java
index 88891728e6..8731d03aa6 100644
--- a/platform/android/java/src/com/android/vending/licensing/Obfuscator.java
+++ b/platform/android/java/src/com/google/android/vending/licensing/Obfuscator.java
@@ -20,29 +20,29 @@ package com.google.android.vending.licensing;
* Interface used as part of a {@link Policy} to allow application authors to obfuscate
* licensing data that will be stored into a SharedPreferences file.
* <p>
- * Any transformation scheme must be reversible. Implementing classes may optionally implement an
+ * Any transformation scheme must be reversable. Implementing classes may optionally implement an
* integrity check to further prevent modification to preference data. Implementing classes
* should use device-specific information as a key in the obfuscation algorithm to prevent
* obfuscated preferences from being shared among devices.
*/
public interface Obfuscator {
- /**
+ /**
* Obfuscate a string that is being stored into shared preferences.
*
* @param original The data that is to be obfuscated.
* @param key The key for the data that is to be obfuscated.
* @return A transformed version of the original data.
*/
- String obfuscate(String original, String key);
+ String obfuscate(String original, String key);
- /**
+ /**
* Undo the transformation applied to data by the obfuscate() method.
*
- * @param original The data that is to be obfuscated.
- * @param key The key for the data that is to be obfuscated.
- * @return A transformed version of the original data.
+ * @param obfuscated The data that is to be un-obfuscated.
+ * @param key The key for the data that is to be un-obfuscated.
+ * @return The original data transformed by the obfuscate() method.
* @throws ValidationException Optionally thrown if a data integrity check fails.
*/
- String unobfuscate(String obfuscated, String key) throws ValidationException;
+ String unobfuscate(String obfuscated, String key) throws ValidationException;
}
diff --git a/platform/android/java/src/com/android/vending/licensing/Policy.java b/platform/android/java/src/com/google/android/vending/licensing/Policy.java
index fa267fc71a..65202aceb9 100644
--- a/platform/android/java/src/com/android/vending/licensing/Policy.java
+++ b/platform/android/java/src/com/google/android/vending/licensing/Policy.java
@@ -22,38 +22,44 @@ package com.google.android.vending.licensing;
*/
public interface Policy {
- /**
+ /**
* Change these values to make it more difficult for tools to automatically
* strip LVL protection from your APK.
*/
- /**
+ /**
* LICENSED means that the server returned back a valid license response
*/
- public static final int LICENSED = 0x0100;
- /**
+ public static final int LICENSED = 0x0100;
+ /**
* NOT_LICENSED means that the server returned back a valid license response
* that indicated that the user definitively is not licensed
*/
- public static final int NOT_LICENSED = 0x0231;
- /**
+ public static final int NOT_LICENSED = 0x0231;
+ /**
* RETRY means that the license response was unable to be determined ---
* perhaps as a result of faulty networking
*/
- public static final int RETRY = 0x0123;
+ public static final int RETRY = 0x0123;
- /**
+ /**
* Provide results from contact with the license server. Retry counts are
* incremented if the current value of response is RETRY. Results will be
* used for any future policy decisions.
- *
+ *
* @param response the result from validating the server response
* @param rawData the raw server response data, can be null for RETRY
*/
- void processServerResponse(int response, ResponseData rawData);
+ void processServerResponse(int response, ResponseData rawData);
- /**
+ /**
* Check if the user should be allowed access to the application.
*/
- boolean allowAccess();
+ boolean allowAccess();
+
+ /**
+ * Gets the licensing URL returned by the server that can enable access for unlicensed apps (e.g.
+ * buy app on the Play Store).
+ */
+ String getLicensingUrl();
}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/PreferenceObfuscator.java b/platform/android/java/src/com/google/android/vending/licensing/PreferenceObfuscator.java
new file mode 100644
index 0000000000..099bb1c48b
--- /dev/null
+++ b/platform/android/java/src/com/google/android/vending/licensing/PreferenceObfuscator.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.android.vending.licensing;
+
+import android.content.SharedPreferences;
+import android.util.Log;
+
+/**
+ * An wrapper for SharedPreferences that transparently performs data obfuscation.
+ */
+public class PreferenceObfuscator {
+
+ private static final String TAG = "PreferenceObfuscator";
+
+ private final SharedPreferences mPreferences;
+ private final Obfuscator mObfuscator;
+ private SharedPreferences.Editor mEditor;
+
+ /**
+ * Constructor.
+ *
+ * @param sp A SharedPreferences instance provided by the system.
+ * @param o The Obfuscator to use when reading or writing data.
+ */
+ public PreferenceObfuscator(SharedPreferences sp, Obfuscator o) {
+ mPreferences = sp;
+ mObfuscator = o;
+ mEditor = null;
+ }
+
+ public void putString(String key, String value) {
+ if (mEditor == null) {
+ mEditor = mPreferences.edit();
+ mEditor.apply();
+ }
+ String obfuscatedValue = mObfuscator.obfuscate(value, key);
+ mEditor.putString(key, obfuscatedValue);
+ }
+
+ public String getString(String key, String defValue) {
+ String result;
+ String value = mPreferences.getString(key, null);
+ if (value != null) {
+ try {
+ result = mObfuscator.unobfuscate(value, key);
+ } catch (ValidationException e) {
+ // Unable to unobfuscate, data corrupt or tampered
+ Log.w(TAG, "Validation error while reading preference: " + key);
+ result = defValue;
+ }
+ } else {
+ // Preference not found
+ result = defValue;
+ }
+ return result;
+ }
+
+ public void commit() {
+ if (mEditor != null) {
+ mEditor.commit();
+ mEditor = null;
+ }
+ }
+}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/ResponseData.java b/platform/android/java/src/com/google/android/vending/licensing/ResponseData.java
new file mode 100644
index 0000000000..1c802f8e45
--- /dev/null
+++ b/platform/android/java/src/com/google/android/vending/licensing/ResponseData.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.android.vending.licensing;
+
+import android.text.TextUtils;
+
+import java.util.regex.Pattern;
+
+/**
+ * ResponseData from licensing server.
+ */
+public class ResponseData {
+
+ public int responseCode;
+ public int nonce;
+ public String packageName;
+ public String versionCode;
+ public String userId;
+ public long timestamp;
+ /** Response-specific data. */
+ public String extra;
+
+ /**
+ * Parses response string into ResponseData.
+ *
+ * @param responseData response data string
+ * @throws IllegalArgumentException upon parsing error
+ * @return ResponseData object
+ */
+ public static ResponseData parse(String responseData) {
+ // Must parse out main response data and response-specific data.
+ int index = responseData.indexOf(':');
+ String mainData, extraData;
+ if (-1 == index) {
+ mainData = responseData;
+ extraData = "";
+ } else {
+ mainData = responseData.substring(0, index);
+ extraData = index >= responseData.length() ? "" : responseData.substring(index + 1);
+ }
+
+ String[] fields = TextUtils.split(mainData, Pattern.quote("|"));
+ if (fields.length < 6) {
+ throw new IllegalArgumentException("Wrong number of fields.");
+ }
+
+ ResponseData data = new ResponseData();
+ data.extra = extraData;
+ data.responseCode = Integer.parseInt(fields[0]);
+ data.nonce = Integer.parseInt(fields[1]);
+ data.packageName = fields[2];
+ data.versionCode = fields[3];
+ // Application-specific user identifier.
+ data.userId = fields[4];
+ data.timestamp = Long.parseLong(fields[5]);
+
+ return data;
+ }
+
+ @Override
+ public String toString() {
+ return TextUtils.join("|", new Object[] {
+ responseCode, nonce, packageName, versionCode,
+ userId, timestamp });
+ }
+}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/ServerManagedPolicy.java b/platform/android/java/src/com/google/android/vending/licensing/ServerManagedPolicy.java
new file mode 100644
index 0000000000..b9a50c1104
--- /dev/null
+++ b/platform/android/java/src/com/google/android/vending/licensing/ServerManagedPolicy.java
@@ -0,0 +1,299 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.android.vending.licensing;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.HashMap;
+import java.util.Map;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.util.Log;
+
+import com.google.android.vending.licensing.util.URIQueryDecoder;
+
+/**
+ * Default policy. All policy decisions are based off of response data received
+ * from the licensing service. Specifically, the licensing server sends the
+ * following information: response validity period, error retry period,
+ * error retry count and a URL for restoring app access in unlicensed cases.
+ * <p>
+ * These values will vary based on the the way the application is configured in
+ * the Google Play publishing console, such as whether the application is
+ * marked as free or is within its refund period, as well as how often an
+ * application is checking with the licensing service.
+ * <p>
+ * Developers who need more fine grained control over their application's
+ * licensing policy should implement a custom Policy.
+ */
+public class ServerManagedPolicy implements Policy {
+
+ private static final String TAG = "ServerManagedPolicy";
+ private static final String PREFS_FILE = "com.google.android.vending.licensing.ServerManagedPolicy";
+ private static final String PREF_LAST_RESPONSE = "lastResponse";
+ private static final String PREF_VALIDITY_TIMESTAMP = "validityTimestamp";
+ private static final String PREF_RETRY_UNTIL = "retryUntil";
+ private static final String PREF_MAX_RETRIES = "maxRetries";
+ private static final String PREF_RETRY_COUNT = "retryCount";
+ private static final String PREF_LICENSING_URL = "licensingUrl";
+ private static final String DEFAULT_VALIDITY_TIMESTAMP = "0";
+ private static final String DEFAULT_RETRY_UNTIL = "0";
+ private static final String DEFAULT_MAX_RETRIES = "0";
+ private static final String DEFAULT_RETRY_COUNT = "0";
+
+ private static final long MILLIS_PER_MINUTE = 60 * 1000;
+
+ private long mValidityTimestamp;
+ private long mRetryUntil;
+ private long mMaxRetries;
+ private long mRetryCount;
+ private long mLastResponseTime = 0;
+ private int mLastResponse;
+ private String mLicensingUrl;
+ private PreferenceObfuscator mPreferences;
+
+ /**
+ * @param context The context for the current application
+ * @param obfuscator An obfuscator to be used with preferences.
+ */
+ public ServerManagedPolicy(Context context, Obfuscator obfuscator) {
+ // Import old values
+ SharedPreferences sp = context.getSharedPreferences(PREFS_FILE, Context.MODE_PRIVATE);
+ mPreferences = new PreferenceObfuscator(sp, obfuscator);
+ mLastResponse = Integer.parseInt(
+ mPreferences.getString(PREF_LAST_RESPONSE, Integer.toString(Policy.RETRY)));
+ mValidityTimestamp = Long.parseLong(mPreferences.getString(PREF_VALIDITY_TIMESTAMP,
+ DEFAULT_VALIDITY_TIMESTAMP));
+ mRetryUntil = Long.parseLong(mPreferences.getString(PREF_RETRY_UNTIL, DEFAULT_RETRY_UNTIL));
+ mMaxRetries = Long.parseLong(mPreferences.getString(PREF_MAX_RETRIES, DEFAULT_MAX_RETRIES));
+ mRetryCount = Long.parseLong(mPreferences.getString(PREF_RETRY_COUNT, DEFAULT_RETRY_COUNT));
+ mLicensingUrl = mPreferences.getString(PREF_LICENSING_URL, null);
+ }
+
+ /**
+ * Process a new response from the license server.
+ * <p>
+ * This data will be used for computing future policy decisions. The
+ * following parameters are processed:
+ * <ul>
+ * <li>VT: the timestamp that the client should consider the response valid
+ * until
+ * <li>GT: the timestamp that the client should ignore retry errors until
+ * <li>GR: the number of retry errors that the client should ignore
+ * <li>LU: a deep link URL that can enable access for unlicensed apps (e.g.
+ * buy app on the Play Store)
+ * </ul>
+ *
+ * @param response the result from validating the server response
+ * @param rawData the raw server response data
+ */
+ public void processServerResponse(int response, ResponseData rawData) {
+
+ // Update retry counter
+ if (response != Policy.RETRY) {
+ setRetryCount(0);
+ } else {
+ setRetryCount(mRetryCount + 1);
+ }
+
+ // Update server policy data
+ Map<String, String> extras = decodeExtras(rawData);
+ if (response == Policy.LICENSED) {
+ mLastResponse = response;
+ // Reset the licensing URL since it is only applicable for NOT_LICENSED responses.
+ setLicensingUrl(null);
+ setValidityTimestamp(extras.get("VT"));
+ setRetryUntil(extras.get("GT"));
+ setMaxRetries(extras.get("GR"));
+ } else if (response == Policy.NOT_LICENSED) {
+ // Clear out stale retry params
+ setValidityTimestamp(DEFAULT_VALIDITY_TIMESTAMP);
+ setRetryUntil(DEFAULT_RETRY_UNTIL);
+ setMaxRetries(DEFAULT_MAX_RETRIES);
+ // Update the licensing URL
+ setLicensingUrl(extras.get("LU"));
+ }
+
+ setLastResponse(response);
+ mPreferences.commit();
+ }
+
+ /**
+ * Set the last license response received from the server and add to
+ * preferences. You must manually call PreferenceObfuscator.commit() to
+ * commit these changes to disk.
+ *
+ * @param l the response
+ */
+ private void setLastResponse(int l) {
+ mLastResponseTime = System.currentTimeMillis();
+ mLastResponse = l;
+ mPreferences.putString(PREF_LAST_RESPONSE, Integer.toString(l));
+ }
+
+ /**
+ * Set the current retry count and add to preferences. You must manually
+ * call PreferenceObfuscator.commit() to commit these changes to disk.
+ *
+ * @param c the new retry count
+ */
+ private void setRetryCount(long c) {
+ mRetryCount = c;
+ mPreferences.putString(PREF_RETRY_COUNT, Long.toString(c));
+ }
+
+ public long getRetryCount() {
+ return mRetryCount;
+ }
+
+ /**
+ * Set the last validity timestamp (VT) received from the server and add to
+ * preferences. You must manually call PreferenceObfuscator.commit() to
+ * commit these changes to disk.
+ *
+ * @param validityTimestamp the VT string received
+ */
+ private void setValidityTimestamp(String validityTimestamp) {
+ Long lValidityTimestamp;
+ try {
+ lValidityTimestamp = Long.parseLong(validityTimestamp);
+ } catch (NumberFormatException e) {
+ // No response or not parsable, expire in one minute.
+ Log.w(TAG, "License validity timestamp (VT) missing, caching for a minute");
+ lValidityTimestamp = System.currentTimeMillis() + MILLIS_PER_MINUTE;
+ validityTimestamp = Long.toString(lValidityTimestamp);
+ }
+
+ mValidityTimestamp = lValidityTimestamp;
+ mPreferences.putString(PREF_VALIDITY_TIMESTAMP, validityTimestamp);
+ }
+
+ public long getValidityTimestamp() {
+ return mValidityTimestamp;
+ }
+
+ /**
+ * Set the retry until timestamp (GT) received from the server and add to
+ * preferences. You must manually call PreferenceObfuscator.commit() to
+ * commit these changes to disk.
+ *
+ * @param retryUntil the GT string received
+ */
+ private void setRetryUntil(String retryUntil) {
+ Long lRetryUntil;
+ try {
+ lRetryUntil = Long.parseLong(retryUntil);
+ } catch (NumberFormatException e) {
+ // No response or not parsable, expire immediately
+ Log.w(TAG, "License retry timestamp (GT) missing, grace period disabled");
+ retryUntil = "0";
+ lRetryUntil = 0l;
+ }
+
+ mRetryUntil = lRetryUntil;
+ mPreferences.putString(PREF_RETRY_UNTIL, retryUntil);
+ }
+
+ public long getRetryUntil() {
+ return mRetryUntil;
+ }
+
+ /**
+ * Set the max retries value (GR) as received from the server and add to
+ * preferences. You must manually call PreferenceObfuscator.commit() to
+ * commit these changes to disk.
+ *
+ * @param maxRetries the GR string received
+ */
+ private void setMaxRetries(String maxRetries) {
+ Long lMaxRetries;
+ try {
+ lMaxRetries = Long.parseLong(maxRetries);
+ } catch (NumberFormatException e) {
+ // No response or not parsable, expire immediately
+ Log.w(TAG, "Licence retry count (GR) missing, grace period disabled");
+ maxRetries = "0";
+ lMaxRetries = 0l;
+ }
+
+ mMaxRetries = lMaxRetries;
+ mPreferences.putString(PREF_MAX_RETRIES, maxRetries);
+ }
+
+ public long getMaxRetries() {
+ return mMaxRetries;
+ }
+
+ /**
+ * Set the license URL value (LU) as received from the server and add to preferences. You must
+ * manually call PreferenceObfuscator.commit() to commit these changes to disk.
+ *
+ * @param url the LU string received
+ */
+ private void setLicensingUrl(String url) {
+ mLicensingUrl = url;
+ mPreferences.putString(PREF_LICENSING_URL, url);
+ }
+
+ public String getLicensingUrl() {
+ return mLicensingUrl;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * This implementation allows access if either:<br>
+ * <ol>
+ * <li>a LICENSED response was received within the validity period
+ * <li>a RETRY response was received in the last minute, and we are under
+ * the RETRY count or in the RETRY period.
+ * </ol>
+ */
+ public boolean allowAccess() {
+ long ts = System.currentTimeMillis();
+ if (mLastResponse == Policy.LICENSED) {
+ // Check if the LICENSED response occurred within the validity timeout.
+ if (ts <= mValidityTimestamp) {
+ // Cached LICENSED response is still valid.
+ return true;
+ }
+ } else if (mLastResponse == Policy.RETRY &&
+ ts < mLastResponseTime + MILLIS_PER_MINUTE) {
+ // Only allow access if we are within the retry period or we haven't used up our
+ // max retries.
+ return (ts <= mRetryUntil || mRetryCount <= mMaxRetries);
+ }
+ return false;
+ }
+
+ private Map<String, String> decodeExtras(
+ com.google.android.vending.licensing.ResponseData rawData) {
+ Map<String, String> results = new HashMap<String, String>();
+ if (rawData == null) {
+ return results;
+ }
+
+ try {
+ URI rawExtras = new URI("?" + rawData.extra);
+ URIQueryDecoder.DecodeQuery(rawExtras, results);
+ } catch (URISyntaxException e) {
+ Log.w(TAG, "Invalid syntax error while decoding extras data from server.");
+ }
+ return results;
+ }
+}
diff --git a/platform/android/java/src/com/android/vending/licensing/StrictPolicy.java b/platform/android/java/src/com/google/android/vending/licensing/StrictPolicy.java
index d8d83b4e4b..9849730c38 100644
--- a/platform/android/java/src/com/android/vending/licensing/StrictPolicy.java
+++ b/platform/android/java/src/com/google/android/vending/licensing/StrictPolicy.java
@@ -16,6 +16,13 @@
package com.google.android.vending.licensing;
+import android.util.Log;
+import com.google.android.vending.licensing.util.URIQueryDecoder;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.HashMap;
+import java.util.Map;
+
/**
* Non-caching policy. All requests will be sent to the licensing service,
* and no local caching is performed.
@@ -26,38 +33,67 @@ package com.google.android.vending.licensing;
* weigh the risks of using this Policy over one which implements caching,
* such as ServerManagedPolicy.
* <p>
- * Access to the application is only allowed if a LICESNED response is.
+ * Access to the application is only allowed if a LICENSED response is.
* received. All other responses (including RETRY) will deny access.
*/
public class StrictPolicy implements Policy {
- private int mLastResponse;
+ private static final String TAG = "StrictPolicy";
+
+ private int mLastResponse;
+ private String mLicensingUrl;
- public StrictPolicy() {
- // Set default policy. This will force the application to check the policy on launch.
- mLastResponse = Policy.RETRY;
- }
+ public StrictPolicy() {
+ // Set default policy. This will force the application to check the policy on launch.
+ mLastResponse = Policy.RETRY;
+ mLicensingUrl = null;
+ }
- /**
+ /**
* Process a new response from the license server. Since we aren't
* performing any caching, this equates to reading the LicenseResponse.
- * Any ResponseData provided is ignored.
+ * Any cache-related ResponseData is ignored, but the licensing URL
+ * extra is still extracted in cases where the app is unlicensed.
*
* @param response the result from validating the server response
* @param rawData the raw server response data
*/
- public void processServerResponse(int response, ResponseData rawData) {
- mLastResponse = response;
- }
+ public void processServerResponse(int response, ResponseData rawData) {
+ mLastResponse = response;
+
+ if (response == Policy.NOT_LICENSED) {
+ Map<String, String> extras = decodeExtras(rawData);
+ mLicensingUrl = extras.get("LU");
+ }
+ }
- /**
+ /**
* {@inheritDoc}
*
* This implementation allows access if and only if a LICENSED response
* was received the last time the server was contacted.
*/
- public boolean allowAccess() {
- return (mLastResponse == Policy.LICENSED);
- }
+ public boolean allowAccess() {
+ return (mLastResponse == Policy.LICENSED);
+ }
+
+ public String getLicensingUrl() {
+ return mLicensingUrl;
+ }
+
+ private Map<String, String> decodeExtras(
+ com.google.android.vending.licensing.ResponseData rawData) {
+ Map<String, String> results = new HashMap<String, String>();
+ if (rawData == null) {
+ return results;
+ }
+ try {
+ URI rawExtras = new URI("?" + rawData.extra);
+ URIQueryDecoder.DecodeQuery(rawExtras, results);
+ } catch (URISyntaxException e) {
+ Log.w(TAG, "Invalid syntax error while decoding extras data from server.");
+ }
+ return results;
+ }
}
diff --git a/platform/android/java/src/com/android/vending/licensing/ValidationException.java b/platform/android/java/src/com/google/android/vending/licensing/ValidationException.java
index ee4df47c68..79b70e6804 100644
--- a/platform/android/java/src/com/android/vending/licensing/ValidationException.java
+++ b/platform/android/java/src/com/google/android/vending/licensing/ValidationException.java
@@ -21,13 +21,13 @@ package com.google.android.vending.licensing;
* {@link Obfuscator}.}
*/
public class ValidationException extends Exception {
- public ValidationException() {
- super();
- }
+ public ValidationException() {
+ super();
+ }
- public ValidationException(String s) {
- super(s);
- }
+ public ValidationException(String s) {
+ super(s);
+ }
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/util/Base64.java b/platform/android/java/src/com/google/android/vending/licensing/util/Base64.java
new file mode 100644
index 0000000000..bd711aadf5
--- /dev/null
+++ b/platform/android/java/src/com/google/android/vending/licensing/util/Base64.java
@@ -0,0 +1,556 @@
+// Portions copyright 2002, Google, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.android.vending.licensing.util;
+
+// This code was converted from code at http://iharder.sourceforge.net/base64/
+// Lots of extraneous features were removed.
+/* The original code said:
+ * <p>
+ * I am placing this code in the Public Domain. Do with it as you will.
+ * This software comes with no guarantees or warranties but with
+ * plenty of well-wishing instead!
+ * Please visit
+ * <a href="http://iharder.net/xmlizable">http://iharder.net/xmlizable</a>
+ * periodically to check for updates or to contribute improvements.
+ * </p>
+ *
+ * @author Robert Harder
+ * @author rharder@usa.net
+ * @version 1.3
+ */
+
+import com.godot.game.BuildConfig;
+
+/**
+ * Base64 converter class. This code is not a full-blown MIME encoder;
+ * it simply converts binary data to base64 data and back.
+ *
+ * <p>Note {@link CharBase64} is a GWT-compatible implementation of this
+ * class.
+ */
+public class Base64 {
+ /** Specify encoding (value is {@code true}). */
+ public final static boolean ENCODE = true;
+
+ /** Specify decoding (value is {@code false}). */
+ public final static boolean DECODE = false;
+
+ /** The equals sign (=) as a byte. */
+ private final static byte EQUALS_SIGN = (byte)'=';
+
+ /** The new line character (\n) as a byte. */
+ private final static byte NEW_LINE = (byte)'\n';
+
+ /**
+ * The 64 valid Base64 values.
+ */
+ private final static byte[] ALPHABET = { (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F',
+ (byte)'G', (byte)'H', (byte)'I', (byte)'J', (byte)'K',
+ (byte)'L', (byte)'M', (byte)'N', (byte)'O', (byte)'P',
+ (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U',
+ (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z',
+ (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e',
+ (byte)'f', (byte)'g', (byte)'h', (byte)'i', (byte)'j',
+ (byte)'k', (byte)'l', (byte)'m', (byte)'n', (byte)'o',
+ (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t',
+ (byte)'u', (byte)'v', (byte)'w', (byte)'x', (byte)'y',
+ (byte)'z', (byte)'0', (byte)'1', (byte)'2', (byte)'3',
+ (byte)'4', (byte)'5', (byte)'6', (byte)'7', (byte)'8',
+ (byte)'9', (byte)'+', (byte)'/' };
+
+ /**
+ * The 64 valid web safe Base64 values.
+ */
+ private final static byte[] WEBSAFE_ALPHABET = { (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F',
+ (byte)'G', (byte)'H', (byte)'I', (byte)'J', (byte)'K',
+ (byte)'L', (byte)'M', (byte)'N', (byte)'O', (byte)'P',
+ (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U',
+ (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z',
+ (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e',
+ (byte)'f', (byte)'g', (byte)'h', (byte)'i', (byte)'j',
+ (byte)'k', (byte)'l', (byte)'m', (byte)'n', (byte)'o',
+ (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t',
+ (byte)'u', (byte)'v', (byte)'w', (byte)'x', (byte)'y',
+ (byte)'z', (byte)'0', (byte)'1', (byte)'2', (byte)'3',
+ (byte)'4', (byte)'5', (byte)'6', (byte)'7', (byte)'8',
+ (byte)'9', (byte)'-', (byte)'_' };
+
+ /**
+ * Translates a Base64 value to either its 6-bit reconstruction value
+ * or a negative number indicating some other meaning.
+ **/
+ private final static byte[] DECODABET = {
+ -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 0 - 8
+ -5, -5, // Whitespace: Tab and Linefeed
+ -9, -9, // Decimal 11 - 12
+ -5, // Whitespace: Carriage Return
+ -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 14 - 26
+ -9, -9, -9, -9, -9, // Decimal 27 - 31
+ -5, // Whitespace: Space
+ -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 33 - 42
+ 62, // Plus sign at decimal 43
+ -9, -9, -9, // Decimal 44 - 46
+ 63, // Slash at decimal 47
+ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // Numbers zero through nine
+ -9, -9, -9, // Decimal 58 - 60
+ -1, // Equals sign at decimal 61
+ -9, -9, -9, // Decimal 62 - 64
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, // Letters 'A' through 'N'
+ 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // Letters 'O' through 'Z'
+ -9, -9, -9, -9, -9, -9, // Decimal 91 - 96
+ 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, // Letters 'a' through 'm'
+ 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // Letters 'n' through 'z'
+ -9, -9, -9, -9, -9 // Decimal 123 - 127
+ /* ,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 128 - 139
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 */
+ };
+
+ /** The web safe decodabet */
+ private final static byte[] WEBSAFE_DECODABET = {
+ -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 0 - 8
+ -5, -5, // Whitespace: Tab and Linefeed
+ -9, -9, // Decimal 11 - 12
+ -5, // Whitespace: Carriage Return
+ -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 14 - 26
+ -9, -9, -9, -9, -9, // Decimal 27 - 31
+ -5, // Whitespace: Space
+ -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 33 - 44
+ 62, // Dash '-' sign at decimal 45
+ -9, -9, // Decimal 46-47
+ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // Numbers zero through nine
+ -9, -9, -9, // Decimal 58 - 60
+ -1, // Equals sign at decimal 61
+ -9, -9, -9, // Decimal 62 - 64
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, // Letters 'A' through 'N'
+ 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // Letters 'O' through 'Z'
+ -9, -9, -9, -9, // Decimal 91-94
+ 63, // Underscore '_' at decimal 95
+ -9, // Decimal 96
+ 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, // Letters 'a' through 'm'
+ 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // Letters 'n' through 'z'
+ -9, -9, -9, -9, -9 // Decimal 123 - 127
+ /* ,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 128 - 139
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 */
+ };
+
+ // Indicates white space in encoding
+ private final static byte WHITE_SPACE_ENC = -5;
+ // Indicates equals sign in encoding
+ private final static byte EQUALS_SIGN_ENC = -1;
+
+ /** Defeats instantiation. */
+ private Base64() {
+ }
+
+ /* ******** E N C O D I N G M E T H O D S ******** */
+
+ /**
+ * Encodes up to three bytes of the array <var>source</var>
+ * and writes the resulting four Base64 bytes to <var>destination</var>.
+ * The source and destination arrays can be manipulated
+ * anywhere along their length by specifying
+ * <var>srcOffset</var> and <var>destOffset</var>.
+ * This method does not check to make sure your arrays
+ * are large enough to accommodate <var>srcOffset</var> + 3 for
+ * the <var>source</var> array or <var>destOffset</var> + 4 for
+ * the <var>destination</var> array.
+ * The actual number of significant bytes in your array is
+ * given by <var>numSigBytes</var>.
+ *
+ * @param source the array to convert
+ * @param srcOffset the index where conversion begins
+ * @param numSigBytes the number of significant bytes in your array
+ * @param destination the array to hold the conversion
+ * @param destOffset the index where output will be put
+ * @param alphabet is the encoding alphabet
+ * @return the <var>destination</var> array
+ * @since 1.3
+ */
+ private static byte[] encode3to4(byte[] source, int srcOffset,
+ int numSigBytes, byte[] destination, int destOffset, byte[] alphabet) {
+ // 1 2 3
+ // 01234567890123456789012345678901 Bit position
+ // --------000000001111111122222222 Array position from threeBytes
+ // --------| || || || | Six bit groups to index alphabet
+ // >>18 >>12 >> 6 >> 0 Right shift necessary
+ // 0x3f 0x3f 0x3f Additional AND
+
+ // Create buffer with zero-padding if there are only one or two
+ // significant bytes passed in the array.
+ // We have to shift left 24 in order to flush out the 1's that appear
+ // when Java treats a value as negative that is cast from a byte to an int.
+ int inBuff =
+ (numSigBytes > 0 ? ((source[srcOffset] << 24) >>> 8) : 0) | (numSigBytes > 1 ? ((source[srcOffset + 1] << 24) >>> 16) : 0) | (numSigBytes > 2 ? ((source[srcOffset + 2] << 24) >>> 24) : 0);
+
+ switch (numSigBytes) {
+ case 3:
+ destination[destOffset] = alphabet[(inBuff >>> 18)];
+ destination[destOffset + 1] = alphabet[(inBuff >>> 12) & 0x3f];
+ destination[destOffset + 2] = alphabet[(inBuff >>> 6) & 0x3f];
+ destination[destOffset + 3] = alphabet[(inBuff)&0x3f];
+ return destination;
+ case 2:
+ destination[destOffset] = alphabet[(inBuff >>> 18)];
+ destination[destOffset + 1] = alphabet[(inBuff >>> 12) & 0x3f];
+ destination[destOffset + 2] = alphabet[(inBuff >>> 6) & 0x3f];
+ destination[destOffset + 3] = EQUALS_SIGN;
+ return destination;
+ case 1:
+ destination[destOffset] = alphabet[(inBuff >>> 18)];
+ destination[destOffset + 1] = alphabet[(inBuff >>> 12) & 0x3f];
+ destination[destOffset + 2] = EQUALS_SIGN;
+ destination[destOffset + 3] = EQUALS_SIGN;
+ return destination;
+ default:
+ return destination;
+ } // end switch
+ } // end encode3to4
+
+ /**
+ * Encodes a byte array into Base64 notation.
+ * Equivalent to calling
+ * {@code encodeBytes(source, 0, source.length)}
+ *
+ * @param source The data to convert
+ * @since 1.4
+ */
+ public static String encode(byte[] source) {
+ return encode(source, 0, source.length, ALPHABET, true);
+ }
+
+ /**
+ * Encodes a byte array into web safe Base64 notation.
+ *
+ * @param source The data to convert
+ * @param doPadding is {@code true} to pad result with '=' chars
+ * if it does not fall on 3 byte boundaries
+ */
+ public static String encodeWebSafe(byte[] source, boolean doPadding) {
+ return encode(source, 0, source.length, WEBSAFE_ALPHABET, doPadding);
+ }
+
+ /**
+ * Encodes a byte array into Base64 notation.
+ *
+ * @param source The data to convert
+ * @param off Offset in array where conversion should begin
+ * @param len Length of data to convert
+ * @param alphabet is the encoding alphabet
+ * @param doPadding is {@code true} to pad result with '=' chars
+ * if it does not fall on 3 byte boundaries
+ * @since 1.4
+ */
+ public static String encode(byte[] source, int off, int len, byte[] alphabet,
+ boolean doPadding) {
+ byte[] outBuff = encode(source, off, len, alphabet, Integer.MAX_VALUE);
+ int outLen = outBuff.length;
+
+ // If doPadding is false, set length to truncate '='
+ // padding characters
+ while (doPadding == false && outLen > 0) {
+ if (outBuff[outLen - 1] != '=') {
+ break;
+ }
+ outLen -= 1;
+ }
+
+ return new String(outBuff, 0, outLen);
+ }
+
+ /**
+ * Encodes a byte array into Base64 notation.
+ *
+ * @param source The data to convert
+ * @param off Offset in array where conversion should begin
+ * @param len Length of data to convert
+ * @param alphabet is the encoding alphabet
+ * @param maxLineLength maximum length of one line.
+ * @return the BASE64-encoded byte array
+ */
+ public static byte[] encode(byte[] source, int off, int len, byte[] alphabet,
+ int maxLineLength) {
+ int lenDiv3 = (len + 2) / 3; // ceil(len / 3)
+ int len43 = lenDiv3 * 4;
+ byte[] outBuff = new byte[len43 // Main 4:3
+ + (len43 / maxLineLength)]; // New lines
+
+ int d = 0;
+ int e = 0;
+ int len2 = len - 2;
+ int lineLength = 0;
+ for (; d < len2; d += 3, e += 4) {
+
+ // The following block of code is the same as
+ // encode3to4( source, d + off, 3, outBuff, e, alphabet );
+ // but inlined for faster encoding (~20% improvement)
+ int inBuff =
+ ((source[d + off] << 24) >>> 8) | ((source[d + 1 + off] << 24) >>> 16) | ((source[d + 2 + off] << 24) >>> 24);
+ outBuff[e] = alphabet[(inBuff >>> 18)];
+ outBuff[e + 1] = alphabet[(inBuff >>> 12) & 0x3f];
+ outBuff[e + 2] = alphabet[(inBuff >>> 6) & 0x3f];
+ outBuff[e + 3] = alphabet[(inBuff)&0x3f];
+
+ lineLength += 4;
+ if (lineLength == maxLineLength) {
+ outBuff[e + 4] = NEW_LINE;
+ e++;
+ lineLength = 0;
+ } // end if: end of line
+ } // end for: each piece of array
+
+ if (d < len) {
+ encode3to4(source, d + off, len - d, outBuff, e, alphabet);
+
+ lineLength += 4;
+ if (lineLength == maxLineLength) {
+ // Add a last newline
+ outBuff[e + 4] = NEW_LINE;
+ e++;
+ }
+ e += 4;
+ }
+
+ if (BuildConfig.DEBUG && e != outBuff.length)
+ throw new RuntimeException();
+ return outBuff;
+ }
+
+ /* ******** D E C O D I N G M E T H O D S ******** */
+
+ /**
+ * Decodes four bytes from array <var>source</var>
+ * and writes the resulting bytes (up to three of them)
+ * to <var>destination</var>.
+ * The source and destination arrays can be manipulated
+ * anywhere along their length by specifying
+ * <var>srcOffset</var> and <var>destOffset</var>.
+ * This method does not check to make sure your arrays
+ * are large enough to accommodate <var>srcOffset</var> + 4 for
+ * the <var>source</var> array or <var>destOffset</var> + 3 for
+ * the <var>destination</var> array.
+ * This method returns the actual number of bytes that
+ * were converted from the Base64 encoding.
+ *
+ *
+ * @param source the array to convert
+ * @param srcOffset the index where conversion begins
+ * @param destination the array to hold the conversion
+ * @param destOffset the index where output will be put
+ * @param decodabet the decodabet for decoding Base64 content
+ * @return the number of decoded bytes converted
+ * @since 1.3
+ */
+ private static int decode4to3(byte[] source, int srcOffset,
+ byte[] destination, int destOffset, byte[] decodabet) {
+ // Example: Dk==
+ if (source[srcOffset + 2] == EQUALS_SIGN) {
+ int outBuff =
+ ((decodabet[source[srcOffset]] << 24) >>> 6) | ((decodabet[source[srcOffset + 1]] << 24) >>> 12);
+
+ destination[destOffset] = (byte)(outBuff >>> 16);
+ return 1;
+ } else if (source[srcOffset + 3] == EQUALS_SIGN) {
+ // Example: DkL=
+ int outBuff =
+ ((decodabet[source[srcOffset]] << 24) >>> 6) | ((decodabet[source[srcOffset + 1]] << 24) >>> 12) | ((decodabet[source[srcOffset + 2]] << 24) >>> 18);
+
+ destination[destOffset] = (byte)(outBuff >>> 16);
+ destination[destOffset + 1] = (byte)(outBuff >>> 8);
+ return 2;
+ } else {
+ // Example: DkLE
+ int outBuff =
+ ((decodabet[source[srcOffset]] << 24) >>> 6) | ((decodabet[source[srcOffset + 1]] << 24) >>> 12) | ((decodabet[source[srcOffset + 2]] << 24) >>> 18) | ((decodabet[source[srcOffset + 3]] << 24) >>> 24);
+
+ destination[destOffset] = (byte)(outBuff >> 16);
+ destination[destOffset + 1] = (byte)(outBuff >> 8);
+ destination[destOffset + 2] = (byte)(outBuff);
+ return 3;
+ }
+ } // end decodeToBytes
+
+ /**
+ * Decodes data from Base64 notation.
+ *
+ * @param s the string to decode (decoded in default encoding)
+ * @return the decoded data
+ * @since 1.4
+ */
+ public static byte[] decode(String s) throws Base64DecoderException {
+ byte[] bytes = s.getBytes();
+ return decode(bytes, 0, bytes.length);
+ }
+
+ /**
+ * Decodes data from web safe Base64 notation.
+ * Web safe encoding uses '-' instead of '+', '_' instead of '/'
+ *
+ * @param s the string to decode (decoded in default encoding)
+ * @return the decoded data
+ */
+ public static byte[] decodeWebSafe(String s) throws Base64DecoderException {
+ byte[] bytes = s.getBytes();
+ return decodeWebSafe(bytes, 0, bytes.length);
+ }
+
+ /**
+ * Decodes Base64 content in byte array format and returns
+ * the decoded byte array.
+ *
+ * @param source The Base64 encoded data
+ * @return decoded data
+ * @since 1.3
+ * @throws Base64DecoderException
+ */
+ public static byte[] decode(byte[] source) throws Base64DecoderException {
+ return decode(source, 0, source.length);
+ }
+
+ /**
+ * Decodes web safe Base64 content in byte array format and returns
+ * the decoded data.
+ * Web safe encoding uses '-' instead of '+', '_' instead of '/'
+ *
+ * @param source the string to decode (decoded in default encoding)
+ * @return the decoded data
+ */
+ public static byte[] decodeWebSafe(byte[] source)
+ throws Base64DecoderException {
+ return decodeWebSafe(source, 0, source.length);
+ }
+
+ /**
+ * Decodes Base64 content in byte array format and returns
+ * the decoded byte array.
+ *
+ * @param source The Base64 encoded data
+ * @param off The offset of where to begin decoding
+ * @param len The length of characters to decode
+ * @return decoded data
+ * @since 1.3
+ * @throws Base64DecoderException
+ */
+ public static byte[] decode(byte[] source, int off, int len)
+ throws Base64DecoderException {
+ return decode(source, off, len, DECODABET);
+ }
+
+ /**
+ * Decodes web safe Base64 content in byte array format and returns
+ * the decoded byte array.
+ * Web safe encoding uses '-' instead of '+', '_' instead of '/'
+ *
+ * @param source The Base64 encoded data
+ * @param off The offset of where to begin decoding
+ * @param len The length of characters to decode
+ * @return decoded data
+ */
+ public static byte[] decodeWebSafe(byte[] source, int off, int len)
+ throws Base64DecoderException {
+ return decode(source, off, len, WEBSAFE_DECODABET);
+ }
+
+ /**
+ * Decodes Base64 content using the supplied decodabet and returns
+ * the decoded byte array.
+ *
+ * @param source The Base64 encoded data
+ * @param off The offset of where to begin decoding
+ * @param len The length of characters to decode
+ * @param decodabet the decodabet for decoding Base64 content
+ * @return decoded data
+ */
+ public static byte[] decode(byte[] source, int off, int len, byte[] decodabet)
+ throws Base64DecoderException {
+ int len34 = len * 3 / 4;
+ byte[] outBuff = new byte[2 + len34]; // Upper limit on size of output
+ int outBuffPosn = 0;
+
+ byte[] b4 = new byte[4];
+ int b4Posn = 0;
+ int i = 0;
+ byte sbiCrop = 0;
+ byte sbiDecode = 0;
+ for (i = 0; i < len; i++) {
+ sbiCrop = (byte)(source[i + off] & 0x7f); // Only the low seven bits
+ sbiDecode = decodabet[sbiCrop];
+
+ if (sbiDecode >= WHITE_SPACE_ENC) { // White space Equals sign or better
+ if (sbiDecode >= EQUALS_SIGN_ENC) {
+ // An equals sign (for padding) must not occur at position 0 or 1
+ // and must be the last byte[s] in the encoded value
+ if (sbiCrop == EQUALS_SIGN) {
+ int bytesLeft = len - i;
+ byte lastByte = (byte)(source[len - 1 + off] & 0x7f);
+ if (b4Posn == 0 || b4Posn == 1) {
+ throw new Base64DecoderException(
+ "invalid padding byte '=' at byte offset " + i);
+ } else if ((b4Posn == 3 && bytesLeft > 2) || (b4Posn == 4 && bytesLeft > 1)) {
+ throw new Base64DecoderException(
+ "padding byte '=' falsely signals end of encoded value "
+ + "at offset " + i);
+ } else if (lastByte != EQUALS_SIGN && lastByte != NEW_LINE) {
+ throw new Base64DecoderException(
+ "encoded value has invalid trailing byte");
+ }
+ break;
+ }
+
+ b4[b4Posn++] = sbiCrop;
+ if (b4Posn == 4) {
+ outBuffPosn += decode4to3(b4, 0, outBuff, outBuffPosn, decodabet);
+ b4Posn = 0;
+ }
+ }
+ } else {
+ throw new Base64DecoderException("Bad Base64 input character at " + i + ": " + source[i + off] + "(decimal)");
+ }
+ }
+
+ // Because web safe encoding allows non padding base64 encodes, we
+ // need to pad the rest of the b4 buffer with equal signs when
+ // b4Posn != 0. There can be at most 2 equal signs at the end of
+ // four characters, so the b4 buffer must have two or three
+ // characters. This also catches the case where the input is
+ // padded with EQUALS_SIGN
+ if (b4Posn != 0) {
+ if (b4Posn == 1) {
+ throw new Base64DecoderException("single trailing character at offset " + (len - 1));
+ }
+ b4[b4Posn++] = EQUALS_SIGN;
+ outBuffPosn += decode4to3(b4, 0, outBuff, outBuffPosn, decodabet);
+ }
+
+ byte[] out = new byte[outBuffPosn];
+ System.arraycopy(outBuff, 0, out, 0, outBuffPosn);
+ return out;
+ }
+}
diff --git a/platform/android/java/src/com/android/vending/licensing/util/Base64DecoderException.java b/platform/android/java/src/com/google/android/vending/licensing/util/Base64DecoderException.java
index 1aef1b54b8..50724a9b05 100644
--- a/platform/android/java/src/com/android/vending/licensing/util/Base64DecoderException.java
+++ b/platform/android/java/src/com/google/android/vending/licensing/util/Base64DecoderException.java
@@ -20,13 +20,13 @@ package com.google.android.vending.licensing.util;
* @author nelson
*/
public class Base64DecoderException extends Exception {
- public Base64DecoderException() {
- super();
- }
+ public Base64DecoderException() {
+ super();
+ }
- public Base64DecoderException(String s) {
- super(s);
- }
+ public Base64DecoderException(String s) {
+ super(s);
+ }
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
}
diff --git a/platform/android/java/src/com/google/android/vending/licensing/util/URIQueryDecoder.java b/platform/android/java/src/com/google/android/vending/licensing/util/URIQueryDecoder.java
new file mode 100644
index 0000000000..4f908b472c
--- /dev/null
+++ b/platform/android/java/src/com/google/android/vending/licensing/util/URIQueryDecoder.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.android.vending.licensing.util;
+
+import android.util.Log;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URLDecoder;
+import java.util.Map;
+import java.util.Scanner;
+
+public class URIQueryDecoder {
+ private static final String TAG = "URIQueryDecoder";
+
+ /**
+ * Decodes the query portion of the passed-in URI.
+ *
+ * @param encodedURI the URI containing the query to decode
+ * @param results a map containing all query parameters. Query parameters that do not have a
+ * value will map to a null string
+ */
+ static public void DecodeQuery(URI encodedURI, Map<String, String> results) {
+ Scanner scanner = new Scanner(encodedURI.getRawQuery());
+ scanner.useDelimiter("&");
+ try {
+ while (scanner.hasNext()) {
+ String param = scanner.next();
+ String[] valuePair = param.split("=");
+ String name, value;
+ if (valuePair.length == 1) {
+ value = null;
+ } else if (valuePair.length == 2) {
+ value = URLDecoder.decode(valuePair[1], "UTF-8");
+ } else {
+ throw new IllegalArgumentException("query parameter invalid");
+ }
+ name = URLDecoder.decode(valuePair[0], "UTF-8");
+ results.put(name, value);
+ }
+ } catch (UnsupportedEncodingException e) {
+ // This should never happen.
+ Log.e(TAG, "UTF-8 Not Recognized as a charset. Device configuration Error.");
+ }
+ }
+}
diff --git a/platform/android/java/src/org/godotengine/godot/Dictionary.java b/platform/android/java/src/org/godotengine/godot/Dictionary.java
index de6b4af568..588d9ae646 100644
--- a/platform/android/java/src/org/godotengine/godot/Dictionary.java
+++ b/platform/android/java/src/org/godotengine/godot/Dictionary.java
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/android/java/src/org/godotengine/godot/Godot.java b/platform/android/java/src/org/godotengine/godot/Godot.java
index 88194f00d1..a10d7876f4 100644
--- a/platform/android/java/src/org/godotengine/godot/Godot.java
+++ b/platform/android/java/src/org/godotengine/godot/Godot.java
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -30,59 +30,48 @@
package org.godotengine.godot;
-import android.R;
+//import android.R;
+
import android.app.Activity;
+import android.app.ActivityManager;
+import android.app.AlertDialog;
+import android.app.PendingIntent;
+import android.content.ClipData;
+import android.content.ClipboardManager;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
import android.content.pm.ConfigurationInfo;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.graphics.Point;
+import android.graphics.Rect;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+import android.os.Build;
import android.os.Bundle;
+import android.os.Environment;
+import android.os.Messenger;
+import android.provider.Settings.Secure;
+import android.util.Log;
+import android.view.Display;
+import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewGroup.LayoutParams;
+import android.view.ViewTreeObserver;
+import android.view.Window;
+import android.view.WindowManager;
import android.widget.Button;
+import android.widget.FrameLayout;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
-import android.widget.LinearLayout;
import android.widget.TextView;
-import android.view.ViewGroup.LayoutParams;
-import android.app.*;
-import android.content.*;
-import android.content.SharedPreferences.Editor;
-import android.view.*;
-import android.view.inputmethod.InputMethodManager;
-import android.os.*;
-import android.util.Log;
-import android.graphics.*;
-import android.text.method.*;
-import android.text.*;
-import android.media.*;
-import android.hardware.*;
-import android.content.*;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.net.Uri;
-import android.media.MediaPlayer;
-
-import android.content.ClipboardManager;
-import android.content.ClipData;
-
-import java.lang.reflect.Method;
-import java.util.List;
-import java.util.ArrayList;
-
-import org.godotengine.godot.payments.PaymentsManager;
-
-import java.io.IOException;
-
-import android.provider.Settings.Secure;
-import android.widget.FrameLayout;
-
-import org.godotengine.godot.input.*;
-
-import java.io.InputStream;
-import javax.microedition.khronos.opengles.GL10;
-import java.security.MessageDigest;
-import java.io.File;
-import java.io.FileInputStream;
-import java.util.LinkedList;
-import com.google.android.vending.expansion.downloader.Constants;
import com.google.android.vending.expansion.downloader.DownloadProgressInfo;
import com.google.android.vending.expansion.downloader.DownloaderClientMarshaller;
import com.google.android.vending.expansion.downloader.DownloaderServiceMarshaller;
@@ -91,9 +80,20 @@ import com.google.android.vending.expansion.downloader.IDownloaderClient;
import com.google.android.vending.expansion.downloader.IDownloaderService;
import com.google.android.vending.expansion.downloader.IStub;
-import android.os.Bundle;
-import android.os.Messenger;
-import android.os.SystemClock;
+import org.godotengine.godot.input.GodotEditText;
+import org.godotengine.godot.payments.PaymentsManager;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.lang.reflect.Method;
+import java.security.MessageDigest;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Locale;
+
+import javax.microedition.khronos.opengles.GL10;
public class Godot extends Activity implements SensorEventListener, IDownloaderClient {
@@ -119,7 +119,6 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
private boolean use_debug_opengl = false;
private boolean mStatePaused;
private int mState;
- private boolean keep_screen_on = true;
static private Intent mCurrentIntent;
@@ -222,9 +221,8 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
private Sensor mGyroscope;
public FrameLayout layout;
- public RelativeLayout adLayout;
- static public GodotIO io;
+ public static GodotIO io;
public static void setWindowTitle(String title) {
//setTitle(title);
@@ -263,24 +261,23 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
};
public void onVideoInit() {
-
boolean use_gl3 = getGLESVersionCode() >= 0x00030000;
//mView = new GodotView(getApplication(),io,use_gl3);
//setContentView(mView);
layout = new FrameLayout(this);
- layout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
+ layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
setContentView(layout);
// GodotEditText layout
GodotEditText edittext = new GodotEditText(this);
- edittext.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
+ edittext.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
// ...add to FrameLayout
layout.addView(edittext);
mView = new GodotView(getApplication(), io, use_gl3, use_32_bits, use_debug_opengl, this);
- layout.addView(mView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
+ layout.addView(mView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
edittext.setView(mView);
io.setEdit(edittext);
@@ -298,44 +295,35 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
}
});
- // Ad layout
- adLayout = new RelativeLayout(this);
- adLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
- layout.addView(adLayout);
-
final String[] current_command_line = command_line;
- final GodotView view = mView;
mView.queueEvent(new Runnable() {
@Override
public void run() {
GodotLib.setup(current_command_line);
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- view.setKeepScreenOn("True".equals(GodotLib.getGlobal("display/window/energy_saving/keep_screen_on")));
- }
- });
+ setKeepScreenOn("True".equals(GodotLib.getGlobal("display/window/energy_saving/keep_screen_on")));
}
});
}
public void setKeepScreenOn(final boolean p_enabled) {
- keep_screen_on = p_enabled;
- if (mView != null) {
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- mView.setKeepScreenOn(p_enabled);
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (p_enabled) {
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ } else {
+ getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
- });
- }
+ }
+ });
}
public void alert(final String message, final String title) {
+ final Activity activity = this;
runOnUiThread(new Runnable() {
@Override
public void run() {
- AlertDialog.Builder builder = new AlertDialog.Builder(getInstance());
+ AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setMessage(message).setTitle(title);
builder.setPositiveButton(
"OK",
@@ -350,14 +338,8 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
});
}
- private static Godot _self;
-
- public static Godot getInstance() {
- return Godot._self;
- }
-
public int getGLESVersionCode() {
- ActivityManager am = (ActivityManager)Godot.getInstance().getSystemService(Context.ACTIVITY_SERVICE);
+ ActivityManager am = (ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE);
ConfigurationInfo deviceInfo = am.getDeviceConfigurationInfo();
return deviceInfo.reqGlEsVersion;
}
@@ -421,7 +403,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
}
io = new GodotIO(this);
- io.unique_id = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
+ io.unique_id = Secure.ANDROID_ID;
GodotLib.io = io;
mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
@@ -452,7 +434,6 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
- _self = this;
Window window = getWindow();
//window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
@@ -476,7 +457,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
use_debug_opengl = true;
} else if (command_line[i].equals("--use_immersive")) {
use_immersive = true;
- if (Build.VERSION.SDK_INT >= 19.0) { // check if the application runs on an android 4.4+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { // check if the application runs on an android 4.4+
window.getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
@@ -498,7 +479,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
Editor editor = prefs.edit();
editor.putString("store_public_key", main_pack_key);
- editor.commit();
+ editor.apply();
i++;
} else if (command_line[i].trim().length() != 0) {
new_args.add(command_line[i]);
@@ -665,7 +646,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
mSensorManager.registerListener(this, mMagnetometer, SensorManager.SENSOR_DELAY_GAME);
mSensorManager.registerListener(this, mGyroscope, SensorManager.SENSOR_DELAY_GAME);
- if (use_immersive && Build.VERSION.SDK_INT >= 19.0) { // check if the application runs on an android 4.4+
+ if (use_immersive && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { // check if the application runs on an android 4.4+
Window window = getWindow();
window.getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
@@ -688,13 +669,15 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
@Override
public void onSystemUiVisibilityChange(int visibility) {
if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
- decorView.setSystemUiVisibility(
- View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
- View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
- View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
- View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
- View.SYSTEM_UI_FLAG_FULLSCREEN |
- View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ decorView.setSystemUiVisibility(
+ View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
+ View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
+ View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
+ View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
+ View.SYSTEM_UI_FLAG_FULLSCREEN |
+ View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
+ }
}
}
});
@@ -1024,12 +1007,9 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
mTimeRemaining.setText(getString(com.godot.game.R.string.time_remaining,
Helpers.getTimeRemaining(progress.mTimeRemaining)));
- progress.mOverallTotal = progress.mOverallTotal;
mPB.setMax((int)(progress.mOverallTotal >> 8));
mPB.setProgress((int)(progress.mOverallProgress >> 8));
- mProgressPercent.setText(Long.toString(progress.mOverallProgress * 100 /
- progress.mOverallTotal) +
- "%");
+ mProgressPercent.setText(String.format(Locale.ENGLISH, "%d %%", progress.mOverallProgress * 100 / progress.mOverallTotal));
mProgressFraction.setText(Helpers.getDownloadProgressString(progress.mOverallProgress,
progress.mOverallTotal));
}
diff --git a/platform/android/java/src/org/godotengine/godot/GodotDownloaderAlarmReceiver.java b/platform/android/java/src/org/godotengine/godot/GodotDownloaderAlarmReceiver.java
index 4701bac9df..fb7477c09c 100644
--- a/platform/android/java/src/org/godotengine/godot/GodotDownloaderAlarmReceiver.java
+++ b/platform/android/java/src/org/godotengine/godot/GodotDownloaderAlarmReceiver.java
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/android/java/src/org/godotengine/godot/GodotDownloaderService.java b/platform/android/java/src/org/godotengine/godot/GodotDownloaderService.java
index 3a94354843..91a7b99c36 100644
--- a/platform/android/java/src/org/godotengine/godot/GodotDownloaderService.java
+++ b/platform/android/java/src/org/godotengine/godot/GodotDownloaderService.java
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/android/java/src/org/godotengine/godot/GodotIO.java b/platform/android/java/src/org/godotengine/godot/GodotIO.java
index a95c508d21..8cee20e435 100644
--- a/platform/android/java/src/org/godotengine/godot/GodotIO.java
+++ b/platform/android/java/src/org/godotengine/godot/GodotIO.java
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -38,6 +38,7 @@ import java.io.InputStream;
import java.io.IOException;
import android.app.*;
import android.content.*;
+import android.util.SparseArray;
import android.view.*;
import android.view.inputmethod.InputMethodManager;
import android.os.*;
@@ -61,7 +62,6 @@ public class GodotIO {
Godot activity;
GodotEditText edit;
- Context applicationContext;
MediaPlayer mediaPlayer;
final int SCREEN_LANDSCAPE = 0;
@@ -87,7 +87,7 @@ public class GodotIO {
public int pos;
}
- HashMap<Integer, AssetData> streams;
+ SparseArray<AssetData> streams;
public int file_open(String path, boolean write) {
@@ -125,7 +125,7 @@ public class GodotIO {
}
public int file_get_size(int id) {
- if (!streams.containsKey(id)) {
+ if (streams.get(id) == null) {
System.out.printf("file_get_size: Invalid file id: %d\n", id);
return -1;
}
@@ -134,7 +134,7 @@ public class GodotIO {
}
public void file_seek(int id, int bytes) {
- if (!streams.containsKey(id)) {
+ if (streams.get(id) == null) {
System.out.printf("file_get_size: Invalid file id: %d\n", id);
return;
}
@@ -174,7 +174,7 @@ public class GodotIO {
public int file_tell(int id) {
- if (!streams.containsKey(id)) {
+ if (streams.get(id) == null) {
System.out.printf("file_read: Can't tell eof for invalid file id: %d\n", id);
return 0;
}
@@ -184,7 +184,7 @@ public class GodotIO {
}
public boolean file_eof(int id) {
- if (!streams.containsKey(id)) {
+ if (streams.get(id) == null) {
System.out.printf("file_read: Can't check eof for invalid file id: %d\n", id);
return false;
}
@@ -195,7 +195,7 @@ public class GodotIO {
public byte[] file_read(int id, int bytes) {
- if (!streams.containsKey(id)) {
+ if (streams.get(id) == null) {
System.out.printf("file_read: Can't read invalid file id: %d\n", id);
return new byte[0];
}
@@ -243,7 +243,7 @@ public class GodotIO {
public void file_close(int id) {
- if (!streams.containsKey(id)) {
+ if (streams.get(id) == null) {
System.out.printf("file_close: Can't close invalid file id: %d\n", id);
return;
}
@@ -264,7 +264,7 @@ public class GodotIO {
public int last_dir_id = 1;
- HashMap<Integer, AssetDir> dirs;
+ SparseArray<AssetDir> dirs;
public int dir_open(String path) {
@@ -293,7 +293,7 @@ public class GodotIO {
}
public boolean dir_is_dir(int id) {
- if (!dirs.containsKey(id)) {
+ if (dirs.get(id) == null) {
System.out.printf("dir_next: invalid dir id: %d\n", id);
return false;
}
@@ -320,7 +320,7 @@ public class GodotIO {
public String dir_next(int id) {
- if (!dirs.containsKey(id)) {
+ if (dirs.get(id) == null) {
System.out.printf("dir_next: invalid dir id: %d\n", id);
return "";
}
@@ -339,7 +339,7 @@ public class GodotIO {
public void dir_close(int id) {
- if (!dirs.containsKey(id)) {
+ if (dirs.get(id) == null) {
System.out.printf("dir_close: invalid dir id: %d\n", id);
return;
}
@@ -351,9 +351,9 @@ public class GodotIO {
am = p_activity.getAssets();
activity = p_activity;
- streams = new HashMap<Integer, AssetData>();
- dirs = new HashMap<Integer, AssetDir>();
- applicationContext = activity.getApplicationContext();
+ //streams = new HashMap<Integer, AssetData>();
+ streams = new SparseArray<AssetData>();
+ dirs = new SparseArray<AssetDir>();
}
/////////////////////////
@@ -365,7 +365,7 @@ public class GodotIO {
private AudioTrack mAudioTrack;
public Object audioInit(int sampleRate, int desiredFrames) {
- int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_STEREO;
+ int channelConfig = AudioFormat.CHANNEL_OUT_STEREO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
int frameSize = 4;
@@ -496,13 +496,13 @@ public class GodotIO {
}
public int getScreenDPI() {
- DisplayMetrics metrics = applicationContext.getResources().getDisplayMetrics();
+ DisplayMetrics metrics = activity.getApplicationContext().getResources().getDisplayMetrics();
return (int)(metrics.density * 160f);
}
public boolean needsReloadHooks() {
- return android.os.Build.VERSION.SDK_INT < 11;
+ return false;
}
public void showKeyboard(String p_existing_text) {
@@ -564,7 +564,7 @@ public class GodotIO {
try {
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
- mediaPlayer.setDataSource(applicationContext, filePath);
+ mediaPlayer.setDataSource(activity.getApplicationContext(), filePath);
mediaPlayer.prepare();
mediaPlayer.start();
} catch (IOException e) {
diff --git a/platform/android/java/src/org/godotengine/godot/GodotLib.java b/platform/android/java/src/org/godotengine/godot/GodotLib.java
index 45eb188327..29e7918645 100644
--- a/platform/android/java/src/org/godotengine/godot/GodotLib.java
+++ b/platform/android/java/src/org/godotengine/godot/GodotLib.java
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/android/java/src/org/godotengine/godot/GodotPaymentV3.java b/platform/android/java/src/org/godotengine/godot/GodotPaymentV3.java
index bde4221644..c3d81c5c1d 100644
--- a/platform/android/java/src/org/godotengine/godot/GodotPaymentV3.java
+++ b/platform/android/java/src/org/godotengine/godot/GodotPaymentV3.java
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/android/java/src/org/godotengine/godot/GodotView.java b/platform/android/java/src/org/godotengine/godot/GodotView.java
index 4cb4db33de..ba8e8bd07b 100644
--- a/platform/android/java/src/org/godotengine/godot/GodotView.java
+++ b/platform/android/java/src/org/godotengine/godot/GodotView.java
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -29,6 +29,7 @@
/*************************************************************************/
package org.godotengine.godot;
+import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.PixelFormat;
import android.opengl.GLSurfaceView;
@@ -75,9 +76,9 @@ public class GodotView extends GLSurfaceView implements InputDeviceListener {
private static String TAG = "GodotView";
private static final boolean DEBUG = false;
- private static Context ctx;
+ private Context ctx;
- private static GodotIO io;
+ private GodotIO io;
private static boolean firsttime = true;
private static boolean use_gl3 = false;
private static boolean use_32 = false;
@@ -105,20 +106,26 @@ public class GodotView extends GLSurfaceView implements InputDeviceListener {
init(false, 16, 0);
}
+ public GodotView(Context context) {
+ super(context);
+ ctx = context;
+ }
+
public GodotView(Context context, boolean translucent, int depth, int stencil) {
super(context);
init(translucent, depth, stencil);
}
+ @SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
return activity.gotTouchEvent(event);
- };
+ }
public int get_godot_button(int keyCode) {
- int button = 0;
+ int button;
switch (keyCode) {
case KeyEvent.KEYCODE_BUTTON_A: // Android A is SNES B
button = 0;
@@ -178,7 +185,7 @@ public class GodotView extends GLSurfaceView implements InputDeviceListener {
default:
button = keyCode - KeyEvent.KEYCODE_BUTTON_1 + 20;
break;
- };
+ }
return button;
};
@@ -440,6 +447,10 @@ public class GodotView extends GLSurfaceView implements InputDeviceListener {
private static class ContextFactory implements GLSurfaceView.EGLContextFactory {
private static int EGL_CONTEXT_CLIENT_VERSION = 0x3098;
public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig) {
+ String driver_name = GodotLib.getGlobal("rendering/quality/driver/driver_name");
+ if (use_gl3 && !driver_name.equals("GLES3")) {
+ use_gl3 = false;
+ }
if (use_gl3)
Log.w(TAG, "creating OpenGL ES 3.0 context :");
else
@@ -508,26 +519,24 @@ public class GodotView extends GLSurfaceView implements InputDeviceListener {
* perform actual matching in chooseConfig() below.
*/
private static int EGL_OPENGL_ES2_BIT = 4;
- private static int[] s_configAttribs2 =
- {
- EGL10.EGL_RED_SIZE, 4,
- EGL10.EGL_GREEN_SIZE, 4,
- EGL10.EGL_BLUE_SIZE, 4,
- // EGL10.EGL_DEPTH_SIZE, 16,
- // EGL10.EGL_STENCIL_SIZE, EGL10.EGL_DONT_CARE,
- EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
- EGL10.EGL_NONE
- };
- private static int[] s_configAttribs3 =
- {
- EGL10.EGL_RED_SIZE, 4,
- EGL10.EGL_GREEN_SIZE, 4,
- EGL10.EGL_BLUE_SIZE, 4,
- // EGL10.EGL_DEPTH_SIZE, 16,
- // EGL10.EGL_STENCIL_SIZE, EGL10.EGL_DONT_CARE,
- EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, //apparently there is no EGL_OPENGL_ES3_BIT
- EGL10.EGL_NONE
- };
+ private static int[] s_configAttribs2 = {
+ EGL10.EGL_RED_SIZE, 4,
+ EGL10.EGL_GREEN_SIZE, 4,
+ EGL10.EGL_BLUE_SIZE, 4,
+ // EGL10.EGL_DEPTH_SIZE, 16,
+ // EGL10.EGL_STENCIL_SIZE, EGL10.EGL_DONT_CARE,
+ EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
+ EGL10.EGL_NONE
+ };
+ private static int[] s_configAttribs3 = {
+ EGL10.EGL_RED_SIZE, 4,
+ EGL10.EGL_GREEN_SIZE, 4,
+ EGL10.EGL_BLUE_SIZE, 4,
+ // EGL10.EGL_DEPTH_SIZE, 16,
+ // EGL10.EGL_STENCIL_SIZE, EGL10.EGL_DONT_CARE,
+ EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, //apparently there is no EGL_OPENGL_ES3_BIT
+ EGL10.EGL_NONE
+ };
public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) {
diff --git a/platform/android/java/src/org/godotengine/godot/input/GodotEditText.java b/platform/android/java/src/org/godotengine/godot/input/GodotEditText.java
index 53fcf5ef70..44bd462ed0 100644
--- a/platform/android/java/src/org/godotengine/godot/input/GodotEditText.java
+++ b/platform/android/java/src/org/godotengine/godot/input/GodotEditText.java
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -39,6 +39,8 @@ import android.os.Message;
import android.view.inputmethod.InputMethodManager;
import android.view.inputmethod.EditorInfo;
+import java.lang.ref.WeakReference;
+
public class GodotEditText extends EditText {
// ===========================================================
// Constants
@@ -51,9 +53,24 @@ public class GodotEditText extends EditText {
// ===========================================================
private GodotView mView;
private GodotTextInputWrapper mInputWrapper;
- private static Handler sHandler;
+ private EditHandler sHandler = new EditHandler(this);
private String mOriginText;
+ private static class EditHandler extends Handler {
+ private final WeakReference<GodotEditText> mEdit;
+ public EditHandler(GodotEditText edit) {
+ mEdit = new WeakReference<>(edit);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ GodotEditText edit = mEdit.get();
+ if (edit != null) {
+ edit.handleMessage(msg);
+ }
+ }
+ }
+
// ===========================================================
// Constructors
// ===========================================================
@@ -75,36 +92,33 @@ public class GodotEditText extends EditText {
protected void initView() {
this.setPadding(0, 0, 0, 0);
this.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
+ }
- sHandler = new Handler() {
- @Override
- public void handleMessage(final Message msg) {
- switch (msg.what) {
- case HANDLER_OPEN_IME_KEYBOARD: {
- GodotEditText edit = (GodotEditText)msg.obj;
- String text = edit.mOriginText;
- if (edit.requestFocus()) {
- edit.removeTextChangedListener(edit.mInputWrapper);
- edit.setText("");
- edit.append(text);
- edit.mInputWrapper.setOriginText(text);
- edit.addTextChangedListener(edit.mInputWrapper);
- final InputMethodManager imm = (InputMethodManager)mView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
- imm.showSoftInput(edit, 0);
- }
- } break;
-
- case HANDLER_CLOSE_IME_KEYBOARD: {
- GodotEditText edit = (GodotEditText)msg.obj;
-
- edit.removeTextChangedListener(mInputWrapper);
- final InputMethodManager imm = (InputMethodManager)mView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
- imm.hideSoftInputFromWindow(edit.getWindowToken(), 0);
- edit.mView.requestFocus();
- } break;
+ private void handleMessage(final Message msg) {
+ switch (msg.what) {
+ case HANDLER_OPEN_IME_KEYBOARD: {
+ GodotEditText edit = (GodotEditText)msg.obj;
+ String text = edit.mOriginText;
+ if (edit.requestFocus()) {
+ edit.removeTextChangedListener(edit.mInputWrapper);
+ edit.setText("");
+ edit.append(text);
+ edit.mInputWrapper.setOriginText(text);
+ edit.addTextChangedListener(edit.mInputWrapper);
+ final InputMethodManager imm = (InputMethodManager)mView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
+ imm.showSoftInput(edit, 0);
}
- }
- };
+ } break;
+
+ case HANDLER_CLOSE_IME_KEYBOARD: {
+ GodotEditText edit = (GodotEditText)msg.obj;
+
+ edit.removeTextChangedListener(mInputWrapper);
+ final InputMethodManager imm = (InputMethodManager)mView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
+ imm.hideSoftInputFromWindow(edit.getWindowToken(), 0);
+ edit.mView.requestFocus();
+ } break;
+ }
}
// ===========================================================
diff --git a/platform/android/java/src/org/godotengine/godot/input/GodotTextInputWrapper.java b/platform/android/java/src/org/godotengine/godot/input/GodotTextInputWrapper.java
index 5d13f17ffb..d6e7ad5b18 100644
--- a/platform/android/java/src/org/godotengine/godot/input/GodotTextInputWrapper.java
+++ b/platform/android/java/src/org/godotengine/godot/input/GodotTextInputWrapper.java
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/android/java/src/org/godotengine/godot/input/InputManagerCompat.java b/platform/android/java/src/org/godotengine/godot/input/InputManagerCompat.java
index 0a876d2b7f..4042c42e9d 100644
--- a/platform/android/java/src/org/godotengine/godot/input/InputManagerCompat.java
+++ b/platform/android/java/src/org/godotengine/godot/input/InputManagerCompat.java
@@ -17,7 +17,6 @@
package org.godotengine.godot.input;
import android.content.Context;
-import android.os.Build;
import android.os.Handler;
import android.view.InputDevice;
import android.view.MotionEvent;
@@ -130,11 +129,7 @@ public interface InputManagerCompat {
* @return a compatible implementation of InputManager
*/
public static InputManagerCompat getInputManager(Context context) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
- return new InputManagerV16(context);
- } else {
- return new InputManagerV9();
- }
+ return new InputManagerV16(context);
}
}
}
diff --git a/platform/android/java/src/org/godotengine/godot/input/InputManagerV9.java b/platform/android/java/src/org/godotengine/godot/input/InputManagerV9.java
deleted file mode 100644
index a1418c5899..0000000000
--- a/platform/android/java/src/org/godotengine/godot/input/InputManagerV9.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.godotengine.godot.input;
-
-import android.os.Handler;
-import android.os.Message;
-import android.os.SystemClock;
-import android.util.Log;
-import android.util.SparseArray;
-import android.view.InputDevice;
-import android.view.MotionEvent;
-
-import java.lang.ref.WeakReference;
-import java.util.ArrayDeque;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Queue;
-
-public class InputManagerV9 implements InputManagerCompat {
- private static final String LOG_TAG = "InputManagerV9";
- private static final int MESSAGE_TEST_FOR_DISCONNECT = 101;
- private static final long CHECK_ELAPSED_TIME = 3000L;
-
- private static final int ON_DEVICE_ADDED = 0;
- private static final int ON_DEVICE_CHANGED = 1;
- private static final int ON_DEVICE_REMOVED = 2;
-
- private final SparseArray<long[]> mDevices;
- private final Map<InputDeviceListener, Handler> mListeners;
- private final Handler mDefaultHandler;
-
- private static class PollingMessageHandler extends Handler {
- private final WeakReference<InputManagerV9> mInputManager;
-
- PollingMessageHandler(InputManagerV9 im) {
- mInputManager = new WeakReference<InputManagerV9>(im);
- }
-
- @Override
- public void handleMessage(Message msg) {
- super.handleMessage(msg);
- switch (msg.what) {
- case MESSAGE_TEST_FOR_DISCONNECT:
- InputManagerV9 imv = mInputManager.get();
- if (null != imv) {
- long time = SystemClock.elapsedRealtime();
- int size = imv.mDevices.size();
- for (int i = 0; i < size; i++) {
- long[] lastContact = imv.mDevices.valueAt(i);
- if (null != lastContact) {
- if (time - lastContact[0] > CHECK_ELAPSED_TIME) {
- // check to see if the device has been
- // disconnected
- int id = imv.mDevices.keyAt(i);
- if (null == InputDevice.getDevice(id)) {
- // disconnected!
- imv.notifyListeners(ON_DEVICE_REMOVED, id);
- imv.mDevices.remove(id);
- } else {
- lastContact[0] = time;
- }
- }
- }
- }
- sendEmptyMessageDelayed(MESSAGE_TEST_FOR_DISCONNECT,
- CHECK_ELAPSED_TIME);
- }
- break;
- }
- }
- }
-
- public InputManagerV9() {
- mDevices = new SparseArray<long[]>();
- mListeners = new HashMap<InputDeviceListener, Handler>();
- mDefaultHandler = new PollingMessageHandler(this);
- // as a side-effect, populates our collection of watched
- // input devices
- getInputDeviceIds();
- }
-
- @Override
- public InputDevice getInputDevice(int id) {
- return InputDevice.getDevice(id);
- }
-
- @Override
- public int[] getInputDeviceIds() {
- // add any hitherto unknown devices to our
- // collection of watched input devices
- int[] activeDevices = InputDevice.getDeviceIds();
- long time = SystemClock.elapsedRealtime();
- for (int id : activeDevices) {
- long[] lastContact = mDevices.get(id);
- if (null == lastContact) {
- // we have a new device
- mDevices.put(id, new long[] { time });
- }
- }
- return activeDevices;
- }
-
- @Override
- public void registerInputDeviceListener(InputDeviceListener listener, Handler handler) {
- mListeners.remove(listener);
- if (handler == null) {
- handler = mDefaultHandler;
- }
- mListeners.put(listener, handler);
- }
-
- @Override
- public void unregisterInputDeviceListener(InputDeviceListener listener) {
- mListeners.remove(listener);
- }
-
- private void notifyListeners(int why, int deviceId) {
- // the state of some device has changed
- if (!mListeners.isEmpty()) {
- // yes... this will cause an object to get created... hopefully
- // it won't happen very often
- for (InputDeviceListener listener : mListeners.keySet()) {
- Handler handler = mListeners.get(listener);
- DeviceEvent odc = DeviceEvent.getDeviceEvent(why, deviceId, listener);
- handler.post(odc);
- }
- }
- }
-
- private static class DeviceEvent implements Runnable {
- private int mMessageType;
- private int mId;
- private InputDeviceListener mListener;
- private static Queue<DeviceEvent> sEventQueue = new ArrayDeque<DeviceEvent>();
-
- private DeviceEvent() {
- }
-
- static DeviceEvent getDeviceEvent(int messageType, int id,
- InputDeviceListener listener) {
- DeviceEvent curChanged = sEventQueue.poll();
- if (null == curChanged) {
- curChanged = new DeviceEvent();
- }
- curChanged.mMessageType = messageType;
- curChanged.mId = id;
- curChanged.mListener = listener;
- return curChanged;
- }
-
- @Override
- public void run() {
- switch (mMessageType) {
- case ON_DEVICE_ADDED:
- mListener.onInputDeviceAdded(mId);
- break;
- case ON_DEVICE_CHANGED:
- mListener.onInputDeviceChanged(mId);
- break;
- case ON_DEVICE_REMOVED:
- mListener.onInputDeviceRemoved(mId);
- break;
- default:
- Log.e(LOG_TAG, "Unknown Message Type");
- break;
- }
- // dump this runnable back in the queue
- sEventQueue.offer(this);
- }
- }
-
- @Override
- public void onGenericMotionEvent(MotionEvent event) {
- // detect new devices
- int id = event.getDeviceId();
- long[] timeArray = mDevices.get(id);
- if (null == timeArray) {
- notifyListeners(ON_DEVICE_ADDED, id);
- timeArray = new long[1];
- mDevices.put(id, timeArray);
- }
- long time = SystemClock.elapsedRealtime();
- timeArray[0] = time;
- }
-
- @Override
- public void onPause() {
- mDefaultHandler.removeMessages(MESSAGE_TEST_FOR_DISCONNECT);
- }
-
- @Override
- public void onResume() {
- mDefaultHandler.sendEmptyMessage(MESSAGE_TEST_FOR_DISCONNECT);
- }
-}
diff --git a/platform/android/java/src/org/godotengine/godot/payments/ConsumeTask.java b/platform/android/java/src/org/godotengine/godot/payments/ConsumeTask.java
index 5d94e77cd7..1d42aa4464 100644
--- a/platform/android/java/src/org/godotengine/godot/payments/ConsumeTask.java
+++ b/platform/android/java/src/org/godotengine/godot/payments/ConsumeTask.java
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -37,59 +37,81 @@ import android.os.AsyncTask;
import android.os.RemoteException;
import android.util.Log;
+import java.lang.ref.WeakReference;
+
abstract public class ConsumeTask {
private Context context;
-
private IInAppBillingService mService;
+
+ private String mSku;
+ private String mToken;
+
+ private static class ConsumeAsyncTask extends AsyncTask<String, String, String> {
+
+ private WeakReference<ConsumeTask> mTask;
+
+ ConsumeAsyncTask(ConsumeTask consume) {
+ mTask = new WeakReference<>(consume);
+ }
+
+ @Override
+ protected String doInBackground(String... strings) {
+ ConsumeTask consume = mTask.get();
+ if (consume != null) {
+ return consume.doInBackground(strings);
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(String param) {
+ ConsumeTask consume = mTask.get();
+ if (consume != null) {
+ consume.onPostExecute(param);
+ }
+ }
+ }
+
public ConsumeTask(IInAppBillingService mService, Context context) {
this.context = context;
this.mService = mService;
}
public void consume(final String sku) {
- //Log.d("XXX", "Consuming product " + sku);
+ mSku = sku;
PaymentsCache pc = new PaymentsCache(context);
Boolean isBlocked = pc.getConsumableFlag("block", sku);
- String _token = pc.getConsumableValue("token", sku);
- //Log.d("XXX", "token " + _token);
- if (!isBlocked && _token == null) {
- //_token = "inapp:"+context.getPackageName()+":android.test.purchased";
- //Log.d("XXX", "Consuming product " + sku + " with token " + _token);
+ mToken = pc.getConsumableValue("token", sku);
+ if (!isBlocked && mToken == null) {
+ // Consuming task is processing
} else if (!isBlocked) {
- //Log.d("XXX", "It is not blocked ¿?");
return;
- } else if (_token == null) {
- //Log.d("XXX", "No token available");
+ } else if (mToken == null) {
this.error("No token for sku:" + sku);
return;
}
- final String token = _token;
- new AsyncTask<String, String, String>() {
- @Override
- protected String doInBackground(String... params) {
- try {
- //Log.d("XXX", "Requesting to release item.");
- int response = mService.consumePurchase(3, context.getPackageName(), token);
- //Log.d("XXX", "release response code: " + response);
- if (response == 0 || response == 8) {
- return null;
- }
- } catch (RemoteException e) {
- return e.getMessage();
- }
- return "Some error";
- }
+ new ConsumeAsyncTask(this).execute();
+ }
- protected void onPostExecute(String param) {
- if (param == null) {
- success(new PaymentsCache(context).getConsumableValue("ticket", sku));
- } else {
- error(param);
- }
+ private String doInBackground(String... params) {
+ try {
+ int response = mService.consumePurchase(3, context.getPackageName(), mToken);
+ if (response == 0 || response == 8) {
+ return null;
}
+ } catch (RemoteException e) {
+ return e.getMessage();
+ }
+ return "Some error";
+ }
+
+ private void onPostExecute(String param) {
+ if (param == null) {
+ success(new PaymentsCache(context).getConsumableValue("ticket", mSku));
+ } else {
+ error(param);
}
- .execute();
}
abstract protected void success(String ticket);
diff --git a/platform/android/java/src/org/godotengine/godot/payments/GenericConsumeTask.java b/platform/android/java/src/org/godotengine/godot/payments/GenericConsumeTask.java
deleted file mode 100644
index 8b48193ae2..0000000000
--- a/platform/android/java/src/org/godotengine/godot/payments/GenericConsumeTask.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*************************************************************************/
-/* GenericConsumeTask.java */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-package org.godotengine.godot.payments;
-
-import com.android.vending.billing.IInAppBillingService;
-
-import android.content.Context;
-import android.os.AsyncTask;
-import android.os.RemoteException;
-import android.util.Log;
-
-abstract public class GenericConsumeTask extends AsyncTask<String, String, String> {
-
- private Context context;
- private IInAppBillingService mService;
-
- public GenericConsumeTask(Context context, IInAppBillingService mService, String sku, String receipt, String signature, String token) {
- this.context = context;
- this.mService = mService;
- this.sku = sku;
- this.receipt = receipt;
- this.signature = signature;
- this.token = token;
- }
-
- private String sku;
- private String receipt;
- private String signature;
- private String token;
-
- @Override
- protected String doInBackground(String... params) {
- try {
- //Log.d("godot", "Requesting to consume an item with token ." + token);
- int response = mService.consumePurchase(3, context.getPackageName(), token);
- //Log.d("godot", "consumePurchase response: " + response);
- if (response == 0 || response == 8) {
- return null;
- }
- } catch (Exception e) {
- Log.d("godot", "Error " + e.getClass().getName() + ":" + e.getMessage());
- }
- return null;
- }
-
- protected void onPostExecute(String sarasa) {
- onSuccess(sku, receipt, signature, token);
- }
-
- abstract public void onSuccess(String sku, String receipt, String signature, String token);
-}
diff --git a/platform/android/java/src/org/godotengine/godot/payments/HandlePurchaseTask.java b/platform/android/java/src/org/godotengine/godot/payments/HandlePurchaseTask.java
index aaf18c74bf..835779ba00 100644
--- a/platform/android/java/src/org/godotengine/godot/payments/HandlePurchaseTask.java
+++ b/platform/android/java/src/org/godotengine/godot/payments/HandlePurchaseTask.java
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/android/java/src/org/godotengine/godot/payments/PaymentsCache.java b/platform/android/java/src/org/godotengine/godot/payments/PaymentsCache.java
index 40cdeea72e..8a2facbcfb 100644
--- a/platform/android/java/src/org/godotengine/godot/payments/PaymentsCache.java
+++ b/platform/android/java/src/org/godotengine/godot/payments/PaymentsCache.java
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -46,7 +46,7 @@ public class PaymentsCache {
SharedPreferences sharedPref = context.getSharedPreferences("consumables_" + set, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putBoolean(sku, flag);
- editor.commit();
+ editor.apply();
}
public boolean getConsumableFlag(String set, String sku) {
@@ -60,7 +60,7 @@ public class PaymentsCache {
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString(sku, value);
//Log.d("XXX", "Setting asset: consumables_" + set + ":" + sku);
- editor.commit();
+ editor.apply();
}
public String getConsumableValue(String set, String sku) {
diff --git a/platform/android/java/src/org/godotengine/godot/payments/PaymentsManager.java b/platform/android/java/src/org/godotengine/godot/payments/PaymentsManager.java
index d4c7380424..747a4ffd45 100644
--- a/platform/android/java/src/org/godotengine/godot/payments/PaymentsManager.java
+++ b/platform/android/java/src/org/godotengine/godot/payments/PaymentsManager.java
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -112,7 +112,7 @@ public class PaymentsManager {
};
public void requestPurchase(final String sku, String transactionId) {
- new PurchaseTask(mService, Godot.getInstance()) {
+ new PurchaseTask(mService, activity) {
@Override
protected void error(String message) {
godotPaymentV3.callbackFail(message);
@@ -159,7 +159,7 @@ public class PaymentsManager {
public void requestPurchased() {
try {
- PaymentsCache pc = new PaymentsCache(Godot.getInstance());
+ PaymentsCache pc = new PaymentsCache(activity);
String continueToken = null;
diff --git a/platform/android/java/src/org/godotengine/godot/payments/PurchaseTask.java b/platform/android/java/src/org/godotengine/godot/payments/PurchaseTask.java
index e1d9bcee65..000aaa9456 100644
--- a/platform/android/java/src/org/godotengine/godot/payments/PurchaseTask.java
+++ b/platform/android/java/src/org/godotengine/godot/payments/PurchaseTask.java
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/android/java/src/org/godotengine/godot/payments/ReleaseAllConsumablesTask.java b/platform/android/java/src/org/godotengine/godot/payments/ReleaseAllConsumablesTask.java
index eccc6f671b..cf750872d5 100644
--- a/platform/android/java/src/org/godotengine/godot/payments/ReleaseAllConsumablesTask.java
+++ b/platform/android/java/src/org/godotengine/godot/payments/ReleaseAllConsumablesTask.java
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -30,26 +30,59 @@
package org.godotengine.godot.payments;
-import java.util.ArrayList;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import org.godotengine.godot.Dictionary;
-import org.godotengine.godot.Godot;
-import com.android.vending.billing.IInAppBillingService;
-
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
-import android.os.RemoteException;
import android.util.Log;
+import com.android.vending.billing.IInAppBillingService;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+
abstract public class ReleaseAllConsumablesTask {
private Context context;
private IInAppBillingService mService;
+ private static class ReleaseAllConsumablesAsyncTask extends AsyncTask<String, String, String> {
+
+ private WeakReference<ReleaseAllConsumablesTask> mTask;
+ private String mSku;
+ private String mReceipt;
+ private String mSignature;
+ private String mToken;
+
+ ReleaseAllConsumablesAsyncTask(ReleaseAllConsumablesTask task, String sku, String receipt, String signature, String token) {
+ mTask = new WeakReference<ReleaseAllConsumablesTask>(task);
+
+ mSku = sku;
+ mReceipt = receipt;
+ mSignature = signature;
+ mToken = token;
+ }
+
+ @Override
+ protected String doInBackground(String... params) {
+ ReleaseAllConsumablesTask consume = mTask.get();
+ if (consume != null) {
+ return consume.doInBackground(mToken);
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(String param) {
+ ReleaseAllConsumablesTask consume = mTask.get();
+ if (consume != null) {
+ consume.success(mSku, mReceipt, mSignature, mToken);
+ }
+ }
+ }
+
public ReleaseAllConsumablesTask(IInAppBillingService mService, Context context) {
this.context = context;
this.mService = mService;
@@ -60,12 +93,6 @@ abstract public class ReleaseAllConsumablesTask {
//Log.d("godot", "consumeItall for " + context.getPackageName());
Bundle bundle = mService.getPurchases(3, context.getPackageName(), "inapp", null);
- for (String key : bundle.keySet()) {
- Object value = bundle.get(key);
- //Log.d("godot", String.format("%s %s (%s)", key,
- //value.toString(), value.getClass().getName()));
- }
-
if (bundle.getInt("RESPONSE_CODE") == 0) {
final ArrayList<String> myPurchases = bundle.getStringArrayList("INAPP_PURCHASE_DATA_LIST");
@@ -87,14 +114,7 @@ abstract public class ReleaseAllConsumablesTask {
String token = inappPurchaseData.getString("purchaseToken");
String signature = mySignatures.get(i);
//Log.d("godot", "A punto de consumir un item con token:" + token + "\n" + receipt);
- new GenericConsumeTask(context, mService, sku, receipt, signature, token) {
- @Override
- public void onSuccess(String sku, String receipt, String signature, String token) {
- ReleaseAllConsumablesTask.this.success(sku, receipt, signature, token);
- }
- }
- .execute();
-
+ new ReleaseAllConsumablesAsyncTask(this, sku, receipt, signature, token).execute();
} catch (JSONException e) {
}
}
@@ -104,6 +124,20 @@ abstract public class ReleaseAllConsumablesTask {
}
}
+ private String doInBackground(String token) {
+ try {
+ //Log.d("godot", "Requesting to consume an item with token ." + token);
+ int response = mService.consumePurchase(3, context.getPackageName(), token);
+ //Log.d("godot", "consumePurchase response: " + response);
+ if (response == 0 || response == 8) {
+ return null;
+ }
+ } catch (Exception e) {
+ Log.d("godot", "Error " + e.getClass().getName() + ":" + e.getMessage());
+ }
+ return null;
+ }
+
abstract protected void success(String sku, String receipt, String signature, String token);
abstract protected void error(String message);
abstract protected void notRequired();
diff --git a/platform/android/java/src/org/godotengine/godot/payments/ValidateTask.java b/platform/android/java/src/org/godotengine/godot/payments/ValidateTask.java
index 0626e50bb1..6701f9396a 100644
--- a/platform/android/java/src/org/godotengine/godot/payments/ValidateTask.java
+++ b/platform/android/java/src/org/godotengine/godot/payments/ValidateTask.java
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -52,69 +52,104 @@ import android.os.Bundle;
import android.os.RemoteException;
import android.util.Log;
+import java.lang.ref.WeakReference;
+
abstract public class ValidateTask {
private Activity context;
private GodotPaymentV3 godotPaymentsV3;
+ private ProgressDialog dialog;
+ private String mSku;
+
+ private static class ValidateAsyncTask extends AsyncTask<String, String, String> {
+ private WeakReference<ValidateTask> mTask;
+
+ ValidateAsyncTask(ValidateTask task) {
+ mTask = new WeakReference<>(task);
+ }
+
+ @Override
+ protected void onPreExecute() {
+ ValidateTask task = mTask.get();
+ if (task != null) {
+ task.onPreExecute();
+ }
+ }
+
+ @Override
+ protected String doInBackground(String... params) {
+ ValidateTask task = mTask.get();
+ if (task != null) {
+ return task.doInBackground(params);
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(String response) {
+ ValidateTask task = mTask.get();
+ if (task != null) {
+ task.onPostExecute(response);
+ }
+ }
+ }
+
public ValidateTask(Activity context, GodotPaymentV3 godotPaymentsV3) {
this.context = context;
this.godotPaymentsV3 = godotPaymentsV3;
}
public void validatePurchase(final String sku) {
- new AsyncTask<String, String, String>() {
- private ProgressDialog dialog;
+ mSku = sku;
+ new ValidateAsyncTask(this).execute();
+ }
- @Override
- protected void onPreExecute() {
- dialog = ProgressDialog.show(context, null, "Please wait...");
- }
+ private void onPreExecute() {
+ dialog = ProgressDialog.show(context, null, "Please wait...");
+ }
- @Override
- protected String doInBackground(String... params) {
- PaymentsCache pc = new PaymentsCache(context);
- String url = godotPaymentsV3.getPurchaseValidationUrlPrefix();
- RequestParams param = new RequestParams();
- param.setUrl(url);
- param.put("ticket", pc.getConsumableValue("ticket", sku));
- param.put("purchaseToken", pc.getConsumableValue("token", sku));
- param.put("sku", sku);
- //Log.d("XXX", "Haciendo request a " + url);
- //Log.d("XXX", "ticket: " + pc.getConsumableValue("ticket", sku));
- //Log.d("XXX", "purchaseToken: " + pc.getConsumableValue("token", sku));
- //Log.d("XXX", "sku: " + sku);
- param.put("package", context.getApplicationContext().getPackageName());
- HttpRequester requester = new HttpRequester();
- String jsonResponse = requester.post(param);
- //Log.d("XXX", "Validation response:\n"+jsonResponse);
- return jsonResponse;
- }
+ private String doInBackground(String... params) {
+ PaymentsCache pc = new PaymentsCache(context);
+ String url = godotPaymentsV3.getPurchaseValidationUrlPrefix();
+ RequestParams param = new RequestParams();
+ param.setUrl(url);
+ param.put("ticket", pc.getConsumableValue("ticket", mSku));
+ param.put("purchaseToken", pc.getConsumableValue("token", mSku));
+ param.put("sku", mSku);
+ //Log.d("XXX", "Haciendo request a " + url);
+ //Log.d("XXX", "ticket: " + pc.getConsumableValue("ticket", sku));
+ //Log.d("XXX", "purchaseToken: " + pc.getConsumableValue("token", sku));
+ //Log.d("XXX", "sku: " + sku);
+ param.put("package", context.getApplicationContext().getPackageName());
+ HttpRequester requester = new HttpRequester();
+ String jsonResponse = requester.post(param);
+ //Log.d("XXX", "Validation response:\n"+jsonResponse);
+ return jsonResponse;
+ }
- @Override
- protected void onPostExecute(String response) {
- if (dialog != null) {
- dialog.dismiss();
- }
- JSONObject j;
- try {
- j = new JSONObject(response);
- if (j.getString("status").equals("OK")) {
- success();
- return;
- } else if (j.getString("status") != null) {
- error(j.getString("message"));
- } else {
- error("Connection error");
- }
- } catch (JSONException e) {
- error(e.getMessage());
- } catch (Exception e) {
- error(e.getMessage());
- }
+ private void onPostExecute(String response) {
+ if (dialog != null) {
+ dialog.dismiss();
+ dialog = null;
+ }
+ JSONObject j;
+ try {
+ j = new JSONObject(response);
+ if (j.getString("status").equals("OK")) {
+ success();
+ return;
+ } else if (j.getString("status") != null) {
+ error(j.getString("message"));
+ } else {
+ error("Connection error");
}
+ } catch (JSONException e) {
+ error(e.getMessage());
+ } catch (Exception e) {
+ error(e.getMessage());
}
- .execute();
}
+
abstract protected void success();
abstract protected void error(String message);
abstract protected void canceled();
diff --git a/platform/android/java/src/org/godotengine/godot/utils/Crypt.java b/platform/android/java/src/org/godotengine/godot/utils/Crypt.java
index f34511137e..4c551d1d21 100644
--- a/platform/android/java/src/org/godotengine/godot/utils/Crypt.java
+++ b/platform/android/java/src/org/godotengine/godot/utils/Crypt.java
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/android/java/src/org/godotengine/godot/utils/CustomSSLSocketFactory.java b/platform/android/java/src/org/godotengine/godot/utils/CustomSSLSocketFactory.java
index 7216d8b5a4..3806d4bcad 100644
--- a/platform/android/java/src/org/godotengine/godot/utils/CustomSSLSocketFactory.java
+++ b/platform/android/java/src/org/godotengine/godot/utils/CustomSSLSocketFactory.java
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -44,7 +44,7 @@ import javax.net.ssl.TrustManagerFactory;
import org.apache.http.conn.ssl.SSLSocketFactory;
/**
- *
+ *
* @author Luis Linietsky <luis.linietsky@gmail.com>
*/
public class CustomSSLSocketFactory extends SSLSocketFactory {
diff --git a/platform/android/java/src/org/godotengine/godot/utils/HttpRequester.java b/platform/android/java/src/org/godotengine/godot/utils/HttpRequester.java
index b84f5cce2e..e9c81eb2e5 100644
--- a/platform/android/java/src/org/godotengine/godot/utils/HttpRequester.java
+++ b/platform/android/java/src/org/godotengine/godot/utils/HttpRequester.java
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -69,7 +69,7 @@ import android.content.SharedPreferences;
import android.util.Log;
/**
- *
+ *
* @author Luis Linietsky <luis.linietsky@gmail.com>
*/
public class HttpRequester {
@@ -105,7 +105,7 @@ public class HttpRequester {
long timeInit = new Date().getTime();
response = request(httpget);
long delay = new Date().getTime() - timeInit;
- Log.d("com.app11tt.android.utils.HttpRequest::get(url)", "Url: " + params.getUrl() + " downloaded in " + String.format("%.03f", delay / 1000.0f) + " seconds");
+ Log.d("HttpRequest::get(url)", "Url: " + params.getUrl() + " downloaded in " + String.format("%.03f", delay / 1000.0f) + " seconds");
if (response == null || response.length() == 0) {
response = "";
} else {
@@ -200,7 +200,7 @@ public class HttpRequester {
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("request_" + Crypt.md5(request), response);
editor.putLong("request_" + Crypt.md5(request) + "_ttl", new Date().getTime() + getTtl());
- editor.commit();
+ editor.apply();
}
public String getResponseFromCache(String request) {
diff --git a/platform/android/java/src/org/godotengine/godot/utils/RequestParams.java b/platform/android/java/src/org/godotengine/godot/utils/RequestParams.java
index 2368766afa..c5778102f6 100644
--- a/platform/android/java/src/org/godotengine/godot/utils/RequestParams.java
+++ b/platform/android/java/src/org/godotengine/godot/utils/RequestParams.java
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -39,7 +39,7 @@ import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
/**
- *
+ *
* @author Luis Linietsky <luis.linietsky@gmail.com>
*/
public class RequestParams {
diff --git a/platform/android/java_class_wrapper.cpp b/platform/android/java_class_wrapper.cpp
index 022ccb7d89..4be1106967 100644
--- a/platform/android/java_class_wrapper.cpp
+++ b/platform/android/java_class_wrapper.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/android/java_class_wrapper.h b/platform/android/java_class_wrapper.h
index ea3760452f..e9471a1897 100644
--- a/platform/android/java_class_wrapper.h
+++ b/platform/android/java_class_wrapper.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/android/java_glue.cpp b/platform/android/java_glue.cpp
index 07e4048c12..885fb185a7 100644
--- a/platform/android/java_glue.cpp
+++ b/platform/android/java_glue.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -28,8 +28,6 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
-#ifndef ANDROID_NATIVE_ACTIVITY
-
#include "java_glue.h"
#include "android/asset_manager_jni.h"
#include "audio_driver_jandroid.h"
@@ -268,11 +266,11 @@ Variant _jobject_to_variant(JNIEnv *env, jobject obj) {
return ret;
};
- if (name == "java.lang.Integer") {
+ if (name == "java.lang.Integer" || name == "java.lang.Long") {
jclass nclass = env->FindClass("java/lang/Number");
- jmethodID intValue = env->GetMethodID(nclass, "intValue", "()I");
- int ret = env->CallIntMethod(obj, intValue);
+ jmethodID longValue = env->GetMethodID(nclass, "longValue", "()J");
+ jlong ret = env->CallLongMethod(obj, longValue);
return ret;
};
@@ -1566,4 +1564,3 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_calldeferred(JNIEnv *
//Main::cleanup();
//return os.get_exit_code();
-#endif
diff --git a/platform/android/java_glue.h b/platform/android/java_glue.h
index d433b5f0d8..e8d0d55bb3 100644
--- a/platform/android/java_glue.h
+++ b/platform/android/java_glue.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -28,8 +28,6 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
-#ifndef ANDROID_NATIVE_ACTIVITY
-
#ifndef JAVA_GLUE_H
#define JAVA_GLUE_H
@@ -64,5 +62,4 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_calldeferred(JNIEnv *
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_setVirtualKeyboardHeight(JNIEnv *env, jobject obj, jint p_height);
}
-#endif
#endif // JAVA_GLUE_H
diff --git a/platform/android/os_android.cpp b/platform/android/os_android.cpp
index 96ff226402..2ee0b34c48 100644
--- a/platform/android/os_android.cpp
+++ b/platform/android/os_android.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -41,13 +41,8 @@
#include "servers/visual/visual_server_raster.h"
#include "servers/visual/visual_server_wrap_mt.h"
-#ifdef ANDROID_NATIVE_ACTIVITY
-#include "dir_access_android.h"
-#include "file_access_android.h"
-#else
#include "dir_access_jandroid.h"
#include "file_access_jandroid.h"
-#endif
#include <dlfcn.h>
@@ -90,18 +85,6 @@ void OS_Android::initialize_core() {
OS_Unix::initialize_core();
-#ifdef ANDROID_NATIVE_ACTIVITY
-
- FileAccess::make_default<FileAccessAndroid>(FileAccess::ACCESS_RESOURCES);
- FileAccess::make_default<FileAccessUnix>(FileAccess::ACCESS_USERDATA);
- FileAccess::make_default<FileAccessUnix>(FileAccess::ACCESS_FILESYSTEM);
- //FileAccessBufferedFA<FileAccessUnix>::make_default();
- DirAccess::make_default<DirAccessAndroid>(DirAccess::ACCESS_RESOURCES);
- DirAccess::make_default<DirAccessUnix>(DirAccess::ACCESS_USERDATA);
- DirAccess::make_default<DirAccessUnix>(DirAccess::ACCESS_FILESYSTEM);
-
-#else
-
if (use_apk_expansion)
FileAccess::make_default<FileAccessUnix>(FileAccess::ACCESS_RESOURCES);
else {
@@ -121,8 +104,6 @@ void OS_Android::initialize_core() {
DirAccess::make_default<DirAccessJAndroid>(DirAccess::ACCESS_RESOURCES);
DirAccess::make_default<DirAccessUnix>(DirAccess::ACCESS_USERDATA);
DirAccess::make_default<DirAccessUnix>(DirAccess::ACCESS_FILESYSTEM);
-
-#endif
}
void OS_Android::set_opengl_extensions(const char *p_gl_extensions) {
diff --git a/platform/android/os_android.h b/platform/android/os_android.h
index e89a380e4c..3c591af4bb 100644
--- a/platform/android/os_android.h
+++ b/platform/android/os_android.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -41,12 +41,6 @@
#include "servers/audio_server.h"
#include "servers/visual/rasterizer.h"
-#ifdef ANDROID_NATIVE_ACTIVITY
-#include <android/log.h>
-#include <android/sensor.h>
-#include <android_native_app_glue.h>
-#endif
-
typedef void (*GFXInitFunc)(void *ud, bool gl2);
typedef int (*OpenURIFunc)(const String &);
typedef String (*GetUserDataDirFunc)();
diff --git a/platform/android/platform_config.h b/platform/android/platform_config.h
index 299d8563dd..ac58be8444 100644
--- a/platform/android/platform_config.h
+++ b/platform/android/platform_config.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/android/power_android.cpp b/platform/android/power_android.cpp
index 51283183df..40b9d81189 100644
--- a/platform/android/power_android.cpp
+++ b/platform/android/power_android.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -98,7 +98,7 @@ ANativeWindow *Android_JNI_GetNativeWindow(void) {
return anw;
}
-/*
+/*
* CODE CHUNK IMPORTED FROM SDL 2.0
* returns 0 on success or -1 on error (others undefined then)
* returns truthy or falsy value in plugged, charged and battery
diff --git a/platform/android/power_android.h b/platform/android/power_android.h
index c39764222e..9730c53674 100644
--- a/platform/android/power_android.h
+++ b/platform/android/power_android.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/android/sign.sh b/platform/android/sign.sh
deleted file mode 100755
index 830da05a37..0000000000
--- a/platform/android/sign.sh
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/bash
-
-jarsigner -digestalg SHA1 -sigalg MD5withRSA -verbose -keystore my-release-key.keystore "$1" reduz
-
-echo ""
-echo ""
-echo "Checking if APK is verified..."
-jarsigner -verify "$1" -verbose -certs
-
diff --git a/platform/android/thread_jandroid.cpp b/platform/android/thread_jandroid.cpp
index 6795315e63..98f6e79dcb 100644
--- a/platform/android/thread_jandroid.cpp
+++ b/platform/android/thread_jandroid.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/android/thread_jandroid.h b/platform/android/thread_jandroid.h
index a57bc47e6d..1e1c00ab39 100644
--- a/platform/android/thread_jandroid.h
+++ b/platform/android/thread_jandroid.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/haiku/audio_driver_media_kit.cpp b/platform/haiku/audio_driver_media_kit.cpp
index 7e68c01fad..8b7dd08bb7 100644
--- a/platform/haiku/audio_driver_media_kit.cpp
+++ b/platform/haiku/audio_driver_media_kit.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/haiku/audio_driver_media_kit.h b/platform/haiku/audio_driver_media_kit.h
index 02fefcf52a..634438fd2a 100644
--- a/platform/haiku/audio_driver_media_kit.h
+++ b/platform/haiku/audio_driver_media_kit.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/haiku/context_gl_haiku.cpp b/platform/haiku/context_gl_haiku.cpp
index 41df17d2d1..d73d893603 100644
--- a/platform/haiku/context_gl_haiku.cpp
+++ b/platform/haiku/context_gl_haiku.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/haiku/context_gl_haiku.h b/platform/haiku/context_gl_haiku.h
index 2c20570a8d..6eb67fea70 100644
--- a/platform/haiku/context_gl_haiku.h
+++ b/platform/haiku/context_gl_haiku.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/haiku/detect.py b/platform/haiku/detect.py
index 8d704ac657..ae8cc58a4a 100644
--- a/platform/haiku/detect.py
+++ b/platform/haiku/detect.py
@@ -37,14 +37,14 @@ def configure(env):
## Build type
if (env["target"] == "release"):
- env.Prepend(CCFLAGS=['-O3', '-ffast-math'])
+ env.Prepend(CCFLAGS=['-O3'])
if (env["debug_symbols"] == "yes"):
env.Prepend(CCFLAGS=['-g1'])
if (env["debug_symbols"] == "full"):
env.Prepend(CCFLAGS=['-g2'])
elif (env["target"] == "release_debug"):
- env.Prepend(CCFLAGS=['-O2', '-ffast-math', '-DDEBUG_ENABLED'])
+ env.Prepend(CCFLAGS=['-O2', '-DDEBUG_ENABLED'])
if (env["debug_symbols"] == "yes"):
env.Prepend(CCFLAGS=['-g1'])
if (env["debug_symbols"] == "full"):
diff --git a/platform/haiku/godot_haiku.cpp b/platform/haiku/godot_haiku.cpp
index b042d81650..d772632d1c 100644
--- a/platform/haiku/godot_haiku.cpp
+++ b/platform/haiku/godot_haiku.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/haiku/haiku_application.cpp b/platform/haiku/haiku_application.cpp
index 4f5e3e42a2..f548904547 100644
--- a/platform/haiku/haiku_application.cpp
+++ b/platform/haiku/haiku_application.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/haiku/haiku_application.h b/platform/haiku/haiku_application.h
index a870037985..d808c03863 100644
--- a/platform/haiku/haiku_application.h
+++ b/platform/haiku/haiku_application.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/haiku/haiku_direct_window.cpp b/platform/haiku/haiku_direct_window.cpp
index 6b64082250..c0dc1d2eee 100644
--- a/platform/haiku/haiku_direct_window.cpp
+++ b/platform/haiku/haiku_direct_window.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/haiku/haiku_direct_window.h b/platform/haiku/haiku_direct_window.h
index eee09191fa..77aa71c9e0 100644
--- a/platform/haiku/haiku_direct_window.h
+++ b/platform/haiku/haiku_direct_window.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/haiku/haiku_gl_view.cpp b/platform/haiku/haiku_gl_view.cpp
index a40cbe5765..56db7b1ffb 100644
--- a/platform/haiku/haiku_gl_view.cpp
+++ b/platform/haiku/haiku_gl_view.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/haiku/haiku_gl_view.h b/platform/haiku/haiku_gl_view.h
index 6869cb7de7..cc31268c72 100644
--- a/platform/haiku/haiku_gl_view.h
+++ b/platform/haiku/haiku_gl_view.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/haiku/key_mapping_haiku.cpp b/platform/haiku/key_mapping_haiku.cpp
index ebe8117d5d..486e9a3d17 100644
--- a/platform/haiku/key_mapping_haiku.cpp
+++ b/platform/haiku/key_mapping_haiku.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/haiku/key_mapping_haiku.h b/platform/haiku/key_mapping_haiku.h
index 917151bc4a..a6a50659e0 100644
--- a/platform/haiku/key_mapping_haiku.h
+++ b/platform/haiku/key_mapping_haiku.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/haiku/os_haiku.cpp b/platform/haiku/os_haiku.cpp
index f9f12af817..a5b2e66a22 100644
--- a/platform/haiku/os_haiku.cpp
+++ b/platform/haiku/os_haiku.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/haiku/os_haiku.h b/platform/haiku/os_haiku.h
index e862eb44c3..d7eac10635 100644
--- a/platform/haiku/os_haiku.h
+++ b/platform/haiku/os_haiku.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/haiku/platform_config.h b/platform/haiku/platform_config.h
index b00510f5a1..3ce26136e8 100644
--- a/platform/haiku/platform_config.h
+++ b/platform/haiku/platform_config.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/iphone/SCsub b/platform/iphone/SCsub
index debf051eda..d5540fe8db 100644
--- a/platform/iphone/SCsub
+++ b/platform/iphone/SCsub
@@ -23,7 +23,7 @@ ios_lib = env_ios.add_library('iphone', iphone_lib)
def combine_libs(target=None, source=None, env=None):
lib_path = target[0].srcnode().abspath
- if ("OSXCROSS_IOS" in os.environ):
+ if "osxcross" in env:
libtool = '$IPHONEPATH/usr/bin/${ios_triple}libtool'
else:
libtool = "$IPHONEPATH/usr/bin/libtool"
diff --git a/platform/iphone/app_delegate.h b/platform/iphone/app_delegate.h
index c34b5053d6..4c43f10e89 100644
--- a/platform/iphone/app_delegate.h
+++ b/platform/iphone/app_delegate.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/iphone/app_delegate.mm b/platform/iphone/app_delegate.mm
index cc4985eb0c..bb0c11c767 100644
--- a/platform/iphone/app_delegate.mm
+++ b/platform/iphone/app_delegate.mm
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/iphone/detect.py b/platform/iphone/detect.py
index 417571f6f3..d0e6a4cefe 100644
--- a/platform/iphone/detect.py
+++ b/platform/iphone/detect.py
@@ -1,7 +1,7 @@
import os
import string
import sys
-
+from methods import detect_darwin_sdk_path
def is_active():
return True
@@ -22,15 +22,13 @@ def can_build():
def get_opts():
from SCons.Variables import BoolVariable
return [
- ('IPHONEPLATFORM', 'Name of the iPhone platform', 'iPhoneOS'),
('IPHONEPATH', 'Path to iPhone toolchain', '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain'),
- ('IPHONESDK', 'Path to the iPhone SDK', '/Applications/Xcode.app/Contents/Developer/Platforms/${IPHONEPLATFORM}.platform/Developer/SDKs/${IPHONEPLATFORM}.sdk/'),
+ ('IPHONESDK', 'Path to the iPhone SDK', ''),
BoolVariable('game_center', 'Support for game center', True),
BoolVariable('store_kit', 'Support for in-app store', True),
BoolVariable('icloud', 'Support for iCloud', True),
BoolVariable('ios_exceptions', 'Enable exceptions', False),
('ios_triple', 'Triple for ios toolchain', ''),
- BoolVariable('ios_sim', 'Build simulator binary', False),
]
@@ -48,7 +46,7 @@ def configure(env):
if (env["target"].startswith("release")):
env.Append(CPPFLAGS=['-DNDEBUG', '-DNS_BLOCK_ASSERTIONS=1'])
if (env["optimize"] == "speed"): #optimize for speed (default)
- env.Append(CPPFLAGS=['-O2', '-ftree-vectorize', '-fomit-frame-pointer', '-ffast-math', '-funsafe-math-optimizations'])
+ env.Append(CPPFLAGS=['-O2', '-ftree-vectorize', '-fomit-frame-pointer'])
env.Append(LINKFLAGS=['-O2'])
else: #optimize for size
env.Append(CPPFLAGS=['-Os', '-ftree-vectorize'])
@@ -65,10 +63,7 @@ def configure(env):
env.Append(LINKFLAGS=['-flto'])
## Architecture
- if env["ios_sim"] and not ("arch" in env):
- env["arch"] = "x86"
-
- if env["arch"] == "x86": # i386, simulator
+ if env["arch"] == "x86": # i386
env["bits"] = "32"
elif env["arch"] == "x86_64":
env["bits"] = "64"
@@ -81,6 +76,10 @@ def configure(env):
## Compiler configuration
+ # Save this in environment for use by other modules
+ if "OSXCROSS_IOS" in os.environ:
+ env["osxcross"] = True
+
env['ENV']['PATH'] = env['IPHONEPATH'] + "/Developer/usr/bin/:" + env['ENV']['PATH']
compiler_path = '$IPHONEPATH/usr/bin/${ios_triple}'
@@ -103,14 +102,16 @@ def configure(env):
## Compile flags
if (env["arch"] == "x86" or env["arch"] == "x86_64"):
- env['IPHONEPLATFORM'] = 'iPhoneSimulator'
+ detect_darwin_sdk_path('iphonesimulator', env)
env['ENV']['MACOSX_DEPLOYMENT_TARGET'] = '10.9'
arch_flag = "i386" if env["arch"] == "x86" else env["arch"]
- env.Append(CCFLAGS=('-arch ' + arch_flag + ' -fobjc-abi-version=2 -fobjc-legacy-dispatch -fmessage-length=0 -fpascal-strings -fblocks -fasm-blocks -isysroot $IPHONESDK -mios-simulator-version-min=9.0 -DCUSTOM_MATRIX_TRANSFORM_H=\\\"build/iphone/matrix4_iphone.h\\\" -DCUSTOM_VECTOR3_TRANSFORM_H=\\\"build/iphone/vector3_iphone.h\\\"').split())
+ env.Append(CCFLAGS=('-arch ' + arch_flag + ' -fobjc-abi-version=2 -fobjc-legacy-dispatch -fmessage-length=0 -fpascal-strings -fblocks -fasm-blocks -isysroot $IPHONESDK -mios-simulator-version-min=10.0 -DCUSTOM_MATRIX_TRANSFORM_H=\\\"build/iphone/matrix4_iphone.h\\\" -DCUSTOM_VECTOR3_TRANSFORM_H=\\\"build/iphone/vector3_iphone.h\\\"').split())
elif (env["arch"] == "arm"):
- env.Append(CCFLAGS='-fno-objc-arc -arch armv7 -fmessage-length=0 -fno-strict-aliasing -fdiagnostics-print-source-range-info -fdiagnostics-show-category=id -fdiagnostics-parseable-fixits -fpascal-strings -fblocks -isysroot $IPHONESDK -fvisibility=hidden -mthumb "-DIBOutlet=__attribute__((iboutlet))" "-DIBOutletCollection(ClassName)=__attribute__((iboutletcollection(ClassName)))" "-DIBAction=void)__attribute__((ibaction)" -miphoneos-version-min=9.0 -MMD -MT dependencies'.split())
+ detect_darwin_sdk_path('iphone', env)
+ env.Append(CCFLAGS='-fno-objc-arc -arch armv7 -fmessage-length=0 -fno-strict-aliasing -fdiagnostics-print-source-range-info -fdiagnostics-show-category=id -fdiagnostics-parseable-fixits -fpascal-strings -fblocks -isysroot $IPHONESDK -fvisibility=hidden -mthumb "-DIBOutlet=__attribute__((iboutlet))" "-DIBOutletCollection(ClassName)=__attribute__((iboutletcollection(ClassName)))" "-DIBAction=void)__attribute__((ibaction)" -miphoneos-version-min=10.0 -MMD -MT dependencies'.split())
elif (env["arch"] == "arm64"):
- env.Append(CCFLAGS='-fno-objc-arc -arch arm64 -fmessage-length=0 -fno-strict-aliasing -fdiagnostics-print-source-range-info -fdiagnostics-show-category=id -fdiagnostics-parseable-fixits -fpascal-strings -fblocks -fvisibility=hidden -MMD -MT dependencies -miphoneos-version-min=9.0 -isysroot $IPHONESDK'.split())
+ detect_darwin_sdk_path('iphone', env)
+ env.Append(CCFLAGS='-fno-objc-arc -arch arm64 -fmessage-length=0 -fno-strict-aliasing -fdiagnostics-print-source-range-info -fdiagnostics-show-category=id -fdiagnostics-parseable-fixits -fpascal-strings -fblocks -fvisibility=hidden -MMD -MT dependencies -miphoneos-version-min=10.0 -isysroot $IPHONESDK'.split())
env.Append(CPPFLAGS=['-DNEED_LONG_INT'])
env.Append(CPPFLAGS=['-DLIBYUV_DISABLE_NEON'])
@@ -123,7 +124,7 @@ def configure(env):
if (env["arch"] == "x86" or env["arch"] == "x86_64"):
arch_flag = "i386" if env["arch"] == "x86" else env["arch"]
- env.Append(LINKFLAGS=['-arch', arch_flag, '-mios-simulator-version-min=9.0',
+ env.Append(LINKFLAGS=['-arch', arch_flag, '-mios-simulator-version-min=10.0',
'-isysroot', '$IPHONESDK',
'-Xlinker',
'-objc_abi_version',
@@ -131,9 +132,9 @@ def configure(env):
'-F$IPHONESDK',
])
elif (env["arch"] == "arm"):
- env.Append(LINKFLAGS=['-arch', 'armv7', '-Wl,-dead_strip', '-miphoneos-version-min=9.0'])
+ env.Append(LINKFLAGS=['-arch', 'armv7', '-Wl,-dead_strip', '-miphoneos-version-min=10.0'])
if (env["arch"] == "arm64"):
- env.Append(LINKFLAGS=['-arch', 'arm64', '-Wl,-dead_strip', '-miphoneos-version-min=9.0'])
+ env.Append(LINKFLAGS=['-arch', 'arm64', '-Wl,-dead_strip', '-miphoneos-version-min=10.0'])
env.Append(LINKFLAGS=['-isysroot', '$IPHONESDK',
'-framework', 'AudioToolbox',
@@ -172,7 +173,7 @@ def configure(env):
env['ENV']['CODESIGN_ALLOCATE'] = '/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate'
env.Append(CPPPATH=['#platform/iphone'])
- env.Append(CPPFLAGS=['-DIPHONE_ENABLED', '-DUNIX_ENABLED', '-DGLES_ENABLED', '-DMPC_FIXED_POINT', '-DCOREAUDIO_ENABLED'])
+ env.Append(CPPFLAGS=['-DIPHONE_ENABLED', '-DUNIX_ENABLED', '-DGLES_ENABLED', '-DCOREAUDIO_ENABLED'])
# TODO: Move that to opus module's config
if 'module_opus_enabled' in env and env['module_opus_enabled']:
diff --git a/platform/iphone/export/export.cpp b/platform/iphone/export/export.cpp
index 1fc497456c..ef81981ec0 100644
--- a/platform/iphone/export/export.cpp
+++ b/platform/iphone/export/export.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -99,6 +99,70 @@ class EditorExportPlatformIOS : public EditorExportPlatform {
Error _export_additional_assets(const String &p_out_dir, const Vector<String> &p_assets, bool p_is_framework, Vector<IOSExportAsset> &r_exported_assets);
Error _export_additional_assets(const String &p_out_dir, const Vector<SharedObject> &p_libraries, Vector<IOSExportAsset> &r_exported_assets);
+ bool is_package_name_valid(const String &p_package, String *r_error = NULL) const {
+
+ String pname = p_package;
+
+ if (pname.length() == 0) {
+ if (r_error) {
+ *r_error = "Identifier is missing.";
+ }
+ return false;
+ }
+
+ int segments = 0;
+ bool first = true;
+ for (int i = 0; i < pname.length(); i++) {
+ CharType c = pname[i];
+ if (first && c == '.') {
+ if (r_error) {
+ *r_error = "Identifier segments must be of non-zero length.";
+ }
+ return false;
+ }
+ if (c == '.') {
+ segments++;
+ first = true;
+ continue;
+ }
+ if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_')) {
+ if (r_error) {
+ *r_error = "The character '" + String::chr(c) + "' is not allowed in Identifier.";
+ }
+ return false;
+ }
+ if (first && (c >= '0' && c <= '9')) {
+ if (r_error) {
+ *r_error = "A digit cannot be the first character in a Identifier segment.";
+ }
+ return false;
+ }
+ if (first && c == '_') {
+ if (r_error) {
+ *r_error = "The character '" + String::chr(c) + "' cannot be the first character in a Identifier segment.";
+ }
+ return false;
+ }
+ first = false;
+ }
+
+ if (segments == 0) {
+ if (r_error) {
+ *r_error = "The Identifier must have at least one '.' separator.";
+ }
+ return false;
+ }
+
+ if (first) {
+ if (r_error) {
+ *r_error = "Identifier segments must be of non-zero length.";
+ }
+ return false;
+ }
+
+ return true;
+ }
+
protected:
virtual void get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features);
virtual void get_export_options(List<ExportOption> *r_options);
@@ -965,27 +1029,55 @@ Error EditorExportPlatformIOS::export_project(const Ref<EditorExportPreset> &p_p
bool EditorExportPlatformIOS::can_export(const Ref<EditorExportPreset> &p_preset, String &r_error, bool &r_missing_templates) const {
- bool valid = true;
String err;
+ r_missing_templates = find_export_template("iphone.zip") == String();
- if (!exists_export_template("iphone.zip", &err)) {
- valid = false;
+ if (p_preset->get("custom_package/debug") != "") {
+ if (FileAccess::exists(p_preset->get("custom_package/debug"))) {
+ r_missing_templates = false;
+ } else {
+ err += "Custom debug package not found.\n";
+ }
}
- if (p_preset->get("custom_package/debug") != "" && !FileAccess::exists(p_preset->get("custom_package/debug"))) {
+ if (p_preset->get("custom_package/release") != "") {
+ if (FileAccess::exists(p_preset->get("custom_package/release"))) {
+ r_missing_templates = false;
+ } else {
+ err += "Custom release package not found.\n";
+ }
+ }
+
+ bool valid = !r_missing_templates;
+
+ String team_id = p_preset->get("application/app_store_team_id");
+ if (team_id.length() == 0) {
+ err += "App Store Team ID not specified - cannot configure the project.\n";
valid = false;
- err += "Custom debug package not found.\n";
}
- if (p_preset->get("custom_package/release") != "" && !FileAccess::exists(p_preset->get("custom_package/release"))) {
+ String identifier = p_preset->get("application/identifier");
+ String pn_err;
+ if (!is_package_name_valid(identifier, &pn_err)) {
+ err += "Invalid Identifier - " + pn_err + "\n";
valid = false;
- err += "Custom release package not found.\n";
+ }
+
+ for (unsigned int i = 0; i < (sizeof(icon_infos) / sizeof(icon_infos[0])); ++i) {
+ IconInfo info = icon_infos[i];
+ String icon_path = p_preset->get(info.preset_key);
+ if (icon_path.length() == 0) {
+ if (info.is_required) {
+ err += "Required icon is not specified in the preset.\n";
+ valid = false;
+ }
+ break;
+ }
}
if (!err.empty())
r_error = err;
- r_missing_templates = !valid;
return valid;
}
diff --git a/platform/iphone/export/export.h b/platform/iphone/export/export.h
index ea79973290..3da58def33 100644
--- a/platform/iphone/export/export.h
+++ b/platform/iphone/export/export.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/iphone/game_center.h b/platform/iphone/game_center.h
index 9a62cccb1a..1a14968f02 100644
--- a/platform/iphone/game_center.h
+++ b/platform/iphone/game_center.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/iphone/game_center.mm b/platform/iphone/game_center.mm
index e210bfb862..97d6f0c71b 100644
--- a/platform/iphone/game_center.mm
+++ b/platform/iphone/game_center.mm
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/iphone/gl_view.h b/platform/iphone/gl_view.h
index 0d101eb696..4fb721f159 100644
--- a/platform/iphone/gl_view.h
+++ b/platform/iphone/gl_view.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/iphone/gl_view.mm b/platform/iphone/gl_view.mm
index 2925b46007..6f4d0ddb57 100644
--- a/platform/iphone/gl_view.mm
+++ b/platform/iphone/gl_view.mm
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -47,6 +47,7 @@
@end
*/
+bool gles3_available = true;
int gl_view_base_fb;
static String keyboard_text;
static GLView *_instance = NULL;
@@ -84,7 +85,8 @@ Rect2 _get_ios_window_safe_area(float p_window_width, float p_window_height) {
}
ERR_FAIL_COND_V(insets.left < 0 || insets.top < 0 || insets.right < 0 || insets.bottom < 0,
Rect2(0, 0, p_window_width, p_window_height));
- return Rect2(insets.left, insets.top, p_window_width - insets.right - insets.left, p_window_height - insets.bottom - insets.top);
+ UIEdgeInsets window_insets = UIEdgeInsetsMake(_points_to_pixels(insets.top), _points_to_pixels(insets.left), _points_to_pixels(insets.bottom), _points_to_pixels(insets.right));
+ return Rect2(window_insets.left, window_insets.top, p_window_width - window_insets.right - window_insets.left, p_window_height - window_insets.bottom - window_insets.top);
}
bool _play_video(String p_path, float p_volume, String p_audio_track, String p_subtitle_track) {
@@ -287,8 +289,12 @@ static void clear_touches() {
context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];
if (!context || ![EAGLContext setCurrentContext:context] || ![self createFramebuffer]) {
- [self release];
- return nil;
+ context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
+ gles3_available = false;
+ if (!context || ![EAGLContext setCurrentContext:context] || ![self createFramebuffer]) {
+ [self release];
+ return nil;
+ }
}
// Default the animation interval to 1/60th of a second.
@@ -577,7 +583,7 @@ static void clear_touches() {
character.parse_utf8([p_text UTF8String]);
keyboard_text = keyboard_text + character;
OSIPhone::get_singleton()->key(character[0] == 10 ? KEY_ENTER : character[0], true);
- printf("inserting text with character %i\n", character[0]);
+ printf("inserting text with character %lc\n", (CharType)character[0]);
};
- (void)audioRouteChangeListenerCallback:(NSNotification *)notification {
diff --git a/platform/iphone/globals/global_defaults.cpp b/platform/iphone/globals/global_defaults.cpp
deleted file mode 100644
index 423f50995e..0000000000
--- a/platform/iphone/globals/global_defaults.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-/*************************************************************************/
-/* global_defaults.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "global_defaults.h"
-#include "core/project_settings.h"
-
-void register_iphone_global_defaults() {
-}
diff --git a/platform/iphone/globals/global_defaults.h b/platform/iphone/globals/global_defaults.h
deleted file mode 100644
index 3e3c220f4a..0000000000
--- a/platform/iphone/globals/global_defaults.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*************************************************************************/
-/* global_defaults.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-void register_iphone_global_defaults();
diff --git a/platform/iphone/godot_iphone.cpp b/platform/iphone/godot_iphone.cpp
index f9b9654a8c..db93db5021 100644
--- a/platform/iphone/godot_iphone.cpp
+++ b/platform/iphone/godot_iphone.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/iphone/icloud.h b/platform/iphone/icloud.h
index 52bb1131a0..aa4e1d4582 100644
--- a/platform/iphone/icloud.h
+++ b/platform/iphone/icloud.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/iphone/icloud.mm b/platform/iphone/icloud.mm
index a9748bf562..e32618e8f6 100644
--- a/platform/iphone/icloud.mm
+++ b/platform/iphone/icloud.mm
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/iphone/in_app_store.h b/platform/iphone/in_app_store.h
index 353438676d..7ed699c4f1 100644
--- a/platform/iphone/in_app_store.h
+++ b/platform/iphone/in_app_store.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/iphone/in_app_store.mm b/platform/iphone/in_app_store.mm
index 2cdd477ed1..490e84c571 100644
--- a/platform/iphone/in_app_store.mm
+++ b/platform/iphone/in_app_store.mm
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/iphone/ios.h b/platform/iphone/ios.h
index 5e77683949..91c4725b35 100644
--- a/platform/iphone/ios.h
+++ b/platform/iphone/ios.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/iphone/ios.mm b/platform/iphone/ios.mm
index 7eb4f495f7..686422ceb2 100644
--- a/platform/iphone/ios.mm
+++ b/platform/iphone/ios.mm
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/iphone/main.m b/platform/iphone/main.m
index 0f0810f28f..e9f009eabe 100644
--- a/platform/iphone/main.m
+++ b/platform/iphone/main.m
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/iphone/os_iphone.cpp b/platform/iphone/os_iphone.cpp
index e996a5905b..16634c3b30 100644
--- a/platform/iphone/os_iphone.cpp
+++ b/platform/iphone/os_iphone.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -32,6 +32,7 @@
#include "os_iphone.h"
+#include "drivers/gles2/rasterizer_gles2.h"
#include "drivers/gles3/rasterizer_gles3.h"
#include "servers/visual/visual_server_raster.h"
#include "servers/visual/visual_server_wrap_mt.h"
@@ -51,12 +52,19 @@
int OSIPhone::get_video_driver_count() const {
- return 1;
+ return 2;
};
const char *OSIPhone::get_video_driver_name(int p_driver) const {
- return "GLES3";
+ switch (p_driver) {
+ case VIDEO_DRIVER_GLES3:
+ return "GLES3";
+ case VIDEO_DRIVER_GLES2:
+ return "GLES2";
+ }
+ ERR_EXPLAIN("Invalid video driver index " + itos(p_driver));
+ ERR_FAIL_V(NULL);
};
OSIPhone *OSIPhone::get_singleton() {
@@ -97,16 +105,48 @@ int OSIPhone::get_current_video_driver() const {
return video_driver_index;
}
+extern bool gles3_available; // from gl_view.mm
+
Error OSIPhone::initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver) {
- video_driver_index = VIDEO_DRIVER_GLES3;
+ bool use_gl3 = GLOBAL_GET("rendering/quality/driver/driver_name") == "GLES3";
+ bool gl_initialization_error = false;
+
+ while (true) {
+ if (use_gl3) {
+ if (RasterizerGLES3::is_viable() == OK && gles3_available) {
+ RasterizerGLES3::register_config();
+ RasterizerGLES3::make_current();
+ break;
+ } else {
+ if (GLOBAL_GET("rendering/quality/driver/driver_fallback") == "Best") {
+ p_video_driver = VIDEO_DRIVER_GLES2;
+ use_gl3 = false;
+ continue;
+ } else {
+ gl_initialization_error = true;
+ break;
+ }
+ }
+ } else {
+ if (RasterizerGLES2::is_viable() == OK) {
+ RasterizerGLES2::register_config();
+ RasterizerGLES2::make_current();
+ break;
+ } else {
+ gl_initialization_error = true;
+ break;
+ }
+ }
+ }
- if (RasterizerGLES3::is_viable() != OK) {
+ if (gl_initialization_error) {
+ OS::get_singleton()->alert("Your device does not support any of the supported OpenGL versions.",
+ "Unable to initialize Video driver");
return ERR_UNAVAILABLE;
}
- RasterizerGLES3::register_config();
- RasterizerGLES3::make_current();
+ video_driver_index = p_video_driver;
visual_server = memnew(VisualServerRaster);
// FIXME: Reimplement threaded rendering
if (get_render_thread_mode() != RENDER_THREAD_UNSAFE) {
@@ -117,7 +157,10 @@ Error OSIPhone::initialize(const VideoMode &p_desired, int p_video_driver, int p
//visual_server->cursor_set_visible(false, 0);
// reset this to what it should be, it will have been set to 0 after visual_server->init() is called
- RasterizerStorageGLES3::system_fbo = gl_view_base_fb;
+ if (use_gl3)
+ RasterizerStorageGLES3::system_fbo = gl_view_base_fb;
+ else
+ RasterizerStorageGLES2::system_fbo = gl_view_base_fb;
AudioDriverManager::initialize(p_audio_driver);
diff --git a/platform/iphone/os_iphone.h b/platform/iphone/os_iphone.h
index 64a3c6355a..30d7a1ba41 100644
--- a/platform/iphone/os_iphone.h
+++ b/platform/iphone/os_iphone.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/iphone/platform_config.h b/platform/iphone/platform_config.h
index d9fd61fb6e..1884e03403 100644
--- a/platform/iphone/platform_config.h
+++ b/platform/iphone/platform_config.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/iphone/platform_refcount.h b/platform/iphone/platform_refcount.h
index 34338d92e7..56fd4e6e81 100644
--- a/platform/iphone/platform_refcount.h
+++ b/platform/iphone/platform_refcount.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/iphone/power_iphone.cpp b/platform/iphone/power_iphone.cpp
index 7f9dadc363..e2631b7822 100644
--- a/platform/iphone/power_iphone.cpp
+++ b/platform/iphone/power_iphone.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/iphone/power_iphone.h b/platform/iphone/power_iphone.h
index 9619064915..eb930b99c5 100644
--- a/platform/iphone/power_iphone.h
+++ b/platform/iphone/power_iphone.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/iphone/sem_iphone.cpp b/platform/iphone/sem_iphone.cpp
index ebab9db8fa..05cdb6a2f7 100644
--- a/platform/iphone/sem_iphone.cpp
+++ b/platform/iphone/sem_iphone.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/iphone/sem_iphone.h b/platform/iphone/sem_iphone.h
index 3edc4492eb..134bc723d9 100644
--- a/platform/iphone/sem_iphone.h
+++ b/platform/iphone/sem_iphone.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/iphone/view_controller.h b/platform/iphone/view_controller.h
index 31c4f0daf3..fc18661f62 100644
--- a/platform/iphone/view_controller.h
+++ b/platform/iphone/view_controller.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/iphone/view_controller.mm b/platform/iphone/view_controller.mm
index f75f0fd812..0358abf9e2 100644
--- a/platform/iphone/view_controller.mm
+++ b/platform/iphone/view_controller.mm
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/javascript/api/api.cpp b/platform/javascript/api/api.cpp
index c7a6d53561..d4dc43d57c 100644
--- a/platform/javascript/api/api.cpp
+++ b/platform/javascript/api/api.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/javascript/api/api.h b/platform/javascript/api/api.h
index 5f22f082e9..52d87528f6 100644
--- a/platform/javascript/api/api.h
+++ b/platform/javascript/api/api.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/javascript/api/javascript_eval.h b/platform/javascript/api/javascript_eval.h
index 49d5309737..49e460fffd 100644
--- a/platform/javascript/api/javascript_eval.h
+++ b/platform/javascript/api/javascript_eval.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/javascript/audio_driver_javascript.cpp b/platform/javascript/audio_driver_javascript.cpp
index 7a6613bb32..fcfc75280d 100644
--- a/platform/javascript/audio_driver_javascript.cpp
+++ b/platform/javascript/audio_driver_javascript.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -44,6 +44,11 @@ extern "C" EMSCRIPTEN_KEEPALIVE void audio_driver_js_mix() {
AudioDriverJavaScript::singleton->mix_to_js();
}
+extern "C" EMSCRIPTEN_KEEPALIVE void audio_driver_process_capture(float sample) {
+
+ AudioDriverJavaScript::singleton->process_capture(sample);
+}
+
void AudioDriverJavaScript::mix_to_js() {
int channel_count = get_total_channels_by_speaker_mode(get_speaker_mode());
@@ -51,31 +56,39 @@ void AudioDriverJavaScript::mix_to_js() {
int32_t *stream_buffer = reinterpret_cast<int32_t *>(internal_buffer);
audio_server_process(sample_count, stream_buffer);
for (int i = 0; i < sample_count * channel_count; i++) {
- internal_buffer[i] = float(stream_buffer[i] >> 16) / 32768.0;
+ internal_buffer[i] = float(stream_buffer[i] >> 16) / 32768.f;
}
}
+void AudioDriverJavaScript::process_capture(float sample) {
+
+ int32_t sample32 = int32_t(sample * 32768.f) * (1U << 16);
+ input_buffer_write(sample32);
+}
+
Error AudioDriverJavaScript::init() {
/* clang-format off */
EM_ASM({
_audioDriver_audioContext = new (window.AudioContext || window.webkitAudioContext);
+ _audioDriver_audioInput = null;
+ _audioDriver_inputStream = null;
_audioDriver_scriptNode = null;
});
/* clang-format on */
int channel_count = get_total_channels_by_speaker_mode(get_speaker_mode());
/* clang-format off */
- int buffer_length = EM_ASM_INT({
+ buffer_length = EM_ASM_INT({
var CHANNEL_COUNT = $0;
var channelCount = _audioDriver_audioContext.destination.channelCount;
try {
// Try letting the browser recommend a buffer length.
- _audioDriver_scriptNode = _audioDriver_audioContext.createScriptProcessor(0, 0, channelCount);
+ _audioDriver_scriptNode = _audioDriver_audioContext.createScriptProcessor(0, 2, channelCount);
} catch (e) {
// ...otherwise, default to 4096.
- _audioDriver_scriptNode = _audioDriver_audioContext.createScriptProcessor(4096, 0, channelCount);
+ _audioDriver_scriptNode = _audioDriver_audioContext.createScriptProcessor(4096, 2, channelCount);
}
_audioDriver_scriptNode.connect(_audioDriver_audioContext.destination);
@@ -91,6 +104,7 @@ Error AudioDriverJavaScript::init() {
memdelete_arr(internal_buffer);
internal_buffer = memnew_arr(float, buffer_length *channel_count);
}
+
return internal_buffer ? OK : ERR_OUT_OF_MEMORY;
}
@@ -101,11 +115,13 @@ void AudioDriverJavaScript::start() {
var INTERNAL_BUFFER_PTR = $0;
var audioDriverMixFunction = cwrap('audio_driver_js_mix');
+ var audioDriverProcessCapture = cwrap('audio_driver_process_capture', null, ['number']);
_audioDriver_scriptNode.onaudioprocess = function(audioProcessingEvent) {
audioDriverMixFunction();
- // The output buffer contains the samples that will be modified and played.
+
+ var input = audioProcessingEvent.inputBuffer;
var output = audioProcessingEvent.outputBuffer;
- var input = HEAPF32.subarray(
+ var internalBuffer = HEAPF32.subarray(
INTERNAL_BUFFER_PTR / HEAPF32.BYTES_PER_ELEMENT,
INTERNAL_BUFFER_PTR / HEAPF32.BYTES_PER_ELEMENT + output.length * output.numberOfChannels);
@@ -113,8 +129,16 @@ void AudioDriverJavaScript::start() {
var outputData = output.getChannelData(channel);
// Loop through samples.
for (var sample = 0; sample < outputData.length; sample++) {
- // Set output equal to input.
- outputData[sample] = input[sample * output.numberOfChannels + channel];
+ outputData[sample] = internalBuffer[sample * output.numberOfChannels + channel];
+ }
+ }
+
+ if (_audioDriver_audioInput) {
+ var inputDataL = input.getChannelData(0);
+ var inputDataR = input.getChannelData(1);
+ for (var i = 0; i < inputDataL.length; i++) {
+ audioDriverProcessCapture(inputDataL[i]);
+ audioDriverProcessCapture(inputDataR[i]);
}
}
};
@@ -152,14 +176,74 @@ void AudioDriverJavaScript::finish() {
/* clang-format off */
EM_ASM({
_audioDriver_audioContext = null;
+ _audioDriver_audioInput = null;
_audioDriver_scriptNode = null;
});
/* clang-format on */
- memdelete_arr(internal_buffer);
- internal_buffer = NULL;
+
+ if (internal_buffer) {
+ memdelete_arr(internal_buffer);
+ internal_buffer = NULL;
+ }
+}
+
+Error AudioDriverJavaScript::capture_start() {
+
+ input_buffer_init(buffer_length);
+
+ /* clang-format off */
+ EM_ASM({
+ function gotMediaInput(stream) {
+ _audioDriver_inputStream = stream;
+ _audioDriver_audioInput = _audioDriver_audioContext.createMediaStreamSource(stream);
+ _audioDriver_audioInput.connect(_audioDriver_scriptNode);
+ }
+
+ function gotMediaInputError(e) {
+ console.log(e);
+ }
+
+ if (navigator.mediaDevices.getUserMedia) {
+ navigator.mediaDevices.getUserMedia({"audio": true}).then(gotMediaInput, gotMediaInputError);
+ } else {
+ if (!navigator.getUserMedia)
+ navigator.getUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
+ navigator.getUserMedia({"audio": true}, gotMediaInput, gotMediaInputError);
+ }
+ });
+ /* clang-format on */
+
+ return OK;
+}
+
+Error AudioDriverJavaScript::capture_stop() {
+
+ /* clang-format off */
+ EM_ASM({
+ if (_audioDriver_inputStream) {
+ const tracks = _audioDriver_inputStream.getTracks();
+ for (var i = 0; i < tracks.length; i++) {
+ tracks[i].stop();
+ }
+ _audioDriver_inputStream = null;
+ }
+
+ if (_audioDriver_audioInput) {
+ _audioDriver_audioInput.disconnect();
+ _audioDriver_audioInput = null;
+ }
+
+ });
+ /* clang-format on */
+
+ input_buffer.clear();
+
+ return OK;
}
AudioDriverJavaScript::AudioDriverJavaScript() {
+ internal_buffer = NULL;
+
singleton = this;
}
diff --git a/platform/javascript/audio_driver_javascript.h b/platform/javascript/audio_driver_javascript.h
index a65a8ec29f..bf7e2bcce6 100644
--- a/platform/javascript/audio_driver_javascript.h
+++ b/platform/javascript/audio_driver_javascript.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -37,8 +37,12 @@ class AudioDriverJavaScript : public AudioDriver {
float *internal_buffer;
+ int buffer_length;
+
public:
void mix_to_js();
+ void process_capture(float sample);
+
static AudioDriverJavaScript *singleton;
virtual const char *get_name() const;
@@ -51,6 +55,9 @@ public:
virtual void unlock();
virtual void finish();
+ virtual Error capture_start();
+ virtual Error capture_stop();
+
AudioDriverJavaScript();
};
diff --git a/platform/javascript/detect.py b/platform/javascript/detect.py
index cf85c3df7f..22b5f1f87a 100644
--- a/platform/javascript/detect.py
+++ b/platform/javascript/detect.py
@@ -122,6 +122,7 @@ def configure(env):
## Link flags
env.Append(LINKFLAGS=['-s', 'BINARYEN=1'])
+ env.Append(LINKFLAGS=['-s', 'BINARYEN_TRAP_MODE=\'clamp\''])
# Allow increasing memory buffer size during runtime. This is efficient
# when using WebAssembly (in comparison to asm.js) and works well for
diff --git a/platform/javascript/dom_keys.inc b/platform/javascript/dom_keys.inc
index a30818decc..bf99ea5d42 100644
--- a/platform/javascript/dom_keys.inc
+++ b/platform/javascript/dom_keys.inc
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/javascript/export/export.cpp b/platform/javascript/export/export.cpp
index 7a325e81dd..b3f90b9011 100644
--- a/platform/javascript/export/export.cpp
+++ b/platform/javascript/export/export.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/javascript/export/export.h b/platform/javascript/export/export.h
index 2835d0723f..7ebbcd6f00 100644
--- a/platform/javascript/export/export.h
+++ b/platform/javascript/export/export.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/javascript/http_client.h.inc b/platform/javascript/http_client.h.inc
index d75d33a33a..d707d623ab 100644
--- a/platform/javascript/http_client.h.inc
+++ b/platform/javascript/http_client.h.inc
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* http://www.godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/javascript/http_client_javascript.cpp b/platform/javascript/http_client_javascript.cpp
index ccf4f8a11b..b4bab9a999 100644
--- a/platform/javascript/http_client_javascript.cpp
+++ b/platform/javascript/http_client_javascript.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/javascript/http_request.h b/platform/javascript/http_request.h
index b5ff46d7fe..4a596057da 100644
--- a/platform/javascript/http_request.h
+++ b/platform/javascript/http_request.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/javascript/http_request.js b/platform/javascript/http_request.js
index ee1c06c623..7acd32d8bf 100644
--- a/platform/javascript/http_request.js
+++ b/platform/javascript/http_request.js
@@ -5,7 +5,7 @@
/* GODOT ENGINE */
/* http://www.godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/javascript/javascript_eval.cpp b/platform/javascript/javascript_eval.cpp
index 9b8174cc71..bb43e2d46b 100644
--- a/platform/javascript/javascript_eval.cpp
+++ b/platform/javascript/javascript_eval.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/javascript/javascript_main.cpp b/platform/javascript/javascript_main.cpp
index ec60571402..bdf9dfe18f 100644
--- a/platform/javascript/javascript_main.cpp
+++ b/platform/javascript/javascript_main.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/javascript/os_javascript.cpp b/platform/javascript/os_javascript.cpp
index 9250ca4903..cc3018716d 100644
--- a/platform/javascript/os_javascript.cpp
+++ b/platform/javascript/os_javascript.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -295,6 +295,30 @@ EM_BOOL OS_JavaScript::mouse_button_callback(int p_event_type, const EmscriptenM
default: return false;
}
+ if (ev->is_pressed()) {
+
+ uint64_t diff = p_event->timestamp - os->last_click_ms;
+
+ if (ev->get_button_index() == os->last_click_button_index) {
+
+ if (diff < 400 && Point2(os->last_click_pos).distance_to(ev->get_position()) < 5) {
+
+ os->last_click_ms = 0;
+ os->last_click_pos = Point2(-100, -100);
+ os->last_click_button_index = -1;
+ ev->set_doubleclick(true);
+ }
+
+ } else {
+ os->last_click_button_index = ev->get_button_index();
+ }
+
+ if (!ev->is_doubleclick()) {
+ os->last_click_ms += diff;
+ os->last_click_pos = ev->get_position();
+ }
+ }
+
int mask = os->input->get_mouse_button_mask();
int button_flag = 1 << (ev->get_button_index() - 1);
if (ev->is_pressed()) {
@@ -391,12 +415,129 @@ void OS_JavaScript::set_cursor_shape(CursorShape p_shape) {
ERR_FAIL_INDEX(p_shape, CURSOR_MAX);
+ if (get_mouse_mode() == MOUSE_MODE_VISIBLE) {
+ if (cursors[p_shape] != "") {
+ Vector<String> url = cursors[p_shape].split("?");
+ set_css_cursor(("url(\"" + url[0] + "\") " + url[1] + ", auto").utf8());
+ } else {
+ set_css_cursor(godot2dom_cursor(p_shape));
+ }
+ }
+
cursor_shape = p_shape;
- if (get_mouse_mode() != MOUSE_MODE_HIDDEN)
- set_css_cursor(godot2dom_cursor(cursor_shape));
}
void OS_JavaScript::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot) {
+
+ if (p_cursor.is_valid()) {
+ Ref<Texture> texture = p_cursor;
+ Ref<AtlasTexture> atlas_texture = p_cursor;
+ Ref<Image> image;
+ Size2 texture_size;
+ Rect2 atlas_rect;
+
+ if (texture.is_valid()) {
+ image = texture->get_data();
+ }
+
+ if (!image.is_valid() && atlas_texture.is_valid()) {
+ texture = atlas_texture->get_atlas();
+
+ atlas_rect.size.width = texture->get_width();
+ atlas_rect.size.height = texture->get_height();
+ atlas_rect.position.x = atlas_texture->get_region().position.x;
+ atlas_rect.position.y = atlas_texture->get_region().position.y;
+
+ texture_size.width = atlas_texture->get_region().size.x;
+ texture_size.height = atlas_texture->get_region().size.y;
+ } else if (image.is_valid()) {
+ texture_size.width = texture->get_width();
+ texture_size.height = texture->get_height();
+ }
+
+ ERR_FAIL_COND(!texture.is_valid());
+ ERR_FAIL_COND(p_hotspot.x < 0 || p_hotspot.y < 0);
+ ERR_FAIL_COND(texture_size.width > 256 || texture_size.height > 256);
+ ERR_FAIL_COND(p_hotspot.x > texture_size.width || p_hotspot.y > texture_size.height);
+
+ image = texture->get_data();
+
+ ERR_FAIL_COND(!image.is_valid());
+
+ if (atlas_texture.is_valid())
+ image->crop_from_point(
+ atlas_rect.position.x,
+ atlas_rect.position.y,
+ texture_size.width,
+ texture_size.height);
+
+ if (image->get_format() != Image::FORMAT_RGBA8) {
+ image->convert(Image::FORMAT_RGBA8);
+ }
+
+ png_image png_meta;
+ memset(&png_meta, 0, sizeof png_meta);
+ png_meta.version = PNG_IMAGE_VERSION;
+ png_meta.width = texture_size.width;
+ png_meta.height = texture_size.height;
+ png_meta.format = PNG_FORMAT_RGBA;
+
+ PoolByteArray png;
+ size_t len;
+ PoolByteArray::Read r = image->get_data().read();
+ ERR_FAIL_COND(!png_image_write_get_memory_size(png_meta, len, 0, r.ptr(), 0, NULL));
+
+ png.resize(len);
+ PoolByteArray::Write w = png.write();
+ ERR_FAIL_COND(!png_image_write_to_memory(&png_meta, w.ptr(), &len, 0, r.ptr(), 0, NULL));
+ w = PoolByteArray::Write();
+
+ r = png.read();
+
+ char *object_url;
+ /* clang-format off */
+ EM_ASM({
+ var PNG_PTR = $0;
+ var PNG_LEN = $1;
+ var PTR = $2;
+
+ var png = new Blob([HEAPU8.slice(PNG_PTR, PNG_PTR + PNG_LEN)], { type: 'image/png' });
+ var url = URL.createObjectURL(png);
+ var length_bytes = lengthBytesUTF8(url) + 1;
+ var string_on_wasm_heap = _malloc(length_bytes);
+ setValue(PTR, string_on_wasm_heap, '*');
+ stringToUTF8(url, string_on_wasm_heap, length_bytes);
+ }, r.ptr(), len, &object_url);
+ /* clang-format on */
+ r = PoolByteArray::Read();
+
+ String url = String::utf8(object_url) + "?" + itos(p_hotspot.x) + " " + itos(p_hotspot.y);
+
+ /* clang-format off */
+ EM_ASM({ _free($0); }, object_url);
+ /* clang-format on */
+
+ if (cursors[p_shape] != "") {
+ /* clang-format off */
+ EM_ASM({
+ URL.revokeObjectURL(UTF8ToString($0).split('?')[0]);
+ }, cursors[p_shape].utf8().get_data());
+ /* clang-format on */
+ cursors[p_shape] = "";
+ }
+
+ cursors[p_shape] = url;
+
+ } else if (cursors[p_shape] != "") {
+ /* clang-format off */
+ EM_ASM({
+ URL.revokeObjectURL(UTF8ToString($0).split('?')[0]);
+ }, cursors[p_shape].utf8().get_data());
+ /* clang-format on */
+ cursors[p_shape] = "";
+ }
+
+ set_cursor_shape(cursor_shape);
}
void OS_JavaScript::set_mouse_mode(OS::MouseMode p_mode) {
@@ -408,7 +549,9 @@ void OS_JavaScript::set_mouse_mode(OS::MouseMode p_mode) {
if (p_mode == MOUSE_MODE_VISIBLE) {
+ // set_css_cursor must be called before set_cursor_shape to make the cursor visible
set_css_cursor(godot2dom_cursor(cursor_shape));
+ set_cursor_shape(cursor_shape);
emscripten_exit_pointerlock();
} else if (p_mode == MOUSE_MODE_HIDDEN) {
@@ -422,7 +565,9 @@ void OS_JavaScript::set_mouse_mode(OS::MouseMode p_mode) {
ERR_EXPLAIN("MOUSE_MODE_CAPTURED can only be entered from within an appropriate input callback");
ERR_FAIL_COND(result == EMSCRIPTEN_RESULT_FAILED_NOT_DEFERRED);
ERR_FAIL_COND(result != EMSCRIPTEN_RESULT_SUCCESS);
+ // set_css_cursor must be called before set_cursor_shape to make the cursor visible
set_css_cursor(godot2dom_cursor(cursor_shape));
+ set_cursor_shape(cursor_shape);
}
}
@@ -452,7 +597,6 @@ EM_BOOL OS_JavaScript::wheel_callback(int p_event_type, const EmscriptenWheelEve
InputDefault *input = get_singleton()->input;
Ref<InputEventMouseButton> ev;
ev.instance();
- ev->set_button_mask(input->get_mouse_button_mask());
ev->set_position(input->get_mouse_position());
ev->set_global_position(ev->get_position());
@@ -475,10 +619,14 @@ EM_BOOL OS_JavaScript::wheel_callback(int p_event_type, const EmscriptenWheelEve
// Different browsers give wildly different delta values, and we can't
// interpret deltaMode, so use default value for wheel events' factor.
+ int button_flag = 1 << (ev->get_button_index() - 1);
+
ev->set_pressed(true);
+ ev->set_button_mask(input->get_mouse_button_mask() | button_flag);
input->parse_input_event(ev);
ev->set_pressed(false);
+ ev->set_button_mask(input->get_mouse_button_mask() & ~button_flag);
input->parse_input_event(ev);
return true;
@@ -1067,6 +1215,10 @@ OS_JavaScript::OS_JavaScript(int p_argc, char *p_argv[]) {
}
set_cmdline(p_argv[0], arguments);
+ last_click_button_index = -1;
+ last_click_ms = 0;
+ last_click_pos = Point2(-100, -100);
+
window_maximized = false;
entering_fullscreen = false;
just_exited_fullscreen = false;
diff --git a/platform/javascript/os_javascript.h b/platform/javascript/os_javascript.h
index 79dac5940f..64148915a5 100644
--- a/platform/javascript/os_javascript.h
+++ b/platform/javascript/os_javascript.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -50,8 +50,13 @@ class OS_JavaScript : public OS_Unix {
InputDefault *input;
Ref<InputEventKey> deferred_key_event;
CursorShape cursor_shape;
+ String cursors[CURSOR_MAX];
Point2 touches[32];
+ Point2i last_click_pos;
+ uint64_t last_click_ms;
+ int last_click_button_index;
+
MainLoop *main_loop;
AudioDriverJavaScript audio_driver_javascript;
diff --git a/platform/javascript/platform_config.h b/platform/javascript/platform_config.h
index af4cf07393..baba6325b3 100644
--- a/platform/javascript/platform_config.h
+++ b/platform/javascript/platform_config.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/osx/crash_handler_osx.h b/platform/osx/crash_handler_osx.h
index 5d93afb22d..dead90ca90 100644
--- a/platform/osx/crash_handler_osx.h
+++ b/platform/osx/crash_handler_osx.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/osx/crash_handler_osx.mm b/platform/osx/crash_handler_osx.mm
index 490155bb24..6684898085 100644
--- a/platform/osx/crash_handler_osx.mm
+++ b/platform/osx/crash_handler_osx.mm
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/osx/detect.py b/platform/osx/detect.py
index c5bd64b15c..31fcbc0427 100644
--- a/platform/osx/detect.py
+++ b/platform/osx/detect.py
@@ -1,5 +1,6 @@
import os
import sys
+from methods import detect_darwin_sdk_path
def is_active():
@@ -23,6 +24,7 @@ def get_opts():
return [
('osxcross_sdk', 'OSXCross SDK version', 'darwin14'),
+ ('MACOS_SDK_PATH', 'Path to the macOS SDK', ''),
EnumVariable('debug_symbols', 'Add debugging symbols to release builds', 'yes', ('yes', 'no', 'full')),
BoolVariable('separate_debug_symbols', 'Create a separate file containing debugging symbols', False),
]
@@ -40,7 +42,7 @@ def configure(env):
if (env["target"] == "release"):
if (env["optimize"] == "speed"): #optimize for speed (default)
- env.Prepend(CCFLAGS=['-O3', '-ffast-math', '-fomit-frame-pointer', '-ftree-vectorize', '-msse2'])
+ env.Prepend(CCFLAGS=['-O3', '-fomit-frame-pointer', '-ftree-vectorize', '-msse2'])
else: #optimize for size
env.Prepend(CCFLAGS=['-Os','-ftree-vectorize', '-msse2'])
@@ -70,7 +72,11 @@ def configure(env):
## Compiler configuration
- if "OSXCROSS_ROOT" not in os.environ: # regular native build
+ # Save this in environment for use by other modules
+ if "OSXCROSS_ROOT" in os.environ:
+ env["osxcross"] = True
+
+ if not "osxcross" in env: # regular native build
env.Append(CCFLAGS=['-arch', 'x86_64'])
env.Append(LINKFLAGS=['-arch', 'x86_64'])
if (env["macports_clang"] != 'no'):
@@ -84,6 +90,10 @@ def configure(env):
env['AS'] = mpprefix + "/libexec/llvm-" + mpclangver + "/bin/llvm-as"
env.Append(CCFLAGS=['-D__MACPORTS__']) #hack to fix libvpx MM256_BROADCASTSI128_SI256 define
+ detect_darwin_sdk_path('osx', env)
+ env.Append(CPPFLAGS=['-isysroot', '$MACOS_SDK_PATH'])
+ env.Append(LINKFLAGS=['-isysroot', '$MACOS_SDK_PATH'])
+
else: # osxcross build
root = os.environ.get("OSXCROSS_ROOT", 0)
basecmd = root + "/target/bin/x86_64-apple-" + env["osxcross_sdk"] + "-"
diff --git a/platform/osx/dir_access_osx.h b/platform/osx/dir_access_osx.h
index a9d6d63a8e..e1aa038c61 100644
--- a/platform/osx/dir_access_osx.h
+++ b/platform/osx/dir_access_osx.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/osx/dir_access_osx.mm b/platform/osx/dir_access_osx.mm
index cf66cab060..ada142005b 100644
--- a/platform/osx/dir_access_osx.mm
+++ b/platform/osx/dir_access_osx.mm
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/osx/export/export.cpp b/platform/osx/export/export.cpp
index f27c042637..845ef4e893 100644
--- a/platform/osx/export/export.cpp
+++ b/platform/osx/export/export.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -139,10 +139,76 @@ void EditorExportPlatformOSX::get_export_options(List<ExportOption> *r_options)
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "texture_format/etc2"), false));
}
+void _rgba8_to_packbits_encode(int p_ch, int p_size, PoolVector<uint8_t> &p_source, Vector<uint8_t> &p_dest) {
+
+ int src_len = p_size * p_size;
+
+ Vector<uint8_t> result;
+ result.resize(src_len * 1.25); //temp vector for rle encoded data, make it 25% larger for worst case scenario
+ int res_size = 0;
+
+ uint8_t buf[128];
+ int buf_size = 0;
+
+ int i = 0;
+ while (i < src_len) {
+ uint8_t cur = p_source.read()[i * 4 + p_ch];
+
+ if (i < src_len - 2) {
+
+ if ((p_source.read()[(i + 1) * 4 + p_ch] == cur) && (p_source.read()[(i + 2) * 4 + p_ch] == cur)) {
+ if (buf_size > 0) {
+ result.write[res_size++] = (uint8_t)(buf_size - 1);
+ copymem(&result.write[res_size], &buf, buf_size);
+ res_size += buf_size;
+ buf_size = 0;
+ }
+
+ uint8_t lim = i + 130 >= src_len ? src_len - i - 1 : 130;
+ bool hit_lim = true;
+
+ for (int j = 3; j <= lim; j++) {
+ if (p_source.read()[(i + j) * 4 + p_ch] != cur) {
+ hit_lim = false;
+ i = i + j - 1;
+ result.write[res_size++] = (uint8_t)(j - 3 + 0x80);
+ result.write[res_size++] = cur;
+ break;
+ }
+ }
+ if (hit_lim) {
+ result.write[res_size++] = (uint8_t)(lim - 3 + 0x80);
+ result.write[res_size++] = cur;
+ i = i + lim;
+ }
+ } else {
+ buf[buf_size++] = cur;
+ if (buf_size == 128) {
+ result.write[res_size++] = (uint8_t)(buf_size - 1);
+ copymem(&result.write[res_size], &buf, buf_size);
+ res_size += buf_size;
+ buf_size = 0;
+ }
+ }
+ } else {
+ buf[buf_size++] = cur;
+ result.write[res_size++] = (uint8_t)(buf_size - 1);
+ copymem(&result.write[res_size], &buf, buf_size);
+ res_size += buf_size;
+ buf_size = 0;
+ }
+
+ i++;
+ }
+
+ int ofs = p_dest.size();
+ p_dest.resize(p_dest.size() + res_size);
+ copymem(&p_dest.write[ofs], result.ptr(), res_size);
+}
+
void EditorExportPlatformOSX::_make_icon(const Ref<Image> &p_icon, Vector<uint8_t> &p_data) {
Ref<ImageTexture> it = memnew(ImageTexture);
- int size = 512;
Vector<uint8_t> data;
@@ -152,32 +218,82 @@ void EditorExportPlatformOSX::_make_icon(const Ref<Image> &p_icon, Vector<uint8_
data.write[2] = 'n';
data.write[3] = 's';
- const char *name[] = { "ic09", "ic08", "ic07", "icp6", "icp5", "icp4" };
- int index = 0;
-
- while (size >= 16) {
-
+ struct MacOSIconInfo {
+ const char *name;
+ const char *mask_name;
+ bool is_png;
+ int size;
+ };
+
+ static const MacOSIconInfo icon_infos[] = {
+ { "ic10", "", true, 1024 }, //1024x1024 32-bit PNG and 512x512@2x 32-bit "retina" PNG
+ { "ic09", "", true, 512 }, //512×512 32-bit PNG
+ { "ic14", "", true, 512 }, //256x256@2x 32-bit "retina" PNG
+ { "ic08", "", true, 256 }, //256×256 32-bit PNG
+ { "ic13", "", true, 256 }, //128x128@2x 32-bit "retina" PNG
+ { "ic07", "", true, 128 }, //128x128 32-bit PNG
+ { "ic12", "", true, 64 }, //32x32@2x 32-bit "retina" PNG
+ { "ic11", "", true, 32 }, //16x16@2x 32-bit "retina" PNG
+ { "il32", "l8mk", false, 32 }, //32x32 24-bit RLE + 8-bit uncompressed mask
+ { "is32", "s8mk", false, 16 } //16x16 24-bit RLE + 8-bit uncompressed mask
+ };
+
+ for (unsigned int i = 0; i < (sizeof(icon_infos) / sizeof(icon_infos[0])); ++i) {
Ref<Image> copy = p_icon; // does this make sense? doesn't this just increase the reference count instead of making a copy? Do we even need a copy?
copy->convert(Image::FORMAT_RGBA8);
- copy->resize(size, size);
- it->create_from_image(copy);
- String path = EditorSettings::get_singleton()->get_cache_dir().plus_file("icon.png");
- ResourceSaver::save(path, it);
-
- FileAccess *f = FileAccess::open(path, FileAccess::READ);
- ERR_FAIL_COND(!f);
-
- int ofs = data.size();
- uint32_t len = f->get_len();
- data.resize(data.size() + len + 8);
- f->get_buffer(&data.write[ofs + 8], len);
- memdelete(f);
- len += 8;
- len = BSWAP32(len);
- copymem(&data.write[ofs], name[index], 4);
- encode_uint32(len, &data.write[ofs + 4]);
- index++;
- size /= 2;
+ copy->resize(icon_infos[i].size, icon_infos[i].size);
+
+ if (icon_infos[i].is_png) {
+ //encode png icon
+ it->create_from_image(copy);
+ String path = EditorSettings::get_singleton()->get_cache_dir().plus_file("icon.png");
+ ResourceSaver::save(path, it);
+
+ FileAccess *f = FileAccess::open(path, FileAccess::READ);
+ ERR_FAIL_COND(!f);
+
+ int ofs = data.size();
+ uint32_t len = f->get_len();
+ data.resize(data.size() + len + 8);
+ f->get_buffer(&data.write[ofs + 8], len);
+ memdelete(f);
+ len += 8;
+ len = BSWAP32(len);
+ copymem(&data.write[ofs], icon_infos[i].name, 4);
+ encode_uint32(len, &data.write[ofs + 4]);
+ } else {
+ PoolVector<uint8_t> src_data = copy->get_data();
+
+ //encode 24bit RGB RLE icon
+ {
+ int ofs = data.size();
+ data.resize(data.size() + 8);
+
+ _rgba8_to_packbits_encode(0, icon_infos[i].size, src_data, data); // encode R
+ _rgba8_to_packbits_encode(1, icon_infos[i].size, src_data, data); // encode G
+ _rgba8_to_packbits_encode(2, icon_infos[i].size, src_data, data); // encode B
+
+ int len = data.size() - ofs;
+ len = BSWAP32(len);
+ copymem(&data.write[ofs], icon_infos[i].name, 4);
+ encode_uint32(len, &data.write[ofs + 4]);
+ }
+
+ //encode 8bit mask uncompressed icon
+ {
+ int ofs = data.size();
+ int len = copy->get_width() * copy->get_height();
+ data.resize(data.size() + len + 8);
+
+ for (int j = 0; j < len; j++) {
+ data.write[ofs + 8 + j] = src_data.read()[j * 4 + 3];
+ }
+ len += 8;
+ len = BSWAP32(len);
+ copymem(&data.write[ofs], icon_infos[i].mask_name, 4);
+ encode_uint32(len, &data.write[ofs + 4]);
+ }
+ }
}
uint32_t total_len = data.size();
diff --git a/platform/osx/export/export.h b/platform/osx/export/export.h
index 08294fc33c..7e7e697488 100644
--- a/platform/osx/export/export.h
+++ b/platform/osx/export/export.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/osx/godot_main_osx.mm b/platform/osx/godot_main_osx.mm
index 64116fa1e0..79364314aa 100644
--- a/platform/osx/godot_main_osx.mm
+++ b/platform/osx/godot_main_osx.mm
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/osx/joypad_osx.cpp b/platform/osx/joypad_osx.cpp
index 365b39c573..fa124dac11 100644
--- a/platform/osx/joypad_osx.cpp
+++ b/platform/osx/joypad_osx.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/osx/joypad_osx.h b/platform/osx/joypad_osx.h
index addbefc5ad..255a674f09 100644
--- a/platform/osx/joypad_osx.h
+++ b/platform/osx/joypad_osx.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/osx/os_osx.h b/platform/osx/os_osx.h
index 546c88e74a..262079fa89 100644
--- a/platform/osx/os_osx.h
+++ b/platform/osx/os_osx.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -124,8 +124,8 @@ public:
Point2 im_position;
bool im_active;
- ImeCallback im_callback;
- void *im_target;
+ String im_text;
+ Point2 im_selection;
power_osx *power_manager;
@@ -245,7 +245,8 @@ public:
virtual void set_ime_active(const bool p_active);
virtual void set_ime_position(const Point2 &p_pos);
- virtual void set_ime_intermediate_text_callback(ImeCallback p_callback, void *p_inp);
+ virtual Point2 get_ime_selection() const;
+ virtual String get_ime_text() const;
virtual String get_unique_id() const;
diff --git a/platform/osx/os_osx.mm b/platform/osx/os_osx.mm
index 8123aaa427..ddd98ab88c 100644
--- a/platform/osx/os_osx.mm
+++ b/platform/osx/os_osx.mm
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -76,6 +76,13 @@
#define NSWindowStyleMaskBorderless NSBorderlessWindowMask
#endif
+#ifndef NSAppKitVersionNumber10_12
+#define NSAppKitVersionNumber10_12 1504
+#endif
+#ifndef NSAppKitVersionNumber10_14
+#define NSAppKitVersionNumber10_14 1671
+#endif
+
static void get_key_modifier_state(unsigned int p_osx_state, Ref<InputEventWithModifiers> state) {
state->set_shift((p_osx_state & NSEventModifierFlagShift));
@@ -420,11 +427,13 @@ static const NSRange kEmptyRange = { NSNotFound, 0 };
} else {
[markedText initWithString:aString];
}
- if (OS_OSX::singleton->im_callback) {
+ if (OS_OSX::singleton->im_active) {
imeMode = true;
- String ret;
- ret.parse_utf8([[markedText mutableString] UTF8String]);
- OS_OSX::singleton->im_callback(OS_OSX::singleton->im_target, ret, Point2(selectedRange.location, selectedRange.length));
+ OS_OSX::singleton->im_text.parse_utf8([[markedText mutableString] UTF8String]);
+ OS_OSX::singleton->im_selection = Point2(selectedRange.location, selectedRange.length);
+
+ if (OS_OSX::singleton->get_main_loop())
+ OS_OSX::singleton->get_main_loop()->notification(MainLoop::NOTIFICATION_OS_IME_UPDATE);
}
}
@@ -436,8 +445,13 @@ static const NSRange kEmptyRange = { NSNotFound, 0 };
- (void)unmarkText {
imeMode = false;
[[markedText mutableString] setString:@""];
- if (OS_OSX::singleton->im_callback)
- OS_OSX::singleton->im_callback(OS_OSX::singleton->im_target, "", Point2());
+ if (OS_OSX::singleton->im_active) {
+ OS_OSX::singleton->im_text = String();
+ OS_OSX::singleton->im_selection = Point2();
+
+ if (OS_OSX::singleton->get_main_loop())
+ OS_OSX::singleton->get_main_loop()->notification(MainLoop::NOTIFICATION_OS_IME_UPDATE);
+ }
}
- (NSArray *)validAttributesForMarkedText {
@@ -615,6 +629,7 @@ static void _mouseDownEvent(NSEvent *event, int index, int mask, bool pressed) {
const Vector2 pos = get_mouse_pos([event locationInWindow], backingScaleFactor);
mm->set_position(pos);
mm->set_global_position(pos);
+ mm->set_speed(OS_OSX::singleton->input->get_last_mouse_speed());
Vector2 relativeMotion = Vector2();
relativeMotion.x = [event deltaX] * OS_OSX::singleton -> _mouse_scale(backingScaleFactor);
relativeMotion.y = [event deltaY] * OS_OSX::singleton -> _mouse_scale(backingScaleFactor);
@@ -1061,6 +1076,8 @@ static int remapKey(unsigned int key) {
inline void sendScrollEvent(int button, double factor, int modifierFlags) {
+ unsigned int mask = 1 << (button - 1);
+
Ref<InputEventMouseButton> sc;
sc.instance();
@@ -1071,9 +1088,13 @@ inline void sendScrollEvent(int button, double factor, int modifierFlags) {
Vector2 mouse_pos = Vector2(mouse_x, mouse_y);
sc->set_position(mouse_pos);
sc->set_global_position(mouse_pos);
+ button_mask |= mask;
sc->set_button_mask(button_mask);
OS_OSX::singleton->push_input(sc);
+
sc->set_pressed(false);
+ button_mask &= ~mask;
+ sc->set_button_mask(button_mask);
OS_OSX::singleton->push_input(sc);
}
@@ -1129,12 +1150,14 @@ inline void sendPanEvent(double dx, double dy, int modifierFlags) {
@end
-void OS_OSX::set_ime_intermediate_text_callback(ImeCallback p_callback, void *p_inp) {
- im_callback = p_callback;
- im_target = p_inp;
- if (!im_callback) {
- [window_view cancelComposition];
- }
+Point2 OS_OSX::get_ime_selection() const {
+
+ return im_selection;
+}
+
+String OS_OSX::get_ime_text() const {
+
+ return im_text;
}
String OS_OSX::get_unique_id() const {
@@ -1162,10 +1185,14 @@ String OS_OSX::get_unique_id() const {
}
void OS_OSX::set_ime_active(const bool p_active) {
+
im_active = p_active;
+ if (!im_active)
+ [window_view cancelComposition];
}
void OS_OSX::set_ime_position(const Point2 &p_pos) {
+
im_position = p_pos;
}
@@ -1237,7 +1264,7 @@ Error OS_OSX::initialize(const VideoMode &p_desired, int p_video_driver, int p_a
ERR_FAIL_COND_V(window_object == nil, ERR_UNAVAILABLE);
window_view = [[GodotContentView alloc] init];
- if (@available(macOS 10.14, *)) {
+ if (NSAppKitVersionNumber >= NSAppKitVersionNumber10_14) {
[window_view setWantsLayer:TRUE];
}
@@ -1472,7 +1499,7 @@ public:
switch (p_type) {
case ERR_WARNING:
- if (floor(NSAppKitVersionNumber) >= NSAppKitVersionNumber10_12) {
+ if (NSAppKitVersionNumber >= NSAppKitVersionNumber10_12) {
os_log_info(OS_LOG_DEFAULT,
"WARNING: %{public}s: %{public}s\nAt: %{public}s:%i.",
p_function, err_details, p_file, p_line);
@@ -1482,7 +1509,7 @@ public:
logf_error("\E[0;33m At: %s:%i.\E[0m\n", p_file, p_line);
break;
case ERR_SCRIPT:
- if (floor(NSAppKitVersionNumber) >= NSAppKitVersionNumber10_12) {
+ if (NSAppKitVersionNumber >= NSAppKitVersionNumber10_12) {
os_log_error(OS_LOG_DEFAULT,
"SCRIPT ERROR: %{public}s: %{public}s\nAt: %{public}s:%i.",
p_function, err_details, p_file, p_line);
@@ -1492,7 +1519,7 @@ public:
logf_error("\E[0;35m At: %s:%i.\E[0m\n", p_file, p_line);
break;
case ERR_SHADER:
- if (floor(NSAppKitVersionNumber) >= NSAppKitVersionNumber10_12) {
+ if (NSAppKitVersionNumber >= NSAppKitVersionNumber10_12) {
os_log_error(OS_LOG_DEFAULT,
"SHADER ERROR: %{public}s: %{public}s\nAt: %{public}s:%i.",
p_function, err_details, p_file, p_line);
@@ -1503,7 +1530,7 @@ public:
break;
case ERR_ERROR:
default:
- if (floor(NSAppKitVersionNumber) >= NSAppKitVersionNumber10_12) {
+ if (NSAppKitVersionNumber >= NSAppKitVersionNumber10_12) {
os_log_error(OS_LOG_DEFAULT,
"ERROR: %{public}s: %{public}s\nAt: %{public}s:%i.",
p_function, err_details, p_file, p_line);
@@ -1589,7 +1616,8 @@ void OS_OSX::set_cursor_shape(CursorShape p_shape) {
case CURSOR_VSPLIT: [[NSCursor resizeUpDownCursor] set]; break;
case CURSOR_HSPLIT: [[NSCursor resizeLeftRightCursor] set]; break;
case CURSOR_HELP: [[NSCursor arrowCursor] set]; break;
- default: {};
+ default: {
+ };
}
}
@@ -2174,11 +2202,7 @@ void OS_OSX::set_window_size(const Size2 p_size) {
if (menuBarHeight != 0.f) {
size.y += menuBarHeight;
} else {
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= 101200
if (floor(NSAppKitVersionNumber) < NSAppKitVersionNumber10_12) {
-#else
- {
-#endif
size.y += [[NSStatusBar systemStatusBar] thickness];
}
}
@@ -2634,8 +2658,6 @@ OS_OSX::OS_OSX() {
singleton = this;
im_active = false;
im_position = Point2();
- im_callback = NULL;
- im_target = NULL;
layered_window = false;
autoreleasePool = [[NSAutoreleasePool alloc] init];
diff --git a/platform/osx/platform_config.h b/platform/osx/platform_config.h
index 1d32d5b5b9..ddb533cb79 100644
--- a/platform/osx/platform_config.h
+++ b/platform/osx/platform_config.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/osx/power_osx.cpp b/platform/osx/power_osx.cpp
index 22e279dfa7..a7cf9d831f 100644
--- a/platform/osx/power_osx.cpp
+++ b/platform/osx/power_osx.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/osx/power_osx.h b/platform/osx/power_osx.h
index 9ad51e505b..0f18f9f691 100644
--- a/platform/osx/power_osx.h
+++ b/platform/osx/power_osx.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/osx/sem_osx.cpp b/platform/osx/sem_osx.cpp
index 9b42abdb8d..4c3bad4379 100644
--- a/platform/osx/sem_osx.cpp
+++ b/platform/osx/sem_osx.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/osx/sem_osx.h b/platform/osx/sem_osx.h
index 0ab82873c6..563bdfdcb1 100644
--- a/platform/osx/sem_osx.h
+++ b/platform/osx/sem_osx.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/register_platform_apis.h b/platform/register_platform_apis.h
index 1c50eb95e3..10876bacc7 100644
--- a/platform/register_platform_apis.h
+++ b/platform/register_platform_apis.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/server/detect.py b/platform/server/detect.py
index 0b23e9c649..392a987ee9 100644
--- a/platform/server/detect.py
+++ b/platform/server/detect.py
@@ -43,10 +43,10 @@ def configure(env):
## Build type
if (env["target"] == "release"):
- env.Append(CCFLAGS=['-O2', '-ffast-math', '-fomit-frame-pointer'])
+ env.Append(CCFLAGS=['-O2', '-fomit-frame-pointer'])
elif (env["target"] == "release_debug"):
- env.Append(CCFLAGS=['-O2', '-ffast-math', '-DDEBUG_ENABLED'])
+ env.Append(CCFLAGS=['-O2', '-DDEBUG_ENABLED'])
elif (env["target"] == "debug"):
env.Append(CCFLAGS=['-g2', '-DDEBUG_ENABLED', '-DDEBUG_MEMORY_ENABLED'])
diff --git a/platform/server/godot_server.cpp b/platform/server/godot_server.cpp
index 3e48f0bf7f..91bd96ac31 100644
--- a/platform/server/godot_server.cpp
+++ b/platform/server/godot_server.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/server/os_server.cpp b/platform/server/os_server.cpp
index 60f20d6009..9b6e7864e1 100644
--- a/platform/server/os_server.cpp
+++ b/platform/server/os_server.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#include "os_server.h"
#include "core/print_string.h"
@@ -99,7 +100,7 @@ Error OS_Server::initialize(const VideoMode &p_desired, int p_video_driver, int
_ensure_user_data_dir();
- resource_loader_dummy = memnew(ResourceFormatDummyTexture);
+ resource_loader_dummy.instance();
ResourceLoader::add_resource_format_loader(resource_loader_dummy);
return OK;
@@ -118,7 +119,8 @@ void OS_Server::finalize() {
memdelete(power_manager);
- memdelete(resource_loader_dummy);
+ ResourceLoader::remove_resource_format_loader(resource_loader_dummy);
+ resource_loader_dummy.unref();
args.clear();
}
diff --git a/platform/server/os_server.h b/platform/server/os_server.h
index 0367ec3db9..7273a690ca 100644
--- a/platform/server/os_server.h
+++ b/platform/server/os_server.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -27,6 +27,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
+
#ifndef OS_SERVER_H
#define OS_SERVER_H
@@ -77,7 +78,7 @@ class OS_Server : public OS_Unix {
int video_driver_index;
- ResourceFormatDummyTexture *resource_loader_dummy;
+ Ref<ResourceFormatDummyTexture> resource_loader_dummy;
protected:
virtual int get_video_driver_count() const;
diff --git a/platform/server/platform_config.h b/platform/server/platform_config.h
index 26ba8f26c6..bedbff0b80 100644
--- a/platform/server/platform_config.h
+++ b/platform/server/platform_config.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/uwp/app.cpp b/platform/uwp/app.cpp
index b769925849..1b8f9f3f9e 100644
--- a/platform/uwp/app.cpp
+++ b/platform/uwp/app.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/uwp/app.h b/platform/uwp/app.h
index 5f69f2cb0e..d403dace9d 100644
--- a/platform/uwp/app.h
+++ b/platform/uwp/app.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/uwp/export/export.cpp b/platform/uwp/export/export.cpp
index 41e59a5352..6f4898c005 100644
--- a/platform/uwp/export/export.cpp
+++ b/platform/uwp/export/export.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -1134,7 +1134,7 @@ public:
} break;
}
- if (!exists_export_template("uwp_" + platform_infix + "_debug.zip", &err) || !exists_export_template("uwp_" + platform_infix + "_debug.zip", &err)) {
+ if (!exists_export_template("uwp_" + platform_infix + "_debug.zip", &err) || !exists_export_template("uwp_" + platform_infix + "_release.zip", &err)) {
valid = false;
r_missing_templates = true;
}
diff --git a/platform/uwp/export/export.h b/platform/uwp/export/export.h
index bd759c8647..e4839eeda2 100644
--- a/platform/uwp/export/export.h
+++ b/platform/uwp/export/export.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/uwp/gl_context_egl.cpp b/platform/uwp/gl_context_egl.cpp
index 6c60b27f5a..db15be3e06 100644
--- a/platform/uwp/gl_context_egl.cpp
+++ b/platform/uwp/gl_context_egl.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/uwp/gl_context_egl.h b/platform/uwp/gl_context_egl.h
index 3c7115cc34..60feed2e24 100644
--- a/platform/uwp/gl_context_egl.h
+++ b/platform/uwp/gl_context_egl.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/uwp/joypad_uwp.cpp b/platform/uwp/joypad_uwp.cpp
index dcc9f7d3af..0899c7592c 100644
--- a/platform/uwp/joypad_uwp.cpp
+++ b/platform/uwp/joypad_uwp.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/uwp/joypad_uwp.h b/platform/uwp/joypad_uwp.h
index 98202cce9e..31fc9bcd11 100644
--- a/platform/uwp/joypad_uwp.h
+++ b/platform/uwp/joypad_uwp.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/uwp/os_uwp.cpp b/platform/uwp/os_uwp.cpp
index 1f81d476ea..ea0193b8ed 100644
--- a/platform/uwp/os_uwp.cpp
+++ b/platform/uwp/os_uwp.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/uwp/os_uwp.h b/platform/uwp/os_uwp.h
index 9641b9cde9..491c9bce03 100644
--- a/platform/uwp/os_uwp.h
+++ b/platform/uwp/os_uwp.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/uwp/platform_config.h b/platform/uwp/platform_config.h
index 606795479b..311a41454d 100644
--- a/platform/uwp/platform_config.h
+++ b/platform/uwp/platform_config.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/uwp/power_uwp.cpp b/platform/uwp/power_uwp.cpp
index 4eb48d2dd9..ba1311a1b1 100644
--- a/platform/uwp/power_uwp.cpp
+++ b/platform/uwp/power_uwp.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/uwp/power_uwp.h b/platform/uwp/power_uwp.h
index da1cffe8f0..d6623f9340 100644
--- a/platform/uwp/power_uwp.h
+++ b/platform/uwp/power_uwp.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/uwp/thread_uwp.cpp b/platform/uwp/thread_uwp.cpp
index c755204ec4..0e4e138aa6 100644
--- a/platform/uwp/thread_uwp.cpp
+++ b/platform/uwp/thread_uwp.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/uwp/thread_uwp.h b/platform/uwp/thread_uwp.h
index 16e7efb60b..e29b45a903 100644
--- a/platform/uwp/thread_uwp.h
+++ b/platform/uwp/thread_uwp.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/windows/context_gl_win.cpp b/platform/windows/context_gl_win.cpp
index 2d70b00dda..9d267c699f 100644
--- a/platform/windows/context_gl_win.cpp
+++ b/platform/windows/context_gl_win.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/windows/context_gl_win.h b/platform/windows/context_gl_win.h
index 5bcdb433b3..3076bbb1e8 100644
--- a/platform/windows/context_gl_win.h
+++ b/platform/windows/context_gl_win.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/windows/crash_handler_win.cpp b/platform/windows/crash_handler_win.cpp
index 2760e87b8b..1d93c6d8dd 100644
--- a/platform/windows/crash_handler_win.cpp
+++ b/platform/windows/crash_handler_win.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/windows/crash_handler_win.h b/platform/windows/crash_handler_win.h
index 95b1468197..016612a00e 100644
--- a/platform/windows/crash_handler_win.h
+++ b/platform/windows/crash_handler_win.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/windows/ctxgl_procaddr.cpp b/platform/windows/ctxgl_procaddr.cpp
index 434eeea16e..ecff8f7a4d 100644
--- a/platform/windows/ctxgl_procaddr.cpp
+++ b/platform/windows/ctxgl_procaddr.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/windows/ctxgl_procaddr.h b/platform/windows/ctxgl_procaddr.h
index cd229fb8db..cc40804ae6 100644
--- a/platform/windows/ctxgl_procaddr.h
+++ b/platform/windows/ctxgl_procaddr.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/windows/detect.py b/platform/windows/detect.py
index 5d5af17086..e14db9a201 100644
--- a/platform/windows/detect.py
+++ b/platform/windows/detect.py
@@ -147,9 +147,9 @@ def setup_msvc_auto(env):
# Note: actual compiler version can be found in env['MSVC_VERSION'], e.g. "14.1" for VS2015
# Get actual target arch into bits (it may be "default" at this point):
if env['TARGET_ARCH'] in ('amd64', 'x86_64'):
- env['bits'] = 64
+ env['bits'] = '64'
else:
- env['bits'] = 32
+ env['bits'] = '32'
print(" Found MSVC version %s, arch %s, bits=%s" % (env['MSVC_VERSION'], env['TARGET_ARCH'], env['bits']))
if env['TARGET_ARCH'] in ('amd64', 'x86_64'):
env["x86_libtheora_opt_vc"] = False
@@ -262,7 +262,7 @@ def configure_mingw(env):
env.Append(CCFLAGS=['-O2'])
else: #optimize for size
env.Prepend(CCFLAGS=['-Os'])
-
+
env.Append(LINKFLAGS=['-Wl,--subsystem,windows'])
@@ -281,7 +281,7 @@ def configure_mingw(env):
env.Append(CCFLAGS=['-O2'])
else: #optimize for size
env.Prepend(CCFLAGS=['-Os'])
-
+
elif (env["target"] == "debug"):
env.Append(CCFLAGS=['-g3', '-DDEBUG_ENABLED', '-DDEBUG_MEMORY_ENABLED'])
diff --git a/platform/windows/export/export.cpp b/platform/windows/export/export.cpp
index dcaae40b10..ca2f71ca18 100644
--- a/platform/windows/export/export.cpp
+++ b/platform/windows/export/export.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/windows/export/export.h b/platform/windows/export/export.h
index 7f62e8955c..e3431797b4 100644
--- a/platform/windows/export/export.h
+++ b/platform/windows/export/export.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/windows/godot_win.cpp b/platform/windows/godot_win.cpp
index 504a9a0380..0f5065d816 100644
--- a/platform/windows/godot_win.cpp
+++ b/platform/windows/godot_win.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/windows/joypad.cpp b/platform/windows/joypad.cpp
index 7201714fb8..ba05d2e495 100644
--- a/platform/windows/joypad.cpp
+++ b/platform/windows/joypad.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/windows/joypad.h b/platform/windows/joypad.h
index 0d14480733..3a6c0cef9f 100644
--- a/platform/windows/joypad.h
+++ b/platform/windows/joypad.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/windows/key_mapping_win.cpp b/platform/windows/key_mapping_win.cpp
index 80580a63b3..f9b01e5532 100644
--- a/platform/windows/key_mapping_win.cpp
+++ b/platform/windows/key_mapping_win.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/windows/key_mapping_win.h b/platform/windows/key_mapping_win.h
index 340f916e1c..e4f8a61d04 100644
--- a/platform/windows/key_mapping_win.h
+++ b/platform/windows/key_mapping_win.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/windows/lang_table.h b/platform/windows/lang_table.h
index 78bfadfeae..f12893a8dc 100644
--- a/platform/windows/lang_table.h
+++ b/platform/windows/lang_table.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp
index bdf459fd83..3b41f1b901 100644
--- a/platform/windows/os_windows.cpp
+++ b/platform/windows/os_windows.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -496,15 +496,7 @@ LRESULT OS_Windows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
mm->set_shift((wParam & MK_SHIFT) != 0);
mm->set_alt(alt_mem);
- int bmask = 0;
- bmask |= (wParam & MK_LBUTTON) ? (1 << 0) : 0;
- bmask |= (wParam & MK_RBUTTON) ? (1 << 1) : 0;
- bmask |= (wParam & MK_MBUTTON) ? (1 << 2) : 0;
- bmask |= (wParam & MK_XBUTTON1) ? (1 << 7) : 0;
- bmask |= (wParam & MK_XBUTTON2) ? (1 << 8) : 0;
- mm->set_button_mask(bmask);
-
- last_button_state = mm->get_button_mask();
+ mm->set_button_mask(last_button_state);
mm->set_position(Vector2(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)));
mm->set_global_position(Vector2(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)));
@@ -673,15 +665,12 @@ LRESULT OS_Windows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
mb->set_shift((wParam & MK_SHIFT) != 0);
mb->set_alt(alt_mem);
//mb->get_alt()=(wParam&MK_MENU)!=0;
- int bmask = 0;
- bmask |= (wParam & MK_LBUTTON) ? (1 << 0) : 0;
- bmask |= (wParam & MK_RBUTTON) ? (1 << 1) : 0;
- bmask |= (wParam & MK_MBUTTON) ? (1 << 2) : 0;
- bmask |= (wParam & MK_XBUTTON1) ? (1 << 7) : 0;
- bmask |= (wParam & MK_XBUTTON2) ? (1 << 8) : 0;
- mb->set_button_mask(bmask);
-
- last_button_state = mb->get_button_mask();
+ if (mb->is_pressed())
+ last_button_state |= (1 << (mb->get_button_index() - 1));
+ else
+ last_button_state &= ~(1 << (mb->get_button_index() - 1));
+ mb->set_button_mask(last_button_state);
+
mb->set_position(Vector2(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)));
if (mouse_mode == MOUSE_MODE_CAPTURED && !use_raw_input) {
@@ -721,22 +710,36 @@ LRESULT OS_Windows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
if (mb->is_pressed() && mb->get_button_index() > 3 && mb->get_button_index() < 8) {
//send release for mouse wheel
Ref<InputEventMouseButton> mbd = mb->duplicate();
+ last_button_state &= ~(1 << (mbd->get_button_index() - 1));
+ mbd->set_button_mask(last_button_state);
mbd->set_pressed(false);
input->parse_input_event(mbd);
}
}
} break;
+ case WM_MOVE: {
+ if (!IsIconic(hWnd)) {
+ int x = LOWORD(lParam);
+ int y = HIWORD(lParam);
+ last_pos = Point2(x, y);
+ }
+ } break;
+
case WM_SIZE: {
- int window_w = LOWORD(lParam);
- int window_h = HIWORD(lParam);
- if (window_w > 0 && window_h > 0 && !preserve_window_size) {
- video_mode.width = window_w;
- video_mode.height = window_h;
- } else {
- preserve_window_size = false;
- set_window_size(Size2(video_mode.width, video_mode.height));
+ // Ignore size when a SIZE_MINIMIZED event is triggered
+ if (wParam != SIZE_MINIMIZED) {
+ int window_w = LOWORD(lParam);
+ int window_h = HIWORD(lParam);
+ if (window_w > 0 && window_h > 0 && !preserve_window_size) {
+ video_mode.width = window_w;
+ video_mode.height = window_h;
+ } else {
+ preserve_window_size = false;
+ set_window_size(Size2(video_mode.width, video_mode.height));
+ }
}
+
if (wParam == SIZE_MAXIMIZED) {
maximized = true;
minimized = false;
@@ -1685,6 +1688,10 @@ int OS_Windows::get_screen_dpi(int p_screen) const {
Point2 OS_Windows::get_window_position() const {
+ if (minimized) {
+ return last_pos;
+ }
+
RECT r;
GetWindowRect(hWnd, &r);
return Point2(r.left, r.top);
@@ -1705,9 +1712,15 @@ void OS_Windows::set_window_position(const Point2 &p_position) {
ClientToScreen(hWnd, (POINT *)&rect.right);
ClipCursor(&rect);
}
+
+ last_pos = p_position;
}
Size2 OS_Windows::get_window_size() const {
+ if (minimized) {
+ return Size2(video_mode.width, video_mode.height);
+ }
+
RECT r;
if (GetClientRect(hWnd, &r)) { // Only area inside of window border
return Size2(r.right - r.left, r.bottom - r.top);
@@ -2129,8 +2142,13 @@ uint64_t OS_Windows::get_unix_time() const {
uint64_t OS_Windows::get_system_time_secs() const {
- const uint64_t WINDOWS_TICK = 10000000;
- const uint64_t SEC_TO_UNIX_EPOCH = 11644473600LL;
+ return get_system_time_msecs() / 1000;
+}
+
+uint64_t OS_Windows::get_system_time_msecs() const {
+
+ const uint64_t WINDOWS_TICK = 10000;
+ const uint64_t MSEC_TO_UNIX_EPOCH = 11644473600000LL;
SYSTEMTIME st;
GetSystemTime(&st);
@@ -2141,7 +2159,7 @@ uint64_t OS_Windows::get_system_time_secs() const {
ret <<= 32;
ret |= ft.dwLowDateTime;
- return (uint64_t)(ret / WINDOWS_TICK - SEC_TO_UNIX_EPOCH);
+ return (uint64_t)(ret / WINDOWS_TICK - MSEC_TO_UNIX_EPOCH);
}
void OS_Windows::delay_usec(uint32_t p_usec) const {
diff --git a/platform/windows/os_windows.h b/platform/windows/os_windows.h
index 6aadd6994c..4936a69120 100644
--- a/platform/windows/os_windows.h
+++ b/platform/windows/os_windows.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -93,6 +93,7 @@ class OS_Windows : public OS {
HDC hDC; // Private GDI Device Context
HINSTANCE hInstance; // Holds The Instance Of The Application
HWND hWnd;
+ Point2 last_pos;
HBITMAP hBitmap; //DIB section for layered window
uint8_t *dib_data;
@@ -253,6 +254,7 @@ public:
virtual TimeZoneInfo get_time_zone_info() const;
virtual uint64_t get_unix_time() const;
virtual uint64_t get_system_time_secs() const;
+ virtual uint64_t get_system_time_msecs() const;
virtual bool can_draw() const;
virtual Error set_cwd(const String &p_cwd);
diff --git a/platform/windows/platform_config.h b/platform/windows/platform_config.h
index aa020ed470..8a4aab5c36 100644
--- a/platform/windows/platform_config.h
+++ b/platform/windows/platform_config.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/windows/power_windows.cpp b/platform/windows/power_windows.cpp
index 5612906251..b96ae51132 100644
--- a/platform/windows/power_windows.cpp
+++ b/platform/windows/power_windows.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/windows/power_windows.h b/platform/windows/power_windows.h
index 4984b473ca..4d83d75e00 100644
--- a/platform/windows/power_windows.h
+++ b/platform/windows/power_windows.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/windows/windows_terminal_logger.cpp b/platform/windows/windows_terminal_logger.cpp
index 12a4a1ae39..7def419103 100644
--- a/platform/windows/windows_terminal_logger.cpp
+++ b/platform/windows/windows_terminal_logger.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/windows/windows_terminal_logger.h b/platform/windows/windows_terminal_logger.h
index 1cd1941b8a..475e1f25ab 100644
--- a/platform/windows/windows_terminal_logger.h
+++ b/platform/windows/windows_terminal_logger.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/x11/context_gl_x11.cpp b/platform/x11/context_gl_x11.cpp
index 8c1869a1f1..aadf7ee36d 100644
--- a/platform/x11/context_gl_x11.cpp
+++ b/platform/x11/context_gl_x11.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/x11/context_gl_x11.h b/platform/x11/context_gl_x11.h
index be3083d957..02455ce005 100644
--- a/platform/x11/context_gl_x11.h
+++ b/platform/x11/context_gl_x11.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/x11/crash_handler_x11.cpp b/platform/x11/crash_handler_x11.cpp
index 79c3d9aece..8737a2b92b 100644
--- a/platform/x11/crash_handler_x11.cpp
+++ b/platform/x11/crash_handler_x11.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/x11/crash_handler_x11.h b/platform/x11/crash_handler_x11.h
index 49ca0df9a8..6efdd33d9d 100644
--- a/platform/x11/crash_handler_x11.h
+++ b/platform/x11/crash_handler_x11.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/x11/detect.py b/platform/x11/detect.py
index 524c8448bc..415e8ceaa6 100644
--- a/platform/x11/detect.py
+++ b/platform/x11/detect.py
@@ -48,6 +48,11 @@ def can_build():
print("xrender not found.. x11 disabled.")
return False
+ x11_error = os.system("pkg-config xi --modversion > /dev/null ")
+ if (x11_error):
+ print("xi not found.. Aborting.")
+ return False
+
return True
def get_opts():
@@ -81,10 +86,8 @@ def configure(env):
## Build type
if (env["target"] == "release"):
- # -O3 -ffast-math is identical to -Ofast. We need to split it out so we can selectively disable
- # -ffast-math in code for which it generates wrong results.
if (env["optimize"] == "speed"): #optimize for speed (default)
- env.Prepend(CCFLAGS=['-O3', '-ffast-math'])
+ env.Prepend(CCFLAGS=['-O3'])
else: #optimize for size
env.Prepend(CCFLAGS=['-Os'])
@@ -95,7 +98,7 @@ def configure(env):
elif (env["target"] == "release_debug"):
if (env["optimize"] == "speed"): #optimize for speed (default)
- env.Prepend(CCFLAGS=['-O2', '-ffast-math', '-DDEBUG_ENABLED'])
+ env.Prepend(CCFLAGS=['-O2', '-DDEBUG_ENABLED'])
else: #optimize for size
env.Prepend(CCFLAGS=['-Os', '-DDEBUG_ENABLED'])
@@ -170,13 +173,9 @@ def configure(env):
env.ParseConfig('pkg-config xinerama --cflags --libs')
env.ParseConfig('pkg-config xrandr --cflags --libs')
env.ParseConfig('pkg-config xrender --cflags --libs')
+ env.ParseConfig('pkg-config xi --cflags --libs')
if (env['touch']):
- x11_error = os.system("pkg-config xi --modversion > /dev/null ")
- if (x11_error):
- print("xi not found.. cannot build with touch. Aborting.")
- sys.exit(255)
- env.ParseConfig('pkg-config xi --cflags --libs')
env.Append(CPPFLAGS=['-DTOUCH_ENABLED'])
# FIXME: Check for existence of the libs before parsing their flags with pkg-config
diff --git a/platform/x11/export/export.cpp b/platform/x11/export/export.cpp
index 904aceaca0..f7d98c1d68 100644
--- a/platform/x11/export/export.cpp
+++ b/platform/x11/export/export.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/x11/export/export.h b/platform/x11/export/export.h
index ac44cef8f7..61b9a77524 100644
--- a/platform/x11/export/export.h
+++ b/platform/x11/export/export.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/x11/godot_x11.cpp b/platform/x11/godot_x11.cpp
index 21148f8e86..79407cd9dc 100644
--- a/platform/x11/godot_x11.cpp
+++ b/platform/x11/godot_x11.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/x11/joypad_linux.cpp b/platform/x11/joypad_linux.cpp
index aff9a50bd6..907c652ab4 100644
--- a/platform/x11/joypad_linux.cpp
+++ b/platform/x11/joypad_linux.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/x11/joypad_linux.h b/platform/x11/joypad_linux.h
index 34b240abf1..b5904ce90b 100644
--- a/platform/x11/joypad_linux.h
+++ b/platform/x11/joypad_linux.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/x11/key_mapping_x11.cpp b/platform/x11/key_mapping_x11.cpp
index 423e2737ee..9b5dfa4793 100644
--- a/platform/x11/key_mapping_x11.cpp
+++ b/platform/x11/key_mapping_x11.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/x11/key_mapping_x11.h b/platform/x11/key_mapping_x11.h
index 6f05941c19..853fe7954a 100644
--- a/platform/x11/key_mapping_x11.h
+++ b/platform/x11/key_mapping_x11.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/x11/os_x11.cpp b/platform/x11/os_x11.cpp
index 2ab7b835b6..0db79fa3e9 100644
--- a/platform/x11/os_x11.cpp
+++ b/platform/x11/os_x11.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -77,6 +77,13 @@
#include <X11/XKBlib.h>
+// 2.2 is the first release with multitouch
+#define XINPUT_CLIENT_VERSION_MAJOR 2
+#define XINPUT_CLIENT_VERSION_MINOR 2
+
+static const double abs_resolution_mult = 10000.0;
+static const double abs_resolution_range_mult = 10.0;
+
void OS_X11::initialize_core() {
crash_handler.initialize();
@@ -96,6 +103,8 @@ Error OS_X11::initialize(const VideoMode &p_desired, int p_video_driver, int p_a
xmbstring = NULL;
x11_window = 0;
last_click_ms = 0;
+ last_click_button_index = -1;
+ last_click_pos = Point2(-100, -100);
args = OS::get_singleton()->get_cmdline_args();
current_videomode = p_desired;
main_loop = NULL;
@@ -168,48 +177,12 @@ Error OS_X11::initialize(const VideoMode &p_desired, int p_video_driver, int p_a
}
}
-#ifdef TOUCH_ENABLED
- if (!XQueryExtension(x11_display, "XInputExtension", &touch.opcode, &event_base, &error_base)) {
- print_verbose("XInput extension not available, touch support disabled.");
- } else {
- // 2.2 is the first release with multitouch
- int xi_major = 2;
- int xi_minor = 2;
- if (XIQueryVersion(x11_display, &xi_major, &xi_minor) != Success) {
- print_verbose(vformat("XInput 2.2 not available (server supports %d.%d), touch support disabled.", xi_major, xi_minor));
- touch.opcode = 0;
- } else {
- int dev_count;
- XIDeviceInfo *info = XIQueryDevice(x11_display, XIAllDevices, &dev_count);
-
- for (int i = 0; i < dev_count; i++) {
- XIDeviceInfo *dev = &info[i];
- if (!dev->enabled)
- continue;
- if (!(dev->use == XIMasterPointer || dev->use == XIFloatingSlave))
- continue;
-
- bool direct_touch = false;
- for (int j = 0; j < dev->num_classes; j++) {
- if (dev->classes[j]->type == XITouchClass && ((XITouchClassInfo *)dev->classes[j])->mode == XIDirectTouch) {
- direct_touch = true;
- break;
- }
- }
- if (direct_touch) {
- touch.devices.push_back(dev->deviceid);
- print_verbose("XInput: Using touch device: " + String(dev->name));
- }
- }
-
- XIFreeDeviceInfo(info);
-
- if (!touch.devices.size()) {
- print_verbose("XInput: No touch devices found.");
- }
- }
+ if (!refresh_device_info()) {
+ OS::get_singleton()->alert("Your system does not support XInput 2.\n"
+ "Please upgrade your distribution.",
+ "Unable to initialize XInput");
+ return ERR_UNAVAILABLE;
}
-#endif
xim = XOpenIM(x11_display, NULL, NULL, NULL);
@@ -270,7 +243,26 @@ Error OS_X11::initialize(const VideoMode &p_desired, int p_video_driver, int p_a
// Set DRI_PRIME if not set. This means that Godot should default to a higher-power GPU if it exists.
// Note: Due to the final '0' parameter to setenv any existing DRI_PRIME environment variables will not
// be overwritten.
- setenv("DRI_PRIME", "1", 0);
+ bool enable_dri_prime = true;
+ // Check if Nouveau is loaded, we don't want to force dGPU usage with that driver.
+ if (FileAccess *f = FileAccess::open("/proc/modules", FileAccess::READ)) {
+ // Match driver name + space
+ String nouveau_str = "nouveau ";
+
+ while (!f->eof_reached()) {
+ String line = f->get_line();
+
+ if (line.begins_with(nouveau_str)) {
+ enable_dri_prime = false;
+ break;
+ }
+ }
+ f->close();
+ memdelete(f);
+ }
+ if (enable_dri_prime) {
+ setenv("DRI_PRIME", "1", 0);
+ }
ContextGL_X11::ContextType opengl_api_type = ContextGL_X11::GLES_3_0_COMPATIBLE;
@@ -369,7 +361,7 @@ Error OS_X11::initialize(const VideoMode &p_desired, int p_video_driver, int p_a
}
// disable resizable window
- if (!current_videomode.resizable) {
+ if (!current_videomode.resizable && !current_videomode.fullscreen) {
XSizeHints *xsh;
xsh = XAllocSizeHints();
xsh->flags = PMinSize | PMaxSize;
@@ -413,34 +405,42 @@ Error OS_X11::initialize(const VideoMode &p_desired, int p_video_driver, int p_a
XChangeWindowAttributes(x11_display, x11_window, CWEventMask, &new_attr);
-#ifdef TOUCH_ENABLED
- if (touch.devices.size()) {
-
- // Must be alive after this block
- static unsigned char mask_data[XIMaskLen(XI_LASTEVENT)] = {};
+ static unsigned char all_mask_data[XIMaskLen(XI_LASTEVENT)] = {};
+ static unsigned char all_master_mask_data[XIMaskLen(XI_LASTEVENT)] = {};
- touch.event_mask.deviceid = XIAllDevices;
- touch.event_mask.mask_len = sizeof(mask_data);
- touch.event_mask.mask = mask_data;
+ xi.all_event_mask.deviceid = XIAllDevices;
+ xi.all_event_mask.mask_len = sizeof(all_mask_data);
+ xi.all_event_mask.mask = all_mask_data;
- XISetMask(touch.event_mask.mask, XI_TouchBegin);
- XISetMask(touch.event_mask.mask, XI_TouchUpdate);
- XISetMask(touch.event_mask.mask, XI_TouchEnd);
- XISetMask(touch.event_mask.mask, XI_TouchOwnership);
+ xi.all_master_event_mask.deviceid = XIAllMasterDevices;
+ xi.all_master_event_mask.mask_len = sizeof(all_master_mask_data);
+ xi.all_master_event_mask.mask = all_master_mask_data;
- XISelectEvents(x11_display, x11_window, &touch.event_mask, 1);
+ XISetMask(xi.all_event_mask.mask, XI_HierarchyChanged);
+ XISetMask(xi.all_master_event_mask.mask, XI_DeviceChanged);
+ XISetMask(xi.all_master_event_mask.mask, XI_RawMotion);
- // Disabled by now since grabbing also blocks mouse events
- // (they are received as extended events instead of standard events)
- /*XIClearMask(touch.event_mask.mask, XI_TouchOwnership);
-
- // Grab touch devices to avoid OS gesture interference
- for (int i = 0; i < touch.devices.size(); ++i) {
- XIGrabDevice(x11_display, touch.devices[i], x11_window, CurrentTime, None, XIGrabModeAsync, XIGrabModeAsync, False, &touch.event_mask);
- }*/
+#ifdef TOUCH_ENABLED
+ if (xi.touch_devices.size()) {
+ XISetMask(xi.all_event_mask.mask, XI_TouchBegin);
+ XISetMask(xi.all_event_mask.mask, XI_TouchUpdate);
+ XISetMask(xi.all_event_mask.mask, XI_TouchEnd);
+ XISetMask(xi.all_event_mask.mask, XI_TouchOwnership);
}
#endif
+ XISelectEvents(x11_display, x11_window, &xi.all_event_mask, 1);
+ XISelectEvents(x11_display, DefaultRootWindow(x11_display), &xi.all_master_event_mask, 1);
+
+ // Disabled by now since grabbing also blocks mouse events
+ // (they are received as extended events instead of standard events)
+ /*XIClearMask(xi.touch_event_mask.mask, XI_TouchOwnership);
+
+ // Grab touch devices to avoid OS gesture interference
+ for (int i = 0; i < xi.touch_devices.size(); ++i) {
+ XIGrabDevice(x11_display, xi.touch_devices[i], x11_window, CurrentTime, None, XIGrabModeAsync, XIGrabModeAsync, False, &xi.touch_event_mask);
+ }*/
+
/* set the titlebar name */
XStoreName(x11_display, x11_window, "Godot");
@@ -590,6 +590,101 @@ Error OS_X11::initialize(const VideoMode &p_desired, int p_video_driver, int p_a
return OK;
}
+bool OS_X11::refresh_device_info() {
+ int event_base, error_base;
+
+ print_verbose("XInput: Refreshing devices.");
+
+ if (!XQueryExtension(x11_display, "XInputExtension", &xi.opcode, &event_base, &error_base)) {
+ print_verbose("XInput extension not available. Please upgrade your distribution.");
+ return false;
+ }
+
+ int xi_major_query = XINPUT_CLIENT_VERSION_MAJOR;
+ int xi_minor_query = XINPUT_CLIENT_VERSION_MINOR;
+
+ if (XIQueryVersion(x11_display, &xi_major_query, &xi_minor_query) != Success) {
+ print_verbose(vformat("XInput 2 not available (server supports %d.%d).", xi_major_query, xi_minor_query));
+ xi.opcode = 0;
+ return false;
+ }
+
+ if (xi_major_query < XINPUT_CLIENT_VERSION_MAJOR || (xi_major_query == XINPUT_CLIENT_VERSION_MAJOR && xi_minor_query < XINPUT_CLIENT_VERSION_MINOR)) {
+ print_verbose(vformat("XInput %d.%d not available (server supports %d.%d). Touch input unavailable.",
+ XINPUT_CLIENT_VERSION_MAJOR, XINPUT_CLIENT_VERSION_MINOR, xi_major_query, xi_minor_query));
+ }
+
+ xi.absolute_devices.clear();
+ xi.touch_devices.clear();
+
+ int dev_count;
+ XIDeviceInfo *info = XIQueryDevice(x11_display, XIAllDevices, &dev_count);
+
+ for (int i = 0; i < dev_count; i++) {
+ XIDeviceInfo *dev = &info[i];
+ if (!dev->enabled)
+ continue;
+ if (!(dev->use == XIMasterPointer || dev->use == XIFloatingSlave))
+ continue;
+
+ bool direct_touch = false;
+ bool absolute_mode = false;
+ int resolution_x = 0;
+ int resolution_y = 0;
+ int range_min_x = 0;
+ int range_min_y = 0;
+ int range_max_x = 0;
+ int range_max_y = 0;
+ for (int j = 0; j < dev->num_classes; j++) {
+#ifdef TOUCH_ENABLED
+ if (dev->classes[j]->type == XITouchClass && ((XITouchClassInfo *)dev->classes[j])->mode == XIDirectTouch) {
+ direct_touch = true;
+ }
+#endif
+ if (dev->classes[j]->type == XIValuatorClass) {
+ XIValuatorClassInfo *class_info = (XIValuatorClassInfo *)dev->classes[j];
+
+ if (class_info->number == 0 && class_info->mode == XIModeAbsolute) {
+ resolution_x = class_info->resolution;
+ range_min_x = class_info->min;
+ range_max_x = class_info->max;
+ absolute_mode = true;
+ } else if (class_info->number == 1 && class_info->mode == XIModeAbsolute) {
+ resolution_y = class_info->resolution;
+ range_min_y = class_info->min;
+ range_max_y = class_info->max;
+ absolute_mode = true;
+ }
+ }
+ }
+ if (direct_touch) {
+ xi.touch_devices.push_back(dev->deviceid);
+ print_verbose("XInput: Using touch device: " + String(dev->name));
+ }
+ if (absolute_mode) {
+ // If no resolution was reported, use the min/max ranges.
+ if (resolution_x <= 0) {
+ resolution_x = (range_max_x - range_min_x) * abs_resolution_range_mult;
+ }
+ if (resolution_y <= 0) {
+ resolution_y = (range_max_y - range_min_y) * abs_resolution_range_mult;
+ }
+
+ xi.absolute_devices[dev->deviceid] = Vector2(abs_resolution_mult / resolution_x, abs_resolution_mult / resolution_y);
+ print_verbose("XInput: Absolute pointing device: " + String(dev->name));
+ }
+ }
+
+ XIFreeDeviceInfo(info);
+#ifdef TOUCH_ENABLED
+ if (!xi.touch_devices.size()) {
+ print_verbose("XInput: No touch devices found.");
+ }
+#endif
+
+ return true;
+}
+
void OS_X11::xim_destroy_callback(::XIM im, ::XPointer client_data,
::XPointer call_data) {
@@ -662,10 +757,10 @@ void OS_X11::finalize() {
#ifdef JOYDEV_ENABLED
memdelete(joypad);
#endif
-#ifdef TOUCH_ENABLED
- touch.devices.clear();
- touch.state.clear();
-#endif
+
+ xi.touch_devices.clear();
+ xi.state.clear();
+
memdelete(input);
visual_server->finish();
@@ -725,21 +820,8 @@ void OS_X11::set_mouse_mode(MouseMode p_mode) {
if (mouse_mode == MOUSE_MODE_CAPTURED || mouse_mode == MOUSE_MODE_CONFINED) {
- while (true) {
- //flush pending motion events
-
- if (XPending(x11_display) > 0) {
- XEvent event;
- XPeekEvent(x11_display, &event);
- if (event.type == MotionNotify) {
- XNextEvent(x11_display, &event);
- } else {
- break;
- }
- } else {
- break;
- }
- }
+ //flush pending motion events
+ flush_mouse_motion();
if (XGrabPointer(
x11_display, x11_window, True,
@@ -780,6 +862,32 @@ void OS_X11::warp_mouse_position(const Point2 &p_to) {
}
}
+void OS_X11::flush_mouse_motion() {
+ while (true) {
+ if (XPending(x11_display) > 0) {
+ XEvent event;
+ XPeekEvent(x11_display, &event);
+
+ if (XGetEventData(x11_display, &event.xcookie) && event.xcookie.type == GenericEvent && event.xcookie.extension == xi.opcode) {
+ XIDeviceEvent *event_data = (XIDeviceEvent *)event.xcookie.data;
+
+ if (event_data->evtype == XI_RawMotion) {
+ XNextEvent(x11_display, &event);
+ } else {
+ break;
+ }
+ } else {
+ break;
+ }
+ } else {
+ break;
+ }
+ }
+
+ xi.relative_motion.x = 0;
+ xi.relative_motion.y = 0;
+}
+
OS::MouseMode OS_X11::get_mouse_mode() const {
return mouse_mode;
}
@@ -1433,37 +1541,17 @@ void OS_X11::get_key_modifier_state(unsigned int p_x11_state, Ref<InputEventWith
state->set_metakey((p_x11_state & Mod4Mask));
}
-unsigned int OS_X11::get_mouse_button_state(unsigned int p_x11_state) {
+unsigned int OS_X11::get_mouse_button_state(unsigned int p_x11_button, int p_x11_type) {
- unsigned int state = 0;
+ unsigned int mask = 1 << (p_x11_button - 1);
- if (p_x11_state & Button1Mask) {
-
- state |= 1 << 0;
- }
-
- if (p_x11_state & Button3Mask) {
-
- state |= 1 << 1;
- }
-
- if (p_x11_state & Button2Mask) {
-
- state |= 1 << 2;
- }
-
- if (p_x11_state & Button4Mask) {
-
- state |= 1 << 3;
- }
-
- if (p_x11_state & Button5Mask) {
-
- state |= 1 << 4;
+ if (p_x11_type == ButtonPress) {
+ last_button_state |= mask;
+ } else {
+ last_button_state &= ~mask;
}
- last_button_state = state;
- return state;
+ return last_button_state;
}
void OS_X11::handle_key_event(XKeyEvent *p_event, bool p_echo) {
@@ -1796,17 +1884,72 @@ void OS_X11::process_xevents() {
continue;
}
-#ifdef TOUCH_ENABLED
if (XGetEventData(x11_display, &event.xcookie)) {
- if (event.xcookie.type == GenericEvent && event.xcookie.extension == touch.opcode) {
+ if (event.xcookie.type == GenericEvent && event.xcookie.extension == xi.opcode) {
XIDeviceEvent *event_data = (XIDeviceEvent *)event.xcookie.data;
int index = event_data->detail;
Vector2 pos = Vector2(event_data->event_x, event_data->event_y);
switch (event_data->evtype) {
+ case XI_HierarchyChanged:
+ case XI_DeviceChanged: {
+ refresh_device_info();
+ } break;
+ case XI_RawMotion: {
+ XIRawEvent *raw_event = (XIRawEvent *)event_data;
+ int device_id = raw_event->deviceid;
+
+ // Determine the axis used (called valuators in XInput for some forsaken reason)
+ // Mask is a bitmask indicating which axes are involved.
+ // We are interested in the values of axes 0 and 1.
+ if (raw_event->valuators.mask_len <= 0) {
+ break;
+ }
+
+ const double *values = raw_event->raw_values;
+ double rel_x = 0.0;
+ double rel_y = 0.0;
+
+ if (XIMaskIsSet(raw_event->valuators.mask, 0)) {
+ rel_x = *values;
+ values++;
+ }
+
+ if (XIMaskIsSet(raw_event->valuators.mask, 1)) {
+ rel_y = *values;
+ }
+
+ // https://bugs.freedesktop.org/show_bug.cgi?id=71609
+ // http://lists.libsdl.org/pipermail/commits-libsdl.org/2015-June/000282.html
+ if (raw_event->time == xi.last_relative_time && rel_x == xi.relative_motion.x && rel_y == xi.relative_motion.y) {
+ break; // Flush duplicate to avoid overly fast motion
+ }
+
+ xi.old_raw_pos.x = xi.raw_pos.x;
+ xi.old_raw_pos.y = xi.raw_pos.y;
+ xi.raw_pos.x = rel_x;
+ xi.raw_pos.y = rel_y;
+
+ Map<int, Vector2>::Element *abs_info = xi.absolute_devices.find(device_id);
+
+ if (abs_info) {
+ // Absolute mode device
+ Vector2 mult = abs_info->value();
+
+ xi.relative_motion.x += (xi.raw_pos.x - xi.old_raw_pos.x) * mult.x;
+ xi.relative_motion.y += (xi.raw_pos.y - xi.old_raw_pos.y) * mult.y;
+ } else {
+ // Relative mode device
+ xi.relative_motion.x = xi.raw_pos.x;
+ xi.relative_motion.y = xi.raw_pos.y;
+ }
+
+ xi.last_relative_time = raw_event->time;
+ } break;
+#ifdef TOUCH_ENABLED
case XI_TouchBegin: // Fall-through
// Disabled hand-in-hand with the grabbing
//XIAllowTouchEvents(x11_display, event_data->deviceid, event_data->detail, x11_window, XIAcceptTouch);
@@ -1822,26 +1965,26 @@ void OS_X11::process_xevents() {
st->set_pressed(is_begin);
if (is_begin) {
- if (touch.state.has(index)) // Defensive
+ if (xi.state.has(index)) // Defensive
break;
- touch.state[index] = pos;
- if (touch.state.size() == 1) {
+ xi.state[index] = pos;
+ if (xi.state.size() == 1) {
// X11 may send a motion event when a touch gesture begins, that would result
// in a spurious mouse motion event being sent to Godot; remember it to be able to filter it out
- touch.mouse_pos_to_filter = pos;
+ xi.mouse_pos_to_filter = pos;
}
input->parse_input_event(st);
} else {
- if (!touch.state.has(index)) // Defensive
+ if (!xi.state.has(index)) // Defensive
break;
- touch.state.erase(index);
+ xi.state.erase(index);
input->parse_input_event(st);
}
} break;
case XI_TouchUpdate: {
- Map<int, Vector2>::Element *curr_pos_elem = touch.state.find(index);
+ Map<int, Vector2>::Element *curr_pos_elem = xi.state.find(index);
if (!curr_pos_elem) { // Defensive
break;
}
@@ -1858,11 +2001,11 @@ void OS_X11::process_xevents() {
curr_pos_elem->value() = pos;
}
} break;
+#endif
}
}
}
XFreeEventData(x11_display, &event.xcookie);
-#endif
switch (event.type) {
case Expose:
@@ -1908,8 +2051,8 @@ void OS_X11::process_xevents() {
}
#ifdef TOUCH_ENABLED
// Grab touch devices to avoid OS gesture interference
- /*for (int i = 0; i < touch.devices.size(); ++i) {
- XIGrabDevice(x11_display, touch.devices[i], x11_window, CurrentTime, None, XIGrabModeAsync, XIGrabModeAsync, False, &touch.event_mask);
+ /*for (int i = 0; i < xi.touch_devices.size(); ++i) {
+ XIGrabDevice(x11_display, xi.touch_devices[i], x11_window, CurrentTime, None, XIGrabModeAsync, XIGrabModeAsync, False, &xi.touch_event_mask);
}*/
#endif
if (xic) {
@@ -1930,12 +2073,12 @@ void OS_X11::process_xevents() {
}
#ifdef TOUCH_ENABLED
// Ungrab touch devices so input works as usual while we are unfocused
- /*for (int i = 0; i < touch.devices.size(); ++i) {
- XIUngrabDevice(x11_display, touch.devices[i], CurrentTime);
+ /*for (int i = 0; i < xi.touch_devices.size(); ++i) {
+ XIUngrabDevice(x11_display, xi.touch_devices[i], CurrentTime);
}*/
// Release every pointer to avoid sticky points
- for (Map<int, Vector2>::Element *E = touch.state.front(); E; E = E->next()) {
+ for (Map<int, Vector2>::Element *E = xi.state.front(); E; E = E->next()) {
Ref<InputEventScreenTouch> st;
st.instance();
@@ -1943,7 +2086,7 @@ void OS_X11::process_xevents() {
st->set_position(E->get());
input->parse_input_event(st);
}
- touch.state.clear();
+ xi.state.clear();
#endif
if (xic) {
XUnsetICFocus(xic);
@@ -1967,28 +2110,36 @@ void OS_X11::process_xevents() {
mb.instance();
get_key_modifier_state(event.xbutton.state, mb);
- mb->set_button_mask(get_mouse_button_state(event.xbutton.state));
- mb->set_position(Vector2(event.xbutton.x, event.xbutton.y));
- mb->set_global_position(mb->get_position());
mb->set_button_index(event.xbutton.button);
if (mb->get_button_index() == 2)
mb->set_button_index(3);
else if (mb->get_button_index() == 3)
mb->set_button_index(2);
+ mb->set_button_mask(get_mouse_button_state(mb->get_button_index(), event.xbutton.type));
+ mb->set_position(Vector2(event.xbutton.x, event.xbutton.y));
+ mb->set_global_position(mb->get_position());
mb->set_pressed((event.type == ButtonPress));
- if (event.type == ButtonPress && event.xbutton.button == 1) {
+ if (event.type == ButtonPress) {
uint64_t diff = get_ticks_usec() / 1000 - last_click_ms;
- if (diff < 400 && Point2(last_click_pos).distance_to(Point2(event.xbutton.x, event.xbutton.y)) < 5) {
+ if (mb->get_button_index() == last_click_button_index) {
- last_click_ms = 0;
- last_click_pos = Point2(-100, -100);
- mb->set_doubleclick(true);
+ if (diff < 400 && Point2(last_click_pos).distance_to(Point2(event.xbutton.x, event.xbutton.y)) < 5) {
- } else {
+ last_click_ms = 0;
+ last_click_pos = Point2(-100, -100);
+ last_click_button_index = -1;
+ mb->set_doubleclick(true);
+ }
+
+ } else if (mb->get_button_index() < 4 || mb->get_button_index() > 7) {
+ last_click_button_index = mb->get_button_index();
+ }
+
+ if (!mb->is_doubleclick()) {
last_click_ms += diff;
last_click_pos = Point2(event.xbutton.x, event.xbutton.y);
}
@@ -2028,34 +2179,27 @@ void OS_X11::process_xevents() {
// Motion is also simple.
// A little hack is in order
// to be able to send relative motion events.
- Point2i pos(event.xmotion.x, event.xmotion.y);
+ Point2 pos(event.xmotion.x, event.xmotion.y);
-#ifdef TOUCH_ENABLED
// Avoidance of spurious mouse motion (see handling of touch)
bool filter = false;
// Adding some tolerance to match better Point2i to Vector2
- if (touch.state.size() && Vector2(pos).distance_squared_to(touch.mouse_pos_to_filter) < 2) {
+ if (xi.state.size() && Vector2(pos).distance_squared_to(xi.mouse_pos_to_filter) < 2) {
filter = true;
}
// Invalidate to avoid filtering a possible legitimate similar event coming later
- touch.mouse_pos_to_filter = Vector2(1e10, 1e10);
+ xi.mouse_pos_to_filter = Vector2(1e10, 1e10);
if (filter) {
break;
}
-#endif
if (mouse_mode == MOUSE_MODE_CAPTURED) {
-
- if (pos == Point2i(current_videomode.width / 2, current_videomode.height / 2)) {
- //this sucks, it's a hack, etc and is a little inaccurate, etc.
- //but nothing I can do, X11 sucks.
-
- center = pos;
+ if (xi.relative_motion.x == 0 && xi.relative_motion.y == 0) {
break;
}
Point2i new_center = pos;
- pos = last_mouse_pos + (pos - center);
+ pos = last_mouse_pos + xi.relative_motion;
center = new_center;
do_mouse_warp = window_has_focus; // warp the cursor if we're focused in
}
@@ -2066,7 +2210,24 @@ void OS_X11::process_xevents() {
last_mouse_pos_valid = true;
}
- Point2i rel = pos - last_mouse_pos;
+ // Hackish but relative mouse motion is already handled in the RawMotion event.
+ // RawMotion does not provide the absolute mouse position (whereas MotionNotify does).
+ // Therefore, RawMotion cannot be the authority on absolute mouse position.
+ // RawMotion provides more precision than MotionNotify, which doesn't sense subpixel motion.
+ // Therefore, MotionNotify cannot be the authority on relative mouse motion.
+ // This means we need to take a combined approach...
+ Point2 rel;
+
+ // Only use raw input if in capture mode. Otherwise use the classic behavior.
+ if (mouse_mode == MOUSE_MODE_CAPTURED) {
+ rel = xi.relative_motion;
+ } else {
+ rel = pos - last_mouse_pos;
+ }
+
+ // Reset to prevent lingering motion
+ xi.relative_motion.x = 0;
+ xi.relative_motion.y = 0;
if (mouse_mode == MOUSE_MODE_CAPTURED) {
pos = Point2i(current_videomode.width / 2, current_videomode.height / 2);
@@ -2075,12 +2236,16 @@ void OS_X11::process_xevents() {
Ref<InputEventMouseMotion> mm;
mm.instance();
+ // Make the absolute position integral so it doesn't look _too_ weird :)
+ Point2i posi(pos);
+
get_key_modifier_state(event.xmotion.state, mm);
- mm->set_button_mask(get_mouse_button_state(event.xmotion.state));
- mm->set_position(pos);
- mm->set_global_position(pos);
- input->set_mouse_position(pos);
+ mm->set_button_mask(get_mouse_button_state());
+ mm->set_position(posi);
+ mm->set_global_position(posi);
+ input->set_mouse_position(posi);
mm->set_speed(input->get_last_mouse_speed());
+
mm->set_relative(rel);
last_mouse_pos = pos;
@@ -2853,11 +3018,19 @@ void OS_X11::set_context(int p_context) {
XClassHint *classHint = XAllocClassHint();
if (classHint) {
+ char *wm_class = (char *)"Godot";
if (p_context == CONTEXT_EDITOR)
classHint->res_name = (char *)"Godot_Editor";
if (p_context == CONTEXT_PROJECTMAN)
classHint->res_name = (char *)"Godot_ProjectList";
- classHint->res_class = (char *)"Godot";
+
+ if (p_context == CONTEXT_ENGINE) {
+ classHint->res_name = (char *)"Godot_Engine";
+ wm_class = (char *)((String)GLOBAL_GET("application/config/name")).utf8().ptrw();
+ }
+
+ classHint->res_class = wm_class;
+
XSetClassHint(x11_display, x11_window, classHint);
XFree(classHint);
}
diff --git a/platform/x11/os_x11.h b/platform/x11/os_x11.h
index bb8411e213..cf1619bae2 100644
--- a/platform/x11/os_x11.h
+++ b/platform/x11/os_x11.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -48,11 +48,9 @@
#include <X11/Xcursor/Xcursor.h>
#include <X11/Xlib.h>
+#include <X11/extensions/XInput2.h>
#include <X11/extensions/Xrandr.h>
#include <X11/keysym.h>
-#ifdef TOUCH_ENABLED
-#include <X11/extensions/XInput2.h>
-#endif
// Hints for X11 fullscreen
typedef struct {
@@ -121,23 +119,32 @@ class OS_X11 : public OS_Unix {
bool im_active;
Vector2 im_position;
- Point2i last_mouse_pos;
+ Point2 last_mouse_pos;
bool last_mouse_pos_valid;
Point2i last_click_pos;
uint64_t last_click_ms;
+ int last_click_button_index;
uint32_t last_button_state;
-#ifdef TOUCH_ENABLED
+
struct {
int opcode;
- Vector<int> devices;
- XIEventMask event_mask;
+ Vector<int> touch_devices;
+ Map<int, Vector2> absolute_devices;
+ XIEventMask all_event_mask;
+ XIEventMask all_master_event_mask;
Map<int, Vector2> state;
Vector2 mouse_pos_to_filter;
- } touch;
-#endif
+ Vector2 relative_motion;
+ Vector2 raw_pos;
+ Vector2 old_raw_pos;
+ ::Time last_relative_time;
+ } xi;
+
+ bool refresh_device_info();
- unsigned int get_mouse_button_state(unsigned int p_x11_state);
+ unsigned int get_mouse_button_state(unsigned int p_x11_button, int p_x11_type);
void get_key_modifier_state(unsigned int p_x11_state, Ref<InputEventWithModifiers> state);
+ void flush_mouse_motion();
MouseMode mouse_mode;
Point2i center;
diff --git a/platform/x11/platform_config.h b/platform/x11/platform_config.h
index f6d7f5a8cd..9e6011ddf7 100644
--- a/platform/x11/platform_config.h
+++ b/platform/x11/platform_config.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/x11/power_x11.cpp b/platform/x11/power_x11.cpp
index 4ac331d212..943c2b1383 100644
--- a/platform/x11/power_x11.cpp
+++ b/platform/x11/power_x11.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/platform/x11/power_x11.h b/platform/x11/power_x11.h
index d0805b6f8a..56fbd602f4 100644
--- a/platform/x11/power_x11.h
+++ b/platform/x11/power_x11.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/animated_sprite.cpp b/scene/2d/animated_sprite.cpp
index b31bb39c0d..707e95e271 100644
--- a/scene/2d/animated_sprite.cpp
+++ b/scene/2d/animated_sprite.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -398,11 +398,11 @@ void AnimatedSprite::_notification(int p_what) {
emit_signal(SceneStringNames::get_singleton()->animation_finished);
frame = 0;
} else {
+ frame = fc - 1;
if (!is_over) {
- emit_signal(SceneStringNames::get_singleton()->animation_finished);
is_over = true;
+ emit_signal(SceneStringNames::get_singleton()->animation_finished);
}
- frame = fc - 1;
}
} else {
frame++;
diff --git a/scene/2d/animated_sprite.h b/scene/2d/animated_sprite.h
index 7270ee4d0e..8753f88799 100644
--- a/scene/2d/animated_sprite.h
+++ b/scene/2d/animated_sprite.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/area_2d.cpp b/scene/2d/area_2d.cpp
index ae5891fa50..63c4758a34 100644
--- a/scene/2d/area_2d.cpp
+++ b/scene/2d/area_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -158,7 +158,9 @@ void Area2D::_body_inout(int p_status, const RID &p_body, int p_instance, int p_
Map<ObjectID, BodyState>::Element *E = body_map.find(objid);
- ERR_FAIL_COND(!body_in && !E);
+ if (!body_in && !E) {
+ return; //does not exist because it was likely removed from the tree
+ }
locked = true;
diff --git a/scene/2d/area_2d.h b/scene/2d/area_2d.h
index cd60b6c1e1..2d1527810e 100644
--- a/scene/2d/area_2d.h
+++ b/scene/2d/area_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/audio_stream_player_2d.cpp b/scene/2d/audio_stream_player_2d.cpp
index c2af725919..961d2b00ef 100644
--- a/scene/2d/audio_stream_player_2d.cpp
+++ b/scene/2d/audio_stream_player_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/audio_stream_player_2d.h b/scene/2d/audio_stream_player_2d.h
index e68e6eeca5..cc00b59010 100644
--- a/scene/2d/audio_stream_player_2d.h
+++ b/scene/2d/audio_stream_player_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/back_buffer_copy.cpp b/scene/2d/back_buffer_copy.cpp
index e06c30ec6b..4a4bc4410f 100644
--- a/scene/2d/back_buffer_copy.cpp
+++ b/scene/2d/back_buffer_copy.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/back_buffer_copy.h b/scene/2d/back_buffer_copy.h
index b1ee12544b..52b0c016cc 100644
--- a/scene/2d/back_buffer_copy.h
+++ b/scene/2d/back_buffer_copy.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/camera_2d.cpp b/scene/2d/camera_2d.cpp
index cc297d742d..11846654c5 100644
--- a/scene/2d/camera_2d.cpp
+++ b/scene/2d/camera_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -61,6 +61,20 @@ void Camera2D::_update_scroll() {
};
}
+void Camera2D::_update_process_mode() {
+
+ if (Engine::get_singleton()->is_editor_hint()) {
+ set_process_internal(false);
+ set_physics_process_internal(false);
+ } else if (process_mode == CAMERA2D_PROCESS_IDLE) {
+ set_process_internal(true);
+ set_physics_process_internal(false);
+ } else {
+ set_process_internal(false);
+ set_physics_process_internal(true);
+ }
+}
+
void Camera2D::set_zoom(const Vector2 &p_zoom) {
zoom = p_zoom;
@@ -143,7 +157,7 @@ Transform2D Camera2D::get_camera_transform() {
if (smoothing_enabled && !Engine::get_singleton()->is_editor_hint()) {
- float c = smoothing * get_process_delta_time();
+ float c = smoothing * (process_mode == CAMERA2D_PROCESS_PHYSICS ? get_physics_process_delta_time() : get_process_delta_time());
smoothed_camera_pos = ((camera_pos - smoothed_camera_pos) * c) + smoothed_camera_pos;
ret_camera_pos = smoothed_camera_pos;
//camera_pos=camera_pos*(1.0-smoothing)+new_camera_pos*smoothing;
@@ -217,14 +231,15 @@ void Camera2D::_notification(int p_what) {
switch (p_what) {
- case NOTIFICATION_INTERNAL_PROCESS: {
+ case NOTIFICATION_INTERNAL_PROCESS:
+ case NOTIFICATION_INTERNAL_PHYSICS_PROCESS: {
_update_scroll();
} break;
case NOTIFICATION_TRANSFORM_CHANGED: {
- if (!is_processing_internal())
+ if (!is_processing_internal() && !is_physics_processing_internal())
_update_scroll();
} break;
@@ -245,10 +260,7 @@ void Camera2D::_notification(int p_what) {
add_to_group(group_name);
add_to_group(canvas_group_name);
- if (Engine::get_singleton()->is_editor_hint()) {
- set_process_internal(false);
- }
-
+ _update_process_mode();
_update_scroll();
first = true;
@@ -379,6 +391,20 @@ bool Camera2D::is_rotating() const {
return rotating;
}
+void Camera2D::set_process_mode(Camera2DProcessMode p_mode) {
+
+ if (process_mode == p_mode)
+ return;
+
+ process_mode = p_mode;
+ _update_process_mode();
+}
+
+Camera2D::Camera2DProcessMode Camera2D::get_process_mode() const {
+
+ return process_mode;
+}
+
void Camera2D::_make_current(Object *p_which) {
if (p_which == this) {
@@ -410,6 +436,7 @@ void Camera2D::make_current() {
} else {
get_tree()->call_group_flags(SceneTree::GROUP_CALL_REALTIME, group_name, "_make_current", this);
}
+ _update_scroll();
}
void Camera2D::clear_current() {
@@ -656,6 +683,9 @@ void Camera2D::_bind_methods() {
ClassDB::bind_method(D_METHOD("_update_scroll"), &Camera2D::_update_scroll);
+ ClassDB::bind_method(D_METHOD("set_process_mode", "mode"), &Camera2D::set_process_mode);
+ ClassDB::bind_method(D_METHOD("get_process_mode"), &Camera2D::get_process_mode);
+
ClassDB::bind_method(D_METHOD("_set_current", "current"), &Camera2D::_set_current);
ClassDB::bind_method(D_METHOD("is_current"), &Camera2D::is_current);
@@ -716,6 +746,7 @@ void Camera2D::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "current"), "_set_current", "is_current");
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "zoom"), "set_zoom", "get_zoom");
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "custom_viewport", PROPERTY_HINT_RESOURCE_TYPE, "Viewport", 0), "set_custom_viewport", "get_custom_viewport");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "process_mode", PROPERTY_HINT_ENUM, "Physics,Idle"), "set_process_mode", "get_process_mode");
ADD_GROUP("Limit", "limit_");
ADD_PROPERTYI(PropertyInfo(Variant::INT, "limit_left"), "set_limit", "get_limit", MARGIN_LEFT);
@@ -749,6 +780,8 @@ void Camera2D::_bind_methods() {
BIND_ENUM_CONSTANT(ANCHOR_MODE_FIXED_TOP_LEFT);
BIND_ENUM_CONSTANT(ANCHOR_MODE_DRAG_CENTER);
+ BIND_ENUM_CONSTANT(CAMERA2D_PROCESS_PHYSICS);
+ BIND_ENUM_CONSTANT(CAMERA2D_PROCESS_IDLE);
}
Camera2D::Camera2D() {
@@ -771,6 +804,7 @@ Camera2D::Camera2D() {
limit_smoothing_enabled = false;
custom_viewport = NULL;
custom_viewport_id = 0;
+ process_mode = CAMERA2D_PROCESS_IDLE;
smoothing = 5.0;
zoom = Vector2(1, 1);
diff --git a/scene/2d/camera_2d.h b/scene/2d/camera_2d.h
index 99571500bf..7f16ecff41 100644
--- a/scene/2d/camera_2d.h
+++ b/scene/2d/camera_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -44,6 +44,11 @@ public:
ANCHOR_MODE_DRAG_CENTER
};
+ enum Camera2DProcessMode {
+ CAMERA2D_PROCESS_PHYSICS,
+ CAMERA2D_PROCESS_IDLE
+ };
+
protected:
Point2 camera_pos;
Point2 smoothed_camera_pos;
@@ -73,6 +78,7 @@ protected:
float v_ofs;
Point2 camera_screen_center;
+ void _update_process_mode();
void _update_scroll();
void _make_current(Object *p_which);
@@ -84,6 +90,8 @@ protected:
bool limit_drawing_enabled;
bool margin_drawing_enabled;
+ Camera2DProcessMode process_mode;
+
protected:
virtual Transform2D get_camera_transform();
void _notification(int p_what);
@@ -126,6 +134,9 @@ public:
void set_follow_smoothing(float p_speed);
float get_follow_smoothing() const;
+ void set_process_mode(Camera2DProcessMode p_mode);
+ Camera2DProcessMode get_process_mode() const;
+
void make_current();
void clear_current();
bool is_current() const;
@@ -156,5 +167,6 @@ public:
};
VARIANT_ENUM_CAST(Camera2D::AnchorMode);
+VARIANT_ENUM_CAST(Camera2D::Camera2DProcessMode);
#endif // CAMERA_2D_H
diff --git a/scene/2d/canvas_item.cpp b/scene/2d/canvas_item.cpp
index 0ea2e85dfa..6ed008cf9c 100644
--- a/scene/2d/canvas_item.cpp
+++ b/scene/2d/canvas_item.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -42,7 +42,7 @@
#include "servers/visual_server.h"
Mutex *CanvasItemMaterial::material_mutex = NULL;
-SelfList<CanvasItemMaterial>::List CanvasItemMaterial::dirty_materials;
+SelfList<CanvasItemMaterial>::List *CanvasItemMaterial::dirty_materials = NULL;
Map<CanvasItemMaterial::MaterialKey, CanvasItemMaterial::ShaderData> CanvasItemMaterial::shader_map;
CanvasItemMaterial::ShaderNames *CanvasItemMaterial::shader_names = NULL;
@@ -52,6 +52,8 @@ void CanvasItemMaterial::init_shaders() {
material_mutex = Mutex::create();
#endif
+ dirty_materials = memnew(SelfList<CanvasItemMaterial>::List);
+
shader_names = memnew(ShaderNames);
shader_names->particles_anim_h_frames = "particles_anim_h_frames";
@@ -61,6 +63,10 @@ void CanvasItemMaterial::init_shaders() {
void CanvasItemMaterial::finish_shaders() {
+ memdelete(dirty_materials);
+ memdelete(shader_names);
+ dirty_materials = NULL;
+
#ifndef NO_THREADS
memdelete(material_mutex);
#endif
@@ -68,7 +74,7 @@ void CanvasItemMaterial::finish_shaders() {
void CanvasItemMaterial::_update_shader() {
- dirty_materials.remove(&element);
+ dirty_materials->remove(&element);
MaterialKey mk = _compute_key();
if (mk.key == current_key.key)
@@ -157,9 +163,9 @@ void CanvasItemMaterial::flush_changes() {
if (material_mutex)
material_mutex->lock();
- while (dirty_materials.first()) {
+ while (dirty_materials->first()) {
- dirty_materials.first()->self()->_update_shader();
+ dirty_materials->first()->self()->_update_shader();
}
if (material_mutex)
@@ -172,7 +178,7 @@ void CanvasItemMaterial::_queue_shader_change() {
material_mutex->lock();
if (!element.in_list()) {
- dirty_materials.add(&element);
+ dirty_materials->add(&element);
}
if (material_mutex)
@@ -1160,7 +1166,7 @@ void CanvasItem::_bind_methods() {
ClassDB::bind_method(D_METHOD("draw_string", "font", "position", "text", "modulate", "clip_w"), &CanvasItem::draw_string, DEFVAL(Color(1, 1, 1)), DEFVAL(-1));
ClassDB::bind_method(D_METHOD("draw_char", "font", "position", "char", "next", "modulate"), &CanvasItem::draw_char, DEFVAL(Color(1, 1, 1)));
ClassDB::bind_method(D_METHOD("draw_mesh", "mesh", "texture", "normal_map"), &CanvasItem::draw_mesh, DEFVAL(Ref<Texture>()));
- ClassDB::bind_method(D_METHOD("draw_multimesh", "mesh", "texture", "normal_map"), &CanvasItem::draw_mesh, DEFVAL(Ref<Texture>()));
+ ClassDB::bind_method(D_METHOD("draw_multimesh", "multimesh", "texture", "normal_map"), &CanvasItem::draw_multimesh, DEFVAL(Ref<Texture>()));
ClassDB::bind_method(D_METHOD("draw_set_transform", "position", "rotation", "scale"), &CanvasItem::draw_set_transform);
ClassDB::bind_method(D_METHOD("draw_set_transform_matrix", "xform"), &CanvasItem::draw_set_transform_matrix);
diff --git a/scene/2d/canvas_item.h b/scene/2d/canvas_item.h
index 9fe7cb1e00..a02e792cf2 100644
--- a/scene/2d/canvas_item.h
+++ b/scene/2d/canvas_item.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -109,7 +109,7 @@ private:
}
static Mutex *material_mutex;
- static SelfList<CanvasItemMaterial>::List dirty_materials;
+ static SelfList<CanvasItemMaterial>::List *dirty_materials;
SelfList<CanvasItemMaterial> element;
void _update_shader();
diff --git a/scene/2d/canvas_modulate.cpp b/scene/2d/canvas_modulate.cpp
index 2f8568ccbf..bd7bb97b03 100644
--- a/scene/2d/canvas_modulate.cpp
+++ b/scene/2d/canvas_modulate.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/canvas_modulate.h b/scene/2d/canvas_modulate.h
index 888ed95f6b..101abb4f00 100644
--- a/scene/2d/canvas_modulate.h
+++ b/scene/2d/canvas_modulate.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/collision_object_2d.cpp b/scene/2d/collision_object_2d.cpp
index 738f7ddf59..554b8dbc3d 100644
--- a/scene/2d/collision_object_2d.cpp
+++ b/scene/2d/collision_object_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/collision_object_2d.h b/scene/2d/collision_object_2d.h
index 29a00bd9f9..d796c171bf 100644
--- a/scene/2d/collision_object_2d.h
+++ b/scene/2d/collision_object_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/collision_polygon_2d.cpp b/scene/2d/collision_polygon_2d.cpp
index 07bbbd9321..ac99a598d4 100644
--- a/scene/2d/collision_polygon_2d.cpp
+++ b/scene/2d/collision_polygon_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/collision_polygon_2d.h b/scene/2d/collision_polygon_2d.h
index 412a923292..1e9bcf4646 100644
--- a/scene/2d/collision_polygon_2d.h
+++ b/scene/2d/collision_polygon_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/collision_shape_2d.cpp b/scene/2d/collision_shape_2d.cpp
index d3e25d541a..1b648372c0 100644
--- a/scene/2d/collision_shape_2d.cpp
+++ b/scene/2d/collision_shape_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/collision_shape_2d.h b/scene/2d/collision_shape_2d.h
index ed2c09d53d..8d74da0944 100644
--- a/scene/2d/collision_shape_2d.h
+++ b/scene/2d/collision_shape_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/cpu_particles_2d.cpp b/scene/2d/cpu_particles_2d.cpp
index a1b624a246..36b900bf82 100644
--- a/scene/2d/cpu_particles_2d.cpp
+++ b/scene/2d/cpu_particles_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -1305,15 +1305,15 @@ void CPUParticles2D::_bind_methods() {
ADD_PROPERTYI(PropertyInfo(Variant::REAL, "angle_random", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_param_randomness", "get_param_randomness", PARAM_ANGLE);
ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "angle_curve", PROPERTY_HINT_RESOURCE_TYPE, "Curve"), "set_param_curve", "get_param_curve", PARAM_ANGLE);
ADD_GROUP("Scale", "");
- ADD_PROPERTYI(PropertyInfo(Variant::REAL, "scale", PROPERTY_HINT_RANGE, "0,1000,0.01,or_greater"), "set_param", "get_param", PARAM_SCALE);
- ADD_PROPERTYI(PropertyInfo(Variant::REAL, "scale_random", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_param_randomness", "get_param_randomness", PARAM_SCALE);
- ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "scale_curve", PROPERTY_HINT_RESOURCE_TYPE, "Curve"), "set_param_curve", "get_param_curve", PARAM_SCALE);
+ ADD_PROPERTYI(PropertyInfo(Variant::REAL, "scale_amount", PROPERTY_HINT_RANGE, "0,1000,0.01,or_greater"), "set_param", "get_param", PARAM_SCALE);
+ ADD_PROPERTYI(PropertyInfo(Variant::REAL, "scale_amount_random", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_param_randomness", "get_param_randomness", PARAM_SCALE);
+ ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "scale_amount_curve", PROPERTY_HINT_RESOURCE_TYPE, "Curve"), "set_param_curve", "get_param_curve", PARAM_SCALE);
ADD_GROUP("Color", "");
ADD_PROPERTY(PropertyInfo(Variant::COLOR, "color"), "set_color", "get_color");
- ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "color_ramp", PROPERTY_HINT_RESOURCE_TYPE, "GradientTexture"), "set_color_ramp", "get_color_ramp");
+ ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "color_ramp", PROPERTY_HINT_RESOURCE_TYPE, "Gradient"), "set_color_ramp", "get_color_ramp");
ADD_GROUP("Hue Variation", "hue_");
- ADD_PROPERTYI(PropertyInfo(Variant::REAL, "hue_variation", PROPERTY_HINT_RANGE, "-1,1,0.1"), "set_param", "get_param", PARAM_HUE_VARIATION);
+ ADD_PROPERTYI(PropertyInfo(Variant::REAL, "hue_variation", PROPERTY_HINT_RANGE, "-1,1,0.01"), "set_param", "get_param", PARAM_HUE_VARIATION);
ADD_PROPERTYI(PropertyInfo(Variant::REAL, "hue_variation_random", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_param_randomness", "get_param_randomness", PARAM_HUE_VARIATION);
ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "hue_variation_curve", PROPERTY_HINT_RESOURCE_TYPE, "Curve"), "set_param_curve", "get_param_curve", PARAM_HUE_VARIATION);
ADD_GROUP("Animation", "anim_");
diff --git a/scene/2d/cpu_particles_2d.h b/scene/2d/cpu_particles_2d.h
index d967c3be26..b1adf62980 100644
--- a/scene/2d/cpu_particles_2d.h
+++ b/scene/2d/cpu_particles_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/joints_2d.cpp b/scene/2d/joints_2d.cpp
index b9a48e1fdc..5b14b3e8e1 100644
--- a/scene/2d/joints_2d.cpp
+++ b/scene/2d/joints_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/joints_2d.h b/scene/2d/joints_2d.h
index 744994f0a7..a3951eb9d2 100644
--- a/scene/2d/joints_2d.h
+++ b/scene/2d/joints_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/light_2d.cpp b/scene/2d/light_2d.cpp
index e6a5a0b651..d7ed6f8f49 100644
--- a/scene/2d/light_2d.cpp
+++ b/scene/2d/light_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -450,7 +450,7 @@ void Light2D::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::COLOR, "shadow_color"), "set_shadow_color", "get_shadow_color");
ADD_PROPERTY(PropertyInfo(Variant::INT, "shadow_buffer_size", PROPERTY_HINT_RANGE, "32,16384,1"), "set_shadow_buffer_size", "get_shadow_buffer_size");
ADD_PROPERTY(PropertyInfo(Variant::REAL, "shadow_gradient_length", PROPERTY_HINT_RANGE, "0,4096,0.1"), "set_shadow_gradient_length", "get_shadow_gradient_length");
- ADD_PROPERTY(PropertyInfo(Variant::REAL, "shadow_filter", PROPERTY_HINT_ENUM, "None,PCF3,PCF5,PCF7,PCF9,PCF13"), "set_shadow_filter", "get_shadow_filter");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "shadow_filter", PROPERTY_HINT_ENUM, "None,PCF3,PCF5,PCF7,PCF9,PCF13"), "set_shadow_filter", "get_shadow_filter");
ADD_PROPERTY(PropertyInfo(Variant::REAL, "shadow_filter_smooth", PROPERTY_HINT_RANGE, "0,64,0.1"), "set_shadow_smooth", "get_shadow_smooth");
ADD_PROPERTY(PropertyInfo(Variant::INT, "shadow_item_cull_mask", PROPERTY_HINT_LAYERS_2D_RENDER), "set_item_shadow_cull_mask", "get_item_shadow_cull_mask");
diff --git a/scene/2d/light_2d.h b/scene/2d/light_2d.h
index 40469cfbc8..b1940f64cd 100644
--- a/scene/2d/light_2d.h
+++ b/scene/2d/light_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/light_occluder_2d.cpp b/scene/2d/light_occluder_2d.cpp
index ab15b49985..5334caed67 100644
--- a/scene/2d/light_occluder_2d.cpp
+++ b/scene/2d/light_occluder_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/light_occluder_2d.h b/scene/2d/light_occluder_2d.h
index d59c9100b0..498d65d764 100644
--- a/scene/2d/light_occluder_2d.h
+++ b/scene/2d/light_occluder_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/line_2d.cpp b/scene/2d/line_2d.cpp
index 6faf8c2855..105eb82afb 100644
--- a/scene/2d/line_2d.cpp
+++ b/scene/2d/line_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/line_2d.h b/scene/2d/line_2d.h
index 6918018c12..5bbd38e460 100644
--- a/scene/2d/line_2d.h
+++ b/scene/2d/line_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/line_builder.cpp b/scene/2d/line_builder.cpp
index d5e8a33805..eb09d3c9d3 100644
--- a/scene/2d/line_builder.cpp
+++ b/scene/2d/line_builder.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -279,6 +279,10 @@ void LineBuilder::build() {
}
} else {
// No intersection: fallback
+ if (current_joint_mode == Line2D::LINE_JOINT_SHARP) {
+ // There is no fallback implementation for LINE_JOINT_SHARP so switch to the LINE_JOINT_BEVEL
+ current_joint_mode = Line2D::LINE_JOINT_BEVEL;
+ }
pos_up1 = corner_pos_up;
pos_down1 = corner_pos_down;
}
diff --git a/scene/2d/line_builder.h b/scene/2d/line_builder.h
index f9d26f12af..2ca28d09c4 100644
--- a/scene/2d/line_builder.h
+++ b/scene/2d/line_builder.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/mesh_instance_2d.cpp b/scene/2d/mesh_instance_2d.cpp
index 46777665d8..b382ca7b33 100644
--- a/scene/2d/mesh_instance_2d.cpp
+++ b/scene/2d/mesh_instance_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/mesh_instance_2d.h b/scene/2d/mesh_instance_2d.h
index c9889c1c03..4d81c8088a 100644
--- a/scene/2d/mesh_instance_2d.h
+++ b/scene/2d/mesh_instance_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/navigation2d.cpp b/scene/2d/navigation2d.cpp
index 1b789bab9d..1c0e924433 100644
--- a/scene/2d/navigation2d.cpp
+++ b/scene/2d/navigation2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/navigation2d.h b/scene/2d/navigation2d.h
index 02c46d5de1..fc1762221c 100644
--- a/scene/2d/navigation2d.h
+++ b/scene/2d/navigation2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/navigation_polygon.cpp b/scene/2d/navigation_polygon.cpp
index b36924e521..50618c6baa 100644
--- a/scene/2d/navigation_polygon.cpp
+++ b/scene/2d/navigation_polygon.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -349,8 +349,6 @@ void NavigationPolygonInstance::set_enabled(bool p_enabled) {
if (Engine::get_singleton()->is_editor_hint() || get_tree()->is_debugging_navigation_hint())
update();
-
- //update_gizmo();
}
bool NavigationPolygonInstance::is_enabled() const {
@@ -461,26 +459,28 @@ void NavigationPolygonInstance::_notification(int p_what) {
void NavigationPolygonInstance::set_navigation_polygon(const Ref<NavigationPolygon> &p_navpoly) {
- if (p_navpoly == navpoly)
+ if (p_navpoly == navpoly) {
return;
+ }
if (navigation && nav_id != -1) {
navigation->navpoly_remove(nav_id);
nav_id = -1;
}
+
if (navpoly.is_valid()) {
navpoly->disconnect(CoreStringNames::get_singleton()->changed, this, "_navpoly_changed");
}
navpoly = p_navpoly;
-
if (navpoly.is_valid()) {
navpoly->connect(CoreStringNames::get_singleton()->changed, this, "_navpoly_changed");
}
+ _navpoly_changed();
if (navigation && navpoly.is_valid() && enabled) {
nav_id = navigation->navpoly_add(navpoly, get_relative_transform_to_parent(navigation), this);
}
- //update_gizmo();
+
_change_notify("navpoly");
update_configuration_warning();
}
diff --git a/scene/2d/navigation_polygon.h b/scene/2d/navigation_polygon.h
index d7684c2d94..ebbe67d949 100644
--- a/scene/2d/navigation_polygon.h
+++ b/scene/2d/navigation_polygon.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/node_2d.cpp b/scene/2d/node_2d.cpp
index 2d9bbfe657..9a94092840 100644
--- a/scene/2d/node_2d.cpp
+++ b/scene/2d/node_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/node_2d.h b/scene/2d/node_2d.h
index 924a84fb88..c07dc88720 100644
--- a/scene/2d/node_2d.h
+++ b/scene/2d/node_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/parallax_background.cpp b/scene/2d/parallax_background.cpp
index 027d64b813..96e13396c5 100644
--- a/scene/2d/parallax_background.cpp
+++ b/scene/2d/parallax_background.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -206,7 +206,9 @@ void ParallaxBackground::_bind_methods() {
ParallaxBackground::ParallaxBackground() {
- base_scale = Vector2(1, 1);
scale = 1.0;
set_layer(-1); //behind all by default
+
+ base_scale = Vector2(1, 1);
+ ignore_camera_zoom = false;
}
diff --git a/scene/2d/parallax_background.h b/scene/2d/parallax_background.h
index 31d1c553a2..38d59ac737 100644
--- a/scene/2d/parallax_background.h
+++ b/scene/2d/parallax_background.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/parallax_layer.cpp b/scene/2d/parallax_layer.cpp
index 06de723f27..baf5b5967b 100644
--- a/scene/2d/parallax_layer.cpp
+++ b/scene/2d/parallax_layer.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/parallax_layer.h b/scene/2d/parallax_layer.h
index b2b98b0ef6..b5db111a38 100644
--- a/scene/2d/parallax_layer.h
+++ b/scene/2d/parallax_layer.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/particles_2d.cpp b/scene/2d/particles_2d.cpp
index 35b7e7da3e..c005c33a19 100644
--- a/scene/2d/particles_2d.cpp
+++ b/scene/2d/particles_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/particles_2d.h b/scene/2d/particles_2d.h
index 6d52f8b28e..a0104b4b16 100644
--- a/scene/2d/particles_2d.h
+++ b/scene/2d/particles_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/path_2d.cpp b/scene/2d/path_2d.cpp
index 4276918f53..271e132002 100644
--- a/scene/2d/path_2d.cpp
+++ b/scene/2d/path_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -261,7 +261,7 @@ void PathFollow2D::_validate_property(PropertyInfo &property) const {
if (path && path->get_curve().is_valid())
max = path->get_curve()->get_baked_length();
- property.hint_string = "0," + rtos(max) + ",0.01";
+ property.hint_string = "0," + rtos(max) + ",0.01,or_greater";
}
}
@@ -303,8 +303,8 @@ void PathFollow2D::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_lookahead", "lookahead"), &PathFollow2D::set_lookahead);
ClassDB::bind_method(D_METHOD("get_lookahead"), &PathFollow2D::get_lookahead);
- ADD_PROPERTY(PropertyInfo(Variant::REAL, "offset", PROPERTY_HINT_EXP_RANGE, "0,10000,0.01,or_greater"), "set_offset", "get_offset");
- ADD_PROPERTY(PropertyInfo(Variant::REAL, "unit_offset", PROPERTY_HINT_RANGE, "0,1,0.0001", PROPERTY_USAGE_EDITOR), "set_unit_offset", "get_unit_offset");
+ ADD_PROPERTY(PropertyInfo(Variant::REAL, "offset", PROPERTY_HINT_RANGE, "0,10000,0.01,or_greater"), "set_offset", "get_offset");
+ ADD_PROPERTY(PropertyInfo(Variant::REAL, "unit_offset", PROPERTY_HINT_RANGE, "0,1,0.0001,or_greater", PROPERTY_USAGE_EDITOR), "set_unit_offset", "get_unit_offset");
ADD_PROPERTY(PropertyInfo(Variant::REAL, "h_offset"), "set_h_offset", "get_h_offset");
ADD_PROPERTY(PropertyInfo(Variant::REAL, "v_offset"), "set_v_offset", "get_v_offset");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "rotate"), "set_rotate", "is_rotating");
diff --git a/scene/2d/path_2d.h b/scene/2d/path_2d.h
index 64696442c3..4efad19938 100644
--- a/scene/2d/path_2d.h
+++ b/scene/2d/path_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/path_texture.cpp b/scene/2d/path_texture.cpp
index d36a9fb65a..3de2079ebe 100644
--- a/scene/2d/path_texture.cpp
+++ b/scene/2d/path_texture.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/path_texture.h b/scene/2d/path_texture.h
index 7a347c0653..313aa772c4 100644
--- a/scene/2d/path_texture.h
+++ b/scene/2d/path_texture.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/physics_body_2d.cpp b/scene/2d/physics_body_2d.cpp
index 929b4624ee..f4bc8ad6b9 100644
--- a/scene/2d/physics_body_2d.cpp
+++ b/scene/2d/physics_body_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -1279,7 +1279,6 @@ Vector2 KinematicBody2D::move_and_slide(const Vector2 &p_linear_velocity, const
colliders.push_back(collision);
motion = collision.remainder;
- bool is_on_slope = false;
if (p_floor_direction == Vector2()) {
//all is a wall
on_wall = true;
@@ -1291,16 +1290,14 @@ Vector2 KinematicBody2D::move_and_slide(const Vector2 &p_linear_velocity, const
floor_velocity = collision.collider_vel;
if (p_stop_on_slope) {
- if (Vector2() == lv_n + p_floor_direction) {
+ if (Vector2() == lv_n + p_floor_direction && collision.travel.length() < 1) {
Transform2D gt = get_global_transform();
- gt.elements[2] -= collision.travel;
+ gt.elements[2] -= collision.travel.project(p_floor_direction.tangent());
set_global_transform(gt);
return Vector2();
}
}
- is_on_slope = true;
-
} else if (collision.normal.dot(-p_floor_direction) >= Math::cos(p_floor_max_angle + FLOOR_ANGLE_THRESHOLD)) { //ceiling
on_ceiling = true;
} else {
@@ -1308,14 +1305,9 @@ Vector2 KinematicBody2D::move_and_slide(const Vector2 &p_linear_velocity, const
}
}
- if (p_stop_on_slope && is_on_slope) {
- motion = motion.slide(p_floor_direction);
- lv = lv.slide(p_floor_direction);
- } else {
- Vector2 n = collision.normal;
- motion = motion.slide(n);
- lv = lv.slide(n);
- }
+ Vector2 n = collision.normal;
+ motion = motion.slide(n);
+ lv = lv.slide(n);
}
if (p_stop_on_slope)
@@ -1425,6 +1417,10 @@ void KinematicBody2D::set_sync_to_physics(bool p_enable) {
return;
}
sync_to_physics = p_enable;
+
+ if (Engine::get_singleton()->is_editor_hint())
+ return;
+
if (p_enable) {
Physics2DServer::get_singleton()->body_set_force_integration_callback(get_rid(), this, "_direct_state_changed");
set_only_update_transform_changes(true);
diff --git a/scene/2d/physics_body_2d.h b/scene/2d/physics_body_2d.h
index c7b42add84..89dd1e5341 100644
--- a/scene/2d/physics_body_2d.h
+++ b/scene/2d/physics_body_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/polygon_2d.cpp b/scene/2d/polygon_2d.cpp
index fc0741cc5c..54b304f851 100644
--- a/scene/2d/polygon_2d.cpp
+++ b/scene/2d/polygon_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -81,7 +81,11 @@ bool Polygon2D::_edit_use_rect() const {
bool Polygon2D::_edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const {
- return Geometry::is_point_in_polygon(p_point - get_offset(), Variant(polygon));
+ Vector<Vector2> polygon2d = Variant(polygon);
+ if (internal_vertices > 0) {
+ polygon2d.resize(polygon2d.size() - internal_vertices);
+ }
+ return Geometry::is_point_in_polygon(p_point - get_offset(), polygon2d);
}
void Polygon2D::_notification(int p_what) {
@@ -108,9 +112,17 @@ void Polygon2D::_notification(int p_what) {
Vector<int> bones;
Vector<float> weights;
- points.resize(polygon.size());
+ int len = polygon.size();
+ if ((invert || polygons.size() == 0) && internal_vertices > 0) {
+ //if no polygons are around, internal vertices must not be drawn, else let them be
+ len -= internal_vertices;
+ }
+
+ if (len <= 0) {
+ return;
+ }
+ points.resize(len);
- int len = points.size();
{
PoolVector<Vector2>::Read polyr = polygon.read();
@@ -177,7 +189,8 @@ void Polygon2D::_notification(int p_what) {
Transform2D texmat(tex_rot, tex_ofs);
texmat.scale(tex_scale);
Size2 tex_size = texture->get_size();
- uvs.resize(points.size());
+
+ uvs.resize(len);
if (points.size() == uv.size()) {
@@ -194,9 +207,9 @@ void Polygon2D::_notification(int p_what) {
}
}
- if (!invert && bone_weights.size()) {
+ if (skeleton_node && !invert && bone_weights.size()) {
//a skeleton is set! fill indices and weights
- int vc = points.size();
+ int vc = len;
bones.resize(vc * 4);
weights.resize(vc * 4);
@@ -258,93 +271,245 @@ void Polygon2D::_notification(int p_what) {
}
Vector<Color> colors;
- int color_len = vertex_colors.size();
- colors.resize(len);
- {
+ if (vertex_colors.size() == points.size()) {
+ colors.resize(len);
PoolVector<Color>::Read color_r = vertex_colors.read();
- for (int i = 0; i < color_len && i < len; i++) {
+ for (int i = 0; i < len; i++) {
colors.write[i] = color_r[i];
}
- for (int i = color_len; i < len; i++) {
- colors.write[i] = color;
- }
+ } else {
+ colors.push_back(color);
}
// Vector<int> indices = Geometry::triangulate_polygon(points);
// VS::get_singleton()->canvas_item_add_triangle_array(get_canvas_item(), indices, points, colors, uvs, texture.is_valid() ? texture->get_rid() : RID());
- if (invert || splits.size() == 0) {
+ if (invert || polygons.size() == 0) {
Vector<int> indices = Geometry::triangulate_polygon(points);
VS::get_singleton()->canvas_item_add_triangle_array(get_canvas_item(), indices, points, colors, uvs, bones, weights, texture.is_valid() ? texture->get_rid() : RID());
} else {
+ //draw individual polygons
+ Vector<int> total_indices;
+ for (int i = 0; i < polygons.size(); i++) {
+ PoolVector<int> src_indices = polygons[i];
+ int ic = src_indices.size();
+ if (ic < 3)
+ continue;
+ PoolVector<int>::Read r = src_indices.read();
+
+ Vector<Vector2> tmp_points;
+ tmp_points.resize(ic);
+
+ for (int j = 0; j < ic; j++) {
+ int idx = r[j];
+ ERR_CONTINUE(idx < 0 || idx >= points.size());
+ tmp_points.write[j] = points[r[j]];
+ }
+ Vector<int> indices = Geometry::triangulate_polygon(tmp_points);
+ int ic2 = indices.size();
+ const int *r2 = indices.ptr();
+
+ int bic = total_indices.size();
+ total_indices.resize(bic + ic2);
+ int *w2 = total_indices.ptrw();
+
+ for (int j = 0; j < ic2; j++) {
+ w2[j + bic] = r[r2[j]];
+ }
+ }
+
+ if (total_indices.size()) {
+ VS::get_singleton()->canvas_item_add_triangle_array(get_canvas_item(), total_indices, points, colors, uvs, bones, weights, texture.is_valid() ? texture->get_rid() : RID());
+ }
+
+#if 0
//use splits
Vector<int> loop;
int sc = splits.size();
PoolVector<int>::Read r = splits.read();
- int last = points.size();
+
+ print_line("has splits, amount " + itos(splits.size()));
Vector<Vector<int> > loops;
- for (int i = 0; i < last; i++) {
+ // find a point that can be used to begin, must not be in a split, and have to the left and right the same one
+ // like this one -> x---o
+ // \ / \ .
+ // o---o
+ int base_point = -1;
+ {
+ int current_point = -1;
+ int base_point_prev_split = -1;
+
+
+ for (int i = 0; i < points.size(); i++) {
+
+ //find if this point is in a split
+ int split_index = -1;
+ bool has_prev_split = false;
+ int min_dist_to_end = 0x7FFFFFFF;
+
+ for (int j = 0; j < sc; j += 2) {
+
+ int split_pos = -1;
+ int split_end = -1;
+
+ if (r[j + 0] == i) { //found split in first point
+ split_pos = r[j + 0];
+ split_end = r[j + 1];
+ } else if (r[j + 1] == i) { //found split in second point
+ split_pos = r[j + 1];
+ split_end = r[j + 0];
+ }
+
+ if (split_pos == split_end) {
+ continue; //either nothing found or begin == end, this not a split in either case
+ }
+
+ if (j == base_point_prev_split) {
+ has_prev_split = true;
+ }
+
+ //compute distance from split pos to split end in current traversal direction
+ int dist_to_end = split_end > split_pos ? split_end - split_pos : (last - split_pos + split_end);
+
+ if (dist_to_end < min_dist_to_end) {
+ //always keep the valid split with the least distance to the loop
+ min_dist_to_end = dist_to_end;
+ split_index = j;
+ }
+ }
+
+ if (split_index == -1) {
+ current_point = i; //no split here, we are testing this point
+ } else if (has_prev_split) {
+ base_point = current_point; // there is a split and it contains the previous visited split, success
+ break;
+ } else {
+ //invalidate current point and keep split
+ current_point = -1;
+ base_point_prev_split = split_index;
+ }
+ }
+ }
+
+ print_line("found base point: " + itos(base_point));
- int split;
- int min_end = -1;
+ if (base_point != -1) {
+ int point = base_point;
+ int last = base_point;
+ //go through all the points, find splits
do {
- loop.push_back(i);
+ int split;
+ int last_dist_to_end = -1; //maximum valid distance to end
- split = -1;
- int end = -1;
+ do {
- for (int j = 0; j < sc; j += 2) {
- if (r[j + 1] >= last)
- continue; //no longer valid
- if (min_end != -1 && r[j + 1] >= min_end)
- continue;
- if (r[j] == i) {
- if (split == -1 || r[j + 1] > end) {
- split = r[j];
- end = r[j + 1];
+ loop.push_back(point); //push current point
+
+ split = -1;
+ int end = -1;
+
+ int max_dist_to_end = 0;
+
+ //find if this point is in a split
+ for (int j = 0; j < sc; j += 2) {
+
+ int split_pos = -1;
+ int split_end = -1;
+
+ if (r[j + 0] == point) { //match first split index
+ split_pos = r[j + 0];
+ split_end = r[j + 1];
+ } else if (r[j + 1] == point) { //match second split index
+ split_pos = r[j + 1];
+ split_end = r[j + 0];
+ }
+
+ if (split_pos == split_end) {
+ continue; //either nothing found or begin == end, this not a split in either case
+ }
+
+ //compute distance from split pos to split end
+ int dist_to_end = split_end > split_pos ? split_end - split_pos : (points.size() - split_pos + split_end);
+
+ if (last_dist_to_end != -1 && dist_to_end >= last_dist_to_end) {
+ //distance must be shorter than in last iteration, means we've tested this before so ignore
+ continue;
+ } else if (dist_to_end > max_dist_to_end) {
+ //always keep the valid point with the most distance (as long as it's valid)
+ max_dist_to_end = dist_to_end;
+ split = split_pos;
+ end = split_end;
}
}
- }
- if (split != -1) {
- for (int j = end; j < last; j++) {
- loop.push_back(j);
+ if (split != -1) {
+ //found a split!
+ int from = end;
+
+ //add points until last is reached
+ while (true) {
+ //find if point is in a split
+ loop.push_back(from);
+
+ if (from == last) {
+ break;
+ }
+
+ from++;
+ if (from >= points.size()) { //wrap if reached end
+ from = 0;
+ }
+
+ if (from == loop[0]) {
+ break; //end because we reached split source
+ }
+ }
+
+ loops.push_back(loop); //done with this loop
+ loop.clear();
+
+ last_dist_to_end = max_dist_to_end;
+ last = end; //algorithm can safely finish in this split point
}
- loops.push_back(loop);
- last = end + 1;
- loop.clear();
- min_end = end; //avoid this split from repeating
- }
- } while (split != -1);
+ } while (split != -1);
+
+ } while (point != last);
}
- if (loop.size()) {
+ if (loop.size() >=2 ) { //points remained
+ //points remain
+ loop.push_back(last); //no splits found, use last
loops.push_back(loop);
}
- Vector<int> indices;
+ print_line("total loops: " + itos(loops.size()));
- for (int i = 0; i < loops.size(); i++) {
- Vector<int> loop = loops[i];
- Vector<Vector2> vertices;
- vertices.resize(loop.size());
- for (int j = 0; j < vertices.size(); j++) {
- vertices.write[j] = points[loop[j]];
- }
- Vector<int> sub_indices = Geometry::triangulate_polygon(vertices);
- int from = indices.size();
- indices.resize(from + sub_indices.size());
- for (int j = 0; j < sub_indices.size(); j++) {
- indices.write[from + j] = loop[sub_indices[j]];
+ if (loops.size()) { //loops found
+ Vector<int> indices;
+
+ for (int i = 0; i < loops.size(); i++) {
+ Vector<int> loop = loops[i];
+ Vector<Vector2> vertices;
+ vertices.resize(loop.size());
+ for (int j = 0; j < vertices.size(); j++) {
+ vertices.write[j] = points[loop[j]];
+ }
+ Vector<int> sub_indices = Geometry::triangulate_polygon(vertices);
+ int from = indices.size();
+ indices.resize(from + sub_indices.size());
+ for (int j = 0; j < sub_indices.size(); j++) {
+ indices.write[from + j] = loop[sub_indices[j]];
+ }
}
- }
- VS::get_singleton()->canvas_item_add_triangle_array(get_canvas_item(), indices, points, colors, uvs, bones, weights, texture.is_valid() ? texture->get_rid() : RID());
+ VS::get_singleton()->canvas_item_add_triangle_array(get_canvas_item(), indices, points, colors, uvs, bones, weights, texture.is_valid() ? texture->get_rid() : RID());
+ }
+#endif
}
} break;
@@ -362,6 +527,15 @@ PoolVector<Vector2> Polygon2D::get_polygon() const {
return polygon;
}
+void Polygon2D::set_internal_vertex_count(int p_count) {
+
+ internal_vertices = p_count;
+}
+
+int Polygon2D::get_internal_vertex_count() const {
+ return internal_vertices;
+}
+
void Polygon2D::set_uv(const PoolVector<Vector2> &p_uv) {
uv = p_uv;
@@ -373,16 +547,15 @@ PoolVector<Vector2> Polygon2D::get_uv() const {
return uv;
}
-void Polygon2D::set_splits(const PoolVector<int> &p_splits) {
+void Polygon2D::set_polygons(const Array &p_polygons) {
- ERR_FAIL_COND(p_splits.size() & 1); //splits should be multiple of 2
- splits = p_splits;
+ polygons = p_polygons;
update();
}
-PoolVector<int> Polygon2D::get_splits() const {
+Array Polygon2D::get_polygons() const {
- return splits;
+ return polygons;
}
void Polygon2D::set_color(const Color &p_color) {
@@ -585,8 +758,8 @@ void Polygon2D::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_color", "color"), &Polygon2D::set_color);
ClassDB::bind_method(D_METHOD("get_color"), &Polygon2D::get_color);
- ClassDB::bind_method(D_METHOD("set_splits", "splits"), &Polygon2D::set_splits);
- ClassDB::bind_method(D_METHOD("get_splits"), &Polygon2D::get_splits);
+ ClassDB::bind_method(D_METHOD("set_polygons", "polygons"), &Polygon2D::set_polygons);
+ ClassDB::bind_method(D_METHOD("get_polygons"), &Polygon2D::get_polygons);
ClassDB::bind_method(D_METHOD("set_vertex_colors", "vertex_colors"), &Polygon2D::set_vertex_colors);
ClassDB::bind_method(D_METHOD("get_vertex_colors"), &Polygon2D::get_vertex_colors);
@@ -630,14 +803,13 @@ void Polygon2D::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_skeleton", "skeleton"), &Polygon2D::set_skeleton);
ClassDB::bind_method(D_METHOD("get_skeleton"), &Polygon2D::get_skeleton);
+ ClassDB::bind_method(D_METHOD("set_internal_vertex_count", "internal_vertex_count"), &Polygon2D::set_internal_vertex_count);
+ ClassDB::bind_method(D_METHOD("get_internal_vertex_count"), &Polygon2D::get_internal_vertex_count);
+
ClassDB::bind_method(D_METHOD("_set_bones", "bones"), &Polygon2D::_set_bones);
ClassDB::bind_method(D_METHOD("_get_bones"), &Polygon2D::_get_bones);
- ADD_PROPERTY(PropertyInfo(Variant::POOL_VECTOR2_ARRAY, "polygon"), "set_polygon", "get_polygon");
- ADD_PROPERTY(PropertyInfo(Variant::POOL_VECTOR2_ARRAY, "uv"), "set_uv", "get_uv");
- ADD_PROPERTY(PropertyInfo(Variant::POOL_INT_ARRAY, "splits"), "set_splits", "get_splits");
ADD_PROPERTY(PropertyInfo(Variant::COLOR, "color"), "set_color", "get_color");
- ADD_PROPERTY(PropertyInfo(Variant::POOL_COLOR_ARRAY, "vertex_colors"), "set_vertex_colors", "get_vertex_colors");
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "offset"), "set_offset", "get_offset");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "antialiased"), "set_antialiased", "get_antialiased");
ADD_GROUP("Texture", "");
@@ -654,7 +826,13 @@ void Polygon2D::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "invert_enable"), "set_invert", "get_invert");
ADD_PROPERTY(PropertyInfo(Variant::REAL, "invert_border", PROPERTY_HINT_RANGE, "0.1,16384,0.1"), "set_invert_border", "get_invert_border");
+ ADD_GROUP("Data", "");
+ ADD_PROPERTY(PropertyInfo(Variant::POOL_VECTOR2_ARRAY, "polygon"), "set_polygon", "get_polygon");
+ ADD_PROPERTY(PropertyInfo(Variant::POOL_VECTOR2_ARRAY, "uv"), "set_uv", "get_uv");
+ ADD_PROPERTY(PropertyInfo(Variant::POOL_COLOR_ARRAY, "vertex_colors"), "set_vertex_colors", "get_vertex_colors");
+ ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "polygons"), "set_polygons", "get_polygons");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "bones", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "_set_bones", "_get_bones");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "internal_vertex_count", PROPERTY_HINT_RANGE, "0,1000"), "set_internal_vertex_count", "get_internal_vertex_count");
}
Polygon2D::Polygon2D() {
@@ -667,4 +845,5 @@ Polygon2D::Polygon2D() {
tex_scale = Vector2(1, 1);
color = Color(1, 1, 1);
rect_cache_dirty = true;
+ internal_vertices = 0;
}
diff --git a/scene/2d/polygon_2d.h b/scene/2d/polygon_2d.h
index 575f71d74a..c1d6ebe46e 100644
--- a/scene/2d/polygon_2d.h
+++ b/scene/2d/polygon_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -40,7 +40,8 @@ class Polygon2D : public Node2D {
PoolVector<Vector2> polygon;
PoolVector<Vector2> uv;
PoolVector<Color> vertex_colors;
- PoolVector<int> splits;
+ Array polygons;
+ int internal_vertices;
struct Bone {
NodePath path;
@@ -87,11 +88,14 @@ public:
void set_polygon(const PoolVector<Vector2> &p_polygon);
PoolVector<Vector2> get_polygon() const;
+ void set_internal_vertex_count(int p_count);
+ int get_internal_vertex_count() const;
+
void set_uv(const PoolVector<Vector2> &p_uv);
PoolVector<Vector2> get_uv() const;
- void set_splits(const PoolVector<int> &p_uv);
- PoolVector<int> get_splits() const;
+ void set_polygons(const Array &p_polygons);
+ Array get_polygons() const;
void set_color(const Color &p_color);
Color get_color() const;
diff --git a/scene/2d/position_2d.cpp b/scene/2d/position_2d.cpp
index 543314eefa..bed6f8a816 100644
--- a/scene/2d/position_2d.cpp
+++ b/scene/2d/position_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/position_2d.h b/scene/2d/position_2d.h
index bff474cccd..c95315fea3 100644
--- a/scene/2d/position_2d.h
+++ b/scene/2d/position_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/ray_cast_2d.cpp b/scene/2d/ray_cast_2d.cpp
index f7c18a17df..57dfe5176d 100644
--- a/scene/2d/ray_cast_2d.cpp
+++ b/scene/2d/ray_cast_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/ray_cast_2d.h b/scene/2d/ray_cast_2d.h
index a438be87b6..f53f3ff07b 100644
--- a/scene/2d/ray_cast_2d.h
+++ b/scene/2d/ray_cast_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/remote_transform_2d.cpp b/scene/2d/remote_transform_2d.cpp
index f0274e5206..1c38a91877 100644
--- a/scene/2d/remote_transform_2d.cpp
+++ b/scene/2d/remote_transform_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/remote_transform_2d.h b/scene/2d/remote_transform_2d.h
index 3f395f820e..16a5417592 100644
--- a/scene/2d/remote_transform_2d.h
+++ b/scene/2d/remote_transform_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/screen_button.cpp b/scene/2d/screen_button.cpp
index 44a41328e8..fb1558a404 100644
--- a/scene/2d/screen_button.cpp
+++ b/scene/2d/screen_button.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/screen_button.h b/scene/2d/screen_button.h
index 3e8adc2e5e..fd944ead64 100644
--- a/scene/2d/screen_button.h
+++ b/scene/2d/screen_button.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/skeleton_2d.cpp b/scene/2d/skeleton_2d.cpp
index 1c504d00fc..2a674e64e6 100644
--- a/scene/2d/skeleton_2d.cpp
+++ b/scene/2d/skeleton_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/skeleton_2d.h b/scene/2d/skeleton_2d.h
index 9d0a061457..cf9877e6f8 100644
--- a/scene/2d/skeleton_2d.h
+++ b/scene/2d/skeleton_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/sprite.cpp b/scene/2d/sprite.cpp
index f4e6e2bdbb..ba103a8bf0 100644
--- a/scene/2d/sprite.cpp
+++ b/scene/2d/sprite.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/sprite.h b/scene/2d/sprite.h
index ab444f89fc..e38db3a299 100644
--- a/scene/2d/sprite.h
+++ b/scene/2d/sprite.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp
index 8fe65f53a9..d61296b13f 100644
--- a/scene/2d/tile_map.cpp
+++ b/scene/2d/tile_map.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -327,6 +327,11 @@ void TileMap::update_dirty_quadrants() {
Ref<ShaderMaterial> mat = tile_set->tile_get_material(c.id);
int z_index = tile_set->tile_get_z_index(c.id);
+ if (tile_set->tile_get_tile_mode(c.id) == TileSet::AUTO_TILE ||
+ tile_set->tile_get_tile_mode(c.id) == TileSet::ATLAS_TILE) {
+ z_index += tile_set->autotile_get_z_index(c.id, Vector2(c.autotile_coord_x, c.autotile_coord_y));
+ }
+
RID canvas_item;
RID debug_canvas_item;
@@ -372,13 +377,12 @@ void TileMap::update_dirty_quadrants() {
r.size = tile_set->autotile_get_size(c.id);
r.position += (r.size + Vector2(spacing, spacing)) * Vector2(c.autotile_coord_x, c.autotile_coord_y);
}
- Size2 s = tex->get_size();
+ Size2 s;
if (r == Rect2())
s = tex->get_size();
- else {
+ else
s = r.size;
- }
Rect2 rect;
rect.position = offset.floor();
@@ -835,7 +839,7 @@ void TileMap::update_cell_bitmask(int p_x, int p_y) {
Map<PosKey, Cell>::Element *E = tile_map.find(p);
if (E != NULL) {
int id = get_cell(p_x, p_y);
- if (tile_set->tile_get_tile_mode(id) == TileSet::AUTO_TILE || tile_set->tile_get_tile_mode(id) == TileSet::ATLAS_TILE) {
+ if (tile_set->tile_get_tile_mode(id) == TileSet::AUTO_TILE) {
uint16_t mask = 0;
if (tile_set->autotile_get_bitmask_mode(id) == TileSet::BITMASK_2X2) {
if (tile_set->is_tile_bound(id, get_cell(p_x - 1, p_y - 1)) && tile_set->is_tile_bound(id, get_cell(p_x, p_y - 1)) && tile_set->is_tile_bound(id, get_cell(p_x - 1, p_y))) {
@@ -899,7 +903,8 @@ void TileMap::update_cell_bitmask(int p_x, int p_y) {
PosKey qk(p_x / _get_quadrant_size(), p_y / _get_quadrant_size());
Map<PosKey, Quadrant>::Element *Q = quadrant_map.find(qk);
_make_quadrant_dirty(Q);
- } else {
+
+ } else if (tile_set->tile_get_tile_mode(id) == TileSet::SINGLE_TILE) {
E->get().autotile_coord_x = 0;
E->get().autotile_coord_y = 0;
}
@@ -1625,6 +1630,8 @@ void TileMap::_bind_methods() {
ClassDB::bind_method(D_METHOD("is_cell_y_flipped", "x", "y"), &TileMap::is_cell_y_flipped);
ClassDB::bind_method(D_METHOD("is_cell_transposed", "x", "y"), &TileMap::is_cell_transposed);
+ ClassDB::bind_method(D_METHOD("get_cell_autotile_coord", "x", "y"), &TileMap::get_cell_autotile_coord);
+
ClassDB::bind_method(D_METHOD("fix_invalid_tiles"), &TileMap::fix_invalid_tiles);
ClassDB::bind_method(D_METHOD("clear"), &TileMap::clear);
diff --git a/scene/2d/tile_map.h b/scene/2d/tile_map.h
index 499c79b180..a44098fd77 100644
--- a/scene/2d/tile_map.h
+++ b/scene/2d/tile_map.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/visibility_notifier_2d.cpp b/scene/2d/visibility_notifier_2d.cpp
index 7d7c47619a..1cf037daf2 100644
--- a/scene/2d/visibility_notifier_2d.cpp
+++ b/scene/2d/visibility_notifier_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -190,7 +190,7 @@ void VisibilityEnabler2D::_find_nodes(Node *p_node) {
if (enabler[ENABLER_FREEZE_BODIES]) {
RigidBody2D *rb2d = Object::cast_to<RigidBody2D>(p_node);
- if (rb2d && ((rb2d->get_mode() == RigidBody2D::MODE_CHARACTER || (rb2d->get_mode() == RigidBody2D::MODE_RIGID && !rb2d->is_able_to_sleep())))) {
+ if (rb2d && ((rb2d->get_mode() == RigidBody2D::MODE_CHARACTER || rb2d->get_mode() == RigidBody2D::MODE_RIGID))) {
add = true;
meta = rb2d->get_mode();
diff --git a/scene/2d/visibility_notifier_2d.h b/scene/2d/visibility_notifier_2d.h
index 04084b609a..259368455b 100644
--- a/scene/2d/visibility_notifier_2d.h
+++ b/scene/2d/visibility_notifier_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/y_sort.cpp b/scene/2d/y_sort.cpp
index d3997c13c3..d7e523e189 100644
--- a/scene/2d/y_sort.cpp
+++ b/scene/2d/y_sort.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/2d/y_sort.h b/scene/2d/y_sort.h
index 5ff12aa25a..1bf757720e 100644
--- a/scene/2d/y_sort.h
+++ b/scene/2d/y_sort.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/area.cpp b/scene/3d/area.cpp
index 5e78368804..99f43b1242 100644
--- a/scene/3d/area.cpp
+++ b/scene/3d/area.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -157,7 +157,9 @@ void Area::_body_inout(int p_status, const RID &p_body, int p_instance, int p_bo
Map<ObjectID, BodyState>::Element *E = body_map.find(objid);
- ERR_FAIL_COND(!body_in && !E);
+ if (!body_in && !E) {
+ return; //likely removed from the tree
+ }
locked = true;
@@ -751,6 +753,7 @@ Area::Area() :
angular_damp = 1;
priority = 0;
monitoring = false;
+ monitorable = false;
collision_mask = 1;
collision_layer = 1;
set_ray_pickable(false);
diff --git a/scene/3d/area.h b/scene/3d/area.h
index e1ff1079e3..043d651e04 100644
--- a/scene/3d/area.h
+++ b/scene/3d/area.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/arvr_nodes.cpp b/scene/3d/arvr_nodes.cpp
index 2dc500f7ab..17b698c1b8 100644
--- a/scene/3d/arvr_nodes.cpp
+++ b/scene/3d/arvr_nodes.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -266,6 +266,7 @@ void ARVRController::set_controller_id(int p_controller_id) {
// We don't check any bounds here, this controller may not yet be active and just be a place holder until it is.
// Note that setting this to 0 means this node is not bound to a controller yet.
controller_id = p_controller_id;
+ update_configuration_warning();
};
int ARVRController::get_controller_id(void) const {
@@ -446,6 +447,7 @@ void ARVRAnchor::set_anchor_id(int p_anchor_id) {
// We don't check any bounds here, this anchor may not yet be active and just be a place holder until it is.
// Note that setting this to 0 means this node is not bound to an anchor yet.
anchor_id = p_anchor_id;
+ update_configuration_warning();
};
int ARVRAnchor::get_anchor_id(void) const {
diff --git a/scene/3d/arvr_nodes.h b/scene/3d/arvr_nodes.h
index d6690676cc..523bc112c1 100644
--- a/scene/3d/arvr_nodes.h
+++ b/scene/3d/arvr_nodes.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/audio_stream_player_3d.cpp b/scene/3d/audio_stream_player_3d.cpp
index afd87deca6..0f4d0383a4 100644
--- a/scene/3d/audio_stream_player_3d.cpp
+++ b/scene/3d/audio_stream_player_3d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -33,6 +33,7 @@
#include "scene/3d/area.h"
#include "scene/3d/camera.h"
#include "scene/main/viewport.h"
+
void AudioStreamPlayer3D::_mix_audio() {
if (!stream_playback.is_valid() || !active ||
@@ -206,15 +207,15 @@ float AudioStreamPlayer3D::_get_attenuation_db(float p_distance) const {
float att = 0;
switch (attenuation_model) {
case ATTENUATION_INVERSE_DISTANCE: {
- att = Math::linear2db(1.0 / ((p_distance / unit_size) + 000001));
+ att = Math::linear2db(1.0 / ((p_distance / unit_size) + CMP_EPSILON));
} break;
case ATTENUATION_INVERSE_SQUARE_DISTANCE: {
float d = (p_distance / unit_size);
d *= d;
- att = Math::linear2db(1.0 / (d + 0.00001));
+ att = Math::linear2db(1.0 / (d + CMP_EPSILON));
} break;
case ATTENUATION_LOGARITHMIC: {
- att = -20 * Math::log(p_distance / unit_size + 000001);
+ att = -20 * Math::log(p_distance / unit_size + CMP_EPSILON);
} break;
default: {
ERR_PRINT("Unknown attenuation type");
diff --git a/scene/3d/audio_stream_player_3d.h b/scene/3d/audio_stream_player_3d.h
index 14413d0702..881652da64 100644
--- a/scene/3d/audio_stream_player_3d.h
+++ b/scene/3d/audio_stream_player_3d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/baked_lightmap.cpp b/scene/3d/baked_lightmap.cpp
index 62589bd67e..d66e6cc83d 100644
--- a/scene/3d/baked_lightmap.cpp
+++ b/scene/3d/baked_lightmap.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/baked_lightmap.h b/scene/3d/baked_lightmap.h
index 60b62f74eb..bb3f84719a 100644
--- a/scene/3d/baked_lightmap.h
+++ b/scene/3d/baked_lightmap.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/bone_attachment.cpp b/scene/3d/bone_attachment.cpp
index a875b65c22..0233029435 100644
--- a/scene/3d/bone_attachment.cpp
+++ b/scene/3d/bone_attachment.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/bone_attachment.h b/scene/3d/bone_attachment.h
index 81a225015e..051e2b4c56 100644
--- a/scene/3d/bone_attachment.h
+++ b/scene/3d/bone_attachment.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/camera.cpp b/scene/3d/camera.cpp
index 8ef64e2e80..fd28b876f3 100644
--- a/scene/3d/camera.cpp
+++ b/scene/3d/camera.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/camera.h b/scene/3d/camera.h
index a35c9d6e7f..a531324a85 100644
--- a/scene/3d/camera.h
+++ b/scene/3d/camera.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/collision_object.cpp b/scene/3d/collision_object.cpp
index 99b8ce0567..d8c2042c88 100644
--- a/scene/3d/collision_object.cpp
+++ b/scene/3d/collision_object.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/collision_object.h b/scene/3d/collision_object.h
index f8ef04b78f..90f370b6d4 100644
--- a/scene/3d/collision_object.h
+++ b/scene/3d/collision_object.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/collision_polygon.cpp b/scene/3d/collision_polygon.cpp
index 379dd21c39..db07059b32 100644
--- a/scene/3d/collision_polygon.cpp
+++ b/scene/3d/collision_polygon.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/collision_polygon.h b/scene/3d/collision_polygon.h
index f1f137c9c5..04c00fc70f 100644
--- a/scene/3d/collision_polygon.h
+++ b/scene/3d/collision_polygon.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/collision_shape.cpp b/scene/3d/collision_shape.cpp
index 4fd68fb47d..daee291ba3 100644
--- a/scene/3d/collision_shape.cpp
+++ b/scene/3d/collision_shape.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/collision_shape.h b/scene/3d/collision_shape.h
index 6ca8e80ea1..0c8e383a7f 100644
--- a/scene/3d/collision_shape.h
+++ b/scene/3d/collision_shape.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/cpu_particles.cpp b/scene/3d/cpu_particles.cpp
index a22708ac99..29610cb0bf 100644
--- a/scene/3d/cpu_particles.cpp
+++ b/scene/3d/cpu_particles.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -217,7 +217,7 @@ String CPUParticles::get_configuration_warning() const {
if (!mesh_found) {
if (warnings != String())
warnings += "\n";
- warnings += "- " + TTR("Nothing is visible because no mesh has not been assigned.");
+ warnings += "- " + TTR("Nothing is visible because no mesh has been assigned.");
}
if (!anim_material_found && (get_param(PARAM_ANIM_SPEED) != 0.0 || get_param(PARAM_ANIM_OFFSET) != 0.0 ||
@@ -523,7 +523,7 @@ void CPUParticles::_particles_process(float p_delta) {
Basis velocity_xform;
if (!local_coords) {
emission_xform = get_global_transform();
- velocity_xform = emission_xform.basis.inverse().transposed();
+ velocity_xform = emission_xform.basis;
}
for (int i = 0; i < pcount; i++) {
@@ -605,19 +605,14 @@ void CPUParticles::_particles_process(float p_delta) {
p.hue_rot_rand = Math::randf();
p.anim_offset_rand = Math::randf();
- float angle1_rad;
- float angle2_rad;
-
if (flags[FLAG_DISABLE_Z]) {
-
- angle1_rad = (Math::randf() * 2.0 - 1.0) * Math_PI * spread / 180.0;
+ float angle1_rad = (Math::randf() * 2.0 - 1.0) * Math_PI * spread / 180.0;
Vector3 rot = Vector3(Math::cos(angle1_rad), Math::sin(angle1_rad), 0.0);
p.velocity = rot * parameters[PARAM_INITIAL_LINEAR_VELOCITY] * Math::lerp(1.0f, float(Math::randf()), randomness[PARAM_INITIAL_LINEAR_VELOCITY]);
-
} else {
//initiate velocity spread in 3D
- angle1_rad = (Math::randf() * 2.0 - 1.0) * Math_PI * spread / 180.0;
- angle2_rad = (Math::randf() * 2.0 - 1.0) * (1.0 - flatness) * Math_PI * spread / 180.0;
+ float angle1_rad = (Math::randf() * 2.0 - 1.0) * Math_PI * spread / 180.0;
+ float angle2_rad = (Math::randf() * 2.0 - 1.0) * (1.0 - flatness) * Math_PI * spread / 180.0;
Vector3 direction_xz = Vector3(Math::sin(angle1_rad), 0, Math::cos(angle1_rad));
Vector3 direction_yz = Vector3(0, Math::sin(angle2_rad), Math::cos(angle2_rad));
@@ -691,7 +686,7 @@ void CPUParticles::_particles_process(float p_delta) {
if (flags[FLAG_DISABLE_Z]) {
p.velocity.z = 0.0;
- p.velocity.z = 0.0;
+ p.transform.origin.z = 0.0;
}
} else if (!p.active) {
@@ -757,15 +752,15 @@ void CPUParticles::_particles_process(float p_delta) {
}
Vector3 force = gravity;
- Vector3 pos = p.transform.origin;
+ Vector3 position = p.transform.origin;
if (flags[FLAG_DISABLE_Z]) {
- pos.z = 0.0;
+ position.z = 0.0;
}
//apply linear acceleration
force += p.velocity.length() > 0.0 ? p.velocity.normalized() * (parameters[PARAM_LINEAR_ACCEL] + tex_linear_accel) * Math::lerp(1.0f, rand_from_seed(alt_seed), randomness[PARAM_LINEAR_ACCEL]) : Vector3();
//apply radial acceleration
Vector3 org = emission_xform.origin;
- Vector3 diff = pos - org;
+ Vector3 diff = position - org;
force += diff.length() > 0.0 ? diff.normalized() * (parameters[PARAM_RADIAL_ACCEL] + tex_radial_accel) * Math::lerp(1.0f, rand_from_seed(alt_seed), randomness[PARAM_RADIAL_ACCEL]) : Vector3();
//apply tangential acceleration;
if (flags[FLAG_DISABLE_Z]) {
@@ -1361,15 +1356,15 @@ void CPUParticles::_bind_methods() {
ADD_PROPERTYI(PropertyInfo(Variant::REAL, "angle_random", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_param_randomness", "get_param_randomness", PARAM_ANGLE);
ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "angle_curve", PROPERTY_HINT_RESOURCE_TYPE, "Curve"), "set_param_curve", "get_param_curve", PARAM_ANGLE);
ADD_GROUP("Scale", "");
- ADD_PROPERTYI(PropertyInfo(Variant::REAL, "scale", PROPERTY_HINT_RANGE, "0,1000,0.01,or_greater"), "set_param", "get_param", PARAM_SCALE);
- ADD_PROPERTYI(PropertyInfo(Variant::REAL, "scale_random", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_param_randomness", "get_param_randomness", PARAM_SCALE);
- ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "scale_curve", PROPERTY_HINT_RESOURCE_TYPE, "Curve"), "set_param_curve", "get_param_curve", PARAM_SCALE);
+ ADD_PROPERTYI(PropertyInfo(Variant::REAL, "scale_amount", PROPERTY_HINT_RANGE, "0,1000,0.01,or_greater"), "set_param", "get_param", PARAM_SCALE);
+ ADD_PROPERTYI(PropertyInfo(Variant::REAL, "scale_amount_random", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_param_randomness", "get_param_randomness", PARAM_SCALE);
+ ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "scale_amount_curve", PROPERTY_HINT_RESOURCE_TYPE, "Curve"), "set_param_curve", "get_param_curve", PARAM_SCALE);
ADD_GROUP("Color", "");
ADD_PROPERTY(PropertyInfo(Variant::COLOR, "color"), "set_color", "get_color");
- ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "color_ramp", PROPERTY_HINT_RESOURCE_TYPE, "GradientTexture"), "set_color_ramp", "get_color_ramp");
+ ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "color_ramp", PROPERTY_HINT_RESOURCE_TYPE, "Gradient"), "set_color_ramp", "get_color_ramp");
ADD_GROUP("Hue Variation", "hue_");
- ADD_PROPERTYI(PropertyInfo(Variant::REAL, "hue_variation", PROPERTY_HINT_RANGE, "-1,1,0.1"), "set_param", "get_param", PARAM_HUE_VARIATION);
+ ADD_PROPERTYI(PropertyInfo(Variant::REAL, "hue_variation", PROPERTY_HINT_RANGE, "-1,1,0.01"), "set_param", "get_param", PARAM_HUE_VARIATION);
ADD_PROPERTYI(PropertyInfo(Variant::REAL, "hue_variation_random", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_param_randomness", "get_param_randomness", PARAM_HUE_VARIATION);
ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "hue_variation_curve", PROPERTY_HINT_RESOURCE_TYPE, "Curve"), "set_param_curve", "get_param_curve", PARAM_HUE_VARIATION);
ADD_GROUP("Animation", "anim_");
diff --git a/scene/3d/cpu_particles.h b/scene/3d/cpu_particles.h
index 2e83924dfc..b50befe7be 100644
--- a/scene/3d/cpu_particles.h
+++ b/scene/3d/cpu_particles.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/gi_probe.cpp b/scene/3d/gi_probe.cpp
index 6276d02eff..5b08ea7790 100644
--- a/scene/3d/gi_probe.cpp
+++ b/scene/3d/gi_probe.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/gi_probe.h b/scene/3d/gi_probe.h
index af4b646590..87664e06b8 100644
--- a/scene/3d/gi_probe.h
+++ b/scene/3d/gi_probe.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/immediate_geometry.cpp b/scene/3d/immediate_geometry.cpp
index 14a0b0505d..a555106bd8 100644
--- a/scene/3d/immediate_geometry.cpp
+++ b/scene/3d/immediate_geometry.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/immediate_geometry.h b/scene/3d/immediate_geometry.h
index f7201b4bba..3467663dff 100644
--- a/scene/3d/immediate_geometry.h
+++ b/scene/3d/immediate_geometry.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/interpolated_camera.cpp b/scene/3d/interpolated_camera.cpp
index 93832f8e00..d720dd117c 100644
--- a/scene/3d/interpolated_camera.cpp
+++ b/scene/3d/interpolated_camera.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/interpolated_camera.h b/scene/3d/interpolated_camera.h
index b025112295..97100c9501 100644
--- a/scene/3d/interpolated_camera.h
+++ b/scene/3d/interpolated_camera.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/light.cpp b/scene/3d/light.cpp
index 11d61315ba..3b514dab8c 100644
--- a/scene/3d/light.cpp
+++ b/scene/3d/light.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/light.h b/scene/3d/light.h
index b35b397ced..85e0ce3c24 100644
--- a/scene/3d/light.h
+++ b/scene/3d/light.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/listener.cpp b/scene/3d/listener.cpp
index 439c1f8c45..85e65e23f2 100644
--- a/scene/3d/listener.cpp
+++ b/scene/3d/listener.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/listener.h b/scene/3d/listener.h
index 8047971ebd..86451e7d99 100644
--- a/scene/3d/listener.h
+++ b/scene/3d/listener.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -71,8 +71,6 @@ public:
void set_visible_layers(uint32_t p_layers);
uint32_t get_visible_layers() const;
- Vector<Plane> get_frustum() const;
-
Listener();
~Listener();
};
diff --git a/scene/3d/mesh_instance.cpp b/scene/3d/mesh_instance.cpp
index cf0317cd58..848889155b 100644
--- a/scene/3d/mesh_instance.cpp
+++ b/scene/3d/mesh_instance.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -138,6 +138,8 @@ void MeshInstance::set_mesh(const Ref<Mesh> &p_mesh) {
set_base(RID());
}
+ update_gizmo();
+
_change_notify();
}
Ref<Mesh> MeshInstance::get_mesh() const {
diff --git a/scene/3d/mesh_instance.h b/scene/3d/mesh_instance.h
index 0b5b4b9e7b..022ef15aad 100644
--- a/scene/3d/mesh_instance.h
+++ b/scene/3d/mesh_instance.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/multimesh_instance.cpp b/scene/3d/multimesh_instance.cpp
index 4cbd1df64a..d744a74859 100644
--- a/scene/3d/multimesh_instance.cpp
+++ b/scene/3d/multimesh_instance.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/multimesh_instance.h b/scene/3d/multimesh_instance.h
index 1cd077a0a5..8f41aa8fd2 100644
--- a/scene/3d/multimesh_instance.h
+++ b/scene/3d/multimesh_instance.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/navigation.cpp b/scene/3d/navigation.cpp
index 6e7b372647..5a3c8223ff 100644
--- a/scene/3d/navigation.cpp
+++ b/scene/3d/navigation.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/navigation.h b/scene/3d/navigation.h
index 8f200997cd..f920d1d7f6 100644
--- a/scene/3d/navigation.h
+++ b/scene/3d/navigation.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/navigation_mesh.cpp b/scene/3d/navigation_mesh.cpp
index 99680b7273..75301af657 100644
--- a/scene/3d/navigation_mesh.cpp
+++ b/scene/3d/navigation_mesh.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/navigation_mesh.h b/scene/3d/navigation_mesh.h
index 753ad76edc..74531e2423 100644
--- a/scene/3d/navigation_mesh.h
+++ b/scene/3d/navigation_mesh.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/particles.cpp b/scene/3d/particles.cpp
index 3fff42aa78..2add50dd5d 100644
--- a/scene/3d/particles.cpp
+++ b/scene/3d/particles.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/particles.h b/scene/3d/particles.h
index 72241c5c89..42c68010db 100644
--- a/scene/3d/particles.h
+++ b/scene/3d/particles.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/path.cpp b/scene/3d/path.cpp
index 339a434a6e..9fae5a9a54 100644
--- a/scene/3d/path.cpp
+++ b/scene/3d/path.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -44,10 +44,11 @@ void Path::_curve_changed() {
emit_signal("curve_changed");
}
- // update the configuration warnings of all children of type OrientedPathFollows
+ // update the configuration warnings of all children of type PathFollow
+ // previously used for PathFollowOriented (now enforced orientation is done in PathFollow)
if (is_inside_tree()) {
for (int i = 0; i < get_child_count(); i++) {
- OrientedPathFollow *child = Object::cast_to<OrientedPathFollow>(get_child(i));
+ PathFollow *child = Object::cast_to<PathFollow>(get_child(i));
if (child) {
child->update_configuration_warning();
}
@@ -105,24 +106,64 @@ void PathFollow::_update_transform() {
return;
}
+ float bl = c->get_baked_length();
+ float bi = c->get_bake_interval();
float o = offset;
+ float o_next = offset + bi;
if (loop) {
- o = Math::fposmod(o, c->get_baked_length());
+ o = Math::fposmod(o, bl);
+ o_next = Math::fposmod(o_next, bl);
+ } else if (rotation_mode == ROTATION_ORIENTED && o_next >= bl) {
+ o = bl - bi;
+ o_next = bl;
}
Vector3 pos = c->interpolate_baked(o, cubic);
Transform t = get_transform();
+ // Vector3 pos_offset = Vector3(h_offset, v_offset, 0); not used in all cases
+ // will be replaced by "Vector3(h_offset, v_offset, 0)" where it was formely used
+
+ if (rotation_mode == ROTATION_ORIENTED) {
+
+ Vector3 pos = c->interpolate_baked(o, cubic);
+ Vector3 forward = c->interpolate_baked(o_next, cubic) - pos;
+
+ if (forward.length_squared() < CMP_EPSILON2)
+ forward = Vector3(0, 0, 1);
+ else
+ forward.normalize();
+
+ Vector3 up = c->interpolate_baked_up_vector(o, true);
+
+ if (o_next < o) {
+ Vector3 up1 = c->interpolate_baked_up_vector(o_next, true);
+ Vector3 axis = up.cross(up1);
- t.origin = pos;
- Vector3 pos_offset = Vector3(h_offset, v_offset, 0);
+ if (axis.length_squared() < CMP_EPSILON2)
+ axis = forward;
+ else
+ axis.normalize();
- if (rotation_mode != ROTATION_NONE) {
+ up.rotate(axis, up.angle_to(up1) * 0.5f);
+ }
+
+ Vector3 scale = t.basis.get_scale();
+ Vector3 sideways = up.cross(forward).normalized();
+ up = forward.cross(sideways).normalized();
+
+ t.basis.set(sideways, up, forward);
+ t.basis.scale_local(scale);
+
+ t.origin = pos + sideways * h_offset + up * v_offset;
+ } else if (rotation_mode != ROTATION_NONE) {
// perform parallel transport
//
// see C. Dougan, The Parallel Transport Frame, Game Programming Gems 2 for example
// for a discussion about why not Frenet frame.
+ t.origin = pos;
+
Vector3 t_prev = (pos - c->interpolate_baked(o - delta_offset, cubic)).normalized();
Vector3 t_cur = (c->interpolate_baked(o + delta_offset, cubic) - pos).normalized();
@@ -165,9 +206,9 @@ void PathFollow::_update_transform() {
}
}
- t.translate(pos_offset);
+ t.translate(Vector3(h_offset, v_offset, 0));
} else {
- t.origin += pos_offset;
+ t.origin = pos + Vector3(h_offset, v_offset, 0);
}
set_transform(t);
@@ -213,7 +254,7 @@ void PathFollow::_validate_property(PropertyInfo &property) const {
if (path && path->get_curve().is_valid())
max = path->get_curve()->get_baked_length();
- property.hint_string = "0," + rtos(max) + ",0.01";
+ property.hint_string = "0," + rtos(max) + ",0.01,or_greater";
}
}
@@ -224,6 +265,11 @@ String PathFollow::get_configuration_warning() const {
if (!Object::cast_to<Path>(get_parent())) {
return TTR("PathFollow only works when set as a child of a Path node.");
+ } else {
+ Path *path = Object::cast_to<Path>(get_parent());
+ if (path->get_curve().is_valid() && !path->get_curve()->is_up_vector_enabled() && rotation_mode == ROTATION_ORIENTED) {
+ return TTR("PathFollow ROTATION_ORIENTED requires \"Up Vector\" enabled in its parent Path's Curve resource.");
+ }
}
return String();
@@ -252,11 +298,11 @@ void PathFollow::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_loop", "loop"), &PathFollow::set_loop);
ClassDB::bind_method(D_METHOD("has_loop"), &PathFollow::has_loop);
- ADD_PROPERTY(PropertyInfo(Variant::REAL, "offset", PROPERTY_HINT_EXP_RANGE, "0,10000,0.01,or_greater"), "set_offset", "get_offset");
- ADD_PROPERTY(PropertyInfo(Variant::REAL, "unit_offset", PROPERTY_HINT_RANGE, "0,1,0.0001", PROPERTY_USAGE_EDITOR), "set_unit_offset", "get_unit_offset");
+ ADD_PROPERTY(PropertyInfo(Variant::REAL, "offset", PROPERTY_HINT_RANGE, "0,10000,0.01,or_greater"), "set_offset", "get_offset");
+ ADD_PROPERTY(PropertyInfo(Variant::REAL, "unit_offset", PROPERTY_HINT_RANGE, "0,1,0.0001,or_greater", PROPERTY_USAGE_EDITOR), "set_unit_offset", "get_unit_offset");
ADD_PROPERTY(PropertyInfo(Variant::REAL, "h_offset"), "set_h_offset", "get_h_offset");
ADD_PROPERTY(PropertyInfo(Variant::REAL, "v_offset"), "set_v_offset", "get_v_offset");
- ADD_PROPERTY(PropertyInfo(Variant::INT, "rotation_mode", PROPERTY_HINT_ENUM, "None,Y,XY,XYZ"), "set_rotation_mode", "get_rotation_mode");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "rotation_mode", PROPERTY_HINT_ENUM, "None,Y,XY,XYZ,Oriented"), "set_rotation_mode", "get_rotation_mode");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "cubic_interp"), "set_cubic_interpolation", "get_cubic_interpolation");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "loop"), "set_loop", "has_loop");
@@ -264,6 +310,7 @@ void PathFollow::_bind_methods() {
BIND_ENUM_CONSTANT(ROTATION_Y);
BIND_ENUM_CONSTANT(ROTATION_XY);
BIND_ENUM_CONSTANT(ROTATION_XYZ);
+ BIND_ENUM_CONSTANT(ROTATION_ORIENTED);
}
void PathFollow::set_offset(float p_offset) {
@@ -322,6 +369,8 @@ float PathFollow::get_unit_offset() const {
void PathFollow::set_rotation_mode(RotationMode p_rotation_mode) {
rotation_mode = p_rotation_mode;
+
+ update_configuration_warning();
_update_transform();
}
@@ -351,236 +400,3 @@ PathFollow::PathFollow() {
cubic = true;
loop = true;
}
-
-//////////////
-
-void OrientedPathFollow::_update_transform() {
-
- if (!path)
- return;
-
- Ref<Curve3D> c = path->get_curve();
- if (!c.is_valid())
- return;
-
- int count = c->get_point_count();
- if (count < 2)
- return;
-
- if (delta_offset == 0) {
- return;
- }
-
- float offset = get_offset();
- float bl = c->get_baked_length();
- float bi = c->get_bake_interval();
- float o = offset;
- float o_next = offset + bi;
-
- if (has_loop()) {
- o = Math::fposmod(o, bl);
- o_next = Math::fposmod(o_next, bl);
- } else if (o_next >= bl) {
- o = bl - bi;
- o_next = bl;
- }
-
- bool cubic = get_cubic_interpolation();
- Vector3 pos = c->interpolate_baked(o, cubic);
- Vector3 forward = c->interpolate_baked(o_next, cubic) - pos;
-
- if (forward.length_squared() < CMP_EPSILON2)
- forward = Vector3(0, 0, 1);
- else
- forward.normalize();
-
- Vector3 up = c->interpolate_baked_up_vector(o, true);
-
- if (o_next < o) {
- Vector3 up1 = c->interpolate_baked_up_vector(o_next, true);
- Vector3 axis = up.cross(up1);
-
- if (axis.length_squared() < CMP_EPSILON2)
- axis = forward;
- else
- axis.normalize();
-
- up.rotate(axis, up.angle_to(up1) * 0.5f);
- }
-
- Transform t = get_transform();
- Vector3 scale = t.basis.get_scale();
-
- Vector3 sideways = up.cross(forward).normalized();
- up = forward.cross(sideways).normalized();
-
- t.basis.set(sideways, up, forward);
- t.basis.scale_local(scale);
-
- t.origin = pos + sideways * get_h_offset() + up * get_v_offset();
-
- set_transform(t);
-}
-
-void OrientedPathFollow::_notification(int p_what) {
-
- switch (p_what) {
-
- case NOTIFICATION_ENTER_TREE: {
-
- Node *parent = get_parent();
- if (parent) {
- path = Object::cast_to<Path>(parent);
- if (path) {
- _update_transform();
- }
- }
-
- } break;
- case NOTIFICATION_EXIT_TREE: {
-
- path = NULL;
- } break;
- }
-}
-
-void OrientedPathFollow::set_cubic_interpolation(bool p_enable) {
-
- cubic = p_enable;
-}
-
-bool OrientedPathFollow::get_cubic_interpolation() const {
-
- return cubic;
-}
-
-void OrientedPathFollow::_validate_property(PropertyInfo &property) const {
-
- if (property.name == "offset") {
-
- float max = 10000;
- if (path && path->get_curve().is_valid())
- max = path->get_curve()->get_baked_length();
-
- property.hint_string = "0," + rtos(max) + ",0.01";
- }
-}
-
-String OrientedPathFollow::get_configuration_warning() const {
-
- if (!is_visible_in_tree() || !is_inside_tree())
- return String();
-
- if (!Object::cast_to<Path>(get_parent())) {
- return TTR("OrientedPathFollow only works when set as a child of a Path node.");
- } else {
- Path *path = Object::cast_to<Path>(get_parent());
- if (path->get_curve().is_valid() && !path->get_curve()->is_up_vector_enabled()) {
- return TTR("OrientedPathFollow requires up vectors enabled in its parent Path.");
- }
- }
-
- return String();
-}
-
-void OrientedPathFollow::_bind_methods() {
-
- ClassDB::bind_method(D_METHOD("set_offset", "offset"), &OrientedPathFollow::set_offset);
- ClassDB::bind_method(D_METHOD("get_offset"), &OrientedPathFollow::get_offset);
-
- ClassDB::bind_method(D_METHOD("set_h_offset", "h_offset"), &OrientedPathFollow::set_h_offset);
- ClassDB::bind_method(D_METHOD("get_h_offset"), &OrientedPathFollow::get_h_offset);
-
- ClassDB::bind_method(D_METHOD("set_v_offset", "v_offset"), &OrientedPathFollow::set_v_offset);
- ClassDB::bind_method(D_METHOD("get_v_offset"), &OrientedPathFollow::get_v_offset);
-
- ClassDB::bind_method(D_METHOD("set_unit_offset", "unit_offset"), &OrientedPathFollow::set_unit_offset);
- ClassDB::bind_method(D_METHOD("get_unit_offset"), &OrientedPathFollow::get_unit_offset);
-
- ClassDB::bind_method(D_METHOD("set_cubic_interpolation", "enable"), &OrientedPathFollow::set_cubic_interpolation);
- ClassDB::bind_method(D_METHOD("get_cubic_interpolation"), &OrientedPathFollow::get_cubic_interpolation);
-
- ClassDB::bind_method(D_METHOD("set_loop", "loop"), &OrientedPathFollow::set_loop);
- ClassDB::bind_method(D_METHOD("has_loop"), &OrientedPathFollow::has_loop);
-
- ADD_PROPERTY(PropertyInfo(Variant::REAL, "offset", PROPERTY_HINT_RANGE, "0,10000,0.01"), "set_offset", "get_offset");
- ADD_PROPERTY(PropertyInfo(Variant::REAL, "unit_offset", PROPERTY_HINT_RANGE, "0,1,0.0001", PROPERTY_USAGE_EDITOR), "set_unit_offset", "get_unit_offset");
- ADD_PROPERTY(PropertyInfo(Variant::REAL, "h_offset"), "set_h_offset", "get_h_offset");
- ADD_PROPERTY(PropertyInfo(Variant::REAL, "v_offset"), "set_v_offset", "get_v_offset");
- ADD_PROPERTY(PropertyInfo(Variant::BOOL, "cubic_interp"), "set_cubic_interpolation", "get_cubic_interpolation");
- ADD_PROPERTY(PropertyInfo(Variant::BOOL, "loop"), "set_loop", "has_loop");
-}
-
-void OrientedPathFollow::set_offset(float p_offset) {
- delta_offset = p_offset - offset;
- offset = p_offset;
-
- if (path)
- _update_transform();
- _change_notify("offset");
- _change_notify("unit_offset");
-}
-
-void OrientedPathFollow::set_h_offset(float p_h_offset) {
-
- h_offset = p_h_offset;
- if (path)
- _update_transform();
-}
-
-float OrientedPathFollow::get_h_offset() const {
-
- return h_offset;
-}
-
-void OrientedPathFollow::set_v_offset(float p_v_offset) {
-
- v_offset = p_v_offset;
- if (path)
- _update_transform();
-}
-
-float OrientedPathFollow::get_v_offset() const {
-
- return v_offset;
-}
-
-float OrientedPathFollow::get_offset() const {
-
- return offset;
-}
-
-void OrientedPathFollow::set_unit_offset(float p_unit_offset) {
-
- if (path && path->get_curve().is_valid() && path->get_curve()->get_baked_length())
- set_offset(p_unit_offset * path->get_curve()->get_baked_length());
-}
-
-float OrientedPathFollow::get_unit_offset() const {
-
- if (path && path->get_curve().is_valid() && path->get_curve()->get_baked_length())
- return get_offset() / path->get_curve()->get_baked_length();
- else
- return 0;
-}
-
-void OrientedPathFollow::set_loop(bool p_loop) {
-
- loop = p_loop;
-}
-
-bool OrientedPathFollow::has_loop() const {
-
- return loop;
-}
-
-OrientedPathFollow::OrientedPathFollow() {
-
- offset = 0;
- delta_offset = 0;
- h_offset = 0;
- v_offset = 0;
- path = NULL;
- cubic = true;
- loop = true;
-}
diff --git a/scene/3d/path.h b/scene/3d/path.h
index beb37d9714..2a12c4a826 100644
--- a/scene/3d/path.h
+++ b/scene/3d/path.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -63,7 +63,8 @@ public:
ROTATION_NONE,
ROTATION_Y,
ROTATION_XY,
- ROTATION_XYZ
+ ROTATION_XYZ,
+ ROTATION_ORIENTED
};
private:
@@ -113,49 +114,4 @@ public:
VARIANT_ENUM_CAST(PathFollow::RotationMode);
-class OrientedPathFollow : public Spatial {
-
- GDCLASS(OrientedPathFollow, Spatial);
-
-private:
- Path *path;
- real_t delta_offset; // change in offset since last _update_transform
- real_t offset;
- real_t h_offset;
- real_t v_offset;
- bool cubic;
- bool loop;
-
- void _update_transform();
-
-protected:
- virtual void _validate_property(PropertyInfo &property) const;
-
- void _notification(int p_what);
- static void _bind_methods();
-
-public:
- void set_offset(float p_offset);
- float get_offset() const;
-
- void set_h_offset(float p_h_offset);
- float get_h_offset() const;
-
- void set_v_offset(float p_v_offset);
- float get_v_offset() const;
-
- void set_unit_offset(float p_unit_offset);
- float get_unit_offset() const;
-
- void set_loop(bool p_loop);
- bool has_loop() const;
-
- void set_cubic_interpolation(bool p_enable);
- bool get_cubic_interpolation() const;
-
- String get_configuration_warning() const;
-
- OrientedPathFollow();
-};
-
#endif // PATH_H
diff --git a/scene/3d/physics_body.cpp b/scene/3d/physics_body.cpp
index 9148b436a0..22da51ac30 100644
--- a/scene/3d/physics_body.cpp
+++ b/scene/3d/physics_body.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -1907,6 +1907,26 @@ bool PhysicalBone::SixDOFJointData::_set(const StringName &p_name, const Variant
if (j.is_valid())
PhysicsServer::get_singleton()->generic_6dof_joint_set_param(j, axis, PhysicsServer::G6DOF_JOINT_LINEAR_LIMIT_SOFTNESS, axis_data[axis].linear_limit_softness);
+ } else if ("linear_spring_enabled" == var_name) {
+ axis_data[axis].linear_spring_enabled = p_value;
+ if (j.is_valid())
+ PhysicsServer::get_singleton()->generic_6dof_joint_set_flag(j, axis, PhysicsServer::G6DOF_JOINT_FLAG_ENABLE_LINEAR_SPRING, axis_data[axis].linear_spring_enabled);
+
+ } else if ("linear_spring_stiffness" == var_name) {
+ axis_data[axis].linear_spring_stiffness = p_value;
+ if (j.is_valid())
+ PhysicsServer::get_singleton()->generic_6dof_joint_set_param(j, axis, PhysicsServer::G6DOF_JOINT_LINEAR_SPRING_STIFFNESS, axis_data[axis].linear_spring_stiffness);
+
+ } else if ("linear_spring_damping" == var_name) {
+ axis_data[axis].linear_spring_damping = p_value;
+ if (j.is_valid())
+ PhysicsServer::get_singleton()->generic_6dof_joint_set_param(j, axis, PhysicsServer::G6DOF_JOINT_LINEAR_SPRING_DAMPING, axis_data[axis].linear_spring_damping);
+
+ } else if ("linear_equilibrium_point" == var_name) {
+ axis_data[axis].linear_equilibrium_point = p_value;
+ if (j.is_valid())
+ PhysicsServer::get_singleton()->generic_6dof_joint_set_param(j, axis, PhysicsServer::G6DOF_JOINT_LINEAR_SPRING_EQUILIBRIUM_POINT, axis_data[axis].linear_equilibrium_point);
+
} else if ("linear_restitution" == var_name) {
axis_data[axis].linear_restitution = p_value;
if (j.is_valid())
@@ -1952,6 +1972,26 @@ bool PhysicalBone::SixDOFJointData::_set(const StringName &p_name, const Variant
if (j.is_valid())
PhysicsServer::get_singleton()->generic_6dof_joint_set_param(j, axis, PhysicsServer::G6DOF_JOINT_ANGULAR_ERP, axis_data[axis].erp);
+ } else if ("angular_spring_enabled" == var_name) {
+ axis_data[axis].angular_spring_enabled = p_value;
+ if (j.is_valid())
+ PhysicsServer::get_singleton()->generic_6dof_joint_set_flag(j, axis, PhysicsServer::G6DOF_JOINT_FLAG_ENABLE_ANGULAR_SPRING, axis_data[axis].angular_spring_enabled);
+
+ } else if ("angular_spring_stiffness" == var_name) {
+ axis_data[axis].angular_spring_stiffness = p_value;
+ if (j.is_valid())
+ PhysicsServer::get_singleton()->generic_6dof_joint_set_param(j, axis, PhysicsServer::G6DOF_JOINT_ANGULAR_SPRING_STIFFNESS, axis_data[axis].angular_spring_stiffness);
+
+ } else if ("angular_spring_damping" == var_name) {
+ axis_data[axis].angular_spring_damping = p_value;
+ if (j.is_valid())
+ PhysicsServer::get_singleton()->generic_6dof_joint_set_param(j, axis, PhysicsServer::G6DOF_JOINT_ANGULAR_SPRING_DAMPING, axis_data[axis].angular_spring_damping);
+
+ } else if ("angular_equilibrium_point" == var_name) {
+ axis_data[axis].angular_equilibrium_point = p_value;
+ if (j.is_valid())
+ PhysicsServer::get_singleton()->generic_6dof_joint_set_param(j, axis, PhysicsServer::G6DOF_JOINT_ANGULAR_SPRING_EQUILIBRIUM_POINT, axis_data[axis].angular_equilibrium_point);
+
} else {
return false;
}
@@ -1990,6 +2030,14 @@ bool PhysicalBone::SixDOFJointData::_get(const StringName &p_name, Variant &r_re
r_ret = axis_data[axis].linear_limit_lower;
} else if ("linear_limit_softness" == var_name) {
r_ret = axis_data[axis].linear_limit_softness;
+ } else if ("linear_spring_enabled" == var_name) {
+ r_ret = axis_data[axis].linear_spring_enabled;
+ } else if ("linear_spring_stiffness" == var_name) {
+ r_ret = axis_data[axis].linear_spring_stiffness;
+ } else if ("linear_spring_damping" == var_name) {
+ r_ret = axis_data[axis].linear_spring_damping;
+ } else if ("linear_equilibrium_point" == var_name) {
+ r_ret = axis_data[axis].linear_equilibrium_point;
} else if ("linear_restitution" == var_name) {
r_ret = axis_data[axis].linear_restitution;
} else if ("linear_damping" == var_name) {
@@ -2008,6 +2056,14 @@ bool PhysicalBone::SixDOFJointData::_get(const StringName &p_name, Variant &r_re
r_ret = axis_data[axis].angular_damping;
} else if ("erp" == var_name) {
r_ret = axis_data[axis].erp;
+ } else if ("angular_spring_enabled" == var_name) {
+ r_ret = axis_data[axis].angular_spring_enabled;
+ } else if ("angular_spring_stiffness" == var_name) {
+ r_ret = axis_data[axis].angular_spring_stiffness;
+ } else if ("angular_spring_damping" == var_name) {
+ r_ret = axis_data[axis].angular_spring_damping;
+ } else if ("angular_equilibrium_point" == var_name) {
+ r_ret = axis_data[axis].angular_equilibrium_point;
} else {
return false;
}
@@ -2022,6 +2078,10 @@ void PhysicalBone::SixDOFJointData::_get_property_list(List<PropertyInfo> *p_lis
p_list->push_back(PropertyInfo(Variant::REAL, "joint_constraints/" + axis_names[i] + "/linear_limit_upper"));
p_list->push_back(PropertyInfo(Variant::REAL, "joint_constraints/" + axis_names[i] + "/linear_limit_lower"));
p_list->push_back(PropertyInfo(Variant::REAL, "joint_constraints/" + axis_names[i] + "/linear_limit_softness", PROPERTY_HINT_RANGE, "0.01,16,0.01"));
+ p_list->push_back(PropertyInfo(Variant::BOOL, "joint_constraints/" + axis_names[i] + "/linear_spring_enabled"));
+ p_list->push_back(PropertyInfo(Variant::REAL, "joint_constraints/" + axis_names[i] + "/linear_spring_stiffness"));
+ p_list->push_back(PropertyInfo(Variant::REAL, "joint_constraints/" + axis_names[i] + "/linear_spring_damping"));
+ p_list->push_back(PropertyInfo(Variant::REAL, "joint_constraints/" + axis_names[i] + "/linear_equilibrium_point"));
p_list->push_back(PropertyInfo(Variant::REAL, "joint_constraints/" + axis_names[i] + "/linear_restitution", PROPERTY_HINT_RANGE, "0.01,16,0.01"));
p_list->push_back(PropertyInfo(Variant::REAL, "joint_constraints/" + axis_names[i] + "/linear_damping", PROPERTY_HINT_RANGE, "0.01,16,0.01"));
p_list->push_back(PropertyInfo(Variant::BOOL, "joint_constraints/" + axis_names[i] + "/angular_limit_enabled"));
@@ -2031,6 +2091,10 @@ void PhysicalBone::SixDOFJointData::_get_property_list(List<PropertyInfo> *p_lis
p_list->push_back(PropertyInfo(Variant::REAL, "joint_constraints/" + axis_names[i] + "/angular_restitution", PROPERTY_HINT_RANGE, "0.01,16,0.01"));
p_list->push_back(PropertyInfo(Variant::REAL, "joint_constraints/" + axis_names[i] + "/angular_damping", PROPERTY_HINT_RANGE, "0.01,16,0.01"));
p_list->push_back(PropertyInfo(Variant::REAL, "joint_constraints/" + axis_names[i] + "/erp"));
+ p_list->push_back(PropertyInfo(Variant::BOOL, "joint_constraints/" + axis_names[i] + "/angular_spring_enabled"));
+ p_list->push_back(PropertyInfo(Variant::REAL, "joint_constraints/" + axis_names[i] + "/angular_spring_stiffness"));
+ p_list->push_back(PropertyInfo(Variant::REAL, "joint_constraints/" + axis_names[i] + "/angular_spring_damping"));
+ p_list->push_back(PropertyInfo(Variant::REAL, "joint_constraints/" + axis_names[i] + "/angular_equilibrium_point"));
}
}
@@ -2294,6 +2358,10 @@ void PhysicalBone::_reload_joint() {
PhysicsServer::get_singleton()->generic_6dof_joint_set_param(joint, static_cast<Vector3::Axis>(axis), PhysicsServer::G6DOF_JOINT_LINEAR_UPPER_LIMIT, g6dofjd->axis_data[axis].linear_limit_upper);
PhysicsServer::get_singleton()->generic_6dof_joint_set_param(joint, static_cast<Vector3::Axis>(axis), PhysicsServer::G6DOF_JOINT_LINEAR_LOWER_LIMIT, g6dofjd->axis_data[axis].linear_limit_lower);
PhysicsServer::get_singleton()->generic_6dof_joint_set_param(joint, static_cast<Vector3::Axis>(axis), PhysicsServer::G6DOF_JOINT_LINEAR_LIMIT_SOFTNESS, g6dofjd->axis_data[axis].linear_limit_softness);
+ PhysicsServer::get_singleton()->generic_6dof_joint_set_flag(joint, static_cast<Vector3::Axis>(axis), PhysicsServer::G6DOF_JOINT_FLAG_ENABLE_LINEAR_SPRING, g6dofjd->axis_data[axis].linear_spring_enabled);
+ PhysicsServer::get_singleton()->generic_6dof_joint_set_param(joint, static_cast<Vector3::Axis>(axis), PhysicsServer::G6DOF_JOINT_LINEAR_SPRING_STIFFNESS, g6dofjd->axis_data[axis].linear_spring_stiffness);
+ PhysicsServer::get_singleton()->generic_6dof_joint_set_param(joint, static_cast<Vector3::Axis>(axis), PhysicsServer::G6DOF_JOINT_LINEAR_SPRING_DAMPING, g6dofjd->axis_data[axis].linear_spring_damping);
+ PhysicsServer::get_singleton()->generic_6dof_joint_set_param(joint, static_cast<Vector3::Axis>(axis), PhysicsServer::G6DOF_JOINT_LINEAR_SPRING_EQUILIBRIUM_POINT, g6dofjd->axis_data[axis].linear_equilibrium_point);
PhysicsServer::get_singleton()->generic_6dof_joint_set_param(joint, static_cast<Vector3::Axis>(axis), PhysicsServer::G6DOF_JOINT_LINEAR_RESTITUTION, g6dofjd->axis_data[axis].linear_restitution);
PhysicsServer::get_singleton()->generic_6dof_joint_set_param(joint, static_cast<Vector3::Axis>(axis), PhysicsServer::G6DOF_JOINT_LINEAR_DAMPING, g6dofjd->axis_data[axis].linear_damping);
PhysicsServer::get_singleton()->generic_6dof_joint_set_flag(joint, static_cast<Vector3::Axis>(axis), PhysicsServer::G6DOF_JOINT_FLAG_ENABLE_ANGULAR_LIMIT, g6dofjd->axis_data[axis].angular_limit_enabled);
@@ -2303,6 +2371,10 @@ void PhysicalBone::_reload_joint() {
PhysicsServer::get_singleton()->generic_6dof_joint_set_param(joint, static_cast<Vector3::Axis>(axis), PhysicsServer::G6DOF_JOINT_ANGULAR_RESTITUTION, g6dofjd->axis_data[axis].angular_restitution);
PhysicsServer::get_singleton()->generic_6dof_joint_set_param(joint, static_cast<Vector3::Axis>(axis), PhysicsServer::G6DOF_JOINT_ANGULAR_DAMPING, g6dofjd->axis_data[axis].angular_damping);
PhysicsServer::get_singleton()->generic_6dof_joint_set_param(joint, static_cast<Vector3::Axis>(axis), PhysicsServer::G6DOF_JOINT_ANGULAR_ERP, g6dofjd->axis_data[axis].erp);
+ PhysicsServer::get_singleton()->generic_6dof_joint_set_flag(joint, static_cast<Vector3::Axis>(axis), PhysicsServer::G6DOF_JOINT_FLAG_ENABLE_ANGULAR_SPRING, g6dofjd->axis_data[axis].angular_spring_enabled);
+ PhysicsServer::get_singleton()->generic_6dof_joint_set_param(joint, static_cast<Vector3::Axis>(axis), PhysicsServer::G6DOF_JOINT_ANGULAR_SPRING_STIFFNESS, g6dofjd->axis_data[axis].angular_spring_stiffness);
+ PhysicsServer::get_singleton()->generic_6dof_joint_set_param(joint, static_cast<Vector3::Axis>(axis), PhysicsServer::G6DOF_JOINT_ANGULAR_SPRING_DAMPING, g6dofjd->axis_data[axis].angular_spring_damping);
+ PhysicsServer::get_singleton()->generic_6dof_joint_set_param(joint, static_cast<Vector3::Axis>(axis), PhysicsServer::G6DOF_JOINT_ANGULAR_SPRING_EQUILIBRIUM_POINT, g6dofjd->axis_data[axis].angular_equilibrium_point);
}
} break;
diff --git a/scene/3d/physics_body.h b/scene/3d/physics_body.h
index 20d948b6eb..5570d0c86b 100644
--- a/scene/3d/physics_body.h
+++ b/scene/3d/physics_body.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -494,6 +494,10 @@ public:
real_t linear_limit_softness;
real_t linear_restitution;
real_t linear_damping;
+ bool linear_spring_enabled;
+ real_t linear_spring_stiffness;
+ real_t linear_spring_damping;
+ real_t linear_equilibrium_point;
bool angular_limit_enabled;
real_t angular_limit_upper;
real_t angular_limit_lower;
@@ -501,6 +505,10 @@ public:
real_t angular_restitution;
real_t angular_damping;
real_t erp;
+ bool angular_spring_enabled;
+ real_t angular_spring_stiffness;
+ real_t angular_spring_damping;
+ real_t angular_equilibrium_point;
SixDOFAxisData() :
linear_limit_enabled(true),
@@ -509,13 +517,21 @@ public:
linear_limit_softness(0.7),
linear_restitution(0.5),
linear_damping(1.),
+ linear_spring_enabled(false),
+ linear_spring_stiffness(0),
+ linear_spring_damping(0),
+ linear_equilibrium_point(0),
angular_limit_enabled(true),
angular_limit_upper(0),
angular_limit_lower(0),
angular_limit_softness(0.5),
angular_restitution(0),
angular_damping(1.),
- erp(0.5) {}
+ erp(0.5),
+ angular_spring_enabled(false),
+ angular_spring_stiffness(0),
+ angular_spring_damping(0.),
+ angular_equilibrium_point(0) {}
};
virtual JointType get_joint_type() { return JOINT_TYPE_6DOF; }
diff --git a/scene/3d/physics_joint.cpp b/scene/3d/physics_joint.cpp
index 1adf1c5d79..c261ed3aeb 100644
--- a/scene/3d/physics_joint.cpp
+++ b/scene/3d/physics_joint.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -707,6 +707,9 @@ void Generic6DOFJoint::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_flag_z", "flag", "value"), &Generic6DOFJoint::set_flag_z);
ClassDB::bind_method(D_METHOD("get_flag_z", "flag"), &Generic6DOFJoint::get_flag_z);
+ ClassDB::bind_method(D_METHOD("set_precision", "precision"), &Generic6DOFJoint::set_precision);
+ ClassDB::bind_method(D_METHOD("get_precision"), &Generic6DOFJoint::get_precision);
+
ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "linear_limit_x/enabled"), "set_flag_x", "get_flag_x", FLAG_ENABLE_LINEAR_LIMIT);
ADD_PROPERTYI(PropertyInfo(Variant::REAL, "linear_limit_x/upper_distance"), "set_param_x", "get_param_x", PARAM_LINEAR_UPPER_LIMIT);
ADD_PROPERTYI(PropertyInfo(Variant::REAL, "linear_limit_x/lower_distance"), "set_param_x", "get_param_x", PARAM_LINEAR_LOWER_LIMIT);
@@ -776,7 +779,6 @@ void Generic6DOFJoint::_bind_methods() {
ADD_PROPERTYI(PropertyInfo(Variant::REAL, "linear_motor_z/target_velocity"), "set_param_z", "get_param_z", PARAM_LINEAR_MOTOR_TARGET_VELOCITY);
ADD_PROPERTYI(PropertyInfo(Variant::REAL, "linear_motor_z/force_limit"), "set_param_z", "get_param_z", PARAM_LINEAR_MOTOR_FORCE_LIMIT);
ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "linear_spring_z/enabled"), "set_flag_z", "get_flag_z", FLAG_ENABLE_LINEAR_SPRING);
- ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "linear_spring_z/enabled"), "set_flag_z", "get_flag_z", FLAG_ENABLE_LINEAR_SPRING);
ADD_PROPERTYI(PropertyInfo(Variant::REAL, "linear_spring_z/stiffness"), "set_param_z", "get_param_z", PARAM_LINEAR_SPRING_STIFFNESS);
ADD_PROPERTYI(PropertyInfo(Variant::REAL, "linear_spring_z/damping"), "set_param_z", "get_param_z", PARAM_LINEAR_SPRING_DAMPING);
ADD_PROPERTYI(PropertyInfo(Variant::REAL, "linear_spring_z/equilibrium_point"), "set_param_z", "get_param_z", PARAM_LINEAR_SPRING_EQUILIBRIUM_POINT);
@@ -796,6 +798,8 @@ void Generic6DOFJoint::_bind_methods() {
ADD_PROPERTYI(PropertyInfo(Variant::REAL, "angular_spring_z/damping"), "set_param_z", "get_param_z", PARAM_ANGULAR_SPRING_DAMPING);
ADD_PROPERTYI(PropertyInfo(Variant::REAL, "angular_spring_z/equilibrium_point"), "set_param_z", "get_param_z", PARAM_ANGULAR_SPRING_EQUILIBRIUM_POINT);
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "precision", PROPERTY_HINT_RANGE, "1,99999,1"), "set_precision", "get_precision");
+
BIND_ENUM_CONSTANT(PARAM_LINEAR_LOWER_LIMIT);
BIND_ENUM_CONSTANT(PARAM_LINEAR_UPPER_LIMIT);
BIND_ENUM_CONSTANT(PARAM_LINEAR_LIMIT_SOFTNESS);
@@ -908,6 +912,14 @@ bool Generic6DOFJoint::get_flag_z(Flag p_flag) const {
return flags_z[p_flag];
}
+void Generic6DOFJoint::set_precision(int p_precision) {
+ precision = p_precision;
+
+ PhysicsServer::get_singleton()->generic_6dof_joint_set_precision(
+ get_joint(),
+ precision);
+}
+
RID Generic6DOFJoint::_configure_joint(PhysicsBody *body_a, PhysicsBody *body_b) {
Transform gt = get_global_transform();
@@ -942,7 +954,8 @@ RID Generic6DOFJoint::_configure_joint(PhysicsBody *body_a, PhysicsBody *body_b)
return j;
}
-Generic6DOFJoint::Generic6DOFJoint() {
+Generic6DOFJoint::Generic6DOFJoint() :
+ precision(1) {
set_param_x(PARAM_LINEAR_LOWER_LIMIT, 0);
set_param_x(PARAM_LINEAR_UPPER_LIMIT, 0);
diff --git a/scene/3d/physics_joint.h b/scene/3d/physics_joint.h
index ee4ca28658..f6df920314 100644
--- a/scene/3d/physics_joint.h
+++ b/scene/3d/physics_joint.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -305,6 +305,8 @@ protected:
float params_z[PARAM_MAX];
bool flags_z[FLAG_MAX];
+ int precision;
+
virtual RID _configure_joint(PhysicsBody *body_a, PhysicsBody *body_b);
static void _bind_methods();
@@ -327,6 +329,11 @@ public:
void set_flag_z(Flag p_flag, bool p_enabled);
bool get_flag_z(Flag p_flag) const;
+ void set_precision(int p_precision);
+ int get_precision() const {
+ return precision;
+ }
+
Generic6DOFJoint();
};
diff --git a/scene/3d/portal.cpp b/scene/3d/portal.cpp
index 137338d79e..f5163dfcdd 100644
--- a/scene/3d/portal.cpp
+++ b/scene/3d/portal.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/portal.h b/scene/3d/portal.h
index cb3f208072..f053867917 100644
--- a/scene/3d/portal.h
+++ b/scene/3d/portal.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/position_3d.cpp b/scene/3d/position_3d.cpp
index 3ae04f491f..18de105eee 100644
--- a/scene/3d/position_3d.cpp
+++ b/scene/3d/position_3d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/position_3d.h b/scene/3d/position_3d.h
index 2bc69eff9b..21361592d1 100644
--- a/scene/3d/position_3d.h
+++ b/scene/3d/position_3d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/proximity_group.cpp b/scene/3d/proximity_group.cpp
index f56f728d99..12eab2e4e8 100644
--- a/scene/3d/proximity_group.cpp
+++ b/scene/3d/proximity_group.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/proximity_group.h b/scene/3d/proximity_group.h
index 448f30bf80..bd11e31031 100644
--- a/scene/3d/proximity_group.h
+++ b/scene/3d/proximity_group.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/ray_cast.cpp b/scene/3d/ray_cast.cpp
index 17f069bbc8..10f92058e0 100644
--- a/scene/3d/ray_cast.cpp
+++ b/scene/3d/ray_cast.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/ray_cast.h b/scene/3d/ray_cast.h
index e95382e1fe..43d55adb98 100644
--- a/scene/3d/ray_cast.h
+++ b/scene/3d/ray_cast.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/reflection_probe.cpp b/scene/3d/reflection_probe.cpp
index fe522bbe97..c34771d9f1 100644
--- a/scene/3d/reflection_probe.cpp
+++ b/scene/3d/reflection_probe.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/reflection_probe.h b/scene/3d/reflection_probe.h
index 13ae1c81f6..2921a3a881 100644
--- a/scene/3d/reflection_probe.h
+++ b/scene/3d/reflection_probe.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/remote_transform.cpp b/scene/3d/remote_transform.cpp
index c12e49fb47..add77e0272 100644
--- a/scene/3d/remote_transform.cpp
+++ b/scene/3d/remote_transform.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -63,38 +63,40 @@ void RemoteTransform::_update_remote() {
if (update_remote_position && update_remote_rotation && update_remote_scale) {
n->set_global_transform(get_global_transform());
} else {
- Transform n_trans = n->get_global_transform();
Transform our_trans = get_global_transform();
- if (!update_remote_position)
- our_trans.set_origin(n_trans.get_origin());
+ if (update_remote_rotation)
+ n->set_rotation(our_trans.basis.get_rotation());
- n->set_global_transform(our_trans);
+ if (update_remote_scale)
+ n->set_scale(our_trans.basis.get_scale());
- if (!update_remote_rotation)
- n->set_rotation(n_trans.basis.get_rotation());
+ if (update_remote_position) {
+ Transform n_trans = n->get_global_transform();
- if (!update_remote_scale)
- n->set_scale(n_trans.basis.get_scale());
+ n_trans.set_origin(our_trans.get_origin());
+ n->set_global_transform(n_trans);
+ }
}
} else {
if (update_remote_position && update_remote_rotation && update_remote_scale) {
- n->set_global_transform(get_global_transform());
+ n->set_transform(get_transform());
} else {
- Transform n_trans = n->get_transform();
Transform our_trans = get_transform();
- if (!update_remote_position)
- our_trans.set_origin(n_trans.get_origin());
+ if (update_remote_rotation)
+ n->set_rotation(our_trans.basis.get_rotation());
- n->set_transform(our_trans);
+ if (update_remote_scale)
+ n->set_scale(our_trans.basis.get_scale());
- if (!update_remote_rotation)
- n->set_rotation(n_trans.basis.get_rotation());
+ if (update_remote_position) {
+ Transform n_trans = n->get_transform();
- if (!update_remote_scale)
- n->set_scale(n_trans.basis.get_scale());
+ n_trans.set_origin(our_trans.get_origin());
+ n->set_transform(n_trans);
+ }
}
}
}
diff --git a/scene/3d/remote_transform.h b/scene/3d/remote_transform.h
index 6b788a2d75..b737a4f858 100644
--- a/scene/3d/remote_transform.h
+++ b/scene/3d/remote_transform.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/room_instance.cpp b/scene/3d/room_instance.cpp
index 3914d7190e..073fe4f1da 100644
--- a/scene/3d/room_instance.cpp
+++ b/scene/3d/room_instance.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/room_instance.h b/scene/3d/room_instance.h
index ff388e606c..9ee140d522 100644
--- a/scene/3d/room_instance.h
+++ b/scene/3d/room_instance.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/scenario_fx.cpp b/scene/3d/scenario_fx.cpp
index 26cbfc0b11..ad9b61e1ff 100644
--- a/scene/3d/scenario_fx.cpp
+++ b/scene/3d/scenario_fx.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/scenario_fx.h b/scene/3d/scenario_fx.h
index 7a8e2b548f..6317dae75d 100644
--- a/scene/3d/scenario_fx.h
+++ b/scene/3d/scenario_fx.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/skeleton.cpp b/scene/3d/skeleton.cpp
index db82ef2a5c..0db2250a3a 100644
--- a/scene/3d/skeleton.cpp
+++ b/scene/3d/skeleton.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/skeleton.h b/scene/3d/skeleton.h
index 07abdc1fe7..0f463c9ea7 100644
--- a/scene/3d/skeleton.h
+++ b/scene/3d/skeleton.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/soft_body.cpp b/scene/3d/soft_body.cpp
index 1e730d0b3d..ac20609c21 100644
--- a/scene/3d/soft_body.cpp
+++ b/scene/3d/soft_body.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -401,7 +401,7 @@ String SoftBody::get_configuration_warning() const {
}
Transform t = get_transform();
- if ((ABS(t.basis.get_axis(0).length() - 1.0) > 0.05 || ABS(t.basis.get_axis(1).length() - 1.0) > 0.05 || ABS(t.basis.get_axis(0).length() - 1.0) > 0.05)) {
+ if ((ABS(t.basis.get_axis(0).length() - 1.0) > 0.05 || ABS(t.basis.get_axis(1).length() - 1.0) > 0.05 || ABS(t.basis.get_axis(2).length() - 1.0) > 0.05)) {
if (!warning.empty())
warning += "\n\n";
diff --git a/scene/3d/soft_body.h b/scene/3d/soft_body.h
index b1e699e839..2516d39552 100644
--- a/scene/3d/soft_body.h
+++ b/scene/3d/soft_body.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/spatial.cpp b/scene/3d/spatial.cpp
index dc09392713..d6544c39da 100644
--- a/scene/3d/spatial.cpp
+++ b/scene/3d/spatial.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -32,6 +32,7 @@
#include "core/engine.h"
#include "core/message_queue.h"
+#include "scene/main/scene_tree.h"
#include "scene/main/viewport.h"
#include "scene/scene_string_names.h"
@@ -401,6 +402,8 @@ void Spatial::update_gizmo() {
if (!is_inside_world())
return;
if (!data.gizmo.is_valid())
+ get_tree()->call_group_flags(SceneTree::GROUP_CALL_REALTIME, SceneStringNames::get_singleton()->_spatial_editor_group, SceneStringNames::get_singleton()->_request_gizmo, this);
+ if (!data.gizmo.is_valid())
return;
if (data.gizmo_dirty)
return;
diff --git a/scene/3d/spatial.h b/scene/3d/spatial.h
index 815ca16bc5..18a4a5b54d 100644
--- a/scene/3d/spatial.h
+++ b/scene/3d/spatial.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/spatial_velocity_tracker.cpp b/scene/3d/spatial_velocity_tracker.cpp
index 3850a0c7e6..97517be53b 100644
--- a/scene/3d/spatial_velocity_tracker.cpp
+++ b/scene/3d/spatial_velocity_tracker.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/spatial_velocity_tracker.h b/scene/3d/spatial_velocity_tracker.h
index a8278a4fb5..795f56091f 100644
--- a/scene/3d/spatial_velocity_tracker.h
+++ b/scene/3d/spatial_velocity_tracker.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/spring_arm.cpp b/scene/3d/spring_arm.cpp
index f74784c2f9..f3665d251b 100644
--- a/scene/3d/spring_arm.cpp
+++ b/scene/3d/spring_arm.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/spring_arm.h b/scene/3d/spring_arm.h
index e0c3f2992d..35df56f06e 100644
--- a/scene/3d/spring_arm.h
+++ b/scene/3d/spring_arm.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/sprite_3d.cpp b/scene/3d/sprite_3d.cpp
index 8e00fbe735..a3fa2ac98d 100644
--- a/scene/3d/sprite_3d.cpp
+++ b/scene/3d/sprite_3d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -461,6 +461,13 @@ void Sprite3D::_draw() {
int axis = get_axis();
normal[axis] = 1.0;
+ Plane tangent;
+ if (axis == Vector3::AXIS_X) {
+ tangent = Plane(0, 0, -1, 1);
+ } else {
+ tangent = Plane(1, 0, 0, 1);
+ }
+
RID mat = SpatialMaterial::get_material_rid_for_2d(get_draw_flag(FLAG_SHADED), get_draw_flag(FLAG_TRANSPARENT), get_draw_flag(FLAG_DOUBLE_SIDED), get_alpha_cut_mode() == ALPHA_CUT_DISCARD, get_alpha_cut_mode() == ALPHA_CUT_OPAQUE_PREPASS);
VS::get_singleton()->immediate_set_material(immediate, mat);
@@ -487,6 +494,7 @@ void Sprite3D::_draw() {
for (int i = 0; i < 4; i++) {
VS::get_singleton()->immediate_normal(immediate, normal);
+ VS::get_singleton()->immediate_tangent(immediate, tangent);
VS::get_singleton()->immediate_color(immediate, color);
VS::get_singleton()->immediate_uv(immediate, uvs[i]);
@@ -761,6 +769,13 @@ void AnimatedSprite3D::_draw() {
int axis = get_axis();
normal[axis] = 1.0;
+ Plane tangent;
+ if (axis == Vector3::AXIS_X) {
+ tangent = Plane(0, 0, -1, -1);
+ } else {
+ tangent = Plane(1, 0, 0, -1);
+ }
+
RID mat = SpatialMaterial::get_material_rid_for_2d(get_draw_flag(FLAG_SHADED), get_draw_flag(FLAG_TRANSPARENT), get_draw_flag(FLAG_DOUBLE_SIDED), get_alpha_cut_mode() == ALPHA_CUT_DISCARD, get_alpha_cut_mode() == ALPHA_CUT_OPAQUE_PREPASS);
VS::get_singleton()->immediate_set_material(immediate, mat);
@@ -788,6 +803,7 @@ void AnimatedSprite3D::_draw() {
for (int i = 0; i < 4; i++) {
VS::get_singleton()->immediate_normal(immediate, normal);
+ VS::get_singleton()->immediate_tangent(immediate, tangent);
VS::get_singleton()->immediate_color(immediate, color);
VS::get_singleton()->immediate_uv(immediate, uvs[i]);
diff --git a/scene/3d/sprite_3d.h b/scene/3d/sprite_3d.h
index a4705a8970..0e086ef31e 100644
--- a/scene/3d/sprite_3d.h
+++ b/scene/3d/sprite_3d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/vehicle_body.cpp b/scene/3d/vehicle_body.cpp
index 56a86b6a17..c7f7b14a8f 100644
--- a/scene/3d/vehicle_body.cpp
+++ b/scene/3d/vehicle_body.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/vehicle_body.h b/scene/3d/vehicle_body.h
index 68fbf8d873..7e7571df4d 100644
--- a/scene/3d/vehicle_body.h
+++ b/scene/3d/vehicle_body.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/visibility_notifier.cpp b/scene/3d/visibility_notifier.cpp
index c69387d082..3014432d59 100644
--- a/scene/3d/visibility_notifier.cpp
+++ b/scene/3d/visibility_notifier.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -153,7 +153,7 @@ void VisibilityEnabler::_find_nodes(Node *p_node) {
if (enabler[ENABLER_FREEZE_BODIES]) {
RigidBody *rb = Object::cast_to<RigidBody>(p_node);
- if (rb && ((rb->get_mode() == RigidBody::MODE_CHARACTER || (rb->get_mode() == RigidBody::MODE_RIGID && !rb->is_able_to_sleep())))) {
+ if (rb && ((rb->get_mode() == RigidBody::MODE_CHARACTER || rb->get_mode() == RigidBody::MODE_RIGID))) {
add = true;
meta = rb->get_mode();
diff --git a/scene/3d/visibility_notifier.h b/scene/3d/visibility_notifier.h
index 2cf685a92c..ff4424300c 100644
--- a/scene/3d/visibility_notifier.h
+++ b/scene/3d/visibility_notifier.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/visual_instance.cpp b/scene/3d/visual_instance.cpp
index 6dc821c3f5..1bbf1b7bc7 100644
--- a/scene/3d/visual_instance.cpp
+++ b/scene/3d/visual_instance.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/visual_instance.h b/scene/3d/visual_instance.h
index 784f2a358a..3b6fccf65f 100644
--- a/scene/3d/visual_instance.h
+++ b/scene/3d/visual_instance.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/3d/voxel_light_baker.cpp b/scene/3d/voxel_light_baker.cpp
index 0eccbbc8f9..30e38c8ee2 100644
--- a/scene/3d/voxel_light_baker.cpp
+++ b/scene/3d/voxel_light_baker.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -342,8 +342,8 @@ void VoxelLightBaker::_plot_face(int p_idx, int p_level, int p_x, int p_y, int p
if (lnormal == Vector3()) //just in case normal as nor provided
lnormal = normal;
- int uv_x = CLAMP(Math::fposmod(uv.x, 1.0f) * bake_texture_size, 0, bake_texture_size - 1);
- int uv_y = CLAMP(Math::fposmod(uv.y, 1.0f) * bake_texture_size, 0, bake_texture_size - 1);
+ int uv_x = CLAMP(int(Math::fposmod(uv.x, 1.0f) * bake_texture_size), 0, bake_texture_size - 1);
+ int uv_y = CLAMP(int(Math::fposmod(uv.y, 1.0f) * bake_texture_size), 0, bake_texture_size - 1);
int ofs = uv_y * bake_texture_size + uv_x;
albedo_accum.r += p_material.albedo[ofs].r;
@@ -1931,7 +1931,6 @@ Error VoxelLightBaker::make_lightmap(const Transform &p_xform, Ref<Mesh> &p_mesh
//add directional light (do this after blur)
{
- LightMap *lightmap_ptr = lightmap.ptrw();
const Cell *cells = bake_cells.ptr();
const Light *light = bake_light.ptr();
#ifdef _OPENMP
diff --git a/scene/3d/voxel_light_baker.h b/scene/3d/voxel_light_baker.h
index 3d55c053f3..295e099d47 100644
--- a/scene/3d/voxel_light_baker.h
+++ b/scene/3d/voxel_light_baker.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/animation/animation_blend_space_1d.cpp b/scene/animation/animation_blend_space_1d.cpp
index 76de39c3e6..dded44b990 100644
--- a/scene/animation/animation_blend_space_1d.cpp
+++ b/scene/animation/animation_blend_space_1d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -110,7 +110,7 @@ void AnimationNodeBlendSpace1D::add_blend_point(const Ref<AnimationRootNode> &p_
if (p_at_index == -1 || p_at_index == blend_points_used) {
p_at_index = blend_points_used;
} else {
- for (int i = blend_points_used - 1; i > p_at_index; i++) {
+ for (int i = blend_points_used - 1; i > p_at_index; i--) {
blend_points[i] = blend_points[i - 1];
}
}
diff --git a/scene/animation/animation_blend_space_1d.h b/scene/animation/animation_blend_space_1d.h
index a83a813744..dfac88b712 100644
--- a/scene/animation/animation_blend_space_1d.h
+++ b/scene/animation/animation_blend_space_1d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/animation/animation_blend_space_2d.cpp b/scene/animation/animation_blend_space_2d.cpp
index 9321133d5f..d744d6cc8e 100644
--- a/scene/animation/animation_blend_space_2d.cpp
+++ b/scene/animation/animation_blend_space_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -33,9 +33,17 @@
void AnimationNodeBlendSpace2D::get_parameter_list(List<PropertyInfo> *r_list) const {
r_list->push_back(PropertyInfo(Variant::VECTOR2, blend_position));
+ r_list->push_back(PropertyInfo(Variant::INT, closest, PROPERTY_HINT_NONE, "", 0));
+ r_list->push_back(PropertyInfo(Variant::REAL, length_internal, PROPERTY_HINT_NONE, "", 0));
}
Variant AnimationNodeBlendSpace2D::get_parameter_default_value(const StringName &p_parameter) const {
- return Vector2();
+ if (p_parameter == closest) {
+ return -1;
+ } else if (p_parameter == length_internal) {
+ return 0;
+ } else {
+ return Vector2();
+ }
}
void AnimationNodeBlendSpace2D::get_child_nodes(List<ChildNode> *r_child_nodes) {
@@ -72,18 +80,15 @@ void AnimationNodeBlendSpace2D::add_blend_point(const Ref<AnimationRootNode> &p_
blend_points[p_at_index].node->connect("tree_changed", this, "_tree_changed", varray(), CONNECT_REFERENCE_COUNTED);
blend_points_used++;
- if (auto_triangles) {
- trianges_dirty = true;
- }
+ _queue_auto_triangles();
+
emit_signal("tree_changed");
}
void AnimationNodeBlendSpace2D::set_blend_point_position(int p_point, const Vector2 &p_position) {
ERR_FAIL_INDEX(p_point, blend_points_used);
blend_points[p_point].position = p_position;
- if (auto_triangles) {
- trianges_dirty = true;
- }
+ _queue_auto_triangles();
}
void AnimationNodeBlendSpace2D::set_blend_point_node(int p_point, const Ref<AnimationRootNode> &p_node) {
ERR_FAIL_INDEX(p_point, blend_points_used);
@@ -301,15 +306,27 @@ Vector<int> AnimationNodeBlendSpace2D::_get_triangles() const {
return t;
}
+void AnimationNodeBlendSpace2D::_queue_auto_triangles() {
+ if (!auto_triangles || trianges_dirty) {
+ return;
+ }
+
+ trianges_dirty = true;
+ call_deferred("_update_triangles");
+}
+
void AnimationNodeBlendSpace2D::_update_triangles() {
if (!auto_triangles || !trianges_dirty)
return;
+ print_line("updating triangles");
trianges_dirty = false;
triangles.clear();
- if (blend_points_used < 3)
+ if (blend_points_used < 3) {
+ emit_signal("triangles_updated");
return;
+ }
Vector<Vector2> points;
points.resize(blend_points_used);
@@ -319,9 +336,12 @@ void AnimationNodeBlendSpace2D::_update_triangles() {
Vector<Delaunay2D::Triangle> triangles = Delaunay2D::triangulate(points);
+ print_line("triangles generated: " + itos(triangles.size()));
+
for (int i = 0; i < triangles.size(); i++) {
add_triangle(triangles[i].points[0], triangles[i].points[1], triangles[i].points[2]);
}
+ emit_signal("triangles_updated");
}
Vector2 AnimationNodeBlendSpace2D::get_closest_point(const Vector2 &p_point) {
@@ -412,84 +432,124 @@ float AnimationNodeBlendSpace2D::process(float p_time, bool p_seek) {
_update_triangles();
Vector2 blend_pos = get_parameter(blend_position);
+ int closest = get_parameter(this->closest);
+ float length_internal = get_parameter(this->length_internal);
+ float mind = 0; //time of min distance point
- if (triangles.size() == 0)
- return 0;
+ if (blend_mode == BLEND_MODE_INTERPOLATED) {
- Vector2 best_point;
- bool first = true;
- int blend_triangle = -1;
- float blend_weights[3] = { 0, 0, 0 };
+ if (triangles.size() == 0)
+ return 0;
- for (int i = 0; i < triangles.size(); i++) {
- Vector2 points[3];
- for (int j = 0; j < 3; j++) {
- points[j] = get_blend_point_position(get_triangle_point(i, j));
- }
+ Vector2 best_point;
+ bool first = true;
+ int blend_triangle = -1;
+ float blend_weights[3] = { 0, 0, 0 };
- if (Geometry::is_point_in_triangle(blend_pos, points[0], points[1], points[2])) {
+ for (int i = 0; i < triangles.size(); i++) {
+ Vector2 points[3];
+ for (int j = 0; j < 3; j++) {
+ points[j] = get_blend_point_position(get_triangle_point(i, j));
+ }
- blend_triangle = i;
- _blend_triangle(blend_pos, points, blend_weights);
- break;
- }
+ if (Geometry::is_point_in_triangle(blend_pos, points[0], points[1], points[2])) {
- for (int j = 0; j < 3; j++) {
- Vector2 s[2] = {
- points[j],
- points[(j + 1) % 3]
- };
- Vector2 closest = Geometry::get_closest_point_to_segment_2d(blend_pos, s);
- if (first || closest.distance_to(blend_pos) < best_point.distance_to(blend_pos)) {
- best_point = closest;
blend_triangle = i;
- first = false;
- float d = s[0].distance_to(s[1]);
- if (d == 0.0) {
- blend_weights[j] = 1.0;
- blend_weights[(j + 1) % 3] = 0.0;
- blend_weights[(j + 2) % 3] = 0.0;
- } else {
- float c = s[0].distance_to(closest) / d;
-
- blend_weights[j] = 1.0 - c;
- blend_weights[(j + 1) % 3] = c;
- blend_weights[(j + 2) % 3] = 0.0;
+ _blend_triangle(blend_pos, points, blend_weights);
+ break;
+ }
+
+ for (int j = 0; j < 3; j++) {
+ Vector2 s[2] = {
+ points[j],
+ points[(j + 1) % 3]
+ };
+ Vector2 closest = Geometry::get_closest_point_to_segment_2d(blend_pos, s);
+ if (first || closest.distance_to(blend_pos) < best_point.distance_to(blend_pos)) {
+ best_point = closest;
+ blend_triangle = i;
+ first = false;
+ float d = s[0].distance_to(s[1]);
+ if (d == 0.0) {
+ blend_weights[j] = 1.0;
+ blend_weights[(j + 1) % 3] = 0.0;
+ blend_weights[(j + 2) % 3] = 0.0;
+ } else {
+ float c = s[0].distance_to(closest) / d;
+
+ blend_weights[j] = 1.0 - c;
+ blend_weights[(j + 1) % 3] = c;
+ blend_weights[(j + 2) % 3] = 0.0;
+ }
}
}
}
- }
- ERR_FAIL_COND_V(blend_triangle == -1, 0); //should never reach here
+ ERR_FAIL_COND_V(blend_triangle == -1, 0); //should never reach here
- int triangle_points[3];
- for (int j = 0; j < 3; j++) {
- triangle_points[j] = get_triangle_point(blend_triangle, j);
- }
+ int triangle_points[3];
+ for (int j = 0; j < 3; j++) {
+ triangle_points[j] = get_triangle_point(blend_triangle, j);
+ }
- first = true;
- float mind = 0;
- for (int i = 0; i < blend_points_used; i++) {
+ first = true;
- bool found = false;
- for (int j = 0; j < 3; j++) {
- if (i == triangle_points[j]) {
- //blend with the given weight
- float t = blend_node(blend_points[i].name, blend_points[i].node, p_time, p_seek, blend_weights[j], FILTER_IGNORE, false);
- if (first || t < mind) {
- mind = t;
- first = false;
+ for (int i = 0; i < blend_points_used; i++) {
+
+ bool found = false;
+ for (int j = 0; j < 3; j++) {
+ if (i == triangle_points[j]) {
+ //blend with the given weight
+ float t = blend_node(blend_points[i].name, blend_points[i].node, p_time, p_seek, blend_weights[j], FILTER_IGNORE, false);
+ if (first || t < mind) {
+ mind = t;
+ first = false;
+ }
+ found = true;
+ break;
}
- found = true;
- break;
+ }
+
+ if (!found) {
+ //ignore
+ blend_node(blend_points[i].name, blend_points[i].node, p_time, p_seek, 0, FILTER_IGNORE, false);
+ }
+ }
+ } else {
+
+ int new_closest = -1;
+ float new_closest_dist = 1e20;
+
+ for (int i = 0; i < blend_points_used; i++) {
+
+ float d = blend_points[i].position.distance_squared_to(blend_pos);
+ if (d < new_closest_dist) {
+
+ new_closest = i;
+ new_closest_dist = d;
}
}
- if (!found) {
- //ignore
- blend_node(blend_points[i].name, blend_points[i].node, p_time, p_seek, 0, FILTER_IGNORE, false);
+ if (new_closest != closest) {
+
+ float from = 0;
+ if (blend_mode == BLEND_MODE_DISCRETE_CARRY && closest != -1) {
+ //see how much animation remains
+ from = blend_node(blend_points[closest].name, blend_points[closest].node, p_time, true, 0.0, FILTER_IGNORE, false) - length_internal;
+ }
+
+ mind = blend_node(blend_points[new_closest].name, blend_points[new_closest].node, from, true, 1.0, FILTER_IGNORE, false) + from;
+ length_internal = from + mind;
+
+ closest = new_closest;
+
+ } else {
+ mind = blend_node(blend_points[closest].name, blend_points[closest].node, p_time, p_seek, 1.0, FILTER_IGNORE, false);
}
}
+
+ set_parameter(this->closest, closest);
+ set_parameter(this->length_internal, length_internal);
return mind;
}
@@ -498,6 +558,10 @@ String AnimationNodeBlendSpace2D::get_caption() const {
}
void AnimationNodeBlendSpace2D::_validate_property(PropertyInfo &property) const {
+
+ if (auto_triangles && property.name == "triangles") {
+ property.usage = 0;
+ }
if (property.name.begins_with("blend_point_")) {
String left = property.name.get_slicec('/', 0);
int idx = left.get_slicec('_', 2).to_int();
@@ -509,10 +573,12 @@ void AnimationNodeBlendSpace2D::_validate_property(PropertyInfo &property) const
}
void AnimationNodeBlendSpace2D::set_auto_triangles(bool p_enable) {
- auto_triangles = p_enable;
- if (auto_triangles) {
- trianges_dirty = true;
+ if (auto_triangles == p_enable) {
+ return;
}
+
+ auto_triangles = p_enable;
+ _queue_auto_triangles();
}
bool AnimationNodeBlendSpace2D::get_auto_triangles() const {
@@ -527,6 +593,14 @@ void AnimationNodeBlendSpace2D::_tree_changed() {
emit_signal("tree_changed");
}
+void AnimationNodeBlendSpace2D::set_blend_mode(BlendMode p_blend_mode) {
+ blend_mode = p_blend_mode;
+}
+
+AnimationNodeBlendSpace2D::BlendMode AnimationNodeBlendSpace2D::get_blend_mode() const {
+ return blend_mode;
+}
+
void AnimationNodeBlendSpace2D::_bind_methods() {
ClassDB::bind_method(D_METHOD("add_blend_point", "node", "pos", "at_index"), &AnimationNodeBlendSpace2D::add_blend_point, DEFVAL(-1));
@@ -565,7 +639,11 @@ void AnimationNodeBlendSpace2D::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_auto_triangles", "enable"), &AnimationNodeBlendSpace2D::set_auto_triangles);
ClassDB::bind_method(D_METHOD("get_auto_triangles"), &AnimationNodeBlendSpace2D::get_auto_triangles);
+ ClassDB::bind_method(D_METHOD("set_blend_mode", "mode"), &AnimationNodeBlendSpace2D::set_blend_mode);
+ ClassDB::bind_method(D_METHOD("get_blend_mode"), &AnimationNodeBlendSpace2D::get_blend_mode);
+
ClassDB::bind_method(D_METHOD("_tree_changed"), &AnimationNodeBlendSpace2D::_tree_changed);
+ ClassDB::bind_method(D_METHOD("_update_triangles"), &AnimationNodeBlendSpace2D::_update_triangles);
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "auto_triangles", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_auto_triangles", "get_auto_triangles");
@@ -581,6 +659,12 @@ void AnimationNodeBlendSpace2D::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "snap", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_snap", "get_snap");
ADD_PROPERTY(PropertyInfo(Variant::STRING, "x_label", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_x_label", "get_x_label");
ADD_PROPERTY(PropertyInfo(Variant::STRING, "y_label", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_y_label", "get_y_label");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "blend_mode", PROPERTY_HINT_ENUM, "Interpolated,Discrete,Carry", PROPERTY_USAGE_NOEDITOR), "set_blend_mode", "get_blend_mode");
+
+ ADD_SIGNAL(MethodInfo("triangles_updated"));
+ BIND_ENUM_CONSTANT(BLEND_MODE_INTERPOLATED);
+ BIND_ENUM_CONSTANT(BLEND_MODE_DISCRETE);
+ BIND_ENUM_CONSTANT(BLEND_MODE_DISCRETE_CARRY);
}
AnimationNodeBlendSpace2D::AnimationNodeBlendSpace2D() {
@@ -597,6 +681,9 @@ AnimationNodeBlendSpace2D::AnimationNodeBlendSpace2D() {
y_label = "y";
trianges_dirty = false;
blend_position = "blend_position";
+ closest = "closest";
+ length_internal = "length_internal";
+ blend_mode = BLEND_MODE_INTERPOLATED;
}
AnimationNodeBlendSpace2D::~AnimationNodeBlendSpace2D() {
diff --git a/scene/animation/animation_blend_space_2d.h b/scene/animation/animation_blend_space_2d.h
index 2c684687de..c21360beb9 100644
--- a/scene/animation/animation_blend_space_2d.h
+++ b/scene/animation/animation_blend_space_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -35,7 +35,14 @@
class AnimationNodeBlendSpace2D : public AnimationRootNode {
GDCLASS(AnimationNodeBlendSpace2D, AnimationRootNode)
+public:
+ enum BlendMode {
+ BLEND_MODE_INTERPOLATED,
+ BLEND_MODE_DISCRETE,
+ BLEND_MODE_DISCRETE_CARRY,
+ };
+protected:
enum {
MAX_BLEND_POINTS = 64
};
@@ -56,11 +63,14 @@ class AnimationNodeBlendSpace2D : public AnimationRootNode {
Vector<BlendTriangle> triangles;
StringName blend_position;
+ StringName closest;
+ StringName length_internal;
Vector2 max_space;
Vector2 min_space;
Vector2 snap;
String x_label;
String y_label;
+ BlendMode blend_mode;
void _add_blend_point(int p_index, const Ref<AnimationRootNode> &p_node);
void _set_triangles(const Vector<int> &p_triangles);
@@ -72,6 +82,7 @@ class AnimationNodeBlendSpace2D : public AnimationRootNode {
bool trianges_dirty;
void _update_triangles();
+ void _queue_auto_triangles();
void _tree_changed();
@@ -122,10 +133,15 @@ public:
void set_auto_triangles(bool p_enable);
bool get_auto_triangles() const;
+ void set_blend_mode(BlendMode p_blend_mode);
+ BlendMode get_blend_mode() const;
+
virtual Ref<AnimationNode> get_child_by_name(const StringName &p_name);
AnimationNodeBlendSpace2D();
~AnimationNodeBlendSpace2D();
};
+VARIANT_ENUM_CAST(AnimationNodeBlendSpace2D::BlendMode)
+
#endif // ANIMATION_BLEND_SPACE_2D_H
diff --git a/scene/animation/animation_blend_tree.cpp b/scene/animation/animation_blend_tree.cpp
index a08639089e..a343a4f0ed 100644
--- a/scene/animation/animation_blend_tree.cpp
+++ b/scene/animation/animation_blend_tree.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -700,7 +700,7 @@ String AnimationNodeTransition::get_input_caption(int p_input) const {
if (tree.is_valid() && current >= 0) {
prev = current;
- prev_xfading = xfade;
+ prev_xfading = xfade;
time = 0;
current = p_current;
switched = true;
@@ -835,12 +835,11 @@ AnimationNodeTransition::AnimationNodeTransition() {
time = "time";
current = "current";
prev_current = "prev_current";
- ;
enabled_inputs = 0;
for (int i = 0; i < MAX_INPUTS; i++) {
inputs[i].auto_advance = false;
- inputs[i].name = itos(i + 1);
+ inputs[i].name = "state " + itos(i);
}
}
diff --git a/scene/animation/animation_blend_tree.h b/scene/animation/animation_blend_tree.h
index 5adb7fd71a..e207713134 100644
--- a/scene/animation/animation_blend_tree.h
+++ b/scene/animation/animation_blend_tree.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/animation/animation_cache.cpp b/scene/animation/animation_cache.cpp
index 756907c41c..6c67af5777 100644
--- a/scene/animation/animation_cache.cpp
+++ b/scene/animation/animation_cache.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/animation/animation_cache.h b/scene/animation/animation_cache.h
index cf28236376..ac668b7796 100644
--- a/scene/animation/animation_cache.h
+++ b/scene/animation/animation_cache.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/animation/animation_node_state_machine.cpp b/scene/animation/animation_node_state_machine.cpp
index a7af3f687b..56faba27cf 100644
--- a/scene/animation/animation_node_state_machine.cpp
+++ b/scene/animation/animation_node_state_machine.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -480,10 +480,9 @@ float AnimationNodeStateMachinePlayback::process(AnimationNodeStateMachine *sm,
}
//compute time left for transitions by using the end node
-
if (sm->end_node != StringName() && sm->end_node != current) {
- rem = sm->blend_node(current, sm->states[sm->end_node].node, 0, true, 0, AnimationNode::FILTER_IGNORE, false);
+ rem = sm->blend_node(sm->end_node, sm->states[sm->end_node].node, 0, true, 0, AnimationNode::FILTER_IGNORE, false);
}
return rem;
diff --git a/scene/animation/animation_node_state_machine.h b/scene/animation/animation_node_state_machine.h
index a88b3eb482..e47b940c35 100644
--- a/scene/animation/animation_node_state_machine.h
+++ b/scene/animation/animation_node_state_machine.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/animation/animation_player.cpp b/scene/animation/animation_player.cpp
index 102f05a146..1d2001c30d 100644
--- a/scene/animation/animation_player.cpp
+++ b/scene/animation/animation_player.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -1120,6 +1120,15 @@ void AnimationPlayer::queue(const StringName &p_name) {
queued.push_back(p_name);
}
+PoolVector<String> AnimationPlayer::get_queue() {
+ PoolVector<String> ret;
+ for (List<StringName>::Element *E = queued.front(); E; E = E->next()) {
+ ret.push_back(E->get());
+ }
+
+ return ret;
+}
+
void AnimationPlayer::clear_queue() {
queued.clear();
}
@@ -1348,6 +1357,9 @@ void AnimationPlayer::_animation_changed() {
clear_caches();
emit_signal("caches_cleared");
+ if (is_playing()) {
+ playback.seeked = true; //need to restart stuff, like audio
+ }
}
void AnimationPlayer::_stop_playing_caches() {
@@ -1415,6 +1427,8 @@ StringName AnimationPlayer::find_animation(const Ref<Animation> &p_animation) co
}
void AnimationPlayer::set_autoplay(const String &p_name) {
+ if (is_inside_tree() && !Engine::get_singleton()->is_editor_hint())
+ WARN_PRINT("Setting autoplay after the node has been added to the scene has no effect.");
autoplay = p_name;
}
@@ -1600,6 +1614,7 @@ void AnimationPlayer::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_assigned_animation", "anim"), &AnimationPlayer::set_assigned_animation);
ClassDB::bind_method(D_METHOD("get_assigned_animation"), &AnimationPlayer::get_assigned_animation);
ClassDB::bind_method(D_METHOD("queue", "name"), &AnimationPlayer::queue);
+ ClassDB::bind_method(D_METHOD("get_queue"), &AnimationPlayer::get_queue);
ClassDB::bind_method(D_METHOD("clear_queue"), &AnimationPlayer::clear_queue);
ClassDB::bind_method(D_METHOD("set_active", "active"), &AnimationPlayer::set_active);
diff --git a/scene/animation/animation_player.h b/scene/animation/animation_player.h
index f50b2454ec..175072edcf 100644
--- a/scene/animation/animation_player.h
+++ b/scene/animation/animation_player.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -312,6 +312,7 @@ public:
void play(const StringName &p_name = StringName(), float p_custom_blend = -1, float p_custom_scale = 1.0, bool p_from_end = false);
void play_backwards(const StringName &p_name = StringName(), float p_custom_blend = -1);
void queue(const StringName &p_name);
+ PoolVector<String> get_queue();
void clear_queue();
void stop(bool p_reset = true);
bool is_playing() const;
diff --git a/scene/animation/animation_tree.cpp b/scene/animation/animation_tree.cpp
index eb00f91bb3..706717a8e3 100644
--- a/scene/animation/animation_tree.cpp
+++ b/scene/animation/animation_tree.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -37,9 +37,20 @@
#include "servers/audio/audio_stream.h"
void AnimationNode::get_parameter_list(List<PropertyInfo> *r_list) const {
+ if (get_script_instance()) {
+ Array parameters = get_script_instance()->call("get_parameter_list");
+ for (int i = 0; i < parameters.size(); i++) {
+ Dictionary d = parameters[i];
+ ERR_CONTINUE(d.empty());
+ r_list->push_back(PropertyInfo::from_dict(d));
+ }
+ }
}
Variant AnimationNode::get_parameter_default_value(const StringName &p_parameter) const {
+ if (get_script_instance()) {
+ return get_script_instance()->call("get_parameter_default_value");
+ }
return Variant();
}
@@ -62,6 +73,18 @@ Variant AnimationNode::get_parameter(const StringName &p_name) const {
}
void AnimationNode::get_child_nodes(List<ChildNode> *r_child_nodes) {
+
+ if (get_script_instance()) {
+ Dictionary cn = get_script_instance()->call("get_child_nodes");
+ List<Variant> keys;
+ cn.get_key_list(&keys);
+ for (List<Variant>::Element *E = keys.front(); E; E = E->next()) {
+ ChildNode child;
+ child.name = E->get();
+ child.node = cn[E->get()];
+ r_child_nodes->push_back(child);
+ }
+ }
}
void AnimationNode::blend_animation(const StringName &p_animation, float p_time, float p_delta, bool p_seeked, float p_blend) {
@@ -373,6 +396,9 @@ void AnimationNode::_validate_property(PropertyInfo &property) const {
}
Ref<AnimationNode> AnimationNode::get_child_by_name(const StringName &p_name) {
+ if (get_script_instance()) {
+ return get_script_instance()->call("get_child_by_name");
+ }
return Ref<AnimationNode>();
}
@@ -403,6 +429,14 @@ void AnimationNode::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "filter_enabled", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_filter_enabled", "is_filter_enabled");
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "filters", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL), "_set_filters", "_get_filters");
+ BIND_VMETHOD(MethodInfo(Variant::DICTIONARY, "get_child_nodes"));
+ BIND_VMETHOD(MethodInfo(Variant::ARRAY, "get_parameter_list"));
+ BIND_VMETHOD(MethodInfo(Variant::OBJECT, "get_child_by_name", PropertyInfo(Variant::STRING, "name")));
+ {
+ MethodInfo mi = MethodInfo(Variant::NIL, "get_parameter_default_value", PropertyInfo(Variant::STRING, "name"));
+ mi.return_val.usage = PROPERTY_USAGE_NIL_IS_VARIANT;
+ BIND_VMETHOD(mi);
+ }
BIND_VMETHOD(MethodInfo("process", PropertyInfo(Variant::REAL, "time"), PropertyInfo(Variant::BOOL, "seek")));
BIND_VMETHOD(MethodInfo(Variant::STRING, "get_caption"));
BIND_VMETHOD(MethodInfo(Variant::STRING, "has_filter"));
diff --git a/scene/animation/animation_tree.h b/scene/animation/animation_tree.h
index cda7f8ae74..4c65b2a92c 100644
--- a/scene/animation/animation_tree.h
+++ b/scene/animation/animation_tree.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/animation/animation_tree_player.cpp b/scene/animation/animation_tree_player.cpp
index 524784df53..e3a21d8b46 100644
--- a/scene/animation/animation_tree_player.cpp
+++ b/scene/animation/animation_tree_player.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -401,6 +401,9 @@ void AnimationTreePlayer::_notification(int p_what) {
case NOTIFICATION_ENTER_TREE: {
+ ERR_EXPLAIN("AnimationTreePlayer has been deprecated. Use AnimationTree instead.");
+ WARN_DEPRECATED
+
if (!processing) {
//make sure that a previous process state was not saved
//only process if "processing" is set
@@ -409,12 +412,14 @@ void AnimationTreePlayer::_notification(int p_what) {
}
} break;
case NOTIFICATION_READY: {
+
dirty_caches = true;
if (master != NodePath()) {
_update_sources();
}
} break;
case NOTIFICATION_INTERNAL_PROCESS: {
+
if (animation_process_mode == ANIMATION_PROCESS_PHYSICS)
break;
@@ -1715,6 +1720,11 @@ Error AnimationTreePlayer::node_rename(const StringName &p_node, const StringNam
return OK;
}
+String AnimationTreePlayer::get_configuration_warning() const {
+
+ return TTR("This node has been deprecated. Use AnimationTree instead.");
+}
+
void AnimationTreePlayer::_bind_methods() {
ClassDB::bind_method(D_METHOD("add_node", "type", "id"), &AnimationTreePlayer::add_node);
diff --git a/scene/animation/animation_tree_player.h b/scene/animation/animation_tree_player.h
index d2d7b1c9ec..12e514f7d5 100644
--- a/scene/animation/animation_tree_player.h
+++ b/scene/animation/animation_tree_player.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -343,6 +343,8 @@ public:
int node_get_input_count(const StringName &p_node) const;
StringName node_get_input_source(const StringName &p_node, int p_input) const;
+ String get_configuration_warning() const;
+
/* ANIMATION NODE */
void animation_node_set_animation(const StringName &p_node, const Ref<Animation> &p_animation);
Ref<Animation> animation_node_get_animation(const StringName &p_node) const;
diff --git a/scene/animation/root_motion_view.cpp b/scene/animation/root_motion_view.cpp
index 01a10dbc2b..646a39d063 100644
--- a/scene/animation/root_motion_view.cpp
+++ b/scene/animation/root_motion_view.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/animation/root_motion_view.h b/scene/animation/root_motion_view.h
index 5198ab21aa..bca265b1f0 100644
--- a/scene/animation/root_motion_view.h
+++ b/scene/animation/root_motion_view.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/animation/skeleton_ik.cpp b/scene/animation/skeleton_ik.cpp
index 83f45afac8..88fb2d5bfc 100644
--- a/scene/animation/skeleton_ik.cpp
+++ b/scene/animation/skeleton_ik.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -280,7 +280,7 @@ void FabrikInverseKinematic::make_goal(Task *p_task, const Transform &p_inverse_
}
}
-void FabrikInverseKinematic::solve(Task *p_task, real_t blending_delta, bool p_use_magnet, const Vector3 &p_magnet_position) {
+void FabrikInverseKinematic::solve(Task *p_task, real_t blending_delta, bool override_tip_basis, bool p_use_magnet, const Vector3 &p_magnet_position) {
if (blending_delta <= 0.01f) {
return; // Skip solving
@@ -314,7 +314,10 @@ void FabrikInverseKinematic::solve(Task *p_task, real_t blending_delta, bool p_u
}
} else {
// Set target orientation to tip
- new_bone_pose.basis = p_task->chain.tips[0].end_effector->goal_transform.basis;
+ if (override_tip_basis)
+ new_bone_pose.basis = p_task->chain.tips[0].end_effector->goal_transform.basis;
+ else
+ new_bone_pose.basis = new_bone_pose.basis * p_task->chain.tips[0].end_effector->goal_transform.basis;
}
p_task->skeleton->set_bone_global_pose(ci->bone, new_bone_pose);
@@ -366,6 +369,9 @@ void SkeletonIK::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_target_node", "node"), &SkeletonIK::set_target_node);
ClassDB::bind_method(D_METHOD("get_target_node"), &SkeletonIK::get_target_node);
+ ClassDB::bind_method(D_METHOD("set_override_tip_basis", "override"), &SkeletonIK::set_override_tip_basis);
+ ClassDB::bind_method(D_METHOD("is_override_tip_basis"), &SkeletonIK::is_override_tip_basis);
+
ClassDB::bind_method(D_METHOD("set_use_magnet", "use"), &SkeletonIK::set_use_magnet);
ClassDB::bind_method(D_METHOD("is_using_magnet"), &SkeletonIK::is_using_magnet);
@@ -388,6 +394,7 @@ void SkeletonIK::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::STRING, "tip_bone"), "set_tip_bone", "get_tip_bone");
ADD_PROPERTY(PropertyInfo(Variant::REAL, "interpolation", PROPERTY_HINT_RANGE, "0,1,0.001"), "set_interpolation", "get_interpolation");
ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM, "target"), "set_target_transform", "get_target_transform");
+ ADD_PROPERTY(PropertyInfo(Variant::BOOL, "override_tip_basis"), "set_override_tip_basis", "is_override_tip_basis");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_magnet"), "set_use_magnet", "is_using_magnet");
ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "magnet"), "set_magnet_position", "get_magnet_position");
ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "target_node"), "set_target_node", "get_target_node");
@@ -418,6 +425,7 @@ void SkeletonIK::_notification(int p_what) {
SkeletonIK::SkeletonIK() :
Node(),
interpolation(1),
+ override_tip_basis(true),
use_magnet(false),
min_distance(0.01),
max_iterations(10),
@@ -478,6 +486,14 @@ NodePath SkeletonIK::get_target_node() {
return target_node_path_override;
}
+void SkeletonIK::set_override_tip_basis(bool p_override) {
+ override_tip_basis = p_override;
+}
+
+bool SkeletonIK::is_override_tip_basis() const {
+ return override_tip_basis;
+}
+
void SkeletonIK::set_use_magnet(bool p_use) {
use_magnet = p_use;
}
@@ -555,7 +571,7 @@ void SkeletonIK::reload_goal() {
void SkeletonIK::_solve_chain() {
if (!task)
return;
- FabrikInverseKinematic::solve(task, interpolation, use_magnet, magnet_position);
+ FabrikInverseKinematic::solve(task, interpolation, override_tip_basis, use_magnet, magnet_position);
}
#endif // _3D_DISABLED
diff --git a/scene/animation/skeleton_ik.h b/scene/animation/skeleton_ik.h
index 202d6959bb..228184a2df 100644
--- a/scene/animation/skeleton_ik.h
+++ b/scene/animation/skeleton_ik.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -138,7 +138,7 @@ public:
// The goal of chain should be always in local space
static void set_goal(Task *p_task, const Transform &p_goal);
static void make_goal(Task *p_task, const Transform &p_inverse_transf, real_t blending_delta);
- static void solve(Task *p_task, real_t blending_delta, bool p_use_magnet, const Vector3 &p_magnet_position);
+ static void solve(Task *p_task, real_t blending_delta, bool override_tip_basis, bool p_use_magnet, const Vector3 &p_magnet_position);
};
class SkeletonIK : public Node {
@@ -149,6 +149,7 @@ class SkeletonIK : public Node {
real_t interpolation;
Transform target;
NodePath target_node_path_override;
+ bool override_tip_basis;
bool use_magnet;
Vector3 magnet_position;
@@ -185,6 +186,9 @@ public:
void set_target_node(const NodePath &p_node);
NodePath get_target_node();
+ void set_override_tip_basis(bool p_override);
+ bool is_override_tip_basis() const;
+
void set_use_magnet(bool p_use);
bool is_using_magnet() const;
diff --git a/scene/animation/tween.cpp b/scene/animation/tween.cpp
index 3521782417..6a5d7839f4 100644
--- a/scene/animation/tween.cpp
+++ b/scene/animation/tween.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/animation/tween.h b/scene/animation/tween.h
index aa47c00717..6fe3bffdbe 100644
--- a/scene/animation/tween.h
+++ b/scene/animation/tween.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/audio/audio_player.cpp b/scene/audio/audio_player.cpp
index 1d9d048fe1..4eae3b04e7 100644
--- a/scene/audio/audio_player.cpp
+++ b/scene/audio/audio_player.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/audio/audio_player.h b/scene/audio/audio_player.h
index 591c00ed18..2e9526c335 100644
--- a/scene/audio/audio_player.h
+++ b/scene/audio/audio_player.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/base_button.cpp b/scene/gui/base_button.cpp
index d37eb22c4d..a6b4d475ba 100644
--- a/scene/gui/base_button.cpp
+++ b/scene/gui/base_button.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -406,6 +406,16 @@ bool BaseButton::is_toggle_mode() const {
return toggle_mode;
}
+void BaseButton::set_shortcut_in_tooltip(bool p_on) {
+
+ shortcut_in_tooltip = p_on;
+}
+
+bool BaseButton::is_shortcut_in_tooltip_enabled() const {
+
+ return shortcut_in_tooltip;
+}
+
void BaseButton::set_action_mode(ActionMode p_mode) {
action_mode = p_mode;
@@ -471,7 +481,7 @@ void BaseButton::_unhandled_input(Ref<InputEvent> p_event) {
String BaseButton::get_tooltip(const Point2 &p_pos) const {
String tooltip = Control::get_tooltip(p_pos);
- if (shortcut.is_valid() && shortcut->is_valid()) {
+ if (shortcut_in_tooltip && shortcut.is_valid() && shortcut->is_valid()) {
String text = shortcut->get_name() + " (" + shortcut->get_as_text() + ")";
if (shortcut->get_name().nocasecmp_to(tooltip) != 0) {
text += "\n" + tooltip;
@@ -510,6 +520,8 @@ void BaseButton::_bind_methods() {
ClassDB::bind_method(D_METHOD("is_hovered"), &BaseButton::is_hovered);
ClassDB::bind_method(D_METHOD("set_toggle_mode", "enabled"), &BaseButton::set_toggle_mode);
ClassDB::bind_method(D_METHOD("is_toggle_mode"), &BaseButton::is_toggle_mode);
+ ClassDB::bind_method(D_METHOD("set_shortcut_in_tooltip", "enabled"), &BaseButton::set_shortcut_in_tooltip);
+ ClassDB::bind_method(D_METHOD("is_shortcut_in_tooltip_enabled"), &BaseButton::is_shortcut_in_tooltip_enabled);
ClassDB::bind_method(D_METHOD("set_disabled", "disabled"), &BaseButton::set_disabled);
ClassDB::bind_method(D_METHOD("is_disabled"), &BaseButton::is_disabled);
ClassDB::bind_method(D_METHOD("set_action_mode", "mode"), &BaseButton::set_action_mode);
@@ -535,6 +547,7 @@ void BaseButton::_bind_methods() {
ADD_SIGNAL(MethodInfo("toggled", PropertyInfo(Variant::BOOL, "button_pressed")));
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "disabled"), "set_disabled", "is_disabled");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "toggle_mode"), "set_toggle_mode", "is_toggle_mode");
+ ADD_PROPERTY(PropertyInfo(Variant::BOOL, "shortcut_in_tooltip"), "set_shortcut_in_tooltip", "is_shortcut_in_tooltip_enabled");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "pressed"), "set_pressed", "is_pressed");
ADD_PROPERTY(PropertyInfo(Variant::INT, "action_mode", PROPERTY_HINT_ENUM, "Button Press,Button Release"), "set_action_mode", "get_action_mode");
ADD_PROPERTY(PropertyInfo(Variant::INT, "button_mask", PROPERTY_HINT_FLAGS, "Mouse Left, Mouse Right, Mouse Middle"), "set_button_mask", "get_button_mask");
@@ -555,6 +568,7 @@ void BaseButton::_bind_methods() {
BaseButton::BaseButton() {
toggle_mode = false;
+ shortcut_in_tooltip = true;
status.pressed = false;
status.press_attempt = false;
status.hovering = false;
@@ -581,6 +595,16 @@ void ButtonGroup::get_buttons(List<BaseButton *> *r_buttons) {
}
}
+Array ButtonGroup::_get_buttons() {
+
+ Array btns;
+ for (Set<BaseButton *>::Element *E = buttons.front(); E; E = E->next()) {
+ btns.push_back(E->get());
+ }
+
+ return btns;
+}
+
BaseButton *ButtonGroup::get_pressed_button() {
for (Set<BaseButton *>::Element *E = buttons.front(); E; E = E->next()) {
@@ -594,6 +618,7 @@ BaseButton *ButtonGroup::get_pressed_button() {
void ButtonGroup::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_pressed_button"), &ButtonGroup::get_pressed_button);
+ ClassDB::bind_method(D_METHOD("get_buttons"), &ButtonGroup::_get_buttons);
}
ButtonGroup::ButtonGroup() {
diff --git a/scene/gui/base_button.h b/scene/gui/base_button.h
index 176d9fc213..9a00cc79f2 100644
--- a/scene/gui/base_button.h
+++ b/scene/gui/base_button.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -51,6 +51,7 @@ public:
private:
int button_mask;
bool toggle_mode;
+ bool shortcut_in_tooltip;
FocusMode enabled_focus_mode;
Ref<ShortCut> shortcut;
@@ -100,6 +101,9 @@ public:
void set_toggle_mode(bool p_on);
bool is_toggle_mode() const;
+ void set_shortcut_in_tooltip(bool p_on);
+ bool is_shortcut_in_tooltip_enabled() const;
+
void set_disabled(bool p_disabled);
bool is_disabled() const;
@@ -139,6 +143,7 @@ protected:
public:
BaseButton *get_pressed_button();
void get_buttons(List<BaseButton *> *r_buttons);
+ Array _get_buttons();
ButtonGroup();
};
diff --git a/scene/gui/box_container.cpp b/scene/gui/box_container.cpp
index 12b9fe7c03..35e8e984cd 100644
--- a/scene/gui/box_container.cpp
+++ b/scene/gui/box_container.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/box_container.h b/scene/gui/box_container.h
index abc228f804..89924f7fcb 100644
--- a/scene/gui/box_container.h
+++ b/scene/gui/box_container.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/button.cpp b/scene/gui/button.cpp
index 621153b6de..b77b57ddd4 100644
--- a/scene/gui/button.cpp
+++ b/scene/gui/button.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/button.h b/scene/gui/button.h
index 0b41b14f02..6ba3475e5a 100644
--- a/scene/gui/button.h
+++ b/scene/gui/button.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/center_container.cpp b/scene/gui/center_container.cpp
index cf71f89830..7c842999d1 100644
--- a/scene/gui/center_container.cpp
+++ b/scene/gui/center_container.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/center_container.h b/scene/gui/center_container.h
index 519e1493ec..9c9f61388c 100644
--- a/scene/gui/center_container.h
+++ b/scene/gui/center_container.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/check_box.cpp b/scene/gui/check_box.cpp
index 0790f87ea7..1d8b74d9db 100644
--- a/scene/gui/check_box.cpp
+++ b/scene/gui/check_box.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/check_box.h b/scene/gui/check_box.h
index 8375b46ca0..adfb12e7a1 100644
--- a/scene/gui/check_box.h
+++ b/scene/gui/check_box.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/check_button.cpp b/scene/gui/check_button.cpp
index fa9538da28..35e3119473 100644
--- a/scene/gui/check_button.cpp
+++ b/scene/gui/check_button.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/check_button.h b/scene/gui/check_button.h
index a11749e3f6..13b0dbc194 100644
--- a/scene/gui/check_button.h
+++ b/scene/gui/check_button.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp
index c5d3def4c1..b99128e65f 100644
--- a/scene/gui/color_picker.cpp
+++ b/scene/gui/color_picker.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -204,22 +204,9 @@ void ColorPicker::_update_presets() {
preset->draw_texture_rect(get_icon("preset_bg", "ColorPicker"), Rect2(Point2(), preset_size), true);
-#ifdef TOOLS_ENABLED
- if (Engine::get_singleton()->is_editor_hint()) {
- PoolColorArray arr_to_save = PoolColorArray();
-
- for (int i = 0; i < presets.size(); i++) {
- preset->draw_rect(Rect2(Point2(size.width * i, 0), size), presets[i]);
- arr_to_save.insert(i, presets[i]);
- }
-
- EditorSettings::get_singleton()->set_project_metadata("color_picker", "presets", arr_to_save);
- }
-#else
for (int i = 0; i < presets.size(); i++) {
preset->draw_rect(Rect2(Point2(size.width * i, 0), size), presets[i]);
}
-#endif
}
void ColorPicker::_text_type_toggled() {
@@ -251,6 +238,38 @@ void ColorPicker::add_preset(const Color &p_color) {
preset->update();
if (presets.size() == 10)
bt_add_preset->hide();
+
+#ifdef TOOLS_ENABLED
+ if (Engine::get_singleton()->is_editor_hint()) {
+ PoolColorArray arr_to_save = get_presets();
+ EditorSettings::get_singleton()->set_project_metadata("color_picker", "presets", arr_to_save);
+ }
+#endif
+}
+
+void ColorPicker::erase_preset(const Color &p_color) {
+
+ if (presets.find(p_color)) {
+ presets.erase(presets.find(p_color));
+ preset->update();
+
+#ifdef TOOLS_ENABLED
+ if (Engine::get_singleton()->is_editor_hint()) {
+ PoolColorArray arr_to_save = get_presets();
+ EditorSettings::get_singleton()->set_project_metadata("color_picker", "presets", arr_to_save);
+ }
+#endif
+ }
+}
+
+PoolColorArray ColorPicker::get_presets() const {
+
+ PoolColorArray arr;
+ arr.resize(presets.size());
+ for (int i = 0; i < presets.size(); i++) {
+ arr.set(i, presets[i]);
+ }
+ return arr;
}
void ColorPicker::set_raw_mode(bool p_enabled) {
@@ -444,14 +463,15 @@ void ColorPicker::_preset_input(const Ref<InputEvent> &p_event) {
if (bev->is_pressed() && bev->get_button_index() == BUTTON_LEFT) {
int index = bev->get_position().x / (preset->get_size().x / presets.size());
set_pick_color(presets[index]);
+ _update_color();
+ emit_signal("color_changed", color);
} else if (bev->is_pressed() && bev->get_button_index() == BUTTON_RIGHT) {
int index = bev->get_position().x / (preset->get_size().x / presets.size());
- presets.erase(presets[index]);
- preset->update();
+ Color clicked_preset = presets[index];
+ erase_preset(clicked_preset);
+ emit_signal("preset_removed", clicked_preset);
bt_add_preset->show();
}
- _update_color();
- emit_signal("color_changed", color);
}
Ref<InputEventMouseMotion> mev = p_event;
@@ -501,6 +521,7 @@ void ColorPicker::_screen_input(const Ref<InputEvent> &p_event) {
void ColorPicker::_add_preset_pressed() {
add_preset(color);
+ emit_signal("preset_added", color);
}
void ColorPicker::_screen_pick_pressed() {
@@ -553,6 +574,8 @@ void ColorPicker::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_edit_alpha", "show"), &ColorPicker::set_edit_alpha);
ClassDB::bind_method(D_METHOD("is_editing_alpha"), &ColorPicker::is_editing_alpha);
ClassDB::bind_method(D_METHOD("add_preset", "color"), &ColorPicker::add_preset);
+ ClassDB::bind_method(D_METHOD("erase_preset", "color"), &ColorPicker::erase_preset);
+ ClassDB::bind_method(D_METHOD("get_presets"), &ColorPicker::get_presets);
ClassDB::bind_method(D_METHOD("_value_changed"), &ColorPicker::_value_changed);
ClassDB::bind_method(D_METHOD("_html_entered"), &ColorPicker::_html_entered);
ClassDB::bind_method(D_METHOD("_text_type_toggled"), &ColorPicker::_text_type_toggled);
@@ -575,6 +598,8 @@ void ColorPicker::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "deferred_mode"), "set_deferred_mode", "is_deferred_mode");
ADD_SIGNAL(MethodInfo("color_changed", PropertyInfo(Variant::COLOR, "color")));
+ ADD_SIGNAL(MethodInfo("preset_added", PropertyInfo(Variant::COLOR, "color")));
+ ADD_SIGNAL(MethodInfo("preset_removed", PropertyInfo(Variant::COLOR, "color")));
}
ColorPicker::ColorPicker() :
diff --git a/scene/gui/color_picker.h b/scene/gui/color_picker.h
index 0166da7118..b78844839a 100644
--- a/scene/gui/color_picker.h
+++ b/scene/gui/color_picker.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -105,6 +105,9 @@ public:
Color get_pick_color() const;
void add_preset(const Color &p_color);
+ void erase_preset(const Color &p_color);
+ PoolColorArray get_presets() const;
+
void set_raw_mode(bool p_enabled);
bool is_raw_mode() const;
diff --git a/scene/gui/color_rect.cpp b/scene/gui/color_rect.cpp
index 463f3911dc..df9b4e8498 100644
--- a/scene/gui/color_rect.cpp
+++ b/scene/gui/color_rect.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/color_rect.h b/scene/gui/color_rect.h
index a841008f76..d7f9ef275d 100644
--- a/scene/gui/color_rect.h
+++ b/scene/gui/color_rect.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/container.cpp b/scene/gui/container.cpp
index d606629041..2579321773 100644
--- a/scene/gui/container.cpp
+++ b/scene/gui/container.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -95,6 +95,7 @@ void Container::_sort_children() {
void Container::fit_child_in_rect(Control *p_child, const Rect2 &p_rect) {
+ ERR_FAIL_COND(!p_child);
ERR_FAIL_COND(p_child->get_parent() != this);
Size2 minsize = p_child->get_combined_minimum_size();
diff --git a/scene/gui/container.h b/scene/gui/container.h
index c472162f58..0b014137f4 100644
--- a/scene/gui/container.h
+++ b/scene/gui/container.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp
index 79e1d35b94..513befb8f3 100644
--- a/scene/gui/control.cpp
+++ b/scene/gui/control.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -451,6 +451,11 @@ void Control::_update_canvas_item_transform() {
Transform2D xform = _get_internal_transform();
xform[2] += get_position();
+ // We use a little workaround to avoid flickering when moving the pivot with _edit_set_pivot()
+ if (is_inside_tree() && Math::abs(Math::sin(data.rotation * 4.0f)) < 0.00001f && get_viewport()->is_snap_controls_to_pixels_enabled()) {
+ xform[2] = xform[2].round();
+ }
+
VisualServer::get_singleton()->canvas_item_set_transform(get_canvas_item(), xform);
}
@@ -1336,11 +1341,6 @@ void Control::_size_changed() {
new_size_cache.height = minimum_size.height;
}
- // We use a little workaround to avoid flickering when moving the pivot with _edit_set_pivot()
- if (is_inside_tree() && Math::abs(Math::sin(data.rotation * 4.0f)) < 0.00001f && get_viewport()->is_snap_controls_to_pixels_enabled()) {
- new_size_cache = new_size_cache.round();
- new_pos_cache = new_pos_cache.round();
- }
bool pos_changed = new_pos_cache != data.pos_cache;
bool size_changed = new_size_cache != data.size_cache;
@@ -1740,10 +1740,10 @@ Rect2 Control::_compute_child_rect(const float p_anchors[4], const float p_margi
void Control::_compute_margins(Rect2 p_rect, const float p_anchors[4], float (&r_margins)[4]) {
Size2 parent_rect_size = get_parent_anchorable_rect().size;
- r_margins[0] = Math::floor(p_rect.position.x - (p_anchors[0] * parent_rect_size.x));
- r_margins[1] = Math::floor(p_rect.position.y - (p_anchors[1] * parent_rect_size.y));
- r_margins[2] = Math::floor(p_rect.position.x + p_rect.size.x - (p_anchors[2] * parent_rect_size.x));
- r_margins[3] = Math::floor(p_rect.position.y + p_rect.size.y - (p_anchors[3] * parent_rect_size.y));
+ r_margins[0] = p_rect.position.x - (p_anchors[0] * parent_rect_size.x);
+ r_margins[1] = p_rect.position.y - (p_anchors[1] * parent_rect_size.y);
+ r_margins[2] = p_rect.position.x + p_rect.size.x - (p_anchors[2] * parent_rect_size.x);
+ r_margins[3] = p_rect.position.y + p_rect.size.y - (p_anchors[3] * parent_rect_size.y);
}
void Control::set_position(const Size2 &p_point) {
diff --git a/scene/gui/control.h b/scene/gui/control.h
index eb39d9ca0f..0812457bd2 100644
--- a/scene/gui/control.h
+++ b/scene/gui/control.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/dialogs.cpp b/scene/gui/dialogs.cpp
index 50511f6bbd..89f3d509d0 100644
--- a/scene/gui/dialogs.cpp
+++ b/scene/gui/dialogs.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/dialogs.h b/scene/gui/dialogs.h
index feb080dd06..4b89ac54c5 100644
--- a/scene/gui/dialogs.h
+++ b/scene/gui/dialogs.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/file_dialog.cpp b/scene/gui/file_dialog.cpp
index 1e9f4df4a3..5599c64daa 100644
--- a/scene/gui/file_dialog.cpp
+++ b/scene/gui/file_dialog.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -29,6 +29,7 @@
/*************************************************************************/
#include "file_dialog.h"
+
#include "core/os/keyboard.h"
#include "core/print_string.h"
#include "scene/gui/label.h"
@@ -596,7 +597,7 @@ void FileDialog::set_current_file(const String &p_file) {
int lp = p_file.find_last(".");
if (lp != -1) {
file->select(0, lp);
- if (file->is_inside_tree())
+ if (file->is_inside_tree() && !get_tree()->is_node_being_edited(file))
file->grab_focus();
}
}
diff --git a/scene/gui/file_dialog.h b/scene/gui/file_dialog.h
index 8bd15080d3..85edac0b12 100644
--- a/scene/gui/file_dialog.h
+++ b/scene/gui/file_dialog.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/gradient_edit.cpp b/scene/gui/gradient_edit.cpp
index c13964d196..cfbc9d6d18 100644
--- a/scene/gui/gradient_edit.cpp
+++ b/scene/gui/gradient_edit.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/gradient_edit.h b/scene/gui/gradient_edit.h
index f6927ad0b7..fd340b3f6c 100644
--- a/scene/gui/gradient_edit.h
+++ b/scene/gui/gradient_edit.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/graph_edit.cpp b/scene/gui/graph_edit.cpp
index b3bebc88ec..94c65b3e64 100644
--- a/scene/gui/graph_edit.cpp
+++ b/scene/gui/graph_edit.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -34,6 +34,10 @@
#include "core/os/keyboard.h"
#include "scene/gui/box_container.h"
+#ifdef TOOLS_ENABLED
+#include "editor/editor_scale.h"
+#endif
+
#define ZOOM_SCALE 1.2
#define MIN_ZOOM (((1 / ZOOM_SCALE) / ZOOM_SCALE) / ZOOM_SCALE)
@@ -665,11 +669,15 @@ void GraphEdit::_draw_cos_line(CanvasItem *p_where, const Vector2 &p_from, const
Vector<Color> colors;
points.push_back(p_from);
colors.push_back(p_color);
- _bake_segment2d(points, colors, 0, 1, p_from, c1, p_to, c2, 0, 3, 9, 8, p_color, p_to_color, lines);
+ _bake_segment2d(points, colors, 0, 1, p_from, c1, p_to, c2, 0, 3, 9, 3, p_color, p_to_color, lines);
points.push_back(p_to);
colors.push_back(p_to_color);
+#ifdef TOOLS_ENABLED
+ p_where->draw_polyline_colors(points, colors, Math::floor(2 * EDSCALE), true);
+#else
p_where->draw_polyline_colors(points, colors, 2, true);
+#endif
}
void GraphEdit::_connections_layer_draw() {
@@ -1277,7 +1285,7 @@ void GraphEdit::_bind_methods() {
ADD_SIGNAL(MethodInfo("connection_request", PropertyInfo(Variant::STRING, "from"), PropertyInfo(Variant::INT, "from_slot"), PropertyInfo(Variant::STRING, "to"), PropertyInfo(Variant::INT, "to_slot")));
ADD_SIGNAL(MethodInfo("disconnection_request", PropertyInfo(Variant::STRING, "from"), PropertyInfo(Variant::INT, "from_slot"), PropertyInfo(Variant::STRING, "to"), PropertyInfo(Variant::INT, "to_slot")));
- ADD_SIGNAL(MethodInfo("popup_request", PropertyInfo(Variant::VECTOR2, "p_position")));
+ ADD_SIGNAL(MethodInfo("popup_request", PropertyInfo(Variant::VECTOR2, "position")));
ADD_SIGNAL(MethodInfo("duplicate_nodes_request"));
ADD_SIGNAL(MethodInfo("node_selected", PropertyInfo(Variant::OBJECT, "node", PROPERTY_HINT_RESOURCE_TYPE, "Node")));
ADD_SIGNAL(MethodInfo("connection_to_empty", PropertyInfo(Variant::STRING, "from"), PropertyInfo(Variant::INT, "from_slot"), PropertyInfo(Variant::VECTOR2, "release_position")));
@@ -1339,21 +1347,25 @@ GraphEdit::GraphEdit() {
zoom_minus = memnew(ToolButton);
zoom_hb->add_child(zoom_minus);
+ zoom_minus->set_tooltip(RTR("Zoom Out"));
zoom_minus->connect("pressed", this, "_zoom_minus");
zoom_minus->set_focus_mode(FOCUS_NONE);
zoom_reset = memnew(ToolButton);
zoom_hb->add_child(zoom_reset);
+ zoom_reset->set_tooltip(RTR("Zoom Reset"));
zoom_reset->connect("pressed", this, "_zoom_reset");
zoom_reset->set_focus_mode(FOCUS_NONE);
zoom_plus = memnew(ToolButton);
zoom_hb->add_child(zoom_plus);
+ zoom_plus->set_tooltip(RTR("Zoom In"));
zoom_plus->connect("pressed", this, "_zoom_plus");
zoom_plus->set_focus_mode(FOCUS_NONE);
snap_button = memnew(ToolButton);
snap_button->set_toggle_mode(true);
+ snap_button->set_tooltip(RTR("Enable snap and show grid."));
snap_button->connect("pressed", this, "_snap_toggled");
snap_button->set_pressed(true);
snap_button->set_focus_mode(FOCUS_NONE);
diff --git a/scene/gui/graph_edit.h b/scene/gui/graph_edit.h
index 71165e3dc9..de826bf505 100644
--- a/scene/gui/graph_edit.h
+++ b/scene/gui/graph_edit.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/graph_node.cpp b/scene/gui/graph_node.cpp
index b189afd30b..7c879d239c 100644
--- a/scene/gui/graph_node.cpp
+++ b/scene/gui/graph_node.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/graph_node.h b/scene/gui/graph_node.h
index 20d25a69b0..2179904cc4 100644
--- a/scene/gui/graph_node.h
+++ b/scene/gui/graph_node.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/grid_container.cpp b/scene/gui/grid_container.cpp
index bb1d1d7695..b37d08de71 100644
--- a/scene/gui/grid_container.cpp
+++ b/scene/gui/grid_container.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/grid_container.h b/scene/gui/grid_container.h
index 243d06f034..3196046378 100644
--- a/scene/gui/grid_container.h
+++ b/scene/gui/grid_container.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/item_list.cpp b/scene/gui/item_list.cpp
index 1669d62082..f5521cccd5 100644
--- a/scene/gui/item_list.cpp
+++ b/scene/gui/item_list.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/item_list.h b/scene/gui/item_list.h
index acd17986eb..3a7cc65ab4 100644
--- a/scene/gui/item_list.h
+++ b/scene/gui/item_list.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/label.cpp b/scene/gui/label.cpp
index a7f88514e0..e3e9368a12 100644
--- a/scene/gui/label.cpp
+++ b/scene/gui/label.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -244,7 +244,7 @@ void Label::_notification(int p_what) {
CharType n = xl_text[i + pos + 1];
if (uppercase) {
c = String::char_uppercase(c);
- n = String::char_uppercase(c);
+ n = String::char_uppercase(n);
}
float move = font->draw_char(ci, Point2(x_ofs_shadow, y_ofs) + shadow_ofs, c, n, font_color_shadow, false);
@@ -265,7 +265,7 @@ void Label::_notification(int p_what) {
CharType n = xl_text[i + pos + 1];
if (uppercase) {
c = String::char_uppercase(c);
- n = String::char_uppercase(c);
+ n = String::char_uppercase(n);
}
x_ofs += drawer.draw_char(ci, Point2(x_ofs, y_ofs), c, n, font_color);
@@ -395,7 +395,7 @@ void Label::regenerate_word_cache() {
for (int i = 0; i <= xl_text.length(); i++) {
- CharType current = i < xl_text.length() ? xl_text[i] : ' '; //always a space at the end, so the algo works
+ CharType current = i < xl_text.length() ? xl_text[i] : L' '; //always a space at the end, so the algo works
if (uppercase)
current = String::char_uppercase(current);
diff --git a/scene/gui/label.h b/scene/gui/label.h
index d5e0b60773..561c42ef9e 100644
--- a/scene/gui/label.h
+++ b/scene/gui/label.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp
index 299c304c5f..4a2bb3dad1 100644
--- a/scene/gui/line_edit.cpp
+++ b/scene/gui/line_edit.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -248,7 +248,9 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) {
set_cursor_position(text.length());
} break;
#endif
- default: { handled = false; }
+ default: {
+ handled = false;
+ }
}
if (handled) {
@@ -831,7 +833,6 @@ void LineEdit::_notification(int p_what) {
OS::get_singleton()->set_ime_active(true);
OS::get_singleton()->set_ime_position(get_global_position() + Point2(using_placeholder ? 0 : x_ofs, y_ofs + caret_height));
- OS::get_singleton()->set_ime_intermediate_text_callback(_ime_text_callback, this);
}
} break;
case NOTIFICATION_FOCUS_ENTER: {
@@ -843,7 +844,6 @@ void LineEdit::_notification(int p_what) {
OS::get_singleton()->set_ime_active(true);
Point2 cursor_pos = Point2(get_cursor_position(), 1) * get_minimum_size().height;
OS::get_singleton()->set_ime_position(get_global_position() + cursor_pos);
- OS::get_singleton()->set_ime_intermediate_text_callback(_ime_text_callback, this);
if (OS::get_singleton()->has_virtual_keyboard())
OS::get_singleton()->show_virtual_keyboard(text, get_global_rect());
@@ -852,7 +852,6 @@ void LineEdit::_notification(int p_what) {
case NOTIFICATION_FOCUS_EXIT: {
OS::get_singleton()->set_ime_position(Point2());
- OS::get_singleton()->set_ime_intermediate_text_callback(NULL, NULL);
OS::get_singleton()->set_ime_active(false);
ime_text = "";
ime_selection = Point2();
@@ -861,6 +860,14 @@ void LineEdit::_notification(int p_what) {
OS::get_singleton()->hide_virtual_keyboard();
} break;
+ case MainLoop::NOTIFICATION_OS_IME_UPDATE: {
+
+ if (has_focus()) {
+ ime_text = OS::get_singleton()->get_ime_text();
+ ime_selection = OS::get_singleton()->get_ime_selection();
+ update();
+ }
+ } break;
}
}
@@ -1283,13 +1290,11 @@ int LineEdit::get_max_length() const {
void LineEdit::selection_fill_at_cursor() {
- int aux;
-
selection.begin = cursor_pos;
selection.end = selection.cursor_start;
if (selection.end < selection.begin) {
- aux = selection.end;
+ int aux = selection.end;
selection.end = selection.begin;
selection.begin = aux;
}
@@ -1461,13 +1466,6 @@ void LineEdit::set_right_icon(const Ref<Texture> &p_icon) {
update();
}
-void LineEdit::_ime_text_callback(void *p_self, String p_text, Point2 p_selection) {
- LineEdit *self = (LineEdit *)p_self;
- self->ime_text = p_text;
- self->ime_selection = p_selection;
- self->update();
-}
-
void LineEdit::_text_changed() {
if (expand_to_text_length)
diff --git a/scene/gui/line_edit.h b/scene/gui/line_edit.h
index 5294d99da0..3b29780dc0 100644
--- a/scene/gui/line_edit.h
+++ b/scene/gui/line_edit.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -122,7 +122,6 @@ private:
Timer *caret_blink_timer;
- static void _ime_text_callback(void *p_self, String p_text, Point2 p_selection);
void _text_changed();
void _emit_text_change();
bool expand_to_text_length;
diff --git a/scene/gui/link_button.cpp b/scene/gui/link_button.cpp
index a603487cf1..21527e9bfc 100644
--- a/scene/gui/link_button.cpp
+++ b/scene/gui/link_button.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/link_button.h b/scene/gui/link_button.h
index 0821ad9c0d..ffe248ac5e 100644
--- a/scene/gui/link_button.h
+++ b/scene/gui/link_button.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/margin_container.cpp b/scene/gui/margin_container.cpp
index 5e1d53fe1d..a087b68d25 100644
--- a/scene/gui/margin_container.cpp
+++ b/scene/gui/margin_container.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/margin_container.h b/scene/gui/margin_container.h
index ea75109248..336b68665f 100644
--- a/scene/gui/margin_container.h
+++ b/scene/gui/margin_container.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/menu_button.cpp b/scene/gui/menu_button.cpp
index 95ec618c3b..b67d8c00d6 100644
--- a/scene/gui/menu_button.cpp
+++ b/scene/gui/menu_button.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -71,13 +71,24 @@ PopupMenu *MenuButton::get_popup() const {
return popup;
}
+void MenuButton::_set_items(const Array &p_items) {
+
+ popup->set("items", p_items);
+}
+
Array MenuButton::_get_items() const {
return popup->get("items");
}
-void MenuButton::_set_items(const Array &p_items) {
- popup->set("items", p_items);
+void MenuButton::set_switch_on_hover(bool p_enabled) {
+
+ switch_on_hover = p_enabled;
+}
+
+bool MenuButton::is_switch_on_hover() {
+
+ return switch_on_hover;
}
void MenuButton::_bind_methods() {
@@ -86,9 +97,12 @@ void MenuButton::_bind_methods() {
ClassDB::bind_method(D_METHOD("_unhandled_key_input"), &MenuButton::_unhandled_key_input);
ClassDB::bind_method(D_METHOD("_set_items"), &MenuButton::_set_items);
ClassDB::bind_method(D_METHOD("_get_items"), &MenuButton::_get_items);
+ ClassDB::bind_method(D_METHOD("set_switch_on_hover", "enable"), &MenuButton::set_switch_on_hover);
+ ClassDB::bind_method(D_METHOD("is_switch_on_hover"), &MenuButton::is_switch_on_hover);
ClassDB::bind_method(D_METHOD("set_disable_shortcuts", "disabled"), &MenuButton::set_disable_shortcuts);
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "items", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL), "_set_items", "_get_items");
+ ADD_PROPERTY(PropertyInfo(Variant::BOOL, "switch_on_hover"), "set_switch_on_hover", "is_switch_on_hover");
ADD_SIGNAL(MethodInfo("about_to_show"));
}
@@ -100,6 +114,7 @@ void MenuButton::set_disable_shortcuts(bool p_disabled) {
MenuButton::MenuButton() {
+ switch_on_hover = false;
set_flat(true);
set_disable_shortcuts(false);
set_enabled_focus_mode(FOCUS_NONE);
diff --git a/scene/gui/menu_button.h b/scene/gui/menu_button.h
index 0636accfee..794840035e 100644
--- a/scene/gui/menu_button.h
+++ b/scene/gui/menu_button.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -41,6 +41,7 @@ class MenuButton : public Button {
GDCLASS(MenuButton, Button);
bool clicked;
+ bool switch_on_hover;
bool disable_shortcuts;
PopupMenu *popup;
@@ -57,6 +58,8 @@ public:
virtual void pressed();
PopupMenu *get_popup() const;
+ void set_switch_on_hover(bool p_enabled);
+ bool is_switch_on_hover();
void set_disable_shortcuts(bool p_disabled);
MenuButton();
diff --git a/scene/gui/nine_patch_rect.cpp b/scene/gui/nine_patch_rect.cpp
index 802dc0db4f..23e0ea876d 100644
--- a/scene/gui/nine_patch_rect.cpp
+++ b/scene/gui/nine_patch_rect.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/nine_patch_rect.h b/scene/gui/nine_patch_rect.h
index b4b4602a7d..ac17e52fc1 100644
--- a/scene/gui/nine_patch_rect.h
+++ b/scene/gui/nine_patch_rect.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/option_button.cpp b/scene/gui/option_button.cpp
index 6b847c6483..98f427cc07 100644
--- a/scene/gui/option_button.cpp
+++ b/scene/gui/option_button.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/option_button.h b/scene/gui/option_button.h
index d5f866d806..121b4c002d 100644
--- a/scene/gui/option_button.h
+++ b/scene/gui/option_button.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/panel.cpp b/scene/gui/panel.cpp
index d3b7b72ee1..c26bd09f50 100644
--- a/scene/gui/panel.cpp
+++ b/scene/gui/panel.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/panel.h b/scene/gui/panel.h
index db8b35372e..f8d15e4261 100644
--- a/scene/gui/panel.h
+++ b/scene/gui/panel.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/panel_container.cpp b/scene/gui/panel_container.cpp
index a778d62659..b1fced87fc 100644
--- a/scene/gui/panel_container.cpp
+++ b/scene/gui/panel_container.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/panel_container.h b/scene/gui/panel_container.h
index 267e2b921f..15661d3e35 100644
--- a/scene/gui/panel_container.h
+++ b/scene/gui/panel_container.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/popup.cpp b/scene/gui/popup.cpp
index bfbe62e1c7..2d2c54594a 100644
--- a/scene/gui/popup.cpp
+++ b/scene/gui/popup.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -52,9 +52,13 @@ void Popup::_notification(int p_what) {
//small helper to make editing of these easier in editor
#ifdef TOOLS_ENABLED
if (Engine::get_singleton()->is_editor_hint() && get_tree()->get_edited_scene_root() && get_tree()->get_edited_scene_root()->is_a_parent_of(this)) {
+ //edited on editor
set_as_toplevel(false);
- }
+ } else
#endif
+ if (is_visible()) {
+ hide();
+ }
}
}
diff --git a/scene/gui/popup.h b/scene/gui/popup.h
index 5b1ef7d6ca..7ccefe1d75 100644
--- a/scene/gui/popup.h
+++ b/scene/gui/popup.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp
index f621522102..ac94ac63ec 100644
--- a/scene/gui/popup_menu.cpp
+++ b/scene/gui/popup_menu.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -453,7 +453,6 @@ void PopupMenu::_notification(int p_what) {
Color icon_color(1, 1, 1, items[i].disabled ? 0.5 : 1);
- item_ofs.x += items[i].h_ofs;
if (!items[i].icon.is_null()) {
icon_size = items[i].icon->get_size();
@@ -470,6 +469,7 @@ void PopupMenu::_notification(int p_what) {
String text = items[i].shortcut.is_valid() ? String(tr(items[i].shortcut->get_name())) : items[i].xl_text;
+ item_ofs.x += items[i].h_ofs;
if (items[i].separator) {
int sep_h = separator->get_center_size().height + separator->get_minimum_size().height;
diff --git a/scene/gui/popup_menu.h b/scene/gui/popup_menu.h
index a06a17c9fe..767ff568fe 100644
--- a/scene/gui/popup_menu.h
+++ b/scene/gui/popup_menu.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/progress_bar.cpp b/scene/gui/progress_bar.cpp
index fc5d56237a..e7564bbf73 100644
--- a/scene/gui/progress_bar.cpp
+++ b/scene/gui/progress_bar.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/progress_bar.h b/scene/gui/progress_bar.h
index d091c983b1..6157183e0f 100644
--- a/scene/gui/progress_bar.h
+++ b/scene/gui/progress_bar.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/range.cpp b/scene/gui/range.cpp
index e862743934..c24e62c8cb 100644
--- a/scene/gui/range.cpp
+++ b/scene/gui/range.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/range.h b/scene/gui/range.h
index 58f15c8aa8..cf0add8c89 100644
--- a/scene/gui/range.h
+++ b/scene/gui/range.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/reference_rect.cpp b/scene/gui/reference_rect.cpp
index e96e5afb2a..553e133946 100644
--- a/scene/gui/reference_rect.cpp
+++ b/scene/gui/reference_rect.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/reference_rect.h b/scene/gui/reference_rect.h
index 9fad1a06b0..de3ccaeeca 100644
--- a/scene/gui/reference_rect.h
+++ b/scene/gui/reference_rect.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp
index 9f1687262f..2e466fd582 100644
--- a/scene/gui/rich_text_label.cpp
+++ b/scene/gui/rich_text_label.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -765,20 +765,19 @@ void RichTextLabel::_update_scroll() {
if (exceeds) {
scroll_visible = true;
- main->first_invalid_line = 0;
scroll_w = vscroll->get_combined_minimum_size().width;
vscroll->show();
vscroll->set_anchor_and_margin(MARGIN_LEFT, ANCHOR_END, -scroll_w);
- _validate_line_caches(main);
-
} else {
-
scroll_visible = false;
- vscroll->hide();
scroll_w = 0;
- _validate_line_caches(main);
+ vscroll->hide();
}
+
+ main->first_invalid_line = 0; //invalidate ALL
+ _validate_line_caches(main);
}
+ scroll_updated = true;
}
void RichTextLabel::_notification(int p_what) {
@@ -931,6 +930,7 @@ void RichTextLabel::_gui_input(Ref<InputEvent> p_event) {
if (true) {
if (b->is_pressed() && !b->is_doubleclick()) {
+ scroll_updated = false;
int line = 0;
Item *item = NULL;
@@ -939,12 +939,7 @@ void RichTextLabel::_gui_input(Ref<InputEvent> p_event) {
if (item) {
- Variant meta;
- if (!outside && _find_meta(item, &meta)) {
- //meta clicked
-
- emit_signal("meta_clicked", meta);
- } else if (selection.enabled) {
+ if (selection.enabled) {
selection.click = item;
selection.click_char = line;
@@ -993,6 +988,24 @@ void RichTextLabel::_gui_input(Ref<InputEvent> p_event) {
} else if (!b->is_pressed()) {
selection.click = NULL;
+
+ if (!b->is_doubleclick() && !scroll_updated) {
+ int line = 0;
+ Item *item = NULL;
+
+ bool outside;
+ _find_click(main, b->get_position(), &item, &line, &outside);
+
+ if (item) {
+
+ Variant meta;
+ if (!outside && _find_meta(item, &meta)) {
+ //meta clicked
+
+ emit_signal("meta_clicked", meta);
+ }
+ }
+ }
}
}
}
@@ -2326,6 +2339,7 @@ RichTextLabel::RichTextLabel() {
updating_scroll = false;
scroll_active = true;
scroll_w = 0;
+ scroll_updated = false;
vscroll = memnew(VScrollBar);
add_child(vscroll);
diff --git a/scene/gui/rich_text_label.h b/scene/gui/rich_text_label.h
index c2e5712b9d..bec2c5ac02 100644
--- a/scene/gui/rich_text_label.h
+++ b/scene/gui/rich_text_label.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -225,6 +225,7 @@ private:
bool scroll_following;
bool scroll_active;
int scroll_w;
+ bool scroll_updated;
bool updating_scroll;
int current_idx;
int visible_line_count;
diff --git a/scene/gui/scroll_bar.cpp b/scene/gui/scroll_bar.cpp
index 07380f45cc..2938654ed9 100644
--- a/scene/gui/scroll_bar.cpp
+++ b/scene/gui/scroll_bar.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -330,6 +330,8 @@ void ScrollBar::_notification(int p_what) {
if (Math::abs(vel) >= dist) {
set_value(target_scroll);
+ scrolling = false;
+ set_physics_process_internal(false);
} else {
set_value(get_value() + vel);
}
diff --git a/scene/gui/scroll_bar.h b/scene/gui/scroll_bar.h
index cde4120cdb..5ceabfc06b 100644
--- a/scene/gui/scroll_bar.h
+++ b/scene/gui/scroll_bar.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/scroll_container.cpp b/scene/gui/scroll_container.cpp
index 9c22a049b8..28292309b9 100644
--- a/scene/gui/scroll_container.cpp
+++ b/scene/gui/scroll_container.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -271,7 +271,6 @@ void ScrollContainer::_notification(int p_what) {
}
if (!scroll_v || (!v_scroll->is_visible_in_tree() && c->get_v_size_flags() & SIZE_EXPAND)) {
r.position.y = 0;
- r.size.height = size.height;
if (c->get_v_size_flags() & SIZE_EXPAND)
r.size.height = MAX(size.height, minsize.height);
else
diff --git a/scene/gui/scroll_container.h b/scene/gui/scroll_container.h
index abef80294a..2ab169f4d0 100644
--- a/scene/gui/scroll_container.h
+++ b/scene/gui/scroll_container.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/separator.cpp b/scene/gui/separator.cpp
index cd0b06da81..a717420b9b 100644
--- a/scene/gui/separator.cpp
+++ b/scene/gui/separator.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/separator.h b/scene/gui/separator.h
index 7949c7ca9b..54ad9b5bb5 100644
--- a/scene/gui/separator.h
+++ b/scene/gui/separator.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/shortcut.cpp b/scene/gui/shortcut.cpp
index 6fcf96f611..400fdca082 100644
--- a/scene/gui/shortcut.cpp
+++ b/scene/gui/shortcut.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/shortcut.h b/scene/gui/shortcut.h
index 7613a24e43..df0623ed50 100644
--- a/scene/gui/shortcut.h
+++ b/scene/gui/shortcut.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/slider.cpp b/scene/gui/slider.cpp
index 147c0518ec..eb04b85931 100644
--- a/scene/gui/slider.cpp
+++ b/scene/gui/slider.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/slider.h b/scene/gui/slider.h
index 4d02348159..d0ab7baecf 100644
--- a/scene/gui/slider.h
+++ b/scene/gui/slider.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/spin_box.cpp b/scene/gui/spin_box.cpp
index ace22dddff..d21143739c 100644
--- a/scene/gui/spin_box.cpp
+++ b/scene/gui/spin_box.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -110,6 +110,9 @@ void SpinBox::_gui_input(const Ref<InputEvent> &p_event) {
range_click_timer->start();
line_edit->grab_focus();
+
+ drag.allowed = true;
+ drag.capture_pos = mb->get_position();
} break;
case BUTTON_RIGHT: {
@@ -133,14 +136,7 @@ void SpinBox::_gui_input(const Ref<InputEvent> &p_event) {
}
}
- if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == 1) {
-
- //set_default_cursor_shape(CURSOR_VSIZE);
- Vector2 cpos = Vector2(mb->get_position().x, mb->get_position().y);
- drag.mouse_pos = cpos;
- }
-
- if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == 1) {
+ if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
//set_default_cursor_shape(CURSOR_ARROW);
range_click_timer->stop();
@@ -150,32 +146,24 @@ void SpinBox::_gui_input(const Ref<InputEvent> &p_event) {
Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE);
warp_mouse(drag.capture_pos);
}
+ drag.allowed = false;
}
Ref<InputEventMouseMotion> mm = p_event;
- if (mm.is_valid() && mm->get_button_mask() & 1) {
-
- Vector2 cpos = mm->get_position();
+ if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_LEFT) {
if (drag.enabled) {
- float diff_y = drag.mouse_pos.y - cpos.y;
- diff_y = Math::pow(ABS(diff_y), 1.8f) * SGN(diff_y);
- diff_y *= 0.1;
-
- drag.mouse_pos = cpos;
- drag.base_val = CLAMP(drag.base_val + get_step() * diff_y, get_min(), get_max());
-
- set_value(drag.base_val);
-
- } else if (drag.mouse_pos.distance_to(cpos) > 2) {
+ drag.diff_y += mm->get_relative().y;
+ float diff_y = -0.01 * Math::pow(ABS(drag.diff_y), 1.8f) * SGN(drag.diff_y);
+ set_value(CLAMP(drag.base_val + get_step() * diff_y, get_min(), get_max()));
+ } else if (drag.allowed && drag.capture_pos.distance_to(mm->get_position()) > 2) {
Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_CAPTURED);
drag.enabled = true;
drag.base_val = get_value();
- drag.mouse_pos = cpos;
- drag.capture_pos = cpos;
+ drag.diff_y = 0;
}
}
}
diff --git a/scene/gui/spin_box.h b/scene/gui/spin_box.h
index f1ee26d9f3..49dc6d950c 100644
--- a/scene/gui/spin_box.h
+++ b/scene/gui/spin_box.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -54,10 +54,10 @@ class SpinBox : public Range {
struct Drag {
float base_val;
+ bool allowed;
bool enabled;
- Vector2 from;
- Vector2 mouse_pos;
Vector2 capture_pos;
+ float diff_y;
} drag;
void _line_edit_focus_exit();
diff --git a/scene/gui/split_container.cpp b/scene/gui/split_container.cpp
index c38c411333..e4cb2a06fc 100644
--- a/scene/gui/split_container.cpp
+++ b/scene/gui/split_container.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -62,39 +62,28 @@ void SplitContainer::_resort() {
// If we have only one element
if (!first || !second) {
if (first) {
- fit_child_in_rect(_getch(0), Rect2(Point2(), get_size()));
+ fit_child_in_rect(first, Rect2(Point2(), get_size()));
} else if (second) {
- fit_child_in_rect(_getch(1), Rect2(Point2(), get_size()));
+ fit_child_in_rect(second, Rect2(Point2(), get_size()));
}
return;
}
// Determine expanded children
- bool first_expanded = false;
- bool second_expanded = false;
- if (vertical) {
- first_expanded = first->get_v_size_flags() & SIZE_EXPAND;
- second_expanded = second->get_v_size_flags() & SIZE_EXPAND;
- } else {
- first_expanded = first->get_h_size_flags() & SIZE_EXPAND;
- second_expanded = second->get_h_size_flags() & SIZE_EXPAND;
- }
+ bool first_expanded = (vertical ? first->get_v_size_flags() : first->get_h_size_flags()) & SIZE_EXPAND;
+ bool second_expanded = (vertical ? second->get_v_size_flags() : second->get_h_size_flags()) & SIZE_EXPAND;
// Determine the separation between items
Ref<Texture> g = get_icon("grabber");
int sep = get_constant("separation");
- if (dragger_visibility == DRAGGER_HIDDEN_COLLAPSED) {
- sep = 0;
- } else {
- sep = MAX(sep, vertical ? g->get_height() : g->get_width());
- }
+ sep = (dragger_visibility != DRAGGER_HIDDEN_COLLAPSED) ? MAX(sep, vertical ? g->get_height() : g->get_width()) : 0;
// Compute the minimum size
Size2 ms_first = first->get_combined_minimum_size();
Size2 ms_second = second->get_combined_minimum_size();
+ // Compute the separator position without the split offset
float ratio = first->get_stretch_ratio() / (first->get_stretch_ratio() + second->get_stretch_ratio());
-
int no_offset_middle_sep = 0;
if (first_expanded && second_expanded) {
no_offset_middle_sep = get_size()[axis] * ratio - sep / 2;
@@ -104,12 +93,16 @@ void SplitContainer::_resort() {
no_offset_middle_sep = ms_first[axis];
}
+ // Compute the final middle separation
middle_sep = no_offset_middle_sep;
- middle_sep += (collapsed) ? 0 : split_offset;
- middle_sep = MIN(middle_sep, get_size()[axis] - ms_second[axis] - sep);
- middle_sep = MAX(middle_sep, ms_first[axis]);
if (!collapsed) {
- split_offset = middle_sep - no_offset_middle_sep;
+ int clamped_split_offset = CLAMP(split_offset, ms_first[axis] - no_offset_middle_sep, (get_size()[axis] - ms_second[axis] - sep) - no_offset_middle_sep);
+ middle_sep += clamped_split_offset;
+ if (should_clamp_split_offset) {
+ split_offset = clamped_split_offset;
+ _change_notify("split_offset");
+ should_clamp_split_offset = false;
+ }
}
if (vertical) {
@@ -123,7 +116,6 @@ void SplitContainer::_resort() {
}
update();
- _change_notify("split_offset");
}
Size2 SplitContainer::get_minimum_size() const {
@@ -131,8 +123,8 @@ Size2 SplitContainer::get_minimum_size() const {
/* Calculate MINIMUM SIZE */
Size2i minimum;
- int sep = get_constant("separation");
Ref<Texture> g = get_icon("grabber");
+ int sep = get_constant("separation");
sep = (dragger_visibility != DRAGGER_HIDDEN_COLLAPSED) ? MAX(sep, vertical ? g->get_height() : g->get_width()) : 0;
for (int i = 0; i < 2; i++) {
@@ -248,6 +240,7 @@ void SplitContainer::_gui_input(const Ref<InputEvent> &p_event) {
if (mm.is_valid() && dragging) {
split_offset = drag_ofs + ((vertical ? mm->get_position().y : mm->get_position().x) - drag_from);
+ should_clamp_split_offset = true;
queue_sort();
emit_signal("dragged", get_split_offset());
}
@@ -282,6 +275,7 @@ void SplitContainer::set_split_offset(int p_offset) {
return;
split_offset = p_offset;
+
queue_sort();
}
@@ -290,6 +284,12 @@ int SplitContainer::get_split_offset() const {
return split_offset;
}
+void SplitContainer::clamp_split_offset() {
+ should_clamp_split_offset = true;
+
+ queue_sort();
+}
+
void SplitContainer::set_collapsed(bool p_collapsed) {
if (collapsed == p_collapsed)
@@ -319,8 +319,10 @@ bool SplitContainer::is_collapsed() const {
void SplitContainer::_bind_methods() {
ClassDB::bind_method(D_METHOD("_gui_input"), &SplitContainer::_gui_input);
+
ClassDB::bind_method(D_METHOD("set_split_offset", "offset"), &SplitContainer::set_split_offset);
ClassDB::bind_method(D_METHOD("get_split_offset"), &SplitContainer::get_split_offset);
+ ClassDB::bind_method(D_METHOD("clamp_split_offset"), &SplitContainer::clamp_split_offset);
ClassDB::bind_method(D_METHOD("set_collapsed", "collapsed"), &SplitContainer::set_collapsed);
ClassDB::bind_method(D_METHOD("is_collapsed"), &SplitContainer::is_collapsed);
@@ -343,6 +345,7 @@ SplitContainer::SplitContainer(bool p_vertical) {
mouse_inside = false;
split_offset = 0;
+ should_clamp_split_offset = false;
middle_sep = 0;
vertical = p_vertical;
dragging = false;
diff --git a/scene/gui/split_container.h b/scene/gui/split_container.h
index 321f7fd3b7..3c1ca09a9f 100644
--- a/scene/gui/split_container.h
+++ b/scene/gui/split_container.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -45,9 +45,10 @@ public:
};
private:
- bool vertical;
+ bool should_clamp_split_offset;
int split_offset;
int middle_sep;
+ bool vertical;
bool dragging;
int drag_from;
int drag_ofs;
@@ -67,6 +68,7 @@ protected:
public:
void set_split_offset(int p_offset);
int get_split_offset() const;
+ void clamp_split_offset();
void set_collapsed(bool p_collapsed);
bool is_collapsed() const;
diff --git a/scene/gui/tab_container.cpp b/scene/gui/tab_container.cpp
index 4c354768fe..b4fe6b0255 100644
--- a/scene/gui/tab_container.cpp
+++ b/scene/gui/tab_container.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/tab_container.h b/scene/gui/tab_container.h
index 8a3c9d2bb2..c110f041d0 100644
--- a/scene/gui/tab_container.h
+++ b/scene/gui/tab_container.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/tabs.cpp b/scene/gui/tabs.cpp
index cf3113ca8c..ac643c1320 100644
--- a/scene/gui/tabs.cpp
+++ b/scene/gui/tabs.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -53,7 +53,7 @@ Size2 Tabs::get_minimum_size() const {
ms.width += get_constant("hseparation");
}
- ms.width += font->get_string_size(tabs[i].text).width;
+ ms.width += Math::ceil(font->get_string_size(tabs[i].text).width);
if (tabs[i].disabled)
ms.width += tab_disabled->get_minimum_size().width;
@@ -547,7 +547,7 @@ void Tabs::_update_cache() {
for (int i = 0; i < tabs.size(); i++) {
tabs.write[i].ofs_cache = mw;
tabs.write[i].size_cache = get_tab_width(i);
- tabs.write[i].size_text = font->get_string_size(tabs[i].text).width;
+ tabs.write[i].size_text = Math::ceil(font->get_string_size(tabs[i].text).width);
mw += tabs[i].size_cache;
if (tabs[i].size_cache <= min_width || i == current) {
size_fixed += tabs[i].size_cache;
@@ -803,7 +803,7 @@ int Tabs::get_tab_width(int p_idx) const {
x += get_constant("hseparation");
}
- x += font->get_string_size(tabs[p_idx].text).width;
+ x += Math::ceil(font->get_string_size(tabs[p_idx].text).width);
if (tabs[p_idx].disabled)
x += tab_disabled->get_minimum_size().width;
diff --git a/scene/gui/tabs.h b/scene/gui/tabs.h
index a98744b804..7c54f1acf2 100644
--- a/scene/gui/tabs.h
+++ b/scene/gui/tabs.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp
index 7bfcd0843c..09fbb39866 100644
--- a/scene/gui/text_edit.cpp
+++ b/scene/gui/text_edit.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -549,16 +549,17 @@ void TextEdit::_notification(int p_what) {
MessageQueue::get_singleton()->push_call(this, "_cursor_changed_emit");
if (text_changed_dirty)
MessageQueue::get_singleton()->push_call(this, "_text_changed_emit");
- update_wrap_at();
+ _update_wrap_at();
} break;
case NOTIFICATION_RESIZED: {
_update_scrollbars();
- update_wrap_at();
+ call_deferred("_update_wrap_at");
} break;
case NOTIFICATION_THEME_CHANGED: {
_update_caches();
+ _update_wrap_at();
} break;
case MainLoop::NOTIFICATION_WM_FOCUS_IN: {
window_has_focus = true;
@@ -802,6 +803,7 @@ void TextEdit::_notification(int p_what) {
}
Point2 cursor_pos;
+ int cursor_insert_offset_y = 0;
// get the highlighted words
String highlighted_text = get_selection_text();
@@ -846,9 +848,9 @@ void TextEdit::_notification(int p_what) {
bool underlined = false;
+ Vector<String> wrap_rows = get_wrap_rows_text(line);
int line_wrap_amount = times_line_wraps(line);
int last_wrap_column = 0;
- Vector<String> wrap_rows = get_wrap_rows_text(line);
for (int line_wrap_index = 0; line_wrap_index < line_wrap_amount + 1; line_wrap_index++) {
if (line_wrap_index != 0) {
@@ -1108,9 +1110,11 @@ void TextEdit::_notification(int p_what) {
if (cursor.column == last_wrap_column + j && cursor.line == line && cursor_wrap_index == line_wrap_index) {
cursor_pos = Point2i(char_ofs + char_margin + ofs_x, ofs_y);
+ cursor_pos.y += (get_row_height() - cache.font->get_height()) / 2;
if (insert_mode) {
- cursor_pos.y += (get_row_height() - 3);
+ cursor_insert_offset_y = (cache.font->get_height() - 3);
+ cursor_pos.y += cursor_insert_offset_y;
}
int caret_w = (str[j] == '\t') ? cache.font->get_char_size(' ').width : char_w;
@@ -1155,7 +1159,8 @@ void TextEdit::_notification(int p_what) {
#else
caret_w = (block_caret) ? caret_w : 2;
#endif
- VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(cursor_pos, Size2i(caret_w, get_row_height())), cache.caret_color);
+
+ VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(cursor_pos, Size2i(caret_w, cache.font->get_height())), cache.caret_color);
}
}
}
@@ -1198,9 +1203,11 @@ void TextEdit::_notification(int p_what) {
if (cursor.column == last_wrap_column + str.length() && cursor.line == line && cursor_wrap_index == line_wrap_index && (char_ofs + char_margin) >= xmargin_beg) {
cursor_pos = Point2i(char_ofs + char_margin + ofs_x, ofs_y);
+ cursor_pos.y += (get_row_height() - cache.font->get_height()) / 2;
if (insert_mode) {
- cursor_pos.y += (get_row_height() - 3);
+ cursor_insert_offset_y = cache.font->get_height() - 3;
+ cursor_pos.y += cursor_insert_offset_y;
}
if (ime_text.length() > 0) {
int ofs = 0;
@@ -1245,7 +1252,8 @@ void TextEdit::_notification(int p_what) {
#else
int caret_w = (block_caret) ? char_w : 2;
#endif
- VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(cursor_pos, Size2i(caret_w, get_row_height())), cache.caret_color);
+
+ VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(cursor_pos, Size2i(caret_w, cache.font->get_height())), cache.caret_color);
}
}
}
@@ -1287,9 +1295,9 @@ void TextEdit::_notification(int p_what) {
int th = h + csb->get_minimum_size().y;
if (cursor_pos.y + get_row_height() + th > get_size().height) {
- completion_rect.position.y = cursor_pos.y - th;
+ completion_rect.position.y = cursor_pos.y - th - (cache.line_spacing / 2.0f) - cursor_insert_offset_y;
} else {
- completion_rect.position.y = cursor_pos.y + get_row_height() + csb->get_offset().y;
+ completion_rect.position.y = cursor_pos.y + cache.font->get_height() + (cache.line_spacing / 2.0f) + csb->get_offset().y - cursor_insert_offset_y;
completion_below = true;
}
@@ -1323,7 +1331,8 @@ void TextEdit::_notification(int p_what) {
text_color = color_regions[j].color;
}
}
- draw_string(cache.font, Point2(completion_rect.position.x, completion_rect.position.y + i * get_row_height() + cache.font->get_ascent()), completion_options[l], text_color, completion_rect.size.width);
+ int yofs = (get_row_height() - cache.font->get_height()) / 2;
+ draw_string(cache.font, Point2(completion_rect.position.x, completion_rect.position.y + i * get_row_height() + cache.font->get_ascent() + yofs), completion_options[l], text_color, completion_rect.size.width);
}
if (scrollw) {
@@ -1412,7 +1421,6 @@ void TextEdit::_notification(int p_what) {
if (has_focus()) {
OS::get_singleton()->set_ime_active(true);
OS::get_singleton()->set_ime_position(get_global_position() + cursor_pos + Point2(0, get_row_height()));
- OS::get_singleton()->set_ime_intermediate_text_callback(_ime_text_callback, this);
}
} break;
@@ -1425,7 +1433,6 @@ void TextEdit::_notification(int p_what) {
OS::get_singleton()->set_ime_active(true);
Point2 cursor_pos = Point2(cursor_get_column(), cursor_get_line()) * get_row_height();
OS::get_singleton()->set_ime_position(get_global_position() + cursor_pos);
- OS::get_singleton()->set_ime_intermediate_text_callback(_ime_text_callback, this);
if (OS::get_singleton()->has_virtual_keyboard())
OS::get_singleton()->show_virtual_keyboard(get_text(), get_global_rect());
@@ -1433,7 +1440,6 @@ void TextEdit::_notification(int p_what) {
case NOTIFICATION_FOCUS_EXIT: {
OS::get_singleton()->set_ime_position(Point2());
- OS::get_singleton()->set_ime_intermediate_text_callback(NULL, NULL);
OS::get_singleton()->set_ime_active(false);
ime_text = "";
ime_selection = Point2();
@@ -1441,14 +1447,15 @@ void TextEdit::_notification(int p_what) {
if (OS::get_singleton()->has_virtual_keyboard())
OS::get_singleton()->hide_virtual_keyboard();
} break;
- }
-}
+ case MainLoop::NOTIFICATION_OS_IME_UPDATE: {
-void TextEdit::_ime_text_callback(void *p_self, String p_text, Point2 p_selection) {
- TextEdit *self = (TextEdit *)p_self;
- self->ime_text = p_text;
- self->ime_selection = p_selection;
- self->update();
+ if (has_focus()) {
+ ime_text = OS::get_singleton()->get_ime_text();
+ ime_selection = OS::get_singleton()->get_ime_selection();
+ update();
+ }
+ } break;
+ }
}
void TextEdit::_consume_pair_symbol(CharType ch) {
@@ -3254,7 +3261,6 @@ void TextEdit::_scroll_down(real_t p_delta) {
int max_v_scroll = round(v_scroll->get_max() - v_scroll->get_page());
if (target_v_scroll > max_v_scroll) {
target_v_scroll = max_v_scroll;
- v_scroll->set_value(target_v_scroll);
}
if (Math::abs(target_v_scroll - v_scroll->get_value()) < 1.0) {
v_scroll->set_value(target_v_scroll);
@@ -3639,7 +3645,7 @@ int TextEdit::get_total_visible_rows() const {
return total_rows;
}
-void TextEdit::update_wrap_at() {
+void TextEdit::_update_wrap_at() {
wrap_at = get_size().width - cache.style_normal->get_minimum_size().width - cache.line_number_w - cache.breakpoint_gutter_width - cache.fold_gutter_width - wrap_right_offset;
update_cursor_wrap_offset();
@@ -3805,7 +3811,6 @@ Vector<String> TextEdit::get_wrap_rows_text(int p_line) const {
if (indent_ofs + word_px > wrap_at) {
// not enough space; add it anyway
wrap_substring += word_str;
- px += word_px;
word_str = "";
word_px = 0;
}
@@ -3820,6 +3825,10 @@ Vector<String> TextEdit::get_wrap_rows_text(int p_line) const {
// line ends before hit wrap_at; add this word to the substring
wrap_substring += word_str;
lines.push_back(wrap_substring);
+
+ // update cache
+ text.set_line_wrap_amount(p_line, lines.size() - 1);
+
return lines;
}
@@ -4264,6 +4273,7 @@ void TextEdit::_clear() {
cursor.line_ofs = 0;
cursor.wrap_ofs = 0;
cursor.last_fit_x = 0;
+ selection.active = false;
}
void TextEdit::clear() {
@@ -5757,6 +5767,7 @@ void TextEdit::_update_completion_candidates() {
completion_base = s;
Vector<float> sim_cache;
bool single_quote = s.begins_with("'");
+ Vector<String> completion_options_casei;
for (int i = 0; i < completion_strings.size(); i++) {
if (single_quote && completion_strings[i].is_quoted()) {
@@ -5765,9 +5776,13 @@ void TextEdit::_update_completion_candidates() {
if (completion_strings[i].begins_with(s)) {
completion_options.push_back(completion_strings[i]);
+ } else if (completion_strings[i].to_lower().begins_with(s.to_lower())) {
+ completion_options_casei.push_back(completion_strings[i]);
}
}
+ completion_options.append_array(completion_options_casei);
+
if (completion_options.size() == 0) {
for (int i = 0; i < completion_strings.size(); i++) {
if (s.is_subsequence_of(completion_strings[i])) {
@@ -6039,7 +6054,10 @@ void TextEdit::menu_option(int p_option) {
case MENU_UNDO: {
undo();
} break;
- };
+ case MENU_REDO: {
+ redo();
+ }
+ }
}
void TextEdit::set_select_identifiers_on_hover(bool p_enable) {
@@ -6074,6 +6092,7 @@ void TextEdit::_bind_methods() {
ClassDB::bind_method(D_METHOD("_click_selection_held"), &TextEdit::_click_selection_held);
ClassDB::bind_method(D_METHOD("_toggle_draw_caret"), &TextEdit::_toggle_draw_caret);
ClassDB::bind_method(D_METHOD("_v_scroll_input"), &TextEdit::_v_scroll_input);
+ ClassDB::bind_method(D_METHOD("_update_wrap_at"), &TextEdit::_update_wrap_at);
BIND_ENUM_CONSTANT(SEARCH_MATCH_CASE);
BIND_ENUM_CONSTANT(SEARCH_WHOLE_WORDS);
@@ -6215,6 +6234,7 @@ void TextEdit::_bind_methods() {
BIND_ENUM_CONSTANT(MENU_CLEAR);
BIND_ENUM_CONSTANT(MENU_SELECT_ALL);
BIND_ENUM_CONSTANT(MENU_UNDO);
+ BIND_ENUM_CONSTANT(MENU_REDO);
BIND_ENUM_CONSTANT(MENU_MAX);
GLOBAL_DEF("gui/timers/text_edit_idle_detect_sec", 3);
@@ -6343,6 +6363,7 @@ TextEdit::TextEdit() {
menu->add_item(RTR("Clear"), MENU_CLEAR);
menu->add_separator();
menu->add_item(RTR("Undo"), MENU_UNDO, KEY_MASK_CMD | KEY_Z);
+ menu->add_item(RTR("Redo"), MENU_REDO, KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_Z);
menu->connect("id_pressed", this, "menu_option");
}
diff --git a/scene/gui/text_edit.h b/scene/gui/text_edit.h
index 8a508a8738..95f1fbbee5 100644
--- a/scene/gui/text_edit.h
+++ b/scene/gui/text_edit.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -336,7 +336,7 @@ private:
int get_total_visible_rows() const;
void update_cursor_wrap_offset();
- void update_wrap_at();
+ void _update_wrap_at();
bool line_wraps(int line) const;
int times_line_wraps(int line) const;
Vector<String> get_wrap_rows_text(int p_line) const;
@@ -380,8 +380,6 @@ private:
void _scroll_lines_up();
void _scroll_lines_down();
- static void _ime_text_callback(void *p_self, String p_text, Point2 p_selection);
-
//void mouse_motion(const Point& p_pos, const Point& p_rel, int p_button_mask);
Size2 get_minimum_size() const;
@@ -444,6 +442,7 @@ public:
MENU_CLEAR,
MENU_SELECT_ALL,
MENU_UNDO,
+ MENU_REDO,
MENU_MAX
};
diff --git a/scene/gui/texture_button.cpp b/scene/gui/texture_button.cpp
index 4a8d87902b..95aab95253 100644
--- a/scene/gui/texture_button.cpp
+++ b/scene/gui/texture_button.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/texture_button.h b/scene/gui/texture_button.h
index d42df390e8..4dc0de5358 100644
--- a/scene/gui/texture_button.h
+++ b/scene/gui/texture_button.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/texture_progress.cpp b/scene/gui/texture_progress.cpp
index a37659e521..778d86d546 100644
--- a/scene/gui/texture_progress.cpp
+++ b/scene/gui/texture_progress.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/texture_progress.h b/scene/gui/texture_progress.h
index a11e55234a..008bf5b038 100644
--- a/scene/gui/texture_progress.h
+++ b/scene/gui/texture_progress.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/texture_rect.cpp b/scene/gui/texture_rect.cpp
index 4371baf08c..caae48336b 100644
--- a/scene/gui/texture_rect.cpp
+++ b/scene/gui/texture_rect.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/texture_rect.h b/scene/gui/texture_rect.h
index b684ac816c..ddd101573b 100644
--- a/scene/gui/texture_rect.h
+++ b/scene/gui/texture_rect.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/tool_button.cpp b/scene/gui/tool_button.cpp
index 4220a6b5ce..a81cc34efa 100644
--- a/scene/gui/tool_button.cpp
+++ b/scene/gui/tool_button.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/tool_button.h b/scene/gui/tool_button.h
index b8be18e560..8f729cd4df 100644
--- a/scene/gui/tool_button.h
+++ b/scene/gui/tool_button.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp
index c083e727d1..514be00227 100644
--- a/scene/gui/tree.cpp
+++ b/scene/gui/tree.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -1158,10 +1158,9 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2
r.position.x += icon_width;
r.size.x -= icon_width;
}
- //r.grow(cache.selected->get_margin(MARGIN_LEFT));
+ p_item->set_meta("__focus_rect", Rect2(r.position, r.size));
if (has_focus()) {
cache.selected_focus->draw(ci, r);
- p_item->set_meta("__focus_rect", Rect2(r.position, r.size));
} else {
cache.selected->draw(ci, r);
}
@@ -1419,7 +1418,7 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2
while (c) {
- if (cache.draw_relationship_lines == 1 && (c->get_parent() != root || !hide_root)) {
+ if (cache.draw_relationship_lines > 0 && (!hide_root || c->parent != root)) {
int root_ofs = children_pos.x + ((p_item->disable_folding || hide_folding) ? cache.hseparation : cache.item_margin);
int parent_ofs = p_pos.x + ((p_item->disable_folding || hide_folding) ? cache.hseparation : cache.item_margin);
Point2i root_pos = Point2i(root_ofs, children_pos.y + label_h / 2) - cache.offset + p_draw_ofs;
@@ -1602,6 +1601,7 @@ void Tree::_range_click_timeout() {
mb.instance();
;
+ propagate_mouse_activated = false; //done from outside, so signal handler cant clear the tree in the middle of emit(which is a common case)
blocked++;
propagate_mouse_event(pos + cache.offset, 0, 0, false, root, BUTTON_LEFT, mb);
blocked--;
@@ -1615,6 +1615,11 @@ void Tree::_range_click_timeout() {
if (!click_handled)
range_click_timer->stop();
+ if (propagate_mouse_activated) {
+ emit_signal("item_activated");
+ propagate_mouse_activated = false;
+ }
+
} else {
range_click_timer->stop();
}
@@ -1723,7 +1728,8 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool
if (p_doubleclick && (!c.editable || c.mode == TreeItem::CELL_MODE_CUSTOM || c.mode == TreeItem::CELL_MODE_ICON /*|| c.mode==TreeItem::CELL_MODE_CHECK*/)) { //it's confusing for check
- emit_signal("item_activated");
+ propagate_mouse_activated = true;
+
incr_search.clear();
return -1;
}
@@ -2591,6 +2597,7 @@ void Tree::_gui_input(Ref<InputEvent> p_event) {
click_handled = false;
pressing_for_editor = false;
+ propagate_mouse_activated = false;
blocked++;
propagate_mouse_event(pos + cache.offset, 0, 0, b->is_doubleclick(), root, b->get_button_index(), b);
@@ -2628,6 +2635,11 @@ void Tree::_gui_input(Ref<InputEvent> p_event) {
}
}
+ if (propagate_mouse_activated) {
+ emit_signal("item_activated");
+ propagate_mouse_activated = false;
+ }
+
} break;
case BUTTON_WHEEL_UP: {
@@ -2701,6 +2713,7 @@ bool Tree::edit_selected() {
Vector2 ofs(0, (text_editor->get_size().height - rect.size.height) / 2);
Point2i textedpos = get_global_position() + rect.position - ofs;
+ cache.text_editor_position = textedpos;
text_editor->set_position(textedpos);
text_editor->set_size(rect.size);
text_editor->clear();
@@ -2956,6 +2969,21 @@ void Tree::_notification(int p_what) {
if (p_what == NOTIFICATION_THEME_CHANGED) {
update_cache();
}
+
+ if (p_what == NOTIFICATION_RESIZED || p_what == NOTIFICATION_TRANSFORM_CHANGED) {
+
+ if (popup_edited_item != NULL) {
+ Rect2 rect = popup_edited_item->get_meta("__focus_rect");
+ Vector2 ofs(0, (text_editor->get_size().height - rect.size.height) / 2);
+ Point2i textedpos = get_global_position() + rect.position - ofs;
+
+ if (cache.text_editor_position != textedpos) {
+ cache.text_editor_position = textedpos;
+ text_editor->set_position(textedpos);
+ value_editor->set_position(textedpos + Point2i(0, text_editor->get_size().height));
+ }
+ }
+ }
}
Size2 Tree::get_minimum_size() const {
@@ -3884,6 +3912,7 @@ Tree::Tree() {
value_editor->set_as_toplevel(true);
text_editor->set_as_toplevel(true);
+ set_notify_transform(true);
updating_value_editor = false;
pressed_button = -1;
@@ -3928,6 +3957,7 @@ Tree::Tree() {
cache.hover_cell = -1;
allow_reselect = false;
+ propagate_mouse_activated = false;
}
Tree::~Tree() {
diff --git a/scene/gui/tree.h b/scene/gui/tree.h
index 886ce66e2c..26d64baafb 100644
--- a/scene/gui/tree.h
+++ b/scene/gui/tree.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -329,6 +329,8 @@ private:
bool range_drag_enabled;
Vector2 range_drag_capture_pos;
+ bool propagate_mouse_activated;
+
//TreeItem *cursor_item;
//int cursor_column;
@@ -457,6 +459,8 @@ private:
TreeItem *hover_item;
int hover_cell;
+ Point2i text_editor_position;
+
} cache;
int _get_title_button_height() const;
diff --git a/scene/gui/video_player.cpp b/scene/gui/video_player.cpp
index 812ca0042b..5768f58977 100644
--- a/scene/gui/video_player.cpp
+++ b/scene/gui/video_player.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/video_player.h b/scene/gui/video_player.h
index 5c379b5620..62fb7838b6 100644
--- a/scene/gui/video_player.h
+++ b/scene/gui/video_player.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/viewport_container.cpp b/scene/gui/viewport_container.cpp
index 8e0d1cdd38..3f7a110c1b 100644
--- a/scene/gui/viewport_container.cpp
+++ b/scene/gui/viewport_container.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/gui/viewport_container.h b/scene/gui/viewport_container.h
index 60aec25959..b4ecc583ba 100644
--- a/scene/gui/viewport_container.h
+++ b/scene/gui/viewport_container.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/main/canvas_layer.cpp b/scene/main/canvas_layer.cpp
index 89bc8c1226..2b1991ebb0 100644
--- a/scene/main/canvas_layer.cpp
+++ b/scene/main/canvas_layer.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/main/canvas_layer.h b/scene/main/canvas_layer.h
index aae23fbb12..5d67245102 100644
--- a/scene/main/canvas_layer.h
+++ b/scene/main/canvas_layer.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/main/http_request.cpp b/scene/main/http_request.cpp
index a9b7fba9c7..8b68b3215c 100644
--- a/scene/main/http_request.cpp
+++ b/scene/main/http_request.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -220,13 +220,12 @@ bool HTTPRequest::_handle_response(bool *ret_value) {
Error err;
if (new_request.begins_with("http")) {
// New url, request all again
- err = _parse_url(new_request);
+ _parse_url(new_request);
} else {
request_string = new_request;
}
err = _request();
-
if (err == OK) {
request_sent = false;
got_response = false;
diff --git a/scene/main/http_request.h b/scene/main/http_request.h
index de09d2afda..baabda4010 100644
--- a/scene/main/http_request.h
+++ b/scene/main/http_request.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/main/instance_placeholder.cpp b/scene/main/instance_placeholder.cpp
index 0ee5648de2..71addd6fea 100644
--- a/scene/main/instance_placeholder.cpp
+++ b/scene/main/instance_placeholder.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/main/instance_placeholder.h b/scene/main/instance_placeholder.h
index 2158257c93..3d0e879b2b 100644
--- a/scene/main/instance_placeholder.h
+++ b/scene/main/instance_placeholder.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/main/node.cpp b/scene/main/node.cpp
index ae2ab2af80..6aa3891035 100644
--- a/scene/main/node.cpp
+++ b/scene/main/node.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -959,7 +959,9 @@ void Node::set_human_readable_collision_renaming(bool p_enabled) {
#ifdef TOOLS_ENABLED
String Node::validate_child_name(Node *p_child) {
- return _generate_serial_child_name(p_child);
+ StringName name = p_child->data.name;
+ _generate_serial_child_name(p_child, name);
+ return name;
}
#endif
@@ -972,7 +974,9 @@ void Node::_validate_child_name(Node *p_child, bool p_force_human_readable) {
//this approach to autoset node names is human readable but very slow
//it's turned on while running in the editor
- p_child->data.name = _generate_serial_child_name(p_child);
+ StringName name = p_child->data.name;
+ _generate_serial_child_name(p_child, name);
+ p_child->data.name = name;
} else {
@@ -1008,74 +1012,120 @@ void Node::_validate_child_name(Node *p_child, bool p_force_human_readable) {
}
}
-String Node::_generate_serial_child_name(Node *p_child) {
+// Return s + 1 as if it were an integer
+String increase_numeric_string(const String &s) {
- String name = p_child->data.name;
+ String res = s;
+ bool carry = res.length() > 0;
- if (name == "") {
+ for (int i = res.length() - 1; i >= 0; i--) {
+ if (!carry) {
+ break;
+ }
+ CharType n = s[i];
+ if (n == '9') { // keep carry as true: 9 + 1
+ res[i] = '0';
+ } else {
+ res[i] = s[i] + 1;
+ carry = false;
+ }
+ }
+
+ if (carry) {
+ res = "1" + res;
+ }
+
+ return res;
+}
+
+void Node::_generate_serial_child_name(const Node *p_child, StringName &name) const {
+
+ if (name == StringName()) {
+ //no name and a new nade is needed, create one.
name = p_child->get_class();
// Adjust casing according to project setting. The current type name is expected to be in PascalCase.
switch (ProjectSettings::get_singleton()->get("node/name_casing").operator int()) {
case NAME_CASING_PASCAL_CASE:
break;
- case NAME_CASING_CAMEL_CASE:
- name[0] = name.to_lower()[0];
- break;
+ case NAME_CASING_CAMEL_CASE: {
+ String n = name;
+ n[0] = n.to_lower()[0];
+ name = n;
+ } break;
case NAME_CASING_SNAKE_CASE:
- name = name.camelcase_to_underscore(true);
+ name = String(name).camelcase_to_underscore(true);
break;
}
}
+ //quickly test if proposed name exists
+ int cc = data.children.size(); //children count
+ const Node *const *children_ptr = data.children.ptr();
+
+ {
+
+ bool exists = false;
+
+ for (int i = 0; i < cc; i++) {
+ if (children_ptr[i] == p_child) { //exclude self in renaming if its already a child
+ continue;
+ }
+ if (children_ptr[i]->data.name == name) {
+ exists = true;
+ }
+ }
+
+ if (!exists) {
+ return; //if it does not exist, it does not need validation
+ }
+ }
+
// Extract trailing number
+ String name_string = name;
String nums;
- for (int i = name.length() - 1; i >= 0; i--) {
- CharType n = name[i];
+ for (int i = name_string.length() - 1; i >= 0; i--) {
+ CharType n = name_string[i];
if (n >= '0' && n <= '9') {
- nums = String::chr(name[i]) + nums;
+ nums = String::chr(name_string[i]) + nums;
} else {
break;
}
}
String nnsep = _get_name_num_separator();
- int num = 0;
- bool explicit_zero = false;
- if (nums.length() > 0 && name.substr(name.length() - nnsep.length() - nums.length(), nnsep.length()) == nnsep) {
- // Base name + Separator + Number
- num = nums.to_int();
- name = name.substr(0, name.length() - nnsep.length() - nums.length()); // Keep base name
- if (num == 0) {
- explicit_zero = true;
- }
+ int name_last_index = name_string.length() - nnsep.length() - nums.length();
+
+ // Assign the base name + separator to name if we have numbers preceded by a separator
+ if (nums.length() > 0 && name_string.substr(name_last_index, nnsep.length()) == nnsep) {
+ name_string = name_string.substr(0, name_last_index + nnsep.length());
+ } else {
+ nums = "";
}
- int num_places = nums.length();
for (;;) {
- String attempt = (name + (num > 0 || explicit_zero ? nnsep + itos(num).pad_zeros(num_places) : "")).strip_edges();
- bool found = false;
- for (int i = 0; i < data.children.size(); i++) {
- if (data.children[i] == p_child)
+ StringName attempt = name_string + nums;
+ bool exists = false;
+
+ for (int i = 0; i < cc; i++) {
+ if (children_ptr[i] == p_child) {
continue;
- if (data.children[i]->data.name == attempt) {
- found = true;
- break;
+ }
+ if (children_ptr[i]->data.name == attempt) {
+ exists = true;
}
}
- if (!found) {
- return attempt;
+
+ if (!exists) {
+ name = attempt;
+ return;
} else {
- if (num == 0) {
- if (explicit_zero) {
- // Name ended in separator + 0; user expects to get to separator + 1
- num = 1;
- } else {
- // Name was undecorated so skip to 2 for a more natural result
- num = 2;
- }
+ if (nums.length() == 0) {
+ // Name was undecorated so skip to 2 for a more natural result
+ nums = "2";
+ name_string += nnsep; // Add separator because nums.length() > 0 was false
} else {
- num++;
+ nums = increase_numeric_string(nums);
}
}
}
diff --git a/scene/main/node.h b/scene/main/node.h
index 78db12dda9..1c451ef567 100644
--- a/scene/main/node.h
+++ b/scene/main/node.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -159,7 +159,7 @@ private:
void _replace_connections_target(Node *p_new_target);
void _validate_child_name(Node *p_child, bool p_force_human_readable = false);
- String _generate_serial_child_name(Node *p_child);
+ void _generate_serial_child_name(const Node *p_child, StringName &name) const;
void _propagate_reverse_notification(int p_notification);
void _propagate_deferred_notification(int p_notification, bool p_reverse);
diff --git a/scene/main/resource_preloader.cpp b/scene/main/resource_preloader.cpp
index dbe7daa604..cb1168b73e 100644
--- a/scene/main/resource_preloader.cpp
+++ b/scene/main/resource_preloader.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/main/resource_preloader.h b/scene/main/resource_preloader.h
index 98c7b21f37..3e3be4ac82 100644
--- a/scene/main/resource_preloader.h
+++ b/scene/main/resource_preloader.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp
index 3f664bab10..5acb157279 100644
--- a/scene/main/scene_tree.cpp
+++ b/scene/main/scene_tree.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -639,6 +639,7 @@ void SceneTree::_notification(int p_notification) {
}
} break;
case NOTIFICATION_OS_MEMORY_WARNING:
+ case NOTIFICATION_OS_IME_UPDATE:
case NOTIFICATION_WM_MOUSE_ENTER:
case NOTIFICATION_WM_MOUSE_EXIT:
case NOTIFICATION_WM_FOCUS_IN:
diff --git a/scene/main/scene_tree.h b/scene/main/scene_tree.h
index d59cbe05fb..d6ab8c37b2 100644
--- a/scene/main/scene_tree.h
+++ b/scene/main/scene_tree.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/main/timer.cpp b/scene/main/timer.cpp
index 227840531e..2ae950dad5 100755
--- a/scene/main/timer.cpp
+++ b/scene/main/timer.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/main/timer.h b/scene/main/timer.h
index 2f42252a7e..c492c6b61c 100755
--- a/scene/main/timer.h
+++ b/scene/main/timer.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp
index 86992c38f0..0633d194f7 100644
--- a/scene/main/viewport.cpp
+++ b/scene/main/viewport.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -148,7 +148,7 @@ void ViewportTexture::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_viewport_path_in_scene", "path"), &ViewportTexture::set_viewport_path_in_scene);
ClassDB::bind_method(D_METHOD("get_viewport_path_in_scene"), &ViewportTexture::get_viewport_path_in_scene);
- ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "viewport_path", PROPERTY_HINT_NODE_PATH_VALID_TYPES, "Viewport"), "set_viewport_path_in_scene", "get_viewport_path_in_scene");
+ ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "viewport_path", PROPERTY_HINT_NODE_PATH_VALID_TYPES, "Viewport", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_NODE_PATH_FROM_SCENE_ROOT), "set_viewport_path_in_scene", "get_viewport_path_in_scene");
}
ViewportTexture::ViewportTexture() {
@@ -189,7 +189,7 @@ Viewport::GUI::GUI() {
dragging = false;
mouse_focus = NULL;
mouse_click_grabber = NULL;
- mouse_focus_button = -1;
+ mouse_focus_mask = 0;
key_focus = NULL;
mouse_over = NULL;
@@ -435,7 +435,7 @@ void Viewport::_notification(int p_what) {
}
}
- if (!has_mouse_motion) {
+ if (!has_mouse_motion && physics_has_last_mousepos) {
Ref<InputEventMouseMotion> mm;
mm.instance();
mm->set_global_position(physics_last_mousepos);
@@ -465,6 +465,7 @@ void Viewport::_notification(int p_what) {
pos = mm->get_position();
motion_tested = true;
+ physics_has_last_mousepos = true;
physics_last_mousepos = pos;
physics_last_mouse_state.alt = mm->get_alt();
physics_last_mouse_state.shift = mm->get_shift();
@@ -643,7 +644,7 @@ void Viewport::_notification(int p_what) {
}
}
- if (!motion_tested && camera && physics_last_mousepos != Vector2(1e20, 1e20)) {
+ if (!motion_tested && camera && physics_has_last_mousepos) {
//test anyway for mouseenter/exit because objects might move
Vector3 from = camera->project_ray_origin(physics_last_mousepos);
@@ -671,15 +672,7 @@ void Viewport::_notification(int p_what) {
case SceneTree::NOTIFICATION_WM_FOCUS_OUT: {
if (gui.mouse_focus) {
//if mouse is being pressed, send a release event
- Ref<InputEventMouseButton> mb;
- mb.instance();
- mb->set_position(gui.mouse_focus->get_local_mouse_position());
- mb->set_global_position(gui.mouse_focus->get_local_mouse_position());
- mb->set_button_index(gui.mouse_focus_button);
- mb->set_pressed(false);
- Control *c = gui.mouse_focus;
- gui.mouse_focus = NULL;
- c->call_multilevel(SceneStringNames::get_singleton()->_gui_input, mb);
+ _drop_mouse_focus();
}
} break;
}
@@ -1686,10 +1679,10 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
if (mb->is_pressed()) {
Size2 pos = mpos;
- if (gui.mouse_focus && mb->get_button_index() != gui.mouse_focus_button) {
-
- //do not steal mouse focus and stuff
+ if (gui.mouse_focus_mask) {
+ //do not steal mouse focus and stuff while a focus mask exists
+ gui.mouse_focus_mask |= 1 << (mb->get_button_index() - 1); //add the button to the mask
} else {
bool is_handled = false;
@@ -1734,7 +1727,8 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
*/
gui.mouse_focus = _gui_find_control(pos);
- gui.mouse_focus_button = mb->get_button_index();
+ gui.mouse_focus_mask = 1 << (mb->get_button_index() - 1);
+ gui.last_mouse_focus = gui.mouse_focus;
if (!gui.mouse_focus) {
return;
@@ -1755,7 +1749,7 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
mb->set_position(pos);
#ifdef DEBUG_ENABLED
- if (ScriptDebugger::get_singleton()) {
+ if (ScriptDebugger::get_singleton() && gui.mouse_focus) {
Array arr;
arr.push_back(gui.mouse_focus->get_path());
@@ -1788,7 +1782,7 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
}
}
- if (gui.mouse_focus->can_process()) {
+ if (gui.mouse_focus && gui.mouse_focus->can_process()) {
_gui_call_input(gui.mouse_focus, mb);
}
@@ -1837,6 +1831,8 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
//change mouse accordingly
}
+ gui.mouse_focus_mask &= ~(1 << (mb->get_button_index() - 1)); //remove from mask
+
if (!gui.mouse_focus) {
//release event is only sent if a mouse focus (previously pressed button) exists
return;
@@ -1852,12 +1848,11 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
Control *mouse_focus = gui.mouse_focus;
//disable mouse focus if needed before calling input, this makes popups on mouse press event work better, as the release will never be received otherwise
- if (mb->get_button_index() == gui.mouse_focus_button) {
+ if (gui.mouse_focus_mask == 0) {
gui.mouse_focus = NULL;
- gui.mouse_focus_button = -1;
}
- if (mouse_focus->can_process()) {
+ if (mouse_focus && mouse_focus->can_process()) {
_gui_call_input(mouse_focus, mb);
}
@@ -1900,7 +1895,14 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
if (gui.drag_data.get_type() != Variant::NIL) {
gui.mouse_focus = NULL;
+ gui.mouse_focus_mask = 0;
+ break;
} else {
+ if (gui.drag_preview != NULL) {
+ ERR_PRINT("Don't set a drag preview and return null data. Preview was deleted and drag request ignored.");
+ memdelete(gui.drag_preview);
+ gui.drag_preview = NULL;
+ }
gui.dragging = false;
}
@@ -1955,10 +1957,9 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
// If the mouse is over a menu button, this menu will open automatically
// if there is already a pop-up menu open at the same hierarchical level.
- if (popup_menu_parent && menu_button &&
- popup_menu_parent->get_icon().is_null() &&
- menu_button->get_icon().is_null() &&
- (popup_menu->get_parent()->get_parent()->is_a_parent_of(menu_button) ||
+ if (popup_menu_parent && menu_button && popup_menu_parent->is_switch_on_hover() &&
+ !menu_button->is_disabled() && menu_button->is_switch_on_hover() &&
+ (popup_menu_parent->get_parent()->is_a_parent_of(menu_button) ||
menu_button->get_parent()->is_a_parent_of(popup_menu))) {
popup_menu->notification(Control::NOTIFICATION_MODAL_CLOSE);
@@ -2065,7 +2066,7 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
OS::get_singleton()->set_cursor_shape((OS::CursorShape)cursor_shape);
- if (over->can_process()) {
+ if (over && over->can_process()) {
_gui_call_input(over, mm);
}
@@ -2115,14 +2116,14 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
set_input_as_handled();
return;
}
- } else if (gui.mouse_focus) {
+ } else if (touch_event->get_index() == 0 && gui.last_mouse_focus) {
- if (gui.mouse_focus->can_process()) {
+ if (gui.last_mouse_focus->can_process()) {
touch_event = touch_event->xformed_by(Transform2D()); //make a copy
touch_event->set_position(gui.focus_inv_xform.xform(pos));
- _gui_call_input(gui.mouse_focus, touch_event);
+ _gui_call_input(gui.last_mouse_focus, touch_event);
}
set_input_as_handled();
return;
@@ -2406,7 +2407,7 @@ void Viewport::_gui_unfocus_control(Control *p_control) {
void Viewport::_gui_hid_control(Control *p_control) {
if (gui.mouse_focus == p_control) {
- gui.mouse_focus = NULL;
+ _drop_mouse_focus();
}
/* ???
@@ -2433,8 +2434,10 @@ void Viewport::_gui_hid_control(Control *p_control) {
void Viewport::_gui_remove_control(Control *p_control) {
- if (gui.mouse_focus == p_control)
+ if (gui.mouse_focus == p_control) {
gui.mouse_focus = NULL;
+ gui.mouse_focus_mask = 0;
+ }
if (gui.key_focus == p_control)
gui.key_focus = NULL;
if (gui.mouse_over == p_control)
@@ -2483,6 +2486,27 @@ void Viewport::_gui_accept_event() {
set_input_as_handled();
}
+void Viewport::_drop_mouse_focus() {
+
+ Control *c = gui.mouse_focus;
+ int mask = gui.mouse_focus_mask;
+ gui.mouse_focus = NULL;
+ gui.mouse_focus_mask = 0;
+
+ for (int i = 0; i < 3; i++) {
+
+ if (mask & (1 << i)) {
+ Ref<InputEventMouseButton> mb;
+ mb.instance();
+ mb->set_position(c->get_local_mouse_position());
+ mb->set_global_position(c->get_local_mouse_position());
+ mb->set_button_index(i + 1);
+ mb->set_pressed(false);
+ c->call_multilevel(SceneStringNames::get_singleton()->_gui_input, mb);
+ }
+ }
+}
+
List<Control *>::Element *Viewport::_gui_show_modal(Control *p_control) {
gui.modal_stack.push_back(p_control);
@@ -2492,15 +2516,8 @@ List<Control *>::Element *Viewport::_gui_show_modal(Control *p_control) {
p_control->_modal_set_prev_focus_owner(0);
if (gui.mouse_focus && !p_control->is_a_parent_of(gui.mouse_focus) && !gui.mouse_click_grabber) {
- Ref<InputEventMouseButton> mb;
- mb.instance();
- mb->set_position(gui.mouse_focus->get_local_mouse_position());
- mb->set_global_position(gui.mouse_focus->get_local_mouse_position());
- mb->set_button_index(gui.mouse_focus_button);
- mb->set_pressed(false);
- Control *c = gui.mouse_focus;
- gui.mouse_focus = NULL;
- c->call_multilevel(SceneStringNames::get_singleton()->_gui_input, mb);
+
+ _drop_mouse_focus();
}
return gui.modal_stack.back();
@@ -2530,24 +2547,45 @@ void Viewport::_post_gui_grab_click_focus() {
if (gui.mouse_focus == focus_grabber)
return;
- Ref<InputEventMouseButton> mb;
- mb.instance();
-
- //send unclic
+ int mask = gui.mouse_focus_mask;
Point2 click = gui.mouse_focus->get_global_transform_with_canvas().affine_inverse().xform(gui.last_mouse_pos);
- mb->set_position(click);
- mb->set_button_index(gui.mouse_focus_button);
- mb->set_pressed(false);
- gui.mouse_focus->call_multilevel(SceneStringNames::get_singleton()->_gui_input, mb);
+
+ for (int i = 0; i < 3; i++) {
+
+ if (mask & (1 << i)) {
+
+ Ref<InputEventMouseButton> mb;
+ mb.instance();
+
+ //send unclic
+
+ mb->set_position(click);
+ mb->set_button_index(i + 1);
+ mb->set_pressed(false);
+ gui.mouse_focus->call_multilevel(SceneStringNames::get_singleton()->_gui_input, mb);
+ }
+ }
gui.mouse_focus = focus_grabber;
gui.focus_inv_xform = gui.mouse_focus->get_global_transform_with_canvas().affine_inverse();
click = gui.mouse_focus->get_global_transform_with_canvas().affine_inverse().xform(gui.last_mouse_pos);
- mb->set_position(click);
- mb->set_button_index(gui.mouse_focus_button);
- mb->set_pressed(true);
- gui.mouse_focus->call_deferred(SceneStringNames::get_singleton()->_gui_input, mb);
+
+ for (int i = 0; i < 3; i++) {
+
+ if (mask & (1 << i)) {
+
+ Ref<InputEventMouseButton> mb;
+ mb.instance();
+
+ //send clic
+
+ mb->set_position(click);
+ mb->set_button_index(i + 1);
+ mb->set_pressed(true);
+ gui.mouse_focus->call_deferred(SceneStringNames::get_singleton()->_gui_input, mb);
+ }
+ }
}
}
@@ -3068,7 +3106,8 @@ Viewport::Viewport() {
physics_object_picking = false;
physics_object_capture = 0;
physics_object_over = 0;
- physics_last_mousepos = Vector2(1e20, 1e20);
+ physics_has_last_mousepos = false;
+ physics_last_mousepos = Vector2(Math_INF, Math_INF);
shadow_atlas_size = 0;
for (int i = 0; i < 4; i++) {
diff --git a/scene/main/viewport.h b/scene/main/viewport.h
index 44fb322ae2..0565fd3d18 100644
--- a/scene/main/viewport.h
+++ b/scene/main/viewport.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -209,6 +209,7 @@ private:
Transform physics_last_object_transform;
Transform physics_last_camera_transform;
ObjectID physics_last_id;
+ bool physics_has_last_mousepos;
Vector2 physics_last_mousepos;
struct {
@@ -271,8 +272,9 @@ private:
bool key_event_accepted;
Control *mouse_focus;
+ Control *last_mouse_focus;
Control *mouse_click_grabber;
- int mouse_focus_button;
+ int mouse_focus_mask;
Control *key_focus;
Control *mouse_over;
Control *tooltip;
@@ -379,6 +381,8 @@ private:
void _canvas_layer_add(CanvasLayer *p_canvas_layer);
void _canvas_layer_remove(CanvasLayer *p_canvas_layer);
+ void _drop_mouse_focus();
+
protected:
void _notification(int p_what);
static void _bind_methods();
diff --git a/scene/register_scene_types.cpp b/scene/register_scene_types.cpp
index 97230d422b..a50a09f095 100644
--- a/scene/register_scene_types.cpp
+++ b/scene/register_scene_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -210,20 +210,18 @@
#include "scene/resources/physics_material.h"
#endif
-static ResourceFormatLoaderTheme *resource_loader_theme = NULL;
+static Ref<ResourceFormatSaverText> resource_saver_text;
+static Ref<ResourceFormatLoaderText> resource_loader_text;
-static ResourceFormatSaverText *resource_saver_text = NULL;
-static ResourceFormatLoaderText *resource_loader_text = NULL;
+static Ref<ResourceFormatLoaderDynamicFont> resource_loader_dynamic_font;
-static ResourceFormatLoaderDynamicFont *resource_loader_dynamic_font = NULL;
+static Ref<ResourceFormatLoaderStreamTexture> resource_loader_stream_texture;
+static Ref<ResourceFormatLoaderTextureLayered> resource_loader_texture_layered;
-static ResourceFormatLoaderStreamTexture *resource_loader_stream_texture = NULL;
-static ResourceFormatLoaderTextureLayered *resource_loader_texture_layered = NULL;
+static Ref<ResourceFormatLoaderBMFont> resource_loader_bmfont;
-static ResourceFormatLoaderBMFont *resource_loader_bmfont = NULL;
-
-static ResourceFormatSaverShader *resource_saver_shader = NULL;
-static ResourceFormatLoaderShader *resource_loader_shader = NULL;
+static Ref<ResourceFormatSaverShader> resource_saver_shader;
+static Ref<ResourceFormatLoaderShader> resource_loader_shader;
void register_scene_types() {
@@ -233,31 +231,28 @@ void register_scene_types() {
Node::init_node_hrcr();
- resource_loader_dynamic_font = memnew(ResourceFormatLoaderDynamicFont);
+ resource_loader_dynamic_font.instance();
ResourceLoader::add_resource_format_loader(resource_loader_dynamic_font);
- resource_loader_stream_texture = memnew(ResourceFormatLoaderStreamTexture);
+ resource_loader_stream_texture.instance();
ResourceLoader::add_resource_format_loader(resource_loader_stream_texture);
- resource_loader_texture_layered = memnew(ResourceFormatLoaderTextureLayered);
+ resource_loader_texture_layered.instance();
ResourceLoader::add_resource_format_loader(resource_loader_texture_layered);
- resource_loader_theme = memnew(ResourceFormatLoaderTheme);
- ResourceLoader::add_resource_format_loader(resource_loader_theme);
-
- resource_saver_text = memnew(ResourceFormatSaverText);
+ resource_saver_text.instance();
ResourceSaver::add_resource_format_saver(resource_saver_text, true);
- resource_loader_text = memnew(ResourceFormatLoaderText);
+ resource_loader_text.instance();
ResourceLoader::add_resource_format_loader(resource_loader_text, true);
- resource_saver_shader = memnew(ResourceFormatSaverShader);
+ resource_saver_shader.instance();
ResourceSaver::add_resource_format_saver(resource_saver_shader, true);
- resource_loader_shader = memnew(ResourceFormatLoaderShader);
+ resource_loader_shader.instance();
ResourceLoader::add_resource_format_loader(resource_loader_shader, true);
- resource_loader_bmfont = memnew(ResourceFormatLoaderBMFont);
+ resource_loader_bmfont.instance();
ResourceLoader::add_resource_format_loader(resource_loader_bmfont, true);
OS::get_singleton()->yield(); //may take time to init
@@ -457,7 +452,6 @@ void register_scene_types() {
ClassDB::register_class<Curve3D>();
ClassDB::register_class<Path>();
ClassDB::register_class<PathFollow>();
- ClassDB::register_class<OrientedPathFollow>();
ClassDB::register_class<VisibilityNotifier>();
ClassDB::register_class<VisibilityEnabler>();
ClassDB::register_class<WorldEnvironment>();
@@ -740,29 +734,31 @@ void unregister_scene_types() {
clear_default_theme();
- memdelete(resource_loader_dynamic_font);
- memdelete(resource_loader_stream_texture);
- memdelete(resource_loader_texture_layered);
- memdelete(resource_loader_theme);
+ ResourceLoader::remove_resource_format_loader(resource_loader_dynamic_font);
+ resource_loader_dynamic_font.unref();
+
+ ResourceLoader::remove_resource_format_loader(resource_loader_texture_layered);
+ resource_loader_texture_layered.unref();
+
+ ResourceLoader::remove_resource_format_loader(resource_loader_stream_texture);
+ resource_loader_stream_texture.unref();
DynamicFont::finish_dynamic_fonts();
- if (resource_saver_text) {
- memdelete(resource_saver_text);
- }
- if (resource_loader_text) {
- memdelete(resource_loader_text);
- }
+ ResourceSaver::remove_resource_format_saver(resource_saver_text);
+ resource_saver_text.unref();
- if (resource_saver_shader) {
- memdelete(resource_saver_shader);
- }
- if (resource_loader_shader) {
- memdelete(resource_loader_shader);
- }
- if (resource_loader_bmfont) {
- memdelete(resource_loader_bmfont);
- }
+ ResourceLoader::remove_resource_format_loader(resource_loader_text);
+ resource_loader_text.unref();
+
+ ResourceSaver::remove_resource_format_saver(resource_saver_shader);
+ resource_saver_shader.unref();
+
+ ResourceLoader::remove_resource_format_loader(resource_loader_shader);
+ resource_loader_shader.unref();
+
+ ResourceLoader::remove_resource_format_loader(resource_loader_bmfont);
+ resource_loader_bmfont.unref();
SpatialMaterial::finish_shaders();
ParticlesMaterial::finish_shaders();
diff --git a/scene/register_scene_types.h b/scene/register_scene_types.h
index 9121c015fd..3645f88807 100644
--- a/scene/register_scene_types.h
+++ b/scene/register_scene_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/animation.cpp b/scene/resources/animation.cpp
index 803c85ef34..383f3f5d4e 100644
--- a/scene/resources/animation.cpp
+++ b/scene/resources/animation.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -2332,7 +2332,7 @@ float Animation::bezier_track_interpolate(int p_track, float p_time) const {
float duration = bt->values[idx + 1].time - bt->values[idx].time; // time duration between our two keyframes
float low = 0; // 0% of the current animation segment
float high = 1; // 100% of the current animation segment
- float middle = 0;
+ float middle;
Vector2 start(0, bt->values[idx].value.value);
Vector2 start_out = start + bt->values[idx].value.out_handle;
diff --git a/scene/resources/animation.h b/scene/resources/animation.h
index 6eec2c8bc7..b66ae184e9 100644
--- a/scene/resources/animation.h
+++ b/scene/resources/animation.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/audio_stream_sample.cpp b/scene/resources/audio_stream_sample.cpp
index 9ee85b64b6..a89cf108bc 100644
--- a/scene/resources/audio_stream_sample.cpp
+++ b/scene/resources/audio_stream_sample.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -249,6 +249,10 @@ void AudioStreamPlaybackSample::mix(AudioFrame *p_buffer, float p_rate_scale, in
int32_t todo = p_frames;
+ if (base->loop_mode == AudioStreamSample::LOOP_BACKWARD) {
+ sign = -1;
+ }
+
float base_rate = AudioServer::get_singleton()->get_mix_rate();
float srate = base->mix_rate;
srate *= p_rate_scale;
@@ -621,7 +625,7 @@ void AudioStreamSample::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::POOL_BYTE_ARRAY, "data", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_data", "get_data");
ADD_PROPERTY(PropertyInfo(Variant::INT, "format", PROPERTY_HINT_ENUM, "8-Bit,16-Bit,IMA-ADPCM"), "set_format", "get_format");
- ADD_PROPERTY(PropertyInfo(Variant::INT, "loop_mode", PROPERTY_HINT_ENUM, "Disabled,Forward,Ping-Pong"), "set_loop_mode", "get_loop_mode");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "loop_mode", PROPERTY_HINT_ENUM, "Disabled,Forward,Ping-Pong,Backward"), "set_loop_mode", "get_loop_mode");
ADD_PROPERTY(PropertyInfo(Variant::INT, "loop_begin"), "set_loop_begin", "get_loop_begin");
ADD_PROPERTY(PropertyInfo(Variant::INT, "loop_end"), "set_loop_end", "get_loop_end");
ADD_PROPERTY(PropertyInfo(Variant::INT, "mix_rate"), "set_mix_rate", "get_mix_rate");
@@ -634,6 +638,7 @@ void AudioStreamSample::_bind_methods() {
BIND_ENUM_CONSTANT(LOOP_DISABLED);
BIND_ENUM_CONSTANT(LOOP_FORWARD);
BIND_ENUM_CONSTANT(LOOP_PING_PONG);
+ BIND_ENUM_CONSTANT(LOOP_BACKWARD);
}
AudioStreamSample::AudioStreamSample() {
diff --git a/scene/resources/audio_stream_sample.h b/scene/resources/audio_stream_sample.h
index a27acc92b7..bd701ddd12 100644
--- a/scene/resources/audio_stream_sample.h
+++ b/scene/resources/audio_stream_sample.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -94,7 +94,8 @@ public:
enum LoopMode {
LOOP_DISABLED,
LOOP_FORWARD,
- LOOP_PING_PONG
+ LOOP_PING_PONG,
+ LOOP_BACKWARD
};
private:
diff --git a/scene/resources/bit_mask.cpp b/scene/resources/bit_mask.cpp
index 56b236d03b..0e2152f244 100644
--- a/scene/resources/bit_mask.cpp
+++ b/scene/resources/bit_mask.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -432,8 +432,8 @@ static void fill_bits(const BitMap *p_src, Ref<BitMap> &p_map, const Point2i &p_
int stack_size = 0;
Point2i pos = p_pos;
- int next_i;
- int next_j;
+ int next_i = 0;
+ int next_j = 0;
bool reenter = true;
bool popped = false;
@@ -602,7 +602,7 @@ void BitMap::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_bit", "position", "bit"), &BitMap::set_bit);
ClassDB::bind_method(D_METHOD("get_bit", "position"), &BitMap::get_bit);
- ClassDB::bind_method(D_METHOD("set_bit_rect", "p_rect", "bit"), &BitMap::set_bit_rect);
+ ClassDB::bind_method(D_METHOD("set_bit_rect", "rect", "bit"), &BitMap::set_bit_rect);
ClassDB::bind_method(D_METHOD("get_true_bit_count"), &BitMap::get_true_bit_count);
ClassDB::bind_method(D_METHOD("get_size"), &BitMap::get_size);
diff --git a/scene/resources/bit_mask.h b/scene/resources/bit_mask.h
index 04191a7774..4575064260 100644
--- a/scene/resources/bit_mask.h
+++ b/scene/resources/bit_mask.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/bounds.cpp b/scene/resources/bounds.cpp
index b115d92be3..e6fa5b818d 100644
--- a/scene/resources/bounds.cpp
+++ b/scene/resources/bounds.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/bounds.h b/scene/resources/bounds.h
index c86e15ae40..9a1801f23d 100644
--- a/scene/resources/bounds.h
+++ b/scene/resources/bounds.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/box_shape.cpp b/scene/resources/box_shape.cpp
index e9e01ed98a..d93754076c 100644
--- a/scene/resources/box_shape.cpp
+++ b/scene/resources/box_shape.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/box_shape.h b/scene/resources/box_shape.h
index 5ef16b4766..42d54310a8 100644
--- a/scene/resources/box_shape.h
+++ b/scene/resources/box_shape.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/canvas.cpp b/scene/resources/canvas.cpp
index 8da1da9541..0fc8b22046 100644
--- a/scene/resources/canvas.cpp
+++ b/scene/resources/canvas.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/canvas.h b/scene/resources/canvas.h
index cd37ea3583..4324b6227c 100644
--- a/scene/resources/canvas.h
+++ b/scene/resources/canvas.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/capsule_shape.cpp b/scene/resources/capsule_shape.cpp
index 101970bad8..3f7bf1e0ec 100644
--- a/scene/resources/capsule_shape.cpp
+++ b/scene/resources/capsule_shape.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/capsule_shape.h b/scene/resources/capsule_shape.h
index f89d07c5f1..6bca53f783 100644
--- a/scene/resources/capsule_shape.h
+++ b/scene/resources/capsule_shape.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/capsule_shape_2d.cpp b/scene/resources/capsule_shape_2d.cpp
index 95ab34abb2..fde05bfb7f 100644
--- a/scene/resources/capsule_shape_2d.cpp
+++ b/scene/resources/capsule_shape_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/capsule_shape_2d.h b/scene/resources/capsule_shape_2d.h
index 04d663c010..3bedf7618d 100644
--- a/scene/resources/capsule_shape_2d.h
+++ b/scene/resources/capsule_shape_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/circle_shape_2d.cpp b/scene/resources/circle_shape_2d.cpp
index 1c7bb76b26..76c1440861 100644
--- a/scene/resources/circle_shape_2d.cpp
+++ b/scene/resources/circle_shape_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/circle_shape_2d.h b/scene/resources/circle_shape_2d.h
index 06bb433170..e2624ac8ed 100644
--- a/scene/resources/circle_shape_2d.h
+++ b/scene/resources/circle_shape_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/color_ramp.cpp b/scene/resources/color_ramp.cpp
index d5e8c17cbc..845a1474a4 100644
--- a/scene/resources/color_ramp.cpp
+++ b/scene/resources/color_ramp.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/color_ramp.h b/scene/resources/color_ramp.h
index 88fa4beb7f..7a96bb429b 100644
--- a/scene/resources/color_ramp.h
+++ b/scene/resources/color_ramp.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/concave_polygon_shape.cpp b/scene/resources/concave_polygon_shape.cpp
index bc9e2848b3..b192d088d8 100644
--- a/scene/resources/concave_polygon_shape.cpp
+++ b/scene/resources/concave_polygon_shape.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/concave_polygon_shape.h b/scene/resources/concave_polygon_shape.h
index 2cc9095abf..1b8ddfc308 100644
--- a/scene/resources/concave_polygon_shape.h
+++ b/scene/resources/concave_polygon_shape.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/concave_polygon_shape_2d.cpp b/scene/resources/concave_polygon_shape_2d.cpp
index d4343680ef..51dd91fff5 100644
--- a/scene/resources/concave_polygon_shape_2d.cpp
+++ b/scene/resources/concave_polygon_shape_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/concave_polygon_shape_2d.h b/scene/resources/concave_polygon_shape_2d.h
index e8fa7369ac..8e3267dc2a 100644
--- a/scene/resources/concave_polygon_shape_2d.h
+++ b/scene/resources/concave_polygon_shape_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/convex_polygon_shape.cpp b/scene/resources/convex_polygon_shape.cpp
index 39488760cd..98d3460ed2 100644
--- a/scene/resources/convex_polygon_shape.cpp
+++ b/scene/resources/convex_polygon_shape.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/convex_polygon_shape.h b/scene/resources/convex_polygon_shape.h
index 62567fc031..5c192476d3 100644
--- a/scene/resources/convex_polygon_shape.h
+++ b/scene/resources/convex_polygon_shape.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/convex_polygon_shape_2d.cpp b/scene/resources/convex_polygon_shape_2d.cpp
index fc3d3f3334..f275405de2 100644
--- a/scene/resources/convex_polygon_shape_2d.cpp
+++ b/scene/resources/convex_polygon_shape_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/convex_polygon_shape_2d.h b/scene/resources/convex_polygon_shape_2d.h
index 69c237a0e6..8625b800ed 100644
--- a/scene/resources/convex_polygon_shape_2d.h
+++ b/scene/resources/convex_polygon_shape_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/curve.cpp b/scene/resources/curve.cpp
index 9188d890f7..464ca60d31 100644
--- a/scene/resources/curve.cpp
+++ b/scene/resources/curve.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -761,8 +761,8 @@ Vector2 Curve2D::interpolate_baked(float p_offset, bool p_cubic) const {
//validate//
int pc = baked_point_cache.size();
if (pc == 0) {
- ERR_EXPLAIN("No points in Curve2D");
- ERR_FAIL_COND_V(pc == 0, Vector2());
+ ERR_EXPLAIN("No points in Curve2D.");
+ ERR_FAIL_V(Vector2());
}
if (pc == 1)
@@ -826,8 +826,8 @@ Vector2 Curve2D::get_closest_point(const Vector2 &p_to_point) const {
//validate//
int pc = baked_point_cache.size();
if (pc == 0) {
- ERR_EXPLAIN("No points in Curve2D");
- ERR_FAIL_COND_V(pc == 0, Vector2());
+ ERR_EXPLAIN("No points in Curve2D.");
+ ERR_FAIL_V(Vector2());
}
if (pc == 1)
@@ -865,8 +865,8 @@ float Curve2D::get_closest_offset(const Vector2 &p_to_point) const {
//validate//
int pc = baked_point_cache.size();
if (pc == 0) {
- ERR_EXPLAIN("No points in Curve2D");
- ERR_FAIL_COND_V(pc == 0, 0.0f);
+ ERR_EXPLAIN("No points in Curve2D.");
+ ERR_FAIL_V(0.0f);
}
if (pc == 1)
@@ -1331,8 +1331,8 @@ Vector3 Curve3D::interpolate_baked(float p_offset, bool p_cubic) const {
//validate//
int pc = baked_point_cache.size();
if (pc == 0) {
- ERR_EXPLAIN("No points in Curve3D");
- ERR_FAIL_COND_V(pc == 0, Vector3());
+ ERR_EXPLAIN("No points in Curve3D.");
+ ERR_FAIL_V(Vector3());
}
if (pc == 1)
@@ -1375,8 +1375,8 @@ float Curve3D::interpolate_baked_tilt(float p_offset) const {
//validate//
int pc = baked_tilt_cache.size();
if (pc == 0) {
- ERR_EXPLAIN("No tilts in Curve3D");
- ERR_FAIL_COND_V(pc == 0, 0);
+ ERR_EXPLAIN("No tilts in Curve3D.");
+ ERR_FAIL_V(0);
}
if (pc == 1)
@@ -1413,8 +1413,8 @@ Vector3 Curve3D::interpolate_baked_up_vector(float p_offset, bool p_apply_tilt)
// curve may not have baked up vectors
int count = baked_up_vector_cache.size();
if (count == 0) {
- ERR_EXPLAIN("No up vectors in Curve3D");
- ERR_FAIL_COND_V(count == 0, Vector3(0, 1, 0));
+ ERR_EXPLAIN("No up vectors in Curve3D.");
+ ERR_FAIL_V(Vector3(0, 1, 0));
}
if (count == 1)
@@ -1484,8 +1484,8 @@ Vector3 Curve3D::get_closest_point(const Vector3 &p_to_point) const {
//validate//
int pc = baked_point_cache.size();
if (pc == 0) {
- ERR_EXPLAIN("No points in Curve3D");
- ERR_FAIL_COND_V(pc == 0, Vector3());
+ ERR_EXPLAIN("No points in Curve3D.");
+ ERR_FAIL_V(Vector3());
}
if (pc == 1)
@@ -1523,8 +1523,8 @@ float Curve3D::get_closest_offset(const Vector3 &p_to_point) const {
//validate//
int pc = baked_point_cache.size();
if (pc == 0) {
- ERR_EXPLAIN("No points in Curve3D");
- ERR_FAIL_COND_V(pc == 0, 0.0f);
+ ERR_EXPLAIN("No points in Curve3D.");
+ ERR_FAIL_V(0.0f);
}
if (pc == 1)
diff --git a/scene/resources/curve.h b/scene/resources/curve.h
index 234e3a6779..911a440567 100644
--- a/scene/resources/curve.h
+++ b/scene/resources/curve.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/cylinder_shape.cpp b/scene/resources/cylinder_shape.cpp
index f760462d49..4fd829b349 100644
--- a/scene/resources/cylinder_shape.cpp
+++ b/scene/resources/cylinder_shape.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/cylinder_shape.h b/scene/resources/cylinder_shape.h
index f510758e91..58a4f5a817 100644
--- a/scene/resources/cylinder_shape.h
+++ b/scene/resources/cylinder_shape.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/default_theme/default_theme.cpp b/scene/resources/default_theme/default_theme.cpp
index fff136cdc3..7ed51a2f8f 100644
--- a/scene/resources/default_theme/default_theme.cpp
+++ b/scene/resources/default_theme/default_theme.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -307,10 +307,6 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
theme->set_constant("hseparation", "MenuButton", 3 * scale);
- // ButtonGroup
-
- theme->set_stylebox("panel", "ButtonGroup", memnew(StyleBoxEmpty));
-
// CheckBox
Ref<StyleBox> cbx_empty = memnew(StyleBoxEmpty);
@@ -604,6 +600,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
theme->set_icon("resizer", "GraphNode", make_icon(window_resizer_png));
theme->set_font("title_font", "GraphNode", default_font);
theme->set_color("title_color", "GraphNode", Color(0, 0, 0, 1));
+ theme->set_color("close_color", "GraphNode", Color(0, 0, 0, 1));
theme->set_constant("title_offset", "GraphNode", 20 * scale);
theme->set_constant("close_offset", "GraphNode", 18 * scale);
theme->set_constant("port_offset", "GraphNode", 3 * scale);
diff --git a/scene/resources/default_theme/default_theme.h b/scene/resources/default_theme/default_theme.h
index 8f211af35b..cbf0cc1b79 100644
--- a/scene/resources/default_theme/default_theme.h
+++ b/scene/resources/default_theme/default_theme.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/dynamic_font.cpp b/scene/resources/dynamic_font.cpp
index d6b40766a2..5660f0a1b9 100644
--- a/scene/resources/dynamic_font.cpp
+++ b/scene/resources/dynamic_font.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -82,11 +82,14 @@ void DynamicFontData::set_force_autohinter(bool p_force) {
}
void DynamicFontData::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("set_antialiased", "antialiased"), &DynamicFontData::set_antialiased);
+ ClassDB::bind_method(D_METHOD("is_antialiased"), &DynamicFontData::is_antialiased);
ClassDB::bind_method(D_METHOD("set_font_path", "path"), &DynamicFontData::set_font_path);
ClassDB::bind_method(D_METHOD("get_font_path"), &DynamicFontData::get_font_path);
ClassDB::bind_method(D_METHOD("set_hinting", "mode"), &DynamicFontData::set_hinting);
ClassDB::bind_method(D_METHOD("get_hinting"), &DynamicFontData::get_hinting);
+ ADD_PROPERTY(PropertyInfo(Variant::BOOL, "antialiased"), "set_antialiased", "is_antialiased");
ADD_PROPERTY(PropertyInfo(Variant::INT, "hinting", PROPERTY_HINT_ENUM, "None,Light,Normal"), "set_hinting", "get_hinting");
BIND_ENUM_CONSTANT(HINTING_NONE);
@@ -98,6 +101,7 @@ void DynamicFontData::_bind_methods() {
DynamicFontData::DynamicFontData() {
+ antialiased = true;
force_autohinter = false;
hinting = DynamicFontData::HINTING_NORMAL;
font_mem = NULL;
@@ -277,18 +281,6 @@ const Pair<const DynamicFontAtSize::Character *, DynamicFontAtSize *> DynamicFon
return Pair<const Character *, DynamicFontAtSize *>(chr, const_cast<DynamicFontAtSize *>(this));
}
-float DynamicFontAtSize::_get_kerning_advance(const DynamicFontAtSize *font, CharType p_char, CharType p_next) const {
- float advance = 0.0;
-
- if (p_next) {
- FT_Vector delta;
- FT_Get_Kerning(font->face, p_char, p_next, FT_KERNING_DEFAULT, &delta);
- advance = (delta.x / 64.0) / oversampling;
- }
-
- return advance;
-}
-
Size2 DynamicFontAtSize::get_char_size(CharType p_char, CharType p_next, const Vector<Ref<DynamicFontAtSize> > &p_fallbacks) const {
if (!valid)
@@ -297,7 +289,6 @@ Size2 DynamicFontAtSize::get_char_size(CharType p_char, CharType p_next, const V
Pair<const Character *, DynamicFontAtSize *> char_pair_with_font = _find_char_with_font(p_char, p_fallbacks);
const Character *ch = char_pair_with_font.first;
- DynamicFontAtSize *font = char_pair_with_font.second;
ERR_FAIL_COND_V(!ch, Size2());
Size2 ret(0, get_height());
@@ -305,7 +296,6 @@ Size2 DynamicFontAtSize::get_char_size(CharType p_char, CharType p_next, const V
if (ch->found) {
ret.x = ch->advance;
}
- ret.x += _get_kerning_advance(font, p_char, p_next);
return ret;
}
@@ -348,14 +338,12 @@ float DynamicFontAtSize::draw_char(RID p_canvas_item, const Point2 &p_pos, CharT
modulate.r = modulate.g = modulate.b = 1.0;
}
RID texture = font->textures[ch->texture_idx].texture->get_rid();
- VisualServer::get_singleton()->canvas_item_add_texture_rect_region(p_canvas_item, Rect2(cpos, ch->rect.size * Vector2(font->scale_color_font, font->scale_color_font)), texture, ch->rect_uv, modulate, false, RID(), false);
+ VisualServer::get_singleton()->canvas_item_add_texture_rect_region(p_canvas_item, Rect2(cpos, ch->rect.size), texture, ch->rect_uv, modulate, false, RID(), false);
}
advance = ch->advance;
}
- advance += _get_kerning_advance(font, p_char, p_next);
-
return advance;
}
@@ -632,7 +620,7 @@ void DynamicFontAtSize::_update_char(CharType p_char) {
if (id.outline_size > 0) {
character = _make_outline_char(p_char);
} else {
- error = FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);
+ error = FT_Render_Glyph(face->glyph, font->antialiased ? FT_RENDER_MODE_NORMAL : FT_RENDER_MODE_MONO);
if (!error)
character = _bitmap_to_character(slot->bitmap, slot->bitmap_top, slot->bitmap_left, slot->advance.x / 64.0);
}
@@ -785,6 +773,18 @@ void DynamicFont::set_use_filter(bool p_enable) {
_reload_cache();
}
+bool DynamicFontData::is_antialiased() const {
+
+ return antialiased;
+}
+
+void DynamicFontData::set_antialiased(bool p_antialiased) {
+
+ if (antialiased == p_antialiased)
+ return;
+ antialiased = p_antialiased;
+}
+
DynamicFontData::Hinting DynamicFontData::get_hinting() const {
return hinting;
diff --git a/scene/resources/dynamic_font.h b/scene/resources/dynamic_font.h
index bd3f84d62c..39e81ca43d 100644
--- a/scene/resources/dynamic_font.h
+++ b/scene/resources/dynamic_font.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -71,12 +71,15 @@ public:
HINTING_NORMAL
};
+ bool is_antialiased() const;
+ void set_antialiased(bool p_antialiased);
Hinting get_hinting() const;
void set_hinting(Hinting p_hinting);
private:
const uint8_t *font_mem;
int font_mem_size;
+ bool antialiased;
bool force_autohinter;
Hinting hinting;
@@ -161,7 +164,6 @@ class DynamicFontAtSize : public Reference {
const Pair<const Character *, DynamicFontAtSize *> _find_char_with_font(CharType p_char, const Vector<Ref<DynamicFontAtSize> > &p_fallbacks) const;
Character _make_outline_char(CharType p_char);
- float _get_kerning_advance(const DynamicFontAtSize *font, CharType p_char, CharType p_next) const;
TexturePosition _find_texture_pos_for_glyph(int p_color_size, Image::Format p_image_format, int p_width, int p_height);
Character _bitmap_to_character(FT_Bitmap bitmap, int yofs, int xofs, float advance);
@@ -300,6 +302,7 @@ VARIANT_ENUM_CAST(DynamicFont::SpacingType);
/////////////
class ResourceFormatLoaderDynamicFont : public ResourceFormatLoader {
+ GDCLASS(ResourceFormatLoaderDynamicFont, ResourceFormatLoader)
public:
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
virtual void get_recognized_extensions(List<String> *p_extensions) const;
diff --git a/scene/resources/dynamic_font_stb.cpp b/scene/resources/dynamic_font_stb.cpp
index 8cb2cc4983..3b44f05b94 100644
--- a/scene/resources/dynamic_font_stb.cpp
+++ b/scene/resources/dynamic_font_stb.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/dynamic_font_stb.h b/scene/resources/dynamic_font_stb.h
index e1ef72ea4f..4c98487600 100644
--- a/scene/resources/dynamic_font_stb.h
+++ b/scene/resources/dynamic_font_stb.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -180,6 +180,7 @@ public:
/////////////
class ResourceFormatLoaderDynamicFont : public ResourceFormatLoader {
+ GDCLASS(ResourceFormatLoaderDynamicFont, ResourceFormatLoader)
public:
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
virtual void get_recognized_extensions(List<String> *p_extensions) const;
diff --git a/scene/resources/environment.cpp b/scene/resources/environment.cpp
index c9cdfe866f..a57b7bbb42 100644
--- a/scene/resources/environment.cpp
+++ b/scene/resources/environment.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -61,6 +61,25 @@ void Environment::set_sky_custom_fov(float p_scale) {
bg_sky_custom_fov = p_scale;
VS::get_singleton()->environment_set_sky_custom_fov(environment, p_scale);
}
+void Environment::set_sky_orientation(const Basis &p_orientation) {
+
+ bg_sky_orientation = p_orientation;
+ _change_notify("background_sky_rotation");
+ _change_notify("background_sky_rotation_degrees");
+ VS::get_singleton()->environment_set_sky_orientation(environment, bg_sky_orientation);
+}
+void Environment::set_sky_rotation(const Vector3 &p_euler_rad) {
+
+ bg_sky_orientation.set_euler(p_euler_rad);
+ _change_notify("background_sky_orientation");
+ _change_notify("background_sky_rotation_degrees");
+ VS::get_singleton()->environment_set_sky_orientation(environment, bg_sky_orientation);
+}
+void Environment::set_sky_rotation_degrees(const Vector3 &p_euler_deg) {
+
+ set_sky_rotation(p_euler_deg * Math_PI / 180.0);
+ _change_notify("background_sky_rotation");
+}
void Environment::set_bg_color(const Color &p_color) {
bg_color = p_color;
@@ -106,6 +125,22 @@ float Environment::get_sky_custom_fov() const {
return bg_sky_custom_fov;
}
+Basis Environment::get_sky_orientation() const {
+
+ return bg_sky_orientation;
+}
+
+Vector3 Environment::get_sky_rotation() const {
+
+ // should we cache this? maybe overkill
+ return bg_sky_orientation.get_euler();
+}
+
+Vector3 Environment::get_sky_rotation_degrees() const {
+
+ return get_sky_rotation() * 180.0 / Math_PI;
+}
+
Color Environment::get_bg_color() const {
return bg_color;
@@ -268,7 +303,7 @@ Ref<Texture> Environment::get_adjustment_color_correction() const {
void Environment::_validate_property(PropertyInfo &property) const {
- if (property.name == "background_sky" || property.name == "background_sky_custom_fov" || property.name == "ambient_light/sky_contribution") {
+ if (property.name == "background_sky" || property.name == "background_sky_custom_fov" || property.name == "background_sky_orientation" || property.name == "ambient_light/sky_contribution") {
if (bg_mode != BG_SKY && bg_mode != BG_COLOR_SKY) {
property.usage = PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL;
}
@@ -299,6 +334,19 @@ void Environment::_validate_property(PropertyInfo &property) const {
};
+ static const char *high_end_prefixes[] = {
+ "auto_exposure_",
+ "tonemap_",
+ "ss_reflections_",
+ "ssao_",
+ "dof_blur_far_",
+ "dof_blur_near_",
+ "glow_",
+ "adjustment_",
+ NULL
+
+ };
+
const char **prefixes = hide_prefixes;
while (*prefixes) {
String prefix = String(*prefixes);
@@ -311,6 +359,20 @@ void Environment::_validate_property(PropertyInfo &property) const {
prefixes++;
}
+
+ if (VisualServer::get_singleton()->is_low_end()) {
+ prefixes = high_end_prefixes;
+ while (*prefixes) {
+ String prefix = String(*prefixes);
+
+ if (property.name.begins_with(prefix)) {
+ property.usage = PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL;
+ return;
+ }
+
+ prefixes++;
+ }
+ }
}
void Environment::set_ssr_enabled(bool p_enable) {
@@ -504,7 +566,7 @@ float Environment::get_ssao_edge_sharpness() const {
void Environment::set_glow_enabled(bool p_enabled) {
glow_enabled = p_enabled;
- VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_bicubic_upscale);
+ VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap, glow_bicubic_upscale);
_change_notify();
}
@@ -522,7 +584,7 @@ void Environment::set_glow_level(int p_level, bool p_enabled) {
else
glow_levels &= ~(1 << p_level);
- VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_bicubic_upscale);
+ VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap, glow_bicubic_upscale);
}
bool Environment::is_glow_level_enabled(int p_level) const {
@@ -535,7 +597,7 @@ void Environment::set_glow_intensity(float p_intensity) {
glow_intensity = p_intensity;
- VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_bicubic_upscale);
+ VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap, glow_bicubic_upscale);
}
float Environment::get_glow_intensity() const {
@@ -545,7 +607,7 @@ float Environment::get_glow_intensity() const {
void Environment::set_glow_strength(float p_strength) {
glow_strength = p_strength;
- VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_bicubic_upscale);
+ VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap, glow_bicubic_upscale);
}
float Environment::get_glow_strength() const {
@@ -556,7 +618,7 @@ void Environment::set_glow_bloom(float p_threshold) {
glow_bloom = p_threshold;
- VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_bicubic_upscale);
+ VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap, glow_bicubic_upscale);
}
float Environment::get_glow_bloom() const {
@@ -567,7 +629,7 @@ void Environment::set_glow_blend_mode(GlowBlendMode p_mode) {
glow_blend_mode = p_mode;
- VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_bicubic_upscale);
+ VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap, glow_bicubic_upscale);
}
Environment::GlowBlendMode Environment::get_glow_blend_mode() const {
@@ -578,18 +640,29 @@ void Environment::set_glow_hdr_bleed_threshold(float p_threshold) {
glow_hdr_bleed_threshold = p_threshold;
- VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_bicubic_upscale);
+ VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap, glow_bicubic_upscale);
}
float Environment::get_glow_hdr_bleed_threshold() const {
return glow_hdr_bleed_threshold;
}
+void Environment::set_glow_hdr_luminance_cap(float p_amount) {
+
+ glow_hdr_luminance_cap = p_amount;
+
+ VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap, glow_bicubic_upscale);
+}
+float Environment::get_glow_hdr_luminance_cap() const {
+
+ return glow_hdr_luminance_cap;
+}
+
void Environment::set_glow_hdr_bleed_scale(float p_scale) {
glow_hdr_bleed_scale = p_scale;
- VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_bicubic_upscale);
+ VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap, glow_bicubic_upscale);
}
float Environment::get_glow_hdr_bleed_scale() const {
@@ -599,7 +672,7 @@ float Environment::get_glow_hdr_bleed_scale() const {
void Environment::set_glow_bicubic_upscale(bool p_enable) {
glow_bicubic_upscale = p_enable;
- VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_bicubic_upscale);
+ VS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_bloom, VS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap, glow_bicubic_upscale);
}
bool Environment::is_glow_bicubic_upscale_enabled() const {
@@ -864,6 +937,9 @@ void Environment::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_background", "mode"), &Environment::set_background);
ClassDB::bind_method(D_METHOD("set_sky", "sky"), &Environment::set_sky);
ClassDB::bind_method(D_METHOD("set_sky_custom_fov", "scale"), &Environment::set_sky_custom_fov);
+ ClassDB::bind_method(D_METHOD("set_sky_orientation", "orientation"), &Environment::set_sky_orientation);
+ ClassDB::bind_method(D_METHOD("set_sky_rotation", "euler_radians"), &Environment::set_sky_rotation);
+ ClassDB::bind_method(D_METHOD("set_sky_rotation_degrees", "euler_degrees"), &Environment::set_sky_rotation_degrees);
ClassDB::bind_method(D_METHOD("set_bg_color", "color"), &Environment::set_bg_color);
ClassDB::bind_method(D_METHOD("set_bg_energy", "energy"), &Environment::set_bg_energy);
ClassDB::bind_method(D_METHOD("set_canvas_max_layer", "layer"), &Environment::set_canvas_max_layer);
@@ -874,6 +950,9 @@ void Environment::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_background"), &Environment::get_background);
ClassDB::bind_method(D_METHOD("get_sky"), &Environment::get_sky);
ClassDB::bind_method(D_METHOD("get_sky_custom_fov"), &Environment::get_sky_custom_fov);
+ ClassDB::bind_method(D_METHOD("get_sky_orientation"), &Environment::get_sky_orientation);
+ ClassDB::bind_method(D_METHOD("get_sky_rotation"), &Environment::get_sky_rotation);
+ ClassDB::bind_method(D_METHOD("get_sky_rotation_degrees"), &Environment::get_sky_rotation_degrees);
ClassDB::bind_method(D_METHOD("get_bg_color"), &Environment::get_bg_color);
ClassDB::bind_method(D_METHOD("get_bg_energy"), &Environment::get_bg_energy);
ClassDB::bind_method(D_METHOD("get_canvas_max_layer"), &Environment::get_canvas_max_layer);
@@ -885,6 +964,9 @@ void Environment::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::INT, "background_mode", PROPERTY_HINT_ENUM, "Clear Color,Custom Color,Sky,Color+Sky,Canvas,Keep"), "set_background", "get_background");
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "background_sky", PROPERTY_HINT_RESOURCE_TYPE, "Sky"), "set_sky", "get_sky");
ADD_PROPERTY(PropertyInfo(Variant::REAL, "background_sky_custom_fov", PROPERTY_HINT_RANGE, "0,180,0.1"), "set_sky_custom_fov", "get_sky_custom_fov");
+ ADD_PROPERTY(PropertyInfo(Variant::BASIS, "background_sky_orientation"), "set_sky_orientation", "get_sky_orientation");
+ ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "background_sky_rotation", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR), "set_sky_rotation", "get_sky_rotation");
+ ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "background_sky_rotation_degrees", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR), "set_sky_rotation_degrees", "get_sky_rotation_degrees");
ADD_PROPERTY(PropertyInfo(Variant::COLOR, "background_color"), "set_bg_color", "get_bg_color");
ADD_PROPERTY(PropertyInfo(Variant::REAL, "background_energy", PROPERTY_HINT_RANGE, "0,16,0.01"), "set_bg_energy", "get_bg_energy");
ADD_PROPERTY(PropertyInfo(Variant::INT, "background_canvas_max_layer", PROPERTY_HINT_RANGE, "-1000,1000,1"), "set_canvas_max_layer", "get_canvas_max_layer");
@@ -1127,6 +1209,9 @@ void Environment::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_glow_hdr_bleed_threshold", "threshold"), &Environment::set_glow_hdr_bleed_threshold);
ClassDB::bind_method(D_METHOD("get_glow_hdr_bleed_threshold"), &Environment::get_glow_hdr_bleed_threshold);
+ ClassDB::bind_method(D_METHOD("set_glow_hdr_luminance_cap", "amount"), &Environment::set_glow_hdr_luminance_cap);
+ ClassDB::bind_method(D_METHOD("get_glow_hdr_luminance_cap"), &Environment::get_glow_hdr_luminance_cap);
+
ClassDB::bind_method(D_METHOD("set_glow_hdr_bleed_scale", "scale"), &Environment::set_glow_hdr_bleed_scale);
ClassDB::bind_method(D_METHOD("get_glow_hdr_bleed_scale"), &Environment::get_glow_hdr_bleed_scale);
@@ -1148,6 +1233,7 @@ void Environment::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::REAL, "glow_bloom", PROPERTY_HINT_RANGE, "0.0,1.0,0.01"), "set_glow_bloom", "get_glow_bloom");
ADD_PROPERTY(PropertyInfo(Variant::INT, "glow_blend_mode", PROPERTY_HINT_ENUM, "Additive,Screen,Softlight,Replace"), "set_glow_blend_mode", "get_glow_blend_mode");
ADD_PROPERTY(PropertyInfo(Variant::REAL, "glow_hdr_threshold", PROPERTY_HINT_RANGE, "0.0,4.0,0.01"), "set_glow_hdr_bleed_threshold", "get_glow_hdr_bleed_threshold");
+ ADD_PROPERTY(PropertyInfo(Variant::REAL, "glow_hdr_luminance_cap", PROPERTY_HINT_RANGE, "0.0,256.0,0.01"), "set_glow_hdr_luminance_cap", "get_glow_hdr_luminance_cap");
ADD_PROPERTY(PropertyInfo(Variant::REAL, "glow_hdr_scale", PROPERTY_HINT_RANGE, "0.0,4.0,0.01"), "set_glow_hdr_bleed_scale", "get_glow_hdr_bleed_scale");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "glow_bicubic_upscale"), "set_glow_bicubic_upscale", "is_glow_bicubic_upscale_enabled");
@@ -1211,6 +1297,7 @@ Environment::Environment() {
bg_mode = BG_CLEAR_COLOR;
bg_sky_custom_fov = 0;
+ bg_sky_orientation = Basis();
bg_energy = 1.0;
bg_canvas_max_layer = 0;
ambient_energy = 1.0;
@@ -1261,6 +1348,7 @@ Environment::Environment() {
glow_bloom = 0.0;
glow_blend_mode = GLOW_BLEND_MODE_SOFTLIGHT;
glow_hdr_bleed_threshold = 1.0;
+ glow_hdr_luminance_cap = 12.0;
glow_hdr_bleed_scale = 2.0;
glow_bicubic_upscale = false;
diff --git a/scene/resources/environment.h b/scene/resources/environment.h
index 4f5d44088a..666112b473 100644
--- a/scene/resources/environment.h
+++ b/scene/resources/environment.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -91,6 +91,7 @@ private:
BGMode bg_mode;
Ref<Sky> bg_sky;
float bg_sky_custom_fov;
+ Basis bg_sky_orientation;
Color bg_color;
float bg_energy;
int bg_canvas_max_layer;
@@ -141,6 +142,7 @@ private:
GlowBlendMode glow_blend_mode;
float glow_hdr_bleed_threshold;
float glow_hdr_bleed_scale;
+ float glow_hdr_luminance_cap;
bool glow_bicubic_upscale;
bool dof_blur_far_enabled;
@@ -181,6 +183,9 @@ public:
void set_background(BGMode p_bg);
void set_sky(const Ref<Sky> &p_sky);
void set_sky_custom_fov(float p_scale);
+ void set_sky_orientation(const Basis &p_orientation);
+ void set_sky_rotation(const Vector3 &p_euler_rad);
+ void set_sky_rotation_degrees(const Vector3 &p_euler_deg);
void set_bg_color(const Color &p_color);
void set_bg_energy(float p_energy);
void set_canvas_max_layer(int p_max_layer);
@@ -191,6 +196,9 @@ public:
BGMode get_background() const;
Ref<Sky> get_sky() const;
float get_sky_custom_fov() const;
+ Basis get_sky_orientation() const;
+ Vector3 get_sky_rotation() const;
+ Vector3 get_sky_rotation_degrees() const;
Color get_bg_color() const;
float get_bg_energy() const;
int get_canvas_max_layer() const;
@@ -312,6 +320,9 @@ public:
void set_glow_hdr_bleed_threshold(float p_threshold);
float get_glow_hdr_bleed_threshold() const;
+ void set_glow_hdr_luminance_cap(float p_amount);
+ float get_glow_hdr_luminance_cap() const;
+
void set_glow_hdr_bleed_scale(float p_scale);
float get_glow_hdr_bleed_scale() const;
diff --git a/scene/resources/font.cpp b/scene/resources/font.cpp
index b78b3a6ffb..7ecf9a2b16 100644
--- a/scene/resources/font.cpp
+++ b/scene/resources/font.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/font.h b/scene/resources/font.h
index 39e66a822d..6bc8d9b792 100644
--- a/scene/resources/font.h
+++ b/scene/resources/font.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -201,6 +201,7 @@ public:
};
class ResourceFormatLoaderBMFont : public ResourceFormatLoader {
+ GDCLASS(ResourceFormatLoaderBMFont, ResourceFormatLoader)
public:
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
virtual void get_recognized_extensions(List<String> *p_extensions) const;
diff --git a/scene/resources/material.cpp b/scene/resources/material.cpp
index 8ff08f91f2..5ffaf41581 100644
--- a/scene/resources/material.cpp
+++ b/scene/resources/material.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -258,7 +258,7 @@ ShaderMaterial::~ShaderMaterial() {
/////////////////////////////////
Mutex *SpatialMaterial::material_mutex = NULL;
-SelfList<SpatialMaterial>::List SpatialMaterial::dirty_materials;
+SelfList<SpatialMaterial>::List *SpatialMaterial::dirty_materials = NULL;
Map<SpatialMaterial::MaterialKey, SpatialMaterial::ShaderData> SpatialMaterial::shader_map;
SpatialMaterial::ShaderNames *SpatialMaterial::shader_names = NULL;
@@ -268,6 +268,8 @@ void SpatialMaterial::init_shaders() {
material_mutex = Mutex::create();
#endif
+ dirty_materials = memnew(SelfList<SpatialMaterial>::List);
+
shader_names = memnew(ShaderNames);
shader_names->albedo = "albedo";
@@ -348,12 +350,15 @@ void SpatialMaterial::finish_shaders() {
memdelete(material_mutex);
#endif
+ memdelete(dirty_materials);
+ dirty_materials = NULL;
+
memdelete(shader_names);
}
void SpatialMaterial::_update_shader() {
- dirty_materials.remove(&element);
+ dirty_materials->remove(&element);
MaterialKey mk = _compute_key();
if (mk.key == current_key.key)
@@ -699,7 +704,7 @@ void SpatialMaterial::_update_shader() {
if (features[FEATURE_DEPTH_MAPPING] && !flags[FLAG_UV1_USE_TRIPLANAR]) { //depthmap not supported with triplanar
code += "\t{\n";
- code += "\t\tvec3 view_dir = normalize(normalize(-VERTEX)*mat3(TANGENT*depth_flip.x,BINORMAL*depth_flip.y,NORMAL));\n"; //binormal is negative due to mikktpsace
+ code += "\t\tvec3 view_dir = normalize(normalize(-VERTEX)*mat3(TANGENT*depth_flip.x,-BINORMAL*depth_flip.y,NORMAL));\n"; // binormal is negative due to mikktspace, flip 'unflips' it ;-)
if (deep_parallax) {
code += "\t\tfloat num_layers = mix(float(depth_max_layers),float(depth_min_layers), abs(dot(vec3(0.0, 0.0, 1.0), view_dir)));\n";
@@ -1002,9 +1007,9 @@ void SpatialMaterial::flush_changes() {
if (material_mutex)
material_mutex->lock();
- while (dirty_materials.first()) {
+ while (dirty_materials->first()) {
- dirty_materials.first()->self()->_update_shader();
+ dirty_materials->first()->self()->_update_shader();
}
if (material_mutex)
@@ -1017,7 +1022,7 @@ void SpatialMaterial::_queue_shader_change() {
material_mutex->lock();
if (!element.in_list()) {
- dirty_materials.add(&element);
+ dirty_materials->add(&element);
}
if (material_mutex)
@@ -1315,7 +1320,7 @@ void SpatialMaterial::set_flag(Flags p_flag, bool p_enabled) {
return;
flags[p_flag] = p_enabled;
- if (p_flag == FLAG_USE_ALPHA_SCISSOR) {
+ if (p_flag == FLAG_USE_ALPHA_SCISSOR || p_flag == FLAG_UNSHADED) {
_change_notify();
}
_queue_shader_change();
@@ -1421,6 +1426,48 @@ void SpatialMaterial::_validate_property(PropertyInfo &property) const {
if ((property.name == "depth_min_layers" || property.name == "depth_max_layers") && !deep_parallax) {
property.usage = 0;
}
+
+ if (flags[FLAG_UNSHADED]) {
+ if (property.name.begins_with("anisotropy")) {
+ property.usage = 0;
+ }
+
+ if (property.name.begins_with("ao")) {
+ property.usage = 0;
+ }
+
+ if (property.name.begins_with("clearcoat")) {
+ property.usage = 0;
+ }
+
+ if (property.name.begins_with("emission")) {
+ property.usage = 0;
+ }
+
+ if (property.name.begins_with("metallic")) {
+ property.usage = 0;
+ }
+
+ if (property.name.begins_with("normal")) {
+ property.usage = 0;
+ }
+
+ if (property.name.begins_with("rim")) {
+ property.usage = 0;
+ }
+
+ if (property.name.begins_with("roughness")) {
+ property.usage = 0;
+ }
+
+ if (property.name.begins_with("subsurf_scatter")) {
+ property.usage = 0;
+ }
+
+ if (property.name.begins_with("transmission")) {
+ property.usage = 0;
+ }
+ }
}
void SpatialMaterial::set_line_width(float p_line_width) {
@@ -2277,7 +2324,7 @@ SpatialMaterial::SpatialMaterial() :
deep_parallax = false;
depth_parallax_flip_tangent = false;
- depth_parallax_flip_binormal = true;
+ depth_parallax_flip_binormal = false;
set_depth_deep_parallax_min_layers(8);
set_depth_deep_parallax_max_layers(32);
set_depth_deep_parallax_flip_tangent(false); //also sets binormal
diff --git a/scene/resources/material.h b/scene/resources/material.h
index 54fceaddc1..1f7fc267af 100644
--- a/scene/resources/material.h
+++ b/scene/resources/material.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -360,7 +360,7 @@ private:
};
static Mutex *material_mutex;
- static SelfList<SpatialMaterial>::List dirty_materials;
+ static SelfList<SpatialMaterial>::List *dirty_materials;
static ShaderNames *shader_names;
SelfList<SpatialMaterial> element;
diff --git a/scene/resources/mesh.cpp b/scene/resources/mesh.cpp
index 838d73edb3..805d30245a 100644
--- a/scene/resources/mesh.cpp
+++ b/scene/resources/mesh.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -706,6 +706,7 @@ bool ArrayMesh::_get(const StringName &p_name, Variant &r_ret) const {
Vector<AABB> skel_aabb = VS::get_singleton()->mesh_surface_get_skeleton_aabb(mesh, idx);
Array arr;
+ arr.resize(skel_aabb.size());
for (int i = 0; i < skel_aabb.size(); i++) {
arr[i] = skel_aabb[i];
}
diff --git a/scene/resources/mesh.h b/scene/resources/mesh.h
index aebba09ef8..2d0aef8ab0 100644
--- a/scene/resources/mesh.h
+++ b/scene/resources/mesh.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/mesh_data_tool.cpp b/scene/resources/mesh_data_tool.cpp
index 7af9086ab7..7cd765fb5d 100644
--- a/scene/resources/mesh_data_tool.cpp
+++ b/scene/resources/mesh_data_tool.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/mesh_data_tool.h b/scene/resources/mesh_data_tool.h
index f614b80c3b..8f5def72c7 100644
--- a/scene/resources/mesh_data_tool.h
+++ b/scene/resources/mesh_data_tool.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/mesh_library.cpp b/scene/resources/mesh_library.cpp
index a1d3e0ba1e..c5125d576d 100644
--- a/scene/resources/mesh_library.cpp
+++ b/scene/resources/mesh_library.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/mesh_library.h b/scene/resources/mesh_library.h
index 3ce0cf9b66..849a0577eb 100644
--- a/scene/resources/mesh_library.h
+++ b/scene/resources/mesh_library.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/multimesh.cpp b/scene/resources/multimesh.cpp
index e8e19fdb60..7084c3b4e1 100644
--- a/scene/resources/multimesh.cpp
+++ b/scene/resources/multimesh.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/multimesh.h b/scene/resources/multimesh.h
index ec5a5ca4d5..4e70907399 100644
--- a/scene/resources/multimesh.h
+++ b/scene/resources/multimesh.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/packed_scene.cpp b/scene/resources/packed_scene.cpp
index 87483a7da4..ea810edf8c 100644
--- a/scene/resources/packed_scene.cpp
+++ b/scene/resources/packed_scene.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/packed_scene.h b/scene/resources/packed_scene.h
index e5f22f5e3b..3c05929dea 100644
--- a/scene/resources/packed_scene.h
+++ b/scene/resources/packed_scene.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/particles_material.cpp b/scene/resources/particles_material.cpp
index b3fc13b79e..59fde7787e 100644
--- a/scene/resources/particles_material.cpp
+++ b/scene/resources/particles_material.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -31,7 +31,7 @@
#include "particles_material.h"
Mutex *ParticlesMaterial::material_mutex = NULL;
-SelfList<ParticlesMaterial>::List ParticlesMaterial::dirty_materials;
+SelfList<ParticlesMaterial>::List *ParticlesMaterial::dirty_materials = NULL;
Map<ParticlesMaterial::MaterialKey, ParticlesMaterial::ShaderData> ParticlesMaterial::shader_map;
ParticlesMaterial::ShaderNames *ParticlesMaterial::shader_names = NULL;
@@ -41,6 +41,8 @@ void ParticlesMaterial::init_shaders() {
material_mutex = Mutex::create();
#endif
+ dirty_materials = memnew(SelfList<ParticlesMaterial>::List);
+
shader_names = memnew(ShaderNames);
shader_names->spread = "spread";
@@ -106,12 +108,15 @@ void ParticlesMaterial::finish_shaders() {
memdelete(material_mutex);
#endif
+ memdelete(dirty_materials);
+ dirty_materials = NULL;
+
memdelete(shader_names);
}
void ParticlesMaterial::_update_shader() {
- dirty_materials.remove(&element);
+ dirty_materials->remove(&element);
MaterialKey mk = _compute_key();
if (mk.key == current_key.key)
@@ -584,9 +589,9 @@ void ParticlesMaterial::flush_changes() {
if (material_mutex)
material_mutex->lock();
- while (dirty_materials.first()) {
+ while (dirty_materials->first()) {
- dirty_materials.first()->self()->_update_shader();
+ dirty_materials->first()->self()->_update_shader();
}
if (material_mutex)
@@ -599,7 +604,7 @@ void ParticlesMaterial::_queue_shader_change() {
material_mutex->lock();
if (!element.in_list()) {
- dirty_materials.add(&element);
+ dirty_materials->add(&element);
}
if (material_mutex)
@@ -1154,7 +1159,7 @@ void ParticlesMaterial::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "color_ramp", PROPERTY_HINT_RESOURCE_TYPE, "GradientTexture"), "set_color_ramp", "get_color_ramp");
ADD_GROUP("Hue Variation", "hue_");
- ADD_PROPERTYI(PropertyInfo(Variant::REAL, "hue_variation", PROPERTY_HINT_RANGE, "-1,1,0.1"), "set_param", "get_param", PARAM_HUE_VARIATION);
+ ADD_PROPERTYI(PropertyInfo(Variant::REAL, "hue_variation", PROPERTY_HINT_RANGE, "-1,1,0.01"), "set_param", "get_param", PARAM_HUE_VARIATION);
ADD_PROPERTYI(PropertyInfo(Variant::REAL, "hue_variation_random", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_param_randomness", "get_param_randomness", PARAM_HUE_VARIATION);
ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "hue_variation_curve", PROPERTY_HINT_RESOURCE_TYPE, "CurveTexture"), "set_param_texture", "get_param_texture", PARAM_HUE_VARIATION);
ADD_GROUP("Animation", "anim_");
diff --git a/scene/resources/particles_material.h b/scene/resources/particles_material.h
index 06ebb3c4dc..8b3248a9cb 100644
--- a/scene/resources/particles_material.h
+++ b/scene/resources/particles_material.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -126,7 +126,7 @@ private:
}
static Mutex *material_mutex;
- static SelfList<ParticlesMaterial>::List dirty_materials;
+ static SelfList<ParticlesMaterial>::List *dirty_materials;
struct ShaderNames {
StringName spread;
diff --git a/scene/resources/physics_material.cpp b/scene/resources/physics_material.cpp
index 03b3589727..7d97c279ed 100644
--- a/scene/resources/physics_material.cpp
+++ b/scene/resources/physics_material.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/physics_material.h b/scene/resources/physics_material.h
index bf11bf0ac1..30660e80ac 100644
--- a/scene/resources/physics_material.h
+++ b/scene/resources/physics_material.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/plane_shape.cpp b/scene/resources/plane_shape.cpp
index 4d38ebe090..419ff8f972 100644
--- a/scene/resources/plane_shape.cpp
+++ b/scene/resources/plane_shape.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/plane_shape.h b/scene/resources/plane_shape.h
index c24c9474fb..87c367cfde 100644
--- a/scene/resources/plane_shape.h
+++ b/scene/resources/plane_shape.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/polygon_path_finder.cpp b/scene/resources/polygon_path_finder.cpp
index bd03930c9e..a45a55a258 100644
--- a/scene/resources/polygon_path_finder.cpp
+++ b/scene/resources/polygon_path_finder.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/polygon_path_finder.h b/scene/resources/polygon_path_finder.h
index 66282458af..59387e9672 100644
--- a/scene/resources/polygon_path_finder.h
+++ b/scene/resources/polygon_path_finder.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/primitive_meshes.cpp b/scene/resources/primitive_meshes.cpp
index 4906ceb2eb..9ef12aa4e6 100644
--- a/scene/resources/primitive_meshes.cpp
+++ b/scene/resources/primitive_meshes.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -306,7 +306,7 @@ void CapsuleMesh::_create_mesh_array(Array &p_arr) const {
Vector3 p = Vector3(x * radius * w, y * radius * w, z);
points.push_back(p + Vector3(0.0, 0.0, 0.5 * mid_height));
normals.push_back(p.normalized());
- ADD_TANGENT(y, -x, 0.0, -1.0)
+ ADD_TANGENT(-y, x, 0.0, 1.0)
uvs.push_back(Vector2(u, v * onethird));
point++;
@@ -345,7 +345,7 @@ void CapsuleMesh::_create_mesh_array(Array &p_arr) const {
Vector3 p = Vector3(x * radius, y * radius, z);
points.push_back(p);
normals.push_back(Vector3(x, y, 0.0));
- ADD_TANGENT(y, -x, 0.0, -1.0)
+ ADD_TANGENT(-y, x, 0.0, 1.0)
uvs.push_back(Vector2(u, onethird + (v * onethird)));
point++;
@@ -385,7 +385,7 @@ void CapsuleMesh::_create_mesh_array(Array &p_arr) const {
Vector3 p = Vector3(x * radius * w, y * radius * w, z);
points.push_back(p + Vector3(0.0, 0.0, -0.5 * mid_height));
normals.push_back(p.normalized());
- ADD_TANGENT(y, -x, 0.0, -1.0)
+ ADD_TANGENT(-y, x, 0.0, 1.0)
uvs.push_back(Vector2(u, twothirds + ((v - 1.0) * onethird)));
point++;
@@ -514,14 +514,14 @@ void CubeMesh::_create_mesh_array(Array &p_arr) const {
// front
points.push_back(Vector3(x, -y, -start_pos.z)); // double negative on the Z!
normals.push_back(Vector3(0.0, 0.0, 1.0));
- ADD_TANGENT(-1.0, 0.0, 0.0, -1.0);
+ ADD_TANGENT(1.0, 0.0, 0.0, 1.0);
uvs.push_back(Vector2(u, v));
point++;
// back
points.push_back(Vector3(-x, -y, start_pos.z));
normals.push_back(Vector3(0.0, 0.0, -1.0));
- ADD_TANGENT(1.0, 0.0, 0.0, -1.0);
+ ADD_TANGENT(-1.0, 0.0, 0.0, 1.0);
uvs.push_back(Vector2(twothirds + u, v));
point++;
@@ -568,14 +568,14 @@ void CubeMesh::_create_mesh_array(Array &p_arr) const {
// right
points.push_back(Vector3(-start_pos.x, -y, -z));
normals.push_back(Vector3(1.0, 0.0, 0.0));
- ADD_TANGENT(0.0, 0.0, 1.0, -1.0);
+ ADD_TANGENT(0.0, 0.0, -1.0, 1.0);
uvs.push_back(Vector2(onethird + u, v));
point++;
// left
points.push_back(Vector3(start_pos.x, -y, z));
normals.push_back(Vector3(-1.0, 0.0, 0.0));
- ADD_TANGENT(0.0, 0.0, -1.0, -1.0);
+ ADD_TANGENT(0.0, 0.0, 1.0, 1.0);
uvs.push_back(Vector2(u, 0.5 + v));
point++;
@@ -622,14 +622,14 @@ void CubeMesh::_create_mesh_array(Array &p_arr) const {
// top
points.push_back(Vector3(-x, -start_pos.y, -z));
normals.push_back(Vector3(0.0, 1.0, 0.0));
- ADD_TANGENT(1.0, 0.0, 0.0, -1.0);
+ ADD_TANGENT(-1.0, 0.0, 0.0, 1.0);
uvs.push_back(Vector2(onethird + u, 0.5 + v));
point++;
// bottom
points.push_back(Vector3(x, start_pos.y, -z));
normals.push_back(Vector3(0.0, -1.0, 0.0));
- ADD_TANGENT(-1.0, 0.0, 0.0, -1.0);
+ ADD_TANGENT(1.0, 0.0, 0.0, 1.0);
uvs.push_back(Vector2(twothirds + u, 0.5 + v));
point++;
@@ -773,7 +773,7 @@ void CylinderMesh::_create_mesh_array(Array &p_arr) const {
Vector3 p = Vector3(x * radius, y, z * radius);
points.push_back(p);
normals.push_back(Vector3(x, 0.0, z));
- ADD_TANGENT(-z, 0.0, x, -1.0)
+ ADD_TANGENT(z, 0.0, -x, 1.0)
uvs.push_back(Vector2(u, v * 0.5));
point++;
@@ -835,7 +835,7 @@ void CylinderMesh::_create_mesh_array(Array &p_arr) const {
thisrow = point;
points.push_back(Vector3(0.0, y, 0.0));
normals.push_back(Vector3(0.0, -1.0, 0.0));
- ADD_TANGENT(-1.0, 0.0, 0.0, -1.0)
+ ADD_TANGENT(1.0, 0.0, 0.0, 1.0)
uvs.push_back(Vector2(0.75, 0.75));
point++;
@@ -852,7 +852,7 @@ void CylinderMesh::_create_mesh_array(Array &p_arr) const {
Vector3 p = Vector3(x * bottom_radius, y, z * bottom_radius);
points.push_back(p);
normals.push_back(Vector3(0.0, -1.0, 0.0));
- ADD_TANGENT(-1.0, 0.0, 0.0, -1.0)
+ ADD_TANGENT(1.0, 0.0, 0.0, 1.0)
uvs.push_back(Vector2(u, v));
point++;
@@ -982,8 +982,8 @@ void PlaneMesh::_create_mesh_array(Array &p_arr) const {
points.push_back(Vector3(-x, 0.0, -z));
normals.push_back(Vector3(0.0, 1.0, 0.0));
- ADD_TANGENT(1.0, 0.0, 0.0, -1.0);
- uvs.push_back(Vector2(u, v));
+ ADD_TANGENT(1.0, 0.0, 0.0, 1.0);
+ uvs.push_back(Vector2(1.0 - u, 1.0 - v)); /* 1.0 - uv to match orientation with Quad */
point++;
if (i > 0 && j > 0) {
@@ -1108,14 +1108,14 @@ void PrismMesh::_create_mesh_array(Array &p_arr) const {
/* front */
points.push_back(Vector3(start_x + x, -y, -start_pos.z)); // double negative on the Z!
normals.push_back(Vector3(0.0, 0.0, 1.0));
- ADD_TANGENT(-1.0, 0.0, 0.0, -1.0);
+ ADD_TANGENT(1.0, 0.0, 0.0, 1.0);
uvs.push_back(Vector2(offset_front + u, v));
point++;
/* back */
points.push_back(Vector3(start_x + scaled_size_x - x, -y, start_pos.z));
normals.push_back(Vector3(0.0, 0.0, -1.0));
- ADD_TANGENT(1.0, 0.0, 0.0, -1.0);
+ ADD_TANGENT(-1.0, 0.0, 0.0, 1.0);
uvs.push_back(Vector2(twothirds + offset_back + u, v));
point++;
@@ -1187,14 +1187,14 @@ void PrismMesh::_create_mesh_array(Array &p_arr) const {
/* right */
points.push_back(Vector3(right, -y, -z));
normals.push_back(normal_right);
- ADD_TANGENT(0.0, 0.0, 1.0, -1.0);
+ ADD_TANGENT(0.0, 0.0, -1.0, 1.0);
uvs.push_back(Vector2(onethird + u, v));
point++;
/* left */
points.push_back(Vector3(left, -y, z));
normals.push_back(normal_left);
- ADD_TANGENT(0.0, 0.0, -1.0, -1.0);
+ ADD_TANGENT(0.0, 0.0, 1.0, 1.0);
uvs.push_back(Vector2(u, 0.5 + v));
point++;
@@ -1241,7 +1241,7 @@ void PrismMesh::_create_mesh_array(Array &p_arr) const {
/* bottom */
points.push_back(Vector3(x, start_pos.y, -z));
normals.push_back(Vector3(0.0, -1.0, 0.0));
- ADD_TANGENT(-1.0, 0.0, 0.0, -1.0);
+ ADD_TANGENT(1.0, 0.0, 0.0, 1.0);
uvs.push_back(Vector2(twothirds + u, 0.5 + v));
point++;
@@ -1468,7 +1468,7 @@ void SphereMesh::_create_mesh_array(Array &p_arr) const {
points.push_back(p);
normals.push_back(p.normalized());
};
- ADD_TANGENT(-z, 0.0, x, -1.0)
+ ADD_TANGENT(z, 0.0, -x, 1.0)
uvs.push_back(Vector2(u, v));
point++;
diff --git a/scene/resources/primitive_meshes.h b/scene/resources/primitive_meshes.h
index a91aa09ffe..88a26801b7 100644
--- a/scene/resources/primitive_meshes.h
+++ b/scene/resources/primitive_meshes.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/ray_shape.cpp b/scene/resources/ray_shape.cpp
index a9dec3e87c..b7925d8a58 100644
--- a/scene/resources/ray_shape.cpp
+++ b/scene/resources/ray_shape.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/ray_shape.h b/scene/resources/ray_shape.h
index f11b2e7c3c..89fc34051c 100644
--- a/scene/resources/ray_shape.h
+++ b/scene/resources/ray_shape.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/rectangle_shape_2d.cpp b/scene/resources/rectangle_shape_2d.cpp
index aeb22f6d0a..ff0743a8dd 100644
--- a/scene/resources/rectangle_shape_2d.cpp
+++ b/scene/resources/rectangle_shape_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/rectangle_shape_2d.h b/scene/resources/rectangle_shape_2d.h
index 2d66d328fd..27305e5918 100644
--- a/scene/resources/rectangle_shape_2d.h
+++ b/scene/resources/rectangle_shape_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/room.cpp b/scene/resources/room.cpp
index 9493f8fbe6..103a7ede74 100644
--- a/scene/resources/room.cpp
+++ b/scene/resources/room.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/room.h b/scene/resources/room.h
index d5ad847516..8990056f46 100644
--- a/scene/resources/room.h
+++ b/scene/resources/room.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/scene_format_text.cpp b/scene/resources/scene_format_text.cpp
index 5ae843f2bd..558810d92a 100644
--- a/scene/resources/scene_format_text.cpp
+++ b/scene/resources/scene_format_text.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/scene_format_text.h b/scene/resources/scene_format_text.h
index 8d1af2bbb2..8fedbd0dd6 100644
--- a/scene/resources/scene_format_text.h
+++ b/scene/resources/scene_format_text.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -128,7 +128,7 @@ public:
};
class ResourceFormatLoaderText : public ResourceFormatLoader {
-
+ GDCLASS(ResourceFormatLoaderText, ResourceFormatLoader)
public:
static ResourceFormatLoaderText *singleton;
virtual Ref<ResourceInteractiveLoader> load_interactive(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
@@ -170,6 +170,7 @@ public:
};
class ResourceFormatSaverText : public ResourceFormatSaver {
+ GDCLASS(ResourceFormatSaverText, ResourceFormatSaver)
public:
static ResourceFormatSaverText *singleton;
virtual Error save(const String &p_path, const RES &p_resource, uint32_t p_flags = 0);
diff --git a/scene/resources/segment_shape_2d.cpp b/scene/resources/segment_shape_2d.cpp
index 58027c127d..62c5f9bab3 100644
--- a/scene/resources/segment_shape_2d.cpp
+++ b/scene/resources/segment_shape_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/segment_shape_2d.h b/scene/resources/segment_shape_2d.h
index 700982ac0a..f35707b990 100644
--- a/scene/resources/segment_shape_2d.h
+++ b/scene/resources/segment_shape_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/shader.cpp b/scene/resources/shader.cpp
index 66bf3b4991..89570beb5f 100644
--- a/scene/resources/shader.cpp
+++ b/scene/resources/shader.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/shader.h b/scene/resources/shader.h
index c2c205237f..fb493046fc 100644
--- a/scene/resources/shader.h
+++ b/scene/resources/shader.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -100,6 +100,7 @@ public:
VARIANT_ENUM_CAST(Shader::Mode);
class ResourceFormatLoaderShader : public ResourceFormatLoader {
+ GDCLASS(ResourceFormatLoaderShader, ResourceFormatLoader)
public:
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
virtual void get_recognized_extensions(List<String> *p_extensions) const;
@@ -108,6 +109,7 @@ public:
};
class ResourceFormatSaverShader : public ResourceFormatSaver {
+ GDCLASS(ResourceFormatSaverShader, ResourceFormatSaver)
public:
virtual Error save(const String &p_path, const RES &p_resource, uint32_t p_flags = 0);
virtual void get_recognized_extensions(const RES &p_resource, List<String> *p_extensions) const;
diff --git a/scene/resources/shape.cpp b/scene/resources/shape.cpp
index 214e2e8edc..825b7f4c8b 100644
--- a/scene/resources/shape.cpp
+++ b/scene/resources/shape.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/shape.h b/scene/resources/shape.h
index 6643f4ee44..de99a967a8 100644
--- a/scene/resources/shape.h
+++ b/scene/resources/shape.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/shape_2d.cpp b/scene/resources/shape_2d.cpp
index 0ca518e5bb..e2407e4423 100644
--- a/scene/resources/shape_2d.cpp
+++ b/scene/resources/shape_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -59,37 +59,37 @@ bool Shape2D::collide(const Transform2D &p_local_xform, const Ref<Shape2D> &p_sh
return Physics2DServer::get_singleton()->shape_collide(get_rid(), p_local_xform, Vector2(), p_shape->get_rid(), p_shape_xform, Vector2(), NULL, 0, r);
}
-Variant Shape2D::collide_with_motion_and_get_contacts(const Transform2D &p_local_xform, const Vector2 &p_local_motion, const Ref<Shape2D> &p_shape, const Transform2D &p_shape_xform, const Vector2 &p_shape_motion) {
+Array Shape2D::collide_with_motion_and_get_contacts(const Transform2D &p_local_xform, const Vector2 &p_local_motion, const Ref<Shape2D> &p_shape, const Transform2D &p_shape_xform, const Vector2 &p_shape_motion) {
- ERR_FAIL_COND_V(p_shape.is_null(), Variant());
+ ERR_FAIL_COND_V(p_shape.is_null(), Array());
const int max_contacts = 16;
Vector2 result[max_contacts * 2];
int contacts = 0;
if (!Physics2DServer::get_singleton()->shape_collide(get_rid(), p_local_xform, p_local_motion, p_shape->get_rid(), p_shape_xform, p_shape_motion, result, max_contacts, contacts))
- return Variant();
+ return Array();
Array results;
results.resize(contacts * 2);
- for (int i = 0; i < contacts; i++) {
+ for (int i = 0; i < contacts * 2; i++) {
results[i] = result[i];
}
return results;
}
-Variant Shape2D::collide_and_get_contacts(const Transform2D &p_local_xform, const Ref<Shape2D> &p_shape, const Transform2D &p_shape_xform) {
+Array Shape2D::collide_and_get_contacts(const Transform2D &p_local_xform, const Ref<Shape2D> &p_shape, const Transform2D &p_shape_xform) {
- ERR_FAIL_COND_V(p_shape.is_null(), Variant());
+ ERR_FAIL_COND_V(p_shape.is_null(), Array());
const int max_contacts = 16;
Vector2 result[max_contacts * 2];
int contacts = 0;
if (!Physics2DServer::get_singleton()->shape_collide(get_rid(), p_local_xform, Vector2(), p_shape->get_rid(), p_shape_xform, Vector2(), result, max_contacts, contacts))
- return Variant();
+ return Array();
Array results;
results.resize(contacts * 2);
- for (int i = 0; i < contacts; i++) {
+ for (int i = 0; i < contacts * 2; i++) {
results[i] = result[i];
}
diff --git a/scene/resources/shape_2d.h b/scene/resources/shape_2d.h
index fa39daa565..da9b80477c 100644
--- a/scene/resources/shape_2d.h
+++ b/scene/resources/shape_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -53,8 +53,8 @@ public:
bool collide_with_motion(const Transform2D &p_local_xform, const Vector2 &p_local_motion, const Ref<Shape2D> &p_shape, const Transform2D &p_shape_xform, const Vector2 &p_shape_motion);
bool collide(const Transform2D &p_local_xform, const Ref<Shape2D> &p_shape, const Transform2D &p_shape_xform);
- Variant collide_with_motion_and_get_contacts(const Transform2D &p_local_xform, const Vector2 &p_local_motion, const Ref<Shape2D> &p_shape, const Transform2D &p_shape_xform, const Vector2 &p_shape_motion);
- Variant collide_and_get_contacts(const Transform2D &p_local_xform, const Ref<Shape2D> &p_shape, const Transform2D &p_shape_xform);
+ Array collide_with_motion_and_get_contacts(const Transform2D &p_local_xform, const Vector2 &p_local_motion, const Ref<Shape2D> &p_shape, const Transform2D &p_shape_xform, const Vector2 &p_shape_motion);
+ Array collide_and_get_contacts(const Transform2D &p_local_xform, const Ref<Shape2D> &p_shape, const Transform2D &p_shape_xform);
virtual void draw(const RID &p_to_rid, const Color &p_color) {}
virtual Rect2 get_rect() const { return Rect2(); }
diff --git a/scene/resources/shape_line_2d.cpp b/scene/resources/shape_line_2d.cpp
index 1a81eea6e5..4ca535658f 100644
--- a/scene/resources/shape_line_2d.cpp
+++ b/scene/resources/shape_line_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/shape_line_2d.h b/scene/resources/shape_line_2d.h
index 7d31941558..dd3dbe3a43 100644
--- a/scene/resources/shape_line_2d.h
+++ b/scene/resources/shape_line_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/sky_box.cpp b/scene/resources/sky_box.cpp
index 347bca4400..d9da85310e 100644
--- a/scene/resources/sky_box.cpp
+++ b/scene/resources/sky_box.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/sky_box.h b/scene/resources/sky_box.h
index bbb852822d..af10803b36 100644
--- a/scene/resources/sky_box.h
+++ b/scene/resources/sky_box.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/space_2d.cpp b/scene/resources/space_2d.cpp
index 062f4099db..e6d366c501 100644
--- a/scene/resources/space_2d.cpp
+++ b/scene/resources/space_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/space_2d.h b/scene/resources/space_2d.h
index 1143ad2bd5..ced7c87406 100644
--- a/scene/resources/space_2d.h
+++ b/scene/resources/space_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/sphere_shape.cpp b/scene/resources/sphere_shape.cpp
index d8ca1cf3f1..492cf3959d 100644
--- a/scene/resources/sphere_shape.cpp
+++ b/scene/resources/sphere_shape.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/sphere_shape.h b/scene/resources/sphere_shape.h
index 5dd7daabc5..682928e885 100644
--- a/scene/resources/sphere_shape.h
+++ b/scene/resources/sphere_shape.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/style_box.cpp b/scene/resources/style_box.cpp
index 087990c308..db7153e9ad 100644
--- a/scene/resources/style_box.cpp
+++ b/scene/resources/style_box.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/style_box.h b/scene/resources/style_box.h
index df3ebe1c36..911a457990 100644
--- a/scene/resources/style_box.h
+++ b/scene/resources/style_box.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/surface_tool.cpp b/scene/resources/surface_tool.cpp
index 5d4c7861e3..1684cbf15f 100644
--- a/scene/resources/surface_tool.cpp
+++ b/scene/resources/surface_tool.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -764,10 +764,22 @@ void SurfaceTool::append_from(const Ref<Mesh> &p_existing, int p_surface, const
}
//mikktspace callbacks
+namespace {
+struct TangentGenerationContextUserData {
+ Vector<List<SurfaceTool::Vertex>::Element *> vertices;
+ Vector<List<int>::Element *> indices;
+};
+} // namespace
+
int SurfaceTool::mikktGetNumFaces(const SMikkTSpaceContext *pContext) {
- Vector<List<Vertex>::Element *> &varr = *((Vector<List<Vertex>::Element *> *)pContext->m_pUserData);
- return varr.size() / 3;
+ TangentGenerationContextUserData &triangle_data = *reinterpret_cast<TangentGenerationContextUserData *>(pContext->m_pUserData);
+
+ if (triangle_data.indices.size() > 0) {
+ return triangle_data.indices.size() / 3;
+ } else {
+ return triangle_data.vertices.size() / 3;
+ }
}
int SurfaceTool::mikktGetNumVerticesOfFace(const SMikkTSpaceContext *pContext, const int iFace) {
@@ -775,8 +787,17 @@ int SurfaceTool::mikktGetNumVerticesOfFace(const SMikkTSpaceContext *pContext, c
}
void SurfaceTool::mikktGetPosition(const SMikkTSpaceContext *pContext, float fvPosOut[], const int iFace, const int iVert) {
- Vector<List<Vertex>::Element *> &varr = *((Vector<List<Vertex>::Element *> *)pContext->m_pUserData);
- Vector3 v = varr[iFace * 3 + iVert]->get().vertex;
+ TangentGenerationContextUserData &triangle_data = *reinterpret_cast<TangentGenerationContextUserData *>(pContext->m_pUserData);
+ Vector3 v;
+ if (triangle_data.indices.size() > 0) {
+ int index = triangle_data.indices[iFace * 3 + iVert]->get();
+ if (index < triangle_data.vertices.size()) {
+ v = triangle_data.vertices[index]->get().vertex;
+ }
+ } else {
+ v = triangle_data.vertices[iFace * 3 + iVert]->get().vertex;
+ }
+
fvPosOut[0] = v.x;
fvPosOut[1] = v.y;
fvPosOut[2] = v.z;
@@ -784,38 +805,56 @@ void SurfaceTool::mikktGetPosition(const SMikkTSpaceContext *pContext, float fvP
void SurfaceTool::mikktGetNormal(const SMikkTSpaceContext *pContext, float fvNormOut[], const int iFace, const int iVert) {
- Vector<List<Vertex>::Element *> &varr = *((Vector<List<Vertex>::Element *> *)pContext->m_pUserData);
- Vector3 v = varr[iFace * 3 + iVert]->get().normal;
+ TangentGenerationContextUserData &triangle_data = *reinterpret_cast<TangentGenerationContextUserData *>(pContext->m_pUserData);
+ Vector3 v;
+ if (triangle_data.indices.size() > 0) {
+ int index = triangle_data.indices[iFace * 3 + iVert]->get();
+ if (index < triangle_data.vertices.size()) {
+ v = triangle_data.vertices[index]->get().normal;
+ }
+ } else {
+ v = triangle_data.vertices[iFace * 3 + iVert]->get().normal;
+ }
+
fvNormOut[0] = v.x;
fvNormOut[1] = v.y;
fvNormOut[2] = v.z;
}
void SurfaceTool::mikktGetTexCoord(const SMikkTSpaceContext *pContext, float fvTexcOut[], const int iFace, const int iVert) {
- Vector<List<Vertex>::Element *> &varr = *((Vector<List<Vertex>::Element *> *)pContext->m_pUserData);
- Vector2 v = varr[iFace * 3 + iVert]->get().uv;
+ TangentGenerationContextUserData &triangle_data = *reinterpret_cast<TangentGenerationContextUserData *>(pContext->m_pUserData);
+ Vector2 v;
+ if (triangle_data.indices.size() > 0) {
+ int index = triangle_data.indices[iFace * 3 + iVert]->get();
+ if (index < triangle_data.vertices.size()) {
+ v = triangle_data.vertices[index]->get().uv;
+ }
+ } else {
+ v = triangle_data.vertices[iFace * 3 + iVert]->get().uv;
+ }
+
fvTexcOut[0] = v.x;
fvTexcOut[1] = v.y;
- //fvTexcOut[1]=1.0-v.y;
}
void SurfaceTool::mikktSetTSpaceDefault(const SMikkTSpaceContext *pContext, const float fvTangent[], const float fvBiTangent[], const float fMagS, const float fMagT,
const tbool bIsOrientationPreserving, const int iFace, const int iVert) {
- Vector<List<Vertex>::Element *> &varr = *((Vector<List<Vertex>::Element *> *)pContext->m_pUserData);
- Vertex *vtx = &varr[iFace * 3 + iVert]->get();
-
- vtx->tangent = Vector3(fvTangent[0], fvTangent[1], fvTangent[2]);
- vtx->binormal = Vector3(fvBiTangent[0], fvBiTangent[1], fvBiTangent[2]);
-}
-
-void SurfaceTool::mikktSetTSpaceBasic(const SMikkTSpaceContext *pContext, const float fvTangent[], const float fSign, const int iFace, const int iVert) {
-
- Vector<List<Vertex>::Element *> &varr = *((Vector<List<Vertex>::Element *> *)pContext->m_pUserData);
- Vertex &vtx = varr[iFace * 3 + iVert]->get();
+ TangentGenerationContextUserData &triangle_data = *reinterpret_cast<TangentGenerationContextUserData *>(pContext->m_pUserData);
+ Vertex *vtx = NULL;
+ if (triangle_data.indices.size() > 0) {
+ int index = triangle_data.indices[iFace * 3 + iVert]->get();
+ if (index < triangle_data.vertices.size()) {
+ vtx = &triangle_data.vertices[index]->get();
+ }
+ } else {
+ vtx = &triangle_data.vertices[iFace * 3 + iVert]->get();
+ }
- vtx.tangent = Vector3(fvTangent[0], fvTangent[1], fvTangent[2]);
- vtx.binormal = vtx.normal.cross(vtx.tangent) * fSign;
+ if (vtx != NULL) {
+ vtx->tangent = Vector3(fvTangent[0], fvTangent[1], fvTangent[2]);
+ vtx->binormal = Vector3(-fvBiTangent[0], -fvBiTangent[1], -fvBiTangent[2]); // for some reason these are reversed, something with the coordinate system in Godot
+ }
}
void SurfaceTool::generate_tangents() {
@@ -823,10 +862,6 @@ void SurfaceTool::generate_tangents() {
ERR_FAIL_COND(!(format & Mesh::ARRAY_FORMAT_TEX_UV));
ERR_FAIL_COND(!(format & Mesh::ARRAY_FORMAT_NORMAL));
- bool indexed = index_array.size() > 0;
- if (indexed)
- deindex();
-
SMikkTSpaceInterface mkif;
mkif.m_getNormal = mikktGetNormal;
mkif.m_getNumFaces = mikktGetNumFaces;
@@ -839,24 +874,25 @@ void SurfaceTool::generate_tangents() {
SMikkTSpaceContext msc;
msc.m_pInterface = &mkif;
- Vector<List<Vertex>::Element *> vtx;
- vtx.resize(vertex_array.size());
+ TangentGenerationContextUserData triangle_data;
+ triangle_data.vertices.resize(vertex_array.size());
int idx = 0;
for (List<Vertex>::Element *E = vertex_array.front(); E; E = E->next()) {
- vtx.write[idx++] = E;
+ triangle_data.vertices.write[idx++] = E;
E->get().binormal = Vector3();
E->get().tangent = Vector3();
}
- msc.m_pUserData = &vtx;
+ triangle_data.indices.resize(index_array.size());
+ idx = 0;
+ for (List<int>::Element *E = index_array.front(); E; E = E->next()) {
+ triangle_data.indices.write[idx++] = E;
+ }
+ msc.m_pUserData = &triangle_data;
bool res = genTangSpaceDefault(&msc);
ERR_FAIL_COND(!res);
format |= Mesh::ARRAY_FORMAT_TANGENT;
-
- if (indexed) {
- index();
- }
}
void SurfaceTool::generate_normals(bool p_flip) {
diff --git a/scene/resources/surface_tool.h b/scene/resources/surface_tool.h
index 459d399380..754254150d 100644
--- a/scene/resources/surface_tool.h
+++ b/scene/resources/surface_tool.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -90,7 +90,6 @@ private:
static void mikktGetPosition(const SMikkTSpaceContext *pContext, float fvPosOut[], const int iFace, const int iVert);
static void mikktGetNormal(const SMikkTSpaceContext *pContext, float fvNormOut[], const int iFace, const int iVert);
static void mikktGetTexCoord(const SMikkTSpaceContext *pContext, float fvTexcOut[], const int iFace, const int iVert);
- static void mikktSetTSpaceBasic(const SMikkTSpaceContext *pContext, const float fvTangent[], const float fSign, const int iFace, const int iVert);
static void mikktSetTSpaceDefault(const SMikkTSpaceContext *pContext, const float fvTangent[], const float fvBiTangent[], const float fMagS, const float fMagT,
const tbool bIsOrientationPreserving, const int iFace, const int iVert);
diff --git a/scene/resources/text_file.cpp b/scene/resources/text_file.cpp
index 2af24ad2d5..37bdd691b4 100644
--- a/scene/resources/text_file.cpp
+++ b/scene/resources/text_file.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/text_file.h b/scene/resources/text_file.h
index 3abc769dc6..91bb98a3b1 100644
--- a/scene/resources/text_file.h
+++ b/scene/resources/text_file.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/texture.cpp b/scene/resources/texture.cpp
index 682bfebdd2..4984af57b5 100644
--- a/scene/resources/texture.cpp
+++ b/scene/resources/texture.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -324,7 +324,7 @@ bool ImageTexture::is_pixel_opaque(int p_x, int p_y) const {
int y = p_y * ah / h;
x = CLAMP(x, 0, aw);
- y = CLAMP(y, 0, aw);
+ y = CLAMP(y, 0, ah);
return alpha_cache->get_bit(Point2(x, y));
}
@@ -791,7 +791,7 @@ bool StreamTexture::is_pixel_opaque(int p_x, int p_y) const {
int y = p_y * ah / h;
x = CLAMP(x, 0, aw);
- y = CLAMP(y, 0, aw);
+ y = CLAMP(y, 0, ah);
return alpha_cache->get_bit(Point2(x, y));
}
@@ -994,11 +994,11 @@ void AtlasTexture::_bind_methods() {
void AtlasTexture::draw(RID p_canvas_item, const Point2 &p_pos, const Color &p_modulate, bool p_transpose, const Ref<Texture> &p_normal_map) const {
- Rect2 rc = region;
-
if (!atlas.is_valid())
return;
+ Rect2 rc = region;
+
if (rc.size.width == 0) {
rc.size.width = atlas->get_width();
}
@@ -1013,11 +1013,11 @@ void AtlasTexture::draw(RID p_canvas_item, const Point2 &p_pos, const Color &p_m
void AtlasTexture::draw_rect(RID p_canvas_item, const Rect2 &p_rect, bool p_tile, const Color &p_modulate, bool p_transpose, const Ref<Texture> &p_normal_map) const {
- Rect2 rc = region;
-
if (!atlas.is_valid())
return;
+ Rect2 rc = region;
+
if (rc.size.width == 0) {
rc.size.width = atlas->get_width();
}
@@ -1048,11 +1048,11 @@ void AtlasTexture::draw_rect_region(RID p_canvas_item, const Rect2 &p_rect, cons
bool AtlasTexture::get_rect_region(const Rect2 &p_rect, const Rect2 &p_src_rect, Rect2 &r_rect, Rect2 &r_src_rect) const {
- Rect2 rc = region;
-
if (!atlas.is_valid())
return false;
+ Rect2 rc = region;
+
Rect2 src = p_src_rect;
if (src.size == Size2()) {
src.size = rc.size;
@@ -1084,11 +1084,17 @@ bool AtlasTexture::get_rect_region(const Rect2 &p_rect, const Rect2 &p_src_rect,
bool AtlasTexture::is_pixel_opaque(int p_x, int p_y) const {
- if (atlas.is_valid()) {
- return atlas->is_pixel_opaque(p_x + region.position.x + margin.position.x, p_x + region.position.y + margin.position.y);
- }
+ if (!atlas.is_valid())
+ return true;
- return true;
+ int x = p_x + region.position.x - margin.position.x;
+ int y = p_y + region.position.y - margin.position.y;
+
+ // margin edge may outside of atlas
+ if (x < 0 || x >= atlas->get_width()) return false;
+ if (y < 0 || y >= atlas->get_height()) return false;
+
+ return atlas->is_pixel_opaque(x, y);
}
AtlasTexture::AtlasTexture() {
@@ -1203,6 +1209,17 @@ Ref<Texture> LargeTexture::get_piece_texture(int p_idx) const {
ERR_FAIL_INDEX_V(p_idx, pieces.size(), Ref<Texture>());
return pieces[p_idx].texture;
}
+Ref<Image> LargeTexture::to_image() const {
+
+ Ref<Image> img = memnew(Image(this->get_width(), this->get_height(), false, Image::FORMAT_RGBA8));
+ for (int i = 0; i < pieces.size(); i++) {
+
+ Ref<Image> src_img = pieces[i].texture->get_data();
+ img->blit_rect(src_img, Rect2(0, 0, src_img->get_width(), src_img->get_height()), pieces[i].offset);
+ }
+
+ return img;
+}
void LargeTexture::_bind_methods() {
@@ -1958,8 +1975,8 @@ void AnimatedTexture::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::REAL, "fps", PROPERTY_HINT_RANGE, "0,1024,0.1"), "set_fps", "get_fps");
for (int i = 0; i < MAX_FRAMES; i++) {
- ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "frame_" + itos(i) + "/texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL), "set_frame_texture", "get_frame_texture", i);
- ADD_PROPERTYI(PropertyInfo(Variant::REAL, "frame_" + itos(i) + "/delay_sec", PROPERTY_HINT_RANGE, "0.0,16.0,0.01", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL), "set_frame_delay", "get_frame_delay", i);
+ ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "frame_" + itos(i) + "/texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_INTERNAL), "set_frame_texture", "get_frame_texture", i);
+ ADD_PROPERTYI(PropertyInfo(Variant::REAL, "frame_" + itos(i) + "/delay_sec", PROPERTY_HINT_RANGE, "0.0,16.0,0.01", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_INTERNAL), "set_frame_delay", "get_frame_delay", i);
}
}
@@ -2065,7 +2082,7 @@ void TextureLayered::create(uint32_t p_width, uint32_t p_height, uint32_t p_dept
width = p_width;
height = p_height;
depth = p_depth;
-
+ format = p_format;
flags = p_flags;
}
diff --git a/scene/resources/texture.h b/scene/resources/texture.h
index e9b69e9cb1..2b67ebec62 100644
--- a/scene/resources/texture.h
+++ b/scene/resources/texture.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -236,6 +236,7 @@ public:
};
class ResourceFormatLoaderStreamTexture : public ResourceFormatLoader {
+ GDCLASS(ResourceFormatLoaderStreamTexture, ResourceFormatLoader)
public:
virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
virtual void get_recognized_extensions(List<String> *p_extensions) const;
@@ -329,6 +330,7 @@ public:
int get_piece_count() const;
Vector2 get_piece_offset(int p_idx) const;
Ref<Texture> get_piece_texture(int p_idx) const;
+ Ref<Image> to_image() const;
virtual void draw(RID p_canvas_item, const Point2 &p_pos, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false, const Ref<Texture> &p_normal_map = Ref<Texture>()) const;
virtual void draw_rect(RID p_canvas_item, const Rect2 &p_rect, bool p_tile = false, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false, const Ref<Texture> &p_normal_map = Ref<Texture>()) const;
@@ -489,6 +491,7 @@ public:
};
class ResourceFormatLoaderTextureLayered : public ResourceFormatLoader {
+ GDCLASS(ResourceFormatLoaderTextureLayered, ResourceFormatLoader)
public:
enum Compression {
COMPRESSION_LOSSLESS,
diff --git a/scene/resources/theme.cpp b/scene/resources/theme.cpp
index b102d477f2..786a136040 100644
--- a/scene/resources/theme.cpp
+++ b/scene/resources/theme.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -39,26 +39,6 @@ void Theme::_emit_theme_changed() {
emit_changed();
}
-void Theme::_ref_font(Ref<Font> p_sc) {
-
- if (!font_refcount.has(p_sc)) {
- font_refcount[p_sc] = 1;
- p_sc->connect("changed", this, "_emit_theme_changed");
- } else {
- font_refcount[p_sc] += 1;
- }
-}
-
-void Theme::_unref_font(Ref<Font> p_sc) {
-
- ERR_FAIL_COND(!font_refcount.has(p_sc));
- font_refcount[p_sc]--;
- if (font_refcount[p_sc] == 0) {
- p_sc->disconnect("changed", this, "_emit_theme_changed");
- font_refcount.erase(p_sc);
- }
-}
-
bool Theme::_set(const StringName &p_name, const Variant &p_value) {
String sname = p_name;
@@ -217,13 +197,13 @@ void Theme::set_default_theme_font(const Ref<Font> &p_default_font) {
return;
if (default_theme_font.is_valid()) {
- _unref_font(default_theme_font);
+ default_theme_font->disconnect("changed", this, "_emit_theme_changed");
}
default_theme_font = p_default_font;
if (default_theme_font.is_valid()) {
- _ref_font(default_theme_font);
+ default_theme_font->connect("changed", this, "_emit_theme_changed", varray(), CONNECT_REFERENCE_COUNTED);
}
_change_notify();
@@ -263,8 +243,16 @@ void Theme::set_icon(const StringName &p_name, const StringName &p_type, const R
bool new_value = !icon_map.has(p_type) || !icon_map[p_type].has(p_name);
+ if (icon_map[p_type].has(p_name) && icon_map[p_type][p_name].is_valid()) {
+ icon_map[p_type][p_name]->disconnect("changed", this, "_emit_theme_changed");
+ }
+
icon_map[p_type][p_name] = p_icon;
+ if (p_icon.is_valid()) {
+ icon_map[p_type][p_name]->connect("changed", this, "_emit_theme_changed", varray(), CONNECT_REFERENCE_COUNTED);
+ }
+
if (new_value) {
_change_notify();
emit_changed();
@@ -290,7 +278,12 @@ void Theme::clear_icon(const StringName &p_name, const StringName &p_type) {
ERR_FAIL_COND(!icon_map.has(p_type));
ERR_FAIL_COND(!icon_map[p_type].has(p_name));
+ if (icon_map[p_type][p_name].is_valid()) {
+ icon_map[p_type][p_name]->disconnect("changed", this, "_emit_theme_changed");
+ }
+
icon_map[p_type].erase(p_name);
+
_change_notify();
emit_changed();
}
@@ -358,8 +351,16 @@ void Theme::set_stylebox(const StringName &p_name, const StringName &p_type, con
bool new_value = !style_map.has(p_type) || !style_map[p_type].has(p_name);
+ if (style_map[p_type].has(p_name) && style_map[p_type][p_name].is_valid()) {
+ style_map[p_type][p_name]->disconnect("changed", this, "_emit_theme_changed");
+ }
+
style_map[p_type][p_name] = p_style;
+ if (p_style.is_valid()) {
+ style_map[p_type][p_name]->connect("changed", this, "_emit_theme_changed", varray(), CONNECT_REFERENCE_COUNTED);
+ }
+
if (new_value)
_change_notify();
emit_changed();
@@ -385,7 +386,12 @@ void Theme::clear_stylebox(const StringName &p_name, const StringName &p_type) {
ERR_FAIL_COND(!style_map.has(p_type));
ERR_FAIL_COND(!style_map[p_type].has(p_name));
+ if (style_map[p_type][p_name].is_valid()) {
+ style_map[p_type][p_name]->disconnect("changed", this, "_emit_theme_changed");
+ }
+
style_map[p_type].erase(p_name);
+
_change_notify();
emit_changed();
}
@@ -416,15 +422,14 @@ void Theme::set_font(const StringName &p_name, const StringName &p_type, const R
bool new_value = !font_map.has(p_type) || !font_map[p_type].has(p_name);
- if (!new_value) {
- if (font_map[p_type][p_name].is_valid()) {
- _unref_font(font_map[p_type][p_name]);
- }
+ if (font_map[p_type][p_name].is_valid()) {
+ font_map[p_type][p_name]->disconnect("changed", this, "_emit_theme_changed");
}
+
font_map[p_type][p_name] = p_font;
if (p_font.is_valid()) {
- _ref_font(p_font);
+ font_map[p_type][p_name]->connect("changed", this, "_emit_theme_changed", varray(), CONNECT_REFERENCE_COUNTED);
}
if (new_value) {
@@ -452,8 +457,8 @@ void Theme::clear_font(const StringName &p_name, const StringName &p_type) {
ERR_FAIL_COND(!font_map.has(p_type));
ERR_FAIL_COND(!font_map[p_type].has(p_name));
- if (font_map.has(p_type) && font_map[p_type].has(p_name) && font_map[p_type][p_name].is_valid()) {
- _unref_font(font_map[p_type][p_name]);
+ if (font_map[p_type][p_name].is_valid()) {
+ font_map[p_type][p_name]->disconnect("changed", this, "_emit_theme_changed");
}
font_map[p_type].erase(p_name);
@@ -570,15 +575,91 @@ void Theme::get_constant_list(StringName p_type, List<StringName> *p_list) const
}
}
+void Theme::clear() {
+
+ //these need disconnecting
+ {
+ const StringName *K = NULL;
+ while ((K = icon_map.next(K))) {
+ const StringName *L = NULL;
+ while ((L = icon_map[*K].next(L))) {
+ icon_map[*K][*L]->disconnect("changed", this, "_emit_theme_changed");
+ }
+ }
+ }
+
+ {
+ const StringName *K = NULL;
+ while ((K = style_map.next(K))) {
+ const StringName *L = NULL;
+ while ((L = style_map[*K].next(L))) {
+ style_map[*K][*L]->disconnect("changed", this, "_emit_theme_changed");
+ }
+ }
+ }
+
+ {
+ const StringName *K = NULL;
+ while ((K = font_map.next(K))) {
+ const StringName *L = NULL;
+ while ((L = font_map[*K].next(L))) {
+ font_map[*K][*L]->disconnect("changed", this, "_emit_theme_changed");
+ }
+ }
+ }
+
+ icon_map.clear();
+ style_map.clear();
+ font_map.clear();
+ shader_map.clear();
+ color_map.clear();
+ constant_map.clear();
+
+ _change_notify();
+ emit_changed();
+}
+
void Theme::copy_default_theme() {
Ref<Theme> default_theme = get_default();
- icon_map = default_theme->icon_map;
- style_map = default_theme->style_map;
- font_map = default_theme->font_map;
+ //these need reconnecting, so add normally
+ {
+ const StringName *K = NULL;
+ while ((K = default_theme->icon_map.next(K))) {
+ const StringName *L = NULL;
+ while ((L = default_theme->icon_map[*K].next(L))) {
+ set_icon(*K, *L, default_theme->icon_map[*K][*L]);
+ }
+ }
+ }
+
+ {
+ const StringName *K = NULL;
+ while ((K = default_theme->style_map.next(K))) {
+ const StringName *L = NULL;
+ while ((L = default_theme->style_map[*K].next(L))) {
+ set_stylebox(*K, *L, default_theme->style_map[*K][*L]);
+ }
+ }
+ }
+
+ {
+ const StringName *K = NULL;
+ while ((K = default_theme->font_map.next(K))) {
+ const StringName *L = NULL;
+ while ((L = default_theme->font_map[*K].next(L))) {
+ set_font(*K, *L, default_theme->font_map[*K][*L]);
+ }
+ }
+ }
+
+ //these are ok to just copy
+
color_map = default_theme->color_map;
constant_map = default_theme->constant_map;
+ shader_map = default_theme->shader_map;
+
_change_notify();
emit_changed();
}
@@ -661,6 +742,8 @@ void Theme::_bind_methods() {
ClassDB::bind_method(D_METHOD("clear_constant", "name", "type"), &Theme::clear_constant);
ClassDB::bind_method(D_METHOD("get_constant_list", "type"), &Theme::_get_constant_list);
+ ClassDB::bind_method(D_METHOD("clear"), &Theme::clear);
+
ClassDB::bind_method(D_METHOD("set_default_font", "font"), &Theme::set_default_theme_font);
ClassDB::bind_method(D_METHOD("get_default_font"), &Theme::get_default_theme_font);
@@ -678,411 +761,3 @@ Theme::Theme() {
Theme::~Theme() {
}
-
-RES ResourceFormatLoaderTheme::load(const String &p_path, const String &p_original_path, Error *r_error) {
- if (r_error)
- *r_error = ERR_CANT_OPEN;
-
- Error err;
- FileAccess *f = FileAccess::open(p_path, FileAccess::READ, &err);
-
- ERR_EXPLAIN("Unable to open theme file: " + p_path);
- ERR_FAIL_COND_V(err, RES());
- String base_path = p_path.get_base_dir();
- Ref<Theme> theme(memnew(Theme));
- Map<StringName, Variant> library;
- if (r_error)
- *r_error = ERR_FILE_CORRUPT;
-
- bool reading_library = false;
- int line = 0;
-
- while (!f->eof_reached()) {
-
- String l = f->get_line().strip_edges();
- line++;
-
- int comment = l.find(";");
- if (comment != -1)
- l = l.substr(0, comment);
- if (l == "")
- continue;
-
- if (l.begins_with("[")) {
- if (l == "[library]") {
- reading_library = true;
- } else if (l == "[theme]") {
- reading_library = false;
- } else {
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": Unknown section type: '" + l + "'.");
- ERR_FAIL_V(RES());
- }
- continue;
- }
-
- int eqpos = l.find("=");
- if (eqpos == -1) {
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": Expected '='.");
- ERR_FAIL_V(RES());
- }
-
- String right = l.substr(eqpos + 1, l.length()).strip_edges();
- if (right == "") {
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": Expected value after '='.");
- ERR_FAIL_V(RES());
- }
-
- Variant value;
-
- if (right.is_valid_integer()) {
- //is number
- value = right.to_int();
- } else if (right.is_valid_html_color()) {
- //is html color
- value = Color::html(right);
- } else if (right.begins_with("@")) { //reference
-
- String reference = right.substr(1, right.length());
- if (!library.has(reference)) {
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": Invalid reference to '" + reference + "'.");
- ERR_FAIL_V(RES());
- }
-
- value = library[reference];
-
- } else if (right.begins_with("default")) { //use default
- //do none
- } else {
- //attempt to parse a constructor
- int popenpos = right.find("(");
-
- if (popenpos == -1) {
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": Invalid constructor syntax: " + right);
- ERR_FAIL_V(RES());
- }
-
- int pclosepos = right.find_last(")");
-
- if (pclosepos == -1) {
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": Invalid constructor parameter syntax: " + right);
- ERR_FAIL_V(RES());
- }
-
- String type = right.substr(0, popenpos);
- String param = right.substr(popenpos + 1, pclosepos - popenpos - 1);
-
- if (type == "icon") {
-
- String path;
-
- if (param.is_abs_path())
- path = param;
- else
- path = base_path + "/" + param;
-
- Ref<Texture> texture = ResourceLoader::load(path);
- if (!texture.is_valid()) {
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": Couldn't find icon at path: " + path);
- ERR_FAIL_V(RES());
- }
-
- value = texture;
-
- } else if (type == "sbox") {
-
- String path;
-
- if (param.is_abs_path())
- path = param;
- else
- path = base_path + "/" + param;
-
- Ref<StyleBox> stylebox = ResourceLoader::load(path);
- if (!stylebox.is_valid()) {
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": Couldn't find stylebox at path: " + path);
- ERR_FAIL_V(RES());
- }
-
- value = stylebox;
-
- } else if (type == "sboxt") {
-
- Vector<String> params = param.split(",");
- if (params.size() != 5 && params.size() != 9) {
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": Invalid param count for sboxt(): '" + right + "'.");
- ERR_FAIL_V(RES());
- }
-
- String path = params[0];
-
- if (!param.is_abs_path())
- path = base_path + "/" + path;
-
- Ref<Texture> tex = ResourceLoader::load(path);
- if (tex.is_null()) {
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": Could not open texture for sboxt at path: '" + params[0] + "'.");
- ERR_FAIL_V(RES());
- }
-
- Ref<StyleBoxTexture> sbtex(memnew(StyleBoxTexture));
-
- sbtex->set_texture(tex);
-
- for (int i = 0; i < 4; i++) {
- if (!params[i + 1].is_valid_integer()) {
-
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": Invalid expand margin parameter for sboxt #" + itos(i + 1) + ", expected integer constant, got: '" + params[i + 1] + "'.");
- ERR_FAIL_V(RES());
- }
-
- int margin = params[i + 1].to_int();
- sbtex->set_expand_margin_size(Margin(i), margin);
- }
-
- if (params.size() == 9) {
-
- for (int i = 0; i < 4; i++) {
-
- if (!params[i + 5].is_valid_integer()) {
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": Invalid expand margin parameter for sboxt #" + itos(i + 5) + ", expected integer constant, got: '" + params[i + 5] + "'.");
- ERR_FAIL_V(RES());
- }
-
- int margin = params[i + 5].to_int();
- sbtex->set_margin_size(Margin(i), margin);
- }
- }
-
- value = sbtex;
- } else if (type == "sboxf") {
-
- Vector<String> params = param.split(",");
- if (params.size() < 2) {
-
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": Invalid param count for sboxf(): '" + right + "'.");
- ERR_FAIL_V(RES());
- }
-
- Ref<StyleBoxFlat> sbflat(memnew(StyleBoxFlat));
-
- if (!params[0].is_valid_integer()) {
-
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": Expected integer numeric constant for parameter 0 (border size).");
- ERR_FAIL_V(RES());
- }
-
- sbflat->set_border_width_all(params[0].to_int());
-
- if (!params[0].is_valid_integer()) {
-
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": Expected integer numeric constant for parameter 0 (border size).");
- ERR_FAIL_V(RES());
- }
-
- int left = MIN(params.size() - 1, 3);
-
- int ccodes = 0;
-
- for (int i = 0; i < left; i++) {
-
- if (params[i + 1].is_valid_html_color())
- ccodes++;
- else
- break;
- }
-
- Color normal;
- Color bright;
- Color dark;
-
- if (ccodes < 1) {
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": Expected at least 1, 2 or 3 html color codes.");
- ERR_FAIL_V(RES());
- } else if (ccodes == 1) {
-
- normal = Color::html(params[1]);
- bright = Color::html(params[1]);
- dark = Color::html(params[1]);
- } else if (ccodes == 2) {
-
- normal = Color::html(params[1]);
- bright = Color::html(params[2]);
- dark = Color::html(params[2]);
- } else {
-
- normal = Color::html(params[1]);
- bright = Color::html(params[2]);
- dark = Color::html(params[3]);
- }
-
- sbflat->set_border_color_all(bright);
- // sbflat->set_dark_color(dark);
- sbflat->set_bg_color(normal);
-
- if (params.size() == ccodes + 5) {
- //margins
- for (int i = 0; i < 4; i++) {
-
- if (!params[i + ccodes + 1].is_valid_integer()) {
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": Invalid expand margin parameter for sboxf #" + itos(i + ccodes + 1) + ", expected integer constant, got: '" + params[i + ccodes + 1] + "'.");
- ERR_FAIL_V(RES());
- }
-
- //int margin = params[i+ccodes+1].to_int();
- //sbflat->set_margin_size(Margin(i),margin);
- }
- } else if (params.size() != ccodes + 1) {
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": Invalid amount of margin parameters for sboxt.");
- ERR_FAIL_V(RES());
- }
-
- value = sbflat;
-
- } else {
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": Invalid constructor type: '" + type + "'.");
- ERR_FAIL_V(RES());
- }
- }
-
- //parse left and do something with it
- String left = l.substr(0, eqpos);
-
- if (reading_library) {
-
- left = left.strip_edges();
- if (!left.is_valid_identifier()) {
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": <LibraryItem> is not a valid identifier.");
- ERR_FAIL_V(RES());
- }
- if (library.has(left)) {
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": Already in library: '" + left + "'.");
- ERR_FAIL_V(RES());
- }
-
- library[left] = value;
- } else {
-
- int pointpos = left.find(".");
- if (pointpos == -1) {
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": Expected 'control.item=..' assign syntax.");
- ERR_FAIL_V(RES());
- }
-
- String control = left.substr(0, pointpos).strip_edges();
- if (!control.is_valid_identifier()) {
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": <Control> is not a valid identifier.");
- ERR_FAIL_V(RES());
- }
- String item = left.substr(pointpos + 1, left.size()).strip_edges();
- if (!item.is_valid_identifier()) {
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": <Item> is not a valid identifier.");
- ERR_FAIL_V(RES());
- }
-
- if (value.get_type() == Variant::NIL) {
- //try to use exiting
- if (Theme::get_default()->has_stylebox(item, control))
- value = Theme::get_default()->get_stylebox(item, control);
- else if (Theme::get_default()->has_font(item, control))
- value = Theme::get_default()->get_font(item, control);
- else if (Theme::get_default()->has_icon(item, control))
- value = Theme::get_default()->get_icon(item, control);
- else if (Theme::get_default()->has_color(item, control))
- value = Theme::get_default()->get_color(item, control);
- else if (Theme::get_default()->has_constant(item, control))
- value = Theme::get_default()->get_constant(item, control);
- else {
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": Default not present for: '" + control + "." + item + "'.");
- ERR_FAIL_V(RES());
- }
- }
-
- if (value.get_type() == Variant::OBJECT) {
-
- Ref<Resource> res = value;
- if (!res.is_valid()) {
-
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": Invalid resource (NULL).");
- ERR_FAIL_V(RES());
- }
-
- if (Object::cast_to<StyleBox>(*res)) {
- theme->set_stylebox(item, control, res);
- } else if (Object::cast_to<Font>(*res)) {
- theme->set_font(item, control, res);
- } else if (Object::cast_to<Font>(*res)) {
- theme->set_font(item, control, res);
- } else if (Object::cast_to<Texture>(*res)) {
- theme->set_icon(item, control, res);
- } else {
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": Invalid resource type.");
- ERR_FAIL_V(RES());
- }
- } else if (value.get_type() == Variant::COLOR) {
-
- theme->set_color(item, control, value);
-
- } else if (value.get_type() == Variant::INT) {
-
- theme->set_constant(item, control, value);
-
- } else {
-
- memdelete(f);
- ERR_EXPLAIN(p_path + ":" + itos(line) + ": Couldn't even determine what this setting is! what did you do!?");
- ERR_FAIL_V(RES());
- }
- }
- }
-
- f->close();
- memdelete(f);
-
- if (r_error)
- *r_error = OK;
-
- return theme;
-}
-
-void ResourceFormatLoaderTheme::get_recognized_extensions(List<String> *p_extensions) const {
-
- p_extensions->push_back("theme");
-}
-
-bool ResourceFormatLoaderTheme::handles_type(const String &p_type) const {
-
- return p_type == "Theme";
-}
-
-String ResourceFormatLoaderTheme::get_resource_type(const String &p_path) const {
-
- if (p_path.get_extension().to_lower() == "theme")
- return "Theme";
- return "";
-}
diff --git a/scene/resources/theme.h b/scene/resources/theme.h
index 0b76e95f18..021a2936bd 100644
--- a/scene/resources/theme.h
+++ b/scene/resources/theme.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -47,12 +47,6 @@ class Theme : public Resource {
RES_BASE_EXTENSION("theme");
static Ref<Theme> default_theme;
-
- //keep a reference count to font, so each time the font changes, we emit theme changed too
- Map<Ref<Font>, int> font_refcount;
-
- void _ref_font(Ref<Font> p_sc);
- void _unref_font(Ref<Font> p_sc);
void _emit_theme_changed();
HashMap<StringName, HashMap<StringName, Ref<Texture> > > icon_map;
@@ -190,17 +184,10 @@ public:
void get_type_list(List<StringName> *p_list) const;
void copy_default_theme();
+ void clear();
Theme();
~Theme();
};
-class ResourceFormatLoaderTheme : public ResourceFormatLoader {
-public:
- virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
- virtual void get_recognized_extensions(List<String> *p_extensions) const;
- virtual bool handles_type(const String &p_type) const;
- virtual String get_resource_type(const String &p_path) const;
-};
-
#endif
diff --git a/scene/resources/tile_set.cpp b/scene/resources/tile_set.cpp
index f852ecd7eb..9cb4972a73 100644
--- a/scene/resources/tile_set.cpp
+++ b/scene/resources/tile_set.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -129,6 +129,22 @@ bool TileSet::_set(const StringName &p_name, const Variant &p_value) {
}
p.pop_front();
}
+ } else if (what == "z_index_map") {
+ tile_map[id].autotile_data.z_index_map.clear();
+ Array p = p_value;
+ Vector3 val;
+ Vector2 v;
+ int z_index;
+ while (p.size() > 0) {
+ val = p[0];
+ if (val.z != 0) {
+ v.x = val.x;
+ v.y = val.y;
+ z_index = (int)val.z;
+ tile_map[id].autotile_data.z_index_map[v] = z_index;
+ }
+ p.pop_front();
+ }
}
} else if (what == "shape")
tile_set_shape(id, 0, p_value);
@@ -228,6 +244,19 @@ bool TileSet::_get(const StringName &p_name, Variant &r_ret) const {
}
}
r_ret = p;
+ } else if (what == "z_index_map") {
+ Array p;
+ Vector3 v;
+ for (Map<Vector2, int>::Element *E = tile_map[id].autotile_data.z_index_map.front(); E; E = E->next()) {
+ if (E->value() != 0) {
+ //Don't save default value
+ v.x = E->key().x;
+ v.y = E->key().y;
+ v.z = E->value();
+ p.push_back(v);
+ }
+ }
+ r_ret = p;
}
} else if (what == "shape")
r_ret = tile_get_shape(id, 0);
@@ -278,12 +307,14 @@ void TileSet::_get_property_list(List<PropertyInfo> *p_list) const {
p_list->push_back(PropertyInfo(Variant::ARRAY, pre + "autotile/occluder_map", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL));
p_list->push_back(PropertyInfo(Variant::ARRAY, pre + "autotile/navpoly_map", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL));
p_list->push_back(PropertyInfo(Variant::ARRAY, pre + "autotile/priority_map", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL));
+ p_list->push_back(PropertyInfo(Variant::ARRAY, pre + "autotile/z_index_map", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL));
} else if (tile_get_tile_mode(id) == ATLAS_TILE) {
p_list->push_back(PropertyInfo(Variant::VECTOR2, pre + "autotile/icon_coordinate", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL));
p_list->push_back(PropertyInfo(Variant::VECTOR2, pre + "autotile/tile_size", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL));
p_list->push_back(PropertyInfo(Variant::INT, pre + "autotile/spacing", PROPERTY_HINT_RANGE, "0,256,1", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL));
p_list->push_back(PropertyInfo(Variant::ARRAY, pre + "autotile/occluder_map", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL));
p_list->push_back(PropertyInfo(Variant::ARRAY, pre + "autotile/navpoly_map", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL));
+ p_list->push_back(PropertyInfo(Variant::ARRAY, pre + "autotile/z_index_map", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL));
}
p_list->push_back(PropertyInfo(Variant::VECTOR2, pre + "occluder_offset"));
p_list->push_back(PropertyInfo(Variant::OBJECT, pre + "occluder", PROPERTY_HINT_RESOURCE_TYPE, "OccluderPolygon2D"));
@@ -483,6 +514,30 @@ const Map<Vector2, int> &TileSet::autotile_get_priority_map(int p_id) const {
return tile_map[p_id].autotile_data.priority_map;
}
+void TileSet::autotile_set_z_index(int p_id, const Vector2 &p_coord, int p_z_index) {
+
+ ERR_FAIL_COND(!tile_map.has(p_id));
+ tile_map[p_id].autotile_data.z_index_map[p_coord] = p_z_index;
+ emit_changed();
+}
+
+int TileSet::autotile_get_z_index(int p_id, const Vector2 &p_coord) {
+
+ ERR_FAIL_COND_V(!tile_map.has(p_id), 1);
+ if (tile_map[p_id].autotile_data.z_index_map.has(p_coord)) {
+ return tile_map[p_id].autotile_data.z_index_map[p_coord];
+ }
+ //When not custom z index set return the default value
+ return 0;
+}
+
+const Map<Vector2, int> &TileSet::autotile_get_z_index_map(int p_id) const {
+
+ static Map<Vector2, int> dummy;
+ ERR_FAIL_COND_V(!tile_map.has(p_id), dummy);
+ return tile_map[p_id].autotile_data.z_index_map;
+}
+
void TileSet::autotile_set_bitmask(int p_id, Vector2 p_coord, uint16_t p_flag) {
ERR_FAIL_COND(!tile_map.has(p_id));
@@ -938,8 +993,23 @@ void TileSet::clear() {
void TileSet::_bind_methods() {
ClassDB::bind_method(D_METHOD("create_tile", "id"), &TileSet::create_tile);
+ ClassDB::bind_method(D_METHOD("autotile_clear_bitmask_map", "id"), &TileSet::autotile_clear_bitmask_map);
+ ClassDB::bind_method(D_METHOD("autotile_set_icon_coordinate", "id", "coord"), &TileSet::autotile_set_icon_coordinate);
+ ClassDB::bind_method(D_METHOD("autotile_get_icon_coordinate", "id"), &TileSet::autotile_get_icon_coordinate);
+ ClassDB::bind_method(D_METHOD("autotile_set_subtile_priority", "id", "coord", "priority"), &TileSet::autotile_set_subtile_priority);
+ ClassDB::bind_method(D_METHOD("autotile_get_subtile_priority", "id", "coord"), &TileSet::autotile_get_subtile_priority);
+ ClassDB::bind_method(D_METHOD("autotile_set_z_index", "id", "coord", "z_index"), &TileSet::autotile_set_z_index);
+ ClassDB::bind_method(D_METHOD("autotile_get_z_index", "id", "coord"), &TileSet::autotile_get_z_index);
+ ClassDB::bind_method(D_METHOD("autotile_set_light_occluder", "id", "light_occluder", "coord"), &TileSet::autotile_set_light_occluder);
+ ClassDB::bind_method(D_METHOD("autotile_get_light_occluder", "id", "coord"), &TileSet::autotile_get_light_occluder);
+ ClassDB::bind_method(D_METHOD("autotile_set_navigation_polygon", "id", "navigation_polygon", "coord"), &TileSet::autotile_set_navigation_polygon);
+ ClassDB::bind_method(D_METHOD("autotile_get_navigation_polygon", "id", "coord"), &TileSet::autotile_get_navigation_polygon);
+ ClassDB::bind_method(D_METHOD("autotile_set_bitmask", "id", "bitmask", "flag"), &TileSet::autotile_set_bitmask);
+ ClassDB::bind_method(D_METHOD("autotile_get_bitmask", "id", "coord"), &TileSet::autotile_get_bitmask);
ClassDB::bind_method(D_METHOD("autotile_set_bitmask_mode", "id", "mode"), &TileSet::autotile_set_bitmask_mode);
ClassDB::bind_method(D_METHOD("autotile_get_bitmask_mode", "id"), &TileSet::autotile_get_bitmask_mode);
+ ClassDB::bind_method(D_METHOD("autotile_set_spacing", "id", "spacing"), &TileSet::autotile_set_spacing);
+ ClassDB::bind_method(D_METHOD("autotile_get_spacing", "id"), &TileSet::autotile_get_spacing);
ClassDB::bind_method(D_METHOD("autotile_set_size", "id", "size"), &TileSet::autotile_set_size);
ClassDB::bind_method(D_METHOD("autotile_get_size", "id"), &TileSet::autotile_get_size);
ClassDB::bind_method(D_METHOD("tile_set_name", "id", "name"), &TileSet::tile_set_name);
diff --git a/scene/resources/tile_set.h b/scene/resources/tile_set.h
index 1802bf12b6..df162c9210 100644
--- a/scene/resources/tile_set.h
+++ b/scene/resources/tile_set.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -87,6 +87,7 @@ public:
Map<Vector2, Ref<OccluderPolygon2D> > occluder_map;
Map<Vector2, Ref<NavigationPolygon> > navpoly_map;
Map<Vector2, int> priority_map;
+ Map<Vector2, int> z_index_map;
// Default size to prevent invalid value
explicit AutotileData() :
@@ -172,6 +173,10 @@ public:
int autotile_get_subtile_priority(int p_id, const Vector2 &p_coord);
const Map<Vector2, int> &autotile_get_priority_map(int p_id) const;
+ void autotile_set_z_index(int p_id, const Vector2 &p_coord, int p_z_index);
+ int autotile_get_z_index(int p_id, const Vector2 &p_coord);
+ const Map<Vector2, int> &autotile_get_z_index_map(int p_id) const;
+
void autotile_set_bitmask(int p_id, Vector2 p_coord, uint16_t p_flag);
uint16_t autotile_get_bitmask(int p_id, Vector2 p_coord);
const Map<Vector2, uint16_t> &autotile_get_bitmask_map(int p_id);
diff --git a/scene/resources/video_stream.cpp b/scene/resources/video_stream.cpp
index 3cd8cbae77..a85db0c592 100644
--- a/scene/resources/video_stream.cpp
+++ b/scene/resources/video_stream.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/video_stream.h b/scene/resources/video_stream.h
index 0d25d9d687..eb3bf6770f 100644
--- a/scene/resources/video_stream.h
+++ b/scene/resources/video_stream.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/visual_shader.cpp b/scene/resources/visual_shader.cpp
index 3d247ab7ad..c4be86281c 100644
--- a/scene/resources/visual_shader.cpp
+++ b/scene/resources/visual_shader.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/visual_shader.h b/scene/resources/visual_shader.h
index 2867daac3a..34b55110d4 100644
--- a/scene/resources/visual_shader.h
+++ b/scene/resources/visual_shader.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/visual_shader_nodes.cpp b/scene/resources/visual_shader_nodes.cpp
index d011b102a2..427f4f51a7 100644
--- a/scene/resources/visual_shader_nodes.cpp
+++ b/scene/resources/visual_shader_nodes.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/visual_shader_nodes.h b/scene/resources/visual_shader_nodes.h
index 3057f7239a..526a71c8c1 100644
--- a/scene/resources/visual_shader_nodes.h
+++ b/scene/resources/visual_shader_nodes.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/world.cpp b/scene/resources/world.cpp
index b4588cd87c..0ca5d7eb36 100644
--- a/scene/resources/world.cpp
+++ b/scene/resources/world.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/world.h b/scene/resources/world.h
index 4ba6b13476..05d5ceb411 100644
--- a/scene/resources/world.h
+++ b/scene/resources/world.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/world_2d.cpp b/scene/resources/world_2d.cpp
index dd78d04104..13b45f58dc 100644
--- a/scene/resources/world_2d.cpp
+++ b/scene/resources/world_2d.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/resources/world_2d.h b/scene/resources/world_2d.h
index 88ad392f85..e0c671e1a7 100644
--- a/scene/resources/world_2d.h
+++ b/scene/resources/world_2d.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/scene_string_names.cpp b/scene/scene_string_names.cpp
index e468b3dab4..305e4fc735 100644
--- a/scene/scene_string_names.cpp
+++ b/scene/scene_string_names.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/scene/scene_string_names.h b/scene/scene_string_names.h
index 25e2c5d4a6..103b06dbc1 100644
--- a/scene/scene_string_names.h
+++ b/scene/scene_string_names.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/arvr/arvr_interface.cpp b/servers/arvr/arvr_interface.cpp
index 29478ee994..3e59daff6c 100644
--- a/servers/arvr/arvr_interface.cpp
+++ b/servers/arvr/arvr_interface.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/arvr/arvr_interface.h b/servers/arvr/arvr_interface.h
index b26ee6cb1b..6908f3006a 100644
--- a/servers/arvr/arvr_interface.h
+++ b/servers/arvr/arvr_interface.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/arvr/arvr_positional_tracker.cpp b/servers/arvr/arvr_positional_tracker.cpp
index c12d0bbc15..b96e9596f3 100644
--- a/servers/arvr/arvr_positional_tracker.cpp
+++ b/servers/arvr/arvr_positional_tracker.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/arvr/arvr_positional_tracker.h b/servers/arvr/arvr_positional_tracker.h
index 69b89f11d3..7cb9486f59 100644
--- a/servers/arvr/arvr_positional_tracker.h
+++ b/servers/arvr/arvr_positional_tracker.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/arvr_server.cpp b/servers/arvr_server.cpp
index 55f8ea8f5b..f6a01939da 100644
--- a/servers/arvr_server.cpp
+++ b/servers/arvr_server.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/arvr_server.h b/servers/arvr_server.h
index a28b91c225..e7d635a8d9 100644
--- a/servers/arvr_server.h
+++ b/servers/arvr_server.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/audio_driver_dummy.cpp b/servers/audio/audio_driver_dummy.cpp
index 512ff5da7b..c151326e5e 100644
--- a/servers/audio/audio_driver_dummy.cpp
+++ b/servers/audio/audio_driver_dummy.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/audio_driver_dummy.h b/servers/audio/audio_driver_dummy.h
index ba4f69edf4..1a2839d9cb 100644
--- a/servers/audio/audio_driver_dummy.h
+++ b/servers/audio/audio_driver_dummy.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/audio_effect.cpp b/servers/audio/audio_effect.cpp
index b061dad259..dc73596952 100644
--- a/servers/audio/audio_effect.cpp
+++ b/servers/audio/audio_effect.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/audio_effect.h b/servers/audio/audio_effect.h
index bbabedbc30..1274e06740 100644
--- a/servers/audio/audio_effect.h
+++ b/servers/audio/audio_effect.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/audio_filter_sw.cpp b/servers/audio/audio_filter_sw.cpp
index 551ca01109..392938a2be 100644
--- a/servers/audio/audio_filter_sw.cpp
+++ b/servers/audio/audio_filter_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/audio_filter_sw.h b/servers/audio/audio_filter_sw.h
index d137ed8ff9..6b51a1d9ef 100644
--- a/servers/audio/audio_filter_sw.h
+++ b/servers/audio/audio_filter_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/audio_rb_resampler.cpp b/servers/audio/audio_rb_resampler.cpp
index 84a87de2e2..88f3ed8d15 100644
--- a/servers/audio/audio_rb_resampler.cpp
+++ b/servers/audio/audio_rb_resampler.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -79,53 +79,27 @@ uint32_t AudioRBResampler::_resample(AudioFrame *p_dest, int p_todo, int32_t p_i
p_dest[i] = AudioFrame(v0, v1);
}
- // For now, channels higher than stereo are almost ignored
+ // This will probably never be used, but added anyway
if (C == 4) {
- // FIXME: v2 and v3 are not being used (thus were commented out to prevent
- // compilation warnings, but they should likely be uncommented *and* used).
- // See also C == 6 with similar issues.
float v0 = rb[(pos << 2) + 0];
float v1 = rb[(pos << 2) + 1];
- /*
- float v2 = rb[(pos << 2) + 2];
- float v3 = rb[(pos << 2) + 3];
- */
float v0n = rb[(pos_next << 2) + 0];
float v1n = rb[(pos_next << 2) + 1];
- /*
- float v2n = rb[(pos_next << 2) + 2];
- float v3n = rb[(pos_next << 2) + 3];
- */
-
v0 += (v0n - v0) * frac;
v1 += (v1n - v1) * frac;
- /*
- v2 += (v2n - v2) * frac;
- v3 += (v3n - v3) * frac;
- */
p_dest[i] = AudioFrame(v0, v1);
}
if (C == 6) {
- // FIXME: Lot of unused assignments here, but it seems like intermediate calculations
- // should be done as for C == 2 (C == 4 also has some unused assignments).
float v0 = rb[(pos * 6) + 0];
float v1 = rb[(pos * 6) + 1];
- /*
- float v2 = rb[(pos * 6) + 2];
- float v3 = rb[(pos * 6) + 3];
- float v4 = rb[(pos * 6) + 4];
- float v5 = rb[(pos * 6) + 5];
float v0n = rb[(pos_next * 6) + 0];
float v1n = rb[(pos_next * 6) + 1];
- float v2n = rb[(pos_next * 6) + 2];
- float v3n = rb[(pos_next * 6) + 3];
- float v4n = rb[(pos_next * 6) + 4];
- float v5n = rb[(pos_next * 6) + 5];
- */
+ v0 += (v0n - v0) * frac;
+ v1 += (v1n - v1) * frac;
p_dest[i] = AudioFrame(v0, v1);
}
}
diff --git a/servers/audio/audio_rb_resampler.h b/servers/audio/audio_rb_resampler.h
index b21c480fc4..5b945cd953 100644
--- a/servers/audio/audio_rb_resampler.h
+++ b/servers/audio/audio_rb_resampler.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/audio_stream.cpp b/servers/audio/audio_stream.cpp
index 02a0bed964..51b9d5a4a2 100644
--- a/servers/audio/audio_stream.cpp
+++ b/servers/audio/audio_stream.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -30,6 +30,7 @@
#include "audio_stream.h"
#include "core/os/os.h"
+#include "core/project_settings.h"
//////////////////////////////
@@ -184,6 +185,12 @@ float AudioStreamPlaybackMicrophone::get_stream_sampling_rate() {
}
void AudioStreamPlaybackMicrophone::start(float p_from_pos) {
+
+ if (!GLOBAL_GET("audio/enable_audio_input")) {
+ WARN_PRINTS("Need to enable Project settings > Audio > Enable Audio Input option to use capturing.");
+ return;
+ }
+
input_ofs = 0;
AudioDriver::get_singleton()->capture_start();
diff --git a/servers/audio/audio_stream.h b/servers/audio/audio_stream.h
index f6ed45cc9c..ab4ef5f91b 100644
--- a/servers/audio/audio_stream.h
+++ b/servers/audio/audio_stream.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_amplify.cpp b/servers/audio/effects/audio_effect_amplify.cpp
index 9c8dfa8cb9..21a09297b2 100644
--- a/servers/audio/effects/audio_effect_amplify.cpp
+++ b/servers/audio/effects/audio_effect_amplify.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_amplify.h b/servers/audio/effects/audio_effect_amplify.h
index 1096dc04df..b6e2a1d4d8 100644
--- a/servers/audio/effects/audio_effect_amplify.h
+++ b/servers/audio/effects/audio_effect_amplify.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_chorus.cpp b/servers/audio/effects/audio_effect_chorus.cpp
index 3c88d050f6..c2f8b97c1a 100644
--- a/servers/audio/effects/audio_effect_chorus.cpp
+++ b/servers/audio/effects/audio_effect_chorus.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_chorus.h b/servers/audio/effects/audio_effect_chorus.h
index a4646df7d7..9cad2906ff 100644
--- a/servers/audio/effects/audio_effect_chorus.h
+++ b/servers/audio/effects/audio_effect_chorus.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_compressor.cpp b/servers/audio/effects/audio_effect_compressor.cpp
index 8c70b51f8d..10f883d16c 100644
--- a/servers/audio/effects/audio_effect_compressor.cpp
+++ b/servers/audio/effects/audio_effect_compressor.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_compressor.h b/servers/audio/effects/audio_effect_compressor.h
index ef11249415..3ea3a58cb2 100644
--- a/servers/audio/effects/audio_effect_compressor.h
+++ b/servers/audio/effects/audio_effect_compressor.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_delay.cpp b/servers/audio/effects/audio_effect_delay.cpp
index abc10ee096..8d34d46313 100644
--- a/servers/audio/effects/audio_effect_delay.cpp
+++ b/servers/audio/effects/audio_effect_delay.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_delay.h b/servers/audio/effects/audio_effect_delay.h
index f173bd6dfc..131b8714a0 100644
--- a/servers/audio/effects/audio_effect_delay.h
+++ b/servers/audio/effects/audio_effect_delay.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_distortion.cpp b/servers/audio/effects/audio_effect_distortion.cpp
index 0422083363..37305bd7f4 100644
--- a/servers/audio/effects/audio_effect_distortion.cpp
+++ b/servers/audio/effects/audio_effect_distortion.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_distortion.h b/servers/audio/effects/audio_effect_distortion.h
index 8d9ff1c03f..2cbffc81a1 100644
--- a/servers/audio/effects/audio_effect_distortion.h
+++ b/servers/audio/effects/audio_effect_distortion.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_eq.cpp b/servers/audio/effects/audio_effect_eq.cpp
index cf8f7d3e16..150f9db78f 100644
--- a/servers/audio/effects/audio_effect_eq.cpp
+++ b/servers/audio/effects/audio_effect_eq.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_eq.h b/servers/audio/effects/audio_effect_eq.h
index c45fb753ea..c9735b9073 100644
--- a/servers/audio/effects/audio_effect_eq.h
+++ b/servers/audio/effects/audio_effect_eq.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_filter.cpp b/servers/audio/effects/audio_effect_filter.cpp
index 75a43d2d41..dc86d6ffbb 100644
--- a/servers/audio/effects/audio_effect_filter.cpp
+++ b/servers/audio/effects/audio_effect_filter.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_filter.h b/servers/audio/effects/audio_effect_filter.h
index e8f12e5efa..fd9a4bcf07 100644
--- a/servers/audio/effects/audio_effect_filter.h
+++ b/servers/audio/effects/audio_effect_filter.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_limiter.cpp b/servers/audio/effects/audio_effect_limiter.cpp
index 77454dc57b..9eaab11106 100644
--- a/servers/audio/effects/audio_effect_limiter.cpp
+++ b/servers/audio/effects/audio_effect_limiter.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_limiter.h b/servers/audio/effects/audio_effect_limiter.h
index 8077d2da23..d629166f42 100644
--- a/servers/audio/effects/audio_effect_limiter.h
+++ b/servers/audio/effects/audio_effect_limiter.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_panner.cpp b/servers/audio/effects/audio_effect_panner.cpp
index 6b6ca405e0..95212fee78 100644
--- a/servers/audio/effects/audio_effect_panner.cpp
+++ b/servers/audio/effects/audio_effect_panner.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_panner.h b/servers/audio/effects/audio_effect_panner.h
index cdab11c445..4256d05a2f 100644
--- a/servers/audio/effects/audio_effect_panner.h
+++ b/servers/audio/effects/audio_effect_panner.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_phaser.cpp b/servers/audio/effects/audio_effect_phaser.cpp
index 3151111ec8..b8768501e9 100644
--- a/servers/audio/effects/audio_effect_phaser.cpp
+++ b/servers/audio/effects/audio_effect_phaser.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_phaser.h b/servers/audio/effects/audio_effect_phaser.h
index 96ba2b0abf..264e792be5 100644
--- a/servers/audio/effects/audio_effect_phaser.h
+++ b/servers/audio/effects/audio_effect_phaser.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_pitch_shift.cpp b/servers/audio/effects/audio_effect_pitch_shift.cpp
index f5ca8f2da4..ca2a88f858 100644
--- a/servers/audio/effects/audio_effect_pitch_shift.cpp
+++ b/servers/audio/effects/audio_effect_pitch_shift.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_pitch_shift.h b/servers/audio/effects/audio_effect_pitch_shift.h
index 78f92a0261..febc20e9d5 100644
--- a/servers/audio/effects/audio_effect_pitch_shift.h
+++ b/servers/audio/effects/audio_effect_pitch_shift.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_record.cpp b/servers/audio/effects/audio_effect_record.cpp
index a0094f66b8..2dd71f9452 100644
--- a/servers/audio/effects/audio_effect_record.cpp
+++ b/servers/audio/effects/audio_effect_record.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -44,20 +44,25 @@ void AudioEffectRecordInstance::process(const AudioFrame *p_src_frames, AudioFra
}
}
+void AudioEffectRecordInstance::_update_buffer() {
+ //Case: Frames are remaining in the buffer
+ while (ring_buffer_read_pos < ring_buffer_pos) {
+ //Read from the buffer into recording_data
+ _io_store_buffer();
+ }
+}
+
+void AudioEffectRecordInstance::_update(void *userdata) {
+ AudioEffectRecordInstance *ins = (AudioEffectRecordInstance *)userdata;
+ ins->_update_buffer();
+}
+
bool AudioEffectRecordInstance::process_silence() const {
return true;
}
void AudioEffectRecordInstance::_io_thread_process() {
-
- //Reset recorder status
thread_active = true;
- ring_buffer_pos = 0;
- ring_buffer_read_pos = 0;
-
- //We start a new recording
- recording_data.resize(0); //Clear data completely and reset length
- is_recording = true;
while (is_recording) {
//Check: The current recording has been requested to stop
@@ -65,13 +70,9 @@ void AudioEffectRecordInstance::_io_thread_process() {
is_recording = false;
}
- //Case: Frames are remaining in the buffer
- if (ring_buffer_read_pos < ring_buffer_pos) {
- //Read from the buffer into recording_data
- _io_store_buffer();
- }
- //Case: The buffer is empty
- else if (is_recording) {
+ _update_buffer();
+
+ if (is_recording) {
//Wait to avoid too much busy-wait
OS::get_singleton()->delay_usec(500);
}
@@ -103,7 +104,35 @@ void AudioEffectRecordInstance::_thread_callback(void *_instance) {
}
void AudioEffectRecordInstance::init() {
+ //Reset recorder status
+ ring_buffer_pos = 0;
+ ring_buffer_read_pos = 0;
+
+ //We start a new recording
+ recording_data.resize(0); //Clear data completely and reset length
+ is_recording = true;
+
+#ifdef NO_THREADS
+ AudioServer::get_singleton()->add_update_callback(&AudioEffectRecordInstance::_update, this);
+#else
io_thread = Thread::create(_thread_callback, this);
+#endif
+}
+
+void AudioEffectRecordInstance::finish() {
+
+#ifdef NO_THREADS
+ AudioServer::get_singleton()->remove_update_callback(&AudioEffectRecordInstance::_update, this);
+#else
+ if (thread_active) {
+ Thread::wait_to_finish(io_thread);
+ }
+#endif
+}
+
+AudioEffectRecordInstance::~AudioEffectRecordInstance() {
+
+ finish();
}
Ref<AudioEffectInstance> AudioEffectRecord::instance() {
@@ -145,8 +174,8 @@ Ref<AudioEffectInstance> AudioEffectRecord::instance() {
void AudioEffectRecord::ensure_thread_stopped() {
recording_active = false;
- if (current_instance != 0 && current_instance->thread_active) {
- Thread::wait_to_finish(current_instance->io_thread);
+ if (current_instance != 0) {
+ current_instance->finish();
}
}
diff --git a/servers/audio/effects/audio_effect_record.h b/servers/audio/effects/audio_effect_record.h
index 4b8ee2bcdd..528c7dbd7c 100644
--- a/servers/audio/effects/audio_effect_record.h
+++ b/servers/audio/effects/audio_effect_record.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -62,14 +62,18 @@ class AudioEffectRecordInstance : public AudioEffectInstance {
void _io_store_buffer();
static void _thread_callback(void *_instance);
void _init_recording();
+ void _update_buffer();
+ static void _update(void *userdata);
public:
void init();
+ void finish();
virtual void process(const AudioFrame *p_src_frames, AudioFrame *p_dst_frames, int p_frame_count);
virtual bool process_silence() const;
AudioEffectRecordInstance() :
thread_active(false) {}
+ ~AudioEffectRecordInstance();
};
class AudioEffectRecord : public AudioEffect {
diff --git a/servers/audio/effects/audio_effect_reverb.cpp b/servers/audio/effects/audio_effect_reverb.cpp
index 162c0a1445..003ac452d2 100644
--- a/servers/audio/effects/audio_effect_reverb.cpp
+++ b/servers/audio/effects/audio_effect_reverb.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_reverb.h b/servers/audio/effects/audio_effect_reverb.h
index 5646fd2238..ed76050f24 100644
--- a/servers/audio/effects/audio_effect_reverb.h
+++ b/servers/audio/effects/audio_effect_reverb.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_stereo_enhance.cpp b/servers/audio/effects/audio_effect_stereo_enhance.cpp
index cf5228f8b6..8945675e07 100644
--- a/servers/audio/effects/audio_effect_stereo_enhance.cpp
+++ b/servers/audio/effects/audio_effect_stereo_enhance.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/audio_effect_stereo_enhance.h b/servers/audio/effects/audio_effect_stereo_enhance.h
index 13dd4ac042..787c351a03 100644
--- a/servers/audio/effects/audio_effect_stereo_enhance.h
+++ b/servers/audio/effects/audio_effect_stereo_enhance.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/eq.cpp b/servers/audio/effects/eq.cpp
index 70ac70a5a8..e8f247d3bc 100644
--- a/servers/audio/effects/eq.cpp
+++ b/servers/audio/effects/eq.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/eq.h b/servers/audio/effects/eq.h
index c06f1f8bf8..2c407ee60e 100644
--- a/servers/audio/effects/eq.h
+++ b/servers/audio/effects/eq.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/reverb.cpp b/servers/audio/effects/reverb.cpp
index b032c91da2..1f9fa23763 100644
--- a/servers/audio/effects/reverb.cpp
+++ b/servers/audio/effects/reverb.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/effects/reverb.h b/servers/audio/effects/reverb.h
index 03cf197456..6a2e291466 100644
--- a/servers/audio/effects/reverb.h
+++ b/servers/audio/effects/reverb.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/reverb_sw.cpp b/servers/audio/reverb_sw.cpp
index d078da38b4..8adc21b406 100644
--- a/servers/audio/reverb_sw.cpp
+++ b/servers/audio/reverb_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/reverb_sw.h b/servers/audio/reverb_sw.h
index 01977d1f61..1a2e2e2bb8 100644
--- a/servers/audio/reverb_sw.h
+++ b/servers/audio/reverb_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio/voice_rb_sw.h b/servers/audio/voice_rb_sw.h
index fc02cc1827..0a39c536ae 100644
--- a/servers/audio/voice_rb_sw.h
+++ b/servers/audio/voice_rb_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/audio_server.cpp b/servers/audio_server.cpp
index 6fd996c3d3..3b1734287a 100644
--- a/servers/audio_server.cpp
+++ b/servers/audio_server.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -172,6 +172,7 @@ int AudioDriverManager::get_driver_count() {
}
void AudioDriverManager::initialize(int p_driver) {
+ GLOBAL_DEF_RST("audio/enable_audio_input", false);
int failed_driver = -1;
// Check if there is a selected driver
@@ -737,6 +738,12 @@ float AudioServer::get_bus_volume_db(int p_bus) const {
return buses[p_bus]->volume_db;
}
+int AudioServer::get_bus_channels(int p_bus) const {
+
+ ERR_FAIL_INDEX_V(p_bus, buses.size(), 0);
+ return buses[p_bus]->channels.size();
+}
+
void AudioServer::set_bus_send(int p_bus, const StringName &p_send) {
ERR_FAIL_INDEX(p_bus, buses.size());
@@ -1021,6 +1028,11 @@ void AudioServer::update() {
AudioDriver::get_singleton()->reset_profiling_time();
prof_time = 0;
#endif
+
+ for (Set<CallbackItem>::Element *E = update_callbacks.front(); E; E = E->next()) {
+
+ E->get().callback(E->get().userdata);
+ }
}
void AudioServer::load_default_bus_layout() {
@@ -1146,6 +1158,25 @@ void AudioServer::remove_callback(AudioCallback p_callback, void *p_userdata) {
unlock();
}
+void AudioServer::add_update_callback(AudioCallback p_callback, void *p_userdata) {
+ lock();
+ CallbackItem ci;
+ ci.callback = p_callback;
+ ci.userdata = p_userdata;
+ update_callbacks.insert(ci);
+ unlock();
+}
+
+void AudioServer::remove_update_callback(AudioCallback p_callback, void *p_userdata) {
+
+ lock();
+ CallbackItem ci;
+ ci.callback = p_callback;
+ ci.userdata = p_userdata;
+ update_callbacks.erase(ci);
+ unlock();
+}
+
void AudioServer::set_bus_layout(const Ref<AudioBusLayout> &p_bus_layout) {
ERR_FAIL_COND(p_bus_layout.is_null() || p_bus_layout->buses.size() == 0);
@@ -1267,6 +1298,8 @@ void AudioServer::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_bus_name", "bus_idx"), &AudioServer::get_bus_name);
ClassDB::bind_method(D_METHOD("get_bus_index", "bus_name"), &AudioServer::get_bus_index);
+ ClassDB::bind_method(D_METHOD("get_bus_channels", "bus_idx"), &AudioServer::get_bus_channels);
+
ClassDB::bind_method(D_METHOD("set_bus_volume_db", "bus_idx", "volume_db"), &AudioServer::set_bus_volume_db);
ClassDB::bind_method(D_METHOD("get_bus_volume_db", "bus_idx"), &AudioServer::get_bus_volume_db);
diff --git a/servers/audio_server.h b/servers/audio_server.h
index 52fa84e3e6..6bd8093c76 100644
--- a/servers/audio_server.h
+++ b/servers/audio_server.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -263,6 +263,7 @@ private:
};
Set<CallbackItem> callbacks;
+ Set<CallbackItem> update_callbacks;
friend class AudioDriver;
void _driver_process(int p_frames, int32_t *p_buffer);
@@ -299,6 +300,8 @@ public:
String get_bus_name(int p_bus) const;
int get_bus_index(const StringName &p_bus_name) const;
+ int get_bus_channels(int p_bus) const;
+
void set_bus_volume_db(int p_bus, float p_volume_db);
float get_bus_volume_db(int p_bus) const;
@@ -359,6 +362,9 @@ public:
void add_callback(AudioCallback p_callback, void *p_userdata);
void remove_callback(AudioCallback p_callback, void *p_userdata);
+ void add_update_callback(AudioCallback p_callback, void *p_userdata);
+ void remove_update_callback(AudioCallback p_callback, void *p_userdata);
+
void set_bus_layout(const Ref<AudioBusLayout> &p_bus_layout);
Ref<AudioBusLayout> generate_bus_layout() const;
diff --git a/servers/physics/area_pair_sw.cpp b/servers/physics/area_pair_sw.cpp
index 5e295edcd1..fed24e0b58 100644
--- a/servers/physics/area_pair_sw.cpp
+++ b/servers/physics/area_pair_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/area_pair_sw.h b/servers/physics/area_pair_sw.h
index b66599dd11..48113d0580 100644
--- a/servers/physics/area_pair_sw.h
+++ b/servers/physics/area_pair_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/area_sw.cpp b/servers/physics/area_sw.cpp
index 8f9d4075b8..9d68869bc2 100644
--- a/servers/physics/area_sw.cpp
+++ b/servers/physics/area_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/area_sw.h b/servers/physics/area_sw.h
index 63a4db5d02..9b14055507 100644
--- a/servers/physics/area_sw.h
+++ b/servers/physics/area_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/body_pair_sw.cpp b/servers/physics/body_pair_sw.cpp
index 357fc05355..dbe4fbd700 100644
--- a/servers/physics/body_pair_sw.cpp
+++ b/servers/physics/body_pair_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/body_pair_sw.h b/servers/physics/body_pair_sw.h
index 17ff9d6a88..cd2355d5a1 100644
--- a/servers/physics/body_pair_sw.h
+++ b/servers/physics/body_pair_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/body_sw.cpp b/servers/physics/body_sw.cpp
index 36511f78ce..23f16c246e 100644
--- a/servers/physics/body_sw.cpp
+++ b/servers/physics/body_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -87,6 +87,10 @@ void BodySW::update_inertias() {
for (int i = 0; i < get_shape_count(); i++) {
+ if (is_shape_disabled(i)) {
+ continue;
+ }
+
const ShapeSW *shape = get_shape(i);
real_t area = get_shape_area(i);
diff --git a/servers/physics/body_sw.h b/servers/physics/body_sw.h
index 0f7797254e..05c61639de 100644
--- a/servers/physics/body_sw.h
+++ b/servers/physics/body_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/broad_phase_basic.cpp b/servers/physics/broad_phase_basic.cpp
index d55951b39a..13b91f2be9 100644
--- a/servers/physics/broad_phase_basic.cpp
+++ b/servers/physics/broad_phase_basic.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/broad_phase_basic.h b/servers/physics/broad_phase_basic.h
index 500b8544a1..3d63a70074 100644
--- a/servers/physics/broad_phase_basic.h
+++ b/servers/physics/broad_phase_basic.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/broad_phase_octree.cpp b/servers/physics/broad_phase_octree.cpp
index 7f43fbdb6a..94bf274f9c 100644
--- a/servers/physics/broad_phase_octree.cpp
+++ b/servers/physics/broad_phase_octree.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/broad_phase_octree.h b/servers/physics/broad_phase_octree.h
index c4b8ecb299..f4b5d3f2a7 100644
--- a/servers/physics/broad_phase_octree.h
+++ b/servers/physics/broad_phase_octree.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/broad_phase_sw.cpp b/servers/physics/broad_phase_sw.cpp
index 2a490c3e80..f90520d373 100644
--- a/servers/physics/broad_phase_sw.cpp
+++ b/servers/physics/broad_phase_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/broad_phase_sw.h b/servers/physics/broad_phase_sw.h
index 2db1c1dd06..9ffbd8986b 100644
--- a/servers/physics/broad_phase_sw.h
+++ b/servers/physics/broad_phase_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/collision_object_sw.cpp b/servers/physics/collision_object_sw.cpp
index 09f72ff39b..085ad4f9ea 100644
--- a/servers/physics/collision_object_sw.cpp
+++ b/servers/physics/collision_object_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/collision_object_sw.h b/servers/physics/collision_object_sw.h
index 993799ee10..6e6b66dac2 100644
--- a/servers/physics/collision_object_sw.h
+++ b/servers/physics/collision_object_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -122,6 +122,10 @@ public:
void set_shape(int p_index, ShapeSW *p_shape);
void set_shape_transform(int p_index, const Transform &p_transform);
_FORCE_INLINE_ int get_shape_count() const { return shapes.size(); }
+ _FORCE_INLINE_ bool is_shape_disabled(int p_index) const {
+ CRASH_BAD_INDEX(p_index, shapes.size());
+ return shapes[p_index].disabled;
+ }
_FORCE_INLINE_ ShapeSW *get_shape(int p_index) const { return shapes[p_index].shape; }
_FORCE_INLINE_ const Transform &get_shape_transform(int p_index) const { return shapes[p_index].xform; }
_FORCE_INLINE_ const Transform &get_shape_inv_transform(int p_index) const { return shapes[p_index].xform_inv; }
diff --git a/servers/physics/collision_solver_sat.cpp b/servers/physics/collision_solver_sat.cpp
index f17f6f7014..fd919343f0 100644
--- a/servers/physics/collision_solver_sat.cpp
+++ b/servers/physics/collision_solver_sat.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/collision_solver_sat.h b/servers/physics/collision_solver_sat.h
index 1d83d9889d..1bbe1de9be 100644
--- a/servers/physics/collision_solver_sat.h
+++ b/servers/physics/collision_solver_sat.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/collision_solver_sw.cpp b/servers/physics/collision_solver_sw.cpp
index 86ef719f6f..0d10dae8cc 100644
--- a/servers/physics/collision_solver_sw.cpp
+++ b/servers/physics/collision_solver_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/collision_solver_sw.h b/servers/physics/collision_solver_sw.h
index cbcb6b850a..0a8a17e5e2 100644
--- a/servers/physics/collision_solver_sw.h
+++ b/servers/physics/collision_solver_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/constraint_sw.h b/servers/physics/constraint_sw.h
index 41789600f6..e92c2c08fa 100644
--- a/servers/physics/constraint_sw.h
+++ b/servers/physics/constraint_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/gjk_epa.cpp b/servers/physics/gjk_epa.cpp
index a42b7ed82b..ae512183fd 100644
--- a/servers/physics/gjk_epa.cpp
+++ b/servers/physics/gjk_epa.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/gjk_epa.h b/servers/physics/gjk_epa.h
index f6d052608e..0b7885c9a5 100644
--- a/servers/physics/gjk_epa.h
+++ b/servers/physics/gjk_epa.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/joints/cone_twist_joint_sw.cpp b/servers/physics/joints/cone_twist_joint_sw.cpp
index 37fcde4b76..05778ee9b0 100644
--- a/servers/physics/joints/cone_twist_joint_sw.cpp
+++ b/servers/physics/joints/cone_twist_joint_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/joints/cone_twist_joint_sw.h b/servers/physics/joints/cone_twist_joint_sw.h
index 3213562c3f..62ae310f35 100644
--- a/servers/physics/joints/cone_twist_joint_sw.h
+++ b/servers/physics/joints/cone_twist_joint_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/joints/generic_6dof_joint_sw.cpp b/servers/physics/joints/generic_6dof_joint_sw.cpp
index 3a965ff800..756348f448 100644
--- a/servers/physics/joints/generic_6dof_joint_sw.cpp
+++ b/servers/physics/joints/generic_6dof_joint_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/joints/generic_6dof_joint_sw.h b/servers/physics/joints/generic_6dof_joint_sw.h
index 035525c9e6..d4a36f1610 100644
--- a/servers/physics/joints/generic_6dof_joint_sw.h
+++ b/servers/physics/joints/generic_6dof_joint_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/joints/hinge_joint_sw.cpp b/servers/physics/joints/hinge_joint_sw.cpp
index 50de0e871e..e972496b2b 100644
--- a/servers/physics/joints/hinge_joint_sw.cpp
+++ b/servers/physics/joints/hinge_joint_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/joints/hinge_joint_sw.h b/servers/physics/joints/hinge_joint_sw.h
index cc8af3b370..b94baffc29 100644
--- a/servers/physics/joints/hinge_joint_sw.h
+++ b/servers/physics/joints/hinge_joint_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/joints/jacobian_entry_sw.h b/servers/physics/joints/jacobian_entry_sw.h
index 4bc1255a9a..a7b437e449 100644
--- a/servers/physics/joints/jacobian_entry_sw.h
+++ b/servers/physics/joints/jacobian_entry_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/joints/pin_joint_sw.cpp b/servers/physics/joints/pin_joint_sw.cpp
index a094e6c5ae..5d30678fd6 100644
--- a/servers/physics/joints/pin_joint_sw.cpp
+++ b/servers/physics/joints/pin_joint_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/joints/pin_joint_sw.h b/servers/physics/joints/pin_joint_sw.h
index 7d843f053c..95de733a0a 100644
--- a/servers/physics/joints/pin_joint_sw.h
+++ b/servers/physics/joints/pin_joint_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/joints/slider_joint_sw.cpp b/servers/physics/joints/slider_joint_sw.cpp
index 30700d45f1..61894f7dc9 100644
--- a/servers/physics/joints/slider_joint_sw.cpp
+++ b/servers/physics/joints/slider_joint_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/joints/slider_joint_sw.h b/servers/physics/joints/slider_joint_sw.h
index 4df632d75f..813eaae097 100644
--- a/servers/physics/joints/slider_joint_sw.h
+++ b/servers/physics/joints/slider_joint_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/joints_sw.h b/servers/physics/joints_sw.h
index af27b1c25b..d79fb0750a 100644
--- a/servers/physics/joints_sw.h
+++ b/servers/physics/joints_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/physics_server_sw.cpp b/servers/physics/physics_server_sw.cpp
index fddb531a4f..2975ae9453 100644
--- a/servers/physics/physics_server_sw.cpp
+++ b/servers/physics/physics_server_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/physics_server_sw.h b/servers/physics/physics_server_sw.h
index b3c61403aa..5d0ba3628e 100644
--- a/servers/physics/physics_server_sw.h
+++ b/servers/physics/physics_server_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -348,6 +348,9 @@ public:
virtual void generic_6dof_joint_set_flag(RID p_joint, Vector3::Axis, G6DOFJointAxisFlag p_flag, bool p_enable);
virtual bool generic_6dof_joint_get_flag(RID p_joint, Vector3::Axis, G6DOFJointAxisFlag p_flag);
+ virtual void generic_6dof_joint_set_precision(RID p_joint, int precision) {}
+ virtual int generic_6dof_joint_get_precision(RID p_joint) { return 0; }
+
virtual JointType joint_get_type(RID p_joint) const;
virtual void joint_set_solver_priority(RID p_joint, int p_priority);
diff --git a/servers/physics/shape_sw.cpp b/servers/physics/shape_sw.cpp
index e7fc821c2c..fdc5eccc5a 100644
--- a/servers/physics/shape_sw.cpp
+++ b/servers/physics/shape_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/shape_sw.h b/servers/physics/shape_sw.h
index 073d19e317..6af1224b38 100644
--- a/servers/physics/shape_sw.h
+++ b/servers/physics/shape_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/space_sw.cpp b/servers/physics/space_sw.cpp
index 3b5344f020..1087cd2483 100644
--- a/servers/physics/space_sw.cpp
+++ b/servers/physics/space_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/space_sw.h b/servers/physics/space_sw.h
index d550b374e3..ae6f349e51 100644
--- a/servers/physics/space_sw.h
+++ b/servers/physics/space_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/step_sw.cpp b/servers/physics/step_sw.cpp
index 5238f24b20..4082956747 100644
--- a/servers/physics/step_sw.cpp
+++ b/servers/physics/step_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics/step_sw.h b/servers/physics/step_sw.h
index 25e9fedf79..c291190fe4 100644
--- a/servers/physics/step_sw.h
+++ b/servers/physics/step_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/area_2d_sw.cpp b/servers/physics_2d/area_2d_sw.cpp
index 037c92bac6..9ec1eacd29 100644
--- a/servers/physics_2d/area_2d_sw.cpp
+++ b/servers/physics_2d/area_2d_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/area_2d_sw.h b/servers/physics_2d/area_2d_sw.h
index 90e30f68bc..371ad94c22 100644
--- a/servers/physics_2d/area_2d_sw.h
+++ b/servers/physics_2d/area_2d_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/area_pair_2d_sw.cpp b/servers/physics_2d/area_pair_2d_sw.cpp
index cdd35cf657..7401dbfa89 100644
--- a/servers/physics_2d/area_pair_2d_sw.cpp
+++ b/servers/physics_2d/area_pair_2d_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/area_pair_2d_sw.h b/servers/physics_2d/area_pair_2d_sw.h
index 243b99a79c..6972bcd0f5 100644
--- a/servers/physics_2d/area_pair_2d_sw.h
+++ b/servers/physics_2d/area_pair_2d_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/body_2d_sw.cpp b/servers/physics_2d/body_2d_sw.cpp
index 52362386d2..60bcb2e28e 100644
--- a/servers/physics_2d/body_2d_sw.cpp
+++ b/servers/physics_2d/body_2d_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -61,6 +61,10 @@ void Body2DSW::update_inertias() {
for (int i = 0; i < get_shape_count(); i++) {
+ if (is_shape_disabled(i)) {
+ continue;
+ }
+
const Shape2DSW *shape = get_shape(i);
real_t area = get_shape_aabb(i).get_area();
diff --git a/servers/physics_2d/body_2d_sw.h b/servers/physics_2d/body_2d_sw.h
index 97dff69a20..8c64dc9230 100644
--- a/servers/physics_2d/body_2d_sw.h
+++ b/servers/physics_2d/body_2d_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/body_pair_2d_sw.cpp b/servers/physics_2d/body_pair_2d_sw.cpp
index 93a05b74ef..ccdaf0b508 100644
--- a/servers/physics_2d/body_pair_2d_sw.cpp
+++ b/servers/physics_2d/body_pair_2d_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/body_pair_2d_sw.h b/servers/physics_2d/body_pair_2d_sw.h
index e54a32fb46..a5c07aac05 100644
--- a/servers/physics_2d/body_pair_2d_sw.h
+++ b/servers/physics_2d/body_pair_2d_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/broad_phase_2d_basic.cpp b/servers/physics_2d/broad_phase_2d_basic.cpp
index 067d86f474..6a9c9f783c 100644
--- a/servers/physics_2d/broad_phase_2d_basic.cpp
+++ b/servers/physics_2d/broad_phase_2d_basic.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/broad_phase_2d_basic.h b/servers/physics_2d/broad_phase_2d_basic.h
index da5dc38b8e..595c5d411a 100644
--- a/servers/physics_2d/broad_phase_2d_basic.h
+++ b/servers/physics_2d/broad_phase_2d_basic.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/broad_phase_2d_hash_grid.cpp b/servers/physics_2d/broad_phase_2d_hash_grid.cpp
index 95195c8fff..1bbb50c974 100644
--- a/servers/physics_2d/broad_phase_2d_hash_grid.cpp
+++ b/servers/physics_2d/broad_phase_2d_hash_grid.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/broad_phase_2d_hash_grid.h b/servers/physics_2d/broad_phase_2d_hash_grid.h
index 0ecb915a7b..61fe5dbcf6 100644
--- a/servers/physics_2d/broad_phase_2d_hash_grid.h
+++ b/servers/physics_2d/broad_phase_2d_hash_grid.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/broad_phase_2d_sw.cpp b/servers/physics_2d/broad_phase_2d_sw.cpp
index 6e3dce000f..20250c5113 100644
--- a/servers/physics_2d/broad_phase_2d_sw.cpp
+++ b/servers/physics_2d/broad_phase_2d_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/broad_phase_2d_sw.h b/servers/physics_2d/broad_phase_2d_sw.h
index 5b512dac76..1ba8e24cff 100644
--- a/servers/physics_2d/broad_phase_2d_sw.h
+++ b/servers/physics_2d/broad_phase_2d_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/collision_object_2d_sw.cpp b/servers/physics_2d/collision_object_2d_sw.cpp
index 2f5b484040..4fbc0769ba 100644
--- a/servers/physics_2d/collision_object_2d_sw.cpp
+++ b/servers/physics_2d/collision_object_2d_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/collision_object_2d_sw.h b/servers/physics_2d/collision_object_2d_sw.h
index f256910f52..6946217dbd 100644
--- a/servers/physics_2d/collision_object_2d_sw.h
+++ b/servers/physics_2d/collision_object_2d_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -115,6 +115,10 @@ public:
void set_shape_metadata(int p_index, const Variant &p_metadata);
_FORCE_INLINE_ int get_shape_count() const { return shapes.size(); }
+ _FORCE_INLINE_ bool is_shape_disabled(int p_index) const {
+ CRASH_BAD_INDEX(p_index, shapes.size());
+ return shapes[p_index].disabled;
+ }
_FORCE_INLINE_ Shape2DSW *get_shape(int p_index) const {
CRASH_BAD_INDEX(p_index, shapes.size());
return shapes[p_index].shape;
diff --git a/servers/physics_2d/collision_solver_2d_sat.cpp b/servers/physics_2d/collision_solver_2d_sat.cpp
index 0f32f2ec85..d6c3fff421 100644
--- a/servers/physics_2d/collision_solver_2d_sat.cpp
+++ b/servers/physics_2d/collision_solver_2d_sat.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/collision_solver_2d_sat.h b/servers/physics_2d/collision_solver_2d_sat.h
index ba35c63fbc..ecf09151e5 100644
--- a/servers/physics_2d/collision_solver_2d_sat.h
+++ b/servers/physics_2d/collision_solver_2d_sat.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/collision_solver_2d_sw.cpp b/servers/physics_2d/collision_solver_2d_sw.cpp
index b03a193d97..e49961c048 100644
--- a/servers/physics_2d/collision_solver_2d_sw.cpp
+++ b/servers/physics_2d/collision_solver_2d_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/collision_solver_2d_sw.h b/servers/physics_2d/collision_solver_2d_sw.h
index 6faa166115..0c5ac5245c 100644
--- a/servers/physics_2d/collision_solver_2d_sw.h
+++ b/servers/physics_2d/collision_solver_2d_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/constraint_2d_sw.h b/servers/physics_2d/constraint_2d_sw.h
index c1954935d3..582b92ad46 100644
--- a/servers/physics_2d/constraint_2d_sw.h
+++ b/servers/physics_2d/constraint_2d_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/joints_2d_sw.cpp b/servers/physics_2d/joints_2d_sw.cpp
index 517dce0043..5c2242c4c5 100644
--- a/servers/physics_2d/joints_2d_sw.cpp
+++ b/servers/physics_2d/joints_2d_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/joints_2d_sw.h b/servers/physics_2d/joints_2d_sw.h
index e2002eef0d..981d80328b 100644
--- a/servers/physics_2d/joints_2d_sw.h
+++ b/servers/physics_2d/joints_2d_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/physics_2d_server_sw.cpp b/servers/physics_2d/physics_2d_server_sw.cpp
index 45310ec4b3..daea013d35 100644
--- a/servers/physics_2d/physics_2d_server_sw.cpp
+++ b/servers/physics_2d/physics_2d_server_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -1079,6 +1079,7 @@ Physics2DDirectBodyState *Physics2DServerSW::body_get_direct_state(RID p_body) {
Body2DSW *body = body_owner.get(p_body);
ERR_FAIL_COND_V(!body, NULL);
+ ERR_FAIL_COND_V(!body->get_space(), NULL);
if (body->get_space()->is_locked()) {
diff --git a/servers/physics_2d/physics_2d_server_sw.h b/servers/physics_2d/physics_2d_server_sw.h
index 4f33873219..da402ee16e 100644
--- a/servers/physics_2d/physics_2d_server_sw.h
+++ b/servers/physics_2d/physics_2d_server_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/physics_2d_server_wrap_mt.cpp b/servers/physics_2d/physics_2d_server_wrap_mt.cpp
index 3ded4b717a..71c00c0abf 100644
--- a/servers/physics_2d/physics_2d_server_wrap_mt.cpp
+++ b/servers/physics_2d/physics_2d_server_wrap_mt.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/physics_2d_server_wrap_mt.h b/servers/physics_2d/physics_2d_server_wrap_mt.h
index e736854077..467d301ad5 100644
--- a/servers/physics_2d/physics_2d_server_wrap_mt.h
+++ b/servers/physics_2d/physics_2d_server_wrap_mt.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/shape_2d_sw.cpp b/servers/physics_2d/shape_2d_sw.cpp
index 94b0a0a0c7..558700f400 100644
--- a/servers/physics_2d/shape_2d_sw.cpp
+++ b/servers/physics_2d/shape_2d_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/shape_2d_sw.h b/servers/physics_2d/shape_2d_sw.h
index d937301f3c..632032cc23 100644
--- a/servers/physics_2d/shape_2d_sw.h
+++ b/servers/physics_2d/shape_2d_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/space_2d_sw.cpp b/servers/physics_2d/space_2d_sw.cpp
index 720742c198..3d8005cd4d 100644
--- a/servers/physics_2d/space_2d_sw.cpp
+++ b/servers/physics_2d/space_2d_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/space_2d_sw.h b/servers/physics_2d/space_2d_sw.h
index bf4ea12eb5..64f8c9e156 100644
--- a/servers/physics_2d/space_2d_sw.h
+++ b/servers/physics_2d/space_2d_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/step_2d_sw.cpp b/servers/physics_2d/step_2d_sw.cpp
index e4e1b03623..6c23160cb7 100644
--- a/servers/physics_2d/step_2d_sw.cpp
+++ b/servers/physics_2d/step_2d_sw.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d/step_2d_sw.h b/servers/physics_2d/step_2d_sw.h
index 4aa669d3a7..23385f6950 100644
--- a/servers/physics_2d/step_2d_sw.h
+++ b/servers/physics_2d/step_2d_sw.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d_server.cpp b/servers/physics_2d_server.cpp
index 2ed8a4c478..99f539ea86 100644
--- a/servers/physics_2d_server.cpp
+++ b/servers/physics_2d_server.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_2d_server.h b/servers/physics_2d_server.h
index 32e1dd1a08..86375b8e9e 100644
--- a/servers/physics_2d_server.h
+++ b/servers/physics_2d_server.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_server.cpp b/servers/physics_server.cpp
index 888e16e0c3..967e74d322 100644
--- a/servers/physics_server.cpp
+++ b/servers/physics_server.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/physics_server.h b/servers/physics_server.h
index 15b353f768..4ba096a994 100644
--- a/servers/physics_server.h
+++ b/servers/physics_server.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -734,6 +734,9 @@ public:
virtual void generic_6dof_joint_set_flag(RID p_joint, Vector3::Axis, G6DOFJointAxisFlag p_flag, bool p_enable) = 0;
virtual bool generic_6dof_joint_get_flag(RID p_joint, Vector3::Axis, G6DOFJointAxisFlag p_flag) = 0;
+ virtual void generic_6dof_joint_set_precision(RID p_joint, int precision) = 0;
+ virtual int generic_6dof_joint_get_precision(RID p_joint) = 0;
+
/* QUERY API */
enum AreaBodyStatus {
diff --git a/servers/register_server_types.cpp b/servers/register_server_types.cpp
index 7deeec676b..0c43000186 100644
--- a/servers/register_server_types.cpp
+++ b/servers/register_server_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/register_server_types.h b/servers/register_server_types.h
index 0af41ae424..f42a5e7afc 100644
--- a/servers/register_server_types.h
+++ b/servers/register_server_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/server_wrap_mt_common.h b/servers/server_wrap_mt_common.h
index 843773e5b1..f0ab256374 100644
--- a/servers/server_wrap_mt_common.h
+++ b/servers/server_wrap_mt_common.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/visual/rasterizer.cpp b/servers/visual/rasterizer.cpp
index 6c04d1de63..5e02238e85 100644
--- a/servers/visual/rasterizer.cpp
+++ b/servers/visual/rasterizer.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/visual/rasterizer.h b/servers/visual/rasterizer.h
index f9beeb226c..394592ec64 100644
--- a/servers/visual/rasterizer.h
+++ b/servers/visual/rasterizer.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -55,6 +55,7 @@ public:
virtual void environment_set_background(RID p_env, VS::EnvironmentBG p_bg) = 0;
virtual void environment_set_sky(RID p_env, RID p_sky) = 0;
virtual void environment_set_sky_custom_fov(RID p_env, float p_scale) = 0;
+ virtual void environment_set_sky_orientation(RID p_env, const Basis &p_orientation) = 0;
virtual void environment_set_bg_color(RID p_env, const Color &p_color) = 0;
virtual void environment_set_bg_energy(RID p_env, float p_energy) = 0;
virtual void environment_set_canvas_max_layer(RID p_env, int p_max_layer) = 0;
@@ -62,7 +63,7 @@ public:
virtual void environment_set_dof_blur_near(RID p_env, bool p_enable, float p_distance, float p_transition, float p_far_amount, VS::EnvironmentDOFBlurQuality p_quality) = 0;
virtual void environment_set_dof_blur_far(RID p_env, bool p_enable, float p_distance, float p_transition, float p_far_amount, VS::EnvironmentDOFBlurQuality p_quality) = 0;
- virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, VS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, bool p_bicubic_upscale) = 0;
+ virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, VS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, bool p_bicubic_upscale) = 0;
virtual void environment_set_fog(RID p_env, bool p_enable, float p_begin, float p_end, RID p_gradient_texture) = 0;
virtual void environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_int, float p_fade_out, float p_depth_tolerance, bool p_roughness) = 0;
@@ -518,6 +519,8 @@ public:
virtual void particles_set_fractional_delta(RID p_particles, bool p_enable) = 0;
virtual void particles_restart(RID p_particles) = 0;
+ virtual bool particles_is_inactive(RID p_particles) const = 0;
+
virtual void particles_set_draw_order(RID p_particles, VS::ParticlesDrawOrder p_order) = 0;
virtual void particles_set_draw_passes(RID p_particles, int p_count) = 0;
@@ -653,7 +656,7 @@ public:
next_ptr = NULL;
mask_next_ptr = NULL;
filter_next_ptr = NULL;
- shadow_buffer_size = 256;
+ shadow_buffer_size = 2048;
shadow_gradient_length = 0;
shadow_filter = VS::CANVAS_LIGHT_FILTER_NONE;
shadow_smooth = 0.0;
diff --git a/servers/visual/shader_language.cpp b/servers/visual/shader_language.cpp
index 358ed8ca54..c2dae7c2d5 100644
--- a/servers/visual/shader_language.cpp
+++ b/servers/visual/shader_language.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -131,7 +131,6 @@ const char *ShaderLanguage::token_names[TK_MAX] = {
"TYPE_USAMPLER3D",
"TYPE_SAMPLERCUBE",
"INTERPOLATION_FLAT",
- "INTERPOLATION_NO_PERSPECTIVE",
"INTERPOLATION_SMOOTH",
"PRECISION_LOW",
"PRECISION_MID",
@@ -271,7 +270,6 @@ const ShaderLanguage::KeyWord ShaderLanguage::keyword_list[] = {
{ TK_TYPE_USAMPLER3D, "usampler3D" },
{ TK_TYPE_SAMPLERCUBE, "samplerCube" },
{ TK_INTERPOLATION_FLAT, "flat" },
- { TK_INTERPOLATION_NO_PERSPECTIVE, "noperspective" },
{ TK_INTERPOLATION_SMOOTH, "smooth" },
{ TK_PRECISION_LOW, "lowp" },
{ TK_PRECISION_MID, "mediump" },
@@ -527,7 +525,6 @@ ShaderLanguage::Token ShaderLanguage::_get_token() {
bool exponent_found = false;
bool hexa_found = false;
bool sign_found = false;
- bool minus_exponent_found = false;
bool float_suffix_found = false;
String str;
@@ -559,8 +556,6 @@ ShaderLanguage::Token ShaderLanguage::_get_token() {
if (sign_found)
return _make_token(TK_ERROR, "Invalid numeric constant");
sign_found = true;
- if (GETCHAR(i) == '-')
- minus_exponent_found = true;
} else
break;
@@ -573,7 +568,7 @@ ShaderLanguage::Token ShaderLanguage::_get_token() {
if (hexa_found) {
//hex integers eg."0xFF" or "0x12AB", etc - NOT supported yet
return _make_token(TK_ERROR, "Invalid (hexadecimal) numeric constant - Not supported");
- } else if (period_found || float_suffix_found) {
+ } else if (period_found || exponent_found || float_suffix_found) {
//floats
if (period_found) {
if (float_suffix_found) {
@@ -616,7 +611,7 @@ ShaderLanguage::Token ShaderLanguage::_get_token() {
char_idx += str.length();
Token tk;
- if (period_found || minus_exponent_found || float_suffix_found)
+ if (period_found || exponent_found || float_suffix_found)
tk.type = TK_REAL_CONSTANT;
else
tk.type = TK_INT_CONSTANT;
@@ -759,7 +754,6 @@ bool ShaderLanguage::is_token_interpolation(TokenType p_type) {
return (
p_type == TK_INTERPOLATION_FLAT ||
- p_type == TK_INTERPOLATION_NO_PERSPECTIVE ||
p_type == TK_INTERPOLATION_SMOOTH);
}
@@ -767,8 +761,6 @@ ShaderLanguage::DataInterpolation ShaderLanguage::get_token_interpolation(TokenT
if (p_type == TK_INTERPOLATION_FLAT)
return INTERPOLATION_FLAT;
- else if (p_type == TK_INTERPOLATION_NO_PERSPECTIVE)
- return INTERPOLATION_NO_PERSPECTIVE;
else
return INTERPOLATION_SMOOTH;
}
@@ -1220,6 +1212,15 @@ bool ShaderLanguage::_validate_operator(OperatorNode *p_op, DataType *r_ret_type
} else if (p_op->op == OP_ASSIGN_MUL && na == TYPE_MAT4 && nb == TYPE_VEC4) {
valid = true;
ret_type = TYPE_MAT4;
+ } else if (p_op->op == OP_ASSIGN_MUL && na == TYPE_VEC2 && nb == TYPE_MAT2) {
+ valid = true;
+ ret_type = TYPE_VEC2;
+ } else if (p_op->op == OP_ASSIGN_MUL && na == TYPE_VEC3 && nb == TYPE_MAT3) {
+ valid = true;
+ ret_type = TYPE_VEC3;
+ } else if (p_op->op == OP_ASSIGN_MUL && na == TYPE_VEC4 && nb == TYPE_MAT4) {
+ valid = true;
+ ret_type = TYPE_VEC4;
}
} break;
case OP_ASSIGN_BIT_AND:
diff --git a/servers/visual/shader_language.h b/servers/visual/shader_language.h
index b51106fad7..b908f9539b 100644
--- a/servers/visual/shader_language.h
+++ b/servers/visual/shader_language.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -80,7 +80,6 @@ public:
TK_TYPE_USAMPLER3D,
TK_TYPE_SAMPLERCUBE,
TK_INTERPOLATION_FLAT,
- TK_INTERPOLATION_NO_PERSPECTIVE,
TK_INTERPOLATION_SMOOTH,
TK_PRECISION_LOW,
TK_PRECISION_MID,
@@ -210,7 +209,6 @@ public:
enum DataInterpolation {
INTERPOLATION_FLAT,
- INTERPOLATION_NO_PERSPECTIVE,
INTERPOLATION_SMOOTH,
};
diff --git a/servers/visual/shader_types.cpp b/servers/visual/shader_types.cpp
index baafe2f8d0..7a42bc475e 100644
--- a/servers/visual/shader_types.cpp
+++ b/servers/visual/shader_types.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -60,6 +60,7 @@ ShaderTypes::ShaderTypes() {
shader_modes[VS::SHADER_SPATIAL].functions["vertex"].built_ins["NORMAL"] = ShaderLanguage::TYPE_VEC3;
shader_modes[VS::SHADER_SPATIAL].functions["vertex"].built_ins["TANGENT"] = ShaderLanguage::TYPE_VEC3;
shader_modes[VS::SHADER_SPATIAL].functions["vertex"].built_ins["BINORMAL"] = ShaderLanguage::TYPE_VEC3;
+ shader_modes[VS::SHADER_SPATIAL].functions["vertex"].built_ins["POSITION"] = ShaderLanguage::TYPE_VEC4;
shader_modes[VS::SHADER_SPATIAL].functions["vertex"].built_ins["UV"] = ShaderLanguage::TYPE_VEC2;
shader_modes[VS::SHADER_SPATIAL].functions["vertex"].built_ins["UV2"] = ShaderLanguage::TYPE_VEC2;
shader_modes[VS::SHADER_SPATIAL].functions["vertex"].built_ins["COLOR"] = ShaderLanguage::TYPE_VEC4;
@@ -86,6 +87,7 @@ ShaderTypes::ShaderTypes() {
shader_modes[VS::SHADER_SPATIAL].functions["fragment"].built_ins["NORMAL"] = ShaderLanguage::TYPE_VEC3;
shader_modes[VS::SHADER_SPATIAL].functions["fragment"].built_ins["TANGENT"] = ShaderLanguage::TYPE_VEC3;
shader_modes[VS::SHADER_SPATIAL].functions["fragment"].built_ins["BINORMAL"] = ShaderLanguage::TYPE_VEC3;
+ shader_modes[VS::SHADER_SPATIAL].functions["fragment"].built_ins["VIEW"] = constt(ShaderLanguage::TYPE_VEC3);
shader_modes[VS::SHADER_SPATIAL].functions["fragment"].built_ins["NORMALMAP"] = ShaderLanguage::TYPE_VEC3;
shader_modes[VS::SHADER_SPATIAL].functions["fragment"].built_ins["NORMALMAP_DEPTH"] = ShaderLanguage::TYPE_FLOAT;
shader_modes[VS::SHADER_SPATIAL].functions["fragment"].built_ins["UV"] = constt(ShaderLanguage::TYPE_VEC2);
@@ -118,6 +120,7 @@ ShaderTypes::ShaderTypes() {
shader_modes[VS::SHADER_SPATIAL].functions["fragment"].built_ins["WORLD_MATRIX"] = constt(ShaderLanguage::TYPE_MAT4);
shader_modes[VS::SHADER_SPATIAL].functions["fragment"].built_ins["INV_CAMERA_MATRIX"] = constt(ShaderLanguage::TYPE_MAT4);
+ shader_modes[VS::SHADER_SPATIAL].functions["fragment"].built_ins["CAMERA_MATRIX"] = constt(ShaderLanguage::TYPE_MAT4);
shader_modes[VS::SHADER_SPATIAL].functions["fragment"].built_ins["PROJECTION_MATRIX"] = constt(ShaderLanguage::TYPE_MAT4);
shader_modes[VS::SHADER_SPATIAL].functions["fragment"].built_ins["INV_PROJECTION_MATRIX"] = constt(ShaderLanguage::TYPE_MAT4);
shader_modes[VS::SHADER_SPATIAL].functions["fragment"].built_ins["TIME"] = constt(ShaderLanguage::TYPE_FLOAT);
@@ -126,6 +129,7 @@ ShaderTypes::ShaderTypes() {
shader_modes[VS::SHADER_SPATIAL].functions["light"].built_ins["WORLD_MATRIX"] = constt(ShaderLanguage::TYPE_MAT4);
shader_modes[VS::SHADER_SPATIAL].functions["light"].built_ins["INV_CAMERA_MATRIX"] = constt(ShaderLanguage::TYPE_MAT4);
+ shader_modes[VS::SHADER_SPATIAL].functions["light"].built_ins["CAMERA_MATRIX"] = constt(ShaderLanguage::TYPE_MAT4);
shader_modes[VS::SHADER_SPATIAL].functions["light"].built_ins["PROJECTION_MATRIX"] = constt(ShaderLanguage::TYPE_MAT4);
shader_modes[VS::SHADER_SPATIAL].functions["light"].built_ins["INV_PROJECTION_MATRIX"] = constt(ShaderLanguage::TYPE_MAT4);
shader_modes[VS::SHADER_SPATIAL].functions["light"].built_ins["TIME"] = constt(ShaderLanguage::TYPE_FLOAT);
@@ -229,7 +233,7 @@ ShaderTypes::ShaderTypes() {
shader_modes[VS::SHADER_CANVAS_ITEM].functions["light"].built_ins["LIGHT_VEC"] = ShaderLanguage::TYPE_VEC2;
shader_modes[VS::SHADER_CANVAS_ITEM].functions["light"].built_ins["LIGHT_HEIGHT"] = ShaderLanguage::TYPE_FLOAT;
shader_modes[VS::SHADER_CANVAS_ITEM].functions["light"].built_ins["LIGHT_COLOR"] = ShaderLanguage::TYPE_VEC4;
- shader_modes[VS::SHADER_CANVAS_ITEM].functions["light"].built_ins["LIGHT_UV"] = ShaderLanguage::TYPE_VEC2;
+ shader_modes[VS::SHADER_CANVAS_ITEM].functions["light"].built_ins["LIGHT_UV"] = constt(ShaderLanguage::TYPE_VEC2);
shader_modes[VS::SHADER_CANVAS_ITEM].functions["light"].built_ins["LIGHT"] = ShaderLanguage::TYPE_VEC4;
shader_modes[VS::SHADER_CANVAS_ITEM].functions["light"].built_ins["SHADOW_COLOR"] = ShaderLanguage::TYPE_VEC4;
shader_modes[VS::SHADER_CANVAS_ITEM].functions["light"].built_ins["POINT_COORD"] = constt(ShaderLanguage::TYPE_VEC2);
diff --git a/servers/visual/shader_types.h b/servers/visual/shader_types.h
index e195b6ea20..149c9b5e1f 100644
--- a/servers/visual/shader_types.h
+++ b/servers/visual/shader_types.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/visual/visual_server_canvas.cpp b/servers/visual/visual_server_canvas.cpp
index 74a05ce4e4..84338bccca 100644
--- a/servers/visual/visual_server_canvas.cpp
+++ b/servers/visual/visual_server_canvas.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -51,7 +51,7 @@ void VisualServerCanvas::_render_canvas_item_tree(Item *p_canvas_item, const Tra
}
}
-void _collect_ysort_children(VisualServerCanvas::Item *p_canvas_item, Transform2D p_transform, VisualServerCanvas::Item **r_items, Transform2D *r_extra_transforms, int &r_index) {
+void _collect_ysort_children(VisualServerCanvas::Item *p_canvas_item, Transform2D p_transform, VisualServerCanvas::Item **r_items, int &r_index) {
int child_item_count = p_canvas_item->child_items.size();
VisualServerCanvas::Item **child_items = p_canvas_item->child_items.ptrw();
for (int i = 0; i < child_item_count; i++) {
@@ -64,7 +64,14 @@ void _collect_ysort_children(VisualServerCanvas::Item *p_canvas_item, Transform2
r_index++;
if (child_items[i]->sort_y)
- _collect_ysort_children(child_items[i], p_transform * child_items[i]->xform, r_items, r_extra_transforms, r_index);
+ _collect_ysort_children(child_items[i], p_transform * child_items[i]->xform, r_items, r_index);
+ }
+}
+
+void _mark_ysort_dirty(VisualServerCanvas::Item *ysort_owner, RID_Owner<VisualServerCanvas::Item> &canvas_item_owner) {
+ while (ysort_owner && ysort_owner->sort_y) {
+ ysort_owner->ysort_children_count = -1;
+ ysort_owner = canvas_item_owner.owns(ysort_owner->parent) ? canvas_item_owner.getornull(ysort_owner->parent) : NULL;
}
}
@@ -100,7 +107,6 @@ void VisualServerCanvas::_render_canvas_item(Item *p_canvas_item, const Transfor
int child_item_count = ci->child_items.size();
Item **child_items = ci->child_items.ptrw();
- Transform2D *child_extra_transforms = NULL;
if (ci->clip) {
if (p_canvas_clip != NULL) {
@@ -118,14 +124,14 @@ void VisualServerCanvas::_render_canvas_item(Item *p_canvas_item, const Transfor
if (ci->ysort_children_count == -1) {
ci->ysort_children_count = 0;
- _collect_ysort_children(ci, Transform2D(), NULL, NULL, ci->ysort_children_count);
+ _collect_ysort_children(ci, Transform2D(), NULL, ci->ysort_children_count);
}
child_item_count = ci->ysort_children_count;
child_items = (Item **)alloca(child_item_count * sizeof(Item *));
int i = 0;
- _collect_ysort_children(ci, Transform2D(), child_items, child_extra_transforms, i);
+ _collect_ysort_children(ci, Transform2D(), child_items, i);
SortArray<Item *, ItemPtrSort> sorter;
sorter.sort(child_items, child_item_count);
@@ -336,7 +342,8 @@ void VisualServerCanvas::canvas_item_set_parent(RID p_item, RID p_parent) {
Item *item_owner = canvas_item_owner.get(canvas_item->parent);
item_owner->child_items.erase(canvas_item);
- item_owner->ysort_children_count = -1;
+
+ _mark_ysort_dirty(item_owner, canvas_item_owner);
}
canvas_item->parent = RID();
@@ -356,11 +363,7 @@ void VisualServerCanvas::canvas_item_set_parent(RID p_item, RID p_parent) {
item_owner->child_items.push_back(canvas_item);
item_owner->children_order_dirty = true;
- Item *ysort_owner = item_owner;
- while (ysort_owner && ysort_owner->sort_y) {
- item_owner->ysort_children_count = -1;
- ysort_owner = canvas_item_owner.getornull(ysort_owner->parent);
- }
+ _mark_ysort_dirty(item_owner, canvas_item_owner);
} else {
@@ -869,7 +872,8 @@ void VisualServerCanvas::canvas_item_set_sort_children_by_y(RID p_item, bool p_e
ERR_FAIL_COND(!canvas_item);
canvas_item->sort_y = p_enable;
- canvas_item->ysort_children_count = -1;
+
+ _mark_ysort_dirty(canvas_item, canvas_item_owner);
}
void VisualServerCanvas::canvas_item_set_z_index(RID p_item, int p_z) {
@@ -1106,6 +1110,7 @@ void VisualServerCanvas::canvas_light_set_shadow_buffer_size(RID p_light, int p_
if (new_size == clight->shadow_buffer_size)
return;
+ print_line("create shadow buffer: " + itos(p_size));
clight->shadow_buffer_size = next_power_of_2(p_size);
if (clight->shadow_buffer.is_valid()) {
@@ -1346,6 +1351,8 @@ bool VisualServerCanvas::free(RID p_rid) {
Item *item_owner = canvas_item_owner.get(canvas_item->parent);
item_owner->child_items.erase(canvas_item);
+
+ _mark_ysort_dirty(item_owner, canvas_item_owner);
}
}
diff --git a/servers/visual/visual_server_canvas.h b/servers/visual/visual_server_canvas.h
index 4b7422b15a..7d788cbe14 100644
--- a/servers/visual/visual_server_canvas.h
+++ b/servers/visual/visual_server_canvas.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/visual/visual_server_global.cpp b/servers/visual/visual_server_global.cpp
index 61a8951f75..2d6d489759 100644
--- a/servers/visual/visual_server_global.cpp
+++ b/servers/visual/visual_server_global.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/visual/visual_server_global.h b/servers/visual/visual_server_global.h
index b4888dfd50..b510307e81 100644
--- a/servers/visual/visual_server_global.h
+++ b/servers/visual/visual_server_global.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/visual/visual_server_light_baker.cpp b/servers/visual/visual_server_light_baker.cpp
index ed87e84a03..5626a72283 100644
--- a/servers/visual/visual_server_light_baker.cpp
+++ b/servers/visual/visual_server_light_baker.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/visual/visual_server_light_baker.h b/servers/visual/visual_server_light_baker.h
index 77472d0994..6e1148d622 100644
--- a/servers/visual/visual_server_light_baker.h
+++ b/servers/visual/visual_server_light_baker.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/visual/visual_server_raster.cpp b/servers/visual/visual_server_raster.cpp
index 677c323216..7be3bc562d 100644
--- a/servers/visual/visual_server_raster.cpp
+++ b/servers/visual/visual_server_raster.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/visual/visual_server_raster.h b/servers/visual/visual_server_raster.h
index d37fe28ac6..e6434189f9 100644
--- a/servers/visual/visual_server_raster.h
+++ b/servers/visual/visual_server_raster.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -495,6 +495,7 @@ public:
BIND2(environment_set_background, RID, EnvironmentBG)
BIND2(environment_set_sky, RID, RID)
BIND2(environment_set_sky_custom_fov, RID, float)
+ BIND2(environment_set_sky_orientation, RID, const Basis &)
BIND2(environment_set_bg_color, RID, const Color &)
BIND2(environment_set_bg_energy, RID, float)
BIND2(environment_set_canvas_max_layer, RID, int)
@@ -504,7 +505,7 @@ public:
BIND6(environment_set_dof_blur_near, RID, bool, float, float, float, EnvironmentDOFBlurQuality)
BIND6(environment_set_dof_blur_far, RID, bool, float, float, float, EnvironmentDOFBlurQuality)
- BIND10(environment_set_glow, RID, bool, int, float, float, float, EnvironmentGlowBlendMode, float, float, bool)
+ BIND11(environment_set_glow, RID, bool, int, float, float, float, EnvironmentGlowBlendMode, float, float, float, bool)
BIND9(environment_set_tonemap, RID, EnvironmentToneMapper, float, float, bool, float, float, float, float)
diff --git a/servers/visual/visual_server_scene.cpp b/servers/visual/visual_server_scene.cpp
index 13de92f226..53e8d6a030 100644
--- a/servers/visual/visual_server_scene.cpp
+++ b/servers/visual/visual_server_scene.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -1912,9 +1912,14 @@ void VisualServerScene::_prepare_scene(const Transform p_cam_transform, const Ca
if (ins->base_type == VS::INSTANCE_PARTICLES) {
//particles visible? process them
- VSG::storage->particles_request_process(ins->base);
- //particles visible? request redraw
- VisualServerRaster::redraw_request();
+ if (VSG::storage->particles_is_inactive(ins->base)) {
+ //but if nothing is going on, don't do it.
+ keep = false;
+ } else {
+ VSG::storage->particles_request_process(ins->base);
+ //particles visible? request redraw
+ VisualServerRaster::redraw_request();
+ }
}
if (geom->lighting_dirty) {
diff --git a/servers/visual/visual_server_scene.h b/servers/visual/visual_server_scene.h
index 38c5258116..539855bdc4 100644
--- a/servers/visual/visual_server_scene.h
+++ b/servers/visual/visual_server_scene.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/visual/visual_server_viewport.cpp b/servers/visual/visual_server_viewport.cpp
index 571b71db85..92b17eae47 100644
--- a/servers/visual/visual_server_viewport.cpp
+++ b/servers/visual/visual_server_viewport.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/visual/visual_server_viewport.h b/servers/visual/visual_server_viewport.h
index 66baa48458..4e3015c020 100644
--- a/servers/visual/visual_server_viewport.h
+++ b/servers/visual/visual_server_viewport.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/visual/visual_server_wrap_mt.cpp b/servers/visual/visual_server_wrap_mt.cpp
index f59d8af9cb..79e4d8cbba 100644
--- a/servers/visual/visual_server_wrap_mt.cpp
+++ b/servers/visual/visual_server_wrap_mt.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/servers/visual/visual_server_wrap_mt.h b/servers/visual/visual_server_wrap_mt.h
index 1aeb2756ba..a6f0bd9d16 100644
--- a/servers/visual/visual_server_wrap_mt.h
+++ b/servers/visual/visual_server_wrap_mt.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -421,6 +421,7 @@ public:
FUNC2(environment_set_background, RID, EnvironmentBG)
FUNC2(environment_set_sky, RID, RID)
FUNC2(environment_set_sky_custom_fov, RID, float)
+ FUNC2(environment_set_sky_orientation, RID, const Basis &)
FUNC2(environment_set_bg_color, RID, const Color &)
FUNC2(environment_set_bg_energy, RID, float)
FUNC2(environment_set_canvas_max_layer, RID, int)
@@ -430,7 +431,7 @@ public:
FUNC6(environment_set_dof_blur_near, RID, bool, float, float, float, EnvironmentDOFBlurQuality)
FUNC6(environment_set_dof_blur_far, RID, bool, float, float, float, EnvironmentDOFBlurQuality)
- FUNC10(environment_set_glow, RID, bool, int, float, float, float, EnvironmentGlowBlendMode, float, float, bool)
+ FUNC11(environment_set_glow, RID, bool, int, float, float, float, EnvironmentGlowBlendMode, float, float, float, bool)
FUNC9(environment_set_tonemap, RID, EnvironmentToneMapper, float, float, bool, float, float, float, float)
diff --git a/servers/visual_server.cpp b/servers/visual_server.cpp
index ca5271190c..02acf72951 100644
--- a/servers/visual_server.cpp
+++ b/servers/visual_server.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -343,7 +343,7 @@ RID VisualServer::get_white_texture() {
#define SMALL_VEC2 Vector2(0.00001, 0.00001)
#define SMALL_VEC3 Vector3(0.00001, 0.00001, 0.00001)
-Error VisualServer::_surface_set_data(Array p_arrays, uint32_t p_format, uint32_t *p_offsets, uint32_t p_stride, PoolVector<uint8_t> &r_vertex_array, int p_vertex_array_len, PoolVector<uint8_t> &r_index_array, int p_index_array_len, AABB &r_aabb, Vector<AABB> r_bone_aabb) {
+Error VisualServer::_surface_set_data(Array p_arrays, uint32_t p_format, uint32_t *p_offsets, uint32_t p_stride, PoolVector<uint8_t> &r_vertex_array, int p_vertex_array_len, PoolVector<uint8_t> &r_index_array, int p_index_array_len, AABB &r_aabb, Vector<AABB> &r_bone_aabb) {
PoolVector<uint8_t>::Write vw = r_vertex_array.write();
@@ -1903,13 +1903,14 @@ void VisualServer::_bind_methods() {
ClassDB::bind_method(D_METHOD("environment_set_background", "env", "bg"), &VisualServer::environment_set_background);
ClassDB::bind_method(D_METHOD("environment_set_sky", "env", "sky"), &VisualServer::environment_set_sky);
ClassDB::bind_method(D_METHOD("environment_set_sky_custom_fov", "env", "scale"), &VisualServer::environment_set_sky_custom_fov);
+ ClassDB::bind_method(D_METHOD("environment_set_sky_orientation", "env", "orientation"), &VisualServer::environment_set_sky_orientation);
ClassDB::bind_method(D_METHOD("environment_set_bg_color", "env", "color"), &VisualServer::environment_set_bg_color);
ClassDB::bind_method(D_METHOD("environment_set_bg_energy", "env", "energy"), &VisualServer::environment_set_bg_energy);
ClassDB::bind_method(D_METHOD("environment_set_canvas_max_layer", "env", "max_layer"), &VisualServer::environment_set_canvas_max_layer);
ClassDB::bind_method(D_METHOD("environment_set_ambient_light", "env", "color", "energy", "sky_contibution"), &VisualServer::environment_set_ambient_light, DEFVAL(1.0), DEFVAL(0.0));
ClassDB::bind_method(D_METHOD("environment_set_dof_blur_near", "env", "enable", "distance", "transition", "far_amount", "quality"), &VisualServer::environment_set_dof_blur_near);
ClassDB::bind_method(D_METHOD("environment_set_dof_blur_far", "env", "enable", "distance", "transition", "far_amount", "quality"), &VisualServer::environment_set_dof_blur_far);
- ClassDB::bind_method(D_METHOD("environment_set_glow", "env", "enable", "level_flags", "intensity", "strength", "bloom_threshold", "blend_mode", "hdr_bleed_threshold", "hdr_bleed_scale", "bicubic_upscale"), &VisualServer::environment_set_glow);
+ ClassDB::bind_method(D_METHOD("environment_set_glow", "env", "enable", "level_flags", "intensity", "strength", "bloom_threshold", "blend_mode", "hdr_bleed_threshold", "hdr_bleed_scale", "hdr_luminance_cap", "bicubic_upscale"), &VisualServer::environment_set_glow);
ClassDB::bind_method(D_METHOD("environment_set_tonemap", "env", "tone_mapper", "exposure", "white", "auto_exposure", "min_luminance", "max_luminance", "auto_exp_speed", "auto_exp_grey"), &VisualServer::environment_set_tonemap);
ClassDB::bind_method(D_METHOD("environment_set_adjustment", "env", "enable", "brightness", "contrast", "saturation", "ramp"), &VisualServer::environment_set_adjustment);
ClassDB::bind_method(D_METHOD("environment_set_ssr", "env", "enable", "max_steps", "fade_in", "fade_out", "depth_tolerance", "roughness"), &VisualServer::environment_set_ssr);
@@ -1923,7 +1924,7 @@ void VisualServer::_bind_methods() {
ClassDB::bind_method(D_METHOD("scenario_create"), &VisualServer::scenario_create);
ClassDB::bind_method(D_METHOD("scenario_set_debug", "scenario", "debug_mode"), &VisualServer::scenario_set_debug);
ClassDB::bind_method(D_METHOD("scenario_set_environment", "scenario", "environment"), &VisualServer::scenario_set_environment);
- ClassDB::bind_method(D_METHOD("scenario_set_reflection_atlas_size", "scenario", "p_size", "subdiv"), &VisualServer::scenario_set_reflection_atlas_size);
+ ClassDB::bind_method(D_METHOD("scenario_set_reflection_atlas_size", "scenario", "size", "subdiv"), &VisualServer::scenario_set_reflection_atlas_size);
ClassDB::bind_method(D_METHOD("scenario_set_fallback_environment", "scenario", "environment"), &VisualServer::scenario_set_fallback_environment);
#ifndef _3D_DISABLED
@@ -2259,6 +2260,9 @@ void VisualServer::_bind_methods() {
BIND_ENUM_CONSTANT(MULTIMESH_COLOR_NONE);
BIND_ENUM_CONSTANT(MULTIMESH_COLOR_8BIT);
BIND_ENUM_CONSTANT(MULTIMESH_COLOR_FLOAT);
+ BIND_ENUM_CONSTANT(MULTIMESH_CUSTOM_DATA_NONE);
+ BIND_ENUM_CONSTANT(MULTIMESH_CUSTOM_DATA_8BIT);
+ BIND_ENUM_CONSTANT(MULTIMESH_CUSTOM_DATA_FLOAT);
BIND_ENUM_CONSTANT(REFLECTION_PROBE_UPDATE_ONCE);
BIND_ENUM_CONSTANT(REFLECTION_PROBE_UPDATE_ALWAYS);
diff --git a/servers/visual_server.h b/servers/visual_server.h
index 59eb43da97..96a5d19efd 100644
--- a/servers/visual_server.h
+++ b/servers/visual_server.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -61,7 +61,7 @@ protected:
RID white_texture;
RID test_material;
- Error _surface_set_data(Array p_arrays, uint32_t p_format, uint32_t *p_offsets, uint32_t p_stride, PoolVector<uint8_t> &r_vertex_array, int p_vertex_array_len, PoolVector<uint8_t> &r_index_array, int p_index_array_len, AABB &r_aabb, Vector<AABB> r_bone_aabb);
+ Error _surface_set_data(Array p_arrays, uint32_t p_format, uint32_t *p_offsets, uint32_t p_stride, PoolVector<uint8_t> &r_vertex_array, int p_vertex_array_len, PoolVector<uint8_t> &r_index_array, int p_index_array_len, AABB &r_aabb, Vector<AABB> &r_bone_aabb);
static VisualServer *(*create_func)();
static void _bind_methods();
@@ -709,6 +709,7 @@ public:
virtual void environment_set_background(RID p_env, EnvironmentBG p_bg) = 0;
virtual void environment_set_sky(RID p_env, RID p_sky) = 0;
virtual void environment_set_sky_custom_fov(RID p_env, float p_scale) = 0;
+ virtual void environment_set_sky_orientation(RID p_env, const Basis &p_orientation) = 0;
virtual void environment_set_bg_color(RID p_env, const Color &p_color) = 0;
virtual void environment_set_bg_energy(RID p_env, float p_energy) = 0;
virtual void environment_set_canvas_max_layer(RID p_env, int p_max_layer) = 0;
@@ -733,7 +734,7 @@ public:
GLOW_BLEND_MODE_SOFTLIGHT,
GLOW_BLEND_MODE_REPLACE,
};
- virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, bool p_bicubic_upscale) = 0;
+ virtual void environment_set_glow(RID p_env, bool p_enable, int p_level_flags, float p_intensity, float p_strength, float p_bloom_threshold, EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, bool p_bicubic_upscale) = 0;
enum EnvironmentToneMapper {
ENV_TONE_MAPPER_LINEAR,
diff --git a/thirdparty/README.md b/thirdparty/README.md
index 1e1fea85e5..186f183ea2 100644
--- a/thirdparty/README.md
+++ b/thirdparty/README.md
@@ -19,7 +19,7 @@ comments.
## bullet
- Upstream: https://github.com/bulletphysics/bullet3
-- Version: git (12409f1118a7c7a266f9071350c70789dfe73bb9, Commits on Sep 6, 2018 )
+- Version: git (126b676, 2018-12-31)
- License: zlib
Files extracted from upstream source:
@@ -31,7 +31,7 @@ Files extracted from upstream source:
## certs
- Upstream: Mozilla, via https://apps.fedoraproject.org/packages/ca-certificates
-- Version: 2018.2.22
+- Version: 2018.2.26
- License: MPL 2.0
File extracted from a recent Fedora install:
@@ -128,7 +128,7 @@ Files extracted from upstream source:
## glad
- Upstream: https://github.com/Dav1dde/glad
-- Version: 0.1.25
+- Version: 0.1.28
- License: MIT
The files we package are automatically generated.
@@ -229,11 +229,14 @@ TODO.
Important: File `libvpx/vpx_dsp/x86/vpx_subpixel_8t_intrin_avx2.c` has
Godot-made change marked with `// -- GODOT --` comments.
+The files `libvpx/third_party/android/cpu-features.{c,h}` were copied
+from the Android NDK r18.
+
## libwebp
- Upstream: https://chromium.googlesource.com/webm/libwebp/
-- Version: 1.0.0
+- Version: 1.0.1
- License: BSD-3-Clause
Files extracted from upstream source:
@@ -337,6 +340,10 @@ Collection of single-file libraries used in Godot components.
* Upstream: http://www.efgh.com/software/md5.htm
* Version: TBD, might not be latest from above URL
* License: RSA Message-Digest License
+- `open-simplex-noise.{c,h}`
+ * Upstream: https://github.com/smcameron/open-simplex-noise-in-c
+ * Version: git (0d555e7, 2015)
+ * License: Unlicense
- `pcg.{cpp,h}`
* Upstream: http://www.pcg-random.org
* Version: minimal C implementation, http://www.pcg-random.org/download.html
@@ -354,11 +361,6 @@ Collection of single-file libraries used in Godot components.
* Upstream: https://github.com/ivanfratric/polypartition (`src/polypartition.cpp`)
* Version: TBD, class was renamed
* License: MIT
-- `open-simplex-noise.{c,h}`
- * Upstream: https://github.com/smcameron/open-simplex-noise-in-c
- * Version: git (0d555e7, 2015)
- * License: Unlicense
-
### modules
@@ -371,6 +373,13 @@ Collection of single-file libraries used in Godot components.
* Version: ?
* License: BSD
+### platform
+
+- `ifaddrs-android.{cc,h}`
+ * Upstream: https://chromium.googlesource.com/external/webrtc/stable/talk/+/master/base/ifaddrs-android.h
+ * Version: 5976650 (2013)
+ * License: BSD-3-Clause
+
### scene
- `easing_equations.cpp`
@@ -503,7 +512,7 @@ changes are marked with `// -- GODOT --` comments.
## tinyexr
- Upstream: https://github.com/syoyo/tinyexr
-- Version: git (2d5375f, 2018)
+- Version: git (5ae30aa, 2018)
- License: BSD-3-Clause
Files extracted from upstream source:
@@ -525,12 +534,10 @@ Files extracted from upstream source:
## zstd
- Upstream: https://github.com/facebook/zstd
-- Version: 1.3.4
+- Version: 1.3.8
- License: BSD-3-Clause
Files extracted from upstream source:
- lib/{common/,compress/,decompress/,zstd.h}
- LICENSE
-
-- Applied the patch in `thirdparty/zstd/1314.diff` (PR 1314 upstream, already merged). Needed to build on UWP ARM. Can be removed when a new version is released with the patch.
diff --git a/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3BroadphaseCallback.h b/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3BroadphaseCallback.h
index 1bc56cf80a..bec0800a6f 100644
--- a/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3BroadphaseCallback.h
+++ b/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3BroadphaseCallback.h
@@ -19,22 +19,20 @@ subject to the following restrictions:
#include "Bullet3Common/b3Vector3.h"
struct b3BroadphaseProxy;
-
-struct b3BroadphaseAabbCallback
+struct b3BroadphaseAabbCallback
{
virtual ~b3BroadphaseAabbCallback() {}
- virtual bool process(const b3BroadphaseProxy* proxy) = 0;
+ virtual bool process(const b3BroadphaseProxy* proxy) = 0;
};
-
-struct b3BroadphaseRayCallback : public b3BroadphaseAabbCallback
+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;
+ b3Vector3 m_rayDirectionInverse;
+ unsigned int m_signs[3];
+ b3Scalar m_lambda_max;
virtual ~b3BroadphaseRayCallback() {}
};
-#endif //B3_BROADPHASE_CALLBACK_H
+#endif //B3_BROADPHASE_CALLBACK_H
diff --git a/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvh.cpp b/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvh.cpp
index 0f04efe331..a0dc1da95d 100644
--- a/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvh.cpp
+++ b/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvh.cpp
@@ -17,209 +17,224 @@ subject to the following restrictions:
#include "b3DynamicBvh.h"
//
-typedef b3AlignedObjectArray<b3DbvtNode*> b3NodeArray;
-typedef b3AlignedObjectArray<const b3DbvtNode*> b3ConstNodeArray;
+typedef b3AlignedObjectArray<b3DbvtNode*> b3NodeArray;
+typedef b3AlignedObjectArray<const b3DbvtNode*> b3ConstNodeArray;
//
struct b3DbvtNodeEnumerator : b3DynamicBvh::ICollide
{
- b3ConstNodeArray nodes;
+ b3ConstNodeArray nodes;
void Process(const b3DbvtNode* n) { nodes.push_back(n); }
};
//
-static B3_DBVT_INLINE int b3IndexOf(const b3DbvtNode* node)
+static B3_DBVT_INLINE int b3IndexOf(const b3DbvtNode* node)
{
- return(node->parent->childs[1]==node);
+ return (node->parent->childs[1] == node);
}
//
-static B3_DBVT_INLINE b3DbvtVolume b3Merge( const b3DbvtVolume& a,
- const b3DbvtVolume& b)
+static B3_DBVT_INLINE b3DbvtVolume b3Merge(const b3DbvtVolume& a,
+ const b3DbvtVolume& b)
{
-#if (B3_DBVT_MERGE_IMPL==B3_DBVT_IMPL_SSE)
+#if (B3_DBVT_MERGE_IMPL == B3_DBVT_IMPL_SSE)
B3_ATTRIBUTE_ALIGNED16(char locals[sizeof(b3DbvtAabbMm)]);
- b3DbvtVolume& res=*(b3DbvtVolume*)locals;
+ b3DbvtVolume& res = *(b3DbvtVolume*)locals;
#else
- b3DbvtVolume res;
+ b3DbvtVolume res;
#endif
- b3Merge(a,b,res);
- return(res);
+ b3Merge(a, b, res);
+ return (res);
}
// volume+edge lengths
-static B3_DBVT_INLINE b3Scalar b3Size(const b3DbvtVolume& a)
+static B3_DBVT_INLINE b3Scalar b3Size(const b3DbvtVolume& a)
{
- const b3Vector3 edges=a.Lengths();
- return( edges.x*edges.y*edges.z+
- edges.x+edges.y+edges.z);
+ const b3Vector3 edges = a.Lengths();
+ return (edges.x * edges.y * edges.z +
+ edges.x + edges.y + edges.z);
}
//
-static void b3GetMaxDepth(const b3DbvtNode* node,int depth,int& maxdepth)
+static void b3GetMaxDepth(const b3DbvtNode* node, int depth, int& maxdepth)
{
- if(node->isinternal())
+ if (node->isinternal())
{
- b3GetMaxDepth(node->childs[0],depth+1,maxdepth);
- b3GetMaxDepth(node->childs[1],depth+1,maxdepth);
- } else maxdepth=b3Max(maxdepth,depth);
+ b3GetMaxDepth(node->childs[0], depth + 1, maxdepth);
+ b3GetMaxDepth(node->childs[1], depth + 1, maxdepth);
+ }
+ else
+ maxdepth = b3Max(maxdepth, depth);
}
//
-static B3_DBVT_INLINE void b3DeleteNode( b3DynamicBvh* pdbvt,
- b3DbvtNode* node)
+static B3_DBVT_INLINE void b3DeleteNode(b3DynamicBvh* pdbvt,
+ b3DbvtNode* node)
{
b3AlignedFree(pdbvt->m_free);
- pdbvt->m_free=node;
+ pdbvt->m_free = node;
}
//
-static void b3RecurseDeleteNode( b3DynamicBvh* pdbvt,
- b3DbvtNode* node)
+static void b3RecurseDeleteNode(b3DynamicBvh* pdbvt,
+ b3DbvtNode* node)
{
- if(!node->isleaf())
+ if (!node->isleaf())
{
- b3RecurseDeleteNode(pdbvt,node->childs[0]);
- b3RecurseDeleteNode(pdbvt,node->childs[1]);
+ b3RecurseDeleteNode(pdbvt, node->childs[0]);
+ b3RecurseDeleteNode(pdbvt, node->childs[1]);
}
- if(node==pdbvt->m_root) pdbvt->m_root=0;
- b3DeleteNode(pdbvt,node);
+ if (node == pdbvt->m_root) pdbvt->m_root = 0;
+ b3DeleteNode(pdbvt, node);
}
//
-static B3_DBVT_INLINE b3DbvtNode* b3CreateNode( b3DynamicBvh* pdbvt,
- b3DbvtNode* parent,
- void* data)
+static B3_DBVT_INLINE b3DbvtNode* b3CreateNode(b3DynamicBvh* pdbvt,
+ b3DbvtNode* parent,
+ void* data)
{
- b3DbvtNode* node;
- if(pdbvt->m_free)
- { node=pdbvt->m_free;pdbvt->m_free=0; }
+ b3DbvtNode* node;
+ if (pdbvt->m_free)
+ {
+ node = pdbvt->m_free;
+ pdbvt->m_free = 0;
+ }
else
- { node=new(b3AlignedAlloc(sizeof(b3DbvtNode),16)) b3DbvtNode(); }
- node->parent = parent;
- node->data = data;
- node->childs[1] = 0;
- return(node);
+ {
+ node = new (b3AlignedAlloc(sizeof(b3DbvtNode), 16)) b3DbvtNode();
+ }
+ node->parent = parent;
+ node->data = data;
+ node->childs[1] = 0;
+ return (node);
}
//
-static B3_DBVT_INLINE b3DbvtNode* b3CreateNode( b3DynamicBvh* pdbvt,
- b3DbvtNode* parent,
- const b3DbvtVolume& volume,
- void* data)
+static B3_DBVT_INLINE b3DbvtNode* b3CreateNode(b3DynamicBvh* pdbvt,
+ b3DbvtNode* parent,
+ const b3DbvtVolume& volume,
+ void* data)
{
- b3DbvtNode* node=b3CreateNode(pdbvt,parent,data);
- node->volume=volume;
- return(node);
+ b3DbvtNode* node = b3CreateNode(pdbvt, parent, data);
+ node->volume = volume;
+ return (node);
}
//
-static B3_DBVT_INLINE b3DbvtNode* b3CreateNode( b3DynamicBvh* pdbvt,
- b3DbvtNode* parent,
- const b3DbvtVolume& volume0,
- const b3DbvtVolume& volume1,
- void* data)
+static B3_DBVT_INLINE b3DbvtNode* b3CreateNode(b3DynamicBvh* pdbvt,
+ b3DbvtNode* parent,
+ const b3DbvtVolume& volume0,
+ const b3DbvtVolume& volume1,
+ void* data)
{
- b3DbvtNode* node=b3CreateNode(pdbvt,parent,data);
- b3Merge(volume0,volume1,node->volume);
- return(node);
+ b3DbvtNode* node = b3CreateNode(pdbvt, parent, data);
+ b3Merge(volume0, volume1, node->volume);
+ return (node);
}
//
-static void b3InsertLeaf( b3DynamicBvh* pdbvt,
- b3DbvtNode* root,
- b3DbvtNode* leaf)
+static void b3InsertLeaf(b3DynamicBvh* pdbvt,
+ b3DbvtNode* root,
+ b3DbvtNode* leaf)
{
- if(!pdbvt->m_root)
+ if (!pdbvt->m_root)
{
- pdbvt->m_root = leaf;
- leaf->parent = 0;
+ pdbvt->m_root = leaf;
+ leaf->parent = 0;
}
else
{
- if(!root->isleaf())
+ if (!root->isleaf())
{
- do {
- root=root->childs[b3Select( leaf->volume,
- root->childs[0]->volume,
- root->childs[1]->volume)];
- } while(!root->isleaf());
+ do
+ {
+ root = root->childs[b3Select(leaf->volume,
+ root->childs[0]->volume,
+ root->childs[1]->volume)];
+ } while (!root->isleaf());
}
- b3DbvtNode* prev=root->parent;
- b3DbvtNode* node=b3CreateNode(pdbvt,prev,leaf->volume,root->volume,0);
- if(prev)
+ b3DbvtNode* prev = root->parent;
+ b3DbvtNode* node = b3CreateNode(pdbvt, prev, leaf->volume, root->volume, 0);
+ if (prev)
{
- prev->childs[b3IndexOf(root)] = node;
- node->childs[0] = root;root->parent=node;
- node->childs[1] = leaf;leaf->parent=node;
- do {
- if(!prev->volume.Contain(node->volume))
- b3Merge(prev->childs[0]->volume,prev->childs[1]->volume,prev->volume);
+ prev->childs[b3IndexOf(root)] = node;
+ node->childs[0] = root;
+ root->parent = node;
+ node->childs[1] = leaf;
+ leaf->parent = node;
+ do
+ {
+ if (!prev->volume.Contain(node->volume))
+ b3Merge(prev->childs[0]->volume, prev->childs[1]->volume, prev->volume);
else
break;
- node=prev;
- } while(0!=(prev=node->parent));
+ node = prev;
+ } while (0 != (prev = node->parent));
}
else
{
- node->childs[0] = root;root->parent=node;
- node->childs[1] = leaf;leaf->parent=node;
- pdbvt->m_root = node;
+ node->childs[0] = root;
+ root->parent = node;
+ node->childs[1] = leaf;
+ leaf->parent = node;
+ pdbvt->m_root = node;
}
}
}
//
-static b3DbvtNode* b3RemoveLeaf( b3DynamicBvh* pdbvt,
- b3DbvtNode* leaf)
+static b3DbvtNode* b3RemoveLeaf(b3DynamicBvh* pdbvt,
+ b3DbvtNode* leaf)
{
- if(leaf==pdbvt->m_root)
+ if (leaf == pdbvt->m_root)
{
- pdbvt->m_root=0;
- return(0);
+ pdbvt->m_root = 0;
+ return (0);
}
else
{
- b3DbvtNode* parent=leaf->parent;
- b3DbvtNode* prev=parent->parent;
- b3DbvtNode* sibling=parent->childs[1-b3IndexOf(leaf)];
- if(prev)
+ b3DbvtNode* parent = leaf->parent;
+ b3DbvtNode* prev = parent->parent;
+ b3DbvtNode* sibling = parent->childs[1 - b3IndexOf(leaf)];
+ if (prev)
{
- prev->childs[b3IndexOf(parent)]=sibling;
- sibling->parent=prev;
- b3DeleteNode(pdbvt,parent);
- while(prev)
+ prev->childs[b3IndexOf(parent)] = sibling;
+ sibling->parent = prev;
+ b3DeleteNode(pdbvt, parent);
+ while (prev)
{
- const b3DbvtVolume pb=prev->volume;
- b3Merge(prev->childs[0]->volume,prev->childs[1]->volume,prev->volume);
- if(b3NotEqual(pb,prev->volume))
+ const b3DbvtVolume pb = prev->volume;
+ b3Merge(prev->childs[0]->volume, prev->childs[1]->volume, prev->volume);
+ if (b3NotEqual(pb, prev->volume))
{
- prev=prev->parent;
- } else break;
+ prev = prev->parent;
+ }
+ else
+ break;
}
- return(prev?prev:pdbvt->m_root);
+ return (prev ? prev : pdbvt->m_root);
}
else
- {
- pdbvt->m_root=sibling;
- sibling->parent=0;
- b3DeleteNode(pdbvt,parent);
- return(pdbvt->m_root);
- }
+ {
+ pdbvt->m_root = sibling;
+ sibling->parent = 0;
+ b3DeleteNode(pdbvt, parent);
+ return (pdbvt->m_root);
+ }
}
}
//
-static void b3FetchLeaves(b3DynamicBvh* pdbvt,
- b3DbvtNode* root,
- b3NodeArray& leaves,
- int depth=-1)
+static void b3FetchLeaves(b3DynamicBvh* pdbvt,
+ b3DbvtNode* root,
+ b3NodeArray& leaves,
+ int depth = -1)
{
- if(root->isinternal()&&depth)
+ if (root->isinternal() && depth)
{
- b3FetchLeaves(pdbvt,root->childs[0],leaves,depth-1);
- b3FetchLeaves(pdbvt,root->childs[1],leaves,depth-1);
- b3DeleteNode(pdbvt,root);
+ b3FetchLeaves(pdbvt, root->childs[0], leaves, depth - 1);
+ b3FetchLeaves(pdbvt, root->childs[1], leaves, depth - 1);
+ b3DeleteNode(pdbvt, root);
}
else
{
@@ -227,50 +242,50 @@ static void b3FetchLeaves(b3DynamicBvh* pdbvt,
}
}
-static bool b3LeftOfAxis( const b3DbvtNode* node,
- const b3Vector3& org,
- const b3Vector3& axis)
+static bool b3LeftOfAxis(const b3DbvtNode* node,
+ const b3Vector3& org,
+ const b3Vector3& axis)
{
- return b3Dot(axis,node->volume.Center()-org) <= 0;
+ return b3Dot(axis, node->volume.Center() - org) <= 0;
}
// Partitions leaves such that leaves[0, n) are on the
// left of axis, and leaves[n, count) are on the right
// of axis. returns N.
-static int b3Split( b3DbvtNode** leaves,
- int count,
- const b3Vector3& org,
- const b3Vector3& axis)
+static int b3Split(b3DbvtNode** leaves,
+ int count,
+ const b3Vector3& org,
+ const b3Vector3& axis)
{
- int begin=0;
- int end=count;
- for(;;)
+ int begin = 0;
+ int end = count;
+ for (;;)
{
- while(begin!=end && b3LeftOfAxis(leaves[begin],org,axis))
+ while (begin != end && b3LeftOfAxis(leaves[begin], org, axis))
{
++begin;
}
- if(begin==end)
+ if (begin == end)
{
break;
}
- while(begin!=end && !b3LeftOfAxis(leaves[end-1],org,axis))
+ while (begin != end && !b3LeftOfAxis(leaves[end - 1], org, axis))
{
--end;
}
- if(begin==end)
+ if (begin == end)
{
break;
}
// swap out of place nodes
--end;
- b3DbvtNode* temp=leaves[begin];
- leaves[begin]=leaves[end];
- leaves[end]=temp;
+ b3DbvtNode* temp = leaves[begin];
+ leaves[begin] = leaves[end];
+ leaves[end] = temp;
++begin;
}
@@ -278,149 +293,152 @@ static int b3Split( b3DbvtNode** leaves,
}
//
-static b3DbvtVolume b3Bounds( b3DbvtNode** leaves,
- int count)
+static b3DbvtVolume b3Bounds(b3DbvtNode** leaves,
+ int count)
{
-#if B3_DBVT_MERGE_IMPL==B3_DBVT_IMPL_SSE
- B3_ATTRIBUTE_ALIGNED16(char locals[sizeof(b3DbvtVolume)]);
- b3DbvtVolume& volume=*(b3DbvtVolume*)locals;
- volume=leaves[0]->volume;
+#if B3_DBVT_MERGE_IMPL == B3_DBVT_IMPL_SSE
+ B3_ATTRIBUTE_ALIGNED16(char locals[sizeof(b3DbvtVolume)]);
+ b3DbvtVolume& volume = *(b3DbvtVolume*)locals;
+ volume = leaves[0]->volume;
#else
- b3DbvtVolume volume=leaves[0]->volume;
+ b3DbvtVolume volume = leaves[0]->volume;
#endif
- for(int i=1,ni=count;i<ni;++i)
+ for (int i = 1, ni = count; i < ni; ++i)
{
- b3Merge(volume,leaves[i]->volume,volume);
+ b3Merge(volume, leaves[i]->volume, volume);
}
- return(volume);
+ return (volume);
}
//
-static void b3BottomUp( b3DynamicBvh* pdbvt,
- b3DbvtNode** leaves,
- int count)
+static void b3BottomUp(b3DynamicBvh* pdbvt,
+ b3DbvtNode** leaves,
+ int count)
{
- while(count>1)
+ while (count > 1)
{
- b3Scalar minsize=B3_INFINITY;
- int minidx[2]={-1,-1};
- for(int i=0;i<count;++i)
+ b3Scalar minsize = B3_INFINITY;
+ int minidx[2] = {-1, -1};
+ for (int i = 0; i < count; ++i)
{
- for(int j=i+1;j<count;++j)
+ for (int j = i + 1; j < count; ++j)
{
- const b3Scalar sz=b3Size(b3Merge(leaves[i]->volume,leaves[j]->volume));
- if(sz<minsize)
+ const b3Scalar sz = b3Size(b3Merge(leaves[i]->volume, leaves[j]->volume));
+ if (sz < minsize)
{
- minsize = sz;
- minidx[0] = i;
- minidx[1] = j;
+ minsize = sz;
+ minidx[0] = i;
+ minidx[1] = j;
}
}
}
- b3DbvtNode* n[] = {leaves[minidx[0]],leaves[minidx[1]]};
- b3DbvtNode* p = b3CreateNode(pdbvt,0,n[0]->volume,n[1]->volume,0);
- p->childs[0] = n[0];
- p->childs[1] = n[1];
- n[0]->parent = p;
- n[1]->parent = p;
- leaves[minidx[0]] = p;
- leaves[minidx[1]] = leaves[count-1];
+ b3DbvtNode* n[] = {leaves[minidx[0]], leaves[minidx[1]]};
+ b3DbvtNode* p = b3CreateNode(pdbvt, 0, n[0]->volume, n[1]->volume, 0);
+ p->childs[0] = n[0];
+ p->childs[1] = n[1];
+ n[0]->parent = p;
+ n[1]->parent = p;
+ leaves[minidx[0]] = p;
+ leaves[minidx[1]] = leaves[count - 1];
--count;
}
}
//
-static b3DbvtNode* b3TopDown(b3DynamicBvh* pdbvt,
- b3DbvtNode** leaves,
- int count,
- int bu_treshold)
+static b3DbvtNode* b3TopDown(b3DynamicBvh* pdbvt,
+ b3DbvtNode** leaves,
+ int count,
+ int bu_treshold)
{
- static const b3Vector3 axis[]={b3MakeVector3(1,0,0),
- b3MakeVector3(0,1,0),
- b3MakeVector3(0,0,1)};
- b3Assert(bu_treshold>1);
- if(count>1)
+ static const b3Vector3 axis[] = {b3MakeVector3(1, 0, 0),
+ b3MakeVector3(0, 1, 0),
+ b3MakeVector3(0, 0, 1)};
+ b3Assert(bu_treshold > 1);
+ if (count > 1)
{
- if(count>bu_treshold)
+ if (count > bu_treshold)
{
- const b3DbvtVolume vol=b3Bounds(leaves,count);
- const b3Vector3 org=vol.Center();
- int partition;
- int bestaxis=-1;
- int bestmidp=count;
- int splitcount[3][2]={{0,0},{0,0},{0,0}};
+ const b3DbvtVolume vol = b3Bounds(leaves, count);
+ const b3Vector3 org = vol.Center();
+ int partition;
+ int bestaxis = -1;
+ int bestmidp = count;
+ int splitcount[3][2] = {{0, 0}, {0, 0}, {0, 0}};
int i;
- for( i=0;i<count;++i)
+ for (i = 0; i < count; ++i)
{
- const b3Vector3 x=leaves[i]->volume.Center()-org;
- for(int j=0;j<3;++j)
+ const b3Vector3 x = leaves[i]->volume.Center() - org;
+ for (int j = 0; j < 3; ++j)
{
- ++splitcount[j][b3Dot(x,axis[j])>0?1:0];
+ ++splitcount[j][b3Dot(x, axis[j]) > 0 ? 1 : 0];
}
}
- for( i=0;i<3;++i)
+ for (i = 0; i < 3; ++i)
{
- if((splitcount[i][0]>0)&&(splitcount[i][1]>0))
+ if ((splitcount[i][0] > 0) && (splitcount[i][1] > 0))
{
- const int midp=(int)b3Fabs(b3Scalar(splitcount[i][0]-splitcount[i][1]));
- if(midp<bestmidp)
+ const int midp = (int)b3Fabs(b3Scalar(splitcount[i][0] - splitcount[i][1]));
+ if (midp < bestmidp)
{
- bestaxis=i;
- bestmidp=midp;
+ bestaxis = i;
+ bestmidp = midp;
}
}
}
- if(bestaxis>=0)
+ if (bestaxis >= 0)
{
- partition=b3Split(leaves,count,org,axis[bestaxis]);
- b3Assert(partition!=0 && partition!=count);
+ partition = b3Split(leaves, count, org, axis[bestaxis]);
+ b3Assert(partition != 0 && partition != count);
}
else
{
- partition=count/2+1;
+ partition = count / 2 + 1;
}
- b3DbvtNode* node=b3CreateNode(pdbvt,0,vol,0);
- node->childs[0]=b3TopDown(pdbvt,&leaves[0],partition,bu_treshold);
- node->childs[1]=b3TopDown(pdbvt,&leaves[partition],count-partition,bu_treshold);
- node->childs[0]->parent=node;
- node->childs[1]->parent=node;
- return(node);
+ b3DbvtNode* node = b3CreateNode(pdbvt, 0, vol, 0);
+ node->childs[0] = b3TopDown(pdbvt, &leaves[0], partition, bu_treshold);
+ node->childs[1] = b3TopDown(pdbvt, &leaves[partition], count - partition, bu_treshold);
+ node->childs[0]->parent = node;
+ node->childs[1]->parent = node;
+ return (node);
}
else
{
- b3BottomUp(pdbvt,leaves,count);
- return(leaves[0]);
+ b3BottomUp(pdbvt, leaves, count);
+ return (leaves[0]);
}
}
- return(leaves[0]);
+ return (leaves[0]);
}
//
-static B3_DBVT_INLINE b3DbvtNode* b3Sort(b3DbvtNode* n,b3DbvtNode*& r)
+static B3_DBVT_INLINE b3DbvtNode* b3Sort(b3DbvtNode* n, b3DbvtNode*& r)
{
- b3DbvtNode* p=n->parent;
+ b3DbvtNode* p = n->parent;
b3Assert(n->isinternal());
- if(p>n)
+ if (p > n)
{
- const int i=b3IndexOf(n);
- const int j=1-i;
- b3DbvtNode* s=p->childs[j];
- b3DbvtNode* q=p->parent;
- b3Assert(n==p->childs[i]);
- if(q) q->childs[b3IndexOf(p)]=n; else r=n;
- s->parent=n;
- p->parent=n;
- n->parent=q;
- p->childs[0]=n->childs[0];
- p->childs[1]=n->childs[1];
- n->childs[0]->parent=p;
- n->childs[1]->parent=p;
- n->childs[i]=p;
- n->childs[j]=s;
- b3Swap(p->volume,n->volume);
- return(p);
+ const int i = b3IndexOf(n);
+ const int j = 1 - i;
+ b3DbvtNode* s = p->childs[j];
+ b3DbvtNode* q = p->parent;
+ b3Assert(n == p->childs[i]);
+ if (q)
+ q->childs[b3IndexOf(p)] = n;
+ else
+ r = n;
+ s->parent = n;
+ p->parent = n;
+ n->parent = q;
+ p->childs[0] = n->childs[0];
+ p->childs[1] = n->childs[1];
+ n->childs[0]->parent = p;
+ n->childs[1]->parent = p;
+ n->childs[i] = p;
+ n->childs[j] = s;
+ b3Swap(p->volume, n->volume);
+ return (p);
}
- return(n);
+ return (n);
}
#if 0
@@ -438,11 +456,11 @@ static B3_DBVT_INLINE b3DbvtNode* walkup(b3DbvtNode* n,int count)
//
b3DynamicBvh::b3DynamicBvh()
{
- m_root = 0;
- m_free = 0;
- m_lkhd = -1;
- m_leaves = 0;
- m_opath = 0;
+ m_root = 0;
+ m_free = 0;
+ m_lkhd = -1;
+ m_leaves = 0;
+ m_opath = 0;
}
//
@@ -452,228 +470,233 @@ b3DynamicBvh::~b3DynamicBvh()
}
//
-void b3DynamicBvh::clear()
+void b3DynamicBvh::clear()
{
- if(m_root)
- b3RecurseDeleteNode(this,m_root);
+ if (m_root)
+ b3RecurseDeleteNode(this, m_root);
b3AlignedFree(m_free);
- m_free=0;
- m_lkhd = -1;
+ m_free = 0;
+ m_lkhd = -1;
m_stkStack.clear();
- m_opath = 0;
-
+ m_opath = 0;
}
//
-void b3DynamicBvh::optimizeBottomUp()
+void b3DynamicBvh::optimizeBottomUp()
{
- if(m_root)
+ if (m_root)
{
b3NodeArray leaves;
leaves.reserve(m_leaves);
- b3FetchLeaves(this,m_root,leaves);
- b3BottomUp(this,&leaves[0],leaves.size());
- m_root=leaves[0];
+ b3FetchLeaves(this, m_root, leaves);
+ b3BottomUp(this, &leaves[0], leaves.size());
+ m_root = leaves[0];
}
}
//
-void b3DynamicBvh::optimizeTopDown(int bu_treshold)
+void b3DynamicBvh::optimizeTopDown(int bu_treshold)
{
- if(m_root)
+ if (m_root)
{
- b3NodeArray leaves;
+ b3NodeArray leaves;
leaves.reserve(m_leaves);
- b3FetchLeaves(this,m_root,leaves);
- m_root=b3TopDown(this,&leaves[0],leaves.size(),bu_treshold);
+ b3FetchLeaves(this, m_root, leaves);
+ m_root = b3TopDown(this, &leaves[0], leaves.size(), bu_treshold);
}
}
//
-void b3DynamicBvh::optimizeIncremental(int passes)
+void b3DynamicBvh::optimizeIncremental(int passes)
{
- if(passes<0) passes=m_leaves;
- if(m_root&&(passes>0))
+ if (passes < 0) passes = m_leaves;
+ if (m_root && (passes > 0))
{
- do {
- b3DbvtNode* node=m_root;
- unsigned bit=0;
- while(node->isinternal())
+ do
+ {
+ b3DbvtNode* node = m_root;
+ unsigned bit = 0;
+ while (node->isinternal())
{
- node=b3Sort(node,m_root)->childs[(m_opath>>bit)&1];
- bit=(bit+1)&(sizeof(unsigned)*8-1);
+ node = b3Sort(node, m_root)->childs[(m_opath >> bit) & 1];
+ bit = (bit + 1) & (sizeof(unsigned) * 8 - 1);
}
update(node);
++m_opath;
- } while(--passes);
+ } while (--passes);
}
}
//
-b3DbvtNode* b3DynamicBvh::insert(const b3DbvtVolume& volume,void* data)
+b3DbvtNode* b3DynamicBvh::insert(const b3DbvtVolume& volume, void* data)
{
- b3DbvtNode* leaf=b3CreateNode(this,0,volume,data);
- b3InsertLeaf(this,m_root,leaf);
+ b3DbvtNode* leaf = b3CreateNode(this, 0, volume, data);
+ b3InsertLeaf(this, m_root, leaf);
++m_leaves;
- return(leaf);
+ return (leaf);
}
//
-void b3DynamicBvh::update(b3DbvtNode* leaf,int lookahead)
+void b3DynamicBvh::update(b3DbvtNode* leaf, int lookahead)
{
- b3DbvtNode* root=b3RemoveLeaf(this,leaf);
- if(root)
+ b3DbvtNode* root = b3RemoveLeaf(this, leaf);
+ if (root)
{
- if(lookahead>=0)
+ if (lookahead >= 0)
{
- for(int i=0;(i<lookahead)&&root->parent;++i)
+ for (int i = 0; (i < lookahead) && root->parent; ++i)
{
- root=root->parent;
+ root = root->parent;
}
- } else root=m_root;
+ }
+ else
+ root = m_root;
}
- b3InsertLeaf(this,root,leaf);
+ b3InsertLeaf(this, root, leaf);
}
//
-void b3DynamicBvh::update(b3DbvtNode* leaf,b3DbvtVolume& volume)
+void b3DynamicBvh::update(b3DbvtNode* leaf, b3DbvtVolume& volume)
{
- b3DbvtNode* root=b3RemoveLeaf(this,leaf);
- if(root)
+ b3DbvtNode* root = b3RemoveLeaf(this, leaf);
+ if (root)
{
- if(m_lkhd>=0)
+ if (m_lkhd >= 0)
{
- for(int i=0;(i<m_lkhd)&&root->parent;++i)
+ for (int i = 0; (i < m_lkhd) && root->parent; ++i)
{
- root=root->parent;
+ root = root->parent;
}
- } else root=m_root;
+ }
+ else
+ root = m_root;
}
- leaf->volume=volume;
- b3InsertLeaf(this,root,leaf);
+ leaf->volume = volume;
+ b3InsertLeaf(this, root, leaf);
}
//
-bool b3DynamicBvh::update(b3DbvtNode* leaf,b3DbvtVolume& volume,const b3Vector3& velocity,b3Scalar margin)
+bool b3DynamicBvh::update(b3DbvtNode* leaf, b3DbvtVolume& volume, const b3Vector3& velocity, b3Scalar margin)
{
- if(leaf->volume.Contain(volume)) return(false);
- volume.Expand(b3MakeVector3(margin,margin,margin));
+ if (leaf->volume.Contain(volume)) return (false);
+ volume.Expand(b3MakeVector3(margin, margin, margin));
volume.SignedExpand(velocity);
- update(leaf,volume);
- return(true);
+ update(leaf, volume);
+ return (true);
}
//
-bool b3DynamicBvh::update(b3DbvtNode* leaf,b3DbvtVolume& volume,const b3Vector3& velocity)
+bool b3DynamicBvh::update(b3DbvtNode* leaf, b3DbvtVolume& volume, const b3Vector3& velocity)
{
- if(leaf->volume.Contain(volume)) return(false);
+ if (leaf->volume.Contain(volume)) return (false);
volume.SignedExpand(velocity);
- update(leaf,volume);
- return(true);
+ update(leaf, volume);
+ return (true);
}
//
-bool b3DynamicBvh::update(b3DbvtNode* leaf,b3DbvtVolume& volume,b3Scalar margin)
+bool b3DynamicBvh::update(b3DbvtNode* leaf, b3DbvtVolume& volume, b3Scalar margin)
{
- if(leaf->volume.Contain(volume)) return(false);
- volume.Expand(b3MakeVector3(margin,margin,margin));
- update(leaf,volume);
- return(true);
+ if (leaf->volume.Contain(volume)) return (false);
+ volume.Expand(b3MakeVector3(margin, margin, margin));
+ update(leaf, volume);
+ return (true);
}
//
-void b3DynamicBvh::remove(b3DbvtNode* leaf)
+void b3DynamicBvh::remove(b3DbvtNode* leaf)
{
- b3RemoveLeaf(this,leaf);
- b3DeleteNode(this,leaf);
+ b3RemoveLeaf(this, leaf);
+ b3DeleteNode(this, leaf);
--m_leaves;
}
//
-void b3DynamicBvh::write(IWriter* iwriter) const
+void b3DynamicBvh::write(IWriter* iwriter) const
{
- b3DbvtNodeEnumerator nodes;
- nodes.nodes.reserve(m_leaves*2);
- enumNodes(m_root,nodes);
- iwriter->Prepare(m_root,nodes.nodes.size());
- for(int i=0;i<nodes.nodes.size();++i)
+ b3DbvtNodeEnumerator nodes;
+ nodes.nodes.reserve(m_leaves * 2);
+ enumNodes(m_root, nodes);
+ iwriter->Prepare(m_root, nodes.nodes.size());
+ for (int i = 0; i < nodes.nodes.size(); ++i)
{
- const b3DbvtNode* n=nodes.nodes[i];
- int p=-1;
- if(n->parent) p=nodes.nodes.findLinearSearch(n->parent);
- if(n->isinternal())
+ const b3DbvtNode* n = nodes.nodes[i];
+ int p = -1;
+ if (n->parent) p = nodes.nodes.findLinearSearch(n->parent);
+ if (n->isinternal())
{
- const int c0=nodes.nodes.findLinearSearch(n->childs[0]);
- const int c1=nodes.nodes.findLinearSearch(n->childs[1]);
- iwriter->WriteNode(n,i,p,c0,c1);
+ const int c0 = nodes.nodes.findLinearSearch(n->childs[0]);
+ const int c1 = nodes.nodes.findLinearSearch(n->childs[1]);
+ iwriter->WriteNode(n, i, p, c0, c1);
}
else
{
- iwriter->WriteLeaf(n,i,p);
- }
+ iwriter->WriteLeaf(n, i, p);
+ }
}
}
//
-void b3DynamicBvh::clone(b3DynamicBvh& dest,IClone* iclone) const
+void b3DynamicBvh::clone(b3DynamicBvh& dest, IClone* iclone) const
{
dest.clear();
- if(m_root!=0)
- {
- b3AlignedObjectArray<sStkCLN> stack;
+ if (m_root != 0)
+ {
+ b3AlignedObjectArray<sStkCLN> stack;
stack.reserve(m_leaves);
- stack.push_back(sStkCLN(m_root,0));
- do {
- const int i=stack.size()-1;
- const sStkCLN e=stack[i];
- b3DbvtNode* n=b3CreateNode(&dest,e.parent,e.node->volume,e.node->data);
+ stack.push_back(sStkCLN(m_root, 0));
+ do
+ {
+ const int i = stack.size() - 1;
+ const sStkCLN e = stack[i];
+ b3DbvtNode* n = b3CreateNode(&dest, e.parent, e.node->volume, e.node->data);
stack.pop_back();
- if(e.parent!=0)
- e.parent->childs[i&1]=n;
+ if (e.parent != 0)
+ e.parent->childs[i & 1] = n;
else
- dest.m_root=n;
- if(e.node->isinternal())
+ dest.m_root = n;
+ if (e.node->isinternal())
{
- stack.push_back(sStkCLN(e.node->childs[0],n));
- stack.push_back(sStkCLN(e.node->childs[1],n));
+ stack.push_back(sStkCLN(e.node->childs[0], n));
+ stack.push_back(sStkCLN(e.node->childs[1], n));
}
else
{
iclone->CloneLeaf(n);
}
- } while(stack.size()>0);
+ } while (stack.size() > 0);
}
}
//
-int b3DynamicBvh::maxdepth(const b3DbvtNode* node)
+int b3DynamicBvh::maxdepth(const b3DbvtNode* node)
{
- int depth=0;
- if(node) b3GetMaxDepth(node,1,depth);
- return(depth);
+ int depth = 0;
+ if (node) b3GetMaxDepth(node, 1, depth);
+ return (depth);
}
//
-int b3DynamicBvh::countLeaves(const b3DbvtNode* node)
+int b3DynamicBvh::countLeaves(const b3DbvtNode* node)
{
- if(node->isinternal())
- return(countLeaves(node->childs[0])+countLeaves(node->childs[1]));
+ if (node->isinternal())
+ return (countLeaves(node->childs[0]) + countLeaves(node->childs[1]));
else
- return(1);
+ return (1);
}
//
-void b3DynamicBvh::extractLeaves(const b3DbvtNode* node,b3AlignedObjectArray<const b3DbvtNode*>& leaves)
+void b3DynamicBvh::extractLeaves(const b3DbvtNode* node, b3AlignedObjectArray<const b3DbvtNode*>& leaves)
{
- if(node->isinternal())
+ if (node->isinternal())
{
- extractLeaves(node->childs[0],leaves);
- extractLeaves(node->childs[1],leaves);
+ extractLeaves(node->childs[0], leaves);
+ extractLeaves(node->childs[1], leaves);
}
else
{
leaves.push_back(node);
- }
+ }
}
//
@@ -682,7 +705,6 @@ void b3DynamicBvh::extractLeaves(const b3DbvtNode* node,b3AlignedObjectArray<c
#include <stdio.h>
#include <stdlib.h>
-
/*
q6600,2.4ghz
@@ -722,603 +744,608 @@ struct b3DbvtBenchmark
{
struct NilPolicy : b3DynamicBvh::ICollide
{
- NilPolicy() : m_pcount(0),m_depth(-B3_INFINITY),m_checksort(true) {}
- void Process(const b3DbvtNode*,const b3DbvtNode*) { ++m_pcount; }
- void Process(const b3DbvtNode*) { ++m_pcount; }
- void Process(const b3DbvtNode*,b3Scalar depth)
+ NilPolicy() : m_pcount(0), m_depth(-B3_INFINITY), m_checksort(true) {}
+ void Process(const b3DbvtNode*, const b3DbvtNode*) { ++m_pcount; }
+ void Process(const b3DbvtNode*) { ++m_pcount; }
+ void Process(const b3DbvtNode*, b3Scalar depth)
{
++m_pcount;
- if(m_checksort)
- { if(depth>=m_depth) m_depth=depth; else printf("wrong depth: %f (should be >= %f)\r\n",depth,m_depth); }
+ if (m_checksort)
+ {
+ if (depth >= m_depth)
+ m_depth = depth;
+ else
+ printf("wrong depth: %f (should be >= %f)\r\n", depth, m_depth);
+ }
}
- int m_pcount;
- b3Scalar m_depth;
- bool m_checksort;
+ int m_pcount;
+ b3Scalar m_depth;
+ bool m_checksort;
};
struct P14 : b3DynamicBvh::ICollide
{
struct Node
{
- const b3DbvtNode* leaf;
- b3Scalar depth;
+ const b3DbvtNode* leaf;
+ b3Scalar depth;
};
- void Process(const b3DbvtNode* leaf,b3Scalar depth)
+ void Process(const b3DbvtNode* leaf, b3Scalar depth)
{
- Node n;
- n.leaf = leaf;
- n.depth = depth;
+ Node n;
+ n.leaf = leaf;
+ n.depth = depth;
}
- static int sortfnc(const Node& a,const Node& b)
+ static int sortfnc(const Node& a, const Node& b)
{
- if(a.depth<b.depth) return(+1);
- if(a.depth>b.depth) return(-1);
- return(0);
+ if (a.depth < b.depth) return (+1);
+ if (a.depth > b.depth) return (-1);
+ return (0);
}
- b3AlignedObjectArray<Node> m_nodes;
+ b3AlignedObjectArray<Node> m_nodes;
};
struct P15 : b3DynamicBvh::ICollide
{
struct Node
{
- const b3DbvtNode* leaf;
- b3Scalar depth;
+ const b3DbvtNode* leaf;
+ b3Scalar depth;
};
void Process(const b3DbvtNode* leaf)
{
- Node n;
- n.leaf = leaf;
- n.depth = dot(leaf->volume.Center(),m_axis);
+ Node n;
+ n.leaf = leaf;
+ n.depth = dot(leaf->volume.Center(), m_axis);
}
- static int sortfnc(const Node& a,const Node& b)
+ static int sortfnc(const Node& a, const Node& b)
{
- if(a.depth<b.depth) return(+1);
- if(a.depth>b.depth) return(-1);
- return(0);
+ if (a.depth < b.depth) return (+1);
+ if (a.depth > b.depth) return (-1);
+ return (0);
}
- b3AlignedObjectArray<Node> m_nodes;
- b3Vector3 m_axis;
+ b3AlignedObjectArray<Node> m_nodes;
+ b3Vector3 m_axis;
};
- static b3Scalar RandUnit()
+ static b3Scalar RandUnit()
{
- return(rand()/(b3Scalar)RAND_MAX);
+ return (rand() / (b3Scalar)RAND_MAX);
}
- static b3Vector3 RandVector3()
+ static b3Vector3 RandVector3()
{
- return(b3Vector3(RandUnit(),RandUnit(),RandUnit()));
+ return (b3Vector3(RandUnit(), RandUnit(), RandUnit()));
}
- static b3Vector3 RandVector3(b3Scalar cs)
+ static b3Vector3 RandVector3(b3Scalar cs)
{
- return(RandVector3()*cs-b3Vector3(cs,cs,cs)/2);
+ return (RandVector3() * cs - b3Vector3(cs, cs, cs) / 2);
}
- static b3DbvtVolume RandVolume(b3Scalar cs,b3Scalar eb,b3Scalar es)
+ static b3DbvtVolume RandVolume(b3Scalar cs, b3Scalar eb, b3Scalar es)
{
- return(b3DbvtVolume::FromCE(RandVector3(cs),b3Vector3(eb,eb,eb)+RandVector3()*es));
+ return (b3DbvtVolume::FromCE(RandVector3(cs), b3Vector3(eb, eb, eb) + RandVector3() * es));
}
- static b3Transform RandTransform(b3Scalar cs)
+ static b3Transform RandTransform(b3Scalar cs)
{
- b3Transform t;
+ b3Transform t;
t.setOrigin(RandVector3(cs));
- t.setRotation(b3Quaternion(RandUnit()*B3_PI*2,RandUnit()*B3_PI*2,RandUnit()*B3_PI*2).normalized());
- return(t);
+ t.setRotation(b3Quaternion(RandUnit() * B3_PI * 2, RandUnit() * B3_PI * 2, RandUnit() * B3_PI * 2).normalized());
+ return (t);
}
- static void RandTree(b3Scalar cs,b3Scalar eb,b3Scalar es,int leaves,b3DynamicBvh& dbvt)
+ static void RandTree(b3Scalar cs, b3Scalar eb, b3Scalar es, int leaves, b3DynamicBvh& dbvt)
{
dbvt.clear();
- for(int i=0;i<leaves;++i)
+ for (int i = 0; i < leaves; ++i)
{
- dbvt.insert(RandVolume(cs,eb,es),0);
+ dbvt.insert(RandVolume(cs, eb, es), 0);
}
}
};
-void b3DynamicBvh::benchmark()
+void b3DynamicBvh::benchmark()
{
- static const b3Scalar cfgVolumeCenterScale = 100;
- static const b3Scalar cfgVolumeExentsBase = 1;
- static const b3Scalar cfgVolumeExentsScale = 4;
- static const int cfgLeaves = 8192;
- static const bool cfgEnable = true;
+ static const b3Scalar cfgVolumeCenterScale = 100;
+ static const b3Scalar cfgVolumeExentsBase = 1;
+ static const b3Scalar cfgVolumeExentsScale = 4;
+ static const int cfgLeaves = 8192;
+ static const bool cfgEnable = true;
//[1] b3DbvtVolume intersections
- bool cfgBenchmark1_Enable = cfgEnable;
- static const int cfgBenchmark1_Iterations = 8;
- static const int cfgBenchmark1_Reference = 3499;
+ bool cfgBenchmark1_Enable = cfgEnable;
+ static const int cfgBenchmark1_Iterations = 8;
+ static const int cfgBenchmark1_Reference = 3499;
//[2] b3DbvtVolume merges
- bool cfgBenchmark2_Enable = cfgEnable;
- static const int cfgBenchmark2_Iterations = 4;
- static const int cfgBenchmark2_Reference = 1945;
+ bool cfgBenchmark2_Enable = cfgEnable;
+ static const int cfgBenchmark2_Iterations = 4;
+ static const int cfgBenchmark2_Reference = 1945;
//[3] b3DynamicBvh::collideTT
- bool cfgBenchmark3_Enable = cfgEnable;
- static const int cfgBenchmark3_Iterations = 512;
- static const int cfgBenchmark3_Reference = 5485;
+ bool cfgBenchmark3_Enable = cfgEnable;
+ static const int cfgBenchmark3_Iterations = 512;
+ static const int cfgBenchmark3_Reference = 5485;
//[4] b3DynamicBvh::collideTT self
- bool cfgBenchmark4_Enable = cfgEnable;
- static const int cfgBenchmark4_Iterations = 512;
- static const int cfgBenchmark4_Reference = 2814;
+ bool cfgBenchmark4_Enable = cfgEnable;
+ static const int cfgBenchmark4_Iterations = 512;
+ static const int cfgBenchmark4_Reference = 2814;
//[5] b3DynamicBvh::collideTT xform
- bool cfgBenchmark5_Enable = cfgEnable;
- static const int cfgBenchmark5_Iterations = 512;
- static const b3Scalar cfgBenchmark5_OffsetScale = 2;
- static const int cfgBenchmark5_Reference = 7379;
+ bool cfgBenchmark5_Enable = cfgEnable;
+ static const int cfgBenchmark5_Iterations = 512;
+ static const b3Scalar cfgBenchmark5_OffsetScale = 2;
+ static const int cfgBenchmark5_Reference = 7379;
//[6] b3DynamicBvh::collideTT xform,self
- bool cfgBenchmark6_Enable = cfgEnable;
- static const int cfgBenchmark6_Iterations = 512;
- static const b3Scalar cfgBenchmark6_OffsetScale = 2;
- static const int cfgBenchmark6_Reference = 7270;
+ bool cfgBenchmark6_Enable = cfgEnable;
+ static const int cfgBenchmark6_Iterations = 512;
+ static const b3Scalar cfgBenchmark6_OffsetScale = 2;
+ static const int cfgBenchmark6_Reference = 7270;
//[7] b3DynamicBvh::rayTest
- bool cfgBenchmark7_Enable = cfgEnable;
- static const int cfgBenchmark7_Passes = 32;
- static const int cfgBenchmark7_Iterations = 65536;
- static const int cfgBenchmark7_Reference = 6307;
+ bool cfgBenchmark7_Enable = cfgEnable;
+ static const int cfgBenchmark7_Passes = 32;
+ static const int cfgBenchmark7_Iterations = 65536;
+ static const int cfgBenchmark7_Reference = 6307;
//[8] insert/remove
- bool cfgBenchmark8_Enable = cfgEnable;
- static const int cfgBenchmark8_Passes = 32;
- static const int cfgBenchmark8_Iterations = 65536;
- static const int cfgBenchmark8_Reference = 2105;
+ bool cfgBenchmark8_Enable = cfgEnable;
+ static const int cfgBenchmark8_Passes = 32;
+ static const int cfgBenchmark8_Iterations = 65536;
+ static const int cfgBenchmark8_Reference = 2105;
//[9] updates (teleport)
- bool cfgBenchmark9_Enable = cfgEnable;
- static const int cfgBenchmark9_Passes = 32;
- static const int cfgBenchmark9_Iterations = 65536;
- static const int cfgBenchmark9_Reference = 1879;
+ bool cfgBenchmark9_Enable = cfgEnable;
+ static const int cfgBenchmark9_Passes = 32;
+ static const int cfgBenchmark9_Iterations = 65536;
+ static const int cfgBenchmark9_Reference = 1879;
//[10] updates (jitter)
- bool cfgBenchmark10_Enable = cfgEnable;
- static const b3Scalar cfgBenchmark10_Scale = cfgVolumeCenterScale/10000;
- static const int cfgBenchmark10_Passes = 32;
- static const int cfgBenchmark10_Iterations = 65536;
- static const int cfgBenchmark10_Reference = 1244;
+ bool cfgBenchmark10_Enable = cfgEnable;
+ static const b3Scalar cfgBenchmark10_Scale = cfgVolumeCenterScale / 10000;
+ static const int cfgBenchmark10_Passes = 32;
+ static const int cfgBenchmark10_Iterations = 65536;
+ static const int cfgBenchmark10_Reference = 1244;
//[11] optimize (incremental)
- bool cfgBenchmark11_Enable = cfgEnable;
- static const int cfgBenchmark11_Passes = 64;
- static const int cfgBenchmark11_Iterations = 65536;
- static const int cfgBenchmark11_Reference = 2510;
+ bool cfgBenchmark11_Enable = cfgEnable;
+ static const int cfgBenchmark11_Passes = 64;
+ static const int cfgBenchmark11_Iterations = 65536;
+ static const int cfgBenchmark11_Reference = 2510;
//[12] b3DbvtVolume notequal
- bool cfgBenchmark12_Enable = cfgEnable;
- static const int cfgBenchmark12_Iterations = 32;
- static const int cfgBenchmark12_Reference = 3677;
+ bool cfgBenchmark12_Enable = cfgEnable;
+ static const int cfgBenchmark12_Iterations = 32;
+ static const int cfgBenchmark12_Reference = 3677;
//[13] culling(OCL+fullsort)
- bool cfgBenchmark13_Enable = cfgEnable;
- static const int cfgBenchmark13_Iterations = 1024;
- static const int cfgBenchmark13_Reference = 2231;
+ bool cfgBenchmark13_Enable = cfgEnable;
+ static const int cfgBenchmark13_Iterations = 1024;
+ static const int cfgBenchmark13_Reference = 2231;
//[14] culling(OCL+qsort)
- bool cfgBenchmark14_Enable = cfgEnable;
- static const int cfgBenchmark14_Iterations = 8192;
- static const int cfgBenchmark14_Reference = 3500;
+ bool cfgBenchmark14_Enable = cfgEnable;
+ static const int cfgBenchmark14_Iterations = 8192;
+ static const int cfgBenchmark14_Reference = 3500;
//[15] culling(KDOP+qsort)
- bool cfgBenchmark15_Enable = cfgEnable;
- static const int cfgBenchmark15_Iterations = 8192;
- static const int cfgBenchmark15_Reference = 1151;
+ bool cfgBenchmark15_Enable = cfgEnable;
+ static const int cfgBenchmark15_Iterations = 8192;
+ static const int cfgBenchmark15_Reference = 1151;
//[16] insert/remove batch
- bool cfgBenchmark16_Enable = cfgEnable;
- static const int cfgBenchmark16_BatchCount = 256;
- static const int cfgBenchmark16_Passes = 16384;
- static const int cfgBenchmark16_Reference = 5138;
+ bool cfgBenchmark16_Enable = cfgEnable;
+ static const int cfgBenchmark16_BatchCount = 256;
+ static const int cfgBenchmark16_Passes = 16384;
+ static const int cfgBenchmark16_Reference = 5138;
//[17] select
- bool cfgBenchmark17_Enable = cfgEnable;
- static const int cfgBenchmark17_Iterations = 4;
- static const int cfgBenchmark17_Reference = 3390;
+ bool cfgBenchmark17_Enable = cfgEnable;
+ static const int cfgBenchmark17_Iterations = 4;
+ static const int cfgBenchmark17_Reference = 3390;
- b3Clock wallclock;
+ b3Clock wallclock;
printf("Benchmarking dbvt...\r\n");
- printf("\tWorld scale: %f\r\n",cfgVolumeCenterScale);
- printf("\tExtents base: %f\r\n",cfgVolumeExentsBase);
- printf("\tExtents range: %f\r\n",cfgVolumeExentsScale);
- printf("\tLeaves: %u\r\n",cfgLeaves);
- printf("\tsizeof(b3DbvtVolume): %u bytes\r\n",sizeof(b3DbvtVolume));
- printf("\tsizeof(b3DbvtNode): %u bytes\r\n",sizeof(b3DbvtNode));
- if(cfgBenchmark1_Enable)
- {// Benchmark 1
+ printf("\tWorld scale: %f\r\n", cfgVolumeCenterScale);
+ printf("\tExtents base: %f\r\n", cfgVolumeExentsBase);
+ printf("\tExtents range: %f\r\n", cfgVolumeExentsScale);
+ printf("\tLeaves: %u\r\n", cfgLeaves);
+ printf("\tsizeof(b3DbvtVolume): %u bytes\r\n", sizeof(b3DbvtVolume));
+ printf("\tsizeof(b3DbvtNode): %u bytes\r\n", sizeof(b3DbvtNode));
+ if (cfgBenchmark1_Enable)
+ { // Benchmark 1
srand(380843);
- b3AlignedObjectArray<b3DbvtVolume> volumes;
- b3AlignedObjectArray<bool> results;
+ b3AlignedObjectArray<b3DbvtVolume> volumes;
+ b3AlignedObjectArray<bool> results;
volumes.resize(cfgLeaves);
results.resize(cfgLeaves);
- for(int i=0;i<cfgLeaves;++i)
+ for (int i = 0; i < cfgLeaves; ++i)
{
- volumes[i]=b3DbvtBenchmark::RandVolume(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale);
+ volumes[i] = b3DbvtBenchmark::RandVolume(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale);
}
printf("[1] b3DbvtVolume intersections: ");
wallclock.reset();
- for(int i=0;i<cfgBenchmark1_Iterations;++i)
+ for (int i = 0; i < cfgBenchmark1_Iterations; ++i)
{
- for(int j=0;j<cfgLeaves;++j)
+ for (int j = 0; j < cfgLeaves; ++j)
{
- for(int k=0;k<cfgLeaves;++k)
+ for (int k = 0; k < cfgLeaves; ++k)
{
- results[k]=Intersect(volumes[j],volumes[k]);
+ results[k] = Intersect(volumes[j], volumes[k]);
}
}
}
- const int time=(int)wallclock.getTimeMilliseconds();
- printf("%u ms (%i%%)\r\n",time,(time-cfgBenchmark1_Reference)*100/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ printf("%u ms (%i%%)\r\n", time, (time - cfgBenchmark1_Reference) * 100 / time);
}
- if(cfgBenchmark2_Enable)
- {// Benchmark 2
+ if (cfgBenchmark2_Enable)
+ { // Benchmark 2
srand(380843);
- b3AlignedObjectArray<b3DbvtVolume> volumes;
- b3AlignedObjectArray<b3DbvtVolume> results;
+ b3AlignedObjectArray<b3DbvtVolume> volumes;
+ b3AlignedObjectArray<b3DbvtVolume> results;
volumes.resize(cfgLeaves);
results.resize(cfgLeaves);
- for(int i=0;i<cfgLeaves;++i)
+ for (int i = 0; i < cfgLeaves; ++i)
{
- volumes[i]=b3DbvtBenchmark::RandVolume(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale);
+ volumes[i] = b3DbvtBenchmark::RandVolume(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale);
}
printf("[2] b3DbvtVolume merges: ");
wallclock.reset();
- for(int i=0;i<cfgBenchmark2_Iterations;++i)
+ for (int i = 0; i < cfgBenchmark2_Iterations; ++i)
{
- for(int j=0;j<cfgLeaves;++j)
+ for (int j = 0; j < cfgLeaves; ++j)
{
- for(int k=0;k<cfgLeaves;++k)
+ for (int k = 0; k < cfgLeaves; ++k)
{
- Merge(volumes[j],volumes[k],results[k]);
+ Merge(volumes[j], volumes[k], results[k]);
}
}
}
- const int time=(int)wallclock.getTimeMilliseconds();
- printf("%u ms (%i%%)\r\n",time,(time-cfgBenchmark2_Reference)*100/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ printf("%u ms (%i%%)\r\n", time, (time - cfgBenchmark2_Reference) * 100 / time);
}
- if(cfgBenchmark3_Enable)
- {// Benchmark 3
+ if (cfgBenchmark3_Enable)
+ { // Benchmark 3
srand(380843);
- b3DynamicBvh dbvt[2];
- b3DbvtBenchmark::NilPolicy policy;
- b3DbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt[0]);
- b3DbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt[1]);
+ b3DynamicBvh dbvt[2];
+ b3DbvtBenchmark::NilPolicy policy;
+ b3DbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt[0]);
+ b3DbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt[1]);
dbvt[0].optimizeTopDown();
dbvt[1].optimizeTopDown();
printf("[3] b3DynamicBvh::collideTT: ");
wallclock.reset();
- for(int i=0;i<cfgBenchmark3_Iterations;++i)
+ for (int i = 0; i < cfgBenchmark3_Iterations; ++i)
{
- b3DynamicBvh::collideTT(dbvt[0].m_root,dbvt[1].m_root,policy);
+ b3DynamicBvh::collideTT(dbvt[0].m_root, dbvt[1].m_root, policy);
}
- const int time=(int)wallclock.getTimeMilliseconds();
- printf("%u ms (%i%%)\r\n",time,(time-cfgBenchmark3_Reference)*100/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ printf("%u ms (%i%%)\r\n", time, (time - cfgBenchmark3_Reference) * 100 / time);
}
- if(cfgBenchmark4_Enable)
- {// Benchmark 4
+ if (cfgBenchmark4_Enable)
+ { // Benchmark 4
srand(380843);
- b3DynamicBvh dbvt;
- b3DbvtBenchmark::NilPolicy policy;
- b3DbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt);
+ b3DynamicBvh dbvt;
+ b3DbvtBenchmark::NilPolicy policy;
+ b3DbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt);
dbvt.optimizeTopDown();
printf("[4] b3DynamicBvh::collideTT self: ");
wallclock.reset();
- for(int i=0;i<cfgBenchmark4_Iterations;++i)
+ for (int i = 0; i < cfgBenchmark4_Iterations; ++i)
{
- b3DynamicBvh::collideTT(dbvt.m_root,dbvt.m_root,policy);
+ b3DynamicBvh::collideTT(dbvt.m_root, dbvt.m_root, policy);
}
- const int time=(int)wallclock.getTimeMilliseconds();
- printf("%u ms (%i%%)\r\n",time,(time-cfgBenchmark4_Reference)*100/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ printf("%u ms (%i%%)\r\n", time, (time - cfgBenchmark4_Reference) * 100 / time);
}
- if(cfgBenchmark5_Enable)
- {// Benchmark 5
+ if (cfgBenchmark5_Enable)
+ { // Benchmark 5
srand(380843);
- b3DynamicBvh dbvt[2];
- b3AlignedObjectArray<b3Transform> transforms;
- b3DbvtBenchmark::NilPolicy policy;
+ b3DynamicBvh dbvt[2];
+ b3AlignedObjectArray<b3Transform> transforms;
+ b3DbvtBenchmark::NilPolicy policy;
transforms.resize(cfgBenchmark5_Iterations);
- for(int i=0;i<transforms.size();++i)
+ for (int i = 0; i < transforms.size(); ++i)
{
- transforms[i]=b3DbvtBenchmark::RandTransform(cfgVolumeCenterScale*cfgBenchmark5_OffsetScale);
+ transforms[i] = b3DbvtBenchmark::RandTransform(cfgVolumeCenterScale * cfgBenchmark5_OffsetScale);
}
- b3DbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt[0]);
- b3DbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt[1]);
+ b3DbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt[0]);
+ b3DbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt[1]);
dbvt[0].optimizeTopDown();
dbvt[1].optimizeTopDown();
printf("[5] b3DynamicBvh::collideTT xform: ");
wallclock.reset();
- for(int i=0;i<cfgBenchmark5_Iterations;++i)
+ for (int i = 0; i < cfgBenchmark5_Iterations; ++i)
{
- b3DynamicBvh::collideTT(dbvt[0].m_root,dbvt[1].m_root,transforms[i],policy);
+ b3DynamicBvh::collideTT(dbvt[0].m_root, dbvt[1].m_root, transforms[i], policy);
}
- const int time=(int)wallclock.getTimeMilliseconds();
- printf("%u ms (%i%%)\r\n",time,(time-cfgBenchmark5_Reference)*100/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ printf("%u ms (%i%%)\r\n", time, (time - cfgBenchmark5_Reference) * 100 / time);
}
- if(cfgBenchmark6_Enable)
- {// Benchmark 6
+ if (cfgBenchmark6_Enable)
+ { // Benchmark 6
srand(380843);
- b3DynamicBvh dbvt;
- b3AlignedObjectArray<b3Transform> transforms;
- b3DbvtBenchmark::NilPolicy policy;
+ b3DynamicBvh dbvt;
+ b3AlignedObjectArray<b3Transform> transforms;
+ b3DbvtBenchmark::NilPolicy policy;
transforms.resize(cfgBenchmark6_Iterations);
- for(int i=0;i<transforms.size();++i)
+ for (int i = 0; i < transforms.size(); ++i)
{
- transforms[i]=b3DbvtBenchmark::RandTransform(cfgVolumeCenterScale*cfgBenchmark6_OffsetScale);
+ transforms[i] = b3DbvtBenchmark::RandTransform(cfgVolumeCenterScale * cfgBenchmark6_OffsetScale);
}
- b3DbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt);
+ b3DbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt);
dbvt.optimizeTopDown();
printf("[6] b3DynamicBvh::collideTT xform,self: ");
wallclock.reset();
- for(int i=0;i<cfgBenchmark6_Iterations;++i)
+ for (int i = 0; i < cfgBenchmark6_Iterations; ++i)
{
- b3DynamicBvh::collideTT(dbvt.m_root,dbvt.m_root,transforms[i],policy);
+ b3DynamicBvh::collideTT(dbvt.m_root, dbvt.m_root, transforms[i], policy);
}
- const int time=(int)wallclock.getTimeMilliseconds();
- printf("%u ms (%i%%)\r\n",time,(time-cfgBenchmark6_Reference)*100/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ printf("%u ms (%i%%)\r\n", time, (time - cfgBenchmark6_Reference) * 100 / time);
}
- if(cfgBenchmark7_Enable)
- {// Benchmark 7
+ if (cfgBenchmark7_Enable)
+ { // Benchmark 7
srand(380843);
- b3DynamicBvh dbvt;
- b3AlignedObjectArray<b3Vector3> rayorg;
- b3AlignedObjectArray<b3Vector3> raydir;
- b3DbvtBenchmark::NilPolicy policy;
+ b3DynamicBvh dbvt;
+ b3AlignedObjectArray<b3Vector3> rayorg;
+ b3AlignedObjectArray<b3Vector3> raydir;
+ b3DbvtBenchmark::NilPolicy policy;
rayorg.resize(cfgBenchmark7_Iterations);
raydir.resize(cfgBenchmark7_Iterations);
- for(int i=0;i<rayorg.size();++i)
+ for (int i = 0; i < rayorg.size(); ++i)
{
- rayorg[i]=b3DbvtBenchmark::RandVector3(cfgVolumeCenterScale*2);
- raydir[i]=b3DbvtBenchmark::RandVector3(cfgVolumeCenterScale*2);
+ rayorg[i] = b3DbvtBenchmark::RandVector3(cfgVolumeCenterScale * 2);
+ raydir[i] = b3DbvtBenchmark::RandVector3(cfgVolumeCenterScale * 2);
}
- b3DbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt);
+ b3DbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt);
dbvt.optimizeTopDown();
printf("[7] b3DynamicBvh::rayTest: ");
wallclock.reset();
- for(int i=0;i<cfgBenchmark7_Passes;++i)
+ for (int i = 0; i < cfgBenchmark7_Passes; ++i)
{
- for(int j=0;j<cfgBenchmark7_Iterations;++j)
+ for (int j = 0; j < cfgBenchmark7_Iterations; ++j)
{
- b3DynamicBvh::rayTest(dbvt.m_root,rayorg[j],rayorg[j]+raydir[j],policy);
+ b3DynamicBvh::rayTest(dbvt.m_root, rayorg[j], rayorg[j] + raydir[j], policy);
}
}
- const int time=(int)wallclock.getTimeMilliseconds();
- unsigned rays=cfgBenchmark7_Passes*cfgBenchmark7_Iterations;
- printf("%u ms (%i%%),(%u r/s)\r\n",time,(time-cfgBenchmark7_Reference)*100/time,(rays*1000)/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ unsigned rays = cfgBenchmark7_Passes * cfgBenchmark7_Iterations;
+ printf("%u ms (%i%%),(%u r/s)\r\n", time, (time - cfgBenchmark7_Reference) * 100 / time, (rays * 1000) / time);
}
- if(cfgBenchmark8_Enable)
- {// Benchmark 8
+ if (cfgBenchmark8_Enable)
+ { // Benchmark 8
srand(380843);
- b3DynamicBvh dbvt;
- b3DbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt);
+ b3DynamicBvh dbvt;
+ b3DbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt);
dbvt.optimizeTopDown();
printf("[8] insert/remove: ");
wallclock.reset();
- for(int i=0;i<cfgBenchmark8_Passes;++i)
+ for (int i = 0; i < cfgBenchmark8_Passes; ++i)
{
- for(int j=0;j<cfgBenchmark8_Iterations;++j)
+ for (int j = 0; j < cfgBenchmark8_Iterations; ++j)
{
- dbvt.remove(dbvt.insert(b3DbvtBenchmark::RandVolume(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale),0));
+ dbvt.remove(dbvt.insert(b3DbvtBenchmark::RandVolume(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale), 0));
}
}
- const int time=(int)wallclock.getTimeMilliseconds();
- const int ir=cfgBenchmark8_Passes*cfgBenchmark8_Iterations;
- printf("%u ms (%i%%),(%u ir/s)\r\n",time,(time-cfgBenchmark8_Reference)*100/time,ir*1000/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ const int ir = cfgBenchmark8_Passes * cfgBenchmark8_Iterations;
+ printf("%u ms (%i%%),(%u ir/s)\r\n", time, (time - cfgBenchmark8_Reference) * 100 / time, ir * 1000 / time);
}
- if(cfgBenchmark9_Enable)
- {// Benchmark 9
+ if (cfgBenchmark9_Enable)
+ { // Benchmark 9
srand(380843);
- b3DynamicBvh dbvt;
- b3AlignedObjectArray<const b3DbvtNode*> leaves;
- b3DbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt);
+ b3DynamicBvh dbvt;
+ b3AlignedObjectArray<const b3DbvtNode*> leaves;
+ b3DbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt);
dbvt.optimizeTopDown();
- dbvt.extractLeaves(dbvt.m_root,leaves);
+ dbvt.extractLeaves(dbvt.m_root, leaves);
printf("[9] updates (teleport): ");
wallclock.reset();
- for(int i=0;i<cfgBenchmark9_Passes;++i)
+ for (int i = 0; i < cfgBenchmark9_Passes; ++i)
{
- for(int j=0;j<cfgBenchmark9_Iterations;++j)
+ for (int j = 0; j < cfgBenchmark9_Iterations; ++j)
{
- dbvt.update(const_cast<b3DbvtNode*>(leaves[rand()%cfgLeaves]),
- b3DbvtBenchmark::RandVolume(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale));
+ dbvt.update(const_cast<b3DbvtNode*>(leaves[rand() % cfgLeaves]),
+ b3DbvtBenchmark::RandVolume(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale));
}
}
- const int time=(int)wallclock.getTimeMilliseconds();
- const int up=cfgBenchmark9_Passes*cfgBenchmark9_Iterations;
- printf("%u ms (%i%%),(%u u/s)\r\n",time,(time-cfgBenchmark9_Reference)*100/time,up*1000/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ const int up = cfgBenchmark9_Passes * cfgBenchmark9_Iterations;
+ printf("%u ms (%i%%),(%u u/s)\r\n", time, (time - cfgBenchmark9_Reference) * 100 / time, up * 1000 / time);
}
- if(cfgBenchmark10_Enable)
- {// Benchmark 10
+ if (cfgBenchmark10_Enable)
+ { // Benchmark 10
srand(380843);
- b3DynamicBvh dbvt;
- b3AlignedObjectArray<const b3DbvtNode*> leaves;
- b3AlignedObjectArray<b3Vector3> vectors;
+ b3DynamicBvh dbvt;
+ b3AlignedObjectArray<const b3DbvtNode*> leaves;
+ b3AlignedObjectArray<b3Vector3> vectors;
vectors.resize(cfgBenchmark10_Iterations);
- for(int i=0;i<vectors.size();++i)
+ for (int i = 0; i < vectors.size(); ++i)
{
- vectors[i]=(b3DbvtBenchmark::RandVector3()*2-b3Vector3(1,1,1))*cfgBenchmark10_Scale;
+ vectors[i] = (b3DbvtBenchmark::RandVector3() * 2 - b3Vector3(1, 1, 1)) * cfgBenchmark10_Scale;
}
- b3DbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt);
+ b3DbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt);
dbvt.optimizeTopDown();
- dbvt.extractLeaves(dbvt.m_root,leaves);
+ dbvt.extractLeaves(dbvt.m_root, leaves);
printf("[10] updates (jitter): ");
wallclock.reset();
- for(int i=0;i<cfgBenchmark10_Passes;++i)
+ for (int i = 0; i < cfgBenchmark10_Passes; ++i)
{
- for(int j=0;j<cfgBenchmark10_Iterations;++j)
- {
- const b3Vector3& d=vectors[j];
- b3DbvtNode* l=const_cast<b3DbvtNode*>(leaves[rand()%cfgLeaves]);
- b3DbvtVolume v=b3DbvtVolume::FromMM(l->volume.Mins()+d,l->volume.Maxs()+d);
- dbvt.update(l,v);
+ for (int j = 0; j < cfgBenchmark10_Iterations; ++j)
+ {
+ const b3Vector3& d = vectors[j];
+ b3DbvtNode* l = const_cast<b3DbvtNode*>(leaves[rand() % cfgLeaves]);
+ b3DbvtVolume v = b3DbvtVolume::FromMM(l->volume.Mins() + d, l->volume.Maxs() + d);
+ dbvt.update(l, v);
}
}
- const int time=(int)wallclock.getTimeMilliseconds();
- const int up=cfgBenchmark10_Passes*cfgBenchmark10_Iterations;
- printf("%u ms (%i%%),(%u u/s)\r\n",time,(time-cfgBenchmark10_Reference)*100/time,up*1000/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ const int up = cfgBenchmark10_Passes * cfgBenchmark10_Iterations;
+ printf("%u ms (%i%%),(%u u/s)\r\n", time, (time - cfgBenchmark10_Reference) * 100 / time, up * 1000 / time);
}
- if(cfgBenchmark11_Enable)
- {// Benchmark 11
+ if (cfgBenchmark11_Enable)
+ { // Benchmark 11
srand(380843);
- b3DynamicBvh dbvt;
- b3DbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt);
+ b3DynamicBvh dbvt;
+ b3DbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt);
dbvt.optimizeTopDown();
printf("[11] optimize (incremental): ");
- wallclock.reset();
- for(int i=0;i<cfgBenchmark11_Passes;++i)
+ wallclock.reset();
+ for (int i = 0; i < cfgBenchmark11_Passes; ++i)
{
dbvt.optimizeIncremental(cfgBenchmark11_Iterations);
}
- const int time=(int)wallclock.getTimeMilliseconds();
- const int op=cfgBenchmark11_Passes*cfgBenchmark11_Iterations;
- printf("%u ms (%i%%),(%u o/s)\r\n",time,(time-cfgBenchmark11_Reference)*100/time,op/time*1000);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ const int op = cfgBenchmark11_Passes * cfgBenchmark11_Iterations;
+ printf("%u ms (%i%%),(%u o/s)\r\n", time, (time - cfgBenchmark11_Reference) * 100 / time, op / time * 1000);
}
- if(cfgBenchmark12_Enable)
- {// Benchmark 12
+ if (cfgBenchmark12_Enable)
+ { // Benchmark 12
srand(380843);
- b3AlignedObjectArray<b3DbvtVolume> volumes;
- b3AlignedObjectArray<bool> results;
+ b3AlignedObjectArray<b3DbvtVolume> volumes;
+ b3AlignedObjectArray<bool> results;
volumes.resize(cfgLeaves);
results.resize(cfgLeaves);
- for(int i=0;i<cfgLeaves;++i)
+ for (int i = 0; i < cfgLeaves; ++i)
{
- volumes[i]=b3DbvtBenchmark::RandVolume(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale);
+ volumes[i] = b3DbvtBenchmark::RandVolume(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale);
}
printf("[12] b3DbvtVolume notequal: ");
wallclock.reset();
- for(int i=0;i<cfgBenchmark12_Iterations;++i)
+ for (int i = 0; i < cfgBenchmark12_Iterations; ++i)
{
- for(int j=0;j<cfgLeaves;++j)
+ for (int j = 0; j < cfgLeaves; ++j)
{
- for(int k=0;k<cfgLeaves;++k)
+ for (int k = 0; k < cfgLeaves; ++k)
{
- results[k]=NotEqual(volumes[j],volumes[k]);
+ results[k] = NotEqual(volumes[j], volumes[k]);
}
}
}
- const int time=(int)wallclock.getTimeMilliseconds();
- printf("%u ms (%i%%)\r\n",time,(time-cfgBenchmark12_Reference)*100/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ printf("%u ms (%i%%)\r\n", time, (time - cfgBenchmark12_Reference) * 100 / time);
}
- if(cfgBenchmark13_Enable)
- {// Benchmark 13
+ if (cfgBenchmark13_Enable)
+ { // Benchmark 13
srand(380843);
- b3DynamicBvh dbvt;
- b3AlignedObjectArray<b3Vector3> vectors;
- b3DbvtBenchmark::NilPolicy policy;
+ b3DynamicBvh dbvt;
+ b3AlignedObjectArray<b3Vector3> vectors;
+ b3DbvtBenchmark::NilPolicy policy;
vectors.resize(cfgBenchmark13_Iterations);
- for(int i=0;i<vectors.size();++i)
+ for (int i = 0; i < vectors.size(); ++i)
{
- vectors[i]=(b3DbvtBenchmark::RandVector3()*2-b3Vector3(1,1,1)).normalized();
+ vectors[i] = (b3DbvtBenchmark::RandVector3() * 2 - b3Vector3(1, 1, 1)).normalized();
}
- b3DbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt);
+ b3DbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt);
dbvt.optimizeTopDown();
printf("[13] culling(OCL+fullsort): ");
- wallclock.reset();
- for(int i=0;i<cfgBenchmark13_Iterations;++i)
+ wallclock.reset();
+ for (int i = 0; i < cfgBenchmark13_Iterations; ++i)
{
- static const b3Scalar offset=0;
- policy.m_depth=-B3_INFINITY;
- dbvt.collideOCL(dbvt.m_root,&vectors[i],&offset,vectors[i],1,policy);
+ static const b3Scalar offset = 0;
+ policy.m_depth = -B3_INFINITY;
+ dbvt.collideOCL(dbvt.m_root, &vectors[i], &offset, vectors[i], 1, policy);
}
- const int time=(int)wallclock.getTimeMilliseconds();
- const int t=cfgBenchmark13_Iterations;
- printf("%u ms (%i%%),(%u t/s)\r\n",time,(time-cfgBenchmark13_Reference)*100/time,(t*1000)/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ const int t = cfgBenchmark13_Iterations;
+ printf("%u ms (%i%%),(%u t/s)\r\n", time, (time - cfgBenchmark13_Reference) * 100 / time, (t * 1000) / time);
}
- if(cfgBenchmark14_Enable)
- {// Benchmark 14
+ if (cfgBenchmark14_Enable)
+ { // Benchmark 14
srand(380843);
- b3DynamicBvh dbvt;
- b3AlignedObjectArray<b3Vector3> vectors;
- b3DbvtBenchmark::P14 policy;
+ b3DynamicBvh dbvt;
+ b3AlignedObjectArray<b3Vector3> vectors;
+ b3DbvtBenchmark::P14 policy;
vectors.resize(cfgBenchmark14_Iterations);
- for(int i=0;i<vectors.size();++i)
+ for (int i = 0; i < vectors.size(); ++i)
{
- vectors[i]=(b3DbvtBenchmark::RandVector3()*2-b3Vector3(1,1,1)).normalized();
+ vectors[i] = (b3DbvtBenchmark::RandVector3() * 2 - b3Vector3(1, 1, 1)).normalized();
}
- b3DbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt);
+ b3DbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt);
dbvt.optimizeTopDown();
policy.m_nodes.reserve(cfgLeaves);
printf("[14] culling(OCL+qsort): ");
- wallclock.reset();
- for(int i=0;i<cfgBenchmark14_Iterations;++i)
+ wallclock.reset();
+ for (int i = 0; i < cfgBenchmark14_Iterations; ++i)
{
- static const b3Scalar offset=0;
+ static const b3Scalar offset = 0;
policy.m_nodes.resize(0);
- dbvt.collideOCL(dbvt.m_root,&vectors[i],&offset,vectors[i],1,policy,false);
+ dbvt.collideOCL(dbvt.m_root, &vectors[i], &offset, vectors[i], 1, policy, false);
policy.m_nodes.quickSort(b3DbvtBenchmark::P14::sortfnc);
}
- const int time=(int)wallclock.getTimeMilliseconds();
- const int t=cfgBenchmark14_Iterations;
- printf("%u ms (%i%%),(%u t/s)\r\n",time,(time-cfgBenchmark14_Reference)*100/time,(t*1000)/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ const int t = cfgBenchmark14_Iterations;
+ printf("%u ms (%i%%),(%u t/s)\r\n", time, (time - cfgBenchmark14_Reference) * 100 / time, (t * 1000) / time);
}
- if(cfgBenchmark15_Enable)
- {// Benchmark 15
+ if (cfgBenchmark15_Enable)
+ { // Benchmark 15
srand(380843);
- b3DynamicBvh dbvt;
- b3AlignedObjectArray<b3Vector3> vectors;
- b3DbvtBenchmark::P15 policy;
+ b3DynamicBvh dbvt;
+ b3AlignedObjectArray<b3Vector3> vectors;
+ b3DbvtBenchmark::P15 policy;
vectors.resize(cfgBenchmark15_Iterations);
- for(int i=0;i<vectors.size();++i)
+ for (int i = 0; i < vectors.size(); ++i)
{
- vectors[i]=(b3DbvtBenchmark::RandVector3()*2-b3Vector3(1,1,1)).normalized();
+ vectors[i] = (b3DbvtBenchmark::RandVector3() * 2 - b3Vector3(1, 1, 1)).normalized();
}
- b3DbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt);
+ b3DbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt);
dbvt.optimizeTopDown();
policy.m_nodes.reserve(cfgLeaves);
printf("[15] culling(KDOP+qsort): ");
- wallclock.reset();
- for(int i=0;i<cfgBenchmark15_Iterations;++i)
+ wallclock.reset();
+ for (int i = 0; i < cfgBenchmark15_Iterations; ++i)
{
- static const b3Scalar offset=0;
+ static const b3Scalar offset = 0;
policy.m_nodes.resize(0);
- policy.m_axis=vectors[i];
- dbvt.collideKDOP(dbvt.m_root,&vectors[i],&offset,1,policy);
+ policy.m_axis = vectors[i];
+ dbvt.collideKDOP(dbvt.m_root, &vectors[i], &offset, 1, policy);
policy.m_nodes.quickSort(b3DbvtBenchmark::P15::sortfnc);
}
- const int time=(int)wallclock.getTimeMilliseconds();
- const int t=cfgBenchmark15_Iterations;
- printf("%u ms (%i%%),(%u t/s)\r\n",time,(time-cfgBenchmark15_Reference)*100/time,(t*1000)/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ const int t = cfgBenchmark15_Iterations;
+ printf("%u ms (%i%%),(%u t/s)\r\n", time, (time - cfgBenchmark15_Reference) * 100 / time, (t * 1000) / time);
}
- if(cfgBenchmark16_Enable)
- {// Benchmark 16
+ if (cfgBenchmark16_Enable)
+ { // Benchmark 16
srand(380843);
- b3DynamicBvh dbvt;
- b3AlignedObjectArray<b3DbvtNode*> batch;
- b3DbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt);
+ b3DynamicBvh dbvt;
+ b3AlignedObjectArray<b3DbvtNode*> batch;
+ b3DbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt);
dbvt.optimizeTopDown();
batch.reserve(cfgBenchmark16_BatchCount);
- printf("[16] insert/remove batch(%u): ",cfgBenchmark16_BatchCount);
+ printf("[16] insert/remove batch(%u): ", cfgBenchmark16_BatchCount);
wallclock.reset();
- for(int i=0;i<cfgBenchmark16_Passes;++i)
+ for (int i = 0; i < cfgBenchmark16_Passes; ++i)
{
- for(int j=0;j<cfgBenchmark16_BatchCount;++j)
+ for (int j = 0; j < cfgBenchmark16_BatchCount; ++j)
{
- batch.push_back(dbvt.insert(b3DbvtBenchmark::RandVolume(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale),0));
+ batch.push_back(dbvt.insert(b3DbvtBenchmark::RandVolume(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale), 0));
}
- for(int j=0;j<cfgBenchmark16_BatchCount;++j)
+ for (int j = 0; j < cfgBenchmark16_BatchCount; ++j)
{
dbvt.remove(batch[j]);
}
batch.resize(0);
}
- const int time=(int)wallclock.getTimeMilliseconds();
- const int ir=cfgBenchmark16_Passes*cfgBenchmark16_BatchCount;
- printf("%u ms (%i%%),(%u bir/s)\r\n",time,(time-cfgBenchmark16_Reference)*100/time,int(ir*1000.0/time));
+ const int time = (int)wallclock.getTimeMilliseconds();
+ const int ir = cfgBenchmark16_Passes * cfgBenchmark16_BatchCount;
+ printf("%u ms (%i%%),(%u bir/s)\r\n", time, (time - cfgBenchmark16_Reference) * 100 / time, int(ir * 1000.0 / time));
}
- if(cfgBenchmark17_Enable)
- {// Benchmark 17
+ if (cfgBenchmark17_Enable)
+ { // Benchmark 17
srand(380843);
- b3AlignedObjectArray<b3DbvtVolume> volumes;
- b3AlignedObjectArray<int> results;
- b3AlignedObjectArray<int> indices;
+ b3AlignedObjectArray<b3DbvtVolume> volumes;
+ b3AlignedObjectArray<int> results;
+ b3AlignedObjectArray<int> indices;
volumes.resize(cfgLeaves);
results.resize(cfgLeaves);
indices.resize(cfgLeaves);
- for(int i=0;i<cfgLeaves;++i)
+ for (int i = 0; i < cfgLeaves; ++i)
{
- indices[i]=i;
- volumes[i]=b3DbvtBenchmark::RandVolume(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale);
+ indices[i] = i;
+ volumes[i] = b3DbvtBenchmark::RandVolume(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale);
}
- for(int i=0;i<cfgLeaves;++i)
+ for (int i = 0; i < cfgLeaves; ++i)
{
- b3Swap(indices[i],indices[rand()%cfgLeaves]);
+ b3Swap(indices[i], indices[rand() % cfgLeaves]);
}
printf("[17] b3DbvtVolume select: ");
wallclock.reset();
- for(int i=0;i<cfgBenchmark17_Iterations;++i)
+ for (int i = 0; i < cfgBenchmark17_Iterations; ++i)
{
- for(int j=0;j<cfgLeaves;++j)
+ for (int j = 0; j < cfgLeaves; ++j)
{
- for(int k=0;k<cfgLeaves;++k)
+ for (int k = 0; k < cfgLeaves; ++k)
{
- const int idx=indices[k];
- results[idx]=Select(volumes[idx],volumes[j],volumes[k]);
+ const int idx = indices[k];
+ results[idx] = Select(volumes[idx], volumes[j], volumes[k]);
}
}
}
- const int time=(int)wallclock.getTimeMilliseconds();
- printf("%u ms (%i%%)\r\n",time,(time-cfgBenchmark17_Reference)*100/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ printf("%u ms (%i%%)\r\n", time, (time - cfgBenchmark17_Reference) * 100 / time);
}
printf("\r\n\r\n");
}
diff --git a/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvh.h b/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvh.h
index c004b9130f..f44e3377fe 100644
--- a/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvh.h
+++ b/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvh.h
@@ -26,50 +26,49 @@ subject to the following restrictions:
// Compile time configuration
//
-
// Implementation profiles
-#define B3_DBVT_IMPL_GENERIC 0 // Generic implementation
-#define B3_DBVT_IMPL_SSE 1 // SSE
+#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
+#if (defined(_MSC_VER) && _MSC_VER >= 1400)
+#define B3_DBVT_USE_TEMPLATE 1
#else
-#define B3_DBVT_USE_TEMPLATE 0
+#define B3_DBVT_USE_TEMPLATE 0
#endif
#else
-#define B3_DBVT_USE_TEMPLATE 0
+#define B3_DBVT_USE_TEMPLATE 0
#endif
// Use only intrinsics instead of inline asm
-#define B3_DBVT_USE_INTRINSIC_SSE 1
+#define B3_DBVT_USE_INTRINSIC_SSE 1
// Using memmov for collideOCL
-#define B3_DBVT_USE_MEMMOVE 1
+#define B3_DBVT_USE_MEMMOVE 1
// Enable benchmarking code
-#define B3_DBVT_ENABLE_BENCHMARK 0
+#define B3_DBVT_ENABLE_BENCHMARK 0
// Inlining
-#define B3_DBVT_INLINE B3_FORCE_INLINE
+#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
+#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
+#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)
+#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 <emmintrin.h>
#endif
@@ -78,21 +77,24 @@ subject to the following restrictions:
//
#if B3_DBVT_USE_TEMPLATE
-#define B3_DBVT_VIRTUAL
+#define B3_DBVT_VIRTUAL
#define B3_DBVT_VIRTUAL_DTOR(a)
-#define B3_DBVT_PREFIX template <typename T>
-#define B3_DBVT_IPOLICY T& policy
-#define B3_DBVT_CHECKTYPE static const ICollide& typechecker=*(T*)1;(void)typechecker;
+#define B3_DBVT_PREFIX template <typename T>
+#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_VIRTUAL_DTOR(a) \
+ virtual ~a() {}
+#define B3_DBVT_VIRTUAL virtual
#define B3_DBVT_PREFIX
-#define B3_DBVT_IPOLICY ICollide& policy
+#define B3_DBVT_IPOLICY ICollide& policy
#define B3_DBVT_CHECKTYPE
#endif
#if B3_DBVT_USE_MEMMOVE
-#if !defined( __CELLOS_LV2__) && !defined(__MWERKS__)
+#if !defined(__CELLOS_LV2__) && !defined(__MWERKS__)
#include <memory.h>
#endif
#include <string.h>
@@ -126,187 +128,188 @@ subject to the following restrictions:
// Defaults volumes
//
-/* b3DbvtAabbMm */
-struct b3DbvtAabbMm
+/* 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); }
-
+ 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;
+ B3_DBVT_INLINE void AddSpan(const b3Vector3& d, b3Scalar& smi, b3Scalar& smx) const;
+
private:
- b3Vector3 mi,mx;
+ b3Vector3 mi, mx;
};
-// Types
-typedef b3DbvtAabbMm b3DbvtVolume;
+// Types
+typedef b3DbvtAabbMm b3DbvtVolume;
-/* b3DbvtNode */
-struct b3DbvtNode
+/* 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;
+ 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
+struct b3DynamicBvh
{
- /* Stack element */
- struct sStkNN
+ /* Stack element */
+ struct sStkNN
{
- const b3DbvtNode* a;
- const b3DbvtNode* b;
+ const b3DbvtNode* a;
+ const b3DbvtNode* b;
sStkNN() {}
- sStkNN(const b3DbvtNode* na,const b3DbvtNode* nb) : a(na),b(nb) {}
+ sStkNN(const b3DbvtNode* na, const b3DbvtNode* nb) : a(na), b(nb) {}
};
- struct sStkNP
+ struct sStkNP
{
- const b3DbvtNode* node;
- int mask;
- sStkNP(const b3DbvtNode* n,unsigned m) : node(n),mask(m) {}
+ const b3DbvtNode* node;
+ int mask;
+ sStkNP(const b3DbvtNode* n, unsigned m) : node(n), mask(m) {}
};
- struct sStkNPS
+ struct sStkNPS
{
- const b3DbvtNode* node;
- int mask;
- b3Scalar value;
+ const b3DbvtNode* node;
+ int mask;
+ b3Scalar value;
sStkNPS() {}
- sStkNPS(const b3DbvtNode* n,unsigned m,b3Scalar v) : node(n),mask(m),value(v) {}
+ sStkNPS(const b3DbvtNode* n, unsigned m, b3Scalar v) : node(n), mask(m), value(v) {}
};
- struct sStkCLN
+ struct sStkCLN
{
- const b3DbvtNode* node;
- b3DbvtNode* parent;
- sStkCLN(const b3DbvtNode* n,b3DbvtNode* p) : node(n),parent(p) {}
+ const b3DbvtNode* node;
+ b3DbvtNode* parent;
+ sStkCLN(const b3DbvtNode* n, b3DbvtNode* p) : node(n), parent(p) {}
};
// Policies/Interfaces
- /* ICollide */
- struct ICollide
- {
+ /* 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); }
+ 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
+ /* 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;
+ 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
+ /* IClone */
+ struct IClone
{
- virtual ~IClone() {}
- virtual void CloneLeaf(b3DbvtNode*) {}
+ virtual ~IClone() {}
+ virtual void CloneLeaf(b3DbvtNode*) {}
};
// Constants
- enum {
- B3_SIMPLE_STACKSIZE = 64,
- B3_DOUBLE_STACKSIZE = B3_SIMPLE_STACKSIZE*2
+ 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<sStkNN> m_stkStack;
- mutable b3AlignedObjectArray<const b3DbvtNode*> m_rayTestStack;
+ b3DbvtNode* m_root;
+ b3DbvtNode* m_free;
+ int m_lkhd;
+ int m_leaves;
+ unsigned m_opath;
+ b3AlignedObjectArray<sStkNN> m_stkStack;
+ mutable b3AlignedObjectArray<const b3DbvtNode*> 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<const b3DbvtNode*>& leaves);
+ 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<const b3DbvtNode*>& leaves);
#if B3_DBVT_ENABLE_BENCHMARK
- static void benchmark();
+ static void benchmark();
#else
- static void benchmark(){}
+ static void benchmark()
+ {
+ }
#endif
// B3_DBVT_IPOLICY must support ICollide policy/interface
B3_DBVT_PREFIX
- static void enumNodes( const b3DbvtNode* root,
- B3_DBVT_IPOLICY);
+ static void enumNodes(const b3DbvtNode* root,
+ B3_DBVT_IPOLICY);
B3_DBVT_PREFIX
- static void enumLeaves( const b3DbvtNode* root,
- B3_DBVT_IPOLICY);
+ static void enumLeaves(const b3DbvtNode* root,
+ B3_DBVT_IPOLICY);
B3_DBVT_PREFIX
- void collideTT( const b3DbvtNode* root0,
- const b3DbvtNode* root1,
- B3_DBVT_IPOLICY);
+ 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);
+ void collideTTpersistentStack(const b3DbvtNode* root0,
+ const b3DbvtNode* root1,
+ B3_DBVT_IPOLICY);
#if 0
B3_DBVT_PREFIX
void collideTT( const b3DbvtNode* root0,
@@ -322,71 +325,81 @@ struct b3DynamicBvh
#endif
B3_DBVT_PREFIX
- void collideTV( const b3DbvtNode* root,
- const b3DbvtVolume& volume,
- B3_DBVT_IPOLICY) const;
+ 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);
+ 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;
+ 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);
+ 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);
+ 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)
+ 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)
+ int m = 0;
+ while (l < h)
{
- m=(l+h)>>1;
- if(a[i[m]].value>=v) l=m+1; else h=m;
+ m = (l + h) >> 1;
+ if (a[i[m]].value >= v)
+ l = m + 1;
+ else
+ h = m;
}
- return(h);
+ return (h);
}
- static B3_DBVT_INLINE int allocate( b3AlignedObjectArray<int>& ifree,
- b3AlignedObjectArray<sStkNPS>& stock,
- const sStkNPS& value)
+ static B3_DBVT_INLINE int allocate(b3AlignedObjectArray<int>& ifree,
+ b3AlignedObjectArray<sStkNPS>& stock,
+ const sStkNPS& value)
{
- int i;
- if(ifree.size()>0)
- { i=ifree[ifree.size()-1];ifree.pop_back();stock[i]=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);
+ {
+ i = stock.size();
+ stock.push_back(value);
+ }
+ return (i);
}
//
private:
- b3DynamicBvh(const b3DynamicBvh&) {}
+ b3DynamicBvh(const b3DynamicBvh&) {}
};
//
@@ -394,227 +407,252 @@ private:
//
//
-inline b3DbvtAabbMm b3DbvtAabbMm::FromCE(const b3Vector3& c,const b3Vector3& e)
+inline b3DbvtAabbMm b3DbvtAabbMm::FromCE(const b3Vector3& c, const b3Vector3& e)
{
b3DbvtAabbMm box;
- box.mi=c-e;box.mx=c+e;
- return(box);
+ box.mi = c - e;
+ box.mx = c + e;
+ return (box);
}
//
-inline b3DbvtAabbMm b3DbvtAabbMm::FromCR(const b3Vector3& c,b3Scalar r)
+inline b3DbvtAabbMm b3DbvtAabbMm::FromCR(const b3Vector3& c, b3Scalar r)
{
- return(FromCE(c,b3MakeVector3(r,r,r)));
+ return (FromCE(c, b3MakeVector3(r, r, r)));
}
//
-inline b3DbvtAabbMm b3DbvtAabbMm::FromMM(const b3Vector3& mi,const b3Vector3& mx)
+inline b3DbvtAabbMm b3DbvtAabbMm::FromMM(const b3Vector3& mi, const b3Vector3& mx)
{
b3DbvtAabbMm box;
- box.mi=mi;box.mx=mx;
- return(box);
+ box.mi = mi;
+ box.mx = mx;
+ return (box);
}
//
-inline b3DbvtAabbMm b3DbvtAabbMm::FromPoints(const b3Vector3* pts,int n)
+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 = box.mx = pts[0];
+ for (int i = 1; i < n; ++i)
{
box.mi.setMin(pts[i]);
box.mx.setMax(pts[i]);
}
- return(box);
+ return (box);
}
//
-inline b3DbvtAabbMm b3DbvtAabbMm::FromPoints(const b3Vector3** ppts,int n)
+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 = box.mx = *ppts[0];
+ for (int i = 1; i < n; ++i)
{
box.mi.setMin(*ppts[i]);
box.mx.setMax(*ppts[i]);
}
- return(box);
+ return (box);
}
//
-B3_DBVT_INLINE void b3DbvtAabbMm::Expand(const b3Vector3& e)
+B3_DBVT_INLINE void b3DbvtAabbMm::Expand(const b3Vector3& e)
{
- mi-=e;mx+=e;
+ mi -= e;
+ mx += e;
}
//
-B3_DBVT_INLINE void b3DbvtAabbMm::SignedExpand(const b3Vector3& 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]);
+ 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
+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));
+ 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
+B3_DBVT_INLINE int b3DbvtAabbMm::Classify(const b3Vector3& n, b3Scalar o, int s) const
{
- b3Vector3 pi,px;
- switch(s)
+ 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;
+ 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);
+ 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
+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));
+ 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
+B3_DBVT_INLINE void b3DbvtAabbMm::AddSpan(const b3Vector3& d, b3Scalar& smi, b3Scalar& smx) const
{
- for(int i=0;i<3;++i)
+ for (int i = 0; i < 3; ++i)
{
- if(d[i]<0)
- { smi+=mx[i]*d[i];smx+=mi[i]*d[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]; }
+ {
+ smi += mi[i] * d[i];
+ smx += mx[i] * d[i];
+ }
}
}
//
-B3_DBVT_INLINE bool b3Intersect( const b3DbvtAabbMm& a,
- const b3DbvtAabbMm& b)
+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);
+#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);
+ const int* pu((const int*)&rt);
#endif
- return((pu[0]|pu[1]|pu[2])==0);
+ 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));
+ 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)
+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));
+ 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)
+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));
+ 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)
+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};
+#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*/};
+ 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
+ union b3SSEUnion ///NOTE: if we use more intrinsics, move b3SSEUnion into the LinearMath directory
{
- __m128 ssereg;
- float floats[4];
- int ints[4];
+ __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));
-
+ __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;
+ tmp.ssereg = _mm_cmple_ss(bmi, ami);
+ return tmp.ints[0] & 1;
#else
- B3_ATTRIBUTE_ALIGNED16(__int32 r[1]);
+ B3_ATTRIBUTE_ALIGNED16(__int32 r[1]);
__asm
{
mov eax,o
@@ -642,46 +680,52 @@ B3_DBVT_INLINE int b3Select( const b3DbvtAabbMm& o,
cmpless xmm2,xmm1
movss r,xmm2
}
- return(r[0]&1);
+ return (r[0] & 1);
#endif
#else
- return(b3Proximity(o,a)<b3Proximity(o,b)?0:1);
+ return (b3Proximity(o, a) < b3Proximity(o, b) ? 0 : 1);
#endif
}
//
-B3_DBVT_INLINE void b3Merge( const b3DbvtAabbMm& a,
- const b3DbvtAabbMm& b,
- b3DbvtAabbMm& r)
+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);
+#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)
+ 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];
+ 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)
+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));
+ 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));
}
//
@@ -690,162 +734,162 @@ B3_DBVT_INLINE bool b3NotEqual( const b3DbvtAabbMm& a,
//
B3_DBVT_PREFIX
-inline void b3DynamicBvh::enumNodes( const b3DbvtNode* root,
- B3_DBVT_IPOLICY)
+inline void b3DynamicBvh::enumNodes(const b3DbvtNode* root,
+ B3_DBVT_IPOLICY)
{
B3_DBVT_CHECKTYPE
- policy.Process(root);
- if(root->isinternal())
+ policy.Process(root);
+ if (root->isinternal())
{
- enumNodes(root->childs[0],policy);
- enumNodes(root->childs[1],policy);
+ enumNodes(root->childs[0], policy);
+ enumNodes(root->childs[1], policy);
}
}
//
B3_DBVT_PREFIX
-inline void b3DynamicBvh::enumLeaves( const b3DbvtNode* root,
- B3_DBVT_IPOLICY)
+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);
- }
+ 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)
+inline void b3DynamicBvh::collideTT(const b3DbvtNode* root0,
+ const b3DbvtNode* root1,
+ B3_DBVT_IPOLICY)
{
B3_DBVT_CHECKTYPE
- if(root0&&root1)
+ if (root0 && root1)
+ {
+ int depth = 1;
+ int treshold = B3_DOUBLE_STACKSIZE - 4;
+ b3AlignedObjectArray<sStkNN> stkStack;
+ stkStack.resize(B3_DOUBLE_STACKSIZE);
+ stkStack[0] = sStkNN(root0, root1);
+ do
{
- int depth=1;
- int treshold=B3_DOUBLE_STACKSIZE-4;
- b3AlignedObjectArray<sStkNN> stkStack;
- stkStack.resize(B3_DOUBLE_STACKSIZE);
- stkStack[0]=sStkNN(root0,root1);
- do {
- sStkNN p=stkStack[--depth];
- if(depth>treshold)
+ 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.resize(stkStack.size()*2);
- treshold=stkStack.size()-4;
+ 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]);
}
- if(p.a==p.b)
+ }
+ else if (b3Intersect(p.a->volume, p.b->volume))
+ {
+ if (p.a->isinternal())
{
- if(p.a->isinternal())
+ if (p.b->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]);
+ 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(b3Intersect(p.a->volume,p.b->volume))
+ else
{
- if(p.a->isinternal())
+ if (p.b->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);
- }
+ stkStack[depth++] = sStkNN(p.a, p.b->childs[0]);
+ stkStack[depth++] = sStkNN(p.a, p.b->childs[1]);
}
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);
- }
+ policy.Process(p.a, p.b);
}
}
- } while(depth);
- }
+ }
+ } while (depth);
+ }
}
-
-
B3_DBVT_PREFIX
-inline void b3DynamicBvh::collideTTpersistentStack( const b3DbvtNode* root0,
- const b3DbvtNode* root1,
- B3_DBVT_IPOLICY)
+inline void b3DynamicBvh::collideTTpersistentStack(const b3DbvtNode* root0,
+ const b3DbvtNode* root1,
+ B3_DBVT_IPOLICY)
{
B3_DBVT_CHECKTYPE
- if(root0&&root1)
+ 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
{
- 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)
+ 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.resize(m_stkStack.size()*2);
- treshold=m_stkStack.size()-4;
+ 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]);
}
- if(p.a==p.b)
+ }
+ else if (b3Intersect(p.a->volume, p.b->volume))
+ {
+ if (p.a->isinternal())
{
- 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.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]);
+ m_stkStack[depth++] = sStkNN(p.a->childs[0], p.b);
+ m_stkStack[depth++] = sStkNN(p.a->childs[1], p.b);
}
}
- else if(b3Intersect(p.a->volume,p.b->volume))
+ else
{
- if(p.a->isinternal())
+ if (p.b->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);
- }
+ m_stkStack[depth++] = sStkNN(p.a, p.b->childs[0]);
+ m_stkStack[depth++] = sStkNN(p.a, p.b->childs[1]);
}
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);
- }
+ policy.Process(p.a, p.b);
}
}
- } while(depth);
- }
+ }
+ } while (depth);
+ }
}
#if 0
@@ -915,337 +959,356 @@ inline void b3DynamicBvh::collideTT( const b3DbvtNode* root0,
const b3Transform xform=xform0.inverse()*xform1;
collideTT(root0,root1,xform,policy);
}
-#endif
+#endif
//
B3_DBVT_PREFIX
-inline void b3DynamicBvh::collideTV( const b3DbvtNode* root,
- const b3DbvtVolume& vol,
- B3_DBVT_IPOLICY) const
+inline void b3DynamicBvh::collideTV(const b3DbvtNode* root,
+ const b3DbvtVolume& vol,
+ B3_DBVT_IPOLICY) const
{
B3_DBVT_CHECKTYPE
- if(root)
+ if (root)
+ {
+ B3_ATTRIBUTE_ALIGNED16(b3DbvtVolume)
+ volume(vol);
+ b3AlignedObjectArray<const b3DbvtNode*> stack;
+ stack.resize(0);
+ stack.reserve(B3_SIMPLE_STACKSIZE);
+ stack.push_back(root);
+ do
{
- B3_ATTRIBUTE_ALIGNED16(b3DbvtVolume) volume(vol);
- b3AlignedObjectArray<const b3DbvtNode*> 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))
+ const b3DbvtNode* n = stack[stack.size() - 1];
+ stack.pop_back();
+ if (b3Intersect(n->volume, volume))
+ {
+ if (n->isinternal())
{
- if(n->isinternal())
- {
- stack.push_back(n->childs[0]);
- stack.push_back(n->childs[1]);
- }
- else
- {
- policy.Process(n);
- }
+ stack.push_back(n->childs[0]);
+ stack.push_back(n->childs[1]);
}
- } while(stack.size()>0);
- }
+ 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
+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;
+ (void)rayTo;
B3_DBVT_CHECKTYPE
- if(root)
+ if (root)
{
- int depth=1;
- int treshold=B3_DOUBLE_STACKSIZE-2;
- b3AlignedObjectArray<const b3DbvtNode*>& stack = m_rayTestStack;
+ int depth = 1;
+ int treshold = B3_DOUBLE_STACKSIZE - 2;
+ b3AlignedObjectArray<const b3DbvtNode*>& stack = m_rayTestStack;
stack.resize(B3_DOUBLE_STACKSIZE);
- stack[0]=root;
+ stack[0] = root;
b3Vector3 bounds[2];
- do
+ 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)
+ 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 (node->isinternal())
{
- if(depth>treshold)
+ if (depth > treshold)
{
- stack.resize(stack.size()*2);
- treshold=stack.size()-2;
+ stack.resize(stack.size() * 2);
+ treshold = stack.size() - 2;
}
- stack[depth++]=node->childs[0];
- stack[depth++]=node->childs[1];
+ stack[depth++] = node->childs[0];
+ stack[depth++] = node->childs[1];
}
else
{
policy.Process(node);
}
}
- } while(depth);
+ } while (depth);
}
}
//
B3_DBVT_PREFIX
-inline void b3DynamicBvh::rayTest( const b3DbvtNode* root,
- const b3Vector3& rayFrom,
- const b3Vector3& rayTo,
- B3_DBVT_IPOLICY)
+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 ();
+ 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};
+ ///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);
+ b3Scalar lambda_max = rayDir.dot(rayTo - rayFrom);
#ifdef COMPARE_BTRAY_AABB2
- b3Vector3 resultNormal;
-#endif//COMPARE_BTRAY_AABB2
-
- b3AlignedObjectArray<const b3DbvtNode*> stack;
+ b3Vector3 resultNormal;
+#endif //COMPARE_BTRAY_AABB2
- int depth=1;
- int treshold=B3_DOUBLE_STACKSIZE-2;
+ b3AlignedObjectArray<const b3DbvtNode*> stack;
- stack.resize(B3_DOUBLE_STACKSIZE);
- stack[0]=root;
- b3Vector3 bounds[2];
- do {
- const b3DbvtNode* node=stack[--depth];
+ int depth = 1;
+ int treshold = B3_DOUBLE_STACKSIZE - 2;
- 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);
+ 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
+ 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 (result1)
+ {
+ if (node->isinternal())
{
- 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
+ if (depth > treshold)
{
- policy.Process(node);
+ stack.resize(stack.size() * 2);
+ treshold = stack.size() - 2;
}
+ stack[depth++] = node->childs[0];
+ stack[depth++] = node->childs[1];
}
- } while(depth);
-
- }
+ 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)
+inline void b3DynamicBvh::collideKDOP(const b3DbvtNode* root,
+ const b3Vector3* normals,
+ const b3Scalar* offsets,
+ int count,
+ B3_DBVT_IPOLICY)
{
B3_DBVT_CHECKTYPE
- if(root)
+ if (root)
+ {
+ const int inside = (1 << count) - 1;
+ b3AlignedObjectArray<sStkNP> stack;
+ int signs[sizeof(unsigned) * 8];
+ b3Assert(count < int(sizeof(signs) / sizeof(signs[0])));
+ for (int i = 0; i < count; ++i)
{
- const int inside=(1<<count)-1;
- b3AlignedObjectArray<sStkNP> 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)
{
- 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))
{
- if(0==(se.mask&j))
+ const int side = se.node->volume.Classify(normals[i], offsets[i], signs[i]);
+ switch (side)
{
- 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;
- }
+ case -1:
+ out = true;
+ break;
+ case +1:
+ se.mask |= j;
+ break;
}
}
- if(!out)
+ }
+ if (!out)
+ {
+ if ((se.mask != inside) && (se.node->isinternal()))
{
- 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);
- }
+ stack.push_back(sStkNP(se.node->childs[0], se.mask));
+ stack.push_back(sStkNP(se.node->childs[1], se.mask));
}
- } while(stack.size());
- }
+ 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)
+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)
+ 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<sStkNPS> stock;
+ b3AlignedObjectArray<int> ifree;
+ b3AlignedObjectArray<int> stack;
+ int signs[sizeof(unsigned) * 8];
+ b3Assert(count < int(sizeof(signs) / sizeof(signs[0])));
+ for (int i = 0; i < count; ++i)
{
- 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<sStkNPS> stock;
- b3AlignedObjectArray<int> ifree;
- b3AlignedObjectArray<int> 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)
{
- 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)
{
- bool out=false;
- for(int i=0,j=1;(!out)&&(i<count);++i,j<<=1)
+ if (0 == (se.mask & j))
{
- if(0==(se.mask&j))
+ const int side = se.node->volume.Classify(normals[i], offsets[i], signs[i]);
+ switch (side)
{
- 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;
- }
+ case -1:
+ out = true;
+ break;
+ case +1:
+ se.mask |= j;
+ break;
}
}
- if(out) continue;
}
- if(policy.Descent(se.node))
+ if (out) continue;
+ }
+ if (policy.Descent(se.node))
+ {
+ if (se.node->isinternal())
{
- 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))
{
- 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);
+ /* 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));
+ 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];
+ 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);
+ 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));
+ 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];
+ 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]));
- }
+ stack[j] = allocate(ifree, stock, nes[1 - q]);
}
else
{
- policy.Process(se.node,se.value);
+ stack.push_back(allocate(ifree, stock, nes[q]));
+ stack.push_back(allocate(ifree, stock, nes[1 - q]));
}
}
- } while(stack.size());
- }
+ else
+ {
+ policy.Process(se.node, se.value);
+ }
+ }
+ } while (stack.size());
+ }
}
//
B3_DBVT_PREFIX
-inline void b3DynamicBvh::collideTU( const b3DbvtNode* root,
- B3_DBVT_IPOLICY)
+inline void b3DynamicBvh::collideTU(const b3DbvtNode* root,
+ B3_DBVT_IPOLICY)
{
B3_DBVT_CHECKTYPE
- if(root)
+ if (root)
+ {
+ b3AlignedObjectArray<const b3DbvtNode*> stack;
+ stack.reserve(B3_SIMPLE_STACKSIZE);
+ stack.push_back(root);
+ do
{
- b3AlignedObjectArray<const b3DbvtNode*> 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))
+ const b3DbvtNode* n = stack[stack.size() - 1];
+ stack.pop_back();
+ if (policy.Descent(n))
+ {
+ if (n->isinternal())
{
- if(n->isinternal())
- { stack.push_back(n->childs[0]);stack.push_back(n->childs[1]); }
- else
- { policy.Process(n); }
+ stack.push_back(n->childs[0]);
+ stack.push_back(n->childs[1]);
}
- } while(stack.size()>0);
- }
+ else
+ {
+ policy.Process(n);
+ }
+ }
+ } while (stack.size() > 0);
+ }
}
//
diff --git a/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvhBroadphase.cpp b/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvhBroadphase.cpp
index bc150955b8..dea2ddb0f2 100644
--- a/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvhBroadphase.cpp
+++ b/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvhBroadphase.cpp
@@ -22,28 +22,27 @@ subject to the following restrictions:
// Profiling
//
-#if B3_DBVT_BP_PROFILE||B3_DBVT_BP_ENABLE_BENCHMARK
+#if B3_DBVT_BP_PROFILE || B3_DBVT_BP_ENABLE_BENCHMARK
#include <stdio.h>
#endif
#if B3_DBVT_BP_PROFILE
-struct b3ProfileScope
+struct b3ProfileScope
{
- __forceinline b3ProfileScope(b3Clock& clock,unsigned long& value) :
- m_clock(&clock),m_value(&value),m_base(clock.getTimeMicroseconds())
+ __forceinline b3ProfileScope(b3Clock& clock, unsigned long& value) : m_clock(&clock), m_value(&value), m_base(clock.getTimeMicroseconds())
{
}
__forceinline ~b3ProfileScope()
{
- (*m_value)+=m_clock->getTimeMicroseconds()-m_base;
+ (*m_value) += m_clock->getTimeMicroseconds() - m_base;
}
- b3Clock* m_clock;
- unsigned long* m_value;
- unsigned long m_base;
+ b3Clock* m_clock;
+ unsigned long* m_value;
+ unsigned long m_base;
};
-#define b3SPC(_value_) b3ProfileScope spc_scope(m_clock,_value_)
+#define b3SPC(_value_) b3ProfileScope spc_scope(m_clock, _value_)
#else
-#define b3SPC(_value_)
+#define b3SPC(_value_)
#endif
//
@@ -52,66 +51,75 @@ struct b3ProfileScope
//
template <typename T>
-static inline void b3ListAppend(T* item,T*& list)
+static inline void b3ListAppend(T* item, T*& list)
{
- item->links[0]=0;
- item->links[1]=list;
- if(list) list->links[0]=item;
- list=item;
+ item->links[0] = 0;
+ item->links[1] = list;
+ if (list) list->links[0] = item;
+ list = item;
}
//
template <typename T>
-static inline void b3ListRemove(T* item,T*& list)
+static inline void b3ListRemove(T* item, T*& list)
{
- if(item->links[0]) item->links[0]->links[1]=item->links[1]; else list=item->links[1];
- if(item->links[1]) item->links[1]->links[0]=item->links[0];
+ if (item->links[0])
+ item->links[0]->links[1] = item->links[1];
+ else
+ list = item->links[1];
+ if (item->links[1]) item->links[1]->links[0] = item->links[0];
}
//
template <typename T>
-static inline int b3ListCount(T* root)
+static inline int b3ListCount(T* root)
{
- int n=0;
- while(root) { ++n;root=root->links[1]; }
- return(n);
+ int n = 0;
+ while (root)
+ {
+ ++n;
+ root = root->links[1];
+ }
+ return (n);
}
//
template <typename T>
-static inline void b3Clear(T& value)
+static inline void b3Clear(T& value)
{
- static const struct ZeroDummy : T {} zerodummy;
- value=zerodummy;
+ static const struct ZeroDummy : T
+ {
+ } zerodummy;
+ value = zerodummy;
}
//
// Colliders
//
-/* Tree collider */
-struct b3DbvtTreeCollider : b3DynamicBvh::ICollide
+/* Tree collider */
+struct b3DbvtTreeCollider : b3DynamicBvh::ICollide
{
- b3DynamicBvhBroadphase* pbp;
- b3DbvtProxy* proxy;
+ b3DynamicBvhBroadphase* pbp;
+ b3DbvtProxy* proxy;
b3DbvtTreeCollider(b3DynamicBvhBroadphase* p) : pbp(p) {}
- void Process(const b3DbvtNode* na,const b3DbvtNode* nb)
+ void Process(const b3DbvtNode* na, const b3DbvtNode* nb)
{
- if(na!=nb)
+ if (na != nb)
{
- b3DbvtProxy* pa=(b3DbvtProxy*)na->data;
- b3DbvtProxy* pb=(b3DbvtProxy*)nb->data;
+ b3DbvtProxy* pa = (b3DbvtProxy*)na->data;
+ b3DbvtProxy* pb = (b3DbvtProxy*)nb->data;
#if B3_DBVT_BP_SORTPAIRS
- if(pa->m_uniqueId>pb->m_uniqueId)
- b3Swap(pa,pb);
+ if (pa->m_uniqueId > pb->m_uniqueId)
+ b3Swap(pa, pb);
#endif
- pbp->m_paircache->addOverlappingPair(pa->getUid(),pb->getUid());
+ pbp->m_paircache->addOverlappingPair(pa->getUid(), pb->getUid());
++pbp->m_newpairs;
}
}
- void Process(const b3DbvtNode* n)
+ void Process(const b3DbvtNode* n)
{
- Process(n,proxy->leaf);
+ Process(n, proxy->leaf);
}
};
@@ -122,26 +130,26 @@ struct b3DbvtTreeCollider : b3DynamicBvh::ICollide
//
b3DynamicBvhBroadphase::b3DynamicBvhBroadphase(int proxyCapacity, b3OverlappingPairCache* paircache)
{
- m_deferedcollide = false;
- m_needcleanup = true;
- m_releasepaircache = (paircache!=0)?false:true;
- m_prediction = 0;
- m_stageCurrent = 0;
- m_fixedleft = 0;
- m_fupdates = 1;
- m_dupdates = 0;
- m_cupdates = 10;
- m_newpairs = 1;
- m_updates_call = 0;
- m_updates_done = 0;
- m_updates_ratio = 0;
- m_paircache = paircache? paircache : new(b3AlignedAlloc(sizeof(b3HashedOverlappingPairCache),16)) b3HashedOverlappingPairCache();
-
- m_pid = 0;
- m_cid = 0;
- for(int i=0;i<=STAGECOUNT;++i)
+ m_deferedcollide = false;
+ m_needcleanup = true;
+ m_releasepaircache = (paircache != 0) ? false : true;
+ m_prediction = 0;
+ m_stageCurrent = 0;
+ m_fixedleft = 0;
+ m_fupdates = 1;
+ m_dupdates = 0;
+ m_cupdates = 10;
+ m_newpairs = 1;
+ m_updates_call = 0;
+ m_updates_done = 0;
+ m_updates_ratio = 0;
+ m_paircache = paircache ? paircache : new (b3AlignedAlloc(sizeof(b3HashedOverlappingPairCache), 16)) b3HashedOverlappingPairCache();
+
+ m_pid = 0;
+ m_cid = 0;
+ for (int i = 0; i <= STAGECOUNT; ++i)
{
- m_stageRoots[i]=0;
+ m_stageRoots[i] = 0;
}
#if B3_DBVT_BP_PROFILE
b3Clear(m_profiling);
@@ -152,7 +160,7 @@ b3DynamicBvhBroadphase::b3DynamicBvhBroadphase(int proxyCapacity, b3OverlappingP
//
b3DynamicBvhBroadphase::~b3DynamicBvhBroadphase()
{
- if(m_releasepaircache)
+ if (m_releasepaircache)
{
m_paircache->~b3OverlappingPairCache();
b3AlignedFree(m_paircache);
@@ -160,53 +168,53 @@ b3DynamicBvhBroadphase::~b3DynamicBvhBroadphase()
}
//
-b3BroadphaseProxy* b3DynamicBvhBroadphase::createProxy( const b3Vector3& aabbMin,
- const b3Vector3& aabbMax,
- int objectId,
- void* userPtr,
- int collisionFilterGroup,
- int collisionFilterMask)
+b3BroadphaseProxy* b3DynamicBvhBroadphase::createProxy(const b3Vector3& aabbMin,
+ const b3Vector3& aabbMax,
+ int objectId,
+ void* userPtr,
+ int collisionFilterGroup,
+ int collisionFilterMask)
{
b3DbvtProxy* mem = &m_proxies[objectId];
- b3DbvtProxy* proxy=new(mem) b3DbvtProxy( aabbMin,aabbMax,userPtr,
- collisionFilterGroup,
- collisionFilterMask);
+ b3DbvtProxy* proxy = new (mem) b3DbvtProxy(aabbMin, aabbMax, userPtr,
+ collisionFilterGroup,
+ collisionFilterMask);
- b3DbvtAabbMm aabb = b3DbvtVolume::FromMM(aabbMin,aabbMax);
+ b3DbvtAabbMm aabb = b3DbvtVolume::FromMM(aabbMin, aabbMax);
//bproxy->aabb = b3DbvtVolume::FromMM(aabbMin,aabbMax);
- proxy->stage = m_stageCurrent;
- proxy->m_uniqueId = objectId;
- proxy->leaf = m_sets[0].insert(aabb,proxy);
- b3ListAppend(proxy,m_stageRoots[m_stageCurrent]);
- if(!m_deferedcollide)
+ proxy->stage = m_stageCurrent;
+ proxy->m_uniqueId = objectId;
+ proxy->leaf = m_sets[0].insert(aabb, proxy);
+ b3ListAppend(proxy, m_stageRoots[m_stageCurrent]);
+ if (!m_deferedcollide)
{
- b3DbvtTreeCollider collider(this);
- collider.proxy=proxy;
- m_sets[0].collideTV(m_sets[0].m_root,aabb,collider);
- m_sets[1].collideTV(m_sets[1].m_root,aabb,collider);
+ b3DbvtTreeCollider collider(this);
+ collider.proxy = proxy;
+ m_sets[0].collideTV(m_sets[0].m_root, aabb, collider);
+ m_sets[1].collideTV(m_sets[1].m_root, aabb, collider);
}
- return(proxy);
+ return (proxy);
}
//
-void b3DynamicBvhBroadphase::destroyProxy( b3BroadphaseProxy* absproxy,
- b3Dispatcher* dispatcher)
+void b3DynamicBvhBroadphase::destroyProxy(b3BroadphaseProxy* absproxy,
+ b3Dispatcher* dispatcher)
{
- b3DbvtProxy* proxy=(b3DbvtProxy*)absproxy;
- if(proxy->stage==STAGECOUNT)
+ b3DbvtProxy* proxy = (b3DbvtProxy*)absproxy;
+ if (proxy->stage == STAGECOUNT)
m_sets[1].remove(proxy->leaf);
else
m_sets[0].remove(proxy->leaf);
- b3ListRemove(proxy,m_stageRoots[proxy->stage]);
- m_paircache->removeOverlappingPairsContainingProxy(proxy->getUid(),dispatcher);
-
- m_needcleanup=true;
+ b3ListRemove(proxy, m_stageRoots[proxy->stage]);
+ m_paircache->removeOverlappingPairsContainingProxy(proxy->getUid(), dispatcher);
+
+ m_needcleanup = true;
}
-void b3DynamicBvhBroadphase::getAabb(int objectId,b3Vector3& aabbMin, b3Vector3& aabbMax ) const
+void b3DynamicBvhBroadphase::getAabb(int objectId, b3Vector3& aabbMin, b3Vector3& aabbMax) const
{
- const b3DbvtProxy* proxy=&m_proxies[objectId];
+ const b3DbvtProxy* proxy = &m_proxies[objectId];
aabbMin = proxy->m_aabbMin;
aabbMax = proxy->m_aabbMax;
}
@@ -219,235 +227,223 @@ void b3DynamicBvhBroadphase::getAabb(b3BroadphaseProxy* absproxy,b3Vector3& aabb
}
*/
-
-struct BroadphaseRayTester : b3DynamicBvh::ICollide
+struct BroadphaseRayTester : b3DynamicBvh::ICollide
{
b3BroadphaseRayCallback& m_rayCallback;
BroadphaseRayTester(b3BroadphaseRayCallback& orgCallback)
- :m_rayCallback(orgCallback)
+ : m_rayCallback(orgCallback)
{
}
- void Process(const b3DbvtNode* leaf)
+ void Process(const b3DbvtNode* leaf)
{
- b3DbvtProxy* proxy=(b3DbvtProxy*)leaf->data;
+ b3DbvtProxy* proxy = (b3DbvtProxy*)leaf->data;
m_rayCallback.process(proxy);
}
-};
+};
-void b3DynamicBvhBroadphase::rayTest(const b3Vector3& rayFrom,const b3Vector3& rayTo, b3BroadphaseRayCallback& rayCallback,const b3Vector3& aabbMin,const b3Vector3& aabbMax)
+void b3DynamicBvhBroadphase::rayTest(const b3Vector3& rayFrom, const b3Vector3& rayTo, b3BroadphaseRayCallback& rayCallback, const b3Vector3& aabbMin, const b3Vector3& aabbMax)
{
BroadphaseRayTester callback(rayCallback);
- m_sets[0].rayTestInternal( m_sets[0].m_root,
- rayFrom,
- rayTo,
- rayCallback.m_rayDirectionInverse,
- rayCallback.m_signs,
- rayCallback.m_lambda_max,
- aabbMin,
- aabbMax,
- callback);
-
- m_sets[1].rayTestInternal( m_sets[1].m_root,
- rayFrom,
- rayTo,
- rayCallback.m_rayDirectionInverse,
- rayCallback.m_signs,
- rayCallback.m_lambda_max,
- aabbMin,
- aabbMax,
- callback);
-
+ m_sets[0].rayTestInternal(m_sets[0].m_root,
+ rayFrom,
+ rayTo,
+ rayCallback.m_rayDirectionInverse,
+ rayCallback.m_signs,
+ rayCallback.m_lambda_max,
+ aabbMin,
+ aabbMax,
+ callback);
+
+ m_sets[1].rayTestInternal(m_sets[1].m_root,
+ rayFrom,
+ rayTo,
+ rayCallback.m_rayDirectionInverse,
+ rayCallback.m_signs,
+ rayCallback.m_lambda_max,
+ aabbMin,
+ aabbMax,
+ callback);
}
-
-struct BroadphaseAabbTester : b3DynamicBvh::ICollide
+struct BroadphaseAabbTester : b3DynamicBvh::ICollide
{
b3BroadphaseAabbCallback& m_aabbCallback;
BroadphaseAabbTester(b3BroadphaseAabbCallback& orgCallback)
- :m_aabbCallback(orgCallback)
+ : m_aabbCallback(orgCallback)
{
}
- void Process(const b3DbvtNode* leaf)
+ void Process(const b3DbvtNode* leaf)
{
- b3DbvtProxy* proxy=(b3DbvtProxy*)leaf->data;
+ b3DbvtProxy* proxy = (b3DbvtProxy*)leaf->data;
m_aabbCallback.process(proxy);
}
-};
+};
-void b3DynamicBvhBroadphase::aabbTest(const b3Vector3& aabbMin,const b3Vector3& aabbMax,b3BroadphaseAabbCallback& aabbCallback)
+void b3DynamicBvhBroadphase::aabbTest(const b3Vector3& aabbMin, const b3Vector3& aabbMax, b3BroadphaseAabbCallback& aabbCallback)
{
BroadphaseAabbTester callback(aabbCallback);
- const B3_ATTRIBUTE_ALIGNED16(b3DbvtVolume) bounds=b3DbvtVolume::FromMM(aabbMin,aabbMax);
- //process all children, that overlap with the given AABB bounds
- m_sets[0].collideTV(m_sets[0].m_root,bounds,callback);
- m_sets[1].collideTV(m_sets[1].m_root,bounds,callback);
-
+ const B3_ATTRIBUTE_ALIGNED16(b3DbvtVolume) bounds = b3DbvtVolume::FromMM(aabbMin, aabbMax);
+ //process all children, that overlap with the given AABB bounds
+ m_sets[0].collideTV(m_sets[0].m_root, bounds, callback);
+ m_sets[1].collideTV(m_sets[1].m_root, bounds, callback);
}
-
-
//
-void b3DynamicBvhBroadphase::setAabb(int objectId,
- const b3Vector3& aabbMin,
- const b3Vector3& aabbMax,
- b3Dispatcher* /*dispatcher*/)
+void b3DynamicBvhBroadphase::setAabb(int objectId,
+ const b3Vector3& aabbMin,
+ const b3Vector3& aabbMax,
+ b3Dispatcher* /*dispatcher*/)
{
- b3DbvtProxy* proxy=&m_proxies[objectId];
-// b3DbvtProxy* proxy=(b3DbvtProxy*)absproxy;
- B3_ATTRIBUTE_ALIGNED16(b3DbvtVolume) aabb=b3DbvtVolume::FromMM(aabbMin,aabbMax);
+ b3DbvtProxy* proxy = &m_proxies[objectId];
+ // b3DbvtProxy* proxy=(b3DbvtProxy*)absproxy;
+ B3_ATTRIBUTE_ALIGNED16(b3DbvtVolume)
+ aabb = b3DbvtVolume::FromMM(aabbMin, aabbMax);
#if B3_DBVT_BP_PREVENTFALSEUPDATE
- if(b3NotEqual(aabb,proxy->leaf->volume))
+ if (b3NotEqual(aabb, proxy->leaf->volume))
#endif
{
- bool docollide=false;
- if(proxy->stage==STAGECOUNT)
- {/* fixed -> dynamic set */
+ bool docollide = false;
+ if (proxy->stage == STAGECOUNT)
+ { /* fixed -> dynamic set */
m_sets[1].remove(proxy->leaf);
- proxy->leaf=m_sets[0].insert(aabb,proxy);
- docollide=true;
+ proxy->leaf = m_sets[0].insert(aabb, proxy);
+ docollide = true;
}
else
- {/* dynamic set */
+ { /* dynamic set */
++m_updates_call;
- if(b3Intersect(proxy->leaf->volume,aabb))
- {/* Moving */
-
- const b3Vector3 delta=aabbMin-proxy->m_aabbMin;
- b3Vector3 velocity(((proxy->m_aabbMax-proxy->m_aabbMin)/2)*m_prediction);
- if(delta[0]<0) velocity[0]=-velocity[0];
- if(delta[1]<0) velocity[1]=-velocity[1];
- if(delta[2]<0) velocity[2]=-velocity[2];
- if (
-#ifdef B3_DBVT_BP_MARGIN
- m_sets[0].update(proxy->leaf,aabb,velocity,B3_DBVT_BP_MARGIN)
+ if (b3Intersect(proxy->leaf->volume, aabb))
+ { /* Moving */
+
+ const b3Vector3 delta = aabbMin - proxy->m_aabbMin;
+ b3Vector3 velocity(((proxy->m_aabbMax - proxy->m_aabbMin) / 2) * m_prediction);
+ if (delta[0] < 0) velocity[0] = -velocity[0];
+ if (delta[1] < 0) velocity[1] = -velocity[1];
+ if (delta[2] < 0) velocity[2] = -velocity[2];
+ if (
+#ifdef B3_DBVT_BP_MARGIN
+ m_sets[0].update(proxy->leaf, aabb, velocity, B3_DBVT_BP_MARGIN)
#else
- m_sets[0].update(proxy->leaf,aabb,velocity)
+ m_sets[0].update(proxy->leaf, aabb, velocity)
#endif
- )
+ )
{
++m_updates_done;
- docollide=true;
+ docollide = true;
}
}
else
- {/* Teleporting */
- m_sets[0].update(proxy->leaf,aabb);
+ { /* Teleporting */
+ m_sets[0].update(proxy->leaf, aabb);
++m_updates_done;
- docollide=true;
- }
+ docollide = true;
+ }
}
- b3ListRemove(proxy,m_stageRoots[proxy->stage]);
+ b3ListRemove(proxy, m_stageRoots[proxy->stage]);
proxy->m_aabbMin = aabbMin;
proxy->m_aabbMax = aabbMax;
- proxy->stage = m_stageCurrent;
- b3ListAppend(proxy,m_stageRoots[m_stageCurrent]);
- if(docollide)
+ proxy->stage = m_stageCurrent;
+ b3ListAppend(proxy, m_stageRoots[m_stageCurrent]);
+ if (docollide)
{
- m_needcleanup=true;
- if(!m_deferedcollide)
+ m_needcleanup = true;
+ if (!m_deferedcollide)
{
- b3DbvtTreeCollider collider(this);
- m_sets[1].collideTTpersistentStack(m_sets[1].m_root,proxy->leaf,collider);
- m_sets[0].collideTTpersistentStack(m_sets[0].m_root,proxy->leaf,collider);
+ b3DbvtTreeCollider collider(this);
+ m_sets[1].collideTTpersistentStack(m_sets[1].m_root, proxy->leaf, collider);
+ m_sets[0].collideTTpersistentStack(m_sets[0].m_root, proxy->leaf, collider);
}
- }
+ }
}
}
-
//
-void b3DynamicBvhBroadphase::setAabbForceUpdate( b3BroadphaseProxy* absproxy,
- const b3Vector3& aabbMin,
- const b3Vector3& aabbMax,
- b3Dispatcher* /*dispatcher*/)
+void b3DynamicBvhBroadphase::setAabbForceUpdate(b3BroadphaseProxy* absproxy,
+ const b3Vector3& aabbMin,
+ const b3Vector3& aabbMax,
+ b3Dispatcher* /*dispatcher*/)
{
- b3DbvtProxy* proxy=(b3DbvtProxy*)absproxy;
- B3_ATTRIBUTE_ALIGNED16(b3DbvtVolume) aabb=b3DbvtVolume::FromMM(aabbMin,aabbMax);
- bool docollide=false;
- if(proxy->stage==STAGECOUNT)
- {/* fixed -> dynamic set */
+ b3DbvtProxy* proxy = (b3DbvtProxy*)absproxy;
+ B3_ATTRIBUTE_ALIGNED16(b3DbvtVolume)
+ aabb = b3DbvtVolume::FromMM(aabbMin, aabbMax);
+ bool docollide = false;
+ if (proxy->stage == STAGECOUNT)
+ { /* fixed -> dynamic set */
m_sets[1].remove(proxy->leaf);
- proxy->leaf=m_sets[0].insert(aabb,proxy);
- docollide=true;
+ proxy->leaf = m_sets[0].insert(aabb, proxy);
+ docollide = true;
}
else
- {/* dynamic set */
+ { /* dynamic set */
++m_updates_call;
- /* Teleporting */
- m_sets[0].update(proxy->leaf,aabb);
+ /* Teleporting */
+ m_sets[0].update(proxy->leaf, aabb);
++m_updates_done;
- docollide=true;
+ docollide = true;
}
- b3ListRemove(proxy,m_stageRoots[proxy->stage]);
+ b3ListRemove(proxy, m_stageRoots[proxy->stage]);
proxy->m_aabbMin = aabbMin;
proxy->m_aabbMax = aabbMax;
- proxy->stage = m_stageCurrent;
- b3ListAppend(proxy,m_stageRoots[m_stageCurrent]);
- if(docollide)
+ proxy->stage = m_stageCurrent;
+ b3ListAppend(proxy, m_stageRoots[m_stageCurrent]);
+ if (docollide)
{
- m_needcleanup=true;
- if(!m_deferedcollide)
+ m_needcleanup = true;
+ if (!m_deferedcollide)
{
- b3DbvtTreeCollider collider(this);
- m_sets[1].collideTTpersistentStack(m_sets[1].m_root,proxy->leaf,collider);
- m_sets[0].collideTTpersistentStack(m_sets[0].m_root,proxy->leaf,collider);
+ b3DbvtTreeCollider collider(this);
+ m_sets[1].collideTTpersistentStack(m_sets[1].m_root, proxy->leaf, collider);
+ m_sets[0].collideTTpersistentStack(m_sets[0].m_root, proxy->leaf, collider);
}
- }
+ }
}
//
-void b3DynamicBvhBroadphase::calculateOverlappingPairs(b3Dispatcher* dispatcher)
+void b3DynamicBvhBroadphase::calculateOverlappingPairs(b3Dispatcher* dispatcher)
{
collide(dispatcher);
#if B3_DBVT_BP_PROFILE
- if(0==(m_pid%B3_DBVT_BP_PROFILING_RATE))
- {
- printf("fixed(%u) dynamics(%u) pairs(%u)\r\n",m_sets[1].m_leaves,m_sets[0].m_leaves,m_paircache->getNumOverlappingPairs());
- unsigned int total=m_profiling.m_total;
- if(total<=0) total=1;
- printf("ddcollide: %u%% (%uus)\r\n",(50+m_profiling.m_ddcollide*100)/total,m_profiling.m_ddcollide/B3_DBVT_BP_PROFILING_RATE);
- printf("fdcollide: %u%% (%uus)\r\n",(50+m_profiling.m_fdcollide*100)/total,m_profiling.m_fdcollide/B3_DBVT_BP_PROFILING_RATE);
- printf("cleanup: %u%% (%uus)\r\n",(50+m_profiling.m_cleanup*100)/total,m_profiling.m_cleanup/B3_DBVT_BP_PROFILING_RATE);
- printf("total: %uus\r\n",total/B3_DBVT_BP_PROFILING_RATE);
- const unsigned long sum=m_profiling.m_ddcollide+
- m_profiling.m_fdcollide+
- m_profiling.m_cleanup;
- printf("leaked: %u%% (%uus)\r\n",100-((50+sum*100)/total),(total-sum)/B3_DBVT_BP_PROFILING_RATE);
- printf("job counts: %u%%\r\n",(m_profiling.m_jobcount*100)/((m_sets[0].m_leaves+m_sets[1].m_leaves)*B3_DBVT_BP_PROFILING_RATE));
+ if (0 == (m_pid % B3_DBVT_BP_PROFILING_RATE))
+ {
+ printf("fixed(%u) dynamics(%u) pairs(%u)\r\n", m_sets[1].m_leaves, m_sets[0].m_leaves, m_paircache->getNumOverlappingPairs());
+ unsigned int total = m_profiling.m_total;
+ if (total <= 0) total = 1;
+ printf("ddcollide: %u%% (%uus)\r\n", (50 + m_profiling.m_ddcollide * 100) / total, m_profiling.m_ddcollide / B3_DBVT_BP_PROFILING_RATE);
+ printf("fdcollide: %u%% (%uus)\r\n", (50 + m_profiling.m_fdcollide * 100) / total, m_profiling.m_fdcollide / B3_DBVT_BP_PROFILING_RATE);
+ printf("cleanup: %u%% (%uus)\r\n", (50 + m_profiling.m_cleanup * 100) / total, m_profiling.m_cleanup / B3_DBVT_BP_PROFILING_RATE);
+ printf("total: %uus\r\n", total / B3_DBVT_BP_PROFILING_RATE);
+ const unsigned long sum = m_profiling.m_ddcollide +
+ m_profiling.m_fdcollide +
+ m_profiling.m_cleanup;
+ printf("leaked: %u%% (%uus)\r\n", 100 - ((50 + sum * 100) / total), (total - sum) / B3_DBVT_BP_PROFILING_RATE);
+ printf("job counts: %u%%\r\n", (m_profiling.m_jobcount * 100) / ((m_sets[0].m_leaves + m_sets[1].m_leaves) * B3_DBVT_BP_PROFILING_RATE));
b3Clear(m_profiling);
m_clock.reset();
}
#endif
performDeferredRemoval(dispatcher);
-
}
void b3DynamicBvhBroadphase::performDeferredRemoval(b3Dispatcher* dispatcher)
{
-
if (m_paircache->hasDeferredRemoval())
{
-
- b3BroadphasePairArray& overlappingPairArray = m_paircache->getOverlappingPairArray();
+ b3BroadphasePairArray& overlappingPairArray = m_paircache->getOverlappingPairArray();
//perform a sort, to find duplicates and to sort 'invalid' pairs to the end
overlappingPairArray.quickSort(b3BroadphasePairSortPredicate());
int invalidPair = 0;
-
int i;
- b3BroadphasePair previousPair = b3MakeBroadphasePair(-1,-1);
-
-
-
- for (i=0;i<overlappingPairArray.size();i++)
+ b3BroadphasePair previousPair = b3MakeBroadphasePair(-1, -1);
+
+ for (i = 0; i < overlappingPairArray.size(); i++)
{
-
b3BroadphasePair& pair = overlappingPairArray[i];
bool isDuplicate = (pair == previousPair);
@@ -459,33 +455,34 @@ void b3DynamicBvhBroadphase::performDeferredRemoval(b3Dispatcher* dispatcher)
if (!isDuplicate)
{
//important to perform AABB check that is consistent with the broadphase
- b3DbvtProxy* pa=&m_proxies[pair.x];
- b3DbvtProxy* pb=&m_proxies[pair.y];
- bool hasOverlap = b3Intersect(pa->leaf->volume,pb->leaf->volume);
+ b3DbvtProxy* pa = &m_proxies[pair.x];
+ b3DbvtProxy* pb = &m_proxies[pair.y];
+ bool hasOverlap = b3Intersect(pa->leaf->volume, pb->leaf->volume);
if (hasOverlap)
{
needsRemoval = false;
- } else
+ }
+ else
{
needsRemoval = true;
}
- } else
+ }
+ else
{
//remove duplicate
needsRemoval = true;
//should have no algorithm
}
-
+
if (needsRemoval)
{
- m_paircache->cleanOverlappingPair(pair,dispatcher);
+ m_paircache->cleanOverlappingPair(pair, dispatcher);
pair.x = -1;
pair.y = -1;
invalidPair++;
- }
-
+ }
}
//perform a sort, to sort 'invalid' pairs to the end
@@ -495,7 +492,7 @@ void b3DynamicBvhBroadphase::performDeferredRemoval(b3Dispatcher* dispatcher)
}
//
-void b3DynamicBvhBroadphase::collide(b3Dispatcher* dispatcher)
+void b3DynamicBvhBroadphase::collide(b3Dispatcher* dispatcher)
{
/*printf("---------------------------------------------------------\n");
printf("m_sets[0].m_leaves=%d\n",m_sets[0].m_leaves);
@@ -512,285 +509,293 @@ void b3DynamicBvhBroadphase::collide(b3Dispatcher* dispatcher)
}
*/
-
-
b3SPC(m_profiling.m_total);
- /* optimize */
- m_sets[0].optimizeIncremental(1+(m_sets[0].m_leaves*m_dupdates)/100);
- if(m_fixedleft)
+ /* optimize */
+ m_sets[0].optimizeIncremental(1 + (m_sets[0].m_leaves * m_dupdates) / 100);
+ if (m_fixedleft)
{
- const int count=1+(m_sets[1].m_leaves*m_fupdates)/100;
- m_sets[1].optimizeIncremental(1+(m_sets[1].m_leaves*m_fupdates)/100);
- m_fixedleft=b3Max<int>(0,m_fixedleft-count);
+ const int count = 1 + (m_sets[1].m_leaves * m_fupdates) / 100;
+ m_sets[1].optimizeIncremental(1 + (m_sets[1].m_leaves * m_fupdates) / 100);
+ m_fixedleft = b3Max<int>(0, m_fixedleft - count);
}
- /* dynamic -> fixed set */
- m_stageCurrent=(m_stageCurrent+1)%STAGECOUNT;
- b3DbvtProxy* current=m_stageRoots[m_stageCurrent];
- if(current)
+ /* dynamic -> fixed set */
+ m_stageCurrent = (m_stageCurrent + 1) % STAGECOUNT;
+ b3DbvtProxy* current = m_stageRoots[m_stageCurrent];
+ if (current)
{
- b3DbvtTreeCollider collider(this);
- do {
- b3DbvtProxy* next=current->links[1];
- b3ListRemove(current,m_stageRoots[current->stage]);
- b3ListAppend(current,m_stageRoots[STAGECOUNT]);
+ b3DbvtTreeCollider collider(this);
+ do
+ {
+ b3DbvtProxy* next = current->links[1];
+ b3ListRemove(current, m_stageRoots[current->stage]);
+ b3ListAppend(current, m_stageRoots[STAGECOUNT]);
#if B3_DBVT_BP_ACCURATESLEEPING
- m_paircache->removeOverlappingPairsContainingProxy(current,dispatcher);
- collider.proxy=current;
- b3DynamicBvh::collideTV(m_sets[0].m_root,current->aabb,collider);
- b3DynamicBvh::collideTV(m_sets[1].m_root,current->aabb,collider);
+ m_paircache->removeOverlappingPairsContainingProxy(current, dispatcher);
+ collider.proxy = current;
+ b3DynamicBvh::collideTV(m_sets[0].m_root, current->aabb, collider);
+ b3DynamicBvh::collideTV(m_sets[1].m_root, current->aabb, collider);
#endif
m_sets[0].remove(current->leaf);
- B3_ATTRIBUTE_ALIGNED16(b3DbvtVolume) curAabb=b3DbvtVolume::FromMM(current->m_aabbMin,current->m_aabbMax);
- current->leaf = m_sets[1].insert(curAabb,current);
- current->stage = STAGECOUNT;
- current = next;
- } while(current);
- m_fixedleft=m_sets[1].m_leaves;
- m_needcleanup=true;
+ B3_ATTRIBUTE_ALIGNED16(b3DbvtVolume)
+ curAabb = b3DbvtVolume::FromMM(current->m_aabbMin, current->m_aabbMax);
+ current->leaf = m_sets[1].insert(curAabb, current);
+ current->stage = STAGECOUNT;
+ current = next;
+ } while (current);
+ m_fixedleft = m_sets[1].m_leaves;
+ m_needcleanup = true;
}
- /* collide dynamics */
+ /* collide dynamics */
{
- b3DbvtTreeCollider collider(this);
- if(m_deferedcollide)
+ b3DbvtTreeCollider collider(this);
+ if (m_deferedcollide)
{
b3SPC(m_profiling.m_fdcollide);
- m_sets[0].collideTTpersistentStack(m_sets[0].m_root,m_sets[1].m_root,collider);
+ m_sets[0].collideTTpersistentStack(m_sets[0].m_root, m_sets[1].m_root, collider);
}
- if(m_deferedcollide)
+ if (m_deferedcollide)
{
b3SPC(m_profiling.m_ddcollide);
- m_sets[0].collideTTpersistentStack(m_sets[0].m_root,m_sets[0].m_root,collider);
+ m_sets[0].collideTTpersistentStack(m_sets[0].m_root, m_sets[0].m_root, collider);
}
}
- /* clean up */
- if(m_needcleanup)
+ /* clean up */
+ if (m_needcleanup)
{
b3SPC(m_profiling.m_cleanup);
- b3BroadphasePairArray& pairs=m_paircache->getOverlappingPairArray();
- if(pairs.size()>0)
+ b3BroadphasePairArray& pairs = m_paircache->getOverlappingPairArray();
+ if (pairs.size() > 0)
{
-
- int ni=b3Min(pairs.size(),b3Max<int>(m_newpairs,(pairs.size()*m_cupdates)/100));
- for(int i=0;i<ni;++i)
+ int ni = b3Min(pairs.size(), b3Max<int>(m_newpairs, (pairs.size() * m_cupdates) / 100));
+ for (int i = 0; i < ni; ++i)
{
- b3BroadphasePair& p=pairs[(m_cid+i)%pairs.size()];
- b3DbvtProxy* pa=&m_proxies[p.x];
- b3DbvtProxy* pb=&m_proxies[p.y];
- if(!b3Intersect(pa->leaf->volume,pb->leaf->volume))
+ b3BroadphasePair& p = pairs[(m_cid + i) % pairs.size()];
+ b3DbvtProxy* pa = &m_proxies[p.x];
+ b3DbvtProxy* pb = &m_proxies[p.y];
+ if (!b3Intersect(pa->leaf->volume, pb->leaf->volume))
{
#if B3_DBVT_BP_SORTPAIRS
- if(pa->m_uniqueId>pb->m_uniqueId)
- b3Swap(pa,pb);
+ if (pa->m_uniqueId > pb->m_uniqueId)
+ b3Swap(pa, pb);
#endif
- m_paircache->removeOverlappingPair(pa->getUid(),pb->getUid(),dispatcher);
- --ni;--i;
+ m_paircache->removeOverlappingPair(pa->getUid(), pb->getUid(), dispatcher);
+ --ni;
+ --i;
}
}
- if(pairs.size()>0) m_cid=(m_cid+ni)%pairs.size(); else m_cid=0;
+ if (pairs.size() > 0)
+ m_cid = (m_cid + ni) % pairs.size();
+ else
+ m_cid = 0;
}
}
++m_pid;
- m_newpairs=1;
- m_needcleanup=false;
- if(m_updates_call>0)
- { m_updates_ratio=m_updates_done/(b3Scalar)m_updates_call; }
+ m_newpairs = 1;
+ m_needcleanup = false;
+ if (m_updates_call > 0)
+ {
+ m_updates_ratio = m_updates_done / (b3Scalar)m_updates_call;
+ }
else
- { m_updates_ratio=0; }
- m_updates_done/=2;
- m_updates_call/=2;
+ {
+ m_updates_ratio = 0;
+ }
+ m_updates_done /= 2;
+ m_updates_call /= 2;
}
//
-void b3DynamicBvhBroadphase::optimize()
+void b3DynamicBvhBroadphase::optimize()
{
m_sets[0].optimizeTopDown();
m_sets[1].optimizeTopDown();
}
//
-b3OverlappingPairCache* b3DynamicBvhBroadphase::getOverlappingPairCache()
+b3OverlappingPairCache* b3DynamicBvhBroadphase::getOverlappingPairCache()
{
- return(m_paircache);
+ return (m_paircache);
}
//
-const b3OverlappingPairCache* b3DynamicBvhBroadphase::getOverlappingPairCache() const
+const b3OverlappingPairCache* b3DynamicBvhBroadphase::getOverlappingPairCache() const
{
- return(m_paircache);
+ return (m_paircache);
}
//
-void b3DynamicBvhBroadphase::getBroadphaseAabb(b3Vector3& aabbMin,b3Vector3& aabbMax) const
+void b3DynamicBvhBroadphase::getBroadphaseAabb(b3Vector3& aabbMin, b3Vector3& aabbMax) const
{
+ B3_ATTRIBUTE_ALIGNED16(b3DbvtVolume)
+ bounds;
- B3_ATTRIBUTE_ALIGNED16(b3DbvtVolume) bounds;
-
- if(!m_sets[0].empty())
- if(!m_sets[1].empty()) b3Merge( m_sets[0].m_root->volume,
- m_sets[1].m_root->volume,bounds);
+ if (!m_sets[0].empty())
+ if (!m_sets[1].empty())
+ b3Merge(m_sets[0].m_root->volume,
+ m_sets[1].m_root->volume, bounds);
else
- bounds=m_sets[0].m_root->volume;
- else if(!m_sets[1].empty()) bounds=m_sets[1].m_root->volume;
+ bounds = m_sets[0].m_root->volume;
+ else if (!m_sets[1].empty())
+ bounds = m_sets[1].m_root->volume;
else
- bounds=b3DbvtVolume::FromCR(b3MakeVector3(0,0,0),0);
- aabbMin=bounds.Mins();
- aabbMax=bounds.Maxs();
+ bounds = b3DbvtVolume::FromCR(b3MakeVector3(0, 0, 0), 0);
+ aabbMin = bounds.Mins();
+ aabbMax = bounds.Maxs();
}
void b3DynamicBvhBroadphase::resetPool(b3Dispatcher* dispatcher)
{
-
int totalObjects = m_sets[0].m_leaves + m_sets[1].m_leaves;
if (!totalObjects)
{
//reset internal dynamic tree data structures
m_sets[0].clear();
m_sets[1].clear();
-
- m_deferedcollide = false;
- m_needcleanup = true;
- m_stageCurrent = 0;
- m_fixedleft = 0;
- m_fupdates = 1;
- m_dupdates = 0;
- m_cupdates = 10;
- m_newpairs = 1;
- m_updates_call = 0;
- m_updates_done = 0;
- m_updates_ratio = 0;
-
- m_pid = 0;
- m_cid = 0;
- for(int i=0;i<=STAGECOUNT;++i)
+
+ m_deferedcollide = false;
+ m_needcleanup = true;
+ m_stageCurrent = 0;
+ m_fixedleft = 0;
+ m_fupdates = 1;
+ m_dupdates = 0;
+ m_cupdates = 10;
+ m_newpairs = 1;
+ m_updates_call = 0;
+ m_updates_done = 0;
+ m_updates_ratio = 0;
+
+ m_pid = 0;
+ m_cid = 0;
+ for (int i = 0; i <= STAGECOUNT; ++i)
{
- m_stageRoots[i]=0;
+ m_stageRoots[i] = 0;
}
}
}
//
-void b3DynamicBvhBroadphase::printStats()
-{}
+void b3DynamicBvhBroadphase::printStats()
+{
+}
//
#if B3_DBVT_BP_ENABLE_BENCHMARK
-struct b3BroadphaseBenchmark
+struct b3BroadphaseBenchmark
{
- struct Experiment
+ struct Experiment
{
- const char* name;
- int object_count;
- int update_count;
- int spawn_count;
- int iterations;
- b3Scalar speed;
- b3Scalar amplitude;
+ const char* name;
+ int object_count;
+ int update_count;
+ int spawn_count;
+ int iterations;
+ b3Scalar speed;
+ b3Scalar amplitude;
};
- struct Object
+ struct Object
{
- b3Vector3 center;
- b3Vector3 extents;
- b3BroadphaseProxy* proxy;
- b3Scalar time;
- void update(b3Scalar speed,b3Scalar amplitude,b3BroadphaseInterface* pbi)
+ b3Vector3 center;
+ b3Vector3 extents;
+ b3BroadphaseProxy* proxy;
+ b3Scalar time;
+ void update(b3Scalar speed, b3Scalar amplitude, b3BroadphaseInterface* pbi)
{
- time += speed;
- center[0] = b3Cos(time*(b3Scalar)2.17)*amplitude+
- b3Sin(time)*amplitude/2;
- center[1] = b3Cos(time*(b3Scalar)1.38)*amplitude+
- b3Sin(time)*amplitude;
- center[2] = b3Sin(time*(b3Scalar)0.777)*amplitude;
- pbi->setAabb(proxy,center-extents,center+extents,0);
+ time += speed;
+ center[0] = b3Cos(time * (b3Scalar)2.17) * amplitude +
+ b3Sin(time) * amplitude / 2;
+ center[1] = b3Cos(time * (b3Scalar)1.38) * amplitude +
+ b3Sin(time) * amplitude;
+ center[2] = b3Sin(time * (b3Scalar)0.777) * amplitude;
+ pbi->setAabb(proxy, center - extents, center + extents, 0);
}
};
- static int UnsignedRand(int range=RAND_MAX-1) { return(rand()%(range+1)); }
- static b3Scalar UnitRand() { return(UnsignedRand(16384)/(b3Scalar)16384); }
- static void OutputTime(const char* name,b3Clock& c,unsigned count=0)
+ static int UnsignedRand(int range = RAND_MAX - 1) { return (rand() % (range + 1)); }
+ static b3Scalar UnitRand() { return (UnsignedRand(16384) / (b3Scalar)16384); }
+ static void OutputTime(const char* name, b3Clock& c, unsigned count = 0)
{
- const unsigned long us=c.getTimeMicroseconds();
- const unsigned long ms=(us+500)/1000;
- const b3Scalar sec=us/(b3Scalar)(1000*1000);
- if(count>0)
- printf("%s : %u us (%u ms), %.2f/s\r\n",name,us,ms,count/sec);
+ const unsigned long us = c.getTimeMicroseconds();
+ const unsigned long ms = (us + 500) / 1000;
+ const b3Scalar sec = us / (b3Scalar)(1000 * 1000);
+ if (count > 0)
+ printf("%s : %u us (%u ms), %.2f/s\r\n", name, us, ms, count / sec);
else
- printf("%s : %u us (%u ms)\r\n",name,us,ms);
+ printf("%s : %u us (%u ms)\r\n", name, us, ms);
}
};
-void b3DynamicBvhBroadphase::benchmark(b3BroadphaseInterface* pbi)
+void b3DynamicBvhBroadphase::benchmark(b3BroadphaseInterface* pbi)
{
- static const b3BroadphaseBenchmark::Experiment experiments[]=
- {
- {"1024o.10%",1024,10,0,8192,(b3Scalar)0.005,(b3Scalar)100},
- /*{"4096o.10%",4096,10,0,8192,(b3Scalar)0.005,(b3Scalar)100},
+ static const b3BroadphaseBenchmark::Experiment experiments[] =
+ {
+ {"1024o.10%", 1024, 10, 0, 8192, (b3Scalar)0.005, (b3Scalar)100},
+ /*{"4096o.10%",4096,10,0,8192,(b3Scalar)0.005,(b3Scalar)100},
{"8192o.10%",8192,10,0,8192,(b3Scalar)0.005,(b3Scalar)100},*/
- };
- static const int nexperiments=sizeof(experiments)/sizeof(experiments[0]);
- b3AlignedObjectArray<b3BroadphaseBenchmark::Object*> objects;
- b3Clock wallclock;
- /* Begin */
- for(int iexp=0;iexp<nexperiments;++iexp)
+ };
+ static const int nexperiments = sizeof(experiments) / sizeof(experiments[0]);
+ b3AlignedObjectArray<b3BroadphaseBenchmark::Object*> objects;
+ b3Clock wallclock;
+ /* Begin */
+ for (int iexp = 0; iexp < nexperiments; ++iexp)
{
- const b3BroadphaseBenchmark::Experiment& experiment=experiments[iexp];
- const int object_count=experiment.object_count;
- const int update_count=(object_count*experiment.update_count)/100;
- const int spawn_count=(object_count*experiment.spawn_count)/100;
- const b3Scalar speed=experiment.speed;
- const b3Scalar amplitude=experiment.amplitude;
- printf("Experiment #%u '%s':\r\n",iexp,experiment.name);
- printf("\tObjects: %u\r\n",object_count);
- printf("\tUpdate: %u\r\n",update_count);
- printf("\tSpawn: %u\r\n",spawn_count);
- printf("\tSpeed: %f\r\n",speed);
- printf("\tAmplitude: %f\r\n",amplitude);
+ const b3BroadphaseBenchmark::Experiment& experiment = experiments[iexp];
+ const int object_count = experiment.object_count;
+ const int update_count = (object_count * experiment.update_count) / 100;
+ const int spawn_count = (object_count * experiment.spawn_count) / 100;
+ const b3Scalar speed = experiment.speed;
+ const b3Scalar amplitude = experiment.amplitude;
+ printf("Experiment #%u '%s':\r\n", iexp, experiment.name);
+ printf("\tObjects: %u\r\n", object_count);
+ printf("\tUpdate: %u\r\n", update_count);
+ printf("\tSpawn: %u\r\n", spawn_count);
+ printf("\tSpeed: %f\r\n", speed);
+ printf("\tAmplitude: %f\r\n", amplitude);
srand(180673);
- /* Create objects */
+ /* Create objects */
wallclock.reset();
objects.reserve(object_count);
- for(int i=0;i<object_count;++i)
+ for (int i = 0; i < object_count; ++i)
{
- b3BroadphaseBenchmark::Object* po=new b3BroadphaseBenchmark::Object();
- po->center[0]=b3BroadphaseBenchmark::UnitRand()*50;
- po->center[1]=b3BroadphaseBenchmark::UnitRand()*50;
- po->center[2]=b3BroadphaseBenchmark::UnitRand()*50;
- po->extents[0]=b3BroadphaseBenchmark::UnitRand()*2+2;
- po->extents[1]=b3BroadphaseBenchmark::UnitRand()*2+2;
- po->extents[2]=b3BroadphaseBenchmark::UnitRand()*2+2;
- po->time=b3BroadphaseBenchmark::UnitRand()*2000;
- po->proxy=pbi->createProxy(po->center-po->extents,po->center+po->extents,0,po,1,1,0,0);
+ b3BroadphaseBenchmark::Object* po = new b3BroadphaseBenchmark::Object();
+ po->center[0] = b3BroadphaseBenchmark::UnitRand() * 50;
+ po->center[1] = b3BroadphaseBenchmark::UnitRand() * 50;
+ po->center[2] = b3BroadphaseBenchmark::UnitRand() * 50;
+ po->extents[0] = b3BroadphaseBenchmark::UnitRand() * 2 + 2;
+ po->extents[1] = b3BroadphaseBenchmark::UnitRand() * 2 + 2;
+ po->extents[2] = b3BroadphaseBenchmark::UnitRand() * 2 + 2;
+ po->time = b3BroadphaseBenchmark::UnitRand() * 2000;
+ po->proxy = pbi->createProxy(po->center - po->extents, po->center + po->extents, 0, po, 1, 1, 0, 0);
objects.push_back(po);
}
- b3BroadphaseBenchmark::OutputTime("\tInitialization",wallclock);
- /* First update */
+ b3BroadphaseBenchmark::OutputTime("\tInitialization", wallclock);
+ /* First update */
wallclock.reset();
- for(int i=0;i<objects.size();++i)
+ for (int i = 0; i < objects.size(); ++i)
{
- objects[i]->update(speed,amplitude,pbi);
+ objects[i]->update(speed, amplitude, pbi);
}
- b3BroadphaseBenchmark::OutputTime("\tFirst update",wallclock);
- /* Updates */
+ b3BroadphaseBenchmark::OutputTime("\tFirst update", wallclock);
+ /* Updates */
wallclock.reset();
- for(int i=0;i<experiment.iterations;++i)
+ for (int i = 0; i < experiment.iterations; ++i)
{
- for(int j=0;j<update_count;++j)
- {
- objects[j]->update(speed,amplitude,pbi);
+ for (int j = 0; j < update_count; ++j)
+ {
+ objects[j]->update(speed, amplitude, pbi);
}
pbi->calculateOverlappingPairs(0);
}
- b3BroadphaseBenchmark::OutputTime("\tUpdate",wallclock,experiment.iterations);
- /* Clean up */
+ b3BroadphaseBenchmark::OutputTime("\tUpdate", wallclock, experiment.iterations);
+ /* Clean up */
wallclock.reset();
- for(int i=0;i<objects.size();++i)
+ for (int i = 0; i < objects.size(); ++i)
{
- pbi->destroyProxy(objects[i]->proxy,0);
+ pbi->destroyProxy(objects[i]->proxy, 0);
delete objects[i];
}
objects.resize(0);
- b3BroadphaseBenchmark::OutputTime("\tRelease",wallclock);
+ b3BroadphaseBenchmark::OutputTime("\tRelease", wallclock);
}
-
}
#else
/*void b3DynamicBvhBroadphase::benchmark(b3BroadphaseInterface*)
@@ -799,6 +804,5 @@ void b3DynamicBvhBroadphase::benchmark(b3BroadphaseInterface* pbi)
#endif
#if B3_DBVT_BP_PROFILE
-#undef b3SPC
+#undef b3SPC
#endif
-
diff --git a/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvhBroadphase.h b/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvhBroadphase.h
index 7ac085d90c..c235e40148 100644
--- a/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvhBroadphase.h
+++ b/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3DynamicBvhBroadphase.h
@@ -27,46 +27,43 @@ subject to the following restrictions:
// Compile time config
//
-#define B3_DBVT_BP_PROFILE 0
+#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
+#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
+#define B3_DBVT_BP_PROFILING_RATE 256
#endif
-
-
-
-B3_ATTRIBUTE_ALIGNED16(struct) b3BroadphaseProxy
+B3_ATTRIBUTE_ALIGNED16(struct)
+b3BroadphaseProxy
{
+ B3_DECLARE_ALIGNED_ALLOCATOR();
-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
+ 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;
+ 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.
+ 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;
+ b3Vector3 m_aabbMin;
+ b3Vector3 m_aabbMax;
B3_FORCE_INLINE int getUid() const
{
@@ -74,116 +71,112 @@ B3_DECLARE_ALIGNED_ALLOCATOR();
}
//used for memory pools
- b3BroadphaseProxy() :m_clientObject(0)
+ 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)
+ 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 */
+ /* Fields */
//b3DbvtAabbMm aabb;
- b3DbvtNode* leaf;
- b3DbvtProxy* links[2];
- int stage;
- /* ctor */
+ 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)
+ b3DbvtProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, void* userPtr, int collisionFilterGroup, int collisionFilterMask) : b3BroadphaseProxy(aabbMin, aabbMax, userPtr, collisionFilterGroup, collisionFilterMask)
{
- links[0]=links[1]=0;
+ links[0] = links[1] = 0;
}
};
-typedef b3AlignedObjectArray<b3DbvtProxy*> b3DbvtProxyArray;
+typedef b3AlignedObjectArray<b3DbvtProxy*> 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
+struct b3DynamicBvhBroadphase
{
- /* Config */
- enum {
- DYNAMIC_SET = 0, /* Dynamic set index */
- FIXED_SET = 1, /* Fixed set index */
- STAGECOUNT = 2 /* Number of stages */
+ /* 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<b3DbvtProxy> 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?
+ /* Fields */
+ b3DynamicBvh m_sets[2]; // Dbvt sets
+ b3DbvtProxy* m_stageRoots[STAGECOUNT + 1]; // Stages list
+
+ b3AlignedObjectArray<b3DbvtProxy> 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;
+ 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);
+ /* Methods */
+ b3DynamicBvhBroadphase(int proxyCapacity, b3OverlappingPairCache* paircache = 0);
virtual ~b3DynamicBvhBroadphase();
- void collide(b3Dispatcher* dispatcher);
- void optimize();
-
+ 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);
+ 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();
-
+ 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)
+ void performDeferredRemoval(b3Dispatcher* dispatcher);
+
+ void setVelocityPrediction(b3Scalar prediction)
{
m_prediction = prediction;
}
@@ -192,15 +185,13 @@ struct b3DynamicBvhBroadphase
return m_prediction;
}
- ///this setAabbForceUpdate is similar to setAabb but always forces the aabb update.
+ ///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*/);
+ void setAabbForceUpdate(b3BroadphaseProxy* absproxy, const b3Vector3& aabbMin, const b3Vector3& aabbMax, b3Dispatcher* /*dispatcher*/);
//static void benchmark(b3BroadphaseInterface*);
-
-
};
#endif
diff --git a/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3OverlappingPair.h b/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3OverlappingPair.h
index 39bf27de3e..4ff9ebae81 100644
--- a/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3OverlappingPair.h
+++ b/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3OverlappingPair.h
@@ -23,20 +23,20 @@ subject to the following restrictions:
typedef b3Int4 b3BroadphasePair;
-inline b3Int4 b3MakeBroadphasePair(int xx,int yy)
+inline b3Int4 b3MakeBroadphasePair(int xx, int yy)
{
b3Int4 pair;
if (xx < yy)
- {
- pair.x = xx;
- pair.y = yy;
- }
- else
- {
+ {
+ pair.x = xx;
+ pair.y = yy;
+ }
+ else
+ {
pair.x = yy;
- pair.y = xx;
- }
+ pair.y = xx;
+ }
pair.z = B3_NEW_PAIR_MARKER;
pair.w = B3_NEW_PAIR_MARKER;
return pair;
@@ -51,22 +51,20 @@ inline b3Int4 b3MakeBroadphasePair(int xx,int yy)
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);
- }
+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)
+B3_FORCE_INLINE bool operator==(const b3BroadphasePair& a, const b3BroadphasePair& b)
{
- return (a.x == b.x ) && (a.y == b.y );
+ return (a.x == b.x) && (a.y == b.y);
}
-#endif //B3_OVERLAPPING_PAIR_H
-
+#endif //B3_OVERLAPPING_PAIR_H
diff --git a/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3OverlappingPairCache.cpp b/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3OverlappingPairCache.cpp
index e4bda61624..19773244be 100644
--- a/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3OverlappingPairCache.cpp
+++ b/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3OverlappingPairCache.cpp
@@ -13,8 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
-
#include "b3OverlappingPairCache.h"
//#include "b3Dispatcher.h"
@@ -23,35 +21,26 @@ subject to the following restrictions:
#include <stdio.h>
-int b3g_overlappingPairs = 0;
-int b3g_removePairs =0;
-int b3g_addedPairs =0;
-int b3g_findPairs =0;
-
-
-
+int b3g_overlappingPairs = 0;
+int b3g_removePairs = 0;
+int b3g_addedPairs = 0;
+int b3g_findPairs = 0;
-b3HashedOverlappingPairCache::b3HashedOverlappingPairCache():
- m_overlapFilterCallback(0)
+b3HashedOverlappingPairCache::b3HashedOverlappingPairCache() : m_overlapFilterCallback(0)
//, m_blockedForChanges(false)
{
- int initialAllocatedSize= 2;
+ int initialAllocatedSize = 2;
m_overlappingPairArray.reserve(initialAllocatedSize);
growTables();
}
-
-
-
b3HashedOverlappingPairCache::~b3HashedOverlappingPairCache()
{
}
-
-
-void b3HashedOverlappingPairCache::cleanOverlappingPair(b3BroadphasePair& pair,b3Dispatcher* dispatcher)
+void b3HashedOverlappingPairCache::cleanOverlappingPair(b3BroadphasePair& pair, b3Dispatcher* dispatcher)
{
-/* if (pair.m_algorithm)
+ /* if (pair.m_algorithm)
{
{
pair.m_algorithm->~b3CollisionAlgorithm();
@@ -60,91 +49,74 @@ void b3HashedOverlappingPairCache::cleanOverlappingPair(b3BroadphasePair& pair,b
}
}
*/
-
}
-
-
-
-void b3HashedOverlappingPairCache::cleanProxyFromPairs(int proxy,b3Dispatcher* dispatcher)
+void b3HashedOverlappingPairCache::cleanProxyFromPairs(int proxy, b3Dispatcher* dispatcher)
{
-
- class CleanPairCallback : public b3OverlapCallback
+ class CleanPairCallback : public b3OverlapCallback
{
int m_cleanProxy;
- b3OverlappingPairCache* m_pairCache;
+ b3OverlappingPairCache* m_pairCache;
b3Dispatcher* m_dispatcher;
public:
- CleanPairCallback(int cleanProxy,b3OverlappingPairCache* pairCache,b3Dispatcher* dispatcher)
- :m_cleanProxy(cleanProxy),
- m_pairCache(pairCache),
- m_dispatcher(dispatcher)
+ CleanPairCallback(int cleanProxy, b3OverlappingPairCache* pairCache, b3Dispatcher* dispatcher)
+ : m_cleanProxy(cleanProxy),
+ m_pairCache(pairCache),
+ m_dispatcher(dispatcher)
{
}
- virtual bool processOverlap(b3BroadphasePair& pair)
+ virtual bool processOverlap(b3BroadphasePair& pair)
{
if ((pair.x == m_cleanProxy) ||
(pair.y == m_cleanProxy))
{
- m_pairCache->cleanOverlappingPair(pair,m_dispatcher);
+ m_pairCache->cleanOverlappingPair(pair, m_dispatcher);
}
return false;
}
-
};
- CleanPairCallback cleanPairs(proxy,this,dispatcher);
-
- processAllOverlappingPairs(&cleanPairs,dispatcher);
+ CleanPairCallback cleanPairs(proxy, this, dispatcher);
+ processAllOverlappingPairs(&cleanPairs, dispatcher);
}
-
-
-
-void b3HashedOverlappingPairCache::removeOverlappingPairsContainingProxy(int proxy,b3Dispatcher* dispatcher)
+void b3HashedOverlappingPairCache::removeOverlappingPairsContainingProxy(int proxy, b3Dispatcher* dispatcher)
{
-
- class RemovePairCallback : public b3OverlapCallback
+ class RemovePairCallback : public b3OverlapCallback
{
int m_obsoleteProxy;
public:
RemovePairCallback(int obsoleteProxy)
- :m_obsoleteProxy(obsoleteProxy)
+ : m_obsoleteProxy(obsoleteProxy)
{
}
- virtual bool processOverlap(b3BroadphasePair& pair)
+ virtual bool processOverlap(b3BroadphasePair& pair)
{
return ((pair.x == m_obsoleteProxy) ||
- (pair.y == m_obsoleteProxy));
+ (pair.y == m_obsoleteProxy));
}
-
};
-
RemovePairCallback removeCallback(proxy);
- processAllOverlappingPairs(&removeCallback,dispatcher);
+ processAllOverlappingPairs(&removeCallback, dispatcher);
}
-
-
-
-
b3BroadphasePair* b3HashedOverlappingPairCache::findPair(int proxy0, int proxy1)
{
b3g_findPairs++;
- if(proxy0 >proxy1)
- b3Swap(proxy0,proxy1);
+ if (proxy0 > proxy1)
+ b3Swap(proxy0, proxy1);
int proxyId1 = proxy0;
int proxyId2 = proxy1;
/*if (proxyId1 > proxyId2)
b3Swap(proxyId1, proxyId2);*/
- int hash = static_cast<int>(getHash(static_cast<unsigned int>(proxyId1), static_cast<unsigned int>(proxyId2)) & (m_overlappingPairArray.capacity()-1));
+ int hash = static_cast<int>(getHash(static_cast<unsigned int>(proxyId1), static_cast<unsigned int>(proxyId2)) & (m_overlappingPairArray.capacity() - 1));
if (hash >= m_hashTable.size())
{
@@ -169,9 +141,8 @@ b3BroadphasePair* b3HashedOverlappingPairCache::findPair(int proxy0, int proxy1)
//#include <stdio.h>
-void b3HashedOverlappingPairCache::growTables()
+void b3HashedOverlappingPairCache::growTables()
{
-
int newCapacity = m_overlappingPairArray.capacity();
if (m_hashTable.size() < newCapacity)
@@ -182,10 +153,9 @@ void b3HashedOverlappingPairCache::growTables()
m_hashTable.resize(newCapacity);
m_next.resize(newCapacity);
-
int i;
- for (i= 0; i < newCapacity; ++i)
+ for (i = 0; i < newCapacity; ++i)
{
m_hashTable[i] = B3_NULL_PAIR;
}
@@ -194,35 +164,31 @@ void b3HashedOverlappingPairCache::growTables()
m_next[i] = B3_NULL_PAIR;
}
- for(i=0;i<curHashtableSize;i++)
+ for (i = 0; i < curHashtableSize; i++)
{
-
const b3BroadphasePair& pair = m_overlappingPairArray[i];
int proxyId1 = pair.x;
int proxyId2 = pair.y;
/*if (proxyId1 > proxyId2)
b3Swap(proxyId1, proxyId2);*/
- int hashValue = static_cast<int>(getHash(static_cast<unsigned int>(proxyId1),static_cast<unsigned int>(proxyId2)) & (m_overlappingPairArray.capacity()-1)); // New hash value with new mask
+ int hashValue = static_cast<int>(getHash(static_cast<unsigned int>(proxyId1), static_cast<unsigned int>(proxyId2)) & (m_overlappingPairArray.capacity() - 1)); // New hash value with new mask
m_next[i] = m_hashTable[hashValue];
m_hashTable[hashValue] = i;
}
-
-
}
}
b3BroadphasePair* b3HashedOverlappingPairCache::internalAddPair(int proxy0, int proxy1)
{
- if(proxy0>proxy1)
- b3Swap(proxy0,proxy1);
+ if (proxy0 > proxy1)
+ b3Swap(proxy0, proxy1);
int proxyId1 = proxy0;
int proxyId2 = proxy1;
/*if (proxyId1 > proxyId2)
b3Swap(proxyId1, proxyId2);*/
- int hash = static_cast<int>(getHash(static_cast<unsigned int>(proxyId1),static_cast<unsigned int>(proxyId2)) & (m_overlappingPairArray.capacity()-1)); // New hash value with new mask
-
+ int hash = static_cast<int>(getHash(static_cast<unsigned int>(proxyId1), static_cast<unsigned int>(proxyId2)) & (m_overlappingPairArray.capacity() - 1)); // New hash value with new mask
b3BroadphasePair* pair = internalFindPair(proxy0, proxy1, hash);
if (pair != NULL)
@@ -243,8 +209,8 @@ b3BroadphasePair* b3HashedOverlappingPairCache::internalAddPair(int proxy0, int
pair = &m_overlappingPairArray.expandNonInitializing();
//this is where we add an actual pair, so also call the 'ghost'
-// if (m_ghostPairCallback)
-// m_ghostPairCallback->addOverlappingPair(proxy0,proxy1);
+ // if (m_ghostPairCallback)
+ // m_ghostPairCallback->addOverlappingPair(proxy0,proxy1);
int newCapacity = m_overlappingPairArray.capacity();
@@ -252,16 +218,15 @@ b3BroadphasePair* b3HashedOverlappingPairCache::internalAddPair(int proxy0, int
{
growTables();
//hash with new capacity
- hash = static_cast<int>(getHash(static_cast<unsigned int>(proxyId1),static_cast<unsigned int>(proxyId2)) & (m_overlappingPairArray.capacity()-1));
+ hash = static_cast<int>(getHash(static_cast<unsigned int>(proxyId1), static_cast<unsigned int>(proxyId2)) & (m_overlappingPairArray.capacity() - 1));
}
-
- *pair = b3MakeBroadphasePair(proxy0,proxy1);
-
-// pair->m_pProxy0 = proxy0;
-// pair->m_pProxy1 = proxy1;
+
+ *pair = b3MakeBroadphasePair(proxy0, proxy1);
+
+ // pair->m_pProxy0 = proxy0;
+ // pair->m_pProxy1 = proxy1;
//pair->m_algorithm = 0;
//pair->m_internalTmpValue = 0;
-
m_next[count] = m_hashTable[hash];
m_hashTable[hash] = count;
@@ -269,20 +234,18 @@ b3BroadphasePair* b3HashedOverlappingPairCache::internalAddPair(int proxy0, int
return pair;
}
-
-
-void* b3HashedOverlappingPairCache::removeOverlappingPair(int proxy0, int proxy1,b3Dispatcher* dispatcher)
+void* b3HashedOverlappingPairCache::removeOverlappingPair(int proxy0, int proxy1, b3Dispatcher* dispatcher)
{
b3g_removePairs++;
- if(proxy0>proxy1)
- b3Swap(proxy0,proxy1);
+ if (proxy0 > proxy1)
+ b3Swap(proxy0, proxy1);
int proxyId1 = proxy0;
int proxyId2 = proxy1;
/*if (proxyId1 > proxyId2)
b3Swap(proxyId1, proxyId2);*/
- int hash = static_cast<int>(getHash(static_cast<unsigned int>(proxyId1),static_cast<unsigned int>(proxyId2)) & (m_overlappingPairArray.capacity()-1));
+ int hash = static_cast<int>(getHash(static_cast<unsigned int>(proxyId1), static_cast<unsigned int>(proxyId2)) & (m_overlappingPairArray.capacity() - 1));
b3BroadphasePair* pair = internalFindPair(proxy0, proxy1, hash);
if (pair == NULL)
@@ -290,9 +253,7 @@ void* b3HashedOverlappingPairCache::removeOverlappingPair(int proxy0, int proxy1
return 0;
}
- cleanOverlappingPair(*pair,dispatcher);
-
-
+ cleanOverlappingPair(*pair, dispatcher);
int pairIndex = int(pair - &m_overlappingPairArray[0]);
b3Assert(pairIndex < m_overlappingPairArray.size());
@@ -336,8 +297,8 @@ void* b3HashedOverlappingPairCache::removeOverlappingPair(int proxy0, int proxy1
// Remove the last pair from the hash table.
const b3BroadphasePair* last = &m_overlappingPairArray[lastPairIndex];
- /* missing swap here too, Nat. */
- int lastHash = static_cast<int>(getHash(static_cast<unsigned int>(last->x), static_cast<unsigned int>(last->y)) & (m_overlappingPairArray.capacity()-1));
+ /* missing swap here too, Nat. */
+ int lastHash = static_cast<int>(getHash(static_cast<unsigned int>(last->x), static_cast<unsigned int>(last->y)) & (m_overlappingPairArray.capacity() - 1));
index = m_hashTable[lastHash];
b3Assert(index != B3_NULL_PAIR);
@@ -372,47 +333,42 @@ void* b3HashedOverlappingPairCache::removeOverlappingPair(int proxy0, int proxy1
}
//#include <stdio.h>
-void b3HashedOverlappingPairCache::processAllOverlappingPairs(b3OverlapCallback* callback,b3Dispatcher* dispatcher)
+void b3HashedOverlappingPairCache::processAllOverlappingPairs(b3OverlapCallback* callback, b3Dispatcher* dispatcher)
{
-
int i;
-// printf("m_overlappingPairArray.size()=%d\n",m_overlappingPairArray.size());
- for (i=0;i<m_overlappingPairArray.size();)
+ // printf("m_overlappingPairArray.size()=%d\n",m_overlappingPairArray.size());
+ for (i = 0; i < m_overlappingPairArray.size();)
{
-
b3BroadphasePair* pair = &m_overlappingPairArray[i];
if (callback->processOverlap(*pair))
{
- removeOverlappingPair(pair->x,pair->y,dispatcher);
+ removeOverlappingPair(pair->x, pair->y, dispatcher);
b3g_overlappingPairs--;
- } else
+ }
+ else
{
i++;
}
}
}
-
-
-
-
-void b3HashedOverlappingPairCache::sortOverlappingPairs(b3Dispatcher* dispatcher)
+void b3HashedOverlappingPairCache::sortOverlappingPairs(b3Dispatcher* dispatcher)
{
///need to keep hashmap in sync with pair address, so rebuild all
b3BroadphasePairArray tmpPairs;
int i;
- for (i=0;i<m_overlappingPairArray.size();i++)
+ for (i = 0; i < m_overlappingPairArray.size(); i++)
{
tmpPairs.push_back(m_overlappingPairArray[i]);
}
- for (i=0;i<tmpPairs.size();i++)
+ for (i = 0; i < tmpPairs.size(); i++)
{
- removeOverlappingPair(tmpPairs[i].x,tmpPairs[i].y,dispatcher);
+ removeOverlappingPair(tmpPairs[i].x, tmpPairs[i].y, dispatcher);
}
-
+
for (i = 0; i < m_next.size(); i++)
{
m_next[i] = B3_NULL_PAIR;
@@ -420,33 +376,29 @@ void b3HashedOverlappingPairCache::sortOverlappingPairs(b3Dispatcher* dispatcher
tmpPairs.quickSort(b3BroadphasePairSortPredicate());
- for (i=0;i<tmpPairs.size();i++)
+ for (i = 0; i < tmpPairs.size(); i++)
{
- addOverlappingPair(tmpPairs[i].x ,tmpPairs[i].y);
+ addOverlappingPair(tmpPairs[i].x, tmpPairs[i].y);
}
-
-
}
-
-void* b3SortedOverlappingPairCache::removeOverlappingPair(int proxy0,int proxy1, b3Dispatcher* dispatcher )
+void* b3SortedOverlappingPairCache::removeOverlappingPair(int proxy0, int proxy1, b3Dispatcher* dispatcher)
{
if (!hasDeferredRemoval())
{
- b3BroadphasePair findPair = b3MakeBroadphasePair(proxy0,proxy1);
-
+ b3BroadphasePair findPair = b3MakeBroadphasePair(proxy0, proxy1);
int findIndex = m_overlappingPairArray.findLinearSearch(findPair);
if (findIndex < m_overlappingPairArray.size())
{
b3g_overlappingPairs--;
b3BroadphasePair& pair = m_overlappingPairArray[findIndex];
-
- cleanOverlappingPair(pair,dispatcher);
+
+ cleanOverlappingPair(pair, dispatcher);
//if (m_ghostPairCallback)
// m_ghostPairCallback->removeOverlappingPair(proxy0, proxy1,dispatcher);
-
- m_overlappingPairArray.swap(findIndex,m_overlappingPairArray.capacity()-1);
+
+ m_overlappingPairArray.swap(findIndex, m_overlappingPairArray.capacity() - 1);
m_overlappingPairArray.pop_back();
return 0;
}
@@ -455,100 +407,77 @@ void* b3SortedOverlappingPairCache::removeOverlappingPair(int proxy0,int proxy1,
return 0;
}
-
-
-
-
-
-
-
-b3BroadphasePair* b3SortedOverlappingPairCache::addOverlappingPair(int proxy0,int proxy1)
+b3BroadphasePair* b3SortedOverlappingPairCache::addOverlappingPair(int proxy0, int proxy1)
{
//don't add overlap with own
b3Assert(proxy0 != proxy1);
- if (!needsBroadphaseCollision(proxy0,proxy1))
+ if (!needsBroadphaseCollision(proxy0, proxy1))
return 0;
-
+
b3BroadphasePair* pair = &m_overlappingPairArray.expandNonInitializing();
- *pair = b3MakeBroadphasePair(proxy0,proxy1);
-
-
+ *pair = b3MakeBroadphasePair(proxy0, proxy1);
+
b3g_overlappingPairs++;
b3g_addedPairs++;
-
-// if (m_ghostPairCallback)
-// m_ghostPairCallback->addOverlappingPair(proxy0, proxy1);
+
+ // if (m_ghostPairCallback)
+ // m_ghostPairCallback->addOverlappingPair(proxy0, proxy1);
return pair;
-
}
///this findPair becomes really slow. Either sort the list to speedup the query, or
///use a different solution. It is mainly used for Removing overlapping pairs. Removal could be delayed.
///we could keep a linked list in each proxy, and store pair in one of the proxies (with lowest memory address)
///Also we can use a 2D bitmap, which can be useful for a future GPU implementation
- b3BroadphasePair* b3SortedOverlappingPairCache::findPair(int proxy0,int proxy1)
+b3BroadphasePair* b3SortedOverlappingPairCache::findPair(int proxy0, int proxy1)
{
- if (!needsBroadphaseCollision(proxy0,proxy1))
+ if (!needsBroadphaseCollision(proxy0, proxy1))
return 0;
- b3BroadphasePair tmpPair = b3MakeBroadphasePair(proxy0,proxy1);
+ b3BroadphasePair tmpPair = b3MakeBroadphasePair(proxy0, proxy1);
int findIndex = m_overlappingPairArray.findLinearSearch(tmpPair);
if (findIndex < m_overlappingPairArray.size())
{
//b3Assert(it != m_overlappingPairSet.end());
- b3BroadphasePair* pair = &m_overlappingPairArray[findIndex];
+ b3BroadphasePair* pair = &m_overlappingPairArray[findIndex];
return pair;
}
return 0;
}
-
-
-
-
-
-
-
-
-
//#include <stdio.h>
-void b3SortedOverlappingPairCache::processAllOverlappingPairs(b3OverlapCallback* callback,b3Dispatcher* dispatcher)
+void b3SortedOverlappingPairCache::processAllOverlappingPairs(b3OverlapCallback* callback, b3Dispatcher* dispatcher)
{
-
int i;
- for (i=0;i<m_overlappingPairArray.size();)
+ for (i = 0; i < m_overlappingPairArray.size();)
{
-
b3BroadphasePair* pair = &m_overlappingPairArray[i];
if (callback->processOverlap(*pair))
{
- cleanOverlappingPair(*pair,dispatcher);
+ cleanOverlappingPair(*pair, dispatcher);
pair->x = -1;
pair->y = -1;
- m_overlappingPairArray.swap(i,m_overlappingPairArray.size()-1);
+ m_overlappingPairArray.swap(i, m_overlappingPairArray.size() - 1);
m_overlappingPairArray.pop_back();
b3g_overlappingPairs--;
- } else
+ }
+ else
{
i++;
}
}
}
-
-
-
-b3SortedOverlappingPairCache::b3SortedOverlappingPairCache():
- m_blockedForChanges(false),
- m_hasDeferredRemoval(true),
- m_overlapFilterCallback(0)
+b3SortedOverlappingPairCache::b3SortedOverlappingPairCache() : m_blockedForChanges(false),
+ m_hasDeferredRemoval(true),
+ m_overlapFilterCallback(0)
{
- int initialAllocatedSize= 2;
+ int initialAllocatedSize = 2;
m_overlappingPairArray.reserve(initialAllocatedSize);
}
@@ -556,9 +485,9 @@ b3SortedOverlappingPairCache::~b3SortedOverlappingPairCache()
{
}
-void b3SortedOverlappingPairCache::cleanOverlappingPair(b3BroadphasePair& pair,b3Dispatcher* dispatcher)
+void b3SortedOverlappingPairCache::cleanOverlappingPair(b3BroadphasePair& pair, b3Dispatcher* dispatcher)
{
-/* if (pair.m_algorithm)
+ /* if (pair.m_algorithm)
{
{
pair.m_algorithm->~b3CollisionAlgorithm();
@@ -570,69 +499,61 @@ void b3SortedOverlappingPairCache::cleanOverlappingPair(b3BroadphasePair& pair,b
*/
}
-
-void b3SortedOverlappingPairCache::cleanProxyFromPairs(int proxy,b3Dispatcher* dispatcher)
+void b3SortedOverlappingPairCache::cleanProxyFromPairs(int proxy, b3Dispatcher* dispatcher)
{
-
- class CleanPairCallback : public b3OverlapCallback
+ class CleanPairCallback : public b3OverlapCallback
{
int m_cleanProxy;
- b3OverlappingPairCache* m_pairCache;
+ b3OverlappingPairCache* m_pairCache;
b3Dispatcher* m_dispatcher;
public:
- CleanPairCallback(int cleanProxy,b3OverlappingPairCache* pairCache,b3Dispatcher* dispatcher)
- :m_cleanProxy(cleanProxy),
- m_pairCache(pairCache),
- m_dispatcher(dispatcher)
+ CleanPairCallback(int cleanProxy, b3OverlappingPairCache* pairCache, b3Dispatcher* dispatcher)
+ : m_cleanProxy(cleanProxy),
+ m_pairCache(pairCache),
+ m_dispatcher(dispatcher)
{
}
- virtual bool processOverlap(b3BroadphasePair& pair)
+ virtual bool processOverlap(b3BroadphasePair& pair)
{
if ((pair.x == m_cleanProxy) ||
(pair.y == m_cleanProxy))
{
- m_pairCache->cleanOverlappingPair(pair,m_dispatcher);
+ m_pairCache->cleanOverlappingPair(pair, m_dispatcher);
}
return false;
}
-
};
- CleanPairCallback cleanPairs(proxy,this,dispatcher);
-
- processAllOverlappingPairs(&cleanPairs,dispatcher);
+ CleanPairCallback cleanPairs(proxy, this, dispatcher);
+ processAllOverlappingPairs(&cleanPairs, dispatcher);
}
-
-void b3SortedOverlappingPairCache::removeOverlappingPairsContainingProxy(int proxy,b3Dispatcher* dispatcher)
+void b3SortedOverlappingPairCache::removeOverlappingPairsContainingProxy(int proxy, b3Dispatcher* dispatcher)
{
-
- class RemovePairCallback : public b3OverlapCallback
+ class RemovePairCallback : public b3OverlapCallback
{
int m_obsoleteProxy;
public:
RemovePairCallback(int obsoleteProxy)
- :m_obsoleteProxy(obsoleteProxy)
+ : m_obsoleteProxy(obsoleteProxy)
{
}
- virtual bool processOverlap(b3BroadphasePair& pair)
+ virtual bool processOverlap(b3BroadphasePair& pair)
{
return ((pair.x == m_obsoleteProxy) ||
- (pair.y == m_obsoleteProxy));
+ (pair.y == m_obsoleteProxy));
}
-
};
RemovePairCallback removeCallback(proxy);
- processAllOverlappingPairs(&removeCallback,dispatcher);
+ processAllOverlappingPairs(&removeCallback, dispatcher);
}
-void b3SortedOverlappingPairCache::sortOverlappingPairs(b3Dispatcher* dispatcher)
+void b3SortedOverlappingPairCache::sortOverlappingPairs(b3Dispatcher* dispatcher)
{
//should already be sorted
}
-
diff --git a/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3OverlappingPairCache.h b/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3OverlappingPairCache.h
index f67eb676f1..f1de1d94eb 100644
--- a/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3OverlappingPairCache.h
+++ b/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/b3OverlappingPairCache.h
@@ -22,152 +22,136 @@ subject to the following restrictions:
class b3Dispatcher;
#include "b3OverlappingPair.h"
+typedef b3AlignedObjectArray<b3BroadphasePair> b3BroadphasePairArray;
-
-typedef b3AlignedObjectArray<b3BroadphasePair> b3BroadphasePairArray;
-
-struct b3OverlapCallback
+struct b3OverlapCallback
{
virtual ~b3OverlapCallback()
- {}
+ {
+ }
//return true for deletion of the pair
- virtual bool processOverlap(b3BroadphasePair& pair) = 0;
-
+ 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;
+ 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;
+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
+class b3OverlappingPairCache
{
public:
- virtual ~b3OverlappingPairCache() {} // this is needed so we can get to the derived class destructor
+ 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 b3BroadphasePair* getOverlappingPairArrayPtr() = 0;
- virtual b3BroadphasePairArray& getOverlappingPairArray() = 0;
+ virtual const b3BroadphasePair* getOverlappingPairArrayPtr() const = 0;
- virtual void cleanOverlappingPair(b3BroadphasePair& pair,b3Dispatcher* dispatcher) = 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 cleanProxyFromPairs(int proxy, b3Dispatcher* dispatcher) = 0;
- virtual void setOverlapFilterCallback(b3OverlapFilterCallback* callback) = 0;
+ virtual void setOverlapFilterCallback(b3OverlapFilterCallback* callback) = 0;
- virtual void processAllOverlappingPairs(b3OverlapCallback*,b3Dispatcher* dispatcher) = 0;
+ virtual void processAllOverlappingPairs(b3OverlapCallback*, b3Dispatcher* dispatcher) = 0;
virtual b3BroadphasePair* findPair(int proxy0, int proxy1) = 0;
- virtual bool hasDeferredRemoval() = 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;
-
+ 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;
+ b3BroadphasePairArray m_overlappingPairArray;
b3OverlapFilterCallback* m_overlapFilterCallback;
-// bool m_blockedForChanges;
-
+ // bool m_blockedForChanges;
public:
b3HashedOverlappingPairCache();
virtual ~b3HashedOverlappingPairCache();
-
- virtual void removeOverlappingPairsContainingProxy(int proxy,b3Dispatcher* dispatcher);
+ 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
+ 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);
+ return m_overlapFilterCallback->needBroadphaseCollision(proxy0, proxy1);
- bool collides = true;//(proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0;
+ 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)
+ virtual b3BroadphasePair* addOverlappingPair(int proxy0, int proxy1)
{
b3g_addedPairs++;
- if (!needsBroadphaseCollision(proxy0,proxy1))
+ if (!needsBroadphaseCollision(proxy0, proxy1))
return 0;
- return internalAddPair(proxy0,proxy1);
+ return internalAddPair(proxy0, proxy1);
}
-
-
- void cleanProxyFromPairs(int proxy,b3Dispatcher* dispatcher);
+ void cleanProxyFromPairs(int proxy, b3Dispatcher* dispatcher);
-
- virtual void processAllOverlappingPairs(b3OverlapCallback*,b3Dispatcher* dispatcher);
+ virtual void processAllOverlappingPairs(b3OverlapCallback*, b3Dispatcher* dispatcher);
- virtual b3BroadphasePair* getOverlappingPairArrayPtr()
+ virtual b3BroadphasePair* getOverlappingPairArrayPtr()
{
return &m_overlappingPairArray[0];
}
- const b3BroadphasePair* getOverlappingPairArrayPtr() const
+ const b3BroadphasePair* getOverlappingPairArrayPtr() const
{
return &m_overlappingPairArray[0];
}
- b3BroadphasePairArray& getOverlappingPairArray()
+ b3BroadphasePairArray& getOverlappingPairArray()
{
return m_overlappingPairArray;
}
- const b3BroadphasePairArray& getOverlappingPairArray() const
+ const b3BroadphasePairArray& getOverlappingPairArray() const
{
return m_overlappingPairArray;
}
- void cleanOverlappingPair(b3BroadphasePair& pair,b3Dispatcher* dispatcher);
-
-
+ void cleanOverlappingPair(b3BroadphasePair& pair, b3Dispatcher* dispatcher);
b3BroadphasePair* findPair(int proxy0, int proxy1);
int GetCount() const { return m_overlappingPairArray.size(); }
-// b3BroadphasePair* GetPairs() { return m_pairs; }
+ // b3BroadphasePair* GetPairs() { return m_pairs; }
b3OverlapFilterCallback* getOverlapFilterCallback()
{
@@ -179,19 +163,19 @@ public:
m_overlapFilterCallback = callback;
}
- int getNumOverlappingPairs() const
+ int getNumOverlappingPairs() const
{
return m_overlappingPairArray.size();
}
+
private:
-
- b3BroadphasePair* internalAddPair(int proxy0,int proxy1);
+ b3BroadphasePair* internalAddPair(int proxy0, int proxy1);
- void growTables();
+ void growTables();
B3_FORCE_INLINE bool equalsPair(const b3BroadphasePair& pair, int proxyId1, int proxyId2)
- {
- return pair.x == proxyId1 && pair.y == proxyId2;
+ {
+ return pair.x == proxyId1 && pair.y == proxyId2;
}
/*
@@ -210,43 +194,37 @@ private:
}
*/
-
-
- B3_FORCE_INLINE unsigned int getHash(unsigned int proxyId1, unsigned int proxyId2)
+ B3_FORCE_INLINE unsigned int getHash(unsigned int proxyId1, unsigned int proxyId2)
{
- int key = static_cast<int>(((unsigned int)proxyId1) | (((unsigned int)proxyId2) <<16));
+ int key = static_cast<int>(((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 >> 10);
+ key += (key << 3);
+ key ^= (key >> 6);
key += ~(key << 11);
- key ^= (key >> 16);
+ key ^= (key >> 16);
return static_cast<unsigned int>(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 0 // wrong, 'equalsPair' use unsorted uids, copy-past devil striked again. Nat.
if (proxyId1 > proxyId2)
b3Swap(proxyId1, proxyId2);
- #endif
+#endif
int index = m_hashTable[hash];
-
- while( index != B3_NULL_PAIR && equalsPair(m_overlappingPairArray[index], proxyId1, proxyId2) == false)
+
+ while (index != B3_NULL_PAIR && equalsPair(m_overlappingPairArray[index], proxyId1, proxyId2) == false)
{
index = m_next[index];
}
- if ( index == B3_NULL_PAIR )
+ if (index == B3_NULL_PAIR)
{
return NULL;
}
@@ -256,161 +234,142 @@ private:
return &m_overlappingPairArray[index];
}
- virtual bool hasDeferredRemoval()
+ virtual bool hasDeferredRemoval()
{
return false;
}
-/* virtual void setInternalGhostPairCallback(b3OverlappingPairCallback* ghostPairCallback)
+ /* virtual void setInternalGhostPairCallback(b3OverlappingPairCallback* ghostPairCallback)
{
m_ghostPairCallback = ghostPairCallback;
}
*/
- virtual void sortOverlappingPairs(b3Dispatcher* dispatcher);
-
+ virtual void sortOverlappingPairs(b3Dispatcher* dispatcher);
protected:
-
- b3AlignedObjectArray<int> m_hashTable;
- b3AlignedObjectArray<int> m_next;
-// b3OverlappingPairCallback* m_ghostPairCallback;
-
+ b3AlignedObjectArray<int> m_hashTable;
+ b3AlignedObjectArray<int> m_next;
+ // b3OverlappingPairCallback* m_ghostPairCallback;
};
-
-
-
///b3SortedOverlappingPairCache maintains the objects with overlapping AABB
///Typically managed by the Broadphase, Axis3Sweep or b3SimpleBroadphase
-class b3SortedOverlappingPairCache : public b3OverlappingPairCache
+class b3SortedOverlappingPairCache : public b3OverlappingPairCache
{
- protected:
- //avoid brute-force finding all the time
- b3BroadphasePairArray m_overlappingPairArray;
+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;
+ //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;
+ ///by default, do the removal during the pair traversal
+ bool m_hasDeferredRemoval;
-// b3OverlappingPairCallback* m_ghostPairCallback;
+ //if set, use the callback instead of the built in filter in needBroadphaseCollision
+ b3OverlapFilterCallback* m_overlapFilterCallback;
- public:
-
- b3SortedOverlappingPairCache();
- virtual ~b3SortedOverlappingPairCache();
+ // b3OverlappingPairCallback* m_ghostPairCallback;
- virtual void processAllOverlappingPairs(b3OverlapCallback*,b3Dispatcher* dispatcher);
+public:
+ b3SortedOverlappingPairCache();
+ virtual ~b3SortedOverlappingPairCache();
- void* removeOverlappingPair(int proxy0,int proxy1,b3Dispatcher* dispatcher);
+ virtual void processAllOverlappingPairs(b3OverlapCallback*, b3Dispatcher* dispatcher);
- void cleanOverlappingPair(b3BroadphasePair& pair,b3Dispatcher* dispatcher);
-
- b3BroadphasePair* addOverlappingPair(int proxy0,int proxy1);
+ void* removeOverlappingPair(int proxy0, int proxy1, b3Dispatcher* dispatcher);
- b3BroadphasePair* findPair(int proxy0,int proxy1);
-
-
- void cleanProxyFromPairs(int proxy,b3Dispatcher* dispatcher);
+ void cleanOverlappingPair(b3BroadphasePair& pair, b3Dispatcher* dispatcher);
- virtual void removeOverlappingPairsContainingProxy(int proxy,b3Dispatcher* dispatcher);
+ b3BroadphasePair* addOverlappingPair(int proxy0, int proxy1);
+ b3BroadphasePair* findPair(int proxy0, int proxy1);
- inline bool needsBroadphaseCollision(int proxy0,int proxy1) const
- {
- if (m_overlapFilterCallback)
- return m_overlapFilterCallback->needBroadphaseCollision(proxy0,proxy1);
+ void cleanProxyFromPairs(int proxy, b3Dispatcher* dispatcher);
- 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;
- }
+ virtual void removeOverlappingPairsContainingProxy(int proxy, b3Dispatcher* dispatcher);
- const b3BroadphasePairArray& getOverlappingPairArray() const
- {
- return m_overlappingPairArray;
- }
+ 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;
+ }
- b3BroadphasePair* getOverlappingPairArrayPtr()
- {
- return &m_overlappingPairArray[0];
- }
+ b3BroadphasePairArray& getOverlappingPairArray()
+ {
+ return m_overlappingPairArray;
+ }
- const b3BroadphasePair* getOverlappingPairArrayPtr() const
- {
- return &m_overlappingPairArray[0];
- }
+ const b3BroadphasePairArray& getOverlappingPairArray() const
+ {
+ return m_overlappingPairArray;
+ }
- int getNumOverlappingPairs() const
- {
- return m_overlappingPairArray.size();
- }
-
- b3OverlapFilterCallback* getOverlapFilterCallback()
- {
- return m_overlapFilterCallback;
- }
+ b3BroadphasePair* getOverlappingPairArrayPtr()
+ {
+ return &m_overlappingPairArray[0];
+ }
- void setOverlapFilterCallback(b3OverlapFilterCallback* callback)
- {
- m_overlapFilterCallback = callback;
- }
+ const b3BroadphasePair* getOverlappingPairArrayPtr() const
+ {
+ return &m_overlappingPairArray[0];
+ }
- virtual bool hasDeferredRemoval()
- {
- return m_hasDeferredRemoval;
- }
+ int getNumOverlappingPairs() const
+ {
+ return m_overlappingPairArray.size();
+ }
+
+ b3OverlapFilterCallback* getOverlapFilterCallback()
+ {
+ return m_overlapFilterCallback;
+ }
-/* virtual void setInternalGhostPairCallback(b3OverlappingPairCallback* ghostPairCallback)
+ 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);
-
-
+ 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;
+ b3BroadphasePairArray m_overlappingPairArray;
public:
-
- virtual b3BroadphasePair* getOverlappingPairArrayPtr()
+ virtual b3BroadphasePair* getOverlappingPairArrayPtr()
{
return &m_overlappingPairArray[0];
}
- const b3BroadphasePair* getOverlappingPairArrayPtr() const
+ const b3BroadphasePair* getOverlappingPairArrayPtr() const
{
return &m_overlappingPairArray[0];
}
- b3BroadphasePairArray& getOverlappingPairArray()
+ b3BroadphasePairArray& getOverlappingPairArray()
{
return m_overlappingPairArray;
}
-
- virtual void cleanOverlappingPair(b3BroadphasePair& /*pair*/,b3Dispatcher* /*dispatcher*/)
- {
+ virtual void cleanOverlappingPair(b3BroadphasePair& /*pair*/, b3Dispatcher* /*dispatcher*/)
+ {
}
virtual int getNumOverlappingPairs() const
@@ -418,16 +377,15 @@ public:
return 0;
}
- virtual void cleanProxyFromPairs(int /*proxy*/,b3Dispatcher* /*dispatcher*/)
+ virtual void cleanProxyFromPairs(int /*proxy*/, b3Dispatcher* /*dispatcher*/)
{
-
}
- virtual void setOverlapFilterCallback(b3OverlapFilterCallback* /*callback*/)
+ virtual void setOverlapFilterCallback(b3OverlapFilterCallback* /*callback*/)
{
}
- virtual void processAllOverlappingPairs(b3OverlapCallback*,b3Dispatcher* /*dispatcher*/)
+ virtual void processAllOverlappingPairs(b3OverlapCallback*, b3Dispatcher* /*dispatcher*/)
{
}
@@ -436,39 +394,34 @@ public:
return 0;
}
- virtual bool hasDeferredRemoval()
+ virtual bool hasDeferredRemoval()
{
return true;
}
-// virtual void setInternalGhostPairCallback(b3OverlappingPairCallback* /* ghostPairCallback */)
-// {
-//
-// }
+ // virtual void setInternalGhostPairCallback(b3OverlappingPairCallback* /* ghostPairCallback */)
+ // {
+ //
+ // }
- virtual b3BroadphasePair* addOverlappingPair(int /*proxy0*/,int /*proxy1*/)
+ virtual b3BroadphasePair* addOverlappingPair(int /*proxy0*/, int /*proxy1*/)
{
return 0;
}
- virtual void* removeOverlappingPair(int /*proxy0*/,int /*proxy1*/,b3Dispatcher* /*dispatcher*/)
+ virtual void* removeOverlappingPair(int /*proxy0*/, int /*proxy1*/, b3Dispatcher* /*dispatcher*/)
{
return 0;
}
- virtual void removeOverlappingPairsContainingProxy(int /*proxy0*/,b3Dispatcher* /*dispatcher*/)
+ virtual void removeOverlappingPairsContainingProxy(int /*proxy0*/, b3Dispatcher* /*dispatcher*/)
{
}
-
- virtual void sortOverlappingPairs(b3Dispatcher* dispatcher)
+
+ virtual void sortOverlappingPairs(b3Dispatcher* dispatcher)
{
- (void) dispatcher;
+ (void)dispatcher;
}
-
-
};
-
-#endif //B3_OVERLAPPING_PAIR_CACHE_H
-
-
+#endif //B3_OVERLAPPING_PAIR_CACHE_H
diff --git a/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/shared/b3Aabb.h b/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/shared/b3Aabb.h
index 7f9bf990bf..343a2c0e21 100644
--- a/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/shared/b3Aabb.h
+++ b/thirdparty/bullet/Bullet3Collision/BroadPhaseCollision/shared/b3Aabb.h
@@ -2,7 +2,6 @@
#ifndef B3_AABB_H
#define B3_AABB_H
-
#include "Bullet3Common/shared/b3Float4.h"
#include "Bullet3Common/shared/b3Mat3x3.h"
@@ -10,44 +9,42 @@ typedef struct b3Aabb b3Aabb_t;
struct b3Aabb
{
- union
- {
+ union {
float m_min[4];
b3Float4 m_minVec;
int m_minIndices[4];
};
- union
- {
- float m_max[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)
+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;
+ 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)
+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;
@@ -56,4 +53,4 @@ inline bool b3TestAabbAgainstAabb(b3Float4ConstArg aabbMin1,b3Float4ConstArg aab
return overlap;
}
-#endif //B3_AABB_H
+#endif //B3_AABB_H
diff --git a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3Config.h b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3Config.h
index 65d4a21613..518da89c54 100644
--- a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3Config.h
+++ b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3Config.h
@@ -1,41 +1,39 @@
#ifndef B3_CONFIG_H
#define B3_CONFIG_H
-struct b3Config
+struct b3Config
{
- int m_maxConvexBodies;
- int m_maxConvexShapes;
- int m_maxBroadphasePairs;
+ 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_maxConvexVertices;
int m_maxConvexIndices;
int m_maxConvexUniqueEdges;
-
- int m_maxCompoundChildShapes;
-
+
+ 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_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_maxBroadphasePairs = 16 * m_maxConvexBodies;
m_maxContactCapacity = m_maxBroadphasePairs;
- m_compoundPairCapacity = 1024*1024;
+ m_compoundPairCapacity = 1024 * 1024;
}
};
-
-#endif//B3_CONFIG_H
-
+#endif //B3_CONFIG_H
diff --git a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3Contact4.h b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3Contact4.h
index fb25165673..c2cd3c729b 100644
--- a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3Contact4.h
+++ b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3Contact4.h
@@ -19,28 +19,37 @@ subject to the following restrictions:
#include "Bullet3Common/b3Vector3.h"
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3Contact4Data.h"
-B3_ATTRIBUTE_ALIGNED16(struct) b3Contact4 : public b3Contact4Data
+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;}
+ 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 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; }
+ 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); }
+ bool isInvalid() const { return (getBodyA() == 0 || getBodyB() == 0); }
};
-#endif //B3_CONTACT4_H
+#endif //B3_CONTACT4_H
diff --git a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3ConvexUtility.cpp b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3ConvexUtility.cpp
index 55706fa631..a5dab74a34 100644
--- a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3ConvexUtility.cpp
+++ b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3ConvexUtility.cpp
@@ -13,52 +13,42 @@ subject to the following restrictions:
*/
//Originally written by Erwin Coumans
-
#include "b3ConvexUtility.h"
#include "Bullet3Geometry/b3ConvexHullComputer.h"
#include "Bullet3Geometry/b3GrahamScan2dConvexHull.h"
#include "Bullet3Common/b3Quaternion.h"
#include "Bullet3Common/b3HashMap.h"
-
-
-
-
b3ConvexUtility::~b3ConvexUtility()
{
}
-bool b3ConvexUtility::initializePolyhedralFeatures(const b3Vector3* orgVertices, int numPoints, bool mergeCoplanarTriangles)
+bool b3ConvexUtility::initializePolyhedralFeatures(const b3Vector3* orgVertices, int numPoints, bool mergeCoplanarTriangles)
{
-
-
-
b3ConvexHullComputer conv;
- conv.compute(&orgVertices[0].getX(), sizeof(b3Vector3),numPoints,0.f,0.f);
+ conv.compute(&orgVertices[0].getX(), sizeof(b3Vector3), numPoints, 0.f, 0.f);
b3AlignedObjectArray<b3Vector3> faceNormals;
int numFaces = conv.faces.size();
faceNormals.resize(numFaces);
b3ConvexHullComputer* convexUtil = &conv;
-
- b3AlignedObjectArray<b3MyFace> tmpFaces;
+ b3AlignedObjectArray<b3MyFace> tmpFaces;
tmpFaces.resize(numFaces);
int numVertices = convexUtil->vertices.size();
m_vertices.resize(numVertices);
- for (int p=0;p<numVertices;p++)
+ for (int p = 0; p < numVertices; p++)
{
m_vertices[p] = convexUtil->vertices[p];
}
-
- for (int i=0;i<numFaces;i++)
+ for (int i = 0; i < numFaces; i++)
{
int face = convexUtil->faces[i];
//printf("face=%d\n",face);
- const b3ConvexHullComputer::Edge* firstEdge = &convexUtil->edges[face];
- const b3ConvexHullComputer::Edge* edge = firstEdge;
+ const b3ConvexHullComputer::Edge* firstEdge = &convexUtil->edges[face];
+ const b3ConvexHullComputer::Edge* edge = firstEdge;
b3Vector3 edges[3];
int numEdges = 0;
@@ -66,25 +56,23 @@ bool b3ConvexUtility::initializePolyhedralFeatures(const b3Vector3* orgVertices,
do
{
-
int src = edge->getSourceVertex();
tmpFaces[i].m_indices.push_back(src);
int targ = edge->getTargetVertex();
b3Vector3 wa = convexUtil->vertices[src];
b3Vector3 wb = convexUtil->vertices[targ];
- b3Vector3 newEdge = wb-wa;
+ b3Vector3 newEdge = wb - wa;
newEdge.normalize();
- if (numEdges<2)
+ if (numEdges < 2)
edges[numEdges++] = newEdge;
edge = edge->getNextEdgeOfFace();
- } while (edge!=firstEdge);
+ } while (edge != firstEdge);
b3Scalar planeEq = 1e30f;
-
- if (numEdges==2)
+ if (numEdges == 2)
{
faceNormals[i] = edges[0].cross(edges[1]);
faceNormals[i].normalize();
@@ -92,20 +80,19 @@ bool b3ConvexUtility::initializePolyhedralFeatures(const b3Vector3* orgVertices,
tmpFaces[i].m_plane[1] = faceNormals[i].getY();
tmpFaces[i].m_plane[2] = faceNormals[i].getZ();
tmpFaces[i].m_plane[3] = planeEq;
-
}
else
{
- b3Assert(0);//degenerate?
+ b3Assert(0); //degenerate?
faceNormals[i].setZero();
}
- for (int v=0;v<tmpFaces[i].m_indices.size();v++)
+ for (int v = 0; v < tmpFaces[i].m_indices.size(); v++)
{
b3Scalar eq = m_vertices[tmpFaces[i].m_indices[v]].dot(faceNormals[i]);
- if (planeEq>eq)
+ if (planeEq > eq)
{
- planeEq=eq;
+ planeEq = eq;
}
}
tmpFaces[i].m_plane[3] = -planeEq;
@@ -113,89 +100,86 @@ bool b3ConvexUtility::initializePolyhedralFeatures(const b3Vector3* orgVertices,
//merge coplanar faces and copy them to m_polyhedron
- b3Scalar faceWeldThreshold= 0.999f;
+ b3Scalar faceWeldThreshold = 0.999f;
b3AlignedObjectArray<int> todoFaces;
- for (int i=0;i<tmpFaces.size();i++)
+ for (int i = 0; i < tmpFaces.size(); i++)
todoFaces.push_back(i);
while (todoFaces.size())
{
b3AlignedObjectArray<int> coplanarFaceGroup;
- int refFace = todoFaces[todoFaces.size()-1];
+ int refFace = todoFaces[todoFaces.size() - 1];
coplanarFaceGroup.push_back(refFace);
b3MyFace& faceA = tmpFaces[refFace];
todoFaces.pop_back();
- b3Vector3 faceNormalA = b3MakeVector3(faceA.m_plane[0],faceA.m_plane[1],faceA.m_plane[2]);
- for (int j=todoFaces.size()-1;j>=0;j--)
+ b3Vector3 faceNormalA = b3MakeVector3(faceA.m_plane[0], faceA.m_plane[1], faceA.m_plane[2]);
+ for (int j = todoFaces.size() - 1; j >= 0; j--)
{
int i = todoFaces[j];
b3MyFace& faceB = tmpFaces[i];
- b3Vector3 faceNormalB = b3MakeVector3(faceB.m_plane[0],faceB.m_plane[1],faceB.m_plane[2]);
- if (faceNormalA.dot(faceNormalB)>faceWeldThreshold)
+ b3Vector3 faceNormalB = b3MakeVector3(faceB.m_plane[0], faceB.m_plane[1], faceB.m_plane[2]);
+ if (faceNormalA.dot(faceNormalB) > faceWeldThreshold)
{
coplanarFaceGroup.push_back(i);
todoFaces.remove(i);
}
}
-
bool did_merge = false;
- if (coplanarFaceGroup.size()>1)
+ if (coplanarFaceGroup.size() > 1)
{
//do the merge: use Graham Scan 2d convex hull
b3AlignedObjectArray<b3GrahamVector3> orgpoints;
- b3Vector3 averageFaceNormal = b3MakeVector3(0,0,0);
+ b3Vector3 averageFaceNormal = b3MakeVector3(0, 0, 0);
- for (int i=0;i<coplanarFaceGroup.size();i++)
+ for (int i = 0; i < coplanarFaceGroup.size(); i++)
{
-// m_polyhedron->m_faces.push_back(tmpFaces[coplanarFaceGroup[i]]);
+ // m_polyhedron->m_faces.push_back(tmpFaces[coplanarFaceGroup[i]]);
b3MyFace& face = tmpFaces[coplanarFaceGroup[i]];
- b3Vector3 faceNormal = b3MakeVector3(face.m_plane[0],face.m_plane[1],face.m_plane[2]);
- averageFaceNormal+=faceNormal;
- for (int f=0;f<face.m_indices.size();f++)
+ b3Vector3 faceNormal = b3MakeVector3(face.m_plane[0], face.m_plane[1], face.m_plane[2]);
+ averageFaceNormal += faceNormal;
+ for (int f = 0; f < face.m_indices.size(); f++)
{
int orgIndex = face.m_indices[f];
b3Vector3 pt = m_vertices[orgIndex];
-
+
bool found = false;
- for (int i=0;i<orgpoints.size();i++)
+ for (int i = 0; i < orgpoints.size(); i++)
{
//if ((orgpoints[i].m_orgIndex == orgIndex) || ((rotatedPt-orgpoints[i]).length2()<0.0001))
if (orgpoints[i].m_orgIndex == orgIndex)
{
- found=true;
+ found = true;
break;
}
}
if (!found)
- orgpoints.push_back(b3GrahamVector3(pt,orgIndex));
+ orgpoints.push_back(b3GrahamVector3(pt, orgIndex));
}
}
-
-
b3MyFace combinedFace;
- for (int i=0;i<4;i++)
+ for (int i = 0; i < 4; i++)
combinedFace.m_plane[i] = tmpFaces[coplanarFaceGroup[0]].m_plane[i];
b3AlignedObjectArray<b3GrahamVector3> hull;
averageFaceNormal.normalize();
- b3GrahamScanConvexHull2D(orgpoints,hull,averageFaceNormal);
+ b3GrahamScanConvexHull2D(orgpoints, hull, averageFaceNormal);
- for (int i=0;i<hull.size();i++)
+ for (int i = 0; i < hull.size(); i++)
{
combinedFace.m_indices.push_back(hull[i].m_orgIndex);
- for(int k = 0; k < orgpoints.size(); k++)
+ for (int k = 0; k < orgpoints.size(); k++)
{
- if(orgpoints[k].m_orgIndex == hull[i].m_orgIndex)
+ if (orgpoints[k].m_orgIndex == hull[i].m_orgIndex)
{
- orgpoints[k].m_orgIndex = -1; // invalidate...
+ orgpoints[k].m_orgIndex = -1; // invalidate...
break;
}
}
@@ -203,38 +187,41 @@ bool b3ConvexUtility::initializePolyhedralFeatures(const b3Vector3* orgVertices,
// are there rejected vertices?
bool reject_merge = false;
-
-
- for(int i = 0; i < orgpoints.size(); i++) {
- if(orgpoints[i].m_orgIndex == -1)
- continue; // this is in the hull...
+ for (int i = 0; i < orgpoints.size(); i++)
+ {
+ if (orgpoints[i].m_orgIndex == -1)
+ continue; // this is in the hull...
// this vertex is rejected -- is anybody else using this vertex?
- for(int j = 0; j < tmpFaces.size(); j++) {
-
+ for (int j = 0; j < tmpFaces.size(); j++)
+ {
b3MyFace& face = tmpFaces[j];
// is this a face of the current coplanar group?
bool is_in_current_group = false;
- for(int k = 0; k < coplanarFaceGroup.size(); k++) {
- if(coplanarFaceGroup[k] == j) {
+ for (int k = 0; k < coplanarFaceGroup.size(); k++)
+ {
+ if (coplanarFaceGroup[k] == j)
+ {
is_in_current_group = true;
break;
}
}
- if(is_in_current_group) // ignore this face...
+ if (is_in_current_group) // ignore this face...
continue;
// does this face use this rejected vertex?
- for(int v = 0; v < face.m_indices.size(); v++) {
- if(face.m_indices[v] == orgpoints[i].m_orgIndex) {
+ for (int v = 0; v < face.m_indices.size(); v++)
+ {
+ if (face.m_indices[v] == orgpoints[i].m_orgIndex)
+ {
// this rejected vertex is used in another face -- reject merge
reject_merge = true;
break;
}
}
- if(reject_merge)
+ if (reject_merge)
break;
}
- if(reject_merge)
+ if (reject_merge)
break;
}
@@ -245,18 +232,14 @@ bool b3ConvexUtility::initializePolyhedralFeatures(const b3Vector3* orgVertices,
m_faces.push_back(combinedFace);
}
}
- if(!did_merge)
+ if (!did_merge)
{
- for (int i=0;i<coplanarFaceGroup.size();i++)
+ for (int i = 0; i < coplanarFaceGroup.size(); i++)
{
b3MyFace face = tmpFaces[coplanarFaceGroup[i]];
m_faces.push_back(face);
}
-
- }
-
-
-
+ }
}
initialize();
@@ -264,43 +247,38 @@ bool b3ConvexUtility::initializePolyhedralFeatures(const b3Vector3* orgVertices,
return true;
}
-
-
-
-
-
inline bool IsAlmostZero(const b3Vector3& v)
{
- if(fabsf(v.getX())>1e-6 || fabsf(v.getY())>1e-6 || fabsf(v.getZ())>1e-6) return false;
+ if (fabsf(v.getX()) > 1e-6 || fabsf(v.getY()) > 1e-6 || fabsf(v.getZ()) > 1e-6) return false;
return true;
}
struct b3InternalVertexPair
{
- b3InternalVertexPair(short int v0,short int v1)
- :m_v0(v0),
- m_v1(v1)
+ b3InternalVertexPair(short int v0, short int v1)
+ : m_v0(v0),
+ m_v1(v1)
{
- if (m_v1>m_v0)
- b3Swap(m_v0,m_v1);
+ if (m_v1 > m_v0)
+ b3Swap(m_v0, m_v1);
}
short int m_v0;
short int m_v1;
int getHash() const
{
- return m_v0+(m_v1<<16);
+ return m_v0 + (m_v1 << 16);
}
bool equals(const b3InternalVertexPair& other) const
{
- return m_v0==other.m_v0 && m_v1==other.m_v1;
+ return m_v0 == other.m_v0 && m_v1 == other.m_v1;
}
};
struct b3InternalEdge
{
b3InternalEdge()
- :m_face0(-1),
- m_face1(-1)
+ : m_face0(-1),
+ m_face1(-1)
{
}
short int m_face0;
@@ -312,23 +290,31 @@ struct b3InternalEdge
#ifdef TEST_INTERNAL_OBJECTS
bool b3ConvexUtility::testContainment() const
{
- for(int p=0;p<8;p++)
+ for (int p = 0; p < 8; p++)
{
b3Vector3 LocalPt;
- if(p==0) LocalPt = m_localCenter + b3Vector3(m_extents[0], m_extents[1], m_extents[2]);
- else if(p==1) LocalPt = m_localCenter + b3Vector3(m_extents[0], m_extents[1], -m_extents[2]);
- else if(p==2) LocalPt = m_localCenter + b3Vector3(m_extents[0], -m_extents[1], m_extents[2]);
- else if(p==3) LocalPt = m_localCenter + b3Vector3(m_extents[0], -m_extents[1], -m_extents[2]);
- else if(p==4) LocalPt = m_localCenter + b3Vector3(-m_extents[0], m_extents[1], m_extents[2]);
- else if(p==5) LocalPt = m_localCenter + b3Vector3(-m_extents[0], m_extents[1], -m_extents[2]);
- else if(p==6) LocalPt = m_localCenter + b3Vector3(-m_extents[0], -m_extents[1], m_extents[2]);
- else if(p==7) LocalPt = m_localCenter + b3Vector3(-m_extents[0], -m_extents[1], -m_extents[2]);
-
- for(int i=0;i<m_faces.size();i++)
+ if (p == 0)
+ LocalPt = m_localCenter + b3Vector3(m_extents[0], m_extents[1], m_extents[2]);
+ else if (p == 1)
+ LocalPt = m_localCenter + b3Vector3(m_extents[0], m_extents[1], -m_extents[2]);
+ else if (p == 2)
+ LocalPt = m_localCenter + b3Vector3(m_extents[0], -m_extents[1], m_extents[2]);
+ else if (p == 3)
+ LocalPt = m_localCenter + b3Vector3(m_extents[0], -m_extents[1], -m_extents[2]);
+ else if (p == 4)
+ LocalPt = m_localCenter + b3Vector3(-m_extents[0], m_extents[1], m_extents[2]);
+ else if (p == 5)
+ LocalPt = m_localCenter + b3Vector3(-m_extents[0], m_extents[1], -m_extents[2]);
+ else if (p == 6)
+ LocalPt = m_localCenter + b3Vector3(-m_extents[0], -m_extents[1], m_extents[2]);
+ else if (p == 7)
+ LocalPt = m_localCenter + b3Vector3(-m_extents[0], -m_extents[1], -m_extents[2]);
+
+ for (int i = 0; i < m_faces.size(); i++)
{
const b3Vector3 Normal(m_faces[i].m_plane[0], m_faces[i].m_plane[1], m_faces[i].m_plane[2]);
const b3Scalar d = LocalPt.dot(Normal) + m_faces[i].m_plane[3];
- if(d>0.0f)
+ if (d > 0.0f)
return false;
}
}
@@ -336,39 +322,38 @@ bool b3ConvexUtility::testContainment() const
}
#endif
-void b3ConvexUtility::initialize()
+void b3ConvexUtility::initialize()
{
-
- b3HashMap<b3InternalVertexPair,b3InternalEdge> edges;
+ b3HashMap<b3InternalVertexPair, b3InternalEdge> edges;
b3Scalar TotalArea = 0.0f;
-
+
m_localCenter.setValue(0, 0, 0);
- for(int i=0;i<m_faces.size();i++)
+ for (int i = 0; i < m_faces.size(); i++)
{
int numVertices = m_faces[i].m_indices.size();
int NbTris = numVertices;
- for(int j=0;j<NbTris;j++)
+ for (int j = 0; j < NbTris; j++)
{
- int k = (j+1)%numVertices;
- b3InternalVertexPair vp(m_faces[i].m_indices[j],m_faces[i].m_indices[k]);
+ int k = (j + 1) % numVertices;
+ b3InternalVertexPair vp(m_faces[i].m_indices[j], m_faces[i].m_indices[k]);
b3InternalEdge* edptr = edges.find(vp);
- b3Vector3 edge = m_vertices[vp.m_v1]-m_vertices[vp.m_v0];
+ b3Vector3 edge = m_vertices[vp.m_v1] - m_vertices[vp.m_v0];
edge.normalize();
bool found = false;
- b3Vector3 diff,diff2;
+ b3Vector3 diff, diff2;
- for (int p=0;p<m_uniqueEdges.size();p++)
+ for (int p = 0; p < m_uniqueEdges.size(); p++)
{
- diff = m_uniqueEdges[p]-edge;
- diff2 = m_uniqueEdges[p]+edge;
+ diff = m_uniqueEdges[p] - edge;
+ diff2 = m_uniqueEdges[p] + edge;
- // if ((diff.length2()==0.f) ||
+ // if ((diff.length2()==0.f) ||
// (diff2.length2()==0.f))
- if (IsAlmostZero(diff) ||
- IsAlmostZero(diff2))
+ if (IsAlmostZero(diff) ||
+ IsAlmostZero(diff2))
{
found = true;
break;
@@ -382,106 +367,101 @@ void b3ConvexUtility::initialize()
if (edptr)
{
- //TBD: figure out why I added this assert
-// b3Assert(edptr->m_face0>=0);
- // b3Assert(edptr->m_face1<0);
+ //TBD: figure out why I added this assert
+ // b3Assert(edptr->m_face0>=0);
+ // b3Assert(edptr->m_face1<0);
edptr->m_face1 = i;
- } else
+ }
+ else
{
b3InternalEdge ed;
ed.m_face0 = i;
- edges.insert(vp,ed);
+ edges.insert(vp, ed);
}
}
}
#ifdef USE_CONNECTED_FACES
- for(int i=0;i<m_faces.size();i++)
+ for (int i = 0; i < m_faces.size(); i++)
{
int numVertices = m_faces[i].m_indices.size();
m_faces[i].m_connectedFaces.resize(numVertices);
- for(int j=0;j<numVertices;j++)
+ for (int j = 0; j < numVertices; j++)
{
- int k = (j+1)%numVertices;
- b3InternalVertexPair vp(m_faces[i].m_indices[j],m_faces[i].m_indices[k]);
+ int k = (j + 1) % numVertices;
+ b3InternalVertexPair vp(m_faces[i].m_indices[j], m_faces[i].m_indices[k]);
b3InternalEdge* edptr = edges.find(vp);
b3Assert(edptr);
- b3Assert(edptr->m_face0>=0);
- b3Assert(edptr->m_face1>=0);
+ b3Assert(edptr->m_face0 >= 0);
+ b3Assert(edptr->m_face1 >= 0);
- int connectedFace = (edptr->m_face0==i)?edptr->m_face1:edptr->m_face0;
+ int connectedFace = (edptr->m_face0 == i) ? edptr->m_face1 : edptr->m_face0;
m_faces[i].m_connectedFaces[j] = connectedFace;
}
}
-#endif//USE_CONNECTED_FACES
+#endif //USE_CONNECTED_FACES
- for(int i=0;i<m_faces.size();i++)
+ for (int i = 0; i < m_faces.size(); i++)
{
int numVertices = m_faces[i].m_indices.size();
- int NbTris = numVertices-2;
-
+ int NbTris = numVertices - 2;
+
const b3Vector3& p0 = m_vertices[m_faces[i].m_indices[0]];
- for(int j=1;j<=NbTris;j++)
+ for (int j = 1; j <= NbTris; j++)
{
- int k = (j+1)%numVertices;
+ int k = (j + 1) % numVertices;
const b3Vector3& p1 = m_vertices[m_faces[i].m_indices[j]];
const b3Vector3& p2 = m_vertices[m_faces[i].m_indices[k]];
b3Scalar Area = ((p0 - p1).cross(p0 - p2)).length() * 0.5f;
- b3Vector3 Center = (p0+p1+p2)/3.0f;
+ b3Vector3 Center = (p0 + p1 + p2) / 3.0f;
m_localCenter += Area * Center;
TotalArea += Area;
}
}
m_localCenter /= TotalArea;
-
-
-
#ifdef TEST_INTERNAL_OBJECTS
- if(1)
+ if (1)
{
m_radius = FLT_MAX;
- for(int i=0;i<m_faces.size();i++)
+ for (int i = 0; i < m_faces.size(); i++)
{
const b3Vector3 Normal(m_faces[i].m_plane[0], m_faces[i].m_plane[1], m_faces[i].m_plane[2]);
const b3Scalar dist = b3Fabs(m_localCenter.dot(Normal) + m_faces[i].m_plane[3]);
- if(dist<m_radius)
+ if (dist < m_radius)
m_radius = dist;
}
-
b3Scalar MinX = FLT_MAX;
b3Scalar MinY = FLT_MAX;
b3Scalar MinZ = FLT_MAX;
b3Scalar MaxX = -FLT_MAX;
b3Scalar MaxY = -FLT_MAX;
b3Scalar MaxZ = -FLT_MAX;
- for(int i=0; i<m_vertices.size(); i++)
+ for (int i = 0; i < m_vertices.size(); i++)
{
const b3Vector3& pt = m_vertices[i];
- if(pt.getX()<MinX) MinX = pt.getX();
- if(pt.getX()>MaxX) MaxX = pt.getX();
- if(pt.getY()<MinY) MinY = pt.getY();
- if(pt.getY()>MaxY) MaxY = pt.getY();
- if(pt.getZ()<MinZ) MinZ = pt.getZ();
- if(pt.getZ()>MaxZ) MaxZ = pt.getZ();
+ if (pt.getX() < MinX) MinX = pt.getX();
+ if (pt.getX() > MaxX) MaxX = pt.getX();
+ if (pt.getY() < MinY) MinY = pt.getY();
+ if (pt.getY() > MaxY) MaxY = pt.getY();
+ if (pt.getZ() < MinZ) MinZ = pt.getZ();
+ if (pt.getZ() > MaxZ) MaxZ = pt.getZ();
}
- mC.setValue(MaxX+MinX, MaxY+MinY, MaxZ+MinZ);
- mE.setValue(MaxX-MinX, MaxY-MinY, MaxZ-MinZ);
-
-
+ mC.setValue(MaxX + MinX, MaxY + MinY, MaxZ + MinZ);
+ mE.setValue(MaxX - MinX, MaxY - MinY, MaxZ - MinZ);
-// const b3Scalar r = m_radius / sqrtf(2.0f);
+ // const b3Scalar r = m_radius / sqrtf(2.0f);
const b3Scalar r = m_radius / sqrtf(3.0f);
const int LargestExtent = mE.maxAxis();
- const b3Scalar Step = (mE[LargestExtent]*0.5f - r)/1024.0f;
+ const b3Scalar Step = (mE[LargestExtent] * 0.5f - r) / 1024.0f;
m_extents[0] = m_extents[1] = m_extents[2] = r;
- m_extents[LargestExtent] = mE[LargestExtent]*0.5f;
+ m_extents[LargestExtent] = mE[LargestExtent] * 0.5f;
bool FoundBox = false;
- for(int j=0;j<1024;j++)
+ for (int j = 0; j < 1024; j++)
{
- if(testContainment())
+ if (testContainment())
{
FoundBox = true;
break;
@@ -489,25 +469,25 @@ void b3ConvexUtility::initialize()
m_extents[LargestExtent] -= Step;
}
- if(!FoundBox)
+ if (!FoundBox)
{
m_extents[0] = m_extents[1] = m_extents[2] = r;
}
else
{
// Refine the box
- const b3Scalar Step = (m_radius - r)/1024.0f;
- const int e0 = (1<<LargestExtent) & 3;
- const int e1 = (1<<e0) & 3;
+ const b3Scalar Step = (m_radius - r) / 1024.0f;
+ const int e0 = (1 << LargestExtent) & 3;
+ const int e1 = (1 << e0) & 3;
- for(int j=0;j<1024;j++)
+ for (int j = 0; j < 1024; j++)
{
const b3Scalar Saved0 = m_extents[e0];
const b3Scalar Saved1 = m_extents[e1];
m_extents[e0] += Step;
m_extents[e1] += Step;
- if(!testContainment())
+ if (!testContainment())
{
m_extents[e0] = Saved0;
m_extents[e1] = Saved1;
diff --git a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3ConvexUtility.h b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3ConvexUtility.h
index 86c4151f8c..4c8a88cbda 100644
--- a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3ConvexUtility.h
+++ b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3ConvexUtility.h
@@ -20,43 +20,36 @@ subject to the following restrictions:
#include "Bullet3Common/b3AlignedObjectArray.h"
#include "Bullet3Common/b3Transform.h"
-
-
-
struct b3MyFace
{
- b3AlignedObjectArray<int> m_indices;
- b3Scalar m_plane[4];
+ b3AlignedObjectArray<int> m_indices;
+ b3Scalar m_plane[4];
};
-B3_ATTRIBUTE_ALIGNED16(class) b3ConvexUtility
+B3_ATTRIBUTE_ALIGNED16(class)
+b3ConvexUtility
{
- public:
+public:
B3_DECLARE_ALIGNED_ALLOCATOR();
- b3Vector3 m_localCenter;
- b3Vector3 m_extents;
- b3Vector3 mC;
- b3Vector3 mE;
- b3Scalar m_radius;
-
- b3AlignedObjectArray<b3Vector3> m_vertices;
- b3AlignedObjectArray<b3MyFace> m_faces;
+ b3Vector3 m_localCenter;
+ b3Vector3 m_extents;
+ b3Vector3 mC;
+ b3Vector3 mE;
+ b3Scalar m_radius;
+
+ b3AlignedObjectArray<b3Vector3> m_vertices;
+ b3AlignedObjectArray<b3MyFace> m_faces;
b3AlignedObjectArray<b3Vector3> m_uniqueEdges;
-
b3ConvexUtility()
{
}
virtual ~b3ConvexUtility();
- bool initializePolyhedralFeatures(const b3Vector3* orgVertices, int numVertices, bool mergeCoplanarTriangles=true);
-
- void initialize();
- bool testContainment() const;
-
-
+ bool initializePolyhedralFeatures(const b3Vector3* orgVertices, int numVertices, bool mergeCoplanarTriangles = true);
+ void initialize();
+ bool testContainment() const;
};
#endif
- \ No newline at end of file
diff --git a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3CpuNarrowPhase.cpp b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3CpuNarrowPhase.cpp
index c3134b2c65..e0b2161100 100644
--- a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3CpuNarrowPhase.cpp
+++ b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3CpuNarrowPhase.cpp
@@ -5,15 +5,13 @@
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3ConvexPolyhedronData.h"
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3ContactConvexConvexSAT.h"
-
struct b3CpuNarrowPhaseInternalData
{
b3AlignedObjectArray<b3Aabb> m_localShapeAABBCPU;
- b3AlignedObjectArray<b3Collidable> m_collidablesCPU;
+ b3AlignedObjectArray<b3Collidable> m_collidablesCPU;
b3AlignedObjectArray<b3ConvexUtility*> m_convexData;
b3Config m_config;
-
b3AlignedObjectArray<b3ConvexPolyhedronData> m_convexPolyhedra;
b3AlignedObjectArray<b3Vector3> m_uniqueEdges;
b3AlignedObjectArray<b3Vector3> m_convexVertices;
@@ -22,10 +20,9 @@ struct b3CpuNarrowPhaseInternalData
b3AlignedObjectArray<b3Contact4Data> m_contacts;
- int m_numAcceleratedShapes;
+ int m_numAcceleratedShapes;
};
-
const b3AlignedObjectArray<b3Contact4Data>& b3CpuNarrowPhase::getContacts() const
{
return m_data->m_contacts;
@@ -41,7 +38,6 @@ const b3Collidable& b3CpuNarrowPhase::getCollidableCpu(int collidableIndex) cons
return m_data->m_collidablesCPU[collidableIndex];
}
-
b3CpuNarrowPhase::b3CpuNarrowPhase(const struct b3Config& config)
{
m_data = new b3CpuNarrowPhaseInternalData;
@@ -61,7 +57,7 @@ void b3CpuNarrowPhase::computeContacts(b3AlignedObjectArray<b3Int4>& pairs, b3Al
int maxContactCapacity = m_data->m_config.m_maxContactCapacity;
m_data->m_contacts.resize(maxContactCapacity);
- for (int i=0;i<nPairs;i++)
+ for (int i = 0; i < nPairs; i++)
{
int bodyIndexA = pairs[i].x;
int bodyIndexB = pairs[i].y;
@@ -71,64 +67,57 @@ void b3CpuNarrowPhase::computeContacts(b3AlignedObjectArray<b3Int4>& pairs, b3Al
if (m_data->m_collidablesCPU[collidableIndexA].m_shapeType == SHAPE_SPHERE &&
m_data->m_collidablesCPU[collidableIndexB].m_shapeType == SHAPE_CONVEX_HULL)
{
-// computeContactSphereConvex(i,bodyIndexA,bodyIndexB,collidableIndexA,collidableIndexB,&bodies[0],
-// &m_data->m_collidablesCPU[0],&hostConvexData[0],&hostVertices[0],&hostIndices[0],&hostFaces[0],&hostContacts[0],nContacts,maxContactCapacity);
+ // computeContactSphereConvex(i,bodyIndexA,bodyIndexB,collidableIndexA,collidableIndexB,&bodies[0],
+ // &m_data->m_collidablesCPU[0],&hostConvexData[0],&hostVertices[0],&hostIndices[0],&hostFaces[0],&hostContacts[0],nContacts,maxContactCapacity);
}
if (m_data->m_collidablesCPU[collidableIndexA].m_shapeType == SHAPE_CONVEX_HULL &&
m_data->m_collidablesCPU[collidableIndexB].m_shapeType == SHAPE_SPHERE)
{
-// computeContactSphereConvex(i,bodyIndexB,bodyIndexA,collidableIndexB,collidableIndexA,&bodies[0],
-// &m_data->m_collidablesCPU[0],&hostConvexData[0],&hostVertices[0],&hostIndices[0],&hostFaces[0],&hostContacts[0],nContacts,maxContactCapacity);
+ // computeContactSphereConvex(i,bodyIndexB,bodyIndexA,collidableIndexB,collidableIndexA,&bodies[0],
+ // &m_data->m_collidablesCPU[0],&hostConvexData[0],&hostVertices[0],&hostIndices[0],&hostFaces[0],&hostContacts[0],nContacts,maxContactCapacity);
//printf("convex-sphere\n");
-
}
if (m_data->m_collidablesCPU[collidableIndexA].m_shapeType == SHAPE_CONVEX_HULL &&
m_data->m_collidablesCPU[collidableIndexB].m_shapeType == SHAPE_PLANE)
{
-// computeContactPlaneConvex(i,bodyIndexB,bodyIndexA,collidableIndexB,collidableIndexA,&bodies[0],
-// &m_data->m_collidablesCPU[0],&hostConvexData[0],&hostVertices[0],&hostIndices[0],&hostFaces[0],&hostContacts[0],nContacts,maxContactCapacity);
-// printf("convex-plane\n");
-
+ // computeContactPlaneConvex(i,bodyIndexB,bodyIndexA,collidableIndexB,collidableIndexA,&bodies[0],
+ // &m_data->m_collidablesCPU[0],&hostConvexData[0],&hostVertices[0],&hostIndices[0],&hostFaces[0],&hostContacts[0],nContacts,maxContactCapacity);
+ // printf("convex-plane\n");
}
if (m_data->m_collidablesCPU[collidableIndexA].m_shapeType == SHAPE_PLANE &&
m_data->m_collidablesCPU[collidableIndexB].m_shapeType == SHAPE_CONVEX_HULL)
{
-// computeContactPlaneConvex(i,bodyIndexA,bodyIndexB,collidableIndexA,collidableIndexB,&bodies[0],
-// &m_data->m_collidablesCPU[0],&hostConvexData[0],&hostVertices[0],&hostIndices[0],&hostFaces[0],&hostContacts[0],nContacts,maxContactCapacity);
-// printf("plane-convex\n");
-
+ // computeContactPlaneConvex(i,bodyIndexA,bodyIndexB,collidableIndexA,collidableIndexB,&bodies[0],
+ // &m_data->m_collidablesCPU[0],&hostConvexData[0],&hostVertices[0],&hostIndices[0],&hostFaces[0],&hostContacts[0],nContacts,maxContactCapacity);
+ // printf("plane-convex\n");
}
- if (m_data->m_collidablesCPU[collidableIndexA].m_shapeType == SHAPE_COMPOUND_OF_CONVEX_HULLS &&
+ if (m_data->m_collidablesCPU[collidableIndexA].m_shapeType == SHAPE_COMPOUND_OF_CONVEX_HULLS &&
m_data->m_collidablesCPU[collidableIndexB].m_shapeType == SHAPE_COMPOUND_OF_CONVEX_HULLS)
{
-// computeContactCompoundCompound(i,bodyIndexB,bodyIndexA,collidableIndexB,collidableIndexA,&bodies[0],
-// &m_data->m_collidablesCPU[0],&hostConvexData[0],&cpuChildShapes[0], hostAabbsWorldSpace,hostAabbsLocalSpace,hostVertices,hostUniqueEdges,hostIndices,hostFaces,&hostContacts[0],
-// nContacts,maxContactCapacity,treeNodesCPU,subTreesCPU,bvhInfoCPU);
-// printf("convex-plane\n");
-
+ // computeContactCompoundCompound(i,bodyIndexB,bodyIndexA,collidableIndexB,collidableIndexA,&bodies[0],
+ // &m_data->m_collidablesCPU[0],&hostConvexData[0],&cpuChildShapes[0], hostAabbsWorldSpace,hostAabbsLocalSpace,hostVertices,hostUniqueEdges,hostIndices,hostFaces,&hostContacts[0],
+ // nContacts,maxContactCapacity,treeNodesCPU,subTreesCPU,bvhInfoCPU);
+ // printf("convex-plane\n");
}
-
- if (m_data->m_collidablesCPU[collidableIndexA].m_shapeType == SHAPE_COMPOUND_OF_CONVEX_HULLS &&
+ if (m_data->m_collidablesCPU[collidableIndexA].m_shapeType == SHAPE_COMPOUND_OF_CONVEX_HULLS &&
m_data->m_collidablesCPU[collidableIndexB].m_shapeType == SHAPE_PLANE)
{
-// computeContactPlaneCompound(i,bodyIndexB,bodyIndexA,collidableIndexB,collidableIndexA,&bodies[0],
-// &m_data->m_collidablesCPU[0],&hostConvexData[0],&cpuChildShapes[0], &hostVertices[0],&hostIndices[0],&hostFaces[0],&hostContacts[0],nContacts,maxContactCapacity);
-// printf("convex-plane\n");
-
+ // computeContactPlaneCompound(i,bodyIndexB,bodyIndexA,collidableIndexB,collidableIndexA,&bodies[0],
+ // &m_data->m_collidablesCPU[0],&hostConvexData[0],&cpuChildShapes[0], &hostVertices[0],&hostIndices[0],&hostFaces[0],&hostContacts[0],nContacts,maxContactCapacity);
+ // printf("convex-plane\n");
}
if (m_data->m_collidablesCPU[collidableIndexA].m_shapeType == SHAPE_PLANE &&
m_data->m_collidablesCPU[collidableIndexB].m_shapeType == SHAPE_COMPOUND_OF_CONVEX_HULLS)
{
-// computeContactPlaneCompound(i,bodyIndexA,bodyIndexB,collidableIndexA,collidableIndexB,&bodies[0],
-// &m_data->m_collidablesCPU[0],&hostConvexData[0],&cpuChildShapes[0],&hostVertices[0],&hostIndices[0],&hostFaces[0],&hostContacts[0],nContacts,maxContactCapacity);
-// printf("plane-convex\n");
-
+ // computeContactPlaneCompound(i,bodyIndexA,bodyIndexB,collidableIndexA,collidableIndexB,&bodies[0],
+ // &m_data->m_collidablesCPU[0],&hostConvexData[0],&cpuChildShapes[0],&hostVertices[0],&hostIndices[0],&hostFaces[0],&hostContacts[0],nContacts,maxContactCapacity);
+ // printf("plane-convex\n");
}
if (m_data->m_collidablesCPU[collidableIndexA].m_shapeType == SHAPE_CONVEX_HULL &&
@@ -137,54 +126,48 @@ void b3CpuNarrowPhase::computeContacts(b3AlignedObjectArray<b3Int4>& pairs, b3Al
//printf("pairs[i].z=%d\n",pairs[i].z);
//int contactIndex = computeContactConvexConvex2(i,bodyIndexA,bodyIndexB,collidableIndexA,collidableIndexB,bodies,
// m_data->m_collidablesCPU,hostConvexData,hostVertices,hostUniqueEdges,hostIndices,hostFaces,hostContacts,nContacts,maxContactCapacity,oldHostContacts);
- int contactIndex = b3ContactConvexConvexSAT(i,bodyIndexA,bodyIndexB,collidableIndexA,collidableIndexB,bodies,
- m_data->m_collidablesCPU,m_data->m_convexPolyhedra,m_data->m_convexVertices,m_data->m_uniqueEdges,m_data->m_convexIndices,m_data->m_convexFaces,m_data->m_contacts,numContacts,maxContactCapacity);
-
+ int contactIndex = b3ContactConvexConvexSAT(i, bodyIndexA, bodyIndexB, collidableIndexA, collidableIndexB, bodies,
+ m_data->m_collidablesCPU, m_data->m_convexPolyhedra, m_data->m_convexVertices, m_data->m_uniqueEdges, m_data->m_convexIndices, m_data->m_convexFaces, m_data->m_contacts, numContacts, maxContactCapacity);
- if (contactIndex>=0)
+ if (contactIndex >= 0)
{
pairs[i].z = contactIndex;
}
-// printf("plane-convex\n");
-
+ // printf("plane-convex\n");
}
-
-
}
m_data->m_contacts.resize(numContacts);
}
-int b3CpuNarrowPhase::registerConvexHullShape(b3ConvexUtility* utilPtr)
+int b3CpuNarrowPhase::registerConvexHullShape(b3ConvexUtility* utilPtr)
{
int collidableIndex = allocateCollidable();
- if (collidableIndex<0)
+ if (collidableIndex < 0)
return collidableIndex;
-
b3Collidable& col = m_data->m_collidablesCPU[collidableIndex];
col.m_shapeType = SHAPE_CONVEX_HULL;
col.m_shapeIndex = -1;
-
-
+
{
- b3Vector3 localCenter=b3MakeVector3(0,0,0);
- for (int i=0;i<utilPtr->m_vertices.size();i++)
- localCenter+=utilPtr->m_vertices[i];
- localCenter*= (1.f/utilPtr->m_vertices.size());
+ b3Vector3 localCenter = b3MakeVector3(0, 0, 0);
+ for (int i = 0; i < utilPtr->m_vertices.size(); i++)
+ localCenter += utilPtr->m_vertices[i];
+ localCenter *= (1.f / utilPtr->m_vertices.size());
utilPtr->m_localCenter = localCenter;
- col.m_shapeIndex = registerConvexHullShapeInternal(utilPtr,col);
+ col.m_shapeIndex = registerConvexHullShapeInternal(utilPtr, col);
}
- if (col.m_shapeIndex>=0)
+ if (col.m_shapeIndex >= 0)
{
b3Aabb aabb;
-
- b3Vector3 myAabbMin=b3MakeVector3(1e30f,1e30f,1e30f);
- b3Vector3 myAabbMax=b3MakeVector3(-1e30f,-1e30f,-1e30f);
- for (int i=0;i<utilPtr->m_vertices.size();i++)
+ b3Vector3 myAabbMin = b3MakeVector3(1e30f, 1e30f, 1e30f);
+ b3Vector3 myAabbMax = b3MakeVector3(-1e30f, -1e30f, -1e30f);
+
+ for (int i = 0; i < utilPtr->m_vertices.size(); i++)
{
myAabbMin.setMin(utilPtr->m_vertices[i]);
myAabbMax.setMax(utilPtr->m_vertices[i]);
@@ -200,44 +183,42 @@ int b3CpuNarrowPhase::registerConvexHullShape(b3ConvexUtility* utilPtr)
aabb.m_signedMaxIndices[3] = 0;
m_data->m_localShapeAABBCPU.push_back(aabb);
-
}
-
+
return collidableIndex;
}
-int b3CpuNarrowPhase::allocateCollidable()
+int b3CpuNarrowPhase::allocateCollidable()
{
int curSize = m_data->m_collidablesCPU.size();
- if (curSize<m_data->m_config.m_maxConvexShapes)
+ if (curSize < m_data->m_config.m_maxConvexShapes)
{
m_data->m_collidablesCPU.expand();
return curSize;
}
else
{
- b3Error("allocateCollidable out-of-range %d\n",m_data->m_config.m_maxConvexShapes);
+ b3Error("allocateCollidable out-of-range %d\n", m_data->m_config.m_maxConvexShapes);
}
return -1;
-
}
-int b3CpuNarrowPhase::registerConvexHullShape(const float* vertices, int strideInBytes, int numVertices, const float* scaling)
+int b3CpuNarrowPhase::registerConvexHullShape(const float* vertices, int strideInBytes, int numVertices, const float* scaling)
{
b3AlignedObjectArray<b3Vector3> verts;
- unsigned char* vts = (unsigned char*) vertices;
- for (int i=0;i<numVertices;i++)
+ unsigned char* vts = (unsigned char*)vertices;
+ for (int i = 0; i < numVertices; i++)
{
- float* vertex = (float*) &vts[i*strideInBytes];
- verts.push_back(b3MakeVector3(vertex[0]*scaling[0],vertex[1]*scaling[1],vertex[2]*scaling[2]));
+ float* vertex = (float*)&vts[i * strideInBytes];
+ verts.push_back(b3MakeVector3(vertex[0] * scaling[0], vertex[1] * scaling[1], vertex[2] * scaling[2]));
}
b3ConvexUtility* utilPtr = new b3ConvexUtility();
bool merge = true;
if (numVertices)
{
- utilPtr->initializePolyhedralFeatures(&verts[0],verts.size(),merge);
+ utilPtr->initializePolyhedralFeatures(&verts[0], verts.size(), merge);
}
int collidableIndex = registerConvexHullShape(utilPtr);
@@ -246,74 +227,67 @@ int b3CpuNarrowPhase::registerConvexHullShape(const float* vertices, int strideI
return collidableIndex;
}
-
-int b3CpuNarrowPhase::registerConvexHullShapeInternal(b3ConvexUtility* convexPtr,b3Collidable& col)
+int b3CpuNarrowPhase::registerConvexHullShapeInternal(b3ConvexUtility* convexPtr, b3Collidable& col)
{
+ m_data->m_convexData.resize(m_data->m_numAcceleratedShapes + 1);
+ m_data->m_convexPolyhedra.resize(m_data->m_numAcceleratedShapes + 1);
- m_data->m_convexData.resize(m_data->m_numAcceleratedShapes+1);
- m_data->m_convexPolyhedra.resize(m_data->m_numAcceleratedShapes+1);
-
-
- b3ConvexPolyhedronData& convex = m_data->m_convexPolyhedra.at(m_data->m_convexPolyhedra.size()-1);
+ b3ConvexPolyhedronData& convex = m_data->m_convexPolyhedra.at(m_data->m_convexPolyhedra.size() - 1);
convex.mC = convexPtr->mC;
convex.mE = convexPtr->mE;
- convex.m_extents= convexPtr->m_extents;
+ convex.m_extents = convexPtr->m_extents;
convex.m_localCenter = convexPtr->m_localCenter;
convex.m_radius = convexPtr->m_radius;
-
+
convex.m_numUniqueEdges = convexPtr->m_uniqueEdges.size();
int edgeOffset = m_data->m_uniqueEdges.size();
convex.m_uniqueEdgesOffset = edgeOffset;
-
- m_data->m_uniqueEdges.resize(edgeOffset+convex.m_numUniqueEdges);
-
+
+ m_data->m_uniqueEdges.resize(edgeOffset + convex.m_numUniqueEdges);
+
//convex data here
int i;
- for ( i=0;i<convexPtr->m_uniqueEdges.size();i++)
+ for (i = 0; i < convexPtr->m_uniqueEdges.size(); i++)
{
- m_data->m_uniqueEdges[edgeOffset+i] = convexPtr->m_uniqueEdges[i];
+ m_data->m_uniqueEdges[edgeOffset + i] = convexPtr->m_uniqueEdges[i];
}
-
+
int faceOffset = m_data->m_convexFaces.size();
convex.m_faceOffset = faceOffset;
convex.m_numFaces = convexPtr->m_faces.size();
- m_data->m_convexFaces.resize(faceOffset+convex.m_numFaces);
-
+ m_data->m_convexFaces.resize(faceOffset + convex.m_numFaces);
- for (i=0;i<convexPtr->m_faces.size();i++)
+ for (i = 0; i < convexPtr->m_faces.size(); i++)
{
- m_data->m_convexFaces[convex.m_faceOffset+i].m_plane = b3MakeVector3(convexPtr->m_faces[i].m_plane[0],
- convexPtr->m_faces[i].m_plane[1],
- convexPtr->m_faces[i].m_plane[2],
- convexPtr->m_faces[i].m_plane[3]);
+ m_data->m_convexFaces[convex.m_faceOffset + i].m_plane = b3MakeVector3(convexPtr->m_faces[i].m_plane[0],
+ convexPtr->m_faces[i].m_plane[1],
+ convexPtr->m_faces[i].m_plane[2],
+ convexPtr->m_faces[i].m_plane[3]);
-
int indexOffset = m_data->m_convexIndices.size();
int numIndices = convexPtr->m_faces[i].m_indices.size();
- m_data->m_convexFaces[convex.m_faceOffset+i].m_numIndices = numIndices;
- m_data->m_convexFaces[convex.m_faceOffset+i].m_indexOffset = indexOffset;
- m_data->m_convexIndices.resize(indexOffset+numIndices);
- for (int p=0;p<numIndices;p++)
+ m_data->m_convexFaces[convex.m_faceOffset + i].m_numIndices = numIndices;
+ m_data->m_convexFaces[convex.m_faceOffset + i].m_indexOffset = indexOffset;
+ m_data->m_convexIndices.resize(indexOffset + numIndices);
+ for (int p = 0; p < numIndices; p++)
{
- m_data->m_convexIndices[indexOffset+p] = convexPtr->m_faces[i].m_indices[p];
+ m_data->m_convexIndices[indexOffset + p] = convexPtr->m_faces[i].m_indices[p];
}
}
-
+
convex.m_numVertices = convexPtr->m_vertices.size();
int vertexOffset = m_data->m_convexVertices.size();
- convex.m_vertexOffset =vertexOffset;
-
- m_data->m_convexVertices.resize(vertexOffset+convex.m_numVertices);
- for (int i=0;i<convexPtr->m_vertices.size();i++)
+ convex.m_vertexOffset = vertexOffset;
+
+ m_data->m_convexVertices.resize(vertexOffset + convex.m_numVertices);
+ for (int i = 0; i < convexPtr->m_vertices.size(); i++)
{
- m_data->m_convexVertices[vertexOffset+i] = convexPtr->m_vertices[i];
+ m_data->m_convexVertices[vertexOffset + i] = convexPtr->m_vertices[i];
}
(m_data->m_convexData)[m_data->m_numAcceleratedShapes] = convexPtr;
-
-
-
+
return m_data->m_numAcceleratedShapes++;
}
diff --git a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3CpuNarrowPhase.h b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3CpuNarrowPhase.h
index 528be3346d..f02353c265 100644
--- a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3CpuNarrowPhase.h
+++ b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3CpuNarrowPhase.h
@@ -12,66 +12,55 @@
class b3CpuNarrowPhase
{
protected:
-
- struct b3CpuNarrowPhaseInternalData* m_data;
+ struct b3CpuNarrowPhaseInternalData* m_data;
int m_acceleratedCompanionShapeIndex;
int m_planeBodyIndex;
- int m_static0Index;
+ int m_static0Index;
- int registerConvexHullShapeInternal(class b3ConvexUtility* convexPtr,b3Collidable& col);
+ int registerConvexHullShapeInternal(class b3ConvexUtility* convexPtr, b3Collidable& col);
int registerConcaveMeshShape(b3AlignedObjectArray<b3Vector3>* vertices, b3AlignedObjectArray<int>* 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 registerSphereShape(float radius);
+ int registerPlaneShape(const b3Vector3& planeNormal, float planeConstant);
int registerCompoundShape(b3AlignedObjectArray<b3GpuChildShape>* childShapes);
int registerFace(const b3Vector3& faceNormal, float faceConstant);
-
- int registerConcaveMesh(b3AlignedObjectArray<b3Vector3>* vertices, b3AlignedObjectArray<int>* indices,const float* scaling);
-
+
+ int registerConcaveMesh(b3AlignedObjectArray<b3Vector3>* vertices, b3AlignedObjectArray<int>* 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 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 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 writeAllBodiesToGpu();
+ void reset();
+ void readbackAllBodiesToCpu();
+ bool getObjectTransformFromCpu(float* position, float* orientation, int bodyIndex) const;
- void setObjectTransformCpu(float* position, float* orientation , int bodyIndex);
+ 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<b3Int4>& pairs, b3AlignedObjectArray<b3Aabb>& aabbsWorldSpace, b3AlignedObjectArray<b3RigidBodyData>& bodies);
-
-
const struct b3RigidBodyData* getBodiesCpu() const;
//struct b3RigidBodyData* getBodiesCpu();
- int getNumBodiesGpu() const;
+ int getNumBodiesGpu() const;
-
- int getNumBodyInertiasGpu() const;
+ int getNumBodyInertiasGpu() const;
-
const struct b3Collidable* getCollidablesCpu() const;
- int getNumCollidablesGpu() const;
-
+ int getNumCollidablesGpu() const;
/*const struct b3Contact4* getContactsCPU() const;
@@ -80,8 +69,7 @@ public:
*/
const b3AlignedObjectArray<b3Contact4Data>& getContacts() const;
-
-
+
int getNumRigidBodies() const;
int allocateCollidable();
@@ -93,13 +81,12 @@ public:
b3Collidable& getCollidableCpu(int collidableIndex);
const b3Collidable& getCollidableCpu(int collidableIndex) const;
- const b3CpuNarrowPhaseInternalData* getInternalData() const
+ const b3CpuNarrowPhaseInternalData* getInternalData() const
{
- return m_data;
+ return m_data;
}
const struct b3Aabb& getLocalSpaceAabb(int collidableIndex) const;
};
-#endif //B3_CPU_NARROWPHASE_H
-
+#endif //B3_CPU_NARROWPHASE_H
diff --git a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3RaycastInfo.h b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3RaycastInfo.h
index fba8bd07a4..b50c0eca4f 100644
--- a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3RaycastInfo.h
+++ b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3RaycastInfo.h
@@ -4,21 +4,22 @@
#include "Bullet3Common/b3Vector3.h"
-B3_ATTRIBUTE_ALIGNED16(struct) b3RayInfo
+B3_ATTRIBUTE_ALIGNED16(struct)
+b3RayInfo
{
b3Vector3 m_from;
b3Vector3 m_to;
};
-B3_ATTRIBUTE_ALIGNED16(struct) b3RayHit
+B3_ATTRIBUTE_ALIGNED16(struct)
+b3RayHit
{
- b3Scalar m_hitFraction;
- int m_hitBody;
- int m_hitResult1;
- int m_hitResult2;
- b3Vector3 m_hitPoint;
- b3Vector3 m_hitNormal;
+ b3Scalar m_hitFraction;
+ int m_hitBody;
+ int m_hitResult1;
+ int m_hitResult2;
+ b3Vector3 m_hitPoint;
+ b3Vector3 m_hitNormal;
};
-#endif //B3_RAYCAST_INFO_H
-
+#endif //B3_RAYCAST_INFO_H
diff --git a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3RigidBodyCL.h b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3RigidBodyCL.h
index d58f71802f..be1be57f05 100644
--- a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3RigidBodyCL.h
+++ b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/b3RigidBodyCL.h
@@ -20,11 +20,9 @@ subject to the following restrictions:
#include "Bullet3Common/b3Matrix3x3.h"
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h"
-
-inline float b3GetInvMass(const b3RigidBodyData& body)
+inline float b3GetInvMass(const b3RigidBodyData& body)
{
- return body.m_invMass;
+ return body.m_invMass;
}
-
-#endif//B3_RIGID_BODY_CL
+#endif //B3_RIGID_BODY_CL
diff --git a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3BvhSubtreeInfoData.h b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3BvhSubtreeInfoData.h
index 8788ccbb47..d6beb662b5 100644
--- a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3BvhSubtreeInfoData.h
+++ b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3BvhSubtreeInfoData.h
@@ -7,14 +7,13 @@ typedef struct b3BvhSubtreeInfoData b3BvhSubtreeInfoData_t;
struct b3BvhSubtreeInfoData
{
//12 bytes
- unsigned short int m_quantizedAabbMin[3];
- unsigned short int m_quantizedAabbMax[3];
+ unsigned short int m_quantizedAabbMin[3];
+ unsigned short int m_quantizedAabbMax[3];
//4 bytes, points to the root of the subtree
- int m_rootNodeIndex;
+ int m_rootNodeIndex;
//4 bytes
- int m_subtreeSize;
- int m_padding[3];
+ int m_subtreeSize;
+ int m_padding[3];
};
-#endif //B3_BVH_SUBTREE_INFO_DATA_H
-
+#endif //B3_BVH_SUBTREE_INFO_DATA_H
diff --git a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3BvhTraversal.h b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3BvhTraversal.h
index 2618da24bc..7c2507cc98 100644
--- a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3BvhTraversal.h
+++ b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3BvhTraversal.h
@@ -7,69 +7,64 @@
#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)
+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))
+ if ((rigidBodies[bodyIndexA].m_invMass == 0) && (rigidBodies[bodyIndexB].m_invMass == 0))
{
return;
}
-
- if (collidables[collidableIndexA].m_shapeType!=SHAPE_CONCAVE_TRIMESH)
+
+ 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
- )
+
+ 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;
+ 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++)
+ 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);
+
+ 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 endNodeIndex = subtree.m_rootNodeIndex + subtree.m_subtreeSize;
int curIndex = startNodeIndex;
int escapeIndex;
int isLeafNode;
@@ -77,43 +72,46 @@ void b3BvhTraversal( __global const b3Int4* pairs,
while (curIndex < endNodeIndex)
{
b3QuantizedBvhNodeData rootNode = quantizedNodes[curIndex];
- aabbOverlap = b3TestQuantizedAabbAgainstQuantizedAabbSlow(quantizedQueryAabbMin,quantizedQueryAabbMax,rootNode.m_quantizedAabbMin,rootNode.m_quantizedAabbMax);
+ 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)
+ 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++)
+ int numChildrenB = collidables[collidableIndexB].m_numChildShapes;
+ int pairIdx = b3AtomicAdd(numConcavePairsOut, numChildrenB);
+ for (int b = 0; b < numChildrenB; b++)
+ {
+ if ((pairIdx + b) < maxNumConcavePairsCapacity)
{
- if ((pairIdx+b)<maxNumConcavePairsCapacity)
- {
- int childShapeIndexB = collidables[collidableIndexB].m_shapeIndex+b;
- b3Int4 newPair = b3MakeInt4(bodyIndexA,bodyIndexB,triangleIndex,childShapeIndexB);
- concavePairsOut[pairIdx+b] = newPair;
- }
+ int childShapeIndexB = collidables[collidableIndexB].m_shapeIndex + b;
+ b3Int4 newPair = b3MakeInt4(bodyIndexA, bodyIndexB, triangleIndex, childShapeIndexB);
+ concavePairsOut[pairIdx + b] = newPair;
}
- } else
+ }
+ }
+ else
{
int pairIdx = b3AtomicInc(numConcavePairsOut);
- if (pairIdx<maxNumConcavePairsCapacity)
+ if (pairIdx < maxNumConcavePairsCapacity)
{
- b3Int4 newPair = b3MakeInt4(bodyIndexA,bodyIndexB,triangleIndex,0);
+ b3Int4 newPair = b3MakeInt4(bodyIndexA, bodyIndexB, triangleIndex, 0);
concavePairsOut[pairIdx] = newPair;
}
}
- }
+ }
curIndex++;
- } else
+ }
+ else
{
if (isLeafNode)
{
curIndex++;
- } else
+ }
+ else
{
escapeIndex = b3GetEscapeIndex(&rootNode);
curIndex += escapeIndex;
@@ -122,5 +120,4 @@ void b3BvhTraversal( __global const b3Int4* pairs,
}
}
}
-
} \ No newline at end of file
diff --git a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ClipFaces.h b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ClipFaces.h
index 8009e7d6e0..0d9b13f1d6 100644
--- a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ClipFaces.h
+++ b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ClipFaces.h
@@ -1,7 +1,6 @@
#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"
@@ -10,38 +9,36 @@
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3QuantizedBvhNodeData.h"
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3ConvexPolyhedronData.h"
-
-inline b3Float4 b3Lerp3(b3Float4ConstArg a,b3Float4ConstArg b, float t)
+inline b3Float4 b3Lerp3(b3Float4ConstArg a, b3Float4ConstArg b, float t)
{
- return b3MakeFloat4( a.x + (b.x - a.x) * 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 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];
+ //double-check next test
+ // if (numVertsIn < 2)
+ // return 0;
+
+ b3Float4 firstVertex = pVtxIn[numVertsIn - 1];
b3Float4 endVertex = pVtxIn[0];
-
- ds = b3Dot(planeNormalWS,firstVertex)+planeEqWS;
-
+
+ ds = b3Dot(planeNormalWS, firstVertex) + planeEqWS;
+
for (ve = 0; ve < numVertsIn; ve++)
{
- endVertex=pVtxIn[ve];
- de = b3Dot(planeNormalWS,endVertex)+planeEqWS;
- if (ds<0)
+ endVertex = pVtxIn[ve];
+ de = b3Dot(planeNormalWS, endVertex) + planeEqWS;
+ if (ds < 0)
{
- if (de<0)
+ if (de < 0)
{
// Start < 0, end < 0, so output endVertex
ppVtxOut[numVertsOut++] = endVertex;
@@ -49,15 +46,15 @@ int clipFaceGlobal(__global const b3Float4* pVtxIn, int numVertsIn, b3Float4Cons
else
{
// Start < 0, end >= 0, so output intersection
- ppVtxOut[numVertsOut++] = b3Lerp3(firstVertex, endVertex,(ds * 1.f/(ds - de)) );
+ ppVtxOut[numVertsOut++] = b3Lerp3(firstVertex, endVertex, (ds * 1.f / (ds - de)));
}
}
else
{
- if (de<0)
+ if (de < 0)
{
// Start >= 0, end < 0 so output intersection and end
- ppVtxOut[numVertsOut++] = b3Lerp3(firstVertex, endVertex,(ds * 1.f/(ds - de)) );
+ ppVtxOut[numVertsOut++] = b3Lerp3(firstVertex, endVertex, (ds * 1.f / (ds - de)));
ppVtxOut[numVertsOut++] = endVertex;
}
}
@@ -67,90 +64,81 @@ int clipFaceGlobal(__global const b3Float4* pVtxIn, int numVertsIn, b3Float4Cons
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
- )
+__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 i = get_global_id(0);
//int pairIndex = i;
int i = pairIndex;
-
+
float minDist = -1e30f;
float maxDist = 0.02f;
-
-// if (i<numPairs)
+
+ // if (i<numPairs)
{
-
if (hasSeparatingAxis[i])
{
-
-// int bodyIndexA = pairs[i].x;
- // int bodyIndexB = pairs[i].y;
-
- int numLocalContactsOut = 0;
-
- int capacityWorldVertsB2 = vertexFaceCapacity;
-
- __global b3Float4* pVtxIn = &worldVertsB1[pairIndex*capacityWorldVertsB2];
- __global b3Float4* pVtxOut = &worldVertsB2[pairIndex*capacityWorldVertsB2];
-
-
- {
- __global b3Int4* clippingFaces = clippingFacesOut;
-
-
- int closestFaceA = clippingFaces[pairIndex].x;
- // int closestFaceB = clippingFaces[pairIndex].y;
- int numVertsInA = clippingFaces[pairIndex].z;
- int numVertsInB = clippingFaces[pairIndex].w;
-
- int numVertsOut = 0;
-
- if (closestFaceA>=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;
- }
-/*
+ // int bodyIndexA = pairs[i].x;
+ // int bodyIndexB = pairs[i].y;
+
+ int numLocalContactsOut = 0;
+
+ int capacityWorldVertsB2 = vertexFaceCapacity;
+
+ __global b3Float4* pVtxIn = &worldVertsB1[pairIndex * capacityWorldVertsB2];
+ __global b3Float4* pVtxOut = &worldVertsB2[pairIndex * capacityWorldVertsB2];
+
+ {
+ __global b3Int4* clippingFaces = clippingFacesOut;
+
+ int closestFaceA = clippingFaces[pairIndex].x;
+ // int closestFaceB = clippingFaces[pairIndex].y;
+ int numVertsInA = clippingFaces[pairIndex].z;
+ int numVertsInB = clippingFaces[pairIndex].w;
+
+ int numVertsOut = 0;
+
+ if (closestFaceA >= 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)
{
@@ -163,26 +151,21 @@ __kernel void clipFacesAndFindContactsKernel( __global const b3Float4* sepa
}
*/
- 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 (i<numPairs)
-
-}
+ 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];
-#endif //B3_CLIP_FACES_H
+ } // if (hasSeparatingAxis[i])
+ } // if (i<numPairs)
+}
+#endif //B3_CLIP_FACES_H
diff --git a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3Collidable.h b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3Collidable.h
index 77cdc7b7a9..9a8c668af2 100644
--- a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3Collidable.h
+++ b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3Collidable.h
@@ -2,40 +2,36 @@
#ifndef B3_COLLIDABLE_H
#define B3_COLLIDABLE_H
-
#include "Bullet3Common/shared/b3Float4.h"
#include "Bullet3Common/shared/b3Quat.h"
enum b3ShapeTypes
{
- SHAPE_HEIGHT_FIELD=1,
+ SHAPE_HEIGHT_FIELD = 1,
- SHAPE_CONVEX_HULL=3,
- SHAPE_PLANE=4,
- SHAPE_CONCAVE_TRIMESH=5,
- SHAPE_COMPOUND_OF_CONVEX_HULLS=6,
- SHAPE_SPHERE=7,
+ SHAPE_CONVEX_HULL = 3,
+ SHAPE_PLANE = 4,
+ SHAPE_CONCAVE_TRIMESH = 5,
+ SHAPE_COMPOUND_OF_CONVEX_HULLS = 6,
+ SHAPE_SPHERE = 7,
MAX_NUM_SHAPE_TYPES,
};
typedef struct b3Collidable b3Collidable_t;
-
struct b3Collidable
{
union {
int m_numChildShapes;
int m_bvhIndex;
};
- union
- {
+ union {
float m_radius;
- int m_compoundBvhIndex;
+ int m_compoundBvhIndex;
};
int m_shapeType;
- union
- {
+ union {
int m_shapeIndex;
float m_height;
};
@@ -44,33 +40,30 @@ struct b3Collidable
typedef struct b3GpuChildShape b3GpuChildShape_t;
struct b3GpuChildShape
{
- b3Float4 m_childPosition;
- b3Quat m_childOrientation;
- union
- {
- int m_shapeIndex;//used for SHAPE_COMPOUND_OF_CONVEX_HULLS
- int m_capsuleAxis;
+ b3Float4 m_childPosition;
+ b3Quat m_childOrientation;
+ union {
+ int m_shapeIndex; //used for SHAPE_COMPOUND_OF_CONVEX_HULLS
+ int m_capsuleAxis;
};
- union
- {
- float m_radius;//used for childshape of SHAPE_COMPOUND_OF_SPHERES or SHAPE_COMPOUND_OF_CAPSULES
- int m_numChildShapes;//used for compound shape
+ union {
+ float m_radius; //used for childshape of SHAPE_COMPOUND_OF_SPHERES or SHAPE_COMPOUND_OF_CAPSULES
+ int m_numChildShapes; //used for compound shape
};
- union
- {
- float m_height;//used for childshape of SHAPE_COMPOUND_OF_CAPSULES
- int m_collidableShapeIndex;
+ union {
+ float m_height; //used for childshape of SHAPE_COMPOUND_OF_CAPSULES
+ int m_collidableShapeIndex;
};
- int m_shapeType;
+ int m_shapeType;
};
struct b3CompoundOverlappingPair
{
int m_bodyIndexA;
int m_bodyIndexB;
-// int m_pairType;
+ // int m_pairType;
int m_childShapeIndexA;
int m_childShapeIndexB;
};
-#endif //B3_COLLIDABLE_H
+#endif //B3_COLLIDABLE_H
diff --git a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3Contact4Data.h b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3Contact4Data.h
index dfd45cc566..d5f6daa993 100644
--- a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3Contact4Data.h
+++ b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3Contact4Data.h
@@ -3,26 +3,24 @@
#include "Bullet3Common/shared/b3Float4.h"
-typedef struct b3Contact4Data b3Contact4Data_t;
+typedef struct b3Contact4Data b3Contact4Data_t;
struct b3Contact4Data
{
- b3Float4 m_worldPosB[4];
-// b3Float4 m_localPosA[4];
-// b3Float4 m_localPosB[4];
- b3Float4 m_worldNormalOnB; // w: m_nPoints
- unsigned short m_restituitionCoeffCmp;
- unsigned short m_frictionCoeffCmp;
+ b3Float4 m_worldPosB[4];
+ // b3Float4 m_localPosA[4];
+ // b3Float4 m_localPosB[4];
+ b3Float4 m_worldNormalOnB; // w: m_nPoints
+ unsigned short m_restituitionCoeffCmp;
+ unsigned short m_frictionCoeffCmp;
int m_batchIdx;
- int m_bodyAPtrAndSignBit;//x:m_bodyAPtr, y:m_bodyBPtr
+ int m_bodyAPtrAndSignBit; //x:m_bodyAPtr, y:m_bodyBPtr
int m_bodyBPtrAndSignBit;
- int m_childIndexA;
- int m_childIndexB;
+ int m_childIndexA;
+ int m_childIndexB;
int m_unused1;
int m_unused2;
-
-
};
inline int b3Contact4Data_getNumPoints(const struct b3Contact4Data* contact)
@@ -35,6 +33,4 @@ inline void b3Contact4Data_setNumPoints(struct b3Contact4Data* contact, int numP
contact->m_worldNormalOnB.w = (float)numPoints;
};
-
-
-#endif //B3_CONTACT4DATA_H \ No newline at end of file
+#endif //B3_CONTACT4DATA_H \ No newline at end of file
diff --git a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ContactConvexConvexSAT.h b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ContactConvexConvexSAT.h
index f295f01a6c..ca68f4bc4e 100644
--- a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ContactConvexConvexSAT.h
+++ b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ContactConvexConvexSAT.h
@@ -2,48 +2,43 @@
#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)
+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);
+ 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)
+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 firstVertex = pVtxIn[numVertsIn - 1];
b3Float4 endVertex = pVtxIn[0];
-
- ds = b3Dot3F4(planeNormalWS,firstVertex)+planeEqWS;
+
+ ds = b3Dot3F4(planeNormalWS, firstVertex) + planeEqWS;
for (ve = 0; ve < numVertsIn; ve++)
{
- endVertex=pVtxIn[ve];
+ endVertex = pVtxIn[ve];
- de = b3Dot3F4(planeNormalWS,endVertex)+planeEqWS;
+ de = b3Dot3F4(planeNormalWS, endVertex) + planeEqWS;
- if (ds<0)
+ if (ds < 0)
{
- if (de<0)
+ if (de < 0)
{
// Start < 0, end < 0, so output endVertex
ppVtxOut[numVertsOut++] = endVertex;
@@ -51,15 +46,15 @@ inline int b3ClipFace(const b3Float4* pVtxIn, int numVertsIn, b3Float4& planeNor
else
{
// Start < 0, end >= 0, so output intersection
- ppVtxOut[numVertsOut++] = b3Lerp3(firstVertex, endVertex,(ds * 1.f/(ds - de)) );
+ ppVtxOut[numVertsOut++] = b3Lerp3(firstVertex, endVertex, (ds * 1.f / (ds - de)));
}
}
else
{
- if (de<0)
+ if (de < 0)
{
// Start >= 0, end < 0 so output intersection and end
- ppVtxOut[numVertsOut++] = b3Lerp3(firstVertex, endVertex,(ds * 1.f/(ds - de)) );
+ ppVtxOut[numVertsOut++] = b3Lerp3(firstVertex, endVertex, (ds * 1.f / (ds - de)));
ppVtxOut[numVertsOut++] = endVertex;
}
}
@@ -69,36 +64,35 @@ inline int b3ClipFace(const b3Float4* pVtxIn, int numVertsIn, b3Float4& planeNor
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<b3Float4>& verticesA, const b3AlignedObjectArray<b3GpuFace>& facesA, const b3AlignedObjectArray<int>& indicesA,
- //const b3Float4* verticesB, const b3GpuFace* facesB, const int* indicesB,
- b3Float4* contactsOut,
- int contactCapacity)
+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<b3Float4>& verticesA, const b3AlignedObjectArray<b3GpuFace>& facesA, const b3AlignedObjectArray<int>& 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;
+ int closestFaceA = -1;
{
float dmin = FLT_MAX;
- for(int face=0;face<hullA->m_numFaces;face++)
+ 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);
+ 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;
@@ -106,33 +100,33 @@ inline int b3ClipFaceAgainstHull(const b3Float4& separatingNormal, const b3Conve
}
}
}
- if (closestFaceA<0)
+ if (closestFaceA < 0)
return numContactsOut;
- b3GpuFace polyA = facesA[hullA->m_faceOffset+closestFaceA];
+ 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++)
+ 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 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);
-
+ 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;
-
+ float planeEqWS = planeEqWS1;
+
//clip face
//clipFace(*pVtxIn, *pVtxOut,planeNormalWS,planeEqWS);
- numVertsOut = b3ClipFace(pVtxIn, numVertsIn, planeNormalWS,planeEqWS, pVtxOut);
+ numVertsOut = b3ClipFace(pVtxIn, numVertsIn, planeNormalWS, planeEqWS, pVtxOut);
//btSwap(pVtxIn,pVtxOut);
b3Float4* tmp = pVtxOut;
@@ -142,32 +136,32 @@ inline int b3ClipFaceAgainstHull(const b3Float4& separatingNormal, const b3Conve
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);
+ 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++)
+ 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)
+ float depth = b3Dot3F4(planeNormalWS, pVtxIn[i]) + planeEqWS;
+ if (depth <= minDist)
{
depth = minDist;
}
- if (numContactsOut<contactCapacity)
+ if (numContactsOut < contactCapacity)
{
- if (depth <=maxDist)
+ if (depth <= maxDist)
{
b3Float4 pointInWorld = pVtxIn[i];
//resultOut.addContactPoint(separatingNormal,point,depth);
- contactsOut[numContactsOut++] = b3MakeVector3(pointInWorld.x,pointInWorld.y,pointInWorld.z,depth);
+ contactsOut[numContactsOut++] = b3MakeVector3(pointInWorld.x, pointInWorld.y, pointInWorld.z, depth);
//printf("depth=%f\n",depth);
}
- } else
+ }
+ else
{
- b3Error("exceeding contact capacity (%d,%df)\n", numContactsOut,contactCapacity);
+ b3Error("exceeding contact capacity (%d,%df)\n", numContactsOut, contactCapacity);
}
}
}
@@ -175,62 +169,60 @@ inline int b3ClipFaceAgainstHull(const b3Float4& separatingNormal, const b3Conve
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<b3Float4>& verticesA, const b3AlignedObjectArray<b3GpuFace>& facesA, const b3AlignedObjectArray<int>& indicesA,
+ const b3AlignedObjectArray<b3Float4>& verticesB, const b3AlignedObjectArray<b3GpuFace>& facesB, const b3AlignedObjectArray<int>& indicesB,
-
-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<b3Float4>& verticesA, const b3AlignedObjectArray<b3GpuFace>& facesA, const b3AlignedObjectArray<int>& indicesA,
- const b3AlignedObjectArray<b3Float4>& verticesB, const b3AlignedObjectArray<b3GpuFace>& facesB, const b3AlignedObjectArray<int>& indicesB,
-
- b3Float4* contactsOut,
- int contactCapacity)
+ b3Float4* contactsOut,
+ int contactCapacity)
{
int numContactsOut = 0;
- int numWorldVertsB1= 0;
-
+ int numWorldVertsB1 = 0;
+
B3_PROFILE("clipHullAgainstHull");
//float curMaxDist=maxDist;
- int closestFaceB=-1;
+ int closestFaceB = -1;
float dmax = -FLT_MAX;
{
//B3_PROFILE("closestFaceB");
- if (hullB.m_numFaces!=1)
+ 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++)
+
+ 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];
+ printf("face %d\n", face);
+ const b3GpuFace* faceB = &facesB[hullB.m_faceOffset + face];
if (once)
{
- for (int i=0;i<faceB->m_numIndices;i++)
+ 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);
+ 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)
+#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 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);
+ printf("faceNormal = %f,%f,%f\n", Normal.x, Normal.y, Normal.z);
#endif
- float d = b3Dot3F4(WorldNormal,separatingNormal);
+ float d = b3Dot3F4(WorldNormal, separatingNormal);
if (d > dmax)
{
dmax = d;
@@ -241,79 +233,73 @@ inline int b3ClipHullAgainstHull(const b3Float4& separatingNormal,
once = false;
}
-
- b3Assert(closestFaceB>=0);
+ b3Assert(closestFaceB >= 0);
{
//B3_PROFILE("worldVertsB1");
- const b3GpuFace& polyB = facesB[hullB.m_faceOffset+closestFaceB];
+ const b3GpuFace& polyB = facesB[hullB.m_faceOffset + closestFaceB];
const int numVertices = polyB.m_numIndices;
- for(int e0=0;e0<numVertices;e0++)
+ 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);
+ const b3Float4& b = verticesB[hullB.m_vertexOffset + indicesB[polyB.m_indexOffset + e0]];
+ worldVertsB1[numWorldVertsB1++] = b3TransformPoint(b, posB, ornB);
}
}
- if (closestFaceB>=0)
+ if (closestFaceB >= 0)
{
//B3_PROFILE("clipFaceAgainstHull");
- numContactsOut = b3ClipFaceAgainstHull((b3Float4&)separatingNormal, &hullA,
- posA,ornA,
- worldVertsB1,numWorldVertsB1,worldVertsB2,capacityWorldVerts, minDist, maxDist,
- verticesA, facesA, indicesA,
- contactsOut,contactCapacity);
+ 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<b3RigidBodyData>* bodyBuf,
- b3AlignedObjectArray<b3Contact4Data>* globalContactOut,
- int& nContacts,
-
- const b3AlignedObjectArray<b3ConvexPolyhedronData>& hostConvexDataA,
- const b3AlignedObjectArray<b3ConvexPolyhedronData>& hostConvexDataB,
-
- const b3AlignedObjectArray<b3Vector3>& verticesA,
- const b3AlignedObjectArray<b3Vector3>& uniqueEdgesA,
- const b3AlignedObjectArray<b3GpuFace>& facesA,
- const b3AlignedObjectArray<int>& indicesA,
-
- const b3AlignedObjectArray<b3Vector3>& verticesB,
- const b3AlignedObjectArray<b3Vector3>& uniqueEdgesB,
- const b3AlignedObjectArray<b3GpuFace>& facesB,
- const b3AlignedObjectArray<int>& indicesB,
-
- const b3AlignedObjectArray<b3Collidable>& hostCollidablesA,
- const b3AlignedObjectArray<b3Collidable>& hostCollidablesB,
- const b3Vector3& sepNormalWorldSpace,
- int maxContactCapacity )
+ int bodyIndexA, int bodyIndexB,
+ const b3Float4& posA,
+ const b3Quaternion& ornA,
+ const b3Float4& posB,
+ const b3Quaternion& ornB,
+
+ int collidableIndexA, int collidableIndexB,
+
+ const b3AlignedObjectArray<b3RigidBodyData>* bodyBuf,
+ b3AlignedObjectArray<b3Contact4Data>* globalContactOut,
+ int& nContacts,
+
+ const b3AlignedObjectArray<b3ConvexPolyhedronData>& hostConvexDataA,
+ const b3AlignedObjectArray<b3ConvexPolyhedronData>& hostConvexDataB,
+
+ const b3AlignedObjectArray<b3Vector3>& verticesA,
+ const b3AlignedObjectArray<b3Vector3>& uniqueEdgesA,
+ const b3AlignedObjectArray<b3GpuFace>& facesA,
+ const b3AlignedObjectArray<int>& indicesA,
+
+ const b3AlignedObjectArray<b3Vector3>& verticesB,
+ const b3AlignedObjectArray<b3Vector3>& uniqueEdgesB,
+ const b3AlignedObjectArray<b3GpuFace>& facesB,
+ const b3AlignedObjectArray<int>& indicesB,
+
+ const b3AlignedObjectArray<b3Collidable>& hostCollidablesA,
+ const b3AlignedObjectArray<b3Collidable>& 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);
-
-
+
+ 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;
@@ -321,187 +307,168 @@ inline int b3ClipHullHullSingle(
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);
+ 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;
+ 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));
+ //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)
+ 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;
-
+ // 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);
+ numPoints = b3ReduceContacts(contactsOut, numContactsOut, normalOnSurfaceB, &contactIdx);
}
-
+
b3Assert(numPoints);
-
- if (nContacts<maxContactCapacity)
+
+ 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_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++)
+
+ // 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;
+ 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
+ }
+ else
{
- b3Error("Error: exceeding contact capacity (%d/%d)\n", nContacts,maxContactCapacity);
+ 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<b3RigidBodyData>& rigidBodies,
- const b3AlignedObjectArray<b3Collidable>& collidables,
- const b3AlignedObjectArray<b3ConvexPolyhedronData>& convexShapes,
- const b3AlignedObjectArray<b3Float4>& convexVertices,
- const b3AlignedObjectArray<b3Float4>& uniqueEdges,
- const b3AlignedObjectArray<int>& convexIndices,
- const b3AlignedObjectArray<b3GpuFace>& faces,
- b3AlignedObjectArray<b3Contact4Data>& globalContactsOut,
- int& nGlobalContactsOut,
- int maxContactCapacity)
+ int pairIndex,
+ int bodyIndexA, int bodyIndexB,
+ int collidableIndexA, int collidableIndexB,
+ const b3AlignedObjectArray<b3RigidBodyData>& rigidBodies,
+ const b3AlignedObjectArray<b3Collidable>& collidables,
+ const b3AlignedObjectArray<b3ConvexPolyhedronData>& convexShapes,
+ const b3AlignedObjectArray<b3Float4>& convexVertices,
+ const b3AlignedObjectArray<b3Float4>& uniqueEdges,
+ const b3AlignedObjectArray<int>& convexIndices,
+ const b3AlignedObjectArray<b3GpuFace>& faces,
+ b3AlignedObjectArray<b3Contact4Data>& 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;
-
+ 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);
-
-
+ 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
- );
-
-
+
+ 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,
+ posA, ornA,
+ posB, ornB,
collidableIndexA, collidableIndexB,
- &rigidBodies,
+ &rigidBodies,
&globalContactsOut,
nGlobalContactsOut,
-
+
convexShapes,
convexShapes,
-
- convexVertices,
- uniqueEdges,
+
+ convexVertices,
+ uniqueEdges,
faces,
convexIndices,
-
+
convexVertices,
uniqueEdges,
faces,
@@ -511,10 +478,9 @@ inline int b3ContactConvexConvexSAT(
collidables,
sepNormalWorldSpace,
maxContactCapacity);
-
}
return contactIndex;
}
-#endif //B3_CONTACT_CONVEX_CONVEX_SAT_H
+#endif //B3_CONTACT_CONVEX_CONVEX_SAT_H
diff --git a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ContactSphereSphere.h b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ContactSphereSphere.h
index a3fa82287b..acf7c1b180 100644
--- a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ContactSphereSphere.h
+++ b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ContactSphereSphere.h
@@ -2,32 +2,24 @@
#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)
+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;
@@ -44,63 +36,64 @@ void computeContactSphereConvex(int pairIndex,
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?
+ 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++ )
+ for (int f = 0; f < numFaces; f++)
{
- b3GpuFace face = faces[convexShapes[shapeIndex].m_faceOffset+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);
+ 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)
+ if (dist > radius)
{
bCollide = false;
break;
}
- if ( dist > 0 )
+ if (dist > 0)
{
//might hit an edge or vertex
b3Vector3 out;
bool isInPoly = IsPointInPolygon(spherePos,
- &face,
- &convexVertices[convexShapes[shapeIndex].m_vertexOffset],
- convexIndices,
- &out);
+ &face,
+ &convexVertices[convexShapes[shapeIndex].m_vertexOffset],
+ convexIndices,
+ &out);
if (isInPoly)
{
- if (dist>minDist)
+ if (dist > minDist)
{
minDist = dist;
closestPnt = pntReturn;
localHitNormal = planeEqn;
- region=1;
+ region = 1;
}
- } else
+ }
+ else
{
- b3Vector3 tmp = spherePos-out;
+ b3Vector3 tmp = spherePos - out;
b3Scalar l2 = tmp.length2();
- if (l2<radius*radius)
+ if (l2 < radius * radius)
{
- dist = b3Sqrt(l2);
- if (dist>minDist)
+ dist = b3Sqrt(l2);
+ if (dist > minDist)
{
minDist = dist;
closestPnt = out;
- localHitNormal = tmp/dist;
- region=2;
+ localHitNormal = tmp / dist;
+ region = 2;
}
-
- } else
+ }
+ else
{
bCollide = false;
break;
@@ -109,12 +102,12 @@ void computeContactSphereConvex(int pairIndex,
}
else
{
- if ( dist > minDist )
+ if (dist > minDist)
{
minDist = dist;
closestPnt = pntReturn;
localHitNormal = planeEqn;
- region=3;
+ region = 3;
}
}
}
@@ -123,40 +116,38 @@ void computeContactSphereConvex(int pairIndex,
if (bCollide && minDist > -10000)
{
-
- float4 normalOnSurfaceB1 = tr.getBasis()*localHitNormal;//-hitNormalWorld;
+ 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)
+ float actualDepth = minDist - radius;
+ if (actualDepth < 0)
{
- 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)
+ //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)
-
+ } //if (hasCollision)
}
-#endif //B3_CONTACT_SPHERE_SPHERE_H
+#endif //B3_CONTACT_SPHERE_SPHERE_H
diff --git a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ConvexPolyhedronData.h b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ConvexPolyhedronData.h
index 5c5f4e297f..d5a73bd4f5 100644
--- a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ConvexPolyhedronData.h
+++ b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ConvexPolyhedronData.h
@@ -2,8 +2,6 @@
#ifndef B3_CONVEX_POLYHEDRON_DATA_H
#define B3_CONVEX_POLYHEDRON_DATA_H
-
-
#include "Bullet3Common/shared/b3Float4.h"
#include "Bullet3Common/shared/b3Quat.h"
@@ -21,20 +19,20 @@ typedef struct b3ConvexPolyhedronData b3ConvexPolyhedronData_t;
struct b3ConvexPolyhedronData
{
- b3Float4 m_localCenter;
- b3Float4 m_extents;
- b3Float4 mC;
- b3Float4 mE;
+ b3Float4 m_localCenter;
+ b3Float4 m_extents;
+ b3Float4 mC;
+ b3Float4 mE;
- float m_radius;
- int m_faceOffset;
+ float m_radius;
+ int m_faceOffset;
int m_numFaces;
- int m_numVertices;
+ int m_numVertices;
int m_vertexOffset;
- int m_uniqueEdgesOffset;
- int m_numUniqueEdges;
+ int m_uniqueEdgesOffset;
+ int m_numUniqueEdges;
int m_unused;
};
-#endif //B3_CONVEX_POLYHEDRON_DATA_H
+#endif //B3_CONVEX_POLYHEDRON_DATA_H
diff --git a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3FindConcaveSatAxis.h b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3FindConcaveSatAxis.h
index 89993f3565..983554eb2e 100644
--- a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3FindConcaveSatAxis.h
+++ b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3FindConcaveSatAxis.h
@@ -3,7 +3,6 @@
#define B3_TRIANGLE_NUM_CONVEX_FACES 5
-
#include "Bullet3Common/shared/b3Int4.h"
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h"
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3Collidable.h"
@@ -12,25 +11,24 @@
#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)
+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++)
+ 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])
+ float dp = b3Dot(vertices[hull->m_vertexOffset + i], localDir);
+ if (dp < min[0])
min[0] = dp;
- if(dp > max[0])
+ if (dp > max[0])
max[0] = dp;
}
- if(min[0]>max[0])
+ if (min[0] > max[0])
{
float tmp = min[0];
min[0] = max[0];
@@ -40,53 +38,49 @@ const b3Float4* dir, __global const b3Float4* vertices, float* min, float* max)
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)
+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);
+ 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)
+ if (Max0 < Min1 || Max1 < Min0)
return false;
float d0 = Max0 - Min1;
float d1 = Max1 - Min0;
- *depth = d0<d1 ? d0:d1;
+ *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)
+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;
@@ -102,300 +96,289 @@ bool b3FindSeparatingAxis( const b3ConvexPolyhedronData* hullA, __global const b
}
*/
- int curPlaneTests=0;
+ int curPlaneTests = 0;
{
int numFacesA = hullA->m_numFaces;
// Test normals from hullA
- for(int i=0;i<numFacesA;i++)
+ 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;
+ 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))
+ if (!b3TestSepAxis(hullA, hullB, posA, ornA, posB, ornB, &faceANormalWS, verticesA, verticesB, &d))
return false;
- if(d<*dmin)
+ if (d < *dmin)
{
*dmin = d;
*sep = faceANormalWS;
}
}
}
- if((b3Dot(-DeltaC2,*sep))>0.0f)
+ 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)
+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 curPlaneTests=0;
int curEdgeEdge = 0;
// Test edges
static int maxEdgeTests = 0;
int curEdgeTests = hullA->m_numUniqueEdges * hullB->m_numUniqueEdges;
- if (curEdgeTests >maxEdgeTests )
+ 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);
-
+ 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++)
+ for (int e0 = 0; e0 < hullA->m_numUniqueEdges; e0++)
{
- const b3Float4 edge0 = uniqueEdgesA[hullA->m_uniqueEdgesOffset+e0];
- b3Float4 edge0World = b3QuatRotate(ornA,edge0);
+ const b3Float4 edge0 = uniqueEdgesA[hullA->m_uniqueEdgesOffset + e0];
+ b3Float4 edge0World = b3QuatRotate(ornA, edge0);
- for(int e1=0;e1<hullB->m_numUniqueEdges;e1++)
+ for (int e1 = 0; e1 < hullB->m_numUniqueEdges; e1++)
{
- const b3Float4 edge1 = uniqueEdgesB[hullB->m_uniqueEdgesOffset+e1];
- b3Float4 edge1World = b3QuatRotate(ornB,edge1);
-
+ const b3Float4 edge1 = uniqueEdgesB[hullB->m_uniqueEdgesOffset + e1];
+ b3Float4 edge1World = b3QuatRotate(ornB, edge1);
- b3Float4 crossje = b3Cross(edge0World,edge1World);
+ b3Float4 crossje = b3Cross(edge0World, edge1World);
curEdgeEdge++;
- if(!b3IsAlmostZero(crossje))
+ if (!b3IsAlmostZero(crossje))
{
crossje = b3Normalized(crossje);
- if (b3Dot(DeltaC2,crossje)<0)
+ 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)
+ 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;
+ dist = d0 < d1 ? d0 : d1;
result = true;
-
}
-
- if(dist<*dmin)
+ if (dist < *dmin)
{
*dmin = dist;
*sep = crossje;
}
}
}
-
}
- } else
+ }
+ else
{
- int numDirections = sizeof(unitSphere162)/sizeof(b3Vector3);
+ int numDirections = sizeof(unitSphere162) / sizeof(b3Vector3);
//printf("numDirections =%d\n",numDirections );
-
- for(int i=0;i<numDirections;i++)
+ for (int i = 0; i < numDirections; i++)
{
b3Float4 crossje = unitSphere162[i];
{
@@ -404,23 +387,21 @@ bool b3FindSeparatingAxisEdgeEdge( const b3ConvexPolyhedronData* hullA, __global
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)
+ 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;
+ dist = d0 < d1 ? d0 : d1;
result = true;
-
}
-
- if(dist<*dmin)
+ if (dist < *dmin)
{
*dmin = dist;
*sep = crossje;
@@ -428,50 +409,45 @@ bool b3FindSeparatingAxisEdgeEdge( const b3ConvexPolyhedronData* hullA, __global
}
}
}
-
}
-
- if((b3Dot(-DeltaC2,*sep))>0.0f)
+ 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)
+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;
+ int numWorldVertsB1 = 0;
+
+ int closestFaceB = -1;
float dmax = -FLT_MAX;
-
+
{
- for(int face=0;face<hullB->m_numFaces;face++)
+ 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 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);
+ float d = b3Dot(WorldNormal, separatingNormal);
if (d > dmax)
{
dmax = d;
@@ -479,81 +455,76 @@ inline int b3FindClippingFaces(b3Float4ConstArg separatingNormal,
}
}
}
-
+
{
- const b3GpuFace_t polyB = facesB[hullB->m_faceOffset+closestFaceB];
+ const b3GpuFace_t polyB = facesB[hullB->m_faceOffset + closestFaceB];
const int numVertices = polyB.m_numIndices;
- for(int e0=0;e0<numVertices;e0++)
+ 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);
+ const b3Float4 b = verticesB[hullB->m_vertexOffset + indicesB[polyB.m_indexOffset + e0]];
+ worldVertsB1[pairIndex * capacityWorldVerts + numWorldVertsB1++] = b3TransformPoint(b, posB, ornB);
}
}
-
- int closestFaceA=-1;
+
+ int closestFaceA = -1;
{
float dmin = FLT_MAX;
- for(int face=0;face<hullA->m_numFaces;face++)
+ 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);
+ 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;
+ worldNormalsA1[pairIndex] = faceANormalWS;
}
}
}
-
- int numVerticesA = facesA[hullA->m_faceOffset+closestFaceA].m_numIndices;
- for(int e0=0;e0<numVerticesA;e0++)
+
+ 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;
-
-
+ 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
- )
+__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);
+ /* int i = get_global_id(0);
if (i>=numConcavePairs)
return;
int pairIdx = i;
@@ -568,8 +539,8 @@ __kernel void b3FindConcaveSeparatingAxisKernel( __global b3Int4* concavePairs
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)
+ if (collidables[collidableIndexB].m_shapeType != SHAPE_CONVEX_HULL &&
+ collidables[collidableIndexB].m_shapeType != SHAPE_COMPOUND_OF_CONVEX_HULLS)
{
concavePairs[pairIdx].w = -1;
return;
@@ -577,121 +548,119 @@ __kernel void b3FindConcaveSeparatingAxisKernel( __global b3Int4* concavePairs
hasSeparatingNormals[i] = 0;
-// int numFacesA = convexShapes[shapeIndexA].m_numFaces;
+ // 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);
+ b3Float4 localCenter = b3MakeFloat4(0.f, 0.f, 0.f, 0.f);
- b3GpuFace face = faces[convexShapes[shapeIndexA].m_faceOffset+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);
-
+ 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++)
+ for (int i = 0; i < 3; i++)
{
- int index = indices[face.m_indexOffset+i];
- b3Float4 vert = vertices[convexShapes[shapeIndexA].m_vertexOffset+index];
+ 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);
+ 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 hasSeparatingAxis = 5;
+ b3Float4 sepAxis = b3MakeFloat4(1, 2, 3, 4);
- // int localCC=0;
+ // 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]);
+ 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);
-
+
+ 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;
+ int indicesA[3 + 3 + 2 + 2 + 2];
+ int curUsedIndices = 0;
+ int fidx = 0;
//front size of triangle
{
- facesA[fidx].m_indexOffset=curUsedIndices;
+ facesA[fidx].m_indexOffset = curUsedIndices;
indicesA[0] = 0;
indicesA[1] = 1;
indicesA[2] = 2;
- curUsedIndices+=3;
+ 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;
+ 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_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;
+ 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++)
+ 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);
+
+ 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_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;
@@ -701,8 +670,7 @@ __kernel void b3FindConcaveSeparatingAxisKernel( __global b3Int4* concavePairs
}
}
convexPolyhedronA.m_numFaces = B3_TRIANGLE_NUM_CONVEX_FACES;
- convexPolyhedronA.m_localCenter = localCenter*(1.f/3.f);
-
+ convexPolyhedronA.m_localCenter = localCenter * (1.f / 3.f);
b3Float4 posA = rigidBodies[bodyIndexA].m_pos;
posA.w = 0.f;
@@ -710,23 +678,20 @@ __kernel void b3FindConcaveSeparatingAxisKernel( __global b3Int4* concavePairs
posB.w = 0.f;
b3Quaternion ornA = rigidBodies[bodyIndexA].m_quat;
- b3Quaternion ornB =rigidBodies[bodyIndexB].m_quat;
-
-
-
+ b3Quaternion ornB = rigidBodies[bodyIndexB].m_quat;
///////////////////
///compound shape support
- if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)
+ if (collidables[collidableIndexB].m_shapeType == SHAPE_COMPOUND_OF_CONVEX_HULLS)
{
int compoundChild = concavePairs[pairIdx].w;
- int childShapeIndexB = compoundChild;//collidables[collidableIndexB].m_shapeIndex+compoundChild;
+ 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);
+ b3Float4 newPosB = b3TransformPoint(childPosB, posB, ornB);
+ b3Quaternion newOrnB = b3QuatMul(ornB, childOrnB);
posB = newPosB;
ornB = newOrnB;
shapeIndexB = collidables[childColIndexB].m_shapeIndex;
@@ -736,59 +701,61 @@ __kernel void b3FindConcaveSeparatingAxisKernel( __global b3Int4* concavePairs
b3Float4 c0local = convexPolyhedronA.m_localCenter;
b3Float4 c0 = b3TransformPoint(c0local, posA, ornA);
b3Float4 c1local = convexShapes[shapeIndexB].m_localCenter;
- b3Float4 c1 = b3TransformPoint(c1local,posB,ornB);
+ 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);
+ 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
+ }
+ else
{
- bool sepB = b3FindSeparatingAxis( &convexShapes[shapeIndexB],&convexPolyhedronA,
- posB,ornB,
- posA,ornA,
- DeltaC2,
- vertices,uniqueEdges,faces,indices,
- verticesA,uniqueEdgesA,facesA,indicesA,
- &sepAxis,&dmin);
+ 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
+ }
+ else
{
- bool sepEE = b3FindSeparatingAxisEdgeEdge( &convexPolyhedronA, &convexShapes[shapeIndexB],
- posA,ornA,
- posB,ornB,
- DeltaC2,
- verticesA,uniqueEdgesA,facesA,indicesA,
- vertices,uniqueEdges,faces,indices,
- &sepAxis,&dmin,true);
-
+ 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
+ }
+ else
{
hasSeparatingAxis = 1;
}
}
- }
-
+ }
+
if (hasSeparatingAxis)
{
- hasSeparatingNormals[i]=1;
+ hasSeparatingNormals[i] = 1;
sepAxis.w = dmin;
- concaveSeparatingNormalsOut[pairIdx]=sepAxis;
+ concaveSeparatingNormalsOut[pairIdx] = sepAxis;
//now compute clipping faces A and B, and world-space clipping vertices A and B...
@@ -796,37 +763,35 @@ __kernel void b3FindConcaveSeparatingAxisKernel( __global b3Int4* concavePairs
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
- {
+ &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
-
+#endif //B3_FIND_CONCAVE_SEPARATING_AXIS_H
diff --git a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3FindSeparatingAxis.h b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3FindSeparatingAxis.h
index 332dbc278c..b4981ae654 100644
--- a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3FindSeparatingAxis.h
+++ b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3FindSeparatingAxis.h
@@ -1,28 +1,27 @@
#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<b3Vector3>& vertices, b3Scalar& min, b3Scalar& max)
+inline void b3ProjectAxis(const b3ConvexPolyhedronData& hull, const b3Float4& pos, const b3Quaternion& orn, const b3Float4& dir, const b3AlignedObjectArray<b3Vector3>& vertices, b3Scalar& min, b3Scalar& max)
{
min = FLT_MAX;
max = -FLT_MAX;
int numVerts = hull.m_numVertices;
- const b3Float4 localDir = b3QuatRotate(orn.inverse(),dir);
+ const b3Float4 localDir = b3QuatRotate(orn.inverse(), dir);
- b3Scalar offset = b3Dot3F4(pos,dir);
+ b3Scalar offset = b3Dot3F4(pos, dir);
- for(int i=0;i<numVerts;i++)
+ 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);
+ b3Scalar dp = b3Dot3F4((b3Float4&)vertices[hull.m_vertexOffset + i], localDir);
//b3Assert(dp==dpL);
- if(dp < min) min = dp;
- if(dp > max) max = dp;
+ if (dp < min) min = dp;
+ if (dp > max) max = dp;
}
- if(min>max)
+ if (min > max)
{
b3Scalar tmp = min;
min = max;
@@ -32,44 +31,42 @@ inline void b3ProjectAxis(const b3ConvexPolyhedronData& hull, const b3Float4& p
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<b3Vector3>& verticesA,const b3AlignedObjectArray<b3Vector3>& verticesB,b3Scalar& depth)
+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<b3Vector3>& verticesA, const b3AlignedObjectArray<b3Vector3>& 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);
+ 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)
+ if (Max0 < Min1 || Max1 < Min0)
return false;
b3Scalar d0 = Max0 - Min1;
- b3Assert(d0>=0.0f);
+ b3Assert(d0 >= 0.0f);
b3Scalar d1 = Max1 - Min0;
- b3Assert(d1>=0.0f);
- depth = d0<d1 ? d0:d1;
+ 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<b3Vector3>& verticesA,
- const b3AlignedObjectArray<b3Vector3>& uniqueEdgesA,
- const b3AlignedObjectArray<b3GpuFace>& facesA,
- const b3AlignedObjectArray<int>& indicesA,
- const b3AlignedObjectArray<b3Vector3>& verticesB,
- const b3AlignedObjectArray<b3Vector3>& uniqueEdgesB,
- const b3AlignedObjectArray<b3GpuFace>& facesB,
- const b3AlignedObjectArray<int>& indicesB,
-
- b3Vector3& sep)
+inline bool b3FindSeparatingAxis(const b3ConvexPolyhedronData& hullA, const b3ConvexPolyhedronData& hullB,
+ const b3Float4& posA1,
+ const b3Quaternion& ornA,
+ const b3Float4& posB1,
+ const b3Quaternion& ornB,
+ const b3AlignedObjectArray<b3Vector3>& verticesA,
+ const b3AlignedObjectArray<b3Vector3>& uniqueEdgesA,
+ const b3AlignedObjectArray<b3GpuFace>& facesA,
+ const b3AlignedObjectArray<int>& indicesA,
+ const b3AlignedObjectArray<b3Vector3>& verticesB,
+ const b3AlignedObjectArray<b3Vector3>& uniqueEdgesB,
+ const b3AlignedObjectArray<b3GpuFace>& facesB,
+ const b3AlignedObjectArray<int>& indicesB,
+
+ b3Vector3& sep)
{
B3_PROFILE("findSeparatingAxis");
@@ -77,42 +74,41 @@ inline bool b3FindSeparatingAxis( const b3ConvexPolyhedronData& hullA, const b3C
posA.w = 0.f;
b3Float4 posB = posB1;
posB.w = 0.f;
-//#ifdef TEST_INTERNAL_OBJECTS
+ //#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);
+ b3Float4 c1 = b3TransformPoint(c1local, posB, ornB);
const b3Float4 deltaC2 = c0 - c1;
-//#endif
+ //#endif
b3Scalar dmin = FLT_MAX;
- int curPlaneTests=0;
+ int curPlaneTests = 0;
int numFacesA = hullA.m_numFaces;
// Test normals from hullA
- for(int i=0;i<numFacesA;i++)
+ for (int i = 0; i < numFacesA; i++)
{
- const b3Float4& normal = (b3Float4&)facesA[hullA.m_faceOffset+i].m_plane;
- b3Float4 faceANormalWS = b3QuatRotate(ornA,normal);
+ const b3Float4& normal = (b3Float4&)facesA[hullA.m_faceOffset + i].m_plane;
+ b3Float4 faceANormalWS = b3QuatRotate(ornA, normal);
- if (b3Dot3F4(deltaC2,faceANormalWS)<0)
- faceANormalWS*=-1.f;
+ if (b3Dot3F4(deltaC2, faceANormalWS) < 0)
+ faceANormalWS *= -1.f;
curPlaneTests++;
#ifdef TEST_INTERNAL_OBJECTS
gExpectedNbTests++;
- if(gUseInternalObject && !TestInternalObjects(transA,transB, DeltaC2, faceANormalWS, hullA, hullB, dmin))
+ 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))
+ if (!b3TestSepAxis(hullA, hullB, posA, ornA, posB, ornB, faceANormalWS, verticesA, verticesB, d))
return false;
- if(d<dmin)
+ if (d < dmin)
{
dmin = d;
sep = (b3Vector3&)faceANormalWS;
@@ -121,86 +117,81 @@ inline bool b3FindSeparatingAxis( const b3ConvexPolyhedronData& hullA, const b3C
int numFacesB = hullB.m_numFaces;
// Test normals from hullB
- for(int i=0;i<numFacesB;i++)
+ for (int i = 0; i < numFacesB; i++)
{
- b3Float4 normal = (b3Float4&)facesB[hullB.m_faceOffset+i].m_plane;
+ b3Float4 normal = (b3Float4&)facesB[hullB.m_faceOffset + i].m_plane;
b3Float4 WorldNormal = b3QuatRotate(ornB, normal);
- if (b3Dot3F4(deltaC2,WorldNormal)<0)
+ if (b3Dot3F4(deltaC2, WorldNormal) < 0)
{
- WorldNormal*=-1.f;
+ WorldNormal *= -1.f;
}
curPlaneTests++;
#ifdef TEST_INTERNAL_OBJECTS
gExpectedNbTests++;
- if(gUseInternalObject && !TestInternalObjects(transA,transB,DeltaC2, WorldNormal, hullA, hullB, dmin))
+ 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))
+ if (!b3TestSepAxis(hullA, hullB, posA, ornA, posB, ornB, WorldNormal, verticesA, verticesB, d))
return false;
- if(d<dmin)
+ if (d < dmin)
{
dmin = d;
sep = (b3Vector3&)WorldNormal;
}
}
-// b3Vector3 edgeAstart,edgeAend,edgeBstart,edgeBend;
+ // b3Vector3 edgeAstart,edgeAend,edgeBstart,edgeBend;
int curEdgeEdge = 0;
// Test edges
- for(int e0=0;e0<hullA.m_numUniqueEdges;e0++)
+ for (int e0 = 0; e0 < hullA.m_numUniqueEdges; e0++)
{
- const b3Float4& edge0 = (b3Float4&) uniqueEdgesA[hullA.m_uniqueEdgesOffset+e0];
- b3Float4 edge0World = b3QuatRotate(ornA,(b3Float4&)edge0);
+ const b3Float4& edge0 = (b3Float4&)uniqueEdgesA[hullA.m_uniqueEdgesOffset + e0];
+ b3Float4 edge0World = b3QuatRotate(ornA, (b3Float4&)edge0);
- for(int e1=0;e1<hullB.m_numUniqueEdges;e1++)
+ for (int e1 = 0; e1 < hullB.m_numUniqueEdges; e1++)
{
- const b3Vector3 edge1 = uniqueEdgesB[hullB.m_uniqueEdgesOffset+e1];
- b3Float4 edge1World = b3QuatRotate(ornB,(b3Float4&)edge1);
-
+ const b3Vector3 edge1 = uniqueEdgesB[hullB.m_uniqueEdgesOffset + e1];
+ b3Float4 edge1World = b3QuatRotate(ornB, (b3Float4&)edge1);
- b3Float4 crossje = b3Cross3(edge0World,edge1World);
+ b3Float4 crossje = b3Cross3(edge0World, edge1World);
curEdgeEdge++;
- if(!b3IsAlmostZero((b3Vector3&)crossje))
+ if (!b3IsAlmostZero((b3Vector3&)crossje))
{
crossje = b3FastNormalized3(crossje);
- if (b3Dot3F4(deltaC2,crossje)<0)
- crossje*=-1.f;
-
+ if (b3Dot3F4(deltaC2, crossje) < 0)
+ crossje *= -1.f;
#ifdef TEST_INTERNAL_OBJECTS
gExpectedNbTests++;
- if(gUseInternalObject && !TestInternalObjects(transA,transB,DeltaC2, Cross, hullA, hullB, dmin))
+ 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))
+ if (!b3TestSepAxis(hullA, hullB, posA, ornA, posB, ornB, crossje, verticesA, verticesB, dist))
return false;
- if(dist<dmin)
+ if (dist < dmin)
{
dmin = dist;
sep = (b3Vector3&)crossje;
}
}
}
-
}
-
- if((b3Dot3F4(-deltaC2,(b3Float4&)sep))>0.0f)
+ if ((b3Dot3F4(-deltaC2, (b3Float4&)sep)) > 0.0f)
sep = -sep;
return true;
}
-#endif //B3_FIND_SEPARATING_AXIS_H
-
+#endif //B3_FIND_SEPARATING_AXIS_H
diff --git a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3MprPenetration.h b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3MprPenetration.h
index 6c3ad7c9dd..a3bfbf2995 100644
--- a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3MprPenetration.h
+++ b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3MprPenetration.h
@@ -15,9 +15,6 @@
* See the License for more information.
*/
-
-
-
#ifndef B3_MPR_PENETRATION_H
#define B3_MPR_PENETRATION_H
@@ -27,9 +24,6 @@
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3ConvexPolyhedronData.h"
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3Collidable.h"
-
-
-
#ifdef __cplusplus
#define B3_MPR_SQRT sqrtf
#else
@@ -41,196 +35,171 @@
#define B3_MPR_TOLERANCE 1E-6f
#define B3_MPR_MAX_ITERATIONS 1000
-struct _b3MprSupport_t
+struct _b3MprSupport_t
{
- b3Float4 v; //!< Support point in minkowski sum
- b3Float4 v1; //!< Support point in obj1
- b3Float4 v2; //!< Support point in obj2
+ 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
+struct _b3MprSimplex_t
{
- b3MprSupport_t ps[4];
- int last; //!< index of last added point
+ 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)
+inline b3MprSupport_t *b3MprSimplexPointW(b3MprSimplex_t *s, int idx)
{
- return &s->ps[idx];
+ return &s->ps[idx];
}
inline void b3MprSimplexSetSize(b3MprSimplex_t *s, int size)
{
- s->last = size - 1;
+ s->last = size - 1;
}
-
inline int b3MprSimplexSize(const b3MprSimplex_t *s)
{
- return s->last + 1;
+ return s->last + 1;
}
-
-inline const b3MprSupport_t* b3MprSimplexPoint(const b3MprSimplex_t* s, int idx)
+inline const b3MprSupport_t *b3MprSimplexPoint(const b3MprSimplex_t *s, int idx)
{
- // here is no check on boundaries
- return &s->ps[idx];
+ // here is no check on boundaries
+ return &s->ps[idx];
}
inline void b3MprSupportCopy(b3MprSupport_t *d, const b3MprSupport_t *s)
{
- *d = *s;
+ *d = *s;
}
inline void b3MprSimplexSet(b3MprSimplex_t *s, size_t pos, const b3MprSupport_t *a)
{
- b3MprSupportCopy(s->ps + pos, a);
+ b3MprSupportCopy(s->ps + pos, a);
}
-
inline void b3MprSimplexSwap(b3MprSimplex_t *s, size_t pos1, size_t pos2)
{
- b3MprSupport_t supp;
+ b3MprSupport_t supp;
- b3MprSupportCopy(&supp, &s->ps[pos1]);
- b3MprSupportCopy(&s->ps[pos1], &s->ps[pos2]);
- b3MprSupportCopy(&s->ps[pos2], &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;
+ return B3_MPR_FABS(val) < FLT_EPSILON;
}
-
-
inline int b3MprEq(float _a, float _b)
{
- float ab;
- float a, b;
+ float ab;
+ float a, b;
- ab = B3_MPR_FABS(_a - _b);
- if (B3_MPR_FABS(ab) < FLT_EPSILON)
- return 1;
+ 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;
- }
+ 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)
+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);
+ 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)
+inline b3Float4 b3LocalGetSupportVertex(b3Float4ConstArg supportVec, __global const b3ConvexPolyhedronData_t *hull, b3ConstArray(b3Float4) verticesA)
{
- b3Float4 supVec = b3MakeFloat4(0,0,0,0);
+ b3Float4 supVec = b3MakeFloat4(0, 0, 0, 0);
float maxDot = -B3_LARGE_FLOAT;
- if( 0 < hull->m_numVertices )
- {
- const b3Float4 scaled = supportVec;
+ 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;
+ 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)
+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);
-
+
+ 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];
-
+
+ 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);
+ // b3Float4 supVec = b3MakeFloat4(0,0,0,0);
float maxDot = -B3_LARGE_FLOAT;
- if( 0 < hull->m_numVertices )
+ 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];
-
+ pInA = cpuVertices[hull->m_vertexOffset + index];
}
-
-
- } else
+ }
+ else
{
- pInA = b3LocalGetSupportVertex(localDir,hull,cpuVertices);
+ pInA = b3LocalGetSupportVertex(localDir, hull, cpuVertices);
}
//move vertex to world space
- *outp = b3TransformPoint(pInA,pos,orn);
-
+ *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)
+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;
+ 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;
+ 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->v1 = cpuBodyBuf[bodyIndexA].m_pos;
center->v2 = cpuBodyBuf[bodyIndexB].m_pos;
- center->v = center->v1 - center->v2;
+ center->v = center->v1 - center->v2;
}
inline void b3MprVec3Set(b3Float4 *v, float x, float y, float z)
@@ -243,48 +212,45 @@ inline void b3MprVec3Set(b3Float4 *v, float x, float y, float z)
inline void b3MprVec3Add(b3Float4 *v, const b3Float4 *w)
{
- (*v).x += (*w).x;
- (*v).y += (*w).y;
- (*v).z += (*w).z;
+ (*v).x += (*w).x;
+ (*v).y += (*w).y;
+ (*v).z += (*w).z;
}
inline void b3MprVec3Copy(b3Float4 *v, const b3Float4 *w)
{
- *v = *w;
+ *v = *w;
}
inline void b3MprVec3Scale(b3Float4 *d, float k)
{
- *d *= k;
+ *d *= k;
}
inline float b3MprVec3Dot(const b3Float4 *a, const b3Float4 *b)
{
- float dot;
+ float dot;
- dot = b3Dot3F4(*a,*b);
- return dot;
+ dot = b3Dot3F4(*a, *b);
+ return dot;
}
-
inline float b3MprVec3Len2(const b3Float4 *v)
{
- return b3MprVec3Dot(v, v);
+ return b3MprVec3Dot(v, v);
}
inline void b3MprVec3Normalize(b3Float4 *d)
{
- float k = 1.f / B3_MPR_SQRT(b3MprVec3Len2(d));
- b3MprVec3Scale(d, k);
+ 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);
-
+ *d = b3Cross3(*a, *b);
}
-
inline void b3MprVec3Sub2(b3Float4 *d, const b3Float4 *v, const b3Float4 *w)
{
*d = *v - *w;
@@ -292,629 +258,631 @@ inline void b3MprVec3Sub2(b3Float4 *d, const b3Float4 *v, const b3Float4 *w)
inline void b3PortalDir(const b3MprSimplex_t *portal, b3Float4 *dir)
{
- b3Float4 v2v1, v3v1;
+ 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);
+ 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)
+ const b3Float4 *dir)
{
- float dot;
- dot = b3MprVec3Dot(dir, &b3MprSimplexPoint(portal, 1)->v);
- return b3MprIsZero(dot) || dot > 0.f;
+ 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)
+ const b3MprSupport_t *v4,
+ const b3Float4 *dir)
{
- float dv1, dv2, dv3, dv4;
- float dot1, dot2, dot3;
+ float dv1, dv2, dv3, dv4;
+ float dot1, dot2, dot3;
- // find the smallest dot product of dir and {v1-v4, v2-v4, v3-v4}
+ // 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);
+ 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 = dv4 - dv1;
+ dot2 = dv4 - dv2;
+ dot3 = dv4 - dv3;
- dot1 = B3_MPR_FMIN(dot1, dot2);
- dot1 = B3_MPR_FMIN(dot1, dot3);
+ dot1 = B3_MPR_FMIN(dot1, dot2);
+ dot1 = B3_MPR_FMIN(dot1, dot3);
- return b3MprEq(dot1, B3_MPR_TOLERANCE) || dot1 < B3_MPR_TOLERANCE;
+ return b3MprEq(dot1, B3_MPR_TOLERANCE) || dot1 < B3_MPR_TOLERANCE;
}
-inline int portalCanEncapsuleOrigin(const b3MprSimplex_t *portal,
- const b3MprSupport_t *v4,
- const b3Float4 *dir)
+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;
+ 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)
+ 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)
{
- // compute direction outside the portal (from v0 throught v1,v2,v3
- // face)
- b3PortalDir(portal, &dir);
+ 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);
+ }
+ }
+}
- // test if origin is inside the portal
- if (portalEncapsulesOrigin(portal, &dir))
- return 0;
+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;
- // get next support point
-
- b3MprSupport(pairIndex,bodyIndexA,bodyIndexB,cpuBodyBuf,cpuConvexData,cpuCollidables,cpuVertices, sepAxis,&dir, &v4);
+ // 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;
- // 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))
+ 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))
{
- return -1;
- }
+ // 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));
- // v1-v2-v3 triangle must be rearranged to face outside Minkowski
- // difference (direction from v0).
- b3ExpandPortal(portal, &v4);
- }
+ dot = b3MprVec3Dot(&b3MprSimplexPoint(portal, 3)->v, &dir);
+ if (b3MprIsZero(dot) || dot < 0.f)
+ return -1;
- 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 void b3FindPos(const b3MprSimplex_t *portal, b3Float4 *pos)
+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;
- b3Float4 zero = b3MakeFloat4(0,0,0,0);
- b3Float4* b3mpr_vec3_origin = &zero;
+ 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);
- b3Float4 dir;
- size_t i;
- float b[4], sum, inv;
- b3Float4 vec, p1, p2;
+ // test if origin is inside the portal
+ if (portalEncapsulesOrigin(portal, &dir))
+ return 0;
- b3PortalDir(portal, &dir);
+ // get next support point
- // 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);
+ b3MprSupport(pairIndex, bodyIndexA, bodyIndexB, cpuBodyBuf, cpuConvexData, cpuCollidables, cpuVertices, sepAxis, &dir, &v4);
- b3MprVec3Cross(&vec, &b3MprSimplexPoint(portal, 3)->v,
- &b3MprSimplexPoint(portal, 2)->v);
- b[1] = b3MprVec3Dot(&vec, &b3MprSimplexPoint(portal, 0)->v);
+ // 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;
+ }
- b3MprVec3Cross(&vec, &b3MprSimplexPoint(portal, 0)->v,
- &b3MprSimplexPoint(portal, 1)->v);
- b[2] = b3MprVec3Dot(&vec, &b3MprSimplexPoint(portal, 3)->v);
+ // v1-v2-v3 triangle must be rearranged to face outside Minkowski
+ // difference (direction from v0).
+ b3ExpandPortal(portal, &v4);
+ }
- b3MprVec3Cross(&vec, &b3MprSimplexPoint(portal, 2)->v,
- &b3MprSimplexPoint(portal, 1)->v);
- b[3] = b3MprVec3Dot(&vec, &b3MprSimplexPoint(portal, 0)->v);
+ 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){
+ 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);
+ 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(&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(&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);
+ 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);
+ 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;
-}
+ 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)
+ 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);
+ // 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)
+ // 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);
-
+ *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);
+ // barycentric coordinates:
+ b3FindPos(portal, pos);
- return;
- }
+ return;
+ }
- b3ExpandPortal(portal, &v4);
+ b3ExpandPortal(portal, &v4);
- iterations++;
- }
+ iterations++;
+ }
}
-B3_STATIC void b3FindPenetrTouch(b3MprSimplex_t *portal,float *depth, b3Float4 *dir, b3Float4 *pos)
+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;
-
+ // 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);
+ 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)
+ float *depth, b3Float4 *dir, b3Float4 *pos)
{
-
- // Origin lies on v0-v1 segment.
- // Depth is distance to v1, direction also and position must be
- // computed
+ // 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(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);
+ 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])
+ 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;
+ int res;
+
+ // Phase 1: Portal discovery
+ res = b3DiscoverPortal(pairIndex, bodyIndexA, bodyIndexB, cpuBodyBuf, cpuConvexData, cpuCollidables, cpuVertices, sepAxis, hasSepAxis, &portal);
- // 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:
+ case 0:
{
// Phase 2: Portal refinement
-
- res = b3RefinePortal(pairIndex,bodyIndexA,bodyIndexB,cpuBodyBuf,cpuConvexData,cpuCollidables,cpuVertices, sepAxis,&portal);
+
+ 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);
+ b3FindPenetr(pairIndex, bodyIndexA, bodyIndexB, cpuBodyBuf, cpuConvexData, cpuCollidables, cpuVertices, sepAxis, &portal, depthOut, dirOut, posOut);
hasSepAxis[pairIndex] = 1;
sepAxis[pairIndex] = -*dirOut;
break;
}
- case 1:
+ case 1:
{
- // Touching contact on portal's v1.
+ // Touching contact on portal's v1.
b3FindPenetrTouch(&portal, depthOut, dirOut, posOut);
break;
}
- case 2:
+ case 2:
{
-
- b3FindPenetrSegment( &portal, depthOut, dirOut, posOut);
+ b3FindPenetrSegment(&portal, depthOut, dirOut, posOut);
break;
}
- default:
+ default:
{
- hasSepAxis[pairIndex]=0;
+ hasSepAxis[pairIndex] = 0;
//if (res < 0)
//{
- // Origin isn't inside portal - no collision.
- return -1;
+ // Origin isn't inside portal - no collision.
+ return -1;
//}
}
};
-
+
return 0;
};
-
-
-#endif //B3_MPR_PENETRATION_H
+#endif //B3_MPR_PENETRATION_H
diff --git a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3NewContactReduction.h b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3NewContactReduction.h
index 718222ebca..6e991e14b0 100644
--- a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3NewContactReduction.h
+++ b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3NewContactReduction.h
@@ -8,189 +8,168 @@
#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);
+ 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++)
+ 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;
-
+
+ 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
- )
+__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 i = get_global_id(0);
//int pairIndex = i;
int i = pairIndex;
- b3Int4 contactIdx;
- contactIdx=b3MakeInt4(0,1,2,3);
-
- if (i<numPairs)
+ 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 (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_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:
- {
- }
- };
-
+ 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 (i<numPairs)
-
-
-
+ }
+
+ //#endif
+
+ } // if (numContactsOut>0)
+ } // if (hasSeparatingAxis[i])
+ } // if (i<numPairs)
}
#endif
diff --git a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3QuantizedBvhNodeData.h b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3QuantizedBvhNodeData.h
index 3661e43cf1..ba796eac72 100644
--- a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3QuantizedBvhNodeData.h
+++ b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3QuantizedBvhNodeData.h
@@ -14,57 +14,56 @@ typedef struct b3QuantizedBvhNodeData b3QuantizedBvhNodeData_t;
struct b3QuantizedBvhNodeData
{
//12 bytes
- unsigned short int m_quantizedAabbMin[3];
- unsigned short int m_quantizedAabbMax[3];
+ unsigned short int m_quantizedAabbMin[3];
+ unsigned short int m_quantizedAabbMax[3];
//4 bytes
- int m_escapeIndexOrTriangleIndex;
+ int m_escapeIndexOrTriangleIndex;
};
-inline int b3GetTriangleIndex(const b3QuantizedBvhNodeData* rootNode)
+inline int b3GetTriangleIndex(const b3QuantizedBvhNodeData* rootNode)
{
- unsigned int x=0;
- unsigned int y = (~(x&0))<<(31-B3_MAX_NUM_PARTS_IN_BITS);
+ unsigned int x = 0;
+ unsigned int y = (~(x & 0)) << (31 - B3_MAX_NUM_PARTS_IN_BITS);
// Get only the lower bits where the triangle index is stored
- return (rootNode->m_escapeIndexOrTriangleIndex&~(y));
+ return (rootNode->m_escapeIndexOrTriangleIndex & ~(y));
}
inline int b3IsLeaf(const b3QuantizedBvhNodeData* rootNode)
{
//skipindex is negative (internal node), triangleindex >=0 (leafnode)
- return (rootNode->m_escapeIndexOrTriangleIndex >= 0)? 1 : 0;
+ 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)
+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 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 + 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));
+ 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)
+ 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])
@@ -86,5 +85,4 @@ inline int b3TestQuantizedAabbAgainstQuantizedAabbSlow(
//return overlap;
}
-
-#endif //B3_QUANTIZED_BVH_NODE_H
+#endif //B3_QUANTIZED_BVH_NODE_H
diff --git a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ReduceContacts.h b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ReduceContacts.h
index 35b5197006..c108255b9f 100644
--- a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ReduceContacts.h
+++ b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3ReduceContacts.h
@@ -3,95 +3,87 @@
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);
+ 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++)
+ 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;
-
+
+ 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
+#endif //B3_REDUCE_CONTACTS_H
diff --git a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h
index 50632c871f..663e946fc1 100644
--- a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h
+++ b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h
@@ -7,18 +7,17 @@
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;
+ 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;
@@ -29,6 +28,4 @@ struct b3InertiaData
b3Mat3x3 m_initInvInertia;
};
-
-#endif //B3_RIGIDBODY_DATA_H
- \ No newline at end of file
+#endif //B3_RIGIDBODY_DATA_H
diff --git a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3UpdateAabbs.h b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3UpdateAabbs.h
index 8d40d19a03..e0c3a5cf97 100644
--- a/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3UpdateAabbs.h
+++ b/thirdparty/bullet/Bullet3Collision/NarrowPhaseCollision/shared/b3UpdateAabbs.h
@@ -1,40 +1,35 @@
#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)
+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;
-
+ b3Quat orientation = body->m_quat;
+
int collidableIndex = body->m_collidableIdx;
int shapeIndex = collidables[collidableIndex].m_shapeIndex;
-
- if (shapeIndex>=0)
+
+ if (shapeIndex >= 0)
{
-
b3Aabb_t localAabb = localShapeAABB[collidableIndex];
b3Aabb_t worldAabb;
-
- b3Float4 aabbAMinOut,aabbAMaxOut;
+
+ b3Float4 aabbAMinOut, aabbAMaxOut;
float margin = 0.f;
- b3TransformAabb2(localAabb.m_minVec,localAabb.m_maxVec,margin,position,orientation,&aabbAMinOut,&aabbAMaxOut);
-
- worldAabb.m_minVec =aabbAMinOut;
+ 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;
+ worldAabb.m_signedMaxIndices[3] = body[bodyId].m_invMass == 0.f ? 0 : 1;
worldAabbs[bodyId] = worldAabb;
}
}
-#endif //B3_UPDATE_AABBS_H
+#endif //B3_UPDATE_AABBS_H
diff --git a/thirdparty/bullet/Bullet3Common/b3AlignedAllocator.cpp b/thirdparty/bullet/Bullet3Common/b3AlignedAllocator.cpp
index b98e2b4d33..d546d5e066 100644
--- a/thirdparty/bullet/Bullet3Common/b3AlignedAllocator.cpp
+++ b/thirdparty/bullet/Bullet3Common/b3AlignedAllocator.cpp
@@ -15,9 +15,11 @@ subject to the following restrictions:
#include "b3AlignedAllocator.h"
+#ifdef B3_ALLOCATOR_STATISTICS
int b3g_numAlignedAllocs = 0;
int b3g_numAlignedFree = 0;
-int b3g_totalBytesAlignedAllocs = 0;//detect memory leaks
+int b3g_totalBytesAlignedAllocs = 0; //detect memory leaks
+#endif
static void *b3AllocDefault(size_t size)
{
@@ -29,12 +31,10 @@ static void b3FreeDefault(void *ptr)
free(ptr);
}
-static b3AllocFunc* b3s_allocFunc = b3AllocDefault;
-static b3FreeFunc* b3s_freeFunc = b3FreeDefault;
-
-
+static b3AllocFunc *b3s_allocFunc = b3AllocDefault;
+static b3FreeFunc *b3s_freeFunc = b3FreeDefault;
-#if defined (B3_HAS_ALIGNED_ALLOCATOR)
+#if defined(B3_HAS_ALIGNED_ALLOCATOR)
#include <malloc.h>
static void *b3AlignedAllocDefault(size_t size, int alignment)
{
@@ -59,123 +59,128 @@ static inline void b3AlignedFreeDefault(void *ptr)
}
#else
-
-
-
-
static inline void *b3AlignedAllocDefault(size_t size, int alignment)
{
- void *ret;
- char *real;
- real = (char *)b3s_allocFunc(size + sizeof(void *) + (alignment-1));
- if (real) {
- ret = b3AlignPointer(real + sizeof(void *),alignment);
- *((void **)(ret)-1) = (void *)(real);
- } else {
- ret = (void *)(real);
- }
- return (ret);
+ void *ret;
+ char *real;
+ real = (char *)b3s_allocFunc(size + sizeof(void *) + (alignment - 1));
+ if (real)
+ {
+ ret = b3AlignPointer(real + sizeof(void *), alignment);
+ *((void **)(ret)-1) = (void *)(real);
+ }
+ else
+ {
+ ret = (void *)(real);
+ }
+ return (ret);
}
static inline void b3AlignedFreeDefault(void *ptr)
{
- void* real;
+ void *real;
- if (ptr) {
- real = *((void **)(ptr)-1);
- b3s_freeFunc(real);
- }
+ if (ptr)
+ {
+ real = *((void **)(ptr)-1);
+ b3s_freeFunc(real);
+ }
}
#endif
-
-static b3AlignedAllocFunc* b3s_alignedAllocFunc = b3AlignedAllocDefault;
-static b3AlignedFreeFunc* b3s_alignedFreeFunc = b3AlignedFreeDefault;
+static b3AlignedAllocFunc *b3s_alignedAllocFunc = b3AlignedAllocDefault;
+static b3AlignedFreeFunc *b3s_alignedFreeFunc = b3AlignedFreeDefault;
void b3AlignedAllocSetCustomAligned(b3AlignedAllocFunc *allocFunc, b3AlignedFreeFunc *freeFunc)
{
- b3s_alignedAllocFunc = allocFunc ? allocFunc : b3AlignedAllocDefault;
- b3s_alignedFreeFunc = freeFunc ? freeFunc : b3AlignedFreeDefault;
+ b3s_alignedAllocFunc = allocFunc ? allocFunc : b3AlignedAllocDefault;
+ b3s_alignedFreeFunc = freeFunc ? freeFunc : b3AlignedFreeDefault;
}
void b3AlignedAllocSetCustom(b3AllocFunc *allocFunc, b3FreeFunc *freeFunc)
{
- b3s_allocFunc = allocFunc ? allocFunc : b3AllocDefault;
- b3s_freeFunc = freeFunc ? freeFunc : b3FreeDefault;
+ b3s_allocFunc = allocFunc ? allocFunc : b3AllocDefault;
+ b3s_freeFunc = freeFunc ? freeFunc : b3FreeDefault;
}
#ifdef B3_DEBUG_MEMORY_ALLOCATIONS
//this generic allocator provides the total allocated number of bytes
#include <stdio.h>
-void* b3AlignedAllocInternal (size_t size, int alignment,int line,char* filename)
+void *b3AlignedAllocInternal(size_t size, int alignment, int line, char *filename)
{
- void *ret;
- char *real;
-
- b3g_totalBytesAlignedAllocs += size;
- b3g_numAlignedAllocs++;
-
-
- real = (char *)b3s_allocFunc(size + 2*sizeof(void *) + (alignment-1));
- if (real) {
- ret = (void*) b3AlignPointer(real + 2*sizeof(void *), alignment);
- *((void **)(ret)-1) = (void *)(real);
- *((int*)(ret)-2) = size;
-
- } else {
- ret = (void *)(real);//??
- }
+ void *ret;
+ char *real;
+#ifdef B3_ALLOCATOR_STATISTICS
+ b3g_totalBytesAlignedAllocs += size;
+ b3g_numAlignedAllocs++;
+#endif
+ real = (char *)b3s_allocFunc(size + 2 * sizeof(void *) + (alignment - 1));
+ if (real)
+ {
+ ret = (void *)b3AlignPointer(real + 2 * sizeof(void *), alignment);
+ *((void **)(ret)-1) = (void *)(real);
+ *((int *)(ret)-2) = size;
+ }
+ else
+ {
+ ret = (void *)(real); //??
+ }
- b3Printf("allocation#%d at address %x, from %s,line %d, size %d\n",b3g_numAlignedAllocs,real, filename,line,size);
+ b3Printf("allocation#%d at address %x, from %s,line %d, size %d\n", b3g_numAlignedAllocs, real, filename, line, size);
- int* ptr = (int*)ret;
- *ptr = 12;
- return (ret);
+ int *ptr = (int *)ret;
+ *ptr = 12;
+ return (ret);
}
-void b3AlignedFreeInternal (void* ptr,int line,char* filename)
+void b3AlignedFreeInternal(void *ptr, int line, char *filename)
{
+ void *real;
+#ifdef B3_ALLOCATOR_STATISTICS
+ b3g_numAlignedFree++;
+#endif
+ if (ptr)
+ {
+ real = *((void **)(ptr)-1);
+ int size = *((int *)(ptr)-2);
+#ifdef B3_ALLOCATOR_STATISTICS
+ b3g_totalBytesAlignedAllocs -= size;
+#endif
+ b3Printf("free #%d at address %x, from %s,line %d, size %d\n", b3g_numAlignedFree, real, filename, line, size);
- void* real;
- b3g_numAlignedFree++;
-
- if (ptr) {
- real = *((void **)(ptr)-1);
- int size = *((int*)(ptr)-2);
- b3g_totalBytesAlignedAllocs -= size;
-
- b3Printf("free #%d at address %x, from %s,line %d, size %d\n",b3g_numAlignedFree,real, filename,line,size);
-
- b3s_freeFunc(real);
- } else
- {
- b3Printf("NULL ptr\n");
- }
+ b3s_freeFunc(real);
+ }
+ else
+ {
+ b3Printf("NULL ptr\n");
+ }
}
-#else //B3_DEBUG_MEMORY_ALLOCATIONS
+#else //B3_DEBUG_MEMORY_ALLOCATIONS
-void* b3AlignedAllocInternal (size_t size, int alignment)
+void *b3AlignedAllocInternal(size_t size, int alignment)
{
+#ifdef B3_ALLOCATOR_STATISTICS
b3g_numAlignedAllocs++;
- void* ptr;
+#endif
+ void *ptr;
ptr = b3s_alignedAllocFunc(size, alignment);
-// b3Printf("b3AlignedAllocInternal %d, %x\n",size,ptr);
+ // b3Printf("b3AlignedAllocInternal %d, %x\n",size,ptr);
return ptr;
}
-void b3AlignedFreeInternal (void* ptr)
+void b3AlignedFreeInternal(void *ptr)
{
if (!ptr)
{
return;
}
-
+#ifdef B3_ALLOCATOR_STATISTICS
b3g_numAlignedFree++;
-// b3Printf("b3AlignedFreeInternal %x\n",ptr);
+#endif
+ // b3Printf("b3AlignedFreeInternal %x\n",ptr);
b3s_alignedFreeFunc(ptr);
}
-#endif //B3_DEBUG_MEMORY_ALLOCATIONS
-
+#endif //B3_DEBUG_MEMORY_ALLOCATIONS
diff --git a/thirdparty/bullet/Bullet3Common/b3AlignedAllocator.h b/thirdparty/bullet/Bullet3Common/b3AlignedAllocator.h
index be418bd55f..bcff9f128e 100644
--- a/thirdparty/bullet/Bullet3Common/b3AlignedAllocator.h
+++ b/thirdparty/bullet/Bullet3Common/b3AlignedAllocator.h
@@ -24,84 +24,87 @@ subject to the following restrictions:
//#define B3_DEBUG_MEMORY_ALLOCATIONS 1
#ifdef B3_DEBUG_MEMORY_ALLOCATIONS
-#define b3AlignedAlloc(a,b) \
- b3AlignedAllocInternal(a,b,__LINE__,__FILE__)
+#define b3AlignedAlloc(a, b) \
+ b3AlignedAllocInternal(a, b, __LINE__, __FILE__)
#define b3AlignedFree(ptr) \
- b3AlignedFreeInternal(ptr,__LINE__,__FILE__)
+ b3AlignedFreeInternal(ptr, __LINE__, __FILE__)
-void* b3AlignedAllocInternal (size_t size, int alignment,int line,char* filename);
+void* b3AlignedAllocInternal(size_t size, int alignment, int line, char* filename);
-void b3AlignedFreeInternal (void* ptr,int line,char* filename);
+void b3AlignedFreeInternal(void* ptr, int line, char* filename);
#else
- void* b3AlignedAllocInternal (size_t size, int alignment);
- void b3AlignedFreeInternal (void* ptr);
+void* b3AlignedAllocInternal(size_t size, int alignment);
+void b3AlignedFreeInternal(void* ptr);
- #define b3AlignedAlloc(size,alignment) b3AlignedAllocInternal(size,alignment)
- #define b3AlignedFree(ptr) b3AlignedFreeInternal(ptr)
+#define b3AlignedAlloc(size, alignment) b3AlignedAllocInternal(size, alignment)
+#define b3AlignedFree(ptr) b3AlignedFreeInternal(ptr)
#endif
-typedef int btSizeType;
+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);
+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);
+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);
-
+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 < typename T , unsigned Alignment >
-class b3AlignedAllocator {
-
- typedef b3AlignedAllocator< T , Alignment > self_type;
-
-public:
+template <typename T, unsigned Alignment>
+class b3AlignedAllocator
+{
+ typedef b3AlignedAllocator<T, Alignment> self_type;
+public:
//just going down a list:
b3AlignedAllocator() {}
/*
b3AlignedAllocator( const self_type & ) {}
*/
- template < typename Other >
- b3AlignedAllocator( const b3AlignedAllocator< Other , Alignment > & ) {}
+ template <typename Other>
+ b3AlignedAllocator(const b3AlignedAllocator<Other, Alignment>&)
+ {
+ }
- typedef const T* const_pointer;
- typedef const T& const_reference;
- typedef T* pointer;
- typedef T& reference;
- typedef T value_type;
+ 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 ) {
+ 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< pointer >(b3AlignedAlloc( sizeof(value_type) * n , Alignment ));
+ return reinterpret_cast<pointer>(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< void * >( ptr ) );
+ void construct(pointer ptr, const value_type& value) { new (ptr) value_type(value); }
+ void deallocate(pointer ptr)
+ {
+ b3AlignedFree(reinterpret_cast<void*>(ptr));
}
- void destroy ( pointer ptr ) { ptr->~value_type(); }
-
+ void destroy(pointer ptr) { ptr->~value_type(); }
- template < typename O > struct rebind {
- typedef b3AlignedAllocator< O , Alignment > other;
+ template <typename O>
+ struct rebind
+ {
+ typedef b3AlignedAllocator<O, Alignment> other;
};
- template < typename O >
- self_type & operator=( const b3AlignedAllocator< O , Alignment > & ) { return *this; }
+ template <typename O>
+ self_type& operator=(const b3AlignedAllocator<O, Alignment>&)
+ {
+ return *this;
+ }
- friend bool operator==( const self_type & , const self_type & ) { return true; }
+ friend bool operator==(const self_type&, const self_type&) { return true; }
};
-
-
-#endif //B3_ALIGNED_ALLOCATOR
-
+#endif //B3_ALIGNED_ALLOCATOR
diff --git a/thirdparty/bullet/Bullet3Common/b3AlignedObjectArray.h b/thirdparty/bullet/Bullet3Common/b3AlignedObjectArray.h
index ef71016565..249e381bf1 100644
--- a/thirdparty/bullet/Bullet3Common/b3AlignedObjectArray.h
+++ b/thirdparty/bullet/Bullet3Common/b3AlignedObjectArray.h
@@ -13,11 +13,10 @@ subject to the following restrictions:
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 "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
@@ -28,402 +27,386 @@ subject to the following restrictions:
#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 <memory.h> or <string.h> or otherwise...
-#define B3_ALLOW_ARRAY_COPY_OPERATOR // enabling this can accidently perform deep copies of data if you are not careful
+#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 <memory.h>
#include <string.h>
-#endif //B3_USE_MEMCPY
+#endif //B3_USE_MEMCPY
#ifdef B3_USE_PLACEMENT_NEW
-#include <new> //for placement new
-#endif //B3_USE_PLACEMENT_NEW
-
+#include <new> //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 <typename T>
-//template <class T>
+template <typename T>
+//template <class T>
class b3AlignedObjectArray
{
- b3AlignedAllocator<T , 16> m_allocator;
+ b3AlignedAllocator<T, 16> m_allocator;
- int m_size;
- int m_capacity;
- T* m_data;
+ int m_size;
+ int m_capacity;
+ T* m_data;
//PCK: added this line
- bool m_ownsMemory;
+ bool m_ownsMemory;
#ifdef B3_ALLOW_ARRAY_COPY_OPERATOR
public:
- B3_FORCE_INLINE b3AlignedObjectArray<T>& operator=(const b3AlignedObjectArray<T> &other)
+ B3_FORCE_INLINE b3AlignedObjectArray<T>& operator=(const b3AlignedObjectArray<T>& other)
{
copyFromArray(other);
return *this;
}
-#else//B3_ALLOW_ARRAY_COPY_OPERATOR
+#else //B3_ALLOW_ARRAY_COPY_OPERATOR
private:
- B3_FORCE_INLINE b3AlignedObjectArray<T>& operator=(const b3AlignedObjectArray<T> &other);
-#endif//B3_ALLOW_ARRAY_COPY_OPERATOR
+ B3_FORCE_INLINE b3AlignedObjectArray<T>& operator=(const b3AlignedObjectArray<T>& 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)
+ 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]);
+ new (&dest[i]) T(m_data[i]);
#else
- dest[i] = m_data[i];
-#endif //B3_USE_PLACEMENT_NEW
- }
+ dest[i] = m_data[i];
+#endif //B3_USE_PLACEMENT_NEW
+ }
- B3_FORCE_INLINE void init()
+ 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++)
{
- //PCK: added this line
- m_ownsMemory = true;
- m_data = 0;
- m_size = 0;
- m_capacity = 0;
+ m_data[i].~T();
}
- B3_FORCE_INLINE void destroy(int first,int last)
+ }
+
+ B3_FORCE_INLINE void* allocate(int size)
+ {
+ if (size)
+ return m_allocator.allocate(size);
+ return 0;
+ }
+
+ B3_FORCE_INLINE void deallocate()
+ {
+ if (m_data)
{
- int i;
- for (i=first; i<last;i++)
+ //PCK: enclosed the deallocation in this block
+ if (m_ownsMemory)
{
- m_data[i].~T();
+ m_allocator.deallocate(m_data);
}
+ m_data = 0;
}
+ }
- B3_FORCE_INLINE void* allocate(int size)
- {
- if (size)
- return m_allocator.allocate(size);
- return 0;
- }
+public:
+ b3AlignedObjectArray()
+ {
+ init();
+ }
- 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;
- }
- }
+ ~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);
+ }
- public:
-
- b3AlignedObjectArray()
- {
- init();
- }
+ /// return the number of elements in the array
+ B3_FORCE_INLINE int size() const
+ {
+ return m_size;
+ }
- ~b3AlignedObjectArray()
- {
- clear();
- }
+ B3_FORCE_INLINE const T& at(int n) const
+ {
+ b3Assert(n >= 0);
+ b3Assert(n < size());
+ return m_data[n];
+ }
- ///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();
+ B3_FORCE_INLINE T& at(int n)
+ {
+ b3Assert(n >= 0);
+ b3Assert(n < size());
+ return m_data[n];
+ }
- int otherSize = otherArray.size();
- resize (otherSize);
- otherArray.copy(0, otherSize, m_data);
- }
+ B3_FORCE_INLINE const T& operator[](int n) const
+ {
+ b3Assert(n >= 0);
+ b3Assert(n < size());
+ return m_data[n];
+ }
-
-
- /// 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& operator[](int n)
+ {
+ 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];
- }
+ ///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());
- B3_FORCE_INLINE const T& operator[](int n) const
- {
- b3Assert(n>=0);
- b3Assert(n<size());
- return m_data[n];
- }
+ deallocate();
- B3_FORCE_INLINE T& operator[](int n)
- {
- b3Assert(n>=0);
- b3Assert(n<size());
- return m_data[n];
- }
-
+ init();
+ }
- ///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()
+ 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)
{
- destroy(0,size());
-
- deallocate();
-
- init();
}
-
- B3_FORCE_INLINE void pop_back()
+ else
{
- b3Assert(m_size>0);
- m_size--;
- m_data[m_size].~T();
+ 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();
- ///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)
+ if (newsize < curSize)
{
- int curSize = size();
-
- if (newsize < curSize)
- {
- } else
+ for (int i = newsize; i < curSize; i++)
{
- if (newsize > size())
- {
- reserve(newsize);
- }
- //leave this uninitialized
+ m_data[i].~T();
}
- m_size = newsize;
}
-
- B3_FORCE_INLINE void resize(int newsize, const T& fillData=T())
+ else
{
- int curSize = size();
-
- if (newsize < curSize)
- {
- for(int i = newsize; i < curSize; i++)
- {
- m_data[i].~T();
- }
- } else
+ if (newsize > size())
{
- 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
-
+ reserve(newsize);
}
-
- m_size = newsize;
- }
- B3_FORCE_INLINE T& expandNonInitializing( )
- {
- int sz = size();
- if( sz == capacity() )
+#ifdef B3_USE_PLACEMENT_NEW
+ for (int i = curSize; i < newsize; i++)
{
- reserve( allocSize(size()) );
+ new (&m_data[i]) T(fillData);
}
- m_size++;
+#endif //B3_USE_PLACEMENT_NEW
+ }
- return m_data[sz];
+ 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++;
+ 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)
+ new (&m_data[sz]) T(fillValue); //use the in-place new (not really allocating heap memory)
#endif
- return m_data[sz];
- }
+ return m_data[sz];
+ }
+ B3_FORCE_INLINE void push_back(const T& _Val)
+ {
+ int sz = size();
+ if (sz == capacity())
+ {
+ reserve(allocSize(size()));
+ }
- 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);
+ new (&m_data[m_size]) T(_Val);
#else
- m_data[size()] = _Val;
-#endif //B3_USE_PLACEMENT_NEW
+ m_data[size()] = _Val;
+#endif //B3_USE_PLACEMENT_NEW
- m_size++;
- }
+ 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;
+ /// 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());
- class less
- {
- public:
+ deallocate();
+
+ //PCK: added this line
+ m_ownsMemory = true;
+
+ m_data = s;
- bool operator() ( const T& a, const T& b )
- {
- return ( a < b );
- }
- };
-
+ m_capacity = _Count;
+ }
+ }
- template <typename L>
- void quickSortInternal(const L& CompareFunc,int lo, int hi)
+ class less
+ {
+ public:
+ bool operator()(const T& a, const T& b)
{
- // 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);
+ return (a < b);
}
+ };
+ template <typename L>
+ 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];
- template <typename L>
- void quickSort(const L& CompareFunc)
+ // partition
+ do
{
- //don't sort 0 or 1 elements
- if (size()>1)
+ while (CompareFunc(m_data[i], x))
+ i++;
+ while (CompareFunc(x, m_data[j]))
+ j--;
+ if (i <= j)
{
- quickSortInternal(CompareFunc,0,size()-1);
+ swap(i, j);
+ i++;
+ j--;
}
+ } while (i <= j);
+
+ // recursion
+ if (lo < j)
+ quickSortInternal(CompareFunc, lo, j);
+ if (i < hi)
+ quickSortInternal(CompareFunc, i, hi);
+ }
+
+ template <typename L>
+ 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 <typename L>
+ 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 */
- ///heap sort from http://www.csse.monash.edu.au/~lloyd/tildeAlgDS/Sort/Heap/
- template <typename L>
- void downHeap(T *pArr, int k, int n, const L& CompareFunc)
+ T temp = pArr[k - 1];
+ /* k has child(s) */
+ while (k <= n / 2)
{
- /* 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]))
{
- 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;
- }
+ /* move child up */
+ pArr[k - 1] = pArr[child - 1];
+ k = child;
}
- pArr[k - 1] = temp;
- } /*downHeap*/
+ else
+ {
+ break;
+ }
+ }
+ pArr[k - 1] = temp;
+ } /*downHeap*/
- void swap(int index0,int index1)
- {
+ 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));
+ 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
-
- }
+ T temp = m_data[index0];
+ m_data[index0] = m_data[index1];
+ m_data[index1] = temp;
+#endif //B3_USE_PLACEMENT_NEW
+ }
template <typename L>
void heapSort(const L& CompareFunc)
@@ -431,49 +414,48 @@ protected:
/* sort a[0..N-1], N.B. 0 to N-1 */
int k;
int n = m_size;
- for (k = n/2; k > 0; k--)
+ for (k = n / 2; k > 0; k--)
{
downHeap(m_data, k, n, CompareFunc);
}
/* a[1..N] is now a heap */
- while ( n>=1 )
+ while (n >= 1)
{
- swap(0,n-1); /* largest of a[0..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 findBinarySearch(const T& key) const
{
int first = 0;
- int last = size()-1;
+ int last = size() - 1;
//assume sorted array
- while (first <= last) {
+ while (first <= last)
+ {
int mid = (first + last) / 2; // compute mid point.
- if (key > m_data[mid])
+ 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 if (key < m_data[mid])
+ last = mid - 1; // repeat search in bottom half.
else
- return mid; // found it. return position /////
+ return mid; // found it. return position /////
}
- return size(); // failed to find key
+ return size(); // failed to find key
}
-
- int findLinearSearch(const T& key) const
+ int findLinearSearch(const T& key) const
{
- int index=size();
+ int index = size();
int i;
- for (i=0;i<size();i++)
+ for (i = 0; i < size(); i++)
{
if (m_data[i] == key)
{
@@ -483,36 +465,35 @@ protected:
}
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 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())
+ if (findIndex < size())
{
- swap( findIndex,size()-1);
+ swap(findIndex, size() - 1);
pop_back();
}
}
//PCK: whole function
- void initializeFromBuffer(void *buffer, int size, int capacity)
+ void initializeFromBuffer(void* buffer, int size, int capacity)
{
clear();
m_ownsMemory = false;
@@ -524,18 +505,18 @@ protected:
void copyFromArray(const b3AlignedObjectArray& otherArray)
{
int otherSize = otherArray.size();
- resize (otherSize);
+ resize(otherSize);
otherArray.copy(0, otherSize, m_data);
}
void removeAtIndex(int index)
- {
- if (index<size())
- {
- swap( index,size()-1);
- pop_back();
- }
- }
+ {
+ if (index < size())
+ {
+ swap(index, size() - 1);
+ pop_back();
+ }
+ }
};
-#endif //B3_OBJECT_ARRAY__
+#endif //B3_OBJECT_ARRAY__
diff --git a/thirdparty/bullet/Bullet3Common/b3CommandLineArgs.h b/thirdparty/bullet/Bullet3Common/b3CommandLineArgs.h
index 38df8e2600..5fe4f25f8d 100644
--- a/thirdparty/bullet/Bullet3Common/b3CommandLineArgs.h
+++ b/thirdparty/bullet/Bullet3Common/b3CommandLineArgs.h
@@ -12,51 +12,54 @@
class b3CommandLineArgs
{
protected:
-
std::map<std::string, std::string> pairs;
public:
-
// Constructor
b3CommandLineArgs(int argc, char **argv)
{
- addArgs(argc,argv);
+ addArgs(argc, argv);
}
- void addArgs(int argc, char**argv)
+ void addArgs(int argc, char **argv)
{
- for (int i = 1; i < argc; i++)
- {
- std::string arg = argv[i];
+ for (int i = 1; i < argc; i++)
+ {
+ std::string arg = argv[i];
+
+ if ((arg.length() < 2) || (arg[0] != '-') || (arg[1] != '-'))
+ {
+ continue;
+ }
- 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);
+ }
- 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())
+ if (pairs.find(key) == pairs.end())
{
- pairs[key] = val;
+ pairs[key] = val;
}
- }
+ }
}
- bool CheckCmdLineFlag(const char* arg_name)
+ bool CheckCmdLineFlag(const char *arg_name)
{
std::map<std::string, std::string>::iterator itr;
- if ((itr = pairs.find(arg_name)) != pairs.end()) {
+ if ((itr = pairs.find(arg_name)) != pairs.end())
+ {
return true;
- }
+ }
return false;
}
@@ -73,29 +76,31 @@ template <typename T>
inline bool b3CommandLineArgs::GetCmdLineArgument(const char *arg_name, T &val)
{
std::map<std::string, std::string>::iterator itr;
- if ((itr = pairs.find(arg_name)) != pairs.end()) {
+ if ((itr = pairs.find(arg_name)) != pairs.end())
+ {
std::istringstream strstream(itr->second);
strstream >> val;
return true;
- }
+ }
return false;
}
template <>
-inline bool b3CommandLineArgs::GetCmdLineArgument<char*>(const char* arg_name, char* &val)
+inline bool b3CommandLineArgs::GetCmdLineArgument<char *>(const char *arg_name, char *&val)
{
std::map<std::string, std::string>::iterator itr;
- if ((itr = pairs.find(arg_name)) != pairs.end()) {
-
+ if ((itr = pairs.find(arg_name)) != pairs.end())
+ {
std::string s = itr->second;
- val = (char*) malloc(sizeof(char) * (s.length() + 1));
+ val = (char *)malloc(sizeof(char) * (s.length() + 1));
std::strcpy(val, s.c_str());
return true;
- } else {
- val = NULL;
+ }
+ else
+ {
+ val = NULL;
}
return false;
}
-
-#endif //COMMAND_LINE_ARGS_H
+#endif //COMMAND_LINE_ARGS_H
diff --git a/thirdparty/bullet/Bullet3Common/b3FileUtils.h b/thirdparty/bullet/Bullet3Common/b3FileUtils.h
index b5e8225cf0..9ded17eaaf 100644
--- a/thirdparty/bullet/Bullet3Common/b3FileUtils.h
+++ b/thirdparty/bullet/Bullet3Common/b3FileUtils.h
@@ -3,7 +3,7 @@
#include <stdio.h>
#include "b3Scalar.h"
-#include <stddef.h>//ptrdiff_h
+#include <stddef.h> //ptrdiff_h
#include <string.h>
struct b3FileUtils
@@ -17,42 +17,42 @@ struct b3FileUtils
static bool findFile(const char* orgFileName, char* relativeFileName, int maxRelativeFileNameMaxLen)
{
- FILE* f=0;
- f = fopen(orgFileName,"rb");
- if (f)
- {
+ FILE* f = 0;
+ f = fopen(orgFileName, "rb");
+ if (f)
+ {
//printf("original file found: [%s]\n", orgFileName);
- sprintf(relativeFileName,"%s", 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;
+ //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*);
- for (int i=0;!f && i<numPrefixes;i++)
- {
+ 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);
+ sprintf_s(relativeFileName, maxRelativeFileNameMaxLen, "%s%s", prefix[i], orgFileName);
#else
- sprintf(relativeFileName,"%s%s",prefix[i],orgFileName);
+ sprintf(relativeFileName, "%s%s", prefix[i], orgFileName);
#endif
- f = fopen(relativeFileName,"rb");
- if (f)
- {
- fileFound = true;
- break;
- }
- }
+ f = fopen(relativeFileName, "rb");
if (f)
{
- fclose(f);
+ fileFound = true;
+ break;
}
-
+ }
+ if (f)
+ {
+ fclose(f);
+ }
+
return fileFound;
}
@@ -60,8 +60,8 @@ struct b3FileUtils
{
size_t const patlen = strlen(pattern);
size_t patcnt = 0;
- const char * oriptr;
- const char * patloc;
+ 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)
{
@@ -70,29 +70,27 @@ struct b3FileUtils
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);
+ ptrdiff_t len = stripped - fileName;
+ b3Assert((len + 1) < maxPathLength);
- if (len && ((len+1)<maxPathLength))
+ if (len && ((len + 1) < maxPathLength))
{
-
- for (int i=0;i<len;i++)
+ for (int i = 0; i < len; i++)
{
path[i] = fileName[i];
}
- path[len]=0;
- } else
+ path[len] = 0;
+ }
+ else
{
len = 0;
- b3Assert(maxPathLength>0);
- if (maxPathLength>0)
+ b3Assert(maxPathLength > 0);
+ if (maxPathLength > 0)
{
path[len] = 0;
}
@@ -102,23 +100,21 @@ struct b3FileUtils
static char toLowerChar(const char t)
{
- if (t>=(char)'A' && t<=(char)'Z')
+ 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++)
+ 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);
@@ -133,6 +129,5 @@ struct b3FileUtils
return oriptr;
}
*/
-
};
-#endif //B3_FILE_UTILS_H
+#endif //B3_FILE_UTILS_H
diff --git a/thirdparty/bullet/Bullet3Common/b3HashMap.h b/thirdparty/bullet/Bullet3Common/b3HashMap.h
index 24a59d9baa..3009e2cf2f 100644
--- a/thirdparty/bullet/Bullet3Common/b3HashMap.h
+++ b/thirdparty/bullet/Bullet3Common/b3HashMap.h
@@ -13,86 +13,80 @@ subject to the following restrictions:
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 <string>
///very basic hashable string implementation, compatible with b3HashMap
struct b3HashString
{
std::string m_string;
- unsigned int m_hash;
+ unsigned int m_hash;
- B3_FORCE_INLINE unsigned int getHash()const
+ B3_FORCE_INLINE unsigned int getHash() const
{
return m_hash;
}
-
b3HashString(const char* name)
- :m_string(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 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++)
+ 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 */
+ 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 portableStringCompare(const char* src, const char* dst) const
{
- int ret = 0 ;
+ int ret = 0;
- while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
- ++src, ++dst;
+ while (!(ret = *(unsigned char*)src - *(unsigned char*)dst) && *dst)
+ ++src, ++dst;
- if ( ret < 0 )
- ret = -1 ;
- else if ( ret > 0 )
- ret = 1 ;
+ if (ret < 0)
+ ret = -1;
+ else if (ret > 0)
+ ret = 1;
- return( ret );
+ return (ret);
}
bool equals(const b3HashString& other) const
{
return (m_string == other.m_string);
}
-
};
-
-const int B3_HASH_NULL=0xffffffff;
-
+const int B3_HASH_NULL = 0xffffffff;
class b3HashInt
{
- int m_uid;
+ int m_uid;
+
public:
- b3HashInt(int uid) :m_uid(uid)
+ b3HashInt(int uid) : m_uid(uid)
{
}
- int getUid1() const
+ int getUid1() const
{
return m_uid;
}
- void setUid1(int uid)
+ void setUid1(int uid)
{
m_uid = uid;
}
@@ -102,34 +96,34 @@ public:
return getUid1() == other.getUid1();
}
//to our success
- B3_FORCE_INLINE unsigned int getHash()const
+ 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);
+ 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];
+ union {
+ const void* m_pointer;
+ int m_hashValues[2];
};
public:
-
b3HashPtr(const void* ptr)
- :m_pointer(ptr)
+ : m_pointer(ptr)
{
}
- const void* getPointer() const
+ const void* getPointer() const
{
return m_pointer;
}
@@ -140,65 +134,69 @@ public:
}
//to our success
- B3_FORCE_INLINE unsigned int getHash()const
+ 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];
-
+ 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);
+ key += ~(key << 15);
+ key ^= (key >> 10);
+ key += (key << 3);
+ key ^= (key >> 6);
+ key += ~(key << 11);
+ key ^= (key >> 16);
return key;
}
-
-
};
-
template <class Value>
class b3HashKeyPtr
{
- int m_uid;
+ int m_uid;
+
public:
+ b3HashKeyPtr(int uid) : m_uid(uid)
+ {
+ }
- b3HashKeyPtr(int uid) :m_uid(uid)
- {
- }
-
- int getUid1() const
- {
- return m_uid;
- }
-
- bool equals(const b3HashKeyPtr<Value>& 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;
- }
-
-
-};
+ int getUid1() const
+ {
+ return m_uid;
+ }
+ bool equals(const b3HashKeyPtr<Value>& 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 Value>
class b3HashKey
{
- int m_uid;
-public:
+ int m_uid;
- b3HashKey(int uid) :m_uid(uid)
+public:
+ b3HashKey(int uid) : m_uid(uid)
{
}
- int getUid1() const
+ int getUid1() const
{
return m_uid;
}
@@ -208,30 +206,33 @@ public:
return getUid1() == other.getUid1();
}
//to our success
- B3_FORCE_INLINE unsigned int getHash()const
+ 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);
+ 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 Key, class Value>
class b3HashMap
{
-
protected:
- b3AlignedObjectArray<int> m_hashTable;
- b3AlignedObjectArray<int> m_next;
-
- b3AlignedObjectArray<Value> m_valueArray;
- b3AlignedObjectArray<Key> m_keyArray;
+ b3AlignedObjectArray<int> m_hashTable;
+ b3AlignedObjectArray<int> m_next;
+
+ b3AlignedObjectArray<Value> m_valueArray;
+ b3AlignedObjectArray<Key> m_keyArray;
- void growTables(const Key& /*key*/)
+ void growTables(const Key& /*key*/)
{
int newCapacity = m_valueArray.capacity();
@@ -245,7 +246,7 @@ protected:
int i;
- for (i= 0; i < newCapacity; ++i)
+ for (i = 0; i < newCapacity; ++i)
{
m_hashTable[i] = B3_HASH_NULL;
}
@@ -254,30 +255,28 @@ protected:
m_next[i] = B3_HASH_NULL;
}
- for(i=0;i<curHashtableSize;i++)
+ 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
+ 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);
+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;
+ m_valueArray[index] = value;
return;
}
@@ -291,19 +290,19 @@ protected:
{
growTables(key);
//hash with new capacity
- hash = key.getHash() & (m_valueArray.capacity()-1);
+ 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);
+ void remove(const Key& key)
+ {
+ int hash = key.getHash() & (m_valueArray.capacity() - 1);
int pairIndex = findIndex(key);
-
- if (pairIndex ==B3_HASH_NULL)
+
+ if (pairIndex == B3_HASH_NULL)
{
return;
}
@@ -344,7 +343,7 @@ protected:
}
// Remove the last pair from the hash table.
- int lastHash = m_keyArray[lastPairIndex].getHash() & (m_valueArray.capacity()-1);
+ int lastHash = m_keyArray[lastPairIndex].getHash() & (m_valueArray.capacity() - 1);
index = m_hashTable[lastHash];
b3Assert(index != B3_HASH_NULL);
@@ -376,10 +375,8 @@ protected:
m_valueArray.pop_back();
m_keyArray.pop_back();
-
}
-
int size() const
{
return m_valueArray.size();
@@ -399,23 +396,24 @@ protected:
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];
- }
+ 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) {
+ Value* operator[](const Key& key)
+ {
return find(key);
}
- const Value* find(const Key& key) const
+ const Value* find(const Key& key) const
{
int index = findIndex(key);
if (index == B3_HASH_NULL)
@@ -425,7 +423,7 @@ protected:
return &m_valueArray[index];
}
- Value* find(const Key& key)
+ Value* find(const Key& key)
{
int index = findIndex(key);
if (index == B3_HASH_NULL)
@@ -435,10 +433,9 @@ protected:
return &m_valueArray[index];
}
-
- int findIndex(const Key& key) const
+ int findIndex(const Key& key) const
{
- unsigned int hash = key.getHash() & (m_valueArray.capacity()-1);
+ unsigned int hash = key.getHash() & (m_valueArray.capacity() - 1);
if (hash >= (unsigned int)m_hashTable.size())
{
@@ -453,14 +450,13 @@ protected:
return index;
}
- void clear()
+ void clear()
{
m_hashTable.clear();
m_next.clear();
m_valueArray.clear();
m_keyArray.clear();
}
-
};
-#endif //B3_HASH_MAP_H
+#endif //B3_HASH_MAP_H
diff --git a/thirdparty/bullet/Bullet3Common/b3Logging.cpp b/thirdparty/bullet/Bullet3Common/b3Logging.cpp
index a8e9507155..9c9f7c09ea 100644
--- a/thirdparty/bullet/Bullet3Common/b3Logging.cpp
+++ b/thirdparty/bullet/Bullet3Common/b3Logging.cpp
@@ -20,17 +20,16 @@ subject to the following restrictions:
#ifdef _WIN32
#include <windows.h>
-#endif //_WIN32
-
+#endif //_WIN32
void b3PrintfFuncDefault(const char* msg)
{
#ifdef _WIN32
OutputDebugStringA(msg);
#endif
- printf("%s",msg);
- //is this portable?
- fflush(stdout);
+ printf("%s", msg);
+ //is this portable?
+ fflush(stdout);
}
void b3WarningMessageFuncDefault(const char* msg)
@@ -38,32 +37,26 @@ void b3WarningMessageFuncDefault(const char* msg)
#ifdef _WIN32
OutputDebugStringA(msg);
#endif
- printf("%s",msg);
- //is this portable?
- fflush(stdout);
-
+ printf("%s", msg);
+ //is this portable?
+ fflush(stdout);
}
-
void b3ErrorMessageFuncDefault(const char* msg)
{
#ifdef _WIN32
OutputDebugStringA(msg);
#endif
- printf("%s",msg);
+ printf("%s", msg);
- //is this portable?
- fflush(stdout);
-
+ //is this portable?
+ fflush(stdout);
}
-
-
static b3PrintfFunc* b3s_printfFunc = b3PrintfFuncDefault;
static b3WarningMessageFunc* b3s_warningMessageFunc = b3WarningMessageFuncDefault;
static b3ErrorMessageFunc* b3s_errorMessageFunc = b3ErrorMessageFuncDefault;
-
///The developer can route b3Printf output using their own implementation
void b3SetCustomPrintfFunc(b3PrintfFunc* printfFunc)
{
@@ -81,54 +74,50 @@ void b3SetCustomErrorMessageFunc(b3PrintfFunc* errorMessageFunc)
//#define B3_MAX_DEBUG_STRING_LENGTH 2048
#define B3_MAX_DEBUG_STRING_LENGTH 32768
-
-void b3OutputPrintfVarArgsInternal(const char *str, ...)
+void b3OutputPrintfVarArgsInternal(const char* str, ...)
{
- char strDebug[B3_MAX_DEBUG_STRING_LENGTH]={0};
- va_list argList;
- va_start(argList, str);
+ char strDebug[B3_MAX_DEBUG_STRING_LENGTH] = {0};
+ va_list argList;
+ va_start(argList, str);
#ifdef _MSC_VER
- vsprintf_s(strDebug,B3_MAX_DEBUG_STRING_LENGTH,str,argList);
+ vsprintf_s(strDebug, B3_MAX_DEBUG_STRING_LENGTH, str, argList);
#else
- vsnprintf(strDebug,B3_MAX_DEBUG_STRING_LENGTH,str,argList);
+ vsnprintf(strDebug, B3_MAX_DEBUG_STRING_LENGTH, str, argList);
#endif
- (b3s_printfFunc)(strDebug);
- va_end(argList);
+ (b3s_printfFunc)(strDebug);
+ va_end(argList);
}
-void b3OutputWarningMessageVarArgsInternal(const char *str, ...)
+void b3OutputWarningMessageVarArgsInternal(const char* str, ...)
{
- char strDebug[B3_MAX_DEBUG_STRING_LENGTH]={0};
- va_list argList;
- va_start(argList, str);
+ char strDebug[B3_MAX_DEBUG_STRING_LENGTH] = {0};
+ va_list argList;
+ va_start(argList, str);
#ifdef _MSC_VER
- vsprintf_s(strDebug,B3_MAX_DEBUG_STRING_LENGTH,str,argList);
+ vsprintf_s(strDebug, B3_MAX_DEBUG_STRING_LENGTH, str, argList);
#else
- vsnprintf(strDebug,B3_MAX_DEBUG_STRING_LENGTH,str,argList);
+ vsnprintf(strDebug, B3_MAX_DEBUG_STRING_LENGTH, str, argList);
#endif
- (b3s_warningMessageFunc)(strDebug);
- va_end(argList);
+ (b3s_warningMessageFunc)(strDebug);
+ va_end(argList);
}
-void b3OutputErrorMessageVarArgsInternal(const char *str, ...)
+void b3OutputErrorMessageVarArgsInternal(const char* str, ...)
{
-
- char strDebug[B3_MAX_DEBUG_STRING_LENGTH]={0};
- va_list argList;
- va_start(argList, str);
+ char strDebug[B3_MAX_DEBUG_STRING_LENGTH] = {0};
+ va_list argList;
+ va_start(argList, str);
#ifdef _MSC_VER
- vsprintf_s(strDebug,B3_MAX_DEBUG_STRING_LENGTH,str,argList);
+ vsprintf_s(strDebug, B3_MAX_DEBUG_STRING_LENGTH, str, argList);
#else
- vsnprintf(strDebug,B3_MAX_DEBUG_STRING_LENGTH,str,argList);
+ vsnprintf(strDebug, B3_MAX_DEBUG_STRING_LENGTH, str, argList);
#endif
- (b3s_errorMessageFunc)(strDebug);
- va_end(argList);
-
+ (b3s_errorMessageFunc)(strDebug);
+ va_end(argList);
}
-
-void b3EnterProfileZoneDefault(const char* name)
+void b3EnterProfileZoneDefault(const char* name)
{
}
-void b3LeaveProfileZoneDefault()
+void b3LeaveProfileZoneDefault()
{
}
static b3EnterProfileZoneFunc* b3s_enterFunc = b3EnterProfileZoneDefault;
@@ -151,10 +140,6 @@ void b3SetCustomLeaveProfileZoneFunc(b3LeaveProfileZoneFunc* leaveFunc)
b3s_leaveFunc = leaveFunc;
}
-
-
-
#ifndef _MSC_VER
#undef vsprintf_s
#endif
-
diff --git a/thirdparty/bullet/Bullet3Common/b3Logging.h b/thirdparty/bullet/Bullet3Common/b3Logging.h
index b302effe43..9c92b12ebb 100644
--- a/thirdparty/bullet/Bullet3Common/b3Logging.h
+++ b/thirdparty/bullet/Bullet3Common/b3Logging.h
@@ -3,75 +3,84 @@
#define B3_LOGGING_H
#ifdef __cplusplus
-extern "C" {
+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)
-
+ //#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();
+ 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 )
+ class b3ProfileZone
+ {
+ public:
+ b3ProfileZone(const char* name)
+ {
+ b3EnterProfileZone(name);
+ }
+
+ ~b3ProfileZone()
+ {
+ b3LeaveProfileZone();
+ }
+ };
+
+#define B3_PROFILE(name) b3ProfileZone __profile(name)
#endif
-#else //B3_NO_PROFILE
+#else //B3_NO_PROFILE
-#define B3_PROFILE( name )
+#define B3_PROFILE(name)
#define b3StartProfile(a)
#define b3StopProfile
-#endif //#ifndef B3_NO_PROFILE
-
+#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)();
+ 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);
+ ///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);
+ ///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, ...);
+ ///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
+#endif //B3_LOGGING_H \ No newline at end of file
diff --git a/thirdparty/bullet/Bullet3Common/b3Matrix3x3.h b/thirdparty/bullet/Bullet3Common/b3Matrix3x3.h
index 89b57cf59a..6c46536a81 100644
--- a/thirdparty/bullet/Bullet3Common/b3Matrix3x3.h
+++ b/thirdparty/bullet/Bullet3Common/b3Matrix3x3.h
@@ -12,8 +12,7 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
-#ifndef B3_MATRIX3x3_H
+#ifndef B3_MATRIX3x3_H
#define B3_MATRIX3x3_H
#include "b3Vector3.h"
@@ -32,22 +31,22 @@ const b3SimdFloat4 B3_ATTRIBUTE_ALIGNED16(b3v0010) = {0.0f, 0.0f, 1.0f, 0.0f};
#endif
#ifdef B3_USE_DOUBLE_PRECISION
-#define b3Matrix3x3Data b3Matrix3x3DoubleData
+#define b3Matrix3x3Data b3Matrix3x3DoubleData
#else
-#define b3Matrix3x3Data b3Matrix3x3FloatData
-#endif //B3_USE_DOUBLE_PRECISION
-
+#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 {
-
+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 () {}
+ b3Matrix3x3() {}
// explicit b3Matrix3x3(const b3Scalar *m) { setFromOpenGLSubMatrix(m); }
@@ -62,27 +61,27 @@ public:
*/
/** @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);
+ 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 )
+#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;
+ 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 )
+ 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;
+ m_el[0] = v0;
+ m_el[1] = v1;
+ m_el[2] = v2;
}
// Copy constructor
@@ -94,25 +93,25 @@ public:
}
// Assignment Operator
- B3_FORCE_INLINE b3Matrix3x3& operator=(const b3Matrix3x3& m)
+ 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)
+ 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)
{
@@ -128,10 +127,9 @@ public:
* @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]);
+ 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
@@ -142,10 +140,10 @@ public:
/** @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)
- {
+ B3_FORCE_INLINE b3Vector3& operator[](int i)
+ {
b3FullAssert(0 <= i && i < 3);
- return m_el[i];
+ return m_el[i];
}
/** @brief Get a const reference to a row of the matrix as a vector
@@ -153,32 +151,31 @@ public:
B3_FORCE_INLINE const b3Vector3& operator[](int i) const
{
b3FullAssert(0 <= i && i < 3);
- return m_el[i];
+ 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);
+ 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);
+ 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);
+ 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)
+ 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]);
-
+ 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
@@ -190,93 +187,92 @@ public:
* @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)
+ 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);
+ 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)
+ * @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();
+
+#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);
+ __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
+
+ 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;
+ 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,
+ 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
- }
-
+#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)
+ void setEulerYPR(const b3Scalar& yaw, const b3Scalar& pitch, const b3Scalar& roll)
{
setEulerZYX(roll, pitch, yaw);
}
@@ -290,182 +286,197 @@ public:
* 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) {
+ 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 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);
+ 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);
+ {
+#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));
+ 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()
+ 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);
+#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));
+ 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
+ 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;
+#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;
+ // 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[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);
+ 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
+ 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
+#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))
+ if (trace > b3Scalar(0.0))
{
b3Scalar s = b3Sqrt(trace + b3Scalar(1.0));
- temp[3]=(s * b3Scalar(0.5));
+ 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
+ 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 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));
@@ -476,44 +487,42 @@ public:
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]);
+ 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
+ * @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 (b3Fabs(pitch) == B3_HALF_PI)
{
- if (yaw>0)
- yaw-=B3_PI;
+ if (yaw > 0)
+ yaw -= B3_PI;
else
- yaw+=B3_PI;
+ yaw += B3_PI;
- if (roll>0)
- roll-=B3_PI;
+ if (roll > 0)
+ roll -= B3_PI;
else
- roll+=B3_PI;
+ 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
+ * @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
{
@@ -523,7 +532,7 @@ public:
};
Euler euler_out;
- Euler euler_out2; //second solution
+ Euler euler_out2; //second solution
//get the pointer to the raw data
// Check that pitch is not at a singularity
@@ -533,7 +542,7 @@ public:
euler_out2.yaw = 0;
// From difference of angles formula
- b3Scalar delta = b3Atan2(m_el[0].getX(),m_el[0].getZ());
+ 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);
@@ -541,7 +550,7 @@ public:
euler_out.roll = euler_out.pitch + delta;
euler_out2.roll = euler_out.pitch + delta;
}
- else // gimbal locked down
+ else // gimbal locked down
{
euler_out.pitch = -B3_PI / b3Scalar(2.0);
euler_out2.pitch = -B3_PI / b3Scalar(2.0);
@@ -551,29 +560,29 @@ public:
}
else
{
- euler_out.pitch = - b3Asin(m_el[2].getX());
+ 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.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));
+ 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;
+ {
+ yaw = euler_out.yaw;
pitch = euler_out.pitch;
roll = euler_out.roll;
}
else
- {
- yaw = euler_out2.yaw;
+ {
+ yaw = euler_out2.yaw;
pitch = euler_out2.pitch;
roll = euler_out2.roll;
}
@@ -584,18 +593,18 @@ public:
b3Matrix3x3 scaled(const b3Vector3& s) const
{
-#if (defined (B3_USE_SSE_IN_API) && defined (B3_USE_SSE))|| defined (B3_USE_NEON)
+#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
+#else
return b3Matrix3x3(
- m_el[0].getX() * s.getX(), m_el[0].getY() * s.getY(), m_el[0].getZ() * s.getZ(),
+ 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;
+ b3Scalar determinant() const;
/**@brief Return the adjoint of the matrix */
b3Matrix3x3 adjoint() const;
/**@brief Return the matrix with all values non negative */
@@ -603,25 +612,24 @@ public:
/**@brief Return the transpose of the matrix */
b3Matrix3x3 transpose() const;
/**@brief Return the inverse of the matrix */
- b3Matrix3x3 inverse() const;
+ b3Matrix3x3 inverse() const;
b3Matrix3x3 transposeTimes(const b3Matrix3x3& m) const;
b3Matrix3x3 timesTranspose(const b3Matrix3x3& m) const;
- B3_FORCE_INLINE b3Scalar tdotx(const b3Vector3& v) 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
+ 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
+ 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.
@@ -631,7 +639,7 @@ public:
*
* Note that this matrix is assumed to be symmetric.
*/
- void diagonalize(b3Matrix3x3& rot, b3Scalar threshold, int maxSteps)
+ void diagonalize(b3Matrix3x3 & rot, b3Scalar threshold, int maxSteps)
{
rot.setIdentity();
for (int step = maxSteps; step > 0; step--)
@@ -667,7 +675,7 @@ public:
step = 1;
}
- // compute Jacobi rotation J which leads to a zero for element [p][q]
+ // 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;
@@ -676,7 +684,7 @@ public:
if (theta2 * theta2 < b3Scalar(10 / B3_EPSILON))
{
t = (theta >= 0) ? 1 / (theta + b3Sqrt(1 + theta2))
- : 1 / (theta - b3Sqrt(1 + theta2));
+ : 1 / (theta - b3Sqrt(1 + theta2));
cos = 1 / b3Sqrt(1 + t * t);
sin = cos * t;
}
@@ -709,9 +717,6 @@ public:
}
}
-
-
-
/**@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
@@ -719,304 +724,298 @@ public:
* @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
+ 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 serialize(struct b3Matrix3x3Data & dataOut) const;
- void serializeFloat(struct b3Matrix3x3FloatData& dataOut) const;
+ void serializeFloat(struct b3Matrix3x3FloatData & dataOut) const;
- void deSerialize(const struct b3Matrix3x3Data& dataIn);
+ void deSerialize(const struct b3Matrix3x3Data& dataIn);
- void deSerializeFloat(const struct b3Matrix3x3FloatData& dataIn);
-
- void deSerializeDouble(const struct b3Matrix3x3DoubleData& dataIn);
+ void deSerializeFloat(const struct b3Matrix3x3FloatData& dataIn);
+ void deSerializeDouble(const struct b3Matrix3x3DoubleData& dataIn);
};
-
-B3_FORCE_INLINE b3Matrix3x3&
+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);
+#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
+ 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[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&
+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;
+#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]);
+ 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)
+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));
+#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));
+ 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);
+ 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
+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)
+#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);
+ 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
+ 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
+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)
+#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);
+ 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]);
+ 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&
+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;
+#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]);
+ 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
+B3_FORCE_INLINE b3Scalar
b3Matrix3x3::determinant() const
-{
+{
return b3Triple((*this)[0], (*this)[1], (*this)[2]);
}
-
-B3_FORCE_INLINE b3Matrix3x3
+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));
+#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()));
+ (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
+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 );
+#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 );
+ // 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());
+ 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
+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));
+ 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
+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));
@@ -1024,54 +1023,54 @@ b3Matrix3x3::inverse() const
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);
+ 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
+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 );
+#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 );
+ // 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(
+ 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(),
@@ -1084,51 +1083,51 @@ b3Matrix3x3::transposeTimes(const b3Matrix3x3& m) const
#endif
}
-B3_FORCE_INLINE b3Matrix3x3
+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);
-
+#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 );
-
+ 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]),
@@ -1137,139 +1136,138 @@ b3Matrix3x3::timesTranspose(const b3Matrix3x3& m) const
#endif
}
-B3_FORCE_INLINE b3Vector3
-operator*(const b3Matrix3x3& m, const b3Vector3& v)
+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]);
+#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))
+#if (defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE))
- const __m128 vv = v.mVec128;
+ 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);
+ __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));
+ 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);
+ 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
+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);
+#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);
+ 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
+
+#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]));
+ 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
}
@@ -1292,71 +1290,65 @@ m1[0][2] * m2[0][2] + m1[1][2] * m2[1][2] + m1[2][2] * m2[2][2]);
* 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] );
+#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
+struct b3Matrix3x3FloatData
{
b3Vector3FloatData m_el[3];
};
///for serialization
-struct b3Matrix3x3DoubleData
+struct b3Matrix3x3DoubleData
{
b3Vector3DoubleData m_el[3];
};
-
-
-
-B3_FORCE_INLINE void b3Matrix3x3::serialize(struct b3Matrix3x3Data& dataOut) const
+B3_FORCE_INLINE void b3Matrix3x3::serialize(struct b3Matrix3x3Data& dataOut) const
{
- for (int i=0;i<3;i++)
+ 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
+B3_FORCE_INLINE void b3Matrix3x3::serializeFloat(struct b3Matrix3x3FloatData& dataOut) const
{
- for (int i=0;i<3;i++)
+ 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)
+B3_FORCE_INLINE void b3Matrix3x3::deSerialize(const struct b3Matrix3x3Data& dataIn)
{
- for (int i=0;i<3;i++)
+ 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)
+B3_FORCE_INLINE void b3Matrix3x3::deSerializeFloat(const struct b3Matrix3x3FloatData& dataIn)
{
- for (int i=0;i<3;i++)
+ 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)
+B3_FORCE_INLINE void b3Matrix3x3::deSerializeDouble(const struct b3Matrix3x3DoubleData& dataIn)
{
- for (int i=0;i<3;i++)
+ for (int i = 0; i < 3; i++)
m_el[i].deSerializeDouble(dataIn.m_el[i]);
}
-#endif //B3_MATRIX3x3_H
-
+#endif //B3_MATRIX3x3_H
diff --git a/thirdparty/bullet/Bullet3Common/b3MinMax.h b/thirdparty/bullet/Bullet3Common/b3MinMax.h
index 73af23a4f9..c09c3db3f5 100644
--- a/thirdparty/bullet/Bullet3Common/b3MinMax.h
+++ b/thirdparty/bullet/Bullet3Common/b3MinMax.h
@@ -12,60 +12,58 @@ subject to the following restrictions:
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 <class T>
-B3_FORCE_INLINE const T& b3Min(const T& a, const T& b)
+B3_FORCE_INLINE const T& b3Min(const T& a, const T& b)
{
- return a < b ? a : b ;
+ return a < b ? a : b;
}
template <class T>
-B3_FORCE_INLINE const T& b3Max(const T& a, const T& b)
+B3_FORCE_INLINE const T& b3Max(const T& a, const T& b)
{
- return a > b ? a : b;
+ return a > b ? a : b;
}
template <class T>
-B3_FORCE_INLINE const T& b3Clamped(const T& a, const T& lb, const T& ub)
+B3_FORCE_INLINE const T& b3Clamped(const T& a, const T& lb, const T& ub)
{
- return a < lb ? lb : (ub < a ? ub : a);
+ return a < lb ? lb : (ub < a ? ub : a);
}
template <class T>
-B3_FORCE_INLINE void b3SetMin(T& a, const T& b)
+B3_FORCE_INLINE void b3SetMin(T& a, const T& b)
{
- if (b < a)
+ if (b < a)
{
a = b;
}
}
template <class T>
-B3_FORCE_INLINE void b3SetMax(T& a, const T& b)
+B3_FORCE_INLINE void b3SetMax(T& a, const T& b)
{
- if (a < b)
+ if (a < b)
{
a = b;
}
}
template <class T>
-B3_FORCE_INLINE void b3Clamp(T& a, const T& lb, const T& ub)
+B3_FORCE_INLINE void b3Clamp(T& a, const T& lb, const T& ub)
{
- if (a < lb)
+ if (a < lb)
{
- a = lb;
+ a = lb;
}
- else if (ub < a)
+ else if (ub < a)
{
a = ub;
}
}
-#endif //B3_GEN_MINMAX_H
+#endif //B3_GEN_MINMAX_H
diff --git a/thirdparty/bullet/Bullet3Common/b3PoolAllocator.h b/thirdparty/bullet/Bullet3Common/b3PoolAllocator.h
index 2fcdcf5b24..ed56bc627d 100644
--- a/thirdparty/bullet/Bullet3Common/b3PoolAllocator.h
+++ b/thirdparty/bullet/Bullet3Common/b3PoolAllocator.h
@@ -12,7 +12,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#ifndef _BT_POOL_ALLOCATOR_H
#define _BT_POOL_ALLOCATOR_H
@@ -22,37 +21,37 @@ subject to the following restrictions:
///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;
+ 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_elemSize(elemSize),
+ m_maxElements(maxElements)
{
- m_pool = (unsigned char*) b3AlignedAlloc( static_cast<unsigned int>(m_elemSize*m_maxElements),16);
+ m_pool = (unsigned char*)b3AlignedAlloc(static_cast<unsigned int>(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;
- }
+ 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);
+ b3AlignedFree(m_pool);
}
- int getFreeCount() const
+ int getFreeCount() const
{
return m_freeCount;
}
@@ -67,21 +66,22 @@ public:
return m_maxElements;
}
- void* allocate(int size)
+ 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;
+ 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 (ptr)
+ {
if (((unsigned char*)ptr >= m_pool && (unsigned char*)ptr < m_pool + m_maxElements * m_elemSize))
{
return true;
@@ -90,32 +90,32 @@ public:
return false;
}
- void freeMemory(void* ptr)
+ void freeMemory(void* ptr)
{
- if (ptr) {
- b3Assert((unsigned char*)ptr >= m_pool && (unsigned char*)ptr < m_pool + m_maxElements * m_elemSize);
+ 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;
- }
+ *(void**)ptr = m_firstFree;
+ m_firstFree = ptr;
+ ++m_freeCount;
+ }
}
- int getElementSize() const
+ int getElementSize() const
{
return m_elemSize;
}
- unsigned char* getPoolAddress()
+ unsigned char* getPoolAddress()
{
return m_pool;
}
- const unsigned char* getPoolAddress() const
+ const unsigned char* getPoolAddress() const
{
return m_pool;
}
-
};
-#endif //_BT_POOL_ALLOCATOR_H
+#endif //_BT_POOL_ALLOCATOR_H
diff --git a/thirdparty/bullet/Bullet3Common/b3QuadWord.h b/thirdparty/bullet/Bullet3Common/b3QuadWord.h
index 65c9581977..0def305fac 100644
--- a/thirdparty/bullet/Bullet3Common/b3QuadWord.h
+++ b/thirdparty/bullet/Bullet3Common/b3QuadWord.h
@@ -12,18 +12,13 @@ subject to the following restrictions:
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__)
+#if defined(__CELLOS_LV2) && defined(__SPU__)
#include <altivec.h>
#endif
@@ -31,58 +26,64 @@ subject to the following restrictions:
* 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
+B3_ATTRIBUTE_ALIGNED16(class)
+b3QuadWord
#else
class b3QuadWord
#endif
{
protected:
-
-#if defined (__SPU__) && defined (__CELLOS_LV2__)
+#if defined(__SPU__) && defined(__CELLOS_LV2__)
union {
vec_float4 mVec128;
- b3Scalar m_floats[4];
+ b3Scalar m_floats[4];
};
+
public:
- vec_float4 get128() const
+ vec_float4 get128() const
{
return mVec128;
}
-#else //__CELLOS_LV2__ __SPU__
+#else //__CELLOS_LV2__ __SPU__
-#if defined(B3_USE_SSE) || defined(B3_USE_NEON)
+#if defined(B3_USE_SSE) || defined(B3_USE_NEON)
public:
union {
b3SimdFloat4 mVec128;
- b3Scalar m_floats[4];
- struct {b3Scalar x,y,z,w;};
+ b3Scalar m_floats[4];
+ struct
+ {
+ b3Scalar x, y, z, w;
+ };
};
+
public:
- B3_FORCE_INLINE b3SimdFloat4 get128() const
+ B3_FORCE_INLINE b3SimdFloat4 get128() const
{
return mVec128;
}
- B3_FORCE_INLINE void set128(b3SimdFloat4 v128)
+ B3_FORCE_INLINE void set128(b3SimdFloat4 v128)
{
mVec128 = v128;
}
#else
public:
- union
- {
- b3Scalar m_floats[4];
- struct {b3Scalar x,y,z,w;};
+ union {
+ b3Scalar m_floats[4];
+ struct
+ {
+ b3Scalar x, y, z, w;
+ };
};
-#endif // B3_USE_SSE
+#endif // B3_USE_SSE
-#endif //__CELLOS_LV2__ __SPU__
+#endif //__CELLOS_LV2__ __SPU__
- public:
-
+public:
#if defined(B3_USE_SSE) || defined(B3_USE_NEON)
- // Set Vector
+ // Set Vector
B3_FORCE_INLINE b3QuadWord(const b3SimdFloat4 vec)
{
mVec128 = vec;
@@ -95,151 +96,147 @@ public:
}
// Assignment Operator
- B3_FORCE_INLINE b3QuadWord&
- operator=(const b3QuadWord& v)
+ 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]; }
+ /**@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 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
+ 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]));
+ 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
+ B3_FORCE_INLINE bool operator!=(const b3QuadWord& other) const
{
return !(*this == other);
}
- /**@brief Set x,y,z and zero w
+ /**@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;
- }
+ 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
+ /* void getValue(b3Scalar *m) const
{
m[0] = m_floats[0];
m[1] = m_floats[1];
m[2] = m_floats[2];
}
*/
-/**@brief Set the values
+ /**@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)
+ 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;
- }
+ 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
+ /**@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;
- }
+ 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
+ /**@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
+ 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
- }
-
-
-
+ 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
+#endif //B3_SIMD_QUADWORD_H
diff --git a/thirdparty/bullet/Bullet3Common/b3Quaternion.h b/thirdparty/bullet/Bullet3Common/b3Quaternion.h
index ad20543348..9bd5ff7d90 100644
--- a/thirdparty/bullet/Bullet3Common/b3Quaternion.h
+++ b/thirdparty/bullet/Bullet3Common/b3Quaternion.h
@@ -12,19 +12,12 @@ subject to the following restrictions:
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};
@@ -39,13 +32,14 @@ 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 {
+class b3Quaternion : public b3QuadWord
+{
public:
- /**@brief No initialization constructor */
+ /**@brief No initialization constructor */
b3Quaternion() {}
-#if (defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE))|| defined(B3_USE_NEON)
- // Set Vector
+#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;
@@ -58,63 +52,70 @@ public:
}
// Assignment Operator
- B3_FORCE_INLINE b3Quaternion&
- operator=(const b3Quaternion& v)
+ B3_FORCE_INLINE b3Quaternion&
+ operator=(const b3Quaternion& v)
{
mVec128 = v.mVec128;
-
+
return *this;
}
-
+
#endif
// template <typename b3Scalar>
// explicit Quaternion(const b3Scalar *v) : Tuple4<b3Scalar>(v) {}
- /**@brief Constructor from scalars */
- b3Quaternion(const b3Scalar& _x, const b3Scalar& _y, const b3Scalar& _z, const b3Scalar& _w)
- : b3QuadWord(_x, _y, _z, _w)
+ /**@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
+ /**@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);
+ b3Quaternion(const b3Vector3& _axis, const b3Scalar& _angle)
+ {
+ setRotation(_axis, _angle);
}
- /**@brief Constructor from Euler angles
+ /**@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);
+ setEuler(yaw, pitch, roll);
#else
- setEulerZYX(yaw, pitch, roll);
-#endif
+ setEulerZYX(yaw, pitch, roll);
+#endif
}
- /**@brief Set the rotation using axis angle notation
+ /**@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& axis, const b3Scalar& _angle)
{
b3Scalar d = axis.length();
b3Assert(d != b3Scalar(0.0));
- b3Scalar s = b3Sin(_angle * b3Scalar(0.5)) / d;
- setValue(axis.getX() * s, axis.getY() * s, axis.getZ() * s,
- b3Cos(_angle * b3Scalar(0.5)));
+ 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
+ /**@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 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);
@@ -122,34 +123,34 @@ public:
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);
+ 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 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
+ 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
+ /**@brief Get the euler angles from this quaternion
* @param yaw Angle around Z
* @param pitch Angle around Y
* @param roll Angle around X */
@@ -166,221 +167,221 @@ public:
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));
+ 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
+ /**@brief Add two quaternions
* @param q The quaternion to add to this one */
- B3_FORCE_INLINE b3Quaternion& operator+=(const b3Quaternion& q)
+ B3_FORCE_INLINE b3Quaternion& operator+=(const b3Quaternion& q)
{
-#if defined (B3_USE_SSE_IN_API) && defined (B3_USE_SSE)
+#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];
+#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
+ /**@brief Subtract out a quaternion
* @param q The quaternion to subtract from this one */
- b3Quaternion& operator-=(const b3Quaternion& q)
+ b3Quaternion& operator-=(const b3Quaternion& q)
{
-#if defined (B3_USE_SSE_IN_API) && defined (B3_USE_SSE)
+#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];
+#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;
+ return *this;
}
- /**@brief Scale this quaternion
+ /**@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)
+#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;
+ 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
+ /**@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)
+#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));
-
+
+ __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));
-
+
+ __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;
+
+ 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.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
+ /**@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;
-
+#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);
+
+ __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);
+
+ 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));
+ 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];
+#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 */
+ /**@brief Return the length squared of the quaternion */
b3Scalar length2() const
{
return dot(*this);
}
- /**@brief Return the length of the quaternion */
+ /**@brief Return the length of the quaternion */
b3Scalar length() const
{
return b3Sqrt(length2());
}
- /**@brief Normalize the quaternion
+ /**@brief Normalize the quaternion
* Such that x^2 + y^2 + z^2 +w^2 = 1 */
- b3Quaternion& normalize()
+ b3Quaternion& normalize()
{
-#if defined (B3_USE_SSE_IN_API) && defined (B3_USE_SSE)
- __m128 vd;
-
+#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);
+
+ __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
+ vd = b3_pshufd_ps(vd, 0); // splat
mVec128 = _mm_mul_ps(mVec128, vd);
-
+
return *this;
-#else
+#else
return *this /= length();
#endif
}
- /**@brief Return a scaled version of this quaternion
+ /**@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)
-
+#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));
@@ -389,7 +390,7 @@ public:
#endif
}
- /**@brief Return an inversely scaled versionof this quaternion
+ /**@brief Return an inversely scaled versionof this quaternion
* @param s The inverse scale factor */
b3Quaternion operator/(const b3Scalar& s) const
{
@@ -397,29 +398,29 @@ public:
return *this * (b3Scalar(1.0) / s);
}
- /**@brief Inversely scale this quaternion
+ /**@brief Inversely scale this quaternion
* @param s The scale factor */
- b3Quaternion& operator/=(const b3Scalar& s)
+ 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
+ /**@brief Return a normalized version of this quaternion */
+ b3Quaternion normalized() const
{
return *this / length();
- }
- /**@brief Return the angle between this quaternion and the other
+ }
+ /**@brief Return the angle between this quaternion and the other
* @param q The other quaternion */
- b3Scalar angle(const b3Quaternion& q) const
+ 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
+ /**@brief Return the angle of rotation represented by this quaternion */
+ b3Scalar getAngle() const
{
b3Scalar s = b3Scalar(2.) * b3Acos(m_floats[3]);
return s;
@@ -428,117 +429,116 @@ public:
/**@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);
+ 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)
+#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((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
+ /**@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)
+#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
+ 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
+ /**@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)
+#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
+ 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
+ /**@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)
+#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
+ 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]);
+ 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
+ /**@todo document this and it's use */
+ B3_FORCE_INLINE b3Quaternion farthest(const b3Quaternion& qd) const
{
- b3Quaternion diff,sum;
+ b3Quaternion diff, sum;
diff = *this - qd;
sum = *this + qd;
- if( diff.dot(diff) > sum.dot(sum) )
+ 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
+ B3_FORCE_INLINE b3Quaternion nearest(const b3Quaternion& qd) const
{
- b3Quaternion diff,sum;
+ b3Quaternion diff, sum;
diff = *this - qd;
sum = *this + qd;
- if( diff.dot(diff) < sum.dot(sum) )
+ 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
+ /**@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 magnitude = b3Sqrt(length2() * q.length2());
+ b3Assert(magnitude > b3Scalar(0));
- b3Scalar product = dot(q) / magnitude;
- if (b3Fabs(product) < b3Scalar(1))
+ 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);
+ // 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
{
@@ -546,301 +546,294 @@ public:
}
}
- static const b3Quaternion& getIdentity()
+ static const b3Quaternion& getIdentity()
{
- static const b3Quaternion identityQuat(b3Scalar(0.),b3Scalar(0.),b3Scalar(0.),b3Scalar(1.));
+ 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)
+operator*(const b3Quaternion& q1, const b3Quaternion& q2)
{
-#if defined (B3_USE_SSE_IN_API) && defined (B3_USE_SSE)
+#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 = 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 = 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
+ 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
+ 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
- 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)
+#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];
+ 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);
+ 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);
+ 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);
+ 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
+ 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));
+ 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
+ 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
-
+ 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.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());
+ 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)
+#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 = 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 = 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
+ 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
- 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)
+
+#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;
+ float32x2_t vQ1wx, vQ2zx, vQ1yz, vQ2yz, vQ1zx, vQ2xz;
- tmp = vtrn_f32( vget_high_f32(vQ2), vget_low_f32(vQ2) ); // {z x}, {w y}
- vQ2zx = tmp.val[0];
+ vQ1wx = vext_f32(vget_high_f32(vQ1), vget_low_f32(vQ1), 1);
+ {
+ 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];
- vQ1yz = vext_f32(vget_low_f32(vQ1), vget_high_f32(vQ1), 1);
+ 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);
+ 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
+ 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));
+ 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
+ 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
-
+ 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());
+ 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)
+#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 = 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;
+ 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
- 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
- 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)
+#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];
+ float32x4_t A1, B1, A2, B2, A3, B3;
+ float32x2_t vQ1zx, vQ2wx, vQ1yz, vQ2zx, vQ2yz, vQ2xz;
- 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);
+ {
+ 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);
+ 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);
+ 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
+ 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));
+ 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
+ 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
-
+ 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(),
+ 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());
+ -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);
+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();
+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);
+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)
+b3Inverse(const b3Quaternion& q)
{
return q.inverse();
}
@@ -851,7 +844,7 @@ b3Inverse(const b3Quaternion& q)
* @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)
+b3Slerp(const b3Quaternion& q1, const b3Quaternion& q2, const b3Scalar& t)
{
return q1.slerp(q2, t);
}
@@ -859,7 +852,7 @@ b3Slerp(const b3Quaternion& q1, const b3Quaternion& q2, const b3Scalar& t)
B3_FORCE_INLINE b3Quaternion
b3QuatMul(const b3Quaternion& rot0, const b3Quaternion& rot1)
{
- return rot0*rot1;
+ return rot0 * rot1;
}
B3_FORCE_INLINE b3Quaternion
@@ -868,51 +861,45 @@ b3QuatNormalized(const b3Quaternion& orn)
return orn.normalized();
}
-
-
-B3_FORCE_INLINE b3Vector3
-b3QuatRotate(const b3Quaternion& rotation, const b3Vector3& v)
+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)
+#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());
+ 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
+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);
+ 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
+ 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 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);
-
+ return b3Quaternion(c.getX() * rs, c.getY() * rs, c.getZ() * rs, s * 0.5f);
}
-B3_FORCE_INLINE b3Quaternion
-b3ShortestArcQuatNormalize2(b3Vector3& v0,b3Vector3& v1)
+B3_FORCE_INLINE b3Quaternion
+b3ShortestArcQuatNormalize2(b3Vector3& v0, b3Vector3& v1)
{
v0.normalize();
v1.normalize();
- return b3ShortestArcQuat(v0,v1);
+ return b3ShortestArcQuat(v0, v1);
}
-#endif //B3_SIMD__QUATERNION_H_
-
-
-
+#endif //B3_SIMD__QUATERNION_H_
diff --git a/thirdparty/bullet/Bullet3Common/b3Random.h b/thirdparty/bullet/Bullet3Common/b3Random.h
index dc040f1562..c2e21496c7 100644
--- a/thirdparty/bullet/Bullet3Common/b3Random.h
+++ b/thirdparty/bullet/Bullet3Common/b3Random.h
@@ -12,8 +12,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
-
#ifndef B3_GEN_RANDOM_H
#define B3_GEN_RANDOM_H
@@ -26,8 +24,8 @@ subject to the following restrictions:
#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(); }
+B3_FORCE_INLINE void b3Srand(unsigned int seed) { init_genrand(seed); }
+B3_FORCE_INLINE unsigned int b3rand() { return genrand_int32(); }
#else
@@ -35,8 +33,8 @@ B3_FORCE_INLINE unsigned int b3rand() { return genrand_int32()
#define B3_RAND_MAX RAND_MAX
-B3_FORCE_INLINE void b3Srand(unsigned int seed) { srand(seed); }
-B3_FORCE_INLINE unsigned int b3rand() { return rand(); }
+B3_FORCE_INLINE void b3Srand(unsigned int seed) { srand(seed); }
+B3_FORCE_INLINE unsigned int b3rand() { return rand(); }
#endif
@@ -45,6 +43,4 @@ inline b3Scalar b3RandRange(b3Scalar minRange, b3Scalar maxRange)
return (b3rand() / (b3Scalar(B3_RAND_MAX) + b3Scalar(1.0))) * (maxRange - minRange) + minRange;
}
-
-#endif //B3_GEN_RANDOM_H
-
+#endif //B3_GEN_RANDOM_H
diff --git a/thirdparty/bullet/Bullet3Common/b3ResizablePool.h b/thirdparty/bullet/Bullet3Common/b3ResizablePool.h
index 06ad8a778d..cafe3ff396 100644
--- a/thirdparty/bullet/Bullet3Common/b3ResizablePool.h
+++ b/thirdparty/bullet/Bullet3Common/b3ResizablePool.h
@@ -4,10 +4,10 @@
#include "Bullet3Common/b3AlignedObjectArray.h"
-enum
+enum
{
- B3_POOL_HANDLE_TERMINAL_FREE=-1,
- B3_POOL_HANDLE_TERMINAL_USED =-2
+ B3_POOL_HANDLE_TERMINAL_FREE = -1,
+ B3_POOL_HANDLE_TERMINAL_USED = -2
};
template <typename U>
@@ -20,25 +20,23 @@ struct b3PoolBodyHandle : public U
{
m_nextFreeHandle = next;
}
- int getNextFree() const
+ int getNextFree() const
{
return m_nextFreeHandle;
}
};
-template <typename T>
+template <typename T>
class b3ResizablePool
{
-
protected:
- b3AlignedObjectArray<T> m_bodyHandles;
- int m_numUsedHandles; // number of active handles
- int m_firstFreeHandle; // free handles list
+ b3AlignedObjectArray<T> 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
{
@@ -46,17 +44,16 @@ protected:
}
public:
-
b3ResizablePool()
{
initHandles();
}
-
+
virtual ~b3ResizablePool()
{
exitHandles();
}
-///handle management
+ ///handle management
int getNumHandles() const
{
@@ -65,44 +62,40 @@ public:
void getUsedHandles(b3AlignedObjectArray<int>& usedHandles) const
{
-
- for (int i=0;i<m_bodyHandles.size();i++)
+ for (int i = 0; i < m_bodyHandles.size(); i++)
{
- if (m_bodyHandles[i].getNextFree()==B3_POOL_HANDLE_TERMINAL_USED)
+ 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()))
+ 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)
+ 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()))
+ 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)
+ if (m_bodyHandles[handle].getNextFree() == B3_POOL_HANDLE_TERMINAL_USED)
{
return &m_bodyHandles[handle];
}
@@ -120,7 +113,6 @@ public:
for (int i = curCapacity; i < newCapacity; i++)
m_bodyHandles[i].setNextFree(i + 1);
-
m_bodyHandles[newCapacity - 1].setNextFree(-1);
}
m_firstFreeHandle = curCapacity;
@@ -142,19 +134,18 @@ public:
int allocHandle()
{
- b3Assert(m_firstFreeHandle>=0);
+ b3Assert(m_firstFreeHandle >= 0);
int handle = m_firstFreeHandle;
m_firstFreeHandle = getHandleInternal(handle)->getNextFree();
m_numUsedHandles++;
- if (m_firstFreeHandle<0)
+ if (m_firstFreeHandle < 0)
{
//int curCapacity = m_bodyHandles.size();
- int additionalCapacity= m_bodyHandles.size();
+ int additionalCapacity = m_bodyHandles.size();
increaseHandleCapacity(additionalCapacity);
-
getHandleInternal(handle)->setNextFree(m_firstFreeHandle);
}
getHandleInternal(handle)->setNextFree(B3_POOL_HANDLE_TERMINAL_USED);
@@ -162,12 +153,11 @@ public:
return handle;
}
-
void freeHandle(int handle)
{
b3Assert(handle >= 0);
- if (m_bodyHandles[handle].getNextFree()==B3_POOL_HANDLE_TERMINAL_USED)
+ if (m_bodyHandles[handle].getNextFree() == B3_POOL_HANDLE_TERMINAL_USED)
{
getHandleInternal(handle)->clear();
getHandleInternal(handle)->setNextFree(m_firstFreeHandle);
@@ -176,7 +166,6 @@ public:
}
}
};
- ///end handle management
-
- #endif //B3_RESIZABLE_POOL_H
- \ No newline at end of file
+///end handle management
+
+#endif //B3_RESIZABLE_POOL_H
diff --git a/thirdparty/bullet/Bullet3Common/b3Scalar.h b/thirdparty/bullet/Bullet3Common/b3Scalar.h
index dbc7fea397..0db5eb6f4f 100644
--- a/thirdparty/bullet/Bullet3Common/b3Scalar.h
+++ b/thirdparty/bullet/Bullet3Common/b3Scalar.h
@@ -12,8 +12,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
-
#ifndef B3_SCALAR_H
#define B3_SCALAR_H
@@ -22,238 +20,252 @@ subject to the following restrictions:
#pragma unmanaged
#endif
-
-
#include <math.h>
-#include <stdlib.h>//size_t for MSVC 6.0
+#include <stdlib.h> //size_t for MSVC 6.0
#include <float.h>
//Original repository is at http://github.com/erwincoumans/bullet3
#define B3_BULLET_VERSION 300
-inline int b3GetVersion()
+inline int b3GetVersion()
{
return B3_BULLET_VERSION;
}
-#if defined(DEBUG) || defined (_DEBUG)
+#if defined(DEBUG) || defined(_DEBUG)
#define B3_DEBUG
#endif
-#include "b3Logging.h"//for b3Error
-
+#include "b3Logging.h" //for b3Error
#ifdef _WIN32
- #if defined(__MINGW32__) || defined(__CYGWIN__) || (defined (_MSC_VER) && _MSC_VER < 1300)
+#if defined(__MINGW32__) || defined(__CYGWIN__) || (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
+#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 : 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 <ppcintrinsics.h>
- #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))
- #define B3_USE_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 <emmintrin.h>
- #endif
+#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 <ppcintrinsics.h>
+#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))
+#define B3_USE_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 <emmintrin.h>
+#endif
#endif
- #endif//_XBOX
+#endif //_XBOX
- #endif //__MINGW32__
+#endif //__MINGW32__
#ifdef B3_DEBUG
- #ifdef _MSC_VER
- #include <stdio.h>
- #define b3Assert(x) { if(!(x)){b3Error("Assert "__FILE__ ":%u ("#x")\n", __LINE__);__debugbreak(); }}
- #else//_MSC_VER
- #include <assert.h>
- #define b3Assert assert
- #endif//_MSC_VER
+#ifdef _MSC_VER
+#include <stdio.h>
+#define b3Assert(x) \
+ { \
+ if (!(x)) \
+ { \
+ b3Error( \
+ "Assert "__FILE__ \
+ ":%u (" #x ")\n", \
+ __LINE__); \
+ __debugbreak(); \
+ } \
+ }
+#else //_MSC_VER
+#include <assert.h>
+#define b3Assert assert
+#endif //_MSC_VER
#else
- #define b3Assert(x)
+#define b3Assert(x)
#endif
- //b3FullAssert is optional, slows down a lot
- #define b3FullAssert(x)
+//b3FullAssert is optional, slows down a lot
+#define b3FullAssert(x)
- #define b3Likely(_c) _c
- #define b3Unlikely(_c) _c
+#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 <assert.h>
- #endif
+
+#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 <assert.h>
+#endif
#ifdef B3_DEBUG
#ifdef __SPU__
#include <spu_printf.h>
#define printf spu_printf
- #define b3Assert(x) {if(!(x)){b3Error("Assert "__FILE__ ":%u ("#x")\n", __LINE__);spu_hcmpeq(0,0);}}
+#define b3Assert(x) \
+ { \
+ if (!(x)) \
+ { \
+ b3Error( \
+ "Assert "__FILE__ \
+ ":%u (" #x ")\n", \
+ __LINE__); \
+ spu_hcmpeq(0, 0); \
+ } \
+ }
#else
- #define b3Assert assert
+#define b3Assert assert
#endif
-
+
#else
- #define b3Assert(x)
+#define b3Assert(x)
#endif
- //b3FullAssert is optional, slows down a lot
- #define b3FullAssert(x)
+//b3FullAssert is optional, slows down a lot
+#define b3FullAssert(x)
- #define b3Likely(_c) _c
- #define b3Unlikely(_c) _c
+#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 <assert.h>
- #endif
+#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 <assert.h>
+#endif
#ifdef B3_DEBUG
- #define b3Assert assert
+#define b3Assert assert
#else
- #define b3Assert(x)
+#define b3Assert(x)
#endif
- //b3FullAssert is optional, slows down a lot
- #define b3FullAssert(x)
+//b3FullAssert is optional, slows down a lot
+#define b3FullAssert(x)
+#define b3Likely(_c) __builtin_expect((_c), 1)
+#define b3Unlikely(_c) __builtin_expect((_c), 0)
- #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 <smmintrin.h>
- #elif defined (__SSSE3__)
- #include <tmmintrin.h>
- #elif defined (__SSE3__)
- #include <pmmintrin.h>
- #else
- #include <emmintrin.h>
- #endif
- #endif //B3_USE_SSE
- #elif defined( __armv7__ )
- #ifdef __clang__
- #define B3_USE_NEON 1
-
- #if defined B3_USE_NEON && defined (__clang__)
- #include <arm_neon.h>
- #endif//B3_USE_NEON
- #endif //__clang__
- #endif//__arm__
-
- #define B3_FORCE_INLINE inline __attribute__ ((always_inline))
+//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 <smmintrin.h>
+#elif defined(__SSSE3__)
+#include <tmmintrin.h>
+#elif defined(__SSE3__)
+#include <pmmintrin.h>
+#else
+#include <emmintrin.h>
+#endif
+#endif //B3_USE_SSE
+#elif defined(__armv7__)
+#ifdef __clang__
+#define B3_USE_NEON 1
+
+#if defined B3_USE_NEON && defined(__clang__)
+#include <arm_neon.h>
+#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 <assert.h>
- #endif
-
- #if defined(DEBUG) || defined (_DEBUG)
- #if defined (__i386__) || defined (__x86_64__)
- #include <stdio.h>
- #define b3Assert(x)\
- {\
- if(!(x))\
- {\
- b3Error("Assert %s in line %d, file %s\n",#x, __LINE__, __FILE__);\
- asm volatile ("int3");\
- }\
+#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 <assert.h>
+#endif
+
+#if defined(DEBUG) || defined(_DEBUG)
+#if defined(__i386__) || defined(__x86_64__)
+#include <stdio.h>
+#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 //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 <assert.h>
- #endif
-
-#if defined(DEBUG) || defined (_DEBUG)
- #define b3Assert assert
+#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 <assert.h>
+#endif
+
+#if defined(DEBUG) || defined(_DEBUG)
+#define b3Assert assert
#else
- #define b3Assert(x)
+#define b3Assert(x)
#endif
- //b3FullAssert is optional, slows down a lot
- #define b3FullAssert(x)
- #define b3Likely(_c) _c
- #define b3Unlikely(_c) _c
-#endif //__APPLE__
+//b3FullAssert is optional, slows down a lot
+#define b3FullAssert(x)
+#define b3Likely(_c) _c
+#define b3Unlikely(_c) _c
+#endif //__APPLE__
-#endif // LIBSPE2
+#endif // LIBSPE2
-#endif //__CELLOS_LV2__
+#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;
@@ -267,34 +279,34 @@ typedef float b3Scalar;
#ifdef B3_USE_SSE
typedef __m128 b3SimdFloat4;
-#endif//B3_USE_SSE
+#endif //B3_USE_SSE
-#if defined B3_USE_SSE_IN_API && defined (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)
+#define B3_NAN (*(float *)&b3NanMask)
#endif
#ifndef B3_INFINITY_MASK
-static int b3InfinityMask = 0x7F800000;
-#define B3_INFINITY_MASK (*(float*)&b3InfinityMask)
+static int b3InfinityMask = 0x7F800000;
+#define B3_INFINITY_MASK (*(float *)&b3InfinityMask)
#endif
-inline __m128 operator + (const __m128 A, const __m128 B)
+inline __m128 operator+(const __m128 A, const __m128 B)
{
- return _mm_add_ps(A, B);
+ return _mm_add_ps(A, B);
}
-inline __m128 operator - (const __m128 A, const __m128 B)
+inline __m128 operator-(const __m128 A, const __m128 B)
{
- return _mm_sub_ps(A, B);
+ return _mm_sub_ps(A, B);
}
-inline __m128 operator * (const __m128 A, const __m128 B)
+inline __m128 operator*(const __m128 A, const __m128 B)
{
- return _mm_mul_ps(A, B);
+ return _mm_mul_ps(A, B);
}
#define b3CastfTo128i(a) (_mm_castps_si128(a))
@@ -302,18 +314,19 @@ inline __m128 operator * (const __m128 A, const __m128 B)
#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)
+#define b3Assign128(r0, r1, r2, r3) _mm_setr_ps(r0, r1, r2, r3)
-#else//_WIN32
+#else //_WIN32
#define b3CastfTo128i(a) ((__m128i)(a))
#define b3CastfTo128d(a) ((__m128d)(a))
-#define b3CastiTo128f(a) ((__m128) (a))
-#define b3CastdTo128f(a) ((__m128) (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
+#define b3Assign128(r0, r1, r2, r3) \
+ (__m128) { r0, r1, r2, r3 }
+#endif //_WIN32
+#endif //B3_USE_SSE_IN_API
#ifdef B3_USE_NEON
#include <arm_neon.h>
@@ -321,142 +334,160 @@ inline __m128 operator * (const __m128 A, const __m128 B)
typedef float32x4_t b3SimdFloat4;
#define B3_INFINITY INFINITY
#define B3_NAN NAN
-#define b3Assign128(r0,r1,r2,r3) (float32x4_t){r0,r1,r2,r3}
+#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*) { } \
-
-
+#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 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 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); }
+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)
-{
+
+B3_FORCE_INLINE b3Scalar b3Sqrt(b3Scalar y)
+{
#ifdef USE_APPROXIMATION
- double x, z, tempf;
- unsigned long *tfptr = ((unsigned long *)&tempf) + 1;
+ 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;
+ *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);
+ 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 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 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); }
-
+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_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_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 */
-
+#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
+#define B3_EPSILON DBL_EPSILON
+#define B3_INFINITY DBL_MAX
#else
-#define B3_EPSILON FLT_EPSILON
-#define B3_INFINITY FLT_MAX
+#define B3_EPSILON FLT_EPSILON
+#define B3_INFINITY FLT_MAX
#endif
-B3_FORCE_INLINE b3Scalar b3Atan2Fast(b3Scalar y, b3Scalar x)
+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) {
+ if (x >= 0.0f)
+ {
b3Scalar r = (x - abs_y) / (x + abs_y);
angle = coeff_1 - coeff_1 * r;
- } else {
+ }
+ 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 b3FuzzyZero(b3Scalar x) { return b3Fabs(x) < B3_EPSILON; }
-B3_FORCE_INLINE bool b3Equal(b3Scalar a, b3Scalar eps) {
+B3_FORCE_INLINE bool b3Equal(b3Scalar a, b3Scalar eps)
+{
return (((a) <= eps) && !((a) < -eps));
}
-B3_FORCE_INLINE bool b3GreaterEqual (b3Scalar a, b3Scalar 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 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
+#define B3_DECLARE_HANDLE(name) \
+ typedef struct name##__ \
+ { \
+ int unused; \
+ } * name
#ifndef b3Fsel
B3_FORCE_INLINE b3Scalar b3Fsel(b3Scalar a, b3Scalar b, b3Scalar c)
@@ -464,60 +495,57 @@ 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)
-
+#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;
+ 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)
+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));
+ // 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<int>((valueIfConditionNonZero & testNz) | (valueIfConditionZero & testEqz));
+ unsigned testNz = (unsigned)(((int)condition | -(int)condition) >> 31);
+ unsigned testEqz = ~testNz;
+ return static_cast<int>((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);
+ return (float)b3Fsel((b3Scalar)condition - b3Scalar(1.0f), valueIfConditionNonZero, valueIfConditionZero);
#else
- return (condition != 0) ? valueIfConditionNonZero : valueIfConditionZero;
+ return (condition != 0) ? valueIfConditionNonZero : valueIfConditionZero;
#endif
}
-template<typename T> B3_FORCE_INLINE void b3Swap(T& a, T& b)
+template <typename T>
+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));
+ return (((val & 0xff000000) >> 24) | ((val & 0x00ff0000) >> 8) | ((val & 0x0000ff00) << 8) | ((val & 0x000000ff) << 24));
}
B3_FORCE_INLINE unsigned short b3SwapEndian(unsigned short val)
@@ -532,87 +560,85 @@ B3_FORCE_INLINE unsigned b3SwapEndian(int val)
B3_FORCE_INLINE unsigned short b3SwapEndian(short val)
{
- return b3SwapEndian((unsigned 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.
+///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)
+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;
+ 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)
+B3_FORCE_INLINE float b3UnswapEndianFloat(unsigned int a)
{
- float d = 0.0f;
- unsigned char *src = (unsigned char *)&a;
- unsigned char *dst = (unsigned char *)&d;
+ 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];
+ dst[0] = src[3];
+ dst[1] = src[2];
+ dst[2] = src[1];
+ dst[3] = src[0];
- return d;
+ return d;
}
-
// swap using char pointers
-B3_FORCE_INLINE void b3SwapEndianDouble(double d, unsigned char* dst)
+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];
-
+ 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)
+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];
+ 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)
+B3_FORCE_INLINE b3Scalar b3NormalizeAngle(b3Scalar angleInRadians)
{
angleInRadians = b3Fmod(angleInRadians, B3_2_PI);
- if(angleInRadians < -B3_PI)
+ if (angleInRadians < -B3_PI)
{
return angleInRadians + B3_2_PI;
}
- else if(angleInRadians > B3_PI)
+ else if (angleInRadians > B3_PI)
{
return angleInRadians - B3_2_PI;
}
@@ -626,38 +652,34 @@ B3_FORCE_INLINE b3Scalar b3NormalizeAngle(b3Scalar angleInRadians)
struct b3TypedObject
{
b3TypedObject(int objectType)
- :m_objectType(objectType)
+ : m_objectType(objectType)
{
}
- int m_objectType;
+ int m_objectType;
inline int getObjectType() const
{
return m_objectType;
}
};
-
-
///align a pointer to the provided alignment, upwards
-template <typename T>T* b3AlignPointer(T* unalignedPtr, size_t alignment)
+template <typename T>
+T *b3AlignPointer(T *unalignedPtr, size_t alignment)
{
-
struct b3ConvertPointerSizeT
{
- union
- {
- T* ptr;
- size_t integer;
+ union {
+ T *ptr;
+ size_t integer;
};
};
- b3ConvertPointerSizeT converter;
-
-
+ b3ConvertPointerSizeT converter;
+
const size_t bit_mask = ~(alignment - 1);
- converter.ptr = unalignedPtr;
- converter.integer += alignment-1;
+ converter.ptr = unalignedPtr;
+ converter.integer += alignment - 1;
converter.integer &= bit_mask;
return converter.ptr;
}
-#endif //B3_SCALAR_H
+#endif //B3_SCALAR_H
diff --git a/thirdparty/bullet/Bullet3Common/b3StackAlloc.h b/thirdparty/bullet/Bullet3Common/b3StackAlloc.h
index de7de056b5..4972236ac7 100644
--- a/thirdparty/bullet/Bullet3Common/b3StackAlloc.h
+++ b/thirdparty/bullet/Bullet3Common/b3StackAlloc.h
@@ -20,97 +20,99 @@ Nov.2006
#ifndef B3_STACK_ALLOC
#define B3_STACK_ALLOC
-#include "b3Scalar.h" //for b3Assert
+#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;
+ 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(); }
- b3StackAlloc(unsigned int size) { ctor();create(size); }
- ~b3StackAlloc() { destroy(); }
-
- inline void create(unsigned int size)
+ inline void create(unsigned int size)
{
destroy();
- data = (unsigned char*) b3AlignedAlloc(size,16);
- totalsize = size;
+ data = (unsigned char*)b3AlignedAlloc(size, 16);
+ totalsize = size;
}
- inline void destroy()
+ inline void destroy()
{
- b3Assert(usedsize==0);
+ b3Assert(usedsize == 0);
//Raise(L"StackAlloc is still in use");
- if(usedsize==0)
+ if (usedsize == 0)
{
- if(!ischild && data)
+ if (!ischild && data)
b3AlignedFree(data);
- data = 0;
- usedsize = 0;
+ data = 0;
+ usedsize = 0;
}
-
}
- int getAvailableMemory() const
+ int getAvailableMemory() const
{
return static_cast<int>(totalsize - usedsize);
}
- unsigned char* allocate(unsigned int size)
+ unsigned char* allocate(unsigned int size)
{
- const unsigned int nus(usedsize+size);
- if(nus<totalsize)
+ const unsigned int nus(usedsize + size);
+ if (nus < totalsize)
{
- usedsize=nus;
- return(data+(usedsize-size));
+ usedsize = nus;
+ return (data + (usedsize - size));
}
b3Assert(0);
//&& (L"Not enough memory"));
-
- return(0);
+
+ return (0);
}
- B3_FORCE_INLINE b3Block* beginBlock()
+ B3_FORCE_INLINE b3Block* beginBlock()
{
- b3Block* pb = (b3Block*)allocate(sizeof(b3Block));
- pb->previous = current;
- pb->address = data+usedsize;
- current = pb;
- return(pb);
+ b3Block* pb = (b3Block*)allocate(sizeof(b3Block));
+ pb->previous = current;
+ pb->address = data + usedsize;
+ current = pb;
+ return (pb);
}
- B3_FORCE_INLINE void endBlock(b3Block* block)
+ B3_FORCE_INLINE void endBlock(b3Block* block)
{
- b3Assert(block==current);
+ b3Assert(block == current);
//Raise(L"Unmatched blocks");
- if(block==current)
+ if (block == current)
{
- current = block->previous;
- usedsize = (unsigned int)((block->address-data)-sizeof(b3Block));
+ current = block->previous;
+ usedsize = (unsigned int)((block->address - data) - sizeof(b3Block));
}
}
private:
- void ctor()
+ void ctor()
{
- data = 0;
- totalsize = 0;
- usedsize = 0;
- current = 0;
- ischild = false;
+ data = 0;
+ totalsize = 0;
+ usedsize = 0;
+ current = 0;
+ ischild = false;
}
- unsigned char* data;
- unsigned int totalsize;
- unsigned int usedsize;
- b3Block* current;
- bool ischild;
+ unsigned char* data;
+ unsigned int totalsize;
+ unsigned int usedsize;
+ b3Block* current;
+ bool ischild;
};
-#endif //B3_STACK_ALLOC
+#endif //B3_STACK_ALLOC
diff --git a/thirdparty/bullet/Bullet3Common/b3Transform.h b/thirdparty/bullet/Bullet3Common/b3Transform.h
index fa480759be..149da9d148 100644
--- a/thirdparty/bullet/Bullet3Common/b3Transform.h
+++ b/thirdparty/bullet/Bullet3Common/b3Transform.h
@@ -12,11 +12,9 @@ subject to the following restrictions:
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
@@ -25,46 +23,45 @@ subject to the following restrictions:
#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
+B3_ATTRIBUTE_ALIGNED16(class)
+b3Transform
+{
+ ///Storage for the rotation
b3Matrix3x3 m_basis;
- ///Storage for the translation
- b3Vector3 m_origin;
+ ///Storage for the translation
+ b3Vector3 m_origin;
public:
-
- /**@brief No initialization constructor */
+ /**@brief No initialization constructor */
b3Transform() {}
- /**@brief Constructor from b3Quaternion (optional b3Vector3 )
+ /**@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)))
+ explicit B3_FORCE_INLINE b3Transform(const b3Quaternion& q,
+ const b3Vector3& c = b3MakeVector3(b3Scalar(0), b3Scalar(0), b3Scalar(0)))
: m_basis(q),
- m_origin(c)
- {}
+ m_origin(c)
+ {
+ }
- /**@brief Constructor from b3Matrix3x3 (optional b3Vector3)
+ /**@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)))
+ 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_origin(c)
+ {
+ }
+ /**@brief Copy constructor */
+ B3_FORCE_INLINE b3Transform(const b3Transform& other)
: m_basis(other.m_basis),
- m_origin(other.m_origin)
+ m_origin(other.m_origin)
{
}
- /**@brief Assignment Operator */
+ /**@brief Assignment Operator */
B3_FORCE_INLINE b3Transform& operator=(const b3Transform& other)
{
m_basis = other.m_basis;
@@ -72,70 +69,70 @@ public:
return *this;
}
-
- /**@brief Set the current transform as the value of the product of two transforms
+ /**@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);
- }
+ 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) {
+ /* 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 */
+ /**@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;
+ return x.dot3(m_basis[0], m_basis[1], m_basis[2]) + m_origin;
}
- /**@brief Return the transform of the vector */
+ /**@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 */
+ /**@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 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 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 {
+ /**@brief Return a quaternion representing the rotation */
+ b3Quaternion getRotation() const
+ {
b3Quaternion q;
m_basis.getRotation(q);
return q;
}
-
-
- /**@brief Set from an array
+
+ /**@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)
+ void setFromOpenGLMatrix(const b3Scalar* m)
{
m_basis.setFromOpenGLSubMatrix(m);
- m_origin.setValue(m[12],m[13],m[14]);
+ m_origin.setValue(m[12], m[13], m[14]);
}
- /**@brief Fill an array representation
+ /**@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
+ void getOpenGLMatrix(b3Scalar * m) const
{
m_basis.getOpenGLSubMatrix(m);
m[12] = m_origin.getX();
@@ -144,80 +141,76 @@ public:
m[15] = b3Scalar(1.0);
}
- /**@brief Set the translational element
+ /**@brief Set the translational element
* @param origin The vector to set the translation to */
- B3_FORCE_INLINE void setOrigin(const b3Vector3& origin)
- {
+ 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 */
+ /**@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 */
+ /**@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 */
+ /**@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)
+ /**@brief Multiply this Transform by another(this = this * another)
* @param t The other transform */
- b3Transform& operator*=(const b3Transform& t)
+ 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 */
+ /**@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
+ /**@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;
+ b3Transform inverseTimes(const b3Transform& t) const;
- /**@brief Return the product of this transform and the other */
+ /**@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()
+ /**@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 serialize(struct b3TransformData & dataOut) const;
- void deSerialize(const struct b3TransformData& dataIn);
+ void serializeFloat(struct b3TransformFloatData & dataOut) const;
- void deSerializeDouble(const struct b3TransformDoubleData& dataIn);
+ void deSerialize(const struct b3TransformData& dataIn);
- void deSerializeFloat(const struct b3TransformFloatData& dataIn);
+ void deSerializeDouble(const struct b3TransformDoubleData& dataIn);
+ void deSerializeFloat(const struct b3TransformFloatData& dataIn);
};
-
B3_FORCE_INLINE b3Vector3
b3Transform::invXform(const b3Vector3& inVec) const
{
@@ -225,80 +218,69 @@ b3Transform::invXform(const b3Vector3& inVec) const
return (m_basis.transpose() * v);
}
-B3_FORCE_INLINE b3Transform
-b3Transform::inverseTimes(const b3Transform& t) const
+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);
+ return b3Transform(m_basis.transposeTimes(t.m_basis),
+ v * m_basis);
}
-B3_FORCE_INLINE b3Transform
-b3Transform::operator*(const b3Transform& t) const
+B3_FORCE_INLINE b3Transform
+ b3Transform::operator*(const b3Transform& t) const
{
- return b3Transform(m_basis * t.m_basis,
- (*this)(t.m_origin));
+ 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() );
+ return (t1.getBasis() == t2.getBasis() &&
+ t1.getOrigin() == t2.getOrigin());
}
-
///for serialization
-struct b3TransformFloatData
+struct b3TransformFloatData
{
- b3Matrix3x3FloatData m_basis;
- b3Vector3FloatData m_origin;
+ b3Matrix3x3FloatData m_basis;
+ b3Vector3FloatData m_origin;
};
-struct b3TransformDoubleData
+struct b3TransformDoubleData
{
- b3Matrix3x3DoubleData m_basis;
- b3Vector3DoubleData m_origin;
+ b3Matrix3x3DoubleData m_basis;
+ b3Vector3DoubleData m_origin;
};
-
-
-B3_FORCE_INLINE void b3Transform::serialize(b3TransformData& dataOut) const
+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
+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)
+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)
+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)
+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
-
-
-
-
-
-
+#endif //B3_TRANSFORM_H
diff --git a/thirdparty/bullet/Bullet3Common/b3TransformUtil.h b/thirdparty/bullet/Bullet3Common/b3TransformUtil.h
index 6ce580c132..1850a9be5f 100644
--- a/thirdparty/bullet/Bullet3Common/b3TransformUtil.h
+++ b/thirdparty/bullet/Bullet3Common/b3TransformUtil.h
@@ -12,204 +12,189 @@ subject to the following restrictions:
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
-
-
-
+#define B3_ANGULAR_MOTION_THRESHOLD b3Scalar(0.5) * B3_HALF_PI
-B3_FORCE_INLINE b3Vector3 b3AabbSupport(const b3Vector3& halfExtents,const b3Vector3& supportDir)
+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());
+ 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)
+ 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
+ // #define QUATERNION_DERIVATIVE
+#ifdef QUATERNION_DERIVATIVE
b3Quaternion predictedOrn = curTrans.getRotation();
predictedOrn += (angvel * predictedOrn) * (timeStep * b3Scalar(0.5));
predictedOrn.normalize();
- #else
+#else
//Exponential map
//google for "Practical Parameterization of Rotations Using the Exponential Map", F. Sebastian Grassia
b3Vector3 axis;
- b3Scalar fAngle = angvel.length();
+ b3Scalar fAngle = angvel.length();
//limit the angular motion
- if (fAngle*timeStep > B3_ANGULAR_MOTION_THRESHOLD)
+ if (fAngle * timeStep > B3_ANGULAR_MOTION_THRESHOLD)
{
fAngle = B3_ANGULAR_MOTION_THRESHOLD / timeStep;
}
- if ( fAngle < b3Scalar(0.001) )
+ 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 );
+ 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 );
+ axis = angvel * (b3Sin(b3Scalar(0.5) * fAngle * timeStep) / fAngle);
}
- b3Quaternion dorn (axis.getX(),axis.getY(),axis.getZ(),b3Cos( fAngle*timeStep*b3Scalar(0.5) ));
+ 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
+#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)
+ 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;
+ b3Scalar angle;
if (orn0 != orn1)
{
- calculateDiffAxisAngleQuaternion(orn0,orn1,axis,angle);
+ calculateDiffAxisAngleQuaternion(orn0, orn1, axis, angle);
angVel = axis * angle / timeStep;
- } else
+ }
+ else
{
- angVel.setValue(0,0,0);
+ angVel.setValue(0, 0, 0);
}
}
- static void calculateDiffAxisAngleQuaternion(const b3Quaternion& orn0,const b3Quaternion& orn1a,b3Vector3& axis,b3Scalar& angle)
+ 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 = 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.));
+ 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)
+ 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);
+ b3Scalar angle;
+ calculateDiffAxisAngle(transform0, transform1, axis, angle);
angVel = axis * angle / timeStep;
}
- static void calculateDiffAxisAngle(const b3Transform& transform0,const b3Transform& transform1,b3Vector3& axis,b3Scalar& angle)
+ 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
+ ///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 = 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.));
+ 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
+///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
+class b3ConvexSeparatingDistanceUtil
{
- b3Quaternion m_ornA;
- b3Quaternion m_ornB;
- b3Vector3 m_posA;
- b3Vector3 m_posB;
-
- b3Vector3 m_separatingNormal;
+ b3Quaternion m_ornA;
+ b3Quaternion m_ornB;
+ b3Vector3 m_posA;
+ b3Vector3 m_posB;
- b3Scalar m_boundingRadiusA;
- b3Scalar m_boundingRadiusB;
- b3Scalar m_separatingDistance;
+ b3Vector3 m_separatingNormal;
-public:
+ b3Scalar m_boundingRadiusA;
+ b3Scalar m_boundingRadiusB;
+ b3Scalar m_separatingDistance;
- b3ConvexSeparatingDistanceUtil(b3Scalar boundingRadiusA,b3Scalar boundingRadiusB)
- :m_boundingRadiusA(boundingRadiusA),
- m_boundingRadiusB(boundingRadiusB),
- m_separatingDistance(0.f)
+public:
+ b3ConvexSeparatingDistanceUtil(b3Scalar boundingRadiusA, b3Scalar boundingRadiusB)
+ : m_boundingRadiusA(boundingRadiusA),
+ m_boundingRadiusB(boundingRadiusB),
+ m_separatingDistance(0.f)
{
}
- b3Scalar getConservativeSeparatingDistance()
+ b3Scalar getConservativeSeparatingDistance()
{
return m_separatingDistance;
}
- void updateSeparatingDistance(const b3Transform& transA,const b3Transform& transB)
+ 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)
+ 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);
+ 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);
+ b3Vector3 relLinVel = (linVelB - linVelA);
b3Scalar relLinVelocLength = relLinVel.dot(m_separatingNormal);
- if (relLinVelocLength<0.f)
+ if (relLinVelocLength < 0.f)
{
relLinVelocLength = 0.f;
}
-
- b3Scalar projectedMotion = maxAngularProjectedVelocity +relLinVelocLength;
+
+ 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)
+ void initSeparatingDistance(const b3Vector3& separatingVector, b3Scalar separatingDistance, const b3Transform& transA, const b3Transform& transB)
{
m_separatingDistance = separatingDistance;
- if (m_separatingDistance>0.f)
+ if (m_separatingDistance > 0.f)
{
m_separatingNormal = separatingVector;
-
+
const b3Vector3& toPosA = transA.getOrigin();
const b3Vector3& toPosB = transB.getOrigin();
b3Quaternion toOrnA = transA.getRotation();
@@ -220,9 +205,6 @@ public:
m_ornB = toOrnB;
}
}
-
};
-
-#endif //B3_TRANSFORM_UTIL_H
-
+#endif //B3_TRANSFORM_UTIL_H
diff --git a/thirdparty/bullet/Bullet3Common/b3Vector3.cpp b/thirdparty/bullet/Bullet3Common/b3Vector3.cpp
index 5f5ac4ac04..100fb774c1 100644
--- a/thirdparty/bullet/Bullet3Common/b3Vector3.cpp
+++ b/thirdparty/bullet/Bullet3Common/b3Vector3.cpp
@@ -14,274 +14,281 @@
This source version has been altered.
*/
-#if defined (_WIN32) || defined (__i386__)
+#if defined(_WIN32) || defined(__i386__)
#define B3_USE_SSE_IN_API
#endif
#include "b3Vector3.h"
-#if defined (B3_USE_SSE) || defined (B3_USE_NEON)
+#if defined(B3_USE_SSE) || defined(B3_USE_NEON)
#ifdef __APPLE__
#include <stdint.h>
-typedef float float4 __attribute__ ((vector_size(16)));
+typedef float float4 __attribute__((vector_size(16)));
#else
#define float4 __m128
#endif
//typedef uint32_t uint4 __attribute__ ((vector_size(16)));
-
#if defined B3_USE_SSE || defined _WIN32
-#define LOG2_ARRAY_SIZE 6
-#define STACK_ARRAY_COUNT (1UL << LOG2_ARRAY_SIZE)
+#define LOG2_ARRAY_SIZE 6
+#define STACK_ARRAY_COUNT (1UL << LOG2_ARRAY_SIZE)
#include <emmintrin.h>
-long b3_maxdot_large( const float *vv, const float *vec, unsigned long count, float *dotResult );
-long b3_maxdot_large( const float *vv, const float *vec, unsigned long count, float *dotResult )
+long b3_maxdot_large(const float *vv, const float *vec, unsigned long count, float *dotResult);
+long b3_maxdot_large(const float *vv, const float *vec, unsigned long count, float *dotResult)
{
- const float4 *vertices = (const float4*) vv;
- static const unsigned char indexTable[16] = {(unsigned char)-1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 };
- float4 dotMax = b3Assign128( -B3_INFINITY, -B3_INFINITY, -B3_INFINITY, -B3_INFINITY );
- float4 vvec = _mm_loadu_ps( vec );
- float4 vHi = b3CastiTo128f(_mm_shuffle_epi32( b3CastfTo128i( vvec), 0xaa )); /// zzzz
- float4 vLo = _mm_movelh_ps( vvec, vvec ); /// xyxy
+ const float4 *vertices = (const float4 *)vv;
+ static const unsigned char indexTable[16] = {(unsigned char)-1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0};
+ float4 dotMax = b3Assign128(-B3_INFINITY, -B3_INFINITY, -B3_INFINITY, -B3_INFINITY);
+ float4 vvec = _mm_loadu_ps(vec);
+ float4 vHi = b3CastiTo128f(_mm_shuffle_epi32(b3CastfTo128i(vvec), 0xaa)); /// zzzz
+ float4 vLo = _mm_movelh_ps(vvec, vvec); /// xyxy
- long maxIndex = -1L;
+ long maxIndex = -1L;
- size_t segment = 0;
- float4 stack_array[ STACK_ARRAY_COUNT ];
+ size_t segment = 0;
+ float4 stack_array[STACK_ARRAY_COUNT];
#if DEBUG
- // memset( stack_array, -1, STACK_ARRAY_COUNT * sizeof(stack_array[0]) );
+ // memset( stack_array, -1, STACK_ARRAY_COUNT * sizeof(stack_array[0]) );
#endif
- size_t index;
- float4 max;
- // Faster loop without cleanup code for full tiles
- for ( segment = 0; segment + STACK_ARRAY_COUNT*4 <= count; segment += STACK_ARRAY_COUNT*4 )
- {
- max = dotMax;
-
- for( index = 0; index < STACK_ARRAY_COUNT; index+= 4 )
- { // do four dot products at a time. Carefully avoid touching the w element.
- float4 v0 = vertices[0];
- float4 v1 = vertices[1];
- float4 v2 = vertices[2];
- float4 v3 = vertices[3]; vertices += 4;
-
- float4 lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- float4 hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- float4 lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- float4 hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- float4 z = _mm_shuffle_ps(hi0, hi1, 0x88);
- float4 x = _mm_shuffle_ps(lo0, lo1, 0x88);
- float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index] = x;
- max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan
-
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
- v3 = vertices[3]; vertices += 4;
-
- lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- z = _mm_shuffle_ps(hi0, hi1, 0x88);
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index+1] = x;
- max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan
-
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
- v3 = vertices[3]; vertices += 4;
-
- lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- z = _mm_shuffle_ps(hi0, hi1, 0x88);
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index+2] = x;
- max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan
-
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
- v3 = vertices[3]; vertices += 4;
-
- lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- z = _mm_shuffle_ps(hi0, hi1, 0x88);
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index+3] = x;
- max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan
-
- // It is too costly to keep the index of the max here. We will look for it again later. We save a lot of work this way.
- }
-
- // If we found a new max
- if( 0xf != _mm_movemask_ps( (float4) _mm_cmpeq_ps(max, dotMax)))
- {
- // copy the new max across all lanes of our max accumulator
- max = _mm_max_ps(max, (float4) _mm_shuffle_ps( max, max, 0x4e));
- max = _mm_max_ps(max, (float4) _mm_shuffle_ps( max, max, 0xb1));
-
- dotMax = max;
-
- // find first occurrence of that max
- size_t test;
- for( index = 0; 0 == (test=_mm_movemask_ps( _mm_cmpeq_ps( stack_array[index], max))); index++ ) // local_count must be a multiple of 4
- {}
- // record where it is.
- maxIndex = 4*index + segment + indexTable[test];
- }
- }
-
- // account for work we've already done
- count -= segment;
-
- // Deal with the last < STACK_ARRAY_COUNT vectors
- max = dotMax;
- index = 0;
-
-
- if( b3Unlikely( count > 16) )
- {
- for( ; index + 4 <= count / 4; index+=4 )
- { // do four dot products at a time. Carefully avoid touching the w element.
- float4 v0 = vertices[0];
- float4 v1 = vertices[1];
- float4 v2 = vertices[2];
- float4 v3 = vertices[3]; vertices += 4;
-
- float4 lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- float4 hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- float4 lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- float4 hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- float4 z = _mm_shuffle_ps(hi0, hi1, 0x88);
- float4 x = _mm_shuffle_ps(lo0, lo1, 0x88);
- float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index] = x;
- max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan
-
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
- v3 = vertices[3]; vertices += 4;
-
- lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- z = _mm_shuffle_ps(hi0, hi1, 0x88);
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index+1] = x;
- max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan
-
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
- v3 = vertices[3]; vertices += 4;
-
- lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- z = _mm_shuffle_ps(hi0, hi1, 0x88);
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index+2] = x;
- max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan
-
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
- v3 = vertices[3]; vertices += 4;
-
- lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- z = _mm_shuffle_ps(hi0, hi1, 0x88);
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index+3] = x;
- max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan
-
- // It is too costly to keep the index of the max here. We will look for it again later. We save a lot of work this way.
- }
- }
-
- size_t localCount = (count & -4L) - 4*index;
- if( localCount )
- {
+ size_t index;
+ float4 max;
+ // Faster loop without cleanup code for full tiles
+ for (segment = 0; segment + STACK_ARRAY_COUNT * 4 <= count; segment += STACK_ARRAY_COUNT * 4)
+ {
+ max = dotMax;
+
+ for (index = 0; index < STACK_ARRAY_COUNT; index += 4)
+ { // do four dot products at a time. Carefully avoid touching the w element.
+ float4 v0 = vertices[0];
+ float4 v1 = vertices[1];
+ float4 v2 = vertices[2];
+ float4 v3 = vertices[3];
+ vertices += 4;
+
+ float4 lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ float4 hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ float4 lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ float4 hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ float4 z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ float4 x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index] = x;
+ max = _mm_max_ps(x, max); // control the order here so that max is never NaN even if x is nan
+
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+ v3 = vertices[3];
+ vertices += 4;
+
+ lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index + 1] = x;
+ max = _mm_max_ps(x, max); // control the order here so that max is never NaN even if x is nan
+
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+ v3 = vertices[3];
+ vertices += 4;
+
+ lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index + 2] = x;
+ max = _mm_max_ps(x, max); // control the order here so that max is never NaN even if x is nan
+
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+ v3 = vertices[3];
+ vertices += 4;
+
+ lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index + 3] = x;
+ max = _mm_max_ps(x, max); // control the order here so that max is never NaN even if x is nan
+
+ // It is too costly to keep the index of the max here. We will look for it again later. We save a lot of work this way.
+ }
+
+ // If we found a new max
+ if (0xf != _mm_movemask_ps((float4)_mm_cmpeq_ps(max, dotMax)))
+ {
+ // copy the new max across all lanes of our max accumulator
+ max = _mm_max_ps(max, (float4)_mm_shuffle_ps(max, max, 0x4e));
+ max = _mm_max_ps(max, (float4)_mm_shuffle_ps(max, max, 0xb1));
+
+ dotMax = max;
+
+ // find first occurrence of that max
+ size_t test;
+ for (index = 0; 0 == (test = _mm_movemask_ps(_mm_cmpeq_ps(stack_array[index], max))); index++) // local_count must be a multiple of 4
+ {
+ }
+ // record where it is.
+ maxIndex = 4 * index + segment + indexTable[test];
+ }
+ }
+
+ // account for work we've already done
+ count -= segment;
+
+ // Deal with the last < STACK_ARRAY_COUNT vectors
+ max = dotMax;
+ index = 0;
+
+ if (b3Unlikely(count > 16))
+ {
+ for (; index + 4 <= count / 4; index += 4)
+ { // do four dot products at a time. Carefully avoid touching the w element.
+ float4 v0 = vertices[0];
+ float4 v1 = vertices[1];
+ float4 v2 = vertices[2];
+ float4 v3 = vertices[3];
+ vertices += 4;
+
+ float4 lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ float4 hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ float4 lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ float4 hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ float4 z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ float4 x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index] = x;
+ max = _mm_max_ps(x, max); // control the order here so that max is never NaN even if x is nan
+
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+ v3 = vertices[3];
+ vertices += 4;
+
+ lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index + 1] = x;
+ max = _mm_max_ps(x, max); // control the order here so that max is never NaN even if x is nan
+
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+ v3 = vertices[3];
+ vertices += 4;
+
+ lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index + 2] = x;
+ max = _mm_max_ps(x, max); // control the order here so that max is never NaN even if x is nan
+
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+ v3 = vertices[3];
+ vertices += 4;
+
+ lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index + 3] = x;
+ max = _mm_max_ps(x, max); // control the order here so that max is never NaN even if x is nan
+
+ // It is too costly to keep the index of the max here. We will look for it again later. We save a lot of work this way.
+ }
+ }
+
+ size_t localCount = (count & -4L) - 4 * index;
+ if (localCount)
+ {
#ifdef __APPLE__
- float4 t0, t1, t2, t3, t4;
- float4 * sap = &stack_array[index + localCount / 4];
- vertices += localCount; // counter the offset
- size_t byteIndex = -(localCount) * sizeof(float);
- //AT&T Code style assembly
- asm volatile
- ( ".align 4 \n\
+ float4 t0, t1, t2, t3, t4;
+ float4 *sap = &stack_array[index + localCount / 4];
+ vertices += localCount; // counter the offset
+ size_t byteIndex = -(localCount) * sizeof(float);
+ //AT&T Code style assembly
+ asm volatile(
+ ".align 4 \n\
0: movaps %[max], %[t2] // move max out of the way to avoid propagating NaNs in max \n\
movaps (%[vertices], %[byteIndex], 4), %[t0] // vertices[0] \n\
movaps 16(%[vertices], %[byteIndex], 4), %[t1] // vertices[1] \n\
@@ -307,369 +314,375 @@ long b3_maxdot_large( const float *vv, const float *vec, unsigned long count, fl
add $16, %[byteIndex] // advance loop counter\n\
jnz 0b \n\
"
- : [max] "+x" (max), [t0] "=&x" (t0), [t1] "=&x" (t1), [t2] "=&x" (t2), [t3] "=&x" (t3), [t4] "=&x" (t4), [byteIndex] "+r" (byteIndex)
- : [vLo] "x" (vLo), [vHi] "x" (vHi), [vertices] "r" (vertices), [sap] "r" (sap)
- : "memory", "cc"
- );
- index += localCount/4;
+ : [max] "+x"(max), [t0] "=&x"(t0), [t1] "=&x"(t1), [t2] "=&x"(t2), [t3] "=&x"(t3), [t4] "=&x"(t4), [byteIndex] "+r"(byteIndex)
+ : [vLo] "x"(vLo), [vHi] "x"(vHi), [vertices] "r"(vertices), [sap] "r"(sap)
+ : "memory", "cc");
+ index += localCount / 4;
#else
- {
- for( unsigned int i=0; i<localCount/4; i++,index++)
- { // do four dot products at a time. Carefully avoid touching the w element.
- float4 v0 = vertices[0];
- float4 v1 = vertices[1];
- float4 v2 = vertices[2];
- float4 v3 = vertices[3];
- vertices += 4;
-
- float4 lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- float4 hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- float4 lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- float4 hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- float4 z = _mm_shuffle_ps(hi0, hi1, 0x88);
- float4 x = _mm_shuffle_ps(lo0, lo1, 0x88);
- float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index] = x;
- max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan
- }
- }
-#endif //__APPLE__
- }
-
- // process the last few points
- if( count & 3 )
- {
- float4 v0, v1, v2, x, y, z;
- switch( count & 3 )
- {
- case 3:
- {
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
-
- // Calculate 3 dot products, transpose, duplicate v2
- float4 lo0 = _mm_movelh_ps( v0, v1); // xyxy.lo
- float4 hi0 = _mm_movehl_ps( v1, v0); // z?z?.lo
- lo0 = lo0*vLo;
- z = _mm_shuffle_ps(hi0, v2, 0xa8 ); // z0z1z2z2
- z = z*vHi;
- float4 lo1 = _mm_movelh_ps(v2, v2); // xyxy
- lo1 = lo1*vLo;
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- }
- break;
- case 2:
- {
- v0 = vertices[0];
- v1 = vertices[1];
- float4 xy = _mm_movelh_ps(v0, v1);
- z = _mm_movehl_ps(v1, v0);
- xy = xy*vLo;
- z = _mm_shuffle_ps( z, z, 0xa8);
- x = _mm_shuffle_ps( xy, xy, 0xa8);
- y = _mm_shuffle_ps( xy, xy, 0xfd);
- z = z*vHi;
- }
- break;
- case 1:
- {
- float4 xy = vertices[0];
- z = _mm_shuffle_ps( xy, xy, 0xaa);
- xy = xy*vLo;
- z = z*vHi;
- x = _mm_shuffle_ps(xy, xy, 0);
- y = _mm_shuffle_ps(xy, xy, 0x55);
- }
- break;
- }
- x = x+y;
- x = x+z;
- stack_array[index] = x;
- max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan
- index++;
- }
-
- // if we found a new max.
- if( 0 == segment || 0xf != _mm_movemask_ps( (float4) _mm_cmpeq_ps(max, dotMax)))
- { // we found a new max. Search for it
- // find max across the max vector, place in all elements of max -- big latency hit here
- max = _mm_max_ps(max, (float4) _mm_shuffle_ps( max, max, 0x4e));
- max = _mm_max_ps(max, (float4) _mm_shuffle_ps( max, max, 0xb1));
-
- // It is slightly faster to do this part in scalar code when count < 8. However, the common case for
- // this where it actually makes a difference is handled in the early out at the top of the function,
- // so it is less than a 1% difference here. I opted for improved code size, fewer branches and reduced
- // complexity, and removed it.
-
- dotMax = max;
-
- // scan for the first occurence of max in the array
- size_t test;
- for( index = 0; 0 == (test=_mm_movemask_ps( _mm_cmpeq_ps( stack_array[index], max))); index++ ) // local_count must be a multiple of 4
- {}
- maxIndex = 4*index + segment + indexTable[test];
- }
-
- _mm_store_ss( dotResult, dotMax);
- return maxIndex;
+ {
+ for (unsigned int i = 0; i < localCount / 4; i++, index++)
+ { // do four dot products at a time. Carefully avoid touching the w element.
+ float4 v0 = vertices[0];
+ float4 v1 = vertices[1];
+ float4 v2 = vertices[2];
+ float4 v3 = vertices[3];
+ vertices += 4;
+
+ float4 lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ float4 hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ float4 lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ float4 hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ float4 z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ float4 x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index] = x;
+ max = _mm_max_ps(x, max); // control the order here so that max is never NaN even if x is nan
+ }
+ }
+#endif //__APPLE__
+ }
+
+ // process the last few points
+ if (count & 3)
+ {
+ float4 v0, v1, v2, x, y, z;
+ switch (count & 3)
+ {
+ case 3:
+ {
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+
+ // Calculate 3 dot products, transpose, duplicate v2
+ float4 lo0 = _mm_movelh_ps(v0, v1); // xyxy.lo
+ float4 hi0 = _mm_movehl_ps(v1, v0); // z?z?.lo
+ lo0 = lo0 * vLo;
+ z = _mm_shuffle_ps(hi0, v2, 0xa8); // z0z1z2z2
+ z = z * vHi;
+ float4 lo1 = _mm_movelh_ps(v2, v2); // xyxy
+ lo1 = lo1 * vLo;
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ }
+ break;
+ case 2:
+ {
+ v0 = vertices[0];
+ v1 = vertices[1];
+ float4 xy = _mm_movelh_ps(v0, v1);
+ z = _mm_movehl_ps(v1, v0);
+ xy = xy * vLo;
+ z = _mm_shuffle_ps(z, z, 0xa8);
+ x = _mm_shuffle_ps(xy, xy, 0xa8);
+ y = _mm_shuffle_ps(xy, xy, 0xfd);
+ z = z * vHi;
+ }
+ break;
+ case 1:
+ {
+ float4 xy = vertices[0];
+ z = _mm_shuffle_ps(xy, xy, 0xaa);
+ xy = xy * vLo;
+ z = z * vHi;
+ x = _mm_shuffle_ps(xy, xy, 0);
+ y = _mm_shuffle_ps(xy, xy, 0x55);
+ }
+ break;
+ }
+ x = x + y;
+ x = x + z;
+ stack_array[index] = x;
+ max = _mm_max_ps(x, max); // control the order here so that max is never NaN even if x is nan
+ index++;
+ }
+
+ // if we found a new max.
+ if (0 == segment || 0xf != _mm_movemask_ps((float4)_mm_cmpeq_ps(max, dotMax)))
+ { // we found a new max. Search for it
+ // find max across the max vector, place in all elements of max -- big latency hit here
+ max = _mm_max_ps(max, (float4)_mm_shuffle_ps(max, max, 0x4e));
+ max = _mm_max_ps(max, (float4)_mm_shuffle_ps(max, max, 0xb1));
+
+ // It is slightly faster to do this part in scalar code when count < 8. However, the common case for
+ // this where it actually makes a difference is handled in the early out at the top of the function,
+ // so it is less than a 1% difference here. I opted for improved code size, fewer branches and reduced
+ // complexity, and removed it.
+
+ dotMax = max;
+
+ // scan for the first occurence of max in the array
+ size_t test;
+ for (index = 0; 0 == (test = _mm_movemask_ps(_mm_cmpeq_ps(stack_array[index], max))); index++) // local_count must be a multiple of 4
+ {
+ }
+ maxIndex = 4 * index + segment + indexTable[test];
+ }
+
+ _mm_store_ss(dotResult, dotMax);
+ return maxIndex;
}
-long b3_mindot_large( const float *vv, const float *vec, unsigned long count, float *dotResult );
+long b3_mindot_large(const float *vv, const float *vec, unsigned long count, float *dotResult);
-long b3_mindot_large( const float *vv, const float *vec, unsigned long count, float *dotResult )
+long b3_mindot_large(const float *vv, const float *vec, unsigned long count, float *dotResult)
{
- const float4 *vertices = (const float4*) vv;
- static const unsigned char indexTable[16] = {(unsigned char)-1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 };
+ const float4 *vertices = (const float4 *)vv;
+ static const unsigned char indexTable[16] = {(unsigned char)-1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0};
- float4 dotmin = b3Assign128( B3_INFINITY, B3_INFINITY, B3_INFINITY, B3_INFINITY );
- float4 vvec = _mm_loadu_ps( vec );
- float4 vHi = b3CastiTo128f(_mm_shuffle_epi32( b3CastfTo128i( vvec), 0xaa )); /// zzzz
- float4 vLo = _mm_movelh_ps( vvec, vvec ); /// xyxy
+ float4 dotmin = b3Assign128(B3_INFINITY, B3_INFINITY, B3_INFINITY, B3_INFINITY);
+ float4 vvec = _mm_loadu_ps(vec);
+ float4 vHi = b3CastiTo128f(_mm_shuffle_epi32(b3CastfTo128i(vvec), 0xaa)); /// zzzz
+ float4 vLo = _mm_movelh_ps(vvec, vvec); /// xyxy
- long minIndex = -1L;
+ long minIndex = -1L;
- size_t segment = 0;
- float4 stack_array[ STACK_ARRAY_COUNT ];
+ size_t segment = 0;
+ float4 stack_array[STACK_ARRAY_COUNT];
#if DEBUG
- // memset( stack_array, -1, STACK_ARRAY_COUNT * sizeof(stack_array[0]) );
+ // memset( stack_array, -1, STACK_ARRAY_COUNT * sizeof(stack_array[0]) );
#endif
- size_t index;
- float4 min;
- // Faster loop without cleanup code for full tiles
- for ( segment = 0; segment + STACK_ARRAY_COUNT*4 <= count; segment += STACK_ARRAY_COUNT*4 )
- {
- min = dotmin;
-
- for( index = 0; index < STACK_ARRAY_COUNT; index+= 4 )
- { // do four dot products at a time. Carefully avoid touching the w element.
- float4 v0 = vertices[0];
- float4 v1 = vertices[1];
- float4 v2 = vertices[2];
- float4 v3 = vertices[3]; vertices += 4;
-
- float4 lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- float4 hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- float4 lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- float4 hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- float4 z = _mm_shuffle_ps(hi0, hi1, 0x88);
- float4 x = _mm_shuffle_ps(lo0, lo1, 0x88);
- float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index] = x;
- min = _mm_min_ps( x, min ); // control the order here so that min is never NaN even if x is nan
-
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
- v3 = vertices[3]; vertices += 4;
-
- lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- z = _mm_shuffle_ps(hi0, hi1, 0x88);
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index+1] = x;
- min = _mm_min_ps( x, min ); // control the order here so that min is never NaN even if x is nan
-
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
- v3 = vertices[3]; vertices += 4;
-
- lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- z = _mm_shuffle_ps(hi0, hi1, 0x88);
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index+2] = x;
- min = _mm_min_ps( x, min ); // control the order here so that min is never NaN even if x is nan
-
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
- v3 = vertices[3]; vertices += 4;
-
- lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- z = _mm_shuffle_ps(hi0, hi1, 0x88);
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index+3] = x;
- min = _mm_min_ps( x, min ); // control the order here so that min is never NaN even if x is nan
-
- // It is too costly to keep the index of the min here. We will look for it again later. We save a lot of work this way.
- }
-
- // If we found a new min
- if( 0xf != _mm_movemask_ps( (float4) _mm_cmpeq_ps(min, dotmin)))
- {
- // copy the new min across all lanes of our min accumulator
- min = _mm_min_ps(min, (float4) _mm_shuffle_ps( min, min, 0x4e));
- min = _mm_min_ps(min, (float4) _mm_shuffle_ps( min, min, 0xb1));
-
- dotmin = min;
-
- // find first occurrence of that min
- size_t test;
- for( index = 0; 0 == (test=_mm_movemask_ps( _mm_cmpeq_ps( stack_array[index], min))); index++ ) // local_count must be a multiple of 4
- {}
- // record where it is.
- minIndex = 4*index + segment + indexTable[test];
- }
- }
-
- // account for work we've already done
- count -= segment;
-
- // Deal with the last < STACK_ARRAY_COUNT vectors
- min = dotmin;
- index = 0;
-
-
- if(b3Unlikely( count > 16) )
- {
- for( ; index + 4 <= count / 4; index+=4 )
- { // do four dot products at a time. Carefully avoid touching the w element.
- float4 v0 = vertices[0];
- float4 v1 = vertices[1];
- float4 v2 = vertices[2];
- float4 v3 = vertices[3]; vertices += 4;
-
- float4 lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- float4 hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- float4 lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- float4 hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- float4 z = _mm_shuffle_ps(hi0, hi1, 0x88);
- float4 x = _mm_shuffle_ps(lo0, lo1, 0x88);
- float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index] = x;
- min = _mm_min_ps( x, min ); // control the order here so that min is never NaN even if x is nan
-
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
- v3 = vertices[3]; vertices += 4;
-
- lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- z = _mm_shuffle_ps(hi0, hi1, 0x88);
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index+1] = x;
- min = _mm_min_ps( x, min ); // control the order here so that min is never NaN even if x is nan
-
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
- v3 = vertices[3]; vertices += 4;
-
- lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- z = _mm_shuffle_ps(hi0, hi1, 0x88);
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index+2] = x;
- min = _mm_min_ps( x, min ); // control the order here so that min is never NaN even if x is nan
-
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
- v3 = vertices[3]; vertices += 4;
-
- lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- z = _mm_shuffle_ps(hi0, hi1, 0x88);
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index+3] = x;
- min = _mm_min_ps( x, min ); // control the order here so that min is never NaN even if x is nan
-
- // It is too costly to keep the index of the min here. We will look for it again later. We save a lot of work this way.
- }
- }
-
- size_t localCount = (count & -4L) - 4*index;
- if( localCount )
- {
-
-
+ size_t index;
+ float4 min;
+ // Faster loop without cleanup code for full tiles
+ for (segment = 0; segment + STACK_ARRAY_COUNT * 4 <= count; segment += STACK_ARRAY_COUNT * 4)
+ {
+ min = dotmin;
+
+ for (index = 0; index < STACK_ARRAY_COUNT; index += 4)
+ { // do four dot products at a time. Carefully avoid touching the w element.
+ float4 v0 = vertices[0];
+ float4 v1 = vertices[1];
+ float4 v2 = vertices[2];
+ float4 v3 = vertices[3];
+ vertices += 4;
+
+ float4 lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ float4 hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ float4 lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ float4 hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ float4 z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ float4 x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index] = x;
+ min = _mm_min_ps(x, min); // control the order here so that min is never NaN even if x is nan
+
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+ v3 = vertices[3];
+ vertices += 4;
+
+ lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index + 1] = x;
+ min = _mm_min_ps(x, min); // control the order here so that min is never NaN even if x is nan
+
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+ v3 = vertices[3];
+ vertices += 4;
+
+ lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index + 2] = x;
+ min = _mm_min_ps(x, min); // control the order here so that min is never NaN even if x is nan
+
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+ v3 = vertices[3];
+ vertices += 4;
+
+ lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index + 3] = x;
+ min = _mm_min_ps(x, min); // control the order here so that min is never NaN even if x is nan
+
+ // It is too costly to keep the index of the min here. We will look for it again later. We save a lot of work this way.
+ }
+
+ // If we found a new min
+ if (0xf != _mm_movemask_ps((float4)_mm_cmpeq_ps(min, dotmin)))
+ {
+ // copy the new min across all lanes of our min accumulator
+ min = _mm_min_ps(min, (float4)_mm_shuffle_ps(min, min, 0x4e));
+ min = _mm_min_ps(min, (float4)_mm_shuffle_ps(min, min, 0xb1));
+
+ dotmin = min;
+
+ // find first occurrence of that min
+ size_t test;
+ for (index = 0; 0 == (test = _mm_movemask_ps(_mm_cmpeq_ps(stack_array[index], min))); index++) // local_count must be a multiple of 4
+ {
+ }
+ // record where it is.
+ minIndex = 4 * index + segment + indexTable[test];
+ }
+ }
+
+ // account for work we've already done
+ count -= segment;
+
+ // Deal with the last < STACK_ARRAY_COUNT vectors
+ min = dotmin;
+ index = 0;
+
+ if (b3Unlikely(count > 16))
+ {
+ for (; index + 4 <= count / 4; index += 4)
+ { // do four dot products at a time. Carefully avoid touching the w element.
+ float4 v0 = vertices[0];
+ float4 v1 = vertices[1];
+ float4 v2 = vertices[2];
+ float4 v3 = vertices[3];
+ vertices += 4;
+
+ float4 lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ float4 hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ float4 lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ float4 hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ float4 z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ float4 x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index] = x;
+ min = _mm_min_ps(x, min); // control the order here so that min is never NaN even if x is nan
+
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+ v3 = vertices[3];
+ vertices += 4;
+
+ lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index + 1] = x;
+ min = _mm_min_ps(x, min); // control the order here so that min is never NaN even if x is nan
+
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+ v3 = vertices[3];
+ vertices += 4;
+
+ lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index + 2] = x;
+ min = _mm_min_ps(x, min); // control the order here so that min is never NaN even if x is nan
+
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+ v3 = vertices[3];
+ vertices += 4;
+
+ lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index + 3] = x;
+ min = _mm_min_ps(x, min); // control the order here so that min is never NaN even if x is nan
+
+ // It is too costly to keep the index of the min here. We will look for it again later. We save a lot of work this way.
+ }
+ }
+
+ size_t localCount = (count & -4L) - 4 * index;
+ if (localCount)
+ {
#ifdef __APPLE__
- vertices += localCount; // counter the offset
- float4 t0, t1, t2, t3, t4;
- size_t byteIndex = -(localCount) * sizeof(float);
- float4 * sap = &stack_array[index + localCount / 4];
+ vertices += localCount; // counter the offset
+ float4 t0, t1, t2, t3, t4;
+ size_t byteIndex = -(localCount) * sizeof(float);
+ float4 *sap = &stack_array[index + localCount / 4];
- asm volatile
- ( ".align 4 \n\
+ asm volatile(
+ ".align 4 \n\
0: movaps %[min], %[t2] // move min out of the way to avoid propagating NaNs in min \n\
movaps (%[vertices], %[byteIndex], 4), %[t0] // vertices[0] \n\
movaps 16(%[vertices], %[byteIndex], 4), %[t1] // vertices[1] \n\
@@ -695,937 +708,930 @@ long b3_mindot_large( const float *vv, const float *vec, unsigned long count, fl
add $16, %[byteIndex] // advance loop counter\n\
jnz 0b \n\
"
- : [min] "+x" (min), [t0] "=&x" (t0), [t1] "=&x" (t1), [t2] "=&x" (t2), [t3] "=&x" (t3), [t4] "=&x" (t4), [byteIndex] "+r" (byteIndex)
- : [vLo] "x" (vLo), [vHi] "x" (vHi), [vertices] "r" (vertices), [sap] "r" (sap)
- : "memory", "cc"
- );
- index += localCount/4;
+ : [min] "+x"(min), [t0] "=&x"(t0), [t1] "=&x"(t1), [t2] "=&x"(t2), [t3] "=&x"(t3), [t4] "=&x"(t4), [byteIndex] "+r"(byteIndex)
+ : [vLo] "x"(vLo), [vHi] "x"(vHi), [vertices] "r"(vertices), [sap] "r"(sap)
+ : "memory", "cc");
+ index += localCount / 4;
#else
- {
- for( unsigned int i=0; i<localCount/4; i++,index++)
- { // do four dot products at a time. Carefully avoid touching the w element.
- float4 v0 = vertices[0];
- float4 v1 = vertices[1];
- float4 v2 = vertices[2];
- float4 v3 = vertices[3];
- vertices += 4;
-
- float4 lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- float4 hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- float4 lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- float4 hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- float4 z = _mm_shuffle_ps(hi0, hi1, 0x88);
- float4 x = _mm_shuffle_ps(lo0, lo1, 0x88);
- float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index] = x;
- min = _mm_min_ps( x, min ); // control the order here so that max is never NaN even if x is nan
- }
- }
+ {
+ for (unsigned int i = 0; i < localCount / 4; i++, index++)
+ { // do four dot products at a time. Carefully avoid touching the w element.
+ float4 v0 = vertices[0];
+ float4 v1 = vertices[1];
+ float4 v2 = vertices[2];
+ float4 v3 = vertices[3];
+ vertices += 4;
+
+ float4 lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ float4 hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ float4 lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ float4 hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ float4 z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ float4 x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index] = x;
+ min = _mm_min_ps(x, min); // control the order here so that max is never NaN even if x is nan
+ }
+ }
#endif
- }
-
- // process the last few points
- if( count & 3 )
- {
- float4 v0, v1, v2, x, y, z;
- switch( count & 3 )
- {
- case 3:
- {
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
-
- // Calculate 3 dot products, transpose, duplicate v2
- float4 lo0 = _mm_movelh_ps( v0, v1); // xyxy.lo
- float4 hi0 = _mm_movehl_ps( v1, v0); // z?z?.lo
- lo0 = lo0*vLo;
- z = _mm_shuffle_ps(hi0, v2, 0xa8 ); // z0z1z2z2
- z = z*vHi;
- float4 lo1 = _mm_movelh_ps(v2, v2); // xyxy
- lo1 = lo1*vLo;
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- }
- break;
- case 2:
- {
- v0 = vertices[0];
- v1 = vertices[1];
- float4 xy = _mm_movelh_ps(v0, v1);
- z = _mm_movehl_ps(v1, v0);
- xy = xy*vLo;
- z = _mm_shuffle_ps( z, z, 0xa8);
- x = _mm_shuffle_ps( xy, xy, 0xa8);
- y = _mm_shuffle_ps( xy, xy, 0xfd);
- z = z*vHi;
- }
- break;
- case 1:
- {
- float4 xy = vertices[0];
- z = _mm_shuffle_ps( xy, xy, 0xaa);
- xy = xy*vLo;
- z = z*vHi;
- x = _mm_shuffle_ps(xy, xy, 0);
- y = _mm_shuffle_ps(xy, xy, 0x55);
- }
- break;
- }
- x = x+y;
- x = x+z;
- stack_array[index] = x;
- min = _mm_min_ps( x, min ); // control the order here so that min is never NaN even if x is nan
- index++;
- }
-
- // if we found a new min.
- if( 0 == segment || 0xf != _mm_movemask_ps( (float4) _mm_cmpeq_ps(min, dotmin)))
- { // we found a new min. Search for it
- // find min across the min vector, place in all elements of min -- big latency hit here
- min = _mm_min_ps(min, (float4) _mm_shuffle_ps( min, min, 0x4e));
- min = _mm_min_ps(min, (float4) _mm_shuffle_ps( min, min, 0xb1));
-
- // It is slightly faster to do this part in scalar code when count < 8. However, the common case for
- // this where it actually makes a difference is handled in the early out at the top of the function,
- // so it is less than a 1% difference here. I opted for improved code size, fewer branches and reduced
- // complexity, and removed it.
-
- dotmin = min;
-
- // scan for the first occurence of min in the array
- size_t test;
- for( index = 0; 0 == (test=_mm_movemask_ps( _mm_cmpeq_ps( stack_array[index], min))); index++ ) // local_count must be a multiple of 4
- {}
- minIndex = 4*index + segment + indexTable[test];
- }
-
- _mm_store_ss( dotResult, dotmin);
- return minIndex;
+ }
+
+ // process the last few points
+ if (count & 3)
+ {
+ float4 v0, v1, v2, x, y, z;
+ switch (count & 3)
+ {
+ case 3:
+ {
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+
+ // Calculate 3 dot products, transpose, duplicate v2
+ float4 lo0 = _mm_movelh_ps(v0, v1); // xyxy.lo
+ float4 hi0 = _mm_movehl_ps(v1, v0); // z?z?.lo
+ lo0 = lo0 * vLo;
+ z = _mm_shuffle_ps(hi0, v2, 0xa8); // z0z1z2z2
+ z = z * vHi;
+ float4 lo1 = _mm_movelh_ps(v2, v2); // xyxy
+ lo1 = lo1 * vLo;
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ }
+ break;
+ case 2:
+ {
+ v0 = vertices[0];
+ v1 = vertices[1];
+ float4 xy = _mm_movelh_ps(v0, v1);
+ z = _mm_movehl_ps(v1, v0);
+ xy = xy * vLo;
+ z = _mm_shuffle_ps(z, z, 0xa8);
+ x = _mm_shuffle_ps(xy, xy, 0xa8);
+ y = _mm_shuffle_ps(xy, xy, 0xfd);
+ z = z * vHi;
+ }
+ break;
+ case 1:
+ {
+ float4 xy = vertices[0];
+ z = _mm_shuffle_ps(xy, xy, 0xaa);
+ xy = xy * vLo;
+ z = z * vHi;
+ x = _mm_shuffle_ps(xy, xy, 0);
+ y = _mm_shuffle_ps(xy, xy, 0x55);
+ }
+ break;
+ }
+ x = x + y;
+ x = x + z;
+ stack_array[index] = x;
+ min = _mm_min_ps(x, min); // control the order here so that min is never NaN even if x is nan
+ index++;
+ }
+
+ // if we found a new min.
+ if (0 == segment || 0xf != _mm_movemask_ps((float4)_mm_cmpeq_ps(min, dotmin)))
+ { // we found a new min. Search for it
+ // find min across the min vector, place in all elements of min -- big latency hit here
+ min = _mm_min_ps(min, (float4)_mm_shuffle_ps(min, min, 0x4e));
+ min = _mm_min_ps(min, (float4)_mm_shuffle_ps(min, min, 0xb1));
+
+ // It is slightly faster to do this part in scalar code when count < 8. However, the common case for
+ // this where it actually makes a difference is handled in the early out at the top of the function,
+ // so it is less than a 1% difference here. I opted for improved code size, fewer branches and reduced
+ // complexity, and removed it.
+
+ dotmin = min;
+
+ // scan for the first occurence of min in the array
+ size_t test;
+ for (index = 0; 0 == (test = _mm_movemask_ps(_mm_cmpeq_ps(stack_array[index], min))); index++) // local_count must be a multiple of 4
+ {
+ }
+ minIndex = 4 * index + segment + indexTable[test];
+ }
+
+ _mm_store_ss(dotResult, dotmin);
+ return minIndex;
}
-
#elif defined B3_USE_NEON
-#define ARM_NEON_GCC_COMPATIBILITY 1
+#define ARM_NEON_GCC_COMPATIBILITY 1
#include <arm_neon.h>
+static long b3_maxdot_large_v0(const float *vv, const float *vec, unsigned long count, float *dotResult);
+static long b3_maxdot_large_v1(const float *vv, const float *vec, unsigned long count, float *dotResult);
+static long b3_maxdot_large_sel(const float *vv, const float *vec, unsigned long count, float *dotResult);
+static long b3_mindot_large_v0(const float *vv, const float *vec, unsigned long count, float *dotResult);
+static long b3_mindot_large_v1(const float *vv, const float *vec, unsigned long count, float *dotResult);
+static long b3_mindot_large_sel(const float *vv, const float *vec, unsigned long count, float *dotResult);
-static long b3_maxdot_large_v0( const float *vv, const float *vec, unsigned long count, float *dotResult );
-static long b3_maxdot_large_v1( const float *vv, const float *vec, unsigned long count, float *dotResult );
-static long b3_maxdot_large_sel( const float *vv, const float *vec, unsigned long count, float *dotResult );
-static long b3_mindot_large_v0( const float *vv, const float *vec, unsigned long count, float *dotResult );
-static long b3_mindot_large_v1( const float *vv, const float *vec, unsigned long count, float *dotResult );
-static long b3_mindot_large_sel( const float *vv, const float *vec, unsigned long count, float *dotResult );
+long (*b3_maxdot_large)(const float *vv, const float *vec, unsigned long count, float *dotResult) = b3_maxdot_large_sel;
+long (*b3_mindot_large)(const float *vv, const float *vec, unsigned long count, float *dotResult) = b3_mindot_large_sel;
-long (*b3_maxdot_large)( const float *vv, const float *vec, unsigned long count, float *dotResult ) = b3_maxdot_large_sel;
-long (*b3_mindot_large)( const float *vv, const float *vec, unsigned long count, float *dotResult ) = b3_mindot_large_sel;
-
-extern "C" {int _get_cpu_capabilities( void );}
-
-static long b3_maxdot_large_sel( const float *vv, const float *vec, unsigned long count, float *dotResult )
+extern "C"
{
- if( _get_cpu_capabilities() & 0x2000 )
- b3_maxdot_large = _maxdot_large_v1;
- else
- b3_maxdot_large = _maxdot_large_v0;
-
- return b3_maxdot_large(vv, vec, count, dotResult);
+ int _get_cpu_capabilities(void);
}
-static long b3_mindot_large_sel( const float *vv, const float *vec, unsigned long count, float *dotResult )
+static long b3_maxdot_large_sel(const float *vv, const float *vec, unsigned long count, float *dotResult)
{
- if( _get_cpu_capabilities() & 0x2000 )
- b3_mindot_large = _mindot_large_v1;
- else
- b3_mindot_large = _mindot_large_v0;
+ if (_get_cpu_capabilities() & 0x2000)
+ b3_maxdot_large = _maxdot_large_v1;
+ else
+ b3_maxdot_large = _maxdot_large_v0;
- return b3_mindot_large(vv, vec, count, dotResult);
+ return b3_maxdot_large(vv, vec, count, dotResult);
}
+static long b3_mindot_large_sel(const float *vv, const float *vec, unsigned long count, float *dotResult)
+{
+ if (_get_cpu_capabilities() & 0x2000)
+ b3_mindot_large = _mindot_large_v1;
+ else
+ b3_mindot_large = _mindot_large_v0;
+ return b3_mindot_large(vv, vec, count, dotResult);
+}
-#define vld1q_f32_aligned_postincrement( _ptr ) ({ float32x4_t _r; asm( "vld1.f32 {%0}, [%1, :128]!\n" : "=w" (_r), "+r" (_ptr) ); /*return*/ _r; })
-
+#define vld1q_f32_aligned_postincrement(_ptr) ({ float32x4_t _r; asm( "vld1.f32 {%0}, [%1, :128]!\n" : "=w" (_r), "+r" (_ptr) ); /*return*/ _r; })
-long b3_maxdot_large_v0( const float *vv, const float *vec, unsigned long count, float *dotResult )
+long b3_maxdot_large_v0(const float *vv, const float *vec, unsigned long count, float *dotResult)
{
- unsigned long i = 0;
- float32x4_t vvec = vld1q_f32_aligned_postincrement( vec );
- float32x2_t vLo = vget_low_f32(vvec);
- float32x2_t vHi = vdup_lane_f32(vget_high_f32(vvec), 0);
- float32x2_t dotMaxLo = (float32x2_t) { -B3_INFINITY, -B3_INFINITY };
- float32x2_t dotMaxHi = (float32x2_t) { -B3_INFINITY, -B3_INFINITY };
- uint32x2_t indexLo = (uint32x2_t) {0, 1};
- uint32x2_t indexHi = (uint32x2_t) {2, 3};
- uint32x2_t iLo = (uint32x2_t) {-1, -1};
- uint32x2_t iHi = (uint32x2_t) {-1, -1};
- const uint32x2_t four = (uint32x2_t) {4,4};
-
- for( ; i+8 <= count; i+= 8 )
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v2 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v3 = vld1q_f32_aligned_postincrement( vv );
-
- float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo);
- float32x2_t xy1 = vmul_f32( vget_low_f32(v1), vLo);
- float32x2_t xy2 = vmul_f32( vget_low_f32(v2), vLo);
- float32x2_t xy3 = vmul_f32( vget_low_f32(v3), vLo);
-
- float32x2x2_t z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x2x2_t z1 = vtrn_f32( vget_high_f32(v2), vget_high_f32(v3));
- float32x2_t zLo = vmul_f32( z0.val[0], vHi);
- float32x2_t zHi = vmul_f32( z1.val[0], vHi);
-
- float32x2_t rLo = vpadd_f32( xy0, xy1);
- float32x2_t rHi = vpadd_f32( xy2, xy3);
- rLo = vadd_f32(rLo, zLo);
- rHi = vadd_f32(rHi, zHi);
-
- uint32x2_t maskLo = vcgt_f32( rLo, dotMaxLo );
- uint32x2_t maskHi = vcgt_f32( rHi, dotMaxHi );
- dotMaxLo = vbsl_f32( maskLo, rLo, dotMaxLo);
- dotMaxHi = vbsl_f32( maskHi, rHi, dotMaxHi);
- iLo = vbsl_u32(maskLo, indexLo, iLo);
- iHi = vbsl_u32(maskHi, indexHi, iHi);
- indexLo = vadd_u32(indexLo, four);
- indexHi = vadd_u32(indexHi, four);
-
- v0 = vld1q_f32_aligned_postincrement( vv );
- v1 = vld1q_f32_aligned_postincrement( vv );
- v2 = vld1q_f32_aligned_postincrement( vv );
- v3 = vld1q_f32_aligned_postincrement( vv );
-
- xy0 = vmul_f32( vget_low_f32(v0), vLo);
- xy1 = vmul_f32( vget_low_f32(v1), vLo);
- xy2 = vmul_f32( vget_low_f32(v2), vLo);
- xy3 = vmul_f32( vget_low_f32(v3), vLo);
-
- z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1));
- z1 = vtrn_f32( vget_high_f32(v2), vget_high_f32(v3));
- zLo = vmul_f32( z0.val[0], vHi);
- zHi = vmul_f32( z1.val[0], vHi);
-
- rLo = vpadd_f32( xy0, xy1);
- rHi = vpadd_f32( xy2, xy3);
- rLo = vadd_f32(rLo, zLo);
- rHi = vadd_f32(rHi, zHi);
-
- maskLo = vcgt_f32( rLo, dotMaxLo );
- maskHi = vcgt_f32( rHi, dotMaxHi );
- dotMaxLo = vbsl_f32( maskLo, rLo, dotMaxLo);
- dotMaxHi = vbsl_f32( maskHi, rHi, dotMaxHi);
- iLo = vbsl_u32(maskLo, indexLo, iLo);
- iHi = vbsl_u32(maskHi, indexHi, iHi);
- indexLo = vadd_u32(indexLo, four);
- indexHi = vadd_u32(indexHi, four);
- }
-
- for( ; i+4 <= count; i+= 4 )
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v2 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v3 = vld1q_f32_aligned_postincrement( vv );
-
- float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo);
- float32x2_t xy1 = vmul_f32( vget_low_f32(v1), vLo);
- float32x2_t xy2 = vmul_f32( vget_low_f32(v2), vLo);
- float32x2_t xy3 = vmul_f32( vget_low_f32(v3), vLo);
-
- float32x2x2_t z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x2x2_t z1 = vtrn_f32( vget_high_f32(v2), vget_high_f32(v3));
- float32x2_t zLo = vmul_f32( z0.val[0], vHi);
- float32x2_t zHi = vmul_f32( z1.val[0], vHi);
-
- float32x2_t rLo = vpadd_f32( xy0, xy1);
- float32x2_t rHi = vpadd_f32( xy2, xy3);
- rLo = vadd_f32(rLo, zLo);
- rHi = vadd_f32(rHi, zHi);
-
- uint32x2_t maskLo = vcgt_f32( rLo, dotMaxLo );
- uint32x2_t maskHi = vcgt_f32( rHi, dotMaxHi );
- dotMaxLo = vbsl_f32( maskLo, rLo, dotMaxLo);
- dotMaxHi = vbsl_f32( maskHi, rHi, dotMaxHi);
- iLo = vbsl_u32(maskLo, indexLo, iLo);
- iHi = vbsl_u32(maskHi, indexHi, iHi);
- indexLo = vadd_u32(indexLo, four);
- indexHi = vadd_u32(indexHi, four);
- }
-
- switch( count & 3 )
- {
- case 3:
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v2 = vld1q_f32_aligned_postincrement( vv );
-
- float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo);
- float32x2_t xy1 = vmul_f32( vget_low_f32(v1), vLo);
- float32x2_t xy2 = vmul_f32( vget_low_f32(v2), vLo);
-
- float32x2x2_t z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x2_t zLo = vmul_f32( z0.val[0], vHi);
- float32x2_t zHi = vmul_f32( vdup_lane_f32(vget_high_f32(v2), 0), vHi);
-
- float32x2_t rLo = vpadd_f32( xy0, xy1);
- float32x2_t rHi = vpadd_f32( xy2, xy2);
- rLo = vadd_f32(rLo, zLo);
- rHi = vadd_f32(rHi, zHi);
-
- uint32x2_t maskLo = vcgt_f32( rLo, dotMaxLo );
- uint32x2_t maskHi = vcgt_f32( rHi, dotMaxHi );
- dotMaxLo = vbsl_f32( maskLo, rLo, dotMaxLo);
- dotMaxHi = vbsl_f32( maskHi, rHi, dotMaxHi);
- iLo = vbsl_u32(maskLo, indexLo, iLo);
- iHi = vbsl_u32(maskHi, indexHi, iHi);
- }
- break;
- case 2:
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
-
- float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo);
- float32x2_t xy1 = vmul_f32( vget_low_f32(v1), vLo);
-
- float32x2x2_t z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x2_t zLo = vmul_f32( z0.val[0], vHi);
-
- float32x2_t rLo = vpadd_f32( xy0, xy1);
- rLo = vadd_f32(rLo, zLo);
-
- uint32x2_t maskLo = vcgt_f32( rLo, dotMaxLo );
- dotMaxLo = vbsl_f32( maskLo, rLo, dotMaxLo);
- iLo = vbsl_u32(maskLo, indexLo, iLo);
- }
- break;
- case 1:
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo);
- float32x2_t z0 = vdup_lane_f32(vget_high_f32(v0), 0);
- float32x2_t zLo = vmul_f32( z0, vHi);
- float32x2_t rLo = vpadd_f32( xy0, xy0);
- rLo = vadd_f32(rLo, zLo);
- uint32x2_t maskLo = vcgt_f32( rLo, dotMaxLo );
- dotMaxLo = vbsl_f32( maskLo, rLo, dotMaxLo);
- iLo = vbsl_u32(maskLo, indexLo, iLo);
- }
- break;
-
- default:
- break;
- }
-
- // select best answer between hi and lo results
- uint32x2_t mask = vcgt_f32( dotMaxHi, dotMaxLo );
- dotMaxLo = vbsl_f32(mask, dotMaxHi, dotMaxLo);
- iLo = vbsl_u32(mask, iHi, iLo);
-
- // select best answer between even and odd results
- dotMaxHi = vdup_lane_f32(dotMaxLo, 1);
- iHi = vdup_lane_u32(iLo, 1);
- mask = vcgt_f32( dotMaxHi, dotMaxLo );
- dotMaxLo = vbsl_f32(mask, dotMaxHi, dotMaxLo);
- iLo = vbsl_u32(mask, iHi, iLo);
-
- *dotResult = vget_lane_f32( dotMaxLo, 0);
- return vget_lane_u32(iLo, 0);
+ unsigned long i = 0;
+ float32x4_t vvec = vld1q_f32_aligned_postincrement(vec);
+ float32x2_t vLo = vget_low_f32(vvec);
+ float32x2_t vHi = vdup_lane_f32(vget_high_f32(vvec), 0);
+ float32x2_t dotMaxLo = (float32x2_t){-B3_INFINITY, -B3_INFINITY};
+ float32x2_t dotMaxHi = (float32x2_t){-B3_INFINITY, -B3_INFINITY};
+ uint32x2_t indexLo = (uint32x2_t){0, 1};
+ uint32x2_t indexHi = (uint32x2_t){2, 3};
+ uint32x2_t iLo = (uint32x2_t){-1, -1};
+ uint32x2_t iHi = (uint32x2_t){-1, -1};
+ const uint32x2_t four = (uint32x2_t){4, 4};
+
+ for (; i + 8 <= count; i += 8)
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v2 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v3 = vld1q_f32_aligned_postincrement(vv);
+
+ float32x2_t xy0 = vmul_f32(vget_low_f32(v0), vLo);
+ float32x2_t xy1 = vmul_f32(vget_low_f32(v1), vLo);
+ float32x2_t xy2 = vmul_f32(vget_low_f32(v2), vLo);
+ float32x2_t xy3 = vmul_f32(vget_low_f32(v3), vLo);
+
+ float32x2x2_t z0 = vtrn_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x2x2_t z1 = vtrn_f32(vget_high_f32(v2), vget_high_f32(v3));
+ float32x2_t zLo = vmul_f32(z0.val[0], vHi);
+ float32x2_t zHi = vmul_f32(z1.val[0], vHi);
+
+ float32x2_t rLo = vpadd_f32(xy0, xy1);
+ float32x2_t rHi = vpadd_f32(xy2, xy3);
+ rLo = vadd_f32(rLo, zLo);
+ rHi = vadd_f32(rHi, zHi);
+
+ uint32x2_t maskLo = vcgt_f32(rLo, dotMaxLo);
+ uint32x2_t maskHi = vcgt_f32(rHi, dotMaxHi);
+ dotMaxLo = vbsl_f32(maskLo, rLo, dotMaxLo);
+ dotMaxHi = vbsl_f32(maskHi, rHi, dotMaxHi);
+ iLo = vbsl_u32(maskLo, indexLo, iLo);
+ iHi = vbsl_u32(maskHi, indexHi, iHi);
+ indexLo = vadd_u32(indexLo, four);
+ indexHi = vadd_u32(indexHi, four);
+
+ v0 = vld1q_f32_aligned_postincrement(vv);
+ v1 = vld1q_f32_aligned_postincrement(vv);
+ v2 = vld1q_f32_aligned_postincrement(vv);
+ v3 = vld1q_f32_aligned_postincrement(vv);
+
+ xy0 = vmul_f32(vget_low_f32(v0), vLo);
+ xy1 = vmul_f32(vget_low_f32(v1), vLo);
+ xy2 = vmul_f32(vget_low_f32(v2), vLo);
+ xy3 = vmul_f32(vget_low_f32(v3), vLo);
+
+ z0 = vtrn_f32(vget_high_f32(v0), vget_high_f32(v1));
+ z1 = vtrn_f32(vget_high_f32(v2), vget_high_f32(v3));
+ zLo = vmul_f32(z0.val[0], vHi);
+ zHi = vmul_f32(z1.val[0], vHi);
+
+ rLo = vpadd_f32(xy0, xy1);
+ rHi = vpadd_f32(xy2, xy3);
+ rLo = vadd_f32(rLo, zLo);
+ rHi = vadd_f32(rHi, zHi);
+
+ maskLo = vcgt_f32(rLo, dotMaxLo);
+ maskHi = vcgt_f32(rHi, dotMaxHi);
+ dotMaxLo = vbsl_f32(maskLo, rLo, dotMaxLo);
+ dotMaxHi = vbsl_f32(maskHi, rHi, dotMaxHi);
+ iLo = vbsl_u32(maskLo, indexLo, iLo);
+ iHi = vbsl_u32(maskHi, indexHi, iHi);
+ indexLo = vadd_u32(indexLo, four);
+ indexHi = vadd_u32(indexHi, four);
+ }
+
+ for (; i + 4 <= count; i += 4)
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v2 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v3 = vld1q_f32_aligned_postincrement(vv);
+
+ float32x2_t xy0 = vmul_f32(vget_low_f32(v0), vLo);
+ float32x2_t xy1 = vmul_f32(vget_low_f32(v1), vLo);
+ float32x2_t xy2 = vmul_f32(vget_low_f32(v2), vLo);
+ float32x2_t xy3 = vmul_f32(vget_low_f32(v3), vLo);
+
+ float32x2x2_t z0 = vtrn_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x2x2_t z1 = vtrn_f32(vget_high_f32(v2), vget_high_f32(v3));
+ float32x2_t zLo = vmul_f32(z0.val[0], vHi);
+ float32x2_t zHi = vmul_f32(z1.val[0], vHi);
+
+ float32x2_t rLo = vpadd_f32(xy0, xy1);
+ float32x2_t rHi = vpadd_f32(xy2, xy3);
+ rLo = vadd_f32(rLo, zLo);
+ rHi = vadd_f32(rHi, zHi);
+
+ uint32x2_t maskLo = vcgt_f32(rLo, dotMaxLo);
+ uint32x2_t maskHi = vcgt_f32(rHi, dotMaxHi);
+ dotMaxLo = vbsl_f32(maskLo, rLo, dotMaxLo);
+ dotMaxHi = vbsl_f32(maskHi, rHi, dotMaxHi);
+ iLo = vbsl_u32(maskLo, indexLo, iLo);
+ iHi = vbsl_u32(maskHi, indexHi, iHi);
+ indexLo = vadd_u32(indexLo, four);
+ indexHi = vadd_u32(indexHi, four);
+ }
+
+ switch (count & 3)
+ {
+ case 3:
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v2 = vld1q_f32_aligned_postincrement(vv);
+
+ float32x2_t xy0 = vmul_f32(vget_low_f32(v0), vLo);
+ float32x2_t xy1 = vmul_f32(vget_low_f32(v1), vLo);
+ float32x2_t xy2 = vmul_f32(vget_low_f32(v2), vLo);
+
+ float32x2x2_t z0 = vtrn_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x2_t zLo = vmul_f32(z0.val[0], vHi);
+ float32x2_t zHi = vmul_f32(vdup_lane_f32(vget_high_f32(v2), 0), vHi);
+
+ float32x2_t rLo = vpadd_f32(xy0, xy1);
+ float32x2_t rHi = vpadd_f32(xy2, xy2);
+ rLo = vadd_f32(rLo, zLo);
+ rHi = vadd_f32(rHi, zHi);
+
+ uint32x2_t maskLo = vcgt_f32(rLo, dotMaxLo);
+ uint32x2_t maskHi = vcgt_f32(rHi, dotMaxHi);
+ dotMaxLo = vbsl_f32(maskLo, rLo, dotMaxLo);
+ dotMaxHi = vbsl_f32(maskHi, rHi, dotMaxHi);
+ iLo = vbsl_u32(maskLo, indexLo, iLo);
+ iHi = vbsl_u32(maskHi, indexHi, iHi);
+ }
+ break;
+ case 2:
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+
+ float32x2_t xy0 = vmul_f32(vget_low_f32(v0), vLo);
+ float32x2_t xy1 = vmul_f32(vget_low_f32(v1), vLo);
+
+ float32x2x2_t z0 = vtrn_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x2_t zLo = vmul_f32(z0.val[0], vHi);
+
+ float32x2_t rLo = vpadd_f32(xy0, xy1);
+ rLo = vadd_f32(rLo, zLo);
+
+ uint32x2_t maskLo = vcgt_f32(rLo, dotMaxLo);
+ dotMaxLo = vbsl_f32(maskLo, rLo, dotMaxLo);
+ iLo = vbsl_u32(maskLo, indexLo, iLo);
+ }
+ break;
+ case 1:
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x2_t xy0 = vmul_f32(vget_low_f32(v0), vLo);
+ float32x2_t z0 = vdup_lane_f32(vget_high_f32(v0), 0);
+ float32x2_t zLo = vmul_f32(z0, vHi);
+ float32x2_t rLo = vpadd_f32(xy0, xy0);
+ rLo = vadd_f32(rLo, zLo);
+ uint32x2_t maskLo = vcgt_f32(rLo, dotMaxLo);
+ dotMaxLo = vbsl_f32(maskLo, rLo, dotMaxLo);
+ iLo = vbsl_u32(maskLo, indexLo, iLo);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ // select best answer between hi and lo results
+ uint32x2_t mask = vcgt_f32(dotMaxHi, dotMaxLo);
+ dotMaxLo = vbsl_f32(mask, dotMaxHi, dotMaxLo);
+ iLo = vbsl_u32(mask, iHi, iLo);
+
+ // select best answer between even and odd results
+ dotMaxHi = vdup_lane_f32(dotMaxLo, 1);
+ iHi = vdup_lane_u32(iLo, 1);
+ mask = vcgt_f32(dotMaxHi, dotMaxLo);
+ dotMaxLo = vbsl_f32(mask, dotMaxHi, dotMaxLo);
+ iLo = vbsl_u32(mask, iHi, iLo);
+
+ *dotResult = vget_lane_f32(dotMaxLo, 0);
+ return vget_lane_u32(iLo, 0);
}
-
-long b3_maxdot_large_v1( const float *vv, const float *vec, unsigned long count, float *dotResult )
+long b3_maxdot_large_v1(const float *vv, const float *vec, unsigned long count, float *dotResult)
{
- float32x4_t vvec = vld1q_f32_aligned_postincrement( vec );
- float32x4_t vLo = vcombine_f32(vget_low_f32(vvec), vget_low_f32(vvec));
- float32x4_t vHi = vdupq_lane_f32(vget_high_f32(vvec), 0);
- const uint32x4_t four = (uint32x4_t){ 4, 4, 4, 4 };
- uint32x4_t local_index = (uint32x4_t) {0, 1, 2, 3};
- uint32x4_t index = (uint32x4_t) { -1, -1, -1, -1 };
- float32x4_t maxDot = (float32x4_t) { -B3_INFINITY, -B3_INFINITY, -B3_INFINITY, -B3_INFINITY };
-
- unsigned long i = 0;
- for( ; i + 8 <= count; i += 8 )
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v2 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v3 = vld1q_f32_aligned_postincrement( vv );
-
- // the next two lines should resolve to a single vswp d, d
- float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1));
- float32x4_t xy1 = vcombine_f32( vget_low_f32(v2), vget_low_f32(v3));
- // the next two lines should resolve to a single vswp d, d
- float32x4_t z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x4_t z1 = vcombine_f32( vget_high_f32(v2), vget_high_f32(v3));
-
- xy0 = vmulq_f32(xy0, vLo);
- xy1 = vmulq_f32(xy1, vLo);
-
- float32x4x2_t zb = vuzpq_f32( z0, z1);
- float32x4_t z = vmulq_f32( zb.val[0], vHi);
- float32x4x2_t xy = vuzpq_f32( xy0, xy1);
- float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
- x = vaddq_f32(x, z);
-
- uint32x4_t mask = vcgtq_f32(x, maxDot);
- maxDot = vbslq_f32( mask, x, maxDot);
- index = vbslq_u32(mask, local_index, index);
- local_index = vaddq_u32(local_index, four);
-
- v0 = vld1q_f32_aligned_postincrement( vv );
- v1 = vld1q_f32_aligned_postincrement( vv );
- v2 = vld1q_f32_aligned_postincrement( vv );
- v3 = vld1q_f32_aligned_postincrement( vv );
-
- // the next two lines should resolve to a single vswp d, d
- xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1));
- xy1 = vcombine_f32( vget_low_f32(v2), vget_low_f32(v3));
- // the next two lines should resolve to a single vswp d, d
- z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1));
- z1 = vcombine_f32( vget_high_f32(v2), vget_high_f32(v3));
-
- xy0 = vmulq_f32(xy0, vLo);
- xy1 = vmulq_f32(xy1, vLo);
-
- zb = vuzpq_f32( z0, z1);
- z = vmulq_f32( zb.val[0], vHi);
- xy = vuzpq_f32( xy0, xy1);
- x = vaddq_f32(xy.val[0], xy.val[1]);
- x = vaddq_f32(x, z);
-
- mask = vcgtq_f32(x, maxDot);
- maxDot = vbslq_f32( mask, x, maxDot);
- index = vbslq_u32(mask, local_index, index);
- local_index = vaddq_u32(local_index, four);
- }
-
- for( ; i + 4 <= count; i += 4 )
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v2 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v3 = vld1q_f32_aligned_postincrement( vv );
-
- // the next two lines should resolve to a single vswp d, d
- float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1));
- float32x4_t xy1 = vcombine_f32( vget_low_f32(v2), vget_low_f32(v3));
- // the next two lines should resolve to a single vswp d, d
- float32x4_t z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x4_t z1 = vcombine_f32( vget_high_f32(v2), vget_high_f32(v3));
-
- xy0 = vmulq_f32(xy0, vLo);
- xy1 = vmulq_f32(xy1, vLo);
-
- float32x4x2_t zb = vuzpq_f32( z0, z1);
- float32x4_t z = vmulq_f32( zb.val[0], vHi);
- float32x4x2_t xy = vuzpq_f32( xy0, xy1);
- float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
- x = vaddq_f32(x, z);
-
- uint32x4_t mask = vcgtq_f32(x, maxDot);
- maxDot = vbslq_f32( mask, x, maxDot);
- index = vbslq_u32(mask, local_index, index);
- local_index = vaddq_u32(local_index, four);
- }
-
- switch (count & 3) {
- case 3:
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v2 = vld1q_f32_aligned_postincrement( vv );
-
- // the next two lines should resolve to a single vswp d, d
- float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1));
- float32x4_t xy1 = vcombine_f32( vget_low_f32(v2), vget_low_f32(v2));
- // the next two lines should resolve to a single vswp d, d
- float32x4_t z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x4_t z1 = vcombine_f32( vget_high_f32(v2), vget_high_f32(v2));
-
- xy0 = vmulq_f32(xy0, vLo);
- xy1 = vmulq_f32(xy1, vLo);
-
- float32x4x2_t zb = vuzpq_f32( z0, z1);
- float32x4_t z = vmulq_f32( zb.val[0], vHi);
- float32x4x2_t xy = vuzpq_f32( xy0, xy1);
- float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
- x = vaddq_f32(x, z);
-
- uint32x4_t mask = vcgtq_f32(x, maxDot);
- maxDot = vbslq_f32( mask, x, maxDot);
- index = vbslq_u32(mask, local_index, index);
- local_index = vaddq_u32(local_index, four);
- }
- break;
-
- case 2:
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
-
- // the next two lines should resolve to a single vswp d, d
- float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1));
- // the next two lines should resolve to a single vswp d, d
- float32x4_t z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1));
-
- xy0 = vmulq_f32(xy0, vLo);
-
- float32x4x2_t zb = vuzpq_f32( z0, z0);
- float32x4_t z = vmulq_f32( zb.val[0], vHi);
- float32x4x2_t xy = vuzpq_f32( xy0, xy0);
- float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
- x = vaddq_f32(x, z);
-
- uint32x4_t mask = vcgtq_f32(x, maxDot);
- maxDot = vbslq_f32( mask, x, maxDot);
- index = vbslq_u32(mask, local_index, index);
- local_index = vaddq_u32(local_index, four);
- }
- break;
-
- case 1:
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
-
- // the next two lines should resolve to a single vswp d, d
- float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v0));
- // the next two lines should resolve to a single vswp d, d
- float32x4_t z = vdupq_lane_f32(vget_high_f32(v0), 0);
-
- xy0 = vmulq_f32(xy0, vLo);
-
- z = vmulq_f32( z, vHi);
- float32x4x2_t xy = vuzpq_f32( xy0, xy0);
- float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
- x = vaddq_f32(x, z);
-
- uint32x4_t mask = vcgtq_f32(x, maxDot);
- maxDot = vbslq_f32( mask, x, maxDot);
- index = vbslq_u32(mask, local_index, index);
- local_index = vaddq_u32(local_index, four);
- }
- break;
-
- default:
- break;
- }
-
-
- // select best answer between hi and lo results
- uint32x2_t mask = vcgt_f32( vget_high_f32(maxDot), vget_low_f32(maxDot));
- float32x2_t maxDot2 = vbsl_f32(mask, vget_high_f32(maxDot), vget_low_f32(maxDot));
- uint32x2_t index2 = vbsl_u32(mask, vget_high_u32(index), vget_low_u32(index));
-
- // select best answer between even and odd results
- float32x2_t maxDotO = vdup_lane_f32(maxDot2, 1);
- uint32x2_t indexHi = vdup_lane_u32(index2, 1);
- mask = vcgt_f32( maxDotO, maxDot2 );
- maxDot2 = vbsl_f32(mask, maxDotO, maxDot2);
- index2 = vbsl_u32(mask, indexHi, index2);
-
- *dotResult = vget_lane_f32( maxDot2, 0);
- return vget_lane_u32(index2, 0);
-
+ float32x4_t vvec = vld1q_f32_aligned_postincrement(vec);
+ float32x4_t vLo = vcombine_f32(vget_low_f32(vvec), vget_low_f32(vvec));
+ float32x4_t vHi = vdupq_lane_f32(vget_high_f32(vvec), 0);
+ const uint32x4_t four = (uint32x4_t){4, 4, 4, 4};
+ uint32x4_t local_index = (uint32x4_t){0, 1, 2, 3};
+ uint32x4_t index = (uint32x4_t){-1, -1, -1, -1};
+ float32x4_t maxDot = (float32x4_t){-B3_INFINITY, -B3_INFINITY, -B3_INFINITY, -B3_INFINITY};
+
+ unsigned long i = 0;
+ for (; i + 8 <= count; i += 8)
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v2 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v3 = vld1q_f32_aligned_postincrement(vv);
+
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t xy0 = vcombine_f32(vget_low_f32(v0), vget_low_f32(v1));
+ float32x4_t xy1 = vcombine_f32(vget_low_f32(v2), vget_low_f32(v3));
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t z0 = vcombine_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x4_t z1 = vcombine_f32(vget_high_f32(v2), vget_high_f32(v3));
+
+ xy0 = vmulq_f32(xy0, vLo);
+ xy1 = vmulq_f32(xy1, vLo);
+
+ float32x4x2_t zb = vuzpq_f32(z0, z1);
+ float32x4_t z = vmulq_f32(zb.val[0], vHi);
+ float32x4x2_t xy = vuzpq_f32(xy0, xy1);
+ float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
+ x = vaddq_f32(x, z);
+
+ uint32x4_t mask = vcgtq_f32(x, maxDot);
+ maxDot = vbslq_f32(mask, x, maxDot);
+ index = vbslq_u32(mask, local_index, index);
+ local_index = vaddq_u32(local_index, four);
+
+ v0 = vld1q_f32_aligned_postincrement(vv);
+ v1 = vld1q_f32_aligned_postincrement(vv);
+ v2 = vld1q_f32_aligned_postincrement(vv);
+ v3 = vld1q_f32_aligned_postincrement(vv);
+
+ // the next two lines should resolve to a single vswp d, d
+ xy0 = vcombine_f32(vget_low_f32(v0), vget_low_f32(v1));
+ xy1 = vcombine_f32(vget_low_f32(v2), vget_low_f32(v3));
+ // the next two lines should resolve to a single vswp d, d
+ z0 = vcombine_f32(vget_high_f32(v0), vget_high_f32(v1));
+ z1 = vcombine_f32(vget_high_f32(v2), vget_high_f32(v3));
+
+ xy0 = vmulq_f32(xy0, vLo);
+ xy1 = vmulq_f32(xy1, vLo);
+
+ zb = vuzpq_f32(z0, z1);
+ z = vmulq_f32(zb.val[0], vHi);
+ xy = vuzpq_f32(xy0, xy1);
+ x = vaddq_f32(xy.val[0], xy.val[1]);
+ x = vaddq_f32(x, z);
+
+ mask = vcgtq_f32(x, maxDot);
+ maxDot = vbslq_f32(mask, x, maxDot);
+ index = vbslq_u32(mask, local_index, index);
+ local_index = vaddq_u32(local_index, four);
+ }
+
+ for (; i + 4 <= count; i += 4)
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v2 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v3 = vld1q_f32_aligned_postincrement(vv);
+
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t xy0 = vcombine_f32(vget_low_f32(v0), vget_low_f32(v1));
+ float32x4_t xy1 = vcombine_f32(vget_low_f32(v2), vget_low_f32(v3));
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t z0 = vcombine_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x4_t z1 = vcombine_f32(vget_high_f32(v2), vget_high_f32(v3));
+
+ xy0 = vmulq_f32(xy0, vLo);
+ xy1 = vmulq_f32(xy1, vLo);
+
+ float32x4x2_t zb = vuzpq_f32(z0, z1);
+ float32x4_t z = vmulq_f32(zb.val[0], vHi);
+ float32x4x2_t xy = vuzpq_f32(xy0, xy1);
+ float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
+ x = vaddq_f32(x, z);
+
+ uint32x4_t mask = vcgtq_f32(x, maxDot);
+ maxDot = vbslq_f32(mask, x, maxDot);
+ index = vbslq_u32(mask, local_index, index);
+ local_index = vaddq_u32(local_index, four);
+ }
+
+ switch (count & 3)
+ {
+ case 3:
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v2 = vld1q_f32_aligned_postincrement(vv);
+
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t xy0 = vcombine_f32(vget_low_f32(v0), vget_low_f32(v1));
+ float32x4_t xy1 = vcombine_f32(vget_low_f32(v2), vget_low_f32(v2));
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t z0 = vcombine_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x4_t z1 = vcombine_f32(vget_high_f32(v2), vget_high_f32(v2));
+
+ xy0 = vmulq_f32(xy0, vLo);
+ xy1 = vmulq_f32(xy1, vLo);
+
+ float32x4x2_t zb = vuzpq_f32(z0, z1);
+ float32x4_t z = vmulq_f32(zb.val[0], vHi);
+ float32x4x2_t xy = vuzpq_f32(xy0, xy1);
+ float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
+ x = vaddq_f32(x, z);
+
+ uint32x4_t mask = vcgtq_f32(x, maxDot);
+ maxDot = vbslq_f32(mask, x, maxDot);
+ index = vbslq_u32(mask, local_index, index);
+ local_index = vaddq_u32(local_index, four);
+ }
+ break;
+
+ case 2:
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t xy0 = vcombine_f32(vget_low_f32(v0), vget_low_f32(v1));
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t z0 = vcombine_f32(vget_high_f32(v0), vget_high_f32(v1));
+
+ xy0 = vmulq_f32(xy0, vLo);
+
+ float32x4x2_t zb = vuzpq_f32(z0, z0);
+ float32x4_t z = vmulq_f32(zb.val[0], vHi);
+ float32x4x2_t xy = vuzpq_f32(xy0, xy0);
+ float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
+ x = vaddq_f32(x, z);
+
+ uint32x4_t mask = vcgtq_f32(x, maxDot);
+ maxDot = vbslq_f32(mask, x, maxDot);
+ index = vbslq_u32(mask, local_index, index);
+ local_index = vaddq_u32(local_index, four);
+ }
+ break;
+
+ case 1:
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t xy0 = vcombine_f32(vget_low_f32(v0), vget_low_f32(v0));
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t z = vdupq_lane_f32(vget_high_f32(v0), 0);
+
+ xy0 = vmulq_f32(xy0, vLo);
+
+ z = vmulq_f32(z, vHi);
+ float32x4x2_t xy = vuzpq_f32(xy0, xy0);
+ float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
+ x = vaddq_f32(x, z);
+
+ uint32x4_t mask = vcgtq_f32(x, maxDot);
+ maxDot = vbslq_f32(mask, x, maxDot);
+ index = vbslq_u32(mask, local_index, index);
+ local_index = vaddq_u32(local_index, four);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ // select best answer between hi and lo results
+ uint32x2_t mask = vcgt_f32(vget_high_f32(maxDot), vget_low_f32(maxDot));
+ float32x2_t maxDot2 = vbsl_f32(mask, vget_high_f32(maxDot), vget_low_f32(maxDot));
+ uint32x2_t index2 = vbsl_u32(mask, vget_high_u32(index), vget_low_u32(index));
+
+ // select best answer between even and odd results
+ float32x2_t maxDotO = vdup_lane_f32(maxDot2, 1);
+ uint32x2_t indexHi = vdup_lane_u32(index2, 1);
+ mask = vcgt_f32(maxDotO, maxDot2);
+ maxDot2 = vbsl_f32(mask, maxDotO, maxDot2);
+ index2 = vbsl_u32(mask, indexHi, index2);
+
+ *dotResult = vget_lane_f32(maxDot2, 0);
+ return vget_lane_u32(index2, 0);
}
-long b3_mindot_large_v0( const float *vv, const float *vec, unsigned long count, float *dotResult )
+long b3_mindot_large_v0(const float *vv, const float *vec, unsigned long count, float *dotResult)
{
- unsigned long i = 0;
- float32x4_t vvec = vld1q_f32_aligned_postincrement( vec );
- float32x2_t vLo = vget_low_f32(vvec);
- float32x2_t vHi = vdup_lane_f32(vget_high_f32(vvec), 0);
- float32x2_t dotMinLo = (float32x2_t) { B3_INFINITY, B3_INFINITY };
- float32x2_t dotMinHi = (float32x2_t) { B3_INFINITY, B3_INFINITY };
- uint32x2_t indexLo = (uint32x2_t) {0, 1};
- uint32x2_t indexHi = (uint32x2_t) {2, 3};
- uint32x2_t iLo = (uint32x2_t) {-1, -1};
- uint32x2_t iHi = (uint32x2_t) {-1, -1};
- const uint32x2_t four = (uint32x2_t) {4,4};
-
- for( ; i+8 <= count; i+= 8 )
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v2 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v3 = vld1q_f32_aligned_postincrement( vv );
-
- float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo);
- float32x2_t xy1 = vmul_f32( vget_low_f32(v1), vLo);
- float32x2_t xy2 = vmul_f32( vget_low_f32(v2), vLo);
- float32x2_t xy3 = vmul_f32( vget_low_f32(v3), vLo);
-
- float32x2x2_t z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x2x2_t z1 = vtrn_f32( vget_high_f32(v2), vget_high_f32(v3));
- float32x2_t zLo = vmul_f32( z0.val[0], vHi);
- float32x2_t zHi = vmul_f32( z1.val[0], vHi);
-
- float32x2_t rLo = vpadd_f32( xy0, xy1);
- float32x2_t rHi = vpadd_f32( xy2, xy3);
- rLo = vadd_f32(rLo, zLo);
- rHi = vadd_f32(rHi, zHi);
-
- uint32x2_t maskLo = vclt_f32( rLo, dotMinLo );
- uint32x2_t maskHi = vclt_f32( rHi, dotMinHi );
- dotMinLo = vbsl_f32( maskLo, rLo, dotMinLo);
- dotMinHi = vbsl_f32( maskHi, rHi, dotMinHi);
- iLo = vbsl_u32(maskLo, indexLo, iLo);
- iHi = vbsl_u32(maskHi, indexHi, iHi);
- indexLo = vadd_u32(indexLo, four);
- indexHi = vadd_u32(indexHi, four);
-
- v0 = vld1q_f32_aligned_postincrement( vv );
- v1 = vld1q_f32_aligned_postincrement( vv );
- v2 = vld1q_f32_aligned_postincrement( vv );
- v3 = vld1q_f32_aligned_postincrement( vv );
-
- xy0 = vmul_f32( vget_low_f32(v0), vLo);
- xy1 = vmul_f32( vget_low_f32(v1), vLo);
- xy2 = vmul_f32( vget_low_f32(v2), vLo);
- xy3 = vmul_f32( vget_low_f32(v3), vLo);
-
- z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1));
- z1 = vtrn_f32( vget_high_f32(v2), vget_high_f32(v3));
- zLo = vmul_f32( z0.val[0], vHi);
- zHi = vmul_f32( z1.val[0], vHi);
-
- rLo = vpadd_f32( xy0, xy1);
- rHi = vpadd_f32( xy2, xy3);
- rLo = vadd_f32(rLo, zLo);
- rHi = vadd_f32(rHi, zHi);
-
- maskLo = vclt_f32( rLo, dotMinLo );
- maskHi = vclt_f32( rHi, dotMinHi );
- dotMinLo = vbsl_f32( maskLo, rLo, dotMinLo);
- dotMinHi = vbsl_f32( maskHi, rHi, dotMinHi);
- iLo = vbsl_u32(maskLo, indexLo, iLo);
- iHi = vbsl_u32(maskHi, indexHi, iHi);
- indexLo = vadd_u32(indexLo, four);
- indexHi = vadd_u32(indexHi, four);
- }
-
- for( ; i+4 <= count; i+= 4 )
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v2 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v3 = vld1q_f32_aligned_postincrement( vv );
-
- float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo);
- float32x2_t xy1 = vmul_f32( vget_low_f32(v1), vLo);
- float32x2_t xy2 = vmul_f32( vget_low_f32(v2), vLo);
- float32x2_t xy3 = vmul_f32( vget_low_f32(v3), vLo);
-
- float32x2x2_t z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x2x2_t z1 = vtrn_f32( vget_high_f32(v2), vget_high_f32(v3));
- float32x2_t zLo = vmul_f32( z0.val[0], vHi);
- float32x2_t zHi = vmul_f32( z1.val[0], vHi);
-
- float32x2_t rLo = vpadd_f32( xy0, xy1);
- float32x2_t rHi = vpadd_f32( xy2, xy3);
- rLo = vadd_f32(rLo, zLo);
- rHi = vadd_f32(rHi, zHi);
-
- uint32x2_t maskLo = vclt_f32( rLo, dotMinLo );
- uint32x2_t maskHi = vclt_f32( rHi, dotMinHi );
- dotMinLo = vbsl_f32( maskLo, rLo, dotMinLo);
- dotMinHi = vbsl_f32( maskHi, rHi, dotMinHi);
- iLo = vbsl_u32(maskLo, indexLo, iLo);
- iHi = vbsl_u32(maskHi, indexHi, iHi);
- indexLo = vadd_u32(indexLo, four);
- indexHi = vadd_u32(indexHi, four);
- }
- switch( count & 3 )
- {
- case 3:
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v2 = vld1q_f32_aligned_postincrement( vv );
-
- float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo);
- float32x2_t xy1 = vmul_f32( vget_low_f32(v1), vLo);
- float32x2_t xy2 = vmul_f32( vget_low_f32(v2), vLo);
-
- float32x2x2_t z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x2_t zLo = vmul_f32( z0.val[0], vHi);
- float32x2_t zHi = vmul_f32( vdup_lane_f32(vget_high_f32(v2), 0), vHi);
-
- float32x2_t rLo = vpadd_f32( xy0, xy1);
- float32x2_t rHi = vpadd_f32( xy2, xy2);
- rLo = vadd_f32(rLo, zLo);
- rHi = vadd_f32(rHi, zHi);
-
- uint32x2_t maskLo = vclt_f32( rLo, dotMinLo );
- uint32x2_t maskHi = vclt_f32( rHi, dotMinHi );
- dotMinLo = vbsl_f32( maskLo, rLo, dotMinLo);
- dotMinHi = vbsl_f32( maskHi, rHi, dotMinHi);
- iLo = vbsl_u32(maskLo, indexLo, iLo);
- iHi = vbsl_u32(maskHi, indexHi, iHi);
- }
- break;
- case 2:
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
-
- float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo);
- float32x2_t xy1 = vmul_f32( vget_low_f32(v1), vLo);
-
- float32x2x2_t z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x2_t zLo = vmul_f32( z0.val[0], vHi);
-
- float32x2_t rLo = vpadd_f32( xy0, xy1);
- rLo = vadd_f32(rLo, zLo);
-
- uint32x2_t maskLo = vclt_f32( rLo, dotMinLo );
- dotMinLo = vbsl_f32( maskLo, rLo, dotMinLo);
- iLo = vbsl_u32(maskLo, indexLo, iLo);
- }
- break;
- case 1:
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo);
- float32x2_t z0 = vdup_lane_f32(vget_high_f32(v0), 0);
- float32x2_t zLo = vmul_f32( z0, vHi);
- float32x2_t rLo = vpadd_f32( xy0, xy0);
- rLo = vadd_f32(rLo, zLo);
- uint32x2_t maskLo = vclt_f32( rLo, dotMinLo );
- dotMinLo = vbsl_f32( maskLo, rLo, dotMinLo);
- iLo = vbsl_u32(maskLo, indexLo, iLo);
- }
- break;
-
- default:
- break;
- }
-
- // select best answer between hi and lo results
- uint32x2_t mask = vclt_f32( dotMinHi, dotMinLo );
- dotMinLo = vbsl_f32(mask, dotMinHi, dotMinLo);
- iLo = vbsl_u32(mask, iHi, iLo);
-
- // select best answer between even and odd results
- dotMinHi = vdup_lane_f32(dotMinLo, 1);
- iHi = vdup_lane_u32(iLo, 1);
- mask = vclt_f32( dotMinHi, dotMinLo );
- dotMinLo = vbsl_f32(mask, dotMinHi, dotMinLo);
- iLo = vbsl_u32(mask, iHi, iLo);
-
- *dotResult = vget_lane_f32( dotMinLo, 0);
- return vget_lane_u32(iLo, 0);
+ unsigned long i = 0;
+ float32x4_t vvec = vld1q_f32_aligned_postincrement(vec);
+ float32x2_t vLo = vget_low_f32(vvec);
+ float32x2_t vHi = vdup_lane_f32(vget_high_f32(vvec), 0);
+ float32x2_t dotMinLo = (float32x2_t){B3_INFINITY, B3_INFINITY};
+ float32x2_t dotMinHi = (float32x2_t){B3_INFINITY, B3_INFINITY};
+ uint32x2_t indexLo = (uint32x2_t){0, 1};
+ uint32x2_t indexHi = (uint32x2_t){2, 3};
+ uint32x2_t iLo = (uint32x2_t){-1, -1};
+ uint32x2_t iHi = (uint32x2_t){-1, -1};
+ const uint32x2_t four = (uint32x2_t){4, 4};
+
+ for (; i + 8 <= count; i += 8)
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v2 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v3 = vld1q_f32_aligned_postincrement(vv);
+
+ float32x2_t xy0 = vmul_f32(vget_low_f32(v0), vLo);
+ float32x2_t xy1 = vmul_f32(vget_low_f32(v1), vLo);
+ float32x2_t xy2 = vmul_f32(vget_low_f32(v2), vLo);
+ float32x2_t xy3 = vmul_f32(vget_low_f32(v3), vLo);
+
+ float32x2x2_t z0 = vtrn_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x2x2_t z1 = vtrn_f32(vget_high_f32(v2), vget_high_f32(v3));
+ float32x2_t zLo = vmul_f32(z0.val[0], vHi);
+ float32x2_t zHi = vmul_f32(z1.val[0], vHi);
+
+ float32x2_t rLo = vpadd_f32(xy0, xy1);
+ float32x2_t rHi = vpadd_f32(xy2, xy3);
+ rLo = vadd_f32(rLo, zLo);
+ rHi = vadd_f32(rHi, zHi);
+
+ uint32x2_t maskLo = vclt_f32(rLo, dotMinLo);
+ uint32x2_t maskHi = vclt_f32(rHi, dotMinHi);
+ dotMinLo = vbsl_f32(maskLo, rLo, dotMinLo);
+ dotMinHi = vbsl_f32(maskHi, rHi, dotMinHi);
+ iLo = vbsl_u32(maskLo, indexLo, iLo);
+ iHi = vbsl_u32(maskHi, indexHi, iHi);
+ indexLo = vadd_u32(indexLo, four);
+ indexHi = vadd_u32(indexHi, four);
+
+ v0 = vld1q_f32_aligned_postincrement(vv);
+ v1 = vld1q_f32_aligned_postincrement(vv);
+ v2 = vld1q_f32_aligned_postincrement(vv);
+ v3 = vld1q_f32_aligned_postincrement(vv);
+
+ xy0 = vmul_f32(vget_low_f32(v0), vLo);
+ xy1 = vmul_f32(vget_low_f32(v1), vLo);
+ xy2 = vmul_f32(vget_low_f32(v2), vLo);
+ xy3 = vmul_f32(vget_low_f32(v3), vLo);
+
+ z0 = vtrn_f32(vget_high_f32(v0), vget_high_f32(v1));
+ z1 = vtrn_f32(vget_high_f32(v2), vget_high_f32(v3));
+ zLo = vmul_f32(z0.val[0], vHi);
+ zHi = vmul_f32(z1.val[0], vHi);
+
+ rLo = vpadd_f32(xy0, xy1);
+ rHi = vpadd_f32(xy2, xy3);
+ rLo = vadd_f32(rLo, zLo);
+ rHi = vadd_f32(rHi, zHi);
+
+ maskLo = vclt_f32(rLo, dotMinLo);
+ maskHi = vclt_f32(rHi, dotMinHi);
+ dotMinLo = vbsl_f32(maskLo, rLo, dotMinLo);
+ dotMinHi = vbsl_f32(maskHi, rHi, dotMinHi);
+ iLo = vbsl_u32(maskLo, indexLo, iLo);
+ iHi = vbsl_u32(maskHi, indexHi, iHi);
+ indexLo = vadd_u32(indexLo, four);
+ indexHi = vadd_u32(indexHi, four);
+ }
+
+ for (; i + 4 <= count; i += 4)
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v2 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v3 = vld1q_f32_aligned_postincrement(vv);
+
+ float32x2_t xy0 = vmul_f32(vget_low_f32(v0), vLo);
+ float32x2_t xy1 = vmul_f32(vget_low_f32(v1), vLo);
+ float32x2_t xy2 = vmul_f32(vget_low_f32(v2), vLo);
+ float32x2_t xy3 = vmul_f32(vget_low_f32(v3), vLo);
+
+ float32x2x2_t z0 = vtrn_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x2x2_t z1 = vtrn_f32(vget_high_f32(v2), vget_high_f32(v3));
+ float32x2_t zLo = vmul_f32(z0.val[0], vHi);
+ float32x2_t zHi = vmul_f32(z1.val[0], vHi);
+
+ float32x2_t rLo = vpadd_f32(xy0, xy1);
+ float32x2_t rHi = vpadd_f32(xy2, xy3);
+ rLo = vadd_f32(rLo, zLo);
+ rHi = vadd_f32(rHi, zHi);
+
+ uint32x2_t maskLo = vclt_f32(rLo, dotMinLo);
+ uint32x2_t maskHi = vclt_f32(rHi, dotMinHi);
+ dotMinLo = vbsl_f32(maskLo, rLo, dotMinLo);
+ dotMinHi = vbsl_f32(maskHi, rHi, dotMinHi);
+ iLo = vbsl_u32(maskLo, indexLo, iLo);
+ iHi = vbsl_u32(maskHi, indexHi, iHi);
+ indexLo = vadd_u32(indexLo, four);
+ indexHi = vadd_u32(indexHi, four);
+ }
+ switch (count & 3)
+ {
+ case 3:
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v2 = vld1q_f32_aligned_postincrement(vv);
+
+ float32x2_t xy0 = vmul_f32(vget_low_f32(v0), vLo);
+ float32x2_t xy1 = vmul_f32(vget_low_f32(v1), vLo);
+ float32x2_t xy2 = vmul_f32(vget_low_f32(v2), vLo);
+
+ float32x2x2_t z0 = vtrn_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x2_t zLo = vmul_f32(z0.val[0], vHi);
+ float32x2_t zHi = vmul_f32(vdup_lane_f32(vget_high_f32(v2), 0), vHi);
+
+ float32x2_t rLo = vpadd_f32(xy0, xy1);
+ float32x2_t rHi = vpadd_f32(xy2, xy2);
+ rLo = vadd_f32(rLo, zLo);
+ rHi = vadd_f32(rHi, zHi);
+
+ uint32x2_t maskLo = vclt_f32(rLo, dotMinLo);
+ uint32x2_t maskHi = vclt_f32(rHi, dotMinHi);
+ dotMinLo = vbsl_f32(maskLo, rLo, dotMinLo);
+ dotMinHi = vbsl_f32(maskHi, rHi, dotMinHi);
+ iLo = vbsl_u32(maskLo, indexLo, iLo);
+ iHi = vbsl_u32(maskHi, indexHi, iHi);
+ }
+ break;
+ case 2:
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+
+ float32x2_t xy0 = vmul_f32(vget_low_f32(v0), vLo);
+ float32x2_t xy1 = vmul_f32(vget_low_f32(v1), vLo);
+
+ float32x2x2_t z0 = vtrn_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x2_t zLo = vmul_f32(z0.val[0], vHi);
+
+ float32x2_t rLo = vpadd_f32(xy0, xy1);
+ rLo = vadd_f32(rLo, zLo);
+
+ uint32x2_t maskLo = vclt_f32(rLo, dotMinLo);
+ dotMinLo = vbsl_f32(maskLo, rLo, dotMinLo);
+ iLo = vbsl_u32(maskLo, indexLo, iLo);
+ }
+ break;
+ case 1:
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x2_t xy0 = vmul_f32(vget_low_f32(v0), vLo);
+ float32x2_t z0 = vdup_lane_f32(vget_high_f32(v0), 0);
+ float32x2_t zLo = vmul_f32(z0, vHi);
+ float32x2_t rLo = vpadd_f32(xy0, xy0);
+ rLo = vadd_f32(rLo, zLo);
+ uint32x2_t maskLo = vclt_f32(rLo, dotMinLo);
+ dotMinLo = vbsl_f32(maskLo, rLo, dotMinLo);
+ iLo = vbsl_u32(maskLo, indexLo, iLo);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ // select best answer between hi and lo results
+ uint32x2_t mask = vclt_f32(dotMinHi, dotMinLo);
+ dotMinLo = vbsl_f32(mask, dotMinHi, dotMinLo);
+ iLo = vbsl_u32(mask, iHi, iLo);
+
+ // select best answer between even and odd results
+ dotMinHi = vdup_lane_f32(dotMinLo, 1);
+ iHi = vdup_lane_u32(iLo, 1);
+ mask = vclt_f32(dotMinHi, dotMinLo);
+ dotMinLo = vbsl_f32(mask, dotMinHi, dotMinLo);
+ iLo = vbsl_u32(mask, iHi, iLo);
+
+ *dotResult = vget_lane_f32(dotMinLo, 0);
+ return vget_lane_u32(iLo, 0);
}
-long b3_mindot_large_v1( const float *vv, const float *vec, unsigned long count, float *dotResult )
+long b3_mindot_large_v1(const float *vv, const float *vec, unsigned long count, float *dotResult)
{
- float32x4_t vvec = vld1q_f32_aligned_postincrement( vec );
- float32x4_t vLo = vcombine_f32(vget_low_f32(vvec), vget_low_f32(vvec));
- float32x4_t vHi = vdupq_lane_f32(vget_high_f32(vvec), 0);
- const uint32x4_t four = (uint32x4_t){ 4, 4, 4, 4 };
- uint32x4_t local_index = (uint32x4_t) {0, 1, 2, 3};
- uint32x4_t index = (uint32x4_t) { -1, -1, -1, -1 };
- float32x4_t minDot = (float32x4_t) { B3_INFINITY, B3_INFINITY, B3_INFINITY, B3_INFINITY };
-
- unsigned long i = 0;
- for( ; i + 8 <= count; i += 8 )
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v2 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v3 = vld1q_f32_aligned_postincrement( vv );
-
- // the next two lines should resolve to a single vswp d, d
- float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1));
- float32x4_t xy1 = vcombine_f32( vget_low_f32(v2), vget_low_f32(v3));
- // the next two lines should resolve to a single vswp d, d
- float32x4_t z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x4_t z1 = vcombine_f32( vget_high_f32(v2), vget_high_f32(v3));
-
- xy0 = vmulq_f32(xy0, vLo);
- xy1 = vmulq_f32(xy1, vLo);
-
- float32x4x2_t zb = vuzpq_f32( z0, z1);
- float32x4_t z = vmulq_f32( zb.val[0], vHi);
- float32x4x2_t xy = vuzpq_f32( xy0, xy1);
- float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
- x = vaddq_f32(x, z);
-
- uint32x4_t mask = vcltq_f32(x, minDot);
- minDot = vbslq_f32( mask, x, minDot);
- index = vbslq_u32(mask, local_index, index);
- local_index = vaddq_u32(local_index, four);
-
- v0 = vld1q_f32_aligned_postincrement( vv );
- v1 = vld1q_f32_aligned_postincrement( vv );
- v2 = vld1q_f32_aligned_postincrement( vv );
- v3 = vld1q_f32_aligned_postincrement( vv );
-
- // the next two lines should resolve to a single vswp d, d
- xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1));
- xy1 = vcombine_f32( vget_low_f32(v2), vget_low_f32(v3));
- // the next two lines should resolve to a single vswp d, d
- z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1));
- z1 = vcombine_f32( vget_high_f32(v2), vget_high_f32(v3));
-
- xy0 = vmulq_f32(xy0, vLo);
- xy1 = vmulq_f32(xy1, vLo);
-
- zb = vuzpq_f32( z0, z1);
- z = vmulq_f32( zb.val[0], vHi);
- xy = vuzpq_f32( xy0, xy1);
- x = vaddq_f32(xy.val[0], xy.val[1]);
- x = vaddq_f32(x, z);
-
- mask = vcltq_f32(x, minDot);
- minDot = vbslq_f32( mask, x, minDot);
- index = vbslq_u32(mask, local_index, index);
- local_index = vaddq_u32(local_index, four);
- }
-
- for( ; i + 4 <= count; i += 4 )
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v2 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v3 = vld1q_f32_aligned_postincrement( vv );
-
- // the next two lines should resolve to a single vswp d, d
- float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1));
- float32x4_t xy1 = vcombine_f32( vget_low_f32(v2), vget_low_f32(v3));
- // the next two lines should resolve to a single vswp d, d
- float32x4_t z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x4_t z1 = vcombine_f32( vget_high_f32(v2), vget_high_f32(v3));
-
- xy0 = vmulq_f32(xy0, vLo);
- xy1 = vmulq_f32(xy1, vLo);
-
- float32x4x2_t zb = vuzpq_f32( z0, z1);
- float32x4_t z = vmulq_f32( zb.val[0], vHi);
- float32x4x2_t xy = vuzpq_f32( xy0, xy1);
- float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
- x = vaddq_f32(x, z);
-
- uint32x4_t mask = vcltq_f32(x, minDot);
- minDot = vbslq_f32( mask, x, minDot);
- index = vbslq_u32(mask, local_index, index);
- local_index = vaddq_u32(local_index, four);
- }
-
- switch (count & 3) {
- case 3:
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v2 = vld1q_f32_aligned_postincrement( vv );
-
- // the next two lines should resolve to a single vswp d, d
- float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1));
- float32x4_t xy1 = vcombine_f32( vget_low_f32(v2), vget_low_f32(v2));
- // the next two lines should resolve to a single vswp d, d
- float32x4_t z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x4_t z1 = vcombine_f32( vget_high_f32(v2), vget_high_f32(v2));
-
- xy0 = vmulq_f32(xy0, vLo);
- xy1 = vmulq_f32(xy1, vLo);
-
- float32x4x2_t zb = vuzpq_f32( z0, z1);
- float32x4_t z = vmulq_f32( zb.val[0], vHi);
- float32x4x2_t xy = vuzpq_f32( xy0, xy1);
- float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
- x = vaddq_f32(x, z);
-
- uint32x4_t mask = vcltq_f32(x, minDot);
- minDot = vbslq_f32( mask, x, minDot);
- index = vbslq_u32(mask, local_index, index);
- local_index = vaddq_u32(local_index, four);
- }
- break;
-
- case 2:
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
-
- // the next two lines should resolve to a single vswp d, d
- float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1));
- // the next two lines should resolve to a single vswp d, d
- float32x4_t z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1));
-
- xy0 = vmulq_f32(xy0, vLo);
-
- float32x4x2_t zb = vuzpq_f32( z0, z0);
- float32x4_t z = vmulq_f32( zb.val[0], vHi);
- float32x4x2_t xy = vuzpq_f32( xy0, xy0);
- float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
- x = vaddq_f32(x, z);
-
- uint32x4_t mask = vcltq_f32(x, minDot);
- minDot = vbslq_f32( mask, x, minDot);
- index = vbslq_u32(mask, local_index, index);
- local_index = vaddq_u32(local_index, four);
- }
- break;
-
- case 1:
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
-
- // the next two lines should resolve to a single vswp d, d
- float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v0));
- // the next two lines should resolve to a single vswp d, d
- float32x4_t z = vdupq_lane_f32(vget_high_f32(v0), 0);
-
- xy0 = vmulq_f32(xy0, vLo);
-
- z = vmulq_f32( z, vHi);
- float32x4x2_t xy = vuzpq_f32( xy0, xy0);
- float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
- x = vaddq_f32(x, z);
-
- uint32x4_t mask = vcltq_f32(x, minDot);
- minDot = vbslq_f32( mask, x, minDot);
- index = vbslq_u32(mask, local_index, index);
- local_index = vaddq_u32(local_index, four);
- }
- break;
-
- default:
- break;
- }
-
-
- // select best answer between hi and lo results
- uint32x2_t mask = vclt_f32( vget_high_f32(minDot), vget_low_f32(minDot));
- float32x2_t minDot2 = vbsl_f32(mask, vget_high_f32(minDot), vget_low_f32(minDot));
- uint32x2_t index2 = vbsl_u32(mask, vget_high_u32(index), vget_low_u32(index));
-
- // select best answer between even and odd results
- float32x2_t minDotO = vdup_lane_f32(minDot2, 1);
- uint32x2_t indexHi = vdup_lane_u32(index2, 1);
- mask = vclt_f32( minDotO, minDot2 );
- minDot2 = vbsl_f32(mask, minDotO, minDot2);
- index2 = vbsl_u32(mask, indexHi, index2);
-
- *dotResult = vget_lane_f32( minDot2, 0);
- return vget_lane_u32(index2, 0);
-
+ float32x4_t vvec = vld1q_f32_aligned_postincrement(vec);
+ float32x4_t vLo = vcombine_f32(vget_low_f32(vvec), vget_low_f32(vvec));
+ float32x4_t vHi = vdupq_lane_f32(vget_high_f32(vvec), 0);
+ const uint32x4_t four = (uint32x4_t){4, 4, 4, 4};
+ uint32x4_t local_index = (uint32x4_t){0, 1, 2, 3};
+ uint32x4_t index = (uint32x4_t){-1, -1, -1, -1};
+ float32x4_t minDot = (float32x4_t){B3_INFINITY, B3_INFINITY, B3_INFINITY, B3_INFINITY};
+
+ unsigned long i = 0;
+ for (; i + 8 <= count; i += 8)
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v2 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v3 = vld1q_f32_aligned_postincrement(vv);
+
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t xy0 = vcombine_f32(vget_low_f32(v0), vget_low_f32(v1));
+ float32x4_t xy1 = vcombine_f32(vget_low_f32(v2), vget_low_f32(v3));
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t z0 = vcombine_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x4_t z1 = vcombine_f32(vget_high_f32(v2), vget_high_f32(v3));
+
+ xy0 = vmulq_f32(xy0, vLo);
+ xy1 = vmulq_f32(xy1, vLo);
+
+ float32x4x2_t zb = vuzpq_f32(z0, z1);
+ float32x4_t z = vmulq_f32(zb.val[0], vHi);
+ float32x4x2_t xy = vuzpq_f32(xy0, xy1);
+ float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
+ x = vaddq_f32(x, z);
+
+ uint32x4_t mask = vcltq_f32(x, minDot);
+ minDot = vbslq_f32(mask, x, minDot);
+ index = vbslq_u32(mask, local_index, index);
+ local_index = vaddq_u32(local_index, four);
+
+ v0 = vld1q_f32_aligned_postincrement(vv);
+ v1 = vld1q_f32_aligned_postincrement(vv);
+ v2 = vld1q_f32_aligned_postincrement(vv);
+ v3 = vld1q_f32_aligned_postincrement(vv);
+
+ // the next two lines should resolve to a single vswp d, d
+ xy0 = vcombine_f32(vget_low_f32(v0), vget_low_f32(v1));
+ xy1 = vcombine_f32(vget_low_f32(v2), vget_low_f32(v3));
+ // the next two lines should resolve to a single vswp d, d
+ z0 = vcombine_f32(vget_high_f32(v0), vget_high_f32(v1));
+ z1 = vcombine_f32(vget_high_f32(v2), vget_high_f32(v3));
+
+ xy0 = vmulq_f32(xy0, vLo);
+ xy1 = vmulq_f32(xy1, vLo);
+
+ zb = vuzpq_f32(z0, z1);
+ z = vmulq_f32(zb.val[0], vHi);
+ xy = vuzpq_f32(xy0, xy1);
+ x = vaddq_f32(xy.val[0], xy.val[1]);
+ x = vaddq_f32(x, z);
+
+ mask = vcltq_f32(x, minDot);
+ minDot = vbslq_f32(mask, x, minDot);
+ index = vbslq_u32(mask, local_index, index);
+ local_index = vaddq_u32(local_index, four);
+ }
+
+ for (; i + 4 <= count; i += 4)
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v2 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v3 = vld1q_f32_aligned_postincrement(vv);
+
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t xy0 = vcombine_f32(vget_low_f32(v0), vget_low_f32(v1));
+ float32x4_t xy1 = vcombine_f32(vget_low_f32(v2), vget_low_f32(v3));
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t z0 = vcombine_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x4_t z1 = vcombine_f32(vget_high_f32(v2), vget_high_f32(v3));
+
+ xy0 = vmulq_f32(xy0, vLo);
+ xy1 = vmulq_f32(xy1, vLo);
+
+ float32x4x2_t zb = vuzpq_f32(z0, z1);
+ float32x4_t z = vmulq_f32(zb.val[0], vHi);
+ float32x4x2_t xy = vuzpq_f32(xy0, xy1);
+ float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
+ x = vaddq_f32(x, z);
+
+ uint32x4_t mask = vcltq_f32(x, minDot);
+ minDot = vbslq_f32(mask, x, minDot);
+ index = vbslq_u32(mask, local_index, index);
+ local_index = vaddq_u32(local_index, four);
+ }
+
+ switch (count & 3)
+ {
+ case 3:
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v2 = vld1q_f32_aligned_postincrement(vv);
+
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t xy0 = vcombine_f32(vget_low_f32(v0), vget_low_f32(v1));
+ float32x4_t xy1 = vcombine_f32(vget_low_f32(v2), vget_low_f32(v2));
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t z0 = vcombine_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x4_t z1 = vcombine_f32(vget_high_f32(v2), vget_high_f32(v2));
+
+ xy0 = vmulq_f32(xy0, vLo);
+ xy1 = vmulq_f32(xy1, vLo);
+
+ float32x4x2_t zb = vuzpq_f32(z0, z1);
+ float32x4_t z = vmulq_f32(zb.val[0], vHi);
+ float32x4x2_t xy = vuzpq_f32(xy0, xy1);
+ float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
+ x = vaddq_f32(x, z);
+
+ uint32x4_t mask = vcltq_f32(x, minDot);
+ minDot = vbslq_f32(mask, x, minDot);
+ index = vbslq_u32(mask, local_index, index);
+ local_index = vaddq_u32(local_index, four);
+ }
+ break;
+
+ case 2:
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t xy0 = vcombine_f32(vget_low_f32(v0), vget_low_f32(v1));
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t z0 = vcombine_f32(vget_high_f32(v0), vget_high_f32(v1));
+
+ xy0 = vmulq_f32(xy0, vLo);
+
+ float32x4x2_t zb = vuzpq_f32(z0, z0);
+ float32x4_t z = vmulq_f32(zb.val[0], vHi);
+ float32x4x2_t xy = vuzpq_f32(xy0, xy0);
+ float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
+ x = vaddq_f32(x, z);
+
+ uint32x4_t mask = vcltq_f32(x, minDot);
+ minDot = vbslq_f32(mask, x, minDot);
+ index = vbslq_u32(mask, local_index, index);
+ local_index = vaddq_u32(local_index, four);
+ }
+ break;
+
+ case 1:
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t xy0 = vcombine_f32(vget_low_f32(v0), vget_low_f32(v0));
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t z = vdupq_lane_f32(vget_high_f32(v0), 0);
+
+ xy0 = vmulq_f32(xy0, vLo);
+
+ z = vmulq_f32(z, vHi);
+ float32x4x2_t xy = vuzpq_f32(xy0, xy0);
+ float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
+ x = vaddq_f32(x, z);
+
+ uint32x4_t mask = vcltq_f32(x, minDot);
+ minDot = vbslq_f32(mask, x, minDot);
+ index = vbslq_u32(mask, local_index, index);
+ local_index = vaddq_u32(local_index, four);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ // select best answer between hi and lo results
+ uint32x2_t mask = vclt_f32(vget_high_f32(minDot), vget_low_f32(minDot));
+ float32x2_t minDot2 = vbsl_f32(mask, vget_high_f32(minDot), vget_low_f32(minDot));
+ uint32x2_t index2 = vbsl_u32(mask, vget_high_u32(index), vget_low_u32(index));
+
+ // select best answer between even and odd results
+ float32x2_t minDotO = vdup_lane_f32(minDot2, 1);
+ uint32x2_t indexHi = vdup_lane_u32(index2, 1);
+ mask = vclt_f32(minDotO, minDot2);
+ minDot2 = vbsl_f32(mask, minDotO, minDot2);
+ index2 = vbsl_u32(mask, indexHi, index2);
+
+ *dotResult = vget_lane_f32(minDot2, 0);
+ return vget_lane_u32(index2, 0);
}
#else
- #error Unhandled __APPLE__ arch
+#error Unhandled __APPLE__ arch
#endif
-#endif /* __APPLE__ */
-
-
+#endif /* __APPLE__ */
diff --git a/thirdparty/bullet/Bullet3Common/b3Vector3.h b/thirdparty/bullet/Bullet3Common/b3Vector3.h
index 16ec02b0ed..56e6c13311 100644
--- a/thirdparty/bullet/Bullet3Common/b3Vector3.h
+++ b/thirdparty/bullet/Bullet3Common/b3Vector3.h
@@ -12,8 +12,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
-
#ifndef B3_VECTOR3_H
#define B3_VECTOR3_H
@@ -28,37 +26,34 @@ subject to the following restrictions:
#else
#define b3Vector3Data b3Vector3FloatData
#define b3Vector3DataName "b3Vector3FloatData"
-#endif //B3_USE_DOUBLE_PRECISION
+#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'
+#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))
+#define B3_SHUFFLE(x, y, z, w) ((w) << 6 | (z) << 4 | (y) << 2 | (x))
//#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 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 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};
+const __m128 B3_ATTRIBUTE_ALIGNED16(b3v1_5) = {1.5f, 1.5f, 1.5f, 1.5f};
#endif
@@ -74,70 +69,69 @@ const int32x4_t B3_ATTRIBUTE_ALIGNED16(b3v3AbsMask) = (int32x4_t){0x7FFFFFFF, 0x
class b3Vector3;
class b3Vector4;
-#if defined(B3_USE_SSE_IN_API) && defined (B3_USE_SSE)
+#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);
+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);
-
+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
+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;};
-
- };
+#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;};
+ 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
+#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;
- }
+ 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
+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)
+#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);
@@ -149,12 +143,11 @@ public:
return *this;
}
-
- /**@brief Subtract a vector from this one
+ /**@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)
+#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);
@@ -166,13 +159,13 @@ public:
return *this;
}
- /**@brief Scale the vector
+ /**@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)
+#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);
@@ -184,13 +177,13 @@ public:
return *this;
}
- /**@brief Inversely scale the vector
+ /**@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)
+#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);
@@ -204,11 +197,11 @@ public:
#endif
}
- /**@brief Return the dot product
+ /**@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)
+#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);
@@ -221,29 +214,29 @@ public:
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];
+ 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 */
+ /**@brief Return the length of the vector squared */
B3_FORCE_INLINE b3Scalar length2() const
{
return dot(*this);
}
- /**@brief Return the length of the vector */
+ /**@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
+ /**@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
+ /**@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;
@@ -251,7 +244,7 @@ public:
{
b3Scalar l2 = length2();
//triNormal.normalize();
- if (l2 >= B3_EPSILON*B3_EPSILON)
+ if (l2 >= B3_EPSILON * B3_EPSILON)
{
(*this) /= b3Sqrt(l2);
}
@@ -262,43 +255,42 @@ public:
return *this;
}
- /**@brief Normalize this vector
+ /**@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
+#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
+#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
+#else
- // NR step 1/sqrt(x) - vd is x, y is output
- y = _mm_rsqrt_ss(vd); // estimate
+ // 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
+ // 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 = _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
-
+#endif
return *this;
#else
@@ -306,15 +298,15 @@ public:
#endif
}
- /**@brief Return a normalized version of this vector */
+ /**@brief Return a normalized version of this vector */
B3_FORCE_INLINE b3Vector3 normalized() const;
- /**@brief Return a rotated version of this vector
+ /**@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;
+ B3_FORCE_INLINE b3Vector3 rotate(const b3Vector3& wAxis, const b3Scalar angle) const;
- /**@brief Return the angle between this and another vector
+ /**@brief Return the angle between this and another vector
* @param v The other vector */
B3_FORCE_INLINE b3Scalar angle(const b3Vector3& v) const
{
@@ -323,10 +315,10 @@ public:
return b3Acos(dot(v) / s);
}
- /**@brief Return a vector will the absolute values of each element */
+ /**@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)
+#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));
@@ -338,15 +330,15 @@ public:
#endif
}
- /**@brief Return the cross product between this and another vector
+ /**@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;
+#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)
+ 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);
@@ -381,10 +373,10 @@ public:
B3_FORCE_INLINE b3Scalar triple(const b3Vector3& v1, const b3Vector3& v2) const
{
-#if defined(B3_USE_SSE_IN_API) && defined (B3_USE_SSE)
+#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)
+ __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);
@@ -422,25 +414,24 @@ public:
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]);
+ 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
+ /**@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);
+ 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
+ /**@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);
+ 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
@@ -453,18 +444,17 @@ public:
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)
+#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 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)
+ 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);
+ __m128 tmp3 = _mm_add_ps(r0, r1);
mVec128 = tmp3;
#elif defined(B3_USE_NEON)
float32x4_t vl = vsubq_f32(v1.mVec128, v0.mVec128);
@@ -480,14 +470,14 @@ public:
#endif
}
- /**@brief Return the linear interpolation between this and another vector
+ /**@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)
+#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);
@@ -500,18 +490,17 @@ public:
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);
+ 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
+ /**@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)
+#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);
@@ -523,53 +512,53 @@ public:
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;};
+ /**@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 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
+ 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)));
+#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]));
+ 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
+ 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
+ /**@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)
+ B3_FORCE_INLINE void setMax(const b3Vector3& other)
{
-#if defined(B3_USE_SSE_IN_API) && defined (B3_USE_SSE)
+#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);
@@ -581,12 +570,12 @@ public:
#endif
}
- /**@brief Set each element to the min of the current values and the values of another b3Vector3
+ /**@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)
+ B3_FORCE_INLINE void setMin(const b3Vector3& other)
{
-#if defined(B3_USE_SSE_IN_API) && defined (B3_USE_SSE)
+#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);
@@ -598,46 +587,46 @@ public:
#endif
}
- B3_FORCE_INLINE void setValue(const b3Scalar& _x, const b3Scalar& _y, const b3Scalar& _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[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
+ void getSkewSymmetricMatrix(b3Vector3 * v0, b3Vector3 * v1, b3Vector3 * v2) const
{
-#if defined(B3_USE_SSE_IN_API) && defined (B3_USE_SSE)
+#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE)
- __m128 V = _mm_and_ps(mVec128, b3vFFF0fMask);
+ __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);
+ 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.);
+ 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)
+#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.));
+ setValue(b3Scalar(0.), b3Scalar(0.), b3Scalar(0.));
#endif
}
@@ -651,76 +640,76 @@ public:
return length2() < B3_EPSILON;
}
- B3_FORCE_INLINE void serialize(struct b3Vector3Data& dataOut) const;
+ B3_FORCE_INLINE void serialize(struct b3Vector3Data & dataOut) const;
- B3_FORCE_INLINE void deSerialize(const struct b3Vector3Data& dataIn);
+ B3_FORCE_INLINE void deSerialize(const struct b3Vector3Data& dataIn);
- B3_FORCE_INLINE void serializeFloat(struct b3Vector3FloatData& dataOut) const;
+ B3_FORCE_INLINE void serializeFloat(struct b3Vector3FloatData & dataOut) const;
- B3_FORCE_INLINE void deSerializeFloat(const struct b3Vector3FloatData& dataIn);
+ B3_FORCE_INLINE void deSerializeFloat(const struct b3Vector3FloatData& dataIn);
- B3_FORCE_INLINE void serializeDouble(struct b3Vector3DoubleData& dataOut) const;
+ B3_FORCE_INLINE void serializeDouble(struct b3Vector3DoubleData & dataOut) const;
- B3_FORCE_INLINE void deSerializeDouble(const struct b3Vector3DoubleData& dataIn);
+ B3_FORCE_INLINE void deSerializeDouble(const struct b3Vector3DoubleData& dataIn);
- /**@brief returns index of maximum dot product between this and vectors in array[]
+ /**@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;
+ 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[]
+ /**@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);
+ 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) );
+ 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));
+ 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)
+#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]);
+ 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
}
@@ -728,15 +717,15 @@ operator+(const b3Vector3& v1, const b3Vector3& v2)
B3_FORCE_INLINE b3Vector3
operator*(const b3Vector3& v1, const b3Vector3& v2)
{
-#if defined(B3_USE_SSE_IN_API) && defined (B3_USE_SSE)
+#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]);
+ 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
}
@@ -744,7 +733,7 @@ operator*(const b3Vector3& v1, const b3Vector3& v2)
B3_FORCE_INLINE b3Vector3
operator-(const b3Vector3& v1, const b3Vector3& v2)
{
-#if (defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE))
+#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);
@@ -754,9 +743,9 @@ operator-(const b3Vector3& v1, const b3Vector3& v2)
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]);
+ 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
}
@@ -764,7 +753,7 @@ operator-(const b3Vector3& v1, const b3Vector3& v2)
B3_FORCE_INLINE b3Vector3
operator-(const b3Vector3& v)
{
-#if (defined(B3_USE_SSE_IN_API) && defined (B3_USE_SSE))
+#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)
@@ -778,9 +767,9 @@ operator-(const b3Vector3& v)
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)
+#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);
@@ -802,7 +791,7 @@ B3_FORCE_INLINE b3Vector3
operator/(const b3Vector3& v, const b3Scalar& s)
{
b3FullAssert(s != b3Scalar(0.0));
-#if 0 //defined(B3_USE_SSE_IN_API)
+#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);
@@ -818,7 +807,7 @@ operator/(const b3Vector3& v, const b3Scalar& s)
B3_FORCE_INLINE b3Vector3
operator/(const b3Vector3& v1, const b3Vector3& v2)
{
-#if (defined(B3_USE_SSE_IN_API)&& defined (B3_USE_SSE))
+#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);
@@ -828,19 +817,19 @@ operator/(const b3Vector3& v1, const b3Vector3& v2)
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
+ 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]);
+ 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
}
@@ -851,7 +840,6 @@ 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)
@@ -859,7 +847,6 @@ 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)
@@ -897,8 +884,6 @@ 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();
@@ -911,7 +896,7 @@ B3_FORCE_INLINE b3Scalar b3Vector3::distance(const b3Vector3& v) const
B3_FORCE_INLINE b3Vector3 b3Vector3::normalized() const
{
-#if defined(B3_USE_SSE_IN_API) && defined (B3_USE_SSE)
+#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE)
b3Vector3 norm = *this;
return norm.normalize();
@@ -920,143 +905,136 @@ B3_FORCE_INLINE b3Vector3 b3Vector3::normalized() const
#endif
}
-B3_FORCE_INLINE b3Vector3 b3Vector3::rotate( const b3Vector3& wAxis, const b3Scalar _angle ) const
+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)
+#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;
+ __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 );
+ 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 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)
+ __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)
+ 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)
+ vcos = b3_pshufd_ps(vcos, 0x80); // (S S S 0)
- vsin = vsin * C;
+ vsin = vsin * C;
O = O * wAxis.mVec128;
__m128 X = mVec128 - O;
- O = O + vsin;
+ O = O + vsin;
vcos = vcos * X;
O = O + vcos;
return b3MakeVector3(O);
#else
- b3Vector3 o = wAxis * wAxis.dot( *this );
+ b3Vector3 o = wAxis * wAxis.dot(*this);
b3Vector3 _x = *this - o;
b3Vector3 _y;
- _y = wAxis.cross( *this );
+ _y = wAxis.cross(*this);
- return ( o + _x * b3Cos( _angle ) + _y * b3Sin( _angle ) );
+ return (o + _x * b3Cos(_angle) + _y * b3Sin(_angle));
#endif
}
-B3_FORCE_INLINE long b3Vector3::maxDot( const b3Vector3 *array, long array_count, b3Scalar &dotOut ) const
+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 )
+#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)
+#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 );
+ 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
+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 );
+#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
-}
-
-
-class b3Vector4 : public b3Vector3
-{
-public:
+ 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)
+#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));
@@ -1069,11 +1047,9 @@ public:
#endif
}
+ b3Scalar getW() const { return m_floats[3]; }
- b3Scalar getW() const { return m_floats[3];}
-
-
- B3_FORCE_INLINE int maxAxis4() const
+ B3_FORCE_INLINE int maxAxis4() const
{
int maxIndex = -1;
b3Scalar maxVal = b3Scalar(-B3_LARGE_FLOAT);
@@ -1090,7 +1066,7 @@ public:
if (m_floats[2] > maxVal)
{
maxIndex = 2;
- maxVal =m_floats[2];
+ maxVal = m_floats[2];
}
if (m_floats[3] > maxVal)
{
@@ -1100,7 +1076,6 @@ public:
return maxIndex;
}
-
B3_FORCE_INLINE int minAxis4() const
{
int minIndex = -1;
@@ -1118,7 +1093,7 @@ public:
if (m_floats[2] < minVal)
{
minIndex = 2;
- minVal =m_floats[2];
+ minVal = m_floats[2];
}
if (m_floats[3] < minVal)
{
@@ -1129,216 +1104,200 @@ public:
return minIndex;
}
-
B3_FORCE_INLINE int closestAxis4() const
{
return absolute4().maxAxis4();
}
-
-
-
- /**@brief Set x,y,z and zero w
+ /**@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
+ /* void getValue(b3Scalar *m) const
{
m[0] = m_floats[0];
m[1] = m_floats[1];
m[2] =m_floats[2];
}
*/
-/**@brief Set the values
+ /**@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;
- }
-
-
+ 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)
+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;
+#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];
+ 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;
+ 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
+ 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)
+B3_FORCE_INLINE void b3SwapVector3Endian(const b3Vector3& sourceVec, b3Vector3& destVec)
{
- for (int i=0;i<4;i++)
+ for (int i = 0; i < 4; i++)
{
- b3SwapScalarEndian(sourceVec[i],destVec[i]);
+ b3SwapScalarEndian(sourceVec[i], destVec[i]);
}
-
}
///b3UnSwapVector3Endian swaps vector endianness, useful for network and cross-platform serialization
-B3_FORCE_INLINE void b3UnSwapVector3Endian(b3Vector3& vector)
+B3_FORCE_INLINE void b3UnSwapVector3Endian(b3Vector3& vector)
{
-
- b3Vector3 swappedVec;
- for (int i=0;i<4;i++)
+ b3Vector3 swappedVec;
+ for (int i = 0; i < 4; i++)
{
- b3SwapScalarEndian(vector[i],swappedVec[i]);
+ b3SwapScalarEndian(vector[i], swappedVec[i]);
}
vector = swappedVec;
}
template <class T>
-B3_FORCE_INLINE void b3PlaneSpace1 (const T& n, T& p, T& q)
+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;
- }
+ 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
+struct b3Vector3FloatData
{
- float m_floats[4];
+ float m_floats[4];
};
-struct b3Vector3DoubleData
+struct b3Vector3DoubleData
{
- double m_floats[4];
-
+ double m_floats[4];
};
-B3_FORCE_INLINE void b3Vector3::serializeFloat(struct b3Vector3FloatData& dataOut) const
+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++)
+ 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)
+B3_FORCE_INLINE void b3Vector3::deSerializeFloat(const struct b3Vector3FloatData& dataIn)
{
- for (int i=0;i<4;i++)
+ 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
+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++)
+ 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)
+B3_FORCE_INLINE void b3Vector3::deSerializeDouble(const struct b3Vector3DoubleData& dataIn)
{
- for (int i=0;i<4;i++)
+ 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
+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++)
+ for (int i = 0; i < 4; i++)
dataOut.m_floats[i] = m_floats[i];
}
-B3_FORCE_INLINE void b3Vector3::deSerialize(const struct b3Vector3Data& dataIn)
+B3_FORCE_INLINE void b3Vector3::deSerialize(const struct b3Vector3Data& dataIn)
{
- for (int i=0;i<4;i++)
+ for (int i = 0; i < 4; i++)
m_floats[i] = dataIn.m_floats[i];
}
-
-
-
-inline b3Vector3 b3MakeVector3(b3Scalar x,b3Scalar y,b3Scalar z)
+inline b3Vector3 b3MakeVector3(b3Scalar x, b3Scalar y, b3Scalar z)
{
- b3Vector3 tmp;
- tmp.setValue(x,y,z);
+ b3Vector3 tmp;
+ tmp.setValue(x, y, z);
return tmp;
}
-inline b3Vector3 b3MakeVector3(b3Scalar x,b3Scalar y,b3Scalar z, b3Scalar w)
+inline b3Vector3 b3MakeVector3(b3Scalar x, b3Scalar y, b3Scalar z, b3Scalar w)
{
- b3Vector3 tmp;
- tmp.setValue(x,y,z);
+ b3Vector3 tmp;
+ tmp.setValue(x, y, z);
tmp.w = w;
return tmp;
}
-inline b3Vector4 b3MakeVector4(b3Scalar x,b3Scalar y,b3Scalar z,b3Scalar w)
+inline b3Vector4 b3MakeVector4(b3Scalar x, b3Scalar y, b3Scalar z, b3Scalar w)
{
- b3Vector4 tmp;
- tmp.setValue(x,y,z,w);
+ b3Vector4 tmp;
+ tmp.setValue(x, y, z, w);
return tmp;
}
-#if defined(B3_USE_SSE_IN_API) && defined (B3_USE_SSE)
+#if defined(B3_USE_SSE_IN_API) && defined(B3_USE_SSE)
-inline b3Vector3 b3MakeVector3( b3SimdFloat4 v)
+inline b3Vector3 b3MakeVector3(b3SimdFloat4 v)
{
- b3Vector3 tmp;
- tmp.set128(v);
- return tmp;
+ b3Vector3 tmp;
+ tmp.set128(v);
+ return tmp;
}
inline b3Vector4 b3MakeVector4(b3SimdFloat4 vec)
{
- b3Vector4 tmp;
+ b3Vector4 tmp;
tmp.set128(vec);
return tmp;
}
#endif
-
-#endif //B3_VECTOR3_H
+#endif //B3_VECTOR3_H
diff --git a/thirdparty/bullet/Bullet3Common/shared/b3Float4.h b/thirdparty/bullet/Bullet3Common/shared/b3Float4.h
index 5e4b95bcee..d8a9f47411 100644
--- a/thirdparty/bullet/Bullet3Common/shared/b3Float4.h
+++ b/thirdparty/bullet/Bullet3Common/shared/b3Float4.h
@@ -4,94 +4,87 @@
#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;
- }
+#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)
+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
-#endif
+#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)
+ 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 )
+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)
+ 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;
+ *dotOut = maxDot;
+ return ptIndex;
}
-
-
-#endif //B3_FLOAT4_H
+#endif //B3_FLOAT4_H
diff --git a/thirdparty/bullet/Bullet3Common/shared/b3Int2.h b/thirdparty/bullet/Bullet3Common/shared/b3Int2.h
index f1d01f81a5..7b84de4436 100644
--- a/thirdparty/bullet/Bullet3Common/shared/b3Int2.h
+++ b/thirdparty/bullet/Bullet3Common/shared/b3Int2.h
@@ -20,11 +20,10 @@ subject to the following restrictions:
struct b3UnsignedInt2
{
- union
- {
+ union {
struct
{
- unsigned int x,y;
+ unsigned int x, y;
};
struct
{
@@ -35,11 +34,10 @@ struct b3UnsignedInt2
struct b3Int2
{
- union
- {
+ union {
struct
{
- int x,y;
+ int x, y;
};
struct
{
@@ -51,7 +49,8 @@ struct b3Int2
inline b3Int2 b3MakeInt2(int x, int y)
{
b3Int2 v;
- v.s[0] = x; v.s[1] = y;
+ v.s[0] = x;
+ v.s[1] = y;
return v;
}
#else
@@ -60,5 +59,5 @@ inline b3Int2 b3MakeInt2(int x, int y)
#define b3Int2 int2
#define b3MakeInt2 (int2)
-#endif //__cplusplus
+#endif //__cplusplus
#endif \ No newline at end of file
diff --git a/thirdparty/bullet/Bullet3Common/shared/b3Int4.h b/thirdparty/bullet/Bullet3Common/shared/b3Int4.h
index aa02d6beef..f6a1754245 100644
--- a/thirdparty/bullet/Bullet3Common/shared/b3Int4.h
+++ b/thirdparty/bullet/Bullet3Common/shared/b3Int4.h
@@ -5,16 +5,15 @@
#include "Bullet3Common/b3Scalar.h"
-
-B3_ATTRIBUTE_ALIGNED16(struct) b3UnsignedInt4
+B3_ATTRIBUTE_ALIGNED16(struct)
+b3UnsignedInt4
{
B3_DECLARE_ALIGNED_ALLOCATOR();
- union
- {
+ union {
struct
{
- unsigned int x,y,z,w;
+ unsigned int x, y, z, w;
};
struct
{
@@ -23,15 +22,15 @@ B3_ATTRIBUTE_ALIGNED16(struct) b3UnsignedInt4
};
};
-B3_ATTRIBUTE_ALIGNED16(struct) b3Int4
+B3_ATTRIBUTE_ALIGNED16(struct)
+b3Int4
{
B3_DECLARE_ALIGNED_ALLOCATOR();
- union
- {
+ union {
struct
{
- int x,y,z,w;
+ int x, y, z, w;
};
struct
{
@@ -43,26 +42,30 @@ B3_ATTRIBUTE_ALIGNED16(struct) b3Int4
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;
+ 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;
+ 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 //__cplusplus
-
-#endif //B3_INT4_H
+#endif //B3_INT4_H
diff --git a/thirdparty/bullet/Bullet3Common/shared/b3Mat3x3.h b/thirdparty/bullet/Bullet3Common/shared/b3Mat3x3.h
index 7b1fef32f8..ce6482b5a6 100644
--- a/thirdparty/bullet/Bullet3Common/shared/b3Mat3x3.h
+++ b/thirdparty/bullet/Bullet3Common/shared/b3Mat3x3.h
@@ -4,7 +4,6 @@
#include "Bullet3Common/shared/b3Quat.h"
-
#ifdef __cplusplus
#include "Bullet3Common/b3Matrix3x3.h"
@@ -22,43 +21,41 @@ inline b3Mat3x3 b3AbsoluteMat3x3(b3Mat3x3ConstArg mat)
return mat.absolute();
}
-#define b3GetRow(m,row) m.getRow(row)
+#define b3GetRow(m, row) m.getRow(row)
-__inline
-b3Float4 mtMul3(b3Float4ConstArg a, b3Mat3x3ConstArg b)
+__inline b3Float4 mtMul3(b3Float4ConstArg a, b3Mat3x3ConstArg b)
{
- return b*a;
+ return b * a;
}
-
#else
typedef struct
{
b3Float4 m_row[3];
-}b3Mat3x3;
+} b3Mat3x3;
#define b3Mat3x3ConstArg const b3Mat3x3
-#define b3GetRow(m,row) (m.m_row[row])
+#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);
+ 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].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].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].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;
@@ -73,27 +70,19 @@ inline b3Mat3x3 b3AbsoluteMat3x3(b3Mat3x3ConstArg matIn)
return out;
}
+__inline b3Mat3x3 mtZero();
-__inline
-b3Mat3x3 mtZero();
-
-__inline
-b3Mat3x3 mtIdentity();
+__inline b3Mat3x3 mtIdentity();
-__inline
-b3Mat3x3 mtTranspose(b3Mat3x3 m);
+__inline b3Mat3x3 mtTranspose(b3Mat3x3 m);
-__inline
-b3Mat3x3 mtMul(b3Mat3x3 a, b3Mat3x3 b);
+__inline b3Mat3x3 mtMul(b3Mat3x3 a, b3Mat3x3 b);
-__inline
-b3Float4 mtMul1(b3Mat3x3 a, b3Float4 b);
+__inline b3Float4 mtMul1(b3Mat3x3 a, b3Float4 b);
-__inline
-b3Float4 mtMul3(b3Float4 a, b3Mat3x3 b);
+__inline b3Float4 mtMul3(b3Float4 a, b3Mat3x3 b);
-__inline
-b3Mat3x3 mtZero()
+__inline b3Mat3x3 mtZero()
{
b3Mat3x3 m;
m.m_row[0] = (b3Float4)(0.f);
@@ -102,18 +91,16 @@ b3Mat3x3 mtZero()
return m;
}
-__inline
-b3Mat3x3 mtIdentity()
+__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);
+ 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)
+__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);
@@ -122,58 +109,49 @@ b3Mat3x3 mtTranspose(b3Mat3x3 m)
return out;
}
-__inline
-b3Mat3x3 mtMul(b3Mat3x3 a, b3Mat3x3 b)
+__inline b3Mat3x3 mtMul(b3Mat3x3 a, b3Mat3x3 b)
{
b3Mat3x3 transB;
- transB = mtTranspose( b );
+ 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++)
+ 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]);
+ // 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)
+__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.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)
+__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 );
+ ans.x = b3Dot3F4(a, colx);
+ ans.y = b3Dot3F4(a, coly);
+ ans.z = b3Dot3F4(a, colz);
return ans;
}
-
#endif
-
-
-
-
-
-#endif //B3_MAT3x3_H
+#endif //B3_MAT3x3_H
diff --git a/thirdparty/bullet/Bullet3Common/shared/b3PlatformDefinitions.h b/thirdparty/bullet/Bullet3Common/shared/b3PlatformDefinitions.h
index 1c133fb088..b72bee9310 100644
--- a/thirdparty/bullet/Bullet3Common/shared/b3PlatformDefinitions.h
+++ b/thirdparty/bullet/Bullet3Common/shared/b3PlatformDefinitions.h
@@ -8,18 +8,18 @@ struct MyTest
#ifdef __cplusplus
//#define b3ConstArray(a) const b3AlignedObjectArray<a>&
-#define b3ConstArray(a) const a*
+#define b3ConstArray(a) const a *
#define b3AtomicInc(a) ((*a)++)
-inline int b3AtomicAdd (volatile int *p, int val)
+inline int b3AtomicAdd(volatile int *p, int val)
{
int oldValue = *p;
- int newValue = oldValue+val;
+ int newValue = oldValue + val;
*p = newValue;
return oldValue;
}
-#define __global
+#define __global
#define B3_STATIC static
#else
@@ -27,7 +27,7 @@ inline int b3AtomicAdd (volatile int *p, int val)
#define B3_LARGE_FLOAT 1e18f
#define B3_INFINITY 1e18f
#define b3Assert(a)
-#define b3ConstArray(a) __global const a*
+#define b3ConstArray(a) __global const a *
#define b3AtomicInc atomic_inc
#define b3AtomicAdd atomic_add
#define b3Fabs fabs
diff --git a/thirdparty/bullet/Bullet3Common/shared/b3Quat.h b/thirdparty/bullet/Bullet3Common/shared/b3Quat.h
index f262d5e08f..940610c77b 100644
--- a/thirdparty/bullet/Bullet3Common/shared/b3Quat.h
+++ b/thirdparty/bullet/Bullet3Common/shared/b3Quat.h
@@ -5,35 +5,34 @@
#include "Bullet3Common/shared/b3Float4.h"
#ifdef __cplusplus
- #include "Bullet3Common/b3Quaternion.h"
- #include "Bullet3Common/b3Transform.h"
+#include "Bullet3Common/b3Quaternion.h"
+#include "Bullet3Common/b3Transform.h"
- #define b3Quat b3Quaternion
- #define b3QuatConstArg const b3Quaternion&
- inline b3Quat b3QuatInverse(b3QuatConstArg orn)
- {
- return orn.inverse();
- }
+#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);
- }
+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
-
-
+typedef float4 b3Quat;
+#define b3QuatConstArg const b3Quat
+
inline float4 b3FastNormalize4(float4 v)
{
- v = (float4)(v.xyz,0.f);
+ 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);
@@ -43,20 +42,20 @@ 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);
+ 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;
+ q = in;
//return b3FastNormalize4(in);
float len = native_sqrt(dot(q, q));
- if(len > 0.f)
+ if (len > 0.f)
{
q *= 1.f / len;
}
@@ -69,15 +68,13 @@ inline b3Quat b3QuatNormalized(b3QuatConstArg in)
}
inline float4 b3QuatRotate(b3QuatConstArg q, b3QuatConstArg vec)
{
- b3Quat qInv = b3QuatInvert( q );
+ b3Quat qInv = b3QuatInvert(q);
float4 vcpy = vec;
vcpy.w = 0.f;
- float4 out = b3QuatMul(b3QuatMul(q,vcpy),qInv);
+ float4 out = b3QuatMul(b3QuatMul(q, vcpy), qInv);
return out;
}
-
-
inline b3Quat b3QuatInverse(b3QuatConstArg q)
{
return (b3Quat)(-q.xyz, q.w);
@@ -90,14 +87,14 @@ inline b3Quat b3QuatInvert(b3QuatConstArg q)
inline float4 b3QuatInvRotate(b3QuatConstArg q, b3QuatConstArg vec)
{
- return b3QuatRotate( b3QuatInvert( q ), vec );
+ return b3QuatRotate(b3QuatInvert(q), vec);
}
-inline b3Float4 b3TransformPoint(b3Float4ConstArg point, b3Float4ConstArg translation, b3QuatConstArg orientation)
+inline b3Float4 b3TransformPoint(b3Float4ConstArg point, b3Float4ConstArg translation, b3QuatConstArg orientation)
{
- return b3QuatRotate( orientation, point ) + (translation);
+ return b3QuatRotate(orientation, point) + (translation);
}
-
-#endif
-#endif //B3_QUAT_H
+#endif
+
+#endif //B3_QUAT_H
diff --git a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3ContactSolverInfo.h b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3ContactSolverInfo.h
index 7a12257b33..049c9116fd 100644
--- a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3ContactSolverInfo.h
+++ b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3ContactSolverInfo.h
@@ -18,7 +18,7 @@ subject to the following restrictions:
#include "Bullet3Common/b3Scalar.h"
-enum b3SolverMode
+enum b3SolverMode
{
B3_SOLVER_RANDMIZE_ORDER = 1,
B3_SOLVER_FRICTION_SEPARATE = 2,
@@ -34,45 +34,38 @@ enum b3SolverMode
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;
-
-
+ 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_timeStep = b3Scalar(1.f / 60.f);
m_restitution = b3Scalar(0.);
m_maxErrorReduction = b3Scalar(20.);
m_numIterations = 10;
@@ -84,76 +77,73 @@ struct b3ContactSolverInfo : public b3ContactSolverInfoData
m_splitImpulsePenetrationThreshold = -.04f;
m_splitImpulseTurnErp = 0.1f;
m_linearSlop = b3Scalar(0.0);
- m_warmstartingFactor=b3Scalar(0.85);
+ 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.
+ 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];
-
+ 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];
+ 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
+#endif //B3_CONTACT_SOLVER_INFO
diff --git a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3FixedConstraint.cpp b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3FixedConstraint.cpp
index 5e11e74935..ace4b18388 100644
--- a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3FixedConstraint.cpp
+++ b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3FixedConstraint.cpp
@@ -4,105 +4,100 @@
#include "Bullet3Common/b3TransformUtil.h"
#include <new>
-
-b3FixedConstraint::b3FixedConstraint(int rbA,int rbB, const b3Transform& frameInA,const b3Transform& frameInB)
-:b3TypedConstraint(B3_FIXED_CONSTRAINT_TYPE,rbA,rbB)
+b3FixedConstraint::b3FixedConstraint(int rbA, int rbB, const b3Transform& frameInA, const b3Transform& frameInB)
+ : b3TypedConstraint(B3_FIXED_CONSTRAINT_TYPE, rbA, rbB)
{
m_pivotInA = frameInA.getOrigin();
m_pivotInB = frameInB.getOrigin();
- m_relTargetAB = frameInA.getRotation()*frameInB.getRotation().inverse();
-
+ m_relTargetAB = frameInA.getRotation() * frameInB.getRotation().inverse();
}
-b3FixedConstraint::~b3FixedConstraint ()
+b3FixedConstraint::~b3FixedConstraint()
{
}
-
-void b3FixedConstraint::getInfo1 (b3ConstraintInfo1* info,const b3RigidBodyData* bodies)
+void b3FixedConstraint::getInfo1(b3ConstraintInfo1* info, const b3RigidBodyData* bodies)
{
info->m_numConstraintRows = 6;
info->nub = 6;
}
-void b3FixedConstraint::getInfo2 (b3ConstraintInfo2* info, const b3RigidBodyData* bodies)
+void b3FixedConstraint::getInfo2(b3ConstraintInfo2* info, const b3RigidBodyData* bodies)
{
//fix the 3 linear degrees of freedom
const b3Vector3& worldPosA = bodies[m_rbA].m_pos;
const b3Quaternion& worldOrnA = bodies[m_rbA].m_quat;
- const b3Vector3& worldPosB= bodies[m_rbB].m_pos;
+ const b3Vector3& worldPosB = bodies[m_rbB].m_pos;
const b3Quaternion& worldOrnB = bodies[m_rbB].m_quat;
info->m_J1linearAxis[0] = 1;
- info->m_J1linearAxis[info->rowskip+1] = 1;
- info->m_J1linearAxis[2*info->rowskip+2] = 1;
+ info->m_J1linearAxis[info->rowskip + 1] = 1;
+ info->m_J1linearAxis[2 * info->rowskip + 2] = 1;
- b3Vector3 a1 = b3QuatRotate(worldOrnA,m_pivotInA);
+ b3Vector3 a1 = b3QuatRotate(worldOrnA, m_pivotInA);
{
b3Vector3* angular0 = (b3Vector3*)(info->m_J1angularAxis);
- b3Vector3* angular1 = (b3Vector3*)(info->m_J1angularAxis+info->rowskip);
- b3Vector3* angular2 = (b3Vector3*)(info->m_J1angularAxis+2*info->rowskip);
+ b3Vector3* angular1 = (b3Vector3*)(info->m_J1angularAxis + info->rowskip);
+ b3Vector3* angular2 = (b3Vector3*)(info->m_J1angularAxis + 2 * info->rowskip);
b3Vector3 a1neg = -a1;
- a1neg.getSkewSymmetricMatrix(angular0,angular1,angular2);
+ a1neg.getSkewSymmetricMatrix(angular0, angular1, angular2);
}
-
+
if (info->m_J2linearAxis)
{
info->m_J2linearAxis[0] = -1;
- info->m_J2linearAxis[info->rowskip+1] = -1;
- info->m_J2linearAxis[2*info->rowskip+2] = -1;
+ info->m_J2linearAxis[info->rowskip + 1] = -1;
+ info->m_J2linearAxis[2 * info->rowskip + 2] = -1;
}
-
- b3Vector3 a2 = b3QuatRotate(worldOrnB,m_pivotInB);
-
+
+ b3Vector3 a2 = b3QuatRotate(worldOrnB, m_pivotInB);
+
{
- // b3Vector3 a2n = -a2;
+ // b3Vector3 a2n = -a2;
b3Vector3* angular0 = (b3Vector3*)(info->m_J2angularAxis);
- b3Vector3* angular1 = (b3Vector3*)(info->m_J2angularAxis+info->rowskip);
- b3Vector3* angular2 = (b3Vector3*)(info->m_J2angularAxis+2*info->rowskip);
- a2.getSkewSymmetricMatrix(angular0,angular1,angular2);
+ b3Vector3* angular1 = (b3Vector3*)(info->m_J2angularAxis + info->rowskip);
+ b3Vector3* angular2 = (b3Vector3*)(info->m_J2angularAxis + 2 * info->rowskip);
+ a2.getSkewSymmetricMatrix(angular0, angular1, angular2);
}
- // set right hand side for the linear dofs
+ // set right hand side for the linear dofs
b3Scalar k = info->fps * info->erp;
- b3Vector3 linearError = k*(a2+worldPosB-a1-worldPosA);
- int j;
- for (j=0; j<3; j++)
- {
- info->m_constraintError[j*info->rowskip] = linearError[j];
+ b3Vector3 linearError = k * (a2 + worldPosB - a1 - worldPosA);
+ int j;
+ for (j = 0; j < 3; j++)
+ {
+ info->m_constraintError[j * info->rowskip] = linearError[j];
//printf("info->m_constraintError[%d]=%f\n",j,info->m_constraintError[j]);
- }
+ }
- //fix the 3 angular degrees of freedom
+ //fix the 3 angular degrees of freedom
int start_row = 3;
int s = info->rowskip;
- int start_index = start_row * s;
+ int start_index = start_row * s;
- // 3 rows to make body rotations equal
+ // 3 rows to make body rotations equal
info->m_J1angularAxis[start_index] = 1;
- info->m_J1angularAxis[start_index + s + 1] = 1;
- info->m_J1angularAxis[start_index + s*2+2] = 1;
- if ( info->m_J2angularAxis)
- {
- info->m_J2angularAxis[start_index] = -1;
- info->m_J2angularAxis[start_index + s+1] = -1;
- info->m_J2angularAxis[start_index + s*2+2] = -1;
- }
-
+ info->m_J1angularAxis[start_index + s + 1] = 1;
+ info->m_J1angularAxis[start_index + s * 2 + 2] = 1;
+ if (info->m_J2angularAxis)
+ {
+ info->m_J2angularAxis[start_index] = -1;
+ info->m_J2angularAxis[start_index + s + 1] = -1;
+ info->m_J2angularAxis[start_index + s * 2 + 2] = -1;
+ }
- // set right hand side for the angular dofs
+ // set right hand side for the angular dofs
b3Vector3 diff;
b3Scalar angle;
- b3Quaternion qrelCur = worldOrnA *worldOrnB.inverse();
-
- b3TransformUtil::calculateDiffAxisAngleQuaternion(m_relTargetAB,qrelCur,diff,angle);
- diff*=-angle;
- for (j=0; j<3; j++)
- {
- info->m_constraintError[(3+j)*info->rowskip] = k * diff[j];
- }
+ b3Quaternion qrelCur = worldOrnA * worldOrnB.inverse();
+ b3TransformUtil::calculateDiffAxisAngleQuaternion(m_relTargetAB, qrelCur, diff, angle);
+ diff *= -angle;
+ for (j = 0; j < 3; j++)
+ {
+ info->m_constraintError[(3 + j) * info->rowskip] = k * diff[j];
+ }
} \ No newline at end of file
diff --git a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3FixedConstraint.h b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3FixedConstraint.h
index e884a82912..64809666e4 100644
--- a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3FixedConstraint.h
+++ b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3FixedConstraint.h
@@ -4,32 +4,31 @@
#include "b3TypedConstraint.h"
-B3_ATTRIBUTE_ALIGNED16(class) b3FixedConstraint : public b3TypedConstraint
+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);
-
+ b3FixedConstraint(int rbA, int rbB, const b3Transform& frameInA, const b3Transform& frameInB);
+
virtual ~b3FixedConstraint();
-
- virtual void getInfo1 (b3ConstraintInfo1* info,const b3RigidBodyData* bodies);
+ virtual void getInfo1(b3ConstraintInfo1 * info, const b3RigidBodyData* bodies);
- virtual void getInfo2 (b3ConstraintInfo2* info, const b3RigidBodyData* bodies);
+ virtual void getInfo2(b3ConstraintInfo2 * info, const b3RigidBodyData* bodies);
- virtual void setParam(int num, b3Scalar value, int axis = -1)
+ virtual void setParam(int num, b3Scalar value, int axis = -1)
{
b3Assert(0);
}
- virtual b3Scalar getParam(int num, int axis = -1) const
+ virtual b3Scalar getParam(int num, int axis = -1) const
{
b3Assert(0);
return 0.f;
}
-
};
-#endif //B3_FIXED_CONSTRAINT_H
+#endif //B3_FIXED_CONSTRAINT_H
diff --git a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3Generic6DofConstraint.cpp b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3Generic6DofConstraint.cpp
index 3ae2922e58..0d5bb2014b 100644
--- a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3Generic6DofConstraint.cpp
+++ b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3Generic6DofConstraint.cpp
@@ -26,69 +26,48 @@ http://gimpact.sf.net
#include "Bullet3Common/b3TransformUtil.h"
#include <new>
-
-
#define D6_USE_OBSOLETE_METHOD false
#define D6_USE_FRAME_OFFSET true
-
-
-
-
-
-b3Generic6DofConstraint::b3Generic6DofConstraint(int rbA,int rbB, const b3Transform& frameInA, const b3Transform& frameInB, bool useLinearReferenceFrameA, const b3RigidBodyData* bodies)
-: b3TypedConstraint(B3_D6_CONSTRAINT_TYPE, rbA, rbB)
-, m_frameInA(frameInA)
-, m_frameInB(frameInB),
-m_useLinearReferenceFrameA(useLinearReferenceFrameA),
-m_useOffsetForConstraintFrame(D6_USE_FRAME_OFFSET),
-m_flags(0)
+b3Generic6DofConstraint::b3Generic6DofConstraint(int rbA, int rbB, const b3Transform& frameInA, const b3Transform& frameInB, bool useLinearReferenceFrameA, const b3RigidBodyData* bodies)
+ : b3TypedConstraint(B3_D6_CONSTRAINT_TYPE, rbA, rbB), m_frameInA(frameInA), m_frameInB(frameInB), m_useLinearReferenceFrameA(useLinearReferenceFrameA), m_useOffsetForConstraintFrame(D6_USE_FRAME_OFFSET), m_flags(0)
{
calculateTransforms(bodies);
}
-
-
-
-
-
#define GENERIC_D6_DISABLE_WARMSTARTING 1
-
-
b3Scalar btGetMatrixElem(const b3Matrix3x3& mat, int index);
b3Scalar btGetMatrixElem(const b3Matrix3x3& mat, int index)
{
- int i = index%3;
- int j = index/3;
+ int i = index % 3;
+ int j = index / 3;
return mat[i][j];
}
-
-
///MatrixToEulerXYZ from http://www.geometrictools.com/LibFoundation/Mathematics/Wm4Matrix3.inl.html
-bool matrixToEulerXYZ(const b3Matrix3x3& mat,b3Vector3& xyz);
-bool matrixToEulerXYZ(const b3Matrix3x3& mat,b3Vector3& xyz)
+bool matrixToEulerXYZ(const b3Matrix3x3& mat, b3Vector3& xyz);
+bool matrixToEulerXYZ(const b3Matrix3x3& mat, b3Vector3& xyz)
{
// // rot = cy*cz -cy*sz sy
// // cz*sx*sy+cx*sz cx*cz-sx*sy*sz -cy*sx
// // -cx*cz*sy+sx*sz cz*sx+cx*sy*sz cx*cy
//
- b3Scalar fi = btGetMatrixElem(mat,2);
+ b3Scalar fi = btGetMatrixElem(mat, 2);
if (fi < b3Scalar(1.0f))
{
if (fi > b3Scalar(-1.0f))
{
- xyz[0] = b3Atan2(-btGetMatrixElem(mat,5),btGetMatrixElem(mat,8));
- xyz[1] = b3Asin(btGetMatrixElem(mat,2));
- xyz[2] = b3Atan2(-btGetMatrixElem(mat,1),btGetMatrixElem(mat,0));
+ xyz[0] = b3Atan2(-btGetMatrixElem(mat, 5), btGetMatrixElem(mat, 8));
+ xyz[1] = b3Asin(btGetMatrixElem(mat, 2));
+ xyz[2] = b3Atan2(-btGetMatrixElem(mat, 1), btGetMatrixElem(mat, 0));
return true;
}
else
{
// WARNING. Not unique. XA - ZA = -atan2(r10,r11)
- xyz[0] = -b3Atan2(btGetMatrixElem(mat,3),btGetMatrixElem(mat,4));
+ xyz[0] = -b3Atan2(btGetMatrixElem(mat, 3), btGetMatrixElem(mat, 4));
xyz[1] = -B3_HALF_PI;
xyz[2] = b3Scalar(0.0);
return false;
@@ -97,7 +76,7 @@ bool matrixToEulerXYZ(const b3Matrix3x3& mat,b3Vector3& xyz)
else
{
// WARNING. Not unique. XAngle + ZAngle = atan2(r10,r11)
- xyz[0] = b3Atan2(btGetMatrixElem(mat,3),btGetMatrixElem(mat,4));
+ xyz[0] = b3Atan2(btGetMatrixElem(mat, 3), btGetMatrixElem(mat, 4));
xyz[1] = B3_HALF_PI;
xyz[2] = 0.0;
}
@@ -108,85 +87,75 @@ bool matrixToEulerXYZ(const b3Matrix3x3& mat,b3Vector3& xyz)
int b3RotationalLimitMotor::testLimitValue(b3Scalar test_value)
{
- if(m_loLimit>m_hiLimit)
+ if (m_loLimit > m_hiLimit)
{
- m_currentLimit = 0;//Free from violation
+ m_currentLimit = 0; //Free from violation
return 0;
}
if (test_value < m_loLimit)
{
- m_currentLimit = 1;//low limit violation
- m_currentLimitError = test_value - m_loLimit;
- if(m_currentLimitError>B3_PI)
- m_currentLimitError-=B3_2_PI;
- else if(m_currentLimitError<-B3_PI)
- m_currentLimitError+=B3_2_PI;
+ m_currentLimit = 1; //low limit violation
+ m_currentLimitError = test_value - m_loLimit;
+ if (m_currentLimitError > B3_PI)
+ m_currentLimitError -= B3_2_PI;
+ else if (m_currentLimitError < -B3_PI)
+ m_currentLimitError += B3_2_PI;
return 1;
}
- else if (test_value> m_hiLimit)
+ else if (test_value > m_hiLimit)
{
- m_currentLimit = 2;//High limit violation
+ m_currentLimit = 2; //High limit violation
m_currentLimitError = test_value - m_hiLimit;
- if(m_currentLimitError>B3_PI)
- m_currentLimitError-=B3_2_PI;
- else if(m_currentLimitError<-B3_PI)
- m_currentLimitError+=B3_2_PI;
+ if (m_currentLimitError > B3_PI)
+ m_currentLimitError -= B3_2_PI;
+ else if (m_currentLimitError < -B3_PI)
+ m_currentLimitError += B3_2_PI;
return 2;
};
- m_currentLimit = 0;//Free from violation
+ m_currentLimit = 0; //Free from violation
return 0;
-
}
-
-
-
//////////////////////////// End b3RotationalLimitMotor ////////////////////////////////////
-
-
-
//////////////////////////// b3TranslationalLimitMotor ////////////////////////////////////
-
int b3TranslationalLimitMotor::testLimitValue(int limitIndex, b3Scalar test_value)
{
b3Scalar loLimit = m_lowerLimit[limitIndex];
b3Scalar hiLimit = m_upperLimit[limitIndex];
- if(loLimit > hiLimit)
+ if (loLimit > hiLimit)
{
- m_currentLimit[limitIndex] = 0;//Free from violation
+ m_currentLimit[limitIndex] = 0; //Free from violation
m_currentLimitError[limitIndex] = b3Scalar(0.f);
return 0;
}
if (test_value < loLimit)
{
- m_currentLimit[limitIndex] = 2;//low limit violation
- m_currentLimitError[limitIndex] = test_value - loLimit;
+ m_currentLimit[limitIndex] = 2; //low limit violation
+ m_currentLimitError[limitIndex] = test_value - loLimit;
return 2;
}
- else if (test_value> hiLimit)
+ else if (test_value > hiLimit)
{
- m_currentLimit[limitIndex] = 1;//High limit violation
+ m_currentLimit[limitIndex] = 1; //High limit violation
m_currentLimitError[limitIndex] = test_value - hiLimit;
return 1;
};
- m_currentLimit[limitIndex] = 0;//Free from violation
+ m_currentLimit[limitIndex] = 0; //Free from violation
m_currentLimitError[limitIndex] = b3Scalar(0.f);
return 0;
}
-
-
//////////////////////////// b3TranslationalLimitMotor ////////////////////////////////////
void b3Generic6DofConstraint::calculateAngleInfo()
{
- b3Matrix3x3 relative_frame = m_calculatedTransformA.getBasis().inverse()*m_calculatedTransformB.getBasis();
- matrixToEulerXYZ(relative_frame,m_calculatedAxisAngleDiff);
+ b3Matrix3x3 relative_frame = m_calculatedTransformA.getBasis().inverse() * m_calculatedTransformB.getBasis();
+ matrixToEulerXYZ(relative_frame, m_calculatedAxisAngleDiff);
// in euler angle mode we do not actually constrain the angular velocity
// along the axes axis[0] and axis[2] (although we do use axis[1]) :
//
@@ -211,12 +180,11 @@ void b3Generic6DofConstraint::calculateAngleInfo()
m_calculatedAxis[0].normalize();
m_calculatedAxis[1].normalize();
m_calculatedAxis[2].normalize();
-
}
static b3Transform getCenterOfMassTransform(const b3RigidBodyData& body)
{
- b3Transform tr(body.m_quat,body.m_pos);
+ b3Transform tr(body.m_quat, body.m_pos);
return tr;
}
@@ -226,26 +194,26 @@ void b3Generic6DofConstraint::calculateTransforms(const b3RigidBodyData* bodies)
b3Transform transB;
transA = getCenterOfMassTransform(bodies[m_rbA]);
transB = getCenterOfMassTransform(bodies[m_rbB]);
- calculateTransforms(transA,transB,bodies);
+ calculateTransforms(transA, transB, bodies);
}
-void b3Generic6DofConstraint::calculateTransforms(const b3Transform& transA,const b3Transform& transB,const b3RigidBodyData* bodies)
+void b3Generic6DofConstraint::calculateTransforms(const b3Transform& transA, const b3Transform& transB, const b3RigidBodyData* bodies)
{
m_calculatedTransformA = transA * m_frameInA;
m_calculatedTransformB = transB * m_frameInB;
calculateLinearInfo();
calculateAngleInfo();
- if(m_useOffsetForConstraintFrame)
- { // get weight factors depending on masses
+ if (m_useOffsetForConstraintFrame)
+ { // get weight factors depending on masses
b3Scalar miA = bodies[m_rbA].m_invMass;
b3Scalar miB = bodies[m_rbB].m_invMass;
m_hasStaticBody = (miA < B3_EPSILON) || (miB < B3_EPSILON);
b3Scalar miS = miA + miB;
- if(miS > b3Scalar(0.f))
+ if (miS > b3Scalar(0.f))
{
m_factA = miB / miS;
}
- else
+ else
{
m_factA = b3Scalar(0.5f);
}
@@ -253,12 +221,6 @@ void b3Generic6DofConstraint::calculateTransforms(const b3Transform& transA,cons
}
}
-
-
-
-
-
-
bool b3Generic6DofConstraint::testAngularLimitMotor(int axis_index)
{
b3Scalar angle = m_calculatedAxisAngleDiff[axis_index];
@@ -269,48 +231,43 @@ bool b3Generic6DofConstraint::testAngularLimitMotor(int axis_index)
return m_angularLimits[axis_index].needApplyTorques();
}
-
-
-
-void b3Generic6DofConstraint::getInfo1 (b3ConstraintInfo1* info,const b3RigidBodyData* bodies)
+void b3Generic6DofConstraint::getInfo1(b3ConstraintInfo1* info, const b3RigidBodyData* bodies)
{
//prepare constraint
- calculateTransforms(getCenterOfMassTransform(bodies[m_rbA]),getCenterOfMassTransform(bodies[m_rbB]),bodies);
+ calculateTransforms(getCenterOfMassTransform(bodies[m_rbA]), getCenterOfMassTransform(bodies[m_rbB]), bodies);
info->m_numConstraintRows = 0;
info->nub = 6;
int i;
//test linear limits
- for(i = 0; i < 3; i++)
+ for (i = 0; i < 3; i++)
{
- if(m_linearLimits.needApplyForce(i))
+ if (m_linearLimits.needApplyForce(i))
{
info->m_numConstraintRows++;
info->nub--;
}
}
//test angular limits
- for (i=0;i<3 ;i++ )
+ for (i = 0; i < 3; i++)
{
- if(testAngularLimitMotor(i))
+ if (testAngularLimitMotor(i))
{
info->m_numConstraintRows++;
info->nub--;
}
}
-// printf("info->m_numConstraintRows=%d\n",info->m_numConstraintRows);
+ // printf("info->m_numConstraintRows=%d\n",info->m_numConstraintRows);
}
-void b3Generic6DofConstraint::getInfo1NonVirtual (b3ConstraintInfo1* info,const b3RigidBodyData* bodies)
+void b3Generic6DofConstraint::getInfo1NonVirtual(b3ConstraintInfo1* info, const b3RigidBodyData* bodies)
{
//pre-allocate all 6
info->m_numConstraintRows = 6;
info->nub = 0;
}
-
-void b3Generic6DofConstraint::getInfo2 (b3ConstraintInfo2* info,const b3RigidBodyData* bodies)
+void b3Generic6DofConstraint::getInfo2(b3ConstraintInfo2* info, const b3RigidBodyData* bodies)
{
-
b3Transform transA = getCenterOfMassTransform(bodies[m_rbA]);
b3Transform transB = getCenterOfMassTransform(bodies[m_rbB]);
const b3Vector3& linVelA = bodies[m_rbA].m_linVel;
@@ -318,136 +275,124 @@ void b3Generic6DofConstraint::getInfo2 (b3ConstraintInfo2* info,const b3RigidBod
const b3Vector3& angVelA = bodies[m_rbA].m_angVel;
const b3Vector3& angVelB = bodies[m_rbB].m_angVel;
- if(m_useOffsetForConstraintFrame)
- { // for stability better to solve angular limits first
- int row = setAngularLimits(info, 0,transA,transB,linVelA,linVelB,angVelA,angVelB);
- setLinearLimits(info, row, transA,transB,linVelA,linVelB,angVelA,angVelB);
+ if (m_useOffsetForConstraintFrame)
+ { // for stability better to solve angular limits first
+ int row = setAngularLimits(info, 0, transA, transB, linVelA, linVelB, angVelA, angVelB);
+ setLinearLimits(info, row, transA, transB, linVelA, linVelB, angVelA, angVelB);
}
else
- { // leave old version for compatibility
- int row = setLinearLimits(info, 0, transA,transB,linVelA,linVelB,angVelA,angVelB);
- setAngularLimits(info, row,transA,transB,linVelA,linVelB,angVelA,angVelB);
+ { // leave old version for compatibility
+ int row = setLinearLimits(info, 0, transA, transB, linVelA, linVelB, angVelA, angVelB);
+ setAngularLimits(info, row, transA, transB, linVelA, linVelB, angVelA, angVelB);
}
-
}
-
-void b3Generic6DofConstraint::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 b3Generic6DofConstraint::getInfo2NonVirtual(b3ConstraintInfo2* info, const b3Transform& transA, const b3Transform& transB, const b3Vector3& linVelA, const b3Vector3& linVelB, const b3Vector3& angVelA, const b3Vector3& angVelB, const b3RigidBodyData* bodies)
{
-
//prepare constraint
- calculateTransforms(transA,transB,bodies);
+ calculateTransforms(transA, transB, bodies);
int i;
- for (i=0;i<3 ;i++ )
+ for (i = 0; i < 3; i++)
{
testAngularLimitMotor(i);
}
- if(m_useOffsetForConstraintFrame)
- { // for stability better to solve angular limits first
- int row = setAngularLimits(info, 0,transA,transB,linVelA,linVelB,angVelA,angVelB);
- setLinearLimits(info, row, transA,transB,linVelA,linVelB,angVelA,angVelB);
+ if (m_useOffsetForConstraintFrame)
+ { // for stability better to solve angular limits first
+ int row = setAngularLimits(info, 0, transA, transB, linVelA, linVelB, angVelA, angVelB);
+ setLinearLimits(info, row, transA, transB, linVelA, linVelB, angVelA, angVelB);
}
else
- { // leave old version for compatibility
- int row = setLinearLimits(info, 0, transA,transB,linVelA,linVelB,angVelA,angVelB);
- setAngularLimits(info, row,transA,transB,linVelA,linVelB,angVelA,angVelB);
+ { // leave old version for compatibility
+ int row = setLinearLimits(info, 0, transA, transB, linVelA, linVelB, angVelA, angVelB);
+ setAngularLimits(info, row, transA, transB, linVelA, linVelB, angVelA, angVelB);
}
}
-
-
-int b3Generic6DofConstraint::setLinearLimits(b3ConstraintInfo2* info, int row, const b3Transform& transA,const b3Transform& transB,const b3Vector3& linVelA,const b3Vector3& linVelB,const b3Vector3& angVelA,const b3Vector3& angVelB)
+int b3Generic6DofConstraint::setLinearLimits(b3ConstraintInfo2* info, int row, const b3Transform& transA, const b3Transform& transB, const b3Vector3& linVelA, const b3Vector3& linVelB, const b3Vector3& angVelA, const b3Vector3& angVelB)
{
-// int row = 0;
+ // int row = 0;
//solve linear limits
b3RotationalLimitMotor limot;
- for (int i=0;i<3 ;i++ )
+ for (int i = 0; i < 3; i++)
{
- if(m_linearLimits.needApplyForce(i))
- { // re-use rotational motor code
+ if (m_linearLimits.needApplyForce(i))
+ { // re-use rotational motor code
limot.m_bounce = b3Scalar(0.f);
limot.m_currentLimit = m_linearLimits.m_currentLimit[i];
limot.m_currentPosition = m_linearLimits.m_currentLinearDiff[i];
- limot.m_currentLimitError = m_linearLimits.m_currentLimitError[i];
- limot.m_damping = m_linearLimits.m_damping;
- limot.m_enableMotor = m_linearLimits.m_enableMotor[i];
- limot.m_hiLimit = m_linearLimits.m_upperLimit[i];
- limot.m_limitSoftness = m_linearLimits.m_limitSoftness;
- limot.m_loLimit = m_linearLimits.m_lowerLimit[i];
- limot.m_maxLimitForce = b3Scalar(0.f);
- limot.m_maxMotorForce = m_linearLimits.m_maxMotorForce[i];
- limot.m_targetVelocity = m_linearLimits.m_targetVelocity[i];
+ limot.m_currentLimitError = m_linearLimits.m_currentLimitError[i];
+ limot.m_damping = m_linearLimits.m_damping;
+ limot.m_enableMotor = m_linearLimits.m_enableMotor[i];
+ limot.m_hiLimit = m_linearLimits.m_upperLimit[i];
+ limot.m_limitSoftness = m_linearLimits.m_limitSoftness;
+ limot.m_loLimit = m_linearLimits.m_lowerLimit[i];
+ limot.m_maxLimitForce = b3Scalar(0.f);
+ limot.m_maxMotorForce = m_linearLimits.m_maxMotorForce[i];
+ limot.m_targetVelocity = m_linearLimits.m_targetVelocity[i];
b3Vector3 axis = m_calculatedTransformA.getBasis().getColumn(i);
int flags = m_flags >> (i * B3_6DOF_FLAGS_AXIS_SHIFT);
- limot.m_normalCFM = (flags & B3_6DOF_FLAGS_CFM_NORM) ? m_linearLimits.m_normalCFM[i] : info->cfm[0];
- limot.m_stopCFM = (flags & B3_6DOF_FLAGS_CFM_STOP) ? m_linearLimits.m_stopCFM[i] : info->cfm[0];
- limot.m_stopERP = (flags & B3_6DOF_FLAGS_ERP_STOP) ? m_linearLimits.m_stopERP[i] : info->erp;
- if(m_useOffsetForConstraintFrame)
+ limot.m_normalCFM = (flags & B3_6DOF_FLAGS_CFM_NORM) ? m_linearLimits.m_normalCFM[i] : info->cfm[0];
+ limot.m_stopCFM = (flags & B3_6DOF_FLAGS_CFM_STOP) ? m_linearLimits.m_stopCFM[i] : info->cfm[0];
+ limot.m_stopERP = (flags & B3_6DOF_FLAGS_ERP_STOP) ? m_linearLimits.m_stopERP[i] : info->erp;
+ if (m_useOffsetForConstraintFrame)
{
int indx1 = (i + 1) % 3;
int indx2 = (i + 2) % 3;
- int rotAllowed = 1; // rotations around orthos to current axis
- if(m_angularLimits[indx1].m_currentLimit && m_angularLimits[indx2].m_currentLimit)
+ int rotAllowed = 1; // rotations around orthos to current axis
+ if (m_angularLimits[indx1].m_currentLimit && m_angularLimits[indx2].m_currentLimit)
{
rotAllowed = 0;
}
- row += get_limit_motor_info2(&limot, transA,transB,linVelA,linVelB,angVelA,angVelB, info, row, axis, 0, rotAllowed);
+ row += get_limit_motor_info2(&limot, transA, transB, linVelA, linVelB, angVelA, angVelB, info, row, axis, 0, rotAllowed);
}
else
{
- row += get_limit_motor_info2(&limot, transA,transB,linVelA,linVelB,angVelA,angVelB, info, row, axis, 0);
+ row += get_limit_motor_info2(&limot, transA, transB, linVelA, linVelB, angVelA, angVelB, info, row, axis, 0);
}
}
}
return row;
}
-
-
-int b3Generic6DofConstraint::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 b3Generic6DofConstraint::setAngularLimits(b3ConstraintInfo2* info, int row_offset, const b3Transform& transA, const b3Transform& transB, const b3Vector3& linVelA, const b3Vector3& linVelB, const b3Vector3& angVelA, const b3Vector3& angVelB)
{
- b3Generic6DofConstraint * d6constraint = this;
+ b3Generic6DofConstraint* d6constraint = this;
int row = row_offset;
//solve angular limits
- for (int i=0;i<3 ;i++ )
+ for (int i = 0; i < 3; i++)
{
- if(d6constraint->getRotationalLimitMotor(i)->needApplyTorques())
+ if (d6constraint->getRotationalLimitMotor(i)->needApplyTorques())
{
b3Vector3 axis = d6constraint->getAxis(i);
int flags = m_flags >> ((i + 3) * B3_6DOF_FLAGS_AXIS_SHIFT);
- if(!(flags & B3_6DOF_FLAGS_CFM_NORM))
+ if (!(flags & B3_6DOF_FLAGS_CFM_NORM))
{
m_angularLimits[i].m_normalCFM = info->cfm[0];
}
- if(!(flags & B3_6DOF_FLAGS_CFM_STOP))
+ if (!(flags & B3_6DOF_FLAGS_CFM_STOP))
{
m_angularLimits[i].m_stopCFM = info->cfm[0];
}
- if(!(flags & B3_6DOF_FLAGS_ERP_STOP))
+ if (!(flags & B3_6DOF_FLAGS_ERP_STOP))
{
m_angularLimits[i].m_stopERP = info->erp;
}
row += get_limit_motor_info2(d6constraint->getRotationalLimitMotor(i),
- transA,transB,linVelA,linVelB,angVelA,angVelB, info,row,axis,1);
+ transA, transB, linVelA, linVelB, angVelA, angVelB, info, row, axis, 1);
}
}
return row;
}
-
-
-
-void b3Generic6DofConstraint::updateRHS(b3Scalar timeStep)
+void b3Generic6DofConstraint::updateRHS(b3Scalar timeStep)
{
(void)timeStep;
-
}
-
-void b3Generic6DofConstraint::setFrames(const b3Transform& frameA, const b3Transform& frameB,const b3RigidBodyData* bodies)
+void b3Generic6DofConstraint::setFrames(const b3Transform& frameA, const b3Transform& frameB, const b3RigidBodyData* bodies)
{
m_frameInA = frameA;
m_frameInB = frameB;
@@ -455,33 +400,27 @@ void b3Generic6DofConstraint::setFrames(const b3Transform& frameA, const b3Trans
calculateTransforms(bodies);
}
-
-
b3Vector3 b3Generic6DofConstraint::getAxis(int axis_index) const
{
return m_calculatedAxis[axis_index];
}
-
-b3Scalar b3Generic6DofConstraint::getRelativePivotPosition(int axisIndex) const
+b3Scalar b3Generic6DofConstraint::getRelativePivotPosition(int axisIndex) const
{
return m_calculatedLinearDiff[axisIndex];
}
-
b3Scalar b3Generic6DofConstraint::getAngle(int axisIndex) const
{
return m_calculatedAxisAngleDiff[axisIndex];
}
-
-
void b3Generic6DofConstraint::calcAnchorPos(const b3RigidBodyData* bodies)
{
b3Scalar imA = bodies[m_rbA].m_invMass;
b3Scalar imB = bodies[m_rbB].m_invMass;
b3Scalar weight;
- if(imB == b3Scalar(0.0))
+ if (imB == b3Scalar(0.0))
{
weight = b3Scalar(1.0);
}
@@ -495,47 +434,43 @@ void b3Generic6DofConstraint::calcAnchorPos(const b3RigidBodyData* bodies)
return;
}
-
-
void b3Generic6DofConstraint::calculateLinearInfo()
{
m_calculatedLinearDiff = m_calculatedTransformB.getOrigin() - m_calculatedTransformA.getOrigin();
m_calculatedLinearDiff = m_calculatedTransformA.getBasis().inverse() * m_calculatedLinearDiff;
- for(int i = 0; i < 3; i++)
+ for (int i = 0; i < 3; i++)
{
m_linearLimits.m_currentLinearDiff[i] = m_calculatedLinearDiff[i];
m_linearLimits.testLimitValue(i, m_calculatedLinearDiff[i]);
}
}
-
-
int b3Generic6DofConstraint::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)
+ 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)
{
- int srow = row * info->rowskip;
- bool powered = limot->m_enableMotor;
- int limit = limot->m_currentLimit;
- if (powered || limit)
- { // if the joint is powered, or has joint limits, add in the extra row
- b3Scalar *J1 = rotational ? info->m_J1angularAxis : info->m_J1linearAxis;
- b3Scalar *J2 = rotational ? info->m_J2angularAxis : info->m_J2linearAxis;
+ int srow = row * info->rowskip;
+ bool powered = limot->m_enableMotor;
+ int limit = limot->m_currentLimit;
+ if (powered || limit)
+ { // if the joint is powered, or has joint limits, add in the extra row
+ b3Scalar* J1 = rotational ? info->m_J1angularAxis : info->m_J1linearAxis;
+ b3Scalar* J2 = rotational ? info->m_J2angularAxis : info->m_J2linearAxis;
if (J1)
{
- J1[srow+0] = ax1[0];
- J1[srow+1] = ax1[1];
- J1[srow+2] = ax1[2];
+ J1[srow + 0] = ax1[0];
+ J1[srow + 1] = ax1[1];
+ J1[srow + 2] = ax1[2];
}
if (J2)
{
- J2[srow+0] = -ax1[0];
- J2[srow+1] = -ax1[1];
- J2[srow+2] = -ax1[2];
+ J2[srow + 0] = -ax1[0];
+ J2[srow + 1] = -ax1[1];
+ J2[srow + 2] = -ax1[2];
}
- if((!rotational))
- {
+ if ((!rotational))
+ {
if (m_useOffsetForConstraintFrame)
{
b3Vector3 tmpA, tmpB, relA, relB;
@@ -558,55 +493,56 @@ int b3Generic6DofConstraint::get_limit_motor_info2(
relB = orthoB - totalDist * m_factB;
tmpA = relA.cross(ax1);
tmpB = relB.cross(ax1);
- if(m_hasStaticBody && (!rotAllowed))
+ if (m_hasStaticBody && (!rotAllowed))
{
tmpA *= m_factA;
tmpB *= m_factB;
}
int i;
- for (i=0; i<3; i++) info->m_J1angularAxis[srow+i] = tmpA[i];
- for (i=0; i<3; i++) info->m_J2angularAxis[srow+i] = -tmpB[i];
- } else
+ for (i = 0; i < 3; i++) info->m_J1angularAxis[srow + i] = tmpA[i];
+ for (i = 0; i < 3; i++) info->m_J2angularAxis[srow + i] = -tmpB[i];
+ }
+ else
{
- b3Vector3 ltd; // Linear Torque Decoupling vector
+ b3Vector3 ltd; // Linear Torque Decoupling vector
b3Vector3 c = m_calculatedTransformB.getOrigin() - transA.getOrigin();
ltd = c.cross(ax1);
- info->m_J1angularAxis[srow+0] = ltd[0];
- info->m_J1angularAxis[srow+1] = ltd[1];
- info->m_J1angularAxis[srow+2] = ltd[2];
+ info->m_J1angularAxis[srow + 0] = ltd[0];
+ info->m_J1angularAxis[srow + 1] = ltd[1];
+ info->m_J1angularAxis[srow + 2] = ltd[2];
c = m_calculatedTransformB.getOrigin() - transB.getOrigin();
ltd = -c.cross(ax1);
- info->m_J2angularAxis[srow+0] = ltd[0];
- info->m_J2angularAxis[srow+1] = ltd[1];
- info->m_J2angularAxis[srow+2] = ltd[2];
+ info->m_J2angularAxis[srow + 0] = ltd[0];
+ info->m_J2angularAxis[srow + 1] = ltd[1];
+ info->m_J2angularAxis[srow + 2] = ltd[2];
}
- }
- // if we're limited low and high simultaneously, the joint motor is
- // ineffective
- if (limit && (limot->m_loLimit == limot->m_hiLimit)) powered = false;
- info->m_constraintError[srow] = b3Scalar(0.f);
- if (powered)
- {
+ }
+ // if we're limited low and high simultaneously, the joint motor is
+ // ineffective
+ if (limit && (limot->m_loLimit == limot->m_hiLimit)) powered = false;
+ info->m_constraintError[srow] = b3Scalar(0.f);
+ if (powered)
+ {
info->cfm[srow] = limot->m_normalCFM;
- if(!limit)
- {
+ if (!limit)
+ {
b3Scalar tag_vel = rotational ? limot->m_targetVelocity : -limot->m_targetVelocity;
- b3Scalar mot_fact = getMotorFactor( limot->m_currentPosition,
- limot->m_loLimit,
- limot->m_hiLimit,
- tag_vel,
- info->fps * limot->m_stopERP);
+ b3Scalar mot_fact = getMotorFactor(limot->m_currentPosition,
+ limot->m_loLimit,
+ limot->m_hiLimit,
+ tag_vel,
+ info->fps * limot->m_stopERP);
info->m_constraintError[srow] += mot_fact * limot->m_targetVelocity;
- info->m_lowerLimit[srow] = -limot->m_maxMotorForce / info->fps;
- info->m_upperLimit[srow] = limot->m_maxMotorForce / info->fps;
- }
- }
- if(limit)
- {
- b3Scalar k = info->fps * limot->m_stopERP;
- if(!rotational)
+ info->m_lowerLimit[srow] = -limot->m_maxMotorForce / info->fps;
+ info->m_upperLimit[srow] = limot->m_maxMotorForce / info->fps;
+ }
+ }
+ if (limit)
+ {
+ b3Scalar k = info->fps * limot->m_stopERP;
+ if (!rotational)
{
info->m_constraintError[srow] += k * limot->m_currentLimitError;
}
@@ -615,116 +551,112 @@ int b3Generic6DofConstraint::get_limit_motor_info2(
info->m_constraintError[srow] += -k * limot->m_currentLimitError;
}
info->cfm[srow] = limot->m_stopCFM;
- if (limot->m_loLimit == limot->m_hiLimit)
- { // limited low and high simultaneously
- info->m_lowerLimit[srow] = -B3_INFINITY;
- info->m_upperLimit[srow] = B3_INFINITY;
- }
- else
- {
- if (limit == 1)
- {
- info->m_lowerLimit[srow] = 0;
- info->m_upperLimit[srow] = B3_INFINITY;
- }
- else
- {
- info->m_lowerLimit[srow] = -B3_INFINITY;
- info->m_upperLimit[srow] = 0;
- }
- // deal with bounce
- if (limot->m_bounce > 0)
- {
- // calculate joint velocity
- b3Scalar vel;
- if (rotational)
- {
- vel = angVelA.dot(ax1);
-//make sure that if no body -> angVelB == zero vec
-// if (body1)
- vel -= angVelB.dot(ax1);
- }
- else
- {
- vel = linVelA.dot(ax1);
-//make sure that if no body -> angVelB == zero vec
-// if (body1)
- vel -= linVelB.dot(ax1);
- }
- // only apply bounce if the velocity is incoming, and if the
- // resulting c[] exceeds what we already have.
- if (limit == 1)
- {
- if (vel < 0)
- {
- b3Scalar newc = -limot->m_bounce* vel;
- if (newc > info->m_constraintError[srow])
+ if (limot->m_loLimit == limot->m_hiLimit)
+ { // limited low and high simultaneously
+ info->m_lowerLimit[srow] = -B3_INFINITY;
+ info->m_upperLimit[srow] = B3_INFINITY;
+ }
+ else
+ {
+ if (limit == 1)
+ {
+ info->m_lowerLimit[srow] = 0;
+ info->m_upperLimit[srow] = B3_INFINITY;
+ }
+ else
+ {
+ info->m_lowerLimit[srow] = -B3_INFINITY;
+ info->m_upperLimit[srow] = 0;
+ }
+ // deal with bounce
+ if (limot->m_bounce > 0)
+ {
+ // calculate joint velocity
+ b3Scalar vel;
+ if (rotational)
+ {
+ vel = angVelA.dot(ax1);
+ //make sure that if no body -> angVelB == zero vec
+ // if (body1)
+ vel -= angVelB.dot(ax1);
+ }
+ else
+ {
+ vel = linVelA.dot(ax1);
+ //make sure that if no body -> angVelB == zero vec
+ // if (body1)
+ vel -= linVelB.dot(ax1);
+ }
+ // only apply bounce if the velocity is incoming, and if the
+ // resulting c[] exceeds what we already have.
+ if (limit == 1)
+ {
+ if (vel < 0)
+ {
+ b3Scalar newc = -limot->m_bounce * vel;
+ if (newc > info->m_constraintError[srow])
info->m_constraintError[srow] = newc;
- }
- }
- else
- {
- if (vel > 0)
- {
- b3Scalar newc = -limot->m_bounce * vel;
- if (newc < info->m_constraintError[srow])
+ }
+ }
+ else
+ {
+ if (vel > 0)
+ {
+ b3Scalar newc = -limot->m_bounce * vel;
+ if (newc < info->m_constraintError[srow])
info->m_constraintError[srow] = newc;
- }
- }
- }
- }
- }
- return 1;
- }
- else return 0;
+ }
+ }
+ }
+ }
+ }
+ return 1;
+ }
+ else
+ return 0;
}
-
-
-
-
-
- ///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.
+///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.
void b3Generic6DofConstraint::setParam(int num, b3Scalar value, int axis)
{
- if((axis >= 0) && (axis < 3))
+ if ((axis >= 0) && (axis < 3))
{
- switch(num)
+ switch (num)
{
- case B3_CONSTRAINT_STOP_ERP :
+ case B3_CONSTRAINT_STOP_ERP:
m_linearLimits.m_stopERP[axis] = value;
m_flags |= B3_6DOF_FLAGS_ERP_STOP << (axis * B3_6DOF_FLAGS_AXIS_SHIFT);
break;
- case B3_CONSTRAINT_STOP_CFM :
+ case B3_CONSTRAINT_STOP_CFM:
m_linearLimits.m_stopCFM[axis] = value;
m_flags |= B3_6DOF_FLAGS_CFM_STOP << (axis * B3_6DOF_FLAGS_AXIS_SHIFT);
break;
- case B3_CONSTRAINT_CFM :
+ case B3_CONSTRAINT_CFM:
m_linearLimits.m_normalCFM[axis] = value;
m_flags |= B3_6DOF_FLAGS_CFM_NORM << (axis * B3_6DOF_FLAGS_AXIS_SHIFT);
break;
- default :
+ default:
b3AssertConstrParams(0);
}
}
- else if((axis >=3) && (axis < 6))
+ else if ((axis >= 3) && (axis < 6))
{
- switch(num)
+ switch (num)
{
- case B3_CONSTRAINT_STOP_ERP :
+ case B3_CONSTRAINT_STOP_ERP:
m_angularLimits[axis - 3].m_stopERP = value;
m_flags |= B3_6DOF_FLAGS_ERP_STOP << (axis * B3_6DOF_FLAGS_AXIS_SHIFT);
break;
- case B3_CONSTRAINT_STOP_CFM :
+ case B3_CONSTRAINT_STOP_CFM:
m_angularLimits[axis - 3].m_stopCFM = value;
m_flags |= B3_6DOF_FLAGS_CFM_STOP << (axis * B3_6DOF_FLAGS_AXIS_SHIFT);
break;
- case B3_CONSTRAINT_CFM :
+ case B3_CONSTRAINT_CFM:
m_angularLimits[axis - 3].m_normalCFM = value;
m_flags |= B3_6DOF_FLAGS_CFM_NORM << (axis * B3_6DOF_FLAGS_AXIS_SHIFT);
break;
- default :
+ default:
b3AssertConstrParams(0);
}
}
@@ -734,47 +666,47 @@ void b3Generic6DofConstraint::setParam(int num, b3Scalar value, int axis)
}
}
- ///return the local value of parameter
-b3Scalar b3Generic6DofConstraint::getParam(int num, int axis) const
+///return the local value of parameter
+b3Scalar b3Generic6DofConstraint::getParam(int num, int axis) const
{
b3Scalar retVal = 0;
- if((axis >= 0) && (axis < 3))
+ if ((axis >= 0) && (axis < 3))
{
- switch(num)
+ switch (num)
{
- case B3_CONSTRAINT_STOP_ERP :
+ case B3_CONSTRAINT_STOP_ERP:
b3AssertConstrParams(m_flags & (B3_6DOF_FLAGS_ERP_STOP << (axis * B3_6DOF_FLAGS_AXIS_SHIFT)));
retVal = m_linearLimits.m_stopERP[axis];
break;
- case B3_CONSTRAINT_STOP_CFM :
+ case B3_CONSTRAINT_STOP_CFM:
b3AssertConstrParams(m_flags & (B3_6DOF_FLAGS_CFM_STOP << (axis * B3_6DOF_FLAGS_AXIS_SHIFT)));
retVal = m_linearLimits.m_stopCFM[axis];
break;
- case B3_CONSTRAINT_CFM :
+ case B3_CONSTRAINT_CFM:
b3AssertConstrParams(m_flags & (B3_6DOF_FLAGS_CFM_NORM << (axis * B3_6DOF_FLAGS_AXIS_SHIFT)));
retVal = m_linearLimits.m_normalCFM[axis];
break;
- default :
+ default:
b3AssertConstrParams(0);
}
}
- else if((axis >=3) && (axis < 6))
+ else if ((axis >= 3) && (axis < 6))
{
- switch(num)
+ switch (num)
{
- case B3_CONSTRAINT_STOP_ERP :
+ case B3_CONSTRAINT_STOP_ERP:
b3AssertConstrParams(m_flags & (B3_6DOF_FLAGS_ERP_STOP << (axis * B3_6DOF_FLAGS_AXIS_SHIFT)));
retVal = m_angularLimits[axis - 3].m_stopERP;
break;
- case B3_CONSTRAINT_STOP_CFM :
+ case B3_CONSTRAINT_STOP_CFM:
b3AssertConstrParams(m_flags & (B3_6DOF_FLAGS_CFM_STOP << (axis * B3_6DOF_FLAGS_AXIS_SHIFT)));
retVal = m_angularLimits[axis - 3].m_stopCFM;
break;
- case B3_CONSTRAINT_CFM :
+ case B3_CONSTRAINT_CFM:
b3AssertConstrParams(m_flags & (B3_6DOF_FLAGS_CFM_NORM << (axis * B3_6DOF_FLAGS_AXIS_SHIFT)));
retVal = m_angularLimits[axis - 3].m_normalCFM;
break;
- default :
+ default:
b3AssertConstrParams(0);
}
}
@@ -785,23 +717,21 @@ b3Scalar b3Generic6DofConstraint::getParam(int num, int axis) const
return retVal;
}
-
-
-void b3Generic6DofConstraint::setAxis(const b3Vector3& axis1,const b3Vector3& axis2, const b3RigidBodyData* bodies)
+void b3Generic6DofConstraint::setAxis(const b3Vector3& axis1, const b3Vector3& axis2, const b3RigidBodyData* bodies)
{
b3Vector3 zAxis = axis1.normalized();
b3Vector3 yAxis = axis2.normalized();
- b3Vector3 xAxis = yAxis.cross(zAxis); // we want right coordinate system
-
+ b3Vector3 xAxis = yAxis.cross(zAxis); // we want right coordinate system
+
b3Transform frameInW;
frameInW.setIdentity();
- frameInW.getBasis().setValue( xAxis[0], yAxis[0], zAxis[0],
- xAxis[1], yAxis[1], zAxis[1],
- xAxis[2], yAxis[2], zAxis[2]);
-
+ frameInW.getBasis().setValue(xAxis[0], yAxis[0], zAxis[0],
+ xAxis[1], yAxis[1], zAxis[1],
+ xAxis[2], yAxis[2], zAxis[2]);
+
// now get constraint frame in local coordinate systems
m_frameInA = getCenterOfMassTransform(bodies[m_rbA]).inverse() * frameInW;
m_frameInB = getCenterOfMassTransform(bodies[m_rbB]).inverse() * frameInW;
-
+
calculateTransforms(bodies);
}
diff --git a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3Generic6DofConstraint.h b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3Generic6DofConstraint.h
index 169b1b94ad..1597809db3 100644
--- a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3Generic6DofConstraint.h
+++ b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3Generic6DofConstraint.h
@@ -23,7 +23,6 @@ email: projectileman@yahoo.com
http://gimpact.sf.net
*/
-
#ifndef B3_GENERIC_6DOF_CONSTRAINT_H
#define B3_GENERIC_6DOF_CONSTRAINT_H
@@ -33,88 +32,83 @@ http://gimpact.sf.net
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;
+ //! 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_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;
- }
-
-
+ 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;
- }
+ 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;
- }
+ bool needApplyTorques()
+ {
+ if (m_currentLimit == 0 && m_enableMotor == false) return false;
+ return true;
+ }
//! calculates error
/*!
@@ -123,104 +117,98 @@ public:
int testLimitValue(b3Scalar test_value);
//! apply the correction impulses for two bodies
- b3Scalar solveAngularLimits(b3Scalar timeStep,b3Vector3& axis, b3Scalar jacDiagABInv,b3RigidBodyData * body0, b3RigidBodyData * body1);
-
+ 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
+ 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);
+ 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_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;
+ 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_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++)
+ 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
+ //! 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;
- }
+ 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);
-
-
+ 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
@@ -229,8 +217,7 @@ enum b36DofFlags
B3_6DOF_FLAGS_CFM_STOP = 2,
B3_6DOF_FLAGS_ERP_STOP = 4
};
-#define B3_6DOF_FLAGS_AXIS_SHIFT 3 // bits per axis
-
+#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
/*!
@@ -268,240 +255,229 @@ This brings support for limit parameters and motors. </li>
</ul>
*/
-B3_ATTRIBUTE_ALIGNED16(class) b3Generic6DofConstraint : public b3TypedConstraint
+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
- //!@}
+ //!@{
+ 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
- //!@}
+ //! 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];
+ //!@{
+ 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
+ //! 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;
- bool m_useLinearReferenceFrameA;
- bool m_useOffsetForConstraintFrame;
-
- int m_flags;
+ b3Vector3 m_AnchorPos; // point betwen pivots of bodies A and B to solve linear axes
- //!@}
+ bool m_useLinearReferenceFrameA;
+ bool m_useOffsetForConstraintFrame;
- b3Generic6DofConstraint& operator=(b3Generic6DofConstraint& other)
- {
- b3Assert(0);
- (void) other;
- return *this;
- }
+ int m_flags;
+ //!@}
- 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);
+ b3Generic6DofConstraint& operator=(b3Generic6DofConstraint& other)
+ {
+ b3Assert(0);
+ (void)other;
+ return *this;
+ }
- int setLinearLimits(b3ConstraintInfo2 *info, int row, const b3Transform& transA,const b3Transform& transB,const b3Vector3& linVelA,const b3Vector3& linVelB,const b3Vector3& angVelA,const b3Vector3& angVelB);
+ 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();
-
-
+ void calculateAngleInfo();
public:
-
B3_DECLARE_ALIGNED_ALLOCATOR();
-
- b3Generic6DofConstraint(int rbA, int rbB, const b3Transform& frameInA, const b3Transform& frameInB ,bool useLinearReferenceFrameA,const b3RigidBodyData* bodies);
-
+
+ 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 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;
- }
+ const b3Transform& getCalculatedTransformA() const
+ {
+ return m_calculatedTransformA;
+ }
- //! Gets the global transform of the offset for body B
- /*!
+ //! 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;
- }
+ const b3Transform& getCalculatedTransformB() const
+ {
+ return m_calculatedTransformB;
+ }
- b3Transform & getFrameOffsetB()
- {
- return m_frameInB;
- }
+ const b3Transform& getFrameOffsetA() const
+ {
+ return m_frameInA;
+ }
+ const b3Transform& getFrameOffsetB() const
+ {
+ return m_frameInB;
+ }
+ b3Transform& getFrameOffsetA()
+ {
+ return m_frameInA;
+ }
- virtual void getInfo1 (b3ConstraintInfo1* info,const b3RigidBodyData* bodies);
+ b3Transform& getFrameOffsetB()
+ {
+ return m_frameInB;
+ }
- void getInfo1NonVirtual (b3ConstraintInfo1* info,const b3RigidBodyData* bodies);
+ virtual void getInfo1(b3ConstraintInfo1 * info, const b3RigidBodyData* bodies);
- virtual void getInfo2 (b3ConstraintInfo2* info,const b3RigidBodyData* bodies);
+ void getInfo1NonVirtual(b3ConstraintInfo1 * 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);
+ 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);
+ void updateRHS(b3Scalar timeStep);
//! Get the rotation axis in global coordinates
- b3Vector3 getAxis(int axis_index) const;
+ b3Vector3 getAxis(int axis_index) const;
- //! Get the relative Euler angle
- /*!
+ //! Get the relative Euler angle
+ /*!
\pre b3Generic6DofConstraint::calculateTransforms() must be called previously.
*/
- b3Scalar getAngle(int axis_index) const;
+ 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);
+ 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);
+ bool testAngularLimitMotor(int axis_index);
- void setLinearLowerLimit(const b3Vector3& linearLower)
- {
- m_linearLimits.m_lowerLimit = linearLower;
- }
+ void setLinearLowerLimit(const b3Vector3& linearLower)
+ {
+ m_linearLimits.m_lowerLimit = linearLower;
+ }
- void getLinearLowerLimit(b3Vector3& linearLower)
+ void getLinearLowerLimit(b3Vector3 & linearLower)
{
linearLower = m_linearLimits.m_lowerLimit;
}
- void setLinearUpperLimit(const b3Vector3& linearUpper)
+ void setLinearUpperLimit(const b3Vector3& linearUpper)
{
m_linearLimits.m_upperLimit = linearUpper;
}
- void getLinearUpperLimit(b3Vector3& linearUpper)
+ void getLinearUpperLimit(b3Vector3 & linearUpper)
{
linearUpper = m_linearLimits.m_upperLimit;
}
- void setAngularLowerLimit(const b3Vector3& angularLower)
- {
- for(int i = 0; i < 3; i++)
+ void setAngularLowerLimit(const b3Vector3& angularLower)
+ {
+ for (int i = 0; i < 3; i++)
m_angularLimits[i].m_loLimit = b3NormalizeAngle(angularLower[i]);
- }
+ }
- void getAngularLowerLimit(b3Vector3& angularLower)
+ void getAngularLowerLimit(b3Vector3 & angularLower)
{
- for(int i = 0; i < 3; i++)
+ 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++)
+ void setAngularUpperLimit(const b3Vector3& angularUpper)
+ {
+ for (int i = 0; i < 3; i++)
m_angularLimits[i].m_hiLimit = b3NormalizeAngle(angularUpper[i]);
- }
+ }
- void getAngularUpperLimit(b3Vector3& angularUpper)
+ void getAngularUpperLimit(b3Vector3 & angularUpper)
{
- for(int i = 0; i < 3; i++)
+ 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
- {
+ 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;
- }
- }
+ m_angularLimits[axis - 3].m_loLimit = lo;
+ m_angularLimits[axis - 3].m_hiLimit = hi;
+ }
+ }
//! Test limit
/*!
@@ -510,41 +486,32 @@ public:
- limited means upper > lower
- limitIndex: first 3 are linear, next 3 are angular
*/
- bool isLimited(int limitIndex)
- {
- if(limitIndex<3)
- {
+ bool isLimited(int limitIndex)
+ {
+ if (limitIndex < 3)
+ {
return m_linearLimits.isLimited(limitIndex);
+ }
+ return m_angularLimits[limitIndex - 3].isLimited();
+ }
- }
- return m_angularLimits[limitIndex-3].isLimited();
- }
-
- virtual void calcAnchorPos(const b3RigidBodyData* bodies); // overridable
+ 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);
+ 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).
+ ///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);
+ 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);
+ 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
+#endif //B3_GENERIC_6DOF_CONSTRAINT_H
diff --git a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3JacobianEntry.h b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3JacobianEntry.h
index a55168eb38..13269debf6 100644
--- a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3JacobianEntry.h
+++ b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3JacobianEntry.h
@@ -18,7 +18,6 @@ subject to the following restrictions:
#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
@@ -27,25 +26,26 @@ subject to the following restrictions:
/// 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
+B3_ATTRIBUTE_ALIGNED16(class)
+b3JacobianEntry
{
public:
- b3JacobianEntry() {};
+ b3JacobianEntry(){};
//constraint between two different rigidbodies
b3JacobianEntry(
const b3Matrix3x3& world2A,
const b3Matrix3x3& world2B,
- const b3Vector3& rel_pos1,const b3Vector3& rel_pos2,
+ const b3Vector3& rel_pos1, const b3Vector3& rel_pos2,
const b3Vector3& jointAxis,
- const b3Vector3& inertiaInvA,
+ const b3Vector3& inertiaInvA,
const b3Scalar massInvA,
const b3Vector3& inertiaInvB,
const b3Scalar massInvB)
- :m_linearJointAxis(jointAxis)
+ : 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_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);
@@ -54,33 +54,31 @@ public:
//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.)))
+ 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_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);
+ 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)
+ 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_0MinvJt = inertiaInvA * m_aJ;
m_1MinvJt = inertiaInvB * m_bJ;
- m_Adiag = m_0MinvJt.dot(m_aJ) + m_1MinvJt.dot(m_bJ);
+ m_Adiag = m_0MinvJt.dot(m_aJ) + m_1MinvJt.dot(m_bJ);
b3Assert(m_Adiag > b3Scalar(0.0));
}
@@ -88,25 +86,25 @@ public:
//constraint on one rigidbody
b3JacobianEntry(
const b3Matrix3x3& world2A,
- const b3Vector3& rel_pos1,const b3Vector3& rel_pos2,
+ const b3Vector3& rel_pos1, const b3Vector3& rel_pos2,
const b3Vector3& jointAxis,
- const b3Vector3& inertiaInvA,
+ const b3Vector3& inertiaInvA,
const b3Scalar massInvA)
- :m_linearJointAxis(jointAxis)
+ : 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_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; }
+ 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
+ b3Scalar getNonDiagonal(const b3JacobianEntry& jacB, const b3Scalar massInvA) const
{
const b3JacobianEntry& jacA = *this;
b3Scalar lin = massInvA * jacA.m_linearJointAxis.dot(jacB.m_linearJointAxis);
@@ -114,42 +112,39 @@ public:
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
+ 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 lin0 = massInvA * lin;
b3Vector3 lin1 = massInvB * lin;
- b3Vector3 sum = ang0+ang1+lin0+lin1;
- return sum[0]+sum[1]+sum[2];
+ 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)
+ 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;
+ 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];
+ b3Scalar rel_vel2 = angvela[0] + angvela[1] + angvela[2];
return rel_vel2 + B3_EPSILON;
}
-//private:
+ //private:
- b3Vector3 m_linearJointAxis;
- b3Vector3 m_aJ;
- b3Vector3 m_bJ;
- b3Vector3 m_0MinvJt;
- b3Vector3 m_1MinvJt;
+ 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;
-
+ b3Scalar m_Adiag;
};
-#endif //B3_JACOBIAN_ENTRY_H
+#endif //B3_JACOBIAN_ENTRY_H
diff --git a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3PgsJacobiSolver.cpp b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3PgsJacobiSolver.cpp
index de729d4556..b7050b1070 100644
--- a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3PgsJacobiSolver.cpp
+++ b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3PgsJacobiSolver.cpp
@@ -29,14 +29,13 @@ subject to the following restrictions:
//#include "b3SolverBody.h"
//#include "b3SolverConstraint.h"
#include "Bullet3Common/b3AlignedObjectArray.h"
-#include <string.h> //for memset
+#include <string.h> //for memset
//#include "../../dynamics/basic_demo/Stubs/AdlContact4.h"
#include "Bullet3Collision/NarrowPhaseCollision/b3Contact4.h"
-
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h"
-static b3Transform getWorldTransform(b3RigidBodyData* rb)
+static b3Transform getWorldTransform(b3RigidBodyData* rb)
{
b3Transform newTrans;
newTrans.setOrigin(rb->m_pos);
@@ -44,19 +43,17 @@ static b3Transform getWorldTransform(b3RigidBodyData* rb)
return newTrans;
}
-static const b3Matrix3x3& getInvInertiaTensorWorld(b3InertiaData* inertia)
+static const b3Matrix3x3& getInvInertiaTensorWorld(b3InertiaData* inertia)
{
return inertia->m_invInertiaWorld;
}
-
-
-static const b3Vector3& getLinearVelocity(b3RigidBodyData* rb)
+static const b3Vector3& getLinearVelocity(b3RigidBodyData* rb)
{
return rb->m_linVel;
}
-static const b3Vector3& getAngularVelocity(b3RigidBodyData* rb)
+static const b3Vector3& getAngularVelocity(b3RigidBodyData* rb)
{
return rb->m_angVel;
}
@@ -65,47 +62,46 @@ static b3Vector3 getVelocityInLocalPoint(b3RigidBodyData* rb, const b3Vector3& r
{
//we also calculate lin/ang velocity for kinematic objects
return getLinearVelocity(rb) + getAngularVelocity(rb).cross(rel_pos);
-
}
-struct b3ContactPoint
+struct b3ContactPoint
{
- b3Vector3 m_positionWorldOnA;
- b3Vector3 m_positionWorldOnB;
- b3Vector3 m_normalWorldOnB;
- b3Scalar m_appliedImpulse;
- b3Scalar m_distance;
- b3Scalar m_combinedRestitution;
+ b3Vector3 m_positionWorldOnA;
+ b3Vector3 m_positionWorldOnB;
+ b3Vector3 m_normalWorldOnB;
+ b3Scalar m_appliedImpulse;
+ b3Scalar m_distance;
+ b3Scalar m_combinedRestitution;
///information related to friction
- b3Scalar m_combinedFriction;
- b3Vector3 m_lateralFrictionDir1;
- b3Vector3 m_lateralFrictionDir2;
- b3Scalar m_appliedImpulseLateral1;
- b3Scalar m_appliedImpulseLateral2;
- b3Scalar m_combinedRollingFriction;
- b3Scalar m_contactMotion1;
- b3Scalar m_contactMotion2;
- b3Scalar m_contactCFM1;
- b3Scalar m_contactCFM2;
-
- bool m_lateralFrictionInitialized;
-
- b3Vector3 getPositionWorldOnA()
+ b3Scalar m_combinedFriction;
+ b3Vector3 m_lateralFrictionDir1;
+ b3Vector3 m_lateralFrictionDir2;
+ b3Scalar m_appliedImpulseLateral1;
+ b3Scalar m_appliedImpulseLateral2;
+ b3Scalar m_combinedRollingFriction;
+ b3Scalar m_contactMotion1;
+ b3Scalar m_contactMotion2;
+ b3Scalar m_contactCFM1;
+ b3Scalar m_contactCFM2;
+
+ bool m_lateralFrictionInitialized;
+
+ b3Vector3 getPositionWorldOnA()
{
return m_positionWorldOnA;
}
- b3Vector3 getPositionWorldOnB()
+ b3Vector3 getPositionWorldOnB()
{
return m_positionWorldOnB;
}
- b3Scalar getDistance()
+ b3Scalar getDistance()
{
return m_distance;
}
};
-void getContactPoint(b3Contact4* contact, int contactIndex, b3ContactPoint& pointOut)
+void getContactPoint(b3Contact4* contact, int contactIndex, b3ContactPoint& pointOut)
{
pointOut.m_appliedImpulse = 0.f;
pointOut.m_appliedImpulseLateral1 = 0.f;
@@ -117,160 +113,145 @@ void getContactPoint(b3Contact4* contact, int contactIndex, b3ContactPoint& poin
pointOut.m_contactCFM2 = 0.f;
pointOut.m_contactMotion1 = 0.f;
pointOut.m_contactMotion2 = 0.f;
- pointOut.m_distance = contact->getPenetration(contactIndex);//??0.01f
+ pointOut.m_distance = contact->getPenetration(contactIndex); //??0.01f
b3Vector3 normalOnB = contact->m_worldNormalOnB;
- normalOnB.normalize();//is this needed?
+ normalOnB.normalize(); //is this needed?
- b3Vector3 l1,l2;
- b3PlaneSpace1(normalOnB,l1,l2);
+ b3Vector3 l1, l2;
+ b3PlaneSpace1(normalOnB, l1, l2);
pointOut.m_normalWorldOnB = normalOnB;
//printf("normalOnB = %f,%f,%f\n",normalOnB.getX(),normalOnB.getY(),normalOnB.getZ());
pointOut.m_lateralFrictionDir1 = l1;
pointOut.m_lateralFrictionDir2 = l2;
pointOut.m_lateralFrictionInitialized = true;
-
-
+
b3Vector3 worldPosB = contact->m_worldPosB[contactIndex];
pointOut.m_positionWorldOnB = worldPosB;
- pointOut.m_positionWorldOnA = worldPosB+normalOnB*pointOut.m_distance;
+ pointOut.m_positionWorldOnA = worldPosB + normalOnB * pointOut.m_distance;
}
-int getNumContacts(b3Contact4* contact)
+int getNumContacts(b3Contact4* contact)
{
return contact->getNPoints();
}
b3PgsJacobiSolver::b3PgsJacobiSolver(bool usePgs)
-:m_usePgs(usePgs),
-m_numSplitImpulseRecoveries(0),
-m_btSeed2(0)
+ : m_usePgs(usePgs),
+ m_numSplitImpulseRecoveries(0),
+ m_btSeed2(0)
{
-
}
b3PgsJacobiSolver::~b3PgsJacobiSolver()
{
}
-void b3PgsJacobiSolver::solveContacts(int numBodies, b3RigidBodyData* bodies, b3InertiaData* inertias, int numContacts, b3Contact4* contacts, int numConstraints, b3TypedConstraint** constraints)
+void b3PgsJacobiSolver::solveContacts(int numBodies, b3RigidBodyData* bodies, b3InertiaData* inertias, int numContacts, b3Contact4* contacts, int numConstraints, b3TypedConstraint** constraints)
{
b3ContactSolverInfo infoGlobal;
infoGlobal.m_splitImpulse = false;
- infoGlobal.m_timeStep = 1.f/60.f;
- infoGlobal.m_numIterations = 4;//4;
-// infoGlobal.m_solverMode|=B3_SOLVER_USE_2_FRICTION_DIRECTIONS|B3_SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS|B3_SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION;
+ infoGlobal.m_timeStep = 1.f / 60.f;
+ infoGlobal.m_numIterations = 4; //4;
+ // infoGlobal.m_solverMode|=B3_SOLVER_USE_2_FRICTION_DIRECTIONS|B3_SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS|B3_SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION;
//infoGlobal.m_solverMode|=B3_SOLVER_USE_2_FRICTION_DIRECTIONS|B3_SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS;
- infoGlobal.m_solverMode|=B3_SOLVER_USE_2_FRICTION_DIRECTIONS;
+ infoGlobal.m_solverMode |= B3_SOLVER_USE_2_FRICTION_DIRECTIONS;
//if (infoGlobal.m_solverMode & B3_SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS)
//if ((infoGlobal.m_solverMode & B3_SOLVER_USE_2_FRICTION_DIRECTIONS) && (infoGlobal.m_solverMode & B3_SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION))
-
- solveGroup(bodies,inertias,numBodies,contacts,numContacts,constraints,numConstraints,infoGlobal);
+ solveGroup(bodies, inertias, numBodies, contacts, numContacts, constraints, numConstraints, infoGlobal);
if (!numContacts)
return;
}
-
-
-
/// b3PgsJacobiSolver Sequentially applies impulses
b3Scalar b3PgsJacobiSolver::solveGroup(b3RigidBodyData* bodies,
- b3InertiaData* inertias,
- int numBodies,
- b3Contact4* manifoldPtr,
- int numManifolds,
- b3TypedConstraint** constraints,
- int numConstraints,
- const b3ContactSolverInfo& infoGlobal)
+ b3InertiaData* inertias,
+ int numBodies,
+ b3Contact4* manifoldPtr,
+ int numManifolds,
+ b3TypedConstraint** constraints,
+ int numConstraints,
+ const b3ContactSolverInfo& infoGlobal)
{
-
B3_PROFILE("solveGroup");
//you need to provide at least some bodies
-
- solveGroupCacheFriendlySetup( bodies, inertias,numBodies, manifoldPtr, numManifolds,constraints, numConstraints,infoGlobal);
-
- solveGroupCacheFriendlyIterations(constraints, numConstraints,infoGlobal);
-
- solveGroupCacheFriendlyFinish(bodies, inertias,numBodies, infoGlobal);
-
- return 0.f;
-}
-
-
-
-
+ solveGroupCacheFriendlySetup(bodies, inertias, numBodies, manifoldPtr, numManifolds, constraints, numConstraints, infoGlobal);
+ solveGroupCacheFriendlyIterations(constraints, numConstraints, infoGlobal);
+ solveGroupCacheFriendlyFinish(bodies, inertias, numBodies, infoGlobal);
+ return 0.f;
+}
#ifdef USE_SIMD
#include <emmintrin.h>
-#define b3VecSplat(x, e) _mm_shuffle_ps(x, x, _MM_SHUFFLE(e,e,e,e))
-static inline __m128 b3SimdDot3( __m128 vec0, __m128 vec1 )
+#define b3VecSplat(x, e) _mm_shuffle_ps(x, x, _MM_SHUFFLE(e, e, e, e))
+static inline __m128 b3SimdDot3(__m128 vec0, __m128 vec1)
{
- __m128 result = _mm_mul_ps( vec0, vec1);
- return _mm_add_ps( b3VecSplat( result, 0 ), _mm_add_ps( b3VecSplat( result, 1 ), b3VecSplat( result, 2 ) ) );
+ __m128 result = _mm_mul_ps(vec0, vec1);
+ return _mm_add_ps(b3VecSplat(result, 0), _mm_add_ps(b3VecSplat(result, 1), b3VecSplat(result, 2)));
}
-#endif//USE_SIMD
+#endif //USE_SIMD
// Project Gauss Seidel or the equivalent Sequential Impulse
-void b3PgsJacobiSolver::resolveSingleConstraintRowGenericSIMD(b3SolverBody& body1,b3SolverBody& body2,const b3SolverConstraint& c)
+void b3PgsJacobiSolver::resolveSingleConstraintRowGenericSIMD(b3SolverBody& body1, b3SolverBody& body2, const b3SolverConstraint& c)
{
#ifdef USE_SIMD
__m128 cpAppliedImp = _mm_set1_ps(c.m_appliedImpulse);
- __m128 lowerLimit1 = _mm_set1_ps(c.m_lowerLimit);
- __m128 upperLimit1 = _mm_set1_ps(c.m_upperLimit);
- __m128 deltaImpulse = _mm_sub_ps(_mm_set1_ps(c.m_rhs), _mm_mul_ps(_mm_set1_ps(c.m_appliedImpulse),_mm_set1_ps(c.m_cfm)));
- __m128 deltaVel1Dotn = _mm_add_ps(b3SimdDot3(c.m_contactNormal.mVec128,body1.internalGetDeltaLinearVelocity().mVec128), b3SimdDot3(c.m_relpos1CrossNormal.mVec128,body1.internalGetDeltaAngularVelocity().mVec128));
- __m128 deltaVel2Dotn = _mm_sub_ps(b3SimdDot3(c.m_relpos2CrossNormal.mVec128,body2.internalGetDeltaAngularVelocity().mVec128),b3SimdDot3((c.m_contactNormal).mVec128,body2.internalGetDeltaLinearVelocity().mVec128));
- deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel1Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
- deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel2Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
- b3SimdScalar sum = _mm_add_ps(cpAppliedImp,deltaImpulse);
- b3SimdScalar resultLowerLess,resultUpperLess;
- resultLowerLess = _mm_cmplt_ps(sum,lowerLimit1);
- resultUpperLess = _mm_cmplt_ps(sum,upperLimit1);
- __m128 lowMinApplied = _mm_sub_ps(lowerLimit1,cpAppliedImp);
- deltaImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse) );
- c.m_appliedImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum) );
- __m128 upperMinApplied = _mm_sub_ps(upperLimit1,cpAppliedImp);
- deltaImpulse = _mm_or_ps( _mm_and_ps(resultUpperLess, deltaImpulse), _mm_andnot_ps(resultUpperLess, upperMinApplied) );
- c.m_appliedImpulse = _mm_or_ps( _mm_and_ps(resultUpperLess, c.m_appliedImpulse), _mm_andnot_ps(resultUpperLess, upperLimit1) );
- __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal.mVec128,body1.internalGetInvMass().mVec128);
- __m128 linearComponentB = _mm_mul_ps((c.m_contactNormal).mVec128,body2.internalGetInvMass().mVec128);
+ __m128 lowerLimit1 = _mm_set1_ps(c.m_lowerLimit);
+ __m128 upperLimit1 = _mm_set1_ps(c.m_upperLimit);
+ __m128 deltaImpulse = _mm_sub_ps(_mm_set1_ps(c.m_rhs), _mm_mul_ps(_mm_set1_ps(c.m_appliedImpulse), _mm_set1_ps(c.m_cfm)));
+ __m128 deltaVel1Dotn = _mm_add_ps(b3SimdDot3(c.m_contactNormal.mVec128, body1.internalGetDeltaLinearVelocity().mVec128), b3SimdDot3(c.m_relpos1CrossNormal.mVec128, body1.internalGetDeltaAngularVelocity().mVec128));
+ __m128 deltaVel2Dotn = _mm_sub_ps(b3SimdDot3(c.m_relpos2CrossNormal.mVec128, body2.internalGetDeltaAngularVelocity().mVec128), b3SimdDot3((c.m_contactNormal).mVec128, body2.internalGetDeltaLinearVelocity().mVec128));
+ deltaImpulse = _mm_sub_ps(deltaImpulse, _mm_mul_ps(deltaVel1Dotn, _mm_set1_ps(c.m_jacDiagABInv)));
+ deltaImpulse = _mm_sub_ps(deltaImpulse, _mm_mul_ps(deltaVel2Dotn, _mm_set1_ps(c.m_jacDiagABInv)));
+ b3SimdScalar sum = _mm_add_ps(cpAppliedImp, deltaImpulse);
+ b3SimdScalar resultLowerLess, resultUpperLess;
+ resultLowerLess = _mm_cmplt_ps(sum, lowerLimit1);
+ resultUpperLess = _mm_cmplt_ps(sum, upperLimit1);
+ __m128 lowMinApplied = _mm_sub_ps(lowerLimit1, cpAppliedImp);
+ deltaImpulse = _mm_or_ps(_mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse));
+ c.m_appliedImpulse = _mm_or_ps(_mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum));
+ __m128 upperMinApplied = _mm_sub_ps(upperLimit1, cpAppliedImp);
+ deltaImpulse = _mm_or_ps(_mm_and_ps(resultUpperLess, deltaImpulse), _mm_andnot_ps(resultUpperLess, upperMinApplied));
+ c.m_appliedImpulse = _mm_or_ps(_mm_and_ps(resultUpperLess, c.m_appliedImpulse), _mm_andnot_ps(resultUpperLess, upperLimit1));
+ __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal.mVec128, body1.internalGetInvMass().mVec128);
+ __m128 linearComponentB = _mm_mul_ps((c.m_contactNormal).mVec128, body2.internalGetInvMass().mVec128);
__m128 impulseMagnitude = deltaImpulse;
- body1.internalGetDeltaLinearVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaLinearVelocity().mVec128,_mm_mul_ps(linearComponentA,impulseMagnitude));
- body1.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaAngularVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentA.mVec128,impulseMagnitude));
- body2.internalGetDeltaLinearVelocity().mVec128 = _mm_sub_ps(body2.internalGetDeltaLinearVelocity().mVec128,_mm_mul_ps(linearComponentB,impulseMagnitude));
- body2.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body2.internalGetDeltaAngularVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentB.mVec128,impulseMagnitude));
+ body1.internalGetDeltaLinearVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaLinearVelocity().mVec128, _mm_mul_ps(linearComponentA, impulseMagnitude));
+ body1.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaAngularVelocity().mVec128, _mm_mul_ps(c.m_angularComponentA.mVec128, impulseMagnitude));
+ body2.internalGetDeltaLinearVelocity().mVec128 = _mm_sub_ps(body2.internalGetDeltaLinearVelocity().mVec128, _mm_mul_ps(linearComponentB, impulseMagnitude));
+ body2.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body2.internalGetDeltaAngularVelocity().mVec128, _mm_mul_ps(c.m_angularComponentB.mVec128, impulseMagnitude));
#else
- resolveSingleConstraintRowGeneric(body1,body2,c);
+ resolveSingleConstraintRowGeneric(body1, body2, c);
#endif
}
// Project Gauss Seidel or the equivalent Sequential Impulse
- void b3PgsJacobiSolver::resolveSingleConstraintRowGeneric(b3SolverBody& body1,b3SolverBody& body2,const b3SolverConstraint& c)
+void b3PgsJacobiSolver::resolveSingleConstraintRowGeneric(b3SolverBody& body1, b3SolverBody& body2, const b3SolverConstraint& c)
{
- b3Scalar deltaImpulse = c.m_rhs-b3Scalar(c.m_appliedImpulse)*c.m_cfm;
- const b3Scalar deltaVel1Dotn = c.m_contactNormal.dot(body1.internalGetDeltaLinearVelocity()) + c.m_relpos1CrossNormal.dot(body1.internalGetDeltaAngularVelocity());
- const b3Scalar deltaVel2Dotn = -c.m_contactNormal.dot(body2.internalGetDeltaLinearVelocity()) + c.m_relpos2CrossNormal.dot(body2.internalGetDeltaAngularVelocity());
+ b3Scalar deltaImpulse = c.m_rhs - b3Scalar(c.m_appliedImpulse) * c.m_cfm;
+ const b3Scalar deltaVel1Dotn = c.m_contactNormal.dot(body1.internalGetDeltaLinearVelocity()) + c.m_relpos1CrossNormal.dot(body1.internalGetDeltaAngularVelocity());
+ const b3Scalar deltaVel2Dotn = -c.m_contactNormal.dot(body2.internalGetDeltaLinearVelocity()) + c.m_relpos2CrossNormal.dot(body2.internalGetDeltaAngularVelocity());
-// const b3Scalar delta_rel_vel = deltaVel1Dotn-deltaVel2Dotn;
- deltaImpulse -= deltaVel1Dotn*c.m_jacDiagABInv;
- deltaImpulse -= deltaVel2Dotn*c.m_jacDiagABInv;
+ // const b3Scalar delta_rel_vel = deltaVel1Dotn-deltaVel2Dotn;
+ deltaImpulse -= deltaVel1Dotn * c.m_jacDiagABInv;
+ deltaImpulse -= deltaVel2Dotn * c.m_jacDiagABInv;
const b3Scalar sum = b3Scalar(c.m_appliedImpulse) + deltaImpulse;
if (sum < c.m_lowerLimit)
{
- deltaImpulse = c.m_lowerLimit-c.m_appliedImpulse;
+ deltaImpulse = c.m_lowerLimit - c.m_appliedImpulse;
c.m_appliedImpulse = c.m_lowerLimit;
}
- else if (sum > c.m_upperLimit)
+ else if (sum > c.m_upperLimit)
{
- deltaImpulse = c.m_upperLimit-c.m_appliedImpulse;
+ deltaImpulse = c.m_upperLimit - c.m_appliedImpulse;
c.m_appliedImpulse = c.m_upperLimit;
}
else
@@ -278,94 +259,93 @@ void b3PgsJacobiSolver::resolveSingleConstraintRowGenericSIMD(b3SolverBody& body
c.m_appliedImpulse = sum;
}
- body1.internalApplyImpulse(c.m_contactNormal*body1.internalGetInvMass(),c.m_angularComponentA,deltaImpulse);
- body2.internalApplyImpulse(-c.m_contactNormal*body2.internalGetInvMass(),c.m_angularComponentB,deltaImpulse);
+ body1.internalApplyImpulse(c.m_contactNormal * body1.internalGetInvMass(), c.m_angularComponentA, deltaImpulse);
+ body2.internalApplyImpulse(-c.m_contactNormal * body2.internalGetInvMass(), c.m_angularComponentB, deltaImpulse);
}
- void b3PgsJacobiSolver::resolveSingleConstraintRowLowerLimitSIMD(b3SolverBody& body1,b3SolverBody& body2,const b3SolverConstraint& c)
+void b3PgsJacobiSolver::resolveSingleConstraintRowLowerLimitSIMD(b3SolverBody& body1, b3SolverBody& body2, const b3SolverConstraint& c)
{
#ifdef USE_SIMD
__m128 cpAppliedImp = _mm_set1_ps(c.m_appliedImpulse);
- __m128 lowerLimit1 = _mm_set1_ps(c.m_lowerLimit);
- __m128 upperLimit1 = _mm_set1_ps(c.m_upperLimit);
- __m128 deltaImpulse = _mm_sub_ps(_mm_set1_ps(c.m_rhs), _mm_mul_ps(_mm_set1_ps(c.m_appliedImpulse),_mm_set1_ps(c.m_cfm)));
- __m128 deltaVel1Dotn = _mm_add_ps(b3SimdDot3(c.m_contactNormal.mVec128,body1.internalGetDeltaLinearVelocity().mVec128), b3SimdDot3(c.m_relpos1CrossNormal.mVec128,body1.internalGetDeltaAngularVelocity().mVec128));
- __m128 deltaVel2Dotn = _mm_sub_ps(b3SimdDot3(c.m_relpos2CrossNormal.mVec128,body2.internalGetDeltaAngularVelocity().mVec128),b3SimdDot3((c.m_contactNormal).mVec128,body2.internalGetDeltaLinearVelocity().mVec128));
- deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel1Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
- deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel2Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
- b3SimdScalar sum = _mm_add_ps(cpAppliedImp,deltaImpulse);
- b3SimdScalar resultLowerLess,resultUpperLess;
- resultLowerLess = _mm_cmplt_ps(sum,lowerLimit1);
- resultUpperLess = _mm_cmplt_ps(sum,upperLimit1);
- __m128 lowMinApplied = _mm_sub_ps(lowerLimit1,cpAppliedImp);
- deltaImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse) );
- c.m_appliedImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum) );
- __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal.mVec128,body1.internalGetInvMass().mVec128);
- __m128 linearComponentB = _mm_mul_ps((c.m_contactNormal).mVec128,body2.internalGetInvMass().mVec128);
+ __m128 lowerLimit1 = _mm_set1_ps(c.m_lowerLimit);
+ __m128 upperLimit1 = _mm_set1_ps(c.m_upperLimit);
+ __m128 deltaImpulse = _mm_sub_ps(_mm_set1_ps(c.m_rhs), _mm_mul_ps(_mm_set1_ps(c.m_appliedImpulse), _mm_set1_ps(c.m_cfm)));
+ __m128 deltaVel1Dotn = _mm_add_ps(b3SimdDot3(c.m_contactNormal.mVec128, body1.internalGetDeltaLinearVelocity().mVec128), b3SimdDot3(c.m_relpos1CrossNormal.mVec128, body1.internalGetDeltaAngularVelocity().mVec128));
+ __m128 deltaVel2Dotn = _mm_sub_ps(b3SimdDot3(c.m_relpos2CrossNormal.mVec128, body2.internalGetDeltaAngularVelocity().mVec128), b3SimdDot3((c.m_contactNormal).mVec128, body2.internalGetDeltaLinearVelocity().mVec128));
+ deltaImpulse = _mm_sub_ps(deltaImpulse, _mm_mul_ps(deltaVel1Dotn, _mm_set1_ps(c.m_jacDiagABInv)));
+ deltaImpulse = _mm_sub_ps(deltaImpulse, _mm_mul_ps(deltaVel2Dotn, _mm_set1_ps(c.m_jacDiagABInv)));
+ b3SimdScalar sum = _mm_add_ps(cpAppliedImp, deltaImpulse);
+ b3SimdScalar resultLowerLess, resultUpperLess;
+ resultLowerLess = _mm_cmplt_ps(sum, lowerLimit1);
+ resultUpperLess = _mm_cmplt_ps(sum, upperLimit1);
+ __m128 lowMinApplied = _mm_sub_ps(lowerLimit1, cpAppliedImp);
+ deltaImpulse = _mm_or_ps(_mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse));
+ c.m_appliedImpulse = _mm_or_ps(_mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum));
+ __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal.mVec128, body1.internalGetInvMass().mVec128);
+ __m128 linearComponentB = _mm_mul_ps((c.m_contactNormal).mVec128, body2.internalGetInvMass().mVec128);
__m128 impulseMagnitude = deltaImpulse;
- body1.internalGetDeltaLinearVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaLinearVelocity().mVec128,_mm_mul_ps(linearComponentA,impulseMagnitude));
- body1.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaAngularVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentA.mVec128,impulseMagnitude));
- body2.internalGetDeltaLinearVelocity().mVec128 = _mm_sub_ps(body2.internalGetDeltaLinearVelocity().mVec128,_mm_mul_ps(linearComponentB,impulseMagnitude));
- body2.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body2.internalGetDeltaAngularVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentB.mVec128,impulseMagnitude));
+ body1.internalGetDeltaLinearVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaLinearVelocity().mVec128, _mm_mul_ps(linearComponentA, impulseMagnitude));
+ body1.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaAngularVelocity().mVec128, _mm_mul_ps(c.m_angularComponentA.mVec128, impulseMagnitude));
+ body2.internalGetDeltaLinearVelocity().mVec128 = _mm_sub_ps(body2.internalGetDeltaLinearVelocity().mVec128, _mm_mul_ps(linearComponentB, impulseMagnitude));
+ body2.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body2.internalGetDeltaAngularVelocity().mVec128, _mm_mul_ps(c.m_angularComponentB.mVec128, impulseMagnitude));
#else
- resolveSingleConstraintRowLowerLimit(body1,body2,c);
+ resolveSingleConstraintRowLowerLimit(body1, body2, c);
#endif
}
// Project Gauss Seidel or the equivalent Sequential Impulse
- void b3PgsJacobiSolver::resolveSingleConstraintRowLowerLimit(b3SolverBody& body1,b3SolverBody& body2,const b3SolverConstraint& c)
+void b3PgsJacobiSolver::resolveSingleConstraintRowLowerLimit(b3SolverBody& body1, b3SolverBody& body2, const b3SolverConstraint& c)
{
- b3Scalar deltaImpulse = c.m_rhs-b3Scalar(c.m_appliedImpulse)*c.m_cfm;
- const b3Scalar deltaVel1Dotn = c.m_contactNormal.dot(body1.internalGetDeltaLinearVelocity()) + c.m_relpos1CrossNormal.dot(body1.internalGetDeltaAngularVelocity());
- const b3Scalar deltaVel2Dotn = -c.m_contactNormal.dot(body2.internalGetDeltaLinearVelocity()) + c.m_relpos2CrossNormal.dot(body2.internalGetDeltaAngularVelocity());
+ b3Scalar deltaImpulse = c.m_rhs - b3Scalar(c.m_appliedImpulse) * c.m_cfm;
+ const b3Scalar deltaVel1Dotn = c.m_contactNormal.dot(body1.internalGetDeltaLinearVelocity()) + c.m_relpos1CrossNormal.dot(body1.internalGetDeltaAngularVelocity());
+ const b3Scalar deltaVel2Dotn = -c.m_contactNormal.dot(body2.internalGetDeltaLinearVelocity()) + c.m_relpos2CrossNormal.dot(body2.internalGetDeltaAngularVelocity());
- deltaImpulse -= deltaVel1Dotn*c.m_jacDiagABInv;
- deltaImpulse -= deltaVel2Dotn*c.m_jacDiagABInv;
+ deltaImpulse -= deltaVel1Dotn * c.m_jacDiagABInv;
+ deltaImpulse -= deltaVel2Dotn * c.m_jacDiagABInv;
const b3Scalar sum = b3Scalar(c.m_appliedImpulse) + deltaImpulse;
if (sum < c.m_lowerLimit)
{
- deltaImpulse = c.m_lowerLimit-c.m_appliedImpulse;
+ deltaImpulse = c.m_lowerLimit - c.m_appliedImpulse;
c.m_appliedImpulse = c.m_lowerLimit;
}
else
{
c.m_appliedImpulse = sum;
}
- body1.internalApplyImpulse(c.m_contactNormal*body1.internalGetInvMass(),c.m_angularComponentA,deltaImpulse);
- body2.internalApplyImpulse(-c.m_contactNormal*body2.internalGetInvMass(),c.m_angularComponentB,deltaImpulse);
+ body1.internalApplyImpulse(c.m_contactNormal * body1.internalGetInvMass(), c.m_angularComponentA, deltaImpulse);
+ body2.internalApplyImpulse(-c.m_contactNormal * body2.internalGetInvMass(), c.m_angularComponentB, deltaImpulse);
}
-
-void b3PgsJacobiSolver::resolveSplitPenetrationImpulseCacheFriendly(
- b3SolverBody& body1,
- b3SolverBody& body2,
- const b3SolverConstraint& c)
+void b3PgsJacobiSolver::resolveSplitPenetrationImpulseCacheFriendly(
+ b3SolverBody& body1,
+ b3SolverBody& body2,
+ const b3SolverConstraint& c)
{
- if (c.m_rhsPenetration)
- {
- m_numSplitImpulseRecoveries++;
- b3Scalar deltaImpulse = c.m_rhsPenetration-b3Scalar(c.m_appliedPushImpulse)*c.m_cfm;
- const b3Scalar deltaVel1Dotn = c.m_contactNormal.dot(body1.internalGetPushVelocity()) + c.m_relpos1CrossNormal.dot(body1.internalGetTurnVelocity());
- const b3Scalar deltaVel2Dotn = -c.m_contactNormal.dot(body2.internalGetPushVelocity()) + c.m_relpos2CrossNormal.dot(body2.internalGetTurnVelocity());
-
- deltaImpulse -= deltaVel1Dotn*c.m_jacDiagABInv;
- deltaImpulse -= deltaVel2Dotn*c.m_jacDiagABInv;
- const b3Scalar sum = b3Scalar(c.m_appliedPushImpulse) + deltaImpulse;
- if (sum < c.m_lowerLimit)
- {
- deltaImpulse = c.m_lowerLimit-c.m_appliedPushImpulse;
- c.m_appliedPushImpulse = c.m_lowerLimit;
- }
- else
- {
- c.m_appliedPushImpulse = sum;
- }
- body1.internalApplyPushImpulse(c.m_contactNormal*body1.internalGetInvMass(),c.m_angularComponentA,deltaImpulse);
- body2.internalApplyPushImpulse(-c.m_contactNormal*body2.internalGetInvMass(),c.m_angularComponentB,deltaImpulse);
- }
+ if (c.m_rhsPenetration)
+ {
+ m_numSplitImpulseRecoveries++;
+ b3Scalar deltaImpulse = c.m_rhsPenetration - b3Scalar(c.m_appliedPushImpulse) * c.m_cfm;
+ const b3Scalar deltaVel1Dotn = c.m_contactNormal.dot(body1.internalGetPushVelocity()) + c.m_relpos1CrossNormal.dot(body1.internalGetTurnVelocity());
+ const b3Scalar deltaVel2Dotn = -c.m_contactNormal.dot(body2.internalGetPushVelocity()) + c.m_relpos2CrossNormal.dot(body2.internalGetTurnVelocity());
+
+ deltaImpulse -= deltaVel1Dotn * c.m_jacDiagABInv;
+ deltaImpulse -= deltaVel2Dotn * c.m_jacDiagABInv;
+ const b3Scalar sum = b3Scalar(c.m_appliedPushImpulse) + deltaImpulse;
+ if (sum < c.m_lowerLimit)
+ {
+ deltaImpulse = c.m_lowerLimit - c.m_appliedPushImpulse;
+ c.m_appliedPushImpulse = c.m_lowerLimit;
+ }
+ else
+ {
+ c.m_appliedPushImpulse = sum;
+ }
+ body1.internalApplyPushImpulse(c.m_contactNormal * body1.internalGetInvMass(), c.m_angularComponentA, deltaImpulse);
+ body2.internalApplyPushImpulse(-c.m_contactNormal * body2.internalGetInvMass(), c.m_angularComponentB, deltaImpulse);
+ }
}
- void b3PgsJacobiSolver::resolveSplitPenetrationSIMD(b3SolverBody& body1,b3SolverBody& body2,const b3SolverConstraint& c)
+void b3PgsJacobiSolver::resolveSplitPenetrationSIMD(b3SolverBody& body1, b3SolverBody& body2, const b3SolverConstraint& c)
{
#ifdef USE_SIMD
if (!c.m_rhsPenetration)
@@ -374,44 +354,40 @@ void b3PgsJacobiSolver::resolveSplitPenetrationImpulseCacheFriendly(
m_numSplitImpulseRecoveries++;
__m128 cpAppliedImp = _mm_set1_ps(c.m_appliedPushImpulse);
- __m128 lowerLimit1 = _mm_set1_ps(c.m_lowerLimit);
- __m128 upperLimit1 = _mm_set1_ps(c.m_upperLimit);
- __m128 deltaImpulse = _mm_sub_ps(_mm_set1_ps(c.m_rhsPenetration), _mm_mul_ps(_mm_set1_ps(c.m_appliedPushImpulse),_mm_set1_ps(c.m_cfm)));
- __m128 deltaVel1Dotn = _mm_add_ps(b3SimdDot3(c.m_contactNormal.mVec128,body1.internalGetPushVelocity().mVec128), b3SimdDot3(c.m_relpos1CrossNormal.mVec128,body1.internalGetTurnVelocity().mVec128));
- __m128 deltaVel2Dotn = _mm_sub_ps(b3SimdDot3(c.m_relpos2CrossNormal.mVec128,body2.internalGetTurnVelocity().mVec128),b3SimdDot3((c.m_contactNormal).mVec128,body2.internalGetPushVelocity().mVec128));
- deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel1Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
- deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel2Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
- b3SimdScalar sum = _mm_add_ps(cpAppliedImp,deltaImpulse);
- b3SimdScalar resultLowerLess,resultUpperLess;
- resultLowerLess = _mm_cmplt_ps(sum,lowerLimit1);
- resultUpperLess = _mm_cmplt_ps(sum,upperLimit1);
- __m128 lowMinApplied = _mm_sub_ps(lowerLimit1,cpAppliedImp);
- deltaImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse) );
- c.m_appliedPushImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum) );
- __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal.mVec128,body1.internalGetInvMass().mVec128);
- __m128 linearComponentB = _mm_mul_ps((c.m_contactNormal).mVec128,body2.internalGetInvMass().mVec128);
+ __m128 lowerLimit1 = _mm_set1_ps(c.m_lowerLimit);
+ __m128 upperLimit1 = _mm_set1_ps(c.m_upperLimit);
+ __m128 deltaImpulse = _mm_sub_ps(_mm_set1_ps(c.m_rhsPenetration), _mm_mul_ps(_mm_set1_ps(c.m_appliedPushImpulse), _mm_set1_ps(c.m_cfm)));
+ __m128 deltaVel1Dotn = _mm_add_ps(b3SimdDot3(c.m_contactNormal.mVec128, body1.internalGetPushVelocity().mVec128), b3SimdDot3(c.m_relpos1CrossNormal.mVec128, body1.internalGetTurnVelocity().mVec128));
+ __m128 deltaVel2Dotn = _mm_sub_ps(b3SimdDot3(c.m_relpos2CrossNormal.mVec128, body2.internalGetTurnVelocity().mVec128), b3SimdDot3((c.m_contactNormal).mVec128, body2.internalGetPushVelocity().mVec128));
+ deltaImpulse = _mm_sub_ps(deltaImpulse, _mm_mul_ps(deltaVel1Dotn, _mm_set1_ps(c.m_jacDiagABInv)));
+ deltaImpulse = _mm_sub_ps(deltaImpulse, _mm_mul_ps(deltaVel2Dotn, _mm_set1_ps(c.m_jacDiagABInv)));
+ b3SimdScalar sum = _mm_add_ps(cpAppliedImp, deltaImpulse);
+ b3SimdScalar resultLowerLess, resultUpperLess;
+ resultLowerLess = _mm_cmplt_ps(sum, lowerLimit1);
+ resultUpperLess = _mm_cmplt_ps(sum, upperLimit1);
+ __m128 lowMinApplied = _mm_sub_ps(lowerLimit1, cpAppliedImp);
+ deltaImpulse = _mm_or_ps(_mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse));
+ c.m_appliedPushImpulse = _mm_or_ps(_mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum));
+ __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal.mVec128, body1.internalGetInvMass().mVec128);
+ __m128 linearComponentB = _mm_mul_ps((c.m_contactNormal).mVec128, body2.internalGetInvMass().mVec128);
__m128 impulseMagnitude = deltaImpulse;
- body1.internalGetPushVelocity().mVec128 = _mm_add_ps(body1.internalGetPushVelocity().mVec128,_mm_mul_ps(linearComponentA,impulseMagnitude));
- body1.internalGetTurnVelocity().mVec128 = _mm_add_ps(body1.internalGetTurnVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentA.mVec128,impulseMagnitude));
- body2.internalGetPushVelocity().mVec128 = _mm_sub_ps(body2.internalGetPushVelocity().mVec128,_mm_mul_ps(linearComponentB,impulseMagnitude));
- body2.internalGetTurnVelocity().mVec128 = _mm_add_ps(body2.internalGetTurnVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentB.mVec128,impulseMagnitude));
+ body1.internalGetPushVelocity().mVec128 = _mm_add_ps(body1.internalGetPushVelocity().mVec128, _mm_mul_ps(linearComponentA, impulseMagnitude));
+ body1.internalGetTurnVelocity().mVec128 = _mm_add_ps(body1.internalGetTurnVelocity().mVec128, _mm_mul_ps(c.m_angularComponentA.mVec128, impulseMagnitude));
+ body2.internalGetPushVelocity().mVec128 = _mm_sub_ps(body2.internalGetPushVelocity().mVec128, _mm_mul_ps(linearComponentB, impulseMagnitude));
+ body2.internalGetTurnVelocity().mVec128 = _mm_add_ps(body2.internalGetTurnVelocity().mVec128, _mm_mul_ps(c.m_angularComponentB.mVec128, impulseMagnitude));
#else
- resolveSplitPenetrationImpulseCacheFriendly(body1,body2,c);
+ resolveSplitPenetrationImpulseCacheFriendly(body1, body2, c);
#endif
}
-
-
unsigned long b3PgsJacobiSolver::b3Rand2()
{
- m_btSeed2 = (1664525L*m_btSeed2 + 1013904223L) & 0xffffffff;
+ m_btSeed2 = (1664525L * m_btSeed2 + 1013904223L) & 0xffffffff;
return m_btSeed2;
}
-
-
//See ODE: adam's all-int straightforward(?) dRandInt (0..n-1)
-int b3PgsJacobiSolver::b3RandInt2 (int n)
+int b3PgsJacobiSolver::b3RandInt2(int n)
{
// seems good; xor-fold and modulus
const unsigned long un = static_cast<unsigned long>(n);
@@ -419,15 +395,20 @@ int b3PgsJacobiSolver::b3RandInt2 (int n)
// note: probably more aggressive than it needs to be -- might be
// able to get away without one or two of the innermost branches.
- if (un <= 0x00010000UL) {
+ if (un <= 0x00010000UL)
+ {
r ^= (r >> 16);
- if (un <= 0x00000100UL) {
+ if (un <= 0x00000100UL)
+ {
r ^= (r >> 8);
- if (un <= 0x00000010UL) {
+ if (un <= 0x00000010UL)
+ {
r ^= (r >> 4);
- if (un <= 0x00000004UL) {
+ if (un <= 0x00000004UL)
+ {
r ^= (r >> 2);
- if (un <= 0x00000002UL) {
+ if (un <= 0x00000002UL)
+ {
r ^= (r >> 1);
}
}
@@ -435,62 +416,46 @@ int b3PgsJacobiSolver::b3RandInt2 (int n)
}
}
- return (int) (r % un);
+ return (int)(r % un);
}
-
-
-void b3PgsJacobiSolver::initSolverBody(int bodyIndex, b3SolverBody* solverBody, b3RigidBodyData* rb)
+void b3PgsJacobiSolver::initSolverBody(int bodyIndex, b3SolverBody* solverBody, b3RigidBodyData* rb)
{
-
- solverBody->m_deltaLinearVelocity.setValue(0.f,0.f,0.f);
- solverBody->m_deltaAngularVelocity.setValue(0.f,0.f,0.f);
- solverBody->internalGetPushVelocity().setValue(0.f,0.f,0.f);
- solverBody->internalGetTurnVelocity().setValue(0.f,0.f,0.f);
+ solverBody->m_deltaLinearVelocity.setValue(0.f, 0.f, 0.f);
+ solverBody->m_deltaAngularVelocity.setValue(0.f, 0.f, 0.f);
+ solverBody->internalGetPushVelocity().setValue(0.f, 0.f, 0.f);
+ solverBody->internalGetTurnVelocity().setValue(0.f, 0.f, 0.f);
if (rb)
{
solverBody->m_worldTransform = getWorldTransform(rb);
- solverBody->internalSetInvMass(b3MakeVector3(rb->m_invMass,rb->m_invMass,rb->m_invMass));
+ solverBody->internalSetInvMass(b3MakeVector3(rb->m_invMass, rb->m_invMass, rb->m_invMass));
solverBody->m_originalBodyIndex = bodyIndex;
- solverBody->m_angularFactor = b3MakeVector3(1,1,1);
- solverBody->m_linearFactor = b3MakeVector3(1,1,1);
+ solverBody->m_angularFactor = b3MakeVector3(1, 1, 1);
+ solverBody->m_linearFactor = b3MakeVector3(1, 1, 1);
solverBody->m_linearVelocity = getLinearVelocity(rb);
solverBody->m_angularVelocity = getAngularVelocity(rb);
- } else
+ }
+ else
{
solverBody->m_worldTransform.setIdentity();
- solverBody->internalSetInvMass(b3MakeVector3(0,0,0));
+ solverBody->internalSetInvMass(b3MakeVector3(0, 0, 0));
solverBody->m_originalBodyIndex = bodyIndex;
- solverBody->m_angularFactor.setValue(1,1,1);
- solverBody->m_linearFactor.setValue(1,1,1);
- solverBody->m_linearVelocity.setValue(0,0,0);
- solverBody->m_angularVelocity.setValue(0,0,0);
+ solverBody->m_angularFactor.setValue(1, 1, 1);
+ solverBody->m_linearFactor.setValue(1, 1, 1);
+ solverBody->m_linearVelocity.setValue(0, 0, 0);
+ solverBody->m_angularVelocity.setValue(0, 0, 0);
}
-
-
}
-
-
-
-
-
b3Scalar b3PgsJacobiSolver::restitutionCurve(b3Scalar rel_vel, b3Scalar restitution)
{
b3Scalar rest = restitution * -rel_vel;
return rest;
}
-
-
-
-
-
-void b3PgsJacobiSolver::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, b3Scalar cfmSlip)
+void b3PgsJacobiSolver::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, b3Scalar cfmSlip)
{
-
-
solverConstraint.m_contactNormal = normalAxis;
b3SolverBody& solverBodyA = m_tmpSolverBodyPool[solverBodyIdA];
b3SolverBody& solverBodyB = m_tmpSolverBodyPool[solverBodyIdB];
@@ -498,7 +463,6 @@ void b3PgsJacobiSolver::setupFrictionConstraint(b3RigidBodyData* bodies,b3Inerti
b3RigidBodyData* body0 = &bodies[solverBodyA.m_originalBodyIndex];
b3RigidBodyData* body1 = &bodies[solverBodyB.m_originalBodyIndex];
-
solverConstraint.m_solverBodyIdA = solverBodyIdA;
solverConstraint.m_solverBodyIdB = solverBodyIdB;
@@ -511,12 +475,12 @@ void b3PgsJacobiSolver::setupFrictionConstraint(b3RigidBodyData* bodies,b3Inerti
{
b3Vector3 ftorqueAxis1 = rel_pos1.cross(solverConstraint.m_contactNormal);
solverConstraint.m_relpos1CrossNormal = ftorqueAxis1;
- solverConstraint.m_angularComponentA = body0 ? getInvInertiaTensorWorld(&inertias[solverBodyA.m_originalBodyIndex])*ftorqueAxis1 : b3MakeVector3(0,0,0);
+ solverConstraint.m_angularComponentA = body0 ? getInvInertiaTensorWorld(&inertias[solverBodyA.m_originalBodyIndex]) * ftorqueAxis1 : b3MakeVector3(0, 0, 0);
}
{
b3Vector3 ftorqueAxis1 = rel_pos2.cross(-solverConstraint.m_contactNormal);
solverConstraint.m_relpos2CrossNormal = ftorqueAxis1;
- solverConstraint.m_angularComponentB = body1 ? getInvInertiaTensorWorld(&inertias[solverBodyB.m_originalBodyIndex])*ftorqueAxis1 : b3MakeVector3(0,0,0);
+ solverConstraint.m_angularComponentB = body1 ? getInvInertiaTensorWorld(&inertias[solverBodyB.m_originalBodyIndex]) * ftorqueAxis1 : b3MakeVector3(0, 0, 0);
}
b3Scalar scaledDenom;
@@ -527,72 +491,66 @@ void b3PgsJacobiSolver::setupFrictionConstraint(b3RigidBodyData* bodies,b3Inerti
b3Scalar denom1 = 0.f;
if (body0)
{
- vec = ( solverConstraint.m_angularComponentA).cross(rel_pos1);
+ vec = (solverConstraint.m_angularComponentA).cross(rel_pos1);
denom0 = body0->m_invMass + normalAxis.dot(vec);
}
if (body1)
{
- vec = ( -solverConstraint.m_angularComponentB).cross(rel_pos2);
+ vec = (-solverConstraint.m_angularComponentB).cross(rel_pos2);
denom1 = body1->m_invMass + normalAxis.dot(vec);
}
b3Scalar denom;
if (m_usePgs)
{
- scaledDenom = denom = relaxation/(denom0+denom1);
- } else
+ scaledDenom = denom = relaxation / (denom0 + denom1);
+ }
+ else
{
- denom = relaxation/(denom0+denom1);
- b3Scalar countA = body0->m_invMass ? b3Scalar(m_bodyCount[solverBodyA.m_originalBodyIndex]): 1.f;
- b3Scalar countB = body1->m_invMass ? b3Scalar(m_bodyCount[solverBodyB.m_originalBodyIndex]): 1.f;
+ denom = relaxation / (denom0 + denom1);
+ b3Scalar countA = body0->m_invMass ? b3Scalar(m_bodyCount[solverBodyA.m_originalBodyIndex]) : 1.f;
+ b3Scalar countB = body1->m_invMass ? b3Scalar(m_bodyCount[solverBodyB.m_originalBodyIndex]) : 1.f;
- scaledDenom = relaxation/(denom0*countA+denom1*countB);
+ scaledDenom = relaxation / (denom0 * countA + denom1 * countB);
}
solverConstraint.m_jacDiagABInv = denom;
}
{
-
-
b3Scalar rel_vel;
- b3Scalar vel1Dotn = solverConstraint.m_contactNormal.dot(body0?solverBodyA.m_linearVelocity:b3MakeVector3(0,0,0))
- + solverConstraint.m_relpos1CrossNormal.dot(body0?solverBodyA.m_angularVelocity:b3MakeVector3(0,0,0));
- b3Scalar vel2Dotn = -solverConstraint.m_contactNormal.dot(body1?solverBodyB.m_linearVelocity:b3MakeVector3(0,0,0))
- + solverConstraint.m_relpos2CrossNormal.dot(body1?solverBodyB.m_angularVelocity:b3MakeVector3(0,0,0));
+ b3Scalar vel1Dotn = solverConstraint.m_contactNormal.dot(body0 ? solverBodyA.m_linearVelocity : b3MakeVector3(0, 0, 0)) + solverConstraint.m_relpos1CrossNormal.dot(body0 ? solverBodyA.m_angularVelocity : b3MakeVector3(0, 0, 0));
+ b3Scalar vel2Dotn = -solverConstraint.m_contactNormal.dot(body1 ? solverBodyB.m_linearVelocity : b3MakeVector3(0, 0, 0)) + solverConstraint.m_relpos2CrossNormal.dot(body1 ? solverBodyB.m_angularVelocity : b3MakeVector3(0, 0, 0));
- rel_vel = vel1Dotn+vel2Dotn;
+ rel_vel = vel1Dotn + vel2Dotn;
-// b3Scalar positionalError = 0.f;
+ // b3Scalar positionalError = 0.f;
- b3SimdScalar velocityError = desiredVelocity - rel_vel;
- b3SimdScalar velocityImpulse = velocityError * b3SimdScalar(scaledDenom);//solverConstraint.m_jacDiagABInv);
+ b3SimdScalar velocityError = desiredVelocity - rel_vel;
+ b3SimdScalar velocityImpulse = velocityError * b3SimdScalar(scaledDenom); //solverConstraint.m_jacDiagABInv);
solverConstraint.m_rhs = velocityImpulse;
solverConstraint.m_cfm = cfmSlip;
solverConstraint.m_lowerLimit = 0;
solverConstraint.m_upperLimit = 1e10f;
-
}
}
-b3SolverConstraint& b3PgsJacobiSolver::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, b3Scalar cfmSlip)
+b3SolverConstraint& b3PgsJacobiSolver::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, b3Scalar cfmSlip)
{
b3SolverConstraint& solverConstraint = m_tmpSolverContactFrictionConstraintPool.expandNonInitializing();
solverConstraint.m_frictionIndex = frictionIndex;
- setupFrictionConstraint(bodies,inertias,solverConstraint, normalAxis, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2,
+ setupFrictionConstraint(bodies, inertias, solverConstraint, normalAxis, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2,
colObj0, colObj1, relaxation, desiredVelocity, cfmSlip);
return solverConstraint;
}
-
-void b3PgsJacobiSolver::setupRollingFrictionConstraint(b3RigidBodyData* bodies,b3InertiaData* inertias, b3SolverConstraint& solverConstraint, const b3Vector3& normalAxis1,int solverBodyIdA,int solverBodyIdB,
- b3ContactPoint& cp,const b3Vector3& rel_pos1,const b3Vector3& rel_pos2,
- b3RigidBodyData* colObj0,b3RigidBodyData* colObj1, b3Scalar relaxation,
- b3Scalar desiredVelocity, b3Scalar cfmSlip)
+void b3PgsJacobiSolver::setupRollingFrictionConstraint(b3RigidBodyData* bodies, b3InertiaData* inertias, b3SolverConstraint& solverConstraint, const b3Vector3& normalAxis1, int solverBodyIdA, int solverBodyIdB,
+ b3ContactPoint& cp, const b3Vector3& rel_pos1, const b3Vector3& rel_pos2,
+ b3RigidBodyData* colObj0, b3RigidBodyData* colObj1, b3Scalar relaxation,
+ b3Scalar desiredVelocity, b3Scalar cfmSlip)
{
- b3Vector3 normalAxis=b3MakeVector3(0,0,0);
-
+ b3Vector3 normalAxis = b3MakeVector3(0, 0, 0);
solverConstraint.m_contactNormal = normalAxis;
b3SolverBody& solverBodyA = m_tmpSolverBodyPool[solverBodyIdA];
@@ -613,283 +571,256 @@ void b3PgsJacobiSolver::setupRollingFrictionConstraint(b3RigidBodyData* bodies,b
{
b3Vector3 ftorqueAxis1 = -normalAxis1;
solverConstraint.m_relpos1CrossNormal = ftorqueAxis1;
- solverConstraint.m_angularComponentA = body0 ? getInvInertiaTensorWorld(&inertias[solverBodyA.m_originalBodyIndex])*ftorqueAxis1 : b3MakeVector3(0,0,0);
+ solverConstraint.m_angularComponentA = body0 ? getInvInertiaTensorWorld(&inertias[solverBodyA.m_originalBodyIndex]) * ftorqueAxis1 : b3MakeVector3(0, 0, 0);
}
{
b3Vector3 ftorqueAxis1 = normalAxis1;
solverConstraint.m_relpos2CrossNormal = ftorqueAxis1;
- solverConstraint.m_angularComponentB = body1 ? getInvInertiaTensorWorld(&inertias[solverBodyB.m_originalBodyIndex])*ftorqueAxis1 : b3MakeVector3(0,0,0);
+ solverConstraint.m_angularComponentB = body1 ? getInvInertiaTensorWorld(&inertias[solverBodyB.m_originalBodyIndex]) * ftorqueAxis1 : b3MakeVector3(0, 0, 0);
}
-
{
- b3Vector3 iMJaA = body0?getInvInertiaTensorWorld(&inertias[solverBodyA.m_originalBodyIndex])*solverConstraint.m_relpos1CrossNormal:b3MakeVector3(0,0,0);
- b3Vector3 iMJaB = body1?getInvInertiaTensorWorld(&inertias[solverBodyB.m_originalBodyIndex])*solverConstraint.m_relpos2CrossNormal:b3MakeVector3(0,0,0);
+ b3Vector3 iMJaA = body0 ? getInvInertiaTensorWorld(&inertias[solverBodyA.m_originalBodyIndex]) * solverConstraint.m_relpos1CrossNormal : b3MakeVector3(0, 0, 0);
+ b3Vector3 iMJaB = body1 ? getInvInertiaTensorWorld(&inertias[solverBodyB.m_originalBodyIndex]) * solverConstraint.m_relpos2CrossNormal : b3MakeVector3(0, 0, 0);
b3Scalar sum = 0;
sum += iMJaA.dot(solverConstraint.m_relpos1CrossNormal);
sum += iMJaB.dot(solverConstraint.m_relpos2CrossNormal);
- solverConstraint.m_jacDiagABInv = b3Scalar(1.)/sum;
+ solverConstraint.m_jacDiagABInv = b3Scalar(1.) / sum;
}
{
-
-
b3Scalar rel_vel;
- b3Scalar vel1Dotn = solverConstraint.m_contactNormal.dot(body0?solverBodyA.m_linearVelocity:b3MakeVector3(0,0,0))
- + solverConstraint.m_relpos1CrossNormal.dot(body0?solverBodyA.m_angularVelocity:b3MakeVector3(0,0,0));
- b3Scalar vel2Dotn = -solverConstraint.m_contactNormal.dot(body1?solverBodyB.m_linearVelocity:b3MakeVector3(0,0,0))
- + solverConstraint.m_relpos2CrossNormal.dot(body1?solverBodyB.m_angularVelocity:b3MakeVector3(0,0,0));
+ b3Scalar vel1Dotn = solverConstraint.m_contactNormal.dot(body0 ? solverBodyA.m_linearVelocity : b3MakeVector3(0, 0, 0)) + solverConstraint.m_relpos1CrossNormal.dot(body0 ? solverBodyA.m_angularVelocity : b3MakeVector3(0, 0, 0));
+ b3Scalar vel2Dotn = -solverConstraint.m_contactNormal.dot(body1 ? solverBodyB.m_linearVelocity : b3MakeVector3(0, 0, 0)) + solverConstraint.m_relpos2CrossNormal.dot(body1 ? solverBodyB.m_angularVelocity : b3MakeVector3(0, 0, 0));
- rel_vel = vel1Dotn+vel2Dotn;
+ rel_vel = vel1Dotn + vel2Dotn;
-// b3Scalar positionalError = 0.f;
+ // b3Scalar positionalError = 0.f;
- b3SimdScalar velocityError = desiredVelocity - rel_vel;
- b3SimdScalar velocityImpulse = velocityError * b3SimdScalar(solverConstraint.m_jacDiagABInv);
+ b3SimdScalar velocityError = desiredVelocity - rel_vel;
+ b3SimdScalar velocityImpulse = velocityError * b3SimdScalar(solverConstraint.m_jacDiagABInv);
solverConstraint.m_rhs = velocityImpulse;
solverConstraint.m_cfm = cfmSlip;
solverConstraint.m_lowerLimit = 0;
solverConstraint.m_upperLimit = 1e10f;
-
}
}
-
-
-
-
-
-
-
-b3SolverConstraint& b3PgsJacobiSolver::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, b3Scalar cfmSlip)
+b3SolverConstraint& b3PgsJacobiSolver::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, b3Scalar cfmSlip)
{
b3SolverConstraint& solverConstraint = m_tmpSolverContactRollingFrictionConstraintPool.expandNonInitializing();
solverConstraint.m_frictionIndex = frictionIndex;
- setupRollingFrictionConstraint(bodies,inertias,solverConstraint, normalAxis, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2,
- colObj0, colObj1, relaxation, desiredVelocity, cfmSlip);
+ setupRollingFrictionConstraint(bodies, inertias, solverConstraint, normalAxis, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2,
+ colObj0, colObj1, relaxation, desiredVelocity, cfmSlip);
return solverConstraint;
}
-
-int b3PgsJacobiSolver::getOrInitSolverBody(int bodyIndex, b3RigidBodyData* bodies,b3InertiaData* inertias)
+int b3PgsJacobiSolver::getOrInitSolverBody(int bodyIndex, b3RigidBodyData* bodies, b3InertiaData* inertias)
{
//b3Assert(bodyIndex< m_tmpSolverBodyPool.size());
b3RigidBodyData& body = bodies[bodyIndex];
int curIndex = -1;
- if (m_usePgs || body.m_invMass==0.f)
+ if (m_usePgs || body.m_invMass == 0.f)
{
- if (m_bodyCount[bodyIndex]<0)
+ if (m_bodyCount[bodyIndex] < 0)
{
curIndex = m_tmpSolverBodyPool.size();
b3SolverBody& solverBody = m_tmpSolverBodyPool.expand();
- initSolverBody(bodyIndex,&solverBody,&body);
+ initSolverBody(bodyIndex, &solverBody, &body);
solverBody.m_originalBodyIndex = bodyIndex;
m_bodyCount[bodyIndex] = curIndex;
- } else
+ }
+ else
{
curIndex = m_bodyCount[bodyIndex];
}
- } else
+ }
+ else
{
- b3Assert(m_bodyCount[bodyIndex]>0);
+ b3Assert(m_bodyCount[bodyIndex] > 0);
m_bodyCountCheck[bodyIndex]++;
curIndex = m_tmpSolverBodyPool.size();
b3SolverBody& solverBody = m_tmpSolverBodyPool.expand();
- initSolverBody(bodyIndex,&solverBody,&body);
+ initSolverBody(bodyIndex, &solverBody, &body);
solverBody.m_originalBodyIndex = bodyIndex;
}
- b3Assert(curIndex>=0);
+ b3Assert(curIndex >= 0);
return curIndex;
-
}
#include <stdio.h>
-
-void b3PgsJacobiSolver::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 b3PgsJacobiSolver::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)
{
-
- const b3Vector3& pos1 = cp.getPositionWorldOnA();
- const b3Vector3& pos2 = cp.getPositionWorldOnB();
+ const b3Vector3& pos1 = cp.getPositionWorldOnA();
+ const b3Vector3& pos2 = cp.getPositionWorldOnB();
- b3SolverBody* bodyA = &m_tmpSolverBodyPool[solverBodyIdA];
- b3SolverBody* bodyB = &m_tmpSolverBodyPool[solverBodyIdB];
+ b3SolverBody* bodyA = &m_tmpSolverBodyPool[solverBodyIdA];
+ b3SolverBody* bodyB = &m_tmpSolverBodyPool[solverBodyIdB];
- b3RigidBodyData* rb0 = &bodies[bodyA->m_originalBodyIndex];
- b3RigidBodyData* rb1 = &bodies[bodyB->m_originalBodyIndex];
+ b3RigidBodyData* rb0 = &bodies[bodyA->m_originalBodyIndex];
+ b3RigidBodyData* rb1 = &bodies[bodyB->m_originalBodyIndex];
-// b3Vector3 rel_pos1 = pos1 - colObj0->getWorldTransform().getOrigin();
-// b3Vector3 rel_pos2 = pos2 - colObj1->getWorldTransform().getOrigin();
- rel_pos1 = pos1 - bodyA->getWorldTransform().getOrigin();
- rel_pos2 = pos2 - bodyB->getWorldTransform().getOrigin();
+ // b3Vector3 rel_pos1 = pos1 - colObj0->getWorldTransform().getOrigin();
+ // b3Vector3 rel_pos2 = pos2 - colObj1->getWorldTransform().getOrigin();
+ rel_pos1 = pos1 - bodyA->getWorldTransform().getOrigin();
+ rel_pos2 = pos2 - bodyB->getWorldTransform().getOrigin();
- relaxation = 1.f;
+ relaxation = 1.f;
- b3Vector3 torqueAxis0 = rel_pos1.cross(cp.m_normalWorldOnB);
- solverConstraint.m_angularComponentA = rb0 ? getInvInertiaTensorWorld(&inertias[bodyA->m_originalBodyIndex])*torqueAxis0 : b3MakeVector3(0,0,0);
- b3Vector3 torqueAxis1 = rel_pos2.cross(cp.m_normalWorldOnB);
- solverConstraint.m_angularComponentB = rb1 ? getInvInertiaTensorWorld(&inertias[bodyB->m_originalBodyIndex])*-torqueAxis1 : b3MakeVector3(0,0,0);
+ b3Vector3 torqueAxis0 = rel_pos1.cross(cp.m_normalWorldOnB);
+ solverConstraint.m_angularComponentA = rb0 ? getInvInertiaTensorWorld(&inertias[bodyA->m_originalBodyIndex]) * torqueAxis0 : b3MakeVector3(0, 0, 0);
+ b3Vector3 torqueAxis1 = rel_pos2.cross(cp.m_normalWorldOnB);
+ solverConstraint.m_angularComponentB = rb1 ? getInvInertiaTensorWorld(&inertias[bodyB->m_originalBodyIndex]) * -torqueAxis1 : b3MakeVector3(0, 0, 0);
- b3Scalar scaledDenom;
- {
+ b3Scalar scaledDenom;
+ {
#ifdef COMPUTE_IMPULSE_DENOM
- b3Scalar denom0 = rb0->computeImpulseDenominator(pos1,cp.m_normalWorldOnB);
- b3Scalar denom1 = rb1->computeImpulseDenominator(pos2,cp.m_normalWorldOnB);
-#else
- b3Vector3 vec;
- b3Scalar denom0 = 0.f;
- b3Scalar denom1 = 0.f;
- if (rb0)
- {
- vec = ( solverConstraint.m_angularComponentA).cross(rel_pos1);
- denom0 = rb0->m_invMass + cp.m_normalWorldOnB.dot(vec);
- }
- if (rb1)
- {
- vec = ( -solverConstraint.m_angularComponentB).cross(rel_pos2);
- denom1 = rb1->m_invMass + cp.m_normalWorldOnB.dot(vec);
- }
-#endif //COMPUTE_IMPULSE_DENOM
-
-
- b3Scalar denom;
- if (m_usePgs)
- {
- scaledDenom = denom = relaxation/(denom0+denom1);
- } else
- {
- denom = relaxation/(denom0+denom1);
-
- b3Scalar countA = rb0->m_invMass? b3Scalar(m_bodyCount[bodyA->m_originalBodyIndex]) : 1.f;
- b3Scalar countB = rb1->m_invMass? b3Scalar(m_bodyCount[bodyB->m_originalBodyIndex]) : 1.f;
- scaledDenom = relaxation/(denom0*countA+denom1*countB);
- }
- solverConstraint.m_jacDiagABInv = denom;
- }
-
- solverConstraint.m_contactNormal = cp.m_normalWorldOnB;
- solverConstraint.m_relpos1CrossNormal = torqueAxis0;
- solverConstraint.m_relpos2CrossNormal = -torqueAxis1;
-
- b3Scalar restitution = 0.f;
- b3Scalar penetration = cp.getDistance()+infoGlobal.m_linearSlop;
-
- {
- b3Vector3 vel1,vel2;
+ b3Scalar denom0 = rb0->computeImpulseDenominator(pos1, cp.m_normalWorldOnB);
+ b3Scalar denom1 = rb1->computeImpulseDenominator(pos2, cp.m_normalWorldOnB);
+#else
+ b3Vector3 vec;
+ b3Scalar denom0 = 0.f;
+ b3Scalar denom1 = 0.f;
+ if (rb0)
+ {
+ vec = (solverConstraint.m_angularComponentA).cross(rel_pos1);
+ denom0 = rb0->m_invMass + cp.m_normalWorldOnB.dot(vec);
+ }
+ if (rb1)
+ {
+ vec = (-solverConstraint.m_angularComponentB).cross(rel_pos2);
+ denom1 = rb1->m_invMass + cp.m_normalWorldOnB.dot(vec);
+ }
+#endif //COMPUTE_IMPULSE_DENOM
- vel1 = rb0? getVelocityInLocalPoint(rb0,rel_pos1) : b3MakeVector3(0,0,0);
- vel2 = rb1? getVelocityInLocalPoint(rb1, rel_pos2) : b3MakeVector3(0,0,0);
+ b3Scalar denom;
+ if (m_usePgs)
+ {
+ scaledDenom = denom = relaxation / (denom0 + denom1);
+ }
+ else
+ {
+ denom = relaxation / (denom0 + denom1);
- // b3Vector3 vel2 = rb1 ? rb1->getVelocityInLocalPoint(rel_pos2) : b3Vector3(0,0,0);
- vel = vel1 - vel2;
- rel_vel = cp.m_normalWorldOnB.dot(vel);
+ b3Scalar countA = rb0->m_invMass ? b3Scalar(m_bodyCount[bodyA->m_originalBodyIndex]) : 1.f;
+ b3Scalar countB = rb1->m_invMass ? b3Scalar(m_bodyCount[bodyB->m_originalBodyIndex]) : 1.f;
+ scaledDenom = relaxation / (denom0 * countA + denom1 * countB);
+ }
+ solverConstraint.m_jacDiagABInv = denom;
+ }
-
+ solverConstraint.m_contactNormal = cp.m_normalWorldOnB;
+ solverConstraint.m_relpos1CrossNormal = torqueAxis0;
+ solverConstraint.m_relpos2CrossNormal = -torqueAxis1;
- solverConstraint.m_friction = cp.m_combinedFriction;
+ b3Scalar restitution = 0.f;
+ b3Scalar penetration = cp.getDistance() + infoGlobal.m_linearSlop;
-
- restitution = restitutionCurve(rel_vel, cp.m_combinedRestitution);
- if (restitution <= b3Scalar(0.))
- {
- restitution = 0.f;
- };
- }
+ {
+ b3Vector3 vel1, vel2;
+ vel1 = rb0 ? getVelocityInLocalPoint(rb0, rel_pos1) : b3MakeVector3(0, 0, 0);
+ vel2 = rb1 ? getVelocityInLocalPoint(rb1, rel_pos2) : b3MakeVector3(0, 0, 0);
- ///warm starting (or zero if disabled)
- if (infoGlobal.m_solverMode & B3_SOLVER_USE_WARMSTARTING)
- {
- solverConstraint.m_appliedImpulse = cp.m_appliedImpulse * infoGlobal.m_warmstartingFactor;
- if (rb0)
- bodyA->internalApplyImpulse(solverConstraint.m_contactNormal*bodyA->internalGetInvMass(),solverConstraint.m_angularComponentA,solverConstraint.m_appliedImpulse);
- if (rb1)
- bodyB->internalApplyImpulse(solverConstraint.m_contactNormal*bodyB->internalGetInvMass(),-solverConstraint.m_angularComponentB,-(b3Scalar)solverConstraint.m_appliedImpulse);
- } else
- {
- solverConstraint.m_appliedImpulse = 0.f;
- }
+ // b3Vector3 vel2 = rb1 ? rb1->getVelocityInLocalPoint(rel_pos2) : b3Vector3(0,0,0);
+ vel = vel1 - vel2;
+ rel_vel = cp.m_normalWorldOnB.dot(vel);
- solverConstraint.m_appliedPushImpulse = 0.f;
+ solverConstraint.m_friction = cp.m_combinedFriction;
- {
- b3Scalar vel1Dotn = solverConstraint.m_contactNormal.dot(rb0?bodyA->m_linearVelocity:b3MakeVector3(0,0,0))
- + solverConstraint.m_relpos1CrossNormal.dot(rb0?bodyA->m_angularVelocity:b3MakeVector3(0,0,0));
- b3Scalar vel2Dotn = -solverConstraint.m_contactNormal.dot(rb1?bodyB->m_linearVelocity:b3MakeVector3(0,0,0))
- + solverConstraint.m_relpos2CrossNormal.dot(rb1?bodyB->m_angularVelocity:b3MakeVector3(0,0,0));
- b3Scalar rel_vel = vel1Dotn+vel2Dotn;
-
- b3Scalar positionalError = 0.f;
- b3Scalar velocityError = restitution - rel_vel;// * damping;
-
-
- b3Scalar erp = infoGlobal.m_erp2;
- if (!infoGlobal.m_splitImpulse || (penetration > infoGlobal.m_splitImpulsePenetrationThreshold))
- {
- erp = infoGlobal.m_erp;
- }
+ restitution = restitutionCurve(rel_vel, cp.m_combinedRestitution);
+ if (restitution <= b3Scalar(0.))
+ {
+ restitution = 0.f;
+ };
+ }
- if (penetration>0)
- {
- positionalError = 0;
+ ///warm starting (or zero if disabled)
+ if (infoGlobal.m_solverMode & B3_SOLVER_USE_WARMSTARTING)
+ {
+ solverConstraint.m_appliedImpulse = cp.m_appliedImpulse * infoGlobal.m_warmstartingFactor;
+ if (rb0)
+ bodyA->internalApplyImpulse(solverConstraint.m_contactNormal * bodyA->internalGetInvMass(), solverConstraint.m_angularComponentA, solverConstraint.m_appliedImpulse);
+ if (rb1)
+ bodyB->internalApplyImpulse(solverConstraint.m_contactNormal * bodyB->internalGetInvMass(), -solverConstraint.m_angularComponentB, -(b3Scalar)solverConstraint.m_appliedImpulse);
+ }
+ else
+ {
+ solverConstraint.m_appliedImpulse = 0.f;
+ }
- velocityError -= penetration / infoGlobal.m_timeStep;
- } else
- {
- positionalError = -penetration * erp/infoGlobal.m_timeStep;
- }
+ solverConstraint.m_appliedPushImpulse = 0.f;
- b3Scalar penetrationImpulse = positionalError*scaledDenom;//solverConstraint.m_jacDiagABInv;
- b3Scalar velocityImpulse = velocityError *scaledDenom;//solverConstraint.m_jacDiagABInv;
+ {
+ b3Scalar vel1Dotn = solverConstraint.m_contactNormal.dot(rb0 ? bodyA->m_linearVelocity : b3MakeVector3(0, 0, 0)) + solverConstraint.m_relpos1CrossNormal.dot(rb0 ? bodyA->m_angularVelocity : b3MakeVector3(0, 0, 0));
+ b3Scalar vel2Dotn = -solverConstraint.m_contactNormal.dot(rb1 ? bodyB->m_linearVelocity : b3MakeVector3(0, 0, 0)) + solverConstraint.m_relpos2CrossNormal.dot(rb1 ? bodyB->m_angularVelocity : b3MakeVector3(0, 0, 0));
+ b3Scalar rel_vel = vel1Dotn + vel2Dotn;
- if (!infoGlobal.m_splitImpulse || (penetration > infoGlobal.m_splitImpulsePenetrationThreshold))
- {
- //combine position and velocity into rhs
- solverConstraint.m_rhs = penetrationImpulse+velocityImpulse;
- solverConstraint.m_rhsPenetration = 0.f;
+ b3Scalar positionalError = 0.f;
+ b3Scalar velocityError = restitution - rel_vel; // * damping;
- } else
- {
- //split position and velocity into rhs and m_rhsPenetration
- solverConstraint.m_rhs = velocityImpulse;
- solverConstraint.m_rhsPenetration = penetrationImpulse;
- }
- solverConstraint.m_cfm = 0.f;
- solverConstraint.m_lowerLimit = 0;
- solverConstraint.m_upperLimit = 1e10f;
- }
+ b3Scalar erp = infoGlobal.m_erp2;
+ if (!infoGlobal.m_splitImpulse || (penetration > infoGlobal.m_splitImpulsePenetrationThreshold))
+ {
+ erp = infoGlobal.m_erp;
+ }
+ if (penetration > 0)
+ {
+ positionalError = 0;
+ velocityError -= penetration / infoGlobal.m_timeStep;
+ }
+ else
+ {
+ positionalError = -penetration * erp / infoGlobal.m_timeStep;
+ }
+ b3Scalar penetrationImpulse = positionalError * scaledDenom; //solverConstraint.m_jacDiagABInv;
+ b3Scalar velocityImpulse = velocityError * scaledDenom; //solverConstraint.m_jacDiagABInv;
+ if (!infoGlobal.m_splitImpulse || (penetration > infoGlobal.m_splitImpulsePenetrationThreshold))
+ {
+ //combine position and velocity into rhs
+ solverConstraint.m_rhs = penetrationImpulse + velocityImpulse;
+ solverConstraint.m_rhsPenetration = 0.f;
+ }
+ else
+ {
+ //split position and velocity into rhs and m_rhsPenetration
+ solverConstraint.m_rhs = velocityImpulse;
+ solverConstraint.m_rhsPenetration = penetrationImpulse;
+ }
+ solverConstraint.m_cfm = 0.f;
+ solverConstraint.m_lowerLimit = 0;
+ solverConstraint.m_upperLimit = 1e10f;
+ }
}
-
-
-void b3PgsJacobiSolver::setFrictionConstraintImpulse( b3RigidBodyData* bodies, b3InertiaData* inertias,b3SolverConstraint& solverConstraint,
- int solverBodyIdA, int solverBodyIdB,
- b3ContactPoint& cp, const b3ContactSolverInfo& infoGlobal)
+void b3PgsJacobiSolver::setFrictionConstraintImpulse(b3RigidBodyData* bodies, b3InertiaData* inertias, b3SolverConstraint& solverConstraint,
+ int solverBodyIdA, int solverBodyIdB,
+ b3ContactPoint& cp, const b3ContactSolverInfo& infoGlobal)
{
-
b3SolverBody* bodyA = &m_tmpSolverBodyPool[solverBodyIdA];
b3SolverBody* bodyB = &m_tmpSolverBodyPool[solverBodyIdB];
-
{
b3SolverConstraint& frictionConstraint1 = m_tmpSolverContactFrictionConstraintPool[solverConstraint.m_frictionIndex];
if (infoGlobal.m_solverMode & B3_SOLVER_USE_WARMSTARTING)
{
frictionConstraint1.m_appliedImpulse = cp.m_appliedImpulseLateral1 * infoGlobal.m_warmstartingFactor;
if (bodies[bodyA->m_originalBodyIndex].m_invMass)
- bodyA->internalApplyImpulse(frictionConstraint1.m_contactNormal*bodies[bodyA->m_originalBodyIndex].m_invMass,frictionConstraint1.m_angularComponentA,frictionConstraint1.m_appliedImpulse);
+ bodyA->internalApplyImpulse(frictionConstraint1.m_contactNormal * bodies[bodyA->m_originalBodyIndex].m_invMass, frictionConstraint1.m_angularComponentA, frictionConstraint1.m_appliedImpulse);
if (bodies[bodyB->m_originalBodyIndex].m_invMass)
- bodyB->internalApplyImpulse(frictionConstraint1.m_contactNormal*bodies[bodyB->m_originalBodyIndex].m_invMass,-frictionConstraint1.m_angularComponentB,-(b3Scalar)frictionConstraint1.m_appliedImpulse);
- } else
+ bodyB->internalApplyImpulse(frictionConstraint1.m_contactNormal * bodies[bodyB->m_originalBodyIndex].m_invMass, -frictionConstraint1.m_angularComponentB, -(b3Scalar)frictionConstraint1.m_appliedImpulse);
+ }
+ else
{
frictionConstraint1.m_appliedImpulse = 0.f;
}
@@ -897,51 +828,45 @@ void b3PgsJacobiSolver::setFrictionConstraintImpulse( b3RigidBodyData* bodies, b
if ((infoGlobal.m_solverMode & B3_SOLVER_USE_2_FRICTION_DIRECTIONS))
{
- b3SolverConstraint& frictionConstraint2 = m_tmpSolverContactFrictionConstraintPool[solverConstraint.m_frictionIndex+1];
+ b3SolverConstraint& frictionConstraint2 = m_tmpSolverContactFrictionConstraintPool[solverConstraint.m_frictionIndex + 1];
if (infoGlobal.m_solverMode & B3_SOLVER_USE_WARMSTARTING)
{
- frictionConstraint2.m_appliedImpulse = cp.m_appliedImpulseLateral2 * infoGlobal.m_warmstartingFactor;
+ frictionConstraint2.m_appliedImpulse = cp.m_appliedImpulseLateral2 * infoGlobal.m_warmstartingFactor;
if (bodies[bodyA->m_originalBodyIndex].m_invMass)
- bodyA->internalApplyImpulse(frictionConstraint2.m_contactNormal*bodies[bodyA->m_originalBodyIndex].m_invMass,frictionConstraint2.m_angularComponentA,frictionConstraint2.m_appliedImpulse);
+ bodyA->internalApplyImpulse(frictionConstraint2.m_contactNormal * bodies[bodyA->m_originalBodyIndex].m_invMass, frictionConstraint2.m_angularComponentA, frictionConstraint2.m_appliedImpulse);
if (bodies[bodyB->m_originalBodyIndex].m_invMass)
- bodyB->internalApplyImpulse(frictionConstraint2.m_contactNormal*bodies[bodyB->m_originalBodyIndex].m_invMass,-frictionConstraint2.m_angularComponentB,-(b3Scalar)frictionConstraint2.m_appliedImpulse);
- } else
+ bodyB->internalApplyImpulse(frictionConstraint2.m_contactNormal * bodies[bodyB->m_originalBodyIndex].m_invMass, -frictionConstraint2.m_angularComponentB, -(b3Scalar)frictionConstraint2.m_appliedImpulse);
+ }
+ else
{
frictionConstraint2.m_appliedImpulse = 0.f;
}
}
}
-
-
-
-void b3PgsJacobiSolver::convertContact(b3RigidBodyData* bodies, b3InertiaData* inertias,b3Contact4* manifold,const b3ContactSolverInfo& infoGlobal)
+void b3PgsJacobiSolver::convertContact(b3RigidBodyData* bodies, b3InertiaData* inertias, b3Contact4* manifold, const b3ContactSolverInfo& infoGlobal)
{
- b3RigidBodyData* colObj0=0,*colObj1=0;
+ b3RigidBodyData *colObj0 = 0, *colObj1 = 0;
-
- int solverBodyIdA = getOrInitSolverBody(manifold->getBodyA(),bodies,inertias);
- int solverBodyIdB = getOrInitSolverBody(manifold->getBodyB(),bodies,inertias);
+ int solverBodyIdA = getOrInitSolverBody(manifold->getBodyA(), bodies, inertias);
+ int solverBodyIdB = getOrInitSolverBody(manifold->getBodyB(), bodies, inertias);
-// b3RigidBody* bodyA = b3RigidBody::upcast(colObj0);
-// b3RigidBody* bodyB = b3RigidBody::upcast(colObj1);
+ // b3RigidBody* bodyA = b3RigidBody::upcast(colObj0);
+ // b3RigidBody* bodyB = b3RigidBody::upcast(colObj1);
b3SolverBody* solverBodyA = &m_tmpSolverBodyPool[solverBodyIdA];
b3SolverBody* solverBodyB = &m_tmpSolverBodyPool[solverBodyIdB];
-
-
///avoid collision response between two static objects
if (solverBodyA->m_invMass.isZero() && solverBodyB->m_invMass.isZero())
return;
- int rollingFriction=1;
+ int rollingFriction = 1;
int numContacts = getNumContacts(manifold);
- for (int j=0;j<numContacts;j++)
+ for (int j = 0; j < numContacts; j++)
{
-
b3ContactPoint cp;
- getContactPoint(manifold,j,cp);
+ getContactPoint(manifold, j, cp);
if (cp.getDistance() <= getContactProcessingThreshold(manifold))
{
@@ -953,61 +878,60 @@ void b3PgsJacobiSolver::convertContact(b3RigidBodyData* bodies, b3InertiaData* i
int frictionIndex = m_tmpSolverContactConstraintPool.size();
b3SolverConstraint& solverConstraint = m_tmpSolverContactConstraintPool.expandNonInitializing();
-// b3RigidBody* rb0 = b3RigidBody::upcast(colObj0);
-// b3RigidBody* rb1 = b3RigidBody::upcast(colObj1);
+ // b3RigidBody* rb0 = b3RigidBody::upcast(colObj0);
+ // b3RigidBody* rb1 = b3RigidBody::upcast(colObj1);
solverConstraint.m_solverBodyIdA = solverBodyIdA;
solverConstraint.m_solverBodyIdB = solverBodyIdB;
solverConstraint.m_originalContactPoint = &cp;
- setupContactConstraint(bodies,inertias,solverConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal, vel, rel_vel, relaxation, rel_pos1, rel_pos2);
+ setupContactConstraint(bodies, inertias, solverConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal, vel, rel_vel, relaxation, rel_pos1, rel_pos2);
-// const b3Vector3& pos1 = cp.getPositionWorldOnA();
-// const b3Vector3& pos2 = cp.getPositionWorldOnB();
+ // const b3Vector3& pos1 = cp.getPositionWorldOnA();
+ // const b3Vector3& pos2 = cp.getPositionWorldOnB();
/////setup the friction constraints
solverConstraint.m_frictionIndex = m_tmpSolverContactFrictionConstraintPool.size();
- b3Vector3 angVelA,angVelB;
+ b3Vector3 angVelA, angVelB;
solverBodyA->getAngularVelocity(angVelA);
- solverBodyB->getAngularVelocity(angVelB);
- b3Vector3 relAngVel = angVelB-angVelA;
+ solverBodyB->getAngularVelocity(angVelB);
+ b3Vector3 relAngVel = angVelB - angVelA;
- if ((cp.m_combinedRollingFriction>0.f) && (rollingFriction>0))
+ if ((cp.m_combinedRollingFriction > 0.f) && (rollingFriction > 0))
{
//only a single rollingFriction per manifold
rollingFriction--;
- if (relAngVel.length()>infoGlobal.m_singleAxisRollingFrictionThreshold)
+ if (relAngVel.length() > infoGlobal.m_singleAxisRollingFrictionThreshold)
{
relAngVel.normalize();
- if (relAngVel.length()>0.001)
- addRollingFrictionConstraint(bodies,inertias,relAngVel,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
-
- } else
+ if (relAngVel.length() > 0.001)
+ addRollingFrictionConstraint(bodies, inertias, relAngVel, solverBodyIdA, solverBodyIdB, frictionIndex, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation);
+ }
+ else
{
- addRollingFrictionConstraint(bodies,inertias,cp.m_normalWorldOnB,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
- b3Vector3 axis0,axis1;
- b3PlaneSpace1(cp.m_normalWorldOnB,axis0,axis1);
- if (axis0.length()>0.001)
- addRollingFrictionConstraint(bodies,inertias,axis0,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
- if (axis1.length()>0.001)
- addRollingFrictionConstraint(bodies,inertias,axis1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
-
+ addRollingFrictionConstraint(bodies, inertias, cp.m_normalWorldOnB, solverBodyIdA, solverBodyIdB, frictionIndex, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation);
+ b3Vector3 axis0, axis1;
+ b3PlaneSpace1(cp.m_normalWorldOnB, axis0, axis1);
+ if (axis0.length() > 0.001)
+ addRollingFrictionConstraint(bodies, inertias, axis0, solverBodyIdA, solverBodyIdB, frictionIndex, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation);
+ if (axis1.length() > 0.001)
+ addRollingFrictionConstraint(bodies, inertias, axis1, solverBodyIdA, solverBodyIdB, frictionIndex, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation);
}
}
///Bullet has several options to set the friction directions
- ///By default, each contact has only a single friction direction that is recomputed automatically very frame
+ ///By default, each contact has only a single friction direction that is recomputed automatically very frame
///based on the relative linear velocity.
///If the relative velocity it zero, it will automatically compute a friction direction.
-
+
///You can also enable two friction directions, using the B3_SOLVER_USE_2_FRICTION_DIRECTIONS.
///In that case, the second friction direction will be orthogonal to both contact normal and first friction direction.
///
///If you choose B3_SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION, then the friction will be independent from the relative projected velocity.
///
- ///The user can manually override the friction directions for certain contacts using a contact callback,
+ ///The user can manually override the friction directions for certain contacts using a contact callback,
///and set the cp.m_lateralFrictionInitialized to true
///In that case, you can set the target relative motion in each friction direction (cp.m_contactMotion1 and cp.m_contactMotion2)
///this will give a conveyor belt effect
@@ -1018,99 +942,91 @@ void b3PgsJacobiSolver::convertContact(b3RigidBodyData* bodies, b3InertiaData* i
b3Scalar lat_rel_vel = cp.m_lateralFrictionDir1.length2();
if (!(infoGlobal.m_solverMode & B3_SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION) && lat_rel_vel > B3_EPSILON)
{
- cp.m_lateralFrictionDir1 *= 1.f/b3Sqrt(lat_rel_vel);
- if((infoGlobal.m_solverMode & B3_SOLVER_USE_2_FRICTION_DIRECTIONS))
+ cp.m_lateralFrictionDir1 *= 1.f / b3Sqrt(lat_rel_vel);
+ if ((infoGlobal.m_solverMode & B3_SOLVER_USE_2_FRICTION_DIRECTIONS))
{
cp.m_lateralFrictionDir2 = cp.m_lateralFrictionDir1.cross(cp.m_normalWorldOnB);
- cp.m_lateralFrictionDir2.normalize();//??
- addFrictionConstraint(bodies,inertias,cp.m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
-
+ cp.m_lateralFrictionDir2.normalize(); //??
+ addFrictionConstraint(bodies, inertias, cp.m_lateralFrictionDir2, solverBodyIdA, solverBodyIdB, frictionIndex, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation);
}
- addFrictionConstraint(bodies,inertias,cp.m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
-
- } else
+ addFrictionConstraint(bodies, inertias, cp.m_lateralFrictionDir1, solverBodyIdA, solverBodyIdB, frictionIndex, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation);
+ }
+ else
{
- b3PlaneSpace1(cp.m_normalWorldOnB,cp.m_lateralFrictionDir1,cp.m_lateralFrictionDir2);
+ b3PlaneSpace1(cp.m_normalWorldOnB, cp.m_lateralFrictionDir1, cp.m_lateralFrictionDir2);
if ((infoGlobal.m_solverMode & B3_SOLVER_USE_2_FRICTION_DIRECTIONS))
{
- addFrictionConstraint(bodies,inertias,cp.m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
+ addFrictionConstraint(bodies, inertias, cp.m_lateralFrictionDir2, solverBodyIdA, solverBodyIdB, frictionIndex, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation);
}
- addFrictionConstraint(bodies,inertias,cp.m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
+ addFrictionConstraint(bodies, inertias, cp.m_lateralFrictionDir1, solverBodyIdA, solverBodyIdB, frictionIndex, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation);
if ((infoGlobal.m_solverMode & B3_SOLVER_USE_2_FRICTION_DIRECTIONS) && (infoGlobal.m_solverMode & B3_SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION))
{
cp.m_lateralFrictionInitialized = true;
}
}
-
- } else
+ }
+ else
{
- addFrictionConstraint(bodies,inertias,cp.m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation,cp.m_contactMotion1, cp.m_contactCFM1);
+ addFrictionConstraint(bodies, inertias, cp.m_lateralFrictionDir1, solverBodyIdA, solverBodyIdB, frictionIndex, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, cp.m_contactMotion1, cp.m_contactCFM1);
if ((infoGlobal.m_solverMode & B3_SOLVER_USE_2_FRICTION_DIRECTIONS))
- addFrictionConstraint(bodies,inertias,cp.m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation, cp.m_contactMotion2, cp.m_contactCFM2);
+ addFrictionConstraint(bodies, inertias, cp.m_lateralFrictionDir2, solverBodyIdA, solverBodyIdB, frictionIndex, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, cp.m_contactMotion2, cp.m_contactCFM2);
- setFrictionConstraintImpulse( bodies,inertias,solverConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal);
+ setFrictionConstraintImpulse(bodies, inertias, solverConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal);
}
-
-
-
-
}
}
}
-b3Scalar b3PgsJacobiSolver::solveGroupCacheFriendlySetup(b3RigidBodyData* bodies, b3InertiaData* inertias, int numBodies, b3Contact4* manifoldPtr, int numManifolds,b3TypedConstraint** constraints,int numConstraints,const b3ContactSolverInfo& infoGlobal)
+b3Scalar b3PgsJacobiSolver::solveGroupCacheFriendlySetup(b3RigidBodyData* bodies, b3InertiaData* inertias, int numBodies, b3Contact4* manifoldPtr, int numManifolds, b3TypedConstraint** constraints, int numConstraints, const b3ContactSolverInfo& infoGlobal)
{
B3_PROFILE("solveGroupCacheFriendlySetup");
-
m_maxOverrideNumSolverIterations = 0;
-
-
m_tmpSolverBodyPool.resize(0);
-
-
+
m_bodyCount.resize(0);
- m_bodyCount.resize(numBodies,0);
+ m_bodyCount.resize(numBodies, 0);
m_bodyCountCheck.resize(0);
- m_bodyCountCheck.resize(numBodies,0);
-
+ m_bodyCountCheck.resize(numBodies, 0);
+
m_deltaLinearVelocities.resize(0);
- m_deltaLinearVelocities.resize(numBodies,b3MakeVector3(0,0,0));
+ m_deltaLinearVelocities.resize(numBodies, b3MakeVector3(0, 0, 0));
m_deltaAngularVelocities.resize(0);
- m_deltaAngularVelocities.resize(numBodies,b3MakeVector3(0,0,0));
-
+ m_deltaAngularVelocities.resize(numBodies, b3MakeVector3(0, 0, 0));
+
//int totalBodies = 0;
- for (int i=0;i<numConstraints;i++)
+ for (int i = 0; i < numConstraints; i++)
{
int bodyIndexA = constraints[i]->getRigidBodyA();
int bodyIndexB = constraints[i]->getRigidBodyB();
if (m_usePgs)
{
- m_bodyCount[bodyIndexA]=-1;
- m_bodyCount[bodyIndexB]=-1;
- } else
+ m_bodyCount[bodyIndexA] = -1;
+ m_bodyCount[bodyIndexB] = -1;
+ }
+ else
{
//didn't implement joints with Jacobi version yet
b3Assert(0);
}
-
}
- for (int i=0;i<numManifolds;i++)
+ for (int i = 0; i < numManifolds; i++)
{
int bodyIndexA = manifoldPtr[i].getBodyA();
int bodyIndexB = manifoldPtr[i].getBodyB();
if (m_usePgs)
{
- m_bodyCount[bodyIndexA]=-1;
- m_bodyCount[bodyIndexB]=-1;
- } else
+ m_bodyCount[bodyIndexA] = -1;
+ m_bodyCount[bodyIndexB] = -1;
+ }
+ else
{
if (bodies[bodyIndexA].m_invMass)
{
@@ -1118,26 +1034,23 @@ b3Scalar b3PgsJacobiSolver::solveGroupCacheFriendlySetup(b3RigidBodyData* bodies
m_bodyCount[bodyIndexA]++;
}
else
- m_bodyCount[bodyIndexA]=-1;
+ m_bodyCount[bodyIndexA] = -1;
if (bodies[bodyIndexB].m_invMass)
- // m_bodyCount[bodyIndexB]+=manifoldPtr[i].getNPoints();
+ // m_bodyCount[bodyIndexB]+=manifoldPtr[i].getNPoints();
m_bodyCount[bodyIndexB]++;
else
- m_bodyCount[bodyIndexB]=-1;
+ m_bodyCount[bodyIndexB] = -1;
}
-
}
-
-
if (1)
{
int j;
- for (j=0;j<numConstraints;j++)
+ for (j = 0; j < numConstraints; j++)
{
b3TypedConstraint* constraint = constraints[j];
-
+
constraint->internalSetAppliedImpulse(0.0f);
}
}
@@ -1146,13 +1059,12 @@ b3Scalar b3PgsJacobiSolver::solveGroupCacheFriendlySetup(b3RigidBodyData* bodies
//if (1)
{
{
-
int totalNumRows = 0;
int i;
-
+
m_tmpConstraintSizesPool.resizeNoInitialize(numConstraints);
//calculate the total number of contraint rows
- for (i=0;i<numConstraints;i++)
+ for (i = 0; i < numConstraints; i++)
{
b3TypedConstraint::b3ConstraintInfo1& info1 = m_tmpConstraintSizesPool[i];
b3JointFeedback* fb = constraints[i]->getJointFeedback();
@@ -1169,8 +1081,9 @@ b3Scalar b3PgsJacobiSolver::solveGroupCacheFriendlySetup(b3RigidBodyData* bodies
}
if (constraints[i]->isEnabled())
{
- constraints[i]->getInfo1(&info1,bodies);
- } else
+ constraints[i]->getInfo1(&info1, bodies);
+ }
+ else
{
info1.m_numConstraintRows = 0;
info1.nub = 0;
@@ -1179,45 +1092,40 @@ b3Scalar b3PgsJacobiSolver::solveGroupCacheFriendlySetup(b3RigidBodyData* bodies
}
m_tmpSolverNonContactConstraintPool.resizeNoInitialize(totalNumRows);
-
#ifndef DISABLE_JOINTS
///setup the b3SolverConstraints
int currentRow = 0;
- for (i=0;i<numConstraints;i++)
+ for (i = 0; i < numConstraints; i++)
{
const b3TypedConstraint::b3ConstraintInfo1& info1 = m_tmpConstraintSizesPool[i];
-
+
if (info1.m_numConstraintRows)
{
- b3Assert(currentRow<totalNumRows);
+ b3Assert(currentRow < totalNumRows);
b3SolverConstraint* currentConstraintRow = &m_tmpSolverNonContactConstraintPool[currentRow];
b3TypedConstraint* constraint = constraints[i];
- b3RigidBodyData& rbA = bodies[ constraint->getRigidBodyA()];
+ b3RigidBodyData& rbA = bodies[constraint->getRigidBodyA()];
//b3RigidBody& rbA = constraint->getRigidBodyA();
- // b3RigidBody& rbB = constraint->getRigidBodyB();
- b3RigidBodyData& rbB = bodies[ constraint->getRigidBodyB()];
-
- int solverBodyIdA = getOrInitSolverBody(constraint->getRigidBodyA(),bodies,inertias);
- int solverBodyIdB = getOrInitSolverBody(constraint->getRigidBodyB(),bodies,inertias);
-
- b3SolverBody* bodyAPtr = &m_tmpSolverBodyPool[solverBodyIdA];
- b3SolverBody* bodyBPtr = &m_tmpSolverBodyPool[solverBodyIdB];
-
+ // b3RigidBody& rbB = constraint->getRigidBodyB();
+ b3RigidBodyData& rbB = bodies[constraint->getRigidBodyB()];
+ int solverBodyIdA = getOrInitSolverBody(constraint->getRigidBodyA(), bodies, inertias);
+ int solverBodyIdB = getOrInitSolverBody(constraint->getRigidBodyB(), bodies, inertias);
+ b3SolverBody* bodyAPtr = &m_tmpSolverBodyPool[solverBodyIdA];
+ b3SolverBody* bodyBPtr = &m_tmpSolverBodyPool[solverBodyIdB];
int overrideNumSolverIterations = constraint->getOverrideNumSolverIterations() > 0 ? constraint->getOverrideNumSolverIterations() : infoGlobal.m_numIterations;
- if (overrideNumSolverIterations>m_maxOverrideNumSolverIterations)
+ if (overrideNumSolverIterations > m_maxOverrideNumSolverIterations)
m_maxOverrideNumSolverIterations = overrideNumSolverIterations;
-
int j;
- for ( j=0;j<info1.m_numConstraintRows;j++)
+ for (j = 0; j < info1.m_numConstraintRows; j++)
{
- memset(&currentConstraintRow[j],0,sizeof(b3SolverConstraint));
+ memset(&currentConstraintRow[j], 0, sizeof(b3SolverConstraint));
currentConstraintRow[j].m_lowerLimit = -B3_INFINITY;
currentConstraintRow[j].m_upperLimit = B3_INFINITY;
currentConstraintRow[j].m_appliedImpulse = 0.f;
@@ -1227,26 +1135,25 @@ b3Scalar b3PgsJacobiSolver::solveGroupCacheFriendlySetup(b3RigidBodyData* bodies
currentConstraintRow[j].m_overrideNumSolverIterations = overrideNumSolverIterations;
}
- bodyAPtr->internalGetDeltaLinearVelocity().setValue(0.f,0.f,0.f);
- bodyAPtr->internalGetDeltaAngularVelocity().setValue(0.f,0.f,0.f);
- bodyAPtr->internalGetPushVelocity().setValue(0.f,0.f,0.f);
- bodyAPtr->internalGetTurnVelocity().setValue(0.f,0.f,0.f);
- bodyBPtr->internalGetDeltaLinearVelocity().setValue(0.f,0.f,0.f);
- bodyBPtr->internalGetDeltaAngularVelocity().setValue(0.f,0.f,0.f);
- bodyBPtr->internalGetPushVelocity().setValue(0.f,0.f,0.f);
- bodyBPtr->internalGetTurnVelocity().setValue(0.f,0.f,0.f);
-
+ bodyAPtr->internalGetDeltaLinearVelocity().setValue(0.f, 0.f, 0.f);
+ bodyAPtr->internalGetDeltaAngularVelocity().setValue(0.f, 0.f, 0.f);
+ bodyAPtr->internalGetPushVelocity().setValue(0.f, 0.f, 0.f);
+ bodyAPtr->internalGetTurnVelocity().setValue(0.f, 0.f, 0.f);
+ bodyBPtr->internalGetDeltaLinearVelocity().setValue(0.f, 0.f, 0.f);
+ bodyBPtr->internalGetDeltaAngularVelocity().setValue(0.f, 0.f, 0.f);
+ bodyBPtr->internalGetPushVelocity().setValue(0.f, 0.f, 0.f);
+ bodyBPtr->internalGetTurnVelocity().setValue(0.f, 0.f, 0.f);
b3TypedConstraint::b3ConstraintInfo2 info2;
- info2.fps = 1.f/infoGlobal.m_timeStep;
+ info2.fps = 1.f / infoGlobal.m_timeStep;
info2.erp = infoGlobal.m_erp;
info2.m_J1linearAxis = currentConstraintRow->m_contactNormal;
info2.m_J1angularAxis = currentConstraintRow->m_relpos1CrossNormal;
info2.m_J2linearAxis = 0;
info2.m_J2angularAxis = currentConstraintRow->m_relpos2CrossNormal;
- info2.rowskip = sizeof(b3SolverConstraint)/sizeof(b3Scalar);//check this
- ///the size of b3SolverConstraint needs be a multiple of b3Scalar
- b3Assert(info2.rowskip*sizeof(b3Scalar)== sizeof(b3SolverConstraint));
+ info2.rowskip = sizeof(b3SolverConstraint) / sizeof(b3Scalar); //check this
+ ///the size of b3SolverConstraint needs be a multiple of b3Scalar
+ b3Assert(info2.rowskip * sizeof(b3Scalar) == sizeof(b3SolverConstraint));
info2.m_constraintError = &currentConstraintRow->m_rhs;
currentConstraintRow->m_cfm = infoGlobal.m_globalCfm;
info2.m_damping = infoGlobal.m_damping;
@@ -1254,47 +1161,45 @@ b3Scalar b3PgsJacobiSolver::solveGroupCacheFriendlySetup(b3RigidBodyData* bodies
info2.m_lowerLimit = &currentConstraintRow->m_lowerLimit;
info2.m_upperLimit = &currentConstraintRow->m_upperLimit;
info2.m_numIterations = infoGlobal.m_numIterations;
- constraints[i]->getInfo2(&info2,bodies);
+ constraints[i]->getInfo2(&info2, bodies);
///finalize the constraint setup
- for ( j=0;j<info1.m_numConstraintRows;j++)
+ for (j = 0; j < info1.m_numConstraintRows; j++)
{
b3SolverConstraint& solverConstraint = currentConstraintRow[j];
- if (solverConstraint.m_upperLimit>=constraints[i]->getBreakingImpulseThreshold())
+ if (solverConstraint.m_upperLimit >= constraints[i]->getBreakingImpulseThreshold())
{
solverConstraint.m_upperLimit = constraints[i]->getBreakingImpulseThreshold();
}
- if (solverConstraint.m_lowerLimit<=-constraints[i]->getBreakingImpulseThreshold())
+ if (solverConstraint.m_lowerLimit <= -constraints[i]->getBreakingImpulseThreshold())
{
solverConstraint.m_lowerLimit = -constraints[i]->getBreakingImpulseThreshold();
}
solverConstraint.m_originalContactPoint = constraint;
-
- b3Matrix3x3& invInertiaWorldA= inertias[constraint->getRigidBodyA()].m_invInertiaWorld;
- {
+ b3Matrix3x3& invInertiaWorldA = inertias[constraint->getRigidBodyA()].m_invInertiaWorld;
+ {
//b3Vector3 angularFactorA(1,1,1);
const b3Vector3& ftorqueAxis1 = solverConstraint.m_relpos1CrossNormal;
- solverConstraint.m_angularComponentA = invInertiaWorldA*ftorqueAxis1;//*angularFactorA;
+ solverConstraint.m_angularComponentA = invInertiaWorldA * ftorqueAxis1; //*angularFactorA;
}
-
- b3Matrix3x3& invInertiaWorldB= inertias[constraint->getRigidBodyB()].m_invInertiaWorld;
- {
+ b3Matrix3x3& invInertiaWorldB = inertias[constraint->getRigidBodyB()].m_invInertiaWorld;
+ {
const b3Vector3& ftorqueAxis2 = solverConstraint.m_relpos2CrossNormal;
- solverConstraint.m_angularComponentB = invInertiaWorldB*ftorqueAxis2;//*constraint->getRigidBodyB().getAngularFactor();
+ solverConstraint.m_angularComponentB = invInertiaWorldB * ftorqueAxis2; //*constraint->getRigidBodyB().getAngularFactor();
}
{
//it is ok to use solverConstraint.m_contactNormal instead of -solverConstraint.m_contactNormal
//because it gets multiplied iMJlB
- b3Vector3 iMJlA = solverConstraint.m_contactNormal*rbA.m_invMass;
- b3Vector3 iMJaA = invInertiaWorldA*solverConstraint.m_relpos1CrossNormal;
- b3Vector3 iMJlB = solverConstraint.m_contactNormal*rbB.m_invMass;//sign of normal?
- b3Vector3 iMJaB = invInertiaWorldB*solverConstraint.m_relpos2CrossNormal;
+ b3Vector3 iMJlA = solverConstraint.m_contactNormal * rbA.m_invMass;
+ b3Vector3 iMJaA = invInertiaWorldA * solverConstraint.m_relpos1CrossNormal;
+ b3Vector3 iMJlB = solverConstraint.m_contactNormal * rbB.m_invMass; //sign of normal?
+ b3Vector3 iMJaB = invInertiaWorldB * solverConstraint.m_relpos2CrossNormal;
b3Scalar sum = iMJlA.dot(solverConstraint.m_contactNormal);
sum += iMJaA.dot(solverConstraint.m_relpos1CrossNormal);
@@ -1302,10 +1207,9 @@ b3Scalar b3PgsJacobiSolver::solveGroupCacheFriendlySetup(b3RigidBodyData* bodies
sum += iMJaB.dot(solverConstraint.m_relpos2CrossNormal);
b3Scalar fsum = b3Fabs(sum);
b3Assert(fsum > B3_EPSILON);
- solverConstraint.m_jacDiagABInv = fsum>B3_EPSILON?b3Scalar(1.)/sum : 0.f;
+ solverConstraint.m_jacDiagABInv = fsum > B3_EPSILON ? b3Scalar(1.) / sum : 0.f;
}
-
///fix rhs
///todo: add force/torque accelerators
{
@@ -1313,38 +1217,35 @@ b3Scalar b3PgsJacobiSolver::solveGroupCacheFriendlySetup(b3RigidBodyData* bodies
b3Scalar vel1Dotn = solverConstraint.m_contactNormal.dot(rbA.m_linVel) + solverConstraint.m_relpos1CrossNormal.dot(rbA.m_angVel);
b3Scalar vel2Dotn = -solverConstraint.m_contactNormal.dot(rbB.m_linVel) + solverConstraint.m_relpos2CrossNormal.dot(rbB.m_angVel);
- rel_vel = vel1Dotn+vel2Dotn;
+ rel_vel = vel1Dotn + vel2Dotn;
b3Scalar restitution = 0.f;
- b3Scalar positionalError = solverConstraint.m_rhs;//already filled in by getConstraintInfo2
- b3Scalar velocityError = restitution - rel_vel * info2.m_damping;
- b3Scalar penetrationImpulse = positionalError*solverConstraint.m_jacDiagABInv;
- b3Scalar velocityImpulse = velocityError *solverConstraint.m_jacDiagABInv;
- solverConstraint.m_rhs = penetrationImpulse+velocityImpulse;
+ b3Scalar positionalError = solverConstraint.m_rhs; //already filled in by getConstraintInfo2
+ b3Scalar velocityError = restitution - rel_vel * info2.m_damping;
+ b3Scalar penetrationImpulse = positionalError * solverConstraint.m_jacDiagABInv;
+ b3Scalar velocityImpulse = velocityError * solverConstraint.m_jacDiagABInv;
+ solverConstraint.m_rhs = penetrationImpulse + velocityImpulse;
solverConstraint.m_appliedImpulse = 0.f;
-
}
}
}
- currentRow+=m_tmpConstraintSizesPool[i].m_numConstraintRows;
+ currentRow += m_tmpConstraintSizesPool[i].m_numConstraintRows;
}
-#endif //DISABLE_JOINTS
+#endif //DISABLE_JOINTS
}
-
{
int i;
- for (i=0;i<numManifolds;i++)
+ for (i = 0; i < numManifolds; i++)
{
b3Contact4& manifold = manifoldPtr[i];
- convertContact(bodies,inertias,&manifold,infoGlobal);
+ convertContact(bodies, inertias, &manifold, infoGlobal);
}
}
}
-// b3ContactSolverInfo info = infoGlobal;
-
+ // b3ContactSolverInfo info = infoGlobal;
int numNonContactPool = m_tmpSolverNonContactConstraintPool.size();
int numConstraintPool = m_tmpSolverContactConstraintPool.size();
@@ -1353,64 +1254,63 @@ b3Scalar b3PgsJacobiSolver::solveGroupCacheFriendlySetup(b3RigidBodyData* bodies
///@todo: use stack allocator for such temporarily memory, same for solver bodies/constraints
m_orderNonContactConstraintPool.resizeNoInitialize(numNonContactPool);
if ((infoGlobal.m_solverMode & B3_SOLVER_USE_2_FRICTION_DIRECTIONS))
- m_orderTmpConstraintPool.resizeNoInitialize(numConstraintPool*2);
+ m_orderTmpConstraintPool.resizeNoInitialize(numConstraintPool * 2);
else
m_orderTmpConstraintPool.resizeNoInitialize(numConstraintPool);
m_orderFrictionConstraintPool.resizeNoInitialize(numFrictionPool);
{
int i;
- for (i=0;i<numNonContactPool;i++)
+ for (i = 0; i < numNonContactPool; i++)
{
m_orderNonContactConstraintPool[i] = i;
}
- for (i=0;i<numConstraintPool;i++)
+ for (i = 0; i < numConstraintPool; i++)
{
m_orderTmpConstraintPool[i] = i;
}
- for (i=0;i<numFrictionPool;i++)
+ for (i = 0; i < numFrictionPool; i++)
{
m_orderFrictionConstraintPool[i] = i;
}
}
return 0.f;
-
}
-
-b3Scalar b3PgsJacobiSolver::solveSingleIteration(int iteration,b3TypedConstraint** constraints,int numConstraints,const b3ContactSolverInfo& infoGlobal)
+b3Scalar b3PgsJacobiSolver::solveSingleIteration(int iteration, b3TypedConstraint** constraints, int numConstraints, const b3ContactSolverInfo& infoGlobal)
{
-
int numNonContactPool = m_tmpSolverNonContactConstraintPool.size();
int numConstraintPool = m_tmpSolverContactConstraintPool.size();
int numFrictionPool = m_tmpSolverContactFrictionConstraintPool.size();
-
+
if (infoGlobal.m_solverMode & B3_SOLVER_RANDMIZE_ORDER)
{
- if (1) // uncomment this for a bit less random ((iteration & 7) == 0)
+ if (1) // uncomment this for a bit less random ((iteration & 7) == 0)
{
-
- for (int j=0; j<numNonContactPool; ++j) {
+ for (int j = 0; j < numNonContactPool; ++j)
+ {
int tmp = m_orderNonContactConstraintPool[j];
- int swapi = b3RandInt2(j+1);
+ int swapi = b3RandInt2(j + 1);
m_orderNonContactConstraintPool[j] = m_orderNonContactConstraintPool[swapi];
m_orderNonContactConstraintPool[swapi] = tmp;
}
- //contact/friction constraints are not solved more than
- if (iteration< infoGlobal.m_numIterations)
+ //contact/friction constraints are not solved more than
+ if (iteration < infoGlobal.m_numIterations)
{
- for (int j=0; j<numConstraintPool; ++j) {
+ for (int j = 0; j < numConstraintPool; ++j)
+ {
int tmp = m_orderTmpConstraintPool[j];
- int swapi = b3RandInt2(j+1);
+ int swapi = b3RandInt2(j + 1);
m_orderTmpConstraintPool[j] = m_orderTmpConstraintPool[swapi];
m_orderTmpConstraintPool[swapi] = tmp;
}
- for (int j=0; j<numFrictionPool; ++j) {
+ for (int j = 0; j < numFrictionPool; ++j)
+ {
int tmp = m_orderFrictionConstraintPool[j];
- int swapi = b3RandInt2(j+1);
+ int swapi = b3RandInt2(j + 1);
m_orderFrictionConstraintPool[j] = m_orderFrictionConstraintPool[swapi];
m_orderFrictionConstraintPool[swapi] = tmp;
}
@@ -1421,173 +1321,163 @@ b3Scalar b3PgsJacobiSolver::solveSingleIteration(int iteration,b3TypedConstraint
if (infoGlobal.m_solverMode & B3_SOLVER_SIMD)
{
///solve all joint constraints, using SIMD, if available
- for (int j=0;j<m_tmpSolverNonContactConstraintPool.size();j++)
+ for (int j = 0; j < m_tmpSolverNonContactConstraintPool.size(); j++)
{
b3SolverConstraint& constraint = m_tmpSolverNonContactConstraintPool[m_orderNonContactConstraintPool[j]];
if (iteration < constraint.m_overrideNumSolverIterations)
- resolveSingleConstraintRowGenericSIMD(m_tmpSolverBodyPool[constraint.m_solverBodyIdA],m_tmpSolverBodyPool[constraint.m_solverBodyIdB],constraint);
+ resolveSingleConstraintRowGenericSIMD(m_tmpSolverBodyPool[constraint.m_solverBodyIdA], m_tmpSolverBodyPool[constraint.m_solverBodyIdB], constraint);
}
- if (iteration< infoGlobal.m_numIterations)
+ if (iteration < infoGlobal.m_numIterations)
{
-
///solve all contact constraints using SIMD, if available
if (infoGlobal.m_solverMode & B3_SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS)
{
int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
- int multiplier = (infoGlobal.m_solverMode & B3_SOLVER_USE_2_FRICTION_DIRECTIONS)? 2 : 1;
+ int multiplier = (infoGlobal.m_solverMode & B3_SOLVER_USE_2_FRICTION_DIRECTIONS) ? 2 : 1;
- for (int c=0;c<numPoolConstraints;c++)
+ for (int c = 0; c < numPoolConstraints; c++)
{
- b3Scalar totalImpulse =0;
+ b3Scalar totalImpulse = 0;
{
const b3SolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[m_orderTmpConstraintPool[c]];
- resolveSingleConstraintRowLowerLimitSIMD(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
+ resolveSingleConstraintRowLowerLimitSIMD(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA], m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB], solveManifold);
totalImpulse = solveManifold.m_appliedImpulse;
}
bool applyFriction = true;
if (applyFriction)
{
{
+ b3SolverConstraint& solveManifold = m_tmpSolverContactFrictionConstraintPool[m_orderFrictionConstraintPool[c * multiplier]];
- b3SolverConstraint& solveManifold = m_tmpSolverContactFrictionConstraintPool[m_orderFrictionConstraintPool[c*multiplier]];
-
- if (totalImpulse>b3Scalar(0))
+ if (totalImpulse > b3Scalar(0))
{
- solveManifold.m_lowerLimit = -(solveManifold.m_friction*totalImpulse);
- solveManifold.m_upperLimit = solveManifold.m_friction*totalImpulse;
+ solveManifold.m_lowerLimit = -(solveManifold.m_friction * totalImpulse);
+ solveManifold.m_upperLimit = solveManifold.m_friction * totalImpulse;
- resolveSingleConstraintRowGenericSIMD(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
+ resolveSingleConstraintRowGenericSIMD(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA], m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB], solveManifold);
}
}
if (infoGlobal.m_solverMode & B3_SOLVER_USE_2_FRICTION_DIRECTIONS)
{
+ b3SolverConstraint& solveManifold = m_tmpSolverContactFrictionConstraintPool[m_orderFrictionConstraintPool[c * multiplier + 1]];
- b3SolverConstraint& solveManifold = m_tmpSolverContactFrictionConstraintPool[m_orderFrictionConstraintPool[c*multiplier+1]];
-
- if (totalImpulse>b3Scalar(0))
+ if (totalImpulse > b3Scalar(0))
{
- solveManifold.m_lowerLimit = -(solveManifold.m_friction*totalImpulse);
- solveManifold.m_upperLimit = solveManifold.m_friction*totalImpulse;
+ solveManifold.m_lowerLimit = -(solveManifold.m_friction * totalImpulse);
+ solveManifold.m_upperLimit = solveManifold.m_friction * totalImpulse;
- resolveSingleConstraintRowGenericSIMD(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
+ resolveSingleConstraintRowGenericSIMD(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA], m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB], solveManifold);
}
}
}
}
-
}
- else//B3_SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS
+ else //B3_SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS
{
//solve the friction constraints after all contact constraints, don't interleave them
int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
int j;
- for (j=0;j<numPoolConstraints;j++)
+ for (j = 0; j < numPoolConstraints; j++)
{
const b3SolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[m_orderTmpConstraintPool[j]];
- resolveSingleConstraintRowLowerLimitSIMD(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
-
+ resolveSingleConstraintRowLowerLimitSIMD(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA], m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB], solveManifold);
}
if (!m_usePgs)
averageVelocities();
-
///solve all friction constraints, using SIMD, if available
int numFrictionPoolConstraints = m_tmpSolverContactFrictionConstraintPool.size();
- for (j=0;j<numFrictionPoolConstraints;j++)
+ for (j = 0; j < numFrictionPoolConstraints; j++)
{
b3SolverConstraint& solveManifold = m_tmpSolverContactFrictionConstraintPool[m_orderFrictionConstraintPool[j]];
b3Scalar totalImpulse = m_tmpSolverContactConstraintPool[solveManifold.m_frictionIndex].m_appliedImpulse;
- if (totalImpulse>b3Scalar(0))
+ if (totalImpulse > b3Scalar(0))
{
- solveManifold.m_lowerLimit = -(solveManifold.m_friction*totalImpulse);
- solveManifold.m_upperLimit = solveManifold.m_friction*totalImpulse;
+ solveManifold.m_lowerLimit = -(solveManifold.m_friction * totalImpulse);
+ solveManifold.m_upperLimit = solveManifold.m_friction * totalImpulse;
- resolveSingleConstraintRowGenericSIMD(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
+ resolveSingleConstraintRowGenericSIMD(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA], m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB], solveManifold);
}
}
-
int numRollingFrictionPoolConstraints = m_tmpSolverContactRollingFrictionConstraintPool.size();
- for (j=0;j<numRollingFrictionPoolConstraints;j++)
+ for (j = 0; j < numRollingFrictionPoolConstraints; j++)
{
-
b3SolverConstraint& rollingFrictionConstraint = m_tmpSolverContactRollingFrictionConstraintPool[j];
b3Scalar totalImpulse = m_tmpSolverContactConstraintPool[rollingFrictionConstraint.m_frictionIndex].m_appliedImpulse;
- if (totalImpulse>b3Scalar(0))
+ if (totalImpulse > b3Scalar(0))
{
- b3Scalar rollingFrictionMagnitude = rollingFrictionConstraint.m_friction*totalImpulse;
- if (rollingFrictionMagnitude>rollingFrictionConstraint.m_friction)
+ b3Scalar rollingFrictionMagnitude = rollingFrictionConstraint.m_friction * totalImpulse;
+ if (rollingFrictionMagnitude > rollingFrictionConstraint.m_friction)
rollingFrictionMagnitude = rollingFrictionConstraint.m_friction;
rollingFrictionConstraint.m_lowerLimit = -rollingFrictionMagnitude;
rollingFrictionConstraint.m_upperLimit = rollingFrictionMagnitude;
- resolveSingleConstraintRowGenericSIMD(m_tmpSolverBodyPool[rollingFrictionConstraint.m_solverBodyIdA],m_tmpSolverBodyPool[rollingFrictionConstraint.m_solverBodyIdB],rollingFrictionConstraint);
+ resolveSingleConstraintRowGenericSIMD(m_tmpSolverBodyPool[rollingFrictionConstraint.m_solverBodyIdA], m_tmpSolverBodyPool[rollingFrictionConstraint.m_solverBodyIdB], rollingFrictionConstraint);
}
}
-
-
- }
+ }
}
- } else
+ }
+ else
{
//non-SIMD version
///solve all joint constraints
- for (int j=0;j<m_tmpSolverNonContactConstraintPool.size();j++)
+ for (int j = 0; j < m_tmpSolverNonContactConstraintPool.size(); j++)
{
b3SolverConstraint& constraint = m_tmpSolverNonContactConstraintPool[m_orderNonContactConstraintPool[j]];
if (iteration < constraint.m_overrideNumSolverIterations)
- resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[constraint.m_solverBodyIdA],m_tmpSolverBodyPool[constraint.m_solverBodyIdB],constraint);
+ resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[constraint.m_solverBodyIdA], m_tmpSolverBodyPool[constraint.m_solverBodyIdB], constraint);
}
- if (iteration< infoGlobal.m_numIterations)
+ if (iteration < infoGlobal.m_numIterations)
{
-
///solve all contact constraints
int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
- for (int j=0;j<numPoolConstraints;j++)
+ for (int j = 0; j < numPoolConstraints; j++)
{
const b3SolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[m_orderTmpConstraintPool[j]];
- resolveSingleConstraintRowLowerLimit(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
+ resolveSingleConstraintRowLowerLimit(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA], m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB], solveManifold);
}
///solve all friction constraints
int numFrictionPoolConstraints = m_tmpSolverContactFrictionConstraintPool.size();
- for (int j=0;j<numFrictionPoolConstraints;j++)
+ for (int j = 0; j < numFrictionPoolConstraints; j++)
{
b3SolverConstraint& solveManifold = m_tmpSolverContactFrictionConstraintPool[m_orderFrictionConstraintPool[j]];
b3Scalar totalImpulse = m_tmpSolverContactConstraintPool[solveManifold.m_frictionIndex].m_appliedImpulse;
- if (totalImpulse>b3Scalar(0))
+ if (totalImpulse > b3Scalar(0))
{
- solveManifold.m_lowerLimit = -(solveManifold.m_friction*totalImpulse);
- solveManifold.m_upperLimit = solveManifold.m_friction*totalImpulse;
+ solveManifold.m_lowerLimit = -(solveManifold.m_friction * totalImpulse);
+ solveManifold.m_upperLimit = solveManifold.m_friction * totalImpulse;
- resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
+ resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA], m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB], solveManifold);
}
}
int numRollingFrictionPoolConstraints = m_tmpSolverContactRollingFrictionConstraintPool.size();
- for (int j=0;j<numRollingFrictionPoolConstraints;j++)
+ for (int j = 0; j < numRollingFrictionPoolConstraints; j++)
{
b3SolverConstraint& rollingFrictionConstraint = m_tmpSolverContactRollingFrictionConstraintPool[j];
b3Scalar totalImpulse = m_tmpSolverContactConstraintPool[rollingFrictionConstraint.m_frictionIndex].m_appliedImpulse;
- if (totalImpulse>b3Scalar(0))
+ if (totalImpulse > b3Scalar(0))
{
- b3Scalar rollingFrictionMagnitude = rollingFrictionConstraint.m_friction*totalImpulse;
- if (rollingFrictionMagnitude>rollingFrictionConstraint.m_friction)
+ b3Scalar rollingFrictionMagnitude = rollingFrictionConstraint.m_friction * totalImpulse;
+ if (rollingFrictionMagnitude > rollingFrictionConstraint.m_friction)
rollingFrictionMagnitude = rollingFrictionConstraint.m_friction;
rollingFrictionConstraint.m_lowerLimit = -rollingFrictionMagnitude;
rollingFrictionConstraint.m_upperLimit = rollingFrictionMagnitude;
- resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[rollingFrictionConstraint.m_solverBodyIdA],m_tmpSolverBodyPool[rollingFrictionConstraint.m_solverBodyIdB],rollingFrictionConstraint);
+ resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[rollingFrictionConstraint.m_solverBodyIdA], m_tmpSolverBodyPool[rollingFrictionConstraint.m_solverBodyIdB], rollingFrictionConstraint);
}
}
}
@@ -1595,40 +1485,39 @@ b3Scalar b3PgsJacobiSolver::solveSingleIteration(int iteration,b3TypedConstraint
return 0.f;
}
-
-void b3PgsJacobiSolver::solveGroupCacheFriendlySplitImpulseIterations(b3TypedConstraint** constraints,int numConstraints,const b3ContactSolverInfo& infoGlobal)
+void b3PgsJacobiSolver::solveGroupCacheFriendlySplitImpulseIterations(b3TypedConstraint** constraints, int numConstraints, const b3ContactSolverInfo& infoGlobal)
{
int iteration;
if (infoGlobal.m_splitImpulse)
{
if (infoGlobal.m_solverMode & B3_SOLVER_SIMD)
{
- for ( iteration = 0;iteration<infoGlobal.m_numIterations;iteration++)
+ for (iteration = 0; iteration < infoGlobal.m_numIterations; iteration++)
{
{
int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
int j;
- for (j=0;j<numPoolConstraints;j++)
+ for (j = 0; j < numPoolConstraints; j++)
{
const b3SolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[m_orderTmpConstraintPool[j]];
- resolveSplitPenetrationSIMD(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
+ resolveSplitPenetrationSIMD(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA], m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB], solveManifold);
}
}
}
}
else
{
- for ( iteration = 0;iteration<infoGlobal.m_numIterations;iteration++)
+ for (iteration = 0; iteration < infoGlobal.m_numIterations; iteration++)
{
{
int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
int j;
- for (j=0;j<numPoolConstraints;j++)
+ for (j = 0; j < numPoolConstraints; j++)
{
const b3SolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[m_orderTmpConstraintPool[j]];
- resolveSplitPenetrationImpulseCacheFriendly(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
+ resolveSplitPenetrationImpulseCacheFriendly(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA], m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB], solveManifold);
}
}
}
@@ -1636,100 +1525,95 @@ void b3PgsJacobiSolver::solveGroupCacheFriendlySplitImpulseIterations(b3TypedCon
}
}
-b3Scalar b3PgsJacobiSolver::solveGroupCacheFriendlyIterations(b3TypedConstraint** constraints,int numConstraints,const b3ContactSolverInfo& infoGlobal)
+b3Scalar b3PgsJacobiSolver::solveGroupCacheFriendlyIterations(b3TypedConstraint** constraints, int numConstraints, const b3ContactSolverInfo& infoGlobal)
{
B3_PROFILE("solveGroupCacheFriendlyIterations");
{
///this is a special step to resolve penetrations (just for contacts)
- solveGroupCacheFriendlySplitImpulseIterations(constraints,numConstraints,infoGlobal);
+ solveGroupCacheFriendlySplitImpulseIterations(constraints, numConstraints, infoGlobal);
- int maxIterations = m_maxOverrideNumSolverIterations > infoGlobal.m_numIterations? m_maxOverrideNumSolverIterations : infoGlobal.m_numIterations;
+ int maxIterations = m_maxOverrideNumSolverIterations > infoGlobal.m_numIterations ? m_maxOverrideNumSolverIterations : infoGlobal.m_numIterations;
- for ( int iteration = 0 ; iteration< maxIterations ; iteration++)
+ for (int iteration = 0; iteration < maxIterations; iteration++)
//for ( int iteration = maxIterations-1 ; iteration >= 0;iteration--)
- {
-
- solveSingleIteration(iteration, constraints,numConstraints,infoGlobal);
-
+ {
+ solveSingleIteration(iteration, constraints, numConstraints, infoGlobal);
if (!m_usePgs)
{
averageVelocities();
}
}
-
}
return 0.f;
}
-void b3PgsJacobiSolver::averageVelocities()
+void b3PgsJacobiSolver::averageVelocities()
{
B3_PROFILE("averaging");
//average the velocities
int numBodies = m_bodyCount.size();
m_deltaLinearVelocities.resize(0);
- m_deltaLinearVelocities.resize(numBodies,b3MakeVector3(0,0,0));
+ m_deltaLinearVelocities.resize(numBodies, b3MakeVector3(0, 0, 0));
m_deltaAngularVelocities.resize(0);
- m_deltaAngularVelocities.resize(numBodies,b3MakeVector3(0,0,0));
+ m_deltaAngularVelocities.resize(numBodies, b3MakeVector3(0, 0, 0));
- for (int i=0;i<m_tmpSolverBodyPool.size();i++)
+ for (int i = 0; i < m_tmpSolverBodyPool.size(); i++)
{
if (!m_tmpSolverBodyPool[i].m_invMass.isZero())
{
int orgBodyIndex = m_tmpSolverBodyPool[i].m_originalBodyIndex;
- m_deltaLinearVelocities[orgBodyIndex]+=m_tmpSolverBodyPool[i].getDeltaLinearVelocity();
- m_deltaAngularVelocities[orgBodyIndex]+=m_tmpSolverBodyPool[i].getDeltaAngularVelocity();
+ m_deltaLinearVelocities[orgBodyIndex] += m_tmpSolverBodyPool[i].getDeltaLinearVelocity();
+ m_deltaAngularVelocities[orgBodyIndex] += m_tmpSolverBodyPool[i].getDeltaAngularVelocity();
}
}
-
- for (int i=0;i<m_tmpSolverBodyPool.size();i++)
+
+ for (int i = 0; i < m_tmpSolverBodyPool.size(); i++)
{
int orgBodyIndex = m_tmpSolverBodyPool[i].m_originalBodyIndex;
if (!m_tmpSolverBodyPool[i].m_invMass.isZero())
{
-
b3Assert(m_bodyCount[orgBodyIndex] == m_bodyCountCheck[orgBodyIndex]);
-
- b3Scalar factor = 1.f/b3Scalar(m_bodyCount[orgBodyIndex]);
-
- m_tmpSolverBodyPool[i].m_deltaLinearVelocity = m_deltaLinearVelocities[orgBodyIndex]*factor;
- m_tmpSolverBodyPool[i].m_deltaAngularVelocity = m_deltaAngularVelocities[orgBodyIndex]*factor;
+ b3Scalar factor = 1.f / b3Scalar(m_bodyCount[orgBodyIndex]);
+
+ m_tmpSolverBodyPool[i].m_deltaLinearVelocity = m_deltaLinearVelocities[orgBodyIndex] * factor;
+ m_tmpSolverBodyPool[i].m_deltaAngularVelocity = m_deltaAngularVelocities[orgBodyIndex] * factor;
}
}
}
-b3Scalar b3PgsJacobiSolver::solveGroupCacheFriendlyFinish(b3RigidBodyData* bodies,b3InertiaData* inertias,int numBodies,const b3ContactSolverInfo& infoGlobal)
+b3Scalar b3PgsJacobiSolver::solveGroupCacheFriendlyFinish(b3RigidBodyData* bodies, b3InertiaData* inertias, int numBodies, const b3ContactSolverInfo& infoGlobal)
{
B3_PROFILE("solveGroupCacheFriendlyFinish");
int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
- int i,j;
+ int i, j;
if (infoGlobal.m_solverMode & B3_SOLVER_USE_WARMSTARTING)
{
- for (j=0;j<numPoolConstraints;j++)
+ for (j = 0; j < numPoolConstraints; j++)
{
const b3SolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[j];
- b3ContactPoint* pt = (b3ContactPoint*) solveManifold.m_originalContactPoint;
+ b3ContactPoint* pt = (b3ContactPoint*)solveManifold.m_originalContactPoint;
b3Assert(pt);
pt->m_appliedImpulse = solveManifold.m_appliedImpulse;
- // float f = m_tmpSolverContactFrictionConstraintPool[solveManifold.m_frictionIndex].m_appliedImpulse;
+ // float f = m_tmpSolverContactFrictionConstraintPool[solveManifold.m_frictionIndex].m_appliedImpulse;
// printf("pt->m_appliedImpulseLateral1 = %f\n", f);
pt->m_appliedImpulseLateral1 = m_tmpSolverContactFrictionConstraintPool[solveManifold.m_frictionIndex].m_appliedImpulse;
//printf("pt->m_appliedImpulseLateral1 = %f\n", pt->m_appliedImpulseLateral1);
if ((infoGlobal.m_solverMode & B3_SOLVER_USE_2_FRICTION_DIRECTIONS))
{
- pt->m_appliedImpulseLateral2 = m_tmpSolverContactFrictionConstraintPool[solveManifold.m_frictionIndex+1].m_appliedImpulse;
+ pt->m_appliedImpulseLateral2 = m_tmpSolverContactFrictionConstraintPool[solveManifold.m_frictionIndex + 1].m_appliedImpulse;
}
//do a callback here?
}
}
numPoolConstraints = m_tmpSolverNonContactConstraintPool.size();
- for (j=0;j<numPoolConstraints;j++)
+ for (j = 0; j < numPoolConstraints; j++)
{
const b3SolverConstraint& solverConstr = m_tmpSolverNonContactConstraintPool[j];
b3TypedConstraint* constr = (b3TypedConstraint*)solverConstr.m_originalContactPoint;
@@ -1739,15 +1623,14 @@ b3Scalar b3PgsJacobiSolver::solveGroupCacheFriendlyFinish(b3RigidBodyData* bodie
b3SolverBody* bodyA = &m_tmpSolverBodyPool[solverConstr.m_solverBodyIdA];
b3SolverBody* bodyB = &m_tmpSolverBodyPool[solverConstr.m_solverBodyIdB];
- fb->m_appliedForceBodyA += solverConstr.m_contactNormal*solverConstr.m_appliedImpulse*bodyA->m_linearFactor/infoGlobal.m_timeStep;
- fb->m_appliedForceBodyB += -solverConstr.m_contactNormal*solverConstr.m_appliedImpulse*bodyB->m_linearFactor/infoGlobal.m_timeStep;
- fb->m_appliedTorqueBodyA += solverConstr.m_relpos1CrossNormal* bodyA->m_angularFactor*solverConstr.m_appliedImpulse/infoGlobal.m_timeStep;
- fb->m_appliedTorqueBodyB += -solverConstr.m_relpos1CrossNormal* bodyB->m_angularFactor*solverConstr.m_appliedImpulse/infoGlobal.m_timeStep;
-
+ fb->m_appliedForceBodyA += solverConstr.m_contactNormal * solverConstr.m_appliedImpulse * bodyA->m_linearFactor / infoGlobal.m_timeStep;
+ fb->m_appliedForceBodyB += -solverConstr.m_contactNormal * solverConstr.m_appliedImpulse * bodyB->m_linearFactor / infoGlobal.m_timeStep;
+ fb->m_appliedTorqueBodyA += solverConstr.m_relpos1CrossNormal * bodyA->m_angularFactor * solverConstr.m_appliedImpulse / infoGlobal.m_timeStep;
+ fb->m_appliedTorqueBodyB += -solverConstr.m_relpos1CrossNormal * bodyB->m_angularFactor * solverConstr.m_appliedImpulse / infoGlobal.m_timeStep;
}
constr->internalSetAppliedImpulse(solverConstr.m_appliedImpulse);
- if (b3Fabs(solverConstr.m_appliedImpulse)>=constr->getBreakingImpulseThreshold())
+ if (b3Fabs(solverConstr.m_appliedImpulse) >= constr->getBreakingImpulseThreshold())
{
constr->setEnabled(false);
}
@@ -1755,7 +1638,7 @@ b3Scalar b3PgsJacobiSolver::solveGroupCacheFriendlyFinish(b3RigidBodyData* bodie
{
B3_PROFILE("write back velocities and transforms");
- for ( i=0;i<m_tmpSolverBodyPool.size();i++)
+ for (i = 0; i < m_tmpSolverBodyPool.size(); i++)
{
int bodyIndex = m_tmpSolverBodyPool[i].m_originalBodyIndex;
//b3Assert(i==bodyIndex);
@@ -1772,12 +1655,13 @@ b3Scalar b3PgsJacobiSolver::solveGroupCacheFriendlyFinish(b3RigidBodyData* bodie
{
body->m_linVel = m_tmpSolverBodyPool[i].m_linearVelocity;
body->m_angVel = m_tmpSolverBodyPool[i].m_angularVelocity;
- } else
+ }
+ else
{
- b3Scalar factor = 1.f/b3Scalar(m_bodyCount[bodyIndex]);
+ b3Scalar factor = 1.f / b3Scalar(m_bodyCount[bodyIndex]);
- b3Vector3 deltaLinVel = m_deltaLinearVelocities[bodyIndex]*factor;
- b3Vector3 deltaAngVel = m_deltaAngularVelocities[bodyIndex]*factor;
+ b3Vector3 deltaLinVel = m_deltaLinearVelocities[bodyIndex] * factor;
+ b3Vector3 deltaAngVel = m_deltaAngularVelocities[bodyIndex] * factor;
//printf("body %d\n",bodyIndex);
//printf("deltaLinVel = %f,%f,%f\n",deltaLinVel.getX(),deltaLinVel.getY(),deltaLinVel.getZ());
//printf("deltaAngVel = %f,%f,%f\n",deltaAngVel.getX(),deltaAngVel.getY(),deltaAngVel.getZ());
@@ -1785,7 +1669,7 @@ b3Scalar b3PgsJacobiSolver::solveGroupCacheFriendlyFinish(b3RigidBodyData* bodie
body->m_linVel += deltaLinVel;
body->m_angVel += deltaAngVel;
}
-
+
if (infoGlobal.m_splitImpulse)
{
body->m_pos = m_tmpSolverBodyPool[i].m_worldTransform.getOrigin();
@@ -1797,7 +1681,6 @@ b3Scalar b3PgsJacobiSolver::solveGroupCacheFriendlyFinish(b3RigidBodyData* bodie
}
}
-
m_tmpSolverContactConstraintPool.resizeNoInitialize(0);
m_tmpSolverNonContactConstraintPool.resizeNoInitialize(0);
m_tmpSolverContactFrictionConstraintPool.resizeNoInitialize(0);
@@ -1807,9 +1690,7 @@ b3Scalar b3PgsJacobiSolver::solveGroupCacheFriendlyFinish(b3RigidBodyData* bodie
return 0.f;
}
-
-
-void b3PgsJacobiSolver::reset()
+void b3PgsJacobiSolver::reset()
{
m_btSeed2 = 0;
} \ No newline at end of file
diff --git a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3PgsJacobiSolver.h b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3PgsJacobiSolver.h
index d2ca307fab..5b616541d9 100644
--- a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3PgsJacobiSolver.h
+++ b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3PgsJacobiSolver.h
@@ -1,11 +1,9 @@
#ifndef B3_PGS_JACOBI_SOLVER
#define B3_PGS_JACOBI_SOLVER
-
struct b3Contact4;
struct b3ContactPoint;
-
class b3Dispatcher;
#include "b3TypedConstraint.h"
@@ -18,132 +16,118 @@ struct b3InertiaData;
class b3PgsJacobiSolver
{
-
protected:
- b3AlignedObjectArray<b3SolverBody> m_tmpSolverBodyPool;
- b3ConstraintArray m_tmpSolverContactConstraintPool;
- b3ConstraintArray m_tmpSolverNonContactConstraintPool;
- b3ConstraintArray m_tmpSolverContactFrictionConstraintPool;
- b3ConstraintArray m_tmpSolverContactRollingFrictionConstraintPool;
-
- b3AlignedObjectArray<int> m_orderTmpConstraintPool;
- b3AlignedObjectArray<int> m_orderNonContactConstraintPool;
- b3AlignedObjectArray<int> m_orderFrictionConstraintPool;
+ b3AlignedObjectArray<b3SolverBody> m_tmpSolverBodyPool;
+ b3ConstraintArray m_tmpSolverContactConstraintPool;
+ b3ConstraintArray m_tmpSolverNonContactConstraintPool;
+ b3ConstraintArray m_tmpSolverContactFrictionConstraintPool;
+ b3ConstraintArray m_tmpSolverContactRollingFrictionConstraintPool;
+
+ b3AlignedObjectArray<int> m_orderTmpConstraintPool;
+ b3AlignedObjectArray<int> m_orderNonContactConstraintPool;
+ b3AlignedObjectArray<int> m_orderFrictionConstraintPool;
b3AlignedObjectArray<b3TypedConstraint::b3ConstraintInfo1> m_tmpConstraintSizesPool;
-
- b3AlignedObjectArray<int> m_bodyCount;
- b3AlignedObjectArray<int> m_bodyCountCheck;
-
- b3AlignedObjectArray<b3Vector3> m_deltaLinearVelocities;
- b3AlignedObjectArray<b3Vector3> m_deltaAngularVelocities;
- bool m_usePgs;
- void averageVelocities();
+ b3AlignedObjectArray<int> m_bodyCount;
+ b3AlignedObjectArray<int> m_bodyCountCheck;
+
+ b3AlignedObjectArray<b3Vector3> m_deltaLinearVelocities;
+ b3AlignedObjectArray<b3Vector3> m_deltaAngularVelocities;
+
+ bool m_usePgs;
+ void averageVelocities();
- int m_maxOverrideNumSolverIterations;
+ int m_maxOverrideNumSolverIterations;
- int m_numSplitImpulseRecoveries;
+ int m_numSplitImpulseRecoveries;
- b3Scalar getContactProcessingThreshold(b3Contact4* contact)
+ 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 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 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,
+ 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);
+ 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;
+ unsigned long m_btSeed2;
-
b3Scalar restitutionCurve(b3Scalar rel_vel, b3Scalar restitution);
- void convertContact(b3RigidBodyData* bodies, b3InertiaData* inertias,b3Contact4* manifold,const b3ContactSolverInfo& infoGlobal);
-
+ void convertContact(b3RigidBodyData* bodies, b3InertiaData* inertias, b3Contact4* manifold, const b3ContactSolverInfo& infoGlobal);
- void resolveSplitPenetrationSIMD(
- b3SolverBody& bodyA,b3SolverBody& bodyB,
- const b3SolverConstraint& contactConstraint);
+ void resolveSplitPenetrationSIMD(
+ b3SolverBody& bodyA, b3SolverBody& bodyB,
+ const b3SolverConstraint& contactConstraint);
- void resolveSplitPenetrationImpulseCacheFriendly(
- 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);
+ 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:
+ void resolveSingleConstraintRowGeneric(b3SolverBody& bodyA, b3SolverBody& bodyB, const b3SolverConstraint& contactConstraint);
- virtual b3Scalar solveGroupCacheFriendlySetup(b3RigidBodyData* bodies, b3InertiaData* inertias,int numBodies,b3Contact4* manifoldPtr, int numManifolds,b3TypedConstraint** constraints,int numConstraints,const b3ContactSolverInfo& infoGlobal);
+ void resolveSingleConstraintRowGenericSIMD(b3SolverBody& bodyA, b3SolverBody& bodyB, const b3SolverConstraint& contactConstraint);
+ void resolveSingleConstraintRowLowerLimit(b3SolverBody& bodyA, b3SolverBody& bodyB, const b3SolverConstraint& contactConstraint);
- 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);
+ 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 solveGroupCacheFriendlyFinish(b3RigidBodyData* bodies, b3InertiaData* inertias,int numBodies,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);
+ // 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);
+ 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();
-
+ virtual void reset();
+
unsigned long b3Rand2();
- int b3RandInt2 (int n);
+ int b3RandInt2(int n);
- void setRandSeed(unsigned long seed)
+ void setRandSeed(unsigned long seed)
{
m_btSeed2 = seed;
}
- unsigned long getRandSeed() const
+ unsigned long getRandSeed() const
{
return m_btSeed2;
}
-
-
-
-
};
-#endif //B3_PGS_JACOBI_SOLVER
-
+#endif //B3_PGS_JACOBI_SOLVER
diff --git a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3Point2PointConstraint.cpp b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3Point2PointConstraint.cpp
index 02c11db320..cfa7c7dd11 100644
--- a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3Point2PointConstraint.cpp
+++ b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3Point2PointConstraint.cpp
@@ -13,21 +13,14 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "b3Point2PointConstraint.h"
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h"
#include <new>
-
-
-
-
-b3Point2PointConstraint::b3Point2PointConstraint(int rbA,int rbB, const b3Vector3& pivotInA,const b3Vector3& pivotInB)
-:b3TypedConstraint(B3_POINT2POINT_CONSTRAINT_TYPE,rbA,rbB),m_pivotInA(pivotInA),m_pivotInB(pivotInB),
-m_flags(0)
+b3Point2PointConstraint::b3Point2PointConstraint(int rbA, int rbB, const b3Vector3& pivotInA, const b3Vector3& pivotInB)
+ : b3TypedConstraint(B3_POINT2POINT_CONSTRAINT_TYPE, rbA, rbB), m_pivotInA(pivotInA), m_pivotInB(pivotInB), m_flags(0)
{
-
}
/*
@@ -40,22 +33,18 @@ m_useSolveConstraintObsolete(false)
}
*/
-
-void b3Point2PointConstraint::getInfo1 (b3ConstraintInfo1* info,const b3RigidBodyData* bodies)
+void b3Point2PointConstraint::getInfo1(b3ConstraintInfo1* info, const b3RigidBodyData* bodies)
{
- getInfo1NonVirtual(info,bodies);
+ getInfo1NonVirtual(info, bodies);
}
-void b3Point2PointConstraint::getInfo1NonVirtual (b3ConstraintInfo1* info,const b3RigidBodyData* bodies)
+void b3Point2PointConstraint::getInfo1NonVirtual(b3ConstraintInfo1* info, const b3RigidBodyData* bodies)
{
- info->m_numConstraintRows = 3;
- info->nub = 3;
+ info->m_numConstraintRows = 3;
+ info->nub = 3;
}
-
-
-
-void b3Point2PointConstraint::getInfo2 (b3ConstraintInfo2* info, const b3RigidBodyData* bodies)
+void b3Point2PointConstraint::getInfo2(b3ConstraintInfo2* info, const b3RigidBodyData* bodies)
{
b3Transform trA;
trA.setIdentity();
@@ -67,143 +56,135 @@ void b3Point2PointConstraint::getInfo2 (b3ConstraintInfo2* info, const b3RigidBo
trB.setOrigin(bodies[m_rbB].m_pos);
trB.setRotation(bodies[m_rbB].m_quat);
- getInfo2NonVirtual(info, trA,trB);
+ getInfo2NonVirtual(info, trA, trB);
}
-void b3Point2PointConstraint::getInfo2NonVirtual (b3ConstraintInfo2* info, const b3Transform& body0_trans, const b3Transform& body1_trans)
+void b3Point2PointConstraint::getInfo2NonVirtual(b3ConstraintInfo2* info, const b3Transform& body0_trans, const b3Transform& body1_trans)
{
-
- //retrieve matrices
+ //retrieve matrices
// anchor points in global coordinates with respect to body PORs.
-
- // set jacobian
- info->m_J1linearAxis[0] = 1;
- info->m_J1linearAxis[info->rowskip+1] = 1;
- info->m_J1linearAxis[2*info->rowskip+2] = 1;
- b3Vector3 a1 = body0_trans.getBasis()*getPivotInA();
+ // set jacobian
+ info->m_J1linearAxis[0] = 1;
+ info->m_J1linearAxis[info->rowskip + 1] = 1;
+ info->m_J1linearAxis[2 * info->rowskip + 2] = 1;
+
+ b3Vector3 a1 = body0_trans.getBasis() * getPivotInA();
//b3Vector3 a1a = b3QuatRotate(body0_trans.getRotation(),getPivotInA());
{
b3Vector3* angular0 = (b3Vector3*)(info->m_J1angularAxis);
- b3Vector3* angular1 = (b3Vector3*)(info->m_J1angularAxis+info->rowskip);
- b3Vector3* angular2 = (b3Vector3*)(info->m_J1angularAxis+2*info->rowskip);
+ b3Vector3* angular1 = (b3Vector3*)(info->m_J1angularAxis + info->rowskip);
+ b3Vector3* angular2 = (b3Vector3*)(info->m_J1angularAxis + 2 * info->rowskip);
b3Vector3 a1neg = -a1;
- a1neg.getSkewSymmetricMatrix(angular0,angular1,angular2);
+ a1neg.getSkewSymmetricMatrix(angular0, angular1, angular2);
}
-
+
if (info->m_J2linearAxis)
{
info->m_J2linearAxis[0] = -1;
- info->m_J2linearAxis[info->rowskip+1] = -1;
- info->m_J2linearAxis[2*info->rowskip+2] = -1;
+ info->m_J2linearAxis[info->rowskip + 1] = -1;
+ info->m_J2linearAxis[2 * info->rowskip + 2] = -1;
}
-
- b3Vector3 a2 = body1_trans.getBasis()*getPivotInB();
-
+
+ b3Vector3 a2 = body1_trans.getBasis() * getPivotInB();
+
{
- // b3Vector3 a2n = -a2;
+ // b3Vector3 a2n = -a2;
b3Vector3* angular0 = (b3Vector3*)(info->m_J2angularAxis);
- b3Vector3* angular1 = (b3Vector3*)(info->m_J2angularAxis+info->rowskip);
- b3Vector3* angular2 = (b3Vector3*)(info->m_J2angularAxis+2*info->rowskip);
- a2.getSkewSymmetricMatrix(angular0,angular1,angular2);
+ b3Vector3* angular1 = (b3Vector3*)(info->m_J2angularAxis + info->rowskip);
+ b3Vector3* angular2 = (b3Vector3*)(info->m_J2angularAxis + 2 * info->rowskip);
+ a2.getSkewSymmetricMatrix(angular0, angular1, angular2);
}
-
-
- // set right hand side
+ // set right hand side
b3Scalar currERP = (m_flags & B3_P2P_FLAGS_ERP) ? m_erp : info->erp;
- b3Scalar k = info->fps * currERP;
- int j;
- for (j=0; j<3; j++)
- {
- info->m_constraintError[j*info->rowskip] = k * (a2[j] + body1_trans.getOrigin()[j] - a1[j] - body0_trans.getOrigin()[j]);
+ b3Scalar k = info->fps * currERP;
+ int j;
+ for (j = 0; j < 3; j++)
+ {
+ info->m_constraintError[j * info->rowskip] = k * (a2[j] + body1_trans.getOrigin()[j] - a1[j] - body0_trans.getOrigin()[j]);
//printf("info->m_constraintError[%d]=%f\n",j,info->m_constraintError[j]);
- }
- if(m_flags & B3_P2P_FLAGS_CFM)
+ }
+ if (m_flags & B3_P2P_FLAGS_CFM)
{
- for (j=0; j<3; j++)
+ for (j = 0; j < 3; j++)
{
- info->cfm[j*info->rowskip] = m_cfm;
+ info->cfm[j * info->rowskip] = m_cfm;
}
}
- b3Scalar impulseClamp = m_setting.m_impulseClamp;//
- for (j=0; j<3; j++)
- {
+ b3Scalar impulseClamp = m_setting.m_impulseClamp; //
+ for (j = 0; j < 3; j++)
+ {
if (m_setting.m_impulseClamp > 0)
{
- info->m_lowerLimit[j*info->rowskip] = -impulseClamp;
- info->m_upperLimit[j*info->rowskip] = impulseClamp;
+ info->m_lowerLimit[j * info->rowskip] = -impulseClamp;
+ info->m_upperLimit[j * info->rowskip] = impulseClamp;
}
}
info->m_damping = m_setting.m_damping;
-
}
-
-
-void b3Point2PointConstraint::updateRHS(b3Scalar timeStep)
+void b3Point2PointConstraint::updateRHS(b3Scalar timeStep)
{
(void)timeStep;
-
}
-///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5).
+///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.
void b3Point2PointConstraint::setParam(int num, b3Scalar value, int axis)
{
- if(axis != -1)
+ if (axis != -1)
{
b3AssertConstrParams(0);
}
else
{
- switch(num)
+ switch (num)
{
- case B3_CONSTRAINT_ERP :
- case B3_CONSTRAINT_STOP_ERP :
- m_erp = value;
+ case B3_CONSTRAINT_ERP:
+ case B3_CONSTRAINT_STOP_ERP:
+ m_erp = value;
m_flags |= B3_P2P_FLAGS_ERP;
break;
- case B3_CONSTRAINT_CFM :
- case B3_CONSTRAINT_STOP_CFM :
- m_cfm = value;
+ case B3_CONSTRAINT_CFM:
+ case B3_CONSTRAINT_STOP_CFM:
+ m_cfm = value;
m_flags |= B3_P2P_FLAGS_CFM;
break;
- default:
+ default:
b3AssertConstrParams(0);
}
}
}
///return the local value of parameter
-b3Scalar b3Point2PointConstraint::getParam(int num, int axis) const
+b3Scalar b3Point2PointConstraint::getParam(int num, int axis) const
{
b3Scalar retVal(B3_INFINITY);
- if(axis != -1)
+ if (axis != -1)
{
b3AssertConstrParams(0);
}
else
{
- switch(num)
+ switch (num)
{
- case B3_CONSTRAINT_ERP :
- case B3_CONSTRAINT_STOP_ERP :
+ case B3_CONSTRAINT_ERP:
+ case B3_CONSTRAINT_STOP_ERP:
b3AssertConstrParams(m_flags & B3_P2P_FLAGS_ERP);
- retVal = m_erp;
+ retVal = m_erp;
break;
- case B3_CONSTRAINT_CFM :
- case B3_CONSTRAINT_STOP_CFM :
+ case B3_CONSTRAINT_CFM:
+ case B3_CONSTRAINT_STOP_CFM:
b3AssertConstrParams(m_flags & B3_P2P_FLAGS_CFM);
- retVal = m_cfm;
+ retVal = m_cfm;
break;
- default:
+ default:
b3AssertConstrParams(0);
}
}
return retVal;
}
-
diff --git a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3Point2PointConstraint.h b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3Point2PointConstraint.h
index 681b487334..14762a3e35 100644
--- a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3Point2PointConstraint.h
+++ b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3Point2PointConstraint.h
@@ -22,26 +22,24 @@ subject to the following restrictions:
class b3RigidBody;
-
#ifdef B3_USE_DOUBLE_PRECISION
-#define b3Point2PointConstraintData b3Point2PointConstraintDoubleData
-#define b3Point2PointConstraintDataName "b3Point2PointConstraintDoubleData"
+#define b3Point2PointConstraintData b3Point2PointConstraintDoubleData
+#define b3Point2PointConstraintDataName "b3Point2PointConstraintDoubleData"
#else
-#define b3Point2PointConstraintData b3Point2PointConstraintFloatData
-#define b3Point2PointConstraintDataName "b3Point2PointConstraintFloatData"
-#endif //B3_USE_DOUBLE_PRECISION
+#define b3Point2PointConstraintData b3Point2PointConstraintFloatData
+#define b3Point2PointConstraintDataName "b3Point2PointConstraintFloatData"
+#endif //B3_USE_DOUBLE_PRECISION
-struct b3ConstraintSetting
+struct b3ConstraintSetting
{
- b3ConstraintSetting() :
- m_tau(b3Scalar(0.3)),
- m_damping(b3Scalar(1.)),
- m_impulseClamp(b3Scalar(0.))
+ b3ConstraintSetting() : m_tau(b3Scalar(0.3)),
+ m_damping(b3Scalar(1.)),
+ m_impulseClamp(b3Scalar(0.))
{
}
- b3Scalar m_tau;
- b3Scalar m_damping;
- b3Scalar m_impulseClamp;
+ b3Scalar m_tau;
+ b3Scalar m_damping;
+ b3Scalar m_impulseClamp;
};
enum b3Point2PointFlags
@@ -51,47 +49,45 @@ enum b3Point2PointFlags
};
/// 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
+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();
+ b3Vector3 m_pivotInA;
+ b3Vector3 m_pivotInB;
- b3ConstraintSetting m_setting;
+ int m_flags;
+ b3Scalar m_erp;
+ b3Scalar m_cfm;
- b3Point2PointConstraint(int rbA,int rbB, const b3Vector3& pivotInA,const b3Vector3& pivotInB);
+public:
+ B3_DECLARE_ALIGNED_ALLOCATOR();
- //b3Point2PointConstraint(int rbA,const b3Vector3& pivotInA);
+ 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);
+ virtual void getInfo1(b3ConstraintInfo1 * info, const b3RigidBodyData* bodies);
- void getInfo1NonVirtual (b3ConstraintInfo1* info,const b3RigidBodyData* bodies);
+ void getInfo1NonVirtual(b3ConstraintInfo1 * info, const b3RigidBodyData* bodies);
- virtual void getInfo2 (b3ConstraintInfo2* 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 getInfo2NonVirtual(b3ConstraintInfo2 * info, const b3Transform& body0_trans, const b3Transform& body1_trans);
- void updateRHS(b3Scalar timeStep);
+ void updateRHS(b3Scalar timeStep);
- void setPivotA(const b3Vector3& pivotA)
+ void setPivotA(const b3Vector3& pivotA)
{
m_pivotInA = pivotA;
}
- void setPivotB(const b3Vector3& pivotB)
+ void setPivotB(const b3Vector3& pivotB)
{
m_pivotInB = pivotB;
}
@@ -106,34 +102,32 @@ public:
return m_pivotInB;
}
- ///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5).
+ ///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);
+ 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 b3Scalar getParam(int num, int axis = -1) const;
-// virtual int calculateSerializeBufferSize() 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;
-
-
+ // virtual const char* serialize(void* dataBuffer, b3Serializer* serializer) const;
};
///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
-struct b3Point2PointConstraintFloatData
+struct b3Point2PointConstraintFloatData
{
- b3TypedConstraintData m_typeConstraintData;
- b3Vector3FloatData m_pivotInA;
- b3Vector3FloatData m_pivotInB;
+ b3TypedConstraintData m_typeConstraintData;
+ b3Vector3FloatData m_pivotInA;
+ b3Vector3FloatData m_pivotInB;
};
///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
-struct b3Point2PointConstraintDoubleData
+struct b3Point2PointConstraintDoubleData
{
- b3TypedConstraintData m_typeConstraintData;
- b3Vector3DoubleData m_pivotInA;
- b3Vector3DoubleData m_pivotInB;
+ b3TypedConstraintData m_typeConstraintData;
+ b3Vector3DoubleData m_pivotInA;
+ b3Vector3DoubleData m_pivotInB;
};
/*
@@ -156,4 +150,4 @@ B3_FORCE_INLINE const char* b3Point2PointConstraint::serialize(void* dataBuffer,
}
*/
-#endif //B3_POINT2POINTCONSTRAINT_H
+#endif //B3_POINT2POINTCONSTRAINT_H
diff --git a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3SolverBody.h b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3SolverBody.h
index 0049317d98..196d0e5793 100644
--- a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3SolverBody.h
+++ b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3SolverBody.h
@@ -16,7 +16,6 @@ subject to the following restrictions:
#ifndef B3_SOLVER_BODY_H
#define B3_SOLVER_BODY_H
-
#include "Bullet3Common/b3Vector3.h"
#include "Bullet3Common/b3Matrix3x3.h"
@@ -26,110 +25,104 @@ subject to the following restrictions:
///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 //
-
+#endif //
#ifdef USE_SIMD
-struct b3SimdScalar
+struct b3SimdScalar
{
- B3_FORCE_INLINE b3SimdScalar()
+ B3_FORCE_INLINE b3SimdScalar()
{
-
}
- B3_FORCE_INLINE b3SimdScalar(float fl)
- :m_vec128 (_mm_set1_ps(fl))
+ B3_FORCE_INLINE b3SimdScalar(float fl)
+ : m_vec128(_mm_set1_ps(fl))
{
}
- B3_FORCE_INLINE b3SimdScalar(__m128 v128)
- :m_vec128(v128)
+ 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;
+ 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()
+ B3_FORCE_INLINE __m128 get128()
{
return m_vec128;
}
- B3_FORCE_INLINE const __m128 get128() const
+ B3_FORCE_INLINE const __m128 get128() const
{
return m_vec128;
}
- B3_FORCE_INLINE void set128(__m128 v128)
+ 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 __m128()
+ {
+ return m_vec128;
}
-
- B3_FORCE_INLINE operator float() const
- {
- return m_floats[0];
+ 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)
+B3_FORCE_INLINE b3SimdScalar
+operator*(const b3SimdScalar& v1, const b3SimdScalar& v2)
{
- return b3SimdScalar(_mm_mul_ps(v1.get128(),v2.get128()));
+ 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)
+B3_FORCE_INLINE b3SimdScalar
+operator+(const b3SimdScalar& v1, const b3SimdScalar& v2)
{
- return b3SimdScalar(_mm_add_ps(v1.get128(),v2.get128()));
+ 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_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;
+ 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)
+ void setWorldTransform(const b3Transform& worldTransform)
{
m_worldTransform = worldTransform;
}
@@ -138,45 +131,42 @@ B3_ATTRIBUTE_ALIGNED16 (struct) b3SolverBody
{
return m_worldTransform;
}
-
- B3_FORCE_INLINE void getVelocityInLocalPointObsolete(const b3Vector3& rel_pos, b3Vector3& velocity ) const
+
+ 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);
+ velocity = m_linearVelocity + m_deltaLinearVelocity + (m_angularVelocity + m_deltaAngularVelocity).cross(rel_pos);
else
- velocity.setValue(0,0,0);
+ velocity.setValue(0, 0, 0);
}
- B3_FORCE_INLINE void getAngularVelocity(b3Vector3& angVel) const
+ B3_FORCE_INLINE void getAngularVelocity(b3Vector3 & angVel) const
{
if (m_originalBody)
- angVel =m_angularVelocity+m_deltaAngularVelocity;
+ angVel = m_angularVelocity + m_deltaAngularVelocity;
else
- angVel.setValue(0,0,0);
+ 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)
+ 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);
+ 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)
+ 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);
+ m_pushVelocity += linearComponent * impulseMagnitude * m_linearFactor;
+ m_turnVelocity += angularComponent * (impulseMagnitude * m_angularFactor);
}
}
-
-
const b3Vector3& getDeltaLinearVelocity() const
{
return m_deltaLinearVelocity;
@@ -187,20 +177,19 @@ B3_ATTRIBUTE_ALIGNED16 (struct) b3SolverBody
return m_deltaAngularVelocity;
}
- const b3Vector3& getPushVelocity() const
+ const b3Vector3& getPushVelocity() const
{
return m_pushVelocity;
}
- const b3Vector3& getTurnVelocity() const
+ const b3Vector3& getTurnVelocity() const
{
return m_turnVelocity;
}
-
////////////////////////////////////////////////
///some internal methods, don't use them
-
+
b3Vector3& internalGetDeltaLinearVelocity()
{
return m_deltaLinearVelocity;
@@ -225,7 +214,7 @@ B3_ATTRIBUTE_ALIGNED16 (struct) b3SolverBody
{
m_invMass = invMass;
}
-
+
b3Vector3& internalGetPushVelocity()
{
return m_pushVelocity;
@@ -236,67 +225,57 @@ B3_ATTRIBUTE_ALIGNED16 (struct) b3SolverBody
return m_turnVelocity;
}
- B3_FORCE_INLINE void internalGetVelocityInLocalPointObsolete(const b3Vector3& rel_pos, b3Vector3& velocity ) const
+ B3_FORCE_INLINE void internalGetVelocityInLocalPointObsolete(const b3Vector3& rel_pos, b3Vector3& velocity) const
{
- velocity = m_linearVelocity+m_deltaLinearVelocity + (m_angularVelocity+m_deltaAngularVelocity).cross(rel_pos);
+ velocity = m_linearVelocity + m_deltaLinearVelocity + (m_angularVelocity + m_deltaAngularVelocity).cross(rel_pos);
}
- B3_FORCE_INLINE void internalGetAngularVelocity(b3Vector3& angVel) const
+ B3_FORCE_INLINE void internalGetAngularVelocity(b3Vector3 & angVel) const
{
- angVel = m_angularVelocity+m_deltaAngularVelocity;
+ 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)
+ 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);
+ m_deltaLinearVelocity += linearComponent * impulseMagnitude * m_linearFactor;
+ m_deltaAngularVelocity += angularComponent * (impulseMagnitude * m_angularFactor);
}
}
-
-
-
- void writebackVelocity()
+ void writebackVelocity()
{
//if (m_originalBody>=0)
{
- m_linearVelocity +=m_deltaLinearVelocity;
+ m_linearVelocity += m_deltaLinearVelocity;
m_angularVelocity += m_deltaAngularVelocity;
-
+
//m_originalBody->setCompanionId(-1);
}
}
-
- void writebackVelocityAndTransform(b3Scalar timeStep, b3Scalar splitImpulseTurnErp)
+ void writebackVelocityAndTransform(b3Scalar timeStep, b3Scalar splitImpulseTurnErp)
{
- (void) timeStep;
+ (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)
+ 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);
+ // 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
-
-
+#endif //B3_SOLVER_BODY_H
diff --git a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3SolverConstraint.h b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3SolverConstraint.h
index bce83d4608..4927ae4288 100644
--- a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3SolverConstraint.h
+++ b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3SolverConstraint.h
@@ -16,7 +16,6 @@ subject to the following restrictions:
#ifndef B3_SOLVER_CONSTRAINT_H
#define B3_SOLVER_CONSTRAINT_H
-
#include "Bullet3Common/b3Vector3.h"
#include "Bullet3Common/b3Matrix3x3.h"
//#include "b3JacobianEntry.h"
@@ -25,56 +24,50 @@ subject to the following restrictions:
//#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_ATTRIBUTE_ALIGNED16(struct)
+b3SolverConstraint
{
B3_DECLARE_ALIGNED_ALLOCATOR();
- b3Vector3 m_relpos1CrossNormal;
- b3Vector3 m_contactNormal;
+ b3Vector3 m_relpos1CrossNormal;
+ b3Vector3 m_contactNormal;
- b3Vector3 m_relpos2CrossNormal;
+ 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;
+ 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;
+ 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_overrideNumSolverIterations;
+ int m_frictionIndex;
int m_solverBodyIdA;
int m_solverBodyIdB;
-
- enum b3SolverConstraintType
+ enum b3SolverConstraintType
{
B3_SOLVER_CONTACT_1D = 0,
B3_SOLVER_FRICTION_1D
};
};
-typedef b3AlignedObjectArray<b3SolverConstraint> b3ConstraintArray;
-
-
-#endif //B3_SOLVER_CONSTRAINT_H
-
-
+typedef b3AlignedObjectArray<b3SolverConstraint> b3ConstraintArray;
+#endif //B3_SOLVER_CONSTRAINT_H
diff --git a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3TypedConstraint.cpp b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3TypedConstraint.cpp
index 699c481d64..885e277d8c 100644
--- a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3TypedConstraint.cpp
+++ b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3TypedConstraint.cpp
@@ -13,53 +13,46 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "b3TypedConstraint.h"
//#include "Bullet3Common/b3Serializer.h"
-
#define B3_DEFAULT_DEBUGDRAW_SIZE b3Scalar(0.3f)
-
-
-b3TypedConstraint::b3TypedConstraint(b3TypedConstraintType type, int rbA,int rbB)
-:b3TypedObject(type),
-m_userConstraintType(-1),
-m_userConstraintPtr((void*)-1),
-m_breakingImpulseThreshold(B3_INFINITY),
-m_isEnabled(true),
-m_needsFeedback(false),
-m_overrideNumSolverIterations(-1),
-m_rbA(rbA),
-m_rbB(rbB),
-m_appliedImpulse(b3Scalar(0.)),
-m_dbgDrawSize(B3_DEFAULT_DEBUGDRAW_SIZE),
-m_jointFeedback(0)
+b3TypedConstraint::b3TypedConstraint(b3TypedConstraintType type, int rbA, int rbB)
+ : b3TypedObject(type),
+ m_userConstraintType(-1),
+ m_userConstraintPtr((void*)-1),
+ m_breakingImpulseThreshold(B3_INFINITY),
+ m_isEnabled(true),
+ m_needsFeedback(false),
+ m_overrideNumSolverIterations(-1),
+ m_rbA(rbA),
+ m_rbB(rbB),
+ m_appliedImpulse(b3Scalar(0.)),
+ m_dbgDrawSize(B3_DEFAULT_DEBUGDRAW_SIZE),
+ m_jointFeedback(0)
{
}
-
-
-
b3Scalar b3TypedConstraint::getMotorFactor(b3Scalar pos, b3Scalar lowLim, b3Scalar uppLim, b3Scalar vel, b3Scalar timeFact)
{
- if(lowLim > uppLim)
+ if (lowLim > uppLim)
{
return b3Scalar(1.0f);
}
- else if(lowLim == uppLim)
+ else if (lowLim == uppLim)
{
return b3Scalar(0.0f);
}
b3Scalar lim_fact = b3Scalar(1.0f);
b3Scalar delta_max = vel / timeFact;
- if(delta_max < b3Scalar(0.0f))
+ if (delta_max < b3Scalar(0.0f))
{
- if((pos >= lowLim) && (pos < (lowLim - delta_max)))
+ if ((pos >= lowLim) && (pos < (lowLim - delta_max)))
{
lim_fact = (lowLim - pos) / delta_max;
}
- else if(pos < lowLim)
+ else if (pos < lowLim)
{
lim_fact = b3Scalar(0.0f);
}
@@ -68,13 +61,13 @@ b3Scalar b3TypedConstraint::getMotorFactor(b3Scalar pos, b3Scalar lowLim, b3Scal
lim_fact = b3Scalar(1.0f);
}
}
- else if(delta_max > b3Scalar(0.0f))
+ else if (delta_max > b3Scalar(0.0f))
{
- if((pos <= uppLim) && (pos > (uppLim - delta_max)))
+ if ((pos <= uppLim) && (pos > (uppLim - delta_max)))
{
lim_fact = (uppLim - pos) / delta_max;
}
- else if(pos > uppLim)
+ else if (pos > uppLim)
{
lim_fact = b3Scalar(0.0f);
}
@@ -85,18 +78,16 @@ b3Scalar b3TypedConstraint::getMotorFactor(b3Scalar pos, b3Scalar lowLim, b3Scal
}
else
{
- lim_fact = b3Scalar(0.0f);
+ lim_fact = b3Scalar(0.0f);
}
return lim_fact;
}
-
-
void b3AngularLimit::set(b3Scalar low, b3Scalar high, b3Scalar _softness, b3Scalar _biasFactor, b3Scalar _relaxationFactor)
{
m_halfRange = (high - low) / 2.0f;
m_center = b3NormalizeAngle(low + m_halfRange);
- m_softness = _softness;
+ m_softness = _softness;
m_biasFactor = _biasFactor;
m_relaxationFactor = _relaxationFactor;
}
@@ -113,7 +104,7 @@ void b3AngularLimit::test(const b3Scalar angle)
if (deviation < -m_halfRange)
{
m_solveLimit = true;
- m_correction = - (deviation + m_halfRange);
+ m_correction = -(deviation + m_halfRange);
m_sign = +1.0f;
}
else if (deviation > m_halfRange)
@@ -125,7 +116,6 @@ void b3AngularLimit::test(const b3Scalar angle)
}
}
-
b3Scalar b3AngularLimit::getError() const
{
return m_correction * m_sign;
diff --git a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3TypedConstraint.h b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3TypedConstraint.h
index cf9cec0d5e..f74aec4d3c 100644
--- a/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3TypedConstraint.h
+++ b/thirdparty/bullet/Bullet3Dynamics/ConstraintSolver/b3TypedConstraint.h
@@ -16,7 +16,6 @@ subject to the following restrictions:
#ifndef B3_TYPED_CONSTRAINT_H
#define B3_TYPED_CONSTRAINT_H
-
#include "Bullet3Common/b3Scalar.h"
#include "b3SolverConstraint.h"
@@ -25,7 +24,7 @@ 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_POINT2POINT_CONSTRAINT_TYPE = 3,
B3_HINGE_CONSTRAINT_TYPE,
B3_CONETWIST_CONSTRAINT_TYPE,
B3_D6_CONSTRAINT_TYPE,
@@ -37,92 +36,86 @@ enum b3TypedConstraintType
B3_MAX_CONSTRAINT_TYPE
};
-
enum b3ConstraintParams
{
- B3_CONSTRAINT_ERP=1,
+ B3_CONSTRAINT_ERP = 1,
B3_CONSTRAINT_STOP_ERP,
B3_CONSTRAINT_CFM,
B3_CONSTRAINT_STOP_CFM
};
#if 1
- #define b3AssertConstrParams(_par) b3Assert(_par)
+#define b3AssertConstrParams(_par) b3Assert(_par)
#else
- #define b3AssertConstrParams(_par)
+#define b3AssertConstrParams(_par)
#endif
-
-B3_ATTRIBUTE_ALIGNED16(struct) b3JointFeedback
+B3_ATTRIBUTE_ALIGNED16(struct)
+b3JointFeedback
{
- b3Vector3 m_appliedForceBodyA;
- b3Vector3 m_appliedTorqueBodyA;
- b3Vector3 m_appliedForceBodyB;
- b3Vector3 m_appliedTorqueBodyB;
+ 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
+B3_ATTRIBUTE_ALIGNED16(class)
+b3TypedConstraint : public b3TypedObject
{
- int m_userConstraintType;
+ int m_userConstraintType;
- union
- {
- int m_userConstraintId;
+ union {
+ int m_userConstraintId;
void* m_userConstraintPtr;
};
- b3Scalar m_breakingImpulseThreshold;
- bool m_isEnabled;
- bool m_needsFeedback;
- int m_overrideNumSolverIterations;
+ b3Scalar m_breakingImpulseThreshold;
+ bool m_isEnabled;
+ bool m_needsFeedback;
+ int m_overrideNumSolverIterations;
-
- b3TypedConstraint& operator=(b3TypedConstraint& other)
+ b3TypedConstraint& operator=(b3TypedConstraint& other)
{
b3Assert(0);
- (void) other;
+ (void)other;
return *this;
}
protected:
- int m_rbA;
- int m_rbB;
- b3Scalar m_appliedImpulse;
- b3Scalar m_dbgDrawSize;
- b3JointFeedback* m_jointFeedback;
+ 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);
+ virtual ~b3TypedConstraint(){};
+ b3TypedConstraint(b3TypedConstraintType type, int bodyA, int bodyB);
- struct b3ConstraintInfo1 {
- int m_numConstraintRows,nub;
+ struct b3ConstraintInfo1
+ {
+ int m_numConstraintRows, nub;
};
-
-
- struct b3ConstraintInfo2 {
+ struct b3ConstraintInfo2
+ {
// integrator parameters: frames per second (1/stepsize), default error
// reduction parameter (0..1).
- b3Scalar fps,erp;
+ 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;
+ b3Scalar *m_J1linearAxis, *m_J1angularAxis, *m_J2linearAxis, *m_J2angularAxis;
// elements to jump from one row to the next in J's
int rowskip;
@@ -130,24 +123,24 @@ public:
// 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;
+ b3Scalar *m_constraintError, *cfm;
// lo and hi limits for variables (set to -/+ infinity on entry).
- b3Scalar *m_lowerLimit,*m_upperLimit;
+ 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;
+ int* findex;
// number of solver iterations
int m_numIterations;
//damping of the velocity
- b3Scalar m_damping;
+ b3Scalar m_damping;
};
- int getOverrideNumSolverIterations() const
+ int getOverrideNumSolverIterations() const
{
return m_overrideNumSolverIterations;
}
@@ -159,59 +152,55 @@ public:
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)
+ virtual void setupSolverConstraint(b3ConstraintArray & ca, int solverBodyA, int solverBodyB, b3Scalar timeStep)
{
- (void)ca;
- (void)solverBodyA;
- (void)solverBodyB;
- (void)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;
+ 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;
+ 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)
+ void internalSetAppliedImpulse(b3Scalar appliedImpulse)
{
m_appliedImpulse = appliedImpulse;
}
///internal method used by the constraint solver, don't use them directly
- b3Scalar internalGetAppliedImpulse()
+ b3Scalar internalGetAppliedImpulse()
{
return m_appliedImpulse;
}
-
- b3Scalar getBreakingImpulseThreshold() const
+ b3Scalar getBreakingImpulseThreshold() const
{
- return m_breakingImpulseThreshold;
+ return m_breakingImpulseThreshold;
}
- void setBreakingImpulseThreshold(b3Scalar threshold)
+ void setBreakingImpulseThreshold(b3Scalar threshold)
{
m_breakingImpulseThreshold = threshold;
}
- bool isEnabled() const
+ bool isEnabled() const
{
return m_isEnabled;
}
- void setEnabled(bool enabled)
+ void setEnabled(bool enabled)
{
- m_isEnabled=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*/) {};
+ virtual void solveConstraintObsolete(b3SolverBody& /*bodyA*/, b3SolverBody& /*bodyB*/, b3Scalar /*timeStep*/){};
-
int getRigidBodyA() const
{
return m_rbA;
@@ -221,8 +210,7 @@ public:
return m_rbB;
}
-
- int getRigidBodyA()
+ int getRigidBodyA()
{
return m_rbA;
}
@@ -233,15 +221,15 @@ public:
int getUserConstraintType() const
{
- return m_userConstraintType ;
+ return m_userConstraintType;
}
- void setUserConstraintType(int userConstraintType)
+ void setUserConstraintType(int userConstraintType)
{
m_userConstraintType = userConstraintType;
};
- void setUserConstraintId(int uid)
+ void setUserConstraintId(int uid)
{
m_userConstraintId = uid;
}
@@ -251,17 +239,17 @@ public:
return m_userConstraintId;
}
- void setUserConstraintPtr(void* ptr)
+ void setUserConstraintPtr(void* ptr)
{
m_userConstraintPtr = ptr;
}
- void* getUserConstraintPtr()
+ void* getUserConstraintPtr()
{
return m_userConstraintPtr;
}
- void setJointFeedback(b3JointFeedback* jointFeedback)
+ void setJointFeedback(b3JointFeedback * jointFeedback)
{
m_jointFeedback = jointFeedback;
}
@@ -276,37 +264,36 @@ public:
return m_jointFeedback;
}
-
int getUid() const
{
- return m_userConstraintId;
- }
+ return m_userConstraintId;
+ }
- bool needsFeedback() const
+ 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)
+ void enableFeedback(bool needsFeedback)
{
m_needsFeedback = needsFeedback;
}
- ///getAppliedImpulse is an estimated total applied impulse.
+ ///getAppliedImpulse is an estimated total applied impulse.
///This feedback could be used to determine breaking constraints or playing sounds.
- b3Scalar getAppliedImpulse() const
+ b3Scalar getAppliedImpulse() const
{
b3Assert(m_needsFeedback);
return m_appliedImpulse;
}
- b3TypedConstraintType getConstraintType () const
+ b3TypedConstraintType getConstraintType() const
{
return b3TypedConstraintType(m_objectType);
}
-
+
void setDbgDrawSize(b3Scalar dbgDrawSize)
{
m_dbgDrawSize = dbgDrawSize;
@@ -316,35 +303,34 @@ public:
return m_dbgDrawSize;
}
- ///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5).
+ ///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;
+ 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;
+ 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
+// 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)
+ if (angleLowerLimitInRadians >= angleUpperLimitInRadians)
{
return angleInRadians;
}
- else if(angleInRadians < angleLowerLimitInRadians)
+ 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)
+ else if (angleInRadians > angleUpperLimitInRadians)
{
b3Scalar diffHi = b3Fabs(b3NormalizeAngle(angleInRadians - angleUpperLimitInRadians));
b3Scalar diffLo = b3Fabs(b3NormalizeAngle(angleInRadians - angleLowerLimitInRadians));
@@ -356,6 +342,7 @@ B3_FORCE_INLINE b3Scalar b3AdjustAngleToLimits(b3Scalar angleInRadians, b3Scalar
}
}
+// clang-format off
///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
struct b3TypedConstraintData
{
@@ -379,17 +366,18 @@ struct b3TypedConstraintData
};
+// clang-format on
+
/*B3_FORCE_INLINE int b3TypedConstraint::calculateSerializeBufferSize() const
{
return sizeof(b3TypedConstraintData);
}
*/
-
class b3AngularLimit
{
private:
- b3Scalar
+ b3Scalar
m_center,
m_halfRange,
m_softness,
@@ -404,15 +392,16 @@ private:
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)
- {}
+ : 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.
@@ -441,13 +430,13 @@ public:
return m_relaxationFactor;
}
- /// Returns correction value evaluated when test() was invoked
+ /// Returns correction value evaluated when test() was invoked
inline b3Scalar getCorrection() const
{
return m_correction;
}
- /// Returns sign value evaluated when test() was invoked
+ /// Returns sign value evaluated when test() was invoked
inline b3Scalar getSign() const
{
return m_sign;
@@ -475,9 +464,6 @@ public:
b3Scalar getLow() const;
b3Scalar getHigh() const;
-
};
-
-
-#endif //B3_TYPED_CONSTRAINT_H
+#endif //B3_TYPED_CONSTRAINT_H
diff --git a/thirdparty/bullet/Bullet3Dynamics/b3CpuRigidBodyPipeline.cpp b/thirdparty/bullet/Bullet3Dynamics/b3CpuRigidBodyPipeline.cpp
index fbc84cc28d..f1080d9d5e 100644
--- a/thirdparty/bullet/Bullet3Dynamics/b3CpuRigidBodyPipeline.cpp
+++ b/thirdparty/bullet/Bullet3Dynamics/b3CpuRigidBodyPipeline.cpp
@@ -11,7 +11,6 @@
#include "Bullet3Dynamics/shared/b3ContactConstraint4.h"
#include "Bullet3Dynamics/shared/b3Inertia.h"
-
struct b3CpuRigidBodyPipelineInternalData
{
b3AlignedObjectArray<b3RigidBodyData> m_rigidBodies;
@@ -22,7 +21,6 @@ struct b3CpuRigidBodyPipelineInternalData
b3CpuNarrowPhase* m_np;
b3Config m_config;
};
-
b3CpuRigidBodyPipeline::b3CpuRigidBodyPipeline(class b3CpuNarrowPhase* narrowphase, struct b3DynamicBvhBroadphase* broadphaseDbvt, const b3Config& config)
{
@@ -39,49 +37,43 @@ b3CpuRigidBodyPipeline::~b3CpuRigidBodyPipeline()
void b3CpuRigidBodyPipeline::updateAabbWorldSpace()
{
-
- for (int i=0;i<this->getNumBodies();i++)
+ for (int i = 0; i < this->getNumBodies(); i++)
{
b3RigidBodyData* body = &m_data->m_rigidBodies[i];
b3Float4 position = body->m_pos;
- b3Quat orientation = body->m_quat;
+ b3Quat orientation = body->m_quat;
int collidableIndex = body->m_collidableIdx;
b3Collidable& collidable = m_data->m_np->getCollidableCpu(collidableIndex);
int shapeIndex = collidable.m_shapeIndex;
-
- if (shapeIndex>=0)
- {
-
+ if (shapeIndex >= 0)
+ {
b3Aabb localAabb = m_data->m_np->getLocalSpaceAabb(shapeIndex);
b3Aabb& worldAabb = m_data->m_aabbWorldSpace[i];
- float margin=0.f;
- b3TransformAabb2(localAabb.m_minVec,localAabb.m_maxVec,margin,position,orientation,&worldAabb.m_minVec,&worldAabb.m_maxVec);
- m_data->m_bp->setAabb(i,worldAabb.m_minVec,worldAabb.m_maxVec,0);
+ float margin = 0.f;
+ b3TransformAabb2(localAabb.m_minVec, localAabb.m_maxVec, margin, position, orientation, &worldAabb.m_minVec, &worldAabb.m_maxVec);
+ m_data->m_bp->setAabb(i, worldAabb.m_minVec, worldAabb.m_maxVec, 0);
}
}
}
-void b3CpuRigidBodyPipeline::computeOverlappingPairs()
+void b3CpuRigidBodyPipeline::computeOverlappingPairs()
{
int numPairs = m_data->m_bp->getOverlappingPairCache()->getNumOverlappingPairs();
m_data->m_bp->calculateOverlappingPairs();
numPairs = m_data->m_bp->getOverlappingPairCache()->getNumOverlappingPairs();
- printf("numPairs=%d\n",numPairs);
+ printf("numPairs=%d\n", numPairs);
}
void b3CpuRigidBodyPipeline::computeContactPoints()
{
-
b3AlignedObjectArray<b3Int4>& pairs = m_data->m_bp->getOverlappingPairCache()->getOverlappingPairArray();
-
- m_data->m_np->computeContacts(pairs,m_data->m_aabbWorldSpace, m_data->m_rigidBodies);
+ m_data->m_np->computeContacts(pairs, m_data->m_aabbWorldSpace, m_data->m_rigidBodies);
}
-void b3CpuRigidBodyPipeline::stepSimulation(float deltaTime)
+void b3CpuRigidBodyPipeline::stepSimulation(float deltaTime)
{
-
//update world space aabb's
updateAabbWorldSpace();
@@ -92,73 +84,71 @@ void b3CpuRigidBodyPipeline::stepSimulation(float deltaTime)
computeContactPoints();
//solve contacts
-
+
//update transforms
integrate(deltaTime);
-
-
}
-
-static inline float b3CalcRelVel(const b3Vector3& l0, const b3Vector3& l1, const b3Vector3& a0, const b3Vector3& a1,
- const b3Vector3& linVel0, const b3Vector3& angVel0, const b3Vector3& linVel1, const b3Vector3& angVel1)
+static inline float b3CalcRelVel(const b3Vector3& l0, const b3Vector3& l1, const b3Vector3& a0, const b3Vector3& a1,
+ const b3Vector3& linVel0, const b3Vector3& angVel0, const b3Vector3& linVel1, const b3Vector3& angVel1)
{
return b3Dot(l0, linVel0) + b3Dot(a0, angVel0) + b3Dot(l1, linVel1) + b3Dot(a1, angVel1);
}
-
-static inline void b3SetLinearAndAngular(const b3Vector3& n, const b3Vector3& r0, const b3Vector3& r1,
- b3Vector3& linear, b3Vector3& angular0, b3Vector3& angular1)
+static inline void b3SetLinearAndAngular(const b3Vector3& n, const b3Vector3& r0, const b3Vector3& r1,
+ b3Vector3& linear, b3Vector3& angular0, b3Vector3& angular1)
{
linear = -n;
angular0 = -b3Cross(r0, n);
angular1 = b3Cross(r1, n);
}
-
-
-static inline void b3SolveContact(b3ContactConstraint4& cs,
- const b3Vector3& posA, b3Vector3& linVelA, b3Vector3& angVelA, float invMassA, const b3Matrix3x3& invInertiaA,
- const b3Vector3& posB, b3Vector3& linVelB, b3Vector3& angVelB, float invMassB, const b3Matrix3x3& invInertiaB,
- float maxRambdaDt[4], float minRambdaDt[4])
+static inline void b3SolveContact(b3ContactConstraint4& cs,
+ const b3Vector3& posA, b3Vector3& linVelA, b3Vector3& angVelA, float invMassA, const b3Matrix3x3& invInertiaA,
+ const b3Vector3& posB, b3Vector3& linVelB, b3Vector3& angVelB, float invMassB, const b3Matrix3x3& invInertiaB,
+ float maxRambdaDt[4], float minRambdaDt[4])
{
-
- b3Vector3 dLinVelA; dLinVelA.setZero();
- b3Vector3 dAngVelA; dAngVelA.setZero();
- b3Vector3 dLinVelB; dLinVelB.setZero();
- b3Vector3 dAngVelB; dAngVelB.setZero();
-
- for(int ic=0; ic<4; ic++)
+ b3Vector3 dLinVelA;
+ dLinVelA.setZero();
+ b3Vector3 dAngVelA;
+ dAngVelA.setZero();
+ b3Vector3 dLinVelB;
+ dLinVelB.setZero();
+ b3Vector3 dAngVelB;
+ dAngVelB.setZero();
+
+ for (int ic = 0; ic < 4; ic++)
{
// dont necessary because this makes change to 0
- if( cs.m_jacCoeffInv[ic] == 0.f ) continue;
+ if (cs.m_jacCoeffInv[ic] == 0.f) continue;
{
b3Vector3 angular0, angular1, linear;
b3Vector3 r0 = cs.m_worldPos[ic] - (b3Vector3&)posA;
b3Vector3 r1 = cs.m_worldPos[ic] - (b3Vector3&)posB;
- b3SetLinearAndAngular( (const b3Vector3 &)-cs.m_linear, (const b3Vector3 &)r0, (const b3Vector3 &)r1, linear, angular0, angular1 );
+ b3SetLinearAndAngular((const b3Vector3&)-cs.m_linear, (const b3Vector3&)r0, (const b3Vector3&)r1, linear, angular0, angular1);
- float rambdaDt = b3CalcRelVel((const b3Vector3 &)cs.m_linear,(const b3Vector3 &) -cs.m_linear, angular0, angular1,
- linVelA, angVelA, linVelB, angVelB ) + cs.m_b[ic];
+ float rambdaDt = b3CalcRelVel((const b3Vector3&)cs.m_linear, (const b3Vector3&)-cs.m_linear, angular0, angular1,
+ linVelA, angVelA, linVelB, angVelB) +
+ cs.m_b[ic];
rambdaDt *= cs.m_jacCoeffInv[ic];
{
float prevSum = cs.m_appliedRambdaDt[ic];
float updated = prevSum;
updated += rambdaDt;
- updated = b3Max( updated, minRambdaDt[ic] );
- updated = b3Min( updated, maxRambdaDt[ic] );
+ updated = b3Max(updated, minRambdaDt[ic]);
+ updated = b3Min(updated, maxRambdaDt[ic]);
rambdaDt = updated - prevSum;
cs.m_appliedRambdaDt[ic] = updated;
}
- b3Vector3 linImp0 = invMassA*linear*rambdaDt;
- b3Vector3 linImp1 = invMassB*(-linear)*rambdaDt;
- b3Vector3 angImp0 = (invInertiaA* angular0)*rambdaDt;
- b3Vector3 angImp1 = (invInertiaB* angular1)*rambdaDt;
+ b3Vector3 linImp0 = invMassA * linear * rambdaDt;
+ b3Vector3 linImp1 = invMassB * (-linear) * rambdaDt;
+ b3Vector3 angImp0 = (invInertiaA * angular0) * rambdaDt;
+ b3Vector3 angImp1 = (invInertiaB * angular1) * rambdaDt;
#ifdef _WIN32
- b3Assert(_finite(linImp0.getX()));
+ b3Assert(_finite(linImp0.getX()));
b3Assert(_finite(linImp1.getX()));
#endif
{
@@ -169,53 +159,46 @@ static inline void b3SolveContact(b3ContactConstraint4& cs,
}
}
}
-
-
}
-
-
-
-
-static inline void b3SolveFriction(b3ContactConstraint4& cs,
- const b3Vector3& posA, b3Vector3& linVelA, b3Vector3& angVelA, float invMassA, const b3Matrix3x3& invInertiaA,
- const b3Vector3& posB, b3Vector3& linVelB, b3Vector3& angVelB, float invMassB, const b3Matrix3x3& invInertiaB,
- float maxRambdaDt[4], float minRambdaDt[4])
+static inline void b3SolveFriction(b3ContactConstraint4& cs,
+ const b3Vector3& posA, b3Vector3& linVelA, b3Vector3& angVelA, float invMassA, const b3Matrix3x3& invInertiaA,
+ const b3Vector3& posB, b3Vector3& linVelB, b3Vector3& angVelB, float invMassB, const b3Matrix3x3& invInertiaB,
+ float maxRambdaDt[4], float minRambdaDt[4])
{
-
- if( cs.m_fJacCoeffInv[0] == 0 && cs.m_fJacCoeffInv[0] == 0 ) return;
+ if (cs.m_fJacCoeffInv[0] == 0 && cs.m_fJacCoeffInv[0] == 0) return;
const b3Vector3& center = (const b3Vector3&)cs.m_center;
b3Vector3 n = -(const b3Vector3&)cs.m_linear;
b3Vector3 tangent[2];
- b3PlaneSpace1 (n, tangent[0],tangent[1]);
+ b3PlaneSpace1(n, tangent[0], tangent[1]);
b3Vector3 angular0, angular1, linear;
b3Vector3 r0 = center - posA;
b3Vector3 r1 = center - posB;
- for(int i=0; i<2; i++)
+ for (int i = 0; i < 2; i++)
{
- b3SetLinearAndAngular( tangent[i], r0, r1, linear, angular0, angular1 );
+ b3SetLinearAndAngular(tangent[i], r0, r1, linear, angular0, angular1);
float rambdaDt = b3CalcRelVel(linear, -linear, angular0, angular1,
- linVelA, angVelA, linVelB, angVelB );
+ linVelA, angVelA, linVelB, angVelB);
rambdaDt *= cs.m_fJacCoeffInv[i];
- {
- float prevSum = cs.m_fAppliedRambdaDt[i];
- float updated = prevSum;
- updated += rambdaDt;
- updated = b3Max( updated, minRambdaDt[i] );
- updated = b3Min( updated, maxRambdaDt[i] );
- rambdaDt = updated - prevSum;
- cs.m_fAppliedRambdaDt[i] = updated;
- }
+ {
+ float prevSum = cs.m_fAppliedRambdaDt[i];
+ float updated = prevSum;
+ updated += rambdaDt;
+ updated = b3Max(updated, minRambdaDt[i]);
+ updated = b3Min(updated, maxRambdaDt[i]);
+ rambdaDt = updated - prevSum;
+ cs.m_fAppliedRambdaDt[i] = updated;
+ }
- b3Vector3 linImp0 = invMassA*linear*rambdaDt;
- b3Vector3 linImp1 = invMassB*(-linear)*rambdaDt;
- b3Vector3 angImp0 = (invInertiaA* angular0)*rambdaDt;
- b3Vector3 angImp1 = (invInertiaB* angular1)*rambdaDt;
+ b3Vector3 linImp0 = invMassA * linear * rambdaDt;
+ b3Vector3 linImp1 = invMassB * (-linear) * rambdaDt;
+ b3Vector3 angImp0 = (invInertiaA * angular0) * rambdaDt;
+ b3Vector3 angImp1 = (invInertiaB * angular1) * rambdaDt;
#ifdef _WIN32
b3Assert(_finite(linImp0.getX()));
b3Assert(_finite(linImp1.getX()));
@@ -226,57 +209,45 @@ static inline void b3SolveFriction(b3ContactConstraint4& cs,
angVelB += angImp1;
}
- { // angular damping for point constraint
- b3Vector3 ab = ( posB - posA ).normalized();
- b3Vector3 ac = ( center - posA ).normalized();
- if( b3Dot( ab, ac ) > 0.95f || (invMassA == 0.f || invMassB == 0.f))
+ { // angular damping for point constraint
+ b3Vector3 ab = (posB - posA).normalized();
+ b3Vector3 ac = (center - posA).normalized();
+ if (b3Dot(ab, ac) > 0.95f || (invMassA == 0.f || invMassB == 0.f))
{
- float angNA = b3Dot( n, angVelA );
- float angNB = b3Dot( n, angVelB );
+ float angNA = b3Dot(n, angVelA);
+ float angNB = b3Dot(n, angVelB);
- angVelA -= (angNA*0.1f)*n;
- angVelB -= (angNB*0.1f)*n;
+ angVelA -= (angNA * 0.1f) * n;
+ angVelB -= (angNB * 0.1f) * n;
}
}
-
}
-
-
-
-
-struct b3SolveTask// : public ThreadPool::Task
+struct b3SolveTask // : public ThreadPool::Task
{
- b3SolveTask(b3AlignedObjectArray<b3RigidBodyData>& bodies,
- b3AlignedObjectArray<b3Inertia>& shapes,
+ b3SolveTask(b3AlignedObjectArray<b3RigidBodyData>& bodies,
+ b3AlignedObjectArray<b3Inertia>& shapes,
b3AlignedObjectArray<b3ContactConstraint4>& constraints,
int start, int nConstraints,
int maxNumBatches,
- b3AlignedObjectArray<int>* wgUsedBodies, int curWgidx
- )
- : m_bodies( bodies ), m_shapes( shapes ), m_constraints( constraints ),
- m_wgUsedBodies(wgUsedBodies),m_curWgidx(curWgidx),
-m_start( start ),
- m_nConstraints( nConstraints ),
- m_solveFriction( true ),
- m_maxNumBatches(maxNumBatches)
- {}
-
- unsigned short int getType(){ return 0; }
+ b3AlignedObjectArray<int>* wgUsedBodies, int curWgidx)
+ : m_bodies(bodies), m_shapes(shapes), m_constraints(constraints), m_wgUsedBodies(wgUsedBodies), m_curWgidx(curWgidx), m_start(start), m_nConstraints(nConstraints), m_solveFriction(true), m_maxNumBatches(maxNumBatches)
+ {
+ }
+
+ unsigned short int getType() { return 0; }
void run(int tIdx)
{
b3AlignedObjectArray<int> usedBodies;
//printf("run..............\n");
-
- for (int bb=0;bb<m_maxNumBatches;bb++)
+ for (int bb = 0; bb < m_maxNumBatches; bb++)
{
usedBodies.resize(0);
- for(int ic=m_nConstraints-1; ic>=0; ic--)
+ for (int ic = m_nConstraints - 1; ic >= 0; ic--)
//for(int ic=0; ic<m_nConstraints; ic++)
{
-
int i = m_start + ic;
if (m_constraints[i].m_batchIdx != bb)
continue;
@@ -298,87 +269,80 @@ m_start( start ),
//printf("ic(b)=%d, localBatch=%d\n",ic,localBatch);
}
#endif
- if (aIdx==10)
+ if (aIdx == 10)
{
//printf("ic(a)=%d, localBatch=%d\n",ic,localBatch);
}
- if (usedBodies.size()<(aIdx+1))
+ if (usedBodies.size() < (aIdx + 1))
{
- usedBodies.resize(aIdx+1,0);
+ usedBodies.resize(aIdx + 1, 0);
}
-
- if (usedBodies.size()<(bIdx+1))
+
+ if (usedBodies.size() < (bIdx + 1))
{
- usedBodies.resize(bIdx+1,0);
+ usedBodies.resize(bIdx + 1, 0);
}
if (bodyA.m_invMass)
{
- b3Assert(usedBodies[aIdx]==0);
+ b3Assert(usedBodies[aIdx] == 0);
usedBodies[aIdx]++;
}
-
+
if (bodyB.m_invMass)
{
- b3Assert(usedBodies[bIdx]==0);
+ b3Assert(usedBodies[bIdx] == 0);
usedBodies[bIdx]++;
}
-
- if( !m_solveFriction )
+ if (!m_solveFriction)
{
- float maxRambdaDt[4] = {FLT_MAX,FLT_MAX,FLT_MAX,FLT_MAX};
- float minRambdaDt[4] = {0.f,0.f,0.f,0.f};
-
- b3SolveContact( m_constraints[i], (b3Vector3&)bodyA.m_pos, (b3Vector3&)bodyA.m_linVel, (b3Vector3&)bodyA.m_angVel, bodyA.m_invMass, (const b3Matrix3x3 &)m_shapes[aIdx].m_invInertiaWorld,
- (b3Vector3&)bodyB.m_pos, (b3Vector3&)bodyB.m_linVel, (b3Vector3&)bodyB.m_angVel, bodyB.m_invMass, (const b3Matrix3x3 &)m_shapes[bIdx].m_invInertiaWorld,
- maxRambdaDt, minRambdaDt );
+ float maxRambdaDt[4] = {FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX};
+ float minRambdaDt[4] = {0.f, 0.f, 0.f, 0.f};
+ b3SolveContact(m_constraints[i], (b3Vector3&)bodyA.m_pos, (b3Vector3&)bodyA.m_linVel, (b3Vector3&)bodyA.m_angVel, bodyA.m_invMass, (const b3Matrix3x3&)m_shapes[aIdx].m_invInertiaWorld,
+ (b3Vector3&)bodyB.m_pos, (b3Vector3&)bodyB.m_linVel, (b3Vector3&)bodyB.m_angVel, bodyB.m_invMass, (const b3Matrix3x3&)m_shapes[bIdx].m_invInertiaWorld,
+ maxRambdaDt, minRambdaDt);
}
else
{
- float maxRambdaDt[4] = {FLT_MAX,FLT_MAX,FLT_MAX,FLT_MAX};
- float minRambdaDt[4] = {0.f,0.f,0.f,0.f};
+ float maxRambdaDt[4] = {FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX};
+ float minRambdaDt[4] = {0.f, 0.f, 0.f, 0.f};
float sum = 0;
- for(int j=0; j<4; j++)
+ for (int j = 0; j < 4; j++)
{
- sum +=m_constraints[i].m_appliedRambdaDt[j];
+ sum += m_constraints[i].m_appliedRambdaDt[j];
}
frictionCoeff = 0.7f;
- for(int j=0; j<4; j++)
+ for (int j = 0; j < 4; j++)
{
- maxRambdaDt[j] = frictionCoeff*sum;
+ maxRambdaDt[j] = frictionCoeff * sum;
minRambdaDt[j] = -maxRambdaDt[j];
}
- b3SolveFriction( m_constraints[i], (b3Vector3&)bodyA.m_pos, (b3Vector3&)bodyA.m_linVel, (b3Vector3&)bodyA.m_angVel, bodyA.m_invMass,(const b3Matrix3x3 &) m_shapes[aIdx].m_invInertiaWorld,
- (b3Vector3&)bodyB.m_pos, (b3Vector3&)bodyB.m_linVel, (b3Vector3&)bodyB.m_angVel, bodyB.m_invMass,(const b3Matrix3x3 &) m_shapes[bIdx].m_invInertiaWorld,
- maxRambdaDt, minRambdaDt );
-
+ b3SolveFriction(m_constraints[i], (b3Vector3&)bodyA.m_pos, (b3Vector3&)bodyA.m_linVel, (b3Vector3&)bodyA.m_angVel, bodyA.m_invMass, (const b3Matrix3x3&)m_shapes[aIdx].m_invInertiaWorld,
+ (b3Vector3&)bodyB.m_pos, (b3Vector3&)bodyB.m_linVel, (b3Vector3&)bodyB.m_angVel, bodyB.m_invMass, (const b3Matrix3x3&)m_shapes[bIdx].m_invInertiaWorld,
+ maxRambdaDt, minRambdaDt);
}
}
if (m_wgUsedBodies)
{
- if (m_wgUsedBodies[m_curWgidx].size()<usedBodies.size())
+ if (m_wgUsedBodies[m_curWgidx].size() < usedBodies.size())
{
m_wgUsedBodies[m_curWgidx].resize(usedBodies.size());
}
- for (int i=0;i<usedBodies.size();i++)
+ for (int i = 0; i < usedBodies.size(); i++)
{
if (usedBodies[i])
{
//printf("cell %d uses body %d\n", m_curWgidx,i);
- m_wgUsedBodies[m_curWgidx][i]=1;
+ m_wgUsedBodies[m_curWgidx][i] = 1;
}
}
}
-
}
-
-
-
}
b3AlignedObjectArray<b3RigidBodyData>& m_bodies;
@@ -397,24 +361,22 @@ void b3CpuRigidBodyPipeline::solveContactConstraints()
int m_nIterations = 4;
b3AlignedObjectArray<b3ContactConstraint4> contactConstraints;
-// const b3AlignedObjectArray<b3Contact4Data>& contacts = m_data->m_np->getContacts();
+ // const b3AlignedObjectArray<b3Contact4Data>& contacts = m_data->m_np->getContacts();
int n = contactConstraints.size();
//convert contacts...
-
-
int maxNumBatches = 250;
- for(int iter=0; iter<m_nIterations; iter++)
+ for (int iter = 0; iter < m_nIterations; iter++)
{
- b3SolveTask task( m_data->m_rigidBodies, m_data->m_inertias, contactConstraints, 0, n ,maxNumBatches,0,0);
+ b3SolveTask task(m_data->m_rigidBodies, m_data->m_inertias, contactConstraints, 0, n, maxNumBatches, 0, 0);
task.m_solveFriction = false;
task.run(0);
}
- for(int iter=0; iter<m_nIterations; iter++)
+ for (int iter = 0; iter < m_nIterations; iter++)
{
- b3SolveTask task( m_data->m_rigidBodies, m_data->m_inertias, contactConstraints, 0, n ,maxNumBatches,0,0);
+ b3SolveTask task(m_data->m_rigidBodies, m_data->m_inertias, contactConstraints, 0, n, maxNumBatches, 0, 0);
task.m_solveFriction = true;
task.run(0);
}
@@ -422,53 +384,51 @@ void b3CpuRigidBodyPipeline::solveContactConstraints()
void b3CpuRigidBodyPipeline::integrate(float deltaTime)
{
- float angDamping=0.f;
- b3Vector3 gravityAcceleration=b3MakeVector3(0,-9,0);
+ float angDamping = 0.f;
+ b3Vector3 gravityAcceleration = b3MakeVector3(0, -9, 0);
//integrate transforms (external forces/gravity should be moved into constraint solver)
- for (int i=0;i<m_data->m_rigidBodies.size();i++)
+ for (int i = 0; i < m_data->m_rigidBodies.size(); i++)
{
- b3IntegrateTransform(&m_data->m_rigidBodies[i],deltaTime,angDamping,gravityAcceleration);
+ b3IntegrateTransform(&m_data->m_rigidBodies[i], deltaTime, angDamping, gravityAcceleration);
}
-
}
-int b3CpuRigidBodyPipeline::registerPhysicsInstance(float mass, const float* position, const float* orientation, int collidableIndex, int userData)
+int b3CpuRigidBodyPipeline::registerPhysicsInstance(float mass, const float* position, const float* orientation, int collidableIndex, int userData)
{
b3RigidBodyData body;
int bodyIndex = m_data->m_rigidBodies.size();
- body.m_invMass = mass ? 1.f/mass : 0.f;
- body.m_angVel.setValue(0,0,0);
+ body.m_invMass = mass ? 1.f / mass : 0.f;
+ body.m_angVel.setValue(0, 0, 0);
body.m_collidableIdx = collidableIndex;
body.m_frictionCoeff = 0.3f;
- body.m_linVel.setValue(0,0,0);
- body.m_pos.setValue(position[0],position[1],position[2]);
- body.m_quat.setValue(orientation[0],orientation[1],orientation[2],orientation[3]);
+ body.m_linVel.setValue(0, 0, 0);
+ body.m_pos.setValue(position[0], position[1], position[2]);
+ body.m_quat.setValue(orientation[0], orientation[1], orientation[2], orientation[3]);
body.m_restituitionCoeff = 0.f;
m_data->m_rigidBodies.push_back(body);
-
- if (collidableIndex>=0)
+ if (collidableIndex >= 0)
{
b3Aabb& worldAabb = m_data->m_aabbWorldSpace.expand();
b3Aabb localAabb = m_data->m_np->getLocalSpaceAabb(collidableIndex);
- b3Vector3 localAabbMin=b3MakeVector3(localAabb.m_min[0],localAabb.m_min[1],localAabb.m_min[2]);
- b3Vector3 localAabbMax=b3MakeVector3(localAabb.m_max[0],localAabb.m_max[1],localAabb.m_max[2]);
-
+ b3Vector3 localAabbMin = b3MakeVector3(localAabb.m_min[0], localAabb.m_min[1], localAabb.m_min[2]);
+ b3Vector3 localAabbMax = b3MakeVector3(localAabb.m_max[0], localAabb.m_max[1], localAabb.m_max[2]);
+
b3Scalar margin = 0.01f;
b3Transform t;
t.setIdentity();
- t.setOrigin(b3MakeVector3(position[0],position[1],position[2]));
- t.setRotation(b3Quaternion(orientation[0],orientation[1],orientation[2],orientation[3]));
- b3TransformAabb(localAabbMin,localAabbMax, margin,t,worldAabb.m_minVec,worldAabb.m_maxVec);
-
- m_data->m_bp->createProxy(worldAabb.m_minVec,worldAabb.m_maxVec,bodyIndex,0,1,1);
-// b3Vector3 aabbMin,aabbMax;
- // m_data->m_bp->getAabb(bodyIndex,aabbMin,aabbMax);
+ t.setOrigin(b3MakeVector3(position[0], position[1], position[2]));
+ t.setRotation(b3Quaternion(orientation[0], orientation[1], orientation[2], orientation[3]));
+ b3TransformAabb(localAabbMin, localAabbMax, margin, t, worldAabb.m_minVec, worldAabb.m_maxVec);
- } else
+ m_data->m_bp->createProxy(worldAabb.m_minVec, worldAabb.m_maxVec, bodyIndex, 0, 1, 1);
+ // b3Vector3 aabbMin,aabbMax;
+ // m_data->m_bp->getAabb(bodyIndex,aabbMin,aabbMax);
+ }
+ else
{
b3Error("registerPhysicsInstance using invalid collidableIndex\n");
}
@@ -476,13 +436,12 @@ int b3CpuRigidBodyPipeline::registerPhysicsInstance(float mass, const float* po
return bodyIndex;
}
-
const struct b3RigidBodyData* b3CpuRigidBodyPipeline::getBodyBuffer() const
{
return m_data->m_rigidBodies.size() ? &m_data->m_rigidBodies[0] : 0;
}
-int b3CpuRigidBodyPipeline::getNumBodies() const
+int b3CpuRigidBodyPipeline::getNumBodies() const
{
return m_data->m_rigidBodies.size();
}
diff --git a/thirdparty/bullet/Bullet3Dynamics/b3CpuRigidBodyPipeline.h b/thirdparty/bullet/Bullet3Dynamics/b3CpuRigidBodyPipeline.h
index 2f3c2ae77e..9c65419f26 100644
--- a/thirdparty/bullet/Bullet3Dynamics/b3CpuRigidBodyPipeline.h
+++ b/thirdparty/bullet/Bullet3Dynamics/b3CpuRigidBodyPipeline.h
@@ -16,52 +16,47 @@ subject to the following restrictions:
#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;
+ 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);
+ 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 addConstraint(class b3TypedConstraint* constraint);
+ void removeConstraint(b3TypedConstraint* constraint);
- void castRays(const b3AlignedObjectArray<b3RayInfo>& rays, b3AlignedObjectArray<b3RayHit>& hitResults);
+ void castRays(const b3AlignedObjectArray<b3RayInfo>& rays, b3AlignedObjectArray<b3RayHit>& hitResults);
const struct b3RigidBodyData* getBodyBuffer() const;
- int getNumBodies() const;
-
+ int getNumBodies() const;
};
-#endif //B3_CPU_RIGIDBODY_PIPELINE_H \ No newline at end of file
+#endif //B3_CPU_RIGIDBODY_PIPELINE_H \ No newline at end of file
diff --git a/thirdparty/bullet/Bullet3Dynamics/shared/b3ContactConstraint4.h b/thirdparty/bullet/Bullet3Dynamics/shared/b3ContactConstraint4.h
index 68cf65e312..cf2eed0e7c 100644
--- a/thirdparty/bullet/Bullet3Dynamics/shared/b3ContactConstraint4.h
+++ b/thirdparty/bullet/Bullet3Dynamics/shared/b3ContactConstraint4.h
@@ -5,30 +5,27 @@
typedef struct b3ContactConstraint4 b3ContactConstraint4_t;
-
struct b3ContactConstraint4
{
-
- b3Float4 m_linear;//normal?
+ b3Float4 m_linear; //normal?
b3Float4 m_worldPos[4];
- b3Float4 m_center; // friction
+ 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
+ float m_fJacCoeffInv[2]; // friction
+ float m_fAppliedRambdaDt[2]; // friction
unsigned int m_bodyA;
unsigned int m_bodyB;
- int m_batchIdx;
+ int m_batchIdx;
unsigned int m_paddings;
-
};
//inline void setFrictionCoeff(float value) { m_linear[3] = value; }
-inline float b3GetFrictionCoeff(b3ContactConstraint4_t* constraint)
+inline float b3GetFrictionCoeff(b3ContactConstraint4_t* constraint)
{
- return constraint->m_linear.w;
+ return constraint->m_linear.w;
}
-#endif //B3_CONTACT_CONSTRAINT5_H
+#endif //B3_CONTACT_CONSTRAINT5_H
diff --git a/thirdparty/bullet/Bullet3Dynamics/shared/b3ConvertConstraint4.h b/thirdparty/bullet/Bullet3Dynamics/shared/b3ConvertConstraint4.h
index 805a2bd3ea..3e72f1c3f2 100644
--- a/thirdparty/bullet/Bullet3Dynamics/shared/b3ConvertConstraint4.h
+++ b/thirdparty/bullet/Bullet3Dynamics/shared/b3ConvertConstraint4.h
@@ -4,89 +4,84 @@
#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)
+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;
- }
+ 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)
+void setLinearAndAngular(b3Float4ConstArg n, b3Float4ConstArg r0, b3Float4ConstArg r1, b3Float4* linear, b3Float4* angular0, b3Float4* angular1)
{
- *linear = b3MakeFloat4(n.x,n.y,n.z,0.f);
+ *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 )
+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)
+ 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);
+ 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 )
+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++)
+ 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++)
+ 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
+ if (ic >= src->m_worldNormalOnB.w) //npoints
{
dstC->m_jacCoeffInv[ic] = 0.f;
continue;
@@ -98,56 +93,56 @@ void setConstraint4( b3Float4ConstArg posA, b3Float4ConstArg linVelA, b3Float4Co
setLinearAndAngular(src->m_worldNormalOnB, r0, r1, &linear, &angular0, &angular1);
dstC->m_jacCoeffInv[ic] = calcJacCoeff(linear, -linear, angular0, angular1,
- invMassA, &invInertiaA, invMassB, &invInertiaB );
+ invMassA, &invInertiaA, invMassB, &invInertiaB);
relVelN = calcRelVel(linear, -linear, angular0, angular1,
- linVelA, angVelA, linVelB, angVelB);
+ linVelA, angVelA, linVelB, angVelB);
- float e = 0.f;//src->getRestituitionCoeff();
- if( relVelN*relVelN < 0.004f ) e = 0.f;
+ float e = 0.f; //src->getRestituitionCoeff();
+ if (relVelN * relVelN < 0.004f) e = 0.f;
- dstC->m_b[ic] = e*relVelN;
+ 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_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++)
+ 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]);
-
+ 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++)
+ 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 );
+ invMassA, &invInertiaA, invMassB, &invInertiaB);
dstC->m_fAppliedRambdaDt[i] = 0.f;
}
dstC->m_center = center;
}
- for(int i=0; i<4; i++)
+ for (int i = 0; i < 4; i++)
{
- if( i<src->m_worldNormalOnB.w )
+ 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);
+ dstC->m_worldPos[i] = b3MakeFloat4(0.f, 0.f, 0.f, 0.f);
}
}
}
diff --git a/thirdparty/bullet/Bullet3Dynamics/shared/b3Inertia.h b/thirdparty/bullet/Bullet3Dynamics/shared/b3Inertia.h
index 96fe9f8b39..602a1335aa 100644
--- a/thirdparty/bullet/Bullet3Dynamics/shared/b3Inertia.h
+++ b/thirdparty/bullet/Bullet3Dynamics/shared/b3Inertia.h
@@ -11,5 +11,4 @@ struct b3Inertia
b3Mat3x3 m_initInvInertia;
};
-
-#endif //B3_INERTIA_H \ No newline at end of file
+#endif //B3_INERTIA_H \ No newline at end of file
diff --git a/thirdparty/bullet/Bullet3Dynamics/shared/b3IntegrateTransforms.h b/thirdparty/bullet/Bullet3Dynamics/shared/b3IntegrateTransforms.h
index e96f90d3f3..56d9118f95 100644
--- a/thirdparty/bullet/Bullet3Dynamics/shared/b3IntegrateTransforms.h
+++ b/thirdparty/bullet/Bullet3Dynamics/shared/b3IntegrateTransforms.h
@@ -2,11 +2,8 @@
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h"
-
-
-inline void integrateSingleTransform( __global b3RigidBodyData_t* bodies,int nodeID, float timeStep, float angularDamping, b3Float4ConstArg gravityAcceleration)
+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);
@@ -18,27 +15,27 @@ inline void integrateSingleTransform( __global b3RigidBodyData_t* bodies,int nod
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)
+ if (fAngle * timeStep > BT_GPU_ANGULAR_MOTION_THRESHOLD)
{
fAngle = BT_GPU_ANGULAR_MOTION_THRESHOLD / timeStep;
}
- if(fAngle < 0.001f)
+ if (fAngle < 0.001f)
{
// use Taylor's expansions of sync function
- axis = angvel * (0.5f*timeStep-(timeStep*timeStep*timeStep)*0.020833333333f * fAngle * fAngle);
+ 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);
+ axis = angvel * (b3Sin(0.5f * fAngle * timeStep) / fAngle);
}
-
+
b3Quat dorn;
dorn.x = axis.x;
dorn.y = axis.y;
@@ -47,23 +44,21 @@ inline void integrateSingleTransform( __global b3RigidBodyData_t* bodies,int nod
b3Quat orn0 = bodies[nodeID].m_quat;
b3Quat predictedOrn = b3QuatMul(dorn, orn0);
predictedOrn = b3QuatNormalized(predictedOrn);
- bodies[nodeID].m_quat=predictedOrn;
+ bodies[nodeID].m_quat = predictedOrn;
}
- //linear velocity
- bodies[nodeID].m_pos += bodies[nodeID].m_linVel * timeStep;
-
+ //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)
+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))
+
+ if ((body->m_invMass != 0.f))
{
//angular velocity
{
@@ -72,23 +67,23 @@ inline void b3IntegrateTransform( __global b3RigidBodyData_t* body, float timeSt
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)
+ if (fAngle * timeStep > BT_GPU_ANGULAR_MOTION_THRESHOLD)
{
fAngle = BT_GPU_ANGULAR_MOTION_THRESHOLD / timeStep;
}
- if(fAngle < 0.001f)
+ if (fAngle < 0.001f)
{
// use Taylor's expansions of sync function
- axis = angvel * (0.5f*timeStep-(timeStep*timeStep*timeStep)*0.020833333333f * fAngle * fAngle);
+ 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);
+ axis = angvel * (b3Sin(0.5f * fAngle * timeStep) / fAngle);
}
b3Quat dorn;
dorn.x = axis.x;
@@ -99,15 +94,13 @@ inline void b3IntegrateTransform( __global b3RigidBodyData_t* body, float timeSt
b3Quat predictedOrn = b3QuatMul(dorn, orn0);
predictedOrn = b3QuatNormalized(predictedOrn);
- body->m_quat=predictedOrn;
+ body->m_quat = predictedOrn;
}
//apply gravity
body->m_linVel += gravityAcceleration * timeStep;
- //linear velocity
- body->m_pos += body->m_linVel * timeStep;
-
+ //linear velocity
+ body->m_pos += body->m_linVel * timeStep;
}
-
}
diff --git a/thirdparty/bullet/Bullet3Geometry/b3AabbUtil.h b/thirdparty/bullet/Bullet3Geometry/b3AabbUtil.h
index 4c72d5bbfc..396a401450 100644
--- a/thirdparty/bullet/Bullet3Geometry/b3AabbUtil.h
+++ b/thirdparty/bullet/Bullet3Geometry/b3AabbUtil.h
@@ -12,8 +12,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
-
#ifndef B3_AABB_UTIL2
#define B3_AABB_UTIL2
@@ -21,20 +19,18 @@ subject to the following restrictions:
#include "Bullet3Common/b3Vector3.h"
#include "Bullet3Common/b3MinMax.h"
-
-
-B3_FORCE_INLINE void b3AabbExpand (b3Vector3& aabbMin,
- b3Vector3& aabbMax,
- const b3Vector3& expansionMin,
- const b3Vector3& expansionMax)
+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)
+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;
@@ -43,10 +39,9 @@ B3_FORCE_INLINE bool b3TestPointAgainstAabb2(const b3Vector3 &aabbMin1, const b3
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)
+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;
@@ -56,52 +51,49 @@ B3_FORCE_INLINE bool b3TestAabbAgainstAabb2(const b3Vector3 &aabbMin1, const b3V
}
/// conservative test for overlap between triangle and aabb
-B3_FORCE_INLINE bool b3TestTriangleAgainstAabb2(const b3Vector3 *vertices,
- const b3Vector3 &aabbMin, const b3Vector3 &aabbMax)
+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];
+ 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)
+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);
+ 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)
+ 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();
+ 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();
+ tymax = (bounds[1 - raySign[1]].getY() - rayFrom.getY()) * rayInvDirection.getY();
- if ( (tmin > tymax) || (tymin > tmax) )
+ if ((tmin > tymax) || (tymin > tmax))
return false;
if (tymin > tmin)
@@ -111,59 +103,59 @@ B3_FORCE_INLINE bool b3RayAabb2(const b3Vector3& rayFrom,
tmax = tymax;
tzmin = (bounds[raySign[2]].getZ() - rayFrom.getZ()) * rayInvDirection.getZ();
- tzmax = (bounds[1-raySign[2]].getZ() - rayFrom.getZ()) * rayInvDirection.getZ();
+ tzmax = (bounds[1 - raySign[2]].getZ() - rayFrom.getZ()) * rayInvDirection.getZ();
- if ( (tmin > tzmax) || (tzmin > tmax) )
+ if ((tmin > tzmax) || (tzmin > tmax))
return false;
if (tzmin > tmin)
tmin = tzmin;
if (tzmax < tmax)
tmax = tzmax;
- return ( (tmin < lambda_max) && (tmax > lambda_min) );
+ 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)
+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);
+ 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;
+ b3Scalar lambda_exit = param;
b3Vector3 r = target - source;
int i;
- b3Scalar normSign = 1;
- b3Vector3 hitNormal = b3MakeVector3(0,0,0);
- int bit=1;
+ b3Scalar normSign = 1;
+ b3Vector3 hitNormal = b3MakeVector3(0, 0, 0);
+ int bit = 1;
- for (int j=0;j<2;j++)
+ 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];
+ b3Scalar lambda = (-source[i] - aabbHalfExtent[i] * normSign) / r[i];
if (lambda_enter <= lambda)
{
lambda_enter = lambda;
- hitNormal.setValue(0,0,0);
+ hitNormal.setValue(0, 0, 0);
hitNormal[i] = normSign;
}
}
- else if (targetOutcode & bit)
+ else if (targetOutcode & bit)
{
- b3Scalar lambda = (-source[i] - aabbHalfExtent[i]*normSign) / r[i];
+ b3Scalar lambda = (-source[i] - aabbHalfExtent[i] * normSign) / r[i];
b3SetMin(lambda_exit, lambda);
}
- bit<<=1;
+ bit <<= 1;
}
normSign = b3Scalar(-1.);
}
@@ -177,56 +169,49 @@ B3_FORCE_INLINE bool b3RayAabb(const b3Vector3& rayFrom,
return false;
}
-
-
-B3_FORCE_INLINE void b3TransformAabb(const b3Vector3& halfExtents, b3Scalar margin,const b3Transform& t,b3Vector3& aabbMinOut,b3Vector3& aabbMaxOut)
+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 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] );
+ 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)
+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;
+ //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<unsigned int>(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));
- }
+//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<unsigned int>(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
-
+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/thirdparty/bullet/Bullet3Geometry/b3ConvexHullComputer.cpp b/thirdparty/bullet/Bullet3Geometry/b3ConvexHullComputer.cpp
index 18835c38d5..b37652456e 100644
--- a/thirdparty/bullet/Bullet3Geometry/b3ConvexHullComputer.cpp
+++ b/thirdparty/bullet/Bullet3Geometry/b3ConvexHullComputer.cpp
@@ -20,850 +20,851 @@ subject to the following restrictions:
#include "Bullet3Common/b3Vector3.h"
#ifdef __GNUC__
- #include <stdint.h>
- typedef int32_t btInt32_t;
- typedef int64_t btInt64_t;
- typedef uint32_t btUint32_t;
- typedef uint64_t btUint64_t;
+#include <stdint.h>
+typedef int32_t btInt32_t;
+typedef int64_t btInt64_t;
+typedef uint32_t btUint32_t;
+typedef uint64_t btUint64_t;
#elif defined(_MSC_VER)
- typedef __int32 btInt32_t;
- typedef __int64 btInt64_t;
- typedef unsigned __int32 btUint32_t;
- typedef unsigned __int64 btUint64_t;
+typedef __int32 btInt32_t;
+typedef __int64 btInt64_t;
+typedef unsigned __int32 btUint32_t;
+typedef unsigned __int64 btUint64_t;
#else
- typedef int btInt32_t;
- typedef long long int btInt64_t;
- typedef unsigned int btUint32_t;
- typedef unsigned long long int btUint64_t;
+typedef int btInt32_t;
+typedef long long int btInt64_t;
+typedef unsigned int btUint32_t;
+typedef unsigned long long int btUint64_t;
#endif
-
//The definition of USE_X86_64_ASM is moved into the build system. You can enable it manually by commenting out the following lines
//#if (defined(__GNUC__) && defined(__x86_64__) && !defined(__ICL)) // || (defined(__ICL) && defined(_M_X64)) bug in Intel compiler, disable inline assembly
// #define USE_X86_64_ASM
//#endif
-
//#define DEBUG_CONVEX_HULL
//#define SHOW_ITERATIONS
#if defined(DEBUG_CONVEX_HULL) || defined(SHOW_ITERATIONS)
- #include <stdio.h>
+#include <stdio.h>
#endif
// Convex hull implementation based on Preparata and Hong
// Ole Kniemeyer, MAXON Computer GmbH
class b3ConvexHullInternal
{
+public:
+ class Point64
+ {
public:
-
- class Point64
- {
- public:
- btInt64_t x;
- btInt64_t y;
- btInt64_t z;
-
- Point64(btInt64_t x, btInt64_t y, btInt64_t z): x(x), y(y), z(z)
- {
- }
+ btInt64_t x;
+ btInt64_t y;
+ btInt64_t z;
- bool isZero()
- {
- return (x == 0) && (y == 0) && (z == 0);
- }
+ Point64(btInt64_t x, btInt64_t y, btInt64_t z) : x(x), y(y), z(z)
+ {
+ }
- btInt64_t dot(const Point64& b) const
- {
- return x * b.x + y * b.y + z * b.z;
- }
- };
-
- class Point32
- {
- public:
- btInt32_t x;
- btInt32_t y;
- btInt32_t z;
- int index;
-
- Point32()
- {
- }
-
- Point32(btInt32_t x, btInt32_t y, btInt32_t z): x(x), y(y), z(z), index(-1)
- {
- }
-
- bool operator==(const Point32& b) const
- {
- return (x == b.x) && (y == b.y) && (z == b.z);
- }
+ bool isZero()
+ {
+ return (x == 0) && (y == 0) && (z == 0);
+ }
- bool operator!=(const Point32& b) const
- {
- return (x != b.x) || (y != b.y) || (z != b.z);
- }
+ btInt64_t dot(const Point64& b) const
+ {
+ return x * b.x + y * b.y + z * b.z;
+ }
+ };
- bool isZero()
- {
- return (x == 0) && (y == 0) && (z == 0);
- }
+ class Point32
+ {
+ public:
+ btInt32_t x;
+ btInt32_t y;
+ btInt32_t z;
+ int index;
- Point64 cross(const Point32& b) const
- {
- return Point64(y * b.z - z * b.y, z * b.x - x * b.z, x * b.y - y * b.x);
- }
+ Point32()
+ {
+ }
- Point64 cross(const Point64& b) const
- {
- return Point64(y * b.z - z * b.y, z * b.x - x * b.z, x * b.y - y * b.x);
- }
+ Point32(btInt32_t x, btInt32_t y, btInt32_t z) : x(x), y(y), z(z), index(-1)
+ {
+ }
- btInt64_t dot(const Point32& b) const
- {
- return x * b.x + y * b.y + z * b.z;
- }
+ bool operator==(const Point32& b) const
+ {
+ return (x == b.x) && (y == b.y) && (z == b.z);
+ }
- btInt64_t dot(const Point64& b) const
- {
- return x * b.x + y * b.y + z * b.z;
- }
+ bool operator!=(const Point32& b) const
+ {
+ return (x != b.x) || (y != b.y) || (z != b.z);
+ }
- Point32 operator+(const Point32& b) const
- {
- return Point32(x + b.x, y + b.y, z + b.z);
- }
+ bool isZero()
+ {
+ return (x == 0) && (y == 0) && (z == 0);
+ }
- Point32 operator-(const Point32& b) const
- {
- return Point32(x - b.x, y - b.y, z - b.z);
- }
- };
+ Point64 cross(const Point32& b) const
+ {
+ return Point64(y * b.z - z * b.y, z * b.x - x * b.z, x * b.y - y * b.x);
+ }
- class Int128
+ Point64 cross(const Point64& b) const
{
- public:
- btUint64_t low;
- btUint64_t high;
+ return Point64(y * b.z - z * b.y, z * b.x - x * b.z, x * b.y - y * b.x);
+ }
- Int128()
- {
- }
+ btInt64_t dot(const Point32& b) const
+ {
+ return x * b.x + y * b.y + z * b.z;
+ }
- Int128(btUint64_t low, btUint64_t high): low(low), high(high)
- {
- }
+ btInt64_t dot(const Point64& b) const
+ {
+ return x * b.x + y * b.y + z * b.z;
+ }
- Int128(btUint64_t low): low(low), high(0)
- {
- }
+ Point32 operator+(const Point32& b) const
+ {
+ return Point32(x + b.x, y + b.y, z + b.z);
+ }
- Int128(btInt64_t value): low(value), high((value >= 0) ? 0 : (btUint64_t) -1LL)
- {
- }
+ Point32 operator-(const Point32& b) const
+ {
+ return Point32(x - b.x, y - b.y, z - b.z);
+ }
+ };
- static Int128 mul(btInt64_t a, btInt64_t b);
+ class Int128
+ {
+ public:
+ btUint64_t low;
+ btUint64_t high;
- static Int128 mul(btUint64_t a, btUint64_t b);
+ Int128()
+ {
+ }
- Int128 operator-() const
- {
- return Int128((btUint64_t) -(btInt64_t)low, ~high + (low == 0));
- }
+ Int128(btUint64_t low, btUint64_t high) : low(low), high(high)
+ {
+ }
- Int128 operator+(const Int128& b) const
- {
+ Int128(btUint64_t low) : low(low), high(0)
+ {
+ }
+
+ Int128(btInt64_t value) : low(value), high((value >= 0) ? 0 : (btUint64_t)-1LL)
+ {
+ }
+
+ static Int128 mul(btInt64_t a, btInt64_t b);
+
+ static Int128 mul(btUint64_t a, btUint64_t b);
+
+ Int128 operator-() const
+ {
+ return Int128((btUint64_t) - (btInt64_t)low, ~high + (low == 0));
+ }
+
+ Int128 operator+(const Int128& b) const
+ {
#ifdef USE_X86_64_ASM
- Int128 result;
- __asm__ ("addq %[bl], %[rl]\n\t"
- "adcq %[bh], %[rh]\n\t"
- : [rl] "=r" (result.low), [rh] "=r" (result.high)
- : "0"(low), "1"(high), [bl] "g"(b.low), [bh] "g"(b.high)
- : "cc" );
- return result;
+ Int128 result;
+ __asm__(
+ "addq %[bl], %[rl]\n\t"
+ "adcq %[bh], %[rh]\n\t"
+ : [rl] "=r"(result.low), [rh] "=r"(result.high)
+ : "0"(low), "1"(high), [bl] "g"(b.low), [bh] "g"(b.high)
+ : "cc");
+ return result;
#else
- btUint64_t lo = low + b.low;
- return Int128(lo, high + b.high + (lo < low));
+ btUint64_t lo = low + b.low;
+ return Int128(lo, high + b.high + (lo < low));
#endif
- }
+ }
- Int128 operator-(const Int128& b) const
- {
+ Int128 operator-(const Int128& b) const
+ {
#ifdef USE_X86_64_ASM
- Int128 result;
- __asm__ ("subq %[bl], %[rl]\n\t"
- "sbbq %[bh], %[rh]\n\t"
- : [rl] "=r" (result.low), [rh] "=r" (result.high)
- : "0"(low), "1"(high), [bl] "g"(b.low), [bh] "g"(b.high)
- : "cc" );
- return result;
+ Int128 result;
+ __asm__(
+ "subq %[bl], %[rl]\n\t"
+ "sbbq %[bh], %[rh]\n\t"
+ : [rl] "=r"(result.low), [rh] "=r"(result.high)
+ : "0"(low), "1"(high), [bl] "g"(b.low), [bh] "g"(b.high)
+ : "cc");
+ return result;
#else
- return *this + -b;
+ return *this + -b;
#endif
- }
+ }
- Int128& operator+=(const Int128& b)
- {
+ Int128& operator+=(const Int128& b)
+ {
#ifdef USE_X86_64_ASM
- __asm__ ("addq %[bl], %[rl]\n\t"
- "adcq %[bh], %[rh]\n\t"
- : [rl] "=r" (low), [rh] "=r" (high)
- : "0"(low), "1"(high), [bl] "g"(b.low), [bh] "g"(b.high)
- : "cc" );
+ __asm__(
+ "addq %[bl], %[rl]\n\t"
+ "adcq %[bh], %[rh]\n\t"
+ : [rl] "=r"(low), [rh] "=r"(high)
+ : "0"(low), "1"(high), [bl] "g"(b.low), [bh] "g"(b.high)
+ : "cc");
#else
- btUint64_t lo = low + b.low;
- if (lo < low)
- {
- ++high;
- }
- low = lo;
- high += b.high;
+ btUint64_t lo = low + b.low;
+ if (lo < low)
+ {
+ ++high;
+ }
+ low = lo;
+ high += b.high;
#endif
- return *this;
- }
+ return *this;
+ }
- Int128& operator++()
- {
- if (++low == 0)
- {
- ++high;
- }
- return *this;
- }
+ Int128& operator++()
+ {
+ if (++low == 0)
+ {
+ ++high;
+ }
+ return *this;
+ }
- Int128 operator*(btInt64_t b) const;
+ Int128 operator*(btInt64_t b) const;
- b3Scalar toScalar() const
- {
- return ((btInt64_t) high >= 0) ? b3Scalar(high) * (b3Scalar(0x100000000LL) * b3Scalar(0x100000000LL)) + b3Scalar(low)
- : -(-*this).toScalar();
- }
+ b3Scalar toScalar() const
+ {
+ return ((btInt64_t)high >= 0) ? b3Scalar(high) * (b3Scalar(0x100000000LL) * b3Scalar(0x100000000LL)) + b3Scalar(low)
+ : -(-*this).toScalar();
+ }
- int getSign() const
- {
- return ((btInt64_t) high < 0) ? -1 : (high || low) ? 1 : 0;
- }
+ int getSign() const
+ {
+ return ((btInt64_t)high < 0) ? -1 : (high || low) ? 1 : 0;
+ }
- bool operator<(const Int128& b) const
- {
- return (high < b.high) || ((high == b.high) && (low < b.low));
- }
+ bool operator<(const Int128& b) const
+ {
+ return (high < b.high) || ((high == b.high) && (low < b.low));
+ }
- int ucmp(const Int128&b) const
- {
- if (high < b.high)
- {
- return -1;
- }
- if (high > b.high)
- {
- return 1;
- }
- if (low < b.low)
- {
- return -1;
- }
- if (low > b.low)
- {
- return 1;
- }
- return 0;
- }
- };
+ int ucmp(const Int128& b) const
+ {
+ if (high < b.high)
+ {
+ return -1;
+ }
+ if (high > b.high)
+ {
+ return 1;
+ }
+ if (low < b.low)
+ {
+ return -1;
+ }
+ if (low > b.low)
+ {
+ return 1;
+ }
+ return 0;
+ }
+ };
+ class Rational64
+ {
+ private:
+ btUint64_t m_numerator;
+ btUint64_t m_denominator;
+ int sign;
- class Rational64
+ public:
+ Rational64(btInt64_t numerator, btInt64_t denominator)
{
- private:
- btUint64_t m_numerator;
- btUint64_t m_denominator;
- int sign;
-
- public:
- Rational64(btInt64_t numerator, btInt64_t denominator)
- {
- if (numerator > 0)
- {
- sign = 1;
- m_numerator = (btUint64_t) numerator;
- }
- else if (numerator < 0)
- {
- sign = -1;
- m_numerator = (btUint64_t) -numerator;
- }
- else
- {
- sign = 0;
- m_numerator = 0;
- }
- if (denominator > 0)
- {
- m_denominator = (btUint64_t) denominator;
- }
- else if (denominator < 0)
- {
- sign = -sign;
- m_denominator = (btUint64_t) -denominator;
- }
- else
- {
- m_denominator = 0;
- }
- }
-
- bool isNegativeInfinity() const
- {
- return (sign < 0) && (m_denominator == 0);
- }
-
- bool isNaN() const
- {
- return (sign == 0) && (m_denominator == 0);
- }
-
- int compare(const Rational64& b) const;
-
- b3Scalar toScalar() const
- {
- return sign * ((m_denominator == 0) ? B3_INFINITY : (b3Scalar) m_numerator / m_denominator);
- }
- };
-
+ if (numerator > 0)
+ {
+ sign = 1;
+ m_numerator = (btUint64_t)numerator;
+ }
+ else if (numerator < 0)
+ {
+ sign = -1;
+ m_numerator = (btUint64_t)-numerator;
+ }
+ else
+ {
+ sign = 0;
+ m_numerator = 0;
+ }
+ if (denominator > 0)
+ {
+ m_denominator = (btUint64_t)denominator;
+ }
+ else if (denominator < 0)
+ {
+ sign = -sign;
+ m_denominator = (btUint64_t)-denominator;
+ }
+ else
+ {
+ m_denominator = 0;
+ }
+ }
- class Rational128
+ bool isNegativeInfinity() const
{
- private:
- Int128 numerator;
- Int128 denominator;
- int sign;
- bool isInt64;
+ return (sign < 0) && (m_denominator == 0);
+ }
- public:
- Rational128(btInt64_t value)
- {
- if (value > 0)
- {
- sign = 1;
- this->numerator = value;
- }
- else if (value < 0)
- {
- sign = -1;
- this->numerator = -value;
- }
- else
- {
- sign = 0;
- this->numerator = (btUint64_t) 0;
- }
- this->denominator = (btUint64_t) 1;
- isInt64 = true;
- }
+ bool isNaN() const
+ {
+ return (sign == 0) && (m_denominator == 0);
+ }
- Rational128(const Int128& numerator, const Int128& denominator)
- {
- sign = numerator.getSign();
- if (sign >= 0)
- {
- this->numerator = numerator;
- }
- else
- {
- this->numerator = -numerator;
- }
- int dsign = denominator.getSign();
- if (dsign >= 0)
- {
- this->denominator = denominator;
- }
- else
- {
- sign = -sign;
- this->denominator = -denominator;
- }
- isInt64 = false;
- }
+ int compare(const Rational64& b) const;
- int compare(const Rational128& b) const;
+ b3Scalar toScalar() const
+ {
+ return sign * ((m_denominator == 0) ? B3_INFINITY : (b3Scalar)m_numerator / m_denominator);
+ }
+ };
- int compare(btInt64_t b) const;
+ class Rational128
+ {
+ private:
+ Int128 numerator;
+ Int128 denominator;
+ int sign;
+ bool isInt64;
- b3Scalar toScalar() const
- {
- return sign * ((denominator.getSign() == 0) ? B3_INFINITY : numerator.toScalar() / denominator.toScalar());
- }
- };
+ public:
+ Rational128(btInt64_t value)
+ {
+ if (value > 0)
+ {
+ sign = 1;
+ this->numerator = value;
+ }
+ else if (value < 0)
+ {
+ sign = -1;
+ this->numerator = -value;
+ }
+ else
+ {
+ sign = 0;
+ this->numerator = (btUint64_t)0;
+ }
+ this->denominator = (btUint64_t)1;
+ isInt64 = true;
+ }
- class PointR128
+ Rational128(const Int128& numerator, const Int128& denominator)
{
- public:
- Int128 x;
- Int128 y;
- Int128 z;
- Int128 denominator;
+ sign = numerator.getSign();
+ if (sign >= 0)
+ {
+ this->numerator = numerator;
+ }
+ else
+ {
+ this->numerator = -numerator;
+ }
+ int dsign = denominator.getSign();
+ if (dsign >= 0)
+ {
+ this->denominator = denominator;
+ }
+ else
+ {
+ sign = -sign;
+ this->denominator = -denominator;
+ }
+ isInt64 = false;
+ }
- PointR128()
- {
- }
+ int compare(const Rational128& b) const;
- PointR128(Int128 x, Int128 y, Int128 z, Int128 denominator): x(x), y(y), z(z), denominator(denominator)
- {
- }
+ int compare(btInt64_t b) const;
- b3Scalar xvalue() const
- {
- return x.toScalar() / denominator.toScalar();
- }
+ b3Scalar toScalar() const
+ {
+ return sign * ((denominator.getSign() == 0) ? B3_INFINITY : numerator.toScalar() / denominator.toScalar());
+ }
+ };
- b3Scalar yvalue() const
- {
- return y.toScalar() / denominator.toScalar();
- }
+ class PointR128
+ {
+ public:
+ Int128 x;
+ Int128 y;
+ Int128 z;
+ Int128 denominator;
- b3Scalar zvalue() const
- {
- return z.toScalar() / denominator.toScalar();
- }
- };
+ PointR128()
+ {
+ }
+ PointR128(Int128 x, Int128 y, Int128 z, Int128 denominator) : x(x), y(y), z(z), denominator(denominator)
+ {
+ }
- class Edge;
- class Face;
+ b3Scalar xvalue() const
+ {
+ return x.toScalar() / denominator.toScalar();
+ }
- class Vertex
+ b3Scalar yvalue() const
{
- public:
- Vertex* next;
- Vertex* prev;
- Edge* edges;
- Face* firstNearbyFace;
- Face* lastNearbyFace;
- PointR128 point128;
- Point32 point;
- int copy;
-
- Vertex(): next(NULL), prev(NULL), edges(NULL), firstNearbyFace(NULL), lastNearbyFace(NULL), copy(-1)
- {
- }
+ return y.toScalar() / denominator.toScalar();
+ }
-#ifdef DEBUG_CONVEX_HULL
- void print()
- {
- b3Printf("V%d (%d, %d, %d)", point.index, point.x, point.y, point.z);
- }
+ b3Scalar zvalue() const
+ {
+ return z.toScalar() / denominator.toScalar();
+ }
+ };
- void printGraph();
-#endif
+ class Edge;
+ class Face;
- Point32 operator-(const Vertex& b) const
- {
- return point - b.point;
- }
+ class Vertex
+ {
+ public:
+ Vertex* next;
+ Vertex* prev;
+ Edge* edges;
+ Face* firstNearbyFace;
+ Face* lastNearbyFace;
+ PointR128 point128;
+ Point32 point;
+ int copy;
- Rational128 dot(const Point64& b) const
- {
- return (point.index >= 0) ? Rational128(point.dot(b))
- : Rational128(point128.x * b.x + point128.y * b.y + point128.z * b.z, point128.denominator);
- }
+ Vertex() : next(NULL), prev(NULL), edges(NULL), firstNearbyFace(NULL), lastNearbyFace(NULL), copy(-1)
+ {
+ }
- b3Scalar xvalue() const
- {
- return (point.index >= 0) ? b3Scalar(point.x) : point128.xvalue();
- }
+#ifdef DEBUG_CONVEX_HULL
+ void print()
+ {
+ b3Printf("V%d (%d, %d, %d)", point.index, point.x, point.y, point.z);
+ }
- b3Scalar yvalue() const
- {
- return (point.index >= 0) ? b3Scalar(point.y) : point128.yvalue();
- }
+ void printGraph();
+#endif
- b3Scalar zvalue() const
- {
- return (point.index >= 0) ? b3Scalar(point.z) : point128.zvalue();
- }
+ Point32 operator-(const Vertex& b) const
+ {
+ return point - b.point;
+ }
- void receiveNearbyFaces(Vertex* src)
- {
- if (lastNearbyFace)
- {
- lastNearbyFace->nextWithSameNearbyVertex = src->firstNearbyFace;
- }
- else
- {
- firstNearbyFace = src->firstNearbyFace;
- }
- if (src->lastNearbyFace)
- {
- lastNearbyFace = src->lastNearbyFace;
- }
- for (Face* f = src->firstNearbyFace; f; f = f->nextWithSameNearbyVertex)
- {
- b3Assert(f->nearbyVertex == src);
- f->nearbyVertex = this;
- }
- src->firstNearbyFace = NULL;
- src->lastNearbyFace = NULL;
- }
- };
+ Rational128 dot(const Point64& b) const
+ {
+ return (point.index >= 0) ? Rational128(point.dot(b))
+ : Rational128(point128.x * b.x + point128.y * b.y + point128.z * b.z, point128.denominator);
+ }
+ b3Scalar xvalue() const
+ {
+ return (point.index >= 0) ? b3Scalar(point.x) : point128.xvalue();
+ }
- class Edge
+ b3Scalar yvalue() const
{
- public:
- Edge* next;
- Edge* prev;
- Edge* reverse;
- Vertex* target;
- Face* face;
- int copy;
+ return (point.index >= 0) ? b3Scalar(point.y) : point128.yvalue();
+ }
- ~Edge()
- {
- next = NULL;
- prev = NULL;
- reverse = NULL;
- target = NULL;
- face = NULL;
- }
+ b3Scalar zvalue() const
+ {
+ return (point.index >= 0) ? b3Scalar(point.z) : point128.zvalue();
+ }
- void link(Edge* n)
- {
- b3Assert(reverse->target == n->reverse->target);
- next = n;
- n->prev = this;
- }
+ void receiveNearbyFaces(Vertex* src)
+ {
+ if (lastNearbyFace)
+ {
+ lastNearbyFace->nextWithSameNearbyVertex = src->firstNearbyFace;
+ }
+ else
+ {
+ firstNearbyFace = src->firstNearbyFace;
+ }
+ if (src->lastNearbyFace)
+ {
+ lastNearbyFace = src->lastNearbyFace;
+ }
+ for (Face* f = src->firstNearbyFace; f; f = f->nextWithSameNearbyVertex)
+ {
+ b3Assert(f->nearbyVertex == src);
+ f->nearbyVertex = this;
+ }
+ src->firstNearbyFace = NULL;
+ src->lastNearbyFace = NULL;
+ }
+ };
-#ifdef DEBUG_CONVEX_HULL
- void print()
- {
- b3Printf("E%p : %d -> %d, n=%p p=%p (0 %d\t%d\t%d) -> (%d %d %d)", this, reverse->target->point.index, target->point.index, next, prev,
- reverse->target->point.x, reverse->target->point.y, reverse->target->point.z, target->point.x, target->point.y, target->point.z);
- }
-#endif
- };
+ class Edge
+ {
+ public:
+ Edge* next;
+ Edge* prev;
+ Edge* reverse;
+ Vertex* target;
+ Face* face;
+ int copy;
+
+ ~Edge()
+ {
+ next = NULL;
+ prev = NULL;
+ reverse = NULL;
+ target = NULL;
+ face = NULL;
+ }
- class Face
+ void link(Edge* n)
{
- public:
- Face* next;
- Vertex* nearbyVertex;
- Face* nextWithSameNearbyVertex;
- Point32 origin;
- Point32 dir0;
- Point32 dir1;
+ b3Assert(reverse->target == n->reverse->target);
+ next = n;
+ n->prev = this;
+ }
- Face(): next(NULL), nearbyVertex(NULL), nextWithSameNearbyVertex(NULL)
- {
- }
+#ifdef DEBUG_CONVEX_HULL
+ void print()
+ {
+ b3Printf("E%p : %d -> %d, n=%p p=%p (0 %d\t%d\t%d) -> (%d %d %d)", this, reverse->target->point.index, target->point.index, next, prev,
+ reverse->target->point.x, reverse->target->point.y, reverse->target->point.z, target->point.x, target->point.y, target->point.z);
+ }
+#endif
+ };
- void init(Vertex* a, Vertex* b, Vertex* c)
- {
- nearbyVertex = a;
- origin = a->point;
- dir0 = *b - *a;
- dir1 = *c - *a;
- if (a->lastNearbyFace)
- {
- a->lastNearbyFace->nextWithSameNearbyVertex = this;
- }
- else
- {
- a->firstNearbyFace = this;
- }
- a->lastNearbyFace = this;
- }
+ class Face
+ {
+ public:
+ Face* next;
+ Vertex* nearbyVertex;
+ Face* nextWithSameNearbyVertex;
+ Point32 origin;
+ Point32 dir0;
+ Point32 dir1;
- Point64 getNormal()
- {
- return dir0.cross(dir1);
- }
- };
+ Face() : next(NULL), nearbyVertex(NULL), nextWithSameNearbyVertex(NULL)
+ {
+ }
- template<typename UWord, typename UHWord> class DMul
+ void init(Vertex* a, Vertex* b, Vertex* c)
{
- private:
- static btUint32_t high(btUint64_t value)
- {
- return (btUint32_t) (value >> 32);
- }
-
- static btUint32_t low(btUint64_t value)
- {
- return (btUint32_t) value;
- }
-
- static btUint64_t mul(btUint32_t a, btUint32_t b)
- {
- return (btUint64_t) a * (btUint64_t) b;
- }
-
- static void shlHalf(btUint64_t& value)
- {
- value <<= 32;
- }
-
- static btUint64_t high(Int128 value)
- {
- return value.high;
- }
-
- static btUint64_t low(Int128 value)
- {
- return value.low;
- }
-
- static Int128 mul(btUint64_t a, btUint64_t b)
- {
- return Int128::mul(a, b);
- }
-
- static void shlHalf(Int128& value)
- {
- value.high = value.low;
- value.low = 0;
- }
-
- public:
-
- static void mul(UWord a, UWord b, UWord& resLow, UWord& resHigh)
- {
- UWord p00 = mul(low(a), low(b));
- UWord p01 = mul(low(a), high(b));
- UWord p10 = mul(high(a), low(b));
- UWord p11 = mul(high(a), high(b));
- UWord p0110 = UWord(low(p01)) + UWord(low(p10));
- p11 += high(p01);
- p11 += high(p10);
- p11 += high(p0110);
- shlHalf(p0110);
- p00 += p0110;
- if (p00 < p0110)
- {
- ++p11;
- }
- resLow = p00;
- resHigh = p11;
- }
- };
-
- private:
+ nearbyVertex = a;
+ origin = a->point;
+ dir0 = *b - *a;
+ dir1 = *c - *a;
+ if (a->lastNearbyFace)
+ {
+ a->lastNearbyFace->nextWithSameNearbyVertex = this;
+ }
+ else
+ {
+ a->firstNearbyFace = this;
+ }
+ a->lastNearbyFace = this;
+ }
- class IntermediateHull
+ Point64 getNormal()
{
- public:
- Vertex* minXy;
- Vertex* maxXy;
- Vertex* minYx;
- Vertex* maxYx;
-
- IntermediateHull(): minXy(NULL), maxXy(NULL), minYx(NULL), maxYx(NULL)
- {
- }
-
- void print();
- };
-
- enum Orientation {NONE, CLOCKWISE, COUNTER_CLOCKWISE};
+ return dir0.cross(dir1);
+ }
+ };
- template <typename T> class PoolArray
+ template <typename UWord, typename UHWord>
+ class DMul
+ {
+ private:
+ static btUint32_t high(btUint64_t value)
{
- private:
- T* array;
- int size;
+ return (btUint32_t)(value >> 32);
+ }
- public:
- PoolArray<T>* next;
+ static btUint32_t low(btUint64_t value)
+ {
+ return (btUint32_t)value;
+ }
- PoolArray(int size): size(size), next(NULL)
- {
- array = (T*) b3AlignedAlloc(sizeof(T) * size, 16);
- }
+ static btUint64_t mul(btUint32_t a, btUint32_t b)
+ {
+ return (btUint64_t)a * (btUint64_t)b;
+ }
- ~PoolArray()
- {
- b3AlignedFree(array);
- }
+ static void shlHalf(btUint64_t& value)
+ {
+ value <<= 32;
+ }
- T* init()
- {
- T* o = array;
- for (int i = 0; i < size; i++, o++)
- {
- o->next = (i+1 < size) ? o + 1 : NULL;
- }
- return array;
- }
- };
+ static btUint64_t high(Int128 value)
+ {
+ return value.high;
+ }
- template <typename T> class Pool
+ static btUint64_t low(Int128 value)
{
- private:
- PoolArray<T>* arrays;
- PoolArray<T>* nextArray;
- T* freeObjects;
- int arraySize;
+ return value.low;
+ }
- public:
- Pool(): arrays(NULL), nextArray(NULL), freeObjects(NULL), arraySize(256)
- {
- }
+ static Int128 mul(btUint64_t a, btUint64_t b)
+ {
+ return Int128::mul(a, b);
+ }
- ~Pool()
- {
- while (arrays)
- {
- PoolArray<T>* p = arrays;
- arrays = p->next;
- p->~PoolArray<T>();
- b3AlignedFree(p);
- }
- }
+ static void shlHalf(Int128& value)
+ {
+ value.high = value.low;
+ value.low = 0;
+ }
- void reset()
- {
- nextArray = arrays;
- freeObjects = NULL;
- }
+ public:
+ static void mul(UWord a, UWord b, UWord& resLow, UWord& resHigh)
+ {
+ UWord p00 = mul(low(a), low(b));
+ UWord p01 = mul(low(a), high(b));
+ UWord p10 = mul(high(a), low(b));
+ UWord p11 = mul(high(a), high(b));
+ UWord p0110 = UWord(low(p01)) + UWord(low(p10));
+ p11 += high(p01);
+ p11 += high(p10);
+ p11 += high(p0110);
+ shlHalf(p0110);
+ p00 += p0110;
+ if (p00 < p0110)
+ {
+ ++p11;
+ }
+ resLow = p00;
+ resHigh = p11;
+ }
+ };
- void setArraySize(int arraySize)
- {
- this->arraySize = arraySize;
- }
+private:
+ class IntermediateHull
+ {
+ public:
+ Vertex* minXy;
+ Vertex* maxXy;
+ Vertex* minYx;
+ Vertex* maxYx;
- T* newObject()
- {
- T* o = freeObjects;
- if (!o)
- {
- PoolArray<T>* p = nextArray;
- if (p)
- {
- nextArray = p->next;
- }
- else
- {
- p = new(b3AlignedAlloc(sizeof(PoolArray<T>), 16)) PoolArray<T>(arraySize);
- p->next = arrays;
- arrays = p;
- }
- o = p->init();
- }
- freeObjects = o->next;
- return new(o) T();
- };
+ IntermediateHull() : minXy(NULL), maxXy(NULL), minYx(NULL), maxYx(NULL)
+ {
+ }
- void freeObject(T* object)
- {
- object->~T();
- object->next = freeObjects;
- freeObjects = object;
- }
- };
+ void print();
+ };
- b3Vector3 scaling;
- b3Vector3 center;
- Pool<Vertex> vertexPool;
- Pool<Edge> edgePool;
- Pool<Face> facePool;
- b3AlignedObjectArray<Vertex*> originalVertices;
- int mergeStamp;
- int minAxis;
- int medAxis;
- int maxAxis;
- int usedEdgePairs;
- int maxUsedEdgePairs;
+ enum Orientation
+ {
+ NONE,
+ CLOCKWISE,
+ COUNTER_CLOCKWISE
+ };
- static Orientation getOrientation(const Edge* prev, const Edge* next, const Point32& s, const Point32& t);
- Edge* findMaxAngle(bool ccw, const Vertex* start, const Point32& s, const Point64& rxs, const Point64& sxrxs, Rational64& minCot);
- void findEdgeForCoplanarFaces(Vertex* c0, Vertex* c1, Edge*& e0, Edge*& e1, Vertex* stop0, Vertex* stop1);
+ template <typename T>
+ class PoolArray
+ {
+ private:
+ T* array;
+ int size;
- Edge* newEdgePair(Vertex* from, Vertex* to);
+ public:
+ PoolArray<T>* next;
- void removeEdgePair(Edge* edge)
+ PoolArray(int size) : size(size), next(NULL)
{
- Edge* n = edge->next;
- Edge* r = edge->reverse;
+ array = (T*)b3AlignedAlloc(sizeof(T) * size, 16);
+ }
- b3Assert(edge->target && r->target);
+ ~PoolArray()
+ {
+ b3AlignedFree(array);
+ }
- if (n != edge)
- {
- n->prev = edge->prev;
- edge->prev->next = n;
- r->target->edges = n;
- }
- else
+ T* init()
+ {
+ T* o = array;
+ for (int i = 0; i < size; i++, o++)
{
- r->target->edges = NULL;
+ o->next = (i + 1 < size) ? o + 1 : NULL;
}
-
- n = r->next;
-
- if (n != r)
+ return array;
+ }
+ };
+
+ template <typename T>
+ class Pool
+ {
+ private:
+ PoolArray<T>* arrays;
+ PoolArray<T>* nextArray;
+ T* freeObjects;
+ int arraySize;
+
+ public:
+ Pool() : arrays(NULL), nextArray(NULL), freeObjects(NULL), arraySize(256)
+ {
+ }
+
+ ~Pool()
+ {
+ while (arrays)
{
- n->prev = r->prev;
- r->prev->next = n;
- edge->target->edges = n;
+ PoolArray<T>* p = arrays;
+ arrays = p->next;
+ p->~PoolArray<T>();
+ b3AlignedFree(p);
}
- else
+ }
+
+ void reset()
+ {
+ nextArray = arrays;
+ freeObjects = NULL;
+ }
+
+ void setArraySize(int arraySize)
+ {
+ this->arraySize = arraySize;
+ }
+
+ T* newObject()
+ {
+ T* o = freeObjects;
+ if (!o)
{
- edge->target->edges = NULL;
+ PoolArray<T>* p = nextArray;
+ if (p)
+ {
+ nextArray = p->next;
+ }
+ else
+ {
+ p = new (b3AlignedAlloc(sizeof(PoolArray<T>), 16)) PoolArray<T>(arraySize);
+ p->next = arrays;
+ arrays = p;
+ }
+ o = p->init();
}
+ freeObjects = o->next;
+ return new (o) T();
+ };
- edgePool.freeObject(edge);
- edgePool.freeObject(r);
- usedEdgePairs--;
+ void freeObject(T* object)
+ {
+ object->~T();
+ object->next = freeObjects;
+ freeObjects = object;
}
-
- void computeInternal(int start, int end, IntermediateHull& result);
-
- bool mergeProjection(IntermediateHull& h0, IntermediateHull& h1, Vertex*& c0, Vertex*& c1);
-
- void merge(IntermediateHull& h0, IntermediateHull& h1);
+ };
- b3Vector3 toBtVector(const Point32& v);
+ b3Vector3 scaling;
+ b3Vector3 center;
+ Pool<Vertex> vertexPool;
+ Pool<Edge> edgePool;
+ Pool<Face> facePool;
+ b3AlignedObjectArray<Vertex*> originalVertices;
+ int mergeStamp;
+ int minAxis;
+ int medAxis;
+ int maxAxis;
+ int usedEdgePairs;
+ int maxUsedEdgePairs;
- b3Vector3 getBtNormal(Face* face);
+ static Orientation getOrientation(const Edge* prev, const Edge* next, const Point32& s, const Point32& t);
+ Edge* findMaxAngle(bool ccw, const Vertex* start, const Point32& s, const Point64& rxs, const Point64& sxrxs, Rational64& minCot);
+ void findEdgeForCoplanarFaces(Vertex* c0, Vertex* c1, Edge*& e0, Edge*& e1, Vertex* stop0, Vertex* stop1);
- bool shiftFace(Face* face, b3Scalar amount, b3AlignedObjectArray<Vertex*> stack);
+ Edge* newEdgePair(Vertex* from, Vertex* to);
- public:
- Vertex* vertexList;
+ void removeEdgePair(Edge* edge)
+ {
+ Edge* n = edge->next;
+ Edge* r = edge->reverse;
- void compute(const void* coords, bool doubleCoords, int stride, int count);
+ b3Assert(edge->target && r->target);
- b3Vector3 getCoordinates(const Vertex* v);
+ if (n != edge)
+ {
+ n->prev = edge->prev;
+ edge->prev->next = n;
+ r->target->edges = n;
+ }
+ else
+ {
+ r->target->edges = NULL;
+ }
- b3Scalar shrink(b3Scalar amount, b3Scalar clampAmount);
-};
+ n = r->next;
+
+ if (n != r)
+ {
+ n->prev = r->prev;
+ r->prev->next = n;
+ edge->target->edges = n;
+ }
+ else
+ {
+ edge->target->edges = NULL;
+ }
+
+ edgePool.freeObject(edge);
+ edgePool.freeObject(r);
+ usedEdgePairs--;
+ }
+
+ void computeInternal(int start, int end, IntermediateHull& result);
+
+ bool mergeProjection(IntermediateHull& h0, IntermediateHull& h1, Vertex*& c0, Vertex*& c1);
+
+ void merge(IntermediateHull& h0, IntermediateHull& h1);
+ b3Vector3 toBtVector(const Point32& v);
+
+ b3Vector3 getBtNormal(Face* face);
+
+ bool shiftFace(Face* face, b3Scalar amount, b3AlignedObjectArray<Vertex*> stack);
+
+public:
+ Vertex* vertexList;
+
+ void compute(const void* coords, bool doubleCoords, int stride, int count);
+
+ b3Vector3 getCoordinates(const Vertex* v);
+
+ b3Scalar shrink(b3Scalar amount, b3Scalar clampAmount);
+};
b3ConvexHullInternal::Int128 b3ConvexHullInternal::Int128::operator*(btInt64_t b) const
{
- bool negative = (btInt64_t) high < 0;
+ bool negative = (btInt64_t)high < 0;
Int128 a = negative ? -*this : *this;
if (b < 0)
{
negative = !negative;
b = -b;
}
- Int128 result = mul(a.low, (btUint64_t) b);
- result.high += a.high * (btUint64_t) b;
+ Int128 result = mul(a.low, (btUint64_t)b);
+ result.high += a.high * (btUint64_t)b;
return negative ? -result : result;
}
b3ConvexHullInternal::Int128 b3ConvexHullInternal::Int128::mul(btInt64_t a, btInt64_t b)
{
Int128 result;
-
+
#ifdef USE_X86_64_ASM
- __asm__ ("imulq %[b]"
- : "=a" (result.low), "=d" (result.high)
- : "0"(a), [b] "r"(b)
- : "cc" );
+ __asm__("imulq %[b]"
+ : "=a"(result.low), "=d"(result.high)
+ : "0"(a), [b] "r"(b)
+ : "cc");
return result;
-
+
#else
bool negative = a < 0;
if (negative)
@@ -875,7 +876,7 @@ b3ConvexHullInternal::Int128 b3ConvexHullInternal::Int128::mul(btInt64_t a, btIn
negative = !negative;
b = -b;
}
- DMul<btUint64_t, btUint32_t>::mul((btUint64_t) a, (btUint64_t) b, result.low, result.high);
+ DMul<btUint64_t, btUint32_t>::mul((btUint64_t)a, (btUint64_t)b, result.low, result.high);
return negative ? -result : result;
#endif
}
@@ -885,10 +886,10 @@ b3ConvexHullInternal::Int128 b3ConvexHullInternal::Int128::mul(btUint64_t a, btU
Int128 result;
#ifdef USE_X86_64_ASM
- __asm__ ("mulq %[b]"
- : "=a" (result.low), "=d" (result.high)
- : "0"(a), [b] "r"(b)
- : "cc" );
+ __asm__("mulq %[b]"
+ : "=a"(result.low), "=d"(result.high)
+ : "0"(a), [b] "r"(b)
+ : "cc");
#else
DMul<btUint64_t, btUint32_t>::mul(a, b, result.low, result.high);
@@ -915,24 +916,25 @@ int b3ConvexHullInternal::Rational64::compare(const Rational64& b) const
int result;
btInt64_t tmp;
btInt64_t dummy;
- __asm__ ("mulq %[bn]\n\t"
- "movq %%rax, %[tmp]\n\t"
- "movq %%rdx, %%rbx\n\t"
- "movq %[tn], %%rax\n\t"
- "mulq %[bd]\n\t"
- "subq %[tmp], %%rax\n\t"
- "sbbq %%rbx, %%rdx\n\t" // rdx:rax contains 128-bit-difference "numerator*b.denominator - b.numerator*denominator"
- "setnsb %%bh\n\t" // bh=1 if difference is non-negative, bh=0 otherwise
- "orq %%rdx, %%rax\n\t"
- "setnzb %%bl\n\t" // bl=1 if difference if non-zero, bl=0 if it is zero
- "decb %%bh\n\t" // now bx=0x0000 if difference is zero, 0xff01 if it is negative, 0x0001 if it is positive (i.e., same sign as difference)
- "shll $16, %%ebx\n\t" // ebx has same sign as difference
- : "=&b"(result), [tmp] "=&r"(tmp), "=a"(dummy)
- : "a"(denominator), [bn] "g"(b.numerator), [tn] "g"(numerator), [bd] "g"(b.denominator)
- : "%rdx", "cc" );
- return result ? result ^ sign // if sign is +1, only bit 0 of result is inverted, which does not change the sign of result (and cannot result in zero)
- // if sign is -1, all bits of result are inverted, which changes the sign of result (and again cannot result in zero)
- : 0;
+ __asm__(
+ "mulq %[bn]\n\t"
+ "movq %%rax, %[tmp]\n\t"
+ "movq %%rdx, %%rbx\n\t"
+ "movq %[tn], %%rax\n\t"
+ "mulq %[bd]\n\t"
+ "subq %[tmp], %%rax\n\t"
+ "sbbq %%rbx, %%rdx\n\t" // rdx:rax contains 128-bit-difference "numerator*b.denominator - b.numerator*denominator"
+ "setnsb %%bh\n\t" // bh=1 if difference is non-negative, bh=0 otherwise
+ "orq %%rdx, %%rax\n\t"
+ "setnzb %%bl\n\t" // bl=1 if difference if non-zero, bl=0 if it is zero
+ "decb %%bh\n\t" // now bx=0x0000 if difference is zero, 0xff01 if it is negative, 0x0001 if it is positive (i.e., same sign as difference)
+ "shll $16, %%ebx\n\t" // ebx has same sign as difference
+ : "=&b"(result), [tmp] "=&r"(tmp), "=a"(dummy)
+ : "a"(denominator), [bn] "g"(b.numerator), [tn] "g"(numerator), [bd] "g"(b.denominator)
+ : "%rdx", "cc");
+ return result ? result ^ sign // if sign is +1, only bit 0 of result is inverted, which does not change the sign of result (and cannot result in zero)
+ // if sign is -1, all bits of result are inverted, which changes the sign of result (and again cannot result in zero)
+ : 0;
#else
@@ -953,7 +955,7 @@ int b3ConvexHullInternal::Rational128::compare(const Rational128& b) const
}
if (isInt64)
{
- return -b.compare(sign * (btInt64_t) numerator.low);
+ return -b.compare(sign * (btInt64_t)numerator.low);
}
Int128 nbdLow, nbdHigh, dbnLow, dbnHigh;
@@ -972,7 +974,7 @@ int b3ConvexHullInternal::Rational128::compare(btInt64_t b) const
{
if (isInt64)
{
- btInt64_t a = sign * (btInt64_t) numerator.low;
+ btInt64_t a = sign * (btInt64_t)numerator.low;
return (a > b) ? 1 : (a < b) ? -1 : 0;
}
if (b > 0)
@@ -998,7 +1000,6 @@ int b3ConvexHullInternal::Rational128::compare(btInt64_t b) const
return numerator.ucmp(denominator * b) * sign;
}
-
b3ConvexHullInternal::Edge* b3ConvexHullInternal::newEdgePair(Vertex* from, Vertex* to)
{
b3Assert(from && to);
@@ -1066,7 +1067,7 @@ bool b3ConvexHullInternal::mergeProjection(IntermediateHull& h0, IntermediateHul
}
}
}
-
+
v0 = h0.maxXy;
v1 = h1.maxXy;
Vertex* v00 = NULL;
@@ -1074,7 +1075,7 @@ bool b3ConvexHullInternal::mergeProjection(IntermediateHull& h0, IntermediateHul
btInt32_t sign = 1;
for (int side = 0; side <= 1; side++)
- {
+ {
btInt32_t dx = (v1->point.x - v0->point.x) * sign;
if (dx > 0)
{
@@ -1117,7 +1118,7 @@ bool b3ConvexHullInternal::mergeProjection(IntermediateHull& h0, IntermediateHul
while (true)
{
btInt32_t dy = v1->point.y - v0->point.y;
-
+
Vertex* w1 = side ? v1->prev : v1->next;
if (w1 != v1)
{
@@ -1130,7 +1131,7 @@ bool b3ConvexHullInternal::mergeProjection(IntermediateHull& h0, IntermediateHul
continue;
}
}
-
+
Vertex* w0 = side ? v0->prev : v0->next;
if (w0 != v0)
{
@@ -1144,7 +1145,7 @@ bool b3ConvexHullInternal::mergeProjection(IntermediateHull& h0, IntermediateHul
continue;
}
}
-
+
break;
}
}
@@ -1170,7 +1171,7 @@ bool b3ConvexHullInternal::mergeProjection(IntermediateHull& h0, IntermediateHul
}
v1 = w1;
}
-
+
if (side == 0)
{
v00 = v0;
@@ -1196,7 +1197,7 @@ bool b3ConvexHullInternal::mergeProjection(IntermediateHull& h0, IntermediateHul
{
h0.maxXy = h1.maxXy;
}
-
+
h0.maxYx = h1.maxYx;
c0 = v00;
@@ -1300,7 +1301,7 @@ void b3ConvexHullInternal::computeInternal(int start, int end, IntermediateHull&
}
int split0 = start + n / 2;
- Point32 p = originalVertices[split0-1]->point;
+ Point32 p = originalVertices[split0 - 1]->point;
int split1 = split0;
while ((split1 < end) && (originalVertices[split1]->point == p))
{
@@ -1325,7 +1326,7 @@ void b3ConvexHullInternal::computeInternal(int start, int end, IntermediateHull&
void b3ConvexHullInternal::IntermediateHull::print()
{
b3Printf(" Hull\n");
- for (Vertex* v = minXy; v; )
+ for (Vertex* v = minXy; v;)
{
b3Printf(" ");
v->print();
@@ -1353,7 +1354,7 @@ void b3ConvexHullInternal::IntermediateHull::print()
}
}
if (minXy)
- {
+ {
minXy->copy = (minXy->copy == -1) ? -2 : -1;
minXy->printGraph();
}
@@ -1429,7 +1430,7 @@ b3ConvexHullInternal::Edge* b3ConvexHullInternal::findMaxAngle(bool ccw, const V
Point32 t = *e->target - *start;
Rational64 cot(t.dot(sxrxs), t.dot(rxs));
#ifdef DEBUG_CONVEX_HULL
- b3Printf(" Angle is %f (%d) for ", (float) b3Atan(cot.toScalar()), (int) cot.isNaN());
+ b3Printf(" Angle is %f (%d) for ", (float)b3Atan(cot.toScalar()), (int)cot.isNaN());
e->print();
#endif
if (cot.isNaN())
@@ -1476,7 +1477,7 @@ void b3ConvexHullInternal::findEdgeForCoplanarFaces(Vertex* c0, Vertex* c1, Edge
b3Assert(!start1 || (start1->target->point.dot(normal) == dist));
Point64 perp = s.cross(normal);
b3Assert(!perp.isZero());
-
+
#ifdef DEBUG_CONVEX_HULL
b3Printf(" Advancing %d %d (%p %p, %d %d)\n", c0->point.index, c1->point.index, start0, start1, start0 ? start0->target->point.index : -1, start1 ? start1->target->point.index : -1);
#endif
@@ -1506,7 +1507,7 @@ void b3ConvexHullInternal::findEdgeForCoplanarFaces(Vertex* c0, Vertex* c1, Edge
et0 = e->target->point;
}
}
-
+
btInt64_t maxDot1 = et1.dot(perp);
if (e1)
{
@@ -1543,7 +1544,7 @@ void b3ConvexHullInternal::findEdgeForCoplanarFaces(Vertex* c0, Vertex* c1, Edge
while (true)
{
btInt64_t dy = (et1 - et0).dot(s);
-
+
if (e0 && (e0->target != stop0))
{
Edge* f0 = e0->next->reverse;
@@ -1560,7 +1561,7 @@ void b3ConvexHullInternal::findEdgeForCoplanarFaces(Vertex* c0, Vertex* c1, Edge
}
}
}
-
+
if (e1 && (e1->target != stop1))
{
Edge* f1 = e1->reverse->next;
@@ -1595,7 +1596,7 @@ void b3ConvexHullInternal::findEdgeForCoplanarFaces(Vertex* c0, Vertex* c1, Edge
while (true)
{
btInt64_t dy = (et1 - et0).dot(s);
-
+
if (e1 && (e1->target != stop1))
{
Edge* f1 = e1->prev->reverse;
@@ -1612,7 +1613,7 @@ void b3ConvexHullInternal::findEdgeForCoplanarFaces(Vertex* c0, Vertex* c1, Edge
}
}
}
-
+
if (e0 && (e0->target != stop0))
{
Edge* f0 = e0->reverse->prev;
@@ -1647,7 +1648,6 @@ void b3ConvexHullInternal::findEdgeForCoplanarFaces(Vertex* c0, Vertex* c1, Edge
#endif
}
-
void b3ConvexHullInternal::merge(IntermediateHull& h0, IntermediateHull& h1)
{
if (!h1.maxXy)
@@ -1659,7 +1659,7 @@ void b3ConvexHullInternal::merge(IntermediateHull& h0, IntermediateHull& h1)
h0 = h1;
return;
}
-
+
mergeStamp--;
Vertex* c0 = NULL;
@@ -1699,7 +1699,7 @@ void b3ConvexHullInternal::merge(IntermediateHull& h0, IntermediateHull& h1)
e = e->next;
} while (e != c0->edges);
}
-
+
e = c1->edges;
Edge* start1 = NULL;
if (e)
@@ -1751,7 +1751,7 @@ void b3ConvexHullInternal::merge(IntermediateHull& h0, IntermediateHull& h1)
Point32 r = prevPoint - c0->point;
Point64 rxs = r.cross(s);
Point64 sxrxs = s.cross(rxs);
-
+
#ifdef DEBUG_CONVEX_HULL
b3Printf("\n Checking %d %d\n", c0->point.index, c1->point.index);
#endif
@@ -1802,7 +1802,7 @@ void b3ConvexHullInternal::merge(IntermediateHull& h0, IntermediateHull& h1)
e->prev = pendingTail1;
pendingTail1 = e;
}
-
+
Edge* e0 = min0;
Edge* e1 = min1;
@@ -1819,7 +1819,7 @@ void b3ConvexHullInternal::merge(IntermediateHull& h0, IntermediateHull& h1)
{
if (toPrev1)
{
- for (Edge* e = toPrev1->next, *n = NULL; e != min1; e = n)
+ for (Edge *e = toPrev1->next, *n = NULL; e != min1; e = n)
{
n = e->next;
removeEdgePair(e);
@@ -1855,7 +1855,7 @@ void b3ConvexHullInternal::merge(IntermediateHull& h0, IntermediateHull& h1)
{
if (toPrev0)
{
- for (Edge* e = toPrev0->prev, *n = NULL; e != min0; e = n)
+ for (Edge *e = toPrev0->prev, *n = NULL; e != min0; e = n)
{
n = e->prev;
removeEdgePair(e);
@@ -1897,7 +1897,7 @@ void b3ConvexHullInternal::merge(IntermediateHull& h0, IntermediateHull& h1)
}
else
{
- for (Edge* e = toPrev0->prev, *n = NULL; e != firstNew0; e = n)
+ for (Edge *e = toPrev0->prev, *n = NULL; e != firstNew0; e = n)
{
n = e->prev;
removeEdgePair(e);
@@ -1916,7 +1916,7 @@ void b3ConvexHullInternal::merge(IntermediateHull& h0, IntermediateHull& h1)
}
else
{
- for (Edge* e = toPrev1->next, *n = NULL; e != firstNew1; e = n)
+ for (Edge *e = toPrev1->next, *n = NULL; e != firstNew1; e = n)
{
n = e->next;
removeEdgePair(e);
@@ -1927,7 +1927,7 @@ void b3ConvexHullInternal::merge(IntermediateHull& h0, IntermediateHull& h1)
pendingTail1->link(firstNew1);
}
}
-
+
return;
}
@@ -1935,7 +1935,6 @@ void b3ConvexHullInternal::merge(IntermediateHull& h0, IntermediateHull& h1)
}
}
-
static bool b3PointCmp(const b3ConvexHullInternal::Point32& p, const b3ConvexHullInternal::Point32& q)
{
return (p.y < q.y) || ((p.y == q.y) && ((p.x < q.x) || ((p.x == q.x) && (p.z < q.z))));
@@ -1943,14 +1942,14 @@ static bool b3PointCmp(const b3ConvexHullInternal::Point32& p, const b3ConvexHul
void b3ConvexHullInternal::compute(const void* coords, bool doubleCoords, int stride, int count)
{
- b3Vector3 min = b3MakeVector3(b3Scalar(1e30), b3Scalar(1e30), b3Scalar(1e30)), max = b3MakeVector3(b3Scalar(-1e30), b3Scalar(-1e30), b3Scalar(-1e30));
- const char* ptr = (const char*) coords;
+ b3Vector3 min = b3MakeVector3(b3Scalar(1e30), b3Scalar(1e30), b3Scalar(1e30)), max = b3MakeVector3(b3Scalar(-1e30), b3Scalar(-1e30), b3Scalar(-1e30));
+ const char* ptr = (const char*)coords;
if (doubleCoords)
{
for (int i = 0; i < count; i++)
{
- const double* v = (const double*) ptr;
- b3Vector3 p = b3MakeVector3((b3Scalar) v[0], (b3Scalar) v[1], (b3Scalar) v[2]);
+ const double* v = (const double*)ptr;
+ b3Vector3 p = b3MakeVector3((b3Scalar)v[0], (b3Scalar)v[1], (b3Scalar)v[2]);
ptr += stride;
min.setMin(p);
max.setMax(p);
@@ -1960,7 +1959,7 @@ void b3ConvexHullInternal::compute(const void* coords, bool doubleCoords, int st
{
for (int i = 0; i < count; i++)
{
- const float* v = (const float*) ptr;
+ const float* v = (const float*)ptr;
b3Vector3 p = b3MakeVector3(v[0], v[1], v[2]);
ptr += stride;
min.setMin(p);
@@ -2001,18 +2000,18 @@ void b3ConvexHullInternal::compute(const void* coords, bool doubleCoords, int st
b3AlignedObjectArray<Point32> points;
points.resize(count);
- ptr = (const char*) coords;
+ ptr = (const char*)coords;
if (doubleCoords)
{
for (int i = 0; i < count; i++)
{
- const double* v = (const double*) ptr;
- b3Vector3 p = b3MakeVector3((b3Scalar) v[0], (b3Scalar) v[1], (b3Scalar) v[2]);
+ const double* v = (const double*)ptr;
+ b3Vector3 p = b3MakeVector3((b3Scalar)v[0], (b3Scalar)v[1], (b3Scalar)v[2]);
ptr += stride;
p = (p - center) * s;
- points[i].x = (btInt32_t) p[medAxis];
- points[i].y = (btInt32_t) p[maxAxis];
- points[i].z = (btInt32_t) p[minAxis];
+ points[i].x = (btInt32_t)p[medAxis];
+ points[i].y = (btInt32_t)p[maxAxis];
+ points[i].z = (btInt32_t)p[minAxis];
points[i].index = i;
}
}
@@ -2020,13 +2019,13 @@ void b3ConvexHullInternal::compute(const void* coords, bool doubleCoords, int st
{
for (int i = 0; i < count; i++)
{
- const float* v = (const float*) ptr;
+ const float* v = (const float*)ptr;
b3Vector3 p = b3MakeVector3(v[0], v[1], v[2]);
ptr += stride;
p = (p - center) * s;
- points[i].x = (btInt32_t) p[medAxis];
- points[i].y = (btInt32_t) p[maxAxis];
- points[i].z = (btInt32_t) p[minAxis];
+ points[i].x = (btInt32_t)p[medAxis];
+ points[i].y = (btInt32_t)p[maxAxis];
+ points[i].z = (btInt32_t)p[minAxis];
points[i].index = i;
}
}
@@ -2180,7 +2179,7 @@ b3Scalar b3ConvexHullInternal::shrink(b3Scalar amount, b3Scalar clampAmount)
minDist = dist;
}
}
-
+
if (minDist <= 0)
{
return 0;
@@ -2221,7 +2220,7 @@ bool b3ConvexHullInternal::shiftFace(Face* face, b3Scalar amount, b3AlignedObjec
{
origShift[2] /= scaling[2];
}
- Point32 shift((btInt32_t) origShift[medAxis], (btInt32_t) origShift[maxAxis], (btInt32_t) origShift[minAxis]);
+ Point32 shift((btInt32_t)origShift[medAxis], (btInt32_t)origShift[maxAxis], (btInt32_t)origShift[minAxis]);
if (shift.isZero())
{
return true;
@@ -2229,7 +2228,7 @@ bool b3ConvexHullInternal::shiftFace(Face* face, b3Scalar amount, b3AlignedObjec
Point64 normal = face->getNormal();
#ifdef DEBUG_CONVEX_HULL
b3Printf("\nShrinking face (%d %d %d) (%d %d %d) (%d %d %d) by (%d %d %d)\n",
- face->origin.x, face->origin.y, face->origin.z, face->dir0.x, face->dir0.y, face->dir0.z, face->dir1.x, face->dir1.y, face->dir1.z, shift.x, shift.y, shift.z);
+ face->origin.x, face->origin.y, face->origin.z, face->dir0.x, face->dir0.y, face->dir0.z, face->dir1.x, face->dir1.y, face->dir1.z, shift.x, shift.y, shift.z);
#endif
btInt64_t origDot = face->origin.dot(normal);
Point32 shiftedOrigin = face->origin + shift;
@@ -2266,7 +2265,7 @@ bool b3ConvexHullInternal::shiftFace(Face* face, b3Scalar amount, b3AlignedObjec
#ifdef DEBUG_CONVEX_HULL
b3Printf("Moving downwards, edge is ");
e->print();
- b3Printf(", dot is %f (%f %lld)\n", (float) dot.toScalar(), (float) optDot.toScalar(), shiftedDot);
+ b3Printf(", dot is %f (%f %lld)\n", (float)dot.toScalar(), (float)optDot.toScalar(), shiftedDot);
#endif
if (dot.compare(optDot) < 0)
{
@@ -2302,7 +2301,7 @@ bool b3ConvexHullInternal::shiftFace(Face* face, b3Scalar amount, b3AlignedObjec
#ifdef DEBUG_CONVEX_HULL
b3Printf("Moving upwards, edge is ");
e->print();
- b3Printf(", dot is %f (%f %lld)\n", (float) dot.toScalar(), (float) optDot.toScalar(), shiftedDot);
+ b3Printf(", dot is %f (%f %lld)\n", (float)dot.toScalar(), (float)optDot.toScalar(), shiftedDot);
#endif
if (dot.compare(optDot) > 0)
{
@@ -2318,7 +2317,7 @@ bool b3ConvexHullInternal::shiftFace(Face* face, b3Scalar amount, b3AlignedObjec
}
e = e->prev;
} while (e != startEdge);
-
+
if (!intersection)
{
return true;
@@ -2355,7 +2354,7 @@ bool b3ConvexHullInternal::shiftFace(Face* face, b3Scalar amount, b3AlignedObjec
b3Printf("Needed %d iterations to check for complete containment\n", n);
#endif
}
-
+
Edge* firstIntersection = NULL;
Edge* faceEdge = NULL;
Edge* firstFaceEdge = NULL;
@@ -2464,7 +2463,7 @@ bool b3ConvexHullInternal::shiftFace(Face* face, b3Scalar amount, b3AlignedObjec
#ifdef DEBUG_CONVEX_HULL
b3Printf("1: Removed part contains (%d %d %d)\n", removed->point.x, removed->point.y, removed->point.z);
#endif
-
+
Point64 n0 = intersection->face->getNormal();
Point64 n1 = intersection->reverse->face->getNormal();
btInt64_t m00 = face->dir0.dot(n0);
@@ -2478,16 +2477,13 @@ bool b3ConvexHullInternal::shiftFace(Face* face, b3Scalar amount, b3AlignedObjec
Vertex* v = vertexPool.newObject();
v->point.index = -1;
v->copy = -1;
- v->point128 = PointR128(Int128::mul(face->dir0.x * r0, m11) - Int128::mul(face->dir0.x * r1, m01)
- + Int128::mul(face->dir1.x * r1, m00) - Int128::mul(face->dir1.x * r0, m10) + det * shiftedOrigin.x,
- Int128::mul(face->dir0.y * r0, m11) - Int128::mul(face->dir0.y * r1, m01)
- + Int128::mul(face->dir1.y * r1, m00) - Int128::mul(face->dir1.y * r0, m10) + det * shiftedOrigin.y,
- Int128::mul(face->dir0.z * r0, m11) - Int128::mul(face->dir0.z * r1, m01)
- + Int128::mul(face->dir1.z * r1, m00) - Int128::mul(face->dir1.z * r0, m10) + det * shiftedOrigin.z,
- det);
- v->point.x = (btInt32_t) v->point128.xvalue();
- v->point.y = (btInt32_t) v->point128.yvalue();
- v->point.z = (btInt32_t) v->point128.zvalue();
+ v->point128 = PointR128(Int128::mul(face->dir0.x * r0, m11) - Int128::mul(face->dir0.x * r1, m01) + Int128::mul(face->dir1.x * r1, m00) - Int128::mul(face->dir1.x * r0, m10) + det * shiftedOrigin.x,
+ Int128::mul(face->dir0.y * r0, m11) - Int128::mul(face->dir0.y * r1, m01) + Int128::mul(face->dir1.y * r1, m00) - Int128::mul(face->dir1.y * r0, m10) + det * shiftedOrigin.y,
+ Int128::mul(face->dir0.z * r0, m11) - Int128::mul(face->dir0.z * r1, m01) + Int128::mul(face->dir1.z * r1, m00) - Int128::mul(face->dir1.z * r0, m10) + det * shiftedOrigin.z,
+ det);
+ v->point.x = (btInt32_t)v->point128.xvalue();
+ v->point.y = (btInt32_t)v->point128.yvalue();
+ v->point.z = (btInt32_t)v->point128.zvalue();
intersection->target = v;
v->edges = e;
@@ -2626,7 +2622,6 @@ bool b3ConvexHullInternal::shiftFace(Face* face, b3Scalar amount, b3AlignedObjec
return true;
}
-
static int getVertexCopy(b3ConvexHullInternal::Vertex* vertex, b3AlignedObjectArray<b3ConvexHullInternal::Vertex*>& vertices)
{
int index = vertex->copy;
@@ -2748,8 +2743,3 @@ b3Scalar b3ConvexHullComputer::compute(const void* coords, bool doubleCoords, in
return shift;
}
-
-
-
-
-
diff --git a/thirdparty/bullet/Bullet3Geometry/b3ConvexHullComputer.h b/thirdparty/bullet/Bullet3Geometry/b3ConvexHullComputer.h
index 6dcc931a78..8852c5a524 100644
--- a/thirdparty/bullet/Bullet3Geometry/b3ConvexHullComputer.h
+++ b/thirdparty/bullet/Bullet3Geometry/b3ConvexHullComputer.h
@@ -23,58 +23,56 @@ subject to the following restrictions:
/// 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:
- b3Scalar compute(const void* coords, bool doubleCoords, int stride, int count, b3Scalar shrink, b3Scalar shrinkClamp);
+ int next;
+ int reverse;
+ int targetVertex;
- public:
+ friend class b3ConvexHullComputer;
- class Edge
+ public:
+ int getSourceVertex() const
{
- private:
- int next;
- int reverse;
- int targetVertex;
-
- friend class b3ConvexHullComputer;
-
- public:
- int getSourceVertex() const
- {
- return (this + reverse)->targetVertex;
- }
-
- int getTargetVertex() const
- {
- return targetVertex;
- }
+ return (this + reverse)->targetVertex;
+ }
- const Edge* getNextEdgeOfVertex() const // clockwise list of all edges of a vertex
- {
- return this + next;
- }
+ int getTargetVertex() const
+ {
+ return targetVertex;
+ }
- const Edge* getNextEdgeOfFace() const // counter-clockwise list of all edges of a face
- {
- return (this + reverse)->getNextEdgeOfVertex();
- }
+ const Edge* getNextEdgeOfVertex() const // clockwise list of all edges of a vertex
+ {
+ return this + next;
+ }
- const Edge* getReverseEdge() const
- {
- return this + reverse;
- }
- };
+ 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<b3Vector3> vertices;
+ // Vertices of the output hull
+ b3AlignedObjectArray<b3Vector3> vertices;
- // Edges of the output hull
- b3AlignedObjectArray<Edge> edges;
+ // Edges of the output hull
+ b3AlignedObjectArray<Edge> 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<int> faces;
+ // 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<int> 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).
@@ -86,18 +84,16 @@ class b3ConvexHullComputer
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);
- }
+ 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
-
+#endif //B3_CONVEX_HULL_COMPUTER_H
diff --git a/thirdparty/bullet/Bullet3Geometry/b3GeometryUtil.cpp b/thirdparty/bullet/Bullet3Geometry/b3GeometryUtil.cpp
index dd80fed6bd..c4041003ca 100644
--- a/thirdparty/bullet/Bullet3Geometry/b3GeometryUtil.cpp
+++ b/thirdparty/bullet/Bullet3Geometry/b3GeometryUtil.cpp
@@ -12,49 +12,43 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
-
#include "b3GeometryUtil.h"
-
/*
Make sure this dummy function never changes so that it
can be used by probes that are checking whether the
library is actually installed.
*/
extern "C"
-{
- void b3BulletMathProbe ();
+{
+ void b3BulletMathProbe();
- void b3BulletMathProbe () {}
+ void b3BulletMathProbe() {}
}
-
-bool b3GeometryUtil::isPointInsidePlanes(const b3AlignedObjectArray<b3Vector3>& planeEquations, const b3Vector3& point, b3Scalar margin)
+bool b3GeometryUtil::isPointInsidePlanes(const b3AlignedObjectArray<b3Vector3>& planeEquations, const b3Vector3& point, b3Scalar margin)
{
int numbrushes = planeEquations.size();
- for (int i=0;i<numbrushes;i++)
+ for (int i = 0; i < numbrushes; i++)
{
const b3Vector3& N1 = planeEquations[i];
- b3Scalar dist = b3Scalar(N1.dot(point))+b3Scalar(N1[3])-margin;
- if (dist>b3Scalar(0.))
+ b3Scalar dist = b3Scalar(N1.dot(point)) + b3Scalar(N1[3]) - margin;
+ if (dist > b3Scalar(0.))
{
return false;
}
}
return true;
-
}
-
-bool b3GeometryUtil::areVerticesBehindPlane(const b3Vector3& planeNormal, const b3AlignedObjectArray<b3Vector3>& vertices, b3Scalar margin)
+bool b3GeometryUtil::areVerticesBehindPlane(const b3Vector3& planeNormal, const b3AlignedObjectArray<b3Vector3>& vertices, b3Scalar margin)
{
int numvertices = vertices.size();
- for (int i=0;i<numvertices;i++)
+ for (int i = 0; i < numvertices; i++)
{
const b3Vector3& N1 = vertices[i];
- b3Scalar dist = b3Scalar(planeNormal.dot(N1))+b3Scalar(planeNormal[3])-margin;
- if (dist>b3Scalar(0.))
+ b3Scalar dist = b3Scalar(planeNormal.dot(N1)) + b3Scalar(planeNormal[3]) - margin;
+ if (dist > b3Scalar(0.))
{
return false;
}
@@ -62,102 +56,98 @@ bool b3GeometryUtil::areVerticesBehindPlane(const b3Vector3& planeNormal, const
return true;
}
-bool notExist(const b3Vector3& planeEquation,const b3AlignedObjectArray<b3Vector3>& planeEquations);
+bool notExist(const b3Vector3& planeEquation, const b3AlignedObjectArray<b3Vector3>& planeEquations);
-bool notExist(const b3Vector3& planeEquation,const b3AlignedObjectArray<b3Vector3>& planeEquations)
+bool notExist(const b3Vector3& planeEquation, const b3AlignedObjectArray<b3Vector3>& planeEquations)
{
int numbrushes = planeEquations.size();
- for (int i=0;i<numbrushes;i++)
+ for (int i = 0; i < numbrushes; i++)
{
const b3Vector3& N1 = planeEquations[i];
if (planeEquation.dot(N1) > b3Scalar(0.999))
{
return false;
- }
+ }
}
return true;
}
-void b3GeometryUtil::getPlaneEquationsFromVertices(b3AlignedObjectArray<b3Vector3>& vertices, b3AlignedObjectArray<b3Vector3>& planeEquationsOut )
+void b3GeometryUtil::getPlaneEquationsFromVertices(b3AlignedObjectArray<b3Vector3>& vertices, b3AlignedObjectArray<b3Vector3>& planeEquationsOut)
{
- const int numvertices = vertices.size();
+ const int numvertices = vertices.size();
// brute force:
- for (int i=0;i<numvertices;i++)
+ for (int i = 0; i < numvertices; i++)
{
const b3Vector3& N1 = vertices[i];
-
- for (int j=i+1;j<numvertices;j++)
+ for (int j = i + 1; j < numvertices; j++)
{
const b3Vector3& N2 = vertices[j];
-
- for (int k=j+1;k<numvertices;k++)
- {
+ for (int k = j + 1; k < numvertices; k++)
+ {
const b3Vector3& N3 = vertices[k];
- b3Vector3 planeEquation,edge0,edge1;
- edge0 = N2-N1;
- edge1 = N3-N1;
+ b3Vector3 planeEquation, edge0, edge1;
+ edge0 = N2 - N1;
+ edge1 = N3 - N1;
b3Scalar normalSign = b3Scalar(1.);
- for (int ww=0;ww<2;ww++)
+ for (int ww = 0; ww < 2; ww++)
{
planeEquation = normalSign * edge0.cross(edge1);
if (planeEquation.length2() > b3Scalar(0.0001))
{
planeEquation.normalize();
- if (notExist(planeEquation,planeEquationsOut))
+ if (notExist(planeEquation, planeEquationsOut))
{
planeEquation[3] = -planeEquation.dot(N1);
-
- //check if inside, and replace supportingVertexOut if needed
- if (areVerticesBehindPlane(planeEquation,vertices,b3Scalar(0.01)))
- {
- planeEquationsOut.push_back(planeEquation);
- }
+
+ //check if inside, and replace supportingVertexOut if needed
+ if (areVerticesBehindPlane(planeEquation, vertices, b3Scalar(0.01)))
+ {
+ planeEquationsOut.push_back(planeEquation);
+ }
}
}
normalSign = b3Scalar(-1.);
}
-
}
}
}
-
}
-void b3GeometryUtil::getVerticesFromPlaneEquations(const b3AlignedObjectArray<b3Vector3>& planeEquations , b3AlignedObjectArray<b3Vector3>& verticesOut )
+void b3GeometryUtil::getVerticesFromPlaneEquations(const b3AlignedObjectArray<b3Vector3>& planeEquations, b3AlignedObjectArray<b3Vector3>& verticesOut)
{
const int numbrushes = planeEquations.size();
// brute force:
- for (int i=0;i<numbrushes;i++)
+ for (int i = 0; i < numbrushes; i++)
{
const b3Vector3& N1 = planeEquations[i];
-
- for (int j=i+1;j<numbrushes;j++)
+ for (int j = i + 1; j < numbrushes; j++)
{
const b3Vector3& N2 = planeEquations[j];
-
- for (int k=j+1;k<numbrushes;k++)
- {
+ for (int k = j + 1; k < numbrushes; k++)
+ {
const b3Vector3& N3 = planeEquations[k];
- b3Vector3 n2n3; n2n3 = N2.cross(N3);
- b3Vector3 n3n1; n3n1 = N3.cross(N1);
- b3Vector3 n1n2; n1n2 = N1.cross(N2);
-
- if ( ( n2n3.length2() > b3Scalar(0.0001) ) &&
- ( n3n1.length2() > b3Scalar(0.0001) ) &&
- ( n1n2.length2() > b3Scalar(0.0001) ) )
+ b3Vector3 n2n3;
+ n2n3 = N2.cross(N3);
+ b3Vector3 n3n1;
+ n3n1 = N3.cross(N1);
+ b3Vector3 n1n2;
+ n1n2 = N1.cross(N2);
+
+ if ((n2n3.length2() > b3Scalar(0.0001)) &&
+ (n3n1.length2() > b3Scalar(0.0001)) &&
+ (n1n2.length2() > b3Scalar(0.0001)))
{
//point P out of 3 plane equations:
- // d1 ( N2 * N3 ) + d2 ( N3 * N1 ) + d3 ( N1 * N2 )
- //P = -------------------------------------------------------------------------
- // N1 . ( N2 * N3 )
-
+ // d1 ( N2 * N3 ) + d2 ( N3 * N1 ) + d3 ( N1 * N2 )
+ //P = -------------------------------------------------------------------------
+ // N1 . ( N2 * N3 )
b3Scalar quotient = (N1.dot(n2n3));
if (b3Fabs(quotient) > b3Scalar(0.000001))
@@ -172,7 +162,7 @@ void b3GeometryUtil::getVerticesFromPlaneEquations(const b3AlignedObjectArray<b3
potentialVertex *= quotient;
//check if inside, and replace supportingVertexOut if needed
- if (isPointInsidePlanes(planeEquations,potentialVertex,b3Scalar(0.01)))
+ if (isPointInsidePlanes(planeEquations, potentialVertex, b3Scalar(0.01)))
{
verticesOut.push_back(potentialVertex);
}
@@ -182,4 +172,3 @@ void b3GeometryUtil::getVerticesFromPlaneEquations(const b3AlignedObjectArray<b3
}
}
}
-
diff --git a/thirdparty/bullet/Bullet3Geometry/b3GeometryUtil.h b/thirdparty/bullet/Bullet3Geometry/b3GeometryUtil.h
index 8b5fd7ad62..967c8d67e9 100644
--- a/thirdparty/bullet/Bullet3Geometry/b3GeometryUtil.h
+++ b/thirdparty/bullet/Bullet3Geometry/b3GeometryUtil.h
@@ -12,7 +12,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#ifndef B3_GEOMETRY_UTIL_H
#define B3_GEOMETRY_UTIL_H
@@ -22,21 +21,16 @@ subject to the following restrictions:
///The b3GeometryUtil helper class provides a few methods to convert between plane equations and vertices.
class b3GeometryUtil
{
- public:
-
-
- static void getPlaneEquationsFromVertices(b3AlignedObjectArray<b3Vector3>& vertices, b3AlignedObjectArray<b3Vector3>& planeEquationsOut );
-
- static void getVerticesFromPlaneEquations(const b3AlignedObjectArray<b3Vector3>& planeEquations , b3AlignedObjectArray<b3Vector3>& verticesOut );
-
- static bool isInside(const b3AlignedObjectArray<b3Vector3>& vertices, const b3Vector3& planeNormal, b3Scalar margin);
-
- static bool isPointInsidePlanes(const b3AlignedObjectArray<b3Vector3>& planeEquations, const b3Vector3& point, b3Scalar margin);
+public:
+ static void getPlaneEquationsFromVertices(b3AlignedObjectArray<b3Vector3>& vertices, b3AlignedObjectArray<b3Vector3>& planeEquationsOut);
- static bool areVerticesBehindPlane(const b3Vector3& planeNormal, const b3AlignedObjectArray<b3Vector3>& vertices, b3Scalar margin);
+ static void getVerticesFromPlaneEquations(const b3AlignedObjectArray<b3Vector3>& planeEquations, b3AlignedObjectArray<b3Vector3>& verticesOut);
-};
+ static bool isInside(const b3AlignedObjectArray<b3Vector3>& vertices, const b3Vector3& planeNormal, b3Scalar margin);
+ static bool isPointInsidePlanes(const b3AlignedObjectArray<b3Vector3>& planeEquations, const b3Vector3& point, b3Scalar margin);
-#endif //B3_GEOMETRY_UTIL_H
+ static bool areVerticesBehindPlane(const b3Vector3& planeNormal, const b3AlignedObjectArray<b3Vector3>& vertices, b3Scalar margin);
+};
+#endif //B3_GEOMETRY_UTIL_H
diff --git a/thirdparty/bullet/Bullet3Geometry/b3GrahamScan2dConvexHull.h b/thirdparty/bullet/Bullet3Geometry/b3GrahamScan2dConvexHull.h
index 1b933c5264..8881c9a638 100644
--- a/thirdparty/bullet/Bullet3Geometry/b3GrahamScan2dConvexHull.h
+++ b/thirdparty/bullet/Bullet3Geometry/b3GrahamScan2dConvexHull.h
@@ -13,41 +13,40 @@ subject to the following restrictions:
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)
+ : b3Vector3(org),
+ m_orgIndex(orgIndex)
{
}
- b3Scalar m_angle;
+ b3Scalar m_angle;
int m_orgIndex;
};
-
-struct b3AngleCompareFunc {
+struct b3AngleCompareFunc
+{
b3Vector3 m_anchor;
b3AngleCompareFunc(const b3Vector3& anchor)
- : m_anchor(anchor)
+ : m_anchor(anchor)
{
}
- bool operator()(const b3GrahamVector3& a, const b3GrahamVector3& b) const {
+ 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();
+ b3Scalar al = (a - m_anchor).length2();
+ b3Scalar bl = (b - m_anchor).length2();
if (al != bl)
- return al < bl;
+ return al < bl;
else
{
return a.m_orgIndex < b.m_orgIndex;
@@ -58,60 +57,60 @@ struct b3AngleCompareFunc {
inline void b3GrahamScanConvexHull2D(b3AlignedObjectArray<b3GrahamVector3>& originalPoints, b3AlignedObjectArray<b3GrahamVector3>& hull, const b3Vector3& normalAxis)
{
- b3Vector3 axis0,axis1;
- b3PlaneSpace1(normalAxis,axis0,axis1);
-
+ b3Vector3 axis0, axis1;
+ b3PlaneSpace1(normalAxis, axis0, axis1);
- if (originalPoints.size()<=1)
+ if (originalPoints.size() <= 1)
{
- for (int i=0;i<originalPoints.size();i++)
+ 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++)
+ for (int i = 0; i < originalPoints.size(); i++)
{
-// const b3Vector3& left = originalPoints[i];
-// const b3Vector3& right = originalPoints[0];
+ // 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);
+ originalPoints.swap(0, i);
}
}
//also precompute angles
originalPoints[0].m_angle = -1e30f;
- for (int i=1;i<originalPoints.size();i++)
+ for (int i = 1; i < originalPoints.size(); i++)
{
b3Vector3 xvec = axis0;
- b3Vector3 ar = originalPoints[i]-originalPoints[0];
+ 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);
+ originalPoints.quickSortInternal(comp, 1, originalPoints.size() - 1);
int i;
- for (i = 0; i<2; 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++)
+ 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;
+ 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
+ else
hull.push_back(originalPoints[i]);
}
}
}
-#endif //B3_GRAHAM_SCAN_2D_CONVEX_HULL_H
+#endif //B3_GRAHAM_SCAN_2D_CONVEX_HULL_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuBroadphaseInterface.h b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuBroadphaseInterface.h
index 0ed8aa8232..b296992525 100644
--- a/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuBroadphaseInterface.h
+++ b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuBroadphaseInterface.h
@@ -12,33 +12,31 @@
class b3GpuBroadphaseInterface
{
public:
-
- typedef class b3GpuBroadphaseInterface* (CreateFunc)(cl_context ctx,cl_device_id device, cl_command_queue q);
+ 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 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;
+ 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 void writeAabbsToGpu() = 0;
+
+ virtual cl_mem getAabbBufferWS() = 0;
+ virtual int getNumOverlap() = 0;
+ virtual cl_mem getOverlappingPairBuffer() = 0;
- virtual cl_mem getAabbBufferWS()=0;
- virtual int getNumOverlap()=0;
- virtual cl_mem getOverlappingPairBuffer()=0;
+ virtual b3OpenCLArray<b3SapAabb>& getAllAabbsGPU() = 0;
+ virtual b3AlignedObjectArray<b3SapAabb>& getAllAabbsCPU() = 0;
- virtual b3OpenCLArray<b3SapAabb>& getAllAabbsGPU()=0;
- virtual b3AlignedObjectArray<b3SapAabb>& getAllAabbsCPU()=0;
-
virtual b3OpenCLArray<b3Int4>& getOverlappingPairsGPU() = 0;
virtual b3OpenCLArray<int>& getSmallAabbIndicesGPU() = 0;
virtual b3OpenCLArray<int>& getLargeAabbIndicesGPU() = 0;
-
};
-#endif //B3_GPU_BROADPHASE_INTERFACE_H
+#endif //B3_GPU_BROADPHASE_INTERFACE_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.cpp b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.cpp
index 74d0c8056c..e714fadac3 100644
--- a/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.cpp
@@ -5,12 +5,9 @@
#include "kernels/sapKernels.h"
//#include "kernels/gridBroadphase.cl"
-
#include "Bullet3OpenCL/Initialize/b3OpenCLUtils.h"
#include "Bullet3OpenCL/ParallelPrimitives/b3LauncherCL.h"
-
-
#define B3_BROADPHASE_SAP_PATH "src/Bullet3OpenCL/BroadphaseCollision/kernels/sap.cl"
#define B3_GRID_BROADPHASE_PATH "src/Bullet3OpenCL/BroadphaseCollision/kernels/gridBroadphase.cl"
@@ -21,31 +18,25 @@ cl_kernel kFindOverlappingPairs;
cl_kernel m_copyAabbsKernel;
cl_kernel m_sap2Kernel;
-
-
-
-
//int maxPairsPerBody = 64;
-int maxBodiesPerCell = 256;//??
+int maxBodiesPerCell = 256; //??
-b3GpuGridBroadphase::b3GpuGridBroadphase(cl_context ctx,cl_device_id device, cl_command_queue q )
-:m_context(ctx),
-m_device(device),
-m_queue(q),
-m_allAabbsGPU1(ctx,q),
-m_smallAabbsMappingGPU(ctx,q),
-m_largeAabbsMappingGPU(ctx,q),
-m_gpuPairs(ctx,q),
+b3GpuGridBroadphase::b3GpuGridBroadphase(cl_context ctx, cl_device_id device, cl_command_queue q)
+ : m_context(ctx),
+ m_device(device),
+ m_queue(q),
+ m_allAabbsGPU1(ctx, q),
+ m_smallAabbsMappingGPU(ctx, q),
+ m_largeAabbsMappingGPU(ctx, q),
+ m_gpuPairs(ctx, q),
-m_hashGpu(ctx,q),
+ m_hashGpu(ctx, q),
-m_cellStartGpu(ctx,q),
-m_paramsGPU(ctx,q)
+ m_cellStartGpu(ctx, q),
+ m_paramsGPU(ctx, q)
{
-
-
- b3Vector3 gridSize = b3MakeVector3(3,3,3);
- b3Vector3 invGridSize = b3MakeVector3(1.f/gridSize[0],1.f/gridSize[1],1.f/gridSize[2]);
+ b3Vector3 gridSize = b3MakeVector3(3, 3, 3);
+ b3Vector3 invGridSize = b3MakeVector3(1.f / gridSize[0], 1.f / gridSize[1], 1.f / gridSize[2]);
m_paramsCPU.m_gridSize[0] = 128;
m_paramsCPU.m_gridSize[1] = 128;
@@ -58,92 +49,79 @@ m_paramsGPU(ctx,q)
m_paramsCPU.m_invCellSize[3] = 0.f;
m_paramsGPU.push_back(m_paramsCPU);
- cl_int errNum=0;
+ cl_int errNum = 0;
{
const char* sapSrc = sapCL;
- cl_program sapProg = b3OpenCLUtils::compileCLProgramFromString(m_context,m_device,sapSrc,&errNum,"",B3_BROADPHASE_SAP_PATH);
- b3Assert(errNum==CL_SUCCESS);
- m_copyAabbsKernel= b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,sapSrc, "copyAabbsKernel",&errNum,sapProg );
- m_sap2Kernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,sapSrc, "computePairsKernelTwoArrays",&errNum,sapProg );
- b3Assert(errNum==CL_SUCCESS);
+ cl_program sapProg = b3OpenCLUtils::compileCLProgramFromString(m_context, m_device, sapSrc, &errNum, "", B3_BROADPHASE_SAP_PATH);
+ b3Assert(errNum == CL_SUCCESS);
+ m_copyAabbsKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, sapSrc, "copyAabbsKernel", &errNum, sapProg);
+ m_sap2Kernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, sapSrc, "computePairsKernelTwoArrays", &errNum, sapProg);
+ b3Assert(errNum == CL_SUCCESS);
}
{
-
- cl_program gridProg = b3OpenCLUtils::compileCLProgramFromString(m_context,m_device,gridBroadphaseCL,&errNum,"",B3_GRID_BROADPHASE_PATH);
- b3Assert(errNum==CL_SUCCESS);
-
- kCalcHashAABB = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,gridBroadphaseCL, "kCalcHashAABB",&errNum,gridProg);
- b3Assert(errNum==CL_SUCCESS);
-
- kClearCellStart = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,gridBroadphaseCL, "kClearCellStart",&errNum,gridProg);
- b3Assert(errNum==CL_SUCCESS);
-
- kFindCellStart = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,gridBroadphaseCL, "kFindCellStart",&errNum,gridProg);
- b3Assert(errNum==CL_SUCCESS);
-
-
- kFindOverlappingPairs = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,gridBroadphaseCL, "kFindOverlappingPairs",&errNum,gridProg);
- b3Assert(errNum==CL_SUCCESS);
-
-
-
-
- }
+ cl_program gridProg = b3OpenCLUtils::compileCLProgramFromString(m_context, m_device, gridBroadphaseCL, &errNum, "", B3_GRID_BROADPHASE_PATH);
+ b3Assert(errNum == CL_SUCCESS);
- m_sorter = new b3RadixSort32CL(m_context,m_device,m_queue);
+ kCalcHashAABB = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, gridBroadphaseCL, "kCalcHashAABB", &errNum, gridProg);
+ b3Assert(errNum == CL_SUCCESS);
+ kClearCellStart = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, gridBroadphaseCL, "kClearCellStart", &errNum, gridProg);
+ b3Assert(errNum == CL_SUCCESS);
+
+ kFindCellStart = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, gridBroadphaseCL, "kFindCellStart", &errNum, gridProg);
+ b3Assert(errNum == CL_SUCCESS);
+
+ kFindOverlappingPairs = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, gridBroadphaseCL, "kFindOverlappingPairs", &errNum, gridProg);
+ b3Assert(errNum == CL_SUCCESS);
+ }
+
+ m_sorter = new b3RadixSort32CL(m_context, m_device, m_queue);
}
b3GpuGridBroadphase::~b3GpuGridBroadphase()
{
- clReleaseKernel( kCalcHashAABB);
- clReleaseKernel( kClearCellStart);
- clReleaseKernel( kFindCellStart);
- clReleaseKernel( kFindOverlappingPairs);
- clReleaseKernel( m_sap2Kernel);
- clReleaseKernel( m_copyAabbsKernel);
-
-
-
+ clReleaseKernel(kCalcHashAABB);
+ clReleaseKernel(kClearCellStart);
+ clReleaseKernel(kFindCellStart);
+ clReleaseKernel(kFindOverlappingPairs);
+ clReleaseKernel(m_sap2Kernel);
+ clReleaseKernel(m_copyAabbsKernel);
+
delete m_sorter;
}
-
-
-void b3GpuGridBroadphase::createProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int userPtr , int collisionFilterGroup, int collisionFilterMask)
+void b3GpuGridBroadphase::createProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int userPtr, int collisionFilterGroup, int collisionFilterMask)
{
b3SapAabb aabb;
aabb.m_minVec = aabbMin;
aabb.m_maxVec = aabbMax;
aabb.m_minIndices[3] = userPtr;
- aabb.m_signedMaxIndices[3] = m_allAabbsCPU1.size();//NOT userPtr;
+ aabb.m_signedMaxIndices[3] = m_allAabbsCPU1.size(); //NOT userPtr;
m_smallAabbsMappingCPU.push_back(m_allAabbsCPU1.size());
m_allAabbsCPU1.push_back(aabb);
-
}
-void b3GpuGridBroadphase::createLargeProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int userPtr , int collisionFilterGroup, int collisionFilterMask)
+void b3GpuGridBroadphase::createLargeProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int userPtr, int collisionFilterGroup, int collisionFilterMask)
{
b3SapAabb aabb;
aabb.m_minVec = aabbMin;
aabb.m_maxVec = aabbMax;
aabb.m_minIndices[3] = userPtr;
- aabb.m_signedMaxIndices[3] = m_allAabbsCPU1.size();//NOT userPtr;
+ aabb.m_signedMaxIndices[3] = m_allAabbsCPU1.size(); //NOT userPtr;
m_largeAabbsMappingCPU.push_back(m_allAabbsCPU1.size());
m_allAabbsCPU1.push_back(aabb);
}
-void b3GpuGridBroadphase::calculateOverlappingPairs(int maxPairs)
+void b3GpuGridBroadphase::calculateOverlappingPairs(int maxPairs)
{
B3_PROFILE("b3GpuGridBroadphase::calculateOverlappingPairs");
-
if (0)
{
calculateOverlappingPairsHost(maxPairs);
- /*
+ /*
b3AlignedObjectArray<b3Int4> cpuPairs;
m_gpuPairs.copyToHost(cpuPairs);
printf("host m_gpuPairs.size()=%d\n",m_gpuPairs.size());
@@ -154,57 +132,50 @@ void b3GpuGridBroadphase::calculateOverlappingPairs(int maxPairs)
*/
return;
}
-
-
-
-
int numSmallAabbs = m_smallAabbsMappingGPU.size();
- b3OpenCLArray<int> pairCount(m_context,m_queue);
+ b3OpenCLArray<int> pairCount(m_context, m_queue);
pairCount.push_back(0);
- m_gpuPairs.resize(maxPairs);//numSmallAabbs*maxPairsPerBody);
+ m_gpuPairs.resize(maxPairs); //numSmallAabbs*maxPairsPerBody);
{
int numLargeAabbs = m_largeAabbsMappingGPU.size();
if (numLargeAabbs && numSmallAabbs)
{
B3_PROFILE("sap2Kernel");
- b3BufferInfoCL bInfo[] = {
- b3BufferInfoCL( m_allAabbsGPU1.getBufferCL() ),
- b3BufferInfoCL( m_largeAabbsMappingGPU.getBufferCL() ),
- b3BufferInfoCL( m_smallAabbsMappingGPU.getBufferCL() ),
- b3BufferInfoCL( m_gpuPairs.getBufferCL() ),
+ b3BufferInfoCL bInfo[] = {
+ b3BufferInfoCL(m_allAabbsGPU1.getBufferCL()),
+ b3BufferInfoCL(m_largeAabbsMappingGPU.getBufferCL()),
+ b3BufferInfoCL(m_smallAabbsMappingGPU.getBufferCL()),
+ b3BufferInfoCL(m_gpuPairs.getBufferCL()),
b3BufferInfoCL(pairCount.getBufferCL())};
- b3LauncherCL launcher(m_queue, m_sap2Kernel,"m_sap2Kernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( numLargeAabbs );
- launcher.setConst( numSmallAabbs);
- launcher.setConst( 0 );//axis is not used
- launcher.setConst( maxPairs );
- //@todo: use actual maximum work item sizes of the device instead of hardcoded values
- launcher.launch2D( numLargeAabbs, numSmallAabbs,4,64);
-
+ b3LauncherCL launcher(m_queue, m_sap2Kernel, "m_sap2Kernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(numLargeAabbs);
+ launcher.setConst(numSmallAabbs);
+ launcher.setConst(0); //axis is not used
+ launcher.setConst(maxPairs);
+ //@todo: use actual maximum work item sizes of the device instead of hardcoded values
+ launcher.launch2D(numLargeAabbs, numSmallAabbs, 4, 64);
+
int numPairs = pairCount.at(0);
-
- if (numPairs >maxPairs)
+
+ if (numPairs > maxPairs)
{
b3Error("Error running out of pairs: numPairs = %d, maxPairs = %d.\n", numPairs, maxPairs);
- numPairs =maxPairs;
+ numPairs = maxPairs;
}
}
}
-
-
-
if (numSmallAabbs)
{
B3_PROFILE("gridKernel");
m_hashGpu.resize(numSmallAabbs);
{
B3_PROFILE("kCalcHashAABB");
- b3LauncherCL launch(m_queue,kCalcHashAABB,"kCalcHashAABB");
+ b3LauncherCL launch(m_queue, kCalcHashAABB, "kCalcHashAABB");
launch.setConst(numSmallAabbs);
launch.setBuffer(m_allAabbsGPU1.getBufferCL());
launch.setBuffer(m_smallAabbsMappingGPU.getBufferCL());
@@ -214,117 +185,104 @@ void b3GpuGridBroadphase::calculateOverlappingPairs(int maxPairs)
}
m_sorter->execute(m_hashGpu);
-
- int numCells = this->m_paramsCPU.m_gridSize[0]*this->m_paramsCPU.m_gridSize[1]*this->m_paramsCPU.m_gridSize[2];
+
+ int numCells = this->m_paramsCPU.m_gridSize[0] * this->m_paramsCPU.m_gridSize[1] * this->m_paramsCPU.m_gridSize[2];
m_cellStartGpu.resize(numCells);
//b3AlignedObjectArray<int > cellStartCpu;
-
-
+
{
B3_PROFILE("kClearCellStart");
- b3LauncherCL launch(m_queue,kClearCellStart,"kClearCellStart");
+ b3LauncherCL launch(m_queue, kClearCellStart, "kClearCellStart");
launch.setConst(numCells);
launch.setBuffer(m_cellStartGpu.getBufferCL());
launch.launch1D(numCells);
//m_cellStartGpu.copyToHost(cellStartCpu);
//printf("??\n");
-
}
-
{
B3_PROFILE("kFindCellStart");
- b3LauncherCL launch(m_queue,kFindCellStart,"kFindCellStart");
+ b3LauncherCL launch(m_queue, kFindCellStart, "kFindCellStart");
launch.setConst(numSmallAabbs);
launch.setBuffer(m_hashGpu.getBufferCL());
launch.setBuffer(m_cellStartGpu.getBufferCL());
launch.launch1D(numSmallAabbs);
//m_cellStartGpu.copyToHost(cellStartCpu);
//printf("??\n");
-
}
-
+
{
B3_PROFILE("kFindOverlappingPairs");
-
-
- b3LauncherCL launch(m_queue,kFindOverlappingPairs,"kFindOverlappingPairs");
+
+ b3LauncherCL launch(m_queue, kFindOverlappingPairs, "kFindOverlappingPairs");
launch.setConst(numSmallAabbs);
launch.setBuffer(m_allAabbsGPU1.getBufferCL());
launch.setBuffer(m_smallAabbsMappingGPU.getBufferCL());
launch.setBuffer(m_hashGpu.getBufferCL());
launch.setBuffer(m_cellStartGpu.getBufferCL());
-
+
launch.setBuffer(m_paramsGPU.getBufferCL());
//launch.setBuffer(0);
launch.setBuffer(pairCount.getBufferCL());
launch.setBuffer(m_gpuPairs.getBufferCL());
-
+
launch.setConst(maxPairs);
launch.launch1D(numSmallAabbs);
-
int numPairs = pairCount.at(0);
- if (numPairs >maxPairs)
+ if (numPairs > maxPairs)
{
b3Error("Error running out of pairs: numPairs = %d, maxPairs = %d.\n", numPairs, maxPairs);
- numPairs =maxPairs;
+ numPairs = maxPairs;
}
-
+
m_gpuPairs.resize(numPairs);
-
+
if (0)
{
b3AlignedObjectArray<b3Int4> pairsCpu;
m_gpuPairs.copyToHost(pairsCpu);
int sz = m_gpuPairs.size();
- printf("m_gpuPairs.size()=%d\n",sz);
- for (int i=0;i<m_gpuPairs.size();i++)
+ printf("m_gpuPairs.size()=%d\n", sz);
+ for (int i = 0; i < m_gpuPairs.size(); i++)
{
- printf("pair %d = %d,%d\n",i,pairsCpu[i].x,pairsCpu[i].y);
+ printf("pair %d = %d,%d\n", i, pairsCpu[i].x, pairsCpu[i].y);
}
printf("?!?\n");
}
-
}
-
-
}
-
-
-
-
//calculateOverlappingPairsHost(maxPairs);
}
-void b3GpuGridBroadphase::calculateOverlappingPairsHost(int maxPairs)
+void b3GpuGridBroadphase::calculateOverlappingPairsHost(int maxPairs)
{
-
m_hostPairs.resize(0);
m_allAabbsGPU1.copyToHost(m_allAabbsCPU1);
- for (int i=0;i<m_allAabbsCPU1.size();i++)
+ for (int i = 0; i < m_allAabbsCPU1.size(); i++)
{
- for (int j=i+1;j<m_allAabbsCPU1.size();j++)
+ for (int j = i + 1; j < m_allAabbsCPU1.size(); j++)
{
if (b3TestAabbAgainstAabb2(m_allAabbsCPU1[i].m_minVec, m_allAabbsCPU1[i].m_maxVec,
- m_allAabbsCPU1[j].m_minVec,m_allAabbsCPU1[j].m_maxVec))
+ m_allAabbsCPU1[j].m_minVec, m_allAabbsCPU1[j].m_maxVec))
{
b3Int4 pair;
int a = m_allAabbsCPU1[j].m_minIndices[3];
int b = m_allAabbsCPU1[i].m_minIndices[3];
- if (a<=b)
+ if (a <= b)
{
- pair.x = a;
- pair.y = b;//store the original index in the unsorted aabb array
- } else
+ pair.x = a;
+ pair.y = b; //store the original index in the unsorted aabb array
+ }
+ else
{
pair.x = b;
- pair.y = a;//store the original index in the unsorted aabb array
+ pair.y = a; //store the original index in the unsorted aabb array
}
-
- if (m_hostPairs.size()<maxPairs)
+
+ if (m_hostPairs.size() < maxPairs)
{
m_hostPairs.push_back(pair);
}
@@ -332,40 +290,36 @@ void b3GpuGridBroadphase::calculateOverlappingPairsHost(int maxPairs)
}
}
-
m_gpuPairs.copyFromHost(m_hostPairs);
-
-
}
- //call writeAabbsToGpu after done making all changes (createProxy etc)
+//call writeAabbsToGpu after done making all changes (createProxy etc)
void b3GpuGridBroadphase::writeAabbsToGpu()
{
m_allAabbsGPU1.copyFromHost(m_allAabbsCPU1);
m_smallAabbsMappingGPU.copyFromHost(m_smallAabbsMappingCPU);
m_largeAabbsMappingGPU.copyFromHost(m_largeAabbsMappingCPU);
-
}
-cl_mem b3GpuGridBroadphase::getAabbBufferWS()
+cl_mem b3GpuGridBroadphase::getAabbBufferWS()
{
return this->m_allAabbsGPU1.getBufferCL();
}
-int b3GpuGridBroadphase::getNumOverlap()
+int b3GpuGridBroadphase::getNumOverlap()
{
return m_gpuPairs.size();
}
-cl_mem b3GpuGridBroadphase::getOverlappingPairBuffer()
+cl_mem b3GpuGridBroadphase::getOverlappingPairBuffer()
{
return m_gpuPairs.getBufferCL();
}
-b3OpenCLArray<b3SapAabb>& b3GpuGridBroadphase::getAllAabbsGPU()
+b3OpenCLArray<b3SapAabb>& b3GpuGridBroadphase::getAllAabbsGPU()
{
return m_allAabbsGPU1;
}
-b3AlignedObjectArray<b3SapAabb>& b3GpuGridBroadphase::getAllAabbsCPU()
+b3AlignedObjectArray<b3SapAabb>& b3GpuGridBroadphase::getAllAabbsCPU()
{
return m_allAabbsCPU1;
}
@@ -382,4 +336,3 @@ b3OpenCLArray<int>& b3GpuGridBroadphase::getLargeAabbIndicesGPU()
{
return m_largeAabbsMappingGPU;
}
-
diff --git a/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.h b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.h
index ec18c9f716..b76cb43b68 100644
--- a/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.h
+++ b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuGridBroadphase.h
@@ -6,83 +6,75 @@
struct b3ParamsGridBroadphaseCL
{
-
float m_invCellSize[4];
- int m_gridSize[4];
+ int m_gridSize[4];
- int getMaxBodiesPerCell() const
+ int getMaxBodiesPerCell() const
{
return m_gridSize[3];
}
- void setMaxBodiesPerCell(int maxOverlap)
+ 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;
+ cl_context m_context;
+ cl_device_id m_device;
+ cl_command_queue m_queue;
- b3OpenCLArray<b3SapAabb> m_allAabbsGPU1;
- b3AlignedObjectArray<b3SapAabb> m_allAabbsCPU1;
+ b3OpenCLArray<b3SapAabb> m_allAabbsGPU1;
+ b3AlignedObjectArray<b3SapAabb> m_allAabbsCPU1;
- b3OpenCLArray<int> m_smallAabbsMappingGPU;
+ b3OpenCLArray<int> m_smallAabbsMappingGPU;
b3AlignedObjectArray<int> m_smallAabbsMappingCPU;
- b3OpenCLArray<int> m_largeAabbsMappingGPU;
+ b3OpenCLArray<int> m_largeAabbsMappingGPU;
b3AlignedObjectArray<int> m_largeAabbsMappingCPU;
b3AlignedObjectArray<b3Int4> m_hostPairs;
- b3OpenCLArray<b3Int4> m_gpuPairs;
+ b3OpenCLArray<b3Int4> m_gpuPairs;
- b3OpenCLArray<b3SortData> m_hashGpu;
- b3OpenCLArray<int> m_cellStartGpu;
-
+ b3OpenCLArray<b3SortData> m_hashGpu;
+ b3OpenCLArray<int> m_cellStartGpu;
- b3ParamsGridBroadphaseCL m_paramsCPU;
- b3OpenCLArray<b3ParamsGridBroadphaseCL> m_paramsGPU;
+ b3ParamsGridBroadphaseCL m_paramsCPU;
+ b3OpenCLArray<b3ParamsGridBroadphaseCL> m_paramsGPU;
- class b3RadixSort32CL* m_sorter;
+ class b3RadixSort32CL* m_sorter;
public:
-
- b3GpuGridBroadphase(cl_context ctx,cl_device_id device, cl_command_queue q );
+ 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)
+ static b3GpuBroadphaseInterface* CreateFunc(cl_context ctx, cl_device_id device, cl_command_queue q)
{
- return new b3GpuGridBroadphase(ctx,device,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 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);
+ 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 cl_mem getAabbBufferWS();
+ virtual int getNumOverlap();
+ virtual cl_mem getOverlappingPairBuffer();
+
+ virtual b3OpenCLArray<b3SapAabb>& getAllAabbsGPU();
+ virtual b3AlignedObjectArray<b3SapAabb>& getAllAabbsCPU();
- virtual b3OpenCLArray<b3SapAabb>& getAllAabbsGPU();
- virtual b3AlignedObjectArray<b3SapAabb>& getAllAabbsCPU();
-
virtual b3OpenCLArray<b3Int4>& getOverlappingPairsGPU();
virtual b3OpenCLArray<int>& getSmallAabbIndicesGPU();
virtual b3OpenCLArray<int>& getLargeAabbIndicesGPU();
-
};
-#endif //B3_GPU_GRID_BROADPHASE_H \ No newline at end of file
+#endif //B3_GPU_GRID_BROADPHASE_H \ No newline at end of file
diff --git a/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.cpp b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.cpp
index 641df9eb12..0721928684 100644
--- a/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.cpp
@@ -16,177 +16,174 @@ subject to the following restrictions:
#include "b3GpuParallelLinearBvh.h"
-b3GpuParallelLinearBvh::b3GpuParallelLinearBvh(cl_context context, cl_device_id device, cl_command_queue queue) :
- m_queue(queue),
- m_radixSorter(context, device, queue),
-
- m_rootNodeIndex(context, queue),
- m_maxDistanceFromRoot(context, queue),
- m_temp(context, queue),
-
- m_internalNodeAabbs(context, queue),
- m_internalNodeLeafIndexRanges(context, queue),
- m_internalNodeChildNodes(context, queue),
- m_internalNodeParentNodes(context, queue),
-
- m_commonPrefixes(context, queue),
- m_commonPrefixLengths(context, queue),
- m_distanceFromRoot(context, queue),
-
- m_leafNodeParentNodes(context, queue),
- m_mortonCodesAndAabbIndicies(context, queue),
- m_mergedAabb(context, queue),
- m_leafNodeAabbs(context, queue),
-
- m_largeAabbs(context, queue)
+b3GpuParallelLinearBvh::b3GpuParallelLinearBvh(cl_context context, cl_device_id device, cl_command_queue queue) : m_queue(queue),
+ m_radixSorter(context, device, queue),
+
+ m_rootNodeIndex(context, queue),
+ m_maxDistanceFromRoot(context, queue),
+ m_temp(context, queue),
+
+ m_internalNodeAabbs(context, queue),
+ m_internalNodeLeafIndexRanges(context, queue),
+ m_internalNodeChildNodes(context, queue),
+ m_internalNodeParentNodes(context, queue),
+
+ m_commonPrefixes(context, queue),
+ m_commonPrefixLengths(context, queue),
+ m_distanceFromRoot(context, queue),
+
+ m_leafNodeParentNodes(context, queue),
+ m_mortonCodesAndAabbIndicies(context, queue),
+ m_mergedAabb(context, queue),
+ m_leafNodeAabbs(context, queue),
+
+ m_largeAabbs(context, queue)
{
m_rootNodeIndex.resize(1);
m_maxDistanceFromRoot.resize(1);
m_temp.resize(1);
-
+
//
const char CL_PROGRAM_PATH[] = "src/Bullet3OpenCL/BroadphaseCollision/kernels/parallelLinearBvh.cl";
-
- const char* kernelSource = parallelLinearBvhCL; //parallelLinearBvhCL.h
+
+ const char* kernelSource = parallelLinearBvhCL; //parallelLinearBvhCL.h
cl_int error;
char* additionalMacros = 0;
m_parallelLinearBvhProgram = b3OpenCLUtils::compileCLProgramFromString(context, device, kernelSource, &error, additionalMacros, CL_PROGRAM_PATH);
b3Assert(m_parallelLinearBvhProgram);
-
- m_separateAabbsKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "separateAabbs", &error, m_parallelLinearBvhProgram, additionalMacros );
+
+ m_separateAabbsKernel = b3OpenCLUtils::compileCLKernelFromString(context, device, kernelSource, "separateAabbs", &error, m_parallelLinearBvhProgram, additionalMacros);
b3Assert(m_separateAabbsKernel);
- m_findAllNodesMergedAabbKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "findAllNodesMergedAabb", &error, m_parallelLinearBvhProgram, additionalMacros );
+ m_findAllNodesMergedAabbKernel = b3OpenCLUtils::compileCLKernelFromString(context, device, kernelSource, "findAllNodesMergedAabb", &error, m_parallelLinearBvhProgram, additionalMacros);
b3Assert(m_findAllNodesMergedAabbKernel);
- m_assignMortonCodesAndAabbIndiciesKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "assignMortonCodesAndAabbIndicies", &error, m_parallelLinearBvhProgram, additionalMacros );
+ m_assignMortonCodesAndAabbIndiciesKernel = b3OpenCLUtils::compileCLKernelFromString(context, device, kernelSource, "assignMortonCodesAndAabbIndicies", &error, m_parallelLinearBvhProgram, additionalMacros);
b3Assert(m_assignMortonCodesAndAabbIndiciesKernel);
-
- m_computeAdjacentPairCommonPrefixKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "computeAdjacentPairCommonPrefix", &error, m_parallelLinearBvhProgram, additionalMacros );
+
+ m_computeAdjacentPairCommonPrefixKernel = b3OpenCLUtils::compileCLKernelFromString(context, device, kernelSource, "computeAdjacentPairCommonPrefix", &error, m_parallelLinearBvhProgram, additionalMacros);
b3Assert(m_computeAdjacentPairCommonPrefixKernel);
- m_buildBinaryRadixTreeLeafNodesKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "buildBinaryRadixTreeLeafNodes", &error, m_parallelLinearBvhProgram, additionalMacros );
+ m_buildBinaryRadixTreeLeafNodesKernel = b3OpenCLUtils::compileCLKernelFromString(context, device, kernelSource, "buildBinaryRadixTreeLeafNodes", &error, m_parallelLinearBvhProgram, additionalMacros);
b3Assert(m_buildBinaryRadixTreeLeafNodesKernel);
- m_buildBinaryRadixTreeInternalNodesKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "buildBinaryRadixTreeInternalNodes", &error, m_parallelLinearBvhProgram, additionalMacros );
+ m_buildBinaryRadixTreeInternalNodesKernel = b3OpenCLUtils::compileCLKernelFromString(context, device, kernelSource, "buildBinaryRadixTreeInternalNodes", &error, m_parallelLinearBvhProgram, additionalMacros);
b3Assert(m_buildBinaryRadixTreeInternalNodesKernel);
- m_findDistanceFromRootKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "findDistanceFromRoot", &error, m_parallelLinearBvhProgram, additionalMacros );
+ m_findDistanceFromRootKernel = b3OpenCLUtils::compileCLKernelFromString(context, device, kernelSource, "findDistanceFromRoot", &error, m_parallelLinearBvhProgram, additionalMacros);
b3Assert(m_findDistanceFromRootKernel);
- m_buildBinaryRadixTreeAabbsRecursiveKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "buildBinaryRadixTreeAabbsRecursive", &error, m_parallelLinearBvhProgram, additionalMacros );
+ m_buildBinaryRadixTreeAabbsRecursiveKernel = b3OpenCLUtils::compileCLKernelFromString(context, device, kernelSource, "buildBinaryRadixTreeAabbsRecursive", &error, m_parallelLinearBvhProgram, additionalMacros);
b3Assert(m_buildBinaryRadixTreeAabbsRecursiveKernel);
-
- m_findLeafIndexRangesKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "findLeafIndexRanges", &error, m_parallelLinearBvhProgram, additionalMacros );
+
+ m_findLeafIndexRangesKernel = b3OpenCLUtils::compileCLKernelFromString(context, device, kernelSource, "findLeafIndexRanges", &error, m_parallelLinearBvhProgram, additionalMacros);
b3Assert(m_findLeafIndexRangesKernel);
-
- m_plbvhCalculateOverlappingPairsKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "plbvhCalculateOverlappingPairs", &error, m_parallelLinearBvhProgram, additionalMacros );
+
+ m_plbvhCalculateOverlappingPairsKernel = b3OpenCLUtils::compileCLKernelFromString(context, device, kernelSource, "plbvhCalculateOverlappingPairs", &error, m_parallelLinearBvhProgram, additionalMacros);
b3Assert(m_plbvhCalculateOverlappingPairsKernel);
- m_plbvhRayTraverseKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "plbvhRayTraverse", &error, m_parallelLinearBvhProgram, additionalMacros );
+ m_plbvhRayTraverseKernel = b3OpenCLUtils::compileCLKernelFromString(context, device, kernelSource, "plbvhRayTraverse", &error, m_parallelLinearBvhProgram, additionalMacros);
b3Assert(m_plbvhRayTraverseKernel);
- m_plbvhLargeAabbAabbTestKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "plbvhLargeAabbAabbTest", &error, m_parallelLinearBvhProgram, additionalMacros );
+ m_plbvhLargeAabbAabbTestKernel = b3OpenCLUtils::compileCLKernelFromString(context, device, kernelSource, "plbvhLargeAabbAabbTest", &error, m_parallelLinearBvhProgram, additionalMacros);
b3Assert(m_plbvhLargeAabbAabbTestKernel);
- m_plbvhLargeAabbRayTestKernel = b3OpenCLUtils::compileCLKernelFromString( context, device, kernelSource, "plbvhLargeAabbRayTest", &error, m_parallelLinearBvhProgram, additionalMacros );
+ m_plbvhLargeAabbRayTestKernel = b3OpenCLUtils::compileCLKernelFromString(context, device, kernelSource, "plbvhLargeAabbRayTest", &error, m_parallelLinearBvhProgram, additionalMacros);
b3Assert(m_plbvhLargeAabbRayTestKernel);
}
-b3GpuParallelLinearBvh::~b3GpuParallelLinearBvh()
+b3GpuParallelLinearBvh::~b3GpuParallelLinearBvh()
{
clReleaseKernel(m_separateAabbsKernel);
clReleaseKernel(m_findAllNodesMergedAabbKernel);
clReleaseKernel(m_assignMortonCodesAndAabbIndiciesKernel);
-
+
clReleaseKernel(m_computeAdjacentPairCommonPrefixKernel);
clReleaseKernel(m_buildBinaryRadixTreeLeafNodesKernel);
clReleaseKernel(m_buildBinaryRadixTreeInternalNodesKernel);
clReleaseKernel(m_findDistanceFromRootKernel);
clReleaseKernel(m_buildBinaryRadixTreeAabbsRecursiveKernel);
-
+
clReleaseKernel(m_findLeafIndexRangesKernel);
-
+
clReleaseKernel(m_plbvhCalculateOverlappingPairsKernel);
clReleaseKernel(m_plbvhRayTraverseKernel);
clReleaseKernel(m_plbvhLargeAabbAabbTestKernel);
clReleaseKernel(m_plbvhLargeAabbRayTestKernel);
-
+
clReleaseProgram(m_parallelLinearBvhProgram);
}
-void b3GpuParallelLinearBvh::build(const b3OpenCLArray<b3SapAabb>& worldSpaceAabbs, const b3OpenCLArray<int>& smallAabbIndices,
- const b3OpenCLArray<int>& largeAabbIndices)
+void b3GpuParallelLinearBvh::build(const b3OpenCLArray<b3SapAabb>& worldSpaceAabbs, const b3OpenCLArray<int>& smallAabbIndices,
+ const b3OpenCLArray<int>& largeAabbIndices)
{
B3_PROFILE("b3ParallelLinearBvh::build()");
-
+
int numLargeAabbs = largeAabbIndices.size();
int numSmallAabbs = smallAabbIndices.size();
-
- //Since all AABBs(both large and small) are input as a contiguous array,
+
+ //Since all AABBs(both large and small) are input as a contiguous array,
//with 2 additional arrays used to indicate the indices of large and small AABBs,
//it is necessary to separate the AABBs so that the large AABBs will not degrade the quality of the BVH.
{
B3_PROFILE("Separate large and small AABBs");
-
+
m_largeAabbs.resize(numLargeAabbs);
m_leafNodeAabbs.resize(numSmallAabbs);
-
+
//Write large AABBs into m_largeAabbs
{
- b3BufferInfoCL bufferInfo[] =
- {
- b3BufferInfoCL( worldSpaceAabbs.getBufferCL() ),
- b3BufferInfoCL( largeAabbIndices.getBufferCL() ),
-
- b3BufferInfoCL( m_largeAabbs.getBufferCL() )
- };
-
+ b3BufferInfoCL bufferInfo[] =
+ {
+ b3BufferInfoCL(worldSpaceAabbs.getBufferCL()),
+ b3BufferInfoCL(largeAabbIndices.getBufferCL()),
+
+ b3BufferInfoCL(m_largeAabbs.getBufferCL())};
+
b3LauncherCL launcher(m_queue, m_separateAabbsKernel, "m_separateAabbsKernel");
- launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) );
+ launcher.setBuffers(bufferInfo, sizeof(bufferInfo) / sizeof(b3BufferInfoCL));
launcher.setConst(numLargeAabbs);
-
+
launcher.launch1D(numLargeAabbs);
}
-
+
//Write small AABBs into m_leafNodeAabbs
{
- b3BufferInfoCL bufferInfo[] =
- {
- b3BufferInfoCL( worldSpaceAabbs.getBufferCL() ),
- b3BufferInfoCL( smallAabbIndices.getBufferCL() ),
-
- b3BufferInfoCL( m_leafNodeAabbs.getBufferCL() )
- };
-
+ b3BufferInfoCL bufferInfo[] =
+ {
+ b3BufferInfoCL(worldSpaceAabbs.getBufferCL()),
+ b3BufferInfoCL(smallAabbIndices.getBufferCL()),
+
+ b3BufferInfoCL(m_leafNodeAabbs.getBufferCL())};
+
b3LauncherCL launcher(m_queue, m_separateAabbsKernel, "m_separateAabbsKernel");
- launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) );
+ launcher.setBuffers(bufferInfo, sizeof(bufferInfo) / sizeof(b3BufferInfoCL));
launcher.setConst(numSmallAabbs);
-
+
launcher.launch1D(numSmallAabbs);
}
-
+
clFinish(m_queue);
}
-
+
//
- int numLeaves = numSmallAabbs; //Number of leaves in the BVH == Number of rigid bodies with small AABBs
+ int numLeaves = numSmallAabbs; //Number of leaves in the BVH == Number of rigid bodies with small AABBs
int numInternalNodes = numLeaves - 1;
-
- if(numLeaves < 2)
+
+ if (numLeaves < 2)
{
//Number of leaf nodes is checked in calculateOverlappingPairs() and testRaysAgainstBvhAabbs(),
//so it does not matter if numLeaves == 0 and rootNodeIndex == -1
int rootNodeIndex = numLeaves - 1;
m_rootNodeIndex.copyFromHostPointer(&rootNodeIndex, 1);
-
+
//Since the AABBs need to be rearranged(sorted) for the BVH construction algorithm,
//m_mortonCodesAndAabbIndicies.m_value is used to map a sorted AABB index to the unsorted AABB index
//instead of directly moving the AABBs. It needs to be set for the ray cast traversal kernel to work.
//( m_mortonCodesAndAabbIndicies[].m_value == unsorted index == index of m_leafNodeAabbs )
- if(numLeaves == 1)
+ if (numLeaves == 1)
{
b3SortData leaf;
- leaf.m_value = 0; //1 leaf so index is always 0; leaf.m_key does not need to be set
-
+ leaf.m_value = 0; //1 leaf so index is always 0; leaf.m_key does not need to be set
+
m_mortonCodesAndAabbIndicies.resize(1);
m_mortonCodesAndAabbIndicies.copyFromHostPointer(&leaf, 1);
}
-
+
return;
}
-
+
//
{
m_internalNodeAabbs.resize(numInternalNodes);
@@ -197,37 +194,37 @@ void b3GpuParallelLinearBvh::build(const b3OpenCLArray<b3SapAabb>& worldSpaceAab
m_commonPrefixes.resize(numInternalNodes);
m_commonPrefixLengths.resize(numInternalNodes);
m_distanceFromRoot.resize(numInternalNodes);
-
+
m_leafNodeParentNodes.resize(numLeaves);
m_mortonCodesAndAabbIndicies.resize(numLeaves);
m_mergedAabb.resize(numLeaves);
}
-
- //Find the merged AABB of all small AABBs; this is used to define the size of
+
+ //Find the merged AABB of all small AABBs; this is used to define the size of
//each cell in the virtual grid for the next kernel(2^10 cells in each dimension).
{
B3_PROFILE("Find AABB of merged nodes");
-
- m_mergedAabb.copyFromOpenCLArray(m_leafNodeAabbs); //Need to make a copy since the kernel modifies the array
-
- for(int numAabbsNeedingMerge = numLeaves; numAabbsNeedingMerge >= 2;
- numAabbsNeedingMerge = numAabbsNeedingMerge / 2 + numAabbsNeedingMerge % 2)
+
+ m_mergedAabb.copyFromOpenCLArray(m_leafNodeAabbs); //Need to make a copy since the kernel modifies the array
+
+ for (int numAabbsNeedingMerge = numLeaves; numAabbsNeedingMerge >= 2;
+ numAabbsNeedingMerge = numAabbsNeedingMerge / 2 + numAabbsNeedingMerge % 2)
{
- b3BufferInfoCL bufferInfo[] =
- {
- b3BufferInfoCL( m_mergedAabb.getBufferCL() ) //Resulting AABB is stored in m_mergedAabb[0]
- };
-
+ b3BufferInfoCL bufferInfo[] =
+ {
+ b3BufferInfoCL(m_mergedAabb.getBufferCL()) //Resulting AABB is stored in m_mergedAabb[0]
+ };
+
b3LauncherCL launcher(m_queue, m_findAllNodesMergedAabbKernel, "m_findAllNodesMergedAabbKernel");
- launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) );
+ launcher.setBuffers(bufferInfo, sizeof(bufferInfo) / sizeof(b3BufferInfoCL));
launcher.setConst(numAabbsNeedingMerge);
-
+
launcher.launch1D(numAabbsNeedingMerge);
}
-
+
clFinish(m_queue);
}
-
+
//Insert the center of the AABBs into a virtual grid,
//then convert the discrete grid coordinates into a morton code
//For each element in m_mortonCodesAndAabbIndicies, set
@@ -235,34 +232,32 @@ void b3GpuParallelLinearBvh::build(const b3OpenCLArray<b3SapAabb>& worldSpaceAab
// m_value == small AABB index
{
B3_PROFILE("Assign morton codes");
-
- b3BufferInfoCL bufferInfo[] =
- {
- b3BufferInfoCL( m_leafNodeAabbs.getBufferCL() ),
- b3BufferInfoCL( m_mergedAabb.getBufferCL() ),
- b3BufferInfoCL( m_mortonCodesAndAabbIndicies.getBufferCL() )
- };
-
+
+ b3BufferInfoCL bufferInfo[] =
+ {
+ b3BufferInfoCL(m_leafNodeAabbs.getBufferCL()),
+ b3BufferInfoCL(m_mergedAabb.getBufferCL()),
+ b3BufferInfoCL(m_mortonCodesAndAabbIndicies.getBufferCL())};
+
b3LauncherCL launcher(m_queue, m_assignMortonCodesAndAabbIndiciesKernel, "m_assignMortonCodesAndAabbIndiciesKernel");
- launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) );
+ launcher.setBuffers(bufferInfo, sizeof(bufferInfo) / sizeof(b3BufferInfoCL));
launcher.setConst(numLeaves);
-
+
launcher.launch1D(numLeaves);
clFinish(m_queue);
}
-
+
//
{
B3_PROFILE("Sort leaves by morton codes");
-
+
m_radixSorter.execute(m_mortonCodesAndAabbIndicies);
clFinish(m_queue);
}
-
+
//
constructBinaryRadixTree();
-
-
+
//Since it is a sorted binary radix tree, each internal node contains a contiguous subset of leaf node indices.
//The root node contains leaf node indices in the range [0, numLeafNodes - 1].
//The child nodes of each node split their parent's index range into 2 contiguous halves.
@@ -273,17 +268,16 @@ void b3GpuParallelLinearBvh::build(const b3OpenCLArray<b3SapAabb>& worldSpaceAab
//This property can be used for optimizing calculateOverlappingPairs(), to avoid testing each AABB pair twice
{
B3_PROFILE("m_findLeafIndexRangesKernel");
-
- b3BufferInfoCL bufferInfo[] =
- {
- b3BufferInfoCL( m_internalNodeChildNodes.getBufferCL() ),
- b3BufferInfoCL( m_internalNodeLeafIndexRanges.getBufferCL() )
- };
-
+
+ b3BufferInfoCL bufferInfo[] =
+ {
+ b3BufferInfoCL(m_internalNodeChildNodes.getBufferCL()),
+ b3BufferInfoCL(m_internalNodeLeafIndexRanges.getBufferCL())};
+
b3LauncherCL launcher(m_queue, m_findLeafIndexRangesKernel, "m_findLeafIndexRangesKernel");
- launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) );
+ launcher.setBuffers(bufferInfo, sizeof(bufferInfo) / sizeof(b3BufferInfoCL));
launcher.setConst(numInternalNodes);
-
+
launcher.launch1D(numInternalNodes);
clFinish(m_queue);
}
@@ -293,285 +287,271 @@ void b3GpuParallelLinearBvh::calculateOverlappingPairs(b3OpenCLArray<b3Int4>& ou
{
int maxPairs = out_overlappingPairs.size();
b3OpenCLArray<int>& numPairsGpu = m_temp;
-
+
int reset = 0;
numPairsGpu.copyFromHostPointer(&reset, 1);
-
+
//
- if( m_leafNodeAabbs.size() > 1 )
+ if (m_leafNodeAabbs.size() > 1)
{
B3_PROFILE("PLBVH small-small AABB test");
-
+
int numQueryAabbs = m_leafNodeAabbs.size();
-
- b3BufferInfoCL bufferInfo[] =
- {
- b3BufferInfoCL( m_leafNodeAabbs.getBufferCL() ),
-
- b3BufferInfoCL( m_rootNodeIndex.getBufferCL() ),
- b3BufferInfoCL( m_internalNodeChildNodes.getBufferCL() ),
- b3BufferInfoCL( m_internalNodeAabbs.getBufferCL() ),
- b3BufferInfoCL( m_internalNodeLeafIndexRanges.getBufferCL() ),
- b3BufferInfoCL( m_mortonCodesAndAabbIndicies.getBufferCL() ),
-
- b3BufferInfoCL( numPairsGpu.getBufferCL() ),
- b3BufferInfoCL( out_overlappingPairs.getBufferCL() )
- };
-
+
+ b3BufferInfoCL bufferInfo[] =
+ {
+ b3BufferInfoCL(m_leafNodeAabbs.getBufferCL()),
+
+ b3BufferInfoCL(m_rootNodeIndex.getBufferCL()),
+ b3BufferInfoCL(m_internalNodeChildNodes.getBufferCL()),
+ b3BufferInfoCL(m_internalNodeAabbs.getBufferCL()),
+ b3BufferInfoCL(m_internalNodeLeafIndexRanges.getBufferCL()),
+ b3BufferInfoCL(m_mortonCodesAndAabbIndicies.getBufferCL()),
+
+ b3BufferInfoCL(numPairsGpu.getBufferCL()),
+ b3BufferInfoCL(out_overlappingPairs.getBufferCL())};
+
b3LauncherCL launcher(m_queue, m_plbvhCalculateOverlappingPairsKernel, "m_plbvhCalculateOverlappingPairsKernel");
- launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) );
+ launcher.setBuffers(bufferInfo, sizeof(bufferInfo) / sizeof(b3BufferInfoCL));
launcher.setConst(maxPairs);
launcher.setConst(numQueryAabbs);
-
+
launcher.launch1D(numQueryAabbs);
clFinish(m_queue);
}
-
+
int numLargeAabbRigids = m_largeAabbs.size();
- if( numLargeAabbRigids > 0 && m_leafNodeAabbs.size() > 0 )
+ if (numLargeAabbRigids > 0 && m_leafNodeAabbs.size() > 0)
{
B3_PROFILE("PLBVH large-small AABB test");
-
+
int numQueryAabbs = m_leafNodeAabbs.size();
-
- b3BufferInfoCL bufferInfo[] =
- {
- b3BufferInfoCL( m_leafNodeAabbs.getBufferCL() ),
- b3BufferInfoCL( m_largeAabbs.getBufferCL() ),
-
- b3BufferInfoCL( numPairsGpu.getBufferCL() ),
- b3BufferInfoCL( out_overlappingPairs.getBufferCL() )
- };
-
+
+ b3BufferInfoCL bufferInfo[] =
+ {
+ b3BufferInfoCL(m_leafNodeAabbs.getBufferCL()),
+ b3BufferInfoCL(m_largeAabbs.getBufferCL()),
+
+ b3BufferInfoCL(numPairsGpu.getBufferCL()),
+ b3BufferInfoCL(out_overlappingPairs.getBufferCL())};
+
b3LauncherCL launcher(m_queue, m_plbvhLargeAabbAabbTestKernel, "m_plbvhLargeAabbAabbTestKernel");
- launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) );
+ launcher.setBuffers(bufferInfo, sizeof(bufferInfo) / sizeof(b3BufferInfoCL));
launcher.setConst(maxPairs);
launcher.setConst(numLargeAabbRigids);
launcher.setConst(numQueryAabbs);
-
+
launcher.launch1D(numQueryAabbs);
clFinish(m_queue);
}
-
-
+
//
int numPairs = -1;
numPairsGpu.copyToHostPointer(&numPairs, 1);
- if(numPairs > maxPairs)
+ if (numPairs > maxPairs)
{
b3Error("Error running out of pairs: numPairs = %d, maxPairs = %d.\n", numPairs, maxPairs);
numPairs = maxPairs;
numPairsGpu.copyFromHostPointer(&maxPairs, 1);
}
-
+
out_overlappingPairs.resize(numPairs);
}
-
-void b3GpuParallelLinearBvh::testRaysAgainstBvhAabbs(const b3OpenCLArray<b3RayInfo>& rays,
- b3OpenCLArray<int>& out_numRayRigidPairs, b3OpenCLArray<b3Int2>& out_rayRigidPairs)
+void b3GpuParallelLinearBvh::testRaysAgainstBvhAabbs(const b3OpenCLArray<b3RayInfo>& rays,
+ b3OpenCLArray<int>& out_numRayRigidPairs, b3OpenCLArray<b3Int2>& out_rayRigidPairs)
{
B3_PROFILE("PLBVH testRaysAgainstBvhAabbs()");
-
+
int numRays = rays.size();
int maxRayRigidPairs = out_rayRigidPairs.size();
-
+
int reset = 0;
out_numRayRigidPairs.copyFromHostPointer(&reset, 1);
-
+
//
- if( m_leafNodeAabbs.size() > 0 )
+ if (m_leafNodeAabbs.size() > 0)
{
B3_PROFILE("PLBVH ray test small AABB");
-
- b3BufferInfoCL bufferInfo[] =
- {
- b3BufferInfoCL( m_leafNodeAabbs.getBufferCL() ),
-
- b3BufferInfoCL( m_rootNodeIndex.getBufferCL() ),
- b3BufferInfoCL( m_internalNodeChildNodes.getBufferCL() ),
- b3BufferInfoCL( m_internalNodeAabbs.getBufferCL() ),
- b3BufferInfoCL( m_internalNodeLeafIndexRanges.getBufferCL() ),
- b3BufferInfoCL( m_mortonCodesAndAabbIndicies.getBufferCL() ),
-
- b3BufferInfoCL( rays.getBufferCL() ),
-
- b3BufferInfoCL( out_numRayRigidPairs.getBufferCL() ),
- b3BufferInfoCL( out_rayRigidPairs.getBufferCL() )
- };
-
+
+ b3BufferInfoCL bufferInfo[] =
+ {
+ b3BufferInfoCL(m_leafNodeAabbs.getBufferCL()),
+
+ b3BufferInfoCL(m_rootNodeIndex.getBufferCL()),
+ b3BufferInfoCL(m_internalNodeChildNodes.getBufferCL()),
+ b3BufferInfoCL(m_internalNodeAabbs.getBufferCL()),
+ b3BufferInfoCL(m_internalNodeLeafIndexRanges.getBufferCL()),
+ b3BufferInfoCL(m_mortonCodesAndAabbIndicies.getBufferCL()),
+
+ b3BufferInfoCL(rays.getBufferCL()),
+
+ b3BufferInfoCL(out_numRayRigidPairs.getBufferCL()),
+ b3BufferInfoCL(out_rayRigidPairs.getBufferCL())};
+
b3LauncherCL launcher(m_queue, m_plbvhRayTraverseKernel, "m_plbvhRayTraverseKernel");
- launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) );
+ launcher.setBuffers(bufferInfo, sizeof(bufferInfo) / sizeof(b3BufferInfoCL));
launcher.setConst(maxRayRigidPairs);
launcher.setConst(numRays);
-
+
launcher.launch1D(numRays);
clFinish(m_queue);
}
-
+
int numLargeAabbRigids = m_largeAabbs.size();
- if(numLargeAabbRigids > 0)
+ if (numLargeAabbRigids > 0)
{
B3_PROFILE("PLBVH ray test large AABB");
-
- b3BufferInfoCL bufferInfo[] =
- {
- b3BufferInfoCL( m_largeAabbs.getBufferCL() ),
- b3BufferInfoCL( rays.getBufferCL() ),
-
- b3BufferInfoCL( out_numRayRigidPairs.getBufferCL() ),
- b3BufferInfoCL( out_rayRigidPairs.getBufferCL() )
- };
-
+
+ b3BufferInfoCL bufferInfo[] =
+ {
+ b3BufferInfoCL(m_largeAabbs.getBufferCL()),
+ b3BufferInfoCL(rays.getBufferCL()),
+
+ b3BufferInfoCL(out_numRayRigidPairs.getBufferCL()),
+ b3BufferInfoCL(out_rayRigidPairs.getBufferCL())};
+
b3LauncherCL launcher(m_queue, m_plbvhLargeAabbRayTestKernel, "m_plbvhLargeAabbRayTestKernel");
- launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) );
+ launcher.setBuffers(bufferInfo, sizeof(bufferInfo) / sizeof(b3BufferInfoCL));
launcher.setConst(numLargeAabbRigids);
launcher.setConst(maxRayRigidPairs);
launcher.setConst(numRays);
-
+
launcher.launch1D(numRays);
clFinish(m_queue);
}
-
+
//
int numRayRigidPairs = -1;
out_numRayRigidPairs.copyToHostPointer(&numRayRigidPairs, 1);
-
- if(numRayRigidPairs > maxRayRigidPairs)
+
+ if (numRayRigidPairs > maxRayRigidPairs)
b3Error("Error running out of rayRigid pairs: numRayRigidPairs = %d, maxRayRigidPairs = %d.\n", numRayRigidPairs, maxRayRigidPairs);
-
}
void b3GpuParallelLinearBvh::constructBinaryRadixTree()
{
B3_PROFILE("b3GpuParallelLinearBvh::constructBinaryRadixTree()");
-
+
int numLeaves = m_leafNodeAabbs.size();
int numInternalNodes = numLeaves - 1;
-
+
//Each internal node is placed in between 2 leaf nodes.
//By using this arrangement and computing the common prefix between
//these 2 adjacent leaf nodes, it is possible to quickly construct a binary radix tree.
{
B3_PROFILE("m_computeAdjacentPairCommonPrefixKernel");
-
- b3BufferInfoCL bufferInfo[] =
- {
- b3BufferInfoCL( m_mortonCodesAndAabbIndicies.getBufferCL() ),
- b3BufferInfoCL( m_commonPrefixes.getBufferCL() ),
- b3BufferInfoCL( m_commonPrefixLengths.getBufferCL() )
- };
-
+
+ b3BufferInfoCL bufferInfo[] =
+ {
+ b3BufferInfoCL(m_mortonCodesAndAabbIndicies.getBufferCL()),
+ b3BufferInfoCL(m_commonPrefixes.getBufferCL()),
+ b3BufferInfoCL(m_commonPrefixLengths.getBufferCL())};
+
b3LauncherCL launcher(m_queue, m_computeAdjacentPairCommonPrefixKernel, "m_computeAdjacentPairCommonPrefixKernel");
- launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) );
+ launcher.setBuffers(bufferInfo, sizeof(bufferInfo) / sizeof(b3BufferInfoCL));
launcher.setConst(numInternalNodes);
-
+
launcher.launch1D(numInternalNodes);
clFinish(m_queue);
}
-
- //For each leaf node, select its parent node by
+
+ //For each leaf node, select its parent node by
//comparing the 2 nearest internal nodes and assign child node indices
{
B3_PROFILE("m_buildBinaryRadixTreeLeafNodesKernel");
-
- b3BufferInfoCL bufferInfo[] =
- {
- b3BufferInfoCL( m_commonPrefixLengths.getBufferCL() ),
- b3BufferInfoCL( m_leafNodeParentNodes.getBufferCL() ),
- b3BufferInfoCL( m_internalNodeChildNodes.getBufferCL() )
- };
-
+
+ b3BufferInfoCL bufferInfo[] =
+ {
+ b3BufferInfoCL(m_commonPrefixLengths.getBufferCL()),
+ b3BufferInfoCL(m_leafNodeParentNodes.getBufferCL()),
+ b3BufferInfoCL(m_internalNodeChildNodes.getBufferCL())};
+
b3LauncherCL launcher(m_queue, m_buildBinaryRadixTreeLeafNodesKernel, "m_buildBinaryRadixTreeLeafNodesKernel");
- launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) );
+ launcher.setBuffers(bufferInfo, sizeof(bufferInfo) / sizeof(b3BufferInfoCL));
launcher.setConst(numLeaves);
-
+
launcher.launch1D(numLeaves);
clFinish(m_queue);
}
-
+
//For each internal node, perform 2 binary searches among the other internal nodes
//to its left and right to find its potential parent nodes and assign child node indices
{
B3_PROFILE("m_buildBinaryRadixTreeInternalNodesKernel");
-
- b3BufferInfoCL bufferInfo[] =
- {
- b3BufferInfoCL( m_commonPrefixes.getBufferCL() ),
- b3BufferInfoCL( m_commonPrefixLengths.getBufferCL() ),
- b3BufferInfoCL( m_internalNodeChildNodes.getBufferCL() ),
- b3BufferInfoCL( m_internalNodeParentNodes.getBufferCL() ),
- b3BufferInfoCL( m_rootNodeIndex.getBufferCL() )
- };
-
+
+ b3BufferInfoCL bufferInfo[] =
+ {
+ b3BufferInfoCL(m_commonPrefixes.getBufferCL()),
+ b3BufferInfoCL(m_commonPrefixLengths.getBufferCL()),
+ b3BufferInfoCL(m_internalNodeChildNodes.getBufferCL()),
+ b3BufferInfoCL(m_internalNodeParentNodes.getBufferCL()),
+ b3BufferInfoCL(m_rootNodeIndex.getBufferCL())};
+
b3LauncherCL launcher(m_queue, m_buildBinaryRadixTreeInternalNodesKernel, "m_buildBinaryRadixTreeInternalNodesKernel");
- launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) );
+ launcher.setBuffers(bufferInfo, sizeof(bufferInfo) / sizeof(b3BufferInfoCL));
launcher.setConst(numInternalNodes);
-
+
launcher.launch1D(numInternalNodes);
clFinish(m_queue);
}
-
+
//Find the number of nodes seperating each internal node and the root node
//so that the AABBs can be set using the next kernel.
//Also determine the maximum number of nodes separating an internal node and the root node.
{
B3_PROFILE("m_findDistanceFromRootKernel");
-
- b3BufferInfoCL bufferInfo[] =
- {
- b3BufferInfoCL( m_rootNodeIndex.getBufferCL() ),
- b3BufferInfoCL( m_internalNodeParentNodes.getBufferCL() ),
- b3BufferInfoCL( m_maxDistanceFromRoot.getBufferCL() ),
- b3BufferInfoCL( m_distanceFromRoot.getBufferCL() )
- };
-
+
+ b3BufferInfoCL bufferInfo[] =
+ {
+ b3BufferInfoCL(m_rootNodeIndex.getBufferCL()),
+ b3BufferInfoCL(m_internalNodeParentNodes.getBufferCL()),
+ b3BufferInfoCL(m_maxDistanceFromRoot.getBufferCL()),
+ b3BufferInfoCL(m_distanceFromRoot.getBufferCL())};
+
b3LauncherCL launcher(m_queue, m_findDistanceFromRootKernel, "m_findDistanceFromRootKernel");
- launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) );
+ launcher.setBuffers(bufferInfo, sizeof(bufferInfo) / sizeof(b3BufferInfoCL));
launcher.setConst(numInternalNodes);
-
+
launcher.launch1D(numInternalNodes);
clFinish(m_queue);
}
-
+
//Starting from the internal nodes nearest to the leaf nodes, recursively move up
//the tree towards the root to set the AABBs of each internal node; each internal node
//checks its children and merges their AABBs
{
B3_PROFILE("m_buildBinaryRadixTreeAabbsRecursiveKernel");
-
+
int maxDistanceFromRoot = -1;
{
B3_PROFILE("copy maxDistanceFromRoot to CPU");
m_maxDistanceFromRoot.copyToHostPointer(&maxDistanceFromRoot, 1);
clFinish(m_queue);
}
-
- for(int distanceFromRoot = maxDistanceFromRoot; distanceFromRoot >= 0; --distanceFromRoot)
+
+ for (int distanceFromRoot = maxDistanceFromRoot; distanceFromRoot >= 0; --distanceFromRoot)
{
- b3BufferInfoCL bufferInfo[] =
- {
- b3BufferInfoCL( m_distanceFromRoot.getBufferCL() ),
- b3BufferInfoCL( m_mortonCodesAndAabbIndicies.getBufferCL() ),
- b3BufferInfoCL( m_internalNodeChildNodes.getBufferCL() ),
- b3BufferInfoCL( m_leafNodeAabbs.getBufferCL() ),
- b3BufferInfoCL( m_internalNodeAabbs.getBufferCL() )
- };
-
+ b3BufferInfoCL bufferInfo[] =
+ {
+ b3BufferInfoCL(m_distanceFromRoot.getBufferCL()),
+ b3BufferInfoCL(m_mortonCodesAndAabbIndicies.getBufferCL()),
+ b3BufferInfoCL(m_internalNodeChildNodes.getBufferCL()),
+ b3BufferInfoCL(m_leafNodeAabbs.getBufferCL()),
+ b3BufferInfoCL(m_internalNodeAabbs.getBufferCL())};
+
b3LauncherCL launcher(m_queue, m_buildBinaryRadixTreeAabbsRecursiveKernel, "m_buildBinaryRadixTreeAabbsRecursiveKernel");
- launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) );
+ launcher.setBuffers(bufferInfo, sizeof(bufferInfo) / sizeof(b3BufferInfoCL));
launcher.setConst(maxDistanceFromRoot);
launcher.setConst(distanceFromRoot);
launcher.setConst(numInternalNodes);
-
+
//It may seem inefficent to launch a thread for each internal node when a
//much smaller number of nodes is actually processed, but this is actually
- //faster than determining the exact nodes that are ready to merge their child AABBs.
+ //faster than determining the exact nodes that are ready to merge their child AABBs.
launcher.launch1D(numInternalNodes);
}
-
+
clFinish(m_queue);
}
}
-
- \ No newline at end of file
diff --git a/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.h b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.h
index effe617b7b..b390775129 100644
--- a/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.h
+++ b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvh.h
@@ -37,10 +37,10 @@ subject to the following restrictions:
///"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] 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
+/// - [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.
@@ -49,75 +49,75 @@ subject to the following restrictions:
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<int> m_rootNodeIndex; //Most significant bit(0x80000000) is set to indicate internal node
- b3OpenCLArray<int> m_maxDistanceFromRoot; //Max number of internal nodes between an internal node and the root node
- b3OpenCLArray<int> m_temp; //Used to hold the number of pairs in calculateOverlappingPairs()
-
+ b3OpenCLArray<int> m_rootNodeIndex; //Most significant bit(0x80000000) is set to indicate internal node
+ b3OpenCLArray<int> m_maxDistanceFromRoot; //Max number of internal nodes between an internal node and the root node
+ b3OpenCLArray<int> 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<b3SapAabb> m_internalNodeAabbs;
- b3OpenCLArray<b3Int2> m_internalNodeLeafIndexRanges; //x == min leaf index, y == max leaf index
- b3OpenCLArray<b3Int2> m_internalNodeChildNodes; //x == left child, y == right child; msb(0x80000000) is set to indicate internal node
- b3OpenCLArray<int> m_internalNodeParentNodes; //For parent node index, msb(0x80000000) is not set since it is always internal
-
+ b3OpenCLArray<b3Int2> m_internalNodeLeafIndexRanges; //x == min leaf index, y == max leaf index
+ b3OpenCLArray<b3Int2> m_internalNodeChildNodes; //x == left child, y == right child; msb(0x80000000) is set to indicate internal node
+ b3OpenCLArray<int> 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<b3Int64> m_commonPrefixes;
b3OpenCLArray<int> m_commonPrefixLengths;
- b3OpenCLArray<int> m_distanceFromRoot; //Number of internal nodes between this node and the root
-
+ b3OpenCLArray<int> m_distanceFromRoot; //Number of internal nodes between this node and the root
+
//1 element per leaf node (leaf nodes only include small AABBs)
- b3OpenCLArray<int> m_leafNodeParentNodes; //For parent node index, msb(0x80000000) is not set since it is always internal
- b3OpenCLArray<b3SortData> m_mortonCodesAndAabbIndicies; //m_key == morton code, m_value == aabb index in m_leafNodeAabbs
- b3OpenCLArray<b3SapAabb> m_mergedAabb; //m_mergedAabb[0] contains the merged AABB of all leaf nodes
- b3OpenCLArray<b3SapAabb> m_leafNodeAabbs; //Contains only small AABBs
-
+ b3OpenCLArray<int> m_leafNodeParentNodes; //For parent node index, msb(0x80000000) is not set since it is always internal
+ b3OpenCLArray<b3SortData> m_mortonCodesAndAabbIndicies; //m_key == morton code, m_value == aabb index in m_leafNodeAabbs
+ b3OpenCLArray<b3SapAabb> m_mergedAabb; //m_mergedAabb[0] contains the merged AABB of all leaf nodes
+ b3OpenCLArray<b3SapAabb> m_leafNodeAabbs; //Contains only small AABBs
+
//1 element per large AABB, which is not stored in the BVH
b3OpenCLArray<b3SapAabb> 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<b3SapAabb>& worldSpaceAabbs, const b3OpenCLArray<int>& smallAabbIndices,
- const b3OpenCLArray<int>& largeAabbIndices);
-
+ void build(const b3OpenCLArray<b3SapAabb>& worldSpaceAabbs, const b3OpenCLArray<int>& smallAabbIndices,
+ const b3OpenCLArray<int>& 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<b3Int4>& 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<b3RayInfo>& rays,
- b3OpenCLArray<int>& out_numRayRigidPairs, b3OpenCLArray<b3Int2>& out_rayRigidPairs);
-
+ void testRaysAgainstBvhAabbs(const b3OpenCLArray<b3RayInfo>& rays,
+ b3OpenCLArray<int>& out_numRayRigidPairs, b3OpenCLArray<b3Int2>& out_rayRigidPairs);
+
private:
void constructBinaryRadixTree();
};
diff --git a/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.cpp b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.cpp
index d2618024ac..62ea7a32df 100644
--- a/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.cpp
@@ -13,45 +13,44 @@ subject to the following restrictions:
#include "b3GpuParallelLinearBvhBroadphase.h"
-b3GpuParallelLinearBvhBroadphase::b3GpuParallelLinearBvhBroadphase(cl_context context, cl_device_id device, cl_command_queue queue) :
- m_plbvh(context, device, queue),
-
- m_overlappingPairsGpu(context, queue),
-
- m_aabbsGpu(context, queue),
- m_smallAabbsMappingGpu(context, queue),
- m_largeAabbsMappingGpu(context, queue)
+b3GpuParallelLinearBvhBroadphase::b3GpuParallelLinearBvhBroadphase(cl_context context, cl_device_id device, cl_command_queue queue) : m_plbvh(context, device, queue),
+
+ m_overlappingPairsGpu(context, queue),
+
+ m_aabbsGpu(context, queue),
+ m_smallAabbsMappingGpu(context, queue),
+ m_largeAabbsMappingGpu(context, queue)
{
}
-void b3GpuParallelLinearBvhBroadphase::createProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int userPtr, int collisionFilterGroup, int collisionFilterMask)
+void b3GpuParallelLinearBvhBroadphase::createProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int userPtr, int collisionFilterGroup, int collisionFilterMask)
{
int newAabbIndex = m_aabbsCpu.size();
b3SapAabb aabb;
aabb.m_minVec = aabbMin;
aabb.m_maxVec = aabbMax;
-
+
aabb.m_minIndices[3] = userPtr;
aabb.m_signedMaxIndices[3] = newAabbIndex;
-
+
m_smallAabbsMappingCpu.push_back(newAabbIndex);
-
+
m_aabbsCpu.push_back(aabb);
}
-void b3GpuParallelLinearBvhBroadphase::createLargeProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int userPtr, int collisionFilterGroup, int collisionFilterMask)
+void b3GpuParallelLinearBvhBroadphase::createLargeProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int userPtr, int collisionFilterGroup, int collisionFilterMask)
{
int newAabbIndex = m_aabbsCpu.size();
b3SapAabb aabb;
aabb.m_minVec = aabbMin;
aabb.m_maxVec = aabbMax;
-
+
aabb.m_minIndices[3] = userPtr;
aabb.m_signedMaxIndices[3] = newAabbIndex;
-
+
m_largeAabbsMappingCpu.push_back(newAabbIndex);
-
+
m_aabbsCpu.push_back(aabb);
}
@@ -59,22 +58,19 @@ void b3GpuParallelLinearBvhBroadphase::calculateOverlappingPairs(int maxPairs)
{
//Reconstruct BVH
m_plbvh.build(m_aabbsGpu, m_smallAabbsMappingGpu, m_largeAabbsMappingGpu);
-
+
//
m_overlappingPairsGpu.resize(maxPairs);
m_plbvh.calculateOverlappingPairs(m_overlappingPairsGpu);
}
void b3GpuParallelLinearBvhBroadphase::calculateOverlappingPairsHost(int maxPairs)
{
- b3Assert(0); //CPU version not implemented
+ b3Assert(0); //CPU version not implemented
}
-void b3GpuParallelLinearBvhBroadphase::writeAabbsToGpu()
-{
- m_aabbsGpu.copyFromHost(m_aabbsCpu);
+void b3GpuParallelLinearBvhBroadphase::writeAabbsToGpu()
+{
+ m_aabbsGpu.copyFromHost(m_aabbsCpu);
m_smallAabbsMappingGpu.copyFromHost(m_smallAabbsMappingCpu);
m_largeAabbsMappingGpu.copyFromHost(m_largeAabbsMappingCpu);
}
-
-
-
diff --git a/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.h b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.h
index e518500637..dda0eea7be 100644
--- a/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.h
+++ b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuParallelLinearBvhBroadphase.h
@@ -21,42 +21,42 @@ subject to the following restrictions:
class b3GpuParallelLinearBvhBroadphase : public b3GpuBroadphaseInterface
{
b3GpuParallelLinearBvh m_plbvh;
-
+
b3OpenCLArray<b3Int4> m_overlappingPairsGpu;
-
+
b3OpenCLArray<b3SapAabb> m_aabbsGpu;
b3OpenCLArray<int> m_smallAabbsMappingGpu;
b3OpenCLArray<int> m_largeAabbsMappingGpu;
-
+
b3AlignedObjectArray<b3SapAabb> m_aabbsCpu;
b3AlignedObjectArray<int> m_smallAabbsMappingCpu;
b3AlignedObjectArray<int> 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 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 int getNumOverlap() { return m_overlappingPairsGpu.size(); }
virtual cl_mem getOverlappingPairBuffer() { return m_overlappingPairsGpu.getBufferCL(); }
virtual cl_mem getAabbBufferWS() { return m_aabbsGpu.getBufferCL(); }
virtual b3OpenCLArray<b3SapAabb>& getAllAabbsGPU() { return m_aabbsGpu; }
-
+
virtual b3OpenCLArray<b3Int4>& getOverlappingPairsGPU() { return m_overlappingPairsGpu; }
virtual b3OpenCLArray<int>& getSmallAabbIndicesGPU() { return m_smallAabbsMappingGpu; }
virtual b3OpenCLArray<int>& getLargeAabbIndicesGPU() { return m_largeAabbsMappingGpu; }
-
+
virtual b3AlignedObjectArray<b3SapAabb>& getAllAabbsCPU() { return m_aabbsCpu; }
-
+
static b3GpuBroadphaseInterface* CreateFunc(cl_context context, cl_device_id device, cl_command_queue queue)
{
return new b3GpuParallelLinearBvhBroadphase(context, device, queue);
diff --git a/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.cpp b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.cpp
index c45fbbdcaa..4126d03ed0 100644
--- a/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.cpp
@@ -6,7 +6,6 @@ bool searchIncremental3dSapOnGpu = true;
#include "Bullet3OpenCL/ParallelPrimitives/b3LauncherCL.h"
#include "Bullet3OpenCL/ParallelPrimitives/b3PrefixScanFloat4CL.h"
-
#include "Bullet3OpenCL/Initialize/b3OpenCLUtils.h"
#include "kernels/sapKernels.h"
@@ -56,110 +55,105 @@ bool searchIncremental3dSapOnGpu = true;
class b3PrefixScanFloat4CL* m_prefixScanFloat4;
*/
-b3GpuSapBroadphase::b3GpuSapBroadphase(cl_context ctx,cl_device_id device, cl_command_queue q , b3GpuSapKernelType kernelType)
-:m_context(ctx),
-m_device(device),
-m_queue(q),
-
-m_objectMinMaxIndexGPUaxis0(ctx,q),
-m_objectMinMaxIndexGPUaxis1(ctx,q),
-m_objectMinMaxIndexGPUaxis2(ctx,q),
-m_objectMinMaxIndexGPUaxis0prev(ctx,q),
-m_objectMinMaxIndexGPUaxis1prev(ctx,q),
-m_objectMinMaxIndexGPUaxis2prev(ctx,q),
-m_sortedAxisGPU0(ctx,q),
-m_sortedAxisGPU1(ctx,q),
-m_sortedAxisGPU2(ctx,q),
-m_sortedAxisGPU0prev(ctx,q),
-m_sortedAxisGPU1prev(ctx,q),
-m_sortedAxisGPU2prev(ctx,q),
-m_addedHostPairsGPU(ctx,q),
-m_removedHostPairsGPU(ctx,q),
-m_addedCountGPU(ctx,q),
-m_removedCountGPU(ctx,q),
-m_currentBuffer(-1),
-m_pairCount(ctx,q),
-m_allAabbsGPU(ctx,q),
-m_sum(ctx,q),
-m_sum2(ctx,q),
-m_dst(ctx,q),
-m_smallAabbsMappingGPU(ctx,q),
-m_largeAabbsMappingGPU(ctx,q),
-m_overlappingPairs(ctx,q),
-m_gpuSmallSortData(ctx,q),
-m_gpuSmallSortedAabbs(ctx,q)
+b3GpuSapBroadphase::b3GpuSapBroadphase(cl_context ctx, cl_device_id device, cl_command_queue q, b3GpuSapKernelType kernelType)
+ : m_context(ctx),
+ m_device(device),
+ m_queue(q),
+
+ m_objectMinMaxIndexGPUaxis0(ctx, q),
+ m_objectMinMaxIndexGPUaxis1(ctx, q),
+ m_objectMinMaxIndexGPUaxis2(ctx, q),
+ m_objectMinMaxIndexGPUaxis0prev(ctx, q),
+ m_objectMinMaxIndexGPUaxis1prev(ctx, q),
+ m_objectMinMaxIndexGPUaxis2prev(ctx, q),
+ m_sortedAxisGPU0(ctx, q),
+ m_sortedAxisGPU1(ctx, q),
+ m_sortedAxisGPU2(ctx, q),
+ m_sortedAxisGPU0prev(ctx, q),
+ m_sortedAxisGPU1prev(ctx, q),
+ m_sortedAxisGPU2prev(ctx, q),
+ m_addedHostPairsGPU(ctx, q),
+ m_removedHostPairsGPU(ctx, q),
+ m_addedCountGPU(ctx, q),
+ m_removedCountGPU(ctx, q),
+ m_currentBuffer(-1),
+ m_pairCount(ctx, q),
+ m_allAabbsGPU(ctx, q),
+ m_sum(ctx, q),
+ m_sum2(ctx, q),
+ m_dst(ctx, q),
+ m_smallAabbsMappingGPU(ctx, q),
+ m_largeAabbsMappingGPU(ctx, q),
+ m_overlappingPairs(ctx, q),
+ m_gpuSmallSortData(ctx, q),
+ m_gpuSmallSortedAabbs(ctx, q)
{
const char* sapSrc = sapCL;
-
-
- cl_int errNum=0;
+
+ cl_int errNum = 0;
b3Assert(m_context);
b3Assert(m_device);
- cl_program sapProg = b3OpenCLUtils::compileCLProgramFromString(m_context,m_device,sapSrc,&errNum,"",B3_BROADPHASE_SAP_PATH);
- b3Assert(errNum==CL_SUCCESS);
-
+ cl_program sapProg = b3OpenCLUtils::compileCLProgramFromString(m_context, m_device, sapSrc, &errNum, "", B3_BROADPHASE_SAP_PATH);
+ b3Assert(errNum == CL_SUCCESS);
- b3Assert(errNum==CL_SUCCESS);
+ b3Assert(errNum == CL_SUCCESS);
#ifndef __APPLE__
- m_prefixScanFloat4 = new b3PrefixScanFloat4CL(m_context,m_device,m_queue);
+ m_prefixScanFloat4 = new b3PrefixScanFloat4CL(m_context, m_device, m_queue);
#else
m_prefixScanFloat4 = 0;
#endif
m_sapKernel = 0;
-
+
switch (kernelType)
{
case B3_GPU_SAP_KERNEL_BRUTE_FORCE_CPU:
{
- m_sapKernel=0;
+ m_sapKernel = 0;
break;
}
- case B3_GPU_SAP_KERNEL_BRUTE_FORCE_GPU:
+ case B3_GPU_SAP_KERNEL_BRUTE_FORCE_GPU:
{
- m_sapKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,sapSrc, "computePairsKernelBruteForce",&errNum,sapProg );
+ m_sapKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, sapSrc, "computePairsKernelBruteForce", &errNum, sapProg);
break;
}
case B3_GPU_SAP_KERNEL_ORIGINAL:
{
- m_sapKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,sapSrc, "computePairsKernelOriginal",&errNum,sapProg );
+ m_sapKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, sapSrc, "computePairsKernelOriginal", &errNum, sapProg);
break;
}
case B3_GPU_SAP_KERNEL_BARRIER:
{
- m_sapKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,sapSrc, "computePairsKernelBarrier",&errNum,sapProg );
+ m_sapKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, sapSrc, "computePairsKernelBarrier", &errNum, sapProg);
break;
}
case B3_GPU_SAP_KERNEL_LOCAL_SHARED_MEMORY:
{
- m_sapKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,sapSrc, "computePairsKernelLocalSharedMemory",&errNum,sapProg );
+ m_sapKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, sapSrc, "computePairsKernelLocalSharedMemory", &errNum, sapProg);
break;
}
default:
{
- m_sapKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,sapSrc, "computePairsKernelLocalSharedMemory",&errNum,sapProg );
+ m_sapKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, sapSrc, "computePairsKernelLocalSharedMemory", &errNum, sapProg);
b3Error("Unknown 3D GPU SAP provided, fallback to computePairsKernelLocalSharedMemory");
}
};
-
-
-
- m_sap2Kernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,sapSrc, "computePairsKernelTwoArrays",&errNum,sapProg );
- b3Assert(errNum==CL_SUCCESS);
- m_prepareSumVarianceKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,sapSrc, "prepareSumVarianceKernel",&errNum,sapProg );
- b3Assert(errNum==CL_SUCCESS);
+ m_sap2Kernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, sapSrc, "computePairsKernelTwoArrays", &errNum, sapProg);
+ b3Assert(errNum == CL_SUCCESS);
-
- m_flipFloatKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,sapSrc, "flipFloatKernel",&errNum,sapProg );
+ m_prepareSumVarianceKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, sapSrc, "prepareSumVarianceKernel", &errNum, sapProg);
+ b3Assert(errNum == CL_SUCCESS);
- m_copyAabbsKernel= b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,sapSrc, "copyAabbsKernel",&errNum,sapProg );
+ m_flipFloatKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, sapSrc, "flipFloatKernel", &errNum, sapProg);
- m_scatterKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,sapSrc, "scatterKernel",&errNum,sapProg );
+ m_copyAabbsKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, sapSrc, "copyAabbsKernel", &errNum, sapProg);
- m_sorter = new b3RadixSort32CL(m_context,m_device,m_queue);
+ m_scatterKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, sapSrc, "scatterKernel", &errNum, sapProg);
+
+ m_sorter = new b3RadixSort32CL(m_context, m_device, m_queue);
}
b3GpuSapBroadphase::~b3GpuSapBroadphase()
@@ -173,13 +167,11 @@ b3GpuSapBroadphase::~b3GpuSapBroadphase()
clReleaseKernel(m_sapKernel);
clReleaseKernel(m_sap2Kernel);
clReleaseKernel(m_prepareSumVarianceKernel);
-
-
}
/// conservative test for overlap between two aabbs
-static bool TestAabbAgainstAabb2(const b3Vector3 &aabbMin1, const b3Vector3 &aabbMax1,
- const b3Vector3 &aabbMin2, const b3Vector3 &aabbMax2)
+static bool TestAabbAgainstAabb2(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;
@@ -188,8 +180,6 @@ static bool TestAabbAgainstAabb2(const b3Vector3 &aabbMin1, const b3Vector3 &aab
return overlap;
}
-
-
//http://stereopsis.com/radix.html
static unsigned int FloatFlip(float fl)
{
@@ -198,79 +188,77 @@ static unsigned int FloatFlip(float fl)
return f ^ mask;
};
-void b3GpuSapBroadphase::init3dSap()
+void b3GpuSapBroadphase::init3dSap()
{
- if (m_currentBuffer<0)
+ if (m_currentBuffer < 0)
{
m_allAabbsGPU.copyToHost(m_allAabbsCPU);
m_currentBuffer = 0;
- for (int axis=0;axis<3;axis++)
+ for (int axis = 0; axis < 3; axis++)
{
- for (int buf=0;buf<2;buf++)
+ for (int buf = 0; buf < 2; buf++)
{
int totalNumAabbs = m_allAabbsCPU.size();
- int numEndPoints = 2*totalNumAabbs;
+ int numEndPoints = 2 * totalNumAabbs;
m_sortedAxisCPU[axis][buf].resize(numEndPoints);
- if (buf==m_currentBuffer)
+ if (buf == m_currentBuffer)
{
- for (int i=0;i<totalNumAabbs;i++)
+ for (int i = 0; i < totalNumAabbs; i++)
{
- m_sortedAxisCPU[axis][buf][i*2].m_key = FloatFlip(m_allAabbsCPU[i].m_min[axis])-1;
- m_sortedAxisCPU[axis][buf][i*2].m_value = i*2;
- m_sortedAxisCPU[axis][buf][i*2+1].m_key = FloatFlip(m_allAabbsCPU[i].m_max[axis])+1;
- m_sortedAxisCPU[axis][buf][i*2+1].m_value = i*2+1;
+ m_sortedAxisCPU[axis][buf][i * 2].m_key = FloatFlip(m_allAabbsCPU[i].m_min[axis]) - 1;
+ m_sortedAxisCPU[axis][buf][i * 2].m_value = i * 2;
+ m_sortedAxisCPU[axis][buf][i * 2 + 1].m_key = FloatFlip(m_allAabbsCPU[i].m_max[axis]) + 1;
+ m_sortedAxisCPU[axis][buf][i * 2 + 1].m_value = i * 2 + 1;
}
}
}
}
- for (int axis=0;axis<3;axis++)
+ for (int axis = 0; axis < 3; axis++)
{
m_sorter->executeHost(m_sortedAxisCPU[axis][m_currentBuffer]);
}
- for (int axis=0;axis<3;axis++)
+ for (int axis = 0; axis < 3; axis++)
{
//int totalNumAabbs = m_allAabbsCPU.size();
int numEndPoints = m_sortedAxisCPU[axis][m_currentBuffer].size();
m_objectMinMaxIndexCPU[axis][m_currentBuffer].resize(numEndPoints);
- for (int i=0;i<numEndPoints;i++)
+ for (int i = 0; i < numEndPoints; i++)
{
int destIndex = m_sortedAxisCPU[axis][m_currentBuffer][i].m_value;
- int newDest = destIndex/2;
- if (destIndex&1)
+ int newDest = destIndex / 2;
+ if (destIndex & 1)
{
- m_objectMinMaxIndexCPU[axis][m_currentBuffer][newDest].y=i;
- } else
+ m_objectMinMaxIndexCPU[axis][m_currentBuffer][newDest].y = i;
+ }
+ else
{
- m_objectMinMaxIndexCPU[axis][m_currentBuffer][newDest].x=i;
+ m_objectMinMaxIndexCPU[axis][m_currentBuffer][newDest].x = i;
}
}
}
-
}
}
-
static bool b3PairCmp(const b3Int4& p, const b3Int4& q)
{
- return ((p.x<q.x) || ((p.x==q.x) && (p.y<q.y)));
+ return ((p.x < q.x) || ((p.x == q.x) && (p.y < q.y)));
}
-
-static bool operator==(const b3Int4& a,const b3Int4& b)
+static bool operator==(const b3Int4& a, const b3Int4& b)
{
return a.x == b.x && a.y == b.y;
};
-static bool operator<(const b3Int4& a,const b3Int4& b)
+static bool operator<(const b3Int4& a, const b3Int4& b)
{
return a.x < b.x || (a.x == b.x && a.y < b.y);
};
-static bool operator>(const b3Int4& a,const b3Int4& b)
+static bool operator>(const b3Int4& a, const b3Int4& b)
{
return a.x > b.x || (a.x == b.x && a.y > b.y);
};
@@ -278,31 +266,29 @@ static bool operator>(const b3Int4& a,const b3Int4& b)
b3AlignedObjectArray<b3Int4> addedHostPairs;
b3AlignedObjectArray<b3Int4> removedHostPairs;
-b3AlignedObjectArray<b3SapAabb> preAabbs;
+b3AlignedObjectArray<b3SapAabb> preAabbs;
-void b3GpuSapBroadphase::calculateOverlappingPairsHostIncremental3Sap()
+void b3GpuSapBroadphase::calculateOverlappingPairsHostIncremental3Sap()
{
//static int framepje = 0;
//printf("framepje=%d\n",framepje++);
-
B3_PROFILE("calculateOverlappingPairsHostIncremental3Sap");
addedHostPairs.resize(0);
removedHostPairs.resize(0);
- b3Assert(m_currentBuffer>=0);
-
+ b3Assert(m_currentBuffer >= 0);
+
{
preAabbs.resize(m_allAabbsCPU.size());
- for (int i=0;i<preAabbs.size();i++)
+ for (int i = 0; i < preAabbs.size(); i++)
{
- preAabbs[i]=m_allAabbsCPU[i];
+ preAabbs[i] = m_allAabbsCPU[i];
}
}
-
- if (m_currentBuffer<0)
+ if (m_currentBuffer < 0)
return;
{
B3_PROFILE("m_allAabbsGPU.copyToHost");
@@ -316,100 +302,87 @@ void b3GpuSapBroadphase::calculateOverlappingPairsHostIncremental3Sap()
}
if (0)
{
- {
- printf("ab[40].min=%f,%f,%f,ab[40].max=%f,%f,%f\n",
- m_allAabbsCPU[40].m_min[0], m_allAabbsCPU[40].m_min[1],m_allAabbsCPU[40].m_min[2],
- m_allAabbsCPU[40].m_max[0], m_allAabbsCPU[40].m_max[1],m_allAabbsCPU[40].m_max[2]);
- }
-
- {
- printf("ab[53].min=%f,%f,%f,ab[53].max=%f,%f,%f\n",
- m_allAabbsCPU[53].m_min[0], m_allAabbsCPU[53].m_min[1],m_allAabbsCPU[53].m_min[2],
- m_allAabbsCPU[53].m_max[0], m_allAabbsCPU[53].m_max[1],m_allAabbsCPU[53].m_max[2]);
- }
-
-
- {
- b3Int4 newPair;
- newPair.x = 40;
- newPair.y = 53;
- int index = allPairs.findBinarySearch(newPair);
- printf("hasPair(40,53)=%d out of %d\n",index, allPairs.size());
-
{
- int overlap = TestAabbAgainstAabb2((const b3Vector3&)m_allAabbsCPU[40].m_min, (const b3Vector3&)m_allAabbsCPU[40].m_max,(const b3Vector3&)m_allAabbsCPU[53].m_min,(const b3Vector3&)m_allAabbsCPU[53].m_max);
- printf("overlap=%d\n",overlap);
+ printf("ab[40].min=%f,%f,%f,ab[40].max=%f,%f,%f\n",
+ m_allAabbsCPU[40].m_min[0], m_allAabbsCPU[40].m_min[1], m_allAabbsCPU[40].m_min[2],
+ m_allAabbsCPU[40].m_max[0], m_allAabbsCPU[40].m_max[1], m_allAabbsCPU[40].m_max[2]);
}
- if (preAabbs.size())
- {
- int prevOverlap = TestAabbAgainstAabb2((const b3Vector3&)preAabbs[40].m_min, (const b3Vector3&)preAabbs[40].m_max,(const b3Vector3&)preAabbs[53].m_min,(const b3Vector3&)preAabbs[53].m_max);
- printf("prevoverlap=%d\n",prevOverlap);
- } else
{
- printf("unknown prevoverlap\n");
+ printf("ab[53].min=%f,%f,%f,ab[53].max=%f,%f,%f\n",
+ m_allAabbsCPU[53].m_min[0], m_allAabbsCPU[53].m_min[1], m_allAabbsCPU[53].m_min[2],
+ m_allAabbsCPU[53].m_max[0], m_allAabbsCPU[53].m_max[1], m_allAabbsCPU[53].m_max[2]);
}
- }
- }
+ {
+ b3Int4 newPair;
+ newPair.x = 40;
+ newPair.y = 53;
+ int index = allPairs.findBinarySearch(newPair);
+ printf("hasPair(40,53)=%d out of %d\n", index, allPairs.size());
+ {
+ int overlap = TestAabbAgainstAabb2((const b3Vector3&)m_allAabbsCPU[40].m_min, (const b3Vector3&)m_allAabbsCPU[40].m_max, (const b3Vector3&)m_allAabbsCPU[53].m_min, (const b3Vector3&)m_allAabbsCPU[53].m_max);
+ printf("overlap=%d\n", overlap);
+ }
+
+ if (preAabbs.size())
+ {
+ int prevOverlap = TestAabbAgainstAabb2((const b3Vector3&)preAabbs[40].m_min, (const b3Vector3&)preAabbs[40].m_max, (const b3Vector3&)preAabbs[53].m_min, (const b3Vector3&)preAabbs[53].m_max);
+ printf("prevoverlap=%d\n", prevOverlap);
+ }
+ else
+ {
+ printf("unknown prevoverlap\n");
+ }
+ }
+ }
if (0)
{
- for (int i=0;i<m_allAabbsCPU.size();i++)
+ for (int i = 0; i < m_allAabbsCPU.size(); i++)
{
//printf("aabb[%d] min=%f,%f,%f max=%f,%f,%f\n",i,m_allAabbsCPU[i].m_min[0],m_allAabbsCPU[i].m_min[1],m_allAabbsCPU[i].m_min[2], m_allAabbsCPU[i].m_max[0],m_allAabbsCPU[i].m_max[1],m_allAabbsCPU[i].m_max[2]);
-
-
}
- for (int axis=0;axis<3;axis++)
+ for (int axis = 0; axis < 3; axis++)
{
- for (int buf=0;buf<2;buf++)
+ for (int buf = 0; buf < 2; buf++)
{
- b3Assert(m_sortedAxisCPU[axis][buf].size() == m_allAabbsCPU.size()*2);
+ b3Assert(m_sortedAxisCPU[axis][buf].size() == m_allAabbsCPU.size() * 2);
}
}
}
-
-
- m_currentBuffer = 1-m_currentBuffer;
-
-
+ m_currentBuffer = 1 - m_currentBuffer;
int totalNumAabbs = m_allAabbsCPU.size();
{
B3_PROFILE("assign m_sortedAxisCPU(FloatFlip)");
- for (int i=0;i<totalNumAabbs;i++)
+ for (int i = 0; i < totalNumAabbs; i++)
{
-
-
unsigned int keyMin[3];
unsigned int keyMax[3];
- for (int axis=0;axis<3;axis++)
+ for (int axis = 0; axis < 3; axis++)
{
- float vmin=m_allAabbsCPU[i].m_min[axis];
+ float vmin = m_allAabbsCPU[i].m_min[axis];
float vmax = m_allAabbsCPU[i].m_max[axis];
keyMin[axis] = FloatFlip(vmin);
keyMax[axis] = FloatFlip(vmax);
-
- m_sortedAxisCPU[axis][m_currentBuffer][i*2].m_key = keyMin[axis]-1;
- m_sortedAxisCPU[axis][m_currentBuffer][i*2].m_value = i*2;
- m_sortedAxisCPU[axis][m_currentBuffer][i*2+1].m_key = keyMax[axis]+1;
- m_sortedAxisCPU[axis][m_currentBuffer][i*2+1].m_value = i*2+1;
+
+ m_sortedAxisCPU[axis][m_currentBuffer][i * 2].m_key = keyMin[axis] - 1;
+ m_sortedAxisCPU[axis][m_currentBuffer][i * 2].m_value = i * 2;
+ m_sortedAxisCPU[axis][m_currentBuffer][i * 2 + 1].m_key = keyMax[axis] + 1;
+ m_sortedAxisCPU[axis][m_currentBuffer][i * 2 + 1].m_value = i * 2 + 1;
}
//printf("aabb[%d] min=%u,%u,%u max %u,%u,%u\n", i,keyMin[0],keyMin[1],keyMin[2],keyMax[0],keyMax[1],keyMax[2]);
-
}
}
-
-
{
B3_PROFILE("sort m_sortedAxisCPU");
- for (int axis=0;axis<3;axis++)
+ for (int axis = 0; axis < 3; axis++)
m_sorter->executeHost(m_sortedAxisCPU[axis][m_currentBuffer]);
}
@@ -432,21 +405,22 @@ void b3GpuSapBroadphase::calculateOverlappingPairsHostIncremental3Sap()
{
B3_PROFILE("assign m_objectMinMaxIndexCPU");
- for (int axis=0;axis<3;axis++)
+ for (int axis = 0; axis < 3; axis++)
{
int totalNumAabbs = m_allAabbsCPU.size();
int numEndPoints = m_sortedAxisCPU[axis][m_currentBuffer].size();
m_objectMinMaxIndexCPU[axis][m_currentBuffer].resize(totalNumAabbs);
- for (int i=0;i<numEndPoints;i++)
+ for (int i = 0; i < numEndPoints; i++)
{
int destIndex = m_sortedAxisCPU[axis][m_currentBuffer][i].m_value;
- int newDest = destIndex/2;
- if (destIndex&1)
+ int newDest = destIndex / 2;
+ if (destIndex & 1)
{
- m_objectMinMaxIndexCPU[axis][m_currentBuffer][newDest].y=i;
- } else
+ m_objectMinMaxIndexCPU[axis][m_currentBuffer][newDest].y = i;
+ }
+ else
{
- m_objectMinMaxIndexCPU[axis][m_currentBuffer][newDest].x=i;
+ m_objectMinMaxIndexCPU[axis][m_currentBuffer][newDest].x = i;
}
}
}
@@ -485,12 +459,11 @@ void b3GpuSapBroadphase::calculateOverlappingPairsHostIncremental3Sap()
}
#endif
-
int a = m_objectMinMaxIndexCPU[0][m_currentBuffer].size();
int b = m_objectMinMaxIndexCPU[1][m_currentBuffer].size();
int c = m_objectMinMaxIndexCPU[2][m_currentBuffer].size();
- b3Assert(a==b);
- b3Assert(b==c);
+ b3Assert(a == b);
+ b3Assert(b == c);
/*
if (searchIncremental3dSapOnGpu)
{
@@ -574,175 +547,170 @@ void b3GpuSapBroadphase::calculateOverlappingPairsHostIncremental3Sap()
int numObjects = m_objectMinMaxIndexCPU[0][m_currentBuffer].size();
B3_PROFILE("actual search");
- for (int i=0;i<numObjects;i++)
+ for (int i = 0; i < numObjects; i++)
{
//int numObjects = m_objectMinMaxIndexCPU[axis][m_currentBuffer].size();
//int checkObjects[]={40,53};
//int numCheckObjects = sizeof(checkObjects)/sizeof(int);
-
+
//for (int a=0;a<numCheckObjects ;a++)
-
- for (int axis=0;axis<3;axis++)
+
+ for (int axis = 0; axis < 3; axis++)
{
//int i = checkObjects[a];
unsigned int curMinIndex = m_objectMinMaxIndexCPU[axis][m_currentBuffer][i].x;
unsigned int curMaxIndex = m_objectMinMaxIndexCPU[axis][m_currentBuffer][i].y;
- unsigned int prevMinIndex = m_objectMinMaxIndexCPU[axis][1-m_currentBuffer][i].x;
+ unsigned int prevMinIndex = m_objectMinMaxIndexCPU[axis][1 - m_currentBuffer][i].x;
int dmin = curMinIndex - prevMinIndex;
-
- unsigned int prevMaxIndex = m_objectMinMaxIndexCPU[axis][1-m_currentBuffer][i].y;
-
+ unsigned int prevMaxIndex = m_objectMinMaxIndexCPU[axis][1 - m_currentBuffer][i].y;
int dmax = curMaxIndex - prevMaxIndex;
- if (dmin!=0)
+ if (dmin != 0)
{
//printf("for object %d, dmin=%d\n",i,dmin);
}
- if (dmax!=0)
+ if (dmax != 0)
{
//printf("for object %d, dmax=%d\n",i,dmax);
}
- for (int otherbuffer = 0;otherbuffer<2;otherbuffer++)
+ for (int otherbuffer = 0; otherbuffer < 2; otherbuffer++)
{
- if (dmin!=0)
+ if (dmin != 0)
{
- int stepMin = dmin<0 ? -1 : 1;
- for (int j=prevMinIndex;j!=curMinIndex;j+=stepMin)
+ int stepMin = dmin < 0 ? -1 : 1;
+ for (int j = prevMinIndex; j != curMinIndex; j += stepMin)
{
int otherIndex2 = m_sortedAxisCPU[axis][otherbuffer][j].y;
- int otherIndex = otherIndex2/2;
- if (otherIndex!=i)
+ int otherIndex = otherIndex2 / 2;
+ if (otherIndex != i)
{
- bool otherIsMax = ((otherIndex2&1)!=0);
+ bool otherIsMax = ((otherIndex2 & 1) != 0);
if (otherIsMax)
{
//bool overlap = TestAabbAgainstAabb2((const b3Vector3&)m_allAabbsCPU[i].m_min, (const b3Vector3&)m_allAabbsCPU[i].m_max,(const b3Vector3&)m_allAabbsCPU[otherIndex].m_min,(const b3Vector3&)m_allAabbsCPU[otherIndex].m_max);
//bool prevOverlap = TestAabbAgainstAabb2((const b3Vector3&)preAabbs[i].m_min, (const b3Vector3&)preAabbs[i].m_max,(const b3Vector3&)preAabbs[otherIndex].m_min,(const b3Vector3&)preAabbs[otherIndex].m_max);
-
+
bool overlap = true;
- for (int ax=0;ax<3;ax++)
+ for (int ax = 0; ax < 3; ax++)
{
if ((m_objectMinMaxIndexCPU[ax][m_currentBuffer][i].x > m_objectMinMaxIndexCPU[ax][m_currentBuffer][otherIndex].y) ||
(m_objectMinMaxIndexCPU[ax][m_currentBuffer][i].y < m_objectMinMaxIndexCPU[ax][m_currentBuffer][otherIndex].x))
- overlap=false;
+ overlap = false;
}
- // b3Assert(overlap2==overlap);
+ // b3Assert(overlap2==overlap);
bool prevOverlap = true;
- for (int ax=0;ax<3;ax++)
+ for (int ax = 0; ax < 3; ax++)
{
- if ((m_objectMinMaxIndexCPU[ax][1-m_currentBuffer][i].x > m_objectMinMaxIndexCPU[ax][1-m_currentBuffer][otherIndex].y) ||
- (m_objectMinMaxIndexCPU[ax][1-m_currentBuffer][i].y < m_objectMinMaxIndexCPU[ax][1-m_currentBuffer][otherIndex].x))
- prevOverlap=false;
+ if ((m_objectMinMaxIndexCPU[ax][1 - m_currentBuffer][i].x > m_objectMinMaxIndexCPU[ax][1 - m_currentBuffer][otherIndex].y) ||
+ (m_objectMinMaxIndexCPU[ax][1 - m_currentBuffer][i].y < m_objectMinMaxIndexCPU[ax][1 - m_currentBuffer][otherIndex].x))
+ prevOverlap = false;
}
-
//b3Assert(overlap==overlap2);
-
-
- if (dmin<0)
+ if (dmin < 0)
{
if (overlap && !prevOverlap)
{
//add a pair
b3Int4 newPair;
- if (i<=otherIndex)
+ if (i <= otherIndex)
{
newPair.x = i;
newPair.y = otherIndex;
- } else
+ }
+ else
{
newPair.x = otherIndex;
newPair.y = i;
}
addedHostPairs.push_back(newPair);
}
- }
+ }
else
{
if (!overlap && prevOverlap)
{
-
//remove a pair
b3Int4 removedPair;
- if (i<=otherIndex)
+ if (i <= otherIndex)
{
removedPair.x = i;
removedPair.y = otherIndex;
- } else
+ }
+ else
{
removedPair.x = otherIndex;
removedPair.y = i;
}
removedHostPairs.push_back(removedPair);
}
- }//otherisMax
- }//if (dmin<0)
- }//if (otherIndex!=i)
- }//for (int j=
+ } //otherisMax
+ } //if (dmin<0)
+ } //if (otherIndex!=i)
+ } //for (int j=
}
-
- if (dmax!=0)
+
+ if (dmax != 0)
{
- int stepMax = dmax<0 ? -1 : 1;
- for (int j=prevMaxIndex;j!=curMaxIndex;j+=stepMax)
+ int stepMax = dmax < 0 ? -1 : 1;
+ for (int j = prevMaxIndex; j != curMaxIndex; j += stepMax)
{
int otherIndex2 = m_sortedAxisCPU[axis][otherbuffer][j].y;
- int otherIndex = otherIndex2/2;
- if (otherIndex!=i)
+ int otherIndex = otherIndex2 / 2;
+ if (otherIndex != i)
{
//bool otherIsMin = ((otherIndex2&1)==0);
//if (otherIsMin)
{
//bool overlap = TestAabbAgainstAabb2((const b3Vector3&)m_allAabbsCPU[i].m_min, (const b3Vector3&)m_allAabbsCPU[i].m_max,(const b3Vector3&)m_allAabbsCPU[otherIndex].m_min,(const b3Vector3&)m_allAabbsCPU[otherIndex].m_max);
//bool prevOverlap = TestAabbAgainstAabb2((const b3Vector3&)preAabbs[i].m_min, (const b3Vector3&)preAabbs[i].m_max,(const b3Vector3&)preAabbs[otherIndex].m_min,(const b3Vector3&)preAabbs[otherIndex].m_max);
-
+
bool overlap = true;
- for (int ax=0;ax<3;ax++)
+ for (int ax = 0; ax < 3; ax++)
{
if ((m_objectMinMaxIndexCPU[ax][m_currentBuffer][i].x > m_objectMinMaxIndexCPU[ax][m_currentBuffer][otherIndex].y) ||
(m_objectMinMaxIndexCPU[ax][m_currentBuffer][i].y < m_objectMinMaxIndexCPU[ax][m_currentBuffer][otherIndex].x))
- overlap=false;
+ overlap = false;
}
//b3Assert(overlap2==overlap);
bool prevOverlap = true;
- for (int ax=0;ax<3;ax++)
+ for (int ax = 0; ax < 3; ax++)
{
- if ((m_objectMinMaxIndexCPU[ax][1-m_currentBuffer][i].x > m_objectMinMaxIndexCPU[ax][1-m_currentBuffer][otherIndex].y) ||
- (m_objectMinMaxIndexCPU[ax][1-m_currentBuffer][i].y < m_objectMinMaxIndexCPU[ax][1-m_currentBuffer][otherIndex].x))
- prevOverlap=false;
+ if ((m_objectMinMaxIndexCPU[ax][1 - m_currentBuffer][i].x > m_objectMinMaxIndexCPU[ax][1 - m_currentBuffer][otherIndex].y) ||
+ (m_objectMinMaxIndexCPU[ax][1 - m_currentBuffer][i].y < m_objectMinMaxIndexCPU[ax][1 - m_currentBuffer][otherIndex].x))
+ prevOverlap = false;
}
-
- if (dmax>0)
+ if (dmax > 0)
{
if (overlap && !prevOverlap)
{
//add a pair
b3Int4 newPair;
- if (i<=otherIndex)
+ if (i <= otherIndex)
{
newPair.x = i;
newPair.y = otherIndex;
- } else
+ }
+ else
{
newPair.x = otherIndex;
newPair.y = i;
}
addedHostPairs.push_back(newPair);
-
}
- }
+ }
else
{
if (!overlap && prevOverlap)
@@ -750,33 +718,31 @@ void b3GpuSapBroadphase::calculateOverlappingPairsHostIncremental3Sap()
//if (otherIndex2&1==0) -> min?
//remove a pair
b3Int4 removedPair;
- if (i<=otherIndex)
+ if (i <= otherIndex)
{
removedPair.x = i;
removedPair.y = otherIndex;
- } else
+ }
+ else
{
removedPair.x = otherIndex;
removedPair.y = i;
}
removedHostPairs.push_back(removedPair);
-
}
}
-
- }//if (dmin<0)
- }//if (otherIndex!=i)
- }//for (int j=
+
+ } //if (dmin<0)
+ } //if (otherIndex!=i)
+ } //for (int j=
}
- }//for (int otherbuffer
- }//for (int axis=0;
- }//for (int i=0;i<numObjects
+ } //for (int otherbuffer
+ } //for (int axis=0;
+ } //for (int i=0;i<numObjects
}
//remove duplicates and add/remove then to existing m_overlappingPairs
-
-
-
+
{
{
B3_PROFILE("sort allPairs");
@@ -795,31 +761,28 @@ void b3GpuSapBroadphase::calculateOverlappingPairsHostIncremental3Sap()
b3Int4 prevPair;
prevPair.x = -1;
prevPair.y = -1;
-
+
int uniqueRemovedPairs = 0;
b3AlignedObjectArray<int> removedPositions;
{
B3_PROFILE("actual removing");
- for (int i=0;i<removedHostPairs.size();i++)
+ for (int i = 0; i < removedHostPairs.size(); i++)
{
b3Int4 removedPair = removedHostPairs[i];
if ((removedPair.x != prevPair.x) || (removedPair.y != prevPair.y))
{
+ int index1 = allPairs.findBinarySearch(removedPair);
- int index1 = allPairs.findBinarySearch(removedPair);
+ //#ifdef _DEBUG
- //#ifdef _DEBUG
-
-
-
int index2 = allPairs.findLinearSearch(removedPair);
- b3Assert(index1==index2);
-
+ b3Assert(index1 == index2);
+
//b3Assert(index1!=allPairs.size());
- if (index1<allPairs.size())
- //#endif//_DEBUG
+ if (index1 < allPairs.size())
+ //#endif//_DEBUG
{
uniqueRemovedPairs++;
removedPositions.push_back(index1);
@@ -833,13 +796,13 @@ void b3GpuSapBroadphase::calculateOverlappingPairsHostIncremental3Sap()
if (uniqueRemovedPairs)
{
- for (int i=0;i<removedPositions.size();i++)
+ for (int i = 0; i < removedPositions.size(); i++)
{
- allPairs[removedPositions[i]].x = INT_MAX ;
- allPairs[removedPositions[i]].y = INT_MAX ;
+ allPairs[removedPositions[i]].x = INT_MAX;
+ allPairs[removedPositions[i]].y = INT_MAX;
}
allPairs.quickSort(b3PairCmp);
- allPairs.resize(allPairs.size()-uniqueRemovedPairs);
+ allPairs.resize(allPairs.size() - uniqueRemovedPairs);
}
}
//if (uniqueRemovedPairs)
@@ -848,33 +811,31 @@ void b3GpuSapBroadphase::calculateOverlappingPairsHostIncremental3Sap()
prevPair.x = -1;
prevPair.y = -1;
-
- int uniqueAddedPairs=0;
+
+ int uniqueAddedPairs = 0;
b3AlignedObjectArray<b3Int4> actualAddedPairs;
{
B3_PROFILE("actual adding");
- for (int i=0;i<addedHostPairs.size();i++)
+ for (int i = 0; i < addedHostPairs.size(); i++)
{
b3Int4 newPair = addedHostPairs[i];
if ((newPair.x != prevPair.x) || (newPair.y != prevPair.y))
{
-//#ifdef _DEBUG
+ //#ifdef _DEBUG
int index1 = allPairs.findBinarySearch(newPair);
-
-
+
int index2 = allPairs.findLinearSearch(newPair);
- b3Assert(index1==index2);
-
+ b3Assert(index1 == index2);
- b3Assert(index1==allPairs.size());
- if (index1!=allPairs.size())
+ b3Assert(index1 == allPairs.size());
+ if (index1 != allPairs.size())
{
printf("??\n");
}
- if (index1==allPairs.size())
-//#endif //_DEBUG
+ if (index1 == allPairs.size())
+ //#endif //_DEBUG
{
uniqueAddedPairs++;
actualAddedPairs.push_back(newPair);
@@ -882,94 +843,83 @@ void b3GpuSapBroadphase::calculateOverlappingPairsHostIncremental3Sap()
}
prevPair = newPair;
}
- for (int i=0;i<actualAddedPairs.size();i++)
+ for (int i = 0; i < actualAddedPairs.size(); i++)
{
//printf("framepje (%d), new pair(%d):%d,%d\n",framepje,i,actualAddedPairs[i].x,actualAddedPairs[i].y);
allPairs.push_back(actualAddedPairs[i]);
}
}
-
+
//if (uniqueAddedPairs)
// printf("uniqueAddedPairs=%d\n", uniqueAddedPairs);
-
{
B3_PROFILE("m_overlappingPairs.copyFromHost");
m_overlappingPairs.copyFromHost(allPairs);
}
-
-
}
-
-
-
-void b3GpuSapBroadphase::calculateOverlappingPairsHost(int maxPairs)
+void b3GpuSapBroadphase::calculateOverlappingPairsHost(int maxPairs)
{
//test
-// if (m_currentBuffer>=0)
+ // if (m_currentBuffer>=0)
// return calculateOverlappingPairsHostIncremental3Sap();
b3Assert(m_allAabbsCPU.size() == m_allAabbsGPU.size());
m_allAabbsGPU.copyToHost(m_allAabbsCPU);
-
-
- int axis=0;
+ int axis = 0;
{
B3_PROFILE("CPU compute best variance axis");
- b3Vector3 s=b3MakeVector3(0,0,0),s2=b3MakeVector3(0,0,0);
+ b3Vector3 s = b3MakeVector3(0, 0, 0), s2 = b3MakeVector3(0, 0, 0);
int numRigidBodies = m_smallAabbsMappingCPU.size();
- for(int i=0;i<numRigidBodies;i++)
+ for (int i = 0; i < numRigidBodies; i++)
{
b3SapAabb aabb = this->m_allAabbsCPU[m_smallAabbsMappingCPU[i]];
- b3Vector3 maxAabb=b3MakeVector3(aabb.m_max[0],aabb.m_max[1],aabb.m_max[2]);
- b3Vector3 minAabb=b3MakeVector3(aabb.m_min[0],aabb.m_min[1],aabb.m_min[2]);
- b3Vector3 centerAabb=(maxAabb+minAabb)*0.5f;
-
+ b3Vector3 maxAabb = b3MakeVector3(aabb.m_max[0], aabb.m_max[1], aabb.m_max[2]);
+ b3Vector3 minAabb = b3MakeVector3(aabb.m_min[0], aabb.m_min[1], aabb.m_min[2]);
+ b3Vector3 centerAabb = (maxAabb + minAabb) * 0.5f;
+
s += centerAabb;
- s2 += centerAabb*centerAabb;
+ s2 += centerAabb * centerAabb;
}
- b3Vector3 v = s2 - (s*s) / (float)numRigidBodies;
-
- if(v[1] > v[0])
+ b3Vector3 v = s2 - (s * s) / (float)numRigidBodies;
+
+ if (v[1] > v[0])
axis = 1;
- if(v[2] > v[axis])
+ if (v[2] > v[axis])
axis = 2;
}
-
-
-
b3AlignedObjectArray<b3Int4> hostPairs;
{
int numSmallAabbs = m_smallAabbsMappingCPU.size();
- for (int i=0;i<numSmallAabbs;i++)
+ for (int i = 0; i < numSmallAabbs; i++)
{
b3SapAabb smallAabbi = m_allAabbsCPU[m_smallAabbsMappingCPU[i]];
//float reference = smallAabbi.m_max[axis];
- for (int j=i+1;j<numSmallAabbs;j++)
+ for (int j = i + 1; j < numSmallAabbs; j++)
{
-
b3SapAabb smallAabbj = m_allAabbsCPU[m_smallAabbsMappingCPU[j]];
if (TestAabbAgainstAabb2((b3Vector3&)smallAabbi.m_min, (b3Vector3&)smallAabbi.m_max,
- (b3Vector3&)smallAabbj.m_min,(b3Vector3&)smallAabbj.m_max))
+ (b3Vector3&)smallAabbj.m_min, (b3Vector3&)smallAabbj.m_max))
{
b3Int4 pair;
int a = smallAabbi.m_minIndices[3];
int b = smallAabbj.m_minIndices[3];
- if (a<=b)
+ if (a <= b)
{
- pair.x = a;//store the original index in the unsorted aabb array
+ pair.x = a; //store the original index in the unsorted aabb array
pair.y = b;
- } else
+ }
+ else
{
- pair.x = b;//store the original index in the unsorted aabb array
+ pair.x = b; //store the original index in the unsorted aabb array
pair.y = a;
}
hostPairs.push_back(pair);
@@ -978,35 +928,35 @@ void b3GpuSapBroadphase::calculateOverlappingPairsHost(int maxPairs)
}
}
-
{
int numSmallAabbs = m_smallAabbsMappingCPU.size();
- for (int i=0;i<numSmallAabbs;i++)
+ for (int i = 0; i < numSmallAabbs; i++)
{
b3SapAabb smallAabbi = m_allAabbsCPU[m_smallAabbsMappingCPU[i]];
//float reference = smallAabbi.m_max[axis];
int numLargeAabbs = m_largeAabbsMappingCPU.size();
- for (int j=0;j<numLargeAabbs;j++)
+ for (int j = 0; j < numLargeAabbs; j++)
{
b3SapAabb largeAabbj = m_allAabbsCPU[m_largeAabbsMappingCPU[j]];
if (TestAabbAgainstAabb2((b3Vector3&)smallAabbi.m_min, (b3Vector3&)smallAabbi.m_max,
- (b3Vector3&)largeAabbj.m_min,(b3Vector3&)largeAabbj.m_max))
+ (b3Vector3&)largeAabbj.m_min, (b3Vector3&)largeAabbj.m_max))
{
b3Int4 pair;
int a = largeAabbj.m_minIndices[3];
int b = smallAabbi.m_minIndices[3];
- if (a<=b)
+ if (a <= b)
{
- pair.x = a;
- pair.y = b;//store the original index in the unsorted aabb array
- } else
+ pair.x = a;
+ pair.y = b; //store the original index in the unsorted aabb array
+ }
+ else
{
pair.x = b;
- pair.y = a;//store the original index in the unsorted aabb array
+ pair.y = a; //store the original index in the unsorted aabb array
}
-
+
hostPairs.push_back(pair);
}
}
@@ -1021,21 +971,20 @@ void b3GpuSapBroadphase::calculateOverlappingPairsHost(int maxPairs)
if (hostPairs.size())
{
m_overlappingPairs.copyFromHost(hostPairs);
- } else
+ }
+ else
{
m_overlappingPairs.resize(0);
}
//init3dSap();
-
}
-void b3GpuSapBroadphase::reset()
+void b3GpuSapBroadphase::reset()
{
m_allAabbsGPU.resize(0);
m_allAabbsCPU.resize(0);
-
m_smallAabbsMappingGPU.resize(0);
m_smallAabbsMappingCPU.resize(0);
@@ -1043,13 +992,11 @@ void b3GpuSapBroadphase::reset()
m_largeAabbsMappingGPU.resize(0);
m_largeAabbsMappingCPU.resize(0);
-
}
-
-void b3GpuSapBroadphase::calculateOverlappingPairs(int maxPairs)
+void b3GpuSapBroadphase::calculateOverlappingPairs(int maxPairs)
{
- if (m_sapKernel==0)
+ if (m_sapKernel == 0)
{
calculateOverlappingPairsHost(maxPairs);
return;
@@ -1065,68 +1012,62 @@ void b3GpuSapBroadphase::calculateOverlappingPairs(int maxPairs)
int axis = 0;
{
+ //bool syncOnHost = false;
- //bool syncOnHost = false;
-
- int numSmallAabbs = m_smallAabbsMappingCPU.size();
- if (m_prefixScanFloat4 && numSmallAabbs)
- {
- B3_PROFILE("GPU compute best variance axis");
-
- if (m_dst.size()!=(numSmallAabbs+1))
+ int numSmallAabbs = m_smallAabbsMappingCPU.size();
+ if (m_prefixScanFloat4 && numSmallAabbs)
{
- m_dst.resize(numSmallAabbs+128);
- m_sum.resize(numSmallAabbs+128);
- m_sum2.resize(numSmallAabbs+128);
- m_sum.at(numSmallAabbs)=b3MakeVector3(0,0,0); //slow?
- m_sum2.at(numSmallAabbs)=b3MakeVector3(0,0,0); //slow?
- }
+ B3_PROFILE("GPU compute best variance axis");
- b3LauncherCL launcher(m_queue, m_prepareSumVarianceKernel ,"m_prepareSumVarianceKernel");
- launcher.setBuffer(m_allAabbsGPU.getBufferCL());
-
- launcher.setBuffer(m_smallAabbsMappingGPU.getBufferCL());
- launcher.setBuffer(m_sum.getBufferCL());
- launcher.setBuffer(m_sum2.getBufferCL());
- launcher.setConst( numSmallAabbs );
- int num = numSmallAabbs;
- launcher.launch1D( num);
-
+ if (m_dst.size() != (numSmallAabbs + 1))
+ {
+ m_dst.resize(numSmallAabbs + 128);
+ m_sum.resize(numSmallAabbs + 128);
+ m_sum2.resize(numSmallAabbs + 128);
+ m_sum.at(numSmallAabbs) = b3MakeVector3(0, 0, 0); //slow?
+ m_sum2.at(numSmallAabbs) = b3MakeVector3(0, 0, 0); //slow?
+ }
- b3Vector3 s;
- b3Vector3 s2;
- m_prefixScanFloat4->execute(m_sum,m_dst,numSmallAabbs+1,&s);
- m_prefixScanFloat4->execute(m_sum2,m_dst,numSmallAabbs+1,&s2);
+ b3LauncherCL launcher(m_queue, m_prepareSumVarianceKernel, "m_prepareSumVarianceKernel");
+ launcher.setBuffer(m_allAabbsGPU.getBufferCL());
- b3Vector3 v = s2 - (s*s) / (float)numSmallAabbs;
-
- if(v[1] > v[0])
- axis = 1;
- if(v[2] > v[axis])
- axis = 2;
- }
+ launcher.setBuffer(m_smallAabbsMappingGPU.getBufferCL());
+ launcher.setBuffer(m_sum.getBufferCL());
+ launcher.setBuffer(m_sum2.getBufferCL());
+ launcher.setConst(numSmallAabbs);
+ int num = numSmallAabbs;
+ launcher.launch1D(num);
+ b3Vector3 s;
+ b3Vector3 s2;
+ m_prefixScanFloat4->execute(m_sum, m_dst, numSmallAabbs + 1, &s);
+ m_prefixScanFloat4->execute(m_sum2, m_dst, numSmallAabbs + 1, &s2);
+
+ b3Vector3 v = s2 - (s * s) / (float)numSmallAabbs;
+
+ if (v[1] > v[0])
+ axis = 1;
+ if (v[2] > v[axis])
+ axis = 2;
+ }
-
m_gpuSmallSortData.resize(numSmallAabbs);
-
#if 1
if (m_smallAabbsMappingGPU.size())
{
-
B3_PROFILE("flipFloatKernel");
- b3BufferInfoCL bInfo[] = {
- b3BufferInfoCL( m_allAabbsGPU.getBufferCL(), true ),
- b3BufferInfoCL( m_smallAabbsMappingGPU.getBufferCL(), true),
- b3BufferInfoCL( m_gpuSmallSortData.getBufferCL())};
- b3LauncherCL launcher(m_queue, m_flipFloatKernel ,"m_flipFloatKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( numSmallAabbs );
- launcher.setConst( axis );
-
+ b3BufferInfoCL bInfo[] = {
+ b3BufferInfoCL(m_allAabbsGPU.getBufferCL(), true),
+ b3BufferInfoCL(m_smallAabbsMappingGPU.getBufferCL(), true),
+ b3BufferInfoCL(m_gpuSmallSortData.getBufferCL())};
+ b3LauncherCL launcher(m_queue, m_flipFloatKernel, "m_flipFloatKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(numSmallAabbs);
+ launcher.setConst(axis);
+
int num = numSmallAabbs;
- launcher.launch1D( num);
+ launcher.launch1D(num);
clFinish(m_queue);
}
@@ -1141,69 +1082,66 @@ void b3GpuSapBroadphase::calculateOverlappingPairs(int maxPairs)
if (numSmallAabbs)
{
B3_PROFILE("scatterKernel");
-
- b3BufferInfoCL bInfo[] = {
- b3BufferInfoCL( m_allAabbsGPU.getBufferCL(), true ),
- b3BufferInfoCL( m_smallAabbsMappingGPU.getBufferCL(), true),
- b3BufferInfoCL( m_gpuSmallSortData.getBufferCL(),true),
+
+ b3BufferInfoCL bInfo[] = {
+ b3BufferInfoCL(m_allAabbsGPU.getBufferCL(), true),
+ b3BufferInfoCL(m_smallAabbsMappingGPU.getBufferCL(), true),
+ b3BufferInfoCL(m_gpuSmallSortData.getBufferCL(), true),
b3BufferInfoCL(m_gpuSmallSortedAabbs.getBufferCL())};
- b3LauncherCL launcher(m_queue, m_scatterKernel ,"m_scatterKernel ");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( numSmallAabbs);
+ b3LauncherCL launcher(m_queue, m_scatterKernel, "m_scatterKernel ");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(numSmallAabbs);
int num = numSmallAabbs;
- launcher.launch1D( num);
+ launcher.launch1D(num);
clFinish(m_queue);
-
}
-
- m_overlappingPairs.resize(maxPairs);
+ m_overlappingPairs.resize(maxPairs);
- m_pairCount.resize(0);
- m_pairCount.push_back(0);
- int numPairs=0;
+ m_pairCount.resize(0);
+ m_pairCount.push_back(0);
+ int numPairs = 0;
+ {
+ int numLargeAabbs = m_largeAabbsMappingGPU.size();
+ if (numLargeAabbs && numSmallAabbs)
{
- int numLargeAabbs = m_largeAabbsMappingGPU.size();
- if (numLargeAabbs && numSmallAabbs)
+ //@todo
+ B3_PROFILE("sap2Kernel");
+ b3BufferInfoCL bInfo[] = {
+ b3BufferInfoCL(m_allAabbsGPU.getBufferCL()),
+ b3BufferInfoCL(m_largeAabbsMappingGPU.getBufferCL()),
+ b3BufferInfoCL(m_smallAabbsMappingGPU.getBufferCL()),
+ b3BufferInfoCL(m_overlappingPairs.getBufferCL()),
+ b3BufferInfoCL(m_pairCount.getBufferCL())};
+ b3LauncherCL launcher(m_queue, m_sap2Kernel, "m_sap2Kernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(numLargeAabbs);
+ launcher.setConst(numSmallAabbs);
+ launcher.setConst(axis);
+ launcher.setConst(maxPairs);
+ //@todo: use actual maximum work item sizes of the device instead of hardcoded values
+ launcher.launch2D(numLargeAabbs, numSmallAabbs, 4, 64);
+
+ numPairs = m_pairCount.at(0);
+ if (numPairs > maxPairs)
{
- //@todo
- B3_PROFILE("sap2Kernel");
- b3BufferInfoCL bInfo[] = {
- b3BufferInfoCL( m_allAabbsGPU.getBufferCL() ),
- b3BufferInfoCL( m_largeAabbsMappingGPU.getBufferCL() ),
- b3BufferInfoCL( m_smallAabbsMappingGPU.getBufferCL() ),
- b3BufferInfoCL( m_overlappingPairs.getBufferCL() ),
- b3BufferInfoCL(m_pairCount.getBufferCL())};
- b3LauncherCL launcher(m_queue, m_sap2Kernel,"m_sap2Kernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( numLargeAabbs );
- launcher.setConst( numSmallAabbs);
- launcher.setConst( axis );
- launcher.setConst( maxPairs );
-//@todo: use actual maximum work item sizes of the device instead of hardcoded values
- launcher.launch2D( numLargeAabbs, numSmallAabbs,4,64);
-
- numPairs = m_pairCount.at(0);
- if (numPairs >maxPairs)
- {
- b3Error("Error running out of pairs: numPairs = %d, maxPairs = %d.\n", numPairs, maxPairs);
- numPairs =maxPairs;
- }
+ b3Error("Error running out of pairs: numPairs = %d, maxPairs = %d.\n", numPairs, maxPairs);
+ numPairs = maxPairs;
}
}
- if (m_gpuSmallSortedAabbs.size())
- {
- B3_PROFILE("sapKernel");
- b3BufferInfoCL bInfo[] = { b3BufferInfoCL( m_gpuSmallSortedAabbs.getBufferCL() ), b3BufferInfoCL( m_overlappingPairs.getBufferCL() ), b3BufferInfoCL(m_pairCount.getBufferCL())};
- b3LauncherCL launcher(m_queue, m_sapKernel,"m_sapKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( numSmallAabbs );
- launcher.setConst( axis );
- launcher.setConst( maxPairs );
-
-
- int num = numSmallAabbs;
+ }
+ if (m_gpuSmallSortedAabbs.size())
+ {
+ B3_PROFILE("sapKernel");
+ b3BufferInfoCL bInfo[] = {b3BufferInfoCL(m_gpuSmallSortedAabbs.getBufferCL()), b3BufferInfoCL(m_overlappingPairs.getBufferCL()), b3BufferInfoCL(m_pairCount.getBufferCL())};
+ b3LauncherCL launcher(m_queue, m_sapKernel, "m_sapKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(numSmallAabbs);
+ launcher.setConst(axis);
+ launcher.setConst(maxPairs);
+
+ int num = numSmallAabbs;
#if 0
int buffSize = launcher.getSerializationBufferSize();
unsigned char* buf = new unsigned char[buffSize+sizeof(int)];
@@ -1225,73 +1163,71 @@ void b3GpuSapBroadphase::calculateOverlappingPairs(int maxPairs)
FILE* f = fopen("m_sapKernelArgs.bin","wb");
fwrite(buf,buffSize+sizeof(int),1,f);
fclose(f);
-#endif//
+#endif //
- launcher.launch1D( num);
- clFinish(m_queue);
-
- numPairs = m_pairCount.at(0);
- if (numPairs>maxPairs)
- {
- b3Error("Error running out of pairs: numPairs = %d, maxPairs = %d.\n", numPairs, maxPairs);
- numPairs = maxPairs;
- m_pairCount.resize(0);
- m_pairCount.push_back(maxPairs);
- }
+ launcher.launch1D(num);
+ clFinish(m_queue);
+
+ numPairs = m_pairCount.at(0);
+ if (numPairs > maxPairs)
+ {
+ b3Error("Error running out of pairs: numPairs = %d, maxPairs = %d.\n", numPairs, maxPairs);
+ numPairs = maxPairs;
+ m_pairCount.resize(0);
+ m_pairCount.push_back(maxPairs);
}
-
+ }
+
#else
- int numPairs = 0;
-
-
- b3LauncherCL launcher(m_queue, m_sapKernel);
-
- const char* fileName = "m_sapKernelArgs.bin";
- FILE* f = fopen(fileName,"rb");
- if (f)
- {
- int sizeInBytes=0;
- if (fseek(f, 0, SEEK_END) || (sizeInBytes = ftell(f)) == EOF || fseek(f, 0, SEEK_SET))
- {
- printf("error, cannot get file size\n");
- exit(0);
- }
-
- unsigned char* buf = (unsigned char*) malloc(sizeInBytes);
- fread(buf,sizeInBytes,1,f);
- int serializedBytes = launcher.deserializeArgs(buf, sizeInBytes,m_context);
- int num = *(int*)&buf[serializedBytes];
- launcher.launch1D( num);
-
- b3OpenCLArray<int> pairCount(m_context, m_queue);
- int numElements = launcher.m_arrays[2]->size()/sizeof(int);
- pairCount.setFromOpenCLBuffer(launcher.m_arrays[2]->getBufferCL(),numElements);
- numPairs = pairCount.at(0);
- //printf("overlapping pairs = %d\n",numPairs);
- b3AlignedObjectArray<b3Int4> hostOoverlappingPairs;
- b3OpenCLArray<b3Int4> tmpGpuPairs(m_context,m_queue);
- tmpGpuPairs.setFromOpenCLBuffer(launcher.m_arrays[1]->getBufferCL(),numPairs );
-
- tmpGpuPairs.copyToHost(hostOoverlappingPairs);
- m_overlappingPairs.copyFromHost(hostOoverlappingPairs);
- //printf("hello %d\n", m_overlappingPairs.size());
- free(buf);
- fclose(f);
-
- } else {
- printf("error: cannot find file %s\n",fileName);
- }
-
- clFinish(m_queue);
-
-
+ int numPairs = 0;
+
+ b3LauncherCL launcher(m_queue, m_sapKernel);
+
+ const char* fileName = "m_sapKernelArgs.bin";
+ FILE* f = fopen(fileName, "rb");
+ if (f)
+ {
+ int sizeInBytes = 0;
+ if (fseek(f, 0, SEEK_END) || (sizeInBytes = ftell(f)) == EOF || fseek(f, 0, SEEK_SET))
+ {
+ printf("error, cannot get file size\n");
+ exit(0);
+ }
+
+ unsigned char* buf = (unsigned char*)malloc(sizeInBytes);
+ fread(buf, sizeInBytes, 1, f);
+ int serializedBytes = launcher.deserializeArgs(buf, sizeInBytes, m_context);
+ int num = *(int*)&buf[serializedBytes];
+ launcher.launch1D(num);
+
+ b3OpenCLArray<int> pairCount(m_context, m_queue);
+ int numElements = launcher.m_arrays[2]->size() / sizeof(int);
+ pairCount.setFromOpenCLBuffer(launcher.m_arrays[2]->getBufferCL(), numElements);
+ numPairs = pairCount.at(0);
+ //printf("overlapping pairs = %d\n",numPairs);
+ b3AlignedObjectArray<b3Int4> hostOoverlappingPairs;
+ b3OpenCLArray<b3Int4> tmpGpuPairs(m_context, m_queue);
+ tmpGpuPairs.setFromOpenCLBuffer(launcher.m_arrays[1]->getBufferCL(), numPairs);
+
+ tmpGpuPairs.copyToHost(hostOoverlappingPairs);
+ m_overlappingPairs.copyFromHost(hostOoverlappingPairs);
+ //printf("hello %d\n", m_overlappingPairs.size());
+ free(buf);
+ fclose(f);
+ }
+ else
+ {
+ printf("error: cannot find file %s\n", fileName);
+ }
+
+ clFinish(m_queue);
+
#endif
-
- m_overlappingPairs.resize(numPairs);
-
- }//B3_PROFILE("GPU_RADIX SORT");
- //init3dSap();
+ m_overlappingPairs.resize(numPairs);
+
+ } //B3_PROFILE("GPU_RADIX SORT");
+ //init3dSap();
}
void b3GpuSapBroadphase::writeAabbsToGpu()
@@ -1299,17 +1235,14 @@ void b3GpuSapBroadphase::writeAabbsToGpu()
m_smallAabbsMappingGPU.copyFromHost(m_smallAabbsMappingCPU);
m_largeAabbsMappingGPU.copyFromHost(m_largeAabbsMappingCPU);
- m_allAabbsGPU.copyFromHost(m_allAabbsCPU);//might not be necessary, the 'setupGpuAabbsFull' already takes care of this
-
-
-
+ m_allAabbsGPU.copyFromHost(m_allAabbsCPU); //might not be necessary, the 'setupGpuAabbsFull' already takes care of this
}
-void b3GpuSapBroadphase::createLargeProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int userPtr , int collisionFilterGroup, int collisionFilterMask)
+void b3GpuSapBroadphase::createLargeProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int userPtr, int collisionFilterGroup, int collisionFilterMask)
{
int index = userPtr;
b3SapAabb aabb;
- for (int i=0;i<4;i++)
+ for (int i = 0; i < 4; i++)
{
aabb.m_min[i] = aabbMin[i];
aabb.m_max[i] = aabbMax[i];
@@ -1317,15 +1250,15 @@ void b3GpuSapBroadphase::createLargeProxy(const b3Vector3& aabbMin, const b3Vec
aabb.m_minIndices[3] = index;
aabb.m_signedMaxIndices[3] = m_allAabbsCPU.size();
m_largeAabbsMappingCPU.push_back(m_allAabbsCPU.size());
-
+
m_allAabbsCPU.push_back(aabb);
}
-void b3GpuSapBroadphase::createProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int userPtr , int collisionFilterGroup, int collisionFilterMask)
+void b3GpuSapBroadphase::createProxy(const b3Vector3& aabbMin, const b3Vector3& aabbMax, int userPtr, int collisionFilterGroup, int collisionFilterMask)
{
int index = userPtr;
b3SapAabb aabb;
- for (int i=0;i<4;i++)
+ for (int i = 0; i < 4; i++)
{
aabb.m_min[i] = aabbMin[i];
aabb.m_max[i] = aabbMax[i];
@@ -1334,20 +1267,19 @@ void b3GpuSapBroadphase::createProxy(const b3Vector3& aabbMin, const b3Vector3&
aabb.m_signedMaxIndices[3] = m_allAabbsCPU.size();
m_smallAabbsMappingCPU.push_back(m_allAabbsCPU.size());
-
m_allAabbsCPU.push_back(aabb);
}
-cl_mem b3GpuSapBroadphase::getAabbBufferWS()
+cl_mem b3GpuSapBroadphase::getAabbBufferWS()
{
return m_allAabbsGPU.getBufferCL();
}
-int b3GpuSapBroadphase::getNumOverlap()
+int b3GpuSapBroadphase::getNumOverlap()
{
return m_overlappingPairs.size();
}
-cl_mem b3GpuSapBroadphase::getOverlappingPairBuffer()
+cl_mem b3GpuSapBroadphase::getOverlappingPairBuffer()
{
return m_overlappingPairs.getBufferCL();
}
diff --git a/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.h b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.h
index 8d36ac78f2..d17590b14a 100644
--- a/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.h
+++ b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3GpuSapBroadphase.h
@@ -2,7 +2,7 @@
#define B3_GPU_SAP_BROADPHASE_H
#include "Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h"
-#include "Bullet3OpenCL/ParallelPrimitives/b3FillCL.h" //b3Int2
+#include "Bullet3OpenCL/ParallelPrimitives/b3FillCL.h" //b3Int2
class b3Vector3;
#include "Bullet3OpenCL/ParallelPrimitives/b3RadixSort32CL.h"
@@ -11,141 +11,133 @@ class b3Vector3;
#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;
-
+ 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<b3SortData> m_sortedAxisCPU[3][2];
- b3AlignedObjectArray<b3UnsignedInt2> m_objectMinMaxIndexCPU[3][2];
- b3OpenCLArray<b3UnsignedInt2> m_objectMinMaxIndexGPUaxis0;
- b3OpenCLArray<b3UnsignedInt2> m_objectMinMaxIndexGPUaxis1;
- b3OpenCLArray<b3UnsignedInt2> m_objectMinMaxIndexGPUaxis2;
- b3OpenCLArray<b3UnsignedInt2> m_objectMinMaxIndexGPUaxis0prev;
- b3OpenCLArray<b3UnsignedInt2> m_objectMinMaxIndexGPUaxis1prev;
- b3OpenCLArray<b3UnsignedInt2> m_objectMinMaxIndexGPUaxis2prev;
-
- b3OpenCLArray<b3SortData> m_sortedAxisGPU0;
- b3OpenCLArray<b3SortData> m_sortedAxisGPU1;
- b3OpenCLArray<b3SortData> m_sortedAxisGPU2;
- b3OpenCLArray<b3SortData> m_sortedAxisGPU0prev;
- b3OpenCLArray<b3SortData> m_sortedAxisGPU1prev;
- b3OpenCLArray<b3SortData> m_sortedAxisGPU2prev;
-
-
- b3OpenCLArray<b3Int4> m_addedHostPairsGPU;
- b3OpenCLArray<b3Int4> m_removedHostPairsGPU;
- b3OpenCLArray<int> m_addedCountGPU;
- b3OpenCLArray<int> m_removedCountGPU;
-
- int m_currentBuffer;
+ b3AlignedObjectArray<b3SortData> m_sortedAxisCPU[3][2];
+ b3AlignedObjectArray<b3UnsignedInt2> m_objectMinMaxIndexCPU[3][2];
+ b3OpenCLArray<b3UnsignedInt2> m_objectMinMaxIndexGPUaxis0;
+ b3OpenCLArray<b3UnsignedInt2> m_objectMinMaxIndexGPUaxis1;
+ b3OpenCLArray<b3UnsignedInt2> m_objectMinMaxIndexGPUaxis2;
+ b3OpenCLArray<b3UnsignedInt2> m_objectMinMaxIndexGPUaxis0prev;
+ b3OpenCLArray<b3UnsignedInt2> m_objectMinMaxIndexGPUaxis1prev;
+ b3OpenCLArray<b3UnsignedInt2> m_objectMinMaxIndexGPUaxis2prev;
+
+ b3OpenCLArray<b3SortData> m_sortedAxisGPU0;
+ b3OpenCLArray<b3SortData> m_sortedAxisGPU1;
+ b3OpenCLArray<b3SortData> m_sortedAxisGPU2;
+ b3OpenCLArray<b3SortData> m_sortedAxisGPU0prev;
+ b3OpenCLArray<b3SortData> m_sortedAxisGPU1prev;
+ b3OpenCLArray<b3SortData> m_sortedAxisGPU2prev;
+
+ b3OpenCLArray<b3Int4> m_addedHostPairsGPU;
+ b3OpenCLArray<b3Int4> m_removedHostPairsGPU;
+ b3OpenCLArray<int> m_addedCountGPU;
+ b3OpenCLArray<int> m_removedCountGPU;
+
+ int m_currentBuffer;
public:
-
b3OpenCLArray<int> m_pairCount;
+ b3OpenCLArray<b3SapAabb> m_allAabbsGPU;
+ b3AlignedObjectArray<b3SapAabb> m_allAabbsCPU;
- b3OpenCLArray<b3SapAabb> m_allAabbsGPU;
- b3AlignedObjectArray<b3SapAabb> m_allAabbsCPU;
-
- virtual b3OpenCLArray<b3SapAabb>& getAllAabbsGPU()
+ virtual b3OpenCLArray<b3SapAabb>& getAllAabbsGPU()
{
return m_allAabbsGPU;
}
- virtual b3AlignedObjectArray<b3SapAabb>& getAllAabbsCPU()
+ virtual b3AlignedObjectArray<b3SapAabb>& getAllAabbsCPU()
{
return m_allAabbsCPU;
}
- b3OpenCLArray<b3Vector3> m_sum;
- b3OpenCLArray<b3Vector3> m_sum2;
- b3OpenCLArray<b3Vector3> m_dst;
+ b3OpenCLArray<b3Vector3> m_sum;
+ b3OpenCLArray<b3Vector3> m_sum2;
+ b3OpenCLArray<b3Vector3> m_dst;
- b3OpenCLArray<int> m_smallAabbsMappingGPU;
+ b3OpenCLArray<int> m_smallAabbsMappingGPU;
b3AlignedObjectArray<int> m_smallAabbsMappingCPU;
- b3OpenCLArray<int> m_largeAabbsMappingGPU;
+ b3OpenCLArray<int> m_largeAabbsMappingGPU;
b3AlignedObjectArray<int> m_largeAabbsMappingCPU;
-
- b3OpenCLArray<b3Int4> m_overlappingPairs;
+ b3OpenCLArray<b3Int4> m_overlappingPairs;
//temporary gpu work memory
- b3OpenCLArray<b3SortData> m_gpuSmallSortData;
- b3OpenCLArray<b3SapAabb> m_gpuSmallSortedAabbs;
+ b3OpenCLArray<b3SortData> m_gpuSmallSortData;
+ b3OpenCLArray<b3SapAabb> m_gpuSmallSortedAabbs;
- class b3PrefixScanFloat4CL* m_prefixScanFloat4;
+ class b3PrefixScanFloat4CL* m_prefixScanFloat4;
enum b3GpuSapKernelType
{
- B3_GPU_SAP_KERNEL_BRUTE_FORCE_CPU=1,
+ 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);
+ 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)
+
+ 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);
+ 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)
+ 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);
+ 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)
+ 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);
+ 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)
+ 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);
+ 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)
+ 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);
+ 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();
+ 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);
+ 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 cl_mem getAabbBufferWS();
+ virtual int getNumOverlap();
+ virtual cl_mem getOverlappingPairBuffer();
+
virtual b3OpenCLArray<b3Int4>& getOverlappingPairsGPU();
virtual b3OpenCLArray<int>& getSmallAabbIndicesGPU();
virtual b3OpenCLArray<int>& getLargeAabbIndicesGPU();
};
-#endif //B3_GPU_SAP_BROADPHASE_H \ No newline at end of file
+#endif //B3_GPU_SAP_BROADPHASE_H \ No newline at end of file
diff --git a/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3SapAabb.h b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3SapAabb.h
index ea6550fede..60570f2605 100644
--- a/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3SapAabb.h
+++ b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/b3SapAabb.h
@@ -5,10 +5,9 @@
#include "Bullet3Collision/BroadPhaseCollision/shared/b3Aabb.h"
///just make sure that the b3Aabb is 16-byte aligned
-B3_ATTRIBUTE_ALIGNED16(struct) b3SapAabb : public b3Aabb
-{
+B3_ATTRIBUTE_ALIGNED16(struct)
+b3SapAabb : public b3Aabb{
-};
+ };
-
-#endif //B3_SAP_AABB_H
+#endif //B3_SAP_AABB_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/gridBroadphaseKernels.h b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/gridBroadphaseKernels.h
index dad42477c3..0185417786 100644
--- a/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/gridBroadphaseKernels.h
+++ b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/gridBroadphaseKernels.h
@@ -1,199 +1,198 @@
//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<handleIndex2)\n"
-" {\n"
-" int curPair = atomic_add(pairCount,1);\n"
-" if (curPair<maxPairs)\n"
-" {\n"
-" int4 newpair;\n"
-" newpair.x = handleIndex;\n"
-" newpair.y = handleIndex2;\n"
-" newpair.z = -1;\n"
-" newpair.w = -1;\n"
-" pPairBuff2[curPair] = newpair;\n"
-" }\n"
-" }\n"
-" \n"
-" }\n"
-" }\n"
-" }\n"
-" }\n"
-"}\n"
-"__kernel void kFindOverlappingPairs( int numObjects,\n"
-" __global float4* allpAABB, \n"
-" __global const int* smallAabbMapping,\n"
-" __global int2* pHash, \n"
-" __global int* pCellStart, \n"
-" __global float4* pParams ,\n"
-" volatile __global int* pairCount,\n"
-" __global int4* pPairBuff2,\n"
-" int maxPairs\n"
-" )\n"
-"{\n"
-" int index = get_global_id(0);\n"
-" if(index >= 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"
-;
+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<handleIndex2)\n"
+ " {\n"
+ " int curPair = atomic_add(pairCount,1);\n"
+ " if (curPair<maxPairs)\n"
+ " {\n"
+ " int4 newpair;\n"
+ " newpair.x = handleIndex;\n"
+ " newpair.y = handleIndex2;\n"
+ " newpair.z = -1;\n"
+ " newpair.w = -1;\n"
+ " pPairBuff2[curPair] = newpair;\n"
+ " }\n"
+ " }\n"
+ " \n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ "}\n"
+ "__kernel void kFindOverlappingPairs( int numObjects,\n"
+ " __global float4* allpAABB, \n"
+ " __global const int* smallAabbMapping,\n"
+ " __global int2* pHash, \n"
+ " __global int* pCellStart, \n"
+ " __global float4* pParams ,\n"
+ " volatile __global int* pairCount,\n"
+ " __global int4* pPairBuff2,\n"
+ " int maxPairs\n"
+ " )\n"
+ "{\n"
+ " int index = get_global_id(0);\n"
+ " if(index >= 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/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/parallelLinearBvhKernels.h b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/parallelLinearBvhKernels.h
index 5eb8f45b16..c02877dde9 100644
--- a/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/parallelLinearBvhKernels.h
+++ b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/parallelLinearBvhKernels.h
@@ -1,729 +1,728 @@
//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"
-;
+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/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/sapKernels.h b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/sapKernels.h
index 04d40fcf26..d6999b94cb 100644
--- a/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/sapKernels.h
+++ b/thirdparty/bullet/Bullet3OpenCL/BroadphaseCollision/kernels/sapKernels.h
@@ -1,342 +1,341 @@
//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<maxPairs)\n"
-" {\n"
-" pairsOut[curPair] = myPair; //flush to main memory\n"
-" }\n"
-" }\n"
-"}\n"
-"__kernel void computePairsKernelBruteForce( __global const btAabbCL* aabbs, volatile __global int4* pairsOut,volatile __global int* pairCount, int numObjects, int axis, int maxPairs)\n"
-"{\n"
-" int i = get_global_id(0);\n"
-" if (i>=numObjects)\n"
-" return;\n"
-" for (int j=i+1;j<numObjects;j++)\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<maxPairs)\n"
-" {\n"
-" pairsOut[curPair] = myPair; //flush to main memory\n"
-" }\n"
-" }\n"
-" }\n"
-"}\n"
-"__kernel void computePairsKernelOriginal( __global const btAabbCL* aabbs, volatile __global int4* pairsOut,volatile __global int* pairCount, int numObjects, int axis, int maxPairs)\n"
-"{\n"
-" int i = get_global_id(0);\n"
-" if (i>=numObjects)\n"
-" return;\n"
-" for (int j=i+1;j<numObjects;j++)\n"
-" {\n"
-" if(aabbs[i].m_maxElems[axis] < (aabbs[j].m_minElems[axis])) \n"
-" {\n"
-" break;\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<maxPairs)\n"
-" {\n"
-" pairsOut[curPair] = myPair; //flush to main memory\n"
-" }\n"
-" }\n"
-" }\n"
-"}\n"
-"__kernel void computePairsKernelBarrier( __global const btAabbCL* aabbs, volatile __global int4* pairsOut,volatile __global int* pairCount, int numObjects, int axis, int maxPairs)\n"
-"{\n"
-" int i = get_global_id(0);\n"
-" int localId = get_local_id(0);\n"
-" __local int numActiveWgItems[1];\n"
-" __local int breakRequest[1];\n"
-" if (localId==0)\n"
-" {\n"
-" numActiveWgItems[0] = 0;\n"
-" breakRequest[0] = 0;\n"
-" }\n"
-" barrier(CLK_LOCAL_MEM_FENCE);\n"
-" atomic_inc(numActiveWgItems);\n"
-" barrier(CLK_LOCAL_MEM_FENCE);\n"
-" int localBreak = 0;\n"
-" int j=i+1;\n"
-" do\n"
-" {\n"
-" barrier(CLK_LOCAL_MEM_FENCE);\n"
-" \n"
-" if (j<numObjects)\n"
-" {\n"
-" if(aabbs[i].m_maxElems[axis] < (aabbs[j].m_minElems[axis])) \n"
-" {\n"
-" if (!localBreak)\n"
-" {\n"
-" atomic_inc(breakRequest);\n"
-" localBreak = 1;\n"
-" }\n"
-" }\n"
-" }\n"
-" \n"
-" barrier(CLK_LOCAL_MEM_FENCE);\n"
-" \n"
-" if (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<maxPairs)\n"
-" {\n"
-" pairsOut[curPair] = myPair; //flush to main memory\n"
-" }\n"
-" }\n"
-" }\n"
-" j++;\n"
-" } while (breakRequest[0]<numActiveWgItems[0]);\n"
-"}\n"
-"__kernel void computePairsKernelLocalSharedMemory( __global const btAabbCL* aabbs, volatile __global int4* pairsOut,volatile __global int* pairCount, int numObjects, int axis, int maxPairs)\n"
-"{\n"
-" int i = get_global_id(0);\n"
-" int localId = get_local_id(0);\n"
-" __local int numActiveWgItems[1];\n"
-" __local int breakRequest[1];\n"
-" __local btAabbCL localAabbs[128];// = aabbs[i];\n"
-" \n"
-" btAabbCL myAabb;\n"
-" \n"
-" myAabb = (i<numObjects)? aabbs[i]:aabbs[0];\n"
-" float testValue = myAabb.m_maxElems[axis];\n"
-" \n"
-" if (localId==0)\n"
-" {\n"
-" numActiveWgItems[0] = 0;\n"
-" breakRequest[0] = 0;\n"
-" }\n"
-" int localCount=0;\n"
-" int block=0;\n"
-" localAabbs[localId] = (i+block)<numObjects? aabbs[i+block] : aabbs[0];\n"
-" localAabbs[localId+64] = (i+block+64)<numObjects? aabbs[i+block+64]: aabbs[0];\n"
-" \n"
-" barrier(CLK_LOCAL_MEM_FENCE);\n"
-" atomic_inc(numActiveWgItems);\n"
-" barrier(CLK_LOCAL_MEM_FENCE);\n"
-" int localBreak = 0;\n"
-" \n"
-" int j=i+1;\n"
-" do\n"
-" {\n"
-" barrier(CLK_LOCAL_MEM_FENCE);\n"
-" \n"
-" if (j<numObjects)\n"
-" {\n"
-" if(testValue < (localAabbs[localCount+localId+1].m_minElems[axis])) \n"
-" {\n"
-" if (!localBreak)\n"
-" {\n"
-" atomic_inc(breakRequest);\n"
-" localBreak = 1;\n"
-" }\n"
-" }\n"
-" }\n"
-" \n"
-" barrier(CLK_LOCAL_MEM_FENCE);\n"
-" \n"
-" if (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 (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<maxPairs)\n"
-" {\n"
-" pairsOut[curPair] = myPair; //flush to main memory\n"
-" }\n"
-" }\n"
-" }\n"
-" \n"
-" barrier(CLK_LOCAL_MEM_FENCE);\n"
-" localCount++;\n"
-" if (localCount==64)\n"
-" {\n"
-" localCount = 0;\n"
-" block+=64; \n"
-" localAabbs[localId] = ((i+block)<numObjects) ? aabbs[i+block] : aabbs[0];\n"
-" localAabbs[localId+64] = ((i+64+block)<numObjects) ? aabbs[i+block+64] : aabbs[0];\n"
-" }\n"
-" j++;\n"
-" \n"
-" } while (breakRequest[0]<numActiveWgItems[0]);\n"
-" \n"
-"}\n"
-"//http://stereopsis.com/radix.html\n"
-"unsigned int FloatFlip(float fl);\n"
-"unsigned int FloatFlip(float fl)\n"
-"{\n"
-" unsigned int f = *(unsigned int*)&fl;\n"
-" unsigned int mask = -(int)(f >> 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"
-;
+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<maxPairs)\n"
+ " {\n"
+ " pairsOut[curPair] = myPair; //flush to main memory\n"
+ " }\n"
+ " }\n"
+ "}\n"
+ "__kernel void computePairsKernelBruteForce( __global const btAabbCL* aabbs, volatile __global int4* pairsOut,volatile __global int* pairCount, int numObjects, int axis, int maxPairs)\n"
+ "{\n"
+ " int i = get_global_id(0);\n"
+ " if (i>=numObjects)\n"
+ " return;\n"
+ " for (int j=i+1;j<numObjects;j++)\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<maxPairs)\n"
+ " {\n"
+ " pairsOut[curPair] = myPair; //flush to main memory\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ "}\n"
+ "__kernel void computePairsKernelOriginal( __global const btAabbCL* aabbs, volatile __global int4* pairsOut,volatile __global int* pairCount, int numObjects, int axis, int maxPairs)\n"
+ "{\n"
+ " int i = get_global_id(0);\n"
+ " if (i>=numObjects)\n"
+ " return;\n"
+ " for (int j=i+1;j<numObjects;j++)\n"
+ " {\n"
+ " if(aabbs[i].m_maxElems[axis] < (aabbs[j].m_minElems[axis])) \n"
+ " {\n"
+ " break;\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<maxPairs)\n"
+ " {\n"
+ " pairsOut[curPair] = myPair; //flush to main memory\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ "}\n"
+ "__kernel void computePairsKernelBarrier( __global const btAabbCL* aabbs, volatile __global int4* pairsOut,volatile __global int* pairCount, int numObjects, int axis, int maxPairs)\n"
+ "{\n"
+ " int i = get_global_id(0);\n"
+ " int localId = get_local_id(0);\n"
+ " __local int numActiveWgItems[1];\n"
+ " __local int breakRequest[1];\n"
+ " if (localId==0)\n"
+ " {\n"
+ " numActiveWgItems[0] = 0;\n"
+ " breakRequest[0] = 0;\n"
+ " }\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " atomic_inc(numActiveWgItems);\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " int localBreak = 0;\n"
+ " int j=i+1;\n"
+ " do\n"
+ " {\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " \n"
+ " if (j<numObjects)\n"
+ " {\n"
+ " if(aabbs[i].m_maxElems[axis] < (aabbs[j].m_minElems[axis])) \n"
+ " {\n"
+ " if (!localBreak)\n"
+ " {\n"
+ " atomic_inc(breakRequest);\n"
+ " localBreak = 1;\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " \n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " \n"
+ " if (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<maxPairs)\n"
+ " {\n"
+ " pairsOut[curPair] = myPair; //flush to main memory\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " j++;\n"
+ " } while (breakRequest[0]<numActiveWgItems[0]);\n"
+ "}\n"
+ "__kernel void computePairsKernelLocalSharedMemory( __global const btAabbCL* aabbs, volatile __global int4* pairsOut,volatile __global int* pairCount, int numObjects, int axis, int maxPairs)\n"
+ "{\n"
+ " int i = get_global_id(0);\n"
+ " int localId = get_local_id(0);\n"
+ " __local int numActiveWgItems[1];\n"
+ " __local int breakRequest[1];\n"
+ " __local btAabbCL localAabbs[128];// = aabbs[i];\n"
+ " \n"
+ " btAabbCL myAabb;\n"
+ " \n"
+ " myAabb = (i<numObjects)? aabbs[i]:aabbs[0];\n"
+ " float testValue = myAabb.m_maxElems[axis];\n"
+ " \n"
+ " if (localId==0)\n"
+ " {\n"
+ " numActiveWgItems[0] = 0;\n"
+ " breakRequest[0] = 0;\n"
+ " }\n"
+ " int localCount=0;\n"
+ " int block=0;\n"
+ " localAabbs[localId] = (i+block)<numObjects? aabbs[i+block] : aabbs[0];\n"
+ " localAabbs[localId+64] = (i+block+64)<numObjects? aabbs[i+block+64]: aabbs[0];\n"
+ " \n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " atomic_inc(numActiveWgItems);\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " int localBreak = 0;\n"
+ " \n"
+ " int j=i+1;\n"
+ " do\n"
+ " {\n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " \n"
+ " if (j<numObjects)\n"
+ " {\n"
+ " if(testValue < (localAabbs[localCount+localId+1].m_minElems[axis])) \n"
+ " {\n"
+ " if (!localBreak)\n"
+ " {\n"
+ " atomic_inc(breakRequest);\n"
+ " localBreak = 1;\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " \n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " \n"
+ " if (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 (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<maxPairs)\n"
+ " {\n"
+ " pairsOut[curPair] = myPair; //flush to main memory\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " \n"
+ " barrier(CLK_LOCAL_MEM_FENCE);\n"
+ " localCount++;\n"
+ " if (localCount==64)\n"
+ " {\n"
+ " localCount = 0;\n"
+ " block+=64; \n"
+ " localAabbs[localId] = ((i+block)<numObjects) ? aabbs[i+block] : aabbs[0];\n"
+ " localAabbs[localId+64] = ((i+64+block)<numObjects) ? aabbs[i+block+64] : aabbs[0];\n"
+ " }\n"
+ " j++;\n"
+ " \n"
+ " } while (breakRequest[0]<numActiveWgItems[0]);\n"
+ " \n"
+ "}\n"
+ "//http://stereopsis.com/radix.html\n"
+ "unsigned int FloatFlip(float fl);\n"
+ "unsigned int FloatFlip(float fl)\n"
+ "{\n"
+ " unsigned int f = *(unsigned int*)&fl;\n"
+ " unsigned int mask = -(int)(f >> 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/thirdparty/bullet/Bullet3OpenCL/Initialize/b3OpenCLInclude.h b/thirdparty/bullet/Bullet3OpenCL/Initialize/b3OpenCLInclude.h
index e79182d7cb..6146538263 100644
--- a/thirdparty/bullet/Bullet3OpenCL/Initialize/b3OpenCLInclude.h
+++ b/thirdparty/bullet/Bullet3OpenCL/Initialize/b3OpenCLInclude.h
@@ -17,7 +17,7 @@ subject to the following restrictions:
#define B3_OPENCL_INCLUDE_H
#ifdef B3_USE_CLEW
- #include "clew/clew.h"
+#include "clew/clew.h"
#else
#ifdef __APPLE__
@@ -25,7 +25,7 @@ subject to the following restrictions:
#include <MiniCL/cl.h>
#else
#include <OpenCL/cl.h>
-#include <OpenCL/cl_ext.h> //clLogMessagesToStderrAPPLE
+#include <OpenCL/cl_ext.h> //clLogMessagesToStderrAPPLE
#endif
#else
#ifdef USE_MINICL
@@ -34,15 +34,18 @@ subject to the following restrictions:
#include <CL/cl.h>
#ifdef _WIN32
#include "CL/cl_gl.h"
-#endif //_WIN32
+#endif //_WIN32
#endif
-#endif //__APPLE__
-#endif //B3_USE_CLEW
+#endif //__APPLE__
+#endif //B3_USE_CLEW
#include <assert.h>
#include <stdio.h>
-#define oclCHECKERROR(a, b) if((a)!=(b)) { printf("OCL Error : %d\n", (a)); assert((a) == (b)); }
-
-
-#endif //B3_OPENCL_INCLUDE_H
-
+#define oclCHECKERROR(a, b) \
+ if ((a) != (b)) \
+ { \
+ printf("OCL Error : %d\n", (a)); \
+ assert((a) == (b)); \
+ }
+
+#endif //B3_OPENCL_INCLUDE_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/Initialize/b3OpenCLUtils.cpp b/thirdparty/bullet/Bullet3OpenCL/Initialize/b3OpenCLUtils.cpp
index 896191c89c..fe54ea5ec9 100644
--- a/thirdparty/bullet/Bullet3OpenCL/Initialize/b3OpenCLUtils.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/Initialize/b3OpenCLUtils.cpp
@@ -16,7 +16,6 @@ subject to the following restrictions:
//Original author: Roman Ponomarev
//Mostly Reimplemented by Erwin Coumans
-
bool gDebugForceLoadingFromSource = false;
bool gDebugSkipLoadingBinary = false;
@@ -25,7 +24,7 @@ bool gDebugSkipLoadingBinary = false;
#include <string.h>
#ifdef _WIN32
-#pragma warning (disable:4996)
+#pragma warning(disable : 4996)
#endif
#include "b3OpenCLUtils.h"
//#include "b3OpenCLInclude.h"
@@ -33,7 +32,7 @@ bool gDebugSkipLoadingBinary = false;
#include <stdio.h>
#include <stdlib.h>
-#define B3_MAX_CL_DEVICES 16 //who needs 16 devices?
+#define B3_MAX_CL_DEVICES 16 //who needs 16 devices?
#ifdef _WIN32
#include <windows.h>
@@ -46,53 +45,49 @@ bool gDebugSkipLoadingBinary = false;
#endif
-static const char* sCachedBinaryPath="cache";
-
+static const char* sCachedBinaryPath = "cache";
//Set the preferred platform vendor using the OpenCL SDK
static const char* spPlatformVendor =
#if defined(CL_PLATFORM_MINI_CL)
-"MiniCL, SCEA";
+ "MiniCL, SCEA";
#elif defined(CL_PLATFORM_AMD)
-"Advanced Micro Devices, Inc.";
+ "Advanced Micro Devices, Inc.";
#elif defined(CL_PLATFORM_NVIDIA)
-"NVIDIA Corporation";
+ "NVIDIA Corporation";
#elif defined(CL_PLATFORM_INTEL)
-"Intel(R) Corporation";
+ "Intel(R) Corporation";
#elif defined(B3_USE_CLEW)
-"clew (OpenCL Extension Wrangler library)";
+ "clew (OpenCL Extension Wrangler library)";
#else
-"Unknown Vendor";
+ "Unknown Vendor";
#endif
#ifndef CL_PLATFORM_MINI_CL
#ifdef _WIN32
#ifndef B3_USE_CLEW
#include "CL/cl_gl.h"
-#endif //B3_USE_CLEW
-#endif //_WIN32
+#endif //B3_USE_CLEW
+#endif //_WIN32
#endif
-
-void MyFatalBreakAPPLE( const char * errstr ,
- const void * private_info ,
- size_t cb ,
- void * user_data )
+void MyFatalBreakAPPLE(const char* errstr,
+ const void* private_info,
+ size_t cb,
+ void* user_data)
{
-
-
- const char* patloc = strstr(errstr, "Warning");
- //find out if it is a warning or error, exit if error
+ const char* patloc = strstr(errstr, "Warning");
+ //find out if it is a warning or error, exit if error
- if (patloc)
- {
+ if (patloc)
+ {
b3Warning("Warning: %s\n", errstr);
- } else
- {
+ }
+ else
+ {
b3Error("Error: %s\n", errstr);
- b3Assert(0);
- }
-
+ b3Assert(0);
+ }
}
#ifdef B3_USE_CLEW
@@ -102,30 +97,31 @@ int b3OpenCLUtils_clewInit()
int result = -1;
#ifdef _WIN32
- const char* cl = "OpenCL.dll";
+ const char* cl = "OpenCL.dll";
#elif defined __APPLE__
- const char* cl = "/System/Library/Frameworks/OpenCL.framework/Versions/Current/OpenCL";
-#else//presumable Linux?
- //linux (tested on Ubuntu 12.10 with Catalyst 13.4 beta drivers, not that there is no symbolic link from libOpenCL.so
- const char* cl = "libOpenCL.so.1";
- result = clewInit(cl);
- if (result != CLEW_SUCCESS)
- {
- cl = "libOpenCL.so";
- } else
- {
- clewExit();
- }
+ const char* cl = "/System/Library/Frameworks/OpenCL.framework/Versions/Current/OpenCL";
+#else //presumable Linux? \
+ //linux (tested on Ubuntu 12.10 with Catalyst 13.4 beta drivers, not that there is no symbolic link from libOpenCL.so
+ const char* cl = "libOpenCL.so.1";
+ result = clewInit(cl);
+ if (result != CLEW_SUCCESS)
+ {
+ cl = "libOpenCL.so";
+ }
+ else
+ {
+ clewExit();
+ }
#endif
- result = clewInit(cl);
- if (result!=CLEW_SUCCESS)
- {
- b3Error("clewInit failed with error code %d\n",result);
- }
- else
- {
- b3Printf("clewInit succesfull using %s\n",cl);
- }
+ result = clewInit(cl);
+ if (result != CLEW_SUCCESS)
+ {
+ b3Error("clewInit failed with error code %d\n", result);
+ }
+ else
+ {
+ b3Printf("clewInit succesfull using %s\n", cl);
+ }
return result;
}
#endif
@@ -136,19 +132,18 @@ int b3OpenCLUtils_getNumPlatforms(cl_int* pErrNum)
b3OpenCLUtils_clewInit();
#endif
- cl_platform_id pPlatforms[10] = { 0 };
+ cl_platform_id pPlatforms[10] = {0};
- cl_uint numPlatforms = 0;
- cl_int ciErrNum = clGetPlatformIDs(10, pPlatforms, &numPlatforms);
+ cl_uint numPlatforms = 0;
+ cl_int ciErrNum = clGetPlatformIDs(10, pPlatforms, &numPlatforms);
//cl_int ciErrNum = clGetPlatformIDs(0, NULL, &numPlatforms);
- if(ciErrNum != CL_SUCCESS)
+ if (ciErrNum != CL_SUCCESS)
{
- if(pErrNum != NULL)
+ if (pErrNum != NULL)
*pErrNum = ciErrNum;
}
return numPlatforms;
-
}
const char* b3OpenCLUtils_getSdkVendorName()
@@ -164,28 +159,28 @@ void b3OpenCLUtils_setCachePath(const char* path)
cl_platform_id b3OpenCLUtils_getPlatform(int platformIndex0, cl_int* pErrNum)
{
#ifdef B3_USE_CLEW
- b3OpenCLUtils_clewInit();
+ b3OpenCLUtils_clewInit();
#endif
cl_platform_id platform = 0;
- unsigned int platformIndex = (unsigned int )platformIndex0;
+ unsigned int platformIndex = (unsigned int)platformIndex0;
cl_uint numPlatforms;
cl_int ciErrNum = clGetPlatformIDs(0, NULL, &numPlatforms);
- if (platformIndex<numPlatforms)
+ if (platformIndex < numPlatforms)
{
- cl_platform_id* platforms = (cl_platform_id*) malloc (sizeof(cl_platform_id)*numPlatforms);
+ cl_platform_id* platforms = (cl_platform_id*)malloc(sizeof(cl_platform_id) * numPlatforms);
ciErrNum = clGetPlatformIDs(numPlatforms, platforms, NULL);
- if(ciErrNum != CL_SUCCESS)
+ if (ciErrNum != CL_SUCCESS)
{
- if(pErrNum != NULL)
+ if (pErrNum != NULL)
*pErrNum = ciErrNum;
return platform;
}
platform = platforms[platformIndex];
- free (platforms);
+ free(platforms);
}
return platform;
@@ -195,30 +190,28 @@ void b3OpenCLUtils::getPlatformInfo(cl_platform_id platform, b3OpenCLPlatformInf
{
b3Assert(platform);
cl_int ciErrNum;
- ciErrNum = clGetPlatformInfo( platform,CL_PLATFORM_VENDOR,B3_MAX_STRING_LENGTH,platformInfo->m_platformVendor,NULL);
- oclCHECKERROR(ciErrNum,CL_SUCCESS);
- ciErrNum = clGetPlatformInfo( platform,CL_PLATFORM_NAME,B3_MAX_STRING_LENGTH,platformInfo->m_platformName,NULL);
- oclCHECKERROR(ciErrNum,CL_SUCCESS);
- ciErrNum = clGetPlatformInfo( platform,CL_PLATFORM_VERSION,B3_MAX_STRING_LENGTH,platformInfo->m_platformVersion,NULL);
- oclCHECKERROR(ciErrNum,CL_SUCCESS);
+ ciErrNum = clGetPlatformInfo(platform, CL_PLATFORM_VENDOR, B3_MAX_STRING_LENGTH, platformInfo->m_platformVendor, NULL);
+ oclCHECKERROR(ciErrNum, CL_SUCCESS);
+ ciErrNum = clGetPlatformInfo(platform, CL_PLATFORM_NAME, B3_MAX_STRING_LENGTH, platformInfo->m_platformName, NULL);
+ oclCHECKERROR(ciErrNum, CL_SUCCESS);
+ ciErrNum = clGetPlatformInfo(platform, CL_PLATFORM_VERSION, B3_MAX_STRING_LENGTH, platformInfo->m_platformVersion, NULL);
+ oclCHECKERROR(ciErrNum, CL_SUCCESS);
}
-void b3OpenCLUtils_printPlatformInfo( cl_platform_id platform)
+void b3OpenCLUtils_printPlatformInfo(cl_platform_id platform)
{
b3OpenCLPlatformInfo platformInfo;
- b3OpenCLUtils::getPlatformInfo (platform, &platformInfo);
+ b3OpenCLUtils::getPlatformInfo(platform, &platformInfo);
b3Printf("Platform info:\n");
- b3Printf(" CL_PLATFORM_VENDOR: \t\t\t%s\n",platformInfo.m_platformVendor);
- b3Printf(" CL_PLATFORM_NAME: \t\t\t%s\n",platformInfo.m_platformName);
- b3Printf(" CL_PLATFORM_VERSION: \t\t\t%s\n",platformInfo.m_platformVersion);
+ b3Printf(" CL_PLATFORM_VENDOR: \t\t\t%s\n", platformInfo.m_platformVendor);
+ b3Printf(" CL_PLATFORM_NAME: \t\t\t%s\n", platformInfo.m_platformName);
+ b3Printf(" CL_PLATFORM_VERSION: \t\t\t%s\n", platformInfo.m_platformVersion);
}
-
-
cl_context b3OpenCLUtils_createContextFromPlatform(cl_platform_id platform, cl_device_type deviceType, cl_int* pErrNum, void* pGLContext, void* pGLDC, int preferredDeviceIndex, int preferredPlatformIndex)
{
cl_context retContext = 0;
- cl_int ciErrNum=0;
+ cl_int ciErrNum = 0;
cl_uint num_entries;
cl_device_id devices[B3_MAX_CL_DEVICES];
cl_uint num_devices;
@@ -228,7 +221,7 @@ cl_context b3OpenCLUtils_createContextFromPlatform(cl_platform_id platform, cl_d
* If we could find our platform, use it. Otherwise pass a NULL and get whatever the
* implementation thinks we should be using.
*/
- cl_context_properties cps[7] = {0,0,0,0,0,0,0};
+ cl_context_properties cps[7] = {0, 0, 0, 0, 0, 0, 0};
cps[0] = CL_CONTEXT_PLATFORM;
cps[1] = (cl_context_properties)platform;
#ifdef _WIN32
@@ -240,25 +233,24 @@ cl_context b3OpenCLUtils_createContextFromPlatform(cl_platform_id platform, cl_d
cps[4] = CL_WGL_HDC_KHR;
cps[5] = (cl_context_properties)pGLDC;
}
-#endif //B3_USE_CLEW
-#endif //_WIN32
+#endif //B3_USE_CLEW
+#endif //_WIN32
num_entries = B3_MAX_CL_DEVICES;
-
- num_devices=-1;
+ num_devices = -1;
ciErrNum = clGetDeviceIDs(
platform,
deviceType,
- num_entries,
- devices,
- &num_devices);
-
- if (ciErrNum<0)
- {
- b3Printf("clGetDeviceIDs returned %d\n",ciErrNum);
- return 0;
- }
+ num_entries,
+ devices,
+ &num_devices);
+
+ if (ciErrNum < 0)
+ {
+ b3Printf("clGetDeviceIDs returned %d\n", ciErrNum);
+ return 0;
+ }
cprops = (NULL == platform) ? NULL : cps;
if (!num_devices)
@@ -268,32 +260,33 @@ cl_context b3OpenCLUtils_createContextFromPlatform(cl_platform_id platform, cl_d
{
//search for the GPU that relates to the OpenCL context
unsigned int i;
- for (i=0;i<num_devices;i++)
+ for (i = 0; i < num_devices; i++)
{
- retContext = clCreateContext(cprops,1,&devices[i],NULL,NULL,&ciErrNum);
- if (ciErrNum==CL_SUCCESS)
+ retContext = clCreateContext(cprops, 1, &devices[i], NULL, NULL, &ciErrNum);
+ if (ciErrNum == CL_SUCCESS)
break;
}
}
else
{
- if (preferredDeviceIndex>=0 && (unsigned int)preferredDeviceIndex<num_devices)
+ if (preferredDeviceIndex >= 0 && (unsigned int)preferredDeviceIndex < num_devices)
{
//create a context of the preferred device index
- retContext = clCreateContext(cprops,1,&devices[preferredDeviceIndex],NULL,NULL,&ciErrNum);
- } else
+ retContext = clCreateContext(cprops, 1, &devices[preferredDeviceIndex], NULL, NULL, &ciErrNum);
+ }
+ else
{
//create a context of all devices
-#if defined (__APPLE__)
- retContext = clCreateContext(cprops,num_devices,devices,MyFatalBreakAPPLE,NULL,&ciErrNum);
+#if defined(__APPLE__)
+ retContext = clCreateContext(cprops, num_devices, devices, MyFatalBreakAPPLE, NULL, &ciErrNum);
#else
- b3Printf("numDevices=%d\n",num_devices);
+ b3Printf("numDevices=%d\n", num_devices);
- retContext = clCreateContext(cprops,num_devices,devices,NULL,NULL,&ciErrNum);
+ retContext = clCreateContext(cprops, num_devices, devices, NULL, NULL, &ciErrNum);
#endif
}
}
- if(pErrNum != NULL)
+ if (pErrNum != NULL)
{
*pErrNum = ciErrNum;
};
@@ -301,60 +294,58 @@ cl_context b3OpenCLUtils_createContextFromPlatform(cl_platform_id platform, cl_d
return retContext;
}
-cl_context b3OpenCLUtils_createContextFromType(cl_device_type deviceType, cl_int* pErrNum, void* pGLContext, void* pGLDC , int preferredDeviceIndex, int preferredPlatformIndex, cl_platform_id* retPlatformId)
+cl_context b3OpenCLUtils_createContextFromType(cl_device_type deviceType, cl_int* pErrNum, void* pGLContext, void* pGLDC, int preferredDeviceIndex, int preferredPlatformIndex, cl_platform_id* retPlatformId)
{
#ifdef B3_USE_CLEW
- b3OpenCLUtils_clewInit();
+ b3OpenCLUtils_clewInit();
#endif
-
cl_uint numPlatforms;
cl_context retContext = 0;
unsigned int i;
cl_int ciErrNum = clGetPlatformIDs(0, NULL, &numPlatforms);
- if(ciErrNum != CL_SUCCESS)
+ if (ciErrNum != CL_SUCCESS)
{
- if(pErrNum != NULL) *pErrNum = ciErrNum;
+ if (pErrNum != NULL) *pErrNum = ciErrNum;
return NULL;
}
- if(numPlatforms > 0)
+ if (numPlatforms > 0)
{
- cl_platform_id* platforms = (cl_platform_id*) malloc (sizeof(cl_platform_id)*numPlatforms);
+ cl_platform_id* platforms = (cl_platform_id*)malloc(sizeof(cl_platform_id) * numPlatforms);
ciErrNum = clGetPlatformIDs(numPlatforms, platforms, NULL);
- if(ciErrNum != CL_SUCCESS)
+ if (ciErrNum != CL_SUCCESS)
{
- if(pErrNum != NULL)
+ if (pErrNum != NULL)
*pErrNum = ciErrNum;
free(platforms);
return NULL;
}
-
-
- for ( i = 0; i < numPlatforms; ++i)
+ for (i = 0; i < numPlatforms; ++i)
{
char pbuf[128];
- ciErrNum = clGetPlatformInfo( platforms[i],
- CL_PLATFORM_VENDOR,
- sizeof(pbuf),
- pbuf,
- NULL);
- if(ciErrNum != CL_SUCCESS)
+ ciErrNum = clGetPlatformInfo(platforms[i],
+ CL_PLATFORM_VENDOR,
+ sizeof(pbuf),
+ pbuf,
+ NULL);
+ if (ciErrNum != CL_SUCCESS)
{
- if(pErrNum != NULL) *pErrNum = ciErrNum;
+ if (pErrNum != NULL) *pErrNum = ciErrNum;
return NULL;
}
- if (preferredPlatformIndex>=0 && i==preferredPlatformIndex)
+ if (preferredPlatformIndex >= 0 && i == preferredPlatformIndex)
{
cl_platform_id tmpPlatform = platforms[0];
platforms[0] = platforms[i];
platforms[i] = tmpPlatform;
break;
- } else
+ }
+ else
{
- if(!strcmp(pbuf, spPlatformVendor))
+ if (!strcmp(pbuf, spPlatformVendor))
{
cl_platform_id tmpPlatform = platforms[0];
platforms[0] = platforms[i];
@@ -368,11 +359,11 @@ cl_context b3OpenCLUtils_createContextFromType(cl_device_type deviceType, cl_int
cl_platform_id platform = platforms[i];
assert(platform);
- retContext = b3OpenCLUtils_createContextFromPlatform(platform,deviceType,pErrNum,pGLContext,pGLDC,preferredDeviceIndex,preferredPlatformIndex);
+ retContext = b3OpenCLUtils_createContextFromPlatform(platform, deviceType, pErrNum, pGLContext, pGLDC, preferredDeviceIndex, preferredPlatformIndex);
if (retContext)
{
-// printf("OpenCL platform details:\n");
+ // printf("OpenCL platform details:\n");
b3OpenCLPlatformInfo platformInfo;
b3OpenCLUtils::getPlatformInfo(platform, &platformInfo);
@@ -384,12 +375,11 @@ cl_context b3OpenCLUtils_createContextFromType(cl_device_type deviceType, cl_int
}
}
- free (platforms);
+ free(platforms);
}
return retContext;
}
-
//////////////////////////////////////////////////////////////////////////////
//! Gets the id of the nth device from the context
//!
@@ -403,16 +393,17 @@ cl_device_id b3OpenCLUtils_getDevice(cl_context cxMainContext, int deviceIndex)
size_t szParmDataBytes;
cl_device_id* cdDevices;
- cl_device_id device ;
+ cl_device_id device;
// get the list of devices associated with context
clGetContextInfo(cxMainContext, CL_CONTEXT_DEVICES, 0, NULL, &szParmDataBytes);
- if( szParmDataBytes / sizeof(cl_device_id) < (unsigned int)deviceIndex ) {
+ if (szParmDataBytes / sizeof(cl_device_id) < (unsigned int)deviceIndex)
+ {
return (cl_device_id)-1;
}
- cdDevices = (cl_device_id*) malloc(szParmDataBytes);
+ cdDevices = (cl_device_id*)malloc(szParmDataBytes);
clGetContextInfo(cxMainContext, CL_CONTEXT_DEVICES, szParmDataBytes, cdDevices, NULL);
@@ -427,12 +418,10 @@ int b3OpenCLUtils_getNumDevices(cl_context cxMainContext)
size_t szParamDataBytes;
int device_count;
clGetContextInfo(cxMainContext, CL_CONTEXT_DEVICES, 0, NULL, &szParamDataBytes);
- device_count = (int) szParamDataBytes/ sizeof(cl_device_id);
+ device_count = (int)szParamDataBytes / sizeof(cl_device_id);
return device_count;
}
-
-
void b3OpenCLUtils::getDeviceInfo(cl_device_id device, b3OpenCLDeviceInfo* info)
{
// CL_DEVICE_NAME
@@ -514,23 +503,22 @@ void b3OpenCLUtils::getDeviceInfo(cl_device_id device, b3OpenCLDeviceInfo* info)
clGetDeviceInfo(device, CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE, sizeof(cl_uint), &info->m_vecWidthDouble, NULL);
}
-
void b3OpenCLUtils_printDeviceInfo(cl_device_id device)
{
b3OpenCLDeviceInfo info;
- b3OpenCLUtils::getDeviceInfo(device,&info);
+ b3OpenCLUtils::getDeviceInfo(device, &info);
b3Printf("Device Info:\n");
b3Printf(" CL_DEVICE_NAME: \t\t\t%s\n", info.m_deviceName);
b3Printf(" CL_DEVICE_VENDOR: \t\t\t%s\n", info.m_deviceVendor);
b3Printf(" CL_DRIVER_VERSION: \t\t\t%s\n", info.m_driverVersion);
- if( info.m_deviceType & CL_DEVICE_TYPE_CPU )
+ if (info.m_deviceType & CL_DEVICE_TYPE_CPU)
b3Printf(" CL_DEVICE_TYPE:\t\t\t%s\n", "CL_DEVICE_TYPE_CPU");
- if( info.m_deviceType & CL_DEVICE_TYPE_GPU )
+ if (info.m_deviceType & CL_DEVICE_TYPE_GPU)
b3Printf(" CL_DEVICE_TYPE:\t\t\t%s\n", "CL_DEVICE_TYPE_GPU");
- if( info.m_deviceType & CL_DEVICE_TYPE_ACCELERATOR )
+ if (info.m_deviceType & CL_DEVICE_TYPE_ACCELERATOR)
b3Printf(" CL_DEVICE_TYPE:\t\t\t%s\n", "CL_DEVICE_TYPE_ACCELERATOR");
- if( info.m_deviceType & CL_DEVICE_TYPE_DEFAULT )
+ if (info.m_deviceType & CL_DEVICE_TYPE_DEFAULT)
b3Printf(" CL_DEVICE_TYPE:\t\t\t%s\n", "CL_DEVICE_TYPE_DEFAULT");
b3Printf(" CL_DEVICE_MAX_COMPUTE_UNITS:\t\t%u\n", info.m_computeUnits);
@@ -539,15 +527,15 @@ void b3OpenCLUtils_printDeviceInfo(cl_device_id device)
b3Printf(" CL_DEVICE_MAX_WORK_GROUP_SIZE:\t%u\n", info.m_workgroupSize);
b3Printf(" CL_DEVICE_MAX_CLOCK_FREQUENCY:\t%u MHz\n", info.m_clockFrequency);
b3Printf(" CL_DEVICE_ADDRESS_BITS:\t\t%u\n", info.m_addressBits);
- b3Printf(" CL_DEVICE_MAX_MEM_ALLOC_SIZE:\t\t%u MByte\n", (unsigned int)(info.m_maxMemAllocSize/ (1024 * 1024)));
- b3Printf(" CL_DEVICE_GLOBAL_MEM_SIZE:\t\t%u MByte\n", (unsigned int)(info.m_globalMemSize/ (1024 * 1024)));
- b3Printf(" CL_DEVICE_ERROR_CORRECTION_SUPPORT:\t%s\n", info.m_errorCorrectionSupport== CL_TRUE ? "yes" : "no");
+ b3Printf(" CL_DEVICE_MAX_MEM_ALLOC_SIZE:\t\t%u MByte\n", (unsigned int)(info.m_maxMemAllocSize / (1024 * 1024)));
+ b3Printf(" CL_DEVICE_GLOBAL_MEM_SIZE:\t\t%u MByte\n", (unsigned int)(info.m_globalMemSize / (1024 * 1024)));
+ b3Printf(" CL_DEVICE_ERROR_CORRECTION_SUPPORT:\t%s\n", info.m_errorCorrectionSupport == CL_TRUE ? "yes" : "no");
b3Printf(" CL_DEVICE_LOCAL_MEM_TYPE:\t\t%s\n", info.m_localMemType == 1 ? "local" : "global");
b3Printf(" CL_DEVICE_LOCAL_MEM_SIZE:\t\t%u KByte\n", (unsigned int)(info.m_localMemSize / 1024));
b3Printf(" CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE:\t%u KByte\n", (unsigned int)(info.m_constantBufferSize / 1024));
- if( info.m_queueProperties & CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE )
+ if (info.m_queueProperties & CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE)
b3Printf(" CL_DEVICE_QUEUE_PROPERTIES:\t\t%s\n", "CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE");
- if( info.m_queueProperties & CL_QUEUE_PROFILING_ENABLE )
+ if (info.m_queueProperties & CL_QUEUE_PROFILING_ENABLE)
b3Printf(" CL_DEVICE_QUEUE_PROPERTIES:\t\t%s\n", "CL_QUEUE_PROFILING_ENABLE");
b3Printf(" CL_DEVICE_IMAGE_SUPPORT:\t\t%u\n", info.m_imageSupport);
@@ -562,7 +550,7 @@ void b3OpenCLUtils_printDeviceInfo(cl_device_id device)
b3Printf("\t\t\t\t\t3D_MAX_DEPTH\t %u\n", info.m_image3dMaxDepth);
if (*info.m_deviceExtensions != 0)
{
- b3Printf("\n CL_DEVICE_EXTENSIONS:%s\n",info.m_deviceExtensions);
+ b3Printf("\n CL_DEVICE_EXTENSIONS:%s\n", info.m_deviceExtensions);
}
else
{
@@ -570,36 +558,33 @@ void b3OpenCLUtils_printDeviceInfo(cl_device_id device)
}
b3Printf(" CL_DEVICE_PREFERRED_VECTOR_WIDTH_<t>\t");
b3Printf("CHAR %u, SHORT %u, INT %u,LONG %u, FLOAT %u, DOUBLE %u\n\n\n",
- info.m_vecWidthChar, info.m_vecWidthShort, info.m_vecWidthInt, info.m_vecWidthLong,info.m_vecWidthFloat, info.m_vecWidthDouble);
-
-
+ info.m_vecWidthChar, info.m_vecWidthShort, info.m_vecWidthInt, info.m_vecWidthLong, info.m_vecWidthFloat, info.m_vecWidthDouble);
}
-
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)
- {
+ 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;
+ }
+ return oriptr;
}
-cl_program b3OpenCLUtils_compileCLProgramFromString(cl_context clContext, cl_device_id device, const char* kernelSourceOrg, cl_int* pErrNum, const char* additionalMacrosArg , const char* clFileNameForCaching, bool disableBinaryCaching)
+cl_program b3OpenCLUtils_compileCLProgramFromString(cl_context clContext, cl_device_id device, const char* kernelSourceOrg, cl_int* pErrNum, const char* additionalMacrosArg, const char* clFileNameForCaching, bool disableBinaryCaching)
{
- const char* additionalMacros = additionalMacrosArg?additionalMacrosArg:"";
+ const char* additionalMacros = additionalMacrosArg ? additionalMacrosArg : "";
if (disableBinaryCaching)
{
//kernelSourceOrg = 0;
}
- cl_program m_cpProgram=0;
+ cl_program m_cpProgram = 0;
cl_int status;
char binaryFileName[B3_MAX_STRING_LENGTH];
@@ -609,67 +594,64 @@ cl_program b3OpenCLUtils_compileCLProgramFromString(cl_context clContext, cl_dev
const char* strippedName;
int fileUpToDate = 0;
#ifdef _WIN32
- int binaryFileValid=0;
-#endif
+ int binaryFileValid = 0;
+#endif
if (!disableBinaryCaching && clFileNameForCaching)
{
clGetDeviceInfo(device, CL_DEVICE_NAME, 256, &deviceName, NULL);
clGetDeviceInfo(device, CL_DRIVER_VERSION, 256, &driverVersion, NULL);
-
- strippedName = strip2(clFileNameForCaching,"\\");
- strippedName = strip2(strippedName,"/");
-
+
+ strippedName = strip2(clFileNameForCaching, "\\");
+ strippedName = strip2(strippedName, "/");
+
#ifdef _MSC_VER
- sprintf_s(binaryFileName,B3_MAX_STRING_LENGTH,"%s/%s.%s.%s.bin",sCachedBinaryPath,strippedName, deviceName,driverVersion );
+ sprintf_s(binaryFileName, B3_MAX_STRING_LENGTH, "%s/%s.%s.%s.bin", sCachedBinaryPath, strippedName, deviceName, driverVersion);
#else
- sprintf(binaryFileName,"%s/%s.%s.%s.bin",sCachedBinaryPath,strippedName, deviceName,driverVersion );
+ sprintf(binaryFileName, "%s/%s.%s.%s.bin", sCachedBinaryPath, strippedName, deviceName, driverVersion);
#endif
}
- if (clFileNameForCaching && !(disableBinaryCaching || gDebugSkipLoadingBinary||gDebugForceLoadingFromSource) )
+ if (clFileNameForCaching && !(disableBinaryCaching || gDebugSkipLoadingBinary || gDebugForceLoadingFromSource))
{
-
#ifdef _WIN32
- char* bla=0;
-
-
+ char* bla = 0;
//printf("searching for %s\n", binaryFileName);
-
FILETIME modtimeBinary;
- CreateDirectoryA(sCachedBinaryPath,0);
+ CreateDirectoryA(sCachedBinaryPath, 0);
{
-
- HANDLE binaryFileHandle = CreateFileA(binaryFileName,GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
- if (binaryFileHandle ==INVALID_HANDLE_VALUE)
+ HANDLE binaryFileHandle = CreateFileA(binaryFileName, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
+ if (binaryFileHandle == INVALID_HANDLE_VALUE)
{
DWORD errorCode;
errorCode = GetLastError();
switch (errorCode)
{
- case ERROR_FILE_NOT_FOUND:
+ case ERROR_FILE_NOT_FOUND:
{
b3Warning("\nCached file not found %s\n", binaryFileName);
break;
}
- case ERROR_PATH_NOT_FOUND:
+ case ERROR_PATH_NOT_FOUND:
{
b3Warning("\nCached file path not found %s\n", binaryFileName);
break;
}
- default:
+ default:
{
b3Warning("\nFailed reading cached file with errorCode = %d\n", errorCode);
}
}
- } else
+ }
+ else
{
- if (GetFileTime(binaryFileHandle, NULL, NULL, &modtimeBinary)==0)
+ if (GetFileTime(binaryFileHandle, NULL, NULL, &modtimeBinary) == 0)
{
DWORD errorCode;
errorCode = GetLastError();
b3Warning("\nGetFileTime errorCode = %d\n", errorCode);
- } else
+ }
+ else
{
binaryFileValid = 1;
}
@@ -678,37 +660,35 @@ cl_program b3OpenCLUtils_compileCLProgramFromString(cl_context clContext, cl_dev
if (binaryFileValid)
{
- HANDLE srcFileHandle = CreateFileA(clFileNameForCaching,GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
+ HANDLE srcFileHandle = CreateFileA(clFileNameForCaching, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
- if (srcFileHandle==INVALID_HANDLE_VALUE)
+ if (srcFileHandle == INVALID_HANDLE_VALUE)
{
- const char* prefix[]={"./","../","../../","../../../","../../../../"};
- for (int i=0;(srcFileHandle==INVALID_HANDLE_VALUE) && i<5;i++)
+ const char* prefix[] = {"./", "../", "../../", "../../../", "../../../../"};
+ for (int i = 0; (srcFileHandle == INVALID_HANDLE_VALUE) && i < 5; i++)
{
char relativeFileName[1024];
- sprintf(relativeFileName,"%s%s",prefix[i],clFileNameForCaching);
- srcFileHandle = CreateFileA(relativeFileName,GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
+ sprintf(relativeFileName, "%s%s", prefix[i], clFileNameForCaching);
+ srcFileHandle = CreateFileA(relativeFileName, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
}
-
}
-
- if (srcFileHandle!=INVALID_HANDLE_VALUE)
+ if (srcFileHandle != INVALID_HANDLE_VALUE)
{
FILETIME modtimeSrc;
- if (GetFileTime(srcFileHandle, NULL, NULL, &modtimeSrc)==0)
+ if (GetFileTime(srcFileHandle, NULL, NULL, &modtimeSrc) == 0)
{
DWORD errorCode;
errorCode = GetLastError();
b3Warning("\nGetFileTime errorCode = %d\n", errorCode);
}
- if ( ( modtimeSrc.dwHighDateTime < modtimeBinary.dwHighDateTime)
- ||(( modtimeSrc.dwHighDateTime == modtimeBinary.dwHighDateTime)&&(modtimeSrc.dwLowDateTime <= modtimeBinary.dwLowDateTime)))
+ if ((modtimeSrc.dwHighDateTime < modtimeBinary.dwHighDateTime) || ((modtimeSrc.dwHighDateTime == modtimeBinary.dwHighDateTime) && (modtimeSrc.dwLowDateTime <= modtimeBinary.dwLowDateTime)))
{
- fileUpToDate=1;
- } else
+ fileUpToDate = 1;
+ }
+ else
{
- b3Warning("\nCached binary file out-of-date (%s)\n",binaryFileName);
+ b3Warning("\nCached binary file out-of-date (%s)\n", binaryFileName);
}
CloseHandle(srcFileHandle);
}
@@ -719,25 +699,25 @@ cl_program b3OpenCLUtils_compileCLProgramFromString(cl_context clContext, cl_dev
errorCode = GetLastError();
switch (errorCode)
{
- case ERROR_FILE_NOT_FOUND:
+ case ERROR_FILE_NOT_FOUND:
{
b3Warning("\nSrc file not found %s\n", clFileNameForCaching);
break;
}
- case ERROR_PATH_NOT_FOUND:
+ case ERROR_PATH_NOT_FOUND:
{
b3Warning("\nSrc path not found %s\n", clFileNameForCaching);
break;
}
- default:
+ default:
{
b3Warning("\nnSrc file reading errorCode = %d\n", errorCode);
}
}
//we should make sure the src file exists so we can verify the timestamp with binary
-// assert(0);
- b3Warning("Warning: cannot find OpenCL kernel %s to verify timestamp of binary cached kernel %s\n",clFileNameForCaching, binaryFileName);
+ // assert(0);
+ b3Warning("Warning: cannot find OpenCL kernel %s to verify timestamp of binary cached kernel %s\n", clFileNameForCaching, binaryFileName);
fileUpToDate = true;
#else
//if we cannot find the source, assume it is OK in release builds
@@ -745,126 +725,109 @@ cl_program b3OpenCLUtils_compileCLProgramFromString(cl_context clContext, cl_dev
#endif
}
}
-
-
}
-
-
#else
- fileUpToDate = true;
- if (mkdir(sCachedBinaryPath,0777) == -1)
- {
- }
- else
- {
- b3Printf("Succesfully created cache directory: %s\n", sCachedBinaryPath);
- }
-#endif //_WIN32
+ fileUpToDate = true;
+ if (mkdir(sCachedBinaryPath, 0777) == -1)
+ {
+ }
+ else
+ {
+ b3Printf("Succesfully created cache directory: %s\n", sCachedBinaryPath);
+ }
+#endif //_WIN32
}
-
-
- if( fileUpToDate)
+
+ if (fileUpToDate)
{
#ifdef _MSC_VER
FILE* file;
- if (fopen_s(&file,binaryFileName, "rb")!=0)
- file=0;
+ if (fopen_s(&file, binaryFileName, "rb") != 0)
+ file = 0;
#else
FILE* file = fopen(binaryFileName, "rb");
#endif
-
+
if (file)
{
- size_t binarySize=0;
- char* binary =0;
-
- fseek( file, 0L, SEEK_END );
- binarySize = ftell( file );
- rewind( file );
- binary = (char*)malloc(sizeof(char)*binarySize);
+ size_t binarySize = 0;
+ char* binary = 0;
+
+ fseek(file, 0L, SEEK_END);
+ binarySize = ftell(file);
+ rewind(file);
+ binary = (char*)malloc(sizeof(char) * binarySize);
int bytesRead;
- bytesRead = fread( binary, sizeof(char), binarySize, file );
- fclose( file );
-
- m_cpProgram = clCreateProgramWithBinary( clContext, 1,&device, &binarySize, (const unsigned char**)&binary, 0, &status );
- b3Assert( status == CL_SUCCESS );
- status = clBuildProgram( m_cpProgram, 1, &device, additionalMacros, 0, 0 );
- b3Assert( status == CL_SUCCESS );
-
- if( status != CL_SUCCESS )
+ bytesRead = fread(binary, sizeof(char), binarySize, file);
+ fclose(file);
+
+ m_cpProgram = clCreateProgramWithBinary(clContext, 1, &device, &binarySize, (const unsigned char**)&binary, 0, &status);
+ b3Assert(status == CL_SUCCESS);
+ status = clBuildProgram(m_cpProgram, 1, &device, additionalMacros, 0, 0);
+ b3Assert(status == CL_SUCCESS);
+
+ if (status != CL_SUCCESS)
{
- char *build_log;
+ char* build_log;
size_t ret_val_size;
clGetProgramBuildInfo(m_cpProgram, device, CL_PROGRAM_BUILD_LOG, 0, NULL, &ret_val_size);
- build_log = (char*)malloc(sizeof(char)*(ret_val_size+1));
+ build_log = (char*)malloc(sizeof(char) * (ret_val_size + 1));
clGetProgramBuildInfo(m_cpProgram, device, CL_PROGRAM_BUILD_LOG, ret_val_size, build_log, NULL);
build_log[ret_val_size] = '\0';
b3Error("%s\n", build_log);
- free (build_log);
+ free(build_log);
b3Assert(0);
m_cpProgram = 0;
- b3Warning("clBuildProgram reported failure on cached binary: %s\n",binaryFileName);
-
- } else
+ b3Warning("clBuildProgram reported failure on cached binary: %s\n", binaryFileName);
+ }
+ else
{
- b3Printf("clBuildProgram successfully compiled cached binary: %s\n",binaryFileName);
+ b3Printf("clBuildProgram successfully compiled cached binary: %s\n", binaryFileName);
}
- free (binary);
-
- } else
+ free(binary);
+ }
+ else
{
- b3Warning("Cannot open cached binary: %s\n",binaryFileName);
+ b3Warning("Cannot open cached binary: %s\n", binaryFileName);
}
}
-
-
-
-
-
-
-
-
-
+
if (!m_cpProgram)
{
-
cl_int localErrNum;
char* compileFlags;
int flagsize;
-
-
const char* kernelSource = kernelSourceOrg;
if (!kernelSourceOrg || gDebugForceLoadingFromSource)
{
if (clFileNameForCaching)
{
-
FILE* file = fopen(clFileNameForCaching, "rb");
//in many cases the relative path is a few levels up the directory hierarchy, so try it
if (!file)
{
- const char* prefix[]={"../","../../","../../../","../../../../"};
- for (int i=0;!file && i<3;i++)
+ const char* prefix[] = {"../", "../../", "../../../", "../../../../"};
+ for (int i = 0; !file && i < 3; i++)
{
char relativeFileName[1024];
- sprintf(relativeFileName,"%s%s",prefix[i],clFileNameForCaching);
+ sprintf(relativeFileName, "%s%s", prefix[i], clFileNameForCaching);
file = fopen(relativeFileName, "rb");
}
}
if (file)
{
- char* kernelSrc=0;
- fseek( file, 0L, SEEK_END );
- int kernelSize = ftell( file );
- rewind( file );
- kernelSrc = (char*)malloc(kernelSize+1);
+ char* kernelSrc = 0;
+ fseek(file, 0L, SEEK_END);
+ int kernelSize = ftell(file);
+ rewind(file);
+ kernelSrc = (char*)malloc(kernelSize + 1);
int readBytes;
- readBytes = fread((void*)kernelSrc,1,kernelSize, file);
+ readBytes = fread((void*)kernelSrc, 1, kernelSize, file);
kernelSrc[kernelSize] = 0;
fclose(file);
kernelSource = kernelSrc;
@@ -873,15 +836,14 @@ cl_program b3OpenCLUtils_compileCLProgramFromString(cl_context clContext, cl_dev
}
size_t program_length = kernelSource ? strlen(kernelSource) : 0;
-#ifdef MAC //or __APPLE__?
+#ifdef MAC //or __APPLE__?
char* flags = "-cl-mad-enable -DMAC ";
#else
const char* flags = "";
#endif
-
m_cpProgram = clCreateProgramWithSource(clContext, 1, (const char**)&kernelSource, &program_length, &localErrNum);
- if (localErrNum!= CL_SUCCESS)
+ if (localErrNum != CL_SUCCESS)
{
if (pErrNum)
*pErrNum = localErrNum;
@@ -890,108 +852,100 @@ cl_program b3OpenCLUtils_compileCLProgramFromString(cl_context clContext, cl_dev
// Build the program with 'mad' Optimization option
-
-
- flagsize = sizeof(char)*(strlen(additionalMacros) + strlen(flags) + 5);
- compileFlags = (char*) malloc(flagsize);
+ flagsize = sizeof(char) * (strlen(additionalMacros) + strlen(flags) + 5);
+ compileFlags = (char*)malloc(flagsize);
#ifdef _MSC_VER
- sprintf_s(compileFlags,flagsize, "%s %s", flags, additionalMacros);
+ sprintf_s(compileFlags, flagsize, "%s %s", flags, additionalMacros);
#else
sprintf(compileFlags, "%s %s", flags, additionalMacros);
#endif
localErrNum = clBuildProgram(m_cpProgram, 1, &device, compileFlags, NULL, NULL);
- if (localErrNum!= CL_SUCCESS)
+ if (localErrNum != CL_SUCCESS)
{
- char *build_log;
+ char* build_log;
size_t ret_val_size;
clGetProgramBuildInfo(m_cpProgram, device, CL_PROGRAM_BUILD_LOG, 0, NULL, &ret_val_size);
- build_log = (char*) malloc(sizeof(char)*(ret_val_size+1));
+ build_log = (char*)malloc(sizeof(char) * (ret_val_size + 1));
clGetProgramBuildInfo(m_cpProgram, device, CL_PROGRAM_BUILD_LOG, ret_val_size, build_log, NULL);
// to be carefully, terminate with \0
// there's no information in the reference whether the string is 0 terminated or not
build_log[ret_val_size] = '\0';
-
b3Error("Error in clBuildProgram, Line %u in file %s, Log: \n%s\n !!!\n\n", __LINE__, __FILE__, build_log);
- free (build_log);
+ free(build_log);
if (pErrNum)
*pErrNum = localErrNum;
return 0;
}
-
- if( !disableBinaryCaching && clFileNameForCaching )
- { // write to binary
+ if (!disableBinaryCaching && clFileNameForCaching)
+ { // write to binary
cl_uint numAssociatedDevices;
- status = clGetProgramInfo( m_cpProgram, CL_PROGRAM_NUM_DEVICES, sizeof(cl_uint), &numAssociatedDevices, 0 );
- b3Assert( status == CL_SUCCESS );
- if (numAssociatedDevices==1)
+ status = clGetProgramInfo(m_cpProgram, CL_PROGRAM_NUM_DEVICES, sizeof(cl_uint), &numAssociatedDevices, 0);
+ b3Assert(status == CL_SUCCESS);
+ if (numAssociatedDevices == 1)
{
-
size_t binarySize;
- char* binary ;
+ char* binary;
- status = clGetProgramInfo( m_cpProgram, CL_PROGRAM_BINARY_SIZES, sizeof(size_t), &binarySize, 0 );
- b3Assert( status == CL_SUCCESS );
+ status = clGetProgramInfo(m_cpProgram, CL_PROGRAM_BINARY_SIZES, sizeof(size_t), &binarySize, 0);
+ b3Assert(status == CL_SUCCESS);
- binary = (char*)malloc(sizeof(char)*binarySize);
+ binary = (char*)malloc(sizeof(char) * binarySize);
- status = clGetProgramInfo( m_cpProgram, CL_PROGRAM_BINARIES, sizeof(char*), &binary, 0 );
- b3Assert( status == CL_SUCCESS );
+ status = clGetProgramInfo(m_cpProgram, CL_PROGRAM_BINARIES, sizeof(char*), &binary, 0);
+ b3Assert(status == CL_SUCCESS);
{
- FILE* file=0;
+ FILE* file = 0;
#ifdef _MSC_VER
- if (fopen_s(&file,binaryFileName, "wb")!=0)
- file=0;
+ if (fopen_s(&file, binaryFileName, "wb") != 0)
+ file = 0;
#else
file = fopen(binaryFileName, "wb");
#endif
if (file)
{
- fwrite( binary, sizeof(char), binarySize, file );
- fclose( file );
- } else
+ fwrite(binary, sizeof(char), binarySize, file);
+ fclose(file);
+ }
+ else
{
b3Warning("cannot write file %s\n", binaryFileName);
}
}
- free (binary);
+ free(binary);
}
}
free(compileFlags);
-
}
return m_cpProgram;
}
-
-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 )
+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)
{
-
cl_kernel kernel;
cl_int localErrNum;
cl_program m_cpProgram = prog;
- b3Printf("compiling kernel %s ",kernelName);
+ b3Printf("compiling kernel %s ", kernelName);
if (!m_cpProgram)
{
- m_cpProgram = b3OpenCLUtils_compileCLProgramFromString(clContext,device,kernelSource,pErrNum, additionalMacros,0, false);
+ m_cpProgram = b3OpenCLUtils_compileCLProgramFromString(clContext, device, kernelSource, pErrNum, additionalMacros, 0, false);
}
-
// Create the kernel
kernel = clCreateKernel(m_cpProgram, kernelName, &localErrNum);
if (localErrNum != CL_SUCCESS)
{
b3Error("Error in clCreateKernel, Line %u in file %s, cannot find kernel function %s !!!\n\n", __LINE__, __FILE__, kernelName);
- assert(0);
+ assert(0);
if (pErrNum)
*pErrNum = localErrNum;
return 0;
@@ -1003,9 +957,7 @@ cl_kernel b3OpenCLUtils_compileCLKernelFromString(cl_context clContext, cl_devic
}
b3Printf("ready. \n");
-
if (pErrNum)
- *pErrNum = CL_SUCCESS;
+ *pErrNum = CL_SUCCESS;
return kernel;
-
}
diff --git a/thirdparty/bullet/Bullet3OpenCL/Initialize/b3OpenCLUtils.h b/thirdparty/bullet/Bullet3OpenCL/Initialize/b3OpenCLUtils.h
index db6466e76b..6c82eed2a6 100644
--- a/thirdparty/bullet/Bullet3OpenCL/Initialize/b3OpenCLUtils.h
+++ b/thirdparty/bullet/Bullet3OpenCL/Initialize/b3OpenCLUtils.h
@@ -22,42 +22,41 @@ subject to the following restrictions:
#include "b3OpenCLInclude.h"
#ifdef __cplusplus
-extern "C" {
+extern "C"
+{
#endif
+ ///C API for OpenCL utilities: convenience functions, see below for C++ API
-///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);
-/// 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);
+ int b3OpenCLUtils_getNumDevices(cl_context cxMainContext);
-cl_device_id b3OpenCLUtils_getDevice(cl_context cxMainContext, int nr);
+ cl_device_id b3OpenCLUtils_getDevice(cl_context cxMainContext, int nr);
-void b3OpenCLUtils_printDeviceInfo(cl_device_id device);
+ 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);
+ 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);
+ //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);
+ //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);
-///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();
-void b3OpenCLUtils_printPlatformInfo(cl_platform_id platform);
+ ///set the path (directory/folder) where the compiled OpenCL kernel are stored
+ void b3OpenCLUtils_setCachePath(const char* path);
-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);
+ 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
}
@@ -71,37 +70,35 @@ typedef struct
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_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_maxReadImageArgs;
+ cl_uint m_maxWriteImageArgs;
-
-
- cl_uint m_addressBits;
- cl_ulong m_maxMemAllocSize;
+ 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;
+ 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;
@@ -110,33 +107,32 @@ 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;
+ 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)
+ 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);
+ 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);
+ return b3OpenCLUtils_getDevice(cxMainContext, nr);
}
static void getDeviceInfo(cl_device_id device, b3OpenCLDeviceInfo* info);
@@ -146,28 +142,28 @@ struct b3OpenCLUtils
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 = "" )
+ 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);
+ 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)
+ 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);
+ 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)
+ 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)
+ static inline cl_platform_id getPlatform(int nr, cl_int* pErrNum = 0)
{
- return b3OpenCLUtils_getPlatform(nr,pErrNum);
+ return b3OpenCLUtils_getPlatform(nr, pErrNum);
}
-
+
static void getPlatformInfo(cl_platform_id platform, b3OpenCLPlatformInfo* platformInfo);
static inline void printPlatformInfo(cl_platform_id platform)
@@ -179,9 +175,9 @@ struct b3OpenCLUtils
{
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)
+ 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);
+ return b3OpenCLUtils_createContextFromPlatform(platform, deviceType, pErrNum, pGLCtx, pGLDC, preferredDeviceIndex, preferredPlatformIndex);
}
static void setCachePath(const char* path)
{
@@ -189,6 +185,6 @@ struct b3OpenCLUtils
}
};
-#endif //__cplusplus
+#endif //__cplusplus
-#endif // B3_OPENCL_UTILS_H
+#endif // B3_OPENCL_UTILS_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3BvhInfo.h b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3BvhInfo.h
index 872f039506..27835bb747 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3BvhInfo.h
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3BvhInfo.h
@@ -5,14 +5,13 @@
struct b3BvhInfo
{
- b3Vector3 m_aabbMin;
- b3Vector3 m_aabbMax;
- b3Vector3 m_quantization;
- int m_numNodes;
- int m_numSubTrees;
- int m_nodeOffset;
- int m_subTreeOffset;
-
+ 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
+#endif //B3_BVH_INFO_H \ No newline at end of file
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ContactCache.cpp b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ContactCache.cpp
index cb30ee939b..4db717f8c3 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ContactCache.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ContactCache.cpp
@@ -15,7 +15,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "b3ContactCache.h"
#include "Bullet3Common/b3Transform.h"
@@ -69,7 +68,7 @@ int b3ContactCache::sortCachedPoints(const b3Vector3& pt)
maxPenetration = m_pointCache[i].getDistance();
}
}
-#endif //KEEP_DEEPEST_POINT
+#endif //KEEP_DEEPEST_POINT
b3Scalar res0(b3Scalar(0.)),res1(b3Scalar(0.)),res2(b3Scalar(0.)),res3(b3Scalar(0.));
@@ -251,8 +250,4 @@ void b3ContactCache::refreshContactPoints(const b3Transform& trA,const b3Transfo
}
-
-
-
-
#endif
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ContactCache.h b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ContactCache.h
index d6c9b0a07e..a15fd0b2a9 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ContactCache.h
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ContactCache.h
@@ -17,17 +17,13 @@ subject to the following restrictions:
#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.
@@ -37,24 +33,16 @@ extern b3Scalar gContactBreakingThreshold;
///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
+B3_ATTRIBUTE_ALIGNED16(class)
+b3ContactCache
{
-
-
-
-
/// sort cached points so most isolated points come first
- int sortCachedPoints(const b3Vector3& pt);
-
-
+ int sortCachedPoints(const b3Vector3& pt);
public:
-
B3_DECLARE_ALIGNED_ALLOCATOR();
-
-
- int addManifoldPoint( const b3Vector3& newPoint);
+ int addManifoldPoint(const b3Vector3& newPoint);
/*void replaceContactPoint(const b3Vector3& newPoint,int insertIndex)
{
@@ -63,18 +51,12 @@ public:
}
*/
-
-
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);
-
+ /// 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
+#endif //B3_CONTACT_CACHE_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ConvexHullContact.cpp b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ConvexHullContact.cpp
index fb435aa7fd..54a104c5c8 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ConvexHullContact.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ConvexHullContact.cpp
@@ -16,19 +16,18 @@ subject to the following restrictions:
bool findSeparatingAxisOnGpu = true;
bool splitSearchSepAxisConcave = false;
bool splitSearchSepAxisConvex = true;
-bool useMprGpu = true;//use mpr for edge-edge (+contact point) or sat. Needs testing on main OpenCL platforms, before enabling...
+bool useMprGpu = true; //use mpr for edge-edge (+contact point) or sat. Needs testing on main OpenCL platforms, before enabling...
bool bvhTraversalKernelGPU = true;
bool findConcaveSeparatingAxisKernelGPU = true;
-bool clipConcaveFacesAndFindContactsCPU = false;//false;//true;
-bool clipConvexFacesAndFindContactsCPU = false;//false;//true;
-bool reduceConcaveContactsOnGPU = true;//false;
-bool reduceConvexContactsOnGPU = true;//false;
+bool clipConcaveFacesAndFindContactsCPU = false; //false;//true;
+bool clipConvexFacesAndFindContactsCPU = false; //false;//true;
+bool reduceConcaveContactsOnGPU = true; //false;
+bool reduceConvexContactsOnGPU = true; //false;
bool findConvexClippingFacesGPU = true;
-bool useGjk = false;///option for CPU/host testing, when findSeparatingAxisOnGpu = false
-bool useGjkContacts = false;//////option for CPU/host testing when findSeparatingAxisOnGpu = false
+bool useGjk = false; ///option for CPU/host testing, when findSeparatingAxisOnGpu = false
+bool useGjkContacts = false; //////option for CPU/host testing when findSeparatingAxisOnGpu = false
-
-static int myframecount=0;///for testing
+static int myframecount = 0; ///for testing
///This file was written by Erwin Coumans
///Separating axis rest based on work from Pierre Terdiman, see
@@ -42,10 +41,10 @@ static int myframecount=0;///for testing
//#define PERSISTENT_CONTACTS_HOST
#endif
-int b3g_actualSATPairTests=0;
+int b3g_actualSATPairTests = 0;
#include "b3ConvexHullContact.h"
-#include <string.h>//memcpy
+#include <string.h> //memcpy
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3ConvexPolyhedronData.h"
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3MprPenetration.h"
@@ -54,8 +53,7 @@ int b3g_actualSATPairTests=0;
typedef b3AlignedObjectArray<b3Vector3> b3VertexArray;
-
-#include <float.h> //for FLT_MAX
+#include <float.h> //for FLT_MAX
#include "Bullet3OpenCL/Initialize/b3OpenCLUtils.h"
#include "Bullet3OpenCL/ParallelPrimitives/b3LauncherCL.h"
//#include "AdlQuaternion.h"
@@ -69,7 +67,6 @@ typedef b3AlignedObjectArray<b3Vector3> b3VertexArray;
#include "kernels/bvhTraversal.h"
#include "kernels/primitiveContacts.h"
-
#include "Bullet3Geometry/b3AabbUtil.h"
#define BT_NARROWPHASE_SAT_PATH "src/Bullet3OpenCL/NarrowphaseCollision/kernels/sat.cl"
@@ -77,12 +74,10 @@ typedef b3AlignedObjectArray<b3Vector3> b3VertexArray;
#define BT_NARROWPHASE_MPR_PATH "src/Bullet3OpenCL/NarrowphaseCollision/kernels/mpr.cl"
-
#define BT_NARROWPHASE_CLIPHULL_PATH "src/Bullet3OpenCL/NarrowphaseCollision/kernels/satClipHullContacts.cl"
#define BT_NARROWPHASE_BVH_TRAVERSAL_PATH "src/Bullet3OpenCL/NarrowphaseCollision/kernels/bvhTraversal.cl"
#define BT_NARROWPHASE_PRIMITIVE_CONTACT_PATH "src/Bullet3OpenCL/NarrowphaseCollision/kernels/primitiveContacts.cl"
-
#ifndef __global
#define __global
#endif
@@ -91,204 +86,184 @@ typedef b3AlignedObjectArray<b3Vector3> b3VertexArray;
#define __kernel
#endif
-
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3BvhTraversal.h"
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3FindConcaveSatAxis.h"
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3ClipFaces.h"
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3NewContactReduction.h"
-
-
#define dot3F4 b3Dot
-GpuSatCollision::GpuSatCollision(cl_context ctx,cl_device_id device, cl_command_queue q )
-:m_context(ctx),
-m_device(device),
-m_queue(q),
+GpuSatCollision::GpuSatCollision(cl_context ctx, cl_device_id device, cl_command_queue q)
+ : m_context(ctx),
+ m_device(device),
+ m_queue(q),
-m_findSeparatingAxisKernel(0),
-m_findSeparatingAxisVertexFaceKernel(0),
-m_findSeparatingAxisEdgeEdgeKernel(0),
-m_unitSphereDirections(m_context,m_queue),
+ m_findSeparatingAxisKernel(0),
+ m_findSeparatingAxisVertexFaceKernel(0),
+ m_findSeparatingAxisEdgeEdgeKernel(0),
+ m_unitSphereDirections(m_context, m_queue),
-m_totalContactsOut(m_context, m_queue),
-m_sepNormals(m_context, m_queue),
-m_dmins(m_context,m_queue),
+ m_totalContactsOut(m_context, m_queue),
+ m_sepNormals(m_context, m_queue),
+ m_dmins(m_context, m_queue),
-m_hasSeparatingNormals(m_context, m_queue),
-m_concaveSepNormals(m_context, m_queue),
-m_concaveHasSeparatingNormals(m_context,m_queue),
-m_numConcavePairsOut(m_context, m_queue),
+ m_hasSeparatingNormals(m_context, m_queue),
+ m_concaveSepNormals(m_context, m_queue),
+ m_concaveHasSeparatingNormals(m_context, m_queue),
+ m_numConcavePairsOut(m_context, m_queue),
+ m_gpuCompoundPairs(m_context, m_queue),
-m_gpuCompoundPairs(m_context, m_queue),
+ m_gpuCompoundSepNormals(m_context, m_queue),
+ m_gpuHasCompoundSepNormals(m_context, m_queue),
-
-m_gpuCompoundSepNormals(m_context, m_queue),
-m_gpuHasCompoundSepNormals(m_context, m_queue),
-
-m_numCompoundPairsOut(m_context, m_queue)
+ m_numCompoundPairsOut(m_context, m_queue)
{
m_totalContactsOut.push_back(0);
-
- cl_int errNum=0;
+
+ cl_int errNum = 0;
if (1)
{
const char* mprSrc = mprKernelsCL;
-
+
const char* srcConcave = satConcaveKernelsCL;
- char flags[1024]={0};
-//#ifdef CL_PLATFORM_INTEL
-// sprintf(flags,"-g -s \"%s\"","C:/develop/bullet3_experiments2/opencl/gpu_narrowphase/kernels/sat.cl");
-//#endif
- m_mprPenetrationKernel = 0;
+ char flags[1024] = {0};
+ //#ifdef CL_PLATFORM_INTEL
+ // sprintf(flags,"-g -s \"%s\"","C:/develop/bullet3_experiments2/opencl/gpu_narrowphase/kernels/sat.cl");
+ //#endif
+ m_mprPenetrationKernel = 0;
m_findSeparatingAxisUnitSphereKernel = 0;
if (useMprGpu)
{
- cl_program mprProg = b3OpenCLUtils::compileCLProgramFromString(m_context,m_device,mprSrc,&errNum,flags,BT_NARROWPHASE_MPR_PATH);
- b3Assert(errNum==CL_SUCCESS);
-
- m_mprPenetrationKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,mprSrc, "mprPenetrationKernel",&errNum,mprProg );
+ cl_program mprProg = b3OpenCLUtils::compileCLProgramFromString(m_context, m_device, mprSrc, &errNum, flags, BT_NARROWPHASE_MPR_PATH);
+ b3Assert(errNum == CL_SUCCESS);
+
+ m_mprPenetrationKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, mprSrc, "mprPenetrationKernel", &errNum, mprProg);
b3Assert(m_mprPenetrationKernel);
- b3Assert(errNum==CL_SUCCESS);
+ b3Assert(errNum == CL_SUCCESS);
- m_findSeparatingAxisUnitSphereKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,mprSrc, "findSeparatingAxisUnitSphereKernel",&errNum,mprProg );
+ m_findSeparatingAxisUnitSphereKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, mprSrc, "findSeparatingAxisUnitSphereKernel", &errNum, mprProg);
b3Assert(m_findSeparatingAxisUnitSphereKernel);
- b3Assert(errNum==CL_SUCCESS);
+ b3Assert(errNum == CL_SUCCESS);
-
- int numDirections = sizeof(unitSphere162)/sizeof(b3Vector3);
+ int numDirections = sizeof(unitSphere162) / sizeof(b3Vector3);
m_unitSphereDirections.resize(numDirections);
- m_unitSphereDirections.copyFromHostPointer(unitSphere162,numDirections,0,true);
-
-
+ m_unitSphereDirections.copyFromHostPointer(unitSphere162, numDirections, 0, true);
}
+ cl_program satProg = b3OpenCLUtils::compileCLProgramFromString(m_context, m_device, satKernelsCL, &errNum, flags, BT_NARROWPHASE_SAT_PATH);
+ b3Assert(errNum == CL_SUCCESS);
- cl_program satProg = b3OpenCLUtils::compileCLProgramFromString(m_context,m_device,satKernelsCL,&errNum,flags,BT_NARROWPHASE_SAT_PATH);
- b3Assert(errNum==CL_SUCCESS);
-
- cl_program satConcaveProg = b3OpenCLUtils::compileCLProgramFromString(m_context,m_device,srcConcave,&errNum,flags,BT_NARROWPHASE_SAT_CONCAVE_PATH);
- b3Assert(errNum==CL_SUCCESS);
+ cl_program satConcaveProg = b3OpenCLUtils::compileCLProgramFromString(m_context, m_device, srcConcave, &errNum, flags, BT_NARROWPHASE_SAT_CONCAVE_PATH);
+ b3Assert(errNum == CL_SUCCESS);
- m_findSeparatingAxisKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,satKernelsCL, "findSeparatingAxisKernel",&errNum,satProg );
+ m_findSeparatingAxisKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, satKernelsCL, "findSeparatingAxisKernel", &errNum, satProg);
b3Assert(m_findSeparatingAxisKernel);
- b3Assert(errNum==CL_SUCCESS);
+ b3Assert(errNum == CL_SUCCESS);
-
- m_findSeparatingAxisVertexFaceKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,satKernelsCL, "findSeparatingAxisVertexFaceKernel",&errNum,satProg );
+ m_findSeparatingAxisVertexFaceKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, satKernelsCL, "findSeparatingAxisVertexFaceKernel", &errNum, satProg);
b3Assert(m_findSeparatingAxisVertexFaceKernel);
- m_findSeparatingAxisEdgeEdgeKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,satKernelsCL, "findSeparatingAxisEdgeEdgeKernel",&errNum,satProg );
+ m_findSeparatingAxisEdgeEdgeKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, satKernelsCL, "findSeparatingAxisEdgeEdgeKernel", &errNum, satProg);
b3Assert(m_findSeparatingAxisVertexFaceKernel);
-
- m_findConcaveSeparatingAxisKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,satKernelsCL, "findConcaveSeparatingAxisKernel",&errNum,satProg );
+ m_findConcaveSeparatingAxisKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, satKernelsCL, "findConcaveSeparatingAxisKernel", &errNum, satProg);
b3Assert(m_findConcaveSeparatingAxisKernel);
- b3Assert(errNum==CL_SUCCESS);
-
- m_findConcaveSeparatingAxisVertexFaceKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,srcConcave, "findConcaveSeparatingAxisVertexFaceKernel",&errNum,satConcaveProg );
+ b3Assert(errNum == CL_SUCCESS);
+
+ m_findConcaveSeparatingAxisVertexFaceKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, srcConcave, "findConcaveSeparatingAxisVertexFaceKernel", &errNum, satConcaveProg);
b3Assert(m_findConcaveSeparatingAxisVertexFaceKernel);
- b3Assert(errNum==CL_SUCCESS);
-
- m_findConcaveSeparatingAxisEdgeEdgeKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,srcConcave, "findConcaveSeparatingAxisEdgeEdgeKernel",&errNum,satConcaveProg );
+ b3Assert(errNum == CL_SUCCESS);
+
+ m_findConcaveSeparatingAxisEdgeEdgeKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, srcConcave, "findConcaveSeparatingAxisEdgeEdgeKernel", &errNum, satConcaveProg);
b3Assert(m_findConcaveSeparatingAxisEdgeEdgeKernel);
- b3Assert(errNum==CL_SUCCESS);
-
-
-
-
- m_findCompoundPairsKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,satKernelsCL, "findCompoundPairsKernel",&errNum,satProg );
+ b3Assert(errNum == CL_SUCCESS);
+
+ m_findCompoundPairsKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, satKernelsCL, "findCompoundPairsKernel", &errNum, satProg);
b3Assert(m_findCompoundPairsKernel);
- b3Assert(errNum==CL_SUCCESS);
- m_processCompoundPairsKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,satKernelsCL, "processCompoundPairsKernel",&errNum,satProg );
+ b3Assert(errNum == CL_SUCCESS);
+ m_processCompoundPairsKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, satKernelsCL, "processCompoundPairsKernel", &errNum, satProg);
b3Assert(m_processCompoundPairsKernel);
- b3Assert(errNum==CL_SUCCESS);
+ b3Assert(errNum == CL_SUCCESS);
}
if (1)
{
const char* srcClip = satClipKernelsCL;
- char flags[1024]={0};
-//#ifdef CL_PLATFORM_INTEL
-// sprintf(flags,"-g -s \"%s\"","C:/develop/bullet3_experiments2/opencl/gpu_narrowphase/kernels/satClipHullContacts.cl");
-//#endif
+ char flags[1024] = {0};
+ //#ifdef CL_PLATFORM_INTEL
+ // sprintf(flags,"-g -s \"%s\"","C:/develop/bullet3_experiments2/opencl/gpu_narrowphase/kernels/satClipHullContacts.cl");
+ //#endif
- cl_program satClipContactsProg = b3OpenCLUtils::compileCLProgramFromString(m_context,m_device,srcClip,&errNum,flags,BT_NARROWPHASE_CLIPHULL_PATH);
- b3Assert(errNum==CL_SUCCESS);
+ cl_program satClipContactsProg = b3OpenCLUtils::compileCLProgramFromString(m_context, m_device, srcClip, &errNum, flags, BT_NARROWPHASE_CLIPHULL_PATH);
+ b3Assert(errNum == CL_SUCCESS);
- m_clipHullHullKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,srcClip, "clipHullHullKernel",&errNum,satClipContactsProg);
- b3Assert(errNum==CL_SUCCESS);
+ m_clipHullHullKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, srcClip, "clipHullHullKernel", &errNum, satClipContactsProg);
+ b3Assert(errNum == CL_SUCCESS);
- m_clipCompoundsHullHullKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,srcClip, "clipCompoundsHullHullKernel",&errNum,satClipContactsProg);
- b3Assert(errNum==CL_SUCCESS);
-
+ m_clipCompoundsHullHullKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, srcClip, "clipCompoundsHullHullKernel", &errNum, satClipContactsProg);
+ b3Assert(errNum == CL_SUCCESS);
- m_findClippingFacesKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,srcClip, "findClippingFacesKernel",&errNum,satClipContactsProg);
- b3Assert(errNum==CL_SUCCESS);
+ m_findClippingFacesKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, srcClip, "findClippingFacesKernel", &errNum, satClipContactsProg);
+ b3Assert(errNum == CL_SUCCESS);
- m_clipFacesAndFindContacts = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,srcClip, "clipFacesAndFindContactsKernel",&errNum,satClipContactsProg);
- b3Assert(errNum==CL_SUCCESS);
+ m_clipFacesAndFindContacts = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, srcClip, "clipFacesAndFindContactsKernel", &errNum, satClipContactsProg);
+ b3Assert(errNum == CL_SUCCESS);
- m_clipHullHullConcaveConvexKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,srcClip, "clipHullHullConcaveConvexKernel",&errNum,satClipContactsProg);
- b3Assert(errNum==CL_SUCCESS);
+ m_clipHullHullConcaveConvexKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, srcClip, "clipHullHullConcaveConvexKernel", &errNum, satClipContactsProg);
+ b3Assert(errNum == CL_SUCCESS);
-// m_extractManifoldAndAddContactKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,srcClip, "extractManifoldAndAddContactKernel",&errNum,satClipContactsProg);
- // b3Assert(errNum==CL_SUCCESS);
+ // m_extractManifoldAndAddContactKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,srcClip, "extractManifoldAndAddContactKernel",&errNum,satClipContactsProg);
+ // b3Assert(errNum==CL_SUCCESS);
- m_newContactReductionKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,srcClip,
- "newContactReductionKernel",&errNum,satClipContactsProg);
- b3Assert(errNum==CL_SUCCESS);
+ m_newContactReductionKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, srcClip,
+ "newContactReductionKernel", &errNum, satClipContactsProg);
+ b3Assert(errNum == CL_SUCCESS);
}
- else
+ else
{
- m_clipHullHullKernel=0;
+ m_clipHullHullKernel = 0;
m_clipCompoundsHullHullKernel = 0;
- m_findClippingFacesKernel = 0;
- m_newContactReductionKernel=0;
- m_clipFacesAndFindContacts = 0;
+ m_findClippingFacesKernel = 0;
+ m_newContactReductionKernel = 0;
+ m_clipFacesAndFindContacts = 0;
m_clipHullHullConcaveConvexKernel = 0;
-// m_extractManifoldAndAddContactKernel = 0;
+ // m_extractManifoldAndAddContactKernel = 0;
}
- if (1)
+ if (1)
{
const char* srcBvh = bvhTraversalKernelCL;
- cl_program bvhTraversalProg = b3OpenCLUtils::compileCLProgramFromString(m_context,m_device,srcBvh,&errNum,"",BT_NARROWPHASE_BVH_TRAVERSAL_PATH);
- b3Assert(errNum==CL_SUCCESS);
-
- m_bvhTraversalKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,srcBvh, "bvhTraversalKernel",&errNum,bvhTraversalProg,"");
- b3Assert(errNum==CL_SUCCESS);
+ cl_program bvhTraversalProg = b3OpenCLUtils::compileCLProgramFromString(m_context, m_device, srcBvh, &errNum, "", BT_NARROWPHASE_BVH_TRAVERSAL_PATH);
+ b3Assert(errNum == CL_SUCCESS);
+ m_bvhTraversalKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, srcBvh, "bvhTraversalKernel", &errNum, bvhTraversalProg, "");
+ b3Assert(errNum == CL_SUCCESS);
}
-
- {
- const char* primitiveContactsSrc = primitiveContactsKernelsCL;
- cl_program primitiveContactsProg = b3OpenCLUtils::compileCLProgramFromString(m_context,m_device,primitiveContactsSrc,&errNum,"",BT_NARROWPHASE_PRIMITIVE_CONTACT_PATH);
- b3Assert(errNum==CL_SUCCESS);
- m_primitiveContactsKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,primitiveContactsSrc, "primitiveContactsKernel",&errNum,primitiveContactsProg,"");
- b3Assert(errNum==CL_SUCCESS);
+ {
+ const char* primitiveContactsSrc = primitiveContactsKernelsCL;
+ cl_program primitiveContactsProg = b3OpenCLUtils::compileCLProgramFromString(m_context, m_device, primitiveContactsSrc, &errNum, "", BT_NARROWPHASE_PRIMITIVE_CONTACT_PATH);
+ b3Assert(errNum == CL_SUCCESS);
+
+ m_primitiveContactsKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, primitiveContactsSrc, "primitiveContactsKernel", &errNum, primitiveContactsProg, "");
+ b3Assert(errNum == CL_SUCCESS);
- m_findConcaveSphereContactsKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,primitiveContactsSrc, "findConcaveSphereContactsKernel",&errNum,primitiveContactsProg );
- b3Assert(errNum==CL_SUCCESS);
+ m_findConcaveSphereContactsKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, primitiveContactsSrc, "findConcaveSphereContactsKernel", &errNum, primitiveContactsProg);
+ b3Assert(errNum == CL_SUCCESS);
b3Assert(m_findConcaveSphereContactsKernel);
- m_processCompoundPairsPrimitivesKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device,primitiveContactsSrc, "processCompoundPairsPrimitivesKernel",&errNum,primitiveContactsProg,"");
- b3Assert(errNum==CL_SUCCESS);
+ m_processCompoundPairsPrimitivesKernel = b3OpenCLUtils::compileCLKernelFromString(m_context, m_device, primitiveContactsSrc, "processCompoundPairsPrimitivesKernel", &errNum, primitiveContactsProg, "");
+ b3Assert(errNum == CL_SUCCESS);
b3Assert(m_processCompoundPairsPrimitivesKernel);
-
- }
-
-
+ }
}
GpuSatCollision::~GpuSatCollision()
{
-
if (m_findSeparatingAxisVertexFaceKernel)
clReleaseKernel(m_findSeparatingAxisVertexFaceKernel);
@@ -301,17 +276,15 @@ GpuSatCollision::~GpuSatCollision()
if (m_mprPenetrationKernel)
clReleaseKernel(m_mprPenetrationKernel);
-
if (m_findSeparatingAxisKernel)
clReleaseKernel(m_findSeparatingAxisKernel);
- if (m_findConcaveSeparatingAxisVertexFaceKernel)
- clReleaseKernel(m_findConcaveSeparatingAxisVertexFaceKernel);
+ if (m_findConcaveSeparatingAxisVertexFaceKernel)
+ clReleaseKernel(m_findConcaveSeparatingAxisVertexFaceKernel);
+
+ if (m_findConcaveSeparatingAxisEdgeEdgeKernel)
+ clReleaseKernel(m_findConcaveSeparatingAxisEdgeEdgeKernel);
-
- if (m_findConcaveSeparatingAxisEdgeEdgeKernel)
- clReleaseKernel(m_findConcaveSeparatingAxisEdgeEdgeKernel);
-
if (m_findConcaveSeparatingAxisKernel)
clReleaseKernel(m_findConcaveSeparatingAxisKernel);
@@ -320,17 +293,17 @@ GpuSatCollision::~GpuSatCollision()
if (m_processCompoundPairsKernel)
clReleaseKernel(m_processCompoundPairsKernel);
-
- if (m_findClippingFacesKernel)
- clReleaseKernel(m_findClippingFacesKernel);
-
- if (m_clipFacesAndFindContacts)
- clReleaseKernel(m_clipFacesAndFindContacts);
- if (m_newContactReductionKernel)
- clReleaseKernel(m_newContactReductionKernel);
+
+ if (m_findClippingFacesKernel)
+ clReleaseKernel(m_findClippingFacesKernel);
+
+ if (m_clipFacesAndFindContacts)
+ clReleaseKernel(m_clipFacesAndFindContacts);
+ if (m_newContactReductionKernel)
+ clReleaseKernel(m_newContactReductionKernel);
if (m_primitiveContactsKernel)
clReleaseKernel(m_primitiveContactsKernel);
-
+
if (m_findConcaveSphereContactsKernel)
clReleaseKernel(m_findConcaveSphereContactsKernel);
@@ -344,12 +317,11 @@ GpuSatCollision::~GpuSatCollision()
if (m_clipHullHullConcaveConvexKernel)
clReleaseKernel(m_clipHullHullConcaveConvexKernel);
-// if (m_extractManifoldAndAddContactKernel)
+ // if (m_extractManifoldAndAddContactKernel)
// clReleaseKernel(m_extractManifoldAndAddContactKernel);
if (m_bvhTraversalKernel)
clReleaseKernel(m_bvhTraversalKernel);
-
}
struct MyTriangleCallback : public b3NodeOverlapCallback
@@ -359,14 +331,13 @@ struct MyTriangleCallback : public b3NodeOverlapCallback
virtual void processNode(int subPart, int triangleIndex)
{
- printf("bodyIndexA %d, bodyIndexB %d\n",m_bodyIndexA,m_bodyIndexB);
+ printf("bodyIndexA %d, bodyIndexB %d\n", m_bodyIndexA, m_bodyIndexB);
printf("triangleIndex %d\n", triangleIndex);
}
};
-
#define float4 b3Vector3
-#define make_float4(x,y,z,w) b3MakeVector3(x,y,z,w)
+#define make_float4(x, y, z, w) b3MakeVector3(x, y, z, w)
float signedDistanceFromPointToPlane(const float4& point, const float4& planeEqn, float4* closestPointOnFace)
{
@@ -377,9 +348,7 @@ float signedDistanceFromPointToPlane(const float4& point, const float4& planeEqn
return dist;
}
-
-
-#define cross3(a,b) (a.cross(b))
+#define cross3(a, b) (a.cross(b))
b3Vector3 transform(const b3Vector3* v, const b3Vector3* pos, const b3Quaternion* orn)
{
b3Transform tr;
@@ -390,184 +359,170 @@ b3Vector3 transform(const b3Vector3* v, const b3Vector3* pos, const b3Quaternion
return res;
}
-
-inline bool IsPointInPolygon(const float4& p,
- const b3GpuFace* face,
+inline bool IsPointInPolygon(const float4& p,
+ const b3GpuFace* face,
const float4* baseVertex,
- const int* convexIndices,
- float4* out)
+ const int* convexIndices,
+ float4* out)
{
- float4 a;
- float4 b;
- float4 ab;
- float4 ap;
- float4 v;
+ float4 a;
+ float4 b;
+ float4 ab;
+ float4 ap;
+ float4 v;
- float4 plane = b3MakeVector3(face->m_plane.x,face->m_plane.y,face->m_plane.z,0.f);
-
- if (face->m_numIndices<2)
+ float4 plane = b3MakeVector3(face->m_plane.x, face->m_plane.y, face->m_plane.z, 0.f);
+
+ if (face->m_numIndices < 2)
return false;
-
- float4 v0 = baseVertex[convexIndices[face->m_indexOffset + face->m_numIndices-1]];
+ float4 v0 = baseVertex[convexIndices[face->m_indexOffset + face->m_numIndices - 1]];
b = v0;
- for(unsigned i=0; i != face->m_numIndices; ++i)
- {
+ for (unsigned i = 0; i != face->m_numIndices; ++i)
+ {
a = b;
float4 vi = baseVertex[convexIndices[face->m_indexOffset + i]];
b = vi;
- ab = b-a;
- ap = p-a;
- v = cross3(ab,plane);
-
- if (b3Dot(ap, v) > 0.f)
- {
- float ab_m2 = b3Dot(ab, ab);
- float rt = ab_m2 != 0.f ? b3Dot(ab, ap) / ab_m2 : 0.f;
- if (rt <= 0.f)
- {
- *out = a;
- }
- else if (rt >= 1.f)
- {
- *out = b;
- }
- else
- {
- float s = 1.f - rt;
+ ab = b - a;
+ ap = p - a;
+ v = cross3(ab, plane);
+
+ if (b3Dot(ap, v) > 0.f)
+ {
+ float ab_m2 = b3Dot(ab, ab);
+ float rt = ab_m2 != 0.f ? b3Dot(ab, ap) / ab_m2 : 0.f;
+ if (rt <= 0.f)
+ {
+ *out = a;
+ }
+ else if (rt >= 1.f)
+ {
+ *out = b;
+ }
+ else
+ {
+ float s = 1.f - rt;
out[0].x = s * a.x + rt * b.x;
out[0].y = s * a.y + rt * b.y;
out[0].z = s * a.z + rt * b.z;
- }
- return false;
- }
- }
- return true;
+ }
+ return false;
+ }
+ }
+ return true;
}
#define normalize3(a) (a.normalize())
-
-int extractManifoldSequentialGlobal( const float4* p, int nPoints, const float4& nearNormal, b3Int4* contactIdx)
+int extractManifoldSequentialGlobal(const float4* p, int nPoints, const float4& nearNormal, b3Int4* contactIdx)
{
- if( nPoints == 0 )
- return 0;
-
- if (nPoints <=4)
- return nPoints;
-
-
- if (nPoints >64)
- nPoints = 64;
-
- float4 center = b3MakeVector3(0,0,0,0);
+ if (nPoints == 0)
+ return 0;
+
+ if (nPoints <= 4)
+ return nPoints;
+
+ if (nPoints > 64)
+ nPoints = 64;
+
+ float4 center = b3MakeVector3(0, 0, 0, 0);
{
-
- for (int i=0;i<nPoints;i++)
+ for (int i = 0; i < nPoints; i++)
center += p[i];
center /= (float)nPoints;
}
-
-
-
+
// sample 4 directions
-
- float4 aVector = p[0] - center;
- float4 u = cross3( nearNormal, aVector );
- float4 v = cross3( nearNormal, u );
- u = normalize3( u );
- v = normalize3( v );
-
-
- //keep point with deepest penetration
- float minW= FLT_MAX;
-
- int minIndex=-1;
-
- float4 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;
- float4 r = p[ie]-center;
- f = dot3F4( u, r );
- if (f<maxDots.x)
- {
- maxDots.x = f;
- contactIdx[0].x = ie;
- }
-
- f = dot3F4( -u, r );
- if (f<maxDots.y)
- {
- maxDots.y = f;
- contactIdx[0].y = ie;
- }
-
-
- f = dot3F4( v, r );
- if (f<maxDots.z)
- {
- maxDots.z = f;
- contactIdx[0].z = ie;
- }
-
- f = dot3F4( -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;
-
-}
+ float4 aVector = p[0] - center;
+ float4 u = cross3(nearNormal, aVector);
+ float4 v = cross3(nearNormal, u);
+ u = normalize3(u);
+ v = normalize3(v);
+ //keep point with deepest penetration
+ float minW = FLT_MAX;
-#define MAX_VERTS 1024
+ int minIndex = -1;
+
+ float4 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;
+ float4 r = p[ie] - center;
+ f = dot3F4(u, r);
+ if (f < maxDots.x)
+ {
+ maxDots.x = f;
+ contactIdx[0].x = ie;
+ }
+
+ f = dot3F4(-u, r);
+ if (f < maxDots.y)
+ {
+ maxDots.y = f;
+ contactIdx[0].y = ie;
+ }
+
+ f = dot3F4(v, r);
+ if (f < maxDots.z)
+ {
+ maxDots.z = f;
+ contactIdx[0].z = ie;
+ }
+
+ f = dot3F4(-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;
+}
+#define MAX_VERTS 1024
-inline void project(const b3ConvexPolyhedronData& hull, const float4& pos, const b3Quaternion& orn, const float4& dir, const b3AlignedObjectArray<b3Vector3>& vertices, b3Scalar& min, b3Scalar& max)
+inline void project(const b3ConvexPolyhedronData& hull, const float4& pos, const b3Quaternion& orn, const float4& dir, const b3AlignedObjectArray<b3Vector3>& vertices, b3Scalar& min, b3Scalar& max)
{
min = FLT_MAX;
max = -FLT_MAX;
int numVerts = hull.m_numVertices;
- const float4 localDir = b3QuatRotate(orn.inverse(),dir);
+ const float4 localDir = b3QuatRotate(orn.inverse(), dir);
- b3Scalar offset = dot3F4(pos,dir);
+ b3Scalar offset = dot3F4(pos, dir);
- for(int i=0;i<numVerts;i++)
+ 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 = dot3F4((float4&)vertices[hull.m_vertexOffset+i],localDir);
+ b3Scalar dp = dot3F4((float4&)vertices[hull.m_vertexOffset + i], localDir);
//b3Assert(dp==dpL);
- if(dp < min) min = dp;
- if(dp > max) max = dp;
+ if (dp < min) min = dp;
+ if (dp > max) max = dp;
}
- if(min>max)
+ if (min > max)
{
b3Scalar tmp = min;
min = max;
@@ -577,50 +532,48 @@ inline void project(const b3ConvexPolyhedronData& hull, const float4& pos, cons
max += offset;
}
-
-static bool TestSepAxis(const b3ConvexPolyhedronData& hullA, const b3ConvexPolyhedronData& hullB,
- const float4& posA,const b3Quaternion& ornA,
- const float4& posB,const b3Quaternion& ornB,
- const float4& sep_axis, const b3AlignedObjectArray<b3Vector3>& verticesA,const b3AlignedObjectArray<b3Vector3>& verticesB,b3Scalar& depth)
+static bool TestSepAxis(const b3ConvexPolyhedronData& hullA, const b3ConvexPolyhedronData& hullB,
+ const float4& posA, const b3Quaternion& ornA,
+ const float4& posB, const b3Quaternion& ornB,
+ const float4& sep_axis, const b3AlignedObjectArray<b3Vector3>& verticesA, const b3AlignedObjectArray<b3Vector3>& verticesB, b3Scalar& depth)
{
- b3Scalar Min0,Max0;
- b3Scalar Min1,Max1;
- project(hullA,posA,ornA,sep_axis,verticesA, Min0, Max0);
- project(hullB,posB,ornB, sep_axis,verticesB, Min1, Max1);
+ b3Scalar Min0, Max0;
+ b3Scalar Min1, Max1;
+ project(hullA, posA, ornA, sep_axis, verticesA, Min0, Max0);
+ project(hullB, posB, ornB, sep_axis, verticesB, Min1, Max1);
- if(Max0<Min1 || Max1<Min0)
+ if (Max0 < Min1 || Max1 < Min0)
return false;
b3Scalar d0 = Max0 - Min1;
- assert(d0>=0.0f);
+ assert(d0 >= 0.0f);
b3Scalar d1 = Max1 - Min0;
- assert(d1>=0.0f);
- depth = d0<d1 ? d0:d1;
+ assert(d1 >= 0.0f);
+ depth = d0 < d1 ? d0 : d1;
return true;
}
inline bool IsAlmostZero(const b3Vector3& v)
{
- if(fabsf(v.x)>1e-6 || fabsf(v.y)>1e-6 || fabsf(v.z)>1e-6) return false;
+ if (fabsf(v.x) > 1e-6 || fabsf(v.y) > 1e-6 || fabsf(v.z) > 1e-6) return false;
return true;
}
-
-static bool findSeparatingAxis( const b3ConvexPolyhedronData& hullA, const b3ConvexPolyhedronData& hullB,
- const float4& posA1,
- const b3Quaternion& ornA,
- const float4& posB1,
- const b3Quaternion& ornB,
- const b3AlignedObjectArray<b3Vector3>& verticesA,
- const b3AlignedObjectArray<b3Vector3>& uniqueEdgesA,
- const b3AlignedObjectArray<b3GpuFace>& facesA,
- const b3AlignedObjectArray<int>& indicesA,
- const b3AlignedObjectArray<b3Vector3>& verticesB,
- const b3AlignedObjectArray<b3Vector3>& uniqueEdgesB,
- const b3AlignedObjectArray<b3GpuFace>& facesB,
- const b3AlignedObjectArray<int>& indicesB,
-
- b3Vector3& sep)
+static bool findSeparatingAxis(const b3ConvexPolyhedronData& hullA, const b3ConvexPolyhedronData& hullB,
+ const float4& posA1,
+ const b3Quaternion& ornA,
+ const float4& posB1,
+ const b3Quaternion& ornB,
+ const b3AlignedObjectArray<b3Vector3>& verticesA,
+ const b3AlignedObjectArray<b3Vector3>& uniqueEdgesA,
+ const b3AlignedObjectArray<b3GpuFace>& facesA,
+ const b3AlignedObjectArray<int>& indicesA,
+ const b3AlignedObjectArray<b3Vector3>& verticesB,
+ const b3AlignedObjectArray<b3Vector3>& uniqueEdgesB,
+ const b3AlignedObjectArray<b3GpuFace>& facesB,
+ const b3AlignedObjectArray<int>& indicesB,
+
+ b3Vector3& sep)
{
B3_PROFILE("findSeparatingAxis");
@@ -629,41 +582,40 @@ static bool findSeparatingAxis( const b3ConvexPolyhedronData& hullA, const b3Con
posA.w = 0.f;
float4 posB = posB1;
posB.w = 0.f;
-//#ifdef TEST_INTERNAL_OBJECTS
+ //#ifdef TEST_INTERNAL_OBJECTS
float4 c0local = (float4&)hullA.m_localCenter;
float4 c0 = transform(&c0local, &posA, &ornA);
float4 c1local = (float4&)hullB.m_localCenter;
- float4 c1 = transform(&c1local,&posB,&ornB);
+ float4 c1 = transform(&c1local, &posB, &ornB);
const float4 deltaC2 = c0 - c1;
-//#endif
+ //#endif
b3Scalar dmin = FLT_MAX;
- int curPlaneTests=0;
+ int curPlaneTests = 0;
int numFacesA = hullA.m_numFaces;
// Test normals from hullA
- for(int i=0;i<numFacesA;i++)
+ for (int i = 0; i < numFacesA; i++)
{
- const float4& normal = (float4&)facesA[hullA.m_faceOffset+i].m_plane;
- float4 faceANormalWS = b3QuatRotate(ornA,normal);
+ const float4& normal = (float4&)facesA[hullA.m_faceOffset + i].m_plane;
+ float4 faceANormalWS = b3QuatRotate(ornA, normal);
- if (dot3F4(deltaC2,faceANormalWS)<0)
- faceANormalWS*=-1.f;
+ if (dot3F4(deltaC2, faceANormalWS) < 0)
+ faceANormalWS *= -1.f;
curPlaneTests++;
#ifdef TEST_INTERNAL_OBJECTS
gExpectedNbTests++;
- if(gUseInternalObject && !TestInternalObjects(transA,transB, DeltaC2, faceANormalWS, hullA, hullB, dmin))
+ if (gUseInternalObject && !TestInternalObjects(transA, transB, DeltaC2, faceANormalWS, hullA, hullB, dmin))
continue;
gActualNbTests++;
#endif
-
b3Scalar d;
- if(!TestSepAxis( hullA, hullB, posA,ornA,posB,ornB,faceANormalWS, verticesA, verticesB,d))
+ if (!TestSepAxis(hullA, hullB, posA, ornA, posB, ornB, faceANormalWS, verticesA, verticesB, d))
return false;
- if(d<dmin)
+ if (d < dmin)
{
dmin = d;
sep = (b3Vector3&)faceANormalWS;
@@ -672,28 +624,28 @@ static bool findSeparatingAxis( const b3ConvexPolyhedronData& hullA, const b3Con
int numFacesB = hullB.m_numFaces;
// Test normals from hullB
- for(int i=0;i<numFacesB;i++)
+ for (int i = 0; i < numFacesB; i++)
{
- float4 normal = (float4&)facesB[hullB.m_faceOffset+i].m_plane;
+ float4 normal = (float4&)facesB[hullB.m_faceOffset + i].m_plane;
float4 WorldNormal = b3QuatRotate(ornB, normal);
- if (dot3F4(deltaC2,WorldNormal)<0)
+ if (dot3F4(deltaC2, WorldNormal) < 0)
{
- WorldNormal*=-1.f;
+ WorldNormal *= -1.f;
}
curPlaneTests++;
#ifdef TEST_INTERNAL_OBJECTS
gExpectedNbTests++;
- if(gUseInternalObject && !TestInternalObjects(transA,transB,DeltaC2, WorldNormal, hullA, hullB, dmin))
+ if (gUseInternalObject && !TestInternalObjects(transA, transB, DeltaC2, WorldNormal, hullA, hullB, dmin))
continue;
gActualNbTests++;
#endif
b3Scalar d;
- if(!TestSepAxis(hullA, hullB,posA,ornA,posB,ornB,WorldNormal,verticesA,verticesB,d))
+ if (!TestSepAxis(hullA, hullB, posA, ornA, posB, ornB, WorldNormal, verticesA, verticesB, d))
return false;
- if(d<dmin)
+ if (d < dmin)
{
dmin = d;
sep = (b3Vector3&)WorldNormal;
@@ -702,70 +654,65 @@ static bool findSeparatingAxis( const b3ConvexPolyhedronData& hullA, const b3Con
int curEdgeEdge = 0;
// Test edges
- for(int e0=0;e0<hullA.m_numUniqueEdges;e0++)
+ for (int e0 = 0; e0 < hullA.m_numUniqueEdges; e0++)
{
- const float4& edge0 = (float4&) uniqueEdgesA[hullA.m_uniqueEdgesOffset+e0];
- float4 edge0World = b3QuatRotate(ornA,(float4&)edge0);
+ const float4& edge0 = (float4&)uniqueEdgesA[hullA.m_uniqueEdgesOffset + e0];
+ float4 edge0World = b3QuatRotate(ornA, (float4&)edge0);
- for(int e1=0;e1<hullB.m_numUniqueEdges;e1++)
+ for (int e1 = 0; e1 < hullB.m_numUniqueEdges; e1++)
{
- const b3Vector3 edge1 = uniqueEdgesB[hullB.m_uniqueEdgesOffset+e1];
- float4 edge1World = b3QuatRotate(ornB,(float4&)edge1);
-
+ const b3Vector3 edge1 = uniqueEdgesB[hullB.m_uniqueEdgesOffset + e1];
+ float4 edge1World = b3QuatRotate(ornB, (float4&)edge1);
- float4 crossje = cross3(edge0World,edge1World);
+ float4 crossje = cross3(edge0World, edge1World);
curEdgeEdge++;
- if(!IsAlmostZero((b3Vector3&)crossje))
+ if (!IsAlmostZero((b3Vector3&)crossje))
{
crossje = normalize3(crossje);
- if (dot3F4(deltaC2,crossje)<0)
- crossje*=-1.f;
-
+ if (dot3F4(deltaC2, crossje) < 0)
+ crossje *= -1.f;
#ifdef TEST_INTERNAL_OBJECTS
gExpectedNbTests++;
- if(gUseInternalObject && !TestInternalObjects(transA,transB,DeltaC2, Cross, hullA, hullB, dmin))
+ if (gUseInternalObject && !TestInternalObjects(transA, transB, DeltaC2, Cross, hullA, hullB, dmin))
continue;
gActualNbTests++;
#endif
b3Scalar dist;
- if(!TestSepAxis( hullA, hullB, posA,ornA,posB,ornB,crossje, verticesA,verticesB,dist))
+ if (!TestSepAxis(hullA, hullB, posA, ornA, posB, ornB, crossje, verticesA, verticesB, dist))
return false;
- if(dist<dmin)
+ if (dist < dmin)
{
dmin = dist;
sep = (b3Vector3&)crossje;
}
}
}
-
}
-
- if((dot3F4(-deltaC2,(float4&)sep))>0.0f)
+ if ((dot3F4(-deltaC2, (float4&)sep)) > 0.0f)
sep = -sep;
return true;
}
-
-bool findSeparatingAxisEdgeEdge( __global const b3ConvexPolyhedronData* hullA, __global const b3ConvexPolyhedronData* hullB,
- const b3Float4& posA1,
- const b3Quat& ornA,
- const b3Float4& posB1,
- const b3Quat& ornB,
- const b3Float4& DeltaC2,
- __global const b3AlignedObjectArray<float4>& vertices,
- __global const b3AlignedObjectArray<float4>& uniqueEdges,
- __global const b3AlignedObjectArray<b3GpuFace>& faces,
- __global const b3AlignedObjectArray<int>& indices,
- float4* sep,
- float* dmin)
+bool findSeparatingAxisEdgeEdge(__global const b3ConvexPolyhedronData* hullA, __global const b3ConvexPolyhedronData* hullB,
+ const b3Float4& posA1,
+ const b3Quat& ornA,
+ const b3Float4& posB1,
+ const b3Quat& ornB,
+ const b3Float4& DeltaC2,
+ __global const b3AlignedObjectArray<float4>& vertices,
+ __global const b3AlignedObjectArray<float4>& uniqueEdges,
+ __global const b3AlignedObjectArray<b3GpuFace>& faces,
+ __global const b3AlignedObjectArray<int>& indices,
+ float4* sep,
+ float* dmin)
{
-// int i = get_global_id(0);
+ // int i = get_global_id(0);
float4 posA = posA1;
posA.w = 0.f;
@@ -776,97 +723,89 @@ bool findSeparatingAxisEdgeEdge( __global const b3ConvexPolyhedronData* hullA, _
int curEdgeEdge = 0;
// Test edges
- for(int e0=0;e0<hullA->m_numUniqueEdges;e0++)
+ for (int e0 = 0; e0 < hullA->m_numUniqueEdges; e0++)
{
- const float4 edge0 = uniqueEdges[hullA->m_uniqueEdgesOffset+e0];
- float4 edge0World = b3QuatRotate(ornA,edge0);
+ const float4 edge0 = uniqueEdges[hullA->m_uniqueEdgesOffset + e0];
+ float4 edge0World = b3QuatRotate(ornA, edge0);
- for(int e1=0;e1<hullB->m_numUniqueEdges;e1++)
+ for (int e1 = 0; e1 < hullB->m_numUniqueEdges; e1++)
{
- const float4 edge1 = uniqueEdges[hullB->m_uniqueEdgesOffset+e1];
- float4 edge1World = b3QuatRotate(ornB,edge1);
+ const float4 edge1 = uniqueEdges[hullB->m_uniqueEdgesOffset + e1];
+ float4 edge1World = b3QuatRotate(ornB, edge1);
-
- float4 crossje = cross3(edge0World,edge1World);
+ float4 crossje = cross3(edge0World, edge1World);
curEdgeEdge++;
- if(!IsAlmostZero(crossje))
+ if (!IsAlmostZero(crossje))
{
crossje = normalize3(crossje);
- if (dot3F4(DeltaC2,crossje)<0)
- crossje*=-1.f;
-
+ if (dot3F4(DeltaC2, crossje) < 0)
+ crossje *= -1.f;
+
float dist;
bool result = true;
{
- float Min0,Max0;
- float Min1,Max1;
- project(*hullA,posA,ornA,crossje,vertices, Min0, Max0);
- project(*hullB,posB,ornB,crossje,vertices, Min1, Max1);
-
- if(Max0<Min1 || Max1<Min0)
+ float Min0, Max0;
+ float Min1, Max1;
+ project(*hullA, posA, ornA, crossje, vertices, Min0, Max0);
+ project(*hullB, posB, ornB, crossje, vertices, Min1, Max1);
+
+ if (Max0 < Min1 || Max1 < Min0)
result = false;
-
+
float d0 = Max0 - Min1;
float d1 = Max1 - Min0;
- dist = d0<d1 ? d0:d1;
+ dist = d0 < d1 ? d0 : d1;
result = true;
-
}
-
- if(dist<*dmin)
+ if (dist < *dmin)
{
*dmin = dist;
*sep = crossje;
}
}
}
-
}
-
- if((dot3F4(-DeltaC2,*sep))>0.0f)
+ if ((dot3F4(-DeltaC2, *sep)) > 0.0f)
{
*sep = -(*sep);
}
return true;
}
-
-__inline float4 lerp3(const float4& a,const float4& b, float t)
+__inline float4 lerp3(const float4& a, const float4& 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);
+ 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
-int clipFace(const float4* pVtxIn, int numVertsIn, float4& planeNormalWS,float planeEqWS, float4* ppVtxOut)
+int clipFace(const float4* pVtxIn, int numVertsIn, float4& planeNormalWS, float planeEqWS, float4* ppVtxOut)
{
-
int ve;
float ds, de;
int numVertsOut = 0;
if (numVertsIn < 2)
return 0;
- float4 firstVertex=pVtxIn[numVertsIn-1];
+ float4 firstVertex = pVtxIn[numVertsIn - 1];
float4 endVertex = pVtxIn[0];
-
- ds = dot3F4(planeNormalWS,firstVertex)+planeEqWS;
+
+ ds = dot3F4(planeNormalWS, firstVertex) + planeEqWS;
for (ve = 0; ve < numVertsIn; ve++)
{
- endVertex=pVtxIn[ve];
+ endVertex = pVtxIn[ve];
- de = dot3F4(planeNormalWS,endVertex)+planeEqWS;
+ de = dot3F4(planeNormalWS, endVertex) + planeEqWS;
- if (ds<0)
+ if (ds < 0)
{
- if (de<0)
+ if (de < 0)
{
// Start < 0, end < 0, so output endVertex
ppVtxOut[numVertsOut++] = endVertex;
@@ -874,15 +813,15 @@ int clipFace(const float4* pVtxIn, int numVertsIn, float4& planeNormalWS,float p
else
{
// Start < 0, end >= 0, so output intersection
- ppVtxOut[numVertsOut++] = lerp3(firstVertex, endVertex,(ds * 1.f/(ds - de)) );
+ ppVtxOut[numVertsOut++] = lerp3(firstVertex, endVertex, (ds * 1.f / (ds - de)));
}
}
else
{
- if (de<0)
+ if (de < 0)
{
// Start >= 0, end < 0 so output intersection and end
- ppVtxOut[numVertsOut++] = lerp3(firstVertex, endVertex,(ds * 1.f/(ds - de)) );
+ ppVtxOut[numVertsOut++] = lerp3(firstVertex, endVertex, (ds * 1.f / (ds - de)));
ppVtxOut[numVertsOut++] = endVertex;
}
}
@@ -892,36 +831,35 @@ int clipFace(const float4* pVtxIn, int numVertsIn, float4& planeNormalWS,float p
return numVertsOut;
}
-
-int clipFaceAgainstHull(const float4& separatingNormal, const b3ConvexPolyhedronData* hullA,
- const float4& posA, const b3Quaternion& ornA, float4* worldVertsB1, int numWorldVertsB1,
- float4* worldVertsB2, int capacityWorldVertsB2,
- const float minDist, float maxDist,
- const b3AlignedObjectArray<float4>& verticesA, const b3AlignedObjectArray<b3GpuFace>& facesA, const b3AlignedObjectArray<int>& indicesA,
- //const float4* verticesB, const b3GpuFace* facesB, const int* indicesB,
- float4* contactsOut,
- int contactCapacity)
+int clipFaceAgainstHull(const float4& separatingNormal, const b3ConvexPolyhedronData* hullA,
+ const float4& posA, const b3Quaternion& ornA, float4* worldVertsB1, int numWorldVertsB1,
+ float4* worldVertsB2, int capacityWorldVertsB2,
+ const float minDist, float maxDist,
+ const b3AlignedObjectArray<float4>& verticesA, const b3AlignedObjectArray<b3GpuFace>& facesA, const b3AlignedObjectArray<int>& indicesA,
+ //const float4* verticesB, const b3GpuFace* facesB, const int* indicesB,
+ float4* contactsOut,
+ int contactCapacity)
{
int numContactsOut = 0;
float4* pVtxIn = worldVertsB1;
float4* pVtxOut = worldVertsB2;
-
+
int numVertsIn = numWorldVertsB1;
int numVertsOut = 0;
- int closestFaceA=-1;
+ int closestFaceA = -1;
{
float dmin = FLT_MAX;
- for(int face=0;face<hullA->m_numFaces;face++)
+ for (int face = 0; face < hullA->m_numFaces; face++)
{
const float4 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 float4 faceANormalWS = b3QuatRotate(ornA,Normal);
-
- float d = dot3F4(faceANormalWS,separatingNormal);
+ 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 float4 faceANormalWS = b3QuatRotate(ornA, Normal);
+
+ float d = dot3F4(faceANormalWS, separatingNormal);
if (d < dmin)
{
dmin = d;
@@ -929,33 +867,33 @@ int clipFaceAgainstHull(const float4& separatingNormal, const b3ConvexPolyhedron
}
}
}
- if (closestFaceA<0)
+ if (closestFaceA < 0)
return numContactsOut;
- b3GpuFace polyA = facesA[hullA->m_faceOffset+closestFaceA];
+ 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 numContacts = numWorldVertsB1;
int numVerticesA = polyA.m_numIndices;
- for(int e0=0;e0<numVerticesA;e0++)
+ for (int e0 = 0; e0 < numVerticesA; e0++)
{
- const float4 a = verticesA[hullA->m_vertexOffset+indicesA[polyA.m_indexOffset+e0]];
- const float4 b = verticesA[hullA->m_vertexOffset+indicesA[polyA.m_indexOffset+((e0+1)%numVerticesA)]];
+ const float4 a = verticesA[hullA->m_vertexOffset + indicesA[polyA.m_indexOffset + e0]];
+ const float4 b = verticesA[hullA->m_vertexOffset + indicesA[polyA.m_indexOffset + ((e0 + 1) % numVerticesA)]];
const float4 edge0 = a - b;
- const float4 WorldEdge0 = b3QuatRotate(ornA,edge0);
- float4 planeNormalA = make_float4(polyA.m_plane.x,polyA.m_plane.y,polyA.m_plane.z,0.f);
- float4 worldPlaneAnormal1 = b3QuatRotate(ornA,planeNormalA);
+ const float4 WorldEdge0 = b3QuatRotate(ornA, edge0);
+ float4 planeNormalA = make_float4(polyA.m_plane.x, polyA.m_plane.y, polyA.m_plane.z, 0.f);
+ float4 worldPlaneAnormal1 = b3QuatRotate(ornA, planeNormalA);
+
+ float4 planeNormalWS1 = -cross3(WorldEdge0, worldPlaneAnormal1);
+ float4 worldA1 = transform(&a, &posA, &ornA);
+ float planeEqWS1 = -dot3F4(worldA1, planeNormalWS1);
- float4 planeNormalWS1 = -cross3(WorldEdge0,worldPlaneAnormal1);
- float4 worldA1 = transform(&a,&posA,&ornA);
- float planeEqWS1 = -dot3F4(worldA1,planeNormalWS1);
-
float4 planeNormalWS = planeNormalWS1;
- float planeEqWS=planeEqWS1;
-
+ float planeEqWS = planeEqWS1;
+
//clip face
//clipFace(*pVtxIn, *pVtxOut,planeNormalWS,planeEqWS);
- numVertsOut = clipFace(pVtxIn, numVertsIn, planeNormalWS,planeEqWS, pVtxOut);
+ numVertsOut = clipFace(pVtxIn, numVertsIn, planeNormalWS, planeEqWS, pVtxOut);
//btSwap(pVtxIn,pVtxOut);
float4* tmp = pVtxOut;
@@ -965,32 +903,32 @@ int clipFaceAgainstHull(const float4& separatingNormal, const b3ConvexPolyhedron
numVertsOut = 0;
}
-
// only keep points that are behind the witness face
{
- float4 localPlaneNormal = make_float4(polyA.m_plane.x,polyA.m_plane.y,polyA.m_plane.z,0.f);
+ float4 localPlaneNormal = make_float4(polyA.m_plane.x, polyA.m_plane.y, polyA.m_plane.z, 0.f);
float localPlaneEq = polyA.m_plane.w;
- float4 planeNormalWS = b3QuatRotate(ornA,localPlaneNormal);
- float planeEqWS=localPlaneEq-dot3F4(planeNormalWS,posA);
- for (int i=0;i<numVertsIn;i++)
+ float4 planeNormalWS = b3QuatRotate(ornA, localPlaneNormal);
+ float planeEqWS = localPlaneEq - dot3F4(planeNormalWS, posA);
+ for (int i = 0; i < numVertsIn; i++)
{
- float depth = dot3F4(planeNormalWS,pVtxIn[i])+planeEqWS;
- if (depth <=minDist)
+ float depth = dot3F4(planeNormalWS, pVtxIn[i]) + planeEqWS;
+ if (depth <= minDist)
{
depth = minDist;
}
- if (numContactsOut<contactCapacity)
+ if (numContactsOut < contactCapacity)
{
- if (depth <=maxDist)
+ if (depth <= maxDist)
{
float4 pointInWorld = pVtxIn[i];
//resultOut.addContactPoint(separatingNormal,point,depth);
- contactsOut[numContactsOut++] = b3MakeVector3(pointInWorld.x,pointInWorld.y,pointInWorld.z,depth);
+ contactsOut[numContactsOut++] = b3MakeVector3(pointInWorld.x, pointInWorld.y, pointInWorld.z, depth);
//printf("depth=%f\n",depth);
}
- } else
+ }
+ else
{
- b3Error("exceeding contact capacity (%d,%df)\n", numContactsOut,contactCapacity);
+ b3Error("exceeding contact capacity (%d,%df)\n", numContactsOut, contactCapacity);
}
}
}
@@ -998,62 +936,60 @@ int clipFaceAgainstHull(const float4& separatingNormal, const b3ConvexPolyhedron
return numContactsOut;
}
+static int clipHullAgainstHull(const float4& separatingNormal,
+ const b3ConvexPolyhedronData& hullA, const b3ConvexPolyhedronData& hullB,
+ const float4& posA, const b3Quaternion& ornA, const float4& posB, const b3Quaternion& ornB,
+ float4* worldVertsB1, float4* worldVertsB2, int capacityWorldVerts,
+ const float minDist, float maxDist,
+ const b3AlignedObjectArray<float4>& verticesA, const b3AlignedObjectArray<b3GpuFace>& facesA, const b3AlignedObjectArray<int>& indicesA,
+ const b3AlignedObjectArray<float4>& verticesB, const b3AlignedObjectArray<b3GpuFace>& facesB, const b3AlignedObjectArray<int>& indicesB,
-
-static int clipHullAgainstHull(const float4& separatingNormal,
- const b3ConvexPolyhedronData& hullA, const b3ConvexPolyhedronData& hullB,
- const float4& posA, const b3Quaternion& ornA,const float4& posB, const b3Quaternion& ornB,
- float4* worldVertsB1, float4* worldVertsB2, int capacityWorldVerts,
- const float minDist, float maxDist,
- const b3AlignedObjectArray<float4>& verticesA, const b3AlignedObjectArray<b3GpuFace>& facesA, const b3AlignedObjectArray<int>& indicesA,
- const b3AlignedObjectArray<float4>& verticesB, const b3AlignedObjectArray<b3GpuFace>& facesB, const b3AlignedObjectArray<int>& indicesB,
-
- float4* contactsOut,
- int contactCapacity)
+ float4* contactsOut,
+ int contactCapacity)
{
int numContactsOut = 0;
- int numWorldVertsB1= 0;
-
+ int numWorldVertsB1 = 0;
+
B3_PROFILE("clipHullAgainstHull");
-// float curMaxDist=maxDist;
- int closestFaceB=-1;
+ // float curMaxDist=maxDist;
+ int closestFaceB = -1;
float dmax = -FLT_MAX;
{
//B3_PROFILE("closestFaceB");
- if (hullB.m_numFaces!=1)
+ 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++)
+
+ 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];
+ printf("face %d\n", face);
+ const b3GpuFace* faceB = &facesB[hullB.m_faceOffset + face];
if (once)
{
- for (int i=0;i<faceB->m_numIndices;i++)
+ for (int i = 0; i < faceB->m_numIndices; i++)
{
- float4 vert = verticesB[hullB.m_vertexOffset+indicesB[faceB->m_indexOffset+i]];
- printf("vert[%d] = %f,%f,%f\n",i,vert.x,vert.y,vert.z);
+ float4 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)
+#endif //BT_DEBUG_SAT_FACE \
+ //if (facesB[hullB.m_faceOffset+face].m_numIndices>2)
{
- const float4 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 float4 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 float4 WorldNormal = b3QuatRotate(ornB, Normal);
#ifdef BT_DEBUG_SAT_FACE
if (once)
- printf("faceNormal = %f,%f,%f\n",Normal.x,Normal.y,Normal.z);
+ printf("faceNormal = %f,%f,%f\n", Normal.x, Normal.y, Normal.z);
#endif
- float d = dot3F4(WorldNormal,separatingNormal);
+ float d = dot3F4(WorldNormal, separatingNormal);
if (d > dmax)
{
dmax = d;
@@ -1064,184 +1000,176 @@ static int clipHullAgainstHull(const float4& separatingNormal,
once = false;
}
-
- b3Assert(closestFaceB>=0);
+ b3Assert(closestFaceB >= 0);
{
//B3_PROFILE("worldVertsB1");
- const b3GpuFace& polyB = facesB[hullB.m_faceOffset+closestFaceB];
+ const b3GpuFace& polyB = facesB[hullB.m_faceOffset + closestFaceB];
const int numVertices = polyB.m_numIndices;
- for(int e0=0;e0<numVertices;e0++)
+ for (int e0 = 0; e0 < numVertices; e0++)
{
- const float4& b = verticesB[hullB.m_vertexOffset+indicesB[polyB.m_indexOffset+e0]];
- worldVertsB1[numWorldVertsB1++] = transform(&b,&posB,&ornB);
+ const float4& b = verticesB[hullB.m_vertexOffset + indicesB[polyB.m_indexOffset + e0]];
+ worldVertsB1[numWorldVertsB1++] = transform(&b, &posB, &ornB);
}
}
- if (closestFaceB>=0)
+ if (closestFaceB >= 0)
{
//B3_PROFILE("clipFaceAgainstHull");
- numContactsOut = clipFaceAgainstHull((float4&)separatingNormal, &hullA,
- posA,ornA,
- worldVertsB1,numWorldVertsB1,worldVertsB2,capacityWorldVerts, minDist, maxDist,
- verticesA, facesA, indicesA,
- contactsOut,contactCapacity);
+ numContactsOut = clipFaceAgainstHull((float4&)separatingNormal, &hullA,
+ posA, ornA,
+ worldVertsB1, numWorldVertsB1, worldVertsB2, capacityWorldVerts, minDist, maxDist,
+ verticesA, facesA, indicesA,
+ contactsOut, contactCapacity);
}
return numContactsOut;
}
+#define PARALLEL_SUM(v, n) \
+ for (int j = 1; j < n; j++) v[0] += v[j];
+#define PARALLEL_DO(execution, n) \
+ for (int ie = 0; ie < n; ie++) \
+ { \
+ execution; \
+ }
+#define REDUCE_MAX(v, n) \
+ { \
+ int i = 0; \
+ for (int offset = 0; offset < n; offset++) v[i] = (v[i].y > v[i + offset].y) ? v[i] : v[i + offset]; \
+ }
+#define REDUCE_MIN(v, n) \
+ { \
+ int i = 0; \
+ for (int offset = 0; offset < n; offset++) v[i] = (v[i].y < v[i + offset].y) ? v[i] : v[i + offset]; \
+ }
+int extractManifold(const float4* p, int nPoints, const float4& nearNormal, b3Int4* contactIdx)
+{
+ if (nPoints == 0)
+ return 0;
+ if (nPoints <= 4)
+ return nPoints;
+ if (nPoints > 64)
+ nPoints = 64;
-
-#define PARALLEL_SUM(v, n) for(int j=1; j<n; j++) v[0] += v[j];
-#define PARALLEL_DO(execution, n) for(int ie=0; ie<n; ie++){execution;}
-#define REDUCE_MAX(v, n) {int i=0;\
-for(int offset=0; offset<n; offset++) v[i] = (v[i].y > v[i+offset].y)? v[i]: v[i+offset]; }
-#define REDUCE_MIN(v, n) {int i=0;\
-for(int offset=0; offset<n; offset++) v[i] = (v[i].y < v[i+offset].y)? v[i]: v[i+offset]; }
-
-int extractManifold(const float4* p, int nPoints, const float4& nearNormal, b3Int4* contactIdx)
-{
- if( nPoints == 0 )
- return 0;
-
- if (nPoints <=4)
- return nPoints;
-
-
- if (nPoints >64)
- nPoints = 64;
-
- float4 center = make_float4(0,0,0,0);
+ float4 center = make_float4(0, 0, 0, 0);
{
-
- for (int i=0;i<nPoints;i++)
+ for (int i = 0; i < nPoints; i++)
center += p[i];
center /= (float)nPoints;
}
-
-
-
+
// sample 4 directions
-
- float4 aVector = p[0] - center;
- float4 u = cross3( nearNormal, aVector );
- float4 v = cross3( nearNormal, u );
- u = normalize3( u );
- v = normalize3( v );
-
-
- //keep point with deepest penetration
- float minW= FLT_MAX;
-
- int minIndex=-1;
-
- float4 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;
- float4 r = p[ie]-center;
- f = dot3F4( u, r );
- if (f<maxDots.x)
- {
- maxDots.x = f;
- contactIdx[0].x = ie;
- }
-
- f = dot3F4( -u, r );
- if (f<maxDots.y)
- {
- maxDots.y = f;
- contactIdx[0].y = ie;
- }
-
-
- f = dot3F4( v, r );
- if (f<maxDots.z)
- {
- maxDots.z = f;
- contactIdx[0].z = ie;
- }
-
- f = dot3F4( -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;
-
-}
+ float4 aVector = p[0] - center;
+ float4 u = cross3(nearNormal, aVector);
+ float4 v = cross3(nearNormal, u);
+ u = normalize3(u);
+ v = normalize3(v);
+
+ //keep point with deepest penetration
+ float minW = FLT_MAX;
+ int minIndex = -1;
+ float4 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;
+ float4 r = p[ie] - center;
+ f = dot3F4(u, r);
+ if (f < maxDots.x)
+ {
+ maxDots.x = f;
+ contactIdx[0].x = ie;
+ }
+
+ f = dot3F4(-u, r);
+ if (f < maxDots.y)
+ {
+ maxDots.y = f;
+ contactIdx[0].y = ie;
+ }
+
+ f = dot3F4(v, r);
+ if (f < maxDots.z)
+ {
+ maxDots.z = f;
+ contactIdx[0].z = ie;
+ }
+
+ f = dot3F4(-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;
+}
int clipHullHullSingle(
- int bodyIndexA, int bodyIndexB,
- const float4& posA,
- const b3Quaternion& ornA,
- const float4& posB,
- const b3Quaternion& ornB,
+ int bodyIndexA, int bodyIndexB,
+ const float4& posA,
+ const b3Quaternion& ornA,
+ const float4& posB,
+ const b3Quaternion& ornB,
- int collidableIndexA, int collidableIndexB,
+ int collidableIndexA, int collidableIndexB,
- const b3AlignedObjectArray<b3RigidBodyData>* bodyBuf,
- b3AlignedObjectArray<b3Contact4>* globalContactOut,
- int& nContacts,
-
- const b3AlignedObjectArray<b3ConvexPolyhedronData>& hostConvexDataA,
- const b3AlignedObjectArray<b3ConvexPolyhedronData>& hostConvexDataB,
-
- const b3AlignedObjectArray<b3Vector3>& verticesA,
- const b3AlignedObjectArray<b3Vector3>& uniqueEdgesA,
- const b3AlignedObjectArray<b3GpuFace>& facesA,
- const b3AlignedObjectArray<int>& indicesA,
-
- const b3AlignedObjectArray<b3Vector3>& verticesB,
- const b3AlignedObjectArray<b3Vector3>& uniqueEdgesB,
- const b3AlignedObjectArray<b3GpuFace>& facesB,
- const b3AlignedObjectArray<int>& indicesB,
-
- const b3AlignedObjectArray<b3Collidable>& hostCollidablesA,
- const b3AlignedObjectArray<b3Collidable>& hostCollidablesB,
- const b3Vector3& sepNormalWorldSpace,
- int maxContactCapacity )
+ const b3AlignedObjectArray<b3RigidBodyData>* bodyBuf,
+ b3AlignedObjectArray<b3Contact4>* globalContactOut,
+ int& nContacts,
+
+ const b3AlignedObjectArray<b3ConvexPolyhedronData>& hostConvexDataA,
+ const b3AlignedObjectArray<b3ConvexPolyhedronData>& hostConvexDataB,
+
+ const b3AlignedObjectArray<b3Vector3>& verticesA,
+ const b3AlignedObjectArray<b3Vector3>& uniqueEdgesA,
+ const b3AlignedObjectArray<b3GpuFace>& facesA,
+ const b3AlignedObjectArray<int>& indicesA,
+
+ const b3AlignedObjectArray<b3Vector3>& verticesB,
+ const b3AlignedObjectArray<b3Vector3>& uniqueEdgesB,
+ const b3AlignedObjectArray<b3GpuFace>& facesB,
+ const b3AlignedObjectArray<int>& indicesB,
+
+ const b3AlignedObjectArray<b3Collidable>& hostCollidablesA,
+ const b3AlignedObjectArray<b3Collidable>& 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);
-
-
+
+ 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);
+
float4 contactsOut[MAX_VERTS];
int localContactCapacity = MAX_VERTS;
@@ -1249,133 +1177,125 @@ int clipHullHullSingle(
b3Assert(_finite(bodyBuf->at(bodyIndexA).m_pos.x));
b3Assert(_finite(bodyBuf->at(bodyIndexB).m_pos.x));
#endif
-
-
+
{
-
float4 worldVertsB1[MAX_VERTS];
float4 worldVertsB2[MAX_VERTS];
int capacityWorldVerts = MAX_VERTS;
- float4 hostNormal = make_float4(sepNormalWorldSpace.x,sepNormalWorldSpace.y,sepNormalWorldSpace.z,0.f);
+ float4 hostNormal = make_float4(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;
+ b3Transform trA, trB;
{
- //B3_PROFILE("transform 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));
+ //B3_PROFILE("transform 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 = clipHullAgainstHull(hostNormal,
- hostConvexDataA.at(shapeA),
- hostConvexDataB.at(shapeB),
- (float4&)trA.getOrigin(), (b3Quaternion&)trAorn,
- (float4&)trB.getOrigin(), (b3Quaternion&)trBorn,
- worldVertsB1,worldVertsB2,capacityWorldVerts,
- minDist, maxDist,
- verticesA, facesA,indicesA,
- verticesB, facesB,indicesB,
-
- contactsOut,localContactCapacity);
-
- if (numContactsOut>0)
+ b3Quaternion trBorn = trB.getRotation();
+
+ int numContactsOut = clipHullAgainstHull(hostNormal,
+ hostConvexDataA.at(shapeA),
+ hostConvexDataB.at(shapeB),
+ (float4&)trA.getOrigin(), (b3Quaternion&)trAorn,
+ (float4&)trB.getOrigin(), (b3Quaternion&)trBorn,
+ worldVertsB1, worldVertsB2, capacityWorldVerts,
+ minDist, maxDist,
+ verticesA, facesA, indicesA,
+ verticesB, facesB, indicesB,
+
+ contactsOut, localContactCapacity);
+
+ if (numContactsOut > 0)
{
B3_PROFILE("overlap");
float4 normalOnSurfaceB = (float4&)hostNormal;
-
+
b3Int4 contactIdx;
contactIdx.x = 0;
contactIdx.y = 1;
contactIdx.z = 2;
contactIdx.w = 3;
-
+
int numPoints = 0;
-
+
{
- // B3_PROFILE("extractManifold");
- numPoints = extractManifold(contactsOut, numContactsOut, normalOnSurfaceB, &contactIdx);
+ // B3_PROFILE("extractManifold");
+ numPoints = extractManifold(contactsOut, numContactsOut, normalOnSurfaceB, &contactIdx);
}
-
+
b3Assert(numPoints);
-
- if (nContacts<maxContactCapacity)
+
+ if (nContacts < maxContactCapacity)
{
contactIndex = nContacts;
globalContactOut->expand();
b3Contact4& 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_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++)
+
+ // 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;
+ 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
+ }
+ else
{
- b3Error("Error: exceeding contact capacity (%d/%d)\n", nContacts,maxContactCapacity);
+ b3Error("Error: exceeding contact capacity (%d/%d)\n", nContacts, maxContactCapacity);
}
}
}
return contactIndex;
}
-
-
-
-
void computeContactPlaneConvex(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)
+ 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)
{
-
- int shapeIndex = collidables[collidableIndexB].m_shapeIndex;
+ int shapeIndex = collidables[collidableIndexB].m_shapeIndex;
const b3ConvexPolyhedronData* hullB = &convexShapes[shapeIndex];
-
+
b3Vector3 posB = rigidBodies[bodyIndexB].m_pos;
b3Quaternion ornB = rigidBodies[bodyIndexB].m_quat;
b3Vector3 posA = rigidBodies[bodyIndexA].m_pos;
b3Quaternion ornA = rigidBodies[bodyIndexA].m_quat;
-// int numContactsOut = 0;
-// int numWorldVertsB1= 0;
+ // int numContactsOut = 0;
+ // int numWorldVertsB1= 0;
b3Vector3 planeEq = faces[collidables[collidableIndexA].m_shapeIndex].m_plane;
- b3Vector3 planeNormal=b3MakeVector3(planeEq.x,planeEq.y,planeEq.z);
- b3Vector3 planeNormalWorld = b3QuatRotate(ornA,planeNormal);
+ b3Vector3 planeNormal = b3MakeVector3(planeEq.x, planeEq.y, planeEq.z);
+ b3Vector3 planeNormalWorld = b3QuatRotate(ornA, planeNormal);
float planeConstant = planeEq.w;
b3Transform convexWorldTransform;
convexWorldTransform.setIdentity();
@@ -1387,13 +1307,13 @@ void computeContactPlaneConvex(int pairIndex,
planeTransform.setRotation(ornA);
b3Transform planeInConvex;
- planeInConvex= convexWorldTransform.inverse() * planeTransform;
+ planeInConvex = convexWorldTransform.inverse() * planeTransform;
b3Transform convexInPlane;
convexInPlane = planeTransform.inverse() * convexWorldTransform;
-
- b3Vector3 planeNormalInConvex = planeInConvex.getBasis()*-planeNormal;
+
+ b3Vector3 planeNormalInConvex = planeInConvex.getBasis() * -planeNormal;
float maxDot = -1e30;
- int hitVertex=-1;
+ int hitVertex = -1;
b3Vector3 hitVtx;
#define MAX_PLANE_CONVEX_POINTS 64
@@ -1406,54 +1326,52 @@ void computeContactPlaneConvex(int pairIndex,
contactIdx.s[1] = 1;
contactIdx.s[2] = 2;
contactIdx.s[3] = 3;
-
- for (int i=0;i<hullB->m_numVertices;i++)
+
+ for (int i = 0; i < hullB->m_numVertices; i++)
{
- b3Vector3 vtx = convexVertices[hullB->m_vertexOffset+i];
+ b3Vector3 vtx = convexVertices[hullB->m_vertexOffset + i];
float curDot = vtx.dot(planeNormalInConvex);
-
- if (curDot>maxDot)
+ if (curDot > maxDot)
{
- hitVertex=i;
- maxDot=curDot;
+ hitVertex = i;
+ maxDot = curDot;
hitVtx = vtx;
//make sure the deepest points is always included
- if (numPoints==MAX_PLANE_CONVEX_POINTS)
+ if (numPoints == MAX_PLANE_CONVEX_POINTS)
numPoints--;
}
- if (numPoints<MAX_PLANE_CONVEX_POINTS)
+ if (numPoints < MAX_PLANE_CONVEX_POINTS)
{
- b3Vector3 vtxWorld = convexWorldTransform*vtx;
- b3Vector3 vtxInPlane = planeTransform.inverse()*vtxWorld;
- float dist = planeNormal.dot(vtxInPlane)-planeConstant;
- if (dist<0.f)
+ b3Vector3 vtxWorld = convexWorldTransform * vtx;
+ b3Vector3 vtxInPlane = planeTransform.inverse() * vtxWorld;
+ float dist = planeNormal.dot(vtxInPlane) - planeConstant;
+ if (dist < 0.f)
{
vtxWorld.w = dist;
contactPoints[numPoints] = vtxWorld;
numPoints++;
}
}
-
}
- int numReducedPoints = 0;
+ int numReducedPoints = 0;
numReducedPoints = numPoints;
-
- if (numPoints>4)
+
+ if (numPoints > 4)
{
- numReducedPoints = extractManifoldSequentialGlobal( contactPoints, numPoints, planeNormalInConvex, &contactIdx);
+ numReducedPoints = extractManifoldSequentialGlobal(contactPoints, numPoints, planeNormalInConvex, &contactIdx);
}
int dstIdx;
-// dstIdx = nGlobalContactsOut++;//AppendInc( nGlobalContactsOut, dstIdx );
-
- if (numReducedPoints>0)
+ // dstIdx = nGlobalContactsOut++;//AppendInc( nGlobalContactsOut, dstIdx );
+
+ if (numReducedPoints > 0)
{
if (nGlobalContactsOut < maxContactCapacity)
{
- dstIdx=nGlobalContactsOut;
+ dstIdx = nGlobalContactsOut;
nGlobalContactsOut++;
b3Contact4* c = &globalContactsOut[dstIdx];
@@ -1462,38 +1380,33 @@ void computeContactPlaneConvex(int pairIndex,
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;
- for (int i=0;i<numReducedPoints;i++)
+ c->m_bodyAPtrAndSignBit = rigidBodies[bodyIndexA].m_invMass == 0 ? -bodyIndexA : bodyIndexA;
+ c->m_bodyBPtrAndSignBit = rigidBodies[bodyIndexB].m_invMass == 0 ? -bodyIndexB : bodyIndexB;
+ for (int i = 0; i < numReducedPoints; i++)
{
b3Vector3 pOnB1 = contactPoints[contactIdx.s[i]];
c->m_worldPosB[i] = pOnB1;
}
c->m_worldNormalOnB.w = (b3Scalar)numReducedPoints;
- }//if (dstIdx < numPairs)
- }
-
-
+ } //if (dstIdx < numPairs)
+ }
-// printf("computeContactPlaneConvex\n");
+ // printf("computeContactPlaneConvex\n");
}
-
-
-B3_FORCE_INLINE b3Vector3 MyUnQuantize(const unsigned short* vecIn, const b3Vector3& quantization, const b3Vector3& bvhAabbMin)
- {
- b3Vector3 vecOut;
- vecOut.setValue(
- (b3Scalar)(vecIn[0]) / (quantization.x),
- (b3Scalar)(vecIn[1]) / (quantization.y),
- (b3Scalar)(vecIn[2]) / (quantization.z));
- vecOut += bvhAabbMin;
- return vecOut;
- }
+B3_FORCE_INLINE b3Vector3 MyUnQuantize(const unsigned short* vecIn, const b3Vector3& quantization, const b3Vector3& bvhAabbMin)
+{
+ b3Vector3 vecOut;
+ vecOut.setValue(
+ (b3Scalar)(vecIn[0]) / (quantization.x),
+ (b3Scalar)(vecIn[1]) / (quantization.y),
+ (b3Scalar)(vecIn[2]) / (quantization.z));
+ vecOut += bvhAabbMin;
+ return vecOut;
+}
void traverseTreeTree()
{
-
}
#include "Bullet3Common/shared/b3Mat3x3.h"
@@ -1503,44 +1416,40 @@ int maxNumAabbChecks = 0;
int maxDepth = 0;
// work-in-progress
-__kernel void findCompoundPairsKernel(
+__kernel void findCompoundPairsKernel(
int pairIndex,
int bodyIndexA,
int bodyIndexB,
int collidableIndexA,
int collidableIndexB,
- __global const b3RigidBodyData* rigidBodies,
+ __global const b3RigidBodyData* rigidBodies,
__global const b3Collidable* collidables,
- __global const b3ConvexPolyhedronData* convexShapes,
+ __global const b3ConvexPolyhedronData* convexShapes,
__global const b3AlignedObjectArray<b3Float4>& vertices,
__global const b3AlignedObjectArray<b3Aabb>& aabbsWorldSpace,
__global const b3AlignedObjectArray<b3Aabb>& aabbsLocalSpace,
__global const b3GpuChildShape* gpuChildShapes,
__global b3Int4* gpuCompoundPairsOut,
- __global int* numCompoundPairsOut,
+ __global int* numCompoundPairsOut,
int maxNumCompoundPairsCapacity,
- b3AlignedObjectArray<b3QuantizedBvhNode>& treeNodesCPU,
- b3AlignedObjectArray<b3BvhSubtreeInfo>& subTreesCPU,
- b3AlignedObjectArray<b3BvhInfo>& bvhInfoCPU
- )
+ b3AlignedObjectArray<b3QuantizedBvhNode>& treeNodesCPU,
+ b3AlignedObjectArray<b3BvhSubtreeInfo>& subTreesCPU,
+ b3AlignedObjectArray<b3BvhInfo>& bvhInfoCPU)
{
- numAabbChecks=0;
- maxNumAabbChecks=0;
-// int i = pairIndex;
+ numAabbChecks = 0;
+ maxNumAabbChecks = 0;
+ // int i = pairIndex;
{
-
-
int shapeIndexA = collidables[collidableIndexA].m_shapeIndex;
int shapeIndexB = collidables[collidableIndexB].m_shapeIndex;
-
//once the broadphase avoids static-static pairs, we can remove this test
- if ((rigidBodies[bodyIndexA].m_invMass==0) &&(rigidBodies[bodyIndexB].m_invMass==0))
+ if ((rigidBodies[bodyIndexA].m_invMass == 0) && (rigidBodies[bodyIndexB].m_invMass == 0))
{
return;
}
- if ((collidables[collidableIndexA].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS) &&(collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS))
+ if ((collidables[collidableIndexA].m_shapeType == SHAPE_COMPOUND_OF_CONVEX_HULLS) && (collidables[collidableIndexB].m_shapeType == SHAPE_COMPOUND_OF_CONVEX_HULLS))
{
int bvhA = collidables[collidableIndexA].m_compoundBvhIndex;
int bvhB = collidables[collidableIndexB].m_compoundBvhIndex;
@@ -1548,9 +1457,8 @@ __kernel void findCompoundPairsKernel(
int subTreesOffsetA = bvhInfoCPU[bvhA].m_subTreeOffset;
int subTreesOffsetB = bvhInfoCPU[bvhB].m_subTreeOffset;
-
int numSubTreesB = bvhInfoCPU[bvhB].m_numSubTrees;
-
+
float4 posA = rigidBodies[bodyIndexA].m_pos;
b3Quat ornA = rigidBodies[bodyIndexA].m_quat;
@@ -1567,41 +1475,37 @@ __kernel void findCompoundPairsKernel(
transB.setOrigin(posB);
transB.setRotation(ornB);
-
-
- for (int p=0;p<numSubTreesA;p++)
+ for (int p = 0; p < numSubTreesA; p++)
{
- b3BvhSubtreeInfo subtreeA = subTreesCPU[subTreesOffsetA+p];
+ b3BvhSubtreeInfo subtreeA = subTreesCPU[subTreesOffsetA + p];
//bvhInfoCPU[bvhA].m_quantization
- b3Vector3 treeAminLocal = MyUnQuantize(subtreeA.m_quantizedAabbMin,bvhInfoCPU[bvhA].m_quantization,bvhInfoCPU[bvhA].m_aabbMin);
- b3Vector3 treeAmaxLocal = MyUnQuantize(subtreeA.m_quantizedAabbMax,bvhInfoCPU[bvhA].m_quantization,bvhInfoCPU[bvhA].m_aabbMin);
+ b3Vector3 treeAminLocal = MyUnQuantize(subtreeA.m_quantizedAabbMin, bvhInfoCPU[bvhA].m_quantization, bvhInfoCPU[bvhA].m_aabbMin);
+ b3Vector3 treeAmaxLocal = MyUnQuantize(subtreeA.m_quantizedAabbMax, bvhInfoCPU[bvhA].m_quantization, bvhInfoCPU[bvhA].m_aabbMin);
- b3Vector3 aabbAMinOut,aabbAMaxOut;
- float margin=0.f;
- b3TransformAabb2(treeAminLocal,treeAmaxLocal, margin,transA.getOrigin(),transA.getRotation(),&aabbAMinOut,&aabbAMaxOut);
+ b3Vector3 aabbAMinOut, aabbAMaxOut;
+ float margin = 0.f;
+ b3TransformAabb2(treeAminLocal, treeAmaxLocal, margin, transA.getOrigin(), transA.getRotation(), &aabbAMinOut, &aabbAMaxOut);
- for (int q=0;q<numSubTreesB;q++)
+ for (int q = 0; q < numSubTreesB; q++)
{
- b3BvhSubtreeInfo subtreeB = subTreesCPU[subTreesOffsetB+q];
+ b3BvhSubtreeInfo subtreeB = subTreesCPU[subTreesOffsetB + q];
- b3Vector3 treeBminLocal = MyUnQuantize(subtreeB.m_quantizedAabbMin,bvhInfoCPU[bvhB].m_quantization,bvhInfoCPU[bvhB].m_aabbMin);
- b3Vector3 treeBmaxLocal = MyUnQuantize(subtreeB.m_quantizedAabbMax,bvhInfoCPU[bvhB].m_quantization,bvhInfoCPU[bvhB].m_aabbMin);
+ b3Vector3 treeBminLocal = MyUnQuantize(subtreeB.m_quantizedAabbMin, bvhInfoCPU[bvhB].m_quantization, bvhInfoCPU[bvhB].m_aabbMin);
+ b3Vector3 treeBmaxLocal = MyUnQuantize(subtreeB.m_quantizedAabbMax, bvhInfoCPU[bvhB].m_quantization, bvhInfoCPU[bvhB].m_aabbMin);
- b3Vector3 aabbBMinOut,aabbBMaxOut;
- float margin=0.f;
- b3TransformAabb2(treeBminLocal,treeBmaxLocal, margin,transB.getOrigin(),transB.getRotation(),&aabbBMinOut,&aabbBMaxOut);
+ b3Vector3 aabbBMinOut, aabbBMaxOut;
+ float margin = 0.f;
+ b3TransformAabb2(treeBminLocal, treeBmaxLocal, margin, transB.getOrigin(), transB.getRotation(), &aabbBMinOut, &aabbBMaxOut);
-
- numAabbChecks=0;
- bool aabbOverlap = b3TestAabbAgainstAabb(aabbAMinOut,aabbAMaxOut,aabbBMinOut,aabbBMaxOut);
+ numAabbChecks = 0;
+ bool aabbOverlap = b3TestAabbAgainstAabb(aabbAMinOut, aabbAMaxOut, aabbBMinOut, aabbBMaxOut);
if (aabbOverlap)
{
-
- int startNodeIndexA = subtreeA.m_rootNodeIndex+bvhInfoCPU[bvhA].m_nodeOffset;
- // int endNodeIndexA = startNodeIndexA+subtreeA.m_subtreeSize;
+ int startNodeIndexA = subtreeA.m_rootNodeIndex + bvhInfoCPU[bvhA].m_nodeOffset;
+ // int endNodeIndexA = startNodeIndexA+subtreeA.m_subtreeSize;
- int startNodeIndexB = subtreeB.m_rootNodeIndex+bvhInfoCPU[bvhB].m_nodeOffset;
- // int endNodeIndexB = startNodeIndexB+subtreeB.m_subtreeSize;
+ int startNodeIndexB = subtreeB.m_rootNodeIndex + bvhInfoCPU[bvhB].m_nodeOffset;
+ // int endNodeIndexB = startNodeIndexB+subtreeB.m_subtreeSize;
b3AlignedObjectArray<b3Int2> nodeStack;
b3Int2 node0;
@@ -1610,33 +1514,33 @@ __kernel void findCompoundPairsKernel(
int maxStackDepth = 1024;
nodeStack.resize(maxStackDepth);
- int depth=0;
- nodeStack[depth++]=node0;
+ int depth = 0;
+ nodeStack[depth++] = node0;
do
{
if (depth > maxDepth)
{
- maxDepth=depth;
- printf("maxDepth=%d\n",maxDepth);
+ maxDepth = depth;
+ printf("maxDepth=%d\n", maxDepth);
}
b3Int2 node = nodeStack[--depth];
-
- b3Vector3 aMinLocal = MyUnQuantize(treeNodesCPU[node.x].m_quantizedAabbMin,bvhInfoCPU[bvhA].m_quantization,bvhInfoCPU[bvhA].m_aabbMin);
- b3Vector3 aMaxLocal = MyUnQuantize(treeNodesCPU[node.x].m_quantizedAabbMax,bvhInfoCPU[bvhA].m_quantization,bvhInfoCPU[bvhA].m_aabbMin);
- b3Vector3 bMinLocal = MyUnQuantize(treeNodesCPU[node.y].m_quantizedAabbMin,bvhInfoCPU[bvhB].m_quantization,bvhInfoCPU[bvhB].m_aabbMin);
- b3Vector3 bMaxLocal = MyUnQuantize(treeNodesCPU[node.y].m_quantizedAabbMax,bvhInfoCPU[bvhB].m_quantization,bvhInfoCPU[bvhB].m_aabbMin);
+ b3Vector3 aMinLocal = MyUnQuantize(treeNodesCPU[node.x].m_quantizedAabbMin, bvhInfoCPU[bvhA].m_quantization, bvhInfoCPU[bvhA].m_aabbMin);
+ b3Vector3 aMaxLocal = MyUnQuantize(treeNodesCPU[node.x].m_quantizedAabbMax, bvhInfoCPU[bvhA].m_quantization, bvhInfoCPU[bvhA].m_aabbMin);
- float margin=0.f;
- b3Vector3 aabbAMinOut,aabbAMaxOut;
- b3TransformAabb2(aMinLocal,aMaxLocal, margin,transA.getOrigin(),transA.getRotation(),&aabbAMinOut,&aabbAMaxOut);
+ b3Vector3 bMinLocal = MyUnQuantize(treeNodesCPU[node.y].m_quantizedAabbMin, bvhInfoCPU[bvhB].m_quantization, bvhInfoCPU[bvhB].m_aabbMin);
+ b3Vector3 bMaxLocal = MyUnQuantize(treeNodesCPU[node.y].m_quantizedAabbMax, bvhInfoCPU[bvhB].m_quantization, bvhInfoCPU[bvhB].m_aabbMin);
- b3Vector3 aabbBMinOut,aabbBMaxOut;
- b3TransformAabb2(bMinLocal,bMaxLocal, margin,transB.getOrigin(),transB.getRotation(),&aabbBMinOut,&aabbBMaxOut);
+ float margin = 0.f;
+ b3Vector3 aabbAMinOut, aabbAMaxOut;
+ b3TransformAabb2(aMinLocal, aMaxLocal, margin, transA.getOrigin(), transA.getRotation(), &aabbAMinOut, &aabbAMaxOut);
+
+ b3Vector3 aabbBMinOut, aabbBMaxOut;
+ b3TransformAabb2(bMinLocal, bMaxLocal, margin, transB.getOrigin(), transB.getRotation(), &aabbBMinOut, &aabbBMaxOut);
numAabbChecks++;
- bool nodeOverlap = b3TestAabbAgainstAabb(aabbAMinOut,aabbAMaxOut,aabbBMinOut,aabbBMaxOut);
+ bool nodeOverlap = b3TestAabbAgainstAabb(aabbAMinOut, aabbAMaxOut, aabbBMinOut, aabbBMaxOut);
if (nodeOverlap)
{
bool isLeafA = treeNodesCPU[node.x].isLeafNode();
@@ -1645,23 +1549,23 @@ __kernel void findCompoundPairsKernel(
bool isInternalB = !isLeafB;
//fail, even though it might hit two leaf nodes
- if (depth+4>maxStackDepth && !(isLeafA && isLeafB))
+ if (depth + 4 > maxStackDepth && !(isLeafA && isLeafB))
{
b3Error("Error: traversal exceeded maxStackDepth\n");
continue;
}
- if(isInternalA)
+ if (isInternalA)
{
- int nodeAleftChild = node.x+1;
- bool isNodeALeftChildLeaf = treeNodesCPU[node.x+1].isLeafNode();
- int nodeArightChild = isNodeALeftChildLeaf? node.x+2 : node.x+1 + treeNodesCPU[node.x+1].getEscapeIndex();
+ int nodeAleftChild = node.x + 1;
+ bool isNodeALeftChildLeaf = treeNodesCPU[node.x + 1].isLeafNode();
+ int nodeArightChild = isNodeALeftChildLeaf ? node.x + 2 : node.x + 1 + treeNodesCPU[node.x + 1].getEscapeIndex();
- if(isInternalB)
- {
- int nodeBleftChild = node.y+1;
- bool isNodeBLeftChildLeaf = treeNodesCPU[node.y+1].isLeafNode();
- int nodeBrightChild = isNodeBLeftChildLeaf? node.y+2 : node.y+1 + treeNodesCPU[node.y+1].getEscapeIndex();
+ if (isInternalB)
+ {
+ int nodeBleftChild = node.y + 1;
+ bool isNodeBLeftChildLeaf = treeNodesCPU[node.y + 1].isLeafNode();
+ int nodeBrightChild = isNodeBLeftChildLeaf ? node.y + 2 : node.y + 1 + treeNodesCPU[node.y + 1].getEscapeIndex();
nodeStack[depth++] = b3MakeInt2(nodeAleftChild, nodeBleftChild);
nodeStack[depth++] = b3MakeInt2(nodeArightChild, nodeBleftChild);
@@ -1670,90 +1574,83 @@ __kernel void findCompoundPairsKernel(
}
else
{
- nodeStack[depth++] = b3MakeInt2(nodeAleftChild,node.y);
- nodeStack[depth++] = b3MakeInt2(nodeArightChild,node.y);
+ nodeStack[depth++] = b3MakeInt2(nodeAleftChild, node.y);
+ nodeStack[depth++] = b3MakeInt2(nodeArightChild, node.y);
}
}
else
{
- if(isInternalB)
+ if (isInternalB)
{
- int nodeBleftChild = node.y+1;
- bool isNodeBLeftChildLeaf = treeNodesCPU[node.y+1].isLeafNode();
- int nodeBrightChild = isNodeBLeftChildLeaf? node.y+2 : node.y+1 + treeNodesCPU[node.y+1].getEscapeIndex();
- nodeStack[depth++] = b3MakeInt2(node.x,nodeBleftChild);
- nodeStack[depth++] = b3MakeInt2(node.x,nodeBrightChild);
+ int nodeBleftChild = node.y + 1;
+ bool isNodeBLeftChildLeaf = treeNodesCPU[node.y + 1].isLeafNode();
+ int nodeBrightChild = isNodeBLeftChildLeaf ? node.y + 2 : node.y + 1 + treeNodesCPU[node.y + 1].getEscapeIndex();
+ nodeStack[depth++] = b3MakeInt2(node.x, nodeBleftChild);
+ nodeStack[depth++] = b3MakeInt2(node.x, nodeBrightChild);
}
else
{
int compoundPairIdx = b3AtomicInc(numCompoundPairsOut);
- if (compoundPairIdx<maxNumCompoundPairsCapacity)
+ if (compoundPairIdx < maxNumCompoundPairsCapacity)
{
int childShapeIndexA = treeNodesCPU[node.x].getTriangleIndex();
int childShapeIndexB = treeNodesCPU[node.y].getTriangleIndex();
- gpuCompoundPairsOut[compoundPairIdx] = b3MakeInt4(bodyIndexA,bodyIndexB,childShapeIndexA,childShapeIndexB);
+ gpuCompoundPairsOut[compoundPairIdx] = b3MakeInt4(bodyIndexA, bodyIndexB, childShapeIndexA, childShapeIndexB);
}
}
}
}
} while (depth);
- maxNumAabbChecks = b3Max(numAabbChecks,maxNumAabbChecks);
+ maxNumAabbChecks = b3Max(numAabbChecks, maxNumAabbChecks);
}
}
}
-
+
return;
}
- if ((collidables[collidableIndexA].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS) ||(collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS))
+ if ((collidables[collidableIndexA].m_shapeType == SHAPE_COMPOUND_OF_CONVEX_HULLS) || (collidables[collidableIndexB].m_shapeType == SHAPE_COMPOUND_OF_CONVEX_HULLS))
{
-
- if (collidables[collidableIndexA].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)
+ if (collidables[collidableIndexA].m_shapeType == SHAPE_COMPOUND_OF_CONVEX_HULLS)
{
-
int numChildrenA = collidables[collidableIndexA].m_numChildShapes;
- for (int c=0;c<numChildrenA;c++)
+ for (int c = 0; c < numChildrenA; c++)
{
- int childShapeIndexA = collidables[collidableIndexA].m_shapeIndex+c;
+ int childShapeIndexA = collidables[collidableIndexA].m_shapeIndex + c;
int childColIndexA = gpuChildShapes[childShapeIndexA].m_shapeIndex;
float4 posA = rigidBodies[bodyIndexA].m_pos;
b3Quat ornA = rigidBodies[bodyIndexA].m_quat;
float4 childPosA = gpuChildShapes[childShapeIndexA].m_childPosition;
b3Quat childOrnA = gpuChildShapes[childShapeIndexA].m_childOrientation;
- float4 newPosA = b3QuatRotate(ornA,childPosA)+posA;
- b3Quat newOrnA = b3QuatMul(ornA,childOrnA);
-
+ float4 newPosA = b3QuatRotate(ornA, childPosA) + posA;
+ b3Quat newOrnA = b3QuatMul(ornA, childOrnA);
-
b3Aabb aabbA = aabbsLocalSpace[childColIndexA];
-
b3Transform transA;
transA.setIdentity();
transA.setOrigin(newPosA);
transA.setRotation(newOrnA);
- b3Scalar margin=0.0f;
+ b3Scalar margin = 0.0f;
- b3Vector3 aabbAMinOut,aabbAMaxOut;
+ b3Vector3 aabbAMinOut, aabbAMaxOut;
- b3TransformAabb2((const b3Float4&)aabbA.m_min,(const b3Float4&)aabbA.m_max, margin,transA.getOrigin(),transA.getRotation(),&aabbAMinOut,&aabbAMaxOut);
+ b3TransformAabb2((const b3Float4&)aabbA.m_min, (const b3Float4&)aabbA.m_max, margin, transA.getOrigin(), transA.getRotation(), &aabbAMinOut, &aabbAMaxOut);
- if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)
+ if (collidables[collidableIndexB].m_shapeType == SHAPE_COMPOUND_OF_CONVEX_HULLS)
{
int numChildrenB = collidables[collidableIndexB].m_numChildShapes;
- for (int b=0;b<numChildrenB;b++)
+ for (int b = 0; b < numChildrenB; b++)
{
- int childShapeIndexB = collidables[collidableIndexB].m_shapeIndex+b;
+ int childShapeIndexB = collidables[collidableIndexB].m_shapeIndex + b;
int childColIndexB = gpuChildShapes[childShapeIndexB].m_shapeIndex;
b3Quat ornB = rigidBodies[bodyIndexB].m_quat;
float4 posB = rigidBodies[bodyIndexB].m_pos;
float4 childPosB = gpuChildShapes[childShapeIndexB].m_childPosition;
b3Quat childOrnB = gpuChildShapes[childShapeIndexB].m_childOrientation;
- float4 newPosB = transform(&childPosB,&posB,&ornB);
- b3Quat newOrnB = b3QuatMul(ornB,childOrnB);
-
-
+ float4 newPosB = transform(&childPosB, &posB, &ornB);
+ b3Quat newOrnB = b3QuatMul(ornB, childOrnB);
b3Aabb aabbB = aabbsLocalSpace[childColIndexB];
@@ -1762,11 +1659,11 @@ __kernel void findCompoundPairsKernel(
transB.setOrigin(newPosB);
transB.setRotation(newOrnB);
- b3Vector3 aabbBMinOut,aabbBMaxOut;
- b3TransformAabb2((const b3Float4&)aabbB.m_min,(const b3Float4&)aabbB.m_max, margin,transB.getOrigin(),transB.getRotation(),&aabbBMinOut,&aabbBMaxOut);
+ b3Vector3 aabbBMinOut, aabbBMaxOut;
+ b3TransformAabb2((const b3Float4&)aabbB.m_min, (const b3Float4&)aabbB.m_max, margin, transB.getOrigin(), transB.getRotation(), &aabbBMinOut, &aabbBMaxOut);
numAabbChecks++;
- bool aabbOverlap = b3TestAabbAgainstAabb(aabbAMinOut,aabbAMaxOut,aabbBMinOut,aabbBMaxOut);
+ bool aabbOverlap = b3TestAabbAgainstAabb(aabbAMinOut, aabbAMaxOut, aabbBMinOut, aabbBMaxOut);
if (aabbOverlap)
{
/*
@@ -1784,22 +1681,22 @@ __kernel void findCompoundPairsKernel(
float4 c1 = transform(&c1local,&posB,&ornB);
const float4 DeltaC2 = c0 - c1;
*/
- {//
+ { //
int compoundPairIdx = b3AtomicInc(numCompoundPairsOut);
- if (compoundPairIdx<maxNumCompoundPairsCapacity)
+ if (compoundPairIdx < maxNumCompoundPairsCapacity)
{
- gpuCompoundPairsOut[compoundPairIdx] = b3MakeInt4(bodyIndexA,bodyIndexB,childShapeIndexA,childShapeIndexB);
+ gpuCompoundPairsOut[compoundPairIdx] = b3MakeInt4(bodyIndexA, bodyIndexB, childShapeIndexA, childShapeIndexB);
}
- }//
- }//fi(1)
- } //for (int b=0
- }//if (collidables[collidableIndexB].
- else//if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)
+ } //
+ } //fi(1)
+ } //for (int b=0
+ } //if (collidables[collidableIndexB].
+ else //if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)
{
if (1)
{
- // int numFacesA = convexShapes[shapeIndexA].m_numFaces;
- // float dmin = FLT_MAX;
+ // int numFacesA = convexShapes[shapeIndexA].m_numFaces;
+ // float dmin = FLT_MAX;
float4 posA = newPosA;
posA.w = 0.f;
float4 posB = rigidBodies[bodyIndexB].m_pos;
@@ -1811,45 +1708,43 @@ __kernel void findCompoundPairsKernel(
float4 c1local = convexShapes[shapeIndexB].m_localCenter;
b3Quat ornB = rigidBodies[bodyIndexB].m_quat;
float4 c1;
- c1 = transform(&c1local,&posB,&ornB);
- // const float4 DeltaC2 = c0 - c1;
+ c1 = transform(&c1local, &posB, &ornB);
+ // const float4 DeltaC2 = c0 - c1;
{
int compoundPairIdx = b3AtomicInc(numCompoundPairsOut);
- if (compoundPairIdx<maxNumCompoundPairsCapacity)
+ if (compoundPairIdx < maxNumCompoundPairsCapacity)
{
- gpuCompoundPairsOut[compoundPairIdx] = b3MakeInt4(bodyIndexA,bodyIndexB,childShapeIndexA,-1);
- }//if (compoundPairIdx<maxNumCompoundPairsCapacity)
- }//
- }//fi (1)
- }//if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)
- }//for (int b=0;b<numChildrenB;b++)
+ gpuCompoundPairsOut[compoundPairIdx] = b3MakeInt4(bodyIndexA, bodyIndexB, childShapeIndexA, -1);
+ } //if (compoundPairIdx<maxNumCompoundPairsCapacity)
+ } //
+ } //fi (1)
+ } //if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)
+ } //for (int b=0;b<numChildrenB;b++)
return;
- }//if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)
- if ((collidables[collidableIndexA].m_shapeType!=SHAPE_CONCAVE_TRIMESH)
- && (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS))
+ } //if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)
+ if ((collidables[collidableIndexA].m_shapeType != SHAPE_CONCAVE_TRIMESH) && (collidables[collidableIndexB].m_shapeType == SHAPE_COMPOUND_OF_CONVEX_HULLS))
{
int numChildrenB = collidables[collidableIndexB].m_numChildShapes;
- for (int b=0;b<numChildrenB;b++)
+ for (int b = 0; b < numChildrenB; b++)
{
- int childShapeIndexB = collidables[collidableIndexB].m_shapeIndex+b;
+ int childShapeIndexB = collidables[collidableIndexB].m_shapeIndex + b;
int childColIndexB = gpuChildShapes[childShapeIndexB].m_shapeIndex;
b3Quat ornB = rigidBodies[bodyIndexB].m_quat;
float4 posB = rigidBodies[bodyIndexB].m_pos;
float4 childPosB = gpuChildShapes[childShapeIndexB].m_childPosition;
b3Quat childOrnB = gpuChildShapes[childShapeIndexB].m_childOrientation;
- float4 newPosB = b3QuatRotate(ornB,childPosB)+posB;
- b3Quat newOrnB = b3QuatMul(ornB,childOrnB);
+ float4 newPosB = b3QuatRotate(ornB, childPosB) + posB;
+ b3Quat newOrnB = b3QuatMul(ornB, childOrnB);
int shapeIndexB = collidables[childColIndexB].m_shapeIndex;
-
//////////////////////////////////////
if (1)
{
- // int numFacesA = convexShapes[shapeIndexA].m_numFaces;
- // float dmin = FLT_MAX;
+ // int numFacesA = convexShapes[shapeIndexA].m_numFaces;
+ // float dmin = FLT_MAX;
float4 posA = rigidBodies[bodyIndexA].m_pos;
posA.w = 0.f;
float4 posB = newPosB;
@@ -1859,99 +1754,96 @@ __kernel void findCompoundPairsKernel(
float4 c0;
c0 = transform(&c0local, &posA, &ornA);
float4 c1local = convexShapes[shapeIndexB].m_localCenter;
- b3Quat ornB =newOrnB;
+ b3Quat ornB = newOrnB;
float4 c1;
- c1 = transform(&c1local,&posB,&ornB);
- // const float4 DeltaC2 = c0 - c1;
- {//
+ c1 = transform(&c1local, &posB, &ornB);
+ // const float4 DeltaC2 = c0 - c1;
+ { //
int compoundPairIdx = b3AtomicInc(numCompoundPairsOut);
- if (compoundPairIdx<maxNumCompoundPairsCapacity)
+ if (compoundPairIdx < maxNumCompoundPairsCapacity)
{
- gpuCompoundPairsOut[compoundPairIdx] = b3MakeInt4(bodyIndexA,bodyIndexB,-1,childShapeIndexB);
- }//fi (compoundPairIdx<maxNumCompoundPairsCapacity)
- }//
- }//fi (1)
- }//for (int b=0;b<numChildrenB;b++)
+ gpuCompoundPairsOut[compoundPairIdx] = b3MakeInt4(bodyIndexA, bodyIndexB, -1, childShapeIndexB);
+ } //fi (compoundPairIdx<maxNumCompoundPairsCapacity)
+ } //
+ } //fi (1)
+ } //for (int b=0;b<numChildrenB;b++)
return;
- }//if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)
+ } //if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)
return;
- }//fi ((collidables[collidableIndexA].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS) ||(collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS))
- }//i<numPairs
+ } //fi ((collidables[collidableIndexA].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS) ||(collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS))
+ } //i<numPairs
}
-
-
-__kernel void processCompoundPairsKernel( __global const b3Int4* gpuCompoundPairs,
- __global const b3RigidBodyData* rigidBodies,
- __global const b3Collidable* collidables,
- __global const b3ConvexPolyhedronData* convexShapes,
- __global const b3AlignedObjectArray<b3Float4>& vertices,
- __global const b3AlignedObjectArray<b3Float4>& uniqueEdges,
- __global const b3AlignedObjectArray<b3GpuFace>& faces,
- __global const b3AlignedObjectArray<int>& indices,
- __global b3Aabb* aabbs,
- __global const b3GpuChildShape* gpuChildShapes,
- __global b3AlignedObjectArray<b3Float4>& gpuCompoundSepNormalsOut,
- __global b3AlignedObjectArray<int>& gpuHasCompoundSepNormalsOut,
- int numCompoundPairs,
- int i
- )
+__kernel void processCompoundPairsKernel(__global const b3Int4* gpuCompoundPairs,
+ __global const b3RigidBodyData* rigidBodies,
+ __global const b3Collidable* collidables,
+ __global const b3ConvexPolyhedronData* convexShapes,
+ __global const b3AlignedObjectArray<b3Float4>& vertices,
+ __global const b3AlignedObjectArray<b3Float4>& uniqueEdges,
+ __global const b3AlignedObjectArray<b3GpuFace>& faces,
+ __global const b3AlignedObjectArray<int>& indices,
+ __global b3Aabb* aabbs,
+ __global const b3GpuChildShape* gpuChildShapes,
+ __global b3AlignedObjectArray<b3Float4>& gpuCompoundSepNormalsOut,
+ __global b3AlignedObjectArray<int>& gpuHasCompoundSepNormalsOut,
+ int numCompoundPairs,
+ int i)
{
-
-// int i = get_global_id(0);
- if (i<numCompoundPairs)
+ // int i = get_global_id(0);
+ if (i < numCompoundPairs)
{
int bodyIndexA = gpuCompoundPairs[i].x;
int bodyIndexB = gpuCompoundPairs[i].y;
int childShapeIndexA = gpuCompoundPairs[i].z;
int childShapeIndexB = gpuCompoundPairs[i].w;
-
+
int collidableIndexA = -1;
int collidableIndexB = -1;
-
+
b3Quat ornA = rigidBodies[bodyIndexA].m_quat;
float4 posA = rigidBodies[bodyIndexA].m_pos;
-
+
b3Quat ornB = rigidBodies[bodyIndexB].m_quat;
float4 posB = rigidBodies[bodyIndexB].m_pos;
-
+
if (childShapeIndexA >= 0)
{
collidableIndexA = gpuChildShapes[childShapeIndexA].m_shapeIndex;
float4 childPosA = gpuChildShapes[childShapeIndexA].m_childPosition;
- b3Quat childOrnA = gpuChildShapes[childShapeIndexA].m_childOrientation;
- float4 newPosA = b3QuatRotate(ornA,childPosA)+posA;
- b3Quat newOrnA = b3QuatMul(ornA,childOrnA);
+ b3Quat childOrnA = gpuChildShapes[childShapeIndexA].m_childOrientation;
+ float4 newPosA = b3QuatRotate(ornA, childPosA) + posA;
+ b3Quat newOrnA = b3QuatMul(ornA, childOrnA);
posA = newPosA;
ornA = newOrnA;
- } else
+ }
+ else
{
collidableIndexA = rigidBodies[bodyIndexA].m_collidableIdx;
}
-
- if (childShapeIndexB>=0)
+
+ if (childShapeIndexB >= 0)
{
collidableIndexB = gpuChildShapes[childShapeIndexB].m_shapeIndex;
float4 childPosB = gpuChildShapes[childShapeIndexB].m_childPosition;
b3Quat childOrnB = gpuChildShapes[childShapeIndexB].m_childOrientation;
- float4 newPosB = b3QuatRotate(ornB,childPosB)+posB;
- b3Quat newOrnB = b3QuatMul(ornB,childOrnB);
+ float4 newPosB = b3QuatRotate(ornB, childPosB) + posB;
+ b3Quat newOrnB = b3QuatMul(ornB, childOrnB);
posB = newPosB;
ornB = newOrnB;
- } else
+ }
+ else
{
- collidableIndexB = rigidBodies[bodyIndexB].m_collidableIdx;
+ collidableIndexB = rigidBodies[bodyIndexB].m_collidableIdx;
}
-
+
gpuHasCompoundSepNormalsOut[i] = 0;
-
+
int shapeIndexA = collidables[collidableIndexA].m_shapeIndex;
int shapeIndexB = collidables[collidableIndexB].m_shapeIndex;
-
+
int shapeTypeA = collidables[collidableIndexA].m_shapeType;
int shapeTypeB = collidables[collidableIndexB].m_shapeType;
-
if ((shapeTypeA != SHAPE_CONVEX_HULL) || (shapeTypeB != SHAPE_CONVEX_HULL))
{
@@ -1959,145 +1851,142 @@ __kernel void processCompoundPairsKernel( __global const b3Int4* gpuCompoundPa
}
int hasSeparatingAxis = 5;
-
- // int numFacesA = convexShapes[shapeIndexA].m_numFaces;
+
+ // int numFacesA = convexShapes[shapeIndexA].m_numFaces;
float dmin = FLT_MAX;
posA.w = 0.f;
posB.w = 0.f;
float4 c0local = convexShapes[shapeIndexA].m_localCenter;
float4 c0 = transform(&c0local, &posA, &ornA);
float4 c1local = convexShapes[shapeIndexB].m_localCenter;
- float4 c1 = transform(&c1local,&posB,&ornB);
+ float4 c1 = transform(&c1local, &posB, &ornB);
const float4 DeltaC2 = c0 - c1;
- float4 sepNormal = make_float4(1,0,0,0);
-// bool sepA = findSeparatingAxis( convexShapes[shapeIndexA], convexShapes[shapeIndexB],posA,ornA,posB,ornB,DeltaC2,vertices,uniqueEdges,faces,indices,&sepNormal,&dmin);
- bool sepA = findSeparatingAxis( convexShapes[shapeIndexA], convexShapes[shapeIndexB],posA,ornA,posB,ornB,vertices,uniqueEdges,faces,indices,vertices,uniqueEdges,faces,indices,sepNormal);//,&dmin);
-
+ float4 sepNormal = make_float4(1, 0, 0, 0);
+ // bool sepA = findSeparatingAxis( convexShapes[shapeIndexA], convexShapes[shapeIndexB],posA,ornA,posB,ornB,DeltaC2,vertices,uniqueEdges,faces,indices,&sepNormal,&dmin);
+ bool sepA = findSeparatingAxis(convexShapes[shapeIndexA], convexShapes[shapeIndexB], posA, ornA, posB, ornB, vertices, uniqueEdges, faces, indices, vertices, uniqueEdges, faces, indices, sepNormal); //,&dmin);
+
hasSeparatingAxis = 4;
if (!sepA)
{
hasSeparatingAxis = 0;
- } else
+ }
+ else
{
- bool sepB = findSeparatingAxis( convexShapes[shapeIndexB],convexShapes[shapeIndexA],posB,ornB,posA,ornA,vertices,uniqueEdges,faces,indices,vertices,uniqueEdges,faces,indices,sepNormal);//,&dmin);
+ bool sepB = findSeparatingAxis(convexShapes[shapeIndexB], convexShapes[shapeIndexA], posB, ornB, posA, ornA, vertices, uniqueEdges, faces, indices, vertices, uniqueEdges, faces, indices, sepNormal); //,&dmin);
if (!sepB)
{
hasSeparatingAxis = 0;
- } else//(!sepB)
+ }
+ else //(!sepB)
{
- bool sepEE = findSeparatingAxisEdgeEdge( &convexShapes[shapeIndexA], &convexShapes[shapeIndexB],posA,ornA,posB,ornB,DeltaC2,vertices,uniqueEdges,faces,indices,&sepNormal,&dmin);
+ bool sepEE = findSeparatingAxisEdgeEdge(&convexShapes[shapeIndexA], &convexShapes[shapeIndexB], posA, ornA, posB, ornB, DeltaC2, vertices, uniqueEdges, faces, indices, &sepNormal, &dmin);
if (sepEE)
{
- gpuCompoundSepNormalsOut[i] = sepNormal;//fastNormalize4(sepNormal);
- gpuHasCompoundSepNormalsOut[i] = 1;
- }//sepEE
- }//(!sepB)
- }//(!sepA)
-
-
+ gpuCompoundSepNormalsOut[i] = sepNormal; //fastNormalize4(sepNormal);
+ gpuHasCompoundSepNormalsOut[i] = 1;
+ } //sepEE
+ } //(!sepB)
+ } //(!sepA)
}
-
}
-
-__kernel void clipCompoundsHullHullKernel( __global const b3Int4* gpuCompoundPairs,
- __global const b3RigidBodyData* rigidBodies,
- __global const b3Collidable* collidables,
- __global const b3ConvexPolyhedronData* convexShapes,
- __global const b3AlignedObjectArray<b3Float4>& vertices,
- __global const b3AlignedObjectArray<b3Float4>& uniqueEdges,
- __global const b3AlignedObjectArray<b3GpuFace>& faces,
- __global const b3AlignedObjectArray<int>& indices,
- __global const b3GpuChildShape* gpuChildShapes,
- __global const b3AlignedObjectArray<b3Float4>& gpuCompoundSepNormalsOut,
- __global const b3AlignedObjectArray<int>& gpuHasCompoundSepNormalsOut,
- __global struct b3Contact4Data* globalContactsOut,
- int* nGlobalContactsOut,
- int numCompoundPairs, int maxContactCapacity, int i)
+__kernel void clipCompoundsHullHullKernel(__global const b3Int4* gpuCompoundPairs,
+ __global const b3RigidBodyData* rigidBodies,
+ __global const b3Collidable* collidables,
+ __global const b3ConvexPolyhedronData* convexShapes,
+ __global const b3AlignedObjectArray<b3Float4>& vertices,
+ __global const b3AlignedObjectArray<b3Float4>& uniqueEdges,
+ __global const b3AlignedObjectArray<b3GpuFace>& faces,
+ __global const b3AlignedObjectArray<int>& indices,
+ __global const b3GpuChildShape* gpuChildShapes,
+ __global const b3AlignedObjectArray<b3Float4>& gpuCompoundSepNormalsOut,
+ __global const b3AlignedObjectArray<int>& gpuHasCompoundSepNormalsOut,
+ __global struct b3Contact4Data* globalContactsOut,
+ int* nGlobalContactsOut,
+ int numCompoundPairs, int maxContactCapacity, int i)
{
-
-// int i = get_global_id(0);
+ // int i = get_global_id(0);
int pairIndex = i;
-
+
float4 worldVertsB1[64];
float4 worldVertsB2[64];
- int capacityWorldVerts = 64;
+ int capacityWorldVerts = 64;
float4 localContactsOut[64];
- int localContactCapacity=64;
-
+ int localContactCapacity = 64;
+
float minDist = -1e30f;
float maxDist = 0.0f;
- if (i<numCompoundPairs)
+ if (i < numCompoundPairs)
{
-
if (gpuHasCompoundSepNormalsOut[i])
{
-
int bodyIndexA = gpuCompoundPairs[i].x;
int bodyIndexB = gpuCompoundPairs[i].y;
-
+
int childShapeIndexA = gpuCompoundPairs[i].z;
int childShapeIndexB = gpuCompoundPairs[i].w;
-
+
int collidableIndexA = -1;
int collidableIndexB = -1;
-
+
b3Quat ornA = rigidBodies[bodyIndexA].m_quat;
float4 posA = rigidBodies[bodyIndexA].m_pos;
-
+
b3Quat ornB = rigidBodies[bodyIndexB].m_quat;
float4 posB = rigidBodies[bodyIndexB].m_pos;
-
+
if (childShapeIndexA >= 0)
{
collidableIndexA = gpuChildShapes[childShapeIndexA].m_shapeIndex;
float4 childPosA = gpuChildShapes[childShapeIndexA].m_childPosition;
b3Quat childOrnA = gpuChildShapes[childShapeIndexA].m_childOrientation;
- float4 newPosA = b3QuatRotate(ornA,childPosA)+posA;
- b3Quat newOrnA = b3QuatMul(ornA,childOrnA);
+ float4 newPosA = b3QuatRotate(ornA, childPosA) + posA;
+ b3Quat newOrnA = b3QuatMul(ornA, childOrnA);
posA = newPosA;
ornA = newOrnA;
- } else
+ }
+ else
{
collidableIndexA = rigidBodies[bodyIndexA].m_collidableIdx;
}
-
- if (childShapeIndexB>=0)
+
+ if (childShapeIndexB >= 0)
{
collidableIndexB = gpuChildShapes[childShapeIndexB].m_shapeIndex;
float4 childPosB = gpuChildShapes[childShapeIndexB].m_childPosition;
- b3Quat childOrnB = gpuChildShapes[childShapeIndexB].m_childOrientation;
- float4 newPosB = b3QuatRotate(ornB,childPosB)+posB;
- b3Quat newOrnB = b3QuatMul(ornB,childOrnB);
+ b3Quat childOrnB = gpuChildShapes[childShapeIndexB].m_childOrientation;
+ float4 newPosB = b3QuatRotate(ornB, childPosB) + posB;
+ b3Quat newOrnB = b3QuatMul(ornB, childOrnB);
posB = newPosB;
ornB = newOrnB;
- } else
+ }
+ else
{
- collidableIndexB = rigidBodies[bodyIndexB].m_collidableIdx;
+ collidableIndexB = rigidBodies[bodyIndexB].m_collidableIdx;
}
-
+
int shapeIndexA = collidables[collidableIndexA].m_shapeIndex;
int shapeIndexB = collidables[collidableIndexB].m_shapeIndex;
-
+
int numLocalContactsOut = clipHullAgainstHull(gpuCompoundSepNormalsOut[i],
- convexShapes[shapeIndexA], convexShapes[shapeIndexB],
- posA,ornA,
- posB,ornB,
- worldVertsB1,worldVertsB2,capacityWorldVerts,
- minDist, maxDist,
- vertices,faces,indices,
- vertices,faces,indices,
- localContactsOut,localContactCapacity);
-
- if (numLocalContactsOut>0)
- {
+ convexShapes[shapeIndexA], convexShapes[shapeIndexB],
+ posA, ornA,
+ posB, ornB,
+ worldVertsB1, worldVertsB2, capacityWorldVerts,
+ minDist, maxDist,
+ vertices, faces, indices,
+ vertices, faces, indices,
+ localContactsOut, localContactCapacity);
+
+ if (numLocalContactsOut > 0)
+ {
float4 normal = -gpuCompoundSepNormalsOut[i];
int nPoints = numLocalContactsOut;
float4* pointsIn = localContactsOut;
- b3Int4 contactIdx;// = {-1,-1,-1,-1};
+ b3Int4 contactIdx; // = {-1,-1,-1,-1};
contactIdx.s[0] = 0;
contactIdx.s[1] = 1;
@@ -2105,111 +1994,106 @@ __kernel void clipCompoundsHullHullKernel( __global const b3Int4* gpuCompoundP
contactIdx.s[3] = 3;
int nReducedContacts = extractManifoldSequentialGlobal(pointsIn, nPoints, normal, &contactIdx);
-
+
int dstIdx;
- dstIdx = b3AtomicInc( nGlobalContactsOut);
- if ((dstIdx+nReducedContacts) < maxContactCapacity)
+ dstIdx = b3AtomicInc(nGlobalContactsOut);
+ if ((dstIdx + nReducedContacts) < maxContactCapacity)
{
- __global struct b3Contact4Data* c = globalContactsOut+ dstIdx;
+ __global struct b3Contact4Data* c = globalContactsOut + dstIdx;
c->m_worldNormalOnB = -normal;
- c->m_restituitionCoeffCmp = (0.f*0xffff);c->m_frictionCoeffCmp = (0.7f*0xffff);
+ c->m_restituitionCoeffCmp = (0.f * 0xffff);
+ c->m_frictionCoeffCmp = (0.7f * 0xffff);
c->m_batchIdx = pairIndex;
int bodyA = gpuCompoundPairs[pairIndex].x;
int bodyB = gpuCompoundPairs[pairIndex].y;
- c->m_bodyAPtrAndSignBit = rigidBodies[bodyA].m_invMass==0?-bodyA:bodyA;
- c->m_bodyBPtrAndSignBit = rigidBodies[bodyB].m_invMass==0?-bodyB:bodyB;
+ c->m_bodyAPtrAndSignBit = rigidBodies[bodyA].m_invMass == 0 ? -bodyA : bodyA;
+ c->m_bodyBPtrAndSignBit = rigidBodies[bodyB].m_invMass == 0 ? -bodyB : bodyB;
c->m_childIndexA = childShapeIndexA;
c->m_childIndexB = childShapeIndexB;
- for (int i=0;i<nReducedContacts;i++)
+ for (int i = 0; i < nReducedContacts; i++)
{
c->m_worldPosB[i] = pointsIn[contactIdx.s[i]];
}
- b3Contact4Data_setNumPoints(c,nReducedContacts);
+ b3Contact4Data_setNumPoints(c, nReducedContacts);
}
-
- }// if (numContactsOut>0)
- }// if (gpuHasCompoundSepNormalsOut[i])
- }// if (i<numCompoundPairs)
+ } // if (numContactsOut>0)
+ } // if (gpuHasCompoundSepNormalsOut[i])
+ } // if (i<numCompoundPairs)
}
-
void computeContactCompoundCompound(int pairIndex,
- int bodyIndexA, int bodyIndexB,
- int collidableIndexA, int collidableIndexB,
- const b3RigidBodyData* rigidBodies,
- const b3Collidable* collidables,
- const b3ConvexPolyhedronData* convexShapes,
- const b3GpuChildShape* cpuChildShapes,
- const b3AlignedObjectArray<b3Aabb>& hostAabbsWorldSpace,
- const b3AlignedObjectArray<b3Aabb>& hostAabbsLocalSpace,
-
- const b3AlignedObjectArray<b3Vector3>& convexVertices,
- const b3AlignedObjectArray<b3Vector3>& hostUniqueEdges,
- const b3AlignedObjectArray<int>& convexIndices,
- const b3AlignedObjectArray<b3GpuFace>& faces,
-
- b3Contact4* globalContactsOut,
- int& nGlobalContactsOut,
- int maxContactCapacity,
- b3AlignedObjectArray<b3QuantizedBvhNode>& treeNodesCPU,
- b3AlignedObjectArray<b3BvhSubtreeInfo>& subTreesCPU,
- b3AlignedObjectArray<b3BvhInfo>& bvhInfoCPU
- )
+ int bodyIndexA, int bodyIndexB,
+ int collidableIndexA, int collidableIndexB,
+ const b3RigidBodyData* rigidBodies,
+ const b3Collidable* collidables,
+ const b3ConvexPolyhedronData* convexShapes,
+ const b3GpuChildShape* cpuChildShapes,
+ const b3AlignedObjectArray<b3Aabb>& hostAabbsWorldSpace,
+ const b3AlignedObjectArray<b3Aabb>& hostAabbsLocalSpace,
+
+ const b3AlignedObjectArray<b3Vector3>& convexVertices,
+ const b3AlignedObjectArray<b3Vector3>& hostUniqueEdges,
+ const b3AlignedObjectArray<int>& convexIndices,
+ const b3AlignedObjectArray<b3GpuFace>& faces,
+
+ b3Contact4* globalContactsOut,
+ int& nGlobalContactsOut,
+ int maxContactCapacity,
+ b3AlignedObjectArray<b3QuantizedBvhNode>& treeNodesCPU,
+ b3AlignedObjectArray<b3BvhSubtreeInfo>& subTreesCPU,
+ b3AlignedObjectArray<b3BvhInfo>& bvhInfoCPU)
{
-
int shapeTypeB = collidables[collidableIndexB].m_shapeType;
b3Assert(shapeTypeB == SHAPE_COMPOUND_OF_CONVEX_HULLS);
b3AlignedObjectArray<b3Int4> cpuCompoundPairsOut;
- int numCompoundPairsOut=0;
- int maxNumCompoundPairsCapacity = 8192;//1024;
+ int numCompoundPairsOut = 0;
+ int maxNumCompoundPairsCapacity = 8192; //1024;
cpuCompoundPairsOut.resize(maxNumCompoundPairsCapacity);
// work-in-progress
- findCompoundPairsKernel(
- pairIndex,
- bodyIndexA,bodyIndexB,
- collidableIndexA,collidableIndexB,
- rigidBodies,
- collidables,
- convexShapes,
- convexVertices,
- hostAabbsWorldSpace,
- hostAabbsLocalSpace,
- cpuChildShapes,
- &cpuCompoundPairsOut[0],
- &numCompoundPairsOut,
- maxNumCompoundPairsCapacity ,
- treeNodesCPU,
- subTreesCPU,
- bvhInfoCPU
- );
-
- printf("maxNumAabbChecks=%d\n",maxNumAabbChecks);
- if (numCompoundPairsOut>maxNumCompoundPairsCapacity)
+ findCompoundPairsKernel(
+ pairIndex,
+ bodyIndexA, bodyIndexB,
+ collidableIndexA, collidableIndexB,
+ rigidBodies,
+ collidables,
+ convexShapes,
+ convexVertices,
+ hostAabbsWorldSpace,
+ hostAabbsLocalSpace,
+ cpuChildShapes,
+ &cpuCompoundPairsOut[0],
+ &numCompoundPairsOut,
+ maxNumCompoundPairsCapacity,
+ treeNodesCPU,
+ subTreesCPU,
+ bvhInfoCPU);
+
+ printf("maxNumAabbChecks=%d\n", maxNumAabbChecks);
+ if (numCompoundPairsOut > maxNumCompoundPairsCapacity)
{
- b3Error("numCompoundPairsOut exceeded maxNumCompoundPairsCapacity (%d)\n",maxNumCompoundPairsCapacity);
- numCompoundPairsOut=maxNumCompoundPairsCapacity;
+ b3Error("numCompoundPairsOut exceeded maxNumCompoundPairsCapacity (%d)\n", maxNumCompoundPairsCapacity);
+ numCompoundPairsOut = maxNumCompoundPairsCapacity;
}
b3AlignedObjectArray<b3Float4> cpuCompoundSepNormalsOut;
b3AlignedObjectArray<int> cpuHasCompoundSepNormalsOut;
cpuCompoundSepNormalsOut.resize(numCompoundPairsOut);
cpuHasCompoundSepNormalsOut.resize(numCompoundPairsOut);
- for (int i=0;i<numCompoundPairsOut;i++)
+ for (int i = 0; i < numCompoundPairsOut; i++)
{
-
- processCompoundPairsKernel(&cpuCompoundPairsOut[0],rigidBodies,collidables,convexShapes,convexVertices,hostUniqueEdges,faces,convexIndices,0,cpuChildShapes,
- cpuCompoundSepNormalsOut,cpuHasCompoundSepNormalsOut,numCompoundPairsOut,i);
+ processCompoundPairsKernel(&cpuCompoundPairsOut[0], rigidBodies, collidables, convexShapes, convexVertices, hostUniqueEdges, faces, convexIndices, 0, cpuChildShapes,
+ cpuCompoundSepNormalsOut, cpuHasCompoundSepNormalsOut, numCompoundPairsOut, i);
}
- for (int i=0;i<numCompoundPairsOut;i++)
+ for (int i = 0; i < numCompoundPairsOut; i++)
{
- clipCompoundsHullHullKernel(&cpuCompoundPairsOut[0],rigidBodies,collidables,convexShapes,convexVertices,hostUniqueEdges,faces,convexIndices,cpuChildShapes,
- cpuCompoundSepNormalsOut,cpuHasCompoundSepNormalsOut,globalContactsOut,&nGlobalContactsOut,numCompoundPairsOut,maxContactCapacity,i);
+ clipCompoundsHullHullKernel(&cpuCompoundPairsOut[0], rigidBodies, collidables, convexShapes, convexVertices, hostUniqueEdges, faces, convexIndices, cpuChildShapes,
+ cpuCompoundSepNormalsOut, cpuHasCompoundSepNormalsOut, globalContactsOut, &nGlobalContactsOut, numCompoundPairsOut, maxContactCapacity, i);
}
- /*
+ /*
int childColIndexA = gpuChildShapes[childShapeIndexA].m_shapeIndex;
float4 posA = rigidBodies[bodyIndexA].m_pos;
@@ -2235,7 +2119,6 @@ void computeContactCompoundCompound(int pairIndex,
);
*/
-
/*
if (foundSepAxis)
{
@@ -2271,8 +2154,8 @@ void computeContactCompoundCompound(int pairIndex,
}
*/
-// return contactIndex;
-
+ // return contactIndex;
+
/*
int numChildrenB = collidables[collidableIndexB].m_numChildShapes;
@@ -2294,56 +2177,52 @@ void computeContactCompoundCompound(int pairIndex,
}
*/
-
}
void computeContactPlaneCompound(int pairIndex,
- int bodyIndexA, int bodyIndexB,
- int collidableIndexA, int collidableIndexB,
- const b3RigidBodyData* rigidBodies,
- const b3Collidable* collidables,
- const b3ConvexPolyhedronData* convexShapes,
- const b3GpuChildShape* cpuChildShapes,
- const b3Vector3* convexVertices,
- const int* convexIndices,
- const b3GpuFace* faces,
-
- b3Contact4* globalContactsOut,
- int& nGlobalContactsOut,
- int maxContactCapacity)
+ int bodyIndexA, int bodyIndexB,
+ int collidableIndexA, int collidableIndexB,
+ const b3RigidBodyData* rigidBodies,
+ const b3Collidable* collidables,
+ const b3ConvexPolyhedronData* convexShapes,
+ const b3GpuChildShape* cpuChildShapes,
+ const b3Vector3* convexVertices,
+ const int* convexIndices,
+ const b3GpuFace* faces,
+
+ b3Contact4* globalContactsOut,
+ int& nGlobalContactsOut,
+ int maxContactCapacity)
{
-
int shapeTypeB = collidables[collidableIndexB].m_shapeType;
b3Assert(shapeTypeB == SHAPE_COMPOUND_OF_CONVEX_HULLS);
-
int numChildrenB = collidables[collidableIndexB].m_numChildShapes;
- for (int c=0;c<numChildrenB;c++)
+ for (int c = 0; c < numChildrenB; c++)
{
- int childShapeIndexB = collidables[collidableIndexB].m_shapeIndex+c;
+ int childShapeIndexB = collidables[collidableIndexB].m_shapeIndex + c;
int childColIndexB = cpuChildShapes[childShapeIndexB].m_shapeIndex;
float4 rootPosB = rigidBodies[bodyIndexB].m_pos;
b3Quaternion rootOrnB = rigidBodies[bodyIndexB].m_quat;
b3Vector3 childPosB = cpuChildShapes[childShapeIndexB].m_childPosition;
b3Quaternion childOrnB = cpuChildShapes[childShapeIndexB].m_childOrientation;
- float4 posB = b3QuatRotate(rootOrnB,childPosB)+rootPosB;
- b3Quaternion ornB = rootOrnB*childOrnB;//b3QuatMul(ornB,childOrnB);
+ float4 posB = b3QuatRotate(rootOrnB, childPosB) + rootPosB;
+ b3Quaternion ornB = rootOrnB * childOrnB; //b3QuatMul(ornB,childOrnB);
int shapeIndexB = collidables[childColIndexB].m_shapeIndex;
const b3ConvexPolyhedronData* hullB = &convexShapes[shapeIndexB];
-
-
+
b3Vector3 posA = rigidBodies[bodyIndexA].m_pos;
b3Quaternion ornA = rigidBodies[bodyIndexA].m_quat;
- // int numContactsOut = 0;
- // int numWorldVertsB1= 0;
+ // int numContactsOut = 0;
+ // int numWorldVertsB1= 0;
b3Vector3 planeEq = faces[collidables[collidableIndexA].m_shapeIndex].m_plane;
- b3Vector3 planeNormal=b3MakeVector3(planeEq.x,planeEq.y,planeEq.z);
- b3Vector3 planeNormalWorld = b3QuatRotate(ornA,planeNormal);
+ b3Vector3 planeNormal = b3MakeVector3(planeEq.x, planeEq.y, planeEq.z);
+ b3Vector3 planeNormalWorld = b3QuatRotate(ornA, planeNormal);
float planeConstant = planeEq.w;
b3Transform convexWorldTransform;
convexWorldTransform.setIdentity();
@@ -2355,16 +2234,16 @@ void computeContactPlaneCompound(int pairIndex,
planeTransform.setRotation(ornA);
b3Transform planeInConvex;
- planeInConvex= convexWorldTransform.inverse() * planeTransform;
+ planeInConvex = convexWorldTransform.inverse() * planeTransform;
b3Transform convexInPlane;
convexInPlane = planeTransform.inverse() * convexWorldTransform;
-
- b3Vector3 planeNormalInConvex = planeInConvex.getBasis()*-planeNormal;
+
+ b3Vector3 planeNormalInConvex = planeInConvex.getBasis() * -planeNormal;
float maxDot = -1e30;
- int hitVertex=-1;
+ int hitVertex = -1;
b3Vector3 hitVtx;
- #define MAX_PLANE_CONVEX_POINTS 64
+#define MAX_PLANE_CONVEX_POINTS 64
b3Vector3 contactPoints[MAX_PLANE_CONVEX_POINTS];
int numPoints = 0;
@@ -2374,54 +2253,52 @@ void computeContactPlaneCompound(int pairIndex,
contactIdx.s[1] = 1;
contactIdx.s[2] = 2;
contactIdx.s[3] = 3;
-
- for (int i=0;i<hullB->m_numVertices;i++)
+
+ for (int i = 0; i < hullB->m_numVertices; i++)
{
- b3Vector3 vtx = convexVertices[hullB->m_vertexOffset+i];
+ b3Vector3 vtx = convexVertices[hullB->m_vertexOffset + i];
float curDot = vtx.dot(planeNormalInConvex);
-
- if (curDot>maxDot)
+ if (curDot > maxDot)
{
- hitVertex=i;
- maxDot=curDot;
+ hitVertex = i;
+ maxDot = curDot;
hitVtx = vtx;
//make sure the deepest points is always included
- if (numPoints==MAX_PLANE_CONVEX_POINTS)
+ if (numPoints == MAX_PLANE_CONVEX_POINTS)
numPoints--;
}
- if (numPoints<MAX_PLANE_CONVEX_POINTS)
+ if (numPoints < MAX_PLANE_CONVEX_POINTS)
{
- b3Vector3 vtxWorld = convexWorldTransform*vtx;
- b3Vector3 vtxInPlane = planeTransform.inverse()*vtxWorld;
- float dist = planeNormal.dot(vtxInPlane)-planeConstant;
- if (dist<0.f)
+ b3Vector3 vtxWorld = convexWorldTransform * vtx;
+ b3Vector3 vtxInPlane = planeTransform.inverse() * vtxWorld;
+ float dist = planeNormal.dot(vtxInPlane) - planeConstant;
+ if (dist < 0.f)
{
vtxWorld.w = dist;
contactPoints[numPoints] = vtxWorld;
numPoints++;
}
}
-
}
- int numReducedPoints = 0;
+ int numReducedPoints = 0;
numReducedPoints = numPoints;
-
- if (numPoints>4)
+
+ if (numPoints > 4)
{
- numReducedPoints = extractManifoldSequentialGlobal( contactPoints, numPoints, planeNormalInConvex, &contactIdx);
+ numReducedPoints = extractManifoldSequentialGlobal(contactPoints, numPoints, planeNormalInConvex, &contactIdx);
}
int dstIdx;
- // dstIdx = nGlobalContactsOut++;//AppendInc( nGlobalContactsOut, dstIdx );
-
- if (numReducedPoints>0)
+ // dstIdx = nGlobalContactsOut++;//AppendInc( nGlobalContactsOut, dstIdx );
+
+ if (numReducedPoints > 0)
{
if (nGlobalContactsOut < maxContactCapacity)
{
- dstIdx=nGlobalContactsOut;
+ dstIdx = nGlobalContactsOut;
nGlobalContactsOut++;
b3Contact4* c = &globalContactsOut[dstIdx];
@@ -2430,48 +2307,37 @@ void computeContactPlaneCompound(int pairIndex,
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;
- for (int i=0;i<numReducedPoints;i++)
+ c->m_bodyAPtrAndSignBit = rigidBodies[bodyIndexA].m_invMass == 0 ? -bodyIndexA : bodyIndexA;
+ c->m_bodyBPtrAndSignBit = rigidBodies[bodyIndexB].m_invMass == 0 ? -bodyIndexB : bodyIndexB;
+ for (int i = 0; i < numReducedPoints; i++)
{
b3Vector3 pOnB1 = contactPoints[contactIdx.s[i]];
c->m_worldPosB[i] = pOnB1;
}
c->m_worldNormalOnB.w = (b3Scalar)numReducedPoints;
- }//if (dstIdx < numPairs)
- }
-
+ } //if (dstIdx < numPairs)
+ }
}
-
-
}
-
-
-
-
-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)
+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;
@@ -2487,64 +2353,65 @@ void computeContactSphereConvex(int pairIndex,
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?
+ // 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++ )
+ for (int f = 0; f < numFaces; f++)
{
- b3GpuFace face = faces[convexShapes[shapeIndex].m_faceOffset+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);
+ 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)
+ if (dist > radius)
{
bCollide = false;
break;
}
- if ( dist > 0 )
+ if (dist > 0)
{
//might hit an edge or vertex
b3Vector3 out;
bool isInPoly = IsPointInPolygon(spherePos,
- &face,
- &convexVertices[convexShapes[shapeIndex].m_vertexOffset],
- convexIndices,
- &out);
+ &face,
+ &convexVertices[convexShapes[shapeIndex].m_vertexOffset],
+ convexIndices,
+ &out);
if (isInPoly)
{
- if (dist>minDist)
+ if (dist > minDist)
{
minDist = dist;
closestPnt = pntReturn;
localHitNormal = planeEqn;
- region=1;
+ region = 1;
}
- } else
+ }
+ else
{
- b3Vector3 tmp = spherePos-out;
+ b3Vector3 tmp = spherePos - out;
b3Scalar l2 = tmp.length2();
- if (l2<radius*radius)
+ if (l2 < radius * radius)
{
- dist = b3Sqrt(l2);
- if (dist>minDist)
+ dist = b3Sqrt(l2);
+ if (dist > minDist)
{
minDist = dist;
closestPnt = out;
- localHitNormal = tmp/dist;
- region=2;
+ localHitNormal = tmp / dist;
+ region = 2;
}
-
- } else
+ }
+ else
{
bCollide = false;
break;
@@ -2553,12 +2420,12 @@ void computeContactSphereConvex(int pairIndex,
}
else
{
- if ( dist > minDist )
+ if (dist > minDist)
{
minDist = dist;
closestPnt = pntReturn;
localHitNormal = planeEqn;
- region=3;
+ region = 3;
}
}
}
@@ -2567,128 +2434,113 @@ void computeContactSphereConvex(int pairIndex,
if (bCollide && minDist > -10000)
{
-
- float4 normalOnSurfaceB1 = tr.getBasis()*localHitNormal;//-hitNormalWorld;
+ float4 normalOnSurfaceB1 = tr.getBasis() * localHitNormal; //-hitNormalWorld;
float4 pOnB1 = tr(closestPnt);
//printf("dist ,%f,",minDist);
- float actualDepth = minDist-radius;
- if (actualDepth<0)
+ 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;
+ //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++;
+ int dstIdx;
+ // dstIdx = nGlobalContactsOut++;//AppendInc( nGlobalContactsOut, dstIdx );
- b3Contact4* c = &globalContactsOut[dstIdx];
- c->m_worldNormalOnB = normalOnSurfaceB1;
- c->setFrictionCoeff(0.7);
- c->setRestituitionCoeff(0.f);
+ if (nGlobalContactsOut < maxContactCapacity)
+ {
+ dstIdx = nGlobalContactsOut;
+ nGlobalContactsOut++;
- 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)
+ 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)
-
+ } //if (hasCollision)
}
-
-
-
int computeContactConvexConvex2(
- int pairIndex,
- int bodyIndexA, int bodyIndexB,
- int collidableIndexA, int collidableIndexB,
- const b3AlignedObjectArray<b3RigidBodyData>& rigidBodies,
- const b3AlignedObjectArray<b3Collidable>& collidables,
- const b3AlignedObjectArray<b3ConvexPolyhedronData>& convexShapes,
- const b3AlignedObjectArray<b3Vector3>& convexVertices,
- const b3AlignedObjectArray<b3Vector3>& uniqueEdges,
- const b3AlignedObjectArray<int>& convexIndices,
- const b3AlignedObjectArray<b3GpuFace>& faces,
- b3AlignedObjectArray<b3Contact4>& globalContactsOut,
- int& nGlobalContactsOut,
- int maxContactCapacity,
- const b3AlignedObjectArray<b3Contact4>& oldContacts
- )
+ int pairIndex,
+ int bodyIndexA, int bodyIndexB,
+ int collidableIndexA, int collidableIndexB,
+ const b3AlignedObjectArray<b3RigidBodyData>& rigidBodies,
+ const b3AlignedObjectArray<b3Collidable>& collidables,
+ const b3AlignedObjectArray<b3ConvexPolyhedronData>& convexShapes,
+ const b3AlignedObjectArray<b3Vector3>& convexVertices,
+ const b3AlignedObjectArray<b3Vector3>& uniqueEdges,
+ const b3AlignedObjectArray<int>& convexIndices,
+ const b3AlignedObjectArray<b3GpuFace>& faces,
+ b3AlignedObjectArray<b3Contact4>& globalContactsOut,
+ int& nGlobalContactsOut,
+ int maxContactCapacity,
+ const b3AlignedObjectArray<b3Contact4>& oldContacts)
{
int contactIndex = -1;
b3Vector3 posA = rigidBodies[bodyIndexA].m_pos;
b3Quaternion ornA = rigidBodies[bodyIndexA].m_quat;
b3Vector3 posB = rigidBodies[bodyIndexB].m_pos;
b3Quaternion ornB = rigidBodies[bodyIndexB].m_quat;
-
b3ConvexPolyhedronData hullA, hullB;
-
+
b3Vector3 sepNormalWorldSpace;
-
+ b3Collidable colA = collidables[collidableIndexA];
+ hullA = convexShapes[colA.m_shapeIndex];
+ //printf("numvertsA = %d\n",hullA.m_numVertices);
- 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);
+ b3Collidable colB = collidables[collidableIndexB];
+ hullB = convexShapes[colB.m_shapeIndex];
+ //printf("numvertsB = %d\n",hullB.m_numVertices);
-// int contactCapacity = MAX_VERTS;
+ // int contactCapacity = MAX_VERTS;
//int numContactsOut=0;
-
#ifdef _WIN32
b3Assert(_finite(rigidBodies[bodyIndexA].m_pos.x));
b3Assert(_finite(rigidBodies[bodyIndexB].m_pos.x));
#endif
-
- bool foundSepAxis = findSeparatingAxis(hullA,hullB,
- posA,
- ornA,
- posB,
- ornB,
- convexVertices,uniqueEdges,faces,convexIndices,
- convexVertices,uniqueEdges,faces,convexIndices,
-
- sepNormalWorldSpace
- );
+ bool foundSepAxis = findSeparatingAxis(hullA, hullB,
+ posA,
+ ornA,
+ posB,
+ ornB,
+
+ convexVertices, uniqueEdges, faces, convexIndices,
+ convexVertices, uniqueEdges, faces, convexIndices,
+
+ sepNormalWorldSpace);
-
if (foundSepAxis)
{
-
-
contactIndex = clipHullHullSingle(
bodyIndexA, bodyIndexB,
- posA,ornA,
- posB,ornB,
+ posA, ornA,
+ posB, ornB,
collidableIndexA, collidableIndexB,
- &rigidBodies,
+ &rigidBodies,
&globalContactsOut,
nGlobalContactsOut,
-
+
convexShapes,
convexShapes,
-
- convexVertices,
- uniqueEdges,
+
+ convexVertices,
+ uniqueEdges,
faces,
convexIndices,
-
+
convexVertices,
uniqueEdges,
faces,
@@ -2698,50 +2550,42 @@ int computeContactConvexConvex2(
collidables,
sepNormalWorldSpace,
maxContactCapacity);
-
}
return contactIndex;
}
-
-
-
-
-
-
-void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>* pairs, int nPairs,
- const b3OpenCLArray<b3RigidBodyData>* bodyBuf,
- b3OpenCLArray<b3Contact4>* contactOut, int& nContacts,
- const b3OpenCLArray<b3Contact4>* oldContacts,
- int maxContactCapacity,
- int compoundPairCapacity,
- const b3OpenCLArray<b3ConvexPolyhedronData>& convexData,
- const b3OpenCLArray<b3Vector3>& gpuVertices,
- const b3OpenCLArray<b3Vector3>& gpuUniqueEdges,
- const b3OpenCLArray<b3GpuFace>& gpuFaces,
- const b3OpenCLArray<int>& gpuIndices,
- const b3OpenCLArray<b3Collidable>& gpuCollidables,
- const b3OpenCLArray<b3GpuChildShape>& gpuChildShapes,
-
- const b3OpenCLArray<b3Aabb>& clAabbsWorldSpace,
- const b3OpenCLArray<b3Aabb>& clAabbsLocalSpace,
-
- b3OpenCLArray<b3Vector3>& worldVertsB1GPU,
- b3OpenCLArray<b3Int4>& clippingFacesOutGPU,
- b3OpenCLArray<b3Vector3>& worldNormalsAGPU,
- b3OpenCLArray<b3Vector3>& worldVertsA1GPU,
- b3OpenCLArray<b3Vector3>& worldVertsB2GPU,
- b3AlignedObjectArray<class b3OptimizedBvh*>& bvhDataUnused,
- b3OpenCLArray<b3QuantizedBvhNode>* treeNodesGPU,
- b3OpenCLArray<b3BvhSubtreeInfo>* subTreesGPU,
- b3OpenCLArray<b3BvhInfo>* bvhInfo,
-
- int numObjects,
- int maxTriConvexPairCapacity,
- b3OpenCLArray<b3Int4>& triangleConvexPairsOut,
- int& numTriConvexPairsOut
- )
+void GpuSatCollision::computeConvexConvexContactsGPUSAT(b3OpenCLArray<b3Int4>* pairs, int nPairs,
+ const b3OpenCLArray<b3RigidBodyData>* bodyBuf,
+ b3OpenCLArray<b3Contact4>* contactOut, int& nContacts,
+ const b3OpenCLArray<b3Contact4>* oldContacts,
+ int maxContactCapacity,
+ int compoundPairCapacity,
+ const b3OpenCLArray<b3ConvexPolyhedronData>& convexData,
+ const b3OpenCLArray<b3Vector3>& gpuVertices,
+ const b3OpenCLArray<b3Vector3>& gpuUniqueEdges,
+ const b3OpenCLArray<b3GpuFace>& gpuFaces,
+ const b3OpenCLArray<int>& gpuIndices,
+ const b3OpenCLArray<b3Collidable>& gpuCollidables,
+ const b3OpenCLArray<b3GpuChildShape>& gpuChildShapes,
+
+ const b3OpenCLArray<b3Aabb>& clAabbsWorldSpace,
+ const b3OpenCLArray<b3Aabb>& clAabbsLocalSpace,
+
+ b3OpenCLArray<b3Vector3>& worldVertsB1GPU,
+ b3OpenCLArray<b3Int4>& clippingFacesOutGPU,
+ b3OpenCLArray<b3Vector3>& worldNormalsAGPU,
+ b3OpenCLArray<b3Vector3>& worldVertsA1GPU,
+ b3OpenCLArray<b3Vector3>& worldVertsB2GPU,
+ b3AlignedObjectArray<class b3OptimizedBvh*>& bvhDataUnused,
+ b3OpenCLArray<b3QuantizedBvhNode>* treeNodesGPU,
+ b3OpenCLArray<b3BvhSubtreeInfo>* subTreesGPU,
+ b3OpenCLArray<b3BvhInfo>* bvhInfo,
+
+ int numObjects,
+ int maxTriConvexPairCapacity,
+ b3OpenCLArray<b3Int4>& triangleConvexPairsOut,
+ int& numTriConvexPairsOut)
{
myframecount++;
@@ -2750,14 +2594,13 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
#ifdef CHECK_ON_HOST
-
- b3AlignedObjectArray<b3QuantizedBvhNode> treeNodesCPU;
+ b3AlignedObjectArray<b3QuantizedBvhNode> treeNodesCPU;
treeNodesGPU->copyToHost(treeNodesCPU);
- b3AlignedObjectArray<b3BvhSubtreeInfo> subTreesCPU;
+ b3AlignedObjectArray<b3BvhSubtreeInfo> subTreesCPU;
subTreesGPU->copyToHost(subTreesCPU);
- b3AlignedObjectArray<b3BvhInfo> bvhInfoCPU;
+ b3AlignedObjectArray<b3BvhInfo> bvhInfoCPU;
bvhInfo->copyToHost(bvhInfoCPU);
b3AlignedObjectArray<b3Aabb> hostAabbsWorldSpace;
@@ -2772,8 +2615,6 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
b3AlignedObjectArray<b3RigidBodyData> hostBodyBuf;
bodyBuf->copyToHost(hostBodyBuf);
-
-
b3AlignedObjectArray<b3ConvexPolyhedronData> hostConvexData;
convexData.copyToHost(hostConvexData);
@@ -2788,10 +2629,9 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
gpuIndices.copyToHost(hostIndices);
b3AlignedObjectArray<b3Collidable> hostCollidables;
gpuCollidables.copyToHost(hostCollidables);
-
+
b3AlignedObjectArray<b3GpuChildShape> cpuChildShapes;
gpuChildShapes.copyToHost(cpuChildShapes);
-
b3AlignedObjectArray<b3Int4> hostTriangleConvexPairs;
@@ -2802,16 +2642,15 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
}
b3AlignedObjectArray<b3Contact4> oldHostContacts;
-
+
if (oldContacts->size())
{
oldContacts->copyToHost(oldHostContacts);
}
-
hostContacts.resize(maxContactCapacity);
- for (int i=0;i<nPairs;i++)
+ for (int i = 0; i < nPairs; i++)
{
int bodyIndexA = hostPairs[i].x;
int bodyIndexB = hostPairs[i].y;
@@ -2821,84 +2660,73 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
if (hostCollidables[collidableIndexA].m_shapeType == SHAPE_SPHERE &&
hostCollidables[collidableIndexB].m_shapeType == SHAPE_CONVEX_HULL)
{
- computeContactSphereConvex(i,bodyIndexA,bodyIndexB,collidableIndexA,collidableIndexB,&hostBodyBuf[0],
- &hostCollidables[0],&hostConvexData[0],&hostVertices[0],&hostIndices[0],&hostFaces[0],&hostContacts[0],nContacts,maxContactCapacity);
+ computeContactSphereConvex(i, bodyIndexA, bodyIndexB, collidableIndexA, collidableIndexB, &hostBodyBuf[0],
+ &hostCollidables[0], &hostConvexData[0], &hostVertices[0], &hostIndices[0], &hostFaces[0], &hostContacts[0], nContacts, maxContactCapacity);
}
if (hostCollidables[collidableIndexA].m_shapeType == SHAPE_CONVEX_HULL &&
hostCollidables[collidableIndexB].m_shapeType == SHAPE_SPHERE)
{
- computeContactSphereConvex(i,bodyIndexB,bodyIndexA,collidableIndexB,collidableIndexA,&hostBodyBuf[0],
- &hostCollidables[0],&hostConvexData[0],&hostVertices[0],&hostIndices[0],&hostFaces[0],&hostContacts[0],nContacts,maxContactCapacity);
+ computeContactSphereConvex(i, bodyIndexB, bodyIndexA, collidableIndexB, collidableIndexA, &hostBodyBuf[0],
+ &hostCollidables[0], &hostConvexData[0], &hostVertices[0], &hostIndices[0], &hostFaces[0], &hostContacts[0], nContacts, maxContactCapacity);
//printf("convex-sphere\n");
-
}
if (hostCollidables[collidableIndexA].m_shapeType == SHAPE_CONVEX_HULL &&
hostCollidables[collidableIndexB].m_shapeType == SHAPE_PLANE)
{
- computeContactPlaneConvex(i,bodyIndexB,bodyIndexA,collidableIndexB,collidableIndexA,&hostBodyBuf[0],
- &hostCollidables[0],&hostConvexData[0],&hostVertices[0],&hostIndices[0],&hostFaces[0],&hostContacts[0],nContacts,maxContactCapacity);
-// printf("convex-plane\n");
-
+ computeContactPlaneConvex(i, bodyIndexB, bodyIndexA, collidableIndexB, collidableIndexA, &hostBodyBuf[0],
+ &hostCollidables[0], &hostConvexData[0], &hostVertices[0], &hostIndices[0], &hostFaces[0], &hostContacts[0], nContacts, maxContactCapacity);
+ // printf("convex-plane\n");
}
if (hostCollidables[collidableIndexA].m_shapeType == SHAPE_PLANE &&
hostCollidables[collidableIndexB].m_shapeType == SHAPE_CONVEX_HULL)
{
- computeContactPlaneConvex(i,bodyIndexA,bodyIndexB,collidableIndexA,collidableIndexB,&hostBodyBuf[0],
- &hostCollidables[0],&hostConvexData[0],&hostVertices[0],&hostIndices[0],&hostFaces[0],&hostContacts[0],nContacts,maxContactCapacity);
-// printf("plane-convex\n");
-
+ computeContactPlaneConvex(i, bodyIndexA, bodyIndexB, collidableIndexA, collidableIndexB, &hostBodyBuf[0],
+ &hostCollidables[0], &hostConvexData[0], &hostVertices[0], &hostIndices[0], &hostFaces[0], &hostContacts[0], nContacts, maxContactCapacity);
+ // printf("plane-convex\n");
}
- if (hostCollidables[collidableIndexA].m_shapeType == SHAPE_COMPOUND_OF_CONVEX_HULLS &&
+ if (hostCollidables[collidableIndexA].m_shapeType == SHAPE_COMPOUND_OF_CONVEX_HULLS &&
hostCollidables[collidableIndexB].m_shapeType == SHAPE_COMPOUND_OF_CONVEX_HULLS)
{
- computeContactCompoundCompound(i,bodyIndexB,bodyIndexA,collidableIndexB,collidableIndexA,&hostBodyBuf[0],
- &hostCollidables[0],&hostConvexData[0],&cpuChildShapes[0], hostAabbsWorldSpace,hostAabbsLocalSpace,hostVertices,hostUniqueEdges,hostIndices,hostFaces,&hostContacts[0],
- nContacts,maxContactCapacity,treeNodesCPU,subTreesCPU,bvhInfoCPU);
-// printf("convex-plane\n");
-
+ computeContactCompoundCompound(i, bodyIndexB, bodyIndexA, collidableIndexB, collidableIndexA, &hostBodyBuf[0],
+ &hostCollidables[0], &hostConvexData[0], &cpuChildShapes[0], hostAabbsWorldSpace, hostAabbsLocalSpace, hostVertices, hostUniqueEdges, hostIndices, hostFaces, &hostContacts[0],
+ nContacts, maxContactCapacity, treeNodesCPU, subTreesCPU, bvhInfoCPU);
+ // printf("convex-plane\n");
}
-
- if (hostCollidables[collidableIndexA].m_shapeType == SHAPE_COMPOUND_OF_CONVEX_HULLS &&
+ if (hostCollidables[collidableIndexA].m_shapeType == SHAPE_COMPOUND_OF_CONVEX_HULLS &&
hostCollidables[collidableIndexB].m_shapeType == SHAPE_PLANE)
{
- computeContactPlaneCompound(i,bodyIndexB,bodyIndexA,collidableIndexB,collidableIndexA,&hostBodyBuf[0],
- &hostCollidables[0],&hostConvexData[0],&cpuChildShapes[0], &hostVertices[0],&hostIndices[0],&hostFaces[0],&hostContacts[0],nContacts,maxContactCapacity);
-// printf("convex-plane\n");
-
+ computeContactPlaneCompound(i, bodyIndexB, bodyIndexA, collidableIndexB, collidableIndexA, &hostBodyBuf[0],
+ &hostCollidables[0], &hostConvexData[0], &cpuChildShapes[0], &hostVertices[0], &hostIndices[0], &hostFaces[0], &hostContacts[0], nContacts, maxContactCapacity);
+ // printf("convex-plane\n");
}
if (hostCollidables[collidableIndexA].m_shapeType == SHAPE_PLANE &&
hostCollidables[collidableIndexB].m_shapeType == SHAPE_COMPOUND_OF_CONVEX_HULLS)
{
- computeContactPlaneCompound(i,bodyIndexA,bodyIndexB,collidableIndexA,collidableIndexB,&hostBodyBuf[0],
- &hostCollidables[0],&hostConvexData[0],&cpuChildShapes[0],&hostVertices[0],&hostIndices[0],&hostFaces[0],&hostContacts[0],nContacts,maxContactCapacity);
-// printf("plane-convex\n");
-
+ computeContactPlaneCompound(i, bodyIndexA, bodyIndexB, collidableIndexA, collidableIndexB, &hostBodyBuf[0],
+ &hostCollidables[0], &hostConvexData[0], &cpuChildShapes[0], &hostVertices[0], &hostIndices[0], &hostFaces[0], &hostContacts[0], nContacts, maxContactCapacity);
+ // printf("plane-convex\n");
}
if (hostCollidables[collidableIndexA].m_shapeType == SHAPE_CONVEX_HULL &&
hostCollidables[collidableIndexB].m_shapeType == SHAPE_CONVEX_HULL)
{
//printf("hostPairs[i].z=%d\n",hostPairs[i].z);
- int contactIndex = computeContactConvexConvex2( i,bodyIndexA,bodyIndexB,collidableIndexA,collidableIndexB,hostBodyBuf, hostCollidables,hostConvexData,hostVertices,hostUniqueEdges,hostIndices,hostFaces,hostContacts,nContacts,maxContactCapacity,oldHostContacts);
+ int contactIndex = computeContactConvexConvex2(i, bodyIndexA, bodyIndexB, collidableIndexA, collidableIndexB, hostBodyBuf, hostCollidables, hostConvexData, hostVertices, hostUniqueEdges, hostIndices, hostFaces, hostContacts, nContacts, maxContactCapacity, oldHostContacts);
//int contactIndex = computeContactConvexConvex(hostPairs,i,bodyIndexA,bodyIndexB,collidableIndexA,collidableIndexB,hostBodyBuf,hostCollidables,hostConvexData,hostVertices,hostUniqueEdges,hostIndices,hostFaces,hostContacts,nContacts,maxContactCapacity,oldHostContacts);
-
- if (contactIndex>=0)
+ if (contactIndex >= 0)
{
-// printf("convex convex contactIndex = %d\n",contactIndex);
+ // printf("convex convex contactIndex = %d\n",contactIndex);
hostPairs[i].z = contactIndex;
}
-// printf("plane-convex\n");
-
+ // printf("plane-convex\n");
}
-
-
}
if (hostPairs.size())
@@ -2908,81 +2736,76 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
hostContacts.resize(nContacts);
if (nContacts)
- {
-
- contactOut->copyFromHost(hostContacts);
- } else
+ {
+ contactOut->copyFromHost(hostContacts);
+ }
+ else
{
contactOut->resize(0);
- }
+ }
- m_totalContactsOut.copyFromHostPointer(&nContacts,1,0,true);
- //printf("(HOST) nContacts = %d\n",nContacts);
+ m_totalContactsOut.copyFromHostPointer(&nContacts, 1, 0, true);
+ //printf("(HOST) nContacts = %d\n",nContacts);
#else
{
if (nPairs)
{
- m_totalContactsOut.copyFromHostPointer(&nContacts,1,0,true);
+ m_totalContactsOut.copyFromHostPointer(&nContacts, 1, 0, true);
B3_PROFILE("primitiveContactsKernel");
b3BufferInfoCL bInfo[] = {
- b3BufferInfoCL( pairs->getBufferCL(), true ),
- b3BufferInfoCL( bodyBuf->getBufferCL(),true),
- b3BufferInfoCL( gpuCollidables.getBufferCL(),true),
- b3BufferInfoCL( convexData.getBufferCL(),true),
- b3BufferInfoCL( gpuVertices.getBufferCL(),true),
- b3BufferInfoCL( gpuUniqueEdges.getBufferCL(),true),
- b3BufferInfoCL( gpuFaces.getBufferCL(),true),
- b3BufferInfoCL( gpuIndices.getBufferCL(),true),
- b3BufferInfoCL( contactOut->getBufferCL()),
- b3BufferInfoCL( m_totalContactsOut.getBufferCL())
- };
-
- b3LauncherCL launcher(m_queue, m_primitiveContactsKernel,"m_primitiveContactsKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( nPairs );
+ b3BufferInfoCL(pairs->getBufferCL(), true),
+ b3BufferInfoCL(bodyBuf->getBufferCL(), true),
+ b3BufferInfoCL(gpuCollidables.getBufferCL(), true),
+ b3BufferInfoCL(convexData.getBufferCL(), true),
+ b3BufferInfoCL(gpuVertices.getBufferCL(), true),
+ b3BufferInfoCL(gpuUniqueEdges.getBufferCL(), true),
+ b3BufferInfoCL(gpuFaces.getBufferCL(), true),
+ b3BufferInfoCL(gpuIndices.getBufferCL(), true),
+ b3BufferInfoCL(contactOut->getBufferCL()),
+ b3BufferInfoCL(m_totalContactsOut.getBufferCL())};
+
+ b3LauncherCL launcher(m_queue, m_primitiveContactsKernel, "m_primitiveContactsKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(nPairs);
launcher.setConst(maxContactCapacity);
int num = nPairs;
- launcher.launch1D( num);
+ launcher.launch1D(num);
clFinish(m_queue);
-
+
nContacts = m_totalContactsOut.at(0);
contactOut->resize(nContacts);
}
}
-
-#endif//CHECK_ON_HOST
-
+#endif //CHECK_ON_HOST
+
B3_PROFILE("computeConvexConvexContactsGPUSAT");
- // printf("nContacts = %d\n",nContacts);
-
-
+ // printf("nContacts = %d\n",nContacts);
+
m_sepNormals.resize(nPairs);
m_hasSeparatingNormals.resize(nPairs);
-
- int concaveCapacity=maxTriConvexPairCapacity;
+
+ int concaveCapacity = maxTriConvexPairCapacity;
m_concaveSepNormals.resize(concaveCapacity);
m_concaveHasSeparatingNormals.resize(concaveCapacity);
m_numConcavePairsOut.resize(0);
m_numConcavePairsOut.push_back(0);
-
m_gpuCompoundPairs.resize(compoundPairCapacity);
m_gpuCompoundSepNormals.resize(compoundPairCapacity);
-
-
+
m_gpuHasCompoundSepNormals.resize(compoundPairCapacity);
-
+
m_numCompoundPairsOut.resize(0);
m_numCompoundPairsOut.push_back(0);
int numCompoundPairs = 0;
- int numConcavePairs =0;
+ int numConcavePairs = 0;
{
clFinish(m_queue);
@@ -2991,33 +2814,30 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
m_dmins.resize(nPairs);
if (splitSearchSepAxisConvex)
{
-
-
if (useMprGpu)
{
nContacts = m_totalContactsOut.at(0);
{
B3_PROFILE("mprPenetrationKernel");
- b3BufferInfoCL bInfo[] = {
- b3BufferInfoCL( pairs->getBufferCL(), true ),
- b3BufferInfoCL( bodyBuf->getBufferCL(),true),
- b3BufferInfoCL( gpuCollidables.getBufferCL(),true),
- b3BufferInfoCL( convexData.getBufferCL(),true),
- b3BufferInfoCL( gpuVertices.getBufferCL(),true),
- b3BufferInfoCL( m_sepNormals.getBufferCL()),
- b3BufferInfoCL( m_hasSeparatingNormals.getBufferCL()),
- b3BufferInfoCL( contactOut->getBufferCL()),
- b3BufferInfoCL( m_totalContactsOut.getBufferCL())
- };
-
- b3LauncherCL launcher(m_queue, m_mprPenetrationKernel,"mprPenetrationKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
+ b3BufferInfoCL bInfo[] = {
+ b3BufferInfoCL(pairs->getBufferCL(), true),
+ b3BufferInfoCL(bodyBuf->getBufferCL(), true),
+ b3BufferInfoCL(gpuCollidables.getBufferCL(), true),
+ b3BufferInfoCL(convexData.getBufferCL(), true),
+ b3BufferInfoCL(gpuVertices.getBufferCL(), true),
+ b3BufferInfoCL(m_sepNormals.getBufferCL()),
+ b3BufferInfoCL(m_hasSeparatingNormals.getBufferCL()),
+ b3BufferInfoCL(contactOut->getBufferCL()),
+ b3BufferInfoCL(m_totalContactsOut.getBufferCL())};
+
+ b3LauncherCL launcher(m_queue, m_mprPenetrationKernel, "mprPenetrationKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
launcher.setConst(maxContactCapacity);
- launcher.setConst( nPairs );
+ launcher.setConst(nPairs);
int num = nPairs;
- launcher.launch1D( num);
+ launcher.launch1D(num);
clFinish(m_queue);
/*
b3AlignedObjectArray<int>hostHasSepAxis;
@@ -3027,173 +2847,160 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
*/
nContacts = m_totalContactsOut.at(0);
contactOut->resize(nContacts);
- // printf("nContacts (after mprPenetrationKernel) = %d\n",nContacts);
- if (nContacts>maxContactCapacity)
+ // printf("nContacts (after mprPenetrationKernel) = %d\n",nContacts);
+ if (nContacts > maxContactCapacity)
{
-
b3Error("Error: contacts exceeds capacity (%d/%d)\n", nContacts, maxContactCapacity);
nContacts = maxContactCapacity;
}
-
}
}
-
+
if (1)
{
-
if (1)
{
- {
- B3_PROFILE("findSeparatingAxisVertexFaceKernel");
- b3BufferInfoCL bInfo[] = {
- b3BufferInfoCL( pairs->getBufferCL(), true ),
- b3BufferInfoCL( bodyBuf->getBufferCL(),true),
- b3BufferInfoCL( gpuCollidables.getBufferCL(),true),
- b3BufferInfoCL( convexData.getBufferCL(),true),
- b3BufferInfoCL( gpuVertices.getBufferCL(),true),
- b3BufferInfoCL( gpuUniqueEdges.getBufferCL(),true),
- b3BufferInfoCL( gpuFaces.getBufferCL(),true),
- b3BufferInfoCL( gpuIndices.getBufferCL(),true),
- b3BufferInfoCL( clAabbsWorldSpace.getBufferCL(),true),
- b3BufferInfoCL( m_sepNormals.getBufferCL()),
- b3BufferInfoCL( m_hasSeparatingNormals.getBufferCL()),
- b3BufferInfoCL( m_dmins.getBufferCL())
- };
-
- b3LauncherCL launcher(m_queue, m_findSeparatingAxisVertexFaceKernel,"findSeparatingAxisVertexFaceKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( nPairs );
+ {
+ B3_PROFILE("findSeparatingAxisVertexFaceKernel");
+ b3BufferInfoCL bInfo[] = {
+ b3BufferInfoCL(pairs->getBufferCL(), true),
+ b3BufferInfoCL(bodyBuf->getBufferCL(), true),
+ b3BufferInfoCL(gpuCollidables.getBufferCL(), true),
+ b3BufferInfoCL(convexData.getBufferCL(), true),
+ b3BufferInfoCL(gpuVertices.getBufferCL(), true),
+ b3BufferInfoCL(gpuUniqueEdges.getBufferCL(), true),
+ b3BufferInfoCL(gpuFaces.getBufferCL(), true),
+ b3BufferInfoCL(gpuIndices.getBufferCL(), true),
+ b3BufferInfoCL(clAabbsWorldSpace.getBufferCL(), true),
+ b3BufferInfoCL(m_sepNormals.getBufferCL()),
+ b3BufferInfoCL(m_hasSeparatingNormals.getBufferCL()),
+ b3BufferInfoCL(m_dmins.getBufferCL())};
+
+ b3LauncherCL launcher(m_queue, m_findSeparatingAxisVertexFaceKernel, "findSeparatingAxisVertexFaceKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(nPairs);
- int num = nPairs;
- launcher.launch1D( num);
- clFinish(m_queue);
- }
+ int num = nPairs;
+ launcher.launch1D(num);
+ clFinish(m_queue);
+ }
+ int numDirections = sizeof(unitSphere162) / sizeof(b3Vector3);
- int numDirections = sizeof(unitSphere162)/sizeof(b3Vector3);
-
- {
- B3_PROFILE("findSeparatingAxisEdgeEdgeKernel");
- b3BufferInfoCL bInfo[] = {
- b3BufferInfoCL( pairs->getBufferCL(), true ),
- b3BufferInfoCL( bodyBuf->getBufferCL(),true),
- b3BufferInfoCL( gpuCollidables.getBufferCL(),true),
- b3BufferInfoCL( convexData.getBufferCL(),true),
- b3BufferInfoCL( gpuVertices.getBufferCL(),true),
- b3BufferInfoCL( gpuUniqueEdges.getBufferCL(),true),
- b3BufferInfoCL( gpuFaces.getBufferCL(),true),
- b3BufferInfoCL( gpuIndices.getBufferCL(),true),
- b3BufferInfoCL( clAabbsWorldSpace.getBufferCL(),true),
- b3BufferInfoCL( m_sepNormals.getBufferCL()),
- b3BufferInfoCL( m_hasSeparatingNormals.getBufferCL()),
- b3BufferInfoCL( m_dmins.getBufferCL()),
- b3BufferInfoCL( m_unitSphereDirections.getBufferCL(),true)
-
- };
-
- b3LauncherCL launcher(m_queue, m_findSeparatingAxisEdgeEdgeKernel,"findSeparatingAxisEdgeEdgeKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( numDirections);
- launcher.setConst( nPairs );
- int num = nPairs;
- launcher.launch1D( num);
- clFinish(m_queue);
+ {
+ B3_PROFILE("findSeparatingAxisEdgeEdgeKernel");
+ b3BufferInfoCL bInfo[] = {
+ b3BufferInfoCL(pairs->getBufferCL(), true),
+ b3BufferInfoCL(bodyBuf->getBufferCL(), true),
+ b3BufferInfoCL(gpuCollidables.getBufferCL(), true),
+ b3BufferInfoCL(convexData.getBufferCL(), true),
+ b3BufferInfoCL(gpuVertices.getBufferCL(), true),
+ b3BufferInfoCL(gpuUniqueEdges.getBufferCL(), true),
+ b3BufferInfoCL(gpuFaces.getBufferCL(), true),
+ b3BufferInfoCL(gpuIndices.getBufferCL(), true),
+ b3BufferInfoCL(clAabbsWorldSpace.getBufferCL(), true),
+ b3BufferInfoCL(m_sepNormals.getBufferCL()),
+ b3BufferInfoCL(m_hasSeparatingNormals.getBufferCL()),
+ b3BufferInfoCL(m_dmins.getBufferCL()),
+ b3BufferInfoCL(m_unitSphereDirections.getBufferCL(), true)
- }
+ };
+
+ b3LauncherCL launcher(m_queue, m_findSeparatingAxisEdgeEdgeKernel, "findSeparatingAxisEdgeEdgeKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(numDirections);
+ launcher.setConst(nPairs);
+ int num = nPairs;
+ launcher.launch1D(num);
+ clFinish(m_queue);
+ }
}
if (useMprGpu)
{
B3_PROFILE("findSeparatingAxisUnitSphereKernel");
- b3BufferInfoCL bInfo[] = {
- b3BufferInfoCL( pairs->getBufferCL(), true ),
- b3BufferInfoCL( bodyBuf->getBufferCL(),true),
- b3BufferInfoCL( gpuCollidables.getBufferCL(),true),
- b3BufferInfoCL( convexData.getBufferCL(),true),
- b3BufferInfoCL( gpuVertices.getBufferCL(),true),
- b3BufferInfoCL( m_unitSphereDirections.getBufferCL(),true),
- b3BufferInfoCL( m_sepNormals.getBufferCL()),
- b3BufferInfoCL( m_hasSeparatingNormals.getBufferCL()),
- b3BufferInfoCL( m_dmins.getBufferCL())
- };
-
- b3LauncherCL launcher(m_queue, m_findSeparatingAxisUnitSphereKernel,"findSeparatingAxisUnitSphereKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- int numDirections = sizeof(unitSphere162)/sizeof(b3Vector3);
- launcher.setConst( numDirections);
-
- launcher.setConst( nPairs );
-
+ b3BufferInfoCL bInfo[] = {
+ b3BufferInfoCL(pairs->getBufferCL(), true),
+ b3BufferInfoCL(bodyBuf->getBufferCL(), true),
+ b3BufferInfoCL(gpuCollidables.getBufferCL(), true),
+ b3BufferInfoCL(convexData.getBufferCL(), true),
+ b3BufferInfoCL(gpuVertices.getBufferCL(), true),
+ b3BufferInfoCL(m_unitSphereDirections.getBufferCL(), true),
+ b3BufferInfoCL(m_sepNormals.getBufferCL()),
+ b3BufferInfoCL(m_hasSeparatingNormals.getBufferCL()),
+ b3BufferInfoCL(m_dmins.getBufferCL())};
+
+ b3LauncherCL launcher(m_queue, m_findSeparatingAxisUnitSphereKernel, "findSeparatingAxisUnitSphereKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ int numDirections = sizeof(unitSphere162) / sizeof(b3Vector3);
+ launcher.setConst(numDirections);
+
+ launcher.setConst(nPairs);
+
int num = nPairs;
- launcher.launch1D( num);
+ launcher.launch1D(num);
clFinish(m_queue);
}
+ }
}
-
-
- } else
+ else
{
B3_PROFILE("findSeparatingAxisKernel");
- b3BufferInfoCL bInfo[] = {
- b3BufferInfoCL( pairs->getBufferCL(), true ),
- b3BufferInfoCL( bodyBuf->getBufferCL(),true),
- b3BufferInfoCL( gpuCollidables.getBufferCL(),true),
- b3BufferInfoCL( convexData.getBufferCL(),true),
- b3BufferInfoCL( gpuVertices.getBufferCL(),true),
- b3BufferInfoCL( gpuUniqueEdges.getBufferCL(),true),
- b3BufferInfoCL( gpuFaces.getBufferCL(),true),
- b3BufferInfoCL( gpuIndices.getBufferCL(),true),
- b3BufferInfoCL( clAabbsWorldSpace.getBufferCL(),true),
- b3BufferInfoCL( m_sepNormals.getBufferCL()),
- b3BufferInfoCL( m_hasSeparatingNormals.getBufferCL())
- };
-
- b3LauncherCL launcher(m_queue, m_findSeparatingAxisKernel,"m_findSeparatingAxisKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( nPairs );
+ b3BufferInfoCL bInfo[] = {
+ b3BufferInfoCL(pairs->getBufferCL(), true),
+ b3BufferInfoCL(bodyBuf->getBufferCL(), true),
+ b3BufferInfoCL(gpuCollidables.getBufferCL(), true),
+ b3BufferInfoCL(convexData.getBufferCL(), true),
+ b3BufferInfoCL(gpuVertices.getBufferCL(), true),
+ b3BufferInfoCL(gpuUniqueEdges.getBufferCL(), true),
+ b3BufferInfoCL(gpuFaces.getBufferCL(), true),
+ b3BufferInfoCL(gpuIndices.getBufferCL(), true),
+ b3BufferInfoCL(clAabbsWorldSpace.getBufferCL(), true),
+ b3BufferInfoCL(m_sepNormals.getBufferCL()),
+ b3BufferInfoCL(m_hasSeparatingNormals.getBufferCL())};
+
+ b3LauncherCL launcher(m_queue, m_findSeparatingAxisKernel, "m_findSeparatingAxisKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(nPairs);
int num = nPairs;
- launcher.launch1D( num);
+ launcher.launch1D(num);
clFinish(m_queue);
}
-
-
}
- else
- {
-
+ else
+ {
B3_PROFILE("findSeparatingAxisKernel CPU");
-
-
- b3AlignedObjectArray<b3Int4> hostPairs;
- pairs->copyToHost(hostPairs);
- b3AlignedObjectArray<b3RigidBodyData> hostBodyBuf;
- bodyBuf->copyToHost(hostBodyBuf);
-
- b3AlignedObjectArray<b3Collidable> hostCollidables;
- gpuCollidables.copyToHost(hostCollidables);
-
- b3AlignedObjectArray<b3GpuChildShape> cpuChildShapes;
- gpuChildShapes.copyToHost(cpuChildShapes);
-
- b3AlignedObjectArray<b3ConvexPolyhedronData> hostConvexShapeData;
- convexData.copyToHost(hostConvexShapeData);
-
- b3AlignedObjectArray<b3Vector3> hostVertices;
- gpuVertices.copyToHost(hostVertices);
-
- b3AlignedObjectArray<int> hostHasSepAxis;
- hostHasSepAxis.resize(nPairs);
- b3AlignedObjectArray<b3Vector3> hostSepAxis;
- hostSepAxis.resize(nPairs);
-
- b3AlignedObjectArray<b3Vector3> hostUniqueEdges;
- gpuUniqueEdges.copyToHost(hostUniqueEdges);
- b3AlignedObjectArray<b3GpuFace> hostFaces;
- gpuFaces.copyToHost(hostFaces);
-
- b3AlignedObjectArray<int> hostIndices;
- gpuIndices.copyToHost(hostIndices);
-
+
+ b3AlignedObjectArray<b3Int4> hostPairs;
+ pairs->copyToHost(hostPairs);
+ b3AlignedObjectArray<b3RigidBodyData> hostBodyBuf;
+ bodyBuf->copyToHost(hostBodyBuf);
+
+ b3AlignedObjectArray<b3Collidable> hostCollidables;
+ gpuCollidables.copyToHost(hostCollidables);
+
+ b3AlignedObjectArray<b3GpuChildShape> cpuChildShapes;
+ gpuChildShapes.copyToHost(cpuChildShapes);
+
+ b3AlignedObjectArray<b3ConvexPolyhedronData> hostConvexShapeData;
+ convexData.copyToHost(hostConvexShapeData);
+
+ b3AlignedObjectArray<b3Vector3> hostVertices;
+ gpuVertices.copyToHost(hostVertices);
+
+ b3AlignedObjectArray<int> hostHasSepAxis;
+ hostHasSepAxis.resize(nPairs);
+ b3AlignedObjectArray<b3Vector3> hostSepAxis;
+ hostSepAxis.resize(nPairs);
+
+ b3AlignedObjectArray<b3Vector3> hostUniqueEdges;
+ gpuUniqueEdges.copyToHost(hostUniqueEdges);
+ b3AlignedObjectArray<b3GpuFace> hostFaces;
+ gpuFaces.copyToHost(hostFaces);
+
+ b3AlignedObjectArray<int> hostIndices;
+ gpuIndices.copyToHost(hostIndices);
+
b3AlignedObjectArray<b3Contact4> hostContacts;
if (nContacts)
{
@@ -3201,61 +3008,56 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
}
hostContacts.resize(maxContactCapacity);
int nGlobalContactsOut = nContacts;
-
-
- for (int i=0;i<nPairs;i++)
- {
-
- int bodyIndexA = hostPairs[i].x;
- int bodyIndexB = hostPairs[i].y;
- int collidableIndexA = hostBodyBuf[bodyIndexA].m_collidableIdx;
- int collidableIndexB = hostBodyBuf[bodyIndexB].m_collidableIdx;
-
- int shapeIndexA = hostCollidables[collidableIndexA].m_shapeIndex;
- int shapeIndexB = hostCollidables[collidableIndexB].m_shapeIndex;
-
- hostHasSepAxis[i] = 0;
-
- //once the broadphase avoids static-static pairs, we can remove this test
- if ((hostBodyBuf[bodyIndexA].m_invMass==0) &&(hostBodyBuf[bodyIndexB].m_invMass==0))
- {
- continue;
- }
-
-
- if ((hostCollidables[collidableIndexA].m_shapeType!=SHAPE_CONVEX_HULL) ||(hostCollidables[collidableIndexB].m_shapeType!=SHAPE_CONVEX_HULL))
- {
- continue;
- }
-
- float dmin = FLT_MAX;
-
- b3ConvexPolyhedronData* convexShapeA = &hostConvexShapeData[shapeIndexA];
- b3ConvexPolyhedronData* convexShapeB = &hostConvexShapeData[shapeIndexB];
- b3Vector3 posA = hostBodyBuf[bodyIndexA].m_pos;
- b3Vector3 posB = hostBodyBuf[bodyIndexB].m_pos;
- b3Quaternion ornA =hostBodyBuf[bodyIndexA].m_quat;
- b3Quaternion ornB =hostBodyBuf[bodyIndexB].m_quat;
-
-
- if (useGjk)
+
+ for (int i = 0; i < nPairs; i++)
+ {
+ int bodyIndexA = hostPairs[i].x;
+ int bodyIndexB = hostPairs[i].y;
+ int collidableIndexA = hostBodyBuf[bodyIndexA].m_collidableIdx;
+ int collidableIndexB = hostBodyBuf[bodyIndexB].m_collidableIdx;
+
+ int shapeIndexA = hostCollidables[collidableIndexA].m_shapeIndex;
+ int shapeIndexB = hostCollidables[collidableIndexB].m_shapeIndex;
+
+ hostHasSepAxis[i] = 0;
+
+ //once the broadphase avoids static-static pairs, we can remove this test
+ if ((hostBodyBuf[bodyIndexA].m_invMass == 0) && (hostBodyBuf[bodyIndexB].m_invMass == 0))
{
+ continue;
+ }
+ if ((hostCollidables[collidableIndexA].m_shapeType != SHAPE_CONVEX_HULL) || (hostCollidables[collidableIndexB].m_shapeType != SHAPE_CONVEX_HULL))
+ {
+ continue;
+ }
+
+ float dmin = FLT_MAX;
+
+ b3ConvexPolyhedronData* convexShapeA = &hostConvexShapeData[shapeIndexA];
+ b3ConvexPolyhedronData* convexShapeB = &hostConvexShapeData[shapeIndexB];
+ b3Vector3 posA = hostBodyBuf[bodyIndexA].m_pos;
+ b3Vector3 posB = hostBodyBuf[bodyIndexB].m_pos;
+ b3Quaternion ornA = hostBodyBuf[bodyIndexA].m_quat;
+ b3Quaternion ornB = hostBodyBuf[bodyIndexB].m_quat;
+
+ if (useGjk)
+ {
//first approximate the separating axis, to 'fail-proof' GJK+EPA or MPR
{
b3Vector3 c0local = hostConvexShapeData[shapeIndexA].m_localCenter;
b3Vector3 c0 = b3TransformPoint(c0local, posA, ornA);
b3Vector3 c1local = hostConvexShapeData[shapeIndexB].m_localCenter;
- b3Vector3 c1 = b3TransformPoint(c1local,posB,ornB);
+ b3Vector3 c1 = b3TransformPoint(c1local, posB, ornB);
b3Vector3 DeltaC2 = c0 - c1;
-
+
b3Vector3 sepAxis;
-
+
bool hasSepAxisA = b3FindSeparatingAxis(convexShapeA, convexShapeB, posA, ornA, posB, ornB, DeltaC2,
- &hostVertices.at(0), &hostUniqueEdges.at(0), &hostFaces.at(0), &hostIndices.at(0),
- &hostVertices.at(0), &hostUniqueEdges.at(0), &hostFaces.at(0), &hostIndices.at(0),
- &sepAxis, &dmin);
-
+ &hostVertices.at(0), &hostUniqueEdges.at(0), &hostFaces.at(0), &hostIndices.at(0),
+ &hostVertices.at(0), &hostUniqueEdges.at(0), &hostFaces.at(0), &hostIndices.at(0),
+ &sepAxis, &dmin);
+
if (hasSepAxisA)
{
bool hasSepAxisB = b3FindSeparatingAxis(convexShapeB, convexShapeA, posB, ornB, posA, ornA, DeltaC2,
@@ -3264,11 +3066,11 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
&sepAxis, &dmin);
if (hasSepAxisB)
{
- bool hasEdgeEdge =b3FindSeparatingAxisEdgeEdge(convexShapeA, convexShapeB, posA, ornA, posB, ornB, DeltaC2,
- &hostVertices.at(0), &hostUniqueEdges.at(0), &hostFaces.at(0), &hostIndices.at(0),
- &hostVertices.at(0), &hostUniqueEdges.at(0), &hostFaces.at(0), &hostIndices.at(0),
- &sepAxis, &dmin,false);
-
+ bool hasEdgeEdge = b3FindSeparatingAxisEdgeEdge(convexShapeA, convexShapeB, posA, ornA, posB, ornB, DeltaC2,
+ &hostVertices.at(0), &hostUniqueEdges.at(0), &hostFaces.at(0), &hostIndices.at(0),
+ &hostVertices.at(0), &hostUniqueEdges.at(0), &hostFaces.at(0), &hostIndices.at(0),
+ &sepAxis, &dmin, false);
+
if (hasEdgeEdge)
{
hostHasSepAxis[i] = 1;
@@ -3282,163 +3084,150 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
if (hostHasSepAxis[i])
{
int pairIndex = i;
-
+
bool useMpr = true;
if (useMpr)
{
- int res=0;
+ int res = 0;
float depth = 0.f;
- b3Vector3 sepAxis2 = b3MakeVector3(1,0,0);
- b3Vector3 resultPointOnBWorld = b3MakeVector3(0,0,0);
+ b3Vector3 sepAxis2 = b3MakeVector3(1, 0, 0);
+ b3Vector3 resultPointOnBWorld = b3MakeVector3(0, 0, 0);
- float depthOut;
- b3Vector3 dirOut;
- b3Vector3 posOut;
-
+ float depthOut;
+ b3Vector3 dirOut;
+ b3Vector3 posOut;
- //res = b3MprPenetration(bodyIndexA,bodyIndexB,hostBodyBuf,hostConvexShapeData,hostCollidables,hostVertices,&mprConfig,&depthOut,&dirOut,&posOut);
- res = b3MprPenetration(pairIndex,bodyIndexA,bodyIndexB,&hostBodyBuf[0],&hostConvexShapeData[0],&hostCollidables[0],&hostVertices[0],&hostSepAxis[0],&hostHasSepAxis[0],&depthOut,&dirOut,&posOut);
- depth = depthOut;
- sepAxis2 = b3MakeVector3(-dirOut.x,-dirOut.y,-dirOut.z);
- resultPointOnBWorld = posOut;
- //hostHasSepAxis[i] = 0;
+ //res = b3MprPenetration(bodyIndexA,bodyIndexB,hostBodyBuf,hostConvexShapeData,hostCollidables,hostVertices,&mprConfig,&depthOut,&dirOut,&posOut);
+ res = b3MprPenetration(pairIndex, bodyIndexA, bodyIndexB, &hostBodyBuf[0], &hostConvexShapeData[0], &hostCollidables[0], &hostVertices[0], &hostSepAxis[0], &hostHasSepAxis[0], &depthOut, &dirOut, &posOut);
+ depth = depthOut;
+ sepAxis2 = b3MakeVector3(-dirOut.x, -dirOut.y, -dirOut.z);
+ resultPointOnBWorld = posOut;
+ //hostHasSepAxis[i] = 0;
+ if (res == 0)
+ {
+ //add point?
+ //printf("depth = %f\n",depth);
+ //printf("normal = %f,%f,%f\n",dir.v[0],dir.v[1],dir.v[2]);
+ //qprintf("pos = %f,%f,%f\n",pos.v[0],pos.v[1],pos.v[2]);
- if (res==0)
- {
- //add point?
- //printf("depth = %f\n",depth);
- //printf("normal = %f,%f,%f\n",dir.v[0],dir.v[1],dir.v[2]);
- //qprintf("pos = %f,%f,%f\n",pos.v[0],pos.v[1],pos.v[2]);
-
-
-
- float dist=0.f;
+ float dist = 0.f;
- const b3ConvexPolyhedronData& hullA = hostConvexShapeData[hostCollidables[hostBodyBuf[bodyIndexA].m_collidableIdx].m_shapeIndex];
- const b3ConvexPolyhedronData& hullB = hostConvexShapeData[hostCollidables[hostBodyBuf[bodyIndexB].m_collidableIdx].m_shapeIndex];
+ const b3ConvexPolyhedronData& hullA = hostConvexShapeData[hostCollidables[hostBodyBuf[bodyIndexA].m_collidableIdx].m_shapeIndex];
+ const b3ConvexPolyhedronData& hullB = hostConvexShapeData[hostCollidables[hostBodyBuf[bodyIndexB].m_collidableIdx].m_shapeIndex];
- if(b3TestSepAxis( &hullA, &hullB, posA,ornA,posB,ornB,&sepAxis2, &hostVertices[0], &hostVertices[0],&dist))
- {
- if (depth > dist)
+ if (b3TestSepAxis(&hullA, &hullB, posA, ornA, posB, ornB, &sepAxis2, &hostVertices[0], &hostVertices[0], &dist))
{
- float diff = depth - dist;
-
- static float maxdiff = 0.f;
- if (maxdiff < diff)
+ if (depth > dist)
{
- maxdiff = diff;
- printf("maxdiff = %20.10f\n",maxdiff);
+ float diff = depth - dist;
+
+ static float maxdiff = 0.f;
+ if (maxdiff < diff)
+ {
+ maxdiff = diff;
+ printf("maxdiff = %20.10f\n", maxdiff);
+ }
}
}
- }
- if (depth > dmin)
- {
- b3Vector3 oldAxis = hostSepAxis[i];
- depth = dmin;
- sepAxis2 = oldAxis;
- }
-
-
+ if (depth > dmin)
+ {
+ b3Vector3 oldAxis = hostSepAxis[i];
+ depth = dmin;
+ sepAxis2 = oldAxis;
+ }
- if(b3TestSepAxis( &hullA, &hullB, posA,ornA,posB,ornB,&sepAxis2, &hostVertices[0], &hostVertices[0],&dist))
- {
- if (depth > dist)
+ if (b3TestSepAxis(&hullA, &hullB, posA, ornA, posB, ornB, &sepAxis2, &hostVertices[0], &hostVertices[0], &dist))
{
- float diff = depth - dist;
- //printf("?diff = %f\n",diff );
- static float maxdiff = 0.f;
- if (maxdiff < diff)
+ if (depth > dist)
+ {
+ float diff = depth - dist;
+ //printf("?diff = %f\n",diff );
+ static float maxdiff = 0.f;
+ if (maxdiff < diff)
+ {
+ maxdiff = diff;
+ printf("maxdiff = %20.10f\n", maxdiff);
+ }
+ }
+ //this is used for SAT
+ //hostHasSepAxis[i] = 1;
+ //hostSepAxis[i] = sepAxis2;
+
+ //add contact point
+
+ //int contactIndex = nGlobalContactsOut;
+ b3Contact4& newContact = hostContacts.at(nGlobalContactsOut);
+ nGlobalContactsOut++;
+ newContact.m_batchIdx = 0; //i;
+ newContact.m_bodyAPtrAndSignBit = (hostBodyBuf.at(bodyIndexA).m_invMass == 0) ? -bodyIndexA : bodyIndexA;
+ newContact.m_bodyBPtrAndSignBit = (hostBodyBuf.at(bodyIndexB).m_invMass == 0) ? -bodyIndexB : bodyIndexB;
+
+ newContact.m_frictionCoeffCmp = 45874;
+ newContact.m_restituitionCoeffCmp = 0;
+
+ static float maxDepth = 0.f;
+
+ if (depth > maxDepth)
{
- maxdiff = diff;
- printf("maxdiff = %20.10f\n",maxdiff);
+ maxDepth = depth;
+ printf("MPR maxdepth = %f\n", maxDepth);
}
+
+ resultPointOnBWorld.w = -depth;
+ newContact.m_worldPosB[0] = resultPointOnBWorld;
+ //b3Vector3 resultPointOnAWorld = resultPointOnBWorld+depth*sepAxis2;
+ newContact.m_worldNormalOnB = sepAxis2;
+ newContact.m_worldNormalOnB.w = (b3Scalar)1;
}
- //this is used for SAT
- //hostHasSepAxis[i] = 1;
- //hostSepAxis[i] = sepAxis2;
-
- //add contact point
-
- //int contactIndex = nGlobalContactsOut;
- b3Contact4& newContact = hostContacts.at(nGlobalContactsOut);
- nGlobalContactsOut++;
- newContact.m_batchIdx = 0;//i;
- newContact.m_bodyAPtrAndSignBit = (hostBodyBuf.at(bodyIndexA).m_invMass==0)? -bodyIndexA:bodyIndexA;
- newContact.m_bodyBPtrAndSignBit = (hostBodyBuf.at(bodyIndexB).m_invMass==0)? -bodyIndexB:bodyIndexB;
-
- newContact.m_frictionCoeffCmp = 45874;
- newContact.m_restituitionCoeffCmp = 0;
-
-
- static float maxDepth = 0.f;
-
- if (depth > maxDepth)
+ else
{
- maxDepth = depth;
- printf("MPR maxdepth = %f\n",maxDepth );
-
+ printf("rejected\n");
}
-
-
- resultPointOnBWorld.w = -depth;
- newContact.m_worldPosB[0] = resultPointOnBWorld;
- //b3Vector3 resultPointOnAWorld = resultPointOnBWorld+depth*sepAxis2;
- newContact.m_worldNormalOnB = sepAxis2;
- newContact.m_worldNormalOnB.w = (b3Scalar)1;
- } else
- {
- printf("rejected\n");
}
-
-
}
- } else
+ else
{
-
-
-
- //int contactIndex = computeContactConvexConvex2( i,bodyIndexA,bodyIndexB,collidableIndexA,collidableIndexB,hostBodyBuf, hostCollidables,hostConvexData,hostVertices,hostUniqueEdges,hostIndices,hostFaces,hostContacts,nContacts,maxContactCapacity,oldHostContacts);
- b3AlignedObjectArray<b3Contact4> oldHostContacts;
+ //int contactIndex = computeContactConvexConvex2( i,bodyIndexA,bodyIndexB,collidableIndexA,collidableIndexB,hostBodyBuf, hostCollidables,hostConvexData,hostVertices,hostUniqueEdges,hostIndices,hostFaces,hostContacts,nContacts,maxContactCapacity,oldHostContacts);
+ b3AlignedObjectArray<b3Contact4> oldHostContacts;
int result;
- result = computeContactConvexConvex2( //hostPairs,
- pairIndex,
- bodyIndexA, bodyIndexB,
- collidableIndexA, collidableIndexB,
- hostBodyBuf,
- hostCollidables,
- hostConvexShapeData,
- hostVertices,
- hostUniqueEdges,
- hostIndices,
- hostFaces,
- hostContacts,
- nGlobalContactsOut,
- maxContactCapacity,
- oldHostContacts
- //hostHasSepAxis,
- //hostSepAxis
-
- );
- }//mpr
- }//hostHasSepAxis[i] = 1;
-
- } else
+ result = computeContactConvexConvex2( //hostPairs,
+ pairIndex,
+ bodyIndexA, bodyIndexB,
+ collidableIndexA, collidableIndexB,
+ hostBodyBuf,
+ hostCollidables,
+ hostConvexShapeData,
+ hostVertices,
+ hostUniqueEdges,
+ hostIndices,
+ hostFaces,
+ hostContacts,
+ nGlobalContactsOut,
+ maxContactCapacity,
+ oldHostContacts
+ //hostHasSepAxis,
+ //hostSepAxis
+
+ );
+ } //mpr
+ } //hostHasSepAxis[i] = 1;
+ }
+ else
{
-
b3Vector3 c0local = hostConvexShapeData[shapeIndexA].m_localCenter;
b3Vector3 c0 = b3TransformPoint(c0local, posA, ornA);
b3Vector3 c1local = hostConvexShapeData[shapeIndexB].m_localCenter;
- b3Vector3 c1 = b3TransformPoint(c1local,posB,ornB);
+ b3Vector3 c1 = b3TransformPoint(c1local, posB, ornB);
b3Vector3 DeltaC2 = c0 - c1;
-
+
b3Vector3 sepAxis;
-
+
bool hasSepAxisA = b3FindSeparatingAxis(convexShapeA, convexShapeB, posA, ornA, posB, ornB, DeltaC2,
- &hostVertices.at(0), &hostUniqueEdges.at(0), &hostFaces.at(0), &hostIndices.at(0),
- &hostVertices.at(0), &hostUniqueEdges.at(0), &hostFaces.at(0), &hostIndices.at(0),
- &sepAxis, &dmin);
-
+ &hostVertices.at(0), &hostUniqueEdges.at(0), &hostFaces.at(0), &hostIndices.at(0),
+ &hostVertices.at(0), &hostUniqueEdges.at(0), &hostFaces.at(0), &hostIndices.at(0),
+ &sepAxis, &dmin);
+
if (hasSepAxisA)
{
bool hasSepAxisB = b3FindSeparatingAxis(convexShapeB, convexShapeA, posB, ornB, posA, ornA, DeltaC2,
@@ -3447,11 +3236,11 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
&sepAxis, &dmin);
if (hasSepAxisB)
{
- bool hasEdgeEdge =b3FindSeparatingAxisEdgeEdge(convexShapeA, convexShapeB, posA, ornA, posB, ornB, DeltaC2,
- &hostVertices.at(0), &hostUniqueEdges.at(0), &hostFaces.at(0), &hostIndices.at(0),
- &hostVertices.at(0), &hostUniqueEdges.at(0), &hostFaces.at(0), &hostIndices.at(0),
- &sepAxis, &dmin,true);
-
+ bool hasEdgeEdge = b3FindSeparatingAxisEdgeEdge(convexShapeA, convexShapeB, posA, ornA, posB, ornB, DeltaC2,
+ &hostVertices.at(0), &hostUniqueEdges.at(0), &hostFaces.at(0), &hostIndices.at(0),
+ &hostVertices.at(0), &hostUniqueEdges.at(0), &hostFaces.at(0), &hostIndices.at(0),
+ &sepAxis, &dmin, true);
+
if (hasEdgeEdge)
{
hostHasSepAxis[i] = 1;
@@ -3460,21 +3249,21 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
}
}
}
- }
-
- if (useGjkContacts)//nGlobalContactsOut>0)
+ }
+
+ if (useGjkContacts) //nGlobalContactsOut>0)
{
//printf("nGlobalContactsOut=%d\n",nGlobalContactsOut);
nContacts = nGlobalContactsOut;
contactOut->copyFromHost(hostContacts);
-
- m_totalContactsOut.copyFromHostPointer(&nContacts,1,0,true);
+
+ m_totalContactsOut.copyFromHostPointer(&nContacts, 1, 0, true);
}
-
- m_hasSeparatingNormals.copyFromHost(hostHasSepAxis);
- m_sepNormals.copyFromHost(hostSepAxis);
-
- /*
+
+ m_hasSeparatingNormals.copyFromHost(hostHasSepAxis);
+ m_sepNormals.copyFromHost(hostSepAxis);
+
+ /*
//double-check results from GPU (comment-out the 'else' so both paths are executed
b3AlignedObjectArray<int> checkHasSepAxis;
m_hasSeparatingNormals.copyToHost(checkHasSepAxis);
@@ -3491,352 +3280,314 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
//m_hasSeparatingNormals.copyFromHost(hostHasSepAxis);
// m_sepNormals.copyFromHost(hostSepAxis);
*/
- }
-
-
- numCompoundPairs = m_numCompoundPairsOut.at(0);
- bool useGpuFindCompoundPairs=true;
- if (useGpuFindCompoundPairs)
- {
- B3_PROFILE("findCompoundPairsKernel");
- b3BufferInfoCL bInfo[] =
- {
- b3BufferInfoCL( pairs->getBufferCL(), true ),
- b3BufferInfoCL( bodyBuf->getBufferCL(),true),
- b3BufferInfoCL( gpuCollidables.getBufferCL(),true),
- b3BufferInfoCL( convexData.getBufferCL(),true),
- b3BufferInfoCL( gpuVertices.getBufferCL(),true),
- b3BufferInfoCL( gpuUniqueEdges.getBufferCL(),true),
- b3BufferInfoCL( gpuFaces.getBufferCL(),true),
- b3BufferInfoCL( gpuIndices.getBufferCL(),true),
- b3BufferInfoCL( clAabbsLocalSpace.getBufferCL(),true),
- b3BufferInfoCL( gpuChildShapes.getBufferCL(),true),
- b3BufferInfoCL( m_gpuCompoundPairs.getBufferCL()),
- b3BufferInfoCL( m_numCompoundPairsOut.getBufferCL()),
- b3BufferInfoCL(subTreesGPU->getBufferCL()),
- b3BufferInfoCL(treeNodesGPU->getBufferCL()),
- b3BufferInfoCL(bvhInfo->getBufferCL())
- };
-
- b3LauncherCL launcher(m_queue, m_findCompoundPairsKernel,"m_findCompoundPairsKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( nPairs );
- launcher.setConst( compoundPairCapacity);
-
- int num = nPairs;
- launcher.launch1D( num);
- clFinish(m_queue);
-
- numCompoundPairs = m_numCompoundPairsOut.at(0);
- //printf("numCompoundPairs =%d\n",numCompoundPairs );
- if (numCompoundPairs)
- {
- //printf("numCompoundPairs=%d\n",numCompoundPairs);
- }
-
-
- } else
- {
-
-
- b3AlignedObjectArray<b3QuantizedBvhNode> treeNodesCPU;
- treeNodesGPU->copyToHost(treeNodesCPU);
-
- b3AlignedObjectArray<b3BvhSubtreeInfo> subTreesCPU;
- subTreesGPU->copyToHost(subTreesCPU);
+ }
- b3AlignedObjectArray<b3BvhInfo> bvhInfoCPU;
- bvhInfo->copyToHost(bvhInfoCPU);
+ numCompoundPairs = m_numCompoundPairsOut.at(0);
+ bool useGpuFindCompoundPairs = true;
+ if (useGpuFindCompoundPairs)
+ {
+ B3_PROFILE("findCompoundPairsKernel");
+ b3BufferInfoCL bInfo[] =
+ {
+ b3BufferInfoCL(pairs->getBufferCL(), true),
+ b3BufferInfoCL(bodyBuf->getBufferCL(), true),
+ b3BufferInfoCL(gpuCollidables.getBufferCL(), true),
+ b3BufferInfoCL(convexData.getBufferCL(), true),
+ b3BufferInfoCL(gpuVertices.getBufferCL(), true),
+ b3BufferInfoCL(gpuUniqueEdges.getBufferCL(), true),
+ b3BufferInfoCL(gpuFaces.getBufferCL(), true),
+ b3BufferInfoCL(gpuIndices.getBufferCL(), true),
+ b3BufferInfoCL(clAabbsLocalSpace.getBufferCL(), true),
+ b3BufferInfoCL(gpuChildShapes.getBufferCL(), true),
+ b3BufferInfoCL(m_gpuCompoundPairs.getBufferCL()),
+ b3BufferInfoCL(m_numCompoundPairsOut.getBufferCL()),
+ b3BufferInfoCL(subTreesGPU->getBufferCL()),
+ b3BufferInfoCL(treeNodesGPU->getBufferCL()),
+ b3BufferInfoCL(bvhInfo->getBufferCL())};
+
+ b3LauncherCL launcher(m_queue, m_findCompoundPairsKernel, "m_findCompoundPairsKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(nPairs);
+ launcher.setConst(compoundPairCapacity);
- b3AlignedObjectArray<b3Aabb> hostAabbsWorldSpace;
- clAabbsWorldSpace.copyToHost(hostAabbsWorldSpace);
+ int num = nPairs;
+ launcher.launch1D(num);
+ clFinish(m_queue);
- b3AlignedObjectArray<b3Aabb> hostAabbsLocalSpace;
- clAabbsLocalSpace.copyToHost(hostAabbsLocalSpace);
+ numCompoundPairs = m_numCompoundPairsOut.at(0);
+ //printf("numCompoundPairs =%d\n",numCompoundPairs );
+ if (numCompoundPairs)
+ {
+ //printf("numCompoundPairs=%d\n",numCompoundPairs);
+ }
+ }
+ else
+ {
+ b3AlignedObjectArray<b3QuantizedBvhNode> treeNodesCPU;
+ treeNodesGPU->copyToHost(treeNodesCPU);
- b3AlignedObjectArray<b3Int4> hostPairs;
- pairs->copyToHost(hostPairs);
+ b3AlignedObjectArray<b3BvhSubtreeInfo> subTreesCPU;
+ subTreesGPU->copyToHost(subTreesCPU);
- b3AlignedObjectArray<b3RigidBodyData> hostBodyBuf;
- bodyBuf->copyToHost(hostBodyBuf);
+ b3AlignedObjectArray<b3BvhInfo> bvhInfoCPU;
+ bvhInfo->copyToHost(bvhInfoCPU);
+ b3AlignedObjectArray<b3Aabb> hostAabbsWorldSpace;
+ clAabbsWorldSpace.copyToHost(hostAabbsWorldSpace);
- b3AlignedObjectArray<b3Int4> cpuCompoundPairsOut;
- cpuCompoundPairsOut.resize(compoundPairCapacity);
+ b3AlignedObjectArray<b3Aabb> hostAabbsLocalSpace;
+ clAabbsLocalSpace.copyToHost(hostAabbsLocalSpace);
- b3AlignedObjectArray<b3Collidable> hostCollidables;
- gpuCollidables.copyToHost(hostCollidables);
+ b3AlignedObjectArray<b3Int4> hostPairs;
+ pairs->copyToHost(hostPairs);
- b3AlignedObjectArray<b3GpuChildShape> cpuChildShapes;
- gpuChildShapes.copyToHost(cpuChildShapes);
+ b3AlignedObjectArray<b3RigidBodyData> hostBodyBuf;
+ bodyBuf->copyToHost(hostBodyBuf);
- b3AlignedObjectArray<b3ConvexPolyhedronData> hostConvexData;
- convexData.copyToHost(hostConvexData);
+ b3AlignedObjectArray<b3Int4> cpuCompoundPairsOut;
+ cpuCompoundPairsOut.resize(compoundPairCapacity);
- b3AlignedObjectArray<b3Vector3> hostVertices;
- gpuVertices.copyToHost(hostVertices);
+ b3AlignedObjectArray<b3Collidable> hostCollidables;
+ gpuCollidables.copyToHost(hostCollidables);
+ b3AlignedObjectArray<b3GpuChildShape> cpuChildShapes;
+ gpuChildShapes.copyToHost(cpuChildShapes);
+ b3AlignedObjectArray<b3ConvexPolyhedronData> hostConvexData;
+ convexData.copyToHost(hostConvexData);
+ b3AlignedObjectArray<b3Vector3> hostVertices;
+ gpuVertices.copyToHost(hostVertices);
- for (int pairIndex=0;pairIndex<nPairs;pairIndex++)
- {
- int bodyIndexA = hostPairs[pairIndex].x;
- int bodyIndexB = hostPairs[pairIndex].y;
- int collidableIndexA = hostBodyBuf[bodyIndexA].m_collidableIdx;
- int collidableIndexB = hostBodyBuf[bodyIndexB].m_collidableIdx;
+ for (int pairIndex = 0; pairIndex < nPairs; pairIndex++)
+ {
+ int bodyIndexA = hostPairs[pairIndex].x;
+ int bodyIndexB = hostPairs[pairIndex].y;
+ int collidableIndexA = hostBodyBuf[bodyIndexA].m_collidableIdx;
+ int collidableIndexB = hostBodyBuf[bodyIndexB].m_collidableIdx;
if (cpuChildShapes.size())
{
- findCompoundPairsKernel(
- pairIndex,
- bodyIndexA,
- bodyIndexB,
- collidableIndexA,
- collidableIndexB,
- &hostBodyBuf[0],
- &hostCollidables[0],
- &hostConvexData[0],
- hostVertices,
- hostAabbsWorldSpace,
- hostAabbsLocalSpace,
- &cpuChildShapes[0],
- &cpuCompoundPairsOut[0],
- &numCompoundPairs,
- compoundPairCapacity,
- treeNodesCPU,
- subTreesCPU,
- bvhInfoCPU
- );
+ findCompoundPairsKernel(
+ pairIndex,
+ bodyIndexA,
+ bodyIndexB,
+ collidableIndexA,
+ collidableIndexB,
+ &hostBodyBuf[0],
+ &hostCollidables[0],
+ &hostConvexData[0],
+ hostVertices,
+ hostAabbsWorldSpace,
+ hostAabbsLocalSpace,
+ &cpuChildShapes[0],
+ &cpuCompoundPairsOut[0],
+ &numCompoundPairs,
+ compoundPairCapacity,
+ treeNodesCPU,
+ subTreesCPU,
+ bvhInfoCPU);
}
- }
-
+ }
- m_numCompoundPairsOut.copyFromHostPointer(&numCompoundPairs,1,0,true);
+ m_numCompoundPairsOut.copyFromHostPointer(&numCompoundPairs, 1, 0, true);
if (numCompoundPairs)
{
b3CompoundOverlappingPair* ptr = (b3CompoundOverlappingPair*)&cpuCompoundPairsOut[0];
- m_gpuCompoundPairs.copyFromHostPointer(ptr,numCompoundPairs,0,true);
+ m_gpuCompoundPairs.copyFromHostPointer(ptr, numCompoundPairs, 0, true);
}
//cpuCompoundPairsOut
-
- }
+ }
if (numCompoundPairs)
{
- printf("numCompoundPairs=%d\n",numCompoundPairs);
+ printf("numCompoundPairs=%d\n", numCompoundPairs);
}
- if (numCompoundPairs > compoundPairCapacity)
- {
- b3Error("Exceeded compound pair capacity (%d/%d)\n", numCompoundPairs, compoundPairCapacity);
- numCompoundPairs = compoundPairCapacity;
- }
-
-
-
- m_gpuCompoundPairs.resize(numCompoundPairs);
- m_gpuHasCompoundSepNormals.resize(numCompoundPairs);
- m_gpuCompoundSepNormals.resize(numCompoundPairs);
-
-
- if (numCompoundPairs)
- {
- B3_PROFILE("processCompoundPairsPrimitivesKernel");
- b3BufferInfoCL bInfo[] =
- {
- b3BufferInfoCL( m_gpuCompoundPairs.getBufferCL(), true ),
- b3BufferInfoCL( bodyBuf->getBufferCL(),true),
- b3BufferInfoCL( gpuCollidables.getBufferCL(),true),
- b3BufferInfoCL( convexData.getBufferCL(),true),
- b3BufferInfoCL( gpuVertices.getBufferCL(),true),
- b3BufferInfoCL( gpuUniqueEdges.getBufferCL(),true),
- b3BufferInfoCL( gpuFaces.getBufferCL(),true),
- b3BufferInfoCL( gpuIndices.getBufferCL(),true),
- b3BufferInfoCL( clAabbsWorldSpace.getBufferCL(),true),
- b3BufferInfoCL( gpuChildShapes.getBufferCL(),true),
- b3BufferInfoCL( contactOut->getBufferCL()),
- b3BufferInfoCL( m_totalContactsOut.getBufferCL())
- };
-
- b3LauncherCL launcher(m_queue, m_processCompoundPairsPrimitivesKernel,"m_processCompoundPairsPrimitivesKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( numCompoundPairs );
- launcher.setConst(maxContactCapacity);
-
- int num = numCompoundPairs;
- launcher.launch1D( num);
- clFinish(m_queue);
- nContacts = m_totalContactsOut.at(0);
- //printf("nContacts (after processCompoundPairsPrimitivesKernel) = %d\n",nContacts);
- if (nContacts>maxContactCapacity)
- {
-
- b3Error("Error: contacts exceeds capacity (%d/%d)\n", nContacts, maxContactCapacity);
- nContacts = maxContactCapacity;
- }
- }
-
-
- if (numCompoundPairs)
- {
- B3_PROFILE("processCompoundPairsKernel");
- b3BufferInfoCL bInfo[] =
- {
- b3BufferInfoCL( m_gpuCompoundPairs.getBufferCL(), true ),
- b3BufferInfoCL( bodyBuf->getBufferCL(),true),
- b3BufferInfoCL( gpuCollidables.getBufferCL(),true),
- b3BufferInfoCL( convexData.getBufferCL(),true),
- b3BufferInfoCL( gpuVertices.getBufferCL(),true),
- b3BufferInfoCL( gpuUniqueEdges.getBufferCL(),true),
- b3BufferInfoCL( gpuFaces.getBufferCL(),true),
- b3BufferInfoCL( gpuIndices.getBufferCL(),true),
- b3BufferInfoCL( clAabbsWorldSpace.getBufferCL(),true),
- b3BufferInfoCL( gpuChildShapes.getBufferCL(),true),
- b3BufferInfoCL( m_gpuCompoundSepNormals.getBufferCL()),
- b3BufferInfoCL( m_gpuHasCompoundSepNormals.getBufferCL())
- };
-
- b3LauncherCL launcher(m_queue, m_processCompoundPairsKernel,"m_processCompoundPairsKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( numCompoundPairs );
-
- int num = numCompoundPairs;
- launcher.launch1D( num);
- clFinish(m_queue);
-
- }
-
-
- //printf("numConcave = %d\n",numConcave);
-
-
-
-// printf("hostNormals.size()=%d\n",hostNormals.size());
+ if (numCompoundPairs > compoundPairCapacity)
+ {
+ b3Error("Exceeded compound pair capacity (%d/%d)\n", numCompoundPairs, compoundPairCapacity);
+ numCompoundPairs = compoundPairCapacity;
+ }
+
+ m_gpuCompoundPairs.resize(numCompoundPairs);
+ m_gpuHasCompoundSepNormals.resize(numCompoundPairs);
+ m_gpuCompoundSepNormals.resize(numCompoundPairs);
+
+ if (numCompoundPairs)
+ {
+ B3_PROFILE("processCompoundPairsPrimitivesKernel");
+ b3BufferInfoCL bInfo[] =
+ {
+ b3BufferInfoCL(m_gpuCompoundPairs.getBufferCL(), true),
+ b3BufferInfoCL(bodyBuf->getBufferCL(), true),
+ b3BufferInfoCL(gpuCollidables.getBufferCL(), true),
+ b3BufferInfoCL(convexData.getBufferCL(), true),
+ b3BufferInfoCL(gpuVertices.getBufferCL(), true),
+ b3BufferInfoCL(gpuUniqueEdges.getBufferCL(), true),
+ b3BufferInfoCL(gpuFaces.getBufferCL(), true),
+ b3BufferInfoCL(gpuIndices.getBufferCL(), true),
+ b3BufferInfoCL(clAabbsWorldSpace.getBufferCL(), true),
+ b3BufferInfoCL(gpuChildShapes.getBufferCL(), true),
+ b3BufferInfoCL(contactOut->getBufferCL()),
+ b3BufferInfoCL(m_totalContactsOut.getBufferCL())};
+
+ b3LauncherCL launcher(m_queue, m_processCompoundPairsPrimitivesKernel, "m_processCompoundPairsPrimitivesKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(numCompoundPairs);
+ launcher.setConst(maxContactCapacity);
+
+ int num = numCompoundPairs;
+ launcher.launch1D(num);
+ clFinish(m_queue);
+ nContacts = m_totalContactsOut.at(0);
+ //printf("nContacts (after processCompoundPairsPrimitivesKernel) = %d\n",nContacts);
+ if (nContacts > maxContactCapacity)
+ {
+ b3Error("Error: contacts exceeds capacity (%d/%d)\n", nContacts, maxContactCapacity);
+ nContacts = maxContactCapacity;
+ }
+ }
+
+ if (numCompoundPairs)
+ {
+ B3_PROFILE("processCompoundPairsKernel");
+ b3BufferInfoCL bInfo[] =
+ {
+ b3BufferInfoCL(m_gpuCompoundPairs.getBufferCL(), true),
+ b3BufferInfoCL(bodyBuf->getBufferCL(), true),
+ b3BufferInfoCL(gpuCollidables.getBufferCL(), true),
+ b3BufferInfoCL(convexData.getBufferCL(), true),
+ b3BufferInfoCL(gpuVertices.getBufferCL(), true),
+ b3BufferInfoCL(gpuUniqueEdges.getBufferCL(), true),
+ b3BufferInfoCL(gpuFaces.getBufferCL(), true),
+ b3BufferInfoCL(gpuIndices.getBufferCL(), true),
+ b3BufferInfoCL(clAabbsWorldSpace.getBufferCL(), true),
+ b3BufferInfoCL(gpuChildShapes.getBufferCL(), true),
+ b3BufferInfoCL(m_gpuCompoundSepNormals.getBufferCL()),
+ b3BufferInfoCL(m_gpuHasCompoundSepNormals.getBufferCL())};
+
+ b3LauncherCL launcher(m_queue, m_processCompoundPairsKernel, "m_processCompoundPairsKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(numCompoundPairs);
+
+ int num = numCompoundPairs;
+ launcher.launch1D(num);
+ clFinish(m_queue);
+ }
+
+ //printf("numConcave = %d\n",numConcave);
+
+ // printf("hostNormals.size()=%d\n",hostNormals.size());
//int numPairs = pairCount.at(0);
-
-
-
}
int vertexFaceCapacity = 64;
-
-
{
//now perform the tree query on GPU
-
-
-
-
+
if (treeNodesGPU->size() && treeNodesGPU->size())
{
if (bvhTraversalKernelGPU)
{
-
B3_PROFILE("m_bvhTraversalKernel");
-
-
+
numConcavePairs = m_numConcavePairsOut.at(0);
-
- b3LauncherCL launcher(m_queue, m_bvhTraversalKernel,"m_bvhTraversalKernel");
- launcher.setBuffer( pairs->getBufferCL());
- launcher.setBuffer( bodyBuf->getBufferCL());
- launcher.setBuffer( gpuCollidables.getBufferCL());
- launcher.setBuffer( clAabbsWorldSpace.getBufferCL());
- launcher.setBuffer( triangleConvexPairsOut.getBufferCL());
- launcher.setBuffer( m_numConcavePairsOut.getBufferCL());
- launcher.setBuffer( subTreesGPU->getBufferCL());
- launcher.setBuffer( treeNodesGPU->getBufferCL());
- launcher.setBuffer( bvhInfo->getBufferCL());
-
- launcher.setConst( nPairs );
- launcher.setConst( maxTriConvexPairCapacity);
+
+ b3LauncherCL launcher(m_queue, m_bvhTraversalKernel, "m_bvhTraversalKernel");
+ launcher.setBuffer(pairs->getBufferCL());
+ launcher.setBuffer(bodyBuf->getBufferCL());
+ launcher.setBuffer(gpuCollidables.getBufferCL());
+ launcher.setBuffer(clAabbsWorldSpace.getBufferCL());
+ launcher.setBuffer(triangleConvexPairsOut.getBufferCL());
+ launcher.setBuffer(m_numConcavePairsOut.getBufferCL());
+ launcher.setBuffer(subTreesGPU->getBufferCL());
+ launcher.setBuffer(treeNodesGPU->getBufferCL());
+ launcher.setBuffer(bvhInfo->getBufferCL());
+
+ launcher.setConst(nPairs);
+ launcher.setConst(maxTriConvexPairCapacity);
int num = nPairs;
- launcher.launch1D( num);
+ launcher.launch1D(num);
clFinish(m_queue);
numConcavePairs = m_numConcavePairsOut.at(0);
- } else
+ }
+ else
{
- b3AlignedObjectArray<b3Int4> hostPairs;
- pairs->copyToHost(hostPairs);
- b3AlignedObjectArray<b3RigidBodyData> hostBodyBuf;
- bodyBuf->copyToHost(hostBodyBuf);
- b3AlignedObjectArray<b3Collidable> hostCollidables;
- gpuCollidables.copyToHost(hostCollidables);
- b3AlignedObjectArray<b3Aabb> hostAabbsWorldSpace;
- clAabbsWorldSpace.copyToHost(hostAabbsWorldSpace);
+ b3AlignedObjectArray<b3Int4> hostPairs;
+ pairs->copyToHost(hostPairs);
+ b3AlignedObjectArray<b3RigidBodyData> hostBodyBuf;
+ bodyBuf->copyToHost(hostBodyBuf);
+ b3AlignedObjectArray<b3Collidable> hostCollidables;
+ gpuCollidables.copyToHost(hostCollidables);
+ b3AlignedObjectArray<b3Aabb> hostAabbsWorldSpace;
+ clAabbsWorldSpace.copyToHost(hostAabbsWorldSpace);
- //int maxTriConvexPairCapacity,
- b3AlignedObjectArray<b3Int4> triangleConvexPairsOutHost;
- triangleConvexPairsOutHost.resize(maxTriConvexPairCapacity);
+ //int maxTriConvexPairCapacity,
+ b3AlignedObjectArray<b3Int4> triangleConvexPairsOutHost;
+ triangleConvexPairsOutHost.resize(maxTriConvexPairCapacity);
- //int numTriConvexPairsOutHost=0;
- numConcavePairs = 0;
- //m_numConcavePairsOut
+ //int numTriConvexPairsOutHost=0;
+ numConcavePairs = 0;
+ //m_numConcavePairsOut
- b3AlignedObjectArray<b3QuantizedBvhNode> treeNodesCPU;
- treeNodesGPU->copyToHost(treeNodesCPU);
- b3AlignedObjectArray<b3BvhSubtreeInfo> subTreesCPU;
- subTreesGPU->copyToHost(subTreesCPU);
- b3AlignedObjectArray<b3BvhInfo> bvhInfoCPU;
- bvhInfo->copyToHost(bvhInfoCPU);
- //compute it...
+ b3AlignedObjectArray<b3QuantizedBvhNode> treeNodesCPU;
+ treeNodesGPU->copyToHost(treeNodesCPU);
+ b3AlignedObjectArray<b3BvhSubtreeInfo> subTreesCPU;
+ subTreesGPU->copyToHost(subTreesCPU);
+ b3AlignedObjectArray<b3BvhInfo> bvhInfoCPU;
+ bvhInfo->copyToHost(bvhInfoCPU);
+ //compute it...
- volatile int hostNumConcavePairsOut=0;
+ volatile int hostNumConcavePairsOut = 0;
- //
- for (int i=0;i<nPairs;i++)
- {
- b3BvhTraversal( &hostPairs.at(0),
- &hostBodyBuf.at(0),
- &hostCollidables.at(0),
- &hostAabbsWorldSpace.at(0),
- &triangleConvexPairsOutHost.at(0),
- &hostNumConcavePairsOut,
- &subTreesCPU.at(0),
- &treeNodesCPU.at(0),
- &bvhInfoCPU.at(0),
- nPairs,
- maxTriConvexPairCapacity,
- i);
- }
- numConcavePairs = hostNumConcavePairsOut;
+ //
+ for (int i = 0; i < nPairs; i++)
+ {
+ b3BvhTraversal(&hostPairs.at(0),
+ &hostBodyBuf.at(0),
+ &hostCollidables.at(0),
+ &hostAabbsWorldSpace.at(0),
+ &triangleConvexPairsOutHost.at(0),
+ &hostNumConcavePairsOut,
+ &subTreesCPU.at(0),
+ &treeNodesCPU.at(0),
+ &bvhInfoCPU.at(0),
+ nPairs,
+ maxTriConvexPairCapacity,
+ i);
+ }
+ numConcavePairs = hostNumConcavePairsOut;
- if (hostNumConcavePairsOut)
- {
- triangleConvexPairsOutHost.resize(hostNumConcavePairsOut);
- triangleConvexPairsOut.copyFromHost(triangleConvexPairsOutHost);
- }
- //
+ if (hostNumConcavePairsOut)
+ {
+ triangleConvexPairsOutHost.resize(hostNumConcavePairsOut);
+ triangleConvexPairsOut.copyFromHost(triangleConvexPairsOutHost);
+ }
+ //
- m_numConcavePairsOut.resize(0);
- m_numConcavePairsOut.push_back(numConcavePairs);
+ m_numConcavePairsOut.resize(0);
+ m_numConcavePairsOut.push_back(numConcavePairs);
}
- //printf("numConcavePairs=%d (max = %d\n",numConcavePairs,maxTriConvexPairCapacity);
-
+ //printf("numConcavePairs=%d (max = %d\n",numConcavePairs,maxTriConvexPairCapacity);
+
if (numConcavePairs > maxTriConvexPairCapacity)
{
static int exceeded_maxTriConvexPairCapacity_count = 0;
b3Error("Exceeded the maxTriConvexPairCapacity (found %d but max is %d, it happened %d times)\n",
- numConcavePairs,maxTriConvexPairCapacity,exceeded_maxTriConvexPairCapacity_count++);
+ numConcavePairs, maxTriConvexPairCapacity, exceeded_maxTriConvexPairCapacity_count++);
numConcavePairs = maxTriConvexPairCapacity;
}
triangleConvexPairsOut.resize(numConcavePairs);
-
+
if (numConcavePairs)
{
-
-
-
-
clippingFacesOutGPU.resize(numConcavePairs);
worldNormalsAGPU.resize(numConcavePairs);
- worldVertsA1GPU.resize(vertexFaceCapacity*(numConcavePairs));
- worldVertsB1GPU.resize(vertexFaceCapacity*(numConcavePairs));
-
+ worldVertsA1GPU.resize(vertexFaceCapacity * (numConcavePairs));
+ worldVertsB1GPU.resize(vertexFaceCapacity * (numConcavePairs));
if (findConcaveSeparatingAxisKernelGPU)
{
-
/*
m_concaveHasSeparatingNormals.copyFromHost(concaveHasSeparatingNormalsCPU);
clippingFacesOutGPU.copyFromHost(clippingFacesOutCPU);
@@ -3846,236 +3597,213 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
*/
//now perform a SAT test for each triangle-convex element (stored in triangleConvexPairsOut)
- if (splitSearchSepAxisConcave)
- {
- //printf("numConcavePairs = %d\n",numConcavePairs);
- m_dmins.resize(numConcavePairs);
- {
- B3_PROFILE("findConcaveSeparatingAxisVertexFaceKernel");
- b3BufferInfoCL bInfo[] = {
- b3BufferInfoCL( triangleConvexPairsOut.getBufferCL() ),
- b3BufferInfoCL( bodyBuf->getBufferCL(),true),
- b3BufferInfoCL( gpuCollidables.getBufferCL(),true),
- b3BufferInfoCL( convexData.getBufferCL(),true),
- b3BufferInfoCL( gpuVertices.getBufferCL(),true),
- b3BufferInfoCL( gpuUniqueEdges.getBufferCL(),true),
- b3BufferInfoCL( gpuFaces.getBufferCL(),true),
- b3BufferInfoCL( gpuIndices.getBufferCL(),true),
- b3BufferInfoCL( gpuChildShapes.getBufferCL(),true),
- b3BufferInfoCL( clAabbsWorldSpace.getBufferCL(),true),
- b3BufferInfoCL( m_concaveSepNormals.getBufferCL()),
- b3BufferInfoCL( m_concaveHasSeparatingNormals.getBufferCL()),
- b3BufferInfoCL( clippingFacesOutGPU.getBufferCL()),
- b3BufferInfoCL( worldVertsA1GPU.getBufferCL()),
- b3BufferInfoCL(worldNormalsAGPU.getBufferCL()),
- b3BufferInfoCL(worldVertsB1GPU.getBufferCL()),
- b3BufferInfoCL(m_dmins.getBufferCL())
- };
-
- b3LauncherCL launcher(m_queue, m_findConcaveSeparatingAxisVertexFaceKernel,"m_findConcaveSeparatingAxisVertexFaceKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst(vertexFaceCapacity);
- launcher.setConst( numConcavePairs );
-
- int num = numConcavePairs;
- launcher.launch1D( num);
- clFinish(m_queue);
-
-
- }
-// numConcavePairs = 0;
- if (1)
- {
- B3_PROFILE("findConcaveSeparatingAxisEdgeEdgeKernel");
- b3BufferInfoCL bInfo[] = {
- b3BufferInfoCL( triangleConvexPairsOut.getBufferCL() ),
- b3BufferInfoCL( bodyBuf->getBufferCL(),true),
- b3BufferInfoCL( gpuCollidables.getBufferCL(),true),
- b3BufferInfoCL( convexData.getBufferCL(),true),
- b3BufferInfoCL( gpuVertices.getBufferCL(),true),
- b3BufferInfoCL( gpuUniqueEdges.getBufferCL(),true),
- b3BufferInfoCL( gpuFaces.getBufferCL(),true),
- b3BufferInfoCL( gpuIndices.getBufferCL(),true),
- b3BufferInfoCL( gpuChildShapes.getBufferCL(),true),
- b3BufferInfoCL( clAabbsWorldSpace.getBufferCL(),true),
- b3BufferInfoCL( m_concaveSepNormals.getBufferCL()),
- b3BufferInfoCL( m_concaveHasSeparatingNormals.getBufferCL()),
- b3BufferInfoCL( clippingFacesOutGPU.getBufferCL()),
- b3BufferInfoCL( worldVertsA1GPU.getBufferCL()),
- b3BufferInfoCL(worldNormalsAGPU.getBufferCL()),
- b3BufferInfoCL(worldVertsB1GPU.getBufferCL()),
- b3BufferInfoCL(m_dmins.getBufferCL())
- };
-
- b3LauncherCL launcher(m_queue, m_findConcaveSeparatingAxisEdgeEdgeKernel,"m_findConcaveSeparatingAxisEdgeEdgeKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst(vertexFaceCapacity);
- launcher.setConst( numConcavePairs );
-
- int num = numConcavePairs;
- launcher.launch1D( num);
- clFinish(m_queue);
- }
-
-
- // numConcavePairs = 0;
-
-
-
-
-
-
- } else
- {
- B3_PROFILE("findConcaveSeparatingAxisKernel");
- b3BufferInfoCL bInfo[] = {
- b3BufferInfoCL( triangleConvexPairsOut.getBufferCL() ),
- b3BufferInfoCL( bodyBuf->getBufferCL(),true),
- b3BufferInfoCL( gpuCollidables.getBufferCL(),true),
- b3BufferInfoCL( convexData.getBufferCL(),true),
- b3BufferInfoCL( gpuVertices.getBufferCL(),true),
- b3BufferInfoCL( gpuUniqueEdges.getBufferCL(),true),
- b3BufferInfoCL( gpuFaces.getBufferCL(),true),
- b3BufferInfoCL( gpuIndices.getBufferCL(),true),
- b3BufferInfoCL( gpuChildShapes.getBufferCL(),true),
- b3BufferInfoCL( clAabbsWorldSpace.getBufferCL(),true),
- b3BufferInfoCL( m_concaveSepNormals.getBufferCL()),
- b3BufferInfoCL( m_concaveHasSeparatingNormals.getBufferCL()),
- b3BufferInfoCL( clippingFacesOutGPU.getBufferCL()),
- b3BufferInfoCL( worldVertsA1GPU.getBufferCL()),
- b3BufferInfoCL(worldNormalsAGPU.getBufferCL()),
- b3BufferInfoCL(worldVertsB1GPU.getBufferCL())
- };
-
- b3LauncherCL launcher(m_queue, m_findConcaveSeparatingAxisKernel,"m_findConcaveSeparatingAxisKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst(vertexFaceCapacity);
- launcher.setConst( numConcavePairs );
-
- int num = numConcavePairs;
- launcher.launch1D( num);
- clFinish(m_queue);
- }
-
-
- } else
- {
-
- b3AlignedObjectArray<b3Int4> clippingFacesOutCPU;
- b3AlignedObjectArray<b3Vector3> worldVertsA1CPU;
- b3AlignedObjectArray<b3Vector3> worldNormalsACPU;
- b3AlignedObjectArray<b3Vector3> worldVertsB1CPU;
- b3AlignedObjectArray<int>concaveHasSeparatingNormalsCPU;
+ if (splitSearchSepAxisConcave)
+ {
+ //printf("numConcavePairs = %d\n",numConcavePairs);
+ m_dmins.resize(numConcavePairs);
+ {
+ B3_PROFILE("findConcaveSeparatingAxisVertexFaceKernel");
+ b3BufferInfoCL bInfo[] = {
+ b3BufferInfoCL(triangleConvexPairsOut.getBufferCL()),
+ b3BufferInfoCL(bodyBuf->getBufferCL(), true),
+ b3BufferInfoCL(gpuCollidables.getBufferCL(), true),
+ b3BufferInfoCL(convexData.getBufferCL(), true),
+ b3BufferInfoCL(gpuVertices.getBufferCL(), true),
+ b3BufferInfoCL(gpuUniqueEdges.getBufferCL(), true),
+ b3BufferInfoCL(gpuFaces.getBufferCL(), true),
+ b3BufferInfoCL(gpuIndices.getBufferCL(), true),
+ b3BufferInfoCL(gpuChildShapes.getBufferCL(), true),
+ b3BufferInfoCL(clAabbsWorldSpace.getBufferCL(), true),
+ b3BufferInfoCL(m_concaveSepNormals.getBufferCL()),
+ b3BufferInfoCL(m_concaveHasSeparatingNormals.getBufferCL()),
+ b3BufferInfoCL(clippingFacesOutGPU.getBufferCL()),
+ b3BufferInfoCL(worldVertsA1GPU.getBufferCL()),
+ b3BufferInfoCL(worldNormalsAGPU.getBufferCL()),
+ b3BufferInfoCL(worldVertsB1GPU.getBufferCL()),
+ b3BufferInfoCL(m_dmins.getBufferCL())};
+
+ b3LauncherCL launcher(m_queue, m_findConcaveSeparatingAxisVertexFaceKernel, "m_findConcaveSeparatingAxisVertexFaceKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(vertexFaceCapacity);
+ launcher.setConst(numConcavePairs);
- b3AlignedObjectArray<b3Int4> triangleConvexPairsOutHost;
- triangleConvexPairsOut.copyToHost(triangleConvexPairsOutHost);
- //triangleConvexPairsOutHost.resize(maxTriConvexPairCapacity);
- b3AlignedObjectArray<b3RigidBodyData> hostBodyBuf;
- bodyBuf->copyToHost(hostBodyBuf);
- b3AlignedObjectArray<b3Collidable> hostCollidables;
- gpuCollidables.copyToHost(hostCollidables);
- b3AlignedObjectArray<b3Aabb> hostAabbsWorldSpace;
- clAabbsWorldSpace.copyToHost(hostAabbsWorldSpace);
+ int num = numConcavePairs;
+ launcher.launch1D(num);
+ clFinish(m_queue);
+ }
+ // numConcavePairs = 0;
+ if (1)
+ {
+ B3_PROFILE("findConcaveSeparatingAxisEdgeEdgeKernel");
+ b3BufferInfoCL bInfo[] = {
+ b3BufferInfoCL(triangleConvexPairsOut.getBufferCL()),
+ b3BufferInfoCL(bodyBuf->getBufferCL(), true),
+ b3BufferInfoCL(gpuCollidables.getBufferCL(), true),
+ b3BufferInfoCL(convexData.getBufferCL(), true),
+ b3BufferInfoCL(gpuVertices.getBufferCL(), true),
+ b3BufferInfoCL(gpuUniqueEdges.getBufferCL(), true),
+ b3BufferInfoCL(gpuFaces.getBufferCL(), true),
+ b3BufferInfoCL(gpuIndices.getBufferCL(), true),
+ b3BufferInfoCL(gpuChildShapes.getBufferCL(), true),
+ b3BufferInfoCL(clAabbsWorldSpace.getBufferCL(), true),
+ b3BufferInfoCL(m_concaveSepNormals.getBufferCL()),
+ b3BufferInfoCL(m_concaveHasSeparatingNormals.getBufferCL()),
+ b3BufferInfoCL(clippingFacesOutGPU.getBufferCL()),
+ b3BufferInfoCL(worldVertsA1GPU.getBufferCL()),
+ b3BufferInfoCL(worldNormalsAGPU.getBufferCL()),
+ b3BufferInfoCL(worldVertsB1GPU.getBufferCL()),
+ b3BufferInfoCL(m_dmins.getBufferCL())};
+
+ b3LauncherCL launcher(m_queue, m_findConcaveSeparatingAxisEdgeEdgeKernel, "m_findConcaveSeparatingAxisEdgeEdgeKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(vertexFaceCapacity);
+ launcher.setConst(numConcavePairs);
- b3AlignedObjectArray<b3ConvexPolyhedronData> hostConvexData;
- convexData.copyToHost(hostConvexData);
+ int num = numConcavePairs;
+ launcher.launch1D(num);
+ clFinish(m_queue);
+ }
- b3AlignedObjectArray<b3Vector3> hostVertices;
- gpuVertices.copyToHost(hostVertices);
+ // numConcavePairs = 0;
+ }
+ else
+ {
+ B3_PROFILE("findConcaveSeparatingAxisKernel");
+ b3BufferInfoCL bInfo[] = {
+ b3BufferInfoCL(triangleConvexPairsOut.getBufferCL()),
+ b3BufferInfoCL(bodyBuf->getBufferCL(), true),
+ b3BufferInfoCL(gpuCollidables.getBufferCL(), true),
+ b3BufferInfoCL(convexData.getBufferCL(), true),
+ b3BufferInfoCL(gpuVertices.getBufferCL(), true),
+ b3BufferInfoCL(gpuUniqueEdges.getBufferCL(), true),
+ b3BufferInfoCL(gpuFaces.getBufferCL(), true),
+ b3BufferInfoCL(gpuIndices.getBufferCL(), true),
+ b3BufferInfoCL(gpuChildShapes.getBufferCL(), true),
+ b3BufferInfoCL(clAabbsWorldSpace.getBufferCL(), true),
+ b3BufferInfoCL(m_concaveSepNormals.getBufferCL()),
+ b3BufferInfoCL(m_concaveHasSeparatingNormals.getBufferCL()),
+ b3BufferInfoCL(clippingFacesOutGPU.getBufferCL()),
+ b3BufferInfoCL(worldVertsA1GPU.getBufferCL()),
+ b3BufferInfoCL(worldNormalsAGPU.getBufferCL()),
+ b3BufferInfoCL(worldVertsB1GPU.getBufferCL())};
+
+ b3LauncherCL launcher(m_queue, m_findConcaveSeparatingAxisKernel, "m_findConcaveSeparatingAxisKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(vertexFaceCapacity);
+ launcher.setConst(numConcavePairs);
- b3AlignedObjectArray<b3Vector3> hostUniqueEdges;
- gpuUniqueEdges.copyToHost(hostUniqueEdges);
- b3AlignedObjectArray<b3GpuFace> hostFaces;
- gpuFaces.copyToHost(hostFaces);
- b3AlignedObjectArray<int> hostIndices;
- gpuIndices.copyToHost(hostIndices);
- b3AlignedObjectArray<b3GpuChildShape> cpuChildShapes;
- gpuChildShapes.copyToHost(cpuChildShapes);
+ int num = numConcavePairs;
+ launcher.launch1D(num);
+ clFinish(m_queue);
+ }
+ }
+ else
+ {
+ b3AlignedObjectArray<b3Int4> clippingFacesOutCPU;
+ b3AlignedObjectArray<b3Vector3> worldVertsA1CPU;
+ b3AlignedObjectArray<b3Vector3> worldNormalsACPU;
+ b3AlignedObjectArray<b3Vector3> worldVertsB1CPU;
+ b3AlignedObjectArray<int> concaveHasSeparatingNormalsCPU;
+ b3AlignedObjectArray<b3Int4> triangleConvexPairsOutHost;
+ triangleConvexPairsOut.copyToHost(triangleConvexPairsOutHost);
+ //triangleConvexPairsOutHost.resize(maxTriConvexPairCapacity);
+ b3AlignedObjectArray<b3RigidBodyData> hostBodyBuf;
+ bodyBuf->copyToHost(hostBodyBuf);
+ b3AlignedObjectArray<b3Collidable> hostCollidables;
+ gpuCollidables.copyToHost(hostCollidables);
+ b3AlignedObjectArray<b3Aabb> hostAabbsWorldSpace;
+ clAabbsWorldSpace.copyToHost(hostAabbsWorldSpace);
-
- b3AlignedObjectArray<b3Vector3> concaveSepNormalsHost;
- m_concaveSepNormals.copyToHost(concaveSepNormalsHost);
- concaveHasSeparatingNormalsCPU.resize(concaveSepNormalsHost.size());
+ b3AlignedObjectArray<b3ConvexPolyhedronData> hostConvexData;
+ convexData.copyToHost(hostConvexData);
- b3GpuChildShape* childShapePointerCPU = 0;
- if (cpuChildShapes.size())
- childShapePointerCPU = &cpuChildShapes.at(0);
+ b3AlignedObjectArray<b3Vector3> hostVertices;
+ gpuVertices.copyToHost(hostVertices);
- clippingFacesOutCPU.resize(clippingFacesOutGPU.size());
- worldVertsA1CPU.resize(worldVertsA1GPU.size());
- worldNormalsACPU.resize(worldNormalsAGPU.size());
- worldVertsB1CPU.resize(worldVertsB1GPU.size());
+ b3AlignedObjectArray<b3Vector3> hostUniqueEdges;
+ gpuUniqueEdges.copyToHost(hostUniqueEdges);
+ b3AlignedObjectArray<b3GpuFace> hostFaces;
+ gpuFaces.copyToHost(hostFaces);
+ b3AlignedObjectArray<int> hostIndices;
+ gpuIndices.copyToHost(hostIndices);
+ b3AlignedObjectArray<b3GpuChildShape> cpuChildShapes;
+ gpuChildShapes.copyToHost(cpuChildShapes);
- for (int i=0;i<numConcavePairs;i++)
- {
- b3FindConcaveSeparatingAxisKernel(&triangleConvexPairsOutHost.at(0),
- &hostBodyBuf.at(0),
- &hostCollidables.at(0),
- &hostConvexData.at(0), &hostVertices.at(0),&hostUniqueEdges.at(0),
- &hostFaces.at(0),&hostIndices.at(0),childShapePointerCPU,
- &hostAabbsWorldSpace.at(0),
- &concaveSepNormalsHost.at(0),
- &clippingFacesOutCPU.at(0),
- &worldVertsA1CPU.at(0),
- &worldNormalsACPU.at(0),
- &worldVertsB1CPU.at(0),
- &concaveHasSeparatingNormalsCPU.at(0),
- vertexFaceCapacity,
- numConcavePairs,i);
- };
+ b3AlignedObjectArray<b3Vector3> concaveSepNormalsHost;
+ m_concaveSepNormals.copyToHost(concaveSepNormalsHost);
+ concaveHasSeparatingNormalsCPU.resize(concaveSepNormalsHost.size());
- m_concaveSepNormals.copyFromHost(concaveSepNormalsHost);
- m_concaveHasSeparatingNormals.copyFromHost(concaveHasSeparatingNormalsCPU);
- clippingFacesOutGPU.copyFromHost(clippingFacesOutCPU);
- worldVertsA1GPU.copyFromHost(worldVertsA1CPU);
- worldNormalsAGPU.copyFromHost(worldNormalsACPU);
- worldVertsB1GPU.copyFromHost(worldVertsB1CPU);
+ b3GpuChildShape* childShapePointerCPU = 0;
+ if (cpuChildShapes.size())
+ childShapePointerCPU = &cpuChildShapes.at(0);
+ clippingFacesOutCPU.resize(clippingFacesOutGPU.size());
+ worldVertsA1CPU.resize(worldVertsA1GPU.size());
+ worldNormalsACPU.resize(worldNormalsAGPU.size());
+ worldVertsB1CPU.resize(worldVertsB1GPU.size());
+ for (int i = 0; i < numConcavePairs; i++)
+ {
+ b3FindConcaveSeparatingAxisKernel(&triangleConvexPairsOutHost.at(0),
+ &hostBodyBuf.at(0),
+ &hostCollidables.at(0),
+ &hostConvexData.at(0), &hostVertices.at(0), &hostUniqueEdges.at(0),
+ &hostFaces.at(0), &hostIndices.at(0), childShapePointerCPU,
+ &hostAabbsWorldSpace.at(0),
+ &concaveSepNormalsHost.at(0),
+ &clippingFacesOutCPU.at(0),
+ &worldVertsA1CPU.at(0),
+ &worldNormalsACPU.at(0),
+ &worldVertsB1CPU.at(0),
+ &concaveHasSeparatingNormalsCPU.at(0),
+ vertexFaceCapacity,
+ numConcavePairs, i);
+ };
+ m_concaveSepNormals.copyFromHost(concaveSepNormalsHost);
+ m_concaveHasSeparatingNormals.copyFromHost(concaveHasSeparatingNormalsCPU);
+ clippingFacesOutGPU.copyFromHost(clippingFacesOutCPU);
+ worldVertsA1GPU.copyFromHost(worldVertsA1CPU);
+ worldNormalsAGPU.copyFromHost(worldNormalsACPU);
+ worldVertsB1GPU.copyFromHost(worldVertsB1CPU);
}
-// b3AlignedObjectArray<b3Vector3> cpuCompoundSepNormals;
-// m_concaveSepNormals.copyToHost(cpuCompoundSepNormals);
-// b3AlignedObjectArray<b3Int4> cpuConcavePairs;
-// triangleConvexPairsOut.copyToHost(cpuConcavePairs);
-
-
+ // b3AlignedObjectArray<b3Vector3> cpuCompoundSepNormals;
+ // m_concaveSepNormals.copyToHost(cpuCompoundSepNormals);
+ // b3AlignedObjectArray<b3Int4> cpuConcavePairs;
+ // triangleConvexPairsOut.copyToHost(cpuConcavePairs);
}
}
-
-
}
if (numConcavePairs)
{
- if (numConcavePairs)
+ if (numConcavePairs)
{
B3_PROFILE("findConcaveSphereContactsKernel");
- nContacts = m_totalContactsOut.at(0);
-// printf("nContacts1 = %d\n",nContacts);
- b3BufferInfoCL bInfo[] = {
- b3BufferInfoCL( triangleConvexPairsOut.getBufferCL() ),
- b3BufferInfoCL( bodyBuf->getBufferCL(),true),
- b3BufferInfoCL( gpuCollidables.getBufferCL(),true),
- b3BufferInfoCL( convexData.getBufferCL(),true),
- b3BufferInfoCL( gpuVertices.getBufferCL(),true),
- b3BufferInfoCL( gpuUniqueEdges.getBufferCL(),true),
- b3BufferInfoCL( gpuFaces.getBufferCL(),true),
- b3BufferInfoCL( gpuIndices.getBufferCL(),true),
- b3BufferInfoCL( clAabbsWorldSpace.getBufferCL(),true),
- b3BufferInfoCL( contactOut->getBufferCL()),
- b3BufferInfoCL( m_totalContactsOut.getBufferCL())
- };
-
- b3LauncherCL launcher(m_queue, m_findConcaveSphereContactsKernel,"m_findConcaveSphereContactsKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
-
- launcher.setConst( numConcavePairs );
+ nContacts = m_totalContactsOut.at(0);
+ // printf("nContacts1 = %d\n",nContacts);
+ b3BufferInfoCL bInfo[] = {
+ b3BufferInfoCL(triangleConvexPairsOut.getBufferCL()),
+ b3BufferInfoCL(bodyBuf->getBufferCL(), true),
+ b3BufferInfoCL(gpuCollidables.getBufferCL(), true),
+ b3BufferInfoCL(convexData.getBufferCL(), true),
+ b3BufferInfoCL(gpuVertices.getBufferCL(), true),
+ b3BufferInfoCL(gpuUniqueEdges.getBufferCL(), true),
+ b3BufferInfoCL(gpuFaces.getBufferCL(), true),
+ b3BufferInfoCL(gpuIndices.getBufferCL(), true),
+ b3BufferInfoCL(clAabbsWorldSpace.getBufferCL(), true),
+ b3BufferInfoCL(contactOut->getBufferCL()),
+ b3BufferInfoCL(m_totalContactsOut.getBufferCL())};
+
+ b3LauncherCL launcher(m_queue, m_findConcaveSphereContactsKernel, "m_findConcaveSphereContactsKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+
+ launcher.setConst(numConcavePairs);
launcher.setConst(maxContactCapacity);
int num = numConcavePairs;
- launcher.launch1D( num);
+ launcher.launch1D(num);
clFinish(m_queue);
nContacts = m_totalContactsOut.at(0);
//printf("nContacts (after findConcaveSphereContactsKernel) = %d\n",nContacts);
@@ -4088,11 +3816,8 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
nContacts = maxContactCapacity;
}
}
-
}
-
-
#ifdef __APPLE__
bool contactClippingOnGpu = true;
#else
@@ -4101,9 +3826,8 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
if (contactClippingOnGpu)
{
- m_totalContactsOut.copyFromHostPointer(&nContacts,1,0,true);
-// printf("nContacts3 = %d\n",nContacts);
-
+ m_totalContactsOut.copyFromHostPointer(&nContacts, 1, 0, true);
+ // printf("nContacts3 = %d\n",nContacts);
//B3_PROFILE("clipHullHullKernel");
@@ -4122,15 +3846,12 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
if (breakupConcaveConvexKernel)
{
-
- worldVertsB2GPU.resize(vertexFaceCapacity*numConcavePairs);
-
+ worldVertsB2GPU.resize(vertexFaceCapacity * numConcavePairs);
//clipFacesAndFindContacts
if (clipConcaveFacesAndFindContactsCPU)
{
-
b3AlignedObjectArray<b3Int4> clippingFacesOutCPU;
b3AlignedObjectArray<b3Vector3> worldVertsA1CPU;
b3AlignedObjectArray<b3Vector3> worldNormalsACPU;
@@ -4141,120 +3862,108 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
worldNormalsAGPU.copyToHost(worldNormalsACPU);
worldVertsB1GPU.copyToHost(worldVertsB1CPU);
-
-
- b3AlignedObjectArray<int>concaveHasSeparatingNormalsCPU;
+ b3AlignedObjectArray<int> concaveHasSeparatingNormalsCPU;
m_concaveHasSeparatingNormals.copyToHost(concaveHasSeparatingNormalsCPU);
b3AlignedObjectArray<b3Vector3> concaveSepNormalsHost;
m_concaveSepNormals.copyToHost(concaveSepNormalsHost);
- b3AlignedObjectArray<b3Vector3> worldVertsB2CPU;
+ b3AlignedObjectArray<b3Vector3> worldVertsB2CPU;
worldVertsB2CPU.resize(worldVertsB2GPU.size());
-
- for (int i=0;i<numConcavePairs;i++)
+ for (int i = 0; i < numConcavePairs; i++)
{
-
- clipFacesAndFindContactsKernel( &concaveSepNormalsHost.at(0),
- &concaveHasSeparatingNormalsCPU.at(0),
- &clippingFacesOutCPU.at(0),
- &worldVertsA1CPU.at(0),
- &worldNormalsACPU.at(0),
- &worldVertsB1CPU.at(0),
- &worldVertsB2CPU.at(0),
- vertexFaceCapacity,
- i);
+ clipFacesAndFindContactsKernel(&concaveSepNormalsHost.at(0),
+ &concaveHasSeparatingNormalsCPU.at(0),
+ &clippingFacesOutCPU.at(0),
+ &worldVertsA1CPU.at(0),
+ &worldNormalsACPU.at(0),
+ &worldVertsB1CPU.at(0),
+ &worldVertsB2CPU.at(0),
+ vertexFaceCapacity,
+ i);
}
clippingFacesOutGPU.copyFromHost(clippingFacesOutCPU);
worldVertsB2GPU.copyFromHost(worldVertsB2CPU);
-
-
- } else
+ }
+ else
{
-
if (1)
{
-
-
-
B3_PROFILE("clipFacesAndFindContacts");
//nContacts = m_totalContactsOut.at(0);
//int h = m_hasSeparatingNormals.at(0);
//int4 p = clippingFacesOutGPU.at(0);
b3BufferInfoCL bInfo[] = {
- b3BufferInfoCL( m_concaveSepNormals.getBufferCL()),
- b3BufferInfoCL( m_concaveHasSeparatingNormals.getBufferCL()),
- b3BufferInfoCL( clippingFacesOutGPU.getBufferCL()),
- b3BufferInfoCL( worldVertsA1GPU.getBufferCL()),
- b3BufferInfoCL( worldNormalsAGPU.getBufferCL()),
- b3BufferInfoCL( worldVertsB1GPU.getBufferCL()),
- b3BufferInfoCL( worldVertsB2GPU.getBufferCL())
- };
- b3LauncherCL launcher(m_queue, m_clipFacesAndFindContacts,"m_clipFacesAndFindContacts");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
+ b3BufferInfoCL(m_concaveSepNormals.getBufferCL()),
+ b3BufferInfoCL(m_concaveHasSeparatingNormals.getBufferCL()),
+ b3BufferInfoCL(clippingFacesOutGPU.getBufferCL()),
+ b3BufferInfoCL(worldVertsA1GPU.getBufferCL()),
+ b3BufferInfoCL(worldNormalsAGPU.getBufferCL()),
+ b3BufferInfoCL(worldVertsB1GPU.getBufferCL()),
+ b3BufferInfoCL(worldVertsB2GPU.getBufferCL())};
+ b3LauncherCL launcher(m_queue, m_clipFacesAndFindContacts, "m_clipFacesAndFindContacts");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
launcher.setConst(vertexFaceCapacity);
- launcher.setConst( numConcavePairs );
+ launcher.setConst(numConcavePairs);
int debugMode = 0;
- launcher.setConst( debugMode);
+ launcher.setConst(debugMode);
int num = numConcavePairs;
- launcher.launch1D( num);
+ launcher.launch1D(num);
clFinish(m_queue);
//int bla = m_totalContactsOut.at(0);
}
}
//contactReduction
{
- int newContactCapacity=nContacts+numConcavePairs;
+ int newContactCapacity = nContacts + numConcavePairs;
contactOut->reserve(newContactCapacity);
if (reduceConcaveContactsOnGPU)
{
-// printf("newReservation = %d\n",newReservation);
+ // printf("newReservation = %d\n",newReservation);
{
B3_PROFILE("newContactReductionKernel");
b3BufferInfoCL bInfo[] =
- {
- b3BufferInfoCL( triangleConvexPairsOut.getBufferCL(), true ),
- b3BufferInfoCL( bodyBuf->getBufferCL(),true),
- b3BufferInfoCL( m_concaveSepNormals.getBufferCL()),
- b3BufferInfoCL( m_concaveHasSeparatingNormals.getBufferCL()),
- b3BufferInfoCL( contactOut->getBufferCL()),
- b3BufferInfoCL( clippingFacesOutGPU.getBufferCL()),
- b3BufferInfoCL( worldVertsB2GPU.getBufferCL()),
- b3BufferInfoCL( m_totalContactsOut.getBufferCL())
- };
-
- b3LauncherCL launcher(m_queue, m_newContactReductionKernel,"m_newContactReductionKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
+ {
+ b3BufferInfoCL(triangleConvexPairsOut.getBufferCL(), true),
+ b3BufferInfoCL(bodyBuf->getBufferCL(), true),
+ b3BufferInfoCL(m_concaveSepNormals.getBufferCL()),
+ b3BufferInfoCL(m_concaveHasSeparatingNormals.getBufferCL()),
+ b3BufferInfoCL(contactOut->getBufferCL()),
+ b3BufferInfoCL(clippingFacesOutGPU.getBufferCL()),
+ b3BufferInfoCL(worldVertsB2GPU.getBufferCL()),
+ b3BufferInfoCL(m_totalContactsOut.getBufferCL())};
+
+ b3LauncherCL launcher(m_queue, m_newContactReductionKernel, "m_newContactReductionKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
launcher.setConst(vertexFaceCapacity);
launcher.setConst(newContactCapacity);
- launcher.setConst( numConcavePairs );
+ launcher.setConst(numConcavePairs);
int num = numConcavePairs;
- launcher.launch1D( num);
+ launcher.launch1D(num);
}
nContacts = m_totalContactsOut.at(0);
contactOut->resize(nContacts);
//printf("contactOut4 (after newContactReductionKernel) = %d\n",nContacts);
- }else
+ }
+ else
{
-
volatile int nGlobalContactsOut = nContacts;
b3AlignedObjectArray<b3Int4> triangleConvexPairsOutHost;
triangleConvexPairsOut.copyToHost(triangleConvexPairsOutHost);
b3AlignedObjectArray<b3RigidBodyData> hostBodyBuf;
bodyBuf->copyToHost(hostBodyBuf);
- b3AlignedObjectArray<int>concaveHasSeparatingNormalsCPU;
+ b3AlignedObjectArray<int> concaveHasSeparatingNormalsCPU;
m_concaveHasSeparatingNormals.copyToHost(concaveHasSeparatingNormalsCPU);
b3AlignedObjectArray<b3Vector3> concaveSepNormalsHost;
m_concaveSepNormals.copyToHost(concaveSepNormalsHost);
-
b3AlignedObjectArray<b3Contact4> hostContacts;
if (nContacts)
{
@@ -4268,67 +3977,59 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
clippingFacesOutGPU.copyToHost(clippingFacesOutCPU);
worldVertsB2GPU.copyToHost(worldVertsB2CPU);
-
-
- for (int i=0;i<numConcavePairs;i++)
+ for (int i = 0; i < numConcavePairs; i++)
{
- b3NewContactReductionKernel( &triangleConvexPairsOutHost.at(0),
- &hostBodyBuf.at(0),
- &concaveSepNormalsHost.at(0),
- &concaveHasSeparatingNormalsCPU.at(0),
- &hostContacts.at(0),
- &clippingFacesOutCPU.at(0),
- &worldVertsB2CPU.at(0),
- &nGlobalContactsOut,
- vertexFaceCapacity,
- newContactCapacity,
- numConcavePairs,
- i
- );
-
+ b3NewContactReductionKernel(&triangleConvexPairsOutHost.at(0),
+ &hostBodyBuf.at(0),
+ &concaveSepNormalsHost.at(0),
+ &concaveHasSeparatingNormalsCPU.at(0),
+ &hostContacts.at(0),
+ &clippingFacesOutCPU.at(0),
+ &worldVertsB2CPU.at(0),
+ &nGlobalContactsOut,
+ vertexFaceCapacity,
+ newContactCapacity,
+ numConcavePairs,
+ i);
}
-
nContacts = nGlobalContactsOut;
- m_totalContactsOut.copyFromHostPointer(&nContacts,1,0,true);
-// nContacts = m_totalContactsOut.at(0);
+ m_totalContactsOut.copyFromHostPointer(&nContacts, 1, 0, true);
+ // nContacts = m_totalContactsOut.at(0);
//contactOut->resize(nContacts);
hostContacts.resize(nContacts);
//printf("contactOut4 (after newContactReductionKernel) = %d\n",nContacts);
contactOut->copyFromHost(hostContacts);
}
-
}
//re-use?
-
-
- } else
+ }
+ else
{
B3_PROFILE("clipHullHullConcaveConvexKernel");
nContacts = m_totalContactsOut.at(0);
int newContactCapacity = contactOut->capacity();
//printf("contactOut5 = %d\n",nContacts);
- b3BufferInfoCL bInfo[] = {
- b3BufferInfoCL( triangleConvexPairsOut.getBufferCL(), true ),
- b3BufferInfoCL( bodyBuf->getBufferCL(),true),
- b3BufferInfoCL( gpuCollidables.getBufferCL(),true),
- b3BufferInfoCL( convexData.getBufferCL(),true),
- b3BufferInfoCL( gpuVertices.getBufferCL(),true),
- b3BufferInfoCL( gpuUniqueEdges.getBufferCL(),true),
- b3BufferInfoCL( gpuFaces.getBufferCL(),true),
- b3BufferInfoCL( gpuIndices.getBufferCL(),true),
- b3BufferInfoCL( gpuChildShapes.getBufferCL(),true),
- b3BufferInfoCL( m_concaveSepNormals.getBufferCL()),
- b3BufferInfoCL( contactOut->getBufferCL()),
- b3BufferInfoCL( m_totalContactsOut.getBufferCL())
- };
- b3LauncherCL launcher(m_queue, m_clipHullHullConcaveConvexKernel,"m_clipHullHullConcaveConvexKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
+ b3BufferInfoCL bInfo[] = {
+ b3BufferInfoCL(triangleConvexPairsOut.getBufferCL(), true),
+ b3BufferInfoCL(bodyBuf->getBufferCL(), true),
+ b3BufferInfoCL(gpuCollidables.getBufferCL(), true),
+ b3BufferInfoCL(convexData.getBufferCL(), true),
+ b3BufferInfoCL(gpuVertices.getBufferCL(), true),
+ b3BufferInfoCL(gpuUniqueEdges.getBufferCL(), true),
+ b3BufferInfoCL(gpuFaces.getBufferCL(), true),
+ b3BufferInfoCL(gpuIndices.getBufferCL(), true),
+ b3BufferInfoCL(gpuChildShapes.getBufferCL(), true),
+ b3BufferInfoCL(m_concaveSepNormals.getBufferCL()),
+ b3BufferInfoCL(contactOut->getBufferCL()),
+ b3BufferInfoCL(m_totalContactsOut.getBufferCL())};
+ b3LauncherCL launcher(m_queue, m_clipHullHullConcaveConvexKernel, "m_clipHullHullConcaveConvexKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
launcher.setConst(newContactCapacity);
- launcher.setConst( numConcavePairs );
+ launcher.setConst(numConcavePairs);
int num = numConcavePairs;
- launcher.launch1D( num);
+ launcher.launch1D(num);
clFinish(m_queue);
nContacts = m_totalContactsOut.at(0);
contactOut->resize(nContacts);
@@ -4337,12 +4038,10 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
contactOut->copyToHost(cpuContacts);
}
// printf("nContacts after = %d\n", nContacts);
- }//numConcavePairs
-
-
+ } //numConcavePairs
//convex-convex contact clipping
-
+
bool breakupKernel = false;
#ifdef __APPLE__
@@ -4350,166 +4049,149 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
#endif
#ifdef CHECK_ON_HOST
- bool computeConvexConvex = false;
+ bool computeConvexConvex = false;
#else
- bool computeConvexConvex = true;
-#endif//CHECK_ON_HOST
+ bool computeConvexConvex = true;
+#endif //CHECK_ON_HOST
if (computeConvexConvex)
{
B3_PROFILE("clipHullHullKernel");
- if (breakupKernel)
- {
-
-
-
-
- worldVertsB1GPU.resize(vertexFaceCapacity*nPairs);
- clippingFacesOutGPU.resize(nPairs);
- worldNormalsAGPU.resize(nPairs);
- worldVertsA1GPU.resize(vertexFaceCapacity*nPairs);
- worldVertsB2GPU.resize(vertexFaceCapacity*nPairs);
-
- if (findConvexClippingFacesGPU)
- {
- B3_PROFILE("findClippingFacesKernel");
- b3BufferInfoCL bInfo[] = {
- b3BufferInfoCL( pairs->getBufferCL(), true ),
- b3BufferInfoCL( bodyBuf->getBufferCL(),true),
- b3BufferInfoCL( gpuCollidables.getBufferCL(),true),
- b3BufferInfoCL( convexData.getBufferCL(),true),
- b3BufferInfoCL( gpuVertices.getBufferCL(),true),
- b3BufferInfoCL( gpuUniqueEdges.getBufferCL(),true),
- b3BufferInfoCL( gpuFaces.getBufferCL(),true),
- b3BufferInfoCL( gpuIndices.getBufferCL(),true),
- b3BufferInfoCL( m_sepNormals.getBufferCL()),
- b3BufferInfoCL( m_hasSeparatingNormals.getBufferCL()),
- b3BufferInfoCL( clippingFacesOutGPU.getBufferCL()),
- b3BufferInfoCL( worldVertsA1GPU.getBufferCL()),
- b3BufferInfoCL( worldNormalsAGPU.getBufferCL()),
- b3BufferInfoCL( worldVertsB1GPU.getBufferCL())
- };
-
- b3LauncherCL launcher(m_queue, m_findClippingFacesKernel,"m_findClippingFacesKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( vertexFaceCapacity);
- launcher.setConst( nPairs );
- int num = nPairs;
- launcher.launch1D( num);
- clFinish(m_queue);
-
- } else
+ if (breakupKernel)
{
-
- float minDist = -1e30f;
- float maxDist = 0.02f;
+ worldVertsB1GPU.resize(vertexFaceCapacity * nPairs);
+ clippingFacesOutGPU.resize(nPairs);
+ worldNormalsAGPU.resize(nPairs);
+ worldVertsA1GPU.resize(vertexFaceCapacity * nPairs);
+ worldVertsB2GPU.resize(vertexFaceCapacity * nPairs);
- b3AlignedObjectArray<b3ConvexPolyhedronData> hostConvexData;
- convexData.copyToHost(hostConvexData);
- b3AlignedObjectArray<b3Collidable> hostCollidables;
- gpuCollidables.copyToHost(hostCollidables);
+ if (findConvexClippingFacesGPU)
+ {
+ B3_PROFILE("findClippingFacesKernel");
+ b3BufferInfoCL bInfo[] = {
+ b3BufferInfoCL(pairs->getBufferCL(), true),
+ b3BufferInfoCL(bodyBuf->getBufferCL(), true),
+ b3BufferInfoCL(gpuCollidables.getBufferCL(), true),
+ b3BufferInfoCL(convexData.getBufferCL(), true),
+ b3BufferInfoCL(gpuVertices.getBufferCL(), true),
+ b3BufferInfoCL(gpuUniqueEdges.getBufferCL(), true),
+ b3BufferInfoCL(gpuFaces.getBufferCL(), true),
+ b3BufferInfoCL(gpuIndices.getBufferCL(), true),
+ b3BufferInfoCL(m_sepNormals.getBufferCL()),
+ b3BufferInfoCL(m_hasSeparatingNormals.getBufferCL()),
+ b3BufferInfoCL(clippingFacesOutGPU.getBufferCL()),
+ b3BufferInfoCL(worldVertsA1GPU.getBufferCL()),
+ b3BufferInfoCL(worldNormalsAGPU.getBufferCL()),
+ b3BufferInfoCL(worldVertsB1GPU.getBufferCL())};
+
+ b3LauncherCL launcher(m_queue, m_findClippingFacesKernel, "m_findClippingFacesKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(vertexFaceCapacity);
+ launcher.setConst(nPairs);
+ int num = nPairs;
+ launcher.launch1D(num);
+ clFinish(m_queue);
+ }
+ else
+ {
+ float minDist = -1e30f;
+ float maxDist = 0.02f;
- b3AlignedObjectArray<int> hostHasSepNormals;
- m_hasSeparatingNormals.copyToHost(hostHasSepNormals);
- b3AlignedObjectArray<b3Vector3> cpuSepNormals;
- m_sepNormals.copyToHost(cpuSepNormals);
+ b3AlignedObjectArray<b3ConvexPolyhedronData> hostConvexData;
+ convexData.copyToHost(hostConvexData);
+ b3AlignedObjectArray<b3Collidable> hostCollidables;
+ gpuCollidables.copyToHost(hostCollidables);
- b3AlignedObjectArray<b3Int4> hostPairs;
- pairs->copyToHost(hostPairs);
- b3AlignedObjectArray<b3RigidBodyData> hostBodyBuf;
- bodyBuf->copyToHost(hostBodyBuf);
+ b3AlignedObjectArray<int> hostHasSepNormals;
+ m_hasSeparatingNormals.copyToHost(hostHasSepNormals);
+ b3AlignedObjectArray<b3Vector3> cpuSepNormals;
+ m_sepNormals.copyToHost(cpuSepNormals);
+ b3AlignedObjectArray<b3Int4> hostPairs;
+ pairs->copyToHost(hostPairs);
+ b3AlignedObjectArray<b3RigidBodyData> hostBodyBuf;
+ bodyBuf->copyToHost(hostBodyBuf);
- //worldVertsB1GPU.resize(vertexFaceCapacity*nPairs);
- b3AlignedObjectArray<b3Vector3> worldVertsB1CPU;
- worldVertsB1GPU.copyToHost(worldVertsB1CPU);
+ //worldVertsB1GPU.resize(vertexFaceCapacity*nPairs);
+ b3AlignedObjectArray<b3Vector3> worldVertsB1CPU;
+ worldVertsB1GPU.copyToHost(worldVertsB1CPU);
- b3AlignedObjectArray<b3Int4> clippingFacesOutCPU;
- clippingFacesOutGPU.copyToHost(clippingFacesOutCPU);
+ b3AlignedObjectArray<b3Int4> clippingFacesOutCPU;
+ clippingFacesOutGPU.copyToHost(clippingFacesOutCPU);
- b3AlignedObjectArray<b3Vector3> worldNormalsACPU;
- worldNormalsACPU.resize(nPairs);
+ b3AlignedObjectArray<b3Vector3> worldNormalsACPU;
+ worldNormalsACPU.resize(nPairs);
- b3AlignedObjectArray<b3Vector3> worldVertsA1CPU;
- worldVertsA1CPU.resize(worldVertsA1GPU.size());
-
-
- b3AlignedObjectArray<b3Vector3> hostVertices;
- gpuVertices.copyToHost(hostVertices);
- b3AlignedObjectArray<b3GpuFace> hostFaces;
- gpuFaces.copyToHost(hostFaces);
- b3AlignedObjectArray<int> hostIndices;
- gpuIndices.copyToHost(hostIndices);
-
-
- for (int i=0;i<nPairs;i++)
- {
+ b3AlignedObjectArray<b3Vector3> worldVertsA1CPU;
+ worldVertsA1CPU.resize(worldVertsA1GPU.size());
- int bodyIndexA = hostPairs[i].x;
- int bodyIndexB = hostPairs[i].y;
-
- int collidableIndexA = hostBodyBuf[bodyIndexA].m_collidableIdx;
- int collidableIndexB = hostBodyBuf[bodyIndexB].m_collidableIdx;
-
- int shapeIndexA = hostCollidables[collidableIndexA].m_shapeIndex;
- int shapeIndexB = hostCollidables[collidableIndexB].m_shapeIndex;
-
+ b3AlignedObjectArray<b3Vector3> hostVertices;
+ gpuVertices.copyToHost(hostVertices);
+ b3AlignedObjectArray<b3GpuFace> hostFaces;
+ gpuFaces.copyToHost(hostFaces);
+ b3AlignedObjectArray<int> hostIndices;
+ gpuIndices.copyToHost(hostIndices);
- if (hostHasSepNormals[i])
+ for (int i = 0; i < nPairs; i++)
{
- b3FindClippingFaces(cpuSepNormals[i],
- &hostConvexData[shapeIndexA],
- &hostConvexData[shapeIndexB],
- hostBodyBuf[bodyIndexA].m_pos,hostBodyBuf[bodyIndexA].m_quat,
- hostBodyBuf[bodyIndexB].m_pos,hostBodyBuf[bodyIndexB].m_quat,
- &worldVertsA1CPU.at(0),&worldNormalsACPU.at(0),
- &worldVertsB1CPU.at(0),
- vertexFaceCapacity,minDist,maxDist,
- &hostVertices.at(0),&hostFaces.at(0),
- &hostIndices.at(0),
- &hostVertices.at(0),&hostFaces.at(0),
- &hostIndices.at(0),&clippingFacesOutCPU.at(0),i);
- }
- }
-
- clippingFacesOutGPU.copyFromHost(clippingFacesOutCPU);
- worldVertsA1GPU.copyFromHost(worldVertsA1CPU);
- worldNormalsAGPU.copyFromHost(worldNormalsACPU);
- worldVertsB1GPU.copyFromHost(worldVertsB1CPU);
-
- }
+ int bodyIndexA = hostPairs[i].x;
+ int bodyIndexB = hostPairs[i].y;
+ int collidableIndexA = hostBodyBuf[bodyIndexA].m_collidableIdx;
+ int collidableIndexB = hostBodyBuf[bodyIndexB].m_collidableIdx;
+ int shapeIndexA = hostCollidables[collidableIndexA].m_shapeIndex;
+ int shapeIndexB = hostCollidables[collidableIndexB].m_shapeIndex;
+ if (hostHasSepNormals[i])
+ {
+ b3FindClippingFaces(cpuSepNormals[i],
+ &hostConvexData[shapeIndexA],
+ &hostConvexData[shapeIndexB],
+ hostBodyBuf[bodyIndexA].m_pos, hostBodyBuf[bodyIndexA].m_quat,
+ hostBodyBuf[bodyIndexB].m_pos, hostBodyBuf[bodyIndexB].m_quat,
+ &worldVertsA1CPU.at(0), &worldNormalsACPU.at(0),
+ &worldVertsB1CPU.at(0),
+ vertexFaceCapacity, minDist, maxDist,
+ &hostVertices.at(0), &hostFaces.at(0),
+ &hostIndices.at(0),
+ &hostVertices.at(0), &hostFaces.at(0),
+ &hostIndices.at(0), &clippingFacesOutCPU.at(0), i);
+ }
+ }
+ clippingFacesOutGPU.copyFromHost(clippingFacesOutCPU);
+ worldVertsA1GPU.copyFromHost(worldVertsA1CPU);
+ worldNormalsAGPU.copyFromHost(worldNormalsACPU);
+ worldVertsB1GPU.copyFromHost(worldVertsB1CPU);
+ }
- ///clip face B against face A, reduce contacts and append them to a global contact array
- if (1)
- {
- if (clipConvexFacesAndFindContactsCPU)
+ ///clip face B against face A, reduce contacts and append them to a global contact array
+ if (1)
{
+ if (clipConvexFacesAndFindContactsCPU)
+ {
+ //b3AlignedObjectArray<b3Int4> hostPairs;
+ //pairs->copyToHost(hostPairs);
- //b3AlignedObjectArray<b3Int4> hostPairs;
- //pairs->copyToHost(hostPairs);
+ b3AlignedObjectArray<b3Vector3> hostSepNormals;
+ m_sepNormals.copyToHost(hostSepNormals);
+ b3AlignedObjectArray<int> hostHasSepAxis;
+ m_hasSeparatingNormals.copyToHost(hostHasSepAxis);
- b3AlignedObjectArray<b3Vector3> hostSepNormals;
- m_sepNormals.copyToHost(hostSepNormals);
- b3AlignedObjectArray<int> hostHasSepAxis;
- m_hasSeparatingNormals.copyToHost(hostHasSepAxis);
+ b3AlignedObjectArray<b3Int4> hostClippingFaces;
+ clippingFacesOutGPU.copyToHost(hostClippingFaces);
+ b3AlignedObjectArray<b3Vector3> worldVertsB2CPU;
+ worldVertsB2CPU.resize(vertexFaceCapacity * nPairs);
- b3AlignedObjectArray<b3Int4> hostClippingFaces;
- clippingFacesOutGPU.copyToHost(hostClippingFaces);
- b3AlignedObjectArray<b3Vector3> worldVertsB2CPU;
- worldVertsB2CPU.resize(vertexFaceCapacity*nPairs);
-
- b3AlignedObjectArray<b3Vector3>worldVertsA1CPU;
- worldVertsA1GPU.copyToHost(worldVertsA1CPU);
- b3AlignedObjectArray<b3Vector3> worldNormalsACPU;
- worldNormalsAGPU.copyToHost(worldNormalsACPU);
+ b3AlignedObjectArray<b3Vector3> worldVertsA1CPU;
+ worldVertsA1GPU.copyToHost(worldVertsA1CPU);
+ b3AlignedObjectArray<b3Vector3> worldNormalsACPU;
+ worldNormalsAGPU.copyToHost(worldNormalsACPU);
- b3AlignedObjectArray<b3Vector3> worldVertsB1CPU;
- worldVertsB1GPU.copyToHost(worldVertsB1CPU);
+ b3AlignedObjectArray<b3Vector3> worldVertsB1CPU;
+ worldVertsB1GPU.copyToHost(worldVertsB1CPU);
- /*
+ /*
__global const b3Float4* separatingNormals,
__global const int* hasSeparatingAxis,
__global b3Int4* clippingFacesOut,
@@ -4520,214 +4202,207 @@ void GpuSatCollision::computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>*
int vertexFaceCapacity,
int pairIndex
*/
- for (int i=0;i<nPairs;i++)
- {
- clipFacesAndFindContactsKernel(
- &hostSepNormals.at(0),
- &hostHasSepAxis.at(0),
- &hostClippingFaces.at(0),
- &worldVertsA1CPU.at(0),
- &worldNormalsACPU.at(0),
- &worldVertsB1CPU.at(0),
- &worldVertsB2CPU.at(0),
-
- vertexFaceCapacity,
- i);
- }
-
- clippingFacesOutGPU.copyFromHost(hostClippingFaces);
- worldVertsB2GPU.copyFromHost(worldVertsB2CPU);
+ for (int i = 0; i < nPairs; i++)
+ {
+ clipFacesAndFindContactsKernel(
+ &hostSepNormals.at(0),
+ &hostHasSepAxis.at(0),
+ &hostClippingFaces.at(0),
+ &worldVertsA1CPU.at(0),
+ &worldNormalsACPU.at(0),
+ &worldVertsB1CPU.at(0),
+ &worldVertsB2CPU.at(0),
- } else
- {
- B3_PROFILE("clipFacesAndFindContacts");
- //nContacts = m_totalContactsOut.at(0);
- //int h = m_hasSeparatingNormals.at(0);
- //int4 p = clippingFacesOutGPU.at(0);
- b3BufferInfoCL bInfo[] = {
- b3BufferInfoCL( m_sepNormals.getBufferCL()),
- b3BufferInfoCL( m_hasSeparatingNormals.getBufferCL()),
- b3BufferInfoCL( clippingFacesOutGPU.getBufferCL()),
- b3BufferInfoCL( worldVertsA1GPU.getBufferCL()),
- b3BufferInfoCL( worldNormalsAGPU.getBufferCL()),
- b3BufferInfoCL( worldVertsB1GPU.getBufferCL()),
- b3BufferInfoCL( worldVertsB2GPU.getBufferCL())
- };
+ vertexFaceCapacity,
+ i);
+ }
- b3LauncherCL launcher(m_queue, m_clipFacesAndFindContacts,"m_clipFacesAndFindContacts");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst(vertexFaceCapacity);
+ clippingFacesOutGPU.copyFromHost(hostClippingFaces);
+ worldVertsB2GPU.copyFromHost(worldVertsB2CPU);
+ }
+ else
+ {
+ B3_PROFILE("clipFacesAndFindContacts");
+ //nContacts = m_totalContactsOut.at(0);
+ //int h = m_hasSeparatingNormals.at(0);
+ //int4 p = clippingFacesOutGPU.at(0);
+ b3BufferInfoCL bInfo[] = {
+ b3BufferInfoCL(m_sepNormals.getBufferCL()),
+ b3BufferInfoCL(m_hasSeparatingNormals.getBufferCL()),
+ b3BufferInfoCL(clippingFacesOutGPU.getBufferCL()),
+ b3BufferInfoCL(worldVertsA1GPU.getBufferCL()),
+ b3BufferInfoCL(worldNormalsAGPU.getBufferCL()),
+ b3BufferInfoCL(worldVertsB1GPU.getBufferCL()),
+ b3BufferInfoCL(worldVertsB2GPU.getBufferCL())};
+
+ b3LauncherCL launcher(m_queue, m_clipFacesAndFindContacts, "m_clipFacesAndFindContacts");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(vertexFaceCapacity);
- launcher.setConst( nPairs );
- int debugMode = 0;
- launcher.setConst( debugMode);
- int num = nPairs;
- launcher.launch1D( num);
- clFinish(m_queue);
- }
+ launcher.setConst(nPairs);
+ int debugMode = 0;
+ launcher.setConst(debugMode);
+ int num = nPairs;
+ launcher.launch1D(num);
+ clFinish(m_queue);
+ }
- {
- nContacts = m_totalContactsOut.at(0);
- //printf("nContacts = %d\n",nContacts);
+ {
+ nContacts = m_totalContactsOut.at(0);
+ //printf("nContacts = %d\n",nContacts);
- int newContactCapacity = nContacts+nPairs;
- contactOut->reserve(newContactCapacity);
+ int newContactCapacity = nContacts + nPairs;
+ contactOut->reserve(newContactCapacity);
- if (reduceConvexContactsOnGPU)
- {
+ if (reduceConvexContactsOnGPU)
{
- B3_PROFILE("newContactReductionKernel");
- b3BufferInfoCL bInfo[] =
{
- b3BufferInfoCL( pairs->getBufferCL(), true ),
- b3BufferInfoCL( bodyBuf->getBufferCL(),true),
- b3BufferInfoCL( m_sepNormals.getBufferCL()),
- b3BufferInfoCL( m_hasSeparatingNormals.getBufferCL()),
- b3BufferInfoCL( contactOut->getBufferCL()),
- b3BufferInfoCL( clippingFacesOutGPU.getBufferCL()),
- b3BufferInfoCL( worldVertsB2GPU.getBufferCL()),
- b3BufferInfoCL( m_totalContactsOut.getBufferCL())
- };
-
- b3LauncherCL launcher(m_queue, m_newContactReductionKernel,"m_newContactReductionKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst(vertexFaceCapacity);
- launcher.setConst(newContactCapacity);
- launcher.setConst( nPairs );
- int num = nPairs;
-
- launcher.launch1D( num);
+ B3_PROFILE("newContactReductionKernel");
+ b3BufferInfoCL bInfo[] =
+ {
+ b3BufferInfoCL(pairs->getBufferCL(), true),
+ b3BufferInfoCL(bodyBuf->getBufferCL(), true),
+ b3BufferInfoCL(m_sepNormals.getBufferCL()),
+ b3BufferInfoCL(m_hasSeparatingNormals.getBufferCL()),
+ b3BufferInfoCL(contactOut->getBufferCL()),
+ b3BufferInfoCL(clippingFacesOutGPU.getBufferCL()),
+ b3BufferInfoCL(worldVertsB2GPU.getBufferCL()),
+ b3BufferInfoCL(m_totalContactsOut.getBufferCL())};
+
+ b3LauncherCL launcher(m_queue, m_newContactReductionKernel, "m_newContactReductionKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(vertexFaceCapacity);
+ launcher.setConst(newContactCapacity);
+ launcher.setConst(nPairs);
+ int num = nPairs;
+
+ launcher.launch1D(num);
+ }
+ nContacts = m_totalContactsOut.at(0);
+ contactOut->resize(nContacts);
}
- nContacts = m_totalContactsOut.at(0);
- contactOut->resize(nContacts);
- } else
- {
-
- volatile int nGlobalContactsOut = nContacts;
- b3AlignedObjectArray<b3Int4> hostPairs;
- pairs->copyToHost(hostPairs);
- b3AlignedObjectArray<b3RigidBodyData> hostBodyBuf;
- bodyBuf->copyToHost(hostBodyBuf);
- b3AlignedObjectArray<b3Vector3> hostSepNormals;
- m_sepNormals.copyToHost(hostSepNormals);
- b3AlignedObjectArray<int> hostHasSepAxis;
- m_hasSeparatingNormals.copyToHost(hostHasSepAxis);
- b3AlignedObjectArray<b3Contact4> hostContactsOut;
- contactOut->copyToHost(hostContactsOut);
- hostContactsOut.resize(newContactCapacity);
-
- b3AlignedObjectArray<b3Int4> hostClippingFaces;
- clippingFacesOutGPU.copyToHost(hostClippingFaces);
- b3AlignedObjectArray<b3Vector3> worldVertsB2CPU;
- worldVertsB2GPU.copyToHost(worldVertsB2CPU);
-
- for (int i=0;i<nPairs;i++)
+ else
{
- b3NewContactReductionKernel(&hostPairs.at(0),
- &hostBodyBuf.at(0),
- &hostSepNormals.at(0),
- &hostHasSepAxis.at(0),
- &hostContactsOut.at(0),
- &hostClippingFaces.at(0),
- &worldVertsB2CPU.at(0),
- &nGlobalContactsOut,
- vertexFaceCapacity,
- newContactCapacity,
- nPairs,
- i);
+ volatile int nGlobalContactsOut = nContacts;
+ b3AlignedObjectArray<b3Int4> hostPairs;
+ pairs->copyToHost(hostPairs);
+ b3AlignedObjectArray<b3RigidBodyData> hostBodyBuf;
+ bodyBuf->copyToHost(hostBodyBuf);
+ b3AlignedObjectArray<b3Vector3> hostSepNormals;
+ m_sepNormals.copyToHost(hostSepNormals);
+ b3AlignedObjectArray<int> hostHasSepAxis;
+ m_hasSeparatingNormals.copyToHost(hostHasSepAxis);
+ b3AlignedObjectArray<b3Contact4> hostContactsOut;
+ contactOut->copyToHost(hostContactsOut);
+ hostContactsOut.resize(newContactCapacity);
+
+ b3AlignedObjectArray<b3Int4> hostClippingFaces;
+ clippingFacesOutGPU.copyToHost(hostClippingFaces);
+ b3AlignedObjectArray<b3Vector3> worldVertsB2CPU;
+ worldVertsB2GPU.copyToHost(worldVertsB2CPU);
+
+ for (int i = 0; i < nPairs; i++)
+ {
+ b3NewContactReductionKernel(&hostPairs.at(0),
+ &hostBodyBuf.at(0),
+ &hostSepNormals.at(0),
+ &hostHasSepAxis.at(0),
+ &hostContactsOut.at(0),
+ &hostClippingFaces.at(0),
+ &worldVertsB2CPU.at(0),
+ &nGlobalContactsOut,
+ vertexFaceCapacity,
+ newContactCapacity,
+ nPairs,
+ i);
+ }
+
+ nContacts = nGlobalContactsOut;
+ m_totalContactsOut.copyFromHostPointer(&nContacts, 1, 0, true);
+ hostContactsOut.resize(nContacts);
+ //printf("contactOut4 (after newContactReductionKernel) = %d\n",nContacts);
+ contactOut->copyFromHost(hostContactsOut);
}
+ // b3Contact4 pt = contactOut->at(0);
+ // printf("nContacts = %d\n",nContacts);
+ }
+ }
+ }
+ else //breakupKernel
+ {
+ if (nPairs)
+ {
+ b3BufferInfoCL bInfo[] = {
+ b3BufferInfoCL(pairs->getBufferCL(), true),
+ b3BufferInfoCL(bodyBuf->getBufferCL(), true),
+ b3BufferInfoCL(gpuCollidables.getBufferCL(), true),
+ b3BufferInfoCL(convexData.getBufferCL(), true),
+ b3BufferInfoCL(gpuVertices.getBufferCL(), true),
+ b3BufferInfoCL(gpuUniqueEdges.getBufferCL(), true),
+ b3BufferInfoCL(gpuFaces.getBufferCL(), true),
+ b3BufferInfoCL(gpuIndices.getBufferCL(), true),
+ b3BufferInfoCL(m_sepNormals.getBufferCL()),
+ b3BufferInfoCL(m_hasSeparatingNormals.getBufferCL()),
+ b3BufferInfoCL(contactOut->getBufferCL()),
+ b3BufferInfoCL(m_totalContactsOut.getBufferCL())};
+ b3LauncherCL launcher(m_queue, m_clipHullHullKernel, "m_clipHullHullKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(nPairs);
+ launcher.setConst(maxContactCapacity);
- nContacts = nGlobalContactsOut;
- m_totalContactsOut.copyFromHostPointer(&nContacts,1,0,true);
- hostContactsOut.resize(nContacts);
- //printf("contactOut4 (after newContactReductionKernel) = %d\n",nContacts);
- contactOut->copyFromHost(hostContactsOut);
+ int num = nPairs;
+ launcher.launch1D(num);
+ clFinish(m_queue);
+
+ nContacts = m_totalContactsOut.at(0);
+ if (nContacts >= maxContactCapacity)
+ {
+ b3Error("Exceeded contact capacity (%d/%d)\n", nContacts, maxContactCapacity);
+ nContacts = maxContactCapacity;
}
- // b3Contact4 pt = contactOut->at(0);
- // printf("nContacts = %d\n",nContacts);
+ contactOut->resize(nContacts);
}
}
- }
- else//breakupKernel
- {
- if (nPairs)
+ int nCompoundsPairs = m_gpuCompoundPairs.size();
+
+ if (nCompoundsPairs)
{
b3BufferInfoCL bInfo[] = {
- b3BufferInfoCL( pairs->getBufferCL(), true ),
- b3BufferInfoCL( bodyBuf->getBufferCL(),true),
- b3BufferInfoCL( gpuCollidables.getBufferCL(),true),
- b3BufferInfoCL( convexData.getBufferCL(),true),
- b3BufferInfoCL( gpuVertices.getBufferCL(),true),
- b3BufferInfoCL( gpuUniqueEdges.getBufferCL(),true),
- b3BufferInfoCL( gpuFaces.getBufferCL(),true),
- b3BufferInfoCL( gpuIndices.getBufferCL(),true),
- b3BufferInfoCL( m_sepNormals.getBufferCL()),
- b3BufferInfoCL( m_hasSeparatingNormals.getBufferCL()),
- b3BufferInfoCL( contactOut->getBufferCL()),
- b3BufferInfoCL( m_totalContactsOut.getBufferCL())
- };
- b3LauncherCL launcher(m_queue, m_clipHullHullKernel,"m_clipHullHullKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( nPairs );
+ b3BufferInfoCL(m_gpuCompoundPairs.getBufferCL(), true),
+ b3BufferInfoCL(bodyBuf->getBufferCL(), true),
+ b3BufferInfoCL(gpuCollidables.getBufferCL(), true),
+ b3BufferInfoCL(convexData.getBufferCL(), true),
+ b3BufferInfoCL(gpuVertices.getBufferCL(), true),
+ b3BufferInfoCL(gpuUniqueEdges.getBufferCL(), true),
+ b3BufferInfoCL(gpuFaces.getBufferCL(), true),
+ b3BufferInfoCL(gpuIndices.getBufferCL(), true),
+ b3BufferInfoCL(gpuChildShapes.getBufferCL(), true),
+ b3BufferInfoCL(m_gpuCompoundSepNormals.getBufferCL(), true),
+ b3BufferInfoCL(m_gpuHasCompoundSepNormals.getBufferCL(), true),
+ b3BufferInfoCL(contactOut->getBufferCL()),
+ b3BufferInfoCL(m_totalContactsOut.getBufferCL())};
+ b3LauncherCL launcher(m_queue, m_clipCompoundsHullHullKernel, "m_clipCompoundsHullHullKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(nCompoundsPairs);
launcher.setConst(maxContactCapacity);
- int num = nPairs;
- launcher.launch1D( num);
+ int num = nCompoundsPairs;
+ launcher.launch1D(num);
clFinish(m_queue);
nContacts = m_totalContactsOut.at(0);
- if (nContacts >= maxContactCapacity)
+ if (nContacts > maxContactCapacity)
{
- b3Error("Exceeded contact capacity (%d/%d)\n",nContacts,maxContactCapacity);
+ b3Error("Error: contacts exceeds capacity (%d/%d)\n", nContacts, maxContactCapacity);
nContacts = maxContactCapacity;
}
contactOut->resize(nContacts);
- }
- }
-
-
- int nCompoundsPairs = m_gpuCompoundPairs.size();
-
- if (nCompoundsPairs)
- {
- b3BufferInfoCL bInfo[] = {
- b3BufferInfoCL( m_gpuCompoundPairs.getBufferCL(), true ),
- b3BufferInfoCL( bodyBuf->getBufferCL(),true),
- b3BufferInfoCL( gpuCollidables.getBufferCL(),true),
- b3BufferInfoCL( convexData.getBufferCL(),true),
- b3BufferInfoCL( gpuVertices.getBufferCL(),true),
- b3BufferInfoCL( gpuUniqueEdges.getBufferCL(),true),
- b3BufferInfoCL( gpuFaces.getBufferCL(),true),
- b3BufferInfoCL( gpuIndices.getBufferCL(),true),
- b3BufferInfoCL( gpuChildShapes.getBufferCL(),true),
- b3BufferInfoCL( m_gpuCompoundSepNormals.getBufferCL(),true),
- b3BufferInfoCL( m_gpuHasCompoundSepNormals.getBufferCL(),true),
- b3BufferInfoCL( contactOut->getBufferCL()),
- b3BufferInfoCL( m_totalContactsOut.getBufferCL())
- };
- b3LauncherCL launcher(m_queue, m_clipCompoundsHullHullKernel,"m_clipCompoundsHullHullKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( nCompoundsPairs );
- launcher.setConst(maxContactCapacity);
-
- int num = nCompoundsPairs;
- launcher.launch1D( num);
- clFinish(m_queue);
-
- nContacts = m_totalContactsOut.at(0);
- if (nContacts>maxContactCapacity)
- {
-
- b3Error("Error: contacts exceeds capacity (%d/%d)\n", nContacts, maxContactCapacity);
- nContacts = maxContactCapacity;
- }
- contactOut->resize(nContacts);
- }//if nCompoundsPairs
+ } //if nCompoundsPairs
}
- }//contactClippingOnGpu
+ } //contactClippingOnGpu
//printf("nContacts end = %d\n",nContacts);
-
+
//printf("frameCount = %d\n",frameCount++);
}
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ConvexHullContact.h b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ConvexHullContact.h
index e24c1579c6..53e8c4ed4d 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ConvexHullContact.h
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ConvexHullContact.h
@@ -17,102 +17,90 @@
//#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_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;
-
+
+ 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<b3Vector3> m_unitSphereDirections;
- b3OpenCLArray<int> m_totalContactsOut;
+ b3OpenCLArray<int> m_totalContactsOut;
b3OpenCLArray<b3Vector3> m_sepNormals;
b3OpenCLArray<float> m_dmins;
- b3OpenCLArray<int> m_hasSeparatingNormals;
+ b3OpenCLArray<int> m_hasSeparatingNormals;
b3OpenCLArray<b3Vector3> m_concaveSepNormals;
- b3OpenCLArray<int> m_concaveHasSeparatingNormals;
- b3OpenCLArray<int> m_numConcavePairsOut;
+ b3OpenCLArray<int> m_concaveHasSeparatingNormals;
+ b3OpenCLArray<int> m_numConcavePairsOut;
b3OpenCLArray<b3CompoundOverlappingPair> m_gpuCompoundPairs;
b3OpenCLArray<b3Vector3> m_gpuCompoundSepNormals;
- b3OpenCLArray<int> m_gpuHasCompoundSepNormals;
- b3OpenCLArray<int> m_numCompoundPairsOut;
-
+ b3OpenCLArray<int> m_gpuHasCompoundSepNormals;
+ b3OpenCLArray<int> m_numCompoundPairsOut;
- GpuSatCollision(cl_context ctx,cl_device_id device, cl_command_queue q );
+ GpuSatCollision(cl_context ctx, cl_device_id device, cl_command_queue q);
virtual ~GpuSatCollision();
-
-
- void computeConvexConvexContactsGPUSAT( b3OpenCLArray<b3Int4>* pairs, int nPairs,
- const b3OpenCLArray<b3RigidBodyData>* bodyBuf,
- b3OpenCLArray<b3Contact4>* contactOut, int& nContacts,
- const b3OpenCLArray<b3Contact4>* oldContacts,
- int maxContactCapacity,
- int compoundPairCapacity,
- const b3OpenCLArray<b3ConvexPolyhedronData>& hostConvexData,
- const b3OpenCLArray<b3Vector3>& vertices,
- const b3OpenCLArray<b3Vector3>& uniqueEdges,
- const b3OpenCLArray<b3GpuFace>& faces,
- const b3OpenCLArray<int>& indices,
- const b3OpenCLArray<b3Collidable>& gpuCollidables,
- const b3OpenCLArray<b3GpuChildShape>& gpuChildShapes,
-
- const b3OpenCLArray<b3Aabb>& clAabbsWorldSpace,
- const b3OpenCLArray<b3Aabb>& clAabbsLocalSpace,
-
- b3OpenCLArray<b3Vector3>& worldVertsB1GPU,
- b3OpenCLArray<b3Int4>& clippingFacesOutGPU,
- b3OpenCLArray<b3Vector3>& worldNormalsAGPU,
- b3OpenCLArray<b3Vector3>& worldVertsA1GPU,
- b3OpenCLArray<b3Vector3>& worldVertsB2GPU,
- b3AlignedObjectArray<class b3OptimizedBvh*>& bvhData,
- b3OpenCLArray<b3QuantizedBvhNode>* treeNodesGPU,
- b3OpenCLArray<b3BvhSubtreeInfo>* subTreesGPU,
- b3OpenCLArray<b3BvhInfo>* bvhInfo,
- int numObjects,
- int maxTriConvexPairCapacity,
- b3OpenCLArray<b3Int4>& triangleConvexPairs,
- int& numTriConvexPairsOut
- );
-
+ void computeConvexConvexContactsGPUSAT(b3OpenCLArray<b3Int4>* pairs, int nPairs,
+ const b3OpenCLArray<b3RigidBodyData>* bodyBuf,
+ b3OpenCLArray<b3Contact4>* contactOut, int& nContacts,
+ const b3OpenCLArray<b3Contact4>* oldContacts,
+ int maxContactCapacity,
+ int compoundPairCapacity,
+ const b3OpenCLArray<b3ConvexPolyhedronData>& hostConvexData,
+ const b3OpenCLArray<b3Vector3>& vertices,
+ const b3OpenCLArray<b3Vector3>& uniqueEdges,
+ const b3OpenCLArray<b3GpuFace>& faces,
+ const b3OpenCLArray<int>& indices,
+ const b3OpenCLArray<b3Collidable>& gpuCollidables,
+ const b3OpenCLArray<b3GpuChildShape>& gpuChildShapes,
+
+ const b3OpenCLArray<b3Aabb>& clAabbsWorldSpace,
+ const b3OpenCLArray<b3Aabb>& clAabbsLocalSpace,
+
+ b3OpenCLArray<b3Vector3>& worldVertsB1GPU,
+ b3OpenCLArray<b3Int4>& clippingFacesOutGPU,
+ b3OpenCLArray<b3Vector3>& worldNormalsAGPU,
+ b3OpenCLArray<b3Vector3>& worldVertsA1GPU,
+ b3OpenCLArray<b3Vector3>& worldVertsB2GPU,
+ b3AlignedObjectArray<class b3OptimizedBvh*>& bvhData,
+ b3OpenCLArray<b3QuantizedBvhNode>* treeNodesGPU,
+ b3OpenCLArray<b3BvhSubtreeInfo>* subTreesGPU,
+ b3OpenCLArray<b3BvhInfo>* bvhInfo,
+ int numObjects,
+ int maxTriConvexPairCapacity,
+ b3OpenCLArray<b3Int4>& triangleConvexPairs,
+ int& numTriConvexPairsOut);
};
-#endif //_CONVEX_HULL_CONTACT_H
+#endif //_CONVEX_HULL_CONTACT_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ConvexPolyhedronCL.h b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ConvexPolyhedronCL.h
index 337100fb1a..c4cf700076 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ConvexPolyhedronCL.h
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3ConvexPolyhedronCL.h
@@ -4,6 +4,4 @@
#include "Bullet3Common/b3Transform.h"
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3ConvexPolyhedronData.h"
-
-
-#endif //CONVEX_POLYHEDRON_CL
+#endif //CONVEX_POLYHEDRON_CL
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3GjkEpa.cpp b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3GjkEpa.cpp
index d636f983c6..974b246f03 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3GjkEpa.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3GjkEpa.cpp
@@ -29,902 +29,951 @@ GJK-EPA collision solver by Nathanael Presson, 2008
namespace gjkepa2_impl2
{
+// Config
- // Config
+/* GJK */
+#define GJK_MAX_ITERATIONS 128
+#define GJK_ACCURACY ((b3Scalar)0.0001)
+#define GJK_MIN_DISTANCE ((b3Scalar)0.0001)
+#define GJK_DUPLICATED_EPS ((b3Scalar)0.0001)
+#define GJK_SIMPLEX2_EPS ((b3Scalar)0.0)
+#define GJK_SIMPLEX3_EPS ((b3Scalar)0.0)
+#define GJK_SIMPLEX4_EPS ((b3Scalar)0.0)
- /* GJK */
-#define GJK_MAX_ITERATIONS 128
-#define GJK_ACCURACY ((b3Scalar)0.0001)
-#define GJK_MIN_DISTANCE ((b3Scalar)0.0001)
-#define GJK_DUPLICATED_EPS ((b3Scalar)0.0001)
-#define GJK_SIMPLEX2_EPS ((b3Scalar)0.0)
-#define GJK_SIMPLEX3_EPS ((b3Scalar)0.0)
-#define GJK_SIMPLEX4_EPS ((b3Scalar)0.0)
+/* EPA */
+#define EPA_MAX_VERTICES 64
+#define EPA_MAX_FACES (EPA_MAX_VERTICES * 2)
+#define EPA_MAX_ITERATIONS 255
+#define EPA_ACCURACY ((b3Scalar)0.0001)
+#define EPA_FALLBACK (10 * EPA_ACCURACY)
+#define EPA_PLANE_EPS ((b3Scalar)0.00001)
+#define EPA_INSIDE_EPS ((b3Scalar)0.01)
- /* EPA */
-#define EPA_MAX_VERTICES 64
-#define EPA_MAX_FACES (EPA_MAX_VERTICES*2)
-#define EPA_MAX_ITERATIONS 255
-#define EPA_ACCURACY ((b3Scalar)0.0001)
-#define EPA_FALLBACK (10*EPA_ACCURACY)
-#define EPA_PLANE_EPS ((b3Scalar)0.00001)
-#define EPA_INSIDE_EPS ((b3Scalar)0.01)
+// Shorthands
+// MinkowskiDiff
+struct b3MinkowskiDiff
+{
+ const b3ConvexPolyhedronData* m_shapes[2];
- // Shorthands
-
-
- // MinkowskiDiff
- struct b3MinkowskiDiff
- {
-
-
- const b3ConvexPolyhedronData* m_shapes[2];
-
-
- b3Matrix3x3 m_toshape1;
- b3Transform m_toshape0;
+ b3Matrix3x3 m_toshape1;
+ b3Transform m_toshape0;
- bool m_enableMargin;
-
+ bool m_enableMargin;
- void EnableMargin(bool enable)
- {
- m_enableMargin = enable;
- }
- inline b3Vector3 Support0(const b3Vector3& d, const b3AlignedObjectArray<b3Vector3>& verticesA) const
+ void EnableMargin(bool enable)
+ {
+ m_enableMargin = enable;
+ }
+ inline b3Vector3 Support0(const b3Vector3& d, const b3AlignedObjectArray<b3Vector3>& verticesA) const
+ {
+ if (m_enableMargin)
{
- if (m_enableMargin)
- {
- return localGetSupportVertexWithMargin(d,m_shapes[0],verticesA,0.f);
- } else
- {
- return localGetSupportVertexWithoutMargin(d,m_shapes[0],verticesA);
- }
+ return localGetSupportVertexWithMargin(d, m_shapes[0], verticesA, 0.f);
}
- inline b3Vector3 Support1(const b3Vector3& d, const b3AlignedObjectArray<b3Vector3>& verticesB) const
+ else
{
- if (m_enableMargin)
- {
- return m_toshape0*(localGetSupportVertexWithMargin(m_toshape1*d,m_shapes[1],verticesB,0.f));
- } else
- {
- return m_toshape0*(localGetSupportVertexWithoutMargin(m_toshape1*d,m_shapes[1],verticesB));
- }
+ return localGetSupportVertexWithoutMargin(d, m_shapes[0], verticesA);
}
-
- inline b3Vector3 Support(const b3Vector3& d, const b3AlignedObjectArray<b3Vector3>& verticesA, const b3AlignedObjectArray<b3Vector3>& verticesB) const
+ }
+ inline b3Vector3 Support1(const b3Vector3& d, const b3AlignedObjectArray<b3Vector3>& verticesB) const
+ {
+ if (m_enableMargin)
{
- return(Support0(d,verticesA)-Support1(-d,verticesB));
+ return m_toshape0 * (localGetSupportVertexWithMargin(m_toshape1 * d, m_shapes[1], verticesB, 0.f));
}
- b3Vector3 Support(const b3Vector3& d,unsigned int index,const b3AlignedObjectArray<b3Vector3>& verticesA, const b3AlignedObjectArray<b3Vector3>& verticesB) const
+ else
{
- if(index)
- return(Support1(d,verticesA));
- else
- return(Support0(d,verticesB));
+ return m_toshape0 * (localGetSupportVertexWithoutMargin(m_toshape1 * d, m_shapes[1], verticesB));
}
- };
+ }
- typedef b3MinkowskiDiff tShape;
+ inline b3Vector3 Support(const b3Vector3& d, const b3AlignedObjectArray<b3Vector3>& verticesA, const b3AlignedObjectArray<b3Vector3>& verticesB) const
+ {
+ return (Support0(d, verticesA) - Support1(-d, verticesB));
+ }
+ b3Vector3 Support(const b3Vector3& d, unsigned int index, const b3AlignedObjectArray<b3Vector3>& verticesA, const b3AlignedObjectArray<b3Vector3>& verticesB) const
+ {
+ if (index)
+ return (Support1(d, verticesA));
+ else
+ return (Support0(d, verticesB));
+ }
+};
+typedef b3MinkowskiDiff tShape;
- // GJK
- struct b3GJK
+// GJK
+struct b3GJK
+{
+ /* Types */
+ struct sSV
{
- /* Types */
- struct sSV
- {
- b3Vector3 d,w;
- };
- struct sSimplex
+ b3Vector3 d, w;
+ };
+ struct sSimplex
+ {
+ sSV* c[4];
+ b3Scalar p[4];
+ unsigned int rank;
+ };
+ struct eStatus
+ {
+ enum _
{
- sSV* c[4];
- b3Scalar p[4];
- unsigned int rank;
- };
- struct eStatus { enum _ {
Valid,
Inside,
- Failed };};
- /* Fields */
- tShape m_shape;
- const b3AlignedObjectArray<b3Vector3>& m_verticesA;
- const b3AlignedObjectArray<b3Vector3>& m_verticesB;
- b3Vector3 m_ray;
- b3Scalar m_distance;
- sSimplex m_simplices[2];
- sSV m_store[4];
- sSV* m_free[4];
- unsigned int m_nfree;
- unsigned int m_current;
- sSimplex* m_simplex;
- eStatus::_ m_status;
- /* Methods */
- b3GJK(const b3AlignedObjectArray<b3Vector3>& verticesA,const b3AlignedObjectArray<b3Vector3>& verticesB)
- :m_verticesA(verticesA),m_verticesB(verticesB)
- {
- Initialize();
+ Failed
+ };
+ };
+ /* Fields */
+ tShape m_shape;
+ const b3AlignedObjectArray<b3Vector3>& m_verticesA;
+ const b3AlignedObjectArray<b3Vector3>& m_verticesB;
+ b3Vector3 m_ray;
+ b3Scalar m_distance;
+ sSimplex m_simplices[2];
+ sSV m_store[4];
+ sSV* m_free[4];
+ unsigned int m_nfree;
+ unsigned int m_current;
+ sSimplex* m_simplex;
+ eStatus::_ m_status;
+ /* Methods */
+ b3GJK(const b3AlignedObjectArray<b3Vector3>& verticesA, const b3AlignedObjectArray<b3Vector3>& verticesB)
+ : m_verticesA(verticesA), m_verticesB(verticesB)
+ {
+ Initialize();
+ }
+ void Initialize()
+ {
+ m_ray = b3MakeVector3(0, 0, 0);
+ m_nfree = 0;
+ m_status = eStatus::Failed;
+ m_current = 0;
+ m_distance = 0;
+ }
+ eStatus::_ Evaluate(const tShape& shapearg, const b3Vector3& guess)
+ {
+ unsigned int iterations = 0;
+ b3Scalar sqdist = 0;
+ b3Scalar alpha = 0;
+ b3Vector3 lastw[4];
+ unsigned int 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 = eStatus::Valid;
+ m_shape = shapearg;
+ m_distance = 0;
+ /* Initialize simplex */
+ m_simplices[0].rank = 0;
+ m_ray = guess;
+ const b3Scalar sqrl = m_ray.length2();
+ appendvertice(m_simplices[0], sqrl > 0 ? -m_ray : b3MakeVector3(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 unsigned int next = 1 - m_current;
+ sSimplex& cs = m_simplices[m_current];
+ sSimplex& ns = m_simplices[next];
+ /* Check zero */
+ const b3Scalar rl = m_ray.length();
+ if (rl < GJK_MIN_DISTANCE)
+ { /* Touching or inside */
+ m_status = eStatus::Inside;
+ break;
}
- void Initialize()
+ /* Append new vertice in -'v' direction */
+ appendvertice(cs, -m_ray);
+ const b3Vector3& w = cs.c[cs.rank - 1]->w;
+ bool found = false;
+ for (unsigned int i = 0; i < 4; ++i)
{
- m_ray = b3MakeVector3(0,0,0);
- m_nfree = 0;
- m_status = eStatus::Failed;
- m_current = 0;
- m_distance = 0;
+ if ((w - lastw[i]).length2() < GJK_DUPLICATED_EPS)
+ {
+ found = true;
+ break;
+ }
+ }
+ if (found)
+ { /* Return old simplex */
+ removevertice(m_simplices[m_current]);
+ break;
}
- eStatus::_ Evaluate(const tShape& shapearg,const b3Vector3& guess)
+ else
+ { /* Update lastw */
+ lastw[clastw = (clastw + 1) & 3] = w;
+ }
+ /* Check for termination */
+ const b3Scalar omega = b3Dot(m_ray, w) / rl;
+ alpha = b3Max(omega, alpha);
+ if (((rl - alpha) - (GJK_ACCURACY * rl)) <= 0)
+ { /* Return old simplex */
+ removevertice(m_simplices[m_current]);
+ break;
+ }
+ /* Reduce simplex */
+ b3Scalar weights[4];
+ unsigned int mask = 0;
+ switch (cs.rank)
{
- unsigned int iterations=0;
- b3Scalar sqdist=0;
- b3Scalar alpha=0;
- b3Vector3 lastw[4];
- unsigned int 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 = eStatus::Valid;
- m_shape = shapearg;
- m_distance = 0;
- /* Initialize simplex */
- m_simplices[0].rank = 0;
- m_ray = guess;
- const b3Scalar sqrl= m_ray.length2();
- appendvertice(m_simplices[0],sqrl>0?-m_ray:b3MakeVector3(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 unsigned int next=1-m_current;
- sSimplex& cs=m_simplices[m_current];
- sSimplex& ns=m_simplices[next];
- /* Check zero */
- const b3Scalar rl=m_ray.length();
- if(rl<GJK_MIN_DISTANCE)
- {/* Touching or inside */
- m_status=eStatus::Inside;
- break;
- }
- /* Append new vertice in -'v' direction */
- appendvertice(cs,-m_ray);
- const b3Vector3& w=cs.c[cs.rank-1]->w;
- bool found=false;
- for(unsigned int i=0;i<4;++i)
+ 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 = b3MakeVector3(0, 0, 0);
+ m_current = next;
+ for (unsigned int i = 0, ni = cs.rank; i < ni; ++i)
+ {
+ if (mask & (1 << i))
{
- if((w-lastw[i]).length2()<GJK_DUPLICATED_EPS)
- { found=true;break; }
- }
- if(found)
- {/* Return old simplex */
- removevertice(m_simplices[m_current]);
- break;
+ ns.c[ns.rank] = cs.c[i];
+ ns.p[ns.rank++] = weights[i];
+ m_ray += cs.c[i]->w * weights[i];
}
else
- {/* Update lastw */
- lastw[clastw=(clastw+1)&3]=w;
- }
- /* Check for termination */
- const b3Scalar omega=b3Dot(m_ray,w)/rl;
- alpha=b3Max(omega,alpha);
- if(((rl-alpha)-(GJK_ACCURACY*rl))<=0)
- {/* Return old simplex */
- removevertice(m_simplices[m_current]);
- break;
- }
- /* Reduce simplex */
- b3Scalar weights[4];
- unsigned int 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 = b3MakeVector3(0,0,0);
- m_current = next;
- for(unsigned int 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=eStatus::Inside;
+ m_free[m_nfree++] = cs.c[i];
}
- else
- {/* Return old simplex */
- removevertice(m_simplices[m_current]);
- break;
- }
- m_status=((++iterations)<GJK_MAX_ITERATIONS)?m_status:eStatus::Failed;
- } while(m_status==eStatus::Valid);
- m_simplex=&m_simplices[m_current];
- switch(m_status)
+ }
+ if (mask == 15) m_status = eStatus::Inside;
+ }
+ else
+ { /* Return old simplex */
+ removevertice(m_simplices[m_current]);
+ break;
+ }
+ m_status = ((++iterations) < GJK_MAX_ITERATIONS) ? m_status : eStatus::Failed;
+ } while (m_status == eStatus::Valid);
+ m_simplex = &m_simplices[m_current];
+ switch (m_status)
+ {
+ case eStatus::Valid:
+ m_distance = m_ray.length();
+ break;
+ case eStatus::Inside:
+ m_distance = 0;
+ break;
+ default:
+ {
+ }
+ }
+ return (m_status);
+ }
+ bool EncloseOrigin()
+ {
+ switch (m_simplex->rank)
+ {
+ case 1:
+ {
+ for (unsigned int i = 0; i < 3; ++i)
{
- case eStatus::Valid: m_distance=m_ray.length();break;
- case eStatus::Inside: m_distance=0;break;
- default:
- {
- }
- }
- return(m_status);
+ b3Vector3 axis = b3MakeVector3(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);
+ }
}
- bool EncloseOrigin()
+ break;
+ case 2:
{
- switch(m_simplex->rank)
+ const b3Vector3 d = m_simplex->c[1]->w - m_simplex->c[0]->w;
+ for (unsigned int i = 0; i < 3; ++i)
{
- case 1:
+ b3Vector3 axis = b3MakeVector3(0, 0, 0);
+ axis[i] = 1;
+ const b3Vector3 p = b3Cross(d, axis);
+ if (p.length2() > 0)
{
- for(unsigned int i=0;i<3;++i)
- {
- b3Vector3 axis=b3MakeVector3(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);
- }
+ appendvertice(*m_simplex, p);
+ if (EncloseOrigin()) return (true);
+ removevertice(*m_simplex);
+ appendvertice(*m_simplex, -p);
+ if (EncloseOrigin()) return (true);
+ removevertice(*m_simplex);
}
- break;
- case 2:
- {
- const b3Vector3 d=m_simplex->c[1]->w-m_simplex->c[0]->w;
- for(unsigned int i=0;i<3;++i)
- {
- b3Vector3 axis=b3MakeVector3(0,0,0);
- axis[i]=1;
- const b3Vector3 p=b3Cross(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 b3Vector3 n=b3Cross(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(b3Fabs(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 b3Vector3& d,sSV& sv) const
+ break;
+ case 3:
{
- sv.d = d/d.length();
- sv.w = m_shape.Support(sv.d,m_verticesA,m_verticesB);
+ const b3Vector3 n = b3Cross(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);
+ }
}
- void removevertice(sSimplex& simplex)
+ break;
+ case 4:
{
- m_free[m_nfree++]=simplex.c[--simplex.rank];
+ if (b3Fabs(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);
}
- void appendvertice(sSimplex& simplex,const b3Vector3& v)
+ break;
+ }
+ return (false);
+ }
+ /* Internals */
+ void getsupport(const b3Vector3& d, sSV& sv) const
+ {
+ sv.d = d / d.length();
+ sv.w = m_shape.Support(sv.d, m_verticesA, m_verticesB);
+ }
+ void removevertice(sSimplex& simplex)
+ {
+ m_free[m_nfree++] = simplex.c[--simplex.rank];
+ }
+ void appendvertice(sSimplex& simplex, const b3Vector3& v)
+ {
+ simplex.p[simplex.rank] = 0;
+ simplex.c[simplex.rank] = m_free[--m_nfree];
+ getsupport(v, *simplex.c[simplex.rank++]);
+ }
+ static b3Scalar det(const b3Vector3& a, const b3Vector3& b, const b3Vector3& 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 b3Scalar projectorigin(const b3Vector3& a,
+ const b3Vector3& b,
+ b3Scalar* w, unsigned int& m)
+ {
+ const b3Vector3 d = b - a;
+ const b3Scalar l = d.length2();
+ if (l > GJK_SIMPLEX2_EPS)
+ {
+ const b3Scalar t(l > 0 ? -b3Dot(a, d) / l : 0);
+ if (t >= 1)
{
- simplex.p[simplex.rank]=0;
- simplex.c[simplex.rank]=m_free[--m_nfree];
- getsupport(v,*simplex.c[simplex.rank++]);
+ w[0] = 0;
+ w[1] = 1;
+ m = 2;
+ return (b.length2());
}
- static b3Scalar det(const b3Vector3& a,const b3Vector3& b,const b3Vector3& c)
+ else if (t <= 0)
{
- 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);
+ w[0] = 1;
+ w[1] = 0;
+ m = 1;
+ return (a.length2());
}
- static b3Scalar projectorigin( const b3Vector3& a,
- const b3Vector3& b,
- b3Scalar* w,unsigned int& m)
+ else
{
- const b3Vector3 d=b-a;
- const b3Scalar l=d.length2();
- if(l>GJK_SIMPLEX2_EPS)
- {
- const b3Scalar t(l>0?-b3Dot(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);
+ w[0] = 1 - (w[1] = t);
+ m = 3;
+ return ((a + d * t).length2());
}
- static b3Scalar projectorigin( const b3Vector3& a,
- const b3Vector3& b,
- const b3Vector3& c,
- b3Scalar* w,unsigned int& m)
+ }
+ return (-1);
+ }
+ static b3Scalar projectorigin(const b3Vector3& a,
+ const b3Vector3& b,
+ const b3Vector3& c,
+ b3Scalar* w, unsigned int& m)
+ {
+ static const unsigned int imd3[] = {1, 2, 0};
+ const b3Vector3* vt[] = {&a, &b, &c};
+ const b3Vector3 dl[] = {a - b, b - c, c - a};
+ const b3Vector3 n = b3Cross(dl[0], dl[1]);
+ const b3Scalar l = n.length2();
+ if (l > GJK_SIMPLEX3_EPS)
+ {
+ b3Scalar mindist = -1;
+ b3Scalar subw[2] = {0.f, 0.f};
+ unsigned int subm(0);
+ for (unsigned int i = 0; i < 3; ++i)
{
- static const unsigned int imd3[]={1,2,0};
- const b3Vector3* vt[]={&a,&b,&c};
- const b3Vector3 dl[]={a-b,b-c,c-a};
- const b3Vector3 n=b3Cross(dl[0],dl[1]);
- const b3Scalar l=n.length2();
- if(l>GJK_SIMPLEX3_EPS)
+ if (b3Dot(*vt[i], b3Cross(dl[i], n)) > 0)
{
- b3Scalar mindist=-1;
- b3Scalar subw[2]={0.f,0.f};
- unsigned int subm(0);
- for(unsigned int i=0;i<3;++i)
- {
- if(b3Dot(*vt[i],b3Cross(dl[i],n))>0)
- {
- const unsigned int j=imd3[i];
- const b3Scalar subd(projectorigin(*vt[i],*vt[j],subw,subm));
- if((mindist<0)||(subd<mindist))
- {
- mindist = subd;
- m = static_cast<unsigned int>(((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 unsigned int j = imd3[i];
+ const b3Scalar subd(projectorigin(*vt[i], *vt[j], subw, subm));
+ if ((mindist < 0) || (subd < mindist))
{
- const b3Scalar d=b3Dot(a,n);
- const b3Scalar s=b3Sqrt(l);
- const b3Vector3 p=n*(d/l);
- mindist = p.length2();
- m = 7;
- w[0] = (b3Cross(dl[1],b-p)).length()/s;
- w[1] = (b3Cross(dl[2],c-p)).length()/s;
- w[2] = 1-(w[0]+w[1]);
+ mindist = subd;
+ m = static_cast<unsigned int>(((subm & 1) ? 1 << i : 0) + ((subm & 2) ? 1 << j : 0));
+ w[i] = subw[0];
+ w[j] = subw[1];
+ w[imd3[j]] = 0;
}
- return(mindist);
}
- return(-1);
}
- static b3Scalar projectorigin( const b3Vector3& a,
- const b3Vector3& b,
- const b3Vector3& c,
- const b3Vector3& d,
- b3Scalar* w,unsigned int& m)
+ if (mindist < 0)
+ {
+ const b3Scalar d = b3Dot(a, n);
+ const b3Scalar s = b3Sqrt(l);
+ const b3Vector3 p = n * (d / l);
+ mindist = p.length2();
+ m = 7;
+ w[0] = (b3Cross(dl[1], b - p)).length() / s;
+ w[1] = (b3Cross(dl[2], c - p)).length() / s;
+ w[2] = 1 - (w[0] + w[1]);
+ }
+ return (mindist);
+ }
+ return (-1);
+ }
+ static b3Scalar projectorigin(const b3Vector3& a,
+ const b3Vector3& b,
+ const b3Vector3& c,
+ const b3Vector3& d,
+ b3Scalar* w, unsigned int& m)
+ {
+ static const unsigned int imd3[] = {1, 2, 0};
+ const b3Vector3* vt[] = {&a, &b, &c, &d};
+ const b3Vector3 dl[] = {a - d, b - d, c - d};
+ const b3Scalar vl = det(dl[0], dl[1], dl[2]);
+ const bool ng = (vl * b3Dot(a, b3Cross(b - c, a - b))) <= 0;
+ if (ng && (b3Fabs(vl) > GJK_SIMPLEX4_EPS))
+ {
+ b3Scalar mindist = -1;
+ b3Scalar subw[3] = {0.f, 0.f, 0.f};
+ unsigned int subm(0);
+ for (unsigned int i = 0; i < 3; ++i)
{
- static const unsigned int imd3[]={1,2,0};
- const b3Vector3* vt[]={&a,&b,&c,&d};
- const b3Vector3 dl[]={a-d,b-d,c-d};
- const b3Scalar vl=det(dl[0],dl[1],dl[2]);
- const bool ng=(vl*b3Dot(a,b3Cross(b-c,a-b)))<=0;
- if(ng&&(b3Fabs(vl)>GJK_SIMPLEX4_EPS))
+ const unsigned int j = imd3[i];
+ const b3Scalar s = vl * b3Dot(d, b3Cross(dl[i], dl[j]));
+ if (s > 0)
{
- b3Scalar mindist=-1;
- b3Scalar subw[3]={0.f,0.f,0.f};
- unsigned int subm(0);
- for(unsigned int i=0;i<3;++i)
+ const b3Scalar subd = projectorigin(*vt[i], *vt[j], d, subw, subm);
+ if ((mindist < 0) || (subd < mindist))
{
- const unsigned int j=imd3[i];
- const b3Scalar s=vl*b3Dot(d,b3Cross(dl[i],dl[j]));
- if(s>0)
- {
- const b3Scalar subd=projectorigin(*vt[i],*vt[j],d,subw,subm);
- if((mindist<0)||(subd<mindist))
- {
- mindist = subd;
- m = static_cast<unsigned int>((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];
- }
- }
+ mindist = subd;
+ m = static_cast<unsigned int>((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);
}
- };
+ 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);
+ }
+};
- // EPA
- struct b3EPA
+// EPA
+struct b3EPA
+{
+ /* Types */
+ typedef b3GJK::sSV sSV;
+ struct sFace
{
- /* Types */
- typedef b3GJK::sSV sSV;
- struct sFace
- {
- b3Vector3 n;
- b3Scalar d;
- sSV* c[3];
- sFace* f[3];
- sFace* l[2];
- unsigned char e[3];
- unsigned char pass;
- };
- struct sList
- {
- sFace* root;
- unsigned int count;
- sList() : root(0),count(0) {}
- };
- struct sHorizon
+ b3Vector3 n;
+ b3Scalar d;
+ sSV* c[3];
+ sFace* f[3];
+ sFace* l[2];
+ unsigned char e[3];
+ unsigned char pass;
+ };
+ struct sList
+ {
+ sFace* root;
+ unsigned int count;
+ sList() : root(0), count(0) {}
+ };
+ struct sHorizon
+ {
+ sFace* cf;
+ sFace* ff;
+ unsigned int nf;
+ sHorizon() : cf(0), ff(0), nf(0) {}
+ };
+ struct eStatus
+ {
+ enum _
{
- sFace* cf;
- sFace* ff;
- unsigned int nf;
- sHorizon() : cf(0),ff(0),nf(0) {}
- };
- struct eStatus { enum _ {
Valid,
Touching,
Degenerated,
NonConvex,
- InvalidHull,
+ InvalidHull,
OutOfFaces,
OutOfVertices,
AccuraryReached,
FallBack,
- Failed };};
- /* Fields */
- eStatus::_ m_status;
- b3GJK::sSimplex m_result;
- b3Vector3 m_normal;
- b3Scalar m_depth;
- sSV m_sv_store[EPA_MAX_VERTICES];
- sFace m_fc_store[EPA_MAX_FACES];
- unsigned int m_nextsv;
- sList m_hull;
- sList m_stock;
- /* Methods */
- b3EPA()
- {
- Initialize();
- }
+ Failed
+ };
+ };
+ /* Fields */
+ eStatus::_ m_status;
+ b3GJK::sSimplex m_result;
+ b3Vector3 m_normal;
+ b3Scalar m_depth;
+ sSV m_sv_store[EPA_MAX_VERTICES];
+ sFace m_fc_store[EPA_MAX_FACES];
+ unsigned int m_nextsv;
+ sList m_hull;
+ sList m_stock;
+ /* Methods */
+ b3EPA()
+ {
+ Initialize();
+ }
+ static inline void bind(sFace* fa, unsigned int ea, sFace* fb, unsigned int eb)
+ {
+ fa->e[ea] = (unsigned char)eb;
+ fa->f[ea] = fb;
+ fb->e[eb] = (unsigned char)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;
+ }
- static inline void bind(sFace* fa,unsigned int ea,sFace* fb,unsigned int eb)
- {
- fa->e[ea]=(unsigned char)eb;fa->f[ea]=fb;
- fb->e[eb]=(unsigned char)ea;fb->f[eb]=fa;
- }
- static inline void append(sList& list,sFace* face)
+ void Initialize()
+ {
+ m_status = eStatus::Failed;
+ m_normal = b3MakeVector3(0, 0, 0);
+ m_depth = 0;
+ m_nextsv = 0;
+ for (unsigned int i = 0; i < EPA_MAX_FACES; ++i)
+ {
+ append(m_stock, &m_fc_store[EPA_MAX_FACES - i - 1]);
+ }
+ }
+ eStatus::_ Evaluate(b3GJK& gjk, const b3Vector3& guess)
+ {
+ b3GJK::sSimplex& simplex = *gjk.m_simplex;
+ if ((simplex.rank > 1) && gjk.EncloseOrigin())
+ {
+ /* Clean up */
+ while (m_hull.root)
{
- face->l[0] = 0;
- face->l[1] = list.root;
- if(list.root) list.root->l[0]=face;
- list.root = face;
- ++list.count;
+ sFace* f = m_hull.root;
+ remove(m_hull, f);
+ append(m_stock, f);
}
- static inline void remove(sList& list,sFace* face)
+ m_status = eStatus::Valid;
+ 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)
{
- 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;
+ b3Swap(simplex.c[0], simplex.c[1]);
+ b3Swap(simplex.p[0], simplex.p[1]);
}
-
-
- void Initialize()
+ /* 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)
{
- m_status = eStatus::Failed;
- m_normal = b3MakeVector3(0,0,0);
- m_depth = 0;
- m_nextsv = 0;
- for(unsigned int i=0;i<EPA_MAX_FACES;++i)
+ sFace* best = findbest();
+ sFace outer = *best;
+ unsigned int pass = 0;
+ unsigned int 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 = eStatus::Valid;
+ for (; iterations < EPA_MAX_ITERATIONS; ++iterations)
{
- append(m_stock,&m_fc_store[EPA_MAX_FACES-i-1]);
- }
- }
- eStatus::_ Evaluate(b3GJK& gjk,const b3Vector3& guess)
- {
- b3GJK::sSimplex& simplex=*gjk.m_simplex;
- if((simplex.rank>1)&&gjk.EncloseOrigin())
- {
-
- /* Clean up */
- while(m_hull.root)
+ if (m_nextsv < EPA_MAX_VERTICES)
{
- sFace* f = m_hull.root;
- remove(m_hull,f);
- append(m_stock,f);
- }
- m_status = eStatus::Valid;
- 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)
- {
- b3Swap(simplex.c[0],simplex.c[1]);
- b3Swap(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;
- unsigned int pass=0;
- unsigned int 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=eStatus::Valid;
- for(;iterations<EPA_MAX_ITERATIONS;++iterations)
+ sHorizon horizon;
+ sSV* w = &m_sv_store[m_nextsv++];
+ bool valid = true;
+ best->pass = (unsigned char)(++pass);
+ gjk.getsupport(best->n, *w);
+ const b3Scalar wdist = b3Dot(best->n, w->w) - best->d;
+ if (wdist > EPA_ACCURACY)
{
- if(m_nextsv<EPA_MAX_VERTICES)
- {
- sHorizon horizon;
- sSV* w=&m_sv_store[m_nextsv++];
- bool valid=true;
- best->pass = (unsigned char)(++pass);
- gjk.getsupport(best->n,*w);
- const b3Scalar wdist=b3Dot(best->n,w->w)-best->d;
- if(wdist>EPA_ACCURACY)
- {
- for(unsigned int 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=eStatus::Failed;
- //m_status=eStatus::InvalidHull;
- break; }
- } else { m_status=eStatus::AccuraryReached;break; }
- } else { m_status=eStatus::OutOfVertices;break; }
+ for (unsigned int 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 = eStatus::Failed;
+ //m_status=eStatus::InvalidHull;
+ break;
+ }
+ }
+ else
+ {
+ m_status = eStatus::AccuraryReached;
+ break;
}
- const b3Vector3 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] = b3Cross( outer.c[1]->w-projection,
- outer.c[2]->w-projection).length();
- m_result.p[1] = b3Cross( outer.c[2]->w-projection,
- outer.c[0]->w-projection).length();
- m_result.p[2] = b3Cross( outer.c[0]->w-projection,
- outer.c[1]->w-projection).length();
- const b3Scalar 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 = eStatus::FallBack;
- m_normal = -guess;
- const b3Scalar nl=m_normal.length();
- if(nl>0)
- m_normal = m_normal/nl;
- else
- m_normal = b3MakeVector3(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, sSV* a, sSV* b, b3Scalar& dist)
- {
- const b3Vector3 ba = b->w - a->w;
- const b3Vector3 n_ab = b3Cross(ba, face->n); // Outward facing edge normal direction, on triangle plane
- const b3Scalar a_dot_nab = b3Dot(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 b3Scalar ba_l2 = ba.length2();
- const b3Scalar a_dot_ba = b3Dot(a->w, ba);
- const b3Scalar b_dot_ba = b3Dot(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 b3Scalar a_dot_b = b3Dot(a->w, b->w);
- dist = b3Sqrt(b3Max((a->w.length2() * b->w.length2() - a_dot_b * a_dot_b) / ba_l2, (b3Scalar)0));
+ m_status = eStatus::OutOfVertices;
+ break;
}
-
- return true;
}
+ const b3Vector3 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] = b3Cross(outer.c[1]->w - projection,
+ outer.c[2]->w - projection)
+ .length();
+ m_result.p[1] = b3Cross(outer.c[2]->w - projection,
+ outer.c[0]->w - projection)
+ .length();
+ m_result.p[2] = b3Cross(outer.c[0]->w - projection,
+ outer.c[1]->w - projection)
+ .length();
+ const b3Scalar 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 = eStatus::FallBack;
+ m_normal = -guess;
+ const b3Scalar nl = m_normal.length();
+ if (nl > 0)
+ m_normal = m_normal / nl;
+ else
+ m_normal = b3MakeVector3(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, sSV* a, sSV* b, b3Scalar& dist)
+ {
+ const b3Vector3 ba = b->w - a->w;
+ const b3Vector3 n_ab = b3Cross(ba, face->n); // Outward facing edge normal direction, on triangle plane
+ const b3Scalar a_dot_nab = b3Dot(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 b3Scalar ba_l2 = ba.length2();
+ const b3Scalar a_dot_ba = b3Dot(a->w, ba);
+ const b3Scalar b_dot_ba = b3Dot(b->w, ba);
- return false;
+ if (a_dot_ba > 0)
+ {
+ // Pick distance vertex a
+ dist = a->w.length();
}
- sFace* newface(sSV* a,sSV* b,sSV* c,bool forced)
+ else if (b_dot_ba < 0)
{
- 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 = b3Cross(b->w-a->w,c->w-a->w);
- const b3Scalar 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 = b3Dot(a->w, face->n) / l;
- }
+ // Pick distance vertex b
+ dist = b->w.length();
+ }
+ else
+ {
+ // Pick distance to edge a->b
+ const b3Scalar a_dot_b = b3Dot(a->w, b->w);
+ dist = b3Sqrt(b3Max((a->w.length2() * b->w.length2() - a_dot_b * a_dot_b) / ba_l2, (b3Scalar)0));
+ }
- face->n /= l;
- if(forced || (face->d >= -EPA_PLANE_EPS))
- {
- return face;
- }
- else
- m_status=eStatus::NonConvex;
- }
- else
- m_status=eStatus::Degenerated;
+ return true;
+ }
- remove(m_hull, face);
- append(m_stock, face);
- return 0;
+ return false;
+ }
+ sFace* newface(sSV* a, sSV* b, 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 = b3Cross(b->w - a->w, c->w - a->w);
+ const b3Scalar 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 = b3Dot(a->w, face->n) / l;
}
- m_status = m_stock.root ? eStatus::OutOfVertices : eStatus::OutOfFaces;
- return 0;
+
+ face->n /= l;
+ if (forced || (face->d >= -EPA_PLANE_EPS))
+ {
+ return face;
+ }
+ else
+ m_status = eStatus::NonConvex;
}
- sFace* findbest()
+ else
+ m_status = eStatus::Degenerated;
+
+ remove(m_hull, face);
+ append(m_stock, face);
+ return 0;
+ }
+ m_status = m_stock.root ? eStatus::OutOfVertices : eStatus::OutOfFaces;
+ return 0;
+ }
+ sFace* findbest()
+ {
+ sFace* minf = m_hull.root;
+ b3Scalar mind = minf->d * minf->d;
+ for (sFace* f = minf->l[1]; f; f = f->l[1])
+ {
+ const b3Scalar sqd = f->d * f->d;
+ if (sqd < mind)
{
- sFace* minf=m_hull.root;
- b3Scalar mind=minf->d*minf->d;
- for(sFace* f=minf->l[1];f;f=f->l[1])
+ minf = f;
+ mind = sqd;
+ }
+ }
+ return (minf);
+ }
+ bool expand(unsigned int pass, sSV* w, sFace* f, unsigned int e, sHorizon& horizon)
+ {
+ static const unsigned int i1m3[] = {1, 2, 0};
+ static const unsigned int i2m3[] = {2, 0, 1};
+ if (f->pass != pass)
+ {
+ const unsigned int e1 = i1m3[e];
+ if ((b3Dot(f->n, w->w) - f->d) < -EPA_PLANE_EPS)
+ {
+ sFace* nf = newface(f->c[e1], f->c[e], w, false);
+ if (nf)
{
- const b3Scalar sqd=f->d*f->d;
- if(sqd<mind)
- {
- minf=f;
- mind=sqd;
- }
+ 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);
}
- return(minf);
}
- bool expand(unsigned int pass,sSV* w,sFace* f,unsigned int e,sHorizon& horizon)
+ else
{
- static const unsigned int i1m3[]={1,2,0};
- static const unsigned int i2m3[]={2,0,1};
- if(f->pass!=pass)
+ const unsigned int e2 = i2m3[e];
+ f->pass = (unsigned char)pass;
+ if (expand(pass, w, f->f[e1], f->e[e1], horizon) &&
+ expand(pass, w, f->f[e2], f->e[e2], horizon))
{
- const unsigned int e1=i1m3[e];
- if((b3Dot(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 unsigned int e2=i2m3[e];
- f->pass = (unsigned char)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);
- }
- }
+ remove(m_hull, f);
+ append(m_stock, f);
+ return (true);
}
- return(false);
}
-
- };
-
- //
- static void Initialize(const b3Transform& transA, const b3Transform& transB,
- const b3ConvexPolyhedronData* hullA, const b3ConvexPolyhedronData* hullB,
- const b3AlignedObjectArray<b3Vector3>& verticesA,
- const b3AlignedObjectArray<b3Vector3>& verticesB,
- b3GjkEpaSolver2::sResults& results,
- tShape& shape,
- bool withmargins)
- {
- /* Results */
- results.witnesses[0] =
- results.witnesses[1] = b3MakeVector3(0,0,0);
- results.status = b3GjkEpaSolver2::sResults::Separated;
- /* Shape */
- shape.m_shapes[0] = hullA;
- shape.m_shapes[1] = hullB;
- shape.m_toshape1 = transB.getBasis().transposeTimes(transA.getBasis());
- shape.m_toshape0 = transA.inverseTimes(transB);
- shape.EnableMargin(withmargins);
+ }
+ return (false);
}
+};
+//
+static void Initialize(const b3Transform& transA, const b3Transform& transB,
+ const b3ConvexPolyhedronData* hullA, const b3ConvexPolyhedronData* hullB,
+ const b3AlignedObjectArray<b3Vector3>& verticesA,
+ const b3AlignedObjectArray<b3Vector3>& verticesB,
+ b3GjkEpaSolver2::sResults& results,
+ tShape& shape,
+ bool withmargins)
+{
+ /* Results */
+ results.witnesses[0] =
+ results.witnesses[1] = b3MakeVector3(0, 0, 0);
+ results.status = b3GjkEpaSolver2::sResults::Separated;
+ /* Shape */
+ shape.m_shapes[0] = hullA;
+ shape.m_shapes[1] = hullB;
+ shape.m_toshape1 = transB.getBasis().transposeTimes(transA.getBasis());
+ shape.m_toshape0 = transA.inverseTimes(transB);
+ shape.EnableMargin(withmargins);
}
+} // namespace gjkepa2_impl2
+
//
// Api
//
-using namespace gjkepa2_impl2;
+using namespace gjkepa2_impl2;
//
-int b3GjkEpaSolver2::StackSizeRequirement()
+int b3GjkEpaSolver2::StackSizeRequirement()
{
- return(sizeof(b3GJK)+sizeof(b3EPA));
+ return (sizeof(b3GJK) + sizeof(b3EPA));
}
//
-bool b3GjkEpaSolver2::Distance( const b3Transform& transA, const b3Transform& transB,
- const b3ConvexPolyhedronData* hullA, const b3ConvexPolyhedronData* hullB,
- const b3AlignedObjectArray<b3Vector3>& verticesA,
- const b3AlignedObjectArray<b3Vector3>& verticesB,
- const b3Vector3& guess,
- sResults& results)
+bool b3GjkEpaSolver2::Distance(const b3Transform& transA, const b3Transform& transB,
+ const b3ConvexPolyhedronData* hullA, const b3ConvexPolyhedronData* hullB,
+ const b3AlignedObjectArray<b3Vector3>& verticesA,
+ const b3AlignedObjectArray<b3Vector3>& verticesB,
+ const b3Vector3& guess,
+ sResults& results)
{
- tShape shape;
- Initialize(transA,transB,hullA,hullB,verticesA,verticesB,results,shape,false);
- b3GJK gjk(verticesA,verticesB);
- b3GJK::eStatus::_ gjk_status=gjk.Evaluate(shape,guess);
- if(gjk_status==b3GJK::eStatus::Valid)
+ tShape shape;
+ Initialize(transA, transB, hullA, hullB, verticesA, verticesB, results, shape, false);
+ b3GJK gjk(verticesA, verticesB);
+ b3GJK::eStatus::_ gjk_status = gjk.Evaluate(shape, guess);
+ if (gjk_status == b3GJK::eStatus::Valid)
{
- b3Vector3 w0=b3MakeVector3(0,0,0);
- b3Vector3 w1=b3MakeVector3(0,0,0);
- for(unsigned int i=0;i<gjk.m_simplex->rank;++i)
+ b3Vector3 w0 = b3MakeVector3(0, 0, 0);
+ b3Vector3 w1 = b3MakeVector3(0, 0, 0);
+ for (unsigned int i = 0; i < gjk.m_simplex->rank; ++i)
{
- const b3Scalar p=gjk.m_simplex->p[i];
- w0+=shape.Support( gjk.m_simplex->c[i]->d,0,verticesA,verticesB)*p;
- w1+=shape.Support(-gjk.m_simplex->c[i]->d,1,verticesA,verticesB)*p;
+ const b3Scalar p = gjk.m_simplex->p[i];
+ w0 += shape.Support(gjk.m_simplex->c[i]->d, 0, verticesA, verticesB) * p;
+ w1 += shape.Support(-gjk.m_simplex->c[i]->d, 1, verticesA, verticesB) * p;
}
- results.witnesses[0] = transA*w0;
- results.witnesses[1] = transA*w1;
- results.normal = w0-w1;
- results.distance = results.normal.length();
- results.normal /= results.distance>GJK_MIN_DISTANCE?results.distance:1;
- return(true);
+ results.witnesses[0] = transA * w0;
+ results.witnesses[1] = transA * 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==b3GJK::eStatus::Inside?
- sResults::Penetrating :
- sResults::GJK_Failed ;
- return(false);
+ results.status = gjk_status == b3GJK::eStatus::Inside ? sResults::Penetrating : sResults::GJK_Failed;
+ return (false);
}
}
//
-bool b3GjkEpaSolver2::Penetration( const b3Transform& transA, const b3Transform& transB,
- const b3ConvexPolyhedronData* hullA, const b3ConvexPolyhedronData* hullB,
- const b3AlignedObjectArray<b3Vector3>& verticesA,
- const b3AlignedObjectArray<b3Vector3>& verticesB,
- const b3Vector3& guess,
- sResults& results,
- bool usemargins)
+bool b3GjkEpaSolver2::Penetration(const b3Transform& transA, const b3Transform& transB,
+ const b3ConvexPolyhedronData* hullA, const b3ConvexPolyhedronData* hullB,
+ const b3AlignedObjectArray<b3Vector3>& verticesA,
+ const b3AlignedObjectArray<b3Vector3>& verticesB,
+ const b3Vector3& guess,
+ sResults& results,
+ bool usemargins)
{
-
- tShape shape;
- Initialize(transA,transB,hullA,hullB,verticesA,verticesB,results,shape,usemargins);
- b3GJK gjk(verticesA,verticesB);
- b3GJK::eStatus::_ gjk_status=gjk.Evaluate(shape,guess);
- switch(gjk_status)
+ tShape shape;
+ Initialize(transA, transB, hullA, hullB, verticesA, verticesB, results, shape, usemargins);
+ b3GJK gjk(verticesA, verticesB);
+ b3GJK::eStatus::_ gjk_status = gjk.Evaluate(shape, guess);
+ switch (gjk_status)
{
- case b3GJK::eStatus::Inside:
+ case b3GJK::eStatus::Inside:
{
- b3EPA epa;
- b3EPA::eStatus::_ epa_status=epa.Evaluate(gjk,-guess);
- if(epa_status!=b3EPA::eStatus::Failed)
+ b3EPA epa;
+ b3EPA::eStatus::_ epa_status = epa.Evaluate(gjk, -guess);
+ if (epa_status != b3EPA::eStatus::Failed)
{
- b3Vector3 w0=b3MakeVector3(0,0,0);
- for(unsigned int i=0;i<epa.m_result.rank;++i)
+ b3Vector3 w0 = b3MakeVector3(0, 0, 0);
+ for (unsigned int i = 0; i < epa.m_result.rank; ++i)
{
- w0+=shape.Support(epa.m_result.c[i]->d,0,verticesA,verticesB)*epa.m_result.p[i];
+ w0 += shape.Support(epa.m_result.c[i]->d, 0, verticesA, verticesB) * epa.m_result.p[i];
}
- results.status = sResults::Penetrating;
- results.witnesses[0] = transA*w0;
- results.witnesses[1] = transA*(w0-epa.m_normal*epa.m_depth);
- results.normal = -epa.m_normal;
- results.distance = -epa.m_depth;
- return(true);
- } else results.status=sResults::EPA_Failed;
+ results.status = sResults::Penetrating;
+ results.witnesses[0] = transA * w0;
+ results.witnesses[1] = transA * (w0 - epa.m_normal * epa.m_depth);
+ results.normal = -epa.m_normal;
+ results.distance = -epa.m_depth;
+ return (true);
+ }
+ else
+ results.status = sResults::EPA_Failed;
}
break;
- case b3GJK::eStatus::Failed:
- results.status=sResults::GJK_Failed;
- break;
+ case b3GJK::eStatus::Failed:
+ results.status = sResults::GJK_Failed;
+ break;
default:
- {
- }
+ {
+ }
}
- return(false);
+ return (false);
}
-
#if 0
//
b3Scalar b3GjkEpaSolver2::SignedDistance(const b3Vector3& position,
@@ -994,8 +1043,7 @@ bool b3GjkEpaSolver2::SignedDistance(const btConvexShape* shape0,
}
#endif
-
-/* Symbols cleanup */
+/* Symbols cleanup */
#undef GJK_MAX_ITERATIONS
#undef GJK_ACCURACY
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3GjkEpa.h b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3GjkEpa.h
index 976238a04c..7db32c6309 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3GjkEpa.h
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3GjkEpa.h
@@ -29,40 +29,39 @@ GJK-EPA collision solver by Nathanael Presson, 2008
#include "Bullet3Common/b3Transform.h"
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3ConvexPolyhedronData.h"
-
///btGjkEpaSolver contributed under zlib by Nathanael Presson
-struct b3GjkEpaSolver2
+struct b3GjkEpaSolver2
{
-struct sResults
+ struct sResults
{
- enum eStatus
+ 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;
+ 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 int StackSizeRequirement();
-static bool Distance( const b3Transform& transA, const b3Transform& transB,
- const b3ConvexPolyhedronData* hullA, const b3ConvexPolyhedronData* hullB,
- const b3AlignedObjectArray<b3Vector3>& verticesA,
- const b3AlignedObjectArray<b3Vector3>& verticesB,
- const b3Vector3& guess,
- sResults& results);
+ static bool Distance(const b3Transform& transA, const b3Transform& transB,
+ const b3ConvexPolyhedronData* hullA, const b3ConvexPolyhedronData* hullB,
+ const b3AlignedObjectArray<b3Vector3>& verticesA,
+ const b3AlignedObjectArray<b3Vector3>& verticesB,
+ const b3Vector3& guess,
+ sResults& results);
-static bool Penetration( const b3Transform& transA, const b3Transform& transB,
- const b3ConvexPolyhedronData* hullA, const b3ConvexPolyhedronData* hullB,
+ static bool Penetration(const b3Transform& transA, const b3Transform& transB,
+ const b3ConvexPolyhedronData* hullA, const b3ConvexPolyhedronData* hullB,
const b3AlignedObjectArray<b3Vector3>& verticesA,
const b3AlignedObjectArray<b3Vector3>& verticesB,
const b3Vector3& guess,
sResults& results,
- bool usemargins=true);
+ bool usemargins = true);
#if 0
static b3Scalar SignedDistance( const b3Vector3& position,
b3Scalar margin,
@@ -74,9 +73,7 @@ static bool SignedDistance( const btConvexShape* shape0,const btTransform& wtrs
const btConvexShape* shape1,const btTransform& wtrs1,
const b3Vector3& guess,
sResults& results);
-#endif
-
+#endif
};
-#endif //B3_GJK_EPA2_H
-
+#endif //B3_GJK_EPA2_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3OptimizedBvh.cpp b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3OptimizedBvh.cpp
index e9e51d5a36..6f2c5251a0 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3OptimizedBvh.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3OptimizedBvh.cpp
@@ -13,50 +13,45 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "b3OptimizedBvh.h"
#include "b3StridingMeshInterface.h"
#include "Bullet3Geometry/b3AabbUtil.h"
-
b3OptimizedBvh::b3OptimizedBvh()
-{
+{
}
b3OptimizedBvh::~b3OptimizedBvh()
{
}
-
void b3OptimizedBvh::build(b3StridingMeshInterface* triangles, bool useQuantizedAabbCompression, const b3Vector3& bvhAabbMin, const b3Vector3& bvhAabbMax)
{
m_useQuantization = useQuantizedAabbCompression;
-
// NodeArray triangleNodes;
- struct NodeTriangleCallback : public b3InternalTriangleIndexCallback
+ struct NodeTriangleCallback : public b3InternalTriangleIndexCallback
{
-
- NodeArray& m_triangleNodes;
+ NodeArray& m_triangleNodes;
NodeTriangleCallback& operator=(NodeTriangleCallback& other)
{
m_triangleNodes.copyFromArray(other.m_triangleNodes);
return *this;
}
-
- NodeTriangleCallback(NodeArray& triangleNodes)
- :m_triangleNodes(triangleNodes)
+
+ NodeTriangleCallback(NodeArray& triangleNodes)
+ : m_triangleNodes(triangleNodes)
{
}
- virtual void internalProcessTriangleIndex(b3Vector3* triangle,int partId,int triangleIndex)
+ virtual void internalProcessTriangleIndex(b3Vector3* triangle, int partId, int triangleIndex)
{
b3OptimizedBvhNode node;
- b3Vector3 aabbMin,aabbMax;
- aabbMin.setValue(b3Scalar(B3_LARGE_FLOAT),b3Scalar(B3_LARGE_FLOAT),b3Scalar(B3_LARGE_FLOAT));
- aabbMax.setValue(b3Scalar(-B3_LARGE_FLOAT),b3Scalar(-B3_LARGE_FLOAT),b3Scalar(-B3_LARGE_FLOAT));
+ b3Vector3 aabbMin, aabbMax;
+ aabbMin.setValue(b3Scalar(B3_LARGE_FLOAT), b3Scalar(B3_LARGE_FLOAT), b3Scalar(B3_LARGE_FLOAT));
+ aabbMax.setValue(b3Scalar(-B3_LARGE_FLOAT), b3Scalar(-B3_LARGE_FLOAT), b3Scalar(-B3_LARGE_FLOAT));
aabbMin.setMin(triangle[0]);
aabbMax.setMax(triangle[0]);
aabbMin.setMin(triangle[1]);
@@ -69,17 +64,17 @@ void b3OptimizedBvh::build(b3StridingMeshInterface* triangles, bool useQuantized
node.m_aabbMaxOrg = aabbMax;
node.m_escapeIndex = -1;
-
+
//for child nodes
node.m_subPart = partId;
node.m_triangleIndex = triangleIndex;
m_triangleNodes.push_back(node);
}
};
- struct QuantizedNodeTriangleCallback : public b3InternalTriangleIndexCallback
+ struct QuantizedNodeTriangleCallback : public b3InternalTriangleIndexCallback
{
- QuantizedNodeArray& m_triangleNodes;
- const b3QuantizedBvh* m_optimizedTree; // for quantization
+ QuantizedNodeArray& m_triangleNodes;
+ const b3QuantizedBvh* m_optimizedTree; // for quantization
QuantizedNodeTriangleCallback& operator=(QuantizedNodeTriangleCallback& other)
{
@@ -88,23 +83,23 @@ void b3OptimizedBvh::build(b3StridingMeshInterface* triangles, bool useQuantized
return *this;
}
- QuantizedNodeTriangleCallback(QuantizedNodeArray& triangleNodes,const b3QuantizedBvh* tree)
- :m_triangleNodes(triangleNodes),m_optimizedTree(tree)
+ QuantizedNodeTriangleCallback(QuantizedNodeArray& triangleNodes, const b3QuantizedBvh* tree)
+ : m_triangleNodes(triangleNodes), m_optimizedTree(tree)
{
}
- virtual void internalProcessTriangleIndex(b3Vector3* triangle,int partId,int triangleIndex)
+ virtual void internalProcessTriangleIndex(b3Vector3* triangle, int partId, int triangleIndex)
{
// The partId and triangle index must fit in the same (positive) integer
- b3Assert(partId < (1<<MAX_NUM_PARTS_IN_BITS));
- b3Assert(triangleIndex < (1<<(31-MAX_NUM_PARTS_IN_BITS)));
+ b3Assert(partId < (1 << MAX_NUM_PARTS_IN_BITS));
+ b3Assert(triangleIndex < (1 << (31 - MAX_NUM_PARTS_IN_BITS)));
//negative indices are reserved for escapeIndex
- b3Assert(triangleIndex>=0);
+ b3Assert(triangleIndex >= 0);
b3QuantizedBvhNode node;
- b3Vector3 aabbMin,aabbMax;
- aabbMin.setValue(b3Scalar(B3_LARGE_FLOAT),b3Scalar(B3_LARGE_FLOAT),b3Scalar(B3_LARGE_FLOAT));
- aabbMax.setValue(b3Scalar(-B3_LARGE_FLOAT),b3Scalar(-B3_LARGE_FLOAT),b3Scalar(-B3_LARGE_FLOAT));
+ b3Vector3 aabbMin, aabbMax;
+ aabbMin.setValue(b3Scalar(B3_LARGE_FLOAT), b3Scalar(B3_LARGE_FLOAT), b3Scalar(B3_LARGE_FLOAT));
+ aabbMax.setValue(b3Scalar(-B3_LARGE_FLOAT), b3Scalar(-B3_LARGE_FLOAT), b3Scalar(-B3_LARGE_FLOAT));
aabbMin.setMin(triangle[0]);
aabbMax.setMax(triangle[0]);
aabbMin.setMin(triangle[1]);
@@ -131,59 +126,52 @@ void b3OptimizedBvh::build(b3StridingMeshInterface* triangles, bool useQuantized
aabbMin.setZ(aabbMin.getZ() - MIN_AABB_HALF_DIMENSION);
}
- m_optimizedTree->quantize(&node.m_quantizedAabbMin[0],aabbMin,0);
- m_optimizedTree->quantize(&node.m_quantizedAabbMax[0],aabbMax,1);
+ m_optimizedTree->quantize(&node.m_quantizedAabbMin[0], aabbMin, 0);
+ m_optimizedTree->quantize(&node.m_quantizedAabbMax[0], aabbMax, 1);
- node.m_escapeIndexOrTriangleIndex = (partId<<(31-MAX_NUM_PARTS_IN_BITS)) | triangleIndex;
+ node.m_escapeIndexOrTriangleIndex = (partId << (31 - MAX_NUM_PARTS_IN_BITS)) | triangleIndex;
m_triangleNodes.push_back(node);
}
};
-
-
int numLeafNodes = 0;
-
if (m_useQuantization)
{
-
//initialize quantization values
- setQuantizationValues(bvhAabbMin,bvhAabbMax);
+ setQuantizationValues(bvhAabbMin, bvhAabbMax);
- QuantizedNodeTriangleCallback callback(m_quantizedLeafNodes,this);
+ QuantizedNodeTriangleCallback callback(m_quantizedLeafNodes, this);
-
- triangles->InternalProcessAllTriangles(&callback,m_bvhAabbMin,m_bvhAabbMax);
+ triangles->InternalProcessAllTriangles(&callback, m_bvhAabbMin, m_bvhAabbMax);
//now we have an array of leafnodes in m_leafNodes
numLeafNodes = m_quantizedLeafNodes.size();
-
- m_quantizedContiguousNodes.resize(2*numLeafNodes);
-
-
- } else
+ m_quantizedContiguousNodes.resize(2 * numLeafNodes);
+ }
+ else
{
- NodeTriangleCallback callback(m_leafNodes);
+ NodeTriangleCallback callback(m_leafNodes);
- b3Vector3 aabbMin=b3MakeVector3(b3Scalar(-B3_LARGE_FLOAT),b3Scalar(-B3_LARGE_FLOAT),b3Scalar(-B3_LARGE_FLOAT));
- b3Vector3 aabbMax=b3MakeVector3(b3Scalar(B3_LARGE_FLOAT),b3Scalar(B3_LARGE_FLOAT),b3Scalar(B3_LARGE_FLOAT));
+ b3Vector3 aabbMin = b3MakeVector3(b3Scalar(-B3_LARGE_FLOAT), b3Scalar(-B3_LARGE_FLOAT), b3Scalar(-B3_LARGE_FLOAT));
+ b3Vector3 aabbMax = b3MakeVector3(b3Scalar(B3_LARGE_FLOAT), b3Scalar(B3_LARGE_FLOAT), b3Scalar(B3_LARGE_FLOAT));
- triangles->InternalProcessAllTriangles(&callback,aabbMin,aabbMax);
+ triangles->InternalProcessAllTriangles(&callback, aabbMin, aabbMax);
//now we have an array of leafnodes in m_leafNodes
numLeafNodes = m_leafNodes.size();
- m_contiguousNodes.resize(2*numLeafNodes);
+ m_contiguousNodes.resize(2 * numLeafNodes);
}
m_curNodeIndex = 0;
- buildTree(0,numLeafNodes);
+ buildTree(0, numLeafNodes);
///if the entire tree is small then subtree size, we need to create a header info for the tree
- if(m_useQuantization && !m_SubtreeHeaders.size())
+ if (m_useQuantization && !m_SubtreeHeaders.size())
{
b3BvhSubtreeInfo& subtree = m_SubtreeHeaders.expand();
subtree.setAabbFromQuantizeNode(m_quantizedContiguousNodes[0]);
@@ -199,37 +187,29 @@ void b3OptimizedBvh::build(b3StridingMeshInterface* triangles, bool useQuantized
m_leafNodes.clear();
}
-
-
-
-void b3OptimizedBvh::refit(b3StridingMeshInterface* meshInterface,const b3Vector3& aabbMin,const b3Vector3& aabbMax)
+void b3OptimizedBvh::refit(b3StridingMeshInterface* meshInterface, const b3Vector3& aabbMin, const b3Vector3& aabbMax)
{
if (m_useQuantization)
{
+ setQuantizationValues(aabbMin, aabbMax);
- setQuantizationValues(aabbMin,aabbMax);
-
- updateBvhNodes(meshInterface,0,m_curNodeIndex,0);
+ updateBvhNodes(meshInterface, 0, m_curNodeIndex, 0);
///now update all subtree headers
int i;
- for (i=0;i<m_SubtreeHeaders.size();i++)
+ for (i = 0; i < m_SubtreeHeaders.size(); i++)
{
b3BvhSubtreeInfo& subtree = m_SubtreeHeaders[i];
subtree.setAabbFromQuantizeNode(m_quantizedContiguousNodes[subtree.m_rootNodeIndex]);
}
-
- } else
+ }
+ else
{
-
}
}
-
-
-
-void b3OptimizedBvh::refitPartial(b3StridingMeshInterface* meshInterface,const b3Vector3& aabbMin,const b3Vector3& aabbMax)
+void b3OptimizedBvh::refitPartial(b3StridingMeshInterface* meshInterface, const b3Vector3& aabbMin, const b3Vector3& aabbMax)
{
//incrementally initialize quantization values
b3Assert(m_useQuantization);
@@ -244,147 +224,135 @@ void b3OptimizedBvh::refitPartial(b3StridingMeshInterface* meshInterface,const b
///we should update all quantization values, using updateBvhNodes(meshInterface);
///but we only update chunks that overlap the given aabb
-
- unsigned short quantizedQueryAabbMin[3];
- unsigned short quantizedQueryAabbMax[3];
- quantize(&quantizedQueryAabbMin[0],aabbMin,0);
- quantize(&quantizedQueryAabbMax[0],aabbMax,1);
+ unsigned short quantizedQueryAabbMin[3];
+ unsigned short quantizedQueryAabbMax[3];
+
+ quantize(&quantizedQueryAabbMin[0], aabbMin, 0);
+ quantize(&quantizedQueryAabbMax[0], aabbMax, 1);
int i;
- for (i=0;i<this->m_SubtreeHeaders.size();i++)
+ for (i = 0; i < this->m_SubtreeHeaders.size(); i++)
{
b3BvhSubtreeInfo& subtree = m_SubtreeHeaders[i];
//PCK: unsigned instead of bool
- unsigned overlap = b3TestQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin,quantizedQueryAabbMax,subtree.m_quantizedAabbMin,subtree.m_quantizedAabbMax);
+ unsigned overlap = b3TestQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin, quantizedQueryAabbMax, subtree.m_quantizedAabbMin, subtree.m_quantizedAabbMax);
if (overlap != 0)
{
- updateBvhNodes(meshInterface,subtree.m_rootNodeIndex,subtree.m_rootNodeIndex+subtree.m_subtreeSize,i);
+ updateBvhNodes(meshInterface, subtree.m_rootNodeIndex, subtree.m_rootNodeIndex + subtree.m_subtreeSize, i);
subtree.setAabbFromQuantizeNode(m_quantizedContiguousNodes[subtree.m_rootNodeIndex]);
}
}
-
}
-void b3OptimizedBvh::updateBvhNodes(b3StridingMeshInterface* meshInterface,int firstNode,int endNode,int index)
+void b3OptimizedBvh::updateBvhNodes(b3StridingMeshInterface* meshInterface, int firstNode, int endNode, int index)
{
(void)index;
b3Assert(m_useQuantization);
- int curNodeSubPart=-1;
+ int curNodeSubPart = -1;
//get access info to trianglemesh data
- const unsigned char *vertexbase = 0;
- int numverts = 0;
- PHY_ScalarType type = PHY_INTEGER;
- int stride = 0;
- const unsigned char *indexbase = 0;
- int indexstride = 0;
- int numfaces = 0;
- PHY_ScalarType indicestype = PHY_INTEGER;
-
- b3Vector3 triangleVerts[3];
- b3Vector3 aabbMin,aabbMax;
- const b3Vector3& meshScaling = meshInterface->getScaling();
-
- int i;
- for (i=endNode-1;i>=firstNode;i--)
+ const unsigned char* vertexbase = 0;
+ int numverts = 0;
+ PHY_ScalarType type = PHY_INTEGER;
+ int stride = 0;
+ const unsigned char* indexbase = 0;
+ int indexstride = 0;
+ int numfaces = 0;
+ PHY_ScalarType indicestype = PHY_INTEGER;
+
+ b3Vector3 triangleVerts[3];
+ b3Vector3 aabbMin, aabbMax;
+ const b3Vector3& meshScaling = meshInterface->getScaling();
+
+ int i;
+ for (i = endNode - 1; i >= firstNode; i--)
+ {
+ b3QuantizedBvhNode& curNode = m_quantizedContiguousNodes[i];
+ if (curNode.isLeafNode())
{
+ //recalc aabb from triangle data
+ int nodeSubPart = curNode.getPartId();
+ int nodeTriangleIndex = curNode.getTriangleIndex();
+ if (nodeSubPart != curNodeSubPart)
+ {
+ if (curNodeSubPart >= 0)
+ meshInterface->unLockReadOnlyVertexBase(curNodeSubPart);
+ meshInterface->getLockedReadOnlyVertexIndexBase(&vertexbase, numverts, type, stride, &indexbase, indexstride, numfaces, indicestype, nodeSubPart);
+ curNodeSubPart = nodeSubPart;
+ b3Assert(indicestype == PHY_INTEGER || indicestype == PHY_SHORT);
+ }
+ //triangles->getLockedReadOnlyVertexIndexBase(vertexBase,numVerts,
- b3QuantizedBvhNode& curNode = m_quantizedContiguousNodes[i];
- if (curNode.isLeafNode())
+ unsigned int* gfxbase = (unsigned int*)(indexbase + nodeTriangleIndex * indexstride);
+
+ for (int j = 2; j >= 0; j--)
{
- //recalc aabb from triangle data
- int nodeSubPart = curNode.getPartId();
- int nodeTriangleIndex = curNode.getTriangleIndex();
- if (nodeSubPart != curNodeSubPart)
+ int graphicsindex = indicestype == PHY_SHORT ? ((unsigned short*)gfxbase)[j] : gfxbase[j];
+ if (type == PHY_FLOAT)
{
- if (curNodeSubPart >= 0)
- meshInterface->unLockReadOnlyVertexBase(curNodeSubPart);
- meshInterface->getLockedReadOnlyVertexIndexBase(&vertexbase,numverts, type,stride,&indexbase,indexstride,numfaces,indicestype,nodeSubPart);
-
- curNodeSubPart = nodeSubPart;
- b3Assert(indicestype==PHY_INTEGER||indicestype==PHY_SHORT);
+ float* graphicsbase = (float*)(vertexbase + graphicsindex * stride);
+ triangleVerts[j] = b3MakeVector3(
+ graphicsbase[0] * meshScaling.getX(),
+ graphicsbase[1] * meshScaling.getY(),
+ graphicsbase[2] * meshScaling.getZ());
}
- //triangles->getLockedReadOnlyVertexIndexBase(vertexBase,numVerts,
-
- unsigned int* gfxbase = (unsigned int*)(indexbase+nodeTriangleIndex*indexstride);
-
-
- for (int j=2;j>=0;j--)
+ else
{
-
- int graphicsindex = indicestype==PHY_SHORT?((unsigned short*)gfxbase)[j]:gfxbase[j];
- if (type == PHY_FLOAT)
- {
- float* graphicsbase = (float*)(vertexbase+graphicsindex*stride);
- triangleVerts[j] = b3MakeVector3(
- graphicsbase[0]*meshScaling.getX(),
- graphicsbase[1]*meshScaling.getY(),
- graphicsbase[2]*meshScaling.getZ());
- }
- else
- {
- double* graphicsbase = (double*)(vertexbase+graphicsindex*stride);
- triangleVerts[j] = b3MakeVector3( b3Scalar(graphicsbase[0]*meshScaling.getX()), b3Scalar(graphicsbase[1]*meshScaling.getY()), b3Scalar(graphicsbase[2]*meshScaling.getZ()));
- }
+ double* graphicsbase = (double*)(vertexbase + graphicsindex * stride);
+ triangleVerts[j] = b3MakeVector3(b3Scalar(graphicsbase[0] * meshScaling.getX()), b3Scalar(graphicsbase[1] * meshScaling.getY()), b3Scalar(graphicsbase[2] * meshScaling.getZ()));
}
+ }
+ aabbMin.setValue(b3Scalar(B3_LARGE_FLOAT), b3Scalar(B3_LARGE_FLOAT), b3Scalar(B3_LARGE_FLOAT));
+ aabbMax.setValue(b3Scalar(-B3_LARGE_FLOAT), b3Scalar(-B3_LARGE_FLOAT), b3Scalar(-B3_LARGE_FLOAT));
+ aabbMin.setMin(triangleVerts[0]);
+ aabbMax.setMax(triangleVerts[0]);
+ aabbMin.setMin(triangleVerts[1]);
+ aabbMax.setMax(triangleVerts[1]);
+ aabbMin.setMin(triangleVerts[2]);
+ aabbMax.setMax(triangleVerts[2]);
+
+ quantize(&curNode.m_quantizedAabbMin[0], aabbMin, 0);
+ quantize(&curNode.m_quantizedAabbMax[0], aabbMax, 1);
+ }
+ else
+ {
+ //combine aabb from both children
-
- aabbMin.setValue(b3Scalar(B3_LARGE_FLOAT),b3Scalar(B3_LARGE_FLOAT),b3Scalar(B3_LARGE_FLOAT));
- aabbMax.setValue(b3Scalar(-B3_LARGE_FLOAT),b3Scalar(-B3_LARGE_FLOAT),b3Scalar(-B3_LARGE_FLOAT));
- aabbMin.setMin(triangleVerts[0]);
- aabbMax.setMax(triangleVerts[0]);
- aabbMin.setMin(triangleVerts[1]);
- aabbMax.setMax(triangleVerts[1]);
- aabbMin.setMin(triangleVerts[2]);
- aabbMax.setMax(triangleVerts[2]);
-
- quantize(&curNode.m_quantizedAabbMin[0],aabbMin,0);
- quantize(&curNode.m_quantizedAabbMax[0],aabbMax,1);
-
- } else
- {
- //combine aabb from both children
+ b3QuantizedBvhNode* leftChildNode = &m_quantizedContiguousNodes[i + 1];
- b3QuantizedBvhNode* leftChildNode = &m_quantizedContiguousNodes[i+1];
-
- b3QuantizedBvhNode* rightChildNode = leftChildNode->isLeafNode() ? &m_quantizedContiguousNodes[i+2] :
- &m_quantizedContiguousNodes[i+1+leftChildNode->getEscapeIndex()];
-
+ b3QuantizedBvhNode* rightChildNode = leftChildNode->isLeafNode() ? &m_quantizedContiguousNodes[i + 2] : &m_quantizedContiguousNodes[i + 1 + leftChildNode->getEscapeIndex()];
+ {
+ for (int i = 0; i < 3; i++)
{
- for (int i=0;i<3;i++)
- {
- curNode.m_quantizedAabbMin[i] = leftChildNode->m_quantizedAabbMin[i];
- if (curNode.m_quantizedAabbMin[i]>rightChildNode->m_quantizedAabbMin[i])
- curNode.m_quantizedAabbMin[i]=rightChildNode->m_quantizedAabbMin[i];
-
- curNode.m_quantizedAabbMax[i] = leftChildNode->m_quantizedAabbMax[i];
- if (curNode.m_quantizedAabbMax[i] < rightChildNode->m_quantizedAabbMax[i])
- curNode.m_quantizedAabbMax[i] = rightChildNode->m_quantizedAabbMax[i];
- }
+ curNode.m_quantizedAabbMin[i] = leftChildNode->m_quantizedAabbMin[i];
+ if (curNode.m_quantizedAabbMin[i] > rightChildNode->m_quantizedAabbMin[i])
+ curNode.m_quantizedAabbMin[i] = rightChildNode->m_quantizedAabbMin[i];
+
+ curNode.m_quantizedAabbMax[i] = leftChildNode->m_quantizedAabbMax[i];
+ if (curNode.m_quantizedAabbMax[i] < rightChildNode->m_quantizedAabbMax[i])
+ curNode.m_quantizedAabbMax[i] = rightChildNode->m_quantizedAabbMax[i];
}
}
-
}
+ }
- if (curNodeSubPart >= 0)
- meshInterface->unLockReadOnlyVertexBase(curNodeSubPart);
-
-
+ if (curNodeSubPart >= 0)
+ meshInterface->unLockReadOnlyVertexBase(curNodeSubPart);
}
///deSerializeInPlace loads and initializes a BVH from a buffer in memory 'in place'
-b3OptimizedBvh* b3OptimizedBvh::deSerializeInPlace(void *i_alignedDataBuffer, unsigned int i_dataBufferSize, bool i_swapEndian)
+b3OptimizedBvh* b3OptimizedBvh::deSerializeInPlace(void* i_alignedDataBuffer, unsigned int i_dataBufferSize, bool i_swapEndian)
{
- b3QuantizedBvh* bvh = b3QuantizedBvh::deSerializeInPlace(i_alignedDataBuffer,i_dataBufferSize,i_swapEndian);
-
+ b3QuantizedBvh* bvh = b3QuantizedBvh::deSerializeInPlace(i_alignedDataBuffer, i_dataBufferSize, i_swapEndian);
+
//we don't add additional data so just do a static upcast
return static_cast<b3OptimizedBvh*>(bvh);
}
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3OptimizedBvh.h b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3OptimizedBvh.h
index 0272ef83bf..1286552939 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3OptimizedBvh.h
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3OptimizedBvh.h
@@ -22,44 +22,35 @@ subject to the following restrictions:
class b3StridingMeshInterface;
-
///The b3OptimizedBvh extends the b3QuantizedBvh to create AABB tree for triangle meshes, through the b3StridingMeshInterface.
-B3_ATTRIBUTE_ALIGNED16(class) b3OptimizedBvh : public b3QuantizedBvh
+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 build(b3StridingMeshInterface * triangles, bool useQuantizedAabbCompression, const b3Vector3& bvhAabbMin, const b3Vector3& bvhAabbMax);
- void refit(b3StridingMeshInterface* triangles,const b3Vector3& aabbMin,const b3Vector3& aabbMax);
+ void refit(b3StridingMeshInterface * triangles, const b3Vector3& aabbMin, const b3Vector3& aabbMax);
- void refitPartial(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);
+ 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
+ virtual bool serializeInPlace(void* o_alignedDataBuffer, unsigned i_dataBufferSize, bool i_swapEndian) const
{
- return b3QuantizedBvh::serialize(o_alignedDataBuffer,i_dataBufferSize,i_swapEndian);
-
+ 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);
-
-
+ static b3OptimizedBvh* deSerializeInPlace(void* i_alignedDataBuffer, unsigned int i_dataBufferSize, bool i_swapEndian);
};
-
-#endif //B3_OPTIMIZED_BVH_H
-
-
+#endif //B3_OPTIMIZED_BVH_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3QuantizedBvh.cpp b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3QuantizedBvh.cpp
index 52027e1118..9a448495f3 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3QuantizedBvh.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3QuantizedBvh.cpp
@@ -17,46 +17,40 @@ subject to the following restrictions:
#include "Bullet3Geometry/b3AabbUtil.h"
-
#define RAYAABB2
-b3QuantizedBvh::b3QuantizedBvh() :
- m_bulletVersion(B3_BULLET_VERSION),
- m_useQuantization(false),
- m_traversalMode(TRAVERSAL_STACKLESS_CACHE_FRIENDLY)
- //m_traversalMode(TRAVERSAL_STACKLESS)
- //m_traversalMode(TRAVERSAL_RECURSIVE)
- ,m_subtreeHeaderCount(0) //PCK: add this line
+b3QuantizedBvh::b3QuantizedBvh() : m_bulletVersion(B3_BULLET_VERSION),
+ m_useQuantization(false),
+ m_traversalMode(TRAVERSAL_STACKLESS_CACHE_FRIENDLY)
+ //m_traversalMode(TRAVERSAL_STACKLESS)
+ //m_traversalMode(TRAVERSAL_RECURSIVE)
+ ,
+ m_subtreeHeaderCount(0) //PCK: add this line
{
- m_bvhAabbMin.setValue(-B3_INFINITY,-B3_INFINITY,-B3_INFINITY);
- m_bvhAabbMax.setValue(B3_INFINITY,B3_INFINITY,B3_INFINITY);
+ m_bvhAabbMin.setValue(-B3_INFINITY, -B3_INFINITY, -B3_INFINITY);
+ m_bvhAabbMax.setValue(B3_INFINITY, B3_INFINITY, B3_INFINITY);
}
-
-
-
-
void b3QuantizedBvh::buildInternal()
{
///assumes that caller filled in the m_quantizedLeafNodes
m_useQuantization = true;
int numLeafNodes = 0;
-
+
if (m_useQuantization)
{
//now we have an array of leafnodes in m_leafNodes
numLeafNodes = m_quantizedLeafNodes.size();
- m_quantizedContiguousNodes.resize(2*numLeafNodes);
-
+ m_quantizedContiguousNodes.resize(2 * numLeafNodes);
}
m_curNodeIndex = 0;
- buildTree(0,numLeafNodes);
+ buildTree(0, numLeafNodes);
///if the entire tree is small then subtree size, we need to create a header info for the tree
- if(m_useQuantization && !m_SubtreeHeaders.size())
+ if (m_useQuantization && !m_SubtreeHeaders.size())
{
b3BvhSubtreeInfo& subtree = m_SubtreeHeaders.expand();
subtree.setAabbFromQuantizeNode(m_quantizedContiguousNodes[0]);
@@ -72,35 +66,27 @@ void b3QuantizedBvh::buildInternal()
m_leafNodes.clear();
}
-
-
///just for debugging, to visualize the individual patches/subtrees
#ifdef DEBUG_PATCH_COLORS
-b3Vector3 color[4]=
-{
- b3Vector3(1,0,0),
- b3Vector3(0,1,0),
- b3Vector3(0,0,1),
- b3Vector3(0,1,1)
-};
-#endif //DEBUG_PATCH_COLORS
-
-
+b3Vector3 color[4] =
+ {
+ b3Vector3(1, 0, 0),
+ b3Vector3(0, 1, 0),
+ b3Vector3(0, 0, 1),
+ b3Vector3(0, 1, 1)};
+#endif //DEBUG_PATCH_COLORS
-void b3QuantizedBvh::setQuantizationValues(const b3Vector3& bvhAabbMin,const b3Vector3& bvhAabbMax,b3Scalar quantizationMargin)
+void b3QuantizedBvh::setQuantizationValues(const b3Vector3& bvhAabbMin, const b3Vector3& bvhAabbMax, b3Scalar quantizationMargin)
{
//enlarge the AABB to avoid division by zero when initializing the quantization values
- b3Vector3 clampValue =b3MakeVector3(quantizationMargin,quantizationMargin,quantizationMargin);
+ b3Vector3 clampValue = b3MakeVector3(quantizationMargin, quantizationMargin, quantizationMargin);
m_bvhAabbMin = bvhAabbMin - clampValue;
m_bvhAabbMax = bvhAabbMax + clampValue;
b3Vector3 aabbSize = m_bvhAabbMax - m_bvhAabbMin;
- m_bvhQuantization = b3MakeVector3(b3Scalar(65533.0),b3Scalar(65533.0),b3Scalar(65533.0)) / aabbSize;
+ m_bvhQuantization = b3MakeVector3(b3Scalar(65533.0), b3Scalar(65533.0), b3Scalar(65533.0)) / aabbSize;
m_useQuantization = true;
}
-
-
-
b3QuantizedBvh::~b3QuantizedBvh()
{
}
@@ -108,104 +94,100 @@ b3QuantizedBvh::~b3QuantizedBvh()
#ifdef DEBUG_TREE_BUILDING
int gStackDepth = 0;
int gMaxStackDepth = 0;
-#endif //DEBUG_TREE_BUILDING
+#endif //DEBUG_TREE_BUILDING
-void b3QuantizedBvh::buildTree (int startIndex,int endIndex)
+void b3QuantizedBvh::buildTree(int startIndex, int endIndex)
{
#ifdef DEBUG_TREE_BUILDING
gStackDepth++;
if (gStackDepth > gMaxStackDepth)
gMaxStackDepth = gStackDepth;
-#endif //DEBUG_TREE_BUILDING
-
+#endif //DEBUG_TREE_BUILDING
int splitAxis, splitIndex, i;
- int numIndices =endIndex-startIndex;
+ int numIndices = endIndex - startIndex;
int curIndex = m_curNodeIndex;
- b3Assert(numIndices>0);
+ b3Assert(numIndices > 0);
- if (numIndices==1)
+ if (numIndices == 1)
{
#ifdef DEBUG_TREE_BUILDING
gStackDepth--;
-#endif //DEBUG_TREE_BUILDING
-
- assignInternalNodeFromLeafNode(m_curNodeIndex,startIndex);
+#endif //DEBUG_TREE_BUILDING
+
+ assignInternalNodeFromLeafNode(m_curNodeIndex, startIndex);
m_curNodeIndex++;
- return;
+ return;
}
//calculate Best Splitting Axis and where to split it. Sort the incoming 'leafNodes' array within range 'startIndex/endIndex'.
-
- splitAxis = calcSplittingAxis(startIndex,endIndex);
- splitIndex = sortAndCalcSplittingIndex(startIndex,endIndex,splitAxis);
+ splitAxis = calcSplittingAxis(startIndex, endIndex);
+
+ splitIndex = sortAndCalcSplittingIndex(startIndex, endIndex, splitAxis);
int internalNodeIndex = m_curNodeIndex;
-
+
//set the min aabb to 'inf' or a max value, and set the max aabb to a -inf/minimum value.
//the aabb will be expanded during buildTree/mergeInternalNodeAabb with actual node values
- setInternalNodeAabbMin(m_curNodeIndex,m_bvhAabbMax);//can't use b3Vector3(B3_INFINITY,B3_INFINITY,B3_INFINITY)) because of quantization
- setInternalNodeAabbMax(m_curNodeIndex,m_bvhAabbMin);//can't use b3Vector3(-B3_INFINITY,-B3_INFINITY,-B3_INFINITY)) because of quantization
-
-
- for (i=startIndex;i<endIndex;i++)
+ setInternalNodeAabbMin(m_curNodeIndex, m_bvhAabbMax); //can't use b3Vector3(B3_INFINITY,B3_INFINITY,B3_INFINITY)) because of quantization
+ setInternalNodeAabbMax(m_curNodeIndex, m_bvhAabbMin); //can't use b3Vector3(-B3_INFINITY,-B3_INFINITY,-B3_INFINITY)) because of quantization
+
+ for (i = startIndex; i < endIndex; i++)
{
- mergeInternalNodeAabb(m_curNodeIndex,getAabbMin(i),getAabbMax(i));
+ mergeInternalNodeAabb(m_curNodeIndex, getAabbMin(i), getAabbMax(i));
}
m_curNodeIndex++;
-
//internalNode->m_escapeIndex;
-
+
int leftChildNodexIndex = m_curNodeIndex;
//build left child tree
- buildTree(startIndex,splitIndex);
+ buildTree(startIndex, splitIndex);
int rightChildNodexIndex = m_curNodeIndex;
//build right child tree
- buildTree(splitIndex,endIndex);
+ buildTree(splitIndex, endIndex);
#ifdef DEBUG_TREE_BUILDING
gStackDepth--;
-#endif //DEBUG_TREE_BUILDING
+#endif //DEBUG_TREE_BUILDING
int escapeIndex = m_curNodeIndex - curIndex;
if (m_useQuantization)
{
//escapeIndex is the number of nodes of this subtree
- const int sizeQuantizedNode =sizeof(b3QuantizedBvhNode);
+ const int sizeQuantizedNode = sizeof(b3QuantizedBvhNode);
const int treeSizeInBytes = escapeIndex * sizeQuantizedNode;
if (treeSizeInBytes > MAX_SUBTREE_SIZE_IN_BYTES)
{
- updateSubtreeHeaders(leftChildNodexIndex,rightChildNodexIndex);
+ updateSubtreeHeaders(leftChildNodexIndex, rightChildNodexIndex);
}
- } else
+ }
+ else
{
-
}
- setInternalNodeEscapeIndex(internalNodeIndex,escapeIndex);
-
+ setInternalNodeEscapeIndex(internalNodeIndex, escapeIndex);
}
-void b3QuantizedBvh::updateSubtreeHeaders(int leftChildNodexIndex,int rightChildNodexIndex)
+void b3QuantizedBvh::updateSubtreeHeaders(int leftChildNodexIndex, int rightChildNodexIndex)
{
b3Assert(m_useQuantization);
b3QuantizedBvhNode& leftChildNode = m_quantizedContiguousNodes[leftChildNodexIndex];
int leftSubTreeSize = leftChildNode.isLeafNode() ? 1 : leftChildNode.getEscapeIndex();
- int leftSubTreeSizeInBytes = leftSubTreeSize * static_cast<int>(sizeof(b3QuantizedBvhNode));
-
+ int leftSubTreeSizeInBytes = leftSubTreeSize * static_cast<int>(sizeof(b3QuantizedBvhNode));
+
b3QuantizedBvhNode& rightChildNode = m_quantizedContiguousNodes[rightChildNodexIndex];
int rightSubTreeSize = rightChildNode.isLeafNode() ? 1 : rightChildNode.getEscapeIndex();
- int rightSubTreeSizeInBytes = rightSubTreeSize * static_cast<int>(sizeof(b3QuantizedBvhNode));
+ int rightSubTreeSizeInBytes = rightSubTreeSize * static_cast<int>(sizeof(b3QuantizedBvhNode));
- if(leftSubTreeSizeInBytes <= MAX_SUBTREE_SIZE_IN_BYTES)
+ if (leftSubTreeSizeInBytes <= MAX_SUBTREE_SIZE_IN_BYTES)
{
b3BvhSubtreeInfo& subtree = m_SubtreeHeaders.expand();
subtree.setAabbFromQuantizeNode(leftChildNode);
@@ -213,7 +195,7 @@ void b3QuantizedBvh::updateSubtreeHeaders(int leftChildNodexIndex,int rightChild
subtree.m_subtreeSize = leftSubTreeSize;
}
- if(rightSubTreeSizeInBytes <= MAX_SUBTREE_SIZE_IN_BYTES)
+ if (rightSubTreeSizeInBytes <= MAX_SUBTREE_SIZE_IN_BYTES)
{
b3BvhSubtreeInfo& subtree = m_SubtreeHeaders.expand();
subtree.setAabbFromQuantizeNode(rightChildNode);
@@ -225,32 +207,31 @@ void b3QuantizedBvh::updateSubtreeHeaders(int leftChildNodexIndex,int rightChild
m_subtreeHeaderCount = m_SubtreeHeaders.size();
}
-
-int b3QuantizedBvh::sortAndCalcSplittingIndex(int startIndex,int endIndex,int splitAxis)
+int b3QuantizedBvh::sortAndCalcSplittingIndex(int startIndex, int endIndex, int splitAxis)
{
int i;
- int splitIndex =startIndex;
+ int splitIndex = startIndex;
int numIndices = endIndex - startIndex;
b3Scalar splitValue;
- b3Vector3 means=b3MakeVector3(b3Scalar(0.),b3Scalar(0.),b3Scalar(0.));
- for (i=startIndex;i<endIndex;i++)
+ b3Vector3 means = b3MakeVector3(b3Scalar(0.), b3Scalar(0.), b3Scalar(0.));
+ for (i = startIndex; i < endIndex; i++)
{
- b3Vector3 center = b3Scalar(0.5)*(getAabbMax(i)+getAabbMin(i));
- means+=center;
+ b3Vector3 center = b3Scalar(0.5) * (getAabbMax(i) + getAabbMin(i));
+ means += center;
}
- means *= (b3Scalar(1.)/(b3Scalar)numIndices);
-
+ means *= (b3Scalar(1.) / (b3Scalar)numIndices);
+
splitValue = means[splitAxis];
-
+
//sort leafNodes so all values larger then splitValue comes first, and smaller values start from 'splitIndex'.
- for (i=startIndex;i<endIndex;i++)
+ for (i = startIndex; i < endIndex; i++)
{
- b3Vector3 center = b3Scalar(0.5)*(getAabbMax(i)+getAabbMin(i));
+ b3Vector3 center = b3Scalar(0.5) * (getAabbMax(i) + getAabbMin(i));
if (center[splitAxis] > splitValue)
{
//swap
- swapLeafNodes(i,splitIndex);
+ swapLeafNodes(i, splitIndex);
splitIndex++;
}
}
@@ -260,56 +241,53 @@ int b3QuantizedBvh::sortAndCalcSplittingIndex(int startIndex,int endIndex,int sp
//unbalanced1 is unsafe: it can cause stack overflows
//bool unbalanced1 = ((splitIndex==startIndex) || (splitIndex == (endIndex-1)));
- //unbalanced2 should work too: always use center (perfect balanced trees)
+ //unbalanced2 should work too: always use center (perfect balanced trees)
//bool unbalanced2 = true;
//this should be safe too:
- int rangeBalancedIndices = numIndices/3;
- bool unbalanced = ((splitIndex<=(startIndex+rangeBalancedIndices)) || (splitIndex >=(endIndex-1-rangeBalancedIndices)));
-
+ int rangeBalancedIndices = numIndices / 3;
+ bool unbalanced = ((splitIndex <= (startIndex + rangeBalancedIndices)) || (splitIndex >= (endIndex - 1 - rangeBalancedIndices)));
+
if (unbalanced)
{
- splitIndex = startIndex+ (numIndices>>1);
+ splitIndex = startIndex + (numIndices >> 1);
}
- bool unbal = (splitIndex==startIndex) || (splitIndex == (endIndex));
+ bool unbal = (splitIndex == startIndex) || (splitIndex == (endIndex));
(void)unbal;
b3Assert(!unbal);
return splitIndex;
}
-
-int b3QuantizedBvh::calcSplittingAxis(int startIndex,int endIndex)
+int b3QuantizedBvh::calcSplittingAxis(int startIndex, int endIndex)
{
int i;
- b3Vector3 means=b3MakeVector3(b3Scalar(0.),b3Scalar(0.),b3Scalar(0.));
- b3Vector3 variance=b3MakeVector3(b3Scalar(0.),b3Scalar(0.),b3Scalar(0.));
- int numIndices = endIndex-startIndex;
+ b3Vector3 means = b3MakeVector3(b3Scalar(0.), b3Scalar(0.), b3Scalar(0.));
+ b3Vector3 variance = b3MakeVector3(b3Scalar(0.), b3Scalar(0.), b3Scalar(0.));
+ int numIndices = endIndex - startIndex;
- for (i=startIndex;i<endIndex;i++)
+ for (i = startIndex; i < endIndex; i++)
{
- b3Vector3 center = b3Scalar(0.5)*(getAabbMax(i)+getAabbMin(i));
- means+=center;
+ b3Vector3 center = b3Scalar(0.5) * (getAabbMax(i) + getAabbMin(i));
+ means += center;
}
- means *= (b3Scalar(1.)/(b3Scalar)numIndices);
-
- for (i=startIndex;i<endIndex;i++)
+ means *= (b3Scalar(1.) / (b3Scalar)numIndices);
+
+ for (i = startIndex; i < endIndex; i++)
{
- b3Vector3 center = b3Scalar(0.5)*(getAabbMax(i)+getAabbMin(i));
- b3Vector3 diff2 = center-means;
+ b3Vector3 center = b3Scalar(0.5) * (getAabbMax(i) + getAabbMin(i));
+ b3Vector3 diff2 = center - means;
diff2 = diff2 * diff2;
variance += diff2;
}
- variance *= (b3Scalar(1.)/ ((b3Scalar)numIndices-1) );
-
+ variance *= (b3Scalar(1.) / ((b3Scalar)numIndices - 1));
+
return variance.maxAxis();
}
-
-
-void b3QuantizedBvh::reportAabbOverlappingNodex(b3NodeOverlapCallback* nodeCallback,const b3Vector3& aabbMin,const b3Vector3& aabbMax) const
+void b3QuantizedBvh::reportAabbOverlappingNodex(b3NodeOverlapCallback* nodeCallback, const b3Vector3& aabbMin, const b3Vector3& aabbMax) const
{
//either choose recursive traversal (walkTree) or stackless (walkStacklessTree)
@@ -318,38 +296,37 @@ void b3QuantizedBvh::reportAabbOverlappingNodex(b3NodeOverlapCallback* nodeCallb
///quantize query AABB
unsigned short int quantizedQueryAabbMin[3];
unsigned short int quantizedQueryAabbMax[3];
- quantizeWithClamp(quantizedQueryAabbMin,aabbMin,0);
- quantizeWithClamp(quantizedQueryAabbMax,aabbMax,1);
+ quantizeWithClamp(quantizedQueryAabbMin, aabbMin, 0);
+ quantizeWithClamp(quantizedQueryAabbMax, aabbMax, 1);
switch (m_traversalMode)
{
- case TRAVERSAL_STACKLESS:
- walkStacklessQuantizedTree(nodeCallback,quantizedQueryAabbMin,quantizedQueryAabbMax,0,m_curNodeIndex);
- break;
- case TRAVERSAL_STACKLESS_CACHE_FRIENDLY:
- walkStacklessQuantizedTreeCacheFriendly(nodeCallback,quantizedQueryAabbMin,quantizedQueryAabbMax);
- break;
- case TRAVERSAL_RECURSIVE:
+ case TRAVERSAL_STACKLESS:
+ walkStacklessQuantizedTree(nodeCallback, quantizedQueryAabbMin, quantizedQueryAabbMax, 0, m_curNodeIndex);
+ break;
+ case TRAVERSAL_STACKLESS_CACHE_FRIENDLY:
+ walkStacklessQuantizedTreeCacheFriendly(nodeCallback, quantizedQueryAabbMin, quantizedQueryAabbMax);
+ break;
+ case TRAVERSAL_RECURSIVE:
{
const b3QuantizedBvhNode* rootNode = &m_quantizedContiguousNodes[0];
- walkRecursiveQuantizedTreeAgainstQueryAabb(rootNode,nodeCallback,quantizedQueryAabbMin,quantizedQueryAabbMax);
+ walkRecursiveQuantizedTreeAgainstQueryAabb(rootNode, nodeCallback, quantizedQueryAabbMin, quantizedQueryAabbMax);
}
break;
- default:
- //unsupported
- b3Assert(0);
+ default:
+ //unsupported
+ b3Assert(0);
}
- } else
+ }
+ else
{
- walkStacklessTree(nodeCallback,aabbMin,aabbMax);
+ walkStacklessTree(nodeCallback, aabbMin, aabbMax);
}
}
-
static int b3s_maxIterations = 0;
-
-void b3QuantizedBvh::walkStacklessTree(b3NodeOverlapCallback* nodeCallback,const b3Vector3& aabbMin,const b3Vector3& aabbMax) const
+void b3QuantizedBvh::walkStacklessTree(b3NodeOverlapCallback* nodeCallback, const b3Vector3& aabbMin, const b3Vector3& aabbMax) const
{
b3Assert(!m_useQuantization);
@@ -363,24 +340,25 @@ void b3QuantizedBvh::walkStacklessTree(b3NodeOverlapCallback* nodeCallback,const
while (curIndex < m_curNodeIndex)
{
//catch bugs in tree data
- b3Assert (walkIterations < m_curNodeIndex);
+ b3Assert(walkIterations < m_curNodeIndex);
walkIterations++;
- aabbOverlap = b3TestAabbAgainstAabb2(aabbMin,aabbMax,rootNode->m_aabbMinOrg,rootNode->m_aabbMaxOrg);
+ aabbOverlap = b3TestAabbAgainstAabb2(aabbMin, aabbMax, rootNode->m_aabbMinOrg, rootNode->m_aabbMaxOrg);
isLeafNode = rootNode->m_escapeIndex == -1;
-
+
//PCK: unsigned instead of bool
if (isLeafNode && (aabbOverlap != 0))
{
- nodeCallback->processNode(rootNode->m_subPart,rootNode->m_triangleIndex);
- }
-
+ nodeCallback->processNode(rootNode->m_subPart, rootNode->m_triangleIndex);
+ }
+
//PCK: unsigned instead of bool
if ((aabbOverlap != 0) || isLeafNode)
{
rootNode++;
curIndex++;
- } else
+ }
+ else
{
escapeIndex = rootNode->m_escapeIndex;
rootNode += escapeIndex;
@@ -389,7 +367,6 @@ void b3QuantizedBvh::walkStacklessTree(b3NodeOverlapCallback* nodeCallback,const
}
if (b3s_maxIterations < walkIterations)
b3s_maxIterations = walkIterations;
-
}
/*
@@ -413,39 +390,38 @@ void b3QuantizedBvh::walkTree(b3OptimizedBvhNode* rootNode,b3NodeOverlapCallback
}
*/
-void b3QuantizedBvh::walkRecursiveQuantizedTreeAgainstQueryAabb(const b3QuantizedBvhNode* currentNode,b3NodeOverlapCallback* nodeCallback,unsigned short int* quantizedQueryAabbMin,unsigned short int* quantizedQueryAabbMax) const
+void b3QuantizedBvh::walkRecursiveQuantizedTreeAgainstQueryAabb(const b3QuantizedBvhNode* currentNode, b3NodeOverlapCallback* nodeCallback, unsigned short int* quantizedQueryAabbMin, unsigned short int* quantizedQueryAabbMax) const
{
b3Assert(m_useQuantization);
-
+
bool isLeafNode;
//PCK: unsigned instead of bool
unsigned aabbOverlap;
//PCK: unsigned instead of bool
- aabbOverlap = b3TestQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin,quantizedQueryAabbMax,currentNode->m_quantizedAabbMin,currentNode->m_quantizedAabbMax);
+ aabbOverlap = b3TestQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin, quantizedQueryAabbMax, currentNode->m_quantizedAabbMin, currentNode->m_quantizedAabbMax);
isLeafNode = currentNode->isLeafNode();
-
+
//PCK: unsigned instead of bool
if (aabbOverlap != 0)
{
if (isLeafNode)
{
- nodeCallback->processNode(currentNode->getPartId(),currentNode->getTriangleIndex());
- } else
+ nodeCallback->processNode(currentNode->getPartId(), currentNode->getTriangleIndex());
+ }
+ else
{
//process left and right children
- const b3QuantizedBvhNode* leftChildNode = currentNode+1;
- walkRecursiveQuantizedTreeAgainstQueryAabb(leftChildNode,nodeCallback,quantizedQueryAabbMin,quantizedQueryAabbMax);
+ const b3QuantizedBvhNode* leftChildNode = currentNode + 1;
+ walkRecursiveQuantizedTreeAgainstQueryAabb(leftChildNode, nodeCallback, quantizedQueryAabbMin, quantizedQueryAabbMax);
- const b3QuantizedBvhNode* rightChildNode = leftChildNode->isLeafNode() ? leftChildNode+1:leftChildNode+leftChildNode->getEscapeIndex();
- walkRecursiveQuantizedTreeAgainstQueryAabb(rightChildNode,nodeCallback,quantizedQueryAabbMin,quantizedQueryAabbMax);
+ const b3QuantizedBvhNode* rightChildNode = leftChildNode->isLeafNode() ? leftChildNode + 1 : leftChildNode + leftChildNode->getEscapeIndex();
+ walkRecursiveQuantizedTreeAgainstQueryAabb(rightChildNode, nodeCallback, quantizedQueryAabbMin, quantizedQueryAabbMax);
}
- }
+ }
}
-
-
-void b3QuantizedBvh::walkStacklessTreeAgainstRay(b3NodeOverlapCallback* nodeCallback, const b3Vector3& raySource, const b3Vector3& rayTarget, const b3Vector3& aabbMin, const b3Vector3& aabbMax, int startNodeIndex,int endNodeIndex) const
+void b3QuantizedBvh::walkStacklessTreeAgainstRay(b3NodeOverlapCallback* nodeCallback, const b3Vector3& raySource, const b3Vector3& rayTarget, const b3Vector3& aabbMin, const b3Vector3& aabbMax, int startNodeIndex, int endNodeIndex) const
{
b3Assert(!m_useQuantization);
@@ -454,11 +430,11 @@ void b3QuantizedBvh::walkStacklessTreeAgainstRay(b3NodeOverlapCallback* nodeCall
int walkIterations = 0;
bool isLeafNode;
//PCK: unsigned instead of bool
- unsigned aabbOverlap=0;
- unsigned rayBoxOverlap=0;
+ unsigned aabbOverlap = 0;
+ unsigned rayBoxOverlap = 0;
b3Scalar lambda_max = 1.0;
-
- /* Quick pruning by quantized box */
+
+ /* Quick pruning by quantized box */
b3Vector3 rayAabbMin = raySource;
b3Vector3 rayAabbMax = raySource;
rayAabbMin.setMin(rayTarget);
@@ -469,15 +445,15 @@ void b3QuantizedBvh::walkStacklessTreeAgainstRay(b3NodeOverlapCallback* nodeCall
rayAabbMax += aabbMax;
#ifdef RAYAABB2
- b3Vector3 rayDir = (rayTarget-raySource);
- rayDir.normalize ();
- lambda_max = rayDir.dot(rayTarget-raySource);
+ b3Vector3 rayDir = (rayTarget - raySource);
+ rayDir.normalize();
+ lambda_max = rayDir.dot(rayTarget - raySource);
///what about division by zero? --> just set rayDirection[i] to 1.0
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 sign[3] = { rayDirectionInverse[0] < 0.0, rayDirectionInverse[1] < 0.0, rayDirectionInverse[2] < 0.0};
+ unsigned int sign[3] = {rayDirectionInverse[0] < 0.0, rayDirectionInverse[1] < 0.0, rayDirectionInverse[2] < 0.0};
#endif
b3Vector3 bounds[2];
@@ -486,7 +462,7 @@ void b3QuantizedBvh::walkStacklessTreeAgainstRay(b3NodeOverlapCallback* nodeCall
{
b3Scalar param = 1.0;
//catch bugs in tree data
- b3Assert (walkIterations < m_curNodeIndex);
+ b3Assert(walkIterations < m_curNodeIndex);
walkIterations++;
@@ -496,34 +472,35 @@ void b3QuantizedBvh::walkStacklessTreeAgainstRay(b3NodeOverlapCallback* nodeCall
bounds[0] -= aabbMax;
bounds[1] -= aabbMin;
- aabbOverlap = b3TestAabbAgainstAabb2(rayAabbMin,rayAabbMax,rootNode->m_aabbMinOrg,rootNode->m_aabbMaxOrg);
+ aabbOverlap = b3TestAabbAgainstAabb2(rayAabbMin, rayAabbMax, rootNode->m_aabbMinOrg, rootNode->m_aabbMaxOrg);
//perhaps profile if it is worth doing the aabbOverlap test first
#ifdef RAYAABB2
- ///careful with this check: need to check division by zero (above) and fix the unQuantize method
- ///thanks Joerg/hiker for the reproduction case!
- ///http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=9&t=1858
- rayBoxOverlap = aabbOverlap ? b3RayAabb2 (raySource, rayDirectionInverse, sign, bounds, param, 0.0f, lambda_max) : false;
+ ///careful with this check: need to check division by zero (above) and fix the unQuantize method
+ ///thanks Joerg/hiker for the reproduction case!
+ ///http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=9&t=1858
+ rayBoxOverlap = aabbOverlap ? b3RayAabb2(raySource, rayDirectionInverse, sign, bounds, param, 0.0f, lambda_max) : false;
#else
b3Vector3 normal;
- rayBoxOverlap = b3RayAabb(raySource, rayTarget,bounds[0],bounds[1],param, normal);
+ rayBoxOverlap = b3RayAabb(raySource, rayTarget, bounds[0], bounds[1], param, normal);
#endif
isLeafNode = rootNode->m_escapeIndex == -1;
-
+
//PCK: unsigned instead of bool
if (isLeafNode && (rayBoxOverlap != 0))
{
- nodeCallback->processNode(rootNode->m_subPart,rootNode->m_triangleIndex);
- }
-
+ nodeCallback->processNode(rootNode->m_subPart, rootNode->m_triangleIndex);
+ }
+
//PCK: unsigned instead of bool
if ((rayBoxOverlap != 0) || isLeafNode)
{
rootNode++;
curIndex++;
- } else
+ }
+ else
{
escapeIndex = rootNode->m_escapeIndex;
rootNode += escapeIndex;
@@ -532,15 +509,12 @@ void b3QuantizedBvh::walkStacklessTreeAgainstRay(b3NodeOverlapCallback* nodeCall
}
if (b3s_maxIterations < walkIterations)
b3s_maxIterations = walkIterations;
-
}
-
-
-void b3QuantizedBvh::walkStacklessQuantizedTreeAgainstRay(b3NodeOverlapCallback* nodeCallback, const b3Vector3& raySource, const b3Vector3& rayTarget, const b3Vector3& aabbMin, const b3Vector3& aabbMax, int startNodeIndex,int endNodeIndex) const
+void b3QuantizedBvh::walkStacklessQuantizedTreeAgainstRay(b3NodeOverlapCallback* nodeCallback, const b3Vector3& raySource, const b3Vector3& rayTarget, const b3Vector3& aabbMin, const b3Vector3& aabbMax, int startNodeIndex, int endNodeIndex) const
{
b3Assert(m_useQuantization);
-
+
int curIndex = startNodeIndex;
int walkIterations = 0;
int subTreeSize = endNodeIndex - startNodeIndex;
@@ -548,7 +522,7 @@ void b3QuantizedBvh::walkStacklessQuantizedTreeAgainstRay(b3NodeOverlapCallback*
const b3QuantizedBvhNode* rootNode = &m_quantizedContiguousNodes[startNodeIndex];
int escapeIndex;
-
+
bool isLeafNode;
//PCK: unsigned instead of bool
unsigned boxBoxOverlap = 0;
@@ -557,14 +531,14 @@ void b3QuantizedBvh::walkStacklessQuantizedTreeAgainstRay(b3NodeOverlapCallback*
b3Scalar lambda_max = 1.0;
#ifdef RAYAABB2
- b3Vector3 rayDirection = (rayTarget-raySource);
- rayDirection.normalize ();
- lambda_max = rayDirection.dot(rayTarget-raySource);
+ b3Vector3 rayDirection = (rayTarget - raySource);
+ rayDirection.normalize();
+ lambda_max = rayDirection.dot(rayTarget - raySource);
///what about division by zero? --> just set rayDirection[i] to 1.0
rayDirection[0] = rayDirection[0] == b3Scalar(0.0) ? b3Scalar(B3_LARGE_FLOAT) : b3Scalar(1.0) / rayDirection[0];
rayDirection[1] = rayDirection[1] == b3Scalar(0.0) ? b3Scalar(B3_LARGE_FLOAT) : b3Scalar(1.0) / rayDirection[1];
rayDirection[2] = rayDirection[2] == b3Scalar(0.0) ? b3Scalar(B3_LARGE_FLOAT) : b3Scalar(1.0) / rayDirection[2];
- unsigned int sign[3] = { rayDirection[0] < 0.0, rayDirection[1] < 0.0, rayDirection[2] < 0.0};
+ unsigned int sign[3] = {rayDirection[0] < 0.0, rayDirection[1] < 0.0, rayDirection[2] < 0.0};
#endif
/* Quick pruning by quantized box */
@@ -579,37 +553,36 @@ void b3QuantizedBvh::walkStacklessQuantizedTreeAgainstRay(b3NodeOverlapCallback*
unsigned short int quantizedQueryAabbMin[3];
unsigned short int quantizedQueryAabbMax[3];
- quantizeWithClamp(quantizedQueryAabbMin,rayAabbMin,0);
- quantizeWithClamp(quantizedQueryAabbMax,rayAabbMax,1);
+ quantizeWithClamp(quantizedQueryAabbMin, rayAabbMin, 0);
+ quantizeWithClamp(quantizedQueryAabbMax, rayAabbMax, 1);
while (curIndex < endNodeIndex)
{
-
//#define VISUALLY_ANALYZE_BVH 1
#ifdef VISUALLY_ANALYZE_BVH
//some code snippet to debugDraw aabb, to visually analyze bvh structure
static int drawPatch = 0;
//need some global access to a debugDrawer
extern b3IDebugDraw* debugDrawerPtr;
- if (curIndex==drawPatch)
+ if (curIndex == drawPatch)
{
- b3Vector3 aabbMin,aabbMax;
+ b3Vector3 aabbMin, aabbMax;
aabbMin = unQuantize(rootNode->m_quantizedAabbMin);
aabbMax = unQuantize(rootNode->m_quantizedAabbMax);
- b3Vector3 color(1,0,0);
- debugDrawerPtr->drawAabb(aabbMin,aabbMax,color);
+ b3Vector3 color(1, 0, 0);
+ debugDrawerPtr->drawAabb(aabbMin, aabbMax, color);
}
-#endif//VISUALLY_ANALYZE_BVH
+#endif //VISUALLY_ANALYZE_BVH
//catch bugs in tree data
- b3Assert (walkIterations < subTreeSize);
+ b3Assert(walkIterations < subTreeSize);
walkIterations++;
//PCK: unsigned instead of bool
// only interested if this is closer than any previous hit
b3Scalar param = 1.0;
rayBoxOverlap = 0;
- boxBoxOverlap = b3TestQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin,quantizedQueryAabbMax,rootNode->m_quantizedAabbMin,rootNode->m_quantizedAabbMax);
+ boxBoxOverlap = b3TestQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin, quantizedQueryAabbMax, rootNode->m_quantizedAabbMin, rootNode->m_quantizedAabbMax);
isLeafNode = rootNode->isLeafNode();
if (boxBoxOverlap)
{
@@ -634,24 +607,25 @@ void b3QuantizedBvh::walkStacklessQuantizedTreeAgainstRay(b3NodeOverlapCallback*
///http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=9&t=1858
//B3_PROFILE("b3RayAabb2");
- rayBoxOverlap = b3RayAabb2 (raySource, rayDirection, sign, bounds, param, 0.0f, lambda_max);
-
+ rayBoxOverlap = b3RayAabb2(raySource, rayDirection, sign, bounds, param, 0.0f, lambda_max);
+
#else
- rayBoxOverlap = true;//b3RayAabb(raySource, rayTarget, bounds[0], bounds[1], param, normal);
+ rayBoxOverlap = true; //b3RayAabb(raySource, rayTarget, bounds[0], bounds[1], param, normal);
#endif
}
-
+
if (isLeafNode && rayBoxOverlap)
{
- nodeCallback->processNode(rootNode->getPartId(),rootNode->getTriangleIndex());
+ nodeCallback->processNode(rootNode->getPartId(), rootNode->getTriangleIndex());
}
-
+
//PCK: unsigned instead of bool
if ((rayBoxOverlap != 0) || isLeafNode)
{
rootNode++;
curIndex++;
- } else
+ }
+ else
{
escapeIndex = rootNode->getEscapeIndex();
rootNode += escapeIndex;
@@ -660,13 +634,12 @@ void b3QuantizedBvh::walkStacklessQuantizedTreeAgainstRay(b3NodeOverlapCallback*
}
if (b3s_maxIterations < walkIterations)
b3s_maxIterations = walkIterations;
-
}
-void b3QuantizedBvh::walkStacklessQuantizedTree(b3NodeOverlapCallback* nodeCallback,unsigned short int* quantizedQueryAabbMin,unsigned short int* quantizedQueryAabbMax,int startNodeIndex,int endNodeIndex) const
+void b3QuantizedBvh::walkStacklessQuantizedTree(b3NodeOverlapCallback* nodeCallback, unsigned short int* quantizedQueryAabbMin, unsigned short int* quantizedQueryAabbMax, int startNodeIndex, int endNodeIndex) const
{
b3Assert(m_useQuantization);
-
+
int curIndex = startNodeIndex;
int walkIterations = 0;
int subTreeSize = endNodeIndex - startNodeIndex;
@@ -674,49 +647,49 @@ void b3QuantizedBvh::walkStacklessQuantizedTree(b3NodeOverlapCallback* nodeCallb
const b3QuantizedBvhNode* rootNode = &m_quantizedContiguousNodes[startNodeIndex];
int escapeIndex;
-
+
bool isLeafNode;
//PCK: unsigned instead of bool
unsigned aabbOverlap;
while (curIndex < endNodeIndex)
{
-
//#define VISUALLY_ANALYZE_BVH 1
#ifdef VISUALLY_ANALYZE_BVH
//some code snippet to debugDraw aabb, to visually analyze bvh structure
static int drawPatch = 0;
//need some global access to a debugDrawer
extern b3IDebugDraw* debugDrawerPtr;
- if (curIndex==drawPatch)
+ if (curIndex == drawPatch)
{
- b3Vector3 aabbMin,aabbMax;
+ b3Vector3 aabbMin, aabbMax;
aabbMin = unQuantize(rootNode->m_quantizedAabbMin);
aabbMax = unQuantize(rootNode->m_quantizedAabbMax);
- b3Vector3 color(1,0,0);
- debugDrawerPtr->drawAabb(aabbMin,aabbMax,color);
+ b3Vector3 color(1, 0, 0);
+ debugDrawerPtr->drawAabb(aabbMin, aabbMax, color);
}
-#endif//VISUALLY_ANALYZE_BVH
+#endif //VISUALLY_ANALYZE_BVH
//catch bugs in tree data
- b3Assert (walkIterations < subTreeSize);
+ b3Assert(walkIterations < subTreeSize);
walkIterations++;
//PCK: unsigned instead of bool
- aabbOverlap = b3TestQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin,quantizedQueryAabbMax,rootNode->m_quantizedAabbMin,rootNode->m_quantizedAabbMax);
+ aabbOverlap = b3TestQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin, quantizedQueryAabbMax, rootNode->m_quantizedAabbMin, rootNode->m_quantizedAabbMax);
isLeafNode = rootNode->isLeafNode();
-
+
if (isLeafNode && aabbOverlap)
{
- nodeCallback->processNode(rootNode->getPartId(),rootNode->getTriangleIndex());
- }
-
+ nodeCallback->processNode(rootNode->getPartId(), rootNode->getTriangleIndex());
+ }
+
//PCK: unsigned instead of bool
if ((aabbOverlap != 0) || isLeafNode)
{
rootNode++;
curIndex++;
- } else
+ }
+ else
{
escapeIndex = rootNode->getEscapeIndex();
rootNode += escapeIndex;
@@ -725,40 +698,36 @@ void b3QuantizedBvh::walkStacklessQuantizedTree(b3NodeOverlapCallback* nodeCallb
}
if (b3s_maxIterations < walkIterations)
b3s_maxIterations = walkIterations;
-
}
//This traversal can be called from Playstation 3 SPU
-void b3QuantizedBvh::walkStacklessQuantizedTreeCacheFriendly(b3NodeOverlapCallback* nodeCallback,unsigned short int* quantizedQueryAabbMin,unsigned short int* quantizedQueryAabbMax) const
+void b3QuantizedBvh::walkStacklessQuantizedTreeCacheFriendly(b3NodeOverlapCallback* nodeCallback, unsigned short int* quantizedQueryAabbMin, unsigned short int* quantizedQueryAabbMax) const
{
b3Assert(m_useQuantization);
int i;
-
- for (i=0;i<this->m_SubtreeHeaders.size();i++)
+ for (i = 0; i < this->m_SubtreeHeaders.size(); i++)
{
const b3BvhSubtreeInfo& subtree = m_SubtreeHeaders[i];
//PCK: unsigned instead of bool
- unsigned overlap = b3TestQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin,quantizedQueryAabbMax,subtree.m_quantizedAabbMin,subtree.m_quantizedAabbMax);
+ unsigned overlap = b3TestQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin, quantizedQueryAabbMax, subtree.m_quantizedAabbMin, subtree.m_quantizedAabbMax);
if (overlap != 0)
{
- walkStacklessQuantizedTree(nodeCallback,quantizedQueryAabbMin,quantizedQueryAabbMax,
- subtree.m_rootNodeIndex,
- subtree.m_rootNodeIndex+subtree.m_subtreeSize);
+ walkStacklessQuantizedTree(nodeCallback, quantizedQueryAabbMin, quantizedQueryAabbMax,
+ subtree.m_rootNodeIndex,
+ subtree.m_rootNodeIndex + subtree.m_subtreeSize);
}
}
}
-
-void b3QuantizedBvh::reportRayOverlappingNodex (b3NodeOverlapCallback* nodeCallback, const b3Vector3& raySource, const b3Vector3& rayTarget) const
+void b3QuantizedBvh::reportRayOverlappingNodex(b3NodeOverlapCallback* nodeCallback, const b3Vector3& raySource, const b3Vector3& rayTarget) const
{
- reportBoxCastOverlappingNodex(nodeCallback,raySource,rayTarget,b3MakeVector3(0,0,0),b3MakeVector3(0,0,0));
+ reportBoxCastOverlappingNodex(nodeCallback, raySource, rayTarget, b3MakeVector3(0, 0, 0), b3MakeVector3(0, 0, 0));
}
-
-void b3QuantizedBvh::reportBoxCastOverlappingNodex(b3NodeOverlapCallback* nodeCallback, const b3Vector3& raySource, const b3Vector3& rayTarget, const b3Vector3& aabbMin,const b3Vector3& aabbMax) const
+void b3QuantizedBvh::reportBoxCastOverlappingNodex(b3NodeOverlapCallback* nodeCallback, const b3Vector3& raySource, const b3Vector3& rayTarget, const b3Vector3& aabbMin, const b3Vector3& aabbMax) const
{
//always use stackless
@@ -782,31 +751,31 @@ void b3QuantizedBvh::reportBoxCastOverlappingNodex(b3NodeOverlapCallback* nodeCa
reportAabbOverlappingNodex(nodeCallback,qaabbMin,qaabbMax);
}
*/
-
}
-
-void b3QuantizedBvh::swapLeafNodes(int i,int splitIndex)
+void b3QuantizedBvh::swapLeafNodes(int i, int splitIndex)
{
if (m_useQuantization)
{
- b3QuantizedBvhNode tmp = m_quantizedLeafNodes[i];
- m_quantizedLeafNodes[i] = m_quantizedLeafNodes[splitIndex];
- m_quantizedLeafNodes[splitIndex] = tmp;
- } else
+ b3QuantizedBvhNode tmp = m_quantizedLeafNodes[i];
+ m_quantizedLeafNodes[i] = m_quantizedLeafNodes[splitIndex];
+ m_quantizedLeafNodes[splitIndex] = tmp;
+ }
+ else
{
- b3OptimizedBvhNode tmp = m_leafNodes[i];
- m_leafNodes[i] = m_leafNodes[splitIndex];
- m_leafNodes[splitIndex] = tmp;
+ b3OptimizedBvhNode tmp = m_leafNodes[i];
+ m_leafNodes[i] = m_leafNodes[splitIndex];
+ m_leafNodes[splitIndex] = tmp;
}
}
-void b3QuantizedBvh::assignInternalNodeFromLeafNode(int internalNode,int leafNodeIndex)
+void b3QuantizedBvh::assignInternalNodeFromLeafNode(int internalNode, int leafNodeIndex)
{
if (m_useQuantization)
{
m_quantizedContiguousNodes[internalNode] = m_quantizedLeafNodes[leafNodeIndex];
- } else
+ }
+ else
{
m_contiguousNodes[internalNode] = m_leafNodes[leafNodeIndex];
}
@@ -823,11 +792,10 @@ static const unsigned BVH_ALIGNMENT_MASK = BVH_ALIGNMENT-1;
static const unsigned BVH_ALIGNMENT_BLOCKS = 2;
#endif
-
unsigned int b3QuantizedBvh::getAlignmentSerializationPadding()
{
// I changed this to 0 since the extra padding is not needed or used.
- return 0;//BVH_ALIGNMENT_BLOCKS * BVH_ALIGNMENT;
+ return 0; //BVH_ALIGNMENT_BLOCKS * BVH_ALIGNMENT;
}
unsigned b3QuantizedBvh::calculateSerializeBufferSize() const
@@ -841,12 +809,12 @@ unsigned b3QuantizedBvh::calculateSerializeBufferSize() const
return baseSize + m_curNodeIndex * sizeof(b3OptimizedBvhNode);
}
-bool b3QuantizedBvh::serialize(void *o_alignedDataBuffer, unsigned /*i_dataBufferSize */, bool i_swapEndian) const
+bool b3QuantizedBvh::serialize(void* o_alignedDataBuffer, unsigned /*i_dataBufferSize */, bool i_swapEndian) const
{
b3Assert(m_subtreeHeaderCount == m_SubtreeHeaders.size());
m_subtreeHeaderCount = m_SubtreeHeaders.size();
-/* if (i_dataBufferSize < calculateSerializeBufferSize() || o_alignedDataBuffer == NULL || (((unsigned)o_alignedDataBuffer & BVH_ALIGNMENT_MASK) != 0))
+ /* if (i_dataBufferSize < calculateSerializeBufferSize() || o_alignedDataBuffer == NULL || (((unsigned)o_alignedDataBuffer & BVH_ALIGNMENT_MASK) != 0))
{
///check alignedment for buffer?
b3Assert(0);
@@ -854,7 +822,7 @@ bool b3QuantizedBvh::serialize(void *o_alignedDataBuffer, unsigned /*i_dataBuffe
}
*/
- b3QuantizedBvh *targetBvh = (b3QuantizedBvh *)o_alignedDataBuffer;
+ b3QuantizedBvh* targetBvh = (b3QuantizedBvh*)o_alignedDataBuffer;
// construct the class so the virtual function table, etc will be set up
// Also, m_leafNodes and m_quantizedLeafNodes will be initialized to default values by the constructor
@@ -864,10 +832,9 @@ bool b3QuantizedBvh::serialize(void *o_alignedDataBuffer, unsigned /*i_dataBuffe
{
targetBvh->m_curNodeIndex = static_cast<int>(b3SwapEndian(m_curNodeIndex));
-
- b3SwapVector3Endian(m_bvhAabbMin,targetBvh->m_bvhAabbMin);
- b3SwapVector3Endian(m_bvhAabbMax,targetBvh->m_bvhAabbMax);
- b3SwapVector3Endian(m_bvhQuantization,targetBvh->m_bvhQuantization);
+ b3SwapVector3Endian(m_bvhAabbMin, targetBvh->m_bvhAabbMin);
+ b3SwapVector3Endian(m_bvhAabbMax, targetBvh->m_bvhAabbMax);
+ b3SwapVector3Endian(m_bvhQuantization, targetBvh->m_bvhQuantization);
targetBvh->m_traversalMode = (b3TraversalMode)b3SwapEndian(m_traversalMode);
targetBvh->m_subtreeHeaderCount = static_cast<int>(b3SwapEndian(m_subtreeHeaderCount));
@@ -884,12 +851,12 @@ bool b3QuantizedBvh::serialize(void *o_alignedDataBuffer, unsigned /*i_dataBuffe
targetBvh->m_useQuantization = m_useQuantization;
- unsigned char *nodeData = (unsigned char *)targetBvh;
+ unsigned char* nodeData = (unsigned char*)targetBvh;
nodeData += sizeof(b3QuantizedBvh);
-
- unsigned sizeToAdd = 0;//(BVH_ALIGNMENT-((unsigned)nodeData & BVH_ALIGNMENT_MASK))&BVH_ALIGNMENT_MASK;
+
+ unsigned sizeToAdd = 0; //(BVH_ALIGNMENT-((unsigned)nodeData & BVH_ALIGNMENT_MASK))&BVH_ALIGNMENT_MASK;
nodeData += sizeToAdd;
-
+
int nodeCount = m_curNodeIndex;
if (m_useQuantization)
@@ -915,7 +882,6 @@ bool b3QuantizedBvh::serialize(void *o_alignedDataBuffer, unsigned /*i_dataBuffe
{
for (int nodeIndex = 0; nodeIndex < nodeCount; nodeIndex++)
{
-
targetBvh->m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMin[0] = m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMin[0];
targetBvh->m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMin[1] = m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMin[1];
targetBvh->m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMin[2] = m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMin[2];
@@ -925,8 +891,6 @@ bool b3QuantizedBvh::serialize(void *o_alignedDataBuffer, unsigned /*i_dataBuffe
targetBvh->m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMax[2] = m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMax[2];
targetBvh->m_quantizedContiguousNodes[nodeIndex].m_escapeIndexOrTriangleIndex = m_quantizedContiguousNodes[nodeIndex].m_escapeIndexOrTriangleIndex;
-
-
}
}
nodeData += sizeof(b3QuantizedBvhNode) * nodeCount;
@@ -972,7 +936,7 @@ bool b3QuantizedBvh::serialize(void *o_alignedDataBuffer, unsigned /*i_dataBuffe
targetBvh->m_contiguousNodes.initializeFromBuffer(NULL, 0, 0);
}
- sizeToAdd = 0;//(BVH_ALIGNMENT-((unsigned)nodeData & BVH_ALIGNMENT_MASK))&BVH_ALIGNMENT_MASK;
+ sizeToAdd = 0; //(BVH_ALIGNMENT-((unsigned)nodeData & BVH_ALIGNMENT_MASK))&BVH_ALIGNMENT_MASK;
nodeData += sizeToAdd;
// Now serialize the subtree headers
@@ -1027,14 +991,13 @@ bool b3QuantizedBvh::serialize(void *o_alignedDataBuffer, unsigned /*i_dataBuffe
return true;
}
-b3QuantizedBvh *b3QuantizedBvh::deSerializeInPlace(void *i_alignedDataBuffer, unsigned int i_dataBufferSize, bool i_swapEndian)
+b3QuantizedBvh* b3QuantizedBvh::deSerializeInPlace(void* i_alignedDataBuffer, unsigned int i_dataBufferSize, bool i_swapEndian)
{
-
- if (i_alignedDataBuffer == NULL)// || (((unsigned)i_alignedDataBuffer & BVH_ALIGNMENT_MASK) != 0))
+ if (i_alignedDataBuffer == NULL) // || (((unsigned)i_alignedDataBuffer & BVH_ALIGNMENT_MASK) != 0))
{
return NULL;
}
- b3QuantizedBvh *bvh = (b3QuantizedBvh *)i_alignedDataBuffer;
+ b3QuantizedBvh* bvh = (b3QuantizedBvh*)i_alignedDataBuffer;
if (i_swapEndian)
{
@@ -1056,12 +1019,12 @@ b3QuantizedBvh *b3QuantizedBvh::deSerializeInPlace(void *i_alignedDataBuffer, un
return NULL;
}
- unsigned char *nodeData = (unsigned char *)bvh;
+ unsigned char* nodeData = (unsigned char*)bvh;
nodeData += sizeof(b3QuantizedBvh);
-
- unsigned sizeToAdd = 0;//(BVH_ALIGNMENT-((unsigned)nodeData & BVH_ALIGNMENT_MASK))&BVH_ALIGNMENT_MASK;
+
+ unsigned sizeToAdd = 0; //(BVH_ALIGNMENT-((unsigned)nodeData & BVH_ALIGNMENT_MASK))&BVH_ALIGNMENT_MASK;
nodeData += sizeToAdd;
-
+
int nodeCount = bvh->m_curNodeIndex;
// Must call placement new to fill in virtual function table, etc, but we don't want to overwrite most data, so call a special version of the constructor
@@ -1099,7 +1062,7 @@ b3QuantizedBvh *b3QuantizedBvh::deSerializeInPlace(void *i_alignedDataBuffer, un
{
b3UnSwapVector3Endian(bvh->m_contiguousNodes[nodeIndex].m_aabbMinOrg);
b3UnSwapVector3Endian(bvh->m_contiguousNodes[nodeIndex].m_aabbMaxOrg);
-
+
bvh->m_contiguousNodes[nodeIndex].m_escapeIndex = static_cast<int>(b3SwapEndian(bvh->m_contiguousNodes[nodeIndex].m_escapeIndex));
bvh->m_contiguousNodes[nodeIndex].m_subPart = static_cast<int>(b3SwapEndian(bvh->m_contiguousNodes[nodeIndex].m_subPart));
bvh->m_contiguousNodes[nodeIndex].m_triangleIndex = static_cast<int>(b3SwapEndian(bvh->m_contiguousNodes[nodeIndex].m_triangleIndex));
@@ -1108,7 +1071,7 @@ b3QuantizedBvh *b3QuantizedBvh::deSerializeInPlace(void *i_alignedDataBuffer, un
nodeData += sizeof(b3OptimizedBvhNode) * nodeCount;
}
- sizeToAdd = 0;//(BVH_ALIGNMENT-((unsigned)nodeData & BVH_ALIGNMENT_MASK))&BVH_ALIGNMENT_MASK;
+ sizeToAdd = 0; //(BVH_ALIGNMENT-((unsigned)nodeData & BVH_ALIGNMENT_MASK))&BVH_ALIGNMENT_MASK;
nodeData += sizeToAdd;
// Now serialize the subtree headers
@@ -1134,13 +1097,11 @@ b3QuantizedBvh *b3QuantizedBvh::deSerializeInPlace(void *i_alignedDataBuffer, un
}
// Constructor that prevents b3Vector3's default constructor from being called
-b3QuantizedBvh::b3QuantizedBvh(b3QuantizedBvh &self, bool /* ownsMemory */) :
-m_bvhAabbMin(self.m_bvhAabbMin),
-m_bvhAabbMax(self.m_bvhAabbMax),
-m_bvhQuantization(self.m_bvhQuantization),
-m_bulletVersion(B3_BULLET_VERSION)
+b3QuantizedBvh::b3QuantizedBvh(b3QuantizedBvh& self, bool /* ownsMemory */) : m_bvhAabbMin(self.m_bvhAabbMin),
+ m_bvhAabbMax(self.m_bvhAabbMax),
+ m_bvhQuantization(self.m_bvhQuantization),
+ m_bulletVersion(B3_BULLET_VERSION)
{
-
}
void b3QuantizedBvh::deSerializeFloat(struct b3QuantizedBvhFloatData& quantizedBvhFloatData)
@@ -1150,8 +1111,8 @@ void b3QuantizedBvh::deSerializeFloat(struct b3QuantizedBvhFloatData& quantizedB
m_bvhQuantization.deSerializeFloat(quantizedBvhFloatData.m_bvhQuantization);
m_curNodeIndex = quantizedBvhFloatData.m_curNodeIndex;
- m_useQuantization = quantizedBvhFloatData.m_useQuantization!=0;
-
+ m_useQuantization = quantizedBvhFloatData.m_useQuantization != 0;
+
{
int numElem = quantizedBvhFloatData.m_numContiguousLeafNodes;
m_contiguousNodes.resize(numElem);
@@ -1160,7 +1121,7 @@ void b3QuantizedBvh::deSerializeFloat(struct b3QuantizedBvhFloatData& quantizedB
{
b3OptimizedBvhNodeFloatData* memPtr = quantizedBvhFloatData.m_contiguousNodesPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
m_contiguousNodes[i].m_aabbMaxOrg.deSerializeFloat(memPtr->m_aabbMaxOrg);
m_contiguousNodes[i].m_aabbMinOrg.deSerializeFloat(memPtr->m_aabbMinOrg);
@@ -1174,11 +1135,11 @@ void b3QuantizedBvh::deSerializeFloat(struct b3QuantizedBvhFloatData& quantizedB
{
int numElem = quantizedBvhFloatData.m_numQuantizedContiguousNodes;
m_quantizedContiguousNodes.resize(numElem);
-
+
if (numElem)
{
b3QuantizedBvhNodeData* memPtr = quantizedBvhFloatData.m_quantizedContiguousNodesPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
m_quantizedContiguousNodes[i].m_escapeIndexOrTriangleIndex = memPtr->m_escapeIndexOrTriangleIndex;
m_quantizedContiguousNodes[i].m_quantizedAabbMax[0] = memPtr->m_quantizedAabbMax[0];
@@ -1192,16 +1153,16 @@ void b3QuantizedBvh::deSerializeFloat(struct b3QuantizedBvhFloatData& quantizedB
}
m_traversalMode = b3TraversalMode(quantizedBvhFloatData.m_traversalMode);
-
+
{
int numElem = quantizedBvhFloatData.m_numSubtreeHeaders;
m_SubtreeHeaders.resize(numElem);
if (numElem)
{
b3BvhSubtreeInfoData* memPtr = quantizedBvhFloatData.m_subTreeInfoPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
- m_SubtreeHeaders[i].m_quantizedAabbMax[0] = memPtr->m_quantizedAabbMax[0] ;
+ m_SubtreeHeaders[i].m_quantizedAabbMax[0] = memPtr->m_quantizedAabbMax[0];
m_SubtreeHeaders[i].m_quantizedAabbMax[1] = memPtr->m_quantizedAabbMax[1];
m_SubtreeHeaders[i].m_quantizedAabbMax[2] = memPtr->m_quantizedAabbMax[2];
m_SubtreeHeaders[i].m_quantizedAabbMin[0] = memPtr->m_quantizedAabbMin[0];
@@ -1221,8 +1182,8 @@ void b3QuantizedBvh::deSerializeDouble(struct b3QuantizedBvhDoubleData& quantize
m_bvhQuantization.deSerializeDouble(quantizedBvhDoubleData.m_bvhQuantization);
m_curNodeIndex = quantizedBvhDoubleData.m_curNodeIndex;
- m_useQuantization = quantizedBvhDoubleData.m_useQuantization!=0;
-
+ m_useQuantization = quantizedBvhDoubleData.m_useQuantization != 0;
+
{
int numElem = quantizedBvhDoubleData.m_numContiguousLeafNodes;
m_contiguousNodes.resize(numElem);
@@ -1231,7 +1192,7 @@ void b3QuantizedBvh::deSerializeDouble(struct b3QuantizedBvhDoubleData& quantize
{
b3OptimizedBvhNodeDoubleData* memPtr = quantizedBvhDoubleData.m_contiguousNodesPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
m_contiguousNodes[i].m_aabbMaxOrg.deSerializeDouble(memPtr->m_aabbMaxOrg);
m_contiguousNodes[i].m_aabbMinOrg.deSerializeDouble(memPtr->m_aabbMinOrg);
@@ -1245,11 +1206,11 @@ void b3QuantizedBvh::deSerializeDouble(struct b3QuantizedBvhDoubleData& quantize
{
int numElem = quantizedBvhDoubleData.m_numQuantizedContiguousNodes;
m_quantizedContiguousNodes.resize(numElem);
-
+
if (numElem)
{
b3QuantizedBvhNodeData* memPtr = quantizedBvhDoubleData.m_quantizedContiguousNodesPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
m_quantizedContiguousNodes[i].m_escapeIndexOrTriangleIndex = memPtr->m_escapeIndexOrTriangleIndex;
m_quantizedContiguousNodes[i].m_quantizedAabbMax[0] = memPtr->m_quantizedAabbMax[0];
@@ -1263,16 +1224,16 @@ void b3QuantizedBvh::deSerializeDouble(struct b3QuantizedBvhDoubleData& quantize
}
m_traversalMode = b3TraversalMode(quantizedBvhDoubleData.m_traversalMode);
-
+
{
int numElem = quantizedBvhDoubleData.m_numSubtreeHeaders;
m_SubtreeHeaders.resize(numElem);
if (numElem)
{
b3BvhSubtreeInfoData* memPtr = quantizedBvhDoubleData.m_subTreeInfoPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
- m_SubtreeHeaders[i].m_quantizedAabbMax[0] = memPtr->m_quantizedAabbMax[0] ;
+ m_SubtreeHeaders[i].m_quantizedAabbMax[0] = memPtr->m_quantizedAabbMax[0];
m_SubtreeHeaders[i].m_quantizedAabbMax[1] = memPtr->m_quantizedAabbMax[1];
m_SubtreeHeaders[i].m_quantizedAabbMax[2] = memPtr->m_quantizedAabbMax[2];
m_SubtreeHeaders[i].m_quantizedAabbMin[0] = memPtr->m_quantizedAabbMin[0];
@@ -1283,19 +1244,11 @@ void b3QuantizedBvh::deSerializeDouble(struct b3QuantizedBvhDoubleData& quantize
}
}
}
-
}
-
-
///fills the dataBuffer and returns the struct name (and 0 on failure)
-const char* b3QuantizedBvh::serialize(void* dataBuffer, b3Serializer* serializer) const
+const char* b3QuantizedBvh::serialize(void* dataBuffer, b3Serializer* serializer) const
{
b3Assert(0);
return 0;
}
-
-
-
-
-
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3QuantizedBvh.h b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3QuantizedBvh.h
index 63c523c758..48b41abcad 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3QuantizedBvh.h
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3QuantizedBvh.h
@@ -22,11 +22,11 @@ class b3Serializer;
#ifdef DEBUG_CHECK_DEQUANTIZATION
#ifdef __SPU__
#define printf spu_printf
-#endif //__SPU__
+#endif //__SPU__
#include <stdio.h>
#include <stdlib.h>
-#endif //DEBUG_CHECK_DEQUANTIZATION
+#endif //DEBUG_CHECK_DEQUANTIZATION
#include "Bullet3Common/b3Vector3.h"
#include "Bullet3Common/b3AlignedAllocator.h"
@@ -44,13 +44,10 @@ class b3Serializer;
#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
+#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
@@ -58,7 +55,8 @@ class b3Serializer;
///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_ATTRIBUTE_ALIGNED16(struct)
+b3QuantizedBvhNode : public b3QuantizedBvhNodeData
{
B3_DECLARE_ALIGNED_ALLOCATOR();
@@ -72,48 +70,48 @@ B3_ATTRIBUTE_ALIGNED16 (struct) b3QuantizedBvhNode : public b3QuantizedBvhNodeDa
b3Assert(!isLeafNode());
return -m_escapeIndexOrTriangleIndex;
}
- int getTriangleIndex() const
+ int getTriangleIndex() const
{
b3Assert(isLeafNode());
- unsigned int x=0;
- unsigned int y = (~(x&0))<<(31-MAX_NUM_PARTS_IN_BITS);
+ 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));
+ return (m_escapeIndexOrTriangleIndex & ~(y));
}
- int getPartId() const
+ 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));
+ 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_ATTRIBUTE_ALIGNED16(struct)
+b3OptimizedBvhNode
{
B3_DECLARE_ALIGNED_ALLOCATOR();
//32 bytes
- b3Vector3 m_aabbMinOrg;
- b3Vector3 m_aabbMaxOrg;
+ b3Vector3 m_aabbMinOrg;
+ b3Vector3 m_aabbMaxOrg;
//4
- int m_escapeIndex;
+ int m_escapeIndex;
//8
//for child nodes
- int m_subPart;
- int m_triangleIndex;
+ int m_subPart;
+ int m_triangleIndex;
-//pad the size to 64 bytes
- char m_padding[20];
+ //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
+B3_ATTRIBUTE_ALIGNED16(class)
+b3BvhSubtreeInfo : public b3BvhSubtreeInfoData
{
public:
B3_DECLARE_ALIGNED_ALLOCATOR();
@@ -123,8 +121,7 @@ public:
//memset(&m_padding[0], 0, sizeof(m_padding));
}
-
- void setAabbFromQuantizeNode(const b3QuantizedBvhNode& quantizedNode)
+ void setAabbFromQuantizeNode(const b3QuantizedBvhNode& quantizedNode)
{
m_quantizedAabbMin[0] = quantizedNode.m_quantizedAabbMin[0];
m_quantizedAabbMin[1] = quantizedNode.m_quantizedAabbMin[1];
@@ -133,14 +130,12 @@ public:
m_quantizedAabbMax[1] = quantizedNode.m_quantizedAabbMax[1];
m_quantizedAabbMax[2] = quantizedNode.m_quantizedAabbMax[2];
}
-}
-;
-
+};
class b3NodeOverlapCallback
{
public:
- virtual ~b3NodeOverlapCallback() {};
+ virtual ~b3NodeOverlapCallback(){};
virtual void processNode(int subPart, int triangleIndex) = 0;
};
@@ -148,18 +143,16 @@ public:
#include "Bullet3Common/b3AlignedAllocator.h"
#include "Bullet3Common/b3AlignedObjectArray.h"
-
-
///for code readability:
-typedef b3AlignedObjectArray<b3OptimizedBvhNode> NodeArray;
-typedef b3AlignedObjectArray<b3QuantizedBvhNode> QuantizedNodeArray;
-typedef b3AlignedObjectArray<b3BvhSubtreeInfo> BvhSubtreeInfoArray;
-
+typedef b3AlignedObjectArray<b3OptimizedBvhNode> NodeArray;
+typedef b3AlignedObjectArray<b3QuantizedBvhNode> QuantizedNodeArray;
+typedef b3AlignedObjectArray<b3BvhSubtreeInfo> 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
+B3_ATTRIBUTE_ALIGNED16(class)
+b3QuantizedBvh
{
public:
enum b3TraversalMode
@@ -169,56 +162,48 @@ public:
TRAVERSAL_RECURSIVE
};
-
-
-
- b3Vector3 m_bvhAabbMin;
- b3Vector3 m_bvhAabbMax;
- b3Vector3 m_bvhQuantization;
+ 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_bulletVersion; //for serialization versioning. It could also be used to detect endianess.
- int m_curNodeIndex;
+ int m_curNodeIndex;
//quantization data
- bool m_useQuantization;
+ bool m_useQuantization;
+ NodeArray m_leafNodes;
+ NodeArray m_contiguousNodes;
+ QuantizedNodeArray m_quantizedLeafNodes;
+ QuantizedNodeArray m_quantizedContiguousNodes;
-
- NodeArray m_leafNodes;
- NodeArray m_contiguousNodes;
- QuantizedNodeArray m_quantizedLeafNodes;
- QuantizedNodeArray m_quantizedContiguousNodes;
-
- b3TraversalMode m_traversalMode;
- BvhSubtreeInfoArray m_SubtreeHeaders;
+ 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)
+ void setInternalNodeAabbMin(int nodeIndex, const b3Vector3& aabbMin)
{
if (m_useQuantization)
{
- quantize(&m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMin[0] ,aabbMin,0);
- } else
+ quantize(&m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMin[0], aabbMin, 0);
+ }
+ else
{
m_contiguousNodes[nodeIndex].m_aabbMinOrg = aabbMin;
-
}
}
- void setInternalNodeAabbMax(int nodeIndex,const b3Vector3& aabbMax)
+ void setInternalNodeAabbMax(int nodeIndex, const b3Vector3& aabbMax)
{
if (m_useQuantization)
{
- quantize(&m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMax[0],aabbMax,1);
- } else
+ quantize(&m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMax[0], aabbMax, 1);
+ }
+ else
{
m_contiguousNodes[nodeIndex].m_aabbMaxOrg = aabbMax;
}
@@ -232,115 +217,102 @@ protected:
}
//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)
+ 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)
+ 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++)
+ 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
+ }
+ else
{
//non-quantized
m_contiguousNodes[nodeIndex].m_aabbMinOrg.setMin(newAabbMin);
- m_contiguousNodes[nodeIndex].m_aabbMaxOrg.setMax(newAabbMax);
+ m_contiguousNodes[nodeIndex].m_aabbMaxOrg.setMax(newAabbMax);
}
}
- void swapLeafNodes(int firstIndex,int secondIndex);
+ void swapLeafNodes(int firstIndex, int secondIndex);
- void assignInternalNodeFromLeafNode(int internalNode,int leafNodeIndex);
+ void assignInternalNodeFromLeafNode(int internalNode, int leafNodeIndex);
protected:
+ void buildTree(int startIndex, int endIndex);
-
-
- void buildTree (int startIndex,int endIndex);
+ int calcSplittingAxis(int startIndex, int endIndex);
- int calcSplittingAxis(int startIndex,int endIndex);
+ int sortAndCalcSplittingIndex(int startIndex, int endIndex, int splitAxis);
- int sortAndCalcSplittingIndex(int startIndex,int endIndex,int splitAxis);
-
- void walkStacklessTree(b3NodeOverlapCallback* nodeCallback,const b3Vector3& aabbMin,const b3Vector3& aabbMax) const;
+ 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;
+ 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;
+ 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;
+ 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 walkRecursiveQuantizedTreeAgainstQuantizedTree(const b3QuantizedBvhNode* treeNodeA, const b3QuantizedBvhNode* treeNodeB, b3NodeOverlapCallback* nodeCallback) const;
- void updateSubtreeHeaders(int leftChildNodexIndex,int rightChildNodexIndex);
+ 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; }
+ 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();
+ 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;
+ 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
+ B3_FORCE_INLINE void quantize(unsigned short* out, const b3Vector3& point, int isMax) const
{
-
b3Assert(m_useQuantization);
b3Assert(point.getX() <= m_bvhAabbMax.getX());
@@ -357,122 +329,114 @@ public:
///@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() + 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));
+ 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());
+ 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());
+ 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());
+ printf("unconservative Z, diffZ = %f, oldZ=%f,newZ=%f\n", newPoint.getZ() - point.getZ(), newPoint.getZ(), point.getZ());
}
- } else
+ }
+ else
{
if (newPoint.getX() > point.getX())
{
- printf("unconservative X, diffX = %f, oldX=%f,newX=%f\n",newPoint.getX()-point.getX(), 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());
+ 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());
+ printf("unconservative Z, diffZ = %f, oldZ=%f,newZ=%f\n", newPoint.getZ() - point.getZ(), newPoint.getZ(), point.getZ());
}
}
-#endif //DEBUG_CHECK_DEQUANTIZATION
-
+#endif //DEBUG_CHECK_DEQUANTIZATION
}
-
- B3_FORCE_INLINE void quantizeWithClamp(unsigned short* out, const b3Vector3& point2,int isMax) const
+ 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);
-
+ quantize(out, clampedPoint, isMax);
}
-
- B3_FORCE_INLINE b3Vector3 unQuantize(const unsigned short* vecIn) const
+
+ B3_FORCE_INLINE b3Vector3 unQuantize(const unsigned short* vecIn) const
{
- b3Vector3 vecOut;
- vecOut.setValue(
+ 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;
+ 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)
+ void setTraversalMode(b3TraversalMode traversalMode)
{
m_traversalMode = traversalMode;
}
-
- B3_FORCE_INLINE QuantizedNodeArray& getQuantizedNodeArray()
- {
- return m_quantizedContiguousNodes;
+ B3_FORCE_INLINE QuantizedNodeArray& getQuantizedNodeArray()
+ {
+ return m_quantizedContiguousNodes;
}
-
- B3_FORCE_INLINE BvhSubtreeInfoArray& getSubtreeInfoArray()
+ 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;
+ 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 b3QuantizedBvh* deSerializeInPlace(void* i_alignedDataBuffer, unsigned int i_dataBufferSize, bool i_swapEndian);
static unsigned int getAlignmentSerializationPadding();
-//////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////
-
- virtual int calculateSerializeBufferSizeNew() const;
+ 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 const char* serialize(void* dataBuffer, b3Serializer* serializer) const;
- virtual void deSerializeFloat(struct b3QuantizedBvhFloatData& quantizedBvhFloatData);
+ virtual void deSerializeFloat(struct b3QuantizedBvhFloatData & quantizedBvhFloatData);
- virtual void deSerializeDouble(struct b3QuantizedBvhDoubleData& quantizedBvhDoubleData);
+ virtual void deSerializeDouble(struct b3QuantizedBvhDoubleData & quantizedBvhDoubleData);
-
-////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////
B3_FORCE_INLINE bool isQuantized()
{
@@ -483,74 +447,65 @@ 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);
-
-}
-;
-
+ b3QuantizedBvh(b3QuantizedBvh & other, bool ownsMemory);
+};
struct b3OptimizedBvhNodeFloatData
{
- b3Vector3FloatData m_aabbMinOrg;
- b3Vector3FloatData m_aabbMaxOrg;
- int m_escapeIndex;
- int m_subPart;
- int m_triangleIndex;
+ 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];
+ b3Vector3DoubleData m_aabbMinOrg;
+ b3Vector3DoubleData m_aabbMaxOrg;
+ int m_escapeIndex;
+ int m_subPart;
+ int m_triangleIndex;
+ char m_pad[4];
};
-
-
-struct b3QuantizedBvhFloatData
+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;
-
+ 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
+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;
+ 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
+B3_FORCE_INLINE int b3QuantizedBvh::calculateSerializeBufferSizeNew() const
{
return sizeof(b3QuantizedBvhData);
}
-
-
-#endif //B3_QUANTIZED_BVH_H
+#endif //B3_QUANTIZED_BVH_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3StridingMeshInterface.cpp b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3StridingMeshInterface.cpp
index 4d97f7f62b..6b0c941f23 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3StridingMeshInterface.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3StridingMeshInterface.cpp
@@ -15,35 +15,32 @@ subject to the following restrictions:
#include "b3StridingMeshInterface.h"
-
b3StridingMeshInterface::~b3StridingMeshInterface()
{
-
}
-
-void b3StridingMeshInterface::InternalProcessAllTriangles(b3InternalTriangleIndexCallback* callback,const b3Vector3& aabbMin,const b3Vector3& aabbMax) const
+void b3StridingMeshInterface::InternalProcessAllTriangles(b3InternalTriangleIndexCallback* callback, const b3Vector3& aabbMin, const b3Vector3& aabbMax) const
{
(void)aabbMin;
(void)aabbMax;
int numtotalphysicsverts = 0;
- int part,graphicssubparts = getNumSubParts();
- const unsigned char * vertexbase;
- const unsigned char * indexbase;
+ int part, graphicssubparts = getNumSubParts();
+ const unsigned char* vertexbase;
+ const unsigned char* indexbase;
int indexstride;
PHY_ScalarType type;
PHY_ScalarType gfxindextype;
- int stride,numverts,numtriangles;
+ int stride, numverts, numtriangles;
int gfxindex;
b3Vector3 triangle[3];
b3Vector3 meshScaling = getScaling();
///if the number of parts is big, the performance might drop due to the innerloop switch on indextype
- for (part=0;part<graphicssubparts ;part++)
+ for (part = 0; part < graphicssubparts; part++)
{
- getLockedReadOnlyVertexIndexBase(&vertexbase,numverts,type,stride,&indexbase,indexstride,numtriangles,gfxindextype,part);
- numtotalphysicsverts+=numtriangles*3; //upper bound
+ getLockedReadOnlyVertexIndexBase(&vertexbase, numverts, type, stride, &indexbase, indexstride, numtriangles, gfxindextype, part);
+ numtotalphysicsverts += numtriangles * 3; //upper bound
///unlike that developers want to pass in double-precision meshes in single-precision Bullet build
///so disable this feature by default
@@ -51,143 +48,141 @@ void b3StridingMeshInterface::InternalProcessAllTriangles(b3InternalTriangleInde
switch (type)
{
- case PHY_FLOAT:
- {
-
- float* graphicsbase;
-
- switch (gfxindextype)
- {
- case PHY_INTEGER:
- {
- for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
- {
- unsigned int* tri_indices= (unsigned int*)(indexbase+gfxindex*indexstride);
- graphicsbase = (float*)(vertexbase+tri_indices[0]*stride);
- triangle[0].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(),graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (float*)(vertexbase+tri_indices[1]*stride);
- triangle[1].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(), graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (float*)(vertexbase+tri_indices[2]*stride);
- triangle[2].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(), graphicsbase[2]*meshScaling.getZ());
- callback->internalProcessTriangleIndex(triangle,part,gfxindex);
- }
- break;
- }
- case PHY_SHORT:
- {
- for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
- {
- unsigned short int* tri_indices= (unsigned short int*)(indexbase+gfxindex*indexstride);
- graphicsbase = (float*)(vertexbase+tri_indices[0]*stride);
- triangle[0].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(),graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (float*)(vertexbase+tri_indices[1]*stride);
- triangle[1].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(), graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (float*)(vertexbase+tri_indices[2]*stride);
- triangle[2].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(), graphicsbase[2]*meshScaling.getZ());
- callback->internalProcessTriangleIndex(triangle,part,gfxindex);
- }
- break;
- }
- case PHY_UCHAR:
- {
- for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
- {
- unsigned char* tri_indices= (unsigned char*)(indexbase+gfxindex*indexstride);
- graphicsbase = (float*)(vertexbase+tri_indices[0]*stride);
- triangle[0].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(),graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (float*)(vertexbase+tri_indices[1]*stride);
- triangle[1].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(), graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (float*)(vertexbase+tri_indices[2]*stride);
- triangle[2].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(), graphicsbase[2]*meshScaling.getZ());
- callback->internalProcessTriangleIndex(triangle,part,gfxindex);
- }
- break;
- }
- default:
- b3Assert((gfxindextype == PHY_INTEGER) || (gfxindextype == PHY_SHORT));
- }
- break;
- }
-
- case PHY_DOUBLE:
+ case PHY_FLOAT:
+ {
+ float* graphicsbase;
+
+ switch (gfxindextype)
+ {
+ case PHY_INTEGER:
+ {
+ for (gfxindex = 0; gfxindex < numtriangles; gfxindex++)
+ {
+ unsigned int* tri_indices = (unsigned int*)(indexbase + gfxindex * indexstride);
+ graphicsbase = (float*)(vertexbase + tri_indices[0] * stride);
+ triangle[0].setValue(graphicsbase[0] * meshScaling.getX(), graphicsbase[1] * meshScaling.getY(), graphicsbase[2] * meshScaling.getZ());
+ graphicsbase = (float*)(vertexbase + tri_indices[1] * stride);
+ triangle[1].setValue(graphicsbase[0] * meshScaling.getX(), graphicsbase[1] * meshScaling.getY(), graphicsbase[2] * meshScaling.getZ());
+ graphicsbase = (float*)(vertexbase + tri_indices[2] * stride);
+ triangle[2].setValue(graphicsbase[0] * meshScaling.getX(), graphicsbase[1] * meshScaling.getY(), graphicsbase[2] * meshScaling.getZ());
+ callback->internalProcessTriangleIndex(triangle, part, gfxindex);
+ }
+ break;
+ }
+ case PHY_SHORT:
+ {
+ for (gfxindex = 0; gfxindex < numtriangles; gfxindex++)
+ {
+ unsigned short int* tri_indices = (unsigned short int*)(indexbase + gfxindex * indexstride);
+ graphicsbase = (float*)(vertexbase + tri_indices[0] * stride);
+ triangle[0].setValue(graphicsbase[0] * meshScaling.getX(), graphicsbase[1] * meshScaling.getY(), graphicsbase[2] * meshScaling.getZ());
+ graphicsbase = (float*)(vertexbase + tri_indices[1] * stride);
+ triangle[1].setValue(graphicsbase[0] * meshScaling.getX(), graphicsbase[1] * meshScaling.getY(), graphicsbase[2] * meshScaling.getZ());
+ graphicsbase = (float*)(vertexbase + tri_indices[2] * stride);
+ triangle[2].setValue(graphicsbase[0] * meshScaling.getX(), graphicsbase[1] * meshScaling.getY(), graphicsbase[2] * meshScaling.getZ());
+ callback->internalProcessTriangleIndex(triangle, part, gfxindex);
+ }
+ break;
+ }
+ case PHY_UCHAR:
+ {
+ for (gfxindex = 0; gfxindex < numtriangles; gfxindex++)
+ {
+ unsigned char* tri_indices = (unsigned char*)(indexbase + gfxindex * indexstride);
+ graphicsbase = (float*)(vertexbase + tri_indices[0] * stride);
+ triangle[0].setValue(graphicsbase[0] * meshScaling.getX(), graphicsbase[1] * meshScaling.getY(), graphicsbase[2] * meshScaling.getZ());
+ graphicsbase = (float*)(vertexbase + tri_indices[1] * stride);
+ triangle[1].setValue(graphicsbase[0] * meshScaling.getX(), graphicsbase[1] * meshScaling.getY(), graphicsbase[2] * meshScaling.getZ());
+ graphicsbase = (float*)(vertexbase + tri_indices[2] * stride);
+ triangle[2].setValue(graphicsbase[0] * meshScaling.getX(), graphicsbase[1] * meshScaling.getY(), graphicsbase[2] * meshScaling.getZ());
+ callback->internalProcessTriangleIndex(triangle, part, gfxindex);
+ }
+ break;
+ }
+ default:
+ b3Assert((gfxindextype == PHY_INTEGER) || (gfxindextype == PHY_SHORT));
+ }
+ break;
+ }
+
+ case PHY_DOUBLE:
{
double* graphicsbase;
switch (gfxindextype)
{
- case PHY_INTEGER:
+ case PHY_INTEGER:
{
- for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
+ for (gfxindex = 0; gfxindex < numtriangles; gfxindex++)
{
- unsigned int* tri_indices= (unsigned int*)(indexbase+gfxindex*indexstride);
- graphicsbase = (double*)(vertexbase+tri_indices[0]*stride);
- triangle[0].setValue((b3Scalar)graphicsbase[0]*meshScaling.getX(),(b3Scalar)graphicsbase[1]*meshScaling.getY(),(b3Scalar)graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (double*)(vertexbase+tri_indices[1]*stride);
- triangle[1].setValue((b3Scalar)graphicsbase[0]*meshScaling.getX(),(b3Scalar)graphicsbase[1]*meshScaling.getY(), (b3Scalar)graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (double*)(vertexbase+tri_indices[2]*stride);
- triangle[2].setValue((b3Scalar)graphicsbase[0]*meshScaling.getX(),(b3Scalar)graphicsbase[1]*meshScaling.getY(), (b3Scalar)graphicsbase[2]*meshScaling.getZ());
- callback->internalProcessTriangleIndex(triangle,part,gfxindex);
+ unsigned int* tri_indices = (unsigned int*)(indexbase + gfxindex * indexstride);
+ graphicsbase = (double*)(vertexbase + tri_indices[0] * stride);
+ triangle[0].setValue((b3Scalar)graphicsbase[0] * meshScaling.getX(), (b3Scalar)graphicsbase[1] * meshScaling.getY(), (b3Scalar)graphicsbase[2] * meshScaling.getZ());
+ graphicsbase = (double*)(vertexbase + tri_indices[1] * stride);
+ triangle[1].setValue((b3Scalar)graphicsbase[0] * meshScaling.getX(), (b3Scalar)graphicsbase[1] * meshScaling.getY(), (b3Scalar)graphicsbase[2] * meshScaling.getZ());
+ graphicsbase = (double*)(vertexbase + tri_indices[2] * stride);
+ triangle[2].setValue((b3Scalar)graphicsbase[0] * meshScaling.getX(), (b3Scalar)graphicsbase[1] * meshScaling.getY(), (b3Scalar)graphicsbase[2] * meshScaling.getZ());
+ callback->internalProcessTriangleIndex(triangle, part, gfxindex);
}
break;
}
- case PHY_SHORT:
+ case PHY_SHORT:
{
- for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
+ for (gfxindex = 0; gfxindex < numtriangles; gfxindex++)
{
- unsigned short int* tri_indices= (unsigned short int*)(indexbase+gfxindex*indexstride);
- graphicsbase = (double*)(vertexbase+tri_indices[0]*stride);
- triangle[0].setValue((b3Scalar)graphicsbase[0]*meshScaling.getX(),(b3Scalar)graphicsbase[1]*meshScaling.getY(),(b3Scalar)graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (double*)(vertexbase+tri_indices[1]*stride);
- triangle[1].setValue((b3Scalar)graphicsbase[0]*meshScaling.getX(),(b3Scalar)graphicsbase[1]*meshScaling.getY(), (b3Scalar)graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (double*)(vertexbase+tri_indices[2]*stride);
- triangle[2].setValue((b3Scalar)graphicsbase[0]*meshScaling.getX(),(b3Scalar)graphicsbase[1]*meshScaling.getY(), (b3Scalar)graphicsbase[2]*meshScaling.getZ());
- callback->internalProcessTriangleIndex(triangle,part,gfxindex);
+ unsigned short int* tri_indices = (unsigned short int*)(indexbase + gfxindex * indexstride);
+ graphicsbase = (double*)(vertexbase + tri_indices[0] * stride);
+ triangle[0].setValue((b3Scalar)graphicsbase[0] * meshScaling.getX(), (b3Scalar)graphicsbase[1] * meshScaling.getY(), (b3Scalar)graphicsbase[2] * meshScaling.getZ());
+ graphicsbase = (double*)(vertexbase + tri_indices[1] * stride);
+ triangle[1].setValue((b3Scalar)graphicsbase[0] * meshScaling.getX(), (b3Scalar)graphicsbase[1] * meshScaling.getY(), (b3Scalar)graphicsbase[2] * meshScaling.getZ());
+ graphicsbase = (double*)(vertexbase + tri_indices[2] * stride);
+ triangle[2].setValue((b3Scalar)graphicsbase[0] * meshScaling.getX(), (b3Scalar)graphicsbase[1] * meshScaling.getY(), (b3Scalar)graphicsbase[2] * meshScaling.getZ());
+ callback->internalProcessTriangleIndex(triangle, part, gfxindex);
}
break;
}
- case PHY_UCHAR:
+ case PHY_UCHAR:
{
- for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
+ for (gfxindex = 0; gfxindex < numtriangles; gfxindex++)
{
- unsigned char* tri_indices= (unsigned char*)(indexbase+gfxindex*indexstride);
- graphicsbase = (double*)(vertexbase+tri_indices[0]*stride);
- triangle[0].setValue((b3Scalar)graphicsbase[0]*meshScaling.getX(),(b3Scalar)graphicsbase[1]*meshScaling.getY(),(b3Scalar)graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (double*)(vertexbase+tri_indices[1]*stride);
- triangle[1].setValue((b3Scalar)graphicsbase[0]*meshScaling.getX(),(b3Scalar)graphicsbase[1]*meshScaling.getY(), (b3Scalar)graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (double*)(vertexbase+tri_indices[2]*stride);
- triangle[2].setValue((b3Scalar)graphicsbase[0]*meshScaling.getX(),(b3Scalar)graphicsbase[1]*meshScaling.getY(), (b3Scalar)graphicsbase[2]*meshScaling.getZ());
- callback->internalProcessTriangleIndex(triangle,part,gfxindex);
+ unsigned char* tri_indices = (unsigned char*)(indexbase + gfxindex * indexstride);
+ graphicsbase = (double*)(vertexbase + tri_indices[0] * stride);
+ triangle[0].setValue((b3Scalar)graphicsbase[0] * meshScaling.getX(), (b3Scalar)graphicsbase[1] * meshScaling.getY(), (b3Scalar)graphicsbase[2] * meshScaling.getZ());
+ graphicsbase = (double*)(vertexbase + tri_indices[1] * stride);
+ triangle[1].setValue((b3Scalar)graphicsbase[0] * meshScaling.getX(), (b3Scalar)graphicsbase[1] * meshScaling.getY(), (b3Scalar)graphicsbase[2] * meshScaling.getZ());
+ graphicsbase = (double*)(vertexbase + tri_indices[2] * stride);
+ triangle[2].setValue((b3Scalar)graphicsbase[0] * meshScaling.getX(), (b3Scalar)graphicsbase[1] * meshScaling.getY(), (b3Scalar)graphicsbase[2] * meshScaling.getZ());
+ callback->internalProcessTriangleIndex(triangle, part, gfxindex);
}
break;
}
- default:
- b3Assert((gfxindextype == PHY_INTEGER) || (gfxindextype == PHY_SHORT));
+ default:
+ b3Assert((gfxindextype == PHY_INTEGER) || (gfxindextype == PHY_SHORT));
}
break;
}
- default:
- b3Assert((type == PHY_FLOAT) || (type == PHY_DOUBLE));
+ default:
+ b3Assert((type == PHY_FLOAT) || (type == PHY_DOUBLE));
}
unLockReadOnlyVertexBase(part);
}
}
-void b3StridingMeshInterface::calculateAabbBruteForce(b3Vector3& aabbMin,b3Vector3& aabbMax)
+void b3StridingMeshInterface::calculateAabbBruteForce(b3Vector3& aabbMin, b3Vector3& aabbMax)
{
-
- struct AabbCalculationCallback : public b3InternalTriangleIndexCallback
+ struct AabbCalculationCallback : public b3InternalTriangleIndexCallback
{
- b3Vector3 m_aabbMin;
- b3Vector3 m_aabbMax;
+ b3Vector3 m_aabbMin;
+ b3Vector3 m_aabbMax;
AabbCalculationCallback()
{
- m_aabbMin.setValue(b3Scalar(B3_LARGE_FLOAT),b3Scalar(B3_LARGE_FLOAT),b3Scalar(B3_LARGE_FLOAT));
- m_aabbMax.setValue(b3Scalar(-B3_LARGE_FLOAT),b3Scalar(-B3_LARGE_FLOAT),b3Scalar(-B3_LARGE_FLOAT));
+ m_aabbMin.setValue(b3Scalar(B3_LARGE_FLOAT), b3Scalar(B3_LARGE_FLOAT), b3Scalar(B3_LARGE_FLOAT));
+ m_aabbMax.setValue(b3Scalar(-B3_LARGE_FLOAT), b3Scalar(-B3_LARGE_FLOAT), b3Scalar(-B3_LARGE_FLOAT));
}
- virtual void internalProcessTriangleIndex(b3Vector3* triangle,int partId,int triangleIndex)
+ virtual void internalProcessTriangleIndex(b3Vector3* triangle, int partId, int triangleIndex)
{
(void)partId;
(void)triangleIndex;
@@ -202,13 +197,11 @@ void b3StridingMeshInterface::calculateAabbBruteForce(b3Vector3& aabbMin,b3Vecto
};
//first calculate the total aabb for all triangles
- AabbCalculationCallback aabbCallback;
- aabbMin.setValue(b3Scalar(-B3_LARGE_FLOAT),b3Scalar(-B3_LARGE_FLOAT),b3Scalar(-B3_LARGE_FLOAT));
- aabbMax.setValue(b3Scalar(B3_LARGE_FLOAT),b3Scalar(B3_LARGE_FLOAT),b3Scalar(B3_LARGE_FLOAT));
- InternalProcessAllTriangles(&aabbCallback,aabbMin,aabbMax);
+ AabbCalculationCallback aabbCallback;
+ aabbMin.setValue(b3Scalar(-B3_LARGE_FLOAT), b3Scalar(-B3_LARGE_FLOAT), b3Scalar(-B3_LARGE_FLOAT));
+ aabbMax.setValue(b3Scalar(B3_LARGE_FLOAT), b3Scalar(B3_LARGE_FLOAT), b3Scalar(B3_LARGE_FLOAT));
+ InternalProcessAllTriangles(&aabbCallback, aabbMin, aabbMax);
aabbMin = aabbCallback.m_aabbMin;
aabbMax = aabbCallback.m_aabbMax;
}
-
-
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3StridingMeshInterface.h b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3StridingMeshInterface.h
index 9513f68f77..087b30f3e6 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3StridingMeshInterface.h
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3StridingMeshInterface.h
@@ -20,148 +20,139 @@ subject to the following restrictions:
#include "b3TriangleCallback.h"
//#include "b3ConcaveShape.h"
-
-enum PHY_ScalarType {
- PHY_FLOAT, PHY_DOUBLE, PHY_INTEGER, PHY_SHORT,
- PHY_FIXEDPOINT88, PHY_UCHAR
+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
+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 seperate 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;
-
-
+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 seperate 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
+struct b3IntIndexData
{
- int m_value;
+ int m_value;
};
-struct b3ShortIntIndexData
+struct b3ShortIntIndexData
{
short m_value;
char m_pad[2];
};
-struct b3ShortIntIndexTripletData
+struct b3ShortIntIndexTripletData
{
- short m_values[3];
- char m_pad[2];
+ short m_values[3];
+ char m_pad[2];
};
-struct b3CharIndexTripletData
+struct b3CharIndexTripletData
{
unsigned char m_values[3];
- char m_pad;
+ char m_pad;
};
-
///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
-struct b3MeshPartData
+struct b3MeshPartData
{
- b3Vector3FloatData *m_vertices3f;
- b3Vector3DoubleData *m_vertices3d;
+ b3Vector3FloatData* m_vertices3f;
+ b3Vector3DoubleData* m_vertices3d;
- b3IntIndexData *m_indices32;
- b3ShortIntIndexTripletData *m_3indices16;
- b3CharIndexTripletData *m_3indices8;
+ b3IntIndexData* m_indices32;
+ b3ShortIntIndexTripletData* m_3indices16;
+ b3CharIndexTripletData* m_3indices8;
- b3ShortIntIndexData *m_indices16;//backwards compatibility
+ b3ShortIntIndexData* m_indices16; //backwards compatibility
- int m_numTriangles;//length of m_indices = m_numTriangles
- int m_numVertices;
+ 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
+struct b3StridingMeshInterfaceData
{
- b3MeshPartData *m_meshPartsPtr;
- b3Vector3FloatData m_scaling;
- int m_numMeshParts;
+ b3MeshPartData* m_meshPartsPtr;
+ b3Vector3FloatData m_scaling;
+ int m_numMeshParts;
char m_padding[4];
};
-
-
-
-B3_FORCE_INLINE int b3StridingMeshInterface::calculateSerializeBufferSize() const
+B3_FORCE_INLINE int b3StridingMeshInterface::calculateSerializeBufferSize() const
{
return sizeof(b3StridingMeshInterfaceData);
}
-
-
-#endif //B3_STRIDING_MESHINTERFACE_H
+#endif //B3_STRIDING_MESHINTERFACE_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3SupportMappings.h b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3SupportMappings.h
index d073ee57c3..9ca1e22949 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3SupportMappings.h
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3SupportMappings.h
@@ -6,33 +6,29 @@
#include "Bullet3Common/b3AlignedObjectArray.h"
#include "b3VectorFloat4.h"
-
struct b3GjkPairDetector;
-
-
-inline b3Vector3 localGetSupportVertexWithMargin(const float4& supportVec,const struct b3ConvexPolyhedronData* hull,
- const b3AlignedObjectArray<b3Vector3>& verticesA, b3Scalar margin)
+inline b3Vector3 localGetSupportVertexWithMargin(const float4& supportVec, const struct b3ConvexPolyhedronData* hull,
+ const b3AlignedObjectArray<b3Vector3>& verticesA, b3Scalar margin)
{
- b3Vector3 supVec = b3MakeVector3(b3Scalar(0.),b3Scalar(0.),b3Scalar(0.));
+ 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;
+ // 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<b3Vector3>& verticesA)
+inline b3Vector3 localGetSupportVertexWithoutMargin(const float4& supportVec, const struct b3ConvexPolyhedronData* hull,
+ const b3AlignedObjectArray<b3Vector3>& verticesA)
{
- return localGetSupportVertexWithMargin(supportVec,hull,verticesA,0.f);
+ return localGetSupportVertexWithMargin(supportVec, hull, verticesA, 0.f);
}
-#endif //B3_SUPPORT_MAPPINGS_H
+#endif //B3_SUPPORT_MAPPINGS_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleCallback.cpp b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleCallback.cpp
index 9066451884..3908c6de89 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleCallback.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleCallback.cpp
@@ -17,12 +17,8 @@ subject to the following restrictions:
b3TriangleCallback::~b3TriangleCallback()
{
-
}
-
b3InternalTriangleIndexCallback::~b3InternalTriangleIndexCallback()
{
-
}
-
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleCallback.h b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleCallback.h
index 3059fa4f21..a0fd3e7ac7 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleCallback.h
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleCallback.h
@@ -18,13 +18,11 @@ subject to the following restrictions:
#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;
};
@@ -32,11 +30,8 @@ public:
class b3InternalTriangleIndexCallback
{
public:
-
virtual ~b3InternalTriangleIndexCallback();
- virtual void internalProcessTriangleIndex(b3Vector3* triangle,int partId,int triangleIndex) = 0;
+ virtual void internalProcessTriangleIndex(b3Vector3* triangle, int partId, int triangleIndex) = 0;
};
-
-
-#endif //B3_TRIANGLE_CALLBACK_H
+#endif //B3_TRIANGLE_CALLBACK_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleIndexVertexArray.cpp b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleIndexVertexArray.cpp
index a0f59babbe..73faadbdd0 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleIndexVertexArray.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleIndexVertexArray.cpp
@@ -15,81 +15,76 @@ subject to the following restrictions:
#include "b3TriangleIndexVertexArray.h"
-b3TriangleIndexVertexArray::b3TriangleIndexVertexArray(int numTriangles,int* triangleIndexBase,int triangleIndexStride,int numVertices,b3Scalar* vertexBase,int vertexStride)
-: m_hasAabb(0)
+b3TriangleIndexVertexArray::b3TriangleIndexVertexArray(int numTriangles, int* triangleIndexBase, int triangleIndexStride, int numVertices, b3Scalar* vertexBase, int vertexStride)
+ : m_hasAabb(0)
{
b3IndexedMesh mesh;
mesh.m_numTriangles = numTriangles;
- mesh.m_triangleIndexBase = (const unsigned char *)triangleIndexBase;
+ mesh.m_triangleIndexBase = (const unsigned char*)triangleIndexBase;
mesh.m_triangleIndexStride = triangleIndexStride;
mesh.m_numVertices = numVertices;
- mesh.m_vertexBase = (const unsigned char *)vertexBase;
+ mesh.m_vertexBase = (const unsigned char*)vertexBase;
mesh.m_vertexStride = vertexStride;
addIndexedMesh(mesh);
-
}
b3TriangleIndexVertexArray::~b3TriangleIndexVertexArray()
{
-
}
-void b3TriangleIndexVertexArray::getLockedVertexIndexBase(unsigned char **vertexbase, int& numverts,PHY_ScalarType& type, int& vertexStride,unsigned char **indexbase,int & indexstride,int& numfaces,PHY_ScalarType& indicestype,int subpart)
+void b3TriangleIndexVertexArray::getLockedVertexIndexBase(unsigned char** vertexbase, int& numverts, PHY_ScalarType& type, int& vertexStride, unsigned char** indexbase, int& indexstride, int& numfaces, PHY_ScalarType& indicestype, int subpart)
{
- b3Assert(subpart< getNumSubParts() );
+ b3Assert(subpart < getNumSubParts());
b3IndexedMesh& mesh = m_indexedMeshes[subpart];
numverts = mesh.m_numVertices;
- (*vertexbase) = (unsigned char *) mesh.m_vertexBase;
+ (*vertexbase) = (unsigned char*)mesh.m_vertexBase;
- type = mesh.m_vertexType;
+ type = mesh.m_vertexType;
vertexStride = mesh.m_vertexStride;
numfaces = mesh.m_numTriangles;
- (*indexbase) = (unsigned char *)mesh.m_triangleIndexBase;
+ (*indexbase) = (unsigned char*)mesh.m_triangleIndexBase;
indexstride = mesh.m_triangleIndexStride;
indicestype = mesh.m_indexType;
}
-void b3TriangleIndexVertexArray::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) const
+void b3TriangleIndexVertexArray::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) const
{
const b3IndexedMesh& mesh = m_indexedMeshes[subpart];
numverts = mesh.m_numVertices;
- (*vertexbase) = (const unsigned char *)mesh.m_vertexBase;
+ (*vertexbase) = (const unsigned char*)mesh.m_vertexBase;
+
+ type = mesh.m_vertexType;
- type = mesh.m_vertexType;
-
vertexStride = mesh.m_vertexStride;
numfaces = mesh.m_numTriangles;
- (*indexbase) = (const unsigned char *)mesh.m_triangleIndexBase;
+ (*indexbase) = (const unsigned char*)mesh.m_triangleIndexBase;
indexstride = mesh.m_triangleIndexStride;
indicestype = mesh.m_indexType;
}
-bool b3TriangleIndexVertexArray::hasPremadeAabb() const
+bool b3TriangleIndexVertexArray::hasPremadeAabb() const
{
return (m_hasAabb == 1);
}
-
-void b3TriangleIndexVertexArray::setPremadeAabb(const b3Vector3& aabbMin, const b3Vector3& aabbMax ) const
+void b3TriangleIndexVertexArray::setPremadeAabb(const b3Vector3& aabbMin, const b3Vector3& aabbMax) const
{
m_aabbMin = aabbMin;
m_aabbMax = aabbMax;
- m_hasAabb = 1; // this is intentionally an int see notes in header
+ m_hasAabb = 1; // this is intentionally an int see notes in header
}
-void b3TriangleIndexVertexArray::getPremadeAabb(b3Vector3* aabbMin, b3Vector3* aabbMax ) const
+void b3TriangleIndexVertexArray::getPremadeAabb(b3Vector3* aabbMin, b3Vector3* aabbMax) const
{
*aabbMin = m_aabbMin;
*aabbMax = m_aabbMax;
}
-
-
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleIndexVertexArray.h b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleIndexVertexArray.h
index d26b2893bc..b6ceb8df10 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleIndexVertexArray.h
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3TriangleIndexVertexArray.h
@@ -20,62 +20,59 @@ subject to the following restrictions:
#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_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),
+ 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
- {
- }
-}
-;
-
+ m_vertexType(PHY_DOUBLE)
+#else // B3_USE_DOUBLE_PRECISION
+ m_vertexType(PHY_FLOAT)
+#endif // B3_USE_DOUBLE_PRECISION
+ {
+ }
+};
-typedef b3AlignedObjectArray<b3IndexedMesh> IndexedMeshArray;
+typedef b3AlignedObjectArray<b3IndexedMesh> 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
+B3_ATTRIBUTE_ALIGNED16(class)
+b3TriangleIndexVertexArray : public b3StridingMeshInterface
{
protected:
- IndexedMeshArray m_indexedMeshes;
+ IndexedMeshArray m_indexedMeshes;
int m_pad[2];
- mutable int m_hasAabb; // using int instead of bool to maintain alignment
+ 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)
@@ -85,49 +82,47 @@ public:
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)
+ 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;
+ 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;
+ 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 unLockVertexBase(int subpart) { (void)subpart; }
- virtual void unLockReadOnlyVertexBase(int subpart) const {(void)subpart;}
+ virtual void unLockReadOnlyVertexBase(int subpart) const { (void)subpart; }
/// getNumSubParts returns the number of seperate subparts
/// each subpart has a continuous array of vertices and indices
- virtual int getNumSubParts() const {
+ virtual int getNumSubParts() const
+ {
return (int)m_indexedMeshes.size();
}
- IndexedMeshArray& getIndexedMeshArray()
+ IndexedMeshArray& getIndexedMeshArray()
{
return m_indexedMeshes;
}
- const IndexedMeshArray& getIndexedMeshArray() const
+ 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;
+ 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
+#endif //B3_TRIANGLE_INDEX_VERTEX_ARRAY_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3VectorFloat4.h b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3VectorFloat4.h
index f6f65f7719..5cc4b5a626 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3VectorFloat4.h
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3VectorFloat4.h
@@ -7,5 +7,4 @@
#define float4 b3Vector3
//#define make_float4(x,y,z,w) b3Vector4(x,y,z,w)
-
-#endif //B3_VECTOR_FLOAT4_H
+#endif //B3_VECTOR_FLOAT4_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3VoronoiSimplexSolver.cpp b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3VoronoiSimplexSolver.cpp
index cf3d5ef49d..dae61d4581 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3VoronoiSimplexSolver.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3VoronoiSimplexSolver.cpp
@@ -23,26 +23,24 @@ subject to the following restrictions:
*/
-
#include "b3VoronoiSimplexSolver.h"
-#define VERTA 0
-#define VERTB 1
-#define VERTC 2
-#define VERTD 3
+#define VERTA 0
+#define VERTB 1
+#define VERTC 2
+#define VERTD 3
#define B3_CATCH_DEGENERATE_TETRAHEDRON 1
-void b3VoronoiSimplexSolver::removeVertex(int index)
+void b3VoronoiSimplexSolver::removeVertex(int index)
{
-
- b3Assert(m_numVertices>0);
+ b3Assert(m_numVertices > 0);
m_numVertices--;
m_simplexVectorW[index] = m_simplexVectorW[m_numVertices];
m_simplexPointsP[index] = m_simplexPointsP[m_numVertices];
m_simplexPointsQ[index] = m_simplexPointsQ[m_numVertices];
}
-void b3VoronoiSimplexSolver::reduceVertices (const b3UsageBitfield& usedVerts)
+void b3VoronoiSimplexSolver::reduceVertices(const b3UsageBitfield& usedVerts)
{
if ((numVertices() >= 4) && (!usedVerts.usedVertexD))
removeVertex(3);
@@ -52,29 +50,22 @@ void b3VoronoiSimplexSolver::reduceVertices (const b3UsageBitfield& usedVerts)
if ((numVertices() >= 2) && (!usedVerts.usedVertexB))
removeVertex(1);
-
+
if ((numVertices() >= 1) && (!usedVerts.usedVertexA))
removeVertex(0);
-
}
-
-
-
-
//clear the simplex, remove all the vertices
void b3VoronoiSimplexSolver::reset()
{
m_cachedValidClosest = false;
m_numVertices = 0;
m_needsUpdate = true;
- m_lastW = b3MakeVector3(b3Scalar(B3_LARGE_FLOAT),b3Scalar(B3_LARGE_FLOAT),b3Scalar(B3_LARGE_FLOAT));
+ m_lastW = b3MakeVector3(b3Scalar(B3_LARGE_FLOAT), b3Scalar(B3_LARGE_FLOAT), b3Scalar(B3_LARGE_FLOAT));
m_cachedBC.reset();
}
-
-
- //add a vertex
+//add a vertex
void b3VoronoiSimplexSolver::addVertex(const b3Vector3& w, const b3Vector3& p, const b3Vector3& q)
{
m_lastW = w;
@@ -87,9 +78,8 @@ void b3VoronoiSimplexSolver::addVertex(const b3Vector3& w, const b3Vector3& p, c
m_numVertices++;
}
-bool b3VoronoiSimplexSolver::updateClosestVectorAndPoints()
+bool b3VoronoiSimplexSolver::updateClosestVectorAndPoints()
{
-
if (m_needsUpdate)
{
m_cachedBC.reset();
@@ -98,127 +88,131 @@ bool b3VoronoiSimplexSolver::updateClosestVectorAndPoints()
switch (numVertices())
{
- case 0:
+ case 0:
m_cachedValidClosest = false;
break;
- case 1:
+ case 1:
{
m_cachedP1 = m_simplexPointsP[0];
m_cachedP2 = m_simplexPointsQ[0];
- m_cachedV = m_cachedP1-m_cachedP2; //== m_simplexVectorW[0]
+ m_cachedV = m_cachedP1 - m_cachedP2; //== m_simplexVectorW[0]
m_cachedBC.reset();
- m_cachedBC.setBarycentricCoordinates(b3Scalar(1.),b3Scalar(0.),b3Scalar(0.),b3Scalar(0.));
+ m_cachedBC.setBarycentricCoordinates(b3Scalar(1.), b3Scalar(0.), b3Scalar(0.), b3Scalar(0.));
m_cachedValidClosest = m_cachedBC.isValid();
break;
};
- case 2:
+ case 2:
{
- //closest point origin from line segment
- const b3Vector3& from = m_simplexVectorW[0];
- const b3Vector3& to = m_simplexVectorW[1];
- b3Vector3 nearest;
-
- b3Vector3 p =b3MakeVector3(b3Scalar(0.),b3Scalar(0.),b3Scalar(0.));
- b3Vector3 diff = p - from;
- b3Vector3 v = to - from;
- b3Scalar t = v.dot(diff);
-
- if (t > 0) {
- b3Scalar dotVV = v.dot(v);
- if (t < dotVV) {
- t /= dotVV;
- diff -= t*v;
- m_cachedBC.m_usedVertices.usedVertexA = true;
- m_cachedBC.m_usedVertices.usedVertexB = true;
- } else {
- t = 1;
- diff -= v;
- //reduce to 1 point
- m_cachedBC.m_usedVertices.usedVertexB = true;
- }
- } else
+ //closest point origin from line segment
+ const b3Vector3& from = m_simplexVectorW[0];
+ const b3Vector3& to = m_simplexVectorW[1];
+ b3Vector3 nearest;
+
+ b3Vector3 p = b3MakeVector3(b3Scalar(0.), b3Scalar(0.), b3Scalar(0.));
+ b3Vector3 diff = p - from;
+ b3Vector3 v = to - from;
+ b3Scalar t = v.dot(diff);
+
+ if (t > 0)
+ {
+ b3Scalar dotVV = v.dot(v);
+ if (t < dotVV)
{
- t = 0;
- //reduce to 1 point
+ t /= dotVV;
+ diff -= t * v;
m_cachedBC.m_usedVertices.usedVertexA = true;
+ m_cachedBC.m_usedVertices.usedVertexB = true;
+ }
+ else
+ {
+ t = 1;
+ diff -= v;
+ //reduce to 1 point
+ m_cachedBC.m_usedVertices.usedVertexB = true;
}
- m_cachedBC.setBarycentricCoordinates(1-t,t);
- nearest = from + t*v;
+ }
+ else
+ {
+ t = 0;
+ //reduce to 1 point
+ m_cachedBC.m_usedVertices.usedVertexA = true;
+ }
+ m_cachedBC.setBarycentricCoordinates(1 - t, t);
+ nearest = from + t * v;
- m_cachedP1 = m_simplexPointsP[0] + t * (m_simplexPointsP[1] - m_simplexPointsP[0]);
- m_cachedP2 = m_simplexPointsQ[0] + t * (m_simplexPointsQ[1] - m_simplexPointsQ[0]);
- m_cachedV = m_cachedP1 - m_cachedP2;
-
- reduceVertices(m_cachedBC.m_usedVertices);
+ m_cachedP1 = m_simplexPointsP[0] + t * (m_simplexPointsP[1] - m_simplexPointsP[0]);
+ m_cachedP2 = m_simplexPointsQ[0] + t * (m_simplexPointsQ[1] - m_simplexPointsQ[0]);
+ m_cachedV = m_cachedP1 - m_cachedP2;
- m_cachedValidClosest = m_cachedBC.isValid();
- break;
+ reduceVertices(m_cachedBC.m_usedVertices);
+
+ m_cachedValidClosest = m_cachedBC.isValid();
+ break;
}
- case 3:
- {
- //closest point origin from triangle
- b3Vector3 p =b3MakeVector3(b3Scalar(0.),b3Scalar(0.),b3Scalar(0.));
+ case 3:
+ {
+ //closest point origin from triangle
+ b3Vector3 p = b3MakeVector3(b3Scalar(0.), b3Scalar(0.), b3Scalar(0.));
- const b3Vector3& a = m_simplexVectorW[0];
- const b3Vector3& b = m_simplexVectorW[1];
- const b3Vector3& c = m_simplexVectorW[2];
+ const b3Vector3& a = m_simplexVectorW[0];
+ const b3Vector3& b = m_simplexVectorW[1];
+ const b3Vector3& c = m_simplexVectorW[2];
- closestPtPointTriangle(p,a,b,c,m_cachedBC);
- m_cachedP1 = m_simplexPointsP[0] * m_cachedBC.m_barycentricCoords[0] +
- m_simplexPointsP[1] * m_cachedBC.m_barycentricCoords[1] +
- m_simplexPointsP[2] * m_cachedBC.m_barycentricCoords[2];
+ closestPtPointTriangle(p, a, b, c, m_cachedBC);
+ m_cachedP1 = m_simplexPointsP[0] * m_cachedBC.m_barycentricCoords[0] +
+ m_simplexPointsP[1] * m_cachedBC.m_barycentricCoords[1] +
+ m_simplexPointsP[2] * m_cachedBC.m_barycentricCoords[2];
- m_cachedP2 = m_simplexPointsQ[0] * m_cachedBC.m_barycentricCoords[0] +
- m_simplexPointsQ[1] * m_cachedBC.m_barycentricCoords[1] +
- m_simplexPointsQ[2] * m_cachedBC.m_barycentricCoords[2];
+ m_cachedP2 = m_simplexPointsQ[0] * m_cachedBC.m_barycentricCoords[0] +
+ m_simplexPointsQ[1] * m_cachedBC.m_barycentricCoords[1] +
+ m_simplexPointsQ[2] * m_cachedBC.m_barycentricCoords[2];
- m_cachedV = m_cachedP1-m_cachedP2;
+ m_cachedV = m_cachedP1 - m_cachedP2;
- reduceVertices (m_cachedBC.m_usedVertices);
- m_cachedValidClosest = m_cachedBC.isValid();
+ reduceVertices(m_cachedBC.m_usedVertices);
+ m_cachedValidClosest = m_cachedBC.isValid();
- break;
+ break;
}
- case 4:
+ case 4:
{
+ b3Vector3 p = b3MakeVector3(b3Scalar(0.), b3Scalar(0.), b3Scalar(0.));
-
- b3Vector3 p =b3MakeVector3(b3Scalar(0.),b3Scalar(0.),b3Scalar(0.));
-
const b3Vector3& a = m_simplexVectorW[0];
const b3Vector3& b = m_simplexVectorW[1];
const b3Vector3& c = m_simplexVectorW[2];
const b3Vector3& d = m_simplexVectorW[3];
- bool hasSeperation = closestPtPointTetrahedron(p,a,b,c,d,m_cachedBC);
+ bool hasSeperation = closestPtPointTetrahedron(p, a, b, c, d, m_cachedBC);
if (hasSeperation)
{
-
m_cachedP1 = m_simplexPointsP[0] * m_cachedBC.m_barycentricCoords[0] +
- m_simplexPointsP[1] * m_cachedBC.m_barycentricCoords[1] +
- m_simplexPointsP[2] * m_cachedBC.m_barycentricCoords[2] +
- m_simplexPointsP[3] * m_cachedBC.m_barycentricCoords[3];
+ m_simplexPointsP[1] * m_cachedBC.m_barycentricCoords[1] +
+ m_simplexPointsP[2] * m_cachedBC.m_barycentricCoords[2] +
+ m_simplexPointsP[3] * m_cachedBC.m_barycentricCoords[3];
m_cachedP2 = m_simplexPointsQ[0] * m_cachedBC.m_barycentricCoords[0] +
- m_simplexPointsQ[1] * m_cachedBC.m_barycentricCoords[1] +
- m_simplexPointsQ[2] * m_cachedBC.m_barycentricCoords[2] +
- m_simplexPointsQ[3] * m_cachedBC.m_barycentricCoords[3];
+ m_simplexPointsQ[1] * m_cachedBC.m_barycentricCoords[1] +
+ m_simplexPointsQ[2] * m_cachedBC.m_barycentricCoords[2] +
+ m_simplexPointsQ[3] * m_cachedBC.m_barycentricCoords[3];
- m_cachedV = m_cachedP1-m_cachedP2;
- reduceVertices (m_cachedBC.m_usedVertices);
- } else
+ m_cachedV = m_cachedP1 - m_cachedP2;
+ reduceVertices(m_cachedBC.m_usedVertices);
+ }
+ else
{
-// printf("sub distance got penetration\n");
+ // printf("sub distance got penetration\n");
if (m_cachedBC.m_degenerate)
{
m_cachedValidClosest = false;
- } else
+ }
+ else
{
m_cachedValidClosest = true;
//degenerate case == false, penetration = true + zero
- m_cachedV.setValue(b3Scalar(0.),b3Scalar(0.),b3Scalar(0.));
+ m_cachedV.setValue(b3Scalar(0.), b3Scalar(0.), b3Scalar(0.));
}
break;
}
@@ -228,7 +222,7 @@ bool b3VoronoiSimplexSolver::updateClosestVectorAndPoints()
//closest point origin from tetrahedron
break;
}
- default:
+ default:
{
m_cachedValidClosest = false;
}
@@ -236,7 +230,6 @@ bool b3VoronoiSimplexSolver::updateClosestVectorAndPoints()
}
return m_cachedValidClosest;
-
}
//return/calculate the closest vertex
@@ -247,13 +240,11 @@ bool b3VoronoiSimplexSolver::closest(b3Vector3& v)
return succes;
}
-
-
b3Scalar b3VoronoiSimplexSolver::maxVertex()
{
int i, numverts = numVertices();
b3Scalar maxV = b3Scalar(0.);
- for (i=0;i<numverts;i++)
+ for (i = 0; i < numverts; i++)
{
b3Scalar curLen2 = m_simplexVectorW[i].length2();
if (maxV < curLen2)
@@ -262,13 +253,11 @@ b3Scalar b3VoronoiSimplexSolver::maxVertex()
return maxV;
}
-
-
- //return the current simplex
-int b3VoronoiSimplexSolver::getSimplex(b3Vector3 *pBuf, b3Vector3 *qBuf, b3Vector3 *yBuf) const
+//return the current simplex
+int b3VoronoiSimplexSolver::getSimplex(b3Vector3* pBuf, b3Vector3* qBuf, b3Vector3* yBuf) const
{
int i;
- for (i=0;i<numVertices();i++)
+ for (i = 0; i < numVertices(); i++)
{
yBuf[i] = m_simplexVectorW[i];
pBuf[i] = m_simplexPointsP[i];
@@ -277,20 +266,17 @@ int b3VoronoiSimplexSolver::getSimplex(b3Vector3 *pBuf, b3Vector3 *qBuf, b3Vecto
return numVertices();
}
-
-
-
bool b3VoronoiSimplexSolver::inSimplex(const b3Vector3& w)
{
bool found = false;
int i, numverts = numVertices();
//b3Scalar maxV = b3Scalar(0.);
-
+
//w is in the current (reduced) simplex
- for (i=0;i<numverts;i++)
+ for (i = 0; i < numverts; i++)
{
#ifdef BT_USE_EQUAL_VERTEX_THRESHOLD
- if ( m_simplexVectorW[i].distance2(w) <= m_equalVertexThreshold)
+ if (m_simplexVectorW[i].distance2(w) <= m_equalVertexThreshold)
#else
if (m_simplexVectorW[i] == w)
#endif
@@ -300,199 +286,190 @@ bool b3VoronoiSimplexSolver::inSimplex(const b3Vector3& w)
//check in case lastW is already removed
if (w == m_lastW)
return true;
-
+
return found;
}
-void b3VoronoiSimplexSolver::backup_closest(b3Vector3& v)
+void b3VoronoiSimplexSolver::backup_closest(b3Vector3& v)
{
v = m_cachedV;
}
-
-bool b3VoronoiSimplexSolver::emptySimplex() const
+bool b3VoronoiSimplexSolver::emptySimplex() const
{
return (numVertices() == 0);
-
}
-void b3VoronoiSimplexSolver::compute_points(b3Vector3& p1, b3Vector3& p2)
+void b3VoronoiSimplexSolver::compute_points(b3Vector3& p1, b3Vector3& p2)
{
updateClosestVectorAndPoints();
p1 = m_cachedP1;
p2 = m_cachedP2;
-
}
-
-
-
-bool b3VoronoiSimplexSolver::closestPtPointTriangle(const b3Vector3& p, const b3Vector3& a, const b3Vector3& b, const b3Vector3& c,b3SubSimplexClosestResult& result)
+bool b3VoronoiSimplexSolver::closestPtPointTriangle(const b3Vector3& p, const b3Vector3& a, const b3Vector3& b, const b3Vector3& c, b3SubSimplexClosestResult& result)
{
result.m_usedVertices.reset();
- // Check if P in vertex region outside A
- b3Vector3 ab = b - a;
- b3Vector3 ac = c - a;
- b3Vector3 ap = p - a;
- b3Scalar d1 = ab.dot(ap);
- b3Scalar d2 = ac.dot(ap);
- if (d1 <= b3Scalar(0.0) && d2 <= b3Scalar(0.0))
+ // Check if P in vertex region outside A
+ b3Vector3 ab = b - a;
+ b3Vector3 ac = c - a;
+ b3Vector3 ap = p - a;
+ b3Scalar d1 = ab.dot(ap);
+ b3Scalar d2 = ac.dot(ap);
+ if (d1 <= b3Scalar(0.0) && d2 <= b3Scalar(0.0))
{
result.m_closestPointOnSimplex = a;
result.m_usedVertices.usedVertexA = true;
- result.setBarycentricCoordinates(1,0,0);
- return true;// a; // barycentric coordinates (1,0,0)
+ result.setBarycentricCoordinates(1, 0, 0);
+ return true; // a; // barycentric coordinates (1,0,0)
}
- // Check if P in vertex region outside B
- b3Vector3 bp = p - b;
- b3Scalar d3 = ab.dot(bp);
- b3Scalar d4 = ac.dot(bp);
- if (d3 >= b3Scalar(0.0) && d4 <= d3)
+ // Check if P in vertex region outside B
+ b3Vector3 bp = p - b;
+ b3Scalar d3 = ab.dot(bp);
+ b3Scalar d4 = ac.dot(bp);
+ if (d3 >= b3Scalar(0.0) && d4 <= d3)
{
result.m_closestPointOnSimplex = b;
result.m_usedVertices.usedVertexB = true;
- result.setBarycentricCoordinates(0,1,0);
+ result.setBarycentricCoordinates(0, 1, 0);
- return true; // b; // barycentric coordinates (0,1,0)
+ return true; // b; // barycentric coordinates (0,1,0)
}
- // Check if P in edge region of AB, if so return projection of P onto AB
- b3Scalar vc = d1*d4 - d3*d2;
- if (vc <= b3Scalar(0.0) && d1 >= b3Scalar(0.0) && d3 <= b3Scalar(0.0)) {
- b3Scalar v = d1 / (d1 - d3);
+ // Check if P in edge region of AB, if so return projection of P onto AB
+ b3Scalar vc = d1 * d4 - d3 * d2;
+ if (vc <= b3Scalar(0.0) && d1 >= b3Scalar(0.0) && d3 <= b3Scalar(0.0))
+ {
+ b3Scalar v = d1 / (d1 - d3);
result.m_closestPointOnSimplex = a + v * ab;
result.m_usedVertices.usedVertexA = true;
result.m_usedVertices.usedVertexB = true;
- result.setBarycentricCoordinates(1-v,v,0);
+ result.setBarycentricCoordinates(1 - v, v, 0);
return true;
- //return a + v * ab; // barycentric coordinates (1-v,v,0)
- }
-
- // Check if P in vertex region outside C
- b3Vector3 cp = p - c;
- b3Scalar d5 = ab.dot(cp);
- b3Scalar d6 = ac.dot(cp);
- if (d6 >= b3Scalar(0.0) && d5 <= d6)
+ //return a + v * ab; // barycentric coordinates (1-v,v,0)
+ }
+
+ // Check if P in vertex region outside C
+ b3Vector3 cp = p - c;
+ b3Scalar d5 = ab.dot(cp);
+ b3Scalar d6 = ac.dot(cp);
+ if (d6 >= b3Scalar(0.0) && d5 <= d6)
{
result.m_closestPointOnSimplex = c;
result.m_usedVertices.usedVertexC = true;
- result.setBarycentricCoordinates(0,0,1);
- return true;//c; // barycentric coordinates (0,0,1)
+ result.setBarycentricCoordinates(0, 0, 1);
+ return true; //c; // barycentric coordinates (0,0,1)
}
- // Check if P in edge region of AC, if so return projection of P onto AC
- b3Scalar vb = d5*d2 - d1*d6;
- if (vb <= b3Scalar(0.0) && d2 >= b3Scalar(0.0) && d6 <= b3Scalar(0.0)) {
- b3Scalar w = d2 / (d2 - d6);
+ // Check if P in edge region of AC, if so return projection of P onto AC
+ b3Scalar vb = d5 * d2 - d1 * d6;
+ if (vb <= b3Scalar(0.0) && d2 >= b3Scalar(0.0) && d6 <= b3Scalar(0.0))
+ {
+ b3Scalar w = d2 / (d2 - d6);
result.m_closestPointOnSimplex = a + w * ac;
result.m_usedVertices.usedVertexA = true;
result.m_usedVertices.usedVertexC = true;
- result.setBarycentricCoordinates(1-w,0,w);
+ result.setBarycentricCoordinates(1 - w, 0, w);
return true;
- //return a + w * ac; // barycentric coordinates (1-w,0,w)
- }
+ //return a + w * ac; // barycentric coordinates (1-w,0,w)
+ }
+
+ // Check if P in edge region of BC, if so return projection of P onto BC
+ b3Scalar va = d3 * d6 - d5 * d4;
+ if (va <= b3Scalar(0.0) && (d4 - d3) >= b3Scalar(0.0) && (d5 - d6) >= b3Scalar(0.0))
+ {
+ b3Scalar w = (d4 - d3) / ((d4 - d3) + (d5 - d6));
- // Check if P in edge region of BC, if so return projection of P onto BC
- b3Scalar va = d3*d6 - d5*d4;
- if (va <= b3Scalar(0.0) && (d4 - d3) >= b3Scalar(0.0) && (d5 - d6) >= b3Scalar(0.0)) {
- b3Scalar w = (d4 - d3) / ((d4 - d3) + (d5 - d6));
-
result.m_closestPointOnSimplex = b + w * (c - b);
result.m_usedVertices.usedVertexB = true;
result.m_usedVertices.usedVertexC = true;
- result.setBarycentricCoordinates(0,1-w,w);
- return true;
- // return b + w * (c - b); // barycentric coordinates (0,1-w,w)
- }
-
- // P inside face region. Compute Q through its barycentric coordinates (u,v,w)
- b3Scalar denom = b3Scalar(1.0) / (va + vb + vc);
- b3Scalar v = vb * denom;
- b3Scalar w = vc * denom;
-
+ result.setBarycentricCoordinates(0, 1 - w, w);
+ return true;
+ // return b + w * (c - b); // barycentric coordinates (0,1-w,w)
+ }
+
+ // P inside face region. Compute Q through its barycentric coordinates (u,v,w)
+ b3Scalar denom = b3Scalar(1.0) / (va + vb + vc);
+ b3Scalar v = vb * denom;
+ b3Scalar w = vc * denom;
+
result.m_closestPointOnSimplex = a + ab * v + ac * w;
result.m_usedVertices.usedVertexA = true;
result.m_usedVertices.usedVertexB = true;
result.m_usedVertices.usedVertexC = true;
- result.setBarycentricCoordinates(1-v-w,v,w);
-
- return true;
-// return a + ab * v + ac * w; // = u*a + v*b + w*c, u = va * denom = b3Scalar(1.0) - v - w
+ result.setBarycentricCoordinates(1 - v - w, v, w);
+ return true;
+ // return a + ab * v + ac * w; // = u*a + v*b + w*c, u = va * denom = b3Scalar(1.0) - v - w
}
-
-
-
-
/// Test if point p and d lie on opposite sides of plane through abc
int b3VoronoiSimplexSolver::pointOutsideOfPlane(const b3Vector3& p, const b3Vector3& a, const b3Vector3& b, const b3Vector3& c, const b3Vector3& d)
{
- b3Vector3 normal = (b-a).cross(c-a);
+ b3Vector3 normal = (b - a).cross(c - a);
- b3Scalar signp = (p - a).dot(normal); // [AP AB AC]
- b3Scalar signd = (d - a).dot( normal); // [AD AB AC]
+ b3Scalar signp = (p - a).dot(normal); // [AP AB AC]
+ b3Scalar signd = (d - a).dot(normal); // [AD AB AC]
#ifdef B3_CATCH_DEGENERATE_TETRAHEDRON
#ifdef BT_USE_DOUBLE_PRECISION
-if (signd * signd < (b3Scalar(1e-8) * b3Scalar(1e-8)))
+ if (signd * signd < (b3Scalar(1e-8) * b3Scalar(1e-8)))
{
return -1;
}
#else
if (signd * signd < (b3Scalar(1e-4) * b3Scalar(1e-4)))
{
-// printf("affine dependent/degenerate\n");//
+ // printf("affine dependent/degenerate\n");//
return -1;
}
#endif
#endif
// Points on opposite sides if expression signs are opposite
- return signp * signd < b3Scalar(0.);
+ return signp * signd < b3Scalar(0.);
}
-
-bool b3VoronoiSimplexSolver::closestPtPointTetrahedron(const b3Vector3& p, const b3Vector3& a, const b3Vector3& b, const b3Vector3& c, const b3Vector3& d, b3SubSimplexClosestResult& finalResult)
+bool b3VoronoiSimplexSolver::closestPtPointTetrahedron(const b3Vector3& p, const b3Vector3& a, const b3Vector3& b, const b3Vector3& c, const b3Vector3& d, b3SubSimplexClosestResult& finalResult)
{
b3SubSimplexClosestResult tempResult;
- // Start out assuming point inside all halfspaces, so closest to itself
+ // Start out assuming point inside all halfspaces, so closest to itself
finalResult.m_closestPointOnSimplex = p;
finalResult.m_usedVertices.reset();
- finalResult.m_usedVertices.usedVertexA = true;
+ finalResult.m_usedVertices.usedVertexA = true;
finalResult.m_usedVertices.usedVertexB = true;
finalResult.m_usedVertices.usedVertexC = true;
finalResult.m_usedVertices.usedVertexD = true;
- int pointOutsideABC = pointOutsideOfPlane(p, a, b, c, d);
+ int pointOutsideABC = pointOutsideOfPlane(p, a, b, c, d);
int pointOutsideACD = pointOutsideOfPlane(p, a, c, d, b);
- int pointOutsideADB = pointOutsideOfPlane(p, a, d, b, c);
- int pointOutsideBDC = pointOutsideOfPlane(p, b, d, c, a);
-
- if (pointOutsideABC < 0 || pointOutsideACD < 0 || pointOutsideADB < 0 || pointOutsideBDC < 0)
- {
- finalResult.m_degenerate = true;
- return false;
- }
+ int pointOutsideADB = pointOutsideOfPlane(p, a, d, b, c);
+ int pointOutsideBDC = pointOutsideOfPlane(p, b, d, c, a);
- if (!pointOutsideABC && !pointOutsideACD && !pointOutsideADB && !pointOutsideBDC)
- {
- return false;
- }
+ if (pointOutsideABC < 0 || pointOutsideACD < 0 || pointOutsideADB < 0 || pointOutsideBDC < 0)
+ {
+ finalResult.m_degenerate = true;
+ return false;
+ }
+ if (!pointOutsideABC && !pointOutsideACD && !pointOutsideADB && !pointOutsideBDC)
+ {
+ return false;
+ }
- b3Scalar bestSqDist = FLT_MAX;
- // If point outside face abc then compute closest point on abc
- if (pointOutsideABC)
+ b3Scalar bestSqDist = FLT_MAX;
+ // If point outside face abc then compute closest point on abc
+ if (pointOutsideABC)
{
- closestPtPointTriangle(p, a, b, c,tempResult);
+ closestPtPointTriangle(p, a, b, c, tempResult);
b3Vector3 q = tempResult.m_closestPointOnSimplex;
-
- b3Scalar sqDist = (q - p).dot( q - p);
- // Update best closest point if (squared) distance is less than current best
- if (sqDist < bestSqDist) {
+
+ b3Scalar sqDist = (q - p).dot(q - p);
+ // Update best closest point if (squared) distance is less than current best
+ if (sqDist < bestSqDist)
+ {
bestSqDist = sqDist;
finalResult.m_closestPointOnSimplex = q;
//convert result bitmask!
@@ -501,25 +478,22 @@ bool b3VoronoiSimplexSolver::closestPtPointTetrahedron(const b3Vector3& p, const
finalResult.m_usedVertices.usedVertexB = tempResult.m_usedVertices.usedVertexB;
finalResult.m_usedVertices.usedVertexC = tempResult.m_usedVertices.usedVertexC;
finalResult.setBarycentricCoordinates(
- tempResult.m_barycentricCoords[VERTA],
- tempResult.m_barycentricCoords[VERTB],
- tempResult.m_barycentricCoords[VERTC],
- 0
- );
-
+ tempResult.m_barycentricCoords[VERTA],
+ tempResult.m_barycentricCoords[VERTB],
+ tempResult.m_barycentricCoords[VERTC],
+ 0);
}
- }
-
+ }
// Repeat test for face acd
- if (pointOutsideACD)
+ if (pointOutsideACD)
{
- closestPtPointTriangle(p, a, c, d,tempResult);
+ closestPtPointTriangle(p, a, c, d, tempResult);
b3Vector3 q = tempResult.m_closestPointOnSimplex;
//convert result bitmask!
- b3Scalar sqDist = (q - p).dot( q - p);
- if (sqDist < bestSqDist)
+ b3Scalar sqDist = (q - p).dot(q - p);
+ if (sqDist < bestSqDist)
{
bestSqDist = sqDist;
finalResult.m_closestPointOnSimplex = q;
@@ -529,52 +503,46 @@ bool b3VoronoiSimplexSolver::closestPtPointTetrahedron(const b3Vector3& p, const
finalResult.m_usedVertices.usedVertexC = tempResult.m_usedVertices.usedVertexB;
finalResult.m_usedVertices.usedVertexD = tempResult.m_usedVertices.usedVertexC;
finalResult.setBarycentricCoordinates(
- tempResult.m_barycentricCoords[VERTA],
- 0,
- tempResult.m_barycentricCoords[VERTB],
- tempResult.m_barycentricCoords[VERTC]
- );
-
+ tempResult.m_barycentricCoords[VERTA],
+ 0,
+ tempResult.m_barycentricCoords[VERTB],
+ tempResult.m_barycentricCoords[VERTC]);
}
- }
- // Repeat test for face adb
+ }
+ // Repeat test for face adb
-
if (pointOutsideADB)
{
- closestPtPointTriangle(p, a, d, b,tempResult);
+ closestPtPointTriangle(p, a, d, b, tempResult);
b3Vector3 q = tempResult.m_closestPointOnSimplex;
//convert result bitmask!
- b3Scalar sqDist = (q - p).dot( q - p);
- if (sqDist < bestSqDist)
+ b3Scalar sqDist = (q - p).dot(q - p);
+ if (sqDist < bestSqDist)
{
bestSqDist = sqDist;
finalResult.m_closestPointOnSimplex = q;
finalResult.m_usedVertices.reset();
finalResult.m_usedVertices.usedVertexA = tempResult.m_usedVertices.usedVertexA;
finalResult.m_usedVertices.usedVertexB = tempResult.m_usedVertices.usedVertexC;
-
+
finalResult.m_usedVertices.usedVertexD = tempResult.m_usedVertices.usedVertexB;
finalResult.setBarycentricCoordinates(
- tempResult.m_barycentricCoords[VERTA],
- tempResult.m_barycentricCoords[VERTC],
- 0,
- tempResult.m_barycentricCoords[VERTB]
- );
-
+ tempResult.m_barycentricCoords[VERTA],
+ tempResult.m_barycentricCoords[VERTC],
+ 0,
+ tempResult.m_barycentricCoords[VERTB]);
}
- }
- // Repeat test for face bdc
-
+ }
+ // Repeat test for face bdc
if (pointOutsideBDC)
{
- closestPtPointTriangle(p, b, d, c,tempResult);
+ closestPtPointTriangle(p, b, d, c, tempResult);
b3Vector3 q = tempResult.m_closestPointOnSimplex;
//convert result bitmask!
- b3Scalar sqDist = (q - p).dot( q - p);
- if (sqDist < bestSqDist)
+ b3Scalar sqDist = (q - p).dot(q - p);
+ if (sqDist < bestSqDist)
{
bestSqDist = sqDist;
finalResult.m_closestPointOnSimplex = q;
@@ -585,25 +553,22 @@ bool b3VoronoiSimplexSolver::closestPtPointTetrahedron(const b3Vector3& p, const
finalResult.m_usedVertices.usedVertexD = tempResult.m_usedVertices.usedVertexB;
finalResult.setBarycentricCoordinates(
- 0,
- tempResult.m_barycentricCoords[VERTA],
- tempResult.m_barycentricCoords[VERTC],
- tempResult.m_barycentricCoords[VERTB]
- );
-
+ 0,
+ tempResult.m_barycentricCoords[VERTA],
+ tempResult.m_barycentricCoords[VERTC],
+ tempResult.m_barycentricCoords[VERTB]);
}
- }
+ }
//help! we ended up full !
-
+
if (finalResult.m_usedVertices.usedVertexA &&
finalResult.m_usedVertices.usedVertexB &&
finalResult.m_usedVertices.usedVertexC &&
- finalResult.m_usedVertices.usedVertexD)
+ finalResult.m_usedVertices.usedVertexD)
{
return true;
}
- return true;
+ return true;
}
-
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3VoronoiSimplexSolver.h b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3VoronoiSimplexSolver.h
index a6e27667d8..b40b169978 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3VoronoiSimplexSolver.h
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/b3VoronoiSimplexSolver.h
@@ -13,22 +13,19 @@ subject to the following restrictions:
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{
+struct b3UsageBitfield
+{
b3UsageBitfield()
{
reset();
@@ -41,137 +38,127 @@ struct b3UsageBitfield{
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;
+ 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
+struct b3SubSimplexClosestResult
{
- b3Vector3 m_closestPointOnSimplex;
+ b3Vector3 m_closestPointOnSimplex;
//MASK for m_usedVertices
- //stores the simplex vertex-usage, using the MASK,
+ //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];
+ b3UsageBitfield m_usedVertices;
+ b3Scalar m_barycentricCoords[4];
bool m_degenerate;
- void reset()
+ void reset()
{
m_degenerate = false;
setBarycentricCoordinates();
m_usedVertices.reset();
}
- bool isValid()
+ bool isValid()
{
bool valid = (m_barycentricCoords[0] >= b3Scalar(0.)) &&
- (m_barycentricCoords[1] >= b3Scalar(0.)) &&
- (m_barycentricCoords[2] >= b3Scalar(0.)) &&
- (m_barycentricCoords[3] >= 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.))
+ 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
+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];
+ 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;
+ 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 m_needsUpdate;
- 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);
+ void removeVertex(int index);
+ void reduceVertices(const b3UsageBitfield& usedVerts);
+ bool updateClosestVectorAndPoints();
-public:
+ 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)
+ : m_equalVertexThreshold(VORONOI_DEFAULT_EQUAL_VERTEX_THRESHOLD)
{
}
- void reset();
-
- void addVertex(const b3Vector3& w, const b3Vector3& p, const b3Vector3& q);
+ void reset();
- void setEqualVertexThreshold(b3Scalar threshold)
- {
- m_equalVertexThreshold = threshold;
- }
+ void addVertex(const b3Vector3& w, const b3Vector3& p, const b3Vector3& q);
- b3Scalar getEqualVertexThreshold() const
- {
- return m_equalVertexThreshold;
- }
+ void setEqualVertexThreshold(b3Scalar threshold)
+ {
+ m_equalVertexThreshold = threshold;
+ }
- bool closest(b3Vector3& v);
+ b3Scalar getEqualVertexThreshold() const
+ {
+ return m_equalVertexThreshold;
+ }
- b3Scalar maxVertex();
+ bool closest(b3Vector3 & v);
- bool fullSimplex() const
- {
- return (m_numVertices == 4);
- }
+ b3Scalar maxVertex();
- int getSimplex(b3Vector3 *pBuf, b3Vector3 *qBuf, b3Vector3 *yBuf) const;
+ bool fullSimplex() const
+ {
+ return (m_numVertices == 4);
+ }
- bool inSimplex(const b3Vector3& w);
-
- void backup_closest(b3Vector3& v) ;
+ int getSimplex(b3Vector3 * pBuf, b3Vector3 * qBuf, b3Vector3 * yBuf) const;
- bool emptySimplex() const ;
+ bool inSimplex(const b3Vector3& w);
- void compute_points(b3Vector3& p1, b3Vector3& p2) ;
+ void backup_closest(b3Vector3 & v);
- int numVertices() const
- {
- return m_numVertices;
- }
+ bool emptySimplex() const;
+ void compute_points(b3Vector3 & p1, b3Vector3 & p2);
+ int numVertices() const
+ {
+ return m_numVertices;
+ }
};
-#endif //B3_VORONOI_SIMPLEX_SOLVER_H
-
+#endif //B3_VORONOI_SIMPLEX_SOLVER_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/bvhTraversal.h b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/bvhTraversal.h
index 4b3b49eae8..f1df8a6970 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/bvhTraversal.h
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/bvhTraversal.h
@@ -1,258 +1,257 @@
//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<numSubtreeHeaders;i++)\n"
-" {\n"
-" btBvhSubtreeInfo subtree = subtreeHeaders[i];\n"
-" \n"
-" int overlap = testQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin,quantizedQueryAabbMax,subtree.m_quantizedAabbMin,subtree.m_quantizedAabbMax);\n"
-" if (overlap != 0)\n"
-" {\n"
-" int startNodeIndex = subtree.m_rootNodeIndex;\n"
-" int endNodeIndex = subtree.m_rootNodeIndex+subtree.m_subtreeSize;\n"
-" int curIndex = startNodeIndex;\n"
-" int escapeIndex;\n"
-" int isLeafNode;\n"
-" int aabbOverlap;\n"
-" while (curIndex < endNodeIndex)\n"
-" {\n"
-" btQuantizedBvhNode rootNode = quantizedNodes[curIndex];\n"
-" aabbOverlap = testQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin,quantizedQueryAabbMax,rootNode.m_quantizedAabbMin,rootNode.m_quantizedAabbMax);\n"
-" isLeafNode = isLeaf(&rootNode);\n"
-" if (aabbOverlap)\n"
-" {\n"
-" if (isLeafNode)\n"
-" {\n"
-" int triangleIndex = getTriangleIndex(&rootNode);\n"
-" if (shapeTypeB==SHAPE_COMPOUND_OF_CONVEX_HULLS)\n"
-" {\n"
-" int numChildrenB = collidables[collidableIndexB].m_numChildShapes;\n"
-" int pairIdx = atomic_add(numConcavePairsOut,numChildrenB);\n"
-" for (int b=0;b<numChildrenB;b++)\n"
-" {\n"
-" if ((pairIdx+b)<maxNumConcavePairsCapacity)\n"
-" {\n"
-" int childShapeIndexB = collidables[collidableIndexB].m_shapeIndex+b;\n"
-" int4 newPair = (int4)(bodyIndexA,bodyIndexB,triangleIndex,childShapeIndexB);\n"
-" concavePairsOut[pairIdx+b] = newPair;\n"
-" }\n"
-" }\n"
-" } else\n"
-" {\n"
-" int pairIdx = atomic_inc(numConcavePairsOut);\n"
-" if (pairIdx<maxNumConcavePairsCapacity)\n"
-" {\n"
-" int4 newPair = (int4)(bodyIndexA,bodyIndexB,triangleIndex,0);\n"
-" concavePairsOut[pairIdx] = newPair;\n"
-" }\n"
-" }\n"
-" } \n"
-" curIndex++;\n"
-" } else\n"
-" {\n"
-" if (isLeafNode)\n"
-" {\n"
-" curIndex++;\n"
-" } else\n"
-" {\n"
-" escapeIndex = getEscapeIndex(&rootNode);\n"
-" curIndex += escapeIndex;\n"
-" }\n"
-" }\n"
-" }\n"
-" }\n"
-" }\n"
-"}\n"
-;
+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<numSubtreeHeaders;i++)\n"
+ " {\n"
+ " btBvhSubtreeInfo subtree = subtreeHeaders[i];\n"
+ " \n"
+ " int overlap = testQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin,quantizedQueryAabbMax,subtree.m_quantizedAabbMin,subtree.m_quantizedAabbMax);\n"
+ " if (overlap != 0)\n"
+ " {\n"
+ " int startNodeIndex = subtree.m_rootNodeIndex;\n"
+ " int endNodeIndex = subtree.m_rootNodeIndex+subtree.m_subtreeSize;\n"
+ " int curIndex = startNodeIndex;\n"
+ " int escapeIndex;\n"
+ " int isLeafNode;\n"
+ " int aabbOverlap;\n"
+ " while (curIndex < endNodeIndex)\n"
+ " {\n"
+ " btQuantizedBvhNode rootNode = quantizedNodes[curIndex];\n"
+ " aabbOverlap = testQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin,quantizedQueryAabbMax,rootNode.m_quantizedAabbMin,rootNode.m_quantizedAabbMax);\n"
+ " isLeafNode = isLeaf(&rootNode);\n"
+ " if (aabbOverlap)\n"
+ " {\n"
+ " if (isLeafNode)\n"
+ " {\n"
+ " int triangleIndex = getTriangleIndex(&rootNode);\n"
+ " if (shapeTypeB==SHAPE_COMPOUND_OF_CONVEX_HULLS)\n"
+ " {\n"
+ " int numChildrenB = collidables[collidableIndexB].m_numChildShapes;\n"
+ " int pairIdx = atomic_add(numConcavePairsOut,numChildrenB);\n"
+ " for (int b=0;b<numChildrenB;b++)\n"
+ " {\n"
+ " if ((pairIdx+b)<maxNumConcavePairsCapacity)\n"
+ " {\n"
+ " int childShapeIndexB = collidables[collidableIndexB].m_shapeIndex+b;\n"
+ " int4 newPair = (int4)(bodyIndexA,bodyIndexB,triangleIndex,childShapeIndexB);\n"
+ " concavePairsOut[pairIdx+b] = newPair;\n"
+ " }\n"
+ " }\n"
+ " } else\n"
+ " {\n"
+ " int pairIdx = atomic_inc(numConcavePairsOut);\n"
+ " if (pairIdx<maxNumConcavePairsCapacity)\n"
+ " {\n"
+ " int4 newPair = (int4)(bodyIndexA,bodyIndexB,triangleIndex,0);\n"
+ " concavePairsOut[pairIdx] = newPair;\n"
+ " }\n"
+ " }\n"
+ " } \n"
+ " curIndex++;\n"
+ " } else\n"
+ " {\n"
+ " if (isLeafNode)\n"
+ " {\n"
+ " curIndex++;\n"
+ " } else\n"
+ " {\n"
+ " escapeIndex = getEscapeIndex(&rootNode);\n"
+ " curIndex += escapeIndex;\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ "}\n";
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/mprKernels.h b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/mprKernels.h
index 7ed4b382c3..74959a931c 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/mprKernels.h
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/mprKernels.h
@@ -1,1446 +1,1445 @@
//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project
-static const char* mprKernelsCL= \
-"/***\n"
-" * ---------------------------------\n"
-" * Copyright (c)2012 Daniel Fiser <danfis@danfis.cz>\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 <http://www.opensource.org/licenses/bsd-license.php>.\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;i<B3_MPR_MAX_ITERATIONS;i++)\n"
-" //while (1)\n"
-" {\n"
-" // compute direction outside the portal (from v0 throught v1,v2,v3\n"
-" // face)\n"
-" b3PortalDir(portal, &dir);\n"
-" // test if origin is inside the portal\n"
-" if (portalEncapsulesOrigin(portal, &dir))\n"
-" return 0;\n"
-" // get next support point\n"
-" \n"
-" b3MprSupport(pairIndex,bodyIndexA,bodyIndexB,cpuBodyBuf,cpuConvexData,cpuCollidables,cpuVertices, sepAxis,&dir, &v4);\n"
-" // test if v4 can expand portal to contain origin and if portal\n"
-" // expanding doesn't reach given tolerance\n"
-" if (!portalCanEncapsuleOrigin(portal, &v4, &dir)\n"
-" || portalReachTolerance(portal, &v4, &dir))\n"
-" {\n"
-" return -1;\n"
-" }\n"
-" // v1-v2-v3 triangle must be rearranged to face outside Minkowski\n"
-" // difference (direction from v0).\n"
-" b3ExpandPortal(portal, &v4);\n"
-" }\n"
-" return -1;\n"
-"}\n"
-"B3_STATIC void b3FindPos(const b3MprSimplex_t *portal, b3Float4 *pos)\n"
-"{\n"
-" b3Float4 zero = b3MakeFloat4(0,0,0,0);\n"
-" b3Float4* b3mpr_vec3_origin = &zero;\n"
-" b3Float4 dir;\n"
-" size_t i;\n"
-" float b[4], sum, inv;\n"
-" b3Float4 vec, p1, p2;\n"
-" b3PortalDir(portal, &dir);\n"
-" // use barycentric coordinates of tetrahedron to find origin\n"
-" b3MprVec3Cross(&vec, &b3MprSimplexPoint(portal, 1)->v,\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<B3_MPR_MAX_ITERATIONS;i++)\n"
-" //while (1)\n"
-" {\n"
-" // compute portal direction and obtain next support point\n"
-" b3PortalDir(portal, &dir);\n"
-" \n"
-" b3MprSupport(pairIndex,bodyIndexA,bodyIndexB,cpuBodyBuf,cpuConvexData,cpuCollidables,cpuVertices, sepAxis,&dir, &v4);\n"
-" // reached tolerance -> 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 (i<numPairs)\n"
-" {\n"
-" int bodyIndexA = pairs[i].x;\n"
-" int bodyIndexB = pairs[i].y;\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"
-" //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_CONVEX_HULL) ||(collidables[collidableIndexB].m_shapeType!=SHAPE_CONVEX_HULL))\n"
-" {\n"
-" return;\n"
-" }\n"
-" float depthOut;\n"
-" b3Float4 dirOut;\n"
-" b3Float4 posOut;\n"
-" int res = b3MprPenetration(pairIndex, bodyIndexA, bodyIndexB,rigidBodies,convexShapes,collidables,vertices,separatingNormals,hasSeparatingAxis,&depthOut, &dirOut, &posOut);\n"
-" \n"
-" \n"
-" \n"
-" \n"
-" if (res==0)\n"
-" {\n"
-" //add a contact\n"
-" int dstIdx;\n"
-" AppendInc( nGlobalContactsOut, dstIdx );\n"
-" if (dstIdx<contactCapacity)\n"
-" {\n"
-" pairs[pairIndex].z = dstIdx;\n"
-" __global struct b3Contact4Data* c = globalContactsOut + dstIdx;\n"
-" c->m_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;i<nContacts;i++)\n"
-" posOut.w = -depthOut;\n"
-" c->m_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;i<numVerts;i++)\n"
-" {\n"
-" float dp = dot(vertices[hull->m_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;i<numUnitSphereDirections;i++)\n"
-" {\n"
-" float4 crossje;\n"
-" crossje = unitSphereDirections[i]; \n"
-" if (dot3F4(DeltaC2,crossje)>0)\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(Max0<Min1 || Max1<Min0)\n"
-" return false;\n"
-" \n"
-" float d0 = Max0 - Min1;\n"
-" float d1 = Max1 - Min0;\n"
-" dist = d0<d1 ? d0:d1;\n"
-" result = true;\n"
-" \n"
-" if(dist<*dmin)\n"
-" {\n"
-" *dmin = dist;\n"
-" *sep = crossje;\n"
-" }\n"
-" }\n"
-" }\n"
-" \n"
-" if((dot3F4(-DeltaC2,*sep))>0.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 (i<numPairs)\n"
-" {\n"
-" if (hasSeparatingAxis[i])\n"
-" {\n"
-" \n"
-" int bodyIndexA = pairs[i].x;\n"
-" int bodyIndexB = pairs[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"
-" \n"
-" float dmin = dmins[i];\n"
-" \n"
-" float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
-" posA.w = 0.f;\n"
-" float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
-" posB.w = 0.f;\n"
-" float4 c0local = convexShapes[shapeIndexA].m_localCenter;\n"
-" float4 ornA = rigidBodies[bodyIndexA].m_quat;\n"
-" float4 c0 = transform(&c0local, &posA, &ornA);\n"
-" float4 c1local = convexShapes[shapeIndexB].m_localCenter;\n"
-" float4 ornB =rigidBodies[bodyIndexB].m_quat;\n"
-" float4 c1 = transform(&c1local,&posB,&ornB);\n"
-" const float4 DeltaC2 = c0 - c1;\n"
-" float4 sepNormal = separatingNormals[i];\n"
-" \n"
-" int numEdgeEdgeDirections = convexShapes[shapeIndexA].m_numUniqueEdges*convexShapes[shapeIndexB].m_numUniqueEdges;\n"
-" if (numEdgeEdgeDirections>numUnitSphereDirections)\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"
-" }//(i<numPairs)\n"
-"}\n"
-;
+static const char* mprKernelsCL =
+ "/***\n"
+ " * ---------------------------------\n"
+ " * Copyright (c)2012 Daniel Fiser <danfis@danfis.cz>\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 <http://www.opensource.org/licenses/bsd-license.php>.\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;i<B3_MPR_MAX_ITERATIONS;i++)\n"
+ " //while (1)\n"
+ " {\n"
+ " // compute direction outside the portal (from v0 throught v1,v2,v3\n"
+ " // face)\n"
+ " b3PortalDir(portal, &dir);\n"
+ " // test if origin is inside the portal\n"
+ " if (portalEncapsulesOrigin(portal, &dir))\n"
+ " return 0;\n"
+ " // get next support point\n"
+ " \n"
+ " b3MprSupport(pairIndex,bodyIndexA,bodyIndexB,cpuBodyBuf,cpuConvexData,cpuCollidables,cpuVertices, sepAxis,&dir, &v4);\n"
+ " // test if v4 can expand portal to contain origin and if portal\n"
+ " // expanding doesn't reach given tolerance\n"
+ " if (!portalCanEncapsuleOrigin(portal, &v4, &dir)\n"
+ " || portalReachTolerance(portal, &v4, &dir))\n"
+ " {\n"
+ " return -1;\n"
+ " }\n"
+ " // v1-v2-v3 triangle must be rearranged to face outside Minkowski\n"
+ " // difference (direction from v0).\n"
+ " b3ExpandPortal(portal, &v4);\n"
+ " }\n"
+ " return -1;\n"
+ "}\n"
+ "B3_STATIC void b3FindPos(const b3MprSimplex_t *portal, b3Float4 *pos)\n"
+ "{\n"
+ " b3Float4 zero = b3MakeFloat4(0,0,0,0);\n"
+ " b3Float4* b3mpr_vec3_origin = &zero;\n"
+ " b3Float4 dir;\n"
+ " size_t i;\n"
+ " float b[4], sum, inv;\n"
+ " b3Float4 vec, p1, p2;\n"
+ " b3PortalDir(portal, &dir);\n"
+ " // use barycentric coordinates of tetrahedron to find origin\n"
+ " b3MprVec3Cross(&vec, &b3MprSimplexPoint(portal, 1)->v,\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<B3_MPR_MAX_ITERATIONS;i++)\n"
+ " //while (1)\n"
+ " {\n"
+ " // compute portal direction and obtain next support point\n"
+ " b3PortalDir(portal, &dir);\n"
+ " \n"
+ " b3MprSupport(pairIndex,bodyIndexA,bodyIndexB,cpuBodyBuf,cpuConvexData,cpuCollidables,cpuVertices, sepAxis,&dir, &v4);\n"
+ " // reached tolerance -> 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 (i<numPairs)\n"
+ " {\n"
+ " int bodyIndexA = pairs[i].x;\n"
+ " int bodyIndexB = pairs[i].y;\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"
+ " //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_CONVEX_HULL) ||(collidables[collidableIndexB].m_shapeType!=SHAPE_CONVEX_HULL))\n"
+ " {\n"
+ " return;\n"
+ " }\n"
+ " float depthOut;\n"
+ " b3Float4 dirOut;\n"
+ " b3Float4 posOut;\n"
+ " int res = b3MprPenetration(pairIndex, bodyIndexA, bodyIndexB,rigidBodies,convexShapes,collidables,vertices,separatingNormals,hasSeparatingAxis,&depthOut, &dirOut, &posOut);\n"
+ " \n"
+ " \n"
+ " \n"
+ " \n"
+ " if (res==0)\n"
+ " {\n"
+ " //add a contact\n"
+ " int dstIdx;\n"
+ " AppendInc( nGlobalContactsOut, dstIdx );\n"
+ " if (dstIdx<contactCapacity)\n"
+ " {\n"
+ " pairs[pairIndex].z = dstIdx;\n"
+ " __global struct b3Contact4Data* c = globalContactsOut + dstIdx;\n"
+ " c->m_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;i<nContacts;i++)\n"
+ " posOut.w = -depthOut;\n"
+ " c->m_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;i<numVerts;i++)\n"
+ " {\n"
+ " float dp = dot(vertices[hull->m_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;i<numUnitSphereDirections;i++)\n"
+ " {\n"
+ " float4 crossje;\n"
+ " crossje = unitSphereDirections[i]; \n"
+ " if (dot3F4(DeltaC2,crossje)>0)\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(Max0<Min1 || Max1<Min0)\n"
+ " return false;\n"
+ " \n"
+ " float d0 = Max0 - Min1;\n"
+ " float d1 = Max1 - Min0;\n"
+ " dist = d0<d1 ? d0:d1;\n"
+ " result = true;\n"
+ " \n"
+ " if(dist<*dmin)\n"
+ " {\n"
+ " *dmin = dist;\n"
+ " *sep = crossje;\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " \n"
+ " if((dot3F4(-DeltaC2,*sep))>0.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 (i<numPairs)\n"
+ " {\n"
+ " if (hasSeparatingAxis[i])\n"
+ " {\n"
+ " \n"
+ " int bodyIndexA = pairs[i].x;\n"
+ " int bodyIndexB = pairs[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"
+ " \n"
+ " float dmin = dmins[i];\n"
+ " \n"
+ " float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
+ " posA.w = 0.f;\n"
+ " float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
+ " posB.w = 0.f;\n"
+ " float4 c0local = convexShapes[shapeIndexA].m_localCenter;\n"
+ " float4 ornA = rigidBodies[bodyIndexA].m_quat;\n"
+ " float4 c0 = transform(&c0local, &posA, &ornA);\n"
+ " float4 c1local = convexShapes[shapeIndexB].m_localCenter;\n"
+ " float4 ornB =rigidBodies[bodyIndexB].m_quat;\n"
+ " float4 c1 = transform(&c1local,&posB,&ornB);\n"
+ " const float4 DeltaC2 = c0 - c1;\n"
+ " float4 sepNormal = separatingNormals[i];\n"
+ " \n"
+ " int numEdgeEdgeDirections = convexShapes[shapeIndexA].m_numUniqueEdges*convexShapes[shapeIndexB].m_numUniqueEdges;\n"
+ " if (numEdgeEdgeDirections>numUnitSphereDirections)\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"
+ " }//(i<numPairs)\n"
+ "}\n";
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/primitiveContacts.h b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/primitiveContacts.h
index b0103fe674..b2e0a2dd47 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/primitiveContacts.h
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/primitiveContacts.h
@@ -1,1289 +1,1288 @@
//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project
-static const char* primitiveContactsKernelsCL= \
-"#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"
-"#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 (l2<radius*radius)\n"
-" {\n"
-" dist = sqrt(l2);\n"
-" if (dist>minDist)\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;i<nPoints;i++)\n"
-" center += p[i];\n"
-" center /= (float)nPoints;\n"
-" }\n"
-" \n"
-" \n"
-" \n"
-" // sample 4 directions\n"
-" \n"
-" float4 aVector = p[0] - center;\n"
-" float4 u = cross3( nearNormal, aVector );\n"
-" float4 v = cross3( nearNormal, u );\n"
-" u = normalize3( u );\n"
-" v = normalize3( v );\n"
-" \n"
-" \n"
-" //keep point with deepest penetration\n"
-" float minW= FLT_MAX;\n"
-" \n"
-" int minIndex=-1;\n"
-" \n"
-" float4 maxDots;\n"
-" maxDots.x = FLT_MIN;\n"
-" maxDots.y = FLT_MIN;\n"
-" maxDots.z = FLT_MIN;\n"
-" maxDots.w = FLT_MIN;\n"
-" \n"
-" // idx, distance\n"
-" for(int ie = 0; ie<nPoints; ie++ )\n"
-" {\n"
-" if (p[ie].w<minW)\n"
-" {\n"
-" minW = p[ie].w;\n"
-" minIndex=ie;\n"
-" }\n"
-" float f;\n"
-" float4 r = p[ie]-center;\n"
-" f = dot3F4( u, r );\n"
-" if (f<maxDots.x)\n"
-" {\n"
-" maxDots.x = f;\n"
-" contactIdx[0].x = ie;\n"
-" }\n"
-" \n"
-" f = dot3F4( -u, r );\n"
-" if (f<maxDots.y)\n"
-" {\n"
-" maxDots.y = f;\n"
-" contactIdx[0].y = ie;\n"
-" }\n"
-" \n"
-" \n"
-" f = dot3F4( v, r );\n"
-" if (f<maxDots.z)\n"
-" {\n"
-" maxDots.z = f;\n"
-" contactIdx[0].z = ie;\n"
-" }\n"
-" \n"
-" f = dot3F4( -v, r );\n"
-" if (f<maxDots.w)\n"
-" {\n"
-" maxDots.w = f;\n"
-" contactIdx[0].w = ie;\n"
-" }\n"
-" \n"
-" }\n"
-" \n"
-" if (contactIdx[0].x != minIndex && contactIdx[0].y != minIndex && contactIdx[0].z != minIndex && contactIdx[0].w != minIndex)\n"
-" {\n"
-" //replace the first contact with minimum (todo: replace contact with least penetration)\n"
-" contactIdx[0].x = minIndex;\n"
-" }\n"
-" \n"
-" return 4;\n"
-" \n"
-"}\n"
-"#define MAX_PLANE_CONVEX_POINTS 64\n"
-"int computeContactPlaneConvex(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 posB,\n"
-" Quaternion ornB\n"
-" )\n"
-"{\n"
-" int resultIndex=-1;\n"
-" int shapeIndex = collidables[collidableIndexB].m_shapeIndex;\n"
-" __global const ConvexPolyhedronCL* hullB = &convexShapes[shapeIndex];\n"
-" \n"
-" float4 posA;\n"
-" posA = rigidBodies[bodyIndexA].m_pos;\n"
-" Quaternion ornA;\n"
-" ornA = rigidBodies[bodyIndexA].m_quat;\n"
-" int numContactsOut = 0;\n"
-" int numWorldVertsB1= 0;\n"
-" float4 planeEq;\n"
-" planeEq = faces[collidables[collidableIndexA].m_shapeIndex].m_plane;\n"
-" float4 planeNormal = make_float4(planeEq.x,planeEq.y,planeEq.z,0.f);\n"
-" float4 planeNormalWorld;\n"
-" planeNormalWorld = qtRotate(ornA,planeNormal);\n"
-" float planeConstant = planeEq.w;\n"
-" \n"
-" float4 invPosA;Quaternion invOrnA;\n"
-" float4 convexInPlaneTransPos1; Quaternion convexInPlaneTransOrn1;\n"
-" {\n"
-" \n"
-" trInverse(posA,ornA,&invPosA,&invOrnA);\n"
-" trMul(invPosA,invOrnA,posB,ornB,&convexInPlaneTransPos1,&convexInPlaneTransOrn1);\n"
-" }\n"
-" float4 invPosB;Quaternion invOrnB;\n"
-" float4 planeInConvexPos1; Quaternion planeInConvexOrn1;\n"
-" {\n"
-" \n"
-" trInverse(posB,ornB,&invPosB,&invOrnB);\n"
-" trMul(invPosB,invOrnB,posA,ornA,&planeInConvexPos1,&planeInConvexOrn1); \n"
-" }\n"
-" \n"
-" float4 planeNormalInConvex = qtRotate(planeInConvexOrn1,-planeNormal);\n"
-" float maxDot = -1e30;\n"
-" int hitVertex=-1;\n"
-" float4 hitVtx;\n"
-" float4 contactPoints[MAX_PLANE_CONVEX_POINTS];\n"
-" int numPoints = 0;\n"
-" int4 contactIdx;\n"
-" contactIdx=make_int4(0,1,2,3);\n"
-" \n"
-" \n"
-" for (int i=0;i<hullB->m_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 (numPoints<MAX_PLANE_CONVEX_POINTS)\n"
-" {\n"
-" float4 vtxWorld = transform(&vtx, &posB, &ornB);\n"
-" float4 vtxInPlane = transform(&vtxWorld, &invPosA, &invOrnA);//oplaneTransform.inverse()*vtxWorld;\n"
-" float dist = dot(planeNormal,vtxInPlane)-planeConstant;\n"
-" if (dist<0.f)\n"
-" {\n"
-" vtxWorld.w = dist;\n"
-" contactPoints[numPoints] = vtxWorld;\n"
-" numPoints++;\n"
-" }\n"
-" }\n"
-" }\n"
-" int numReducedPoints = numPoints;\n"
-" if (numPoints>4)\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<numPairs)\n"
-" {\n"
-" int bodyIndexA = pairs[i].x;\n"
-" int bodyIndexB = pairs[i].y;\n"
-" \n"
-" int collidableIndexA = rigidBodies[bodyIndexA].m_collidableIdx;\n"
-" int collidableIndexB = rigidBodies[bodyIndexB].m_collidableIdx;\n"
-" \n"
-" if (collidables[collidableIndexA].m_shapeType == SHAPE_PLANE &&\n"
-" collidables[collidableIndexB].m_shapeType == SHAPE_CONVEX_HULL)\n"
-" {\n"
-" float4 posB;\n"
-" posB = rigidBodies[bodyIndexB].m_pos;\n"
-" Quaternion ornB;\n"
-" ornB = rigidBodies[bodyIndexB].m_quat;\n"
-" int contactIndex = computeContactPlaneConvex(pairIndex, bodyIndexA, bodyIndexB, collidableIndexA, collidableIndexB, \n"
-" rigidBodies,collidables,convexShapes,vertices,indices,\n"
-" faces, globalContactsOut, nGlobalContactsOut,maxContactCapacity, posB,ornB);\n"
-" if (contactIndex>=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<numPairs)\n"
-"}\n"
-"// work-in-progress\n"
-"__kernel void processCompoundPairsPrimitivesKernel( __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 struct b3Contact4Data* restrict globalContactsOut,\n"
-" counter32_t nGlobalContactsOut,\n"
-" int numCompoundPairs, int maxContactCapacity\n"
-" )\n"
-"{\n"
-" int i = get_global_id(0);\n"
-" if (i<numCompoundPairs)\n"
-" {\n"
-" int bodyIndexA = gpuCompoundPairs[i].x;\n"
-" int bodyIndexB = gpuCompoundPairs[i].y;\n"
-" int childShapeIndexA = gpuCompoundPairs[i].z;\n"
-" int childShapeIndexB = gpuCompoundPairs[i].w;\n"
-" \n"
-" int collidableIndexA = -1;\n"
-" int collidableIndexB = -1;\n"
-" \n"
-" float4 ornA = rigidBodies[bodyIndexA].m_quat;\n"
-" float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
-" \n"
-" float4 ornB = rigidBodies[bodyIndexB].m_quat;\n"
-" float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
-" \n"
-" if (childShapeIndexA >= 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<numCompoundPairs)\n"
-"}\n"
-"bool pointInTriangle(const float4* vertices, const float4* normal, float4 *p )\n"
-"{\n"
-" const float4* p1 = &vertices[0];\n"
-" const float4* p2 = &vertices[1];\n"
-" const float4* p3 = &vertices[2];\n"
-" float4 edge1; edge1 = (*p2 - *p1);\n"
-" float4 edge2; edge2 = ( *p3 - *p2 );\n"
-" float4 edge3; edge3 = ( *p1 - *p3 );\n"
-" \n"
-" float4 p1_to_p; p1_to_p = ( *p - *p1 );\n"
-" float4 p2_to_p; p2_to_p = ( *p - *p2 );\n"
-" float4 p3_to_p; p3_to_p = ( *p - *p3 );\n"
-" float4 edge1_normal; edge1_normal = ( cross(edge1,*normal));\n"
-" float4 edge2_normal; edge2_normal = ( cross(edge2,*normal));\n"
-" float4 edge3_normal; edge3_normal = ( cross(edge3,*normal));\n"
-" \n"
-" \n"
-" float r1, r2, r3;\n"
-" r1 = dot(edge1_normal,p1_to_p );\n"
-" r2 = dot(edge2_normal,p2_to_p );\n"
-" r3 = dot(edge3_normal,p3_to_p );\n"
-" \n"
-" if ( r1 > 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"
-;
+static const char* primitiveContactsKernelsCL =
+ "#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"
+ "#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 (l2<radius*radius)\n"
+ " {\n"
+ " dist = sqrt(l2);\n"
+ " if (dist>minDist)\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;i<nPoints;i++)\n"
+ " center += p[i];\n"
+ " center /= (float)nPoints;\n"
+ " }\n"
+ " \n"
+ " \n"
+ " \n"
+ " // sample 4 directions\n"
+ " \n"
+ " float4 aVector = p[0] - center;\n"
+ " float4 u = cross3( nearNormal, aVector );\n"
+ " float4 v = cross3( nearNormal, u );\n"
+ " u = normalize3( u );\n"
+ " v = normalize3( v );\n"
+ " \n"
+ " \n"
+ " //keep point with deepest penetration\n"
+ " float minW= FLT_MAX;\n"
+ " \n"
+ " int minIndex=-1;\n"
+ " \n"
+ " float4 maxDots;\n"
+ " maxDots.x = FLT_MIN;\n"
+ " maxDots.y = FLT_MIN;\n"
+ " maxDots.z = FLT_MIN;\n"
+ " maxDots.w = FLT_MIN;\n"
+ " \n"
+ " // idx, distance\n"
+ " for(int ie = 0; ie<nPoints; ie++ )\n"
+ " {\n"
+ " if (p[ie].w<minW)\n"
+ " {\n"
+ " minW = p[ie].w;\n"
+ " minIndex=ie;\n"
+ " }\n"
+ " float f;\n"
+ " float4 r = p[ie]-center;\n"
+ " f = dot3F4( u, r );\n"
+ " if (f<maxDots.x)\n"
+ " {\n"
+ " maxDots.x = f;\n"
+ " contactIdx[0].x = ie;\n"
+ " }\n"
+ " \n"
+ " f = dot3F4( -u, r );\n"
+ " if (f<maxDots.y)\n"
+ " {\n"
+ " maxDots.y = f;\n"
+ " contactIdx[0].y = ie;\n"
+ " }\n"
+ " \n"
+ " \n"
+ " f = dot3F4( v, r );\n"
+ " if (f<maxDots.z)\n"
+ " {\n"
+ " maxDots.z = f;\n"
+ " contactIdx[0].z = ie;\n"
+ " }\n"
+ " \n"
+ " f = dot3F4( -v, r );\n"
+ " if (f<maxDots.w)\n"
+ " {\n"
+ " maxDots.w = f;\n"
+ " contactIdx[0].w = ie;\n"
+ " }\n"
+ " \n"
+ " }\n"
+ " \n"
+ " if (contactIdx[0].x != minIndex && contactIdx[0].y != minIndex && contactIdx[0].z != minIndex && contactIdx[0].w != minIndex)\n"
+ " {\n"
+ " //replace the first contact with minimum (todo: replace contact with least penetration)\n"
+ " contactIdx[0].x = minIndex;\n"
+ " }\n"
+ " \n"
+ " return 4;\n"
+ " \n"
+ "}\n"
+ "#define MAX_PLANE_CONVEX_POINTS 64\n"
+ "int computeContactPlaneConvex(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 posB,\n"
+ " Quaternion ornB\n"
+ " )\n"
+ "{\n"
+ " int resultIndex=-1;\n"
+ " int shapeIndex = collidables[collidableIndexB].m_shapeIndex;\n"
+ " __global const ConvexPolyhedronCL* hullB = &convexShapes[shapeIndex];\n"
+ " \n"
+ " float4 posA;\n"
+ " posA = rigidBodies[bodyIndexA].m_pos;\n"
+ " Quaternion ornA;\n"
+ " ornA = rigidBodies[bodyIndexA].m_quat;\n"
+ " int numContactsOut = 0;\n"
+ " int numWorldVertsB1= 0;\n"
+ " float4 planeEq;\n"
+ " planeEq = faces[collidables[collidableIndexA].m_shapeIndex].m_plane;\n"
+ " float4 planeNormal = make_float4(planeEq.x,planeEq.y,planeEq.z,0.f);\n"
+ " float4 planeNormalWorld;\n"
+ " planeNormalWorld = qtRotate(ornA,planeNormal);\n"
+ " float planeConstant = planeEq.w;\n"
+ " \n"
+ " float4 invPosA;Quaternion invOrnA;\n"
+ " float4 convexInPlaneTransPos1; Quaternion convexInPlaneTransOrn1;\n"
+ " {\n"
+ " \n"
+ " trInverse(posA,ornA,&invPosA,&invOrnA);\n"
+ " trMul(invPosA,invOrnA,posB,ornB,&convexInPlaneTransPos1,&convexInPlaneTransOrn1);\n"
+ " }\n"
+ " float4 invPosB;Quaternion invOrnB;\n"
+ " float4 planeInConvexPos1; Quaternion planeInConvexOrn1;\n"
+ " {\n"
+ " \n"
+ " trInverse(posB,ornB,&invPosB,&invOrnB);\n"
+ " trMul(invPosB,invOrnB,posA,ornA,&planeInConvexPos1,&planeInConvexOrn1); \n"
+ " }\n"
+ " \n"
+ " float4 planeNormalInConvex = qtRotate(planeInConvexOrn1,-planeNormal);\n"
+ " float maxDot = -1e30;\n"
+ " int hitVertex=-1;\n"
+ " float4 hitVtx;\n"
+ " float4 contactPoints[MAX_PLANE_CONVEX_POINTS];\n"
+ " int numPoints = 0;\n"
+ " int4 contactIdx;\n"
+ " contactIdx=make_int4(0,1,2,3);\n"
+ " \n"
+ " \n"
+ " for (int i=0;i<hullB->m_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 (numPoints<MAX_PLANE_CONVEX_POINTS)\n"
+ " {\n"
+ " float4 vtxWorld = transform(&vtx, &posB, &ornB);\n"
+ " float4 vtxInPlane = transform(&vtxWorld, &invPosA, &invOrnA);//oplaneTransform.inverse()*vtxWorld;\n"
+ " float dist = dot(planeNormal,vtxInPlane)-planeConstant;\n"
+ " if (dist<0.f)\n"
+ " {\n"
+ " vtxWorld.w = dist;\n"
+ " contactPoints[numPoints] = vtxWorld;\n"
+ " numPoints++;\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " int numReducedPoints = numPoints;\n"
+ " if (numPoints>4)\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<numPairs)\n"
+ " {\n"
+ " int bodyIndexA = pairs[i].x;\n"
+ " int bodyIndexB = pairs[i].y;\n"
+ " \n"
+ " int collidableIndexA = rigidBodies[bodyIndexA].m_collidableIdx;\n"
+ " int collidableIndexB = rigidBodies[bodyIndexB].m_collidableIdx;\n"
+ " \n"
+ " if (collidables[collidableIndexA].m_shapeType == SHAPE_PLANE &&\n"
+ " collidables[collidableIndexB].m_shapeType == SHAPE_CONVEX_HULL)\n"
+ " {\n"
+ " float4 posB;\n"
+ " posB = rigidBodies[bodyIndexB].m_pos;\n"
+ " Quaternion ornB;\n"
+ " ornB = rigidBodies[bodyIndexB].m_quat;\n"
+ " int contactIndex = computeContactPlaneConvex(pairIndex, bodyIndexA, bodyIndexB, collidableIndexA, collidableIndexB, \n"
+ " rigidBodies,collidables,convexShapes,vertices,indices,\n"
+ " faces, globalContactsOut, nGlobalContactsOut,maxContactCapacity, posB,ornB);\n"
+ " if (contactIndex>=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<numPairs)\n"
+ "}\n"
+ "// work-in-progress\n"
+ "__kernel void processCompoundPairsPrimitivesKernel( __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 struct b3Contact4Data* restrict globalContactsOut,\n"
+ " counter32_t nGlobalContactsOut,\n"
+ " int numCompoundPairs, int maxContactCapacity\n"
+ " )\n"
+ "{\n"
+ " int i = get_global_id(0);\n"
+ " if (i<numCompoundPairs)\n"
+ " {\n"
+ " int bodyIndexA = gpuCompoundPairs[i].x;\n"
+ " int bodyIndexB = gpuCompoundPairs[i].y;\n"
+ " int childShapeIndexA = gpuCompoundPairs[i].z;\n"
+ " int childShapeIndexB = gpuCompoundPairs[i].w;\n"
+ " \n"
+ " int collidableIndexA = -1;\n"
+ " int collidableIndexB = -1;\n"
+ " \n"
+ " float4 ornA = rigidBodies[bodyIndexA].m_quat;\n"
+ " float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
+ " \n"
+ " float4 ornB = rigidBodies[bodyIndexB].m_quat;\n"
+ " float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
+ " \n"
+ " if (childShapeIndexA >= 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<numCompoundPairs)\n"
+ "}\n"
+ "bool pointInTriangle(const float4* vertices, const float4* normal, float4 *p )\n"
+ "{\n"
+ " const float4* p1 = &vertices[0];\n"
+ " const float4* p2 = &vertices[1];\n"
+ " const float4* p3 = &vertices[2];\n"
+ " float4 edge1; edge1 = (*p2 - *p1);\n"
+ " float4 edge2; edge2 = ( *p3 - *p2 );\n"
+ " float4 edge3; edge3 = ( *p1 - *p3 );\n"
+ " \n"
+ " float4 p1_to_p; p1_to_p = ( *p - *p1 );\n"
+ " float4 p2_to_p; p2_to_p = ( *p - *p2 );\n"
+ " float4 p3_to_p; p3_to_p = ( *p - *p3 );\n"
+ " float4 edge1_normal; edge1_normal = ( cross(edge1,*normal));\n"
+ " float4 edge2_normal; edge2_normal = ( cross(edge2,*normal));\n"
+ " float4 edge3_normal; edge3_normal = ( cross(edge3,*normal));\n"
+ " \n"
+ " \n"
+ " float r1, r2, r3;\n"
+ " r1 = dot(edge1_normal,p1_to_p );\n"
+ " r2 = dot(edge2_normal,p2_to_p );\n"
+ " r3 = dot(edge3_normal,p3_to_p );\n"
+ " \n"
+ " if ( r1 > 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/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/satClipHullContacts.h b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/satClipHullContacts.h
index f0ecfc7851..907809d8bd 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/satClipHullContacts.h
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/satClipHullContacts.h
@@ -1,2099 +1,2098 @@
//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;face<hullA->m_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;e0<numVerticesA;e0++)\n"
-" {\n"
-" const float4 a = vertices[hullA->m_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;i<numVertsIn;i++)\n"
-" {\n"
-" float depth = dot3F4(planeNormalWS,pVtxIn[i])+planeEqWS;\n"
-" if (depth <=minDist)\n"
-" {\n"
-" depth = minDist;\n"
-" }\n"
-" if (depth <=maxDist)\n"
-" {\n"
-" float4 pointInWorld = pVtxIn[i];\n"
-" //resultOut.addContactPoint(separatingNormal,point,depth);\n"
-" contactsOut[numContactsOut++] = make_float4(pointInWorld.x,pointInWorld.y,pointInWorld.z,depth);\n"
-" }\n"
-" }\n"
-" }\n"
-" return numContactsOut;\n"
-"}\n"
-"int clipFaceAgainstHullLocalA(const float4 separatingNormal, 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"
-" 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* 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;face<hullA->m_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;e0<numVerticesA;e0++)\n"
-" {\n"
-" const float4 a = verticesA[hullA->m_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;i<numVertsIn;i++)\n"
-" {\n"
-" float depth = dot3F4(planeNormalWS,pVtxIn[i])+planeEqWS;\n"
-" if (depth <=minDist)\n"
-" {\n"
-" depth = minDist;\n"
-" }\n"
-" if (depth <=maxDist)\n"
-" {\n"
-" float4 pointInWorld = pVtxIn[i];\n"
-" //resultOut.addContactPoint(separatingNormal,point,depth);\n"
-" contactsOut[numContactsOut++] = make_float4(pointInWorld.x,pointInWorld.y,pointInWorld.z,depth);\n"
-" }\n"
-" }\n"
-" }\n"
-" return numContactsOut;\n"
-"}\n"
-"int clipHullAgainstHull(const float4 separatingNormal,\n"
-" __global 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"
-" __global const float4* vertices,\n"
-" __global const b3GpuFace_t* faces,\n"
-" __global const int* indices,\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;face<hullB->m_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;e0<numVertices;e0++)\n"
-" {\n"
-" const float4 b = vertices[hullB->m_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;face<hullB->m_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;e0<numVertices;e0++)\n"
-" {\n"
-" const float4 b = verticesB[hullB->m_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<n; j++) v[0] += v[j];\n"
-"#define PARALLEL_DO(execution, n) for(int ie=0; ie<n; ie++){execution;}\n"
-"#define REDUCE_MAX(v, n) {int i=0; for(int offset=0; offset<n; offset++) v[i] = (v[i].y > v[i+offset].y)? v[i]: v[i+offset]; }\n"
-"#define REDUCE_MIN(v, n) {int i=0; for(int offset=0; offset<n; offset++) v[i] = (v[i].y < v[i+offset].y)? v[i]: v[i+offset]; }\n"
-"int extractManifoldSequentialGlobal(__global 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;i<nPoints;i++)\n"
-" center += p[i];\n"
-" center /= (float)nPoints;\n"
-" }\n"
-" \n"
-" \n"
-" \n"
-" // sample 4 directions\n"
-" \n"
-" float4 aVector = p[0] - center;\n"
-" float4 u = cross3( nearNormal, aVector );\n"
-" float4 v = cross3( nearNormal, u );\n"
-" u = normalize3( u );\n"
-" v = normalize3( v );\n"
-" \n"
-" \n"
-" //keep point with deepest penetration\n"
-" float minW= FLT_MAX;\n"
-" \n"
-" int minIndex=-1;\n"
-" \n"
-" float4 maxDots;\n"
-" maxDots.x = FLT_MIN;\n"
-" maxDots.y = FLT_MIN;\n"
-" maxDots.z = FLT_MIN;\n"
-" maxDots.w = FLT_MIN;\n"
-" \n"
-" // idx, distance\n"
-" for(int ie = 0; ie<nPoints; ie++ )\n"
-" {\n"
-" if (p[ie].w<minW)\n"
-" {\n"
-" minW = p[ie].w;\n"
-" minIndex=ie;\n"
-" }\n"
-" float f;\n"
-" float4 r = p[ie]-center;\n"
-" f = dot3F4( u, r );\n"
-" if (f<maxDots.x)\n"
-" {\n"
-" maxDots.x = f;\n"
-" contactIdx[0].x = ie;\n"
-" }\n"
-" \n"
-" f = dot3F4( -u, r );\n"
-" if (f<maxDots.y)\n"
-" {\n"
-" maxDots.y = f;\n"
-" contactIdx[0].y = ie;\n"
-" }\n"
-" \n"
-" \n"
-" f = dot3F4( v, r );\n"
-" if (f<maxDots.z)\n"
-" {\n"
-" maxDots.z = f;\n"
-" contactIdx[0].z = ie;\n"
-" }\n"
-" \n"
-" f = dot3F4( -v, r );\n"
-" if (f<maxDots.w)\n"
-" {\n"
-" maxDots.w = f;\n"
-" contactIdx[0].w = ie;\n"
-" }\n"
-" \n"
-" }\n"
-" \n"
-" if (contactIdx[0].x != minIndex && contactIdx[0].y != minIndex && contactIdx[0].z != minIndex && contactIdx[0].w != minIndex)\n"
-" {\n"
-" //replace the first contact with minimum (todo: replace contact with least penetration)\n"
-" contactIdx[0].x = minIndex;\n"
-" }\n"
-" \n"
-" return 4;\n"
-" \n"
-"}\n"
-"int extractManifoldSequentialGlobalFake(__global const float4* p, int nPoints, float4 nearNormal, int* contactIdx)\n"
-"{\n"
-" contactIdx[0] = 0;\n"
-" contactIdx[1] = 1;\n"
-" contactIdx[2] = 2;\n"
-" contactIdx[3] = 3;\n"
-" \n"
-" if( nPoints == 0 ) return 0;\n"
-" \n"
-" nPoints = min2( nPoints, 4 );\n"
-" return nPoints;\n"
-" \n"
-"}\n"
-"int extractManifoldSequential(const float4* p, int nPoints, float4 nearNormal, int* contactIdx)\n"
-"{\n"
-" if( nPoints == 0 ) return 0;\n"
-" nPoints = min2( nPoints, 64 );\n"
-" float4 center = make_float4(0.f);\n"
-" {\n"
-" float4 v[64];\n"
-" for (int i=0;i<nPoints;i++)\n"
-" v[i] = p[i];\n"
-" //memcpy( v, p, nPoints*sizeof(float4) );\n"
-" PARALLEL_SUM( v, nPoints );\n"
-" center = v[0]/(float)nPoints;\n"
-" }\n"
-" \n"
-" { // sample 4 directions\n"
-" if( nPoints < 4 )\n"
-" {\n"
-" for(int i=0; i<nPoints; i++) \n"
-" contactIdx[i] = i;\n"
-" return nPoints;\n"
-" }\n"
-" float4 aVector = p[0] - center;\n"
-" float4 u = cross3( nearNormal, aVector );\n"
-" float4 v = cross3( nearNormal, u );\n"
-" u = normalize3( u );\n"
-" v = normalize3( v );\n"
-" int idx[4];\n"
-" float2 max00 = make_float2(0,FLT_MAX);\n"
-" {\n"
-" // idx, distance\n"
-" {\n"
-" {\n"
-" int4 a[64];\n"
-" for(int ie = 0; ie<nPoints; ie++ )\n"
-" {\n"
-" \n"
-" \n"
-" float f;\n"
-" float4 r = p[ie]-center;\n"
-" f = dot3F4( u, r );\n"
-" a[ie].x = ((*(u32*)&f) & 0xffffff00) | (0xff & ie);\n"
-" f = dot3F4( -u, r );\n"
-" a[ie].y = ((*(u32*)&f) & 0xffffff00) | (0xff & ie);\n"
-" f = dot3F4( v, r );\n"
-" a[ie].z = ((*(u32*)&f) & 0xffffff00) | (0xff & ie);\n"
-" f = dot3F4( -v, r );\n"
-" a[ie].w = ((*(u32*)&f) & 0xffffff00) | (0xff & ie);\n"
-" }\n"
-" for(int ie=0; ie<nPoints; ie++)\n"
-" {\n"
-" a[0].x = (a[0].x > 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 (idx<numPairs)\n"
-" {\n"
-" float4 normal = separatingNormalsWorld[idx];\n"
-" int nPoints = contactCounts[idx];\n"
-" __global const float4* pointsIn = &closestPointsWorld[contactOffsets[idx]];\n"
-" float4 localPoints[64];\n"
-" for (int i=0;i<nPoints;i++)\n"
-" {\n"
-" localPoints[i] = pointsIn[i];\n"
-" }\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"
-" int nContacts = extractManifoldSequential(localPoints, nPoints, normal, contactIdx);\n"
-" int dstIdx;\n"
-" AppendInc( nContactsOut, dstIdx );\n"
-" if (dstIdx<contactCapacity)\n"
-" {\n"
-" __global struct b3Contact4Data* c = contactsOut + dstIdx;\n"
-" c->m_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;i<nContacts;i++)\n"
-" {\n"
-" c->m_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 (i<numPairs)\n"
-" {\n"
-" int bodyIndexA = pairs[i].x;\n"
-" int bodyIndexB = pairs[i].y;\n"
-" \n"
-" int collidableIndexA = rigidBodies[bodyIndexA].m_collidableIdx;\n"
-" int collidableIndexB = rigidBodies[bodyIndexB].m_collidableIdx;\n"
-" if (hasSeparatingAxis[i])\n"
-" {\n"
-" \n"
-" int shapeIndexA = collidables[collidableIndexA].m_shapeIndex;\n"
-" int shapeIndexB = collidables[collidableIndexB].m_shapeIndex;\n"
-" \n"
-" \n"
-" int numLocalContactsOut = clipHullAgainstHull(separatingNormals[i],\n"
-" &convexShapes[shapeIndexA], &convexShapes[shapeIndexB],\n"
-" rigidBodies[bodyIndexA].m_pos,rigidBodies[bodyIndexA].m_quat,\n"
-" rigidBodies[bodyIndexB].m_pos,rigidBodies[bodyIndexB].m_quat,\n"
-" worldVertsB1,worldVertsB2,capacityWorldVerts,\n"
-" minDist, maxDist,\n"
-" vertices,faces,indices,\n"
-" localContactsOut,localContactCapacity);\n"
-" \n"
-" if (numLocalContactsOut>0)\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 (dstIdx<contactCapacity)\n"
-" {\n"
-" pairs[pairIndex].z = dstIdx;\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"
-" 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;i<nReducedContacts;i++)\n"
-" {\n"
-" //this condition means: overwrite contact point, unless at index i==0 we have a valid 'mpr' contact\n"
-" if (i>0||(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<numPairs)\n"
-"}\n"
-"__kernel void clipCompoundsHullHullKernel( __global const int4* gpuCompoundPairs, \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 b3GpuChildShape_t* gpuChildShapes,\n"
-" __global const float4* gpuCompoundSepNormalsOut,\n"
-" __global const int* gpuHasCompoundSepNormalsOut,\n"
-" __global struct b3Contact4Data* restrict globalContactsOut,\n"
-" counter32_t nGlobalContactsOut,\n"
-" int numCompoundPairs, 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<numCompoundPairs)\n"
-" {\n"
-" if (gpuHasCompoundSepNormalsOut[i])\n"
-" {\n"
-" int bodyIndexA = gpuCompoundPairs[i].x;\n"
-" int bodyIndexB = gpuCompoundPairs[i].y;\n"
-" \n"
-" int childShapeIndexA = gpuCompoundPairs[i].z;\n"
-" int childShapeIndexB = gpuCompoundPairs[i].w;\n"
-" \n"
-" int collidableIndexA = -1;\n"
-" int collidableIndexB = -1;\n"
-" \n"
-" float4 ornA = rigidBodies[bodyIndexA].m_quat;\n"
-" float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
-" \n"
-" float4 ornB = rigidBodies[bodyIndexB].m_quat;\n"
-" float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
-" \n"
-" if (childShapeIndexA >= 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;i<nReducedContacts;i++)\n"
-" {\n"
-" c->m_worldPosB[i] = pointsIn[contactIdx[i]];\n"
-" }\n"
-" GET_NPOINTS(*c) = nReducedContacts;\n"
-" }\n"
-" \n"
-" }// if (numContactsOut>0)\n"
-" }// if (gpuHasCompoundSepNormalsOut[i])\n"
-" }// if (i<numCompoundPairs)\n"
-"}\n"
-"__kernel void sphereSphereCollisionKernel( __global const int4* pairs, \n"
-" __global const b3RigidBodyData_t* rigidBodies, \n"
-" __global const b3Collidable_t* collidables,\n"
-" __global const float4* separatingNormals,\n"
-" __global const 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"
-" \n"
-" if (i<numPairs)\n"
-" {\n"
-" int bodyIndexA = pairs[i].x;\n"
-" int bodyIndexB = pairs[i].y;\n"
-" \n"
-" int collidableIndexA = rigidBodies[bodyIndexA].m_collidableIdx;\n"
-" int collidableIndexB = rigidBodies[bodyIndexB].m_collidableIdx;\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"
-" 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 (i<numPairs)\n"
-"} \n"
-"__kernel void clipHullHullConcaveConvexKernel( __global int4* concavePairsIn,\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 b3GpuChildShape_t* gpuChildShapes,\n"
-" __global const float4* separatingNormals,\n"
-" __global struct b3Contact4Data* restrict globalContactsOut,\n"
-" counter32_t nGlobalContactsOut,\n"
-" int contactCapacity,\n"
-" int numConcavePairs)\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<numConcavePairs)\n"
-" {\n"
-" //negative value means that the pair is invalid\n"
-" if (concavePairsIn[i].w<0)\n"
-" return;\n"
-" int bodyIndexA = concavePairsIn[i].x;\n"
-" int bodyIndexB = concavePairsIn[i].y;\n"
-" int f = concavePairsIn[i].z;\n"
-" int childShapeIndexA = f;\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"
-" \n"
-" \n"
-" bool overlap = false;\n"
-" \n"
-" b3ConvexPolyhedronData_t 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"
-" b3GpuFace_t 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"
-" localCenter += vert;\n"
-" }\n"
-" float dmin = FLT_MAX;\n"
-" int localCC=0;\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"
-" b3GpuFace_t 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 = dot3F4(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<numVertices;i++)\n"
-" {\n"
-" float4 v0 = verticesA[i];\n"
-" float4 v1 = verticesA[prevVertex];\n"
-" \n"
-" float4 edgeNormal = normalize(cross(normal,v1-v0));\n"
-" float c = -dot3F4(edgeNormal,v0);\n"
-" facesA[fidx].m_numIndices = 2;\n"
-" facesA[fidx].m_indexOffset=curUsedIndices;\n"
-" indicesA[curUsedIndices++]=i;\n"
-" indicesA[curUsedIndices++]=prevVertex;\n"
-" \n"
-" facesA[fidx].m_plane.x = edgeNormal.x;\n"
-" facesA[fidx].m_plane.y = edgeNormal.y;\n"
-" facesA[fidx].m_plane.z = edgeNormal.z;\n"
-" facesA[fidx].m_plane.w = c;\n"
-" fidx++;\n"
-" prevVertex = i;\n"
-" }\n"
-" }\n"
-" convexPolyhedronA.m_numFaces = TRIANGLE_NUM_CONVEX_FACES;\n"
-" convexPolyhedronA.m_localCenter = localCenter*(1.f/3.f);\n"
-" float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
-" posA.w = 0.f;\n"
-" float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
-" posB.w = 0.f;\n"
-" float4 ornA = rigidBodies[bodyIndexA].m_quat;\n"
-" float4 ornB =rigidBodies[bodyIndexB].m_quat;\n"
-" float4 sepAxis = separatingNormals[i];\n"
-" \n"
-" int shapeTypeB = collidables[collidableIndexB].m_shapeType;\n"
-" int childShapeIndexB =-1;\n"
-" if (shapeTypeB==SHAPE_COMPOUND_OF_CONVEX_HULLS)\n"
-" {\n"
-" ///////////////////\n"
-" ///compound shape support\n"
-" \n"
-" childShapeIndexB = concavePairsIn[pairIndex].w;\n"
-" int childColIndexB = gpuChildShapes[childShapeIndexB].m_shapeIndex;\n"
-" shapeIndexB = collidables[childColIndexB].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"
-" \n"
-" }\n"
-" \n"
-" ////////////////////////////////////////\n"
-" \n"
-" \n"
-" \n"
-" int numLocalContactsOut = clipHullAgainstHullLocalA(sepAxis,\n"
-" &convexPolyhedronA, &convexShapes[shapeIndexB],\n"
-" posA,ornA,\n"
-" posB,ornB,\n"
-" worldVertsB1,worldVertsB2,capacityWorldVerts,\n"
-" minDist, maxDist,\n"
-" &verticesA,&facesA,&indicesA,\n"
-" vertices,faces,indices,\n"
-" localContactsOut,localContactCapacity);\n"
-" \n"
-" if (numLocalContactsOut>0)\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 (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 = 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;i<nReducedContacts;i++)\n"
-" {\n"
-" c->m_worldPosB[i] = pointsIn[contactIdx[i]];\n"
-" }\n"
-" GET_NPOINTS(*c) = nReducedContacts;\n"
-" }\n"
-" \n"
-" }// if (numContactsOut>0)\n"
-" }// if (i<numPairs)\n"
-"}\n"
-"int findClippingFaces(const float4 separatingNormal,\n"
-" __global const b3ConvexPolyhedronData_t* hullA, __global const b3ConvexPolyhedronData_t* 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"
-" __global const float4* vertices,\n"
-" __global const b3GpuFace_t* faces,\n"
-" __global const int* indices,\n"
-" __global int4* clippingFaces, int pairIndex)\n"
-"{\n"
-" int numContactsOut = 0;\n"
-" int numWorldVertsB1= 0;\n"
-" \n"
-" \n"
-" int closestFaceB=-1;\n"
-" float dmax = -FLT_MAX;\n"
-" \n"
-" {\n"
-" for(int face=0;face<hullB->m_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;e0<numVertices;e0++)\n"
-" {\n"
-" const float4 b = vertices[hullB->m_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;face<hullA->m_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;e0<numVerticesA;e0++)\n"
-" {\n"
-" const float4 a = vertices[hullA->m_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<numVertsInA;e0++)\n"
-" {\n"
-" const float4 aw = worldVertsA1[pairIndex*capacityWorldVertsB2+e0];\n"
-" const float4 bw = worldVertsA1[pairIndex*capacityWorldVertsB2+((e0+1)%numVertsInA)];\n"
-" const float4 WorldEdge0 = aw - bw;\n"
-" float4 worldPlaneAnormal1 = worldNormalsA1[pairIndex];\n"
-" float4 planeNormalWS1 = -cross3(WorldEdge0,worldPlaneAnormal1);\n"
-" float4 worldA1 = aw;\n"
-" float planeEqWS1 = -dot3F4(worldA1,planeNormalWS1);\n"
-" float4 planeNormalWS = planeNormalWS1;\n"
-" float planeEqWS=planeEqWS1;\n"
-" numVertsOut = clipFaceGlobal(pVtxIn, numVertsInB, planeNormalWS,planeEqWS, pVtxOut);\n"
-" __global float4* tmp = pVtxOut;\n"
-" pVtxOut = pVtxIn;\n"
-" pVtxIn = tmp;\n"
-" numVertsInB = numVertsOut;\n"
-" numVertsOut = 0;\n"
-" }\n"
-" \n"
-" //float4 planeNormalWS = worldNormalsA1[pairIndex];\n"
-" //float planeEqWS=-dot3F4(planeNormalWS,worldVertsA1[pairIndex*capacityWorldVertsB2]);\n"
-" \n"
-" /*for (int i=0;i<numVertsInB;i++)\n"
-" {\n"
-" pVtxOut[i] = pVtxIn[i];\n"
-" }*/\n"
-" \n"
-" \n"
-" \n"
-" \n"
-" //numVertsInB=0;\n"
-" \n"
-" float4 planeNormalWS = worldNormalsA1[pairIndex];\n"
-" float planeEqWS=-dot3F4(planeNormalWS,worldVertsA1[pairIndex*capacityWorldVertsB2]);\n"
-" for (int i=0;i<numVertsInB;i++)\n"
-" {\n"
-" float depth = dot3F4(planeNormalWS,pVtxIn[i])+planeEqWS;\n"
-" if (depth <=minDist)\n"
-" {\n"
-" depth = minDist;\n"
-" }\n"
-" \n"
-" if (depth <=maxDist)\n"
-" {\n"
-" float4 pointInWorld = pVtxIn[i];\n"
-" pVtxOut[numContactsOut++] = make_float4(pointInWorld.x,pointInWorld.y,pointInWorld.z,depth);\n"
-" }\n"
-" }\n"
-" \n"
-" clippingFaces[pairIndex].w =numContactsOut;\n"
-" \n"
-" \n"
-" return numContactsOut;\n"
-"}\n"
-"__kernel void findClippingFacesKernel( __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* uniqueEdges,\n"
-" __global const b3GpuFace_t* faces,\n"
-" __global const int* indices,\n"
-" __global const float4* separatingNormals,\n"
-" __global const int* hasSeparatingAxis,\n"
-" __global int4* clippingFacesOut,\n"
-" __global float4* worldVertsA1,\n"
-" __global float4* worldNormalsA1,\n"
-" __global float4* worldVertsB1,\n"
-" int capacityWorldVerts,\n"
-" int numPairs\n"
-" )\n"
-"{\n"
-" \n"
-" int i = get_global_id(0);\n"
-" int pairIndex = i;\n"
-" \n"
-" \n"
-" float minDist = -1e30f;\n"
-" float maxDist = 0.02f;\n"
-" \n"
-" if (i<numPairs)\n"
-" {\n"
-" \n"
-" if (hasSeparatingAxis[i])\n"
-" {\n"
-" \n"
-" int bodyIndexA = pairs[i].x;\n"
-" int bodyIndexB = pairs[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"
-" \n"
-" int numLocalContactsOut = findClippingFaces(separatingNormals[i],\n"
-" &convexShapes[shapeIndexA], &convexShapes[shapeIndexB],\n"
-" rigidBodies[bodyIndexA].m_pos,rigidBodies[bodyIndexA].m_quat,\n"
-" rigidBodies[bodyIndexB].m_pos,rigidBodies[bodyIndexB].m_quat,\n"
-" worldVertsA1,\n"
-" worldNormalsA1,\n"
-" worldVertsB1,capacityWorldVerts,\n"
-" minDist, maxDist,\n"
-" vertices,faces,indices,\n"
-" clippingFacesOut,i);\n"
-" \n"
-" \n"
-" }// if (hasSeparatingAxis[i])\n"
-" }// if (i<numPairs)\n"
-" \n"
-"}\n"
-"__kernel void clipFacesAndFindContactsKernel( __global const float4* separatingNormals,\n"
-" __global const int* hasSeparatingAxis,\n"
-" __global int4* clippingFacesOut,\n"
-" __global float4* worldVertsA1,\n"
-" __global float4* worldNormalsA1,\n"
-" __global float4* worldVertsB1,\n"
-" __global float4* worldVertsB2,\n"
-" int vertexFaceCapacity,\n"
-" int numPairs,\n"
-" int debugMode\n"
-" )\n"
-"{\n"
-" int i = get_global_id(0);\n"
-" int pairIndex = i;\n"
-" \n"
-" \n"
-" float minDist = -1e30f;\n"
-" float maxDist = 0.02f;\n"
-" \n"
-" if (i<numPairs)\n"
-" {\n"
-" \n"
-" if (hasSeparatingAxis[i])\n"
-" {\n"
-" \n"
-"// int bodyIndexA = pairs[i].x;\n"
-" // int bodyIndexB = pairs[i].y;\n"
-" \n"
-" int numLocalContactsOut = 0;\n"
-" int capacityWorldVertsB2 = vertexFaceCapacity;\n"
-" \n"
-" __global float4* pVtxIn = &worldVertsB1[pairIndex*capacityWorldVertsB2];\n"
-" __global float4* pVtxOut = &worldVertsB2[pairIndex*capacityWorldVertsB2];\n"
-" \n"
-" {\n"
-" __global int4* clippingFaces = clippingFacesOut;\n"
-" \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"
-" {\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<numVertsInA;e0++)\n"
-" {\n"
-" const float4 aw = worldVertsA1[pairIndex*capacityWorldVertsB2+e0];\n"
-" const float4 bw = worldVertsA1[pairIndex*capacityWorldVertsB2+((e0+1)%numVertsInA)];\n"
-" const float4 WorldEdge0 = aw - bw;\n"
-" float4 worldPlaneAnormal1 = worldNormalsA1[pairIndex];\n"
-" float4 planeNormalWS1 = -cross3(WorldEdge0,worldPlaneAnormal1);\n"
-" float4 worldA1 = aw;\n"
-" float planeEqWS1 = -dot3F4(worldA1,planeNormalWS1);\n"
-" float4 planeNormalWS = planeNormalWS1;\n"
-" float planeEqWS=planeEqWS1;\n"
-" numVertsOut = clipFaceGlobal(pVtxIn, numVertsInB, planeNormalWS,planeEqWS, pVtxOut);\n"
-" __global float4* tmp = pVtxOut;\n"
-" pVtxOut = pVtxIn;\n"
-" pVtxIn = tmp;\n"
-" numVertsInB = numVertsOut;\n"
-" numVertsOut = 0;\n"
-" }\n"
-" \n"
-" float4 planeNormalWS = worldNormalsA1[pairIndex];\n"
-" float planeEqWS=-dot3F4(planeNormalWS,worldVertsA1[pairIndex*capacityWorldVertsB2]);\n"
-" \n"
-" for (int i=0;i<numVertsInB;i++)\n"
-" {\n"
-" float depth = dot3F4(planeNormalWS,pVtxIn[i])+planeEqWS;\n"
-" if (depth <=minDist)\n"
-" {\n"
-" depth = minDist;\n"
-" }\n"
-" \n"
-" if (depth <=maxDist)\n"
-" {\n"
-" float4 pointInWorld = pVtxIn[i];\n"
-" pVtxOut[numLocalContactsOut++] = make_float4(pointInWorld.x,pointInWorld.y,pointInWorld.z,depth);\n"
-" }\n"
-" }\n"
-" \n"
-" }\n"
-" clippingFaces[pairIndex].w =numLocalContactsOut;\n"
-" \n"
-" }\n"
-" \n"
-" for (int i=0;i<numLocalContactsOut;i++)\n"
-" pVtxIn[i] = pVtxOut[i];\n"
-" \n"
-" }// if (hasSeparatingAxis[i])\n"
-" }// if (i<numPairs)\n"
-" \n"
-"}\n"
-"__kernel void newContactReductionKernel( __global int4* pairs,\n"
-" __global const b3RigidBodyData_t* rigidBodies,\n"
-" __global const float4* separatingNormals,\n"
-" __global const int* hasSeparatingAxis,\n"
-" __global struct b3Contact4Data* globalContactsOut,\n"
-" __global int4* clippingFaces,\n"
-" __global float4* worldVertsB2,\n"
-" volatile __global int* nGlobalContactsOut,\n"
-" int vertexFaceCapacity,\n"
-" int contactCapacity,\n"
-" int numPairs\n"
-" )\n"
-"{\n"
-" int i = get_global_id(0);\n"
-" int pairIndex = i;\n"
-" \n"
-" int4 contactIdx;\n"
-" contactIdx=make_int4(0,1,2,3);\n"
-" \n"
-" if (i<numPairs)\n"
-" {\n"
-" \n"
-" if (hasSeparatingAxis[i])\n"
-" {\n"
-" \n"
-" \n"
-" \n"
-" \n"
-" int nPoints = clippingFaces[pairIndex].w;\n"
-" \n"
-" if (nPoints>0)\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 (i<numPairs)\n"
-" \n"
-" \n"
-"}\n"
-;
+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;face<hullA->m_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;e0<numVerticesA;e0++)\n"
+ " {\n"
+ " const float4 a = vertices[hullA->m_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;i<numVertsIn;i++)\n"
+ " {\n"
+ " float depth = dot3F4(planeNormalWS,pVtxIn[i])+planeEqWS;\n"
+ " if (depth <=minDist)\n"
+ " {\n"
+ " depth = minDist;\n"
+ " }\n"
+ " if (depth <=maxDist)\n"
+ " {\n"
+ " float4 pointInWorld = pVtxIn[i];\n"
+ " //resultOut.addContactPoint(separatingNormal,point,depth);\n"
+ " contactsOut[numContactsOut++] = make_float4(pointInWorld.x,pointInWorld.y,pointInWorld.z,depth);\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " return numContactsOut;\n"
+ "}\n"
+ "int clipFaceAgainstHullLocalA(const float4 separatingNormal, 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"
+ " 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* 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;face<hullA->m_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;e0<numVerticesA;e0++)\n"
+ " {\n"
+ " const float4 a = verticesA[hullA->m_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;i<numVertsIn;i++)\n"
+ " {\n"
+ " float depth = dot3F4(planeNormalWS,pVtxIn[i])+planeEqWS;\n"
+ " if (depth <=minDist)\n"
+ " {\n"
+ " depth = minDist;\n"
+ " }\n"
+ " if (depth <=maxDist)\n"
+ " {\n"
+ " float4 pointInWorld = pVtxIn[i];\n"
+ " //resultOut.addContactPoint(separatingNormal,point,depth);\n"
+ " contactsOut[numContactsOut++] = make_float4(pointInWorld.x,pointInWorld.y,pointInWorld.z,depth);\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " return numContactsOut;\n"
+ "}\n"
+ "int clipHullAgainstHull(const float4 separatingNormal,\n"
+ " __global 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"
+ " __global const float4* vertices,\n"
+ " __global const b3GpuFace_t* faces,\n"
+ " __global const int* indices,\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;face<hullB->m_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;e0<numVertices;e0++)\n"
+ " {\n"
+ " const float4 b = vertices[hullB->m_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;face<hullB->m_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;e0<numVertices;e0++)\n"
+ " {\n"
+ " const float4 b = verticesB[hullB->m_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<n; j++) v[0] += v[j];\n"
+ "#define PARALLEL_DO(execution, n) for(int ie=0; ie<n; ie++){execution;}\n"
+ "#define REDUCE_MAX(v, n) {int i=0; for(int offset=0; offset<n; offset++) v[i] = (v[i].y > v[i+offset].y)? v[i]: v[i+offset]; }\n"
+ "#define REDUCE_MIN(v, n) {int i=0; for(int offset=0; offset<n; offset++) v[i] = (v[i].y < v[i+offset].y)? v[i]: v[i+offset]; }\n"
+ "int extractManifoldSequentialGlobal(__global 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;i<nPoints;i++)\n"
+ " center += p[i];\n"
+ " center /= (float)nPoints;\n"
+ " }\n"
+ " \n"
+ " \n"
+ " \n"
+ " // sample 4 directions\n"
+ " \n"
+ " float4 aVector = p[0] - center;\n"
+ " float4 u = cross3( nearNormal, aVector );\n"
+ " float4 v = cross3( nearNormal, u );\n"
+ " u = normalize3( u );\n"
+ " v = normalize3( v );\n"
+ " \n"
+ " \n"
+ " //keep point with deepest penetration\n"
+ " float minW= FLT_MAX;\n"
+ " \n"
+ " int minIndex=-1;\n"
+ " \n"
+ " float4 maxDots;\n"
+ " maxDots.x = FLT_MIN;\n"
+ " maxDots.y = FLT_MIN;\n"
+ " maxDots.z = FLT_MIN;\n"
+ " maxDots.w = FLT_MIN;\n"
+ " \n"
+ " // idx, distance\n"
+ " for(int ie = 0; ie<nPoints; ie++ )\n"
+ " {\n"
+ " if (p[ie].w<minW)\n"
+ " {\n"
+ " minW = p[ie].w;\n"
+ " minIndex=ie;\n"
+ " }\n"
+ " float f;\n"
+ " float4 r = p[ie]-center;\n"
+ " f = dot3F4( u, r );\n"
+ " if (f<maxDots.x)\n"
+ " {\n"
+ " maxDots.x = f;\n"
+ " contactIdx[0].x = ie;\n"
+ " }\n"
+ " \n"
+ " f = dot3F4( -u, r );\n"
+ " if (f<maxDots.y)\n"
+ " {\n"
+ " maxDots.y = f;\n"
+ " contactIdx[0].y = ie;\n"
+ " }\n"
+ " \n"
+ " \n"
+ " f = dot3F4( v, r );\n"
+ " if (f<maxDots.z)\n"
+ " {\n"
+ " maxDots.z = f;\n"
+ " contactIdx[0].z = ie;\n"
+ " }\n"
+ " \n"
+ " f = dot3F4( -v, r );\n"
+ " if (f<maxDots.w)\n"
+ " {\n"
+ " maxDots.w = f;\n"
+ " contactIdx[0].w = ie;\n"
+ " }\n"
+ " \n"
+ " }\n"
+ " \n"
+ " if (contactIdx[0].x != minIndex && contactIdx[0].y != minIndex && contactIdx[0].z != minIndex && contactIdx[0].w != minIndex)\n"
+ " {\n"
+ " //replace the first contact with minimum (todo: replace contact with least penetration)\n"
+ " contactIdx[0].x = minIndex;\n"
+ " }\n"
+ " \n"
+ " return 4;\n"
+ " \n"
+ "}\n"
+ "int extractManifoldSequentialGlobalFake(__global const float4* p, int nPoints, float4 nearNormal, int* contactIdx)\n"
+ "{\n"
+ " contactIdx[0] = 0;\n"
+ " contactIdx[1] = 1;\n"
+ " contactIdx[2] = 2;\n"
+ " contactIdx[3] = 3;\n"
+ " \n"
+ " if( nPoints == 0 ) return 0;\n"
+ " \n"
+ " nPoints = min2( nPoints, 4 );\n"
+ " return nPoints;\n"
+ " \n"
+ "}\n"
+ "int extractManifoldSequential(const float4* p, int nPoints, float4 nearNormal, int* contactIdx)\n"
+ "{\n"
+ " if( nPoints == 0 ) return 0;\n"
+ " nPoints = min2( nPoints, 64 );\n"
+ " float4 center = make_float4(0.f);\n"
+ " {\n"
+ " float4 v[64];\n"
+ " for (int i=0;i<nPoints;i++)\n"
+ " v[i] = p[i];\n"
+ " //memcpy( v, p, nPoints*sizeof(float4) );\n"
+ " PARALLEL_SUM( v, nPoints );\n"
+ " center = v[0]/(float)nPoints;\n"
+ " }\n"
+ " \n"
+ " { // sample 4 directions\n"
+ " if( nPoints < 4 )\n"
+ " {\n"
+ " for(int i=0; i<nPoints; i++) \n"
+ " contactIdx[i] = i;\n"
+ " return nPoints;\n"
+ " }\n"
+ " float4 aVector = p[0] - center;\n"
+ " float4 u = cross3( nearNormal, aVector );\n"
+ " float4 v = cross3( nearNormal, u );\n"
+ " u = normalize3( u );\n"
+ " v = normalize3( v );\n"
+ " int idx[4];\n"
+ " float2 max00 = make_float2(0,FLT_MAX);\n"
+ " {\n"
+ " // idx, distance\n"
+ " {\n"
+ " {\n"
+ " int4 a[64];\n"
+ " for(int ie = 0; ie<nPoints; ie++ )\n"
+ " {\n"
+ " \n"
+ " \n"
+ " float f;\n"
+ " float4 r = p[ie]-center;\n"
+ " f = dot3F4( u, r );\n"
+ " a[ie].x = ((*(u32*)&f) & 0xffffff00) | (0xff & ie);\n"
+ " f = dot3F4( -u, r );\n"
+ " a[ie].y = ((*(u32*)&f) & 0xffffff00) | (0xff & ie);\n"
+ " f = dot3F4( v, r );\n"
+ " a[ie].z = ((*(u32*)&f) & 0xffffff00) | (0xff & ie);\n"
+ " f = dot3F4( -v, r );\n"
+ " a[ie].w = ((*(u32*)&f) & 0xffffff00) | (0xff & ie);\n"
+ " }\n"
+ " for(int ie=0; ie<nPoints; ie++)\n"
+ " {\n"
+ " a[0].x = (a[0].x > 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 (idx<numPairs)\n"
+ " {\n"
+ " float4 normal = separatingNormalsWorld[idx];\n"
+ " int nPoints = contactCounts[idx];\n"
+ " __global const float4* pointsIn = &closestPointsWorld[contactOffsets[idx]];\n"
+ " float4 localPoints[64];\n"
+ " for (int i=0;i<nPoints;i++)\n"
+ " {\n"
+ " localPoints[i] = pointsIn[i];\n"
+ " }\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"
+ " int nContacts = extractManifoldSequential(localPoints, nPoints, normal, contactIdx);\n"
+ " int dstIdx;\n"
+ " AppendInc( nContactsOut, dstIdx );\n"
+ " if (dstIdx<contactCapacity)\n"
+ " {\n"
+ " __global struct b3Contact4Data* c = contactsOut + dstIdx;\n"
+ " c->m_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;i<nContacts;i++)\n"
+ " {\n"
+ " c->m_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 (i<numPairs)\n"
+ " {\n"
+ " int bodyIndexA = pairs[i].x;\n"
+ " int bodyIndexB = pairs[i].y;\n"
+ " \n"
+ " int collidableIndexA = rigidBodies[bodyIndexA].m_collidableIdx;\n"
+ " int collidableIndexB = rigidBodies[bodyIndexB].m_collidableIdx;\n"
+ " if (hasSeparatingAxis[i])\n"
+ " {\n"
+ " \n"
+ " int shapeIndexA = collidables[collidableIndexA].m_shapeIndex;\n"
+ " int shapeIndexB = collidables[collidableIndexB].m_shapeIndex;\n"
+ " \n"
+ " \n"
+ " int numLocalContactsOut = clipHullAgainstHull(separatingNormals[i],\n"
+ " &convexShapes[shapeIndexA], &convexShapes[shapeIndexB],\n"
+ " rigidBodies[bodyIndexA].m_pos,rigidBodies[bodyIndexA].m_quat,\n"
+ " rigidBodies[bodyIndexB].m_pos,rigidBodies[bodyIndexB].m_quat,\n"
+ " worldVertsB1,worldVertsB2,capacityWorldVerts,\n"
+ " minDist, maxDist,\n"
+ " vertices,faces,indices,\n"
+ " localContactsOut,localContactCapacity);\n"
+ " \n"
+ " if (numLocalContactsOut>0)\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 (dstIdx<contactCapacity)\n"
+ " {\n"
+ " pairs[pairIndex].z = dstIdx;\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"
+ " 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;i<nReducedContacts;i++)\n"
+ " {\n"
+ " //this condition means: overwrite contact point, unless at index i==0 we have a valid 'mpr' contact\n"
+ " if (i>0||(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<numPairs)\n"
+ "}\n"
+ "__kernel void clipCompoundsHullHullKernel( __global const int4* gpuCompoundPairs, \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 b3GpuChildShape_t* gpuChildShapes,\n"
+ " __global const float4* gpuCompoundSepNormalsOut,\n"
+ " __global const int* gpuHasCompoundSepNormalsOut,\n"
+ " __global struct b3Contact4Data* restrict globalContactsOut,\n"
+ " counter32_t nGlobalContactsOut,\n"
+ " int numCompoundPairs, 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<numCompoundPairs)\n"
+ " {\n"
+ " if (gpuHasCompoundSepNormalsOut[i])\n"
+ " {\n"
+ " int bodyIndexA = gpuCompoundPairs[i].x;\n"
+ " int bodyIndexB = gpuCompoundPairs[i].y;\n"
+ " \n"
+ " int childShapeIndexA = gpuCompoundPairs[i].z;\n"
+ " int childShapeIndexB = gpuCompoundPairs[i].w;\n"
+ " \n"
+ " int collidableIndexA = -1;\n"
+ " int collidableIndexB = -1;\n"
+ " \n"
+ " float4 ornA = rigidBodies[bodyIndexA].m_quat;\n"
+ " float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
+ " \n"
+ " float4 ornB = rigidBodies[bodyIndexB].m_quat;\n"
+ " float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
+ " \n"
+ " if (childShapeIndexA >= 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;i<nReducedContacts;i++)\n"
+ " {\n"
+ " c->m_worldPosB[i] = pointsIn[contactIdx[i]];\n"
+ " }\n"
+ " GET_NPOINTS(*c) = nReducedContacts;\n"
+ " }\n"
+ " \n"
+ " }// if (numContactsOut>0)\n"
+ " }// if (gpuHasCompoundSepNormalsOut[i])\n"
+ " }// if (i<numCompoundPairs)\n"
+ "}\n"
+ "__kernel void sphereSphereCollisionKernel( __global const int4* pairs, \n"
+ " __global const b3RigidBodyData_t* rigidBodies, \n"
+ " __global const b3Collidable_t* collidables,\n"
+ " __global const float4* separatingNormals,\n"
+ " __global const 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"
+ " \n"
+ " if (i<numPairs)\n"
+ " {\n"
+ " int bodyIndexA = pairs[i].x;\n"
+ " int bodyIndexB = pairs[i].y;\n"
+ " \n"
+ " int collidableIndexA = rigidBodies[bodyIndexA].m_collidableIdx;\n"
+ " int collidableIndexB = rigidBodies[bodyIndexB].m_collidableIdx;\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"
+ " 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 (i<numPairs)\n"
+ "} \n"
+ "__kernel void clipHullHullConcaveConvexKernel( __global int4* concavePairsIn,\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 b3GpuChildShape_t* gpuChildShapes,\n"
+ " __global const float4* separatingNormals,\n"
+ " __global struct b3Contact4Data* restrict globalContactsOut,\n"
+ " counter32_t nGlobalContactsOut,\n"
+ " int contactCapacity,\n"
+ " int numConcavePairs)\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<numConcavePairs)\n"
+ " {\n"
+ " //negative value means that the pair is invalid\n"
+ " if (concavePairsIn[i].w<0)\n"
+ " return;\n"
+ " int bodyIndexA = concavePairsIn[i].x;\n"
+ " int bodyIndexB = concavePairsIn[i].y;\n"
+ " int f = concavePairsIn[i].z;\n"
+ " int childShapeIndexA = f;\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"
+ " \n"
+ " \n"
+ " bool overlap = false;\n"
+ " \n"
+ " b3ConvexPolyhedronData_t 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"
+ " b3GpuFace_t 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"
+ " localCenter += vert;\n"
+ " }\n"
+ " float dmin = FLT_MAX;\n"
+ " int localCC=0;\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"
+ " b3GpuFace_t 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 = dot3F4(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<numVertices;i++)\n"
+ " {\n"
+ " float4 v0 = verticesA[i];\n"
+ " float4 v1 = verticesA[prevVertex];\n"
+ " \n"
+ " float4 edgeNormal = normalize(cross(normal,v1-v0));\n"
+ " float c = -dot3F4(edgeNormal,v0);\n"
+ " facesA[fidx].m_numIndices = 2;\n"
+ " facesA[fidx].m_indexOffset=curUsedIndices;\n"
+ " indicesA[curUsedIndices++]=i;\n"
+ " indicesA[curUsedIndices++]=prevVertex;\n"
+ " \n"
+ " facesA[fidx].m_plane.x = edgeNormal.x;\n"
+ " facesA[fidx].m_plane.y = edgeNormal.y;\n"
+ " facesA[fidx].m_plane.z = edgeNormal.z;\n"
+ " facesA[fidx].m_plane.w = c;\n"
+ " fidx++;\n"
+ " prevVertex = i;\n"
+ " }\n"
+ " }\n"
+ " convexPolyhedronA.m_numFaces = TRIANGLE_NUM_CONVEX_FACES;\n"
+ " convexPolyhedronA.m_localCenter = localCenter*(1.f/3.f);\n"
+ " float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
+ " posA.w = 0.f;\n"
+ " float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
+ " posB.w = 0.f;\n"
+ " float4 ornA = rigidBodies[bodyIndexA].m_quat;\n"
+ " float4 ornB =rigidBodies[bodyIndexB].m_quat;\n"
+ " float4 sepAxis = separatingNormals[i];\n"
+ " \n"
+ " int shapeTypeB = collidables[collidableIndexB].m_shapeType;\n"
+ " int childShapeIndexB =-1;\n"
+ " if (shapeTypeB==SHAPE_COMPOUND_OF_CONVEX_HULLS)\n"
+ " {\n"
+ " ///////////////////\n"
+ " ///compound shape support\n"
+ " \n"
+ " childShapeIndexB = concavePairsIn[pairIndex].w;\n"
+ " int childColIndexB = gpuChildShapes[childShapeIndexB].m_shapeIndex;\n"
+ " shapeIndexB = collidables[childColIndexB].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"
+ " \n"
+ " }\n"
+ " \n"
+ " ////////////////////////////////////////\n"
+ " \n"
+ " \n"
+ " \n"
+ " int numLocalContactsOut = clipHullAgainstHullLocalA(sepAxis,\n"
+ " &convexPolyhedronA, &convexShapes[shapeIndexB],\n"
+ " posA,ornA,\n"
+ " posB,ornB,\n"
+ " worldVertsB1,worldVertsB2,capacityWorldVerts,\n"
+ " minDist, maxDist,\n"
+ " &verticesA,&facesA,&indicesA,\n"
+ " vertices,faces,indices,\n"
+ " localContactsOut,localContactCapacity);\n"
+ " \n"
+ " if (numLocalContactsOut>0)\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 (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 = 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;i<nReducedContacts;i++)\n"
+ " {\n"
+ " c->m_worldPosB[i] = pointsIn[contactIdx[i]];\n"
+ " }\n"
+ " GET_NPOINTS(*c) = nReducedContacts;\n"
+ " }\n"
+ " \n"
+ " }// if (numContactsOut>0)\n"
+ " }// if (i<numPairs)\n"
+ "}\n"
+ "int findClippingFaces(const float4 separatingNormal,\n"
+ " __global const b3ConvexPolyhedronData_t* hullA, __global const b3ConvexPolyhedronData_t* 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"
+ " __global const float4* vertices,\n"
+ " __global const b3GpuFace_t* faces,\n"
+ " __global const int* indices,\n"
+ " __global int4* clippingFaces, int pairIndex)\n"
+ "{\n"
+ " int numContactsOut = 0;\n"
+ " int numWorldVertsB1= 0;\n"
+ " \n"
+ " \n"
+ " int closestFaceB=-1;\n"
+ " float dmax = -FLT_MAX;\n"
+ " \n"
+ " {\n"
+ " for(int face=0;face<hullB->m_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;e0<numVertices;e0++)\n"
+ " {\n"
+ " const float4 b = vertices[hullB->m_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;face<hullA->m_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;e0<numVerticesA;e0++)\n"
+ " {\n"
+ " const float4 a = vertices[hullA->m_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<numVertsInA;e0++)\n"
+ " {\n"
+ " const float4 aw = worldVertsA1[pairIndex*capacityWorldVertsB2+e0];\n"
+ " const float4 bw = worldVertsA1[pairIndex*capacityWorldVertsB2+((e0+1)%numVertsInA)];\n"
+ " const float4 WorldEdge0 = aw - bw;\n"
+ " float4 worldPlaneAnormal1 = worldNormalsA1[pairIndex];\n"
+ " float4 planeNormalWS1 = -cross3(WorldEdge0,worldPlaneAnormal1);\n"
+ " float4 worldA1 = aw;\n"
+ " float planeEqWS1 = -dot3F4(worldA1,planeNormalWS1);\n"
+ " float4 planeNormalWS = planeNormalWS1;\n"
+ " float planeEqWS=planeEqWS1;\n"
+ " numVertsOut = clipFaceGlobal(pVtxIn, numVertsInB, planeNormalWS,planeEqWS, pVtxOut);\n"
+ " __global float4* tmp = pVtxOut;\n"
+ " pVtxOut = pVtxIn;\n"
+ " pVtxIn = tmp;\n"
+ " numVertsInB = numVertsOut;\n"
+ " numVertsOut = 0;\n"
+ " }\n"
+ " \n"
+ " //float4 planeNormalWS = worldNormalsA1[pairIndex];\n"
+ " //float planeEqWS=-dot3F4(planeNormalWS,worldVertsA1[pairIndex*capacityWorldVertsB2]);\n"
+ " \n"
+ " /*for (int i=0;i<numVertsInB;i++)\n"
+ " {\n"
+ " pVtxOut[i] = pVtxIn[i];\n"
+ " }*/\n"
+ " \n"
+ " \n"
+ " \n"
+ " \n"
+ " //numVertsInB=0;\n"
+ " \n"
+ " float4 planeNormalWS = worldNormalsA1[pairIndex];\n"
+ " float planeEqWS=-dot3F4(planeNormalWS,worldVertsA1[pairIndex*capacityWorldVertsB2]);\n"
+ " for (int i=0;i<numVertsInB;i++)\n"
+ " {\n"
+ " float depth = dot3F4(planeNormalWS,pVtxIn[i])+planeEqWS;\n"
+ " if (depth <=minDist)\n"
+ " {\n"
+ " depth = minDist;\n"
+ " }\n"
+ " \n"
+ " if (depth <=maxDist)\n"
+ " {\n"
+ " float4 pointInWorld = pVtxIn[i];\n"
+ " pVtxOut[numContactsOut++] = make_float4(pointInWorld.x,pointInWorld.y,pointInWorld.z,depth);\n"
+ " }\n"
+ " }\n"
+ " \n"
+ " clippingFaces[pairIndex].w =numContactsOut;\n"
+ " \n"
+ " \n"
+ " return numContactsOut;\n"
+ "}\n"
+ "__kernel void findClippingFacesKernel( __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* uniqueEdges,\n"
+ " __global const b3GpuFace_t* faces,\n"
+ " __global const int* indices,\n"
+ " __global const float4* separatingNormals,\n"
+ " __global const int* hasSeparatingAxis,\n"
+ " __global int4* clippingFacesOut,\n"
+ " __global float4* worldVertsA1,\n"
+ " __global float4* worldNormalsA1,\n"
+ " __global float4* worldVertsB1,\n"
+ " int capacityWorldVerts,\n"
+ " int numPairs\n"
+ " )\n"
+ "{\n"
+ " \n"
+ " int i = get_global_id(0);\n"
+ " int pairIndex = i;\n"
+ " \n"
+ " \n"
+ " float minDist = -1e30f;\n"
+ " float maxDist = 0.02f;\n"
+ " \n"
+ " if (i<numPairs)\n"
+ " {\n"
+ " \n"
+ " if (hasSeparatingAxis[i])\n"
+ " {\n"
+ " \n"
+ " int bodyIndexA = pairs[i].x;\n"
+ " int bodyIndexB = pairs[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"
+ " \n"
+ " int numLocalContactsOut = findClippingFaces(separatingNormals[i],\n"
+ " &convexShapes[shapeIndexA], &convexShapes[shapeIndexB],\n"
+ " rigidBodies[bodyIndexA].m_pos,rigidBodies[bodyIndexA].m_quat,\n"
+ " rigidBodies[bodyIndexB].m_pos,rigidBodies[bodyIndexB].m_quat,\n"
+ " worldVertsA1,\n"
+ " worldNormalsA1,\n"
+ " worldVertsB1,capacityWorldVerts,\n"
+ " minDist, maxDist,\n"
+ " vertices,faces,indices,\n"
+ " clippingFacesOut,i);\n"
+ " \n"
+ " \n"
+ " }// if (hasSeparatingAxis[i])\n"
+ " }// if (i<numPairs)\n"
+ " \n"
+ "}\n"
+ "__kernel void clipFacesAndFindContactsKernel( __global const float4* separatingNormals,\n"
+ " __global const int* hasSeparatingAxis,\n"
+ " __global int4* clippingFacesOut,\n"
+ " __global float4* worldVertsA1,\n"
+ " __global float4* worldNormalsA1,\n"
+ " __global float4* worldVertsB1,\n"
+ " __global float4* worldVertsB2,\n"
+ " int vertexFaceCapacity,\n"
+ " int numPairs,\n"
+ " int debugMode\n"
+ " )\n"
+ "{\n"
+ " int i = get_global_id(0);\n"
+ " int pairIndex = i;\n"
+ " \n"
+ " \n"
+ " float minDist = -1e30f;\n"
+ " float maxDist = 0.02f;\n"
+ " \n"
+ " if (i<numPairs)\n"
+ " {\n"
+ " \n"
+ " if (hasSeparatingAxis[i])\n"
+ " {\n"
+ " \n"
+ "// int bodyIndexA = pairs[i].x;\n"
+ " // int bodyIndexB = pairs[i].y;\n"
+ " \n"
+ " int numLocalContactsOut = 0;\n"
+ " int capacityWorldVertsB2 = vertexFaceCapacity;\n"
+ " \n"
+ " __global float4* pVtxIn = &worldVertsB1[pairIndex*capacityWorldVertsB2];\n"
+ " __global float4* pVtxOut = &worldVertsB2[pairIndex*capacityWorldVertsB2];\n"
+ " \n"
+ " {\n"
+ " __global int4* clippingFaces = clippingFacesOut;\n"
+ " \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"
+ " {\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<numVertsInA;e0++)\n"
+ " {\n"
+ " const float4 aw = worldVertsA1[pairIndex*capacityWorldVertsB2+e0];\n"
+ " const float4 bw = worldVertsA1[pairIndex*capacityWorldVertsB2+((e0+1)%numVertsInA)];\n"
+ " const float4 WorldEdge0 = aw - bw;\n"
+ " float4 worldPlaneAnormal1 = worldNormalsA1[pairIndex];\n"
+ " float4 planeNormalWS1 = -cross3(WorldEdge0,worldPlaneAnormal1);\n"
+ " float4 worldA1 = aw;\n"
+ " float planeEqWS1 = -dot3F4(worldA1,planeNormalWS1);\n"
+ " float4 planeNormalWS = planeNormalWS1;\n"
+ " float planeEqWS=planeEqWS1;\n"
+ " numVertsOut = clipFaceGlobal(pVtxIn, numVertsInB, planeNormalWS,planeEqWS, pVtxOut);\n"
+ " __global float4* tmp = pVtxOut;\n"
+ " pVtxOut = pVtxIn;\n"
+ " pVtxIn = tmp;\n"
+ " numVertsInB = numVertsOut;\n"
+ " numVertsOut = 0;\n"
+ " }\n"
+ " \n"
+ " float4 planeNormalWS = worldNormalsA1[pairIndex];\n"
+ " float planeEqWS=-dot3F4(planeNormalWS,worldVertsA1[pairIndex*capacityWorldVertsB2]);\n"
+ " \n"
+ " for (int i=0;i<numVertsInB;i++)\n"
+ " {\n"
+ " float depth = dot3F4(planeNormalWS,pVtxIn[i])+planeEqWS;\n"
+ " if (depth <=minDist)\n"
+ " {\n"
+ " depth = minDist;\n"
+ " }\n"
+ " \n"
+ " if (depth <=maxDist)\n"
+ " {\n"
+ " float4 pointInWorld = pVtxIn[i];\n"
+ " pVtxOut[numLocalContactsOut++] = make_float4(pointInWorld.x,pointInWorld.y,pointInWorld.z,depth);\n"
+ " }\n"
+ " }\n"
+ " \n"
+ " }\n"
+ " clippingFaces[pairIndex].w =numLocalContactsOut;\n"
+ " \n"
+ " }\n"
+ " \n"
+ " for (int i=0;i<numLocalContactsOut;i++)\n"
+ " pVtxIn[i] = pVtxOut[i];\n"
+ " \n"
+ " }// if (hasSeparatingAxis[i])\n"
+ " }// if (i<numPairs)\n"
+ " \n"
+ "}\n"
+ "__kernel void newContactReductionKernel( __global int4* pairs,\n"
+ " __global const b3RigidBodyData_t* rigidBodies,\n"
+ " __global const float4* separatingNormals,\n"
+ " __global const int* hasSeparatingAxis,\n"
+ " __global struct b3Contact4Data* globalContactsOut,\n"
+ " __global int4* clippingFaces,\n"
+ " __global float4* worldVertsB2,\n"
+ " volatile __global int* nGlobalContactsOut,\n"
+ " int vertexFaceCapacity,\n"
+ " int contactCapacity,\n"
+ " int numPairs\n"
+ " )\n"
+ "{\n"
+ " int i = get_global_id(0);\n"
+ " int pairIndex = i;\n"
+ " \n"
+ " int4 contactIdx;\n"
+ " contactIdx=make_int4(0,1,2,3);\n"
+ " \n"
+ " if (i<numPairs)\n"
+ " {\n"
+ " \n"
+ " if (hasSeparatingAxis[i])\n"
+ " {\n"
+ " \n"
+ " \n"
+ " \n"
+ " \n"
+ " int nPoints = clippingFaces[pairIndex].w;\n"
+ " \n"
+ " if (nPoints>0)\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 (i<numPairs)\n"
+ " \n"
+ " \n"
+ "}\n";
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/satConcaveKernels.h b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/satConcaveKernels.h
index 611569cacf..a60702ca62 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/satConcaveKernels.h
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/satConcaveKernels.h
@@ -1,1457 +1,1456 @@
//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project
-static const char* satConcaveKernelsCL= \
-"//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 B3_MAX_STACK_DEPTH 256\n"
-"typedef unsigned int u32;\n"
-"///keep this in sync with btCollidable.h\n"
-"typedef struct\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"
-" \n"
-" int m_shapeType;\n"
-" int m_shapeIndex;\n"
-" \n"
-"} btCollidableGpu;\n"
-"#define MAX_NUM_PARTS_IN_BITS 10\n"
-"///b3QuantizedBvhNode 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"
-"} b3QuantizedBvhNode;\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 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 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;i<numVerts;i++)\n"
-" {\n"
-" float dp = dot(vertices[hull->m_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;i<numVerts;i++)\n"
-" {\n"
-" float dp = dot(vertices[hull->m_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(Max0<Min1 || Max1<Min0)\n"
-" return false;\n"
-" float d0 = Max0 - Min1;\n"
-" float d1 = Max1 - Min0;\n"
-" *depth = d0<d1 ? d0:d1;\n"
-" return true;\n"
-"}\n"
-"inline bool IsAlmostZero(const float4 v)\n"
-"{\n"
-" if(fabs(v.x)>1e-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;i<numFacesA;i++)\n"
-" {\n"
-" const float4 normal = facesA[hullA->m_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;i<numFacesA;i++)\n"
-" {\n"
-" const float4 normal = facesA[hullA->m_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;e0<hullA->m_numUniqueEdges;e0++)\n"
-" {\n"
-" const float4 edge0 = uniqueEdgesA[hullA->m_uniqueEdgesOffset+e0];\n"
-" float4 edge0World = qtRotate(ornA,edge0);\n"
-" for(int e1=0;e1<hullB->m_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(Max0<Min1 || Max1<Min0)\n"
-" result = false;\n"
-" \n"
-" float d0 = Max0 - Min1;\n"
-" float d1 = Max1 - Min0;\n"
-" dist = d0<d1 ? d0:d1;\n"
-" result = true;\n"
-" }\n"
-" \n"
-" if(dist<*dmin)\n"
-" {\n"
-" *dmin = dist;\n"
-" *sep = crossje;\n"
-" }\n"
-" }\n"
-" }\n"
-" }\n"
-" \n"
-" if((dot3F4(-DeltaC2,*sep))>0.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;face<hullB->m_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;e0<numVertices;e0++)\n"
-" {\n"
-" if (e0<capacityWorldVerts)\n"
-" {\n"
-" const float4 b = verticesB[hullB->m_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;face<hullA->m_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;e0<numVerticesA;e0++)\n"
-" {\n"
-" if (e0<capacityWorldVerts)\n"
-" {\n"
-" const float4 a = verticesA[hullA->m_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<numVertices;i++)\n"
-" {\n"
-" float4 v0 = verticesA[i];\n"
-" float4 v1 = verticesA[prevVertex];\n"
-" \n"
-" float4 edgeNormal = normalize(cross(normal,v1-v0));\n"
-" float c = -dot(edgeNormal,v0);\n"
-" \n"
-" facesA[fidx].m_numIndices = 2;\n"
-" facesA[fidx].m_indexOffset=curUsedIndices;\n"
-" indicesA[curUsedIndices++]=i;\n"
-" indicesA[curUsedIndices++]=prevVertex;\n"
-" \n"
-" facesA[fidx].m_plane.x = edgeNormal.x;\n"
-" facesA[fidx].m_plane.y = edgeNormal.y;\n"
-" facesA[fidx].m_plane.z = edgeNormal.z;\n"
-" facesA[fidx].m_plane.w = c;\n"
-" fidx++;\n"
-" prevVertex = i;\n"
-" }\n"
-" }\n"
-" convexPolyhedronA.m_numFaces = TRIANGLE_NUM_CONVEX_FACES;\n"
-" convexPolyhedronA.m_localCenter = localCenter*(1.f/3.f);\n"
-" \n"
-" \n"
-" float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
-" posA.w = 0.f;\n"
-" float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
-" posB.w = 0.f;\n"
-" \n"
-" float4 ornA = rigidBodies[bodyIndexA].m_quat;\n"
-" float4 ornB =rigidBodies[bodyIndexB].m_quat;\n"
-" \n"
-" \n"
-" \n"
-" \n"
-" ///////////////////\n"
-" ///compound shape support\n"
-" \n"
-" if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)\n"
-" {\n"
-" int compoundChild = concavePairs[pairIdx].w;\n"
-" int childShapeIndexB = compoundChild;//collidables[collidableIndexB].m_shapeIndex+compoundChild;\n"
-" int childColIndexB = 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"
-" shapeIndexB = collidables[childColIndexB].m_shapeIndex;\n"
-" }\n"
-" //////////////////\n"
-" \n"
-" float4 c0local = convexPolyhedronA.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"
-" \n"
-" \n"
-" bool sepA = findSeparatingAxisLocalA( &convexPolyhedronA, &convexShapes[shapeIndexB],\n"
-" posA,ornA,\n"
-" posB,ornB,\n"
-" DeltaC2,\n"
-" verticesA,uniqueEdgesA,facesA,indicesA,\n"
-" vertices,uniqueEdges,faces,indices,\n"
-" &sepAxis,&dmin);\n"
-" hasSeparatingAxis = 4;\n"
-" if (!sepA)\n"
-" {\n"
-" hasSeparatingAxis = 0;\n"
-" } else\n"
-" {\n"
-" bool sepB = findSeparatingAxisLocalB( &convexShapes[shapeIndexB],&convexPolyhedronA,\n"
-" posB,ornB,\n"
-" posA,ornA,\n"
-" DeltaC2,\n"
-" vertices,uniqueEdges,faces,indices,\n"
-" verticesA,uniqueEdgesA,facesA,indicesA,\n"
-" &sepAxis,&dmin);\n"
-" \n"
-" if (!sepB)\n"
-" {\n"
-" hasSeparatingAxis = 0;\n"
-" } else\n"
-" {\n"
-" hasSeparatingAxis = 1;\n"
-" }\n"
-" } \n"
-" \n"
-" if (hasSeparatingAxis)\n"
-" {\n"
-" dmins[i] = dmin;\n"
-" concaveSeparatingNormalsOut[pairIdx]=sepAxis;\n"
-" concaveHasSeparatingNormals[i]=1;\n"
-" \n"
-" } else\n"
-" { \n"
-" //mark this pair as in-active\n"
-" concavePairs[pairIdx].w = -1;\n"
-" }\n"
-" }\n"
-" else\n"
-" { \n"
-" //mark this pair as in-active\n"
-" concavePairs[pairIdx].w = -1;\n"
-" }\n"
-"}\n"
-"// work-in-progress\n"
-"__kernel void findConcaveSeparatingAxisEdgeEdgeKernel( __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"
-" 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;i<numVertices;i++)\n"
-" {\n"
-" float4 v0 = verticesA[i];\n"
-" float4 v1 = verticesA[prevVertex];\n"
-" \n"
-" float4 edgeNormal = normalize(cross(normal,v1-v0));\n"
-" float c = -dot(edgeNormal,v0);\n"
-" \n"
-" facesA[fidx].m_numIndices = 2;\n"
-" facesA[fidx].m_indexOffset=curUsedIndices;\n"
-" indicesA[curUsedIndices++]=i;\n"
-" indicesA[curUsedIndices++]=prevVertex;\n"
-" \n"
-" facesA[fidx].m_plane.x = edgeNormal.x;\n"
-" facesA[fidx].m_plane.y = edgeNormal.y;\n"
-" facesA[fidx].m_plane.z = edgeNormal.z;\n"
-" facesA[fidx].m_plane.w = c;\n"
-" fidx++;\n"
-" prevVertex = i;\n"
-" }\n"
-" }\n"
-" convexPolyhedronA.m_numFaces = TRIANGLE_NUM_CONVEX_FACES;\n"
-" convexPolyhedronA.m_localCenter = localCenter*(1.f/3.f);\n"
-" \n"
-" \n"
-" float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
-" posA.w = 0.f;\n"
-" float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
-" posB.w = 0.f;\n"
-" \n"
-" float4 ornA = rigidBodies[bodyIndexA].m_quat;\n"
-" float4 ornB =rigidBodies[bodyIndexB].m_quat;\n"
-" \n"
-" \n"
-" \n"
-" \n"
-" ///////////////////\n"
-" ///compound shape support\n"
-" \n"
-" if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)\n"
-" {\n"
-" int compoundChild = concavePairs[pairIdx].w;\n"
-" int childShapeIndexB = compoundChild;//collidables[collidableIndexB].m_shapeIndex+compoundChild;\n"
-" int childColIndexB = 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"
-" shapeIndexB = collidables[childColIndexB].m_shapeIndex;\n"
-" }\n"
-" //////////////////\n"
-" \n"
-" float4 c0local = convexPolyhedronA.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"
-" \n"
-" \n"
-" {\n"
-" bool sepEE = findSeparatingAxisEdgeEdgeLocalA( &convexPolyhedronA, &convexShapes[shapeIndexB],\n"
-" posA,ornA,\n"
-" posB,ornB,\n"
-" DeltaC2,\n"
-" verticesA,uniqueEdgesA,facesA,indicesA,\n"
-" vertices,uniqueEdges,faces,indices,\n"
-" &sepAxis,&dmin);\n"
-" \n"
-" if (!sepEE)\n"
-" {\n"
-" hasSeparatingAxis = 0;\n"
-" } else\n"
-" {\n"
-" hasSeparatingAxis = 1;\n"
-" }\n"
-" }\n"
-" \n"
-" \n"
-" if (hasSeparatingAxis)\n"
-" {\n"
-" sepAxis.w = dmin;\n"
-" dmins[i] = dmin;\n"
-" concaveSeparatingNormalsOut[pairIdx]=sepAxis;\n"
-" concaveHasSeparatingNormals[i]=1;\n"
-" \n"
-" float minDist = -1e30f;\n"
-" float maxDist = 0.02f;\n"
-" \n"
-" findClippingFaces(sepAxis,\n"
-" &convexPolyhedronA,\n"
-" &convexShapes[shapeIndexB],\n"
-" posA,ornA,\n"
-" posB,ornB,\n"
-" worldVertsA1GPU,\n"
-" worldNormalsAGPU,\n"
-" worldVertsB1GPU,\n"
-" vertexFaceCapacity,\n"
-" minDist, maxDist,\n"
-" verticesA,\n"
-" facesA,\n"
-" indicesA,\n"
-" vertices,\n"
-" faces,\n"
-" indices,\n"
-" clippingFacesOut, pairIdx);\n"
-" \n"
-" \n"
-" } else\n"
-" { \n"
-" //mark this pair as in-active\n"
-" concavePairs[pairIdx].w = -1;\n"
-" }\n"
-" }\n"
-" else\n"
-" { \n"
-" //mark this pair as in-active\n"
-" concavePairs[pairIdx].w = -1;\n"
-" }\n"
-" \n"
-" concavePairs[i].z = -1;//for the next stage, z is used to determine existing contact points\n"
-"}\n"
-;
+static const char* satConcaveKernelsCL =
+ "//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 B3_MAX_STACK_DEPTH 256\n"
+ "typedef unsigned int u32;\n"
+ "///keep this in sync with btCollidable.h\n"
+ "typedef struct\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"
+ " \n"
+ " int m_shapeType;\n"
+ " int m_shapeIndex;\n"
+ " \n"
+ "} btCollidableGpu;\n"
+ "#define MAX_NUM_PARTS_IN_BITS 10\n"
+ "///b3QuantizedBvhNode 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"
+ "} b3QuantizedBvhNode;\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 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 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;i<numVerts;i++)\n"
+ " {\n"
+ " float dp = dot(vertices[hull->m_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;i<numVerts;i++)\n"
+ " {\n"
+ " float dp = dot(vertices[hull->m_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(Max0<Min1 || Max1<Min0)\n"
+ " return false;\n"
+ " float d0 = Max0 - Min1;\n"
+ " float d1 = Max1 - Min0;\n"
+ " *depth = d0<d1 ? d0:d1;\n"
+ " return true;\n"
+ "}\n"
+ "inline bool IsAlmostZero(const float4 v)\n"
+ "{\n"
+ " if(fabs(v.x)>1e-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;i<numFacesA;i++)\n"
+ " {\n"
+ " const float4 normal = facesA[hullA->m_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;i<numFacesA;i++)\n"
+ " {\n"
+ " const float4 normal = facesA[hullA->m_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;e0<hullA->m_numUniqueEdges;e0++)\n"
+ " {\n"
+ " const float4 edge0 = uniqueEdgesA[hullA->m_uniqueEdgesOffset+e0];\n"
+ " float4 edge0World = qtRotate(ornA,edge0);\n"
+ " for(int e1=0;e1<hullB->m_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(Max0<Min1 || Max1<Min0)\n"
+ " result = false;\n"
+ " \n"
+ " float d0 = Max0 - Min1;\n"
+ " float d1 = Max1 - Min0;\n"
+ " dist = d0<d1 ? d0:d1;\n"
+ " result = true;\n"
+ " }\n"
+ " \n"
+ " if(dist<*dmin)\n"
+ " {\n"
+ " *dmin = dist;\n"
+ " *sep = crossje;\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " \n"
+ " if((dot3F4(-DeltaC2,*sep))>0.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;face<hullB->m_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;e0<numVertices;e0++)\n"
+ " {\n"
+ " if (e0<capacityWorldVerts)\n"
+ " {\n"
+ " const float4 b = verticesB[hullB->m_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;face<hullA->m_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;e0<numVerticesA;e0++)\n"
+ " {\n"
+ " if (e0<capacityWorldVerts)\n"
+ " {\n"
+ " const float4 a = verticesA[hullA->m_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<numVertices;i++)\n"
+ " {\n"
+ " float4 v0 = verticesA[i];\n"
+ " float4 v1 = verticesA[prevVertex];\n"
+ " \n"
+ " float4 edgeNormal = normalize(cross(normal,v1-v0));\n"
+ " float c = -dot(edgeNormal,v0);\n"
+ " \n"
+ " facesA[fidx].m_numIndices = 2;\n"
+ " facesA[fidx].m_indexOffset=curUsedIndices;\n"
+ " indicesA[curUsedIndices++]=i;\n"
+ " indicesA[curUsedIndices++]=prevVertex;\n"
+ " \n"
+ " facesA[fidx].m_plane.x = edgeNormal.x;\n"
+ " facesA[fidx].m_plane.y = edgeNormal.y;\n"
+ " facesA[fidx].m_plane.z = edgeNormal.z;\n"
+ " facesA[fidx].m_plane.w = c;\n"
+ " fidx++;\n"
+ " prevVertex = i;\n"
+ " }\n"
+ " }\n"
+ " convexPolyhedronA.m_numFaces = TRIANGLE_NUM_CONVEX_FACES;\n"
+ " convexPolyhedronA.m_localCenter = localCenter*(1.f/3.f);\n"
+ " \n"
+ " \n"
+ " float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
+ " posA.w = 0.f;\n"
+ " float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
+ " posB.w = 0.f;\n"
+ " \n"
+ " float4 ornA = rigidBodies[bodyIndexA].m_quat;\n"
+ " float4 ornB =rigidBodies[bodyIndexB].m_quat;\n"
+ " \n"
+ " \n"
+ " \n"
+ " \n"
+ " ///////////////////\n"
+ " ///compound shape support\n"
+ " \n"
+ " if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)\n"
+ " {\n"
+ " int compoundChild = concavePairs[pairIdx].w;\n"
+ " int childShapeIndexB = compoundChild;//collidables[collidableIndexB].m_shapeIndex+compoundChild;\n"
+ " int childColIndexB = 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"
+ " shapeIndexB = collidables[childColIndexB].m_shapeIndex;\n"
+ " }\n"
+ " //////////////////\n"
+ " \n"
+ " float4 c0local = convexPolyhedronA.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"
+ " \n"
+ " \n"
+ " bool sepA = findSeparatingAxisLocalA( &convexPolyhedronA, &convexShapes[shapeIndexB],\n"
+ " posA,ornA,\n"
+ " posB,ornB,\n"
+ " DeltaC2,\n"
+ " verticesA,uniqueEdgesA,facesA,indicesA,\n"
+ " vertices,uniqueEdges,faces,indices,\n"
+ " &sepAxis,&dmin);\n"
+ " hasSeparatingAxis = 4;\n"
+ " if (!sepA)\n"
+ " {\n"
+ " hasSeparatingAxis = 0;\n"
+ " } else\n"
+ " {\n"
+ " bool sepB = findSeparatingAxisLocalB( &convexShapes[shapeIndexB],&convexPolyhedronA,\n"
+ " posB,ornB,\n"
+ " posA,ornA,\n"
+ " DeltaC2,\n"
+ " vertices,uniqueEdges,faces,indices,\n"
+ " verticesA,uniqueEdgesA,facesA,indicesA,\n"
+ " &sepAxis,&dmin);\n"
+ " \n"
+ " if (!sepB)\n"
+ " {\n"
+ " hasSeparatingAxis = 0;\n"
+ " } else\n"
+ " {\n"
+ " hasSeparatingAxis = 1;\n"
+ " }\n"
+ " } \n"
+ " \n"
+ " if (hasSeparatingAxis)\n"
+ " {\n"
+ " dmins[i] = dmin;\n"
+ " concaveSeparatingNormalsOut[pairIdx]=sepAxis;\n"
+ " concaveHasSeparatingNormals[i]=1;\n"
+ " \n"
+ " } else\n"
+ " { \n"
+ " //mark this pair as in-active\n"
+ " concavePairs[pairIdx].w = -1;\n"
+ " }\n"
+ " }\n"
+ " else\n"
+ " { \n"
+ " //mark this pair as in-active\n"
+ " concavePairs[pairIdx].w = -1;\n"
+ " }\n"
+ "}\n"
+ "// work-in-progress\n"
+ "__kernel void findConcaveSeparatingAxisEdgeEdgeKernel( __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"
+ " 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;i<numVertices;i++)\n"
+ " {\n"
+ " float4 v0 = verticesA[i];\n"
+ " float4 v1 = verticesA[prevVertex];\n"
+ " \n"
+ " float4 edgeNormal = normalize(cross(normal,v1-v0));\n"
+ " float c = -dot(edgeNormal,v0);\n"
+ " \n"
+ " facesA[fidx].m_numIndices = 2;\n"
+ " facesA[fidx].m_indexOffset=curUsedIndices;\n"
+ " indicesA[curUsedIndices++]=i;\n"
+ " indicesA[curUsedIndices++]=prevVertex;\n"
+ " \n"
+ " facesA[fidx].m_plane.x = edgeNormal.x;\n"
+ " facesA[fidx].m_plane.y = edgeNormal.y;\n"
+ " facesA[fidx].m_plane.z = edgeNormal.z;\n"
+ " facesA[fidx].m_plane.w = c;\n"
+ " fidx++;\n"
+ " prevVertex = i;\n"
+ " }\n"
+ " }\n"
+ " convexPolyhedronA.m_numFaces = TRIANGLE_NUM_CONVEX_FACES;\n"
+ " convexPolyhedronA.m_localCenter = localCenter*(1.f/3.f);\n"
+ " \n"
+ " \n"
+ " float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
+ " posA.w = 0.f;\n"
+ " float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
+ " posB.w = 0.f;\n"
+ " \n"
+ " float4 ornA = rigidBodies[bodyIndexA].m_quat;\n"
+ " float4 ornB =rigidBodies[bodyIndexB].m_quat;\n"
+ " \n"
+ " \n"
+ " \n"
+ " \n"
+ " ///////////////////\n"
+ " ///compound shape support\n"
+ " \n"
+ " if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)\n"
+ " {\n"
+ " int compoundChild = concavePairs[pairIdx].w;\n"
+ " int childShapeIndexB = compoundChild;//collidables[collidableIndexB].m_shapeIndex+compoundChild;\n"
+ " int childColIndexB = 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"
+ " shapeIndexB = collidables[childColIndexB].m_shapeIndex;\n"
+ " }\n"
+ " //////////////////\n"
+ " \n"
+ " float4 c0local = convexPolyhedronA.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"
+ " \n"
+ " \n"
+ " {\n"
+ " bool sepEE = findSeparatingAxisEdgeEdgeLocalA( &convexPolyhedronA, &convexShapes[shapeIndexB],\n"
+ " posA,ornA,\n"
+ " posB,ornB,\n"
+ " DeltaC2,\n"
+ " verticesA,uniqueEdgesA,facesA,indicesA,\n"
+ " vertices,uniqueEdges,faces,indices,\n"
+ " &sepAxis,&dmin);\n"
+ " \n"
+ " if (!sepEE)\n"
+ " {\n"
+ " hasSeparatingAxis = 0;\n"
+ " } else\n"
+ " {\n"
+ " hasSeparatingAxis = 1;\n"
+ " }\n"
+ " }\n"
+ " \n"
+ " \n"
+ " if (hasSeparatingAxis)\n"
+ " {\n"
+ " sepAxis.w = dmin;\n"
+ " dmins[i] = dmin;\n"
+ " concaveSeparatingNormalsOut[pairIdx]=sepAxis;\n"
+ " concaveHasSeparatingNormals[i]=1;\n"
+ " \n"
+ " float minDist = -1e30f;\n"
+ " float maxDist = 0.02f;\n"
+ " \n"
+ " findClippingFaces(sepAxis,\n"
+ " &convexPolyhedronA,\n"
+ " &convexShapes[shapeIndexB],\n"
+ " posA,ornA,\n"
+ " posB,ornB,\n"
+ " worldVertsA1GPU,\n"
+ " worldNormalsAGPU,\n"
+ " worldVertsB1GPU,\n"
+ " vertexFaceCapacity,\n"
+ " minDist, maxDist,\n"
+ " verticesA,\n"
+ " facesA,\n"
+ " indicesA,\n"
+ " vertices,\n"
+ " faces,\n"
+ " indices,\n"
+ " clippingFacesOut, pairIdx);\n"
+ " \n"
+ " \n"
+ " } else\n"
+ " { \n"
+ " //mark this pair as in-active\n"
+ " concavePairs[pairIdx].w = -1;\n"
+ " }\n"
+ " }\n"
+ " else\n"
+ " { \n"
+ " //mark this pair as in-active\n"
+ " concavePairs[pairIdx].w = -1;\n"
+ " }\n"
+ " \n"
+ " concavePairs[i].z = -1;//for the next stage, z is used to determine existing contact points\n"
+ "}\n";
diff --git a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/satKernels.h b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/satKernels.h
index 6f8b0a90db..e627af2799 100644
--- a/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/satKernels.h
+++ b/thirdparty/bullet/Bullet3OpenCL/NarrowphaseCollision/kernels/satKernels.h
@@ -1,2104 +1,2103 @@
//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project
-static const char* satKernelsCL= \
-"//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 B3_MAX_STACK_DEPTH 256\n"
-"typedef unsigned int u32;\n"
-"///keep this in sync with btCollidable.h\n"
-"typedef struct\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"
-" \n"
-" int m_shapeType;\n"
-" int m_shapeIndex;\n"
-" \n"
-"} btCollidableGpu;\n"
-"#define MAX_NUM_PARTS_IN_BITS 10\n"
-"///b3QuantizedBvhNode 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"
-"} b3QuantizedBvhNode;\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 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 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;i<numVerts;i++)\n"
-" {\n"
-" float dp = dot(vertices[hull->m_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;i<numVerts;i++)\n"
-" {\n"
-" float dp = dot(vertices[hull->m_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(Max0<Min1 || Max1<Min0)\n"
-" return false;\n"
-" float d0 = Max0 - Min1;\n"
-" float d1 = Max1 - Min0;\n"
-" *depth = d0<d1 ? d0:d1;\n"
-" return true;\n"
-"}\n"
-"inline bool IsAlmostZero(const float4 v)\n"
-"{\n"
-" if(fabs(v.x)>1e-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;i<numFacesA;i++)\n"
-" {\n"
-" const float4 normal = facesA[hullA->m_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;i<numFacesA;i++)\n"
-" {\n"
-" const float4 normal = facesA[hullA->m_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;e0<hullA->m_numUniqueEdges;e0++)\n"
-" {\n"
-" const float4 edge0 = uniqueEdgesA[hullA->m_uniqueEdgesOffset+e0];\n"
-" float4 edge0World = qtRotate(ornA,edge0);\n"
-" for(int e1=0;e1<hullB->m_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(Max0<Min1 || Max1<Min0)\n"
-" result = false;\n"
-" \n"
-" float d0 = Max0 - Min1;\n"
-" float d1 = Max1 - Min0;\n"
-" dist = d0<d1 ? d0:d1;\n"
-" result = true;\n"
-" }\n"
-" \n"
-" if(dist<*dmin)\n"
-" {\n"
-" *dmin = dist;\n"
-" *sep = crossje;\n"
-" }\n"
-" }\n"
-" }\n"
-" }\n"
-" \n"
-" if((dot3F4(-DeltaC2,*sep))>0.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(Max0<Min1 || Max1<Min0)\n"
-" return false;\n"
-" float d0 = Max0 - Min1;\n"
-" float d1 = Max1 - Min0;\n"
-" *depth = d0<d1 ? d0:d1;\n"
-" return true;\n"
-"}\n"
-"bool findSeparatingAxis( __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"
-" \n"
-" int curPlaneTests=0;\n"
-" {\n"
-" int numFacesA = hullA->m_numFaces;\n"
-" // Test normals from hullA\n"
-" for(int i=0;i<numFacesA;i++)\n"
-" {\n"
-" const float4 normal = faces[hullA->m_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;i<numUnitSphereDirections;i++)\n"
-" {\n"
-" float4 crossje;\n"
-" crossje = unitSphereDirections[i]; \n"
-" if (dot3F4(DeltaC2,crossje)>0)\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(Max0<Min1 || Max1<Min0)\n"
-" return false;\n"
-" \n"
-" float d0 = Max0 - Min1;\n"
-" float d1 = Max1 - Min0;\n"
-" dist = d0<d1 ? d0:d1;\n"
-" result = true;\n"
-" \n"
-" if(dist<*dmin)\n"
-" {\n"
-" *dmin = dist;\n"
-" *sep = crossje;\n"
-" }\n"
-" }\n"
-" }\n"
-" \n"
-" if((dot3F4(-DeltaC2,*sep))>0.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;e0<hullA->m_numUniqueEdges;e0++)\n"
-" {\n"
-" const float4 edge0 = uniqueEdges[hullA->m_uniqueEdgesOffset+e0];\n"
-" float4 edge0World = qtRotate(ornA,edge0);\n"
-" for(int e1=0;e1<hullB->m_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(Max0<Min1 || Max1<Min0)\n"
-" return false;\n"
-" \n"
-" float d0 = Max0 - Min1;\n"
-" float d1 = Max1 - Min0;\n"
-" dist = d0<d1 ? d0:d1;\n"
-" result = true;\n"
-" }\n"
-" \n"
-" if(dist<*dmin)\n"
-" {\n"
-" *dmin = dist;\n"
-" *sep = crossje;\n"
-" }\n"
-" }\n"
-" }\n"
-" }\n"
-" \n"
-" if((dot3F4(-DeltaC2,*sep))>0.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<numCompoundPairs)\n"
-" {\n"
-" int bodyIndexA = gpuCompoundPairs[i].x;\n"
-" int bodyIndexB = gpuCompoundPairs[i].y;\n"
-" int childShapeIndexA = gpuCompoundPairs[i].z;\n"
-" int childShapeIndexB = gpuCompoundPairs[i].w;\n"
-" \n"
-" int collidableIndexA = -1;\n"
-" int collidableIndexB = -1;\n"
-" \n"
-" float4 ornA = rigidBodies[bodyIndexA].m_quat;\n"
-" float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
-" \n"
-" float4 ornB = rigidBodies[bodyIndexB].m_quat;\n"
-" float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
-" \n"
-" if (childShapeIndexA >= 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 (i<numPairs)\n"
-" {\n"
-" int bodyIndexA = pairs[i].x;\n"
-" int bodyIndexB = pairs[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"
-" //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"
-" if ((collidables[collidableIndexA].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS) &&(collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS))\n"
-" {\n"
-" int bvhA = collidables[collidableIndexA].m_compoundBvhIndex;\n"
-" int bvhB = collidables[collidableIndexB].m_compoundBvhIndex;\n"
-" int numSubTreesA = bvhInfos[bvhA].m_numSubTrees;\n"
-" int subTreesOffsetA = bvhInfos[bvhA].m_subTreeOffset;\n"
-" int subTreesOffsetB = bvhInfos[bvhB].m_subTreeOffset;\n"
-" int numSubTreesB = bvhInfos[bvhB].m_numSubTrees;\n"
-" \n"
-" float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
-" b3Quat ornA = rigidBodies[bodyIndexA].m_quat;\n"
-" b3Quat ornB = rigidBodies[bodyIndexB].m_quat;\n"
-" float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
-" \n"
-" for (int p=0;p<numSubTreesA;p++)\n"
-" {\n"
-" b3BvhSubtreeInfo subtreeA = subtrees[subTreesOffsetA+p];\n"
-" //bvhInfos[bvhA].m_quantization\n"
-" b3Float4 treeAminLocal = MyUnQuantize(subtreeA.m_quantizedAabbMin,bvhInfos[bvhA].m_quantization,bvhInfos[bvhA].m_aabbMin);\n"
-" b3Float4 treeAmaxLocal = MyUnQuantize(subtreeA.m_quantizedAabbMax,bvhInfos[bvhA].m_quantization,bvhInfos[bvhA].m_aabbMin);\n"
-" b3Float4 aabbAMinOut,aabbAMaxOut;\n"
-" float margin=0.f;\n"
-" b3TransformAabb2(treeAminLocal,treeAmaxLocal, margin,posA,ornA,&aabbAMinOut,&aabbAMaxOut);\n"
-" \n"
-" for (int q=0;q<numSubTreesB;q++)\n"
-" {\n"
-" b3BvhSubtreeInfo subtreeB = subtrees[subTreesOffsetB+q];\n"
-" b3Float4 treeBminLocal = MyUnQuantize(subtreeB.m_quantizedAabbMin,bvhInfos[bvhB].m_quantization,bvhInfos[bvhB].m_aabbMin);\n"
-" b3Float4 treeBmaxLocal = MyUnQuantize(subtreeB.m_quantizedAabbMax,bvhInfos[bvhB].m_quantization,bvhInfos[bvhB].m_aabbMin);\n"
-" b3Float4 aabbBMinOut,aabbBMaxOut;\n"
-" float margin=0.f;\n"
-" b3TransformAabb2(treeBminLocal,treeBmaxLocal, margin,posB,ornB,&aabbBMinOut,&aabbBMaxOut);\n"
-" \n"
-" \n"
-" bool aabbOverlap = b3TestAabbAgainstAabb(aabbAMinOut,aabbAMaxOut,aabbBMinOut,aabbBMaxOut);\n"
-" if (aabbOverlap)\n"
-" {\n"
-" \n"
-" int startNodeIndexA = subtreeA.m_rootNodeIndex+bvhInfos[bvhA].m_nodeOffset;\n"
-" int endNodeIndexA = startNodeIndexA+subtreeA.m_subtreeSize;\n"
-" int startNodeIndexB = subtreeB.m_rootNodeIndex+bvhInfos[bvhB].m_nodeOffset;\n"
-" int endNodeIndexB = startNodeIndexB+subtreeB.m_subtreeSize;\n"
-" b3Int2 nodeStack[B3_MAX_STACK_DEPTH];\n"
-" b3Int2 node0;\n"
-" node0.x = startNodeIndexA;\n"
-" node0.y = startNodeIndexB;\n"
-" int maxStackDepth = B3_MAX_STACK_DEPTH;\n"
-" int depth=0;\n"
-" nodeStack[depth++]=node0;\n"
-" do\n"
-" {\n"
-" b3Int2 node = nodeStack[--depth];\n"
-" b3Float4 aMinLocal = MyUnQuantizeGlobal(quantizedNodes[node.x].m_quantizedAabbMin,bvhInfos[bvhA].m_quantization,bvhInfos[bvhA].m_aabbMin);\n"
-" b3Float4 aMaxLocal = MyUnQuantizeGlobal(quantizedNodes[node.x].m_quantizedAabbMax,bvhInfos[bvhA].m_quantization,bvhInfos[bvhA].m_aabbMin);\n"
-" b3Float4 bMinLocal = MyUnQuantizeGlobal(quantizedNodes[node.y].m_quantizedAabbMin,bvhInfos[bvhB].m_quantization,bvhInfos[bvhB].m_aabbMin);\n"
-" b3Float4 bMaxLocal = MyUnQuantizeGlobal(quantizedNodes[node.y].m_quantizedAabbMax,bvhInfos[bvhB].m_quantization,bvhInfos[bvhB].m_aabbMin);\n"
-" float margin=0.f;\n"
-" b3Float4 aabbAMinOut,aabbAMaxOut;\n"
-" b3TransformAabb2(aMinLocal,aMaxLocal, margin,posA,ornA,&aabbAMinOut,&aabbAMaxOut);\n"
-" b3Float4 aabbBMinOut,aabbBMaxOut;\n"
-" b3TransformAabb2(bMinLocal,bMaxLocal, margin,posB,ornB,&aabbBMinOut,&aabbBMaxOut);\n"
-" \n"
-" bool nodeOverlap = b3TestAabbAgainstAabb(aabbAMinOut,aabbAMaxOut,aabbBMinOut,aabbBMaxOut);\n"
-" if (nodeOverlap)\n"
-" {\n"
-" bool isLeafA = isLeafNodeGlobal(&quantizedNodes[node.x]);\n"
-" bool isLeafB = isLeafNodeGlobal(&quantizedNodes[node.y]);\n"
-" bool isInternalA = !isLeafA;\n"
-" bool isInternalB = !isLeafB;\n"
-" //fail, even though it might hit two leaf nodes\n"
-" if (depth+4>maxStackDepth && !(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 (compoundPairIdx<maxNumCompoundPairsCapacity)\n"
-" {\n"
-" int childShapeIndexA = getTriangleIndexGlobal(&quantizedNodes[node.x]);\n"
-" int childShapeIndexB = getTriangleIndexGlobal(&quantizedNodes[node.y]);\n"
-" gpuCompoundPairsOut[compoundPairIdx] = (int4)(bodyIndexA,bodyIndexB,childShapeIndexA,childShapeIndexB);\n"
-" }\n"
-" }\n"
-" }\n"
-" }\n"
-" } while (depth);\n"
-" }\n"
-" }\n"
-" }\n"
-" \n"
-" return;\n"
-" }\n"
-" if ((collidables[collidableIndexA].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS) ||(collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS))\n"
-" {\n"
-" if (collidables[collidableIndexA].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS) \n"
-" {\n"
-" int numChildrenA = collidables[collidableIndexA].m_numChildShapes;\n"
-" for (int c=0;c<numChildrenA;c++)\n"
-" {\n"
-" int childShapeIndexA = collidables[collidableIndexA].m_shapeIndex+c;\n"
-" int childColIndexA = gpuChildShapes[childShapeIndexA].m_shapeIndex;\n"
-" float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
-" float4 ornA = rigidBodies[bodyIndexA].m_quat;\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"
-" int shapeIndexA = collidables[childColIndexA].m_shapeIndex;\n"
-" b3Aabb_t aabbAlocal = aabbLocalSpace[shapeIndexA];\n"
-" float margin = 0.f;\n"
-" \n"
-" b3Float4 aabbAMinWS;\n"
-" b3Float4 aabbAMaxWS;\n"
-" \n"
-" b3TransformAabb2(aabbAlocal.m_minVec,aabbAlocal.m_maxVec,margin,\n"
-" newPosA,\n"
-" newOrnA,\n"
-" &aabbAMinWS,&aabbAMaxWS);\n"
-" \n"
-" \n"
-" if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)\n"
-" {\n"
-" int numChildrenB = collidables[collidableIndexB].m_numChildShapes;\n"
-" for (int b=0;b<numChildrenB;b++)\n"
-" {\n"
-" int childShapeIndexB = collidables[collidableIndexB].m_shapeIndex+b;\n"
-" int childColIndexB = gpuChildShapes[childShapeIndexB].m_shapeIndex;\n"
-" float4 ornB = rigidBodies[bodyIndexB].m_quat;\n"
-" float4 posB = rigidBodies[bodyIndexB].m_pos;\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"
-" int shapeIndexB = collidables[childColIndexB].m_shapeIndex;\n"
-" b3Aabb_t aabbBlocal = aabbLocalSpace[shapeIndexB];\n"
-" \n"
-" b3Float4 aabbBMinWS;\n"
-" b3Float4 aabbBMaxWS;\n"
-" \n"
-" b3TransformAabb2(aabbBlocal.m_minVec,aabbBlocal.m_maxVec,margin,\n"
-" newPosB,\n"
-" newOrnB,\n"
-" &aabbBMinWS,&aabbBMaxWS);\n"
-" \n"
-" \n"
-" \n"
-" bool aabbOverlap = b3TestAabbAgainstAabb(aabbAMinWS,aabbAMaxWS,aabbBMinWS,aabbBMaxWS);\n"
-" if (aabbOverlap)\n"
-" {\n"
-" int numFacesA = convexShapes[shapeIndexA].m_numFaces;\n"
-" float dmin = FLT_MAX;\n"
-" float4 posA = newPosA;\n"
-" posA.w = 0.f;\n"
-" float4 posB = newPosB;\n"
-" posB.w = 0.f;\n"
-" float4 c0local = convexShapes[shapeIndexA].m_localCenter;\n"
-" float4 ornA = newOrnA;\n"
-" float4 c0 = transform(&c0local, &posA, &ornA);\n"
-" float4 c1local = convexShapes[shapeIndexB].m_localCenter;\n"
-" float4 ornB =newOrnB;\n"
-" float4 c1 = transform(&c1local,&posB,&ornB);\n"
-" const float4 DeltaC2 = c0 - c1;\n"
-" {//\n"
-" int compoundPairIdx = atomic_inc(numCompoundPairsOut);\n"
-" if (compoundPairIdx<maxNumCompoundPairsCapacity)\n"
-" {\n"
-" gpuCompoundPairsOut[compoundPairIdx] = (int4)(bodyIndexA,bodyIndexB,childShapeIndexA,childShapeIndexB);\n"
-" }\n"
-" }//\n"
-" }//fi(1)\n"
-" } //for (int b=0\n"
-" }//if (collidables[collidableIndexB].\n"
-" else//if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)\n"
-" {\n"
-" if (1)\n"
-" {\n"
-" int numFacesA = convexShapes[shapeIndexA].m_numFaces;\n"
-" float dmin = FLT_MAX;\n"
-" float4 posA = newPosA;\n"
-" posA.w = 0.f;\n"
-" float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
-" posB.w = 0.f;\n"
-" float4 c0local = convexShapes[shapeIndexA].m_localCenter;\n"
-" float4 ornA = newOrnA;\n"
-" float4 c0 = transform(&c0local, &posA, &ornA);\n"
-" float4 c1local = convexShapes[shapeIndexB].m_localCenter;\n"
-" float4 ornB = rigidBodies[bodyIndexB].m_quat;\n"
-" float4 c1 = transform(&c1local,&posB,&ornB);\n"
-" const float4 DeltaC2 = c0 - c1;\n"
-" {\n"
-" int compoundPairIdx = atomic_inc(numCompoundPairsOut);\n"
-" if (compoundPairIdx<maxNumCompoundPairsCapacity)\n"
-" {\n"
-" gpuCompoundPairsOut[compoundPairIdx] = (int4)(bodyIndexA,bodyIndexB,childShapeIndexA,-1);\n"
-" }//if (compoundPairIdx<maxNumCompoundPairsCapacity)\n"
-" }//\n"
-" }//fi (1)\n"
-" }//if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)\n"
-" }//for (int b=0;b<numChildrenB;b++) \n"
-" return;\n"
-" }//if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)\n"
-" if ((collidables[collidableIndexA].m_shapeType!=SHAPE_CONCAVE_TRIMESH) \n"
-" && (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS))\n"
-" {\n"
-" int numChildrenB = collidables[collidableIndexB].m_numChildShapes;\n"
-" for (int b=0;b<numChildrenB;b++)\n"
-" {\n"
-" int childShapeIndexB = collidables[collidableIndexB].m_shapeIndex+b;\n"
-" int childColIndexB = gpuChildShapes[childShapeIndexB].m_shapeIndex;\n"
-" float4 ornB = rigidBodies[bodyIndexB].m_quat;\n"
-" float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
-" float4 childPosB = gpuChildShapes[childShapeIndexB].m_childPosition;\n"
-" float4 childOrnB = gpuChildShapes[childShapeIndexB].m_childOrientation;\n"
-" float4 newPosB = qtRotate(ornB,childPosB)+posB;\n"
-" float4 newOrnB = qtMul(ornB,childOrnB);\n"
-" int shapeIndexB = collidables[childColIndexB].m_shapeIndex;\n"
-" //////////////////////////////////////\n"
-" if (1)\n"
-" {\n"
-" int numFacesA = convexShapes[shapeIndexA].m_numFaces;\n"
-" float dmin = FLT_MAX;\n"
-" float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
-" posA.w = 0.f;\n"
-" float4 posB = newPosB;\n"
-" posB.w = 0.f;\n"
-" float4 c0local = convexShapes[shapeIndexA].m_localCenter;\n"
-" float4 ornA = rigidBodies[bodyIndexA].m_quat;\n"
-" float4 c0 = transform(&c0local, &posA, &ornA);\n"
-" float4 c1local = convexShapes[shapeIndexB].m_localCenter;\n"
-" float4 ornB =newOrnB;\n"
-" float4 c1 = transform(&c1local,&posB,&ornB);\n"
-" const float4 DeltaC2 = c0 - c1;\n"
-" {//\n"
-" int compoundPairIdx = atomic_inc(numCompoundPairsOut);\n"
-" if (compoundPairIdx<maxNumCompoundPairsCapacity)\n"
-" {\n"
-" gpuCompoundPairsOut[compoundPairIdx] = (int4)(bodyIndexA,bodyIndexB,-1,childShapeIndexB);\n"
-" }//fi (compoundPairIdx<maxNumCompoundPairsCapacity)\n"
-" }//\n"
-" }//fi (1) \n"
-" }//for (int b=0;b<numChildrenB;b++)\n"
-" return;\n"
-" }//if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)\n"
-" return;\n"
-" }//fi ((collidables[collidableIndexA].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS) ||(collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS))\n"
-" }//i<numPairs\n"
-"}\n"
-"// work-in-progress\n"
-"__kernel void findSeparatingAxisKernel( __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 btAabbCL* aabbs,\n"
-" __global volatile float4* separatingNormals,\n"
-" __global volatile int* hasSeparatingAxis,\n"
-" int numPairs\n"
-" )\n"
-"{\n"
-" int i = get_global_id(0);\n"
-" \n"
-" if (i<numPairs)\n"
-" {\n"
-" \n"
-" int bodyIndexA = pairs[i].x;\n"
-" int bodyIndexB = pairs[i].y;\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"
-" //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"
-" hasSeparatingAxis[i] = 0;\n"
-" return;\n"
-" }\n"
-" \n"
-" if ((collidables[collidableIndexA].m_shapeType!=SHAPE_CONVEX_HULL) ||(collidables[collidableIndexB].m_shapeType!=SHAPE_CONVEX_HULL))\n"
-" {\n"
-" hasSeparatingAxis[i] = 0;\n"
-" return;\n"
-" }\n"
-" \n"
-" if ((collidables[collidableIndexA].m_shapeType==SHAPE_CONCAVE_TRIMESH))\n"
-" {\n"
-" hasSeparatingAxis[i] = 0;\n"
-" return;\n"
-" }\n"
-" int numFacesA = convexShapes[shapeIndexA].m_numFaces;\n"
-" float dmin = FLT_MAX;\n"
-" float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
-" posA.w = 0.f;\n"
-" float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
-" posB.w = 0.f;\n"
-" float4 c0local = convexShapes[shapeIndexA].m_localCenter;\n"
-" float4 ornA = rigidBodies[bodyIndexA].m_quat;\n"
-" float4 c0 = transform(&c0local, &posA, &ornA);\n"
-" float4 c1local = convexShapes[shapeIndexB].m_localCenter;\n"
-" float4 ornB =rigidBodies[bodyIndexB].m_quat;\n"
-" float4 c1 = transform(&c1local,&posB,&ornB);\n"
-" const float4 DeltaC2 = c0 - c1;\n"
-" float4 sepNormal;\n"
-" \n"
-" bool sepA = findSeparatingAxis( &convexShapes[shapeIndexA], &convexShapes[shapeIndexB],posA,ornA,\n"
-" posB,ornB,\n"
-" DeltaC2,\n"
-" vertices,uniqueEdges,faces,\n"
-" indices,&sepNormal,&dmin);\n"
-" hasSeparatingAxis[i] = 4;\n"
-" if (!sepA)\n"
-" {\n"
-" hasSeparatingAxis[i] = 0;\n"
-" } else\n"
-" {\n"
-" bool sepB = findSeparatingAxis( &convexShapes[shapeIndexB],&convexShapes[shapeIndexA],posB,ornB,\n"
-" posA,ornA,\n"
-" DeltaC2,\n"
-" vertices,uniqueEdges,faces,\n"
-" indices,&sepNormal,&dmin);\n"
-" if (!sepB)\n"
-" {\n"
-" hasSeparatingAxis[i] = 0;\n"
-" } else\n"
-" {\n"
-" bool sepEE = findSeparatingAxisEdgeEdge( &convexShapes[shapeIndexA], &convexShapes[shapeIndexB],posA,ornA,\n"
-" posB,ornB,\n"
-" DeltaC2,\n"
-" vertices,uniqueEdges,faces,\n"
-" indices,&sepNormal,&dmin);\n"
-" if (!sepEE)\n"
-" {\n"
-" hasSeparatingAxis[i] = 0;\n"
-" } else\n"
-" {\n"
-" hasSeparatingAxis[i] = 1;\n"
-" separatingNormals[i] = sepNormal;\n"
-" }\n"
-" }\n"
-" }\n"
-" \n"
-" }\n"
-"}\n"
-"__kernel void findSeparatingAxisVertexFaceKernel( __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 btAabbCL* aabbs,\n"
-" __global volatile float4* separatingNormals,\n"
-" __global volatile int* hasSeparatingAxis,\n"
-" __global float* dmins,\n"
-" int numPairs\n"
-" )\n"
-"{\n"
-" int i = get_global_id(0);\n"
-" \n"
-" if (i<numPairs)\n"
-" {\n"
-" \n"
-" int bodyIndexA = pairs[i].x;\n"
-" int bodyIndexB = pairs[i].y;\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"
-" hasSeparatingAxis[i] = 0; \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_CONVEX_HULL) ||(collidables[collidableIndexB].m_shapeType!=SHAPE_CONVEX_HULL))\n"
-" {\n"
-" return;\n"
-" }\n"
-" \n"
-" int numFacesA = convexShapes[shapeIndexA].m_numFaces;\n"
-" float dmin = FLT_MAX;\n"
-" dmins[i] = dmin;\n"
-" \n"
-" float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
-" posA.w = 0.f;\n"
-" float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
-" posB.w = 0.f;\n"
-" float4 c0local = convexShapes[shapeIndexA].m_localCenter;\n"
-" float4 ornA = rigidBodies[bodyIndexA].m_quat;\n"
-" float4 c0 = transform(&c0local, &posA, &ornA);\n"
-" float4 c1local = convexShapes[shapeIndexB].m_localCenter;\n"
-" float4 ornB =rigidBodies[bodyIndexB].m_quat;\n"
-" float4 c1 = transform(&c1local,&posB,&ornB);\n"
-" const float4 DeltaC2 = c0 - c1;\n"
-" float4 sepNormal;\n"
-" \n"
-" bool sepA = findSeparatingAxis( &convexShapes[shapeIndexA], &convexShapes[shapeIndexB],posA,ornA,\n"
-" posB,ornB,\n"
-" DeltaC2,\n"
-" vertices,uniqueEdges,faces,\n"
-" indices,&sepNormal,&dmin);\n"
-" hasSeparatingAxis[i] = 4;\n"
-" if (!sepA)\n"
-" {\n"
-" hasSeparatingAxis[i] = 0;\n"
-" } else\n"
-" {\n"
-" bool sepB = findSeparatingAxis( &convexShapes[shapeIndexB],&convexShapes[shapeIndexA],posB,ornB,\n"
-" posA,ornA,\n"
-" DeltaC2,\n"
-" vertices,uniqueEdges,faces,\n"
-" indices,&sepNormal,&dmin);\n"
-" if (sepB)\n"
-" {\n"
-" dmins[i] = dmin;\n"
-" hasSeparatingAxis[i] = 1;\n"
-" separatingNormals[i] = sepNormal;\n"
-" }\n"
-" }\n"
-" \n"
-" }\n"
-"}\n"
-"__kernel void findSeparatingAxisEdgeEdgeKernel( __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 btAabbCL* aabbs,\n"
-" __global float4* separatingNormals,\n"
-" __global int* hasSeparatingAxis,\n"
-" __global float* dmins,\n"
-" __global const float4* unitSphereDirections,\n"
-" int numUnitSphereDirections,\n"
-" int numPairs\n"
-" )\n"
-"{\n"
-" int i = get_global_id(0);\n"
-" \n"
-" if (i<numPairs)\n"
-" {\n"
-" if (hasSeparatingAxis[i])\n"
-" {\n"
-" \n"
-" int bodyIndexA = pairs[i].x;\n"
-" int bodyIndexB = pairs[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"
-" \n"
-" float dmin = dmins[i];\n"
-" \n"
-" float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
-" posA.w = 0.f;\n"
-" float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
-" posB.w = 0.f;\n"
-" float4 c0local = convexShapes[shapeIndexA].m_localCenter;\n"
-" float4 ornA = rigidBodies[bodyIndexA].m_quat;\n"
-" float4 c0 = transform(&c0local, &posA, &ornA);\n"
-" float4 c1local = convexShapes[shapeIndexB].m_localCenter;\n"
-" float4 ornB =rigidBodies[bodyIndexB].m_quat;\n"
-" float4 c1 = transform(&c1local,&posB,&ornB);\n"
-" const float4 DeltaC2 = c0 - c1;\n"
-" float4 sepNormal = separatingNormals[i];\n"
-" \n"
-" \n"
-" \n"
-" bool sepEE = false;\n"
-" int numEdgeEdgeDirections = convexShapes[shapeIndexA].m_numUniqueEdges*convexShapes[shapeIndexB].m_numUniqueEdges;\n"
-" if (numEdgeEdgeDirections<=numUnitSphereDirections)\n"
-" {\n"
-" sepEE = findSeparatingAxisEdgeEdge( &convexShapes[shapeIndexA], &convexShapes[shapeIndexB],posA,ornA,\n"
-" posB,ornB,\n"
-" DeltaC2,\n"
-" vertices,uniqueEdges,faces,\n"
-" indices,&sepNormal,&dmin);\n"
-" \n"
-" if (!sepEE)\n"
-" {\n"
-" hasSeparatingAxis[i] = 0;\n"
-" } else\n"
-" {\n"
-" hasSeparatingAxis[i] = 1;\n"
-" separatingNormals[i] = sepNormal;\n"
-" }\n"
-" }\n"
-" /*\n"
-" ///else case is a separate kernel, to make Mac OSX OpenCL compiler happy\n"
-" else\n"
-" {\n"
-" sepEE = findSeparatingAxisUnitSphere(&convexShapes[shapeIndexA], &convexShapes[shapeIndexB],posA,ornA,\n"
-" posB,ornB,\n"
-" DeltaC2,\n"
-" vertices,unitSphereDirections,numUnitSphereDirections,\n"
-" &sepNormal,&dmin);\n"
-" if (!sepEE)\n"
-" {\n"
-" hasSeparatingAxis[i] = 0;\n"
-" } else\n"
-" {\n"
-" hasSeparatingAxis[i] = 1;\n"
-" separatingNormals[i] = sepNormal;\n"
-" }\n"
-" }\n"
-" */\n"
-" } //if (hasSeparatingAxis[i])\n"
-" }//(i<numPairs)\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;face<hullB->m_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;e0<numVertices;e0++)\n"
-" {\n"
-" if (e0<capacityWorldVerts)\n"
-" {\n"
-" const float4 b = verticesB[hullB->m_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;face<hullA->m_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;e0<numVerticesA;e0++)\n"
-" {\n"
-" if (e0<capacityWorldVerts)\n"
-" {\n"
-" const float4 a = verticesA[hullA->m_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<numVertices;i++)\n"
-" {\n"
-" float4 v0 = verticesA[i];\n"
-" float4 v1 = verticesA[prevVertex];\n"
-" \n"
-" float4 edgeNormal = normalize(cross(normal,v1-v0));\n"
-" float c = -dot(edgeNormal,v0);\n"
-" facesA[fidx].m_numIndices = 2;\n"
-" facesA[fidx].m_indexOffset=curUsedIndices;\n"
-" indicesA[curUsedIndices++]=i;\n"
-" indicesA[curUsedIndices++]=prevVertex;\n"
-" \n"
-" facesA[fidx].m_plane.x = edgeNormal.x;\n"
-" facesA[fidx].m_plane.y = edgeNormal.y;\n"
-" facesA[fidx].m_plane.z = edgeNormal.z;\n"
-" facesA[fidx].m_plane.w = c;\n"
-" fidx++;\n"
-" prevVertex = i;\n"
-" }\n"
-" }\n"
-" convexPolyhedronA.m_numFaces = TRIANGLE_NUM_CONVEX_FACES;\n"
-" convexPolyhedronA.m_localCenter = localCenter*(1.f/3.f);\n"
-" float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
-" posA.w = 0.f;\n"
-" float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
-" posB.w = 0.f;\n"
-" float4 ornA = rigidBodies[bodyIndexA].m_quat;\n"
-" float4 ornB =rigidBodies[bodyIndexB].m_quat;\n"
-" \n"
-" ///////////////////\n"
-" ///compound shape support\n"
-" if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)\n"
-" {\n"
-" int compoundChild = concavePairs[pairIdx].w;\n"
-" int childShapeIndexB = compoundChild;//collidables[collidableIndexB].m_shapeIndex+compoundChild;\n"
-" int childColIndexB = 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"
-" shapeIndexB = collidables[childColIndexB].m_shapeIndex;\n"
-" }\n"
-" //////////////////\n"
-" float4 c0local = convexPolyhedronA.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"
-" bool sepA = findSeparatingAxisLocalA( &convexPolyhedronA, &convexShapes[shapeIndexB],\n"
-" posA,ornA,\n"
-" posB,ornB,\n"
-" DeltaC2,\n"
-" verticesA,uniqueEdgesA,facesA,indicesA,\n"
-" vertices,uniqueEdges,faces,indices,\n"
-" &sepAxis,&dmin);\n"
-" hasSeparatingAxis = 4;\n"
-" if (!sepA)\n"
-" {\n"
-" hasSeparatingAxis = 0;\n"
-" } else\n"
-" {\n"
-" bool sepB = findSeparatingAxisLocalB( &convexShapes[shapeIndexB],&convexPolyhedronA,\n"
-" posB,ornB,\n"
-" posA,ornA,\n"
-" DeltaC2,\n"
-" vertices,uniqueEdges,faces,indices,\n"
-" verticesA,uniqueEdgesA,facesA,indicesA,\n"
-" &sepAxis,&dmin);\n"
-" if (!sepB)\n"
-" {\n"
-" hasSeparatingAxis = 0;\n"
-" } else\n"
-" {\n"
-" bool sepEE = findSeparatingAxisEdgeEdgeLocalA( &convexPolyhedronA, &convexShapes[shapeIndexB],\n"
-" posA,ornA,\n"
-" posB,ornB,\n"
-" DeltaC2,\n"
-" verticesA,uniqueEdgesA,facesA,indicesA,\n"
-" vertices,uniqueEdges,faces,indices,\n"
-" &sepAxis,&dmin);\n"
-" \n"
-" if (!sepEE)\n"
-" {\n"
-" hasSeparatingAxis = 0;\n"
-" } else\n"
-" {\n"
-" hasSeparatingAxis = 1;\n"
-" }\n"
-" }\n"
-" } \n"
-" \n"
-" if (hasSeparatingAxis)\n"
-" {\n"
-" sepAxis.w = dmin;\n"
-" concaveSeparatingNormalsOut[pairIdx]=sepAxis;\n"
-" concaveHasSeparatingNormals[i]=1;\n"
-" float minDist = -1e30f;\n"
-" float maxDist = 0.02f;\n"
-" \n"
-" findClippingFaces(sepAxis,\n"
-" &convexPolyhedronA,\n"
-" &convexShapes[shapeIndexB],\n"
-" posA,ornA,\n"
-" posB,ornB,\n"
-" worldVertsA1GPU,\n"
-" worldNormalsAGPU,\n"
-" worldVertsB1GPU,\n"
-" vertexFaceCapacity,\n"
-" minDist, maxDist,\n"
-" verticesA,\n"
-" facesA,\n"
-" indicesA,\n"
-" vertices,\n"
-" faces,\n"
-" indices,\n"
-" clippingFacesOut, pairIdx);\n"
-" } else\n"
-" { \n"
-" //mark this pair as in-active\n"
-" concavePairs[pairIdx].w = -1;\n"
-" }\n"
-" }\n"
-" else\n"
-" { \n"
-" //mark this pair as in-active\n"
-" concavePairs[pairIdx].w = -1;\n"
-" }\n"
-" \n"
-" concavePairs[pairIdx].z = -1;//now z is used for existing/persistent contacts\n"
-"}\n"
-;
+static const char* satKernelsCL =
+ "//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 B3_MAX_STACK_DEPTH 256\n"
+ "typedef unsigned int u32;\n"
+ "///keep this in sync with btCollidable.h\n"
+ "typedef struct\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"
+ " \n"
+ " int m_shapeType;\n"
+ " int m_shapeIndex;\n"
+ " \n"
+ "} btCollidableGpu;\n"
+ "#define MAX_NUM_PARTS_IN_BITS 10\n"
+ "///b3QuantizedBvhNode 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"
+ "} b3QuantizedBvhNode;\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 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 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;i<numVerts;i++)\n"
+ " {\n"
+ " float dp = dot(vertices[hull->m_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;i<numVerts;i++)\n"
+ " {\n"
+ " float dp = dot(vertices[hull->m_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(Max0<Min1 || Max1<Min0)\n"
+ " return false;\n"
+ " float d0 = Max0 - Min1;\n"
+ " float d1 = Max1 - Min0;\n"
+ " *depth = d0<d1 ? d0:d1;\n"
+ " return true;\n"
+ "}\n"
+ "inline bool IsAlmostZero(const float4 v)\n"
+ "{\n"
+ " if(fabs(v.x)>1e-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;i<numFacesA;i++)\n"
+ " {\n"
+ " const float4 normal = facesA[hullA->m_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;i<numFacesA;i++)\n"
+ " {\n"
+ " const float4 normal = facesA[hullA->m_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;e0<hullA->m_numUniqueEdges;e0++)\n"
+ " {\n"
+ " const float4 edge0 = uniqueEdgesA[hullA->m_uniqueEdgesOffset+e0];\n"
+ " float4 edge0World = qtRotate(ornA,edge0);\n"
+ " for(int e1=0;e1<hullB->m_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(Max0<Min1 || Max1<Min0)\n"
+ " result = false;\n"
+ " \n"
+ " float d0 = Max0 - Min1;\n"
+ " float d1 = Max1 - Min0;\n"
+ " dist = d0<d1 ? d0:d1;\n"
+ " result = true;\n"
+ " }\n"
+ " \n"
+ " if(dist<*dmin)\n"
+ " {\n"
+ " *dmin = dist;\n"
+ " *sep = crossje;\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " \n"
+ " if((dot3F4(-DeltaC2,*sep))>0.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(Max0<Min1 || Max1<Min0)\n"
+ " return false;\n"
+ " float d0 = Max0 - Min1;\n"
+ " float d1 = Max1 - Min0;\n"
+ " *depth = d0<d1 ? d0:d1;\n"
+ " return true;\n"
+ "}\n"
+ "bool findSeparatingAxis( __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"
+ " \n"
+ " int curPlaneTests=0;\n"
+ " {\n"
+ " int numFacesA = hullA->m_numFaces;\n"
+ " // Test normals from hullA\n"
+ " for(int i=0;i<numFacesA;i++)\n"
+ " {\n"
+ " const float4 normal = faces[hullA->m_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;i<numUnitSphereDirections;i++)\n"
+ " {\n"
+ " float4 crossje;\n"
+ " crossje = unitSphereDirections[i]; \n"
+ " if (dot3F4(DeltaC2,crossje)>0)\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(Max0<Min1 || Max1<Min0)\n"
+ " return false;\n"
+ " \n"
+ " float d0 = Max0 - Min1;\n"
+ " float d1 = Max1 - Min0;\n"
+ " dist = d0<d1 ? d0:d1;\n"
+ " result = true;\n"
+ " \n"
+ " if(dist<*dmin)\n"
+ " {\n"
+ " *dmin = dist;\n"
+ " *sep = crossje;\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " \n"
+ " if((dot3F4(-DeltaC2,*sep))>0.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;e0<hullA->m_numUniqueEdges;e0++)\n"
+ " {\n"
+ " const float4 edge0 = uniqueEdges[hullA->m_uniqueEdgesOffset+e0];\n"
+ " float4 edge0World = qtRotate(ornA,edge0);\n"
+ " for(int e1=0;e1<hullB->m_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(Max0<Min1 || Max1<Min0)\n"
+ " return false;\n"
+ " \n"
+ " float d0 = Max0 - Min1;\n"
+ " float d1 = Max1 - Min0;\n"
+ " dist = d0<d1 ? d0:d1;\n"
+ " result = true;\n"
+ " }\n"
+ " \n"
+ " if(dist<*dmin)\n"
+ " {\n"
+ " *dmin = dist;\n"
+ " *sep = crossje;\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " \n"
+ " if((dot3F4(-DeltaC2,*sep))>0.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<numCompoundPairs)\n"
+ " {\n"
+ " int bodyIndexA = gpuCompoundPairs[i].x;\n"
+ " int bodyIndexB = gpuCompoundPairs[i].y;\n"
+ " int childShapeIndexA = gpuCompoundPairs[i].z;\n"
+ " int childShapeIndexB = gpuCompoundPairs[i].w;\n"
+ " \n"
+ " int collidableIndexA = -1;\n"
+ " int collidableIndexB = -1;\n"
+ " \n"
+ " float4 ornA = rigidBodies[bodyIndexA].m_quat;\n"
+ " float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
+ " \n"
+ " float4 ornB = rigidBodies[bodyIndexB].m_quat;\n"
+ " float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
+ " \n"
+ " if (childShapeIndexA >= 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 (i<numPairs)\n"
+ " {\n"
+ " int bodyIndexA = pairs[i].x;\n"
+ " int bodyIndexB = pairs[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"
+ " //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"
+ " if ((collidables[collidableIndexA].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS) &&(collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS))\n"
+ " {\n"
+ " int bvhA = collidables[collidableIndexA].m_compoundBvhIndex;\n"
+ " int bvhB = collidables[collidableIndexB].m_compoundBvhIndex;\n"
+ " int numSubTreesA = bvhInfos[bvhA].m_numSubTrees;\n"
+ " int subTreesOffsetA = bvhInfos[bvhA].m_subTreeOffset;\n"
+ " int subTreesOffsetB = bvhInfos[bvhB].m_subTreeOffset;\n"
+ " int numSubTreesB = bvhInfos[bvhB].m_numSubTrees;\n"
+ " \n"
+ " float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
+ " b3Quat ornA = rigidBodies[bodyIndexA].m_quat;\n"
+ " b3Quat ornB = rigidBodies[bodyIndexB].m_quat;\n"
+ " float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
+ " \n"
+ " for (int p=0;p<numSubTreesA;p++)\n"
+ " {\n"
+ " b3BvhSubtreeInfo subtreeA = subtrees[subTreesOffsetA+p];\n"
+ " //bvhInfos[bvhA].m_quantization\n"
+ " b3Float4 treeAminLocal = MyUnQuantize(subtreeA.m_quantizedAabbMin,bvhInfos[bvhA].m_quantization,bvhInfos[bvhA].m_aabbMin);\n"
+ " b3Float4 treeAmaxLocal = MyUnQuantize(subtreeA.m_quantizedAabbMax,bvhInfos[bvhA].m_quantization,bvhInfos[bvhA].m_aabbMin);\n"
+ " b3Float4 aabbAMinOut,aabbAMaxOut;\n"
+ " float margin=0.f;\n"
+ " b3TransformAabb2(treeAminLocal,treeAmaxLocal, margin,posA,ornA,&aabbAMinOut,&aabbAMaxOut);\n"
+ " \n"
+ " for (int q=0;q<numSubTreesB;q++)\n"
+ " {\n"
+ " b3BvhSubtreeInfo subtreeB = subtrees[subTreesOffsetB+q];\n"
+ " b3Float4 treeBminLocal = MyUnQuantize(subtreeB.m_quantizedAabbMin,bvhInfos[bvhB].m_quantization,bvhInfos[bvhB].m_aabbMin);\n"
+ " b3Float4 treeBmaxLocal = MyUnQuantize(subtreeB.m_quantizedAabbMax,bvhInfos[bvhB].m_quantization,bvhInfos[bvhB].m_aabbMin);\n"
+ " b3Float4 aabbBMinOut,aabbBMaxOut;\n"
+ " float margin=0.f;\n"
+ " b3TransformAabb2(treeBminLocal,treeBmaxLocal, margin,posB,ornB,&aabbBMinOut,&aabbBMaxOut);\n"
+ " \n"
+ " \n"
+ " bool aabbOverlap = b3TestAabbAgainstAabb(aabbAMinOut,aabbAMaxOut,aabbBMinOut,aabbBMaxOut);\n"
+ " if (aabbOverlap)\n"
+ " {\n"
+ " \n"
+ " int startNodeIndexA = subtreeA.m_rootNodeIndex+bvhInfos[bvhA].m_nodeOffset;\n"
+ " int endNodeIndexA = startNodeIndexA+subtreeA.m_subtreeSize;\n"
+ " int startNodeIndexB = subtreeB.m_rootNodeIndex+bvhInfos[bvhB].m_nodeOffset;\n"
+ " int endNodeIndexB = startNodeIndexB+subtreeB.m_subtreeSize;\n"
+ " b3Int2 nodeStack[B3_MAX_STACK_DEPTH];\n"
+ " b3Int2 node0;\n"
+ " node0.x = startNodeIndexA;\n"
+ " node0.y = startNodeIndexB;\n"
+ " int maxStackDepth = B3_MAX_STACK_DEPTH;\n"
+ " int depth=0;\n"
+ " nodeStack[depth++]=node0;\n"
+ " do\n"
+ " {\n"
+ " b3Int2 node = nodeStack[--depth];\n"
+ " b3Float4 aMinLocal = MyUnQuantizeGlobal(quantizedNodes[node.x].m_quantizedAabbMin,bvhInfos[bvhA].m_quantization,bvhInfos[bvhA].m_aabbMin);\n"
+ " b3Float4 aMaxLocal = MyUnQuantizeGlobal(quantizedNodes[node.x].m_quantizedAabbMax,bvhInfos[bvhA].m_quantization,bvhInfos[bvhA].m_aabbMin);\n"
+ " b3Float4 bMinLocal = MyUnQuantizeGlobal(quantizedNodes[node.y].m_quantizedAabbMin,bvhInfos[bvhB].m_quantization,bvhInfos[bvhB].m_aabbMin);\n"
+ " b3Float4 bMaxLocal = MyUnQuantizeGlobal(quantizedNodes[node.y].m_quantizedAabbMax,bvhInfos[bvhB].m_quantization,bvhInfos[bvhB].m_aabbMin);\n"
+ " float margin=0.f;\n"
+ " b3Float4 aabbAMinOut,aabbAMaxOut;\n"
+ " b3TransformAabb2(aMinLocal,aMaxLocal, margin,posA,ornA,&aabbAMinOut,&aabbAMaxOut);\n"
+ " b3Float4 aabbBMinOut,aabbBMaxOut;\n"
+ " b3TransformAabb2(bMinLocal,bMaxLocal, margin,posB,ornB,&aabbBMinOut,&aabbBMaxOut);\n"
+ " \n"
+ " bool nodeOverlap = b3TestAabbAgainstAabb(aabbAMinOut,aabbAMaxOut,aabbBMinOut,aabbBMaxOut);\n"
+ " if (nodeOverlap)\n"
+ " {\n"
+ " bool isLeafA = isLeafNodeGlobal(&quantizedNodes[node.x]);\n"
+ " bool isLeafB = isLeafNodeGlobal(&quantizedNodes[node.y]);\n"
+ " bool isInternalA = !isLeafA;\n"
+ " bool isInternalB = !isLeafB;\n"
+ " //fail, even though it might hit two leaf nodes\n"
+ " if (depth+4>maxStackDepth && !(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 (compoundPairIdx<maxNumCompoundPairsCapacity)\n"
+ " {\n"
+ " int childShapeIndexA = getTriangleIndexGlobal(&quantizedNodes[node.x]);\n"
+ " int childShapeIndexB = getTriangleIndexGlobal(&quantizedNodes[node.y]);\n"
+ " gpuCompoundPairsOut[compoundPairIdx] = (int4)(bodyIndexA,bodyIndexB,childShapeIndexA,childShapeIndexB);\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " } while (depth);\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " \n"
+ " return;\n"
+ " }\n"
+ " if ((collidables[collidableIndexA].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS) ||(collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS))\n"
+ " {\n"
+ " if (collidables[collidableIndexA].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS) \n"
+ " {\n"
+ " int numChildrenA = collidables[collidableIndexA].m_numChildShapes;\n"
+ " for (int c=0;c<numChildrenA;c++)\n"
+ " {\n"
+ " int childShapeIndexA = collidables[collidableIndexA].m_shapeIndex+c;\n"
+ " int childColIndexA = gpuChildShapes[childShapeIndexA].m_shapeIndex;\n"
+ " float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
+ " float4 ornA = rigidBodies[bodyIndexA].m_quat;\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"
+ " int shapeIndexA = collidables[childColIndexA].m_shapeIndex;\n"
+ " b3Aabb_t aabbAlocal = aabbLocalSpace[shapeIndexA];\n"
+ " float margin = 0.f;\n"
+ " \n"
+ " b3Float4 aabbAMinWS;\n"
+ " b3Float4 aabbAMaxWS;\n"
+ " \n"
+ " b3TransformAabb2(aabbAlocal.m_minVec,aabbAlocal.m_maxVec,margin,\n"
+ " newPosA,\n"
+ " newOrnA,\n"
+ " &aabbAMinWS,&aabbAMaxWS);\n"
+ " \n"
+ " \n"
+ " if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)\n"
+ " {\n"
+ " int numChildrenB = collidables[collidableIndexB].m_numChildShapes;\n"
+ " for (int b=0;b<numChildrenB;b++)\n"
+ " {\n"
+ " int childShapeIndexB = collidables[collidableIndexB].m_shapeIndex+b;\n"
+ " int childColIndexB = gpuChildShapes[childShapeIndexB].m_shapeIndex;\n"
+ " float4 ornB = rigidBodies[bodyIndexB].m_quat;\n"
+ " float4 posB = rigidBodies[bodyIndexB].m_pos;\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"
+ " int shapeIndexB = collidables[childColIndexB].m_shapeIndex;\n"
+ " b3Aabb_t aabbBlocal = aabbLocalSpace[shapeIndexB];\n"
+ " \n"
+ " b3Float4 aabbBMinWS;\n"
+ " b3Float4 aabbBMaxWS;\n"
+ " \n"
+ " b3TransformAabb2(aabbBlocal.m_minVec,aabbBlocal.m_maxVec,margin,\n"
+ " newPosB,\n"
+ " newOrnB,\n"
+ " &aabbBMinWS,&aabbBMaxWS);\n"
+ " \n"
+ " \n"
+ " \n"
+ " bool aabbOverlap = b3TestAabbAgainstAabb(aabbAMinWS,aabbAMaxWS,aabbBMinWS,aabbBMaxWS);\n"
+ " if (aabbOverlap)\n"
+ " {\n"
+ " int numFacesA = convexShapes[shapeIndexA].m_numFaces;\n"
+ " float dmin = FLT_MAX;\n"
+ " float4 posA = newPosA;\n"
+ " posA.w = 0.f;\n"
+ " float4 posB = newPosB;\n"
+ " posB.w = 0.f;\n"
+ " float4 c0local = convexShapes[shapeIndexA].m_localCenter;\n"
+ " float4 ornA = newOrnA;\n"
+ " float4 c0 = transform(&c0local, &posA, &ornA);\n"
+ " float4 c1local = convexShapes[shapeIndexB].m_localCenter;\n"
+ " float4 ornB =newOrnB;\n"
+ " float4 c1 = transform(&c1local,&posB,&ornB);\n"
+ " const float4 DeltaC2 = c0 - c1;\n"
+ " {//\n"
+ " int compoundPairIdx = atomic_inc(numCompoundPairsOut);\n"
+ " if (compoundPairIdx<maxNumCompoundPairsCapacity)\n"
+ " {\n"
+ " gpuCompoundPairsOut[compoundPairIdx] = (int4)(bodyIndexA,bodyIndexB,childShapeIndexA,childShapeIndexB);\n"
+ " }\n"
+ " }//\n"
+ " }//fi(1)\n"
+ " } //for (int b=0\n"
+ " }//if (collidables[collidableIndexB].\n"
+ " else//if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)\n"
+ " {\n"
+ " if (1)\n"
+ " {\n"
+ " int numFacesA = convexShapes[shapeIndexA].m_numFaces;\n"
+ " float dmin = FLT_MAX;\n"
+ " float4 posA = newPosA;\n"
+ " posA.w = 0.f;\n"
+ " float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
+ " posB.w = 0.f;\n"
+ " float4 c0local = convexShapes[shapeIndexA].m_localCenter;\n"
+ " float4 ornA = newOrnA;\n"
+ " float4 c0 = transform(&c0local, &posA, &ornA);\n"
+ " float4 c1local = convexShapes[shapeIndexB].m_localCenter;\n"
+ " float4 ornB = rigidBodies[bodyIndexB].m_quat;\n"
+ " float4 c1 = transform(&c1local,&posB,&ornB);\n"
+ " const float4 DeltaC2 = c0 - c1;\n"
+ " {\n"
+ " int compoundPairIdx = atomic_inc(numCompoundPairsOut);\n"
+ " if (compoundPairIdx<maxNumCompoundPairsCapacity)\n"
+ " {\n"
+ " gpuCompoundPairsOut[compoundPairIdx] = (int4)(bodyIndexA,bodyIndexB,childShapeIndexA,-1);\n"
+ " }//if (compoundPairIdx<maxNumCompoundPairsCapacity)\n"
+ " }//\n"
+ " }//fi (1)\n"
+ " }//if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)\n"
+ " }//for (int b=0;b<numChildrenB;b++) \n"
+ " return;\n"
+ " }//if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)\n"
+ " if ((collidables[collidableIndexA].m_shapeType!=SHAPE_CONCAVE_TRIMESH) \n"
+ " && (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS))\n"
+ " {\n"
+ " int numChildrenB = collidables[collidableIndexB].m_numChildShapes;\n"
+ " for (int b=0;b<numChildrenB;b++)\n"
+ " {\n"
+ " int childShapeIndexB = collidables[collidableIndexB].m_shapeIndex+b;\n"
+ " int childColIndexB = gpuChildShapes[childShapeIndexB].m_shapeIndex;\n"
+ " float4 ornB = rigidBodies[bodyIndexB].m_quat;\n"
+ " float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
+ " float4 childPosB = gpuChildShapes[childShapeIndexB].m_childPosition;\n"
+ " float4 childOrnB = gpuChildShapes[childShapeIndexB].m_childOrientation;\n"
+ " float4 newPosB = qtRotate(ornB,childPosB)+posB;\n"
+ " float4 newOrnB = qtMul(ornB,childOrnB);\n"
+ " int shapeIndexB = collidables[childColIndexB].m_shapeIndex;\n"
+ " //////////////////////////////////////\n"
+ " if (1)\n"
+ " {\n"
+ " int numFacesA = convexShapes[shapeIndexA].m_numFaces;\n"
+ " float dmin = FLT_MAX;\n"
+ " float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
+ " posA.w = 0.f;\n"
+ " float4 posB = newPosB;\n"
+ " posB.w = 0.f;\n"
+ " float4 c0local = convexShapes[shapeIndexA].m_localCenter;\n"
+ " float4 ornA = rigidBodies[bodyIndexA].m_quat;\n"
+ " float4 c0 = transform(&c0local, &posA, &ornA);\n"
+ " float4 c1local = convexShapes[shapeIndexB].m_localCenter;\n"
+ " float4 ornB =newOrnB;\n"
+ " float4 c1 = transform(&c1local,&posB,&ornB);\n"
+ " const float4 DeltaC2 = c0 - c1;\n"
+ " {//\n"
+ " int compoundPairIdx = atomic_inc(numCompoundPairsOut);\n"
+ " if (compoundPairIdx<maxNumCompoundPairsCapacity)\n"
+ " {\n"
+ " gpuCompoundPairsOut[compoundPairIdx] = (int4)(bodyIndexA,bodyIndexB,-1,childShapeIndexB);\n"
+ " }//fi (compoundPairIdx<maxNumCompoundPairsCapacity)\n"
+ " }//\n"
+ " }//fi (1) \n"
+ " }//for (int b=0;b<numChildrenB;b++)\n"
+ " return;\n"
+ " }//if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)\n"
+ " return;\n"
+ " }//fi ((collidables[collidableIndexA].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS) ||(collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS))\n"
+ " }//i<numPairs\n"
+ "}\n"
+ "// work-in-progress\n"
+ "__kernel void findSeparatingAxisKernel( __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 btAabbCL* aabbs,\n"
+ " __global volatile float4* separatingNormals,\n"
+ " __global volatile int* hasSeparatingAxis,\n"
+ " int numPairs\n"
+ " )\n"
+ "{\n"
+ " int i = get_global_id(0);\n"
+ " \n"
+ " if (i<numPairs)\n"
+ " {\n"
+ " \n"
+ " int bodyIndexA = pairs[i].x;\n"
+ " int bodyIndexB = pairs[i].y;\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"
+ " //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"
+ " hasSeparatingAxis[i] = 0;\n"
+ " return;\n"
+ " }\n"
+ " \n"
+ " if ((collidables[collidableIndexA].m_shapeType!=SHAPE_CONVEX_HULL) ||(collidables[collidableIndexB].m_shapeType!=SHAPE_CONVEX_HULL))\n"
+ " {\n"
+ " hasSeparatingAxis[i] = 0;\n"
+ " return;\n"
+ " }\n"
+ " \n"
+ " if ((collidables[collidableIndexA].m_shapeType==SHAPE_CONCAVE_TRIMESH))\n"
+ " {\n"
+ " hasSeparatingAxis[i] = 0;\n"
+ " return;\n"
+ " }\n"
+ " int numFacesA = convexShapes[shapeIndexA].m_numFaces;\n"
+ " float dmin = FLT_MAX;\n"
+ " float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
+ " posA.w = 0.f;\n"
+ " float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
+ " posB.w = 0.f;\n"
+ " float4 c0local = convexShapes[shapeIndexA].m_localCenter;\n"
+ " float4 ornA = rigidBodies[bodyIndexA].m_quat;\n"
+ " float4 c0 = transform(&c0local, &posA, &ornA);\n"
+ " float4 c1local = convexShapes[shapeIndexB].m_localCenter;\n"
+ " float4 ornB =rigidBodies[bodyIndexB].m_quat;\n"
+ " float4 c1 = transform(&c1local,&posB,&ornB);\n"
+ " const float4 DeltaC2 = c0 - c1;\n"
+ " float4 sepNormal;\n"
+ " \n"
+ " bool sepA = findSeparatingAxis( &convexShapes[shapeIndexA], &convexShapes[shapeIndexB],posA,ornA,\n"
+ " posB,ornB,\n"
+ " DeltaC2,\n"
+ " vertices,uniqueEdges,faces,\n"
+ " indices,&sepNormal,&dmin);\n"
+ " hasSeparatingAxis[i] = 4;\n"
+ " if (!sepA)\n"
+ " {\n"
+ " hasSeparatingAxis[i] = 0;\n"
+ " } else\n"
+ " {\n"
+ " bool sepB = findSeparatingAxis( &convexShapes[shapeIndexB],&convexShapes[shapeIndexA],posB,ornB,\n"
+ " posA,ornA,\n"
+ " DeltaC2,\n"
+ " vertices,uniqueEdges,faces,\n"
+ " indices,&sepNormal,&dmin);\n"
+ " if (!sepB)\n"
+ " {\n"
+ " hasSeparatingAxis[i] = 0;\n"
+ " } else\n"
+ " {\n"
+ " bool sepEE = findSeparatingAxisEdgeEdge( &convexShapes[shapeIndexA], &convexShapes[shapeIndexB],posA,ornA,\n"
+ " posB,ornB,\n"
+ " DeltaC2,\n"
+ " vertices,uniqueEdges,faces,\n"
+ " indices,&sepNormal,&dmin);\n"
+ " if (!sepEE)\n"
+ " {\n"
+ " hasSeparatingAxis[i] = 0;\n"
+ " } else\n"
+ " {\n"
+ " hasSeparatingAxis[i] = 1;\n"
+ " separatingNormals[i] = sepNormal;\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " \n"
+ " }\n"
+ "}\n"
+ "__kernel void findSeparatingAxisVertexFaceKernel( __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 btAabbCL* aabbs,\n"
+ " __global volatile float4* separatingNormals,\n"
+ " __global volatile int* hasSeparatingAxis,\n"
+ " __global float* dmins,\n"
+ " int numPairs\n"
+ " )\n"
+ "{\n"
+ " int i = get_global_id(0);\n"
+ " \n"
+ " if (i<numPairs)\n"
+ " {\n"
+ " \n"
+ " int bodyIndexA = pairs[i].x;\n"
+ " int bodyIndexB = pairs[i].y;\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"
+ " hasSeparatingAxis[i] = 0; \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_CONVEX_HULL) ||(collidables[collidableIndexB].m_shapeType!=SHAPE_CONVEX_HULL))\n"
+ " {\n"
+ " return;\n"
+ " }\n"
+ " \n"
+ " int numFacesA = convexShapes[shapeIndexA].m_numFaces;\n"
+ " float dmin = FLT_MAX;\n"
+ " dmins[i] = dmin;\n"
+ " \n"
+ " float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
+ " posA.w = 0.f;\n"
+ " float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
+ " posB.w = 0.f;\n"
+ " float4 c0local = convexShapes[shapeIndexA].m_localCenter;\n"
+ " float4 ornA = rigidBodies[bodyIndexA].m_quat;\n"
+ " float4 c0 = transform(&c0local, &posA, &ornA);\n"
+ " float4 c1local = convexShapes[shapeIndexB].m_localCenter;\n"
+ " float4 ornB =rigidBodies[bodyIndexB].m_quat;\n"
+ " float4 c1 = transform(&c1local,&posB,&ornB);\n"
+ " const float4 DeltaC2 = c0 - c1;\n"
+ " float4 sepNormal;\n"
+ " \n"
+ " bool sepA = findSeparatingAxis( &convexShapes[shapeIndexA], &convexShapes[shapeIndexB],posA,ornA,\n"
+ " posB,ornB,\n"
+ " DeltaC2,\n"
+ " vertices,uniqueEdges,faces,\n"
+ " indices,&sepNormal,&dmin);\n"
+ " hasSeparatingAxis[i] = 4;\n"
+ " if (!sepA)\n"
+ " {\n"
+ " hasSeparatingAxis[i] = 0;\n"
+ " } else\n"
+ " {\n"
+ " bool sepB = findSeparatingAxis( &convexShapes[shapeIndexB],&convexShapes[shapeIndexA],posB,ornB,\n"
+ " posA,ornA,\n"
+ " DeltaC2,\n"
+ " vertices,uniqueEdges,faces,\n"
+ " indices,&sepNormal,&dmin);\n"
+ " if (sepB)\n"
+ " {\n"
+ " dmins[i] = dmin;\n"
+ " hasSeparatingAxis[i] = 1;\n"
+ " separatingNormals[i] = sepNormal;\n"
+ " }\n"
+ " }\n"
+ " \n"
+ " }\n"
+ "}\n"
+ "__kernel void findSeparatingAxisEdgeEdgeKernel( __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 btAabbCL* aabbs,\n"
+ " __global float4* separatingNormals,\n"
+ " __global int* hasSeparatingAxis,\n"
+ " __global float* dmins,\n"
+ " __global const float4* unitSphereDirections,\n"
+ " int numUnitSphereDirections,\n"
+ " int numPairs\n"
+ " )\n"
+ "{\n"
+ " int i = get_global_id(0);\n"
+ " \n"
+ " if (i<numPairs)\n"
+ " {\n"
+ " if (hasSeparatingAxis[i])\n"
+ " {\n"
+ " \n"
+ " int bodyIndexA = pairs[i].x;\n"
+ " int bodyIndexB = pairs[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"
+ " \n"
+ " float dmin = dmins[i];\n"
+ " \n"
+ " float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
+ " posA.w = 0.f;\n"
+ " float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
+ " posB.w = 0.f;\n"
+ " float4 c0local = convexShapes[shapeIndexA].m_localCenter;\n"
+ " float4 ornA = rigidBodies[bodyIndexA].m_quat;\n"
+ " float4 c0 = transform(&c0local, &posA, &ornA);\n"
+ " float4 c1local = convexShapes[shapeIndexB].m_localCenter;\n"
+ " float4 ornB =rigidBodies[bodyIndexB].m_quat;\n"
+ " float4 c1 = transform(&c1local,&posB,&ornB);\n"
+ " const float4 DeltaC2 = c0 - c1;\n"
+ " float4 sepNormal = separatingNormals[i];\n"
+ " \n"
+ " \n"
+ " \n"
+ " bool sepEE = false;\n"
+ " int numEdgeEdgeDirections = convexShapes[shapeIndexA].m_numUniqueEdges*convexShapes[shapeIndexB].m_numUniqueEdges;\n"
+ " if (numEdgeEdgeDirections<=numUnitSphereDirections)\n"
+ " {\n"
+ " sepEE = findSeparatingAxisEdgeEdge( &convexShapes[shapeIndexA], &convexShapes[shapeIndexB],posA,ornA,\n"
+ " posB,ornB,\n"
+ " DeltaC2,\n"
+ " vertices,uniqueEdges,faces,\n"
+ " indices,&sepNormal,&dmin);\n"
+ " \n"
+ " if (!sepEE)\n"
+ " {\n"
+ " hasSeparatingAxis[i] = 0;\n"
+ " } else\n"
+ " {\n"
+ " hasSeparatingAxis[i] = 1;\n"
+ " separatingNormals[i] = sepNormal;\n"
+ " }\n"
+ " }\n"
+ " /*\n"
+ " ///else case is a separate kernel, to make Mac OSX OpenCL compiler happy\n"
+ " else\n"
+ " {\n"
+ " sepEE = findSeparatingAxisUnitSphere(&convexShapes[shapeIndexA], &convexShapes[shapeIndexB],posA,ornA,\n"
+ " posB,ornB,\n"
+ " DeltaC2,\n"
+ " vertices,unitSphereDirections,numUnitSphereDirections,\n"
+ " &sepNormal,&dmin);\n"
+ " if (!sepEE)\n"
+ " {\n"
+ " hasSeparatingAxis[i] = 0;\n"
+ " } else\n"
+ " {\n"
+ " hasSeparatingAxis[i] = 1;\n"
+ " separatingNormals[i] = sepNormal;\n"
+ " }\n"
+ " }\n"
+ " */\n"
+ " } //if (hasSeparatingAxis[i])\n"
+ " }//(i<numPairs)\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;face<hullB->m_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;e0<numVertices;e0++)\n"
+ " {\n"
+ " if (e0<capacityWorldVerts)\n"
+ " {\n"
+ " const float4 b = verticesB[hullB->m_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;face<hullA->m_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;e0<numVerticesA;e0++)\n"
+ " {\n"
+ " if (e0<capacityWorldVerts)\n"
+ " {\n"
+ " const float4 a = verticesA[hullA->m_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<numVertices;i++)\n"
+ " {\n"
+ " float4 v0 = verticesA[i];\n"
+ " float4 v1 = verticesA[prevVertex];\n"
+ " \n"
+ " float4 edgeNormal = normalize(cross(normal,v1-v0));\n"
+ " float c = -dot(edgeNormal,v0);\n"
+ " facesA[fidx].m_numIndices = 2;\n"
+ " facesA[fidx].m_indexOffset=curUsedIndices;\n"
+ " indicesA[curUsedIndices++]=i;\n"
+ " indicesA[curUsedIndices++]=prevVertex;\n"
+ " \n"
+ " facesA[fidx].m_plane.x = edgeNormal.x;\n"
+ " facesA[fidx].m_plane.y = edgeNormal.y;\n"
+ " facesA[fidx].m_plane.z = edgeNormal.z;\n"
+ " facesA[fidx].m_plane.w = c;\n"
+ " fidx++;\n"
+ " prevVertex = i;\n"
+ " }\n"
+ " }\n"
+ " convexPolyhedronA.m_numFaces = TRIANGLE_NUM_CONVEX_FACES;\n"
+ " convexPolyhedronA.m_localCenter = localCenter*(1.f/3.f);\n"
+ " float4 posA = rigidBodies[bodyIndexA].m_pos;\n"
+ " posA.w = 0.f;\n"
+ " float4 posB = rigidBodies[bodyIndexB].m_pos;\n"
+ " posB.w = 0.f;\n"
+ " float4 ornA = rigidBodies[bodyIndexA].m_quat;\n"
+ " float4 ornB =rigidBodies[bodyIndexB].m_quat;\n"
+ " \n"
+ " ///////////////////\n"
+ " ///compound shape support\n"
+ " if (collidables[collidableIndexB].m_shapeType==SHAPE_COMPOUND_OF_CONVEX_HULLS)\n"
+ " {\n"
+ " int compoundChild = concavePairs[pairIdx].w;\n"
+ " int childShapeIndexB = compoundChild;//collidables[collidableIndexB].m_shapeIndex+compoundChild;\n"
+ " int childColIndexB = 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"
+ " shapeIndexB = collidables[childColIndexB].m_shapeIndex;\n"
+ " }\n"
+ " //////////////////\n"
+ " float4 c0local = convexPolyhedronA.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"
+ " bool sepA = findSeparatingAxisLocalA( &convexPolyhedronA, &convexShapes[shapeIndexB],\n"
+ " posA,ornA,\n"
+ " posB,ornB,\n"
+ " DeltaC2,\n"
+ " verticesA,uniqueEdgesA,facesA,indicesA,\n"
+ " vertices,uniqueEdges,faces,indices,\n"
+ " &sepAxis,&dmin);\n"
+ " hasSeparatingAxis = 4;\n"
+ " if (!sepA)\n"
+ " {\n"
+ " hasSeparatingAxis = 0;\n"
+ " } else\n"
+ " {\n"
+ " bool sepB = findSeparatingAxisLocalB( &convexShapes[shapeIndexB],&convexPolyhedronA,\n"
+ " posB,ornB,\n"
+ " posA,ornA,\n"
+ " DeltaC2,\n"
+ " vertices,uniqueEdges,faces,indices,\n"
+ " verticesA,uniqueEdgesA,facesA,indicesA,\n"
+ " &sepAxis,&dmin);\n"
+ " if (!sepB)\n"
+ " {\n"
+ " hasSeparatingAxis = 0;\n"
+ " } else\n"
+ " {\n"
+ " bool sepEE = findSeparatingAxisEdgeEdgeLocalA( &convexPolyhedronA, &convexShapes[shapeIndexB],\n"
+ " posA,ornA,\n"
+ " posB,ornB,\n"
+ " DeltaC2,\n"
+ " verticesA,uniqueEdgesA,facesA,indicesA,\n"
+ " vertices,uniqueEdges,faces,indices,\n"
+ " &sepAxis,&dmin);\n"
+ " \n"
+ " if (!sepEE)\n"
+ " {\n"
+ " hasSeparatingAxis = 0;\n"
+ " } else\n"
+ " {\n"
+ " hasSeparatingAxis = 1;\n"
+ " }\n"
+ " }\n"
+ " } \n"
+ " \n"
+ " if (hasSeparatingAxis)\n"
+ " {\n"
+ " sepAxis.w = dmin;\n"
+ " concaveSeparatingNormalsOut[pairIdx]=sepAxis;\n"
+ " concaveHasSeparatingNormals[i]=1;\n"
+ " float minDist = -1e30f;\n"
+ " float maxDist = 0.02f;\n"
+ " \n"
+ " findClippingFaces(sepAxis,\n"
+ " &convexPolyhedronA,\n"
+ " &convexShapes[shapeIndexB],\n"
+ " posA,ornA,\n"
+ " posB,ornB,\n"
+ " worldVertsA1GPU,\n"
+ " worldNormalsAGPU,\n"
+ " worldVertsB1GPU,\n"
+ " vertexFaceCapacity,\n"
+ " minDist, maxDist,\n"
+ " verticesA,\n"
+ " facesA,\n"
+ " indicesA,\n"
+ " vertices,\n"
+ " faces,\n"
+ " indices,\n"
+ " clippingFacesOut, pairIdx);\n"
+ " } else\n"
+ " { \n"
+ " //mark this pair as in-active\n"
+ " concavePairs[pairIdx].w = -1;\n"
+ " }\n"
+ " }\n"
+ " else\n"
+ " { \n"
+ " //mark this pair as in-active\n"
+ " concavePairs[pairIdx].w = -1;\n"
+ " }\n"
+ " \n"
+ " concavePairs[pairIdx].z = -1;//now z is used for existing/persistent contacts\n"
+ "}\n";
diff --git a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3BoundSearchCL.cpp b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3BoundSearchCL.cpp
index a4980f71e1..c0e11bfb26 100644
--- a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3BoundSearchCL.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3BoundSearchCL.cpp
@@ -19,149 +19,139 @@ subject to the following restrictions:
#define KERNEL1 "SearchSortDataUpperKernel"
#define KERNEL2 "SubtractKernel"
-
#include "b3BoundSearchCL.h"
#include "Bullet3OpenCL/Initialize/b3OpenCLUtils.h"
#include "b3LauncherCL.h"
#include "kernels/BoundSearchKernelsCL.h"
b3BoundSearchCL::b3BoundSearchCL(cl_context ctx, cl_device_id device, cl_command_queue queue, int maxSize)
- :m_context(ctx),
- m_device(device),
- m_queue(queue)
+ : m_context(ctx),
+ m_device(device),
+ m_queue(queue)
{
-
const char* additionalMacros = "";
//const char* srcFileNameForCaching="";
cl_int pErrNum;
const char* kernelSource = boundSearchKernelsCL;
- cl_program boundSearchProg = b3OpenCLUtils::compileCLProgramFromString( ctx, device, kernelSource, &pErrNum,additionalMacros, BOUNDSEARCH_PATH);
+ cl_program boundSearchProg = b3OpenCLUtils::compileCLProgramFromString(ctx, device, kernelSource, &pErrNum, additionalMacros, BOUNDSEARCH_PATH);
b3Assert(boundSearchProg);
- m_lowerSortDataKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, kernelSource, "SearchSortDataLowerKernel", &pErrNum, boundSearchProg,additionalMacros );
- b3Assert(m_lowerSortDataKernel );
+ m_lowerSortDataKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, kernelSource, "SearchSortDataLowerKernel", &pErrNum, boundSearchProg, additionalMacros);
+ b3Assert(m_lowerSortDataKernel);
- m_upperSortDataKernel= b3OpenCLUtils::compileCLKernelFromString( ctx, device, kernelSource, "SearchSortDataUpperKernel", &pErrNum, boundSearchProg,additionalMacros );
+ m_upperSortDataKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, kernelSource, "SearchSortDataUpperKernel", &pErrNum, boundSearchProg, additionalMacros);
b3Assert(m_upperSortDataKernel);
m_subtractKernel = 0;
- if( maxSize )
+ if (maxSize)
{
- m_subtractKernel= b3OpenCLUtils::compileCLKernelFromString( ctx, device, kernelSource, "SubtractKernel", &pErrNum, boundSearchProg,additionalMacros );
+ m_subtractKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, kernelSource, "SubtractKernel", &pErrNum, boundSearchProg, additionalMacros);
b3Assert(m_subtractKernel);
}
//m_constBuffer = new b3OpenCLArray<b3Int4>( device, 1, BufferBase::BUFFER_CONST );
-
- m_lower = (maxSize == 0)? 0: new b3OpenCLArray<unsigned int>(ctx,queue,maxSize );
- m_upper = (maxSize == 0)? 0: new b3OpenCLArray<unsigned int>(ctx,queue, maxSize );
- m_filler = new b3FillCL(ctx,device,queue);
+ m_lower = (maxSize == 0) ? 0 : new b3OpenCLArray<unsigned int>(ctx, queue, maxSize);
+ m_upper = (maxSize == 0) ? 0 : new b3OpenCLArray<unsigned int>(ctx, queue, maxSize);
+
+ m_filler = new b3FillCL(ctx, device, queue);
}
b3BoundSearchCL::~b3BoundSearchCL()
{
-
delete m_lower;
delete m_upper;
delete m_filler;
-
+
clReleaseKernel(m_lowerSortDataKernel);
clReleaseKernel(m_upperSortDataKernel);
clReleaseKernel(m_subtractKernel);
-
-
}
-
-void b3BoundSearchCL::execute(b3OpenCLArray<b3SortData>& src, int nSrc, b3OpenCLArray<unsigned int>& dst, int nDst, Option option )
+void b3BoundSearchCL::execute(b3OpenCLArray<b3SortData>& src, int nSrc, b3OpenCLArray<unsigned int>& dst, int nDst, Option option)
{
b3Int4 constBuffer;
constBuffer.x = nSrc;
constBuffer.y = nDst;
- if( option == BOUND_LOWER )
+ if (option == BOUND_LOWER)
{
- b3BufferInfoCL bInfo[] = { b3BufferInfoCL( src.getBufferCL(), true ), b3BufferInfoCL( dst.getBufferCL()) };
-
- b3LauncherCL launcher( m_queue, m_lowerSortDataKernel,"m_lowerSortDataKernel" );
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( nSrc );
- launcher.setConst( nDst );
-
- launcher.launch1D( nSrc, 64 );
+ b3BufferInfoCL bInfo[] = {b3BufferInfoCL(src.getBufferCL(), true), b3BufferInfoCL(dst.getBufferCL())};
+
+ b3LauncherCL launcher(m_queue, m_lowerSortDataKernel, "m_lowerSortDataKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(nSrc);
+ launcher.setConst(nDst);
+
+ launcher.launch1D(nSrc, 64);
}
- else if( option == BOUND_UPPER )
+ else if (option == BOUND_UPPER)
{
- b3BufferInfoCL bInfo[] = { b3BufferInfoCL( src.getBufferCL(), true ), b3BufferInfoCL( dst.getBufferCL() ) };
+ b3BufferInfoCL bInfo[] = {b3BufferInfoCL(src.getBufferCL(), true), b3BufferInfoCL(dst.getBufferCL())};
- b3LauncherCL launcher(m_queue, m_upperSortDataKernel,"m_upperSortDataKernel" );
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( nSrc );
- launcher.setConst( nDst );
+ b3LauncherCL launcher(m_queue, m_upperSortDataKernel, "m_upperSortDataKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(nSrc);
+ launcher.setConst(nDst);
- launcher.launch1D( nSrc, 64 );
+ launcher.launch1D(nSrc, 64);
}
- else if( option == COUNT )
+ else if (option == COUNT)
{
- b3Assert( m_lower );
- b3Assert( m_upper );
- b3Assert( m_lower->capacity() <= (int)nDst );
- b3Assert( m_upper->capacity() <= (int)nDst );
+ b3Assert(m_lower);
+ b3Assert(m_upper);
+ b3Assert(m_lower->capacity() <= (int)nDst);
+ b3Assert(m_upper->capacity() <= (int)nDst);
int zero = 0;
- m_filler->execute( *m_lower, zero, nDst );
- m_filler->execute( *m_upper, zero, nDst );
+ m_filler->execute(*m_lower, zero, nDst);
+ m_filler->execute(*m_upper, zero, nDst);
- execute( src, nSrc, *m_lower, nDst, BOUND_LOWER );
- execute( src, nSrc, *m_upper, nDst, BOUND_UPPER );
+ execute(src, nSrc, *m_lower, nDst, BOUND_LOWER);
+ execute(src, nSrc, *m_upper, nDst, BOUND_UPPER);
{
- b3BufferInfoCL bInfo[] = { b3BufferInfoCL( m_upper->getBufferCL(), true ), b3BufferInfoCL( m_lower->getBufferCL(), true ), b3BufferInfoCL( dst.getBufferCL() ) };
+ b3BufferInfoCL bInfo[] = {b3BufferInfoCL(m_upper->getBufferCL(), true), b3BufferInfoCL(m_lower->getBufferCL(), true), b3BufferInfoCL(dst.getBufferCL())};
- b3LauncherCL launcher( m_queue, m_subtractKernel ,"m_subtractKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( nSrc );
- launcher.setConst( nDst );
+ b3LauncherCL launcher(m_queue, m_subtractKernel, "m_subtractKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(nSrc);
+ launcher.setConst(nDst);
- launcher.launch1D( nDst, 64 );
+ launcher.launch1D(nDst, 64);
}
}
else
{
- b3Assert( 0 );
+ b3Assert(0);
}
-
}
-
-void b3BoundSearchCL::executeHost( b3AlignedObjectArray<b3SortData>& src, int nSrc,
- b3AlignedObjectArray<unsigned int>& dst, int nDst, Option option )
+void b3BoundSearchCL::executeHost(b3AlignedObjectArray<b3SortData>& src, int nSrc,
+ b3AlignedObjectArray<unsigned int>& dst, int nDst, Option option)
{
+ for (int i = 0; i < nSrc - 1; i++)
+ b3Assert(src[i].m_key <= src[i + 1].m_key);
-
- for(int i=0; i<nSrc-1; i++)
- b3Assert( src[i].m_key <= src[i+1].m_key );
-
- b3SortData minData,zeroData,maxData;
+ b3SortData minData, zeroData, maxData;
minData.m_key = -1;
minData.m_value = -1;
- zeroData.m_key=0;
- zeroData.m_value=0;
+ zeroData.m_key = 0;
+ zeroData.m_value = 0;
maxData.m_key = nDst;
maxData.m_value = nDst;
- if( option == BOUND_LOWER )
+ if (option == BOUND_LOWER)
{
- for(int i=0; i<nSrc; i++)
+ for (int i = 0; i < nSrc; i++)
{
- b3SortData& iData = (i==0)? minData: src[i-1];
- b3SortData& jData = (i==nSrc)? maxData: src[i];
+ b3SortData& iData = (i == 0) ? minData : src[i - 1];
+ b3SortData& jData = (i == nSrc) ? maxData : src[i];
- if( iData.m_key != jData.m_key )
+ if (iData.m_key != jData.m_key)
{
int k = jData.m_key;
{
@@ -170,14 +160,14 @@ void b3BoundSearchCL::executeHost( b3AlignedObjectArray<b3SortData>& src, int nS
}
}
}
- else if( option == BOUND_UPPER )
+ else if (option == BOUND_UPPER)
{
- for(int i=1; i<nSrc+1; i++)
+ for (int i = 1; i < nSrc + 1; i++)
{
- b3SortData& iData = src[i-1];
- b3SortData& jData = (i==nSrc)? maxData: src[i];
+ b3SortData& iData = src[i - 1];
+ b3SortData& jData = (i == nSrc) ? maxData : src[i];
- if( iData.m_key != jData.m_key )
+ if (iData.m_key != jData.m_key)
{
int k = iData.m_key;
{
@@ -186,28 +176,28 @@ void b3BoundSearchCL::executeHost( b3AlignedObjectArray<b3SortData>& src, int nS
}
}
}
- else if( option == COUNT )
+ else if (option == COUNT)
{
b3AlignedObjectArray<unsigned int> lower;
- lower.resize(nDst );
+ lower.resize(nDst);
b3AlignedObjectArray<unsigned int> upper;
- upper.resize(nDst );
+ upper.resize(nDst);
- for(int i=0; i<nDst; i++)
- {
- lower[i] = upper[i] = 0;
+ for (int i = 0; i < nDst; i++)
+ {
+ lower[i] = upper[i] = 0;
}
- executeHost( src, nSrc, lower, nDst, BOUND_LOWER );
- executeHost( src, nSrc, upper, nDst, BOUND_UPPER );
+ executeHost(src, nSrc, lower, nDst, BOUND_LOWER);
+ executeHost(src, nSrc, upper, nDst, BOUND_UPPER);
- for( int i=0; i<nDst; i++)
- {
- dst[i] = upper[i] - lower[i];
+ for (int i = 0; i < nDst; i++)
+ {
+ dst[i] = upper[i] - lower[i];
}
}
else
{
- b3Assert( 0 );
+ b3Assert(0);
}
}
diff --git a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3BoundSearchCL.h b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3BoundSearchCL.h
index 7e2940965c..0d633e3d23 100644
--- a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3BoundSearchCL.h
+++ b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3BoundSearchCL.h
@@ -26,42 +26,39 @@ subject to the following restrictions:
#include "b3OpenCLArray.h"
#include "b3FillCL.h"
-#include "b3RadixSort32CL.h" //for b3SortData (perhaps move it?)
+#include "b3RadixSort32CL.h" //for b3SortData (perhaps move it?)
class b3BoundSearchCL
{
- public:
+public:
+ enum Option
+ {
+ BOUND_LOWER,
+ BOUND_UPPER,
+ COUNT,
+ };
- enum Option
- {
- BOUND_LOWER,
- BOUND_UPPER,
- COUNT,
- };
+ cl_context m_context;
+ cl_device_id m_device;
+ cl_command_queue m_queue;
- 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;
-
- cl_kernel m_lowerSortDataKernel;
- cl_kernel m_upperSortDataKernel;
- cl_kernel m_subtractKernel;
-
- b3OpenCLArray<b3Int4>* m_constbtOpenCLArray;
- b3OpenCLArray<unsigned int>* m_lower;
- b3OpenCLArray<unsigned int>* m_upper;
-
- b3FillCL* m_filler;
-
- b3BoundSearchCL(cl_context context, cl_device_id device, cl_command_queue queue, int size);
+ b3OpenCLArray<b3Int4>* m_constbtOpenCLArray;
+ b3OpenCLArray<unsigned int>* m_lower;
+ b3OpenCLArray<unsigned int>* m_upper;
- virtual ~b3BoundSearchCL();
+ b3FillCL* m_filler;
- // src has to be src[i].m_key <= src[i+1].m_key
- void execute( b3OpenCLArray<b3SortData>& src, int nSrc, b3OpenCLArray<unsigned int>& dst, int nDst, Option option = BOUND_LOWER );
+ b3BoundSearchCL(cl_context context, cl_device_id device, cl_command_queue queue, int size);
- void executeHost( b3AlignedObjectArray<b3SortData>& src, int nSrc, b3AlignedObjectArray<unsigned int>& dst, int nDst, Option option = BOUND_LOWER);
-};
+ virtual ~b3BoundSearchCL();
+
+ // src has to be src[i].m_key <= src[i+1].m_key
+ void execute(b3OpenCLArray<b3SortData>& src, int nSrc, b3OpenCLArray<unsigned int>& dst, int nDst, Option option = BOUND_LOWER);
+ void executeHost(b3AlignedObjectArray<b3SortData>& src, int nSrc, b3AlignedObjectArray<unsigned int>& dst, int nDst, Option option = BOUND_LOWER);
+};
-#endif //B3_BOUNDSEARCH_H
+#endif //B3_BOUNDSEARCH_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3BufferInfoCL.h b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3BufferInfoCL.h
index 52f219ae3f..35fc467b20 100644
--- a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3BufferInfoCL.h
+++ b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3BufferInfoCL.h
@@ -4,16 +4,15 @@
#include "b3OpenCLArray.h"
-
struct b3BufferInfoCL
{
//b3BufferInfoCL(){}
-// template<typename T>
- b3BufferInfoCL(cl_mem buff, bool isReadOnly = false): m_clBuffer(buff), m_isReadOnly(isReadOnly){}
+ // template<typename T>
+ 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
+#endif //B3_BUFFER_INFO_CL_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3FillCL.cpp b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3FillCL.cpp
index f05c2648f1..bd25bb2101 100644
--- a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3FillCL.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3FillCL.cpp
@@ -8,29 +8,26 @@
#include "kernels/FillKernelsCL.h"
b3FillCL::b3FillCL(cl_context ctx, cl_device_id device, cl_command_queue queue)
-:m_commandQueue(queue)
+ : m_commandQueue(queue)
{
const char* kernelSource = fillKernelsCL;
cl_int pErrNum;
const char* additionalMacros = "";
- cl_program fillProg = b3OpenCLUtils::compileCLProgramFromString( ctx, device, kernelSource, &pErrNum,additionalMacros, FILL_CL_PROGRAM_PATH);
+ cl_program fillProg = b3OpenCLUtils::compileCLProgramFromString(ctx, device, kernelSource, &pErrNum, additionalMacros, FILL_CL_PROGRAM_PATH);
b3Assert(fillProg);
- m_fillIntKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, kernelSource, "FillIntKernel", &pErrNum, fillProg,additionalMacros );
+ m_fillIntKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, kernelSource, "FillIntKernel", &pErrNum, fillProg, additionalMacros);
b3Assert(m_fillIntKernel);
- m_fillUnsignedIntKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, kernelSource, "FillUnsignedIntKernel", &pErrNum, fillProg,additionalMacros );
+ m_fillUnsignedIntKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, kernelSource, "FillUnsignedIntKernel", &pErrNum, fillProg, additionalMacros);
b3Assert(m_fillIntKernel);
- m_fillFloatKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, kernelSource, "FillFloatKernel", &pErrNum, fillProg,additionalMacros );
+ m_fillFloatKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, kernelSource, "FillFloatKernel", &pErrNum, fillProg, additionalMacros);
b3Assert(m_fillFloatKernel);
-
-
- m_fillKernelInt2 = b3OpenCLUtils::compileCLKernelFromString( ctx, device, kernelSource, "FillInt2Kernel", &pErrNum, fillProg,additionalMacros );
+ m_fillKernelInt2 = b3OpenCLUtils::compileCLKernelFromString(ctx, device, kernelSource, "FillInt2Kernel", &pErrNum, fillProg, additionalMacros);
b3Assert(m_fillKernelInt2);
-
}
b3FillCL::~b3FillCL()
@@ -39,88 +36,84 @@ b3FillCL::~b3FillCL()
clReleaseKernel(m_fillIntKernel);
clReleaseKernel(m_fillUnsignedIntKernel);
clReleaseKernel(m_fillFloatKernel);
-
}
void b3FillCL::execute(b3OpenCLArray<float>& src, const float value, int n, int offset)
{
- b3Assert( n>0 );
+ b3Assert(n > 0);
{
- b3LauncherCL launcher( m_commandQueue, m_fillFloatKernel,"m_fillFloatKernel" );
- launcher.setBuffer( src.getBufferCL());
- launcher.setConst( n );
- launcher.setConst( value );
- launcher.setConst( offset);
+ b3LauncherCL launcher(m_commandQueue, m_fillFloatKernel, "m_fillFloatKernel");
+ launcher.setBuffer(src.getBufferCL());
+ launcher.setConst(n);
+ launcher.setConst(value);
+ launcher.setConst(offset);
- launcher.launch1D( n );
+ launcher.launch1D(n);
}
}
void b3FillCL::execute(b3OpenCLArray<int>& src, const int value, int n, int offset)
{
- b3Assert( n>0 );
-
+ b3Assert(n > 0);
{
- b3LauncherCL launcher( m_commandQueue, m_fillIntKernel ,"m_fillIntKernel");
+ b3LauncherCL launcher(m_commandQueue, m_fillIntKernel, "m_fillIntKernel");
launcher.setBuffer(src.getBufferCL());
- launcher.setConst( n);
- launcher.setConst( value);
- launcher.setConst( offset);
- launcher.launch1D( n );
+ launcher.setConst(n);
+ launcher.setConst(value);
+ launcher.setConst(offset);
+ launcher.launch1D(n);
}
}
-
void b3FillCL::execute(b3OpenCLArray<unsigned int>& src, const unsigned int value, int n, int offset)
{
- b3Assert( n>0 );
+ b3Assert(n > 0);
{
- b3BufferInfoCL bInfo[] = { b3BufferInfoCL( src.getBufferCL() ) };
+ b3BufferInfoCL bInfo[] = {b3BufferInfoCL(src.getBufferCL())};
- b3LauncherCL launcher( m_commandQueue, m_fillUnsignedIntKernel,"m_fillUnsignedIntKernel" );
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( n );
- launcher.setConst(value);
+ b3LauncherCL launcher(m_commandQueue, m_fillUnsignedIntKernel, "m_fillUnsignedIntKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(n);
+ launcher.setConst(value);
launcher.setConst(offset);
- launcher.launch1D( n );
+ launcher.launch1D(n);
}
}
-void b3FillCL::executeHost(b3AlignedObjectArray<b3Int2> &src, const b3Int2 &value, int n, int offset)
+void b3FillCL::executeHost(b3AlignedObjectArray<b3Int2>& src, const b3Int2& value, int n, int offset)
{
- for (int i=0;i<n;i++)
+ for (int i = 0; i < n; i++)
{
- src[i+offset]=value;
+ src[i + offset] = value;
}
}
-void b3FillCL::executeHost(b3AlignedObjectArray<int> &src, const int value, int n, int offset)
+void b3FillCL::executeHost(b3AlignedObjectArray<int>& src, const int value, int n, int offset)
{
- for (int i=0;i<n;i++)
+ for (int i = 0; i < n; i++)
{
- src[i+offset]=value;
+ src[i + offset] = value;
}
}
-void b3FillCL::execute(b3OpenCLArray<b3Int2> &src, const b3Int2 &value, int n, int offset)
+void b3FillCL::execute(b3OpenCLArray<b3Int2>& src, const b3Int2& value, int n, int offset)
{
- b3Assert( n>0 );
-
+ b3Assert(n > 0);
{
- b3BufferInfoCL bInfo[] = { b3BufferInfoCL( src.getBufferCL() ) };
+ b3BufferInfoCL bInfo[] = {b3BufferInfoCL(src.getBufferCL())};
- b3LauncherCL launcher(m_commandQueue, m_fillKernelInt2,"m_fillKernelInt2");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
+ b3LauncherCL launcher(m_commandQueue, m_fillKernelInt2, "m_fillKernelInt2");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
launcher.setConst(n);
launcher.setConst(value);
launcher.setConst(offset);
//( constBuffer );
- launcher.launch1D( n );
+ launcher.launch1D(n);
}
}
diff --git a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3FillCL.h b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3FillCL.h
index 1609676b9d..c92c3e5119 100644
--- a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3FillCL.h
+++ b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3FillCL.h
@@ -7,57 +7,46 @@
#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];
+ 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);
- b3FillCL(cl_context ctx, cl_device_id device, cl_command_queue queue);
+ virtual ~b3FillCL();
- virtual ~b3FillCL();
+ void execute(b3OpenCLArray<unsigned int>& src, const unsigned int value, int n, int offset = 0);
- void execute(b3OpenCLArray<unsigned int>& src, const unsigned int value, int n, int offset = 0);
-
- void execute(b3OpenCLArray<int>& src, const int value, int n, int offset = 0);
+ void execute(b3OpenCLArray<int>& src, const int value, int n, int offset = 0);
- void execute(b3OpenCLArray<float>& src, const float value, int n, int offset = 0);
+ void execute(b3OpenCLArray<float>& src, const float value, int n, int offset = 0);
- void execute(b3OpenCLArray<b3Int2>& src, const b3Int2& value, int n, int offset = 0);
+ void execute(b3OpenCLArray<b3Int2>& src, const b3Int2& value, int n, int offset = 0);
- void executeHost(b3AlignedObjectArray<b3Int2> &src, const b3Int2 &value, int n, int offset);
+ void executeHost(b3AlignedObjectArray<b3Int2>& src, const b3Int2& value, int n, int offset);
- void executeHost(b3AlignedObjectArray<int> &src, const int value, int n, int offset);
+ void executeHost(b3AlignedObjectArray<int>& src, const int value, int n, int offset);
// void execute(b3OpenCLArray<b3Int4>& src, const b3Int4& value, int n, int offset = 0);
-
};
-
-
-
-
-#endif //B3_FILL_CL_H
+#endif //B3_FILL_CL_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3LauncherCL.cpp b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3LauncherCL.cpp
index 94590d11ca..c97d02eb45 100644
--- a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3LauncherCL.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3LauncherCL.cpp
@@ -1,13 +1,13 @@
#include "b3LauncherCL.h"
bool gDebugLauncherCL = false;
-
+
b3LauncherCL::b3LauncherCL(cl_command_queue queue, cl_kernel kernel, const char* name)
-:m_commandQueue(queue),
-m_kernel(kernel),
-m_idx(0),
-m_enableSerialization(false),
-m_name(name)
+ : m_commandQueue(queue),
+ m_kernel(kernel),
+ m_idx(0),
+ m_enableSerialization(false),
+ m_name(name)
{
if (gDebugLauncherCL)
{
@@ -15,59 +15,58 @@ m_name(name)
printf("[%d] Prepare to launch OpenCL kernel %s\n", counter++, name);
}
- m_serializationSizeInBytes = sizeof(int);
+ m_serializationSizeInBytes = sizeof(int);
}
-
+
b3LauncherCL::~b3LauncherCL()
- {
- for (int i=0;i<m_arrays.size();i++)
- {
- delete (m_arrays[i]);
- }
-
- m_arrays.clear();
- if (gDebugLauncherCL)
- {
+{
+ for (int i = 0; i < m_arrays.size(); i++)
+ {
+ delete (m_arrays[i]);
+ }
+
+ m_arrays.clear();
+ if (gDebugLauncherCL)
+ {
static int counter = 0;
- printf("[%d] Finished launching OpenCL kernel %s\n", counter++,m_name);
- }
- }
+ printf("[%d] Finished launching OpenCL kernel %s\n", counter++, m_name);
+ }
+}
-void b3LauncherCL::setBuffer( cl_mem clBuffer)
+void b3LauncherCL::setBuffer(cl_mem clBuffer)
{
- if (m_enableSerialization)
- {
- b3KernelArgData kernelArg;
- kernelArg.m_argIndex = m_idx;
- kernelArg.m_isBuffer = 1;
- kernelArg.m_clBuffer = clBuffer;
-
- cl_mem_info param_name = CL_MEM_SIZE;
- size_t param_value;
- size_t sizeInBytes = sizeof(size_t);
- size_t actualSizeInBytes;
- cl_int err;
- err = clGetMemObjectInfo ( kernelArg.m_clBuffer,
- param_name,
- sizeInBytes,
- &param_value,
- &actualSizeInBytes);
-
- b3Assert( err == CL_SUCCESS );
- kernelArg.m_argSizeInBytes = param_value;
-
- m_kernelArguments.push_back(kernelArg);
- m_serializationSizeInBytes+= sizeof(b3KernelArgData);
- m_serializationSizeInBytes+=param_value;
- }
- cl_int status = clSetKernelArg( m_kernel, m_idx++, sizeof(cl_mem), &clBuffer);
- b3Assert( status == CL_SUCCESS );
-}
+ if (m_enableSerialization)
+ {
+ b3KernelArgData kernelArg;
+ kernelArg.m_argIndex = m_idx;
+ kernelArg.m_isBuffer = 1;
+ kernelArg.m_clBuffer = clBuffer;
+ cl_mem_info param_name = CL_MEM_SIZE;
+ size_t param_value;
+ size_t sizeInBytes = sizeof(size_t);
+ size_t actualSizeInBytes;
+ cl_int err;
+ err = clGetMemObjectInfo(kernelArg.m_clBuffer,
+ param_name,
+ sizeInBytes,
+ &param_value,
+ &actualSizeInBytes);
+
+ b3Assert(err == CL_SUCCESS);
+ kernelArg.m_argSizeInBytes = param_value;
+
+ m_kernelArguments.push_back(kernelArg);
+ m_serializationSizeInBytes += sizeof(b3KernelArgData);
+ m_serializationSizeInBytes += param_value;
+ }
+ cl_int status = clSetKernelArg(m_kernel, m_idx++, sizeof(cl_mem), &clBuffer);
+ b3Assert(status == CL_SUCCESS);
+}
-void b3LauncherCL::setBuffers( b3BufferInfoCL* buffInfo, int n )
+void b3LauncherCL::setBuffers(b3BufferInfoCL* buffInfo, int n)
{
- for(int i=0; i<n; i++)
+ for (int i = 0; i < n; i++)
{
if (m_enableSerialization)
{
@@ -75,106 +74,103 @@ void b3LauncherCL::setBuffers( b3BufferInfoCL* buffInfo, int n )
kernelArg.m_argIndex = m_idx;
kernelArg.m_isBuffer = 1;
kernelArg.m_clBuffer = buffInfo[i].m_clBuffer;
-
+
cl_mem_info param_name = CL_MEM_SIZE;
size_t param_value;
size_t sizeInBytes = sizeof(size_t);
size_t actualSizeInBytes;
cl_int err;
- err = clGetMemObjectInfo ( kernelArg.m_clBuffer,
- param_name,
- sizeInBytes,
- &param_value,
- &actualSizeInBytes);
-
- b3Assert( err == CL_SUCCESS );
+ err = clGetMemObjectInfo(kernelArg.m_clBuffer,
+ param_name,
+ sizeInBytes,
+ &param_value,
+ &actualSizeInBytes);
+
+ b3Assert(err == CL_SUCCESS);
kernelArg.m_argSizeInBytes = param_value;
-
+
m_kernelArguments.push_back(kernelArg);
- m_serializationSizeInBytes+= sizeof(b3KernelArgData);
- m_serializationSizeInBytes+=param_value;
- }
- cl_int status = clSetKernelArg( m_kernel, m_idx++, sizeof(cl_mem), &buffInfo[i].m_clBuffer);
- b3Assert( status == CL_SUCCESS );
- }
+ m_serializationSizeInBytes += sizeof(b3KernelArgData);
+ m_serializationSizeInBytes += param_value;
+ }
+ cl_int status = clSetKernelArg(m_kernel, m_idx++, sizeof(cl_mem), &buffInfo[i].m_clBuffer);
+ b3Assert(status == CL_SUCCESS);
+ }
}
struct b3KernelArgDataUnaligned
{
- int m_isBuffer;
- int m_argIndex;
- int m_argSizeInBytes;
+ 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];
- };
-
+ union {
+ cl_mem m_clBuffer;
+ unsigned char m_argData[B3_CL_MAX_ARG_SIZE];
+ };
};
#include <string.h>
-
-
int b3LauncherCL::deserializeArgs(unsigned char* buf, int bufSize, cl_context ctx)
{
- int index=0;
-
- int numArguments = *(int*) &buf[index];
- index+=sizeof(int);
-
- for (int i=0;i<numArguments;i++)
- {
- b3KernelArgDataUnaligned* arg = (b3KernelArgDataUnaligned*)&buf[index];
-
- index+=sizeof(b3KernelArgData);
- if (arg->m_isBuffer)
- {
- b3OpenCLArray<unsigned char>* clData = new b3OpenCLArray<unsigned char>(ctx,m_commandQueue, arg->m_argSizeInBytes);
- clData->resize(arg->m_argSizeInBytes);
-
- clData->copyFromHostPointer(&buf[index], arg->m_argSizeInBytes);
-
- arg->m_clBuffer = clData->getBufferCL();
-
- m_arrays.push_back(clData);
-
- cl_int status = clSetKernelArg( m_kernel, m_idx++, sizeof(cl_mem), &arg->m_clBuffer);
- b3Assert( status == CL_SUCCESS );
- index+=arg->m_argSizeInBytes;
- } else
- {
- cl_int status = clSetKernelArg( m_kernel, m_idx++, arg->m_argSizeInBytes, &arg->m_argData);
- b3Assert( status == CL_SUCCESS );
- }
+ int index = 0;
+
+ int numArguments = *(int*)&buf[index];
+ index += sizeof(int);
+
+ for (int i = 0; i < numArguments; i++)
+ {
+ b3KernelArgDataUnaligned* arg = (b3KernelArgDataUnaligned*)&buf[index];
+
+ index += sizeof(b3KernelArgData);
+ if (arg->m_isBuffer)
+ {
+ b3OpenCLArray<unsigned char>* clData = new b3OpenCLArray<unsigned char>(ctx, m_commandQueue, arg->m_argSizeInBytes);
+ clData->resize(arg->m_argSizeInBytes);
+
+ clData->copyFromHostPointer(&buf[index], arg->m_argSizeInBytes);
+
+ arg->m_clBuffer = clData->getBufferCL();
+
+ m_arrays.push_back(clData);
+
+ cl_int status = clSetKernelArg(m_kernel, m_idx++, sizeof(cl_mem), &arg->m_clBuffer);
+ b3Assert(status == CL_SUCCESS);
+ index += arg->m_argSizeInBytes;
+ }
+ else
+ {
+ cl_int status = clSetKernelArg(m_kernel, m_idx++, arg->m_argSizeInBytes, &arg->m_argData);
+ b3Assert(status == CL_SUCCESS);
+ }
b3KernelArgData b;
- memcpy(&b,arg,sizeof(b3KernelArgDataUnaligned));
- m_kernelArguments.push_back(b);
- }
-m_serializationSizeInBytes = index;
- return index;
+ memcpy(&b, arg, sizeof(b3KernelArgDataUnaligned));
+ m_kernelArguments.push_back(b);
+ }
+ m_serializationSizeInBytes = index;
+ return index;
}
int b3LauncherCL::validateResults(unsigned char* goldBuffer, int goldBufferCapacity, cl_context ctx)
- {
- int index=0;
-
- int numArguments = *(int*) &goldBuffer[index];
- index+=sizeof(int);
+{
+ int index = 0;
+
+ int numArguments = *(int*)&goldBuffer[index];
+ index += sizeof(int);
if (numArguments != m_kernelArguments.size())
{
- printf("failed validation: expected %d arguments, found %d\n",numArguments, m_kernelArguments.size());
+ printf("failed validation: expected %d arguments, found %d\n", numArguments, m_kernelArguments.size());
return -1;
}
-
- for (int ii=0;ii<numArguments;ii++)
- {
- b3KernelArgData* argGold = (b3KernelArgData*)&goldBuffer[index];
+
+ for (int ii = 0; ii < numArguments; ii++)
+ {
+ b3KernelArgData* argGold = (b3KernelArgData*)&goldBuffer[index];
if (m_kernelArguments[ii].m_argSizeInBytes != argGold->m_argSizeInBytes)
{
- printf("failed validation: argument %d sizeInBytes expected: %d, found %d\n",ii, argGold->m_argSizeInBytes, m_kernelArguments[ii].m_argSizeInBytes);
+ printf("failed validation: argument %d sizeInBytes expected: %d, found %d\n", ii, argGold->m_argSizeInBytes, m_kernelArguments[ii].m_argSizeInBytes);
return -2;
}
@@ -184,125 +180,117 @@ int b3LauncherCL::validateResults(unsigned char* goldBuffer, int goldBufferCapac
if (expected != found)
{
- printf("failed validation: argument %d isBuffer expected: %d, found %d\n",ii,expected, found);
+ printf("failed validation: argument %d isBuffer expected: %d, found %d\n", ii, expected, found);
return -3;
}
}
- index+=sizeof(b3KernelArgData);
+ index += sizeof(b3KernelArgData);
if (argGold->m_isBuffer)
- {
-
- unsigned char* memBuf= (unsigned char*) malloc(m_kernelArguments[ii].m_argSizeInBytes);
+ {
+ unsigned char* memBuf = (unsigned char*)malloc(m_kernelArguments[ii].m_argSizeInBytes);
unsigned char* goldBuf = &goldBuffer[index];
- for (int j=0;j<m_kernelArguments[j].m_argSizeInBytes;j++)
+ for (int j = 0; j < m_kernelArguments[j].m_argSizeInBytes; j++)
{
memBuf[j] = 0xaa;
}
cl_int status = 0;
- status = clEnqueueReadBuffer( m_commandQueue, m_kernelArguments[ii].m_clBuffer, CL_TRUE, 0, m_kernelArguments[ii].m_argSizeInBytes,
- memBuf, 0,0,0 );
- b3Assert( status==CL_SUCCESS );
- clFinish(m_commandQueue);
+ status = clEnqueueReadBuffer(m_commandQueue, m_kernelArguments[ii].m_clBuffer, CL_TRUE, 0, m_kernelArguments[ii].m_argSizeInBytes,
+ memBuf, 0, 0, 0);
+ b3Assert(status == CL_SUCCESS);
+ clFinish(m_commandQueue);
- for (int b=0;b<m_kernelArguments[ii].m_argSizeInBytes;b++)
+ for (int b = 0; b < m_kernelArguments[ii].m_argSizeInBytes; b++)
{
int expected = goldBuf[b];
int found = memBuf[b];
if (expected != found)
{
printf("failed validation: argument %d OpenCL data at byte position %d expected: %d, found %d\n",
- ii, b, expected, found);
+ ii, b, expected, found);
return -4;
}
}
-
- index+=argGold->m_argSizeInBytes;
- } else
- {
-
+ index += argGold->m_argSizeInBytes;
+ }
+ else
+ {
//compare content
- for (int b=0;b<m_kernelArguments[ii].m_argSizeInBytes;b++)
+ for (int b = 0; b < m_kernelArguments[ii].m_argSizeInBytes; b++)
{
int expected = argGold->m_argData[b];
- int found =m_kernelArguments[ii].m_argData[b];
+ int found = m_kernelArguments[ii].m_argData[b];
if (expected != found)
{
printf("failed validation: argument %d const data at byte position %d expected: %d, found %d\n",
- ii, b, expected, found);
+ ii, b, expected, found);
return -5;
}
}
-
- }
- }
- return index;
-
+ }
+ }
+ return index;
}
int b3LauncherCL::serializeArguments(unsigned char* destBuffer, int destBufferCapacity)
{
-//initialize to known values
-for (int i=0;i<destBufferCapacity;i++)
- destBuffer[i] = 0xec;
-
- assert(destBufferCapacity>=m_serializationSizeInBytes);
-
- //todo: use the b3Serializer for this to allow for 32/64bit, endianness etc
- int numArguments = m_kernelArguments.size();
- int curBufferSize = 0;
- int* dest = (int*)&destBuffer[curBufferSize];
- *dest = numArguments;
- curBufferSize += sizeof(int);
-
-
-
- for (int i=0;i<this->m_kernelArguments.size();i++)
- {
- b3KernelArgData* arg = (b3KernelArgData*) &destBuffer[curBufferSize];
- *arg = m_kernelArguments[i];
- curBufferSize+=sizeof(b3KernelArgData);
- if (arg->m_isBuffer==1)
- {
- //copy the OpenCL buffer content
- cl_int status = 0;
- status = clEnqueueReadBuffer( m_commandQueue, arg->m_clBuffer, 0, 0, arg->m_argSizeInBytes,
- &destBuffer[curBufferSize], 0,0,0 );
- b3Assert( status==CL_SUCCESS );
- clFinish(m_commandQueue);
- curBufferSize+=arg->m_argSizeInBytes;
- }
-
- }
- return curBufferSize;
+ //initialize to known values
+ for (int i = 0; i < destBufferCapacity; i++)
+ destBuffer[i] = 0xec;
+
+ assert(destBufferCapacity >= m_serializationSizeInBytes);
+
+ //todo: use the b3Serializer for this to allow for 32/64bit, endianness etc
+ int numArguments = m_kernelArguments.size();
+ int curBufferSize = 0;
+ int* dest = (int*)&destBuffer[curBufferSize];
+ *dest = numArguments;
+ curBufferSize += sizeof(int);
+
+ for (int i = 0; i < this->m_kernelArguments.size(); i++)
+ {
+ b3KernelArgData* arg = (b3KernelArgData*)&destBuffer[curBufferSize];
+ *arg = m_kernelArguments[i];
+ curBufferSize += sizeof(b3KernelArgData);
+ if (arg->m_isBuffer == 1)
+ {
+ //copy the OpenCL buffer content
+ cl_int status = 0;
+ status = clEnqueueReadBuffer(m_commandQueue, arg->m_clBuffer, 0, 0, arg->m_argSizeInBytes,
+ &destBuffer[curBufferSize], 0, 0, 0);
+ b3Assert(status == CL_SUCCESS);
+ clFinish(m_commandQueue);
+ curBufferSize += arg->m_argSizeInBytes;
+ }
+ }
+ return curBufferSize;
}
void b3LauncherCL::serializeToFile(const char* fileName, int numWorkItems)
{
int num = numWorkItems;
int buffSize = getSerializationBufferSize();
- unsigned char* buf = new unsigned char[buffSize+sizeof(int)];
- for (int i=0;i<buffSize+1;i++)
+ unsigned char* buf = new unsigned char[buffSize + sizeof(int)];
+ for (int i = 0; i < buffSize + 1; i++)
{
unsigned char* ptr = (unsigned char*)&buf[i];
*ptr = 0xff;
}
-// int actualWrite = serializeArguments(buf,buffSize);
-
-// unsigned char* cptr = (unsigned char*)&buf[buffSize];
-// printf("buf[buffSize] = %d\n",*cptr);
-
- assert(buf[buffSize]==0xff);//check for buffer overrun
+ // int actualWrite = serializeArguments(buf,buffSize);
+
+ // unsigned char* cptr = (unsigned char*)&buf[buffSize];
+ // printf("buf[buffSize] = %d\n",*cptr);
+
+ assert(buf[buffSize] == 0xff); //check for buffer overrun
int* ptr = (int*)&buf[buffSize];
-
+
*ptr = num;
-
- FILE* f = fopen(fileName,"wb");
- fwrite(buf,buffSize+sizeof(int),1,f);
+
+ FILE* f = fopen(fileName, "wb");
+ fwrite(buf, buffSize + sizeof(int), 1, f);
fclose(f);
delete[] buf;
-}
-
+}
diff --git a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3LauncherCL.h b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3LauncherCL.h
index 1b267b31ef..18e9c1db2b 100644
--- a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3LauncherCL.h
+++ b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3LauncherCL.h
@@ -9,60 +9,57 @@
#define B3_DEBUG_SERIALIZE_CL
-
#ifdef _WIN32
-#pragma warning(disable :4996)
+#pragma warning(disable : 4996)
#endif
#define B3_CL_MAX_ARG_SIZE 16
-B3_ATTRIBUTE_ALIGNED16(struct) b3KernelArgData
+B3_ATTRIBUTE_ALIGNED16(struct)
+b3KernelArgData
{
- int m_isBuffer;
- int m_argIndex;
- int m_argSizeInBytes;
+ 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];
- };
-
+ 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<b3KernelArgData> m_kernelArguments;
- int m_serializationSizeInBytes;
- bool m_enableSerialization;
+
+ b3AlignedObjectArray<b3KernelArgData> m_kernelArguments;
+ int m_serializationSizeInBytes;
+ bool m_enableSerialization;
const char* m_name;
- public:
-
- b3AlignedObjectArray<b3OpenCLArray<unsigned char>* > 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);
+
+public:
+ b3AlignedObjectArray<b3OpenCLArray<unsigned char>*> 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 serializeArguments(unsigned char* destBuffer, int destBufferCapacity);
+
int getNumArguments() const
{
return m_kernelArguments.size();
@@ -75,61 +72,57 @@ class b3LauncherCL
void serializeToFile(const char* fileName, int numWorkItems);
- template<typename T>
- 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 );
- }
+ template <typename T>
+ inline void setConst(const T& consts)
+ {
+ int sz = sizeof(T);
+ b3Assert(sz <= B3_CL_MAX_ARG_SIZE);
- inline void launch1D( int numThreads, int localSize = 64)
+ if (m_enableSerialization)
{
- launch2D( numThreads, 1, localSize, 1 );
+ 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);
}
- 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 );
+ cl_int status = clSetKernelArg(m_kernel, m_idx++, sz, &consts);
+ b3Assert(status == CL_SUCCESS);
+ }
- }
-
- void enableSerialization(bool serialize)
+ 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)
{
- m_enableSerialization = serialize;
+ printf("Error: OpenCL status = %d\n", status);
}
-
-};
-
+ b3Assert(status == CL_SUCCESS);
+ }
+ void enableSerialization(bool serialize)
+ {
+ m_enableSerialization = serialize;
+ }
+};
-#endif //B3_LAUNCHER_CL_H
+#endif //B3_LAUNCHER_CL_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h
index d70c30f53f..e837cceb66 100644
--- a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h
+++ b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h
@@ -7,16 +7,16 @@
template <typename T>
class b3OpenCLArray
{
- size_t m_size;
- size_t m_capacity;
- cl_mem m_clBuffer;
+ size_t m_size;
+ size_t m_capacity;
+ cl_mem m_clBuffer;
- cl_context m_clContext;
+ cl_context m_clContext;
cl_command_queue m_commandQueue;
- bool m_ownsMemory;
+ bool m_ownsMemory;
- bool m_allowGrowingCapacity;
+ bool m_allowGrowingCapacity;
void deallocate()
{
@@ -25,22 +25,19 @@ class b3OpenCLArray
clReleaseMemObject(m_clBuffer);
}
m_clBuffer = 0;
- m_capacity=0;
+ m_capacity = 0;
}
b3OpenCLArray<T>& operator=(const b3OpenCLArray<T>& src);
- B3_FORCE_INLINE size_t allocSize(size_t size)
- {
- return (size ? size*2 : 1);
- }
+ 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)
+ 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)
{
@@ -60,34 +57,32 @@ public:
m_capacity = sizeInElements;
}
-// we could enable this assignment, but need to make sure to avoid accidental deep copies
-// b3OpenCLArray<T>& operator=(const b3AlignedObjectArray<T>& src)
-// {
-// copyFromArray(src);
-// return *this;
-// }
+ // we could enable this assignment, but need to make sure to avoid accidental deep copies
+ // b3OpenCLArray<T>& operator=(const b3AlignedObjectArray<T>& src)
+ // {
+ // copyFromArray(src);
+ // return *this;
+ // }
-
- cl_mem getBufferCL() const
+ cl_mem getBufferCL() const
{
return m_clBuffer;
}
-
virtual ~b3OpenCLArray()
{
deallocate();
- m_size=0;
- m_capacity=0;
+ m_size = 0;
+ m_capacity = 0;
}
- B3_FORCE_INLINE bool push_back(const T& _Val,bool waitForCompletion=true)
+ B3_FORCE_INLINE bool push_back(const T& _Val, bool waitForCompletion = true)
{
bool result = true;
size_t sz = size();
- if( sz == capacity() )
+ if (sz == capacity())
{
- result = reserve( allocSize(size()) );
+ result = reserve(allocSize(size()));
}
copyFromHostPointer(&_Val, 1, sz, waitForCompletion);
m_size++;
@@ -96,23 +91,23 @@ public:
B3_FORCE_INLINE T forcedAt(size_t n) const
{
- b3Assert(n>=0);
- b3Assert(n<capacity());
+ b3Assert(n >= 0);
+ b3Assert(n < capacity());
T elem;
- copyToHostPointer(&elem,1,n,true);
+ copyToHostPointer(&elem, 1, n, true);
return elem;
}
B3_FORCE_INLINE T at(size_t n) const
{
- b3Assert(n>=0);
- b3Assert(n<size());
+ b3Assert(n >= 0);
+ b3Assert(n < size());
T elem;
- copyToHostPointer(&elem,1,n,true);
+ copyToHostPointer(&elem, 1, n, true);
return elem;
}
- B3_FORCE_INLINE bool resize(size_t newsize, bool copyOldContents=true)
+ B3_FORCE_INLINE bool resize(size_t newsize, bool copyOldContents = true)
{
bool result = true;
size_t curSize = size();
@@ -120,11 +115,12 @@ public:
if (newsize < curSize)
{
//leave the OpenCL memory for now
- } else
+ }
+ else
{
if (newsize > size())
{
- result = reserve(newsize,copyOldContents);
+ result = reserve(newsize, copyOldContents);
}
//leave new data uninitialized (init in debug mode?)
@@ -134,7 +130,8 @@ public:
if (result)
{
m_size = newsize;
- } else
+ }
+ else
{
m_size = 0;
}
@@ -146,25 +143,25 @@ public:
return m_size;
}
- B3_FORCE_INLINE size_t capacity() const
+ B3_FORCE_INLINE size_t capacity() const
{
return m_capacity;
}
- B3_FORCE_INLINE bool reserve(size_t _Count, bool copyOldContents=true)
+ B3_FORCE_INLINE bool reserve(size_t _Count, bool copyOldContents = true)
{
- bool result=true;
+ bool result = true;
// determine new minimum length of allocated storage
if (capacity() < _Count)
- { // not enough room, reallocate
+ { // not enough room, reallocate
if (m_allowGrowingCapacity)
{
cl_int ciErrNum;
//create a new OpenCL buffer
- size_t memSizeInBytes = sizeof(T)*_Count;
+ size_t memSizeInBytes = sizeof(T) * _Count;
cl_mem buf = clCreateBuffer(m_clContext, CL_MEM_READ_WRITE, memSizeInBytes, NULL, &ciErrNum);
- if (ciErrNum!=CL_SUCCESS)
+ if (ciErrNum != CL_SUCCESS)
{
b3Error("OpenCL out-of-memory\n");
_Count = 0;
@@ -173,13 +170,13 @@ public:
//#define B3_ALWAYS_INITIALIZE_OPENCL_BUFFERS
#ifdef B3_ALWAYS_INITIALIZE_OPENCL_BUFFERS
unsigned char* src = (unsigned char*)malloc(memSizeInBytes);
- for (size_t i=0;i<memSizeInBytes;i++)
+ for (size_t i = 0; i < memSizeInBytes; i++)
src[i] = 0xbb;
- ciErrNum = clEnqueueWriteBuffer( m_commandQueue, buf, CL_TRUE, 0, memSizeInBytes, src, 0,0,0 );
- b3Assert(ciErrNum==CL_SUCCESS);
+ ciErrNum = clEnqueueWriteBuffer(m_commandQueue, buf, CL_TRUE, 0, memSizeInBytes, src, 0, 0, 0);
+ b3Assert(ciErrNum == CL_SUCCESS);
clFinish(m_commandQueue);
free(src);
-#endif //B3_ALWAYS_INITIALIZE_OPENCL_BUFFERS
+#endif //B3_ALWAYS_INITIALIZE_OPENCL_BUFFERS
if (result)
{
@@ -193,21 +190,21 @@ public:
m_clBuffer = buf;
m_capacity = _Count;
- } else
+ }
+ else
{
//fail: assert and
b3Assert(0);
deallocate();
- result=false;
+ result = false;
}
}
return result;
}
-
- void copyToCL(cl_mem destination, size_t numElements, size_t firstElem=0, size_t dstOffsetInElems=0) const
+ void copyToCL(cl_mem destination, size_t numElements, size_t firstElem = 0, size_t dstOffsetInElems = 0) const
{
- if (numElements<=0)
+ if (numElements <= 0)
return;
b3Assert(m_clBuffer);
@@ -216,75 +213,74 @@ public:
//likely some error, destination is same as source
b3Assert(m_clBuffer != destination);
- b3Assert((firstElem+numElements)<=m_size);
+ b3Assert((firstElem + numElements) <= m_size);
cl_int status = 0;
+ b3Assert(numElements > 0);
+ b3Assert(numElements <= m_size);
- b3Assert(numElements>0);
- b3Assert(numElements<=m_size);
-
- size_t srcOffsetBytes = sizeof(T)*firstElem;
- size_t dstOffsetInBytes = sizeof(T)*dstOffsetInElems;
+ 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 );
+ status = clEnqueueCopyBuffer(m_commandQueue, m_clBuffer, destination,
+ srcOffsetBytes, dstOffsetInBytes, sizeof(T) * numElements, 0, 0, 0);
- b3Assert( status == CL_SUCCESS );
+ b3Assert(status == CL_SUCCESS);
}
- void copyFromHost(const b3AlignedObjectArray<T>& srcArray, bool waitForCompletion=true)
+ void copyFromHost(const b3AlignedObjectArray<T>& srcArray, bool waitForCompletion = true)
{
size_t newSize = srcArray.size();
bool copyOldContents = false;
- resize (newSize,copyOldContents);
+ resize(newSize, copyOldContents);
if (newSize)
- copyFromHostPointer(&srcArray[0],newSize,0,waitForCompletion);
-
+ copyFromHostPointer(&srcArray[0], newSize, 0, waitForCompletion);
}
- void copyFromHostPointer(const T* src, size_t numElems, size_t destFirstElem= 0, bool waitForCompletion=true)
+ void copyFromHostPointer(const T* src, size_t numElems, size_t destFirstElem = 0, bool waitForCompletion = true)
{
- b3Assert(numElems+destFirstElem <= capacity());
+ b3Assert(numElems + destFirstElem <= capacity());
- if (numElems+destFirstElem)
+ 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 );
+ 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
+ }
+ else
{
b3Error("copyFromHostPointer invalid range\n");
}
}
-
- void copyToHost(b3AlignedObjectArray<T>& destArray, bool waitForCompletion=true) const
+ void copyToHost(b3AlignedObjectArray<T>& destArray, bool waitForCompletion = true) const
{
destArray.resize(this->size());
if (size())
- copyToHostPointer(&destArray[0], size(),0,waitForCompletion);
+ copyToHostPointer(&destArray[0], size(), 0, waitForCompletion);
}
- void copyToHostPointer(T* destPtr, size_t numElem, size_t srcFirstElem=0, bool waitForCompletion=true) const
+ void copyToHostPointer(T* destPtr, size_t numElem, size_t srcFirstElem = 0, bool waitForCompletion = true) const
{
- b3Assert(numElem+srcFirstElem <= capacity());
+ b3Assert(numElem + srcFirstElem <= capacity());
- if(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 );
+ 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
+ }
+ else
{
b3Error("copyToHostPointer invalid range\n");
}
@@ -296,11 +292,9 @@ public:
resize(newSize);
if (size())
{
- src.copyToCL(m_clBuffer,size());
+ src.copyToCL(m_clBuffer, size());
}
}
-
};
-
-#endif //B3_OPENCL_ARRAY_H
+#endif //B3_OPENCL_ARRAY_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanCL.cpp b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanCL.cpp
index 42cd197740..822b511633 100644
--- a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanCL.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanCL.cpp
@@ -7,25 +7,24 @@
#include "kernels/PrefixScanKernelsCL.h"
b3PrefixScanCL::b3PrefixScanCL(cl_context ctx, cl_device_id device, cl_command_queue queue, int size)
-:m_commandQueue(queue)
+ : m_commandQueue(queue)
{
const char* scanKernelSource = prefixScanKernelsCL;
cl_int pErrNum;
- char* additionalMacros=0;
+ char* additionalMacros = 0;
- m_workBuffer = new b3OpenCLArray<unsigned int>(ctx,queue,size);
- cl_program scanProg = b3OpenCLUtils::compileCLProgramFromString( ctx, device, scanKernelSource, &pErrNum,additionalMacros, B3_PREFIXSCAN_PROG_PATH);
+ m_workBuffer = new b3OpenCLArray<unsigned int>(ctx, queue, size);
+ cl_program scanProg = b3OpenCLUtils::compileCLProgramFromString(ctx, device, scanKernelSource, &pErrNum, additionalMacros, B3_PREFIXSCAN_PROG_PATH);
b3Assert(scanProg);
- m_localScanKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, scanKernelSource, "LocalScanKernel", &pErrNum, scanProg,additionalMacros );
- b3Assert(m_localScanKernel );
- m_blockSumKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, scanKernelSource, "TopLevelScanKernel", &pErrNum, scanProg,additionalMacros );
- b3Assert(m_blockSumKernel );
- m_propagationKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, scanKernelSource, "AddOffsetKernel", &pErrNum, scanProg,additionalMacros );
- b3Assert(m_propagationKernel );
+ m_localScanKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, scanKernelSource, "LocalScanKernel", &pErrNum, scanProg, additionalMacros);
+ b3Assert(m_localScanKernel);
+ m_blockSumKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, scanKernelSource, "TopLevelScanKernel", &pErrNum, scanProg, additionalMacros);
+ b3Assert(m_blockSumKernel);
+ m_propagationKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, scanKernelSource, "AddOffsetKernel", &pErrNum, scanProg, additionalMacros);
+ b3Assert(m_propagationKernel);
}
-
b3PrefixScanCL::~b3PrefixScanCL()
{
delete m_workBuffer;
@@ -34,20 +33,19 @@ b3PrefixScanCL::~b3PrefixScanCL()
clReleaseKernel(m_propagationKernel);
}
-template<class T>
+template <class T>
T b3NextPowerOf2(T n)
{
n -= 1;
- for(int i=0; i<sizeof(T)*8; i++)
- n = n | (n>>i);
- return n+1;
+ for (int i = 0; i < sizeof(T) * 8; i++)
+ n = n | (n >> i);
+ return n + 1;
}
void b3PrefixScanCL::execute(b3OpenCLArray<unsigned int>& src, b3OpenCLArray<unsigned int>& dst, int n, unsigned int* sum)
{
-
-// b3Assert( data->m_option == EXCLUSIVE );
- const unsigned int numBlocks = (const unsigned int)( (n+BLOCK_SIZE*2-1)/(BLOCK_SIZE*2) );
+ // b3Assert( data->m_option == EXCLUSIVE );
+ const unsigned int numBlocks = (const unsigned int)((n + BLOCK_SIZE * 2 - 1) / (BLOCK_SIZE * 2));
dst.resize(src.size());
m_workBuffer->resize(src.size());
@@ -55,55 +53,51 @@ void b3PrefixScanCL::execute(b3OpenCLArray<unsigned int>& src, b3OpenCLArray<uns
b3Int4 constBuffer;
constBuffer.x = n;
constBuffer.y = numBlocks;
- constBuffer.z = (int)b3NextPowerOf2( numBlocks );
+ constBuffer.z = (int)b3NextPowerOf2(numBlocks);
b3OpenCLArray<unsigned int>* srcNative = &src;
b3OpenCLArray<unsigned int>* dstNative = &dst;
-
+
{
- b3BufferInfoCL bInfo[] = { b3BufferInfoCL( dstNative->getBufferCL() ), b3BufferInfoCL( srcNative->getBufferCL() ), b3BufferInfoCL( m_workBuffer->getBufferCL() ) };
+ b3BufferInfoCL bInfo[] = {b3BufferInfoCL(dstNative->getBufferCL()), b3BufferInfoCL(srcNative->getBufferCL()), b3BufferInfoCL(m_workBuffer->getBufferCL())};
- b3LauncherCL launcher( m_commandQueue, m_localScanKernel,"m_localScanKernel" );
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( constBuffer );
- launcher.launch1D( numBlocks*BLOCK_SIZE, BLOCK_SIZE );
+ b3LauncherCL launcher(m_commandQueue, m_localScanKernel, "m_localScanKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(constBuffer);
+ launcher.launch1D(numBlocks * BLOCK_SIZE, BLOCK_SIZE);
}
{
- b3BufferInfoCL bInfo[] = { b3BufferInfoCL( m_workBuffer->getBufferCL() ) };
+ b3BufferInfoCL bInfo[] = {b3BufferInfoCL(m_workBuffer->getBufferCL())};
- b3LauncherCL launcher( m_commandQueue, m_blockSumKernel,"m_blockSumKernel" );
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( constBuffer );
- launcher.launch1D( BLOCK_SIZE, BLOCK_SIZE );
+ b3LauncherCL launcher(m_commandQueue, m_blockSumKernel, "m_blockSumKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(constBuffer);
+ launcher.launch1D(BLOCK_SIZE, BLOCK_SIZE);
}
-
- if( numBlocks > 1 )
+ if (numBlocks > 1)
{
- b3BufferInfoCL bInfo[] = { b3BufferInfoCL( dstNative->getBufferCL() ), b3BufferInfoCL( m_workBuffer->getBufferCL() ) };
- b3LauncherCL launcher( m_commandQueue, m_propagationKernel,"m_propagationKernel" );
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( constBuffer );
- launcher.launch1D( (numBlocks-1)*BLOCK_SIZE, BLOCK_SIZE );
+ b3BufferInfoCL bInfo[] = {b3BufferInfoCL(dstNative->getBufferCL()), b3BufferInfoCL(m_workBuffer->getBufferCL())};
+ b3LauncherCL launcher(m_commandQueue, m_propagationKernel, "m_propagationKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(constBuffer);
+ launcher.launch1D((numBlocks - 1) * BLOCK_SIZE, BLOCK_SIZE);
}
-
- if( sum )
+ if (sum)
{
clFinish(m_commandQueue);
- dstNative->copyToHostPointer(sum,1,n-1,true);
+ dstNative->copyToHostPointer(sum, 1, n - 1, true);
}
-
}
-
void b3PrefixScanCL::executeHost(b3AlignedObjectArray<unsigned int>& src, b3AlignedObjectArray<unsigned int>& dst, int n, unsigned int* sum)
{
unsigned int s = 0;
//if( data->m_option == EXCLUSIVE )
{
- for(int i=0; i<n; i++)
+ for (int i = 0; i < n; i++)
{
dst[i] = s;
s += src[i];
@@ -119,8 +113,8 @@ void b3PrefixScanCL::executeHost(b3AlignedObjectArray<unsigned int>& src, b3Alig
}
*/
- if( sum )
+ if (sum)
{
- *sum = dst[n-1];
+ *sum = dst[n - 1];
}
} \ No newline at end of file
diff --git a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanCL.h b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanCL.h
index a9a2e61b9e..346efa0c73 100644
--- a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanCL.h
+++ b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanCL.h
@@ -13,9 +13,9 @@ class b3PrefixScanCL
BLOCK_SIZE = 128
};
-// Option m_option;
+ // Option m_option;
- cl_command_queue m_commandQueue;
+ cl_command_queue m_commandQueue;
cl_kernel m_localScanKernel;
cl_kernel m_blockSumKernel;
@@ -23,15 +23,13 @@ class b3PrefixScanCL
b3OpenCLArray<unsigned int>* m_workBuffer;
-
- public:
-
- b3PrefixScanCL(cl_context ctx, cl_device_id device, cl_command_queue queue,int size=0);
+public:
+ b3PrefixScanCL(cl_context ctx, cl_device_id device, cl_command_queue queue, int size = 0);
virtual ~b3PrefixScanCL();
void execute(b3OpenCLArray<unsigned int>& src, b3OpenCLArray<unsigned int>& dst, int n, unsigned int* sum = 0);
- void executeHost(b3AlignedObjectArray<unsigned int>& src, b3AlignedObjectArray<unsigned int>& dst, int n, unsigned int* sum=0);
+ void executeHost(b3AlignedObjectArray<unsigned int>& src, b3AlignedObjectArray<unsigned int>& dst, int n, unsigned int* sum = 0);
};
-#endif //B3_PREFIX_SCAN_CL_H
+#endif //B3_PREFIX_SCAN_CL_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanFloat4CL.cpp b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanFloat4CL.cpp
index 80560d793d..1cac97c988 100644
--- a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanFloat4CL.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanFloat4CL.cpp
@@ -7,25 +7,24 @@
#include "kernels/PrefixScanKernelsFloat4CL.h"
b3PrefixScanFloat4CL::b3PrefixScanFloat4CL(cl_context ctx, cl_device_id device, cl_command_queue queue, int size)
-:m_commandQueue(queue)
+ : m_commandQueue(queue)
{
const char* scanKernelSource = prefixScanKernelsFloat4CL;
cl_int pErrNum;
- char* additionalMacros=0;
+ char* additionalMacros = 0;
- m_workBuffer = new b3OpenCLArray<b3Vector3>(ctx,queue,size);
- cl_program scanProg = b3OpenCLUtils::compileCLProgramFromString( ctx, device, scanKernelSource, &pErrNum,additionalMacros, B3_PREFIXSCAN_FLOAT4_PROG_PATH);
+ m_workBuffer = new b3OpenCLArray<b3Vector3>(ctx, queue, size);
+ cl_program scanProg = b3OpenCLUtils::compileCLProgramFromString(ctx, device, scanKernelSource, &pErrNum, additionalMacros, B3_PREFIXSCAN_FLOAT4_PROG_PATH);
b3Assert(scanProg);
- m_localScanKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, scanKernelSource, "LocalScanKernel", &pErrNum, scanProg,additionalMacros );
- b3Assert(m_localScanKernel );
- m_blockSumKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, scanKernelSource, "TopLevelScanKernel", &pErrNum, scanProg,additionalMacros );
- b3Assert(m_blockSumKernel );
- m_propagationKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, scanKernelSource, "AddOffsetKernel", &pErrNum, scanProg,additionalMacros );
- b3Assert(m_propagationKernel );
+ m_localScanKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, scanKernelSource, "LocalScanKernel", &pErrNum, scanProg, additionalMacros);
+ b3Assert(m_localScanKernel);
+ m_blockSumKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, scanKernelSource, "TopLevelScanKernel", &pErrNum, scanProg, additionalMacros);
+ b3Assert(m_blockSumKernel);
+ m_propagationKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, scanKernelSource, "AddOffsetKernel", &pErrNum, scanProg, additionalMacros);
+ b3Assert(m_propagationKernel);
}
-
b3PrefixScanFloat4CL::~b3PrefixScanFloat4CL()
{
delete m_workBuffer;
@@ -34,20 +33,19 @@ b3PrefixScanFloat4CL::~b3PrefixScanFloat4CL()
clReleaseKernel(m_propagationKernel);
}
-template<class T>
+template <class T>
T b3NextPowerOf2(T n)
{
n -= 1;
- for(int i=0; i<sizeof(T)*8; i++)
- n = n | (n>>i);
- return n+1;
+ for (int i = 0; i < sizeof(T) * 8; i++)
+ n = n | (n >> i);
+ return n + 1;
}
void b3PrefixScanFloat4CL::execute(b3OpenCLArray<b3Vector3>& src, b3OpenCLArray<b3Vector3>& dst, int n, b3Vector3* sum)
{
-
-// b3Assert( data->m_option == EXCLUSIVE );
- const unsigned int numBlocks = (const unsigned int)( (n+BLOCK_SIZE*2-1)/(BLOCK_SIZE*2) );
+ // b3Assert( data->m_option == EXCLUSIVE );
+ const unsigned int numBlocks = (const unsigned int)((n + BLOCK_SIZE * 2 - 1) / (BLOCK_SIZE * 2));
dst.resize(src.size());
m_workBuffer->resize(src.size());
@@ -55,55 +53,51 @@ void b3PrefixScanFloat4CL::execute(b3OpenCLArray<b3Vector3>& src, b3OpenCLArray<
b3Int4 constBuffer;
constBuffer.x = n;
constBuffer.y = numBlocks;
- constBuffer.z = (int)b3NextPowerOf2( numBlocks );
+ constBuffer.z = (int)b3NextPowerOf2(numBlocks);
b3OpenCLArray<b3Vector3>* srcNative = &src;
b3OpenCLArray<b3Vector3>* dstNative = &dst;
-
+
{
- b3BufferInfoCL bInfo[] = { b3BufferInfoCL( dstNative->getBufferCL() ), b3BufferInfoCL( srcNative->getBufferCL() ), b3BufferInfoCL( m_workBuffer->getBufferCL() ) };
+ b3BufferInfoCL bInfo[] = {b3BufferInfoCL(dstNative->getBufferCL()), b3BufferInfoCL(srcNative->getBufferCL()), b3BufferInfoCL(m_workBuffer->getBufferCL())};
- b3LauncherCL launcher( m_commandQueue, m_localScanKernel ,"m_localScanKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( constBuffer );
- launcher.launch1D( numBlocks*BLOCK_SIZE, BLOCK_SIZE );
+ b3LauncherCL launcher(m_commandQueue, m_localScanKernel, "m_localScanKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(constBuffer);
+ launcher.launch1D(numBlocks * BLOCK_SIZE, BLOCK_SIZE);
}
{
- b3BufferInfoCL bInfo[] = { b3BufferInfoCL( m_workBuffer->getBufferCL() ) };
+ b3BufferInfoCL bInfo[] = {b3BufferInfoCL(m_workBuffer->getBufferCL())};
- b3LauncherCL launcher( m_commandQueue, m_blockSumKernel ,"m_blockSumKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( constBuffer );
- launcher.launch1D( BLOCK_SIZE, BLOCK_SIZE );
+ b3LauncherCL launcher(m_commandQueue, m_blockSumKernel, "m_blockSumKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(constBuffer);
+ launcher.launch1D(BLOCK_SIZE, BLOCK_SIZE);
}
-
- if( numBlocks > 1 )
+ if (numBlocks > 1)
{
- b3BufferInfoCL bInfo[] = { b3BufferInfoCL( dstNative->getBufferCL() ), b3BufferInfoCL( m_workBuffer->getBufferCL() ) };
- b3LauncherCL launcher( m_commandQueue, m_propagationKernel ,"m_propagationKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( constBuffer );
- launcher.launch1D( (numBlocks-1)*BLOCK_SIZE, BLOCK_SIZE );
+ b3BufferInfoCL bInfo[] = {b3BufferInfoCL(dstNative->getBufferCL()), b3BufferInfoCL(m_workBuffer->getBufferCL())};
+ b3LauncherCL launcher(m_commandQueue, m_propagationKernel, "m_propagationKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(constBuffer);
+ launcher.launch1D((numBlocks - 1) * BLOCK_SIZE, BLOCK_SIZE);
}
-
- if( sum )
+ if (sum)
{
clFinish(m_commandQueue);
- dstNative->copyToHostPointer(sum,1,n-1,true);
+ dstNative->copyToHostPointer(sum, 1, n - 1, true);
}
-
}
-
void b3PrefixScanFloat4CL::executeHost(b3AlignedObjectArray<b3Vector3>& src, b3AlignedObjectArray<b3Vector3>& dst, int n, b3Vector3* sum)
{
- b3Vector3 s=b3MakeVector3(0,0,0);
+ b3Vector3 s = b3MakeVector3(0, 0, 0);
//if( data->m_option == EXCLUSIVE )
{
- for(int i=0; i<n; i++)
+ for (int i = 0; i < n; i++)
{
dst[i] = s;
s += src[i];
@@ -119,8 +113,8 @@ void b3PrefixScanFloat4CL::executeHost(b3AlignedObjectArray<b3Vector3>& src, b3A
}
*/
- if( sum )
+ if (sum)
{
- *sum = dst[n-1];
+ *sum = dst[n - 1];
}
} \ No newline at end of file
diff --git a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanFloat4CL.h b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanFloat4CL.h
index 2c8003c1bb..122b0bfd68 100644
--- a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanFloat4CL.h
+++ b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3PrefixScanFloat4CL.h
@@ -14,9 +14,9 @@ class b3PrefixScanFloat4CL
BLOCK_SIZE = 128
};
-// Option m_option;
+ // Option m_option;
- cl_command_queue m_commandQueue;
+ cl_command_queue m_commandQueue;
cl_kernel m_localScanKernel;
cl_kernel m_blockSumKernel;
@@ -24,10 +24,8 @@ class b3PrefixScanFloat4CL
b3OpenCLArray<b3Vector3>* m_workBuffer;
-
- public:
-
- b3PrefixScanFloat4CL(cl_context ctx, cl_device_id device, cl_command_queue queue,int size=0);
+public:
+ b3PrefixScanFloat4CL(cl_context ctx, cl_device_id device, cl_command_queue queue, int size = 0);
virtual ~b3PrefixScanFloat4CL();
@@ -35,4 +33,4 @@ class b3PrefixScanFloat4CL
void executeHost(b3AlignedObjectArray<b3Vector3>& src, b3AlignedObjectArray<b3Vector3>& dst, int n, b3Vector3* sum);
};
-#endif //B3_PREFIX_SCAN_CL_H
+#endif //B3_PREFIX_SCAN_CL_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3RadixSort32CL.cpp b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3RadixSort32CL.cpp
index f11ae4bcdb..e86af6583f 100644
--- a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3RadixSort32CL.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3RadixSort32CL.cpp
@@ -10,21 +10,20 @@
#include "kernels/RadixSort32KernelsCL.h"
b3RadixSort32CL::b3RadixSort32CL(cl_context ctx, cl_device_id device, cl_command_queue queue, int initialCapacity)
-:m_commandQueue(queue)
+ : m_commandQueue(queue)
{
b3OpenCLDeviceInfo info;
- b3OpenCLUtils::getDeviceInfo(device,&info);
- m_deviceCPU = (info.m_deviceType & CL_DEVICE_TYPE_CPU)!=0;
+ b3OpenCLUtils::getDeviceInfo(device, &info);
+ m_deviceCPU = (info.m_deviceType & CL_DEVICE_TYPE_CPU) != 0;
- m_workBuffer1 = new b3OpenCLArray<unsigned int>(ctx,queue);
- m_workBuffer2 = new b3OpenCLArray<unsigned int>(ctx,queue);
- m_workBuffer3 = new b3OpenCLArray<b3SortData>(ctx,queue);
- m_workBuffer3a = new b3OpenCLArray<unsigned int>(ctx,queue);
- m_workBuffer4 = new b3OpenCLArray<b3SortData>(ctx,queue);
- m_workBuffer4a = new b3OpenCLArray<unsigned int>(ctx,queue);
+ m_workBuffer1 = new b3OpenCLArray<unsigned int>(ctx, queue);
+ m_workBuffer2 = new b3OpenCLArray<unsigned int>(ctx, queue);
+ m_workBuffer3 = new b3OpenCLArray<b3SortData>(ctx, queue);
+ m_workBuffer3a = new b3OpenCLArray<unsigned int>(ctx, queue);
+ m_workBuffer4 = new b3OpenCLArray<b3SortData>(ctx, queue);
+ m_workBuffer4a = new b3OpenCLArray<unsigned int>(ctx, queue);
-
- if (initialCapacity>0)
+ if (initialCapacity > 0)
{
m_workBuffer1->resize(initialCapacity);
m_workBuffer3->resize(initialCapacity);
@@ -33,45 +32,40 @@ b3RadixSort32CL::b3RadixSort32CL(cl_context ctx, cl_device_id device, cl_command
m_workBuffer4a->resize(initialCapacity);
}
- m_scan = new b3PrefixScanCL(ctx,device,queue);
- m_fill = new b3FillCL(ctx,device,queue);
-
+ m_scan = new b3PrefixScanCL(ctx, device, queue);
+ m_fill = new b3FillCL(ctx, device, queue);
+
const char* additionalMacros = "";
cl_int pErrNum;
const char* kernelSource = radixSort32KernelsCL;
-
- cl_program sortProg = b3OpenCLUtils::compileCLProgramFromString( ctx, device, kernelSource, &pErrNum,additionalMacros, RADIXSORT32_PATH);
- b3Assert(sortProg);
- m_streamCountSortDataKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, kernelSource, "StreamCountSortDataKernel", &pErrNum, sortProg,additionalMacros );
- b3Assert(m_streamCountSortDataKernel );
+ cl_program sortProg = b3OpenCLUtils::compileCLProgramFromString(ctx, device, kernelSource, &pErrNum, additionalMacros, RADIXSORT32_PATH);
+ b3Assert(sortProg);
+ m_streamCountSortDataKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, kernelSource, "StreamCountSortDataKernel", &pErrNum, sortProg, additionalMacros);
+ b3Assert(m_streamCountSortDataKernel);
-
- m_streamCountKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, kernelSource, "StreamCountKernel", &pErrNum, sortProg,additionalMacros );
+ m_streamCountKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, kernelSource, "StreamCountKernel", &pErrNum, sortProg, additionalMacros);
b3Assert(m_streamCountKernel);
-
-
if (m_deviceCPU)
{
-
- m_sortAndScatterSortDataKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, kernelSource, "SortAndScatterSortDataKernelSerial", &pErrNum, sortProg,additionalMacros );
+ m_sortAndScatterSortDataKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, kernelSource, "SortAndScatterSortDataKernelSerial", &pErrNum, sortProg, additionalMacros);
b3Assert(m_sortAndScatterSortDataKernel);
- m_sortAndScatterKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, kernelSource, "SortAndScatterKernelSerial", &pErrNum, sortProg,additionalMacros );
+ m_sortAndScatterKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, kernelSource, "SortAndScatterKernelSerial", &pErrNum, sortProg, additionalMacros);
b3Assert(m_sortAndScatterKernel);
- } else
+ }
+ else
{
- m_sortAndScatterSortDataKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, kernelSource, "SortAndScatterSortDataKernel", &pErrNum, sortProg,additionalMacros );
+ m_sortAndScatterSortDataKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, kernelSource, "SortAndScatterSortDataKernel", &pErrNum, sortProg, additionalMacros);
b3Assert(m_sortAndScatterSortDataKernel);
- m_sortAndScatterKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, kernelSource, "SortAndScatterKernel", &pErrNum, sortProg,additionalMacros );
+ m_sortAndScatterKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, kernelSource, "SortAndScatterKernel", &pErrNum, sortProg, additionalMacros);
b3Assert(m_sortAndScatterKernel);
}
-
- m_prefixScanKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, kernelSource, "PrefixScanKernel", &pErrNum, sortProg,additionalMacros );
+
+ m_prefixScanKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, kernelSource, "PrefixScanKernel", &pErrNum, sortProg, additionalMacros);
b3Assert(m_prefixScanKernel);
-
}
b3RadixSort32CL::~b3RadixSort32CL()
@@ -96,8 +90,7 @@ void b3RadixSort32CL::executeHost(b3AlignedObjectArray<b3SortData>& inout, int s
{
int n = inout.size();
const int BITS_PER_PASS = 8;
- const int NUM_TABLES = (1<<BITS_PER_PASS);
-
+ const int NUM_TABLES = (1 << BITS_PER_PASS);
int tables[NUM_TABLES];
int counter[NUM_TABLES];
@@ -107,34 +100,33 @@ void b3RadixSort32CL::executeHost(b3AlignedObjectArray<b3SortData>& inout, int s
workbuffer.resize(inout.size());
b3SortData* dst = &workbuffer[0];
- int count=0;
- for(int startBit=0; startBit<sortBits; startBit+=BITS_PER_PASS)
+ int count = 0;
+ for (int startBit = 0; startBit < sortBits; startBit += BITS_PER_PASS)
{
- for(int i=0; i<NUM_TABLES; i++)
+ for (int i = 0; i < NUM_TABLES; i++)
{
tables[i] = 0;
}
- for(int i=0; i<n; i++)
+ for (int i = 0; i < n; i++)
{
- int tableIdx = (src[i].m_key >> startBit) & (NUM_TABLES-1);
+ int tableIdx = (src[i].m_key >> startBit) & (NUM_TABLES - 1);
tables[tableIdx]++;
}
//#define TEST
#ifdef TEST
- printf("histogram size=%d\n",NUM_TABLES);
- for (int i=0;i<NUM_TABLES;i++)
+ printf("histogram size=%d\n", NUM_TABLES);
+ for (int i = 0; i < NUM_TABLES; i++)
{
- if (tables[i]!=0)
+ if (tables[i] != 0)
{
- printf("tables[%d]=%d]\n",i,tables[i]);
+ printf("tables[%d]=%d]\n", i, tables[i]);
}
-
}
-#endif //TEST
- // prefix scan
+#endif //TEST \
+ // prefix scan
int sum = 0;
- for(int i=0; i<NUM_TABLES; i++)
+ for (int i = 0; i < NUM_TABLES; i++)
{
int iData = tables[i];
tables[i] = sum;
@@ -143,71 +135,65 @@ void b3RadixSort32CL::executeHost(b3AlignedObjectArray<b3SortData>& inout, int s
}
// distribute
- for(int i=0; i<n; i++)
+ for (int i = 0; i < n; i++)
{
- int tableIdx = (src[i].m_key >> startBit) & (NUM_TABLES-1);
-
+ int tableIdx = (src[i].m_key >> startBit) & (NUM_TABLES - 1);
+
dst[tables[tableIdx] + counter[tableIdx]] = src[i];
- counter[tableIdx] ++;
+ counter[tableIdx]++;
}
- b3Swap( src, dst );
+ b3Swap(src, dst);
count++;
}
- if (count&1)
+ if (count & 1)
{
- b3Assert(0);//need to copy
-
+ b3Assert(0); //need to copy
}
}
void b3RadixSort32CL::executeHost(b3OpenCLArray<b3SortData>& keyValuesInOut, int sortBits /* = 32 */)
{
-
b3AlignedObjectArray<b3SortData> inout;
keyValuesInOut.copyToHost(inout);
- executeHost(inout,sortBits);
+ executeHost(inout, sortBits);
keyValuesInOut.copyFromHost(inout);
}
-void b3RadixSort32CL::execute(b3OpenCLArray<unsigned int>& keysIn, b3OpenCLArray<unsigned int>& keysOut, b3OpenCLArray<unsigned int>& valuesIn,
- b3OpenCLArray<unsigned int>& valuesOut, int n, int sortBits)
+void b3RadixSort32CL::execute(b3OpenCLArray<unsigned int>& keysIn, b3OpenCLArray<unsigned int>& keysOut, b3OpenCLArray<unsigned int>& valuesIn,
+ b3OpenCLArray<unsigned int>& valuesOut, int n, int sortBits)
{
-
}
//#define DEBUG_RADIXSORT
//#define DEBUG_RADIXSORT2
-
void b3RadixSort32CL::execute(b3OpenCLArray<b3SortData>& keyValuesInOut, int sortBits /* = 32 */)
{
-
int originalSize = keyValuesInOut.size();
int workingSize = originalSize;
-
-
+
int dataAlignment = DATA_ALIGNMENT;
#ifdef DEBUG_RADIXSORT2
- b3AlignedObjectArray<b3SortData> test2;
- keyValuesInOut.copyToHost(test2);
- printf("numElem = %d\n",test2.size());
- for (int i=0;i<test2.size();i++)
- {
- printf("test2[%d].m_key=%d\n",i,test2[i].m_key);
- printf("test2[%d].m_value=%d\n",i,test2[i].m_value);
- }
-#endif //DEBUG_RADIXSORT2
-
+ b3AlignedObjectArray<b3SortData> test2;
+ keyValuesInOut.copyToHost(test2);
+ printf("numElem = %d\n", test2.size());
+ for (int i = 0; i < test2.size(); i++)
+ {
+ printf("test2[%d].m_key=%d\n", i, test2[i].m_key);
+ printf("test2[%d].m_value=%d\n", i, test2[i].m_value);
+ }
+#endif //DEBUG_RADIXSORT2
+
b3OpenCLArray<b3SortData>* src = 0;
- if (workingSize%dataAlignment)
+ if (workingSize % dataAlignment)
{
- workingSize += dataAlignment-(workingSize%dataAlignment);
+ workingSize += dataAlignment - (workingSize % dataAlignment);
m_workBuffer4->copyFromOpenCLArray(keyValuesInOut);
m_workBuffer4->resize(workingSize);
b3SortData fillValue;
@@ -216,327 +202,301 @@ void b3RadixSort32CL::execute(b3OpenCLArray<b3SortData>& keyValuesInOut, int sor
#define USE_BTFILL
#ifdef USE_BTFILL
- m_fill->execute((b3OpenCLArray<b3Int2>&)*m_workBuffer4,(b3Int2&)fillValue,workingSize-originalSize,originalSize);
+ m_fill->execute((b3OpenCLArray<b3Int2>&)*m_workBuffer4, (b3Int2&)fillValue, workingSize - originalSize, originalSize);
#else
//fill the remaining bits (very slow way, todo: fill on GPU/OpenCL side)
-
- for (int i=originalSize; i<workingSize;i++)
+
+ for (int i = originalSize; i < workingSize; i++)
{
- m_workBuffer4->copyFromHostPointer(&fillValue,1,i);
+ m_workBuffer4->copyFromHostPointer(&fillValue, 1, i);
}
-#endif//USE_BTFILL
+#endif //USE_BTFILL
src = m_workBuffer4;
- } else
+ }
+ else
{
src = &keyValuesInOut;
m_workBuffer4->resize(0);
}
-
- b3Assert( workingSize%DATA_ALIGNMENT == 0 );
- int minCap = NUM_BUCKET*NUM_WGS;
+ b3Assert(workingSize % DATA_ALIGNMENT == 0);
+ int minCap = NUM_BUCKET * NUM_WGS;
int n = workingSize;
m_workBuffer1->resize(minCap);
m_workBuffer3->resize(workingSize);
-
-// ADLASSERT( ELEMENTS_PER_WORK_ITEM == 4 );
- b3Assert( BITS_PER_PASS == 4 );
- b3Assert( WG_SIZE == 64 );
- b3Assert( (sortBits&0x3) == 0 );
+ // ADLASSERT( ELEMENTS_PER_WORK_ITEM == 4 );
+ b3Assert(BITS_PER_PASS == 4);
+ b3Assert(WG_SIZE == 64);
+ b3Assert((sortBits & 0x3) == 0);
-
-
b3OpenCLArray<b3SortData>* dst = m_workBuffer3;
b3OpenCLArray<unsigned int>* srcHisto = m_workBuffer1;
b3OpenCLArray<unsigned int>* destHisto = m_workBuffer2;
-
int nWGs = NUM_WGS;
b3ConstData cdata;
{
- int blockSize = ELEMENTS_PER_WORK_ITEM*WG_SIZE;//set at 256
- int nBlocks = (n+blockSize-1)/(blockSize);
+ int blockSize = ELEMENTS_PER_WORK_ITEM * WG_SIZE; //set at 256
+ int nBlocks = (n + blockSize - 1) / (blockSize);
cdata.m_n = n;
cdata.m_nWGs = NUM_WGS;
cdata.m_startBit = 0;
- cdata.m_nBlocksPerWG = (nBlocks + cdata.m_nWGs - 1)/cdata.m_nWGs;
- if( nBlocks < NUM_WGS )
+ cdata.m_nBlocksPerWG = (nBlocks + cdata.m_nWGs - 1) / cdata.m_nWGs;
+ if (nBlocks < NUM_WGS)
{
cdata.m_nBlocksPerWG = 1;
nWGs = nBlocks;
}
}
- int count=0;
- for(int ib=0; ib<sortBits; ib+=4)
+ int count = 0;
+ for (int ib = 0; ib < sortBits; ib += 4)
{
#ifdef DEBUG_RADIXSORT2
- keyValuesInOut.copyToHost(test2);
- printf("numElem = %d\n",test2.size());
- for (int i=0;i<test2.size();i++)
- {
- if (test2[i].m_key != test2[i].m_value)
- {
- printf("test2[%d].m_key=%d\n",i,test2[i].m_key);
- printf("test2[%d].m_value=%d\n",i,test2[i].m_value);
- }
- }
-#endif //DEBUG_RADIXSORT2
-
+ keyValuesInOut.copyToHost(test2);
+ printf("numElem = %d\n", test2.size());
+ for (int i = 0; i < test2.size(); i++)
+ {
+ if (test2[i].m_key != test2[i].m_value)
+ {
+ printf("test2[%d].m_key=%d\n", i, test2[i].m_key);
+ printf("test2[%d].m_value=%d\n", i, test2[i].m_value);
+ }
+ }
+#endif //DEBUG_RADIXSORT2
+
cdata.m_startBit = ib;
-
+
if (src->size())
{
- b3BufferInfoCL bInfo[] = { b3BufferInfoCL( src->getBufferCL(), true ), b3BufferInfoCL( srcHisto->getBufferCL() ) };
- b3LauncherCL launcher(m_commandQueue, m_streamCountSortDataKernel,"m_streamCountSortDataKernel");
-
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( cdata );
-
- int num = NUM_WGS*WG_SIZE;
- launcher.launch1D( num, WG_SIZE );
+ b3BufferInfoCL bInfo[] = {b3BufferInfoCL(src->getBufferCL(), true), b3BufferInfoCL(srcHisto->getBufferCL())};
+ b3LauncherCL launcher(m_commandQueue, m_streamCountSortDataKernel, "m_streamCountSortDataKernel");
+
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(cdata);
+
+ int num = NUM_WGS * WG_SIZE;
+ launcher.launch1D(num, WG_SIZE);
}
-
-
#ifdef DEBUG_RADIXSORT
b3AlignedObjectArray<unsigned int> testHist;
srcHisto->copyToHost(testHist);
- printf("ib = %d, testHist size = %d, non zero elements:\n",ib, testHist.size());
- for (int i=0;i<testHist.size();i++)
+ printf("ib = %d, testHist size = %d, non zero elements:\n", ib, testHist.size());
+ for (int i = 0; i < testHist.size(); i++)
{
- if (testHist[i]!=0)
- printf("testHist[%d]=%d\n",i,testHist[i]);
+ if (testHist[i] != 0)
+ printf("testHist[%d]=%d\n", i, testHist[i]);
}
-#endif //DEBUG_RADIXSORT
-
-
+#endif //DEBUG_RADIXSORT
//fast prefix scan is not working properly on Mac OSX yet
#ifdef __APPLE__
- bool fastScan=false;
+ bool fastScan = false;
#else
- bool fastScan=!m_deviceCPU;//only use fast scan on GPU
+ bool fastScan = !m_deviceCPU; //only use fast scan on GPU
#endif
if (fastScan)
- {// prefix scan group histogram
- b3BufferInfoCL bInfo[] = { b3BufferInfoCL( srcHisto->getBufferCL() ) };
- b3LauncherCL launcher( m_commandQueue, m_prefixScanKernel,"m_prefixScanKernel" );
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( cdata );
- launcher.launch1D( 128, 128 );
+ { // prefix scan group histogram
+ b3BufferInfoCL bInfo[] = {b3BufferInfoCL(srcHisto->getBufferCL())};
+ b3LauncherCL launcher(m_commandQueue, m_prefixScanKernel, "m_prefixScanKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(cdata);
+ launcher.launch1D(128, 128);
destHisto = srcHisto;
- }else
+ }
+ else
{
//unsigned int sum; //for debugging
- m_scan->execute(*srcHisto,*destHisto,1920,0);//,&sum);
+ m_scan->execute(*srcHisto, *destHisto, 1920, 0); //,&sum);
}
-
#ifdef DEBUG_RADIXSORT
destHisto->copyToHost(testHist);
- printf("ib = %d, testHist size = %d, non zero elements:\n",ib, testHist.size());
- for (int i=0;i<testHist.size();i++)
+ printf("ib = %d, testHist size = %d, non zero elements:\n", ib, testHist.size());
+ for (int i = 0; i < testHist.size(); i++)
{
- if (testHist[i]!=0)
- printf("testHist[%d]=%d\n",i,testHist[i]);
+ if (testHist[i] != 0)
+ printf("testHist[%d]=%d\n", i, testHist[i]);
}
-
- for (int i=0;i<testHist.size();i+=NUM_WGS)
+
+ for (int i = 0; i < testHist.size(); i += NUM_WGS)
{
- printf("testHist[%d]=%d\n",i/NUM_WGS,testHist[i]);
+ printf("testHist[%d]=%d\n", i / NUM_WGS, testHist[i]);
}
-#endif //DEBUG_RADIXSORT
+#endif //DEBUG_RADIXSORT
#define USE_GPU
#ifdef USE_GPU
-
+
if (src->size())
- {// local sort and distribute
- b3BufferInfoCL bInfo[] = { b3BufferInfoCL( src->getBufferCL(), true ), b3BufferInfoCL( destHisto->getBufferCL(), true ), b3BufferInfoCL( dst->getBufferCL() )};
- b3LauncherCL launcher( m_commandQueue, m_sortAndScatterSortDataKernel,"m_sortAndScatterSortDataKernel" );
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( cdata );
- launcher.launch1D( nWGs*WG_SIZE, WG_SIZE );
-
+ { // local sort and distribute
+ b3BufferInfoCL bInfo[] = {b3BufferInfoCL(src->getBufferCL(), true), b3BufferInfoCL(destHisto->getBufferCL(), true), b3BufferInfoCL(dst->getBufferCL())};
+ b3LauncherCL launcher(m_commandQueue, m_sortAndScatterSortDataKernel, "m_sortAndScatterSortDataKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(cdata);
+ launcher.launch1D(nWGs * WG_SIZE, WG_SIZE);
}
#else
- {
+ {
#define NUM_TABLES 16
//#define SEQUENTIAL
#ifdef SEQUENTIAL
- int counter2[NUM_TABLES]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- int tables[NUM_TABLES];
- int startBit = ib;
-
- destHisto->copyToHost(testHist);
- b3AlignedObjectArray<b3SortData> srcHost;
- b3AlignedObjectArray<b3SortData> dstHost;
- dstHost.resize(src->size());
-
- src->copyToHost(srcHost);
-
- for (int i=0;i<NUM_TABLES;i++)
- {
- tables[i] = testHist[i*NUM_WGS];
- }
-
- // distribute
- for(int i=0; i<n; i++)
- {
- int tableIdx = (srcHost[i].m_key >> startBit) & (NUM_TABLES-1);
-
- dstHost[tables[tableIdx] + counter2[tableIdx]] = srcHost[i];
- counter2[tableIdx] ++;
- }
-
-
+ int counter2[NUM_TABLES] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+ int tables[NUM_TABLES];
+ int startBit = ib;
+
+ destHisto->copyToHost(testHist);
+ b3AlignedObjectArray<b3SortData> srcHost;
+ b3AlignedObjectArray<b3SortData> dstHost;
+ dstHost.resize(src->size());
+
+ src->copyToHost(srcHost);
+
+ for (int i = 0; i < NUM_TABLES; i++)
+ {
+ tables[i] = testHist[i * NUM_WGS];
+ }
+
+ // distribute
+ for (int i = 0; i < n; i++)
+ {
+ int tableIdx = (srcHost[i].m_key >> startBit) & (NUM_TABLES - 1);
+
+ dstHost[tables[tableIdx] + counter2[tableIdx]] = srcHost[i];
+ counter2[tableIdx]++;
+ }
+
#else
-
- int counter2[NUM_TABLES]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-
- int tables[NUM_TABLES];
- b3AlignedObjectArray<b3SortData> dstHostOK;
- dstHostOK.resize(src->size());
-
- destHisto->copyToHost(testHist);
- b3AlignedObjectArray<b3SortData> srcHost;
- src->copyToHost(srcHost);
-
- int blockSize = 256;
- int nBlocksPerWG = cdata.m_nBlocksPerWG;
- int startBit = ib;
-
- {
- for (int i=0;i<NUM_TABLES;i++)
- {
- tables[i] = testHist[i*NUM_WGS];
- }
-
- // distribute
- for(int i=0; i<n; i++)
- {
- int tableIdx = (srcHost[i].m_key >> startBit) & (NUM_TABLES-1);
-
- dstHostOK[tables[tableIdx] + counter2[tableIdx]] = srcHost[i];
- counter2[tableIdx] ++;
- }
-
-
- }
-
-
- b3AlignedObjectArray<b3SortData> dstHost;
- dstHost.resize(src->size());
-
-
- int counter[NUM_TABLES]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-
-
-
- for (int wgIdx=0;wgIdx<NUM_WGS;wgIdx++)
- {
- int counter[NUM_TABLES]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-
- int nBlocks = (n)/blockSize - nBlocksPerWG*wgIdx;
-
- for(int iblock=0; iblock<b3Min(cdata.m_nBlocksPerWG, nBlocks); iblock++)
- {
- for (int lIdx = 0;lIdx < 64;lIdx++)
- {
- int addr = iblock*blockSize + blockSize*cdata.m_nBlocksPerWG*wgIdx + ELEMENTS_PER_WORK_ITEM*lIdx;
-
- // MY_HISTOGRAM( localKeys.x ) ++ is much expensive than atomic add as it requires read and write while atomics can just add on AMD
- // Using registers didn't perform well. It seems like use localKeys to address requires a lot of alu ops
- // AMD: AtomInc performs better while NV prefers ++
- for(int j=0; j<ELEMENTS_PER_WORK_ITEM; j++)
- {
- if( addr+j < n )
- {
- // printf ("addr+j=%d\n", addr+j);
-
- int i = addr+j;
-
- int tableIdx = (srcHost[i].m_key >> startBit) & (NUM_TABLES-1);
-
- int destIndex = testHist[tableIdx*NUM_WGS+wgIdx] + counter[tableIdx];
-
- b3SortData ok = dstHostOK[destIndex];
-
- if (ok.m_key != srcHost[i].m_key)
- {
- printf("ok.m_key = %d, srcHost[i].m_key = %d\n", ok.m_key,srcHost[i].m_key );
- printf("(ok.m_value = %d, srcHost[i].m_value = %d)\n", ok.m_value,srcHost[i].m_value );
- }
- if (ok.m_value != srcHost[i].m_value)
- {
-
- printf("ok.m_value = %d, srcHost[i].m_value = %d\n", ok.m_value,srcHost[i].m_value );
- printf("(ok.m_key = %d, srcHost[i].m_key = %d)\n", ok.m_key,srcHost[i].m_key );
-
- }
-
- dstHost[destIndex] = srcHost[i];
- counter[tableIdx] ++;
-
- }
- }
- }
- }
- }
-
-
-#endif //SEQUENTIAL
-
- dst->copyFromHost(dstHost);
- }
-#endif//USE_GPU
-
-
-
+
+ int counter2[NUM_TABLES] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+
+ int tables[NUM_TABLES];
+ b3AlignedObjectArray<b3SortData> dstHostOK;
+ dstHostOK.resize(src->size());
+
+ destHisto->copyToHost(testHist);
+ b3AlignedObjectArray<b3SortData> srcHost;
+ src->copyToHost(srcHost);
+
+ int blockSize = 256;
+ int nBlocksPerWG = cdata.m_nBlocksPerWG;
+ int startBit = ib;
+
+ {
+ for (int i = 0; i < NUM_TABLES; i++)
+ {
+ tables[i] = testHist[i * NUM_WGS];
+ }
+
+ // distribute
+ for (int i = 0; i < n; i++)
+ {
+ int tableIdx = (srcHost[i].m_key >> startBit) & (NUM_TABLES - 1);
+
+ dstHostOK[tables[tableIdx] + counter2[tableIdx]] = srcHost[i];
+ counter2[tableIdx]++;
+ }
+ }
+
+ b3AlignedObjectArray<b3SortData> dstHost;
+ dstHost.resize(src->size());
+
+ int counter[NUM_TABLES] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+
+ for (int wgIdx = 0; wgIdx < NUM_WGS; wgIdx++)
+ {
+ int counter[NUM_TABLES] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+
+ int nBlocks = (n) / blockSize - nBlocksPerWG * wgIdx;
+
+ for (int iblock = 0; iblock < b3Min(cdata.m_nBlocksPerWG, nBlocks); iblock++)
+ {
+ for (int lIdx = 0; lIdx < 64; lIdx++)
+ {
+ int addr = iblock * blockSize + blockSize * cdata.m_nBlocksPerWG * wgIdx + ELEMENTS_PER_WORK_ITEM * lIdx;
+
+ // MY_HISTOGRAM( localKeys.x ) ++ is much expensive than atomic add as it requires read and write while atomics can just add on AMD
+ // Using registers didn't perform well. It seems like use localKeys to address requires a lot of alu ops
+ // AMD: AtomInc performs better while NV prefers ++
+ for (int j = 0; j < ELEMENTS_PER_WORK_ITEM; j++)
+ {
+ if (addr + j < n)
+ {
+ // printf ("addr+j=%d\n", addr+j);
+
+ int i = addr + j;
+
+ int tableIdx = (srcHost[i].m_key >> startBit) & (NUM_TABLES - 1);
+
+ int destIndex = testHist[tableIdx * NUM_WGS + wgIdx] + counter[tableIdx];
+
+ b3SortData ok = dstHostOK[destIndex];
+
+ if (ok.m_key != srcHost[i].m_key)
+ {
+ printf("ok.m_key = %d, srcHost[i].m_key = %d\n", ok.m_key, srcHost[i].m_key);
+ printf("(ok.m_value = %d, srcHost[i].m_value = %d)\n", ok.m_value, srcHost[i].m_value);
+ }
+ if (ok.m_value != srcHost[i].m_value)
+ {
+ printf("ok.m_value = %d, srcHost[i].m_value = %d\n", ok.m_value, srcHost[i].m_value);
+ printf("(ok.m_key = %d, srcHost[i].m_key = %d)\n", ok.m_key, srcHost[i].m_key);
+ }
+
+ dstHost[destIndex] = srcHost[i];
+ counter[tableIdx]++;
+ }
+ }
+ }
+ }
+ }
+
+#endif //SEQUENTIAL
+
+ dst->copyFromHost(dstHost);
+ }
+#endif //USE_GPU
+
#ifdef DEBUG_RADIXSORT
destHisto->copyToHost(testHist);
- printf("ib = %d, testHist size = %d, non zero elements:\n",ib, testHist.size());
- for (int i=0;i<testHist.size();i++)
+ printf("ib = %d, testHist size = %d, non zero elements:\n", ib, testHist.size());
+ for (int i = 0; i < testHist.size(); i++)
{
- if (testHist[i]!=0)
- printf("testHist[%d]=%d\n",i,testHist[i]);
+ if (testHist[i] != 0)
+ printf("testHist[%d]=%d\n", i, testHist[i]);
}
-#endif //DEBUG_RADIXSORT
- b3Swap(src, dst );
- b3Swap(srcHisto,destHisto);
+#endif //DEBUG_RADIXSORT
+ b3Swap(src, dst);
+ b3Swap(srcHisto, destHisto);
#ifdef DEBUG_RADIXSORT2
- keyValuesInOut.copyToHost(test2);
- printf("numElem = %d\n",test2.size());
- for (int i=0;i<test2.size();i++)
- {
- if (test2[i].m_key != test2[i].m_value)
- {
- printf("test2[%d].m_key=%d\n",i,test2[i].m_key);
- printf("test2[%d].m_value=%d\n",i,test2[i].m_value);
- }
- }
-#endif //DEBUG_RADIXSORT2
-
- count++;
-
-
+ keyValuesInOut.copyToHost(test2);
+ printf("numElem = %d\n", test2.size());
+ for (int i = 0; i < test2.size(); i++)
+ {
+ if (test2[i].m_key != test2[i].m_value)
+ {
+ printf("test2[%d].m_key=%d\n", i, test2[i].m_key);
+ printf("test2[%d].m_value=%d\n", i, test2[i].m_value);
+ }
+ }
+#endif //DEBUG_RADIXSORT2
+
+ count++;
}
-
-
-
- if (count&1)
+
+ if (count & 1)
{
- b3Assert(0);//need to copy from workbuffer to keyValuesInOut
+ b3Assert(0); //need to copy from workbuffer to keyValuesInOut
}
if (m_workBuffer4->size())
@@ -545,153 +505,137 @@ void b3RadixSort32CL::execute(b3OpenCLArray<b3SortData>& keyValuesInOut, int sor
keyValuesInOut.copyFromOpenCLArray(*m_workBuffer4);
}
-
#ifdef DEBUG_RADIXSORT
- keyValuesInOut.copyToHost(test2);
-
- printf("numElem = %d\n",test2.size());
- for (int i=0;i<test2.size();i++)
- {
- printf("test2[%d].m_key=%d\n",i,test2[i].m_key);
- printf("test2[%d].m_value=%d\n",i,test2[i].m_value);
- }
-#endif
-
-}
-
-
-
-
+ keyValuesInOut.copyToHost(test2);
+ printf("numElem = %d\n", test2.size());
+ for (int i = 0; i < test2.size(); i++)
+ {
+ printf("test2[%d].m_key=%d\n", i, test2[i].m_key);
+ printf("test2[%d].m_value=%d\n", i, test2[i].m_value);
+ }
+#endif
+}
void b3RadixSort32CL::execute(b3OpenCLArray<unsigned int>& keysInOut, int sortBits /* = 32 */)
{
int originalSize = keysInOut.size();
int workingSize = originalSize;
-
-
+
int dataAlignment = DATA_ALIGNMENT;
b3OpenCLArray<unsigned int>* src = 0;
- if (workingSize%dataAlignment)
+ if (workingSize % dataAlignment)
{
- workingSize += dataAlignment-(workingSize%dataAlignment);
+ workingSize += dataAlignment - (workingSize % dataAlignment);
m_workBuffer4a->copyFromOpenCLArray(keysInOut);
m_workBuffer4a->resize(workingSize);
unsigned int fillValue = 0xffffffff;
-
- m_fill->execute(*m_workBuffer4a,fillValue,workingSize-originalSize,originalSize);
+
+ m_fill->execute(*m_workBuffer4a, fillValue, workingSize - originalSize, originalSize);
src = m_workBuffer4a;
- } else
+ }
+ else
{
src = &keysInOut;
m_workBuffer4a->resize(0);
}
-
-
-
- b3Assert( workingSize%DATA_ALIGNMENT == 0 );
- int minCap = NUM_BUCKET*NUM_WGS;
+ b3Assert(workingSize % DATA_ALIGNMENT == 0);
+ int minCap = NUM_BUCKET * NUM_WGS;
int n = workingSize;
-
m_workBuffer1->resize(minCap);
m_workBuffer3->resize(workingSize);
m_workBuffer3a->resize(workingSize);
-// ADLASSERT( ELEMENTS_PER_WORK_ITEM == 4 );
- b3Assert( BITS_PER_PASS == 4 );
- b3Assert( WG_SIZE == 64 );
- b3Assert( (sortBits&0x3) == 0 );
+ // ADLASSERT( ELEMENTS_PER_WORK_ITEM == 4 );
+ b3Assert(BITS_PER_PASS == 4);
+ b3Assert(WG_SIZE == 64);
+ b3Assert((sortBits & 0x3) == 0);
-
-
b3OpenCLArray<unsigned int>* dst = m_workBuffer3a;
b3OpenCLArray<unsigned int>* srcHisto = m_workBuffer1;
b3OpenCLArray<unsigned int>* destHisto = m_workBuffer2;
-
int nWGs = NUM_WGS;
b3ConstData cdata;
{
- int blockSize = ELEMENTS_PER_WORK_ITEM*WG_SIZE;//set at 256
- int nBlocks = (n+blockSize-1)/(blockSize);
+ int blockSize = ELEMENTS_PER_WORK_ITEM * WG_SIZE; //set at 256
+ int nBlocks = (n + blockSize - 1) / (blockSize);
cdata.m_n = n;
cdata.m_nWGs = NUM_WGS;
cdata.m_startBit = 0;
- cdata.m_nBlocksPerWG = (nBlocks + cdata.m_nWGs - 1)/cdata.m_nWGs;
- if( nBlocks < NUM_WGS )
+ cdata.m_nBlocksPerWG = (nBlocks + cdata.m_nWGs - 1) / cdata.m_nWGs;
+ if (nBlocks < NUM_WGS)
{
cdata.m_nBlocksPerWG = 1;
nWGs = nBlocks;
}
}
- int count=0;
- for(int ib=0; ib<sortBits; ib+=4)
+ int count = 0;
+ for (int ib = 0; ib < sortBits; ib += 4)
{
cdata.m_startBit = ib;
-
+
if (src->size())
{
- b3BufferInfoCL bInfo[] = { b3BufferInfoCL( src->getBufferCL(), true ), b3BufferInfoCL( srcHisto->getBufferCL() ) };
- b3LauncherCL launcher(m_commandQueue, m_streamCountKernel,"m_streamCountKernel");
-
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( cdata );
-
- int num = NUM_WGS*WG_SIZE;
- launcher.launch1D( num, WG_SIZE );
- }
+ b3BufferInfoCL bInfo[] = {b3BufferInfoCL(src->getBufferCL(), true), b3BufferInfoCL(srcHisto->getBufferCL())};
+ b3LauncherCL launcher(m_commandQueue, m_streamCountKernel, "m_streamCountKernel");
+
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(cdata);
-
+ int num = NUM_WGS * WG_SIZE;
+ launcher.launch1D(num, WG_SIZE);
+ }
//fast prefix scan is not working properly on Mac OSX yet
#ifdef __APPLE__
- bool fastScan=false;
+ bool fastScan = false;
#else
- bool fastScan=!m_deviceCPU;
+ bool fastScan = !m_deviceCPU;
#endif
if (fastScan)
- {// prefix scan group histogram
- b3BufferInfoCL bInfo[] = { b3BufferInfoCL( srcHisto->getBufferCL() ) };
- b3LauncherCL launcher( m_commandQueue, m_prefixScanKernel,"m_prefixScanKernel" );
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( cdata );
- launcher.launch1D( 128, 128 );
+ { // prefix scan group histogram
+ b3BufferInfoCL bInfo[] = {b3BufferInfoCL(srcHisto->getBufferCL())};
+ b3LauncherCL launcher(m_commandQueue, m_prefixScanKernel, "m_prefixScanKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(cdata);
+ launcher.launch1D(128, 128);
destHisto = srcHisto;
- }else
+ }
+ else
{
//unsigned int sum; //for debugging
- m_scan->execute(*srcHisto,*destHisto,1920,0);//,&sum);
+ m_scan->execute(*srcHisto, *destHisto, 1920, 0); //,&sum);
}
if (src->size())
- {// local sort and distribute
- b3BufferInfoCL bInfo[] = { b3BufferInfoCL( src->getBufferCL(), true ), b3BufferInfoCL( destHisto->getBufferCL(), true ), b3BufferInfoCL( dst->getBufferCL() )};
- b3LauncherCL launcher( m_commandQueue, m_sortAndScatterKernel ,"m_sortAndScatterKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( cdata );
- launcher.launch1D( nWGs*WG_SIZE, WG_SIZE );
-
+ { // local sort and distribute
+ b3BufferInfoCL bInfo[] = {b3BufferInfoCL(src->getBufferCL(), true), b3BufferInfoCL(destHisto->getBufferCL(), true), b3BufferInfoCL(dst->getBufferCL())};
+ b3LauncherCL launcher(m_commandQueue, m_sortAndScatterKernel, "m_sortAndScatterKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(cdata);
+ launcher.launch1D(nWGs * WG_SIZE, WG_SIZE);
}
-
- b3Swap(src, dst );
- b3Swap(srcHisto,destHisto);
- count++;
+ b3Swap(src, dst);
+ b3Swap(srcHisto, destHisto);
+
+ count++;
}
-
- if (count&1)
+
+ if (count & 1)
{
- b3Assert(0);//need to copy from workbuffer to keyValuesInOut
+ b3Assert(0); //need to copy from workbuffer to keyValuesInOut
}
if (m_workBuffer4a->size())
@@ -699,12 +643,4 @@ void b3RadixSort32CL::execute(b3OpenCLArray<unsigned int>& keysInOut, int sortBi
m_workBuffer4a->resize(originalSize);
keysInOut.copyFromOpenCLArray(*m_workBuffer4a);
}
-
}
-
-
-
-
-
-
-
diff --git a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3RadixSort32CL.h b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3RadixSort32CL.h
index 975bd80e53..69caf182d7 100644
--- a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3RadixSort32CL.h
+++ b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/b3RadixSort32CL.h
@@ -6,90 +6,79 @@
struct b3SortData
{
- union
- {
+ union {
unsigned int m_key;
unsigned int x;
};
- union
- {
+ union {
unsigned int m_value;
unsigned int y;
-
};
};
#include "b3BufferInfoCL.h"
-class b3RadixSort32CL
+class b3RadixSort32CL
{
+ b3OpenCLArray<unsigned int>* m_workBuffer1;
+ b3OpenCLArray<unsigned int>* m_workBuffer2;
- b3OpenCLArray<unsigned int>* m_workBuffer1;
- b3OpenCLArray<unsigned int>* m_workBuffer2;
-
- b3OpenCLArray<b3SortData>* m_workBuffer3;
- b3OpenCLArray<b3SortData>* m_workBuffer4;
-
- b3OpenCLArray<unsigned int>* m_workBuffer3a;
- b3OpenCLArray<unsigned int>* m_workBuffer4a;
+ b3OpenCLArray<b3SortData>* m_workBuffer3;
+ b3OpenCLArray<b3SortData>* m_workBuffer4;
- cl_command_queue m_commandQueue;
+ b3OpenCLArray<unsigned int>* m_workBuffer3a;
+ b3OpenCLArray<unsigned int>* m_workBuffer4a;
- cl_kernel m_streamCountSortDataKernel;
- cl_kernel m_streamCountKernel;
+ cl_command_queue m_commandQueue;
- cl_kernel m_prefixScanKernel;
- cl_kernel m_sortAndScatterSortDataKernel;
- cl_kernel m_sortAndScatterKernel;
+ cl_kernel m_streamCountSortDataKernel;
+ cl_kernel m_streamCountKernel;
+ cl_kernel m_prefixScanKernel;
+ cl_kernel m_sortAndScatterSortDataKernel;
+ cl_kernel m_sortAndScatterKernel;
- bool m_deviceCPU;
+ bool m_deviceCPU;
- class b3PrefixScanCL* m_scan;
- class b3FillCL* m_fill;
+ class b3PrefixScanCL* m_scan;
+ class b3FillCL* m_fill;
public:
struct b3ConstData
- {
- int m_n;
- int m_nWGs;
- int m_startBit;
- int m_nBlocksPerWG;
- };
+ {
+ 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
- };
-
+ {
+ 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);
- b3RadixSort32CL(cl_context ctx, cl_device_id device, cl_command_queue queue, int initialCapacity =0);
+ virtual ~b3RadixSort32CL();
- virtual ~b3RadixSort32CL();
+ void execute(b3OpenCLArray<unsigned int>& keysIn, b3OpenCLArray<unsigned int>& keysOut, b3OpenCLArray<unsigned int>& valuesIn,
+ b3OpenCLArray<unsigned int>& valuesOut, int n, int sortBits = 32);
- void execute(b3OpenCLArray<unsigned int>& keysIn, b3OpenCLArray<unsigned int>& keysOut, b3OpenCLArray<unsigned int>& valuesIn,
- b3OpenCLArray<unsigned int>& valuesOut, int n, int sortBits = 32);
-
- ///keys only
- void execute(b3OpenCLArray<unsigned int>& keysInOut, int sortBits = 32 );
-
- void execute(b3OpenCLArray<b3SortData>& keyValuesInOut, int sortBits = 32 );
- void executeHost(b3OpenCLArray<b3SortData>& keyValuesInOut, int sortBits = 32);
- void executeHost(b3AlignedObjectArray<b3SortData>& keyValuesInOut, int sortBits = 32);
+ ///keys only
+ void execute(b3OpenCLArray<unsigned int>& keysInOut, int sortBits = 32);
+ void execute(b3OpenCLArray<b3SortData>& keyValuesInOut, int sortBits = 32);
+ void executeHost(b3OpenCLArray<b3SortData>& keyValuesInOut, int sortBits = 32);
+ void executeHost(b3AlignedObjectArray<b3SortData>& keyValuesInOut, int sortBits = 32);
};
-#endif //B3_RADIXSORT32_H
-
+#endif //B3_RADIXSORT32_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/BoundSearchKernelsCL.h b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/BoundSearchKernelsCL.h
index 9c9e847138..1758dd41e3 100644
--- a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/BoundSearchKernelsCL.h
+++ b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/BoundSearchKernelsCL.h
@@ -1,87 +1,86 @@
//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"
-;
+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/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/CopyKernelsCL.h b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/CopyKernelsCL.h
index e5670e3cd3..33c9279462 100644
--- a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/CopyKernelsCL.h
+++ b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/CopyKernelsCL.h
@@ -1,132 +1,131 @@
//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"
-;
+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/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/FillKernelsCL.h b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/FillKernelsCL.h
index 4f8b96e489..983e652270 100644
--- a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/FillKernelsCL.h
+++ b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/FillKernelsCL.h
@@ -1,91 +1,90 @@
//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"
-;
+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/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/PrefixScanKernelsCL.h b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/PrefixScanKernelsCL.h
index 27baab8331..fc5e7b865c 100644
--- a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/PrefixScanKernelsCL.h
+++ b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/PrefixScanKernelsCL.h
@@ -1,129 +1,128 @@
//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<nActive; iIdx+=lSize)\n"
-" {\n"
-" int ai = offset*(2*iIdx+1)-1;\n"
-" int bi = offset*(2*iIdx+2)-1;\n"
-" data[bi] += data[ai];\n"
-" }\n"
-" }\n"
-" GROUP_LDS_BARRIER;\n"
-" if( lIdx == 0 )\n"
-" {\n"
-" blocksum = data[ n-1 ];\n"
-" data[ n-1 ] = 0;\n"
-" }\n"
-" GROUP_LDS_BARRIER;\n"
-" offset >>= 1;\n"
-" for(int nActive=1; nActive<n; nActive<<=1, offset>>=1 )\n"
-" {\n"
-" GROUP_LDS_BARRIER;\n"
-" for( int iIdx = lIdx; iIdx<nActive; iIdx += lSize )\n"
-" {\n"
-" int ai = offset*(2*iIdx+1)-1;\n"
-" int bi = offset*(2*iIdx+2)-1;\n"
-" u32 temp = data[ai];\n"
-" data[ai] = data[bi];\n"
-" data[bi] += temp;\n"
-" }\n"
-" }\n"
-" GROUP_LDS_BARRIER;\n"
-" return blocksum;\n"
-"}\n"
-"__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n"
-"__kernel\n"
-"void LocalScanKernel(__global u32* dst, __global u32 *src, __global u32 *sumBuffer,\n"
-" uint4 cb)\n"
-"{\n"
-" __local u32 ldsData[WG_SIZE*2];\n"
-" int gIdx = GET_GLOBAL_IDX;\n"
-" int lIdx = GET_LOCAL_IDX;\n"
-" ldsData[2*lIdx] = ( 2*gIdx < cb.m_numElems )? src[2*gIdx]: 0;\n"
-" ldsData[2*lIdx + 1] = ( 2*gIdx+1 < cb.m_numElems )? src[2*gIdx + 1]: 0;\n"
-" u32 sum = ScanExclusive(ldsData, WG_SIZE*2, GET_LOCAL_IDX, GET_GROUP_SIZE);\n"
-" if( lIdx == 0 ) sumBuffer[GET_GROUP_IDX] = sum;\n"
-" if( (2*gIdx) < cb.m_numElems )\n"
-" {\n"
-" dst[2*gIdx] = ldsData[2*lIdx];\n"
-" }\n"
-" if( (2*gIdx + 1) < cb.m_numElems )\n"
-" {\n"
-" dst[2*gIdx + 1] = ldsData[2*lIdx + 1];\n"
-" }\n"
-"}\n"
-"__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n"
-"__kernel\n"
-"void AddOffsetKernel(__global u32 *dst, __global u32 *blockSum, uint4 cb)\n"
-"{\n"
-" const u32 blockSize = WG_SIZE*2;\n"
-" int myIdx = GET_GROUP_IDX+1;\n"
-" int lIdx = GET_LOCAL_IDX;\n"
-" u32 iBlockSum = blockSum[myIdx];\n"
-" int endValue = min((myIdx+1)*(blockSize), cb.m_numElems);\n"
-" for(int i=myIdx*blockSize+lIdx; i<endValue; i+=GET_GROUP_SIZE)\n"
-" {\n"
-" dst[i] += iBlockSum;\n"
-" }\n"
-"}\n"
-"__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n"
-"__kernel\n"
-"void TopLevelScanKernel(__global u32* dst, uint4 cb)\n"
-"{\n"
-" __local u32 ldsData[2048];\n"
-" int gIdx = GET_GLOBAL_IDX;\n"
-" int lIdx = GET_LOCAL_IDX;\n"
-" int lSize = GET_GROUP_SIZE;\n"
-" for(int i=lIdx; i<cb.m_numScanBlocks; i+=lSize )\n"
-" {\n"
-" ldsData[i] = (i<cb.m_numBlocks)? dst[i]:0;\n"
-" }\n"
-" GROUP_LDS_BARRIER;\n"
-" u32 sum = ScanExclusive(ldsData, cb.m_numScanBlocks, GET_LOCAL_IDX, GET_GROUP_SIZE);\n"
-" for(int i=lIdx; i<cb.m_numBlocks; i+=lSize )\n"
-" {\n"
-" dst[i] = ldsData[i];\n"
-" }\n"
-" if( gIdx == 0 )\n"
-" {\n"
-" dst[cb.m_numBlocks] = sum;\n"
-" }\n"
-"}\n"
-;
+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<nActive; iIdx+=lSize)\n"
+ " {\n"
+ " int ai = offset*(2*iIdx+1)-1;\n"
+ " int bi = offset*(2*iIdx+2)-1;\n"
+ " data[bi] += data[ai];\n"
+ " }\n"
+ " }\n"
+ " GROUP_LDS_BARRIER;\n"
+ " if( lIdx == 0 )\n"
+ " {\n"
+ " blocksum = data[ n-1 ];\n"
+ " data[ n-1 ] = 0;\n"
+ " }\n"
+ " GROUP_LDS_BARRIER;\n"
+ " offset >>= 1;\n"
+ " for(int nActive=1; nActive<n; nActive<<=1, offset>>=1 )\n"
+ " {\n"
+ " GROUP_LDS_BARRIER;\n"
+ " for( int iIdx = lIdx; iIdx<nActive; iIdx += lSize )\n"
+ " {\n"
+ " int ai = offset*(2*iIdx+1)-1;\n"
+ " int bi = offset*(2*iIdx+2)-1;\n"
+ " u32 temp = data[ai];\n"
+ " data[ai] = data[bi];\n"
+ " data[bi] += temp;\n"
+ " }\n"
+ " }\n"
+ " GROUP_LDS_BARRIER;\n"
+ " return blocksum;\n"
+ "}\n"
+ "__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n"
+ "__kernel\n"
+ "void LocalScanKernel(__global u32* dst, __global u32 *src, __global u32 *sumBuffer,\n"
+ " uint4 cb)\n"
+ "{\n"
+ " __local u32 ldsData[WG_SIZE*2];\n"
+ " int gIdx = GET_GLOBAL_IDX;\n"
+ " int lIdx = GET_LOCAL_IDX;\n"
+ " ldsData[2*lIdx] = ( 2*gIdx < cb.m_numElems )? src[2*gIdx]: 0;\n"
+ " ldsData[2*lIdx + 1] = ( 2*gIdx+1 < cb.m_numElems )? src[2*gIdx + 1]: 0;\n"
+ " u32 sum = ScanExclusive(ldsData, WG_SIZE*2, GET_LOCAL_IDX, GET_GROUP_SIZE);\n"
+ " if( lIdx == 0 ) sumBuffer[GET_GROUP_IDX] = sum;\n"
+ " if( (2*gIdx) < cb.m_numElems )\n"
+ " {\n"
+ " dst[2*gIdx] = ldsData[2*lIdx];\n"
+ " }\n"
+ " if( (2*gIdx + 1) < cb.m_numElems )\n"
+ " {\n"
+ " dst[2*gIdx + 1] = ldsData[2*lIdx + 1];\n"
+ " }\n"
+ "}\n"
+ "__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n"
+ "__kernel\n"
+ "void AddOffsetKernel(__global u32 *dst, __global u32 *blockSum, uint4 cb)\n"
+ "{\n"
+ " const u32 blockSize = WG_SIZE*2;\n"
+ " int myIdx = GET_GROUP_IDX+1;\n"
+ " int lIdx = GET_LOCAL_IDX;\n"
+ " u32 iBlockSum = blockSum[myIdx];\n"
+ " int endValue = min((myIdx+1)*(blockSize), cb.m_numElems);\n"
+ " for(int i=myIdx*blockSize+lIdx; i<endValue; i+=GET_GROUP_SIZE)\n"
+ " {\n"
+ " dst[i] += iBlockSum;\n"
+ " }\n"
+ "}\n"
+ "__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n"
+ "__kernel\n"
+ "void TopLevelScanKernel(__global u32* dst, uint4 cb)\n"
+ "{\n"
+ " __local u32 ldsData[2048];\n"
+ " int gIdx = GET_GLOBAL_IDX;\n"
+ " int lIdx = GET_LOCAL_IDX;\n"
+ " int lSize = GET_GROUP_SIZE;\n"
+ " for(int i=lIdx; i<cb.m_numScanBlocks; i+=lSize )\n"
+ " {\n"
+ " ldsData[i] = (i<cb.m_numBlocks)? dst[i]:0;\n"
+ " }\n"
+ " GROUP_LDS_BARRIER;\n"
+ " u32 sum = ScanExclusive(ldsData, cb.m_numScanBlocks, GET_LOCAL_IDX, GET_GROUP_SIZE);\n"
+ " for(int i=lIdx; i<cb.m_numBlocks; i+=lSize )\n"
+ " {\n"
+ " dst[i] = ldsData[i];\n"
+ " }\n"
+ " if( gIdx == 0 )\n"
+ " {\n"
+ " dst[cb.m_numBlocks] = sum;\n"
+ " }\n"
+ "}\n";
diff --git a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/PrefixScanKernelsFloat4CL.h b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/PrefixScanKernelsFloat4CL.h
index 5b13254796..15d1bc5195 100644
--- a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/PrefixScanKernelsFloat4CL.h
+++ b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/PrefixScanKernelsFloat4CL.h
@@ -1,129 +1,128 @@
//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project
-static const char* prefixScanKernelsFloat4CL= \
-"/*\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"
-"float4 ScanExclusiveFloat4(__local float4* data, u32 n, int lIdx, int lSize)\n"
-"{\n"
-" float4 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<nActive; iIdx+=lSize)\n"
-" {\n"
-" int ai = offset*(2*iIdx+1)-1;\n"
-" int bi = offset*(2*iIdx+2)-1;\n"
-" data[bi] += data[ai];\n"
-" }\n"
-" }\n"
-" GROUP_LDS_BARRIER;\n"
-" if( lIdx == 0 )\n"
-" {\n"
-" blocksum = data[ n-1 ];\n"
-" data[ n-1 ] = 0;\n"
-" }\n"
-" GROUP_LDS_BARRIER;\n"
-" offset >>= 1;\n"
-" for(int nActive=1; nActive<n; nActive<<=1, offset>>=1 )\n"
-" {\n"
-" GROUP_LDS_BARRIER;\n"
-" for( int iIdx = lIdx; iIdx<nActive; iIdx += lSize )\n"
-" {\n"
-" int ai = offset*(2*iIdx+1)-1;\n"
-" int bi = offset*(2*iIdx+2)-1;\n"
-" float4 temp = data[ai];\n"
-" data[ai] = data[bi];\n"
-" data[bi] += temp;\n"
-" }\n"
-" }\n"
-" GROUP_LDS_BARRIER;\n"
-" return blocksum;\n"
-"}\n"
-"__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n"
-"__kernel\n"
-"void LocalScanKernel(__global float4* dst, __global float4* src, __global float4* sumBuffer, uint4 cb)\n"
-"{\n"
-" __local float4 ldsData[WG_SIZE*2];\n"
-" int gIdx = GET_GLOBAL_IDX;\n"
-" int lIdx = GET_LOCAL_IDX;\n"
-" ldsData[2*lIdx] = ( 2*gIdx < cb.m_numElems )? src[2*gIdx]: 0;\n"
-" ldsData[2*lIdx + 1] = ( 2*gIdx+1 < cb.m_numElems )? src[2*gIdx + 1]: 0;\n"
-" float4 sum = ScanExclusiveFloat4(ldsData, WG_SIZE*2, GET_LOCAL_IDX, GET_GROUP_SIZE);\n"
-" if( lIdx == 0 ) \n"
-" sumBuffer[GET_GROUP_IDX] = sum;\n"
-" if( (2*gIdx) < cb.m_numElems )\n"
-" {\n"
-" dst[2*gIdx] = ldsData[2*lIdx];\n"
-" }\n"
-" if( (2*gIdx + 1) < cb.m_numElems )\n"
-" {\n"
-" dst[2*gIdx + 1] = ldsData[2*lIdx + 1];\n"
-" }\n"
-"}\n"
-"__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n"
-"__kernel\n"
-"void AddOffsetKernel(__global float4* dst, __global float4* blockSum, uint4 cb)\n"
-"{\n"
-" const u32 blockSize = WG_SIZE*2;\n"
-" int myIdx = GET_GROUP_IDX+1;\n"
-" int lIdx = GET_LOCAL_IDX;\n"
-" float4 iBlockSum = blockSum[myIdx];\n"
-" int endValue = min((myIdx+1)*(blockSize), cb.m_numElems);\n"
-" for(int i=myIdx*blockSize+lIdx; i<endValue; i+=GET_GROUP_SIZE)\n"
-" {\n"
-" dst[i] += iBlockSum;\n"
-" }\n"
-"}\n"
-"__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n"
-"__kernel\n"
-"void TopLevelScanKernel(__global float4* dst, uint4 cb)\n"
-"{\n"
-" __local float4 ldsData[2048];\n"
-" int gIdx = GET_GLOBAL_IDX;\n"
-" int lIdx = GET_LOCAL_IDX;\n"
-" int lSize = GET_GROUP_SIZE;\n"
-" for(int i=lIdx; i<cb.m_numScanBlocks; i+=lSize )\n"
-" {\n"
-" ldsData[i] = (i<cb.m_numBlocks)? dst[i]:0;\n"
-" }\n"
-" GROUP_LDS_BARRIER;\n"
-" float4 sum = ScanExclusiveFloat4(ldsData, cb.m_numScanBlocks, GET_LOCAL_IDX, GET_GROUP_SIZE);\n"
-" for(int i=lIdx; i<cb.m_numBlocks; i+=lSize )\n"
-" {\n"
-" dst[i] = ldsData[i];\n"
-" }\n"
-" if( gIdx == 0 )\n"
-" {\n"
-" dst[cb.m_numBlocks] = sum;\n"
-" }\n"
-"}\n"
-;
+static const char* prefixScanKernelsFloat4CL =
+ "/*\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"
+ "float4 ScanExclusiveFloat4(__local float4* data, u32 n, int lIdx, int lSize)\n"
+ "{\n"
+ " float4 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<nActive; iIdx+=lSize)\n"
+ " {\n"
+ " int ai = offset*(2*iIdx+1)-1;\n"
+ " int bi = offset*(2*iIdx+2)-1;\n"
+ " data[bi] += data[ai];\n"
+ " }\n"
+ " }\n"
+ " GROUP_LDS_BARRIER;\n"
+ " if( lIdx == 0 )\n"
+ " {\n"
+ " blocksum = data[ n-1 ];\n"
+ " data[ n-1 ] = 0;\n"
+ " }\n"
+ " GROUP_LDS_BARRIER;\n"
+ " offset >>= 1;\n"
+ " for(int nActive=1; nActive<n; nActive<<=1, offset>>=1 )\n"
+ " {\n"
+ " GROUP_LDS_BARRIER;\n"
+ " for( int iIdx = lIdx; iIdx<nActive; iIdx += lSize )\n"
+ " {\n"
+ " int ai = offset*(2*iIdx+1)-1;\n"
+ " int bi = offset*(2*iIdx+2)-1;\n"
+ " float4 temp = data[ai];\n"
+ " data[ai] = data[bi];\n"
+ " data[bi] += temp;\n"
+ " }\n"
+ " }\n"
+ " GROUP_LDS_BARRIER;\n"
+ " return blocksum;\n"
+ "}\n"
+ "__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n"
+ "__kernel\n"
+ "void LocalScanKernel(__global float4* dst, __global float4* src, __global float4* sumBuffer, uint4 cb)\n"
+ "{\n"
+ " __local float4 ldsData[WG_SIZE*2];\n"
+ " int gIdx = GET_GLOBAL_IDX;\n"
+ " int lIdx = GET_LOCAL_IDX;\n"
+ " ldsData[2*lIdx] = ( 2*gIdx < cb.m_numElems )? src[2*gIdx]: 0;\n"
+ " ldsData[2*lIdx + 1] = ( 2*gIdx+1 < cb.m_numElems )? src[2*gIdx + 1]: 0;\n"
+ " float4 sum = ScanExclusiveFloat4(ldsData, WG_SIZE*2, GET_LOCAL_IDX, GET_GROUP_SIZE);\n"
+ " if( lIdx == 0 ) \n"
+ " sumBuffer[GET_GROUP_IDX] = sum;\n"
+ " if( (2*gIdx) < cb.m_numElems )\n"
+ " {\n"
+ " dst[2*gIdx] = ldsData[2*lIdx];\n"
+ " }\n"
+ " if( (2*gIdx + 1) < cb.m_numElems )\n"
+ " {\n"
+ " dst[2*gIdx + 1] = ldsData[2*lIdx + 1];\n"
+ " }\n"
+ "}\n"
+ "__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n"
+ "__kernel\n"
+ "void AddOffsetKernel(__global float4* dst, __global float4* blockSum, uint4 cb)\n"
+ "{\n"
+ " const u32 blockSize = WG_SIZE*2;\n"
+ " int myIdx = GET_GROUP_IDX+1;\n"
+ " int lIdx = GET_LOCAL_IDX;\n"
+ " float4 iBlockSum = blockSum[myIdx];\n"
+ " int endValue = min((myIdx+1)*(blockSize), cb.m_numElems);\n"
+ " for(int i=myIdx*blockSize+lIdx; i<endValue; i+=GET_GROUP_SIZE)\n"
+ " {\n"
+ " dst[i] += iBlockSum;\n"
+ " }\n"
+ "}\n"
+ "__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n"
+ "__kernel\n"
+ "void TopLevelScanKernel(__global float4* dst, uint4 cb)\n"
+ "{\n"
+ " __local float4 ldsData[2048];\n"
+ " int gIdx = GET_GLOBAL_IDX;\n"
+ " int lIdx = GET_LOCAL_IDX;\n"
+ " int lSize = GET_GROUP_SIZE;\n"
+ " for(int i=lIdx; i<cb.m_numScanBlocks; i+=lSize )\n"
+ " {\n"
+ " ldsData[i] = (i<cb.m_numBlocks)? dst[i]:0;\n"
+ " }\n"
+ " GROUP_LDS_BARRIER;\n"
+ " float4 sum = ScanExclusiveFloat4(ldsData, cb.m_numScanBlocks, GET_LOCAL_IDX, GET_GROUP_SIZE);\n"
+ " for(int i=lIdx; i<cb.m_numBlocks; i+=lSize )\n"
+ " {\n"
+ " dst[i] = ldsData[i];\n"
+ " }\n"
+ " if( gIdx == 0 )\n"
+ " {\n"
+ " dst[cb.m_numBlocks] = sum;\n"
+ " }\n"
+ "}\n";
diff --git a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/RadixSort32KernelsCL.h b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/RadixSort32KernelsCL.h
index 8876c16aa6..fb4bdda303 100644
--- a/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/RadixSort32KernelsCL.h
+++ b/thirdparty/bullet/Bullet3OpenCL/ParallelPrimitives/kernels/RadixSort32KernelsCL.h
@@ -1,910 +1,909 @@
//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project
-static const char* radixSort32KernelsCL= \
-"/*\n"
-"Bullet Continuous Collision Detection and Physics Library\n"
-"Copyright (c) 2011 Advanced Micro Devices, Inc. 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"
-"//Author 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"
-"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 AtomAdd(x, value) atom_add(&(x), value)\n"
-"#define SELECT_UINT4( b, a, condition ) select( b,a,condition )\n"
-"#define make_uint4 (uint4)\n"
-"#define make_uint2 (uint2)\n"
-"#define make_int2 (int2)\n"
-"#define WG_SIZE 64\n"
-"#define ELEMENTS_PER_WORK_ITEM (256/WG_SIZE)\n"
-"#define BITS_PER_PASS 4\n"
-"#define NUM_BUCKET (1<<BITS_PER_PASS)\n"
-"typedef uchar u8;\n"
-"// this isn't optimization for VLIW. But just reducing writes. \n"
-"#define USE_2LEVEL_REDUCE 1\n"
-"//#define CHECK_BOUNDARY 1\n"
-"//#define NV_GPU 1\n"
-"// Cypress\n"
-"#define nPerWI 16\n"
-"// Cayman\n"
-"//#define nPerWI 20\n"
-"#define m_n x\n"
-"#define m_nWGs y\n"
-"#define m_startBit z\n"
-"#define m_nBlocksPerWG w\n"
-"/*\n"
-"typedef struct\n"
-"{\n"
-" int m_n;\n"
-" int m_nWGs;\n"
-" int m_startBit;\n"
-" int m_nBlocksPerWG;\n"
-"} ConstBuffer;\n"
-"*/\n"
-"typedef struct\n"
-"{\n"
-" unsigned int m_key;\n"
-" unsigned int m_value;\n"
-"} SortDataCL;\n"
-"uint prefixScanVectorEx( uint4* data )\n"
-"{\n"
-" u32 sum = 0;\n"
-" u32 tmp = data[0].x;\n"
-" data[0].x = sum;\n"
-" sum += tmp;\n"
-" tmp = data[0].y;\n"
-" data[0].y = sum;\n"
-" sum += tmp;\n"
-" tmp = data[0].z;\n"
-" data[0].z = sum;\n"
-" sum += tmp;\n"
-" tmp = data[0].w;\n"
-" data[0].w = sum;\n"
-" sum += tmp;\n"
-" return sum;\n"
-"}\n"
-"u32 localPrefixSum( u32 pData, uint lIdx, uint* totalSum, __local u32* sorterSharedMemory, int wgSize /*64 or 128*/ )\n"
-"{\n"
-" { // Set data\n"
-" sorterSharedMemory[lIdx] = 0;\n"
-" sorterSharedMemory[lIdx+wgSize] = pData;\n"
-" }\n"
-" GROUP_LDS_BARRIER;\n"
-" { // Prefix sum\n"
-" int idx = 2*lIdx + (wgSize+1);\n"
-"#if defined(USE_2LEVEL_REDUCE)\n"
-" if( lIdx < 64 )\n"
-" {\n"
-" u32 u0, u1, u2;\n"
-" u0 = sorterSharedMemory[idx-3];\n"
-" u1 = sorterSharedMemory[idx-2];\n"
-" u2 = sorterSharedMemory[idx-1];\n"
-" AtomAdd( sorterSharedMemory[idx], u0+u1+u2 ); \n"
-" GROUP_MEM_FENCE;\n"
-" u0 = sorterSharedMemory[idx-12];\n"
-" u1 = sorterSharedMemory[idx-8];\n"
-" u2 = sorterSharedMemory[idx-4];\n"
-" AtomAdd( sorterSharedMemory[idx], u0+u1+u2 ); \n"
-" GROUP_MEM_FENCE;\n"
-" u0 = sorterSharedMemory[idx-48];\n"
-" u1 = sorterSharedMemory[idx-32];\n"
-" u2 = sorterSharedMemory[idx-16];\n"
-" AtomAdd( sorterSharedMemory[idx], u0+u1+u2 ); \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"
-"#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<NUM_BUCKET; i++)\n"
-" {\n"
-" MY_HISTOGRAM(i) = 0;\n"
-" }\n"
-" GROUP_LDS_BARRIER;\n"
-" const int blockSize = ELEMENTS_PER_WORK_ITEM*WG_SIZE;\n"
-" u32 localKey;\n"
-" int nBlocks = (n)/blockSize - nBlocksPerWG*wgIdx;\n"
-" int addr = blockSize*nBlocksPerWG*wgIdx + ELEMENTS_PER_WORK_ITEM*lIdx;\n"
-" for(int iblock=0; iblock<min(nBlocksPerWG, nBlocks); iblock++, addr+=blockSize)\n"
-" {\n"
-" // MY_HISTOGRAM( localKeys.x ) ++ is much expensive than atomic add as it requires read and write while atomics can just add on AMD\n"
-" // Using registers didn't perform well. It seems like use localKeys to address requires a lot of alu ops\n"
-" // AMD: AtomInc performs better while NV prefers ++\n"
-" for(int i=0; i<ELEMENTS_PER_WORK_ITEM; i++)\n"
-" {\n"
-"#if defined(CHECK_BOUNDARY)\n"
-" if( addr+i < n )\n"
-"#endif\n"
-" {\n"
-" localKey = (gSrc[addr+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<GET_GROUP_SIZE; i++)\n"
-" {\n"
-" sum += localHistogramMat[lIdx*WG_SIZE+(i+lIdx)%GET_GROUP_SIZE];\n"
-" }\n"
-" histogramOut[lIdx*nWGs+wgIdx] = sum;\n"
-" }\n"
-"}\n"
-"__kernel\n"
-"__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n"
-"void StreamCountSortDataKernel( __global SortDataCL* 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<NUM_BUCKET; i++)\n"
-" {\n"
-" MY_HISTOGRAM(i) = 0;\n"
-" }\n"
-" GROUP_LDS_BARRIER;\n"
-" const int blockSize = ELEMENTS_PER_WORK_ITEM*WG_SIZE;\n"
-" u32 localKey;\n"
-" int nBlocks = (n)/blockSize - nBlocksPerWG*wgIdx;\n"
-" int addr = blockSize*nBlocksPerWG*wgIdx + ELEMENTS_PER_WORK_ITEM*lIdx;\n"
-" for(int iblock=0; iblock<min(nBlocksPerWG, nBlocks); iblock++, addr+=blockSize)\n"
-" {\n"
-" // MY_HISTOGRAM( localKeys.x ) ++ is much expensive than atomic add as it requires read and write while atomics can just add on AMD\n"
-" // Using registers didn't perform well. It seems like use localKeys to address requires a lot of alu ops\n"
-" // AMD: AtomInc performs better while NV prefers ++\n"
-" for(int i=0; i<ELEMENTS_PER_WORK_ITEM; i++)\n"
-" {\n"
-"#if defined(CHECK_BOUNDARY)\n"
-" if( addr+i < n )\n"
-"#endif\n"
-" {\n"
-" localKey = (gSrc[addr+i].m_key>>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<GET_GROUP_SIZE; i++)\n"
-" {\n"
-" sum += localHistogramMat[lIdx*WG_SIZE+(i+lIdx)%GET_GROUP_SIZE];\n"
-" }\n"
-" histogramOut[lIdx*nWGs+wgIdx] = sum;\n"
-" }\n"
-"}\n"
-"#define nPerLane (nPerWI/4)\n"
-"// NUM_BUCKET*nWGs < 128*nPerWI\n"
-"__kernel\n"
-"__attribute__((reqd_work_group_size(128,1,1)))\n"
-"void PrefixScanKernel( __global u32* wHistogram1, int4 cb )\n"
-"{\n"
-" __local u32 ldsTopScanData[128*2];\n"
-" u32 lIdx = GET_LOCAL_IDX;\n"
-" u32 wgIdx = GET_GROUP_IDX;\n"
-" const int nWGs = cb.m_nWGs;\n"
-" u32 data[nPerWI];\n"
-" for(int i=0; i<nPerWI; i++)\n"
-" {\n"
-" data[i] = 0;\n"
-" if( (nPerWI*lIdx+i) < NUM_BUCKET*nWGs )\n"
-" data[i] = wHistogram1[nPerWI*lIdx+i];\n"
-" }\n"
-" uint4 myData = make_uint4(0,0,0,0);\n"
-" for(int i=0; i<nPerLane; i++)\n"
-" {\n"
-" myData.x += data[nPerLane*0+i];\n"
-" myData.y += data[nPerLane*1+i];\n"
-" myData.z += data[nPerLane*2+i];\n"
-" myData.w += data[nPerLane*3+i];\n"
-" }\n"
-" uint totalSum;\n"
-" uint4 scanned = localPrefixSum128V( myData, lIdx, &totalSum, ldsTopScanData );\n"
-"// for(int j=0; j<4; j++) // somehow it introduces a lot of branches\n"
-" { int j = 0;\n"
-" u32 sum = 0;\n"
-" for(int i=0; i<nPerLane; i++)\n"
-" {\n"
-" u32 tmp = data[nPerLane*j+i];\n"
-" data[nPerLane*j+i] = sum;\n"
-" sum += tmp;\n"
-" }\n"
-" }\n"
-" { int j = 1;\n"
-" u32 sum = 0;\n"
-" for(int i=0; i<nPerLane; i++)\n"
-" {\n"
-" u32 tmp = data[nPerLane*j+i];\n"
-" data[nPerLane*j+i] = sum;\n"
-" sum += tmp;\n"
-" }\n"
-" }\n"
-" { int j = 2;\n"
-" u32 sum = 0;\n"
-" for(int i=0; i<nPerLane; i++)\n"
-" {\n"
-" u32 tmp = data[nPerLane*j+i];\n"
-" data[nPerLane*j+i] = sum;\n"
-" sum += tmp;\n"
-" }\n"
-" }\n"
-" { int j = 3;\n"
-" u32 sum = 0;\n"
-" for(int i=0; i<nPerLane; i++)\n"
-" {\n"
-" u32 tmp = data[nPerLane*j+i];\n"
-" data[nPerLane*j+i] = sum;\n"
-" sum += tmp;\n"
-" }\n"
-" }\n"
-" for(int i=0; i<nPerLane; i++)\n"
-" {\n"
-" data[nPerLane*0+i] += scanned.x;\n"
-" data[nPerLane*1+i] += scanned.y;\n"
-" data[nPerLane*2+i] += scanned.z;\n"
-" data[nPerLane*3+i] += scanned.w;\n"
-" }\n"
-" for(int i=0; i<nPerWI; i++)\n"
-" {\n"
-" int index = nPerWI*lIdx+i;\n"
-" if (index < NUM_BUCKET*nWGs)\n"
-" wHistogram1[nPerWI*lIdx+i] = data[i];\n"
-" }\n"
-"}\n"
-"// 4 scan, 4 exchange\n"
-"void sort4Bits(u32 sortData[4], int startBit, int lIdx, __local u32* ldsSortData)\n"
-"{\n"
-" for(int bitIdx=0; bitIdx<BITS_PER_PASS; bitIdx++)\n"
-" {\n"
-" u32 mask = (1<<bitIdx);\n"
-" uint4 cmpResult = make_uint4( (sortData[0]>>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<BITS_PER_PASS; ibit+=2)\n"
-" {\n"
-" uint4 b = make_uint4((sortData[0]>>(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<min(nBlocksPerWG, nBlocks); iblock++, addr+=blockSize)\n"
-" {\n"
-" u32 myHistogram = 0;\n"
-" u32 sortData[ELEMENTS_PER_WORK_ITEM];\n"
-" for(int i=0; i<ELEMENTS_PER_WORK_ITEM; i++)\n"
-"#if defined(CHECK_BOUNDARY)\n"
-" sortData[i] = ( addr+i < n )? gSrc[ addr+i ] : 0xffffffff;\n"
-"#else\n"
-" sortData[i] = gSrc[ addr+i ];\n"
-"#endif\n"
-" sort4Bits(sortData, startBit, lIdx, ldsSortData);\n"
-" u32 keys[ELEMENTS_PER_WORK_ITEM];\n"
-" for(int i=0; i<ELEMENTS_PER_WORK_ITEM; i++)\n"
-" keys[i] = (sortData[i]>>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<ELEMENTS_PER_WORK_ITEM; i++)\n"
-"#if defined(CHECK_BOUNDARY)\n"
-" if( addr+i < n )\n"
-"#endif\n"
-"#if defined(NV_GPU)\n"
-" SET_HISTOGRAM( setIdx, keys[i] )++;\n"
-"#else\n"
-" AtomInc( SET_HISTOGRAM( setIdx, keys[i] ) );\n"
-"#endif\n"
-" \n"
-" GROUP_LDS_BARRIER;\n"
-" \n"
-" uint hIdx = NUM_BUCKET+lIdx;\n"
-" if( lIdx < NUM_BUCKET )\n"
-" {\n"
-" u32 sum = 0;\n"
-" for(int i=0; i<WG_SIZE/16; i++)\n"
-" {\n"
-" sum += SET_HISTOGRAM( i, lIdx );\n"
-" }\n"
-" myHistogram = sum;\n"
-" localHistogram[hIdx] = sum;\n"
-" }\n"
-" GROUP_LDS_BARRIER;\n"
-"#if defined(USE_2LEVEL_REDUCE)\n"
-" if( lIdx < NUM_BUCKET )\n"
-" {\n"
-" localHistogram[hIdx] = localHistogram[hIdx-1];\n"
-" GROUP_MEM_FENCE;\n"
-" u32 u0, u1, u2;\n"
-" u0 = localHistogram[hIdx-3];\n"
-" u1 = localHistogram[hIdx-2];\n"
-" u2 = localHistogram[hIdx-1];\n"
-" AtomAdd( localHistogram[hIdx], u0 + u1 + u2 );\n"
-" GROUP_MEM_FENCE;\n"
-" u0 = localHistogram[hIdx-12];\n"
-" u1 = localHistogram[hIdx-8];\n"
-" u2 = localHistogram[hIdx-4];\n"
-" AtomAdd( localHistogram[hIdx], u0 + u1 + u2 );\n"
-" GROUP_MEM_FENCE;\n"
-" }\n"
-"#else\n"
-" if( lIdx < NUM_BUCKET )\n"
-" {\n"
-" localHistogram[hIdx] = localHistogram[hIdx-1];\n"
-" GROUP_MEM_FENCE;\n"
-" localHistogram[hIdx] += localHistogram[hIdx-1];\n"
-" GROUP_MEM_FENCE;\n"
-" localHistogram[hIdx] += localHistogram[hIdx-2];\n"
-" GROUP_MEM_FENCE;\n"
-" localHistogram[hIdx] += localHistogram[hIdx-4];\n"
-" GROUP_MEM_FENCE;\n"
-" localHistogram[hIdx] += localHistogram[hIdx-8];\n"
-" GROUP_MEM_FENCE;\n"
-" }\n"
-"#endif\n"
-" GROUP_LDS_BARRIER;\n"
-" }\n"
-" {\n"
-" for(int ie=0; ie<ELEMENTS_PER_WORK_ITEM; ie++)\n"
-" {\n"
-" int dataIdx = ELEMENTS_PER_WORK_ITEM*lIdx+ie;\n"
-" int binIdx = keys[ie];\n"
-" int groupOffset = localHistogramToCarry[binIdx];\n"
-" int myIdx = dataIdx - localHistogram[NUM_BUCKET+binIdx];\n"
-"#if defined(CHECK_BOUNDARY)\n"
-" if( addr+ie < n )\n"
-"#endif\n"
-" gDst[ groupOffset + myIdx ] = sortData[ie];\n"
-" }\n"
-" }\n"
-" GROUP_LDS_BARRIER;\n"
-" if( lIdx < NUM_BUCKET )\n"
-" {\n"
-" localHistogramToCarry[lIdx] += myHistogram;\n"
-" }\n"
-" GROUP_LDS_BARRIER;\n"
-" }\n"
-"}\n"
-"// 2 scan, 2 exchange\n"
-"void sort4Bits1KeyValue(u32 sortData[4], int sortVal[4], int startBit, int lIdx, __local u32* ldsSortData, __local int *ldsSortVal)\n"
-"{\n"
-" for(uint ibit=0; ibit<BITS_PER_PASS; ibit+=2)\n"
-" {\n"
-" uint4 b = make_uint4((sortData[0]>>(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<min(nBlocksPerWG, nBlocks); iblock++, addr+=blockSize)\n"
-" {\n"
-" u32 myHistogram = 0;\n"
-" int sortData[ELEMENTS_PER_WORK_ITEM];\n"
-" int sortVal[ELEMENTS_PER_WORK_ITEM];\n"
-" for(int i=0; i<ELEMENTS_PER_WORK_ITEM; i++)\n"
-"#if defined(CHECK_BOUNDARY)\n"
-" {\n"
-" sortData[i] = ( addr+i < n )? gSrc[ addr+i ].m_key : 0xffffffff;\n"
-" sortVal[i] = ( addr+i < n )? gSrc[ addr+i ].m_value : 0xffffffff;\n"
-" }\n"
-"#else\n"
-" {\n"
-" sortData[i] = gSrc[ addr+i ].m_key;\n"
-" sortVal[i] = gSrc[ addr+i ].m_value;\n"
-" }\n"
-"#endif\n"
-" sort4Bits1KeyValue(sortData, sortVal, startBit, lIdx, ldsSortData, ldsSortVal);\n"
-" u32 keys[ELEMENTS_PER_WORK_ITEM];\n"
-" for(int i=0; i<ELEMENTS_PER_WORK_ITEM; i++)\n"
-" keys[i] = (sortData[i]>>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<ELEMENTS_PER_WORK_ITEM; i++)\n"
-"#if defined(CHECK_BOUNDARY)\n"
-" if( addr+i < n )\n"
-"#endif\n"
-"#if defined(NV_GPU)\n"
-" SET_HISTOGRAM( setIdx, keys[i] )++;\n"
-"#else\n"
-" AtomInc( SET_HISTOGRAM( setIdx, keys[i] ) );\n"
-"#endif\n"
-" \n"
-" GROUP_LDS_BARRIER;\n"
-" \n"
-" uint hIdx = NUM_BUCKET+lIdx;\n"
-" if( lIdx < NUM_BUCKET )\n"
-" {\n"
-" u32 sum = 0;\n"
-" for(int i=0; i<WG_SIZE/16; i++)\n"
-" {\n"
-" sum += SET_HISTOGRAM( i, lIdx );\n"
-" }\n"
-" myHistogram = sum;\n"
-" localHistogram[hIdx] = sum;\n"
-" }\n"
-" GROUP_LDS_BARRIER;\n"
-"#if defined(USE_2LEVEL_REDUCE)\n"
-" if( lIdx < NUM_BUCKET )\n"
-" {\n"
-" localHistogram[hIdx] = localHistogram[hIdx-1];\n"
-" GROUP_MEM_FENCE;\n"
-" u32 u0, u1, u2;\n"
-" u0 = localHistogram[hIdx-3];\n"
-" u1 = localHistogram[hIdx-2];\n"
-" u2 = localHistogram[hIdx-1];\n"
-" AtomAdd( localHistogram[hIdx], u0 + u1 + u2 );\n"
-" GROUP_MEM_FENCE;\n"
-" u0 = localHistogram[hIdx-12];\n"
-" u1 = localHistogram[hIdx-8];\n"
-" u2 = localHistogram[hIdx-4];\n"
-" AtomAdd( localHistogram[hIdx], u0 + u1 + u2 );\n"
-" GROUP_MEM_FENCE;\n"
-" }\n"
-"#else\n"
-" if( lIdx < NUM_BUCKET )\n"
-" {\n"
-" localHistogram[hIdx] = localHistogram[hIdx-1];\n"
-" GROUP_MEM_FENCE;\n"
-" localHistogram[hIdx] += localHistogram[hIdx-1];\n"
-" GROUP_MEM_FENCE;\n"
-" localHistogram[hIdx] += localHistogram[hIdx-2];\n"
-" GROUP_MEM_FENCE;\n"
-" localHistogram[hIdx] += localHistogram[hIdx-4];\n"
-" GROUP_MEM_FENCE;\n"
-" localHistogram[hIdx] += localHistogram[hIdx-8];\n"
-" GROUP_MEM_FENCE;\n"
-" }\n"
-"#endif\n"
-" GROUP_LDS_BARRIER;\n"
-" }\n"
-" {\n"
-" for(int ie=0; ie<ELEMENTS_PER_WORK_ITEM; ie++)\n"
-" {\n"
-" int dataIdx = ELEMENTS_PER_WORK_ITEM*lIdx+ie;\n"
-" int binIdx = keys[ie];\n"
-" int groupOffset = localHistogramToCarry[binIdx];\n"
-" int myIdx = dataIdx - localHistogram[NUM_BUCKET+binIdx];\n"
-"#if defined(CHECK_BOUNDARY)\n"
-" if( addr+ie < n )\n"
-" {\n"
-" if ((groupOffset + myIdx)<n)\n"
-" {\n"
-" if (sortData[ie]==sortVal[ie])\n"
-" {\n"
-" \n"
-" SortDataCL tmp;\n"
-" tmp.m_key = sortData[ie];\n"
-" tmp.m_value = sortVal[ie];\n"
-" if (tmp.m_key == tmp.m_value)\n"
-" gDst[groupOffset + myIdx ] = tmp;\n"
-" }\n"
-" \n"
-" }\n"
-" }\n"
-"#else\n"
-" if ((groupOffset + myIdx)<n)\n"
-" {\n"
-" gDst[ groupOffset + myIdx ].m_key = sortData[ie];\n"
-" gDst[ groupOffset + myIdx ].m_value = sortVal[ie];\n"
-" }\n"
-"#endif\n"
-" }\n"
-" }\n"
-" GROUP_LDS_BARRIER;\n"
-" if( lIdx < NUM_BUCKET )\n"
-" {\n"
-" localHistogramToCarry[lIdx] += myHistogram;\n"
-" }\n"
-" GROUP_LDS_BARRIER;\n"
-" }\n"
-"}\n"
-"__kernel\n"
-"__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n"
-"void SortAndScatterSortDataKernelSerial( __global const SortDataCL* restrict gSrc, __global const u32* rHistogram, __global SortDataCL* 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<NUM_BUCKET;c++)\n"
-" counter[c]=0;\n"
-" const int blockSize = ELEMENTS_PER_WORK_ITEM*WG_SIZE;\n"
-" \n"
-" int nBlocks = (n)/blockSize - nBlocksPerWG*wgIdx;\n"
-" for(int iblock=0; iblock<min(nBlocksPerWG, nBlocks); iblock++)\n"
-" {\n"
-" for (int lIdx=0;lIdx<WG_SIZE;lIdx++)\n"
-" {\n"
-" int addr2 = iblock*blockSize + blockSize*nBlocksPerWG*wgIdx + ELEMENTS_PER_WORK_ITEM*lIdx;\n"
-" \n"
-" for(int j=0; j<ELEMENTS_PER_WORK_ITEM; j++)\n"
-" {\n"
-" int i = addr2+j;\n"
-" if( i < n )\n"
-" {\n"
-" int tableIdx;\n"
-" tableIdx = (gSrc[i].m_key>>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<NUM_BUCKET;c++)\n"
-" counter[c]=0;\n"
-" const int blockSize = ELEMENTS_PER_WORK_ITEM*WG_SIZE;\n"
-" \n"
-" int nBlocks = (n)/blockSize - nBlocksPerWG*wgIdx;\n"
-" for(int iblock=0; iblock<min(nBlocksPerWG, nBlocks); iblock++)\n"
-" {\n"
-" for (int lIdx=0;lIdx<WG_SIZE;lIdx++)\n"
-" {\n"
-" int addr2 = iblock*blockSize + blockSize*nBlocksPerWG*wgIdx + ELEMENTS_PER_WORK_ITEM*lIdx;\n"
-" \n"
-" for(int j=0; j<ELEMENTS_PER_WORK_ITEM; j++)\n"
-" {\n"
-" int i = addr2+j;\n"
-" if( i < n )\n"
-" {\n"
-" int tableIdx;\n"
-" tableIdx = (gSrc[i]>>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"
-;
+static const char* radixSort32KernelsCL =
+ "/*\n"
+ "Bullet Continuous Collision Detection and Physics Library\n"
+ "Copyright (c) 2011 Advanced Micro Devices, Inc. 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"
+ "//Author 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"
+ "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 AtomAdd(x, value) atom_add(&(x), value)\n"
+ "#define SELECT_UINT4( b, a, condition ) select( b,a,condition )\n"
+ "#define make_uint4 (uint4)\n"
+ "#define make_uint2 (uint2)\n"
+ "#define make_int2 (int2)\n"
+ "#define WG_SIZE 64\n"
+ "#define ELEMENTS_PER_WORK_ITEM (256/WG_SIZE)\n"
+ "#define BITS_PER_PASS 4\n"
+ "#define NUM_BUCKET (1<<BITS_PER_PASS)\n"
+ "typedef uchar u8;\n"
+ "// this isn't optimization for VLIW. But just reducing writes. \n"
+ "#define USE_2LEVEL_REDUCE 1\n"
+ "//#define CHECK_BOUNDARY 1\n"
+ "//#define NV_GPU 1\n"
+ "// Cypress\n"
+ "#define nPerWI 16\n"
+ "// Cayman\n"
+ "//#define nPerWI 20\n"
+ "#define m_n x\n"
+ "#define m_nWGs y\n"
+ "#define m_startBit z\n"
+ "#define m_nBlocksPerWG w\n"
+ "/*\n"
+ "typedef struct\n"
+ "{\n"
+ " int m_n;\n"
+ " int m_nWGs;\n"
+ " int m_startBit;\n"
+ " int m_nBlocksPerWG;\n"
+ "} ConstBuffer;\n"
+ "*/\n"
+ "typedef struct\n"
+ "{\n"
+ " unsigned int m_key;\n"
+ " unsigned int m_value;\n"
+ "} SortDataCL;\n"
+ "uint prefixScanVectorEx( uint4* data )\n"
+ "{\n"
+ " u32 sum = 0;\n"
+ " u32 tmp = data[0].x;\n"
+ " data[0].x = sum;\n"
+ " sum += tmp;\n"
+ " tmp = data[0].y;\n"
+ " data[0].y = sum;\n"
+ " sum += tmp;\n"
+ " tmp = data[0].z;\n"
+ " data[0].z = sum;\n"
+ " sum += tmp;\n"
+ " tmp = data[0].w;\n"
+ " data[0].w = sum;\n"
+ " sum += tmp;\n"
+ " return sum;\n"
+ "}\n"
+ "u32 localPrefixSum( u32 pData, uint lIdx, uint* totalSum, __local u32* sorterSharedMemory, int wgSize /*64 or 128*/ )\n"
+ "{\n"
+ " { // Set data\n"
+ " sorterSharedMemory[lIdx] = 0;\n"
+ " sorterSharedMemory[lIdx+wgSize] = pData;\n"
+ " }\n"
+ " GROUP_LDS_BARRIER;\n"
+ " { // Prefix sum\n"
+ " int idx = 2*lIdx + (wgSize+1);\n"
+ "#if defined(USE_2LEVEL_REDUCE)\n"
+ " if( lIdx < 64 )\n"
+ " {\n"
+ " u32 u0, u1, u2;\n"
+ " u0 = sorterSharedMemory[idx-3];\n"
+ " u1 = sorterSharedMemory[idx-2];\n"
+ " u2 = sorterSharedMemory[idx-1];\n"
+ " AtomAdd( sorterSharedMemory[idx], u0+u1+u2 ); \n"
+ " GROUP_MEM_FENCE;\n"
+ " u0 = sorterSharedMemory[idx-12];\n"
+ " u1 = sorterSharedMemory[idx-8];\n"
+ " u2 = sorterSharedMemory[idx-4];\n"
+ " AtomAdd( sorterSharedMemory[idx], u0+u1+u2 ); \n"
+ " GROUP_MEM_FENCE;\n"
+ " u0 = sorterSharedMemory[idx-48];\n"
+ " u1 = sorterSharedMemory[idx-32];\n"
+ " u2 = sorterSharedMemory[idx-16];\n"
+ " AtomAdd( sorterSharedMemory[idx], u0+u1+u2 ); \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"
+ "#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<NUM_BUCKET; i++)\n"
+ " {\n"
+ " MY_HISTOGRAM(i) = 0;\n"
+ " }\n"
+ " GROUP_LDS_BARRIER;\n"
+ " const int blockSize = ELEMENTS_PER_WORK_ITEM*WG_SIZE;\n"
+ " u32 localKey;\n"
+ " int nBlocks = (n)/blockSize - nBlocksPerWG*wgIdx;\n"
+ " int addr = blockSize*nBlocksPerWG*wgIdx + ELEMENTS_PER_WORK_ITEM*lIdx;\n"
+ " for(int iblock=0; iblock<min(nBlocksPerWG, nBlocks); iblock++, addr+=blockSize)\n"
+ " {\n"
+ " // MY_HISTOGRAM( localKeys.x ) ++ is much expensive than atomic add as it requires read and write while atomics can just add on AMD\n"
+ " // Using registers didn't perform well. It seems like use localKeys to address requires a lot of alu ops\n"
+ " // AMD: AtomInc performs better while NV prefers ++\n"
+ " for(int i=0; i<ELEMENTS_PER_WORK_ITEM; i++)\n"
+ " {\n"
+ "#if defined(CHECK_BOUNDARY)\n"
+ " if( addr+i < n )\n"
+ "#endif\n"
+ " {\n"
+ " localKey = (gSrc[addr+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<GET_GROUP_SIZE; i++)\n"
+ " {\n"
+ " sum += localHistogramMat[lIdx*WG_SIZE+(i+lIdx)%GET_GROUP_SIZE];\n"
+ " }\n"
+ " histogramOut[lIdx*nWGs+wgIdx] = sum;\n"
+ " }\n"
+ "}\n"
+ "__kernel\n"
+ "__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n"
+ "void StreamCountSortDataKernel( __global SortDataCL* 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<NUM_BUCKET; i++)\n"
+ " {\n"
+ " MY_HISTOGRAM(i) = 0;\n"
+ " }\n"
+ " GROUP_LDS_BARRIER;\n"
+ " const int blockSize = ELEMENTS_PER_WORK_ITEM*WG_SIZE;\n"
+ " u32 localKey;\n"
+ " int nBlocks = (n)/blockSize - nBlocksPerWG*wgIdx;\n"
+ " int addr = blockSize*nBlocksPerWG*wgIdx + ELEMENTS_PER_WORK_ITEM*lIdx;\n"
+ " for(int iblock=0; iblock<min(nBlocksPerWG, nBlocks); iblock++, addr+=blockSize)\n"
+ " {\n"
+ " // MY_HISTOGRAM( localKeys.x ) ++ is much expensive than atomic add as it requires read and write while atomics can just add on AMD\n"
+ " // Using registers didn't perform well. It seems like use localKeys to address requires a lot of alu ops\n"
+ " // AMD: AtomInc performs better while NV prefers ++\n"
+ " for(int i=0; i<ELEMENTS_PER_WORK_ITEM; i++)\n"
+ " {\n"
+ "#if defined(CHECK_BOUNDARY)\n"
+ " if( addr+i < n )\n"
+ "#endif\n"
+ " {\n"
+ " localKey = (gSrc[addr+i].m_key>>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<GET_GROUP_SIZE; i++)\n"
+ " {\n"
+ " sum += localHistogramMat[lIdx*WG_SIZE+(i+lIdx)%GET_GROUP_SIZE];\n"
+ " }\n"
+ " histogramOut[lIdx*nWGs+wgIdx] = sum;\n"
+ " }\n"
+ "}\n"
+ "#define nPerLane (nPerWI/4)\n"
+ "// NUM_BUCKET*nWGs < 128*nPerWI\n"
+ "__kernel\n"
+ "__attribute__((reqd_work_group_size(128,1,1)))\n"
+ "void PrefixScanKernel( __global u32* wHistogram1, int4 cb )\n"
+ "{\n"
+ " __local u32 ldsTopScanData[128*2];\n"
+ " u32 lIdx = GET_LOCAL_IDX;\n"
+ " u32 wgIdx = GET_GROUP_IDX;\n"
+ " const int nWGs = cb.m_nWGs;\n"
+ " u32 data[nPerWI];\n"
+ " for(int i=0; i<nPerWI; i++)\n"
+ " {\n"
+ " data[i] = 0;\n"
+ " if( (nPerWI*lIdx+i) < NUM_BUCKET*nWGs )\n"
+ " data[i] = wHistogram1[nPerWI*lIdx+i];\n"
+ " }\n"
+ " uint4 myData = make_uint4(0,0,0,0);\n"
+ " for(int i=0; i<nPerLane; i++)\n"
+ " {\n"
+ " myData.x += data[nPerLane*0+i];\n"
+ " myData.y += data[nPerLane*1+i];\n"
+ " myData.z += data[nPerLane*2+i];\n"
+ " myData.w += data[nPerLane*3+i];\n"
+ " }\n"
+ " uint totalSum;\n"
+ " uint4 scanned = localPrefixSum128V( myData, lIdx, &totalSum, ldsTopScanData );\n"
+ "// for(int j=0; j<4; j++) // somehow it introduces a lot of branches\n"
+ " { int j = 0;\n"
+ " u32 sum = 0;\n"
+ " for(int i=0; i<nPerLane; i++)\n"
+ " {\n"
+ " u32 tmp = data[nPerLane*j+i];\n"
+ " data[nPerLane*j+i] = sum;\n"
+ " sum += tmp;\n"
+ " }\n"
+ " }\n"
+ " { int j = 1;\n"
+ " u32 sum = 0;\n"
+ " for(int i=0; i<nPerLane; i++)\n"
+ " {\n"
+ " u32 tmp = data[nPerLane*j+i];\n"
+ " data[nPerLane*j+i] = sum;\n"
+ " sum += tmp;\n"
+ " }\n"
+ " }\n"
+ " { int j = 2;\n"
+ " u32 sum = 0;\n"
+ " for(int i=0; i<nPerLane; i++)\n"
+ " {\n"
+ " u32 tmp = data[nPerLane*j+i];\n"
+ " data[nPerLane*j+i] = sum;\n"
+ " sum += tmp;\n"
+ " }\n"
+ " }\n"
+ " { int j = 3;\n"
+ " u32 sum = 0;\n"
+ " for(int i=0; i<nPerLane; i++)\n"
+ " {\n"
+ " u32 tmp = data[nPerLane*j+i];\n"
+ " data[nPerLane*j+i] = sum;\n"
+ " sum += tmp;\n"
+ " }\n"
+ " }\n"
+ " for(int i=0; i<nPerLane; i++)\n"
+ " {\n"
+ " data[nPerLane*0+i] += scanned.x;\n"
+ " data[nPerLane*1+i] += scanned.y;\n"
+ " data[nPerLane*2+i] += scanned.z;\n"
+ " data[nPerLane*3+i] += scanned.w;\n"
+ " }\n"
+ " for(int i=0; i<nPerWI; i++)\n"
+ " {\n"
+ " int index = nPerWI*lIdx+i;\n"
+ " if (index < NUM_BUCKET*nWGs)\n"
+ " wHistogram1[nPerWI*lIdx+i] = data[i];\n"
+ " }\n"
+ "}\n"
+ "// 4 scan, 4 exchange\n"
+ "void sort4Bits(u32 sortData[4], int startBit, int lIdx, __local u32* ldsSortData)\n"
+ "{\n"
+ " for(int bitIdx=0; bitIdx<BITS_PER_PASS; bitIdx++)\n"
+ " {\n"
+ " u32 mask = (1<<bitIdx);\n"
+ " uint4 cmpResult = make_uint4( (sortData[0]>>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<BITS_PER_PASS; ibit+=2)\n"
+ " {\n"
+ " uint4 b = make_uint4((sortData[0]>>(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<min(nBlocksPerWG, nBlocks); iblock++, addr+=blockSize)\n"
+ " {\n"
+ " u32 myHistogram = 0;\n"
+ " u32 sortData[ELEMENTS_PER_WORK_ITEM];\n"
+ " for(int i=0; i<ELEMENTS_PER_WORK_ITEM; i++)\n"
+ "#if defined(CHECK_BOUNDARY)\n"
+ " sortData[i] = ( addr+i < n )? gSrc[ addr+i ] : 0xffffffff;\n"
+ "#else\n"
+ " sortData[i] = gSrc[ addr+i ];\n"
+ "#endif\n"
+ " sort4Bits(sortData, startBit, lIdx, ldsSortData);\n"
+ " u32 keys[ELEMENTS_PER_WORK_ITEM];\n"
+ " for(int i=0; i<ELEMENTS_PER_WORK_ITEM; i++)\n"
+ " keys[i] = (sortData[i]>>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<ELEMENTS_PER_WORK_ITEM; i++)\n"
+ "#if defined(CHECK_BOUNDARY)\n"
+ " if( addr+i < n )\n"
+ "#endif\n"
+ "#if defined(NV_GPU)\n"
+ " SET_HISTOGRAM( setIdx, keys[i] )++;\n"
+ "#else\n"
+ " AtomInc( SET_HISTOGRAM( setIdx, keys[i] ) );\n"
+ "#endif\n"
+ " \n"
+ " GROUP_LDS_BARRIER;\n"
+ " \n"
+ " uint hIdx = NUM_BUCKET+lIdx;\n"
+ " if( lIdx < NUM_BUCKET )\n"
+ " {\n"
+ " u32 sum = 0;\n"
+ " for(int i=0; i<WG_SIZE/16; i++)\n"
+ " {\n"
+ " sum += SET_HISTOGRAM( i, lIdx );\n"
+ " }\n"
+ " myHistogram = sum;\n"
+ " localHistogram[hIdx] = sum;\n"
+ " }\n"
+ " GROUP_LDS_BARRIER;\n"
+ "#if defined(USE_2LEVEL_REDUCE)\n"
+ " if( lIdx < NUM_BUCKET )\n"
+ " {\n"
+ " localHistogram[hIdx] = localHistogram[hIdx-1];\n"
+ " GROUP_MEM_FENCE;\n"
+ " u32 u0, u1, u2;\n"
+ " u0 = localHistogram[hIdx-3];\n"
+ " u1 = localHistogram[hIdx-2];\n"
+ " u2 = localHistogram[hIdx-1];\n"
+ " AtomAdd( localHistogram[hIdx], u0 + u1 + u2 );\n"
+ " GROUP_MEM_FENCE;\n"
+ " u0 = localHistogram[hIdx-12];\n"
+ " u1 = localHistogram[hIdx-8];\n"
+ " u2 = localHistogram[hIdx-4];\n"
+ " AtomAdd( localHistogram[hIdx], u0 + u1 + u2 );\n"
+ " GROUP_MEM_FENCE;\n"
+ " }\n"
+ "#else\n"
+ " if( lIdx < NUM_BUCKET )\n"
+ " {\n"
+ " localHistogram[hIdx] = localHistogram[hIdx-1];\n"
+ " GROUP_MEM_FENCE;\n"
+ " localHistogram[hIdx] += localHistogram[hIdx-1];\n"
+ " GROUP_MEM_FENCE;\n"
+ " localHistogram[hIdx] += localHistogram[hIdx-2];\n"
+ " GROUP_MEM_FENCE;\n"
+ " localHistogram[hIdx] += localHistogram[hIdx-4];\n"
+ " GROUP_MEM_FENCE;\n"
+ " localHistogram[hIdx] += localHistogram[hIdx-8];\n"
+ " GROUP_MEM_FENCE;\n"
+ " }\n"
+ "#endif\n"
+ " GROUP_LDS_BARRIER;\n"
+ " }\n"
+ " {\n"
+ " for(int ie=0; ie<ELEMENTS_PER_WORK_ITEM; ie++)\n"
+ " {\n"
+ " int dataIdx = ELEMENTS_PER_WORK_ITEM*lIdx+ie;\n"
+ " int binIdx = keys[ie];\n"
+ " int groupOffset = localHistogramToCarry[binIdx];\n"
+ " int myIdx = dataIdx - localHistogram[NUM_BUCKET+binIdx];\n"
+ "#if defined(CHECK_BOUNDARY)\n"
+ " if( addr+ie < n )\n"
+ "#endif\n"
+ " gDst[ groupOffset + myIdx ] = sortData[ie];\n"
+ " }\n"
+ " }\n"
+ " GROUP_LDS_BARRIER;\n"
+ " if( lIdx < NUM_BUCKET )\n"
+ " {\n"
+ " localHistogramToCarry[lIdx] += myHistogram;\n"
+ " }\n"
+ " GROUP_LDS_BARRIER;\n"
+ " }\n"
+ "}\n"
+ "// 2 scan, 2 exchange\n"
+ "void sort4Bits1KeyValue(u32 sortData[4], int sortVal[4], int startBit, int lIdx, __local u32* ldsSortData, __local int *ldsSortVal)\n"
+ "{\n"
+ " for(uint ibit=0; ibit<BITS_PER_PASS; ibit+=2)\n"
+ " {\n"
+ " uint4 b = make_uint4((sortData[0]>>(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<min(nBlocksPerWG, nBlocks); iblock++, addr+=blockSize)\n"
+ " {\n"
+ " u32 myHistogram = 0;\n"
+ " int sortData[ELEMENTS_PER_WORK_ITEM];\n"
+ " int sortVal[ELEMENTS_PER_WORK_ITEM];\n"
+ " for(int i=0; i<ELEMENTS_PER_WORK_ITEM; i++)\n"
+ "#if defined(CHECK_BOUNDARY)\n"
+ " {\n"
+ " sortData[i] = ( addr+i < n )? gSrc[ addr+i ].m_key : 0xffffffff;\n"
+ " sortVal[i] = ( addr+i < n )? gSrc[ addr+i ].m_value : 0xffffffff;\n"
+ " }\n"
+ "#else\n"
+ " {\n"
+ " sortData[i] = gSrc[ addr+i ].m_key;\n"
+ " sortVal[i] = gSrc[ addr+i ].m_value;\n"
+ " }\n"
+ "#endif\n"
+ " sort4Bits1KeyValue(sortData, sortVal, startBit, lIdx, ldsSortData, ldsSortVal);\n"
+ " u32 keys[ELEMENTS_PER_WORK_ITEM];\n"
+ " for(int i=0; i<ELEMENTS_PER_WORK_ITEM; i++)\n"
+ " keys[i] = (sortData[i]>>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<ELEMENTS_PER_WORK_ITEM; i++)\n"
+ "#if defined(CHECK_BOUNDARY)\n"
+ " if( addr+i < n )\n"
+ "#endif\n"
+ "#if defined(NV_GPU)\n"
+ " SET_HISTOGRAM( setIdx, keys[i] )++;\n"
+ "#else\n"
+ " AtomInc( SET_HISTOGRAM( setIdx, keys[i] ) );\n"
+ "#endif\n"
+ " \n"
+ " GROUP_LDS_BARRIER;\n"
+ " \n"
+ " uint hIdx = NUM_BUCKET+lIdx;\n"
+ " if( lIdx < NUM_BUCKET )\n"
+ " {\n"
+ " u32 sum = 0;\n"
+ " for(int i=0; i<WG_SIZE/16; i++)\n"
+ " {\n"
+ " sum += SET_HISTOGRAM( i, lIdx );\n"
+ " }\n"
+ " myHistogram = sum;\n"
+ " localHistogram[hIdx] = sum;\n"
+ " }\n"
+ " GROUP_LDS_BARRIER;\n"
+ "#if defined(USE_2LEVEL_REDUCE)\n"
+ " if( lIdx < NUM_BUCKET )\n"
+ " {\n"
+ " localHistogram[hIdx] = localHistogram[hIdx-1];\n"
+ " GROUP_MEM_FENCE;\n"
+ " u32 u0, u1, u2;\n"
+ " u0 = localHistogram[hIdx-3];\n"
+ " u1 = localHistogram[hIdx-2];\n"
+ " u2 = localHistogram[hIdx-1];\n"
+ " AtomAdd( localHistogram[hIdx], u0 + u1 + u2 );\n"
+ " GROUP_MEM_FENCE;\n"
+ " u0 = localHistogram[hIdx-12];\n"
+ " u1 = localHistogram[hIdx-8];\n"
+ " u2 = localHistogram[hIdx-4];\n"
+ " AtomAdd( localHistogram[hIdx], u0 + u1 + u2 );\n"
+ " GROUP_MEM_FENCE;\n"
+ " }\n"
+ "#else\n"
+ " if( lIdx < NUM_BUCKET )\n"
+ " {\n"
+ " localHistogram[hIdx] = localHistogram[hIdx-1];\n"
+ " GROUP_MEM_FENCE;\n"
+ " localHistogram[hIdx] += localHistogram[hIdx-1];\n"
+ " GROUP_MEM_FENCE;\n"
+ " localHistogram[hIdx] += localHistogram[hIdx-2];\n"
+ " GROUP_MEM_FENCE;\n"
+ " localHistogram[hIdx] += localHistogram[hIdx-4];\n"
+ " GROUP_MEM_FENCE;\n"
+ " localHistogram[hIdx] += localHistogram[hIdx-8];\n"
+ " GROUP_MEM_FENCE;\n"
+ " }\n"
+ "#endif\n"
+ " GROUP_LDS_BARRIER;\n"
+ " }\n"
+ " {\n"
+ " for(int ie=0; ie<ELEMENTS_PER_WORK_ITEM; ie++)\n"
+ " {\n"
+ " int dataIdx = ELEMENTS_PER_WORK_ITEM*lIdx+ie;\n"
+ " int binIdx = keys[ie];\n"
+ " int groupOffset = localHistogramToCarry[binIdx];\n"
+ " int myIdx = dataIdx - localHistogram[NUM_BUCKET+binIdx];\n"
+ "#if defined(CHECK_BOUNDARY)\n"
+ " if( addr+ie < n )\n"
+ " {\n"
+ " if ((groupOffset + myIdx)<n)\n"
+ " {\n"
+ " if (sortData[ie]==sortVal[ie])\n"
+ " {\n"
+ " \n"
+ " SortDataCL tmp;\n"
+ " tmp.m_key = sortData[ie];\n"
+ " tmp.m_value = sortVal[ie];\n"
+ " if (tmp.m_key == tmp.m_value)\n"
+ " gDst[groupOffset + myIdx ] = tmp;\n"
+ " }\n"
+ " \n"
+ " }\n"
+ " }\n"
+ "#else\n"
+ " if ((groupOffset + myIdx)<n)\n"
+ " {\n"
+ " gDst[ groupOffset + myIdx ].m_key = sortData[ie];\n"
+ " gDst[ groupOffset + myIdx ].m_value = sortVal[ie];\n"
+ " }\n"
+ "#endif\n"
+ " }\n"
+ " }\n"
+ " GROUP_LDS_BARRIER;\n"
+ " if( lIdx < NUM_BUCKET )\n"
+ " {\n"
+ " localHistogramToCarry[lIdx] += myHistogram;\n"
+ " }\n"
+ " GROUP_LDS_BARRIER;\n"
+ " }\n"
+ "}\n"
+ "__kernel\n"
+ "__attribute__((reqd_work_group_size(WG_SIZE,1,1)))\n"
+ "void SortAndScatterSortDataKernelSerial( __global const SortDataCL* restrict gSrc, __global const u32* rHistogram, __global SortDataCL* 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<NUM_BUCKET;c++)\n"
+ " counter[c]=0;\n"
+ " const int blockSize = ELEMENTS_PER_WORK_ITEM*WG_SIZE;\n"
+ " \n"
+ " int nBlocks = (n)/blockSize - nBlocksPerWG*wgIdx;\n"
+ " for(int iblock=0; iblock<min(nBlocksPerWG, nBlocks); iblock++)\n"
+ " {\n"
+ " for (int lIdx=0;lIdx<WG_SIZE;lIdx++)\n"
+ " {\n"
+ " int addr2 = iblock*blockSize + blockSize*nBlocksPerWG*wgIdx + ELEMENTS_PER_WORK_ITEM*lIdx;\n"
+ " \n"
+ " for(int j=0; j<ELEMENTS_PER_WORK_ITEM; j++)\n"
+ " {\n"
+ " int i = addr2+j;\n"
+ " if( i < n )\n"
+ " {\n"
+ " int tableIdx;\n"
+ " tableIdx = (gSrc[i].m_key>>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<NUM_BUCKET;c++)\n"
+ " counter[c]=0;\n"
+ " const int blockSize = ELEMENTS_PER_WORK_ITEM*WG_SIZE;\n"
+ " \n"
+ " int nBlocks = (n)/blockSize - nBlocksPerWG*wgIdx;\n"
+ " for(int iblock=0; iblock<min(nBlocksPerWG, nBlocks); iblock++)\n"
+ " {\n"
+ " for (int lIdx=0;lIdx<WG_SIZE;lIdx++)\n"
+ " {\n"
+ " int addr2 = iblock*blockSize + blockSize*nBlocksPerWG*wgIdx + ELEMENTS_PER_WORK_ITEM*lIdx;\n"
+ " \n"
+ " for(int j=0; j<ELEMENTS_PER_WORK_ITEM; j++)\n"
+ " {\n"
+ " int i = addr2+j;\n"
+ " if( i < n )\n"
+ " {\n"
+ " int tableIdx;\n"
+ " tableIdx = (gSrc[i]>>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/thirdparty/bullet/Bullet3OpenCL/Raycast/b3GpuRaycast.cpp b/thirdparty/bullet/Bullet3OpenCL/Raycast/b3GpuRaycast.cpp
index 161e304f09..6571f30548 100644
--- a/thirdparty/bullet/Bullet3OpenCL/Raycast/b3GpuRaycast.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/Raycast/b3GpuRaycast.cpp
@@ -4,7 +4,6 @@
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h"
#include "Bullet3OpenCL/RigidBody/b3GpuNarrowPhaseInternalData.h"
-
#include "Bullet3OpenCL/Initialize/b3OpenCLUtils.h"
#include "Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h"
#include "Bullet3OpenCL/ParallelPrimitives/b3LauncherCL.h"
@@ -15,38 +14,35 @@
#include "Bullet3OpenCL/Raycast/kernels/rayCastKernels.h"
-
#define B3_RAYCAST_PATH "src/Bullet3OpenCL/Raycast/kernels/rayCastKernels.cl"
-
-
struct b3GpuRaycastInternalData
{
cl_context m_context;
cl_device_id m_device;
- cl_command_queue m_q;
+ cl_command_queue m_q;
cl_kernel m_raytraceKernel;
cl_kernel m_raytracePairsKernel;
cl_kernel m_findRayRigidPairIndexRanges;
-
+
b3GpuParallelLinearBvh* m_plbvh;
b3RadixSort32CL* m_radixSorter;
b3FillCL* m_fill;
-
+
//1 element per ray
b3OpenCLArray<b3RayInfo>* m_gpuRays;
b3OpenCLArray<b3RayHit>* m_gpuHitResults;
b3OpenCLArray<int>* m_firstRayRigidPairIndexPerRay;
b3OpenCLArray<int>* m_numRayRigidPairsPerRay;
-
+
//1 element per (ray index, rigid index) pair, where the ray intersects with the rigid's AABB
b3OpenCLArray<int>* m_gpuNumRayRigidPairs;
- b3OpenCLArray<b3Int2>* m_gpuRayRigidPairs; //x == ray index, y == rigid index
-
+ b3OpenCLArray<b3Int2>* m_gpuRayRigidPairs; //x == ray index, y == rigid index
+
int m_test;
};
-b3GpuRaycast::b3GpuRaycast(cl_context ctx,cl_device_id device, cl_command_queue q)
+b3GpuRaycast::b3GpuRaycast(cl_context ctx, cl_device_id device, cl_command_queue q)
{
m_data = new b3GpuRaycastInternalData;
m_data->m_context = ctx;
@@ -59,7 +55,7 @@ b3GpuRaycast::b3GpuRaycast(cl_context ctx,cl_device_id device, cl_command_queue
m_data->m_plbvh = new b3GpuParallelLinearBvh(ctx, device, q);
m_data->m_radixSorter = new b3RadixSort32CL(ctx, device, q);
m_data->m_fill = new b3FillCL(ctx, device, q);
-
+
m_data->m_gpuRays = new b3OpenCLArray<b3RayInfo>(ctx, q);
m_data->m_gpuHitResults = new b3OpenCLArray<b3RayHit>(ctx, q);
m_data->m_firstRayRigidPairIndexPerRay = new b3OpenCLArray<int>(ctx, q);
@@ -68,19 +64,17 @@ b3GpuRaycast::b3GpuRaycast(cl_context ctx,cl_device_id device, cl_command_queue
m_data->m_gpuRayRigidPairs = new b3OpenCLArray<b3Int2>(ctx, q);
{
- cl_int errNum=0;
- cl_program prog = b3OpenCLUtils::compileCLProgramFromString(m_data->m_context,m_data->m_device,rayCastKernelCL,&errNum,"",B3_RAYCAST_PATH);
- b3Assert(errNum==CL_SUCCESS);
- m_data->m_raytraceKernel = b3OpenCLUtils::compileCLKernelFromString(m_data->m_context, m_data->m_device,rayCastKernelCL, "rayCastKernel",&errNum,prog);
- b3Assert(errNum==CL_SUCCESS);
- m_data->m_raytracePairsKernel = b3OpenCLUtils::compileCLKernelFromString(m_data->m_context, m_data->m_device,rayCastKernelCL, "rayCastPairsKernel",&errNum,prog);
- b3Assert(errNum==CL_SUCCESS);
- m_data->m_findRayRigidPairIndexRanges = b3OpenCLUtils::compileCLKernelFromString(m_data->m_context, m_data->m_device,rayCastKernelCL, "findRayRigidPairIndexRanges",&errNum,prog);
- b3Assert(errNum==CL_SUCCESS);
+ cl_int errNum = 0;
+ cl_program prog = b3OpenCLUtils::compileCLProgramFromString(m_data->m_context, m_data->m_device, rayCastKernelCL, &errNum, "", B3_RAYCAST_PATH);
+ b3Assert(errNum == CL_SUCCESS);
+ m_data->m_raytraceKernel = b3OpenCLUtils::compileCLKernelFromString(m_data->m_context, m_data->m_device, rayCastKernelCL, "rayCastKernel", &errNum, prog);
+ b3Assert(errNum == CL_SUCCESS);
+ m_data->m_raytracePairsKernel = b3OpenCLUtils::compileCLKernelFromString(m_data->m_context, m_data->m_device, rayCastKernelCL, "rayCastPairsKernel", &errNum, prog);
+ b3Assert(errNum == CL_SUCCESS);
+ m_data->m_findRayRigidPairIndexRanges = b3OpenCLUtils::compileCLKernelFromString(m_data->m_context, m_data->m_device, rayCastKernelCL, "findRayRigidPairIndexRanges", &errNum, prog);
+ b3Assert(errNum == CL_SUCCESS);
clReleaseProgram(prog);
}
-
-
}
b3GpuRaycast::~b3GpuRaycast()
@@ -88,78 +82,80 @@ b3GpuRaycast::~b3GpuRaycast()
clReleaseKernel(m_data->m_raytraceKernel);
clReleaseKernel(m_data->m_raytracePairsKernel);
clReleaseKernel(m_data->m_findRayRigidPairIndexRanges);
-
+
delete m_data->m_plbvh;
delete m_data->m_radixSorter;
delete m_data->m_fill;
-
+
delete m_data->m_gpuRays;
delete m_data->m_gpuHitResults;
delete m_data->m_firstRayRigidPairIndexPerRay;
delete m_data->m_numRayRigidPairsPerRay;
delete m_data->m_gpuNumRayRigidPairs;
delete m_data->m_gpuRayRigidPairs;
-
+
delete m_data;
}
-bool sphere_intersect(const b3Vector3& spherePos, b3Scalar radius, const b3Vector3& rayFrom, const b3Vector3& rayTo, float& hitFraction)
+bool sphere_intersect(const b3Vector3& spherePos, b3Scalar radius, const b3Vector3& rayFrom, const b3Vector3& rayTo, float& hitFraction)
{
- b3Vector3 rs = rayFrom - spherePos;
- b3Vector3 rayDir = rayTo-rayFrom;
-
- float A = b3Dot(rayDir,rayDir);
- float B = b3Dot(rs, rayDir);
- float C = b3Dot(rs, rs) - (radius * radius);
-
- float D = B * B - A*C;
-
- if (D > 0.0)
- {
- float t = (-B - sqrt(D))/A;
-
- if ( (t >= 0.0f) && (t < hitFraction) )
- {
+ b3Vector3 rs = rayFrom - spherePos;
+ b3Vector3 rayDir = rayTo - rayFrom;
+
+ float A = b3Dot(rayDir, rayDir);
+ float B = b3Dot(rs, rayDir);
+ float C = b3Dot(rs, rs) - (radius * radius);
+
+ float D = B * B - A * C;
+
+ if (D > 0.0)
+ {
+ float t = (-B - sqrt(D)) / A;
+
+ if ((t >= 0.0f) && (t < hitFraction))
+ {
hitFraction = t;
- return true;
+ return true;
}
}
return false;
}
bool rayConvex(const b3Vector3& rayFromLocal, const b3Vector3& rayToLocal, const b3ConvexPolyhedronData& poly,
- const b3AlignedObjectArray<b3GpuFace>& faces, float& hitFraction, b3Vector3& hitNormal)
+ const b3AlignedObjectArray<b3GpuFace>& faces, float& hitFraction, b3Vector3& hitNormal)
{
float exitFraction = hitFraction;
float enterFraction = -0.1f;
- b3Vector3 curHitNormal=b3MakeVector3(0,0,0);
- for (int i=0;i<poly.m_numFaces;i++)
+ b3Vector3 curHitNormal = b3MakeVector3(0, 0, 0);
+ for (int i = 0; i < poly.m_numFaces; i++)
{
- const b3GpuFace& face = faces[poly.m_faceOffset+i];
- float fromPlaneDist = b3Dot(rayFromLocal,face.m_plane)+face.m_plane.w;
- float toPlaneDist = b3Dot(rayToLocal,face.m_plane)+face.m_plane.w;
- if (fromPlaneDist<0.f)
+ const b3GpuFace& face = faces[poly.m_faceOffset + i];
+ float fromPlaneDist = b3Dot(rayFromLocal, face.m_plane) + face.m_plane.w;
+ float toPlaneDist = b3Dot(rayToLocal, face.m_plane) + face.m_plane.w;
+ if (fromPlaneDist < 0.f)
{
if (toPlaneDist >= 0.f)
{
- float fraction = fromPlaneDist / (fromPlaneDist-toPlaneDist);
- if (exitFraction>fraction)
+ float fraction = fromPlaneDist / (fromPlaneDist - toPlaneDist);
+ if (exitFraction > fraction)
{
exitFraction = fraction;
}
- }
- } else
+ }
+ }
+ else
{
- if (toPlaneDist<0.f)
+ if (toPlaneDist < 0.f)
{
- float fraction = fromPlaneDist / (fromPlaneDist-toPlaneDist);
+ float fraction = fromPlaneDist / (fromPlaneDist - toPlaneDist);
if (enterFraction <= fraction)
{
enterFraction = fraction;
curHitNormal = face.m_plane;
curHitNormal.w = 0.f;
}
- } else
+ }
+ else
{
return false;
}
@@ -176,44 +172,41 @@ bool rayConvex(const b3Vector3& rayFromLocal, const b3Vector3& rayToLocal, const
return true;
}
-void b3GpuRaycast::castRaysHost(const b3AlignedObjectArray<b3RayInfo>& rays, b3AlignedObjectArray<b3RayHit>& hitResults,
- int numBodies,const struct b3RigidBodyData* bodies, int numCollidables,const struct b3Collidable* collidables, const struct b3GpuNarrowPhaseInternalData* narrowphaseData)
+void b3GpuRaycast::castRaysHost(const b3AlignedObjectArray<b3RayInfo>& rays, b3AlignedObjectArray<b3RayHit>& hitResults,
+ int numBodies, const struct b3RigidBodyData* bodies, int numCollidables, const struct b3Collidable* collidables, const struct b3GpuNarrowPhaseInternalData* narrowphaseData)
{
-
-// return castRays(rays,hitResults,numBodies,bodies,numCollidables,collidables);
+ // return castRays(rays,hitResults,numBodies,bodies,numCollidables,collidables);
B3_PROFILE("castRaysHost");
- for (int r=0;r<rays.size();r++)
+ for (int r = 0; r < rays.size(); r++)
{
b3Vector3 rayFrom = rays[r].m_from;
b3Vector3 rayTo = rays[r].m_to;
float hitFraction = hitResults[r].m_hitFraction;
- int hitBodyIndex= -1;
+ int hitBodyIndex = -1;
b3Vector3 hitNormal;
- for (int b=0;b<numBodies;b++)
+ for (int b = 0; b < numBodies; b++)
{
-
const b3Vector3& pos = bodies[b].m_pos;
//const b3Quaternion& orn = bodies[b].m_quat;
-
+
switch (collidables[bodies[b].m_collidableIdx].m_shapeType)
{
- case SHAPE_SPHERE:
+ case SHAPE_SPHERE:
{
b3Scalar radius = collidables[bodies[b].m_collidableIdx].m_radius;
- if (sphere_intersect(pos, radius, rayFrom, rayTo,hitFraction))
+ if (sphere_intersect(pos, radius, rayFrom, rayTo, hitFraction))
{
hitBodyIndex = b;
b3Vector3 hitPoint;
- hitPoint.setInterpolate3(rays[r].m_from, rays[r].m_to,hitFraction);
- hitNormal = (hitPoint-bodies[b].m_pos).normalize();
+ hitPoint.setInterpolate3(rays[r].m_from, rays[r].m_to, hitFraction);
+ hitNormal = (hitPoint - bodies[b].m_pos).normalize();
}
}
- case SHAPE_CONVEX_HULL:
+ case SHAPE_CONVEX_HULL:
{
-
b3Transform convexWorldTransform;
convexWorldTransform.setIdentity();
convexWorldTransform.setOrigin(bodies[b].m_pos);
@@ -222,72 +215,67 @@ void b3GpuRaycast::castRaysHost(const b3AlignedObjectArray<b3RayInfo>& rays, b3A
b3Vector3 rayFromLocal = convexWorld2Local(rayFrom);
b3Vector3 rayToLocal = convexWorld2Local(rayTo);
-
-
+
int shapeIndex = collidables[bodies[b].m_collidableIdx].m_shapeIndex;
const b3ConvexPolyhedronData& poly = narrowphaseData->m_convexPolyhedra[shapeIndex];
- if (rayConvex(rayFromLocal, rayToLocal,poly,narrowphaseData->m_convexFaces, hitFraction, hitNormal))
+ if (rayConvex(rayFromLocal, rayToLocal, poly, narrowphaseData->m_convexFaces, hitFraction, hitNormal))
{
hitBodyIndex = b;
}
-
break;
}
- default:
+ default:
{
- static bool once=true;
+ static bool once = true;
if (once)
{
- once=false;
+ once = false;
b3Warning("Raytest: unsupported shape type\n");
}
}
}
}
- if (hitBodyIndex>=0)
+ if (hitBodyIndex >= 0)
{
-
hitResults[r].m_hitFraction = hitFraction;
- hitResults[r].m_hitPoint.setInterpolate3(rays[r].m_from, rays[r].m_to,hitFraction);
+ hitResults[r].m_hitPoint.setInterpolate3(rays[r].m_from, rays[r].m_to, hitFraction);
hitResults[r].m_hitNormal = hitNormal;
hitResults[r].m_hitBody = hitBodyIndex;
}
-
}
}
///todo: add some acceleration structure (AABBs, tree etc)
-void b3GpuRaycast::castRays(const b3AlignedObjectArray<b3RayInfo>& rays, b3AlignedObjectArray<b3RayHit>& hitResults,
- int numBodies,const struct b3RigidBodyData* bodies, int numCollidables, const struct b3Collidable* collidables,
- const struct b3GpuNarrowPhaseInternalData* narrowphaseData, class b3GpuBroadphaseInterface* broadphase)
+void b3GpuRaycast::castRays(const b3AlignedObjectArray<b3RayInfo>& rays, b3AlignedObjectArray<b3RayHit>& hitResults,
+ int numBodies, const struct b3RigidBodyData* bodies, int numCollidables, const struct b3Collidable* collidables,
+ const struct b3GpuNarrowPhaseInternalData* narrowphaseData, class b3GpuBroadphaseInterface* broadphase)
{
//castRaysHost(rays,hitResults,numBodies,bodies,numCollidables,collidables,narrowphaseData);
B3_PROFILE("castRaysGPU");
-
+
{
B3_PROFILE("raycast copyFromHost");
m_data->m_gpuRays->copyFromHost(rays);
m_data->m_gpuHitResults->copyFromHost(hitResults);
-
}
-
+
int numRays = hitResults.size();
{
m_data->m_firstRayRigidPairIndexPerRay->resize(numRays);
m_data->m_numRayRigidPairsPerRay->resize(numRays);
-
+
m_data->m_gpuNumRayRigidPairs->resize(1);
m_data->m_gpuRayRigidPairs->resize(numRays * 16);
}
-
+
//run kernel
const bool USE_BRUTE_FORCE_RAYCAST = false;
- if(USE_BRUTE_FORCE_RAYCAST)
+ if (USE_BRUTE_FORCE_RAYCAST)
{
B3_PROFILE("raycast launch1D");
- b3LauncherCL launcher(m_data->m_q,m_data->m_raytraceKernel,"m_raytraceKernel");
+ b3LauncherCL launcher(m_data->m_q, m_data->m_raytraceKernel, "m_raytraceKernel");
int numRays = rays.size();
launcher.setConst(numRays);
@@ -299,93 +287,88 @@ void b3GpuRaycast::castRays(const b3AlignedObjectArray<b3RayInfo>& rays, b3Align
launcher.setBuffer(narrowphaseData->m_collidablesGPU->getBufferCL());
launcher.setBuffer(narrowphaseData->m_convexFacesGPU->getBufferCL());
launcher.setBuffer(narrowphaseData->m_convexPolyhedraGPU->getBufferCL());
-
+
launcher.launch1D(numRays);
clFinish(m_data->m_q);
}
else
{
- m_data->m_plbvh->build( broadphase->getAllAabbsGPU(), broadphase->getSmallAabbIndicesGPU(), broadphase->getLargeAabbIndicesGPU() );
+ m_data->m_plbvh->build(broadphase->getAllAabbsGPU(), broadphase->getSmallAabbIndicesGPU(), broadphase->getLargeAabbIndicesGPU());
m_data->m_plbvh->testRaysAgainstBvhAabbs(*m_data->m_gpuRays, *m_data->m_gpuNumRayRigidPairs, *m_data->m_gpuRayRigidPairs);
-
+
int numRayRigidPairs = -1;
m_data->m_gpuNumRayRigidPairs->copyToHostPointer(&numRayRigidPairs, 1);
- if( numRayRigidPairs > m_data->m_gpuRayRigidPairs->size() )
+ if (numRayRigidPairs > m_data->m_gpuRayRigidPairs->size())
{
numRayRigidPairs = m_data->m_gpuRayRigidPairs->size();
m_data->m_gpuNumRayRigidPairs->copyFromHostPointer(&numRayRigidPairs, 1);
}
-
- m_data->m_gpuRayRigidPairs->resize(numRayRigidPairs); //Radix sort needs b3OpenCLArray::size() to be correct
-
+
+ m_data->m_gpuRayRigidPairs->resize(numRayRigidPairs); //Radix sort needs b3OpenCLArray::size() to be correct
+
//Sort ray-rigid pairs by ray index
{
B3_PROFILE("sort ray-rigid pairs");
- m_data->m_radixSorter->execute( *reinterpret_cast< b3OpenCLArray<b3SortData>* >(m_data->m_gpuRayRigidPairs) );
+ m_data->m_radixSorter->execute(*reinterpret_cast<b3OpenCLArray<b3SortData>*>(m_data->m_gpuRayRigidPairs));
}
-
+
//detect start,count of each ray pair
{
B3_PROFILE("detect ray-rigid pair index ranges");
-
+
{
B3_PROFILE("reset ray-rigid pair index ranges");
-
- m_data->m_fill->execute(*m_data->m_firstRayRigidPairIndexPerRay, numRayRigidPairs, numRays); //atomic_min used to find first index
+
+ m_data->m_fill->execute(*m_data->m_firstRayRigidPairIndexPerRay, numRayRigidPairs, numRays); //atomic_min used to find first index
m_data->m_fill->execute(*m_data->m_numRayRigidPairsPerRay, 0, numRays);
clFinish(m_data->m_q);
}
-
- b3BufferInfoCL bufferInfo[] =
- {
- b3BufferInfoCL( m_data->m_gpuRayRigidPairs->getBufferCL() ),
-
- b3BufferInfoCL( m_data->m_firstRayRigidPairIndexPerRay->getBufferCL() ),
- b3BufferInfoCL( m_data->m_numRayRigidPairsPerRay->getBufferCL() )
- };
-
+
+ b3BufferInfoCL bufferInfo[] =
+ {
+ b3BufferInfoCL(m_data->m_gpuRayRigidPairs->getBufferCL()),
+
+ b3BufferInfoCL(m_data->m_firstRayRigidPairIndexPerRay->getBufferCL()),
+ b3BufferInfoCL(m_data->m_numRayRigidPairsPerRay->getBufferCL())};
+
b3LauncherCL launcher(m_data->m_q, m_data->m_findRayRigidPairIndexRanges, "m_findRayRigidPairIndexRanges");
- launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) );
+ launcher.setBuffers(bufferInfo, sizeof(bufferInfo) / sizeof(b3BufferInfoCL));
launcher.setConst(numRayRigidPairs);
-
+
launcher.launch1D(numRayRigidPairs);
clFinish(m_data->m_q);
}
-
+
{
B3_PROFILE("ray-rigid intersection");
-
- b3BufferInfoCL bufferInfo[] =
- {
- b3BufferInfoCL( m_data->m_gpuRays->getBufferCL() ),
- b3BufferInfoCL( m_data->m_gpuHitResults->getBufferCL() ),
- b3BufferInfoCL( m_data->m_firstRayRigidPairIndexPerRay->getBufferCL() ),
- b3BufferInfoCL( m_data->m_numRayRigidPairsPerRay->getBufferCL() ),
-
- b3BufferInfoCL( narrowphaseData->m_bodyBufferGPU->getBufferCL() ),
- b3BufferInfoCL( narrowphaseData->m_collidablesGPU->getBufferCL() ),
- b3BufferInfoCL( narrowphaseData->m_convexFacesGPU->getBufferCL() ),
- b3BufferInfoCL( narrowphaseData->m_convexPolyhedraGPU->getBufferCL() ),
-
- b3BufferInfoCL( m_data->m_gpuRayRigidPairs->getBufferCL() )
- };
-
+
+ b3BufferInfoCL bufferInfo[] =
+ {
+ b3BufferInfoCL(m_data->m_gpuRays->getBufferCL()),
+ b3BufferInfoCL(m_data->m_gpuHitResults->getBufferCL()),
+ b3BufferInfoCL(m_data->m_firstRayRigidPairIndexPerRay->getBufferCL()),
+ b3BufferInfoCL(m_data->m_numRayRigidPairsPerRay->getBufferCL()),
+
+ b3BufferInfoCL(narrowphaseData->m_bodyBufferGPU->getBufferCL()),
+ b3BufferInfoCL(narrowphaseData->m_collidablesGPU->getBufferCL()),
+ b3BufferInfoCL(narrowphaseData->m_convexFacesGPU->getBufferCL()),
+ b3BufferInfoCL(narrowphaseData->m_convexPolyhedraGPU->getBufferCL()),
+
+ b3BufferInfoCL(m_data->m_gpuRayRigidPairs->getBufferCL())};
+
b3LauncherCL launcher(m_data->m_q, m_data->m_raytracePairsKernel, "m_raytracePairsKernel");
- launcher.setBuffers( bufferInfo, sizeof(bufferInfo)/sizeof(b3BufferInfoCL) );
+ launcher.setBuffers(bufferInfo, sizeof(bufferInfo) / sizeof(b3BufferInfoCL));
launcher.setConst(numRays);
-
+
launcher.launch1D(numRays);
clFinish(m_data->m_q);
}
}
-
-
//copy results
{
B3_PROFILE("raycast copyToHost");
m_data->m_gpuHitResults->copyToHost(hitResults);
}
-
} \ No newline at end of file
diff --git a/thirdparty/bullet/Bullet3OpenCL/Raycast/b3GpuRaycast.h b/thirdparty/bullet/Bullet3OpenCL/Raycast/b3GpuRaycast.h
index 3a5cf44b79..f1f6ffd402 100644
--- a/thirdparty/bullet/Bullet3OpenCL/Raycast/b3GpuRaycast.h
+++ b/thirdparty/bullet/Bullet3OpenCL/Raycast/b3GpuRaycast.h
@@ -7,26 +7,22 @@
#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);
+ b3GpuRaycast(cl_context ctx, cl_device_id device, cl_command_queue q);
virtual ~b3GpuRaycast();
- void castRaysHost(const b3AlignedObjectArray<b3RayInfo>& raysIn, b3AlignedObjectArray<b3RayHit>& hitResults,
- int numBodies, const struct b3RigidBodyData* bodies, int numCollidables, const struct b3Collidable* collidables,
- const struct b3GpuNarrowPhaseInternalData* narrowphaseData);
-
- void castRays(const b3AlignedObjectArray<b3RayInfo>& rays, b3AlignedObjectArray<b3RayHit>& hitResults,
- int numBodies,const struct b3RigidBodyData* bodies, int numCollidables, const struct b3Collidable* collidables,
- const struct b3GpuNarrowPhaseInternalData* narrowphaseData, class b3GpuBroadphaseInterface* broadphase);
-
+ void castRaysHost(const b3AlignedObjectArray<b3RayInfo>& raysIn, b3AlignedObjectArray<b3RayHit>& hitResults,
+ int numBodies, const struct b3RigidBodyData* bodies, int numCollidables, const struct b3Collidable* collidables,
+ const struct b3GpuNarrowPhaseInternalData* narrowphaseData);
-
+ void castRays(const b3AlignedObjectArray<b3RayInfo>& rays, b3AlignedObjectArray<b3RayHit>& 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
+#endif //B3_GPU_RAYCAST_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/Raycast/kernels/rayCastKernels.h b/thirdparty/bullet/Bullet3OpenCL/Raycast/kernels/rayCastKernels.h
index 6257909a4d..94f6a8eb9f 100644
--- a/thirdparty/bullet/Bullet3OpenCL/Raycast/kernels/rayCastKernels.h
+++ b/thirdparty/bullet/Bullet3OpenCL/Raycast/kernels/rayCastKernels.h
@@ -1,381 +1,380 @@
//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<numFaces && result;i++)\n"
-" {\n"
-" b3GpuFace face = faces[faceOffset+i];\n"
-" float fromPlaneDist = dot(rayFromLocal,face.m_plane)+face.m_plane.w;\n"
-" float toPlaneDist = dot(rayToLocal,face.m_plane)+face.m_plane.w;\n"
-" if (fromPlaneDist<0.f)\n"
-" {\n"
-" if (toPlaneDist >= 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<numBodies;b++)\n"
-" {\n"
-" if (hitResults[i].m_hitResult2==b)\n"
-" continue;\n"
-" Body body = bodies[b];\n"
-" float4 pos = body.m_pos;\n"
-" float4 orn = body.m_quat;\n"
-" if (cachedCollidableIndex != body.m_collidableIdx)\n"
-" {\n"
-" cachedCollidableIndex = body.m_collidableIdx;\n"
-" cachedCollidable = collidables[cachedCollidableIndex];\n"
-" }\n"
-" if (cachedCollidable.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[cachedCollidable.m_shapeIndex].m_numFaces;\n"
-" int faceOffset = convexShapes[cachedCollidable.m_shapeIndex].m_faceOffset;\n"
-" if (numFaces)\n"
-" {\n"
-" if (rayConvex(rayFromLocal, rayToLocal, numFaces, faceOffset,faces, &hitFraction, &hitNormal))\n"
-" {\n"
-" hitBodyIndex = b;\n"
-" \n"
-" }\n"
-" }\n"
-" }\n"
-" if (cachedCollidable.m_shapeType == SHAPE_SPHERE)\n"
-" {\n"
-" float radius = cachedCollidable.m_radius;\n"
-" \n"
-" if (sphere_intersect(pos, radius, rayFrom, rayTo, &hitFraction))\n"
-" {\n"
-" hitBodyIndex = b;\n"
-" hitNormal = (float4) (hitPoint-bodies[b].m_pos);\n"
-" }\n"
-" }\n"
-" }\n"
-" if (hitBodyIndex>=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"
-;
+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<numFaces && result;i++)\n"
+ " {\n"
+ " b3GpuFace face = faces[faceOffset+i];\n"
+ " float fromPlaneDist = dot(rayFromLocal,face.m_plane)+face.m_plane.w;\n"
+ " float toPlaneDist = dot(rayToLocal,face.m_plane)+face.m_plane.w;\n"
+ " if (fromPlaneDist<0.f)\n"
+ " {\n"
+ " if (toPlaneDist >= 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<numBodies;b++)\n"
+ " {\n"
+ " if (hitResults[i].m_hitResult2==b)\n"
+ " continue;\n"
+ " Body body = bodies[b];\n"
+ " float4 pos = body.m_pos;\n"
+ " float4 orn = body.m_quat;\n"
+ " if (cachedCollidableIndex != body.m_collidableIdx)\n"
+ " {\n"
+ " cachedCollidableIndex = body.m_collidableIdx;\n"
+ " cachedCollidable = collidables[cachedCollidableIndex];\n"
+ " }\n"
+ " if (cachedCollidable.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[cachedCollidable.m_shapeIndex].m_numFaces;\n"
+ " int faceOffset = convexShapes[cachedCollidable.m_shapeIndex].m_faceOffset;\n"
+ " if (numFaces)\n"
+ " {\n"
+ " if (rayConvex(rayFromLocal, rayToLocal, numFaces, faceOffset,faces, &hitFraction, &hitNormal))\n"
+ " {\n"
+ " hitBodyIndex = b;\n"
+ " \n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " if (cachedCollidable.m_shapeType == SHAPE_SPHERE)\n"
+ " {\n"
+ " float radius = cachedCollidable.m_radius;\n"
+ " \n"
+ " if (sphere_intersect(pos, radius, rayFrom, rayTo, &hitFraction))\n"
+ " {\n"
+ " hitBodyIndex = b;\n"
+ " hitNormal = (float4) (hitPoint-bodies[b].m_pos);\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " if (hitBodyIndex>=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/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuConstraint4.h b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuConstraint4.h
index c7478f54a1..89c0142ab3 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuConstraint4.h
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuConstraint4.h
@@ -5,14 +5,13 @@
#include "Bullet3Dynamics/shared/b3ContactConstraint4.h"
-
-B3_ATTRIBUTE_ALIGNED16(struct) b3GpuConstraint4 : public b3ContactConstraint4
+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]; }
+ inline void setFrictionCoeff(float value) { m_linear[3] = value; }
+ inline float getFrictionCoeff() const { return m_linear[3]; }
};
-#endif //B3_CONSTRAINT4_h
-
+#endif //B3_CONSTRAINT4_h
diff --git a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuGenericConstraint.cpp b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuGenericConstraint.cpp
index af687b54e9..a271090af4 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuGenericConstraint.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuGenericConstraint.cpp
@@ -19,11 +19,11 @@ subject to the following restrictions:
#include <new>
#include "Bullet3Common/b3Transform.h"
-void b3GpuGenericConstraint::getInfo1 (unsigned int* info,const b3RigidBodyData* bodies)
+void b3GpuGenericConstraint::getInfo1(unsigned int* info, const b3RigidBodyData* bodies)
{
switch (m_constraintType)
{
- case B3_GPU_POINT2POINT_CONSTRAINT_TYPE:
+ case B3_GPU_POINT2POINT_CONSTRAINT_TYPE:
{
*info = 3;
break;
@@ -35,7 +35,7 @@ void b3GpuGenericConstraint::getInfo1 (unsigned int* info,const b3RigidBodyData*
};
}
-void getInfo2Point2Point(b3GpuGenericConstraint* constraint, b3GpuConstraintInfo2* info, const b3RigidBodyData* bodies)
+void getInfo2Point2Point(b3GpuGenericConstraint* constraint, b3GpuConstraintInfo2* info, const b3RigidBodyData* bodies)
{
b3Transform trA;
trA.setIdentity();
@@ -47,54 +47,52 @@ void getInfo2Point2Point(b3GpuGenericConstraint* constraint, b3GpuConstraintInfo
trB.setOrigin(bodies[constraint->m_rbB].m_pos);
trB.setRotation(bodies[constraint->m_rbB].m_quat);
- // anchor points in global coordinates with respect to body PORs.
-
- // set jacobian
- info->m_J1linearAxis[0] = 1;
- info->m_J1linearAxis[info->rowskip+1] = 1;
- info->m_J1linearAxis[2*info->rowskip+2] = 1;
+ // anchor points in global coordinates with respect to body PORs.
- b3Vector3 a1 = trA.getBasis()*constraint->getPivotInA();
+ // set jacobian
+ info->m_J1linearAxis[0] = 1;
+ info->m_J1linearAxis[info->rowskip + 1] = 1;
+ info->m_J1linearAxis[2 * info->rowskip + 2] = 1;
+
+ b3Vector3 a1 = trA.getBasis() * constraint->getPivotInA();
//b3Vector3 a1a = b3QuatRotate(trA.getRotation(),constraint->getPivotInA());
{
b3Vector3* angular0 = (b3Vector3*)(info->m_J1angularAxis);
- b3Vector3* angular1 = (b3Vector3*)(info->m_J1angularAxis+info->rowskip);
- b3Vector3* angular2 = (b3Vector3*)(info->m_J1angularAxis+2*info->rowskip);
+ b3Vector3* angular1 = (b3Vector3*)(info->m_J1angularAxis + info->rowskip);
+ b3Vector3* angular2 = (b3Vector3*)(info->m_J1angularAxis + 2 * info->rowskip);
b3Vector3 a1neg = -a1;
- a1neg.getSkewSymmetricMatrix(angular0,angular1,angular2);
+ a1neg.getSkewSymmetricMatrix(angular0, angular1, angular2);
}
-
+
if (info->m_J2linearAxis)
{
info->m_J2linearAxis[0] = -1;
- info->m_J2linearAxis[info->rowskip+1] = -1;
- info->m_J2linearAxis[2*info->rowskip+2] = -1;
+ info->m_J2linearAxis[info->rowskip + 1] = -1;
+ info->m_J2linearAxis[2 * info->rowskip + 2] = -1;
}
-
- b3Vector3 a2 = trB.getBasis()*constraint->getPivotInB();
-
+
+ b3Vector3 a2 = trB.getBasis() * constraint->getPivotInB();
+
{
- // b3Vector3 a2n = -a2;
+ // b3Vector3 a2n = -a2;
b3Vector3* angular0 = (b3Vector3*)(info->m_J2angularAxis);
- b3Vector3* angular1 = (b3Vector3*)(info->m_J2angularAxis+info->rowskip);
- b3Vector3* angular2 = (b3Vector3*)(info->m_J2angularAxis+2*info->rowskip);
- a2.getSkewSymmetricMatrix(angular0,angular1,angular2);
+ b3Vector3* angular1 = (b3Vector3*)(info->m_J2angularAxis + info->rowskip);
+ b3Vector3* angular2 = (b3Vector3*)(info->m_J2angularAxis + 2 * info->rowskip);
+ a2.getSkewSymmetricMatrix(angular0, angular1, angular2);
}
-
-
- // set right hand side
-// b3Scalar currERP = (m_flags & B3_P2P_FLAGS_ERP) ? m_erp : info->erp;
+ // set right hand side
+ // b3Scalar currERP = (m_flags & B3_P2P_FLAGS_ERP) ? m_erp : info->erp;
b3Scalar currERP = info->erp;
b3Scalar k = info->fps * currERP;
- int j;
- for (j=0; j<3; j++)
- {
- info->m_constraintError[j*info->rowskip] = k * (a2[j] + trB.getOrigin()[j] - a1[j] - trA.getOrigin()[j]);
+ int j;
+ for (j = 0; j < 3; j++)
+ {
+ info->m_constraintError[j * info->rowskip] = k * (a2[j] + trB.getOrigin()[j] - a1[j] - trA.getOrigin()[j]);
//printf("info->m_constraintError[%d]=%f\n",j,info->m_constraintError[j]);
- }
+ }
#if 0
if(m_flags & B3_P2P_FLAGS_CFM)
{
@@ -117,21 +115,20 @@ void getInfo2Point2Point(b3GpuGenericConstraint* constraint, b3GpuConstraintInfo
}
info->m_damping = m_setting.m_damping;
#endif
-
}
-void b3GpuGenericConstraint::getInfo2 (b3GpuConstraintInfo2* info, const b3RigidBodyData* bodies)
+void b3GpuGenericConstraint::getInfo2(b3GpuConstraintInfo2* info, const b3RigidBodyData* bodies)
{
switch (m_constraintType)
{
- case B3_GPU_POINT2POINT_CONSTRAINT_TYPE:
+ case B3_GPU_POINT2POINT_CONSTRAINT_TYPE:
{
- getInfo2Point2Point(this,info,bodies);
+ getInfo2Point2Point(this, info, bodies);
break;
};
default:
- {
- b3Assert(0);
- }
+ {
+ b3Assert(0);
+ }
};
}
diff --git a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuGenericConstraint.h b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuGenericConstraint.h
index 14b3ba7fec..1f163ba7d5 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuGenericConstraint.h
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuGenericConstraint.h
@@ -20,37 +20,35 @@ subject to the following restrictions:
struct b3RigidBodyData;
enum B3_CONSTRAINT_FLAGS
{
- B3_CONSTRAINT_FLAG_ENABLED=1,
+ 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_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
+struct b3GpuConstraintInfo2
{
// integrator parameters: frames per second (1/stepsize), default error
// reduction parameter (0..1).
- b3Scalar fps,erp;
+ 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;
+ b3Scalar *m_J1linearAxis, *m_J1angularAxis, *m_J2linearAxis, *m_J2angularAxis;
// elements to jump from one row to the next in J's
int rowskip;
@@ -58,44 +56,44 @@ struct b3GpuConstraintInfo2
// 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;
+ b3Scalar *m_constraintError, *cfm;
// lo and hi limits for variables (set to -/+ infinity on entry).
- b3Scalar *m_lowerLimit,*m_upperLimit;
+ 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;
+ int* findex;
// number of solver iterations
int m_numIterations;
//damping of the velocity
- b3Scalar m_damping;
+ b3Scalar m_damping;
};
-
-B3_ATTRIBUTE_ALIGNED16(struct) b3GpuGenericConstraint
+B3_ATTRIBUTE_ALIGNED16(struct)
+b3GpuGenericConstraint
{
- int m_constraintType;
- int m_rbA;
- int m_rbB;
- float m_breakingImpulseThreshold;
+ 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_flags;
int m_uid;
int m_padding[2];
- int getRigidBodyA() const
+ int getRigidBodyA() const
{
return m_rbA;
}
- int getRigidBodyB() const
+ int getRigidBodyB() const
{
return m_rbB;
}
@@ -121,12 +119,10 @@ B3_ATTRIBUTE_ALIGNED16(struct) b3GpuGenericConstraint
}
///internal method used by the constraint solver, don't use them directly
- void getInfo1 (unsigned int* info,const b3RigidBodyData* bodies);
+ 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);
-
-
+ void getInfo2(b3GpuConstraintInfo2 * info, const b3RigidBodyData* bodies);
};
-#endif //B3_GPU_GENERIC_CONSTRAINT_H \ No newline at end of file
+#endif //B3_GPU_GENERIC_CONSTRAINT_H \ No newline at end of file
diff --git a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuJacobiContactSolver.cpp b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuJacobiContactSolver.cpp
index 179dfc4f26..089fb1f6a6 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuJacobiContactSolver.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuJacobiContactSolver.cpp
@@ -2,7 +2,7 @@
#include "b3GpuJacobiContactSolver.h"
#include "Bullet3Collision/NarrowPhaseCollision/b3Contact4.h"
#include "Bullet3Common/b3AlignedObjectArray.h"
-#include "Bullet3OpenCL/ParallelPrimitives/b3FillCL.h" //b3Int2
+#include "Bullet3OpenCL/ParallelPrimitives/b3FillCL.h" //b3Int2
class b3Vector3;
#include "Bullet3OpenCL/ParallelPrimitives/b3RadixSort32CL.h"
#include "Bullet3OpenCL/ParallelPrimitives/b3PrefixScanCL.h"
@@ -15,89 +15,78 @@ class b3Vector3;
#include "Bullet3Common/shared/b3Int4.h"
#define SOLVER_UTILS_KERNEL_PATH "src/Bullet3OpenCL/RigidBody/kernels/solverUtils.cl"
-
struct b3GpuJacobiSolverInternalData
{
- //btRadixSort32CL* m_sort32;
- //btBoundSearchCL* m_search;
- b3PrefixScanCL* m_scan;
-
- b3OpenCLArray<unsigned int>* m_bodyCount;
- b3OpenCLArray<b3Int2>* m_contactConstraintOffsets;
- b3OpenCLArray<unsigned int>* m_offsetSplitBodies;
-
- b3OpenCLArray<b3Vector3>* m_deltaLinearVelocities;
- b3OpenCLArray<b3Vector3>* m_deltaAngularVelocities;
-
- b3AlignedObjectArray<b3Vector3> m_deltaLinearVelocitiesCPU;
- b3AlignedObjectArray<b3Vector3> m_deltaAngularVelocitiesCPU;
+ //btRadixSort32CL* m_sort32;
+ //btBoundSearchCL* m_search;
+ b3PrefixScanCL* m_scan;
+ b3OpenCLArray<unsigned int>* m_bodyCount;
+ b3OpenCLArray<b3Int2>* m_contactConstraintOffsets;
+ b3OpenCLArray<unsigned int>* m_offsetSplitBodies;
+ b3OpenCLArray<b3Vector3>* m_deltaLinearVelocities;
+ b3OpenCLArray<b3Vector3>* m_deltaAngularVelocities;
- b3OpenCLArray<b3GpuConstraint4>* m_contactConstraints;
-
- b3FillCL* m_filler;
-
-
- cl_kernel m_countBodiesKernel;
- cl_kernel m_contactToConstraintSplitKernel;
- cl_kernel m_clearVelocitiesKernel;
- cl_kernel m_averageVelocitiesKernel;
- cl_kernel m_updateBodyVelocitiesKernel;
- cl_kernel m_solveContactKernel;
- cl_kernel m_solveFrictionKernel;
+ b3AlignedObjectArray<b3Vector3> m_deltaLinearVelocitiesCPU;
+ b3AlignedObjectArray<b3Vector3> m_deltaAngularVelocitiesCPU;
+ b3OpenCLArray<b3GpuConstraint4>* m_contactConstraints;
+ b3FillCL* m_filler;
+ cl_kernel m_countBodiesKernel;
+ cl_kernel m_contactToConstraintSplitKernel;
+ cl_kernel m_clearVelocitiesKernel;
+ cl_kernel m_averageVelocitiesKernel;
+ cl_kernel m_updateBodyVelocitiesKernel;
+ cl_kernel m_solveContactKernel;
+ cl_kernel m_solveFrictionKernel;
};
-
b3GpuJacobiContactSolver::b3GpuJacobiContactSolver(cl_context ctx, cl_device_id device, cl_command_queue queue, int pairCapacity)
- :m_context(ctx),
- m_device(device),
- m_queue(queue)
+ : m_context(ctx),
+ m_device(device),
+ m_queue(queue)
{
m_data = new b3GpuJacobiSolverInternalData;
- m_data->m_scan = new b3PrefixScanCL(m_context,m_device,m_queue);
- m_data->m_bodyCount = new b3OpenCLArray<unsigned int>(m_context,m_queue);
- m_data->m_filler = new b3FillCL(m_context,m_device,m_queue);
- m_data->m_contactConstraintOffsets = new b3OpenCLArray<b3Int2>(m_context,m_queue);
- m_data->m_offsetSplitBodies = new b3OpenCLArray<unsigned int>(m_context,m_queue);
- m_data->m_contactConstraints = new b3OpenCLArray<b3GpuConstraint4>(m_context,m_queue);
- m_data->m_deltaLinearVelocities = new b3OpenCLArray<b3Vector3>(m_context,m_queue);
- m_data->m_deltaAngularVelocities = new b3OpenCLArray<b3Vector3>(m_context,m_queue);
+ m_data->m_scan = new b3PrefixScanCL(m_context, m_device, m_queue);
+ m_data->m_bodyCount = new b3OpenCLArray<unsigned int>(m_context, m_queue);
+ m_data->m_filler = new b3FillCL(m_context, m_device, m_queue);
+ m_data->m_contactConstraintOffsets = new b3OpenCLArray<b3Int2>(m_context, m_queue);
+ m_data->m_offsetSplitBodies = new b3OpenCLArray<unsigned int>(m_context, m_queue);
+ m_data->m_contactConstraints = new b3OpenCLArray<b3GpuConstraint4>(m_context, m_queue);
+ m_data->m_deltaLinearVelocities = new b3OpenCLArray<b3Vector3>(m_context, m_queue);
+ m_data->m_deltaAngularVelocities = new b3OpenCLArray<b3Vector3>(m_context, m_queue);
cl_int pErrNum;
- const char* additionalMacros="";
+ const char* additionalMacros = "";
const char* solverUtilsSource = solverUtilsCL;
{
- cl_program solverUtilsProg= b3OpenCLUtils::compileCLProgramFromString( ctx, device, solverUtilsSource, &pErrNum,additionalMacros, SOLVER_UTILS_KERNEL_PATH);
+ cl_program solverUtilsProg = b3OpenCLUtils::compileCLProgramFromString(ctx, device, solverUtilsSource, &pErrNum, additionalMacros, SOLVER_UTILS_KERNEL_PATH);
b3Assert(solverUtilsProg);
- m_data->m_countBodiesKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, solverUtilsSource, "CountBodiesKernel", &pErrNum, solverUtilsProg,additionalMacros );
+ m_data->m_countBodiesKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, solverUtilsSource, "CountBodiesKernel", &pErrNum, solverUtilsProg, additionalMacros);
b3Assert(m_data->m_countBodiesKernel);
- m_data->m_contactToConstraintSplitKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, solverUtilsSource, "ContactToConstraintSplitKernel", &pErrNum, solverUtilsProg,additionalMacros );
+ m_data->m_contactToConstraintSplitKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, solverUtilsSource, "ContactToConstraintSplitKernel", &pErrNum, solverUtilsProg, additionalMacros);
b3Assert(m_data->m_contactToConstraintSplitKernel);
- m_data->m_clearVelocitiesKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, solverUtilsSource, "ClearVelocitiesKernel", &pErrNum, solverUtilsProg,additionalMacros );
+ m_data->m_clearVelocitiesKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, solverUtilsSource, "ClearVelocitiesKernel", &pErrNum, solverUtilsProg, additionalMacros);
b3Assert(m_data->m_clearVelocitiesKernel);
- m_data->m_averageVelocitiesKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, solverUtilsSource, "AverageVelocitiesKernel", &pErrNum, solverUtilsProg,additionalMacros );
+ m_data->m_averageVelocitiesKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, solverUtilsSource, "AverageVelocitiesKernel", &pErrNum, solverUtilsProg, additionalMacros);
b3Assert(m_data->m_averageVelocitiesKernel);
- m_data->m_updateBodyVelocitiesKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, solverUtilsSource, "UpdateBodyVelocitiesKernel", &pErrNum, solverUtilsProg,additionalMacros );
+ m_data->m_updateBodyVelocitiesKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, solverUtilsSource, "UpdateBodyVelocitiesKernel", &pErrNum, solverUtilsProg, additionalMacros);
b3Assert(m_data->m_updateBodyVelocitiesKernel);
-
- m_data->m_solveContactKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, solverUtilsSource, "SolveContactJacobiKernel", &pErrNum, solverUtilsProg,additionalMacros );
- b3Assert(m_data->m_solveContactKernel );
+ m_data->m_solveContactKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, solverUtilsSource, "SolveContactJacobiKernel", &pErrNum, solverUtilsProg, additionalMacros);
+ b3Assert(m_data->m_solveContactKernel);
- m_data->m_solveFrictionKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, solverUtilsSource, "SolveFrictionJacobiKernel", &pErrNum, solverUtilsProg,additionalMacros );
+ m_data->m_solveFrictionKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, solverUtilsSource, "SolveFrictionJacobiKernel", &pErrNum, solverUtilsProg, additionalMacros);
b3Assert(m_data->m_solveFrictionKernel);
}
-
}
-
b3GpuJacobiContactSolver::~b3GpuJacobiContactSolver()
{
clReleaseKernel(m_data->m_solveContactKernel);
@@ -106,7 +95,7 @@ b3GpuJacobiContactSolver::~b3GpuJacobiContactSolver()
clReleaseKernel(m_data->m_contactToConstraintSplitKernel);
clReleaseKernel(m_data->m_averageVelocitiesKernel);
clReleaseKernel(m_data->m_updateBodyVelocitiesKernel);
- clReleaseKernel(m_data->m_clearVelocitiesKernel );
+ clReleaseKernel(m_data->m_clearVelocitiesKernel);
delete m_data->m_deltaLinearVelocities;
delete m_data->m_deltaAngularVelocities;
@@ -119,80 +108,70 @@ b3GpuJacobiContactSolver::~b3GpuJacobiContactSolver()
delete m_data;
}
-
-
b3Vector3 make_float4(float v)
{
- return b3MakeVector3 (v,v,v);
+ return b3MakeVector3(v, v, v);
}
-b3Vector4 make_float4(float x,float y, float z, float w)
+b3Vector4 make_float4(float x, float y, float z, float w)
{
- return b3MakeVector4 (x,y,z,w);
+ return b3MakeVector4(x, y, z, w);
}
-
- static
- inline
- float calcRelVel(const b3Vector3& l0, const b3Vector3& l1, const b3Vector3& a0, const b3Vector3& a1,
- const b3Vector3& linVel0, const b3Vector3& angVel0, const b3Vector3& linVel1, const b3Vector3& angVel1)
- {
- return b3Dot(l0, linVel0) + b3Dot(a0, angVel0) + b3Dot(l1, linVel1) + b3Dot(a1, angVel1);
- }
-
-
- static
- inline
- void setLinearAndAngular(const b3Vector3& n, const b3Vector3& r0, const b3Vector3& r1,
- b3Vector3& linear, b3Vector3& angular0, b3Vector3& angular1)
- {
- linear = n;
- angular0 = b3Cross(r0, n);
- angular1 = -b3Cross(r1, n);
- }
-
-
-static __inline void solveContact(b3GpuConstraint4& cs,
- const b3Vector3& posA, const b3Vector3& linVelARO, const b3Vector3& angVelARO, float invMassA, const b3Matrix3x3& invInertiaA,
- const b3Vector3& posB, const b3Vector3& linVelBRO, const b3Vector3& angVelBRO, float invMassB, const b3Matrix3x3& invInertiaB,
- float maxRambdaDt[4], float minRambdaDt[4], b3Vector3& dLinVelA, b3Vector3& dAngVelA, b3Vector3& dLinVelB, b3Vector3& dAngVelB)
+static inline float calcRelVel(const b3Vector3& l0, const b3Vector3& l1, const b3Vector3& a0, const b3Vector3& a1,
+ const b3Vector3& linVel0, const b3Vector3& angVel0, const b3Vector3& linVel1, const b3Vector3& angVel1)
{
+ return b3Dot(l0, linVel0) + b3Dot(a0, angVel0) + b3Dot(l1, linVel1) + b3Dot(a1, angVel1);
+}
+static inline void setLinearAndAngular(const b3Vector3& n, const b3Vector3& r0, const b3Vector3& r1,
+ b3Vector3& linear, b3Vector3& angular0, b3Vector3& angular1)
+{
+ linear = n;
+ angular0 = b3Cross(r0, n);
+ angular1 = -b3Cross(r1, n);
+}
- for(int ic=0; ic<4; ic++)
+static __inline void solveContact(b3GpuConstraint4& cs,
+ const b3Vector3& posA, const b3Vector3& linVelARO, const b3Vector3& angVelARO, float invMassA, const b3Matrix3x3& invInertiaA,
+ const b3Vector3& posB, const b3Vector3& linVelBRO, const b3Vector3& angVelBRO, float invMassB, const b3Matrix3x3& invInertiaB,
+ float maxRambdaDt[4], float minRambdaDt[4], b3Vector3& dLinVelA, b3Vector3& dAngVelA, b3Vector3& dLinVelB, b3Vector3& dAngVelB)
+{
+ for (int ic = 0; ic < 4; ic++)
{
// dont necessary because this makes change to 0
- if( cs.m_jacCoeffInv[ic] == 0.f ) continue;
+ if (cs.m_jacCoeffInv[ic] == 0.f) continue;
{
b3Vector3 angular0, angular1, linear;
b3Vector3 r0 = cs.m_worldPos[ic] - (b3Vector3&)posA;
b3Vector3 r1 = cs.m_worldPos[ic] - (b3Vector3&)posB;
- setLinearAndAngular( (const b3Vector3 &)cs.m_linear, (const b3Vector3 &)r0, (const b3Vector3 &)r1, linear, angular0, angular1 );
+ setLinearAndAngular((const b3Vector3&)cs.m_linear, (const b3Vector3&)r0, (const b3Vector3&)r1, linear, angular0, angular1);
- float rambdaDt = calcRelVel((const b3Vector3 &)cs.m_linear,(const b3Vector3 &) -cs.m_linear, angular0, angular1,
- linVelARO+dLinVelA, angVelARO+dAngVelA, linVelBRO+dLinVelB, angVelBRO+dAngVelB ) + cs.m_b[ic];
+ float rambdaDt = calcRelVel((const b3Vector3&)cs.m_linear, (const b3Vector3&)-cs.m_linear, angular0, angular1,
+ linVelARO + dLinVelA, angVelARO + dAngVelA, linVelBRO + dLinVelB, angVelBRO + dAngVelB) +
+ cs.m_b[ic];
rambdaDt *= cs.m_jacCoeffInv[ic];
{
float prevSum = cs.m_appliedRambdaDt[ic];
float updated = prevSum;
updated += rambdaDt;
- updated = b3Max( updated, minRambdaDt[ic] );
- updated = b3Min( updated, maxRambdaDt[ic] );
+ updated = b3Max(updated, minRambdaDt[ic]);
+ updated = b3Min(updated, maxRambdaDt[ic]);
rambdaDt = updated - prevSum;
cs.m_appliedRambdaDt[ic] = updated;
}
- b3Vector3 linImp0 = invMassA*linear*rambdaDt;
- b3Vector3 linImp1 = invMassB*(-linear)*rambdaDt;
- b3Vector3 angImp0 = (invInertiaA* angular0)*rambdaDt;
- b3Vector3 angImp1 = (invInertiaB* angular1)*rambdaDt;
+ b3Vector3 linImp0 = invMassA * linear * rambdaDt;
+ b3Vector3 linImp1 = invMassB * (-linear) * rambdaDt;
+ b3Vector3 angImp0 = (invInertiaA * angular0) * rambdaDt;
+ b3Vector3 angImp1 = (invInertiaB * angular1) * rambdaDt;
#ifdef _WIN32
- b3Assert(_finite(linImp0.getX()));
+ b3Assert(_finite(linImp0.getX()));
b3Assert(_finite(linImp1.getX()));
#endif
-
+
if (invMassA)
{
dLinVelA += linImp0;
@@ -207,43 +186,42 @@ static __inline void solveContact(b3GpuConstraint4& cs,
}
}
-
-
void solveContact3(b3GpuConstraint4* cs,
- b3Vector3* posAPtr, b3Vector3* linVelA, b3Vector3* angVelA, float invMassA, const b3Matrix3x3& invInertiaA,
- b3Vector3* posBPtr, b3Vector3* linVelB, b3Vector3* angVelB, float invMassB, const b3Matrix3x3& invInertiaB,
- b3Vector3* dLinVelA, b3Vector3* dAngVelA, b3Vector3* dLinVelB, b3Vector3* dAngVelB)
+ b3Vector3* posAPtr, b3Vector3* linVelA, b3Vector3* angVelA, float invMassA, const b3Matrix3x3& invInertiaA,
+ b3Vector3* posBPtr, b3Vector3* linVelB, b3Vector3* angVelB, float invMassB, const b3Matrix3x3& invInertiaB,
+ b3Vector3* dLinVelA, b3Vector3* dAngVelA, b3Vector3* dLinVelB, b3Vector3* dAngVelB)
{
float minRambdaDt = 0;
float maxRambdaDt = FLT_MAX;
- for(int ic=0; ic<4; ic++)
+ for (int ic = 0; ic < 4; ic++)
{
- if( cs->m_jacCoeffInv[ic] == 0.f ) continue;
+ if (cs->m_jacCoeffInv[ic] == 0.f) continue;
b3Vector3 angular0, angular1, linear;
b3Vector3 r0 = cs->m_worldPos[ic] - *posAPtr;
b3Vector3 r1 = cs->m_worldPos[ic] - *posBPtr;
- setLinearAndAngular( cs->m_linear, r0, r1, linear, angular0, angular1 );
+ setLinearAndAngular(cs->m_linear, r0, r1, linear, angular0, angular1);
- float rambdaDt = calcRelVel( cs->m_linear, -cs->m_linear, angular0, angular1,
- *linVelA+*dLinVelA, *angVelA+*dAngVelA, *linVelB+*dLinVelB, *angVelB+*dAngVelB ) + cs->m_b[ic];
+ float rambdaDt = calcRelVel(cs->m_linear, -cs->m_linear, angular0, angular1,
+ *linVelA + *dLinVelA, *angVelA + *dAngVelA, *linVelB + *dLinVelB, *angVelB + *dAngVelB) +
+ cs->m_b[ic];
rambdaDt *= cs->m_jacCoeffInv[ic];
{
float prevSum = cs->m_appliedRambdaDt[ic];
float updated = prevSum;
updated += rambdaDt;
- updated = b3Max( updated, minRambdaDt );
- updated = b3Min( updated, maxRambdaDt );
+ updated = b3Max(updated, minRambdaDt);
+ updated = b3Min(updated, maxRambdaDt);
rambdaDt = updated - prevSum;
cs->m_appliedRambdaDt[ic] = updated;
}
- b3Vector3 linImp0 = invMassA*linear*rambdaDt;
- b3Vector3 linImp1 = invMassB*(-linear)*rambdaDt;
- b3Vector3 angImp0 = (invInertiaA* angular0)*rambdaDt;
- b3Vector3 angImp1 = (invInertiaB* angular1)*rambdaDt;
+ b3Vector3 linImp0 = invMassA * linear * rambdaDt;
+ b3Vector3 linImp1 = invMassB * (-linear) * rambdaDt;
+ b3Vector3 angImp0 = (invInertiaA * angular0) * rambdaDt;
+ b3Vector3 angImp1 = (invInertiaB * angular1) * rambdaDt;
if (invMassA)
{
@@ -258,58 +236,56 @@ void solveContact3(b3GpuConstraint4* cs,
}
}
-
-static inline void solveFriction(b3GpuConstraint4& cs,
- const b3Vector3& posA, const b3Vector3& linVelARO, const b3Vector3& angVelARO, float invMassA, const b3Matrix3x3& invInertiaA,
- const b3Vector3& posB, const b3Vector3& linVelBRO, const b3Vector3& angVelBRO, float invMassB, const b3Matrix3x3& invInertiaB,
- float maxRambdaDt[4], float minRambdaDt[4], b3Vector3& dLinVelA, b3Vector3& dAngVelA, b3Vector3& dLinVelB, b3Vector3& dAngVelB)
+static inline void solveFriction(b3GpuConstraint4& cs,
+ const b3Vector3& posA, const b3Vector3& linVelARO, const b3Vector3& angVelARO, float invMassA, const b3Matrix3x3& invInertiaA,
+ const b3Vector3& posB, const b3Vector3& linVelBRO, const b3Vector3& angVelBRO, float invMassB, const b3Matrix3x3& invInertiaB,
+ float maxRambdaDt[4], float minRambdaDt[4], b3Vector3& dLinVelA, b3Vector3& dAngVelA, b3Vector3& dLinVelB, b3Vector3& dAngVelB)
{
+ b3Vector3 linVelA = linVelARO + dLinVelA;
+ b3Vector3 linVelB = linVelBRO + dLinVelB;
+ b3Vector3 angVelA = angVelARO + dAngVelA;
+ b3Vector3 angVelB = angVelBRO + dAngVelB;
- b3Vector3 linVelA = linVelARO+dLinVelA;
- b3Vector3 linVelB = linVelBRO+dLinVelB;
- b3Vector3 angVelA = angVelARO+dAngVelA;
- b3Vector3 angVelB = angVelBRO+dAngVelB;
-
- if( cs.m_fJacCoeffInv[0] == 0 && cs.m_fJacCoeffInv[0] == 0 ) return;
+ if (cs.m_fJacCoeffInv[0] == 0 && cs.m_fJacCoeffInv[0] == 0) return;
const b3Vector3& center = (const b3Vector3&)cs.m_center;
b3Vector3 n = -(const b3Vector3&)cs.m_linear;
b3Vector3 tangent[2];
-#if 1
- b3PlaneSpace1 (n, tangent[0],tangent[1]);
+#if 1
+ b3PlaneSpace1(n, tangent[0], tangent[1]);
#else
- b3Vector3 r = cs.m_worldPos[0]-center;
- tangent[0] = cross3( n, r );
- tangent[1] = cross3( tangent[0], n );
- tangent[0] = normalize3( tangent[0] );
- tangent[1] = normalize3( tangent[1] );
+ b3Vector3 r = cs.m_worldPos[0] - center;
+ tangent[0] = cross3(n, r);
+ tangent[1] = cross3(tangent[0], n);
+ tangent[0] = normalize3(tangent[0]);
+ tangent[1] = normalize3(tangent[1]);
#endif
b3Vector3 angular0, angular1, linear;
b3Vector3 r0 = center - posA;
b3Vector3 r1 = center - posB;
- for(int i=0; i<2; i++)
+ for (int i = 0; i < 2; i++)
{
- setLinearAndAngular( tangent[i], r0, r1, linear, angular0, angular1 );
+ setLinearAndAngular(tangent[i], r0, r1, linear, angular0, angular1);
float rambdaDt = calcRelVel(linear, -linear, angular0, angular1,
- linVelA, angVelA, linVelB, angVelB );
+ linVelA, angVelA, linVelB, angVelB);
rambdaDt *= cs.m_fJacCoeffInv[i];
- {
- float prevSum = cs.m_fAppliedRambdaDt[i];
- float updated = prevSum;
- updated += rambdaDt;
- updated = b3Max( updated, minRambdaDt[i] );
- updated = b3Min( updated, maxRambdaDt[i] );
- rambdaDt = updated - prevSum;
- cs.m_fAppliedRambdaDt[i] = updated;
- }
+ {
+ float prevSum = cs.m_fAppliedRambdaDt[i];
+ float updated = prevSum;
+ updated += rambdaDt;
+ updated = b3Max(updated, minRambdaDt[i]);
+ updated = b3Min(updated, maxRambdaDt[i]);
+ rambdaDt = updated - prevSum;
+ cs.m_fAppliedRambdaDt[i] = updated;
+ }
- b3Vector3 linImp0 = invMassA*linear*rambdaDt;
- b3Vector3 linImp1 = invMassB*(-linear)*rambdaDt;
- b3Vector3 angImp0 = (invInertiaA* angular0)*rambdaDt;
- b3Vector3 angImp1 = (invInertiaB* angular1)*rambdaDt;
+ b3Vector3 linImp0 = invMassA * linear * rambdaDt;
+ b3Vector3 linImp1 = invMassB * (-linear) * rambdaDt;
+ b3Vector3 angImp0 = (invInertiaA * angular0) * rambdaDt;
+ b3Vector3 angImp1 = (invInertiaB * angular1) * rambdaDt;
#ifdef _WIN32
b3Assert(_finite(linImp0.getX()));
b3Assert(_finite(linImp1.getX()));
@@ -326,65 +302,58 @@ static inline void solveFriction(b3GpuConstraint4& cs,
}
}
- { // angular damping for point constraint
- b3Vector3 ab = ( posB - posA ).normalized();
- b3Vector3 ac = ( center - posA ).normalized();
- if( b3Dot( ab, ac ) > 0.95f || (invMassA == 0.f || invMassB == 0.f))
+ { // angular damping for point constraint
+ b3Vector3 ab = (posB - posA).normalized();
+ b3Vector3 ac = (center - posA).normalized();
+ if (b3Dot(ab, ac) > 0.95f || (invMassA == 0.f || invMassB == 0.f))
{
- float angNA = b3Dot( n, angVelA );
- float angNB = b3Dot( n, angVelB );
+ float angNA = b3Dot(n, angVelA);
+ float angNB = b3Dot(n, angVelB);
if (invMassA)
- dAngVelA -= (angNA*0.1f)*n;
+ dAngVelA -= (angNA * 0.1f) * n;
if (invMassB)
- dAngVelB -= (angNB*0.1f)*n;
+ dAngVelB -= (angNB * 0.1f) * n;
}
}
-
}
-
-
-
float calcJacCoeff(const b3Vector3& linear0, const b3Vector3& linear1, const b3Vector3& angular0, const b3Vector3& angular1,
- float invMass0, const b3Matrix3x3* invInertia0, float invMass1, const b3Matrix3x3* invInertia1, float countA, float countB)
+ float invMass0, const b3Matrix3x3* invInertia0, float invMass1, const b3Matrix3x3* invInertia1, float countA, float countB)
{
// linear0,1 are normlized
- float jmj0 = invMass0;//dot3F4(linear0, linear0)*invMass0;
-
- float jmj1 = b3Dot(mtMul3(angular0,*invInertia0), angular0);
- float jmj2 = invMass1;//dot3F4(linear1, linear1)*invMass1;
- float jmj3 = b3Dot(mtMul3(angular1,*invInertia1), angular1);
- return -1.f/((jmj0+jmj1)*countA+(jmj2+jmj3)*countB);
-// return -1.f/((jmj0+jmj1)+(jmj2+jmj3));
+ float jmj0 = invMass0; //dot3F4(linear0, linear0)*invMass0;
+ float jmj1 = b3Dot(mtMul3(angular0, *invInertia0), angular0);
+ float jmj2 = invMass1; //dot3F4(linear1, linear1)*invMass1;
+ float jmj3 = b3Dot(mtMul3(angular1, *invInertia1), angular1);
+ return -1.f / ((jmj0 + jmj1) * countA + (jmj2 + jmj3) * countB);
+ // return -1.f/((jmj0+jmj1)+(jmj2+jmj3));
}
-
-void setConstraint4( const b3Vector3& posA, const b3Vector3& linVelA, const b3Vector3& angVelA, float invMassA, const b3Matrix3x3& invInertiaA,
- const b3Vector3& posB, const b3Vector3& linVelB, const b3Vector3& angVelB, float invMassB, const b3Matrix3x3& invInertiaB,
- b3Contact4* src, float dt, float positionDrift, float positionConstraintCoeff, float countA, float countB,
- b3GpuConstraint4* dstC )
+void setConstraint4(const b3Vector3& posA, const b3Vector3& linVelA, const b3Vector3& angVelA, float invMassA, const b3Matrix3x3& invInertiaA,
+ const b3Vector3& posB, const b3Vector3& linVelB, const b3Vector3& angVelB, float invMassB, const b3Matrix3x3& invInertiaB,
+ b3Contact4* src, float dt, float positionDrift, float positionConstraintCoeff, float countA, float countB,
+ b3GpuConstraint4* 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++)
+ 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[3] = 0.7f ;//src->getFrictionCoeff() );
- for(int ic=0; ic<4; ic++)
+ dstC->m_linear[3] = 0.7f; //src->getFrictionCoeff() );
+ for (int ic = 0; ic < 4; ic++)
{
b3Vector3 r0 = src->m_worldPosB[ic] - posA;
b3Vector3 r1 = src->m_worldPosB[ic] - posB;
- if( ic >= src->m_worldNormalOnB[3] )//npoints
+ if (ic >= src->m_worldNormalOnB[3]) //npoints
{
dstC->m_jacCoeffInv[ic] = 0.f;
continue;
@@ -396,53 +365,53 @@ void setConstraint4( const b3Vector3& posA, const b3Vector3& linVelA, const b3Ve
setLinearAndAngular(src->m_worldNormalOnB, r0, r1, linear, angular0, angular1);
dstC->m_jacCoeffInv[ic] = calcJacCoeff(linear, -linear, angular0, angular1,
- invMassA, &invInertiaA, invMassB, &invInertiaB ,countA,countB);
+ invMassA, &invInertiaA, invMassB, &invInertiaB, countA, countB);
relVelN = calcRelVel(linear, -linear, angular0, angular1,
- linVelA, angVelA, linVelB, angVelB);
+ linVelA, angVelA, linVelB, angVelB);
- float e = 0.f;//src->getRestituitionCoeff();
- if( relVelN*relVelN < 0.004f )
+ float e = 0.f; //src->getRestituitionCoeff();
+ if (relVelN * relVelN < 0.004f)
{
e = 0.f;
}
- dstC->m_b[ic] = e*relVelN;
+ dstC->m_b[ic] = e * relVelN;
//float penetration = src->m_worldPos[ic].w;
- dstC->m_b[ic] += (src->m_worldPosB[ic][3] + positionDrift)*positionConstraintCoeff*dtInv;
+ dstC->m_b[ic] += (src->m_worldPosB[ic][3] + positionDrift) * positionConstraintCoeff * dtInv;
dstC->m_appliedRambdaDt[ic] = 0.f;
}
}
- if( src->m_worldNormalOnB[3] > 0 )//npoints
- { // prepare friction
+ if (src->m_worldNormalOnB[3] > 0) //npoints
+ { // prepare friction
b3Vector3 center = make_float4(0.f);
- for(int i=0; i<src->m_worldNormalOnB[3]; i++)
+ for (int i = 0; i < src->m_worldNormalOnB[3]; i++)
center += src->m_worldPosB[i];
center /= (float)src->m_worldNormalOnB[3];
b3Vector3 tangent[2];
- b3PlaneSpace1(src->m_worldNormalOnB,tangent[0],tangent[1]);
-
+ b3PlaneSpace1(src->m_worldNormalOnB, tangent[0], tangent[1]);
+
b3Vector3 r[2];
r[0] = center - posA;
r[1] = center - posB;
- for(int i=0; i<2; i++)
+ for (int i = 0; i < 2; i++)
{
b3Vector3 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 ,countA,countB);
+ invMassA, &invInertiaA, invMassB, &invInertiaB, countA, countB);
dstC->m_fAppliedRambdaDt[i] = 0.f;
}
dstC->m_center = center;
}
- for(int i=0; i<4; i++)
+ for (int i = 0; i < 4; i++)
{
- if( i<src->m_worldNormalOnB[3] )
+ if (i < src->m_worldNormalOnB[3])
{
dstC->m_worldPos[i] = src->m_worldPosB[i];
}
@@ -453,17 +422,14 @@ void setConstraint4( const b3Vector3& posA, const b3Vector3& linVelA, const b3Ve
}
}
-
-
void ContactToConstraintKernel(b3Contact4* gContact, b3RigidBodyData* gBodies, b3InertiaData* gShapes, b3GpuConstraint4* gConstraintOut, int nContacts,
-float dt,
-float positionDrift,
-float positionConstraintCoeff, int gIdx, b3AlignedObjectArray<unsigned int>& bodyCount
-)
+ float dt,
+ float positionDrift,
+ float positionConstraintCoeff, int gIdx, b3AlignedObjectArray<unsigned int>& bodyCount)
{
//int gIdx = 0;//GET_GLOBAL_IDX;
-
- if( gIdx < nContacts )
+
+ if (gIdx < nContacts)
{
int aIdx = abs(gContact[gIdx].m_bodyAPtrAndSignBit);
int bIdx = abs(gContact[gIdx].m_bodyBPtrAndSignBit);
@@ -472,50 +438,46 @@ float positionConstraintCoeff, int gIdx, b3AlignedObjectArray<unsigned int>& bod
b3Vector3 linVelA = gBodies[aIdx].m_linVel;
b3Vector3 angVelA = gBodies[aIdx].m_angVel;
float invMassA = gBodies[aIdx].m_invMass;
- b3Matrix3x3 invInertiaA = gShapes[aIdx].m_invInertiaWorld;//.m_invInertia;
+ b3Matrix3x3 invInertiaA = gShapes[aIdx].m_invInertiaWorld; //.m_invInertia;
b3Vector3 posB = gBodies[bIdx].m_pos;
b3Vector3 linVelB = gBodies[bIdx].m_linVel;
b3Vector3 angVelB = gBodies[bIdx].m_angVel;
float invMassB = gBodies[bIdx].m_invMass;
- b3Matrix3x3 invInertiaB = gShapes[bIdx].m_invInertiaWorld;//m_invInertia;
+ b3Matrix3x3 invInertiaB = gShapes[bIdx].m_invInertiaWorld; //m_invInertia;
b3GpuConstraint4 cs;
float countA = invMassA ? (float)(bodyCount[aIdx]) : 1;
float countB = invMassB ? (float)(bodyCount[bIdx]) : 1;
- setConstraint4( posA, linVelA, angVelA, invMassA, invInertiaA, posB, linVelB, angVelB, invMassB, invInertiaB,
- &gContact[gIdx], dt, positionDrift, positionConstraintCoeff,countA,countB,
- &cs );
-
+ setConstraint4(posA, linVelA, angVelA, invMassA, invInertiaA, posB, linVelB, angVelB, invMassB, invInertiaB,
+ &gContact[gIdx], dt, positionDrift, positionConstraintCoeff, countA, countB,
+ &cs);
-
cs.m_batchIdx = gContact[gIdx].m_batchIdx;
gConstraintOut[gIdx] = cs;
}
}
-
-void b3GpuJacobiContactSolver::solveGroupHost(b3RigidBodyData* bodies,b3InertiaData* inertias,int numBodies,b3Contact4* manifoldPtr, int numManifolds,const b3JacobiSolverInfo& solverInfo)
+void b3GpuJacobiContactSolver::solveGroupHost(b3RigidBodyData* bodies, b3InertiaData* inertias, int numBodies, b3Contact4* manifoldPtr, int numManifolds, const b3JacobiSolverInfo& solverInfo)
{
B3_PROFILE("b3GpuJacobiContactSolver::solveGroup");
b3AlignedObjectArray<unsigned int> bodyCount;
bodyCount.resize(numBodies);
- for (int i=0;i<numBodies;i++)
+ for (int i = 0; i < numBodies; i++)
bodyCount[i] = 0;
b3AlignedObjectArray<b3Int2> contactConstraintOffsets;
contactConstraintOffsets.resize(numManifolds);
-
- for (int i=0;i<numManifolds;i++)
+ for (int i = 0; i < numManifolds; i++)
{
int pa = manifoldPtr[i].m_bodyAPtrAndSignBit;
int pb = manifoldPtr[i].m_bodyBPtrAndSignBit;
- bool isFixedA = (pa <0) || (pa == solverInfo.m_fixedBodyIndex);
- bool isFixedB = (pb <0) || (pb == solverInfo.m_fixedBodyIndex);
+ bool isFixedA = (pa < 0) || (pa == solverInfo.m_fixedBodyIndex);
+ bool isFixedB = (pb < 0) || (pb == solverInfo.m_fixedBodyIndex);
int bodyIndexA = manifoldPtr[i].getBodyA();
int bodyIndexB = manifoldPtr[i].getBodyB();
@@ -529,71 +491,63 @@ void b3GpuJacobiContactSolver::solveGroupHost(b3RigidBodyData* bodies,b3InertiaD
{
contactConstraintOffsets[i].y = bodyCount[bodyIndexB];
bodyCount[bodyIndexB]++;
- }
+ }
}
b3AlignedObjectArray<unsigned int> offsetSplitBodies;
offsetSplitBodies.resize(numBodies);
unsigned int totalNumSplitBodies;
- m_data->m_scan->executeHost(bodyCount,offsetSplitBodies,numBodies,&totalNumSplitBodies);
- int numlastBody = bodyCount[numBodies-1];
+ m_data->m_scan->executeHost(bodyCount, offsetSplitBodies, numBodies, &totalNumSplitBodies);
+ int numlastBody = bodyCount[numBodies - 1];
totalNumSplitBodies += numlastBody;
- printf("totalNumSplitBodies = %d\n",totalNumSplitBodies);
-
-
-
-
+ printf("totalNumSplitBodies = %d\n", totalNumSplitBodies);
b3AlignedObjectArray<b3GpuConstraint4> contactConstraints;
contactConstraints.resize(numManifolds);
- for (int i=0;i<numManifolds;i++)
+ for (int i = 0; i < numManifolds; i++)
{
- ContactToConstraintKernel(&manifoldPtr[0],bodies,inertias,&contactConstraints[0],numManifolds,
- solverInfo.m_deltaTime,
- solverInfo.m_positionDrift,
- solverInfo.m_positionConstraintCoeff,
- i, bodyCount);
+ ContactToConstraintKernel(&manifoldPtr[0], bodies, inertias, &contactConstraints[0], numManifolds,
+ solverInfo.m_deltaTime,
+ solverInfo.m_positionDrift,
+ solverInfo.m_positionConstraintCoeff,
+ i, bodyCount);
}
int maxIter = solverInfo.m_numIterations;
-
b3AlignedObjectArray<b3Vector3> deltaLinearVelocities;
b3AlignedObjectArray<b3Vector3> deltaAngularVelocities;
deltaLinearVelocities.resize(totalNumSplitBodies);
deltaAngularVelocities.resize(totalNumSplitBodies);
- for (unsigned int i=0;i<totalNumSplitBodies;i++)
+ for (unsigned int i = 0; i < totalNumSplitBodies; i++)
{
deltaLinearVelocities[i].setZero();
deltaAngularVelocities[i].setZero();
}
-
-
- for (int iter = 0;iter<maxIter;iter++)
+ for (int iter = 0; iter < maxIter; iter++)
{
- int i=0;
- for( i=0; i<numManifolds; i++)
+ int i = 0;
+ for (i = 0; i < numManifolds; i++)
{
-
//float frictionCoeff = contactConstraints[i].getFrictionCoeff();
int aIdx = (int)contactConstraints[i].m_bodyA;
int bIdx = (int)contactConstraints[i].m_bodyB;
b3RigidBodyData& bodyA = bodies[aIdx];
b3RigidBodyData& bodyB = bodies[bIdx];
- b3Vector3 zero = b3MakeVector3(0,0,0);
-
- b3Vector3* dlvAPtr=&zero;
- b3Vector3* davAPtr=&zero;
- b3Vector3* dlvBPtr=&zero;
- b3Vector3* davBPtr=&zero;
-
+ b3Vector3 zero = b3MakeVector3(0, 0, 0);
+
+ b3Vector3* dlvAPtr = &zero;
+ b3Vector3* davAPtr = &zero;
+ b3Vector3* dlvBPtr = &zero;
+ b3Vector3* davBPtr = &zero;
+
if (bodyA.m_invMass)
{
int bodyOffsetA = offsetSplitBodies[aIdx];
int constraintOffsetA = contactConstraintOffsets[i].x;
- int splitIndexA = bodyOffsetA+constraintOffsetA;
+ int splitIndexA = bodyOffsetA + constraintOffsetA;
dlvAPtr = &deltaLinearVelocities[splitIndexA];
davAPtr = &deltaAngularVelocities[splitIndexA];
}
@@ -602,67 +556,61 @@ void b3GpuJacobiContactSolver::solveGroupHost(b3RigidBodyData* bodies,b3InertiaD
{
int bodyOffsetB = offsetSplitBodies[bIdx];
int constraintOffsetB = contactConstraintOffsets[i].y;
- int splitIndexB= bodyOffsetB+constraintOffsetB;
- dlvBPtr =&deltaLinearVelocities[splitIndexB];
+ int splitIndexB = bodyOffsetB + constraintOffsetB;
+ dlvBPtr = &deltaLinearVelocities[splitIndexB];
davBPtr = &deltaAngularVelocities[splitIndexB];
}
-
-
{
- float maxRambdaDt[4] = {FLT_MAX,FLT_MAX,FLT_MAX,FLT_MAX};
- float minRambdaDt[4] = {0.f,0.f,0.f,0.f};
-
- solveContact( contactConstraints[i], (b3Vector3&)bodyA.m_pos, (b3Vector3&)bodyA.m_linVel, (b3Vector3&)bodyA.m_angVel, bodyA.m_invMass, inertias[aIdx].m_invInertiaWorld,
- (b3Vector3&)bodyB.m_pos, (b3Vector3&)bodyB.m_linVel, (b3Vector3&)bodyB.m_angVel, bodyB.m_invMass, inertias[bIdx].m_invInertiaWorld,
- maxRambdaDt, minRambdaDt , *dlvAPtr,*davAPtr,*dlvBPtr,*davBPtr );
-
+ float maxRambdaDt[4] = {FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX};
+ float minRambdaDt[4] = {0.f, 0.f, 0.f, 0.f};
+ solveContact(contactConstraints[i], (b3Vector3&)bodyA.m_pos, (b3Vector3&)bodyA.m_linVel, (b3Vector3&)bodyA.m_angVel, bodyA.m_invMass, inertias[aIdx].m_invInertiaWorld,
+ (b3Vector3&)bodyB.m_pos, (b3Vector3&)bodyB.m_linVel, (b3Vector3&)bodyB.m_angVel, bodyB.m_invMass, inertias[bIdx].m_invInertiaWorld,
+ maxRambdaDt, minRambdaDt, *dlvAPtr, *davAPtr, *dlvBPtr, *davBPtr);
}
-
}
-
//easy
- for (int i=0;i<numBodies;i++)
+ for (int i = 0; i < numBodies; i++)
{
if (bodies[i].m_invMass)
{
int bodyOffset = offsetSplitBodies[i];
int count = bodyCount[i];
- float factor = 1.f/float(count);
+ float factor = 1.f / float(count);
b3Vector3 averageLinVel;
averageLinVel.setZero();
b3Vector3 averageAngVel;
averageAngVel.setZero();
- for (int j=0;j<count;j++)
+ for (int j = 0; j < count; j++)
{
- averageLinVel += deltaLinearVelocities[bodyOffset+j]*factor;
- averageAngVel += deltaAngularVelocities[bodyOffset+j]*factor;
+ averageLinVel += deltaLinearVelocities[bodyOffset + j] * factor;
+ averageAngVel += deltaAngularVelocities[bodyOffset + j] * factor;
}
- for (int j=0;j<count;j++)
+ for (int j = 0; j < count; j++)
{
- deltaLinearVelocities[bodyOffset+j] = averageLinVel;
- deltaAngularVelocities[bodyOffset+j] = averageAngVel;
+ deltaLinearVelocities[bodyOffset + j] = averageLinVel;
+ deltaAngularVelocities[bodyOffset + j] = averageAngVel;
}
}
}
}
- for (int iter = 0;iter<maxIter;iter++)
+ for (int iter = 0; iter < maxIter; iter++)
{
//int i=0;
-
+
//solve friction
- for(int i=0; i<numManifolds; i++)
+ for (int i = 0; i < numManifolds; i++)
{
- float maxRambdaDt[4] = {FLT_MAX,FLT_MAX,FLT_MAX,FLT_MAX};
- float minRambdaDt[4] = {0.f,0.f,0.f,0.f};
+ float maxRambdaDt[4] = {FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX};
+ float minRambdaDt[4] = {0.f, 0.f, 0.f, 0.f};
float sum = 0;
- for(int j=0; j<4; j++)
+ for (int j = 0; j < 4; j++)
{
- sum +=contactConstraints[i].m_appliedRambdaDt[j];
+ sum += contactConstraints[i].m_appliedRambdaDt[j];
}
float frictionCoeff = contactConstraints[i].getFrictionCoeff();
int aIdx = (int)contactConstraints[i].m_bodyA;
@@ -670,18 +618,18 @@ void b3GpuJacobiContactSolver::solveGroupHost(b3RigidBodyData* bodies,b3InertiaD
b3RigidBodyData& bodyA = bodies[aIdx];
b3RigidBodyData& bodyB = bodies[bIdx];
- b3Vector3 zero = b3MakeVector3(0,0,0);
-
- b3Vector3* dlvAPtr=&zero;
- b3Vector3* davAPtr=&zero;
- b3Vector3* dlvBPtr=&zero;
- b3Vector3* davBPtr=&zero;
-
+ b3Vector3 zero = b3MakeVector3(0, 0, 0);
+
+ b3Vector3* dlvAPtr = &zero;
+ b3Vector3* davAPtr = &zero;
+ b3Vector3* dlvBPtr = &zero;
+ b3Vector3* davBPtr = &zero;
+
if (bodyA.m_invMass)
{
int bodyOffsetA = offsetSplitBodies[aIdx];
int constraintOffsetA = contactConstraintOffsets[i].x;
- int splitIndexA = bodyOffsetA+constraintOffsetA;
+ int splitIndexA = bodyOffsetA + constraintOffsetA;
dlvAPtr = &deltaLinearVelocities[splitIndexA];
davAPtr = &deltaAngularVelocities[splitIndexA];
}
@@ -690,55 +638,50 @@ void b3GpuJacobiContactSolver::solveGroupHost(b3RigidBodyData* bodies,b3InertiaD
{
int bodyOffsetB = offsetSplitBodies[bIdx];
int constraintOffsetB = contactConstraintOffsets[i].y;
- int splitIndexB= bodyOffsetB+constraintOffsetB;
- dlvBPtr =&deltaLinearVelocities[splitIndexB];
+ int splitIndexB = bodyOffsetB + constraintOffsetB;
+ dlvBPtr = &deltaLinearVelocities[splitIndexB];
davBPtr = &deltaAngularVelocities[splitIndexB];
}
- for(int j=0; j<4; j++)
+ for (int j = 0; j < 4; j++)
{
- maxRambdaDt[j] = frictionCoeff*sum;
+ maxRambdaDt[j] = frictionCoeff * sum;
minRambdaDt[j] = -maxRambdaDt[j];
}
- solveFriction( contactConstraints[i], (b3Vector3&)bodyA.m_pos, (b3Vector3&)bodyA.m_linVel, (b3Vector3&)bodyA.m_angVel, bodyA.m_invMass,inertias[aIdx].m_invInertiaWorld,
- (b3Vector3&)bodyB.m_pos, (b3Vector3&)bodyB.m_linVel, (b3Vector3&)bodyB.m_angVel, bodyB.m_invMass, inertias[bIdx].m_invInertiaWorld,
- maxRambdaDt, minRambdaDt , *dlvAPtr,*davAPtr,*dlvBPtr,*davBPtr);
-
+ solveFriction(contactConstraints[i], (b3Vector3&)bodyA.m_pos, (b3Vector3&)bodyA.m_linVel, (b3Vector3&)bodyA.m_angVel, bodyA.m_invMass, inertias[aIdx].m_invInertiaWorld,
+ (b3Vector3&)bodyB.m_pos, (b3Vector3&)bodyB.m_linVel, (b3Vector3&)bodyB.m_angVel, bodyB.m_invMass, inertias[bIdx].m_invInertiaWorld,
+ maxRambdaDt, minRambdaDt, *dlvAPtr, *davAPtr, *dlvBPtr, *davBPtr);
}
//easy
- for (int i=0;i<numBodies;i++)
+ for (int i = 0; i < numBodies; i++)
{
if (bodies[i].m_invMass)
{
int bodyOffset = offsetSplitBodies[i];
int count = bodyCount[i];
- float factor = 1.f/float(count);
+ float factor = 1.f / float(count);
b3Vector3 averageLinVel;
averageLinVel.setZero();
b3Vector3 averageAngVel;
averageAngVel.setZero();
- for (int j=0;j<count;j++)
+ for (int j = 0; j < count; j++)
{
- averageLinVel += deltaLinearVelocities[bodyOffset+j]*factor;
- averageAngVel += deltaAngularVelocities[bodyOffset+j]*factor;
+ averageLinVel += deltaLinearVelocities[bodyOffset + j] * factor;
+ averageAngVel += deltaAngularVelocities[bodyOffset + j] * factor;
}
- for (int j=0;j<count;j++)
+ for (int j = 0; j < count; j++)
{
- deltaLinearVelocities[bodyOffset+j] = averageLinVel;
- deltaAngularVelocities[bodyOffset+j] = averageAngVel;
+ deltaLinearVelocities[bodyOffset + j] = averageLinVel;
+ deltaAngularVelocities[bodyOffset + j] = averageAngVel;
}
}
}
-
-
-
}
-
//easy
- for (int i=0;i<numBodies;i++)
+ for (int i = 0; i < numBodies; i++)
{
if (bodies[i].m_invMass)
{
@@ -753,8 +696,6 @@ void b3GpuJacobiContactSolver::solveGroupHost(b3RigidBodyData* bodies,b3InertiaD
}
}
-
-
void b3GpuJacobiContactSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_mem inertiaBuf, int numContacts, cl_mem contactBuf, const struct b3Config& config, int static0Index)
//
//
@@ -762,49 +703,47 @@ void b3GpuJacobiContactSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_m
{
b3JacobiSolverInfo solverInfo;
solverInfo.m_fixedBodyIndex = static0Index;
-
B3_PROFILE("b3GpuJacobiContactSolver::solveGroup");
//int numBodies = bodies->size();
- int numManifolds = numContacts;//manifoldPtr->size();
+ int numManifolds = numContacts; //manifoldPtr->size();
{
B3_PROFILE("resize");
m_data->m_bodyCount->resize(numBodies);
}
-
- unsigned int val=0;
+
+ unsigned int val = 0;
b3Int2 val2;
- val2.x=0;
- val2.y=0;
+ val2.x = 0;
+ val2.y = 0;
- {
+ {
B3_PROFILE("m_filler");
m_data->m_contactConstraintOffsets->resize(numManifolds);
- m_data->m_filler->execute(*m_data->m_bodyCount,val,numBodies);
-
-
- m_data->m_filler->execute(*m_data->m_contactConstraintOffsets,val2,numManifolds);
+ m_data->m_filler->execute(*m_data->m_bodyCount, val, numBodies);
+
+ m_data->m_filler->execute(*m_data->m_contactConstraintOffsets, val2, numManifolds);
}
{
B3_PROFILE("m_countBodiesKernel");
- b3LauncherCL launcher(this->m_queue,m_data->m_countBodiesKernel,"m_countBodiesKernel");
- launcher.setBuffer(contactBuf);//manifoldPtr->getBufferCL());
+ b3LauncherCL launcher(this->m_queue, m_data->m_countBodiesKernel, "m_countBodiesKernel");
+ launcher.setBuffer(contactBuf); //manifoldPtr->getBufferCL());
launcher.setBuffer(m_data->m_bodyCount->getBufferCL());
launcher.setBuffer(m_data->m_contactConstraintOffsets->getBufferCL());
launcher.setConst(numManifolds);
launcher.setConst(solverInfo.m_fixedBodyIndex);
launcher.launch1D(numManifolds);
}
- unsigned int totalNumSplitBodies=0;
+ unsigned int totalNumSplitBodies = 0;
{
B3_PROFILE("m_scan->execute");
-
+
m_data->m_offsetSplitBodies->resize(numBodies);
- m_data->m_scan->execute(*m_data->m_bodyCount,*m_data->m_offsetSplitBodies,numBodies,&totalNumSplitBodies);
- totalNumSplitBodies+=m_data->m_bodyCount->at(numBodies-1);
+ m_data->m_scan->execute(*m_data->m_bodyCount, *m_data->m_offsetSplitBodies, numBodies, &totalNumSplitBodies);
+ totalNumSplitBodies += m_data->m_bodyCount->at(numBodies - 1);
}
{
@@ -812,50 +751,45 @@ void b3GpuJacobiContactSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_m
//int numContacts = manifoldPtr->size();
m_data->m_contactConstraints->resize(numContacts);
}
-
+
{
B3_PROFILE("contactToConstraintSplitKernel");
- b3LauncherCL launcher( m_queue, m_data->m_contactToConstraintSplitKernel,"m_contactToConstraintSplitKernel");
+ b3LauncherCL launcher(m_queue, m_data->m_contactToConstraintSplitKernel, "m_contactToConstraintSplitKernel");
launcher.setBuffer(contactBuf);
launcher.setBuffer(bodyBuf);
launcher.setBuffer(inertiaBuf);
launcher.setBuffer(m_data->m_contactConstraints->getBufferCL());
launcher.setBuffer(m_data->m_bodyCount->getBufferCL());
- launcher.setConst(numContacts);
+ launcher.setConst(numContacts);
launcher.setConst(solverInfo.m_deltaTime);
launcher.setConst(solverInfo.m_positionDrift);
launcher.setConst(solverInfo.m_positionConstraintCoeff);
- launcher.launch1D( numContacts, 64 );
-
+ launcher.launch1D(numContacts, 64);
}
-
{
B3_PROFILE("m_data->m_deltaLinearVelocities->resize");
m_data->m_deltaLinearVelocities->resize(totalNumSplitBodies);
m_data->m_deltaAngularVelocities->resize(totalNumSplitBodies);
}
-
-
{
B3_PROFILE("m_clearVelocitiesKernel");
- b3LauncherCL launch(m_queue,m_data->m_clearVelocitiesKernel,"m_clearVelocitiesKernel");
+ b3LauncherCL launch(m_queue, m_data->m_clearVelocitiesKernel, "m_clearVelocitiesKernel");
launch.setBuffer(m_data->m_deltaAngularVelocities->getBufferCL());
launch.setBuffer(m_data->m_deltaLinearVelocities->getBufferCL());
launch.setConst(totalNumSplitBodies);
launch.launch1D(totalNumSplitBodies);
clFinish(m_queue);
}
-
-
+
int maxIter = solverInfo.m_numIterations;
- for (int iter = 0;iter<maxIter;iter++)
+ for (int iter = 0; iter < maxIter; iter++)
{
{
B3_PROFILE("m_solveContactKernel");
- b3LauncherCL launcher( m_queue, m_data->m_solveContactKernel,"m_solveContactKernel" );
+ b3LauncherCL launcher(m_queue, m_data->m_solveContactKernel, "m_solveContactKernel");
launcher.setBuffer(m_data->m_contactConstraints->getBufferCL());
launcher.setBuffer(bodyBuf);
launcher.setBuffer(inertiaBuf);
@@ -873,11 +807,9 @@ void b3GpuJacobiContactSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_m
clFinish(m_queue);
}
-
-
{
B3_PROFILE("average velocities");
- b3LauncherCL launcher( m_queue, m_data->m_averageVelocitiesKernel,"m_averageVelocitiesKernel");
+ b3LauncherCL launcher(m_queue, m_data->m_averageVelocitiesKernel, "m_averageVelocitiesKernel");
launcher.setBuffer(bodyBuf);
launcher.setBuffer(m_data->m_offsetSplitBodies->getBufferCL());
launcher.setBuffer(m_data->m_bodyCount->getBufferCL());
@@ -888,10 +820,9 @@ void b3GpuJacobiContactSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_m
clFinish(m_queue);
}
-
{
B3_PROFILE("m_solveFrictionKernel");
- b3LauncherCL launcher( m_queue, m_data->m_solveFrictionKernel,"m_solveFrictionKernel");
+ b3LauncherCL launcher(m_queue, m_data->m_solveFrictionKernel, "m_solveFrictionKernel");
launcher.setBuffer(m_data->m_contactConstraints->getBufferCL());
launcher.setBuffer(bodyBuf);
launcher.setBuffer(inertiaBuf);
@@ -909,10 +840,9 @@ void b3GpuJacobiContactSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_m
clFinish(m_queue);
}
-
{
B3_PROFILE("average velocities");
- b3LauncherCL launcher( m_queue, m_data->m_averageVelocitiesKernel,"m_averageVelocitiesKernel");
+ b3LauncherCL launcher(m_queue, m_data->m_averageVelocitiesKernel, "m_averageVelocitiesKernel");
launcher.setBuffer(bodyBuf);
launcher.setBuffer(m_data->m_offsetSplitBodies->getBufferCL());
launcher.setBuffer(m_data->m_bodyCount->getBufferCL());
@@ -922,27 +852,20 @@ void b3GpuJacobiContactSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_m
launcher.launch1D(numBodies);
clFinish(m_queue);
}
-
-
-
}
-
{
- B3_PROFILE("update body velocities");
- b3LauncherCL launcher( m_queue, m_data->m_updateBodyVelocitiesKernel,"m_updateBodyVelocitiesKernel");
- launcher.setBuffer(bodyBuf);
- launcher.setBuffer(m_data->m_offsetSplitBodies->getBufferCL());
- launcher.setBuffer(m_data->m_bodyCount->getBufferCL());
- launcher.setBuffer(m_data->m_deltaLinearVelocities->getBufferCL());
- launcher.setBuffer(m_data->m_deltaAngularVelocities->getBufferCL());
- launcher.setConst(numBodies);
- launcher.launch1D(numBodies);
- clFinish(m_queue);
- }
-
-
-
+ B3_PROFILE("update body velocities");
+ b3LauncherCL launcher(m_queue, m_data->m_updateBodyVelocitiesKernel, "m_updateBodyVelocitiesKernel");
+ launcher.setBuffer(bodyBuf);
+ launcher.setBuffer(m_data->m_offsetSplitBodies->getBufferCL());
+ launcher.setBuffer(m_data->m_bodyCount->getBufferCL());
+ launcher.setBuffer(m_data->m_deltaLinearVelocities->getBufferCL());
+ launcher.setBuffer(m_data->m_deltaAngularVelocities->getBufferCL());
+ launcher.setConst(numBodies);
+ launcher.launch1D(numBodies);
+ clFinish(m_queue);
+ }
}
#if 0
diff --git a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuJacobiContactSolver.h b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuJacobiContactSolver.h
index b418f29ec4..8281aee05d 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuJacobiContactSolver.h
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuJacobiContactSolver.h
@@ -8,7 +8,6 @@
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3Contact4Data.h"
#include "Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h"
-
//struct b3InertiaData;
//b3InertiaData
@@ -21,21 +20,20 @@ struct b3JacobiSolverInfo
float m_deltaTime;
float m_positionDrift;
float m_positionConstraintCoeff;
- int m_numIterations;
+ int m_numIterations;
b3JacobiSolverInfo()
- :m_fixedBodyIndex(0),
- m_deltaTime(1./60.f),
- m_positionDrift( 0.005f ),
- m_positionConstraintCoeff( 0.99f ),
- m_numIterations(7)
+ : 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;
@@ -43,20 +41,16 @@ protected:
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(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<b3RigidBodyData>* gpuBodies,b3OpenCLArray<b3InertiaData>* gpuInertias, int numBodies,b3OpenCLArray<b3GpuGenericConstraint>* gpuConstraints,int numConstraints,const b3ContactSolverInfo& infoGlobal);
//void solveGroup(btOpenCLArray<btRigidBodyCL>* bodies,btOpenCLArray<btInertiaCL>* inertias,btOpenCLArray<btContact4>* manifoldPtr,const btJacobiSolverInfo& solverInfo);
//void solveGroupMixed(btOpenCLArray<btRigidBodyCL>* bodies,btOpenCLArray<btInertiaCL>* inertias,btOpenCLArray<btContact4>* manifoldPtr,const btJacobiSolverInfo& solverInfo);
-
};
-#endif //B3_GPU_JACOBI_CONTACT_SOLVER_H
-
+#endif //B3_GPU_JACOBI_CONTACT_SOLVER_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuNarrowPhase.cpp b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuNarrowPhase.cpp
index 698fa15f96..2e4f6c1572 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuNarrowPhase.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuNarrowPhase.cpp
@@ -1,6 +1,5 @@
#include "b3GpuNarrowPhase.h"
-
#include "Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h"
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3ConvexPolyhedronData.h"
#include "Bullet3OpenCL/NarrowphaseCollision/b3ConvexHullContact.h"
@@ -16,107 +15,87 @@
#include "Bullet3OpenCL/NarrowphaseCollision/b3QuantizedBvh.h"
#include "Bullet3Collision/NarrowPhaseCollision/b3ConvexUtility.h"
-
-
-
b3GpuNarrowPhase::b3GpuNarrowPhase(cl_context ctx, cl_device_id device, cl_command_queue queue, const b3Config& config)
-:m_data(0) ,m_planeBodyIndex(-1),m_static0Index(-1),
-m_context(ctx),
-m_device(device),
-m_queue(queue)
+ : m_data(0), m_planeBodyIndex(-1), m_static0Index(-1), m_context(ctx), m_device(device), m_queue(queue)
{
-
m_data = new b3GpuNarrowPhaseInternalData();
m_data->m_currentContactBuffer = 0;
- memset(m_data,0,sizeof(b3GpuNarrowPhaseInternalData));
-
+ memset(m_data, 0, sizeof(b3GpuNarrowPhaseInternalData));
m_data->m_config = config;
-
- m_data->m_gpuSatCollision = new GpuSatCollision(ctx,device,queue);
-
-
- m_data->m_triangleConvexPairs = new b3OpenCLArray<b3Int4>(m_context,m_queue, config.m_maxTriConvexPairCapacity);
+ m_data->m_gpuSatCollision = new GpuSatCollision(ctx, device, queue);
+
+ m_data->m_triangleConvexPairs = new b3OpenCLArray<b3Int4>(m_context, m_queue, config.m_maxTriConvexPairCapacity);
//m_data->m_convexPairsOutGPU = new b3OpenCLArray<b3Int2>(ctx,queue,config.m_maxBroadphasePairs,false);
//m_data->m_planePairs = new b3OpenCLArray<b3Int2>(ctx,queue,config.m_maxBroadphasePairs,false);
-
+
m_data->m_pBufContactOutCPU = new b3AlignedObjectArray<b3Contact4>();
m_data->m_pBufContactOutCPU->resize(config.m_maxBroadphasePairs);
m_data->m_bodyBufferCPU = new b3AlignedObjectArray<b3RigidBodyData>();
m_data->m_bodyBufferCPU->resize(config.m_maxConvexBodies);
-
+
m_data->m_inertiaBufferCPU = new b3AlignedObjectArray<b3InertiaData>();
m_data->m_inertiaBufferCPU->resize(config.m_maxConvexBodies);
-
- m_data->m_pBufContactBuffersGPU[0] = new b3OpenCLArray<b3Contact4>(ctx,queue, config.m_maxContactCapacity,true);
- m_data->m_pBufContactBuffersGPU[1] = new b3OpenCLArray<b3Contact4>(ctx,queue, config.m_maxContactCapacity,true);
-
- m_data->m_inertiaBufferGPU = new b3OpenCLArray<b3InertiaData>(ctx,queue,config.m_maxConvexBodies,false);
- m_data->m_collidablesGPU = new b3OpenCLArray<b3Collidable>(ctx,queue,config.m_maxConvexShapes);
+
+ m_data->m_pBufContactBuffersGPU[0] = new b3OpenCLArray<b3Contact4>(ctx, queue, config.m_maxContactCapacity, true);
+ m_data->m_pBufContactBuffersGPU[1] = new b3OpenCLArray<b3Contact4>(ctx, queue, config.m_maxContactCapacity, true);
+
+ m_data->m_inertiaBufferGPU = new b3OpenCLArray<b3InertiaData>(ctx, queue, config.m_maxConvexBodies, false);
+ m_data->m_collidablesGPU = new b3OpenCLArray<b3Collidable>(ctx, queue, config.m_maxConvexShapes);
m_data->m_collidablesCPU.reserve(config.m_maxConvexShapes);
m_data->m_localShapeAABBCPU = new b3AlignedObjectArray<b3SapAabb>;
- m_data->m_localShapeAABBGPU = new b3OpenCLArray<b3SapAabb>(ctx,queue,config.m_maxConvexShapes);
-
-
+ m_data->m_localShapeAABBGPU = new b3OpenCLArray<b3SapAabb>(ctx, queue, config.m_maxConvexShapes);
+
//m_data->m_solverDataGPU = adl::Solver<adl::TYPE_CL>::allocate(ctx,queue, config.m_maxBroadphasePairs,false);
- m_data->m_bodyBufferGPU = new b3OpenCLArray<b3RigidBodyData>(ctx,queue, config.m_maxConvexBodies,false);
+ m_data->m_bodyBufferGPU = new b3OpenCLArray<b3RigidBodyData>(ctx, queue, config.m_maxConvexBodies, false);
- m_data->m_convexFacesGPU = new b3OpenCLArray<b3GpuFace>(ctx,queue,config.m_maxConvexShapes*config.m_maxFacesPerShape,false);
- m_data->m_convexFaces.reserve(config.m_maxConvexShapes*config.m_maxFacesPerShape);
+ m_data->m_convexFacesGPU = new b3OpenCLArray<b3GpuFace>(ctx, queue, config.m_maxConvexShapes * config.m_maxFacesPerShape, false);
+ m_data->m_convexFaces.reserve(config.m_maxConvexShapes * config.m_maxFacesPerShape);
- m_data->m_gpuChildShapes = new b3OpenCLArray<b3GpuChildShape>(ctx,queue,config.m_maxCompoundChildShapes,false);
-
- m_data->m_convexPolyhedraGPU = new b3OpenCLArray<b3ConvexPolyhedronData>(ctx,queue,config.m_maxConvexShapes,false);
+ m_data->m_gpuChildShapes = new b3OpenCLArray<b3GpuChildShape>(ctx, queue, config.m_maxCompoundChildShapes, false);
+
+ m_data->m_convexPolyhedraGPU = new b3OpenCLArray<b3ConvexPolyhedronData>(ctx, queue, config.m_maxConvexShapes, false);
m_data->m_convexPolyhedra.reserve(config.m_maxConvexShapes);
- m_data->m_uniqueEdgesGPU = new b3OpenCLArray<b3Vector3>(ctx,queue,config.m_maxConvexUniqueEdges,true);
+ m_data->m_uniqueEdgesGPU = new b3OpenCLArray<b3Vector3>(ctx, queue, config.m_maxConvexUniqueEdges, true);
m_data->m_uniqueEdges.reserve(config.m_maxConvexUniqueEdges);
-
-
- m_data->m_convexVerticesGPU = new b3OpenCLArray<b3Vector3>(ctx,queue,config.m_maxConvexVertices,true);
+ m_data->m_convexVerticesGPU = new b3OpenCLArray<b3Vector3>(ctx, queue, config.m_maxConvexVertices, true);
m_data->m_convexVertices.reserve(config.m_maxConvexVertices);
- m_data->m_convexIndicesGPU = new b3OpenCLArray<int>(ctx,queue,config.m_maxConvexIndices,true);
- m_data->m_convexIndices.reserve(config.m_maxConvexIndices);
-
- m_data->m_worldVertsB1GPU = new b3OpenCLArray<b3Vector3>(ctx,queue,config.m_maxConvexBodies*config.m_maxVerticesPerFace);
- m_data->m_clippingFacesOutGPU = new b3OpenCLArray<b3Int4>(ctx,queue,config.m_maxConvexBodies);
- m_data->m_worldNormalsAGPU = new b3OpenCLArray<b3Vector3>(ctx,queue,config.m_maxConvexBodies);
- m_data->m_worldVertsA1GPU = new b3OpenCLArray<b3Vector3>(ctx,queue,config.m_maxConvexBodies*config.m_maxVerticesPerFace);
- m_data->m_worldVertsB2GPU = new b3OpenCLArray<b3Vector3>(ctx,queue,config.m_maxConvexBodies*config.m_maxVerticesPerFace);
-
-
+ m_data->m_convexIndicesGPU = new b3OpenCLArray<int>(ctx, queue, config.m_maxConvexIndices, true);
+ m_data->m_convexIndices.reserve(config.m_maxConvexIndices);
+
+ m_data->m_worldVertsB1GPU = new b3OpenCLArray<b3Vector3>(ctx, queue, config.m_maxConvexBodies * config.m_maxVerticesPerFace);
+ m_data->m_clippingFacesOutGPU = new b3OpenCLArray<b3Int4>(ctx, queue, config.m_maxConvexBodies);
+ m_data->m_worldNormalsAGPU = new b3OpenCLArray<b3Vector3>(ctx, queue, config.m_maxConvexBodies);
+ m_data->m_worldVertsA1GPU = new b3OpenCLArray<b3Vector3>(ctx, queue, config.m_maxConvexBodies * config.m_maxVerticesPerFace);
+ m_data->m_worldVertsB2GPU = new b3OpenCLArray<b3Vector3>(ctx, queue, config.m_maxConvexBodies * config.m_maxVerticesPerFace);
- m_data->m_convexData = new b3AlignedObjectArray<b3ConvexUtility* >();
+ m_data->m_convexData = new b3AlignedObjectArray<b3ConvexUtility*>();
m_data->m_convexData->resize(config.m_maxConvexShapes);
m_data->m_convexPolyhedra.resize(config.m_maxConvexShapes);
-
+
m_data->m_numAcceleratedShapes = 0;
m_data->m_numAcceleratedRigidBodies = 0;
-
-
- m_data->m_subTreesGPU = new b3OpenCLArray<b3BvhSubtreeInfo>(this->m_context,this->m_queue);
- m_data->m_treeNodesGPU = new b3OpenCLArray<b3QuantizedBvhNode>(this->m_context,this->m_queue);
- m_data->m_bvhInfoGPU = new b3OpenCLArray<b3BvhInfo>(this->m_context,this->m_queue);
+
+ m_data->m_subTreesGPU = new b3OpenCLArray<b3BvhSubtreeInfo>(this->m_context, this->m_queue);
+ m_data->m_treeNodesGPU = new b3OpenCLArray<b3QuantizedBvhNode>(this->m_context, this->m_queue);
+ m_data->m_bvhInfoGPU = new b3OpenCLArray<b3BvhInfo>(this->m_context, this->m_queue);
//m_data->m_contactCGPU = new b3OpenCLArray<Constraint4>(ctx,queue,config.m_maxBroadphasePairs,false);
//m_data->m_frictionCGPU = new b3OpenCLArray<adl::Solver<adl::TYPE_CL>::allocateFrictionConstraint( m_data->m_deviceCL, config.m_maxBroadphasePairs);
-
-
-
}
-
b3GpuNarrowPhase::~b3GpuNarrowPhase()
{
delete m_data->m_gpuSatCollision;
-
+
delete m_data->m_triangleConvexPairs;
//delete m_data->m_convexPairsOutGPU;
//delete m_data->m_planePairs;
@@ -126,7 +105,6 @@ b3GpuNarrowPhase::~b3GpuNarrowPhase()
delete m_data->m_pBufContactBuffersGPU[0];
delete m_data->m_pBufContactBuffersGPU[1];
-
delete m_data->m_inertiaBufferGPU;
delete m_data->m_collidablesGPU;
delete m_data->m_localShapeAABBCPU;
@@ -139,18 +117,18 @@ b3GpuNarrowPhase::~b3GpuNarrowPhase()
delete m_data->m_convexVerticesGPU;
delete m_data->m_convexIndicesGPU;
delete m_data->m_worldVertsB1GPU;
- delete m_data->m_clippingFacesOutGPU;
- delete m_data->m_worldNormalsAGPU;
+ delete m_data->m_clippingFacesOutGPU;
+ delete m_data->m_worldNormalsAGPU;
delete m_data->m_worldVertsA1GPU;
- delete m_data->m_worldVertsB2GPU;
-
+ delete m_data->m_worldVertsB2GPU;
+
delete m_data->m_bvhInfoGPU;
- for (int i=0;i<m_data->m_bvhData.size();i++)
+ for (int i = 0; i < m_data->m_bvhData.size(); i++)
{
delete m_data->m_bvhData[i];
}
- for (int i=0;i<m_data->m_meshInterfaces.size();i++)
+ for (int i = 0; i < m_data->m_meshInterfaces.size(); i++)
{
delete m_data->m_meshInterfaces[i];
}
@@ -159,198 +137,180 @@ b3GpuNarrowPhase::~b3GpuNarrowPhase()
delete m_data->m_treeNodesGPU;
delete m_data->m_subTreesGPU;
-
- delete m_data->m_convexData;
+ delete m_data->m_convexData;
delete m_data;
}
-
-int b3GpuNarrowPhase::allocateCollidable()
+int b3GpuNarrowPhase::allocateCollidable()
{
int curSize = m_data->m_collidablesCPU.size();
- if (curSize<m_data->m_config.m_maxConvexShapes)
+ if (curSize < m_data->m_config.m_maxConvexShapes)
{
m_data->m_collidablesCPU.expand();
return curSize;
}
else
{
- b3Error("allocateCollidable out-of-range %d\n",m_data->m_config.m_maxConvexShapes);
+ b3Error("allocateCollidable out-of-range %d\n", m_data->m_config.m_maxConvexShapes);
}
return -1;
-
}
-
-
-
-
-int b3GpuNarrowPhase::registerSphereShape(float radius)
+int b3GpuNarrowPhase::registerSphereShape(float radius)
{
int collidableIndex = allocateCollidable();
- if (collidableIndex<0)
+ if (collidableIndex < 0)
return collidableIndex;
-
b3Collidable& col = getCollidableCpu(collidableIndex);
col.m_shapeType = SHAPE_SPHERE;
col.m_shapeIndex = 0;
col.m_radius = radius;
-
- if (col.m_shapeIndex>=0)
+
+ if (col.m_shapeIndex >= 0)
{
b3SapAabb aabb;
- b3Vector3 myAabbMin=b3MakeVector3(-radius,-radius,-radius);
- b3Vector3 myAabbMax=b3MakeVector3(radius,radius,radius);
+ b3Vector3 myAabbMin = b3MakeVector3(-radius, -radius, -radius);
+ b3Vector3 myAabbMax = b3MakeVector3(radius, radius, radius);
- aabb.m_min[0] = myAabbMin[0];//s_convexHeightField->m_aabb.m_min.x;
- aabb.m_min[1] = myAabbMin[1];//s_convexHeightField->m_aabb.m_min.y;
- aabb.m_min[2] = myAabbMin[2];//s_convexHeightField->m_aabb.m_min.z;
+ aabb.m_min[0] = myAabbMin[0]; //s_convexHeightField->m_aabb.m_min.x;
+ aabb.m_min[1] = myAabbMin[1]; //s_convexHeightField->m_aabb.m_min.y;
+ aabb.m_min[2] = myAabbMin[2]; //s_convexHeightField->m_aabb.m_min.z;
aabb.m_minIndices[3] = 0;
- aabb.m_max[0] = myAabbMax[0];//s_convexHeightField->m_aabb.m_max.x;
- aabb.m_max[1] = myAabbMax[1];//s_convexHeightField->m_aabb.m_max.y;
- aabb.m_max[2] = myAabbMax[2];//s_convexHeightField->m_aabb.m_max.z;
+ aabb.m_max[0] = myAabbMax[0]; //s_convexHeightField->m_aabb.m_max.x;
+ aabb.m_max[1] = myAabbMax[1]; //s_convexHeightField->m_aabb.m_max.y;
+ aabb.m_max[2] = myAabbMax[2]; //s_convexHeightField->m_aabb.m_max.z;
aabb.m_signedMaxIndices[3] = 0;
m_data->m_localShapeAABBCPU->push_back(aabb);
-// m_data->m_localShapeAABBGPU->push_back(aabb);
+ // m_data->m_localShapeAABBGPU->push_back(aabb);
clFinish(m_queue);
}
-
+
return collidableIndex;
}
-
int b3GpuNarrowPhase::registerFace(const b3Vector3& faceNormal, float faceConstant)
{
int faceOffset = m_data->m_convexFaces.size();
b3GpuFace& face = m_data->m_convexFaces.expand();
- face.m_plane = b3MakeVector3(faceNormal.x,faceNormal.y,faceNormal.z,faceConstant);
+ face.m_plane = b3MakeVector3(faceNormal.x, faceNormal.y, faceNormal.z, faceConstant);
return faceOffset;
}
-int b3GpuNarrowPhase::registerPlaneShape(const b3Vector3& planeNormal, float planeConstant)
+int b3GpuNarrowPhase::registerPlaneShape(const b3Vector3& planeNormal, float planeConstant)
{
int collidableIndex = allocateCollidable();
- if (collidableIndex<0)
+ if (collidableIndex < 0)
return collidableIndex;
-
b3Collidable& col = getCollidableCpu(collidableIndex);
col.m_shapeType = SHAPE_PLANE;
- col.m_shapeIndex = registerFace(planeNormal,planeConstant);
+ col.m_shapeIndex = registerFace(planeNormal, planeConstant);
col.m_radius = planeConstant;
-
- if (col.m_shapeIndex>=0)
+
+ if (col.m_shapeIndex >= 0)
{
b3SapAabb aabb;
aabb.m_min[0] = -1e30f;
aabb.m_min[1] = -1e30f;
aabb.m_min[2] = -1e30f;
aabb.m_minIndices[3] = 0;
-
+
aabb.m_max[0] = 1e30f;
aabb.m_max[1] = 1e30f;
aabb.m_max[2] = 1e30f;
aabb.m_signedMaxIndices[3] = 0;
m_data->m_localShapeAABBCPU->push_back(aabb);
-// m_data->m_localShapeAABBGPU->push_back(aabb);
+ // m_data->m_localShapeAABBGPU->push_back(aabb);
clFinish(m_queue);
}
-
+
return collidableIndex;
}
-
-int b3GpuNarrowPhase::registerConvexHullShapeInternal(b3ConvexUtility* convexPtr,b3Collidable& col)
+int b3GpuNarrowPhase::registerConvexHullShapeInternal(b3ConvexUtility* convexPtr, b3Collidable& col)
{
+ m_data->m_convexData->resize(m_data->m_numAcceleratedShapes + 1);
+ m_data->m_convexPolyhedra.resize(m_data->m_numAcceleratedShapes + 1);
- m_data->m_convexData->resize(m_data->m_numAcceleratedShapes+1);
- m_data->m_convexPolyhedra.resize(m_data->m_numAcceleratedShapes+1);
-
-
- b3ConvexPolyhedronData& convex = m_data->m_convexPolyhedra.at(m_data->m_convexPolyhedra.size()-1);
+ b3ConvexPolyhedronData& convex = m_data->m_convexPolyhedra.at(m_data->m_convexPolyhedra.size() - 1);
convex.mC = convexPtr->mC;
convex.mE = convexPtr->mE;
- convex.m_extents= convexPtr->m_extents;
+ convex.m_extents = convexPtr->m_extents;
convex.m_localCenter = convexPtr->m_localCenter;
convex.m_radius = convexPtr->m_radius;
-
+
convex.m_numUniqueEdges = convexPtr->m_uniqueEdges.size();
int edgeOffset = m_data->m_uniqueEdges.size();
convex.m_uniqueEdgesOffset = edgeOffset;
-
- m_data->m_uniqueEdges.resize(edgeOffset+convex.m_numUniqueEdges);
-
+
+ m_data->m_uniqueEdges.resize(edgeOffset + convex.m_numUniqueEdges);
+
//convex data here
int i;
- for ( i=0;i<convexPtr->m_uniqueEdges.size();i++)
+ for (i = 0; i < convexPtr->m_uniqueEdges.size(); i++)
{
- m_data->m_uniqueEdges[edgeOffset+i] = convexPtr->m_uniqueEdges[i];
+ m_data->m_uniqueEdges[edgeOffset + i] = convexPtr->m_uniqueEdges[i];
}
-
+
int faceOffset = m_data->m_convexFaces.size();
convex.m_faceOffset = faceOffset;
convex.m_numFaces = convexPtr->m_faces.size();
- m_data->m_convexFaces.resize(faceOffset+convex.m_numFaces);
-
+ m_data->m_convexFaces.resize(faceOffset + convex.m_numFaces);
- for (i=0;i<convexPtr->m_faces.size();i++)
+ for (i = 0; i < convexPtr->m_faces.size(); i++)
{
- m_data->m_convexFaces[convex.m_faceOffset+i].m_plane = b3MakeVector3(convexPtr->m_faces[i].m_plane[0],
- convexPtr->m_faces[i].m_plane[1],
- convexPtr->m_faces[i].m_plane[2],
- convexPtr->m_faces[i].m_plane[3]);
+ m_data->m_convexFaces[convex.m_faceOffset + i].m_plane = b3MakeVector3(convexPtr->m_faces[i].m_plane[0],
+ convexPtr->m_faces[i].m_plane[1],
+ convexPtr->m_faces[i].m_plane[2],
+ convexPtr->m_faces[i].m_plane[3]);
-
int indexOffset = m_data->m_convexIndices.size();
int numIndices = convexPtr->m_faces[i].m_indices.size();
- m_data->m_convexFaces[convex.m_faceOffset+i].m_numIndices = numIndices;
- m_data->m_convexFaces[convex.m_faceOffset+i].m_indexOffset = indexOffset;
- m_data->m_convexIndices.resize(indexOffset+numIndices);
- for (int p=0;p<numIndices;p++)
+ m_data->m_convexFaces[convex.m_faceOffset + i].m_numIndices = numIndices;
+ m_data->m_convexFaces[convex.m_faceOffset + i].m_indexOffset = indexOffset;
+ m_data->m_convexIndices.resize(indexOffset + numIndices);
+ for (int p = 0; p < numIndices; p++)
{
- m_data->m_convexIndices[indexOffset+p] = convexPtr->m_faces[i].m_indices[p];
+ m_data->m_convexIndices[indexOffset + p] = convexPtr->m_faces[i].m_indices[p];
}
}
-
+
convex.m_numVertices = convexPtr->m_vertices.size();
int vertexOffset = m_data->m_convexVertices.size();
- convex.m_vertexOffset =vertexOffset;
-
- m_data->m_convexVertices.resize(vertexOffset+convex.m_numVertices);
- for (int i=0;i<convexPtr->m_vertices.size();i++)
+ convex.m_vertexOffset = vertexOffset;
+
+ m_data->m_convexVertices.resize(vertexOffset + convex.m_numVertices);
+ for (int i = 0; i < convexPtr->m_vertices.size(); i++)
{
- m_data->m_convexVertices[vertexOffset+i] = convexPtr->m_vertices[i];
+ m_data->m_convexVertices[vertexOffset + i] = convexPtr->m_vertices[i];
}
(*m_data->m_convexData)[m_data->m_numAcceleratedShapes] = convexPtr;
-
-
-
+
return m_data->m_numAcceleratedShapes++;
}
-
-int b3GpuNarrowPhase::registerConvexHullShape(const float* vertices, int strideInBytes, int numVertices, const float* scaling)
+int b3GpuNarrowPhase::registerConvexHullShape(const float* vertices, int strideInBytes, int numVertices, const float* scaling)
{
b3AlignedObjectArray<b3Vector3> verts;
- unsigned char* vts = (unsigned char*) vertices;
- for (int i=0;i<numVertices;i++)
+ unsigned char* vts = (unsigned char*)vertices;
+ for (int i = 0; i < numVertices; i++)
{
- float* vertex = (float*) &vts[i*strideInBytes];
- verts.push_back(b3MakeVector3(vertex[0]*scaling[0],vertex[1]*scaling[1],vertex[2]*scaling[2]));
+ float* vertex = (float*)&vts[i * strideInBytes];
+ verts.push_back(b3MakeVector3(vertex[0] * scaling[0], vertex[1] * scaling[1], vertex[2] * scaling[2]));
}
b3ConvexUtility* utilPtr = new b3ConvexUtility();
bool merge = true;
if (numVertices)
{
- utilPtr->initializePolyhedralFeatures(&verts[0],verts.size(),merge);
+ utilPtr->initializePolyhedralFeatures(&verts[0], verts.size(), merge);
}
int collidableIndex = registerConvexHullShape(utilPtr);
@@ -358,35 +318,34 @@ int b3GpuNarrowPhase::registerConvexHullShape(const float* vertices, int stride
return collidableIndex;
}
-int b3GpuNarrowPhase::registerConvexHullShape(b3ConvexUtility* utilPtr)
+int b3GpuNarrowPhase::registerConvexHullShape(b3ConvexUtility* utilPtr)
{
int collidableIndex = allocateCollidable();
- if (collidableIndex<0)
+ if (collidableIndex < 0)
return collidableIndex;
b3Collidable& col = getCollidableCpu(collidableIndex);
col.m_shapeType = SHAPE_CONVEX_HULL;
col.m_shapeIndex = -1;
-
-
+
{
- b3Vector3 localCenter=b3MakeVector3(0,0,0);
- for (int i=0;i<utilPtr->m_vertices.size();i++)
- localCenter+=utilPtr->m_vertices[i];
- localCenter*= (1.f/utilPtr->m_vertices.size());
+ b3Vector3 localCenter = b3MakeVector3(0, 0, 0);
+ for (int i = 0; i < utilPtr->m_vertices.size(); i++)
+ localCenter += utilPtr->m_vertices[i];
+ localCenter *= (1.f / utilPtr->m_vertices.size());
utilPtr->m_localCenter = localCenter;
- col.m_shapeIndex = registerConvexHullShapeInternal(utilPtr,col);
+ col.m_shapeIndex = registerConvexHullShapeInternal(utilPtr, col);
}
- if (col.m_shapeIndex>=0)
+ if (col.m_shapeIndex >= 0)
{
b3SapAabb aabb;
-
- b3Vector3 myAabbMin=b3MakeVector3(1e30f,1e30f,1e30f);
- b3Vector3 myAabbMax=b3MakeVector3(-1e30f,-1e30f,-1e30f);
- for (int i=0;i<utilPtr->m_vertices.size();i++)
+ b3Vector3 myAabbMin = b3MakeVector3(1e30f, 1e30f, 1e30f);
+ b3Vector3 myAabbMax = b3MakeVector3(-1e30f, -1e30f, -1e30f);
+
+ for (int i = 0; i < utilPtr->m_vertices.size(); i++)
{
myAabbMin.setMin(utilPtr->m_vertices[i]);
myAabbMax.setMax(utilPtr->m_vertices[i]);
@@ -402,18 +361,16 @@ int b3GpuNarrowPhase::registerConvexHullShape(b3ConvexUtility* utilPtr)
aabb.m_signedMaxIndices[3] = 0;
m_data->m_localShapeAABBCPU->push_back(aabb);
-// m_data->m_localShapeAABBGPU->push_back(aabb);
+ // m_data->m_localShapeAABBGPU->push_back(aabb);
}
-
- return collidableIndex;
+ return collidableIndex;
}
-int b3GpuNarrowPhase::registerCompoundShape(b3AlignedObjectArray<b3GpuChildShape>* childShapes)
+int b3GpuNarrowPhase::registerCompoundShape(b3AlignedObjectArray<b3GpuChildShape>* childShapes)
{
-
int collidableIndex = allocateCollidable();
- if (collidableIndex<0)
+ if (collidableIndex < 0)
return collidableIndex;
b3Collidable& col = getCollidableCpu(collidableIndex);
@@ -422,44 +379,41 @@ int b3GpuNarrowPhase::registerCompoundShape(b3AlignedObjectArray<b3GpuChildShap
col.m_compoundBvhIndex = m_data->m_bvhInfoCPU.size();
{
- b3Assert(col.m_shapeIndex+childShapes->size()<m_data->m_config.m_maxCompoundChildShapes);
- for (int i=0;i<childShapes->size();i++)
+ b3Assert(col.m_shapeIndex + childShapes->size() < m_data->m_config.m_maxCompoundChildShapes);
+ for (int i = 0; i < childShapes->size(); i++)
{
m_data->m_cpuChildShapes.push_back(childShapes->at(i));
}
}
-
-
col.m_numChildShapes = childShapes->size();
-
-
+
b3SapAabb aabbLocalSpace;
- b3Vector3 myAabbMin=b3MakeVector3(1e30f,1e30f,1e30f);
- b3Vector3 myAabbMax=b3MakeVector3(-1e30f,-1e30f,-1e30f);
-
+ b3Vector3 myAabbMin = b3MakeVector3(1e30f, 1e30f, 1e30f);
+ b3Vector3 myAabbMax = b3MakeVector3(-1e30f, -1e30f, -1e30f);
+
b3AlignedObjectArray<b3Aabb> childLocalAabbs;
childLocalAabbs.resize(childShapes->size());
//compute local AABB of the compound of all children
- for (int i=0;i<childShapes->size();i++)
+ for (int i = 0; i < childShapes->size(); i++)
{
int childColIndex = childShapes->at(i).m_shapeIndex;
//b3Collidable& childCol = getCollidableCpu(childColIndex);
- b3SapAabb aabbLoc =m_data->m_localShapeAABBCPU->at(childColIndex);
+ b3SapAabb aabbLoc = m_data->m_localShapeAABBCPU->at(childColIndex);
- b3Vector3 childLocalAabbMin=b3MakeVector3(aabbLoc.m_min[0],aabbLoc.m_min[1],aabbLoc.m_min[2]);
- b3Vector3 childLocalAabbMax=b3MakeVector3(aabbLoc.m_max[0],aabbLoc.m_max[1],aabbLoc.m_max[2]);
- b3Vector3 aMin,aMax;
+ b3Vector3 childLocalAabbMin = b3MakeVector3(aabbLoc.m_min[0], aabbLoc.m_min[1], aabbLoc.m_min[2]);
+ b3Vector3 childLocalAabbMax = b3MakeVector3(aabbLoc.m_max[0], aabbLoc.m_max[1], aabbLoc.m_max[2]);
+ b3Vector3 aMin, aMax;
b3Scalar margin(0.f);
b3Transform childTr;
childTr.setIdentity();
childTr.setOrigin(childShapes->at(i).m_childPosition);
childTr.setRotation(b3Quaternion(childShapes->at(i).m_childOrientation));
- b3TransformAabb(childLocalAabbMin,childLocalAabbMax,margin,childTr,aMin,aMax);
+ b3TransformAabb(childLocalAabbMin, childLocalAabbMax, margin, childTr, aMin, aMax);
myAabbMin.setMin(aMin);
- myAabbMax.setMax(aMax);
+ myAabbMax.setMax(aMax);
childLocalAabbs[i].m_min[0] = aMin[0];
childLocalAabbs[i].m_min[1] = aMin[1];
childLocalAabbs[i].m_min[2] = aMin[2];
@@ -469,36 +423,35 @@ int b3GpuNarrowPhase::registerCompoundShape(b3AlignedObjectArray<b3GpuChildShap
childLocalAabbs[i].m_max[2] = aMax[2];
childLocalAabbs[i].m_max[3] = 0;
}
-
- aabbLocalSpace.m_min[0] = myAabbMin[0];//s_convexHeightField->m_aabb.m_min.x;
- aabbLocalSpace.m_min[1]= myAabbMin[1];//s_convexHeightField->m_aabb.m_min.y;
- aabbLocalSpace.m_min[2]= myAabbMin[2];//s_convexHeightField->m_aabb.m_min.z;
+
+ aabbLocalSpace.m_min[0] = myAabbMin[0]; //s_convexHeightField->m_aabb.m_min.x;
+ aabbLocalSpace.m_min[1] = myAabbMin[1]; //s_convexHeightField->m_aabb.m_min.y;
+ aabbLocalSpace.m_min[2] = myAabbMin[2]; //s_convexHeightField->m_aabb.m_min.z;
aabbLocalSpace.m_minIndices[3] = 0;
-
- aabbLocalSpace.m_max[0] = myAabbMax[0];//s_convexHeightField->m_aabb.m_max.x;
- aabbLocalSpace.m_max[1]= myAabbMax[1];//s_convexHeightField->m_aabb.m_max.y;
- aabbLocalSpace.m_max[2]= myAabbMax[2];//s_convexHeightField->m_aabb.m_max.z;
+
+ aabbLocalSpace.m_max[0] = myAabbMax[0]; //s_convexHeightField->m_aabb.m_max.x;
+ aabbLocalSpace.m_max[1] = myAabbMax[1]; //s_convexHeightField->m_aabb.m_max.y;
+ aabbLocalSpace.m_max[2] = myAabbMax[2]; //s_convexHeightField->m_aabb.m_max.z;
aabbLocalSpace.m_signedMaxIndices[3] = 0;
-
- m_data->m_localShapeAABBCPU->push_back(aabbLocalSpace);
+ m_data->m_localShapeAABBCPU->push_back(aabbLocalSpace);
b3QuantizedBvh* bvh = new b3QuantizedBvh;
- bvh->setQuantizationValues(myAabbMin,myAabbMax);
- QuantizedNodeArray& nodes = bvh->getLeafNodeArray();
+ bvh->setQuantizationValues(myAabbMin, myAabbMax);
+ QuantizedNodeArray& nodes = bvh->getLeafNodeArray();
int numNodes = childShapes->size();
- for (int i=0;i<numNodes;i++)
+ for (int i = 0; i < numNodes; i++)
{
b3QuantizedBvhNode node;
- b3Vector3 aabbMin,aabbMax;
- aabbMin = (b3Vector3&) childLocalAabbs[i].m_min;
- aabbMax = (b3Vector3&) childLocalAabbs[i].m_max;
+ b3Vector3 aabbMin, aabbMax;
+ aabbMin = (b3Vector3&)childLocalAabbs[i].m_min;
+ aabbMax = (b3Vector3&)childLocalAabbs[i].m_max;
- bvh->quantize(&node.m_quantizedAabbMin[0],aabbMin,0);
- bvh->quantize(&node.m_quantizedAabbMax[0],aabbMax,1);
+ bvh->quantize(&node.m_quantizedAabbMin[0], aabbMin, 0);
+ bvh->quantize(&node.m_quantizedAabbMax[0], aabbMax, 1);
int partId = 0;
- node.m_escapeIndexOrTriangleIndex = (partId<<(31-MAX_NUM_PARTS_IN_BITS)) | i;
+ node.m_escapeIndexOrTriangleIndex = (partId << (31 - MAX_NUM_PARTS_IN_BITS)) | i;
nodes.push_back(node);
}
bvh->buildInternal();
@@ -511,7 +464,7 @@ int b3GpuNarrowPhase::registerCompoundShape(b3AlignedObjectArray<b3GpuChildShap
//void buildInternal();
b3BvhInfo bvhInfo;
-
+
bvhInfo.m_aabbMin = bvh->m_bvhAabbMin;
bvhInfo.m_aabbMax = bvh->m_bvhAabbMax;
bvhInfo.m_quantization = bvh->m_bvhQuantization;
@@ -520,80 +473,72 @@ int b3GpuNarrowPhase::registerCompoundShape(b3AlignedObjectArray<b3GpuChildShap
bvhInfo.m_nodeOffset = m_data->m_treeNodesCPU.size();
bvhInfo.m_subTreeOffset = m_data->m_subTreesCPU.size();
- int numNewNodes = bvh->getQuantizedNodeArray().size();
+ int numNewNodes = bvh->getQuantizedNodeArray().size();
- for (int i=0;i<numNewNodes-1;i++)
+ for (int i = 0; i < numNewNodes - 1; i++)
{
-
if (bvh->getQuantizedNodeArray()[i].isLeafNode())
{
int orgIndex = bvh->getQuantizedNodeArray()[i].getTriangleIndex();
b3Vector3 nodeMinVec = bvh->unQuantize(bvh->getQuantizedNodeArray()[i].m_quantizedAabbMin);
b3Vector3 nodeMaxVec = bvh->unQuantize(bvh->getQuantizedNodeArray()[i].m_quantizedAabbMax);
-
- for (int c=0;c<3;c++)
+
+ for (int c = 0; c < 3; c++)
{
if (childLocalAabbs[orgIndex].m_min[c] < nodeMinVec[c])
{
- printf("min org (%f) and new (%f) ? at i:%d,c:%d\n",childLocalAabbs[i].m_min[c],nodeMinVec[c],i,c);
+ printf("min org (%f) and new (%f) ? at i:%d,c:%d\n", childLocalAabbs[i].m_min[c], nodeMinVec[c], i, c);
}
if (childLocalAabbs[orgIndex].m_max[c] > nodeMaxVec[c])
{
- printf("max org (%f) and new (%f) ? at i:%d,c:%d\n",childLocalAabbs[i].m_max[c],nodeMaxVec[c],i,c);
+ printf("max org (%f) and new (%f) ? at i:%d,c:%d\n", childLocalAabbs[i].m_max[c], nodeMaxVec[c], i, c);
}
-
}
}
-
}
m_data->m_bvhInfoCPU.push_back(bvhInfo);
int numNewSubtrees = bvh->getSubtreeInfoArray().size();
- m_data->m_subTreesCPU.reserve(m_data->m_subTreesCPU.size()+numNewSubtrees);
- for (int i=0;i<numNewSubtrees;i++)
+ m_data->m_subTreesCPU.reserve(m_data->m_subTreesCPU.size() + numNewSubtrees);
+ for (int i = 0; i < numNewSubtrees; i++)
{
m_data->m_subTreesCPU.push_back(bvh->getSubtreeInfoArray()[i]);
}
int numNewTreeNodes = bvh->getQuantizedNodeArray().size();
- for (int i=0;i<numNewTreeNodes;i++)
+ for (int i = 0; i < numNewTreeNodes; i++)
{
m_data->m_treeNodesCPU.push_back(bvh->getQuantizedNodeArray()[i]);
}
-// m_data->m_localShapeAABBGPU->push_back(aabbWS);
+ // m_data->m_localShapeAABBGPU->push_back(aabbWS);
clFinish(m_queue);
return collidableIndex;
-
}
-
-int b3GpuNarrowPhase::registerConcaveMesh(b3AlignedObjectArray<b3Vector3>* vertices, b3AlignedObjectArray<int>* indices,const float* scaling1)
+int b3GpuNarrowPhase::registerConcaveMesh(b3AlignedObjectArray<b3Vector3>* vertices, b3AlignedObjectArray<int>* indices, const float* scaling1)
{
-
-
- b3Vector3 scaling=b3MakeVector3(scaling1[0],scaling1[1],scaling1[2]);
+ b3Vector3 scaling = b3MakeVector3(scaling1[0], scaling1[1], scaling1[2]);
int collidableIndex = allocateCollidable();
- if (collidableIndex<0)
+ if (collidableIndex < 0)
return collidableIndex;
b3Collidable& col = getCollidableCpu(collidableIndex);
-
+
col.m_shapeType = SHAPE_CONCAVE_TRIMESH;
- col.m_shapeIndex = registerConcaveMeshShape(vertices,indices,col,scaling);
+ col.m_shapeIndex = registerConcaveMeshShape(vertices, indices, col, scaling);
col.m_bvhIndex = m_data->m_bvhInfoCPU.size();
-
b3SapAabb aabb;
- b3Vector3 myAabbMin=b3MakeVector3(1e30f,1e30f,1e30f);
- b3Vector3 myAabbMax=b3MakeVector3(-1e30f,-1e30f,-1e30f);
+ b3Vector3 myAabbMin = b3MakeVector3(1e30f, 1e30f, 1e30f);
+ b3Vector3 myAabbMax = b3MakeVector3(-1e30f, -1e30f, -1e30f);
- for (int i=0;i<vertices->size();i++)
+ for (int i = 0; i < vertices->size(); i++)
{
- b3Vector3 vtx(vertices->at(i)*scaling);
+ b3Vector3 vtx(vertices->at(i) * scaling);
myAabbMin.setMin(vtx);
myAabbMax.setMax(vtx);
}
@@ -603,27 +548,27 @@ int b3GpuNarrowPhase::registerConcaveMesh(b3AlignedObjectArray<b3Vector3>* vert
aabb.m_minIndices[3] = 0;
aabb.m_max[0] = myAabbMax[0];
- aabb.m_max[1]= myAabbMax[1];
- aabb.m_max[2]= myAabbMax[2];
- aabb.m_signedMaxIndices[3]= 0;
+ aabb.m_max[1] = myAabbMax[1];
+ aabb.m_max[2] = myAabbMax[2];
+ aabb.m_signedMaxIndices[3] = 0;
m_data->m_localShapeAABBCPU->push_back(aabb);
-// m_data->m_localShapeAABBGPU->push_back(aabb);
+ // m_data->m_localShapeAABBGPU->push_back(aabb);
b3OptimizedBvh* bvh = new b3OptimizedBvh();
//void b3OptimizedBvh::build(b3StridingMeshInterface* triangles, bool useQuantizedAabbCompression, const b3Vector3& bvhAabbMin, const b3Vector3& bvhAabbMax)
-
+
bool useQuantizedAabbCompression = true;
- b3TriangleIndexVertexArray* meshInterface=new b3TriangleIndexVertexArray();
+ b3TriangleIndexVertexArray* meshInterface = new b3TriangleIndexVertexArray();
m_data->m_meshInterfaces.push_back(meshInterface);
b3IndexedMesh mesh;
- mesh.m_numTriangles = indices->size()/3;
+ mesh.m_numTriangles = indices->size() / 3;
mesh.m_numVertices = vertices->size();
- mesh.m_vertexBase = (const unsigned char *)&vertices->at(0).x;
+ mesh.m_vertexBase = (const unsigned char*)&vertices->at(0).x;
mesh.m_vertexStride = sizeof(b3Vector3);
- mesh.m_triangleIndexStride = 3 * sizeof(int);// or sizeof(int)
- mesh.m_triangleIndexBase = (const unsigned char *)&indices->at(0);
-
+ mesh.m_triangleIndexStride = 3 * sizeof(int); // or sizeof(int)
+ mesh.m_triangleIndexBase = (const unsigned char*)&indices->at(0);
+
meshInterface->addIndexedMesh(mesh);
bvh->build(meshInterface, useQuantizedAabbCompression, (b3Vector3&)aabb.m_min, (b3Vector3&)aabb.m_max);
m_data->m_bvhData.push_back(bvh);
@@ -632,7 +577,7 @@ int b3GpuNarrowPhase::registerConcaveMesh(b3AlignedObjectArray<b3Vector3>* vert
int numSubTrees = bvh->getSubtreeInfoArray().size();
b3BvhInfo bvhInfo;
-
+
bvhInfo.m_aabbMin = bvh->m_bvhAabbMin;
bvhInfo.m_aabbMax = bvh->m_bvhAabbMax;
bvhInfo.m_quantization = bvh->m_bvhQuantization;
@@ -643,97 +588,87 @@ int b3GpuNarrowPhase::registerConcaveMesh(b3AlignedObjectArray<b3Vector3>* vert
m_data->m_bvhInfoCPU.push_back(bvhInfo);
-
int numNewSubtrees = bvh->getSubtreeInfoArray().size();
- m_data->m_subTreesCPU.reserve(m_data->m_subTreesCPU.size()+numNewSubtrees);
- for (int i=0;i<numNewSubtrees;i++)
+ m_data->m_subTreesCPU.reserve(m_data->m_subTreesCPU.size() + numNewSubtrees);
+ for (int i = 0; i < numNewSubtrees; i++)
{
m_data->m_subTreesCPU.push_back(bvh->getSubtreeInfoArray()[i]);
}
int numNewTreeNodes = bvh->getQuantizedNodeArray().size();
- for (int i=0;i<numNewTreeNodes;i++)
+ for (int i = 0; i < numNewTreeNodes; i++)
{
m_data->m_treeNodesCPU.push_back(bvh->getQuantizedNodeArray()[i]);
}
-
-
-
return collidableIndex;
}
-int b3GpuNarrowPhase::registerConcaveMeshShape(b3AlignedObjectArray<b3Vector3>* vertices, b3AlignedObjectArray<int>* indices,b3Collidable& col, const float* scaling1)
+int b3GpuNarrowPhase::registerConcaveMeshShape(b3AlignedObjectArray<b3Vector3>* vertices, b3AlignedObjectArray<int>* indices, b3Collidable& col, const float* scaling1)
{
+ b3Vector3 scaling = b3MakeVector3(scaling1[0], scaling1[1], scaling1[2]);
+ m_data->m_convexData->resize(m_data->m_numAcceleratedShapes + 1);
+ m_data->m_convexPolyhedra.resize(m_data->m_numAcceleratedShapes + 1);
- b3Vector3 scaling=b3MakeVector3(scaling1[0],scaling1[1],scaling1[2]);
-
- m_data->m_convexData->resize(m_data->m_numAcceleratedShapes+1);
- m_data->m_convexPolyhedra.resize(m_data->m_numAcceleratedShapes+1);
-
-
- b3ConvexPolyhedronData& convex = m_data->m_convexPolyhedra.at(m_data->m_convexPolyhedra.size()-1);
- convex.mC = b3MakeVector3(0,0,0);
- convex.mE = b3MakeVector3(0,0,0);
- convex.m_extents= b3MakeVector3(0,0,0);
- convex.m_localCenter = b3MakeVector3(0,0,0);
+ b3ConvexPolyhedronData& convex = m_data->m_convexPolyhedra.at(m_data->m_convexPolyhedra.size() - 1);
+ convex.mC = b3MakeVector3(0, 0, 0);
+ convex.mE = b3MakeVector3(0, 0, 0);
+ convex.m_extents = b3MakeVector3(0, 0, 0);
+ convex.m_localCenter = b3MakeVector3(0, 0, 0);
convex.m_radius = 0.f;
-
+
convex.m_numUniqueEdges = 0;
int edgeOffset = m_data->m_uniqueEdges.size();
convex.m_uniqueEdgesOffset = edgeOffset;
-
+
int faceOffset = m_data->m_convexFaces.size();
convex.m_faceOffset = faceOffset;
-
- convex.m_numFaces = indices->size()/3;
- m_data->m_convexFaces.resize(faceOffset+convex.m_numFaces);
- m_data->m_convexIndices.reserve(convex.m_numFaces*3);
- for (int i=0;i<convex.m_numFaces;i++)
+
+ convex.m_numFaces = indices->size() / 3;
+ m_data->m_convexFaces.resize(faceOffset + convex.m_numFaces);
+ m_data->m_convexIndices.reserve(convex.m_numFaces * 3);
+ for (int i = 0; i < convex.m_numFaces; i++)
{
- if (i%256==0)
+ if (i % 256 == 0)
{
//printf("i=%d out of %d", i,convex.m_numFaces);
}
- b3Vector3 vert0(vertices->at(indices->at(i*3))*scaling);
- b3Vector3 vert1(vertices->at(indices->at(i*3+1))*scaling);
- b3Vector3 vert2(vertices->at(indices->at(i*3+2))*scaling);
+ b3Vector3 vert0(vertices->at(indices->at(i * 3)) * scaling);
+ b3Vector3 vert1(vertices->at(indices->at(i * 3 + 1)) * scaling);
+ b3Vector3 vert2(vertices->at(indices->at(i * 3 + 2)) * scaling);
- b3Vector3 normal = ((vert1-vert0).cross(vert2-vert0)).normalize();
+ b3Vector3 normal = ((vert1 - vert0).cross(vert2 - vert0)).normalize();
b3Scalar c = -(normal.dot(vert0));
- m_data->m_convexFaces[convex.m_faceOffset+i].m_plane = b3MakeVector4(normal.x,normal.y,normal.z,c);
+ m_data->m_convexFaces[convex.m_faceOffset + i].m_plane = b3MakeVector4(normal.x, normal.y, normal.z, c);
int indexOffset = m_data->m_convexIndices.size();
int numIndices = 3;
- m_data->m_convexFaces[convex.m_faceOffset+i].m_numIndices = numIndices;
- m_data->m_convexFaces[convex.m_faceOffset+i].m_indexOffset = indexOffset;
- m_data->m_convexIndices.resize(indexOffset+numIndices);
- for (int p=0;p<numIndices;p++)
+ m_data->m_convexFaces[convex.m_faceOffset + i].m_numIndices = numIndices;
+ m_data->m_convexFaces[convex.m_faceOffset + i].m_indexOffset = indexOffset;
+ m_data->m_convexIndices.resize(indexOffset + numIndices);
+ for (int p = 0; p < numIndices; p++)
{
- int vi = indices->at(i*3+p);
- m_data->m_convexIndices[indexOffset+p] = vi;//convexPtr->m_faces[i].m_indices[p];
+ int vi = indices->at(i * 3 + p);
+ m_data->m_convexIndices[indexOffset + p] = vi; //convexPtr->m_faces[i].m_indices[p];
}
}
-
+
convex.m_numVertices = vertices->size();
int vertexOffset = m_data->m_convexVertices.size();
- convex.m_vertexOffset =vertexOffset;
- m_data->m_convexVertices.resize(vertexOffset+convex.m_numVertices);
- for (int i=0;i<vertices->size();i++)
+ convex.m_vertexOffset = vertexOffset;
+ m_data->m_convexVertices.resize(vertexOffset + convex.m_numVertices);
+ for (int i = 0; i < vertices->size(); i++)
{
- m_data->m_convexVertices[vertexOffset+i] = vertices->at(i)*scaling;
+ m_data->m_convexVertices[vertexOffset + i] = vertices->at(i) * scaling;
}
(*m_data->m_convexData)[m_data->m_numAcceleratedShapes] = 0;
-
-
+
return m_data->m_numAcceleratedShapes++;
}
-
-
-cl_mem b3GpuNarrowPhase::getBodiesGpu()
+cl_mem b3GpuNarrowPhase::getBodiesGpu()
{
return (cl_mem)m_data->m_bodyBufferGPU->getBufferCL();
}
@@ -743,25 +678,21 @@ const struct b3RigidBodyData* b3GpuNarrowPhase::getBodiesCpu() const
return &m_data->m_bodyBufferCPU->at(0);
};
-
-
-
-int b3GpuNarrowPhase::getNumBodiesGpu() const
+int b3GpuNarrowPhase::getNumBodiesGpu() const
{
return m_data->m_bodyBufferGPU->size();
}
-cl_mem b3GpuNarrowPhase::getBodyInertiasGpu()
+cl_mem b3GpuNarrowPhase::getBodyInertiasGpu()
{
return (cl_mem)m_data->m_inertiaBufferGPU->getBufferCL();
}
-int b3GpuNarrowPhase::getNumBodyInertiasGpu() const
+int b3GpuNarrowPhase::getNumBodyInertiasGpu() const
{
return m_data->m_inertiaBufferGPU->size();
}
-
b3Collidable& b3GpuNarrowPhase::getCollidableCpu(int collidableIndex)
{
return m_data->m_collidablesCPU[collidableIndex];
@@ -789,25 +720,20 @@ const struct b3SapAabb* b3GpuNarrowPhase::getLocalSpaceAabbsCpu() const
if (m_data->m_localShapeAABBCPU->size())
{
return &m_data->m_localShapeAABBCPU->at(0);
- }
+ }
return 0;
}
-
-cl_mem b3GpuNarrowPhase::getAabbLocalSpaceBufferGpu()
+cl_mem b3GpuNarrowPhase::getAabbLocalSpaceBufferGpu()
{
return m_data->m_localShapeAABBGPU->getBufferCL();
}
-int b3GpuNarrowPhase::getNumCollidablesGpu() const
+int b3GpuNarrowPhase::getNumCollidablesGpu() const
{
return m_data->m_collidablesGPU->size();
}
-
-
-
-
-int b3GpuNarrowPhase::getNumContactsGpu() const
+int b3GpuNarrowPhase::getNumContactsGpu() const
{
return m_data->m_pBufContactBuffersGPU[m_data->m_currentContactBuffer]->size();
}
@@ -824,37 +750,33 @@ const b3Contact4* b3GpuNarrowPhase::getContactsCPU() const
void b3GpuNarrowPhase::computeContacts(cl_mem broadphasePairs, int numBroadphasePairs, cl_mem aabbsWorldSpace, int numObjects)
{
-
cl_mem aabbsLocalSpace = m_data->m_localShapeAABBGPU->getBufferCL();
int nContactOut = 0;
//swap buffer
- m_data->m_currentContactBuffer=1-m_data->m_currentContactBuffer;
+ m_data->m_currentContactBuffer = 1 - m_data->m_currentContactBuffer;
//int curSize = m_data->m_pBufContactBuffersGPU[m_data->m_currentContactBuffer]->size();
int maxTriConvexPairCapacity = m_data->m_config.m_maxTriConvexPairCapacity;
- int numTriConvexPairsOut=0;
-
- b3OpenCLArray<b3Int4> broadphasePairsGPU(m_context,m_queue);
- broadphasePairsGPU.setFromOpenCLBuffer(broadphasePairs,numBroadphasePairs);
-
-
+ int numTriConvexPairsOut = 0;
+ b3OpenCLArray<b3Int4> broadphasePairsGPU(m_context, m_queue);
+ broadphasePairsGPU.setFromOpenCLBuffer(broadphasePairs, numBroadphasePairs);
- b3OpenCLArray<b3Aabb> clAabbArrayWorldSpace(this->m_context,this->m_queue);
- clAabbArrayWorldSpace.setFromOpenCLBuffer(aabbsWorldSpace,numObjects);
+ b3OpenCLArray<b3Aabb> clAabbArrayWorldSpace(this->m_context, this->m_queue);
+ clAabbArrayWorldSpace.setFromOpenCLBuffer(aabbsWorldSpace, numObjects);
- b3OpenCLArray<b3Aabb> clAabbArrayLocalSpace(this->m_context,this->m_queue);
- clAabbArrayLocalSpace.setFromOpenCLBuffer(aabbsLocalSpace,numObjects);
+ b3OpenCLArray<b3Aabb> clAabbArrayLocalSpace(this->m_context, this->m_queue);
+ clAabbArrayLocalSpace.setFromOpenCLBuffer(aabbsLocalSpace, numObjects);
m_data->m_gpuSatCollision->computeConvexConvexContactsGPUSAT(
&broadphasePairsGPU, numBroadphasePairs,
m_data->m_bodyBufferGPU,
m_data->m_pBufContactBuffersGPU[m_data->m_currentContactBuffer],
nContactOut,
- m_data->m_pBufContactBuffersGPU[1-m_data->m_currentContactBuffer],
+ m_data->m_pBufContactBuffersGPU[1 - m_data->m_currentContactBuffer],
m_data->m_config.m_maxContactCapacity,
m_data->m_config.m_compoundPairCapacity,
*m_data->m_convexPolyhedraGPU,
@@ -878,8 +800,7 @@ void b3GpuNarrowPhase::computeContacts(cl_mem broadphasePairs, int numBroadphase
numObjects,
maxTriConvexPairCapacity,
*m_data->m_triangleConvexPairs,
- numTriConvexPairsOut
- );
+ numTriConvexPairsOut);
/*b3AlignedObjectArray<b3Int4> broadphasePairsCPU;
broadphasePairsGPU.copyToHost(broadphasePairsCPU);
@@ -892,105 +813,97 @@ const b3SapAabb& b3GpuNarrowPhase::getLocalSpaceAabb(int collidableIndex) const
return m_data->m_localShapeAABBCPU->at(collidableIndex);
}
-
-
-
-
-int b3GpuNarrowPhase::registerRigidBody(int collidableIndex, float mass, const float* position, const float* orientation , const float* aabbMinPtr, const float* aabbMaxPtr,bool writeToGpu)
+int b3GpuNarrowPhase::registerRigidBody(int collidableIndex, float mass, const float* position, const float* orientation, const float* aabbMinPtr, const float* aabbMaxPtr, bool writeToGpu)
{
- b3Vector3 aabbMin=b3MakeVector3(aabbMinPtr[0],aabbMinPtr[1],aabbMinPtr[2]);
- b3Vector3 aabbMax=b3MakeVector3(aabbMaxPtr[0],aabbMaxPtr[1],aabbMaxPtr[2]);
-
+ b3Vector3 aabbMin = b3MakeVector3(aabbMinPtr[0], aabbMinPtr[1], aabbMinPtr[2]);
+ b3Vector3 aabbMax = b3MakeVector3(aabbMaxPtr[0], aabbMaxPtr[1], aabbMaxPtr[2]);
if (m_data->m_numAcceleratedRigidBodies >= (m_data->m_config.m_maxConvexBodies))
{
- b3Error("registerRigidBody: exceeding the number of rigid bodies, %d > %d \n",m_data->m_numAcceleratedRigidBodies,m_data->m_config.m_maxConvexBodies);
+ b3Error("registerRigidBody: exceeding the number of rigid bodies, %d > %d \n", m_data->m_numAcceleratedRigidBodies, m_data->m_config.m_maxConvexBodies);
return -1;
}
-
- m_data->m_bodyBufferCPU->resize(m_data->m_numAcceleratedRigidBodies+1);
-
+
+ m_data->m_bodyBufferCPU->resize(m_data->m_numAcceleratedRigidBodies + 1);
+
b3RigidBodyData& body = m_data->m_bodyBufferCPU->at(m_data->m_numAcceleratedRigidBodies);
-
+
float friction = 1.f;
float restitution = 0.f;
-
+
body.m_frictionCoeff = friction;
body.m_restituitionCoeff = restitution;
- body.m_angVel = b3MakeVector3(0,0,0);
- body.m_linVel=b3MakeVector3(0,0,0);//.setZero();
- body.m_pos =b3MakeVector3(position[0],position[1],position[2]);
- body.m_quat.setValue(orientation[0],orientation[1],orientation[2],orientation[3]);
+ body.m_angVel = b3MakeVector3(0, 0, 0);
+ body.m_linVel = b3MakeVector3(0, 0, 0); //.setZero();
+ body.m_pos = b3MakeVector3(position[0], position[1], position[2]);
+ body.m_quat.setValue(orientation[0], orientation[1], orientation[2], orientation[3]);
body.m_collidableIdx = collidableIndex;
- if (collidableIndex>=0)
+ if (collidableIndex >= 0)
{
-// body.m_shapeType = m_data->m_collidablesCPU.at(collidableIndex).m_shapeType;
- } else
+ // body.m_shapeType = m_data->m_collidablesCPU.at(collidableIndex).m_shapeType;
+ }
+ else
{
- // body.m_shapeType = CollisionShape::SHAPE_PLANE;
+ // body.m_shapeType = CollisionShape::SHAPE_PLANE;
m_planeBodyIndex = m_data->m_numAcceleratedRigidBodies;
}
//body.m_shapeType = shapeType;
-
-
- body.m_invMass = mass? 1.f/mass : 0.f;
-
+
+ body.m_invMass = mass ? 1.f / mass : 0.f;
+
if (writeToGpu)
{
- m_data->m_bodyBufferGPU->copyFromHostPointer(&body,1,m_data->m_numAcceleratedRigidBodies);
+ m_data->m_bodyBufferGPU->copyFromHostPointer(&body, 1, m_data->m_numAcceleratedRigidBodies);
}
-
+
b3InertiaData& shapeInfo = m_data->m_inertiaBufferCPU->at(m_data->m_numAcceleratedRigidBodies);
-
- if (mass==0.f)
+
+ if (mass == 0.f)
{
- if (m_data->m_numAcceleratedRigidBodies==0)
+ if (m_data->m_numAcceleratedRigidBodies == 0)
m_static0Index = 0;
-
- shapeInfo.m_initInvInertia.setValue(0,0,0,0,0,0,0,0,0);
- shapeInfo.m_invInertiaWorld.setValue(0,0,0,0,0,0,0,0,0);
- } else
+
+ shapeInfo.m_initInvInertia.setValue(0, 0, 0, 0, 0, 0, 0, 0, 0);
+ shapeInfo.m_invInertiaWorld.setValue(0, 0, 0, 0, 0, 0, 0, 0, 0);
+ }
+ else
{
-
- b3Assert(body.m_collidableIdx>=0);
-
+ b3Assert(body.m_collidableIdx >= 0);
+
//approximate using the aabb of the shape
-
+
//Aabb aabb = (*m_data->m_shapePointers)[shapeIndex]->m_aabb;
- b3Vector3 halfExtents = (aabbMax-aabbMin);//*0.5f;//fake larger inertia makes demos more stable ;-)
-
+ b3Vector3 halfExtents = (aabbMax - aabbMin); //*0.5f;//fake larger inertia makes demos more stable ;-)
+
b3Vector3 localInertia;
-
- float lx=2.f*halfExtents[0];
- float ly=2.f*halfExtents[1];
- float lz=2.f*halfExtents[2];
-
- localInertia.setValue( (mass/12.0f) * (ly*ly + lz*lz),
- (mass/12.0f) * (lx*lx + lz*lz),
- (mass/12.0f) * (lx*lx + ly*ly));
-
+
+ float lx = 2.f * halfExtents[0];
+ float ly = 2.f * halfExtents[1];
+ float lz = 2.f * halfExtents[2];
+
+ localInertia.setValue((mass / 12.0f) * (ly * ly + lz * lz),
+ (mass / 12.0f) * (lx * lx + lz * lz),
+ (mass / 12.0f) * (lx * lx + ly * ly));
+
b3Vector3 invLocalInertia;
- invLocalInertia[0] = 1.f/localInertia[0];
- invLocalInertia[1] = 1.f/localInertia[1];
- invLocalInertia[2] = 1.f/localInertia[2];
+ invLocalInertia[0] = 1.f / localInertia[0];
+ invLocalInertia[1] = 1.f / localInertia[1];
+ invLocalInertia[2] = 1.f / localInertia[2];
invLocalInertia[3] = 0.f;
-
+
shapeInfo.m_initInvInertia.setValue(
- invLocalInertia[0], 0, 0,
- 0, invLocalInertia[1], 0,
- 0, 0, invLocalInertia[2]);
+ invLocalInertia[0], 0, 0,
+ 0, invLocalInertia[1], 0,
+ 0, 0, invLocalInertia[2]);
- b3Matrix3x3 m (body.m_quat);
+ b3Matrix3x3 m(body.m_quat);
shapeInfo.m_invInertiaWorld = m.scaled(invLocalInertia) * m.transpose();
-
}
-
+
if (writeToGpu)
- m_data->m_inertiaBufferGPU->copyFromHostPointer(&shapeInfo,1,m_data->m_numAcceleratedRigidBodies);
-
-
-
+ m_data->m_inertiaBufferGPU->copyFromHostPointer(&shapeInfo, 1, m_data->m_numAcceleratedRigidBodies);
+
return m_data->m_numAcceleratedRigidBodies++;
}
@@ -999,15 +912,13 @@ int b3GpuNarrowPhase::getNumRigidBodies() const
return m_data->m_numAcceleratedRigidBodies;
}
-void b3GpuNarrowPhase::writeAllBodiesToGpu()
+void b3GpuNarrowPhase::writeAllBodiesToGpu()
{
-
if (m_data->m_localShapeAABBCPU->size())
{
m_data->m_localShapeAABBGPU->copyFromHost(*m_data->m_localShapeAABBCPU);
}
-
-
+
m_data->m_gpuChildShapes->copyFromHost(m_data->m_cpuChildShapes);
m_data->m_convexFacesGPU->copyFromHost(m_data->m_convexFaces);
m_data->m_convexPolyhedraGPU->copyFromHost(m_data->m_convexPolyhedra);
@@ -1018,25 +929,21 @@ void b3GpuNarrowPhase::writeAllBodiesToGpu()
m_data->m_treeNodesGPU->copyFromHost(m_data->m_treeNodesCPU);
m_data->m_subTreesGPU->copyFromHost(m_data->m_subTreesCPU);
-
m_data->m_bodyBufferGPU->resize(m_data->m_numAcceleratedRigidBodies);
m_data->m_inertiaBufferGPU->resize(m_data->m_numAcceleratedRigidBodies);
-
+
if (m_data->m_numAcceleratedRigidBodies)
{
- m_data->m_bodyBufferGPU->copyFromHostPointer(&m_data->m_bodyBufferCPU->at(0),m_data->m_numAcceleratedRigidBodies);
- m_data->m_inertiaBufferGPU->copyFromHostPointer(&m_data->m_inertiaBufferCPU->at(0),m_data->m_numAcceleratedRigidBodies);
+ m_data->m_bodyBufferGPU->copyFromHostPointer(&m_data->m_bodyBufferCPU->at(0), m_data->m_numAcceleratedRigidBodies);
+ m_data->m_inertiaBufferGPU->copyFromHostPointer(&m_data->m_inertiaBufferCPU->at(0), m_data->m_numAcceleratedRigidBodies);
}
- if (m_data->m_collidablesCPU.size())
+ if (m_data->m_collidablesCPU.size())
{
m_data->m_collidablesGPU->copyFromHost(m_data->m_collidablesCPU);
}
-
-
}
-
-void b3GpuNarrowPhase::reset()
+void b3GpuNarrowPhase::reset()
{
m_data->m_numAcceleratedShapes = 0;
m_data->m_numAcceleratedRigidBodies = 0;
@@ -1053,21 +960,19 @@ void b3GpuNarrowPhase::reset()
m_data->m_treeNodesCPU.resize(0);
m_data->m_subTreesCPU.resize(0);
m_data->m_bvhInfoCPU.resize(0);
-
}
-
-void b3GpuNarrowPhase::readbackAllBodiesToCpu()
+void b3GpuNarrowPhase::readbackAllBodiesToCpu()
{
- m_data->m_bodyBufferGPU->copyToHostPointer(&m_data->m_bodyBufferCPU->at(0),m_data->m_numAcceleratedRigidBodies);
+ m_data->m_bodyBufferGPU->copyToHostPointer(&m_data->m_bodyBufferCPU->at(0), m_data->m_numAcceleratedRigidBodies);
}
-void b3GpuNarrowPhase::setObjectTransformCpu(float* position, float* orientation , int bodyIndex)
+void b3GpuNarrowPhase::setObjectTransformCpu(float* position, float* orientation, int bodyIndex)
{
- if (bodyIndex>=0 && bodyIndex<m_data->m_bodyBufferCPU->size())
+ if (bodyIndex >= 0 && bodyIndex < m_data->m_bodyBufferCPU->size())
{
- m_data->m_bodyBufferCPU->at(bodyIndex).m_pos=b3MakeVector3(position[0],position[1],position[2]);
- m_data->m_bodyBufferCPU->at(bodyIndex).m_quat.setValue(orientation[0],orientation[1],orientation[2],orientation[3]);
+ m_data->m_bodyBufferCPU->at(bodyIndex).m_pos = b3MakeVector3(position[0], position[1], position[2]);
+ m_data->m_bodyBufferCPU->at(bodyIndex).m_quat.setValue(orientation[0], orientation[1], orientation[2], orientation[3]);
}
else
{
@@ -1076,24 +981,25 @@ void b3GpuNarrowPhase::setObjectTransformCpu(float* position, float* orientation
}
void b3GpuNarrowPhase::setObjectVelocityCpu(float* linVel, float* angVel, int bodyIndex)
{
- if (bodyIndex>=0 && bodyIndex<m_data->m_bodyBufferCPU->size())
+ if (bodyIndex >= 0 && bodyIndex < m_data->m_bodyBufferCPU->size())
{
- m_data->m_bodyBufferCPU->at(bodyIndex).m_linVel=b3MakeVector3(linVel[0],linVel[1],linVel[2]);
- m_data->m_bodyBufferCPU->at(bodyIndex).m_angVel=b3MakeVector3(angVel[0],angVel[1],angVel[2]);
- } else
+ m_data->m_bodyBufferCPU->at(bodyIndex).m_linVel = b3MakeVector3(linVel[0], linVel[1], linVel[2]);
+ m_data->m_bodyBufferCPU->at(bodyIndex).m_angVel = b3MakeVector3(angVel[0], angVel[1], angVel[2]);
+ }
+ else
{
b3Warning("setObjectVelocityCpu out of range.\n");
}
}
-bool b3GpuNarrowPhase::getObjectTransformFromCpu(float* position, float* orientation , int bodyIndex) const
+bool b3GpuNarrowPhase::getObjectTransformFromCpu(float* position, float* orientation, int bodyIndex) const
{
- if (bodyIndex>=0 && bodyIndex<m_data->m_bodyBufferCPU->size())
+ if (bodyIndex >= 0 && bodyIndex < m_data->m_bodyBufferCPU->size())
{
position[0] = m_data->m_bodyBufferCPU->at(bodyIndex).m_pos.x;
position[1] = m_data->m_bodyBufferCPU->at(bodyIndex).m_pos.y;
position[2] = m_data->m_bodyBufferCPU->at(bodyIndex).m_pos.z;
- position[3] = 1.f;//or 1
+ position[3] = 1.f; //or 1
orientation[0] = m_data->m_bodyBufferCPU->at(bodyIndex).m_quat.x;
orientation[1] = m_data->m_bodyBufferCPU->at(bodyIndex).m_quat.y;
diff --git a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuNarrowPhase.h b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuNarrowPhase.h
index 05ff3fd09e..21a68de343 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuNarrowPhase.h
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuNarrowPhase.h
@@ -9,11 +9,10 @@
class b3GpuNarrowPhase
{
protected:
-
- struct b3GpuNarrowPhaseInternalData* m_data;
+ struct b3GpuNarrowPhaseInternalData* m_data;
int m_acceleratedCompanionShapeIndex;
int m_planeBodyIndex;
- int m_static0Index;
+ int m_static0Index;
cl_context m_context;
cl_device_id m_device;
@@ -23,64 +22,58 @@ protected:
int registerConcaveMeshShape(b3AlignedObjectArray<b3Vector3>* vertices, b3AlignedObjectArray<int>* 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 registerSphereShape(float radius);
+ int registerPlaneShape(const b3Vector3& planeNormal, float planeConstant);
int registerCompoundShape(b3AlignedObjectArray<b3GpuChildShape>* childShapes);
int registerFace(const b3Vector3& faceNormal, float faceConstant);
-
- int registerConcaveMesh(b3AlignedObjectArray<b3Vector3>* vertices, b3AlignedObjectArray<int>* indices,const float* scaling);
-
+
+ int registerConcaveMesh(b3AlignedObjectArray<b3Vector3>* vertices, b3AlignedObjectArray<int>* 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);
+ 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 writeAllBodiesToGpu();
+ void reset();
+ void readbackAllBodiesToCpu();
+ bool getObjectTransformFromCpu(float* position, float* orientation, int bodyIndex) const;
- void setObjectTransformCpu(float* position, float* orientation , int bodyIndex);
+ 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();
+ cl_mem getBodiesGpu();
const struct b3RigidBodyData* getBodiesCpu() const;
//struct b3RigidBodyData* getBodiesCpu();
- int getNumBodiesGpu() const;
+ int getNumBodiesGpu() const;
- cl_mem getBodyInertiasGpu();
- int getNumBodyInertiasGpu() const;
+ cl_mem getBodyInertiasGpu();
+ int getNumBodyInertiasGpu() const;
- cl_mem getCollidablesGpu();
+ cl_mem getCollidablesGpu();
const struct b3Collidable* getCollidablesCpu() const;
- int getNumCollidablesGpu() const;
+ int getNumCollidablesGpu() const;
const struct b3SapAabb* getLocalSpaceAabbsCpu() const;
const struct b3Contact4* getContactsCPU() const;
- cl_mem getContactsGpu();
- int getNumContactsGpu() const;
+ cl_mem getContactsGpu();
+ int getNumContactsGpu() const;
+
+ cl_mem getAabbLocalSpaceBufferGpu();
- cl_mem getAabbLocalSpaceBufferGpu();
-
int getNumRigidBodies() const;
int allocateCollidable();
@@ -92,18 +85,17 @@ public:
b3Collidable& getCollidableCpu(int collidableIndex);
const b3Collidable& getCollidableCpu(int collidableIndex) const;
- const b3GpuNarrowPhaseInternalData* getInternalData() const
+ const b3GpuNarrowPhaseInternalData* getInternalData() const
{
- return m_data;
+ return m_data;
}
- b3GpuNarrowPhaseInternalData* getInternalData()
+ b3GpuNarrowPhaseInternalData* getInternalData()
{
- return m_data;
+ return m_data;
}
const struct b3SapAabb& getLocalSpaceAabb(int collidableIndex) const;
};
-#endif //B3_GPU_NARROWPHASE_H
-
+#endif //B3_GPU_NARROWPHASE_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuNarrowPhaseInternalData.h b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuNarrowPhaseInternalData.h
index 8a7f1ea859..716a5ea0fc 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuNarrowPhaseInternalData.h
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuNarrowPhaseInternalData.h
@@ -20,57 +20,53 @@
#include "Bullet3Common/shared/b3Int4.h"
#include "Bullet3Common/shared/b3Int2.h"
-
class b3ConvexUtility;
struct b3GpuNarrowPhaseInternalData
{
b3AlignedObjectArray<b3ConvexUtility*>* m_convexData;
-
+
b3AlignedObjectArray<b3ConvexPolyhedronData> m_convexPolyhedra;
b3AlignedObjectArray<b3Vector3> m_uniqueEdges;
b3AlignedObjectArray<b3Vector3> m_convexVertices;
b3AlignedObjectArray<int> m_convexIndices;
-
+
b3OpenCLArray<b3ConvexPolyhedronData>* m_convexPolyhedraGPU;
b3OpenCLArray<b3Vector3>* m_uniqueEdgesGPU;
b3OpenCLArray<b3Vector3>* m_convexVerticesGPU;
b3OpenCLArray<int>* m_convexIndicesGPU;
-
- b3OpenCLArray<b3Vector3>* m_worldVertsB1GPU;
- b3OpenCLArray<b3Int4>* m_clippingFacesOutGPU;
- b3OpenCLArray<b3Vector3>* m_worldNormalsAGPU;
- b3OpenCLArray<b3Vector3>* m_worldVertsA1GPU;
- b3OpenCLArray<b3Vector3>* m_worldVertsB2GPU;
-
+
+ b3OpenCLArray<b3Vector3>* m_worldVertsB1GPU;
+ b3OpenCLArray<b3Int4>* m_clippingFacesOutGPU;
+ b3OpenCLArray<b3Vector3>* m_worldNormalsAGPU;
+ b3OpenCLArray<b3Vector3>* m_worldVertsA1GPU;
+ b3OpenCLArray<b3Vector3>* m_worldVertsB2GPU;
+
b3AlignedObjectArray<b3GpuChildShape> m_cpuChildShapes;
- b3OpenCLArray<b3GpuChildShape>* m_gpuChildShapes;
-
+ b3OpenCLArray<b3GpuChildShape>* m_gpuChildShapes;
+
b3AlignedObjectArray<b3GpuFace> m_convexFaces;
b3OpenCLArray<b3GpuFace>* m_convexFacesGPU;
-
- struct GpuSatCollision* m_gpuSatCollision;
-
-
- b3OpenCLArray<b3Int4>* m_triangleConvexPairs;
-
-
+
+ struct GpuSatCollision* m_gpuSatCollision;
+
+ b3OpenCLArray<b3Int4>* m_triangleConvexPairs;
+
b3OpenCLArray<b3Contact4>* m_pBufContactBuffersGPU[2];
- int m_currentContactBuffer;
+ int m_currentContactBuffer;
b3AlignedObjectArray<b3Contact4>* m_pBufContactOutCPU;
-
-
+
b3AlignedObjectArray<b3RigidBodyData>* m_bodyBufferCPU;
b3OpenCLArray<b3RigidBodyData>* m_bodyBufferGPU;
-
- b3AlignedObjectArray<b3InertiaData>* m_inertiaBufferCPU;
- b3OpenCLArray<b3InertiaData>* m_inertiaBufferGPU;
-
+
+ b3AlignedObjectArray<b3InertiaData>* m_inertiaBufferCPU;
+ b3OpenCLArray<b3InertiaData>* m_inertiaBufferGPU;
+
int m_numAcceleratedShapes;
int m_numAcceleratedRigidBodies;
-
- b3AlignedObjectArray<b3Collidable> m_collidablesCPU;
- b3OpenCLArray<b3Collidable>* m_collidablesGPU;
+
+ b3AlignedObjectArray<b3Collidable> m_collidablesCPU;
+ b3OpenCLArray<b3Collidable>* m_collidablesGPU;
b3OpenCLArray<b3SapAabb>* m_localShapeAABBGPU;
b3AlignedObjectArray<b3SapAabb>* m_localShapeAABBCPU;
@@ -78,18 +74,16 @@ struct b3GpuNarrowPhaseInternalData
b3AlignedObjectArray<class b3OptimizedBvh*> m_bvhData;
b3AlignedObjectArray<class b3TriangleIndexVertexArray*> m_meshInterfaces;
- b3AlignedObjectArray<b3QuantizedBvhNode> m_treeNodesCPU;
- b3AlignedObjectArray<b3BvhSubtreeInfo> m_subTreesCPU;
+ b3AlignedObjectArray<b3QuantizedBvhNode> m_treeNodesCPU;
+ b3AlignedObjectArray<b3BvhSubtreeInfo> m_subTreesCPU;
+
+ b3AlignedObjectArray<b3BvhInfo> m_bvhInfoCPU;
+ b3OpenCLArray<b3BvhInfo>* m_bvhInfoGPU;
- b3AlignedObjectArray<b3BvhInfo> m_bvhInfoCPU;
- b3OpenCLArray<b3BvhInfo>* m_bvhInfoGPU;
-
- b3OpenCLArray<b3QuantizedBvhNode>* m_treeNodesGPU;
- b3OpenCLArray<b3BvhSubtreeInfo>* m_subTreesGPU;
-
+ b3OpenCLArray<b3QuantizedBvhNode>* m_treeNodesGPU;
+ b3OpenCLArray<b3BvhSubtreeInfo>* m_subTreesGPU;
- b3Config m_config;
-
+ b3Config m_config;
};
-#endif //B3_GPU_NARROWPHASE_INTERNAL_DATA_H
+#endif //B3_GPU_NARROWPHASE_INTERNAL_DATA_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsConstraintSolver.cpp b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsConstraintSolver.cpp
index 0d3d50c548..bd9d6bb04b 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsConstraintSolver.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsConstraintSolver.cpp
@@ -14,11 +14,10 @@ subject to the following restrictions:
*/
//Originally written by Erwin Coumans
-
bool useGpuInitSolverBodies = true;
bool useGpuInfo1 = true;
-bool useGpuInfo2= true;
-bool useGpuSolveJointConstraintRows=true;
+bool useGpuInfo2 = true;
+bool useGpuSolveJointConstraintRows = true;
bool useGpuWriteBackVelocities = true;
bool gpuBreakConstraints = true;
@@ -29,27 +28,25 @@ bool gpuBreakConstraints = true;
#include "Bullet3Dynamics/ConstraintSolver/b3TypedConstraint.h"
#include <new>
#include "Bullet3Common/b3AlignedObjectArray.h"
-#include <string.h> //for memset
+#include <string.h> //for memset
#include "Bullet3Collision/NarrowPhaseCollision/b3Contact4.h"
#include "Bullet3OpenCL/ParallelPrimitives/b3OpenCLArray.h"
#include "Bullet3OpenCL/ParallelPrimitives/b3LauncherCL.h"
#include "Bullet3OpenCL/ParallelPrimitives/b3PrefixScanCL.h"
-#include "Bullet3OpenCL/RigidBody/kernels/jointSolver.h" //solveConstraintRowsCL
+#include "Bullet3OpenCL/RigidBody/kernels/jointSolver.h" //solveConstraintRowsCL
#include "Bullet3OpenCL/Initialize/b3OpenCLUtils.h"
#define B3_JOINT_SOLVER_PATH "src/Bullet3OpenCL/RigidBody/kernels/jointSolver.cl"
-
struct b3GpuPgsJacobiSolverInternalData
{
-
cl_context m_context;
cl_device_id m_device;
cl_command_queue m_queue;
- b3PrefixScanCL* m_prefixScan;
+ b3PrefixScanCL* m_prefixScan;
cl_kernel m_solveJointConstraintRowsKernels;
cl_kernel m_initSolverBodiesKernel;
@@ -59,31 +56,27 @@ struct b3GpuPgsJacobiSolverInternalData
cl_kernel m_writeBackVelocitiesKernel;
cl_kernel m_breakViolatedConstraintsKernel;
- b3OpenCLArray<unsigned int>* m_gpuConstraintRowOffsets;
+ b3OpenCLArray<unsigned int>* m_gpuConstraintRowOffsets;
- b3OpenCLArray<b3GpuSolverBody>* m_gpuSolverBodies;
- b3OpenCLArray<b3BatchConstraint>* m_gpuBatchConstraints;
- b3OpenCLArray<b3GpuSolverConstraint>* m_gpuConstraintRows;
- b3OpenCLArray<unsigned int>* m_gpuConstraintInfo1;
+ b3OpenCLArray<b3GpuSolverBody>* m_gpuSolverBodies;
+ b3OpenCLArray<b3BatchConstraint>* m_gpuBatchConstraints;
+ b3OpenCLArray<b3GpuSolverConstraint>* m_gpuConstraintRows;
+ b3OpenCLArray<unsigned int>* m_gpuConstraintInfo1;
-// b3AlignedObjectArray<b3GpuSolverBody> m_cpuSolverBodies;
- b3AlignedObjectArray<b3BatchConstraint> m_cpuBatchConstraints;
- b3AlignedObjectArray<b3GpuSolverConstraint> m_cpuConstraintRows;
- b3AlignedObjectArray<unsigned int> m_cpuConstraintInfo1;
- b3AlignedObjectArray<unsigned int> m_cpuConstraintRowOffsets;
+ // b3AlignedObjectArray<b3GpuSolverBody> m_cpuSolverBodies;
+ b3AlignedObjectArray<b3BatchConstraint> m_cpuBatchConstraints;
+ b3AlignedObjectArray<b3GpuSolverConstraint> m_cpuConstraintRows;
+ b3AlignedObjectArray<unsigned int> m_cpuConstraintInfo1;
+ b3AlignedObjectArray<unsigned int> m_cpuConstraintRowOffsets;
- b3AlignedObjectArray<b3RigidBodyData> m_cpuBodies;
- b3AlignedObjectArray<b3InertiaData> m_cpuInertias;
+ b3AlignedObjectArray<b3RigidBodyData> m_cpuBodies;
+ b3AlignedObjectArray<b3InertiaData> m_cpuInertias;
-
b3AlignedObjectArray<b3GpuGenericConstraint> m_cpuConstraints;
- b3AlignedObjectArray<int> m_batchSizes;
-
-
+ b3AlignedObjectArray<int> m_batchSizes;
};
-
/*
static b3Transform getWorldTransform(b3RigidBodyData* rb)
{
@@ -100,12 +93,12 @@ static const b3Matrix3x3& getInvInertiaTensorWorld(b3InertiaData* inertia)
*/
-static const b3Vector3& getLinearVelocity(b3RigidBodyData* rb)
+static const b3Vector3& getLinearVelocity(b3RigidBodyData* rb)
{
return rb->m_linVel;
}
-static const b3Vector3& getAngularVelocity(b3RigidBodyData* rb)
+static const b3Vector3& getAngularVelocity(b3RigidBodyData* rb)
{
return rb->m_angVel;
}
@@ -114,12 +107,9 @@ b3Vector3 getVelocityInLocalPoint(b3RigidBodyData* rb, const b3Vector3& rel_pos)
{
//we also calculate lin/ang velocity for kinematic objects
return getLinearVelocity(rb) + getAngularVelocity(rb).cross(rel_pos);
-
}
-
-
-b3GpuPgsConstraintSolver::b3GpuPgsConstraintSolver (cl_context ctx, cl_device_id device, cl_command_queue queue,bool usePgs)
+b3GpuPgsConstraintSolver::b3GpuPgsConstraintSolver(cl_context ctx, cl_device_id device, cl_command_queue queue, bool usePgs)
{
m_usePgs = usePgs;
m_gpuData = new b3GpuPgsJacobiSolverInternalData();
@@ -127,45 +117,40 @@ b3GpuPgsConstraintSolver::b3GpuPgsConstraintSolver (cl_context ctx, cl_device_id
m_gpuData->m_device = device;
m_gpuData->m_queue = queue;
- m_gpuData->m_prefixScan = new b3PrefixScanCL(ctx,device,queue);
+ m_gpuData->m_prefixScan = new b3PrefixScanCL(ctx, device, queue);
- m_gpuData->m_gpuConstraintRowOffsets = new b3OpenCLArray<unsigned int>(m_gpuData->m_context,m_gpuData->m_queue);
+ m_gpuData->m_gpuConstraintRowOffsets = new b3OpenCLArray<unsigned int>(m_gpuData->m_context, m_gpuData->m_queue);
- m_gpuData->m_gpuSolverBodies = new b3OpenCLArray<b3GpuSolverBody>(m_gpuData->m_context,m_gpuData->m_queue);
- m_gpuData->m_gpuBatchConstraints = new b3OpenCLArray<b3BatchConstraint>(m_gpuData->m_context,m_gpuData->m_queue);
- m_gpuData->m_gpuConstraintRows = new b3OpenCLArray<b3GpuSolverConstraint>(m_gpuData->m_context,m_gpuData->m_queue);
- m_gpuData->m_gpuConstraintInfo1 = new b3OpenCLArray<unsigned int>(m_gpuData->m_context,m_gpuData->m_queue);
- cl_int errNum=0;
+ m_gpuData->m_gpuSolverBodies = new b3OpenCLArray<b3GpuSolverBody>(m_gpuData->m_context, m_gpuData->m_queue);
+ m_gpuData->m_gpuBatchConstraints = new b3OpenCLArray<b3BatchConstraint>(m_gpuData->m_context, m_gpuData->m_queue);
+ m_gpuData->m_gpuConstraintRows = new b3OpenCLArray<b3GpuSolverConstraint>(m_gpuData->m_context, m_gpuData->m_queue);
+ m_gpuData->m_gpuConstraintInfo1 = new b3OpenCLArray<unsigned int>(m_gpuData->m_context, m_gpuData->m_queue);
+ cl_int errNum = 0;
{
- cl_program prog = b3OpenCLUtils::compileCLProgramFromString(m_gpuData->m_context,m_gpuData->m_device,solveConstraintRowsCL,&errNum,"",B3_JOINT_SOLVER_PATH);
+ cl_program prog = b3OpenCLUtils::compileCLProgramFromString(m_gpuData->m_context, m_gpuData->m_device, solveConstraintRowsCL, &errNum, "", B3_JOINT_SOLVER_PATH);
//cl_program prog = b3OpenCLUtils::compileCLProgramFromString(m_gpuData->m_context,m_gpuData->m_device,0,&errNum,"",B3_JOINT_SOLVER_PATH,true);
- b3Assert(errNum==CL_SUCCESS);
- m_gpuData->m_solveJointConstraintRowsKernels = b3OpenCLUtils::compileCLKernelFromString(m_gpuData->m_context, m_gpuData->m_device,solveConstraintRowsCL, "solveJointConstraintRows",&errNum,prog);
- b3Assert(errNum==CL_SUCCESS);
- m_gpuData->m_initSolverBodiesKernel = b3OpenCLUtils::compileCLKernelFromString(m_gpuData->m_context,m_gpuData->m_device,solveConstraintRowsCL,"initSolverBodies",&errNum,prog);
- b3Assert(errNum==CL_SUCCESS);
- m_gpuData->m_getInfo1Kernel = b3OpenCLUtils::compileCLKernelFromString(m_gpuData->m_context,m_gpuData->m_device,solveConstraintRowsCL,"getInfo1Kernel",&errNum,prog);
- b3Assert(errNum==CL_SUCCESS);
- m_gpuData->m_initBatchConstraintsKernel = b3OpenCLUtils::compileCLKernelFromString(m_gpuData->m_context,m_gpuData->m_device,solveConstraintRowsCL,"initBatchConstraintsKernel",&errNum,prog);
- b3Assert(errNum==CL_SUCCESS);
- m_gpuData->m_getInfo2Kernel= b3OpenCLUtils::compileCLKernelFromString(m_gpuData->m_context,m_gpuData->m_device,solveConstraintRowsCL,"getInfo2Kernel",&errNum,prog);
- b3Assert(errNum==CL_SUCCESS);
- m_gpuData->m_writeBackVelocitiesKernel = b3OpenCLUtils::compileCLKernelFromString(m_gpuData->m_context,m_gpuData->m_device,solveConstraintRowsCL,"writeBackVelocitiesKernel",&errNum,prog);
- b3Assert(errNum==CL_SUCCESS);
- m_gpuData->m_breakViolatedConstraintsKernel = b3OpenCLUtils::compileCLKernelFromString(m_gpuData->m_context,m_gpuData->m_device,solveConstraintRowsCL,"breakViolatedConstraintsKernel",&errNum,prog);
- b3Assert(errNum==CL_SUCCESS);
-
-
-
+ b3Assert(errNum == CL_SUCCESS);
+ m_gpuData->m_solveJointConstraintRowsKernels = b3OpenCLUtils::compileCLKernelFromString(m_gpuData->m_context, m_gpuData->m_device, solveConstraintRowsCL, "solveJointConstraintRows", &errNum, prog);
+ b3Assert(errNum == CL_SUCCESS);
+ m_gpuData->m_initSolverBodiesKernel = b3OpenCLUtils::compileCLKernelFromString(m_gpuData->m_context, m_gpuData->m_device, solveConstraintRowsCL, "initSolverBodies", &errNum, prog);
+ b3Assert(errNum == CL_SUCCESS);
+ m_gpuData->m_getInfo1Kernel = b3OpenCLUtils::compileCLKernelFromString(m_gpuData->m_context, m_gpuData->m_device, solveConstraintRowsCL, "getInfo1Kernel", &errNum, prog);
+ b3Assert(errNum == CL_SUCCESS);
+ m_gpuData->m_initBatchConstraintsKernel = b3OpenCLUtils::compileCLKernelFromString(m_gpuData->m_context, m_gpuData->m_device, solveConstraintRowsCL, "initBatchConstraintsKernel", &errNum, prog);
+ b3Assert(errNum == CL_SUCCESS);
+ m_gpuData->m_getInfo2Kernel = b3OpenCLUtils::compileCLKernelFromString(m_gpuData->m_context, m_gpuData->m_device, solveConstraintRowsCL, "getInfo2Kernel", &errNum, prog);
+ b3Assert(errNum == CL_SUCCESS);
+ m_gpuData->m_writeBackVelocitiesKernel = b3OpenCLUtils::compileCLKernelFromString(m_gpuData->m_context, m_gpuData->m_device, solveConstraintRowsCL, "writeBackVelocitiesKernel", &errNum, prog);
+ b3Assert(errNum == CL_SUCCESS);
+ m_gpuData->m_breakViolatedConstraintsKernel = b3OpenCLUtils::compileCLKernelFromString(m_gpuData->m_context, m_gpuData->m_device, solveConstraintRowsCL, "breakViolatedConstraintsKernel", &errNum, prog);
+ b3Assert(errNum == CL_SUCCESS);
clReleaseProgram(prog);
}
-
-
}
-b3GpuPgsConstraintSolver::~b3GpuPgsConstraintSolver ()
+b3GpuPgsConstraintSolver::~b3GpuPgsConstraintSolver()
{
clReleaseKernel(m_gpuData->m_solveJointConstraintRowsKernels);
clReleaseKernel(m_gpuData->m_initSolverBodiesKernel);
@@ -195,16 +180,12 @@ struct b3BatchConstraint
static b3AlignedObjectArray<b3BatchConstraint> batchConstraints;
-
-void b3GpuPgsConstraintSolver::recomputeBatches()
+void b3GpuPgsConstraintSolver::recomputeBatches()
{
m_gpuData->m_batchSizes.clear();
}
-
-
-
-b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlySetup(b3OpenCLArray<b3RigidBodyData>* gpuBodies, b3OpenCLArray<b3InertiaData>* gpuInertias, int numBodies, b3OpenCLArray<b3GpuGenericConstraint>* gpuConstraints,int numConstraints,const b3ContactSolverInfo& infoGlobal)
+b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlySetup(b3OpenCLArray<b3RigidBodyData>* gpuBodies, b3OpenCLArray<b3InertiaData>* gpuInertias, int numBodies, b3OpenCLArray<b3GpuGenericConstraint>* gpuConstraints, int numConstraints, const b3ContactSolverInfo& infoGlobal)
{
B3_PROFILE("GPU solveGroupCacheFriendlySetup");
batchConstraints.resize(numConstraints);
@@ -212,7 +193,6 @@ b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlySetup(b3OpenCLArray<b3
m_staticIdx = -1;
m_maxOverrideNumSolverIterations = 0;
-
/* m_gpuData->m_gpuBodies->resize(numBodies);
m_gpuData->m_gpuBodies->copyFromHostPointer(bodies,numBodies);
@@ -223,15 +203,13 @@ b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlySetup(b3OpenCLArray<b3
m_gpuData->m_gpuSolverBodies->resize(numBodies);
-
m_tmpSolverBodyPool.resize(numBodies);
{
-
if (useGpuInitSolverBodies)
{
B3_PROFILE("m_initSolverBodiesKernel");
- b3LauncherCL launcher(m_gpuData->m_queue,m_gpuData->m_initSolverBodiesKernel,"m_initSolverBodiesKernel");
+ b3LauncherCL launcher(m_gpuData->m_queue, m_gpuData->m_initSolverBodiesKernel, "m_initSolverBodiesKernel");
launcher.setBuffer(m_gpuData->m_gpuSolverBodies->getBufferCL());
launcher.setBuffer(gpuBodies->getBufferCL());
launcher.setConst(numBodies);
@@ -239,48 +217,44 @@ b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlySetup(b3OpenCLArray<b3
clFinish(m_gpuData->m_queue);
// m_gpuData->m_gpuSolverBodies->copyToHost(m_tmpSolverBodyPool);
- } else
+ }
+ else
{
gpuBodies->copyToHost(m_gpuData->m_cpuBodies);
- for (int i=0;i<numBodies;i++)
+ for (int i = 0; i < numBodies; i++)
{
-
b3RigidBodyData& body = m_gpuData->m_cpuBodies[i];
b3GpuSolverBody& solverBody = m_tmpSolverBodyPool[i];
- initSolverBody(i,&solverBody,&body);
+ initSolverBody(i, &solverBody, &body);
solverBody.m_originalBodyIndex = i;
}
m_gpuData->m_gpuSolverBodies->copyFromHost(m_tmpSolverBodyPool);
}
}
-// int totalBodies = 0;
+ // int totalBodies = 0;
int totalNumRows = 0;
//b3RigidBody* rb0=0,*rb1=0;
//if (1)
{
{
-
-
// int i;
m_tmpConstraintSizesPool.resizeNoInitialize(numConstraints);
// b3OpenCLArray<b3GpuGenericConstraint> gpuConstraints(m_gpuData->m_context,m_gpuData->m_queue);
-
if (useGpuInfo1)
{
B3_PROFILE("info1 and init batchConstraint");
-
+
m_gpuData->m_gpuConstraintInfo1->resize(numConstraints);
-
if (1)
{
B3_PROFILE("getInfo1Kernel");
- b3LauncherCL launcher(m_gpuData->m_queue,m_gpuData->m_getInfo1Kernel,"m_getInfo1Kernel");
+ b3LauncherCL launcher(m_gpuData->m_queue, m_gpuData->m_getInfo1Kernel, "m_getInfo1Kernel");
launcher.setBuffer(m_gpuData->m_gpuConstraintInfo1->getBufferCL());
launcher.setBuffer(gpuConstraints->getBufferCL());
launcher.setConst(numConstraints);
@@ -288,19 +262,19 @@ b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlySetup(b3OpenCLArray<b3
clFinish(m_gpuData->m_queue);
}
- if (m_gpuData->m_batchSizes.size()==0)
+ if (m_gpuData->m_batchSizes.size() == 0)
{
B3_PROFILE("initBatchConstraintsKernel");
m_gpuData->m_gpuConstraintRowOffsets->resize(numConstraints);
- unsigned int total=0;
- m_gpuData->m_prefixScan->execute(*m_gpuData->m_gpuConstraintInfo1,*m_gpuData->m_gpuConstraintRowOffsets,numConstraints,&total);
- unsigned int lastElem = m_gpuData->m_gpuConstraintInfo1->at(numConstraints-1);
- totalNumRows = total+lastElem;
+ unsigned int total = 0;
+ m_gpuData->m_prefixScan->execute(*m_gpuData->m_gpuConstraintInfo1, *m_gpuData->m_gpuConstraintRowOffsets, numConstraints, &total);
+ unsigned int lastElem = m_gpuData->m_gpuConstraintInfo1->at(numConstraints - 1);
+ totalNumRows = total + lastElem;
{
B3_PROFILE("init batch constraints");
- b3LauncherCL launcher(m_gpuData->m_queue,m_gpuData->m_initBatchConstraintsKernel,"m_initBatchConstraintsKernel");
+ b3LauncherCL launcher(m_gpuData->m_queue, m_gpuData->m_initBatchConstraintsKernel, "m_initBatchConstraintsKernel");
launcher.setBuffer(m_gpuData->m_gpuConstraintInfo1->getBufferCL());
launcher.setBuffer(m_gpuData->m_gpuConstraintRowOffsets->getBufferCL());
launcher.setBuffer(m_gpuData->m_gpuBatchConstraints->getBufferCL());
@@ -313,79 +287,74 @@ b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlySetup(b3OpenCLArray<b3
//assume the batching happens on CPU, so copy the data
m_gpuData->m_gpuBatchConstraints->copyToHost(batchConstraints);
}
- }
+ }
else
{
- totalNumRows = 0;
+ totalNumRows = 0;
gpuConstraints->copyToHost(m_gpuData->m_cpuConstraints);
//calculate the total number of contraint rows
- for (int i=0;i<numConstraints;i++)
+ for (int i = 0; i < numConstraints; i++)
{
- unsigned int& info1= m_tmpConstraintSizesPool[i];
+ unsigned int& info1 = m_tmpConstraintSizesPool[i];
// unsigned int info1;
if (m_gpuData->m_cpuConstraints[i].isEnabled())
{
-
- m_gpuData->m_cpuConstraints[i].getInfo1(&info1,&m_gpuData->m_cpuBodies[0]);
- } else
+ m_gpuData->m_cpuConstraints[i].getInfo1(&info1, &m_gpuData->m_cpuBodies[0]);
+ }
+ else
{
info1 = 0;
}
-
+
totalNumRows += info1;
}
m_gpuData->m_gpuBatchConstraints->copyFromHost(batchConstraints);
m_gpuData->m_gpuConstraintInfo1->copyFromHost(m_tmpConstraintSizesPool);
-
}
m_tmpSolverNonContactConstraintPool.resizeNoInitialize(totalNumRows);
m_gpuData->m_gpuConstraintRows->resize(totalNumRows);
-
+
// b3GpuConstraintArray verify;
if (useGpuInfo2)
{
{
- B3_PROFILE("getInfo2Kernel");
- b3LauncherCL launcher(m_gpuData->m_queue,m_gpuData->m_getInfo2Kernel,"m_getInfo2Kernel");
- launcher.setBuffer(m_gpuData->m_gpuConstraintRows->getBufferCL());
- launcher.setBuffer(m_gpuData->m_gpuConstraintInfo1->getBufferCL());
- launcher.setBuffer(m_gpuData->m_gpuConstraintRowOffsets->getBufferCL());
- launcher.setBuffer(gpuConstraints->getBufferCL());
- launcher.setBuffer(m_gpuData->m_gpuBatchConstraints->getBufferCL());
- launcher.setBuffer(gpuBodies->getBufferCL());
- launcher.setBuffer(gpuInertias->getBufferCL());
- launcher.setBuffer(m_gpuData->m_gpuSolverBodies->getBufferCL());
- launcher.setConst(infoGlobal.m_timeStep);
- launcher.setConst(infoGlobal.m_erp);
- launcher.setConst(infoGlobal.m_globalCfm);
- launcher.setConst(infoGlobal.m_damping);
- launcher.setConst(infoGlobal.m_numIterations);
- launcher.setConst(numConstraints);
- launcher.launch1D(numConstraints);
- clFinish(m_gpuData->m_queue);
-
- if (m_gpuData->m_batchSizes.size()==0)
- m_gpuData->m_gpuBatchConstraints->copyToHost(batchConstraints);
- //m_gpuData->m_gpuConstraintRows->copyToHost(verify);
- //m_gpuData->m_gpuConstraintRows->copyToHost(m_tmpSolverNonContactConstraintPool);
-
-
+ B3_PROFILE("getInfo2Kernel");
+ b3LauncherCL launcher(m_gpuData->m_queue, m_gpuData->m_getInfo2Kernel, "m_getInfo2Kernel");
+ launcher.setBuffer(m_gpuData->m_gpuConstraintRows->getBufferCL());
+ launcher.setBuffer(m_gpuData->m_gpuConstraintInfo1->getBufferCL());
+ launcher.setBuffer(m_gpuData->m_gpuConstraintRowOffsets->getBufferCL());
+ launcher.setBuffer(gpuConstraints->getBufferCL());
+ launcher.setBuffer(m_gpuData->m_gpuBatchConstraints->getBufferCL());
+ launcher.setBuffer(gpuBodies->getBufferCL());
+ launcher.setBuffer(gpuInertias->getBufferCL());
+ launcher.setBuffer(m_gpuData->m_gpuSolverBodies->getBufferCL());
+ launcher.setConst(infoGlobal.m_timeStep);
+ launcher.setConst(infoGlobal.m_erp);
+ launcher.setConst(infoGlobal.m_globalCfm);
+ launcher.setConst(infoGlobal.m_damping);
+ launcher.setConst(infoGlobal.m_numIterations);
+ launcher.setConst(numConstraints);
+ launcher.launch1D(numConstraints);
+ clFinish(m_gpuData->m_queue);
- }
- }
+ if (m_gpuData->m_batchSizes.size() == 0)
+ m_gpuData->m_gpuBatchConstraints->copyToHost(batchConstraints);
+ //m_gpuData->m_gpuConstraintRows->copyToHost(verify);
+ //m_gpuData->m_gpuConstraintRows->copyToHost(m_tmpSolverNonContactConstraintPool);
+ }
+ }
else
{
-
gpuInertias->copyToHost(m_gpuData->m_cpuInertias);
- ///setup the b3SolverConstraints
-
- for (int i=0;i<numConstraints;i++)
+ ///setup the b3SolverConstraints
+
+ for (int i = 0; i < numConstraints; i++)
{
const int& info1 = m_tmpConstraintSizesPool[i];
-
+
if (info1)
{
int constraintIndex = batchConstraints[i].m_originalConstraintIndex;
@@ -394,15 +363,13 @@ b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlySetup(b3OpenCLArray<b3
b3GpuSolverConstraint* currentConstraintRow = &m_tmpSolverNonContactConstraintPool[constraintRowOffset];
b3GpuGenericConstraint& constraint = m_gpuData->m_cpuConstraints[i];
- b3RigidBodyData& rbA = m_gpuData->m_cpuBodies[ constraint.getRigidBodyA()];
+ b3RigidBodyData& rbA = m_gpuData->m_cpuBodies[constraint.getRigidBodyA()];
//b3RigidBody& rbA = constraint.getRigidBodyA();
- // b3RigidBody& rbB = constraint.getRigidBodyB();
- b3RigidBodyData& rbB = m_gpuData->m_cpuBodies[ constraint.getRigidBodyB()];
-
-
+ // b3RigidBody& rbB = constraint.getRigidBodyB();
+ b3RigidBodyData& rbB = m_gpuData->m_cpuBodies[constraint.getRigidBodyB()];
- int solverBodyIdA = constraint.getRigidBodyA();//getOrInitSolverBody(constraint.getRigidBodyA(),bodies,inertias);
- int solverBodyIdB = constraint.getRigidBodyB();//getOrInitSolverBody(constraint.getRigidBodyB(),bodies,inertias);
+ int solverBodyIdA = constraint.getRigidBodyA(); //getOrInitSolverBody(constraint.getRigidBodyA(),bodies,inertias);
+ int solverBodyIdB = constraint.getRigidBodyB(); //getOrInitSolverBody(constraint.getRigidBodyB(),bodies,inertias);
b3GpuSolverBody* bodyAPtr = &m_tmpSolverBodyPool[solverBodyIdA];
b3GpuSolverBody* bodyBPtr = &m_tmpSolverBodyPool[solverBodyIdB];
@@ -410,7 +377,8 @@ b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlySetup(b3OpenCLArray<b3
if (rbA.m_invMass)
{
batchConstraints[i].m_bodyAPtrAndSignBit = solverBodyIdA;
- } else
+ }
+ else
{
if (!solverBodyIdA)
m_staticIdx = 0;
@@ -420,29 +388,28 @@ b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlySetup(b3OpenCLArray<b3
if (rbB.m_invMass)
{
batchConstraints[i].m_bodyBPtrAndSignBit = solverBodyIdB;
- } else
+ }
+ else
{
if (!solverBodyIdB)
m_staticIdx = 0;
batchConstraints[i].m_bodyBPtrAndSignBit = -solverBodyIdB;
}
-
- int overrideNumSolverIterations = 0;//constraint->getOverrideNumSolverIterations() > 0 ? constraint->getOverrideNumSolverIterations() : infoGlobal.m_numIterations;
- if (overrideNumSolverIterations>m_maxOverrideNumSolverIterations)
+ int overrideNumSolverIterations = 0; //constraint->getOverrideNumSolverIterations() > 0 ? constraint->getOverrideNumSolverIterations() : infoGlobal.m_numIterations;
+ if (overrideNumSolverIterations > m_maxOverrideNumSolverIterations)
m_maxOverrideNumSolverIterations = overrideNumSolverIterations;
-
int j;
- for ( j=0;j<info1;j++)
+ for (j = 0; j < info1; j++)
{
- memset(&currentConstraintRow[j],0,sizeof(b3GpuSolverConstraint));
- currentConstraintRow[j].m_angularComponentA.setValue(0,0,0);
- currentConstraintRow[j].m_angularComponentB.setValue(0,0,0);
+ memset(&currentConstraintRow[j], 0, sizeof(b3GpuSolverConstraint));
+ currentConstraintRow[j].m_angularComponentA.setValue(0, 0, 0);
+ currentConstraintRow[j].m_angularComponentB.setValue(0, 0, 0);
currentConstraintRow[j].m_appliedImpulse = 0.f;
currentConstraintRow[j].m_appliedPushImpulse = 0.f;
currentConstraintRow[j].m_cfm = 0.f;
- currentConstraintRow[j].m_contactNormal.setValue(0,0,0);
+ currentConstraintRow[j].m_contactNormal.setValue(0, 0, 0);
currentConstraintRow[j].m_friction = 0.f;
currentConstraintRow[j].m_frictionIndex = 0;
currentConstraintRow[j].m_jacDiagABInv = 0.f;
@@ -451,13 +418,13 @@ b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlySetup(b3OpenCLArray<b3
currentConstraintRow[j].m_originalContactPoint = 0;
currentConstraintRow[j].m_overrideNumSolverIterations = 0;
- currentConstraintRow[j].m_relpos1CrossNormal.setValue(0,0,0);
- currentConstraintRow[j].m_relpos2CrossNormal.setValue(0,0,0);
+ currentConstraintRow[j].m_relpos1CrossNormal.setValue(0, 0, 0);
+ currentConstraintRow[j].m_relpos2CrossNormal.setValue(0, 0, 0);
currentConstraintRow[j].m_rhs = 0.f;
currentConstraintRow[j].m_rhsPenetration = 0.f;
currentConstraintRow[j].m_solverBodyIdA = 0;
currentConstraintRow[j].m_solverBodyIdB = 0;
-
+
currentConstraintRow[j].m_lowerLimit = -B3_INFINITY;
currentConstraintRow[j].m_upperLimit = B3_INFINITY;
currentConstraintRow[j].m_appliedImpulse = 0.f;
@@ -467,26 +434,25 @@ b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlySetup(b3OpenCLArray<b3
currentConstraintRow[j].m_overrideNumSolverIterations = overrideNumSolverIterations;
}
- bodyAPtr->internalGetDeltaLinearVelocity().setValue(0.f,0.f,0.f);
- bodyAPtr->internalGetDeltaAngularVelocity().setValue(0.f,0.f,0.f);
- bodyAPtr->internalGetPushVelocity().setValue(0.f,0.f,0.f);
- bodyAPtr->internalGetTurnVelocity().setValue(0.f,0.f,0.f);
- bodyBPtr->internalGetDeltaLinearVelocity().setValue(0.f,0.f,0.f);
- bodyBPtr->internalGetDeltaAngularVelocity().setValue(0.f,0.f,0.f);
- bodyBPtr->internalGetPushVelocity().setValue(0.f,0.f,0.f);
- bodyBPtr->internalGetTurnVelocity().setValue(0.f,0.f,0.f);
-
+ bodyAPtr->internalGetDeltaLinearVelocity().setValue(0.f, 0.f, 0.f);
+ bodyAPtr->internalGetDeltaAngularVelocity().setValue(0.f, 0.f, 0.f);
+ bodyAPtr->internalGetPushVelocity().setValue(0.f, 0.f, 0.f);
+ bodyAPtr->internalGetTurnVelocity().setValue(0.f, 0.f, 0.f);
+ bodyBPtr->internalGetDeltaLinearVelocity().setValue(0.f, 0.f, 0.f);
+ bodyBPtr->internalGetDeltaAngularVelocity().setValue(0.f, 0.f, 0.f);
+ bodyBPtr->internalGetPushVelocity().setValue(0.f, 0.f, 0.f);
+ bodyBPtr->internalGetTurnVelocity().setValue(0.f, 0.f, 0.f);
b3GpuConstraintInfo2 info2;
- info2.fps = 1.f/infoGlobal.m_timeStep;
+ info2.fps = 1.f / infoGlobal.m_timeStep;
info2.erp = infoGlobal.m_erp;
info2.m_J1linearAxis = currentConstraintRow->m_contactNormal;
info2.m_J1angularAxis = currentConstraintRow->m_relpos1CrossNormal;
info2.m_J2linearAxis = 0;
info2.m_J2angularAxis = currentConstraintRow->m_relpos2CrossNormal;
- info2.rowskip = sizeof(b3GpuSolverConstraint)/sizeof(b3Scalar);//check this
+ info2.rowskip = sizeof(b3GpuSolverConstraint) / sizeof(b3Scalar); //check this
///the size of b3GpuSolverConstraint needs be a multiple of b3Scalar
- b3Assert(info2.rowskip*sizeof(b3Scalar)== sizeof(b3GpuSolverConstraint));
+ b3Assert(info2.rowskip * sizeof(b3Scalar) == sizeof(b3GpuSolverConstraint));
info2.m_constraintError = &currentConstraintRow->m_rhs;
currentConstraintRow->m_cfm = infoGlobal.m_globalCfm;
info2.m_damping = infoGlobal.m_damping;
@@ -494,47 +460,45 @@ b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlySetup(b3OpenCLArray<b3
info2.m_lowerLimit = &currentConstraintRow->m_lowerLimit;
info2.m_upperLimit = &currentConstraintRow->m_upperLimit;
info2.m_numIterations = infoGlobal.m_numIterations;
- m_gpuData->m_cpuConstraints[i].getInfo2(&info2,&m_gpuData->m_cpuBodies[0]);
+ m_gpuData->m_cpuConstraints[i].getInfo2(&info2, &m_gpuData->m_cpuBodies[0]);
///finalize the constraint setup
- for ( j=0;j<info1;j++)
+ for (j = 0; j < info1; j++)
{
b3GpuSolverConstraint& solverConstraint = currentConstraintRow[j];
- if (solverConstraint.m_upperLimit>=m_gpuData->m_cpuConstraints[i].getBreakingImpulseThreshold())
+ if (solverConstraint.m_upperLimit >= m_gpuData->m_cpuConstraints[i].getBreakingImpulseThreshold())
{
solverConstraint.m_upperLimit = m_gpuData->m_cpuConstraints[i].getBreakingImpulseThreshold();
}
- if (solverConstraint.m_lowerLimit<=-m_gpuData->m_cpuConstraints[i].getBreakingImpulseThreshold())
+ if (solverConstraint.m_lowerLimit <= -m_gpuData->m_cpuConstraints[i].getBreakingImpulseThreshold())
{
solverConstraint.m_lowerLimit = -m_gpuData->m_cpuConstraints[i].getBreakingImpulseThreshold();
}
- // solverConstraint.m_originalContactPoint = constraint;
-
- b3Matrix3x3& invInertiaWorldA= m_gpuData->m_cpuInertias[constraint.getRigidBodyA()].m_invInertiaWorld;
- {
+ // solverConstraint.m_originalContactPoint = constraint;
+ b3Matrix3x3& invInertiaWorldA = m_gpuData->m_cpuInertias[constraint.getRigidBodyA()].m_invInertiaWorld;
+ {
//b3Vector3 angularFactorA(1,1,1);
const b3Vector3& ftorqueAxis1 = solverConstraint.m_relpos1CrossNormal;
- solverConstraint.m_angularComponentA = invInertiaWorldA*ftorqueAxis1;//*angularFactorA;
+ solverConstraint.m_angularComponentA = invInertiaWorldA * ftorqueAxis1; //*angularFactorA;
}
-
- b3Matrix3x3& invInertiaWorldB= m_gpuData->m_cpuInertias[constraint.getRigidBodyB()].m_invInertiaWorld;
- {
+ b3Matrix3x3& invInertiaWorldB = m_gpuData->m_cpuInertias[constraint.getRigidBodyB()].m_invInertiaWorld;
+ {
const b3Vector3& ftorqueAxis2 = solverConstraint.m_relpos2CrossNormal;
- solverConstraint.m_angularComponentB = invInertiaWorldB*ftorqueAxis2;//*constraint.getRigidBodyB().getAngularFactor();
+ solverConstraint.m_angularComponentB = invInertiaWorldB * ftorqueAxis2; //*constraint.getRigidBodyB().getAngularFactor();
}
{
//it is ok to use solverConstraint.m_contactNormal instead of -solverConstraint.m_contactNormal
//because it gets multiplied iMJlB
- b3Vector3 iMJlA = solverConstraint.m_contactNormal*rbA.m_invMass;
- b3Vector3 iMJaA = invInertiaWorldA*solverConstraint.m_relpos1CrossNormal;
- b3Vector3 iMJlB = solverConstraint.m_contactNormal*rbB.m_invMass;//sign of normal?
- b3Vector3 iMJaB = invInertiaWorldB*solverConstraint.m_relpos2CrossNormal;
+ b3Vector3 iMJlA = solverConstraint.m_contactNormal * rbA.m_invMass;
+ b3Vector3 iMJaA = invInertiaWorldA * solverConstraint.m_relpos1CrossNormal;
+ b3Vector3 iMJlB = solverConstraint.m_contactNormal * rbB.m_invMass; //sign of normal?
+ b3Vector3 iMJaB = invInertiaWorldB * solverConstraint.m_relpos2CrossNormal;
b3Scalar sum = iMJlA.dot(solverConstraint.m_contactNormal);
sum += iMJaA.dot(solverConstraint.m_relpos1CrossNormal);
@@ -542,10 +506,9 @@ b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlySetup(b3OpenCLArray<b3
sum += iMJaB.dot(solverConstraint.m_relpos2CrossNormal);
b3Scalar fsum = b3Fabs(sum);
b3Assert(fsum > B3_EPSILON);
- solverConstraint.m_jacDiagABInv = fsum>B3_EPSILON?b3Scalar(1.)/sum : 0.f;
+ solverConstraint.m_jacDiagABInv = fsum > B3_EPSILON ? b3Scalar(1.) / sum : 0.f;
}
-
///fix rhs
///todo: add force/torque accelerators
{
@@ -553,94 +516,80 @@ b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlySetup(b3OpenCLArray<b3
b3Scalar vel1Dotn = solverConstraint.m_contactNormal.dot(rbA.m_linVel) + solverConstraint.m_relpos1CrossNormal.dot(rbA.m_angVel);
b3Scalar vel2Dotn = -solverConstraint.m_contactNormal.dot(rbB.m_linVel) + solverConstraint.m_relpos2CrossNormal.dot(rbB.m_angVel);
- rel_vel = vel1Dotn+vel2Dotn;
+ rel_vel = vel1Dotn + vel2Dotn;
b3Scalar restitution = 0.f;
- b3Scalar positionalError = solverConstraint.m_rhs;//already filled in by getConstraintInfo2
- b3Scalar velocityError = restitution - rel_vel * info2.m_damping;
- b3Scalar penetrationImpulse = positionalError*solverConstraint.m_jacDiagABInv;
- b3Scalar velocityImpulse = velocityError *solverConstraint.m_jacDiagABInv;
- solverConstraint.m_rhs = penetrationImpulse+velocityImpulse;
+ b3Scalar positionalError = solverConstraint.m_rhs; //already filled in by getConstraintInfo2
+ b3Scalar velocityError = restitution - rel_vel * info2.m_damping;
+ b3Scalar penetrationImpulse = positionalError * solverConstraint.m_jacDiagABInv;
+ b3Scalar velocityImpulse = velocityError * solverConstraint.m_jacDiagABInv;
+ solverConstraint.m_rhs = penetrationImpulse + velocityImpulse;
solverConstraint.m_appliedImpulse = 0.f;
-
}
}
-
}
}
-
-
m_gpuData->m_gpuConstraintRows->copyFromHost(m_tmpSolverNonContactConstraintPool);
m_gpuData->m_gpuConstraintInfo1->copyFromHost(m_tmpConstraintSizesPool);
- if (m_gpuData->m_batchSizes.size()==0)
+ if (m_gpuData->m_batchSizes.size() == 0)
m_gpuData->m_gpuBatchConstraints->copyFromHost(batchConstraints);
else
m_gpuData->m_gpuBatchConstraints->copyToHost(batchConstraints);
m_gpuData->m_gpuSolverBodies->copyFromHost(m_tmpSolverBodyPool);
-
-
- }//end useGpuInfo2
-
-
+ } //end useGpuInfo2
}
#ifdef B3_SUPPORT_CONTACT_CONSTRAINTS
{
int i;
- for (i=0;i<numManifolds;i++)
+ for (i = 0; i < numManifolds; i++)
{
b3Contact4& manifold = manifoldPtr[i];
- convertContact(bodies,inertias,&manifold,infoGlobal);
+ convertContact(bodies, inertias, &manifold, infoGlobal);
}
}
-#endif //B3_SUPPORT_CONTACT_CONSTRAINTS
+#endif //B3_SUPPORT_CONTACT_CONSTRAINTS
}
-// b3ContactSolverInfo info = infoGlobal;
-
-
-// int numNonContactPool = m_tmpSolverNonContactConstraintPool.size();
-// int numConstraintPool = m_tmpSolverContactConstraintPool.size();
-// int numFrictionPool = m_tmpSolverContactFrictionConstraintPool.size();
+ // b3ContactSolverInfo info = infoGlobal;
+ // int numNonContactPool = m_tmpSolverNonContactConstraintPool.size();
+ // int numConstraintPool = m_tmpSolverContactConstraintPool.size();
+ // int numFrictionPool = m_tmpSolverContactFrictionConstraintPool.size();
return 0.f;
-
}
-
-
///a straight copy from GPU/OpenCL kernel, for debugging
-__inline void internalApplyImpulse( b3GpuSolverBody* body, const b3Vector3& linearComponent, const b3Vector3& angularComponent,float impulseMagnitude)
+__inline void internalApplyImpulse(b3GpuSolverBody* body, const b3Vector3& linearComponent, const b3Vector3& angularComponent, float impulseMagnitude)
{
- body->m_deltaLinearVelocity += linearComponent*impulseMagnitude*body->m_linearFactor;
- body->m_deltaAngularVelocity += angularComponent*(impulseMagnitude*body->m_angularFactor);
+ body->m_deltaLinearVelocity += linearComponent * impulseMagnitude * body->m_linearFactor;
+ body->m_deltaAngularVelocity += angularComponent * (impulseMagnitude * body->m_angularFactor);
}
-
-void resolveSingleConstraintRowGeneric2( b3GpuSolverBody* body1, b3GpuSolverBody* body2, b3GpuSolverConstraint* c)
+void resolveSingleConstraintRowGeneric2(b3GpuSolverBody* body1, b3GpuSolverBody* body2, b3GpuSolverConstraint* c)
{
- float deltaImpulse = c->m_rhs-b3Scalar(c->m_appliedImpulse)*c->m_cfm;
- float deltaVel1Dotn = b3Dot(c->m_contactNormal,body1->m_deltaLinearVelocity) + b3Dot(c->m_relpos1CrossNormal,body1->m_deltaAngularVelocity);
- float deltaVel2Dotn = -b3Dot(c->m_contactNormal,body2->m_deltaLinearVelocity) + b3Dot(c->m_relpos2CrossNormal,body2->m_deltaAngularVelocity);
+ float deltaImpulse = c->m_rhs - b3Scalar(c->m_appliedImpulse) * c->m_cfm;
+ float deltaVel1Dotn = b3Dot(c->m_contactNormal, body1->m_deltaLinearVelocity) + b3Dot(c->m_relpos1CrossNormal, body1->m_deltaAngularVelocity);
+ float deltaVel2Dotn = -b3Dot(c->m_contactNormal, body2->m_deltaLinearVelocity) + b3Dot(c->m_relpos2CrossNormal, body2->m_deltaAngularVelocity);
- deltaImpulse -= deltaVel1Dotn*c->m_jacDiagABInv;
- deltaImpulse -= deltaVel2Dotn*c->m_jacDiagABInv;
+ deltaImpulse -= deltaVel1Dotn * c->m_jacDiagABInv;
+ deltaImpulse -= deltaVel2Dotn * c->m_jacDiagABInv;
float sum = b3Scalar(c->m_appliedImpulse) + deltaImpulse;
if (sum < c->m_lowerLimit)
{
- deltaImpulse = c->m_lowerLimit-b3Scalar(c->m_appliedImpulse);
+ deltaImpulse = c->m_lowerLimit - b3Scalar(c->m_appliedImpulse);
c->m_appliedImpulse = c->m_lowerLimit;
}
- else if (sum > c->m_upperLimit)
+ else if (sum > c->m_upperLimit)
{
- deltaImpulse = c->m_upperLimit-b3Scalar(c->m_appliedImpulse);
+ deltaImpulse = c->m_upperLimit - b3Scalar(c->m_appliedImpulse);
c->m_appliedImpulse = c->m_upperLimit;
}
else
@@ -648,64 +597,56 @@ void resolveSingleConstraintRowGeneric2( b3GpuSolverBody* body1, b3GpuSolverBod
c->m_appliedImpulse = sum;
}
- internalApplyImpulse(body1,c->m_contactNormal*body1->m_invMass,c->m_angularComponentA,deltaImpulse);
- internalApplyImpulse(body2,-c->m_contactNormal*body2->m_invMass,c->m_angularComponentB,deltaImpulse);
-
+ internalApplyImpulse(body1, c->m_contactNormal * body1->m_invMass, c->m_angularComponentA, deltaImpulse);
+ internalApplyImpulse(body2, -c->m_contactNormal * body2->m_invMass, c->m_angularComponentB, deltaImpulse);
}
-
-
-void b3GpuPgsConstraintSolver::initSolverBody(int bodyIndex, b3GpuSolverBody* solverBody, b3RigidBodyData* rb)
+void b3GpuPgsConstraintSolver::initSolverBody(int bodyIndex, b3GpuSolverBody* solverBody, b3RigidBodyData* rb)
{
-
- solverBody->m_deltaLinearVelocity.setValue(0.f,0.f,0.f);
- solverBody->m_deltaAngularVelocity.setValue(0.f,0.f,0.f);
- solverBody->internalGetPushVelocity().setValue(0.f,0.f,0.f);
- solverBody->internalGetTurnVelocity().setValue(0.f,0.f,0.f);
+ solverBody->m_deltaLinearVelocity.setValue(0.f, 0.f, 0.f);
+ solverBody->m_deltaAngularVelocity.setValue(0.f, 0.f, 0.f);
+ solverBody->internalGetPushVelocity().setValue(0.f, 0.f, 0.f);
+ solverBody->internalGetTurnVelocity().setValue(0.f, 0.f, 0.f);
b3Assert(rb);
-// solverBody->m_worldTransform = getWorldTransform(rb);
- solverBody->internalSetInvMass(b3MakeVector3(rb->m_invMass,rb->m_invMass,rb->m_invMass));
+ // solverBody->m_worldTransform = getWorldTransform(rb);
+ solverBody->internalSetInvMass(b3MakeVector3(rb->m_invMass, rb->m_invMass, rb->m_invMass));
solverBody->m_originalBodyIndex = bodyIndex;
- solverBody->m_angularFactor = b3MakeVector3(1,1,1);
- solverBody->m_linearFactor = b3MakeVector3(1,1,1);
+ solverBody->m_angularFactor = b3MakeVector3(1, 1, 1);
+ solverBody->m_linearFactor = b3MakeVector3(1, 1, 1);
solverBody->m_linearVelocity = getLinearVelocity(rb);
solverBody->m_angularVelocity = getAngularVelocity(rb);
}
-
-void b3GpuPgsConstraintSolver::averageVelocities()
+void b3GpuPgsConstraintSolver::averageVelocities()
{
}
-
-b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlyIterations(b3OpenCLArray<b3GpuGenericConstraint>* gpuConstraints1,int numConstraints,const b3ContactSolverInfo& infoGlobal)
+b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlyIterations(b3OpenCLArray<b3GpuGenericConstraint>* gpuConstraints1, int numConstraints, const b3ContactSolverInfo& infoGlobal)
{
//only create the batches once.
//@todo: incrementally update batches when constraints are added/activated and/or removed/deactivated
B3_PROFILE("GpuSolveGroupCacheFriendlyIterations");
- bool createBatches = m_gpuData->m_batchSizes.size()==0;
+ bool createBatches = m_gpuData->m_batchSizes.size() == 0;
{
-
if (createBatches)
{
-
m_gpuData->m_batchSizes.resize(0);
{
m_gpuData->m_gpuBatchConstraints->copyToHost(batchConstraints);
B3_PROFILE("batch joints");
- b3Assert(batchConstraints.size()==numConstraints);
- int simdWidth =numConstraints+1;
+ b3Assert(batchConstraints.size() == numConstraints);
+ int simdWidth = numConstraints + 1;
int numBodies = m_tmpSolverBodyPool.size();
- sortConstraintByBatch3( &batchConstraints[0], numConstraints, simdWidth , m_staticIdx, numBodies);
+ sortConstraintByBatch3(&batchConstraints[0], numConstraints, simdWidth, m_staticIdx, numBodies);
m_gpuData->m_gpuBatchConstraints->copyFromHost(batchConstraints);
-
}
- } else
+ }
+ else
{
/*b3AlignedObjectArray<b3BatchConstraint> cpuCheckBatches;
m_gpuData->m_gpuBatchConstraints->copyToHost(cpuCheckBatches);
@@ -715,12 +656,11 @@ b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlyIterations(b3OpenCLArr
//>copyFromHost(batchConstraints);
}
int maxIterations = infoGlobal.m_numIterations;
-
+
bool useBatching = true;
- if (useBatching )
+ if (useBatching)
{
-
if (!useGpuSolveJointConstraintRows)
{
B3_PROFILE("copy to host");
@@ -730,24 +670,21 @@ b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlyIterations(b3OpenCLArr
m_gpuData->m_gpuConstraintInfo1->copyToHost(m_gpuData->m_cpuConstraintInfo1);
m_gpuData->m_gpuConstraintRowOffsets->copyToHost(m_gpuData->m_cpuConstraintRowOffsets);
gpuConstraints1->copyToHost(m_gpuData->m_cpuConstraints);
-
}
- for ( int iteration = 0 ; iteration< maxIterations ; iteration++)
+ for (int iteration = 0; iteration < maxIterations; iteration++)
{
-
int batchOffset = 0;
- int constraintOffset=0;
+ int constraintOffset = 0;
int numBatches = m_gpuData->m_batchSizes.size();
- for (int bb=0;bb<numBatches;bb++)
+ for (int bb = 0; bb < numBatches; bb++)
{
int numConstraintsInBatch = m_gpuData->m_batchSizes[bb];
-
if (useGpuSolveJointConstraintRows)
{
B3_PROFILE("solveJointConstraintRowsKernels");
-
+
/*
__kernel void solveJointConstraintRows(__global b3GpuSolverBody* solverBodies,
__global b3BatchConstraint* batchConstraints,
@@ -758,53 +695,48 @@ b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlyIterations(b3OpenCLArr
int batchOffset,
int numConstraintsInBatch*/
-
- b3LauncherCL launcher(m_gpuData->m_queue,m_gpuData->m_solveJointConstraintRowsKernels,"m_solveJointConstraintRowsKernels");
+ b3LauncherCL launcher(m_gpuData->m_queue, m_gpuData->m_solveJointConstraintRowsKernels, "m_solveJointConstraintRowsKernels");
launcher.setBuffer(m_gpuData->m_gpuSolverBodies->getBufferCL());
launcher.setBuffer(m_gpuData->m_gpuBatchConstraints->getBufferCL());
launcher.setBuffer(m_gpuData->m_gpuConstraintRows->getBufferCL());
launcher.setBuffer(m_gpuData->m_gpuConstraintInfo1->getBufferCL());
launcher.setBuffer(m_gpuData->m_gpuConstraintRowOffsets->getBufferCL());
- launcher.setBuffer(gpuConstraints1->getBufferCL());//to detect disabled constraints
+ launcher.setBuffer(gpuConstraints1->getBufferCL()); //to detect disabled constraints
launcher.setConst(batchOffset);
launcher.setConst(numConstraintsInBatch);
launcher.launch1D(numConstraintsInBatch);
-
-
- } else//useGpu
+ }
+ else //useGpu
{
-
-
-
- for (int b=0;b<numConstraintsInBatch;b++)
+ for (int b = 0; b < numConstraintsInBatch; b++)
{
- const b3BatchConstraint& c = batchConstraints[batchOffset+b];
+ const b3BatchConstraint& c = batchConstraints[batchOffset + b];
/*printf("-----------\n");
printf("bb=%d\n",bb);
printf("c.batchId = %d\n", c.m_batchId);
*/
- b3Assert(c.m_batchId==bb);
+ b3Assert(c.m_batchId == bb);
b3GpuGenericConstraint* constraint = &m_gpuData->m_cpuConstraints[c.m_originalConstraintIndex];
- if (constraint->m_flags&B3_CONSTRAINT_FLAG_ENABLED)
+ if (constraint->m_flags & B3_CONSTRAINT_FLAG_ENABLED)
{
int numConstraintRows = m_gpuData->m_cpuConstraintInfo1[c.m_originalConstraintIndex];
int constraintOffset = m_gpuData->m_cpuConstraintRowOffsets[c.m_originalConstraintIndex];
-
- for (int jj=0;jj<numConstraintRows;jj++)
+
+ for (int jj = 0; jj < numConstraintRows; jj++)
{
- //
- b3GpuSolverConstraint& constraint = m_tmpSolverNonContactConstraintPool[constraintOffset+jj];
+ //
+ b3GpuSolverConstraint& constraint = m_tmpSolverNonContactConstraintPool[constraintOffset + jj];
//resolveSingleConstraintRowGenericSIMD(m_tmpSolverBodyPool[constraint.m_solverBodyIdA],m_tmpSolverBodyPool[constraint.m_solverBodyIdB],constraint);
- resolveSingleConstraintRowGeneric2(&m_tmpSolverBodyPool[constraint.m_solverBodyIdA],&m_tmpSolverBodyPool[constraint.m_solverBodyIdB],&constraint);
+ resolveSingleConstraintRowGeneric2(&m_tmpSolverBodyPool[constraint.m_solverBodyIdA], &m_tmpSolverBodyPool[constraint.m_solverBodyIdB], &constraint);
}
}
}
- }//useGpu
- batchOffset+=numConstraintsInBatch;
- constraintOffset+=numConstraintsInBatch;
+ } //useGpu
+ batchOffset += numConstraintsInBatch;
+ constraintOffset += numConstraintsInBatch;
}
- }//for (int iteration...
+ } //for (int iteration...
if (!useGpuSolveJointConstraintRows)
{
@@ -820,20 +752,16 @@ b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlyIterations(b3OpenCLArr
}
//int sz = sizeof(b3GpuSolverBody);
//printf("cpu sizeof(b3GpuSolverBody)=%d\n",sz);
-
-
-
-
-
- } else
+ }
+ else
{
- for ( int iteration = 0 ; iteration< maxIterations ; iteration++)
- {
- int numJoints = m_tmpSolverNonContactConstraintPool.size();
- for (int j=0;j<numJoints;j++)
+ for (int iteration = 0; iteration < maxIterations; iteration++)
+ {
+ int numJoints = m_tmpSolverNonContactConstraintPool.size();
+ for (int j = 0; j < numJoints; j++)
{
b3GpuSolverConstraint& constraint = m_tmpSolverNonContactConstraintPool[j];
- resolveSingleConstraintRowGeneric2(&m_tmpSolverBodyPool[constraint.m_solverBodyIdA],&m_tmpSolverBodyPool[constraint.m_solverBodyIdB],&constraint);
+ resolveSingleConstraintRowGeneric2(&m_tmpSolverBodyPool[constraint.m_solverBodyIdA], &m_tmpSolverBodyPool[constraint.m_solverBodyIdB], &constraint);
}
if (!m_usePgs)
@@ -842,212 +770,198 @@ b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlyIterations(b3OpenCLArr
}
}
}
-
}
clFinish(m_gpuData->m_queue);
return 0.f;
}
-
-
-
static b3AlignedObjectArray<int> bodyUsed;
static b3AlignedObjectArray<int> curUsed;
-
-
-inline int b3GpuPgsConstraintSolver::sortConstraintByBatch3( b3BatchConstraint* cs, int numConstraints, int simdWidth , int staticIdx, int numBodies)
+inline int b3GpuPgsConstraintSolver::sortConstraintByBatch3(b3BatchConstraint* cs, int numConstraints, int simdWidth, int staticIdx, int numBodies)
{
//int sz = sizeof(b3BatchConstraint);
B3_PROFILE("sortConstraintByBatch3");
-
+
static int maxSwaps = 0;
int numSwaps = 0;
- curUsed.resize(2*simdWidth);
+ curUsed.resize(2 * simdWidth);
static int maxNumConstraints = 0;
- if (maxNumConstraints<numConstraints)
+ if (maxNumConstraints < numConstraints)
{
maxNumConstraints = numConstraints;
//printf("maxNumConstraints = %d\n",maxNumConstraints );
}
- int numUsedArray = numBodies/32+1;
+ int numUsedArray = numBodies / 32 + 1;
bodyUsed.resize(numUsedArray);
- for (int q=0;q<numUsedArray;q++)
- bodyUsed[q]=0;
+ for (int q = 0; q < numUsedArray; q++)
+ bodyUsed[q] = 0;
-
int curBodyUsed = 0;
int numIter = 0;
-
-
+
#if defined(_DEBUG)
- for(int i=0; i<numConstraints; i++)
+ for (int i = 0; i < numConstraints; i++)
cs[i].m_batchId = -1;
#endif
-
+
int numValidConstraints = 0;
-// int unprocessedConstraintIndex = 0;
+ // int unprocessedConstraintIndex = 0;
int batchIdx = 0;
-
{
B3_PROFILE("cpu batch innerloop");
-
- while( numValidConstraints < numConstraints)
+
+ while (numValidConstraints < numConstraints)
{
numIter++;
int nCurrentBatch = 0;
// clear flag
- for(int i=0; i<curBodyUsed; i++)
- bodyUsed[curUsed[i]/32] = 0;
+ for (int i = 0; i < curBodyUsed; i++)
+ bodyUsed[curUsed[i] / 32] = 0;
- curBodyUsed = 0;
+ curBodyUsed = 0;
- for(int i=numValidConstraints; i<numConstraints; i++)
+ for (int i = numValidConstraints; i < numConstraints; i++)
{
int idx = i;
- b3Assert( idx < numConstraints );
+ b3Assert(idx < numConstraints);
// check if it can go
int bodyAS = cs[idx].m_bodyAPtrAndSignBit;
int bodyBS = cs[idx].m_bodyBPtrAndSignBit;
int bodyA = abs(bodyAS);
int bodyB = abs(bodyBS);
- bool aIsStatic = (bodyAS<0) || bodyAS==staticIdx;
- bool bIsStatic = (bodyBS<0) || bodyBS==staticIdx;
+ bool aIsStatic = (bodyAS < 0) || bodyAS == staticIdx;
+ bool bIsStatic = (bodyBS < 0) || bodyBS == staticIdx;
int aUnavailable = 0;
int bUnavailable = 0;
if (!aIsStatic)
{
- aUnavailable = bodyUsed[ bodyA/32 ] & (1<<(bodyA&31));
+ aUnavailable = bodyUsed[bodyA / 32] & (1 << (bodyA & 31));
}
if (!aUnavailable)
- if (!bIsStatic)
- {
- bUnavailable = bodyUsed[ bodyB/32 ] & (1<<(bodyB&31));
- }
-
- if( aUnavailable==0 && bUnavailable==0 ) // ok
+ if (!bIsStatic)
+ {
+ bUnavailable = bodyUsed[bodyB / 32] & (1 << (bodyB & 31));
+ }
+
+ if (aUnavailable == 0 && bUnavailable == 0) // ok
{
if (!aIsStatic)
{
- bodyUsed[ bodyA/32 ] |= (1<<(bodyA&31));
- curUsed[curBodyUsed++]=bodyA;
+ bodyUsed[bodyA / 32] |= (1 << (bodyA & 31));
+ curUsed[curBodyUsed++] = bodyA;
}
if (!bIsStatic)
{
- bodyUsed[ bodyB/32 ] |= (1<<(bodyB&31));
- curUsed[curBodyUsed++]=bodyB;
+ bodyUsed[bodyB / 32] |= (1 << (bodyB & 31));
+ curUsed[curBodyUsed++] = bodyB;
}
cs[idx].m_batchId = batchIdx;
- if (i!=numValidConstraints)
+ if (i != numValidConstraints)
{
- b3Swap(cs[i],cs[numValidConstraints]);
+ b3Swap(cs[i], cs[numValidConstraints]);
numSwaps++;
}
numValidConstraints++;
{
nCurrentBatch++;
- if( nCurrentBatch == simdWidth )
+ if (nCurrentBatch == simdWidth)
{
nCurrentBatch = 0;
- for(int i=0; i<curBodyUsed; i++)
- bodyUsed[curUsed[i]/32] = 0;
+ for (int i = 0; i < curBodyUsed; i++)
+ bodyUsed[curUsed[i] / 32] = 0;
curBodyUsed = 0;
}
}
}
}
m_gpuData->m_batchSizes.push_back(nCurrentBatch);
- batchIdx ++;
+ batchIdx++;
}
}
-
+
#if defined(_DEBUG)
- // debugPrintf( "nBatches: %d\n", batchIdx );
- for(int i=0; i<numConstraints; i++)
- {
- b3Assert( cs[i].m_batchId != -1 );
- }
+ // debugPrintf( "nBatches: %d\n", batchIdx );
+ for (int i = 0; i < numConstraints; i++)
+ {
+ b3Assert(cs[i].m_batchId != -1);
+ }
#endif
- if (maxSwaps<numSwaps)
+ if (maxSwaps < numSwaps)
{
maxSwaps = numSwaps;
//printf("maxSwaps = %d\n", maxSwaps);
}
-
+
return batchIdx;
}
-
/// b3PgsJacobiSolver Sequentially applies impulses
-b3Scalar b3GpuPgsConstraintSolver::solveGroup(b3OpenCLArray<b3RigidBodyData>* gpuBodies, b3OpenCLArray<b3InertiaData>* gpuInertias,
- int numBodies, b3OpenCLArray<b3GpuGenericConstraint>* gpuConstraints,int numConstraints, const b3ContactSolverInfo& infoGlobal)
+b3Scalar b3GpuPgsConstraintSolver::solveGroup(b3OpenCLArray<b3RigidBodyData>* gpuBodies, b3OpenCLArray<b3InertiaData>* gpuInertias,
+ int numBodies, b3OpenCLArray<b3GpuGenericConstraint>* gpuConstraints, int numConstraints, const b3ContactSolverInfo& infoGlobal)
{
-
B3_PROFILE("solveJoints");
//you need to provide at least some bodies
-
- solveGroupCacheFriendlySetup( gpuBodies, gpuInertias,numBodies,gpuConstraints, numConstraints,infoGlobal);
- solveGroupCacheFriendlyIterations(gpuConstraints, numConstraints,infoGlobal);
+ solveGroupCacheFriendlySetup(gpuBodies, gpuInertias, numBodies, gpuConstraints, numConstraints, infoGlobal);
+
+ solveGroupCacheFriendlyIterations(gpuConstraints, numConstraints, infoGlobal);
+
+ solveGroupCacheFriendlyFinish(gpuBodies, gpuInertias, numBodies, gpuConstraints, numConstraints, infoGlobal);
- solveGroupCacheFriendlyFinish(gpuBodies, gpuInertias,numBodies, gpuConstraints, numConstraints, infoGlobal);
-
return 0.f;
}
-void b3GpuPgsConstraintSolver::solveJoints(int numBodies, b3OpenCLArray<b3RigidBodyData>* gpuBodies, b3OpenCLArray<b3InertiaData>* gpuInertias,
- int numConstraints, b3OpenCLArray<b3GpuGenericConstraint>* gpuConstraints)
+void b3GpuPgsConstraintSolver::solveJoints(int numBodies, b3OpenCLArray<b3RigidBodyData>* gpuBodies, b3OpenCLArray<b3InertiaData>* gpuInertias,
+ int numConstraints, b3OpenCLArray<b3GpuGenericConstraint>* gpuConstraints)
{
b3ContactSolverInfo infoGlobal;
infoGlobal.m_splitImpulse = false;
- infoGlobal.m_timeStep = 1.f/60.f;
- infoGlobal.m_numIterations = 4;//4;
-// infoGlobal.m_solverMode|=B3_SOLVER_USE_2_FRICTION_DIRECTIONS|B3_SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS|B3_SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION;
+ infoGlobal.m_timeStep = 1.f / 60.f;
+ infoGlobal.m_numIterations = 4; //4;
+ // infoGlobal.m_solverMode|=B3_SOLVER_USE_2_FRICTION_DIRECTIONS|B3_SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS|B3_SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION;
//infoGlobal.m_solverMode|=B3_SOLVER_USE_2_FRICTION_DIRECTIONS|B3_SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS;
- infoGlobal.m_solverMode|=B3_SOLVER_USE_2_FRICTION_DIRECTIONS;
+ infoGlobal.m_solverMode |= B3_SOLVER_USE_2_FRICTION_DIRECTIONS;
//if (infoGlobal.m_solverMode & B3_SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS)
//if ((infoGlobal.m_solverMode & B3_SOLVER_USE_2_FRICTION_DIRECTIONS) && (infoGlobal.m_solverMode & B3_SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION))
-
-
- solveGroup(gpuBodies,gpuInertias,numBodies,gpuConstraints,numConstraints,infoGlobal);
+ solveGroup(gpuBodies, gpuInertias, numBodies, gpuConstraints, numConstraints, infoGlobal);
}
//b3AlignedObjectArray<b3RigidBodyData> testBodies;
-
-b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlyFinish(b3OpenCLArray<b3RigidBodyData>* gpuBodies,b3OpenCLArray<b3InertiaData>* gpuInertias,int numBodies,b3OpenCLArray<b3GpuGenericConstraint>* gpuConstraints,int numConstraints,const b3ContactSolverInfo& infoGlobal)
+b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlyFinish(b3OpenCLArray<b3RigidBodyData>* gpuBodies, b3OpenCLArray<b3InertiaData>* gpuInertias, int numBodies, b3OpenCLArray<b3GpuGenericConstraint>* gpuConstraints, int numConstraints, const b3ContactSolverInfo& infoGlobal)
{
B3_PROFILE("solveGroupCacheFriendlyFinish");
-// int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
-// int i,j;
-
+ // int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
+ // int i,j;
{
if (gpuBreakConstraints)
{
B3_PROFILE("breakViolatedConstraintsKernel");
- b3LauncherCL launcher(m_gpuData->m_queue,m_gpuData->m_breakViolatedConstraintsKernel,"m_breakViolatedConstraintsKernel");
+ b3LauncherCL launcher(m_gpuData->m_queue, m_gpuData->m_breakViolatedConstraintsKernel, "m_breakViolatedConstraintsKernel");
launcher.setBuffer(gpuConstraints->getBufferCL());
launcher.setBuffer(m_gpuData->m_gpuConstraintInfo1->getBufferCL());
launcher.setBuffer(m_gpuData->m_gpuConstraintRowOffsets->getBufferCL());
launcher.setBuffer(m_gpuData->m_gpuConstraintRows->getBufferCL());
launcher.setConst(numConstraints);
launcher.launch1D(numConstraints);
- } else
+ }
+ else
{
gpuConstraints->copyToHost(m_gpuData->m_cpuConstraints);
m_gpuData->m_gpuBatchConstraints->copyToHost(m_gpuData->m_cpuBatchConstraints);
@@ -1056,31 +970,28 @@ b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlyFinish(b3OpenCLArray<b
m_gpuData->m_gpuConstraintInfo1->copyToHost(m_gpuData->m_cpuConstraintInfo1);
m_gpuData->m_gpuConstraintRowOffsets->copyToHost(m_gpuData->m_cpuConstraintRowOffsets);
- for (int cid=0;cid<numConstraints;cid++)
+ for (int cid = 0; cid < numConstraints; cid++)
{
int originalConstraintIndex = batchConstraints[cid].m_originalConstraintIndex;
int constraintRowOffset = m_gpuData->m_cpuConstraintRowOffsets[originalConstraintIndex];
int numRows = m_gpuData->m_cpuConstraintInfo1[originalConstraintIndex];
if (numRows)
{
-
- // printf("cid=%d, breakingThreshold =%f\n",cid,breakingThreshold);
- for (int i=0;i<numRows;i++)
+ // printf("cid=%d, breakingThreshold =%f\n",cid,breakingThreshold);
+ for (int i = 0; i < numRows; i++)
{
- int rowIndex =constraintRowOffset+i;
+ int rowIndex = constraintRowOffset + i;
int orgConstraintIndex = m_gpuData->m_cpuConstraintRows[rowIndex].m_originalConstraintIndex;
float breakingThreshold = m_gpuData->m_cpuConstraints[orgConstraintIndex].m_breakingImpulseThreshold;
- // printf("rows[%d].m_appliedImpulse=%f\n",rowIndex,rows[rowIndex].m_appliedImpulse);
+ // printf("rows[%d].m_appliedImpulse=%f\n",rowIndex,rows[rowIndex].m_appliedImpulse);
if (b3Fabs(m_gpuData->m_cpuConstraintRows[rowIndex].m_appliedImpulse) >= breakingThreshold)
{
-
- m_gpuData->m_cpuConstraints[orgConstraintIndex].m_flags =0;//&= ~B3_CONSTRAINT_FLAG_ENABLED;
+ m_gpuData->m_cpuConstraints[orgConstraintIndex].m_flags = 0; //&= ~B3_CONSTRAINT_FLAG_ENABLED;
}
}
}
}
-
gpuConstraints->copyFromHost(m_gpuData->m_cpuConstraints);
}
}
@@ -1090,28 +1001,27 @@ b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlyFinish(b3OpenCLArray<b
{
B3_PROFILE("GPU write back velocities and transforms");
- b3LauncherCL launcher(m_gpuData->m_queue,m_gpuData->m_writeBackVelocitiesKernel,"m_writeBackVelocitiesKernel");
+ b3LauncherCL launcher(m_gpuData->m_queue, m_gpuData->m_writeBackVelocitiesKernel, "m_writeBackVelocitiesKernel");
launcher.setBuffer(gpuBodies->getBufferCL());
launcher.setBuffer(m_gpuData->m_gpuSolverBodies->getBufferCL());
launcher.setConst(numBodies);
launcher.launch1D(numBodies);
clFinish(m_gpuData->m_queue);
-// m_gpuData->m_gpuSolverBodies->copyToHost(m_tmpSolverBodyPool);
-// m_gpuData->m_gpuBodies->copyToHostPointer(bodies,numBodies);
+ // m_gpuData->m_gpuSolverBodies->copyToHost(m_tmpSolverBodyPool);
+ // m_gpuData->m_gpuBodies->copyToHostPointer(bodies,numBodies);
//m_gpuData->m_gpuBodies->copyToHost(testBodies);
-
- }
+ }
else
{
B3_PROFILE("CPU write back velocities and transforms");
m_gpuData->m_gpuSolverBodies->copyToHost(m_tmpSolverBodyPool);
gpuBodies->copyToHost(m_gpuData->m_cpuBodies);
- for ( int i=0;i<m_tmpSolverBodyPool.size();i++)
+ for (int i = 0; i < m_tmpSolverBodyPool.size(); i++)
{
int bodyIndex = m_tmpSolverBodyPool[i].m_originalBodyIndex;
//printf("bodyIndex=%d\n",bodyIndex);
- b3Assert(i==bodyIndex);
+ b3Assert(i == bodyIndex);
b3RigidBodyData* body = &m_gpuData->m_cpuBodies[bodyIndex];
if (body->m_invMass)
@@ -1125,11 +1035,12 @@ b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlyFinish(b3OpenCLArray<b
{
body->m_linVel = m_tmpSolverBodyPool[i].m_linearVelocity;
body->m_angVel = m_tmpSolverBodyPool[i].m_angularVelocity;
- } else
+ }
+ else
{
b3Assert(0);
}
- /*
+ /*
if (infoGlobal.m_splitImpulse)
{
body->m_pos = m_tmpSolverBodyPool[i].m_worldTransform.getOrigin();
@@ -1139,10 +1050,9 @@ b3Scalar b3GpuPgsConstraintSolver::solveGroupCacheFriendlyFinish(b3OpenCLArray<b
}
*/
}
- }//for
+ } //for
gpuBodies->copyFromHost(m_gpuData->m_cpuBodies);
-
}
}
diff --git a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsConstraintSolver.h b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsConstraintSolver.h
index ec0e3f73d6..00bc544f02 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsConstraintSolver.h
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsConstraintSolver.h
@@ -19,7 +19,6 @@ subject to the following restrictions:
struct b3Contact4;
struct b3ContactPoint;
-
class b3Dispatcher;
#include "Bullet3Dynamics/ConstraintSolver/b3TypedConstraint.h"
@@ -38,41 +37,40 @@ class b3GpuPgsConstraintSolver
protected:
int m_staticIdx;
struct b3GpuPgsJacobiSolverInternalData* m_gpuData;
- protected:
- b3AlignedObjectArray<b3GpuSolverBody> m_tmpSolverBodyPool;
- b3GpuConstraintArray m_tmpSolverContactConstraintPool;
- b3GpuConstraintArray m_tmpSolverNonContactConstraintPool;
- b3GpuConstraintArray m_tmpSolverContactFrictionConstraintPool;
- b3GpuConstraintArray m_tmpSolverContactRollingFrictionConstraintPool;
+
+protected:
+ b3AlignedObjectArray<b3GpuSolverBody> m_tmpSolverBodyPool;
+ b3GpuConstraintArray m_tmpSolverContactConstraintPool;
+ b3GpuConstraintArray m_tmpSolverNonContactConstraintPool;
+ b3GpuConstraintArray m_tmpSolverContactFrictionConstraintPool;
+ b3GpuConstraintArray m_tmpSolverContactRollingFrictionConstraintPool;
b3AlignedObjectArray<unsigned int> m_tmpConstraintSizesPool;
-
- bool m_usePgs;
- void averageVelocities();
+ bool m_usePgs;
+ void averageVelocities();
- int m_maxOverrideNumSolverIterations;
+ int m_maxOverrideNumSolverIterations;
- int m_numSplitImpulseRecoveries;
+ int m_numSplitImpulseRecoveries;
-// int getOrInitSolverBody(int bodyIndex, b3RigidBodyData* bodies,b3InertiaData* inertias);
- void initSolverBody(int bodyIndex, b3GpuSolverBody* solverBody, b3RigidBodyData* rb);
+ // 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<b3GpuGenericConstraint>* gpuConstraints1,int numConstraints,const b3ContactSolverInfo& infoGlobal);
- virtual b3Scalar solveGroupCacheFriendlySetup(b3OpenCLArray<b3RigidBodyData>* gpuBodies, b3OpenCLArray<b3InertiaData>* gpuInertias, int numBodies,b3OpenCLArray<b3GpuGenericConstraint>* gpuConstraints,int numConstraints,const b3ContactSolverInfo& infoGlobal);
- b3Scalar solveGroupCacheFriendlyFinish(b3OpenCLArray<b3RigidBodyData>* gpuBodies,b3OpenCLArray<b3InertiaData>* gpuInertias,int numBodies,b3OpenCLArray<b3GpuGenericConstraint>* gpuConstraints,int numConstraints,const b3ContactSolverInfo& infoGlobal);
+ b3GpuPgsConstraintSolver(cl_context ctx, cl_device_id device, cl_command_queue queue, bool usePgs);
+ virtual ~b3GpuPgsConstraintSolver();
+ virtual b3Scalar solveGroupCacheFriendlyIterations(b3OpenCLArray<b3GpuGenericConstraint>* gpuConstraints1, int numConstraints, const b3ContactSolverInfo& infoGlobal);
+ virtual b3Scalar solveGroupCacheFriendlySetup(b3OpenCLArray<b3RigidBodyData>* gpuBodies, b3OpenCLArray<b3InertiaData>* gpuInertias, int numBodies, b3OpenCLArray<b3GpuGenericConstraint>* gpuConstraints, int numConstraints, const b3ContactSolverInfo& infoGlobal);
+ b3Scalar solveGroupCacheFriendlyFinish(b3OpenCLArray<b3RigidBodyData>* gpuBodies, b3OpenCLArray<b3InertiaData>* gpuInertias, int numBodies, b3OpenCLArray<b3GpuGenericConstraint>* gpuConstraints, int numConstraints, const b3ContactSolverInfo& infoGlobal);
- b3Scalar solveGroup(b3OpenCLArray<b3RigidBodyData>* gpuBodies,b3OpenCLArray<b3InertiaData>* gpuInertias, int numBodies,b3OpenCLArray<b3GpuGenericConstraint>* gpuConstraints,int numConstraints,const b3ContactSolverInfo& infoGlobal);
- void solveJoints(int numBodies, b3OpenCLArray<b3RigidBodyData>* gpuBodies, b3OpenCLArray<b3InertiaData>* gpuInertias,
- int numConstraints, b3OpenCLArray<b3GpuGenericConstraint>* gpuConstraints);
+ b3Scalar solveGroup(b3OpenCLArray<b3RigidBodyData>* gpuBodies, b3OpenCLArray<b3InertiaData>* gpuInertias, int numBodies, b3OpenCLArray<b3GpuGenericConstraint>* gpuConstraints, int numConstraints, const b3ContactSolverInfo& infoGlobal);
+ void solveJoints(int numBodies, b3OpenCLArray<b3RigidBodyData>* gpuBodies, b3OpenCLArray<b3InertiaData>* gpuInertias,
+ int numConstraints, b3OpenCLArray<b3GpuGenericConstraint>* gpuConstraints);
- int sortConstraintByBatch3( struct b3BatchConstraint* cs, int numConstraints, int simdWidth , int staticIdx, int numBodies);
- void recomputeBatches();
+ int sortConstraintByBatch3(struct b3BatchConstraint* cs, int numConstraints, int simdWidth, int staticIdx, int numBodies);
+ void recomputeBatches();
};
-#endif //B3_GPU_PGS_CONSTRAINT_SOLVER_H
+#endif //B3_GPU_PGS_CONSTRAINT_SOLVER_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsContactSolver.cpp b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsContactSolver.cpp
index f0b0abd5e0..e3d235a4fd 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsContactSolver.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsContactSolver.cpp
@@ -2,7 +2,7 @@
bool gUseLargeBatches = false;
bool gCpuBatchContacts = false;
bool gCpuSolveConstraint = false;
-bool gCpuRadixSort=false;
+bool gCpuRadixSort = false;
bool gCpuSetSortData = false;
bool gCpuSortContactsDeterminism = false;
bool gUseCpuCopyConstraints = false;
@@ -11,7 +11,6 @@ bool gReorderContactsOnCpu = false;
bool optionalSortContactsDeterminism = true;
-
#include "b3GpuPgsContactSolver.h"
#include "Bullet3OpenCL/ParallelPrimitives/b3RadixSort32CL.h"
@@ -23,7 +22,6 @@ bool optionalSortContactsDeterminism = true;
#include "Bullet3Collision/NarrowPhaseCollision/b3Config.h"
#include "b3Solver.h"
-
#define B3_SOLVER_SETUP_KERNEL_PATH "src/Bullet3OpenCL/RigidBody/kernels/solverSetup.cl"
#define B3_SOLVER_SETUP2_KERNEL_PATH "src/Bullet3OpenCL/RigidBody/kernels/solverSetup2.cl"
#define B3_SOLVER_CONTACT_KERNEL_PATH "src/Bullet3OpenCL/RigidBody/kernels/solveContact.cl"
@@ -38,11 +36,7 @@ bool optionalSortContactsDeterminism = true;
#include "kernels/batchingKernels.h"
#include "kernels/batchingKernelsNew.h"
-
-
-
-
-struct b3GpuBatchingPgsSolverInternalData
+struct b3GpuBatchingPgsSolverInternalData
{
cl_context m_context;
cl_device_id m_device;
@@ -53,9 +47,9 @@ struct b3GpuBatchingPgsSolverInternalData
b3OpenCLArray<b3GpuConstraint4>* m_contactCGPU;
b3OpenCLArray<unsigned int>* m_numConstraints;
b3OpenCLArray<unsigned int>* m_offsets;
-
- b3Solver* m_solverGPU;
-
+
+ b3Solver* m_solverGPU;
+
cl_kernel m_batchingKernel;
cl_kernel m_batchingKernelNew;
cl_kernel m_solveContactKernel;
@@ -67,17 +61,14 @@ struct b3GpuBatchingPgsSolverInternalData
cl_kernel m_reorderContactKernel;
cl_kernel m_copyConstraintKernel;
- cl_kernel m_setDeterminismSortDataBodyAKernel;
- cl_kernel m_setDeterminismSortDataBodyBKernel;
- cl_kernel m_setDeterminismSortDataChildShapeAKernel;
- cl_kernel m_setDeterminismSortDataChildShapeBKernel;
-
+ cl_kernel m_setDeterminismSortDataBodyAKernel;
+ cl_kernel m_setDeterminismSortDataBodyBKernel;
+ cl_kernel m_setDeterminismSortDataChildShapeAKernel;
+ cl_kernel m_setDeterminismSortDataChildShapeBKernel;
-
-
- class b3RadixSort32CL* m_sort32;
- class b3BoundSearchCL* m_search;
- class b3PrefixScanCL* m_scan;
+ class b3RadixSort32CL* m_sort32;
+ class b3BoundSearchCL* m_search;
+ class b3PrefixScanCL* m_scan;
b3OpenCLArray<b3SortData>* m_sortDataBuffer;
b3OpenCLArray<b3Contact4>* m_contactBuffer;
@@ -85,63 +76,56 @@ struct b3GpuBatchingPgsSolverInternalData
b3OpenCLArray<b3RigidBodyData>* m_bodyBufferGPU;
b3OpenCLArray<b3InertiaData>* m_inertiaBufferGPU;
b3OpenCLArray<b3Contact4>* m_pBufContactOutGPU;
-
- b3OpenCLArray<b3Contact4>* m_pBufContactOutGPUCopy;
- b3OpenCLArray<b3SortData>* m_contactKeyValues;
+ b3OpenCLArray<b3Contact4>* m_pBufContactOutGPUCopy;
+ b3OpenCLArray<b3SortData>* m_contactKeyValues;
b3AlignedObjectArray<unsigned int> m_idxBuffer;
b3AlignedObjectArray<b3SortData> m_sortData;
b3AlignedObjectArray<b3Contact4> m_old;
- b3AlignedObjectArray<int> m_batchSizes;
- b3OpenCLArray<int>* m_batchSizesGpu;
-
+ b3AlignedObjectArray<int> m_batchSizes;
+ b3OpenCLArray<int>* m_batchSizesGpu;
};
-
-
-b3GpuPgsContactSolver::b3GpuPgsContactSolver(cl_context ctx,cl_device_id device, cl_command_queue q,int pairCapacity)
+b3GpuPgsContactSolver::b3GpuPgsContactSolver(cl_context ctx, cl_device_id device, cl_command_queue q, int pairCapacity)
{
- m_debugOutput=0;
+ m_debugOutput = 0;
m_data = new b3GpuBatchingPgsSolverInternalData;
m_data->m_context = ctx;
m_data->m_device = device;
m_data->m_queue = q;
m_data->m_pairCapacity = pairCapacity;
m_data->m_nIterations = 4;
- m_data->m_batchSizesGpu = new b3OpenCLArray<int>(ctx,q);
- m_data->m_bodyBufferGPU = new b3OpenCLArray<b3RigidBodyData>(ctx,q);
- m_data->m_inertiaBufferGPU = new b3OpenCLArray<b3InertiaData>(ctx,q);
- m_data->m_pBufContactOutGPU = new b3OpenCLArray<b3Contact4>(ctx,q);
-
- m_data->m_pBufContactOutGPUCopy = new b3OpenCLArray<b3Contact4>(ctx,q);
- m_data->m_contactKeyValues = new b3OpenCLArray<b3SortData>(ctx,q);
+ m_data->m_batchSizesGpu = new b3OpenCLArray<int>(ctx, q);
+ m_data->m_bodyBufferGPU = new b3OpenCLArray<b3RigidBodyData>(ctx, q);
+ m_data->m_inertiaBufferGPU = new b3OpenCLArray<b3InertiaData>(ctx, q);
+ m_data->m_pBufContactOutGPU = new b3OpenCLArray<b3Contact4>(ctx, q);
+ m_data->m_pBufContactOutGPUCopy = new b3OpenCLArray<b3Contact4>(ctx, q);
+ m_data->m_contactKeyValues = new b3OpenCLArray<b3SortData>(ctx, q);
- m_data->m_solverGPU = new b3Solver(ctx,device,q,512*1024);
+ m_data->m_solverGPU = new b3Solver(ctx, device, q, 512 * 1024);
- m_data->m_sort32 = new b3RadixSort32CL(ctx,device,m_data->m_queue);
- m_data->m_scan = new b3PrefixScanCL(ctx,device,m_data->m_queue,B3_SOLVER_N_CELLS);
- m_data->m_search = new b3BoundSearchCL(ctx,device,m_data->m_queue,B3_SOLVER_N_CELLS);
+ m_data->m_sort32 = new b3RadixSort32CL(ctx, device, m_data->m_queue);
+ m_data->m_scan = new b3PrefixScanCL(ctx, device, m_data->m_queue, B3_SOLVER_N_CELLS);
+ m_data->m_search = new b3BoundSearchCL(ctx, device, m_data->m_queue, B3_SOLVER_N_CELLS);
- const int sortSize = B3NEXTMULTIPLEOF( pairCapacity, 512 );
+ const int sortSize = B3NEXTMULTIPLEOF(pairCapacity, 512);
- m_data->m_sortDataBuffer = new b3OpenCLArray<b3SortData>(ctx,m_data->m_queue,sortSize);
- m_data->m_contactBuffer = new b3OpenCLArray<b3Contact4>(ctx,m_data->m_queue);
+ m_data->m_sortDataBuffer = new b3OpenCLArray<b3SortData>(ctx, m_data->m_queue, sortSize);
+ m_data->m_contactBuffer = new b3OpenCLArray<b3Contact4>(ctx, m_data->m_queue);
- m_data->m_numConstraints = new b3OpenCLArray<unsigned int>(ctx,m_data->m_queue,B3_SOLVER_N_CELLS);
+ m_data->m_numConstraints = new b3OpenCLArray<unsigned int>(ctx, m_data->m_queue, B3_SOLVER_N_CELLS);
m_data->m_numConstraints->resize(B3_SOLVER_N_CELLS);
- m_data->m_contactCGPU = new b3OpenCLArray<b3GpuConstraint4>(ctx,q,pairCapacity);
+ m_data->m_contactCGPU = new b3OpenCLArray<b3GpuConstraint4>(ctx, q, pairCapacity);
- m_data->m_offsets = new b3OpenCLArray<unsigned int>( ctx,m_data->m_queue,B3_SOLVER_N_CELLS);
+ m_data->m_offsets = new b3OpenCLArray<unsigned int>(ctx, m_data->m_queue, B3_SOLVER_N_CELLS);
m_data->m_offsets->resize(B3_SOLVER_N_CELLS);
const char* additionalMacros = "";
//const char* srcFileNameForCaching="";
-
-
cl_int pErrNum;
const char* batchKernelSource = batchingKernelsCL;
const char* batchKernelNewSource = batchingKernelsNewCL;
@@ -149,88 +133,73 @@ b3GpuPgsContactSolver::b3GpuPgsContactSolver(cl_context ctx,cl_device_id device,
const char* solverSetup2Source = solverSetup2CL;
const char* solveContactSource = solveContactCL;
const char* solveFrictionSource = solveFrictionCL;
-
-
+
{
-
- cl_program solveContactProg= b3OpenCLUtils::compileCLProgramFromString( ctx, device, solveContactSource, &pErrNum,additionalMacros, B3_SOLVER_CONTACT_KERNEL_PATH);
+ cl_program solveContactProg = b3OpenCLUtils::compileCLProgramFromString(ctx, device, solveContactSource, &pErrNum, additionalMacros, B3_SOLVER_CONTACT_KERNEL_PATH);
b3Assert(solveContactProg);
-
- cl_program solveFrictionProg= b3OpenCLUtils::compileCLProgramFromString( ctx, device, solveFrictionSource, &pErrNum,additionalMacros, B3_SOLVER_FRICTION_KERNEL_PATH);
+
+ cl_program solveFrictionProg = b3OpenCLUtils::compileCLProgramFromString(ctx, device, solveFrictionSource, &pErrNum, additionalMacros, B3_SOLVER_FRICTION_KERNEL_PATH);
b3Assert(solveFrictionProg);
- cl_program solverSetup2Prog= b3OpenCLUtils::compileCLProgramFromString( ctx, device, solverSetup2Source, &pErrNum,additionalMacros, B3_SOLVER_SETUP2_KERNEL_PATH);
-
-
+ cl_program solverSetup2Prog = b3OpenCLUtils::compileCLProgramFromString(ctx, device, solverSetup2Source, &pErrNum, additionalMacros, B3_SOLVER_SETUP2_KERNEL_PATH);
+
b3Assert(solverSetup2Prog);
-
- cl_program solverSetupProg= b3OpenCLUtils::compileCLProgramFromString( ctx, device, solverSetupSource, &pErrNum,additionalMacros, B3_SOLVER_SETUP_KERNEL_PATH);
+ cl_program solverSetupProg = b3OpenCLUtils::compileCLProgramFromString(ctx, device, solverSetupSource, &pErrNum, additionalMacros, B3_SOLVER_SETUP_KERNEL_PATH);
b3Assert(solverSetupProg);
-
-
- m_data->m_solveFrictionKernel= b3OpenCLUtils::compileCLKernelFromString( ctx, device, solveFrictionSource, "BatchSolveKernelFriction", &pErrNum, solveFrictionProg,additionalMacros );
+
+ m_data->m_solveFrictionKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, solveFrictionSource, "BatchSolveKernelFriction", &pErrNum, solveFrictionProg, additionalMacros);
b3Assert(m_data->m_solveFrictionKernel);
- m_data->m_solveContactKernel= b3OpenCLUtils::compileCLKernelFromString( ctx, device, solveContactSource, "BatchSolveKernelContact", &pErrNum, solveContactProg,additionalMacros );
+ m_data->m_solveContactKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, solveContactSource, "BatchSolveKernelContact", &pErrNum, solveContactProg, additionalMacros);
b3Assert(m_data->m_solveContactKernel);
- m_data->m_solveSingleContactKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, solveContactSource, "solveSingleContactKernel", &pErrNum, solveContactProg,additionalMacros );
+ m_data->m_solveSingleContactKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, solveContactSource, "solveSingleContactKernel", &pErrNum, solveContactProg, additionalMacros);
b3Assert(m_data->m_solveSingleContactKernel);
- m_data->m_solveSingleFrictionKernel =b3OpenCLUtils::compileCLKernelFromString( ctx, device, solveFrictionSource, "solveSingleFrictionKernel", &pErrNum, solveFrictionProg,additionalMacros );
+ m_data->m_solveSingleFrictionKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, solveFrictionSource, "solveSingleFrictionKernel", &pErrNum, solveFrictionProg, additionalMacros);
b3Assert(m_data->m_solveSingleFrictionKernel);
-
- m_data->m_contactToConstraintKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, solverSetupSource, "ContactToConstraintKernel", &pErrNum, solverSetupProg,additionalMacros );
+
+ m_data->m_contactToConstraintKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, solverSetupSource, "ContactToConstraintKernel", &pErrNum, solverSetupProg, additionalMacros);
b3Assert(m_data->m_contactToConstraintKernel);
-
- m_data->m_setSortDataKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, solverSetup2Source, "SetSortDataKernel", &pErrNum, solverSetup2Prog,additionalMacros );
+
+ m_data->m_setSortDataKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, solverSetup2Source, "SetSortDataKernel", &pErrNum, solverSetup2Prog, additionalMacros);
b3Assert(m_data->m_setSortDataKernel);
- m_data->m_setDeterminismSortDataBodyAKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, solverSetup2Source, "SetDeterminismSortDataBodyA", &pErrNum, solverSetup2Prog,additionalMacros );
+ m_data->m_setDeterminismSortDataBodyAKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, solverSetup2Source, "SetDeterminismSortDataBodyA", &pErrNum, solverSetup2Prog, additionalMacros);
b3Assert(m_data->m_setDeterminismSortDataBodyAKernel);
- m_data->m_setDeterminismSortDataBodyBKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, solverSetup2Source, "SetDeterminismSortDataBodyB", &pErrNum, solverSetup2Prog,additionalMacros );
+ m_data->m_setDeterminismSortDataBodyBKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, solverSetup2Source, "SetDeterminismSortDataBodyB", &pErrNum, solverSetup2Prog, additionalMacros);
b3Assert(m_data->m_setDeterminismSortDataBodyBKernel);
- m_data->m_setDeterminismSortDataChildShapeAKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, solverSetup2Source, "SetDeterminismSortDataChildShapeA", &pErrNum, solverSetup2Prog,additionalMacros );
+ m_data->m_setDeterminismSortDataChildShapeAKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, solverSetup2Source, "SetDeterminismSortDataChildShapeA", &pErrNum, solverSetup2Prog, additionalMacros);
b3Assert(m_data->m_setDeterminismSortDataChildShapeAKernel);
- m_data->m_setDeterminismSortDataChildShapeBKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, solverSetup2Source, "SetDeterminismSortDataChildShapeB", &pErrNum, solverSetup2Prog,additionalMacros );
+ m_data->m_setDeterminismSortDataChildShapeBKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, solverSetup2Source, "SetDeterminismSortDataChildShapeB", &pErrNum, solverSetup2Prog, additionalMacros);
b3Assert(m_data->m_setDeterminismSortDataChildShapeBKernel);
-
- m_data->m_reorderContactKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, solverSetup2Source, "ReorderContactKernel", &pErrNum, solverSetup2Prog,additionalMacros );
+ m_data->m_reorderContactKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, solverSetup2Source, "ReorderContactKernel", &pErrNum, solverSetup2Prog, additionalMacros);
b3Assert(m_data->m_reorderContactKernel);
-
- m_data->m_copyConstraintKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, solverSetup2Source, "CopyConstraintKernel", &pErrNum, solverSetup2Prog,additionalMacros );
+ m_data->m_copyConstraintKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, solverSetup2Source, "CopyConstraintKernel", &pErrNum, solverSetup2Prog, additionalMacros);
b3Assert(m_data->m_copyConstraintKernel);
-
}
{
- cl_program batchingProg = b3OpenCLUtils::compileCLProgramFromString( ctx, device, batchKernelSource, &pErrNum,additionalMacros, B3_BATCHING_PATH);
+ cl_program batchingProg = b3OpenCLUtils::compileCLProgramFromString(ctx, device, batchKernelSource, &pErrNum, additionalMacros, B3_BATCHING_PATH);
b3Assert(batchingProg);
-
- m_data->m_batchingKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, batchKernelSource, "CreateBatches", &pErrNum, batchingProg,additionalMacros );
+
+ m_data->m_batchingKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, batchKernelSource, "CreateBatches", &pErrNum, batchingProg, additionalMacros);
b3Assert(m_data->m_batchingKernel);
}
-
+
{
- cl_program batchingNewProg = b3OpenCLUtils::compileCLProgramFromString( ctx, device, batchKernelNewSource, &pErrNum,additionalMacros, B3_BATCHING_NEW_PATH);
+ cl_program batchingNewProg = b3OpenCLUtils::compileCLProgramFromString(ctx, device, batchKernelNewSource, &pErrNum, additionalMacros, B3_BATCHING_NEW_PATH);
b3Assert(batchingNewProg);
-
- m_data->m_batchingKernelNew = b3OpenCLUtils::compileCLKernelFromString( ctx, device, batchKernelNewSource, "CreateBatchesNew", &pErrNum, batchingNewProg,additionalMacros );
+
+ m_data->m_batchingKernelNew = b3OpenCLUtils::compileCLKernelFromString(ctx, device, batchKernelNewSource, "CreateBatchesNew", &pErrNum, batchingNewProg, additionalMacros);
b3Assert(m_data->m_batchingKernelNew);
}
-
-
-
-
-
-
-
}
b3GpuPgsContactSolver::~b3GpuPgsContactSolver()
@@ -242,8 +211,6 @@ b3GpuPgsContactSolver::~b3GpuPgsContactSolver()
delete m_data->m_pBufContactOutGPUCopy;
delete m_data->m_contactKeyValues;
-
-
delete m_data->m_contactCGPU;
delete m_data->m_numConstraints;
delete m_data->m_offsets;
@@ -259,29 +226,25 @@ b3GpuPgsContactSolver::~b3GpuPgsContactSolver()
clReleaseKernel(m_data->m_batchingKernelNew);
clReleaseKernel(m_data->m_solveSingleContactKernel);
clReleaseKernel(m_data->m_solveSingleFrictionKernel);
- clReleaseKernel( m_data->m_solveContactKernel);
- clReleaseKernel( m_data->m_solveFrictionKernel);
+ clReleaseKernel(m_data->m_solveContactKernel);
+ clReleaseKernel(m_data->m_solveFrictionKernel);
- clReleaseKernel( m_data->m_contactToConstraintKernel);
- clReleaseKernel( m_data->m_setSortDataKernel);
- clReleaseKernel( m_data->m_reorderContactKernel);
- clReleaseKernel( m_data->m_copyConstraintKernel);
+ clReleaseKernel(m_data->m_contactToConstraintKernel);
+ clReleaseKernel(m_data->m_setSortDataKernel);
+ clReleaseKernel(m_data->m_reorderContactKernel);
+ clReleaseKernel(m_data->m_copyConstraintKernel);
clReleaseKernel(m_data->m_setDeterminismSortDataBodyAKernel);
clReleaseKernel(m_data->m_setDeterminismSortDataBodyBKernel);
clReleaseKernel(m_data->m_setDeterminismSortDataChildShapeAKernel);
clReleaseKernel(m_data->m_setDeterminismSortDataChildShapeBKernel);
-
-
delete m_data;
}
-
-
struct b3ConstraintCfg
{
- b3ConstraintCfg( float dt = 0.f ): m_positionDrift( 0.005f ), m_positionConstraintCoeff( 0.2f ), m_dt(dt), m_staticIdx(0) {}
+ b3ConstraintCfg(float dt = 0.f) : m_positionDrift(0.005f), m_positionConstraintCoeff(0.2f), m_dt(dt), m_staticIdx(0) {}
float m_positionDrift;
float m_positionConstraintCoeff;
@@ -291,354 +254,306 @@ struct b3ConstraintCfg
int m_staticIdx;
};
-
-
-void b3GpuPgsContactSolver::solveContactConstraintBatchSizes( const b3OpenCLArray<b3RigidBodyData>* bodyBuf, const b3OpenCLArray<b3InertiaData>* shapeBuf,
- b3OpenCLArray<b3GpuConstraint4>* constraint, void* additionalData, int n ,int maxNumBatches,int numIterations, const b3AlignedObjectArray<int>* batchSizes)//const b3OpenCLArray<int>* gpuBatchSizes)
+void b3GpuPgsContactSolver::solveContactConstraintBatchSizes(const b3OpenCLArray<b3RigidBodyData>* bodyBuf, const b3OpenCLArray<b3InertiaData>* shapeBuf,
+ b3OpenCLArray<b3GpuConstraint4>* constraint, void* additionalData, int n, int maxNumBatches, int numIterations, const b3AlignedObjectArray<int>* batchSizes) //const b3OpenCLArray<int>* gpuBatchSizes)
{
B3_PROFILE("solveContactConstraintBatchSizes");
- int numBatches = batchSizes->size()/B3_MAX_NUM_BATCHES;
- for(int iter=0; iter<numIterations; iter++)
+ int numBatches = batchSizes->size() / B3_MAX_NUM_BATCHES;
+ for (int iter = 0; iter < numIterations; iter++)
{
-
- for (int cellId=0;cellId<numBatches;cellId++)
+ for (int cellId = 0; cellId < numBatches; cellId++)
{
int offset = 0;
- for (int ii=0;ii<B3_MAX_NUM_BATCHES;ii++)
+ for (int ii = 0; ii < B3_MAX_NUM_BATCHES; ii++)
{
- int numInBatch = batchSizes->at(cellId*B3_MAX_NUM_BATCHES+ii);
+ int numInBatch = batchSizes->at(cellId * B3_MAX_NUM_BATCHES + ii);
if (!numInBatch)
break;
{
- b3LauncherCL launcher( m_data->m_queue, m_data->m_solveSingleContactKernel,"m_solveSingleContactKernel" );
- launcher.setBuffer(bodyBuf->getBufferCL() );
- launcher.setBuffer(shapeBuf->getBufferCL() );
- launcher.setBuffer( constraint->getBufferCL() );
+ b3LauncherCL launcher(m_data->m_queue, m_data->m_solveSingleContactKernel, "m_solveSingleContactKernel");
+ launcher.setBuffer(bodyBuf->getBufferCL());
+ launcher.setBuffer(shapeBuf->getBufferCL());
+ launcher.setBuffer(constraint->getBufferCL());
launcher.setConst(cellId);
launcher.setConst(offset);
launcher.setConst(numInBatch);
launcher.launch1D(numInBatch);
- offset+=numInBatch;
+ offset += numInBatch;
}
}
}
}
-
- for(int iter=0; iter<numIterations; iter++)
+ for (int iter = 0; iter < numIterations; iter++)
{
- for (int cellId=0;cellId<numBatches;cellId++)
+ for (int cellId = 0; cellId < numBatches; cellId++)
{
int offset = 0;
- for (int ii=0;ii<B3_MAX_NUM_BATCHES;ii++)
+ for (int ii = 0; ii < B3_MAX_NUM_BATCHES; ii++)
{
- int numInBatch = batchSizes->at(cellId*B3_MAX_NUM_BATCHES+ii);
+ int numInBatch = batchSizes->at(cellId * B3_MAX_NUM_BATCHES + ii);
if (!numInBatch)
break;
{
- b3LauncherCL launcher( m_data->m_queue, m_data->m_solveSingleFrictionKernel,"m_solveSingleFrictionKernel" );
- launcher.setBuffer(bodyBuf->getBufferCL() );
- launcher.setBuffer(shapeBuf->getBufferCL() );
- launcher.setBuffer( constraint->getBufferCL() );
+ b3LauncherCL launcher(m_data->m_queue, m_data->m_solveSingleFrictionKernel, "m_solveSingleFrictionKernel");
+ launcher.setBuffer(bodyBuf->getBufferCL());
+ launcher.setBuffer(shapeBuf->getBufferCL());
+ launcher.setBuffer(constraint->getBufferCL());
launcher.setConst(cellId);
launcher.setConst(offset);
launcher.setConst(numInBatch);
launcher.launch1D(numInBatch);
- offset+=numInBatch;
+ offset += numInBatch;
}
}
}
}
}
-void b3GpuPgsContactSolver::solveContactConstraint( const b3OpenCLArray<b3RigidBodyData>* bodyBuf, const b3OpenCLArray<b3InertiaData>* shapeBuf,
- b3OpenCLArray<b3GpuConstraint4>* constraint, void* additionalData, int n ,int maxNumBatches,int numIterations, const b3AlignedObjectArray<int>* batchSizes)//,const b3OpenCLArray<int>* gpuBatchSizes)
+void b3GpuPgsContactSolver::solveContactConstraint(const b3OpenCLArray<b3RigidBodyData>* bodyBuf, const b3OpenCLArray<b3InertiaData>* shapeBuf,
+ b3OpenCLArray<b3GpuConstraint4>* constraint, void* additionalData, int n, int maxNumBatches, int numIterations, const b3AlignedObjectArray<int>* batchSizes) //,const b3OpenCLArray<int>* gpuBatchSizes)
{
-
//sort the contacts
-
- b3Int4 cdata = b3MakeInt4( n, 0, 0, 0 );
+ b3Int4 cdata = b3MakeInt4(n, 0, 0, 0);
{
-
const int nn = B3_SOLVER_N_CELLS;
cdata.x = 0;
- cdata.y = maxNumBatches;//250;
-
+ cdata.y = maxNumBatches; //250;
- int numWorkItems = 64*nn/B3_SOLVER_N_BATCHES;
+ int numWorkItems = 64 * nn / B3_SOLVER_N_BATCHES;
#ifdef DEBUG_ME
- SolverDebugInfo* debugInfo = new SolverDebugInfo[numWorkItems];
- adl::b3OpenCLArray<SolverDebugInfo> gpuDebugInfo(data->m_device,numWorkItems);
+ SolverDebugInfo* debugInfo = new SolverDebugInfo[numWorkItems];
+ adl::b3OpenCLArray<SolverDebugInfo> gpuDebugInfo(data->m_device, numWorkItems);
#endif
-
-
{
-
B3_PROFILE("m_batchSolveKernel iterations");
- for(int iter=0; iter<numIterations; iter++)
+ for (int iter = 0; iter < numIterations; iter++)
{
- for(int ib=0; ib<B3_SOLVER_N_BATCHES; ib++)
+ for (int ib = 0; ib < B3_SOLVER_N_BATCHES; ib++)
{
#ifdef DEBUG_ME
- memset(debugInfo,0,sizeof(SolverDebugInfo)*numWorkItems);
- gpuDebugInfo.write(debugInfo,numWorkItems);
+ memset(debugInfo, 0, sizeof(SolverDebugInfo) * numWorkItems);
+ gpuDebugInfo.write(debugInfo, numWorkItems);
#endif
-
cdata.z = ib;
-
- b3LauncherCL launcher( m_data->m_queue, m_data->m_solveContactKernel,"m_solveContactKernel" );
+ b3LauncherCL launcher(m_data->m_queue, m_data->m_solveContactKernel, "m_solveContactKernel");
#if 1
-
- b3BufferInfoCL bInfo[] = {
-
- b3BufferInfoCL( bodyBuf->getBufferCL() ),
- b3BufferInfoCL( shapeBuf->getBufferCL() ),
- b3BufferInfoCL( constraint->getBufferCL() ),
- b3BufferInfoCL( m_data->m_solverGPU->m_numConstraints->getBufferCL() ),
- b3BufferInfoCL( m_data->m_solverGPU->m_offsets->getBufferCL() )
+
+ b3BufferInfoCL bInfo[] = {
+
+ b3BufferInfoCL(bodyBuf->getBufferCL()),
+ b3BufferInfoCL(shapeBuf->getBufferCL()),
+ b3BufferInfoCL(constraint->getBufferCL()),
+ b3BufferInfoCL(m_data->m_solverGPU->m_numConstraints->getBufferCL()),
+ b3BufferInfoCL(m_data->m_solverGPU->m_offsets->getBufferCL())
#ifdef DEBUG_ME
- , b3BufferInfoCL(&gpuDebugInfo)
+ ,
+ b3BufferInfoCL(&gpuDebugInfo)
#endif
- };
-
-
+ };
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setBuffer( m_data->m_solverGPU->m_batchSizes.getBufferCL());
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setBuffer(m_data->m_solverGPU->m_batchSizes.getBufferCL());
//launcher.setConst( cdata.x );
- launcher.setConst( cdata.y );
- launcher.setConst( cdata.z );
+ launcher.setConst(cdata.y);
+ launcher.setConst(cdata.z);
b3Int4 nSplit;
nSplit.x = B3_SOLVER_N_SPLIT_X;
nSplit.y = B3_SOLVER_N_SPLIT_Y;
nSplit.z = B3_SOLVER_N_SPLIT_Z;
- launcher.setConst( nSplit );
- launcher.launch1D( numWorkItems, 64 );
+ launcher.setConst(nSplit);
+ launcher.launch1D(numWorkItems, 64);
-
#else
- const char* fileName = "m_batchSolveKernel.bin";
- FILE* f = fopen(fileName,"rb");
- if (f)
- {
- int sizeInBytes=0;
- if (fseek(f, 0, SEEK_END) || (sizeInBytes = ftell(f)) == EOF || fseek(f, 0, SEEK_SET))
- {
- printf("error, cannot get file size\n");
- exit(0);
- }
-
- unsigned char* buf = (unsigned char*) malloc(sizeInBytes);
- fread(buf,sizeInBytes,1,f);
- int serializedBytes = launcher.deserializeArgs(buf, sizeInBytes,m_context);
- int num = *(int*)&buf[serializedBytes];
-
- launcher.launch1D( num);
-
- //this clFinish is for testing on errors
- clFinish(m_queue);
- }
+ const char* fileName = "m_batchSolveKernel.bin";
+ FILE* f = fopen(fileName, "rb");
+ if (f)
+ {
+ int sizeInBytes = 0;
+ if (fseek(f, 0, SEEK_END) || (sizeInBytes = ftell(f)) == EOF || fseek(f, 0, SEEK_SET))
+ {
+ printf("error, cannot get file size\n");
+ exit(0);
+ }
+
+ unsigned char* buf = (unsigned char*)malloc(sizeInBytes);
+ fread(buf, sizeInBytes, 1, f);
+ int serializedBytes = launcher.deserializeArgs(buf, sizeInBytes, m_context);
+ int num = *(int*)&buf[serializedBytes];
+
+ launcher.launch1D(num);
+
+ //this clFinish is for testing on errors
+ clFinish(m_queue);
+ }
#endif
-
#ifdef DEBUG_ME
clFinish(m_queue);
- gpuDebugInfo.read(debugInfo,numWorkItems);
+ gpuDebugInfo.read(debugInfo, numWorkItems);
clFinish(m_queue);
- for (int i=0;i<numWorkItems;i++)
+ for (int i = 0; i < numWorkItems; i++)
{
- if (debugInfo[i].m_valInt2>0)
+ if (debugInfo[i].m_valInt2 > 0)
{
- printf("debugInfo[i].m_valInt2 = %d\n",i,debugInfo[i].m_valInt2);
+ printf("debugInfo[i].m_valInt2 = %d\n", i, debugInfo[i].m_valInt2);
}
- if (debugInfo[i].m_valInt3>0)
+ if (debugInfo[i].m_valInt3 > 0)
{
- printf("debugInfo[i].m_valInt3 = %d\n",i,debugInfo[i].m_valInt3);
+ printf("debugInfo[i].m_valInt3 = %d\n", i, debugInfo[i].m_valInt3);
}
}
-#endif //DEBUG_ME
-
-
+#endif //DEBUG_ME
}
}
-
- clFinish(m_data->m_queue);
-
+ clFinish(m_data->m_queue);
}
cdata.x = 1;
- bool applyFriction=true;
+ bool applyFriction = true;
if (applyFriction)
- {
+ {
B3_PROFILE("m_batchSolveKernel iterations2");
- for(int iter=0; iter<numIterations; iter++)
+ for (int iter = 0; iter < numIterations; iter++)
{
- for(int ib=0; ib<B3_SOLVER_N_BATCHES; ib++)
+ for (int ib = 0; ib < B3_SOLVER_N_BATCHES; ib++)
{
cdata.z = ib;
-
-
- b3BufferInfoCL bInfo[] = {
- b3BufferInfoCL( bodyBuf->getBufferCL() ),
- b3BufferInfoCL( shapeBuf->getBufferCL() ),
- b3BufferInfoCL( constraint->getBufferCL() ),
- b3BufferInfoCL( m_data->m_solverGPU->m_numConstraints->getBufferCL() ),
- b3BufferInfoCL( m_data->m_solverGPU->m_offsets->getBufferCL() )
+
+ b3BufferInfoCL bInfo[] = {
+ b3BufferInfoCL(bodyBuf->getBufferCL()),
+ b3BufferInfoCL(shapeBuf->getBufferCL()),
+ b3BufferInfoCL(constraint->getBufferCL()),
+ b3BufferInfoCL(m_data->m_solverGPU->m_numConstraints->getBufferCL()),
+ b3BufferInfoCL(m_data->m_solverGPU->m_offsets->getBufferCL())
#ifdef DEBUG_ME
- ,b3BufferInfoCL(&gpuDebugInfo)
-#endif //DEBUG_ME
+ ,
+ b3BufferInfoCL(&gpuDebugInfo)
+#endif //DEBUG_ME
};
- b3LauncherCL launcher( m_data->m_queue, m_data->m_solveFrictionKernel,"m_solveFrictionKernel" );
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setBuffer( m_data->m_solverGPU->m_batchSizes.getBufferCL());
+ b3LauncherCL launcher(m_data->m_queue, m_data->m_solveFrictionKernel, "m_solveFrictionKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setBuffer(m_data->m_solverGPU->m_batchSizes.getBufferCL());
//launcher.setConst( cdata.x );
- launcher.setConst( cdata.y );
- launcher.setConst( cdata.z );
+ launcher.setConst(cdata.y);
+ launcher.setConst(cdata.z);
- b3Int4 nSplit;
+ b3Int4 nSplit;
nSplit.x = B3_SOLVER_N_SPLIT_X;
nSplit.y = B3_SOLVER_N_SPLIT_Y;
nSplit.z = B3_SOLVER_N_SPLIT_Z;
- launcher.setConst( nSplit );
-
- launcher.launch1D( 64*nn/B3_SOLVER_N_BATCHES, 64 );
+ launcher.setConst(nSplit);
+
+ launcher.launch1D(64 * nn / B3_SOLVER_N_BATCHES, 64);
}
}
clFinish(m_data->m_queue);
-
}
#ifdef DEBUG_ME
delete[] debugInfo;
-#endif //DEBUG_ME
+#endif //DEBUG_ME
}
-
-
}
-
-
-
-
-
-
-
-
-
-
-static bool sortfnc(const b3SortData& a,const b3SortData& b)
+static bool sortfnc(const b3SortData& a, const b3SortData& b)
{
- return (a.m_key<b.m_key);
+ return (a.m_key < b.m_key);
}
static bool b3ContactCmp(const b3Contact4& p, const b3Contact4& q)
{
- return ((p.m_bodyAPtrAndSignBit<q.m_bodyAPtrAndSignBit) ||
- ((p.m_bodyAPtrAndSignBit==q.m_bodyAPtrAndSignBit) && (p.m_bodyBPtrAndSignBit<q.m_bodyBPtrAndSignBit)) ||
- ((p.m_bodyAPtrAndSignBit==q.m_bodyAPtrAndSignBit) && (p.m_bodyBPtrAndSignBit==q.m_bodyBPtrAndSignBit) && p.m_childIndexA<q.m_childIndexA ) ||
- ((p.m_bodyAPtrAndSignBit==q.m_bodyAPtrAndSignBit) && (p.m_bodyBPtrAndSignBit==q.m_bodyBPtrAndSignBit) && p.m_childIndexA<q.m_childIndexA ) ||
- ((p.m_bodyAPtrAndSignBit==q.m_bodyAPtrAndSignBit) && (p.m_bodyBPtrAndSignBit==q.m_bodyBPtrAndSignBit) && p.m_childIndexA==q.m_childIndexA && p.m_childIndexB<q.m_childIndexB)
- );
+ return ((p.m_bodyAPtrAndSignBit < q.m_bodyAPtrAndSignBit) ||
+ ((p.m_bodyAPtrAndSignBit == q.m_bodyAPtrAndSignBit) && (p.m_bodyBPtrAndSignBit < q.m_bodyBPtrAndSignBit)) ||
+ ((p.m_bodyAPtrAndSignBit == q.m_bodyAPtrAndSignBit) && (p.m_bodyBPtrAndSignBit == q.m_bodyBPtrAndSignBit) && p.m_childIndexA < q.m_childIndexA) ||
+ ((p.m_bodyAPtrAndSignBit == q.m_bodyAPtrAndSignBit) && (p.m_bodyBPtrAndSignBit == q.m_bodyBPtrAndSignBit) && p.m_childIndexA < q.m_childIndexA) ||
+ ((p.m_bodyAPtrAndSignBit == q.m_bodyAPtrAndSignBit) && (p.m_bodyBPtrAndSignBit == q.m_bodyBPtrAndSignBit) && p.m_childIndexA == q.m_childIndexA && p.m_childIndexB < q.m_childIndexB));
}
-
-
-
-
-
-
-
-
-
-
#define USE_SPATIAL_BATCHING 1
#define USE_4x4_GRID 1
#ifndef USE_SPATIAL_BATCHING
-static const int gridTable4x4[] =
-{
- 0,1,17,16,
- 1,2,18,19,
- 17,18,32,3,
- 16,19,3,34
-};
-static const int gridTable8x8[] =
-{
- 0, 2, 3, 16, 17, 18, 19, 1,
- 66, 64, 80, 67, 82, 81, 65, 83,
- 131,144,128,130,147,129,145,146,
- 208,195,194,192,193,211,210,209,
- 21, 22, 23, 5, 4, 6, 7, 20,
- 86, 85, 69, 87, 70, 68, 84, 71,
- 151,133,149,150,135,148,132,134,
- 197,27,214,213,212,199,198,196
-
-};
+static const int gridTable4x4[] =
+ {
+ 0, 1, 17, 16,
+ 1, 2, 18, 19,
+ 17, 18, 32, 3,
+ 16, 19, 3, 34};
+static const int gridTable8x8[] =
+ {
+ 0, 2, 3, 16, 17, 18, 19, 1,
+ 66, 64, 80, 67, 82, 81, 65, 83,
+ 131, 144, 128, 130, 147, 129, 145, 146,
+ 208, 195, 194, 192, 193, 211, 210, 209,
+ 21, 22, 23, 5, 4, 6, 7, 20,
+ 86, 85, 69, 87, 70, 68, 84, 71,
+ 151, 133, 149, 150, 135, 148, 132, 134,
+ 197, 27, 214, 213, 212, 199, 198, 196
+};
#endif
-
-void SetSortDataCPU(b3Contact4* gContact, b3RigidBodyData* gBodies, b3SortData* gSortDataOut, int nContacts,float scale,const b3Int4& nSplit,int staticIdx)
+void SetSortDataCPU(b3Contact4* gContact, b3RigidBodyData* gBodies, b3SortData* gSortDataOut, int nContacts, float scale, const b3Int4& nSplit, int staticIdx)
{
- for (int gIdx=0;gIdx<nContacts;gIdx++)
+ for (int gIdx = 0; gIdx < nContacts; gIdx++)
{
- if( gIdx < nContacts )
+ if (gIdx < nContacts)
{
- int aPtrAndSignBit = gContact[gIdx].m_bodyAPtrAndSignBit;
- int bPtrAndSignBit = gContact[gIdx].m_bodyBPtrAndSignBit;
+ int aPtrAndSignBit = gContact[gIdx].m_bodyAPtrAndSignBit;
+ int bPtrAndSignBit = gContact[gIdx].m_bodyBPtrAndSignBit;
- int aIdx = abs(aPtrAndSignBit );
+ int aIdx = abs(aPtrAndSignBit);
int bIdx = abs(bPtrAndSignBit);
- bool aStatic = (aPtrAndSignBit<0) ||(aPtrAndSignBit==staticIdx);
+ bool aStatic = (aPtrAndSignBit < 0) || (aPtrAndSignBit == staticIdx);
- #if USE_SPATIAL_BATCHING
- int idx = (aStatic)? bIdx: aIdx;
+#if USE_SPATIAL_BATCHING
+ int idx = (aStatic) ? bIdx : aIdx;
b3Vector3 p = gBodies[idx].m_pos;
- int xIdx = (int)((p.x-((p.x<0.f)?1.f:0.f))*scale) & (nSplit.x-1);
- int yIdx = (int)((p.y-((p.y<0.f)?1.f:0.f))*scale) & (nSplit.y-1);
- int zIdx = (int)((p.z-((p.z<0.f)?1.f:0.f))*scale) & (nSplit.z-1);
-
- int newIndex = (xIdx+yIdx*nSplit.x+zIdx*nSplit.x*nSplit.y);
-
- #else//USE_SPATIAL_BATCHING
- bool bStatic = (bPtrAndSignBit<0) ||(bPtrAndSignBit==staticIdx);
-
- #if USE_4x4_GRID
- int aa = aIdx&3;
- int bb = bIdx&3;
+ int xIdx = (int)((p.x - ((p.x < 0.f) ? 1.f : 0.f)) * scale) & (nSplit.x - 1);
+ int yIdx = (int)((p.y - ((p.y < 0.f) ? 1.f : 0.f)) * scale) & (nSplit.y - 1);
+ int zIdx = (int)((p.z - ((p.z < 0.f) ? 1.f : 0.f)) * scale) & (nSplit.z - 1);
+
+ int newIndex = (xIdx + yIdx * nSplit.x + zIdx * nSplit.x * nSplit.y);
+
+#else //USE_SPATIAL_BATCHING
+ bool bStatic = (bPtrAndSignBit < 0) || (bPtrAndSignBit == staticIdx);
+
+#if USE_4x4_GRID
+ int aa = aIdx & 3;
+ int bb = bIdx & 3;
if (aStatic)
aa = bb;
if (bStatic)
bb = aa;
- int gridIndex = aa + bb*4;
+ int gridIndex = aa + bb * 4;
int newIndex = gridTable4x4[gridIndex];
- #else//USE_4x4_GRID
- int aa = aIdx&7;
- int bb = bIdx&7;
+#else //USE_4x4_GRID
+ int aa = aIdx & 7;
+ int bb = bIdx & 7;
if (aStatic)
aa = bb;
if (bStatic)
bb = aa;
- int gridIndex = aa + bb*8;
+ int gridIndex = aa + bb * 8;
int newIndex = gridTable8x8[gridIndex];
- #endif//USE_4x4_GRID
- #endif//USE_SPATIAL_BATCHING
-
+#endif //USE_4x4_GRID
+#endif //USE_SPATIAL_BATCHING
gSortDataOut[gIdx].x = newIndex;
gSortDataOut[gIdx].y = gIdx;
@@ -650,17 +565,12 @@ void SetSortDataCPU(b3Contact4* gContact, b3RigidBodyData* gBodies, b3SortData*
}
}
-
-
-
-
-
void b3GpuPgsContactSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_mem inertiaBuf, int numContacts, cl_mem contactBuf, const b3Config& config, int static0Index)
{
B3_PROFILE("solveContacts");
- m_data->m_bodyBufferGPU->setFromOpenCLBuffer(bodyBuf,numBodies);
- m_data->m_inertiaBufferGPU->setFromOpenCLBuffer(inertiaBuf,numBodies);
- m_data->m_pBufContactOutGPU->setFromOpenCLBuffer(contactBuf,numContacts);
+ m_data->m_bodyBufferGPU->setFromOpenCLBuffer(bodyBuf, numBodies);
+ m_data->m_inertiaBufferGPU->setFromOpenCLBuffer(inertiaBuf, numBodies);
+ m_data->m_pBufContactOutGPU->setFromOpenCLBuffer(contactBuf, numContacts);
if (optionalSortContactsDeterminism)
{
@@ -671,61 +581,61 @@ void b3GpuPgsContactSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_mem
m_data->m_pBufContactOutGPUCopy->resize(numContacts);
m_data->m_contactKeyValues->resize(numContacts);
- m_data->m_pBufContactOutGPU->copyToCL(m_data->m_pBufContactOutGPUCopy->getBufferCL(),numContacts,0,0);
+ m_data->m_pBufContactOutGPU->copyToCL(m_data->m_pBufContactOutGPUCopy->getBufferCL(), numContacts, 0, 0);
{
- b3LauncherCL launcher(m_data->m_queue, m_data->m_setDeterminismSortDataChildShapeBKernel,"m_setDeterminismSortDataChildShapeBKernel");
+ b3LauncherCL launcher(m_data->m_queue, m_data->m_setDeterminismSortDataChildShapeBKernel, "m_setDeterminismSortDataChildShapeBKernel");
launcher.setBuffer(m_data->m_pBufContactOutGPUCopy->getBufferCL());
launcher.setBuffer(m_data->m_contactKeyValues->getBufferCL());
launcher.setConst(numContacts);
- launcher.launch1D( numContacts, 64 );
+ launcher.launch1D(numContacts, 64);
}
m_data->m_solverGPU->m_sort32->execute(*m_data->m_contactKeyValues);
{
- b3LauncherCL launcher(m_data->m_queue, m_data->m_setDeterminismSortDataChildShapeAKernel,"m_setDeterminismSortDataChildShapeAKernel");
+ b3LauncherCL launcher(m_data->m_queue, m_data->m_setDeterminismSortDataChildShapeAKernel, "m_setDeterminismSortDataChildShapeAKernel");
launcher.setBuffer(m_data->m_pBufContactOutGPUCopy->getBufferCL());
launcher.setBuffer(m_data->m_contactKeyValues->getBufferCL());
launcher.setConst(numContacts);
- launcher.launch1D( numContacts, 64 );
+ launcher.launch1D(numContacts, 64);
}
m_data->m_solverGPU->m_sort32->execute(*m_data->m_contactKeyValues);
{
- b3LauncherCL launcher(m_data->m_queue, m_data->m_setDeterminismSortDataBodyBKernel,"m_setDeterminismSortDataBodyBKernel");
+ b3LauncherCL launcher(m_data->m_queue, m_data->m_setDeterminismSortDataBodyBKernel, "m_setDeterminismSortDataBodyBKernel");
launcher.setBuffer(m_data->m_pBufContactOutGPUCopy->getBufferCL());
launcher.setBuffer(m_data->m_contactKeyValues->getBufferCL());
launcher.setConst(numContacts);
- launcher.launch1D( numContacts, 64 );
+ launcher.launch1D(numContacts, 64);
}
-
+
m_data->m_solverGPU->m_sort32->execute(*m_data->m_contactKeyValues);
-
+
{
- b3LauncherCL launcher(m_data->m_queue, m_data->m_setDeterminismSortDataBodyAKernel,"m_setDeterminismSortDataBodyAKernel");
+ b3LauncherCL launcher(m_data->m_queue, m_data->m_setDeterminismSortDataBodyAKernel, "m_setDeterminismSortDataBodyAKernel");
launcher.setBuffer(m_data->m_pBufContactOutGPUCopy->getBufferCL());
launcher.setBuffer(m_data->m_contactKeyValues->getBufferCL());
launcher.setConst(numContacts);
- launcher.launch1D( numContacts, 64 );
+ launcher.launch1D(numContacts, 64);
}
m_data->m_solverGPU->m_sort32->execute(*m_data->m_contactKeyValues);
{
B3_PROFILE("gpu reorderContactKernel (determinism)");
-
+
b3Int4 cdata;
cdata.x = numContacts;
-
+
//b3BufferInfoCL bInfo[] = { b3BufferInfoCL( m_data->m_pBufContactOutGPU->getBufferCL() ), b3BufferInfoCL( m_data->m_solverGPU->m_contactBuffer2->getBufferCL())
// , b3BufferInfoCL( m_data->m_solverGPU->m_sortDataBuffer->getBufferCL()) };
- b3LauncherCL launcher(m_data->m_queue,m_data->m_solverGPU->m_reorderContactKernel,"m_reorderContactKernel");
+ b3LauncherCL launcher(m_data->m_queue, m_data->m_solverGPU->m_reorderContactKernel, "m_reorderContactKernel");
launcher.setBuffer(m_data->m_pBufContactOutGPUCopy->getBufferCL());
launcher.setBuffer(m_data->m_pBufContactOutGPU->getBufferCL());
launcher.setBuffer(m_data->m_contactKeyValues->getBufferCL());
- launcher.setConst( cdata );
- launcher.launch1D( numContacts, 64 );
- }
-
- } else
+ launcher.setConst(cdata);
+ launcher.launch1D(numContacts, 64);
+ }
+ }
+ else
{
B3_PROFILE("CPU Sort contact constraints (determinism)");
b3AlignedObjectArray<b3Contact4> cpuConstraints;
@@ -735,96 +645,80 @@ void b3GpuPgsContactSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_mem
{
cpuConstraints.quickSort(b3ContactCmp);
- for (int i=0;i<cpuConstraints.size();i++)
+ for (int i = 0; i < cpuConstraints.size(); i++)
{
cpuConstraints[i].m_batchIdx = i;
}
}
m_data->m_pBufContactOutGPU->copyFromHost(cpuConstraints);
- if (m_debugOutput==100)
+ if (m_debugOutput == 100)
{
- for (int i=0;i<cpuConstraints.size();i++)
+ for (int i = 0; i < cpuConstraints.size(); i++)
{
- printf("c[%d].m_bodyA = %d, m_bodyB = %d, batchId = %d\n",i,cpuConstraints[i].m_bodyAPtrAndSignBit,cpuConstraints[i].m_bodyBPtrAndSignBit, cpuConstraints[i].m_batchIdx);
+ printf("c[%d].m_bodyA = %d, m_bodyB = %d, batchId = %d\n", i, cpuConstraints[i].m_bodyAPtrAndSignBit, cpuConstraints[i].m_bodyBPtrAndSignBit, cpuConstraints[i].m_batchIdx);
}
}
m_debugOutput++;
}
}
-
-
-
int nContactOut = m_data->m_pBufContactOutGPU->size();
bool useSolver = true;
-
-
- if (useSolver)
- {
- float dt=1./60.;
- b3ConstraintCfg csCfg( dt );
- csCfg.m_enableParallelSolve = true;
- csCfg.m_batchCellSize = 6;
- csCfg.m_staticIdx = static0Index;
-
-
- b3OpenCLArray<b3RigidBodyData>* bodyBuf = m_data->m_bodyBufferGPU;
-
- void* additionalData = 0;//m_data->m_frictionCGPU;
- const b3OpenCLArray<b3InertiaData>* shapeBuf = m_data->m_inertiaBufferGPU;
- b3OpenCLArray<b3GpuConstraint4>* contactConstraintOut = m_data->m_contactCGPU;
- int nContacts = nContactOut;
-
-
+
+ if (useSolver)
+ {
+ float dt = 1. / 60.;
+ b3ConstraintCfg csCfg(dt);
+ csCfg.m_enableParallelSolve = true;
+ csCfg.m_batchCellSize = 6;
+ csCfg.m_staticIdx = static0Index;
+
+ b3OpenCLArray<b3RigidBodyData>* bodyBuf = m_data->m_bodyBufferGPU;
+
+ void* additionalData = 0; //m_data->m_frictionCGPU;
+ const b3OpenCLArray<b3InertiaData>* shapeBuf = m_data->m_inertiaBufferGPU;
+ b3OpenCLArray<b3GpuConstraint4>* contactConstraintOut = m_data->m_contactCGPU;
+ int nContacts = nContactOut;
+
int maxNumBatches = 0;
-
+
if (!gUseLargeBatches)
- {
-
- if( m_data->m_solverGPU->m_contactBuffer2)
- {
- m_data->m_solverGPU->m_contactBuffer2->resize(nContacts);
- }
-
- if( m_data->m_solverGPU->m_contactBuffer2 == 0 )
- {
- m_data->m_solverGPU->m_contactBuffer2 = new b3OpenCLArray<b3Contact4>(m_data->m_context,m_data->m_queue, nContacts );
- m_data->m_solverGPU->m_contactBuffer2->resize(nContacts);
- }
-
- //clFinish(m_data->m_queue);
-
-
-
+ {
+ if (m_data->m_solverGPU->m_contactBuffer2)
{
- B3_PROFILE("batching");
- //@todo: just reserve it, without copy of original contact (unless we use warmstarting)
+ m_data->m_solverGPU->m_contactBuffer2->resize(nContacts);
+ }
+ if (m_data->m_solverGPU->m_contactBuffer2 == 0)
+ {
+ m_data->m_solverGPU->m_contactBuffer2 = new b3OpenCLArray<b3Contact4>(m_data->m_context, m_data->m_queue, nContacts);
+ m_data->m_solverGPU->m_contactBuffer2->resize(nContacts);
+ }
+ //clFinish(m_data->m_queue);
- //const b3OpenCLArray<b3RigidBodyData>* bodyNative = bodyBuf;
+ {
+ B3_PROFILE("batching");
+ //@todo: just reserve it, without copy of original contact (unless we use warmstarting)
+ //const b3OpenCLArray<b3RigidBodyData>* bodyNative = bodyBuf;
{
-
//b3OpenCLArray<b3RigidBodyData>* bodyNative = b3OpenCLArrayUtils::map<adl::TYPE_CL, true>( data->m_device, bodyBuf );
//b3OpenCLArray<b3Contact4>* contactNative = b3OpenCLArrayUtils::map<adl::TYPE_CL, true>( data->m_device, contactsIn );
- const int sortAlignment = 512; // todo. get this out of sort
- if( csCfg.m_enableParallelSolve )
+ const int sortAlignment = 512; // todo. get this out of sort
+ if (csCfg.m_enableParallelSolve)
{
-
-
- int sortSize = B3NEXTMULTIPLEOF( nContacts, sortAlignment );
+ int sortSize = B3NEXTMULTIPLEOF(nContacts, sortAlignment);
b3OpenCLArray<unsigned int>* countsNative = m_data->m_solverGPU->m_numConstraints;
b3OpenCLArray<unsigned int>* offsetsNative = m_data->m_solverGPU->m_offsets;
-
if (!gCpuSetSortData)
- { // 2. set cell idx
+ { // 2. set cell idx
B3_PROFILE("GPU set cell idx");
struct CB
{
@@ -834,29 +728,28 @@ void b3GpuPgsContactSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_mem
b3Int4 m_nSplit;
};
- b3Assert( sortSize%64 == 0 );
+ b3Assert(sortSize % 64 == 0);
CB cdata;
cdata.m_nContacts = nContacts;
cdata.m_staticIdx = csCfg.m_staticIdx;
- cdata.m_scale = 1.f/csCfg.m_batchCellSize;
+ cdata.m_scale = 1.f / csCfg.m_batchCellSize;
cdata.m_nSplit.x = B3_SOLVER_N_SPLIT_X;
cdata.m_nSplit.y = B3_SOLVER_N_SPLIT_Y;
cdata.m_nSplit.z = B3_SOLVER_N_SPLIT_Z;
m_data->m_solverGPU->m_sortDataBuffer->resize(nContacts);
-
- b3BufferInfoCL bInfo[] = { b3BufferInfoCL( m_data->m_pBufContactOutGPU->getBufferCL() ), b3BufferInfoCL( bodyBuf->getBufferCL()), b3BufferInfoCL( m_data->m_solverGPU->m_sortDataBuffer->getBufferCL()) };
- b3LauncherCL launcher(m_data->m_queue, m_data->m_solverGPU->m_setSortDataKernel,"m_setSortDataKernel" );
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( cdata.m_nContacts );
- launcher.setConst( cdata.m_scale );
+ b3BufferInfoCL bInfo[] = {b3BufferInfoCL(m_data->m_pBufContactOutGPU->getBufferCL()), b3BufferInfoCL(bodyBuf->getBufferCL()), b3BufferInfoCL(m_data->m_solverGPU->m_sortDataBuffer->getBufferCL())};
+ b3LauncherCL launcher(m_data->m_queue, m_data->m_solverGPU->m_setSortDataKernel, "m_setSortDataKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(cdata.m_nContacts);
+ launcher.setConst(cdata.m_scale);
launcher.setConst(cdata.m_nSplit);
launcher.setConst(cdata.m_staticIdx);
-
- launcher.launch1D( sortSize, 64 );
- } else
+ launcher.launch1D(sortSize, 64);
+ }
+ else
{
m_data->m_solverGPU->m_sortDataBuffer->resize(nContacts);
b3AlignedObjectArray<b3SortData> sortDataCPU;
@@ -866,22 +759,19 @@ void b3GpuPgsContactSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_mem
m_data->m_pBufContactOutGPU->copyToHost(contactCPU);
b3AlignedObjectArray<b3RigidBodyData> bodiesCPU;
bodyBuf->copyToHost(bodiesCPU);
- float scale = 1.f/csCfg.m_batchCellSize;
+ float scale = 1.f / csCfg.m_batchCellSize;
b3Int4 nSplit;
nSplit.x = B3_SOLVER_N_SPLIT_X;
nSplit.y = B3_SOLVER_N_SPLIT_Y;
nSplit.z = B3_SOLVER_N_SPLIT_Z;
- SetSortDataCPU(&contactCPU[0], &bodiesCPU[0], &sortDataCPU[0], nContacts,scale,nSplit,csCfg.m_staticIdx);
-
+ SetSortDataCPU(&contactCPU[0], &bodiesCPU[0], &sortDataCPU[0], nContacts, scale, nSplit, csCfg.m_staticIdx);
m_data->m_solverGPU->m_sortDataBuffer->copyFromHost(sortDataCPU);
}
-
-
if (!gCpuRadixSort)
- { // 3. sort by cell idx
+ { // 3. sort by cell idx
B3_PROFILE("gpuRadixSort");
//int n = B3_SOLVER_N_SPLIT*B3_SOLVER_N_SPLIT;
//int sortBit = 32;
@@ -891,10 +781,8 @@ void b3GpuPgsContactSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_mem
//adl::RadixSort32<adl::TYPE_CL>::execute( data->m_sort32, *data->m_sortDataBuffer, sortSize );
b3OpenCLArray<b3SortData>& keyValuesInOut = *(m_data->m_solverGPU->m_sortDataBuffer);
this->m_data->m_solverGPU->m_sort32->execute(keyValuesInOut);
-
-
-
- } else
+ }
+ else
{
b3OpenCLArray<b3SortData>& keyValuesInOut = *(m_data->m_solverGPU->m_sortDataBuffer);
b3AlignedObjectArray<b3SortData> hostValues;
@@ -903,7 +791,6 @@ void b3GpuPgsContactSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_mem
keyValuesInOut.copyFromHost(hostValues);
}
-
if (gUseScanHost)
{
// 4. find entries
@@ -914,13 +801,11 @@ void b3GpuPgsContactSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_mem
b3AlignedObjectArray<b3SortData> sortDataHost;
m_data->m_solverGPU->m_sortDataBuffer->copyToHost(sortDataHost);
-
//m_data->m_solverGPU->m_search->executeHost(*m_data->m_solverGPU->m_sortDataBuffer,nContacts,*countsNative,B3_SOLVER_N_CELLS,b3BoundSearchCL::COUNT);
- m_data->m_solverGPU->m_search->executeHost(sortDataHost,nContacts,countsHost,B3_SOLVER_N_CELLS,b3BoundSearchCL::COUNT);
+ m_data->m_solverGPU->m_search->executeHost(sortDataHost, nContacts, countsHost, B3_SOLVER_N_CELLS, b3BoundSearchCL::COUNT);
countsNative->copyFromHost(countsHost);
-
//adl::BoundSearch<adl::TYPE_CL>::execute( data->m_search, *data->m_sortDataBuffer, nContacts, *countsNative,
// B3_SOLVER_N_SPLIT*B3_SOLVER_N_SPLIT, adl::BoundSearchBase::COUNT );
@@ -929,24 +814,21 @@ void b3GpuPgsContactSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_mem
b3AlignedObjectArray<unsigned int> offsetsHost;
offsetsHost.resize(offsetsNative->size());
-
- m_data->m_solverGPU->m_scan->executeHost(countsHost,offsetsHost, B3_SOLVER_N_CELLS);//,&sum );
+ m_data->m_solverGPU->m_scan->executeHost(countsHost, offsetsHost, B3_SOLVER_N_CELLS); //,&sum );
offsetsNative->copyFromHost(offsetsHost);
//printf("sum = %d\n",sum);
- } else
+ }
+ else
{
// 4. find entries
B3_PROFILE("gpuBoundSearch");
- m_data->m_solverGPU->m_search->execute(*m_data->m_solverGPU->m_sortDataBuffer,nContacts,*countsNative,B3_SOLVER_N_CELLS,b3BoundSearchCL::COUNT);
- m_data->m_solverGPU->m_scan->execute(*countsNative,*offsetsNative, B3_SOLVER_N_CELLS);//,&sum );
- }
-
-
-
+ m_data->m_solverGPU->m_search->execute(*m_data->m_solverGPU->m_sortDataBuffer, nContacts, *countsNative, B3_SOLVER_N_CELLS, b3BoundSearchCL::COUNT);
+ m_data->m_solverGPU->m_scan->execute(*countsNative, *offsetsNative, B3_SOLVER_N_CELLS); //,&sum );
+ }
if (nContacts)
- { // 5. sort constraints by cellIdx
+ { // 5. sort constraints by cellIdx
if (gReorderContactsOnCpu)
{
B3_PROFILE("cpu m_reorderContactKernel");
@@ -956,7 +838,7 @@ void b3GpuPgsContactSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_mem
b3AlignedObjectArray<b3Contact4> outContacts;
m_data->m_pBufContactOutGPU->copyToHost(inContacts);
outContacts.resize(inContacts.size());
- for (int i=0;i<nContacts;i++)
+ for (int i = 0; i < nContacts; i++)
{
int srcIdx = sortDataHost[i].y;
outContacts[i] = inContacts[srcIdx];
@@ -974,30 +856,25 @@ void b3GpuPgsContactSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_mem
" }\n"
"}\n"
*/
- } else
+ }
+ else
{
B3_PROFILE("gpu m_reorderContactKernel");
b3Int4 cdata;
cdata.x = nContacts;
- b3BufferInfoCL bInfo[] = {
- b3BufferInfoCL( m_data->m_pBufContactOutGPU->getBufferCL() ),
- b3BufferInfoCL( m_data->m_solverGPU->m_contactBuffer2->getBufferCL())
- , b3BufferInfoCL( m_data->m_solverGPU->m_sortDataBuffer->getBufferCL()) };
+ b3BufferInfoCL bInfo[] = {
+ b3BufferInfoCL(m_data->m_pBufContactOutGPU->getBufferCL()),
+ b3BufferInfoCL(m_data->m_solverGPU->m_contactBuffer2->getBufferCL()), b3BufferInfoCL(m_data->m_solverGPU->m_sortDataBuffer->getBufferCL())};
- b3LauncherCL launcher(m_data->m_queue,m_data->m_solverGPU->m_reorderContactKernel,"m_reorderContactKernel");
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( cdata );
- launcher.launch1D( nContacts, 64 );
+ b3LauncherCL launcher(m_data->m_queue, m_data->m_solverGPU->m_reorderContactKernel, "m_reorderContactKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(cdata);
+ launcher.launch1D(nContacts, 64);
}
}
-
-
-
-
}
-
}
//clFinish(m_data->m_queue);
@@ -1008,48 +885,46 @@ void b3GpuPgsContactSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_mem
// printf(",,,\n");
// }
-
if (nContacts)
{
-
if (gUseCpuCopyConstraints)
{
- for (int i=0;i<nContacts;i++)
+ for (int i = 0; i < nContacts; i++)
{
m_data->m_pBufContactOutGPU->copyFromOpenCLArray(*m_data->m_solverGPU->m_contactBuffer2);
- // m_data->m_solverGPU->m_contactBuffer2->getBufferCL();
- // m_data->m_pBufContactOutGPU->getBufferCL()
+ // m_data->m_solverGPU->m_contactBuffer2->getBufferCL();
+ // m_data->m_pBufContactOutGPU->getBufferCL()
}
-
- } else
+ }
+ else
{
B3_PROFILE("gpu m_copyConstraintKernel");
- b3Int4 cdata; cdata.x = nContacts;
- b3BufferInfoCL bInfo[] = {
- b3BufferInfoCL( m_data->m_solverGPU->m_contactBuffer2->getBufferCL() ),
- b3BufferInfoCL( m_data->m_pBufContactOutGPU->getBufferCL() )
- };
-
- b3LauncherCL launcher(m_data->m_queue, m_data->m_solverGPU->m_copyConstraintKernel,"m_copyConstraintKernel" );
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
- launcher.setConst( cdata );
- launcher.launch1D( nContacts, 64 );
+ b3Int4 cdata;
+ cdata.x = nContacts;
+ b3BufferInfoCL bInfo[] = {
+ b3BufferInfoCL(m_data->m_solverGPU->m_contactBuffer2->getBufferCL()),
+ b3BufferInfoCL(m_data->m_pBufContactOutGPU->getBufferCL())};
+
+ b3LauncherCL launcher(m_data->m_queue, m_data->m_solverGPU->m_copyConstraintKernel, "m_copyConstraintKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
+ launcher.setConst(cdata);
+ launcher.launch1D(nContacts, 64);
//we use the clFinish for proper benchmark/profile
clFinish(m_data->m_queue);
}
}
-
-// bool compareGPU = false;
+ // bool compareGPU = false;
if (nContacts)
{
if (!gCpuBatchContacts)
{
B3_PROFILE("gpu batchContacts");
- maxNumBatches = 250;//250;
- m_data->m_solverGPU->batchContacts( m_data->m_pBufContactOutGPU, nContacts, m_data->m_solverGPU->m_numConstraints, m_data->m_solverGPU->m_offsets, csCfg.m_staticIdx );
+ maxNumBatches = 250; //250;
+ m_data->m_solverGPU->batchContacts(m_data->m_pBufContactOutGPU, nContacts, m_data->m_solverGPU->m_numConstraints, m_data->m_solverGPU->m_offsets, csCfg.m_staticIdx);
clFinish(m_data->m_queue);
- } else
+ }
+ else
{
B3_PROFILE("cpu batchContacts");
static b3AlignedObjectArray<b3Contact4> cpuContacts;
@@ -1070,45 +945,43 @@ void b3GpuPgsContactSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_mem
offsetsNative->copyToHost(offsetsNativeHost);
}
-
- int numNonzeroGrid=0;
+ int numNonzeroGrid = 0;
if (gUseLargeBatches)
{
m_data->m_batchSizes.resize(B3_MAX_NUM_BATCHES);
int totalNumConstraints = cpuContacts.size();
//int simdWidth =numBodies+1;//-1;//64;//-1;//32;
- int numBatches = sortConstraintByBatch3( &cpuContacts[0], totalNumConstraints, totalNumConstraints+1,csCfg.m_staticIdx ,numBodies,&m_data->m_batchSizes[0]); // on GPU
- maxNumBatches = b3Max(numBatches,maxNumBatches);
+ int numBatches = sortConstraintByBatch3(&cpuContacts[0], totalNumConstraints, totalNumConstraints + 1, csCfg.m_staticIdx, numBodies, &m_data->m_batchSizes[0]); // on GPU
+ maxNumBatches = b3Max(numBatches, maxNumBatches);
static int globalMaxBatch = 0;
- if (maxNumBatches>globalMaxBatch )
+ if (maxNumBatches > globalMaxBatch)
{
- globalMaxBatch = maxNumBatches;
- b3Printf("maxNumBatches = %d\n",maxNumBatches);
+ globalMaxBatch = maxNumBatches;
+ b3Printf("maxNumBatches = %d\n", maxNumBatches);
}
-
- } else
+ }
+ else
{
- m_data->m_batchSizes.resize(B3_SOLVER_N_CELLS*B3_MAX_NUM_BATCHES);
+ m_data->m_batchSizes.resize(B3_SOLVER_N_CELLS * B3_MAX_NUM_BATCHES);
B3_PROFILE("cpu batch grid");
- for(int i=0; i<B3_SOLVER_N_CELLS; i++)
+ for (int i = 0; i < B3_SOLVER_N_CELLS; i++)
{
int n = (nNativeHost)[i];
int offset = (offsetsNativeHost)[i];
- if( n )
+ if (n)
{
numNonzeroGrid++;
- int simdWidth =numBodies+1;//-1;//64;//-1;//32;
- int numBatches = sortConstraintByBatch3( &cpuContacts[0]+offset, n, simdWidth,csCfg.m_staticIdx ,numBodies,&m_data->m_batchSizes[i*B3_MAX_NUM_BATCHES]); // on GPU
- maxNumBatches = b3Max(numBatches,maxNumBatches);
+ int simdWidth = numBodies + 1; //-1;//64;//-1;//32;
+ int numBatches = sortConstraintByBatch3(&cpuContacts[0] + offset, n, simdWidth, csCfg.m_staticIdx, numBodies, &m_data->m_batchSizes[i * B3_MAX_NUM_BATCHES]); // on GPU
+ maxNumBatches = b3Max(numBatches, maxNumBatches);
static int globalMaxBatch = 0;
- if (maxNumBatches>globalMaxBatch )
+ if (maxNumBatches > globalMaxBatch)
{
- globalMaxBatch = maxNumBatches;
- b3Printf("maxNumBatches = %d\n",maxNumBatches);
+ globalMaxBatch = maxNumBatches;
+ b3Printf("maxNumBatches = %d\n", maxNumBatches);
}
//we use the clFinish for proper benchmark/profile
-
}
}
//clFinish(m_data->m_queue);
@@ -1117,22 +990,12 @@ void b3GpuPgsContactSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_mem
B3_PROFILE("m_contactBuffer->copyFromHost");
m_data->m_solverGPU->m_contactBuffer2->copyFromHost((b3AlignedObjectArray<b3Contact4>&)cpuContacts);
}
-
- }
-
+ }
}
+ }
+ }
-
-
-
-
- }
-
-
- }
-
-
- //printf("maxNumBatches = %d\n", maxNumBatches);
+ //printf("maxNumBatches = %d\n", maxNumBatches);
if (gUseLargeBatches)
{
@@ -1140,58 +1003,52 @@ void b3GpuPgsContactSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_mem
{
B3_PROFILE("cpu batchContacts");
static b3AlignedObjectArray<b3Contact4> cpuContacts;
-// b3OpenCLArray<b3Contact4>* contactsIn = m_data->m_solverGPU->m_contactBuffer2;
+ // b3OpenCLArray<b3Contact4>* contactsIn = m_data->m_solverGPU->m_contactBuffer2;
{
B3_PROFILE("copyToHost");
m_data->m_pBufContactOutGPU->copyToHost(cpuContacts);
}
-// b3OpenCLArray<unsigned int>* countsNative = m_data->m_solverGPU->m_numConstraints;
-// b3OpenCLArray<unsigned int>* offsetsNative = m_data->m_solverGPU->m_offsets;
-
+ // b3OpenCLArray<unsigned int>* countsNative = m_data->m_solverGPU->m_numConstraints;
+ // b3OpenCLArray<unsigned int>* offsetsNative = m_data->m_solverGPU->m_offsets;
-
-// int numNonzeroGrid=0;
+ // int numNonzeroGrid=0;
{
m_data->m_batchSizes.resize(B3_MAX_NUM_BATCHES);
int totalNumConstraints = cpuContacts.size();
- // int simdWidth =numBodies+1;//-1;//64;//-1;//32;
- int numBatches = sortConstraintByBatch3( &cpuContacts[0], totalNumConstraints, totalNumConstraints+1,csCfg.m_staticIdx ,numBodies,&m_data->m_batchSizes[0]); // on GPU
- maxNumBatches = b3Max(numBatches,maxNumBatches);
+ // int simdWidth =numBodies+1;//-1;//64;//-1;//32;
+ int numBatches = sortConstraintByBatch3(&cpuContacts[0], totalNumConstraints, totalNumConstraints + 1, csCfg.m_staticIdx, numBodies, &m_data->m_batchSizes[0]); // on GPU
+ maxNumBatches = b3Max(numBatches, maxNumBatches);
static int globalMaxBatch = 0;
- if (maxNumBatches>globalMaxBatch )
+ if (maxNumBatches > globalMaxBatch)
{
- globalMaxBatch = maxNumBatches;
- b3Printf("maxNumBatches = %d\n",maxNumBatches);
+ globalMaxBatch = maxNumBatches;
+ b3Printf("maxNumBatches = %d\n", maxNumBatches);
}
-
}
{
B3_PROFILE("m_contactBuffer->copyFromHost");
m_data->m_solverGPU->m_contactBuffer2->copyFromHost((b3AlignedObjectArray<b3Contact4>&)cpuContacts);
}
-
- }
-
+ }
}
if (nContacts)
{
B3_PROFILE("gpu convertToConstraints");
- m_data->m_solverGPU->convertToConstraints( bodyBuf,
- shapeBuf, m_data->m_solverGPU->m_contactBuffer2,
- contactConstraintOut,
- additionalData, nContacts,
- (b3SolverBase::ConstraintCfg&) csCfg );
+ m_data->m_solverGPU->convertToConstraints(bodyBuf,
+ shapeBuf, m_data->m_solverGPU->m_contactBuffer2,
+ contactConstraintOut,
+ additionalData, nContacts,
+ (b3SolverBase::ConstraintCfg&)csCfg);
clFinish(m_data->m_queue);
}
-
if (1)
{
int numIter = 4;
- m_data->m_solverGPU->m_nIterations = numIter;//10
+ m_data->m_solverGPU->m_nIterations = numIter; //10
if (!gCpuSolveConstraint)
{
B3_PROFILE("GPU solveContactConstraint");
@@ -1208,32 +1065,30 @@ void b3GpuPgsContactSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_mem
if (gUseLargeBatches)
{
- solveContactConstraintBatchSizes(m_data->m_bodyBufferGPU,
- m_data->m_inertiaBufferGPU,
- m_data->m_contactCGPU,0,
- nContactOut ,
- maxNumBatches,numIter,&m_data->m_batchSizes);
- } else
+ solveContactConstraintBatchSizes(m_data->m_bodyBufferGPU,
+ m_data->m_inertiaBufferGPU,
+ m_data->m_contactCGPU, 0,
+ nContactOut,
+ maxNumBatches, numIter, &m_data->m_batchSizes);
+ }
+ else
{
solveContactConstraint(
- m_data->m_bodyBufferGPU,
+ m_data->m_bodyBufferGPU,
m_data->m_inertiaBufferGPU,
- m_data->m_contactCGPU,0,
- nContactOut ,
- maxNumBatches,numIter,&m_data->m_batchSizes);//m_data->m_batchSizesGpu);
+ m_data->m_contactCGPU, 0,
+ nContactOut,
+ maxNumBatches, numIter, &m_data->m_batchSizes); //m_data->m_batchSizesGpu);
}
}
else
{
B3_PROFILE("Host solveContactConstraint");
- m_data->m_solverGPU->solveContactConstraintHost(m_data->m_bodyBufferGPU, m_data->m_inertiaBufferGPU, m_data->m_contactCGPU,0, nContactOut ,maxNumBatches,&m_data->m_batchSizes);
+ m_data->m_solverGPU->solveContactConstraintHost(m_data->m_bodyBufferGPU, m_data->m_inertiaBufferGPU, m_data->m_contactCGPU, 0, nContactOut, maxNumBatches, &m_data->m_batchSizes);
}
-
-
- }
-
-
+ }
+
#if 0
if (0)
{
@@ -1244,114 +1099,96 @@ void b3GpuPgsContactSolver::solveContacts(int numBodies, cl_mem bodyBuf, cl_mem
adl::DeviceUtils::waitForCompletion( m_data->m_deviceCL );
}
#endif
-
- }
-
+ }
}
-
-void b3GpuPgsContactSolver::batchContacts( b3OpenCLArray<b3Contact4>* contacts, int nContacts, b3OpenCLArray<unsigned int>* n, b3OpenCLArray<unsigned int>* offsets, int staticIdx )
+void b3GpuPgsContactSolver::batchContacts(b3OpenCLArray<b3Contact4>* contacts, int nContacts, b3OpenCLArray<unsigned int>* n, b3OpenCLArray<unsigned int>* offsets, int staticIdx)
{
}
-
-
-
-
-
-
-
-
-
-
b3AlignedObjectArray<unsigned int> idxBuffer;
b3AlignedObjectArray<b3SortData> sortData;
b3AlignedObjectArray<b3Contact4> old;
-
-inline int b3GpuPgsContactSolver::sortConstraintByBatch( b3Contact4* cs, int n, int simdWidth , int staticIdx, int numBodies)
+inline int b3GpuPgsContactSolver::sortConstraintByBatch(b3Contact4* cs, int n, int simdWidth, int staticIdx, int numBodies)
{
-
B3_PROFILE("sortConstraintByBatch");
int numIter = 0;
-
+
sortData.resize(n);
idxBuffer.resize(n);
old.resize(n);
-
+
unsigned int* idxSrc = &idxBuffer[0];
unsigned int* idxDst = &idxBuffer[0];
int nIdxSrc, nIdxDst;
-
+
const int N_FLG = 256;
- const int FLG_MASK = N_FLG-1;
- unsigned int flg[N_FLG/32];
+ const int FLG_MASK = N_FLG - 1;
+ unsigned int flg[N_FLG / 32];
#if defined(_DEBUG)
- for(int i=0; i<n; i++)
+ for (int i = 0; i < n; i++)
cs[i].getBatchIdx() = -1;
#endif
- for(int i=0; i<n; i++)
+ for (int i = 0; i < n; i++)
idxSrc[i] = i;
nIdxSrc = n;
-
+
int batchIdx = 0;
-
+
{
B3_PROFILE("cpu batch innerloop");
- while( nIdxSrc )
+ while (nIdxSrc)
{
numIter++;
nIdxDst = 0;
int nCurrentBatch = 0;
-
+
// clear flag
- for(int i=0; i<N_FLG/32; i++) flg[i] = 0;
-
- for(int i=0; i<nIdxSrc; i++)
+ for (int i = 0; i < N_FLG / 32; i++) flg[i] = 0;
+
+ for (int i = 0; i < nIdxSrc; i++)
{
int idx = idxSrc[i];
-
- b3Assert( idx < n );
+ b3Assert(idx < n);
// check if it can go
int bodyAS = cs[idx].m_bodyAPtrAndSignBit;
int bodyBS = cs[idx].m_bodyBPtrAndSignBit;
-
-
-
+
int bodyA = abs(bodyAS);
int bodyB = abs(bodyBS);
-
+
int aIdx = bodyA & FLG_MASK;
int bIdx = bodyB & FLG_MASK;
-
- unsigned int aUnavailable = flg[ aIdx/32 ] & (1<<(aIdx&31));
- unsigned int bUnavailable = flg[ bIdx/32 ] & (1<<(bIdx&31));
-
- bool aIsStatic = (bodyAS<0) || bodyAS==staticIdx;
- bool bIsStatic = (bodyBS<0) || bodyBS==staticIdx;
-
- //use inv_mass!
- aUnavailable = !aIsStatic? aUnavailable:0;//
- bUnavailable = !bIsStatic? bUnavailable:0;
-
- if( aUnavailable==0 && bUnavailable==0 ) // ok
+
+ unsigned int aUnavailable = flg[aIdx / 32] & (1 << (aIdx & 31));
+ unsigned int bUnavailable = flg[bIdx / 32] & (1 << (bIdx & 31));
+
+ bool aIsStatic = (bodyAS < 0) || bodyAS == staticIdx;
+ bool bIsStatic = (bodyBS < 0) || bodyBS == staticIdx;
+
+ //use inv_mass!
+ aUnavailable = !aIsStatic ? aUnavailable : 0; //
+ bUnavailable = !bIsStatic ? bUnavailable : 0;
+
+ if (aUnavailable == 0 && bUnavailable == 0) // ok
{
if (!aIsStatic)
- flg[ aIdx/32 ] |= (1<<(aIdx&31));
+ flg[aIdx / 32] |= (1 << (aIdx & 31));
if (!bIsStatic)
- flg[ bIdx/32 ] |= (1<<(bIdx&31));
+ flg[bIdx / 32] |= (1 << (bIdx & 31));
cs[idx].getBatchIdx() = batchIdx;
sortData[idx].m_key = batchIdx;
sortData[idx].m_value = idx;
-
+
{
nCurrentBatch++;
- if( nCurrentBatch == simdWidth )
+ if (nCurrentBatch == simdWidth)
{
nCurrentBatch = 0;
- for(int i=0; i<N_FLG/32; i++) flg[i] = 0;
+ for (int i = 0; i < N_FLG / 32; i++) flg[i] = 0;
}
}
}
@@ -1360,128 +1197,121 @@ inline int b3GpuPgsContactSolver::sortConstraintByBatch( b3Contact4* cs, int n,
idxDst[nIdxDst++] = idx;
}
}
- b3Swap( idxSrc, idxDst );
- b3Swap( nIdxSrc, nIdxDst );
- batchIdx ++;
+ b3Swap(idxSrc, idxDst);
+ b3Swap(nIdxSrc, nIdxDst);
+ batchIdx++;
}
}
{
B3_PROFILE("quickSort");
sortData.quickSort(sortfnc);
}
-
-
+
{
- B3_PROFILE("reorder");
+ B3_PROFILE("reorder");
// reorder
-
- memcpy( &old[0], cs, sizeof(b3Contact4)*n);
- for(int i=0; i<n; i++)
+
+ memcpy(&old[0], cs, sizeof(b3Contact4) * n);
+ for (int i = 0; i < n; i++)
{
int idx = sortData[i].m_value;
cs[i] = old[idx];
}
}
-
-
+
#if defined(_DEBUG)
- // debugPrintf( "nBatches: %d\n", batchIdx );
- for(int i=0; i<n; i++)
- {
- b3Assert( cs[i].getBatchIdx() != -1 );
- }
+ // debugPrintf( "nBatches: %d\n", batchIdx );
+ for (int i = 0; i < n; i++)
+ {
+ b3Assert(cs[i].getBatchIdx() != -1);
+ }
#endif
return batchIdx;
}
-
b3AlignedObjectArray<int> bodyUsed2;
-inline int b3GpuPgsContactSolver::sortConstraintByBatch2( b3Contact4* cs, int numConstraints, int simdWidth , int staticIdx, int numBodies)
+inline int b3GpuPgsContactSolver::sortConstraintByBatch2(b3Contact4* cs, int numConstraints, int simdWidth, int staticIdx, int numBodies)
{
-
B3_PROFILE("sortConstraintByBatch2");
-
-
- bodyUsed2.resize(2*simdWidth);
+ bodyUsed2.resize(2 * simdWidth);
- for (int q=0;q<2*simdWidth;q++)
- bodyUsed2[q]=0;
+ for (int q = 0; q < 2 * simdWidth; q++)
+ bodyUsed2[q] = 0;
int curBodyUsed = 0;
int numIter = 0;
-
+
m_data->m_sortData.resize(numConstraints);
m_data->m_idxBuffer.resize(numConstraints);
m_data->m_old.resize(numConstraints);
-
+
unsigned int* idxSrc = &m_data->m_idxBuffer[0];
-
+
#if defined(_DEBUG)
- for(int i=0; i<numConstraints; i++)
+ for (int i = 0; i < numConstraints; i++)
cs[i].getBatchIdx() = -1;
#endif
- for(int i=0; i<numConstraints; i++)
+ for (int i = 0; i < numConstraints; i++)
idxSrc[i] = i;
-
+
int numValidConstraints = 0;
-// int unprocessedConstraintIndex = 0;
+ // int unprocessedConstraintIndex = 0;
int batchIdx = 0;
-
{
B3_PROFILE("cpu batch innerloop");
-
- while( numValidConstraints < numConstraints)
+
+ while (numValidConstraints < numConstraints)
{
numIter++;
int nCurrentBatch = 0;
// clear flag
- for(int i=0; i<curBodyUsed; i++)
+ for (int i = 0; i < curBodyUsed; i++)
bodyUsed2[i] = 0;
- curBodyUsed = 0;
+ curBodyUsed = 0;
- for(int i=numValidConstraints; i<numConstraints; i++)
+ for (int i = numValidConstraints; i < numConstraints; i++)
{
int idx = idxSrc[i];
- b3Assert( idx < numConstraints );
+ b3Assert(idx < numConstraints);
// check if it can go
int bodyAS = cs[idx].m_bodyAPtrAndSignBit;
int bodyBS = cs[idx].m_bodyBPtrAndSignBit;
int bodyA = abs(bodyAS);
int bodyB = abs(bodyBS);
- bool aIsStatic = (bodyAS<0) || bodyAS==staticIdx;
- bool bIsStatic = (bodyBS<0) || bodyBS==staticIdx;
+ bool aIsStatic = (bodyAS < 0) || bodyAS == staticIdx;
+ bool bIsStatic = (bodyBS < 0) || bodyBS == staticIdx;
int aUnavailable = 0;
int bUnavailable = 0;
if (!aIsStatic)
{
- for (int j=0;j<curBodyUsed;j++)
+ for (int j = 0; j < curBodyUsed; j++)
{
if (bodyA == bodyUsed2[j])
{
- aUnavailable=1;
+ aUnavailable = 1;
break;
}
}
}
if (!aUnavailable)
- if (!bIsStatic)
- {
- for (int j=0;j<curBodyUsed;j++)
+ if (!bIsStatic)
{
- if (bodyB == bodyUsed2[j])
+ for (int j = 0; j < curBodyUsed; j++)
{
- bUnavailable=1;
- break;
+ if (bodyB == bodyUsed2[j])
+ {
+ bUnavailable = 1;
+ break;
+ }
}
}
- }
-
- if( aUnavailable==0 && bUnavailable==0 ) // ok
+
+ if (aUnavailable == 0 && bUnavailable == 0) // ok
{
if (!aIsStatic)
{
@@ -1496,7 +1326,7 @@ inline int b3GpuPgsContactSolver::sortConstraintByBatch2( b3Contact4* cs, int nu
m_data->m_sortData[idx].m_key = batchIdx;
m_data->m_sortData[idx].m_value = idx;
- if (i!=numValidConstraints)
+ if (i != numValidConstraints)
{
b3Swap(idxSrc[i], idxSrc[numValidConstraints]);
}
@@ -1504,20 +1334,19 @@ inline int b3GpuPgsContactSolver::sortConstraintByBatch2( b3Contact4* cs, int nu
numValidConstraints++;
{
nCurrentBatch++;
- if( nCurrentBatch == simdWidth )
+ if (nCurrentBatch == simdWidth)
{
nCurrentBatch = 0;
- for(int i=0; i<curBodyUsed; i++)
+ for (int i = 0; i < curBodyUsed; i++)
bodyUsed2[i] = 0;
-
curBodyUsed = 0;
}
}
}
}
-
- batchIdx ++;
+
+ batchIdx++;
}
}
{
@@ -1526,155 +1355,148 @@ inline int b3GpuPgsContactSolver::sortConstraintByBatch2( b3Contact4* cs, int nu
}
{
- B3_PROFILE("reorder");
+ B3_PROFILE("reorder");
// reorder
-
- memcpy( &m_data->m_old[0], cs, sizeof(b3Contact4)*numConstraints);
- for(int i=0; i<numConstraints; i++)
+ memcpy(&m_data->m_old[0], cs, sizeof(b3Contact4) * numConstraints);
+
+ for (int i = 0; i < numConstraints; i++)
{
b3Assert(m_data->m_sortData[idxSrc[i]].m_value == idxSrc[i]);
int idx = m_data->m_sortData[idxSrc[i]].m_value;
cs[i] = m_data->m_old[idx];
}
}
-
+
#if defined(_DEBUG)
- // debugPrintf( "nBatches: %d\n", batchIdx );
- for(int i=0; i<numConstraints; i++)
- {
- b3Assert( cs[i].getBatchIdx() != -1 );
- }
+ // debugPrintf( "nBatches: %d\n", batchIdx );
+ for (int i = 0; i < numConstraints; i++)
+ {
+ b3Assert(cs[i].getBatchIdx() != -1);
+ }
#endif
-
return batchIdx;
}
-
b3AlignedObjectArray<int> bodyUsed;
b3AlignedObjectArray<int> curUsed;
-
-inline int b3GpuPgsContactSolver::sortConstraintByBatch3( b3Contact4* cs, int numConstraints, int simdWidth , int staticIdx, int numBodies, int* batchSizes)
+inline int b3GpuPgsContactSolver::sortConstraintByBatch3(b3Contact4* cs, int numConstraints, int simdWidth, int staticIdx, int numBodies, int* batchSizes)
{
-
B3_PROFILE("sortConstraintByBatch3");
-
+
static int maxSwaps = 0;
int numSwaps = 0;
- curUsed.resize(2*simdWidth);
+ curUsed.resize(2 * simdWidth);
static int maxNumConstraints = 0;
- if (maxNumConstraints<numConstraints)
+ if (maxNumConstraints < numConstraints)
{
maxNumConstraints = numConstraints;
//printf("maxNumConstraints = %d\n",maxNumConstraints );
}
- int numUsedArray = numBodies/32+1;
+ int numUsedArray = numBodies / 32 + 1;
bodyUsed.resize(numUsedArray);
- for (int q=0;q<numUsedArray;q++)
- bodyUsed[q]=0;
+ for (int q = 0; q < numUsedArray; q++)
+ bodyUsed[q] = 0;
-
int curBodyUsed = 0;
int numIter = 0;
-
+
m_data->m_sortData.resize(0);
m_data->m_idxBuffer.resize(0);
m_data->m_old.resize(0);
-
-
+
#if defined(_DEBUG)
- for(int i=0; i<numConstraints; i++)
+ for (int i = 0; i < numConstraints; i++)
cs[i].getBatchIdx() = -1;
#endif
-
+
int numValidConstraints = 0;
-// int unprocessedConstraintIndex = 0;
+ // int unprocessedConstraintIndex = 0;
int batchIdx = 0;
-
{
B3_PROFILE("cpu batch innerloop");
-
- while( numValidConstraints < numConstraints)
+
+ while (numValidConstraints < numConstraints)
{
numIter++;
int nCurrentBatch = 0;
batchSizes[batchIdx] = 0;
// clear flag
- for(int i=0; i<curBodyUsed; i++)
- bodyUsed[curUsed[i]/32] = 0;
+ for (int i = 0; i < curBodyUsed; i++)
+ bodyUsed[curUsed[i] / 32] = 0;
- curBodyUsed = 0;
+ curBodyUsed = 0;
- for(int i=numValidConstraints; i<numConstraints; i++)
+ for (int i = numValidConstraints; i < numConstraints; i++)
{
int idx = i;
- b3Assert( idx < numConstraints );
+ b3Assert(idx < numConstraints);
// check if it can go
int bodyAS = cs[idx].m_bodyAPtrAndSignBit;
int bodyBS = cs[idx].m_bodyBPtrAndSignBit;
int bodyA = abs(bodyAS);
int bodyB = abs(bodyBS);
- bool aIsStatic = (bodyAS<0) || bodyAS==staticIdx;
- bool bIsStatic = (bodyBS<0) || bodyBS==staticIdx;
+ bool aIsStatic = (bodyAS < 0) || bodyAS == staticIdx;
+ bool bIsStatic = (bodyBS < 0) || bodyBS == staticIdx;
int aUnavailable = 0;
int bUnavailable = 0;
if (!aIsStatic)
{
- aUnavailable = bodyUsed[ bodyA/32 ] & (1<<(bodyA&31));
+ aUnavailable = bodyUsed[bodyA / 32] & (1 << (bodyA & 31));
}
if (!aUnavailable)
- if (!bIsStatic)
- {
- bUnavailable = bodyUsed[ bodyB/32 ] & (1<<(bodyB&31));
- }
-
- if( aUnavailable==0 && bUnavailable==0 ) // ok
+ if (!bIsStatic)
+ {
+ bUnavailable = bodyUsed[bodyB / 32] & (1 << (bodyB & 31));
+ }
+
+ if (aUnavailable == 0 && bUnavailable == 0) // ok
{
if (!aIsStatic)
{
- bodyUsed[ bodyA/32 ] |= (1<<(bodyA&31));
- curUsed[curBodyUsed++]=bodyA;
+ bodyUsed[bodyA / 32] |= (1 << (bodyA & 31));
+ curUsed[curBodyUsed++] = bodyA;
}
if (!bIsStatic)
{
- bodyUsed[ bodyB/32 ] |= (1<<(bodyB&31));
- curUsed[curBodyUsed++]=bodyB;
+ bodyUsed[bodyB / 32] |= (1 << (bodyB & 31));
+ curUsed[curBodyUsed++] = bodyB;
}
cs[idx].getBatchIdx() = batchIdx;
- if (i!=numValidConstraints)
+ if (i != numValidConstraints)
{
- b3Swap(cs[i],cs[numValidConstraints]);
+ b3Swap(cs[i], cs[numValidConstraints]);
numSwaps++;
}
numValidConstraints++;
{
nCurrentBatch++;
- if( nCurrentBatch == simdWidth )
+ if (nCurrentBatch == simdWidth)
{
batchSizes[batchIdx] += simdWidth;
nCurrentBatch = 0;
- for(int i=0; i<curBodyUsed; i++)
- bodyUsed[curUsed[i]/32] = 0;
+ for (int i = 0; i < curBodyUsed; i++)
+ bodyUsed[curUsed[i] / 32] = 0;
curBodyUsed = 0;
}
}
}
}
- if (batchIdx>=B3_MAX_NUM_BATCHES)
+ if (batchIdx >= B3_MAX_NUM_BATCHES)
{
b3Error("batchIdx>=B3_MAX_NUM_BATCHES");
b3Assert(0);
@@ -1683,26 +1505,25 @@ inline int b3GpuPgsContactSolver::sortConstraintByBatch3( b3Contact4* cs, int nu
batchSizes[batchIdx] += nCurrentBatch;
- batchIdx ++;
-
+ batchIdx++;
}
}
-
+
#if defined(_DEBUG)
- // debugPrintf( "nBatches: %d\n", batchIdx );
- for(int i=0; i<numConstraints; i++)
- {
- b3Assert( cs[i].getBatchIdx() != -1 );
- }
+ // debugPrintf( "nBatches: %d\n", batchIdx );
+ for (int i = 0; i < numConstraints; i++)
+ {
+ b3Assert(cs[i].getBatchIdx() != -1);
+ }
#endif
- batchSizes[batchIdx] =0;
-
- if (maxSwaps<numSwaps)
+ batchSizes[batchIdx] = 0;
+
+ if (maxSwaps < numSwaps)
{
maxSwaps = numSwaps;
//printf("maxSwaps = %d\n", maxSwaps);
}
-
+
return batchIdx;
}
diff --git a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsContactSolver.h b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsContactSolver.h
index 98e2a5b8c4..6ab7502af3 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsContactSolver.h
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuPgsContactSolver.h
@@ -11,33 +11,27 @@
class b3GpuPgsContactSolver
{
protected:
-
int m_debugOutput;
- struct b3GpuBatchingPgsSolverInternalData* m_data;
+ struct b3GpuBatchingPgsSolverInternalData* m_data;
+
+ void batchContacts(b3OpenCLArray<b3Contact4>* contacts, int nContacts, b3OpenCLArray<unsigned int>* n, b3OpenCLArray<unsigned int>* offsets, int staticIdx);
- void batchContacts( b3OpenCLArray<b3Contact4>* contacts, int nContacts, b3OpenCLArray<unsigned int>* n, b3OpenCLArray<unsigned int>* 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);
-
+ 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<b3RigidBodyData>* bodyBuf, const b3OpenCLArray<b3InertiaData>* shapeBuf,
- b3OpenCLArray<b3GpuConstraint4>* constraint, void* additionalData, int n ,int maxNumBatches, int numIterations, const b3AlignedObjectArray<int>* batchSizes);//const b3OpenCLArray<int>* gpuBatchSizes);
+ void solveContactConstraintBatchSizes(const b3OpenCLArray<b3RigidBodyData>* bodyBuf, const b3OpenCLArray<b3InertiaData>* shapeBuf,
+ b3OpenCLArray<b3GpuConstraint4>* constraint, void* additionalData, int n, int maxNumBatches, int numIterations, const b3AlignedObjectArray<int>* batchSizes); //const b3OpenCLArray<int>* gpuBatchSizes);
- void solveContactConstraint( const b3OpenCLArray<b3RigidBodyData>* bodyBuf, const b3OpenCLArray<b3InertiaData>* shapeBuf,
- b3OpenCLArray<b3GpuConstraint4>* constraint, void* additionalData, int n ,int maxNumBatches, int numIterations, const b3AlignedObjectArray<int>* batchSizes);//const b3OpenCLArray<int>* gpuBatchSizes);
+ void solveContactConstraint(const b3OpenCLArray<b3RigidBodyData>* bodyBuf, const b3OpenCLArray<b3InertiaData>* shapeBuf,
+ b3OpenCLArray<b3GpuConstraint4>* constraint, void* additionalData, int n, int maxNumBatches, int numIterations, const b3AlignedObjectArray<int>* batchSizes); //const b3OpenCLArray<int>* gpuBatchSizes);
public:
-
- b3GpuPgsContactSolver(cl_context ctx,cl_device_id device, cl_command_queue q,int pairCapacity);
+ 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
-
+#endif //B3_GPU_BATCHING_PGS_SOLVER_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.cpp b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.cpp
index 783e443060..fef33ad1cd 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.cpp
@@ -47,7 +47,7 @@ bool gClearPairsOnGpu = true;
#define TEST_OTHER_GPU_SOLVER 1
#ifdef TEST_OTHER_GPU_SOLVER
#include "b3GpuJacobiContactSolver.h"
-#endif //TEST_OTHER_GPU_SOLVER
+#endif //TEST_OTHER_GPU_SOLVER
#include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h"
#include "Bullet3Collision/NarrowPhaseCollision/b3Contact4.h"
@@ -59,73 +59,68 @@ bool gClearPairsOnGpu = true;
#include "Bullet3Collision/NarrowPhaseCollision/b3Config.h"
#include "Bullet3OpenCL/Raycast/b3GpuRaycast.h"
-
#include "Bullet3Dynamics/shared/b3IntegrateTransforms.h"
#include "Bullet3OpenCL/RigidBody/b3GpuNarrowPhaseInternalData.h"
-b3GpuRigidBodyPipeline::b3GpuRigidBodyPipeline(cl_context ctx,cl_device_id device, cl_command_queue q,class b3GpuNarrowPhase* narrowphase, class b3GpuBroadphaseInterface* broadphaseSap , struct b3DynamicBvhBroadphase* broadphaseDbvt, const b3Config& config)
+b3GpuRigidBodyPipeline::b3GpuRigidBodyPipeline(cl_context ctx, cl_device_id device, cl_command_queue q, class b3GpuNarrowPhase* narrowphase, class b3GpuBroadphaseInterface* broadphaseSap, struct b3DynamicBvhBroadphase* broadphaseDbvt, const b3Config& config)
{
m_data = new b3GpuRigidBodyPipelineInternalData;
- m_data->m_constraintUid=0;
+ m_data->m_constraintUid = 0;
m_data->m_config = config;
m_data->m_context = ctx;
m_data->m_device = device;
m_data->m_queue = q;
- m_data->m_solver = new b3PgsJacobiSolver(true);//new b3PgsJacobiSolver(true);
- m_data->m_gpuSolver = new b3GpuPgsConstraintSolver(ctx,device,q,true);//new b3PgsJacobiSolver(true);
-
- m_data->m_allAabbsGPU = new b3OpenCLArray<b3SapAabb>(ctx,q,config.m_maxConvexBodies);
- m_data->m_overlappingPairsGPU = new b3OpenCLArray<b3BroadphasePair>(ctx,q,config.m_maxBroadphasePairs);
+ m_data->m_solver = new b3PgsJacobiSolver(true); //new b3PgsJacobiSolver(true);
+ m_data->m_gpuSolver = new b3GpuPgsConstraintSolver(ctx, device, q, true); //new b3PgsJacobiSolver(true);
- m_data->m_gpuConstraints = new b3OpenCLArray<b3GpuGenericConstraint>(ctx,q);
+ m_data->m_allAabbsGPU = new b3OpenCLArray<b3SapAabb>(ctx, q, config.m_maxConvexBodies);
+ m_data->m_overlappingPairsGPU = new b3OpenCLArray<b3BroadphasePair>(ctx, q, config.m_maxBroadphasePairs);
+
+ m_data->m_gpuConstraints = new b3OpenCLArray<b3GpuGenericConstraint>(ctx, q);
#ifdef TEST_OTHER_GPU_SOLVER
- m_data->m_solver3 = new b3GpuJacobiContactSolver(ctx,device,q,config.m_maxBroadphasePairs);
-#endif // TEST_OTHER_GPU_SOLVER
-
- m_data->m_solver2 = new b3GpuPgsContactSolver(ctx,device,q,config.m_maxBroadphasePairs);
+ m_data->m_solver3 = new b3GpuJacobiContactSolver(ctx, device, q, config.m_maxBroadphasePairs);
+#endif // TEST_OTHER_GPU_SOLVER
+
+ m_data->m_solver2 = new b3GpuPgsContactSolver(ctx, device, q, config.m_maxBroadphasePairs);
- m_data->m_raycaster = new b3GpuRaycast(ctx,device,q);
+ m_data->m_raycaster = new b3GpuRaycast(ctx, device, q);
-
m_data->m_broadphaseDbvt = broadphaseDbvt;
m_data->m_broadphaseSap = broadphaseSap;
m_data->m_narrowphase = narrowphase;
- m_data->m_gravity.setValue(0.f,-9.8f,0.f);
+ m_data->m_gravity.setValue(0.f, -9.8f, 0.f);
- cl_int errNum=0;
+ cl_int errNum = 0;
{
- cl_program prog = b3OpenCLUtils::compileCLProgramFromString(m_data->m_context,m_data->m_device,integrateKernelCL,&errNum,"",B3_RIGIDBODY_INTEGRATE_PATH);
- b3Assert(errNum==CL_SUCCESS);
- m_data->m_integrateTransformsKernel = b3OpenCLUtils::compileCLKernelFromString(m_data->m_context, m_data->m_device,integrateKernelCL, "integrateTransformsKernel",&errNum,prog);
- b3Assert(errNum==CL_SUCCESS);
+ cl_program prog = b3OpenCLUtils::compileCLProgramFromString(m_data->m_context, m_data->m_device, integrateKernelCL, &errNum, "", B3_RIGIDBODY_INTEGRATE_PATH);
+ b3Assert(errNum == CL_SUCCESS);
+ m_data->m_integrateTransformsKernel = b3OpenCLUtils::compileCLKernelFromString(m_data->m_context, m_data->m_device, integrateKernelCL, "integrateTransformsKernel", &errNum, prog);
+ b3Assert(errNum == CL_SUCCESS);
clReleaseProgram(prog);
}
{
- cl_program prog = b3OpenCLUtils::compileCLProgramFromString(m_data->m_context,m_data->m_device,updateAabbsKernelCL,&errNum,"",B3_RIGIDBODY_UPDATEAABB_PATH);
- b3Assert(errNum==CL_SUCCESS);
- m_data->m_updateAabbsKernel = b3OpenCLUtils::compileCLKernelFromString(m_data->m_context, m_data->m_device,updateAabbsKernelCL, "initializeGpuAabbsFull",&errNum,prog);
- b3Assert(errNum==CL_SUCCESS);
+ cl_program prog = b3OpenCLUtils::compileCLProgramFromString(m_data->m_context, m_data->m_device, updateAabbsKernelCL, &errNum, "", B3_RIGIDBODY_UPDATEAABB_PATH);
+ b3Assert(errNum == CL_SUCCESS);
+ m_data->m_updateAabbsKernel = b3OpenCLUtils::compileCLKernelFromString(m_data->m_context, m_data->m_device, updateAabbsKernelCL, "initializeGpuAabbsFull", &errNum, prog);
+ b3Assert(errNum == CL_SUCCESS);
-
- m_data->m_clearOverlappingPairsKernel = b3OpenCLUtils::compileCLKernelFromString(m_data->m_context, m_data->m_device,updateAabbsKernelCL, "clearOverlappingPairsKernel",&errNum,prog);
- b3Assert(errNum==CL_SUCCESS);
+ m_data->m_clearOverlappingPairsKernel = b3OpenCLUtils::compileCLKernelFromString(m_data->m_context, m_data->m_device, updateAabbsKernelCL, "clearOverlappingPairsKernel", &errNum, prog);
+ b3Assert(errNum == CL_SUCCESS);
clReleaseProgram(prog);
}
-
-
}
b3GpuRigidBodyPipeline::~b3GpuRigidBodyPipeline()
{
if (m_data->m_integrateTransformsKernel)
clReleaseKernel(m_data->m_integrateTransformsKernel);
-
+
if (m_data->m_updateAabbsKernel)
clReleaseKernel(m_data->m_updateAabbsKernel);
-
+
if (m_data->m_clearOverlappingPairsKernel)
clReleaseKernel(m_data->m_clearOverlappingPairsKernel);
delete m_data->m_raycaster;
@@ -136,15 +131,14 @@ b3GpuRigidBodyPipeline::~b3GpuRigidBodyPipeline()
#ifdef TEST_OTHER_GPU_SOLVER
delete m_data->m_solver3;
-#endif //TEST_OTHER_GPU_SOLVER
-
+#endif //TEST_OTHER_GPU_SOLVER
+
delete m_data->m_solver2;
-
-
+
delete m_data;
}
-void b3GpuRigidBodyPipeline::reset()
+void b3GpuRigidBodyPipeline::reset()
{
m_data->m_gpuConstraints->resize(0);
m_data->m_cpuConstraints.resize(0);
@@ -152,30 +146,28 @@ void b3GpuRigidBodyPipeline::reset()
m_data->m_allAabbsCPU.resize(0);
}
-void b3GpuRigidBodyPipeline::addConstraint(b3TypedConstraint* constraint)
+void b3GpuRigidBodyPipeline::addConstraint(b3TypedConstraint* constraint)
{
m_data->m_joints.push_back(constraint);
}
-void b3GpuRigidBodyPipeline::removeConstraint(b3TypedConstraint* constraint)
+void b3GpuRigidBodyPipeline::removeConstraint(b3TypedConstraint* constraint)
{
m_data->m_joints.remove(constraint);
}
-
-
-void b3GpuRigidBodyPipeline::removeConstraintByUid(int uid)
+void b3GpuRigidBodyPipeline::removeConstraintByUid(int uid)
{
m_data->m_gpuSolver->recomputeBatches();
//slow linear search
m_data->m_gpuConstraints->copyToHost(m_data->m_cpuConstraints);
//remove
- for (int i=0;i<m_data->m_cpuConstraints.size();i++)
+ for (int i = 0; i < m_data->m_cpuConstraints.size(); i++)
{
if (m_data->m_cpuConstraints[i].m_uid == uid)
{
//m_data->m_cpuConstraints.remove(m_data->m_cpuConstraints[i]);
- m_data->m_cpuConstraints.swap(i,m_data->m_cpuConstraints.size()-1);
+ m_data->m_cpuConstraints.swap(i, m_data->m_cpuConstraints.size() - 1);
m_data->m_cpuConstraints.pop_back();
break;
@@ -185,13 +177,13 @@ void b3GpuRigidBodyPipeline::removeConstraintByUid(int uid)
if (m_data->m_cpuConstraints.size())
{
m_data->m_gpuConstraints->copyFromHost(m_data->m_cpuConstraints);
- } else
+ }
+ else
{
m_data->m_gpuConstraints->resize(0);
}
-
}
-int b3GpuRigidBodyPipeline::createPoint2PointConstraint(int bodyA, int bodyB, const float* pivotInA, const float* pivotInB,float breakingThreshold)
+int b3GpuRigidBodyPipeline::createPoint2PointConstraint(int bodyA, int bodyB, const float* pivotInA, const float* pivotInB, float breakingThreshold)
{
m_data->m_gpuSolver->recomputeBatches();
b3GpuGenericConstraint c;
@@ -200,14 +192,14 @@ int b3GpuRigidBodyPipeline::createPoint2PointConstraint(int bodyA, int bodyB, co
c.m_flags = B3_CONSTRAINT_FLAG_ENABLED;
c.m_rbA = bodyA;
c.m_rbB = bodyB;
- c.m_pivotInA.setValue(pivotInA[0],pivotInA[1],pivotInA[2]);
- c.m_pivotInB.setValue(pivotInB[0],pivotInB[1],pivotInB[2]);
+ c.m_pivotInA.setValue(pivotInA[0], pivotInA[1], pivotInA[2]);
+ c.m_pivotInB.setValue(pivotInB[0], pivotInB[1], pivotInB[2]);
c.m_breakingImpulseThreshold = breakingThreshold;
c.m_constraintType = B3_GPU_POINT2POINT_CONSTRAINT_TYPE;
m_data->m_cpuConstraints.push_back(c);
return c.m_uid;
}
-int b3GpuRigidBodyPipeline::createFixedConstraint(int bodyA, int bodyB, const float* pivotInA, const float* pivotInB, const float* relTargetAB,float breakingThreshold)
+int b3GpuRigidBodyPipeline::createFixedConstraint(int bodyA, int bodyB, const float* pivotInA, const float* pivotInB, const float* relTargetAB, float breakingThreshold)
{
m_data->m_gpuSolver->recomputeBatches();
b3GpuGenericConstraint c;
@@ -216,9 +208,9 @@ int b3GpuRigidBodyPipeline::createFixedConstraint(int bodyA, int bodyB, const fl
c.m_flags = B3_CONSTRAINT_FLAG_ENABLED;
c.m_rbA = bodyA;
c.m_rbB = bodyB;
- c.m_pivotInA.setValue(pivotInA[0],pivotInA[1],pivotInA[2]);
- c.m_pivotInB.setValue(pivotInB[0],pivotInB[1],pivotInB[2]);
- c.m_relTargetAB.setValue(relTargetAB[0],relTargetAB[1],relTargetAB[2],relTargetAB[3]);
+ c.m_pivotInA.setValue(pivotInA[0], pivotInA[1], pivotInA[2]);
+ c.m_pivotInB.setValue(pivotInB[0], pivotInB[1], pivotInB[2]);
+ c.m_relTargetAB.setValue(relTargetAB[0], relTargetAB[1], relTargetAB[2], relTargetAB[3]);
c.m_breakingImpulseThreshold = breakingThreshold;
c.m_constraintType = B3_GPU_FIXED_CONSTRAINT_TYPE;
@@ -226,31 +218,28 @@ int b3GpuRigidBodyPipeline::createFixedConstraint(int bodyA, int bodyB, const fl
return c.m_uid;
}
-
-void b3GpuRigidBodyPipeline::stepSimulation(float deltaTime)
+void b3GpuRigidBodyPipeline::stepSimulation(float deltaTime)
{
-
//update worldspace AABBs from local AABB/worldtransform
{
B3_PROFILE("setupGpuAabbs");
setupGpuAabbsFull();
}
- int numPairs =0;
+ int numPairs = 0;
//compute overlapping pairs
{
-
if (gUseDbvt)
{
{
B3_PROFILE("setAabb");
m_data->m_allAabbsGPU->copyToHost(m_data->m_allAabbsCPU);
- for (int i=0;i<m_data->m_allAabbsCPU.size();i++)
+ for (int i = 0; i < m_data->m_allAabbsCPU.size(); i++)
{
- b3Vector3 aabbMin=b3MakeVector3(m_data->m_allAabbsCPU[i].m_min[0],m_data->m_allAabbsCPU[i].m_min[1],m_data->m_allAabbsCPU[i].m_min[2]);
- b3Vector3 aabbMax=b3MakeVector3(m_data->m_allAabbsCPU[i].m_max[0],m_data->m_allAabbsCPU[i].m_max[1],m_data->m_allAabbsCPU[i].m_max[2]);
- m_data->m_broadphaseDbvt->setAabb(i,aabbMin,aabbMax,0);
+ b3Vector3 aabbMin = b3MakeVector3(m_data->m_allAabbsCPU[i].m_min[0], m_data->m_allAabbsCPU[i].m_min[1], m_data->m_allAabbsCPU[i].m_min[2]);
+ b3Vector3 aabbMax = b3MakeVector3(m_data->m_allAabbsCPU[i].m_max[0], m_data->m_allAabbsCPU[i].m_max[1], m_data->m_allAabbsCPU[i].m_max[2]);
+ m_data->m_broadphaseDbvt->setAabb(i, aabbMin, aabbMax, 0);
}
}
@@ -259,13 +248,14 @@ void b3GpuRigidBodyPipeline::stepSimulation(float deltaTime)
m_data->m_broadphaseDbvt->calculateOverlappingPairs();
}
numPairs = m_data->m_broadphaseDbvt->getOverlappingPairCache()->getNumOverlappingPairs();
-
- } else
+ }
+ else
{
if (gUseCalculateOverlappingPairsHost)
{
m_data->m_broadphaseSap->calculateOverlappingPairsHost(m_data->m_config.m_maxBroadphasePairs);
- } else
+ }
+ else
{
m_data->m_broadphaseSap->calculateOverlappingPairs(m_data->m_config.m_maxBroadphasePairs);
}
@@ -274,24 +264,24 @@ void b3GpuRigidBodyPipeline::stepSimulation(float deltaTime)
}
//compute contact points
-// printf("numPairs=%d\n",numPairs);
-
- int numContacts = 0;
+ // printf("numPairs=%d\n",numPairs);
+ int numContacts = 0;
int numBodies = m_data->m_narrowphase->getNumRigidBodies();
if (numPairs)
{
- cl_mem pairs =0;
- cl_mem aabbsWS =0;
+ cl_mem pairs = 0;
+ cl_mem aabbsWS = 0;
if (gUseDbvt)
{
B3_PROFILE("m_overlappingPairsGPU->copyFromHost");
m_data->m_overlappingPairsGPU->copyFromHost(m_data->m_broadphaseDbvt->getOverlappingPairCache()->getOverlappingPairArray());
pairs = m_data->m_overlappingPairsGPU->getBufferCL();
aabbsWS = m_data->m_allAabbsGPU->getBufferCL();
- } else
+ }
+ else
{
pairs = m_data->m_broadphaseSap->getOverlappingPairBuffer();
aabbsWS = m_data->m_broadphaseSap->getAabbBufferWS();
@@ -302,31 +292,27 @@ void b3GpuRigidBodyPipeline::stepSimulation(float deltaTime)
//mark the contacts for each pair as 'unused'
if (numPairs)
{
- b3OpenCLArray<b3BroadphasePair> gpuPairs(this->m_data->m_context,m_data->m_queue);
- gpuPairs.setFromOpenCLBuffer(pairs,numPairs);
+ b3OpenCLArray<b3BroadphasePair> gpuPairs(this->m_data->m_context, m_data->m_queue);
+ gpuPairs.setFromOpenCLBuffer(pairs, numPairs);
if (gClearPairsOnGpu)
{
-
-
//b3AlignedObjectArray<b3BroadphasePair> hostPairs;//just for debugging
//gpuPairs.copyToHost(hostPairs);
- b3LauncherCL launcher(m_data->m_queue,m_data->m_clearOverlappingPairsKernel,"clearOverlappingPairsKernel");
+ b3LauncherCL launcher(m_data->m_queue, m_data->m_clearOverlappingPairsKernel, "clearOverlappingPairsKernel");
launcher.setBuffer(pairs);
launcher.setConst(numPairs);
launcher.launch1D(numPairs);
-
//gpuPairs.copyToHost(hostPairs);
-
-
- } else
+ }
+ else
{
b3AlignedObjectArray<b3BroadphasePair> hostPairs;
gpuPairs.copyToHost(hostPairs);
- for (int i=0;i<hostPairs.size();i++)
+ for (int i = 0; i < hostPairs.size(); i++)
{
hostPairs[i].z = 0xffffffff;
}
@@ -335,7 +321,7 @@ void b3GpuRigidBodyPipeline::stepSimulation(float deltaTime)
}
}
- m_data->m_narrowphase->computeContacts(pairs,numPairs,aabbsWS,numBodies);
+ m_data->m_narrowphase->computeContacts(pairs, numPairs, aabbsWS, numBodies);
numContacts = m_data->m_narrowphase->getNumContactsGpu();
if (gUseDbvt)
@@ -347,56 +333,54 @@ void b3GpuRigidBodyPipeline::stepSimulation(float deltaTime)
if (gDumpContactStats && numContacts)
{
m_data->m_narrowphase->getContactsGpu();
-
+
printf("numContacts = %d\n", numContacts);
- int totalPoints = 0;
+ int totalPoints = 0;
const b3Contact4* contacts = m_data->m_narrowphase->getContactsCPU();
- for (int i=0;i<numContacts;i++)
+ for (int i = 0; i < numContacts; i++)
{
totalPoints += contacts->getNPoints();
}
- printf("totalPoints=%d\n",totalPoints);
-
+ printf("totalPoints=%d\n", totalPoints);
}
}
-
//convert contact points to contact constraints
-
+
//solve constraints
- b3OpenCLArray<b3RigidBodyData> gpuBodies(m_data->m_context,m_data->m_queue,0,true);
- gpuBodies.setFromOpenCLBuffer(m_data->m_narrowphase->getBodiesGpu(),m_data->m_narrowphase->getNumRigidBodies());
- b3OpenCLArray<b3InertiaData> gpuInertias(m_data->m_context,m_data->m_queue,0,true);
- gpuInertias.setFromOpenCLBuffer(m_data->m_narrowphase->getBodyInertiasGpu(),m_data->m_narrowphase->getNumRigidBodies());
- b3OpenCLArray<b3Contact4> gpuContacts(m_data->m_context,m_data->m_queue,0,true);
- gpuContacts.setFromOpenCLBuffer(m_data->m_narrowphase->getContactsGpu(),m_data->m_narrowphase->getNumContactsGpu());
+ b3OpenCLArray<b3RigidBodyData> gpuBodies(m_data->m_context, m_data->m_queue, 0, true);
+ gpuBodies.setFromOpenCLBuffer(m_data->m_narrowphase->getBodiesGpu(), m_data->m_narrowphase->getNumRigidBodies());
+ b3OpenCLArray<b3InertiaData> gpuInertias(m_data->m_context, m_data->m_queue, 0, true);
+ gpuInertias.setFromOpenCLBuffer(m_data->m_narrowphase->getBodyInertiasGpu(), m_data->m_narrowphase->getNumRigidBodies());
+ b3OpenCLArray<b3Contact4> gpuContacts(m_data->m_context, m_data->m_queue, 0, true);
+ gpuContacts.setFromOpenCLBuffer(m_data->m_narrowphase->getContactsGpu(), m_data->m_narrowphase->getNumContactsGpu());
- int numJoints = m_data->m_joints.size() ? m_data->m_joints.size() : m_data->m_cpuConstraints.size();
+ int numJoints = m_data->m_joints.size() ? m_data->m_joints.size() : m_data->m_cpuConstraints.size();
if (useBullet2CpuSolver && numJoints)
{
-
- // b3AlignedObjectArray<b3Contact4> hostContacts;
+ // b3AlignedObjectArray<b3Contact4> hostContacts;
//gpuContacts.copyToHost(hostContacts);
{
- bool useGpu = m_data->m_joints.size()==0;
+ bool useGpu = m_data->m_joints.size() == 0;
-// b3Contact4* contacts = numContacts? &hostContacts[0]: 0;
+ // b3Contact4* contacts = numContacts? &hostContacts[0]: 0;
//m_data->m_solver->solveContacts(m_data->m_narrowphase->getNumBodiesGpu(),&hostBodies[0],&hostInertias[0],numContacts,contacts,numJoints, joints);
if (useGpu)
{
- m_data->m_gpuSolver->solveJoints(m_data->m_narrowphase->getNumRigidBodies(),&gpuBodies,&gpuInertias,numJoints, m_data->m_gpuConstraints);
- } else
+ m_data->m_gpuSolver->solveJoints(m_data->m_narrowphase->getNumRigidBodies(), &gpuBodies, &gpuInertias, numJoints, m_data->m_gpuConstraints);
+ }
+ else
{
b3AlignedObjectArray<b3RigidBodyData> hostBodies;
gpuBodies.copyToHost(hostBodies);
b3AlignedObjectArray<b3InertiaData> hostInertias;
gpuInertias.copyToHost(hostInertias);
- b3TypedConstraint** joints = numJoints? &m_data->m_joints[0] : 0;
- m_data->m_solver->solveContacts(m_data->m_narrowphase->getNumRigidBodies(),&hostBodies[0],&hostInertias[0],0,0,numJoints, joints);
+ b3TypedConstraint** joints = numJoints ? &m_data->m_joints[0] : 0;
+ m_data->m_solver->solveContacts(m_data->m_narrowphase->getNumRigidBodies(), &hostBodies[0], &hostInertias[0], 0, 0, numJoints, joints);
gpuBodies.copyFromHost(hostBodies);
}
}
@@ -404,22 +388,20 @@ void b3GpuRigidBodyPipeline::stepSimulation(float deltaTime)
if (numContacts)
{
-
#ifdef TEST_OTHER_GPU_SOLVER
-
+
if (gUseJacobi)
{
bool useGpu = true;
if (useGpu)
{
-
bool forceHost = false;
if (forceHost)
{
b3AlignedObjectArray<b3RigidBodyData> hostBodies;
b3AlignedObjectArray<b3InertiaData> hostInertias;
b3AlignedObjectArray<b3Contact4> hostContacts;
-
+
{
B3_PROFILE("copyToHost");
gpuBodies.copyToHost(hostBodies);
@@ -429,25 +411,24 @@ void b3GpuRigidBodyPipeline::stepSimulation(float deltaTime)
{
b3JacobiSolverInfo solverInfo;
- m_data->m_solver3->solveGroupHost(&hostBodies[0], &hostInertias[0], hostBodies.size(),&hostContacts[0],hostContacts.size(),solverInfo);
-
-
+ m_data->m_solver3->solveGroupHost(&hostBodies[0], &hostInertias[0], hostBodies.size(), &hostContacts[0], hostContacts.size(), solverInfo);
}
{
B3_PROFILE("copyFromHost");
gpuBodies.copyFromHost(hostBodies);
}
- } else
-
+ }
+ else
{
int static0Index = m_data->m_narrowphase->getStatic0Index();
b3JacobiSolverInfo solverInfo;
//m_data->m_solver3->solveContacts( >solveGroup(&gpuBodies, &gpuInertias, &gpuContacts,solverInfo);
//m_data->m_solver3->solveContacts(m_data->m_narrowphase->getNumBodiesGpu(),&hostBodies[0],&hostInertias[0],numContacts,&hostContacts[0]);
- m_data->m_solver3->solveContacts(numBodies, gpuBodies.getBufferCL(),gpuInertias.getBufferCL(),numContacts, gpuContacts.getBufferCL(),m_data->m_config, static0Index);
+ m_data->m_solver3->solveContacts(numBodies, gpuBodies.getBufferCL(), gpuInertias.getBufferCL(), numContacts, gpuContacts.getBufferCL(), m_data->m_config, static0Index);
}
- } else
+ }
+ else
{
b3AlignedObjectArray<b3RigidBodyData> hostBodies;
gpuBodies.copyToHost(hostBodies);
@@ -460,17 +441,15 @@ void b3GpuRigidBodyPipeline::stepSimulation(float deltaTime)
}
gpuBodies.copyFromHost(hostBodies);
}
-
- } else
-#endif //TEST_OTHER_GPU_SOLVER
+ }
+ else
+#endif //TEST_OTHER_GPU_SOLVER
{
-
int static0Index = m_data->m_narrowphase->getStatic0Index();
- m_data->m_solver2->solveContacts(numBodies, gpuBodies.getBufferCL(),gpuInertias.getBufferCL(),numContacts, gpuContacts.getBufferCL(),m_data->m_config, static0Index);
-
+ m_data->m_solver2->solveContacts(numBodies, gpuBodies.getBufferCL(), gpuInertias.getBufferCL(), numContacts, gpuContacts.getBufferCL(), m_data->m_config, static0Index);
+
//m_data->m_solver4->solveContacts(m_data->m_narrowphase->getNumBodiesGpu(), gpuBodies.getBufferCL(), gpuInertias.getBufferCL(), numContacts, gpuContacts.getBufferCL());
-
-
+
/*m_data->m_solver3->solveContactConstraintHost(
(b3OpenCLArray<RigidBodyBase::Body>*)&gpuBodies,
(b3OpenCLArray<RigidBodyBase::Inertia>*)&gpuInertias,
@@ -481,11 +460,9 @@ void b3GpuRigidBodyPipeline::stepSimulation(float deltaTime)
}
integrate(deltaTime);
-
}
-
-void b3GpuRigidBodyPipeline::integrate(float timeStep)
+void b3GpuRigidBodyPipeline::integrate(float timeStep)
{
//integrate
int numBodies = m_data->m_narrowphase->getNumRigidBodies();
@@ -493,24 +470,25 @@ void b3GpuRigidBodyPipeline::integrate(float timeStep)
if (gIntegrateOnCpu)
{
- if(numBodies)
+ if (numBodies)
{
- b3GpuNarrowPhaseInternalData* npData = m_data->m_narrowphase->getInternalData();
+ b3GpuNarrowPhaseInternalData* npData = m_data->m_narrowphase->getInternalData();
npData->m_bodyBufferGPU->copyToHost(*npData->m_bodyBufferCPU);
b3RigidBodyData_t* bodies = &npData->m_bodyBufferCPU->at(0);
- for (int nodeID=0;nodeID<numBodies;nodeID++)
+ for (int nodeID = 0; nodeID < numBodies; nodeID++)
{
- integrateSingleTransform( bodies,nodeID, timeStep, angularDamp, m_data->m_gravity);
+ integrateSingleTransform(bodies, nodeID, timeStep, angularDamp, m_data->m_gravity);
}
npData->m_bodyBufferGPU->copyFromHost(*npData->m_bodyBufferCPU);
}
- } else
+ }
+ else
{
- b3LauncherCL launcher(m_data->m_queue,m_data->m_integrateTransformsKernel,"m_integrateTransformsKernel");
+ b3LauncherCL launcher(m_data->m_queue, m_data->m_integrateTransformsKernel, "m_integrateTransformsKernel");
launcher.setBuffer(m_data->m_narrowphase->getBodiesGpu());
-
+
launcher.setConst(numBodies);
launcher.setConst(timeStep);
launcher.setConst(angularDamp);
@@ -519,12 +497,9 @@ void b3GpuRigidBodyPipeline::integrate(float timeStep)
}
}
-
-
-
-void b3GpuRigidBodyPipeline::setupGpuAabbsFull()
+void b3GpuRigidBodyPipeline::setupGpuAabbsFull()
{
- cl_int ciErrNum=0;
+ cl_int ciErrNum = 0;
int numBodies = m_data->m_narrowphase->getNumRigidBodies();
if (!numBodies)
@@ -532,34 +507,35 @@ void b3GpuRigidBodyPipeline::setupGpuAabbsFull()
if (gCalcWorldSpaceAabbOnCpu)
{
-
if (numBodies)
{
if (gUseDbvt)
{
m_data->m_allAabbsCPU.resize(numBodies);
m_data->m_narrowphase->readbackAllBodiesToCpu();
- for (int i=0;i<numBodies;i++)
+ for (int i = 0; i < numBodies; i++)
{
- b3ComputeWorldAabb( i, m_data->m_narrowphase->getBodiesCpu(), m_data->m_narrowphase->getCollidablesCpu(), m_data->m_narrowphase->getLocalSpaceAabbsCpu(),&m_data->m_allAabbsCPU[0]);
+ b3ComputeWorldAabb(i, m_data->m_narrowphase->getBodiesCpu(), m_data->m_narrowphase->getCollidablesCpu(), m_data->m_narrowphase->getLocalSpaceAabbsCpu(), &m_data->m_allAabbsCPU[0]);
}
m_data->m_allAabbsGPU->copyFromHost(m_data->m_allAabbsCPU);
- } else
+ }
+ else
{
m_data->m_broadphaseSap->getAllAabbsCPU().resize(numBodies);
m_data->m_narrowphase->readbackAllBodiesToCpu();
- for (int i=0;i<numBodies;i++)
+ for (int i = 0; i < numBodies; i++)
{
- b3ComputeWorldAabb( i, m_data->m_narrowphase->getBodiesCpu(), m_data->m_narrowphase->getCollidablesCpu(), m_data->m_narrowphase->getLocalSpaceAabbsCpu(),&m_data->m_broadphaseSap->getAllAabbsCPU()[0]);
+ b3ComputeWorldAabb(i, m_data->m_narrowphase->getBodiesCpu(), m_data->m_narrowphase->getCollidablesCpu(), m_data->m_narrowphase->getLocalSpaceAabbsCpu(), &m_data->m_broadphaseSap->getAllAabbsCPU()[0]);
}
m_data->m_broadphaseSap->getAllAabbsGPU().copyFromHost(m_data->m_broadphaseSap->getAllAabbsCPU());
//m_data->m_broadphaseSap->writeAabbsToGpu();
}
}
- } else
+ }
+ else
{
//__kernel void initializeGpuAabbsFull( const int numNodes, __global Body* gBodies,__global Collidable* collidables, __global b3AABBCL* plocalShapeAABB, __global b3AABBCL* pAABB)
- b3LauncherCL launcher(m_data->m_queue,m_data->m_updateAabbsKernel,"m_updateAabbsKernel");
+ b3LauncherCL launcher(m_data->m_queue, m_data->m_updateAabbsKernel, "m_updateAabbsKernel");
launcher.setConst(numBodies);
cl_mem bodies = m_data->m_narrowphase->getBodiesGpu();
launcher.setBuffer(bodies);
@@ -568,17 +544,18 @@ void b3GpuRigidBodyPipeline::setupGpuAabbsFull()
cl_mem localAabbs = m_data->m_narrowphase->getAabbLocalSpaceBufferGpu();
launcher.setBuffer(localAabbs);
- cl_mem worldAabbs =0;
+ cl_mem worldAabbs = 0;
if (gUseDbvt)
{
worldAabbs = m_data->m_allAabbsGPU->getBufferCL();
- } else
+ }
+ else
{
worldAabbs = m_data->m_broadphaseSap->getAabbBufferWS();
}
launcher.setBuffer(worldAabbs);
launcher.launch1D(numBodies);
-
+
oclCHECKERROR(ciErrNum, CL_SUCCESS);
}
@@ -595,78 +572,68 @@ void b3GpuRigidBodyPipeline::setupGpuAabbsFull()
};
*/
-
-
-
-
-
}
-
-
-cl_mem b3GpuRigidBodyPipeline::getBodyBuffer()
+cl_mem b3GpuRigidBodyPipeline::getBodyBuffer()
{
return m_data->m_narrowphase->getBodiesGpu();
}
-int b3GpuRigidBodyPipeline::getNumBodies() const
+int b3GpuRigidBodyPipeline::getNumBodies() const
{
return m_data->m_narrowphase->getNumRigidBodies();
}
-void b3GpuRigidBodyPipeline::setGravity(const float* grav)
+void b3GpuRigidBodyPipeline::setGravity(const float* grav)
{
- m_data->m_gravity.setValue(grav[0],grav[1],grav[2]);
+ m_data->m_gravity.setValue(grav[0], grav[1], grav[2]);
}
-void b3GpuRigidBodyPipeline::copyConstraintsToHost()
+void b3GpuRigidBodyPipeline::copyConstraintsToHost()
{
m_data->m_gpuConstraints->copyToHost(m_data->m_cpuConstraints);
}
-void b3GpuRigidBodyPipeline::writeAllInstancesToGpu()
+void b3GpuRigidBodyPipeline::writeAllInstancesToGpu()
{
m_data->m_allAabbsGPU->copyFromHost(m_data->m_allAabbsCPU);
m_data->m_gpuConstraints->copyFromHost(m_data->m_cpuConstraints);
}
-
-int b3GpuRigidBodyPipeline::registerPhysicsInstance(float mass, const float* position, const float* orientation, int collidableIndex, int userIndex, bool writeInstanceToGpu)
+int b3GpuRigidBodyPipeline::registerPhysicsInstance(float mass, const float* position, const float* orientation, int collidableIndex, int userIndex, bool writeInstanceToGpu)
{
-
- b3Vector3 aabbMin=b3MakeVector3(0,0,0),aabbMax=b3MakeVector3(0,0,0);
+ b3Vector3 aabbMin = b3MakeVector3(0, 0, 0), aabbMax = b3MakeVector3(0, 0, 0);
-
- if (collidableIndex>=0)
+ if (collidableIndex >= 0)
{
b3SapAabb localAabb = m_data->m_narrowphase->getLocalSpaceAabb(collidableIndex);
- b3Vector3 localAabbMin=b3MakeVector3(localAabb.m_min[0],localAabb.m_min[1],localAabb.m_min[2]);
- b3Vector3 localAabbMax=b3MakeVector3(localAabb.m_max[0],localAabb.m_max[1],localAabb.m_max[2]);
-
+ b3Vector3 localAabbMin = b3MakeVector3(localAabb.m_min[0], localAabb.m_min[1], localAabb.m_min[2]);
+ b3Vector3 localAabbMax = b3MakeVector3(localAabb.m_max[0], localAabb.m_max[1], localAabb.m_max[2]);
+
b3Scalar margin = 0.01f;
b3Transform t;
t.setIdentity();
- t.setOrigin(b3MakeVector3(position[0],position[1],position[2]));
- t.setRotation(b3Quaternion(orientation[0],orientation[1],orientation[2],orientation[3]));
- b3TransformAabb(localAabbMin,localAabbMax, margin,t,aabbMin,aabbMax);
- } else
+ t.setOrigin(b3MakeVector3(position[0], position[1], position[2]));
+ t.setRotation(b3Quaternion(orientation[0], orientation[1], orientation[2], orientation[3]));
+ b3TransformAabb(localAabbMin, localAabbMax, margin, t, aabbMin, aabbMax);
+ }
+ else
{
b3Error("registerPhysicsInstance using invalid collidableIndex\n");
return -1;
}
-
-
+
bool writeToGpu = false;
int bodyIndex = m_data->m_narrowphase->getNumRigidBodies();
- bodyIndex = m_data->m_narrowphase->registerRigidBody(collidableIndex,mass,position,orientation,&aabbMin.getX(),&aabbMax.getX(),writeToGpu);
+ bodyIndex = m_data->m_narrowphase->registerRigidBody(collidableIndex, mass, position, orientation, &aabbMin.getX(), &aabbMax.getX(), writeToGpu);
- if (bodyIndex>=0)
+ if (bodyIndex >= 0)
{
if (gUseDbvt)
{
- m_data->m_broadphaseDbvt->createProxy(aabbMin,aabbMax,bodyIndex,0,1,1);
+ m_data->m_broadphaseDbvt->createProxy(aabbMin, aabbMax, bodyIndex, 0, 1, 1);
b3SapAabb aabb;
- for (int i=0;i<3;i++)
+ for (int i = 0; i < 3; i++)
{
aabb.m_min[i] = aabbMin[i];
aabb.m_max[i] = aabbMax[i];
@@ -677,14 +644,16 @@ int b3GpuRigidBodyPipeline::registerPhysicsInstance(float mass, const float* po
{
m_data->m_allAabbsGPU->copyFromHost(m_data->m_allAabbsCPU);
}
- } else
+ }
+ else
{
if (mass)
{
- m_data->m_broadphaseSap->createProxy(aabbMin,aabbMax,bodyIndex,1,1);//m_dispatcher);
- } else
+ m_data->m_broadphaseSap->createProxy(aabbMin, aabbMax, bodyIndex, 1, 1); //m_dispatcher);
+ }
+ else
{
- m_data->m_broadphaseSap->createLargeProxy(aabbMin,aabbMax,bodyIndex,1,1);//m_dispatcher);
+ m_data->m_broadphaseSap->createLargeProxy(aabbMin, aabbMax, bodyIndex, 1, 1); //m_dispatcher);
}
}
}
@@ -699,10 +668,10 @@ int b3GpuRigidBodyPipeline::registerPhysicsInstance(float mass, const float* po
return bodyIndex;
}
-void b3GpuRigidBodyPipeline::castRays(const b3AlignedObjectArray<b3RayInfo>& rays, b3AlignedObjectArray<b3RayHit>& hitResults)
+void b3GpuRigidBodyPipeline::castRays(const b3AlignedObjectArray<b3RayInfo>& rays, b3AlignedObjectArray<b3RayHit>& hitResults)
{
- this->m_data->m_raycaster->castRays(rays,hitResults,
- getNumBodies(),this->m_data->m_narrowphase->getBodiesCpu(),
- m_data->m_narrowphase->getNumCollidablesGpu(), m_data->m_narrowphase->getCollidablesCpu(),
- m_data->m_narrowphase->getInternalData(), m_data->m_broadphaseSap);
+ this->m_data->m_raycaster->castRays(rays, hitResults,
+ getNumBodies(), this->m_data->m_narrowphase->getBodiesCpu(),
+ m_data->m_narrowphase->getNumCollidablesGpu(), m_data->m_narrowphase->getCollidablesCpu(),
+ m_data->m_narrowphase->getInternalData(), m_data->m_broadphaseSap);
}
diff --git a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.h b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.h
index b4eac6841a..0e5c6fec12 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.h
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipeline.h
@@ -25,50 +25,46 @@ subject to the following restrictions:
class b3GpuRigidBodyPipeline
{
protected:
- struct b3GpuRigidBodyPipelineInternalData* m_data;
+ 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);
+ 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();
+ void stepSimulation(float deltaTime);
+ void integrate(float timeStep);
+ void setupGpuAabbsFull();
- int registerConvexPolyhedron(class b3ConvexUtility* convex);
+ 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<b3Vector3>* vertices, b3AlignedObjectArray<int>* indices, const float* scaling);
//int registerCompoundShape(b3AlignedObjectArray<b3GpuChildShape>* childShapes);
-
- int registerPhysicsInstance(float mass, const float* position, const float* orientation, int collisionShapeIndex, int userData, bool writeInstanceToGpu);
+ 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 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 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<b3RayInfo>& rays, b3AlignedObjectArray<b3RayHit>& hitResults);
+ void addConstraint(class b3TypedConstraint* constraint);
+ void removeConstraint(b3TypedConstraint* constraint);
- cl_mem getBodyBuffer();
+ void castRays(const b3AlignedObjectArray<b3RayInfo>& rays, b3AlignedObjectArray<b3RayHit>& hitResults);
- int getNumBodies() const;
+ cl_mem getBodyBuffer();
+ int getNumBodies() const;
};
-#endif //B3_GPU_RIGIDBODY_PIPELINE_H \ No newline at end of file
+#endif //B3_GPU_RIGIDBODY_PIPELINE_H \ No newline at end of file
diff --git a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipelineInternalData.h b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipelineInternalData.h
index 5ac92f97d6..e0a26fda17 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipelineInternalData.h
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuRigidBodyPipelineInternalData.h
@@ -22,52 +22,47 @@ subject to the following restrictions:
#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_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;
- 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<b3SapAabb>* m_allAabbsGPU;
- b3AlignedObjectArray<b3SapAabb> m_allAabbsCPU;
- b3OpenCLArray<b3BroadphasePair>* m_overlappingPairsGPU;
+ b3OpenCLArray<b3SapAabb>* m_allAabbsGPU;
+ b3AlignedObjectArray<b3SapAabb> m_allAabbsCPU;
+ b3OpenCLArray<b3BroadphasePair>* m_overlappingPairsGPU;
b3OpenCLArray<b3GpuGenericConstraint>* m_gpuConstraints;
b3AlignedObjectArray<b3GpuGenericConstraint> m_cpuConstraints;
b3AlignedObjectArray<b3TypedConstraint*> m_joints;
- int m_constraintUid;
- class b3GpuNarrowPhase* m_narrowphase;
- b3Vector3 m_gravity;
+ int m_constraintUid;
+ class b3GpuNarrowPhase* m_narrowphase;
+ b3Vector3 m_gravity;
- b3Config m_config;
+ b3Config m_config;
};
-#endif //B3_GPU_RIGIDBODY_PIPELINE_INTERNAL_DATA_H
-
+#endif //B3_GPU_RIGIDBODY_PIPELINE_INTERNAL_DATA_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuSolverBody.h b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuSolverBody.h
index f2a61801ac..db815d9b31 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuSolverBody.h
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuSolverBody.h
@@ -13,11 +13,9 @@ subject to the following restrictions:
*/
//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"
@@ -27,29 +25,27 @@ subject to the following restrictions:
///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 //
-
-
+#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_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;
+ // 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];
@@ -65,44 +61,41 @@ B3_ATTRIBUTE_ALIGNED16 (struct) b3GpuSolverBody
return m_worldTransform;
}
*/
- B3_FORCE_INLINE void getVelocityInLocalPointObsolete(const b3Vector3& rel_pos, b3Vector3& velocity ) const
+ 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);
+ velocity = m_linearVelocity + m_deltaLinearVelocity + (m_angularVelocity + m_deltaAngularVelocity).cross(rel_pos);
else
- velocity.setValue(0,0,0);
+ velocity.setValue(0, 0, 0);
}
- B3_FORCE_INLINE void getAngularVelocity(b3Vector3& angVel) const
+ B3_FORCE_INLINE void getAngularVelocity(b3Vector3 & angVel) const
{
if (m_originalBody)
- angVel =m_angularVelocity+m_deltaAngularVelocity;
+ angVel = m_angularVelocity + m_deltaAngularVelocity;
else
- angVel.setValue(0,0,0);
+ 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)
+ 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);
+ 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)
+ 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);
+ m_pushVelocity += linearComponent * impulseMagnitude * m_linearFactor;
+ m_turnVelocity += angularComponent * (impulseMagnitude * m_angularFactor);
}
}
-
-
const b3Vector3& getDeltaLinearVelocity() const
{
return m_deltaLinearVelocity;
@@ -113,20 +106,19 @@ B3_ATTRIBUTE_ALIGNED16 (struct) b3GpuSolverBody
return m_deltaAngularVelocity;
}
- const b3Vector3& getPushVelocity() const
+ const b3Vector3& getPushVelocity() const
{
return m_pushVelocity;
}
- const b3Vector3& getTurnVelocity() const
+ const b3Vector3& getTurnVelocity() const
{
return m_turnVelocity;
}
-
////////////////////////////////////////////////
///some internal methods, don't use them
-
+
b3Vector3& internalGetDeltaLinearVelocity()
{
return m_deltaLinearVelocity;
@@ -151,7 +143,7 @@ B3_ATTRIBUTE_ALIGNED16 (struct) b3GpuSolverBody
{
m_invMass = invMass;
}
-
+
b3Vector3& internalGetPushVelocity()
{
return m_pushVelocity;
@@ -162,67 +154,57 @@ B3_ATTRIBUTE_ALIGNED16 (struct) b3GpuSolverBody
return m_turnVelocity;
}
- B3_FORCE_INLINE void internalGetVelocityInLocalPointObsolete(const b3Vector3& rel_pos, b3Vector3& velocity ) const
+ B3_FORCE_INLINE void internalGetVelocityInLocalPointObsolete(const b3Vector3& rel_pos, b3Vector3& velocity) const
{
- velocity = m_linearVelocity+m_deltaLinearVelocity + (m_angularVelocity+m_deltaAngularVelocity).cross(rel_pos);
+ velocity = m_linearVelocity + m_deltaLinearVelocity + (m_angularVelocity + m_deltaAngularVelocity).cross(rel_pos);
}
- B3_FORCE_INLINE void internalGetAngularVelocity(b3Vector3& angVel) const
+ B3_FORCE_INLINE void internalGetAngularVelocity(b3Vector3 & angVel) const
{
- angVel = m_angularVelocity+m_deltaAngularVelocity;
+ 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)
+ 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);
+ m_deltaLinearVelocity += linearComponent * impulseMagnitude * m_linearFactor;
+ m_deltaAngularVelocity += angularComponent * (impulseMagnitude * m_angularFactor);
}
}
-
-
-
- void writebackVelocity()
+ void writebackVelocity()
{
//if (m_originalBody>=0)
{
- m_linearVelocity +=m_deltaLinearVelocity;
+ m_linearVelocity += m_deltaLinearVelocity;
m_angularVelocity += m_deltaAngularVelocity;
-
+
//m_originalBody->setCompanionId(-1);
}
}
-
- void writebackVelocityAndTransform(b3Scalar timeStep, b3Scalar splitImpulseTurnErp)
+ void writebackVelocityAndTransform(b3Scalar timeStep, b3Scalar splitImpulseTurnErp)
{
- (void) timeStep;
+ (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)
+ 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;
+ // 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
-
-
+#endif //B3_SOLVER_BODY_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuSolverConstraint.h b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuSolverConstraint.h
index 60d235baab..7d9eea243a 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuSolverConstraint.h
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3GpuSolverConstraint.h
@@ -13,11 +13,9 @@ subject to the following restrictions:
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"
@@ -25,58 +23,51 @@ subject to the following restrictions:
//#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_ATTRIBUTE_ALIGNED16(struct)
+b3GpuSolverConstraint
{
B3_DECLARE_ALIGNED_ALLOCATOR();
- b3Vector3 m_relpos1CrossNormal;
- b3Vector3 m_contactNormal;
+ b3Vector3 m_relpos1CrossNormal;
+ b3Vector3 m_contactNormal;
- b3Vector3 m_relpos2CrossNormal;
+ 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;
+ 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;
+ 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_overrideNumSolverIterations;
+ int m_frictionIndex;
int m_solverBodyIdA;
int m_solverBodyIdB;
-
- enum b3SolverConstraintType
+ enum b3SolverConstraintType
{
B3_SOLVER_CONTACT_1D = 0,
B3_SOLVER_FRICTION_1D
};
};
-typedef b3AlignedObjectArray<b3GpuSolverConstraint> b3GpuConstraintArray;
-
-
-#endif //B3_GPU_SOLVER_CONSTRAINT_H
-
-
+typedef b3AlignedObjectArray<b3GpuSolverConstraint> b3GpuConstraintArray;
+#endif //B3_GPU_SOLVER_CONSTRAINT_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3Solver.cpp b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3Solver.cpp
index 20bf6d47c5..ccf67da1a8 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3Solver.cpp
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3Solver.cpp
@@ -13,7 +13,6 @@ subject to the following restrictions:
*/
//Originally written by Takahiro Harada
-
#include "b3Solver.h"
///useNewBatchingKernel is a rewritten kernel using just a single thread of the warp, for experiments
@@ -38,7 +37,6 @@ bool gConvertConstraintOnCpu = false;
#include "kernels/batchingKernels.h"
#include "kernels/batchingKernelsNew.h"
-
#include "Bullet3OpenCL/ParallelPrimitives/b3LauncherCL.h"
#include "Bullet3Common/b3Vector3.h"
@@ -48,7 +46,7 @@ struct SolverDebugInfo
int m_valInt1;
int m_valInt2;
int m_valInt3;
-
+
int m_valInt4;
int m_valInt5;
int m_valInt6;
@@ -59,11 +57,10 @@ struct SolverDebugInfo
int m_valInt10;
int m_valInt11;
- int m_valInt12;
- int m_valInt13;
- int m_valInt14;
- int m_valInt15;
-
+ int m_valInt12;
+ int m_valInt13;
+ int m_valInt14;
+ int m_valInt15;
float m_val0;
float m_val1;
@@ -71,9 +68,6 @@ struct SolverDebugInfo
float m_val3;
};
-
-
-
class SolverDeviceInl
{
public:
@@ -84,101 +78,89 @@ public:
};
};
-
-
b3Solver::b3Solver(cl_context ctx, cl_device_id device, cl_command_queue queue, int pairCapacity)
- :
- m_context(ctx),
- m_device(device),
- m_queue(queue),
- m_batchSizes(ctx,queue),
- m_nIterations(4)
+ : m_context(ctx),
+ m_device(device),
+ m_queue(queue),
+ m_batchSizes(ctx, queue),
+ m_nIterations(4)
{
- m_sort32 = new b3RadixSort32CL(ctx,device,queue);
- m_scan = new b3PrefixScanCL(ctx,device,queue,B3_SOLVER_N_CELLS);
- m_search = new b3BoundSearchCL(ctx,device,queue,B3_SOLVER_N_CELLS);
+ m_sort32 = new b3RadixSort32CL(ctx, device, queue);
+ m_scan = new b3PrefixScanCL(ctx, device, queue, B3_SOLVER_N_CELLS);
+ m_search = new b3BoundSearchCL(ctx, device, queue, B3_SOLVER_N_CELLS);
- const int sortSize = B3NEXTMULTIPLEOF( pairCapacity, 512 );
+ const int sortSize = B3NEXTMULTIPLEOF(pairCapacity, 512);
- m_sortDataBuffer = new b3OpenCLArray<b3SortData>(ctx,queue,sortSize);
- m_contactBuffer2 = new b3OpenCLArray<b3Contact4>(ctx,queue);
+ m_sortDataBuffer = new b3OpenCLArray<b3SortData>(ctx, queue, sortSize);
+ m_contactBuffer2 = new b3OpenCLArray<b3Contact4>(ctx, queue);
- m_numConstraints = new b3OpenCLArray<unsigned int>(ctx,queue,B3_SOLVER_N_CELLS );
+ m_numConstraints = new b3OpenCLArray<unsigned int>(ctx, queue, B3_SOLVER_N_CELLS);
m_numConstraints->resize(B3_SOLVER_N_CELLS);
- m_offsets = new b3OpenCLArray<unsigned int>( ctx,queue,B3_SOLVER_N_CELLS);
+ m_offsets = new b3OpenCLArray<unsigned int>(ctx, queue, B3_SOLVER_N_CELLS);
m_offsets->resize(B3_SOLVER_N_CELLS);
const char* additionalMacros = "";
-// const char* srcFileNameForCaching="";
-
-
+ // const char* srcFileNameForCaching="";
cl_int pErrNum;
const char* batchKernelSource = batchingKernelsCL;
const char* batchKernelNewSource = batchingKernelsNewCL;
-
+
const char* solverSetupSource = solverSetupCL;
const char* solverSetup2Source = solverSetup2CL;
const char* solveContactSource = solveContactCL;
const char* solveFrictionSource = solveFrictionCL;
-
-
-
+
{
-
- cl_program solveContactProg= b3OpenCLUtils::compileCLProgramFromString( ctx, device, solveContactSource, &pErrNum,additionalMacros, B3_SOLVER_CONTACT_KERNEL_PATH);
+ cl_program solveContactProg = b3OpenCLUtils::compileCLProgramFromString(ctx, device, solveContactSource, &pErrNum, additionalMacros, B3_SOLVER_CONTACT_KERNEL_PATH);
b3Assert(solveContactProg);
-
- cl_program solveFrictionProg= b3OpenCLUtils::compileCLProgramFromString( ctx, device, solveFrictionSource, &pErrNum,additionalMacros, B3_SOLVER_FRICTION_KERNEL_PATH);
+
+ cl_program solveFrictionProg = b3OpenCLUtils::compileCLProgramFromString(ctx, device, solveFrictionSource, &pErrNum, additionalMacros, B3_SOLVER_FRICTION_KERNEL_PATH);
b3Assert(solveFrictionProg);
- cl_program solverSetup2Prog= b3OpenCLUtils::compileCLProgramFromString( ctx, device, solverSetup2Source, &pErrNum,additionalMacros, B3_SOLVER_SETUP2_KERNEL_PATH);
+ cl_program solverSetup2Prog = b3OpenCLUtils::compileCLProgramFromString(ctx, device, solverSetup2Source, &pErrNum, additionalMacros, B3_SOLVER_SETUP2_KERNEL_PATH);
b3Assert(solverSetup2Prog);
-
- cl_program solverSetupProg= b3OpenCLUtils::compileCLProgramFromString( ctx, device, solverSetupSource, &pErrNum,additionalMacros, B3_SOLVER_SETUP_KERNEL_PATH);
+ cl_program solverSetupProg = b3OpenCLUtils::compileCLProgramFromString(ctx, device, solverSetupSource, &pErrNum, additionalMacros, B3_SOLVER_SETUP_KERNEL_PATH);
b3Assert(solverSetupProg);
-
-
- m_solveFrictionKernel= b3OpenCLUtils::compileCLKernelFromString( ctx, device, solveFrictionSource, "BatchSolveKernelFriction", &pErrNum, solveFrictionProg,additionalMacros );
+
+ m_solveFrictionKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, solveFrictionSource, "BatchSolveKernelFriction", &pErrNum, solveFrictionProg, additionalMacros);
b3Assert(m_solveFrictionKernel);
- m_solveContactKernel= b3OpenCLUtils::compileCLKernelFromString( ctx, device, solveContactSource, "BatchSolveKernelContact", &pErrNum, solveContactProg,additionalMacros );
+ m_solveContactKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, solveContactSource, "BatchSolveKernelContact", &pErrNum, solveContactProg, additionalMacros);
b3Assert(m_solveContactKernel);
-
- m_contactToConstraintKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, solverSetupSource, "ContactToConstraintKernel", &pErrNum, solverSetupProg,additionalMacros );
+
+ m_contactToConstraintKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, solverSetupSource, "ContactToConstraintKernel", &pErrNum, solverSetupProg, additionalMacros);
b3Assert(m_contactToConstraintKernel);
-
- m_setSortDataKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, solverSetup2Source, "SetSortDataKernel", &pErrNum, solverSetup2Prog,additionalMacros );
+
+ m_setSortDataKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, solverSetup2Source, "SetSortDataKernel", &pErrNum, solverSetup2Prog, additionalMacros);
b3Assert(m_setSortDataKernel);
-
- m_reorderContactKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, solverSetup2Source, "ReorderContactKernel", &pErrNum, solverSetup2Prog,additionalMacros );
+
+ m_reorderContactKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, solverSetup2Source, "ReorderContactKernel", &pErrNum, solverSetup2Prog, additionalMacros);
b3Assert(m_reorderContactKernel);
-
- m_copyConstraintKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, solverSetup2Source, "CopyConstraintKernel", &pErrNum, solverSetup2Prog,additionalMacros );
+ m_copyConstraintKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, solverSetup2Source, "CopyConstraintKernel", &pErrNum, solverSetup2Prog, additionalMacros);
b3Assert(m_copyConstraintKernel);
-
}
{
- cl_program batchingProg = b3OpenCLUtils::compileCLProgramFromString( ctx, device, batchKernelSource, &pErrNum,additionalMacros, B3_BATCHING_PATH);
+ cl_program batchingProg = b3OpenCLUtils::compileCLProgramFromString(ctx, device, batchKernelSource, &pErrNum, additionalMacros, B3_BATCHING_PATH);
//cl_program batchingProg = b3OpenCLUtils::compileCLProgramFromString( ctx, device, 0, &pErrNum,additionalMacros, B3_BATCHING_PATH,true);
b3Assert(batchingProg);
-
- m_batchingKernel = b3OpenCLUtils::compileCLKernelFromString( ctx, device, batchKernelSource, "CreateBatches", &pErrNum, batchingProg,additionalMacros );
+
+ m_batchingKernel = b3OpenCLUtils::compileCLKernelFromString(ctx, device, batchKernelSource, "CreateBatches", &pErrNum, batchingProg, additionalMacros);
b3Assert(m_batchingKernel);
}
{
- cl_program batchingNewProg = b3OpenCLUtils::compileCLProgramFromString( ctx, device, batchKernelNewSource, &pErrNum,additionalMacros, B3_BATCHING_NEW_PATH);
+ cl_program batchingNewProg = b3OpenCLUtils::compileCLProgramFromString(ctx, device, batchKernelNewSource, &pErrNum, additionalMacros, B3_BATCHING_NEW_PATH);
b3Assert(batchingNewProg);
- m_batchingKernelNew = b3OpenCLUtils::compileCLKernelFromString( ctx, device, batchKernelNewSource, "CreateBatchesNew", &pErrNum, batchingNewProg,additionalMacros );
+ m_batchingKernelNew = b3OpenCLUtils::compileCLKernelFromString(ctx, device, batchKernelNewSource, "CreateBatchesNew", &pErrNum, batchingNewProg, additionalMacros);
//m_batchingKernelNew = b3OpenCLUtils::compileCLKernelFromString( ctx, device, batchKernelNewSource, "CreateBatchesBruteForce", &pErrNum, batchingNewProg,additionalMacros );
b3Assert(m_batchingKernelNew);
}
}
-
+
b3Solver::~b3Solver()
{
delete m_offsets;
@@ -190,71 +172,68 @@ b3Solver::~b3Solver()
delete m_scan;
delete m_search;
-
clReleaseKernel(m_batchingKernel);
clReleaseKernel(m_batchingKernelNew);
-
- clReleaseKernel( m_solveContactKernel);
- clReleaseKernel( m_solveFrictionKernel);
-
- clReleaseKernel( m_contactToConstraintKernel);
- clReleaseKernel( m_setSortDataKernel);
- clReleaseKernel( m_reorderContactKernel);
- clReleaseKernel( m_copyConstraintKernel);
-
-}
+ clReleaseKernel(m_solveContactKernel);
+ clReleaseKernel(m_solveFrictionKernel);
-
+ clReleaseKernel(m_contactToConstraintKernel);
+ clReleaseKernel(m_setSortDataKernel);
+ clReleaseKernel(m_reorderContactKernel);
+ clReleaseKernel(m_copyConstraintKernel);
+}
-template<bool JACOBI>
-static
-__inline
-void solveContact(b3GpuConstraint4& cs,
- const b3Vector3& posA, b3Vector3& linVelA, b3Vector3& angVelA, float invMassA, const b3Matrix3x3& invInertiaA,
- const b3Vector3& posB, b3Vector3& linVelB, b3Vector3& angVelB, float invMassB, const b3Matrix3x3& invInertiaB,
- float maxRambdaDt[4], float minRambdaDt[4])
+template <bool JACOBI>
+static __inline void solveContact(b3GpuConstraint4& cs,
+ const b3Vector3& posA, b3Vector3& linVelA, b3Vector3& angVelA, float invMassA, const b3Matrix3x3& invInertiaA,
+ const b3Vector3& posB, b3Vector3& linVelB, b3Vector3& angVelB, float invMassB, const b3Matrix3x3& invInertiaB,
+ float maxRambdaDt[4], float minRambdaDt[4])
{
-
- b3Vector3 dLinVelA; dLinVelA.setZero();
- b3Vector3 dAngVelA; dAngVelA.setZero();
- b3Vector3 dLinVelB; dLinVelB.setZero();
- b3Vector3 dAngVelB; dAngVelB.setZero();
-
- for(int ic=0; ic<4; ic++)
+ b3Vector3 dLinVelA;
+ dLinVelA.setZero();
+ b3Vector3 dAngVelA;
+ dAngVelA.setZero();
+ b3Vector3 dLinVelB;
+ dLinVelB.setZero();
+ b3Vector3 dAngVelB;
+ dAngVelB.setZero();
+
+ for (int ic = 0; ic < 4; ic++)
{
// dont necessary because this makes change to 0
- if( cs.m_jacCoeffInv[ic] == 0.f ) continue;
+ if (cs.m_jacCoeffInv[ic] == 0.f) continue;
{
b3Vector3 angular0, angular1, linear;
b3Vector3 r0 = cs.m_worldPos[ic] - (b3Vector3&)posA;
b3Vector3 r1 = cs.m_worldPos[ic] - (b3Vector3&)posB;
- setLinearAndAngular( (const b3Vector3 &)cs.m_linear, (const b3Vector3 &)r0, (const b3Vector3 &)r1, &linear, &angular0, &angular1 );
+ setLinearAndAngular((const b3Vector3&)cs.m_linear, (const b3Vector3&)r0, (const b3Vector3&)r1, &linear, &angular0, &angular1);
- float rambdaDt = calcRelVel((const b3Vector3 &)cs.m_linear,(const b3Vector3 &) -cs.m_linear, angular0, angular1,
- linVelA, angVelA, linVelB, angVelB ) + cs.m_b[ic];
+ float rambdaDt = calcRelVel((const b3Vector3&)cs.m_linear, (const b3Vector3&)-cs.m_linear, angular0, angular1,
+ linVelA, angVelA, linVelB, angVelB) +
+ cs.m_b[ic];
rambdaDt *= cs.m_jacCoeffInv[ic];
{
float prevSum = cs.m_appliedRambdaDt[ic];
float updated = prevSum;
updated += rambdaDt;
- updated = b3Max( updated, minRambdaDt[ic] );
- updated = b3Min( updated, maxRambdaDt[ic] );
+ updated = b3Max(updated, minRambdaDt[ic]);
+ updated = b3Min(updated, maxRambdaDt[ic]);
rambdaDt = updated - prevSum;
cs.m_appliedRambdaDt[ic] = updated;
}
- b3Vector3 linImp0 = invMassA*linear*rambdaDt;
- b3Vector3 linImp1 = invMassB*(-linear)*rambdaDt;
- b3Vector3 angImp0 = (invInertiaA* angular0)*rambdaDt;
- b3Vector3 angImp1 = (invInertiaB* angular1)*rambdaDt;
+ b3Vector3 linImp0 = invMassA * linear * rambdaDt;
+ b3Vector3 linImp1 = invMassB * (-linear) * rambdaDt;
+ b3Vector3 angImp0 = (invInertiaA * angular0) * rambdaDt;
+ b3Vector3 angImp1 = (invInertiaB * angular1) * rambdaDt;
#ifdef _WIN32
- b3Assert(_finite(linImp0.getX()));
+ b3Assert(_finite(linImp0.getX()));
b3Assert(_finite(linImp1.getX()));
#endif
- if( JACOBI )
+ if (JACOBI)
{
dLinVelA += linImp0;
dAngVelA += angImp0;
@@ -271,92 +250,83 @@ void solveContact(b3GpuConstraint4& cs,
}
}
- if( JACOBI )
+ if (JACOBI)
{
linVelA += dLinVelA;
angVelA += dAngVelA;
linVelB += dLinVelB;
angVelB += dAngVelB;
}
-
}
+static __inline void solveFriction(b3GpuConstraint4& cs,
+ const b3Vector3& posA, b3Vector3& linVelA, b3Vector3& angVelA, float invMassA, const b3Matrix3x3& invInertiaA,
+ const b3Vector3& posB, b3Vector3& linVelB, b3Vector3& angVelB, float invMassB, const b3Matrix3x3& invInertiaB,
+ float maxRambdaDt[4], float minRambdaDt[4])
+{
+ if (cs.m_fJacCoeffInv[0] == 0 && cs.m_fJacCoeffInv[0] == 0) return;
+ const b3Vector3& center = (const b3Vector3&)cs.m_center;
+ b3Vector3 n = -(const b3Vector3&)cs.m_linear;
-
-
- static
- __inline
- void solveFriction(b3GpuConstraint4& cs,
- const b3Vector3& posA, b3Vector3& linVelA, b3Vector3& angVelA, float invMassA, const b3Matrix3x3& invInertiaA,
- const b3Vector3& posB, b3Vector3& linVelB, b3Vector3& angVelB, float invMassB, const b3Matrix3x3& invInertiaB,
- float maxRambdaDt[4], float minRambdaDt[4])
- {
-
- if( cs.m_fJacCoeffInv[0] == 0 && cs.m_fJacCoeffInv[0] == 0 ) return;
- const b3Vector3& center = (const b3Vector3&)cs.m_center;
-
- b3Vector3 n = -(const b3Vector3&)cs.m_linear;
-
- b3Vector3 tangent[2];
-#if 1
- b3PlaneSpace1 (n, tangent[0],tangent[1]);
+ b3Vector3 tangent[2];
+#if 1
+ b3PlaneSpace1(n, tangent[0], tangent[1]);
#else
- b3Vector3 r = cs.m_worldPos[0]-center;
- tangent[0] = cross3( n, r );
- tangent[1] = cross3( tangent[0], n );
- tangent[0] = normalize3( tangent[0] );
- tangent[1] = normalize3( tangent[1] );
+ b3Vector3 r = cs.m_worldPos[0] - center;
+ tangent[0] = cross3(n, r);
+ tangent[1] = cross3(tangent[0], n);
+ tangent[0] = normalize3(tangent[0]);
+ tangent[1] = normalize3(tangent[1]);
#endif
- b3Vector3 angular0, angular1, linear;
- b3Vector3 r0 = center - posA;
- b3Vector3 r1 = center - posB;
- for(int i=0; i<2; i++)
- {
- setLinearAndAngular( tangent[i], r0, r1, &linear, &angular0, &angular1 );
- float rambdaDt = calcRelVel(linear, -linear, angular0, angular1,
- linVelA, angVelA, linVelB, angVelB );
- rambdaDt *= cs.m_fJacCoeffInv[i];
+ b3Vector3 angular0, angular1, linear;
+ b3Vector3 r0 = center - posA;
+ b3Vector3 r1 = center - posB;
+ for (int i = 0; i < 2; i++)
+ {
+ setLinearAndAngular(tangent[i], r0, r1, &linear, &angular0, &angular1);
+ float rambdaDt = calcRelVel(linear, -linear, angular0, angular1,
+ linVelA, angVelA, linVelB, angVelB);
+ rambdaDt *= cs.m_fJacCoeffInv[i];
- {
- float prevSum = cs.m_fAppliedRambdaDt[i];
- float updated = prevSum;
- updated += rambdaDt;
- updated = b3Max( updated, minRambdaDt[i] );
- updated = b3Min( updated, maxRambdaDt[i] );
- rambdaDt = updated - prevSum;
- cs.m_fAppliedRambdaDt[i] = updated;
- }
+ {
+ float prevSum = cs.m_fAppliedRambdaDt[i];
+ float updated = prevSum;
+ updated += rambdaDt;
+ updated = b3Max(updated, minRambdaDt[i]);
+ updated = b3Min(updated, maxRambdaDt[i]);
+ rambdaDt = updated - prevSum;
+ cs.m_fAppliedRambdaDt[i] = updated;
+ }
- b3Vector3 linImp0 = invMassA*linear*rambdaDt;
- b3Vector3 linImp1 = invMassB*(-linear)*rambdaDt;
- b3Vector3 angImp0 = (invInertiaA* angular0)*rambdaDt;
- b3Vector3 angImp1 = (invInertiaB* angular1)*rambdaDt;
+ b3Vector3 linImp0 = invMassA * linear * rambdaDt;
+ b3Vector3 linImp1 = invMassB * (-linear) * rambdaDt;
+ b3Vector3 angImp0 = (invInertiaA * angular0) * rambdaDt;
+ b3Vector3 angImp1 = (invInertiaB * angular1) * rambdaDt;
#ifdef _WIN32
- b3Assert(_finite(linImp0.getX()));
- b3Assert(_finite(linImp1.getX()));
+ b3Assert(_finite(linImp0.getX()));
+ b3Assert(_finite(linImp1.getX()));
#endif
- linVelA += linImp0;
- angVelA += angImp0;
- linVelB += linImp1;
- angVelB += angImp1;
- }
+ linVelA += linImp0;
+ angVelA += angImp0;
+ linVelB += linImp1;
+ angVelB += angImp1;
+ }
- { // angular damping for point constraint
- b3Vector3 ab = ( posB - posA ).normalized();
- b3Vector3 ac = ( center - posA ).normalized();
- if( b3Dot( ab, ac ) > 0.95f || (invMassA == 0.f || invMassB == 0.f))
- {
- float angNA = b3Dot( n, angVelA );
- float angNB = b3Dot( n, angVelB );
+ { // angular damping for point constraint
+ b3Vector3 ab = (posB - posA).normalized();
+ b3Vector3 ac = (center - posA).normalized();
+ if (b3Dot(ab, ac) > 0.95f || (invMassA == 0.f || invMassB == 0.f))
+ {
+ float angNA = b3Dot(n, angVelA);
+ float angNB = b3Dot(n, angVelB);
- angVelA -= (angNA*0.1f)*n;
- angVelB -= (angNB*0.1f)*n;
- }
+ angVelA -= (angNA * 0.1f) * n;
+ angVelB -= (angNB * 0.1f) * n;
}
-
}
+}
/*
b3AlignedObjectArray<b3RigidBodyData>& m_bodies;
b3AlignedObjectArray<b3InertiaData>& m_shapes;
@@ -370,79 +340,69 @@ void solveContact(b3GpuConstraint4& cs,
int m_maxNumBatches;
*/
-struct SolveTask// : public ThreadPool::Task
+struct SolveTask // : public ThreadPool::Task
{
- SolveTask(b3AlignedObjectArray<b3RigidBodyData>& bodies, b3AlignedObjectArray<b3InertiaData>& shapes, b3AlignedObjectArray<b3GpuConstraint4>& constraints,
- int start, int nConstraints,int maxNumBatches,b3AlignedObjectArray<int>* wgUsedBodies, int curWgidx, b3AlignedObjectArray<int>* batchSizes, int cellIndex)
- : m_bodies( bodies ), m_shapes( shapes ),
- m_constraints( constraints ),
- m_batchSizes(batchSizes),
- m_cellIndex(cellIndex),
- m_curWgidx(curWgidx),
- m_start( start ),
- m_nConstraints( nConstraints ),
- m_solveFriction( true ),
- m_maxNumBatches(maxNumBatches)
- {}
-
- unsigned short int getType(){ return 0; }
+ SolveTask(b3AlignedObjectArray<b3RigidBodyData>& bodies, b3AlignedObjectArray<b3InertiaData>& shapes, b3AlignedObjectArray<b3GpuConstraint4>& constraints,
+ int start, int nConstraints, int maxNumBatches, b3AlignedObjectArray<int>* wgUsedBodies, int curWgidx, b3AlignedObjectArray<int>* batchSizes, int cellIndex)
+ : m_bodies(bodies), m_shapes(shapes), m_constraints(constraints), m_batchSizes(batchSizes), m_cellIndex(cellIndex), m_curWgidx(curWgidx), m_start(start), m_nConstraints(nConstraints), m_solveFriction(true), m_maxNumBatches(maxNumBatches)
+ {
+ }
+
+ unsigned short int getType() { return 0; }
void run(int tIdx)
{
int offset = 0;
- for (int ii=0;ii<B3_MAX_NUM_BATCHES;ii++)
+ for (int ii = 0; ii < B3_MAX_NUM_BATCHES; ii++)
{
- int numInBatch = m_batchSizes->at(m_cellIndex*B3_MAX_NUM_BATCHES+ii);
+ int numInBatch = m_batchSizes->at(m_cellIndex * B3_MAX_NUM_BATCHES + ii);
if (!numInBatch)
break;
- for (int jj=0;jj<numInBatch;jj++)
+ for (int jj = 0; jj < numInBatch; jj++)
{
- int i = m_start + offset+jj;
+ int i = m_start + offset + jj;
int batchId = m_constraints[i].m_batchIdx;
- b3Assert(batchId==ii);
+ b3Assert(batchId == ii);
float frictionCoeff = m_constraints[i].getFrictionCoeff();
int aIdx = (int)m_constraints[i].m_bodyA;
int bIdx = (int)m_constraints[i].m_bodyB;
-// int localBatch = m_constraints[i].m_batchIdx;
+ // int localBatch = m_constraints[i].m_batchIdx;
b3RigidBodyData& bodyA = m_bodies[aIdx];
b3RigidBodyData& bodyB = m_bodies[bIdx];
- if( !m_solveFriction )
+ if (!m_solveFriction)
{
- float maxRambdaDt[4] = {FLT_MAX,FLT_MAX,FLT_MAX,FLT_MAX};
- float minRambdaDt[4] = {0.f,0.f,0.f,0.f};
+ float maxRambdaDt[4] = {FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX};
+ float minRambdaDt[4] = {0.f, 0.f, 0.f, 0.f};
- solveContact<false>( m_constraints[i], (b3Vector3&)bodyA.m_pos, (b3Vector3&)bodyA.m_linVel, (b3Vector3&)bodyA.m_angVel, bodyA.m_invMass, (const b3Matrix3x3 &)m_shapes[aIdx].m_invInertiaWorld,
- (b3Vector3&)bodyB.m_pos, (b3Vector3&)bodyB.m_linVel, (b3Vector3&)bodyB.m_angVel, bodyB.m_invMass, (const b3Matrix3x3 &)m_shapes[bIdx].m_invInertiaWorld,
- maxRambdaDt, minRambdaDt );
+ solveContact<false>(m_constraints[i], (b3Vector3&)bodyA.m_pos, (b3Vector3&)bodyA.m_linVel, (b3Vector3&)bodyA.m_angVel, bodyA.m_invMass, (const b3Matrix3x3&)m_shapes[aIdx].m_invInertiaWorld,
+ (b3Vector3&)bodyB.m_pos, (b3Vector3&)bodyB.m_linVel, (b3Vector3&)bodyB.m_angVel, bodyB.m_invMass, (const b3Matrix3x3&)m_shapes[bIdx].m_invInertiaWorld,
+ maxRambdaDt, minRambdaDt);
}
else
{
- float maxRambdaDt[4] = {FLT_MAX,FLT_MAX,FLT_MAX,FLT_MAX};
- float minRambdaDt[4] = {0.f,0.f,0.f,0.f};
+ float maxRambdaDt[4] = {FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX};
+ float minRambdaDt[4] = {0.f, 0.f, 0.f, 0.f};
float sum = 0;
- for(int j=0; j<4; j++)
+ for (int j = 0; j < 4; j++)
{
- sum +=m_constraints[i].m_appliedRambdaDt[j];
+ sum += m_constraints[i].m_appliedRambdaDt[j];
}
frictionCoeff = 0.7f;
- for(int j=0; j<4; j++)
+ for (int j = 0; j < 4; j++)
{
- maxRambdaDt[j] = frictionCoeff*sum;
+ maxRambdaDt[j] = frictionCoeff * sum;
minRambdaDt[j] = -maxRambdaDt[j];
}
- solveFriction( m_constraints[i], (b3Vector3&)bodyA.m_pos, (b3Vector3&)bodyA.m_linVel, (b3Vector3&)bodyA.m_angVel, bodyA.m_invMass,(const b3Matrix3x3 &) m_shapes[aIdx].m_invInertiaWorld,
- (b3Vector3&)bodyB.m_pos, (b3Vector3&)bodyB.m_linVel, (b3Vector3&)bodyB.m_angVel, bodyB.m_invMass,(const b3Matrix3x3 &) m_shapes[bIdx].m_invInertiaWorld,
- maxRambdaDt, minRambdaDt );
-
+ solveFriction(m_constraints[i], (b3Vector3&)bodyA.m_pos, (b3Vector3&)bodyA.m_linVel, (b3Vector3&)bodyA.m_angVel, bodyA.m_invMass, (const b3Matrix3x3&)m_shapes[aIdx].m_invInertiaWorld,
+ (b3Vector3&)bodyB.m_pos, (b3Vector3&)bodyB.m_linVel, (b3Vector3&)bodyB.m_angVel, bodyB.m_invMass, (const b3Matrix3x3&)m_shapes[bIdx].m_invInertiaWorld,
+ maxRambdaDt, minRambdaDt);
}
}
- offset+=numInBatch;
-
-
+ offset += numInBatch;
}
-/* for (int bb=0;bb<m_maxNumBatches;bb++)
+ /* for (int bb=0;bb<m_maxNumBatches;bb++)
{
//for(int ic=m_nConstraints-1; ic>=0; ic--)
for(int ic=0; ic<m_nConstraints; ic++)
@@ -491,9 +451,6 @@ struct SolveTask// : public ThreadPool::Task
}
}
*/
-
-
-
}
b3AlignedObjectArray<b3RigidBodyData>& m_bodies;
@@ -508,11 +465,9 @@ struct SolveTask// : public ThreadPool::Task
int m_maxNumBatches;
};
-
-void b3Solver::solveContactConstraintHost( b3OpenCLArray<b3RigidBodyData>* bodyBuf, b3OpenCLArray<b3InertiaData>* shapeBuf,
- b3OpenCLArray<b3GpuConstraint4>* constraint, void* additionalData, int n ,int maxNumBatches,b3AlignedObjectArray<int>* batchSizes)
+void b3Solver::solveContactConstraintHost(b3OpenCLArray<b3RigidBodyData>* bodyBuf, b3OpenCLArray<b3InertiaData>* shapeBuf,
+ b3OpenCLArray<b3GpuConstraint4>* constraint, void* additionalData, int n, int maxNumBatches, b3AlignedObjectArray<int>* batchSizes)
{
-
#if 0
{
int nSplitX = B3_SOLVER_N_SPLIT_X;
@@ -571,114 +526,105 @@ void b3Solver::solveContactConstraintHost( b3OpenCLArray<b3RigidBodyData>* body
//printf("------------------------\n");
b3AlignedObjectArray<unsigned int> offsetsHost;
m_offsets->copyToHost(offsetsHost);
- static int frame=0;
- bool useBatches=true;
+ static int frame = 0;
+ bool useBatches = true;
if (useBatches)
{
- for(int iter=0; iter<m_nIterations; iter++)
+ for (int iter = 0; iter < m_nIterations; iter++)
{
- for (int cellBatch=0;cellBatch<B3_SOLVER_N_BATCHES;cellBatch++)
+ for (int cellBatch = 0; cellBatch < B3_SOLVER_N_BATCHES; cellBatch++)
{
-
int nSplitX = B3_SOLVER_N_SPLIT_X;
int nSplitY = B3_SOLVER_N_SPLIT_Y;
- int numWorkgroups = B3_SOLVER_N_CELLS/B3_SOLVER_N_BATCHES;
+ int numWorkgroups = B3_SOLVER_N_CELLS / B3_SOLVER_N_BATCHES;
//printf("cell Batch %d\n",cellBatch);
b3AlignedObjectArray<int> usedBodies[B3_SOLVER_N_CELLS];
- for (int i=0;i<B3_SOLVER_N_CELLS;i++)
+ for (int i = 0; i < B3_SOLVER_N_CELLS; i++)
{
usedBodies[i].resize(0);
}
-
-
-
//for (int wgIdx=numWorkgroups-1;wgIdx>=0;wgIdx--)
- for (int wgIdx=0;wgIdx<numWorkgroups;wgIdx++)
+ for (int wgIdx = 0; wgIdx < numWorkgroups; wgIdx++)
{
- int zIdx = (wgIdx/((nSplitX*nSplitY)/4))*2+((cellBatch&4)>>2);
- int remain= (wgIdx%((nSplitX*nSplitY)/4));
- int yIdx = (remain/(nSplitX/2))*2 + ((cellBatch&2)>>1);
- int xIdx = (remain%(nSplitX/2))*2 + (cellBatch&1);
- int cellIdx = xIdx+yIdx*nSplitX+zIdx*(nSplitX*nSplitY);
-
-
- if( numConstraintsHost[cellIdx] == 0 )
+ int zIdx = (wgIdx / ((nSplitX * nSplitY) / 4)) * 2 + ((cellBatch & 4) >> 2);
+ int remain = (wgIdx % ((nSplitX * nSplitY) / 4));
+ int yIdx = (remain / (nSplitX / 2)) * 2 + ((cellBatch & 2) >> 1);
+ int xIdx = (remain % (nSplitX / 2)) * 2 + (cellBatch & 1);
+ int cellIdx = xIdx + yIdx * nSplitX + zIdx * (nSplitX * nSplitY);
+
+ if (numConstraintsHost[cellIdx] == 0)
continue;
//printf("wgIdx %d: xIdx=%d, yIdx=%d, zIdx=%d, cellIdx=%d, cell Batch %d\n",wgIdx,xIdx,yIdx,zIdx,cellIdx,cellBatch);
//printf("cell %d has %d constraints\n", cellIdx,numConstraintsHost[cellIdx]);
if (zIdx)
{
- //printf("?\n");
+ //printf("?\n");
}
- if (iter==0)
+ if (iter == 0)
{
//printf("frame=%d, Cell xIdx=%x, yIdx=%d ",frame, xIdx,yIdx);
//printf("cellBatch=%d, wgIdx=%d, #constraints in cell=%d\n",cellBatch,wgIdx,numConstraintsHost[cellIdx]);
}
const int start = offsetsHost[cellIdx];
int numConstraintsInCell = numConstraintsHost[cellIdx];
- // const int end = start + numConstraintsInCell;
+ // const int end = start + numConstraintsInCell;
- SolveTask task( bodyNative, shapeNative, constraintNative, start, numConstraintsInCell ,maxNumBatches,usedBodies,wgIdx,batchSizes,cellIdx);
+ SolveTask task(bodyNative, shapeNative, constraintNative, start, numConstraintsInCell, maxNumBatches, usedBodies, wgIdx, batchSizes, cellIdx);
task.m_solveFriction = false;
task.run(0);
-
}
}
}
- for(int iter=0; iter<m_nIterations; iter++)
+ for (int iter = 0; iter < m_nIterations; iter++)
{
- for (int cellBatch=0;cellBatch<B3_SOLVER_N_BATCHES;cellBatch++)
+ for (int cellBatch = 0; cellBatch < B3_SOLVER_N_BATCHES; cellBatch++)
{
int nSplitX = B3_SOLVER_N_SPLIT_X;
int nSplitY = B3_SOLVER_N_SPLIT_Y;
-
- int numWorkgroups = B3_SOLVER_N_CELLS/B3_SOLVER_N_BATCHES;
+ int numWorkgroups = B3_SOLVER_N_CELLS / B3_SOLVER_N_BATCHES;
- for (int wgIdx=0;wgIdx<numWorkgroups;wgIdx++)
+ for (int wgIdx = 0; wgIdx < numWorkgroups; wgIdx++)
{
- int zIdx = (wgIdx/((nSplitX*nSplitY)/4))*2+((cellBatch&4)>>2);
- int remain= (wgIdx%((nSplitX*nSplitY)/4));
- int yIdx = (remain/(nSplitX/2))*2 + ((cellBatch&2)>>1);
- int xIdx = (remain%(nSplitX/2))*2 + (cellBatch&1);
-
- int cellIdx = xIdx+yIdx*nSplitX+zIdx*(nSplitX*nSplitY);
-
- if( numConstraintsHost[cellIdx] == 0 )
+ int zIdx = (wgIdx / ((nSplitX * nSplitY) / 4)) * 2 + ((cellBatch & 4) >> 2);
+ int remain = (wgIdx % ((nSplitX * nSplitY) / 4));
+ int yIdx = (remain / (nSplitX / 2)) * 2 + ((cellBatch & 2) >> 1);
+ int xIdx = (remain % (nSplitX / 2)) * 2 + (cellBatch & 1);
+
+ int cellIdx = xIdx + yIdx * nSplitX + zIdx * (nSplitX * nSplitY);
+
+ if (numConstraintsHost[cellIdx] == 0)
continue;
-
+
//printf("yIdx=%d\n",yIdx);
-
+
const int start = offsetsHost[cellIdx];
int numConstraintsInCell = numConstraintsHost[cellIdx];
- // const int end = start + numConstraintsInCell;
+ // const int end = start + numConstraintsInCell;
- SolveTask task( bodyNative, shapeNative, constraintNative, start, numConstraintsInCell,maxNumBatches, 0,0,batchSizes,cellIdx);
+ SolveTask task(bodyNative, shapeNative, constraintNative, start, numConstraintsInCell, maxNumBatches, 0, 0, batchSizes, cellIdx);
task.m_solveFriction = true;
task.run(0);
-
}
}
}
-
-
- } else
+ }
+ else
{
- for(int iter=0; iter<m_nIterations; iter++)
+ for (int iter = 0; iter < m_nIterations; iter++)
{
- SolveTask task( bodyNative, shapeNative, constraintNative, 0, n ,maxNumBatches,0,0,0,0);
+ SolveTask task(bodyNative, shapeNative, constraintNative, 0, n, maxNumBatches, 0, 0, 0, 0);
task.m_solveFriction = false;
task.run(0);
}
- for(int iter=0; iter<m_nIterations; iter++)
+ for (int iter = 0; iter < m_nIterations; iter++)
{
- SolveTask task( bodyNative, shapeNative, constraintNative, 0, n ,maxNumBatches,0,0,0,0);
+ SolveTask task(bodyNative, shapeNative, constraintNative, 0, n, maxNumBatches, 0, 0, 0, 0);
task.m_solveFriction = true;
task.run(0);
}
@@ -688,23 +634,21 @@ void b3Solver::solveContactConstraintHost( b3OpenCLArray<b3RigidBodyData>* body
shapeBuf->copyFromHost(shapeNative);
constraint->copyFromHost(constraintNative);
frame++;
-
}
void checkConstraintBatch(const b3OpenCLArray<b3RigidBodyData>* bodyBuf,
- const b3OpenCLArray<b3InertiaData>* shapeBuf,
- b3OpenCLArray<b3GpuConstraint4>* constraint,
- b3OpenCLArray<unsigned int>* m_numConstraints,
- b3OpenCLArray<unsigned int>* m_offsets,
- int batchId
- )
+ const b3OpenCLArray<b3InertiaData>* shapeBuf,
+ b3OpenCLArray<b3GpuConstraint4>* constraint,
+ b3OpenCLArray<unsigned int>* m_numConstraints,
+ b3OpenCLArray<unsigned int>* m_offsets,
+ int batchId)
{
-// b3BufferInfoCL( m_numConstraints->getBufferCL() ),
-// b3BufferInfoCL( m_offsets->getBufferCL() )
-
+ // b3BufferInfoCL( m_numConstraints->getBufferCL() ),
+ // b3BufferInfoCL( m_offsets->getBufferCL() )
+
int cellBatch = batchId;
const int nn = B3_SOLVER_N_CELLS;
-// int numWorkItems = 64*nn/B3_SOLVER_N_BATCHES;
+ // int numWorkItems = 64*nn/B3_SOLVER_N_BATCHES;
b3AlignedObjectArray<unsigned int> gN;
m_numConstraints->copyToHost(gN);
@@ -712,243 +656,220 @@ void checkConstraintBatch(const b3OpenCLArray<b3RigidBodyData>* bodyBuf,
m_offsets->copyToHost(gOffsets);
int nSplitX = B3_SOLVER_N_SPLIT_X;
int nSplitY = B3_SOLVER_N_SPLIT_Y;
-
-// int bIdx = batchId;
+
+ // int bIdx = batchId;
b3AlignedObjectArray<b3GpuConstraint4> cpuConstraints;
constraint->copyToHost(cpuConstraints);
printf("batch = %d\n", batchId);
- int numWorkgroups = nn/B3_SOLVER_N_BATCHES;
+ int numWorkgroups = nn / B3_SOLVER_N_BATCHES;
b3AlignedObjectArray<int> usedBodies;
-
- for (int wgIdx=0;wgIdx<numWorkgroups;wgIdx++)
+ for (int wgIdx = 0; wgIdx < numWorkgroups; wgIdx++)
{
printf("wgIdx = %d ", wgIdx);
- int zIdx = (wgIdx/((nSplitX*nSplitY))/2)*2+((cellBatch&4)>>2);
- int remain = wgIdx%((nSplitX*nSplitY));
- int yIdx = (remain%(nSplitX/2))*2 + ((cellBatch&2)>>1);
- int xIdx = (remain/(nSplitX/2))*2 + (cellBatch&1);
+ int zIdx = (wgIdx / ((nSplitX * nSplitY)) / 2) * 2 + ((cellBatch & 4) >> 2);
+ int remain = wgIdx % ((nSplitX * nSplitY));
+ int yIdx = (remain % (nSplitX / 2)) * 2 + ((cellBatch & 2) >> 1);
+ int xIdx = (remain / (nSplitX / 2)) * 2 + (cellBatch & 1);
-
- int cellIdx = xIdx+yIdx*nSplitX+zIdx*(nSplitX*nSplitY);
- printf("cellIdx=%d\n",cellIdx);
- if( gN[cellIdx] == 0 )
+ int cellIdx = xIdx + yIdx * nSplitX + zIdx * (nSplitX * nSplitY);
+ printf("cellIdx=%d\n", cellIdx);
+ if (gN[cellIdx] == 0)
continue;
const int start = gOffsets[cellIdx];
const int end = start + gN[cellIdx];
- for (int c=start;c<end;c++)
+ for (int c = start; c < end; c++)
{
b3GpuConstraint4& constraint = cpuConstraints[c];
//printf("constraint (%d,%d)\n", constraint.m_bodyA,constraint.m_bodyB);
- if (usedBodies.findLinearSearch(constraint.m_bodyA)< usedBodies.size())
+ if (usedBodies.findLinearSearch(constraint.m_bodyA) < usedBodies.size())
{
printf("error?\n");
}
- if (usedBodies.findLinearSearch(constraint.m_bodyB)< usedBodies.size())
+ if (usedBodies.findLinearSearch(constraint.m_bodyB) < usedBodies.size())
{
printf("error?\n");
}
}
- for (int c=start;c<end;c++)
+ for (int c = start; c < end; c++)
{
b3GpuConstraint4& constraint = cpuConstraints[c];
usedBodies.push_back(constraint.m_bodyA);
usedBodies.push_back(constraint.m_bodyB);
}
-
}
}
-static bool verify=false;
+static bool verify = false;
-void b3Solver::solveContactConstraint( const b3OpenCLArray<b3RigidBodyData>* bodyBuf, const b3OpenCLArray<b3InertiaData>* shapeBuf,
- b3OpenCLArray<b3GpuConstraint4>* constraint, void* additionalData, int n ,int maxNumBatches)
+void b3Solver::solveContactConstraint(const b3OpenCLArray<b3RigidBodyData>* bodyBuf, const b3OpenCLArray<b3InertiaData>* shapeBuf,
+ b3OpenCLArray<b3GpuConstraint4>* constraint, void* additionalData, int n, int maxNumBatches)
{
-
-
- b3Int4 cdata = b3MakeInt4( n, 0, 0, 0 );
+ b3Int4 cdata = b3MakeInt4(n, 0, 0, 0);
{
-
const int nn = B3_SOLVER_N_CELLS;
cdata.x = 0;
- cdata.y = maxNumBatches;//250;
-
+ cdata.y = maxNumBatches; //250;
- int numWorkItems = 64*nn/B3_SOLVER_N_BATCHES;
+ int numWorkItems = 64 * nn / B3_SOLVER_N_BATCHES;
#ifdef DEBUG_ME
- SolverDebugInfo* debugInfo = new SolverDebugInfo[numWorkItems];
- adl::b3OpenCLArray<SolverDebugInfo> gpuDebugInfo(data->m_device,numWorkItems);
+ SolverDebugInfo* debugInfo = new SolverDebugInfo[numWorkItems];
+ adl::b3OpenCLArray<SolverDebugInfo> gpuDebugInfo(data->m_device, numWorkItems);
#endif
-
-
{
-
B3_PROFILE("m_batchSolveKernel iterations");
- for(int iter=0; iter<m_nIterations; iter++)
+ for (int iter = 0; iter < m_nIterations; iter++)
{
- for(int ib=0; ib<B3_SOLVER_N_BATCHES; ib++)
+ for (int ib = 0; ib < B3_SOLVER_N_BATCHES; ib++)
{
-
if (verify)
{
- checkConstraintBatch(bodyBuf,shapeBuf,constraint,m_numConstraints,m_offsets,ib);
+ checkConstraintBatch(bodyBuf, shapeBuf, constraint, m_numConstraints, m_offsets, ib);
}
#ifdef DEBUG_ME
- memset(debugInfo,0,sizeof(SolverDebugInfo)*numWorkItems);
- gpuDebugInfo.write(debugInfo,numWorkItems);
+ memset(debugInfo, 0, sizeof(SolverDebugInfo) * numWorkItems);
+ gpuDebugInfo.write(debugInfo, numWorkItems);
#endif
-
cdata.z = ib;
-
- b3LauncherCL launcher( m_queue, m_solveContactKernel ,"m_solveContactKernel");
+ b3LauncherCL launcher(m_queue, m_solveContactKernel, "m_solveContactKernel");
#if 1
-
- b3BufferInfoCL bInfo[] = {
-
- b3BufferInfoCL( bodyBuf->getBufferCL() ),
- b3BufferInfoCL( shapeBuf->getBufferCL() ),
- b3BufferInfoCL( constraint->getBufferCL() ),
- b3BufferInfoCL( m_numConstraints->getBufferCL() ),
- b3BufferInfoCL( m_offsets->getBufferCL() )
+
+ b3BufferInfoCL bInfo[] = {
+
+ b3BufferInfoCL(bodyBuf->getBufferCL()),
+ b3BufferInfoCL(shapeBuf->getBufferCL()),
+ b3BufferInfoCL(constraint->getBufferCL()),
+ b3BufferInfoCL(m_numConstraints->getBufferCL()),
+ b3BufferInfoCL(m_offsets->getBufferCL())
#ifdef DEBUG_ME
- , b3BufferInfoCL(&gpuDebugInfo)
+ ,
+ b3BufferInfoCL(&gpuDebugInfo)
#endif
- };
-
-
+ };
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
//launcher.setConst( cdata.x );
- launcher.setConst( cdata.y );
- launcher.setConst( cdata.z );
- b3Int4 nSplit;
+ launcher.setConst(cdata.y);
+ launcher.setConst(cdata.z);
+ b3Int4 nSplit;
nSplit.x = B3_SOLVER_N_SPLIT_X;
nSplit.y = B3_SOLVER_N_SPLIT_Y;
nSplit.z = B3_SOLVER_N_SPLIT_Z;
- launcher.setConst( nSplit );
- launcher.launch1D( numWorkItems, 64 );
+ launcher.setConst(nSplit);
+ launcher.launch1D(numWorkItems, 64);
-
#else
- const char* fileName = "m_batchSolveKernel.bin";
- FILE* f = fopen(fileName,"rb");
- if (f)
- {
- int sizeInBytes=0;
- if (fseek(f, 0, SEEK_END) || (sizeInBytes = ftell(f)) == EOF || fseek(f, 0, SEEK_SET))
- {
- printf("error, cannot get file size\n");
- exit(0);
- }
-
- unsigned char* buf = (unsigned char*) malloc(sizeInBytes);
- fread(buf,sizeInBytes,1,f);
- int serializedBytes = launcher.deserializeArgs(buf, sizeInBytes,m_context);
- int num = *(int*)&buf[serializedBytes];
-
- launcher.launch1D( num);
-
- //this clFinish is for testing on errors
- clFinish(m_queue);
- }
+ const char* fileName = "m_batchSolveKernel.bin";
+ FILE* f = fopen(fileName, "rb");
+ if (f)
+ {
+ int sizeInBytes = 0;
+ if (fseek(f, 0, SEEK_END) || (sizeInBytes = ftell(f)) == EOF || fseek(f, 0, SEEK_SET))
+ {
+ printf("error, cannot get file size\n");
+ exit(0);
+ }
+
+ unsigned char* buf = (unsigned char*)malloc(sizeInBytes);
+ fread(buf, sizeInBytes, 1, f);
+ int serializedBytes = launcher.deserializeArgs(buf, sizeInBytes, m_context);
+ int num = *(int*)&buf[serializedBytes];
+
+ launcher.launch1D(num);
+
+ //this clFinish is for testing on errors
+ clFinish(m_queue);
+ }
#endif
-
#ifdef DEBUG_ME
clFinish(m_queue);
- gpuDebugInfo.read(debugInfo,numWorkItems);
+ gpuDebugInfo.read(debugInfo, numWorkItems);
clFinish(m_queue);
- for (int i=0;i<numWorkItems;i++)
+ for (int i = 0; i < numWorkItems; i++)
{
- if (debugInfo[i].m_valInt2>0)
+ if (debugInfo[i].m_valInt2 > 0)
{
- printf("debugInfo[i].m_valInt2 = %d\n",i,debugInfo[i].m_valInt2);
+ printf("debugInfo[i].m_valInt2 = %d\n", i, debugInfo[i].m_valInt2);
}
- if (debugInfo[i].m_valInt3>0)
+ if (debugInfo[i].m_valInt3 > 0)
{
- printf("debugInfo[i].m_valInt3 = %d\n",i,debugInfo[i].m_valInt3);
+ printf("debugInfo[i].m_valInt3 = %d\n", i, debugInfo[i].m_valInt3);
}
}
-#endif //DEBUG_ME
-
-
+#endif //DEBUG_ME
}
}
-
- clFinish(m_queue);
-
+ clFinish(m_queue);
}
cdata.x = 1;
- bool applyFriction=true;
+ bool applyFriction = true;
if (applyFriction)
- {
+ {
B3_PROFILE("m_batchSolveKernel iterations2");
- for(int iter=0; iter<m_nIterations; iter++)
+ for (int iter = 0; iter < m_nIterations; iter++)
{
- for(int ib=0; ib<B3_SOLVER_N_BATCHES; ib++)
+ for (int ib = 0; ib < B3_SOLVER_N_BATCHES; ib++)
{
cdata.z = ib;
-
-
- b3BufferInfoCL bInfo[] = {
- b3BufferInfoCL( bodyBuf->getBufferCL() ),
- b3BufferInfoCL( shapeBuf->getBufferCL() ),
- b3BufferInfoCL( constraint->getBufferCL() ),
- b3BufferInfoCL( m_numConstraints->getBufferCL() ),
- b3BufferInfoCL( m_offsets->getBufferCL() )
+
+ b3BufferInfoCL bInfo[] = {
+ b3BufferInfoCL(bodyBuf->getBufferCL()),
+ b3BufferInfoCL(shapeBuf->getBufferCL()),
+ b3BufferInfoCL(constraint->getBufferCL()),
+ b3BufferInfoCL(m_numConstraints->getBufferCL()),
+ b3BufferInfoCL(m_offsets->getBufferCL())
#ifdef DEBUG_ME
- ,b3BufferInfoCL(&gpuDebugInfo)
-#endif //DEBUG_ME
+ ,
+ b3BufferInfoCL(&gpuDebugInfo)
+#endif //DEBUG_ME
};
- b3LauncherCL launcher( m_queue, m_solveFrictionKernel,"m_solveFrictionKernel" );
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
+ b3LauncherCL launcher(m_queue, m_solveFrictionKernel, "m_solveFrictionKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
//launcher.setConst( cdata.x );
- launcher.setConst( cdata.y );
- launcher.setConst( cdata.z );
- b3Int4 nSplit;
+ launcher.setConst(cdata.y);
+ launcher.setConst(cdata.z);
+ b3Int4 nSplit;
nSplit.x = B3_SOLVER_N_SPLIT_X;
nSplit.y = B3_SOLVER_N_SPLIT_Y;
nSplit.z = B3_SOLVER_N_SPLIT_Z;
- launcher.setConst( nSplit );
-
- launcher.launch1D( 64*nn/B3_SOLVER_N_BATCHES, 64 );
+ launcher.setConst(nSplit);
+
+ launcher.launch1D(64 * nn / B3_SOLVER_N_BATCHES, 64);
}
}
clFinish(m_queue);
-
}
#ifdef DEBUG_ME
delete[] debugInfo;
-#endif //DEBUG_ME
+#endif //DEBUG_ME
}
-
-
}
-void b3Solver::convertToConstraints( const b3OpenCLArray<b3RigidBodyData>* bodyBuf,
- const b3OpenCLArray<b3InertiaData>* shapeBuf,
- b3OpenCLArray<b3Contact4>* contactsIn, b3OpenCLArray<b3GpuConstraint4>* contactCOut, void* additionalData,
- int nContacts, const ConstraintCfg& cfg )
+void b3Solver::convertToConstraints(const b3OpenCLArray<b3RigidBodyData>* bodyBuf,
+ const b3OpenCLArray<b3InertiaData>* shapeBuf,
+ b3OpenCLArray<b3Contact4>* contactsIn, b3OpenCLArray<b3GpuConstraint4>* contactCOut, void* additionalData,
+ int nContacts, const ConstraintCfg& cfg)
{
-// b3OpenCLArray<b3GpuConstraint4>* constraintNative =0;
+ // b3OpenCLArray<b3GpuConstraint4>* constraintNative =0;
contactCOut->resize(nContacts);
struct CB
{
@@ -959,30 +880,28 @@ void b3Solver::convertToConstraints( const b3OpenCLArray<b3RigidBodyData>* bodyB
};
{
-
CB cdata;
cdata.m_nContacts = nContacts;
cdata.m_dt = cfg.m_dt;
cdata.m_positionDrift = cfg.m_positionDrift;
cdata.m_positionConstraintCoeff = cfg.m_positionConstraintCoeff;
-
if (gConvertConstraintOnCpu)
{
b3AlignedObjectArray<b3RigidBodyData> gBodies;
- bodyBuf->copyToHost(gBodies);
+ bodyBuf->copyToHost(gBodies);
- b3AlignedObjectArray<b3Contact4> gContact;
- contactsIn->copyToHost(gContact);
+ b3AlignedObjectArray<b3Contact4> gContact;
+ contactsIn->copyToHost(gContact);
+
+ b3AlignedObjectArray<b3InertiaData> gShapes;
+ shapeBuf->copyToHost(gShapes);
+
+ b3AlignedObjectArray<b3GpuConstraint4> gConstraintOut;
+ gConstraintOut.resize(nContacts);
- b3AlignedObjectArray<b3InertiaData> gShapes;
- shapeBuf->copyToHost(gShapes);
-
- b3AlignedObjectArray<b3GpuConstraint4> gConstraintOut;
- gConstraintOut.resize(nContacts);
-
B3_PROFILE("cpu contactToConstraintKernel");
- for (int gIdx=0;gIdx<nContacts;gIdx++)
+ for (int gIdx = 0; gIdx < nContacts; gIdx++)
{
int aIdx = abs(gContact[gIdx].m_bodyAPtrAndSignBit);
int bIdx = abs(gContact[gIdx].m_bodyBPtrAndSignBit);
@@ -1001,40 +920,36 @@ void b3Solver::convertToConstraints( const b3OpenCLArray<b3RigidBodyData>* bodyB
b3ContactConstraint4_t cs;
- setConstraint4( posA, linVelA, angVelA, invMassA, invInertiaA, posB, linVelB, angVelB, invMassB, invInertiaB,
- &gContact[gIdx], cdata.m_dt, cdata.m_positionDrift, cdata.m_positionConstraintCoeff,
- &cs );
-
+ setConstraint4(posA, linVelA, angVelA, invMassA, invInertiaA, posB, linVelB, angVelB, invMassB, invInertiaB,
+ &gContact[gIdx], cdata.m_dt, cdata.m_positionDrift, cdata.m_positionConstraintCoeff,
+ &cs);
+
cs.m_batchIdx = gContact[gIdx].m_batchIdx;
gConstraintOut[gIdx] = (b3GpuConstraint4&)cs;
}
contactCOut->copyFromHost(gConstraintOut);
-
- } else
+ }
+ else
{
B3_PROFILE("gpu m_contactToConstraintKernel");
-
- b3BufferInfoCL bInfo[] = { b3BufferInfoCL( contactsIn->getBufferCL() ), b3BufferInfoCL( bodyBuf->getBufferCL() ), b3BufferInfoCL( shapeBuf->getBufferCL()),
- b3BufferInfoCL( contactCOut->getBufferCL() )};
- b3LauncherCL launcher( m_queue, m_contactToConstraintKernel,"m_contactToConstraintKernel" );
- launcher.setBuffers( bInfo, sizeof(bInfo)/sizeof(b3BufferInfoCL) );
+ b3BufferInfoCL bInfo[] = {b3BufferInfoCL(contactsIn->getBufferCL()), b3BufferInfoCL(bodyBuf->getBufferCL()), b3BufferInfoCL(shapeBuf->getBufferCL()),
+ b3BufferInfoCL(contactCOut->getBufferCL())};
+ b3LauncherCL launcher(m_queue, m_contactToConstraintKernel, "m_contactToConstraintKernel");
+ launcher.setBuffers(bInfo, sizeof(bInfo) / sizeof(b3BufferInfoCL));
//launcher.setConst( cdata );
-
+
launcher.setConst(cdata.m_nContacts);
launcher.setConst(cdata.m_dt);
launcher.setConst(cdata.m_positionDrift);
launcher.setConst(cdata.m_positionConstraintCoeff);
-
- launcher.launch1D( nContacts, 64 );
- clFinish(m_queue);
+ launcher.launch1D(nContacts, 64);
+ clFinish(m_queue);
}
}
-
-
}
/*
@@ -1115,28 +1030,24 @@ void b3Solver::sortContacts( const b3OpenCLArray<b3RigidBodyData>* bodyBuf,
}
*/
-void b3Solver::batchContacts( b3OpenCLArray<b3Contact4>* contacts, int nContacts, b3OpenCLArray<unsigned int>* nNative, b3OpenCLArray<unsigned int>* offsetsNative, int staticIdx )
+void b3Solver::batchContacts(b3OpenCLArray<b3Contact4>* contacts, int nContacts, b3OpenCLArray<unsigned int>* nNative, b3OpenCLArray<unsigned int>* offsetsNative, int staticIdx)
{
-
- int numWorkItems = 64*B3_SOLVER_N_CELLS;
+ int numWorkItems = 64 * B3_SOLVER_N_CELLS;
{
B3_PROFILE("batch generation");
-
+
b3Int4 cdata;
cdata.x = nContacts;
cdata.y = 0;
cdata.z = staticIdx;
-
#ifdef BATCH_DEBUG
- SolverDebugInfo* debugInfo = new SolverDebugInfo[numWorkItems];
- adl::b3OpenCLArray<SolverDebugInfo> gpuDebugInfo(data->m_device,numWorkItems);
- memset(debugInfo,0,sizeof(SolverDebugInfo)*numWorkItems);
- gpuDebugInfo.write(debugInfo,numWorkItems);
+ SolverDebugInfo* debugInfo = new SolverDebugInfo[numWorkItems];
+ adl::b3OpenCLArray<SolverDebugInfo> gpuDebugInfo(data->m_device, numWorkItems);
+ memset(debugInfo, 0, sizeof(SolverDebugInfo) * numWorkItems);
+ gpuDebugInfo.write(debugInfo, numWorkItems);
#endif
-
-
#if 0
b3BufferInfoCL bInfo[] = {
b3BufferInfoCL( contacts->getBufferCL() ),
@@ -1148,8 +1059,6 @@ void b3Solver::batchContacts( b3OpenCLArray<b3Contact4>* contacts, int nContact
#endif
};
#endif
-
-
{
m_batchSizes.resize(nNative->size());
@@ -1157,22 +1066,21 @@ void b3Solver::batchContacts( b3OpenCLArray<b3Contact4>* contacts, int nContact
//b3LauncherCL launcher( m_queue, m_batchingKernel);
cl_kernel k = useNewBatchingKernel ? m_batchingKernelNew : m_batchingKernel;
- b3LauncherCL launcher( m_queue, k,"*batchingKernel");
- if (!useNewBatchingKernel )
+ b3LauncherCL launcher(m_queue, k, "*batchingKernel");
+ if (!useNewBatchingKernel)
{
- launcher.setBuffer( contacts->getBufferCL() );
+ launcher.setBuffer(contacts->getBufferCL());
}
- launcher.setBuffer( m_contactBuffer2->getBufferCL() );
- launcher.setBuffer( nNative->getBufferCL());
- launcher.setBuffer( offsetsNative->getBufferCL());
-
+ launcher.setBuffer(m_contactBuffer2->getBufferCL());
+ launcher.setBuffer(nNative->getBufferCL());
+ launcher.setBuffer(offsetsNative->getBufferCL());
+
launcher.setBuffer(m_batchSizes.getBufferCL());
-
//launcher.setConst( cdata );
- launcher.setConst(staticIdx);
-
- launcher.launch1D( numWorkItems, 64 );
+ launcher.setConst(staticIdx);
+
+ launcher.launch1D(numWorkItems, 64);
//clFinish(m_queue);
//b3AlignedObjectArray<int> batchSizesCPU;
//m_batchSizes.copyToHost(batchSizesCPU);
@@ -1180,46 +1088,41 @@ void b3Solver::batchContacts( b3OpenCLArray<b3Contact4>* contacts, int nContact
}
#ifdef BATCH_DEBUG
- aaaa
- b3Contact4* hostContacts = new b3Contact4[nContacts];
- m_contactBuffer->read(hostContacts,nContacts);
+ aaaa
+ b3Contact4* hostContacts = new b3Contact4[nContacts];
+ m_contactBuffer->read(hostContacts, nContacts);
clFinish(m_queue);
- gpuDebugInfo.read(debugInfo,numWorkItems);
+ gpuDebugInfo.read(debugInfo, numWorkItems);
clFinish(m_queue);
- for (int i=0;i<numWorkItems;i++)
+ for (int i = 0; i < numWorkItems; i++)
{
- if (debugInfo[i].m_valInt1>0)
+ if (debugInfo[i].m_valInt1 > 0)
{
printf("catch\n");
}
- if (debugInfo[i].m_valInt2>0)
+ if (debugInfo[i].m_valInt2 > 0)
{
printf("catch22\n");
}
- if (debugInfo[i].m_valInt3>0)
+ if (debugInfo[i].m_valInt3 > 0)
{
printf("catch666\n");
}
- if (debugInfo[i].m_valInt4>0)
+ if (debugInfo[i].m_valInt4 > 0)
{
printf("catch777\n");
}
}
delete[] debugInfo;
-#endif //BATCH_DEBUG
-
+#endif //BATCH_DEBUG
}
-// copy buffer to buffer
+ // copy buffer to buffer
//b3Assert(m_contactBuffer->size()==nContacts);
//contacts->copyFromOpenCLArray( *m_contactBuffer);
//clFinish(m_queue);//needed?
-
-
-
}
-
diff --git a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3Solver.h b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3Solver.h
index b37f2f1bec..ee63531d78 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3Solver.h
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/b3Solver.h
@@ -13,7 +13,6 @@ subject to the following restrictions:
*/
//Originally written by Takahiro Harada
-
#ifndef __ADL_SOLVER_H
#define __ADL_SOLVER_H
@@ -29,98 +28,83 @@ subject to the following restrictions:
#include "Bullet3OpenCL/Initialize/b3OpenCLUtils.h"
-
-#define B3NEXTMULTIPLEOF(num, alignment) (((num)/(alignment) + (((num)%(alignment)==0)?0:1))*(alignment))
+#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_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;
- };
-
+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<unsigned int>* m_numConstraints;
- b3OpenCLArray<unsigned int>* m_offsets;
- b3OpenCLArray<int> 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;
+public:
+ cl_context m_context;
+ cl_device_id m_device;
+ cl_command_queue m_queue;
- class b3RadixSort32CL* m_sort32;
- class b3BoundSearchCL* m_search;
- class b3PrefixScanCL* m_scan;
+ b3OpenCLArray<unsigned int>* m_numConstraints;
+ b3OpenCLArray<unsigned int>* m_offsets;
+ b3OpenCLArray<int> m_batchSizes;
- b3OpenCLArray<b3SortData>* m_sortDataBuffer;
- b3OpenCLArray<b3Contact4>* m_contactBuffer2;
+ 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;
- enum
- {
- DYNAMIC_CONTACT_ALLOCATION_THRESHOLD = 2000000,
- };
+ class b3RadixSort32CL* m_sort32;
+ class b3BoundSearchCL* m_search;
+ class b3PrefixScanCL* m_scan;
-
+ b3OpenCLArray<b3SortData>* m_sortDataBuffer;
+ b3OpenCLArray<b3Contact4>* m_contactBuffer2;
-
- b3Solver(cl_context ctx, cl_device_id device, cl_command_queue queue, int pairCapacity);
+ enum
+ {
+ DYNAMIC_CONTACT_ALLOCATION_THRESHOLD = 2000000,
+ };
- virtual ~b3Solver();
-
- void solveContactConstraint( const b3OpenCLArray<b3RigidBodyData>* bodyBuf, const b3OpenCLArray<b3InertiaData>* inertiaBuf,
- b3OpenCLArray<b3GpuConstraint4>* constraint, void* additionalData, int n ,int maxNumBatches);
+ b3Solver(cl_context ctx, cl_device_id device, cl_command_queue queue, int pairCapacity);
- void solveContactConstraintHost( b3OpenCLArray<b3RigidBodyData>* bodyBuf, b3OpenCLArray<b3InertiaData>* shapeBuf,
- b3OpenCLArray<b3GpuConstraint4>* constraint, void* additionalData, int n ,int maxNumBatches, b3AlignedObjectArray<int>* batchSizes);
+ virtual ~b3Solver();
+ void solveContactConstraint(const b3OpenCLArray<b3RigidBodyData>* bodyBuf, const b3OpenCLArray<b3InertiaData>* inertiaBuf,
+ b3OpenCLArray<b3GpuConstraint4>* constraint, void* additionalData, int n, int maxNumBatches);
- void convertToConstraints( const b3OpenCLArray<b3RigidBodyData>* bodyBuf,
- const b3OpenCLArray<b3InertiaData>* shapeBuf,
- b3OpenCLArray<b3Contact4>* contactsIn, b3OpenCLArray<b3GpuConstraint4>* contactCOut, void* additionalData,
- int nContacts, const ConstraintCfg& cfg );
+ void solveContactConstraintHost(b3OpenCLArray<b3RigidBodyData>* bodyBuf, b3OpenCLArray<b3InertiaData>* shapeBuf,
+ b3OpenCLArray<b3GpuConstraint4>* constraint, void* additionalData, int n, int maxNumBatches, b3AlignedObjectArray<int>* batchSizes);
- void batchContacts( b3OpenCLArray<b3Contact4>* contacts, int nContacts, b3OpenCLArray<unsigned int>* n, b3OpenCLArray<unsigned int>* offsets, int staticIdx );
+ void convertToConstraints(const b3OpenCLArray<b3RigidBodyData>* bodyBuf,
+ const b3OpenCLArray<b3InertiaData>* shapeBuf,
+ b3OpenCLArray<b3Contact4>* contactsIn, b3OpenCLArray<b3GpuConstraint4>* contactCOut, void* additionalData,
+ int nContacts, const ConstraintCfg& cfg);
+ void batchContacts(b3OpenCLArray<b3Contact4>* contacts, int nContacts, b3OpenCLArray<unsigned int>* n, b3OpenCLArray<unsigned int>* offsets, int staticIdx);
};
-
-
-
-#endif //__ADL_SOLVER_H
+#endif //__ADL_SOLVER_H
diff --git a/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/batchingKernels.h b/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/batchingKernels.h
index 150eedc94b..7c73c96baa 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/batchingKernels.h
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/batchingKernels.h
@@ -1,388 +1,387 @@
//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);\n"
-"}\n"
-"void writeBuf(__local u32* buff, int idx)\n"
-"{\n"
-" idx = idx % (32*CHECK_SIZE);\n"
-" int bitIdx = idx%32;\n"
-" int bufIdx = idx/32;\n"
-"// buff[bufIdx] |= (1<<bitIdx);\n"
-" atom_or( &buff[bufIdx], (1<<bitIdx) );\n"
-"}\n"
-"u32 tryWrite(__local u32* buff, int idx)\n"
-"{\n"
-" idx = idx % (32*CHECK_SIZE);\n"
-" int bitIdx = idx%32;\n"
-" int bufIdx = idx/32;\n"
-" u32 ans = (u32)atom_or( &buff[bufIdx], (1<<bitIdx) );\n"
-" return ((ans >> 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; ii<end; ii+=WG_SIZE, srcIdx+=WG_SIZE)\n"
-" {\n"
-" Elem e;\n"
-" if(srcIdx<end) e = ldsRingElem[srcIdx];\n"
-" bool done = (srcIdx<end)?false:true;\n"
-" for(int i=lIdx; i<CHECK_SIZE; i+=WG_SIZE) ldsCheckBuffer[lIdx] = 0;\n"
-" \n"
-" if( !done )\n"
-" {\n"
-" int aUsed = readBuf( ldsFixedBuffer, abs(e.m_a));\n"
-" int bUsed = readBuf( ldsFixedBuffer, abs(e.m_b));\n"
-" if( aUsed==0 && bUsed==0 )\n"
-" {\n"
-" int aAvailable=1;\n"
-" int bAvailable=1;\n"
-" int ea = abs(e.m_a);\n"
-" int eb = abs(e.m_b);\n"
-" bool aStatic = (e.m_a<0) ||(ea==m_staticIdx);\n"
-" bool bStatic = (e.m_b<0) ||(eb==m_staticIdx);\n"
-" \n"
-" if (!aStatic)\n"
-" aAvailable = tryWrite( ldsCheckBuffer, ea );\n"
-" if (!bStatic)\n"
-" bAvailable = tryWrite( ldsCheckBuffer, eb );\n"
-" \n"
-" //aAvailable = aStatic? 1: aAvailable;\n"
-" //bAvailable = bStatic? 1: bAvailable;\n"
-" bool success = (aAvailable && bAvailable);\n"
-" if(success)\n"
-" {\n"
-" \n"
-" if (!aStatic)\n"
-" writeBuf( ldsFixedBuffer, ea );\n"
-" if (!bStatic)\n"
-" writeBuf( ldsFixedBuffer, eb );\n"
-" }\n"
-" done = success;\n"
-" }\n"
-" }\n"
-" // put it aside\n"
-" if(srcIdx<end)\n"
-" {\n"
-" if( done )\n"
-" {\n"
-" int dstIdx; AtomInc1( ldsStackEnd, dstIdx );\n"
-" if( dstIdx < STACK_SIZE )\n"
-" ldsStackIdx[dstIdx] = e.m_idx;\n"
-" else{\n"
-" done = false;\n"
-" AtomAdd( ldsStackEnd, -1 );\n"
-" }\n"
-" }\n"
-" if( !done )\n"
-" {\n"
-" int dstIdx; AtomInc1( RING_END, dstIdx );\n"
-" dst[dstIdx] = e;\n"
-" }\n"
-" }\n"
-" // if filled, flush\n"
-" if( ldsStackEnd == STACK_SIZE )\n"
-" {\n"
-" for(int i=lIdx; i<STACK_SIZE; i+=WG_SIZE)\n"
-" {\n"
-" int idx = m_start + ldsStackIdx[i];\n"
-" int dstIdx; AtomInc1( ldsDstEnd, dstIdx );\n"
-" gConstraintsOut[ dstIdx ] = gConstraints[ idx ];\n"
-" gConstraintsOut[ dstIdx ].m_batchIdx = ie;\n"
-" }\n"
-" if( lIdx == 0 ) ldsStackEnd = 0;\n"
-" //for(int i=lIdx; i<CHECK_SIZE; i+=WG_SIZE) \n"
-" ldsFixedBuffer[lIdx] = 0;\n"
-" }\n"
-" }\n"
-" }\n"
-" if( lIdx == 0 ) ldsRingEnd = RING_END;\n"
-" }\n"
-" GROUP_LDS_BARRIER;\n"
-" for(int i=lIdx; i<ldsStackEnd; i+=WG_SIZE)\n"
-" {\n"
-" int idx = m_start + ldsStackIdx[i];\n"
-" int dstIdx; AtomInc1( ldsDstEnd, dstIdx );\n"
-" gConstraintsOut[ dstIdx ] = gConstraints[ idx ];\n"
-" gConstraintsOut[ dstIdx ].m_batchIdx = ie;\n"
-" }\n"
-" // in case it couldn't consume any pair. Flush them\n"
-" // todo. Serial batch worth while?\n"
-" if( ldsStackEnd == 0 )\n"
-" {\n"
-" for(int i=lIdx; i<ldsRingEnd; i+=WG_SIZE)\n"
-" {\n"
-" int idx = m_start + ldsRingElem[i].m_idx;\n"
-" int dstIdx; AtomInc1( ldsDstEnd, dstIdx );\n"
-" gConstraintsOut[ dstIdx ] = gConstraints[ idx ];\n"
-" int curBatch = 100+i;\n"
-" if (maxBatch < curBatch)\n"
-" maxBatch = curBatch;\n"
-" \n"
-" gConstraintsOut[ dstIdx ].m_batchIdx = curBatch;\n"
-" \n"
-" }\n"
-" GROUP_LDS_BARRIER;\n"
-" if( lIdx == 0 ) ldsRingEnd = 0;\n"
-" }\n"
-" if( lIdx == 0 ) ldsStackEnd = 0;\n"
-" GROUP_LDS_BARRIER;\n"
-" // termination\n"
-" if( ldsGEnd == m_n && ldsRingEnd == 0 )\n"
-" break;\n"
-" }\n"
-" if( lIdx == 0 )\n"
-" {\n"
-" if (maxBatch < ie)\n"
-" maxBatch=ie;\n"
-" batchSizes[wgIdx]=maxBatch;\n"
-" }\n"
-"}\n"
-;
+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);\n"
+ "}\n"
+ "void writeBuf(__local u32* buff, int idx)\n"
+ "{\n"
+ " idx = idx % (32*CHECK_SIZE);\n"
+ " int bitIdx = idx%32;\n"
+ " int bufIdx = idx/32;\n"
+ "// buff[bufIdx] |= (1<<bitIdx);\n"
+ " atom_or( &buff[bufIdx], (1<<bitIdx) );\n"
+ "}\n"
+ "u32 tryWrite(__local u32* buff, int idx)\n"
+ "{\n"
+ " idx = idx % (32*CHECK_SIZE);\n"
+ " int bitIdx = idx%32;\n"
+ " int bufIdx = idx/32;\n"
+ " u32 ans = (u32)atom_or( &buff[bufIdx], (1<<bitIdx) );\n"
+ " return ((ans >> 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; ii<end; ii+=WG_SIZE, srcIdx+=WG_SIZE)\n"
+ " {\n"
+ " Elem e;\n"
+ " if(srcIdx<end) e = ldsRingElem[srcIdx];\n"
+ " bool done = (srcIdx<end)?false:true;\n"
+ " for(int i=lIdx; i<CHECK_SIZE; i+=WG_SIZE) ldsCheckBuffer[lIdx] = 0;\n"
+ " \n"
+ " if( !done )\n"
+ " {\n"
+ " int aUsed = readBuf( ldsFixedBuffer, abs(e.m_a));\n"
+ " int bUsed = readBuf( ldsFixedBuffer, abs(e.m_b));\n"
+ " if( aUsed==0 && bUsed==0 )\n"
+ " {\n"
+ " int aAvailable=1;\n"
+ " int bAvailable=1;\n"
+ " int ea = abs(e.m_a);\n"
+ " int eb = abs(e.m_b);\n"
+ " bool aStatic = (e.m_a<0) ||(ea==m_staticIdx);\n"
+ " bool bStatic = (e.m_b<0) ||(eb==m_staticIdx);\n"
+ " \n"
+ " if (!aStatic)\n"
+ " aAvailable = tryWrite( ldsCheckBuffer, ea );\n"
+ " if (!bStatic)\n"
+ " bAvailable = tryWrite( ldsCheckBuffer, eb );\n"
+ " \n"
+ " //aAvailable = aStatic? 1: aAvailable;\n"
+ " //bAvailable = bStatic? 1: bAvailable;\n"
+ " bool success = (aAvailable && bAvailable);\n"
+ " if(success)\n"
+ " {\n"
+ " \n"
+ " if (!aStatic)\n"
+ " writeBuf( ldsFixedBuffer, ea );\n"
+ " if (!bStatic)\n"
+ " writeBuf( ldsFixedBuffer, eb );\n"
+ " }\n"
+ " done = success;\n"
+ " }\n"
+ " }\n"
+ " // put it aside\n"
+ " if(srcIdx<end)\n"
+ " {\n"
+ " if( done )\n"
+ " {\n"
+ " int dstIdx; AtomInc1( ldsStackEnd, dstIdx );\n"
+ " if( dstIdx < STACK_SIZE )\n"
+ " ldsStackIdx[dstIdx] = e.m_idx;\n"
+ " else{\n"
+ " done = false;\n"
+ " AtomAdd( ldsStackEnd, -1 );\n"
+ " }\n"
+ " }\n"
+ " if( !done )\n"
+ " {\n"
+ " int dstIdx; AtomInc1( RING_END, dstIdx );\n"
+ " dst[dstIdx] = e;\n"
+ " }\n"
+ " }\n"
+ " // if filled, flush\n"
+ " if( ldsStackEnd == STACK_SIZE )\n"
+ " {\n"
+ " for(int i=lIdx; i<STACK_SIZE; i+=WG_SIZE)\n"
+ " {\n"
+ " int idx = m_start + ldsStackIdx[i];\n"
+ " int dstIdx; AtomInc1( ldsDstEnd, dstIdx );\n"
+ " gConstraintsOut[ dstIdx ] = gConstraints[ idx ];\n"
+ " gConstraintsOut[ dstIdx ].m_batchIdx = ie;\n"
+ " }\n"
+ " if( lIdx == 0 ) ldsStackEnd = 0;\n"
+ " //for(int i=lIdx; i<CHECK_SIZE; i+=WG_SIZE) \n"
+ " ldsFixedBuffer[lIdx] = 0;\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " if( lIdx == 0 ) ldsRingEnd = RING_END;\n"
+ " }\n"
+ " GROUP_LDS_BARRIER;\n"
+ " for(int i=lIdx; i<ldsStackEnd; i+=WG_SIZE)\n"
+ " {\n"
+ " int idx = m_start + ldsStackIdx[i];\n"
+ " int dstIdx; AtomInc1( ldsDstEnd, dstIdx );\n"
+ " gConstraintsOut[ dstIdx ] = gConstraints[ idx ];\n"
+ " gConstraintsOut[ dstIdx ].m_batchIdx = ie;\n"
+ " }\n"
+ " // in case it couldn't consume any pair. Flush them\n"
+ " // todo. Serial batch worth while?\n"
+ " if( ldsStackEnd == 0 )\n"
+ " {\n"
+ " for(int i=lIdx; i<ldsRingEnd; i+=WG_SIZE)\n"
+ " {\n"
+ " int idx = m_start + ldsRingElem[i].m_idx;\n"
+ " int dstIdx; AtomInc1( ldsDstEnd, dstIdx );\n"
+ " gConstraintsOut[ dstIdx ] = gConstraints[ idx ];\n"
+ " int curBatch = 100+i;\n"
+ " if (maxBatch < curBatch)\n"
+ " maxBatch = curBatch;\n"
+ " \n"
+ " gConstraintsOut[ dstIdx ].m_batchIdx = curBatch;\n"
+ " \n"
+ " }\n"
+ " GROUP_LDS_BARRIER;\n"
+ " if( lIdx == 0 ) ldsRingEnd = 0;\n"
+ " }\n"
+ " if( lIdx == 0 ) ldsStackEnd = 0;\n"
+ " GROUP_LDS_BARRIER;\n"
+ " // termination\n"
+ " if( ldsGEnd == m_n && ldsRingEnd == 0 )\n"
+ " break;\n"
+ " }\n"
+ " if( lIdx == 0 )\n"
+ " {\n"
+ " if (maxBatch < ie)\n"
+ " maxBatch=ie;\n"
+ " batchSizes[wgIdx]=maxBatch;\n"
+ " }\n"
+ "}\n";
diff --git a/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/batchingKernelsNew.h b/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/batchingKernelsNew.h
index 1e5957adae..05800656cb 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/batchingKernelsNew.h
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/batchingKernelsNew.h
@@ -1,291 +1,290 @@
//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project
-static const char* batchingKernelsNewCL= \
-"/*\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"
-"#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"
-"#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<m_n;i++)\n"
-" {\n"
-" int srcIdx = i+m_start;\n"
-" int batchIndex = i;\n"
-" gConstraints[ srcIdx ].m_batchIdx = batchIndex; \n"
-" }\n"
-" }\n"
-"}\n"
-"#define CHECK_SIZE (WG_SIZE)\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);\n"
-"}\n"
-"void writeBuf(__local u32* buff, int idx)\n"
-"{\n"
-" idx = idx % (32*CHECK_SIZE);\n"
-" int bitIdx = idx%32;\n"
-" int bufIdx = idx/32;\n"
-" buff[bufIdx] |= (1<<bitIdx);\n"
-" //atom_or( &buff[bufIdx], (1<<bitIdx) );\n"
-"}\n"
-"u32 tryWrite(__local u32* buff, int idx)\n"
-"{\n"
-" idx = idx % (32*CHECK_SIZE);\n"
-" int bitIdx = idx%32;\n"
-" int bufIdx = idx/32;\n"
-" u32 ans = (u32)atom_or( &buff[bufIdx], (1<<bitIdx) );\n"
-" return ((ans >> 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; i<CHECK_SIZE; i++) \n"
-" ldsFixedBuffer[i] = 0; \n"
-" for(int i=numValidConstraints; i<numConstraints; i++)\n"
-" {\n"
-" int bodyAS = cs[i].m_bodyAPtrAndSignBit;\n"
-" int bodyBS = cs[i].m_bodyBPtrAndSignBit;\n"
-" int bodyA = abs(bodyAS);\n"
-" int bodyB = abs(bodyBS);\n"
-" bool aIsStatic = (bodyAS<0) || bodyAS==staticIdx;\n"
-" bool bIsStatic = (bodyBS<0) || bodyBS==staticIdx;\n"
-" int aUnavailable = aIsStatic ? 0 : readBuf( ldsFixedBuffer, bodyA);\n"
-" int bUnavailable = bIsStatic ? 0 : readBuf( ldsFixedBuffer, bodyB);\n"
-" \n"
-" if( aUnavailable==0 && bUnavailable==0 ) // ok\n"
-" {\n"
-" if (!aIsStatic)\n"
-" {\n"
-" writeBuf( ldsFixedBuffer, bodyA );\n"
-" }\n"
-" if (!bIsStatic)\n"
-" {\n"
-" writeBuf( ldsFixedBuffer, bodyB );\n"
-" }\n"
-" cs[i].m_batchIdx = batchIdx;\n"
-" if (i!=numValidConstraints)\n"
-" {\n"
-" tmp = cs[i];\n"
-" cs[i] = cs[numValidConstraints];\n"
-" cs[numValidConstraints] = tmp;\n"
-" }\n"
-" numValidConstraints++;\n"
-" \n"
-" nCurrentBatch++;\n"
-" if( nCurrentBatch == SIMD_WIDTH)\n"
-" {\n"
-" nCurrentBatch = 0;\n"
-" for(int i=0; i<CHECK_SIZE; i++) \n"
-" ldsFixedBuffer[i] = 0;\n"
-" \n"
-" }\n"
-" }\n"
-" }//for\n"
-" batchIdx ++;\n"
-" }//while\n"
-" \n"
-" batchSizes[wgIdx] = batchIdx;\n"
-" }//if( lIdx == 0 )\n"
-" \n"
-" //return batchIdx;\n"
-"}\n"
-;
+static const char* batchingKernelsNewCL =
+ "/*\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"
+ "#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"
+ "#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<m_n;i++)\n"
+ " {\n"
+ " int srcIdx = i+m_start;\n"
+ " int batchIndex = i;\n"
+ " gConstraints[ srcIdx ].m_batchIdx = batchIndex; \n"
+ " }\n"
+ " }\n"
+ "}\n"
+ "#define CHECK_SIZE (WG_SIZE)\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);\n"
+ "}\n"
+ "void writeBuf(__local u32* buff, int idx)\n"
+ "{\n"
+ " idx = idx % (32*CHECK_SIZE);\n"
+ " int bitIdx = idx%32;\n"
+ " int bufIdx = idx/32;\n"
+ " buff[bufIdx] |= (1<<bitIdx);\n"
+ " //atom_or( &buff[bufIdx], (1<<bitIdx) );\n"
+ "}\n"
+ "u32 tryWrite(__local u32* buff, int idx)\n"
+ "{\n"
+ " idx = idx % (32*CHECK_SIZE);\n"
+ " int bitIdx = idx%32;\n"
+ " int bufIdx = idx/32;\n"
+ " u32 ans = (u32)atom_or( &buff[bufIdx], (1<<bitIdx) );\n"
+ " return ((ans >> 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; i<CHECK_SIZE; i++) \n"
+ " ldsFixedBuffer[i] = 0; \n"
+ " for(int i=numValidConstraints; i<numConstraints; i++)\n"
+ " {\n"
+ " int bodyAS = cs[i].m_bodyAPtrAndSignBit;\n"
+ " int bodyBS = cs[i].m_bodyBPtrAndSignBit;\n"
+ " int bodyA = abs(bodyAS);\n"
+ " int bodyB = abs(bodyBS);\n"
+ " bool aIsStatic = (bodyAS<0) || bodyAS==staticIdx;\n"
+ " bool bIsStatic = (bodyBS<0) || bodyBS==staticIdx;\n"
+ " int aUnavailable = aIsStatic ? 0 : readBuf( ldsFixedBuffer, bodyA);\n"
+ " int bUnavailable = bIsStatic ? 0 : readBuf( ldsFixedBuffer, bodyB);\n"
+ " \n"
+ " if( aUnavailable==0 && bUnavailable==0 ) // ok\n"
+ " {\n"
+ " if (!aIsStatic)\n"
+ " {\n"
+ " writeBuf( ldsFixedBuffer, bodyA );\n"
+ " }\n"
+ " if (!bIsStatic)\n"
+ " {\n"
+ " writeBuf( ldsFixedBuffer, bodyB );\n"
+ " }\n"
+ " cs[i].m_batchIdx = batchIdx;\n"
+ " if (i!=numValidConstraints)\n"
+ " {\n"
+ " tmp = cs[i];\n"
+ " cs[i] = cs[numValidConstraints];\n"
+ " cs[numValidConstraints] = tmp;\n"
+ " }\n"
+ " numValidConstraints++;\n"
+ " \n"
+ " nCurrentBatch++;\n"
+ " if( nCurrentBatch == SIMD_WIDTH)\n"
+ " {\n"
+ " nCurrentBatch = 0;\n"
+ " for(int i=0; i<CHECK_SIZE; i++) \n"
+ " ldsFixedBuffer[i] = 0;\n"
+ " \n"
+ " }\n"
+ " }\n"
+ " }//for\n"
+ " batchIdx ++;\n"
+ " }//while\n"
+ " \n"
+ " batchSizes[wgIdx] = batchIdx;\n"
+ " }//if( lIdx == 0 )\n"
+ " \n"
+ " //return batchIdx;\n"
+ "}\n";
diff --git a/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/integrateKernel.h b/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/integrateKernel.h
index a5a432947c..6e9c53e161 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/integrateKernel.h
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/integrateKernel.h
@@ -1,433 +1,432 @@
//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project
-static const char* integrateKernelCL= \
-"/*\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_RIGIDBODY_DATA_H\n"
-"#define B3_RIGIDBODY_DATA_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_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"
-;
+static const char* integrateKernelCL =
+ "/*\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_RIGIDBODY_DATA_H\n"
+ "#define B3_RIGIDBODY_DATA_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_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/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/jointSolver.h b/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/jointSolver.h
index d48ecf6ea6..c94b55851e 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/jointSolver.h
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/jointSolver.h
@@ -1,721 +1,720 @@
//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;jj<numConstraintRows;jj++)\n"
-" {\n"
-" __global b3SolverConstraint* constraint = &rows[rowOffset+jj];\n"
-" resolveSingleConstraintRowGeneric(&solverBodies[constraint->m_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<numRows;i++)\n"
-" {\n"
-" int rowIndex = rowOffsets[cid]+i;\n"
-" float breakingThreshold = constraints[cid].m_breakingImpulseThreshold;\n"
-" if (fabs(rows[rowIndex].m_appliedImpulse) >= 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)<MOTIONCLAMP)\n"
-" {\n"
-" bodies[i].m_linVel += solverBodies[i].m_deltaLinearVelocity;\n"
-" }\n"
-"// if (length(solverBodies[i].m_deltaAngularVelocity)<MOTIONCLAMP)\n"
-" {\n"
-" bodies[i].m_angVel += solverBodies[i].m_deltaAngularVelocity;\n"
-" } \n"
-" }\n"
-"}\n"
-"__kernel void getInfo2Kernel(__global b3SolverConstraint* solverConstraintRows, \n"
-" __global unsigned int* infos, \n"
-" __global unsigned int* constraintRowOffsets, \n"
-" __global b3GpuGenericConstraint* constraints, \n"
-" __global b3BatchConstraint* batchConstraints, \n"
-" __global b3RigidBodyCL* bodies,\n"
-" __global BodyInertia* inertias,\n"
-" __global b3GpuSolverBody* solverBodies,\n"
-" float timeStep,\n"
-" float globalErp,\n"
-" float globalCfm,\n"
-" float globalDamping,\n"
-" int globalNumIterations,\n"
-" int numConstraints)\n"
-"{\n"
-" int i = get_global_id(0);\n"
-" if (i>=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;j<info1;j++)\n"
-" {\n"
-"// memset(&currentConstraintRow[j],0,sizeof(b3SolverConstraint));\n"
-" currentConstraintRow[j].m_angularComponentA = (float4)(0,0,0,0);\n"
-" currentConstraintRow[j].m_angularComponentB = (float4)(0,0,0,0);\n"
-" currentConstraintRow[j].m_appliedImpulse = 0.f;\n"
-" currentConstraintRow[j].m_appliedPushImpulse = 0.f;\n"
-" currentConstraintRow[j].m_cfm = 0.f;\n"
-" currentConstraintRow[j].m_contactNormal = (float4)(0,0,0,0);\n"
-" currentConstraintRow[j].m_friction = 0.f;\n"
-" currentConstraintRow[j].m_frictionIndex = 0;\n"
-" currentConstraintRow[j].m_jacDiagABInv = 0.f;\n"
-" currentConstraintRow[j].m_lowerLimit = 0.f;\n"
-" currentConstraintRow[j].m_upperLimit = 0.f;\n"
-" currentConstraintRow[j].m_originalConstraint = i;\n"
-" currentConstraintRow[j].m_overrideNumSolverIterations = 0;\n"
-" currentConstraintRow[j].m_relpos1CrossNormal = (float4)(0,0,0,0);\n"
-" currentConstraintRow[j].m_relpos2CrossNormal = (float4)(0,0,0,0);\n"
-" currentConstraintRow[j].m_rhs = 0.f;\n"
-" currentConstraintRow[j].m_rhsPenetration = 0.f;\n"
-" currentConstraintRow[j].m_solverBodyIdA = 0;\n"
-" currentConstraintRow[j].m_solverBodyIdB = 0;\n"
-" \n"
-" currentConstraintRow[j].m_lowerLimit = -B3_INFINITY;\n"
-" currentConstraintRow[j].m_upperLimit = B3_INFINITY;\n"
-" currentConstraintRow[j].m_appliedImpulse = 0.f;\n"
-" currentConstraintRow[j].m_appliedPushImpulse = 0.f;\n"
-" currentConstraintRow[j].m_solverBodyIdA = solverBodyIdA;\n"
-" currentConstraintRow[j].m_solverBodyIdB = solverBodyIdB;\n"
-" currentConstraintRow[j].m_overrideNumSolverIterations = overrideNumSolverIterations; \n"
-" }\n"
-" bodyAPtr->m_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 = &currentConstraintRow->m_contactNormal;\n"
-" info2.m_J1angularAxisFloat4 = &currentConstraintRow->m_relpos1CrossNormal;\n"
-" info2.m_J2linearAxisFloat4 = 0;\n"
-" info2.m_J2angularAxisFloat4 = &currentConstraintRow->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 = &currentConstraintRow->m_rhs;\n"
-" currentConstraintRow->m_cfm = globalCfm;\n"
-" info2.m_damping = globalDamping;\n"
-" info2.cfm = &currentConstraintRow->m_cfm;\n"
-" info2.m_lowerLimit = &currentConstraintRow->m_lowerLimit;\n"
-" info2.m_upperLimit = &currentConstraintRow->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;j<info1;j++)\n"
-" {\n"
-" __global b3SolverConstraint* solverConstraint = &currentConstraintRow[j];\n"
-" if (solverConstraint->m_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"
-;
+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;jj<numConstraintRows;jj++)\n"
+ " {\n"
+ " __global b3SolverConstraint* constraint = &rows[rowOffset+jj];\n"
+ " resolveSingleConstraintRowGeneric(&solverBodies[constraint->m_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<numRows;i++)\n"
+ " {\n"
+ " int rowIndex = rowOffsets[cid]+i;\n"
+ " float breakingThreshold = constraints[cid].m_breakingImpulseThreshold;\n"
+ " if (fabs(rows[rowIndex].m_appliedImpulse) >= 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)<MOTIONCLAMP)\n"
+ " {\n"
+ " bodies[i].m_linVel += solverBodies[i].m_deltaLinearVelocity;\n"
+ " }\n"
+ "// if (length(solverBodies[i].m_deltaAngularVelocity)<MOTIONCLAMP)\n"
+ " {\n"
+ " bodies[i].m_angVel += solverBodies[i].m_deltaAngularVelocity;\n"
+ " } \n"
+ " }\n"
+ "}\n"
+ "__kernel void getInfo2Kernel(__global b3SolverConstraint* solverConstraintRows, \n"
+ " __global unsigned int* infos, \n"
+ " __global unsigned int* constraintRowOffsets, \n"
+ " __global b3GpuGenericConstraint* constraints, \n"
+ " __global b3BatchConstraint* batchConstraints, \n"
+ " __global b3RigidBodyCL* bodies,\n"
+ " __global BodyInertia* inertias,\n"
+ " __global b3GpuSolverBody* solverBodies,\n"
+ " float timeStep,\n"
+ " float globalErp,\n"
+ " float globalCfm,\n"
+ " float globalDamping,\n"
+ " int globalNumIterations,\n"
+ " int numConstraints)\n"
+ "{\n"
+ " int i = get_global_id(0);\n"
+ " if (i>=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;j<info1;j++)\n"
+ " {\n"
+ "// memset(&currentConstraintRow[j],0,sizeof(b3SolverConstraint));\n"
+ " currentConstraintRow[j].m_angularComponentA = (float4)(0,0,0,0);\n"
+ " currentConstraintRow[j].m_angularComponentB = (float4)(0,0,0,0);\n"
+ " currentConstraintRow[j].m_appliedImpulse = 0.f;\n"
+ " currentConstraintRow[j].m_appliedPushImpulse = 0.f;\n"
+ " currentConstraintRow[j].m_cfm = 0.f;\n"
+ " currentConstraintRow[j].m_contactNormal = (float4)(0,0,0,0);\n"
+ " currentConstraintRow[j].m_friction = 0.f;\n"
+ " currentConstraintRow[j].m_frictionIndex = 0;\n"
+ " currentConstraintRow[j].m_jacDiagABInv = 0.f;\n"
+ " currentConstraintRow[j].m_lowerLimit = 0.f;\n"
+ " currentConstraintRow[j].m_upperLimit = 0.f;\n"
+ " currentConstraintRow[j].m_originalConstraint = i;\n"
+ " currentConstraintRow[j].m_overrideNumSolverIterations = 0;\n"
+ " currentConstraintRow[j].m_relpos1CrossNormal = (float4)(0,0,0,0);\n"
+ " currentConstraintRow[j].m_relpos2CrossNormal = (float4)(0,0,0,0);\n"
+ " currentConstraintRow[j].m_rhs = 0.f;\n"
+ " currentConstraintRow[j].m_rhsPenetration = 0.f;\n"
+ " currentConstraintRow[j].m_solverBodyIdA = 0;\n"
+ " currentConstraintRow[j].m_solverBodyIdB = 0;\n"
+ " \n"
+ " currentConstraintRow[j].m_lowerLimit = -B3_INFINITY;\n"
+ " currentConstraintRow[j].m_upperLimit = B3_INFINITY;\n"
+ " currentConstraintRow[j].m_appliedImpulse = 0.f;\n"
+ " currentConstraintRow[j].m_appliedPushImpulse = 0.f;\n"
+ " currentConstraintRow[j].m_solverBodyIdA = solverBodyIdA;\n"
+ " currentConstraintRow[j].m_solverBodyIdB = solverBodyIdB;\n"
+ " currentConstraintRow[j].m_overrideNumSolverIterations = overrideNumSolverIterations; \n"
+ " }\n"
+ " bodyAPtr->m_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 = &currentConstraintRow->m_contactNormal;\n"
+ " info2.m_J1angularAxisFloat4 = &currentConstraintRow->m_relpos1CrossNormal;\n"
+ " info2.m_J2linearAxisFloat4 = 0;\n"
+ " info2.m_J2angularAxisFloat4 = &currentConstraintRow->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 = &currentConstraintRow->m_rhs;\n"
+ " currentConstraintRow->m_cfm = globalCfm;\n"
+ " info2.m_damping = globalDamping;\n"
+ " info2.cfm = &currentConstraintRow->m_cfm;\n"
+ " info2.m_lowerLimit = &currentConstraintRow->m_lowerLimit;\n"
+ " info2.m_upperLimit = &currentConstraintRow->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;j<info1;j++)\n"
+ " {\n"
+ " __global b3SolverConstraint* solverConstraint = &currentConstraintRow[j];\n"
+ " if (solverConstraint->m_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/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/solveContact.h b/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/solveContact.h
index 15a049992b..6e14ad51fc 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/solveContact.h
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/solveContact.h
@@ -1,393 +1,392 @@
//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<end; )\n"
-" {\n"
-" if (gConstraints[idx].m_batchIdx == ldsCurBatch)\n"
-" {\n"
-" solveContactConstraint( gBodies, gShapes, &gConstraints[idx] );\n"
-" idx+=64;\n"
-" } else\n"
-" {\n"
-" break;\n"
-" }\n"
-" }\n"
-" GROUP_LDS_BARRIER;\n"
-" \n"
-" if( lIdx == 0 )\n"
-" {\n"
-" ldsCurBatch++;\n"
-" }\n"
-" GROUP_LDS_BARRIER;\n"
-" }\n"
-" \n"
-" \n"
-"}\n"
-"__kernel void solveSingleContactKernel(__global Body* gBodies,\n"
-" __global Shape* gShapes,\n"
-" __global Constraint4* gConstraints,\n"
-" int cellIdx,\n"
-" int batchOffset,\n"
-" int numConstraintsInBatch\n"
-" )\n"
-"{\n"
-" int index = get_global_id(0);\n"
-" if (index < numConstraintsInBatch)\n"
-" {\n"
-" int idx=batchOffset+index;\n"
-" solveContactConstraint( gBodies, gShapes, &gConstraints[idx] );\n"
-" } \n"
-"}\n"
-;
+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<end; )\n"
+ " {\n"
+ " if (gConstraints[idx].m_batchIdx == ldsCurBatch)\n"
+ " {\n"
+ " solveContactConstraint( gBodies, gShapes, &gConstraints[idx] );\n"
+ " idx+=64;\n"
+ " } else\n"
+ " {\n"
+ " break;\n"
+ " }\n"
+ " }\n"
+ " GROUP_LDS_BARRIER;\n"
+ " \n"
+ " if( lIdx == 0 )\n"
+ " {\n"
+ " ldsCurBatch++;\n"
+ " }\n"
+ " GROUP_LDS_BARRIER;\n"
+ " }\n"
+ " \n"
+ " \n"
+ "}\n"
+ "__kernel void solveSingleContactKernel(__global Body* gBodies,\n"
+ " __global Shape* gShapes,\n"
+ " __global Constraint4* gConstraints,\n"
+ " int cellIdx,\n"
+ " int batchOffset,\n"
+ " int numConstraintsInBatch\n"
+ " )\n"
+ "{\n"
+ " int index = get_global_id(0);\n"
+ " if (index < numConstraintsInBatch)\n"
+ " {\n"
+ " int idx=batchOffset+index;\n"
+ " solveContactConstraint( gBodies, gShapes, &gConstraints[idx] );\n"
+ " } \n"
+ "}\n";
diff --git a/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/solveFriction.h b/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/solveFriction.h
index eb58674f22..9707cdb25d 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/solveFriction.h
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/solveFriction.h
@@ -1,421 +1,420 @@
//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project
-static const char* solveFrictionCL= \
-"/*\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 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 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(; idx<end; )\n"
-" {\n"
-" if (gConstraints[idx].m_batchIdx == ldsCurBatch)\n"
-" {\n"
-" solveFrictionConstraint( gBodies, gShapes, &gConstraints[idx] );\n"
-" idx+=64;\n"
-" } else\n"
-" {\n"
-" break;\n"
-" }\n"
-" }\n"
-" GROUP_LDS_BARRIER;\n"
-" if( lIdx == 0 )\n"
-" {\n"
-" ldsCurBatch++;\n"
-" }\n"
-" GROUP_LDS_BARRIER;\n"
-" }\n"
-" \n"
-" \n"
-"}\n"
-"__kernel void solveSingleFrictionKernel(__global Body* gBodies,\n"
-" __global Shape* gShapes,\n"
-" __global Constraint4* gConstraints,\n"
-" int cellIdx,\n"
-" int batchOffset,\n"
-" int numConstraintsInBatch\n"
-" )\n"
-"{\n"
-" int index = get_global_id(0);\n"
-" if (index < numConstraintsInBatch)\n"
-" {\n"
-" \n"
-" int idx=batchOffset+index;\n"
-" \n"
-" solveFrictionConstraint( gBodies, gShapes, &gConstraints[idx] );\n"
-" } \n"
-"}\n"
-;
+static const char* solveFrictionCL =
+ "/*\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 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 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(; idx<end; )\n"
+ " {\n"
+ " if (gConstraints[idx].m_batchIdx == ldsCurBatch)\n"
+ " {\n"
+ " solveFrictionConstraint( gBodies, gShapes, &gConstraints[idx] );\n"
+ " idx+=64;\n"
+ " } else\n"
+ " {\n"
+ " break;\n"
+ " }\n"
+ " }\n"
+ " GROUP_LDS_BARRIER;\n"
+ " if( lIdx == 0 )\n"
+ " {\n"
+ " ldsCurBatch++;\n"
+ " }\n"
+ " GROUP_LDS_BARRIER;\n"
+ " }\n"
+ " \n"
+ " \n"
+ "}\n"
+ "__kernel void solveSingleFrictionKernel(__global Body* gBodies,\n"
+ " __global Shape* gShapes,\n"
+ " __global Constraint4* gConstraints,\n"
+ " int cellIdx,\n"
+ " int batchOffset,\n"
+ " int numConstraintsInBatch\n"
+ " )\n"
+ "{\n"
+ " int index = get_global_id(0);\n"
+ " if (index < numConstraintsInBatch)\n"
+ " {\n"
+ " \n"
+ " int idx=batchOffset+index;\n"
+ " \n"
+ " solveFrictionConstraint( gBodies, gShapes, &gConstraints[idx] );\n"
+ " } \n"
+ "}\n";
diff --git a/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/solverSetup.h b/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/solverSetup.h
index eb1834ee00..d53db03181 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/solverSetup.h
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/solverSetup.h
@@ -1,703 +1,702 @@
//this file is autogenerated using stringify.bat (premake --stringify) in the build folder of this project
-static const char* solverSetupCL= \
-"/*\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"
-"#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; i<src->m_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( i<src->m_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"
-;
+static const char* solverSetupCL =
+ "/*\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"
+ "#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; i<src->m_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( i<src->m_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/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/solverSetup2.h b/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/solverSetup2.h
index 1b5819f6cf..1e6e3579b6 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/solverSetup2.h
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/solverSetup2.h
@@ -1,601 +1,600 @@
//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"
-;
+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/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/solverUtils.h b/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/solverUtils.h
index c0173ad9f4..f4d98d9941 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/solverUtils.h
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/solverUtils.h
@@ -1,909 +1,908 @@
//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<numBodies)\n"
-" {\n"
-" if (gBodies[i].m_invMass)\n"
-" {\n"
-" int bodyOffset = offsetSplitBodies[i];\n"
-" int count = bodyCount[i];\n"
-" float factor = 1.f/((float)count);\n"
-" float4 averageLinVel = make_float4(0.f);\n"
-" float4 averageAngVel = make_float4(0.f);\n"
-" \n"
-" for (int j=0;j<count;j++)\n"
-" {\n"
-" averageLinVel += deltaLinearVelocities[bodyOffset+j]*factor;\n"
-" averageAngVel += deltaAngularVelocities[bodyOffset+j]*factor;\n"
-" }\n"
-" \n"
-" for (int j=0;j<count;j++)\n"
-" {\n"
-" deltaLinearVelocities[bodyOffset+j] = averageLinVel;\n"
-" deltaAngularVelocities[bodyOffset+j] = averageAngVel;\n"
-" }\n"
-" \n"
-" }//bodies[i].m_invMass\n"
-" }//i<numBodies\n"
-"}\n"
-"void setLinearAndAngular( float4 n, float4 r0, float4 r1, float4* linear, float4* angular0, float4* angular1)\n"
-"{\n"
-" *linear = make_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"
-"{\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, float countA, float countB)\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)*countA+(jmj2+jmj3)*countB);\n"
-"}\n"
-"void btPlaneSpace1 (float4 n, float4* p, float4* q);\n"
-" void btPlaneSpace1 (float4 n, float4* p, float4* q)\n"
-"{\n"
-" if (fabs(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"
-"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 (i<numManifolds)\n"
-" {\n"
-" solveContactConstraint( gBodies, gShapes, &gConstraints[i] ,&contactConstraintOffsets[i],offsetSplitBodies, deltaLinearVelocities, deltaAngularVelocities);\n"
-" }\n"
-"}\n"
-"void solveFrictionConstraint(__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 = 0.7f;//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"
-" {\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+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 (i<numManifolds)\n"
-" {\n"
-" solveFrictionConstraint( gBodies, gShapes, &gConstraints[i] ,&contactConstraintOffsets[i],offsetSplitBodies, deltaLinearVelocities, deltaAngularVelocities);\n"
-" }\n"
-"}\n"
-"__kernel void UpdateBodyVelocitiesKernel(__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<numBodies)\n"
-" {\n"
-" if (gBodies[i].m_invMass)\n"
-" {\n"
-" int bodyOffset = offsetSplitBodies[i];\n"
-" int count = bodyCount[i];\n"
-" if (count)\n"
-" {\n"
-" gBodies[i].m_linVel += deltaLinearVelocities[bodyOffset];\n"
-" gBodies[i].m_angVel += deltaAngularVelocities[bodyOffset];\n"
-" }\n"
-" }\n"
-" }\n"
-"}\n"
-"void setConstraint4( const float4 posA, const float4 linVelA, const float4 angVelA, float invMassA, const Matrix3x3 invInertiaA,\n"
-" const float4 posB, const float4 linVelB, const float4 angVelB, float invMassB, const Matrix3x3 invInertiaB, \n"
-" __global struct b3Contact4Data* src, float dt, float positionDrift, float positionConstraintCoeff,float countA, float countB,\n"
-" Constraint4* 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"
-" 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; i<src->m_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( i<src->m_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"
-;
+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<numBodies)\n"
+ " {\n"
+ " if (gBodies[i].m_invMass)\n"
+ " {\n"
+ " int bodyOffset = offsetSplitBodies[i];\n"
+ " int count = bodyCount[i];\n"
+ " float factor = 1.f/((float)count);\n"
+ " float4 averageLinVel = make_float4(0.f);\n"
+ " float4 averageAngVel = make_float4(0.f);\n"
+ " \n"
+ " for (int j=0;j<count;j++)\n"
+ " {\n"
+ " averageLinVel += deltaLinearVelocities[bodyOffset+j]*factor;\n"
+ " averageAngVel += deltaAngularVelocities[bodyOffset+j]*factor;\n"
+ " }\n"
+ " \n"
+ " for (int j=0;j<count;j++)\n"
+ " {\n"
+ " deltaLinearVelocities[bodyOffset+j] = averageLinVel;\n"
+ " deltaAngularVelocities[bodyOffset+j] = averageAngVel;\n"
+ " }\n"
+ " \n"
+ " }//bodies[i].m_invMass\n"
+ " }//i<numBodies\n"
+ "}\n"
+ "void setLinearAndAngular( float4 n, float4 r0, float4 r1, float4* linear, float4* angular0, float4* angular1)\n"
+ "{\n"
+ " *linear = make_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"
+ "{\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, float countA, float countB)\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)*countA+(jmj2+jmj3)*countB);\n"
+ "}\n"
+ "void btPlaneSpace1 (float4 n, float4* p, float4* q);\n"
+ " void btPlaneSpace1 (float4 n, float4* p, float4* q)\n"
+ "{\n"
+ " if (fabs(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"
+ "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 (i<numManifolds)\n"
+ " {\n"
+ " solveContactConstraint( gBodies, gShapes, &gConstraints[i] ,&contactConstraintOffsets[i],offsetSplitBodies, deltaLinearVelocities, deltaAngularVelocities);\n"
+ " }\n"
+ "}\n"
+ "void solveFrictionConstraint(__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 = 0.7f;//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"
+ " {\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+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 (i<numManifolds)\n"
+ " {\n"
+ " solveFrictionConstraint( gBodies, gShapes, &gConstraints[i] ,&contactConstraintOffsets[i],offsetSplitBodies, deltaLinearVelocities, deltaAngularVelocities);\n"
+ " }\n"
+ "}\n"
+ "__kernel void UpdateBodyVelocitiesKernel(__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<numBodies)\n"
+ " {\n"
+ " if (gBodies[i].m_invMass)\n"
+ " {\n"
+ " int bodyOffset = offsetSplitBodies[i];\n"
+ " int count = bodyCount[i];\n"
+ " if (count)\n"
+ " {\n"
+ " gBodies[i].m_linVel += deltaLinearVelocities[bodyOffset];\n"
+ " gBodies[i].m_angVel += deltaAngularVelocities[bodyOffset];\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ "}\n"
+ "void setConstraint4( const float4 posA, const float4 linVelA, const float4 angVelA, float invMassA, const Matrix3x3 invInertiaA,\n"
+ " const float4 posB, const float4 linVelB, const float4 angVelB, float invMassB, const Matrix3x3 invInertiaB, \n"
+ " __global struct b3Contact4Data* src, float dt, float positionDrift, float positionConstraintCoeff,float countA, float countB,\n"
+ " Constraint4* 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"
+ " 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; i<src->m_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( i<src->m_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/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/updateAabbsKernel.h b/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/updateAabbsKernel.h
index d70e74017a..bb949b2027 100644
--- a/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/updateAabbsKernel.h
+++ b/thirdparty/bullet/Bullet3OpenCL/RigidBody/kernels/updateAabbsKernel.h
@@ -1,483 +1,482 @@
//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"
-;
+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/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/autogenerated/bullet2.h b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/autogenerated/bullet2.h
index a6b57b1a12..eaa27dfe8f 100644
--- a/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/autogenerated/bullet2.h
+++ b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/autogenerated/bullet2.h
@@ -19,1035 +19,969 @@
// Auto generated from Bullet/Extras/HeaderGenerator/bulletGenerate.py
#ifndef __BULLET2_H__
#define __BULLET2_H__
-namespace Bullet3SerializeBullet2 {
-
+namespace Bullet3SerializeBullet2
+{
// put an empty struct in the case
-typedef struct bInvalidHandle {
+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;
- };
-
-
-}
-#endif//__BULLET2_H__ \ No newline at end of file
+} 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/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3BulletFile.cpp b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3BulletFile.cpp
index c3ceb8388c..d2a7163670 100644
--- a/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3BulletFile.cpp
+++ b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3BulletFile.cpp
@@ -17,12 +17,11 @@ subject to the following restrictions:
#include "b3Defines.h"
#include "b3DNA.h"
-#if !defined( __CELLOS_LV2__) && !defined(__MWERKS__)
+#if !defined(__CELLOS_LV2__) && !defined(__MWERKS__)
#include <memory.h>
#endif
#include <string.h>
-
// 32 && 64 bit versions
#ifdef B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
#ifdef _WIN64
@@ -31,130 +30,116 @@ extern int b3s_bulletDNAlen64;
#else
extern char b3s_bulletDNAstr[];
extern int b3s_bulletDNAlen;
-#endif //_WIN64
-#else//B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
+#endif //_WIN64
+#else //B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
extern char b3s_bulletDNAstr64[];
extern int b3s_bulletDNAlen64;
extern char b3s_bulletDNAstr[];
extern int b3s_bulletDNAlen;
-#endif //B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
+#endif //B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
using namespace bParse;
b3BulletFile::b3BulletFile()
-:bFile("", "BULLET ")
+ : bFile("", "BULLET ")
{
- mMemoryDNA = new bDNA(); //this memory gets released in the bFile::~bFile destructor,@todo not consistent with the rule 'who allocates it, has to deallocate it"
+ mMemoryDNA = new bDNA(); //this memory gets released in the bFile::~bFile destructor,@todo not consistent with the rule 'who allocates it, has to deallocate it"
m_DnaCopy = 0;
-
#ifdef B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
#ifdef _WIN64
- m_DnaCopy = (char*)b3AlignedAlloc(b3s_bulletDNAlen64,16);
- memcpy(m_DnaCopy,b3s_bulletDNAstr64,b3s_bulletDNAlen64);
- mMemoryDNA->init(m_DnaCopy,b3s_bulletDNAlen64);
-#else//_WIN64
- m_DnaCopy = (char*)b3AlignedAlloc(b3s_bulletDNAlen,16);
- memcpy(m_DnaCopy,b3s_bulletDNAstr,b3s_bulletDNAlen);
- mMemoryDNA->init(m_DnaCopy,b3s_bulletDNAlen);
-#endif//_WIN64
-#else//B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
+ m_DnaCopy = (char*)b3AlignedAlloc(b3s_bulletDNAlen64, 16);
+ memcpy(m_DnaCopy, b3s_bulletDNAstr64, b3s_bulletDNAlen64);
+ mMemoryDNA->init(m_DnaCopy, b3s_bulletDNAlen64);
+#else //_WIN64
+ m_DnaCopy = (char*)b3AlignedAlloc(b3s_bulletDNAlen, 16);
+ memcpy(m_DnaCopy, b3s_bulletDNAstr, b3s_bulletDNAlen);
+ mMemoryDNA->init(m_DnaCopy, b3s_bulletDNAlen);
+#endif //_WIN64
+#else //B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
if (VOID_IS_8)
{
- m_DnaCopy = (char*) b3AlignedAlloc(b3s_bulletDNAlen64,16);
- memcpy(m_DnaCopy,b3s_bulletDNAstr64,b3s_bulletDNAlen64);
- mMemoryDNA->init(m_DnaCopy,b3s_bulletDNAlen64);
+ m_DnaCopy = (char*)b3AlignedAlloc(b3s_bulletDNAlen64, 16);
+ memcpy(m_DnaCopy, b3s_bulletDNAstr64, b3s_bulletDNAlen64);
+ mMemoryDNA->init(m_DnaCopy, b3s_bulletDNAlen64);
}
else
{
- m_DnaCopy =(char*) b3AlignedAlloc(b3s_bulletDNAlen,16);
- memcpy(m_DnaCopy,b3s_bulletDNAstr,b3s_bulletDNAlen);
- mMemoryDNA->init(m_DnaCopy,b3s_bulletDNAlen);
+ m_DnaCopy = (char*)b3AlignedAlloc(b3s_bulletDNAlen, 16);
+ memcpy(m_DnaCopy, b3s_bulletDNAstr, b3s_bulletDNAlen);
+ mMemoryDNA->init(m_DnaCopy, b3s_bulletDNAlen);
}
-#endif//B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
+#endif //B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
}
-
-
b3BulletFile::b3BulletFile(const char* fileName)
-:bFile(fileName, "BULLET ")
+ : bFile(fileName, "BULLET ")
{
m_DnaCopy = 0;
}
-
-
-b3BulletFile::b3BulletFile(char *memoryBuffer, int len)
-:bFile(memoryBuffer,len, "BULLET ")
+b3BulletFile::b3BulletFile(char* memoryBuffer, int len)
+ : bFile(memoryBuffer, len, "BULLET ")
{
m_DnaCopy = 0;
}
-
b3BulletFile::~b3BulletFile()
{
if (m_DnaCopy)
b3AlignedFree(m_DnaCopy);
-
while (m_dataBlocks.size())
{
- char* dataBlock = m_dataBlocks[m_dataBlocks.size()-1];
+ char* dataBlock = m_dataBlocks[m_dataBlocks.size() - 1];
delete[] dataBlock;
m_dataBlocks.pop_back();
}
-
}
-
-
// ----------------------------------------------------- //
void b3BulletFile::parseData()
{
-// printf ("Building datablocks");
-// printf ("Chunk size = %d",CHUNK_HEADER_LEN);
-// printf ("File chunk size = %d",ChunkUtils::getOffset(mFlags));
+ // printf ("Building datablocks");
+ // printf ("Chunk size = %d",CHUNK_HEADER_LEN);
+ // printf ("File chunk size = %d",ChunkUtils::getOffset(mFlags));
- const bool brokenDNA = (mFlags&FD_BROKEN_DNA)!=0;
+ const bool brokenDNA = (mFlags & FD_BROKEN_DNA) != 0;
//const bool swap = (mFlags&FD_ENDIAN_SWAP)!=0;
-
mDataStart = 12;
- char *dataPtr = mFileBuffer+mDataStart;
+ char* dataPtr = mFileBuffer + mDataStart;
bChunkInd dataChunk;
dataChunk.code = 0;
-
//dataPtr += ChunkUtils::getNextBlock(&dataChunk, dataPtr, mFlags);
int seek = getNextBlock(&dataChunk, dataPtr, mFlags);
-
-
- if (mFlags &FD_ENDIAN_SWAP)
+
+ if (mFlags & FD_ENDIAN_SWAP)
swapLen(dataPtr);
//dataPtr += ChunkUtils::getOffset(mFlags);
- char *dataPtrHead = 0;
+ char* dataPtrHead = 0;
while (dataChunk.code != B3_DNA1)
{
- if (!brokenDNA || (dataChunk.code != B3_QUANTIZED_BVH_CODE) )
+ if (!brokenDNA || (dataChunk.code != B3_QUANTIZED_BVH_CODE))
{
-
// one behind
if (dataChunk.code == B3_SDNA) break;
//if (dataChunk.code == DNA1) break;
// same as (BHEAD+DATA dependency)
- dataPtrHead = dataPtr+ChunkUtils::getOffset(mFlags);
- if (dataChunk.dna_nr>=0)
+ dataPtrHead = dataPtr + ChunkUtils::getOffset(mFlags);
+ if (dataChunk.dna_nr >= 0)
{
- char *id = readStruct(dataPtrHead, dataChunk);
+ char* id = readStruct(dataPtrHead, dataChunk);
// lookup maps
if (id)
@@ -171,96 +156,91 @@ void b3BulletFile::parseData()
if (dataChunk.code == B3_SOFTBODY_CODE)
{
- m_softBodies.push_back((bStructHandle*) id);
+ m_softBodies.push_back((bStructHandle*)id);
}
-
+
if (dataChunk.code == B3_RIGIDBODY_CODE)
{
- m_rigidBodies.push_back((bStructHandle*) id);
+ m_rigidBodies.push_back((bStructHandle*)id);
}
if (dataChunk.code == B3_DYNAMICSWORLD_CODE)
{
- m_dynamicsWorldInfo.push_back((bStructHandle*) id);
+ m_dynamicsWorldInfo.push_back((bStructHandle*)id);
}
if (dataChunk.code == B3_CONSTRAINT_CODE)
{
- m_constraints.push_back((bStructHandle*) id);
+ m_constraints.push_back((bStructHandle*)id);
}
if (dataChunk.code == B3_QUANTIZED_BVH_CODE)
{
- m_bvhs.push_back((bStructHandle*) id);
+ m_bvhs.push_back((bStructHandle*)id);
}
if (dataChunk.code == B3_TRIANLGE_INFO_MAP)
{
- m_triangleInfoMaps.push_back((bStructHandle*) id);
+ m_triangleInfoMaps.push_back((bStructHandle*)id);
}
if (dataChunk.code == B3_COLLISIONOBJECT_CODE)
{
- m_collisionObjects.push_back((bStructHandle*) id);
+ m_collisionObjects.push_back((bStructHandle*)id);
}
if (dataChunk.code == B3_SHAPE_CODE)
{
- m_collisionShapes.push_back((bStructHandle*) id);
+ m_collisionShapes.push_back((bStructHandle*)id);
}
- // if (dataChunk.code == GLOB)
- // {
- // m_glob = (bStructHandle*) id;
- // }
- } else
+ // if (dataChunk.code == GLOB)
+ // {
+ // m_glob = (bStructHandle*) id;
+ // }
+ }
+ else
{
//printf("unknown chunk\n");
mLibPointers.insert(dataChunk.oldPtr, (bStructHandle*)dataPtrHead);
}
- } else
+ }
+ else
{
printf("skipping B3_QUANTIZED_BVH_CODE due to broken DNA\n");
}
-
dataPtr += seek;
- seek = getNextBlock(&dataChunk, dataPtr, mFlags);
- if (mFlags &FD_ENDIAN_SWAP)
+ seek = getNextBlock(&dataChunk, dataPtr, mFlags);
+ if (mFlags & FD_ENDIAN_SWAP)
swapLen(dataPtr);
if (seek < 0)
break;
}
-
}
-void b3BulletFile::addDataBlock(char* dataBlock)
+void b3BulletFile::addDataBlock(char* dataBlock)
{
m_dataBlocks.push_back(dataBlock);
-
}
-
-
-
-void b3BulletFile::writeDNA(FILE* fp)
+void b3BulletFile::writeDNA(FILE* fp)
{
-
bChunkInd dataChunk;
dataChunk.code = B3_DNA1;
dataChunk.dna_nr = 0;
dataChunk.nr = 1;
-#ifdef B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
+#ifdef B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
if (VOID_IS_8)
{
#ifdef _WIN64
dataChunk.len = b3s_bulletDNAlen64;
dataChunk.oldPtr = b3s_bulletDNAstr64;
- fwrite(&dataChunk,sizeof(bChunkInd),1,fp);
- fwrite(b3s_bulletDNAstr64, b3s_bulletDNAlen64,1,fp);
+ fwrite(&dataChunk, sizeof(bChunkInd), 1, fp);
+ fwrite(b3s_bulletDNAstr64, b3s_bulletDNAlen64, 1, fp);
#else
b3Assert(0);
#endif
@@ -270,43 +250,42 @@ void b3BulletFile::writeDNA(FILE* fp)
#ifndef _WIN64
dataChunk.len = b3s_bulletDNAlen;
dataChunk.oldPtr = b3s_bulletDNAstr;
- fwrite(&dataChunk,sizeof(bChunkInd),1,fp);
- fwrite(b3s_bulletDNAstr, b3s_bulletDNAlen,1,fp);
-#else//_WIN64
+ fwrite(&dataChunk, sizeof(bChunkInd), 1, fp);
+ fwrite(b3s_bulletDNAstr, b3s_bulletDNAlen, 1, fp);
+#else //_WIN64
b3Assert(0);
-#endif//_WIN64
+#endif //_WIN64
}
-#else//B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
+#else //B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
if (VOID_IS_8)
{
dataChunk.len = b3s_bulletDNAlen64;
dataChunk.oldPtr = b3s_bulletDNAstr64;
- fwrite(&dataChunk,sizeof(bChunkInd),1,fp);
- fwrite(b3s_bulletDNAstr64, b3s_bulletDNAlen64,1,fp);
+ fwrite(&dataChunk, sizeof(bChunkInd), 1, fp);
+ fwrite(b3s_bulletDNAstr64, b3s_bulletDNAlen64, 1, fp);
}
else
{
dataChunk.len = b3s_bulletDNAlen;
dataChunk.oldPtr = b3s_bulletDNAstr;
- fwrite(&dataChunk,sizeof(bChunkInd),1,fp);
- fwrite(b3s_bulletDNAstr, b3s_bulletDNAlen,1,fp);
+ fwrite(&dataChunk, sizeof(bChunkInd), 1, fp);
+ fwrite(b3s_bulletDNAstr, b3s_bulletDNAlen, 1, fp);
}
-#endif//B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
+#endif //B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
}
-
-void b3BulletFile::parse(int verboseMode)
+void b3BulletFile::parse(int verboseMode)
{
#ifdef B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
if (VOID_IS_8)
{
#ifdef _WIN64
-
+
if (m_DnaCopy)
delete m_DnaCopy;
- m_DnaCopy = (char*)b3AlignedAlloc(b3s_bulletDNAlen64,16);
- memcpy(m_DnaCopy,b3s_bulletDNAstr64,b3s_bulletDNAlen64);
- parseInternal(verboseMode,(char*)b3s_bulletDNAstr64,b3s_bulletDNAlen64);
+ m_DnaCopy = (char*)b3AlignedAlloc(b3s_bulletDNAlen64, 16);
+ memcpy(m_DnaCopy, b3s_bulletDNAstr64, b3s_bulletDNAlen64);
+ parseInternal(verboseMode, (char*)b3s_bulletDNAstr64, b3s_bulletDNAlen64);
#else
b3Assert(0);
#endif
@@ -317,93 +296,91 @@ void b3BulletFile::parse(int verboseMode)
if (m_DnaCopy)
delete m_DnaCopy;
- m_DnaCopy = (char*)b3AlignedAlloc(b3s_bulletDNAlen,16);
- memcpy(m_DnaCopy,b3s_bulletDNAstr,b3s_bulletDNAlen);
- parseInternal(verboseMode,m_DnaCopy,b3s_bulletDNAlen);
+ m_DnaCopy = (char*)b3AlignedAlloc(b3s_bulletDNAlen, 16);
+ memcpy(m_DnaCopy, b3s_bulletDNAstr, b3s_bulletDNAlen);
+ parseInternal(verboseMode, m_DnaCopy, b3s_bulletDNAlen);
#else
b3Assert(0);
#endif
}
-#else//B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
+#else //B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
if (VOID_IS_8)
{
if (m_DnaCopy)
delete m_DnaCopy;
- m_DnaCopy = (char*)b3AlignedAlloc(b3s_bulletDNAlen64,16);
- memcpy(m_DnaCopy,b3s_bulletDNAstr64,b3s_bulletDNAlen64);
- parseInternal(verboseMode,m_DnaCopy,b3s_bulletDNAlen64);
+ m_DnaCopy = (char*)b3AlignedAlloc(b3s_bulletDNAlen64, 16);
+ memcpy(m_DnaCopy, b3s_bulletDNAstr64, b3s_bulletDNAlen64);
+ parseInternal(verboseMode, m_DnaCopy, b3s_bulletDNAlen64);
}
else
{
if (m_DnaCopy)
delete m_DnaCopy;
- m_DnaCopy = (char*)b3AlignedAlloc(b3s_bulletDNAlen,16);
- memcpy(m_DnaCopy,b3s_bulletDNAstr,b3s_bulletDNAlen);
- parseInternal(verboseMode,m_DnaCopy,b3s_bulletDNAlen);
+ m_DnaCopy = (char*)b3AlignedAlloc(b3s_bulletDNAlen, 16);
+ memcpy(m_DnaCopy, b3s_bulletDNAstr, b3s_bulletDNAlen);
+ parseInternal(verboseMode, m_DnaCopy, b3s_bulletDNAlen);
}
-#endif//B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
-
+#endif //B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
+
//the parsing will convert to cpu endian
- mFlags &=~FD_ENDIAN_SWAP;
+ mFlags &= ~FD_ENDIAN_SWAP;
- int littleEndian= 1;
- littleEndian= ((char*)&littleEndian)[0];
-
- mFileBuffer[8] = littleEndian?'v':'V';
-
+ int littleEndian = 1;
+ littleEndian = ((char*)&littleEndian)[0];
+
+ mFileBuffer[8] = littleEndian ? 'v' : 'V';
}
// experimental
-int b3BulletFile::write(const char* fileName, bool fixupPointers)
+int b3BulletFile::write(const char* fileName, bool fixupPointers)
{
- FILE *fp = fopen(fileName, "wb");
+ FILE* fp = fopen(fileName, "wb");
if (fp)
{
- char header[B3_SIZEOFBLENDERHEADER] ;
+ char header[B3_SIZEOFBLENDERHEADER];
memcpy(header, m_headerString, 7);
- int endian= 1;
- endian= ((char*)&endian)[0];
+ int endian = 1;
+ endian = ((char*)&endian)[0];
if (endian)
{
header[7] = '_';
- } else
+ }
+ else
{
header[7] = '-';
}
if (VOID_IS_8)
{
- header[8]='V';
- } else
+ header[8] = 'V';
+ }
+ else
{
- header[8]='v';
+ header[8] = 'v';
}
header[9] = '2';
header[10] = '7';
header[11] = '5';
-
- fwrite(header,B3_SIZEOFBLENDERHEADER,1,fp);
+
+ fwrite(header, B3_SIZEOFBLENDERHEADER, 1, fp);
writeChunks(fp, fixupPointers);
writeDNA(fp);
fclose(fp);
-
- } else
+ }
+ else
{
- printf("Error: cannot open file %s for writing\n",fileName);
+ printf("Error: cannot open file %s for writing\n", fileName);
return 0;
}
return 1;
}
-
-
-void b3BulletFile::addStruct(const char* structType,void* data, int len, void* oldPtr, int code)
+void b3BulletFile::addStruct(const char* structType, void* data, int len, void* oldPtr, int code)
{
-
bParse::bChunkInd dataChunk;
dataChunk.code = code;
dataChunk.nr = 1;
@@ -412,11 +389,11 @@ void b3BulletFile::addStruct(const char* structType,void* data, int len, void* o
dataChunk.oldPtr = oldPtr;
///Perform structure size validation
- short* structInfo= mMemoryDNA->getStruct(dataChunk.dna_nr);
+ short* structInfo = mMemoryDNA->getStruct(dataChunk.dna_nr);
int elemBytes;
- elemBytes= mMemoryDNA->getLength(structInfo[0]);
-// int elemBytes = mMemoryDNA->getElementSize(structInfo[0],structInfo[1]);
- assert(len==elemBytes);
+ elemBytes = mMemoryDNA->getLength(structInfo[0]);
+ // int elemBytes = mMemoryDNA->getElementSize(structInfo[0],structInfo[1]);
+ assert(len == elemBytes);
mLibPointers.insert(dataChunk.oldPtr, (bStructHandle*)data);
m_chunks.push_back(dataChunk);
diff --git a/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3BulletFile.h b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3BulletFile.h
index fb1b9b0dde..ede1d378ae 100644
--- a/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3BulletFile.h
+++ b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3BulletFile.h
@@ -16,68 +16,59 @@ subject to the following restrictions:
#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<bStructHandle*> m_softBodies;
-namespace bParse {
-
- // ----------------------------------------------------- //
- class b3BulletFile : public bFile
- {
-
-
- protected:
-
- char* m_DnaCopy;
-
- public:
-
- b3AlignedObjectArray<bStructHandle*> m_softBodies;
-
- b3AlignedObjectArray<bStructHandle*> m_rigidBodies;
-
- b3AlignedObjectArray<bStructHandle*> m_collisionObjects;
+ b3AlignedObjectArray<bStructHandle*> m_rigidBodies;
- b3AlignedObjectArray<bStructHandle*> m_collisionShapes;
+ b3AlignedObjectArray<bStructHandle*> m_collisionObjects;
- b3AlignedObjectArray<bStructHandle*> m_constraints;
+ b3AlignedObjectArray<bStructHandle*> m_collisionShapes;
- b3AlignedObjectArray<bStructHandle*> m_bvhs;
+ b3AlignedObjectArray<bStructHandle*> m_constraints;
- b3AlignedObjectArray<bStructHandle*> m_triangleInfoMaps;
+ b3AlignedObjectArray<bStructHandle*> m_bvhs;
- b3AlignedObjectArray<bStructHandle*> m_dynamicsWorldInfo;
+ b3AlignedObjectArray<bStructHandle*> m_triangleInfoMaps;
- b3AlignedObjectArray<char*> m_dataBlocks;
- b3BulletFile();
+ b3AlignedObjectArray<bStructHandle*> m_dynamicsWorldInfo;
- b3BulletFile(const char* fileName);
+ b3AlignedObjectArray<char*> m_dataBlocks;
+ b3BulletFile();
- b3BulletFile(char *memoryBuffer, int len);
+ b3BulletFile(const char* fileName);
- virtual ~b3BulletFile();
+ b3BulletFile(char* memoryBuffer, int len);
- virtual void addDataBlock(char* dataBlock);
-
+ virtual ~b3BulletFile();
- // experimental
- virtual int write(const char* fileName, bool fixupPointers=false);
+ virtual void addDataBlock(char* dataBlock);
- virtual void parse(int verboseMode);
+ // experimental
+ virtual int write(const char* fileName, bool fixupPointers = false);
- virtual void parseData();
+ virtual void parse(int verboseMode);
- virtual void writeDNA(FILE* fp);
+ virtual void parseData();
- void addStruct(const char* structType,void* data, int len, void* oldPtr, int code);
+ 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
+#endif //B3_BULLET_FILE_H
diff --git a/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Chunk.cpp b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Chunk.cpp
index c0e1bb708c..ff75ff8cc4 100644
--- a/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Chunk.cpp
+++ b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Chunk.cpp
@@ -17,15 +17,13 @@ subject to the following restrictions:
#include "b3Defines.h"
#include "b3File.h"
-#if !defined( __CELLOS_LV2__) && !defined(__MWERKS__)
+#if !defined(__CELLOS_LV2__) && !defined(__MWERKS__)
#include <memory.h>
#endif
#include <string.h>
-
using namespace bParse;
-
// ----------------------------------------------------- //
short ChunkUtils::swapShort(short sht)
{
@@ -57,19 +55,15 @@ int ChunkUtils::getOffset(int flags)
if (VOID_IS_8)
{
- if (flags &FD_BITS_VARIES)
+ if (flags & FD_BITS_VARIES)
res = sizeof(bChunkPtr4);
}
else
{
- if (flags &FD_BITS_VARIES)
+ if (flags & FD_BITS_VARIES)
res = sizeof(bChunkPtr8);
}
return res;
}
-
-
-
-
//eof
diff --git a/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Chunk.h b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Chunk.h
index 03ecb6b4fa..c9d0f37d9e 100644
--- a/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Chunk.h
+++ b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Chunk.h
@@ -16,77 +16,69 @@ subject to the following restrictions:
#ifndef __BCHUNK_H__
#define __BCHUNK_H__
-#if defined (_WIN32) && ! defined (__MINGW32__)
- #define b3Long64 __int64
-#elif defined (__MINGW32__)
- #include <stdint.h>
- #define b3Long64 int64_t
+#if defined(_WIN32) && !defined(__MINGW32__)
+#define b3Long64 __int64
+#elif defined(__MINGW32__)
+#include <stdint.h>
+#define b3Long64 int64_t
#else
- #define b3Long64 long long
+#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;
+namespace bParse
+{
+// ----------------------------------------------------- //
+class bChunkPtr4
+{
+public:
+ bChunkPtr4() {}
+ int code;
+ int len;
+ union {
+ int m_uniqueInt;
};
-
-
- // ----------------------------------------------------- //
- 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);
-
+ int dna_nr;
+ int nr;
+};
+
+// ----------------------------------------------------- //
+class bChunkPtr8
+{
+public:
+ bChunkPtr8() {}
+ int code, len;
+ union {
+ b3Long64 oldPrev;
+ int m_uniqueInts[2];
};
-
-
- const int CHUNK_HEADER_LEN = ((sizeof(bChunkInd)));
- const bool VOID_IS_8 = ((sizeof(void*)==8));
-}
-
-#endif//__BCHUNK_H__
+ 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/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Common.h b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Common.h
index 2792d84033..5884fad4d6 100644
--- a/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Common.h
+++ b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Common.h
@@ -16,24 +16,25 @@ subject to the following restrictions:
#ifndef __BCOMMON_H__
#define __BCOMMON_H__
-
#include <assert.h>
//#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<bStructHandle*> bListBasePtr;
- typedef b3HashMap<b3HashPtr, bStructHandle*> bPtrMap;
-}
-
-
-#endif//__BCOMMON_H__
+namespace bParse
+{
+class bMain;
+class bFileData;
+class bFile;
+class bDNA;
+
+// delete void* undefined
+typedef struct bStructHandle
+{
+ int unused;
+} bStructHandle;
+typedef b3AlignedObjectArray<bStructHandle*> bListBasePtr;
+typedef b3HashMap<b3HashPtr, bStructHandle*> bPtrMap;
+} // namespace bParse
+
+#endif //__BCOMMON_H__
diff --git a/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3DNA.cpp b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3DNA.cpp
index 0fe5056922..09c8f23859 100644
--- a/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3DNA.cpp
+++ b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3DNA.cpp
@@ -23,13 +23,11 @@ subject to the following restrictions:
//this define will force traversal of structures, to check backward (and forward) compatibility
//#define TEST_BACKWARD_FORWARD_COMPATIBILITY
-
using namespace bParse;
-
// ----------------------------------------------------- //
bDNA::bDNA()
- : mPtrLen(0)
+ : mPtrLen(0)
{
// --
}
@@ -43,7 +41,7 @@ bDNA::~bDNA()
// ----------------------------------------------------- //
bool bDNA::lessThan(bDNA *file)
{
- return ( m_Names.size() < file->m_Names.size());
+ return (m_Names.size() < file->m_Names.size());
}
// ----------------------------------------------------- //
@@ -53,36 +51,31 @@ char *bDNA::getName(int ind)
return m_Names[ind].m_name;
}
-
// ----------------------------------------------------- //
char *bDNA::getType(int ind)
{
- assert(ind<= (int)mTypes.size());
+ assert(ind <= (int)mTypes.size());
return mTypes[ind];
}
-
// ----------------------------------------------------- //
short *bDNA::getStruct(int ind)
{
- assert(ind <= (int)mStructs.size());
+ assert(ind <= (int)mStructs.size());
return mStructs[ind];
}
-
// ----------------------------------------------------- //
short bDNA::getLength(int ind)
{
- assert(ind <= (int)mTlens.size());
+ assert(ind <= (int)mTlens.size());
return mTlens[ind];
}
-
// ----------------------------------------------------- //
int bDNA::getReverseType(short type)
{
-
- int* intPtr = mStructReverse.find(type);
+ int *intPtr = mStructReverse.find(type);
if (intPtr)
return *intPtr;
@@ -92,12 +85,11 @@ int bDNA::getReverseType(short type)
// ----------------------------------------------------- //
int bDNA::getReverseType(const char *type)
{
-
b3HashString key(type);
- int* valuePtr = mTypeLookup.find(key);
+ int *valuePtr = mTypeLookup.find(key);
if (valuePtr)
return *valuePtr;
-
+
return -1;
}
@@ -110,22 +102,22 @@ int bDNA::getNumStructs()
// ----------------------------------------------------- //
bool bDNA::flagNotEqual(int dna_nr)
{
- assert(dna_nr <= (int)mCMPFlags.size());
+ assert(dna_nr <= (int)mCMPFlags.size());
return mCMPFlags[dna_nr] == FDF_STRUCT_NEQU;
}
// ----------------------------------------------------- //
bool bDNA::flagEqual(int dna_nr)
{
- assert(dna_nr <= (int)mCMPFlags.size());
+ assert(dna_nr <= (int)mCMPFlags.size());
int flag = mCMPFlags[dna_nr];
- return flag == FDF_STRUCT_EQU;
+ return flag == FDF_STRUCT_EQU;
}
// ----------------------------------------------------- //
bool bDNA::flagNone(int dna_nr)
{
- assert(dna_nr <= (int)mCMPFlags.size());
+ assert(dna_nr <= (int)mCMPFlags.size());
return mCMPFlags[dna_nr] == FDF_NONE;
}
@@ -143,15 +135,15 @@ void bDNA::initRecurseCmpFlags(int iter)
short *oldStrc = mStructs[iter];
short type = oldStrc[0];
- for (int i=0; i<(int)mStructs.size(); i++)
+ for (int i = 0; i < (int)mStructs.size(); i++)
{
- if (i != iter && mCMPFlags[i] == FDF_STRUCT_EQU )
+ if (i != iter && mCMPFlags[i] == FDF_STRUCT_EQU)
{
short *curStruct = mStructs[i];
int eleLen = curStruct[1];
- curStruct+=2;
+ curStruct += 2;
- for (int j=0; j<eleLen; j++, curStruct+=2)
+ for (int j = 0; j < eleLen; j++, curStruct += 2)
{
if (curStruct[0] == type)
{
@@ -171,18 +163,14 @@ void bDNA::initRecurseCmpFlags(int iter)
// ----------------------------------------------------- //
void bDNA::initCmpFlags(bDNA *memDNA)
{
-
- // compare the file to memory
+ // compare the file to memory
// this ptr should be the file data
-
- assert(!(m_Names.size() == 0));// && "SDNA empty!");
+ assert(!(m_Names.size() == 0)); // && "SDNA empty!");
mCMPFlags.resize(mStructs.size(), FDF_NONE);
-
-
int i;
- for ( i=0; i<(int)mStructs.size(); i++)
+ for (i = 0; i < (int)mStructs.size(); i++)
{
short *oldStruct = mStructs[i];
@@ -196,7 +184,7 @@ void bDNA::initCmpFlags(bDNA *memDNA)
//#define SLOW_FORWARD_COMPATIBLE 1
#ifdef SLOW_FORWARD_COMPATIBLE
- char* typeName = mTypes[oldLookup];
+ char *typeName = mTypes[oldLookup];
int newLookup = memDNA->getReverseType(typeName);
if (newLookup == -1)
{
@@ -210,71 +198,61 @@ void bDNA::initCmpFlags(bDNA *memDNA)
if (oldLookup < memDNA->mStructs.size())
{
short *curStruct = memDNA->mStructs[oldLookup];
-#endif
-
-
+#endif
- // rebuild...
- mCMPFlags[i] = FDF_STRUCT_NEQU;
+ // rebuild...
+ mCMPFlags[i] = FDF_STRUCT_NEQU;
#ifndef TEST_BACKWARD_FORWARD_COMPATIBILITY
- if (curStruct[1] == oldStruct[1])
+ if (curStruct[1] == oldStruct[1])
+ {
+ // type len same ...
+ if (mTlens[oldStruct[0]] == memDNA->mTlens[curStruct[0]])
{
- // type len same ...
- if (mTlens[oldStruct[0]] == memDNA->mTlens[curStruct[0]])
- {
- bool isSame = true;
- int elementLength = oldStruct[1];
-
+ bool isSame = true;
+ int elementLength = oldStruct[1];
- curStruct+=2;
- oldStruct+=2;
+ curStruct += 2;
+ oldStruct += 2;
+ for (int j = 0; j < elementLength; j++, curStruct += 2, oldStruct += 2)
+ {
+ // type the same
+ //const char* typeFileDNA = mTypes[oldStruct[0]];
+ //const char* typeMemDNA = mTypes[curStruct[0]];
+ if (strcmp(mTypes[oldStruct[0]], memDNA->mTypes[curStruct[0]]) != 0)
+ {
+ isSame = false;
+ break;
+ }
- for (int j=0; j<elementLength; j++, curStruct+=2, oldStruct+=2)
+ // name the same
+ if (strcmp(m_Names[oldStruct[1]].m_name, memDNA->m_Names[curStruct[1]].m_name) != 0)
{
- // type the same
- //const char* typeFileDNA = mTypes[oldStruct[0]];
- //const char* typeMemDNA = mTypes[curStruct[0]];
- if (strcmp(mTypes[oldStruct[0]], memDNA->mTypes[curStruct[0]])!=0)
- {
- isSame=false;
- break;
- }
-
- // name the same
- if (strcmp(m_Names[oldStruct[1]].m_name, memDNA->m_Names[curStruct[1]].m_name)!=0)
- {
- isSame=false;
- break;
- }
+ isSame = false;
+ break;
}
- // flag valid ==
- if (isSame)
- mCMPFlags[i] = FDF_STRUCT_EQU;
}
+ // flag valid ==
+ if (isSame)
+ mCMPFlags[i] = FDF_STRUCT_EQU;
}
-#endif
}
- }
-
-
-
-
-
- // recurse in
- for ( i=0; i<(int)mStructs.size(); i++)
- {
- if (mCMPFlags[i] == FDF_STRUCT_NEQU)
- initRecurseCmpFlags(i);
+#endif
}
}
+// recurse in
+for (i = 0; i < (int)mStructs.size(); i++)
+{
+ if (mCMPFlags[i] == FDF_STRUCT_NEQU)
+ initRecurseCmpFlags(i);
+}
+}
-
-
-static int name_is_array(char* name, int* dim1, int* dim2) {
+static int name_is_array(char *name, int *dim1, int *dim2)
+{
int len = strlen(name);
/*fprintf(stderr,"[%s]",name);*/
/*if (len >= 1) {
@@ -284,58 +262,77 @@ static int name_is_array(char* name, int* dim1, int* dim2) {
return 0;*/
char *bp;
int num;
- if (dim1) {
+ if (dim1)
+ {
*dim1 = 1;
}
- if (dim2) {
+ if (dim2)
+ {
*dim2 = 1;
}
bp = strchr(name, '[');
- if (!bp) {
+ if (!bp)
+ {
return 0;
}
num = 0;
- while (++bp < name+len-1) {
+ while (++bp < name + len - 1)
+ {
const char c = *bp;
- if (c == ']') {
+ if (c == ']')
+ {
break;
}
- if (c <= '9' && c >= '0') {
+ if (c <= '9' && c >= '0')
+ {
num *= 10;
num += (c - '0');
- } else {
+ }
+ else
+ {
printf("array parse error.\n");
return 0;
}
}
- if (dim2) {
+ if (dim2)
+ {
*dim2 = num;
}
/* find second dim, if any. */
bp = strchr(bp, '[');
- if (!bp) {
+ if (!bp)
+ {
return 1; /* at least we got the first dim. */
}
num = 0;
- while (++bp < name+len-1) {
+ while (++bp < name + len - 1)
+ {
const char c = *bp;
- if (c == ']') {
+ if (c == ']')
+ {
break;
}
- if (c <= '9' && c >= '0') {
+ if (c <= '9' && c >= '0')
+ {
num *= 10;
num += (c - '0');
- } else {
+ }
+ else
+ {
printf("array2 parse error.\n");
return 1;
}
}
- if (dim1) {
- if (dim2) {
+ if (dim1)
+ {
+ if (dim2)
+ {
*dim1 = *dim2;
*dim2 = num;
- } else {
+ }
+ else
+ {
*dim1 = num;
}
}
@@ -343,14 +340,15 @@ static int name_is_array(char* name, int* dim1, int* dim2) {
return 1;
}
-
// ----------------------------------------------------- //
void bDNA::init(char *data, int len, bool swap)
{
- int *intPtr=0;short *shtPtr=0;
- char *cp = 0;int dataLen =0;
+ int *intPtr = 0;
+ short *shtPtr = 0;
+ char *cp = 0;
+ int dataLen = 0;
//long nr=0;
- intPtr = (int*)data;
+ intPtr = (int *)data;
/*
SDNA (4 bytes) (magic number)
@@ -360,38 +358,35 @@ void bDNA::init(char *data, int len, bool swap)
<string>
*/
- if (strncmp(data, "SDNA", 4)==0)
+ if (strncmp(data, "SDNA", 4) == 0)
{
// skip ++ NAME
- intPtr++; intPtr++;
+ intPtr++;
+ intPtr++;
}
-
-
// Parse names
- if (swap)
+ if (swap)
{
*intPtr = ChunkUtils::swapInt(*intPtr);
}
dataLen = *intPtr;
intPtr++;
- cp = (char*)intPtr;
+ cp = (char *)intPtr;
int i;
- for ( i=0; i<dataLen; i++)
+ for (i = 0; i < dataLen; i++)
{
bNameInfo info;
info.m_name = cp;
info.m_isPointer = (info.m_name[0] == '*') || (info.m_name[1] == '*');
- name_is_array(info.m_name,&info.m_dim0,&info.m_dim1);
+ name_is_array(info.m_name, &info.m_dim0, &info.m_dim1);
m_Names.push_back(info);
- while (*cp)cp++;
+ while (*cp) cp++;
cp++;
}
-
- cp = b3AlignPointer(cp,4);
-
+ cp = b3AlignPointer(cp, 4);
/*
TYPE (4 bytes)
@@ -400,26 +395,26 @@ void bDNA::init(char *data, int len, bool swap)
<string>
*/
- intPtr = (int*)cp;
- assert(strncmp(cp, "TYPE", 4)==0); intPtr++;
+ intPtr = (int *)cp;
+ assert(strncmp(cp, "TYPE", 4) == 0);
+ intPtr++;
- if (swap)
+ if (swap)
{
*intPtr = ChunkUtils::swapInt(*intPtr);
}
dataLen = *intPtr;
intPtr++;
- cp = (char*)intPtr;
- for ( i=0; i<dataLen; i++)
+ cp = (char *)intPtr;
+ for (i = 0; i < dataLen; i++)
{
mTypes.push_back(cp);
- while (*cp)cp++;
+ while (*cp) cp++;
cp++;
}
-
- cp = b3AlignPointer(cp,4);
+ cp = b3AlignPointer(cp, 4);
/*
TLEN (4 bytes)
@@ -428,13 +423,14 @@ void bDNA::init(char *data, int len, bool swap)
*/
// Parse type lens
- intPtr = (int*)cp;
- assert(strncmp(cp, "TLEN", 4)==0); intPtr++;
+ intPtr = (int *)cp;
+ assert(strncmp(cp, "TLEN", 4) == 0);
+ intPtr++;
dataLen = (int)mTypes.size();
- shtPtr = (short*)intPtr;
- for ( i=0; i<dataLen; i++, shtPtr++)
+ shtPtr = (short *)intPtr;
+ for (i = 0; i < dataLen; i++, shtPtr++)
{
if (swap)
shtPtr[0] = ChunkUtils::swapShort(shtPtr[0]);
@@ -454,94 +450,89 @@ void bDNA::init(char *data, int len, bool swap)
<namenr>
*/
- intPtr = (int*)shtPtr;
- cp = (char*)intPtr;
- assert(strncmp(cp, "STRC", 4)==0); intPtr++;
+ intPtr = (int *)shtPtr;
+ cp = (char *)intPtr;
+ assert(strncmp(cp, "STRC", 4) == 0);
+ intPtr++;
- if (swap)
+ if (swap)
{
*intPtr = ChunkUtils::swapInt(*intPtr);
}
dataLen = *intPtr;
intPtr++;
-
- shtPtr = (short*)intPtr;
- for ( i=0; i<dataLen; i++)
+ shtPtr = (short *)intPtr;
+ for (i = 0; i < dataLen; i++)
{
- mStructs.push_back (shtPtr);
+ mStructs.push_back(shtPtr);
if (swap)
{
- shtPtr[0]= ChunkUtils::swapShort(shtPtr[0]);
- shtPtr[1]= ChunkUtils::swapShort(shtPtr[1]);
+ shtPtr[0] = ChunkUtils::swapShort(shtPtr[0]);
+ shtPtr[1] = ChunkUtils::swapShort(shtPtr[1]);
int len = shtPtr[1];
- shtPtr+= 2;
+ shtPtr += 2;
- for (int a=0; a<len; a++, shtPtr+=2)
+ for (int a = 0; a < len; a++, shtPtr += 2)
{
- shtPtr[0]= ChunkUtils::swapShort(shtPtr[0]);
- shtPtr[1]= ChunkUtils::swapShort(shtPtr[1]);
+ shtPtr[0] = ChunkUtils::swapShort(shtPtr[0]);
+ shtPtr[1] = ChunkUtils::swapShort(shtPtr[1]);
}
}
else
- shtPtr+= (2*shtPtr[1])+2;
+ shtPtr += (2 * shtPtr[1]) + 2;
}
-
// build reverse lookups
- for ( i=0; i<(int)mStructs.size(); i++)
+ for (i = 0; i < (int)mStructs.size(); i++)
{
short *strc = mStructs.at(i);
- if (!mPtrLen && strcmp(mTypes[strc[0]],"ListBase")==0)
+ if (!mPtrLen && strcmp(mTypes[strc[0]], "ListBase") == 0)
{
- mPtrLen = mTlens[strc[0]]/2;
+ mPtrLen = mTlens[strc[0]] / 2;
}
mStructReverse.insert(strc[0], i);
- mTypeLookup.insert(b3HashString(mTypes[strc[0]]),i);
+ mTypeLookup.insert(b3HashString(mTypes[strc[0]]), i);
}
}
-
// ----------------------------------------------------- //
-int bDNA::getArraySize(char* string)
+int bDNA::getArraySize(char *string)
{
int ret = 1;
int len = strlen(string);
-
- char* next = 0;
- for (int i=0; i<len; i++)
+ char *next = 0;
+ for (int i = 0; i < len; i++)
{
char c = string[i];
if (c == '[')
- next = &string[i+1];
- else if (c==']')
+ next = &string[i + 1];
+ else if (c == ']')
if (next)
ret *= atoi(next);
}
-// print (string << ' ' << ret);
+ // print (string << ' ' << ret);
return ret;
}
-
void bDNA::dumpTypeDefinitions()
{
int i;
int numTypes = mTypes.size();
-
- for (i=0;i<numTypes;i++)
- {
+ for (i = 0; i < numTypes; i++)
+ {
}
- for ( i=0; i<(int)mStructs.size(); i++)
+ for (i = 0; i < (int)mStructs.size(); i++)
{
- int totalBytes=0;
+ int totalBytes = 0;
short *oldStruct = mStructs[i];
int oldLookup = getReverseType(oldStruct[0]);
@@ -551,44 +542,46 @@ void bDNA::dumpTypeDefinitions()
continue;
}
- short* newStruct = mStructs[oldLookup];
- char* typeName = mTypes[newStruct[0]];
- printf("%3d: %s ",i,typeName);
-
+ short *newStruct = mStructs[oldLookup];
+ char *typeName = mTypes[newStruct[0]];
+ printf("%3d: %s ", i, typeName);
+
//char *name = mNames[oldStruct[1]];
int len = oldStruct[1];
- printf(" (%d fields) ",len);
- oldStruct+=2;
+ printf(" (%d fields) ", len);
+ oldStruct += 2;
printf("{");
int j;
- for (j=0; j<len; ++j,oldStruct+=2) {
- const char* name = m_Names[oldStruct[1]].m_name;
- printf("%s %s", mTypes[oldStruct[0]],name);
- int elemNumBytes= 0;
+ for (j = 0; j < len; ++j, oldStruct += 2)
+ {
+ const char *name = m_Names[oldStruct[1]].m_name;
+ printf("%s %s", mTypes[oldStruct[0]], name);
+ int elemNumBytes = 0;
int arrayDimensions = getArraySizeNew(oldStruct[1]);
if (m_Names[oldStruct[1]].m_isPointer)
{
elemNumBytes = VOID_IS_8 ? 8 : 4;
- } else
+ }
+ else
{
elemNumBytes = getLength(oldStruct[0]);
}
- printf(" /* %d bytes */",elemNumBytes*arrayDimensions);
-
- if (j == len-1) {
+ printf(" /* %d bytes */", elemNumBytes * arrayDimensions);
+
+ if (j == len - 1)
+ {
printf(";}");
- } else {
+ }
+ else
+ {
printf("; ");
}
- totalBytes+=elemNumBytes*arrayDimensions;
+ totalBytes += elemNumBytes * arrayDimensions;
}
- printf("\ntotalBytes=%d\n\n",totalBytes);
-
+ printf("\ntotalBytes=%d\n\n", totalBytes);
}
-
-
#if 0
/* dump out display of types and their sizes */
@@ -618,12 +611,6 @@ void bDNA::dumpTypeDefinitions()
}
}
#endif
-
}
-
-
-
//eof
-
-
diff --git a/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3DNA.h b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3DNA.h
index 6e60087cce..ca6004d960 100644
--- a/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3DNA.h
+++ b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3DNA.h
@@ -16,95 +16,86 @@ subject to the following restrictions:
#ifndef __BDNA_H__
#define __BDNA_H__
-
#include "b3Common.h"
-namespace bParse {
-
- struct bNameInfo
+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)
{
- char* m_name;
- bool m_isPointer;
- int m_dim0;
- int m_dim1;
- };
-
- class bDNA
+ const bNameInfo &nameInfo = m_Names[name];
+ return nameInfo.m_dim0 * nameInfo.m_dim1;
+ }
+ int getElementSize(short type, short name)
{
- 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);
+ 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();
+ }
- int getPointerSize();
+ 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);
- void dumpTypeDefinitions();
+ int getNumStructs();
-
- private:
- enum FileDNAFlags
- {
- FDF_NONE=0,
- FDF_STRUCT_NEQU,
- FDF_STRUCT_EQU
- };
+ //
+ bool lessThan(bDNA *other);
- void initRecurseCmpFlags(int i);
+ void initCmpFlags(bDNA *memDNA);
+ bool flagNotEqual(int dna_nr);
+ bool flagEqual(int dna_nr);
+ bool flagNone(int dna_nr);
- b3AlignedObjectArray<int> mCMPFlags;
+ int getPointerSize();
- b3AlignedObjectArray<bNameInfo> m_Names;
- b3AlignedObjectArray<char*> mTypes;
- b3AlignedObjectArray<short*> mStructs;
- b3AlignedObjectArray<short> mTlens;
- b3HashMap<b3HashInt, int> mStructReverse;
- b3HashMap<b3HashString,int> mTypeLookup;
+ void dumpTypeDefinitions();
- int mPtrLen;
-
+private:
+ enum FileDNAFlags
+ {
+ FDF_NONE = 0,
+ FDF_STRUCT_NEQU,
+ FDF_STRUCT_EQU
+ };
+ void initRecurseCmpFlags(int i);
+ b3AlignedObjectArray<int> mCMPFlags;
- };
-}
+ b3AlignedObjectArray<bNameInfo> m_Names;
+ b3AlignedObjectArray<char *> mTypes;
+ b3AlignedObjectArray<short *> mStructs;
+ b3AlignedObjectArray<short> mTlens;
+ b3HashMap<b3HashInt, int> mStructReverse;
+ b3HashMap<b3HashString, int> mTypeLookup;
+ int mPtrLen;
+};
+} // namespace bParse
-#endif//__BDNA_H__
+#endif //__BDNA_H__
diff --git a/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Defines.h b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Defines.h
index 8f28d3c441..0524c94db1 100644
--- a/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Defines.h
+++ b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Defines.h
@@ -19,118 +19,131 @@
#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) )
+#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) )
+#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) )
+#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) )
+#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_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_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_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_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_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__
+#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/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3File.cpp b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3File.cpp
index 432f7fc2b4..145de62db3 100644
--- a/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3File.cpp
+++ b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3File.cpp
@@ -29,39 +29,38 @@ subject to the following restrictions:
using namespace bParse;
#define MAX_STRLEN 1024
-const char* getCleanName(const char* memName, char* buffer)
+const char *getCleanName(const char *memName, char *buffer)
{
int slen = strlen(memName);
- assert(slen<MAX_STRLEN);
- slen=b3Min(slen,MAX_STRLEN);
- for (int i=0;i<slen;i++)
+ assert(slen < MAX_STRLEN);
+ slen = b3Min(slen, MAX_STRLEN);
+ for (int i = 0; i < slen; i++)
{
- if (memName[i]==']'||memName[i]=='[')
+ if (memName[i] == ']' || memName[i] == '[')
{
- buffer[i] = 0;//'_';
- } else
+ buffer[i] = 0; //'_';
+ }
+ else
{
buffer[i] = memName[i];
}
}
- buffer[slen]=0;
+ buffer[slen] = 0;
return buffer;
}
-
-
// ----------------------------------------------------- //
bFile::bFile(const char *filename, const char headerString[7])
- : mOwnsBuffer(true),
- mFileBuffer(0),
- mFileLen(0),
- mVersion(0),
- mDataStart(0),
- mFileDNA(0),
- mMemoryDNA(0),
- mFlags(FD_INVALID)
+ : mOwnsBuffer(true),
+ mFileBuffer(0),
+ mFileLen(0),
+ mVersion(0),
+ mDataStart(0),
+ mFileDNA(0),
+ mMemoryDNA(0),
+ mFlags(FD_INVALID)
{
- for (int i=0;i<7;i++)
+ for (int i = 0; i < 7; i++)
{
m_headerString[i] = headerString[i];
}
@@ -73,7 +72,7 @@ bFile::bFile(const char *filename, const char headerString[7])
mFileLen = ftell(fp);
fseek(fp, 0L, SEEK_SET);
- mFileBuffer = (char*)malloc(mFileLen+1);
+ mFileBuffer = (char *)malloc(mFileLen + 1);
int bytesRead;
bytesRead = fread(mFileBuffer, mFileLen, 1, fp);
@@ -81,22 +80,21 @@ bFile::bFile(const char *filename, const char headerString[7])
//
parseHeader();
-
}
}
// ----------------------------------------------------- //
-bFile::bFile( char *memoryBuffer, int len, const char headerString[7])
-: mOwnsBuffer(false),
- mFileBuffer(0),
- mFileLen(0),
- mVersion(0),
- mDataStart(0),
- mFileDNA(0),
- mMemoryDNA(0),
- mFlags(FD_INVALID)
+bFile::bFile(char *memoryBuffer, int len, const char headerString[7])
+ : mOwnsBuffer(false),
+ mFileBuffer(0),
+ mFileLen(0),
+ mVersion(0),
+ mDataStart(0),
+ mFileDNA(0),
+ mMemoryDNA(0),
+ mFlags(FD_INVALID)
{
- for (int i=0;i<7;i++)
+ for (int i = 0; i < 7; i++)
{
m_headerString[i] = headerString[i];
}
@@ -104,10 +102,8 @@ bFile::bFile( char *memoryBuffer, int len, const char headerString[7])
mFileLen = len;
parseHeader();
-
}
-
// ----------------------------------------------------- //
bFile::~bFile()
{
@@ -117,15 +113,10 @@ bFile::~bFile()
mFileBuffer = 0;
}
-
delete mMemoryDNA;
delete mFileDNA;
}
-
-
-
-
// ----------------------------------------------------- //
void bFile::parseHeader()
{
@@ -133,11 +124,11 @@ void bFile::parseHeader()
return;
char *blenderBuf = mFileBuffer;
- char header[B3_SIZEOFBLENDERHEADER+1] ;
+ char header[B3_SIZEOFBLENDERHEADER + 1];
memcpy(header, blenderBuf, B3_SIZEOFBLENDERHEADER);
- header[B3_SIZEOFBLENDERHEADER]='\0';
+ header[B3_SIZEOFBLENDERHEADER] = '\0';
- if (strncmp(header, m_headerString, 6)!=0)
+ if (strncmp(header, m_headerString, 6) != 0)
{
memcpy(header, m_headerString, B3_SIZEOFBLENDERHEADER);
return;
@@ -148,35 +139,34 @@ void bFile::parseHeader()
mFlags |= FD_DOUBLE_PRECISION;
}
- char *ver = header+9;
+ char *ver = header + 9;
mVersion = atoi(ver);
if (mVersion <= 241)
{
//printf("Warning, %d not fully tested : <= 242\n", mVersion);
}
- int littleEndian= 1;
- littleEndian= ((char*)&littleEndian)[0];
+ int littleEndian = 1;
+ littleEndian = ((char *)&littleEndian)[0];
// swap ptr sizes...
- if (header[7]=='-')
+ if (header[7] == '-')
{
mFlags |= FD_FILE_64;
if (!VOID_IS_8)
mFlags |= FD_BITS_VARIES;
}
- else if (VOID_IS_8) mFlags |= FD_BITS_VARIES;
+ else if (VOID_IS_8)
+ mFlags |= FD_BITS_VARIES;
// swap endian...
- if (header[8]=='V')
+ if (header[8] == 'V')
{
- if (littleEndian ==1)
+ if (littleEndian == 1)
mFlags |= FD_ENDIAN_SWAP;
}
- else
- if (littleEndian==0)
- mFlags |= FD_ENDIAN_SWAP;
-
+ else if (littleEndian == 0)
+ mFlags |= FD_ENDIAN_SWAP;
mFlags |= FD_OK;
}
@@ -184,13 +174,13 @@ void bFile::parseHeader()
// ----------------------------------------------------- //
bool bFile::ok()
{
- return (mFlags &FD_OK)!=0;
+ return (mFlags & FD_OK) != 0;
}
// ----------------------------------------------------- //
-void bFile::parseInternal(int verboseMode, char* memDna,int memDnaLength)
+void bFile::parseInternal(int verboseMode, char *memDna, int memDnaLength)
{
- if ( (mFlags &FD_OK) ==0)
+ if ((mFlags & FD_OK) == 0)
return;
char *blenderData = mFileBuffer;
@@ -198,38 +188,40 @@ void bFile::parseInternal(int verboseMode, char* memDna,int memDnaLength)
dna.oldPtr = 0;
char *tempBuffer = blenderData;
- for (int i=0; i<mFileLen; i++)
+ for (int i = 0; i < mFileLen; i++)
{
// looking for the data's starting position
// and the start of SDNA decls
- if (!mDataStart && strncmp(tempBuffer, "REND", 4)==0)
+ if (!mDataStart && strncmp(tempBuffer, "REND", 4) == 0)
mDataStart = i;
- if (strncmp(tempBuffer, "DNA1", 4)==0)
+ if (strncmp(tempBuffer, "DNA1", 4) == 0)
{
// read the DNA1 block and extract SDNA
if (getNextBlock(&dna, tempBuffer, mFlags) > 0)
{
- if (strncmp((tempBuffer + ChunkUtils::getOffset(mFlags)), "SDNANAME", 8) ==0)
+ if (strncmp((tempBuffer + ChunkUtils::getOffset(mFlags)), "SDNANAME", 8) == 0)
dna.oldPtr = (tempBuffer + ChunkUtils::getOffset(mFlags));
- else dna.oldPtr = 0;
+ else
+ dna.oldPtr = 0;
}
- else dna.oldPtr = 0;
+ else
+ dna.oldPtr = 0;
}
// Some Bullet files are missing the DNA1 block
// In Blender it's DNA1 + ChunkUtils::getOffset() + SDNA + NAME
// In Bullet tests its SDNA + NAME
- else if (strncmp(tempBuffer, "SDNANAME", 8) ==0)
+ else if (strncmp(tempBuffer, "SDNANAME", 8) == 0)
{
dna.oldPtr = blenderData + i;
- dna.len = mFileLen-i;
+ dna.len = mFileLen - i;
// Also no REND block, so exit now.
- if (mVersion==276) break;
+ if (mVersion == 276) break;
}
- if (mDataStart && dna.oldPtr) break;
+ if (mDataStart && dna.oldPtr) break;
tempBuffer++;
}
if (!dna.oldPtr || !dna.len)
@@ -239,43 +231,35 @@ void bFile::parseInternal(int verboseMode, char* memDna,int memDnaLength)
return;
}
-
mFileDNA = new bDNA();
-
///mFileDNA->init will convert part of DNA file endianness to current CPU endianness if necessary
- mFileDNA->init((char*)dna.oldPtr, dna.len, (mFlags & FD_ENDIAN_SWAP)!=0);
-
+ mFileDNA->init((char *)dna.oldPtr, dna.len, (mFlags & FD_ENDIAN_SWAP) != 0);
- if (mVersion==276)
+ if (mVersion == 276)
{
int i;
- for (i=0;i<mFileDNA->getNumNames();i++)
+ for (i = 0; i < mFileDNA->getNumNames(); i++)
{
- if (strcmp(mFileDNA->getName(i),"int")==0)
+ if (strcmp(mFileDNA->getName(i), "int") == 0)
{
mFlags |= FD_BROKEN_DNA;
}
}
- if ((mFlags&FD_BROKEN_DNA)!=0)
+ if ((mFlags & FD_BROKEN_DNA) != 0)
{
//printf("warning: fixing some broken DNA version\n");
}
}
-
-
if (verboseMode & FD_VERBOSE_DUMP_DNA_TYPE_DEFINITIONS)
mFileDNA->dumpTypeDefinitions();
mMemoryDNA = new bDNA();
- int littleEndian= 1;
- littleEndian= ((char*)&littleEndian)[0];
-
- mMemoryDNA->init(memDna,memDnaLength,littleEndian==0);
-
-
+ int littleEndian = 1;
+ littleEndian = ((char *)&littleEndian)[0];
+ mMemoryDNA->init(memDna, memDnaLength, littleEndian == 0);
///@todo we need a better version check, add version/sub version info from FileGlobal into memory DNA/header files
if (mMemoryDNA->getNumNames() != mFileDNA->getNumNames())
@@ -290,7 +274,6 @@ void bFile::parseInternal(int verboseMode, char* memDna,int memDnaLength)
//printf ("Warning, file DNA is newer than built in.");
}
-
mFileDNA->initCmpFlags(mMemoryDNA);
parseData();
@@ -298,102 +281,95 @@ void bFile::parseInternal(int verboseMode, char* memDna,int memDnaLength)
resolvePointers(verboseMode);
updateOldPointers();
-
-
}
-
-
// ----------------------------------------------------- //
-void bFile::swap(char *head, bChunkInd& dataChunk, bool ignoreEndianFlag)
+void bFile::swap(char *head, bChunkInd &dataChunk, bool ignoreEndianFlag)
{
char *data = head;
short *strc = mFileDNA->getStruct(dataChunk.dna_nr);
-
-
const char s[] = "SoftBodyMaterialData";
int szs = sizeof(s);
- if (strncmp((char*)&dataChunk.code,"ARAY",4)==0)
+ if (strncmp((char *)&dataChunk.code, "ARAY", 4) == 0)
{
short *oldStruct = mFileDNA->getStruct(dataChunk.dna_nr);
char *oldType = mFileDNA->getType(oldStruct[0]);
- if (strncmp(oldType,s,szs)==0)
+ if (strncmp(oldType, s, szs) == 0)
{
return;
}
}
-
int len = mFileDNA->getLength(strc[0]);
- for (int i=0; i<dataChunk.nr; i++)
+ for (int i = 0; i < dataChunk.nr; i++)
{
- swapStruct(dataChunk.dna_nr, data,ignoreEndianFlag);
- data+=len;
+ swapStruct(dataChunk.dna_nr, data, ignoreEndianFlag);
+ data += len;
}
}
void bFile::swapLen(char *dataPtr)
{
- const bool VOID_IS_8 = ((sizeof(void*)==8));
+ const bool VOID_IS_8 = ((sizeof(void *) == 8));
if (VOID_IS_8)
{
- if (mFlags &FD_BITS_VARIES)
+ if (mFlags & FD_BITS_VARIES)
{
- bChunkPtr4*c = (bChunkPtr4*) dataPtr;
- if ((c->code & 0xFFFF)==0)
- c->code >>=16;
+ bChunkPtr4 *c = (bChunkPtr4 *)dataPtr;
+ if ((c->code & 0xFFFF) == 0)
+ c->code >>= 16;
B3_SWITCH_INT(c->len);
B3_SWITCH_INT(c->dna_nr);
B3_SWITCH_INT(c->nr);
- } else
+ }
+ else
{
- bChunkPtr8* c = (bChunkPtr8*) dataPtr;
- if ((c->code & 0xFFFF)==0)
- c->code >>=16;
+ bChunkPtr8 *c = (bChunkPtr8 *)dataPtr;
+ if ((c->code & 0xFFFF) == 0)
+ c->code >>= 16;
B3_SWITCH_INT(c->len);
B3_SWITCH_INT(c->dna_nr);
B3_SWITCH_INT(c->nr);
-
}
- } else
+ }
+ else
{
- if (mFlags &FD_BITS_VARIES)
+ if (mFlags & FD_BITS_VARIES)
{
- bChunkPtr8*c = (bChunkPtr8*) dataPtr;
- if ((c->code & 0xFFFF)==0)
- c->code >>=16;
+ bChunkPtr8 *c = (bChunkPtr8 *)dataPtr;
+ if ((c->code & 0xFFFF) == 0)
+ c->code >>= 16;
B3_SWITCH_INT(c->len);
B3_SWITCH_INT(c->dna_nr);
B3_SWITCH_INT(c->nr);
-
- } else
+ }
+ else
{
- bChunkPtr4* c = (bChunkPtr4*) dataPtr;
- if ((c->code & 0xFFFF)==0)
- c->code >>=16;
+ bChunkPtr4 *c = (bChunkPtr4 *)dataPtr;
+ if ((c->code & 0xFFFF) == 0)
+ c->code >>= 16;
B3_SWITCH_INT(c->len);
B3_SWITCH_INT(c->dna_nr);
B3_SWITCH_INT(c->nr);
-
}
}
-
}
-
-void bFile::swapDNA(char* ptr)
+void bFile::swapDNA(char *ptr)
{
- bool swap = ((mFlags & FD_ENDIAN_SWAP)!=0);
-
- char* data = &ptr[20];
-// void bDNA::init(char *data, int len, bool swap)
- int *intPtr=0;short *shtPtr=0;
- char *cp = 0;int dataLen =0;
+ bool swap = ((mFlags & FD_ENDIAN_SWAP) != 0);
+
+ char *data = &ptr[20];
+ // void bDNA::init(char *data, int len, bool swap)
+ int *intPtr = 0;
+ short *shtPtr = 0;
+ char *cp = 0;
+ int dataLen = 0;
//long nr=0;
- intPtr = (int*)data;
+ intPtr = (int *)data;
/*
SDNA (4 bytes) (magic number)
@@ -403,14 +379,13 @@ void bFile::swapDNA(char* ptr)
<string>
*/
- if (strncmp(data, "SDNA", 4)==0)
+ if (strncmp(data, "SDNA", 4) == 0)
{
// skip ++ NAME
- intPtr++; intPtr++;
+ intPtr++;
+ intPtr++;
}
-
-
// Parse names
if (swap)
dataLen = ChunkUtils::swapInt(*intPtr);
@@ -420,16 +395,15 @@ void bFile::swapDNA(char* ptr)
*intPtr = ChunkUtils::swapInt(*intPtr);
intPtr++;
- cp = (char*)intPtr;
+ cp = (char *)intPtr;
int i;
- for ( i=0; i<dataLen; i++)
+ for (i = 0; i < dataLen; i++)
{
- while (*cp)cp++;
+ while (*cp) cp++;
cp++;
}
-
- cp = b3AlignPointer(cp,4);
+ cp = b3AlignPointer(cp, 4);
/*
TYPE (4 bytes)
@@ -438,8 +412,9 @@ void bFile::swapDNA(char* ptr)
<string>
*/
- intPtr = (int*)cp;
- assert(strncmp(cp, "TYPE", 4)==0); intPtr++;
+ intPtr = (int *)cp;
+ assert(strncmp(cp, "TYPE", 4) == 0);
+ intPtr++;
if (swap)
dataLen = ChunkUtils::swapInt(*intPtr);
@@ -450,14 +425,14 @@ void bFile::swapDNA(char* ptr)
intPtr++;
- cp = (char*)intPtr;
- for ( i=0; i<dataLen; i++)
+ cp = (char *)intPtr;
+ for (i = 0; i < dataLen; i++)
{
- while (*cp)cp++;
+ while (*cp) cp++;
cp++;
}
- cp = b3AlignPointer(cp,4);
+ cp = b3AlignPointer(cp, 4);
/*
TLEN (4 bytes)
@@ -466,15 +441,15 @@ void bFile::swapDNA(char* ptr)
*/
// Parse type lens
- intPtr = (int*)cp;
- assert(strncmp(cp, "TLEN", 4)==0); intPtr++;
-
+ intPtr = (int *)cp;
+ assert(strncmp(cp, "TLEN", 4) == 0);
+ intPtr++;
- shtPtr = (short*)intPtr;
- for ( i=0; i<dataLen; i++, shtPtr++)
+ shtPtr = (short *)intPtr;
+ for (i = 0; i < dataLen; i++, shtPtr++)
{
//??????if (swap)
- shtPtr[0] = ChunkUtils::swapShort(shtPtr[0]);
+ shtPtr[0] = ChunkUtils::swapShort(shtPtr[0]);
}
if (dataLen & 1)
@@ -491,9 +466,9 @@ void bFile::swapDNA(char* ptr)
<namenr>
*/
- intPtr = (int*)shtPtr;
- cp = (char*)intPtr;
- assert(strncmp(cp, "STRC", 4)==0);
+ intPtr = (int *)shtPtr;
+ cp = (char *)intPtr;
+ assert(strncmp(cp, "STRC", 4) == 0);
intPtr++;
if (swap)
@@ -505,66 +480,56 @@ void bFile::swapDNA(char* ptr)
intPtr++;
-
- shtPtr = (short*)intPtr;
- for ( i=0; i<dataLen; i++)
+ shtPtr = (short *)intPtr;
+ for (i = 0; i < dataLen; i++)
{
-
//if (swap)
{
int len = shtPtr[1];
- shtPtr[0]= ChunkUtils::swapShort(shtPtr[0]);
- shtPtr[1]= ChunkUtils::swapShort(shtPtr[1]);
+ shtPtr[0] = ChunkUtils::swapShort(shtPtr[0]);
+ shtPtr[1] = ChunkUtils::swapShort(shtPtr[1]);
- shtPtr+= 2;
+ shtPtr += 2;
- for (int a=0; a<len; a++, shtPtr+=2)
+ for (int a = 0; a < len; a++, shtPtr += 2)
{
- shtPtr[0]= ChunkUtils::swapShort(shtPtr[0]);
- shtPtr[1]= ChunkUtils::swapShort(shtPtr[1]);
+ shtPtr[0] = ChunkUtils::swapShort(shtPtr[0]);
+ shtPtr[1] = ChunkUtils::swapShort(shtPtr[1]);
}
}
-// else
-// shtPtr+= (2*shtPtr[1])+2;
+ // else
+ // shtPtr+= (2*shtPtr[1])+2;
}
-
}
-void bFile::writeFile(const char* fileName)
+void bFile::writeFile(const char *fileName)
{
- FILE* f = fopen(fileName,"wb");
- fwrite(mFileBuffer,1,mFileLen,f);
+ FILE *f = fopen(fileName, "wb");
+ fwrite(mFileBuffer, 1, mFileLen, f);
fclose(f);
}
void bFile::preSwap()
{
-
//const bool brokenDNA = (mFlags&FD_BROKEN_DNA)!=0;
//FD_ENDIAN_SWAP
//byte 8 determines the endianness of the file, little (v) versus big (V)
- int littleEndian= 1;
- littleEndian= ((char*)&littleEndian)[0];
-
+ int littleEndian = 1;
+ littleEndian = ((char *)&littleEndian)[0];
- if (mFileBuffer[8]=='V')
+ if (mFileBuffer[8] == 'V')
{
- mFileBuffer[8]='v';
+ mFileBuffer[8] = 'v';
}
else
{
- mFileBuffer[8]='V';
+ mFileBuffer[8] = 'V';
}
-
-
-
-
-
mDataStart = 12;
- char *dataPtr = mFileBuffer+mDataStart;
+ char *dataPtr = mFileBuffer + mDataStart;
bChunkInd dataChunk;
dataChunk.code = 0;
@@ -579,21 +544,22 @@ void bFile::preSwap()
while (1)
{
// one behind
- if (dataChunk.code == B3_SDNA || dataChunk.code==B3_DNA1 || dataChunk.code == B3_TYPE || dataChunk.code == B3_TLEN || dataChunk.code==B3_STRC)
+ if (dataChunk.code == B3_SDNA || dataChunk.code == B3_DNA1 || dataChunk.code == B3_TYPE || dataChunk.code == B3_TLEN || dataChunk.code == B3_STRC)
{
-
swapDNA(dataPtr);
break;
- } else
+ }
+ else
{
//if (dataChunk.code == DNA1) break;
- dataPtrHead = dataPtr+ChunkUtils::getOffset(mFlags);
+ dataPtrHead = dataPtr + ChunkUtils::getOffset(mFlags);
swapLen(dataPtr);
- if (dataChunk.dna_nr>=0)
+ if (dataChunk.dna_nr >= 0)
{
- swap(dataPtrHead, dataChunk,ignoreEndianFlag);
- } else
+ swap(dataPtrHead, dataChunk, ignoreEndianFlag);
+ }
+ else
{
//printf("unknown chunk\n");
}
@@ -602,7 +568,7 @@ void bFile::preSwap()
// next please!
dataPtr += seek;
- seek = getNextBlock(&dataChunk, dataPtr, mFlags);
+ seek = getNextBlock(&dataChunk, dataPtr, mFlags);
if (seek < 0)
break;
}
@@ -610,56 +576,50 @@ void bFile::preSwap()
if (mFlags & FD_ENDIAN_SWAP)
{
mFlags &= ~FD_ENDIAN_SWAP;
- } else
+ }
+ else
{
mFlags |= FD_ENDIAN_SWAP;
}
-
-
-
}
-
// ----------------------------------------------------- //
-char* bFile::readStruct(char *head, bChunkInd& dataChunk)
+char *bFile::readStruct(char *head, bChunkInd &dataChunk)
{
bool ignoreEndianFlag = false;
if (mFlags & FD_ENDIAN_SWAP)
swap(head, dataChunk, ignoreEndianFlag);
-
-
if (!mFileDNA->flagEqual(dataChunk.dna_nr))
{
// Ouch! need to rebuild the struct
- short *oldStruct,*curStruct;
+ short *oldStruct, *curStruct;
char *oldType, *newType;
int oldLen, curLen, reverseOld;
-
oldStruct = mFileDNA->getStruct(dataChunk.dna_nr);
oldType = mFileDNA->getType(oldStruct[0]);
oldLen = mFileDNA->getLength(oldStruct[0]);
- if ((mFlags&FD_BROKEN_DNA)!=0)
+ if ((mFlags & FD_BROKEN_DNA) != 0)
{
- if ((strcmp(oldType,"b3QuantizedBvhNodeData")==0)&&oldLen==20)
+ if ((strcmp(oldType, "b3QuantizedBvhNodeData") == 0) && oldLen == 20)
{
return 0;
}
- if ((strcmp(oldType,"b3ShortIntIndexData")==0))
+ if ((strcmp(oldType, "b3ShortIntIndexData") == 0))
{
int allocLen = 2;
- char *dataAlloc = new char[(dataChunk.nr*allocLen)+1];
- memset(dataAlloc, 0, (dataChunk.nr*allocLen)+1);
- short* dest = (short*) dataAlloc;
- const short* src = (short*) head;
- for (int i=0;i<dataChunk.nr;i++)
+ char *dataAlloc = new char[(dataChunk.nr * allocLen) + 1];
+ memset(dataAlloc, 0, (dataChunk.nr * allocLen) + 1);
+ short *dest = (short *)dataAlloc;
+ const short *src = (short *)head;
+ for (int i = 0; i < dataChunk.nr; i++)
{
dest[i] = src[i];
- if (mFlags &FD_ENDIAN_SWAP)
+ if (mFlags & FD_ENDIAN_SWAP)
{
B3_SWITCH_SHORT(dest[i]);
}
@@ -669,14 +629,12 @@ char* bFile::readStruct(char *head, bChunkInd& dataChunk)
}
}
-
-
///don't try to convert Link block data, just memcpy it. Other data can be converted.
- if (strcmp("Link",oldType)!=0)
+ if (strcmp("Link", oldType) != 0)
{
reverseOld = mMemoryDNA->getReverseType(oldType);
- if ((reverseOld!=-1))
+ if ((reverseOld != -1))
{
// make sure it's here
//assert(reverseOld!= -1 && "getReverseType() returned -1, struct required!");
@@ -686,39 +644,38 @@ char* bFile::readStruct(char *head, bChunkInd& dataChunk)
newType = mMemoryDNA->getType(curStruct[0]);
curLen = mMemoryDNA->getLength(curStruct[0]);
-
-
// make sure it's the same
- assert((strcmp(oldType, newType)==0) && "internal error, struct mismatch!");
-
+ assert((strcmp(oldType, newType) == 0) && "internal error, struct mismatch!");
// numBlocks * length
- int allocLen = (curLen);
- char *dataAlloc = new char[(dataChunk.nr*allocLen)+1];
- memset(dataAlloc, 0, (dataChunk.nr*allocLen));
+ int allocLen = (curLen);
+ char *dataAlloc = new char[(dataChunk.nr * allocLen) + 1];
+ memset(dataAlloc, 0, (dataChunk.nr * allocLen));
// track allocated
addDataBlock(dataAlloc);
char *cur = dataAlloc;
char *old = head;
- for (int block=0; block<dataChunk.nr; block++)
+ for (int block = 0; block < dataChunk.nr; block++)
{
bool fixupPointers = true;
parseStruct(cur, old, dataChunk.dna_nr, reverseOld, fixupPointers);
- mLibPointers.insert(old,(bStructHandle*)cur);
+ mLibPointers.insert(old, (bStructHandle *)cur);
cur += curLen;
old += oldLen;
}
return dataAlloc;
}
- } else
+ }
+ else
{
//printf("Link found\n");
}
- } else
+ }
+ else
{
//#define DEBUG_EQUAL_STRUCTS
#ifdef DEBUG_EQUAL_STRUCTS
@@ -726,24 +683,20 @@ char* bFile::readStruct(char *head, bChunkInd& dataChunk)
char *oldType;
oldStruct = mFileDNA->getStruct(dataChunk.dna_nr);
oldType = mFileDNA->getType(oldStruct[0]);
- printf("%s equal structure, just memcpy\n",oldType);
-#endif //
+ printf("%s equal structure, just memcpy\n", oldType);
+#endif //
}
-
- char *dataAlloc = new char[(dataChunk.len)+1];
- memset(dataAlloc, 0, dataChunk.len+1);
-
+ char *dataAlloc = new char[(dataChunk.len) + 1];
+ memset(dataAlloc, 0, dataChunk.len + 1);
// track allocated
addDataBlock(dataAlloc);
memcpy(dataAlloc, head, dataChunk.len);
return dataAlloc;
-
}
-
// ----------------------------------------------------- //
void bFile::parseStruct(char *strcPtr, char *dtPtr, int old_dna, int new_dna, bool fixupPointers)
{
@@ -751,7 +704,7 @@ void bFile::parseStruct(char *strcPtr, char *dtPtr, int old_dna, int new_dna, bo
if (new_dna == -1) return;
//disable this, because we need to fixup pointers/ListBase
- if (0)//mFileDNA->flagEqual(old_dna))
+ if (0) //mFileDNA->flagEqual(old_dna))
{
short *strc = mFileDNA->getStruct(old_dna);
int len = mFileDNA->getLength(strc[0]);
@@ -766,31 +719,29 @@ void bFile::parseStruct(char *strcPtr, char *dtPtr, int old_dna, int new_dna, bo
int elementLength, size, revType, old_nr, new_nr, fpLen;
short firstStructType;
-
// File to memory lookup
memoryStruct = mMemoryDNA->getStruct(new_dna);
fileStruct = mFileDNA->getStruct(old_dna);
firstStruct = fileStruct;
-
filePtrOld = fileStruct;
firstStructType = mMemoryDNA->getStruct(0)[0];
// Get number of elements
elementLength = memoryStruct[1];
- memoryStruct+=2;
+ memoryStruct += 2;
- cpc = strcPtr; cpo = 0;
- for (int ele=0; ele<elementLength; ele++, memoryStruct+=2)
+ cpc = strcPtr;
+ cpo = 0;
+ for (int ele = 0; ele < elementLength; ele++, memoryStruct += 2)
{
memType = mMemoryDNA->getType(memoryStruct[0]);
memName = mMemoryDNA->getName(memoryStruct[1]);
-
size = mMemoryDNA->getElementSize(memoryStruct[0], memoryStruct[1]);
revType = mMemoryDNA->getReverseType(memoryStruct[0]);
- if (revType != -1 && memoryStruct[0]>=firstStructType && memName[0] != '*')
+ if (revType != -1 && memoryStruct[0] >= firstStructType && memName[0] != '*')
{
cpo = getFileElement(firstStruct, memName, memType, dtPtr, &filePtrOld);
if (cpo)
@@ -799,94 +750,92 @@ void bFile::parseStruct(char *strcPtr, char *dtPtr, int old_dna, int new_dna, bo
old_nr = mFileDNA->getReverseType(memType);
new_nr = revType;
fpLen = mFileDNA->getElementSize(filePtrOld[0], filePtrOld[1]);
- if (arrayLen==1)
+ if (arrayLen == 1)
{
- parseStruct(cpc, cpo, old_nr, new_nr,fixupPointers);
- } else
+ parseStruct(cpc, cpo, old_nr, new_nr, fixupPointers);
+ }
+ else
{
- char* tmpCpc = cpc;
- char* tmpCpo = cpo;
+ char *tmpCpc = cpc;
+ char *tmpCpo = cpo;
- for (int i=0;i<arrayLen;i++)
+ for (int i = 0; i < arrayLen; i++)
{
- parseStruct(tmpCpc, tmpCpo, old_nr, new_nr,fixupPointers);
- tmpCpc += size/arrayLen;
- tmpCpo += fpLen/arrayLen;
+ parseStruct(tmpCpc, tmpCpo, old_nr, new_nr, fixupPointers);
+ tmpCpc += size / arrayLen;
+ tmpCpo += fpLen / arrayLen;
}
}
- cpc+=size;
- cpo+=fpLen;
+ cpc += size;
+ cpo += fpLen;
}
else
- cpc+=size;
+ cpc += size;
}
else
{
- getMatchingFileDNA(fileStruct, memName, memType, cpc, dtPtr,fixupPointers);
- cpc+=size;
+ getMatchingFileDNA(fileStruct, memName, memType, cpc, dtPtr, fixupPointers);
+ cpc += size;
}
-
}
}
-
// ----------------------------------------------------- //
static void getElement(int arrayLen, const char *cur, const char *old, char *oldPtr, char *curData)
{
-#define b3GetEle(value, current, type, cast, size, ptr)\
- if (strcmp(current, type)==0)\
- {\
- value = (*(cast*)ptr);\
- ptr += size;\
+#define b3GetEle(value, current, type, cast, size, ptr) \
+ if (strcmp(current, type) == 0) \
+ { \
+ value = (*(cast *)ptr); \
+ ptr += size; \
}
-#define b3SetEle(value, current, type, cast, size, ptr)\
- if (strcmp(current, type)==0)\
- {\
- (*(cast*)ptr) = (cast)value;\
- ptr += size;\
+#define b3SetEle(value, current, type, cast, size, ptr) \
+ if (strcmp(current, type) == 0) \
+ { \
+ (*(cast *)ptr) = (cast)value; \
+ ptr += size; \
}
double value = 0.0;
- for (int i=0; i<arrayLen; i++)
+ for (int i = 0; i < arrayLen; i++)
{
- b3GetEle(value, old, "char", char, sizeof(char), oldPtr);
- b3SetEle(value, cur, "char", char, sizeof(char), curData);
- b3GetEle(value, old, "short", short, sizeof(short), oldPtr);
- b3SetEle(value, cur, "short", short, sizeof(short), curData);
- b3GetEle(value, old, "ushort", unsigned short, sizeof(unsigned short), oldPtr);
- b3SetEle(value, cur, "ushort", unsigned short, sizeof(unsigned short), curData);
- b3GetEle(value, old, "int", int, sizeof(int), oldPtr);
- b3SetEle(value, cur, "int", int, sizeof(int), curData);
- b3GetEle(value, old, "long", int, sizeof(int), oldPtr);
- b3SetEle(value, cur, "long", int, sizeof(int), curData);
- b3GetEle(value, old, "float", float, sizeof(float), oldPtr);
- b3SetEle(value, cur, "float", float, sizeof(float), curData);
+ b3GetEle(value, old, "char", char, sizeof(char), oldPtr);
+ b3SetEle(value, cur, "char", char, sizeof(char), curData);
+ b3GetEle(value, old, "short", short, sizeof(short), oldPtr);
+ b3SetEle(value, cur, "short", short, sizeof(short), curData);
+ b3GetEle(value, old, "ushort", unsigned short, sizeof(unsigned short), oldPtr);
+ b3SetEle(value, cur, "ushort", unsigned short, sizeof(unsigned short), curData);
+ b3GetEle(value, old, "int", int, sizeof(int), oldPtr);
+ b3SetEle(value, cur, "int", int, sizeof(int), curData);
+ b3GetEle(value, old, "long", int, sizeof(int), oldPtr);
+ b3SetEle(value, cur, "long", int, sizeof(int), curData);
+ b3GetEle(value, old, "float", float, sizeof(float), oldPtr);
+ b3SetEle(value, cur, "float", float, sizeof(float), curData);
b3GetEle(value, old, "double", double, sizeof(double), oldPtr);
b3SetEle(value, cur, "double", double, sizeof(double), curData);
}
}
-
// ----------------------------------------------------- //
-void bFile::swapData(char *data, short type, int arraySize,bool ignoreEndianFlag)
+void bFile::swapData(char *data, short type, int arraySize, bool ignoreEndianFlag)
{
- if (ignoreEndianFlag || (mFlags &FD_ENDIAN_SWAP))
+ if (ignoreEndianFlag || (mFlags & FD_ENDIAN_SWAP))
{
if (type == 2 || type == 3)
{
- short *sp = (short*)data;
- for (int i=0; i<arraySize; i++)
+ short *sp = (short *)data;
+ for (int i = 0; i < arraySize; i++)
{
sp[0] = ChunkUtils::swapShort(sp[0]);
sp++;
}
}
- if (type>3 && type <8)
+ if (type > 3 && type < 8)
{
char c;
char *cp = data;
- for (int i=0; i<arraySize; i++)
+ for (int i = 0; i < arraySize; i++)
{
c = cp[0];
cp[0] = cp[3];
@@ -894,14 +843,12 @@ void bFile::swapData(char *data, short type, int arraySize,bool ignoreEndianFlag
c = cp[1];
cp[1] = cp[2];
cp[2] = c;
- cp+=4;
+ cp += 4;
}
}
}
}
-
-
void bFile::safeSwapPtr(char *dst, const char *src)
{
int ptrFile = mFileDNA->getPointerSize();
@@ -910,84 +857,79 @@ void bFile::safeSwapPtr(char *dst, const char *src)
if (!src && !dst)
return;
-
if (ptrFile == ptrMem)
{
memcpy(dst, src, ptrMem);
}
- else if (ptrMem==4 && ptrFile==8)
+ else if (ptrMem == 4 && ptrFile == 8)
{
- b3PointerUid* oldPtr = (b3PointerUid*)src;
- b3PointerUid* newPtr = (b3PointerUid*)dst;
+ b3PointerUid *oldPtr = (b3PointerUid *)src;
+ b3PointerUid *newPtr = (b3PointerUid *)dst;
if (oldPtr->m_uniqueIds[0] == oldPtr->m_uniqueIds[1])
{
//Bullet stores the 32bit unique ID in both upper and lower part of 64bit pointers
//so it can be used to distinguish between .blend and .bullet
newPtr->m_uniqueIds[0] = oldPtr->m_uniqueIds[0];
- } else
+ }
+ else
{
//deal with pointers the Blender .blend style way, see
//readfile.c in the Blender source tree
- b3Long64 longValue = *((b3Long64*)src);
+ b3Long64 longValue = *((b3Long64 *)src);
//endian swap for 64bit pointer otherwise truncation will fail due to trailing zeros
if (mFlags & FD_ENDIAN_SWAP)
B3_SWITCH_LONGINT(longValue);
- *((int*)dst) = (int)(longValue>>3);
+ *((int *)dst) = (int)(longValue >> 3);
}
-
}
- else if (ptrMem==8 && ptrFile==4)
+ else if (ptrMem == 8 && ptrFile == 4)
{
- b3PointerUid* oldPtr = (b3PointerUid*)src;
- b3PointerUid* newPtr = (b3PointerUid*)dst;
+ b3PointerUid *oldPtr = (b3PointerUid *)src;
+ b3PointerUid *newPtr = (b3PointerUid *)dst;
if (oldPtr->m_uniqueIds[0] == oldPtr->m_uniqueIds[1])
{
newPtr->m_uniqueIds[0] = oldPtr->m_uniqueIds[0];
newPtr->m_uniqueIds[1] = 0;
- } else
+ }
+ else
{
- *((b3Long64*)dst)= *((int*)src);
+ *((b3Long64 *)dst) = *((int *)src);
}
}
else
{
- printf ("%d %d\n", ptrFile,ptrMem);
+ printf("%d %d\n", ptrFile, ptrMem);
assert(0 && "Invalid pointer len");
}
-
-
}
-
// ----------------------------------------------------- //
-void bFile::getMatchingFileDNA(short* dna_addr, const char* lookupName, const char* lookupType, char *strcData, char *data, bool fixupPointers)
+void bFile::getMatchingFileDNA(short *dna_addr, const char *lookupName, const char *lookupType, char *strcData, char *data, bool fixupPointers)
{
// find the matching memory dna data
// to the file being loaded. Fill the
// memory with the file data...
int len = dna_addr[1];
- dna_addr+=2;
+ dna_addr += 2;
- for (int i=0; i<len; i++, dna_addr+=2)
+ for (int i = 0; i < len; i++, dna_addr += 2)
{
- const char* type = mFileDNA->getType(dna_addr[0]);
- const char* name = mFileDNA->getName(dna_addr[1]);
-
-
+ const char *type = mFileDNA->getType(dna_addr[0]);
+ const char *name = mFileDNA->getName(dna_addr[1]);
int eleLen = mFileDNA->getElementSize(dna_addr[0], dna_addr[1]);
- if ((mFlags&FD_BROKEN_DNA)!=0)
+ if ((mFlags & FD_BROKEN_DNA) != 0)
{
- if ((strcmp(type,"short")==0)&&(strcmp(name,"int")==0))
+ if ((strcmp(type, "short") == 0) && (strcmp(name, "int") == 0))
{
eleLen = 0;
}
}
- if (strcmp(lookupName, name)==0)
+ if (strcmp(lookupName, name) == 0)
{
//int arrayLenold = mFileDNA->getArraySize((char*)name.c_str());
int arrayLen = mFileDNA->getArraySizeNew(dna_addr[1]);
@@ -998,7 +940,7 @@ void bFile::getMatchingFileDNA(short* dna_addr, const char* lookupName, const c
// cast pointers
int ptrFile = mFileDNA->getPointerSize();
int ptrMem = mMemoryDNA->getPointerSize();
- safeSwapPtr(strcData,data);
+ safeSwapPtr(strcData, data);
if (fixupPointers)
{
@@ -1007,11 +949,11 @@ void bFile::getMatchingFileDNA(short* dna_addr, const char* lookupName, const c
//void **sarray = (void**)strcData;
//void **darray = (void**)data;
- char *cpc, *cpo;
- cpc = (char*)strcData;
- cpo = (char*)data;
+ char *cpc, *cpo;
+ cpc = (char *)strcData;
+ cpo = (char *)data;
- for (int a=0; a<arrayLen; a++)
+ for (int a = 0; a < arrayLen; a++)
{
safeSwapPtr(cpc, cpo);
m_pointerFixupArray.push_back(cpc);
@@ -1029,12 +971,11 @@ void bFile::getMatchingFileDNA(short* dna_addr, const char* lookupName, const c
}
else
{
-// printf("skipped %s %s : %x\n",type.c_str(),name.c_str(),strcData);
+ // printf("skipped %s %s : %x\n",type.c_str(),name.c_str(),strcData);
}
-
}
- else if (strcmp(type, lookupType)==0)
+ else if (strcmp(type, lookupType) == 0)
memcpy(strcData, data, eleLen);
else
getElement(arrayLen, lookupType, type, data, strcData);
@@ -1042,27 +983,26 @@ void bFile::getMatchingFileDNA(short* dna_addr, const char* lookupName, const c
// --
return;
}
- data+=eleLen;
+ data += eleLen;
}
}
-
// ----------------------------------------------------- //
-char* bFile::getFileElement(short *firstStruct, char *lookupName, char *lookupType, char *data, short **foundPos)
+char *bFile::getFileElement(short *firstStruct, char *lookupName, char *lookupType, char *data, short **foundPos)
{
- short *old = firstStruct;//mFileDNA->getStruct(old_nr);
+ short *old = firstStruct; //mFileDNA->getStruct(old_nr);
int elementLength = old[1];
- old+=2;
+ old += 2;
- for (int i=0; i<elementLength; i++, old+=2)
+ for (int i = 0; i < elementLength; i++, old += 2)
{
- char* type = mFileDNA->getType(old[0]);
- char* name = mFileDNA->getName(old[1]);
+ char *type = mFileDNA->getType(old[0]);
+ char *name = mFileDNA->getName(old[1]);
int len = mFileDNA->getElementSize(old[0], old[1]);
- if (strcmp(lookupName, name)==0)
+ if (strcmp(lookupName, name) == 0)
{
- if (strcmp(type, lookupType)==0)
+ if (strcmp(type, lookupType) == 0)
{
if (foundPos)
*foundPos = old;
@@ -1070,46 +1010,46 @@ char* bFile::getFileElement(short *firstStruct, char *lookupName, char *lookupTy
}
return 0;
}
- data+=len;
+ data += len;
}
return 0;
}
-
// ----------------------------------------------------- //
-void bFile::swapStruct(int dna_nr, char *data,bool ignoreEndianFlag)
+void bFile::swapStruct(int dna_nr, char *data, bool ignoreEndianFlag)
{
if (dna_nr == -1) return;
short *strc = mFileDNA->getStruct(dna_nr);
//short *firstStrc = strc;
- int elementLen= strc[1];
- strc+=2;
+ int elementLen = strc[1];
+ strc += 2;
short first = mFileDNA->getStruct(0)[0];
char *buf = data;
- for (int i=0; i<elementLen; i++, strc+=2)
+ for (int i = 0; i < elementLen; i++, strc += 2)
{
char *type = mFileDNA->getType(strc[0]);
char *name = mFileDNA->getName(strc[1]);
int size = mFileDNA->getElementSize(strc[0], strc[1]);
- if (strc[0] >= first && name[0]!='*')
+ if (strc[0] >= first && name[0] != '*')
{
int old_nr = mFileDNA->getReverseType(type);
int arrayLen = mFileDNA->getArraySizeNew(strc[1]);
- if (arrayLen==1)
+ if (arrayLen == 1)
{
- swapStruct(old_nr,buf,ignoreEndianFlag);
- } else
+ swapStruct(old_nr, buf, ignoreEndianFlag);
+ }
+ else
{
- char* tmpBuf = buf;
- for (int i=0;i<arrayLen;i++)
+ char *tmpBuf = buf;
+ for (int i = 0; i < arrayLen; i++)
{
- swapStruct(old_nr,tmpBuf,ignoreEndianFlag);
- tmpBuf+=size/arrayLen;
+ swapStruct(old_nr, tmpBuf, ignoreEndianFlag);
+ tmpBuf += size / arrayLen;
}
}
}
@@ -1118,39 +1058,39 @@ void bFile::swapStruct(int dna_nr, char *data,bool ignoreEndianFlag)
//int arrayLenOld = mFileDNA->getArraySize(name);
int arrayLen = mFileDNA->getArraySizeNew(strc[1]);
//assert(arrayLenOld == arrayLen);
- swapData(buf, strc[0], arrayLen,ignoreEndianFlag);
+ swapData(buf, strc[0], arrayLen, ignoreEndianFlag);
}
- buf+=size;
+ buf += size;
}
}
void bFile::resolvePointersMismatch()
{
-// printf("resolvePointersStructMismatch\n");
+ // printf("resolvePointersStructMismatch\n");
int i;
- for (i=0;i< m_pointerFixupArray.size();i++)
+ for (i = 0; i < m_pointerFixupArray.size(); i++)
{
- char* cur = m_pointerFixupArray.at(i);
- void** ptrptr = (void**) cur;
- void* ptr = *ptrptr;
+ char *cur = m_pointerFixupArray.at(i);
+ void **ptrptr = (void **)cur;
+ void *ptr = *ptrptr;
ptr = findLibPointer(ptr);
if (ptr)
{
//printf("Fixup pointer!\n");
*(ptrptr) = ptr;
- } else
+ }
+ else
{
-// printf("pointer not found: %x\n",cur);
+ // printf("pointer not found: %x\n",cur);
}
}
-
- for (i=0; i<m_pointerPtrFixupArray.size(); i++)
+ for (i = 0; i < m_pointerPtrFixupArray.size(); i++)
{
- char* cur= m_pointerPtrFixupArray.at(i);
- void** ptrptr = (void**)cur;
+ char *cur = m_pointerPtrFixupArray.at(i);
+ void **ptrptr = (void **)cur;
bChunkInd *block = m_chunkPtrPtrMap.find(*ptrptr);
if (block)
@@ -1158,7 +1098,6 @@ void bFile::resolvePointersMismatch()
int ptrMem = mMemoryDNA->getPointerSize();
int ptrFile = mFileDNA->getPointerSize();
-
int blockLen = block->len / ptrFile;
void *onptr = findLibPointer(*ptrptr);
@@ -1168,16 +1107,16 @@ void bFile::resolvePointersMismatch()
addDataBlock(newPtr);
memset(newPtr, 0, blockLen * ptrMem);
- void **onarray = (void**)onptr;
- char *oldPtr = (char*)onarray;
+ void **onarray = (void **)onptr;
+ char *oldPtr = (char *)onarray;
int p = 0;
while (blockLen-- > 0)
{
b3PointerUid dp = {{0}};
- safeSwapPtr((char*)dp.m_uniqueIds, oldPtr);
+ safeSwapPtr((char *)dp.m_uniqueIds, oldPtr);
- void **tptr = (void**)(newPtr + p * ptrMem);
+ void **tptr = (void **)(newPtr + p * ptrMem);
*tptr = findLibPointer(dp.m_ptr);
oldPtr += ptrFile;
@@ -1190,70 +1129,63 @@ void bFile::resolvePointersMismatch()
}
}
-
///this loop only works fine if the Blender DNA structure of the file matches the headerfiles
-void bFile::resolvePointersChunk(const bChunkInd& dataChunk, int verboseMode)
+void bFile::resolvePointersChunk(const bChunkInd &dataChunk, int verboseMode)
{
- bParse::bDNA* fileDna = mFileDNA ? mFileDNA : mMemoryDNA;
+ bParse::bDNA *fileDna = mFileDNA ? mFileDNA : mMemoryDNA;
- short int* oldStruct = fileDna->getStruct(dataChunk.dna_nr);
+ short int *oldStruct = fileDna->getStruct(dataChunk.dna_nr);
short oldLen = fileDna->getLength(oldStruct[0]);
//char* structType = fileDna->getType(oldStruct[0]);
- char* cur = (char*)findLibPointer(dataChunk.oldPtr);
- for (int block=0; block<dataChunk.nr; block++)
+ char *cur = (char *)findLibPointer(dataChunk.oldPtr);
+ for (int block = 0; block < dataChunk.nr; block++)
{
- resolvePointersStructRecursive(cur,dataChunk.dna_nr, verboseMode,1);
+ resolvePointersStructRecursive(cur, dataChunk.dna_nr, verboseMode, 1);
cur += oldLen;
}
}
-
-int bFile::resolvePointersStructRecursive(char *strcPtr, int dna_nr, int verboseMode,int recursion)
+int bFile::resolvePointersStructRecursive(char *strcPtr, int dna_nr, int verboseMode, int recursion)
{
+ bParse::bDNA *fileDna = mFileDNA ? mFileDNA : mMemoryDNA;
- bParse::bDNA* fileDna = mFileDNA ? mFileDNA : mMemoryDNA;
+ char *memType;
+ char *memName;
+ short firstStructType = fileDna->getStruct(0)[0];
- char* memType;
- char* memName;
- short firstStructType = fileDna->getStruct(0)[0];
+ char *elemPtr = strcPtr;
-
- char* elemPtr= strcPtr;
-
- short int* oldStruct = fileDna->getStruct(dna_nr);
+ short int *oldStruct = fileDna->getStruct(dna_nr);
int elementLength = oldStruct[1];
- oldStruct+=2;
+ oldStruct += 2;
int totalSize = 0;
- for (int ele=0; ele<elementLength; ele++, oldStruct+=2)
+ for (int ele = 0; ele < elementLength; ele++, oldStruct += 2)
{
-
memType = fileDna->getType(oldStruct[0]);
memName = fileDna->getName(oldStruct[1]);
-
-
int arrayLen = fileDna->getArraySizeNew(oldStruct[1]);
if (memName[0] == '*')
{
if (arrayLen > 1)
{
- void **array= (void**)elemPtr;
- for (int a=0; a<arrayLen; a++)
+ void **array = (void **)elemPtr;
+ for (int a = 0; a < arrayLen; a++)
{
if (verboseMode & FD_VERBOSE_EXPORT_XML)
{
- for (int i=0;i<recursion;i++)
+ for (int i = 0; i < recursion; i++)
{
printf(" ");
}
//skip the *
- printf("<%s type=\"pointer\"> ",&memName[1]);
+ printf("<%s type=\"pointer\"> ", &memName[1]);
printf("%p ", array[a]);
- printf("</%s>\n",&memName[1]);
+ printf("</%s>\n", &memName[1]);
}
array[a] = findLibPointer(array[a]);
@@ -1261,266 +1193,259 @@ int bFile::resolvePointersStructRecursive(char *strcPtr, int dna_nr, int verbose
}
else
{
- void** ptrptr = (void**) elemPtr;
- void* ptr = *ptrptr;
+ void **ptrptr = (void **)elemPtr;
+ void *ptr = *ptrptr;
if (verboseMode & FD_VERBOSE_EXPORT_XML)
{
- for (int i=0;i<recursion;i++)
+ for (int i = 0; i < recursion; i++)
{
printf(" ");
}
- printf("<%s type=\"pointer\"> ",&memName[1]);
+ printf("<%s type=\"pointer\"> ", &memName[1]);
printf("%p ", ptr);
- printf("</%s>\n",&memName[1]);
+ printf("</%s>\n", &memName[1]);
}
ptr = findLibPointer(ptr);
if (ptr)
{
- // printf("Fixup pointer at 0x%x from 0x%x to 0x%x!\n",ptrptr,*ptrptr,ptr);
+ // printf("Fixup pointer at 0x%x from 0x%x to 0x%x!\n",ptrptr,*ptrptr,ptr);
*(ptrptr) = ptr;
if (memName[1] == '*' && ptrptr && *ptrptr)
{
// This will only work if the given **array is continuous
- void **array= (void**)*(ptrptr);
- void *np= array[0];
- int n=0;
+ void **array = (void **)*(ptrptr);
+ void *np = array[0];
+ int n = 0;
while (np)
{
- np= findLibPointer(array[n]);
- if (np) array[n]= np;
+ np = findLibPointer(array[n]);
+ if (np) array[n] = np;
n++;
}
}
- } else
+ }
+ else
{
- // printf("Cannot fixup pointer at 0x%x from 0x%x to 0x%x!\n",ptrptr,*ptrptr,ptr);
+ // printf("Cannot fixup pointer at 0x%x from 0x%x to 0x%x!\n",ptrptr,*ptrptr,ptr);
}
}
- } else
+ }
+ else
{
int revType = fileDna->getReverseType(oldStruct[0]);
- if (oldStruct[0]>=firstStructType) //revType != -1 &&
+ if (oldStruct[0] >= firstStructType) //revType != -1 &&
{
char cleanName[MAX_STRLEN];
- getCleanName(memName,cleanName);
+ getCleanName(memName, cleanName);
int arrayLen = fileDna->getArraySizeNew(oldStruct[1]);
int byteOffset = 0;
if (verboseMode & FD_VERBOSE_EXPORT_XML)
{
- for (int i=0;i<recursion;i++)
+ for (int i = 0; i < recursion; i++)
{
printf(" ");
}
- if (arrayLen>1)
+ if (arrayLen > 1)
{
- printf("<%s type=\"%s\" count=%d>\n",cleanName,memType, arrayLen);
- } else
+ printf("<%s type=\"%s\" count=%d>\n", cleanName, memType, arrayLen);
+ }
+ else
{
- printf("<%s type=\"%s\">\n",cleanName,memType);
+ printf("<%s type=\"%s\">\n", cleanName, memType);
}
}
- for (int i=0;i<arrayLen;i++)
+ for (int i = 0; i < arrayLen; i++)
{
- byteOffset += resolvePointersStructRecursive(elemPtr+byteOffset,revType, verboseMode,recursion+1);
+ byteOffset += resolvePointersStructRecursive(elemPtr + byteOffset, revType, verboseMode, recursion + 1);
}
if (verboseMode & FD_VERBOSE_EXPORT_XML)
{
- for (int i=0;i<recursion;i++)
+ for (int i = 0; i < recursion; i++)
{
printf(" ");
}
- printf("</%s>\n",cleanName);
+ printf("</%s>\n", cleanName);
}
- } else
+ }
+ else
{
//export a simple type
if (verboseMode & FD_VERBOSE_EXPORT_XML)
{
-
- if (arrayLen>MAX_ARRAY_LENGTH)
+ if (arrayLen > MAX_ARRAY_LENGTH)
{
printf("too long\n");
- } else
+ }
+ else
{
//printf("%s %s\n",memType,memName);
- bool isIntegerType = (strcmp(memType,"char")==0) || (strcmp(memType,"int")==0) || (strcmp(memType,"short")==0);
+ bool isIntegerType = (strcmp(memType, "char") == 0) || (strcmp(memType, "int") == 0) || (strcmp(memType, "short") == 0);
if (isIntegerType)
{
- const char* newtype="int";
+ const char *newtype = "int";
int dbarray[MAX_ARRAY_LENGTH];
- int* dbPtr = 0;
- char* tmp = elemPtr;
+ int *dbPtr = 0;
+ char *tmp = elemPtr;
dbPtr = &dbarray[0];
if (dbPtr)
{
char cleanName[MAX_STRLEN];
- getCleanName(memName,cleanName);
+ getCleanName(memName, cleanName);
int i;
- getElement(arrayLen, newtype,memType, tmp, (char*)dbPtr);
- for (i=0;i<recursion;i++)
+ getElement(arrayLen, newtype, memType, tmp, (char *)dbPtr);
+ for (i = 0; i < recursion; i++)
printf(" ");
- if (arrayLen==1)
- printf("<%s type=\"%s\">",cleanName,memType);
+ if (arrayLen == 1)
+ printf("<%s type=\"%s\">", cleanName, memType);
else
- printf("<%s type=\"%s\" count=%d>",cleanName,memType,arrayLen);
- for (i=0;i<arrayLen;i++)
- printf(" %d ",dbPtr[i]);
- printf("</%s>\n",cleanName);
+ printf("<%s type=\"%s\" count=%d>", cleanName, memType, arrayLen);
+ for (i = 0; i < arrayLen; i++)
+ printf(" %d ", dbPtr[i]);
+ printf("</%s>\n", cleanName);
}
- } else
+ }
+ else
{
- const char* newtype="double";
+ const char *newtype = "double";
double dbarray[MAX_ARRAY_LENGTH];
- double* dbPtr = 0;
- char* tmp = elemPtr;
+ double *dbPtr = 0;
+ char *tmp = elemPtr;
dbPtr = &dbarray[0];
if (dbPtr)
{
int i;
- getElement(arrayLen, newtype,memType, tmp, (char*)dbPtr);
- for (i=0;i<recursion;i++)
+ getElement(arrayLen, newtype, memType, tmp, (char *)dbPtr);
+ for (i = 0; i < recursion; i++)
printf(" ");
char cleanName[MAX_STRLEN];
- getCleanName(memName,cleanName);
+ getCleanName(memName, cleanName);
- if (arrayLen==1)
+ if (arrayLen == 1)
{
- printf("<%s type=\"%s\">",memName,memType);
+ printf("<%s type=\"%s\">", memName, memType);
}
else
{
- printf("<%s type=\"%s\" count=%d>",cleanName,memType,arrayLen);
+ printf("<%s type=\"%s\" count=%d>", cleanName, memType, arrayLen);
}
- for (i=0;i<arrayLen;i++)
- printf(" %f ",dbPtr[i]);
- printf("</%s>\n",cleanName);
+ for (i = 0; i < arrayLen; i++)
+ printf(" %f ", dbPtr[i]);
+ printf("</%s>\n", cleanName);
}
}
}
-
}
}
}
int size = fileDna->getElementSize(oldStruct[0], oldStruct[1]);
totalSize += size;
- elemPtr+=size;
-
+ elemPtr += size;
}
return totalSize;
}
-
///Resolve pointers replaces the original pointers in structures, and linked lists by the new in-memory structures
void bFile::resolvePointers(int verboseMode)
{
- bParse::bDNA* fileDna = mFileDNA ? mFileDNA : mMemoryDNA;
+ bParse::bDNA *fileDna = mFileDNA ? mFileDNA : mMemoryDNA;
//char *dataPtr = mFileBuffer+mDataStart;
- if (1) //mFlags & (FD_BITS_VARIES | FD_VERSION_VARIES))
+ if (1) //mFlags & (FD_BITS_VARIES | FD_VERSION_VARIES))
{
resolvePointersMismatch();
}
{
-
if (verboseMode & FD_VERBOSE_EXPORT_XML)
{
printf("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
int numitems = m_chunks.size();
printf("<bullet_physics version=%d itemcount = %d>\n", b3GetVersion(), numitems);
}
- for (int i=0;i<m_chunks.size();i++)
+ for (int i = 0; i < m_chunks.size(); i++)
{
- const bChunkInd& dataChunk = m_chunks.at(i);
+ const bChunkInd &dataChunk = m_chunks.at(i);
if (!mFileDNA || fileDna->flagEqual(dataChunk.dna_nr))
{
//dataChunk.len
- short int* oldStruct = fileDna->getStruct(dataChunk.dna_nr);
- char* oldType = fileDna->getType(oldStruct[0]);
+ short int *oldStruct = fileDna->getStruct(dataChunk.dna_nr);
+ char *oldType = fileDna->getType(oldStruct[0]);
if (verboseMode & FD_VERBOSE_EXPORT_XML)
- printf(" <%s pointer=%p>\n",oldType,dataChunk.oldPtr);
+ printf(" <%s pointer=%p>\n", oldType, dataChunk.oldPtr);
resolvePointersChunk(dataChunk, verboseMode);
if (verboseMode & FD_VERBOSE_EXPORT_XML)
- printf(" </%s>\n",oldType);
- } else
+ printf(" </%s>\n", oldType);
+ }
+ else
{
//printf("skipping mStruct\n");
}
}
- if (verboseMode & FD_VERBOSE_EXPORT_XML)
- {
- printf("</bullet_physics>\n");
- }
+ if (verboseMode & FD_VERBOSE_EXPORT_XML)
+ {
+ printf("</bullet_physics>\n");
+ }
}
-
-
}
-
// ----------------------------------------------------- //
-void* bFile::findLibPointer(void *ptr)
+void *bFile::findLibPointer(void *ptr)
{
-
- bStructHandle** ptrptr = getLibPointers().find(ptr);
+ bStructHandle **ptrptr = getLibPointers().find(ptr);
if (ptrptr)
return *ptrptr;
return 0;
}
-
-void bFile::updateOldPointers()
+void bFile::updateOldPointers()
{
int i;
- for (i=0;i<m_chunks.size();i++)
+ for (i = 0; i < m_chunks.size(); i++)
{
- bChunkInd& dataChunk = m_chunks[i];
+ bChunkInd &dataChunk = m_chunks[i];
dataChunk.oldPtr = findLibPointer(dataChunk.oldPtr);
}
}
-void bFile::dumpChunks(bParse::bDNA* dna)
+void bFile::dumpChunks(bParse::bDNA *dna)
{
int i;
- for (i=0;i<m_chunks.size();i++)
+ for (i = 0; i < m_chunks.size(); i++)
{
- bChunkInd& dataChunk = m_chunks[i];
- char* codeptr = (char*)&dataChunk.code;
- char codestr[5] = {codeptr[0],codeptr[1],codeptr[2],codeptr[3],0};
+ bChunkInd &dataChunk = m_chunks[i];
+ char *codeptr = (char *)&dataChunk.code;
+ char codestr[5] = {codeptr[0], codeptr[1], codeptr[2], codeptr[3], 0};
- short* newStruct = dna->getStruct(dataChunk.dna_nr);
- char* typeName = dna->getType(newStruct[0]);
- printf("%3d: %s ",i,typeName);
+ short *newStruct = dna->getStruct(dataChunk.dna_nr);
+ char *typeName = dna->getType(newStruct[0]);
+ printf("%3d: %s ", i, typeName);
- printf("code=%s ",codestr);
+ printf("code=%s ", codestr);
- printf("ptr=%p ",dataChunk.oldPtr);
- printf("len=%d ",dataChunk.len);
- printf("nr=%d ",dataChunk.nr);
- if (dataChunk.nr!=1)
+ printf("ptr=%p ", dataChunk.oldPtr);
+ printf("len=%d ", dataChunk.len);
+ printf("nr=%d ", dataChunk.nr);
+ if (dataChunk.nr != 1)
{
printf("not 1\n");
}
printf("\n");
-
-
-
-
}
#if 0
@@ -1536,20 +1461,18 @@ void bFile::dumpChunks(bParse::bDNA* dna)
printf("\n");
}
#endif
-
}
-
-void bFile::writeChunks(FILE* fp, bool fixupPointers)
+void bFile::writeChunks(FILE *fp, bool fixupPointers)
{
- bParse::bDNA* fileDna = mFileDNA ? mFileDNA : mMemoryDNA;
+ bParse::bDNA *fileDna = mFileDNA ? mFileDNA : mMemoryDNA;
- for (int i=0;i<m_chunks.size();i++)
+ for (int i = 0; i < m_chunks.size(); i++)
{
- bChunkInd& dataChunk = m_chunks.at(i);
+ bChunkInd &dataChunk = m_chunks.at(i);
// Ouch! need to rebuild the struct
- short *oldStruct,*curStruct;
+ short *oldStruct, *curStruct;
char *oldType, *newType;
int oldLen, curLen, reverseOld;
@@ -1559,8 +1482,7 @@ void bFile::writeChunks(FILE* fp, bool fixupPointers)
///don't try to convert Link block data, just memcpy it. Other data can be converted.
reverseOld = mMemoryDNA->getReverseType(oldType);
-
- if ((reverseOld!=-1))
+ if ((reverseOld != -1))
{
// make sure it's here
//assert(reverseOld!= -1 && "getReverseType() returned -1, struct required!");
@@ -1568,50 +1490,47 @@ void bFile::writeChunks(FILE* fp, bool fixupPointers)
curStruct = mMemoryDNA->getStruct(reverseOld);
newType = mMemoryDNA->getType(curStruct[0]);
// make sure it's the same
- assert((strcmp(oldType, newType)==0) && "internal error, struct mismatch!");
-
+ assert((strcmp(oldType, newType) == 0) && "internal error, struct mismatch!");
curLen = mMemoryDNA->getLength(curStruct[0]);
dataChunk.dna_nr = reverseOld;
- if (strcmp("Link",oldType)!=0)
+ if (strcmp("Link", oldType) != 0)
{
dataChunk.len = curLen * dataChunk.nr;
- } else
+ }
+ else
{
-// printf("keep length of link = %d\n",dataChunk.len);
+ // printf("keep length of link = %d\n",dataChunk.len);
}
//write the structure header
- fwrite(&dataChunk,sizeof(bChunkInd),1,fp);
-
+ fwrite(&dataChunk, sizeof(bChunkInd), 1, fp);
-
- short int* curStruct1;
+ short int *curStruct1;
curStruct1 = mMemoryDNA->getStruct(dataChunk.dna_nr);
assert(curStruct1 == curStruct);
- char* cur = fixupPointers ? (char*)findLibPointer(dataChunk.oldPtr) : (char*)dataChunk.oldPtr;
+ char *cur = fixupPointers ? (char *)findLibPointer(dataChunk.oldPtr) : (char *)dataChunk.oldPtr;
//write the actual contents of the structure(s)
- fwrite(cur,dataChunk.len,1,fp);
- } else
+ fwrite(cur, dataChunk.len, 1, fp);
+ }
+ else
{
printf("serious error, struct mismatch: don't write\n");
}
}
-
}
-
// ----------------------------------------------------- //
-int bFile::getNextBlock(bChunkInd *dataChunk, const char *dataPtr, const int flags)
+int bFile::getNextBlock(bChunkInd *dataChunk, const char *dataPtr, const int flags)
{
bool swap = false;
bool varies = false;
- if (flags &FD_ENDIAN_SWAP)
+ if (flags & FD_ENDIAN_SWAP)
swap = true;
- if (flags &FD_BITS_VARIES)
+ if (flags & FD_BITS_VARIES)
varies = true;
if (VOID_IS_8)
@@ -1621,27 +1540,25 @@ int bFile::getNextBlock(bChunkInd *dataChunk, const char *dataPtr, const int fl
bChunkPtr4 head;
memcpy(&head, dataPtr, sizeof(bChunkPtr4));
-
bChunkPtr8 chunk;
- chunk.code = head.code;
- chunk.len = head.len;
+ chunk.code = head.code;
+ chunk.len = head.len;
chunk.m_uniqueInts[0] = head.m_uniqueInt;
chunk.m_uniqueInts[1] = 0;
- chunk.dna_nr = head.dna_nr;
- chunk.nr = head.nr;
+ chunk.dna_nr = head.dna_nr;
+ chunk.nr = head.nr;
if (swap)
{
- if ((chunk.code & 0xFFFF)==0)
- chunk.code >>=16;
+ if ((chunk.code & 0xFFFF) == 0)
+ chunk.code >>= 16;
B3_SWITCH_INT(chunk.len);
B3_SWITCH_INT(chunk.dna_nr);
B3_SWITCH_INT(chunk.nr);
}
-
memcpy(dataChunk, &chunk, sizeof(bChunkInd));
}
else
@@ -1651,8 +1568,8 @@ int bFile::getNextBlock(bChunkInd *dataChunk, const char *dataPtr, const int fl
if (swap)
{
- if ((c.code & 0xFFFF)==0)
- c.code >>=16;
+ if ((c.code & 0xFFFF) == 0)
+ c.code >>= 16;
B3_SWITCH_INT(c.len);
B3_SWITCH_INT(c.dna_nr);
@@ -1669,31 +1586,30 @@ int bFile::getNextBlock(bChunkInd *dataChunk, const char *dataPtr, const int fl
bChunkPtr8 head;
memcpy(&head, dataPtr, sizeof(bChunkPtr8));
-
bChunkPtr4 chunk;
chunk.code = head.code;
chunk.len = head.len;
- if (head.m_uniqueInts[0]==head.m_uniqueInts[1])
+ if (head.m_uniqueInts[0] == head.m_uniqueInts[1])
{
chunk.m_uniqueInt = head.m_uniqueInts[0];
- } else
+ }
+ else
{
- b3Long64 oldPtr =0;
+ b3Long64 oldPtr = 0;
memcpy(&oldPtr, &head.m_uniqueInts[0], 8);
if (swap)
B3_SWITCH_LONGINT(oldPtr);
chunk.m_uniqueInt = (int)(oldPtr >> 3);
}
-
chunk.dna_nr = head.dna_nr;
chunk.nr = head.nr;
if (swap)
{
- if ((chunk.code & 0xFFFF)==0)
- chunk.code >>=16;
+ if ((chunk.code & 0xFFFF) == 0)
+ chunk.code >>= 16;
B3_SWITCH_INT(chunk.len);
B3_SWITCH_INT(chunk.dna_nr);
@@ -1709,8 +1625,8 @@ int bFile::getNextBlock(bChunkInd *dataChunk, const char *dataPtr, const int fl
if (swap)
{
- if ((c.code & 0xFFFF)==0)
- c.code >>=16;
+ if ((c.code & 0xFFFF) == 0)
+ c.code >>= 16;
B3_SWITCH_INT(c.len);
B3_SWITCH_INT(c.dna_nr);
@@ -1731,9 +1647,7 @@ int bFile::getNextBlock(bChunkInd *dataChunk, const char *dataPtr, const int fl
print (dataChunk->dna_nr);
print (dataChunk->nr);
#endif
- return (dataChunk->len+ChunkUtils::getOffset(flags));
+ return (dataChunk->len + ChunkUtils::getOffset(flags));
}
-
-
//eof
diff --git a/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3File.h b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3File.h
index 861056806d..bda229cfbd 100644
--- a/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3File.h
+++ b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3File.h
@@ -20,146 +20,139 @@ subject to the following restrictions:
#include "b3Chunk.h"
#include <stdio.h>
-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
+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<char *> m_pointerFixupArray;
+ b3AlignedObjectArray<char *> m_pointerPtrFixupArray;
+
+ b3AlignedObjectArray<bChunkInd> m_chunks;
+ b3HashMap<b3HashPtr, bChunkInd> 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()
{
- 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<char*> m_pointerFixupArray;
- b3AlignedObjectArray<char*> m_pointerPtrFixupArray;
-
- b3AlignedObjectArray<bChunkInd> m_chunks;
- b3HashMap<b3HashPtr, bChunkInd> 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);
+ return mFileDNA;
+ }
- int resolvePointersStructRecursive(char *strcPtr, int old_dna, int verboseMode, int recursion);
- //void swapPtr(char *dst, char *src);
+ virtual void addDataBlock(char *dataBlock) = 0;
- 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);
+ int getFlags() const
+ {
+ return mFlags;
+ }
- bool ok();
+ bPtrMap &getLibPointers()
+ {
+ return mLibPointers;
+ }
- virtual void parse(int verboseMode) = 0;
+ void *findLibPointer(void *ptr);
- virtual int write(const char* fileName, bool fixupPointers=false) = 0;
+ bool ok();
- virtual void writeChunks(FILE* fp, bool fixupPointers );
+ virtual void parse(int verboseMode) = 0;
- virtual void writeDNA(FILE* fp) = 0;
+ virtual int write(const char *fileName, bool fixupPointers = false) = 0;
- void updateOldPointers();
- void resolvePointers(int verboseMode);
+ virtual void writeChunks(FILE *fp, bool fixupPointers);
- 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);
+ virtual void writeDNA(FILE *fp) = 0;
- };
-}
+ void updateOldPointers();
+ void resolvePointers(int verboseMode);
+ void dumpChunks(bDNA *dna);
-#endif//__BFILE_H__
+ 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/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Serializer.cpp b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Serializer.cpp
index c6a2a832ad..ea4a8e2007 100644
--- a/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Serializer.cpp
+++ b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Serializer.cpp
@@ -1,908 +1,18062 @@
-char b3s_bulletDNAstr[]= {
-char(83),char(68),char(78),char(65),char(78),char(65),char(77),char(69),char(63),char(1),char(0),char(0),char(109),char(95),char(115),char(105),char(122),char(101),char(0),char(109),
-char(95),char(99),char(97),char(112),char(97),char(99),char(105),char(116),char(121),char(0),char(42),char(109),char(95),char(100),char(97),char(116),char(97),char(0),char(109),char(95),
-char(99),char(111),char(108),char(108),char(105),char(115),char(105),char(111),char(110),char(83),char(104),char(97),char(112),char(101),char(115),char(0),char(109),char(95),char(99),char(111),
-char(108),char(108),char(105),char(115),char(105),char(111),char(110),char(79),char(98),char(106),char(101),char(99),char(116),char(115),char(0),char(109),char(95),char(99),char(111),char(110),
-char(115),char(116),char(114),char(97),char(105),char(110),char(116),char(115),char(0),char(42),char(102),char(105),char(114),char(115),char(116),char(0),char(42),char(108),char(97),char(115),
-char(116),char(0),char(109),char(95),char(102),char(108),char(111),char(97),char(116),char(115),char(91),char(52),char(93),char(0),char(109),char(95),char(101),char(108),char(91),char(51),
-char(93),char(0),char(109),char(95),char(98),char(97),char(115),char(105),char(115),char(0),char(109),char(95),char(111),char(114),char(105),char(103),char(105),char(110),char(0),char(109),
-char(95),char(114),char(111),char(111),char(116),char(78),char(111),char(100),char(101),char(73),char(110),char(100),char(101),char(120),char(0),char(109),char(95),char(115),char(117),char(98),
-char(116),char(114),char(101),char(101),char(83),char(105),char(122),char(101),char(0),char(109),char(95),char(113),char(117),char(97),char(110),char(116),char(105),char(122),char(101),char(100),
-char(65),char(97),char(98),char(98),char(77),char(105),char(110),char(91),char(51),char(93),char(0),char(109),char(95),char(113),char(117),char(97),char(110),char(116),char(105),char(122),
-char(101),char(100),char(65),char(97),char(98),char(98),char(77),char(97),char(120),char(91),char(51),char(93),char(0),char(109),char(95),char(97),char(97),char(98),char(98),char(77),
-char(105),char(110),char(79),char(114),char(103),char(0),char(109),char(95),char(97),char(97),char(98),char(98),char(77),char(97),char(120),char(79),char(114),char(103),char(0),char(109),
-char(95),char(101),char(115),char(99),char(97),char(112),char(101),char(73),char(110),char(100),char(101),char(120),char(0),char(109),char(95),char(115),char(117),char(98),char(80),char(97),
-char(114),char(116),char(0),char(109),char(95),char(116),char(114),char(105),char(97),char(110),char(103),char(108),char(101),char(73),char(110),char(100),char(101),char(120),char(0),char(109),
-char(95),char(112),char(97),char(100),char(91),char(52),char(93),char(0),char(109),char(95),char(101),char(115),char(99),char(97),char(112),char(101),char(73),char(110),char(100),char(101),
-char(120),char(79),char(114),char(84),char(114),char(105),char(97),char(110),char(103),char(108),char(101),char(73),char(110),char(100),char(101),char(120),char(0),char(109),char(95),char(98),
-char(118),char(104),char(65),char(97),char(98),char(98),char(77),char(105),char(110),char(0),char(109),char(95),char(98),char(118),char(104),char(65),char(97),char(98),char(98),char(77),
-char(97),char(120),char(0),char(109),char(95),char(98),char(118),char(104),char(81),char(117),char(97),char(110),char(116),char(105),char(122),char(97),char(116),char(105),char(111),char(110),
-char(0),char(109),char(95),char(99),char(117),char(114),char(78),char(111),char(100),char(101),char(73),char(110),char(100),char(101),char(120),char(0),char(109),char(95),char(117),char(115),
-char(101),char(81),char(117),char(97),char(110),char(116),char(105),char(122),char(97),char(116),char(105),char(111),char(110),char(0),char(109),char(95),char(110),char(117),char(109),char(67),
-char(111),char(110),char(116),char(105),char(103),char(117),char(111),char(117),char(115),char(76),char(101),char(97),char(102),char(78),char(111),char(100),char(101),char(115),char(0),char(109),
-char(95),char(110),char(117),char(109),char(81),char(117),char(97),char(110),char(116),char(105),char(122),char(101),char(100),char(67),char(111),char(110),char(116),char(105),char(103),char(117),
-char(111),char(117),char(115),char(78),char(111),char(100),char(101),char(115),char(0),char(42),char(109),char(95),char(99),char(111),char(110),char(116),char(105),char(103),char(117),char(111),
-char(117),char(115),char(78),char(111),char(100),char(101),char(115),char(80),char(116),char(114),char(0),char(42),char(109),char(95),char(113),char(117),char(97),char(110),char(116),char(105),
-char(122),char(101),char(100),char(67),char(111),char(110),char(116),char(105),char(103),char(117),char(111),char(117),char(115),char(78),char(111),char(100),char(101),char(115),char(80),char(116),
-char(114),char(0),char(42),char(109),char(95),char(115),char(117),char(98),char(84),char(114),char(101),char(101),char(73),char(110),char(102),char(111),char(80),char(116),char(114),char(0),
-char(109),char(95),char(116),char(114),char(97),char(118),char(101),char(114),char(115),char(97),char(108),char(77),char(111),char(100),char(101),char(0),char(109),char(95),char(110),char(117),
-char(109),char(83),char(117),char(98),char(116),char(114),char(101),char(101),char(72),char(101),char(97),char(100),char(101),char(114),char(115),char(0),char(42),char(109),char(95),char(110),
-char(97),char(109),char(101),char(0),char(109),char(95),char(115),char(104),char(97),char(112),char(101),char(84),char(121),char(112),char(101),char(0),char(109),char(95),char(112),char(97),
-char(100),char(100),char(105),char(110),char(103),char(91),char(52),char(93),char(0),char(109),char(95),char(99),char(111),char(108),char(108),char(105),char(115),char(105),char(111),char(110),
-char(83),char(104),char(97),char(112),char(101),char(68),char(97),char(116),char(97),char(0),char(109),char(95),char(108),char(111),char(99),char(97),char(108),char(83),char(99),char(97),
-char(108),char(105),char(110),char(103),char(0),char(109),char(95),char(112),char(108),char(97),char(110),char(101),char(78),char(111),char(114),char(109),char(97),char(108),char(0),char(109),
-char(95),char(112),char(108),char(97),char(110),char(101),char(67),char(111),char(110),char(115),char(116),char(97),char(110),char(116),char(0),char(109),char(95),char(105),char(109),char(112),
-char(108),char(105),char(99),char(105),char(116),char(83),char(104),char(97),char(112),char(101),char(68),char(105),char(109),char(101),char(110),char(115),char(105),char(111),char(110),char(115),
-char(0),char(109),char(95),char(99),char(111),char(108),char(108),char(105),char(115),char(105),char(111),char(110),char(77),char(97),char(114),char(103),char(105),char(110),char(0),char(109),
-char(95),char(112),char(97),char(100),char(100),char(105),char(110),char(103),char(0),char(109),char(95),char(112),char(111),char(115),char(0),char(109),char(95),char(114),char(97),char(100),
-char(105),char(117),char(115),char(0),char(109),char(95),char(99),char(111),char(110),char(118),char(101),char(120),char(73),char(110),char(116),char(101),char(114),char(110),char(97),char(108),
-char(83),char(104),char(97),char(112),char(101),char(68),char(97),char(116),char(97),char(0),char(42),char(109),char(95),char(108),char(111),char(99),char(97),char(108),char(80),char(111),
-char(115),char(105),char(116),char(105),char(111),char(110),char(65),char(114),char(114),char(97),char(121),char(80),char(116),char(114),char(0),char(109),char(95),char(108),char(111),char(99),
-char(97),char(108),char(80),char(111),char(115),char(105),char(116),char(105),char(111),char(110),char(65),char(114),char(114),char(97),char(121),char(83),char(105),char(122),char(101),char(0),
-char(109),char(95),char(118),char(97),char(108),char(117),char(101),char(0),char(109),char(95),char(112),char(97),char(100),char(91),char(50),char(93),char(0),char(109),char(95),char(118),
-char(97),char(108),char(117),char(101),char(115),char(91),char(51),char(93),char(0),char(109),char(95),char(112),char(97),char(100),char(0),char(42),char(109),char(95),char(118),char(101),
-char(114),char(116),char(105),char(99),char(101),char(115),char(51),char(102),char(0),char(42),char(109),char(95),char(118),char(101),char(114),char(116),char(105),char(99),char(101),char(115),
-char(51),char(100),char(0),char(42),char(109),char(95),char(105),char(110),char(100),char(105),char(99),char(101),char(115),char(51),char(50),char(0),char(42),char(109),char(95),char(51),
-char(105),char(110),char(100),char(105),char(99),char(101),char(115),char(49),char(54),char(0),char(42),char(109),char(95),char(51),char(105),char(110),char(100),char(105),char(99),char(101),
-char(115),char(56),char(0),char(42),char(109),char(95),char(105),char(110),char(100),char(105),char(99),char(101),char(115),char(49),char(54),char(0),char(109),char(95),char(110),char(117),
-char(109),char(84),char(114),char(105),char(97),char(110),char(103),char(108),char(101),char(115),char(0),char(109),char(95),char(110),char(117),char(109),char(86),char(101),char(114),char(116),
-char(105),char(99),char(101),char(115),char(0),char(42),char(109),char(95),char(109),char(101),char(115),char(104),char(80),char(97),char(114),char(116),char(115),char(80),char(116),char(114),
-char(0),char(109),char(95),char(115),char(99),char(97),char(108),char(105),char(110),char(103),char(0),char(109),char(95),char(110),char(117),char(109),char(77),char(101),char(115),char(104),
-char(80),char(97),char(114),char(116),char(115),char(0),char(109),char(95),char(109),char(101),char(115),char(104),char(73),char(110),char(116),char(101),char(114),char(102),char(97),char(99),
-char(101),char(0),char(42),char(109),char(95),char(113),char(117),char(97),char(110),char(116),char(105),char(122),char(101),char(100),char(70),char(108),char(111),char(97),char(116),char(66),
-char(118),char(104),char(0),char(42),char(109),char(95),char(113),char(117),char(97),char(110),char(116),char(105),char(122),char(101),char(100),char(68),char(111),char(117),char(98),char(108),
-char(101),char(66),char(118),char(104),char(0),char(42),char(109),char(95),char(116),char(114),char(105),char(97),char(110),char(103),char(108),char(101),char(73),char(110),char(102),char(111),
-char(77),char(97),char(112),char(0),char(109),char(95),char(112),char(97),char(100),char(51),char(91),char(52),char(93),char(0),char(109),char(95),char(116),char(114),char(105),char(109),
-char(101),char(115),char(104),char(83),char(104),char(97),char(112),char(101),char(68),char(97),char(116),char(97),char(0),char(109),char(95),char(116),char(114),char(97),char(110),char(115),
-char(102),char(111),char(114),char(109),char(0),char(42),char(109),char(95),char(99),char(104),char(105),char(108),char(100),char(83),char(104),char(97),char(112),char(101),char(0),char(109),
-char(95),char(99),char(104),char(105),char(108),char(100),char(83),char(104),char(97),char(112),char(101),char(84),char(121),char(112),char(101),char(0),char(109),char(95),char(99),char(104),
-char(105),char(108),char(100),char(77),char(97),char(114),char(103),char(105),char(110),char(0),char(42),char(109),char(95),char(99),char(104),char(105),char(108),char(100),char(83),char(104),
-char(97),char(112),char(101),char(80),char(116),char(114),char(0),char(109),char(95),char(110),char(117),char(109),char(67),char(104),char(105),char(108),char(100),char(83),char(104),char(97),
-char(112),char(101),char(115),char(0),char(109),char(95),char(117),char(112),char(65),char(120),char(105),char(115),char(0),char(109),char(95),char(102),char(108),char(97),char(103),char(115),
-char(0),char(109),char(95),char(101),char(100),char(103),char(101),char(86),char(48),char(86),char(49),char(65),char(110),char(103),char(108),char(101),char(0),char(109),char(95),char(101),
-char(100),char(103),char(101),char(86),char(49),char(86),char(50),char(65),char(110),char(103),char(108),char(101),char(0),char(109),char(95),char(101),char(100),char(103),char(101),char(86),
-char(50),char(86),char(48),char(65),char(110),char(103),char(108),char(101),char(0),char(42),char(109),char(95),char(104),char(97),char(115),char(104),char(84),char(97),char(98),char(108),
-char(101),char(80),char(116),char(114),char(0),char(42),char(109),char(95),char(110),char(101),char(120),char(116),char(80),char(116),char(114),char(0),char(42),char(109),char(95),char(118),
-char(97),char(108),char(117),char(101),char(65),char(114),char(114),char(97),char(121),char(80),char(116),char(114),char(0),char(42),char(109),char(95),char(107),char(101),char(121),char(65),
-char(114),char(114),char(97),char(121),char(80),char(116),char(114),char(0),char(109),char(95),char(99),char(111),char(110),char(118),char(101),char(120),char(69),char(112),char(115),char(105),
-char(108),char(111),char(110),char(0),char(109),char(95),char(112),char(108),char(97),char(110),char(97),char(114),char(69),char(112),char(115),char(105),char(108),char(111),char(110),char(0),
-char(109),char(95),char(101),char(113),char(117),char(97),char(108),char(86),char(101),char(114),char(116),char(101),char(120),char(84),char(104),char(114),char(101),char(115),char(104),char(111),
-char(108),char(100),char(0),char(109),char(95),char(101),char(100),char(103),char(101),char(68),char(105),char(115),char(116),char(97),char(110),char(99),char(101),char(84),char(104),char(114),
-char(101),char(115),char(104),char(111),char(108),char(100),char(0),char(109),char(95),char(122),char(101),char(114),char(111),char(65),char(114),char(101),char(97),char(84),char(104),char(114),
-char(101),char(115),char(104),char(111),char(108),char(100),char(0),char(109),char(95),char(110),char(101),char(120),char(116),char(83),char(105),char(122),char(101),char(0),char(109),char(95),
-char(104),char(97),char(115),char(104),char(84),char(97),char(98),char(108),char(101),char(83),char(105),char(122),char(101),char(0),char(109),char(95),char(110),char(117),char(109),char(86),
-char(97),char(108),char(117),char(101),char(115),char(0),char(109),char(95),char(110),char(117),char(109),char(75),char(101),char(121),char(115),char(0),char(109),char(95),char(103),char(105),
-char(109),char(112),char(97),char(99),char(116),char(83),char(117),char(98),char(84),char(121),char(112),char(101),char(0),char(42),char(109),char(95),char(117),char(110),char(115),char(99),
-char(97),char(108),char(101),char(100),char(80),char(111),char(105),char(110),char(116),char(115),char(70),char(108),char(111),char(97),char(116),char(80),char(116),char(114),char(0),char(42),
-char(109),char(95),char(117),char(110),char(115),char(99),char(97),char(108),char(101),char(100),char(80),char(111),char(105),char(110),char(116),char(115),char(68),char(111),char(117),char(98),
-char(108),char(101),char(80),char(116),char(114),char(0),char(109),char(95),char(110),char(117),char(109),char(85),char(110),char(115),char(99),char(97),char(108),char(101),char(100),char(80),
-char(111),char(105),char(110),char(116),char(115),char(0),char(109),char(95),char(112),char(97),char(100),char(100),char(105),char(110),char(103),char(51),char(91),char(52),char(93),char(0),
-char(42),char(109),char(95),char(98),char(114),char(111),char(97),char(100),char(112),char(104),char(97),char(115),char(101),char(72),char(97),char(110),char(100),char(108),char(101),char(0),
-char(42),char(109),char(95),char(99),char(111),char(108),char(108),char(105),char(115),char(105),char(111),char(110),char(83),char(104),char(97),char(112),char(101),char(0),char(42),char(109),
-char(95),char(114),char(111),char(111),char(116),char(67),char(111),char(108),char(108),char(105),char(115),char(105),char(111),char(110),char(83),char(104),char(97),char(112),char(101),char(0),
-char(109),char(95),char(119),char(111),char(114),char(108),char(100),char(84),char(114),char(97),char(110),char(115),char(102),char(111),char(114),char(109),char(0),char(109),char(95),char(105),
-char(110),char(116),char(101),char(114),char(112),char(111),char(108),char(97),char(116),char(105),char(111),char(110),char(87),char(111),char(114),char(108),char(100),char(84),char(114),char(97),
-char(110),char(115),char(102),char(111),char(114),char(109),char(0),char(109),char(95),char(105),char(110),char(116),char(101),char(114),char(112),char(111),char(108),char(97),char(116),char(105),
-char(111),char(110),char(76),char(105),char(110),char(101),char(97),char(114),char(86),char(101),char(108),char(111),char(99),char(105),char(116),char(121),char(0),char(109),char(95),char(105),
-char(110),char(116),char(101),char(114),char(112),char(111),char(108),char(97),char(116),char(105),char(111),char(110),char(65),char(110),char(103),char(117),char(108),char(97),char(114),char(86),
-char(101),char(108),char(111),char(99),char(105),char(116),char(121),char(0),char(109),char(95),char(97),char(110),char(105),char(115),char(111),char(116),char(114),char(111),char(112),char(105),
-char(99),char(70),char(114),char(105),char(99),char(116),char(105),char(111),char(110),char(0),char(109),char(95),char(99),char(111),char(110),char(116),char(97),char(99),char(116),char(80),
-char(114),char(111),char(99),char(101),char(115),char(115),char(105),char(110),char(103),char(84),char(104),char(114),char(101),char(115),char(104),char(111),char(108),char(100),char(0),char(109),
-char(95),char(100),char(101),char(97),char(99),char(116),char(105),char(118),char(97),char(116),char(105),char(111),char(110),char(84),char(105),char(109),char(101),char(0),char(109),char(95),
-char(102),char(114),char(105),char(99),char(116),char(105),char(111),char(110),char(0),char(109),char(95),char(114),char(111),char(108),char(108),char(105),char(110),char(103),char(70),char(114),
-char(105),char(99),char(116),char(105),char(111),char(110),char(0),char(109),char(95),char(114),char(101),char(115),char(116),char(105),char(116),char(117),char(116),char(105),char(111),char(110),
-char(0),char(109),char(95),char(104),char(105),char(116),char(70),char(114),char(97),char(99),char(116),char(105),char(111),char(110),char(0),char(109),char(95),char(99),char(99),char(100),
-char(83),char(119),char(101),char(112),char(116),char(83),char(112),char(104),char(101),char(114),char(101),char(82),char(97),char(100),char(105),char(117),char(115),char(0),char(109),char(95),
-char(99),char(99),char(100),char(77),char(111),char(116),char(105),char(111),char(110),char(84),char(104),char(114),char(101),char(115),char(104),char(111),char(108),char(100),char(0),char(109),
-char(95),char(104),char(97),char(115),char(65),char(110),char(105),char(115),char(111),char(116),char(114),char(111),char(112),char(105),char(99),char(70),char(114),char(105),char(99),char(116),
-char(105),char(111),char(110),char(0),char(109),char(95),char(99),char(111),char(108),char(108),char(105),char(115),char(105),char(111),char(110),char(70),char(108),char(97),char(103),char(115),
-char(0),char(109),char(95),char(105),char(115),char(108),char(97),char(110),char(100),char(84),char(97),char(103),char(49),char(0),char(109),char(95),char(99),char(111),char(109),char(112),
-char(97),char(110),char(105),char(111),char(110),char(73),char(100),char(0),char(109),char(95),char(97),char(99),char(116),char(105),char(118),char(97),char(116),char(105),char(111),char(110),
-char(83),char(116),char(97),char(116),char(101),char(49),char(0),char(109),char(95),char(105),char(110),char(116),char(101),char(114),char(110),char(97),char(108),char(84),char(121),char(112),
-char(101),char(0),char(109),char(95),char(99),char(104),char(101),char(99),char(107),char(67),char(111),char(108),char(108),char(105),char(100),char(101),char(87),char(105),char(116),char(104),
-char(0),char(109),char(95),char(115),char(111),char(108),char(118),char(101),char(114),char(73),char(110),char(102),char(111),char(0),char(109),char(95),char(103),char(114),char(97),char(118),
-char(105),char(116),char(121),char(0),char(109),char(95),char(99),char(111),char(108),char(108),char(105),char(115),char(105),char(111),char(110),char(79),char(98),char(106),char(101),char(99),
-char(116),char(68),char(97),char(116),char(97),char(0),char(109),char(95),char(105),char(110),char(118),char(73),char(110),char(101),char(114),char(116),char(105),char(97),char(84),char(101),
-char(110),char(115),char(111),char(114),char(87),char(111),char(114),char(108),char(100),char(0),char(109),char(95),char(108),char(105),char(110),char(101),char(97),char(114),char(86),char(101),
-char(108),char(111),char(99),char(105),char(116),char(121),char(0),char(109),char(95),char(97),char(110),char(103),char(117),char(108),char(97),char(114),char(86),char(101),char(108),char(111),
-char(99),char(105),char(116),char(121),char(0),char(109),char(95),char(97),char(110),char(103),char(117),char(108),char(97),char(114),char(70),char(97),char(99),char(116),char(111),char(114),
-char(0),char(109),char(95),char(108),char(105),char(110),char(101),char(97),char(114),char(70),char(97),char(99),char(116),char(111),char(114),char(0),char(109),char(95),char(103),char(114),
-char(97),char(118),char(105),char(116),char(121),char(95),char(97),char(99),char(99),char(101),char(108),char(101),char(114),char(97),char(116),char(105),char(111),char(110),char(0),char(109),
-char(95),char(105),char(110),char(118),char(73),char(110),char(101),char(114),char(116),char(105),char(97),char(76),char(111),char(99),char(97),char(108),char(0),char(109),char(95),char(116),
-char(111),char(116),char(97),char(108),char(70),char(111),char(114),char(99),char(101),char(0),char(109),char(95),char(116),char(111),char(116),char(97),char(108),char(84),char(111),char(114),
-char(113),char(117),char(101),char(0),char(109),char(95),char(105),char(110),char(118),char(101),char(114),char(115),char(101),char(77),char(97),char(115),char(115),char(0),char(109),char(95),
-char(108),char(105),char(110),char(101),char(97),char(114),char(68),char(97),char(109),char(112),char(105),char(110),char(103),char(0),char(109),char(95),char(97),char(110),char(103),char(117),
-char(108),char(97),char(114),char(68),char(97),char(109),char(112),char(105),char(110),char(103),char(0),char(109),char(95),char(97),char(100),char(100),char(105),char(116),char(105),char(111),
-char(110),char(97),char(108),char(68),char(97),char(109),char(112),char(105),char(110),char(103),char(70),char(97),char(99),char(116),char(111),char(114),char(0),char(109),char(95),char(97),
-char(100),char(100),char(105),char(116),char(105),char(111),char(110),char(97),char(108),char(76),char(105),char(110),char(101),char(97),char(114),char(68),char(97),char(109),char(112),char(105),
-char(110),char(103),char(84),char(104),char(114),char(101),char(115),char(104),char(111),char(108),char(100),char(83),char(113),char(114),char(0),char(109),char(95),char(97),char(100),char(100),
-char(105),char(116),char(105),char(111),char(110),char(97),char(108),char(65),char(110),char(103),char(117),char(108),char(97),char(114),char(68),char(97),char(109),char(112),char(105),char(110),
-char(103),char(84),char(104),char(114),char(101),char(115),char(104),char(111),char(108),char(100),char(83),char(113),char(114),char(0),char(109),char(95),char(97),char(100),char(100),char(105),
-char(116),char(105),char(111),char(110),char(97),char(108),char(65),char(110),char(103),char(117),char(108),char(97),char(114),char(68),char(97),char(109),char(112),char(105),char(110),char(103),
-char(70),char(97),char(99),char(116),char(111),char(114),char(0),char(109),char(95),char(108),char(105),char(110),char(101),char(97),char(114),char(83),char(108),char(101),char(101),char(112),
-char(105),char(110),char(103),char(84),char(104),char(114),char(101),char(115),char(104),char(111),char(108),char(100),char(0),char(109),char(95),char(97),char(110),char(103),char(117),char(108),
-char(97),char(114),char(83),char(108),char(101),char(101),char(112),char(105),char(110),char(103),char(84),char(104),char(114),char(101),char(115),char(104),char(111),char(108),char(100),char(0),
-char(109),char(95),char(97),char(100),char(100),char(105),char(116),char(105),char(111),char(110),char(97),char(108),char(68),char(97),char(109),char(112),char(105),char(110),char(103),char(0),
-char(109),char(95),char(110),char(117),char(109),char(67),char(111),char(110),char(115),char(116),char(114),char(97),char(105),char(110),char(116),char(82),char(111),char(119),char(115),char(0),
-char(110),char(117),char(98),char(0),char(42),char(109),char(95),char(114),char(98),char(65),char(0),char(42),char(109),char(95),char(114),char(98),char(66),char(0),char(109),char(95),
-char(111),char(98),char(106),char(101),char(99),char(116),char(84),char(121),char(112),char(101),char(0),char(109),char(95),char(117),char(115),char(101),char(114),char(67),char(111),char(110),
-char(115),char(116),char(114),char(97),char(105),char(110),char(116),char(84),char(121),char(112),char(101),char(0),char(109),char(95),char(117),char(115),char(101),char(114),char(67),char(111),
-char(110),char(115),char(116),char(114),char(97),char(105),char(110),char(116),char(73),char(100),char(0),char(109),char(95),char(110),char(101),char(101),char(100),char(115),char(70),char(101),
-char(101),char(100),char(98),char(97),char(99),char(107),char(0),char(109),char(95),char(97),char(112),char(112),char(108),char(105),char(101),char(100),char(73),char(109),char(112),char(117),
-char(108),char(115),char(101),char(0),char(109),char(95),char(100),char(98),char(103),char(68),char(114),char(97),char(119),char(83),char(105),char(122),char(101),char(0),char(109),char(95),
-char(100),char(105),char(115),char(97),char(98),char(108),char(101),char(67),char(111),char(108),char(108),char(105),char(115),char(105),char(111),char(110),char(115),char(66),char(101),char(116),
-char(119),char(101),char(101),char(110),char(76),char(105),char(110),char(107),char(101),char(100),char(66),char(111),char(100),char(105),char(101),char(115),char(0),char(109),char(95),char(111),
-char(118),char(101),char(114),char(114),char(105),char(100),char(101),char(78),char(117),char(109),char(83),char(111),char(108),char(118),char(101),char(114),char(73),char(116),char(101),char(114),
-char(97),char(116),char(105),char(111),char(110),char(115),char(0),char(109),char(95),char(98),char(114),char(101),char(97),char(107),char(105),char(110),char(103),char(73),char(109),char(112),
-char(117),char(108),char(115),char(101),char(84),char(104),char(114),char(101),char(115),char(104),char(111),char(108),char(100),char(0),char(109),char(95),char(105),char(115),char(69),char(110),
-char(97),char(98),char(108),char(101),char(100),char(0),char(109),char(95),char(116),char(121),char(112),char(101),char(67),char(111),char(110),char(115),char(116),char(114),char(97),char(105),
-char(110),char(116),char(68),char(97),char(116),char(97),char(0),char(109),char(95),char(112),char(105),char(118),char(111),char(116),char(73),char(110),char(65),char(0),char(109),char(95),
-char(112),char(105),char(118),char(111),char(116),char(73),char(110),char(66),char(0),char(109),char(95),char(114),char(98),char(65),char(70),char(114),char(97),char(109),char(101),char(0),
-char(109),char(95),char(114),char(98),char(66),char(70),char(114),char(97),char(109),char(101),char(0),char(109),char(95),char(117),char(115),char(101),char(82),char(101),char(102),char(101),
-char(114),char(101),char(110),char(99),char(101),char(70),char(114),char(97),char(109),char(101),char(65),char(0),char(109),char(95),char(97),char(110),char(103),char(117),char(108),char(97),
-char(114),char(79),char(110),char(108),char(121),char(0),char(109),char(95),char(101),char(110),char(97),char(98),char(108),char(101),char(65),char(110),char(103),char(117),char(108),char(97),
-char(114),char(77),char(111),char(116),char(111),char(114),char(0),char(109),char(95),char(109),char(111),char(116),char(111),char(114),char(84),char(97),char(114),char(103),char(101),char(116),
-char(86),char(101),char(108),char(111),char(99),char(105),char(116),char(121),char(0),char(109),char(95),char(109),char(97),char(120),char(77),char(111),char(116),char(111),char(114),char(73),
-char(109),char(112),char(117),char(108),char(115),char(101),char(0),char(109),char(95),char(108),char(111),char(119),char(101),char(114),char(76),char(105),char(109),char(105),char(116),char(0),
-char(109),char(95),char(117),char(112),char(112),char(101),char(114),char(76),char(105),char(109),char(105),char(116),char(0),char(109),char(95),char(108),char(105),char(109),char(105),char(116),
-char(83),char(111),char(102),char(116),char(110),char(101),char(115),char(115),char(0),char(109),char(95),char(98),char(105),char(97),char(115),char(70),char(97),char(99),char(116),char(111),
-char(114),char(0),char(109),char(95),char(114),char(101),char(108),char(97),char(120),char(97),char(116),char(105),char(111),char(110),char(70),char(97),char(99),char(116),char(111),char(114),
-char(0),char(109),char(95),char(115),char(119),char(105),char(110),char(103),char(83),char(112),char(97),char(110),char(49),char(0),char(109),char(95),char(115),char(119),char(105),char(110),
-char(103),char(83),char(112),char(97),char(110),char(50),char(0),char(109),char(95),char(116),char(119),char(105),char(115),char(116),char(83),char(112),char(97),char(110),char(0),char(109),
-char(95),char(100),char(97),char(109),char(112),char(105),char(110),char(103),char(0),char(109),char(95),char(108),char(105),char(110),char(101),char(97),char(114),char(85),char(112),char(112),
-char(101),char(114),char(76),char(105),char(109),char(105),char(116),char(0),char(109),char(95),char(108),char(105),char(110),char(101),char(97),char(114),char(76),char(111),char(119),char(101),
-char(114),char(76),char(105),char(109),char(105),char(116),char(0),char(109),char(95),char(97),char(110),char(103),char(117),char(108),char(97),char(114),char(85),char(112),char(112),char(101),
-char(114),char(76),char(105),char(109),char(105),char(116),char(0),char(109),char(95),char(97),char(110),char(103),char(117),char(108),char(97),char(114),char(76),char(111),char(119),char(101),
-char(114),char(76),char(105),char(109),char(105),char(116),char(0),char(109),char(95),char(117),char(115),char(101),char(76),char(105),char(110),char(101),char(97),char(114),char(82),char(101),
-char(102),char(101),char(114),char(101),char(110),char(99),char(101),char(70),char(114),char(97),char(109),char(101),char(65),char(0),char(109),char(95),char(117),char(115),char(101),char(79),
-char(102),char(102),char(115),char(101),char(116),char(70),char(111),char(114),char(67),char(111),char(110),char(115),char(116),char(114),char(97),char(105),char(110),char(116),char(70),char(114),
-char(97),char(109),char(101),char(0),char(109),char(95),char(54),char(100),char(111),char(102),char(68),char(97),char(116),char(97),char(0),char(109),char(95),char(115),char(112),char(114),
-char(105),char(110),char(103),char(69),char(110),char(97),char(98),char(108),char(101),char(100),char(91),char(54),char(93),char(0),char(109),char(95),char(101),char(113),char(117),char(105),
-char(108),char(105),char(98),char(114),char(105),char(117),char(109),char(80),char(111),char(105),char(110),char(116),char(91),char(54),char(93),char(0),char(109),char(95),char(115),char(112),
-char(114),char(105),char(110),char(103),char(83),char(116),char(105),char(102),char(102),char(110),char(101),char(115),char(115),char(91),char(54),char(93),char(0),char(109),char(95),char(115),
-char(112),char(114),char(105),char(110),char(103),char(68),char(97),char(109),char(112),char(105),char(110),char(103),char(91),char(54),char(93),char(0),char(109),char(95),char(116),char(97),
-char(117),char(0),char(109),char(95),char(116),char(105),char(109),char(101),char(83),char(116),char(101),char(112),char(0),char(109),char(95),char(109),char(97),char(120),char(69),char(114),
-char(114),char(111),char(114),char(82),char(101),char(100),char(117),char(99),char(116),char(105),char(111),char(110),char(0),char(109),char(95),char(115),char(111),char(114),char(0),char(109),
-char(95),char(101),char(114),char(112),char(0),char(109),char(95),char(101),char(114),char(112),char(50),char(0),char(109),char(95),char(103),char(108),char(111),char(98),char(97),char(108),
-char(67),char(102),char(109),char(0),char(109),char(95),char(115),char(112),char(108),char(105),char(116),char(73),char(109),char(112),char(117),char(108),char(115),char(101),char(80),char(101),
-char(110),char(101),char(116),char(114),char(97),char(116),char(105),char(111),char(110),char(84),char(104),char(114),char(101),char(115),char(104),char(111),char(108),char(100),char(0),char(109),
-char(95),char(115),char(112),char(108),char(105),char(116),char(73),char(109),char(112),char(117),char(108),char(115),char(101),char(84),char(117),char(114),char(110),char(69),char(114),char(112),
-char(0),char(109),char(95),char(108),char(105),char(110),char(101),char(97),char(114),char(83),char(108),char(111),char(112),char(0),char(109),char(95),char(119),char(97),char(114),char(109),
-char(115),char(116),char(97),char(114),char(116),char(105),char(110),char(103),char(70),char(97),char(99),char(116),char(111),char(114),char(0),char(109),char(95),char(109),char(97),char(120),
-char(71),char(121),char(114),char(111),char(115),char(99),char(111),char(112),char(105),char(99),char(70),char(111),char(114),char(99),char(101),char(0),char(109),char(95),char(115),char(105),
-char(110),char(103),char(108),char(101),char(65),char(120),char(105),char(115),char(82),char(111),char(108),char(108),char(105),char(110),char(103),char(70),char(114),char(105),char(99),char(116),
-char(105),char(111),char(110),char(84),char(104),char(114),char(101),char(115),char(104),char(111),char(108),char(100),char(0),char(109),char(95),char(110),char(117),char(109),char(73),char(116),
-char(101),char(114),char(97),char(116),char(105),char(111),char(110),char(115),char(0),char(109),char(95),char(115),char(111),char(108),char(118),char(101),char(114),char(77),char(111),char(100),
-char(101),char(0),char(109),char(95),char(114),char(101),char(115),char(116),char(105),char(110),char(103),char(67),char(111),char(110),char(116),char(97),char(99),char(116),char(82),char(101),
-char(115),char(116),char(105),char(116),char(117),char(116),char(105),char(111),char(110),char(84),char(104),char(114),char(101),char(115),char(104),char(111),char(108),char(100),char(0),char(109),
-char(95),char(109),char(105),char(110),char(105),char(109),char(117),char(109),char(83),char(111),char(108),char(118),char(101),char(114),char(66),char(97),char(116),char(99),char(104),char(83),
-char(105),char(122),char(101),char(0),char(109),char(95),char(115),char(112),char(108),char(105),char(116),char(73),char(109),char(112),char(117),char(108),char(115),char(101),char(0),char(109),
-char(95),char(108),char(105),char(110),char(101),char(97),char(114),char(83),char(116),char(105),char(102),char(102),char(110),char(101),char(115),char(115),char(0),char(109),char(95),char(97),
-char(110),char(103),char(117),char(108),char(97),char(114),char(83),char(116),char(105),char(102),char(102),char(110),char(101),char(115),char(115),char(0),char(109),char(95),char(118),char(111),
-char(108),char(117),char(109),char(101),char(83),char(116),char(105),char(102),char(102),char(110),char(101),char(115),char(115),char(0),char(42),char(109),char(95),char(109),char(97),char(116),
-char(101),char(114),char(105),char(97),char(108),char(0),char(109),char(95),char(112),char(111),char(115),char(105),char(116),char(105),char(111),char(110),char(0),char(109),char(95),char(112),
-char(114),char(101),char(118),char(105),char(111),char(117),char(115),char(80),char(111),char(115),char(105),char(116),char(105),char(111),char(110),char(0),char(109),char(95),char(118),char(101),
-char(108),char(111),char(99),char(105),char(116),char(121),char(0),char(109),char(95),char(97),char(99),char(99),char(117),char(109),char(117),char(108),char(97),char(116),char(101),char(100),
-char(70),char(111),char(114),char(99),char(101),char(0),char(109),char(95),char(110),char(111),char(114),char(109),char(97),char(108),char(0),char(109),char(95),char(97),char(114),char(101),
-char(97),char(0),char(109),char(95),char(97),char(116),char(116),char(97),char(99),char(104),char(0),char(109),char(95),char(110),char(111),char(100),char(101),char(73),char(110),char(100),
-char(105),char(99),char(101),char(115),char(91),char(50),char(93),char(0),char(109),char(95),char(114),char(101),char(115),char(116),char(76),char(101),char(110),char(103),char(116),char(104),
-char(0),char(109),char(95),char(98),char(98),char(101),char(110),char(100),char(105),char(110),char(103),char(0),char(109),char(95),char(110),char(111),char(100),char(101),char(73),char(110),
-char(100),char(105),char(99),char(101),char(115),char(91),char(51),char(93),char(0),char(109),char(95),char(114),char(101),char(115),char(116),char(65),char(114),char(101),char(97),char(0),
-char(109),char(95),char(99),char(48),char(91),char(52),char(93),char(0),char(109),char(95),char(110),char(111),char(100),char(101),char(73),char(110),char(100),char(105),char(99),char(101),
-char(115),char(91),char(52),char(93),char(0),char(109),char(95),char(114),char(101),char(115),char(116),char(86),char(111),char(108),char(117),char(109),char(101),char(0),char(109),char(95),
-char(99),char(49),char(0),char(109),char(95),char(99),char(50),char(0),char(109),char(95),char(99),char(48),char(0),char(109),char(95),char(108),char(111),char(99),char(97),char(108),
-char(70),char(114),char(97),char(109),char(101),char(0),char(42),char(109),char(95),char(114),char(105),char(103),char(105),char(100),char(66),char(111),char(100),char(121),char(0),char(109),
-char(95),char(110),char(111),char(100),char(101),char(73),char(110),char(100),char(101),char(120),char(0),char(109),char(95),char(97),char(101),char(114),char(111),char(77),char(111),char(100),
-char(101),char(108),char(0),char(109),char(95),char(98),char(97),char(117),char(109),char(103),char(97),char(114),char(116),char(101),char(0),char(109),char(95),char(100),char(114),char(97),
-char(103),char(0),char(109),char(95),char(108),char(105),char(102),char(116),char(0),char(109),char(95),char(112),char(114),char(101),char(115),char(115),char(117),char(114),char(101),char(0),
-char(109),char(95),char(118),char(111),char(108),char(117),char(109),char(101),char(0),char(109),char(95),char(100),char(121),char(110),char(97),char(109),char(105),char(99),char(70),char(114),
-char(105),char(99),char(116),char(105),char(111),char(110),char(0),char(109),char(95),char(112),char(111),char(115),char(101),char(77),char(97),char(116),char(99),char(104),char(0),char(109),
-char(95),char(114),char(105),char(103),char(105),char(100),char(67),char(111),char(110),char(116),char(97),char(99),char(116),char(72),char(97),char(114),char(100),char(110),char(101),char(115),
-char(115),char(0),char(109),char(95),char(107),char(105),char(110),char(101),char(116),char(105),char(99),char(67),char(111),char(110),char(116),char(97),char(99),char(116),char(72),char(97),
-char(114),char(100),char(110),char(101),char(115),char(115),char(0),char(109),char(95),char(115),char(111),char(102),char(116),char(67),char(111),char(110),char(116),char(97),char(99),char(116),
-char(72),char(97),char(114),char(100),char(110),char(101),char(115),char(115),char(0),char(109),char(95),char(97),char(110),char(99),char(104),char(111),char(114),char(72),char(97),char(114),
-char(100),char(110),char(101),char(115),char(115),char(0),char(109),char(95),char(115),char(111),char(102),char(116),char(82),char(105),char(103),char(105),char(100),char(67),char(108),char(117),
-char(115),char(116),char(101),char(114),char(72),char(97),char(114),char(100),char(110),char(101),char(115),char(115),char(0),char(109),char(95),char(115),char(111),char(102),char(116),char(75),
-char(105),char(110),char(101),char(116),char(105),char(99),char(67),char(108),char(117),char(115),char(116),char(101),char(114),char(72),char(97),char(114),char(100),char(110),char(101),char(115),
-char(115),char(0),char(109),char(95),char(115),char(111),char(102),char(116),char(83),char(111),char(102),char(116),char(67),char(108),char(117),char(115),char(116),char(101),char(114),char(72),
-char(97),char(114),char(100),char(110),char(101),char(115),char(115),char(0),char(109),char(95),char(115),char(111),char(102),char(116),char(82),char(105),char(103),char(105),char(100),char(67),
-char(108),char(117),char(115),char(116),char(101),char(114),char(73),char(109),char(112),char(117),char(108),char(115),char(101),char(83),char(112),char(108),char(105),char(116),char(0),char(109),
-char(95),char(115),char(111),char(102),char(116),char(75),char(105),char(110),char(101),char(116),char(105),char(99),char(67),char(108),char(117),char(115),char(116),char(101),char(114),char(73),
-char(109),char(112),char(117),char(108),char(115),char(101),char(83),char(112),char(108),char(105),char(116),char(0),char(109),char(95),char(115),char(111),char(102),char(116),char(83),char(111),
-char(102),char(116),char(67),char(108),char(117),char(115),char(116),char(101),char(114),char(73),char(109),char(112),char(117),char(108),char(115),char(101),char(83),char(112),char(108),char(105),
-char(116),char(0),char(109),char(95),char(109),char(97),char(120),char(86),char(111),char(108),char(117),char(109),char(101),char(0),char(109),char(95),char(116),char(105),char(109),char(101),
-char(83),char(99),char(97),char(108),char(101),char(0),char(109),char(95),char(118),char(101),char(108),char(111),char(99),char(105),char(116),char(121),char(73),char(116),char(101),char(114),
-char(97),char(116),char(105),char(111),char(110),char(115),char(0),char(109),char(95),char(112),char(111),char(115),char(105),char(116),char(105),char(111),char(110),char(73),char(116),char(101),
-char(114),char(97),char(116),char(105),char(111),char(110),char(115),char(0),char(109),char(95),char(100),char(114),char(105),char(102),char(116),char(73),char(116),char(101),char(114),char(97),
-char(116),char(105),char(111),char(110),char(115),char(0),char(109),char(95),char(99),char(108),char(117),char(115),char(116),char(101),char(114),char(73),char(116),char(101),char(114),char(97),
-char(116),char(105),char(111),char(110),char(115),char(0),char(109),char(95),char(114),char(111),char(116),char(0),char(109),char(95),char(115),char(99),char(97),char(108),char(101),char(0),
-char(109),char(95),char(97),char(113),char(113),char(0),char(109),char(95),char(99),char(111),char(109),char(0),char(42),char(109),char(95),char(112),char(111),char(115),char(105),char(116),
-char(105),char(111),char(110),char(115),char(0),char(42),char(109),char(95),char(119),char(101),char(105),char(103),char(104),char(116),char(115),char(0),char(109),char(95),char(110),char(117),
-char(109),char(80),char(111),char(115),char(105),char(116),char(105),char(111),char(110),char(115),char(0),char(109),char(95),char(110),char(117),char(109),char(87),char(101),char(105),char(103),
-char(116),char(115),char(0),char(109),char(95),char(98),char(118),char(111),char(108),char(117),char(109),char(101),char(0),char(109),char(95),char(98),char(102),char(114),char(97),char(109),
-char(101),char(0),char(109),char(95),char(102),char(114),char(97),char(109),char(101),char(120),char(102),char(111),char(114),char(109),char(0),char(109),char(95),char(108),char(111),char(99),
-char(105),char(105),char(0),char(109),char(95),char(105),char(110),char(118),char(119),char(105),char(0),char(109),char(95),char(118),char(105),char(109),char(112),char(117),char(108),char(115),
-char(101),char(115),char(91),char(50),char(93),char(0),char(109),char(95),char(100),char(105),char(109),char(112),char(117),char(108),char(115),char(101),char(115),char(91),char(50),char(93),
-char(0),char(109),char(95),char(108),char(118),char(0),char(109),char(95),char(97),char(118),char(0),char(42),char(109),char(95),char(102),char(114),char(97),char(109),char(101),char(114),
-char(101),char(102),char(115),char(0),char(42),char(109),char(95),char(110),char(111),char(100),char(101),char(73),char(110),char(100),char(105),char(99),char(101),char(115),char(0),char(42),
-char(109),char(95),char(109),char(97),char(115),char(115),char(101),char(115),char(0),char(109),char(95),char(110),char(117),char(109),char(70),char(114),char(97),char(109),char(101),char(82),
-char(101),char(102),char(115),char(0),char(109),char(95),char(110),char(117),char(109),char(78),char(111),char(100),char(101),char(115),char(0),char(109),char(95),char(110),char(117),char(109),
-char(77),char(97),char(115),char(115),char(101),char(115),char(0),char(109),char(95),char(105),char(100),char(109),char(97),char(115),char(115),char(0),char(109),char(95),char(105),char(109),
-char(97),char(115),char(115),char(0),char(109),char(95),char(110),char(118),char(105),char(109),char(112),char(117),char(108),char(115),char(101),char(115),char(0),char(109),char(95),char(110),
-char(100),char(105),char(109),char(112),char(117),char(108),char(115),char(101),char(115),char(0),char(109),char(95),char(110),char(100),char(97),char(109),char(112),char(105),char(110),char(103),
-char(0),char(109),char(95),char(108),char(100),char(97),char(109),char(112),char(105),char(110),char(103),char(0),char(109),char(95),char(97),char(100),char(97),char(109),char(112),char(105),
-char(110),char(103),char(0),char(109),char(95),char(109),char(97),char(116),char(99),char(104),char(105),char(110),char(103),char(0),char(109),char(95),char(109),char(97),char(120),char(83),
-char(101),char(108),char(102),char(67),char(111),char(108),char(108),char(105),char(115),char(105),char(111),char(110),char(73),char(109),char(112),char(117),char(108),char(115),char(101),char(0),
-char(109),char(95),char(115),char(101),char(108),char(102),char(67),char(111),char(108),char(108),char(105),char(115),char(105),char(111),char(110),char(73),char(109),char(112),char(117),char(108),
-char(115),char(101),char(70),char(97),char(99),char(116),char(111),char(114),char(0),char(109),char(95),char(99),char(111),char(110),char(116),char(97),char(105),char(110),char(115),char(65),
-char(110),char(99),char(104),char(111),char(114),char(0),char(109),char(95),char(99),char(111),char(108),char(108),char(105),char(100),char(101),char(0),char(109),char(95),char(99),char(108),
-char(117),char(115),char(116),char(101),char(114),char(73),char(110),char(100),char(101),char(120),char(0),char(42),char(109),char(95),char(98),char(111),char(100),char(121),char(65),char(0),
-char(42),char(109),char(95),char(98),char(111),char(100),char(121),char(66),char(0),char(109),char(95),char(114),char(101),char(102),char(115),char(91),char(50),char(93),char(0),char(109),
-char(95),char(99),char(102),char(109),char(0),char(109),char(95),char(115),char(112),char(108),char(105),char(116),char(0),char(109),char(95),char(100),char(101),char(108),char(101),char(116),
-char(101),char(0),char(109),char(95),char(114),char(101),char(108),char(80),char(111),char(115),char(105),char(116),char(105),char(111),char(110),char(91),char(50),char(93),char(0),char(109),
-char(95),char(98),char(111),char(100),char(121),char(65),char(116),char(121),char(112),char(101),char(0),char(109),char(95),char(98),char(111),char(100),char(121),char(66),char(116),char(121),
-char(112),char(101),char(0),char(109),char(95),char(106),char(111),char(105),char(110),char(116),char(84),char(121),char(112),char(101),char(0),char(42),char(109),char(95),char(112),char(111),
-char(115),char(101),char(0),char(42),char(42),char(109),char(95),char(109),char(97),char(116),char(101),char(114),char(105),char(97),char(108),char(115),char(0),char(42),char(109),char(95),
-char(110),char(111),char(100),char(101),char(115),char(0),char(42),char(109),char(95),char(108),char(105),char(110),char(107),char(115),char(0),char(42),char(109),char(95),char(102),char(97),
-char(99),char(101),char(115),char(0),char(42),char(109),char(95),char(116),char(101),char(116),char(114),char(97),char(104),char(101),char(100),char(114),char(97),char(0),char(42),char(109),
-char(95),char(97),char(110),char(99),char(104),char(111),char(114),char(115),char(0),char(42),char(109),char(95),char(99),char(108),char(117),char(115),char(116),char(101),char(114),char(115),
-char(0),char(42),char(109),char(95),char(106),char(111),char(105),char(110),char(116),char(115),char(0),char(109),char(95),char(110),char(117),char(109),char(77),char(97),char(116),char(101),
-char(114),char(105),char(97),char(108),char(115),char(0),char(109),char(95),char(110),char(117),char(109),char(76),char(105),char(110),char(107),char(115),char(0),char(109),char(95),char(110),
-char(117),char(109),char(70),char(97),char(99),char(101),char(115),char(0),char(109),char(95),char(110),char(117),char(109),char(84),char(101),char(116),char(114),char(97),char(104),char(101),
-char(100),char(114),char(97),char(0),char(109),char(95),char(110),char(117),char(109),char(65),char(110),char(99),char(104),char(111),char(114),char(115),char(0),char(109),char(95),char(110),
-char(117),char(109),char(67),char(108),char(117),char(115),char(116),char(101),char(114),char(115),char(0),char(109),char(95),char(110),char(117),char(109),char(74),char(111),char(105),char(110),
-char(116),char(115),char(0),char(109),char(95),char(99),char(111),char(110),char(102),char(105),char(103),char(0),char(84),char(89),char(80),char(69),char(76),char(0),char(0),char(0),
-char(99),char(104),char(97),char(114),char(0),char(117),char(99),char(104),char(97),char(114),char(0),char(115),char(104),char(111),char(114),char(116),char(0),char(117),char(115),char(104),
-char(111),char(114),char(116),char(0),char(105),char(110),char(116),char(0),char(108),char(111),char(110),char(103),char(0),char(117),char(108),char(111),char(110),char(103),char(0),char(102),
-char(108),char(111),char(97),char(116),char(0),char(100),char(111),char(117),char(98),char(108),char(101),char(0),char(118),char(111),char(105),char(100),char(0),char(80),char(111),char(105),
-char(110),char(116),char(101),char(114),char(65),char(114),char(114),char(97),char(121),char(0),char(98),char(116),char(80),char(104),char(121),char(115),char(105),char(99),char(115),char(83),
-char(121),char(115),char(116),char(101),char(109),char(0),char(76),char(105),char(115),char(116),char(66),char(97),char(115),char(101),char(0),char(98),char(116),char(86),char(101),char(99),
-char(116),char(111),char(114),char(51),char(70),char(108),char(111),char(97),char(116),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(86),char(101),char(99),char(116),
-char(111),char(114),char(51),char(68),char(111),char(117),char(98),char(108),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(77),char(97),char(116),char(114),
-char(105),char(120),char(51),char(120),char(51),char(70),char(108),char(111),char(97),char(116),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(77),char(97),char(116),
-char(114),char(105),char(120),char(51),char(120),char(51),char(68),char(111),char(117),char(98),char(108),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(84),
-char(114),char(97),char(110),char(115),char(102),char(111),char(114),char(109),char(70),char(108),char(111),char(97),char(116),char(68),char(97),char(116),char(97),char(0),char(98),char(116),
-char(84),char(114),char(97),char(110),char(115),char(102),char(111),char(114),char(109),char(68),char(111),char(117),char(98),char(108),char(101),char(68),char(97),char(116),char(97),char(0),
-char(98),char(116),char(66),char(118),char(104),char(83),char(117),char(98),char(116),char(114),char(101),char(101),char(73),char(110),char(102),char(111),char(68),char(97),char(116),char(97),
-char(0),char(98),char(116),char(79),char(112),char(116),char(105),char(109),char(105),char(122),char(101),char(100),char(66),char(118),char(104),char(78),char(111),char(100),char(101),char(70),
-char(108),char(111),char(97),char(116),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(79),char(112),char(116),char(105),char(109),char(105),char(122),char(101),char(100),
-char(66),char(118),char(104),char(78),char(111),char(100),char(101),char(68),char(111),char(117),char(98),char(108),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),
-char(81),char(117),char(97),char(110),char(116),char(105),char(122),char(101),char(100),char(66),char(118),char(104),char(78),char(111),char(100),char(101),char(68),char(97),char(116),char(97),
-char(0),char(98),char(116),char(81),char(117),char(97),char(110),char(116),char(105),char(122),char(101),char(100),char(66),char(118),char(104),char(70),char(108),char(111),char(97),char(116),
-char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(81),char(117),char(97),char(110),char(116),char(105),char(122),char(101),char(100),char(66),char(118),char(104),char(68),
-char(111),char(117),char(98),char(108),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(67),char(111),char(108),char(108),char(105),char(115),char(105),char(111),
-char(110),char(83),char(104),char(97),char(112),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(83),char(116),char(97),char(116),char(105),char(99),char(80),
-char(108),char(97),char(110),char(101),char(83),char(104),char(97),char(112),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(67),char(111),char(110),char(118),
-char(101),char(120),char(73),char(110),char(116),char(101),char(114),char(110),char(97),char(108),char(83),char(104),char(97),char(112),char(101),char(68),char(97),char(116),char(97),char(0),
-char(98),char(116),char(80),char(111),char(115),char(105),char(116),char(105),char(111),char(110),char(65),char(110),char(100),char(82),char(97),char(100),char(105),char(117),char(115),char(0),
-char(98),char(116),char(77),char(117),char(108),char(116),char(105),char(83),char(112),char(104),char(101),char(114),char(101),char(83),char(104),char(97),char(112),char(101),char(68),char(97),
-char(116),char(97),char(0),char(98),char(116),char(73),char(110),char(116),char(73),char(110),char(100),char(101),char(120),char(68),char(97),char(116),char(97),char(0),char(98),char(116),
-char(83),char(104),char(111),char(114),char(116),char(73),char(110),char(116),char(73),char(110),char(100),char(101),char(120),char(68),char(97),char(116),char(97),char(0),char(98),char(116),
-char(83),char(104),char(111),char(114),char(116),char(73),char(110),char(116),char(73),char(110),char(100),char(101),char(120),char(84),char(114),char(105),char(112),char(108),char(101),char(116),
-char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(67),char(104),char(97),char(114),char(73),char(110),char(100),char(101),char(120),char(84),char(114),char(105),char(112),
-char(108),char(101),char(116),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(77),char(101),char(115),char(104),char(80),char(97),char(114),char(116),char(68),char(97),
-char(116),char(97),char(0),char(98),char(116),char(83),char(116),char(114),char(105),char(100),char(105),char(110),char(103),char(77),char(101),char(115),char(104),char(73),char(110),char(116),
-char(101),char(114),char(102),char(97),char(99),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(84),char(114),char(105),char(97),char(110),char(103),char(108),
-char(101),char(77),char(101),char(115),char(104),char(83),char(104),char(97),char(112),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(84),char(114),char(105),
-char(97),char(110),char(103),char(108),char(101),char(73),char(110),char(102),char(111),char(77),char(97),char(112),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(83),
-char(99),char(97),char(108),char(101),char(100),char(84),char(114),char(105),char(97),char(110),char(103),char(108),char(101),char(77),char(101),char(115),char(104),char(83),char(104),char(97),
-char(112),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(67),char(111),char(109),char(112),char(111),char(117),char(110),char(100),char(83),char(104),char(97),
-char(112),char(101),char(67),char(104),char(105),char(108),char(100),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(67),char(111),char(109),char(112),char(111),char(117),
-char(110),char(100),char(83),char(104),char(97),char(112),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(67),char(121),char(108),char(105),char(110),char(100),
-char(101),char(114),char(83),char(104),char(97),char(112),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(67),char(97),char(112),char(115),char(117),char(108),
-char(101),char(83),char(104),char(97),char(112),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(84),char(114),char(105),char(97),char(110),char(103),char(108),
-char(101),char(73),char(110),char(102),char(111),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(71),char(73),char(109),char(112),char(97),char(99),char(116),char(77),
-char(101),char(115),char(104),char(83),char(104),char(97),char(112),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(67),char(111),char(110),char(118),char(101),
-char(120),char(72),char(117),char(108),char(108),char(83),char(104),char(97),char(112),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(67),char(111),char(108),
-char(108),char(105),char(115),char(105),char(111),char(110),char(79),char(98),char(106),char(101),char(99),char(116),char(68),char(111),char(117),char(98),char(108),char(101),char(68),char(97),
-char(116),char(97),char(0),char(98),char(116),char(67),char(111),char(108),char(108),char(105),char(115),char(105),char(111),char(110),char(79),char(98),char(106),char(101),char(99),char(116),
-char(70),char(108),char(111),char(97),char(116),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(68),char(121),char(110),char(97),char(109),char(105),char(99),char(115),
-char(87),char(111),char(114),char(108),char(100),char(68),char(111),char(117),char(98),char(108),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(67),char(111),
-char(110),char(116),char(97),char(99),char(116),char(83),char(111),char(108),char(118),char(101),char(114),char(73),char(110),char(102),char(111),char(68),char(111),char(117),char(98),char(108),
-char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(68),char(121),char(110),char(97),char(109),char(105),char(99),char(115),char(87),char(111),char(114),char(108),
-char(100),char(70),char(108),char(111),char(97),char(116),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(67),char(111),char(110),char(116),char(97),char(99),char(116),
-char(83),char(111),char(108),char(118),char(101),char(114),char(73),char(110),char(102),char(111),char(70),char(108),char(111),char(97),char(116),char(68),char(97),char(116),char(97),char(0),
-char(98),char(116),char(82),char(105),char(103),char(105),char(100),char(66),char(111),char(100),char(121),char(70),char(108),char(111),char(97),char(116),char(68),char(97),char(116),char(97),
-char(0),char(98),char(116),char(82),char(105),char(103),char(105),char(100),char(66),char(111),char(100),char(121),char(68),char(111),char(117),char(98),char(108),char(101),char(68),char(97),
-char(116),char(97),char(0),char(98),char(116),char(67),char(111),char(110),char(115),char(116),char(114),char(97),char(105),char(110),char(116),char(73),char(110),char(102),char(111),char(49),
-char(0),char(98),char(116),char(84),char(121),char(112),char(101),char(100),char(67),char(111),char(110),char(115),char(116),char(114),char(97),char(105),char(110),char(116),char(68),char(97),
-char(116),char(97),char(0),char(98),char(116),char(82),char(105),char(103),char(105),char(100),char(66),char(111),char(100),char(121),char(68),char(97),char(116),char(97),char(0),char(98),
-char(116),char(80),char(111),char(105),char(110),char(116),char(50),char(80),char(111),char(105),char(110),char(116),char(67),char(111),char(110),char(115),char(116),char(114),char(97),char(105),
-char(110),char(116),char(70),char(108),char(111),char(97),char(116),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(80),char(111),char(105),char(110),char(116),char(50),
-char(80),char(111),char(105),char(110),char(116),char(67),char(111),char(110),char(115),char(116),char(114),char(97),char(105),char(110),char(116),char(68),char(111),char(117),char(98),char(108),
-char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(72),char(105),char(110),char(103),char(101),char(67),char(111),char(110),char(115),char(116),char(114),char(97),
-char(105),char(110),char(116),char(68),char(111),char(117),char(98),char(108),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(72),char(105),char(110),char(103),
-char(101),char(67),char(111),char(110),char(115),char(116),char(114),char(97),char(105),char(110),char(116),char(70),char(108),char(111),char(97),char(116),char(68),char(97),char(116),char(97),
-char(0),char(98),char(116),char(67),char(111),char(110),char(101),char(84),char(119),char(105),char(115),char(116),char(67),char(111),char(110),char(115),char(116),char(114),char(97),char(105),
-char(110),char(116),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(71),char(101),char(110),char(101),char(114),char(105),char(99),char(54),char(68),char(111),char(102),
-char(67),char(111),char(110),char(115),char(116),char(114),char(97),char(105),char(110),char(116),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(71),char(101),char(110),
-char(101),char(114),char(105),char(99),char(54),char(68),char(111),char(102),char(83),char(112),char(114),char(105),char(110),char(103),char(67),char(111),char(110),char(115),char(116),char(114),
-char(97),char(105),char(110),char(116),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(83),char(108),char(105),char(100),char(101),char(114),char(67),char(111),char(110),
-char(115),char(116),char(114),char(97),char(105),char(110),char(116),char(68),char(97),char(116),char(97),char(0),char(83),char(111),char(102),char(116),char(66),char(111),char(100),char(121),
-char(77),char(97),char(116),char(101),char(114),char(105),char(97),char(108),char(68),char(97),char(116),char(97),char(0),char(83),char(111),char(102),char(116),char(66),char(111),char(100),
-char(121),char(78),char(111),char(100),char(101),char(68),char(97),char(116),char(97),char(0),char(83),char(111),char(102),char(116),char(66),char(111),char(100),char(121),char(76),char(105),
-char(110),char(107),char(68),char(97),char(116),char(97),char(0),char(83),char(111),char(102),char(116),char(66),char(111),char(100),char(121),char(70),char(97),char(99),char(101),char(68),
-char(97),char(116),char(97),char(0),char(83),char(111),char(102),char(116),char(66),char(111),char(100),char(121),char(84),char(101),char(116),char(114),char(97),char(68),char(97),char(116),
-char(97),char(0),char(83),char(111),char(102),char(116),char(82),char(105),char(103),char(105),char(100),char(65),char(110),char(99),char(104),char(111),char(114),char(68),char(97),char(116),
-char(97),char(0),char(83),char(111),char(102),char(116),char(66),char(111),char(100),char(121),char(67),char(111),char(110),char(102),char(105),char(103),char(68),char(97),char(116),char(97),
-char(0),char(83),char(111),char(102),char(116),char(66),char(111),char(100),char(121),char(80),char(111),char(115),char(101),char(68),char(97),char(116),char(97),char(0),char(83),char(111),
-char(102),char(116),char(66),char(111),char(100),char(121),char(67),char(108),char(117),char(115),char(116),char(101),char(114),char(68),char(97),char(116),char(97),char(0),char(98),char(116),
-char(83),char(111),char(102),char(116),char(66),char(111),char(100),char(121),char(74),char(111),char(105),char(110),char(116),char(68),char(97),char(116),char(97),char(0),char(98),char(116),
-char(83),char(111),char(102),char(116),char(66),char(111),char(100),char(121),char(70),char(108),char(111),char(97),char(116),char(68),char(97),char(116),char(97),char(0),char(0),char(0),
-char(84),char(76),char(69),char(78),char(1),char(0),char(1),char(0),char(2),char(0),char(2),char(0),char(4),char(0),char(4),char(0),char(4),char(0),char(4),char(0),
-char(8),char(0),char(0),char(0),char(12),char(0),char(36),char(0),char(8),char(0),char(16),char(0),char(32),char(0),char(48),char(0),char(96),char(0),char(64),char(0),
-char(-128),char(0),char(20),char(0),char(48),char(0),char(80),char(0),char(16),char(0),char(84),char(0),char(-124),char(0),char(12),char(0),char(52),char(0),char(52),char(0),
-char(20),char(0),char(64),char(0),char(4),char(0),char(4),char(0),char(8),char(0),char(4),char(0),char(32),char(0),char(28),char(0),char(60),char(0),char(56),char(0),
-char(76),char(0),char(76),char(0),char(24),char(0),char(60),char(0),char(60),char(0),char(16),char(0),char(64),char(0),char(68),char(0),char(-48),char(1),char(0),char(1),
-char(-72),char(0),char(-104),char(0),char(104),char(0),char(88),char(0),char(-24),char(1),char(-96),char(3),char(8),char(0),char(52),char(0),char(0),char(0),char(84),char(0),
-char(116),char(0),char(92),char(1),char(-36),char(0),char(-44),char(0),char(-4),char(0),char(92),char(1),char(-52),char(0),char(16),char(0),char(100),char(0),char(20),char(0),
-char(36),char(0),char(100),char(0),char(92),char(0),char(104),char(0),char(-64),char(0),char(92),char(1),char(104),char(0),char(-84),char(1),char(83),char(84),char(82),char(67),
-char(65),char(0),char(0),char(0),char(10),char(0),char(3),char(0),char(4),char(0),char(0),char(0),char(4),char(0),char(1),char(0),char(9),char(0),char(2),char(0),
-char(11),char(0),char(3),char(0),char(10),char(0),char(3),char(0),char(10),char(0),char(4),char(0),char(10),char(0),char(5),char(0),char(12),char(0),char(2),char(0),
-char(9),char(0),char(6),char(0),char(9),char(0),char(7),char(0),char(13),char(0),char(1),char(0),char(7),char(0),char(8),char(0),char(14),char(0),char(1),char(0),
-char(8),char(0),char(8),char(0),char(15),char(0),char(1),char(0),char(13),char(0),char(9),char(0),char(16),char(0),char(1),char(0),char(14),char(0),char(9),char(0),
-char(17),char(0),char(2),char(0),char(15),char(0),char(10),char(0),char(13),char(0),char(11),char(0),char(18),char(0),char(2),char(0),char(16),char(0),char(10),char(0),
-char(14),char(0),char(11),char(0),char(19),char(0),char(4),char(0),char(4),char(0),char(12),char(0),char(4),char(0),char(13),char(0),char(2),char(0),char(14),char(0),
-char(2),char(0),char(15),char(0),char(20),char(0),char(6),char(0),char(13),char(0),char(16),char(0),char(13),char(0),char(17),char(0),char(4),char(0),char(18),char(0),
-char(4),char(0),char(19),char(0),char(4),char(0),char(20),char(0),char(0),char(0),char(21),char(0),char(21),char(0),char(6),char(0),char(14),char(0),char(16),char(0),
-char(14),char(0),char(17),char(0),char(4),char(0),char(18),char(0),char(4),char(0),char(19),char(0),char(4),char(0),char(20),char(0),char(0),char(0),char(21),char(0),
-char(22),char(0),char(3),char(0),char(2),char(0),char(14),char(0),char(2),char(0),char(15),char(0),char(4),char(0),char(22),char(0),char(23),char(0),char(12),char(0),
-char(13),char(0),char(23),char(0),char(13),char(0),char(24),char(0),char(13),char(0),char(25),char(0),char(4),char(0),char(26),char(0),char(4),char(0),char(27),char(0),
-char(4),char(0),char(28),char(0),char(4),char(0),char(29),char(0),char(20),char(0),char(30),char(0),char(22),char(0),char(31),char(0),char(19),char(0),char(32),char(0),
-char(4),char(0),char(33),char(0),char(4),char(0),char(34),char(0),char(24),char(0),char(12),char(0),char(14),char(0),char(23),char(0),char(14),char(0),char(24),char(0),
-char(14),char(0),char(25),char(0),char(4),char(0),char(26),char(0),char(4),char(0),char(27),char(0),char(4),char(0),char(28),char(0),char(4),char(0),char(29),char(0),
-char(21),char(0),char(30),char(0),char(22),char(0),char(31),char(0),char(4),char(0),char(33),char(0),char(4),char(0),char(34),char(0),char(19),char(0),char(32),char(0),
-char(25),char(0),char(3),char(0),char(0),char(0),char(35),char(0),char(4),char(0),char(36),char(0),char(0),char(0),char(37),char(0),char(26),char(0),char(5),char(0),
-char(25),char(0),char(38),char(0),char(13),char(0),char(39),char(0),char(13),char(0),char(40),char(0),char(7),char(0),char(41),char(0),char(0),char(0),char(21),char(0),
-char(27),char(0),char(5),char(0),char(25),char(0),char(38),char(0),char(13),char(0),char(39),char(0),char(13),char(0),char(42),char(0),char(7),char(0),char(43),char(0),
-char(4),char(0),char(44),char(0),char(28),char(0),char(2),char(0),char(13),char(0),char(45),char(0),char(7),char(0),char(46),char(0),char(29),char(0),char(4),char(0),
-char(27),char(0),char(47),char(0),char(28),char(0),char(48),char(0),char(4),char(0),char(49),char(0),char(0),char(0),char(37),char(0),char(30),char(0),char(1),char(0),
-char(4),char(0),char(50),char(0),char(31),char(0),char(2),char(0),char(2),char(0),char(50),char(0),char(0),char(0),char(51),char(0),char(32),char(0),char(2),char(0),
-char(2),char(0),char(52),char(0),char(0),char(0),char(51),char(0),char(33),char(0),char(2),char(0),char(0),char(0),char(52),char(0),char(0),char(0),char(53),char(0),
-char(34),char(0),char(8),char(0),char(13),char(0),char(54),char(0),char(14),char(0),char(55),char(0),char(30),char(0),char(56),char(0),char(32),char(0),char(57),char(0),
-char(33),char(0),char(58),char(0),char(31),char(0),char(59),char(0),char(4),char(0),char(60),char(0),char(4),char(0),char(61),char(0),char(35),char(0),char(4),char(0),
-char(34),char(0),char(62),char(0),char(13),char(0),char(63),char(0),char(4),char(0),char(64),char(0),char(0),char(0),char(37),char(0),char(36),char(0),char(7),char(0),
-char(25),char(0),char(38),char(0),char(35),char(0),char(65),char(0),char(23),char(0),char(66),char(0),char(24),char(0),char(67),char(0),char(37),char(0),char(68),char(0),
-char(7),char(0),char(43),char(0),char(0),char(0),char(69),char(0),char(38),char(0),char(2),char(0),char(36),char(0),char(70),char(0),char(13),char(0),char(39),char(0),
-char(39),char(0),char(4),char(0),char(17),char(0),char(71),char(0),char(25),char(0),char(72),char(0),char(4),char(0),char(73),char(0),char(7),char(0),char(74),char(0),
-char(40),char(0),char(4),char(0),char(25),char(0),char(38),char(0),char(39),char(0),char(75),char(0),char(4),char(0),char(76),char(0),char(7),char(0),char(43),char(0),
-char(41),char(0),char(3),char(0),char(27),char(0),char(47),char(0),char(4),char(0),char(77),char(0),char(0),char(0),char(37),char(0),char(42),char(0),char(3),char(0),
-char(27),char(0),char(47),char(0),char(4),char(0),char(77),char(0),char(0),char(0),char(37),char(0),char(43),char(0),char(4),char(0),char(4),char(0),char(78),char(0),
-char(7),char(0),char(79),char(0),char(7),char(0),char(80),char(0),char(7),char(0),char(81),char(0),char(37),char(0),char(14),char(0),char(4),char(0),char(82),char(0),
-char(4),char(0),char(83),char(0),char(43),char(0),char(84),char(0),char(4),char(0),char(85),char(0),char(7),char(0),char(86),char(0),char(7),char(0),char(87),char(0),
-char(7),char(0),char(88),char(0),char(7),char(0),char(89),char(0),char(7),char(0),char(90),char(0),char(4),char(0),char(91),char(0),char(4),char(0),char(92),char(0),
-char(4),char(0),char(93),char(0),char(4),char(0),char(94),char(0),char(0),char(0),char(37),char(0),char(44),char(0),char(5),char(0),char(25),char(0),char(38),char(0),
-char(35),char(0),char(65),char(0),char(13),char(0),char(39),char(0),char(7),char(0),char(43),char(0),char(4),char(0),char(95),char(0),char(45),char(0),char(5),char(0),
-char(27),char(0),char(47),char(0),char(13),char(0),char(96),char(0),char(14),char(0),char(97),char(0),char(4),char(0),char(98),char(0),char(0),char(0),char(99),char(0),
-char(46),char(0),char(25),char(0),char(9),char(0),char(100),char(0),char(9),char(0),char(101),char(0),char(25),char(0),char(102),char(0),char(0),char(0),char(35),char(0),
-char(18),char(0),char(103),char(0),char(18),char(0),char(104),char(0),char(14),char(0),char(105),char(0),char(14),char(0),char(106),char(0),char(14),char(0),char(107),char(0),
-char(8),char(0),char(108),char(0),char(8),char(0),char(109),char(0),char(8),char(0),char(110),char(0),char(8),char(0),char(111),char(0),char(8),char(0),char(112),char(0),
-char(8),char(0),char(113),char(0),char(8),char(0),char(114),char(0),char(8),char(0),char(115),char(0),char(4),char(0),char(116),char(0),char(4),char(0),char(117),char(0),
-char(4),char(0),char(118),char(0),char(4),char(0),char(119),char(0),char(4),char(0),char(120),char(0),char(4),char(0),char(121),char(0),char(4),char(0),char(122),char(0),
-char(0),char(0),char(37),char(0),char(47),char(0),char(25),char(0),char(9),char(0),char(100),char(0),char(9),char(0),char(101),char(0),char(25),char(0),char(102),char(0),
-char(0),char(0),char(35),char(0),char(17),char(0),char(103),char(0),char(17),char(0),char(104),char(0),char(13),char(0),char(105),char(0),char(13),char(0),char(106),char(0),
-char(13),char(0),char(107),char(0),char(7),char(0),char(108),char(0),char(7),char(0),char(109),char(0),char(7),char(0),char(110),char(0),char(7),char(0),char(111),char(0),
-char(7),char(0),char(112),char(0),char(7),char(0),char(113),char(0),char(7),char(0),char(114),char(0),char(7),char(0),char(115),char(0),char(4),char(0),char(116),char(0),
-char(4),char(0),char(117),char(0),char(4),char(0),char(118),char(0),char(4),char(0),char(119),char(0),char(4),char(0),char(120),char(0),char(4),char(0),char(121),char(0),
-char(4),char(0),char(122),char(0),char(0),char(0),char(37),char(0),char(48),char(0),char(2),char(0),char(49),char(0),char(123),char(0),char(14),char(0),char(124),char(0),
-char(50),char(0),char(2),char(0),char(51),char(0),char(123),char(0),char(13),char(0),char(124),char(0),char(52),char(0),char(21),char(0),char(47),char(0),char(125),char(0),
-char(15),char(0),char(126),char(0),char(13),char(0),char(127),char(0),char(13),char(0),char(-128),char(0),char(13),char(0),char(-127),char(0),char(13),char(0),char(-126),char(0),
-char(13),char(0),char(124),char(0),char(13),char(0),char(-125),char(0),char(13),char(0),char(-124),char(0),char(13),char(0),char(-123),char(0),char(13),char(0),char(-122),char(0),
-char(7),char(0),char(-121),char(0),char(7),char(0),char(-120),char(0),char(7),char(0),char(-119),char(0),char(7),char(0),char(-118),char(0),char(7),char(0),char(-117),char(0),
-char(7),char(0),char(-116),char(0),char(7),char(0),char(-115),char(0),char(7),char(0),char(-114),char(0),char(7),char(0),char(-113),char(0),char(4),char(0),char(-112),char(0),
-char(53),char(0),char(22),char(0),char(46),char(0),char(125),char(0),char(16),char(0),char(126),char(0),char(14),char(0),char(127),char(0),char(14),char(0),char(-128),char(0),
-char(14),char(0),char(-127),char(0),char(14),char(0),char(-126),char(0),char(14),char(0),char(124),char(0),char(14),char(0),char(-125),char(0),char(14),char(0),char(-124),char(0),
-char(14),char(0),char(-123),char(0),char(14),char(0),char(-122),char(0),char(8),char(0),char(-121),char(0),char(8),char(0),char(-120),char(0),char(8),char(0),char(-119),char(0),
-char(8),char(0),char(-118),char(0),char(8),char(0),char(-117),char(0),char(8),char(0),char(-116),char(0),char(8),char(0),char(-115),char(0),char(8),char(0),char(-114),char(0),
-char(8),char(0),char(-113),char(0),char(4),char(0),char(-112),char(0),char(0),char(0),char(37),char(0),char(54),char(0),char(2),char(0),char(4),char(0),char(-111),char(0),
-char(4),char(0),char(-110),char(0),char(55),char(0),char(13),char(0),char(56),char(0),char(-109),char(0),char(56),char(0),char(-108),char(0),char(0),char(0),char(35),char(0),
-char(4),char(0),char(-107),char(0),char(4),char(0),char(-106),char(0),char(4),char(0),char(-105),char(0),char(4),char(0),char(-104),char(0),char(7),char(0),char(-103),char(0),
-char(7),char(0),char(-102),char(0),char(4),char(0),char(-101),char(0),char(4),char(0),char(-100),char(0),char(7),char(0),char(-99),char(0),char(4),char(0),char(-98),char(0),
-char(57),char(0),char(3),char(0),char(55),char(0),char(-97),char(0),char(13),char(0),char(-96),char(0),char(13),char(0),char(-95),char(0),char(58),char(0),char(3),char(0),
-char(55),char(0),char(-97),char(0),char(14),char(0),char(-96),char(0),char(14),char(0),char(-95),char(0),char(59),char(0),char(13),char(0),char(55),char(0),char(-97),char(0),
-char(18),char(0),char(-94),char(0),char(18),char(0),char(-93),char(0),char(4),char(0),char(-92),char(0),char(4),char(0),char(-91),char(0),char(4),char(0),char(-90),char(0),
-char(7),char(0),char(-89),char(0),char(7),char(0),char(-88),char(0),char(7),char(0),char(-87),char(0),char(7),char(0),char(-86),char(0),char(7),char(0),char(-85),char(0),
-char(7),char(0),char(-84),char(0),char(7),char(0),char(-83),char(0),char(60),char(0),char(13),char(0),char(55),char(0),char(-97),char(0),char(17),char(0),char(-94),char(0),
-char(17),char(0),char(-93),char(0),char(4),char(0),char(-92),char(0),char(4),char(0),char(-91),char(0),char(4),char(0),char(-90),char(0),char(7),char(0),char(-89),char(0),
-char(7),char(0),char(-88),char(0),char(7),char(0),char(-87),char(0),char(7),char(0),char(-86),char(0),char(7),char(0),char(-85),char(0),char(7),char(0),char(-84),char(0),
-char(7),char(0),char(-83),char(0),char(61),char(0),char(11),char(0),char(55),char(0),char(-97),char(0),char(17),char(0),char(-94),char(0),char(17),char(0),char(-93),char(0),
-char(7),char(0),char(-82),char(0),char(7),char(0),char(-81),char(0),char(7),char(0),char(-80),char(0),char(7),char(0),char(-85),char(0),char(7),char(0),char(-84),char(0),
-char(7),char(0),char(-83),char(0),char(7),char(0),char(-79),char(0),char(0),char(0),char(21),char(0),char(62),char(0),char(9),char(0),char(55),char(0),char(-97),char(0),
-char(17),char(0),char(-94),char(0),char(17),char(0),char(-93),char(0),char(13),char(0),char(-78),char(0),char(13),char(0),char(-77),char(0),char(13),char(0),char(-76),char(0),
-char(13),char(0),char(-75),char(0),char(4),char(0),char(-74),char(0),char(4),char(0),char(-73),char(0),char(63),char(0),char(5),char(0),char(62),char(0),char(-72),char(0),
-char(4),char(0),char(-71),char(0),char(7),char(0),char(-70),char(0),char(7),char(0),char(-69),char(0),char(7),char(0),char(-68),char(0),char(64),char(0),char(9),char(0),
-char(55),char(0),char(-97),char(0),char(17),char(0),char(-94),char(0),char(17),char(0),char(-93),char(0),char(7),char(0),char(-78),char(0),char(7),char(0),char(-77),char(0),
-char(7),char(0),char(-76),char(0),char(7),char(0),char(-75),char(0),char(4),char(0),char(-74),char(0),char(4),char(0),char(-73),char(0),char(49),char(0),char(22),char(0),
-char(8),char(0),char(-67),char(0),char(8),char(0),char(-79),char(0),char(8),char(0),char(110),char(0),char(8),char(0),char(-66),char(0),char(8),char(0),char(112),char(0),
-char(8),char(0),char(-65),char(0),char(8),char(0),char(-64),char(0),char(8),char(0),char(-63),char(0),char(8),char(0),char(-62),char(0),char(8),char(0),char(-61),char(0),
-char(8),char(0),char(-60),char(0),char(8),char(0),char(-59),char(0),char(8),char(0),char(-58),char(0),char(8),char(0),char(-57),char(0),char(8),char(0),char(-56),char(0),
-char(8),char(0),char(-55),char(0),char(4),char(0),char(-54),char(0),char(4),char(0),char(-53),char(0),char(4),char(0),char(-52),char(0),char(4),char(0),char(-51),char(0),
-char(4),char(0),char(-50),char(0),char(0),char(0),char(37),char(0),char(51),char(0),char(22),char(0),char(7),char(0),char(-67),char(0),char(7),char(0),char(-79),char(0),
-char(7),char(0),char(110),char(0),char(7),char(0),char(-66),char(0),char(7),char(0),char(112),char(0),char(7),char(0),char(-65),char(0),char(7),char(0),char(-64),char(0),
-char(7),char(0),char(-63),char(0),char(7),char(0),char(-62),char(0),char(7),char(0),char(-61),char(0),char(7),char(0),char(-60),char(0),char(7),char(0),char(-59),char(0),
-char(7),char(0),char(-58),char(0),char(7),char(0),char(-57),char(0),char(7),char(0),char(-56),char(0),char(7),char(0),char(-55),char(0),char(4),char(0),char(-54),char(0),
-char(4),char(0),char(-53),char(0),char(4),char(0),char(-52),char(0),char(4),char(0),char(-51),char(0),char(4),char(0),char(-50),char(0),char(0),char(0),char(37),char(0),
-char(65),char(0),char(4),char(0),char(7),char(0),char(-49),char(0),char(7),char(0),char(-48),char(0),char(7),char(0),char(-47),char(0),char(4),char(0),char(78),char(0),
-char(66),char(0),char(10),char(0),char(65),char(0),char(-46),char(0),char(13),char(0),char(-45),char(0),char(13),char(0),char(-44),char(0),char(13),char(0),char(-43),char(0),
-char(13),char(0),char(-42),char(0),char(13),char(0),char(-41),char(0),char(7),char(0),char(-121),char(0),char(7),char(0),char(-40),char(0),char(4),char(0),char(-39),char(0),
-char(4),char(0),char(53),char(0),char(67),char(0),char(4),char(0),char(65),char(0),char(-46),char(0),char(4),char(0),char(-38),char(0),char(7),char(0),char(-37),char(0),
-char(4),char(0),char(-36),char(0),char(68),char(0),char(4),char(0),char(13),char(0),char(-41),char(0),char(65),char(0),char(-46),char(0),char(4),char(0),char(-35),char(0),
-char(7),char(0),char(-34),char(0),char(69),char(0),char(7),char(0),char(13),char(0),char(-33),char(0),char(65),char(0),char(-46),char(0),char(4),char(0),char(-32),char(0),
-char(7),char(0),char(-31),char(0),char(7),char(0),char(-30),char(0),char(7),char(0),char(-29),char(0),char(4),char(0),char(53),char(0),char(70),char(0),char(6),char(0),
-char(15),char(0),char(-28),char(0),char(13),char(0),char(-30),char(0),char(13),char(0),char(-27),char(0),char(56),char(0),char(-26),char(0),char(4),char(0),char(-25),char(0),
-char(7),char(0),char(-29),char(0),char(71),char(0),char(26),char(0),char(4),char(0),char(-24),char(0),char(7),char(0),char(-23),char(0),char(7),char(0),char(-79),char(0),
-char(7),char(0),char(-22),char(0),char(7),char(0),char(-21),char(0),char(7),char(0),char(-20),char(0),char(7),char(0),char(-19),char(0),char(7),char(0),char(-18),char(0),
-char(7),char(0),char(-17),char(0),char(7),char(0),char(-16),char(0),char(7),char(0),char(-15),char(0),char(7),char(0),char(-14),char(0),char(7),char(0),char(-13),char(0),
-char(7),char(0),char(-12),char(0),char(7),char(0),char(-11),char(0),char(7),char(0),char(-10),char(0),char(7),char(0),char(-9),char(0),char(7),char(0),char(-8),char(0),
-char(7),char(0),char(-7),char(0),char(7),char(0),char(-6),char(0),char(7),char(0),char(-5),char(0),char(4),char(0),char(-4),char(0),char(4),char(0),char(-3),char(0),
-char(4),char(0),char(-2),char(0),char(4),char(0),char(-1),char(0),char(4),char(0),char(117),char(0),char(72),char(0),char(12),char(0),char(15),char(0),char(0),char(1),
-char(15),char(0),char(1),char(1),char(15),char(0),char(2),char(1),char(13),char(0),char(3),char(1),char(13),char(0),char(4),char(1),char(7),char(0),char(5),char(1),
-char(4),char(0),char(6),char(1),char(4),char(0),char(7),char(1),char(4),char(0),char(8),char(1),char(4),char(0),char(9),char(1),char(7),char(0),char(-31),char(0),
-char(4),char(0),char(53),char(0),char(73),char(0),char(27),char(0),char(17),char(0),char(10),char(1),char(15),char(0),char(11),char(1),char(15),char(0),char(12),char(1),
-char(13),char(0),char(3),char(1),char(13),char(0),char(13),char(1),char(13),char(0),char(14),char(1),char(13),char(0),char(15),char(1),char(13),char(0),char(16),char(1),
-char(13),char(0),char(17),char(1),char(4),char(0),char(18),char(1),char(7),char(0),char(19),char(1),char(4),char(0),char(20),char(1),char(4),char(0),char(21),char(1),
-char(4),char(0),char(22),char(1),char(7),char(0),char(23),char(1),char(7),char(0),char(24),char(1),char(4),char(0),char(25),char(1),char(4),char(0),char(26),char(1),
-char(7),char(0),char(27),char(1),char(7),char(0),char(28),char(1),char(7),char(0),char(29),char(1),char(7),char(0),char(30),char(1),char(7),char(0),char(31),char(1),
-char(7),char(0),char(32),char(1),char(4),char(0),char(33),char(1),char(4),char(0),char(34),char(1),char(4),char(0),char(35),char(1),char(74),char(0),char(12),char(0),
-char(9),char(0),char(36),char(1),char(9),char(0),char(37),char(1),char(13),char(0),char(38),char(1),char(7),char(0),char(39),char(1),char(7),char(0),char(-63),char(0),
-char(7),char(0),char(40),char(1),char(4),char(0),char(41),char(1),char(13),char(0),char(42),char(1),char(4),char(0),char(43),char(1),char(4),char(0),char(44),char(1),
-char(4),char(0),char(45),char(1),char(4),char(0),char(53),char(0),char(75),char(0),char(19),char(0),char(47),char(0),char(125),char(0),char(72),char(0),char(46),char(1),
-char(65),char(0),char(47),char(1),char(66),char(0),char(48),char(1),char(67),char(0),char(49),char(1),char(68),char(0),char(50),char(1),char(69),char(0),char(51),char(1),
-char(70),char(0),char(52),char(1),char(73),char(0),char(53),char(1),char(74),char(0),char(54),char(1),char(4),char(0),char(55),char(1),char(4),char(0),char(21),char(1),
-char(4),char(0),char(56),char(1),char(4),char(0),char(57),char(1),char(4),char(0),char(58),char(1),char(4),char(0),char(59),char(1),char(4),char(0),char(60),char(1),
-char(4),char(0),char(61),char(1),char(71),char(0),char(62),char(1),};
-int b3s_bulletDNAlen= sizeof(b3s_bulletDNAstr);
-char b3s_bulletDNAstr64[]= {
-char(83),char(68),char(78),char(65),char(78),char(65),char(77),char(69),char(63),char(1),char(0),char(0),char(109),char(95),char(115),char(105),char(122),char(101),char(0),char(109),
-char(95),char(99),char(97),char(112),char(97),char(99),char(105),char(116),char(121),char(0),char(42),char(109),char(95),char(100),char(97),char(116),char(97),char(0),char(109),char(95),
-char(99),char(111),char(108),char(108),char(105),char(115),char(105),char(111),char(110),char(83),char(104),char(97),char(112),char(101),char(115),char(0),char(109),char(95),char(99),char(111),
-char(108),char(108),char(105),char(115),char(105),char(111),char(110),char(79),char(98),char(106),char(101),char(99),char(116),char(115),char(0),char(109),char(95),char(99),char(111),char(110),
-char(115),char(116),char(114),char(97),char(105),char(110),char(116),char(115),char(0),char(42),char(102),char(105),char(114),char(115),char(116),char(0),char(42),char(108),char(97),char(115),
-char(116),char(0),char(109),char(95),char(102),char(108),char(111),char(97),char(116),char(115),char(91),char(52),char(93),char(0),char(109),char(95),char(101),char(108),char(91),char(51),
-char(93),char(0),char(109),char(95),char(98),char(97),char(115),char(105),char(115),char(0),char(109),char(95),char(111),char(114),char(105),char(103),char(105),char(110),char(0),char(109),
-char(95),char(114),char(111),char(111),char(116),char(78),char(111),char(100),char(101),char(73),char(110),char(100),char(101),char(120),char(0),char(109),char(95),char(115),char(117),char(98),
-char(116),char(114),char(101),char(101),char(83),char(105),char(122),char(101),char(0),char(109),char(95),char(113),char(117),char(97),char(110),char(116),char(105),char(122),char(101),char(100),
-char(65),char(97),char(98),char(98),char(77),char(105),char(110),char(91),char(51),char(93),char(0),char(109),char(95),char(113),char(117),char(97),char(110),char(116),char(105),char(122),
-char(101),char(100),char(65),char(97),char(98),char(98),char(77),char(97),char(120),char(91),char(51),char(93),char(0),char(109),char(95),char(97),char(97),char(98),char(98),char(77),
-char(105),char(110),char(79),char(114),char(103),char(0),char(109),char(95),char(97),char(97),char(98),char(98),char(77),char(97),char(120),char(79),char(114),char(103),char(0),char(109),
-char(95),char(101),char(115),char(99),char(97),char(112),char(101),char(73),char(110),char(100),char(101),char(120),char(0),char(109),char(95),char(115),char(117),char(98),char(80),char(97),
-char(114),char(116),char(0),char(109),char(95),char(116),char(114),char(105),char(97),char(110),char(103),char(108),char(101),char(73),char(110),char(100),char(101),char(120),char(0),char(109),
-char(95),char(112),char(97),char(100),char(91),char(52),char(93),char(0),char(109),char(95),char(101),char(115),char(99),char(97),char(112),char(101),char(73),char(110),char(100),char(101),
-char(120),char(79),char(114),char(84),char(114),char(105),char(97),char(110),char(103),char(108),char(101),char(73),char(110),char(100),char(101),char(120),char(0),char(109),char(95),char(98),
-char(118),char(104),char(65),char(97),char(98),char(98),char(77),char(105),char(110),char(0),char(109),char(95),char(98),char(118),char(104),char(65),char(97),char(98),char(98),char(77),
-char(97),char(120),char(0),char(109),char(95),char(98),char(118),char(104),char(81),char(117),char(97),char(110),char(116),char(105),char(122),char(97),char(116),char(105),char(111),char(110),
-char(0),char(109),char(95),char(99),char(117),char(114),char(78),char(111),char(100),char(101),char(73),char(110),char(100),char(101),char(120),char(0),char(109),char(95),char(117),char(115),
-char(101),char(81),char(117),char(97),char(110),char(116),char(105),char(122),char(97),char(116),char(105),char(111),char(110),char(0),char(109),char(95),char(110),char(117),char(109),char(67),
-char(111),char(110),char(116),char(105),char(103),char(117),char(111),char(117),char(115),char(76),char(101),char(97),char(102),char(78),char(111),char(100),char(101),char(115),char(0),char(109),
-char(95),char(110),char(117),char(109),char(81),char(117),char(97),char(110),char(116),char(105),char(122),char(101),char(100),char(67),char(111),char(110),char(116),char(105),char(103),char(117),
-char(111),char(117),char(115),char(78),char(111),char(100),char(101),char(115),char(0),char(42),char(109),char(95),char(99),char(111),char(110),char(116),char(105),char(103),char(117),char(111),
-char(117),char(115),char(78),char(111),char(100),char(101),char(115),char(80),char(116),char(114),char(0),char(42),char(109),char(95),char(113),char(117),char(97),char(110),char(116),char(105),
-char(122),char(101),char(100),char(67),char(111),char(110),char(116),char(105),char(103),char(117),char(111),char(117),char(115),char(78),char(111),char(100),char(101),char(115),char(80),char(116),
-char(114),char(0),char(42),char(109),char(95),char(115),char(117),char(98),char(84),char(114),char(101),char(101),char(73),char(110),char(102),char(111),char(80),char(116),char(114),char(0),
-char(109),char(95),char(116),char(114),char(97),char(118),char(101),char(114),char(115),char(97),char(108),char(77),char(111),char(100),char(101),char(0),char(109),char(95),char(110),char(117),
-char(109),char(83),char(117),char(98),char(116),char(114),char(101),char(101),char(72),char(101),char(97),char(100),char(101),char(114),char(115),char(0),char(42),char(109),char(95),char(110),
-char(97),char(109),char(101),char(0),char(109),char(95),char(115),char(104),char(97),char(112),char(101),char(84),char(121),char(112),char(101),char(0),char(109),char(95),char(112),char(97),
-char(100),char(100),char(105),char(110),char(103),char(91),char(52),char(93),char(0),char(109),char(95),char(99),char(111),char(108),char(108),char(105),char(115),char(105),char(111),char(110),
-char(83),char(104),char(97),char(112),char(101),char(68),char(97),char(116),char(97),char(0),char(109),char(95),char(108),char(111),char(99),char(97),char(108),char(83),char(99),char(97),
-char(108),char(105),char(110),char(103),char(0),char(109),char(95),char(112),char(108),char(97),char(110),char(101),char(78),char(111),char(114),char(109),char(97),char(108),char(0),char(109),
-char(95),char(112),char(108),char(97),char(110),char(101),char(67),char(111),char(110),char(115),char(116),char(97),char(110),char(116),char(0),char(109),char(95),char(105),char(109),char(112),
-char(108),char(105),char(99),char(105),char(116),char(83),char(104),char(97),char(112),char(101),char(68),char(105),char(109),char(101),char(110),char(115),char(105),char(111),char(110),char(115),
-char(0),char(109),char(95),char(99),char(111),char(108),char(108),char(105),char(115),char(105),char(111),char(110),char(77),char(97),char(114),char(103),char(105),char(110),char(0),char(109),
-char(95),char(112),char(97),char(100),char(100),char(105),char(110),char(103),char(0),char(109),char(95),char(112),char(111),char(115),char(0),char(109),char(95),char(114),char(97),char(100),
-char(105),char(117),char(115),char(0),char(109),char(95),char(99),char(111),char(110),char(118),char(101),char(120),char(73),char(110),char(116),char(101),char(114),char(110),char(97),char(108),
-char(83),char(104),char(97),char(112),char(101),char(68),char(97),char(116),char(97),char(0),char(42),char(109),char(95),char(108),char(111),char(99),char(97),char(108),char(80),char(111),
-char(115),char(105),char(116),char(105),char(111),char(110),char(65),char(114),char(114),char(97),char(121),char(80),char(116),char(114),char(0),char(109),char(95),char(108),char(111),char(99),
-char(97),char(108),char(80),char(111),char(115),char(105),char(116),char(105),char(111),char(110),char(65),char(114),char(114),char(97),char(121),char(83),char(105),char(122),char(101),char(0),
-char(109),char(95),char(118),char(97),char(108),char(117),char(101),char(0),char(109),char(95),char(112),char(97),char(100),char(91),char(50),char(93),char(0),char(109),char(95),char(118),
-char(97),char(108),char(117),char(101),char(115),char(91),char(51),char(93),char(0),char(109),char(95),char(112),char(97),char(100),char(0),char(42),char(109),char(95),char(118),char(101),
-char(114),char(116),char(105),char(99),char(101),char(115),char(51),char(102),char(0),char(42),char(109),char(95),char(118),char(101),char(114),char(116),char(105),char(99),char(101),char(115),
-char(51),char(100),char(0),char(42),char(109),char(95),char(105),char(110),char(100),char(105),char(99),char(101),char(115),char(51),char(50),char(0),char(42),char(109),char(95),char(51),
-char(105),char(110),char(100),char(105),char(99),char(101),char(115),char(49),char(54),char(0),char(42),char(109),char(95),char(51),char(105),char(110),char(100),char(105),char(99),char(101),
-char(115),char(56),char(0),char(42),char(109),char(95),char(105),char(110),char(100),char(105),char(99),char(101),char(115),char(49),char(54),char(0),char(109),char(95),char(110),char(117),
-char(109),char(84),char(114),char(105),char(97),char(110),char(103),char(108),char(101),char(115),char(0),char(109),char(95),char(110),char(117),char(109),char(86),char(101),char(114),char(116),
-char(105),char(99),char(101),char(115),char(0),char(42),char(109),char(95),char(109),char(101),char(115),char(104),char(80),char(97),char(114),char(116),char(115),char(80),char(116),char(114),
-char(0),char(109),char(95),char(115),char(99),char(97),char(108),char(105),char(110),char(103),char(0),char(109),char(95),char(110),char(117),char(109),char(77),char(101),char(115),char(104),
-char(80),char(97),char(114),char(116),char(115),char(0),char(109),char(95),char(109),char(101),char(115),char(104),char(73),char(110),char(116),char(101),char(114),char(102),char(97),char(99),
-char(101),char(0),char(42),char(109),char(95),char(113),char(117),char(97),char(110),char(116),char(105),char(122),char(101),char(100),char(70),char(108),char(111),char(97),char(116),char(66),
-char(118),char(104),char(0),char(42),char(109),char(95),char(113),char(117),char(97),char(110),char(116),char(105),char(122),char(101),char(100),char(68),char(111),char(117),char(98),char(108),
-char(101),char(66),char(118),char(104),char(0),char(42),char(109),char(95),char(116),char(114),char(105),char(97),char(110),char(103),char(108),char(101),char(73),char(110),char(102),char(111),
-char(77),char(97),char(112),char(0),char(109),char(95),char(112),char(97),char(100),char(51),char(91),char(52),char(93),char(0),char(109),char(95),char(116),char(114),char(105),char(109),
-char(101),char(115),char(104),char(83),char(104),char(97),char(112),char(101),char(68),char(97),char(116),char(97),char(0),char(109),char(95),char(116),char(114),char(97),char(110),char(115),
-char(102),char(111),char(114),char(109),char(0),char(42),char(109),char(95),char(99),char(104),char(105),char(108),char(100),char(83),char(104),char(97),char(112),char(101),char(0),char(109),
-char(95),char(99),char(104),char(105),char(108),char(100),char(83),char(104),char(97),char(112),char(101),char(84),char(121),char(112),char(101),char(0),char(109),char(95),char(99),char(104),
-char(105),char(108),char(100),char(77),char(97),char(114),char(103),char(105),char(110),char(0),char(42),char(109),char(95),char(99),char(104),char(105),char(108),char(100),char(83),char(104),
-char(97),char(112),char(101),char(80),char(116),char(114),char(0),char(109),char(95),char(110),char(117),char(109),char(67),char(104),char(105),char(108),char(100),char(83),char(104),char(97),
-char(112),char(101),char(115),char(0),char(109),char(95),char(117),char(112),char(65),char(120),char(105),char(115),char(0),char(109),char(95),char(102),char(108),char(97),char(103),char(115),
-char(0),char(109),char(95),char(101),char(100),char(103),char(101),char(86),char(48),char(86),char(49),char(65),char(110),char(103),char(108),char(101),char(0),char(109),char(95),char(101),
-char(100),char(103),char(101),char(86),char(49),char(86),char(50),char(65),char(110),char(103),char(108),char(101),char(0),char(109),char(95),char(101),char(100),char(103),char(101),char(86),
-char(50),char(86),char(48),char(65),char(110),char(103),char(108),char(101),char(0),char(42),char(109),char(95),char(104),char(97),char(115),char(104),char(84),char(97),char(98),char(108),
-char(101),char(80),char(116),char(114),char(0),char(42),char(109),char(95),char(110),char(101),char(120),char(116),char(80),char(116),char(114),char(0),char(42),char(109),char(95),char(118),
-char(97),char(108),char(117),char(101),char(65),char(114),char(114),char(97),char(121),char(80),char(116),char(114),char(0),char(42),char(109),char(95),char(107),char(101),char(121),char(65),
-char(114),char(114),char(97),char(121),char(80),char(116),char(114),char(0),char(109),char(95),char(99),char(111),char(110),char(118),char(101),char(120),char(69),char(112),char(115),char(105),
-char(108),char(111),char(110),char(0),char(109),char(95),char(112),char(108),char(97),char(110),char(97),char(114),char(69),char(112),char(115),char(105),char(108),char(111),char(110),char(0),
-char(109),char(95),char(101),char(113),char(117),char(97),char(108),char(86),char(101),char(114),char(116),char(101),char(120),char(84),char(104),char(114),char(101),char(115),char(104),char(111),
-char(108),char(100),char(0),char(109),char(95),char(101),char(100),char(103),char(101),char(68),char(105),char(115),char(116),char(97),char(110),char(99),char(101),char(84),char(104),char(114),
-char(101),char(115),char(104),char(111),char(108),char(100),char(0),char(109),char(95),char(122),char(101),char(114),char(111),char(65),char(114),char(101),char(97),char(84),char(104),char(114),
-char(101),char(115),char(104),char(111),char(108),char(100),char(0),char(109),char(95),char(110),char(101),char(120),char(116),char(83),char(105),char(122),char(101),char(0),char(109),char(95),
-char(104),char(97),char(115),char(104),char(84),char(97),char(98),char(108),char(101),char(83),char(105),char(122),char(101),char(0),char(109),char(95),char(110),char(117),char(109),char(86),
-char(97),char(108),char(117),char(101),char(115),char(0),char(109),char(95),char(110),char(117),char(109),char(75),char(101),char(121),char(115),char(0),char(109),char(95),char(103),char(105),
-char(109),char(112),char(97),char(99),char(116),char(83),char(117),char(98),char(84),char(121),char(112),char(101),char(0),char(42),char(109),char(95),char(117),char(110),char(115),char(99),
-char(97),char(108),char(101),char(100),char(80),char(111),char(105),char(110),char(116),char(115),char(70),char(108),char(111),char(97),char(116),char(80),char(116),char(114),char(0),char(42),
-char(109),char(95),char(117),char(110),char(115),char(99),char(97),char(108),char(101),char(100),char(80),char(111),char(105),char(110),char(116),char(115),char(68),char(111),char(117),char(98),
-char(108),char(101),char(80),char(116),char(114),char(0),char(109),char(95),char(110),char(117),char(109),char(85),char(110),char(115),char(99),char(97),char(108),char(101),char(100),char(80),
-char(111),char(105),char(110),char(116),char(115),char(0),char(109),char(95),char(112),char(97),char(100),char(100),char(105),char(110),char(103),char(51),char(91),char(52),char(93),char(0),
-char(42),char(109),char(95),char(98),char(114),char(111),char(97),char(100),char(112),char(104),char(97),char(115),char(101),char(72),char(97),char(110),char(100),char(108),char(101),char(0),
-char(42),char(109),char(95),char(99),char(111),char(108),char(108),char(105),char(115),char(105),char(111),char(110),char(83),char(104),char(97),char(112),char(101),char(0),char(42),char(109),
-char(95),char(114),char(111),char(111),char(116),char(67),char(111),char(108),char(108),char(105),char(115),char(105),char(111),char(110),char(83),char(104),char(97),char(112),char(101),char(0),
-char(109),char(95),char(119),char(111),char(114),char(108),char(100),char(84),char(114),char(97),char(110),char(115),char(102),char(111),char(114),char(109),char(0),char(109),char(95),char(105),
-char(110),char(116),char(101),char(114),char(112),char(111),char(108),char(97),char(116),char(105),char(111),char(110),char(87),char(111),char(114),char(108),char(100),char(84),char(114),char(97),
-char(110),char(115),char(102),char(111),char(114),char(109),char(0),char(109),char(95),char(105),char(110),char(116),char(101),char(114),char(112),char(111),char(108),char(97),char(116),char(105),
-char(111),char(110),char(76),char(105),char(110),char(101),char(97),char(114),char(86),char(101),char(108),char(111),char(99),char(105),char(116),char(121),char(0),char(109),char(95),char(105),
-char(110),char(116),char(101),char(114),char(112),char(111),char(108),char(97),char(116),char(105),char(111),char(110),char(65),char(110),char(103),char(117),char(108),char(97),char(114),char(86),
-char(101),char(108),char(111),char(99),char(105),char(116),char(121),char(0),char(109),char(95),char(97),char(110),char(105),char(115),char(111),char(116),char(114),char(111),char(112),char(105),
-char(99),char(70),char(114),char(105),char(99),char(116),char(105),char(111),char(110),char(0),char(109),char(95),char(99),char(111),char(110),char(116),char(97),char(99),char(116),char(80),
-char(114),char(111),char(99),char(101),char(115),char(115),char(105),char(110),char(103),char(84),char(104),char(114),char(101),char(115),char(104),char(111),char(108),char(100),char(0),char(109),
-char(95),char(100),char(101),char(97),char(99),char(116),char(105),char(118),char(97),char(116),char(105),char(111),char(110),char(84),char(105),char(109),char(101),char(0),char(109),char(95),
-char(102),char(114),char(105),char(99),char(116),char(105),char(111),char(110),char(0),char(109),char(95),char(114),char(111),char(108),char(108),char(105),char(110),char(103),char(70),char(114),
-char(105),char(99),char(116),char(105),char(111),char(110),char(0),char(109),char(95),char(114),char(101),char(115),char(116),char(105),char(116),char(117),char(116),char(105),char(111),char(110),
-char(0),char(109),char(95),char(104),char(105),char(116),char(70),char(114),char(97),char(99),char(116),char(105),char(111),char(110),char(0),char(109),char(95),char(99),char(99),char(100),
-char(83),char(119),char(101),char(112),char(116),char(83),char(112),char(104),char(101),char(114),char(101),char(82),char(97),char(100),char(105),char(117),char(115),char(0),char(109),char(95),
-char(99),char(99),char(100),char(77),char(111),char(116),char(105),char(111),char(110),char(84),char(104),char(114),char(101),char(115),char(104),char(111),char(108),char(100),char(0),char(109),
-char(95),char(104),char(97),char(115),char(65),char(110),char(105),char(115),char(111),char(116),char(114),char(111),char(112),char(105),char(99),char(70),char(114),char(105),char(99),char(116),
-char(105),char(111),char(110),char(0),char(109),char(95),char(99),char(111),char(108),char(108),char(105),char(115),char(105),char(111),char(110),char(70),char(108),char(97),char(103),char(115),
-char(0),char(109),char(95),char(105),char(115),char(108),char(97),char(110),char(100),char(84),char(97),char(103),char(49),char(0),char(109),char(95),char(99),char(111),char(109),char(112),
-char(97),char(110),char(105),char(111),char(110),char(73),char(100),char(0),char(109),char(95),char(97),char(99),char(116),char(105),char(118),char(97),char(116),char(105),char(111),char(110),
-char(83),char(116),char(97),char(116),char(101),char(49),char(0),char(109),char(95),char(105),char(110),char(116),char(101),char(114),char(110),char(97),char(108),char(84),char(121),char(112),
-char(101),char(0),char(109),char(95),char(99),char(104),char(101),char(99),char(107),char(67),char(111),char(108),char(108),char(105),char(100),char(101),char(87),char(105),char(116),char(104),
-char(0),char(109),char(95),char(115),char(111),char(108),char(118),char(101),char(114),char(73),char(110),char(102),char(111),char(0),char(109),char(95),char(103),char(114),char(97),char(118),
-char(105),char(116),char(121),char(0),char(109),char(95),char(99),char(111),char(108),char(108),char(105),char(115),char(105),char(111),char(110),char(79),char(98),char(106),char(101),char(99),
-char(116),char(68),char(97),char(116),char(97),char(0),char(109),char(95),char(105),char(110),char(118),char(73),char(110),char(101),char(114),char(116),char(105),char(97),char(84),char(101),
-char(110),char(115),char(111),char(114),char(87),char(111),char(114),char(108),char(100),char(0),char(109),char(95),char(108),char(105),char(110),char(101),char(97),char(114),char(86),char(101),
-char(108),char(111),char(99),char(105),char(116),char(121),char(0),char(109),char(95),char(97),char(110),char(103),char(117),char(108),char(97),char(114),char(86),char(101),char(108),char(111),
-char(99),char(105),char(116),char(121),char(0),char(109),char(95),char(97),char(110),char(103),char(117),char(108),char(97),char(114),char(70),char(97),char(99),char(116),char(111),char(114),
-char(0),char(109),char(95),char(108),char(105),char(110),char(101),char(97),char(114),char(70),char(97),char(99),char(116),char(111),char(114),char(0),char(109),char(95),char(103),char(114),
-char(97),char(118),char(105),char(116),char(121),char(95),char(97),char(99),char(99),char(101),char(108),char(101),char(114),char(97),char(116),char(105),char(111),char(110),char(0),char(109),
-char(95),char(105),char(110),char(118),char(73),char(110),char(101),char(114),char(116),char(105),char(97),char(76),char(111),char(99),char(97),char(108),char(0),char(109),char(95),char(116),
-char(111),char(116),char(97),char(108),char(70),char(111),char(114),char(99),char(101),char(0),char(109),char(95),char(116),char(111),char(116),char(97),char(108),char(84),char(111),char(114),
-char(113),char(117),char(101),char(0),char(109),char(95),char(105),char(110),char(118),char(101),char(114),char(115),char(101),char(77),char(97),char(115),char(115),char(0),char(109),char(95),
-char(108),char(105),char(110),char(101),char(97),char(114),char(68),char(97),char(109),char(112),char(105),char(110),char(103),char(0),char(109),char(95),char(97),char(110),char(103),char(117),
-char(108),char(97),char(114),char(68),char(97),char(109),char(112),char(105),char(110),char(103),char(0),char(109),char(95),char(97),char(100),char(100),char(105),char(116),char(105),char(111),
-char(110),char(97),char(108),char(68),char(97),char(109),char(112),char(105),char(110),char(103),char(70),char(97),char(99),char(116),char(111),char(114),char(0),char(109),char(95),char(97),
-char(100),char(100),char(105),char(116),char(105),char(111),char(110),char(97),char(108),char(76),char(105),char(110),char(101),char(97),char(114),char(68),char(97),char(109),char(112),char(105),
-char(110),char(103),char(84),char(104),char(114),char(101),char(115),char(104),char(111),char(108),char(100),char(83),char(113),char(114),char(0),char(109),char(95),char(97),char(100),char(100),
-char(105),char(116),char(105),char(111),char(110),char(97),char(108),char(65),char(110),char(103),char(117),char(108),char(97),char(114),char(68),char(97),char(109),char(112),char(105),char(110),
-char(103),char(84),char(104),char(114),char(101),char(115),char(104),char(111),char(108),char(100),char(83),char(113),char(114),char(0),char(109),char(95),char(97),char(100),char(100),char(105),
-char(116),char(105),char(111),char(110),char(97),char(108),char(65),char(110),char(103),char(117),char(108),char(97),char(114),char(68),char(97),char(109),char(112),char(105),char(110),char(103),
-char(70),char(97),char(99),char(116),char(111),char(114),char(0),char(109),char(95),char(108),char(105),char(110),char(101),char(97),char(114),char(83),char(108),char(101),char(101),char(112),
-char(105),char(110),char(103),char(84),char(104),char(114),char(101),char(115),char(104),char(111),char(108),char(100),char(0),char(109),char(95),char(97),char(110),char(103),char(117),char(108),
-char(97),char(114),char(83),char(108),char(101),char(101),char(112),char(105),char(110),char(103),char(84),char(104),char(114),char(101),char(115),char(104),char(111),char(108),char(100),char(0),
-char(109),char(95),char(97),char(100),char(100),char(105),char(116),char(105),char(111),char(110),char(97),char(108),char(68),char(97),char(109),char(112),char(105),char(110),char(103),char(0),
-char(109),char(95),char(110),char(117),char(109),char(67),char(111),char(110),char(115),char(116),char(114),char(97),char(105),char(110),char(116),char(82),char(111),char(119),char(115),char(0),
-char(110),char(117),char(98),char(0),char(42),char(109),char(95),char(114),char(98),char(65),char(0),char(42),char(109),char(95),char(114),char(98),char(66),char(0),char(109),char(95),
-char(111),char(98),char(106),char(101),char(99),char(116),char(84),char(121),char(112),char(101),char(0),char(109),char(95),char(117),char(115),char(101),char(114),char(67),char(111),char(110),
-char(115),char(116),char(114),char(97),char(105),char(110),char(116),char(84),char(121),char(112),char(101),char(0),char(109),char(95),char(117),char(115),char(101),char(114),char(67),char(111),
-char(110),char(115),char(116),char(114),char(97),char(105),char(110),char(116),char(73),char(100),char(0),char(109),char(95),char(110),char(101),char(101),char(100),char(115),char(70),char(101),
-char(101),char(100),char(98),char(97),char(99),char(107),char(0),char(109),char(95),char(97),char(112),char(112),char(108),char(105),char(101),char(100),char(73),char(109),char(112),char(117),
-char(108),char(115),char(101),char(0),char(109),char(95),char(100),char(98),char(103),char(68),char(114),char(97),char(119),char(83),char(105),char(122),char(101),char(0),char(109),char(95),
-char(100),char(105),char(115),char(97),char(98),char(108),char(101),char(67),char(111),char(108),char(108),char(105),char(115),char(105),char(111),char(110),char(115),char(66),char(101),char(116),
-char(119),char(101),char(101),char(110),char(76),char(105),char(110),char(107),char(101),char(100),char(66),char(111),char(100),char(105),char(101),char(115),char(0),char(109),char(95),char(111),
-char(118),char(101),char(114),char(114),char(105),char(100),char(101),char(78),char(117),char(109),char(83),char(111),char(108),char(118),char(101),char(114),char(73),char(116),char(101),char(114),
-char(97),char(116),char(105),char(111),char(110),char(115),char(0),char(109),char(95),char(98),char(114),char(101),char(97),char(107),char(105),char(110),char(103),char(73),char(109),char(112),
-char(117),char(108),char(115),char(101),char(84),char(104),char(114),char(101),char(115),char(104),char(111),char(108),char(100),char(0),char(109),char(95),char(105),char(115),char(69),char(110),
-char(97),char(98),char(108),char(101),char(100),char(0),char(109),char(95),char(116),char(121),char(112),char(101),char(67),char(111),char(110),char(115),char(116),char(114),char(97),char(105),
-char(110),char(116),char(68),char(97),char(116),char(97),char(0),char(109),char(95),char(112),char(105),char(118),char(111),char(116),char(73),char(110),char(65),char(0),char(109),char(95),
-char(112),char(105),char(118),char(111),char(116),char(73),char(110),char(66),char(0),char(109),char(95),char(114),char(98),char(65),char(70),char(114),char(97),char(109),char(101),char(0),
-char(109),char(95),char(114),char(98),char(66),char(70),char(114),char(97),char(109),char(101),char(0),char(109),char(95),char(117),char(115),char(101),char(82),char(101),char(102),char(101),
-char(114),char(101),char(110),char(99),char(101),char(70),char(114),char(97),char(109),char(101),char(65),char(0),char(109),char(95),char(97),char(110),char(103),char(117),char(108),char(97),
-char(114),char(79),char(110),char(108),char(121),char(0),char(109),char(95),char(101),char(110),char(97),char(98),char(108),char(101),char(65),char(110),char(103),char(117),char(108),char(97),
-char(114),char(77),char(111),char(116),char(111),char(114),char(0),char(109),char(95),char(109),char(111),char(116),char(111),char(114),char(84),char(97),char(114),char(103),char(101),char(116),
-char(86),char(101),char(108),char(111),char(99),char(105),char(116),char(121),char(0),char(109),char(95),char(109),char(97),char(120),char(77),char(111),char(116),char(111),char(114),char(73),
-char(109),char(112),char(117),char(108),char(115),char(101),char(0),char(109),char(95),char(108),char(111),char(119),char(101),char(114),char(76),char(105),char(109),char(105),char(116),char(0),
-char(109),char(95),char(117),char(112),char(112),char(101),char(114),char(76),char(105),char(109),char(105),char(116),char(0),char(109),char(95),char(108),char(105),char(109),char(105),char(116),
-char(83),char(111),char(102),char(116),char(110),char(101),char(115),char(115),char(0),char(109),char(95),char(98),char(105),char(97),char(115),char(70),char(97),char(99),char(116),char(111),
-char(114),char(0),char(109),char(95),char(114),char(101),char(108),char(97),char(120),char(97),char(116),char(105),char(111),char(110),char(70),char(97),char(99),char(116),char(111),char(114),
-char(0),char(109),char(95),char(115),char(119),char(105),char(110),char(103),char(83),char(112),char(97),char(110),char(49),char(0),char(109),char(95),char(115),char(119),char(105),char(110),
-char(103),char(83),char(112),char(97),char(110),char(50),char(0),char(109),char(95),char(116),char(119),char(105),char(115),char(116),char(83),char(112),char(97),char(110),char(0),char(109),
-char(95),char(100),char(97),char(109),char(112),char(105),char(110),char(103),char(0),char(109),char(95),char(108),char(105),char(110),char(101),char(97),char(114),char(85),char(112),char(112),
-char(101),char(114),char(76),char(105),char(109),char(105),char(116),char(0),char(109),char(95),char(108),char(105),char(110),char(101),char(97),char(114),char(76),char(111),char(119),char(101),
-char(114),char(76),char(105),char(109),char(105),char(116),char(0),char(109),char(95),char(97),char(110),char(103),char(117),char(108),char(97),char(114),char(85),char(112),char(112),char(101),
-char(114),char(76),char(105),char(109),char(105),char(116),char(0),char(109),char(95),char(97),char(110),char(103),char(117),char(108),char(97),char(114),char(76),char(111),char(119),char(101),
-char(114),char(76),char(105),char(109),char(105),char(116),char(0),char(109),char(95),char(117),char(115),char(101),char(76),char(105),char(110),char(101),char(97),char(114),char(82),char(101),
-char(102),char(101),char(114),char(101),char(110),char(99),char(101),char(70),char(114),char(97),char(109),char(101),char(65),char(0),char(109),char(95),char(117),char(115),char(101),char(79),
-char(102),char(102),char(115),char(101),char(116),char(70),char(111),char(114),char(67),char(111),char(110),char(115),char(116),char(114),char(97),char(105),char(110),char(116),char(70),char(114),
-char(97),char(109),char(101),char(0),char(109),char(95),char(54),char(100),char(111),char(102),char(68),char(97),char(116),char(97),char(0),char(109),char(95),char(115),char(112),char(114),
-char(105),char(110),char(103),char(69),char(110),char(97),char(98),char(108),char(101),char(100),char(91),char(54),char(93),char(0),char(109),char(95),char(101),char(113),char(117),char(105),
-char(108),char(105),char(98),char(114),char(105),char(117),char(109),char(80),char(111),char(105),char(110),char(116),char(91),char(54),char(93),char(0),char(109),char(95),char(115),char(112),
-char(114),char(105),char(110),char(103),char(83),char(116),char(105),char(102),char(102),char(110),char(101),char(115),char(115),char(91),char(54),char(93),char(0),char(109),char(95),char(115),
-char(112),char(114),char(105),char(110),char(103),char(68),char(97),char(109),char(112),char(105),char(110),char(103),char(91),char(54),char(93),char(0),char(109),char(95),char(116),char(97),
-char(117),char(0),char(109),char(95),char(116),char(105),char(109),char(101),char(83),char(116),char(101),char(112),char(0),char(109),char(95),char(109),char(97),char(120),char(69),char(114),
-char(114),char(111),char(114),char(82),char(101),char(100),char(117),char(99),char(116),char(105),char(111),char(110),char(0),char(109),char(95),char(115),char(111),char(114),char(0),char(109),
-char(95),char(101),char(114),char(112),char(0),char(109),char(95),char(101),char(114),char(112),char(50),char(0),char(109),char(95),char(103),char(108),char(111),char(98),char(97),char(108),
-char(67),char(102),char(109),char(0),char(109),char(95),char(115),char(112),char(108),char(105),char(116),char(73),char(109),char(112),char(117),char(108),char(115),char(101),char(80),char(101),
-char(110),char(101),char(116),char(114),char(97),char(116),char(105),char(111),char(110),char(84),char(104),char(114),char(101),char(115),char(104),char(111),char(108),char(100),char(0),char(109),
-char(95),char(115),char(112),char(108),char(105),char(116),char(73),char(109),char(112),char(117),char(108),char(115),char(101),char(84),char(117),char(114),char(110),char(69),char(114),char(112),
-char(0),char(109),char(95),char(108),char(105),char(110),char(101),char(97),char(114),char(83),char(108),char(111),char(112),char(0),char(109),char(95),char(119),char(97),char(114),char(109),
-char(115),char(116),char(97),char(114),char(116),char(105),char(110),char(103),char(70),char(97),char(99),char(116),char(111),char(114),char(0),char(109),char(95),char(109),char(97),char(120),
-char(71),char(121),char(114),char(111),char(115),char(99),char(111),char(112),char(105),char(99),char(70),char(111),char(114),char(99),char(101),char(0),char(109),char(95),char(115),char(105),
-char(110),char(103),char(108),char(101),char(65),char(120),char(105),char(115),char(82),char(111),char(108),char(108),char(105),char(110),char(103),char(70),char(114),char(105),char(99),char(116),
-char(105),char(111),char(110),char(84),char(104),char(114),char(101),char(115),char(104),char(111),char(108),char(100),char(0),char(109),char(95),char(110),char(117),char(109),char(73),char(116),
-char(101),char(114),char(97),char(116),char(105),char(111),char(110),char(115),char(0),char(109),char(95),char(115),char(111),char(108),char(118),char(101),char(114),char(77),char(111),char(100),
-char(101),char(0),char(109),char(95),char(114),char(101),char(115),char(116),char(105),char(110),char(103),char(67),char(111),char(110),char(116),char(97),char(99),char(116),char(82),char(101),
-char(115),char(116),char(105),char(116),char(117),char(116),char(105),char(111),char(110),char(84),char(104),char(114),char(101),char(115),char(104),char(111),char(108),char(100),char(0),char(109),
-char(95),char(109),char(105),char(110),char(105),char(109),char(117),char(109),char(83),char(111),char(108),char(118),char(101),char(114),char(66),char(97),char(116),char(99),char(104),char(83),
-char(105),char(122),char(101),char(0),char(109),char(95),char(115),char(112),char(108),char(105),char(116),char(73),char(109),char(112),char(117),char(108),char(115),char(101),char(0),char(109),
-char(95),char(108),char(105),char(110),char(101),char(97),char(114),char(83),char(116),char(105),char(102),char(102),char(110),char(101),char(115),char(115),char(0),char(109),char(95),char(97),
-char(110),char(103),char(117),char(108),char(97),char(114),char(83),char(116),char(105),char(102),char(102),char(110),char(101),char(115),char(115),char(0),char(109),char(95),char(118),char(111),
-char(108),char(117),char(109),char(101),char(83),char(116),char(105),char(102),char(102),char(110),char(101),char(115),char(115),char(0),char(42),char(109),char(95),char(109),char(97),char(116),
-char(101),char(114),char(105),char(97),char(108),char(0),char(109),char(95),char(112),char(111),char(115),char(105),char(116),char(105),char(111),char(110),char(0),char(109),char(95),char(112),
-char(114),char(101),char(118),char(105),char(111),char(117),char(115),char(80),char(111),char(115),char(105),char(116),char(105),char(111),char(110),char(0),char(109),char(95),char(118),char(101),
-char(108),char(111),char(99),char(105),char(116),char(121),char(0),char(109),char(95),char(97),char(99),char(99),char(117),char(109),char(117),char(108),char(97),char(116),char(101),char(100),
-char(70),char(111),char(114),char(99),char(101),char(0),char(109),char(95),char(110),char(111),char(114),char(109),char(97),char(108),char(0),char(109),char(95),char(97),char(114),char(101),
-char(97),char(0),char(109),char(95),char(97),char(116),char(116),char(97),char(99),char(104),char(0),char(109),char(95),char(110),char(111),char(100),char(101),char(73),char(110),char(100),
-char(105),char(99),char(101),char(115),char(91),char(50),char(93),char(0),char(109),char(95),char(114),char(101),char(115),char(116),char(76),char(101),char(110),char(103),char(116),char(104),
-char(0),char(109),char(95),char(98),char(98),char(101),char(110),char(100),char(105),char(110),char(103),char(0),char(109),char(95),char(110),char(111),char(100),char(101),char(73),char(110),
-char(100),char(105),char(99),char(101),char(115),char(91),char(51),char(93),char(0),char(109),char(95),char(114),char(101),char(115),char(116),char(65),char(114),char(101),char(97),char(0),
-char(109),char(95),char(99),char(48),char(91),char(52),char(93),char(0),char(109),char(95),char(110),char(111),char(100),char(101),char(73),char(110),char(100),char(105),char(99),char(101),
-char(115),char(91),char(52),char(93),char(0),char(109),char(95),char(114),char(101),char(115),char(116),char(86),char(111),char(108),char(117),char(109),char(101),char(0),char(109),char(95),
-char(99),char(49),char(0),char(109),char(95),char(99),char(50),char(0),char(109),char(95),char(99),char(48),char(0),char(109),char(95),char(108),char(111),char(99),char(97),char(108),
-char(70),char(114),char(97),char(109),char(101),char(0),char(42),char(109),char(95),char(114),char(105),char(103),char(105),char(100),char(66),char(111),char(100),char(121),char(0),char(109),
-char(95),char(110),char(111),char(100),char(101),char(73),char(110),char(100),char(101),char(120),char(0),char(109),char(95),char(97),char(101),char(114),char(111),char(77),char(111),char(100),
-char(101),char(108),char(0),char(109),char(95),char(98),char(97),char(117),char(109),char(103),char(97),char(114),char(116),char(101),char(0),char(109),char(95),char(100),char(114),char(97),
-char(103),char(0),char(109),char(95),char(108),char(105),char(102),char(116),char(0),char(109),char(95),char(112),char(114),char(101),char(115),char(115),char(117),char(114),char(101),char(0),
-char(109),char(95),char(118),char(111),char(108),char(117),char(109),char(101),char(0),char(109),char(95),char(100),char(121),char(110),char(97),char(109),char(105),char(99),char(70),char(114),
-char(105),char(99),char(116),char(105),char(111),char(110),char(0),char(109),char(95),char(112),char(111),char(115),char(101),char(77),char(97),char(116),char(99),char(104),char(0),char(109),
-char(95),char(114),char(105),char(103),char(105),char(100),char(67),char(111),char(110),char(116),char(97),char(99),char(116),char(72),char(97),char(114),char(100),char(110),char(101),char(115),
-char(115),char(0),char(109),char(95),char(107),char(105),char(110),char(101),char(116),char(105),char(99),char(67),char(111),char(110),char(116),char(97),char(99),char(116),char(72),char(97),
-char(114),char(100),char(110),char(101),char(115),char(115),char(0),char(109),char(95),char(115),char(111),char(102),char(116),char(67),char(111),char(110),char(116),char(97),char(99),char(116),
-char(72),char(97),char(114),char(100),char(110),char(101),char(115),char(115),char(0),char(109),char(95),char(97),char(110),char(99),char(104),char(111),char(114),char(72),char(97),char(114),
-char(100),char(110),char(101),char(115),char(115),char(0),char(109),char(95),char(115),char(111),char(102),char(116),char(82),char(105),char(103),char(105),char(100),char(67),char(108),char(117),
-char(115),char(116),char(101),char(114),char(72),char(97),char(114),char(100),char(110),char(101),char(115),char(115),char(0),char(109),char(95),char(115),char(111),char(102),char(116),char(75),
-char(105),char(110),char(101),char(116),char(105),char(99),char(67),char(108),char(117),char(115),char(116),char(101),char(114),char(72),char(97),char(114),char(100),char(110),char(101),char(115),
-char(115),char(0),char(109),char(95),char(115),char(111),char(102),char(116),char(83),char(111),char(102),char(116),char(67),char(108),char(117),char(115),char(116),char(101),char(114),char(72),
-char(97),char(114),char(100),char(110),char(101),char(115),char(115),char(0),char(109),char(95),char(115),char(111),char(102),char(116),char(82),char(105),char(103),char(105),char(100),char(67),
-char(108),char(117),char(115),char(116),char(101),char(114),char(73),char(109),char(112),char(117),char(108),char(115),char(101),char(83),char(112),char(108),char(105),char(116),char(0),char(109),
-char(95),char(115),char(111),char(102),char(116),char(75),char(105),char(110),char(101),char(116),char(105),char(99),char(67),char(108),char(117),char(115),char(116),char(101),char(114),char(73),
-char(109),char(112),char(117),char(108),char(115),char(101),char(83),char(112),char(108),char(105),char(116),char(0),char(109),char(95),char(115),char(111),char(102),char(116),char(83),char(111),
-char(102),char(116),char(67),char(108),char(117),char(115),char(116),char(101),char(114),char(73),char(109),char(112),char(117),char(108),char(115),char(101),char(83),char(112),char(108),char(105),
-char(116),char(0),char(109),char(95),char(109),char(97),char(120),char(86),char(111),char(108),char(117),char(109),char(101),char(0),char(109),char(95),char(116),char(105),char(109),char(101),
-char(83),char(99),char(97),char(108),char(101),char(0),char(109),char(95),char(118),char(101),char(108),char(111),char(99),char(105),char(116),char(121),char(73),char(116),char(101),char(114),
-char(97),char(116),char(105),char(111),char(110),char(115),char(0),char(109),char(95),char(112),char(111),char(115),char(105),char(116),char(105),char(111),char(110),char(73),char(116),char(101),
-char(114),char(97),char(116),char(105),char(111),char(110),char(115),char(0),char(109),char(95),char(100),char(114),char(105),char(102),char(116),char(73),char(116),char(101),char(114),char(97),
-char(116),char(105),char(111),char(110),char(115),char(0),char(109),char(95),char(99),char(108),char(117),char(115),char(116),char(101),char(114),char(73),char(116),char(101),char(114),char(97),
-char(116),char(105),char(111),char(110),char(115),char(0),char(109),char(95),char(114),char(111),char(116),char(0),char(109),char(95),char(115),char(99),char(97),char(108),char(101),char(0),
-char(109),char(95),char(97),char(113),char(113),char(0),char(109),char(95),char(99),char(111),char(109),char(0),char(42),char(109),char(95),char(112),char(111),char(115),char(105),char(116),
-char(105),char(111),char(110),char(115),char(0),char(42),char(109),char(95),char(119),char(101),char(105),char(103),char(104),char(116),char(115),char(0),char(109),char(95),char(110),char(117),
-char(109),char(80),char(111),char(115),char(105),char(116),char(105),char(111),char(110),char(115),char(0),char(109),char(95),char(110),char(117),char(109),char(87),char(101),char(105),char(103),
-char(116),char(115),char(0),char(109),char(95),char(98),char(118),char(111),char(108),char(117),char(109),char(101),char(0),char(109),char(95),char(98),char(102),char(114),char(97),char(109),
-char(101),char(0),char(109),char(95),char(102),char(114),char(97),char(109),char(101),char(120),char(102),char(111),char(114),char(109),char(0),char(109),char(95),char(108),char(111),char(99),
-char(105),char(105),char(0),char(109),char(95),char(105),char(110),char(118),char(119),char(105),char(0),char(109),char(95),char(118),char(105),char(109),char(112),char(117),char(108),char(115),
-char(101),char(115),char(91),char(50),char(93),char(0),char(109),char(95),char(100),char(105),char(109),char(112),char(117),char(108),char(115),char(101),char(115),char(91),char(50),char(93),
-char(0),char(109),char(95),char(108),char(118),char(0),char(109),char(95),char(97),char(118),char(0),char(42),char(109),char(95),char(102),char(114),char(97),char(109),char(101),char(114),
-char(101),char(102),char(115),char(0),char(42),char(109),char(95),char(110),char(111),char(100),char(101),char(73),char(110),char(100),char(105),char(99),char(101),char(115),char(0),char(42),
-char(109),char(95),char(109),char(97),char(115),char(115),char(101),char(115),char(0),char(109),char(95),char(110),char(117),char(109),char(70),char(114),char(97),char(109),char(101),char(82),
-char(101),char(102),char(115),char(0),char(109),char(95),char(110),char(117),char(109),char(78),char(111),char(100),char(101),char(115),char(0),char(109),char(95),char(110),char(117),char(109),
-char(77),char(97),char(115),char(115),char(101),char(115),char(0),char(109),char(95),char(105),char(100),char(109),char(97),char(115),char(115),char(0),char(109),char(95),char(105),char(109),
-char(97),char(115),char(115),char(0),char(109),char(95),char(110),char(118),char(105),char(109),char(112),char(117),char(108),char(115),char(101),char(115),char(0),char(109),char(95),char(110),
-char(100),char(105),char(109),char(112),char(117),char(108),char(115),char(101),char(115),char(0),char(109),char(95),char(110),char(100),char(97),char(109),char(112),char(105),char(110),char(103),
-char(0),char(109),char(95),char(108),char(100),char(97),char(109),char(112),char(105),char(110),char(103),char(0),char(109),char(95),char(97),char(100),char(97),char(109),char(112),char(105),
-char(110),char(103),char(0),char(109),char(95),char(109),char(97),char(116),char(99),char(104),char(105),char(110),char(103),char(0),char(109),char(95),char(109),char(97),char(120),char(83),
-char(101),char(108),char(102),char(67),char(111),char(108),char(108),char(105),char(115),char(105),char(111),char(110),char(73),char(109),char(112),char(117),char(108),char(115),char(101),char(0),
-char(109),char(95),char(115),char(101),char(108),char(102),char(67),char(111),char(108),char(108),char(105),char(115),char(105),char(111),char(110),char(73),char(109),char(112),char(117),char(108),
-char(115),char(101),char(70),char(97),char(99),char(116),char(111),char(114),char(0),char(109),char(95),char(99),char(111),char(110),char(116),char(97),char(105),char(110),char(115),char(65),
-char(110),char(99),char(104),char(111),char(114),char(0),char(109),char(95),char(99),char(111),char(108),char(108),char(105),char(100),char(101),char(0),char(109),char(95),char(99),char(108),
-char(117),char(115),char(116),char(101),char(114),char(73),char(110),char(100),char(101),char(120),char(0),char(42),char(109),char(95),char(98),char(111),char(100),char(121),char(65),char(0),
-char(42),char(109),char(95),char(98),char(111),char(100),char(121),char(66),char(0),char(109),char(95),char(114),char(101),char(102),char(115),char(91),char(50),char(93),char(0),char(109),
-char(95),char(99),char(102),char(109),char(0),char(109),char(95),char(115),char(112),char(108),char(105),char(116),char(0),char(109),char(95),char(100),char(101),char(108),char(101),char(116),
-char(101),char(0),char(109),char(95),char(114),char(101),char(108),char(80),char(111),char(115),char(105),char(116),char(105),char(111),char(110),char(91),char(50),char(93),char(0),char(109),
-char(95),char(98),char(111),char(100),char(121),char(65),char(116),char(121),char(112),char(101),char(0),char(109),char(95),char(98),char(111),char(100),char(121),char(66),char(116),char(121),
-char(112),char(101),char(0),char(109),char(95),char(106),char(111),char(105),char(110),char(116),char(84),char(121),char(112),char(101),char(0),char(42),char(109),char(95),char(112),char(111),
-char(115),char(101),char(0),char(42),char(42),char(109),char(95),char(109),char(97),char(116),char(101),char(114),char(105),char(97),char(108),char(115),char(0),char(42),char(109),char(95),
-char(110),char(111),char(100),char(101),char(115),char(0),char(42),char(109),char(95),char(108),char(105),char(110),char(107),char(115),char(0),char(42),char(109),char(95),char(102),char(97),
-char(99),char(101),char(115),char(0),char(42),char(109),char(95),char(116),char(101),char(116),char(114),char(97),char(104),char(101),char(100),char(114),char(97),char(0),char(42),char(109),
-char(95),char(97),char(110),char(99),char(104),char(111),char(114),char(115),char(0),char(42),char(109),char(95),char(99),char(108),char(117),char(115),char(116),char(101),char(114),char(115),
-char(0),char(42),char(109),char(95),char(106),char(111),char(105),char(110),char(116),char(115),char(0),char(109),char(95),char(110),char(117),char(109),char(77),char(97),char(116),char(101),
-char(114),char(105),char(97),char(108),char(115),char(0),char(109),char(95),char(110),char(117),char(109),char(76),char(105),char(110),char(107),char(115),char(0),char(109),char(95),char(110),
-char(117),char(109),char(70),char(97),char(99),char(101),char(115),char(0),char(109),char(95),char(110),char(117),char(109),char(84),char(101),char(116),char(114),char(97),char(104),char(101),
-char(100),char(114),char(97),char(0),char(109),char(95),char(110),char(117),char(109),char(65),char(110),char(99),char(104),char(111),char(114),char(115),char(0),char(109),char(95),char(110),
-char(117),char(109),char(67),char(108),char(117),char(115),char(116),char(101),char(114),char(115),char(0),char(109),char(95),char(110),char(117),char(109),char(74),char(111),char(105),char(110),
-char(116),char(115),char(0),char(109),char(95),char(99),char(111),char(110),char(102),char(105),char(103),char(0),char(84),char(89),char(80),char(69),char(76),char(0),char(0),char(0),
-char(99),char(104),char(97),char(114),char(0),char(117),char(99),char(104),char(97),char(114),char(0),char(115),char(104),char(111),char(114),char(116),char(0),char(117),char(115),char(104),
-char(111),char(114),char(116),char(0),char(105),char(110),char(116),char(0),char(108),char(111),char(110),char(103),char(0),char(117),char(108),char(111),char(110),char(103),char(0),char(102),
-char(108),char(111),char(97),char(116),char(0),char(100),char(111),char(117),char(98),char(108),char(101),char(0),char(118),char(111),char(105),char(100),char(0),char(80),char(111),char(105),
-char(110),char(116),char(101),char(114),char(65),char(114),char(114),char(97),char(121),char(0),char(98),char(116),char(80),char(104),char(121),char(115),char(105),char(99),char(115),char(83),
-char(121),char(115),char(116),char(101),char(109),char(0),char(76),char(105),char(115),char(116),char(66),char(97),char(115),char(101),char(0),char(98),char(116),char(86),char(101),char(99),
-char(116),char(111),char(114),char(51),char(70),char(108),char(111),char(97),char(116),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(86),char(101),char(99),char(116),
-char(111),char(114),char(51),char(68),char(111),char(117),char(98),char(108),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(77),char(97),char(116),char(114),
-char(105),char(120),char(51),char(120),char(51),char(70),char(108),char(111),char(97),char(116),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(77),char(97),char(116),
-char(114),char(105),char(120),char(51),char(120),char(51),char(68),char(111),char(117),char(98),char(108),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(84),
-char(114),char(97),char(110),char(115),char(102),char(111),char(114),char(109),char(70),char(108),char(111),char(97),char(116),char(68),char(97),char(116),char(97),char(0),char(98),char(116),
-char(84),char(114),char(97),char(110),char(115),char(102),char(111),char(114),char(109),char(68),char(111),char(117),char(98),char(108),char(101),char(68),char(97),char(116),char(97),char(0),
-char(98),char(116),char(66),char(118),char(104),char(83),char(117),char(98),char(116),char(114),char(101),char(101),char(73),char(110),char(102),char(111),char(68),char(97),char(116),char(97),
-char(0),char(98),char(116),char(79),char(112),char(116),char(105),char(109),char(105),char(122),char(101),char(100),char(66),char(118),char(104),char(78),char(111),char(100),char(101),char(70),
-char(108),char(111),char(97),char(116),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(79),char(112),char(116),char(105),char(109),char(105),char(122),char(101),char(100),
-char(66),char(118),char(104),char(78),char(111),char(100),char(101),char(68),char(111),char(117),char(98),char(108),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),
-char(81),char(117),char(97),char(110),char(116),char(105),char(122),char(101),char(100),char(66),char(118),char(104),char(78),char(111),char(100),char(101),char(68),char(97),char(116),char(97),
-char(0),char(98),char(116),char(81),char(117),char(97),char(110),char(116),char(105),char(122),char(101),char(100),char(66),char(118),char(104),char(70),char(108),char(111),char(97),char(116),
-char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(81),char(117),char(97),char(110),char(116),char(105),char(122),char(101),char(100),char(66),char(118),char(104),char(68),
-char(111),char(117),char(98),char(108),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(67),char(111),char(108),char(108),char(105),char(115),char(105),char(111),
-char(110),char(83),char(104),char(97),char(112),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(83),char(116),char(97),char(116),char(105),char(99),char(80),
-char(108),char(97),char(110),char(101),char(83),char(104),char(97),char(112),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(67),char(111),char(110),char(118),
-char(101),char(120),char(73),char(110),char(116),char(101),char(114),char(110),char(97),char(108),char(83),char(104),char(97),char(112),char(101),char(68),char(97),char(116),char(97),char(0),
-char(98),char(116),char(80),char(111),char(115),char(105),char(116),char(105),char(111),char(110),char(65),char(110),char(100),char(82),char(97),char(100),char(105),char(117),char(115),char(0),
-char(98),char(116),char(77),char(117),char(108),char(116),char(105),char(83),char(112),char(104),char(101),char(114),char(101),char(83),char(104),char(97),char(112),char(101),char(68),char(97),
-char(116),char(97),char(0),char(98),char(116),char(73),char(110),char(116),char(73),char(110),char(100),char(101),char(120),char(68),char(97),char(116),char(97),char(0),char(98),char(116),
-char(83),char(104),char(111),char(114),char(116),char(73),char(110),char(116),char(73),char(110),char(100),char(101),char(120),char(68),char(97),char(116),char(97),char(0),char(98),char(116),
-char(83),char(104),char(111),char(114),char(116),char(73),char(110),char(116),char(73),char(110),char(100),char(101),char(120),char(84),char(114),char(105),char(112),char(108),char(101),char(116),
-char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(67),char(104),char(97),char(114),char(73),char(110),char(100),char(101),char(120),char(84),char(114),char(105),char(112),
-char(108),char(101),char(116),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(77),char(101),char(115),char(104),char(80),char(97),char(114),char(116),char(68),char(97),
-char(116),char(97),char(0),char(98),char(116),char(83),char(116),char(114),char(105),char(100),char(105),char(110),char(103),char(77),char(101),char(115),char(104),char(73),char(110),char(116),
-char(101),char(114),char(102),char(97),char(99),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(84),char(114),char(105),char(97),char(110),char(103),char(108),
-char(101),char(77),char(101),char(115),char(104),char(83),char(104),char(97),char(112),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(84),char(114),char(105),
-char(97),char(110),char(103),char(108),char(101),char(73),char(110),char(102),char(111),char(77),char(97),char(112),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(83),
-char(99),char(97),char(108),char(101),char(100),char(84),char(114),char(105),char(97),char(110),char(103),char(108),char(101),char(77),char(101),char(115),char(104),char(83),char(104),char(97),
-char(112),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(67),char(111),char(109),char(112),char(111),char(117),char(110),char(100),char(83),char(104),char(97),
-char(112),char(101),char(67),char(104),char(105),char(108),char(100),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(67),char(111),char(109),char(112),char(111),char(117),
-char(110),char(100),char(83),char(104),char(97),char(112),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(67),char(121),char(108),char(105),char(110),char(100),
-char(101),char(114),char(83),char(104),char(97),char(112),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(67),char(97),char(112),char(115),char(117),char(108),
-char(101),char(83),char(104),char(97),char(112),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(84),char(114),char(105),char(97),char(110),char(103),char(108),
-char(101),char(73),char(110),char(102),char(111),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(71),char(73),char(109),char(112),char(97),char(99),char(116),char(77),
-char(101),char(115),char(104),char(83),char(104),char(97),char(112),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(67),char(111),char(110),char(118),char(101),
-char(120),char(72),char(117),char(108),char(108),char(83),char(104),char(97),char(112),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(67),char(111),char(108),
-char(108),char(105),char(115),char(105),char(111),char(110),char(79),char(98),char(106),char(101),char(99),char(116),char(68),char(111),char(117),char(98),char(108),char(101),char(68),char(97),
-char(116),char(97),char(0),char(98),char(116),char(67),char(111),char(108),char(108),char(105),char(115),char(105),char(111),char(110),char(79),char(98),char(106),char(101),char(99),char(116),
-char(70),char(108),char(111),char(97),char(116),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(68),char(121),char(110),char(97),char(109),char(105),char(99),char(115),
-char(87),char(111),char(114),char(108),char(100),char(68),char(111),char(117),char(98),char(108),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(67),char(111),
-char(110),char(116),char(97),char(99),char(116),char(83),char(111),char(108),char(118),char(101),char(114),char(73),char(110),char(102),char(111),char(68),char(111),char(117),char(98),char(108),
-char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(68),char(121),char(110),char(97),char(109),char(105),char(99),char(115),char(87),char(111),char(114),char(108),
-char(100),char(70),char(108),char(111),char(97),char(116),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(67),char(111),char(110),char(116),char(97),char(99),char(116),
-char(83),char(111),char(108),char(118),char(101),char(114),char(73),char(110),char(102),char(111),char(70),char(108),char(111),char(97),char(116),char(68),char(97),char(116),char(97),char(0),
-char(98),char(116),char(82),char(105),char(103),char(105),char(100),char(66),char(111),char(100),char(121),char(70),char(108),char(111),char(97),char(116),char(68),char(97),char(116),char(97),
-char(0),char(98),char(116),char(82),char(105),char(103),char(105),char(100),char(66),char(111),char(100),char(121),char(68),char(111),char(117),char(98),char(108),char(101),char(68),char(97),
-char(116),char(97),char(0),char(98),char(116),char(67),char(111),char(110),char(115),char(116),char(114),char(97),char(105),char(110),char(116),char(73),char(110),char(102),char(111),char(49),
-char(0),char(98),char(116),char(84),char(121),char(112),char(101),char(100),char(67),char(111),char(110),char(115),char(116),char(114),char(97),char(105),char(110),char(116),char(68),char(97),
-char(116),char(97),char(0),char(98),char(116),char(82),char(105),char(103),char(105),char(100),char(66),char(111),char(100),char(121),char(68),char(97),char(116),char(97),char(0),char(98),
-char(116),char(80),char(111),char(105),char(110),char(116),char(50),char(80),char(111),char(105),char(110),char(116),char(67),char(111),char(110),char(115),char(116),char(114),char(97),char(105),
-char(110),char(116),char(70),char(108),char(111),char(97),char(116),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(80),char(111),char(105),char(110),char(116),char(50),
-char(80),char(111),char(105),char(110),char(116),char(67),char(111),char(110),char(115),char(116),char(114),char(97),char(105),char(110),char(116),char(68),char(111),char(117),char(98),char(108),
-char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(72),char(105),char(110),char(103),char(101),char(67),char(111),char(110),char(115),char(116),char(114),char(97),
-char(105),char(110),char(116),char(68),char(111),char(117),char(98),char(108),char(101),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(72),char(105),char(110),char(103),
-char(101),char(67),char(111),char(110),char(115),char(116),char(114),char(97),char(105),char(110),char(116),char(70),char(108),char(111),char(97),char(116),char(68),char(97),char(116),char(97),
-char(0),char(98),char(116),char(67),char(111),char(110),char(101),char(84),char(119),char(105),char(115),char(116),char(67),char(111),char(110),char(115),char(116),char(114),char(97),char(105),
-char(110),char(116),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(71),char(101),char(110),char(101),char(114),char(105),char(99),char(54),char(68),char(111),char(102),
-char(67),char(111),char(110),char(115),char(116),char(114),char(97),char(105),char(110),char(116),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(71),char(101),char(110),
-char(101),char(114),char(105),char(99),char(54),char(68),char(111),char(102),char(83),char(112),char(114),char(105),char(110),char(103),char(67),char(111),char(110),char(115),char(116),char(114),
-char(97),char(105),char(110),char(116),char(68),char(97),char(116),char(97),char(0),char(98),char(116),char(83),char(108),char(105),char(100),char(101),char(114),char(67),char(111),char(110),
-char(115),char(116),char(114),char(97),char(105),char(110),char(116),char(68),char(97),char(116),char(97),char(0),char(83),char(111),char(102),char(116),char(66),char(111),char(100),char(121),
-char(77),char(97),char(116),char(101),char(114),char(105),char(97),char(108),char(68),char(97),char(116),char(97),char(0),char(83),char(111),char(102),char(116),char(66),char(111),char(100),
-char(121),char(78),char(111),char(100),char(101),char(68),char(97),char(116),char(97),char(0),char(83),char(111),char(102),char(116),char(66),char(111),char(100),char(121),char(76),char(105),
-char(110),char(107),char(68),char(97),char(116),char(97),char(0),char(83),char(111),char(102),char(116),char(66),char(111),char(100),char(121),char(70),char(97),char(99),char(101),char(68),
-char(97),char(116),char(97),char(0),char(83),char(111),char(102),char(116),char(66),char(111),char(100),char(121),char(84),char(101),char(116),char(114),char(97),char(68),char(97),char(116),
-char(97),char(0),char(83),char(111),char(102),char(116),char(82),char(105),char(103),char(105),char(100),char(65),char(110),char(99),char(104),char(111),char(114),char(68),char(97),char(116),
-char(97),char(0),char(83),char(111),char(102),char(116),char(66),char(111),char(100),char(121),char(67),char(111),char(110),char(102),char(105),char(103),char(68),char(97),char(116),char(97),
-char(0),char(83),char(111),char(102),char(116),char(66),char(111),char(100),char(121),char(80),char(111),char(115),char(101),char(68),char(97),char(116),char(97),char(0),char(83),char(111),
-char(102),char(116),char(66),char(111),char(100),char(121),char(67),char(108),char(117),char(115),char(116),char(101),char(114),char(68),char(97),char(116),char(97),char(0),char(98),char(116),
-char(83),char(111),char(102),char(116),char(66),char(111),char(100),char(121),char(74),char(111),char(105),char(110),char(116),char(68),char(97),char(116),char(97),char(0),char(98),char(116),
-char(83),char(111),char(102),char(116),char(66),char(111),char(100),char(121),char(70),char(108),char(111),char(97),char(116),char(68),char(97),char(116),char(97),char(0),char(0),char(0),
-char(84),char(76),char(69),char(78),char(1),char(0),char(1),char(0),char(2),char(0),char(2),char(0),char(4),char(0),char(4),char(0),char(4),char(0),char(4),char(0),
-char(8),char(0),char(0),char(0),char(16),char(0),char(48),char(0),char(16),char(0),char(16),char(0),char(32),char(0),char(48),char(0),char(96),char(0),char(64),char(0),
-char(-128),char(0),char(20),char(0),char(48),char(0),char(80),char(0),char(16),char(0),char(96),char(0),char(-112),char(0),char(16),char(0),char(56),char(0),char(56),char(0),
-char(20),char(0),char(72),char(0),char(4),char(0),char(4),char(0),char(8),char(0),char(4),char(0),char(56),char(0),char(32),char(0),char(80),char(0),char(72),char(0),
-char(96),char(0),char(80),char(0),char(32),char(0),char(64),char(0),char(64),char(0),char(16),char(0),char(72),char(0),char(80),char(0),char(-32),char(1),char(16),char(1),
-char(-72),char(0),char(-104),char(0),char(104),char(0),char(88),char(0),char(-8),char(1),char(-80),char(3),char(8),char(0),char(64),char(0),char(0),char(0),char(96),char(0),
-char(-128),char(0),char(104),char(1),char(-24),char(0),char(-32),char(0),char(8),char(1),char(104),char(1),char(-40),char(0),char(16),char(0),char(104),char(0),char(24),char(0),
-char(40),char(0),char(104),char(0),char(96),char(0),char(104),char(0),char(-56),char(0),char(104),char(1),char(112),char(0),char(-32),char(1),char(83),char(84),char(82),char(67),
-char(65),char(0),char(0),char(0),char(10),char(0),char(3),char(0),char(4),char(0),char(0),char(0),char(4),char(0),char(1),char(0),char(9),char(0),char(2),char(0),
-char(11),char(0),char(3),char(0),char(10),char(0),char(3),char(0),char(10),char(0),char(4),char(0),char(10),char(0),char(5),char(0),char(12),char(0),char(2),char(0),
-char(9),char(0),char(6),char(0),char(9),char(0),char(7),char(0),char(13),char(0),char(1),char(0),char(7),char(0),char(8),char(0),char(14),char(0),char(1),char(0),
-char(8),char(0),char(8),char(0),char(15),char(0),char(1),char(0),char(13),char(0),char(9),char(0),char(16),char(0),char(1),char(0),char(14),char(0),char(9),char(0),
-char(17),char(0),char(2),char(0),char(15),char(0),char(10),char(0),char(13),char(0),char(11),char(0),char(18),char(0),char(2),char(0),char(16),char(0),char(10),char(0),
-char(14),char(0),char(11),char(0),char(19),char(0),char(4),char(0),char(4),char(0),char(12),char(0),char(4),char(0),char(13),char(0),char(2),char(0),char(14),char(0),
-char(2),char(0),char(15),char(0),char(20),char(0),char(6),char(0),char(13),char(0),char(16),char(0),char(13),char(0),char(17),char(0),char(4),char(0),char(18),char(0),
-char(4),char(0),char(19),char(0),char(4),char(0),char(20),char(0),char(0),char(0),char(21),char(0),char(21),char(0),char(6),char(0),char(14),char(0),char(16),char(0),
-char(14),char(0),char(17),char(0),char(4),char(0),char(18),char(0),char(4),char(0),char(19),char(0),char(4),char(0),char(20),char(0),char(0),char(0),char(21),char(0),
-char(22),char(0),char(3),char(0),char(2),char(0),char(14),char(0),char(2),char(0),char(15),char(0),char(4),char(0),char(22),char(0),char(23),char(0),char(12),char(0),
-char(13),char(0),char(23),char(0),char(13),char(0),char(24),char(0),char(13),char(0),char(25),char(0),char(4),char(0),char(26),char(0),char(4),char(0),char(27),char(0),
-char(4),char(0),char(28),char(0),char(4),char(0),char(29),char(0),char(20),char(0),char(30),char(0),char(22),char(0),char(31),char(0),char(19),char(0),char(32),char(0),
-char(4),char(0),char(33),char(0),char(4),char(0),char(34),char(0),char(24),char(0),char(12),char(0),char(14),char(0),char(23),char(0),char(14),char(0),char(24),char(0),
-char(14),char(0),char(25),char(0),char(4),char(0),char(26),char(0),char(4),char(0),char(27),char(0),char(4),char(0),char(28),char(0),char(4),char(0),char(29),char(0),
-char(21),char(0),char(30),char(0),char(22),char(0),char(31),char(0),char(4),char(0),char(33),char(0),char(4),char(0),char(34),char(0),char(19),char(0),char(32),char(0),
-char(25),char(0),char(3),char(0),char(0),char(0),char(35),char(0),char(4),char(0),char(36),char(0),char(0),char(0),char(37),char(0),char(26),char(0),char(5),char(0),
-char(25),char(0),char(38),char(0),char(13),char(0),char(39),char(0),char(13),char(0),char(40),char(0),char(7),char(0),char(41),char(0),char(0),char(0),char(21),char(0),
-char(27),char(0),char(5),char(0),char(25),char(0),char(38),char(0),char(13),char(0),char(39),char(0),char(13),char(0),char(42),char(0),char(7),char(0),char(43),char(0),
-char(4),char(0),char(44),char(0),char(28),char(0),char(2),char(0),char(13),char(0),char(45),char(0),char(7),char(0),char(46),char(0),char(29),char(0),char(4),char(0),
-char(27),char(0),char(47),char(0),char(28),char(0),char(48),char(0),char(4),char(0),char(49),char(0),char(0),char(0),char(37),char(0),char(30),char(0),char(1),char(0),
-char(4),char(0),char(50),char(0),char(31),char(0),char(2),char(0),char(2),char(0),char(50),char(0),char(0),char(0),char(51),char(0),char(32),char(0),char(2),char(0),
-char(2),char(0),char(52),char(0),char(0),char(0),char(51),char(0),char(33),char(0),char(2),char(0),char(0),char(0),char(52),char(0),char(0),char(0),char(53),char(0),
-char(34),char(0),char(8),char(0),char(13),char(0),char(54),char(0),char(14),char(0),char(55),char(0),char(30),char(0),char(56),char(0),char(32),char(0),char(57),char(0),
-char(33),char(0),char(58),char(0),char(31),char(0),char(59),char(0),char(4),char(0),char(60),char(0),char(4),char(0),char(61),char(0),char(35),char(0),char(4),char(0),
-char(34),char(0),char(62),char(0),char(13),char(0),char(63),char(0),char(4),char(0),char(64),char(0),char(0),char(0),char(37),char(0),char(36),char(0),char(7),char(0),
-char(25),char(0),char(38),char(0),char(35),char(0),char(65),char(0),char(23),char(0),char(66),char(0),char(24),char(0),char(67),char(0),char(37),char(0),char(68),char(0),
-char(7),char(0),char(43),char(0),char(0),char(0),char(69),char(0),char(38),char(0),char(2),char(0),char(36),char(0),char(70),char(0),char(13),char(0),char(39),char(0),
-char(39),char(0),char(4),char(0),char(17),char(0),char(71),char(0),char(25),char(0),char(72),char(0),char(4),char(0),char(73),char(0),char(7),char(0),char(74),char(0),
-char(40),char(0),char(4),char(0),char(25),char(0),char(38),char(0),char(39),char(0),char(75),char(0),char(4),char(0),char(76),char(0),char(7),char(0),char(43),char(0),
-char(41),char(0),char(3),char(0),char(27),char(0),char(47),char(0),char(4),char(0),char(77),char(0),char(0),char(0),char(37),char(0),char(42),char(0),char(3),char(0),
-char(27),char(0),char(47),char(0),char(4),char(0),char(77),char(0),char(0),char(0),char(37),char(0),char(43),char(0),char(4),char(0),char(4),char(0),char(78),char(0),
-char(7),char(0),char(79),char(0),char(7),char(0),char(80),char(0),char(7),char(0),char(81),char(0),char(37),char(0),char(14),char(0),char(4),char(0),char(82),char(0),
-char(4),char(0),char(83),char(0),char(43),char(0),char(84),char(0),char(4),char(0),char(85),char(0),char(7),char(0),char(86),char(0),char(7),char(0),char(87),char(0),
-char(7),char(0),char(88),char(0),char(7),char(0),char(89),char(0),char(7),char(0),char(90),char(0),char(4),char(0),char(91),char(0),char(4),char(0),char(92),char(0),
-char(4),char(0),char(93),char(0),char(4),char(0),char(94),char(0),char(0),char(0),char(37),char(0),char(44),char(0),char(5),char(0),char(25),char(0),char(38),char(0),
-char(35),char(0),char(65),char(0),char(13),char(0),char(39),char(0),char(7),char(0),char(43),char(0),char(4),char(0),char(95),char(0),char(45),char(0),char(5),char(0),
-char(27),char(0),char(47),char(0),char(13),char(0),char(96),char(0),char(14),char(0),char(97),char(0),char(4),char(0),char(98),char(0),char(0),char(0),char(99),char(0),
-char(46),char(0),char(25),char(0),char(9),char(0),char(100),char(0),char(9),char(0),char(101),char(0),char(25),char(0),char(102),char(0),char(0),char(0),char(35),char(0),
-char(18),char(0),char(103),char(0),char(18),char(0),char(104),char(0),char(14),char(0),char(105),char(0),char(14),char(0),char(106),char(0),char(14),char(0),char(107),char(0),
-char(8),char(0),char(108),char(0),char(8),char(0),char(109),char(0),char(8),char(0),char(110),char(0),char(8),char(0),char(111),char(0),char(8),char(0),char(112),char(0),
-char(8),char(0),char(113),char(0),char(8),char(0),char(114),char(0),char(8),char(0),char(115),char(0),char(4),char(0),char(116),char(0),char(4),char(0),char(117),char(0),
-char(4),char(0),char(118),char(0),char(4),char(0),char(119),char(0),char(4),char(0),char(120),char(0),char(4),char(0),char(121),char(0),char(4),char(0),char(122),char(0),
-char(0),char(0),char(37),char(0),char(47),char(0),char(25),char(0),char(9),char(0),char(100),char(0),char(9),char(0),char(101),char(0),char(25),char(0),char(102),char(0),
-char(0),char(0),char(35),char(0),char(17),char(0),char(103),char(0),char(17),char(0),char(104),char(0),char(13),char(0),char(105),char(0),char(13),char(0),char(106),char(0),
-char(13),char(0),char(107),char(0),char(7),char(0),char(108),char(0),char(7),char(0),char(109),char(0),char(7),char(0),char(110),char(0),char(7),char(0),char(111),char(0),
-char(7),char(0),char(112),char(0),char(7),char(0),char(113),char(0),char(7),char(0),char(114),char(0),char(7),char(0),char(115),char(0),char(4),char(0),char(116),char(0),
-char(4),char(0),char(117),char(0),char(4),char(0),char(118),char(0),char(4),char(0),char(119),char(0),char(4),char(0),char(120),char(0),char(4),char(0),char(121),char(0),
-char(4),char(0),char(122),char(0),char(0),char(0),char(37),char(0),char(48),char(0),char(2),char(0),char(49),char(0),char(123),char(0),char(14),char(0),char(124),char(0),
-char(50),char(0),char(2),char(0),char(51),char(0),char(123),char(0),char(13),char(0),char(124),char(0),char(52),char(0),char(21),char(0),char(47),char(0),char(125),char(0),
-char(15),char(0),char(126),char(0),char(13),char(0),char(127),char(0),char(13),char(0),char(-128),char(0),char(13),char(0),char(-127),char(0),char(13),char(0),char(-126),char(0),
-char(13),char(0),char(124),char(0),char(13),char(0),char(-125),char(0),char(13),char(0),char(-124),char(0),char(13),char(0),char(-123),char(0),char(13),char(0),char(-122),char(0),
-char(7),char(0),char(-121),char(0),char(7),char(0),char(-120),char(0),char(7),char(0),char(-119),char(0),char(7),char(0),char(-118),char(0),char(7),char(0),char(-117),char(0),
-char(7),char(0),char(-116),char(0),char(7),char(0),char(-115),char(0),char(7),char(0),char(-114),char(0),char(7),char(0),char(-113),char(0),char(4),char(0),char(-112),char(0),
-char(53),char(0),char(22),char(0),char(46),char(0),char(125),char(0),char(16),char(0),char(126),char(0),char(14),char(0),char(127),char(0),char(14),char(0),char(-128),char(0),
-char(14),char(0),char(-127),char(0),char(14),char(0),char(-126),char(0),char(14),char(0),char(124),char(0),char(14),char(0),char(-125),char(0),char(14),char(0),char(-124),char(0),
-char(14),char(0),char(-123),char(0),char(14),char(0),char(-122),char(0),char(8),char(0),char(-121),char(0),char(8),char(0),char(-120),char(0),char(8),char(0),char(-119),char(0),
-char(8),char(0),char(-118),char(0),char(8),char(0),char(-117),char(0),char(8),char(0),char(-116),char(0),char(8),char(0),char(-115),char(0),char(8),char(0),char(-114),char(0),
-char(8),char(0),char(-113),char(0),char(4),char(0),char(-112),char(0),char(0),char(0),char(37),char(0),char(54),char(0),char(2),char(0),char(4),char(0),char(-111),char(0),
-char(4),char(0),char(-110),char(0),char(55),char(0),char(13),char(0),char(56),char(0),char(-109),char(0),char(56),char(0),char(-108),char(0),char(0),char(0),char(35),char(0),
-char(4),char(0),char(-107),char(0),char(4),char(0),char(-106),char(0),char(4),char(0),char(-105),char(0),char(4),char(0),char(-104),char(0),char(7),char(0),char(-103),char(0),
-char(7),char(0),char(-102),char(0),char(4),char(0),char(-101),char(0),char(4),char(0),char(-100),char(0),char(7),char(0),char(-99),char(0),char(4),char(0),char(-98),char(0),
-char(57),char(0),char(3),char(0),char(55),char(0),char(-97),char(0),char(13),char(0),char(-96),char(0),char(13),char(0),char(-95),char(0),char(58),char(0),char(3),char(0),
-char(55),char(0),char(-97),char(0),char(14),char(0),char(-96),char(0),char(14),char(0),char(-95),char(0),char(59),char(0),char(13),char(0),char(55),char(0),char(-97),char(0),
-char(18),char(0),char(-94),char(0),char(18),char(0),char(-93),char(0),char(4),char(0),char(-92),char(0),char(4),char(0),char(-91),char(0),char(4),char(0),char(-90),char(0),
-char(7),char(0),char(-89),char(0),char(7),char(0),char(-88),char(0),char(7),char(0),char(-87),char(0),char(7),char(0),char(-86),char(0),char(7),char(0),char(-85),char(0),
-char(7),char(0),char(-84),char(0),char(7),char(0),char(-83),char(0),char(60),char(0),char(13),char(0),char(55),char(0),char(-97),char(0),char(17),char(0),char(-94),char(0),
-char(17),char(0),char(-93),char(0),char(4),char(0),char(-92),char(0),char(4),char(0),char(-91),char(0),char(4),char(0),char(-90),char(0),char(7),char(0),char(-89),char(0),
-char(7),char(0),char(-88),char(0),char(7),char(0),char(-87),char(0),char(7),char(0),char(-86),char(0),char(7),char(0),char(-85),char(0),char(7),char(0),char(-84),char(0),
-char(7),char(0),char(-83),char(0),char(61),char(0),char(11),char(0),char(55),char(0),char(-97),char(0),char(17),char(0),char(-94),char(0),char(17),char(0),char(-93),char(0),
-char(7),char(0),char(-82),char(0),char(7),char(0),char(-81),char(0),char(7),char(0),char(-80),char(0),char(7),char(0),char(-85),char(0),char(7),char(0),char(-84),char(0),
-char(7),char(0),char(-83),char(0),char(7),char(0),char(-79),char(0),char(0),char(0),char(21),char(0),char(62),char(0),char(9),char(0),char(55),char(0),char(-97),char(0),
-char(17),char(0),char(-94),char(0),char(17),char(0),char(-93),char(0),char(13),char(0),char(-78),char(0),char(13),char(0),char(-77),char(0),char(13),char(0),char(-76),char(0),
-char(13),char(0),char(-75),char(0),char(4),char(0),char(-74),char(0),char(4),char(0),char(-73),char(0),char(63),char(0),char(5),char(0),char(62),char(0),char(-72),char(0),
-char(4),char(0),char(-71),char(0),char(7),char(0),char(-70),char(0),char(7),char(0),char(-69),char(0),char(7),char(0),char(-68),char(0),char(64),char(0),char(9),char(0),
-char(55),char(0),char(-97),char(0),char(17),char(0),char(-94),char(0),char(17),char(0),char(-93),char(0),char(7),char(0),char(-78),char(0),char(7),char(0),char(-77),char(0),
-char(7),char(0),char(-76),char(0),char(7),char(0),char(-75),char(0),char(4),char(0),char(-74),char(0),char(4),char(0),char(-73),char(0),char(49),char(0),char(22),char(0),
-char(8),char(0),char(-67),char(0),char(8),char(0),char(-79),char(0),char(8),char(0),char(110),char(0),char(8),char(0),char(-66),char(0),char(8),char(0),char(112),char(0),
-char(8),char(0),char(-65),char(0),char(8),char(0),char(-64),char(0),char(8),char(0),char(-63),char(0),char(8),char(0),char(-62),char(0),char(8),char(0),char(-61),char(0),
-char(8),char(0),char(-60),char(0),char(8),char(0),char(-59),char(0),char(8),char(0),char(-58),char(0),char(8),char(0),char(-57),char(0),char(8),char(0),char(-56),char(0),
-char(8),char(0),char(-55),char(0),char(4),char(0),char(-54),char(0),char(4),char(0),char(-53),char(0),char(4),char(0),char(-52),char(0),char(4),char(0),char(-51),char(0),
-char(4),char(0),char(-50),char(0),char(0),char(0),char(37),char(0),char(51),char(0),char(22),char(0),char(7),char(0),char(-67),char(0),char(7),char(0),char(-79),char(0),
-char(7),char(0),char(110),char(0),char(7),char(0),char(-66),char(0),char(7),char(0),char(112),char(0),char(7),char(0),char(-65),char(0),char(7),char(0),char(-64),char(0),
-char(7),char(0),char(-63),char(0),char(7),char(0),char(-62),char(0),char(7),char(0),char(-61),char(0),char(7),char(0),char(-60),char(0),char(7),char(0),char(-59),char(0),
-char(7),char(0),char(-58),char(0),char(7),char(0),char(-57),char(0),char(7),char(0),char(-56),char(0),char(7),char(0),char(-55),char(0),char(4),char(0),char(-54),char(0),
-char(4),char(0),char(-53),char(0),char(4),char(0),char(-52),char(0),char(4),char(0),char(-51),char(0),char(4),char(0),char(-50),char(0),char(0),char(0),char(37),char(0),
-char(65),char(0),char(4),char(0),char(7),char(0),char(-49),char(0),char(7),char(0),char(-48),char(0),char(7),char(0),char(-47),char(0),char(4),char(0),char(78),char(0),
-char(66),char(0),char(10),char(0),char(65),char(0),char(-46),char(0),char(13),char(0),char(-45),char(0),char(13),char(0),char(-44),char(0),char(13),char(0),char(-43),char(0),
-char(13),char(0),char(-42),char(0),char(13),char(0),char(-41),char(0),char(7),char(0),char(-121),char(0),char(7),char(0),char(-40),char(0),char(4),char(0),char(-39),char(0),
-char(4),char(0),char(53),char(0),char(67),char(0),char(4),char(0),char(65),char(0),char(-46),char(0),char(4),char(0),char(-38),char(0),char(7),char(0),char(-37),char(0),
-char(4),char(0),char(-36),char(0),char(68),char(0),char(4),char(0),char(13),char(0),char(-41),char(0),char(65),char(0),char(-46),char(0),char(4),char(0),char(-35),char(0),
-char(7),char(0),char(-34),char(0),char(69),char(0),char(7),char(0),char(13),char(0),char(-33),char(0),char(65),char(0),char(-46),char(0),char(4),char(0),char(-32),char(0),
-char(7),char(0),char(-31),char(0),char(7),char(0),char(-30),char(0),char(7),char(0),char(-29),char(0),char(4),char(0),char(53),char(0),char(70),char(0),char(6),char(0),
-char(15),char(0),char(-28),char(0),char(13),char(0),char(-30),char(0),char(13),char(0),char(-27),char(0),char(56),char(0),char(-26),char(0),char(4),char(0),char(-25),char(0),
-char(7),char(0),char(-29),char(0),char(71),char(0),char(26),char(0),char(4),char(0),char(-24),char(0),char(7),char(0),char(-23),char(0),char(7),char(0),char(-79),char(0),
-char(7),char(0),char(-22),char(0),char(7),char(0),char(-21),char(0),char(7),char(0),char(-20),char(0),char(7),char(0),char(-19),char(0),char(7),char(0),char(-18),char(0),
-char(7),char(0),char(-17),char(0),char(7),char(0),char(-16),char(0),char(7),char(0),char(-15),char(0),char(7),char(0),char(-14),char(0),char(7),char(0),char(-13),char(0),
-char(7),char(0),char(-12),char(0),char(7),char(0),char(-11),char(0),char(7),char(0),char(-10),char(0),char(7),char(0),char(-9),char(0),char(7),char(0),char(-8),char(0),
-char(7),char(0),char(-7),char(0),char(7),char(0),char(-6),char(0),char(7),char(0),char(-5),char(0),char(4),char(0),char(-4),char(0),char(4),char(0),char(-3),char(0),
-char(4),char(0),char(-2),char(0),char(4),char(0),char(-1),char(0),char(4),char(0),char(117),char(0),char(72),char(0),char(12),char(0),char(15),char(0),char(0),char(1),
-char(15),char(0),char(1),char(1),char(15),char(0),char(2),char(1),char(13),char(0),char(3),char(1),char(13),char(0),char(4),char(1),char(7),char(0),char(5),char(1),
-char(4),char(0),char(6),char(1),char(4),char(0),char(7),char(1),char(4),char(0),char(8),char(1),char(4),char(0),char(9),char(1),char(7),char(0),char(-31),char(0),
-char(4),char(0),char(53),char(0),char(73),char(0),char(27),char(0),char(17),char(0),char(10),char(1),char(15),char(0),char(11),char(1),char(15),char(0),char(12),char(1),
-char(13),char(0),char(3),char(1),char(13),char(0),char(13),char(1),char(13),char(0),char(14),char(1),char(13),char(0),char(15),char(1),char(13),char(0),char(16),char(1),
-char(13),char(0),char(17),char(1),char(4),char(0),char(18),char(1),char(7),char(0),char(19),char(1),char(4),char(0),char(20),char(1),char(4),char(0),char(21),char(1),
-char(4),char(0),char(22),char(1),char(7),char(0),char(23),char(1),char(7),char(0),char(24),char(1),char(4),char(0),char(25),char(1),char(4),char(0),char(26),char(1),
-char(7),char(0),char(27),char(1),char(7),char(0),char(28),char(1),char(7),char(0),char(29),char(1),char(7),char(0),char(30),char(1),char(7),char(0),char(31),char(1),
-char(7),char(0),char(32),char(1),char(4),char(0),char(33),char(1),char(4),char(0),char(34),char(1),char(4),char(0),char(35),char(1),char(74),char(0),char(12),char(0),
-char(9),char(0),char(36),char(1),char(9),char(0),char(37),char(1),char(13),char(0),char(38),char(1),char(7),char(0),char(39),char(1),char(7),char(0),char(-63),char(0),
-char(7),char(0),char(40),char(1),char(4),char(0),char(41),char(1),char(13),char(0),char(42),char(1),char(4),char(0),char(43),char(1),char(4),char(0),char(44),char(1),
-char(4),char(0),char(45),char(1),char(4),char(0),char(53),char(0),char(75),char(0),char(19),char(0),char(47),char(0),char(125),char(0),char(72),char(0),char(46),char(1),
-char(65),char(0),char(47),char(1),char(66),char(0),char(48),char(1),char(67),char(0),char(49),char(1),char(68),char(0),char(50),char(1),char(69),char(0),char(51),char(1),
-char(70),char(0),char(52),char(1),char(73),char(0),char(53),char(1),char(74),char(0),char(54),char(1),char(4),char(0),char(55),char(1),char(4),char(0),char(21),char(1),
-char(4),char(0),char(56),char(1),char(4),char(0),char(57),char(1),char(4),char(0),char(58),char(1),char(4),char(0),char(59),char(1),char(4),char(0),char(60),char(1),
-char(4),char(0),char(61),char(1),char(71),char(0),char(62),char(1),};
-int b3s_bulletDNAlen64= sizeof(b3s_bulletDNAstr64);
+char b3s_bulletDNAstr[] = {
+ char(83),
+ char(68),
+ char(78),
+ char(65),
+ char(78),
+ char(65),
+ char(77),
+ char(69),
+ char(63),
+ char(1),
+ char(0),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(105),
+ char(122),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(97),
+ char(112),
+ char(97),
+ char(99),
+ char(105),
+ char(116),
+ char(121),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(100),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(79),
+ char(98),
+ char(106),
+ char(101),
+ char(99),
+ char(116),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(115),
+ char(0),
+ char(42),
+ char(102),
+ char(105),
+ char(114),
+ char(115),
+ char(116),
+ char(0),
+ char(42),
+ char(108),
+ char(97),
+ char(115),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(102),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(115),
+ char(91),
+ char(52),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(101),
+ char(108),
+ char(91),
+ char(51),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(98),
+ char(97),
+ char(115),
+ char(105),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(111),
+ char(114),
+ char(105),
+ char(103),
+ char(105),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(111),
+ char(111),
+ char(116),
+ char(78),
+ char(111),
+ char(100),
+ char(101),
+ char(73),
+ char(110),
+ char(100),
+ char(101),
+ char(120),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(117),
+ char(98),
+ char(116),
+ char(114),
+ char(101),
+ char(101),
+ char(83),
+ char(105),
+ char(122),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(113),
+ char(117),
+ char(97),
+ char(110),
+ char(116),
+ char(105),
+ char(122),
+ char(101),
+ char(100),
+ char(65),
+ char(97),
+ char(98),
+ char(98),
+ char(77),
+ char(105),
+ char(110),
+ char(91),
+ char(51),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(113),
+ char(117),
+ char(97),
+ char(110),
+ char(116),
+ char(105),
+ char(122),
+ char(101),
+ char(100),
+ char(65),
+ char(97),
+ char(98),
+ char(98),
+ char(77),
+ char(97),
+ char(120),
+ char(91),
+ char(51),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(97),
+ char(98),
+ char(98),
+ char(77),
+ char(105),
+ char(110),
+ char(79),
+ char(114),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(97),
+ char(98),
+ char(98),
+ char(77),
+ char(97),
+ char(120),
+ char(79),
+ char(114),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(101),
+ char(115),
+ char(99),
+ char(97),
+ char(112),
+ char(101),
+ char(73),
+ char(110),
+ char(100),
+ char(101),
+ char(120),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(117),
+ char(98),
+ char(80),
+ char(97),
+ char(114),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(116),
+ char(114),
+ char(105),
+ char(97),
+ char(110),
+ char(103),
+ char(108),
+ char(101),
+ char(73),
+ char(110),
+ char(100),
+ char(101),
+ char(120),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(97),
+ char(100),
+ char(91),
+ char(52),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(101),
+ char(115),
+ char(99),
+ char(97),
+ char(112),
+ char(101),
+ char(73),
+ char(110),
+ char(100),
+ char(101),
+ char(120),
+ char(79),
+ char(114),
+ char(84),
+ char(114),
+ char(105),
+ char(97),
+ char(110),
+ char(103),
+ char(108),
+ char(101),
+ char(73),
+ char(110),
+ char(100),
+ char(101),
+ char(120),
+ char(0),
+ char(109),
+ char(95),
+ char(98),
+ char(118),
+ char(104),
+ char(65),
+ char(97),
+ char(98),
+ char(98),
+ char(77),
+ char(105),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(98),
+ char(118),
+ char(104),
+ char(65),
+ char(97),
+ char(98),
+ char(98),
+ char(77),
+ char(97),
+ char(120),
+ char(0),
+ char(109),
+ char(95),
+ char(98),
+ char(118),
+ char(104),
+ char(81),
+ char(117),
+ char(97),
+ char(110),
+ char(116),
+ char(105),
+ char(122),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(117),
+ char(114),
+ char(78),
+ char(111),
+ char(100),
+ char(101),
+ char(73),
+ char(110),
+ char(100),
+ char(101),
+ char(120),
+ char(0),
+ char(109),
+ char(95),
+ char(117),
+ char(115),
+ char(101),
+ char(81),
+ char(117),
+ char(97),
+ char(110),
+ char(116),
+ char(105),
+ char(122),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(67),
+ char(111),
+ char(110),
+ char(116),
+ char(105),
+ char(103),
+ char(117),
+ char(111),
+ char(117),
+ char(115),
+ char(76),
+ char(101),
+ char(97),
+ char(102),
+ char(78),
+ char(111),
+ char(100),
+ char(101),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(81),
+ char(117),
+ char(97),
+ char(110),
+ char(116),
+ char(105),
+ char(122),
+ char(101),
+ char(100),
+ char(67),
+ char(111),
+ char(110),
+ char(116),
+ char(105),
+ char(103),
+ char(117),
+ char(111),
+ char(117),
+ char(115),
+ char(78),
+ char(111),
+ char(100),
+ char(101),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(110),
+ char(116),
+ char(105),
+ char(103),
+ char(117),
+ char(111),
+ char(117),
+ char(115),
+ char(78),
+ char(111),
+ char(100),
+ char(101),
+ char(115),
+ char(80),
+ char(116),
+ char(114),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(113),
+ char(117),
+ char(97),
+ char(110),
+ char(116),
+ char(105),
+ char(122),
+ char(101),
+ char(100),
+ char(67),
+ char(111),
+ char(110),
+ char(116),
+ char(105),
+ char(103),
+ char(117),
+ char(111),
+ char(117),
+ char(115),
+ char(78),
+ char(111),
+ char(100),
+ char(101),
+ char(115),
+ char(80),
+ char(116),
+ char(114),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(115),
+ char(117),
+ char(98),
+ char(84),
+ char(114),
+ char(101),
+ char(101),
+ char(73),
+ char(110),
+ char(102),
+ char(111),
+ char(80),
+ char(116),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(116),
+ char(114),
+ char(97),
+ char(118),
+ char(101),
+ char(114),
+ char(115),
+ char(97),
+ char(108),
+ char(77),
+ char(111),
+ char(100),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(83),
+ char(117),
+ char(98),
+ char(116),
+ char(114),
+ char(101),
+ char(101),
+ char(72),
+ char(101),
+ char(97),
+ char(100),
+ char(101),
+ char(114),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(110),
+ char(97),
+ char(109),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(84),
+ char(121),
+ char(112),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(97),
+ char(100),
+ char(100),
+ char(105),
+ char(110),
+ char(103),
+ char(91),
+ char(52),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(111),
+ char(99),
+ char(97),
+ char(108),
+ char(83),
+ char(99),
+ char(97),
+ char(108),
+ char(105),
+ char(110),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(108),
+ char(97),
+ char(110),
+ char(101),
+ char(78),
+ char(111),
+ char(114),
+ char(109),
+ char(97),
+ char(108),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(108),
+ char(97),
+ char(110),
+ char(101),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(97),
+ char(110),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(109),
+ char(112),
+ char(108),
+ char(105),
+ char(99),
+ char(105),
+ char(116),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(105),
+ char(109),
+ char(101),
+ char(110),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(77),
+ char(97),
+ char(114),
+ char(103),
+ char(105),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(97),
+ char(100),
+ char(100),
+ char(105),
+ char(110),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(111),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(97),
+ char(100),
+ char(105),
+ char(117),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(110),
+ char(118),
+ char(101),
+ char(120),
+ char(73),
+ char(110),
+ char(116),
+ char(101),
+ char(114),
+ char(110),
+ char(97),
+ char(108),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(108),
+ char(111),
+ char(99),
+ char(97),
+ char(108),
+ char(80),
+ char(111),
+ char(115),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(65),
+ char(114),
+ char(114),
+ char(97),
+ char(121),
+ char(80),
+ char(116),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(111),
+ char(99),
+ char(97),
+ char(108),
+ char(80),
+ char(111),
+ char(115),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(65),
+ char(114),
+ char(114),
+ char(97),
+ char(121),
+ char(83),
+ char(105),
+ char(122),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(118),
+ char(97),
+ char(108),
+ char(117),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(97),
+ char(100),
+ char(91),
+ char(50),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(118),
+ char(97),
+ char(108),
+ char(117),
+ char(101),
+ char(115),
+ char(91),
+ char(51),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(97),
+ char(100),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(118),
+ char(101),
+ char(114),
+ char(116),
+ char(105),
+ char(99),
+ char(101),
+ char(115),
+ char(51),
+ char(102),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(118),
+ char(101),
+ char(114),
+ char(116),
+ char(105),
+ char(99),
+ char(101),
+ char(115),
+ char(51),
+ char(100),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(105),
+ char(110),
+ char(100),
+ char(105),
+ char(99),
+ char(101),
+ char(115),
+ char(51),
+ char(50),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(51),
+ char(105),
+ char(110),
+ char(100),
+ char(105),
+ char(99),
+ char(101),
+ char(115),
+ char(49),
+ char(54),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(51),
+ char(105),
+ char(110),
+ char(100),
+ char(105),
+ char(99),
+ char(101),
+ char(115),
+ char(56),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(105),
+ char(110),
+ char(100),
+ char(105),
+ char(99),
+ char(101),
+ char(115),
+ char(49),
+ char(54),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(84),
+ char(114),
+ char(105),
+ char(97),
+ char(110),
+ char(103),
+ char(108),
+ char(101),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(86),
+ char(101),
+ char(114),
+ char(116),
+ char(105),
+ char(99),
+ char(101),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(109),
+ char(101),
+ char(115),
+ char(104),
+ char(80),
+ char(97),
+ char(114),
+ char(116),
+ char(115),
+ char(80),
+ char(116),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(99),
+ char(97),
+ char(108),
+ char(105),
+ char(110),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(77),
+ char(101),
+ char(115),
+ char(104),
+ char(80),
+ char(97),
+ char(114),
+ char(116),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(109),
+ char(101),
+ char(115),
+ char(104),
+ char(73),
+ char(110),
+ char(116),
+ char(101),
+ char(114),
+ char(102),
+ char(97),
+ char(99),
+ char(101),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(113),
+ char(117),
+ char(97),
+ char(110),
+ char(116),
+ char(105),
+ char(122),
+ char(101),
+ char(100),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(66),
+ char(118),
+ char(104),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(113),
+ char(117),
+ char(97),
+ char(110),
+ char(116),
+ char(105),
+ char(122),
+ char(101),
+ char(100),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(66),
+ char(118),
+ char(104),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(116),
+ char(114),
+ char(105),
+ char(97),
+ char(110),
+ char(103),
+ char(108),
+ char(101),
+ char(73),
+ char(110),
+ char(102),
+ char(111),
+ char(77),
+ char(97),
+ char(112),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(97),
+ char(100),
+ char(51),
+ char(91),
+ char(52),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(116),
+ char(114),
+ char(105),
+ char(109),
+ char(101),
+ char(115),
+ char(104),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(109),
+ char(95),
+ char(116),
+ char(114),
+ char(97),
+ char(110),
+ char(115),
+ char(102),
+ char(111),
+ char(114),
+ char(109),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(99),
+ char(104),
+ char(105),
+ char(108),
+ char(100),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(104),
+ char(105),
+ char(108),
+ char(100),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(84),
+ char(121),
+ char(112),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(104),
+ char(105),
+ char(108),
+ char(100),
+ char(77),
+ char(97),
+ char(114),
+ char(103),
+ char(105),
+ char(110),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(99),
+ char(104),
+ char(105),
+ char(108),
+ char(100),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(80),
+ char(116),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(67),
+ char(104),
+ char(105),
+ char(108),
+ char(100),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(117),
+ char(112),
+ char(65),
+ char(120),
+ char(105),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(102),
+ char(108),
+ char(97),
+ char(103),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(101),
+ char(100),
+ char(103),
+ char(101),
+ char(86),
+ char(48),
+ char(86),
+ char(49),
+ char(65),
+ char(110),
+ char(103),
+ char(108),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(101),
+ char(100),
+ char(103),
+ char(101),
+ char(86),
+ char(49),
+ char(86),
+ char(50),
+ char(65),
+ char(110),
+ char(103),
+ char(108),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(101),
+ char(100),
+ char(103),
+ char(101),
+ char(86),
+ char(50),
+ char(86),
+ char(48),
+ char(65),
+ char(110),
+ char(103),
+ char(108),
+ char(101),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(104),
+ char(97),
+ char(115),
+ char(104),
+ char(84),
+ char(97),
+ char(98),
+ char(108),
+ char(101),
+ char(80),
+ char(116),
+ char(114),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(110),
+ char(101),
+ char(120),
+ char(116),
+ char(80),
+ char(116),
+ char(114),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(118),
+ char(97),
+ char(108),
+ char(117),
+ char(101),
+ char(65),
+ char(114),
+ char(114),
+ char(97),
+ char(121),
+ char(80),
+ char(116),
+ char(114),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(107),
+ char(101),
+ char(121),
+ char(65),
+ char(114),
+ char(114),
+ char(97),
+ char(121),
+ char(80),
+ char(116),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(110),
+ char(118),
+ char(101),
+ char(120),
+ char(69),
+ char(112),
+ char(115),
+ char(105),
+ char(108),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(108),
+ char(97),
+ char(110),
+ char(97),
+ char(114),
+ char(69),
+ char(112),
+ char(115),
+ char(105),
+ char(108),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(101),
+ char(113),
+ char(117),
+ char(97),
+ char(108),
+ char(86),
+ char(101),
+ char(114),
+ char(116),
+ char(101),
+ char(120),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(101),
+ char(100),
+ char(103),
+ char(101),
+ char(68),
+ char(105),
+ char(115),
+ char(116),
+ char(97),
+ char(110),
+ char(99),
+ char(101),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(122),
+ char(101),
+ char(114),
+ char(111),
+ char(65),
+ char(114),
+ char(101),
+ char(97),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(101),
+ char(120),
+ char(116),
+ char(83),
+ char(105),
+ char(122),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(104),
+ char(97),
+ char(115),
+ char(104),
+ char(84),
+ char(97),
+ char(98),
+ char(108),
+ char(101),
+ char(83),
+ char(105),
+ char(122),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(86),
+ char(97),
+ char(108),
+ char(117),
+ char(101),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(75),
+ char(101),
+ char(121),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(103),
+ char(105),
+ char(109),
+ char(112),
+ char(97),
+ char(99),
+ char(116),
+ char(83),
+ char(117),
+ char(98),
+ char(84),
+ char(121),
+ char(112),
+ char(101),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(117),
+ char(110),
+ char(115),
+ char(99),
+ char(97),
+ char(108),
+ char(101),
+ char(100),
+ char(80),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(115),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(80),
+ char(116),
+ char(114),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(117),
+ char(110),
+ char(115),
+ char(99),
+ char(97),
+ char(108),
+ char(101),
+ char(100),
+ char(80),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(115),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(80),
+ char(116),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(85),
+ char(110),
+ char(115),
+ char(99),
+ char(97),
+ char(108),
+ char(101),
+ char(100),
+ char(80),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(97),
+ char(100),
+ char(100),
+ char(105),
+ char(110),
+ char(103),
+ char(51),
+ char(91),
+ char(52),
+ char(93),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(98),
+ char(114),
+ char(111),
+ char(97),
+ char(100),
+ char(112),
+ char(104),
+ char(97),
+ char(115),
+ char(101),
+ char(72),
+ char(97),
+ char(110),
+ char(100),
+ char(108),
+ char(101),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(114),
+ char(111),
+ char(111),
+ char(116),
+ char(67),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(119),
+ char(111),
+ char(114),
+ char(108),
+ char(100),
+ char(84),
+ char(114),
+ char(97),
+ char(110),
+ char(115),
+ char(102),
+ char(111),
+ char(114),
+ char(109),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(110),
+ char(116),
+ char(101),
+ char(114),
+ char(112),
+ char(111),
+ char(108),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(87),
+ char(111),
+ char(114),
+ char(108),
+ char(100),
+ char(84),
+ char(114),
+ char(97),
+ char(110),
+ char(115),
+ char(102),
+ char(111),
+ char(114),
+ char(109),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(110),
+ char(116),
+ char(101),
+ char(114),
+ char(112),
+ char(111),
+ char(108),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(76),
+ char(105),
+ char(110),
+ char(101),
+ char(97),
+ char(114),
+ char(86),
+ char(101),
+ char(108),
+ char(111),
+ char(99),
+ char(105),
+ char(116),
+ char(121),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(110),
+ char(116),
+ char(101),
+ char(114),
+ char(112),
+ char(111),
+ char(108),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(65),
+ char(110),
+ char(103),
+ char(117),
+ char(108),
+ char(97),
+ char(114),
+ char(86),
+ char(101),
+ char(108),
+ char(111),
+ char(99),
+ char(105),
+ char(116),
+ char(121),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(110),
+ char(105),
+ char(115),
+ char(111),
+ char(116),
+ char(114),
+ char(111),
+ char(112),
+ char(105),
+ char(99),
+ char(70),
+ char(114),
+ char(105),
+ char(99),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(110),
+ char(116),
+ char(97),
+ char(99),
+ char(116),
+ char(80),
+ char(114),
+ char(111),
+ char(99),
+ char(101),
+ char(115),
+ char(115),
+ char(105),
+ char(110),
+ char(103),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(100),
+ char(101),
+ char(97),
+ char(99),
+ char(116),
+ char(105),
+ char(118),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(84),
+ char(105),
+ char(109),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(102),
+ char(114),
+ char(105),
+ char(99),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(110),
+ char(103),
+ char(70),
+ char(114),
+ char(105),
+ char(99),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(101),
+ char(115),
+ char(116),
+ char(105),
+ char(116),
+ char(117),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(104),
+ char(105),
+ char(116),
+ char(70),
+ char(114),
+ char(97),
+ char(99),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(99),
+ char(100),
+ char(83),
+ char(119),
+ char(101),
+ char(112),
+ char(116),
+ char(83),
+ char(112),
+ char(104),
+ char(101),
+ char(114),
+ char(101),
+ char(82),
+ char(97),
+ char(100),
+ char(105),
+ char(117),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(99),
+ char(100),
+ char(77),
+ char(111),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(104),
+ char(97),
+ char(115),
+ char(65),
+ char(110),
+ char(105),
+ char(115),
+ char(111),
+ char(116),
+ char(114),
+ char(111),
+ char(112),
+ char(105),
+ char(99),
+ char(70),
+ char(114),
+ char(105),
+ char(99),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(70),
+ char(108),
+ char(97),
+ char(103),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(115),
+ char(108),
+ char(97),
+ char(110),
+ char(100),
+ char(84),
+ char(97),
+ char(103),
+ char(49),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(109),
+ char(112),
+ char(97),
+ char(110),
+ char(105),
+ char(111),
+ char(110),
+ char(73),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(99),
+ char(116),
+ char(105),
+ char(118),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(83),
+ char(116),
+ char(97),
+ char(116),
+ char(101),
+ char(49),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(110),
+ char(116),
+ char(101),
+ char(114),
+ char(110),
+ char(97),
+ char(108),
+ char(84),
+ char(121),
+ char(112),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(104),
+ char(101),
+ char(99),
+ char(107),
+ char(67),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(100),
+ char(101),
+ char(87),
+ char(105),
+ char(116),
+ char(104),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(111),
+ char(108),
+ char(118),
+ char(101),
+ char(114),
+ char(73),
+ char(110),
+ char(102),
+ char(111),
+ char(0),
+ char(109),
+ char(95),
+ char(103),
+ char(114),
+ char(97),
+ char(118),
+ char(105),
+ char(116),
+ char(121),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(79),
+ char(98),
+ char(106),
+ char(101),
+ char(99),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(110),
+ char(118),
+ char(73),
+ char(110),
+ char(101),
+ char(114),
+ char(116),
+ char(105),
+ char(97),
+ char(84),
+ char(101),
+ char(110),
+ char(115),
+ char(111),
+ char(114),
+ char(87),
+ char(111),
+ char(114),
+ char(108),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(105),
+ char(110),
+ char(101),
+ char(97),
+ char(114),
+ char(86),
+ char(101),
+ char(108),
+ char(111),
+ char(99),
+ char(105),
+ char(116),
+ char(121),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(110),
+ char(103),
+ char(117),
+ char(108),
+ char(97),
+ char(114),
+ char(86),
+ char(101),
+ char(108),
+ char(111),
+ char(99),
+ char(105),
+ char(116),
+ char(121),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(110),
+ char(103),
+ char(117),
+ char(108),
+ char(97),
+ char(114),
+ char(70),
+ char(97),
+ char(99),
+ char(116),
+ char(111),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(105),
+ char(110),
+ char(101),
+ char(97),
+ char(114),
+ char(70),
+ char(97),
+ char(99),
+ char(116),
+ char(111),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(103),
+ char(114),
+ char(97),
+ char(118),
+ char(105),
+ char(116),
+ char(121),
+ char(95),
+ char(97),
+ char(99),
+ char(99),
+ char(101),
+ char(108),
+ char(101),
+ char(114),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(110),
+ char(118),
+ char(73),
+ char(110),
+ char(101),
+ char(114),
+ char(116),
+ char(105),
+ char(97),
+ char(76),
+ char(111),
+ char(99),
+ char(97),
+ char(108),
+ char(0),
+ char(109),
+ char(95),
+ char(116),
+ char(111),
+ char(116),
+ char(97),
+ char(108),
+ char(70),
+ char(111),
+ char(114),
+ char(99),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(116),
+ char(111),
+ char(116),
+ char(97),
+ char(108),
+ char(84),
+ char(111),
+ char(114),
+ char(113),
+ char(117),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(110),
+ char(118),
+ char(101),
+ char(114),
+ char(115),
+ char(101),
+ char(77),
+ char(97),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(105),
+ char(110),
+ char(101),
+ char(97),
+ char(114),
+ char(68),
+ char(97),
+ char(109),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(110),
+ char(103),
+ char(117),
+ char(108),
+ char(97),
+ char(114),
+ char(68),
+ char(97),
+ char(109),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(100),
+ char(100),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(97),
+ char(108),
+ char(68),
+ char(97),
+ char(109),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(70),
+ char(97),
+ char(99),
+ char(116),
+ char(111),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(100),
+ char(100),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(97),
+ char(108),
+ char(76),
+ char(105),
+ char(110),
+ char(101),
+ char(97),
+ char(114),
+ char(68),
+ char(97),
+ char(109),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(83),
+ char(113),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(100),
+ char(100),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(97),
+ char(108),
+ char(65),
+ char(110),
+ char(103),
+ char(117),
+ char(108),
+ char(97),
+ char(114),
+ char(68),
+ char(97),
+ char(109),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(83),
+ char(113),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(100),
+ char(100),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(97),
+ char(108),
+ char(65),
+ char(110),
+ char(103),
+ char(117),
+ char(108),
+ char(97),
+ char(114),
+ char(68),
+ char(97),
+ char(109),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(70),
+ char(97),
+ char(99),
+ char(116),
+ char(111),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(105),
+ char(110),
+ char(101),
+ char(97),
+ char(114),
+ char(83),
+ char(108),
+ char(101),
+ char(101),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(110),
+ char(103),
+ char(117),
+ char(108),
+ char(97),
+ char(114),
+ char(83),
+ char(108),
+ char(101),
+ char(101),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(100),
+ char(100),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(97),
+ char(108),
+ char(68),
+ char(97),
+ char(109),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(82),
+ char(111),
+ char(119),
+ char(115),
+ char(0),
+ char(110),
+ char(117),
+ char(98),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(114),
+ char(98),
+ char(65),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(114),
+ char(98),
+ char(66),
+ char(0),
+ char(109),
+ char(95),
+ char(111),
+ char(98),
+ char(106),
+ char(101),
+ char(99),
+ char(116),
+ char(84),
+ char(121),
+ char(112),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(117),
+ char(115),
+ char(101),
+ char(114),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(84),
+ char(121),
+ char(112),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(117),
+ char(115),
+ char(101),
+ char(114),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(73),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(101),
+ char(101),
+ char(100),
+ char(115),
+ char(70),
+ char(101),
+ char(101),
+ char(100),
+ char(98),
+ char(97),
+ char(99),
+ char(107),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(112),
+ char(112),
+ char(108),
+ char(105),
+ char(101),
+ char(100),
+ char(73),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(100),
+ char(98),
+ char(103),
+ char(68),
+ char(114),
+ char(97),
+ char(119),
+ char(83),
+ char(105),
+ char(122),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(100),
+ char(105),
+ char(115),
+ char(97),
+ char(98),
+ char(108),
+ char(101),
+ char(67),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(115),
+ char(66),
+ char(101),
+ char(116),
+ char(119),
+ char(101),
+ char(101),
+ char(110),
+ char(76),
+ char(105),
+ char(110),
+ char(107),
+ char(101),
+ char(100),
+ char(66),
+ char(111),
+ char(100),
+ char(105),
+ char(101),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(111),
+ char(118),
+ char(101),
+ char(114),
+ char(114),
+ char(105),
+ char(100),
+ char(101),
+ char(78),
+ char(117),
+ char(109),
+ char(83),
+ char(111),
+ char(108),
+ char(118),
+ char(101),
+ char(114),
+ char(73),
+ char(116),
+ char(101),
+ char(114),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(98),
+ char(114),
+ char(101),
+ char(97),
+ char(107),
+ char(105),
+ char(110),
+ char(103),
+ char(73),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(115),
+ char(69),
+ char(110),
+ char(97),
+ char(98),
+ char(108),
+ char(101),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(116),
+ char(121),
+ char(112),
+ char(101),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(105),
+ char(118),
+ char(111),
+ char(116),
+ char(73),
+ char(110),
+ char(65),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(105),
+ char(118),
+ char(111),
+ char(116),
+ char(73),
+ char(110),
+ char(66),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(98),
+ char(65),
+ char(70),
+ char(114),
+ char(97),
+ char(109),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(98),
+ char(66),
+ char(70),
+ char(114),
+ char(97),
+ char(109),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(117),
+ char(115),
+ char(101),
+ char(82),
+ char(101),
+ char(102),
+ char(101),
+ char(114),
+ char(101),
+ char(110),
+ char(99),
+ char(101),
+ char(70),
+ char(114),
+ char(97),
+ char(109),
+ char(101),
+ char(65),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(110),
+ char(103),
+ char(117),
+ char(108),
+ char(97),
+ char(114),
+ char(79),
+ char(110),
+ char(108),
+ char(121),
+ char(0),
+ char(109),
+ char(95),
+ char(101),
+ char(110),
+ char(97),
+ char(98),
+ char(108),
+ char(101),
+ char(65),
+ char(110),
+ char(103),
+ char(117),
+ char(108),
+ char(97),
+ char(114),
+ char(77),
+ char(111),
+ char(116),
+ char(111),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(109),
+ char(111),
+ char(116),
+ char(111),
+ char(114),
+ char(84),
+ char(97),
+ char(114),
+ char(103),
+ char(101),
+ char(116),
+ char(86),
+ char(101),
+ char(108),
+ char(111),
+ char(99),
+ char(105),
+ char(116),
+ char(121),
+ char(0),
+ char(109),
+ char(95),
+ char(109),
+ char(97),
+ char(120),
+ char(77),
+ char(111),
+ char(116),
+ char(111),
+ char(114),
+ char(73),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(111),
+ char(119),
+ char(101),
+ char(114),
+ char(76),
+ char(105),
+ char(109),
+ char(105),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(117),
+ char(112),
+ char(112),
+ char(101),
+ char(114),
+ char(76),
+ char(105),
+ char(109),
+ char(105),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(105),
+ char(109),
+ char(105),
+ char(116),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(110),
+ char(101),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(98),
+ char(105),
+ char(97),
+ char(115),
+ char(70),
+ char(97),
+ char(99),
+ char(116),
+ char(111),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(101),
+ char(108),
+ char(97),
+ char(120),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(70),
+ char(97),
+ char(99),
+ char(116),
+ char(111),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(119),
+ char(105),
+ char(110),
+ char(103),
+ char(83),
+ char(112),
+ char(97),
+ char(110),
+ char(49),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(119),
+ char(105),
+ char(110),
+ char(103),
+ char(83),
+ char(112),
+ char(97),
+ char(110),
+ char(50),
+ char(0),
+ char(109),
+ char(95),
+ char(116),
+ char(119),
+ char(105),
+ char(115),
+ char(116),
+ char(83),
+ char(112),
+ char(97),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(100),
+ char(97),
+ char(109),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(105),
+ char(110),
+ char(101),
+ char(97),
+ char(114),
+ char(85),
+ char(112),
+ char(112),
+ char(101),
+ char(114),
+ char(76),
+ char(105),
+ char(109),
+ char(105),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(105),
+ char(110),
+ char(101),
+ char(97),
+ char(114),
+ char(76),
+ char(111),
+ char(119),
+ char(101),
+ char(114),
+ char(76),
+ char(105),
+ char(109),
+ char(105),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(110),
+ char(103),
+ char(117),
+ char(108),
+ char(97),
+ char(114),
+ char(85),
+ char(112),
+ char(112),
+ char(101),
+ char(114),
+ char(76),
+ char(105),
+ char(109),
+ char(105),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(110),
+ char(103),
+ char(117),
+ char(108),
+ char(97),
+ char(114),
+ char(76),
+ char(111),
+ char(119),
+ char(101),
+ char(114),
+ char(76),
+ char(105),
+ char(109),
+ char(105),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(117),
+ char(115),
+ char(101),
+ char(76),
+ char(105),
+ char(110),
+ char(101),
+ char(97),
+ char(114),
+ char(82),
+ char(101),
+ char(102),
+ char(101),
+ char(114),
+ char(101),
+ char(110),
+ char(99),
+ char(101),
+ char(70),
+ char(114),
+ char(97),
+ char(109),
+ char(101),
+ char(65),
+ char(0),
+ char(109),
+ char(95),
+ char(117),
+ char(115),
+ char(101),
+ char(79),
+ char(102),
+ char(102),
+ char(115),
+ char(101),
+ char(116),
+ char(70),
+ char(111),
+ char(114),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(70),
+ char(114),
+ char(97),
+ char(109),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(54),
+ char(100),
+ char(111),
+ char(102),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(112),
+ char(114),
+ char(105),
+ char(110),
+ char(103),
+ char(69),
+ char(110),
+ char(97),
+ char(98),
+ char(108),
+ char(101),
+ char(100),
+ char(91),
+ char(54),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(101),
+ char(113),
+ char(117),
+ char(105),
+ char(108),
+ char(105),
+ char(98),
+ char(114),
+ char(105),
+ char(117),
+ char(109),
+ char(80),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(91),
+ char(54),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(112),
+ char(114),
+ char(105),
+ char(110),
+ char(103),
+ char(83),
+ char(116),
+ char(105),
+ char(102),
+ char(102),
+ char(110),
+ char(101),
+ char(115),
+ char(115),
+ char(91),
+ char(54),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(112),
+ char(114),
+ char(105),
+ char(110),
+ char(103),
+ char(68),
+ char(97),
+ char(109),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(91),
+ char(54),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(116),
+ char(97),
+ char(117),
+ char(0),
+ char(109),
+ char(95),
+ char(116),
+ char(105),
+ char(109),
+ char(101),
+ char(83),
+ char(116),
+ char(101),
+ char(112),
+ char(0),
+ char(109),
+ char(95),
+ char(109),
+ char(97),
+ char(120),
+ char(69),
+ char(114),
+ char(114),
+ char(111),
+ char(114),
+ char(82),
+ char(101),
+ char(100),
+ char(117),
+ char(99),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(111),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(101),
+ char(114),
+ char(112),
+ char(0),
+ char(109),
+ char(95),
+ char(101),
+ char(114),
+ char(112),
+ char(50),
+ char(0),
+ char(109),
+ char(95),
+ char(103),
+ char(108),
+ char(111),
+ char(98),
+ char(97),
+ char(108),
+ char(67),
+ char(102),
+ char(109),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(112),
+ char(108),
+ char(105),
+ char(116),
+ char(73),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(80),
+ char(101),
+ char(110),
+ char(101),
+ char(116),
+ char(114),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(112),
+ char(108),
+ char(105),
+ char(116),
+ char(73),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(84),
+ char(117),
+ char(114),
+ char(110),
+ char(69),
+ char(114),
+ char(112),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(105),
+ char(110),
+ char(101),
+ char(97),
+ char(114),
+ char(83),
+ char(108),
+ char(111),
+ char(112),
+ char(0),
+ char(109),
+ char(95),
+ char(119),
+ char(97),
+ char(114),
+ char(109),
+ char(115),
+ char(116),
+ char(97),
+ char(114),
+ char(116),
+ char(105),
+ char(110),
+ char(103),
+ char(70),
+ char(97),
+ char(99),
+ char(116),
+ char(111),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(109),
+ char(97),
+ char(120),
+ char(71),
+ char(121),
+ char(114),
+ char(111),
+ char(115),
+ char(99),
+ char(111),
+ char(112),
+ char(105),
+ char(99),
+ char(70),
+ char(111),
+ char(114),
+ char(99),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(105),
+ char(110),
+ char(103),
+ char(108),
+ char(101),
+ char(65),
+ char(120),
+ char(105),
+ char(115),
+ char(82),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(110),
+ char(103),
+ char(70),
+ char(114),
+ char(105),
+ char(99),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(73),
+ char(116),
+ char(101),
+ char(114),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(111),
+ char(108),
+ char(118),
+ char(101),
+ char(114),
+ char(77),
+ char(111),
+ char(100),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(101),
+ char(115),
+ char(116),
+ char(105),
+ char(110),
+ char(103),
+ char(67),
+ char(111),
+ char(110),
+ char(116),
+ char(97),
+ char(99),
+ char(116),
+ char(82),
+ char(101),
+ char(115),
+ char(116),
+ char(105),
+ char(116),
+ char(117),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(109),
+ char(105),
+ char(110),
+ char(105),
+ char(109),
+ char(117),
+ char(109),
+ char(83),
+ char(111),
+ char(108),
+ char(118),
+ char(101),
+ char(114),
+ char(66),
+ char(97),
+ char(116),
+ char(99),
+ char(104),
+ char(83),
+ char(105),
+ char(122),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(112),
+ char(108),
+ char(105),
+ char(116),
+ char(73),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(105),
+ char(110),
+ char(101),
+ char(97),
+ char(114),
+ char(83),
+ char(116),
+ char(105),
+ char(102),
+ char(102),
+ char(110),
+ char(101),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(110),
+ char(103),
+ char(117),
+ char(108),
+ char(97),
+ char(114),
+ char(83),
+ char(116),
+ char(105),
+ char(102),
+ char(102),
+ char(110),
+ char(101),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(118),
+ char(111),
+ char(108),
+ char(117),
+ char(109),
+ char(101),
+ char(83),
+ char(116),
+ char(105),
+ char(102),
+ char(102),
+ char(110),
+ char(101),
+ char(115),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(109),
+ char(97),
+ char(116),
+ char(101),
+ char(114),
+ char(105),
+ char(97),
+ char(108),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(111),
+ char(115),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(114),
+ char(101),
+ char(118),
+ char(105),
+ char(111),
+ char(117),
+ char(115),
+ char(80),
+ char(111),
+ char(115),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(118),
+ char(101),
+ char(108),
+ char(111),
+ char(99),
+ char(105),
+ char(116),
+ char(121),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(99),
+ char(99),
+ char(117),
+ char(109),
+ char(117),
+ char(108),
+ char(97),
+ char(116),
+ char(101),
+ char(100),
+ char(70),
+ char(111),
+ char(114),
+ char(99),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(111),
+ char(114),
+ char(109),
+ char(97),
+ char(108),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(114),
+ char(101),
+ char(97),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(116),
+ char(116),
+ char(97),
+ char(99),
+ char(104),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(111),
+ char(100),
+ char(101),
+ char(73),
+ char(110),
+ char(100),
+ char(105),
+ char(99),
+ char(101),
+ char(115),
+ char(91),
+ char(50),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(101),
+ char(115),
+ char(116),
+ char(76),
+ char(101),
+ char(110),
+ char(103),
+ char(116),
+ char(104),
+ char(0),
+ char(109),
+ char(95),
+ char(98),
+ char(98),
+ char(101),
+ char(110),
+ char(100),
+ char(105),
+ char(110),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(111),
+ char(100),
+ char(101),
+ char(73),
+ char(110),
+ char(100),
+ char(105),
+ char(99),
+ char(101),
+ char(115),
+ char(91),
+ char(51),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(101),
+ char(115),
+ char(116),
+ char(65),
+ char(114),
+ char(101),
+ char(97),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(48),
+ char(91),
+ char(52),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(111),
+ char(100),
+ char(101),
+ char(73),
+ char(110),
+ char(100),
+ char(105),
+ char(99),
+ char(101),
+ char(115),
+ char(91),
+ char(52),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(101),
+ char(115),
+ char(116),
+ char(86),
+ char(111),
+ char(108),
+ char(117),
+ char(109),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(49),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(50),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(48),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(111),
+ char(99),
+ char(97),
+ char(108),
+ char(70),
+ char(114),
+ char(97),
+ char(109),
+ char(101),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(114),
+ char(105),
+ char(103),
+ char(105),
+ char(100),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(111),
+ char(100),
+ char(101),
+ char(73),
+ char(110),
+ char(100),
+ char(101),
+ char(120),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(101),
+ char(114),
+ char(111),
+ char(77),
+ char(111),
+ char(100),
+ char(101),
+ char(108),
+ char(0),
+ char(109),
+ char(95),
+ char(98),
+ char(97),
+ char(117),
+ char(109),
+ char(103),
+ char(97),
+ char(114),
+ char(116),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(100),
+ char(114),
+ char(97),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(105),
+ char(102),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(114),
+ char(101),
+ char(115),
+ char(115),
+ char(117),
+ char(114),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(118),
+ char(111),
+ char(108),
+ char(117),
+ char(109),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(100),
+ char(121),
+ char(110),
+ char(97),
+ char(109),
+ char(105),
+ char(99),
+ char(70),
+ char(114),
+ char(105),
+ char(99),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(111),
+ char(115),
+ char(101),
+ char(77),
+ char(97),
+ char(116),
+ char(99),
+ char(104),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(105),
+ char(103),
+ char(105),
+ char(100),
+ char(67),
+ char(111),
+ char(110),
+ char(116),
+ char(97),
+ char(99),
+ char(116),
+ char(72),
+ char(97),
+ char(114),
+ char(100),
+ char(110),
+ char(101),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(107),
+ char(105),
+ char(110),
+ char(101),
+ char(116),
+ char(105),
+ char(99),
+ char(67),
+ char(111),
+ char(110),
+ char(116),
+ char(97),
+ char(99),
+ char(116),
+ char(72),
+ char(97),
+ char(114),
+ char(100),
+ char(110),
+ char(101),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(111),
+ char(102),
+ char(116),
+ char(67),
+ char(111),
+ char(110),
+ char(116),
+ char(97),
+ char(99),
+ char(116),
+ char(72),
+ char(97),
+ char(114),
+ char(100),
+ char(110),
+ char(101),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(110),
+ char(99),
+ char(104),
+ char(111),
+ char(114),
+ char(72),
+ char(97),
+ char(114),
+ char(100),
+ char(110),
+ char(101),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(111),
+ char(102),
+ char(116),
+ char(82),
+ char(105),
+ char(103),
+ char(105),
+ char(100),
+ char(67),
+ char(108),
+ char(117),
+ char(115),
+ char(116),
+ char(101),
+ char(114),
+ char(72),
+ char(97),
+ char(114),
+ char(100),
+ char(110),
+ char(101),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(111),
+ char(102),
+ char(116),
+ char(75),
+ char(105),
+ char(110),
+ char(101),
+ char(116),
+ char(105),
+ char(99),
+ char(67),
+ char(108),
+ char(117),
+ char(115),
+ char(116),
+ char(101),
+ char(114),
+ char(72),
+ char(97),
+ char(114),
+ char(100),
+ char(110),
+ char(101),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(111),
+ char(102),
+ char(116),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(67),
+ char(108),
+ char(117),
+ char(115),
+ char(116),
+ char(101),
+ char(114),
+ char(72),
+ char(97),
+ char(114),
+ char(100),
+ char(110),
+ char(101),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(111),
+ char(102),
+ char(116),
+ char(82),
+ char(105),
+ char(103),
+ char(105),
+ char(100),
+ char(67),
+ char(108),
+ char(117),
+ char(115),
+ char(116),
+ char(101),
+ char(114),
+ char(73),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(83),
+ char(112),
+ char(108),
+ char(105),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(111),
+ char(102),
+ char(116),
+ char(75),
+ char(105),
+ char(110),
+ char(101),
+ char(116),
+ char(105),
+ char(99),
+ char(67),
+ char(108),
+ char(117),
+ char(115),
+ char(116),
+ char(101),
+ char(114),
+ char(73),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(83),
+ char(112),
+ char(108),
+ char(105),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(111),
+ char(102),
+ char(116),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(67),
+ char(108),
+ char(117),
+ char(115),
+ char(116),
+ char(101),
+ char(114),
+ char(73),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(83),
+ char(112),
+ char(108),
+ char(105),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(109),
+ char(97),
+ char(120),
+ char(86),
+ char(111),
+ char(108),
+ char(117),
+ char(109),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(116),
+ char(105),
+ char(109),
+ char(101),
+ char(83),
+ char(99),
+ char(97),
+ char(108),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(118),
+ char(101),
+ char(108),
+ char(111),
+ char(99),
+ char(105),
+ char(116),
+ char(121),
+ char(73),
+ char(116),
+ char(101),
+ char(114),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(111),
+ char(115),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(73),
+ char(116),
+ char(101),
+ char(114),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(100),
+ char(114),
+ char(105),
+ char(102),
+ char(116),
+ char(73),
+ char(116),
+ char(101),
+ char(114),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(108),
+ char(117),
+ char(115),
+ char(116),
+ char(101),
+ char(114),
+ char(73),
+ char(116),
+ char(101),
+ char(114),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(111),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(99),
+ char(97),
+ char(108),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(113),
+ char(113),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(109),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(112),
+ char(111),
+ char(115),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(119),
+ char(101),
+ char(105),
+ char(103),
+ char(104),
+ char(116),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(80),
+ char(111),
+ char(115),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(87),
+ char(101),
+ char(105),
+ char(103),
+ char(116),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(98),
+ char(118),
+ char(111),
+ char(108),
+ char(117),
+ char(109),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(98),
+ char(102),
+ char(114),
+ char(97),
+ char(109),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(102),
+ char(114),
+ char(97),
+ char(109),
+ char(101),
+ char(120),
+ char(102),
+ char(111),
+ char(114),
+ char(109),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(111),
+ char(99),
+ char(105),
+ char(105),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(110),
+ char(118),
+ char(119),
+ char(105),
+ char(0),
+ char(109),
+ char(95),
+ char(118),
+ char(105),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(115),
+ char(91),
+ char(50),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(100),
+ char(105),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(115),
+ char(91),
+ char(50),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(118),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(118),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(102),
+ char(114),
+ char(97),
+ char(109),
+ char(101),
+ char(114),
+ char(101),
+ char(102),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(110),
+ char(111),
+ char(100),
+ char(101),
+ char(73),
+ char(110),
+ char(100),
+ char(105),
+ char(99),
+ char(101),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(109),
+ char(97),
+ char(115),
+ char(115),
+ char(101),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(70),
+ char(114),
+ char(97),
+ char(109),
+ char(101),
+ char(82),
+ char(101),
+ char(102),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(78),
+ char(111),
+ char(100),
+ char(101),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(77),
+ char(97),
+ char(115),
+ char(115),
+ char(101),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(100),
+ char(109),
+ char(97),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(109),
+ char(97),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(118),
+ char(105),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(100),
+ char(105),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(100),
+ char(97),
+ char(109),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(100),
+ char(97),
+ char(109),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(100),
+ char(97),
+ char(109),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(109),
+ char(97),
+ char(116),
+ char(99),
+ char(104),
+ char(105),
+ char(110),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(109),
+ char(97),
+ char(120),
+ char(83),
+ char(101),
+ char(108),
+ char(102),
+ char(67),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(73),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(101),
+ char(108),
+ char(102),
+ char(67),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(73),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(70),
+ char(97),
+ char(99),
+ char(116),
+ char(111),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(110),
+ char(116),
+ char(97),
+ char(105),
+ char(110),
+ char(115),
+ char(65),
+ char(110),
+ char(99),
+ char(104),
+ char(111),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(100),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(108),
+ char(117),
+ char(115),
+ char(116),
+ char(101),
+ char(114),
+ char(73),
+ char(110),
+ char(100),
+ char(101),
+ char(120),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(98),
+ char(111),
+ char(100),
+ char(121),
+ char(65),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(98),
+ char(111),
+ char(100),
+ char(121),
+ char(66),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(101),
+ char(102),
+ char(115),
+ char(91),
+ char(50),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(102),
+ char(109),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(112),
+ char(108),
+ char(105),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(100),
+ char(101),
+ char(108),
+ char(101),
+ char(116),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(101),
+ char(108),
+ char(80),
+ char(111),
+ char(115),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(91),
+ char(50),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(98),
+ char(111),
+ char(100),
+ char(121),
+ char(65),
+ char(116),
+ char(121),
+ char(112),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(98),
+ char(111),
+ char(100),
+ char(121),
+ char(66),
+ char(116),
+ char(121),
+ char(112),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(106),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(84),
+ char(121),
+ char(112),
+ char(101),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(112),
+ char(111),
+ char(115),
+ char(101),
+ char(0),
+ char(42),
+ char(42),
+ char(109),
+ char(95),
+ char(109),
+ char(97),
+ char(116),
+ char(101),
+ char(114),
+ char(105),
+ char(97),
+ char(108),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(110),
+ char(111),
+ char(100),
+ char(101),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(108),
+ char(105),
+ char(110),
+ char(107),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(102),
+ char(97),
+ char(99),
+ char(101),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(116),
+ char(101),
+ char(116),
+ char(114),
+ char(97),
+ char(104),
+ char(101),
+ char(100),
+ char(114),
+ char(97),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(97),
+ char(110),
+ char(99),
+ char(104),
+ char(111),
+ char(114),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(99),
+ char(108),
+ char(117),
+ char(115),
+ char(116),
+ char(101),
+ char(114),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(106),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(77),
+ char(97),
+ char(116),
+ char(101),
+ char(114),
+ char(105),
+ char(97),
+ char(108),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(76),
+ char(105),
+ char(110),
+ char(107),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(70),
+ char(97),
+ char(99),
+ char(101),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(84),
+ char(101),
+ char(116),
+ char(114),
+ char(97),
+ char(104),
+ char(101),
+ char(100),
+ char(114),
+ char(97),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(65),
+ char(110),
+ char(99),
+ char(104),
+ char(111),
+ char(114),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(67),
+ char(108),
+ char(117),
+ char(115),
+ char(116),
+ char(101),
+ char(114),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(74),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(110),
+ char(102),
+ char(105),
+ char(103),
+ char(0),
+ char(84),
+ char(89),
+ char(80),
+ char(69),
+ char(76),
+ char(0),
+ char(0),
+ char(0),
+ char(99),
+ char(104),
+ char(97),
+ char(114),
+ char(0),
+ char(117),
+ char(99),
+ char(104),
+ char(97),
+ char(114),
+ char(0),
+ char(115),
+ char(104),
+ char(111),
+ char(114),
+ char(116),
+ char(0),
+ char(117),
+ char(115),
+ char(104),
+ char(111),
+ char(114),
+ char(116),
+ char(0),
+ char(105),
+ char(110),
+ char(116),
+ char(0),
+ char(108),
+ char(111),
+ char(110),
+ char(103),
+ char(0),
+ char(117),
+ char(108),
+ char(111),
+ char(110),
+ char(103),
+ char(0),
+ char(102),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(0),
+ char(100),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(0),
+ char(118),
+ char(111),
+ char(105),
+ char(100),
+ char(0),
+ char(80),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(101),
+ char(114),
+ char(65),
+ char(114),
+ char(114),
+ char(97),
+ char(121),
+ char(0),
+ char(98),
+ char(116),
+ char(80),
+ char(104),
+ char(121),
+ char(115),
+ char(105),
+ char(99),
+ char(115),
+ char(83),
+ char(121),
+ char(115),
+ char(116),
+ char(101),
+ char(109),
+ char(0),
+ char(76),
+ char(105),
+ char(115),
+ char(116),
+ char(66),
+ char(97),
+ char(115),
+ char(101),
+ char(0),
+ char(98),
+ char(116),
+ char(86),
+ char(101),
+ char(99),
+ char(116),
+ char(111),
+ char(114),
+ char(51),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(86),
+ char(101),
+ char(99),
+ char(116),
+ char(111),
+ char(114),
+ char(51),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(77),
+ char(97),
+ char(116),
+ char(114),
+ char(105),
+ char(120),
+ char(51),
+ char(120),
+ char(51),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(77),
+ char(97),
+ char(116),
+ char(114),
+ char(105),
+ char(120),
+ char(51),
+ char(120),
+ char(51),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(84),
+ char(114),
+ char(97),
+ char(110),
+ char(115),
+ char(102),
+ char(111),
+ char(114),
+ char(109),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(84),
+ char(114),
+ char(97),
+ char(110),
+ char(115),
+ char(102),
+ char(111),
+ char(114),
+ char(109),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(66),
+ char(118),
+ char(104),
+ char(83),
+ char(117),
+ char(98),
+ char(116),
+ char(114),
+ char(101),
+ char(101),
+ char(73),
+ char(110),
+ char(102),
+ char(111),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(79),
+ char(112),
+ char(116),
+ char(105),
+ char(109),
+ char(105),
+ char(122),
+ char(101),
+ char(100),
+ char(66),
+ char(118),
+ char(104),
+ char(78),
+ char(111),
+ char(100),
+ char(101),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(79),
+ char(112),
+ char(116),
+ char(105),
+ char(109),
+ char(105),
+ char(122),
+ char(101),
+ char(100),
+ char(66),
+ char(118),
+ char(104),
+ char(78),
+ char(111),
+ char(100),
+ char(101),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(81),
+ char(117),
+ char(97),
+ char(110),
+ char(116),
+ char(105),
+ char(122),
+ char(101),
+ char(100),
+ char(66),
+ char(118),
+ char(104),
+ char(78),
+ char(111),
+ char(100),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(81),
+ char(117),
+ char(97),
+ char(110),
+ char(116),
+ char(105),
+ char(122),
+ char(101),
+ char(100),
+ char(66),
+ char(118),
+ char(104),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(81),
+ char(117),
+ char(97),
+ char(110),
+ char(116),
+ char(105),
+ char(122),
+ char(101),
+ char(100),
+ char(66),
+ char(118),
+ char(104),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(83),
+ char(116),
+ char(97),
+ char(116),
+ char(105),
+ char(99),
+ char(80),
+ char(108),
+ char(97),
+ char(110),
+ char(101),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(111),
+ char(110),
+ char(118),
+ char(101),
+ char(120),
+ char(73),
+ char(110),
+ char(116),
+ char(101),
+ char(114),
+ char(110),
+ char(97),
+ char(108),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(80),
+ char(111),
+ char(115),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(65),
+ char(110),
+ char(100),
+ char(82),
+ char(97),
+ char(100),
+ char(105),
+ char(117),
+ char(115),
+ char(0),
+ char(98),
+ char(116),
+ char(77),
+ char(117),
+ char(108),
+ char(116),
+ char(105),
+ char(83),
+ char(112),
+ char(104),
+ char(101),
+ char(114),
+ char(101),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(73),
+ char(110),
+ char(116),
+ char(73),
+ char(110),
+ char(100),
+ char(101),
+ char(120),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(83),
+ char(104),
+ char(111),
+ char(114),
+ char(116),
+ char(73),
+ char(110),
+ char(116),
+ char(73),
+ char(110),
+ char(100),
+ char(101),
+ char(120),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(83),
+ char(104),
+ char(111),
+ char(114),
+ char(116),
+ char(73),
+ char(110),
+ char(116),
+ char(73),
+ char(110),
+ char(100),
+ char(101),
+ char(120),
+ char(84),
+ char(114),
+ char(105),
+ char(112),
+ char(108),
+ char(101),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(104),
+ char(97),
+ char(114),
+ char(73),
+ char(110),
+ char(100),
+ char(101),
+ char(120),
+ char(84),
+ char(114),
+ char(105),
+ char(112),
+ char(108),
+ char(101),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(77),
+ char(101),
+ char(115),
+ char(104),
+ char(80),
+ char(97),
+ char(114),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(83),
+ char(116),
+ char(114),
+ char(105),
+ char(100),
+ char(105),
+ char(110),
+ char(103),
+ char(77),
+ char(101),
+ char(115),
+ char(104),
+ char(73),
+ char(110),
+ char(116),
+ char(101),
+ char(114),
+ char(102),
+ char(97),
+ char(99),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(84),
+ char(114),
+ char(105),
+ char(97),
+ char(110),
+ char(103),
+ char(108),
+ char(101),
+ char(77),
+ char(101),
+ char(115),
+ char(104),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(84),
+ char(114),
+ char(105),
+ char(97),
+ char(110),
+ char(103),
+ char(108),
+ char(101),
+ char(73),
+ char(110),
+ char(102),
+ char(111),
+ char(77),
+ char(97),
+ char(112),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(83),
+ char(99),
+ char(97),
+ char(108),
+ char(101),
+ char(100),
+ char(84),
+ char(114),
+ char(105),
+ char(97),
+ char(110),
+ char(103),
+ char(108),
+ char(101),
+ char(77),
+ char(101),
+ char(115),
+ char(104),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(111),
+ char(109),
+ char(112),
+ char(111),
+ char(117),
+ char(110),
+ char(100),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(67),
+ char(104),
+ char(105),
+ char(108),
+ char(100),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(111),
+ char(109),
+ char(112),
+ char(111),
+ char(117),
+ char(110),
+ char(100),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(121),
+ char(108),
+ char(105),
+ char(110),
+ char(100),
+ char(101),
+ char(114),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(97),
+ char(112),
+ char(115),
+ char(117),
+ char(108),
+ char(101),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(84),
+ char(114),
+ char(105),
+ char(97),
+ char(110),
+ char(103),
+ char(108),
+ char(101),
+ char(73),
+ char(110),
+ char(102),
+ char(111),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(71),
+ char(73),
+ char(109),
+ char(112),
+ char(97),
+ char(99),
+ char(116),
+ char(77),
+ char(101),
+ char(115),
+ char(104),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(111),
+ char(110),
+ char(118),
+ char(101),
+ char(120),
+ char(72),
+ char(117),
+ char(108),
+ char(108),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(79),
+ char(98),
+ char(106),
+ char(101),
+ char(99),
+ char(116),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(79),
+ char(98),
+ char(106),
+ char(101),
+ char(99),
+ char(116),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(68),
+ char(121),
+ char(110),
+ char(97),
+ char(109),
+ char(105),
+ char(99),
+ char(115),
+ char(87),
+ char(111),
+ char(114),
+ char(108),
+ char(100),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(111),
+ char(110),
+ char(116),
+ char(97),
+ char(99),
+ char(116),
+ char(83),
+ char(111),
+ char(108),
+ char(118),
+ char(101),
+ char(114),
+ char(73),
+ char(110),
+ char(102),
+ char(111),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(68),
+ char(121),
+ char(110),
+ char(97),
+ char(109),
+ char(105),
+ char(99),
+ char(115),
+ char(87),
+ char(111),
+ char(114),
+ char(108),
+ char(100),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(111),
+ char(110),
+ char(116),
+ char(97),
+ char(99),
+ char(116),
+ char(83),
+ char(111),
+ char(108),
+ char(118),
+ char(101),
+ char(114),
+ char(73),
+ char(110),
+ char(102),
+ char(111),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(82),
+ char(105),
+ char(103),
+ char(105),
+ char(100),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(82),
+ char(105),
+ char(103),
+ char(105),
+ char(100),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(73),
+ char(110),
+ char(102),
+ char(111),
+ char(49),
+ char(0),
+ char(98),
+ char(116),
+ char(84),
+ char(121),
+ char(112),
+ char(101),
+ char(100),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(82),
+ char(105),
+ char(103),
+ char(105),
+ char(100),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(80),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(50),
+ char(80),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(80),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(50),
+ char(80),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(72),
+ char(105),
+ char(110),
+ char(103),
+ char(101),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(72),
+ char(105),
+ char(110),
+ char(103),
+ char(101),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(111),
+ char(110),
+ char(101),
+ char(84),
+ char(119),
+ char(105),
+ char(115),
+ char(116),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(71),
+ char(101),
+ char(110),
+ char(101),
+ char(114),
+ char(105),
+ char(99),
+ char(54),
+ char(68),
+ char(111),
+ char(102),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(71),
+ char(101),
+ char(110),
+ char(101),
+ char(114),
+ char(105),
+ char(99),
+ char(54),
+ char(68),
+ char(111),
+ char(102),
+ char(83),
+ char(112),
+ char(114),
+ char(105),
+ char(110),
+ char(103),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(83),
+ char(108),
+ char(105),
+ char(100),
+ char(101),
+ char(114),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(77),
+ char(97),
+ char(116),
+ char(101),
+ char(114),
+ char(105),
+ char(97),
+ char(108),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(78),
+ char(111),
+ char(100),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(76),
+ char(105),
+ char(110),
+ char(107),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(70),
+ char(97),
+ char(99),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(84),
+ char(101),
+ char(116),
+ char(114),
+ char(97),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(82),
+ char(105),
+ char(103),
+ char(105),
+ char(100),
+ char(65),
+ char(110),
+ char(99),
+ char(104),
+ char(111),
+ char(114),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(67),
+ char(111),
+ char(110),
+ char(102),
+ char(105),
+ char(103),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(80),
+ char(111),
+ char(115),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(67),
+ char(108),
+ char(117),
+ char(115),
+ char(116),
+ char(101),
+ char(114),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(74),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(0),
+ char(0),
+ char(84),
+ char(76),
+ char(69),
+ char(78),
+ char(1),
+ char(0),
+ char(1),
+ char(0),
+ char(2),
+ char(0),
+ char(2),
+ char(0),
+ char(4),
+ char(0),
+ char(4),
+ char(0),
+ char(4),
+ char(0),
+ char(4),
+ char(0),
+ char(8),
+ char(0),
+ char(0),
+ char(0),
+ char(12),
+ char(0),
+ char(36),
+ char(0),
+ char(8),
+ char(0),
+ char(16),
+ char(0),
+ char(32),
+ char(0),
+ char(48),
+ char(0),
+ char(96),
+ char(0),
+ char(64),
+ char(0),
+ char(-128),
+ char(0),
+ char(20),
+ char(0),
+ char(48),
+ char(0),
+ char(80),
+ char(0),
+ char(16),
+ char(0),
+ char(84),
+ char(0),
+ char(-124),
+ char(0),
+ char(12),
+ char(0),
+ char(52),
+ char(0),
+ char(52),
+ char(0),
+ char(20),
+ char(0),
+ char(64),
+ char(0),
+ char(4),
+ char(0),
+ char(4),
+ char(0),
+ char(8),
+ char(0),
+ char(4),
+ char(0),
+ char(32),
+ char(0),
+ char(28),
+ char(0),
+ char(60),
+ char(0),
+ char(56),
+ char(0),
+ char(76),
+ char(0),
+ char(76),
+ char(0),
+ char(24),
+ char(0),
+ char(60),
+ char(0),
+ char(60),
+ char(0),
+ char(16),
+ char(0),
+ char(64),
+ char(0),
+ char(68),
+ char(0),
+ char(-48),
+ char(1),
+ char(0),
+ char(1),
+ char(-72),
+ char(0),
+ char(-104),
+ char(0),
+ char(104),
+ char(0),
+ char(88),
+ char(0),
+ char(-24),
+ char(1),
+ char(-96),
+ char(3),
+ char(8),
+ char(0),
+ char(52),
+ char(0),
+ char(0),
+ char(0),
+ char(84),
+ char(0),
+ char(116),
+ char(0),
+ char(92),
+ char(1),
+ char(-36),
+ char(0),
+ char(-44),
+ char(0),
+ char(-4),
+ char(0),
+ char(92),
+ char(1),
+ char(-52),
+ char(0),
+ char(16),
+ char(0),
+ char(100),
+ char(0),
+ char(20),
+ char(0),
+ char(36),
+ char(0),
+ char(100),
+ char(0),
+ char(92),
+ char(0),
+ char(104),
+ char(0),
+ char(-64),
+ char(0),
+ char(92),
+ char(1),
+ char(104),
+ char(0),
+ char(-84),
+ char(1),
+ char(83),
+ char(84),
+ char(82),
+ char(67),
+ char(65),
+ char(0),
+ char(0),
+ char(0),
+ char(10),
+ char(0),
+ char(3),
+ char(0),
+ char(4),
+ char(0),
+ char(0),
+ char(0),
+ char(4),
+ char(0),
+ char(1),
+ char(0),
+ char(9),
+ char(0),
+ char(2),
+ char(0),
+ char(11),
+ char(0),
+ char(3),
+ char(0),
+ char(10),
+ char(0),
+ char(3),
+ char(0),
+ char(10),
+ char(0),
+ char(4),
+ char(0),
+ char(10),
+ char(0),
+ char(5),
+ char(0),
+ char(12),
+ char(0),
+ char(2),
+ char(0),
+ char(9),
+ char(0),
+ char(6),
+ char(0),
+ char(9),
+ char(0),
+ char(7),
+ char(0),
+ char(13),
+ char(0),
+ char(1),
+ char(0),
+ char(7),
+ char(0),
+ char(8),
+ char(0),
+ char(14),
+ char(0),
+ char(1),
+ char(0),
+ char(8),
+ char(0),
+ char(8),
+ char(0),
+ char(15),
+ char(0),
+ char(1),
+ char(0),
+ char(13),
+ char(0),
+ char(9),
+ char(0),
+ char(16),
+ char(0),
+ char(1),
+ char(0),
+ char(14),
+ char(0),
+ char(9),
+ char(0),
+ char(17),
+ char(0),
+ char(2),
+ char(0),
+ char(15),
+ char(0),
+ char(10),
+ char(0),
+ char(13),
+ char(0),
+ char(11),
+ char(0),
+ char(18),
+ char(0),
+ char(2),
+ char(0),
+ char(16),
+ char(0),
+ char(10),
+ char(0),
+ char(14),
+ char(0),
+ char(11),
+ char(0),
+ char(19),
+ char(0),
+ char(4),
+ char(0),
+ char(4),
+ char(0),
+ char(12),
+ char(0),
+ char(4),
+ char(0),
+ char(13),
+ char(0),
+ char(2),
+ char(0),
+ char(14),
+ char(0),
+ char(2),
+ char(0),
+ char(15),
+ char(0),
+ char(20),
+ char(0),
+ char(6),
+ char(0),
+ char(13),
+ char(0),
+ char(16),
+ char(0),
+ char(13),
+ char(0),
+ char(17),
+ char(0),
+ char(4),
+ char(0),
+ char(18),
+ char(0),
+ char(4),
+ char(0),
+ char(19),
+ char(0),
+ char(4),
+ char(0),
+ char(20),
+ char(0),
+ char(0),
+ char(0),
+ char(21),
+ char(0),
+ char(21),
+ char(0),
+ char(6),
+ char(0),
+ char(14),
+ char(0),
+ char(16),
+ char(0),
+ char(14),
+ char(0),
+ char(17),
+ char(0),
+ char(4),
+ char(0),
+ char(18),
+ char(0),
+ char(4),
+ char(0),
+ char(19),
+ char(0),
+ char(4),
+ char(0),
+ char(20),
+ char(0),
+ char(0),
+ char(0),
+ char(21),
+ char(0),
+ char(22),
+ char(0),
+ char(3),
+ char(0),
+ char(2),
+ char(0),
+ char(14),
+ char(0),
+ char(2),
+ char(0),
+ char(15),
+ char(0),
+ char(4),
+ char(0),
+ char(22),
+ char(0),
+ char(23),
+ char(0),
+ char(12),
+ char(0),
+ char(13),
+ char(0),
+ char(23),
+ char(0),
+ char(13),
+ char(0),
+ char(24),
+ char(0),
+ char(13),
+ char(0),
+ char(25),
+ char(0),
+ char(4),
+ char(0),
+ char(26),
+ char(0),
+ char(4),
+ char(0),
+ char(27),
+ char(0),
+ char(4),
+ char(0),
+ char(28),
+ char(0),
+ char(4),
+ char(0),
+ char(29),
+ char(0),
+ char(20),
+ char(0),
+ char(30),
+ char(0),
+ char(22),
+ char(0),
+ char(31),
+ char(0),
+ char(19),
+ char(0),
+ char(32),
+ char(0),
+ char(4),
+ char(0),
+ char(33),
+ char(0),
+ char(4),
+ char(0),
+ char(34),
+ char(0),
+ char(24),
+ char(0),
+ char(12),
+ char(0),
+ char(14),
+ char(0),
+ char(23),
+ char(0),
+ char(14),
+ char(0),
+ char(24),
+ char(0),
+ char(14),
+ char(0),
+ char(25),
+ char(0),
+ char(4),
+ char(0),
+ char(26),
+ char(0),
+ char(4),
+ char(0),
+ char(27),
+ char(0),
+ char(4),
+ char(0),
+ char(28),
+ char(0),
+ char(4),
+ char(0),
+ char(29),
+ char(0),
+ char(21),
+ char(0),
+ char(30),
+ char(0),
+ char(22),
+ char(0),
+ char(31),
+ char(0),
+ char(4),
+ char(0),
+ char(33),
+ char(0),
+ char(4),
+ char(0),
+ char(34),
+ char(0),
+ char(19),
+ char(0),
+ char(32),
+ char(0),
+ char(25),
+ char(0),
+ char(3),
+ char(0),
+ char(0),
+ char(0),
+ char(35),
+ char(0),
+ char(4),
+ char(0),
+ char(36),
+ char(0),
+ char(0),
+ char(0),
+ char(37),
+ char(0),
+ char(26),
+ char(0),
+ char(5),
+ char(0),
+ char(25),
+ char(0),
+ char(38),
+ char(0),
+ char(13),
+ char(0),
+ char(39),
+ char(0),
+ char(13),
+ char(0),
+ char(40),
+ char(0),
+ char(7),
+ char(0),
+ char(41),
+ char(0),
+ char(0),
+ char(0),
+ char(21),
+ char(0),
+ char(27),
+ char(0),
+ char(5),
+ char(0),
+ char(25),
+ char(0),
+ char(38),
+ char(0),
+ char(13),
+ char(0),
+ char(39),
+ char(0),
+ char(13),
+ char(0),
+ char(42),
+ char(0),
+ char(7),
+ char(0),
+ char(43),
+ char(0),
+ char(4),
+ char(0),
+ char(44),
+ char(0),
+ char(28),
+ char(0),
+ char(2),
+ char(0),
+ char(13),
+ char(0),
+ char(45),
+ char(0),
+ char(7),
+ char(0),
+ char(46),
+ char(0),
+ char(29),
+ char(0),
+ char(4),
+ char(0),
+ char(27),
+ char(0),
+ char(47),
+ char(0),
+ char(28),
+ char(0),
+ char(48),
+ char(0),
+ char(4),
+ char(0),
+ char(49),
+ char(0),
+ char(0),
+ char(0),
+ char(37),
+ char(0),
+ char(30),
+ char(0),
+ char(1),
+ char(0),
+ char(4),
+ char(0),
+ char(50),
+ char(0),
+ char(31),
+ char(0),
+ char(2),
+ char(0),
+ char(2),
+ char(0),
+ char(50),
+ char(0),
+ char(0),
+ char(0),
+ char(51),
+ char(0),
+ char(32),
+ char(0),
+ char(2),
+ char(0),
+ char(2),
+ char(0),
+ char(52),
+ char(0),
+ char(0),
+ char(0),
+ char(51),
+ char(0),
+ char(33),
+ char(0),
+ char(2),
+ char(0),
+ char(0),
+ char(0),
+ char(52),
+ char(0),
+ char(0),
+ char(0),
+ char(53),
+ char(0),
+ char(34),
+ char(0),
+ char(8),
+ char(0),
+ char(13),
+ char(0),
+ char(54),
+ char(0),
+ char(14),
+ char(0),
+ char(55),
+ char(0),
+ char(30),
+ char(0),
+ char(56),
+ char(0),
+ char(32),
+ char(0),
+ char(57),
+ char(0),
+ char(33),
+ char(0),
+ char(58),
+ char(0),
+ char(31),
+ char(0),
+ char(59),
+ char(0),
+ char(4),
+ char(0),
+ char(60),
+ char(0),
+ char(4),
+ char(0),
+ char(61),
+ char(0),
+ char(35),
+ char(0),
+ char(4),
+ char(0),
+ char(34),
+ char(0),
+ char(62),
+ char(0),
+ char(13),
+ char(0),
+ char(63),
+ char(0),
+ char(4),
+ char(0),
+ char(64),
+ char(0),
+ char(0),
+ char(0),
+ char(37),
+ char(0),
+ char(36),
+ char(0),
+ char(7),
+ char(0),
+ char(25),
+ char(0),
+ char(38),
+ char(0),
+ char(35),
+ char(0),
+ char(65),
+ char(0),
+ char(23),
+ char(0),
+ char(66),
+ char(0),
+ char(24),
+ char(0),
+ char(67),
+ char(0),
+ char(37),
+ char(0),
+ char(68),
+ char(0),
+ char(7),
+ char(0),
+ char(43),
+ char(0),
+ char(0),
+ char(0),
+ char(69),
+ char(0),
+ char(38),
+ char(0),
+ char(2),
+ char(0),
+ char(36),
+ char(0),
+ char(70),
+ char(0),
+ char(13),
+ char(0),
+ char(39),
+ char(0),
+ char(39),
+ char(0),
+ char(4),
+ char(0),
+ char(17),
+ char(0),
+ char(71),
+ char(0),
+ char(25),
+ char(0),
+ char(72),
+ char(0),
+ char(4),
+ char(0),
+ char(73),
+ char(0),
+ char(7),
+ char(0),
+ char(74),
+ char(0),
+ char(40),
+ char(0),
+ char(4),
+ char(0),
+ char(25),
+ char(0),
+ char(38),
+ char(0),
+ char(39),
+ char(0),
+ char(75),
+ char(0),
+ char(4),
+ char(0),
+ char(76),
+ char(0),
+ char(7),
+ char(0),
+ char(43),
+ char(0),
+ char(41),
+ char(0),
+ char(3),
+ char(0),
+ char(27),
+ char(0),
+ char(47),
+ char(0),
+ char(4),
+ char(0),
+ char(77),
+ char(0),
+ char(0),
+ char(0),
+ char(37),
+ char(0),
+ char(42),
+ char(0),
+ char(3),
+ char(0),
+ char(27),
+ char(0),
+ char(47),
+ char(0),
+ char(4),
+ char(0),
+ char(77),
+ char(0),
+ char(0),
+ char(0),
+ char(37),
+ char(0),
+ char(43),
+ char(0),
+ char(4),
+ char(0),
+ char(4),
+ char(0),
+ char(78),
+ char(0),
+ char(7),
+ char(0),
+ char(79),
+ char(0),
+ char(7),
+ char(0),
+ char(80),
+ char(0),
+ char(7),
+ char(0),
+ char(81),
+ char(0),
+ char(37),
+ char(0),
+ char(14),
+ char(0),
+ char(4),
+ char(0),
+ char(82),
+ char(0),
+ char(4),
+ char(0),
+ char(83),
+ char(0),
+ char(43),
+ char(0),
+ char(84),
+ char(0),
+ char(4),
+ char(0),
+ char(85),
+ char(0),
+ char(7),
+ char(0),
+ char(86),
+ char(0),
+ char(7),
+ char(0),
+ char(87),
+ char(0),
+ char(7),
+ char(0),
+ char(88),
+ char(0),
+ char(7),
+ char(0),
+ char(89),
+ char(0),
+ char(7),
+ char(0),
+ char(90),
+ char(0),
+ char(4),
+ char(0),
+ char(91),
+ char(0),
+ char(4),
+ char(0),
+ char(92),
+ char(0),
+ char(4),
+ char(0),
+ char(93),
+ char(0),
+ char(4),
+ char(0),
+ char(94),
+ char(0),
+ char(0),
+ char(0),
+ char(37),
+ char(0),
+ char(44),
+ char(0),
+ char(5),
+ char(0),
+ char(25),
+ char(0),
+ char(38),
+ char(0),
+ char(35),
+ char(0),
+ char(65),
+ char(0),
+ char(13),
+ char(0),
+ char(39),
+ char(0),
+ char(7),
+ char(0),
+ char(43),
+ char(0),
+ char(4),
+ char(0),
+ char(95),
+ char(0),
+ char(45),
+ char(0),
+ char(5),
+ char(0),
+ char(27),
+ char(0),
+ char(47),
+ char(0),
+ char(13),
+ char(0),
+ char(96),
+ char(0),
+ char(14),
+ char(0),
+ char(97),
+ char(0),
+ char(4),
+ char(0),
+ char(98),
+ char(0),
+ char(0),
+ char(0),
+ char(99),
+ char(0),
+ char(46),
+ char(0),
+ char(25),
+ char(0),
+ char(9),
+ char(0),
+ char(100),
+ char(0),
+ char(9),
+ char(0),
+ char(101),
+ char(0),
+ char(25),
+ char(0),
+ char(102),
+ char(0),
+ char(0),
+ char(0),
+ char(35),
+ char(0),
+ char(18),
+ char(0),
+ char(103),
+ char(0),
+ char(18),
+ char(0),
+ char(104),
+ char(0),
+ char(14),
+ char(0),
+ char(105),
+ char(0),
+ char(14),
+ char(0),
+ char(106),
+ char(0),
+ char(14),
+ char(0),
+ char(107),
+ char(0),
+ char(8),
+ char(0),
+ char(108),
+ char(0),
+ char(8),
+ char(0),
+ char(109),
+ char(0),
+ char(8),
+ char(0),
+ char(110),
+ char(0),
+ char(8),
+ char(0),
+ char(111),
+ char(0),
+ char(8),
+ char(0),
+ char(112),
+ char(0),
+ char(8),
+ char(0),
+ char(113),
+ char(0),
+ char(8),
+ char(0),
+ char(114),
+ char(0),
+ char(8),
+ char(0),
+ char(115),
+ char(0),
+ char(4),
+ char(0),
+ char(116),
+ char(0),
+ char(4),
+ char(0),
+ char(117),
+ char(0),
+ char(4),
+ char(0),
+ char(118),
+ char(0),
+ char(4),
+ char(0),
+ char(119),
+ char(0),
+ char(4),
+ char(0),
+ char(120),
+ char(0),
+ char(4),
+ char(0),
+ char(121),
+ char(0),
+ char(4),
+ char(0),
+ char(122),
+ char(0),
+ char(0),
+ char(0),
+ char(37),
+ char(0),
+ char(47),
+ char(0),
+ char(25),
+ char(0),
+ char(9),
+ char(0),
+ char(100),
+ char(0),
+ char(9),
+ char(0),
+ char(101),
+ char(0),
+ char(25),
+ char(0),
+ char(102),
+ char(0),
+ char(0),
+ char(0),
+ char(35),
+ char(0),
+ char(17),
+ char(0),
+ char(103),
+ char(0),
+ char(17),
+ char(0),
+ char(104),
+ char(0),
+ char(13),
+ char(0),
+ char(105),
+ char(0),
+ char(13),
+ char(0),
+ char(106),
+ char(0),
+ char(13),
+ char(0),
+ char(107),
+ char(0),
+ char(7),
+ char(0),
+ char(108),
+ char(0),
+ char(7),
+ char(0),
+ char(109),
+ char(0),
+ char(7),
+ char(0),
+ char(110),
+ char(0),
+ char(7),
+ char(0),
+ char(111),
+ char(0),
+ char(7),
+ char(0),
+ char(112),
+ char(0),
+ char(7),
+ char(0),
+ char(113),
+ char(0),
+ char(7),
+ char(0),
+ char(114),
+ char(0),
+ char(7),
+ char(0),
+ char(115),
+ char(0),
+ char(4),
+ char(0),
+ char(116),
+ char(0),
+ char(4),
+ char(0),
+ char(117),
+ char(0),
+ char(4),
+ char(0),
+ char(118),
+ char(0),
+ char(4),
+ char(0),
+ char(119),
+ char(0),
+ char(4),
+ char(0),
+ char(120),
+ char(0),
+ char(4),
+ char(0),
+ char(121),
+ char(0),
+ char(4),
+ char(0),
+ char(122),
+ char(0),
+ char(0),
+ char(0),
+ char(37),
+ char(0),
+ char(48),
+ char(0),
+ char(2),
+ char(0),
+ char(49),
+ char(0),
+ char(123),
+ char(0),
+ char(14),
+ char(0),
+ char(124),
+ char(0),
+ char(50),
+ char(0),
+ char(2),
+ char(0),
+ char(51),
+ char(0),
+ char(123),
+ char(0),
+ char(13),
+ char(0),
+ char(124),
+ char(0),
+ char(52),
+ char(0),
+ char(21),
+ char(0),
+ char(47),
+ char(0),
+ char(125),
+ char(0),
+ char(15),
+ char(0),
+ char(126),
+ char(0),
+ char(13),
+ char(0),
+ char(127),
+ char(0),
+ char(13),
+ char(0),
+ char(-128),
+ char(0),
+ char(13),
+ char(0),
+ char(-127),
+ char(0),
+ char(13),
+ char(0),
+ char(-126),
+ char(0),
+ char(13),
+ char(0),
+ char(124),
+ char(0),
+ char(13),
+ char(0),
+ char(-125),
+ char(0),
+ char(13),
+ char(0),
+ char(-124),
+ char(0),
+ char(13),
+ char(0),
+ char(-123),
+ char(0),
+ char(13),
+ char(0),
+ char(-122),
+ char(0),
+ char(7),
+ char(0),
+ char(-121),
+ char(0),
+ char(7),
+ char(0),
+ char(-120),
+ char(0),
+ char(7),
+ char(0),
+ char(-119),
+ char(0),
+ char(7),
+ char(0),
+ char(-118),
+ char(0),
+ char(7),
+ char(0),
+ char(-117),
+ char(0),
+ char(7),
+ char(0),
+ char(-116),
+ char(0),
+ char(7),
+ char(0),
+ char(-115),
+ char(0),
+ char(7),
+ char(0),
+ char(-114),
+ char(0),
+ char(7),
+ char(0),
+ char(-113),
+ char(0),
+ char(4),
+ char(0),
+ char(-112),
+ char(0),
+ char(53),
+ char(0),
+ char(22),
+ char(0),
+ char(46),
+ char(0),
+ char(125),
+ char(0),
+ char(16),
+ char(0),
+ char(126),
+ char(0),
+ char(14),
+ char(0),
+ char(127),
+ char(0),
+ char(14),
+ char(0),
+ char(-128),
+ char(0),
+ char(14),
+ char(0),
+ char(-127),
+ char(0),
+ char(14),
+ char(0),
+ char(-126),
+ char(0),
+ char(14),
+ char(0),
+ char(124),
+ char(0),
+ char(14),
+ char(0),
+ char(-125),
+ char(0),
+ char(14),
+ char(0),
+ char(-124),
+ char(0),
+ char(14),
+ char(0),
+ char(-123),
+ char(0),
+ char(14),
+ char(0),
+ char(-122),
+ char(0),
+ char(8),
+ char(0),
+ char(-121),
+ char(0),
+ char(8),
+ char(0),
+ char(-120),
+ char(0),
+ char(8),
+ char(0),
+ char(-119),
+ char(0),
+ char(8),
+ char(0),
+ char(-118),
+ char(0),
+ char(8),
+ char(0),
+ char(-117),
+ char(0),
+ char(8),
+ char(0),
+ char(-116),
+ char(0),
+ char(8),
+ char(0),
+ char(-115),
+ char(0),
+ char(8),
+ char(0),
+ char(-114),
+ char(0),
+ char(8),
+ char(0),
+ char(-113),
+ char(0),
+ char(4),
+ char(0),
+ char(-112),
+ char(0),
+ char(0),
+ char(0),
+ char(37),
+ char(0),
+ char(54),
+ char(0),
+ char(2),
+ char(0),
+ char(4),
+ char(0),
+ char(-111),
+ char(0),
+ char(4),
+ char(0),
+ char(-110),
+ char(0),
+ char(55),
+ char(0),
+ char(13),
+ char(0),
+ char(56),
+ char(0),
+ char(-109),
+ char(0),
+ char(56),
+ char(0),
+ char(-108),
+ char(0),
+ char(0),
+ char(0),
+ char(35),
+ char(0),
+ char(4),
+ char(0),
+ char(-107),
+ char(0),
+ char(4),
+ char(0),
+ char(-106),
+ char(0),
+ char(4),
+ char(0),
+ char(-105),
+ char(0),
+ char(4),
+ char(0),
+ char(-104),
+ char(0),
+ char(7),
+ char(0),
+ char(-103),
+ char(0),
+ char(7),
+ char(0),
+ char(-102),
+ char(0),
+ char(4),
+ char(0),
+ char(-101),
+ char(0),
+ char(4),
+ char(0),
+ char(-100),
+ char(0),
+ char(7),
+ char(0),
+ char(-99),
+ char(0),
+ char(4),
+ char(0),
+ char(-98),
+ char(0),
+ char(57),
+ char(0),
+ char(3),
+ char(0),
+ char(55),
+ char(0),
+ char(-97),
+ char(0),
+ char(13),
+ char(0),
+ char(-96),
+ char(0),
+ char(13),
+ char(0),
+ char(-95),
+ char(0),
+ char(58),
+ char(0),
+ char(3),
+ char(0),
+ char(55),
+ char(0),
+ char(-97),
+ char(0),
+ char(14),
+ char(0),
+ char(-96),
+ char(0),
+ char(14),
+ char(0),
+ char(-95),
+ char(0),
+ char(59),
+ char(0),
+ char(13),
+ char(0),
+ char(55),
+ char(0),
+ char(-97),
+ char(0),
+ char(18),
+ char(0),
+ char(-94),
+ char(0),
+ char(18),
+ char(0),
+ char(-93),
+ char(0),
+ char(4),
+ char(0),
+ char(-92),
+ char(0),
+ char(4),
+ char(0),
+ char(-91),
+ char(0),
+ char(4),
+ char(0),
+ char(-90),
+ char(0),
+ char(7),
+ char(0),
+ char(-89),
+ char(0),
+ char(7),
+ char(0),
+ char(-88),
+ char(0),
+ char(7),
+ char(0),
+ char(-87),
+ char(0),
+ char(7),
+ char(0),
+ char(-86),
+ char(0),
+ char(7),
+ char(0),
+ char(-85),
+ char(0),
+ char(7),
+ char(0),
+ char(-84),
+ char(0),
+ char(7),
+ char(0),
+ char(-83),
+ char(0),
+ char(60),
+ char(0),
+ char(13),
+ char(0),
+ char(55),
+ char(0),
+ char(-97),
+ char(0),
+ char(17),
+ char(0),
+ char(-94),
+ char(0),
+ char(17),
+ char(0),
+ char(-93),
+ char(0),
+ char(4),
+ char(0),
+ char(-92),
+ char(0),
+ char(4),
+ char(0),
+ char(-91),
+ char(0),
+ char(4),
+ char(0),
+ char(-90),
+ char(0),
+ char(7),
+ char(0),
+ char(-89),
+ char(0),
+ char(7),
+ char(0),
+ char(-88),
+ char(0),
+ char(7),
+ char(0),
+ char(-87),
+ char(0),
+ char(7),
+ char(0),
+ char(-86),
+ char(0),
+ char(7),
+ char(0),
+ char(-85),
+ char(0),
+ char(7),
+ char(0),
+ char(-84),
+ char(0),
+ char(7),
+ char(0),
+ char(-83),
+ char(0),
+ char(61),
+ char(0),
+ char(11),
+ char(0),
+ char(55),
+ char(0),
+ char(-97),
+ char(0),
+ char(17),
+ char(0),
+ char(-94),
+ char(0),
+ char(17),
+ char(0),
+ char(-93),
+ char(0),
+ char(7),
+ char(0),
+ char(-82),
+ char(0),
+ char(7),
+ char(0),
+ char(-81),
+ char(0),
+ char(7),
+ char(0),
+ char(-80),
+ char(0),
+ char(7),
+ char(0),
+ char(-85),
+ char(0),
+ char(7),
+ char(0),
+ char(-84),
+ char(0),
+ char(7),
+ char(0),
+ char(-83),
+ char(0),
+ char(7),
+ char(0),
+ char(-79),
+ char(0),
+ char(0),
+ char(0),
+ char(21),
+ char(0),
+ char(62),
+ char(0),
+ char(9),
+ char(0),
+ char(55),
+ char(0),
+ char(-97),
+ char(0),
+ char(17),
+ char(0),
+ char(-94),
+ char(0),
+ char(17),
+ char(0),
+ char(-93),
+ char(0),
+ char(13),
+ char(0),
+ char(-78),
+ char(0),
+ char(13),
+ char(0),
+ char(-77),
+ char(0),
+ char(13),
+ char(0),
+ char(-76),
+ char(0),
+ char(13),
+ char(0),
+ char(-75),
+ char(0),
+ char(4),
+ char(0),
+ char(-74),
+ char(0),
+ char(4),
+ char(0),
+ char(-73),
+ char(0),
+ char(63),
+ char(0),
+ char(5),
+ char(0),
+ char(62),
+ char(0),
+ char(-72),
+ char(0),
+ char(4),
+ char(0),
+ char(-71),
+ char(0),
+ char(7),
+ char(0),
+ char(-70),
+ char(0),
+ char(7),
+ char(0),
+ char(-69),
+ char(0),
+ char(7),
+ char(0),
+ char(-68),
+ char(0),
+ char(64),
+ char(0),
+ char(9),
+ char(0),
+ char(55),
+ char(0),
+ char(-97),
+ char(0),
+ char(17),
+ char(0),
+ char(-94),
+ char(0),
+ char(17),
+ char(0),
+ char(-93),
+ char(0),
+ char(7),
+ char(0),
+ char(-78),
+ char(0),
+ char(7),
+ char(0),
+ char(-77),
+ char(0),
+ char(7),
+ char(0),
+ char(-76),
+ char(0),
+ char(7),
+ char(0),
+ char(-75),
+ char(0),
+ char(4),
+ char(0),
+ char(-74),
+ char(0),
+ char(4),
+ char(0),
+ char(-73),
+ char(0),
+ char(49),
+ char(0),
+ char(22),
+ char(0),
+ char(8),
+ char(0),
+ char(-67),
+ char(0),
+ char(8),
+ char(0),
+ char(-79),
+ char(0),
+ char(8),
+ char(0),
+ char(110),
+ char(0),
+ char(8),
+ char(0),
+ char(-66),
+ char(0),
+ char(8),
+ char(0),
+ char(112),
+ char(0),
+ char(8),
+ char(0),
+ char(-65),
+ char(0),
+ char(8),
+ char(0),
+ char(-64),
+ char(0),
+ char(8),
+ char(0),
+ char(-63),
+ char(0),
+ char(8),
+ char(0),
+ char(-62),
+ char(0),
+ char(8),
+ char(0),
+ char(-61),
+ char(0),
+ char(8),
+ char(0),
+ char(-60),
+ char(0),
+ char(8),
+ char(0),
+ char(-59),
+ char(0),
+ char(8),
+ char(0),
+ char(-58),
+ char(0),
+ char(8),
+ char(0),
+ char(-57),
+ char(0),
+ char(8),
+ char(0),
+ char(-56),
+ char(0),
+ char(8),
+ char(0),
+ char(-55),
+ char(0),
+ char(4),
+ char(0),
+ char(-54),
+ char(0),
+ char(4),
+ char(0),
+ char(-53),
+ char(0),
+ char(4),
+ char(0),
+ char(-52),
+ char(0),
+ char(4),
+ char(0),
+ char(-51),
+ char(0),
+ char(4),
+ char(0),
+ char(-50),
+ char(0),
+ char(0),
+ char(0),
+ char(37),
+ char(0),
+ char(51),
+ char(0),
+ char(22),
+ char(0),
+ char(7),
+ char(0),
+ char(-67),
+ char(0),
+ char(7),
+ char(0),
+ char(-79),
+ char(0),
+ char(7),
+ char(0),
+ char(110),
+ char(0),
+ char(7),
+ char(0),
+ char(-66),
+ char(0),
+ char(7),
+ char(0),
+ char(112),
+ char(0),
+ char(7),
+ char(0),
+ char(-65),
+ char(0),
+ char(7),
+ char(0),
+ char(-64),
+ char(0),
+ char(7),
+ char(0),
+ char(-63),
+ char(0),
+ char(7),
+ char(0),
+ char(-62),
+ char(0),
+ char(7),
+ char(0),
+ char(-61),
+ char(0),
+ char(7),
+ char(0),
+ char(-60),
+ char(0),
+ char(7),
+ char(0),
+ char(-59),
+ char(0),
+ char(7),
+ char(0),
+ char(-58),
+ char(0),
+ char(7),
+ char(0),
+ char(-57),
+ char(0),
+ char(7),
+ char(0),
+ char(-56),
+ char(0),
+ char(7),
+ char(0),
+ char(-55),
+ char(0),
+ char(4),
+ char(0),
+ char(-54),
+ char(0),
+ char(4),
+ char(0),
+ char(-53),
+ char(0),
+ char(4),
+ char(0),
+ char(-52),
+ char(0),
+ char(4),
+ char(0),
+ char(-51),
+ char(0),
+ char(4),
+ char(0),
+ char(-50),
+ char(0),
+ char(0),
+ char(0),
+ char(37),
+ char(0),
+ char(65),
+ char(0),
+ char(4),
+ char(0),
+ char(7),
+ char(0),
+ char(-49),
+ char(0),
+ char(7),
+ char(0),
+ char(-48),
+ char(0),
+ char(7),
+ char(0),
+ char(-47),
+ char(0),
+ char(4),
+ char(0),
+ char(78),
+ char(0),
+ char(66),
+ char(0),
+ char(10),
+ char(0),
+ char(65),
+ char(0),
+ char(-46),
+ char(0),
+ char(13),
+ char(0),
+ char(-45),
+ char(0),
+ char(13),
+ char(0),
+ char(-44),
+ char(0),
+ char(13),
+ char(0),
+ char(-43),
+ char(0),
+ char(13),
+ char(0),
+ char(-42),
+ char(0),
+ char(13),
+ char(0),
+ char(-41),
+ char(0),
+ char(7),
+ char(0),
+ char(-121),
+ char(0),
+ char(7),
+ char(0),
+ char(-40),
+ char(0),
+ char(4),
+ char(0),
+ char(-39),
+ char(0),
+ char(4),
+ char(0),
+ char(53),
+ char(0),
+ char(67),
+ char(0),
+ char(4),
+ char(0),
+ char(65),
+ char(0),
+ char(-46),
+ char(0),
+ char(4),
+ char(0),
+ char(-38),
+ char(0),
+ char(7),
+ char(0),
+ char(-37),
+ char(0),
+ char(4),
+ char(0),
+ char(-36),
+ char(0),
+ char(68),
+ char(0),
+ char(4),
+ char(0),
+ char(13),
+ char(0),
+ char(-41),
+ char(0),
+ char(65),
+ char(0),
+ char(-46),
+ char(0),
+ char(4),
+ char(0),
+ char(-35),
+ char(0),
+ char(7),
+ char(0),
+ char(-34),
+ char(0),
+ char(69),
+ char(0),
+ char(7),
+ char(0),
+ char(13),
+ char(0),
+ char(-33),
+ char(0),
+ char(65),
+ char(0),
+ char(-46),
+ char(0),
+ char(4),
+ char(0),
+ char(-32),
+ char(0),
+ char(7),
+ char(0),
+ char(-31),
+ char(0),
+ char(7),
+ char(0),
+ char(-30),
+ char(0),
+ char(7),
+ char(0),
+ char(-29),
+ char(0),
+ char(4),
+ char(0),
+ char(53),
+ char(0),
+ char(70),
+ char(0),
+ char(6),
+ char(0),
+ char(15),
+ char(0),
+ char(-28),
+ char(0),
+ char(13),
+ char(0),
+ char(-30),
+ char(0),
+ char(13),
+ char(0),
+ char(-27),
+ char(0),
+ char(56),
+ char(0),
+ char(-26),
+ char(0),
+ char(4),
+ char(0),
+ char(-25),
+ char(0),
+ char(7),
+ char(0),
+ char(-29),
+ char(0),
+ char(71),
+ char(0),
+ char(26),
+ char(0),
+ char(4),
+ char(0),
+ char(-24),
+ char(0),
+ char(7),
+ char(0),
+ char(-23),
+ char(0),
+ char(7),
+ char(0),
+ char(-79),
+ char(0),
+ char(7),
+ char(0),
+ char(-22),
+ char(0),
+ char(7),
+ char(0),
+ char(-21),
+ char(0),
+ char(7),
+ char(0),
+ char(-20),
+ char(0),
+ char(7),
+ char(0),
+ char(-19),
+ char(0),
+ char(7),
+ char(0),
+ char(-18),
+ char(0),
+ char(7),
+ char(0),
+ char(-17),
+ char(0),
+ char(7),
+ char(0),
+ char(-16),
+ char(0),
+ char(7),
+ char(0),
+ char(-15),
+ char(0),
+ char(7),
+ char(0),
+ char(-14),
+ char(0),
+ char(7),
+ char(0),
+ char(-13),
+ char(0),
+ char(7),
+ char(0),
+ char(-12),
+ char(0),
+ char(7),
+ char(0),
+ char(-11),
+ char(0),
+ char(7),
+ char(0),
+ char(-10),
+ char(0),
+ char(7),
+ char(0),
+ char(-9),
+ char(0),
+ char(7),
+ char(0),
+ char(-8),
+ char(0),
+ char(7),
+ char(0),
+ char(-7),
+ char(0),
+ char(7),
+ char(0),
+ char(-6),
+ char(0),
+ char(7),
+ char(0),
+ char(-5),
+ char(0),
+ char(4),
+ char(0),
+ char(-4),
+ char(0),
+ char(4),
+ char(0),
+ char(-3),
+ char(0),
+ char(4),
+ char(0),
+ char(-2),
+ char(0),
+ char(4),
+ char(0),
+ char(-1),
+ char(0),
+ char(4),
+ char(0),
+ char(117),
+ char(0),
+ char(72),
+ char(0),
+ char(12),
+ char(0),
+ char(15),
+ char(0),
+ char(0),
+ char(1),
+ char(15),
+ char(0),
+ char(1),
+ char(1),
+ char(15),
+ char(0),
+ char(2),
+ char(1),
+ char(13),
+ char(0),
+ char(3),
+ char(1),
+ char(13),
+ char(0),
+ char(4),
+ char(1),
+ char(7),
+ char(0),
+ char(5),
+ char(1),
+ char(4),
+ char(0),
+ char(6),
+ char(1),
+ char(4),
+ char(0),
+ char(7),
+ char(1),
+ char(4),
+ char(0),
+ char(8),
+ char(1),
+ char(4),
+ char(0),
+ char(9),
+ char(1),
+ char(7),
+ char(0),
+ char(-31),
+ char(0),
+ char(4),
+ char(0),
+ char(53),
+ char(0),
+ char(73),
+ char(0),
+ char(27),
+ char(0),
+ char(17),
+ char(0),
+ char(10),
+ char(1),
+ char(15),
+ char(0),
+ char(11),
+ char(1),
+ char(15),
+ char(0),
+ char(12),
+ char(1),
+ char(13),
+ char(0),
+ char(3),
+ char(1),
+ char(13),
+ char(0),
+ char(13),
+ char(1),
+ char(13),
+ char(0),
+ char(14),
+ char(1),
+ char(13),
+ char(0),
+ char(15),
+ char(1),
+ char(13),
+ char(0),
+ char(16),
+ char(1),
+ char(13),
+ char(0),
+ char(17),
+ char(1),
+ char(4),
+ char(0),
+ char(18),
+ char(1),
+ char(7),
+ char(0),
+ char(19),
+ char(1),
+ char(4),
+ char(0),
+ char(20),
+ char(1),
+ char(4),
+ char(0),
+ char(21),
+ char(1),
+ char(4),
+ char(0),
+ char(22),
+ char(1),
+ char(7),
+ char(0),
+ char(23),
+ char(1),
+ char(7),
+ char(0),
+ char(24),
+ char(1),
+ char(4),
+ char(0),
+ char(25),
+ char(1),
+ char(4),
+ char(0),
+ char(26),
+ char(1),
+ char(7),
+ char(0),
+ char(27),
+ char(1),
+ char(7),
+ char(0),
+ char(28),
+ char(1),
+ char(7),
+ char(0),
+ char(29),
+ char(1),
+ char(7),
+ char(0),
+ char(30),
+ char(1),
+ char(7),
+ char(0),
+ char(31),
+ char(1),
+ char(7),
+ char(0),
+ char(32),
+ char(1),
+ char(4),
+ char(0),
+ char(33),
+ char(1),
+ char(4),
+ char(0),
+ char(34),
+ char(1),
+ char(4),
+ char(0),
+ char(35),
+ char(1),
+ char(74),
+ char(0),
+ char(12),
+ char(0),
+ char(9),
+ char(0),
+ char(36),
+ char(1),
+ char(9),
+ char(0),
+ char(37),
+ char(1),
+ char(13),
+ char(0),
+ char(38),
+ char(1),
+ char(7),
+ char(0),
+ char(39),
+ char(1),
+ char(7),
+ char(0),
+ char(-63),
+ char(0),
+ char(7),
+ char(0),
+ char(40),
+ char(1),
+ char(4),
+ char(0),
+ char(41),
+ char(1),
+ char(13),
+ char(0),
+ char(42),
+ char(1),
+ char(4),
+ char(0),
+ char(43),
+ char(1),
+ char(4),
+ char(0),
+ char(44),
+ char(1),
+ char(4),
+ char(0),
+ char(45),
+ char(1),
+ char(4),
+ char(0),
+ char(53),
+ char(0),
+ char(75),
+ char(0),
+ char(19),
+ char(0),
+ char(47),
+ char(0),
+ char(125),
+ char(0),
+ char(72),
+ char(0),
+ char(46),
+ char(1),
+ char(65),
+ char(0),
+ char(47),
+ char(1),
+ char(66),
+ char(0),
+ char(48),
+ char(1),
+ char(67),
+ char(0),
+ char(49),
+ char(1),
+ char(68),
+ char(0),
+ char(50),
+ char(1),
+ char(69),
+ char(0),
+ char(51),
+ char(1),
+ char(70),
+ char(0),
+ char(52),
+ char(1),
+ char(73),
+ char(0),
+ char(53),
+ char(1),
+ char(74),
+ char(0),
+ char(54),
+ char(1),
+ char(4),
+ char(0),
+ char(55),
+ char(1),
+ char(4),
+ char(0),
+ char(21),
+ char(1),
+ char(4),
+ char(0),
+ char(56),
+ char(1),
+ char(4),
+ char(0),
+ char(57),
+ char(1),
+ char(4),
+ char(0),
+ char(58),
+ char(1),
+ char(4),
+ char(0),
+ char(59),
+ char(1),
+ char(4),
+ char(0),
+ char(60),
+ char(1),
+ char(4),
+ char(0),
+ char(61),
+ char(1),
+ char(71),
+ char(0),
+ char(62),
+ char(1),
+};
+int b3s_bulletDNAlen = sizeof(b3s_bulletDNAstr);
+char b3s_bulletDNAstr64[] = {
+ char(83),
+ char(68),
+ char(78),
+ char(65),
+ char(78),
+ char(65),
+ char(77),
+ char(69),
+ char(63),
+ char(1),
+ char(0),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(105),
+ char(122),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(97),
+ char(112),
+ char(97),
+ char(99),
+ char(105),
+ char(116),
+ char(121),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(100),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(79),
+ char(98),
+ char(106),
+ char(101),
+ char(99),
+ char(116),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(115),
+ char(0),
+ char(42),
+ char(102),
+ char(105),
+ char(114),
+ char(115),
+ char(116),
+ char(0),
+ char(42),
+ char(108),
+ char(97),
+ char(115),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(102),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(115),
+ char(91),
+ char(52),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(101),
+ char(108),
+ char(91),
+ char(51),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(98),
+ char(97),
+ char(115),
+ char(105),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(111),
+ char(114),
+ char(105),
+ char(103),
+ char(105),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(111),
+ char(111),
+ char(116),
+ char(78),
+ char(111),
+ char(100),
+ char(101),
+ char(73),
+ char(110),
+ char(100),
+ char(101),
+ char(120),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(117),
+ char(98),
+ char(116),
+ char(114),
+ char(101),
+ char(101),
+ char(83),
+ char(105),
+ char(122),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(113),
+ char(117),
+ char(97),
+ char(110),
+ char(116),
+ char(105),
+ char(122),
+ char(101),
+ char(100),
+ char(65),
+ char(97),
+ char(98),
+ char(98),
+ char(77),
+ char(105),
+ char(110),
+ char(91),
+ char(51),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(113),
+ char(117),
+ char(97),
+ char(110),
+ char(116),
+ char(105),
+ char(122),
+ char(101),
+ char(100),
+ char(65),
+ char(97),
+ char(98),
+ char(98),
+ char(77),
+ char(97),
+ char(120),
+ char(91),
+ char(51),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(97),
+ char(98),
+ char(98),
+ char(77),
+ char(105),
+ char(110),
+ char(79),
+ char(114),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(97),
+ char(98),
+ char(98),
+ char(77),
+ char(97),
+ char(120),
+ char(79),
+ char(114),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(101),
+ char(115),
+ char(99),
+ char(97),
+ char(112),
+ char(101),
+ char(73),
+ char(110),
+ char(100),
+ char(101),
+ char(120),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(117),
+ char(98),
+ char(80),
+ char(97),
+ char(114),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(116),
+ char(114),
+ char(105),
+ char(97),
+ char(110),
+ char(103),
+ char(108),
+ char(101),
+ char(73),
+ char(110),
+ char(100),
+ char(101),
+ char(120),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(97),
+ char(100),
+ char(91),
+ char(52),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(101),
+ char(115),
+ char(99),
+ char(97),
+ char(112),
+ char(101),
+ char(73),
+ char(110),
+ char(100),
+ char(101),
+ char(120),
+ char(79),
+ char(114),
+ char(84),
+ char(114),
+ char(105),
+ char(97),
+ char(110),
+ char(103),
+ char(108),
+ char(101),
+ char(73),
+ char(110),
+ char(100),
+ char(101),
+ char(120),
+ char(0),
+ char(109),
+ char(95),
+ char(98),
+ char(118),
+ char(104),
+ char(65),
+ char(97),
+ char(98),
+ char(98),
+ char(77),
+ char(105),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(98),
+ char(118),
+ char(104),
+ char(65),
+ char(97),
+ char(98),
+ char(98),
+ char(77),
+ char(97),
+ char(120),
+ char(0),
+ char(109),
+ char(95),
+ char(98),
+ char(118),
+ char(104),
+ char(81),
+ char(117),
+ char(97),
+ char(110),
+ char(116),
+ char(105),
+ char(122),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(117),
+ char(114),
+ char(78),
+ char(111),
+ char(100),
+ char(101),
+ char(73),
+ char(110),
+ char(100),
+ char(101),
+ char(120),
+ char(0),
+ char(109),
+ char(95),
+ char(117),
+ char(115),
+ char(101),
+ char(81),
+ char(117),
+ char(97),
+ char(110),
+ char(116),
+ char(105),
+ char(122),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(67),
+ char(111),
+ char(110),
+ char(116),
+ char(105),
+ char(103),
+ char(117),
+ char(111),
+ char(117),
+ char(115),
+ char(76),
+ char(101),
+ char(97),
+ char(102),
+ char(78),
+ char(111),
+ char(100),
+ char(101),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(81),
+ char(117),
+ char(97),
+ char(110),
+ char(116),
+ char(105),
+ char(122),
+ char(101),
+ char(100),
+ char(67),
+ char(111),
+ char(110),
+ char(116),
+ char(105),
+ char(103),
+ char(117),
+ char(111),
+ char(117),
+ char(115),
+ char(78),
+ char(111),
+ char(100),
+ char(101),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(110),
+ char(116),
+ char(105),
+ char(103),
+ char(117),
+ char(111),
+ char(117),
+ char(115),
+ char(78),
+ char(111),
+ char(100),
+ char(101),
+ char(115),
+ char(80),
+ char(116),
+ char(114),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(113),
+ char(117),
+ char(97),
+ char(110),
+ char(116),
+ char(105),
+ char(122),
+ char(101),
+ char(100),
+ char(67),
+ char(111),
+ char(110),
+ char(116),
+ char(105),
+ char(103),
+ char(117),
+ char(111),
+ char(117),
+ char(115),
+ char(78),
+ char(111),
+ char(100),
+ char(101),
+ char(115),
+ char(80),
+ char(116),
+ char(114),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(115),
+ char(117),
+ char(98),
+ char(84),
+ char(114),
+ char(101),
+ char(101),
+ char(73),
+ char(110),
+ char(102),
+ char(111),
+ char(80),
+ char(116),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(116),
+ char(114),
+ char(97),
+ char(118),
+ char(101),
+ char(114),
+ char(115),
+ char(97),
+ char(108),
+ char(77),
+ char(111),
+ char(100),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(83),
+ char(117),
+ char(98),
+ char(116),
+ char(114),
+ char(101),
+ char(101),
+ char(72),
+ char(101),
+ char(97),
+ char(100),
+ char(101),
+ char(114),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(110),
+ char(97),
+ char(109),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(84),
+ char(121),
+ char(112),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(97),
+ char(100),
+ char(100),
+ char(105),
+ char(110),
+ char(103),
+ char(91),
+ char(52),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(111),
+ char(99),
+ char(97),
+ char(108),
+ char(83),
+ char(99),
+ char(97),
+ char(108),
+ char(105),
+ char(110),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(108),
+ char(97),
+ char(110),
+ char(101),
+ char(78),
+ char(111),
+ char(114),
+ char(109),
+ char(97),
+ char(108),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(108),
+ char(97),
+ char(110),
+ char(101),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(97),
+ char(110),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(109),
+ char(112),
+ char(108),
+ char(105),
+ char(99),
+ char(105),
+ char(116),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(105),
+ char(109),
+ char(101),
+ char(110),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(77),
+ char(97),
+ char(114),
+ char(103),
+ char(105),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(97),
+ char(100),
+ char(100),
+ char(105),
+ char(110),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(111),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(97),
+ char(100),
+ char(105),
+ char(117),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(110),
+ char(118),
+ char(101),
+ char(120),
+ char(73),
+ char(110),
+ char(116),
+ char(101),
+ char(114),
+ char(110),
+ char(97),
+ char(108),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(108),
+ char(111),
+ char(99),
+ char(97),
+ char(108),
+ char(80),
+ char(111),
+ char(115),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(65),
+ char(114),
+ char(114),
+ char(97),
+ char(121),
+ char(80),
+ char(116),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(111),
+ char(99),
+ char(97),
+ char(108),
+ char(80),
+ char(111),
+ char(115),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(65),
+ char(114),
+ char(114),
+ char(97),
+ char(121),
+ char(83),
+ char(105),
+ char(122),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(118),
+ char(97),
+ char(108),
+ char(117),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(97),
+ char(100),
+ char(91),
+ char(50),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(118),
+ char(97),
+ char(108),
+ char(117),
+ char(101),
+ char(115),
+ char(91),
+ char(51),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(97),
+ char(100),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(118),
+ char(101),
+ char(114),
+ char(116),
+ char(105),
+ char(99),
+ char(101),
+ char(115),
+ char(51),
+ char(102),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(118),
+ char(101),
+ char(114),
+ char(116),
+ char(105),
+ char(99),
+ char(101),
+ char(115),
+ char(51),
+ char(100),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(105),
+ char(110),
+ char(100),
+ char(105),
+ char(99),
+ char(101),
+ char(115),
+ char(51),
+ char(50),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(51),
+ char(105),
+ char(110),
+ char(100),
+ char(105),
+ char(99),
+ char(101),
+ char(115),
+ char(49),
+ char(54),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(51),
+ char(105),
+ char(110),
+ char(100),
+ char(105),
+ char(99),
+ char(101),
+ char(115),
+ char(56),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(105),
+ char(110),
+ char(100),
+ char(105),
+ char(99),
+ char(101),
+ char(115),
+ char(49),
+ char(54),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(84),
+ char(114),
+ char(105),
+ char(97),
+ char(110),
+ char(103),
+ char(108),
+ char(101),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(86),
+ char(101),
+ char(114),
+ char(116),
+ char(105),
+ char(99),
+ char(101),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(109),
+ char(101),
+ char(115),
+ char(104),
+ char(80),
+ char(97),
+ char(114),
+ char(116),
+ char(115),
+ char(80),
+ char(116),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(99),
+ char(97),
+ char(108),
+ char(105),
+ char(110),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(77),
+ char(101),
+ char(115),
+ char(104),
+ char(80),
+ char(97),
+ char(114),
+ char(116),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(109),
+ char(101),
+ char(115),
+ char(104),
+ char(73),
+ char(110),
+ char(116),
+ char(101),
+ char(114),
+ char(102),
+ char(97),
+ char(99),
+ char(101),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(113),
+ char(117),
+ char(97),
+ char(110),
+ char(116),
+ char(105),
+ char(122),
+ char(101),
+ char(100),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(66),
+ char(118),
+ char(104),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(113),
+ char(117),
+ char(97),
+ char(110),
+ char(116),
+ char(105),
+ char(122),
+ char(101),
+ char(100),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(66),
+ char(118),
+ char(104),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(116),
+ char(114),
+ char(105),
+ char(97),
+ char(110),
+ char(103),
+ char(108),
+ char(101),
+ char(73),
+ char(110),
+ char(102),
+ char(111),
+ char(77),
+ char(97),
+ char(112),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(97),
+ char(100),
+ char(51),
+ char(91),
+ char(52),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(116),
+ char(114),
+ char(105),
+ char(109),
+ char(101),
+ char(115),
+ char(104),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(109),
+ char(95),
+ char(116),
+ char(114),
+ char(97),
+ char(110),
+ char(115),
+ char(102),
+ char(111),
+ char(114),
+ char(109),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(99),
+ char(104),
+ char(105),
+ char(108),
+ char(100),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(104),
+ char(105),
+ char(108),
+ char(100),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(84),
+ char(121),
+ char(112),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(104),
+ char(105),
+ char(108),
+ char(100),
+ char(77),
+ char(97),
+ char(114),
+ char(103),
+ char(105),
+ char(110),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(99),
+ char(104),
+ char(105),
+ char(108),
+ char(100),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(80),
+ char(116),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(67),
+ char(104),
+ char(105),
+ char(108),
+ char(100),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(117),
+ char(112),
+ char(65),
+ char(120),
+ char(105),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(102),
+ char(108),
+ char(97),
+ char(103),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(101),
+ char(100),
+ char(103),
+ char(101),
+ char(86),
+ char(48),
+ char(86),
+ char(49),
+ char(65),
+ char(110),
+ char(103),
+ char(108),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(101),
+ char(100),
+ char(103),
+ char(101),
+ char(86),
+ char(49),
+ char(86),
+ char(50),
+ char(65),
+ char(110),
+ char(103),
+ char(108),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(101),
+ char(100),
+ char(103),
+ char(101),
+ char(86),
+ char(50),
+ char(86),
+ char(48),
+ char(65),
+ char(110),
+ char(103),
+ char(108),
+ char(101),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(104),
+ char(97),
+ char(115),
+ char(104),
+ char(84),
+ char(97),
+ char(98),
+ char(108),
+ char(101),
+ char(80),
+ char(116),
+ char(114),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(110),
+ char(101),
+ char(120),
+ char(116),
+ char(80),
+ char(116),
+ char(114),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(118),
+ char(97),
+ char(108),
+ char(117),
+ char(101),
+ char(65),
+ char(114),
+ char(114),
+ char(97),
+ char(121),
+ char(80),
+ char(116),
+ char(114),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(107),
+ char(101),
+ char(121),
+ char(65),
+ char(114),
+ char(114),
+ char(97),
+ char(121),
+ char(80),
+ char(116),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(110),
+ char(118),
+ char(101),
+ char(120),
+ char(69),
+ char(112),
+ char(115),
+ char(105),
+ char(108),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(108),
+ char(97),
+ char(110),
+ char(97),
+ char(114),
+ char(69),
+ char(112),
+ char(115),
+ char(105),
+ char(108),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(101),
+ char(113),
+ char(117),
+ char(97),
+ char(108),
+ char(86),
+ char(101),
+ char(114),
+ char(116),
+ char(101),
+ char(120),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(101),
+ char(100),
+ char(103),
+ char(101),
+ char(68),
+ char(105),
+ char(115),
+ char(116),
+ char(97),
+ char(110),
+ char(99),
+ char(101),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(122),
+ char(101),
+ char(114),
+ char(111),
+ char(65),
+ char(114),
+ char(101),
+ char(97),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(101),
+ char(120),
+ char(116),
+ char(83),
+ char(105),
+ char(122),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(104),
+ char(97),
+ char(115),
+ char(104),
+ char(84),
+ char(97),
+ char(98),
+ char(108),
+ char(101),
+ char(83),
+ char(105),
+ char(122),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(86),
+ char(97),
+ char(108),
+ char(117),
+ char(101),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(75),
+ char(101),
+ char(121),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(103),
+ char(105),
+ char(109),
+ char(112),
+ char(97),
+ char(99),
+ char(116),
+ char(83),
+ char(117),
+ char(98),
+ char(84),
+ char(121),
+ char(112),
+ char(101),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(117),
+ char(110),
+ char(115),
+ char(99),
+ char(97),
+ char(108),
+ char(101),
+ char(100),
+ char(80),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(115),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(80),
+ char(116),
+ char(114),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(117),
+ char(110),
+ char(115),
+ char(99),
+ char(97),
+ char(108),
+ char(101),
+ char(100),
+ char(80),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(115),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(80),
+ char(116),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(85),
+ char(110),
+ char(115),
+ char(99),
+ char(97),
+ char(108),
+ char(101),
+ char(100),
+ char(80),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(97),
+ char(100),
+ char(100),
+ char(105),
+ char(110),
+ char(103),
+ char(51),
+ char(91),
+ char(52),
+ char(93),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(98),
+ char(114),
+ char(111),
+ char(97),
+ char(100),
+ char(112),
+ char(104),
+ char(97),
+ char(115),
+ char(101),
+ char(72),
+ char(97),
+ char(110),
+ char(100),
+ char(108),
+ char(101),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(114),
+ char(111),
+ char(111),
+ char(116),
+ char(67),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(119),
+ char(111),
+ char(114),
+ char(108),
+ char(100),
+ char(84),
+ char(114),
+ char(97),
+ char(110),
+ char(115),
+ char(102),
+ char(111),
+ char(114),
+ char(109),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(110),
+ char(116),
+ char(101),
+ char(114),
+ char(112),
+ char(111),
+ char(108),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(87),
+ char(111),
+ char(114),
+ char(108),
+ char(100),
+ char(84),
+ char(114),
+ char(97),
+ char(110),
+ char(115),
+ char(102),
+ char(111),
+ char(114),
+ char(109),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(110),
+ char(116),
+ char(101),
+ char(114),
+ char(112),
+ char(111),
+ char(108),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(76),
+ char(105),
+ char(110),
+ char(101),
+ char(97),
+ char(114),
+ char(86),
+ char(101),
+ char(108),
+ char(111),
+ char(99),
+ char(105),
+ char(116),
+ char(121),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(110),
+ char(116),
+ char(101),
+ char(114),
+ char(112),
+ char(111),
+ char(108),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(65),
+ char(110),
+ char(103),
+ char(117),
+ char(108),
+ char(97),
+ char(114),
+ char(86),
+ char(101),
+ char(108),
+ char(111),
+ char(99),
+ char(105),
+ char(116),
+ char(121),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(110),
+ char(105),
+ char(115),
+ char(111),
+ char(116),
+ char(114),
+ char(111),
+ char(112),
+ char(105),
+ char(99),
+ char(70),
+ char(114),
+ char(105),
+ char(99),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(110),
+ char(116),
+ char(97),
+ char(99),
+ char(116),
+ char(80),
+ char(114),
+ char(111),
+ char(99),
+ char(101),
+ char(115),
+ char(115),
+ char(105),
+ char(110),
+ char(103),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(100),
+ char(101),
+ char(97),
+ char(99),
+ char(116),
+ char(105),
+ char(118),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(84),
+ char(105),
+ char(109),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(102),
+ char(114),
+ char(105),
+ char(99),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(110),
+ char(103),
+ char(70),
+ char(114),
+ char(105),
+ char(99),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(101),
+ char(115),
+ char(116),
+ char(105),
+ char(116),
+ char(117),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(104),
+ char(105),
+ char(116),
+ char(70),
+ char(114),
+ char(97),
+ char(99),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(99),
+ char(100),
+ char(83),
+ char(119),
+ char(101),
+ char(112),
+ char(116),
+ char(83),
+ char(112),
+ char(104),
+ char(101),
+ char(114),
+ char(101),
+ char(82),
+ char(97),
+ char(100),
+ char(105),
+ char(117),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(99),
+ char(100),
+ char(77),
+ char(111),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(104),
+ char(97),
+ char(115),
+ char(65),
+ char(110),
+ char(105),
+ char(115),
+ char(111),
+ char(116),
+ char(114),
+ char(111),
+ char(112),
+ char(105),
+ char(99),
+ char(70),
+ char(114),
+ char(105),
+ char(99),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(70),
+ char(108),
+ char(97),
+ char(103),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(115),
+ char(108),
+ char(97),
+ char(110),
+ char(100),
+ char(84),
+ char(97),
+ char(103),
+ char(49),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(109),
+ char(112),
+ char(97),
+ char(110),
+ char(105),
+ char(111),
+ char(110),
+ char(73),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(99),
+ char(116),
+ char(105),
+ char(118),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(83),
+ char(116),
+ char(97),
+ char(116),
+ char(101),
+ char(49),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(110),
+ char(116),
+ char(101),
+ char(114),
+ char(110),
+ char(97),
+ char(108),
+ char(84),
+ char(121),
+ char(112),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(104),
+ char(101),
+ char(99),
+ char(107),
+ char(67),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(100),
+ char(101),
+ char(87),
+ char(105),
+ char(116),
+ char(104),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(111),
+ char(108),
+ char(118),
+ char(101),
+ char(114),
+ char(73),
+ char(110),
+ char(102),
+ char(111),
+ char(0),
+ char(109),
+ char(95),
+ char(103),
+ char(114),
+ char(97),
+ char(118),
+ char(105),
+ char(116),
+ char(121),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(79),
+ char(98),
+ char(106),
+ char(101),
+ char(99),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(110),
+ char(118),
+ char(73),
+ char(110),
+ char(101),
+ char(114),
+ char(116),
+ char(105),
+ char(97),
+ char(84),
+ char(101),
+ char(110),
+ char(115),
+ char(111),
+ char(114),
+ char(87),
+ char(111),
+ char(114),
+ char(108),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(105),
+ char(110),
+ char(101),
+ char(97),
+ char(114),
+ char(86),
+ char(101),
+ char(108),
+ char(111),
+ char(99),
+ char(105),
+ char(116),
+ char(121),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(110),
+ char(103),
+ char(117),
+ char(108),
+ char(97),
+ char(114),
+ char(86),
+ char(101),
+ char(108),
+ char(111),
+ char(99),
+ char(105),
+ char(116),
+ char(121),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(110),
+ char(103),
+ char(117),
+ char(108),
+ char(97),
+ char(114),
+ char(70),
+ char(97),
+ char(99),
+ char(116),
+ char(111),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(105),
+ char(110),
+ char(101),
+ char(97),
+ char(114),
+ char(70),
+ char(97),
+ char(99),
+ char(116),
+ char(111),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(103),
+ char(114),
+ char(97),
+ char(118),
+ char(105),
+ char(116),
+ char(121),
+ char(95),
+ char(97),
+ char(99),
+ char(99),
+ char(101),
+ char(108),
+ char(101),
+ char(114),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(110),
+ char(118),
+ char(73),
+ char(110),
+ char(101),
+ char(114),
+ char(116),
+ char(105),
+ char(97),
+ char(76),
+ char(111),
+ char(99),
+ char(97),
+ char(108),
+ char(0),
+ char(109),
+ char(95),
+ char(116),
+ char(111),
+ char(116),
+ char(97),
+ char(108),
+ char(70),
+ char(111),
+ char(114),
+ char(99),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(116),
+ char(111),
+ char(116),
+ char(97),
+ char(108),
+ char(84),
+ char(111),
+ char(114),
+ char(113),
+ char(117),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(110),
+ char(118),
+ char(101),
+ char(114),
+ char(115),
+ char(101),
+ char(77),
+ char(97),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(105),
+ char(110),
+ char(101),
+ char(97),
+ char(114),
+ char(68),
+ char(97),
+ char(109),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(110),
+ char(103),
+ char(117),
+ char(108),
+ char(97),
+ char(114),
+ char(68),
+ char(97),
+ char(109),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(100),
+ char(100),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(97),
+ char(108),
+ char(68),
+ char(97),
+ char(109),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(70),
+ char(97),
+ char(99),
+ char(116),
+ char(111),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(100),
+ char(100),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(97),
+ char(108),
+ char(76),
+ char(105),
+ char(110),
+ char(101),
+ char(97),
+ char(114),
+ char(68),
+ char(97),
+ char(109),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(83),
+ char(113),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(100),
+ char(100),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(97),
+ char(108),
+ char(65),
+ char(110),
+ char(103),
+ char(117),
+ char(108),
+ char(97),
+ char(114),
+ char(68),
+ char(97),
+ char(109),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(83),
+ char(113),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(100),
+ char(100),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(97),
+ char(108),
+ char(65),
+ char(110),
+ char(103),
+ char(117),
+ char(108),
+ char(97),
+ char(114),
+ char(68),
+ char(97),
+ char(109),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(70),
+ char(97),
+ char(99),
+ char(116),
+ char(111),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(105),
+ char(110),
+ char(101),
+ char(97),
+ char(114),
+ char(83),
+ char(108),
+ char(101),
+ char(101),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(110),
+ char(103),
+ char(117),
+ char(108),
+ char(97),
+ char(114),
+ char(83),
+ char(108),
+ char(101),
+ char(101),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(100),
+ char(100),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(97),
+ char(108),
+ char(68),
+ char(97),
+ char(109),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(82),
+ char(111),
+ char(119),
+ char(115),
+ char(0),
+ char(110),
+ char(117),
+ char(98),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(114),
+ char(98),
+ char(65),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(114),
+ char(98),
+ char(66),
+ char(0),
+ char(109),
+ char(95),
+ char(111),
+ char(98),
+ char(106),
+ char(101),
+ char(99),
+ char(116),
+ char(84),
+ char(121),
+ char(112),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(117),
+ char(115),
+ char(101),
+ char(114),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(84),
+ char(121),
+ char(112),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(117),
+ char(115),
+ char(101),
+ char(114),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(73),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(101),
+ char(101),
+ char(100),
+ char(115),
+ char(70),
+ char(101),
+ char(101),
+ char(100),
+ char(98),
+ char(97),
+ char(99),
+ char(107),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(112),
+ char(112),
+ char(108),
+ char(105),
+ char(101),
+ char(100),
+ char(73),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(100),
+ char(98),
+ char(103),
+ char(68),
+ char(114),
+ char(97),
+ char(119),
+ char(83),
+ char(105),
+ char(122),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(100),
+ char(105),
+ char(115),
+ char(97),
+ char(98),
+ char(108),
+ char(101),
+ char(67),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(115),
+ char(66),
+ char(101),
+ char(116),
+ char(119),
+ char(101),
+ char(101),
+ char(110),
+ char(76),
+ char(105),
+ char(110),
+ char(107),
+ char(101),
+ char(100),
+ char(66),
+ char(111),
+ char(100),
+ char(105),
+ char(101),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(111),
+ char(118),
+ char(101),
+ char(114),
+ char(114),
+ char(105),
+ char(100),
+ char(101),
+ char(78),
+ char(117),
+ char(109),
+ char(83),
+ char(111),
+ char(108),
+ char(118),
+ char(101),
+ char(114),
+ char(73),
+ char(116),
+ char(101),
+ char(114),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(98),
+ char(114),
+ char(101),
+ char(97),
+ char(107),
+ char(105),
+ char(110),
+ char(103),
+ char(73),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(115),
+ char(69),
+ char(110),
+ char(97),
+ char(98),
+ char(108),
+ char(101),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(116),
+ char(121),
+ char(112),
+ char(101),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(105),
+ char(118),
+ char(111),
+ char(116),
+ char(73),
+ char(110),
+ char(65),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(105),
+ char(118),
+ char(111),
+ char(116),
+ char(73),
+ char(110),
+ char(66),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(98),
+ char(65),
+ char(70),
+ char(114),
+ char(97),
+ char(109),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(98),
+ char(66),
+ char(70),
+ char(114),
+ char(97),
+ char(109),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(117),
+ char(115),
+ char(101),
+ char(82),
+ char(101),
+ char(102),
+ char(101),
+ char(114),
+ char(101),
+ char(110),
+ char(99),
+ char(101),
+ char(70),
+ char(114),
+ char(97),
+ char(109),
+ char(101),
+ char(65),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(110),
+ char(103),
+ char(117),
+ char(108),
+ char(97),
+ char(114),
+ char(79),
+ char(110),
+ char(108),
+ char(121),
+ char(0),
+ char(109),
+ char(95),
+ char(101),
+ char(110),
+ char(97),
+ char(98),
+ char(108),
+ char(101),
+ char(65),
+ char(110),
+ char(103),
+ char(117),
+ char(108),
+ char(97),
+ char(114),
+ char(77),
+ char(111),
+ char(116),
+ char(111),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(109),
+ char(111),
+ char(116),
+ char(111),
+ char(114),
+ char(84),
+ char(97),
+ char(114),
+ char(103),
+ char(101),
+ char(116),
+ char(86),
+ char(101),
+ char(108),
+ char(111),
+ char(99),
+ char(105),
+ char(116),
+ char(121),
+ char(0),
+ char(109),
+ char(95),
+ char(109),
+ char(97),
+ char(120),
+ char(77),
+ char(111),
+ char(116),
+ char(111),
+ char(114),
+ char(73),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(111),
+ char(119),
+ char(101),
+ char(114),
+ char(76),
+ char(105),
+ char(109),
+ char(105),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(117),
+ char(112),
+ char(112),
+ char(101),
+ char(114),
+ char(76),
+ char(105),
+ char(109),
+ char(105),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(105),
+ char(109),
+ char(105),
+ char(116),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(110),
+ char(101),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(98),
+ char(105),
+ char(97),
+ char(115),
+ char(70),
+ char(97),
+ char(99),
+ char(116),
+ char(111),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(101),
+ char(108),
+ char(97),
+ char(120),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(70),
+ char(97),
+ char(99),
+ char(116),
+ char(111),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(119),
+ char(105),
+ char(110),
+ char(103),
+ char(83),
+ char(112),
+ char(97),
+ char(110),
+ char(49),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(119),
+ char(105),
+ char(110),
+ char(103),
+ char(83),
+ char(112),
+ char(97),
+ char(110),
+ char(50),
+ char(0),
+ char(109),
+ char(95),
+ char(116),
+ char(119),
+ char(105),
+ char(115),
+ char(116),
+ char(83),
+ char(112),
+ char(97),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(100),
+ char(97),
+ char(109),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(105),
+ char(110),
+ char(101),
+ char(97),
+ char(114),
+ char(85),
+ char(112),
+ char(112),
+ char(101),
+ char(114),
+ char(76),
+ char(105),
+ char(109),
+ char(105),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(105),
+ char(110),
+ char(101),
+ char(97),
+ char(114),
+ char(76),
+ char(111),
+ char(119),
+ char(101),
+ char(114),
+ char(76),
+ char(105),
+ char(109),
+ char(105),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(110),
+ char(103),
+ char(117),
+ char(108),
+ char(97),
+ char(114),
+ char(85),
+ char(112),
+ char(112),
+ char(101),
+ char(114),
+ char(76),
+ char(105),
+ char(109),
+ char(105),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(110),
+ char(103),
+ char(117),
+ char(108),
+ char(97),
+ char(114),
+ char(76),
+ char(111),
+ char(119),
+ char(101),
+ char(114),
+ char(76),
+ char(105),
+ char(109),
+ char(105),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(117),
+ char(115),
+ char(101),
+ char(76),
+ char(105),
+ char(110),
+ char(101),
+ char(97),
+ char(114),
+ char(82),
+ char(101),
+ char(102),
+ char(101),
+ char(114),
+ char(101),
+ char(110),
+ char(99),
+ char(101),
+ char(70),
+ char(114),
+ char(97),
+ char(109),
+ char(101),
+ char(65),
+ char(0),
+ char(109),
+ char(95),
+ char(117),
+ char(115),
+ char(101),
+ char(79),
+ char(102),
+ char(102),
+ char(115),
+ char(101),
+ char(116),
+ char(70),
+ char(111),
+ char(114),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(70),
+ char(114),
+ char(97),
+ char(109),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(54),
+ char(100),
+ char(111),
+ char(102),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(112),
+ char(114),
+ char(105),
+ char(110),
+ char(103),
+ char(69),
+ char(110),
+ char(97),
+ char(98),
+ char(108),
+ char(101),
+ char(100),
+ char(91),
+ char(54),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(101),
+ char(113),
+ char(117),
+ char(105),
+ char(108),
+ char(105),
+ char(98),
+ char(114),
+ char(105),
+ char(117),
+ char(109),
+ char(80),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(91),
+ char(54),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(112),
+ char(114),
+ char(105),
+ char(110),
+ char(103),
+ char(83),
+ char(116),
+ char(105),
+ char(102),
+ char(102),
+ char(110),
+ char(101),
+ char(115),
+ char(115),
+ char(91),
+ char(54),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(112),
+ char(114),
+ char(105),
+ char(110),
+ char(103),
+ char(68),
+ char(97),
+ char(109),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(91),
+ char(54),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(116),
+ char(97),
+ char(117),
+ char(0),
+ char(109),
+ char(95),
+ char(116),
+ char(105),
+ char(109),
+ char(101),
+ char(83),
+ char(116),
+ char(101),
+ char(112),
+ char(0),
+ char(109),
+ char(95),
+ char(109),
+ char(97),
+ char(120),
+ char(69),
+ char(114),
+ char(114),
+ char(111),
+ char(114),
+ char(82),
+ char(101),
+ char(100),
+ char(117),
+ char(99),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(111),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(101),
+ char(114),
+ char(112),
+ char(0),
+ char(109),
+ char(95),
+ char(101),
+ char(114),
+ char(112),
+ char(50),
+ char(0),
+ char(109),
+ char(95),
+ char(103),
+ char(108),
+ char(111),
+ char(98),
+ char(97),
+ char(108),
+ char(67),
+ char(102),
+ char(109),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(112),
+ char(108),
+ char(105),
+ char(116),
+ char(73),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(80),
+ char(101),
+ char(110),
+ char(101),
+ char(116),
+ char(114),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(112),
+ char(108),
+ char(105),
+ char(116),
+ char(73),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(84),
+ char(117),
+ char(114),
+ char(110),
+ char(69),
+ char(114),
+ char(112),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(105),
+ char(110),
+ char(101),
+ char(97),
+ char(114),
+ char(83),
+ char(108),
+ char(111),
+ char(112),
+ char(0),
+ char(109),
+ char(95),
+ char(119),
+ char(97),
+ char(114),
+ char(109),
+ char(115),
+ char(116),
+ char(97),
+ char(114),
+ char(116),
+ char(105),
+ char(110),
+ char(103),
+ char(70),
+ char(97),
+ char(99),
+ char(116),
+ char(111),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(109),
+ char(97),
+ char(120),
+ char(71),
+ char(121),
+ char(114),
+ char(111),
+ char(115),
+ char(99),
+ char(111),
+ char(112),
+ char(105),
+ char(99),
+ char(70),
+ char(111),
+ char(114),
+ char(99),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(105),
+ char(110),
+ char(103),
+ char(108),
+ char(101),
+ char(65),
+ char(120),
+ char(105),
+ char(115),
+ char(82),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(110),
+ char(103),
+ char(70),
+ char(114),
+ char(105),
+ char(99),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(73),
+ char(116),
+ char(101),
+ char(114),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(111),
+ char(108),
+ char(118),
+ char(101),
+ char(114),
+ char(77),
+ char(111),
+ char(100),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(101),
+ char(115),
+ char(116),
+ char(105),
+ char(110),
+ char(103),
+ char(67),
+ char(111),
+ char(110),
+ char(116),
+ char(97),
+ char(99),
+ char(116),
+ char(82),
+ char(101),
+ char(115),
+ char(116),
+ char(105),
+ char(116),
+ char(117),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(84),
+ char(104),
+ char(114),
+ char(101),
+ char(115),
+ char(104),
+ char(111),
+ char(108),
+ char(100),
+ char(0),
+ char(109),
+ char(95),
+ char(109),
+ char(105),
+ char(110),
+ char(105),
+ char(109),
+ char(117),
+ char(109),
+ char(83),
+ char(111),
+ char(108),
+ char(118),
+ char(101),
+ char(114),
+ char(66),
+ char(97),
+ char(116),
+ char(99),
+ char(104),
+ char(83),
+ char(105),
+ char(122),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(112),
+ char(108),
+ char(105),
+ char(116),
+ char(73),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(105),
+ char(110),
+ char(101),
+ char(97),
+ char(114),
+ char(83),
+ char(116),
+ char(105),
+ char(102),
+ char(102),
+ char(110),
+ char(101),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(110),
+ char(103),
+ char(117),
+ char(108),
+ char(97),
+ char(114),
+ char(83),
+ char(116),
+ char(105),
+ char(102),
+ char(102),
+ char(110),
+ char(101),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(118),
+ char(111),
+ char(108),
+ char(117),
+ char(109),
+ char(101),
+ char(83),
+ char(116),
+ char(105),
+ char(102),
+ char(102),
+ char(110),
+ char(101),
+ char(115),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(109),
+ char(97),
+ char(116),
+ char(101),
+ char(114),
+ char(105),
+ char(97),
+ char(108),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(111),
+ char(115),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(114),
+ char(101),
+ char(118),
+ char(105),
+ char(111),
+ char(117),
+ char(115),
+ char(80),
+ char(111),
+ char(115),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(118),
+ char(101),
+ char(108),
+ char(111),
+ char(99),
+ char(105),
+ char(116),
+ char(121),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(99),
+ char(99),
+ char(117),
+ char(109),
+ char(117),
+ char(108),
+ char(97),
+ char(116),
+ char(101),
+ char(100),
+ char(70),
+ char(111),
+ char(114),
+ char(99),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(111),
+ char(114),
+ char(109),
+ char(97),
+ char(108),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(114),
+ char(101),
+ char(97),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(116),
+ char(116),
+ char(97),
+ char(99),
+ char(104),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(111),
+ char(100),
+ char(101),
+ char(73),
+ char(110),
+ char(100),
+ char(105),
+ char(99),
+ char(101),
+ char(115),
+ char(91),
+ char(50),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(101),
+ char(115),
+ char(116),
+ char(76),
+ char(101),
+ char(110),
+ char(103),
+ char(116),
+ char(104),
+ char(0),
+ char(109),
+ char(95),
+ char(98),
+ char(98),
+ char(101),
+ char(110),
+ char(100),
+ char(105),
+ char(110),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(111),
+ char(100),
+ char(101),
+ char(73),
+ char(110),
+ char(100),
+ char(105),
+ char(99),
+ char(101),
+ char(115),
+ char(91),
+ char(51),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(101),
+ char(115),
+ char(116),
+ char(65),
+ char(114),
+ char(101),
+ char(97),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(48),
+ char(91),
+ char(52),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(111),
+ char(100),
+ char(101),
+ char(73),
+ char(110),
+ char(100),
+ char(105),
+ char(99),
+ char(101),
+ char(115),
+ char(91),
+ char(52),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(101),
+ char(115),
+ char(116),
+ char(86),
+ char(111),
+ char(108),
+ char(117),
+ char(109),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(49),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(50),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(48),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(111),
+ char(99),
+ char(97),
+ char(108),
+ char(70),
+ char(114),
+ char(97),
+ char(109),
+ char(101),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(114),
+ char(105),
+ char(103),
+ char(105),
+ char(100),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(111),
+ char(100),
+ char(101),
+ char(73),
+ char(110),
+ char(100),
+ char(101),
+ char(120),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(101),
+ char(114),
+ char(111),
+ char(77),
+ char(111),
+ char(100),
+ char(101),
+ char(108),
+ char(0),
+ char(109),
+ char(95),
+ char(98),
+ char(97),
+ char(117),
+ char(109),
+ char(103),
+ char(97),
+ char(114),
+ char(116),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(100),
+ char(114),
+ char(97),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(105),
+ char(102),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(114),
+ char(101),
+ char(115),
+ char(115),
+ char(117),
+ char(114),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(118),
+ char(111),
+ char(108),
+ char(117),
+ char(109),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(100),
+ char(121),
+ char(110),
+ char(97),
+ char(109),
+ char(105),
+ char(99),
+ char(70),
+ char(114),
+ char(105),
+ char(99),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(111),
+ char(115),
+ char(101),
+ char(77),
+ char(97),
+ char(116),
+ char(99),
+ char(104),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(105),
+ char(103),
+ char(105),
+ char(100),
+ char(67),
+ char(111),
+ char(110),
+ char(116),
+ char(97),
+ char(99),
+ char(116),
+ char(72),
+ char(97),
+ char(114),
+ char(100),
+ char(110),
+ char(101),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(107),
+ char(105),
+ char(110),
+ char(101),
+ char(116),
+ char(105),
+ char(99),
+ char(67),
+ char(111),
+ char(110),
+ char(116),
+ char(97),
+ char(99),
+ char(116),
+ char(72),
+ char(97),
+ char(114),
+ char(100),
+ char(110),
+ char(101),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(111),
+ char(102),
+ char(116),
+ char(67),
+ char(111),
+ char(110),
+ char(116),
+ char(97),
+ char(99),
+ char(116),
+ char(72),
+ char(97),
+ char(114),
+ char(100),
+ char(110),
+ char(101),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(110),
+ char(99),
+ char(104),
+ char(111),
+ char(114),
+ char(72),
+ char(97),
+ char(114),
+ char(100),
+ char(110),
+ char(101),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(111),
+ char(102),
+ char(116),
+ char(82),
+ char(105),
+ char(103),
+ char(105),
+ char(100),
+ char(67),
+ char(108),
+ char(117),
+ char(115),
+ char(116),
+ char(101),
+ char(114),
+ char(72),
+ char(97),
+ char(114),
+ char(100),
+ char(110),
+ char(101),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(111),
+ char(102),
+ char(116),
+ char(75),
+ char(105),
+ char(110),
+ char(101),
+ char(116),
+ char(105),
+ char(99),
+ char(67),
+ char(108),
+ char(117),
+ char(115),
+ char(116),
+ char(101),
+ char(114),
+ char(72),
+ char(97),
+ char(114),
+ char(100),
+ char(110),
+ char(101),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(111),
+ char(102),
+ char(116),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(67),
+ char(108),
+ char(117),
+ char(115),
+ char(116),
+ char(101),
+ char(114),
+ char(72),
+ char(97),
+ char(114),
+ char(100),
+ char(110),
+ char(101),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(111),
+ char(102),
+ char(116),
+ char(82),
+ char(105),
+ char(103),
+ char(105),
+ char(100),
+ char(67),
+ char(108),
+ char(117),
+ char(115),
+ char(116),
+ char(101),
+ char(114),
+ char(73),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(83),
+ char(112),
+ char(108),
+ char(105),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(111),
+ char(102),
+ char(116),
+ char(75),
+ char(105),
+ char(110),
+ char(101),
+ char(116),
+ char(105),
+ char(99),
+ char(67),
+ char(108),
+ char(117),
+ char(115),
+ char(116),
+ char(101),
+ char(114),
+ char(73),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(83),
+ char(112),
+ char(108),
+ char(105),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(111),
+ char(102),
+ char(116),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(67),
+ char(108),
+ char(117),
+ char(115),
+ char(116),
+ char(101),
+ char(114),
+ char(73),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(83),
+ char(112),
+ char(108),
+ char(105),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(109),
+ char(97),
+ char(120),
+ char(86),
+ char(111),
+ char(108),
+ char(117),
+ char(109),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(116),
+ char(105),
+ char(109),
+ char(101),
+ char(83),
+ char(99),
+ char(97),
+ char(108),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(118),
+ char(101),
+ char(108),
+ char(111),
+ char(99),
+ char(105),
+ char(116),
+ char(121),
+ char(73),
+ char(116),
+ char(101),
+ char(114),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(112),
+ char(111),
+ char(115),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(73),
+ char(116),
+ char(101),
+ char(114),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(100),
+ char(114),
+ char(105),
+ char(102),
+ char(116),
+ char(73),
+ char(116),
+ char(101),
+ char(114),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(108),
+ char(117),
+ char(115),
+ char(116),
+ char(101),
+ char(114),
+ char(73),
+ char(116),
+ char(101),
+ char(114),
+ char(97),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(111),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(99),
+ char(97),
+ char(108),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(113),
+ char(113),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(109),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(112),
+ char(111),
+ char(115),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(119),
+ char(101),
+ char(105),
+ char(103),
+ char(104),
+ char(116),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(80),
+ char(111),
+ char(115),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(87),
+ char(101),
+ char(105),
+ char(103),
+ char(116),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(98),
+ char(118),
+ char(111),
+ char(108),
+ char(117),
+ char(109),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(98),
+ char(102),
+ char(114),
+ char(97),
+ char(109),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(102),
+ char(114),
+ char(97),
+ char(109),
+ char(101),
+ char(120),
+ char(102),
+ char(111),
+ char(114),
+ char(109),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(111),
+ char(99),
+ char(105),
+ char(105),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(110),
+ char(118),
+ char(119),
+ char(105),
+ char(0),
+ char(109),
+ char(95),
+ char(118),
+ char(105),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(115),
+ char(91),
+ char(50),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(100),
+ char(105),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(115),
+ char(91),
+ char(50),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(118),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(118),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(102),
+ char(114),
+ char(97),
+ char(109),
+ char(101),
+ char(114),
+ char(101),
+ char(102),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(110),
+ char(111),
+ char(100),
+ char(101),
+ char(73),
+ char(110),
+ char(100),
+ char(105),
+ char(99),
+ char(101),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(109),
+ char(97),
+ char(115),
+ char(115),
+ char(101),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(70),
+ char(114),
+ char(97),
+ char(109),
+ char(101),
+ char(82),
+ char(101),
+ char(102),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(78),
+ char(111),
+ char(100),
+ char(101),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(77),
+ char(97),
+ char(115),
+ char(115),
+ char(101),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(100),
+ char(109),
+ char(97),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(105),
+ char(109),
+ char(97),
+ char(115),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(118),
+ char(105),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(100),
+ char(105),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(100),
+ char(97),
+ char(109),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(108),
+ char(100),
+ char(97),
+ char(109),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(97),
+ char(100),
+ char(97),
+ char(109),
+ char(112),
+ char(105),
+ char(110),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(109),
+ char(97),
+ char(116),
+ char(99),
+ char(104),
+ char(105),
+ char(110),
+ char(103),
+ char(0),
+ char(109),
+ char(95),
+ char(109),
+ char(97),
+ char(120),
+ char(83),
+ char(101),
+ char(108),
+ char(102),
+ char(67),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(73),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(101),
+ char(108),
+ char(102),
+ char(67),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(73),
+ char(109),
+ char(112),
+ char(117),
+ char(108),
+ char(115),
+ char(101),
+ char(70),
+ char(97),
+ char(99),
+ char(116),
+ char(111),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(110),
+ char(116),
+ char(97),
+ char(105),
+ char(110),
+ char(115),
+ char(65),
+ char(110),
+ char(99),
+ char(104),
+ char(111),
+ char(114),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(100),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(108),
+ char(117),
+ char(115),
+ char(116),
+ char(101),
+ char(114),
+ char(73),
+ char(110),
+ char(100),
+ char(101),
+ char(120),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(98),
+ char(111),
+ char(100),
+ char(121),
+ char(65),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(98),
+ char(111),
+ char(100),
+ char(121),
+ char(66),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(101),
+ char(102),
+ char(115),
+ char(91),
+ char(50),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(102),
+ char(109),
+ char(0),
+ char(109),
+ char(95),
+ char(115),
+ char(112),
+ char(108),
+ char(105),
+ char(116),
+ char(0),
+ char(109),
+ char(95),
+ char(100),
+ char(101),
+ char(108),
+ char(101),
+ char(116),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(114),
+ char(101),
+ char(108),
+ char(80),
+ char(111),
+ char(115),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(91),
+ char(50),
+ char(93),
+ char(0),
+ char(109),
+ char(95),
+ char(98),
+ char(111),
+ char(100),
+ char(121),
+ char(65),
+ char(116),
+ char(121),
+ char(112),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(98),
+ char(111),
+ char(100),
+ char(121),
+ char(66),
+ char(116),
+ char(121),
+ char(112),
+ char(101),
+ char(0),
+ char(109),
+ char(95),
+ char(106),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(84),
+ char(121),
+ char(112),
+ char(101),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(112),
+ char(111),
+ char(115),
+ char(101),
+ char(0),
+ char(42),
+ char(42),
+ char(109),
+ char(95),
+ char(109),
+ char(97),
+ char(116),
+ char(101),
+ char(114),
+ char(105),
+ char(97),
+ char(108),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(110),
+ char(111),
+ char(100),
+ char(101),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(108),
+ char(105),
+ char(110),
+ char(107),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(102),
+ char(97),
+ char(99),
+ char(101),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(116),
+ char(101),
+ char(116),
+ char(114),
+ char(97),
+ char(104),
+ char(101),
+ char(100),
+ char(114),
+ char(97),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(97),
+ char(110),
+ char(99),
+ char(104),
+ char(111),
+ char(114),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(99),
+ char(108),
+ char(117),
+ char(115),
+ char(116),
+ char(101),
+ char(114),
+ char(115),
+ char(0),
+ char(42),
+ char(109),
+ char(95),
+ char(106),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(77),
+ char(97),
+ char(116),
+ char(101),
+ char(114),
+ char(105),
+ char(97),
+ char(108),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(76),
+ char(105),
+ char(110),
+ char(107),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(70),
+ char(97),
+ char(99),
+ char(101),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(84),
+ char(101),
+ char(116),
+ char(114),
+ char(97),
+ char(104),
+ char(101),
+ char(100),
+ char(114),
+ char(97),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(65),
+ char(110),
+ char(99),
+ char(104),
+ char(111),
+ char(114),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(67),
+ char(108),
+ char(117),
+ char(115),
+ char(116),
+ char(101),
+ char(114),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(110),
+ char(117),
+ char(109),
+ char(74),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(115),
+ char(0),
+ char(109),
+ char(95),
+ char(99),
+ char(111),
+ char(110),
+ char(102),
+ char(105),
+ char(103),
+ char(0),
+ char(84),
+ char(89),
+ char(80),
+ char(69),
+ char(76),
+ char(0),
+ char(0),
+ char(0),
+ char(99),
+ char(104),
+ char(97),
+ char(114),
+ char(0),
+ char(117),
+ char(99),
+ char(104),
+ char(97),
+ char(114),
+ char(0),
+ char(115),
+ char(104),
+ char(111),
+ char(114),
+ char(116),
+ char(0),
+ char(117),
+ char(115),
+ char(104),
+ char(111),
+ char(114),
+ char(116),
+ char(0),
+ char(105),
+ char(110),
+ char(116),
+ char(0),
+ char(108),
+ char(111),
+ char(110),
+ char(103),
+ char(0),
+ char(117),
+ char(108),
+ char(111),
+ char(110),
+ char(103),
+ char(0),
+ char(102),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(0),
+ char(100),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(0),
+ char(118),
+ char(111),
+ char(105),
+ char(100),
+ char(0),
+ char(80),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(101),
+ char(114),
+ char(65),
+ char(114),
+ char(114),
+ char(97),
+ char(121),
+ char(0),
+ char(98),
+ char(116),
+ char(80),
+ char(104),
+ char(121),
+ char(115),
+ char(105),
+ char(99),
+ char(115),
+ char(83),
+ char(121),
+ char(115),
+ char(116),
+ char(101),
+ char(109),
+ char(0),
+ char(76),
+ char(105),
+ char(115),
+ char(116),
+ char(66),
+ char(97),
+ char(115),
+ char(101),
+ char(0),
+ char(98),
+ char(116),
+ char(86),
+ char(101),
+ char(99),
+ char(116),
+ char(111),
+ char(114),
+ char(51),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(86),
+ char(101),
+ char(99),
+ char(116),
+ char(111),
+ char(114),
+ char(51),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(77),
+ char(97),
+ char(116),
+ char(114),
+ char(105),
+ char(120),
+ char(51),
+ char(120),
+ char(51),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(77),
+ char(97),
+ char(116),
+ char(114),
+ char(105),
+ char(120),
+ char(51),
+ char(120),
+ char(51),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(84),
+ char(114),
+ char(97),
+ char(110),
+ char(115),
+ char(102),
+ char(111),
+ char(114),
+ char(109),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(84),
+ char(114),
+ char(97),
+ char(110),
+ char(115),
+ char(102),
+ char(111),
+ char(114),
+ char(109),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(66),
+ char(118),
+ char(104),
+ char(83),
+ char(117),
+ char(98),
+ char(116),
+ char(114),
+ char(101),
+ char(101),
+ char(73),
+ char(110),
+ char(102),
+ char(111),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(79),
+ char(112),
+ char(116),
+ char(105),
+ char(109),
+ char(105),
+ char(122),
+ char(101),
+ char(100),
+ char(66),
+ char(118),
+ char(104),
+ char(78),
+ char(111),
+ char(100),
+ char(101),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(79),
+ char(112),
+ char(116),
+ char(105),
+ char(109),
+ char(105),
+ char(122),
+ char(101),
+ char(100),
+ char(66),
+ char(118),
+ char(104),
+ char(78),
+ char(111),
+ char(100),
+ char(101),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(81),
+ char(117),
+ char(97),
+ char(110),
+ char(116),
+ char(105),
+ char(122),
+ char(101),
+ char(100),
+ char(66),
+ char(118),
+ char(104),
+ char(78),
+ char(111),
+ char(100),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(81),
+ char(117),
+ char(97),
+ char(110),
+ char(116),
+ char(105),
+ char(122),
+ char(101),
+ char(100),
+ char(66),
+ char(118),
+ char(104),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(81),
+ char(117),
+ char(97),
+ char(110),
+ char(116),
+ char(105),
+ char(122),
+ char(101),
+ char(100),
+ char(66),
+ char(118),
+ char(104),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(83),
+ char(116),
+ char(97),
+ char(116),
+ char(105),
+ char(99),
+ char(80),
+ char(108),
+ char(97),
+ char(110),
+ char(101),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(111),
+ char(110),
+ char(118),
+ char(101),
+ char(120),
+ char(73),
+ char(110),
+ char(116),
+ char(101),
+ char(114),
+ char(110),
+ char(97),
+ char(108),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(80),
+ char(111),
+ char(115),
+ char(105),
+ char(116),
+ char(105),
+ char(111),
+ char(110),
+ char(65),
+ char(110),
+ char(100),
+ char(82),
+ char(97),
+ char(100),
+ char(105),
+ char(117),
+ char(115),
+ char(0),
+ char(98),
+ char(116),
+ char(77),
+ char(117),
+ char(108),
+ char(116),
+ char(105),
+ char(83),
+ char(112),
+ char(104),
+ char(101),
+ char(114),
+ char(101),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(73),
+ char(110),
+ char(116),
+ char(73),
+ char(110),
+ char(100),
+ char(101),
+ char(120),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(83),
+ char(104),
+ char(111),
+ char(114),
+ char(116),
+ char(73),
+ char(110),
+ char(116),
+ char(73),
+ char(110),
+ char(100),
+ char(101),
+ char(120),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(83),
+ char(104),
+ char(111),
+ char(114),
+ char(116),
+ char(73),
+ char(110),
+ char(116),
+ char(73),
+ char(110),
+ char(100),
+ char(101),
+ char(120),
+ char(84),
+ char(114),
+ char(105),
+ char(112),
+ char(108),
+ char(101),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(104),
+ char(97),
+ char(114),
+ char(73),
+ char(110),
+ char(100),
+ char(101),
+ char(120),
+ char(84),
+ char(114),
+ char(105),
+ char(112),
+ char(108),
+ char(101),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(77),
+ char(101),
+ char(115),
+ char(104),
+ char(80),
+ char(97),
+ char(114),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(83),
+ char(116),
+ char(114),
+ char(105),
+ char(100),
+ char(105),
+ char(110),
+ char(103),
+ char(77),
+ char(101),
+ char(115),
+ char(104),
+ char(73),
+ char(110),
+ char(116),
+ char(101),
+ char(114),
+ char(102),
+ char(97),
+ char(99),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(84),
+ char(114),
+ char(105),
+ char(97),
+ char(110),
+ char(103),
+ char(108),
+ char(101),
+ char(77),
+ char(101),
+ char(115),
+ char(104),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(84),
+ char(114),
+ char(105),
+ char(97),
+ char(110),
+ char(103),
+ char(108),
+ char(101),
+ char(73),
+ char(110),
+ char(102),
+ char(111),
+ char(77),
+ char(97),
+ char(112),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(83),
+ char(99),
+ char(97),
+ char(108),
+ char(101),
+ char(100),
+ char(84),
+ char(114),
+ char(105),
+ char(97),
+ char(110),
+ char(103),
+ char(108),
+ char(101),
+ char(77),
+ char(101),
+ char(115),
+ char(104),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(111),
+ char(109),
+ char(112),
+ char(111),
+ char(117),
+ char(110),
+ char(100),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(67),
+ char(104),
+ char(105),
+ char(108),
+ char(100),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(111),
+ char(109),
+ char(112),
+ char(111),
+ char(117),
+ char(110),
+ char(100),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(121),
+ char(108),
+ char(105),
+ char(110),
+ char(100),
+ char(101),
+ char(114),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(97),
+ char(112),
+ char(115),
+ char(117),
+ char(108),
+ char(101),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(84),
+ char(114),
+ char(105),
+ char(97),
+ char(110),
+ char(103),
+ char(108),
+ char(101),
+ char(73),
+ char(110),
+ char(102),
+ char(111),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(71),
+ char(73),
+ char(109),
+ char(112),
+ char(97),
+ char(99),
+ char(116),
+ char(77),
+ char(101),
+ char(115),
+ char(104),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(111),
+ char(110),
+ char(118),
+ char(101),
+ char(120),
+ char(72),
+ char(117),
+ char(108),
+ char(108),
+ char(83),
+ char(104),
+ char(97),
+ char(112),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(79),
+ char(98),
+ char(106),
+ char(101),
+ char(99),
+ char(116),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(111),
+ char(108),
+ char(108),
+ char(105),
+ char(115),
+ char(105),
+ char(111),
+ char(110),
+ char(79),
+ char(98),
+ char(106),
+ char(101),
+ char(99),
+ char(116),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(68),
+ char(121),
+ char(110),
+ char(97),
+ char(109),
+ char(105),
+ char(99),
+ char(115),
+ char(87),
+ char(111),
+ char(114),
+ char(108),
+ char(100),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(111),
+ char(110),
+ char(116),
+ char(97),
+ char(99),
+ char(116),
+ char(83),
+ char(111),
+ char(108),
+ char(118),
+ char(101),
+ char(114),
+ char(73),
+ char(110),
+ char(102),
+ char(111),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(68),
+ char(121),
+ char(110),
+ char(97),
+ char(109),
+ char(105),
+ char(99),
+ char(115),
+ char(87),
+ char(111),
+ char(114),
+ char(108),
+ char(100),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(111),
+ char(110),
+ char(116),
+ char(97),
+ char(99),
+ char(116),
+ char(83),
+ char(111),
+ char(108),
+ char(118),
+ char(101),
+ char(114),
+ char(73),
+ char(110),
+ char(102),
+ char(111),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(82),
+ char(105),
+ char(103),
+ char(105),
+ char(100),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(82),
+ char(105),
+ char(103),
+ char(105),
+ char(100),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(73),
+ char(110),
+ char(102),
+ char(111),
+ char(49),
+ char(0),
+ char(98),
+ char(116),
+ char(84),
+ char(121),
+ char(112),
+ char(101),
+ char(100),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(82),
+ char(105),
+ char(103),
+ char(105),
+ char(100),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(80),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(50),
+ char(80),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(80),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(50),
+ char(80),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(72),
+ char(105),
+ char(110),
+ char(103),
+ char(101),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(68),
+ char(111),
+ char(117),
+ char(98),
+ char(108),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(72),
+ char(105),
+ char(110),
+ char(103),
+ char(101),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(67),
+ char(111),
+ char(110),
+ char(101),
+ char(84),
+ char(119),
+ char(105),
+ char(115),
+ char(116),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(71),
+ char(101),
+ char(110),
+ char(101),
+ char(114),
+ char(105),
+ char(99),
+ char(54),
+ char(68),
+ char(111),
+ char(102),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(71),
+ char(101),
+ char(110),
+ char(101),
+ char(114),
+ char(105),
+ char(99),
+ char(54),
+ char(68),
+ char(111),
+ char(102),
+ char(83),
+ char(112),
+ char(114),
+ char(105),
+ char(110),
+ char(103),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(83),
+ char(108),
+ char(105),
+ char(100),
+ char(101),
+ char(114),
+ char(67),
+ char(111),
+ char(110),
+ char(115),
+ char(116),
+ char(114),
+ char(97),
+ char(105),
+ char(110),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(77),
+ char(97),
+ char(116),
+ char(101),
+ char(114),
+ char(105),
+ char(97),
+ char(108),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(78),
+ char(111),
+ char(100),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(76),
+ char(105),
+ char(110),
+ char(107),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(70),
+ char(97),
+ char(99),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(84),
+ char(101),
+ char(116),
+ char(114),
+ char(97),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(82),
+ char(105),
+ char(103),
+ char(105),
+ char(100),
+ char(65),
+ char(110),
+ char(99),
+ char(104),
+ char(111),
+ char(114),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(67),
+ char(111),
+ char(110),
+ char(102),
+ char(105),
+ char(103),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(80),
+ char(111),
+ char(115),
+ char(101),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(67),
+ char(108),
+ char(117),
+ char(115),
+ char(116),
+ char(101),
+ char(114),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(74),
+ char(111),
+ char(105),
+ char(110),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(98),
+ char(116),
+ char(83),
+ char(111),
+ char(102),
+ char(116),
+ char(66),
+ char(111),
+ char(100),
+ char(121),
+ char(70),
+ char(108),
+ char(111),
+ char(97),
+ char(116),
+ char(68),
+ char(97),
+ char(116),
+ char(97),
+ char(0),
+ char(0),
+ char(0),
+ char(84),
+ char(76),
+ char(69),
+ char(78),
+ char(1),
+ char(0),
+ char(1),
+ char(0),
+ char(2),
+ char(0),
+ char(2),
+ char(0),
+ char(4),
+ char(0),
+ char(4),
+ char(0),
+ char(4),
+ char(0),
+ char(4),
+ char(0),
+ char(8),
+ char(0),
+ char(0),
+ char(0),
+ char(16),
+ char(0),
+ char(48),
+ char(0),
+ char(16),
+ char(0),
+ char(16),
+ char(0),
+ char(32),
+ char(0),
+ char(48),
+ char(0),
+ char(96),
+ char(0),
+ char(64),
+ char(0),
+ char(-128),
+ char(0),
+ char(20),
+ char(0),
+ char(48),
+ char(0),
+ char(80),
+ char(0),
+ char(16),
+ char(0),
+ char(96),
+ char(0),
+ char(-112),
+ char(0),
+ char(16),
+ char(0),
+ char(56),
+ char(0),
+ char(56),
+ char(0),
+ char(20),
+ char(0),
+ char(72),
+ char(0),
+ char(4),
+ char(0),
+ char(4),
+ char(0),
+ char(8),
+ char(0),
+ char(4),
+ char(0),
+ char(56),
+ char(0),
+ char(32),
+ char(0),
+ char(80),
+ char(0),
+ char(72),
+ char(0),
+ char(96),
+ char(0),
+ char(80),
+ char(0),
+ char(32),
+ char(0),
+ char(64),
+ char(0),
+ char(64),
+ char(0),
+ char(16),
+ char(0),
+ char(72),
+ char(0),
+ char(80),
+ char(0),
+ char(-32),
+ char(1),
+ char(16),
+ char(1),
+ char(-72),
+ char(0),
+ char(-104),
+ char(0),
+ char(104),
+ char(0),
+ char(88),
+ char(0),
+ char(-8),
+ char(1),
+ char(-80),
+ char(3),
+ char(8),
+ char(0),
+ char(64),
+ char(0),
+ char(0),
+ char(0),
+ char(96),
+ char(0),
+ char(-128),
+ char(0),
+ char(104),
+ char(1),
+ char(-24),
+ char(0),
+ char(-32),
+ char(0),
+ char(8),
+ char(1),
+ char(104),
+ char(1),
+ char(-40),
+ char(0),
+ char(16),
+ char(0),
+ char(104),
+ char(0),
+ char(24),
+ char(0),
+ char(40),
+ char(0),
+ char(104),
+ char(0),
+ char(96),
+ char(0),
+ char(104),
+ char(0),
+ char(-56),
+ char(0),
+ char(104),
+ char(1),
+ char(112),
+ char(0),
+ char(-32),
+ char(1),
+ char(83),
+ char(84),
+ char(82),
+ char(67),
+ char(65),
+ char(0),
+ char(0),
+ char(0),
+ char(10),
+ char(0),
+ char(3),
+ char(0),
+ char(4),
+ char(0),
+ char(0),
+ char(0),
+ char(4),
+ char(0),
+ char(1),
+ char(0),
+ char(9),
+ char(0),
+ char(2),
+ char(0),
+ char(11),
+ char(0),
+ char(3),
+ char(0),
+ char(10),
+ char(0),
+ char(3),
+ char(0),
+ char(10),
+ char(0),
+ char(4),
+ char(0),
+ char(10),
+ char(0),
+ char(5),
+ char(0),
+ char(12),
+ char(0),
+ char(2),
+ char(0),
+ char(9),
+ char(0),
+ char(6),
+ char(0),
+ char(9),
+ char(0),
+ char(7),
+ char(0),
+ char(13),
+ char(0),
+ char(1),
+ char(0),
+ char(7),
+ char(0),
+ char(8),
+ char(0),
+ char(14),
+ char(0),
+ char(1),
+ char(0),
+ char(8),
+ char(0),
+ char(8),
+ char(0),
+ char(15),
+ char(0),
+ char(1),
+ char(0),
+ char(13),
+ char(0),
+ char(9),
+ char(0),
+ char(16),
+ char(0),
+ char(1),
+ char(0),
+ char(14),
+ char(0),
+ char(9),
+ char(0),
+ char(17),
+ char(0),
+ char(2),
+ char(0),
+ char(15),
+ char(0),
+ char(10),
+ char(0),
+ char(13),
+ char(0),
+ char(11),
+ char(0),
+ char(18),
+ char(0),
+ char(2),
+ char(0),
+ char(16),
+ char(0),
+ char(10),
+ char(0),
+ char(14),
+ char(0),
+ char(11),
+ char(0),
+ char(19),
+ char(0),
+ char(4),
+ char(0),
+ char(4),
+ char(0),
+ char(12),
+ char(0),
+ char(4),
+ char(0),
+ char(13),
+ char(0),
+ char(2),
+ char(0),
+ char(14),
+ char(0),
+ char(2),
+ char(0),
+ char(15),
+ char(0),
+ char(20),
+ char(0),
+ char(6),
+ char(0),
+ char(13),
+ char(0),
+ char(16),
+ char(0),
+ char(13),
+ char(0),
+ char(17),
+ char(0),
+ char(4),
+ char(0),
+ char(18),
+ char(0),
+ char(4),
+ char(0),
+ char(19),
+ char(0),
+ char(4),
+ char(0),
+ char(20),
+ char(0),
+ char(0),
+ char(0),
+ char(21),
+ char(0),
+ char(21),
+ char(0),
+ char(6),
+ char(0),
+ char(14),
+ char(0),
+ char(16),
+ char(0),
+ char(14),
+ char(0),
+ char(17),
+ char(0),
+ char(4),
+ char(0),
+ char(18),
+ char(0),
+ char(4),
+ char(0),
+ char(19),
+ char(0),
+ char(4),
+ char(0),
+ char(20),
+ char(0),
+ char(0),
+ char(0),
+ char(21),
+ char(0),
+ char(22),
+ char(0),
+ char(3),
+ char(0),
+ char(2),
+ char(0),
+ char(14),
+ char(0),
+ char(2),
+ char(0),
+ char(15),
+ char(0),
+ char(4),
+ char(0),
+ char(22),
+ char(0),
+ char(23),
+ char(0),
+ char(12),
+ char(0),
+ char(13),
+ char(0),
+ char(23),
+ char(0),
+ char(13),
+ char(0),
+ char(24),
+ char(0),
+ char(13),
+ char(0),
+ char(25),
+ char(0),
+ char(4),
+ char(0),
+ char(26),
+ char(0),
+ char(4),
+ char(0),
+ char(27),
+ char(0),
+ char(4),
+ char(0),
+ char(28),
+ char(0),
+ char(4),
+ char(0),
+ char(29),
+ char(0),
+ char(20),
+ char(0),
+ char(30),
+ char(0),
+ char(22),
+ char(0),
+ char(31),
+ char(0),
+ char(19),
+ char(0),
+ char(32),
+ char(0),
+ char(4),
+ char(0),
+ char(33),
+ char(0),
+ char(4),
+ char(0),
+ char(34),
+ char(0),
+ char(24),
+ char(0),
+ char(12),
+ char(0),
+ char(14),
+ char(0),
+ char(23),
+ char(0),
+ char(14),
+ char(0),
+ char(24),
+ char(0),
+ char(14),
+ char(0),
+ char(25),
+ char(0),
+ char(4),
+ char(0),
+ char(26),
+ char(0),
+ char(4),
+ char(0),
+ char(27),
+ char(0),
+ char(4),
+ char(0),
+ char(28),
+ char(0),
+ char(4),
+ char(0),
+ char(29),
+ char(0),
+ char(21),
+ char(0),
+ char(30),
+ char(0),
+ char(22),
+ char(0),
+ char(31),
+ char(0),
+ char(4),
+ char(0),
+ char(33),
+ char(0),
+ char(4),
+ char(0),
+ char(34),
+ char(0),
+ char(19),
+ char(0),
+ char(32),
+ char(0),
+ char(25),
+ char(0),
+ char(3),
+ char(0),
+ char(0),
+ char(0),
+ char(35),
+ char(0),
+ char(4),
+ char(0),
+ char(36),
+ char(0),
+ char(0),
+ char(0),
+ char(37),
+ char(0),
+ char(26),
+ char(0),
+ char(5),
+ char(0),
+ char(25),
+ char(0),
+ char(38),
+ char(0),
+ char(13),
+ char(0),
+ char(39),
+ char(0),
+ char(13),
+ char(0),
+ char(40),
+ char(0),
+ char(7),
+ char(0),
+ char(41),
+ char(0),
+ char(0),
+ char(0),
+ char(21),
+ char(0),
+ char(27),
+ char(0),
+ char(5),
+ char(0),
+ char(25),
+ char(0),
+ char(38),
+ char(0),
+ char(13),
+ char(0),
+ char(39),
+ char(0),
+ char(13),
+ char(0),
+ char(42),
+ char(0),
+ char(7),
+ char(0),
+ char(43),
+ char(0),
+ char(4),
+ char(0),
+ char(44),
+ char(0),
+ char(28),
+ char(0),
+ char(2),
+ char(0),
+ char(13),
+ char(0),
+ char(45),
+ char(0),
+ char(7),
+ char(0),
+ char(46),
+ char(0),
+ char(29),
+ char(0),
+ char(4),
+ char(0),
+ char(27),
+ char(0),
+ char(47),
+ char(0),
+ char(28),
+ char(0),
+ char(48),
+ char(0),
+ char(4),
+ char(0),
+ char(49),
+ char(0),
+ char(0),
+ char(0),
+ char(37),
+ char(0),
+ char(30),
+ char(0),
+ char(1),
+ char(0),
+ char(4),
+ char(0),
+ char(50),
+ char(0),
+ char(31),
+ char(0),
+ char(2),
+ char(0),
+ char(2),
+ char(0),
+ char(50),
+ char(0),
+ char(0),
+ char(0),
+ char(51),
+ char(0),
+ char(32),
+ char(0),
+ char(2),
+ char(0),
+ char(2),
+ char(0),
+ char(52),
+ char(0),
+ char(0),
+ char(0),
+ char(51),
+ char(0),
+ char(33),
+ char(0),
+ char(2),
+ char(0),
+ char(0),
+ char(0),
+ char(52),
+ char(0),
+ char(0),
+ char(0),
+ char(53),
+ char(0),
+ char(34),
+ char(0),
+ char(8),
+ char(0),
+ char(13),
+ char(0),
+ char(54),
+ char(0),
+ char(14),
+ char(0),
+ char(55),
+ char(0),
+ char(30),
+ char(0),
+ char(56),
+ char(0),
+ char(32),
+ char(0),
+ char(57),
+ char(0),
+ char(33),
+ char(0),
+ char(58),
+ char(0),
+ char(31),
+ char(0),
+ char(59),
+ char(0),
+ char(4),
+ char(0),
+ char(60),
+ char(0),
+ char(4),
+ char(0),
+ char(61),
+ char(0),
+ char(35),
+ char(0),
+ char(4),
+ char(0),
+ char(34),
+ char(0),
+ char(62),
+ char(0),
+ char(13),
+ char(0),
+ char(63),
+ char(0),
+ char(4),
+ char(0),
+ char(64),
+ char(0),
+ char(0),
+ char(0),
+ char(37),
+ char(0),
+ char(36),
+ char(0),
+ char(7),
+ char(0),
+ char(25),
+ char(0),
+ char(38),
+ char(0),
+ char(35),
+ char(0),
+ char(65),
+ char(0),
+ char(23),
+ char(0),
+ char(66),
+ char(0),
+ char(24),
+ char(0),
+ char(67),
+ char(0),
+ char(37),
+ char(0),
+ char(68),
+ char(0),
+ char(7),
+ char(0),
+ char(43),
+ char(0),
+ char(0),
+ char(0),
+ char(69),
+ char(0),
+ char(38),
+ char(0),
+ char(2),
+ char(0),
+ char(36),
+ char(0),
+ char(70),
+ char(0),
+ char(13),
+ char(0),
+ char(39),
+ char(0),
+ char(39),
+ char(0),
+ char(4),
+ char(0),
+ char(17),
+ char(0),
+ char(71),
+ char(0),
+ char(25),
+ char(0),
+ char(72),
+ char(0),
+ char(4),
+ char(0),
+ char(73),
+ char(0),
+ char(7),
+ char(0),
+ char(74),
+ char(0),
+ char(40),
+ char(0),
+ char(4),
+ char(0),
+ char(25),
+ char(0),
+ char(38),
+ char(0),
+ char(39),
+ char(0),
+ char(75),
+ char(0),
+ char(4),
+ char(0),
+ char(76),
+ char(0),
+ char(7),
+ char(0),
+ char(43),
+ char(0),
+ char(41),
+ char(0),
+ char(3),
+ char(0),
+ char(27),
+ char(0),
+ char(47),
+ char(0),
+ char(4),
+ char(0),
+ char(77),
+ char(0),
+ char(0),
+ char(0),
+ char(37),
+ char(0),
+ char(42),
+ char(0),
+ char(3),
+ char(0),
+ char(27),
+ char(0),
+ char(47),
+ char(0),
+ char(4),
+ char(0),
+ char(77),
+ char(0),
+ char(0),
+ char(0),
+ char(37),
+ char(0),
+ char(43),
+ char(0),
+ char(4),
+ char(0),
+ char(4),
+ char(0),
+ char(78),
+ char(0),
+ char(7),
+ char(0),
+ char(79),
+ char(0),
+ char(7),
+ char(0),
+ char(80),
+ char(0),
+ char(7),
+ char(0),
+ char(81),
+ char(0),
+ char(37),
+ char(0),
+ char(14),
+ char(0),
+ char(4),
+ char(0),
+ char(82),
+ char(0),
+ char(4),
+ char(0),
+ char(83),
+ char(0),
+ char(43),
+ char(0),
+ char(84),
+ char(0),
+ char(4),
+ char(0),
+ char(85),
+ char(0),
+ char(7),
+ char(0),
+ char(86),
+ char(0),
+ char(7),
+ char(0),
+ char(87),
+ char(0),
+ char(7),
+ char(0),
+ char(88),
+ char(0),
+ char(7),
+ char(0),
+ char(89),
+ char(0),
+ char(7),
+ char(0),
+ char(90),
+ char(0),
+ char(4),
+ char(0),
+ char(91),
+ char(0),
+ char(4),
+ char(0),
+ char(92),
+ char(0),
+ char(4),
+ char(0),
+ char(93),
+ char(0),
+ char(4),
+ char(0),
+ char(94),
+ char(0),
+ char(0),
+ char(0),
+ char(37),
+ char(0),
+ char(44),
+ char(0),
+ char(5),
+ char(0),
+ char(25),
+ char(0),
+ char(38),
+ char(0),
+ char(35),
+ char(0),
+ char(65),
+ char(0),
+ char(13),
+ char(0),
+ char(39),
+ char(0),
+ char(7),
+ char(0),
+ char(43),
+ char(0),
+ char(4),
+ char(0),
+ char(95),
+ char(0),
+ char(45),
+ char(0),
+ char(5),
+ char(0),
+ char(27),
+ char(0),
+ char(47),
+ char(0),
+ char(13),
+ char(0),
+ char(96),
+ char(0),
+ char(14),
+ char(0),
+ char(97),
+ char(0),
+ char(4),
+ char(0),
+ char(98),
+ char(0),
+ char(0),
+ char(0),
+ char(99),
+ char(0),
+ char(46),
+ char(0),
+ char(25),
+ char(0),
+ char(9),
+ char(0),
+ char(100),
+ char(0),
+ char(9),
+ char(0),
+ char(101),
+ char(0),
+ char(25),
+ char(0),
+ char(102),
+ char(0),
+ char(0),
+ char(0),
+ char(35),
+ char(0),
+ char(18),
+ char(0),
+ char(103),
+ char(0),
+ char(18),
+ char(0),
+ char(104),
+ char(0),
+ char(14),
+ char(0),
+ char(105),
+ char(0),
+ char(14),
+ char(0),
+ char(106),
+ char(0),
+ char(14),
+ char(0),
+ char(107),
+ char(0),
+ char(8),
+ char(0),
+ char(108),
+ char(0),
+ char(8),
+ char(0),
+ char(109),
+ char(0),
+ char(8),
+ char(0),
+ char(110),
+ char(0),
+ char(8),
+ char(0),
+ char(111),
+ char(0),
+ char(8),
+ char(0),
+ char(112),
+ char(0),
+ char(8),
+ char(0),
+ char(113),
+ char(0),
+ char(8),
+ char(0),
+ char(114),
+ char(0),
+ char(8),
+ char(0),
+ char(115),
+ char(0),
+ char(4),
+ char(0),
+ char(116),
+ char(0),
+ char(4),
+ char(0),
+ char(117),
+ char(0),
+ char(4),
+ char(0),
+ char(118),
+ char(0),
+ char(4),
+ char(0),
+ char(119),
+ char(0),
+ char(4),
+ char(0),
+ char(120),
+ char(0),
+ char(4),
+ char(0),
+ char(121),
+ char(0),
+ char(4),
+ char(0),
+ char(122),
+ char(0),
+ char(0),
+ char(0),
+ char(37),
+ char(0),
+ char(47),
+ char(0),
+ char(25),
+ char(0),
+ char(9),
+ char(0),
+ char(100),
+ char(0),
+ char(9),
+ char(0),
+ char(101),
+ char(0),
+ char(25),
+ char(0),
+ char(102),
+ char(0),
+ char(0),
+ char(0),
+ char(35),
+ char(0),
+ char(17),
+ char(0),
+ char(103),
+ char(0),
+ char(17),
+ char(0),
+ char(104),
+ char(0),
+ char(13),
+ char(0),
+ char(105),
+ char(0),
+ char(13),
+ char(0),
+ char(106),
+ char(0),
+ char(13),
+ char(0),
+ char(107),
+ char(0),
+ char(7),
+ char(0),
+ char(108),
+ char(0),
+ char(7),
+ char(0),
+ char(109),
+ char(0),
+ char(7),
+ char(0),
+ char(110),
+ char(0),
+ char(7),
+ char(0),
+ char(111),
+ char(0),
+ char(7),
+ char(0),
+ char(112),
+ char(0),
+ char(7),
+ char(0),
+ char(113),
+ char(0),
+ char(7),
+ char(0),
+ char(114),
+ char(0),
+ char(7),
+ char(0),
+ char(115),
+ char(0),
+ char(4),
+ char(0),
+ char(116),
+ char(0),
+ char(4),
+ char(0),
+ char(117),
+ char(0),
+ char(4),
+ char(0),
+ char(118),
+ char(0),
+ char(4),
+ char(0),
+ char(119),
+ char(0),
+ char(4),
+ char(0),
+ char(120),
+ char(0),
+ char(4),
+ char(0),
+ char(121),
+ char(0),
+ char(4),
+ char(0),
+ char(122),
+ char(0),
+ char(0),
+ char(0),
+ char(37),
+ char(0),
+ char(48),
+ char(0),
+ char(2),
+ char(0),
+ char(49),
+ char(0),
+ char(123),
+ char(0),
+ char(14),
+ char(0),
+ char(124),
+ char(0),
+ char(50),
+ char(0),
+ char(2),
+ char(0),
+ char(51),
+ char(0),
+ char(123),
+ char(0),
+ char(13),
+ char(0),
+ char(124),
+ char(0),
+ char(52),
+ char(0),
+ char(21),
+ char(0),
+ char(47),
+ char(0),
+ char(125),
+ char(0),
+ char(15),
+ char(0),
+ char(126),
+ char(0),
+ char(13),
+ char(0),
+ char(127),
+ char(0),
+ char(13),
+ char(0),
+ char(-128),
+ char(0),
+ char(13),
+ char(0),
+ char(-127),
+ char(0),
+ char(13),
+ char(0),
+ char(-126),
+ char(0),
+ char(13),
+ char(0),
+ char(124),
+ char(0),
+ char(13),
+ char(0),
+ char(-125),
+ char(0),
+ char(13),
+ char(0),
+ char(-124),
+ char(0),
+ char(13),
+ char(0),
+ char(-123),
+ char(0),
+ char(13),
+ char(0),
+ char(-122),
+ char(0),
+ char(7),
+ char(0),
+ char(-121),
+ char(0),
+ char(7),
+ char(0),
+ char(-120),
+ char(0),
+ char(7),
+ char(0),
+ char(-119),
+ char(0),
+ char(7),
+ char(0),
+ char(-118),
+ char(0),
+ char(7),
+ char(0),
+ char(-117),
+ char(0),
+ char(7),
+ char(0),
+ char(-116),
+ char(0),
+ char(7),
+ char(0),
+ char(-115),
+ char(0),
+ char(7),
+ char(0),
+ char(-114),
+ char(0),
+ char(7),
+ char(0),
+ char(-113),
+ char(0),
+ char(4),
+ char(0),
+ char(-112),
+ char(0),
+ char(53),
+ char(0),
+ char(22),
+ char(0),
+ char(46),
+ char(0),
+ char(125),
+ char(0),
+ char(16),
+ char(0),
+ char(126),
+ char(0),
+ char(14),
+ char(0),
+ char(127),
+ char(0),
+ char(14),
+ char(0),
+ char(-128),
+ char(0),
+ char(14),
+ char(0),
+ char(-127),
+ char(0),
+ char(14),
+ char(0),
+ char(-126),
+ char(0),
+ char(14),
+ char(0),
+ char(124),
+ char(0),
+ char(14),
+ char(0),
+ char(-125),
+ char(0),
+ char(14),
+ char(0),
+ char(-124),
+ char(0),
+ char(14),
+ char(0),
+ char(-123),
+ char(0),
+ char(14),
+ char(0),
+ char(-122),
+ char(0),
+ char(8),
+ char(0),
+ char(-121),
+ char(0),
+ char(8),
+ char(0),
+ char(-120),
+ char(0),
+ char(8),
+ char(0),
+ char(-119),
+ char(0),
+ char(8),
+ char(0),
+ char(-118),
+ char(0),
+ char(8),
+ char(0),
+ char(-117),
+ char(0),
+ char(8),
+ char(0),
+ char(-116),
+ char(0),
+ char(8),
+ char(0),
+ char(-115),
+ char(0),
+ char(8),
+ char(0),
+ char(-114),
+ char(0),
+ char(8),
+ char(0),
+ char(-113),
+ char(0),
+ char(4),
+ char(0),
+ char(-112),
+ char(0),
+ char(0),
+ char(0),
+ char(37),
+ char(0),
+ char(54),
+ char(0),
+ char(2),
+ char(0),
+ char(4),
+ char(0),
+ char(-111),
+ char(0),
+ char(4),
+ char(0),
+ char(-110),
+ char(0),
+ char(55),
+ char(0),
+ char(13),
+ char(0),
+ char(56),
+ char(0),
+ char(-109),
+ char(0),
+ char(56),
+ char(0),
+ char(-108),
+ char(0),
+ char(0),
+ char(0),
+ char(35),
+ char(0),
+ char(4),
+ char(0),
+ char(-107),
+ char(0),
+ char(4),
+ char(0),
+ char(-106),
+ char(0),
+ char(4),
+ char(0),
+ char(-105),
+ char(0),
+ char(4),
+ char(0),
+ char(-104),
+ char(0),
+ char(7),
+ char(0),
+ char(-103),
+ char(0),
+ char(7),
+ char(0),
+ char(-102),
+ char(0),
+ char(4),
+ char(0),
+ char(-101),
+ char(0),
+ char(4),
+ char(0),
+ char(-100),
+ char(0),
+ char(7),
+ char(0),
+ char(-99),
+ char(0),
+ char(4),
+ char(0),
+ char(-98),
+ char(0),
+ char(57),
+ char(0),
+ char(3),
+ char(0),
+ char(55),
+ char(0),
+ char(-97),
+ char(0),
+ char(13),
+ char(0),
+ char(-96),
+ char(0),
+ char(13),
+ char(0),
+ char(-95),
+ char(0),
+ char(58),
+ char(0),
+ char(3),
+ char(0),
+ char(55),
+ char(0),
+ char(-97),
+ char(0),
+ char(14),
+ char(0),
+ char(-96),
+ char(0),
+ char(14),
+ char(0),
+ char(-95),
+ char(0),
+ char(59),
+ char(0),
+ char(13),
+ char(0),
+ char(55),
+ char(0),
+ char(-97),
+ char(0),
+ char(18),
+ char(0),
+ char(-94),
+ char(0),
+ char(18),
+ char(0),
+ char(-93),
+ char(0),
+ char(4),
+ char(0),
+ char(-92),
+ char(0),
+ char(4),
+ char(0),
+ char(-91),
+ char(0),
+ char(4),
+ char(0),
+ char(-90),
+ char(0),
+ char(7),
+ char(0),
+ char(-89),
+ char(0),
+ char(7),
+ char(0),
+ char(-88),
+ char(0),
+ char(7),
+ char(0),
+ char(-87),
+ char(0),
+ char(7),
+ char(0),
+ char(-86),
+ char(0),
+ char(7),
+ char(0),
+ char(-85),
+ char(0),
+ char(7),
+ char(0),
+ char(-84),
+ char(0),
+ char(7),
+ char(0),
+ char(-83),
+ char(0),
+ char(60),
+ char(0),
+ char(13),
+ char(0),
+ char(55),
+ char(0),
+ char(-97),
+ char(0),
+ char(17),
+ char(0),
+ char(-94),
+ char(0),
+ char(17),
+ char(0),
+ char(-93),
+ char(0),
+ char(4),
+ char(0),
+ char(-92),
+ char(0),
+ char(4),
+ char(0),
+ char(-91),
+ char(0),
+ char(4),
+ char(0),
+ char(-90),
+ char(0),
+ char(7),
+ char(0),
+ char(-89),
+ char(0),
+ char(7),
+ char(0),
+ char(-88),
+ char(0),
+ char(7),
+ char(0),
+ char(-87),
+ char(0),
+ char(7),
+ char(0),
+ char(-86),
+ char(0),
+ char(7),
+ char(0),
+ char(-85),
+ char(0),
+ char(7),
+ char(0),
+ char(-84),
+ char(0),
+ char(7),
+ char(0),
+ char(-83),
+ char(0),
+ char(61),
+ char(0),
+ char(11),
+ char(0),
+ char(55),
+ char(0),
+ char(-97),
+ char(0),
+ char(17),
+ char(0),
+ char(-94),
+ char(0),
+ char(17),
+ char(0),
+ char(-93),
+ char(0),
+ char(7),
+ char(0),
+ char(-82),
+ char(0),
+ char(7),
+ char(0),
+ char(-81),
+ char(0),
+ char(7),
+ char(0),
+ char(-80),
+ char(0),
+ char(7),
+ char(0),
+ char(-85),
+ char(0),
+ char(7),
+ char(0),
+ char(-84),
+ char(0),
+ char(7),
+ char(0),
+ char(-83),
+ char(0),
+ char(7),
+ char(0),
+ char(-79),
+ char(0),
+ char(0),
+ char(0),
+ char(21),
+ char(0),
+ char(62),
+ char(0),
+ char(9),
+ char(0),
+ char(55),
+ char(0),
+ char(-97),
+ char(0),
+ char(17),
+ char(0),
+ char(-94),
+ char(0),
+ char(17),
+ char(0),
+ char(-93),
+ char(0),
+ char(13),
+ char(0),
+ char(-78),
+ char(0),
+ char(13),
+ char(0),
+ char(-77),
+ char(0),
+ char(13),
+ char(0),
+ char(-76),
+ char(0),
+ char(13),
+ char(0),
+ char(-75),
+ char(0),
+ char(4),
+ char(0),
+ char(-74),
+ char(0),
+ char(4),
+ char(0),
+ char(-73),
+ char(0),
+ char(63),
+ char(0),
+ char(5),
+ char(0),
+ char(62),
+ char(0),
+ char(-72),
+ char(0),
+ char(4),
+ char(0),
+ char(-71),
+ char(0),
+ char(7),
+ char(0),
+ char(-70),
+ char(0),
+ char(7),
+ char(0),
+ char(-69),
+ char(0),
+ char(7),
+ char(0),
+ char(-68),
+ char(0),
+ char(64),
+ char(0),
+ char(9),
+ char(0),
+ char(55),
+ char(0),
+ char(-97),
+ char(0),
+ char(17),
+ char(0),
+ char(-94),
+ char(0),
+ char(17),
+ char(0),
+ char(-93),
+ char(0),
+ char(7),
+ char(0),
+ char(-78),
+ char(0),
+ char(7),
+ char(0),
+ char(-77),
+ char(0),
+ char(7),
+ char(0),
+ char(-76),
+ char(0),
+ char(7),
+ char(0),
+ char(-75),
+ char(0),
+ char(4),
+ char(0),
+ char(-74),
+ char(0),
+ char(4),
+ char(0),
+ char(-73),
+ char(0),
+ char(49),
+ char(0),
+ char(22),
+ char(0),
+ char(8),
+ char(0),
+ char(-67),
+ char(0),
+ char(8),
+ char(0),
+ char(-79),
+ char(0),
+ char(8),
+ char(0),
+ char(110),
+ char(0),
+ char(8),
+ char(0),
+ char(-66),
+ char(0),
+ char(8),
+ char(0),
+ char(112),
+ char(0),
+ char(8),
+ char(0),
+ char(-65),
+ char(0),
+ char(8),
+ char(0),
+ char(-64),
+ char(0),
+ char(8),
+ char(0),
+ char(-63),
+ char(0),
+ char(8),
+ char(0),
+ char(-62),
+ char(0),
+ char(8),
+ char(0),
+ char(-61),
+ char(0),
+ char(8),
+ char(0),
+ char(-60),
+ char(0),
+ char(8),
+ char(0),
+ char(-59),
+ char(0),
+ char(8),
+ char(0),
+ char(-58),
+ char(0),
+ char(8),
+ char(0),
+ char(-57),
+ char(0),
+ char(8),
+ char(0),
+ char(-56),
+ char(0),
+ char(8),
+ char(0),
+ char(-55),
+ char(0),
+ char(4),
+ char(0),
+ char(-54),
+ char(0),
+ char(4),
+ char(0),
+ char(-53),
+ char(0),
+ char(4),
+ char(0),
+ char(-52),
+ char(0),
+ char(4),
+ char(0),
+ char(-51),
+ char(0),
+ char(4),
+ char(0),
+ char(-50),
+ char(0),
+ char(0),
+ char(0),
+ char(37),
+ char(0),
+ char(51),
+ char(0),
+ char(22),
+ char(0),
+ char(7),
+ char(0),
+ char(-67),
+ char(0),
+ char(7),
+ char(0),
+ char(-79),
+ char(0),
+ char(7),
+ char(0),
+ char(110),
+ char(0),
+ char(7),
+ char(0),
+ char(-66),
+ char(0),
+ char(7),
+ char(0),
+ char(112),
+ char(0),
+ char(7),
+ char(0),
+ char(-65),
+ char(0),
+ char(7),
+ char(0),
+ char(-64),
+ char(0),
+ char(7),
+ char(0),
+ char(-63),
+ char(0),
+ char(7),
+ char(0),
+ char(-62),
+ char(0),
+ char(7),
+ char(0),
+ char(-61),
+ char(0),
+ char(7),
+ char(0),
+ char(-60),
+ char(0),
+ char(7),
+ char(0),
+ char(-59),
+ char(0),
+ char(7),
+ char(0),
+ char(-58),
+ char(0),
+ char(7),
+ char(0),
+ char(-57),
+ char(0),
+ char(7),
+ char(0),
+ char(-56),
+ char(0),
+ char(7),
+ char(0),
+ char(-55),
+ char(0),
+ char(4),
+ char(0),
+ char(-54),
+ char(0),
+ char(4),
+ char(0),
+ char(-53),
+ char(0),
+ char(4),
+ char(0),
+ char(-52),
+ char(0),
+ char(4),
+ char(0),
+ char(-51),
+ char(0),
+ char(4),
+ char(0),
+ char(-50),
+ char(0),
+ char(0),
+ char(0),
+ char(37),
+ char(0),
+ char(65),
+ char(0),
+ char(4),
+ char(0),
+ char(7),
+ char(0),
+ char(-49),
+ char(0),
+ char(7),
+ char(0),
+ char(-48),
+ char(0),
+ char(7),
+ char(0),
+ char(-47),
+ char(0),
+ char(4),
+ char(0),
+ char(78),
+ char(0),
+ char(66),
+ char(0),
+ char(10),
+ char(0),
+ char(65),
+ char(0),
+ char(-46),
+ char(0),
+ char(13),
+ char(0),
+ char(-45),
+ char(0),
+ char(13),
+ char(0),
+ char(-44),
+ char(0),
+ char(13),
+ char(0),
+ char(-43),
+ char(0),
+ char(13),
+ char(0),
+ char(-42),
+ char(0),
+ char(13),
+ char(0),
+ char(-41),
+ char(0),
+ char(7),
+ char(0),
+ char(-121),
+ char(0),
+ char(7),
+ char(0),
+ char(-40),
+ char(0),
+ char(4),
+ char(0),
+ char(-39),
+ char(0),
+ char(4),
+ char(0),
+ char(53),
+ char(0),
+ char(67),
+ char(0),
+ char(4),
+ char(0),
+ char(65),
+ char(0),
+ char(-46),
+ char(0),
+ char(4),
+ char(0),
+ char(-38),
+ char(0),
+ char(7),
+ char(0),
+ char(-37),
+ char(0),
+ char(4),
+ char(0),
+ char(-36),
+ char(0),
+ char(68),
+ char(0),
+ char(4),
+ char(0),
+ char(13),
+ char(0),
+ char(-41),
+ char(0),
+ char(65),
+ char(0),
+ char(-46),
+ char(0),
+ char(4),
+ char(0),
+ char(-35),
+ char(0),
+ char(7),
+ char(0),
+ char(-34),
+ char(0),
+ char(69),
+ char(0),
+ char(7),
+ char(0),
+ char(13),
+ char(0),
+ char(-33),
+ char(0),
+ char(65),
+ char(0),
+ char(-46),
+ char(0),
+ char(4),
+ char(0),
+ char(-32),
+ char(0),
+ char(7),
+ char(0),
+ char(-31),
+ char(0),
+ char(7),
+ char(0),
+ char(-30),
+ char(0),
+ char(7),
+ char(0),
+ char(-29),
+ char(0),
+ char(4),
+ char(0),
+ char(53),
+ char(0),
+ char(70),
+ char(0),
+ char(6),
+ char(0),
+ char(15),
+ char(0),
+ char(-28),
+ char(0),
+ char(13),
+ char(0),
+ char(-30),
+ char(0),
+ char(13),
+ char(0),
+ char(-27),
+ char(0),
+ char(56),
+ char(0),
+ char(-26),
+ char(0),
+ char(4),
+ char(0),
+ char(-25),
+ char(0),
+ char(7),
+ char(0),
+ char(-29),
+ char(0),
+ char(71),
+ char(0),
+ char(26),
+ char(0),
+ char(4),
+ char(0),
+ char(-24),
+ char(0),
+ char(7),
+ char(0),
+ char(-23),
+ char(0),
+ char(7),
+ char(0),
+ char(-79),
+ char(0),
+ char(7),
+ char(0),
+ char(-22),
+ char(0),
+ char(7),
+ char(0),
+ char(-21),
+ char(0),
+ char(7),
+ char(0),
+ char(-20),
+ char(0),
+ char(7),
+ char(0),
+ char(-19),
+ char(0),
+ char(7),
+ char(0),
+ char(-18),
+ char(0),
+ char(7),
+ char(0),
+ char(-17),
+ char(0),
+ char(7),
+ char(0),
+ char(-16),
+ char(0),
+ char(7),
+ char(0),
+ char(-15),
+ char(0),
+ char(7),
+ char(0),
+ char(-14),
+ char(0),
+ char(7),
+ char(0),
+ char(-13),
+ char(0),
+ char(7),
+ char(0),
+ char(-12),
+ char(0),
+ char(7),
+ char(0),
+ char(-11),
+ char(0),
+ char(7),
+ char(0),
+ char(-10),
+ char(0),
+ char(7),
+ char(0),
+ char(-9),
+ char(0),
+ char(7),
+ char(0),
+ char(-8),
+ char(0),
+ char(7),
+ char(0),
+ char(-7),
+ char(0),
+ char(7),
+ char(0),
+ char(-6),
+ char(0),
+ char(7),
+ char(0),
+ char(-5),
+ char(0),
+ char(4),
+ char(0),
+ char(-4),
+ char(0),
+ char(4),
+ char(0),
+ char(-3),
+ char(0),
+ char(4),
+ char(0),
+ char(-2),
+ char(0),
+ char(4),
+ char(0),
+ char(-1),
+ char(0),
+ char(4),
+ char(0),
+ char(117),
+ char(0),
+ char(72),
+ char(0),
+ char(12),
+ char(0),
+ char(15),
+ char(0),
+ char(0),
+ char(1),
+ char(15),
+ char(0),
+ char(1),
+ char(1),
+ char(15),
+ char(0),
+ char(2),
+ char(1),
+ char(13),
+ char(0),
+ char(3),
+ char(1),
+ char(13),
+ char(0),
+ char(4),
+ char(1),
+ char(7),
+ char(0),
+ char(5),
+ char(1),
+ char(4),
+ char(0),
+ char(6),
+ char(1),
+ char(4),
+ char(0),
+ char(7),
+ char(1),
+ char(4),
+ char(0),
+ char(8),
+ char(1),
+ char(4),
+ char(0),
+ char(9),
+ char(1),
+ char(7),
+ char(0),
+ char(-31),
+ char(0),
+ char(4),
+ char(0),
+ char(53),
+ char(0),
+ char(73),
+ char(0),
+ char(27),
+ char(0),
+ char(17),
+ char(0),
+ char(10),
+ char(1),
+ char(15),
+ char(0),
+ char(11),
+ char(1),
+ char(15),
+ char(0),
+ char(12),
+ char(1),
+ char(13),
+ char(0),
+ char(3),
+ char(1),
+ char(13),
+ char(0),
+ char(13),
+ char(1),
+ char(13),
+ char(0),
+ char(14),
+ char(1),
+ char(13),
+ char(0),
+ char(15),
+ char(1),
+ char(13),
+ char(0),
+ char(16),
+ char(1),
+ char(13),
+ char(0),
+ char(17),
+ char(1),
+ char(4),
+ char(0),
+ char(18),
+ char(1),
+ char(7),
+ char(0),
+ char(19),
+ char(1),
+ char(4),
+ char(0),
+ char(20),
+ char(1),
+ char(4),
+ char(0),
+ char(21),
+ char(1),
+ char(4),
+ char(0),
+ char(22),
+ char(1),
+ char(7),
+ char(0),
+ char(23),
+ char(1),
+ char(7),
+ char(0),
+ char(24),
+ char(1),
+ char(4),
+ char(0),
+ char(25),
+ char(1),
+ char(4),
+ char(0),
+ char(26),
+ char(1),
+ char(7),
+ char(0),
+ char(27),
+ char(1),
+ char(7),
+ char(0),
+ char(28),
+ char(1),
+ char(7),
+ char(0),
+ char(29),
+ char(1),
+ char(7),
+ char(0),
+ char(30),
+ char(1),
+ char(7),
+ char(0),
+ char(31),
+ char(1),
+ char(7),
+ char(0),
+ char(32),
+ char(1),
+ char(4),
+ char(0),
+ char(33),
+ char(1),
+ char(4),
+ char(0),
+ char(34),
+ char(1),
+ char(4),
+ char(0),
+ char(35),
+ char(1),
+ char(74),
+ char(0),
+ char(12),
+ char(0),
+ char(9),
+ char(0),
+ char(36),
+ char(1),
+ char(9),
+ char(0),
+ char(37),
+ char(1),
+ char(13),
+ char(0),
+ char(38),
+ char(1),
+ char(7),
+ char(0),
+ char(39),
+ char(1),
+ char(7),
+ char(0),
+ char(-63),
+ char(0),
+ char(7),
+ char(0),
+ char(40),
+ char(1),
+ char(4),
+ char(0),
+ char(41),
+ char(1),
+ char(13),
+ char(0),
+ char(42),
+ char(1),
+ char(4),
+ char(0),
+ char(43),
+ char(1),
+ char(4),
+ char(0),
+ char(44),
+ char(1),
+ char(4),
+ char(0),
+ char(45),
+ char(1),
+ char(4),
+ char(0),
+ char(53),
+ char(0),
+ char(75),
+ char(0),
+ char(19),
+ char(0),
+ char(47),
+ char(0),
+ char(125),
+ char(0),
+ char(72),
+ char(0),
+ char(46),
+ char(1),
+ char(65),
+ char(0),
+ char(47),
+ char(1),
+ char(66),
+ char(0),
+ char(48),
+ char(1),
+ char(67),
+ char(0),
+ char(49),
+ char(1),
+ char(68),
+ char(0),
+ char(50),
+ char(1),
+ char(69),
+ char(0),
+ char(51),
+ char(1),
+ char(70),
+ char(0),
+ char(52),
+ char(1),
+ char(73),
+ char(0),
+ char(53),
+ char(1),
+ char(74),
+ char(0),
+ char(54),
+ char(1),
+ char(4),
+ char(0),
+ char(55),
+ char(1),
+ char(4),
+ char(0),
+ char(21),
+ char(1),
+ char(4),
+ char(0),
+ char(56),
+ char(1),
+ char(4),
+ char(0),
+ char(57),
+ char(1),
+ char(4),
+ char(0),
+ char(58),
+ char(1),
+ char(4),
+ char(0),
+ char(59),
+ char(1),
+ char(4),
+ char(0),
+ char(60),
+ char(1),
+ char(4),
+ char(0),
+ char(61),
+ char(1),
+ char(71),
+ char(0),
+ char(62),
+ char(1),
+};
+int b3s_bulletDNAlen64 = sizeof(b3s_bulletDNAstr64);
diff --git a/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Serializer.h b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Serializer.h
index 1c1ce43764..d9e153e238 100644
--- a/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Serializer.h
+++ b/thirdparty/bullet/Bullet3Serialize/Bullet2FileLoader/b3Serializer.h
@@ -16,158 +16,142 @@ subject to the following restrictions:
#ifndef B3_SERIALIZER_H
#define B3_SERIALIZER_H
-#include "Bullet3Common/b3Scalar.h" // has definitions like B3_FORCE_INLINE
+#include "Bullet3Common/b3Scalar.h" // has definitions like B3_FORCE_INLINE
#include "Bullet3Common/b3StackAlloc.h"
#include "Bullet3Common/b3HashMap.h"
-#if !defined( __CELLOS_LV2__) && !defined(__MWERKS__)
+#if !defined(__CELLOS_LV2__) && !defined(__MWERKS__)
#include <memory.h>
#endif
#include <string.h>
-
-
extern char b3s_bulletDNAstr[];
extern int b3s_bulletDNAlen;
extern char b3s_bulletDNAstr64[];
extern int b3s_bulletDNAlen64;
-B3_FORCE_INLINE int b3StrLen(const char* str)
+B3_FORCE_INLINE int b3StrLen(const char* str)
{
- if (!str)
- return(0);
+ if (!str)
+ return (0);
int len = 0;
-
+
while (*str != 0)
{
- str++;
- len++;
- }
+ str++;
+ len++;
+ }
- return len;
+ return len;
}
-
class b3Chunk
{
public:
- int m_chunkCode;
- int m_length;
- void *m_oldPtr;
- int m_dna_nr;
- int m_number;
+ int m_chunkCode;
+ int m_length;
+ void* m_oldPtr;
+ int m_dna_nr;
+ int m_number;
};
-enum b3SerializationFlags
+enum b3SerializationFlags
{
B3_SERIALIZE_NO_BVH = 1,
B3_SERIALIZE_NO_TRIANGLEINFOMAP = 2,
B3_SERIALIZE_NO_DUPLICATE_ASSERT = 4
};
-class b3Serializer
+class b3Serializer
{
-
public:
-
virtual ~b3Serializer() {}
- virtual const unsigned char* getBufferPointer() const = 0;
-
- virtual int getCurrentBufferSize() const = 0;
+ virtual const unsigned char* getBufferPointer() const = 0;
- virtual b3Chunk* allocate(size_t size, int numElements) = 0;
+ virtual int getCurrentBufferSize() const = 0;
- virtual void finalizeChunk(b3Chunk* chunk, const char* structType, int chunkCode,void* oldPtr)= 0;
+ virtual b3Chunk* allocate(size_t size, int numElements) = 0;
- virtual void* findPointer(void* oldPtr) = 0;
+ virtual void finalizeChunk(b3Chunk* chunk, const char* structType, int chunkCode, void* oldPtr) = 0;
- virtual void* getUniquePointer(void*oldPtr) = 0;
+ virtual void* findPointer(void* oldPtr) = 0;
- virtual void startSerialization() = 0;
-
- virtual void finishSerialization() = 0;
+ virtual void* getUniquePointer(void* oldPtr) = 0;
- virtual const char* findNameForPointer(const void* ptr) const = 0;
+ virtual void startSerialization() = 0;
- virtual void registerNameForPointer(const void* ptr, const char* name) = 0;
+ virtual void finishSerialization() = 0;
- virtual void serializeName(const char* ptr) = 0;
+ virtual const char* findNameForPointer(const void* ptr) const = 0;
- virtual int getSerializationFlags() const = 0;
+ virtual void registerNameForPointer(const void* ptr, const char* name) = 0;
- virtual void setSerializationFlags(int flags) = 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) )
+#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) )
+#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
+#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];
+ 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
+class b3DefaultSerializer : public b3Serializer
{
+ b3AlignedObjectArray<char*> mTypes;
+ b3AlignedObjectArray<short*> mStructs;
+ b3AlignedObjectArray<short> mTlens;
+ b3HashMap<b3HashInt, int> mStructReverse;
+ b3HashMap<b3HashString, int> mTypeLookup;
+ b3HashMap<b3HashPtr, void*> m_chunkP;
- b3AlignedObjectArray<char*> mTypes;
- b3AlignedObjectArray<short*> mStructs;
- b3AlignedObjectArray<short> mTlens;
- b3HashMap<b3HashInt, int> mStructReverse;
- b3HashMap<b3HashString,int> mTypeLookup;
+ b3HashMap<b3HashPtr, const char*> m_nameMap;
-
- b3HashMap<b3HashPtr,void*> m_chunkP;
-
- b3HashMap<b3HashPtr,const char*> m_nameMap;
+ b3HashMap<b3HashPtr, b3PointerUid> m_uniquePointers;
+ int m_uniqueIdGenerator;
- b3HashMap<b3HashPtr,b3PointerUid> m_uniquePointers;
- int m_uniqueIdGenerator;
+ int m_totalSize;
+ unsigned char* m_buffer;
+ int m_currentSize;
+ void* m_dna;
+ int m_dnaLength;
- int m_totalSize;
- unsigned char* m_buffer;
- int m_currentSize;
- void* m_dna;
- int m_dnaLength;
+ int m_serializationFlags;
- int m_serializationFlags;
+ b3AlignedObjectArray<b3Chunk*> m_chunkPtrs;
-
- b3AlignedObjectArray<b3Chunk*> m_chunkPtrs;
-
protected:
-
- virtual void* findPointer(void* oldPtr)
+ virtual void* findPointer(void* oldPtr)
{
void** ptr = m_chunkP.find(oldPtr);
if (ptr && *ptr)
@@ -175,48 +159,43 @@ protected:
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);
- }
+ 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
- {
+ int getReverseType(const char* type) const
+ {
+ b3HashString key(type);
+ const int* valuePtr = mTypeLookup.find(key);
+ if (valuePtr)
+ return *valuePtr;
- b3HashString key(type);
- const int* valuePtr = mTypeLookup.find(key);
- if (valuePtr)
- return *valuePtr;
-
- return -1;
- }
+ return -1;
+ }
- void initDNA(const char* bdnaOrg,int dnalen)
- {
- ///was already initialized
- if (m_dna)
- return;
+ void initDNA(const char* bdnaOrg, int dnalen)
+ {
+ ///was already initialized
+ if (m_dna)
+ return;
- int littleEndian= 1;
- littleEndian= ((char*)&littleEndian)[0];
-
+ int littleEndian = 1;
+ littleEndian = ((char*)&littleEndian)[0];
- m_dna = b3AlignedAlloc(dnalen,16);
- memcpy(m_dna,bdnaOrg,dnalen);
- m_dnaLength = dnalen;
+ 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;
+ int* intPtr = 0;
+ short* shtPtr = 0;
+ char* cp = 0;
+ int dataLen = 0;
+ intPtr = (int*)m_dna;
- /*
+ /*
SDNA (4 bytes) (magic number)
NAME (4 bytes)
<nr> (4 bytes) amount of names (int)
@@ -224,81 +203,81 @@ protected:
<string>
*/
- if (strncmp((const char*)m_dna, "SDNA", 4)==0)
- {
- // skip ++ NAME
- intPtr++; intPtr++;
- }
-
- // Parse names
- if (!littleEndian)
- *intPtr = b3SwapEndian(*intPtr);
-
- dataLen = *intPtr;
-
+ if (strncmp((const char*)m_dna, "SDNA", 4) == 0)
+ {
+ // skip ++ NAME
+ intPtr++;
intPtr++;
+ }
- cp = (char*)intPtr;
- int i;
- for ( i=0; i<dataLen; i++)
- {
-
- while (*cp)cp++;
- cp++;
- }
- cp = b3AlignPointer(cp,4);
+ // 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)
<nr> amount of types (int)
<string>
<string>
*/
- intPtr = (int*)cp;
- b3Assert(strncmp(cp, "TYPE", 4)==0); intPtr++;
+ intPtr = (int*)cp;
+ b3Assert(strncmp(cp, "TYPE", 4) == 0);
+ intPtr++;
- if (!littleEndian)
- *intPtr = b3SwapEndian(*intPtr);
-
- dataLen = *intPtr;
- intPtr++;
+ if (!littleEndian)
+ *intPtr = b3SwapEndian(*intPtr);
-
- cp = (char*)intPtr;
- for (i=0; i<dataLen; i++)
- {
- mTypes.push_back(cp);
- while (*cp)cp++;
- cp++;
- }
+ dataLen = *intPtr;
+ intPtr++;
- cp = b3AlignPointer(cp,4);
+ cp = (char*)intPtr;
+ for (i = 0; i < dataLen; i++)
+ {
+ mTypes.push_back(cp);
+ while (*cp) cp++;
+ cp++;
+ }
+ cp = b3AlignPointer(cp, 4);
- /*
+ /*
TLEN (4 bytes)
<len> (short) the lengths of types
<len>
*/
- // Parse type lens
- intPtr = (int*)cp;
- b3Assert(strncmp(cp, "TLEN", 4)==0); intPtr++;
+ // Parse type lens
+ intPtr = (int*)cp;
+ b3Assert(strncmp(cp, "TLEN", 4) == 0);
+ intPtr++;
- dataLen = (int)mTypes.size();
+ 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]);
- }
+ 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++;
+ if (dataLen & 1) shtPtr++;
- /*
+ /*
STRC (4 bytes)
<nr> amount of structs (int)
<typenr>
@@ -309,331 +288,314 @@ protected:
<namenr>
*/
- intPtr = (int*)shtPtr;
- cp = (char*)intPtr;
- b3Assert(strncmp(cp, "STRC", 4)==0); intPtr++;
+ intPtr = (int*)shtPtr;
+ cp = (char*)intPtr;
+ b3Assert(strncmp(cp, "STRC", 4) == 0);
+ intPtr++;
- if (!littleEndian)
- *intPtr = b3SwapEndian(*intPtr);
- dataLen = *intPtr ;
- intPtr++;
+ if (!littleEndian)
+ *intPtr = b3SwapEndian(*intPtr);
+ dataLen = *intPtr;
+ intPtr++;
+ shtPtr = (short*)intPtr;
+ for (i = 0; i < dataLen; i++)
+ {
+ mStructs.push_back(shtPtr);
- shtPtr = (short*)intPtr;
- for (i=0; i<dataLen; i++)
+ if (!littleEndian)
{
- mStructs.push_back (shtPtr);
-
- if (!littleEndian)
- {
- shtPtr[0]= b3SwapEndian(shtPtr[0]);
- shtPtr[1]= b3SwapEndian(shtPtr[1]);
+ shtPtr[0] = b3SwapEndian(shtPtr[0]);
+ shtPtr[1] = b3SwapEndian(shtPtr[1]);
- int len = shtPtr[1];
- shtPtr+= 2;
+ 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
+ for (int a = 0; a < len; a++, shtPtr += 2)
{
- shtPtr+= (2*shtPtr[1])+2;
+ shtPtr[0] = b3SwapEndian(shtPtr[0]);
+ shtPtr[1] = b3SwapEndian(shtPtr[1]);
}
}
-
- // build reverse lookups
- for (i=0; i<(int)mStructs.size(); i++)
+ else
{
- short *strc = mStructs.at(i);
- mStructReverse.insert(strc[0], i);
- mTypeLookup.insert(b3HashString(mTypes[strc[0]]),i);
+ shtPtr += (2 * shtPtr[1]) + 2;
}
}
-public:
-
+ // 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;
- 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));
+ const bool VOID_IS_8 = ((sizeof(void*) == 8));
#ifdef B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
- if (VOID_IS_8)
- {
+ if (VOID_IS_8)
+ {
#if _WIN64
- initDNA((const char*)b3s_bulletDNAstr64,b3s_bulletDNAlen64);
+ initDNA((const char*)b3s_bulletDNAstr64, b3s_bulletDNAlen64);
#else
- b3Assert(0);
+ b3Assert(0);
#endif
- } else
- {
+ }
+ else
+ {
#ifndef _WIN64
- initDNA((const char*)b3s_bulletDNAstr,b3s_bulletDNAlen);
+ initDNA((const char*)b3s_bulletDNAstr, b3s_bulletDNAlen);
#else
- b3Assert(0);
+ 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()
+#else //B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
+ if (VOID_IS_8)
{
- if (m_buffer)
- b3AlignedFree(m_buffer);
- if (m_dna)
- b3AlignedFree(m_dna);
+ initDNA((const char*)b3s_bulletDNAstr64, b3s_bulletDNAlen64);
}
-
- void writeHeader(unsigned char* buffer) const
+ else
{
-
+ initDNA((const char*)b3s_bulletDNAstr, b3s_bulletDNAlen);
+ }
+#endif //B3_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
+ }
-#ifdef B3_USE_DOUBLE_PRECISION
- memcpy(buffer, "BULLETd", 7);
+ 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];
+ memcpy(buffer, "BULLETf", 7);
+#endif //B3_USE_DOUBLE_PRECISION
- if (sizeof(void*)==8)
- {
- buffer[7] = '-';
- } else
- {
- buffer[7] = '_';
- }
+ int littleEndian = 1;
+ littleEndian = ((char*)&littleEndian)[0];
- if (littleEndian)
- {
- buffer[8]='v';
- } else
- {
- buffer[8]='V';
- }
+ 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';
+ 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();
- virtual void startSerialization()
+ //if we didn't pre-allocate a buffer, we need to create a contiguous buffer now
+ int mysize = 0;
+ if (!m_totalSize)
{
- m_uniqueIdGenerator= 1;
- 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++)
{
- unsigned char* buffer = internalAlloc(B3_HEADER_LENGTH);
- writeHeader(buffer);
+ int curLength = sizeof(b3Chunk) + m_chunkPtrs[i]->m_length;
+ memcpy(currentPtr, m_chunkPtrs[i], curLength);
+ b3AlignedFree(m_chunkPtrs[i]);
+ currentPtr += curLength;
+ mysize += curLength;
}
-
}
- virtual void finishSerialization()
+ 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)
{
- writeDNA();
+ return uptr->m_ptr;
+ }
+ m_uniqueIdGenerator++;
- //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);
+ b3PointerUid uid;
+ uid.m_uniqueIds[0] = m_uniqueIdGenerator;
+ uid.m_uniqueIds[1] = m_uniqueIdGenerator;
+ m_uniquePointers.insert(oldPtr, uid);
+ return uid.m_ptr;
+ }
- m_currentSize += B3_HEADER_LENGTH;
- m_buffer = (unsigned char*)b3AlignedAlloc(m_currentSize,16);
+ virtual const unsigned char* getBufferPointer() const
+ {
+ return m_buffer;
+ }
- 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;
- }
- }
+ virtual int getCurrentBufferSize() const
+ {
+ return m_currentSize;
+ }
- mTypes.clear();
- mStructs.clear();
- mTlens.clear();
- mStructReverse.clear();
- mTypeLookup.clear();
- m_chunkP.clear();
- m_nameMap.clear();
- m_uniquePointers.clear();
- m_chunkPtrs.clear();
+ virtual void finalizeChunk(b3Chunk* chunk, const char* structType, int chunkCode, void* oldPtr)
+ {
+ if (!(m_serializationFlags & B3_SERIALIZE_NO_DUPLICATE_ASSERT))
+ {
+ b3Assert(!findPointer(oldPtr));
}
- virtual void* getUniquePointer(void*oldPtr)
- {
- if (!oldPtr)
- return 0;
+ chunk->m_dna_nr = getReverseType(structType);
- 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;
+ chunk->m_chunkCode = chunkCode;
- }
+ void* uniquePtr = getUniquePointer(oldPtr);
- virtual const unsigned char* getBufferPointer() const
- {
- return m_buffer;
- }
+ m_chunkP.insert(oldPtr, uniquePtr); //chunk->m_oldPtr);
+ chunk->m_oldPtr = uniquePtr; //oldPtr;
+ }
- virtual int getCurrentBufferSize() const
- {
- return m_currentSize;
- }
+ virtual unsigned char* internalAlloc(size_t size)
+ {
+ unsigned char* ptr = 0;
- virtual void finalizeChunk(b3Chunk* chunk, const char* structType, int chunkCode,void* oldPtr)
+ if (m_totalSize)
{
- 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;
-
+ ptr = m_buffer + m_currentSize;
+ m_currentSize += int(size);
+ b3Assert(m_currentSize < m_totalSize);
}
-
-
- virtual unsigned char* internalAlloc(size_t size)
+ else
{
- 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;
+ 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));
- virtual b3Chunk* allocate(size_t size, int numElements)
- {
+ unsigned char* data = ptr + sizeof(b3Chunk);
- unsigned char* ptr = internalAlloc(int(size)*numElements+sizeof(b3Chunk));
+ b3Chunk* chunk = (b3Chunk*)ptr;
+ chunk->m_chunkCode = 0;
+ chunk->m_oldPtr = data;
+ chunk->m_length = int(size) * numElements;
+ chunk->m_number = numElements;
- 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);
-
+ m_chunkPtrs.push_back(chunk);
- return 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 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 registerNameForPointer(const void* ptr, const char* name)
+ virtual void serializeName(const char* name)
+ {
+ if (name)
{
- m_nameMap.insert(ptr,name);
- }
+ //don't serialize name twice
+ if (findPointer((void*)name))
+ return;
- virtual void serializeName(const char* name)
- {
- if (name)
+ int len = b3StrLen(name);
+ if (len)
{
- //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++)
{
-
- 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);
+ 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;
- }
+ virtual int getSerializationFlags() const
+ {
+ return m_serializationFlags;
+ }
+ virtual void setSerializationFlags(int flags)
+ {
+ m_serializationFlags = flags;
+ }
};
-
-#endif //B3_SERIALIZER_H
-
+#endif //B3_SERIALIZER_H
diff --git a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3.cpp b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3.cpp
index 77763305b1..ec6fe9f4d8 100644
--- a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3.cpp
+++ b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3.cpp
@@ -2,7 +2,6 @@
//Bullet Continuous Collision Detection and Physics Library
//Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
-
//
// btAxisSweep3
//
@@ -19,18 +18,15 @@
// 3. This notice may not be removed or altered from any source distribution.
#include "btAxisSweep3.h"
-
-btAxisSweep3::btAxisSweep3(const btVector3& worldAabbMin,const btVector3& worldAabbMax, unsigned short int maxHandles, btOverlappingPairCache* pairCache, bool disableRaycastAccelerator)
-:btAxisSweep3Internal<unsigned short int>(worldAabbMin,worldAabbMax,0xfffe,0xffff,maxHandles,pairCache,disableRaycastAccelerator)
+btAxisSweep3::btAxisSweep3(const btVector3& worldAabbMin, const btVector3& worldAabbMax, unsigned short int maxHandles, btOverlappingPairCache* pairCache, bool disableRaycastAccelerator)
+ : btAxisSweep3Internal<unsigned short int>(worldAabbMin, worldAabbMax, 0xfffe, 0xffff, maxHandles, pairCache, disableRaycastAccelerator)
{
// 1 handle is reserved as sentinel
btAssert(maxHandles > 1 && maxHandles < 32767);
-
}
-
-bt32BitAxisSweep3::bt32BitAxisSweep3(const btVector3& worldAabbMin,const btVector3& worldAabbMax, unsigned int maxHandles , btOverlappingPairCache* pairCache , bool disableRaycastAccelerator)
-:btAxisSweep3Internal<unsigned int>(worldAabbMin,worldAabbMax,0xfffffffe,0x7fffffff,maxHandles,pairCache,disableRaycastAccelerator)
+bt32BitAxisSweep3::bt32BitAxisSweep3(const btVector3& worldAabbMin, const btVector3& worldAabbMax, unsigned int maxHandles, btOverlappingPairCache* pairCache, bool disableRaycastAccelerator)
+ : btAxisSweep3Internal<unsigned int>(worldAabbMin, worldAabbMax, 0xfffffffe, 0x7fffffff, maxHandles, pairCache, disableRaycastAccelerator)
{
// 1 handle is reserved as sentinel
btAssert(maxHandles > 1 && maxHandles < 2147483647);
diff --git a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3.h b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3.h
index a3648df1af..1e42f25f3b 100644
--- a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3.h
+++ b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3.h
@@ -33,9 +33,7 @@
class btAxisSweep3 : public btAxisSweep3Internal<unsigned short int>
{
public:
-
- btAxisSweep3(const btVector3& worldAabbMin,const btVector3& worldAabbMax, unsigned short int maxHandles = 16384, btOverlappingPairCache* pairCache = 0, bool disableRaycastAccelerator = false);
-
+ 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.
@@ -44,9 +42,7 @@ public:
class bt32BitAxisSweep3 : public btAxisSweep3Internal<unsigned int>
{
public:
-
- bt32BitAxisSweep3(const btVector3& worldAabbMin,const btVector3& worldAabbMax, unsigned int maxHandles = 1500000, btOverlappingPairCache* pairCache = 0, bool disableRaycastAccelerator = false);
-
+ bt32BitAxisSweep3(const btVector3& worldAabbMin, const btVector3& worldAabbMax, unsigned int maxHandles = 1500000, btOverlappingPairCache* pairCache = 0, bool disableRaycastAccelerator = false);
};
#endif
diff --git a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3Internal.h b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3Internal.h
index 323aa96dca..2ee35528fd 100644
--- a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3Internal.h
+++ b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3Internal.h
@@ -36,172 +36,158 @@ template <typename BP_FP_INT_TYPE>
class btAxisSweep3Internal : public btBroadphaseInterface
{
protected:
-
- BP_FP_INT_TYPE m_bpHandleMask;
- BP_FP_INT_TYPE m_handleSentinel;
+ BP_FP_INT_TYPE m_bpHandleMask;
+ BP_FP_INT_TYPE m_handleSentinel;
public:
-
- BT_DECLARE_ALIGNED_ALLOCATOR();
+ BT_DECLARE_ALIGNED_ALLOCATOR();
class Edge
{
public:
- BP_FP_INT_TYPE m_pos; // low bit is min/max
+ 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<BP_FP_INT_TYPE>(m_pos & 1);}
+ BP_FP_INT_TYPE IsMax() const { return static_cast<BP_FP_INT_TYPE>(m_pos & 1); }
};
public:
- class Handle : public btBroadphaseProxy
+ class Handle : public btBroadphaseProxy
{
public:
- BT_DECLARE_ALIGNED_ALLOCATOR();
-
+ 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
+ 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
-
+ 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_worldAabbMin; // overall system bounds
+ btVector3 m_worldAabbMax; // overall system bounds
+
+ btVector3 m_quantize; // scaling factor for quantization
- 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_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
+ 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)
+ 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;
+ 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;
-
+ 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);
+ 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
+ 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 );
+ 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);
- 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();
+ 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 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);
+ 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);
-
-
+ 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);
+ void unQuantize(btBroadphaseProxy* proxy, btVector3& aabbMin, btVector3& aabbMax) const;
+
+ bool testAabbOverlap(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1);
- btOverlappingPairCache* getOverlappingPairCache()
+ btOverlappingPairCache* getOverlappingPairCache()
{
return m_pairCache;
}
- const btOverlappingPairCache* getOverlappingPairCache() const
+ const btOverlappingPairCache* getOverlappingPairCache() const
{
return m_pairCache;
}
- void setOverlappingPairUserCallback(btOverlappingPairCallback* pairCallback)
+ void setOverlappingPairUserCallback(btOverlappingPairCallback* pairCallback)
{
m_userPairCallback = pairCallback;
}
- const btOverlappingPairCallback* getOverlappingPairUserCallback() const
+ 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
+ virtual void getBroadphaseAabb(btVector3& aabbMin, btVector3& aabbMax) const
{
aabbMin = m_worldAabbMin;
aabbMax = m_worldAabbMax;
}
- virtual void printStats()
+ virtual void printStats()
{
-/* printf("btAxisSweep3.h\n");
+ /* 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 <stdio.h>
@@ -209,75 +195,73 @@ template <typename BP_FP_INT_TYPE>
void btAxisSweep3<BP_FP_INT_TYPE>::debugPrintAxis(int axis, bool checkCardinality)
{
int numEdges = m_pHandles[0].m_maxEdges[axis];
- printf("SAP Axis %d, numEdges=%d\n",axis,numEdges);
+ printf("SAP Axis %d, numEdges=%d\n", axis, numEdges);
int i;
- for (i=0;i<numEdges+1;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];
+ 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);
+ 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);
+ btAssert(numEdges == m_numHandles * 2 + 1);
}
-#endif //DEBUG_BROADPHASE
+#endif //DEBUG_BROADPHASE
template <typename BP_FP_INT_TYPE>
-btBroadphaseProxy* btAxisSweep3Internal<BP_FP_INT_TYPE>::createProxy( const btVector3& aabbMin, const btVector3& aabbMax,int shapeType,void* userPtr, int collisionFilterGroup, int collisionFilterMask,btDispatcher* dispatcher)
+btBroadphaseProxy* btAxisSweep3Internal<BP_FP_INT_TYPE>::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;
-}
+ (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 <typename BP_FP_INT_TYPE>
-void btAxisSweep3Internal<BP_FP_INT_TYPE>::destroyProxy(btBroadphaseProxy* proxy,btDispatcher* dispatcher)
+void btAxisSweep3Internal<BP_FP_INT_TYPE>::destroyProxy(btBroadphaseProxy* proxy, btDispatcher* dispatcher)
{
Handle* handle = static_cast<Handle*>(proxy);
if (m_raycastAccelerator)
- m_raycastAccelerator->destroyProxy(handle->m_dbvtProxy,dispatcher);
+ m_raycastAccelerator->destroyProxy(handle->m_dbvtProxy, dispatcher);
removeHandle(static_cast<BP_FP_INT_TYPE>(handle->m_uniqueId), dispatcher);
}
template <typename BP_FP_INT_TYPE>
-void btAxisSweep3Internal<BP_FP_INT_TYPE>::setAabb(btBroadphaseProxy* proxy,const btVector3& aabbMin,const btVector3& aabbMax,btDispatcher* dispatcher)
+void btAxisSweep3Internal<BP_FP_INT_TYPE>::setAabb(btBroadphaseProxy* proxy, const btVector3& aabbMin, const btVector3& aabbMax, btDispatcher* dispatcher)
{
Handle* handle = static_cast<Handle*>(proxy);
handle->m_aabbMin = aabbMin;
handle->m_aabbMax = aabbMax;
- updateHandle(static_cast<BP_FP_INT_TYPE>(handle->m_uniqueId), aabbMin, aabbMax,dispatcher);
+ updateHandle(static_cast<BP_FP_INT_TYPE>(handle->m_uniqueId), aabbMin, aabbMax, dispatcher);
if (m_raycastAccelerator)
- m_raycastAccelerator->setAabb(handle->m_dbvtProxy,aabbMin,aabbMax,dispatcher);
-
+ m_raycastAccelerator->setAabb(handle->m_dbvtProxy, aabbMin, aabbMax, dispatcher);
}
template <typename BP_FP_INT_TYPE>
-void btAxisSweep3Internal<BP_FP_INT_TYPE>::rayTest(const btVector3& rayFrom,const btVector3& rayTo, btBroadphaseRayCallback& rayCallback,const btVector3& aabbMin,const btVector3& aabbMax)
+void btAxisSweep3Internal<BP_FP_INT_TYPE>::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
+ 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++)
+ for (BP_FP_INT_TYPE i = 1; i < m_numHandles * 2 + 1; i++)
{
if (m_pEdges[axis][i].IsMax())
{
@@ -288,22 +272,23 @@ void btAxisSweep3Internal<BP_FP_INT_TYPE>::rayTest(const btVector3& rayFrom,cons
}
template <typename BP_FP_INT_TYPE>
-void btAxisSweep3Internal<BP_FP_INT_TYPE>::aabbTest(const btVector3& aabbMin, const btVector3& aabbMax, btBroadphaseAabbCallback& callback)
+void btAxisSweep3Internal<BP_FP_INT_TYPE>::aabbTest(const btVector3& aabbMin, const btVector3& aabbMax, btBroadphaseAabbCallback& callback)
{
if (m_raycastAccelerator)
{
- m_raycastAccelerator->aabbTest(aabbMin,aabbMax,callback);
- } else
+ 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++)
+ 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))
+ if (TestAabbAgainstAabb2(aabbMin, aabbMax, handle->m_aabbMin, handle->m_aabbMax))
{
callback.process(handle);
}
@@ -312,66 +297,60 @@ void btAxisSweep3Internal<BP_FP_INT_TYPE>::aabbTest(const btVector3& aabbMin, co
}
}
-
-
template <typename BP_FP_INT_TYPE>
-void btAxisSweep3Internal<BP_FP_INT_TYPE>::getAabb(btBroadphaseProxy* proxy,btVector3& aabbMin, btVector3& aabbMax ) const
+void btAxisSweep3Internal<BP_FP_INT_TYPE>::getAabb(btBroadphaseProxy* proxy, btVector3& aabbMin, btVector3& aabbMax) const
{
Handle* pHandle = static_cast<Handle*>(proxy);
aabbMin = pHandle->m_aabbMin;
aabbMax = pHandle->m_aabbMax;
}
-
template <typename BP_FP_INT_TYPE>
-void btAxisSweep3Internal<BP_FP_INT_TYPE>::unQuantize(btBroadphaseProxy* proxy,btVector3& aabbMin, btVector3& aabbMax ) const
+void btAxisSweep3Internal<BP_FP_INT_TYPE>::unQuantize(btBroadphaseProxy* proxy, btVector3& aabbMin, btVector3& aabbMax) const
{
Handle* pHandle = static_cast<Handle*>(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()));
+ 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.setValue((btScalar)(vecInMax[0]) / (m_quantize.getX()), (btScalar)(vecInMax[1]) / (m_quantize.getY()), (btScalar)(vecInMax[2]) / (m_quantize.getZ()));
aabbMax += m_worldAabbMin;
}
-
-
-
template <typename BP_FP_INT_TYPE>
-btAxisSweep3Internal<BP_FP_INT_TYPE>::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)
+btAxisSweep3Internal<BP_FP_INT_TYPE>::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<BP_FP_INT_TYPE>(userMaxHandles+1);//need to add one sentinel handle
+ BP_FP_INT_TYPE maxHandles = static_cast<BP_FP_INT_TYPE>(userMaxHandles + 1); //need to add one sentinel handle
if (!m_pairCache)
{
- void* ptr = btAlignedAlloc(sizeof(btHashedOverlappingPairCache),16);
- m_pairCache = new(ptr) btHashedOverlappingPairCache();
+ 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
+ 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());
@@ -382,13 +361,13 @@ m_raycastAccelerator(0)
btVector3 aabbSize = m_worldAabbMax - m_worldAabbMin;
- BP_FP_INT_TYPE maxInt = m_handleSentinel;
+ BP_FP_INT_TYPE maxInt = m_handleSentinel;
- m_quantize = btVector3(btScalar(maxInt),btScalar(maxInt),btScalar(maxInt)) / aabbSize;
+ 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;
@@ -404,14 +383,14 @@ m_raycastAccelerator(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];
+ 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++)
@@ -425,10 +404,8 @@ m_raycastAccelerator(0)
m_pEdges[axis][1].m_handle = 0;
#ifdef DEBUG_BROADPHASE
debugPrintAxis(axis);
-#endif //DEBUG_BROADPHASE
-
+#endif //DEBUG_BROADPHASE
}
-
}
template <typename BP_FP_INT_TYPE>
@@ -439,14 +416,14 @@ btAxisSweep3Internal<BP_FP_INT_TYPE>::~btAxisSweep3Internal()
m_nullPairCache->~btOverlappingPairCache();
btAlignedFree(m_nullPairCache);
m_raycastAccelerator->~btDbvtBroadphase();
- btAlignedFree (m_raycastAccelerator);
+ btAlignedFree(m_raycastAccelerator);
}
for (int i = 2; i >= 0; i--)
{
btAlignedFree(m_pEdgesRawPtr[i]);
}
- delete [] m_pHandles;
+ delete[] m_pHandles;
if (m_ownsPairCache)
{
@@ -470,13 +447,12 @@ void btAxisSweep3Internal<BP_FP_INT_TYPE>::quantize(BP_FP_INT_TYPE* out, const b
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
+ 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 <typename BP_FP_INT_TYPE>
BP_FP_INT_TYPE btAxisSweep3Internal<BP_FP_INT_TYPE>::allocHandle()
{
@@ -500,9 +476,8 @@ void btAxisSweep3Internal<BP_FP_INT_TYPE>::freeHandle(BP_FP_INT_TYPE handle)
m_numHandles--;
}
-
template <typename BP_FP_INT_TYPE>
-BP_FP_INT_TYPE btAxisSweep3Internal<BP_FP_INT_TYPE>::addHandle(const btVector3& aabbMin,const btVector3& aabbMax, void* pOwner, int collisionFilterGroup, int collisionFilterMask,btDispatcher* dispatcher)
+BP_FP_INT_TYPE btAxisSweep3Internal<BP_FP_INT_TYPE>::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];
@@ -511,10 +486,9 @@ BP_FP_INT_TYPE btAxisSweep3Internal<BP_FP_INT_TYPE>::addHandle(const btVector3&
// allocate a handle
BP_FP_INT_TYPE handle = allocHandle();
-
Handle* pHandle = getHandle(handle);
-
+
pHandle->m_uniqueId = static_cast<int>(handle);
//pHandle->m_pOverlaps = 0;
pHandle->m_clientObject = pOwner;
@@ -524,11 +498,9 @@ BP_FP_INT_TYPE btAxisSweep3Internal<BP_FP_INT_TYPE>::addHandle(const btVector3&
// compute current limit of edge arrays
BP_FP_INT_TYPE limit = static_cast<BP_FP_INT_TYPE>(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];
@@ -544,22 +516,19 @@ BP_FP_INT_TYPE btAxisSweep3Internal<BP_FP_INT_TYPE>::addHandle(const btVector3&
}
// 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);
-
+ 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 <typename BP_FP_INT_TYPE>
-void btAxisSweep3Internal<BP_FP_INT_TYPE>::removeHandle(BP_FP_INT_TYPE handle,btDispatcher* dispatcher)
+void btAxisSweep3Internal<BP_FP_INT_TYPE>::removeHandle(BP_FP_INT_TYPE handle, btDispatcher* dispatcher)
{
-
Handle* pHandle = getHandle(handle);
//explicitly remove the pairs containing the proxy
@@ -567,50 +536,43 @@ void btAxisSweep3Internal<BP_FP_INT_TYPE>::removeHandle(BP_FP_INT_TYPE handle,bt
///@todo: compare performance
if (!m_pairCache->hasDeferredRemoval())
{
- m_pairCache->removeOverlappingPairsContainingProxy(pHandle,dispatcher);
+ m_pairCache->removeOverlappingPairsContainingProxy(pHandle, dispatcher);
}
// compute current limit of edge arrays
int limit = static_cast<int>(m_numHandles * 2);
-
+
int axis;
- for (axis = 0;axis<3;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++)
+ 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);
-
+ 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);
- sortMinUp(axis,i,dispatcher,false);
+ pEdges[limit - 1].m_handle = 0;
+ pEdges[limit - 1].m_pos = m_handleSentinel;
- pEdges[limit-1].m_handle = 0;
- pEdges[limit-1].m_pos = m_handleSentinel;
-
#ifdef DEBUG_BROADPHASE
- debugPrintAxis(axis,false);
-#endif //DEBUG_BROADPHASE
-
-
+ debugPrintAxis(axis, false);
+#endif //DEBUG_BROADPHASE
}
-
// free the handle
freeHandle(handle);
-
-
}
template <typename BP_FP_INT_TYPE>
@@ -625,19 +587,16 @@ void btAxisSweep3Internal<BP_FP_INT_TYPE>::resetPool(btDispatcher* /*dispatcher*
m_pHandles[m_maxHandles - 1].SetNextFree(0);
}
}
-}
-
+}
//#include <stdio.h>
template <typename BP_FP_INT_TYPE>
-void btAxisSweep3Internal<BP_FP_INT_TYPE>::calculateOverlappingPairs(btDispatcher* dispatcher)
+void btAxisSweep3Internal<BP_FP_INT_TYPE>::calculateOverlappingPairs(btDispatcher* dispatcher)
{
-
if (m_pairCache->hasDeferredRemoval())
{
-
- btBroadphasePairArray& overlappingPairArray = m_pairCache->getOverlappingPairArray();
+ btBroadphasePairArray& overlappingPairArray = m_pairCache->getOverlappingPairArray();
//perform a sort, to find duplicates and to sort 'invalid' pairs to the end
overlappingPairArray.quickSort(btBroadphasePairSortPredicate());
@@ -645,18 +604,15 @@ void btAxisSweep3Internal<BP_FP_INT_TYPE>::calculateOverlappingPairs(btDispatche
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++)
+
+ for (i = 0; i < overlappingPairArray.size(); i++)
{
-
btBroadphasePair& pair = overlappingPairArray[i];
bool isDuplicate = (pair == previousPair);
@@ -668,91 +624,90 @@ void btAxisSweep3Internal<BP_FP_INT_TYPE>::calculateOverlappingPairs(btDispatche
if (!isDuplicate)
{
///important to use an AABB test that is consistent with the broadphase
- bool hasOverlap = testAabbOverlap(pair.m_pProxy0,pair.m_pProxy1);
+ bool hasOverlap = testAabbOverlap(pair.m_pProxy0, pair.m_pProxy1);
if (hasOverlap)
{
- needsRemoval = false;//callback->processOverlap(pair);
- } else
+ needsRemoval = false; //callback->processOverlap(pair);
+ }
+ else
{
needsRemoval = true;
}
- } else
+ }
+ else
{
//remove duplicate
needsRemoval = true;
//should have no algorithm
btAssert(!pair.m_algorithm);
}
-
+
if (needsRemoval)
{
- m_pairCache->cleanOverlappingPair(pair,dispatcher);
+ m_pairCache->cleanOverlappingPair(pair, dispatcher);
- // m_overlappingPairArray.swap(i,m_overlappingPairArray.size()-1);
- // m_overlappingPairArray.pop_back();
+ // 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
+///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
-
+#endif //CLEAN_INVALID_PAIRS
+
//printf("overlappingPairArray.size()=%d\n",overlappingPairArray.size());
}
-
}
-
template <typename BP_FP_INT_TYPE>
-bool btAxisSweep3Internal<BP_FP_INT_TYPE>::testAabbOverlap(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1)
+bool btAxisSweep3Internal<BP_FP_INT_TYPE>::testAabbOverlap(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1)
{
const Handle* pHandleA = static_cast<Handle*>(proxy0);
const Handle* pHandleB = static_cast<Handle*>(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;
- }
- }
+ {
+ if (pHandleA->m_maxEdges[axis] < pHandleB->m_minEdges[axis] ||
+ pHandleB->m_maxEdges[axis] < pHandleA->m_minEdges[axis])
+ {
+ return false;
+ }
+ }
return true;
}
template <typename BP_FP_INT_TYPE>
-bool btAxisSweep3Internal<BP_FP_INT_TYPE>::testOverlap2D(const Handle* pHandleA, const Handle* pHandleB,int axis0,int axis1)
+bool btAxisSweep3Internal<BP_FP_INT_TYPE>::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] ||
+ 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;
- }
+ pHandleB->m_maxEdges[axis1] < pHandleA->m_minEdges[axis1])
+ {
+ return false;
+ }
return true;
}
template <typename BP_FP_INT_TYPE>
-void btAxisSweep3Internal<BP_FP_INT_TYPE>::updateHandle(BP_FP_INT_TYPE handle, const btVector3& aabbMin,const btVector3& aabbMax,btDispatcher* dispatcher)
+void btAxisSweep3Internal<BP_FP_INT_TYPE>::updateHandle(BP_FP_INT_TYPE handle, const btVector3& aabbMin, const btVector3& aabbMax, btDispatcher* dispatcher)
{
-// btAssert(bounds.IsFinite());
+ // btAssert(bounds.IsFinite());
//btAssert(bounds.HasVolume());
Handle* pHandle = getHandle(handle);
@@ -776,34 +731,28 @@ void btAxisSweep3Internal<BP_FP_INT_TYPE>::updateHandle(BP_FP_INT_TYPE handle, c
// expand (only adds overlaps)
if (dmin < 0)
- sortMinDown(axis, emin,dispatcher,true);
+ sortMinDown(axis, emin, dispatcher, true);
if (dmax > 0)
- sortMaxUp(axis, emax,dispatcher,true);
+ sortMaxUp(axis, emax, dispatcher, true);
// shrink (only removes overlaps)
if (dmin > 0)
- sortMinUp(axis, emin,dispatcher,true);
+ sortMinUp(axis, emin, dispatcher, true);
if (dmax < 0)
- sortMaxDown(axis, emax,dispatcher,true);
+ sortMaxDown(axis, emax, dispatcher, true);
#ifdef DEBUG_BROADPHASE
- debugPrintAxis(axis);
-#endif //DEBUG_BROADPHASE
+ debugPrintAxis(axis);
+#endif //DEBUG_BROADPHASE
}
-
-
}
-
-
-
// sorting a min edge downwards can only ever *add* overlaps
template <typename BP_FP_INT_TYPE>
void btAxisSweep3Internal<BP_FP_INT_TYPE>::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);
@@ -815,16 +764,15 @@ void btAxisSweep3Internal<BP_FP_INT_TYPE>::sortMinDown(int axis, BP_FP_INT_TYPE
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))
+ const int axis1 = (1 << axis) & 3;
+ const int axis2 = (1 << axis1) & 3;
+ if (updateOverlaps && testOverlap2D(pHandleEdge, pHandlePrev, axis1, axis2))
{
- m_pairCache->addOverlappingPair(pHandleEdge,pHandlePrev);
+ m_pairCache->addOverlappingPair(pHandleEdge, pHandlePrev);
if (m_userPairCallback)
- m_userPairCallback->addOverlappingPair(pHandleEdge,pHandlePrev);
+ m_userPairCallback->addOverlappingPair(pHandleEdge, pHandlePrev);
//AddOverlap(pEdge->m_handle, pPrev->m_handle);
-
}
// update edge reference in other handle
@@ -847,8 +795,7 @@ void btAxisSweep3Internal<BP_FP_INT_TYPE>::sortMinDown(int axis, BP_FP_INT_TYPE
#ifdef DEBUG_BROADPHASE
debugPrintAxis(axis);
-#endif //DEBUG_BROADPHASE
-
+#endif //DEBUG_BROADPHASE
}
// sorting a min edge upwards can only ever *remove* overlaps
@@ -867,25 +814,21 @@ void btAxisSweep3Internal<BP_FP_INT_TYPE>::sortMinUp(int axis, BP_FP_INT_TYPE ed
{
Handle* handle0 = getHandle(pEdge->m_handle);
Handle* handle1 = getHandle(pNext->m_handle);
- const int axis1 = (1 << axis) & 3;
- const int axis2 = (1 << axis1) & 3;
-
+ 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
+ if (updateOverlaps
#ifdef USE_OVERLAP_TEST_ON_REMOVES
- && testOverlap2D(handle0,handle1,axis1,axis2)
-#endif //USE_OVERLAP_TEST_ON_REMOVES
- )
+ && testOverlap2D(handle0, handle1, axis1, axis2)
+#endif //USE_OVERLAP_TEST_ON_REMOVES
+ )
{
-
-
- m_pairCache->removeOverlappingPair(handle0,handle1,dispatcher);
+ m_pairCache->removeOverlappingPair(handle0, handle1, dispatcher);
if (m_userPairCallback)
- m_userPairCallback->removeOverlappingPair(handle0,handle1,dispatcher);
-
+ m_userPairCallback->removeOverlappingPair(handle0, handle1, dispatcher);
}
-
// update edge reference in other handle
pHandleNext->m_maxEdges[axis]--;
}
@@ -903,15 +846,12 @@ void btAxisSweep3Internal<BP_FP_INT_TYPE>::sortMinUp(int axis, BP_FP_INT_TYPE ed
pEdge++;
pNext++;
}
-
-
}
// sorting a max edge downwards can only ever *remove* overlaps
template <typename BP_FP_INT_TYPE>
void btAxisSweep3Internal<BP_FP_INT_TYPE>::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);
@@ -925,28 +865,25 @@ void btAxisSweep3Internal<BP_FP_INT_TYPE>::sortMaxDown(int axis, BP_FP_INT_TYPE
// 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;
+ const int axis1 = (1 << axis) & 3;
+ const int axis2 = (1 << axis1) & 3;
- if (updateOverlaps
+ if (updateOverlaps
#ifdef USE_OVERLAP_TEST_ON_REMOVES
- && testOverlap2D(handle0,handle1,axis1,axis2)
-#endif //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);
+ m_pairCache->removeOverlappingPair(handle0, handle1, dispatcher);
if (m_userPairCallback)
- m_userPairCallback->removeOverlappingPair(handle0,handle1,dispatcher);
-
-
-
+ m_userPairCallback->removeOverlappingPair(handle0, handle1, dispatcher);
}
// update edge reference in other handle
- pHandlePrev->m_minEdges[axis]++;;
+ pHandlePrev->m_minEdges[axis]++;
+ ;
}
else
pHandlePrev->m_maxEdges[axis]++;
@@ -963,11 +900,9 @@ void btAxisSweep3Internal<BP_FP_INT_TYPE>::sortMaxDown(int axis, BP_FP_INT_TYPE
pPrev--;
}
-
#ifdef DEBUG_BROADPHASE
debugPrintAxis(axis);
-#endif //DEBUG_BROADPHASE
-
+#endif //DEBUG_BROADPHASE
}
// sorting a max edge upwards can only ever *add* overlaps
@@ -982,19 +917,19 @@ void btAxisSweep3Internal<BP_FP_INT_TYPE>::sortMaxUp(int axis, BP_FP_INT_TYPE ed
{
Handle* pHandleNext = getHandle(pNext->m_handle);
- const int axis1 = (1 << axis) & 3;
- const int axis2 = (1 << axis1) & 3;
+ 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))
+ if (updateOverlaps && testOverlap2D(pHandleEdge, pHandleNext, axis1, axis2))
{
Handle* handle0 = getHandle(pEdge->m_handle);
Handle* handle1 = getHandle(pNext->m_handle);
- m_pairCache->addOverlappingPair(handle0,handle1);
+ m_pairCache->addOverlappingPair(handle0, handle1);
if (m_userPairCallback)
- m_userPairCallback->addOverlappingPair(handle0,handle1);
+ m_userPairCallback->addOverlappingPair(handle0, handle1);
}
// update edge reference in other handle
@@ -1014,7 +949,6 @@ void btAxisSweep3Internal<BP_FP_INT_TYPE>::sortMaxUp(int axis, BP_FP_INT_TYPE ed
pEdge++;
pNext++;
}
-
}
#endif
diff --git a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btBroadphaseInterface.h b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btBroadphaseInterface.h
index fb68e0024e..b097eca5f5 100644
--- a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btBroadphaseInterface.h
+++ b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btBroadphaseInterface.h
@@ -13,10 +13,8 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-#ifndef BT_BROADPHASE_INTERFACE_H
-#define BT_BROADPHASE_INTERFACE_H
-
-
+#ifndef BT_BROADPHASE_INTERFACE_H
+#define BT_BROADPHASE_INTERFACE_H
struct btDispatcherInfo;
class btDispatcher;
@@ -24,27 +22,23 @@ class btDispatcher;
class btOverlappingPairCache;
-
-
-struct btBroadphaseAabbCallback
+struct btBroadphaseAabbCallback
{
virtual ~btBroadphaseAabbCallback() {}
- virtual bool process(const btBroadphaseProxy* proxy) = 0;
+ virtual bool process(const btBroadphaseProxy* proxy) = 0;
};
-
-struct btBroadphaseRayCallback : public btBroadphaseAabbCallback
+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;
+ btVector3 m_rayDirectionInverse;
+ unsigned int m_signs[3];
+ btScalar m_lambda_max;
virtual ~btBroadphaseRayCallback() {}
-
+
protected:
-
- btBroadphaseRayCallback() {}
+ btBroadphaseRayCallback() {}
};
#include "LinearMath/btVector3.h"
@@ -57,30 +51,29 @@ 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 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 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;
+ 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 void calculateOverlappingPairs(btDispatcher* dispatcher) = 0;
- virtual btOverlappingPairCache* getOverlappingPairCache()=0;
- virtual const btOverlappingPairCache* getOverlappingPairCache() const =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;
+ 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;
+ virtual void resetPool(btDispatcher* dispatcher) { (void)dispatcher; };
+ virtual void printStats() = 0;
};
-#endif //BT_BROADPHASE_INTERFACE_H
+#endif //BT_BROADPHASE_INTERFACE_H
diff --git a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btBroadphaseProxy.cpp b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btBroadphaseProxy.cpp
index 0fd4ef46be..7ee065aac3 100644
--- a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btBroadphaseProxy.cpp
+++ b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btBroadphaseProxy.cpp
@@ -15,4 +15,4 @@ subject to the following restrictions:
#include "btBroadphaseProxy.h"
-BT_NOT_EMPTY_FILE // fix warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library
+BT_NOT_EMPTY_FILE // fix warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library
diff --git a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h
index f6e1202a69..825caeef56 100644
--- a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h
+++ b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h
@@ -16,11 +16,10 @@ subject to the following restrictions:
#ifndef BT_BROADPHASE_PROXY_H
#define BT_BROADPHASE_PROXY_H
-#include "LinearMath/btScalar.h" //for SIMD_FORCE_INLINE
+#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
@@ -35,8 +34,8 @@ enum BroadphaseNativeTypes
CONVEX_HULL_SHAPE_PROXYTYPE,
CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE,
CUSTOM_POLYHEDRAL_SHAPE_TYPE,
-//implicit convex shapes
-IMPLICIT_CONVEX_SHAPES_START_HERE,
+ //implicit convex shapes
+ IMPLICIT_CONVEX_SHAPES_START_HERE,
SPHERE_SHAPE_PROXYTYPE,
MULTI_SPHERE_SHAPE_PROXYTYPE,
CAPSULE_SHAPE_PROXYTYPE,
@@ -49,8 +48,8 @@ IMPLICIT_CONVEX_SHAPES_START_HERE,
BOX_2D_SHAPE_PROXYTYPE,
CONVEX_2D_SHAPE_PROXYTYPE,
CUSTOM_CONVEX_SHAPE_TYPE,
-//concave shapes
-CONCAVE_SHAPES_START_HERE,
+ //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,
@@ -58,16 +57,16 @@ CONCAVE_SHAPES_START_HERE,
FAST_CONCAVE_MESH_PROXYTYPE,
//terrain
TERRAIN_SHAPE_PROXYTYPE,
-///Used for GIMPACT Trimesh integration
+ ///Used for GIMPACT Trimesh integration
GIMPACT_SHAPE_PROXYTYPE,
-///Multimaterial mesh
- MULTIMATERIAL_TRIANGLE_MESH_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,
+ SDF_SHAPE_PROXYTYPE = CUSTOM_CONCAVE_SHAPE_TYPE,
+ CONCAVE_SHAPES_END_HERE,
COMPOUND_SHAPE_PROXYTYPE,
@@ -77,38 +76,37 @@ CONCAVE_SHAPES_END_HERE,
INVALID_SHAPE_PROXYTYPE,
MAX_BROADPHASE_COLLISION_TYPES
-
-};
+};
-///The btBroadphaseProxy is the main class that can be used with the Bullet broadphases.
+///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
+ATTRIBUTE_ALIGNED16(struct)
+btBroadphaseProxy
{
+ BT_DECLARE_ALIGNED_ALLOCATOR();
-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
+ 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;
+ 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.
+ 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;
+ btVector3 m_aabbMin;
+ btVector3 m_aabbMax;
SIMD_FORCE_INLINE int getUid() const
{
@@ -116,47 +114,45 @@ BT_DECLARE_ALIGNED_ALLOCATOR();
}
//used for memory pools
- btBroadphaseProxy() :m_clientObject(0)
+ 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)
+ 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);
+ return (proxyType < IMPLICIT_CONVEX_SHAPES_START_HERE);
}
- static SIMD_FORCE_INLINE bool isConvex(int proxyType)
+ static SIMD_FORCE_INLINE bool isConvex(int proxyType)
{
return (proxyType < CONCAVE_SHAPES_START_HERE);
}
- static SIMD_FORCE_INLINE bool isNonMoving(int proxyType)
+ static SIMD_FORCE_INLINE bool isNonMoving(int proxyType)
{
- return (isConcave(proxyType) && !(proxyType==GIMPACT_SHAPE_PROXYTYPE));
+ return (isConcave(proxyType) && !(proxyType == GIMPACT_SHAPE_PROXYTYPE));
}
- static SIMD_FORCE_INLINE bool isConcave(int proxyType)
+ static SIMD_FORCE_INLINE bool isConcave(int proxyType)
{
return ((proxyType > CONCAVE_SHAPES_START_HERE) &&
- (proxyType < CONCAVE_SHAPES_END_HERE));
+ (proxyType < CONCAVE_SHAPES_END_HERE));
}
- static SIMD_FORCE_INLINE bool isCompound(int proxyType)
+ static SIMD_FORCE_INLINE bool isCompound(int proxyType)
{
return (proxyType == COMPOUND_SHAPE_PROXYTYPE);
}
- static SIMD_FORCE_INLINE bool isSoftBody(int proxyType)
+ static SIMD_FORCE_INLINE bool isSoftBody(int proxyType)
{
return (proxyType == SOFTBODY_SHAPE_PROXYTYPE);
}
@@ -168,67 +164,62 @@ BT_DECLARE_ALIGNED_ALLOCATOR();
static SIMD_FORCE_INLINE bool isConvex2d(int proxyType)
{
- return (proxyType == BOX_2D_SHAPE_PROXYTYPE) || (proxyType == CONVEX_2D_SHAPE_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
+ATTRIBUTE_ALIGNED16(struct)
+btBroadphasePair
{
- btBroadphasePair ()
- :
- m_pProxy0(0),
- m_pProxy1(0),
- m_algorithm(0),
- m_internalInfo1(0)
+ btBroadphasePair()
+ : m_pProxy0(0),
+ m_pProxy1(0),
+ m_algorithm(0),
+ m_internalInfo1(0)
{
}
-BT_DECLARE_ALIGNED_ALLOCATOR();
+ BT_DECLARE_ALIGNED_ALLOCATOR();
btBroadphasePair(const btBroadphasePair& other)
- : m_pProxy0(other.m_pProxy0),
- m_pProxy1(other.m_pProxy1),
- m_algorithm(other.m_algorithm),
- m_internalInfo1(other.m_internalInfo1)
+ : m_pProxy0(other.m_pProxy0),
+ m_pProxy1(other.m_pProxy1),
+ m_algorithm(other.m_algorithm),
+ m_internalInfo1(other.m_internalInfo1)
{
}
- btBroadphasePair(btBroadphaseProxy& proxy0,btBroadphaseProxy& proxy1)
+ 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_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.
+ mutable btCollisionAlgorithm* m_algorithm;
+ union {
+ void* m_internalInfo1;
+ int m_internalTmpValue;
+ }; //don't use this data, it will be removed in future version.
};
/*
@@ -240,31 +231,25 @@ SIMD_FORCE_INLINE bool operator<(const btBroadphasePair& a, const btBroadphasePa
}
*/
-
-
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);
- }
+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)
+SIMD_FORCE_INLINE bool operator==(const btBroadphasePair& a, const btBroadphasePair& b)
{
- return (a.m_pProxy0 == b.m_pProxy0) && (a.m_pProxy1 == b.m_pProxy1);
+ return (a.m_pProxy0 == b.m_pProxy0) && (a.m_pProxy1 == b.m_pProxy1);
}
-
-#endif //BT_BROADPHASE_PROXY_H
-
+#endif //BT_BROADPHASE_PROXY_H
diff --git a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.cpp b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.cpp
index c95d1be0f2..6e36d3bd73 100644
--- a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.cpp
+++ b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.cpp
@@ -20,4 +20,3 @@ btCollisionAlgorithm::btCollisionAlgorithm(const btCollisionAlgorithmConstructio
{
m_dispatcher = ci.m_dispatcher1;
}
-
diff --git a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h
index 405656236b..b00c0b1b4b 100644
--- a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h
+++ b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h
@@ -25,57 +25,51 @@ class btManifoldResult;
class btCollisionObject;
struct btCollisionObjectWrapper;
struct btDispatcherInfo;
-class btPersistentManifold;
+class btPersistentManifold;
-typedef btAlignedObjectArray<btPersistentManifold*> btManifoldArray;
+typedef btAlignedObjectArray<btPersistentManifold*> btManifoldArray;
struct btCollisionAlgorithmConstructionInfo
{
btCollisionAlgorithmConstructionInfo()
- :m_dispatcher1(0),
- m_manifold(0)
+ : m_dispatcher1(0),
+ m_manifold(0)
{
}
- btCollisionAlgorithmConstructionInfo(btDispatcher* dispatcher,int temp)
- :m_dispatcher1(dispatcher)
+ btCollisionAlgorithmConstructionInfo(btDispatcher* dispatcher, int temp)
+ : m_dispatcher1(dispatcher)
{
(void)temp;
}
- btDispatcher* m_dispatcher1;
- btPersistentManifold* m_manifold;
-
-// int getDispatcherId();
+ 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;
+ btDispatcher* m_dispatcher;
protected:
-// int getDispatcherId();
-
-public:
+ // int getDispatcherId();
- btCollisionAlgorithm() {};
+public:
+ btCollisionAlgorithm(){};
btCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci);
- virtual ~btCollisionAlgorithm() {};
+ virtual ~btCollisionAlgorithm(){};
- virtual void processCollision (const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) = 0;
+ 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 btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut) = 0;
- virtual void getAllContactManifolds(btManifoldArray& manifoldArray) = 0;
+ virtual void getAllContactManifolds(btManifoldArray& manifoldArray) = 0;
};
-
-#endif //BT_COLLISION_ALGORITHM_H
+#endif //BT_COLLISION_ALGORITHM_H
diff --git a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDbvt.cpp b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDbvt.cpp
index d791d07418..37156fd589 100644
--- a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDbvt.cpp
+++ b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDbvt.cpp
@@ -17,210 +17,225 @@ subject to the following restrictions:
#include "btDbvt.h"
//
-typedef btAlignedObjectArray<btDbvtNode*> tNodeArray;
-typedef btAlignedObjectArray<const btDbvtNode*> tConstNodeArray;
+typedef btAlignedObjectArray<btDbvtNode*> tNodeArray;
+typedef btAlignedObjectArray<const btDbvtNode*> tConstNodeArray;
//
struct btDbvtNodeEnumerator : btDbvt::ICollide
{
- tConstNodeArray nodes;
+ tConstNodeArray nodes;
void Process(const btDbvtNode* n) { nodes.push_back(n); }
};
//
-static DBVT_INLINE int indexof(const btDbvtNode* node)
+static DBVT_INLINE int indexof(const btDbvtNode* node)
{
- return(node->parent->childs[1]==node);
+ return (node->parent->childs[1] == node);
}
//
-static DBVT_INLINE btDbvtVolume merge( const btDbvtVolume& a,
+static DBVT_INLINE btDbvtVolume merge(const btDbvtVolume& a,
const btDbvtVolume& b)
{
-#if (DBVT_MERGE_IMPL==DBVT_IMPL_SSE)
- ATTRIBUTE_ALIGNED16( char locals[sizeof(btDbvtAabbMm)]);
- btDbvtVolume* ptr = (btDbvtVolume*) locals;
- btDbvtVolume& res=*ptr;
+#if (DBVT_MERGE_IMPL == DBVT_IMPL_SSE)
+ ATTRIBUTE_ALIGNED16(char locals[sizeof(btDbvtAabbMm)]);
+ btDbvtVolume* ptr = (btDbvtVolume*)locals;
+ btDbvtVolume& res = *ptr;
#else
- btDbvtVolume res;
+ btDbvtVolume res;
#endif
- Merge(a,b,res);
- return(res);
+ Merge(a, b, res);
+ return (res);
}
// volume+edge lengths
-static DBVT_INLINE btScalar size(const btDbvtVolume& a)
+static DBVT_INLINE btScalar size(const btDbvtVolume& a)
{
- const btVector3 edges=a.Lengths();
- return( edges.x()*edges.y()*edges.z()+
- edges.x()+edges.y()+edges.z());
+ const btVector3 edges = a.Lengths();
+ return (edges.x() * edges.y() * edges.z() +
+ edges.x() + edges.y() + edges.z());
}
//
-static void getmaxdepth(const btDbvtNode* node,int depth,int& maxdepth)
+static void getmaxdepth(const btDbvtNode* node, int depth, int& maxdepth)
{
- if(node->isinternal())
+ if (node->isinternal())
{
- getmaxdepth(node->childs[0],depth+1,maxdepth);
- getmaxdepth(node->childs[1],depth+1,maxdepth);
- } else maxdepth=btMax(maxdepth,depth);
+ getmaxdepth(node->childs[0], depth + 1, maxdepth);
+ getmaxdepth(node->childs[1], depth + 1, maxdepth);
+ }
+ else
+ maxdepth = btMax(maxdepth, depth);
}
//
-static DBVT_INLINE void deletenode( btDbvt* pdbvt,
- btDbvtNode* node)
+static DBVT_INLINE void deletenode(btDbvt* pdbvt,
+ btDbvtNode* node)
{
btAlignedFree(pdbvt->m_free);
- pdbvt->m_free=node;
+ pdbvt->m_free = node;
}
//
-static void recursedeletenode( btDbvt* pdbvt,
- btDbvtNode* node)
+static void recursedeletenode(btDbvt* pdbvt,
+ btDbvtNode* node)
{
- if(!node->isleaf())
+ if (!node->isleaf())
{
- recursedeletenode(pdbvt,node->childs[0]);
- recursedeletenode(pdbvt,node->childs[1]);
+ recursedeletenode(pdbvt, node->childs[0]);
+ recursedeletenode(pdbvt, node->childs[1]);
}
- if(node==pdbvt->m_root) pdbvt->m_root=0;
- deletenode(pdbvt,node);
+ if (node == pdbvt->m_root) pdbvt->m_root = 0;
+ deletenode(pdbvt, node);
}
//
-static DBVT_INLINE btDbvtNode* createnode( btDbvt* pdbvt,
- btDbvtNode* parent,
- void* data)
+static DBVT_INLINE btDbvtNode* createnode(btDbvt* pdbvt,
+ btDbvtNode* parent,
+ void* data)
{
- btDbvtNode* node;
- if(pdbvt->m_free)
- { node=pdbvt->m_free;pdbvt->m_free=0; }
+ btDbvtNode* node;
+ if (pdbvt->m_free)
+ {
+ node = pdbvt->m_free;
+ pdbvt->m_free = 0;
+ }
else
- { node=new(btAlignedAlloc(sizeof(btDbvtNode),16)) btDbvtNode(); }
- node->parent = parent;
- node->data = data;
- node->childs[1] = 0;
- return(node);
+ {
+ node = new (btAlignedAlloc(sizeof(btDbvtNode), 16)) btDbvtNode();
+ }
+ node->parent = parent;
+ node->data = data;
+ node->childs[1] = 0;
+ return (node);
}
//
-static DBVT_INLINE btDbvtNode* createnode( btDbvt* pdbvt,
- btDbvtNode* parent,
- const btDbvtVolume& volume,
- void* data)
+static DBVT_INLINE btDbvtNode* createnode(btDbvt* pdbvt,
+ btDbvtNode* parent,
+ const btDbvtVolume& volume,
+ void* data)
{
- btDbvtNode* node=createnode(pdbvt,parent,data);
- node->volume=volume;
- return(node);
+ btDbvtNode* node = createnode(pdbvt, parent, data);
+ node->volume = volume;
+ return (node);
}
//
-static DBVT_INLINE btDbvtNode* createnode( btDbvt* pdbvt,
- btDbvtNode* parent,
- const btDbvtVolume& volume0,
- const btDbvtVolume& volume1,
- void* data)
+static DBVT_INLINE btDbvtNode* createnode(btDbvt* pdbvt,
+ btDbvtNode* parent,
+ const btDbvtVolume& volume0,
+ const btDbvtVolume& volume1,
+ void* data)
{
- btDbvtNode* node=createnode(pdbvt,parent,data);
- Merge(volume0,volume1,node->volume);
- return(node);
+ btDbvtNode* node = createnode(pdbvt, parent, data);
+ Merge(volume0, volume1, node->volume);
+ return (node);
}
//
-static void insertleaf( btDbvt* pdbvt,
- btDbvtNode* root,
- btDbvtNode* leaf)
+static void insertleaf(btDbvt* pdbvt,
+ btDbvtNode* root,
+ btDbvtNode* leaf)
{
- if(!pdbvt->m_root)
+ if (!pdbvt->m_root)
{
- pdbvt->m_root = leaf;
- leaf->parent = 0;
+ pdbvt->m_root = leaf;
+ leaf->parent = 0;
}
else
{
- if(!root->isleaf())
+ if (!root->isleaf())
{
- do {
- root=root->childs[Select( leaf->volume,
- root->childs[0]->volume,
- root->childs[1]->volume)];
- } while(!root->isleaf());
+ do
+ {
+ root = root->childs[Select(leaf->volume,
+ root->childs[0]->volume,
+ root->childs[1]->volume)];
+ } while (!root->isleaf());
}
- btDbvtNode* prev=root->parent;
- btDbvtNode* node=createnode(pdbvt,prev,leaf->volume,root->volume,0);
- if(prev)
+ btDbvtNode* prev = root->parent;
+ btDbvtNode* node = createnode(pdbvt, prev, leaf->volume, root->volume, 0);
+ if (prev)
{
- prev->childs[indexof(root)] = node;
- node->childs[0] = root;root->parent=node;
- node->childs[1] = leaf;leaf->parent=node;
- do {
- if(!prev->volume.Contain(node->volume))
- Merge(prev->childs[0]->volume,prev->childs[1]->volume,prev->volume);
+ prev->childs[indexof(root)] = node;
+ node->childs[0] = root;
+ root->parent = node;
+ node->childs[1] = leaf;
+ leaf->parent = node;
+ do
+ {
+ if (!prev->volume.Contain(node->volume))
+ Merge(prev->childs[0]->volume, prev->childs[1]->volume, prev->volume);
else
break;
- node=prev;
- } while(0!=(prev=node->parent));
+ node = prev;
+ } while (0 != (prev = node->parent));
}
else
{
- node->childs[0] = root;root->parent=node;
- node->childs[1] = leaf;leaf->parent=node;
- pdbvt->m_root = node;
+ node->childs[0] = root;
+ root->parent = node;
+ node->childs[1] = leaf;
+ leaf->parent = node;
+ pdbvt->m_root = node;
}
}
}
//
-static btDbvtNode* removeleaf( btDbvt* pdbvt,
- btDbvtNode* leaf)
+static btDbvtNode* removeleaf(btDbvt* pdbvt,
+ btDbvtNode* leaf)
{
- if(leaf==pdbvt->m_root)
+ if (leaf == pdbvt->m_root)
{
- pdbvt->m_root=0;
- return(0);
+ pdbvt->m_root = 0;
+ return (0);
}
else
{
- btDbvtNode* parent=leaf->parent;
- btDbvtNode* prev=parent->parent;
- btDbvtNode* sibling=parent->childs[1-indexof(leaf)];
- if(prev)
+ btDbvtNode* parent = leaf->parent;
+ btDbvtNode* prev = parent->parent;
+ btDbvtNode* sibling = parent->childs[1 - indexof(leaf)];
+ if (prev)
{
- prev->childs[indexof(parent)]=sibling;
- sibling->parent=prev;
- deletenode(pdbvt,parent);
- while(prev)
+ prev->childs[indexof(parent)] = sibling;
+ sibling->parent = prev;
+ deletenode(pdbvt, parent);
+ while (prev)
{
- const btDbvtVolume pb=prev->volume;
- Merge(prev->childs[0]->volume,prev->childs[1]->volume,prev->volume);
- if(NotEqual(pb,prev->volume))
+ const btDbvtVolume pb = prev->volume;
+ Merge(prev->childs[0]->volume, prev->childs[1]->volume, prev->volume);
+ if (NotEqual(pb, prev->volume))
{
- prev=prev->parent;
- } else break;
+ prev = prev->parent;
+ }
+ else
+ break;
}
- return(prev?prev:pdbvt->m_root);
+ return (prev ? prev : pdbvt->m_root);
}
else
- {
- pdbvt->m_root=sibling;
- sibling->parent=0;
- deletenode(pdbvt,parent);
- return(pdbvt->m_root);
- }
+ {
+ pdbvt->m_root = sibling;
+ sibling->parent = 0;
+ deletenode(pdbvt, parent);
+ return (pdbvt->m_root);
+ }
}
}
//
-static void fetchleaves(btDbvt* pdbvt,
- btDbvtNode* root,
- tNodeArray& leaves,
- int depth=-1)
+static void fetchleaves(btDbvt* pdbvt,
+ btDbvtNode* root,
+ tNodeArray& leaves,
+ int depth = -1)
{
- if(root->isinternal()&&depth)
+ if (root->isinternal() && depth)
{
- fetchleaves(pdbvt,root->childs[0],leaves,depth-1);
- fetchleaves(pdbvt,root->childs[1],leaves,depth-1);
- deletenode(pdbvt,root);
+ fetchleaves(pdbvt, root->childs[0], leaves, depth - 1);
+ fetchleaves(pdbvt, root->childs[1], leaves, depth - 1);
+ deletenode(pdbvt, root);
}
else
{
@@ -229,51 +244,50 @@ static void fetchleaves(btDbvt* pdbvt,
}
//
-static bool leftOfAxis( const btDbvtNode* node,
- const btVector3& org,
- const btVector3& axis)
+static bool leftOfAxis(const btDbvtNode* node,
+ const btVector3& org,
+ const btVector3& axis)
{
return btDot(axis, node->volume.Center() - org) <= 0;
}
-
// Partitions leaves such that leaves[0, n) are on the
// left of axis, and leaves[n, count) are on the right
// of axis. returns N.
-static int split( btDbvtNode** leaves,
- int count,
- const btVector3& org,
- const btVector3& axis)
+static int split(btDbvtNode** leaves,
+ int count,
+ const btVector3& org,
+ const btVector3& axis)
{
- int begin=0;
- int end=count;
- for(;;)
+ int begin = 0;
+ int end = count;
+ for (;;)
{
- while(begin!=end && leftOfAxis(leaves[begin],org,axis))
+ while (begin != end && leftOfAxis(leaves[begin], org, axis))
{
++begin;
}
- if(begin==end)
+ if (begin == end)
{
break;
}
- while(begin!=end && !leftOfAxis(leaves[end-1],org,axis))
+ while (begin != end && !leftOfAxis(leaves[end - 1], org, axis))
{
--end;
}
- if(begin==end)
+ if (begin == end)
{
break;
}
// swap out of place nodes
--end;
- btDbvtNode* temp=leaves[begin];
- leaves[begin]=leaves[end];
- leaves[end]=temp;
+ btDbvtNode* temp = leaves[begin];
+ leaves[begin] = leaves[end];
+ leaves[end] = temp;
++begin;
}
@@ -281,150 +295,153 @@ static int split( btDbvtNode** leaves,
}
//
-static btDbvtVolume bounds( btDbvtNode** leaves,
- int count)
+static btDbvtVolume bounds(btDbvtNode** leaves,
+ int count)
{
-#if DBVT_MERGE_IMPL==DBVT_IMPL_SSE
- ATTRIBUTE_ALIGNED16(char locals[sizeof(btDbvtVolume)]);
- btDbvtVolume* ptr = (btDbvtVolume*) locals;
- btDbvtVolume& volume=*ptr;
- volume=leaves[0]->volume;
+#if DBVT_MERGE_IMPL == DBVT_IMPL_SSE
+ ATTRIBUTE_ALIGNED16(char locals[sizeof(btDbvtVolume)]);
+ btDbvtVolume* ptr = (btDbvtVolume*)locals;
+ btDbvtVolume& volume = *ptr;
+ volume = leaves[0]->volume;
#else
- btDbvtVolume volume=leaves[0]->volume;
+ btDbvtVolume volume = leaves[0]->volume;
#endif
- for(int i=1,ni=count;i<ni;++i)
+ for (int i = 1, ni = count; i < ni; ++i)
{
- Merge(volume,leaves[i]->volume,volume);
+ Merge(volume, leaves[i]->volume, volume);
}
- return(volume);
+ return (volume);
}
//
-static void bottomup( btDbvt* pdbvt,
- btDbvtNode** leaves,
- int count)
+static void bottomup(btDbvt* pdbvt,
+ btDbvtNode** leaves,
+ int count)
{
- while(count>1)
+ while (count > 1)
{
- btScalar minsize=SIMD_INFINITY;
- int minidx[2]={-1,-1};
- for(int i=0;i<count;++i)
+ btScalar minsize = SIMD_INFINITY;
+ int minidx[2] = {-1, -1};
+ for (int i = 0; i < count; ++i)
{
- for(int j=i+1;j<count;++j)
+ for (int j = i + 1; j < count; ++j)
{
- const btScalar sz=size(merge(leaves[i]->volume,leaves[j]->volume));
- if(sz<minsize)
+ const btScalar sz = size(merge(leaves[i]->volume, leaves[j]->volume));
+ if (sz < minsize)
{
- minsize = sz;
- minidx[0] = i;
- minidx[1] = j;
+ minsize = sz;
+ minidx[0] = i;
+ minidx[1] = j;
}
}
}
- btDbvtNode* n[] = {leaves[minidx[0]],leaves[minidx[1]]};
- btDbvtNode* p = createnode(pdbvt,0,n[0]->volume,n[1]->volume,0);
- p->childs[0] = n[0];
- p->childs[1] = n[1];
- n[0]->parent = p;
- n[1]->parent = p;
- leaves[minidx[0]] = p;
- leaves[minidx[1]] = leaves[count-1];
+ btDbvtNode* n[] = {leaves[minidx[0]], leaves[minidx[1]]};
+ btDbvtNode* p = createnode(pdbvt, 0, n[0]->volume, n[1]->volume, 0);
+ p->childs[0] = n[0];
+ p->childs[1] = n[1];
+ n[0]->parent = p;
+ n[1]->parent = p;
+ leaves[minidx[0]] = p;
+ leaves[minidx[1]] = leaves[count - 1];
--count;
}
}
//
-static btDbvtNode* topdown(btDbvt* pdbvt,
- btDbvtNode** leaves,
- int count,
- int bu_treshold)
+static btDbvtNode* topdown(btDbvt* pdbvt,
+ btDbvtNode** leaves,
+ int count,
+ int bu_treshold)
{
- static const btVector3 axis[]={btVector3(1,0,0),
- btVector3(0,1,0),
- btVector3(0,0,1)};
- btAssert(bu_treshold>2);
- if(count>1)
+ static const btVector3 axis[] = {btVector3(1, 0, 0),
+ btVector3(0, 1, 0),
+ btVector3(0, 0, 1)};
+ btAssert(bu_treshold > 2);
+ if (count > 1)
{
- if(count>bu_treshold)
+ if (count > bu_treshold)
{
- const btDbvtVolume vol=bounds(leaves,count);
- const btVector3 org=vol.Center();
- int partition;
- int bestaxis=-1;
- int bestmidp=count;
- int splitcount[3][2]={{0,0},{0,0},{0,0}};
+ const btDbvtVolume vol = bounds(leaves, count);
+ const btVector3 org = vol.Center();
+ int partition;
+ int bestaxis = -1;
+ int bestmidp = count;
+ int splitcount[3][2] = {{0, 0}, {0, 0}, {0, 0}};
int i;
- for( i=0;i<count;++i)
+ for (i = 0; i < count; ++i)
{
- const btVector3 x=leaves[i]->volume.Center()-org;
- for(int j=0;j<3;++j)
+ const btVector3 x = leaves[i]->volume.Center() - org;
+ for (int j = 0; j < 3; ++j)
{
- ++splitcount[j][btDot(x,axis[j])>0?1:0];
+ ++splitcount[j][btDot(x, axis[j]) > 0 ? 1 : 0];
}
}
- for( i=0;i<3;++i)
+ for (i = 0; i < 3; ++i)
{
- if((splitcount[i][0]>0)&&(splitcount[i][1]>0))
+ if ((splitcount[i][0] > 0) && (splitcount[i][1] > 0))
{
- const int midp=(int)btFabs(btScalar(splitcount[i][0]-splitcount[i][1]));
- if(midp<bestmidp)
+ const int midp = (int)btFabs(btScalar(splitcount[i][0] - splitcount[i][1]));
+ if (midp < bestmidp)
{
- bestaxis=i;
- bestmidp=midp;
+ bestaxis = i;
+ bestmidp = midp;
}
}
}
- if(bestaxis>=0)
+ if (bestaxis >= 0)
{
- partition=split(leaves,count,org,axis[bestaxis]);
- btAssert(partition!=0 && partition!=count);
+ partition = split(leaves, count, org, axis[bestaxis]);
+ btAssert(partition != 0 && partition != count);
}
else
{
- partition=count/2+1;
+ partition = count / 2 + 1;
}
- btDbvtNode* node=createnode(pdbvt,0,vol,0);
- node->childs[0]=topdown(pdbvt,&leaves[0],partition,bu_treshold);
- node->childs[1]=topdown(pdbvt,&leaves[partition],count-partition,bu_treshold);
- node->childs[0]->parent=node;
- node->childs[1]->parent=node;
- return(node);
+ btDbvtNode* node = createnode(pdbvt, 0, vol, 0);
+ node->childs[0] = topdown(pdbvt, &leaves[0], partition, bu_treshold);
+ node->childs[1] = topdown(pdbvt, &leaves[partition], count - partition, bu_treshold);
+ node->childs[0]->parent = node;
+ node->childs[1]->parent = node;
+ return (node);
}
else
{
- bottomup(pdbvt,leaves,count);
- return(leaves[0]);
+ bottomup(pdbvt, leaves, count);
+ return (leaves[0]);
}
}
- return(leaves[0]);
+ return (leaves[0]);
}
//
-static DBVT_INLINE btDbvtNode* sort(btDbvtNode* n,btDbvtNode*& r)
+static DBVT_INLINE btDbvtNode* sort(btDbvtNode* n, btDbvtNode*& r)
{
- btDbvtNode* p=n->parent;
+ btDbvtNode* p = n->parent;
btAssert(n->isinternal());
- if(p>n)
+ if (p > n)
{
- const int i=indexof(n);
- const int j=1-i;
- btDbvtNode* s=p->childs[j];
- btDbvtNode* q=p->parent;
- btAssert(n==p->childs[i]);
- if(q) q->childs[indexof(p)]=n; else r=n;
- s->parent=n;
- p->parent=n;
- n->parent=q;
- p->childs[0]=n->childs[0];
- p->childs[1]=n->childs[1];
- n->childs[0]->parent=p;
- n->childs[1]->parent=p;
- n->childs[i]=p;
- n->childs[j]=s;
- btSwap(p->volume,n->volume);
- return(p);
+ const int i = indexof(n);
+ const int j = 1 - i;
+ btDbvtNode* s = p->childs[j];
+ btDbvtNode* q = p->parent;
+ btAssert(n == p->childs[i]);
+ if (q)
+ q->childs[indexof(p)] = n;
+ else
+ r = n;
+ s->parent = n;
+ p->parent = n;
+ n->parent = q;
+ p->childs[0] = n->childs[0];
+ p->childs[1] = n->childs[1];
+ n->childs[0]->parent = p;
+ n->childs[1]->parent = p;
+ n->childs[i] = p;
+ n->childs[j] = s;
+ btSwap(p->volume, n->volume);
+ return (p);
}
- return(n);
+ return (n);
}
#if 0
@@ -442,11 +459,11 @@ static DBVT_INLINE btDbvtNode* walkup(btDbvtNode* n,int count)
//
btDbvt::btDbvt()
{
- m_root = 0;
- m_free = 0;
- m_lkhd = -1;
- m_leaves = 0;
- m_opath = 0;
+ m_root = 0;
+ m_free = 0;
+ m_lkhd = -1;
+ m_leaves = 0;
+ m_opath = 0;
}
//
@@ -456,228 +473,233 @@ btDbvt::~btDbvt()
}
//
-void btDbvt::clear()
+void btDbvt::clear()
{
- if(m_root)
- recursedeletenode(this,m_root);
+ if (m_root)
+ recursedeletenode(this, m_root);
btAlignedFree(m_free);
- m_free=0;
- m_lkhd = -1;
+ m_free = 0;
+ m_lkhd = -1;
m_stkStack.clear();
- m_opath = 0;
-
+ m_opath = 0;
}
//
-void btDbvt::optimizeBottomUp()
+void btDbvt::optimizeBottomUp()
{
- if(m_root)
+ if (m_root)
{
tNodeArray leaves;
leaves.reserve(m_leaves);
- fetchleaves(this,m_root,leaves);
- bottomup(this,&leaves[0],leaves.size());
- m_root=leaves[0];
+ fetchleaves(this, m_root, leaves);
+ bottomup(this, &leaves[0], leaves.size());
+ m_root = leaves[0];
}
}
//
-void btDbvt::optimizeTopDown(int bu_treshold)
+void btDbvt::optimizeTopDown(int bu_treshold)
{
- if(m_root)
+ if (m_root)
{
- tNodeArray leaves;
+ tNodeArray leaves;
leaves.reserve(m_leaves);
- fetchleaves(this,m_root,leaves);
- m_root=topdown(this,&leaves[0],leaves.size(),bu_treshold);
+ fetchleaves(this, m_root, leaves);
+ m_root = topdown(this, &leaves[0], leaves.size(), bu_treshold);
}
}
//
-void btDbvt::optimizeIncremental(int passes)
+void btDbvt::optimizeIncremental(int passes)
{
- if(passes<0) passes=m_leaves;
- if(m_root&&(passes>0))
+ if (passes < 0) passes = m_leaves;
+ if (m_root && (passes > 0))
{
- do {
- btDbvtNode* node=m_root;
- unsigned bit=0;
- while(node->isinternal())
+ do
+ {
+ btDbvtNode* node = m_root;
+ unsigned bit = 0;
+ while (node->isinternal())
{
- node=sort(node,m_root)->childs[(m_opath>>bit)&1];
- bit=(bit+1)&(sizeof(unsigned)*8-1);
+ node = sort(node, m_root)->childs[(m_opath >> bit) & 1];
+ bit = (bit + 1) & (sizeof(unsigned) * 8 - 1);
}
update(node);
++m_opath;
- } while(--passes);
+ } while (--passes);
}
}
//
-btDbvtNode* btDbvt::insert(const btDbvtVolume& volume,void* data)
+btDbvtNode* btDbvt::insert(const btDbvtVolume& volume, void* data)
{
- btDbvtNode* leaf=createnode(this,0,volume,data);
- insertleaf(this,m_root,leaf);
+ btDbvtNode* leaf = createnode(this, 0, volume, data);
+ insertleaf(this, m_root, leaf);
++m_leaves;
- return(leaf);
+ return (leaf);
}
//
-void btDbvt::update(btDbvtNode* leaf,int lookahead)
+void btDbvt::update(btDbvtNode* leaf, int lookahead)
{
- btDbvtNode* root=removeleaf(this,leaf);
- if(root)
+ btDbvtNode* root = removeleaf(this, leaf);
+ if (root)
{
- if(lookahead>=0)
+ if (lookahead >= 0)
{
- for(int i=0;(i<lookahead)&&root->parent;++i)
+ for (int i = 0; (i < lookahead) && root->parent; ++i)
{
- root=root->parent;
+ root = root->parent;
}
- } else root=m_root;
+ }
+ else
+ root = m_root;
}
- insertleaf(this,root,leaf);
+ insertleaf(this, root, leaf);
}
//
-void btDbvt::update(btDbvtNode* leaf,btDbvtVolume& volume)
+void btDbvt::update(btDbvtNode* leaf, btDbvtVolume& volume)
{
- btDbvtNode* root=removeleaf(this,leaf);
- if(root)
+ btDbvtNode* root = removeleaf(this, leaf);
+ if (root)
{
- if(m_lkhd>=0)
+ if (m_lkhd >= 0)
{
- for(int i=0;(i<m_lkhd)&&root->parent;++i)
+ for (int i = 0; (i < m_lkhd) && root->parent; ++i)
{
- root=root->parent;
+ root = root->parent;
}
- } else root=m_root;
+ }
+ else
+ root = m_root;
}
- leaf->volume=volume;
- insertleaf(this,root,leaf);
+ leaf->volume = volume;
+ insertleaf(this, root, leaf);
}
//
-bool btDbvt::update(btDbvtNode* leaf,btDbvtVolume& volume,const btVector3& velocity,btScalar margin)
+bool btDbvt::update(btDbvtNode* leaf, btDbvtVolume& volume, const btVector3& velocity, btScalar margin)
{
- if(leaf->volume.Contain(volume)) return(false);
- volume.Expand(btVector3(margin,margin,margin));
+ if (leaf->volume.Contain(volume)) return (false);
+ volume.Expand(btVector3(margin, margin, margin));
volume.SignedExpand(velocity);
- update(leaf,volume);
- return(true);
+ update(leaf, volume);
+ return (true);
}
//
-bool btDbvt::update(btDbvtNode* leaf,btDbvtVolume& volume,const btVector3& velocity)
+bool btDbvt::update(btDbvtNode* leaf, btDbvtVolume& volume, const btVector3& velocity)
{
- if(leaf->volume.Contain(volume)) return(false);
+ if (leaf->volume.Contain(volume)) return (false);
volume.SignedExpand(velocity);
- update(leaf,volume);
- return(true);
+ update(leaf, volume);
+ return (true);
}
//
-bool btDbvt::update(btDbvtNode* leaf,btDbvtVolume& volume,btScalar margin)
+bool btDbvt::update(btDbvtNode* leaf, btDbvtVolume& volume, btScalar margin)
{
- if(leaf->volume.Contain(volume)) return(false);
- volume.Expand(btVector3(margin,margin,margin));
- update(leaf,volume);
- return(true);
+ if (leaf->volume.Contain(volume)) return (false);
+ volume.Expand(btVector3(margin, margin, margin));
+ update(leaf, volume);
+ return (true);
}
//
-void btDbvt::remove(btDbvtNode* leaf)
+void btDbvt::remove(btDbvtNode* leaf)
{
- removeleaf(this,leaf);
- deletenode(this,leaf);
+ removeleaf(this, leaf);
+ deletenode(this, leaf);
--m_leaves;
}
//
-void btDbvt::write(IWriter* iwriter) const
+void btDbvt::write(IWriter* iwriter) const
{
- btDbvtNodeEnumerator nodes;
- nodes.nodes.reserve(m_leaves*2);
- enumNodes(m_root,nodes);
- iwriter->Prepare(m_root,nodes.nodes.size());
- for(int i=0;i<nodes.nodes.size();++i)
+ btDbvtNodeEnumerator nodes;
+ nodes.nodes.reserve(m_leaves * 2);
+ enumNodes(m_root, nodes);
+ iwriter->Prepare(m_root, nodes.nodes.size());
+ for (int i = 0; i < nodes.nodes.size(); ++i)
{
- const btDbvtNode* n=nodes.nodes[i];
- int p=-1;
- if(n->parent) p=nodes.nodes.findLinearSearch(n->parent);
- if(n->isinternal())
+ const btDbvtNode* n = nodes.nodes[i];
+ int p = -1;
+ if (n->parent) p = nodes.nodes.findLinearSearch(n->parent);
+ if (n->isinternal())
{
- const int c0=nodes.nodes.findLinearSearch(n->childs[0]);
- const int c1=nodes.nodes.findLinearSearch(n->childs[1]);
- iwriter->WriteNode(n,i,p,c0,c1);
+ const int c0 = nodes.nodes.findLinearSearch(n->childs[0]);
+ const int c1 = nodes.nodes.findLinearSearch(n->childs[1]);
+ iwriter->WriteNode(n, i, p, c0, c1);
}
else
{
- iwriter->WriteLeaf(n,i,p);
- }
+ iwriter->WriteLeaf(n, i, p);
+ }
}
}
//
-void btDbvt::clone(btDbvt& dest,IClone* iclone) const
+void btDbvt::clone(btDbvt& dest, IClone* iclone) const
{
dest.clear();
- if(m_root!=0)
- {
- btAlignedObjectArray<sStkCLN> stack;
+ if (m_root != 0)
+ {
+ btAlignedObjectArray<sStkCLN> stack;
stack.reserve(m_leaves);
- stack.push_back(sStkCLN(m_root,0));
- do {
- const int i=stack.size()-1;
- const sStkCLN e=stack[i];
- btDbvtNode* n=createnode(&dest,e.parent,e.node->volume,e.node->data);
+ stack.push_back(sStkCLN(m_root, 0));
+ do
+ {
+ const int i = stack.size() - 1;
+ const sStkCLN e = stack[i];
+ btDbvtNode* n = createnode(&dest, e.parent, e.node->volume, e.node->data);
stack.pop_back();
- if(e.parent!=0)
- e.parent->childs[i&1]=n;
+ if (e.parent != 0)
+ e.parent->childs[i & 1] = n;
else
- dest.m_root=n;
- if(e.node->isinternal())
+ dest.m_root = n;
+ if (e.node->isinternal())
{
- stack.push_back(sStkCLN(e.node->childs[0],n));
- stack.push_back(sStkCLN(e.node->childs[1],n));
+ stack.push_back(sStkCLN(e.node->childs[0], n));
+ stack.push_back(sStkCLN(e.node->childs[1], n));
}
else
{
iclone->CloneLeaf(n);
}
- } while(stack.size()>0);
+ } while (stack.size() > 0);
}
}
//
-int btDbvt::maxdepth(const btDbvtNode* node)
+int btDbvt::maxdepth(const btDbvtNode* node)
{
- int depth=0;
- if(node) getmaxdepth(node,1,depth);
- return(depth);
+ int depth = 0;
+ if (node) getmaxdepth(node, 1, depth);
+ return (depth);
}
//
-int btDbvt::countLeaves(const btDbvtNode* node)
+int btDbvt::countLeaves(const btDbvtNode* node)
{
- if(node->isinternal())
- return(countLeaves(node->childs[0])+countLeaves(node->childs[1]));
+ if (node->isinternal())
+ return (countLeaves(node->childs[0]) + countLeaves(node->childs[1]));
else
- return(1);
+ return (1);
}
//
-void btDbvt::extractLeaves(const btDbvtNode* node,btAlignedObjectArray<const btDbvtNode*>& leaves)
+void btDbvt::extractLeaves(const btDbvtNode* node, btAlignedObjectArray<const btDbvtNode*>& leaves)
{
- if(node->isinternal())
+ if (node->isinternal())
{
- extractLeaves(node->childs[0],leaves);
- extractLeaves(node->childs[1],leaves);
+ extractLeaves(node->childs[0], leaves);
+ extractLeaves(node->childs[1], leaves);
}
else
{
leaves.push_back(node);
- }
+ }
}
//
@@ -726,603 +748,608 @@ struct btDbvtBenchmark
{
struct NilPolicy : btDbvt::ICollide
{
- NilPolicy() : m_pcount(0),m_depth(-SIMD_INFINITY),m_checksort(true) {}
- void Process(const btDbvtNode*,const btDbvtNode*) { ++m_pcount; }
- void Process(const btDbvtNode*) { ++m_pcount; }
- void Process(const btDbvtNode*,btScalar depth)
+ NilPolicy() : m_pcount(0), m_depth(-SIMD_INFINITY), m_checksort(true) {}
+ void Process(const btDbvtNode*, const btDbvtNode*) { ++m_pcount; }
+ void Process(const btDbvtNode*) { ++m_pcount; }
+ void Process(const btDbvtNode*, btScalar depth)
{
++m_pcount;
- if(m_checksort)
- { if(depth>=m_depth) m_depth=depth; else printf("wrong depth: %f (should be >= %f)\r\n",depth,m_depth); }
+ if (m_checksort)
+ {
+ if (depth >= m_depth)
+ m_depth = depth;
+ else
+ printf("wrong depth: %f (should be >= %f)\r\n", depth, m_depth);
+ }
}
- int m_pcount;
- btScalar m_depth;
- bool m_checksort;
+ int m_pcount;
+ btScalar m_depth;
+ bool m_checksort;
};
struct P14 : btDbvt::ICollide
{
struct Node
{
- const btDbvtNode* leaf;
- btScalar depth;
+ const btDbvtNode* leaf;
+ btScalar depth;
};
- void Process(const btDbvtNode* leaf,btScalar depth)
+ void Process(const btDbvtNode* leaf, btScalar depth)
{
- Node n;
- n.leaf = leaf;
- n.depth = depth;
+ Node n;
+ n.leaf = leaf;
+ n.depth = depth;
}
- static int sortfnc(const Node& a,const Node& b)
+ static int sortfnc(const Node& a, const Node& b)
{
- if(a.depth<b.depth) return(+1);
- if(a.depth>b.depth) return(-1);
- return(0);
+ if (a.depth < b.depth) return (+1);
+ if (a.depth > b.depth) return (-1);
+ return (0);
}
- btAlignedObjectArray<Node> m_nodes;
+ btAlignedObjectArray<Node> m_nodes;
};
struct P15 : btDbvt::ICollide
{
struct Node
{
- const btDbvtNode* leaf;
- btScalar depth;
+ const btDbvtNode* leaf;
+ btScalar depth;
};
void Process(const btDbvtNode* leaf)
{
- Node n;
- n.leaf = leaf;
- n.depth = dot(leaf->volume.Center(),m_axis);
+ Node n;
+ n.leaf = leaf;
+ n.depth = dot(leaf->volume.Center(), m_axis);
}
- static int sortfnc(const Node& a,const Node& b)
+ static int sortfnc(const Node& a, const Node& b)
{
- if(a.depth<b.depth) return(+1);
- if(a.depth>b.depth) return(-1);
- return(0);
+ if (a.depth < b.depth) return (+1);
+ if (a.depth > b.depth) return (-1);
+ return (0);
}
- btAlignedObjectArray<Node> m_nodes;
- btVector3 m_axis;
+ btAlignedObjectArray<Node> m_nodes;
+ btVector3 m_axis;
};
- static btScalar RandUnit()
+ static btScalar RandUnit()
{
- return(rand()/(btScalar)RAND_MAX);
+ return (rand() / (btScalar)RAND_MAX);
}
- static btVector3 RandVector3()
+ static btVector3 RandVector3()
{
- return(btVector3(RandUnit(),RandUnit(),RandUnit()));
+ return (btVector3(RandUnit(), RandUnit(), RandUnit()));
}
- static btVector3 RandVector3(btScalar cs)
+ static btVector3 RandVector3(btScalar cs)
{
- return(RandVector3()*cs-btVector3(cs,cs,cs)/2);
+ return (RandVector3() * cs - btVector3(cs, cs, cs) / 2);
}
- static btDbvtVolume RandVolume(btScalar cs,btScalar eb,btScalar es)
+ static btDbvtVolume RandVolume(btScalar cs, btScalar eb, btScalar es)
{
- return(btDbvtVolume::FromCE(RandVector3(cs),btVector3(eb,eb,eb)+RandVector3()*es));
+ return (btDbvtVolume::FromCE(RandVector3(cs), btVector3(eb, eb, eb) + RandVector3() * es));
}
- static btTransform RandTransform(btScalar cs)
+ static btTransform RandTransform(btScalar cs)
{
- btTransform t;
+ btTransform t;
t.setOrigin(RandVector3(cs));
- t.setRotation(btQuaternion(RandUnit()*SIMD_PI*2,RandUnit()*SIMD_PI*2,RandUnit()*SIMD_PI*2).normalized());
- return(t);
+ t.setRotation(btQuaternion(RandUnit() * SIMD_PI * 2, RandUnit() * SIMD_PI * 2, RandUnit() * SIMD_PI * 2).normalized());
+ return (t);
}
- static void RandTree(btScalar cs,btScalar eb,btScalar es,int leaves,btDbvt& dbvt)
+ static void RandTree(btScalar cs, btScalar eb, btScalar es, int leaves, btDbvt& dbvt)
{
dbvt.clear();
- for(int i=0;i<leaves;++i)
+ for (int i = 0; i < leaves; ++i)
{
- dbvt.insert(RandVolume(cs,eb,es),0);
+ dbvt.insert(RandVolume(cs, eb, es), 0);
}
}
};
-void btDbvt::benchmark()
+void btDbvt::benchmark()
{
- static const btScalar cfgVolumeCenterScale = 100;
- static const btScalar cfgVolumeExentsBase = 1;
- static const btScalar cfgVolumeExentsScale = 4;
- static const int cfgLeaves = 8192;
- static const bool cfgEnable = true;
+ static const btScalar cfgVolumeCenterScale = 100;
+ static const btScalar cfgVolumeExentsBase = 1;
+ static const btScalar cfgVolumeExentsScale = 4;
+ static const int cfgLeaves = 8192;
+ static const bool cfgEnable = true;
//[1] btDbvtVolume intersections
- bool cfgBenchmark1_Enable = cfgEnable;
- static const int cfgBenchmark1_Iterations = 8;
- static const int cfgBenchmark1_Reference = 3499;
+ bool cfgBenchmark1_Enable = cfgEnable;
+ static const int cfgBenchmark1_Iterations = 8;
+ static const int cfgBenchmark1_Reference = 3499;
//[2] btDbvtVolume merges
- bool cfgBenchmark2_Enable = cfgEnable;
- static const int cfgBenchmark2_Iterations = 4;
- static const int cfgBenchmark2_Reference = 1945;
+ bool cfgBenchmark2_Enable = cfgEnable;
+ static const int cfgBenchmark2_Iterations = 4;
+ static const int cfgBenchmark2_Reference = 1945;
//[3] btDbvt::collideTT
- bool cfgBenchmark3_Enable = cfgEnable;
- static const int cfgBenchmark3_Iterations = 512;
- static const int cfgBenchmark3_Reference = 5485;
+ bool cfgBenchmark3_Enable = cfgEnable;
+ static const int cfgBenchmark3_Iterations = 512;
+ static const int cfgBenchmark3_Reference = 5485;
//[4] btDbvt::collideTT self
- bool cfgBenchmark4_Enable = cfgEnable;
- static const int cfgBenchmark4_Iterations = 512;
- static const int cfgBenchmark4_Reference = 2814;
+ bool cfgBenchmark4_Enable = cfgEnable;
+ static const int cfgBenchmark4_Iterations = 512;
+ static const int cfgBenchmark4_Reference = 2814;
//[5] btDbvt::collideTT xform
- bool cfgBenchmark5_Enable = cfgEnable;
- static const int cfgBenchmark5_Iterations = 512;
- static const btScalar cfgBenchmark5_OffsetScale = 2;
- static const int cfgBenchmark5_Reference = 7379;
+ bool cfgBenchmark5_Enable = cfgEnable;
+ static const int cfgBenchmark5_Iterations = 512;
+ static const btScalar cfgBenchmark5_OffsetScale = 2;
+ static const int cfgBenchmark5_Reference = 7379;
//[6] btDbvt::collideTT xform,self
- bool cfgBenchmark6_Enable = cfgEnable;
- static const int cfgBenchmark6_Iterations = 512;
- static const btScalar cfgBenchmark6_OffsetScale = 2;
- static const int cfgBenchmark6_Reference = 7270;
+ bool cfgBenchmark6_Enable = cfgEnable;
+ static const int cfgBenchmark6_Iterations = 512;
+ static const btScalar cfgBenchmark6_OffsetScale = 2;
+ static const int cfgBenchmark6_Reference = 7270;
//[7] btDbvt::rayTest
- bool cfgBenchmark7_Enable = cfgEnable;
- static const int cfgBenchmark7_Passes = 32;
- static const int cfgBenchmark7_Iterations = 65536;
- static const int cfgBenchmark7_Reference = 6307;
+ bool cfgBenchmark7_Enable = cfgEnable;
+ static const int cfgBenchmark7_Passes = 32;
+ static const int cfgBenchmark7_Iterations = 65536;
+ static const int cfgBenchmark7_Reference = 6307;
//[8] insert/remove
- bool cfgBenchmark8_Enable = cfgEnable;
- static const int cfgBenchmark8_Passes = 32;
- static const int cfgBenchmark8_Iterations = 65536;
- static const int cfgBenchmark8_Reference = 2105;
+ bool cfgBenchmark8_Enable = cfgEnable;
+ static const int cfgBenchmark8_Passes = 32;
+ static const int cfgBenchmark8_Iterations = 65536;
+ static const int cfgBenchmark8_Reference = 2105;
//[9] updates (teleport)
- bool cfgBenchmark9_Enable = cfgEnable;
- static const int cfgBenchmark9_Passes = 32;
- static const int cfgBenchmark9_Iterations = 65536;
- static const int cfgBenchmark9_Reference = 1879;
+ bool cfgBenchmark9_Enable = cfgEnable;
+ static const int cfgBenchmark9_Passes = 32;
+ static const int cfgBenchmark9_Iterations = 65536;
+ static const int cfgBenchmark9_Reference = 1879;
//[10] updates (jitter)
- bool cfgBenchmark10_Enable = cfgEnable;
- static const btScalar cfgBenchmark10_Scale = cfgVolumeCenterScale/10000;
- static const int cfgBenchmark10_Passes = 32;
- static const int cfgBenchmark10_Iterations = 65536;
- static const int cfgBenchmark10_Reference = 1244;
+ bool cfgBenchmark10_Enable = cfgEnable;
+ static const btScalar cfgBenchmark10_Scale = cfgVolumeCenterScale / 10000;
+ static const int cfgBenchmark10_Passes = 32;
+ static const int cfgBenchmark10_Iterations = 65536;
+ static const int cfgBenchmark10_Reference = 1244;
//[11] optimize (incremental)
- bool cfgBenchmark11_Enable = cfgEnable;
- static const int cfgBenchmark11_Passes = 64;
- static const int cfgBenchmark11_Iterations = 65536;
- static const int cfgBenchmark11_Reference = 2510;
+ bool cfgBenchmark11_Enable = cfgEnable;
+ static const int cfgBenchmark11_Passes = 64;
+ static const int cfgBenchmark11_Iterations = 65536;
+ static const int cfgBenchmark11_Reference = 2510;
//[12] btDbvtVolume notequal
- bool cfgBenchmark12_Enable = cfgEnable;
- static const int cfgBenchmark12_Iterations = 32;
- static const int cfgBenchmark12_Reference = 3677;
+ bool cfgBenchmark12_Enable = cfgEnable;
+ static const int cfgBenchmark12_Iterations = 32;
+ static const int cfgBenchmark12_Reference = 3677;
//[13] culling(OCL+fullsort)
- bool cfgBenchmark13_Enable = cfgEnable;
- static const int cfgBenchmark13_Iterations = 1024;
- static const int cfgBenchmark13_Reference = 2231;
+ bool cfgBenchmark13_Enable = cfgEnable;
+ static const int cfgBenchmark13_Iterations = 1024;
+ static const int cfgBenchmark13_Reference = 2231;
//[14] culling(OCL+qsort)
- bool cfgBenchmark14_Enable = cfgEnable;
- static const int cfgBenchmark14_Iterations = 8192;
- static const int cfgBenchmark14_Reference = 3500;
+ bool cfgBenchmark14_Enable = cfgEnable;
+ static const int cfgBenchmark14_Iterations = 8192;
+ static const int cfgBenchmark14_Reference = 3500;
//[15] culling(KDOP+qsort)
- bool cfgBenchmark15_Enable = cfgEnable;
- static const int cfgBenchmark15_Iterations = 8192;
- static const int cfgBenchmark15_Reference = 1151;
+ bool cfgBenchmark15_Enable = cfgEnable;
+ static const int cfgBenchmark15_Iterations = 8192;
+ static const int cfgBenchmark15_Reference = 1151;
//[16] insert/remove batch
- bool cfgBenchmark16_Enable = cfgEnable;
- static const int cfgBenchmark16_BatchCount = 256;
- static const int cfgBenchmark16_Passes = 16384;
- static const int cfgBenchmark16_Reference = 5138;
+ bool cfgBenchmark16_Enable = cfgEnable;
+ static const int cfgBenchmark16_BatchCount = 256;
+ static const int cfgBenchmark16_Passes = 16384;
+ static const int cfgBenchmark16_Reference = 5138;
//[17] select
- bool cfgBenchmark17_Enable = cfgEnable;
- static const int cfgBenchmark17_Iterations = 4;
- static const int cfgBenchmark17_Reference = 3390;
+ bool cfgBenchmark17_Enable = cfgEnable;
+ static const int cfgBenchmark17_Iterations = 4;
+ static const int cfgBenchmark17_Reference = 3390;
- btClock wallclock;
+ btClock wallclock;
printf("Benchmarking dbvt...\r\n");
- printf("\tWorld scale: %f\r\n",cfgVolumeCenterScale);
- printf("\tExtents base: %f\r\n",cfgVolumeExentsBase);
- printf("\tExtents range: %f\r\n",cfgVolumeExentsScale);
- printf("\tLeaves: %u\r\n",cfgLeaves);
- printf("\tsizeof(btDbvtVolume): %u bytes\r\n",sizeof(btDbvtVolume));
- printf("\tsizeof(btDbvtNode): %u bytes\r\n",sizeof(btDbvtNode));
- if(cfgBenchmark1_Enable)
- {// Benchmark 1
+ printf("\tWorld scale: %f\r\n", cfgVolumeCenterScale);
+ printf("\tExtents base: %f\r\n", cfgVolumeExentsBase);
+ printf("\tExtents range: %f\r\n", cfgVolumeExentsScale);
+ printf("\tLeaves: %u\r\n", cfgLeaves);
+ printf("\tsizeof(btDbvtVolume): %u bytes\r\n", sizeof(btDbvtVolume));
+ printf("\tsizeof(btDbvtNode): %u bytes\r\n", sizeof(btDbvtNode));
+ if (cfgBenchmark1_Enable)
+ { // Benchmark 1
srand(380843);
- btAlignedObjectArray<btDbvtVolume> volumes;
- btAlignedObjectArray<bool> results;
+ btAlignedObjectArray<btDbvtVolume> volumes;
+ btAlignedObjectArray<bool> results;
volumes.resize(cfgLeaves);
results.resize(cfgLeaves);
- for(int i=0;i<cfgLeaves;++i)
+ for (int i = 0; i < cfgLeaves; ++i)
{
- volumes[i]=btDbvtBenchmark::RandVolume(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale);
+ volumes[i] = btDbvtBenchmark::RandVolume(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale);
}
printf("[1] btDbvtVolume intersections: ");
wallclock.reset();
- for(int i=0;i<cfgBenchmark1_Iterations;++i)
+ for (int i = 0; i < cfgBenchmark1_Iterations; ++i)
{
- for(int j=0;j<cfgLeaves;++j)
+ for (int j = 0; j < cfgLeaves; ++j)
{
- for(int k=0;k<cfgLeaves;++k)
+ for (int k = 0; k < cfgLeaves; ++k)
{
- results[k]=Intersect(volumes[j],volumes[k]);
+ results[k] = Intersect(volumes[j], volumes[k]);
}
}
}
- const int time=(int)wallclock.getTimeMilliseconds();
- printf("%u ms (%i%%)\r\n",time,(time-cfgBenchmark1_Reference)*100/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ printf("%u ms (%i%%)\r\n", time, (time - cfgBenchmark1_Reference) * 100 / time);
}
- if(cfgBenchmark2_Enable)
- {// Benchmark 2
+ if (cfgBenchmark2_Enable)
+ { // Benchmark 2
srand(380843);
- btAlignedObjectArray<btDbvtVolume> volumes;
- btAlignedObjectArray<btDbvtVolume> results;
+ btAlignedObjectArray<btDbvtVolume> volumes;
+ btAlignedObjectArray<btDbvtVolume> results;
volumes.resize(cfgLeaves);
results.resize(cfgLeaves);
- for(int i=0;i<cfgLeaves;++i)
+ for (int i = 0; i < cfgLeaves; ++i)
{
- volumes[i]=btDbvtBenchmark::RandVolume(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale);
+ volumes[i] = btDbvtBenchmark::RandVolume(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale);
}
printf("[2] btDbvtVolume merges: ");
wallclock.reset();
- for(int i=0;i<cfgBenchmark2_Iterations;++i)
+ for (int i = 0; i < cfgBenchmark2_Iterations; ++i)
{
- for(int j=0;j<cfgLeaves;++j)
+ for (int j = 0; j < cfgLeaves; ++j)
{
- for(int k=0;k<cfgLeaves;++k)
+ for (int k = 0; k < cfgLeaves; ++k)
{
- Merge(volumes[j],volumes[k],results[k]);
+ Merge(volumes[j], volumes[k], results[k]);
}
}
}
- const int time=(int)wallclock.getTimeMilliseconds();
- printf("%u ms (%i%%)\r\n",time,(time-cfgBenchmark2_Reference)*100/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ printf("%u ms (%i%%)\r\n", time, (time - cfgBenchmark2_Reference) * 100 / time);
}
- if(cfgBenchmark3_Enable)
- {// Benchmark 3
+ if (cfgBenchmark3_Enable)
+ { // Benchmark 3
srand(380843);
- btDbvt dbvt[2];
- btDbvtBenchmark::NilPolicy policy;
- btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt[0]);
- btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt[1]);
+ btDbvt dbvt[2];
+ btDbvtBenchmark::NilPolicy policy;
+ btDbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt[0]);
+ btDbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt[1]);
dbvt[0].optimizeTopDown();
dbvt[1].optimizeTopDown();
printf("[3] btDbvt::collideTT: ");
wallclock.reset();
- for(int i=0;i<cfgBenchmark3_Iterations;++i)
+ for (int i = 0; i < cfgBenchmark3_Iterations; ++i)
{
- btDbvt::collideTT(dbvt[0].m_root,dbvt[1].m_root,policy);
+ btDbvt::collideTT(dbvt[0].m_root, dbvt[1].m_root, policy);
}
- const int time=(int)wallclock.getTimeMilliseconds();
- printf("%u ms (%i%%)\r\n",time,(time-cfgBenchmark3_Reference)*100/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ printf("%u ms (%i%%)\r\n", time, (time - cfgBenchmark3_Reference) * 100 / time);
}
- if(cfgBenchmark4_Enable)
- {// Benchmark 4
+ if (cfgBenchmark4_Enable)
+ { // Benchmark 4
srand(380843);
- btDbvt dbvt;
- btDbvtBenchmark::NilPolicy policy;
- btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt);
+ btDbvt dbvt;
+ btDbvtBenchmark::NilPolicy policy;
+ btDbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt);
dbvt.optimizeTopDown();
printf("[4] btDbvt::collideTT self: ");
wallclock.reset();
- for(int i=0;i<cfgBenchmark4_Iterations;++i)
+ for (int i = 0; i < cfgBenchmark4_Iterations; ++i)
{
- btDbvt::collideTT(dbvt.m_root,dbvt.m_root,policy);
+ btDbvt::collideTT(dbvt.m_root, dbvt.m_root, policy);
}
- const int time=(int)wallclock.getTimeMilliseconds();
- printf("%u ms (%i%%)\r\n",time,(time-cfgBenchmark4_Reference)*100/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ printf("%u ms (%i%%)\r\n", time, (time - cfgBenchmark4_Reference) * 100 / time);
}
- if(cfgBenchmark5_Enable)
- {// Benchmark 5
+ if (cfgBenchmark5_Enable)
+ { // Benchmark 5
srand(380843);
- btDbvt dbvt[2];
- btAlignedObjectArray<btTransform> transforms;
- btDbvtBenchmark::NilPolicy policy;
+ btDbvt dbvt[2];
+ btAlignedObjectArray<btTransform> transforms;
+ btDbvtBenchmark::NilPolicy policy;
transforms.resize(cfgBenchmark5_Iterations);
- for(int i=0;i<transforms.size();++i)
+ for (int i = 0; i < transforms.size(); ++i)
{
- transforms[i]=btDbvtBenchmark::RandTransform(cfgVolumeCenterScale*cfgBenchmark5_OffsetScale);
+ transforms[i] = btDbvtBenchmark::RandTransform(cfgVolumeCenterScale * cfgBenchmark5_OffsetScale);
}
- btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt[0]);
- btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt[1]);
+ btDbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt[0]);
+ btDbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt[1]);
dbvt[0].optimizeTopDown();
dbvt[1].optimizeTopDown();
printf("[5] btDbvt::collideTT xform: ");
wallclock.reset();
- for(int i=0;i<cfgBenchmark5_Iterations;++i)
+ for (int i = 0; i < cfgBenchmark5_Iterations; ++i)
{
- btDbvt::collideTT(dbvt[0].m_root,dbvt[1].m_root,transforms[i],policy);
+ btDbvt::collideTT(dbvt[0].m_root, dbvt[1].m_root, transforms[i], policy);
}
- const int time=(int)wallclock.getTimeMilliseconds();
- printf("%u ms (%i%%)\r\n",time,(time-cfgBenchmark5_Reference)*100/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ printf("%u ms (%i%%)\r\n", time, (time - cfgBenchmark5_Reference) * 100 / time);
}
- if(cfgBenchmark6_Enable)
- {// Benchmark 6
+ if (cfgBenchmark6_Enable)
+ { // Benchmark 6
srand(380843);
- btDbvt dbvt;
- btAlignedObjectArray<btTransform> transforms;
- btDbvtBenchmark::NilPolicy policy;
+ btDbvt dbvt;
+ btAlignedObjectArray<btTransform> transforms;
+ btDbvtBenchmark::NilPolicy policy;
transforms.resize(cfgBenchmark6_Iterations);
- for(int i=0;i<transforms.size();++i)
+ for (int i = 0; i < transforms.size(); ++i)
{
- transforms[i]=btDbvtBenchmark::RandTransform(cfgVolumeCenterScale*cfgBenchmark6_OffsetScale);
+ transforms[i] = btDbvtBenchmark::RandTransform(cfgVolumeCenterScale * cfgBenchmark6_OffsetScale);
}
- btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt);
+ btDbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt);
dbvt.optimizeTopDown();
printf("[6] btDbvt::collideTT xform,self: ");
wallclock.reset();
- for(int i=0;i<cfgBenchmark6_Iterations;++i)
+ for (int i = 0; i < cfgBenchmark6_Iterations; ++i)
{
- btDbvt::collideTT(dbvt.m_root,dbvt.m_root,transforms[i],policy);
+ btDbvt::collideTT(dbvt.m_root, dbvt.m_root, transforms[i], policy);
}
- const int time=(int)wallclock.getTimeMilliseconds();
- printf("%u ms (%i%%)\r\n",time,(time-cfgBenchmark6_Reference)*100/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ printf("%u ms (%i%%)\r\n", time, (time - cfgBenchmark6_Reference) * 100 / time);
}
- if(cfgBenchmark7_Enable)
- {// Benchmark 7
+ if (cfgBenchmark7_Enable)
+ { // Benchmark 7
srand(380843);
- btDbvt dbvt;
- btAlignedObjectArray<btVector3> rayorg;
- btAlignedObjectArray<btVector3> raydir;
- btDbvtBenchmark::NilPolicy policy;
+ btDbvt dbvt;
+ btAlignedObjectArray<btVector3> rayorg;
+ btAlignedObjectArray<btVector3> raydir;
+ btDbvtBenchmark::NilPolicy policy;
rayorg.resize(cfgBenchmark7_Iterations);
raydir.resize(cfgBenchmark7_Iterations);
- for(int i=0;i<rayorg.size();++i)
+ for (int i = 0; i < rayorg.size(); ++i)
{
- rayorg[i]=btDbvtBenchmark::RandVector3(cfgVolumeCenterScale*2);
- raydir[i]=btDbvtBenchmark::RandVector3(cfgVolumeCenterScale*2);
+ rayorg[i] = btDbvtBenchmark::RandVector3(cfgVolumeCenterScale * 2);
+ raydir[i] = btDbvtBenchmark::RandVector3(cfgVolumeCenterScale * 2);
}
- btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt);
+ btDbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt);
dbvt.optimizeTopDown();
printf("[7] btDbvt::rayTest: ");
wallclock.reset();
- for(int i=0;i<cfgBenchmark7_Passes;++i)
+ for (int i = 0; i < cfgBenchmark7_Passes; ++i)
{
- for(int j=0;j<cfgBenchmark7_Iterations;++j)
+ for (int j = 0; j < cfgBenchmark7_Iterations; ++j)
{
- btDbvt::rayTest(dbvt.m_root,rayorg[j],rayorg[j]+raydir[j],policy);
+ btDbvt::rayTest(dbvt.m_root, rayorg[j], rayorg[j] + raydir[j], policy);
}
}
- const int time=(int)wallclock.getTimeMilliseconds();
- unsigned rays=cfgBenchmark7_Passes*cfgBenchmark7_Iterations;
- printf("%u ms (%i%%),(%u r/s)\r\n",time,(time-cfgBenchmark7_Reference)*100/time,(rays*1000)/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ unsigned rays = cfgBenchmark7_Passes * cfgBenchmark7_Iterations;
+ printf("%u ms (%i%%),(%u r/s)\r\n", time, (time - cfgBenchmark7_Reference) * 100 / time, (rays * 1000) / time);
}
- if(cfgBenchmark8_Enable)
- {// Benchmark 8
+ if (cfgBenchmark8_Enable)
+ { // Benchmark 8
srand(380843);
- btDbvt dbvt;
- btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt);
+ btDbvt dbvt;
+ btDbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt);
dbvt.optimizeTopDown();
printf("[8] insert/remove: ");
wallclock.reset();
- for(int i=0;i<cfgBenchmark8_Passes;++i)
+ for (int i = 0; i < cfgBenchmark8_Passes; ++i)
{
- for(int j=0;j<cfgBenchmark8_Iterations;++j)
+ for (int j = 0; j < cfgBenchmark8_Iterations; ++j)
{
- dbvt.remove(dbvt.insert(btDbvtBenchmark::RandVolume(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale),0));
+ dbvt.remove(dbvt.insert(btDbvtBenchmark::RandVolume(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale), 0));
}
}
- const int time=(int)wallclock.getTimeMilliseconds();
- const int ir=cfgBenchmark8_Passes*cfgBenchmark8_Iterations;
- printf("%u ms (%i%%),(%u ir/s)\r\n",time,(time-cfgBenchmark8_Reference)*100/time,ir*1000/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ const int ir = cfgBenchmark8_Passes * cfgBenchmark8_Iterations;
+ printf("%u ms (%i%%),(%u ir/s)\r\n", time, (time - cfgBenchmark8_Reference) * 100 / time, ir * 1000 / time);
}
- if(cfgBenchmark9_Enable)
- {// Benchmark 9
+ if (cfgBenchmark9_Enable)
+ { // Benchmark 9
srand(380843);
- btDbvt dbvt;
- btAlignedObjectArray<const btDbvtNode*> leaves;
- btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt);
+ btDbvt dbvt;
+ btAlignedObjectArray<const btDbvtNode*> leaves;
+ btDbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt);
dbvt.optimizeTopDown();
- dbvt.extractLeaves(dbvt.m_root,leaves);
+ dbvt.extractLeaves(dbvt.m_root, leaves);
printf("[9] updates (teleport): ");
wallclock.reset();
- for(int i=0;i<cfgBenchmark9_Passes;++i)
+ for (int i = 0; i < cfgBenchmark9_Passes; ++i)
{
- for(int j=0;j<cfgBenchmark9_Iterations;++j)
+ for (int j = 0; j < cfgBenchmark9_Iterations; ++j)
{
- dbvt.update(const_cast<btDbvtNode*>(leaves[rand()%cfgLeaves]),
- btDbvtBenchmark::RandVolume(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale));
+ dbvt.update(const_cast<btDbvtNode*>(leaves[rand() % cfgLeaves]),
+ btDbvtBenchmark::RandVolume(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale));
}
}
- const int time=(int)wallclock.getTimeMilliseconds();
- const int up=cfgBenchmark9_Passes*cfgBenchmark9_Iterations;
- printf("%u ms (%i%%),(%u u/s)\r\n",time,(time-cfgBenchmark9_Reference)*100/time,up*1000/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ const int up = cfgBenchmark9_Passes * cfgBenchmark9_Iterations;
+ printf("%u ms (%i%%),(%u u/s)\r\n", time, (time - cfgBenchmark9_Reference) * 100 / time, up * 1000 / time);
}
- if(cfgBenchmark10_Enable)
- {// Benchmark 10
+ if (cfgBenchmark10_Enable)
+ { // Benchmark 10
srand(380843);
- btDbvt dbvt;
- btAlignedObjectArray<const btDbvtNode*> leaves;
- btAlignedObjectArray<btVector3> vectors;
+ btDbvt dbvt;
+ btAlignedObjectArray<const btDbvtNode*> leaves;
+ btAlignedObjectArray<btVector3> vectors;
vectors.resize(cfgBenchmark10_Iterations);
- for(int i=0;i<vectors.size();++i)
+ for (int i = 0; i < vectors.size(); ++i)
{
- vectors[i]=(btDbvtBenchmark::RandVector3()*2-btVector3(1,1,1))*cfgBenchmark10_Scale;
+ vectors[i] = (btDbvtBenchmark::RandVector3() * 2 - btVector3(1, 1, 1)) * cfgBenchmark10_Scale;
}
- btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt);
+ btDbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt);
dbvt.optimizeTopDown();
- dbvt.extractLeaves(dbvt.m_root,leaves);
+ dbvt.extractLeaves(dbvt.m_root, leaves);
printf("[10] updates (jitter): ");
wallclock.reset();
- for(int i=0;i<cfgBenchmark10_Passes;++i)
+ for (int i = 0; i < cfgBenchmark10_Passes; ++i)
{
- for(int j=0;j<cfgBenchmark10_Iterations;++j)
- {
- const btVector3& d=vectors[j];
- btDbvtNode* l=const_cast<btDbvtNode*>(leaves[rand()%cfgLeaves]);
- btDbvtVolume v=btDbvtVolume::FromMM(l->volume.Mins()+d,l->volume.Maxs()+d);
- dbvt.update(l,v);
+ for (int j = 0; j < cfgBenchmark10_Iterations; ++j)
+ {
+ const btVector3& d = vectors[j];
+ btDbvtNode* l = const_cast<btDbvtNode*>(leaves[rand() % cfgLeaves]);
+ btDbvtVolume v = btDbvtVolume::FromMM(l->volume.Mins() + d, l->volume.Maxs() + d);
+ dbvt.update(l, v);
}
}
- const int time=(int)wallclock.getTimeMilliseconds();
- const int up=cfgBenchmark10_Passes*cfgBenchmark10_Iterations;
- printf("%u ms (%i%%),(%u u/s)\r\n",time,(time-cfgBenchmark10_Reference)*100/time,up*1000/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ const int up = cfgBenchmark10_Passes * cfgBenchmark10_Iterations;
+ printf("%u ms (%i%%),(%u u/s)\r\n", time, (time - cfgBenchmark10_Reference) * 100 / time, up * 1000 / time);
}
- if(cfgBenchmark11_Enable)
- {// Benchmark 11
+ if (cfgBenchmark11_Enable)
+ { // Benchmark 11
srand(380843);
- btDbvt dbvt;
- btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt);
+ btDbvt dbvt;
+ btDbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt);
dbvt.optimizeTopDown();
printf("[11] optimize (incremental): ");
- wallclock.reset();
- for(int i=0;i<cfgBenchmark11_Passes;++i)
+ wallclock.reset();
+ for (int i = 0; i < cfgBenchmark11_Passes; ++i)
{
dbvt.optimizeIncremental(cfgBenchmark11_Iterations);
}
- const int time=(int)wallclock.getTimeMilliseconds();
- const int op=cfgBenchmark11_Passes*cfgBenchmark11_Iterations;
- printf("%u ms (%i%%),(%u o/s)\r\n",time,(time-cfgBenchmark11_Reference)*100/time,op/time*1000);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ const int op = cfgBenchmark11_Passes * cfgBenchmark11_Iterations;
+ printf("%u ms (%i%%),(%u o/s)\r\n", time, (time - cfgBenchmark11_Reference) * 100 / time, op / time * 1000);
}
- if(cfgBenchmark12_Enable)
- {// Benchmark 12
+ if (cfgBenchmark12_Enable)
+ { // Benchmark 12
srand(380843);
- btAlignedObjectArray<btDbvtVolume> volumes;
- btAlignedObjectArray<bool> results;
+ btAlignedObjectArray<btDbvtVolume> volumes;
+ btAlignedObjectArray<bool> results;
volumes.resize(cfgLeaves);
results.resize(cfgLeaves);
- for(int i=0;i<cfgLeaves;++i)
+ for (int i = 0; i < cfgLeaves; ++i)
{
- volumes[i]=btDbvtBenchmark::RandVolume(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale);
+ volumes[i] = btDbvtBenchmark::RandVolume(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale);
}
printf("[12] btDbvtVolume notequal: ");
wallclock.reset();
- for(int i=0;i<cfgBenchmark12_Iterations;++i)
+ for (int i = 0; i < cfgBenchmark12_Iterations; ++i)
{
- for(int j=0;j<cfgLeaves;++j)
+ for (int j = 0; j < cfgLeaves; ++j)
{
- for(int k=0;k<cfgLeaves;++k)
+ for (int k = 0; k < cfgLeaves; ++k)
{
- results[k]=NotEqual(volumes[j],volumes[k]);
+ results[k] = NotEqual(volumes[j], volumes[k]);
}
}
}
- const int time=(int)wallclock.getTimeMilliseconds();
- printf("%u ms (%i%%)\r\n",time,(time-cfgBenchmark12_Reference)*100/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ printf("%u ms (%i%%)\r\n", time, (time - cfgBenchmark12_Reference) * 100 / time);
}
- if(cfgBenchmark13_Enable)
- {// Benchmark 13
+ if (cfgBenchmark13_Enable)
+ { // Benchmark 13
srand(380843);
- btDbvt dbvt;
- btAlignedObjectArray<btVector3> vectors;
- btDbvtBenchmark::NilPolicy policy;
+ btDbvt dbvt;
+ btAlignedObjectArray<btVector3> vectors;
+ btDbvtBenchmark::NilPolicy policy;
vectors.resize(cfgBenchmark13_Iterations);
- for(int i=0;i<vectors.size();++i)
+ for (int i = 0; i < vectors.size(); ++i)
{
- vectors[i]=(btDbvtBenchmark::RandVector3()*2-btVector3(1,1,1)).normalized();
+ vectors[i] = (btDbvtBenchmark::RandVector3() * 2 - btVector3(1, 1, 1)).normalized();
}
- btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt);
+ btDbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt);
dbvt.optimizeTopDown();
printf("[13] culling(OCL+fullsort): ");
- wallclock.reset();
- for(int i=0;i<cfgBenchmark13_Iterations;++i)
+ wallclock.reset();
+ for (int i = 0; i < cfgBenchmark13_Iterations; ++i)
{
- static const btScalar offset=0;
- policy.m_depth=-SIMD_INFINITY;
- dbvt.collideOCL(dbvt.m_root,&vectors[i],&offset,vectors[i],1,policy);
+ static const btScalar offset = 0;
+ policy.m_depth = -SIMD_INFINITY;
+ dbvt.collideOCL(dbvt.m_root, &vectors[i], &offset, vectors[i], 1, policy);
}
- const int time=(int)wallclock.getTimeMilliseconds();
- const int t=cfgBenchmark13_Iterations;
- printf("%u ms (%i%%),(%u t/s)\r\n",time,(time-cfgBenchmark13_Reference)*100/time,(t*1000)/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ const int t = cfgBenchmark13_Iterations;
+ printf("%u ms (%i%%),(%u t/s)\r\n", time, (time - cfgBenchmark13_Reference) * 100 / time, (t * 1000) / time);
}
- if(cfgBenchmark14_Enable)
- {// Benchmark 14
+ if (cfgBenchmark14_Enable)
+ { // Benchmark 14
srand(380843);
- btDbvt dbvt;
- btAlignedObjectArray<btVector3> vectors;
- btDbvtBenchmark::P14 policy;
+ btDbvt dbvt;
+ btAlignedObjectArray<btVector3> vectors;
+ btDbvtBenchmark::P14 policy;
vectors.resize(cfgBenchmark14_Iterations);
- for(int i=0;i<vectors.size();++i)
+ for (int i = 0; i < vectors.size(); ++i)
{
- vectors[i]=(btDbvtBenchmark::RandVector3()*2-btVector3(1,1,1)).normalized();
+ vectors[i] = (btDbvtBenchmark::RandVector3() * 2 - btVector3(1, 1, 1)).normalized();
}
- btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt);
+ btDbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt);
dbvt.optimizeTopDown();
policy.m_nodes.reserve(cfgLeaves);
printf("[14] culling(OCL+qsort): ");
- wallclock.reset();
- for(int i=0;i<cfgBenchmark14_Iterations;++i)
+ wallclock.reset();
+ for (int i = 0; i < cfgBenchmark14_Iterations; ++i)
{
- static const btScalar offset=0;
+ static const btScalar offset = 0;
policy.m_nodes.resize(0);
- dbvt.collideOCL(dbvt.m_root,&vectors[i],&offset,vectors[i],1,policy,false);
+ dbvt.collideOCL(dbvt.m_root, &vectors[i], &offset, vectors[i], 1, policy, false);
policy.m_nodes.quickSort(btDbvtBenchmark::P14::sortfnc);
}
- const int time=(int)wallclock.getTimeMilliseconds();
- const int t=cfgBenchmark14_Iterations;
- printf("%u ms (%i%%),(%u t/s)\r\n",time,(time-cfgBenchmark14_Reference)*100/time,(t*1000)/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ const int t = cfgBenchmark14_Iterations;
+ printf("%u ms (%i%%),(%u t/s)\r\n", time, (time - cfgBenchmark14_Reference) * 100 / time, (t * 1000) / time);
}
- if(cfgBenchmark15_Enable)
- {// Benchmark 15
+ if (cfgBenchmark15_Enable)
+ { // Benchmark 15
srand(380843);
- btDbvt dbvt;
- btAlignedObjectArray<btVector3> vectors;
- btDbvtBenchmark::P15 policy;
+ btDbvt dbvt;
+ btAlignedObjectArray<btVector3> vectors;
+ btDbvtBenchmark::P15 policy;
vectors.resize(cfgBenchmark15_Iterations);
- for(int i=0;i<vectors.size();++i)
+ for (int i = 0; i < vectors.size(); ++i)
{
- vectors[i]=(btDbvtBenchmark::RandVector3()*2-btVector3(1,1,1)).normalized();
+ vectors[i] = (btDbvtBenchmark::RandVector3() * 2 - btVector3(1, 1, 1)).normalized();
}
- btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt);
+ btDbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt);
dbvt.optimizeTopDown();
policy.m_nodes.reserve(cfgLeaves);
printf("[15] culling(KDOP+qsort): ");
- wallclock.reset();
- for(int i=0;i<cfgBenchmark15_Iterations;++i)
+ wallclock.reset();
+ for (int i = 0; i < cfgBenchmark15_Iterations; ++i)
{
- static const btScalar offset=0;
+ static const btScalar offset = 0;
policy.m_nodes.resize(0);
- policy.m_axis=vectors[i];
- dbvt.collideKDOP(dbvt.m_root,&vectors[i],&offset,1,policy);
+ policy.m_axis = vectors[i];
+ dbvt.collideKDOP(dbvt.m_root, &vectors[i], &offset, 1, policy);
policy.m_nodes.quickSort(btDbvtBenchmark::P15::sortfnc);
}
- const int time=(int)wallclock.getTimeMilliseconds();
- const int t=cfgBenchmark15_Iterations;
- printf("%u ms (%i%%),(%u t/s)\r\n",time,(time-cfgBenchmark15_Reference)*100/time,(t*1000)/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ const int t = cfgBenchmark15_Iterations;
+ printf("%u ms (%i%%),(%u t/s)\r\n", time, (time - cfgBenchmark15_Reference) * 100 / time, (t * 1000) / time);
}
- if(cfgBenchmark16_Enable)
- {// Benchmark 16
+ if (cfgBenchmark16_Enable)
+ { // Benchmark 16
srand(380843);
- btDbvt dbvt;
- btAlignedObjectArray<btDbvtNode*> batch;
- btDbvtBenchmark::RandTree(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale,cfgLeaves,dbvt);
+ btDbvt dbvt;
+ btAlignedObjectArray<btDbvtNode*> batch;
+ btDbvtBenchmark::RandTree(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale, cfgLeaves, dbvt);
dbvt.optimizeTopDown();
batch.reserve(cfgBenchmark16_BatchCount);
- printf("[16] insert/remove batch(%u): ",cfgBenchmark16_BatchCount);
+ printf("[16] insert/remove batch(%u): ", cfgBenchmark16_BatchCount);
wallclock.reset();
- for(int i=0;i<cfgBenchmark16_Passes;++i)
+ for (int i = 0; i < cfgBenchmark16_Passes; ++i)
{
- for(int j=0;j<cfgBenchmark16_BatchCount;++j)
+ for (int j = 0; j < cfgBenchmark16_BatchCount; ++j)
{
- batch.push_back(dbvt.insert(btDbvtBenchmark::RandVolume(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale),0));
+ batch.push_back(dbvt.insert(btDbvtBenchmark::RandVolume(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale), 0));
}
- for(int j=0;j<cfgBenchmark16_BatchCount;++j)
+ for (int j = 0; j < cfgBenchmark16_BatchCount; ++j)
{
dbvt.remove(batch[j]);
}
batch.resize(0);
}
- const int time=(int)wallclock.getTimeMilliseconds();
- const int ir=cfgBenchmark16_Passes*cfgBenchmark16_BatchCount;
- printf("%u ms (%i%%),(%u bir/s)\r\n",time,(time-cfgBenchmark16_Reference)*100/time,int(ir*1000.0/time));
+ const int time = (int)wallclock.getTimeMilliseconds();
+ const int ir = cfgBenchmark16_Passes * cfgBenchmark16_BatchCount;
+ printf("%u ms (%i%%),(%u bir/s)\r\n", time, (time - cfgBenchmark16_Reference) * 100 / time, int(ir * 1000.0 / time));
}
- if(cfgBenchmark17_Enable)
- {// Benchmark 17
+ if (cfgBenchmark17_Enable)
+ { // Benchmark 17
srand(380843);
- btAlignedObjectArray<btDbvtVolume> volumes;
- btAlignedObjectArray<int> results;
- btAlignedObjectArray<int> indices;
+ btAlignedObjectArray<btDbvtVolume> volumes;
+ btAlignedObjectArray<int> results;
+ btAlignedObjectArray<int> indices;
volumes.resize(cfgLeaves);
results.resize(cfgLeaves);
indices.resize(cfgLeaves);
- for(int i=0;i<cfgLeaves;++i)
+ for (int i = 0; i < cfgLeaves; ++i)
{
- indices[i]=i;
- volumes[i]=btDbvtBenchmark::RandVolume(cfgVolumeCenterScale,cfgVolumeExentsBase,cfgVolumeExentsScale);
+ indices[i] = i;
+ volumes[i] = btDbvtBenchmark::RandVolume(cfgVolumeCenterScale, cfgVolumeExentsBase, cfgVolumeExentsScale);
}
- for(int i=0;i<cfgLeaves;++i)
+ for (int i = 0; i < cfgLeaves; ++i)
{
- btSwap(indices[i],indices[rand()%cfgLeaves]);
+ btSwap(indices[i], indices[rand() % cfgLeaves]);
}
printf("[17] btDbvtVolume select: ");
wallclock.reset();
- for(int i=0;i<cfgBenchmark17_Iterations;++i)
+ for (int i = 0; i < cfgBenchmark17_Iterations; ++i)
{
- for(int j=0;j<cfgLeaves;++j)
+ for (int j = 0; j < cfgLeaves; ++j)
{
- for(int k=0;k<cfgLeaves;++k)
+ for (int k = 0; k < cfgLeaves; ++k)
{
- const int idx=indices[k];
- results[idx]=Select(volumes[idx],volumes[j],volumes[k]);
+ const int idx = indices[k];
+ results[idx] = Select(volumes[idx], volumes[j], volumes[k]);
}
}
}
- const int time=(int)wallclock.getTimeMilliseconds();
- printf("%u ms (%i%%)\r\n",time,(time-cfgBenchmark17_Reference)*100/time);
+ const int time = (int)wallclock.getTimeMilliseconds();
+ printf("%u ms (%i%%)\r\n", time, (time - cfgBenchmark17_Reference) * 100 / time);
}
printf("\r\n\r\n");
}
diff --git a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDbvt.h b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDbvt.h
index b5a0014580..a316dbf207 100644
--- a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDbvt.h
+++ b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDbvt.h
@@ -26,50 +26,49 @@ subject to the following restrictions:
// Compile time configuration
//
-
// Implementation profiles
-#define DBVT_IMPL_GENERIC 0 // Generic implementation
-#define DBVT_IMPL_SSE 1 // SSE
+#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
+#if (defined(_MSC_VER) && _MSC_VER >= 1400)
+#define DBVT_USE_TEMPLATE 1
#else
-#define DBVT_USE_TEMPLATE 0
+#define DBVT_USE_TEMPLATE 0
#endif
#else
-#define DBVT_USE_TEMPLATE 0
+#define DBVT_USE_TEMPLATE 0
#endif
// Use only intrinsics instead of inline asm
-#define DBVT_USE_INTRINSIC_SSE 1
+#define DBVT_USE_INTRINSIC_SSE 1
// Using memmov for collideOCL
-#define DBVT_USE_MEMMOVE 1
+#define DBVT_USE_MEMMOVE 1
// Enable benchmarking code
-#define DBVT_ENABLE_BENCHMARK 0
+#define DBVT_ENABLE_BENCHMARK 0
// Inlining
-#define DBVT_INLINE SIMD_FORCE_INLINE
+#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
+#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
+#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)
+#if (DBVT_SELECT_IMPL == DBVT_IMPL_SSE) || \
+ (DBVT_MERGE_IMPL == DBVT_IMPL_SSE) || \
+ (DBVT_INT0_IMPL == DBVT_IMPL_SSE)
#include <emmintrin.h>
#endif
@@ -78,21 +77,24 @@ subject to the following restrictions:
//
#if DBVT_USE_TEMPLATE
-#define DBVT_VIRTUAL
+#define DBVT_VIRTUAL
#define DBVT_VIRTUAL_DTOR(a)
-#define DBVT_PREFIX template <typename T>
-#define DBVT_IPOLICY T& policy
-#define DBVT_CHECKTYPE static const ICollide& typechecker=*(T*)1;(void)typechecker;
+#define DBVT_PREFIX template <typename T>
+#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_VIRTUAL_DTOR(a) \
+ virtual ~a() {}
+#define DBVT_VIRTUAL virtual
#define DBVT_PREFIX
-#define DBVT_IPOLICY ICollide& policy
+#define DBVT_IPOLICY ICollide& policy
#define DBVT_CHECKTYPE
#endif
#if DBVT_USE_MEMMOVE
-#if !defined( __CELLOS_LV2__) && !defined(__MWERKS__)
+#if !defined(__CELLOS_LV2__) && !defined(__MWERKS__)
#include <memory.h>
#endif
#include <string.h>
@@ -122,194 +124,193 @@ subject to the following restrictions:
#error "DBVT_INT0_IMPL undefined"
#endif
-
//
// Defaults volumes
//
-/* btDbvtAabbMm */
-struct btDbvtAabbMm
+/* btDbvtAabbMm */
+struct 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); }
-
+ 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;
+ DBVT_INLINE void AddSpan(const btVector3& d, btScalar& smi, btScalar& smx) const;
+
private:
- btVector3 mi,mx;
+ btVector3 mi, mx;
};
-// Types
-typedef btDbvtAabbMm btDbvtVolume;
+// Types
+typedef btDbvtAabbMm btDbvtVolume;
-/* btDbvtNode */
-struct btDbvtNode
+/* 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;
+ 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;
};
};
typedef btAlignedObjectArray<const btDbvtNode*> 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
+struct btDbvt
{
- /* Stack element */
- struct sStkNN
+ /* Stack element */
+ struct sStkNN
{
- const btDbvtNode* a;
- const btDbvtNode* b;
+ const btDbvtNode* a;
+ const btDbvtNode* b;
sStkNN() {}
- sStkNN(const btDbvtNode* na,const btDbvtNode* nb) : a(na),b(nb) {}
+ sStkNN(const btDbvtNode* na, const btDbvtNode* nb) : a(na), b(nb) {}
};
- struct sStkNP
+ struct sStkNP
{
- const btDbvtNode* node;
- int mask;
- sStkNP(const btDbvtNode* n,unsigned m) : node(n),mask(m) {}
+ const btDbvtNode* node;
+ int mask;
+ sStkNP(const btDbvtNode* n, unsigned m) : node(n), mask(m) {}
};
- struct sStkNPS
+ struct sStkNPS
{
- const btDbvtNode* node;
- int mask;
- btScalar value;
+ const btDbvtNode* node;
+ int mask;
+ btScalar value;
sStkNPS() {}
- sStkNPS(const btDbvtNode* n,unsigned m,btScalar v) : node(n),mask(m),value(v) {}
+ sStkNPS(const btDbvtNode* n, unsigned m, btScalar v) : node(n), mask(m), value(v) {}
};
- struct sStkCLN
+ struct sStkCLN
{
- const btDbvtNode* node;
- btDbvtNode* parent;
- sStkCLN(const btDbvtNode* n,btDbvtNode* p) : node(n),parent(p) {}
+ const btDbvtNode* node;
+ btDbvtNode* parent;
+ sStkCLN(const btDbvtNode* n, btDbvtNode* p) : node(n), parent(p) {}
};
// Policies/Interfaces
- /* ICollide */
- struct ICollide
- {
+ /* 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 bool Descent(const btDbvtNode*) { return(true); }
- DBVT_VIRTUAL bool AllLeaves(const btDbvtNode*) { return(true); }
+ 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 bool Descent(const btDbvtNode*) { return (true); }
+ DBVT_VIRTUAL bool AllLeaves(const btDbvtNode*) { return (true); }
};
- /* IWriter */
- struct IWriter
+ /* 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;
+ 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
+ /* IClone */
+ struct IClone
{
- virtual ~IClone() {}
- virtual void CloneLeaf(btDbvtNode*) {}
+ virtual ~IClone() {}
+ virtual void CloneLeaf(btDbvtNode*) {}
};
// Constants
- enum {
- SIMPLE_STACKSIZE = 64,
- DOUBLE_STACKSIZE = SIMPLE_STACKSIZE*2
+ 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<sStkNN> m_stkStack;
+ btDbvtNode* m_root;
+ btDbvtNode* m_free;
+ int m_lkhd;
+ int m_leaves;
+ unsigned m_opath;
+ btAlignedObjectArray<sStkNN> 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<const btDbvtNode*>& leaves);
+ 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<const btDbvtNode*>& leaves);
#if DBVT_ENABLE_BENCHMARK
- static void benchmark();
+ static void benchmark();
#else
- static void benchmark(){}
+ static void benchmark()
+ {
+ }
#endif
// DBVT_IPOLICY must support ICollide policy/interface
DBVT_PREFIX
- static void enumNodes( const btDbvtNode* root,
- DBVT_IPOLICY);
+ static void enumNodes(const btDbvtNode* root,
+ DBVT_IPOLICY);
DBVT_PREFIX
- static void enumLeaves( const btDbvtNode* root,
- DBVT_IPOLICY);
+ static void enumLeaves(const btDbvtNode* root,
+ DBVT_IPOLICY);
DBVT_PREFIX
- void collideTT( const btDbvtNode* root0,
- const btDbvtNode* root1,
- DBVT_IPOLICY);
+ void collideTT(const btDbvtNode* root0,
+ const btDbvtNode* root1,
+ DBVT_IPOLICY);
DBVT_PREFIX
- void collideTTpersistentStack( const btDbvtNode* root0,
- const btDbvtNode* root1,
- DBVT_IPOLICY);
+ void collideTTpersistentStack(const btDbvtNode* root0,
+ const btDbvtNode* root1,
+ DBVT_IPOLICY);
#if 0
DBVT_PREFIX
void collideTT( const btDbvtNode* root0,
@@ -325,82 +326,89 @@ struct btDbvt
#endif
DBVT_PREFIX
- void collideTV( const btDbvtNode* root,
- const btDbvtVolume& volume,
- DBVT_IPOLICY) const;
-
+ 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;
-
-
-
-
+ 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);
+ 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<const btDbvtNode*>& stack,
- DBVT_IPOLICY) const;
+ 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<const btDbvtNode*>& stack,
+ DBVT_IPOLICY) const;
DBVT_PREFIX
- static void collideKDOP(const btDbvtNode* root,
- const btVector3* normals,
- const btScalar* offsets,
- int count,
- DBVT_IPOLICY);
+ 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);
+ 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)
+ 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)
+ int m = 0;
+ while (l < h)
{
- m=(l+h)>>1;
- if(a[i[m]].value>=v) l=m+1; else h=m;
+ m = (l + h) >> 1;
+ if (a[i[m]].value >= v)
+ l = m + 1;
+ else
+ h = m;
}
- return(h);
+ return (h);
}
- static DBVT_INLINE int allocate( btAlignedObjectArray<int>& ifree,
- btAlignedObjectArray<sStkNPS>& stock,
- const sStkNPS& value)
+ static DBVT_INLINE int allocate(btAlignedObjectArray<int>& ifree,
+ btAlignedObjectArray<sStkNPS>& stock,
+ const sStkNPS& value)
{
- int i;
- if(ifree.size()>0)
- { i=ifree[ifree.size()-1];ifree.pop_back();stock[i]=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);
+ {
+ i = stock.size();
+ stock.push_back(value);
+ }
+ return (i);
}
//
private:
- btDbvt(const btDbvt&) {}
+ btDbvt(const btDbvt&) {}
};
//
@@ -408,227 +416,252 @@ private:
//
//
-inline btDbvtAabbMm btDbvtAabbMm::FromCE(const btVector3& c,const btVector3& e)
+inline btDbvtAabbMm btDbvtAabbMm::FromCE(const btVector3& c, const btVector3& e)
{
btDbvtAabbMm box;
- box.mi=c-e;box.mx=c+e;
- return(box);
+ box.mi = c - e;
+ box.mx = c + e;
+ return (box);
}
//
-inline btDbvtAabbMm btDbvtAabbMm::FromCR(const btVector3& c,btScalar r)
+inline btDbvtAabbMm btDbvtAabbMm::FromCR(const btVector3& c, btScalar r)
{
- return(FromCE(c,btVector3(r,r,r)));
+ return (FromCE(c, btVector3(r, r, r)));
}
//
-inline btDbvtAabbMm btDbvtAabbMm::FromMM(const btVector3& mi,const btVector3& mx)
+inline btDbvtAabbMm btDbvtAabbMm::FromMM(const btVector3& mi, const btVector3& mx)
{
btDbvtAabbMm box;
- box.mi=mi;box.mx=mx;
- return(box);
+ box.mi = mi;
+ box.mx = mx;
+ return (box);
}
//
-inline btDbvtAabbMm btDbvtAabbMm::FromPoints(const btVector3* pts,int n)
+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 = box.mx = pts[0];
+ for (int i = 1; i < n; ++i)
{
box.mi.setMin(pts[i]);
box.mx.setMax(pts[i]);
}
- return(box);
+ return (box);
}
//
-inline btDbvtAabbMm btDbvtAabbMm::FromPoints(const btVector3** ppts,int n)
+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 = box.mx = *ppts[0];
+ for (int i = 1; i < n; ++i)
{
box.mi.setMin(*ppts[i]);
box.mx.setMax(*ppts[i]);
}
- return(box);
+ return (box);
}
//
-DBVT_INLINE void btDbvtAabbMm::Expand(const btVector3& e)
+DBVT_INLINE void btDbvtAabbMm::Expand(const btVector3& e)
{
- mi-=e;mx+=e;
+ mi -= e;
+ mx += e;
}
//
-DBVT_INLINE void btDbvtAabbMm::SignedExpand(const btVector3& 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]);
+ 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
+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()));
+ 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
+DBVT_INLINE int btDbvtAabbMm::Classify(const btVector3& n, btScalar o, int s) const
{
- btVector3 pi,px;
- switch(s)
+ 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;
+ 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);
+ 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
+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));
+ 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
+DBVT_INLINE void btDbvtAabbMm::AddSpan(const btVector3& d, btScalar& smi, btScalar& smx) const
{
- for(int i=0;i<3;++i)
+ for (int i = 0; i < 3; ++i)
{
- if(d[i]<0)
- { smi+=mx[i]*d[i];smx+=mi[i]*d[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]; }
+ {
+ smi += mi[i] * d[i];
+ smx += mx[i] * d[i];
+ }
}
}
//
-DBVT_INLINE bool Intersect( const btDbvtAabbMm& a,
- const btDbvtAabbMm& b)
+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);
+#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);
+ const int* pu((const int*)&rt);
#endif
- return((pu[0]|pu[1]|pu[2])==0);
+ 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()));
+ 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)
+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()));
+ 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)
+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()));
+ 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)
+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};
+#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*/};
+ 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
+ union btSSEUnion ///NOTE: if we use more intrinsics, move btSSEUnion into the LinearMath directory
{
- __m128 ssereg;
- float floats[4];
- int ints[4];
+ __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));
-
+ __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;
+ tmp.ssereg = _mm_cmple_ss(bmi, ami);
+ return tmp.ints[0] & 1;
#else
- ATTRIBUTE_ALIGNED16(__int32 r[1]);
+ ATTRIBUTE_ALIGNED16(__int32 r[1]);
__asm
{
mov eax,o
@@ -656,46 +689,52 @@ DBVT_INLINE int Select( const btDbvtAabbMm& o,
cmpless xmm2,xmm1
movss r,xmm2
}
- return(r[0]&1);
+ return (r[0] & 1);
#endif
#else
- return(Proximity(o,a)<Proximity(o,b)?0:1);
+ return (Proximity(o, a) < Proximity(o, b) ? 0 : 1);
#endif
}
//
-DBVT_INLINE void Merge( const btDbvtAabbMm& a,
- const btDbvtAabbMm& b,
- btDbvtAabbMm& r)
+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);
+#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)
+ 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];
+ 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)
+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()));
+ 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()));
}
//
@@ -704,162 +743,162 @@ DBVT_INLINE bool NotEqual( const btDbvtAabbMm& a,
//
DBVT_PREFIX
-inline void btDbvt::enumNodes( const btDbvtNode* root,
- DBVT_IPOLICY)
+inline void btDbvt::enumNodes(const btDbvtNode* root,
+ DBVT_IPOLICY)
{
DBVT_CHECKTYPE
- policy.Process(root);
- if(root->isinternal())
+ policy.Process(root);
+ if (root->isinternal())
{
- enumNodes(root->childs[0],policy);
- enumNodes(root->childs[1],policy);
+ enumNodes(root->childs[0], policy);
+ enumNodes(root->childs[1], policy);
}
}
//
DBVT_PREFIX
-inline void btDbvt::enumLeaves( const btDbvtNode* root,
- DBVT_IPOLICY)
+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);
- }
+ 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)
+inline void btDbvt::collideTT(const btDbvtNode* root0,
+ const btDbvtNode* root1,
+ DBVT_IPOLICY)
{
DBVT_CHECKTYPE
- if(root0&&root1)
+ if (root0 && root1)
+ {
+ int depth = 1;
+ int treshold = DOUBLE_STACKSIZE - 4;
+ btAlignedObjectArray<sStkNN> stkStack;
+ stkStack.resize(DOUBLE_STACKSIZE);
+ stkStack[0] = sStkNN(root0, root1);
+ do
{
- int depth=1;
- int treshold=DOUBLE_STACKSIZE-4;
- btAlignedObjectArray<sStkNN> stkStack;
- stkStack.resize(DOUBLE_STACKSIZE);
- stkStack[0]=sStkNN(root0,root1);
- do {
- sStkNN p=stkStack[--depth];
- if(depth>treshold)
+ 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.resize(stkStack.size()*2);
- treshold=stkStack.size()-4;
+ 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]);
}
- if(p.a==p.b)
+ }
+ else if (Intersect(p.a->volume, p.b->volume))
+ {
+ if (p.a->isinternal())
{
- 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.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]);
+ stkStack[depth++] = sStkNN(p.a->childs[0], p.b);
+ stkStack[depth++] = sStkNN(p.a->childs[1], p.b);
}
}
- else if(Intersect(p.a->volume,p.b->volume))
+ else
{
- if(p.a->isinternal())
+ if (p.b->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);
- }
+ stkStack[depth++] = sStkNN(p.a, p.b->childs[0]);
+ stkStack[depth++] = sStkNN(p.a, p.b->childs[1]);
}
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);
- }
+ policy.Process(p.a, p.b);
}
}
- } while(depth);
- }
+ }
+ } while (depth);
+ }
}
-
-
DBVT_PREFIX
-inline void btDbvt::collideTTpersistentStack( const btDbvtNode* root0,
- const btDbvtNode* root1,
- DBVT_IPOLICY)
+inline void btDbvt::collideTTpersistentStack(const btDbvtNode* root0,
+ const btDbvtNode* root1,
+ DBVT_IPOLICY)
{
DBVT_CHECKTYPE
- if(root0&&root1)
+ if (root0 && root1)
+ {
+ int depth = 1;
+ int treshold = DOUBLE_STACKSIZE - 4;
+
+ m_stkStack.resize(DOUBLE_STACKSIZE);
+ m_stkStack[0] = sStkNN(root0, root1);
+ do
{
- 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)
+ 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.resize(m_stkStack.size()*2);
- treshold=m_stkStack.size()-4;
+ 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]);
}
- if(p.a==p.b)
+ }
+ else if (Intersect(p.a->volume, p.b->volume))
+ {
+ if (p.a->isinternal())
{
- if(p.a->isinternal())
+ if (p.b->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]);
+ 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(Intersect(p.a->volume,p.b->volume))
+ else
{
- if(p.a->isinternal())
+ if (p.b->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);
- }
+ m_stkStack[depth++] = sStkNN(p.a, p.b->childs[0]);
+ m_stkStack[depth++] = sStkNN(p.a, p.b->childs[1]);
}
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);
- }
+ policy.Process(p.a, p.b);
}
}
- } while(depth);
- }
+ }
+ } while (depth);
+ }
}
#if 0
@@ -929,33 +968,35 @@ inline void btDbvt::collideTT( const btDbvtNode* root0,
const btTransform xform=xform0.inverse()*xform1;
collideTT(root0,root1,xform,policy);
}
-#endif
+#endif
DBVT_PREFIX
-inline void btDbvt::collideTV( const btDbvtNode* root,
- const btDbvtVolume& vol,
- DBVT_IPOLICY) const
+inline void btDbvt::collideTV(const btDbvtNode* root,
+ const btDbvtVolume& vol,
+ DBVT_IPOLICY) const
{
DBVT_CHECKTYPE
- if(root)
+ if (root)
{
- ATTRIBUTE_ALIGNED16(btDbvtVolume) volume(vol);
- btAlignedObjectArray<const btDbvtNode*> stack;
+ ATTRIBUTE_ALIGNED16(btDbvtVolume)
+ volume(vol);
+ btAlignedObjectArray<const btDbvtNode*> stack;
stack.resize(0);
#ifndef BT_DISABLE_STACK_TEMP_MEMORY
- char tempmemory[SIMPLE_STACKSIZE*sizeof(const btDbvtNode*)];
+ char tempmemory[SIMPLE_STACKSIZE * sizeof(const btDbvtNode*)];
stack.initializeFromBuffer(tempmemory, 0, SIMPLE_STACKSIZE);
#else
stack.reserve(SIMPLE_STACKSIZE);
-#endif //BT_DISABLE_STACK_TEMP_MEMORY
+#endif //BT_DISABLE_STACK_TEMP_MEMORY
stack.push_back(root);
- do {
- const btDbvtNode* n=stack[stack.size()-1];
+ do
+ {
+ const btDbvtNode* n = stack[stack.size() - 1];
stack.pop_back();
- if(Intersect(n->volume,volume))
+ if (Intersect(n->volume, volume))
{
- if(n->isinternal())
+ if (n->isinternal())
{
stack.push_back(n->childs[0]);
stack.push_back(n->childs[1]);
@@ -965,30 +1006,32 @@ inline void btDbvt::collideTV( const btDbvtNode* root,
policy.Process(n);
}
}
- } while(stack.size()>0);
+ } while (stack.size() > 0);
}
}
//
DBVT_PREFIX
-inline void btDbvt::collideTVNoStackAlloc( const btDbvtNode* root,
- const btDbvtVolume& vol,
- btNodeStack& stack,
- DBVT_IPOLICY) const
+inline void btDbvt::collideTVNoStackAlloc(const btDbvtNode* root,
+ const btDbvtVolume& vol,
+ btNodeStack& stack,
+ DBVT_IPOLICY) const
{
DBVT_CHECKTYPE
- if(root)
+ if (root)
{
- ATTRIBUTE_ALIGNED16(btDbvtVolume) volume(vol);
+ ATTRIBUTE_ALIGNED16(btDbvtVolume)
+ volume(vol);
stack.resize(0);
stack.reserve(SIMPLE_STACKSIZE);
stack.push_back(root);
- do {
- const btDbvtNode* n=stack[stack.size()-1];
+ do
+ {
+ const btDbvtNode* n = stack[stack.size() - 1];
stack.pop_back();
- if(Intersect(n->volume,volume))
+ if (Intersect(n->volume, volume))
{
- if(n->isinternal())
+ if (n->isinternal())
{
stack.push_back(n->childs[0]);
stack.push_back(n->childs[1]);
@@ -998,328 +1041,346 @@ inline void btDbvt::collideTVNoStackAlloc( const btDbvtNode* root,
policy.Process(n);
}
}
- } while(stack.size()>0);
+ } 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<const btDbvtNode*>& stack,
- DBVT_IPOLICY ) const
+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<const btDbvtNode*>& stack,
+ DBVT_IPOLICY) const
{
- (void) rayTo;
+ (void)rayTo;
DBVT_CHECKTYPE
- if(root)
+ if (root)
{
btVector3 resultNormal;
- int depth=1;
- int treshold=DOUBLE_STACKSIZE-2;
+ int depth = 1;
+ int treshold = DOUBLE_STACKSIZE - 2;
stack.resize(DOUBLE_STACKSIZE);
- stack[0]=root;
+ stack[0] = root;
btVector3 bounds[2];
- do
+ 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)
+ 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 (node->isinternal())
{
- if(depth>treshold)
+ if (depth > treshold)
{
- stack.resize(stack.size()*2);
- treshold=stack.size()-2;
+ stack.resize(stack.size() * 2);
+ treshold = stack.size() - 2;
}
- stack[depth++]=node->childs[0];
- stack[depth++]=node->childs[1];
+ stack[depth++] = node->childs[0];
+ stack[depth++] = node->childs[1];
}
else
{
policy.Process(node);
}
}
- } while(depth);
+ } while (depth);
}
}
//
DBVT_PREFIX
-inline void btDbvt::rayTest( const btDbvtNode* root,
- const btVector3& rayFrom,
- const btVector3& rayTo,
- DBVT_IPOLICY)
+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 ();
+ 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};
+ ///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);
+ btScalar lambda_max = rayDir.dot(rayTo - rayFrom);
- btVector3 resultNormal;
+ btVector3 resultNormal;
- btAlignedObjectArray<const btDbvtNode*> stack;
+ btAlignedObjectArray<const btDbvtNode*> stack;
- int depth=1;
- int treshold=DOUBLE_STACKSIZE-2;
+ int depth = 1;
+ int treshold = DOUBLE_STACKSIZE - 2;
- char tempmemory[DOUBLE_STACKSIZE * sizeof(const btDbvtNode*)];
+ 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];
+ 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();
- 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);
+ 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
+ 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 (result1)
+ {
+ if (node->isinternal())
{
- if(node->isinternal())
+ if (depth > treshold)
{
- 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);
+ stack.resize(stack.size() * 2);
+ treshold = stack.size() - 2;
}
+ stack[depth++] = node->childs[0];
+ stack[depth++] = node->childs[1];
}
- } while(depth);
-
- }
+ 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)
+inline void btDbvt::collideKDOP(const btDbvtNode* root,
+ const btVector3* normals,
+ const btScalar* offsets,
+ int count,
+ DBVT_IPOLICY)
{
DBVT_CHECKTYPE
- if(root)
+ if (root)
+ {
+ const int inside = (1 << count) - 1;
+ btAlignedObjectArray<sStkNP> stack;
+ int signs[sizeof(unsigned) * 8];
+ btAssert(count < int(sizeof(signs) / sizeof(signs[0])));
+ for (int i = 0; i < count; ++i)
{
- const int inside=(1<<count)-1;
- btAlignedObjectArray<sStkNP> 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)
{
- 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))
{
- if(0==(se.mask&j))
+ const int side = se.node->volume.Classify(normals[i], offsets[i], signs[i]);
+ switch (side)
{
- 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;
- }
+ case -1:
+ out = true;
+ break;
+ case +1:
+ se.mask |= j;
+ break;
}
}
- if(!out)
+ }
+ if (!out)
+ {
+ if ((se.mask != inside) && (se.node->isinternal()))
{
- 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);
- }
+ stack.push_back(sStkNP(se.node->childs[0], se.mask));
+ stack.push_back(sStkNP(se.node->childs[1], se.mask));
}
- } while(stack.size());
- }
+ 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)
+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)
+ 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<sStkNPS> stock;
+ btAlignedObjectArray<int> ifree;
+ btAlignedObjectArray<int> stack;
+ int signs[sizeof(unsigned) * 8];
+ btAssert(count < int(sizeof(signs) / sizeof(signs[0])));
+ for (int i = 0; i < count; ++i)
{
- 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<sStkNPS> stock;
- btAlignedObjectArray<int> ifree;
- btAlignedObjectArray<int> 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)
{
- 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)
{
- bool out=false;
- for(int i=0,j=1;(!out)&&(i<count);++i,j<<=1)
+ if (0 == (se.mask & j))
{
- if(0==(se.mask&j))
+ const int side = se.node->volume.Classify(normals[i], offsets[i], signs[i]);
+ switch (side)
{
- 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;
- }
+ case -1:
+ out = true;
+ break;
+ case +1:
+ se.mask |= j;
+ break;
}
}
- if(out) continue;
}
- if(policy.Descent(se.node))
+ if (out) continue;
+ }
+ if (policy.Descent(se.node))
+ {
+ if (se.node->isinternal())
{
- 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))
{
- 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 );
-
+ /* 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);
- }
+ {
+ 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];
- }
+ 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);
+ 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]);
+ {
+ 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
+#else
+ for (int k = stack.size() - 1; k > j; --k)
{
- stack.push_back(allocate(ifree,stock,nes[q]));
- stack.push_back(allocate(ifree,stock,nes[1-q]));
+ stack[k] = stack[k - 1];
}
+#endif
+ stack[j] = allocate(ifree, stock, nes[1 - q]);
}
else
{
- policy.Process(se.node,se.value);
+ stack.push_back(allocate(ifree, stock, nes[q]));
+ stack.push_back(allocate(ifree, stock, nes[1 - q]));
}
}
- } while(stack.size());
- }
+ else
+ {
+ policy.Process(se.node, se.value);
+ }
+ }
+ } while (stack.size());
+ }
}
//
DBVT_PREFIX
-inline void btDbvt::collideTU( const btDbvtNode* root,
- DBVT_IPOLICY)
+inline void btDbvt::collideTU(const btDbvtNode* root,
+ DBVT_IPOLICY)
{
DBVT_CHECKTYPE
- if(root)
+ if (root)
+ {
+ btAlignedObjectArray<const btDbvtNode*> stack;
+ stack.reserve(SIMPLE_STACKSIZE);
+ stack.push_back(root);
+ do
{
- btAlignedObjectArray<const btDbvtNode*> stack;
- stack.reserve(SIMPLE_STACKSIZE);
- stack.push_back(root);
- do {
- const btDbvtNode* n=stack[stack.size()-1];
- stack.pop_back();
- if(policy.Descent(n))
+ const btDbvtNode* n = stack[stack.size() - 1];
+ stack.pop_back();
+ if (policy.Descent(n))
+ {
+ if (n->isinternal())
{
- if(n->isinternal())
- { stack.push_back(n->childs[0]);stack.push_back(n->childs[1]); }
- else
- { policy.Process(n); }
+ stack.push_back(n->childs[0]);
+ stack.push_back(n->childs[1]);
}
- } while(stack.size()>0);
- }
+ else
+ {
+ policy.Process(n);
+ }
+ }
+ } while (stack.size() > 0);
+ }
}
//
diff --git a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDbvtBroadphase.cpp b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDbvtBroadphase.cpp
index 14cd1a31ea..7b39dbdc0f 100644
--- a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDbvtBroadphase.cpp
+++ b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDbvtBroadphase.cpp
@@ -22,28 +22,27 @@ btScalar gDbvtMargin = btScalar(0.05);
// Profiling
//
-#if DBVT_BP_PROFILE||DBVT_BP_ENABLE_BENCHMARK
+#if DBVT_BP_PROFILE || DBVT_BP_ENABLE_BENCHMARK
#include <stdio.h>
#endif
#if DBVT_BP_PROFILE
-struct ProfileScope
+struct ProfileScope
{
- __forceinline ProfileScope(btClock& clock,unsigned long& value) :
- m_clock(&clock),m_value(&value),m_base(clock.getTimeMicroseconds())
+ __forceinline ProfileScope(btClock& clock, unsigned long& value) : m_clock(&clock), m_value(&value), m_base(clock.getTimeMicroseconds())
{
}
__forceinline ~ProfileScope()
{
- (*m_value)+=m_clock->getTimeMicroseconds()-m_base;
+ (*m_value) += m_clock->getTimeMicroseconds() - m_base;
}
- btClock* m_clock;
- unsigned long* m_value;
- unsigned long m_base;
+ btClock* m_clock;
+ unsigned long* m_value;
+ unsigned long m_base;
};
-#define SPC(_value_) ProfileScope spc_scope(m_clock,_value_)
+#define SPC(_value_) ProfileScope spc_scope(m_clock, _value_)
#else
-#define SPC(_value_)
+#define SPC(_value_)
#endif
//
@@ -52,66 +51,75 @@ struct ProfileScope
//
template <typename T>
-static inline void listappend(T* item,T*& list)
+static inline void listappend(T* item, T*& list)
{
- item->links[0]=0;
- item->links[1]=list;
- if(list) list->links[0]=item;
- list=item;
+ item->links[0] = 0;
+ item->links[1] = list;
+ if (list) list->links[0] = item;
+ list = item;
}
//
template <typename T>
-static inline void listremove(T* item,T*& list)
+static inline void listremove(T* item, T*& list)
{
- if(item->links[0]) item->links[0]->links[1]=item->links[1]; else list=item->links[1];
- if(item->links[1]) item->links[1]->links[0]=item->links[0];
+ if (item->links[0])
+ item->links[0]->links[1] = item->links[1];
+ else
+ list = item->links[1];
+ if (item->links[1]) item->links[1]->links[0] = item->links[0];
}
//
template <typename T>
-static inline int listcount(T* root)
+static inline int listcount(T* root)
{
- int n=0;
- while(root) { ++n;root=root->links[1]; }
- return(n);
+ int n = 0;
+ while (root)
+ {
+ ++n;
+ root = root->links[1];
+ }
+ return (n);
}
//
template <typename T>
-static inline void clear(T& value)
+static inline void clear(T& value)
{
- static const struct ZeroDummy : T {} zerodummy;
- value=zerodummy;
+ static const struct ZeroDummy : T
+ {
+ } zerodummy;
+ value = zerodummy;
}
//
// Colliders
//
-/* Tree collider */
-struct btDbvtTreeCollider : btDbvt::ICollide
+/* Tree collider */
+struct btDbvtTreeCollider : btDbvt::ICollide
{
- btDbvtBroadphase* pbp;
- btDbvtProxy* proxy;
+ btDbvtBroadphase* pbp;
+ btDbvtProxy* proxy;
btDbvtTreeCollider(btDbvtBroadphase* p) : pbp(p) {}
- void Process(const btDbvtNode* na,const btDbvtNode* nb)
+ void Process(const btDbvtNode* na, const btDbvtNode* nb)
{
- if(na!=nb)
+ if (na != nb)
{
- btDbvtProxy* pa=(btDbvtProxy*)na->data;
- btDbvtProxy* pb=(btDbvtProxy*)nb->data;
+ btDbvtProxy* pa = (btDbvtProxy*)na->data;
+ btDbvtProxy* pb = (btDbvtProxy*)nb->data;
#if DBVT_BP_SORTPAIRS
- if(pa->m_uniqueId>pb->m_uniqueId)
- btSwap(pa,pb);
+ if (pa->m_uniqueId > pb->m_uniqueId)
+ btSwap(pa, pb);
#endif
- pbp->m_paircache->addOverlappingPair(pa,pb);
+ pbp->m_paircache->addOverlappingPair(pa, pb);
++pbp->m_newpairs;
}
}
- void Process(const btDbvtNode* n)
+ void Process(const btDbvtNode* n)
{
- Process(n,proxy->leaf);
+ Process(n, proxy->leaf);
}
};
@@ -122,31 +130,31 @@ struct btDbvtTreeCollider : btDbvt::ICollide
//
btDbvtBroadphase::btDbvtBroadphase(btOverlappingPairCache* paircache)
{
- m_deferedcollide = false;
- m_needcleanup = true;
- m_releasepaircache = (paircache!=0)?false:true;
- m_prediction = 0;
- m_stageCurrent = 0;
- m_fixedleft = 0;
- m_fupdates = 1;
- m_dupdates = 0;
- m_cupdates = 10;
- m_newpairs = 1;
- m_updates_call = 0;
- m_updates_done = 0;
- m_updates_ratio = 0;
- m_paircache = paircache? paircache : new(btAlignedAlloc(sizeof(btHashedOverlappingPairCache),16)) btHashedOverlappingPairCache();
- m_gid = 0;
- m_pid = 0;
- m_cid = 0;
- for(int i=0;i<=STAGECOUNT;++i)
+ m_deferedcollide = false;
+ m_needcleanup = true;
+ m_releasepaircache = (paircache != 0) ? false : true;
+ m_prediction = 0;
+ m_stageCurrent = 0;
+ m_fixedleft = 0;
+ m_fupdates = 1;
+ m_dupdates = 0;
+ m_cupdates = 10;
+ m_newpairs = 1;
+ m_updates_call = 0;
+ m_updates_done = 0;
+ m_updates_ratio = 0;
+ m_paircache = paircache ? paircache : new (btAlignedAlloc(sizeof(btHashedOverlappingPairCache), 16)) btHashedOverlappingPairCache();
+ m_gid = 0;
+ m_pid = 0;
+ m_cid = 0;
+ for (int i = 0; i <= STAGECOUNT; ++i)
{
- m_stageRoots[i]=0;
+ m_stageRoots[i] = 0;
}
#if BT_THREADSAFE
- m_rayTestStacks.resize(BT_MAX_THREAD_COUNT);
+ m_rayTestStacks.resize(BT_MAX_THREAD_COUNT);
#else
- m_rayTestStacks.resize(1);
+ m_rayTestStacks.resize(1);
#endif
#if DBVT_BP_PROFILE
clear(m_profiling);
@@ -156,7 +164,7 @@ btDbvtBroadphase::btDbvtBroadphase(btOverlappingPairCache* paircache)
//
btDbvtBroadphase::~btDbvtBroadphase()
{
- if(m_releasepaircache)
+ if (m_releasepaircache)
{
m_paircache->~btOverlappingPairCache();
btAlignedFree(m_paircache);
@@ -164,302 +172,294 @@ btDbvtBroadphase::~btDbvtBroadphase()
}
//
-btBroadphaseProxy* btDbvtBroadphase::createProxy( const btVector3& aabbMin,
- const btVector3& aabbMax,
- int /*shapeType*/,
- void* userPtr,
- int collisionFilterGroup,
- int collisionFilterMask,
- btDispatcher* /*dispatcher*/)
+btBroadphaseProxy* btDbvtBroadphase::createProxy(const btVector3& aabbMin,
+ const btVector3& aabbMax,
+ int /*shapeType*/,
+ void* userPtr,
+ int collisionFilterGroup,
+ int collisionFilterMask,
+ btDispatcher* /*dispatcher*/)
{
- btDbvtProxy* proxy=new(btAlignedAlloc(sizeof(btDbvtProxy),16)) btDbvtProxy( aabbMin,aabbMax,userPtr,
- collisionFilterGroup,
- collisionFilterMask);
+ btDbvtProxy* proxy = new (btAlignedAlloc(sizeof(btDbvtProxy), 16)) btDbvtProxy(aabbMin, aabbMax, userPtr,
+ collisionFilterGroup,
+ collisionFilterMask);
- btDbvtAabbMm aabb = btDbvtVolume::FromMM(aabbMin,aabbMax);
+ btDbvtAabbMm aabb = btDbvtVolume::FromMM(aabbMin, aabbMax);
//bproxy->aabb = btDbvtVolume::FromMM(aabbMin,aabbMax);
- proxy->stage = m_stageCurrent;
- proxy->m_uniqueId = ++m_gid;
- proxy->leaf = m_sets[0].insert(aabb,proxy);
- listappend(proxy,m_stageRoots[m_stageCurrent]);
- if(!m_deferedcollide)
+ proxy->stage = m_stageCurrent;
+ proxy->m_uniqueId = ++m_gid;
+ proxy->leaf = m_sets[0].insert(aabb, proxy);
+ listappend(proxy, m_stageRoots[m_stageCurrent]);
+ if (!m_deferedcollide)
{
- btDbvtTreeCollider collider(this);
- collider.proxy=proxy;
- m_sets[0].collideTV(m_sets[0].m_root,aabb,collider);
- m_sets[1].collideTV(m_sets[1].m_root,aabb,collider);
+ btDbvtTreeCollider collider(this);
+ collider.proxy = proxy;
+ m_sets[0].collideTV(m_sets[0].m_root, aabb, collider);
+ m_sets[1].collideTV(m_sets[1].m_root, aabb, collider);
}
- return(proxy);
+ return (proxy);
}
//
-void btDbvtBroadphase::destroyProxy( btBroadphaseProxy* absproxy,
- btDispatcher* dispatcher)
+void btDbvtBroadphase::destroyProxy(btBroadphaseProxy* absproxy,
+ btDispatcher* dispatcher)
{
- btDbvtProxy* proxy=(btDbvtProxy*)absproxy;
- if(proxy->stage==STAGECOUNT)
+ btDbvtProxy* proxy = (btDbvtProxy*)absproxy;
+ if (proxy->stage == STAGECOUNT)
m_sets[1].remove(proxy->leaf);
else
m_sets[0].remove(proxy->leaf);
- listremove(proxy,m_stageRoots[proxy->stage]);
- m_paircache->removeOverlappingPairsContainingProxy(proxy,dispatcher);
+ listremove(proxy, m_stageRoots[proxy->stage]);
+ m_paircache->removeOverlappingPairsContainingProxy(proxy, dispatcher);
btAlignedFree(proxy);
- m_needcleanup=true;
+ m_needcleanup = true;
}
-void btDbvtBroadphase::getAabb(btBroadphaseProxy* absproxy,btVector3& aabbMin, btVector3& aabbMax ) const
+void btDbvtBroadphase::getAabb(btBroadphaseProxy* absproxy, btVector3& aabbMin, btVector3& aabbMax) const
{
- btDbvtProxy* proxy=(btDbvtProxy*)absproxy;
+ btDbvtProxy* proxy = (btDbvtProxy*)absproxy;
aabbMin = proxy->m_aabbMin;
aabbMax = proxy->m_aabbMax;
}
-struct BroadphaseRayTester : btDbvt::ICollide
+struct BroadphaseRayTester : btDbvt::ICollide
{
btBroadphaseRayCallback& m_rayCallback;
BroadphaseRayTester(btBroadphaseRayCallback& orgCallback)
- :m_rayCallback(orgCallback)
+ : m_rayCallback(orgCallback)
{
}
- void Process(const btDbvtNode* leaf)
+ void Process(const btDbvtNode* leaf)
{
- btDbvtProxy* proxy=(btDbvtProxy*)leaf->data;
+ btDbvtProxy* proxy = (btDbvtProxy*)leaf->data;
m_rayCallback.process(proxy);
}
-};
+};
-void btDbvtBroadphase::rayTest(const btVector3& rayFrom,const btVector3& rayTo, btBroadphaseRayCallback& rayCallback,const btVector3& aabbMin,const btVector3& aabbMax)
+void btDbvtBroadphase::rayTest(const btVector3& rayFrom, const btVector3& rayTo, btBroadphaseRayCallback& rayCallback, const btVector3& aabbMin, const btVector3& aabbMax)
{
BroadphaseRayTester callback(rayCallback);
- btAlignedObjectArray<const btDbvtNode*>* stack = &m_rayTestStacks[0];
+ btAlignedObjectArray<const btDbvtNode*>* stack = &m_rayTestStacks[0];
#if BT_THREADSAFE
- // for this function to be threadsafe, each thread must have a separate copy
- // of this stack. This could be thread-local static to avoid dynamic allocations,
- // instead of just a local.
- int threadIndex = btGetCurrentThreadIndex();
- btAlignedObjectArray<const btDbvtNode*> localStack;
- if (threadIndex < m_rayTestStacks.size())
- {
- // use per-thread preallocated stack if possible to avoid dynamic allocations
- stack = &m_rayTestStacks[threadIndex];
- }
- else
- {
- stack = &localStack;
- }
+ // for this function to be threadsafe, each thread must have a separate copy
+ // of this stack. This could be thread-local static to avoid dynamic allocations,
+ // instead of just a local.
+ int threadIndex = btGetCurrentThreadIndex();
+ btAlignedObjectArray<const btDbvtNode*> localStack;
+ //todo(erwincoumans, "why do we get tsan issue here?")
+ if (0)//threadIndex < m_rayTestStacks.size())
+ //if (threadIndex < m_rayTestStacks.size())
+ {
+ // use per-thread preallocated stack if possible to avoid dynamic allocations
+ stack = &m_rayTestStacks[threadIndex];
+ }
+ else
+ {
+ stack = &localStack;
+ }
#endif
- m_sets[0].rayTestInternal( m_sets[0].m_root,
- rayFrom,
- rayTo,
- rayCallback.m_rayDirectionInverse,
- rayCallback.m_signs,
- rayCallback.m_lambda_max,
- aabbMin,
- aabbMax,
- *stack,
- callback);
-
- m_sets[1].rayTestInternal( m_sets[1].m_root,
- rayFrom,
- rayTo,
- rayCallback.m_rayDirectionInverse,
- rayCallback.m_signs,
- rayCallback.m_lambda_max,
- aabbMin,
- aabbMax,
- *stack,
- callback);
-
+ m_sets[0].rayTestInternal(m_sets[0].m_root,
+ rayFrom,
+ rayTo,
+ rayCallback.m_rayDirectionInverse,
+ rayCallback.m_signs,
+ rayCallback.m_lambda_max,
+ aabbMin,
+ aabbMax,
+ *stack,
+ callback);
+
+ m_sets[1].rayTestInternal(m_sets[1].m_root,
+ rayFrom,
+ rayTo,
+ rayCallback.m_rayDirectionInverse,
+ rayCallback.m_signs,
+ rayCallback.m_lambda_max,
+ aabbMin,
+ aabbMax,
+ *stack,
+ callback);
}
-
-struct BroadphaseAabbTester : btDbvt::ICollide
+struct BroadphaseAabbTester : btDbvt::ICollide
{
btBroadphaseAabbCallback& m_aabbCallback;
BroadphaseAabbTester(btBroadphaseAabbCallback& orgCallback)
- :m_aabbCallback(orgCallback)
+ : m_aabbCallback(orgCallback)
{
}
- void Process(const btDbvtNode* leaf)
+ void Process(const btDbvtNode* leaf)
{
- btDbvtProxy* proxy=(btDbvtProxy*)leaf->data;
+ btDbvtProxy* proxy = (btDbvtProxy*)leaf->data;
m_aabbCallback.process(proxy);
}
-};
+};
-void btDbvtBroadphase::aabbTest(const btVector3& aabbMin,const btVector3& aabbMax,btBroadphaseAabbCallback& aabbCallback)
+void btDbvtBroadphase::aabbTest(const btVector3& aabbMin, const btVector3& aabbMax, btBroadphaseAabbCallback& aabbCallback)
{
BroadphaseAabbTester callback(aabbCallback);
- const ATTRIBUTE_ALIGNED16(btDbvtVolume) bounds=btDbvtVolume::FromMM(aabbMin,aabbMax);
- //process all children, that overlap with the given AABB bounds
- m_sets[0].collideTV(m_sets[0].m_root,bounds,callback);
- m_sets[1].collideTV(m_sets[1].m_root,bounds,callback);
-
+ const ATTRIBUTE_ALIGNED16(btDbvtVolume) bounds = btDbvtVolume::FromMM(aabbMin, aabbMax);
+ //process all children, that overlap with the given AABB bounds
+ m_sets[0].collideTV(m_sets[0].m_root, bounds, callback);
+ m_sets[1].collideTV(m_sets[1].m_root, bounds, callback);
}
-
-
//
-void btDbvtBroadphase::setAabb( btBroadphaseProxy* absproxy,
- const btVector3& aabbMin,
- const btVector3& aabbMax,
- btDispatcher* /*dispatcher*/)
+void btDbvtBroadphase::setAabb(btBroadphaseProxy* absproxy,
+ const btVector3& aabbMin,
+ const btVector3& aabbMax,
+ btDispatcher* /*dispatcher*/)
{
- btDbvtProxy* proxy=(btDbvtProxy*)absproxy;
- ATTRIBUTE_ALIGNED16(btDbvtVolume) aabb=btDbvtVolume::FromMM(aabbMin,aabbMax);
+ btDbvtProxy* proxy = (btDbvtProxy*)absproxy;
+ ATTRIBUTE_ALIGNED16(btDbvtVolume)
+ aabb = btDbvtVolume::FromMM(aabbMin, aabbMax);
#if DBVT_BP_PREVENTFALSEUPDATE
- if(NotEqual(aabb,proxy->leaf->volume))
+ if (NotEqual(aabb, proxy->leaf->volume))
#endif
{
- bool docollide=false;
- if(proxy->stage==STAGECOUNT)
- {/* fixed -> dynamic set */
+ bool docollide = false;
+ if (proxy->stage == STAGECOUNT)
+ { /* fixed -> dynamic set */
m_sets[1].remove(proxy->leaf);
- proxy->leaf=m_sets[0].insert(aabb,proxy);
- docollide=true;
+ proxy->leaf = m_sets[0].insert(aabb, proxy);
+ docollide = true;
}
else
- {/* dynamic set */
+ { /* dynamic set */
++m_updates_call;
- if(Intersect(proxy->leaf->volume,aabb))
- {/* Moving */
-
- const btVector3 delta=aabbMin-proxy->m_aabbMin;
- btVector3 velocity(((proxy->m_aabbMax-proxy->m_aabbMin)/2)*m_prediction);
- if(delta[0]<0) velocity[0]=-velocity[0];
- if(delta[1]<0) velocity[1]=-velocity[1];
- if(delta[2]<0) velocity[2]=-velocity[2];
+ if (Intersect(proxy->leaf->volume, aabb))
+ { /* Moving */
+
+ const btVector3 delta = aabbMin - proxy->m_aabbMin;
+ btVector3 velocity(((proxy->m_aabbMax - proxy->m_aabbMin) / 2) * m_prediction);
+ if (delta[0] < 0) velocity[0] = -velocity[0];
+ if (delta[1] < 0) velocity[1] = -velocity[1];
+ if (delta[2] < 0) velocity[2] = -velocity[2];
if (
m_sets[0].update(proxy->leaf, aabb, velocity, gDbvtMargin)
- )
+ )
{
++m_updates_done;
- docollide=true;
+ docollide = true;
}
}
else
- {/* Teleporting */
- m_sets[0].update(proxy->leaf,aabb);
+ { /* Teleporting */
+ m_sets[0].update(proxy->leaf, aabb);
++m_updates_done;
- docollide=true;
- }
+ docollide = true;
+ }
}
- listremove(proxy,m_stageRoots[proxy->stage]);
+ listremove(proxy, m_stageRoots[proxy->stage]);
proxy->m_aabbMin = aabbMin;
proxy->m_aabbMax = aabbMax;
- proxy->stage = m_stageCurrent;
- listappend(proxy,m_stageRoots[m_stageCurrent]);
- if(docollide)
+ proxy->stage = m_stageCurrent;
+ listappend(proxy, m_stageRoots[m_stageCurrent]);
+ if (docollide)
{
- m_needcleanup=true;
- if(!m_deferedcollide)
+ m_needcleanup = true;
+ if (!m_deferedcollide)
{
- btDbvtTreeCollider collider(this);
- m_sets[1].collideTTpersistentStack(m_sets[1].m_root,proxy->leaf,collider);
- m_sets[0].collideTTpersistentStack(m_sets[0].m_root,proxy->leaf,collider);
+ btDbvtTreeCollider collider(this);
+ m_sets[1].collideTTpersistentStack(m_sets[1].m_root, proxy->leaf, collider);
+ m_sets[0].collideTTpersistentStack(m_sets[0].m_root, proxy->leaf, collider);
}
- }
+ }
}
}
-
//
-void btDbvtBroadphase::setAabbForceUpdate( btBroadphaseProxy* absproxy,
- const btVector3& aabbMin,
- const btVector3& aabbMax,
- btDispatcher* /*dispatcher*/)
+void btDbvtBroadphase::setAabbForceUpdate(btBroadphaseProxy* absproxy,
+ const btVector3& aabbMin,
+ const btVector3& aabbMax,
+ btDispatcher* /*dispatcher*/)
{
- btDbvtProxy* proxy=(btDbvtProxy*)absproxy;
- ATTRIBUTE_ALIGNED16(btDbvtVolume) aabb=btDbvtVolume::FromMM(aabbMin,aabbMax);
- bool docollide=false;
- if(proxy->stage==STAGECOUNT)
- {/* fixed -> dynamic set */
+ btDbvtProxy* proxy = (btDbvtProxy*)absproxy;
+ ATTRIBUTE_ALIGNED16(btDbvtVolume)
+ aabb = btDbvtVolume::FromMM(aabbMin, aabbMax);
+ bool docollide = false;
+ if (proxy->stage == STAGECOUNT)
+ { /* fixed -> dynamic set */
m_sets[1].remove(proxy->leaf);
- proxy->leaf=m_sets[0].insert(aabb,proxy);
- docollide=true;
+ proxy->leaf = m_sets[0].insert(aabb, proxy);
+ docollide = true;
}
else
- {/* dynamic set */
+ { /* dynamic set */
++m_updates_call;
- /* Teleporting */
- m_sets[0].update(proxy->leaf,aabb);
+ /* Teleporting */
+ m_sets[0].update(proxy->leaf, aabb);
++m_updates_done;
- docollide=true;
+ docollide = true;
}
- listremove(proxy,m_stageRoots[proxy->stage]);
+ listremove(proxy, m_stageRoots[proxy->stage]);
proxy->m_aabbMin = aabbMin;
proxy->m_aabbMax = aabbMax;
- proxy->stage = m_stageCurrent;
- listappend(proxy,m_stageRoots[m_stageCurrent]);
- if(docollide)
+ proxy->stage = m_stageCurrent;
+ listappend(proxy, m_stageRoots[m_stageCurrent]);
+ if (docollide)
{
- m_needcleanup=true;
- if(!m_deferedcollide)
+ m_needcleanup = true;
+ if (!m_deferedcollide)
{
- btDbvtTreeCollider collider(this);
- m_sets[1].collideTTpersistentStack(m_sets[1].m_root,proxy->leaf,collider);
- m_sets[0].collideTTpersistentStack(m_sets[0].m_root,proxy->leaf,collider);
+ btDbvtTreeCollider collider(this);
+ m_sets[1].collideTTpersistentStack(m_sets[1].m_root, proxy->leaf, collider);
+ m_sets[0].collideTTpersistentStack(m_sets[0].m_root, proxy->leaf, collider);
}
- }
+ }
}
//
-void btDbvtBroadphase::calculateOverlappingPairs(btDispatcher* dispatcher)
+void btDbvtBroadphase::calculateOverlappingPairs(btDispatcher* dispatcher)
{
collide(dispatcher);
#if DBVT_BP_PROFILE
- if(0==(m_pid%DBVT_BP_PROFILING_RATE))
- {
- printf("fixed(%u) dynamics(%u) pairs(%u)\r\n",m_sets[1].m_leaves,m_sets[0].m_leaves,m_paircache->getNumOverlappingPairs());
- unsigned int total=m_profiling.m_total;
- if(total<=0) total=1;
- printf("ddcollide: %u%% (%uus)\r\n",(50+m_profiling.m_ddcollide*100)/total,m_profiling.m_ddcollide/DBVT_BP_PROFILING_RATE);
- printf("fdcollide: %u%% (%uus)\r\n",(50+m_profiling.m_fdcollide*100)/total,m_profiling.m_fdcollide/DBVT_BP_PROFILING_RATE);
- printf("cleanup: %u%% (%uus)\r\n",(50+m_profiling.m_cleanup*100)/total,m_profiling.m_cleanup/DBVT_BP_PROFILING_RATE);
- printf("total: %uus\r\n",total/DBVT_BP_PROFILING_RATE);
- const unsigned long sum=m_profiling.m_ddcollide+
- m_profiling.m_fdcollide+
- m_profiling.m_cleanup;
- printf("leaked: %u%% (%uus)\r\n",100-((50+sum*100)/total),(total-sum)/DBVT_BP_PROFILING_RATE);
- printf("job counts: %u%%\r\n",(m_profiling.m_jobcount*100)/((m_sets[0].m_leaves+m_sets[1].m_leaves)*DBVT_BP_PROFILING_RATE));
+ if (0 == (m_pid % DBVT_BP_PROFILING_RATE))
+ {
+ printf("fixed(%u) dynamics(%u) pairs(%u)\r\n", m_sets[1].m_leaves, m_sets[0].m_leaves, m_paircache->getNumOverlappingPairs());
+ unsigned int total = m_profiling.m_total;
+ if (total <= 0) total = 1;
+ printf("ddcollide: %u%% (%uus)\r\n", (50 + m_profiling.m_ddcollide * 100) / total, m_profiling.m_ddcollide / DBVT_BP_PROFILING_RATE);
+ printf("fdcollide: %u%% (%uus)\r\n", (50 + m_profiling.m_fdcollide * 100) / total, m_profiling.m_fdcollide / DBVT_BP_PROFILING_RATE);
+ printf("cleanup: %u%% (%uus)\r\n", (50 + m_profiling.m_cleanup * 100) / total, m_profiling.m_cleanup / DBVT_BP_PROFILING_RATE);
+ printf("total: %uus\r\n", total / DBVT_BP_PROFILING_RATE);
+ const unsigned long sum = m_profiling.m_ddcollide +
+ m_profiling.m_fdcollide +
+ m_profiling.m_cleanup;
+ printf("leaked: %u%% (%uus)\r\n", 100 - ((50 + sum * 100) / total), (total - sum) / DBVT_BP_PROFILING_RATE);
+ printf("job counts: %u%%\r\n", (m_profiling.m_jobcount * 100) / ((m_sets[0].m_leaves + m_sets[1].m_leaves) * DBVT_BP_PROFILING_RATE));
clear(m_profiling);
m_clock.reset();
}
#endif
performDeferredRemoval(dispatcher);
-
}
void btDbvtBroadphase::performDeferredRemoval(btDispatcher* dispatcher)
{
-
if (m_paircache->hasDeferredRemoval())
{
-
- btBroadphasePairArray& overlappingPairArray = m_paircache->getOverlappingPairArray();
+ btBroadphasePairArray& overlappingPairArray = m_paircache->getOverlappingPairArray();
//perform a sort, to find duplicates and to sort 'invalid' pairs to the end
overlappingPairArray.quickSort(btBroadphasePairSortPredicate());
int 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++)
+
+ for (i = 0; i < overlappingPairArray.size(); i++)
{
-
btBroadphasePair& pair = overlappingPairArray[i];
bool isDuplicate = (pair == previousPair);
@@ -471,34 +471,35 @@ void btDbvtBroadphase::performDeferredRemoval(btDispatcher* dispatcher)
if (!isDuplicate)
{
//important to perform AABB check that is consistent with the broadphase
- btDbvtProxy* pa=(btDbvtProxy*)pair.m_pProxy0;
- btDbvtProxy* pb=(btDbvtProxy*)pair.m_pProxy1;
- bool hasOverlap = Intersect(pa->leaf->volume,pb->leaf->volume);
+ btDbvtProxy* pa = (btDbvtProxy*)pair.m_pProxy0;
+ btDbvtProxy* pb = (btDbvtProxy*)pair.m_pProxy1;
+ bool hasOverlap = Intersect(pa->leaf->volume, pb->leaf->volume);
if (hasOverlap)
{
needsRemoval = false;
- } else
+ }
+ else
{
needsRemoval = true;
}
- } else
+ }
+ else
{
//remove duplicate
needsRemoval = true;
//should have no algorithm
btAssert(!pair.m_algorithm);
}
-
+
if (needsRemoval)
{
- m_paircache->cleanOverlappingPair(pair,dispatcher);
+ m_paircache->cleanOverlappingPair(pair, dispatcher);
pair.m_pProxy0 = 0;
pair.m_pProxy1 = 0;
invalidPair++;
- }
-
+ }
}
//perform a sort, to sort 'invalid' pairs to the end
@@ -508,7 +509,7 @@ void btDbvtBroadphase::performDeferredRemoval(btDispatcher* dispatcher)
}
//
-void btDbvtBroadphase::collide(btDispatcher* dispatcher)
+void btDbvtBroadphase::collide(btDispatcher* dispatcher)
{
/*printf("---------------------------------------------------------\n");
printf("m_sets[0].m_leaves=%d\n",m_sets[0].m_leaves);
@@ -525,295 +526,303 @@ void btDbvtBroadphase::collide(btDispatcher* dispatcher)
}
*/
-
-
SPC(m_profiling.m_total);
- /* optimize */
- m_sets[0].optimizeIncremental(1+(m_sets[0].m_leaves*m_dupdates)/100);
- if(m_fixedleft)
+ /* optimize */
+ m_sets[0].optimizeIncremental(1 + (m_sets[0].m_leaves * m_dupdates) / 100);
+ if (m_fixedleft)
{
- const int count=1+(m_sets[1].m_leaves*m_fupdates)/100;
- m_sets[1].optimizeIncremental(1+(m_sets[1].m_leaves*m_fupdates)/100);
- m_fixedleft=btMax<int>(0,m_fixedleft-count);
+ const int count = 1 + (m_sets[1].m_leaves * m_fupdates) / 100;
+ m_sets[1].optimizeIncremental(1 + (m_sets[1].m_leaves * m_fupdates) / 100);
+ m_fixedleft = btMax<int>(0, m_fixedleft - count);
}
- /* dynamic -> fixed set */
- m_stageCurrent=(m_stageCurrent+1)%STAGECOUNT;
- btDbvtProxy* current=m_stageRoots[m_stageCurrent];
- if(current)
+ /* dynamic -> fixed set */
+ m_stageCurrent = (m_stageCurrent + 1) % STAGECOUNT;
+ btDbvtProxy* current = m_stageRoots[m_stageCurrent];
+ if (current)
{
#if DBVT_BP_ACCURATESLEEPING
- btDbvtTreeCollider collider(this);
+ btDbvtTreeCollider collider(this);
#endif
- do {
- btDbvtProxy* next=current->links[1];
- listremove(current,m_stageRoots[current->stage]);
- listappend(current,m_stageRoots[STAGECOUNT]);
+ do
+ {
+ btDbvtProxy* next = current->links[1];
+ listremove(current, m_stageRoots[current->stage]);
+ listappend(current, m_stageRoots[STAGECOUNT]);
#if DBVT_BP_ACCURATESLEEPING
- m_paircache->removeOverlappingPairsContainingProxy(current,dispatcher);
- collider.proxy=current;
- btDbvt::collideTV(m_sets[0].m_root,current->aabb,collider);
- btDbvt::collideTV(m_sets[1].m_root,current->aabb,collider);
+ m_paircache->removeOverlappingPairsContainingProxy(current, dispatcher);
+ collider.proxy = current;
+ btDbvt::collideTV(m_sets[0].m_root, current->aabb, collider);
+ btDbvt::collideTV(m_sets[1].m_root, current->aabb, collider);
#endif
m_sets[0].remove(current->leaf);
- ATTRIBUTE_ALIGNED16(btDbvtVolume) curAabb=btDbvtVolume::FromMM(current->m_aabbMin,current->m_aabbMax);
- current->leaf = m_sets[1].insert(curAabb,current);
- current->stage = STAGECOUNT;
- current = next;
- } while(current);
- m_fixedleft=m_sets[1].m_leaves;
- m_needcleanup=true;
+ ATTRIBUTE_ALIGNED16(btDbvtVolume)
+ curAabb = btDbvtVolume::FromMM(current->m_aabbMin, current->m_aabbMax);
+ current->leaf = m_sets[1].insert(curAabb, current);
+ current->stage = STAGECOUNT;
+ current = next;
+ } while (current);
+ m_fixedleft = m_sets[1].m_leaves;
+ m_needcleanup = true;
}
- /* collide dynamics */
+ /* collide dynamics */
{
- btDbvtTreeCollider collider(this);
- if(m_deferedcollide)
+ btDbvtTreeCollider collider(this);
+ if (m_deferedcollide)
{
SPC(m_profiling.m_fdcollide);
- m_sets[0].collideTTpersistentStack(m_sets[0].m_root,m_sets[1].m_root,collider);
+ m_sets[0].collideTTpersistentStack(m_sets[0].m_root, m_sets[1].m_root, collider);
}
- if(m_deferedcollide)
+ if (m_deferedcollide)
{
SPC(m_profiling.m_ddcollide);
- m_sets[0].collideTTpersistentStack(m_sets[0].m_root,m_sets[0].m_root,collider);
+ m_sets[0].collideTTpersistentStack(m_sets[0].m_root, m_sets[0].m_root, collider);
}
}
- /* clean up */
- if(m_needcleanup)
+ /* clean up */
+ if (m_needcleanup)
{
SPC(m_profiling.m_cleanup);
- btBroadphasePairArray& pairs=m_paircache->getOverlappingPairArray();
- if(pairs.size()>0)
+ btBroadphasePairArray& pairs = m_paircache->getOverlappingPairArray();
+ if (pairs.size() > 0)
{
-
- int ni=btMin(pairs.size(),btMax<int>(m_newpairs,(pairs.size()*m_cupdates)/100));
- for(int i=0;i<ni;++i)
+ int ni = btMin(pairs.size(), btMax<int>(m_newpairs, (pairs.size() * m_cupdates) / 100));
+ for (int i = 0; i < ni; ++i)
{
- btBroadphasePair& p=pairs[(m_cid+i)%pairs.size()];
- btDbvtProxy* pa=(btDbvtProxy*)p.m_pProxy0;
- btDbvtProxy* pb=(btDbvtProxy*)p.m_pProxy1;
- if(!Intersect(pa->leaf->volume,pb->leaf->volume))
+ btBroadphasePair& p = pairs[(m_cid + i) % pairs.size()];
+ btDbvtProxy* pa = (btDbvtProxy*)p.m_pProxy0;
+ btDbvtProxy* pb = (btDbvtProxy*)p.m_pProxy1;
+ if (!Intersect(pa->leaf->volume, pb->leaf->volume))
{
#if DBVT_BP_SORTPAIRS
- if(pa->m_uniqueId>pb->m_uniqueId)
- btSwap(pa,pb);
+ if (pa->m_uniqueId > pb->m_uniqueId)
+ btSwap(pa, pb);
#endif
- m_paircache->removeOverlappingPair(pa,pb,dispatcher);
- --ni;--i;
+ m_paircache->removeOverlappingPair(pa, pb, dispatcher);
+ --ni;
+ --i;
}
}
- if(pairs.size()>0) m_cid=(m_cid+ni)%pairs.size(); else m_cid=0;
+ if (pairs.size() > 0)
+ m_cid = (m_cid + ni) % pairs.size();
+ else
+ m_cid = 0;
}
}
++m_pid;
- m_newpairs=1;
- m_needcleanup=false;
- if(m_updates_call>0)
- { m_updates_ratio=m_updates_done/(btScalar)m_updates_call; }
+ m_newpairs = 1;
+ m_needcleanup = false;
+ if (m_updates_call > 0)
+ {
+ m_updates_ratio = m_updates_done / (btScalar)m_updates_call;
+ }
else
- { m_updates_ratio=0; }
- m_updates_done/=2;
- m_updates_call/=2;
+ {
+ m_updates_ratio = 0;
+ }
+ m_updates_done /= 2;
+ m_updates_call /= 2;
}
//
-void btDbvtBroadphase::optimize()
+void btDbvtBroadphase::optimize()
{
m_sets[0].optimizeTopDown();
m_sets[1].optimizeTopDown();
}
//
-btOverlappingPairCache* btDbvtBroadphase::getOverlappingPairCache()
+btOverlappingPairCache* btDbvtBroadphase::getOverlappingPairCache()
{
- return(m_paircache);
+ return (m_paircache);
}
//
-const btOverlappingPairCache* btDbvtBroadphase::getOverlappingPairCache() const
+const btOverlappingPairCache* btDbvtBroadphase::getOverlappingPairCache() const
{
- return(m_paircache);
+ return (m_paircache);
}
//
-void btDbvtBroadphase::getBroadphaseAabb(btVector3& aabbMin,btVector3& aabbMax) const
+void btDbvtBroadphase::getBroadphaseAabb(btVector3& aabbMin, btVector3& aabbMax) const
{
+ ATTRIBUTE_ALIGNED16(btDbvtVolume)
+ bounds;
- ATTRIBUTE_ALIGNED16(btDbvtVolume) bounds;
-
- if(!m_sets[0].empty())
- if(!m_sets[1].empty()) Merge( m_sets[0].m_root->volume,
- m_sets[1].m_root->volume,bounds);
+ if (!m_sets[0].empty())
+ if (!m_sets[1].empty())
+ Merge(m_sets[0].m_root->volume,
+ m_sets[1].m_root->volume, bounds);
else
- bounds=m_sets[0].m_root->volume;
- else if(!m_sets[1].empty()) bounds=m_sets[1].m_root->volume;
+ bounds = m_sets[0].m_root->volume;
+ else if (!m_sets[1].empty())
+ bounds = m_sets[1].m_root->volume;
else
- bounds=btDbvtVolume::FromCR(btVector3(0,0,0),0);
- aabbMin=bounds.Mins();
- aabbMax=bounds.Maxs();
+ bounds = btDbvtVolume::FromCR(btVector3(0, 0, 0), 0);
+ aabbMin = bounds.Mins();
+ aabbMax = bounds.Maxs();
}
void btDbvtBroadphase::resetPool(btDispatcher* dispatcher)
{
-
int totalObjects = m_sets[0].m_leaves + m_sets[1].m_leaves;
if (!totalObjects)
{
//reset internal dynamic tree data structures
m_sets[0].clear();
m_sets[1].clear();
-
- m_deferedcollide = false;
- m_needcleanup = true;
- m_stageCurrent = 0;
- m_fixedleft = 0;
- m_fupdates = 1;
- m_dupdates = 0;
- m_cupdates = 10;
- m_newpairs = 1;
- m_updates_call = 0;
- m_updates_done = 0;
- m_updates_ratio = 0;
-
- m_gid = 0;
- m_pid = 0;
- m_cid = 0;
- for(int i=0;i<=STAGECOUNT;++i)
+
+ m_deferedcollide = false;
+ m_needcleanup = true;
+ m_stageCurrent = 0;
+ m_fixedleft = 0;
+ m_fupdates = 1;
+ m_dupdates = 0;
+ m_cupdates = 10;
+ m_newpairs = 1;
+ m_updates_call = 0;
+ m_updates_done = 0;
+ m_updates_ratio = 0;
+
+ m_gid = 0;
+ m_pid = 0;
+ m_cid = 0;
+ for (int i = 0; i <= STAGECOUNT; ++i)
{
- m_stageRoots[i]=0;
+ m_stageRoots[i] = 0;
}
}
}
//
-void btDbvtBroadphase::printStats()
-{}
+void btDbvtBroadphase::printStats()
+{
+}
//
#if DBVT_BP_ENABLE_BENCHMARK
-struct btBroadphaseBenchmark
+struct btBroadphaseBenchmark
{
- struct Experiment
+ struct Experiment
{
- const char* name;
- int object_count;
- int update_count;
- int spawn_count;
- int iterations;
- btScalar speed;
- btScalar amplitude;
+ const char* name;
+ int object_count;
+ int update_count;
+ int spawn_count;
+ int iterations;
+ btScalar speed;
+ btScalar amplitude;
};
- struct Object
+ struct Object
{
- btVector3 center;
- btVector3 extents;
- btBroadphaseProxy* proxy;
- btScalar time;
- void update(btScalar speed,btScalar amplitude,btBroadphaseInterface* pbi)
+ btVector3 center;
+ btVector3 extents;
+ btBroadphaseProxy* proxy;
+ btScalar time;
+ void update(btScalar speed, btScalar amplitude, btBroadphaseInterface* pbi)
{
- time += speed;
- center[0] = btCos(time*(btScalar)2.17)*amplitude+
- btSin(time)*amplitude/2;
- center[1] = btCos(time*(btScalar)1.38)*amplitude+
- btSin(time)*amplitude;
- center[2] = btSin(time*(btScalar)0.777)*amplitude;
- pbi->setAabb(proxy,center-extents,center+extents,0);
+ time += speed;
+ center[0] = btCos(time * (btScalar)2.17) * amplitude +
+ btSin(time) * amplitude / 2;
+ center[1] = btCos(time * (btScalar)1.38) * amplitude +
+ btSin(time) * amplitude;
+ center[2] = btSin(time * (btScalar)0.777) * amplitude;
+ pbi->setAabb(proxy, center - extents, center + extents, 0);
}
};
- static int UnsignedRand(int range=RAND_MAX-1) { return(rand()%(range+1)); }
- static btScalar UnitRand() { return(UnsignedRand(16384)/(btScalar)16384); }
- static void OutputTime(const char* name,btClock& c,unsigned count=0)
+ static int UnsignedRand(int range = RAND_MAX - 1) { return (rand() % (range + 1)); }
+ static btScalar UnitRand() { return (UnsignedRand(16384) / (btScalar)16384); }
+ static void OutputTime(const char* name, btClock& c, unsigned count = 0)
{
- const unsigned long us=c.getTimeMicroseconds();
- const unsigned long ms=(us+500)/1000;
- const btScalar sec=us/(btScalar)(1000*1000);
- if(count>0)
- printf("%s : %u us (%u ms), %.2f/s\r\n",name,us,ms,count/sec);
+ const unsigned long us = c.getTimeMicroseconds();
+ const unsigned long ms = (us + 500) / 1000;
+ const btScalar sec = us / (btScalar)(1000 * 1000);
+ if (count > 0)
+ printf("%s : %u us (%u ms), %.2f/s\r\n", name, us, ms, count / sec);
else
- printf("%s : %u us (%u ms)\r\n",name,us,ms);
+ printf("%s : %u us (%u ms)\r\n", name, us, ms);
}
};
-void btDbvtBroadphase::benchmark(btBroadphaseInterface* pbi)
+void btDbvtBroadphase::benchmark(btBroadphaseInterface* pbi)
{
- static const btBroadphaseBenchmark::Experiment experiments[]=
- {
- {"1024o.10%",1024,10,0,8192,(btScalar)0.005,(btScalar)100},
- /*{"4096o.10%",4096,10,0,8192,(btScalar)0.005,(btScalar)100},
+ static const btBroadphaseBenchmark::Experiment experiments[] =
+ {
+ {"1024o.10%", 1024, 10, 0, 8192, (btScalar)0.005, (btScalar)100},
+ /*{"4096o.10%",4096,10,0,8192,(btScalar)0.005,(btScalar)100},
{"8192o.10%",8192,10,0,8192,(btScalar)0.005,(btScalar)100},*/
- };
- static const int nexperiments=sizeof(experiments)/sizeof(experiments[0]);
- btAlignedObjectArray<btBroadphaseBenchmark::Object*> objects;
- btClock wallclock;
- /* Begin */
- for(int iexp=0;iexp<nexperiments;++iexp)
+ };
+ static const int nexperiments = sizeof(experiments) / sizeof(experiments[0]);
+ btAlignedObjectArray<btBroadphaseBenchmark::Object*> objects;
+ btClock wallclock;
+ /* Begin */
+ for (int iexp = 0; iexp < nexperiments; ++iexp)
{
- const btBroadphaseBenchmark::Experiment& experiment=experiments[iexp];
- const int object_count=experiment.object_count;
- const int update_count=(object_count*experiment.update_count)/100;
- const int spawn_count=(object_count*experiment.spawn_count)/100;
- const btScalar speed=experiment.speed;
- const btScalar amplitude=experiment.amplitude;
- printf("Experiment #%u '%s':\r\n",iexp,experiment.name);
- printf("\tObjects: %u\r\n",object_count);
- printf("\tUpdate: %u\r\n",update_count);
- printf("\tSpawn: %u\r\n",spawn_count);
- printf("\tSpeed: %f\r\n",speed);
- printf("\tAmplitude: %f\r\n",amplitude);
+ const btBroadphaseBenchmark::Experiment& experiment = experiments[iexp];
+ const int object_count = experiment.object_count;
+ const int update_count = (object_count * experiment.update_count) / 100;
+ const int spawn_count = (object_count * experiment.spawn_count) / 100;
+ const btScalar speed = experiment.speed;
+ const btScalar amplitude = experiment.amplitude;
+ printf("Experiment #%u '%s':\r\n", iexp, experiment.name);
+ printf("\tObjects: %u\r\n", object_count);
+ printf("\tUpdate: %u\r\n", update_count);
+ printf("\tSpawn: %u\r\n", spawn_count);
+ printf("\tSpeed: %f\r\n", speed);
+ printf("\tAmplitude: %f\r\n", amplitude);
srand(180673);
- /* Create objects */
+ /* Create objects */
wallclock.reset();
objects.reserve(object_count);
- for(int i=0;i<object_count;++i)
+ for (int i = 0; i < object_count; ++i)
{
- btBroadphaseBenchmark::Object* po=new btBroadphaseBenchmark::Object();
- po->center[0]=btBroadphaseBenchmark::UnitRand()*50;
- po->center[1]=btBroadphaseBenchmark::UnitRand()*50;
- po->center[2]=btBroadphaseBenchmark::UnitRand()*50;
- po->extents[0]=btBroadphaseBenchmark::UnitRand()*2+2;
- po->extents[1]=btBroadphaseBenchmark::UnitRand()*2+2;
- po->extents[2]=btBroadphaseBenchmark::UnitRand()*2+2;
- po->time=btBroadphaseBenchmark::UnitRand()*2000;
- po->proxy=pbi->createProxy(po->center-po->extents,po->center+po->extents,0,po,1,1,0,0);
+ btBroadphaseBenchmark::Object* po = new btBroadphaseBenchmark::Object();
+ po->center[0] = btBroadphaseBenchmark::UnitRand() * 50;
+ po->center[1] = btBroadphaseBenchmark::UnitRand() * 50;
+ po->center[2] = btBroadphaseBenchmark::UnitRand() * 50;
+ po->extents[0] = btBroadphaseBenchmark::UnitRand() * 2 + 2;
+ po->extents[1] = btBroadphaseBenchmark::UnitRand() * 2 + 2;
+ po->extents[2] = btBroadphaseBenchmark::UnitRand() * 2 + 2;
+ po->time = btBroadphaseBenchmark::UnitRand() * 2000;
+ po->proxy = pbi->createProxy(po->center - po->extents, po->center + po->extents, 0, po, 1, 1, 0, 0);
objects.push_back(po);
}
- btBroadphaseBenchmark::OutputTime("\tInitialization",wallclock);
- /* First update */
+ btBroadphaseBenchmark::OutputTime("\tInitialization", wallclock);
+ /* First update */
wallclock.reset();
- for(int i=0;i<objects.size();++i)
+ for (int i = 0; i < objects.size(); ++i)
{
- objects[i]->update(speed,amplitude,pbi);
+ objects[i]->update(speed, amplitude, pbi);
}
- btBroadphaseBenchmark::OutputTime("\tFirst update",wallclock);
- /* Updates */
+ btBroadphaseBenchmark::OutputTime("\tFirst update", wallclock);
+ /* Updates */
wallclock.reset();
- for(int i=0;i<experiment.iterations;++i)
+ for (int i = 0; i < experiment.iterations; ++i)
{
- for(int j=0;j<update_count;++j)
- {
- objects[j]->update(speed,amplitude,pbi);
+ for (int j = 0; j < update_count; ++j)
+ {
+ objects[j]->update(speed, amplitude, pbi);
}
pbi->calculateOverlappingPairs(0);
}
- btBroadphaseBenchmark::OutputTime("\tUpdate",wallclock,experiment.iterations);
- /* Clean up */
+ btBroadphaseBenchmark::OutputTime("\tUpdate", wallclock, experiment.iterations);
+ /* Clean up */
wallclock.reset();
- for(int i=0;i<objects.size();++i)
+ for (int i = 0; i < objects.size(); ++i)
{
- pbi->destroyProxy(objects[i]->proxy,0);
+ pbi->destroyProxy(objects[i]->proxy, 0);
delete objects[i];
}
objects.resize(0);
- btBroadphaseBenchmark::OutputTime("\tRelease",wallclock);
+ btBroadphaseBenchmark::OutputTime("\tRelease", wallclock);
}
-
}
#else
-void btDbvtBroadphase::benchmark(btBroadphaseInterface*)
-{}
+void btDbvtBroadphase::benchmark(btBroadphaseInterface*)
+{
+}
#endif
#if DBVT_BP_PROFILE
-#undef SPC
+#undef SPC
#endif
-
diff --git a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDbvtBroadphase.h b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDbvtBroadphase.h
index 90b333d846..a71feef53b 100644
--- a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDbvtBroadphase.h
+++ b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDbvtBroadphase.h
@@ -24,16 +24,16 @@ subject to the following restrictions:
// Compile time config
//
-#define DBVT_BP_PROFILE 0
+#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_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
+#define DBVT_BP_PROFILING_RATE 256
#include "LinearMath/btQuickprof.h"
#endif
@@ -42,90 +42,90 @@ extern btScalar gDbvtMargin;
//
struct btDbvtProxy : btBroadphaseProxy
{
- /* Fields */
+ /* 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)
+ 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;
+ links[0] = links[1] = 0;
}
};
-typedef btAlignedObjectArray<btDbvtProxy*> btDbvtProxyArray;
+typedef btAlignedObjectArray<btDbvtProxy*> 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
+struct btDbvtBroadphase : btBroadphaseInterface
{
- /* Config */
- enum {
- DYNAMIC_SET = 0, /* Dynamic set index */
- FIXED_SET = 1, /* Fixed set index */
- STAGECOUNT = 2 /* Number of stages */
+ /* 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< btAlignedObjectArray<const btDbvtNode*> > m_rayTestStacks;
+ /* 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<btAlignedObjectArray<const btDbvtNode*> > 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;
+ 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);
+ /* 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();
+ 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)
+ void performDeferredRemoval(btDispatcher* dispatcher);
+
+ void setVelocityPrediction(btScalar prediction)
{
m_prediction = prediction;
}
@@ -134,15 +134,13 @@ struct btDbvtBroadphase : btBroadphaseInterface
return m_prediction;
}
- ///this setAabbForceUpdate is similar to setAabb but always forces the aabb update.
+ ///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*);
-
+ void setAabbForceUpdate(btBroadphaseProxy* absproxy, const btVector3& aabbMin, const btVector3& aabbMax, btDispatcher* /*dispatcher*/);
+ static void benchmark(btBroadphaseInterface*);
};
#endif
diff --git a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDispatcher.cpp b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDispatcher.cpp
index 20768225b3..d76d408aa6 100644
--- a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDispatcher.cpp
+++ b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDispatcher.cpp
@@ -17,6 +17,4 @@ subject to the following restrictions:
btDispatcher::~btDispatcher()
{
-
}
-
diff --git a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDispatcher.h b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDispatcher.h
index a0e4c18927..b09b7d4d42 100644
--- a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDispatcher.h
+++ b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btDispatcher.h
@@ -20,7 +20,7 @@ subject to the following restrictions:
class btCollisionAlgorithm;
struct btBroadphaseProxy;
class btRigidBody;
-class btCollisionObject;
+class btCollisionObject;
class btOverlappingPairCache;
struct btCollisionObjectWrapper;
@@ -35,35 +35,34 @@ struct btDispatcherInfo
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)
+ : 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;
+ 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
@@ -76,40 +75,36 @@ enum ebtDispatcherQueryType
///For example for pairwise collision detection, calculating contact points stored in btPersistentManifold or user callbacks (game logic).
class btDispatcher
{
-
-
public:
- virtual ~btDispatcher() ;
+ virtual ~btDispatcher();
- virtual btCollisionAlgorithm* findAlgorithm(const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,btPersistentManifold* sharedManifold, ebtDispatcherQueryType queryType) = 0;
+ 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 btPersistentManifold* getNewManifold(const btCollisionObject* b0, const btCollisionObject* b1) = 0;
- virtual void releaseManifold(btPersistentManifold* manifold)=0;
+ virtual void releaseManifold(btPersistentManifold* manifold) = 0;
- virtual void clearManifold(btPersistentManifold* manifold)=0;
+ virtual void clearManifold(btPersistentManifold* manifold) = 0;
- virtual bool needsCollision(const btCollisionObject* body0,const btCollisionObject* body1) = 0;
+ virtual bool needsCollision(const btCollisionObject* body0, const btCollisionObject* body1) = 0;
- virtual bool needsResponse(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 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 btPersistentManifold** getInternalManifoldPointer() = 0;
- virtual btPoolAllocator* getInternalManifoldPool() = 0;
+ virtual btPoolAllocator* getInternalManifoldPool() = 0;
- virtual const btPoolAllocator* getInternalManifoldPool() const = 0;
+ virtual const btPoolAllocator* getInternalManifoldPool() const = 0;
- virtual void* allocateCollisionAlgorithm(int size) = 0;
-
- virtual void freeCollisionAlgorithm(void* ptr) = 0;
+ virtual void* allocateCollisionAlgorithm(int size) = 0;
+ virtual void freeCollisionAlgorithm(void* ptr) = 0;
};
-
-#endif //BT_DISPATCHER_H
+#endif //BT_DISPATCHER_H
diff --git a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp
index 9e3337c5f6..8ce1087c9f 100644
--- a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp
+++ b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp
@@ -13,8 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
-
#include "btOverlappingPairCache.h"
#include "btDispatcher.h"
@@ -23,121 +21,95 @@ subject to the following restrictions:
#include <stdio.h>
-
-
-
-
-btHashedOverlappingPairCache::btHashedOverlappingPairCache():
- m_overlapFilterCallback(0),
- m_ghostPairCallback(0)
+btHashedOverlappingPairCache::btHashedOverlappingPairCache() : m_overlapFilterCallback(0),
+ m_ghostPairCallback(0)
{
- int initialAllocatedSize= 2;
+ int initialAllocatedSize = 2;
m_overlappingPairArray.reserve(initialAllocatedSize);
growTables();
}
-
-
-
btHashedOverlappingPairCache::~btHashedOverlappingPairCache()
{
}
-
-
-void btHashedOverlappingPairCache::cleanOverlappingPair(btBroadphasePair& pair,btDispatcher* dispatcher)
+void btHashedOverlappingPairCache::cleanOverlappingPair(btBroadphasePair& pair, btDispatcher* dispatcher)
{
if (pair.m_algorithm && dispatcher)
{
{
pair.m_algorithm->~btCollisionAlgorithm();
dispatcher->freeCollisionAlgorithm(pair.m_algorithm);
- pair.m_algorithm=0;
+ pair.m_algorithm = 0;
}
}
}
-
-
-
-void btHashedOverlappingPairCache::cleanProxyFromPairs(btBroadphaseProxy* proxy,btDispatcher* dispatcher)
+void btHashedOverlappingPairCache::cleanProxyFromPairs(btBroadphaseProxy* proxy, btDispatcher* dispatcher)
{
-
- class CleanPairCallback : public btOverlapCallback
+ class CleanPairCallback : public btOverlapCallback
{
btBroadphaseProxy* m_cleanProxy;
- btOverlappingPairCache* m_pairCache;
+ btOverlappingPairCache* m_pairCache;
btDispatcher* m_dispatcher;
public:
- CleanPairCallback(btBroadphaseProxy* cleanProxy,btOverlappingPairCache* pairCache,btDispatcher* dispatcher)
- :m_cleanProxy(cleanProxy),
- m_pairCache(pairCache),
- m_dispatcher(dispatcher)
+ CleanPairCallback(btBroadphaseProxy* cleanProxy, btOverlappingPairCache* pairCache, btDispatcher* dispatcher)
+ : m_cleanProxy(cleanProxy),
+ m_pairCache(pairCache),
+ m_dispatcher(dispatcher)
{
}
- virtual bool processOverlap(btBroadphasePair& pair)
+ virtual bool processOverlap(btBroadphasePair& pair)
{
if ((pair.m_pProxy0 == m_cleanProxy) ||
(pair.m_pProxy1 == m_cleanProxy))
{
- m_pairCache->cleanOverlappingPair(pair,m_dispatcher);
+ m_pairCache->cleanOverlappingPair(pair, m_dispatcher);
}
return false;
}
-
};
- CleanPairCallback cleanPairs(proxy,this,dispatcher);
-
- processAllOverlappingPairs(&cleanPairs,dispatcher);
+ CleanPairCallback cleanPairs(proxy, this, dispatcher);
+ processAllOverlappingPairs(&cleanPairs, dispatcher);
}
-
-
-
-void btHashedOverlappingPairCache::removeOverlappingPairsContainingProxy(btBroadphaseProxy* proxy,btDispatcher* dispatcher)
+void btHashedOverlappingPairCache::removeOverlappingPairsContainingProxy(btBroadphaseProxy* proxy, btDispatcher* dispatcher)
{
-
- class RemovePairCallback : public btOverlapCallback
+ class RemovePairCallback : public btOverlapCallback
{
btBroadphaseProxy* m_obsoleteProxy;
public:
RemovePairCallback(btBroadphaseProxy* obsoleteProxy)
- :m_obsoleteProxy(obsoleteProxy)
+ : m_obsoleteProxy(obsoleteProxy)
{
}
- virtual bool processOverlap(btBroadphasePair& pair)
+ virtual bool processOverlap(btBroadphasePair& pair)
{
return ((pair.m_pProxy0 == m_obsoleteProxy) ||
- (pair.m_pProxy1 == m_obsoleteProxy));
+ (pair.m_pProxy1 == m_obsoleteProxy));
}
-
};
-
RemovePairCallback removeCallback(proxy);
- processAllOverlappingPairs(&removeCallback,dispatcher);
+ processAllOverlappingPairs(&removeCallback, dispatcher);
}
-
-
-
-
btBroadphasePair* btHashedOverlappingPairCache::findPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1)
{
- if(proxy0->m_uniqueId>proxy1->m_uniqueId)
- btSwap(proxy0,proxy1);
+ if (proxy0->m_uniqueId > proxy1->m_uniqueId)
+ btSwap(proxy0, proxy1);
int proxyId1 = proxy0->getUid();
int proxyId2 = proxy1->getUid();
/*if (proxyId1 > proxyId2)
btSwap(proxyId1, proxyId2);*/
- int hash = static_cast<int>(getHash(static_cast<unsigned int>(proxyId1), static_cast<unsigned int>(proxyId2)) & (m_overlappingPairArray.capacity()-1));
+ int hash = static_cast<int>(getHash(static_cast<unsigned int>(proxyId1), static_cast<unsigned int>(proxyId2)) & (m_overlappingPairArray.capacity() - 1));
if (hash >= m_hashTable.size())
{
@@ -162,9 +134,8 @@ btBroadphasePair* btHashedOverlappingPairCache::findPair(btBroadphaseProxy* prox
//#include <stdio.h>
-void btHashedOverlappingPairCache::growTables()
+void btHashedOverlappingPairCache::growTables()
{
-
int newCapacity = m_overlappingPairArray.capacity();
if (m_hashTable.size() < newCapacity)
@@ -175,10 +146,9 @@ void btHashedOverlappingPairCache::growTables()
m_hashTable.resize(newCapacity);
m_next.resize(newCapacity);
-
int i;
- for (i= 0; i < newCapacity; ++i)
+ for (i = 0; i < newCapacity; ++i)
{
m_hashTable[i] = BT_NULL_PAIR;
}
@@ -187,35 +157,31 @@ void btHashedOverlappingPairCache::growTables()
m_next[i] = BT_NULL_PAIR;
}
- for(i=0;i<curHashtableSize;i++)
+ for (i = 0; i < curHashtableSize; i++)
{
-
const btBroadphasePair& pair = m_overlappingPairArray[i];
int proxyId1 = pair.m_pProxy0->getUid();
int proxyId2 = pair.m_pProxy1->getUid();
/*if (proxyId1 > proxyId2)
btSwap(proxyId1, proxyId2);*/
- int hashValue = static_cast<int>(getHash(static_cast<unsigned int>(proxyId1),static_cast<unsigned int>(proxyId2)) & (m_overlappingPairArray.capacity()-1)); // New hash value with new mask
+ int hashValue = static_cast<int>(getHash(static_cast<unsigned int>(proxyId1), static_cast<unsigned int>(proxyId2)) & (m_overlappingPairArray.capacity() - 1)); // New hash value with new mask
m_next[i] = m_hashTable[hashValue];
m_hashTable[hashValue] = i;
}
-
-
}
}
btBroadphasePair* btHashedOverlappingPairCache::internalAddPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1)
{
- if(proxy0->m_uniqueId>proxy1->m_uniqueId)
- btSwap(proxy0,proxy1);
+ if (proxy0->m_uniqueId > proxy1->m_uniqueId)
+ btSwap(proxy0, proxy1);
int proxyId1 = proxy0->getUid();
int proxyId2 = proxy1->getUid();
/*if (proxyId1 > proxyId2)
btSwap(proxyId1, proxyId2);*/
- int hash = static_cast<int>(getHash(static_cast<unsigned int>(proxyId1),static_cast<unsigned int>(proxyId2)) & (m_overlappingPairArray.capacity()-1)); // New hash value with new mask
-
+ int hash = static_cast<int>(getHash(static_cast<unsigned int>(proxyId1), static_cast<unsigned int>(proxyId2)) & (m_overlappingPairArray.capacity() - 1)); // New hash value with new mask
btBroadphasePair* pair = internalFindPair(proxy0, proxy1, hash);
if (pair != NULL)
@@ -237,7 +203,7 @@ btBroadphasePair* btHashedOverlappingPairCache::internalAddPair(btBroadphaseProx
//this is where we add an actual pair, so also call the 'ghost'
if (m_ghostPairCallback)
- m_ghostPairCallback->addOverlappingPair(proxy0,proxy1);
+ m_ghostPairCallback->addOverlappingPair(proxy0, proxy1);
int newCapacity = m_overlappingPairArray.capacity();
@@ -245,15 +211,14 @@ btBroadphasePair* btHashedOverlappingPairCache::internalAddPair(btBroadphaseProx
{
growTables();
//hash with new capacity
- hash = static_cast<int>(getHash(static_cast<unsigned int>(proxyId1),static_cast<unsigned int>(proxyId2)) & (m_overlappingPairArray.capacity()-1));
+ hash = static_cast<int>(getHash(static_cast<unsigned int>(proxyId1), static_cast<unsigned int>(proxyId2)) & (m_overlappingPairArray.capacity() - 1));
}
-
- pair = new (mem) btBroadphasePair(*proxy0,*proxy1);
-// pair->m_pProxy0 = proxy0;
-// pair->m_pProxy1 = proxy1;
+
+ pair = new (mem) btBroadphasePair(*proxy0, *proxy1);
+ // pair->m_pProxy0 = proxy0;
+ // pair->m_pProxy1 = proxy1;
pair->m_algorithm = 0;
pair->m_internalTmpValue = 0;
-
m_next[count] = m_hashTable[hash];
m_hashTable[hash] = count;
@@ -261,19 +226,17 @@ btBroadphasePair* btHashedOverlappingPairCache::internalAddPair(btBroadphaseProx
return pair;
}
-
-
-void* btHashedOverlappingPairCache::removeOverlappingPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1,btDispatcher* dispatcher)
+void* btHashedOverlappingPairCache::removeOverlappingPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1, btDispatcher* dispatcher)
{
- if(proxy0->m_uniqueId>proxy1->m_uniqueId)
- btSwap(proxy0,proxy1);
+ if (proxy0->m_uniqueId > proxy1->m_uniqueId)
+ btSwap(proxy0, proxy1);
int proxyId1 = proxy0->getUid();
int proxyId2 = proxy1->getUid();
/*if (proxyId1 > proxyId2)
btSwap(proxyId1, proxyId2);*/
- int hash = static_cast<int>(getHash(static_cast<unsigned int>(proxyId1),static_cast<unsigned int>(proxyId2)) & (m_overlappingPairArray.capacity()-1));
+ int hash = static_cast<int>(getHash(static_cast<unsigned int>(proxyId1), static_cast<unsigned int>(proxyId2)) & (m_overlappingPairArray.capacity() - 1));
btBroadphasePair* pair = internalFindPair(proxy0, proxy1, hash);
if (pair == NULL)
@@ -281,7 +244,7 @@ void* btHashedOverlappingPairCache::removeOverlappingPair(btBroadphaseProxy* pro
return 0;
}
- cleanOverlappingPair(*pair,dispatcher);
+ cleanOverlappingPair(*pair, dispatcher);
void* userData = pair->m_internalInfo1;
@@ -319,7 +282,7 @@ void* btHashedOverlappingPairCache::removeOverlappingPair(btBroadphaseProxy* pro
int lastPairIndex = m_overlappingPairArray.size() - 1;
if (m_ghostPairCallback)
- m_ghostPairCallback->removeOverlappingPair(proxy0, proxy1,dispatcher);
+ m_ghostPairCallback->removeOverlappingPair(proxy0, proxy1, dispatcher);
// If the removed pair is the last pair, we are done.
if (lastPairIndex == pairIndex)
@@ -330,8 +293,8 @@ void* btHashedOverlappingPairCache::removeOverlappingPair(btBroadphaseProxy* pro
// Remove the last pair from the hash table.
const btBroadphasePair* last = &m_overlappingPairArray[lastPairIndex];
- /* missing swap here too, Nat. */
- int lastHash = static_cast<int>(getHash(static_cast<unsigned int>(last->m_pProxy0->getUid()), static_cast<unsigned int>(last->m_pProxy1->getUid())) & (m_overlappingPairArray.capacity()-1));
+ /* missing swap here too, Nat. */
+ int lastHash = static_cast<int>(getHash(static_cast<unsigned int>(last->m_pProxy0->getUid()), static_cast<unsigned int>(last->m_pProxy1->getUid())) & (m_overlappingPairArray.capacity() - 1));
index = m_hashTable[lastHash];
btAssert(index != BT_NULL_PAIR);
@@ -366,20 +329,20 @@ void* btHashedOverlappingPairCache::removeOverlappingPair(btBroadphaseProxy* pro
}
//#include <stdio.h>
#include "LinearMath/btQuickprof.h"
-void btHashedOverlappingPairCache::processAllOverlappingPairs(btOverlapCallback* callback,btDispatcher* dispatcher)
+void btHashedOverlappingPairCache::processAllOverlappingPairs(btOverlapCallback* callback, btDispatcher* dispatcher)
{
BT_PROFILE("btHashedOverlappingPairCache::processAllOverlappingPairs");
int i;
-// printf("m_overlappingPairArray.size()=%d\n",m_overlappingPairArray.size());
- for (i=0;i<m_overlappingPairArray.size();)
+ // printf("m_overlappingPairArray.size()=%d\n",m_overlappingPairArray.size());
+ for (i = 0; i < m_overlappingPairArray.size();)
{
-
btBroadphasePair* pair = &m_overlappingPairArray[i];
if (callback->processOverlap(*pair))
{
- removeOverlappingPair(pair->m_pProxy0,pair->m_pProxy1,dispatcher);
- } else
+ removeOverlappingPair(pair->m_pProxy0, pair->m_pProxy1, dispatcher);
+ }
+ else
{
i++;
}
@@ -388,83 +351,83 @@ void btHashedOverlappingPairCache::processAllOverlappingPairs(btOverlapCallback*
struct MyPairIndex
{
- int m_orgIndex;
- int m_uidA0;
- int m_uidA1;
+ int m_orgIndex;
+ int m_uidA0;
+ int m_uidA1;
};
class MyPairIndeSortPredicate
{
public:
-
- bool operator() ( const MyPairIndex& a, const MyPairIndex& b ) const
- {
- const int uidA0 = a.m_uidA0;
- const int uidB0 = b.m_uidA0;
- const int uidA1 = a.m_uidA1;
- const int uidB1 = b.m_uidA1;
- return uidA0 > uidB0 || (uidA0 == uidB0 && uidA1 > uidB1);
- }
+ bool operator()(const MyPairIndex& a, const MyPairIndex& b) const
+ {
+ const int uidA0 = a.m_uidA0;
+ const int uidB0 = b.m_uidA0;
+ const int uidA1 = a.m_uidA1;
+ const int uidB1 = b.m_uidA1;
+ return uidA0 > uidB0 || (uidA0 == uidB0 && uidA1 > uidB1);
+ }
};
-void btHashedOverlappingPairCache::processAllOverlappingPairs(btOverlapCallback* callback,btDispatcher* dispatcher, const struct btDispatcherInfo& dispatchInfo)
+void btHashedOverlappingPairCache::processAllOverlappingPairs(btOverlapCallback* callback, btDispatcher* dispatcher, const struct btDispatcherInfo& dispatchInfo)
{
- if (dispatchInfo.m_deterministicOverlappingPairs)
- {
- btBroadphasePairArray& pa = getOverlappingPairArray();
- btAlignedObjectArray<MyPairIndex> indices;
- {
- BT_PROFILE("sortOverlappingPairs");
- indices.resize(pa.size());
- for (int i=0;i<indices.size();i++)
- {
- const btBroadphasePair& p = pa[i];
- const int uidA0 = p.m_pProxy0 ? p.m_pProxy0->m_uniqueId : -1;
- const int uidA1 = p.m_pProxy1 ? p.m_pProxy1->m_uniqueId : -1;
-
- indices[i].m_uidA0 = uidA0;
- indices[i].m_uidA1 = uidA1;
- indices[i].m_orgIndex = i;
- }
- indices.quickSort(MyPairIndeSortPredicate());
- }
- {
- BT_PROFILE("btHashedOverlappingPairCache::processAllOverlappingPairs");
- int i;
- for (i=0;i<indices.size();)
- {
- btBroadphasePair* pair = &pa[indices[i].m_orgIndex];
- if (callback->processOverlap(*pair))
- {
- removeOverlappingPair(pair->m_pProxy0,pair->m_pProxy1,dispatcher);
- } else
- {
- i++;
- }
- }
- }
- } else
- {
- processAllOverlappingPairs(callback, dispatcher);
- }
-}
+ if (dispatchInfo.m_deterministicOverlappingPairs)
+ {
+ btBroadphasePairArray& pa = getOverlappingPairArray();
+ btAlignedObjectArray<MyPairIndex> indices;
+ {
+ BT_PROFILE("sortOverlappingPairs");
+ indices.resize(pa.size());
+ for (int i = 0; i < indices.size(); i++)
+ {
+ const btBroadphasePair& p = pa[i];
+ const int uidA0 = p.m_pProxy0 ? p.m_pProxy0->m_uniqueId : -1;
+ const int uidA1 = p.m_pProxy1 ? p.m_pProxy1->m_uniqueId : -1;
+ indices[i].m_uidA0 = uidA0;
+ indices[i].m_uidA1 = uidA1;
+ indices[i].m_orgIndex = i;
+ }
+ indices.quickSort(MyPairIndeSortPredicate());
+ }
+ {
+ BT_PROFILE("btHashedOverlappingPairCache::processAllOverlappingPairs");
+ int i;
+ for (i = 0; i < indices.size();)
+ {
+ btBroadphasePair* pair = &pa[indices[i].m_orgIndex];
+ if (callback->processOverlap(*pair))
+ {
+ removeOverlappingPair(pair->m_pProxy0, pair->m_pProxy1, dispatcher);
+ }
+ else
+ {
+ i++;
+ }
+ }
+ }
+ }
+ else
+ {
+ processAllOverlappingPairs(callback, dispatcher);
+ }
+}
-void btHashedOverlappingPairCache::sortOverlappingPairs(btDispatcher* dispatcher)
+void btHashedOverlappingPairCache::sortOverlappingPairs(btDispatcher* dispatcher)
{
///need to keep hashmap in sync with pair address, so rebuild all
btBroadphasePairArray tmpPairs;
int i;
- for (i=0;i<m_overlappingPairArray.size();i++)
+ for (i = 0; i < m_overlappingPairArray.size(); i++)
{
tmpPairs.push_back(m_overlappingPairArray[i]);
}
- for (i=0;i<tmpPairs.size();i++)
+ for (i = 0; i < tmpPairs.size(); i++)
{
- removeOverlappingPair(tmpPairs[i].m_pProxy0,tmpPairs[i].m_pProxy1,dispatcher);
+ removeOverlappingPair(tmpPairs[i].m_pProxy0, tmpPairs[i].m_pProxy1, dispatcher);
}
-
+
for (i = 0; i < m_next.size(); i++)
{
m_next[i] = BT_NULL_PAIR;
@@ -472,31 +435,28 @@ void btHashedOverlappingPairCache::sortOverlappingPairs(btDispatcher* dispatcher
tmpPairs.quickSort(btBroadphasePairSortPredicate());
- for (i=0;i<tmpPairs.size();i++)
+ for (i = 0; i < tmpPairs.size(); i++)
{
- addOverlappingPair(tmpPairs[i].m_pProxy0,tmpPairs[i].m_pProxy1);
+ addOverlappingPair(tmpPairs[i].m_pProxy0, tmpPairs[i].m_pProxy1);
}
-
-
}
-
-void* btSortedOverlappingPairCache::removeOverlappingPair(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1, btDispatcher* dispatcher )
+void* btSortedOverlappingPairCache::removeOverlappingPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1, btDispatcher* dispatcher)
{
if (!hasDeferredRemoval())
{
- btBroadphasePair findPair(*proxy0,*proxy1);
+ btBroadphasePair findPair(*proxy0, *proxy1);
int findIndex = m_overlappingPairArray.findLinearSearch(findPair);
if (findIndex < m_overlappingPairArray.size())
{
btBroadphasePair& pair = m_overlappingPairArray[findIndex];
void* userData = pair.m_internalInfo1;
- cleanOverlappingPair(pair,dispatcher);
+ cleanOverlappingPair(pair, dispatcher);
if (m_ghostPairCallback)
- m_ghostPairCallback->removeOverlappingPair(proxy0, proxy1,dispatcher);
-
- m_overlappingPairArray.swap(findIndex,m_overlappingPairArray.capacity()-1);
+ m_ghostPairCallback->removeOverlappingPair(proxy0, proxy1, dispatcher);
+
+ m_overlappingPairArray.swap(findIndex, m_overlappingPairArray.capacity() - 1);
m_overlappingPairArray.pop_back();
return userData;
}
@@ -505,95 +465,73 @@ void* btSortedOverlappingPairCache::removeOverlappingPair(btBroadphaseProxy* pro
return 0;
}
-
-
-
-
-
-
-
-btBroadphasePair* btSortedOverlappingPairCache::addOverlappingPair(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1)
+btBroadphasePair* btSortedOverlappingPairCache::addOverlappingPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1)
{
//don't add overlap with own
btAssert(proxy0 != proxy1);
- if (!needsBroadphaseCollision(proxy0,proxy1))
+ if (!needsBroadphaseCollision(proxy0, proxy1))
return 0;
-
+
void* mem = &m_overlappingPairArray.expandNonInitializing();
- btBroadphasePair* pair = new (mem) btBroadphasePair(*proxy0,*proxy1);
+ btBroadphasePair* pair = new (mem) btBroadphasePair(*proxy0, *proxy1);
- if (m_ghostPairCallback)
+ if (m_ghostPairCallback)
m_ghostPairCallback->addOverlappingPair(proxy0, proxy1);
return pair;
-
}
///this findPair becomes really slow. Either sort the list to speedup the query, or
///use a different solution. It is mainly used for Removing overlapping pairs. Removal could be delayed.
///we could keep a linked list in each proxy, and store pair in one of the proxies (with lowest memory address)
///Also we can use a 2D bitmap, which can be useful for a future GPU implementation
- btBroadphasePair* btSortedOverlappingPairCache::findPair(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1)
+btBroadphasePair* btSortedOverlappingPairCache::findPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1)
{
- if (!needsBroadphaseCollision(proxy0,proxy1))
+ if (!needsBroadphaseCollision(proxy0, proxy1))
return 0;
- btBroadphasePair tmpPair(*proxy0,*proxy1);
+ btBroadphasePair tmpPair(*proxy0, *proxy1);
int findIndex = m_overlappingPairArray.findLinearSearch(tmpPair);
if (findIndex < m_overlappingPairArray.size())
{
//btAssert(it != m_overlappingPairSet.end());
- btBroadphasePair* pair = &m_overlappingPairArray[findIndex];
+ btBroadphasePair* pair = &m_overlappingPairArray[findIndex];
return pair;
}
return 0;
}
-
-
-
-
-
-
-
-
-
//#include <stdio.h>
-void btSortedOverlappingPairCache::processAllOverlappingPairs(btOverlapCallback* callback,btDispatcher* dispatcher)
+void btSortedOverlappingPairCache::processAllOverlappingPairs(btOverlapCallback* callback, btDispatcher* dispatcher)
{
-
int i;
- for (i=0;i<m_overlappingPairArray.size();)
+ for (i = 0; i < m_overlappingPairArray.size();)
{
-
btBroadphasePair* pair = &m_overlappingPairArray[i];
if (callback->processOverlap(*pair))
{
- cleanOverlappingPair(*pair,dispatcher);
+ cleanOverlappingPair(*pair, dispatcher);
pair->m_pProxy0 = 0;
pair->m_pProxy1 = 0;
- m_overlappingPairArray.swap(i,m_overlappingPairArray.size()-1);
+ m_overlappingPairArray.swap(i, m_overlappingPairArray.size() - 1);
m_overlappingPairArray.pop_back();
- } else
+ }
+ else
{
i++;
}
}
}
-
-
-
-btSortedOverlappingPairCache::btSortedOverlappingPairCache():
- m_blockedForChanges(false),
- m_hasDeferredRemoval(true),
- m_overlapFilterCallback(0),
- m_ghostPairCallback(0)
+btSortedOverlappingPairCache::btSortedOverlappingPairCache() : m_blockedForChanges(false),
+ m_hasDeferredRemoval(true),
+ m_overlapFilterCallback(0),
+ m_ghostPairCallback(0)
{
- int initialAllocatedSize= 2;
+ int initialAllocatedSize = 2;
m_overlappingPairArray.reserve(initialAllocatedSize);
}
@@ -601,81 +539,73 @@ btSortedOverlappingPairCache::~btSortedOverlappingPairCache()
{
}
-void btSortedOverlappingPairCache::cleanOverlappingPair(btBroadphasePair& pair,btDispatcher* dispatcher)
+void btSortedOverlappingPairCache::cleanOverlappingPair(btBroadphasePair& pair, btDispatcher* dispatcher)
{
if (pair.m_algorithm)
{
{
pair.m_algorithm->~btCollisionAlgorithm();
dispatcher->freeCollisionAlgorithm(pair.m_algorithm);
- pair.m_algorithm=0;
+ pair.m_algorithm = 0;
}
}
}
-
-void btSortedOverlappingPairCache::cleanProxyFromPairs(btBroadphaseProxy* proxy,btDispatcher* dispatcher)
+void btSortedOverlappingPairCache::cleanProxyFromPairs(btBroadphaseProxy* proxy, btDispatcher* dispatcher)
{
-
- class CleanPairCallback : public btOverlapCallback
+ class CleanPairCallback : public btOverlapCallback
{
btBroadphaseProxy* m_cleanProxy;
- btOverlappingPairCache* m_pairCache;
+ btOverlappingPairCache* m_pairCache;
btDispatcher* m_dispatcher;
public:
- CleanPairCallback(btBroadphaseProxy* cleanProxy,btOverlappingPairCache* pairCache,btDispatcher* dispatcher)
- :m_cleanProxy(cleanProxy),
- m_pairCache(pairCache),
- m_dispatcher(dispatcher)
+ CleanPairCallback(btBroadphaseProxy* cleanProxy, btOverlappingPairCache* pairCache, btDispatcher* dispatcher)
+ : m_cleanProxy(cleanProxy),
+ m_pairCache(pairCache),
+ m_dispatcher(dispatcher)
{
}
- virtual bool processOverlap(btBroadphasePair& pair)
+ virtual bool processOverlap(btBroadphasePair& pair)
{
if ((pair.m_pProxy0 == m_cleanProxy) ||
(pair.m_pProxy1 == m_cleanProxy))
{
- m_pairCache->cleanOverlappingPair(pair,m_dispatcher);
+ m_pairCache->cleanOverlappingPair(pair, m_dispatcher);
}
return false;
}
-
};
- CleanPairCallback cleanPairs(proxy,this,dispatcher);
-
- processAllOverlappingPairs(&cleanPairs,dispatcher);
+ CleanPairCallback cleanPairs(proxy, this, dispatcher);
+ processAllOverlappingPairs(&cleanPairs, dispatcher);
}
-
-void btSortedOverlappingPairCache::removeOverlappingPairsContainingProxy(btBroadphaseProxy* proxy,btDispatcher* dispatcher)
+void btSortedOverlappingPairCache::removeOverlappingPairsContainingProxy(btBroadphaseProxy* proxy, btDispatcher* dispatcher)
{
-
- class RemovePairCallback : public btOverlapCallback
+ class RemovePairCallback : public btOverlapCallback
{
btBroadphaseProxy* m_obsoleteProxy;
public:
RemovePairCallback(btBroadphaseProxy* obsoleteProxy)
- :m_obsoleteProxy(obsoleteProxy)
+ : m_obsoleteProxy(obsoleteProxy)
{
}
- virtual bool processOverlap(btBroadphasePair& pair)
+ virtual bool processOverlap(btBroadphasePair& pair)
{
return ((pair.m_pProxy0 == m_obsoleteProxy) ||
- (pair.m_pProxy1 == m_obsoleteProxy));
+ (pair.m_pProxy1 == m_obsoleteProxy));
}
-
};
RemovePairCallback removeCallback(proxy);
- processAllOverlappingPairs(&removeCallback,dispatcher);
+ processAllOverlappingPairs(&removeCallback, dispatcher);
}
-void btSortedOverlappingPairCache::sortOverlappingPairs(btDispatcher* dispatcher)
+void btSortedOverlappingPairCache::sortOverlappingPairs(btDispatcher* dispatcher)
{
//should already be sorted
}
-
diff --git a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h
index 7a38d34f05..a85782bc8a 100644
--- a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h
+++ b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h
@@ -16,7 +16,6 @@ subject to the following restrictions:
#ifndef BT_OVERLAPPING_PAIR_CACHE_H
#define BT_OVERLAPPING_PAIR_CACHE_H
-
#include "btBroadphaseInterface.h"
#include "btBroadphaseProxy.h"
#include "btOverlappingPairCallback.h"
@@ -24,177 +23,163 @@ subject to the following restrictions:
#include "LinearMath/btAlignedObjectArray.h"
class btDispatcher;
-typedef btAlignedObjectArray<btBroadphasePair> btBroadphasePairArray;
+typedef btAlignedObjectArray<btBroadphasePair> btBroadphasePairArray;
-struct btOverlapCallback
+struct btOverlapCallback
{
virtual ~btOverlapCallback()
- {}
+ {
+ }
//return true for deletion of the pair
- virtual bool processOverlap(btBroadphasePair& pair) = 0;
-
+ 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;
+ virtual bool needBroadphaseCollision(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1) const = 0;
};
-
-
-
-
-
-
-const int BT_NULL_PAIR=0xffffffff;
+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 ~btOverlappingPairCache() {} // this is needed so we can get to the derived class destructor
+
+ virtual btBroadphasePair* getOverlappingPairArrayPtr() = 0;
- virtual btBroadphasePair* getOverlappingPairArrayPtr() = 0;
-
- virtual const btBroadphasePair* getOverlappingPairArrayPtr() const = 0;
+ virtual const btBroadphasePair* getOverlappingPairArrayPtr() const = 0;
- virtual btBroadphasePairArray& getOverlappingPairArray() = 0;
+ virtual btBroadphasePairArray& getOverlappingPairArray() = 0;
- virtual void cleanOverlappingPair(btBroadphasePair& pair,btDispatcher* dispatcher) = 0;
+ virtual void cleanOverlappingPair(btBroadphasePair& pair, btDispatcher* dispatcher) = 0;
virtual int getNumOverlappingPairs() const = 0;
- virtual void cleanProxyFromPairs(btBroadphaseProxy* proxy,btDispatcher* dispatcher) = 0;
+ virtual void cleanProxyFromPairs(btBroadphaseProxy* proxy, btDispatcher* dispatcher) = 0;
- virtual void setOverlapFilterCallback(btOverlapFilterCallback* callback) = 0;
+ virtual void setOverlapFilterCallback(btOverlapFilterCallback* callback) = 0;
- virtual void processAllOverlappingPairs(btOverlapCallback*,btDispatcher* dispatcher) = 0;
+ virtual void processAllOverlappingPairs(btOverlapCallback*, btDispatcher* dispatcher) = 0;
- virtual void processAllOverlappingPairs(btOverlapCallback* callback,btDispatcher* dispatcher, const struct btDispatcherInfo& dispatchInfo)
+ 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;
+ 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
+ATTRIBUTE_ALIGNED16(class)
+btHashedOverlappingPairCache : public btOverlappingPairCache
{
- btBroadphasePairArray m_overlappingPairArray;
+ btBroadphasePairArray m_overlappingPairArray;
btOverlapFilterCallback* m_overlapFilterCallback;
protected:
-
- btAlignedObjectArray<int> m_hashTable;
- btAlignedObjectArray<int> m_next;
- btOverlappingPairCallback* m_ghostPairCallback;
-
+ btAlignedObjectArray<int> m_hashTable;
+ btAlignedObjectArray<int> m_next;
+ btOverlappingPairCallback* m_ghostPairCallback;
public:
BT_DECLARE_ALIGNED_ALLOCATOR();
-
+
btHashedOverlappingPairCache();
virtual ~btHashedOverlappingPairCache();
-
- void removeOverlappingPairsContainingProxy(btBroadphaseProxy* proxy,btDispatcher* dispatcher);
+ void removeOverlappingPairsContainingProxy(btBroadphaseProxy * proxy, btDispatcher * dispatcher);
+
+ virtual void* removeOverlappingPair(btBroadphaseProxy * proxy0, btBroadphaseProxy * proxy1, btDispatcher * dispatcher);
- virtual void* removeOverlappingPair(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1,btDispatcher* dispatcher);
-
- SIMD_FORCE_INLINE bool needsBroadphaseCollision(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1) const
+ SIMD_FORCE_INLINE bool needsBroadphaseCollision(btBroadphaseProxy * proxy0, btBroadphaseProxy * proxy1) const
{
if (m_overlapFilterCallback)
- return m_overlapFilterCallback->needBroadphaseCollision(proxy0,proxy1);
+ 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)
+ virtual btBroadphasePair* addOverlappingPair(btBroadphaseProxy * proxy0, btBroadphaseProxy * proxy1)
{
- if (!needsBroadphaseCollision(proxy0,proxy1))
+ if (!needsBroadphaseCollision(proxy0, proxy1))
return 0;
- return internalAddPair(proxy0,proxy1);
+ return internalAddPair(proxy0, proxy1);
}
-
-
- void cleanProxyFromPairs(btBroadphaseProxy* proxy,btDispatcher* dispatcher);
+ void cleanProxyFromPairs(btBroadphaseProxy * proxy, btDispatcher * dispatcher);
-
- virtual void processAllOverlappingPairs(btOverlapCallback*,btDispatcher* dispatcher);
+ virtual void processAllOverlappingPairs(btOverlapCallback*, btDispatcher * dispatcher);
- virtual void processAllOverlappingPairs(btOverlapCallback* callback,btDispatcher* dispatcher, const struct btDispatcherInfo& dispatchInfo);
+ virtual void processAllOverlappingPairs(btOverlapCallback * callback, btDispatcher * dispatcher, const struct btDispatcherInfo& dispatchInfo);
- virtual btBroadphasePair* getOverlappingPairArrayPtr()
+ virtual btBroadphasePair* getOverlappingPairArrayPtr()
{
return &m_overlappingPairArray[0];
}
- const btBroadphasePair* getOverlappingPairArrayPtr() const
+ const btBroadphasePair* getOverlappingPairArrayPtr() const
{
return &m_overlappingPairArray[0];
}
- btBroadphasePairArray& getOverlappingPairArray()
+ btBroadphasePairArray& getOverlappingPairArray()
{
return m_overlappingPairArray;
}
- const btBroadphasePairArray& getOverlappingPairArray() const
+ const btBroadphasePairArray& getOverlappingPairArray() const
{
return m_overlappingPairArray;
}
- void cleanOverlappingPair(btBroadphasePair& pair,btDispatcher* dispatcher);
-
+ void cleanOverlappingPair(btBroadphasePair & pair, btDispatcher * dispatcher);
-
- btBroadphasePair* findPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1);
+ btBroadphasePair* findPair(btBroadphaseProxy * proxy0, btBroadphaseProxy * proxy1);
int GetCount() const { return m_overlappingPairArray.size(); }
-// btBroadphasePair* GetPairs() { return m_pairs; }
+ // btBroadphasePair* GetPairs() { return m_pairs; }
btOverlapFilterCallback* getOverlapFilterCallback()
{
return m_overlapFilterCallback;
}
- void setOverlapFilterCallback(btOverlapFilterCallback* callback)
+ void setOverlapFilterCallback(btOverlapFilterCallback * callback)
{
m_overlapFilterCallback = callback;
}
- int getNumOverlappingPairs() const
+ int getNumOverlappingPairs() const
{
return m_overlappingPairArray.size();
}
+
private:
-
- btBroadphasePair* internalAddPair(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1);
+ btBroadphasePair* internalAddPair(btBroadphaseProxy * proxy0, btBroadphaseProxy * proxy1);
- void growTables();
+ 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;
}
@@ -214,40 +199,37 @@ private:
}
*/
-
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 >> 10);
+ key += (key << 3);
+ key ^= (key >> 6);
key += ~(key << 11);
- key ^= (key >> 16);
+ key ^= (key >> 16);
return key;
}
-
-
- SIMD_FORCE_INLINE btBroadphasePair* internalFindPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1, int hash)
+ 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 0 // wrong, 'equalsPair' use unsorted uids, copy-past devil striked again. Nat.
if (proxyId1 > proxyId2)
btSwap(proxyId1, proxyId2);
- #endif
+#endif
int index = m_hashTable[hash];
-
- while( index != BT_NULL_PAIR && equalsPair(m_overlappingPairArray[index], proxyId1, proxyId2) == false)
+
+ while (index != BT_NULL_PAIR && equalsPair(m_overlappingPairArray[index], proxyId1, proxyId2) == false)
{
index = m_next[index];
}
- if ( index == BT_NULL_PAIR )
+ if (index == BT_NULL_PAIR)
{
return NULL;
}
@@ -257,155 +239,136 @@ private:
return &m_overlappingPairArray[index];
}
- virtual bool hasDeferredRemoval()
+ virtual bool hasDeferredRemoval()
{
return false;
}
- virtual void setInternalGhostPairCallback(btOverlappingPairCallback* ghostPairCallback)
+ virtual void setInternalGhostPairCallback(btOverlappingPairCallback * ghostPairCallback)
{
m_ghostPairCallback = ghostPairCallback;
}
- virtual void sortOverlappingPairs(btDispatcher* dispatcher);
-
-
-
+ virtual void sortOverlappingPairs(btDispatcher * dispatcher);
};
-
-
-
///btSortedOverlappingPairCache maintains the objects with overlapping AABB
///Typically managed by the Broadphase, Axis3Sweep or btSimpleBroadphase
-class btSortedOverlappingPairCache : public btOverlappingPairCache
+class btSortedOverlappingPairCache : public btOverlappingPairCache
{
- protected:
- //avoid brute-force finding all the time
- btBroadphasePairArray m_overlappingPairArray;
+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;
+ //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;
+ ///by default, do the removal during the pair traversal
+ bool m_hasDeferredRemoval;
- btOverlappingPairCallback* m_ghostPairCallback;
+ //if set, use the callback instead of the built in filter in needBroadphaseCollision
+ btOverlapFilterCallback* m_overlapFilterCallback;
- public:
-
- btSortedOverlappingPairCache();
- virtual ~btSortedOverlappingPairCache();
+ btOverlappingPairCallback* m_ghostPairCallback;
- virtual void processAllOverlappingPairs(btOverlapCallback*,btDispatcher* dispatcher);
+public:
+ btSortedOverlappingPairCache();
+ virtual ~btSortedOverlappingPairCache();
- void* removeOverlappingPair(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1,btDispatcher* dispatcher);
+ virtual void processAllOverlappingPairs(btOverlapCallback*, btDispatcher* dispatcher);
- void cleanOverlappingPair(btBroadphasePair& pair,btDispatcher* dispatcher);
-
- btBroadphasePair* addOverlappingPair(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1);
+ void* removeOverlappingPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1, btDispatcher* dispatcher);
- btBroadphasePair* findPair(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1);
-
-
- void cleanProxyFromPairs(btBroadphaseProxy* proxy,btDispatcher* dispatcher);
+ void cleanOverlappingPair(btBroadphasePair& pair, btDispatcher* dispatcher);
- void removeOverlappingPairsContainingProxy(btBroadphaseProxy* proxy,btDispatcher* dispatcher);
+ btBroadphasePair* addOverlappingPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1);
+ btBroadphasePair* findPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1);
- inline bool needsBroadphaseCollision(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1) const
- {
- if (m_overlapFilterCallback)
- return m_overlapFilterCallback->needBroadphaseCollision(proxy0,proxy1);
+ void cleanProxyFromPairs(btBroadphaseProxy* proxy, btDispatcher* dispatcher);
- bool collides = (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0;
- collides = collides && (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask);
-
- return collides;
- }
-
- btBroadphasePairArray& getOverlappingPairArray()
- {
- return m_overlappingPairArray;
- }
+ void removeOverlappingPairsContainingProxy(btBroadphaseProxy* proxy, btDispatcher* dispatcher);
- const btBroadphasePairArray& getOverlappingPairArray() const
- {
- return m_overlappingPairArray;
- }
+ 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;
+ }
- btBroadphasePair* getOverlappingPairArrayPtr()
- {
- return &m_overlappingPairArray[0];
- }
+ btBroadphasePairArray& getOverlappingPairArray()
+ {
+ return m_overlappingPairArray;
+ }
- const btBroadphasePair* getOverlappingPairArrayPtr() const
- {
- return &m_overlappingPairArray[0];
- }
+ const btBroadphasePairArray& getOverlappingPairArray() const
+ {
+ return m_overlappingPairArray;
+ }
- int getNumOverlappingPairs() const
- {
- return m_overlappingPairArray.size();
- }
-
- btOverlapFilterCallback* getOverlapFilterCallback()
- {
- return m_overlapFilterCallback;
- }
+ btBroadphasePair* getOverlappingPairArrayPtr()
+ {
+ return &m_overlappingPairArray[0];
+ }
- void setOverlapFilterCallback(btOverlapFilterCallback* callback)
- {
- m_overlapFilterCallback = callback;
- }
+ const btBroadphasePair* getOverlappingPairArrayPtr() const
+ {
+ return &m_overlappingPairArray[0];
+ }
- virtual bool hasDeferredRemoval()
- {
- return m_hasDeferredRemoval;
- }
+ int getNumOverlappingPairs() const
+ {
+ return m_overlappingPairArray.size();
+ }
- virtual void setInternalGhostPairCallback(btOverlappingPairCallback* ghostPairCallback)
- {
- m_ghostPairCallback = ghostPairCallback;
- }
+ btOverlapFilterCallback* getOverlapFilterCallback()
+ {
+ return m_overlapFilterCallback;
+ }
- virtual void sortOverlappingPairs(btDispatcher* dispatcher);
-
+ 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;
+ btBroadphasePairArray m_overlappingPairArray;
public:
-
- virtual btBroadphasePair* getOverlappingPairArrayPtr()
+ virtual btBroadphasePair* getOverlappingPairArrayPtr()
{
return &m_overlappingPairArray[0];
}
- const btBroadphasePair* getOverlappingPairArrayPtr() const
+ const btBroadphasePair* getOverlappingPairArrayPtr() const
{
return &m_overlappingPairArray[0];
}
- btBroadphasePairArray& getOverlappingPairArray()
+ btBroadphasePairArray& getOverlappingPairArray()
{
return m_overlappingPairArray;
}
-
- virtual void cleanOverlappingPair(btBroadphasePair& /*pair*/,btDispatcher* /*dispatcher*/)
- {
+ virtual void cleanOverlappingPair(btBroadphasePair& /*pair*/, btDispatcher* /*dispatcher*/)
+ {
}
virtual int getNumOverlappingPairs() const
@@ -413,16 +376,15 @@ public:
return 0;
}
- virtual void cleanProxyFromPairs(btBroadphaseProxy* /*proxy*/,btDispatcher* /*dispatcher*/)
+ virtual void cleanProxyFromPairs(btBroadphaseProxy* /*proxy*/, btDispatcher* /*dispatcher*/)
{
-
}
- virtual void setOverlapFilterCallback(btOverlapFilterCallback* /*callback*/)
+ virtual void setOverlapFilterCallback(btOverlapFilterCallback* /*callback*/)
{
}
- virtual void processAllOverlappingPairs(btOverlapCallback*,btDispatcher* /*dispatcher*/)
+ virtual void processAllOverlappingPairs(btOverlapCallback*, btDispatcher* /*dispatcher*/)
{
}
@@ -431,39 +393,33 @@ public:
return 0;
}
- virtual bool hasDeferredRemoval()
+ virtual bool hasDeferredRemoval()
{
return true;
}
- virtual void setInternalGhostPairCallback(btOverlappingPairCallback* /* ghostPairCallback */)
+ virtual void setInternalGhostPairCallback(btOverlappingPairCallback* /* ghostPairCallback */)
{
-
}
- virtual btBroadphasePair* addOverlappingPair(btBroadphaseProxy* /*proxy0*/,btBroadphaseProxy* /*proxy1*/)
+ virtual btBroadphasePair* addOverlappingPair(btBroadphaseProxy* /*proxy0*/, btBroadphaseProxy* /*proxy1*/)
{
return 0;
}
- virtual void* removeOverlappingPair(btBroadphaseProxy* /*proxy0*/,btBroadphaseProxy* /*proxy1*/,btDispatcher* /*dispatcher*/)
+ virtual void* removeOverlappingPair(btBroadphaseProxy* /*proxy0*/, btBroadphaseProxy* /*proxy1*/, btDispatcher* /*dispatcher*/)
{
return 0;
}
- virtual void removeOverlappingPairsContainingProxy(btBroadphaseProxy* /*proxy0*/,btDispatcher* /*dispatcher*/)
+ virtual void removeOverlappingPairsContainingProxy(btBroadphaseProxy* /*proxy0*/, btDispatcher* /*dispatcher*/)
{
}
-
- virtual void sortOverlappingPairs(btDispatcher* dispatcher)
+
+ virtual void sortOverlappingPairs(btDispatcher* dispatcher)
{
- (void) dispatcher;
+ (void)dispatcher;
}
-
-
};
-
-#endif //BT_OVERLAPPING_PAIR_CACHE_H
-
-
+#endif //BT_OVERLAPPING_PAIR_CACHE_H
diff --git a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCallback.h b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCallback.h
index 3e069fa5e2..d16c72542f 100644
--- a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCallback.h
+++ b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCallback.h
@@ -18,26 +18,24 @@ subject to the following restrictions:
#define OVERLAPPING_PAIR_CALLBACK_H
class btDispatcher;
-struct btBroadphasePair;
+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() {}
-
+ btOverlappingPairCallback() {}
+
public:
virtual ~btOverlappingPairCallback()
{
-
}
-
- virtual btBroadphasePair* addOverlappingPair(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1) = 0;
- virtual void* removeOverlappingPair(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1,btDispatcher* dispatcher) = 0;
+ virtual btBroadphasePair* addOverlappingPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1) = 0;
- virtual void removeOverlappingPairsContainingProxy(btBroadphaseProxy* proxy0,btDispatcher* dispatcher) = 0;
+ virtual void* removeOverlappingPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1, btDispatcher* dispatcher) = 0;
+ virtual void removeOverlappingPairsContainingProxy(btBroadphaseProxy* proxy0, btDispatcher* dispatcher) = 0;
};
-#endif //OVERLAPPING_PAIR_CALLBACK_H
+#endif //OVERLAPPING_PAIR_CALLBACK_H
diff --git a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btQuantizedBvh.cpp b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btQuantizedBvh.cpp
index 875d89c53e..b814fd84d8 100644
--- a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btQuantizedBvh.cpp
+++ b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btQuantizedBvh.cpp
@@ -21,43 +21,38 @@ subject to the following restrictions:
#define RAYAABB2
-btQuantizedBvh::btQuantizedBvh() :
- m_bulletVersion(BT_BULLET_VERSION),
- m_useQuantization(false),
- //m_traversalMode(TRAVERSAL_STACKLESS_CACHE_FRIENDLY)
- m_traversalMode(TRAVERSAL_STACKLESS)
- //m_traversalMode(TRAVERSAL_RECURSIVE)
- ,m_subtreeHeaderCount(0) //PCK: add this line
+btQuantizedBvh::btQuantizedBvh() : m_bulletVersion(BT_BULLET_VERSION),
+ m_useQuantization(false),
+ //m_traversalMode(TRAVERSAL_STACKLESS_CACHE_FRIENDLY)
+ m_traversalMode(TRAVERSAL_STACKLESS)
+ //m_traversalMode(TRAVERSAL_RECURSIVE)
+ ,
+ m_subtreeHeaderCount(0) //PCK: add this line
{
- m_bvhAabbMin.setValue(-SIMD_INFINITY,-SIMD_INFINITY,-SIMD_INFINITY);
- m_bvhAabbMax.setValue(SIMD_INFINITY,SIMD_INFINITY,SIMD_INFINITY);
+ m_bvhAabbMin.setValue(-SIMD_INFINITY, -SIMD_INFINITY, -SIMD_INFINITY);
+ m_bvhAabbMax.setValue(SIMD_INFINITY, SIMD_INFINITY, SIMD_INFINITY);
}
-
-
-
-
void btQuantizedBvh::buildInternal()
{
///assumes that caller filled in the m_quantizedLeafNodes
m_useQuantization = true;
int numLeafNodes = 0;
-
+
if (m_useQuantization)
{
//now we have an array of leafnodes in m_leafNodes
numLeafNodes = m_quantizedLeafNodes.size();
- m_quantizedContiguousNodes.resize(2*numLeafNodes);
-
+ m_quantizedContiguousNodes.resize(2 * numLeafNodes);
}
m_curNodeIndex = 0;
- buildTree(0,numLeafNodes);
+ buildTree(0, numLeafNodes);
///if the entire tree is small then subtree size, we need to create a header info for the tree
- if(m_useQuantization && !m_SubtreeHeaders.size())
+ if (m_useQuantization && !m_SubtreeHeaders.size())
{
btBvhSubtreeInfo& subtree = m_SubtreeHeaders.expand();
subtree.setAabbFromQuantizeNode(m_quantizedContiguousNodes[0]);
@@ -73,29 +68,24 @@ void btQuantizedBvh::buildInternal()
m_leafNodes.clear();
}
-
-
///just for debugging, to visualize the individual patches/subtrees
#ifdef DEBUG_PATCH_COLORS
-btVector3 color[4]=
-{
- btVector3(1,0,0),
- btVector3(0,1,0),
- btVector3(0,0,1),
- btVector3(0,1,1)
-};
-#endif //DEBUG_PATCH_COLORS
-
-
+btVector3 color[4] =
+ {
+ btVector3(1, 0, 0),
+ btVector3(0, 1, 0),
+ btVector3(0, 0, 1),
+ btVector3(0, 1, 1)};
+#endif //DEBUG_PATCH_COLORS
-void btQuantizedBvh::setQuantizationValues(const btVector3& bvhAabbMin,const btVector3& bvhAabbMax,btScalar quantizationMargin)
+void btQuantizedBvh::setQuantizationValues(const btVector3& bvhAabbMin, const btVector3& bvhAabbMax, btScalar quantizationMargin)
{
//enlarge the AABB to avoid division by zero when initializing the quantization values
- btVector3 clampValue(quantizationMargin,quantizationMargin,quantizationMargin);
+ btVector3 clampValue(quantizationMargin, quantizationMargin, quantizationMargin);
m_bvhAabbMin = bvhAabbMin - clampValue;
m_bvhAabbMax = bvhAabbMax + clampValue;
btVector3 aabbSize = m_bvhAabbMax - m_bvhAabbMin;
- m_bvhQuantization = btVector3(btScalar(65533.0),btScalar(65533.0),btScalar(65533.0)) / aabbSize;
+ m_bvhQuantization = btVector3(btScalar(65533.0), btScalar(65533.0), btScalar(65533.0)) / aabbSize;
m_useQuantization = true;
@@ -103,25 +93,22 @@ void btQuantizedBvh::setQuantizationValues(const btVector3& bvhAabbMin,const btV
unsigned short vecIn[3];
btVector3 v;
{
- quantize(vecIn,m_bvhAabbMin,false);
+ quantize(vecIn, m_bvhAabbMin, false);
v = unQuantize(vecIn);
- m_bvhAabbMin.setMin(v-clampValue);
+ m_bvhAabbMin.setMin(v - clampValue);
}
- aabbSize = m_bvhAabbMax - m_bvhAabbMin;
- m_bvhQuantization = btVector3(btScalar(65533.0),btScalar(65533.0),btScalar(65533.0)) / aabbSize;
+ aabbSize = m_bvhAabbMax - m_bvhAabbMin;
+ m_bvhQuantization = btVector3(btScalar(65533.0), btScalar(65533.0), btScalar(65533.0)) / aabbSize;
{
- quantize(vecIn,m_bvhAabbMax,true);
+ quantize(vecIn, m_bvhAabbMax, true);
v = unQuantize(vecIn);
- m_bvhAabbMax.setMax(v+clampValue);
+ m_bvhAabbMax.setMax(v + clampValue);
}
aabbSize = m_bvhAabbMax - m_bvhAabbMin;
- m_bvhQuantization = btVector3(btScalar(65533.0),btScalar(65533.0),btScalar(65533.0)) / aabbSize;
+ m_bvhQuantization = btVector3(btScalar(65533.0), btScalar(65533.0), btScalar(65533.0)) / aabbSize;
}
}
-
-
-
btQuantizedBvh::~btQuantizedBvh()
{
}
@@ -129,104 +116,100 @@ btQuantizedBvh::~btQuantizedBvh()
#ifdef DEBUG_TREE_BUILDING
int gStackDepth = 0;
int gMaxStackDepth = 0;
-#endif //DEBUG_TREE_BUILDING
+#endif //DEBUG_TREE_BUILDING
-void btQuantizedBvh::buildTree (int startIndex,int endIndex)
+void btQuantizedBvh::buildTree(int startIndex, int endIndex)
{
#ifdef DEBUG_TREE_BUILDING
gStackDepth++;
if (gStackDepth > gMaxStackDepth)
gMaxStackDepth = gStackDepth;
-#endif //DEBUG_TREE_BUILDING
-
+#endif //DEBUG_TREE_BUILDING
int splitAxis, splitIndex, i;
- int numIndices =endIndex-startIndex;
+ int numIndices = endIndex - startIndex;
int curIndex = m_curNodeIndex;
- btAssert(numIndices>0);
+ btAssert(numIndices > 0);
- if (numIndices==1)
+ if (numIndices == 1)
{
#ifdef DEBUG_TREE_BUILDING
gStackDepth--;
-#endif //DEBUG_TREE_BUILDING
-
- assignInternalNodeFromLeafNode(m_curNodeIndex,startIndex);
+#endif //DEBUG_TREE_BUILDING
+
+ assignInternalNodeFromLeafNode(m_curNodeIndex, startIndex);
m_curNodeIndex++;
- return;
+ return;
}
//calculate Best Splitting Axis and where to split it. Sort the incoming 'leafNodes' array within range 'startIndex/endIndex'.
-
- splitAxis = calcSplittingAxis(startIndex,endIndex);
- splitIndex = sortAndCalcSplittingIndex(startIndex,endIndex,splitAxis);
+ splitAxis = calcSplittingAxis(startIndex, endIndex);
+
+ splitIndex = sortAndCalcSplittingIndex(startIndex, endIndex, splitAxis);
int internalNodeIndex = m_curNodeIndex;
-
+
//set the min aabb to 'inf' or a max value, and set the max aabb to a -inf/minimum value.
//the aabb will be expanded during buildTree/mergeInternalNodeAabb with actual node values
- setInternalNodeAabbMin(m_curNodeIndex,m_bvhAabbMax);//can't use btVector3(SIMD_INFINITY,SIMD_INFINITY,SIMD_INFINITY)) because of quantization
- setInternalNodeAabbMax(m_curNodeIndex,m_bvhAabbMin);//can't use btVector3(-SIMD_INFINITY,-SIMD_INFINITY,-SIMD_INFINITY)) because of quantization
-
-
- for (i=startIndex;i<endIndex;i++)
+ setInternalNodeAabbMin(m_curNodeIndex, m_bvhAabbMax); //can't use btVector3(SIMD_INFINITY,SIMD_INFINITY,SIMD_INFINITY)) because of quantization
+ setInternalNodeAabbMax(m_curNodeIndex, m_bvhAabbMin); //can't use btVector3(-SIMD_INFINITY,-SIMD_INFINITY,-SIMD_INFINITY)) because of quantization
+
+ for (i = startIndex; i < endIndex; i++)
{
- mergeInternalNodeAabb(m_curNodeIndex,getAabbMin(i),getAabbMax(i));
+ mergeInternalNodeAabb(m_curNodeIndex, getAabbMin(i), getAabbMax(i));
}
m_curNodeIndex++;
-
//internalNode->m_escapeIndex;
-
+
int leftChildNodexIndex = m_curNodeIndex;
//build left child tree
- buildTree(startIndex,splitIndex);
+ buildTree(startIndex, splitIndex);
int rightChildNodexIndex = m_curNodeIndex;
//build right child tree
- buildTree(splitIndex,endIndex);
+ buildTree(splitIndex, endIndex);
#ifdef DEBUG_TREE_BUILDING
gStackDepth--;
-#endif //DEBUG_TREE_BUILDING
+#endif //DEBUG_TREE_BUILDING
int escapeIndex = m_curNodeIndex - curIndex;
if (m_useQuantization)
{
//escapeIndex is the number of nodes of this subtree
- const int sizeQuantizedNode =sizeof(btQuantizedBvhNode);
+ const int sizeQuantizedNode = sizeof(btQuantizedBvhNode);
const int treeSizeInBytes = escapeIndex * sizeQuantizedNode;
if (treeSizeInBytes > MAX_SUBTREE_SIZE_IN_BYTES)
{
- updateSubtreeHeaders(leftChildNodexIndex,rightChildNodexIndex);
+ updateSubtreeHeaders(leftChildNodexIndex, rightChildNodexIndex);
}
- } else
+ }
+ else
{
-
}
- setInternalNodeEscapeIndex(internalNodeIndex,escapeIndex);
-
+ setInternalNodeEscapeIndex(internalNodeIndex, escapeIndex);
}
-void btQuantizedBvh::updateSubtreeHeaders(int leftChildNodexIndex,int rightChildNodexIndex)
+void btQuantizedBvh::updateSubtreeHeaders(int leftChildNodexIndex, int rightChildNodexIndex)
{
btAssert(m_useQuantization);
btQuantizedBvhNode& leftChildNode = m_quantizedContiguousNodes[leftChildNodexIndex];
int leftSubTreeSize = leftChildNode.isLeafNode() ? 1 : leftChildNode.getEscapeIndex();
- int leftSubTreeSizeInBytes = leftSubTreeSize * static_cast<int>(sizeof(btQuantizedBvhNode));
-
+ int leftSubTreeSizeInBytes = leftSubTreeSize * static_cast<int>(sizeof(btQuantizedBvhNode));
+
btQuantizedBvhNode& rightChildNode = m_quantizedContiguousNodes[rightChildNodexIndex];
int rightSubTreeSize = rightChildNode.isLeafNode() ? 1 : rightChildNode.getEscapeIndex();
- int rightSubTreeSizeInBytes = rightSubTreeSize * static_cast<int>(sizeof(btQuantizedBvhNode));
+ int rightSubTreeSizeInBytes = rightSubTreeSize * static_cast<int>(sizeof(btQuantizedBvhNode));
- if(leftSubTreeSizeInBytes <= MAX_SUBTREE_SIZE_IN_BYTES)
+ if (leftSubTreeSizeInBytes <= MAX_SUBTREE_SIZE_IN_BYTES)
{
btBvhSubtreeInfo& subtree = m_SubtreeHeaders.expand();
subtree.setAabbFromQuantizeNode(leftChildNode);
@@ -234,7 +217,7 @@ void btQuantizedBvh::updateSubtreeHeaders(int leftChildNodexIndex,int rightChild
subtree.m_subtreeSize = leftSubTreeSize;
}
- if(rightSubTreeSizeInBytes <= MAX_SUBTREE_SIZE_IN_BYTES)
+ if (rightSubTreeSizeInBytes <= MAX_SUBTREE_SIZE_IN_BYTES)
{
btBvhSubtreeInfo& subtree = m_SubtreeHeaders.expand();
subtree.setAabbFromQuantizeNode(rightChildNode);
@@ -246,32 +229,31 @@ void btQuantizedBvh::updateSubtreeHeaders(int leftChildNodexIndex,int rightChild
m_subtreeHeaderCount = m_SubtreeHeaders.size();
}
-
-int btQuantizedBvh::sortAndCalcSplittingIndex(int startIndex,int endIndex,int splitAxis)
+int btQuantizedBvh::sortAndCalcSplittingIndex(int startIndex, int endIndex, int splitAxis)
{
int i;
- int splitIndex =startIndex;
+ int splitIndex = startIndex;
int numIndices = endIndex - startIndex;
btScalar splitValue;
- btVector3 means(btScalar(0.),btScalar(0.),btScalar(0.));
- for (i=startIndex;i<endIndex;i++)
+ btVector3 means(btScalar(0.), btScalar(0.), btScalar(0.));
+ for (i = startIndex; i < endIndex; i++)
{
- btVector3 center = btScalar(0.5)*(getAabbMax(i)+getAabbMin(i));
- means+=center;
+ btVector3 center = btScalar(0.5) * (getAabbMax(i) + getAabbMin(i));
+ means += center;
}
- means *= (btScalar(1.)/(btScalar)numIndices);
-
+ means *= (btScalar(1.) / (btScalar)numIndices);
+
splitValue = means[splitAxis];
-
+
//sort leafNodes so all values larger then splitValue comes first, and smaller values start from 'splitIndex'.
- for (i=startIndex;i<endIndex;i++)
+ for (i = startIndex; i < endIndex; i++)
{
- btVector3 center = btScalar(0.5)*(getAabbMax(i)+getAabbMin(i));
+ btVector3 center = btScalar(0.5) * (getAabbMax(i) + getAabbMin(i));
if (center[splitAxis] > splitValue)
{
//swap
- swapLeafNodes(i,splitIndex);
+ swapLeafNodes(i, splitIndex);
splitIndex++;
}
}
@@ -281,56 +263,53 @@ int btQuantizedBvh::sortAndCalcSplittingIndex(int startIndex,int endIndex,int sp
//unbalanced1 is unsafe: it can cause stack overflows
//bool unbalanced1 = ((splitIndex==startIndex) || (splitIndex == (endIndex-1)));
- //unbalanced2 should work too: always use center (perfect balanced trees)
+ //unbalanced2 should work too: always use center (perfect balanced trees)
//bool unbalanced2 = true;
//this should be safe too:
- int rangeBalancedIndices = numIndices/3;
- bool unbalanced = ((splitIndex<=(startIndex+rangeBalancedIndices)) || (splitIndex >=(endIndex-1-rangeBalancedIndices)));
-
+ int rangeBalancedIndices = numIndices / 3;
+ bool unbalanced = ((splitIndex <= (startIndex + rangeBalancedIndices)) || (splitIndex >= (endIndex - 1 - rangeBalancedIndices)));
+
if (unbalanced)
{
- splitIndex = startIndex+ (numIndices>>1);
+ splitIndex = startIndex + (numIndices >> 1);
}
- bool unbal = (splitIndex==startIndex) || (splitIndex == (endIndex));
+ bool unbal = (splitIndex == startIndex) || (splitIndex == (endIndex));
(void)unbal;
btAssert(!unbal);
return splitIndex;
}
-
-int btQuantizedBvh::calcSplittingAxis(int startIndex,int endIndex)
+int btQuantizedBvh::calcSplittingAxis(int startIndex, int endIndex)
{
int i;
- btVector3 means(btScalar(0.),btScalar(0.),btScalar(0.));
- btVector3 variance(btScalar(0.),btScalar(0.),btScalar(0.));
- int numIndices = endIndex-startIndex;
+ btVector3 means(btScalar(0.), btScalar(0.), btScalar(0.));
+ btVector3 variance(btScalar(0.), btScalar(0.), btScalar(0.));
+ int numIndices = endIndex - startIndex;
- for (i=startIndex;i<endIndex;i++)
+ for (i = startIndex; i < endIndex; i++)
{
- btVector3 center = btScalar(0.5)*(getAabbMax(i)+getAabbMin(i));
- means+=center;
+ btVector3 center = btScalar(0.5) * (getAabbMax(i) + getAabbMin(i));
+ means += center;
}
- means *= (btScalar(1.)/(btScalar)numIndices);
-
- for (i=startIndex;i<endIndex;i++)
+ means *= (btScalar(1.) / (btScalar)numIndices);
+
+ for (i = startIndex; i < endIndex; i++)
{
- btVector3 center = btScalar(0.5)*(getAabbMax(i)+getAabbMin(i));
- btVector3 diff2 = center-means;
+ btVector3 center = btScalar(0.5) * (getAabbMax(i) + getAabbMin(i));
+ btVector3 diff2 = center - means;
diff2 = diff2 * diff2;
variance += diff2;
}
- variance *= (btScalar(1.)/ ((btScalar)numIndices-1) );
-
+ variance *= (btScalar(1.) / ((btScalar)numIndices - 1));
+
return variance.maxAxis();
}
-
-
-void btQuantizedBvh::reportAabbOverlappingNodex(btNodeOverlapCallback* nodeCallback,const btVector3& aabbMin,const btVector3& aabbMax) const
+void btQuantizedBvh::reportAabbOverlappingNodex(btNodeOverlapCallback* nodeCallback, const btVector3& aabbMin, const btVector3& aabbMax) const
{
//either choose recursive traversal (walkTree) or stackless (walkStacklessTree)
@@ -339,38 +318,37 @@ void btQuantizedBvh::reportAabbOverlappingNodex(btNodeOverlapCallback* nodeCallb
///quantize query AABB
unsigned short int quantizedQueryAabbMin[3];
unsigned short int quantizedQueryAabbMax[3];
- quantizeWithClamp(quantizedQueryAabbMin,aabbMin,0);
- quantizeWithClamp(quantizedQueryAabbMax,aabbMax,1);
+ quantizeWithClamp(quantizedQueryAabbMin, aabbMin, 0);
+ quantizeWithClamp(quantizedQueryAabbMax, aabbMax, 1);
switch (m_traversalMode)
{
- case TRAVERSAL_STACKLESS:
- walkStacklessQuantizedTree(nodeCallback,quantizedQueryAabbMin,quantizedQueryAabbMax,0,m_curNodeIndex);
- break;
- case TRAVERSAL_STACKLESS_CACHE_FRIENDLY:
- walkStacklessQuantizedTreeCacheFriendly(nodeCallback,quantizedQueryAabbMin,quantizedQueryAabbMax);
- break;
- case TRAVERSAL_RECURSIVE:
+ case TRAVERSAL_STACKLESS:
+ walkStacklessQuantizedTree(nodeCallback, quantizedQueryAabbMin, quantizedQueryAabbMax, 0, m_curNodeIndex);
+ break;
+ case TRAVERSAL_STACKLESS_CACHE_FRIENDLY:
+ walkStacklessQuantizedTreeCacheFriendly(nodeCallback, quantizedQueryAabbMin, quantizedQueryAabbMax);
+ break;
+ case TRAVERSAL_RECURSIVE:
{
const btQuantizedBvhNode* rootNode = &m_quantizedContiguousNodes[0];
- walkRecursiveQuantizedTreeAgainstQueryAabb(rootNode,nodeCallback,quantizedQueryAabbMin,quantizedQueryAabbMax);
+ walkRecursiveQuantizedTreeAgainstQueryAabb(rootNode, nodeCallback, quantizedQueryAabbMin, quantizedQueryAabbMax);
}
break;
- default:
- //unsupported
- btAssert(0);
+ default:
+ //unsupported
+ btAssert(0);
}
- } else
+ }
+ else
{
- walkStacklessTree(nodeCallback,aabbMin,aabbMax);
+ walkStacklessTree(nodeCallback, aabbMin, aabbMax);
}
}
-
int maxIterations = 0;
-
-void btQuantizedBvh::walkStacklessTree(btNodeOverlapCallback* nodeCallback,const btVector3& aabbMin,const btVector3& aabbMax) const
+void btQuantizedBvh::walkStacklessTree(btNodeOverlapCallback* nodeCallback, const btVector3& aabbMin, const btVector3& aabbMax) const
{
btAssert(!m_useQuantization);
@@ -384,24 +362,25 @@ void btQuantizedBvh::walkStacklessTree(btNodeOverlapCallback* nodeCallback,const
while (curIndex < m_curNodeIndex)
{
//catch bugs in tree data
- btAssert (walkIterations < m_curNodeIndex);
+ btAssert(walkIterations < m_curNodeIndex);
walkIterations++;
- aabbOverlap = TestAabbAgainstAabb2(aabbMin,aabbMax,rootNode->m_aabbMinOrg,rootNode->m_aabbMaxOrg);
+ aabbOverlap = TestAabbAgainstAabb2(aabbMin, aabbMax, rootNode->m_aabbMinOrg, rootNode->m_aabbMaxOrg);
isLeafNode = rootNode->m_escapeIndex == -1;
-
+
//PCK: unsigned instead of bool
if (isLeafNode && (aabbOverlap != 0))
{
- nodeCallback->processNode(rootNode->m_subPart,rootNode->m_triangleIndex);
- }
-
+ nodeCallback->processNode(rootNode->m_subPart, rootNode->m_triangleIndex);
+ }
+
//PCK: unsigned instead of bool
if ((aabbOverlap != 0) || isLeafNode)
{
rootNode++;
curIndex++;
- } else
+ }
+ else
{
escapeIndex = rootNode->m_escapeIndex;
rootNode += escapeIndex;
@@ -410,7 +389,6 @@ void btQuantizedBvh::walkStacklessTree(btNodeOverlapCallback* nodeCallback,const
}
if (maxIterations < walkIterations)
maxIterations = walkIterations;
-
}
/*
@@ -434,39 +412,38 @@ void btQuantizedBvh::walkTree(btOptimizedBvhNode* rootNode,btNodeOverlapCallback
}
*/
-void btQuantizedBvh::walkRecursiveQuantizedTreeAgainstQueryAabb(const btQuantizedBvhNode* currentNode,btNodeOverlapCallback* nodeCallback,unsigned short int* quantizedQueryAabbMin,unsigned short int* quantizedQueryAabbMax) const
+void btQuantizedBvh::walkRecursiveQuantizedTreeAgainstQueryAabb(const btQuantizedBvhNode* currentNode, btNodeOverlapCallback* nodeCallback, unsigned short int* quantizedQueryAabbMin, unsigned short int* quantizedQueryAabbMax) const
{
btAssert(m_useQuantization);
-
+
bool isLeafNode;
//PCK: unsigned instead of bool
unsigned aabbOverlap;
//PCK: unsigned instead of bool
- aabbOverlap = testQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin,quantizedQueryAabbMax,currentNode->m_quantizedAabbMin,currentNode->m_quantizedAabbMax);
+ aabbOverlap = testQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin, quantizedQueryAabbMax, currentNode->m_quantizedAabbMin, currentNode->m_quantizedAabbMax);
isLeafNode = currentNode->isLeafNode();
-
+
//PCK: unsigned instead of bool
if (aabbOverlap != 0)
{
if (isLeafNode)
{
- nodeCallback->processNode(currentNode->getPartId(),currentNode->getTriangleIndex());
- } else
+ nodeCallback->processNode(currentNode->getPartId(), currentNode->getTriangleIndex());
+ }
+ else
{
//process left and right children
- const btQuantizedBvhNode* leftChildNode = currentNode+1;
- walkRecursiveQuantizedTreeAgainstQueryAabb(leftChildNode,nodeCallback,quantizedQueryAabbMin,quantizedQueryAabbMax);
+ const btQuantizedBvhNode* leftChildNode = currentNode + 1;
+ walkRecursiveQuantizedTreeAgainstQueryAabb(leftChildNode, nodeCallback, quantizedQueryAabbMin, quantizedQueryAabbMax);
- const btQuantizedBvhNode* rightChildNode = leftChildNode->isLeafNode() ? leftChildNode+1:leftChildNode+leftChildNode->getEscapeIndex();
- walkRecursiveQuantizedTreeAgainstQueryAabb(rightChildNode,nodeCallback,quantizedQueryAabbMin,quantizedQueryAabbMax);
+ const btQuantizedBvhNode* rightChildNode = leftChildNode->isLeafNode() ? leftChildNode + 1 : leftChildNode + leftChildNode->getEscapeIndex();
+ walkRecursiveQuantizedTreeAgainstQueryAabb(rightChildNode, nodeCallback, quantizedQueryAabbMin, quantizedQueryAabbMax);
}
- }
+ }
}
-
-
-void btQuantizedBvh::walkStacklessTreeAgainstRay(btNodeOverlapCallback* nodeCallback, const btVector3& raySource, const btVector3& rayTarget, const btVector3& aabbMin, const btVector3& aabbMax, int startNodeIndex,int endNodeIndex) const
+void btQuantizedBvh::walkStacklessTreeAgainstRay(btNodeOverlapCallback* nodeCallback, const btVector3& raySource, const btVector3& rayTarget, const btVector3& aabbMin, const btVector3& aabbMax, int startNodeIndex, int endNodeIndex) const
{
btAssert(!m_useQuantization);
@@ -475,11 +452,11 @@ void btQuantizedBvh::walkStacklessTreeAgainstRay(btNodeOverlapCallback* nodeCall
int walkIterations = 0;
bool isLeafNode;
//PCK: unsigned instead of bool
- unsigned aabbOverlap=0;
- unsigned rayBoxOverlap=0;
+ unsigned aabbOverlap = 0;
+ unsigned rayBoxOverlap = 0;
btScalar lambda_max = 1.0;
-
- /* Quick pruning by quantized box */
+
+ /* Quick pruning by quantized box */
btVector3 rayAabbMin = raySource;
btVector3 rayAabbMax = raySource;
rayAabbMin.setMin(rayTarget);
@@ -490,15 +467,15 @@ void btQuantizedBvh::walkStacklessTreeAgainstRay(btNodeOverlapCallback* nodeCall
rayAabbMax += aabbMax;
#ifdef RAYAABB2
- btVector3 rayDir = (rayTarget-raySource);
- rayDir.normalize ();
- lambda_max = rayDir.dot(rayTarget-raySource);
+ btVector3 rayDir = (rayTarget - raySource);
+ rayDir.normalize();
+ lambda_max = rayDir.dot(rayTarget - raySource);
///what about division by zero? --> just set rayDirection[i] to 1.0
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 sign[3] = { rayDirectionInverse[0] < 0.0, rayDirectionInverse[1] < 0.0, rayDirectionInverse[2] < 0.0};
+ unsigned int sign[3] = {rayDirectionInverse[0] < 0.0, rayDirectionInverse[1] < 0.0, rayDirectionInverse[2] < 0.0};
#endif
btVector3 bounds[2];
@@ -507,7 +484,7 @@ void btQuantizedBvh::walkStacklessTreeAgainstRay(btNodeOverlapCallback* nodeCall
{
btScalar param = 1.0;
//catch bugs in tree data
- btAssert (walkIterations < m_curNodeIndex);
+ btAssert(walkIterations < m_curNodeIndex);
walkIterations++;
@@ -517,34 +494,35 @@ void btQuantizedBvh::walkStacklessTreeAgainstRay(btNodeOverlapCallback* nodeCall
bounds[0] -= aabbMax;
bounds[1] -= aabbMin;
- aabbOverlap = TestAabbAgainstAabb2(rayAabbMin,rayAabbMax,rootNode->m_aabbMinOrg,rootNode->m_aabbMaxOrg);
+ aabbOverlap = TestAabbAgainstAabb2(rayAabbMin, rayAabbMax, rootNode->m_aabbMinOrg, rootNode->m_aabbMaxOrg);
//perhaps profile if it is worth doing the aabbOverlap test first
#ifdef RAYAABB2
- ///careful with this check: need to check division by zero (above) and fix the unQuantize method
- ///thanks Joerg/hiker for the reproduction case!
- ///http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=9&t=1858
- rayBoxOverlap = aabbOverlap ? btRayAabb2 (raySource, rayDirectionInverse, sign, bounds, param, 0.0f, lambda_max) : false;
+ ///careful with this check: need to check division by zero (above) and fix the unQuantize method
+ ///thanks Joerg/hiker for the reproduction case!
+ ///http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=9&t=1858
+ rayBoxOverlap = aabbOverlap ? btRayAabb2(raySource, rayDirectionInverse, sign, bounds, param, 0.0f, lambda_max) : false;
#else
btVector3 normal;
- rayBoxOverlap = btRayAabb(raySource, rayTarget,bounds[0],bounds[1],param, normal);
+ rayBoxOverlap = btRayAabb(raySource, rayTarget, bounds[0], bounds[1], param, normal);
#endif
isLeafNode = rootNode->m_escapeIndex == -1;
-
+
//PCK: unsigned instead of bool
if (isLeafNode && (rayBoxOverlap != 0))
{
- nodeCallback->processNode(rootNode->m_subPart,rootNode->m_triangleIndex);
- }
-
+ nodeCallback->processNode(rootNode->m_subPart, rootNode->m_triangleIndex);
+ }
+
//PCK: unsigned instead of bool
if ((rayBoxOverlap != 0) || isLeafNode)
{
rootNode++;
curIndex++;
- } else
+ }
+ else
{
escapeIndex = rootNode->m_escapeIndex;
rootNode += escapeIndex;
@@ -553,15 +531,12 @@ void btQuantizedBvh::walkStacklessTreeAgainstRay(btNodeOverlapCallback* nodeCall
}
if (maxIterations < walkIterations)
maxIterations = walkIterations;
-
}
-
-
-void btQuantizedBvh::walkStacklessQuantizedTreeAgainstRay(btNodeOverlapCallback* nodeCallback, const btVector3& raySource, const btVector3& rayTarget, const btVector3& aabbMin, const btVector3& aabbMax, int startNodeIndex,int endNodeIndex) const
+void btQuantizedBvh::walkStacklessQuantizedTreeAgainstRay(btNodeOverlapCallback* nodeCallback, const btVector3& raySource, const btVector3& rayTarget, const btVector3& aabbMin, const btVector3& aabbMax, int startNodeIndex, int endNodeIndex) const
{
btAssert(m_useQuantization);
-
+
int curIndex = startNodeIndex;
int walkIterations = 0;
int subTreeSize = endNodeIndex - startNodeIndex;
@@ -569,7 +544,7 @@ void btQuantizedBvh::walkStacklessQuantizedTreeAgainstRay(btNodeOverlapCallback*
const btQuantizedBvhNode* rootNode = &m_quantizedContiguousNodes[startNodeIndex];
int escapeIndex;
-
+
bool isLeafNode;
//PCK: unsigned instead of bool
unsigned boxBoxOverlap = 0;
@@ -578,14 +553,14 @@ void btQuantizedBvh::walkStacklessQuantizedTreeAgainstRay(btNodeOverlapCallback*
btScalar lambda_max = 1.0;
#ifdef RAYAABB2
- btVector3 rayDirection = (rayTarget-raySource);
- rayDirection.normalize ();
- lambda_max = rayDirection.dot(rayTarget-raySource);
+ btVector3 rayDirection = (rayTarget - raySource);
+ rayDirection.normalize();
+ lambda_max = rayDirection.dot(rayTarget - raySource);
///what about division by zero? --> just set rayDirection[i] to 1.0
rayDirection[0] = rayDirection[0] == btScalar(0.0) ? btScalar(BT_LARGE_FLOAT) : btScalar(1.0) / rayDirection[0];
rayDirection[1] = rayDirection[1] == btScalar(0.0) ? btScalar(BT_LARGE_FLOAT) : btScalar(1.0) / rayDirection[1];
rayDirection[2] = rayDirection[2] == btScalar(0.0) ? btScalar(BT_LARGE_FLOAT) : btScalar(1.0) / rayDirection[2];
- unsigned int sign[3] = { rayDirection[0] < 0.0, rayDirection[1] < 0.0, rayDirection[2] < 0.0};
+ unsigned int sign[3] = {rayDirection[0] < 0.0, rayDirection[1] < 0.0, rayDirection[2] < 0.0};
#endif
/* Quick pruning by quantized box */
@@ -600,37 +575,36 @@ void btQuantizedBvh::walkStacklessQuantizedTreeAgainstRay(btNodeOverlapCallback*
unsigned short int quantizedQueryAabbMin[3];
unsigned short int quantizedQueryAabbMax[3];
- quantizeWithClamp(quantizedQueryAabbMin,rayAabbMin,0);
- quantizeWithClamp(quantizedQueryAabbMax,rayAabbMax,1);
+ quantizeWithClamp(quantizedQueryAabbMin, rayAabbMin, 0);
+ quantizeWithClamp(quantizedQueryAabbMax, rayAabbMax, 1);
while (curIndex < endNodeIndex)
{
-
//#define VISUALLY_ANALYZE_BVH 1
#ifdef VISUALLY_ANALYZE_BVH
//some code snippet to debugDraw aabb, to visually analyze bvh structure
static int drawPatch = 0;
//need some global access to a debugDrawer
extern btIDebugDraw* debugDrawerPtr;
- if (curIndex==drawPatch)
+ if (curIndex == drawPatch)
{
- btVector3 aabbMin,aabbMax;
+ btVector3 aabbMin, aabbMax;
aabbMin = unQuantize(rootNode->m_quantizedAabbMin);
aabbMax = unQuantize(rootNode->m_quantizedAabbMax);
- btVector3 color(1,0,0);
- debugDrawerPtr->drawAabb(aabbMin,aabbMax,color);
+ btVector3 color(1, 0, 0);
+ debugDrawerPtr->drawAabb(aabbMin, aabbMax, color);
}
-#endif//VISUALLY_ANALYZE_BVH
+#endif //VISUALLY_ANALYZE_BVH
//catch bugs in tree data
- btAssert (walkIterations < subTreeSize);
+ btAssert(walkIterations < subTreeSize);
walkIterations++;
//PCK: unsigned instead of bool
// only interested if this is closer than any previous hit
btScalar param = 1.0;
rayBoxOverlap = 0;
- boxBoxOverlap = testQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin,quantizedQueryAabbMax,rootNode->m_quantizedAabbMin,rootNode->m_quantizedAabbMax);
+ boxBoxOverlap = testQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin, quantizedQueryAabbMax, rootNode->m_quantizedAabbMin, rootNode->m_quantizedAabbMax);
isLeafNode = rootNode->isLeafNode();
if (boxBoxOverlap)
{
@@ -655,24 +629,25 @@ void btQuantizedBvh::walkStacklessQuantizedTreeAgainstRay(btNodeOverlapCallback*
///http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=9&t=1858
//BT_PROFILE("btRayAabb2");
- rayBoxOverlap = btRayAabb2 (raySource, rayDirection, sign, bounds, param, 0.0f, lambda_max);
-
+ rayBoxOverlap = btRayAabb2(raySource, rayDirection, sign, bounds, param, 0.0f, lambda_max);
+
#else
- rayBoxOverlap = true;//btRayAabb(raySource, rayTarget, bounds[0], bounds[1], param, normal);
+ rayBoxOverlap = true; //btRayAabb(raySource, rayTarget, bounds[0], bounds[1], param, normal);
#endif
}
-
+
if (isLeafNode && rayBoxOverlap)
{
- nodeCallback->processNode(rootNode->getPartId(),rootNode->getTriangleIndex());
+ nodeCallback->processNode(rootNode->getPartId(), rootNode->getTriangleIndex());
}
-
+
//PCK: unsigned instead of bool
if ((rayBoxOverlap != 0) || isLeafNode)
{
rootNode++;
curIndex++;
- } else
+ }
+ else
{
escapeIndex = rootNode->getEscapeIndex();
rootNode += escapeIndex;
@@ -681,13 +656,12 @@ void btQuantizedBvh::walkStacklessQuantizedTreeAgainstRay(btNodeOverlapCallback*
}
if (maxIterations < walkIterations)
maxIterations = walkIterations;
-
}
-void btQuantizedBvh::walkStacklessQuantizedTree(btNodeOverlapCallback* nodeCallback,unsigned short int* quantizedQueryAabbMin,unsigned short int* quantizedQueryAabbMax,int startNodeIndex,int endNodeIndex) const
+void btQuantizedBvh::walkStacklessQuantizedTree(btNodeOverlapCallback* nodeCallback, unsigned short int* quantizedQueryAabbMin, unsigned short int* quantizedQueryAabbMax, int startNodeIndex, int endNodeIndex) const
{
btAssert(m_useQuantization);
-
+
int curIndex = startNodeIndex;
int walkIterations = 0;
int subTreeSize = endNodeIndex - startNodeIndex;
@@ -695,49 +669,49 @@ void btQuantizedBvh::walkStacklessQuantizedTree(btNodeOverlapCallback* nodeCallb
const btQuantizedBvhNode* rootNode = &m_quantizedContiguousNodes[startNodeIndex];
int escapeIndex;
-
+
bool isLeafNode;
//PCK: unsigned instead of bool
unsigned aabbOverlap;
while (curIndex < endNodeIndex)
{
-
//#define VISUALLY_ANALYZE_BVH 1
#ifdef VISUALLY_ANALYZE_BVH
//some code snippet to debugDraw aabb, to visually analyze bvh structure
static int drawPatch = 0;
//need some global access to a debugDrawer
extern btIDebugDraw* debugDrawerPtr;
- if (curIndex==drawPatch)
+ if (curIndex == drawPatch)
{
- btVector3 aabbMin,aabbMax;
+ btVector3 aabbMin, aabbMax;
aabbMin = unQuantize(rootNode->m_quantizedAabbMin);
aabbMax = unQuantize(rootNode->m_quantizedAabbMax);
- btVector3 color(1,0,0);
- debugDrawerPtr->drawAabb(aabbMin,aabbMax,color);
+ btVector3 color(1, 0, 0);
+ debugDrawerPtr->drawAabb(aabbMin, aabbMax, color);
}
-#endif//VISUALLY_ANALYZE_BVH
+#endif //VISUALLY_ANALYZE_BVH
//catch bugs in tree data
- btAssert (walkIterations < subTreeSize);
+ btAssert(walkIterations < subTreeSize);
walkIterations++;
//PCK: unsigned instead of bool
- aabbOverlap = testQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin,quantizedQueryAabbMax,rootNode->m_quantizedAabbMin,rootNode->m_quantizedAabbMax);
+ aabbOverlap = testQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin, quantizedQueryAabbMax, rootNode->m_quantizedAabbMin, rootNode->m_quantizedAabbMax);
isLeafNode = rootNode->isLeafNode();
-
+
if (isLeafNode && aabbOverlap)
{
- nodeCallback->processNode(rootNode->getPartId(),rootNode->getTriangleIndex());
- }
-
+ nodeCallback->processNode(rootNode->getPartId(), rootNode->getTriangleIndex());
+ }
+
//PCK: unsigned instead of bool
if ((aabbOverlap != 0) || isLeafNode)
{
rootNode++;
curIndex++;
- } else
+ }
+ else
{
escapeIndex = rootNode->getEscapeIndex();
rootNode += escapeIndex;
@@ -746,40 +720,36 @@ void btQuantizedBvh::walkStacklessQuantizedTree(btNodeOverlapCallback* nodeCallb
}
if (maxIterations < walkIterations)
maxIterations = walkIterations;
-
}
//This traversal can be called from Playstation 3 SPU
-void btQuantizedBvh::walkStacklessQuantizedTreeCacheFriendly(btNodeOverlapCallback* nodeCallback,unsigned short int* quantizedQueryAabbMin,unsigned short int* quantizedQueryAabbMax) const
+void btQuantizedBvh::walkStacklessQuantizedTreeCacheFriendly(btNodeOverlapCallback* nodeCallback, unsigned short int* quantizedQueryAabbMin, unsigned short int* quantizedQueryAabbMax) const
{
btAssert(m_useQuantization);
int i;
-
- for (i=0;i<this->m_SubtreeHeaders.size();i++)
+ for (i = 0; i < this->m_SubtreeHeaders.size(); i++)
{
const btBvhSubtreeInfo& subtree = m_SubtreeHeaders[i];
//PCK: unsigned instead of bool
- unsigned overlap = testQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin,quantizedQueryAabbMax,subtree.m_quantizedAabbMin,subtree.m_quantizedAabbMax);
+ unsigned overlap = testQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin, quantizedQueryAabbMax, subtree.m_quantizedAabbMin, subtree.m_quantizedAabbMax);
if (overlap != 0)
{
- walkStacklessQuantizedTree(nodeCallback,quantizedQueryAabbMin,quantizedQueryAabbMax,
- subtree.m_rootNodeIndex,
- subtree.m_rootNodeIndex+subtree.m_subtreeSize);
+ walkStacklessQuantizedTree(nodeCallback, quantizedQueryAabbMin, quantizedQueryAabbMax,
+ subtree.m_rootNodeIndex,
+ subtree.m_rootNodeIndex + subtree.m_subtreeSize);
}
}
}
-
-void btQuantizedBvh::reportRayOverlappingNodex (btNodeOverlapCallback* nodeCallback, const btVector3& raySource, const btVector3& rayTarget) const
+void btQuantizedBvh::reportRayOverlappingNodex(btNodeOverlapCallback* nodeCallback, const btVector3& raySource, const btVector3& rayTarget) const
{
- reportBoxCastOverlappingNodex(nodeCallback,raySource,rayTarget,btVector3(0,0,0),btVector3(0,0,0));
+ reportBoxCastOverlappingNodex(nodeCallback, raySource, rayTarget, btVector3(0, 0, 0), btVector3(0, 0, 0));
}
-
-void btQuantizedBvh::reportBoxCastOverlappingNodex(btNodeOverlapCallback* nodeCallback, const btVector3& raySource, const btVector3& rayTarget, const btVector3& aabbMin,const btVector3& aabbMax) const
+void btQuantizedBvh::reportBoxCastOverlappingNodex(btNodeOverlapCallback* nodeCallback, const btVector3& raySource, const btVector3& rayTarget, const btVector3& aabbMin, const btVector3& aabbMax) const
{
//always use stackless
@@ -803,31 +773,31 @@ void btQuantizedBvh::reportBoxCastOverlappingNodex(btNodeOverlapCallback* nodeCa
reportAabbOverlappingNodex(nodeCallback,qaabbMin,qaabbMax);
}
*/
-
}
-
-void btQuantizedBvh::swapLeafNodes(int i,int splitIndex)
+void btQuantizedBvh::swapLeafNodes(int i, int splitIndex)
{
if (m_useQuantization)
{
- btQuantizedBvhNode tmp = m_quantizedLeafNodes[i];
- m_quantizedLeafNodes[i] = m_quantizedLeafNodes[splitIndex];
- m_quantizedLeafNodes[splitIndex] = tmp;
- } else
+ btQuantizedBvhNode tmp = m_quantizedLeafNodes[i];
+ m_quantizedLeafNodes[i] = m_quantizedLeafNodes[splitIndex];
+ m_quantizedLeafNodes[splitIndex] = tmp;
+ }
+ else
{
- btOptimizedBvhNode tmp = m_leafNodes[i];
- m_leafNodes[i] = m_leafNodes[splitIndex];
- m_leafNodes[splitIndex] = tmp;
+ btOptimizedBvhNode tmp = m_leafNodes[i];
+ m_leafNodes[i] = m_leafNodes[splitIndex];
+ m_leafNodes[splitIndex] = tmp;
}
}
-void btQuantizedBvh::assignInternalNodeFromLeafNode(int internalNode,int leafNodeIndex)
+void btQuantizedBvh::assignInternalNodeFromLeafNode(int internalNode, int leafNodeIndex)
{
if (m_useQuantization)
{
m_quantizedContiguousNodes[internalNode] = m_quantizedLeafNodes[leafNodeIndex];
- } else
+ }
+ else
{
m_contiguousNodes[internalNode] = m_leafNodes[leafNodeIndex];
}
@@ -844,11 +814,10 @@ static const unsigned BVH_ALIGNMENT_MASK = BVH_ALIGNMENT-1;
static const unsigned BVH_ALIGNMENT_BLOCKS = 2;
#endif
-
unsigned int btQuantizedBvh::getAlignmentSerializationPadding()
{
// I changed this to 0 since the extra padding is not needed or used.
- return 0;//BVH_ALIGNMENT_BLOCKS * BVH_ALIGNMENT;
+ return 0; //BVH_ALIGNMENT_BLOCKS * BVH_ALIGNMENT;
}
unsigned btQuantizedBvh::calculateSerializeBufferSize() const
@@ -862,12 +831,12 @@ unsigned btQuantizedBvh::calculateSerializeBufferSize() const
return baseSize + m_curNodeIndex * sizeof(btOptimizedBvhNode);
}
-bool btQuantizedBvh::serialize(void *o_alignedDataBuffer, unsigned /*i_dataBufferSize */, bool i_swapEndian) const
+bool btQuantizedBvh::serialize(void* o_alignedDataBuffer, unsigned /*i_dataBufferSize */, bool i_swapEndian) const
{
btAssert(m_subtreeHeaderCount == m_SubtreeHeaders.size());
m_subtreeHeaderCount = m_SubtreeHeaders.size();
-/* if (i_dataBufferSize < calculateSerializeBufferSize() || o_alignedDataBuffer == NULL || (((unsigned)o_alignedDataBuffer & BVH_ALIGNMENT_MASK) != 0))
+ /* if (i_dataBufferSize < calculateSerializeBufferSize() || o_alignedDataBuffer == NULL || (((unsigned)o_alignedDataBuffer & BVH_ALIGNMENT_MASK) != 0))
{
///check alignedment for buffer?
btAssert(0);
@@ -875,7 +844,7 @@ bool btQuantizedBvh::serialize(void *o_alignedDataBuffer, unsigned /*i_dataBuffe
}
*/
- btQuantizedBvh *targetBvh = (btQuantizedBvh *)o_alignedDataBuffer;
+ btQuantizedBvh* targetBvh = (btQuantizedBvh*)o_alignedDataBuffer;
// construct the class so the virtual function table, etc will be set up
// Also, m_leafNodes and m_quantizedLeafNodes will be initialized to default values by the constructor
@@ -885,10 +854,9 @@ bool btQuantizedBvh::serialize(void *o_alignedDataBuffer, unsigned /*i_dataBuffe
{
targetBvh->m_curNodeIndex = static_cast<int>(btSwapEndian(m_curNodeIndex));
-
- btSwapVector3Endian(m_bvhAabbMin,targetBvh->m_bvhAabbMin);
- btSwapVector3Endian(m_bvhAabbMax,targetBvh->m_bvhAabbMax);
- btSwapVector3Endian(m_bvhQuantization,targetBvh->m_bvhQuantization);
+ btSwapVector3Endian(m_bvhAabbMin, targetBvh->m_bvhAabbMin);
+ btSwapVector3Endian(m_bvhAabbMax, targetBvh->m_bvhAabbMax);
+ btSwapVector3Endian(m_bvhQuantization, targetBvh->m_bvhQuantization);
targetBvh->m_traversalMode = (btTraversalMode)btSwapEndian(m_traversalMode);
targetBvh->m_subtreeHeaderCount = static_cast<int>(btSwapEndian(m_subtreeHeaderCount));
@@ -905,12 +873,12 @@ bool btQuantizedBvh::serialize(void *o_alignedDataBuffer, unsigned /*i_dataBuffe
targetBvh->m_useQuantization = m_useQuantization;
- unsigned char *nodeData = (unsigned char *)targetBvh;
+ unsigned char* nodeData = (unsigned char*)targetBvh;
nodeData += sizeof(btQuantizedBvh);
-
- unsigned sizeToAdd = 0;//(BVH_ALIGNMENT-((unsigned)nodeData & BVH_ALIGNMENT_MASK))&BVH_ALIGNMENT_MASK;
+
+ unsigned sizeToAdd = 0; //(BVH_ALIGNMENT-((unsigned)nodeData & BVH_ALIGNMENT_MASK))&BVH_ALIGNMENT_MASK;
nodeData += sizeToAdd;
-
+
int nodeCount = m_curNodeIndex;
if (m_useQuantization)
@@ -936,7 +904,6 @@ bool btQuantizedBvh::serialize(void *o_alignedDataBuffer, unsigned /*i_dataBuffe
{
for (int nodeIndex = 0; nodeIndex < nodeCount; nodeIndex++)
{
-
targetBvh->m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMin[0] = m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMin[0];
targetBvh->m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMin[1] = m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMin[1];
targetBvh->m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMin[2] = m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMin[2];
@@ -946,8 +913,6 @@ bool btQuantizedBvh::serialize(void *o_alignedDataBuffer, unsigned /*i_dataBuffe
targetBvh->m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMax[2] = m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMax[2];
targetBvh->m_quantizedContiguousNodes[nodeIndex].m_escapeIndexOrTriangleIndex = m_quantizedContiguousNodes[nodeIndex].m_escapeIndexOrTriangleIndex;
-
-
}
}
nodeData += sizeof(btQuantizedBvhNode) * nodeCount;
@@ -993,7 +958,7 @@ bool btQuantizedBvh::serialize(void *o_alignedDataBuffer, unsigned /*i_dataBuffe
targetBvh->m_contiguousNodes.initializeFromBuffer(NULL, 0, 0);
}
- sizeToAdd = 0;//(BVH_ALIGNMENT-((unsigned)nodeData & BVH_ALIGNMENT_MASK))&BVH_ALIGNMENT_MASK;
+ sizeToAdd = 0; //(BVH_ALIGNMENT-((unsigned)nodeData & BVH_ALIGNMENT_MASK))&BVH_ALIGNMENT_MASK;
nodeData += sizeToAdd;
// Now serialize the subtree headers
@@ -1048,14 +1013,13 @@ bool btQuantizedBvh::serialize(void *o_alignedDataBuffer, unsigned /*i_dataBuffe
return true;
}
-btQuantizedBvh *btQuantizedBvh::deSerializeInPlace(void *i_alignedDataBuffer, unsigned int i_dataBufferSize, bool i_swapEndian)
+btQuantizedBvh* btQuantizedBvh::deSerializeInPlace(void* i_alignedDataBuffer, unsigned int i_dataBufferSize, bool i_swapEndian)
{
-
- if (i_alignedDataBuffer == NULL)// || (((unsigned)i_alignedDataBuffer & BVH_ALIGNMENT_MASK) != 0))
+ if (i_alignedDataBuffer == NULL) // || (((unsigned)i_alignedDataBuffer & BVH_ALIGNMENT_MASK) != 0))
{
return NULL;
}
- btQuantizedBvh *bvh = (btQuantizedBvh *)i_alignedDataBuffer;
+ btQuantizedBvh* bvh = (btQuantizedBvh*)i_alignedDataBuffer;
if (i_swapEndian)
{
@@ -1077,12 +1041,12 @@ btQuantizedBvh *btQuantizedBvh::deSerializeInPlace(void *i_alignedDataBuffer, un
return NULL;
}
- unsigned char *nodeData = (unsigned char *)bvh;
+ unsigned char* nodeData = (unsigned char*)bvh;
nodeData += sizeof(btQuantizedBvh);
-
- unsigned sizeToAdd = 0;//(BVH_ALIGNMENT-((unsigned)nodeData & BVH_ALIGNMENT_MASK))&BVH_ALIGNMENT_MASK;
+
+ unsigned sizeToAdd = 0; //(BVH_ALIGNMENT-((unsigned)nodeData & BVH_ALIGNMENT_MASK))&BVH_ALIGNMENT_MASK;
nodeData += sizeToAdd;
-
+
int nodeCount = bvh->m_curNodeIndex;
// Must call placement new to fill in virtual function table, etc, but we don't want to overwrite most data, so call a special version of the constructor
@@ -1120,7 +1084,7 @@ btQuantizedBvh *btQuantizedBvh::deSerializeInPlace(void *i_alignedDataBuffer, un
{
btUnSwapVector3Endian(bvh->m_contiguousNodes[nodeIndex].m_aabbMinOrg);
btUnSwapVector3Endian(bvh->m_contiguousNodes[nodeIndex].m_aabbMaxOrg);
-
+
bvh->m_contiguousNodes[nodeIndex].m_escapeIndex = static_cast<int>(btSwapEndian(bvh->m_contiguousNodes[nodeIndex].m_escapeIndex));
bvh->m_contiguousNodes[nodeIndex].m_subPart = static_cast<int>(btSwapEndian(bvh->m_contiguousNodes[nodeIndex].m_subPart));
bvh->m_contiguousNodes[nodeIndex].m_triangleIndex = static_cast<int>(btSwapEndian(bvh->m_contiguousNodes[nodeIndex].m_triangleIndex));
@@ -1129,7 +1093,7 @@ btQuantizedBvh *btQuantizedBvh::deSerializeInPlace(void *i_alignedDataBuffer, un
nodeData += sizeof(btOptimizedBvhNode) * nodeCount;
}
- sizeToAdd = 0;//(BVH_ALIGNMENT-((unsigned)nodeData & BVH_ALIGNMENT_MASK))&BVH_ALIGNMENT_MASK;
+ sizeToAdd = 0; //(BVH_ALIGNMENT-((unsigned)nodeData & BVH_ALIGNMENT_MASK))&BVH_ALIGNMENT_MASK;
nodeData += sizeToAdd;
// Now serialize the subtree headers
@@ -1155,13 +1119,11 @@ btQuantizedBvh *btQuantizedBvh::deSerializeInPlace(void *i_alignedDataBuffer, un
}
// Constructor that prevents btVector3's default constructor from being called
-btQuantizedBvh::btQuantizedBvh(btQuantizedBvh &self, bool /* ownsMemory */) :
-m_bvhAabbMin(self.m_bvhAabbMin),
-m_bvhAabbMax(self.m_bvhAabbMax),
-m_bvhQuantization(self.m_bvhQuantization),
-m_bulletVersion(BT_BULLET_VERSION)
+btQuantizedBvh::btQuantizedBvh(btQuantizedBvh& self, bool /* ownsMemory */) : m_bvhAabbMin(self.m_bvhAabbMin),
+ m_bvhAabbMax(self.m_bvhAabbMax),
+ m_bvhQuantization(self.m_bvhQuantization),
+ m_bulletVersion(BT_BULLET_VERSION)
{
-
}
void btQuantizedBvh::deSerializeFloat(struct btQuantizedBvhFloatData& quantizedBvhFloatData)
@@ -1171,8 +1133,8 @@ void btQuantizedBvh::deSerializeFloat(struct btQuantizedBvhFloatData& quantizedB
m_bvhQuantization.deSerializeFloat(quantizedBvhFloatData.m_bvhQuantization);
m_curNodeIndex = quantizedBvhFloatData.m_curNodeIndex;
- m_useQuantization = quantizedBvhFloatData.m_useQuantization!=0;
-
+ m_useQuantization = quantizedBvhFloatData.m_useQuantization != 0;
+
{
int numElem = quantizedBvhFloatData.m_numContiguousLeafNodes;
m_contiguousNodes.resize(numElem);
@@ -1181,7 +1143,7 @@ void btQuantizedBvh::deSerializeFloat(struct btQuantizedBvhFloatData& quantizedB
{
btOptimizedBvhNodeFloatData* memPtr = quantizedBvhFloatData.m_contiguousNodesPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
m_contiguousNodes[i].m_aabbMaxOrg.deSerializeFloat(memPtr->m_aabbMaxOrg);
m_contiguousNodes[i].m_aabbMinOrg.deSerializeFloat(memPtr->m_aabbMinOrg);
@@ -1195,11 +1157,11 @@ void btQuantizedBvh::deSerializeFloat(struct btQuantizedBvhFloatData& quantizedB
{
int numElem = quantizedBvhFloatData.m_numQuantizedContiguousNodes;
m_quantizedContiguousNodes.resize(numElem);
-
+
if (numElem)
{
btQuantizedBvhNodeData* memPtr = quantizedBvhFloatData.m_quantizedContiguousNodesPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
m_quantizedContiguousNodes[i].m_escapeIndexOrTriangleIndex = memPtr->m_escapeIndexOrTriangleIndex;
m_quantizedContiguousNodes[i].m_quantizedAabbMax[0] = memPtr->m_quantizedAabbMax[0];
@@ -1213,16 +1175,16 @@ void btQuantizedBvh::deSerializeFloat(struct btQuantizedBvhFloatData& quantizedB
}
m_traversalMode = btTraversalMode(quantizedBvhFloatData.m_traversalMode);
-
+
{
int numElem = quantizedBvhFloatData.m_numSubtreeHeaders;
m_SubtreeHeaders.resize(numElem);
if (numElem)
{
btBvhSubtreeInfoData* memPtr = quantizedBvhFloatData.m_subTreeInfoPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
- m_SubtreeHeaders[i].m_quantizedAabbMax[0] = memPtr->m_quantizedAabbMax[0] ;
+ m_SubtreeHeaders[i].m_quantizedAabbMax[0] = memPtr->m_quantizedAabbMax[0];
m_SubtreeHeaders[i].m_quantizedAabbMax[1] = memPtr->m_quantizedAabbMax[1];
m_SubtreeHeaders[i].m_quantizedAabbMax[2] = memPtr->m_quantizedAabbMax[2];
m_SubtreeHeaders[i].m_quantizedAabbMin[0] = memPtr->m_quantizedAabbMin[0];
@@ -1242,8 +1204,8 @@ void btQuantizedBvh::deSerializeDouble(struct btQuantizedBvhDoubleData& quantize
m_bvhQuantization.deSerializeDouble(quantizedBvhDoubleData.m_bvhQuantization);
m_curNodeIndex = quantizedBvhDoubleData.m_curNodeIndex;
- m_useQuantization = quantizedBvhDoubleData.m_useQuantization!=0;
-
+ m_useQuantization = quantizedBvhDoubleData.m_useQuantization != 0;
+
{
int numElem = quantizedBvhDoubleData.m_numContiguousLeafNodes;
m_contiguousNodes.resize(numElem);
@@ -1252,7 +1214,7 @@ void btQuantizedBvh::deSerializeDouble(struct btQuantizedBvhDoubleData& quantize
{
btOptimizedBvhNodeDoubleData* memPtr = quantizedBvhDoubleData.m_contiguousNodesPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
m_contiguousNodes[i].m_aabbMaxOrg.deSerializeDouble(memPtr->m_aabbMaxOrg);
m_contiguousNodes[i].m_aabbMinOrg.deSerializeDouble(memPtr->m_aabbMinOrg);
@@ -1266,11 +1228,11 @@ void btQuantizedBvh::deSerializeDouble(struct btQuantizedBvhDoubleData& quantize
{
int numElem = quantizedBvhDoubleData.m_numQuantizedContiguousNodes;
m_quantizedContiguousNodes.resize(numElem);
-
+
if (numElem)
{
btQuantizedBvhNodeData* memPtr = quantizedBvhDoubleData.m_quantizedContiguousNodesPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
m_quantizedContiguousNodes[i].m_escapeIndexOrTriangleIndex = memPtr->m_escapeIndexOrTriangleIndex;
m_quantizedContiguousNodes[i].m_quantizedAabbMax[0] = memPtr->m_quantizedAabbMax[0];
@@ -1284,16 +1246,16 @@ void btQuantizedBvh::deSerializeDouble(struct btQuantizedBvhDoubleData& quantize
}
m_traversalMode = btTraversalMode(quantizedBvhDoubleData.m_traversalMode);
-
+
{
int numElem = quantizedBvhDoubleData.m_numSubtreeHeaders;
m_SubtreeHeaders.resize(numElem);
if (numElem)
{
btBvhSubtreeInfoData* memPtr = quantizedBvhDoubleData.m_subTreeInfoPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
- m_SubtreeHeaders[i].m_quantizedAabbMax[0] = memPtr->m_quantizedAabbMax[0] ;
+ m_SubtreeHeaders[i].m_quantizedAabbMax[0] = memPtr->m_quantizedAabbMax[0];
m_SubtreeHeaders[i].m_quantizedAabbMax[1] = memPtr->m_quantizedAabbMax[1];
m_SubtreeHeaders[i].m_quantizedAabbMax[2] = memPtr->m_quantizedAabbMax[2];
m_SubtreeHeaders[i].m_quantizedAabbMin[0] = memPtr->m_quantizedAabbMin[0];
@@ -1304,32 +1266,29 @@ void btQuantizedBvh::deSerializeDouble(struct btQuantizedBvhDoubleData& quantize
}
}
}
-
}
-
-
///fills the dataBuffer and returns the struct name (and 0 on failure)
-const char* btQuantizedBvh::serialize(void* dataBuffer, btSerializer* serializer) const
+const char* btQuantizedBvh::serialize(void* dataBuffer, btSerializer* serializer) const
{
btQuantizedBvhData* quantizedData = (btQuantizedBvhData*)dataBuffer;
-
+
m_bvhAabbMax.serialize(quantizedData->m_bvhAabbMax);
m_bvhAabbMin.serialize(quantizedData->m_bvhAabbMin);
m_bvhQuantization.serialize(quantizedData->m_bvhQuantization);
quantizedData->m_curNodeIndex = m_curNodeIndex;
quantizedData->m_useQuantization = m_useQuantization;
-
+
quantizedData->m_numContiguousLeafNodes = m_contiguousNodes.size();
- quantizedData->m_contiguousNodesPtr = (btOptimizedBvhNodeData*) (m_contiguousNodes.size() ? serializer->getUniquePointer((void*)&m_contiguousNodes[0]) : 0);
+ quantizedData->m_contiguousNodesPtr = (btOptimizedBvhNodeData*)(m_contiguousNodes.size() ? serializer->getUniquePointer((void*)&m_contiguousNodes[0]) : 0);
if (quantizedData->m_contiguousNodesPtr)
{
int sz = sizeof(btOptimizedBvhNodeData);
int numElem = m_contiguousNodes.size();
- btChunk* chunk = serializer->allocate(sz,numElem);
+ btChunk* chunk = serializer->allocate(sz, numElem);
btOptimizedBvhNodeData* memPtr = (btOptimizedBvhNodeData*)chunk->m_oldPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
m_contiguousNodes[i].m_aabbMaxOrg.serialize(memPtr->m_aabbMaxOrg);
m_contiguousNodes[i].m_aabbMinOrg.serialize(memPtr->m_aabbMinOrg);
@@ -1339,19 +1298,19 @@ const char* btQuantizedBvh::serialize(void* dataBuffer, btSerializer* serializer
// Fill padding with zeros to appease msan.
memset(memPtr->m_pad, 0, sizeof(memPtr->m_pad));
}
- serializer->finalizeChunk(chunk,"btOptimizedBvhNodeData",BT_ARRAY_CODE,(void*)&m_contiguousNodes[0]);
+ serializer->finalizeChunk(chunk, "btOptimizedBvhNodeData", BT_ARRAY_CODE, (void*)&m_contiguousNodes[0]);
}
quantizedData->m_numQuantizedContiguousNodes = m_quantizedContiguousNodes.size();
-// printf("quantizedData->m_numQuantizedContiguousNodes=%d\n",quantizedData->m_numQuantizedContiguousNodes);
- quantizedData->m_quantizedContiguousNodesPtr =(btQuantizedBvhNodeData*) (m_quantizedContiguousNodes.size() ? serializer->getUniquePointer((void*)&m_quantizedContiguousNodes[0]) : 0);
+ // printf("quantizedData->m_numQuantizedContiguousNodes=%d\n",quantizedData->m_numQuantizedContiguousNodes);
+ quantizedData->m_quantizedContiguousNodesPtr = (btQuantizedBvhNodeData*)(m_quantizedContiguousNodes.size() ? serializer->getUniquePointer((void*)&m_quantizedContiguousNodes[0]) : 0);
if (quantizedData->m_quantizedContiguousNodesPtr)
{
int sz = sizeof(btQuantizedBvhNodeData);
int numElem = m_quantizedContiguousNodes.size();
- btChunk* chunk = serializer->allocate(sz,numElem);
+ btChunk* chunk = serializer->allocate(sz, numElem);
btQuantizedBvhNodeData* memPtr = (btQuantizedBvhNodeData*)chunk->m_oldPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
memPtr->m_escapeIndexOrTriangleIndex = m_quantizedContiguousNodes[i].m_escapeIndexOrTriangleIndex;
memPtr->m_quantizedAabbMax[0] = m_quantizedContiguousNodes[i].m_quantizedAabbMax[0];
@@ -1361,20 +1320,20 @@ const char* btQuantizedBvh::serialize(void* dataBuffer, btSerializer* serializer
memPtr->m_quantizedAabbMin[1] = m_quantizedContiguousNodes[i].m_quantizedAabbMin[1];
memPtr->m_quantizedAabbMin[2] = m_quantizedContiguousNodes[i].m_quantizedAabbMin[2];
}
- serializer->finalizeChunk(chunk,"btQuantizedBvhNodeData",BT_ARRAY_CODE,(void*)&m_quantizedContiguousNodes[0]);
+ serializer->finalizeChunk(chunk, "btQuantizedBvhNodeData", BT_ARRAY_CODE, (void*)&m_quantizedContiguousNodes[0]);
}
quantizedData->m_traversalMode = int(m_traversalMode);
quantizedData->m_numSubtreeHeaders = m_SubtreeHeaders.size();
- quantizedData->m_subTreeInfoPtr = (btBvhSubtreeInfoData*) (m_SubtreeHeaders.size() ? serializer->getUniquePointer((void*)&m_SubtreeHeaders[0]) : 0);
+ quantizedData->m_subTreeInfoPtr = (btBvhSubtreeInfoData*)(m_SubtreeHeaders.size() ? serializer->getUniquePointer((void*)&m_SubtreeHeaders[0]) : 0);
if (quantizedData->m_subTreeInfoPtr)
{
int sz = sizeof(btBvhSubtreeInfoData);
int numElem = m_SubtreeHeaders.size();
- btChunk* chunk = serializer->allocate(sz,numElem);
+ btChunk* chunk = serializer->allocate(sz, numElem);
btBvhSubtreeInfoData* memPtr = (btBvhSubtreeInfoData*)chunk->m_oldPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
memPtr->m_quantizedAabbMax[0] = m_SubtreeHeaders[i].m_quantizedAabbMax[0];
memPtr->m_quantizedAabbMax[1] = m_SubtreeHeaders[i].m_quantizedAabbMax[1];
@@ -1386,12 +1345,7 @@ const char* btQuantizedBvh::serialize(void* dataBuffer, btSerializer* serializer
memPtr->m_rootNodeIndex = m_SubtreeHeaders[i].m_rootNodeIndex;
memPtr->m_subtreeSize = m_SubtreeHeaders[i].m_subtreeSize;
}
- serializer->finalizeChunk(chunk,"btBvhSubtreeInfoData",BT_ARRAY_CODE,(void*)&m_SubtreeHeaders[0]);
+ serializer->finalizeChunk(chunk, "btBvhSubtreeInfoData", BT_ARRAY_CODE, (void*)&m_SubtreeHeaders[0]);
}
return btQuantizedBvhDataName;
}
-
-
-
-
-
diff --git a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btQuantizedBvh.h b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btQuantizedBvh.h
index 3dd5ac9bb6..1c47b9ccf2 100644
--- a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btQuantizedBvh.h
+++ b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btQuantizedBvh.h
@@ -22,11 +22,11 @@ class btSerializer;
#ifdef DEBUG_CHECK_DEQUANTIZATION
#ifdef __SPU__
#define printf spu_printf
-#endif //__SPU__
+#endif //__SPU__
#include <stdio.h>
#include <stdlib.h>
-#endif //DEBUG_CHECK_DEQUANTIZATION
+#endif //DEBUG_CHECK_DEQUANTIZATION
#include "LinearMath/btVector3.h"
#include "LinearMath/btAlignedAllocator.h"
@@ -41,13 +41,10 @@ class btSerializer;
#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
+#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
@@ -55,15 +52,16 @@ class btSerializer;
///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
+ATTRIBUTE_ALIGNED16(struct)
+btQuantizedBvhNode
{
BT_DECLARE_ALIGNED_ALLOCATOR();
//12 bytes
- unsigned short int m_quantizedAabbMin[3];
- unsigned short int m_quantizedAabbMax[3];
+ unsigned short int m_quantizedAabbMin[3];
+ unsigned short int m_quantizedAabbMax[3];
//4 bytes
- int m_escapeIndexOrTriangleIndex;
+ int m_escapeIndexOrTriangleIndex;
bool isLeafNode() const
{
@@ -75,68 +73,67 @@ ATTRIBUTE_ALIGNED16 (struct) btQuantizedBvhNode
btAssert(!isLeafNode());
return -m_escapeIndexOrTriangleIndex;
}
- int getTriangleIndex() const
+ int getTriangleIndex() const
{
btAssert(isLeafNode());
- unsigned int x=0;
- unsigned int y = (~(x&0))<<(31-MAX_NUM_PARTS_IN_BITS);
+ 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));
+ return (m_escapeIndexOrTriangleIndex & ~(y));
}
- int getPartId() const
+ 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));
+ 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
+ATTRIBUTE_ALIGNED16(struct)
+btOptimizedBvhNode
{
BT_DECLARE_ALIGNED_ALLOCATOR();
//32 bytes
- btVector3 m_aabbMinOrg;
- btVector3 m_aabbMaxOrg;
+ btVector3 m_aabbMinOrg;
+ btVector3 m_aabbMaxOrg;
//4
- int m_escapeIndex;
+ int m_escapeIndex;
//8
//for child nodes
- int m_subPart;
- int m_triangleIndex;
+ int m_subPart;
+ int m_triangleIndex;
-//pad the size to 64 bytes
- char m_padding[20];
+ //pad the size to 64 bytes
+ char m_padding[20];
};
-
///btBvhSubtreeInfo provides info to gather a subtree of limited size
-ATTRIBUTE_ALIGNED16(class) btBvhSubtreeInfo
+ATTRIBUTE_ALIGNED16(class)
+btBvhSubtreeInfo
{
public:
BT_DECLARE_ALIGNED_ALLOCATOR();
//12 bytes
- unsigned short int m_quantizedAabbMin[3];
- unsigned short int m_quantizedAabbMax[3];
+ unsigned short int m_quantizedAabbMin[3];
+ unsigned short int m_quantizedAabbMax[3];
//4 bytes, points to the root of the subtree
- int m_rootNodeIndex;
+ int m_rootNodeIndex;
//4 bytes
- int m_subtreeSize;
- int m_padding[3];
+ int m_subtreeSize;
+ int m_padding[3];
btBvhSubtreeInfo()
{
//memset(&m_padding[0], 0, sizeof(m_padding));
}
-
- void setAabbFromQuantizeNode(const btQuantizedBvhNode& quantizedNode)
+ void setAabbFromQuantizeNode(const btQuantizedBvhNode& quantizedNode)
{
m_quantizedAabbMin[0] = quantizedNode.m_quantizedAabbMin[0];
m_quantizedAabbMin[1] = quantizedNode.m_quantizedAabbMin[1];
@@ -145,14 +142,12 @@ public:
m_quantizedAabbMax[1] = quantizedNode.m_quantizedAabbMax[1];
m_quantizedAabbMax[2] = quantizedNode.m_quantizedAabbMax[2];
}
-}
-;
-
+};
class btNodeOverlapCallback
{
public:
- virtual ~btNodeOverlapCallback() {};
+ virtual ~btNodeOverlapCallback(){};
virtual void processNode(int subPart, int triangleIndex) = 0;
};
@@ -160,18 +155,16 @@ public:
#include "LinearMath/btAlignedAllocator.h"
#include "LinearMath/btAlignedObjectArray.h"
-
-
///for code readability:
-typedef btAlignedObjectArray<btOptimizedBvhNode> NodeArray;
-typedef btAlignedObjectArray<btQuantizedBvhNode> QuantizedNodeArray;
-typedef btAlignedObjectArray<btBvhSubtreeInfo> BvhSubtreeInfoArray;
-
+typedef btAlignedObjectArray<btOptimizedBvhNode> NodeArray;
+typedef btAlignedObjectArray<btQuantizedBvhNode> QuantizedNodeArray;
+typedef btAlignedObjectArray<btBvhSubtreeInfo> 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
+ATTRIBUTE_ALIGNED16(class)
+btQuantizedBvh
{
public:
enum btTraversalMode
@@ -182,54 +175,47 @@ public:
};
protected:
+ btVector3 m_bvhAabbMin;
+ btVector3 m_bvhAabbMax;
+ btVector3 m_bvhQuantization;
+ int m_bulletVersion; //for serialization versioning. It could also be used to detect endianess.
- 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;
+ int m_curNodeIndex;
//quantization data
- bool m_useQuantization;
+ bool m_useQuantization;
+ NodeArray m_leafNodes;
+ NodeArray m_contiguousNodes;
+ QuantizedNodeArray m_quantizedLeafNodes;
+ QuantizedNodeArray m_quantizedContiguousNodes;
-
- NodeArray m_leafNodes;
- NodeArray m_contiguousNodes;
- QuantizedNodeArray m_quantizedLeafNodes;
- QuantizedNodeArray m_quantizedContiguousNodes;
-
- btTraversalMode m_traversalMode;
- BvhSubtreeInfoArray m_SubtreeHeaders;
+ 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)
+ void setInternalNodeAabbMin(int nodeIndex, const btVector3& aabbMin)
{
if (m_useQuantization)
{
- quantize(&m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMin[0] ,aabbMin,0);
- } else
+ quantize(&m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMin[0], aabbMin, 0);
+ }
+ else
{
m_contiguousNodes[nodeIndex].m_aabbMinOrg = aabbMin;
-
}
}
- void setInternalNodeAabbMax(int nodeIndex,const btVector3& aabbMax)
+ void setInternalNodeAabbMax(int nodeIndex, const btVector3& aabbMax)
{
if (m_useQuantization)
{
- quantize(&m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMax[0],aabbMax,1);
- } else
+ quantize(&m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMax[0], aabbMax, 1);
+ }
+ else
{
m_contiguousNodes[nodeIndex].m_aabbMaxOrg = aabbMax;
}
@@ -243,115 +229,102 @@ protected:
}
//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)
+ 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)
+ 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++)
+ 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
+ }
+ else
{
//non-quantized
m_contiguousNodes[nodeIndex].m_aabbMinOrg.setMin(newAabbMin);
- m_contiguousNodes[nodeIndex].m_aabbMaxOrg.setMax(newAabbMax);
+ m_contiguousNodes[nodeIndex].m_aabbMaxOrg.setMax(newAabbMax);
}
}
- void swapLeafNodes(int firstIndex,int secondIndex);
+ void swapLeafNodes(int firstIndex, int secondIndex);
- void assignInternalNodeFromLeafNode(int internalNode,int leafNodeIndex);
+ void assignInternalNodeFromLeafNode(int internalNode, int leafNodeIndex);
protected:
+ void buildTree(int startIndex, int endIndex);
-
+ int calcSplittingAxis(int startIndex, int endIndex);
- void buildTree (int startIndex,int endIndex);
+ int sortAndCalcSplittingIndex(int startIndex, int endIndex, int splitAxis);
- int calcSplittingAxis(int startIndex,int endIndex);
+ void walkStacklessTree(btNodeOverlapCallback * nodeCallback, const btVector3& aabbMin, const btVector3& aabbMax) const;
- 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;
+ 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;
+ 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;
+ 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 walkRecursiveQuantizedTreeAgainstQuantizedTree(const btQuantizedBvhNode* treeNodeA, const btQuantizedBvhNode* treeNodeB, btNodeOverlapCallback* nodeCallback) const;
-
-
- void updateSubtreeHeaders(int leftChildNodexIndex,int rightChildNodexIndex);
+ 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; }
+ 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();
+ 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;
+ 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
+ SIMD_FORCE_INLINE void quantize(unsigned short* out, const btVector3& point, int isMax) const
{
-
btAssert(m_useQuantization);
btAssert(point.getX() <= m_bvhAabbMax.getX());
@@ -368,122 +341,114 @@ public:
///@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() + 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));
+ 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());
+ 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());
+ 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());
+ printf("unconservative Z, diffZ = %f, oldZ=%f,newZ=%f\n", newPoint.getZ() - point.getZ(), newPoint.getZ(), point.getZ());
}
- } else
+ }
+ else
{
if (newPoint.getX() > point.getX())
{
- printf("unconservative X, diffX = %f, oldX=%f,newX=%f\n",newPoint.getX()-point.getX(), 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());
+ 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());
+ printf("unconservative Z, diffZ = %f, oldZ=%f,newZ=%f\n", newPoint.getZ() - point.getZ(), newPoint.getZ(), point.getZ());
}
}
-#endif //DEBUG_CHECK_DEQUANTIZATION
-
+#endif //DEBUG_CHECK_DEQUANTIZATION
}
-
- SIMD_FORCE_INLINE void quantizeWithClamp(unsigned short* out, const btVector3& point2,int isMax) const
+ 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);
-
+ quantize(out, clampedPoint, isMax);
}
-
- SIMD_FORCE_INLINE btVector3 unQuantize(const unsigned short* vecIn) const
+
+ SIMD_FORCE_INLINE btVector3 unQuantize(const unsigned short* vecIn) const
{
- btVector3 vecOut;
- vecOut.setValue(
+ 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;
+ 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)
+ void setTraversalMode(btTraversalMode traversalMode)
{
m_traversalMode = traversalMode;
}
-
- SIMD_FORCE_INLINE QuantizedNodeArray& getQuantizedNodeArray()
- {
- return m_quantizedContiguousNodes;
+ SIMD_FORCE_INLINE QuantizedNodeArray& getQuantizedNodeArray()
+ {
+ return m_quantizedContiguousNodes;
}
-
- SIMD_FORCE_INLINE BvhSubtreeInfoArray& getSubtreeInfoArray()
+ 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;
+ 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 btQuantizedBvh* deSerializeInPlace(void* i_alignedDataBuffer, unsigned int i_dataBufferSize, bool i_swapEndian);
static unsigned int getAlignmentSerializationPadding();
-//////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////
-
- virtual int calculateSerializeBufferSizeNew() const;
+ 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 const char* serialize(void* dataBuffer, btSerializer* serializer) const;
- virtual void deSerializeDouble(struct btQuantizedBvhDoubleData& quantizedBvhDoubleData);
+ virtual void deSerializeFloat(struct btQuantizedBvhFloatData & quantizedBvhFloatData);
+ virtual void deSerializeDouble(struct btQuantizedBvhDoubleData & quantizedBvhDoubleData);
-////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////
SIMD_FORCE_INLINE bool isQuantized()
{
@@ -494,38 +459,37 @@ 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);
-
-}
-;
-
+ btQuantizedBvh(btQuantizedBvh & other, bool ownsMemory);
+};
-struct btBvhSubtreeInfoData
+// clang-format off
+// parser needs * with the name
+struct btBvhSubtreeInfoData
{
- int m_rootNodeIndex;
- int m_subtreeSize;
+ 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;
+ 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];
+ btVector3DoubleData m_aabbMinOrg;
+ btVector3DoubleData m_aabbMaxOrg;
+ int m_escapeIndex;
+ int m_subPart;
+ int m_triangleIndex;
+ char m_pad[4];
};
@@ -569,13 +533,11 @@ struct btQuantizedBvhDoubleData
int m_numSubtreeHeaders;
btBvhSubtreeInfoData *m_subTreeInfoPtr;
};
+// clang-format on
-
-SIMD_FORCE_INLINE int btQuantizedBvh::calculateSerializeBufferSizeNew() const
+SIMD_FORCE_INLINE int btQuantizedBvh::calculateSerializeBufferSizeNew() const
{
return sizeof(btQuantizedBvhData);
}
-
-
-#endif //BT_QUANTIZED_BVH_H
+#endif //BT_QUANTIZED_BVH_H
diff --git a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp
index 5f89f960e8..166cf771fe 100644
--- a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp
+++ b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp
@@ -24,50 +24,45 @@ subject to the following restrictions:
#include <new>
-void btSimpleBroadphase::validate()
+void btSimpleBroadphase::validate()
{
- for (int i=0;i<m_numHandles;i++)
+ for (int i = 0; i < m_numHandles; i++)
{
- for (int j=i+1;j<m_numHandles;j++)
+ for (int j = i + 1; j < m_numHandles; j++)
{
btAssert(&m_pHandles[i] != &m_pHandles[j]);
}
}
-
}
btSimpleBroadphase::btSimpleBroadphase(int maxProxies, btOverlappingPairCache* overlappingPairCache)
- :m_pairCache(overlappingPairCache),
- m_ownsPairCache(false),
- m_invalidPair(0)
+ : m_pairCache(overlappingPairCache),
+ m_ownsPairCache(false),
+ m_invalidPair(0)
{
-
if (!overlappingPairCache)
{
- void* mem = btAlignedAlloc(sizeof(btHashedOverlappingPairCache),16);
- m_pairCache = new (mem)btHashedOverlappingPairCache();
+ void* mem = btAlignedAlloc(sizeof(btHashedOverlappingPairCache), 16);
+ m_pairCache = new (mem) btHashedOverlappingPairCache();
m_ownsPairCache = true;
}
// allocate handles buffer and put all handles on free list
- m_pHandlesRawPtr = btAlignedAlloc(sizeof(btSimpleBroadphaseProxy)*maxProxies,16);
- m_pHandles = new(m_pHandlesRawPtr) btSimpleBroadphaseProxy[maxProxies];
+ m_pHandlesRawPtr = btAlignedAlloc(sizeof(btSimpleBroadphaseProxy) * maxProxies, 16);
+ m_pHandles = new (m_pHandlesRawPtr) btSimpleBroadphaseProxy[maxProxies];
m_maxHandles = maxProxies;
m_numHandles = 0;
m_firstFreeHandle = 0;
m_LastHandleIndex = -1;
-
{
for (int i = m_firstFreeHandle; i < maxProxies; i++)
{
m_pHandles[i].SetNextFree(i + 1);
- m_pHandles[i].m_uniqueId = i+2;//any UID will do, we just avoid too trivial values (0,1) for debugging purposes
+ m_pHandles[i].m_uniqueId = i + 2; //any UID will do, we just avoid too trivial values (0,1) for debugging purposes
}
m_pHandles[maxProxies - 1].SetNextFree(0);
-
}
-
}
btSimpleBroadphase::~btSimpleBroadphase()
@@ -81,26 +76,25 @@ btSimpleBroadphase::~btSimpleBroadphase()
}
}
-
-btBroadphaseProxy* btSimpleBroadphase::createProxy( const btVector3& aabbMin, const btVector3& aabbMax,int shapeType,void* userPtr , int collisionFilterGroup, int collisionFilterMask, btDispatcher* /*dispatcher*/)
+btBroadphaseProxy* btSimpleBroadphase::createProxy(const btVector3& aabbMin, const btVector3& aabbMax, int shapeType, void* userPtr, int collisionFilterGroup, int collisionFilterMask, btDispatcher* /*dispatcher*/)
{
if (m_numHandles >= m_maxHandles)
{
btAssert(0);
- return 0; //should never happen, but don't let the game crash ;-)
+ return 0; //should never happen, but don't let the game crash ;-)
}
- btAssert(aabbMin[0]<= aabbMax[0] && aabbMin[1]<= aabbMax[1] && aabbMin[2]<= aabbMax[2]);
+ btAssert(aabbMin[0] <= aabbMax[0] && aabbMin[1] <= aabbMax[1] && aabbMin[2] <= aabbMax[2]);
int newHandleIndex = allocHandle();
- btSimpleBroadphaseProxy* proxy = new (&m_pHandles[newHandleIndex])btSimpleBroadphaseProxy(aabbMin,aabbMax,shapeType,userPtr,collisionFilterGroup,collisionFilterMask);
+ btSimpleBroadphaseProxy* proxy = new (&m_pHandles[newHandleIndex]) btSimpleBroadphaseProxy(aabbMin, aabbMax, shapeType, userPtr, collisionFilterGroup, collisionFilterMask);
return proxy;
}
-class RemovingOverlapCallback : public btOverlapCallback
+class RemovingOverlapCallback : public btOverlapCallback
{
protected:
- virtual bool processOverlap(btBroadphasePair& pair)
+ virtual bool processOverlap(btBroadphasePair& pair)
{
(void)pair;
btAssert(0);
@@ -110,12 +104,13 @@ protected:
class RemovePairContainingProxy
{
+ btBroadphaseProxy* m_targetProxy;
- btBroadphaseProxy* m_targetProxy;
- public:
+public:
virtual ~RemovePairContainingProxy()
{
}
+
protected:
virtual bool processOverlap(btBroadphasePair& pair)
{
@@ -126,38 +121,36 @@ protected:
};
};
-void btSimpleBroadphase::destroyProxy(btBroadphaseProxy* proxyOrg,btDispatcher* dispatcher)
+void btSimpleBroadphase::destroyProxy(btBroadphaseProxy* proxyOrg, btDispatcher* dispatcher)
{
-
- btSimpleBroadphaseProxy* proxy0 = static_cast<btSimpleBroadphaseProxy*>(proxyOrg);
- freeHandle(proxy0);
+ btSimpleBroadphaseProxy* proxy0 = static_cast<btSimpleBroadphaseProxy*>(proxyOrg);
+ freeHandle(proxy0);
- m_pairCache->removeOverlappingPairsContainingProxy(proxyOrg,dispatcher);
+ m_pairCache->removeOverlappingPairsContainingProxy(proxyOrg, dispatcher);
- //validate();
-
+ //validate();
}
-void btSimpleBroadphase::getAabb(btBroadphaseProxy* proxy,btVector3& aabbMin, btVector3& aabbMax ) const
+void btSimpleBroadphase::getAabb(btBroadphaseProxy* proxy, btVector3& aabbMin, btVector3& aabbMax) const
{
const btSimpleBroadphaseProxy* sbp = getSimpleProxyFromProxy(proxy);
aabbMin = sbp->m_aabbMin;
aabbMax = sbp->m_aabbMax;
}
-void btSimpleBroadphase::setAabb(btBroadphaseProxy* proxy,const btVector3& aabbMin,const btVector3& aabbMax, btDispatcher* /*dispatcher*/)
+void btSimpleBroadphase::setAabb(btBroadphaseProxy* proxy, const btVector3& aabbMin, const btVector3& aabbMax, btDispatcher* /*dispatcher*/)
{
btSimpleBroadphaseProxy* sbp = getSimpleProxyFromProxy(proxy);
sbp->m_aabbMin = aabbMin;
sbp->m_aabbMax = aabbMax;
}
-void btSimpleBroadphase::rayTest(const btVector3& rayFrom,const btVector3& rayTo, btBroadphaseRayCallback& rayCallback, const btVector3& aabbMin,const btVector3& aabbMax)
+void btSimpleBroadphase::rayTest(const btVector3& rayFrom, const btVector3& rayTo, btBroadphaseRayCallback& rayCallback, const btVector3& aabbMin, const btVector3& aabbMax)
{
- for (int i=0; i <= m_LastHandleIndex; i++)
+ for (int i = 0; i <= m_LastHandleIndex; i++)
{
btSimpleBroadphaseProxy* proxy = &m_pHandles[i];
- if(!proxy->m_clientObject)
+ if (!proxy->m_clientObject)
{
continue;
}
@@ -165,69 +158,59 @@ void btSimpleBroadphase::rayTest(const btVector3& rayFrom,const btVector3& rayTo
}
}
-
-void btSimpleBroadphase::aabbTest(const btVector3& aabbMin, const btVector3& aabbMax, btBroadphaseAabbCallback& callback)
+void btSimpleBroadphase::aabbTest(const btVector3& aabbMin, const btVector3& aabbMax, btBroadphaseAabbCallback& callback)
{
- for (int i=0; i <= m_LastHandleIndex; i++)
+ for (int i = 0; i <= m_LastHandleIndex; i++)
{
btSimpleBroadphaseProxy* proxy = &m_pHandles[i];
- if(!proxy->m_clientObject)
+ if (!proxy->m_clientObject)
{
continue;
}
- if (TestAabbAgainstAabb2(aabbMin,aabbMax,proxy->m_aabbMin,proxy->m_aabbMax))
+ if (TestAabbAgainstAabb2(aabbMin, aabbMax, proxy->m_aabbMin, proxy->m_aabbMax))
{
callback.process(proxy);
}
}
}
-
-
-
-
-
-
-bool btSimpleBroadphase::aabbOverlap(btSimpleBroadphaseProxy* proxy0,btSimpleBroadphaseProxy* proxy1)
+bool btSimpleBroadphase::aabbOverlap(btSimpleBroadphaseProxy* proxy0, btSimpleBroadphaseProxy* proxy1)
{
- return proxy0->m_aabbMin[0] <= proxy1->m_aabbMax[0] && proxy1->m_aabbMin[0] <= proxy0->m_aabbMax[0] &&
+ return proxy0->m_aabbMin[0] <= proxy1->m_aabbMax[0] && proxy1->m_aabbMin[0] <= proxy0->m_aabbMax[0] &&
proxy0->m_aabbMin[1] <= proxy1->m_aabbMax[1] && proxy1->m_aabbMin[1] <= proxy0->m_aabbMax[1] &&
proxy0->m_aabbMin[2] <= proxy1->m_aabbMax[2] && proxy1->m_aabbMin[2] <= proxy0->m_aabbMax[2];
-
}
-
-
//then remove non-overlapping ones
class CheckOverlapCallback : public btOverlapCallback
{
public:
virtual bool processOverlap(btBroadphasePair& pair)
{
- return (!btSimpleBroadphase::aabbOverlap(static_cast<btSimpleBroadphaseProxy*>(pair.m_pProxy0),static_cast<btSimpleBroadphaseProxy*>(pair.m_pProxy1)));
+ return (!btSimpleBroadphase::aabbOverlap(static_cast<btSimpleBroadphaseProxy*>(pair.m_pProxy0), static_cast<btSimpleBroadphaseProxy*>(pair.m_pProxy1)));
}
};
-void btSimpleBroadphase::calculateOverlappingPairs(btDispatcher* dispatcher)
+void btSimpleBroadphase::calculateOverlappingPairs(btDispatcher* dispatcher)
{
//first check for new overlapping pairs
- int i,j;
+ int i, j;
if (m_numHandles >= 0)
{
int new_largest_index = -1;
- for (i=0; i <= m_LastHandleIndex; i++)
+ for (i = 0; i <= m_LastHandleIndex; i++)
{
btSimpleBroadphaseProxy* proxy0 = &m_pHandles[i];
- if(!proxy0->m_clientObject)
+ if (!proxy0->m_clientObject)
{
continue;
}
new_largest_index = i;
- for (j=i+1; j <= m_LastHandleIndex; j++)
+ for (j = i + 1; j <= m_LastHandleIndex; j++)
{
btSimpleBroadphaseProxy* proxy1 = &m_pHandles[j];
btAssert(proxy0 != proxy1);
- if(!proxy1->m_clientObject)
+ if (!proxy1->m_clientObject)
{
continue;
}
@@ -235,19 +218,20 @@ void btSimpleBroadphase::calculateOverlappingPairs(btDispatcher* dispatcher)
btSimpleBroadphaseProxy* p0 = getSimpleProxyFromProxy(proxy0);
btSimpleBroadphaseProxy* p1 = getSimpleProxyFromProxy(proxy1);
- if (aabbOverlap(p0,p1))
+ if (aabbOverlap(p0, p1))
{
- if ( !m_pairCache->findPair(proxy0,proxy1))
+ if (!m_pairCache->findPair(proxy0, proxy1))
{
- m_pairCache->addOverlappingPair(proxy0,proxy1);
+ m_pairCache->addOverlappingPair(proxy0, proxy1);
}
- } else
+ }
+ else
{
if (!m_pairCache->hasDeferredRemoval())
{
- if ( m_pairCache->findPair(proxy0,proxy1))
+ if (m_pairCache->findPair(proxy0, proxy1))
{
- m_pairCache->removeOverlappingPair(proxy0,proxy1,dispatcher);
+ m_pairCache->removeOverlappingPair(proxy0, proxy1, dispatcher);
}
}
}
@@ -258,8 +242,7 @@ void btSimpleBroadphase::calculateOverlappingPairs(btDispatcher* dispatcher)
if (m_ownsPairCache && m_pairCache->hasDeferredRemoval())
{
-
- btBroadphasePairArray& overlappingPairArray = m_pairCache->getOverlappingPairArray();
+ btBroadphasePairArray& overlappingPairArray = m_pairCache->getOverlappingPairArray();
//perform a sort, to find duplicates and to sort 'invalid' pairs to the end
overlappingPairArray.quickSort(btBroadphasePairSortPredicate());
@@ -267,16 +250,13 @@ void btSimpleBroadphase::calculateOverlappingPairs(btDispatcher* dispatcher)
overlappingPairArray.resize(overlappingPairArray.size() - m_invalidPair);
m_invalidPair = 0;
-
btBroadphasePair previousPair;
previousPair.m_pProxy0 = 0;
previousPair.m_pProxy1 = 0;
previousPair.m_algorithm = 0;
-
- for (i=0;i<overlappingPairArray.size();i++)
+ for (i = 0; i < overlappingPairArray.size(); i++)
{
-
btBroadphasePair& pair = overlappingPairArray[i];
bool isDuplicate = (pair == previousPair);
@@ -287,16 +267,18 @@ void btSimpleBroadphase::calculateOverlappingPairs(btDispatcher* dispatcher)
if (!isDuplicate)
{
- bool hasOverlap = testAabbOverlap(pair.m_pProxy0,pair.m_pProxy1);
+ bool hasOverlap = testAabbOverlap(pair.m_pProxy0, pair.m_pProxy1);
if (hasOverlap)
{
- needsRemoval = false;//callback->processOverlap(pair);
- } else
+ needsRemoval = false; //callback->processOverlap(pair);
+ }
+ else
{
needsRemoval = true;
}
- } else
+ }
+ else
{
//remove duplicate
needsRemoval = true;
@@ -306,7 +288,7 @@ void btSimpleBroadphase::calculateOverlappingPairs(btDispatcher* dispatcher)
if (needsRemoval)
{
- m_pairCache->cleanOverlappingPair(pair,dispatcher);
+ m_pairCache->cleanOverlappingPair(pair, dispatcher);
// m_overlappingPairArray.swap(i,m_overlappingPairArray.size()-1);
// m_overlappingPairArray.pop_back();
@@ -314,7 +296,6 @@ void btSimpleBroadphase::calculateOverlappingPairs(btDispatcher* dispatcher)
pair.m_pProxy1 = 0;
m_invalidPair++;
}
-
}
///if you don't like to skip the invalid pairs in the array, execute following code:
@@ -326,21 +307,19 @@ void btSimpleBroadphase::calculateOverlappingPairs(btDispatcher* dispatcher)
overlappingPairArray.resize(overlappingPairArray.size() - m_invalidPair);
m_invalidPair = 0;
-#endif//CLEAN_INVALID_PAIRS
-
+#endif //CLEAN_INVALID_PAIRS
}
}
}
-
-bool btSimpleBroadphase::testAabbOverlap(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1)
+bool btSimpleBroadphase::testAabbOverlap(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1)
{
btSimpleBroadphaseProxy* p0 = getSimpleProxyFromProxy(proxy0);
btSimpleBroadphaseProxy* p1 = getSimpleProxyFromProxy(proxy1);
- return aabbOverlap(p0,p1);
+ return aabbOverlap(p0, p1);
}
-void btSimpleBroadphase::resetPool(btDispatcher* dispatcher)
+void btSimpleBroadphase::resetPool(btDispatcher* dispatcher)
{
//not yet
}
diff --git a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btSimpleBroadphase.h b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btSimpleBroadphase.h
index d7a18e400a..3e02fdc003 100644
--- a/thirdparty/bullet/BulletCollision/BroadphaseCollision/btSimpleBroadphase.h
+++ b/thirdparty/bullet/BulletCollision/BroadphaseCollision/btSimpleBroadphase.h
@@ -16,57 +16,47 @@ subject to the following restrictions:
#ifndef BT_SIMPLE_BROADPHASE_H
#define BT_SIMPLE_BROADPHASE_H
-
#include "btOverlappingPairCache.h"
-
struct btSimpleBroadphaseProxy : public btBroadphaseProxy
{
- int m_nextFree;
-
-// int m_handleId;
+ int m_nextFree;
-
- btSimpleBroadphaseProxy() {};
+ // int m_handleId;
- btSimpleBroadphaseProxy(const btVector3& minpt,const btVector3& maxpt,int shapeType,void* userPtr, int collisionFilterGroup, int collisionFilterMask)
- :btBroadphaseProxy(minpt,maxpt,userPtr,collisionFilterGroup,collisionFilterMask)
+ 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;}
-
-
-
+ 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;
- int m_numHandles; // number of active handles
- int m_maxHandles; // max number of handles
- int m_LastHandleIndex;
-
- btSimpleBroadphaseProxy* m_pHandles; // handles pool
+ btSimpleBroadphaseProxy* m_pHandles; // handles pool
void* m_pHandlesRawPtr;
- int m_firstFreeHandle; // free handles list
-
+ 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)
+ if (freeHandle > m_LastHandleIndex)
{
m_LastHandleIndex = freeHandle;
}
@@ -75,9 +65,9 @@ protected:
void freeHandle(btSimpleBroadphaseProxy* proxy)
{
- int handle = int(proxy-m_pHandles);
+ int handle = int(proxy - m_pHandles);
btAssert(handle >= 0 && handle < m_maxHandles);
- if(handle == m_LastHandleIndex)
+ if (handle == m_LastHandleIndex)
{
m_LastHandleIndex--;
}
@@ -89,20 +79,18 @@ protected:
m_numHandles--;
}
- btOverlappingPairCache* m_pairCache;
- bool m_ownsPairCache;
+ btOverlappingPairCache* m_pairCache;
+ bool m_ownsPairCache;
- int m_invalidPair;
+ int m_invalidPair;
-
-
- inline btSimpleBroadphaseProxy* getSimpleProxyFromProxy(btBroadphaseProxy* proxy)
+ inline btSimpleBroadphaseProxy* getSimpleProxyFromProxy(btBroadphaseProxy* proxy)
{
btSimpleBroadphaseProxy* proxy0 = static_cast<btSimpleBroadphaseProxy*>(proxy);
return proxy0;
}
- inline const btSimpleBroadphaseProxy* getSimpleProxyFromProxy(btBroadphaseProxy* proxy) const
+ inline const btSimpleBroadphaseProxy* getSimpleProxyFromProxy(btBroadphaseProxy* proxy) const
{
const btSimpleBroadphaseProxy* proxy0 = static_cast<const btSimpleBroadphaseProxy*>(proxy);
return proxy0;
@@ -111,61 +99,50 @@ protected:
///reset broadphase internal structures, to ensure determinism/reproducability
virtual void resetPool(btDispatcher* dispatcher);
-
- void validate();
+ void validate();
protected:
-
-
-
-
public:
- btSimpleBroadphase(int maxProxies=16384,btOverlappingPairCache* overlappingPairCache=0);
+ btSimpleBroadphase(int maxProxies = 16384, btOverlappingPairCache* overlappingPairCache = 0);
virtual ~btSimpleBroadphase();
+ static bool aabbOverlap(btSimpleBroadphaseProxy* proxy0, btSimpleBroadphaseProxy* proxy1);
- 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 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 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 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);
- 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()
+ btOverlappingPairCache* getOverlappingPairCache()
{
return m_pairCache;
}
- const btOverlappingPairCache* getOverlappingPairCache() const
+ const btOverlappingPairCache* getOverlappingPairCache() const
{
return m_pairCache;
}
- bool testAabbOverlap(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1);
-
+ 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
+ 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);
+ 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()
+ virtual void printStats()
{
-// printf("btSimpleBroadphase.h\n");
-// printf("numHandles = %d, maxHandles = %d\n",m_numHandles,m_maxHandles);
+ // printf("btSimpleBroadphase.h\n");
+ // printf("numHandles = %d, maxHandles = %d\n",m_numHandles,m_maxHandles);
}
};
-
-
-#endif //BT_SIMPLE_BROADPHASE_H
-
+#endif //BT_SIMPLE_BROADPHASE_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/SphereTriangleDetector.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/SphereTriangleDetector.cpp
index e5bac8438e..7647f67360 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/SphereTriangleDetector.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/SphereTriangleDetector.cpp
@@ -18,94 +18,95 @@ subject to the following restrictions:
#include "BulletCollision/CollisionShapes/btTriangleShape.h"
#include "BulletCollision/CollisionShapes/btSphereShape.h"
-
-SphereTriangleDetector::SphereTriangleDetector(btSphereShape* sphere,btTriangleShape* triangle,btScalar contactBreakingThreshold)
-:m_sphere(sphere),
-m_triangle(triangle),
-m_contactBreakingThreshold(contactBreakingThreshold)
+SphereTriangleDetector::SphereTriangleDetector(btSphereShape* sphere, btTriangleShape* triangle, btScalar contactBreakingThreshold)
+ : m_sphere(sphere),
+ m_triangle(triangle),
+ m_contactBreakingThreshold(contactBreakingThreshold)
{
-
}
-void SphereTriangleDetector::getClosestPoints(const ClosestPointInput& input,Result& output,class btIDebugDraw* debugDraw,bool swapResults)
+void SphereTriangleDetector::getClosestPoints(const ClosestPointInput& input, Result& output, class btIDebugDraw* debugDraw, bool swapResults)
{
-
(void)debugDraw;
const btTransform& transformA = input.m_transformA;
const btTransform& transformB = input.m_transformB;
- btVector3 point,normal;
+ btVector3 point, normal;
btScalar timeOfImpact = btScalar(1.);
btScalar depth = btScalar(0.);
-// output.m_distance = btScalar(BT_LARGE_FLOAT);
+ // output.m_distance = btScalar(BT_LARGE_FLOAT);
//move sphere into triangle space
- btTransform sphereInTr = transformB.inverseTimes(transformA);
+ btTransform sphereInTr = transformB.inverseTimes(transformA);
- if (collide(sphereInTr.getOrigin(),point,normal,depth,timeOfImpact,m_contactBreakingThreshold))
+ if (collide(sphereInTr.getOrigin(), point, normal, depth, timeOfImpact, m_contactBreakingThreshold))
{
if (swapResults)
{
- btVector3 normalOnB = transformB.getBasis()*normal;
+ btVector3 normalOnB = transformB.getBasis() * normal;
btVector3 normalOnA = -normalOnB;
- btVector3 pointOnA = transformB*point+normalOnB*depth;
- output.addContactPoint(normalOnA,pointOnA,depth);
- } else
+ btVector3 pointOnA = transformB * point + normalOnB * depth;
+ output.addContactPoint(normalOnA, pointOnA, depth);
+ }
+ else
{
- output.addContactPoint(transformB.getBasis()*normal,transformB*point,depth);
+ output.addContactPoint(transformB.getBasis() * normal, transformB * point, depth);
}
}
-
}
-
-
// See also geometrictools.com
// Basic idea: D = |p - (lo + t0*lv)| where t0 = lv . (p - lo) / lv . lv
-btScalar SegmentSqrDistance(const btVector3& from, const btVector3& to,const btVector3 &p, btVector3 &nearest);
+btScalar SegmentSqrDistance(const btVector3& from, const btVector3& to, const btVector3& p, btVector3& nearest);
-btScalar SegmentSqrDistance(const btVector3& from, const btVector3& to,const btVector3 &p, btVector3 &nearest) {
+btScalar SegmentSqrDistance(const btVector3& from, const btVector3& to, const btVector3& p, btVector3& nearest)
+{
btVector3 diff = p - from;
btVector3 v = to - from;
btScalar t = v.dot(diff);
-
- if (t > 0) {
+
+ if (t > 0)
+ {
btScalar dotVV = v.dot(v);
- if (t < dotVV) {
+ if (t < dotVV)
+ {
t /= dotVV;
- diff -= t*v;
- } else {
+ diff -= t * v;
+ }
+ else
+ {
t = 1;
diff -= v;
}
- } else
+ }
+ else
t = 0;
- nearest = from + t*v;
- return diff.dot(diff);
+ nearest = from + t * v;
+ return diff.dot(diff);
}
-bool SphereTriangleDetector::facecontains(const btVector3 &p,const btVector3* vertices,btVector3& normal) {
+bool SphereTriangleDetector::facecontains(const btVector3& p, const btVector3* vertices, btVector3& normal)
+{
btVector3 lp(p);
btVector3 lnormal(normal);
-
+
return pointInTriangle(vertices, lnormal, &lp);
}
-bool SphereTriangleDetector::collide(const btVector3& sphereCenter,btVector3 &point, btVector3& resultNormal, btScalar& depth, btScalar &timeOfImpact, btScalar contactBreakingThreshold)
+bool SphereTriangleDetector::collide(const btVector3& sphereCenter, btVector3& point, btVector3& resultNormal, btScalar& depth, btScalar& timeOfImpact, btScalar contactBreakingThreshold)
{
-
const btVector3* vertices = &m_triangle->getVertexPtr(0);
-
+
btScalar radius = m_sphere->getRadius();
btScalar radiusWithThreshold = radius + contactBreakingThreshold;
- btVector3 normal = (vertices[1]-vertices[0]).cross(vertices[2]-vertices[0]);
+ btVector3 normal = (vertices[1] - vertices[0]).cross(vertices[2] - vertices[0]);
btScalar l2 = normal.length2();
bool hasContact = false;
btVector3 contactPoint;
- if (l2 >= SIMD_EPSILON*SIMD_EPSILON)
+ if (l2 >= SIMD_EPSILON * SIMD_EPSILON)
{
normal /= btSqrt(l2);
@@ -120,54 +121,59 @@ bool SphereTriangleDetector::collide(const btVector3& sphereCenter,btVector3 &po
}
bool isInsideContactPlane = distanceFromPlane < radiusWithThreshold;
-
+
// Check for contact / intersection
-
- if (isInsideContactPlane) {
- if (facecontains(sphereCenter, vertices, normal)) {
+
+ if (isInsideContactPlane)
+ {
+ if (facecontains(sphereCenter, vertices, normal))
+ {
// Inside the contact wedge - touches a point on the shell plane
hasContact = true;
- contactPoint = sphereCenter - normal*distanceFromPlane;
+ contactPoint = sphereCenter - normal * distanceFromPlane;
}
- else {
+ else
+ {
// Could be inside one of the contact capsules
- btScalar contactCapsuleRadiusSqr = radiusWithThreshold*radiusWithThreshold;
+ btScalar contactCapsuleRadiusSqr = radiusWithThreshold * radiusWithThreshold;
btScalar minDistSqr = contactCapsuleRadiusSqr;
btVector3 nearestOnEdge;
- for (int i = 0; i < m_triangle->getNumEdges(); i++) {
-
+ for (int i = 0; i < m_triangle->getNumEdges(); i++)
+ {
btVector3 pa;
btVector3 pb;
m_triangle->getEdge(i, pa, pb);
btScalar distanceSqr = SegmentSqrDistance(pa, pb, sphereCenter, nearestOnEdge);
- if (distanceSqr < minDistSqr) {
+ if (distanceSqr < minDistSqr)
+ {
// Yep, we're inside a capsule, and record the capsule with smallest distance
minDistSqr = distanceSqr;
hasContact = true;
contactPoint = nearestOnEdge;
}
-
}
}
}
}
- if (hasContact) {
+ if (hasContact)
+ {
btVector3 contactToCentre = sphereCenter - contactPoint;
btScalar distanceSqr = contactToCentre.length2();
- if (distanceSqr < radiusWithThreshold*radiusWithThreshold)
+ if (distanceSqr < radiusWithThreshold * radiusWithThreshold)
{
- if (distanceSqr>SIMD_EPSILON)
+ if (distanceSqr > SIMD_EPSILON)
{
btScalar distance = btSqrt(distanceSqr);
resultNormal = contactToCentre;
resultNormal.normalize();
point = contactPoint;
- depth = -(radius-distance);
- } else
+ depth = -(radius - distance);
+ }
+ else
{
resultNormal = normal;
point = contactPoint;
@@ -176,36 +182,34 @@ bool SphereTriangleDetector::collide(const btVector3& sphereCenter,btVector3 &po
return true;
}
}
-
+
return false;
}
-
-bool SphereTriangleDetector::pointInTriangle(const btVector3 vertices[], const btVector3 &normal, btVector3 *p )
+bool SphereTriangleDetector::pointInTriangle(const btVector3 vertices[], const btVector3& normal, btVector3* p)
{
const btVector3* p1 = &vertices[0];
const btVector3* p2 = &vertices[1];
const btVector3* p3 = &vertices[2];
- btVector3 edge1( *p2 - *p1 );
- btVector3 edge2( *p3 - *p2 );
- btVector3 edge3( *p1 - *p3 );
+ btVector3 edge1(*p2 - *p1);
+ btVector3 edge2(*p3 - *p2);
+ btVector3 edge3(*p1 - *p3);
+
+ btVector3 p1_to_p(*p - *p1);
+ btVector3 p2_to_p(*p - *p2);
+ btVector3 p3_to_p(*p - *p3);
- btVector3 p1_to_p( *p - *p1 );
- btVector3 p2_to_p( *p - *p2 );
- btVector3 p3_to_p( *p - *p3 );
+ btVector3 edge1_normal(edge1.cross(normal));
+ btVector3 edge2_normal(edge2.cross(normal));
+ btVector3 edge3_normal(edge3.cross(normal));
- btVector3 edge1_normal( edge1.cross(normal));
- btVector3 edge2_normal( edge2.cross(normal));
- btVector3 edge3_normal( edge3.cross(normal));
-
btScalar r1, r2, r3;
- r1 = edge1_normal.dot( p1_to_p );
- r2 = edge2_normal.dot( p2_to_p );
- r3 = edge3_normal.dot( p3_to_p );
- if ( ( r1 > 0 && r2 > 0 && r3 > 0 ) ||
- ( r1 <= 0 && r2 <= 0 && r3 <= 0 ) )
+ r1 = edge1_normal.dot(p1_to_p);
+ r2 = edge2_normal.dot(p2_to_p);
+ r3 = edge3_normal.dot(p3_to_p);
+ if ((r1 > 0 && r2 > 0 && r3 > 0) ||
+ (r1 <= 0 && r2 <= 0 && r3 <= 0))
return true;
return false;
-
}
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/SphereTriangleDetector.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/SphereTriangleDetector.h
index 22953af43f..d47e47530d 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/SphereTriangleDetector.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/SphereTriangleDetector.h
@@ -18,34 +18,26 @@ subject to the following restrictions:
#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);
+ virtual void getClosestPoints(const ClosestPointInput& input, Result& output, class btIDebugDraw* debugDraw, bool swapResults = false);
- SphereTriangleDetector(btSphereShape* sphere,btTriangleShape* triangle, btScalar contactBreakingThreshold);
+ SphereTriangleDetector(btSphereShape* sphere, btTriangleShape* triangle, btScalar contactBreakingThreshold);
- virtual ~SphereTriangleDetector() {};
+ virtual ~SphereTriangleDetector(){};
- bool collide(const btVector3& sphereCenter,btVector3 &point, btVector3& resultNormal, btScalar& depth, btScalar &timeOfImpact, btScalar contactBreakingThreshold);
+ 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);
+ 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;
-
+ btScalar m_contactBreakingThreshold;
};
-#endif //BT_SPHERE_TRIANGLE_DETECTOR_H
-
+#endif //BT_SPHERE_TRIANGLE_DETECTOR_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.cpp
index 57f1464935..ac5de45d27 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.cpp
@@ -17,31 +17,31 @@ subject to the following restrictions:
#include "btCollisionDispatcher.h"
#include "btCollisionObject.h"
-btActivatingCollisionAlgorithm::btActivatingCollisionAlgorithm (const btCollisionAlgorithmConstructionInfo& ci)
-:btCollisionAlgorithm(ci)
+btActivatingCollisionAlgorithm::btActivatingCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci)
+ : btCollisionAlgorithm(ci)
//,
//m_colObj0(0),
//m_colObj1(0)
{
}
-btActivatingCollisionAlgorithm::btActivatingCollisionAlgorithm (const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* ,const btCollisionObjectWrapper* )
-:btCollisionAlgorithm(ci)
+btActivatingCollisionAlgorithm::btActivatingCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper*, const btCollisionObjectWrapper*)
+ : btCollisionAlgorithm(ci)
//,
//m_colObj0(0),
//m_colObj1(0)
{
-// if (ci.m_dispatcher1->needsCollision(colObj0,colObj1))
-// {
-// m_colObj0 = colObj0;
-// m_colObj1 = colObj1;
-//
-// m_colObj0->activate();
-// m_colObj1->activate();
-// }
+ // if (ci.m_dispatcher1->needsCollision(colObj0,colObj1))
+ // {
+ // m_colObj0 = colObj0;
+ // m_colObj1 = colObj1;
+ //
+ // m_colObj0->activate();
+ // m_colObj1->activate();
+ // }
}
btActivatingCollisionAlgorithm::~btActivatingCollisionAlgorithm()
{
-// m_colObj0->activate();
-// m_colObj1->activate();
+ // m_colObj0->activate();
+ // m_colObj1->activate();
}
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h
index 0e19f1ea35..862060571b 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h
@@ -21,17 +21,15 @@ subject to the following restrictions:
///This class is not enabled yet (work-in-progress) to more aggressively activate objects.
class btActivatingCollisionAlgorithm : public btCollisionAlgorithm
{
-// btCollisionObject* m_colObj0;
-// btCollisionObject* m_colObj1;
+ // btCollisionObject* m_colObj0;
+ // btCollisionObject* m_colObj1;
protected:
+ btActivatingCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci);
- btActivatingCollisionAlgorithm (const btCollisionAlgorithmConstructionInfo& ci);
-
- btActivatingCollisionAlgorithm (const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap);
+ btActivatingCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap);
public:
virtual ~btActivatingCollisionAlgorithm();
-
};
-#endif //__BT_ACTIVATING_COLLISION_ALGORITHM_H
+#endif //__BT_ACTIVATING_COLLISION_ALGORITHM_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.cpp
index cabbb0bf6a..6873a95d90 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.cpp
@@ -26,61 +26,55 @@ subject to the following restrictions:
#define USE_PERSISTENT_CONTACTS 1
-btBox2dBox2dCollisionAlgorithm::btBox2dBox2dCollisionAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* obj0Wrap,const btCollisionObjectWrapper* obj1Wrap)
-: btActivatingCollisionAlgorithm(ci,obj0Wrap,obj1Wrap),
-m_ownManifold(false),
-m_manifoldPtr(mf)
+btBox2dBox2dCollisionAlgorithm::btBox2dBox2dCollisionAlgorithm(btPersistentManifold* mf, const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* obj0Wrap, const btCollisionObjectWrapper* obj1Wrap)
+ : btActivatingCollisionAlgorithm(ci, obj0Wrap, obj1Wrap),
+ m_ownManifold(false),
+ m_manifoldPtr(mf)
{
- if (!m_manifoldPtr && m_dispatcher->needsCollision(obj0Wrap->getCollisionObject(),obj1Wrap->getCollisionObject()))
+ if (!m_manifoldPtr && m_dispatcher->needsCollision(obj0Wrap->getCollisionObject(), obj1Wrap->getCollisionObject()))
{
- m_manifoldPtr = m_dispatcher->getNewManifold(obj0Wrap->getCollisionObject(),obj1Wrap->getCollisionObject());
+ m_manifoldPtr = m_dispatcher->getNewManifold(obj0Wrap->getCollisionObject(), obj1Wrap->getCollisionObject());
m_ownManifold = true;
}
}
btBox2dBox2dCollisionAlgorithm::~btBox2dBox2dCollisionAlgorithm()
{
-
if (m_ownManifold)
{
if (m_manifoldPtr)
m_dispatcher->releaseManifold(m_manifoldPtr);
}
-
}
-
-void b2CollidePolygons(btManifoldResult* manifold, const btBox2dShape* polyA, const btTransform& xfA, const btBox2dShape* polyB, const btTransform& xfB);
+void b2CollidePolygons(btManifoldResult* manifold, const btBox2dShape* polyA, const btTransform& xfA, const btBox2dShape* polyB, const btTransform& xfB);
//#include <stdio.h>
-void btBox2dBox2dCollisionAlgorithm::processCollision (const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+void btBox2dBox2dCollisionAlgorithm::processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
if (!m_manifoldPtr)
return;
-
const btBox2dShape* box0 = (const btBox2dShape*)body0Wrap->getCollisionShape();
const btBox2dShape* box1 = (const btBox2dShape*)body1Wrap->getCollisionShape();
resultOut->setPersistentManifold(m_manifoldPtr);
- b2CollidePolygons(resultOut,box0,body0Wrap->getWorldTransform(),box1,body1Wrap->getWorldTransform());
+ b2CollidePolygons(resultOut, box0, body0Wrap->getWorldTransform(), box1, body1Wrap->getWorldTransform());
// refreshContactPoints is only necessary when using persistent contact points. otherwise all points are newly added
if (m_ownManifold)
{
resultOut->refreshContactPoints();
}
-
}
-btScalar btBox2dBox2dCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* /*body0*/,btCollisionObject* /*body1*/,const btDispatcherInfo& /*dispatchInfo*/,btManifoldResult* /*resultOut*/)
+btScalar btBox2dBox2dCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* /*body0*/, btCollisionObject* /*body1*/, const btDispatcherInfo& /*dispatchInfo*/, btManifoldResult* /*resultOut*/)
{
//not yet
return 1.f;
}
-
struct ClipVertex
{
btVector3 v;
@@ -89,16 +83,16 @@ struct ClipVertex
//b2ContactID id;
};
-#define b2Dot(a,b) (a).dot(b)
-#define b2Mul(a,b) (a)*(b)
-#define b2MulT(a,b) (a).transpose()*(b)
-#define b2Cross(a,b) (a).cross(b)
-#define btCrossS(a,s) btVector3(s * a.getY(), -s * a.getX(),0.f)
+#define b2Dot(a, b) (a).dot(b)
+#define b2Mul(a, b) (a) * (b)
+#define b2MulT(a, b) (a).transpose() * (b)
+#define b2Cross(a, b) (a).cross(b)
+#define btCrossS(a, s) btVector3(s* a.getY(), -s* a.getX(), 0.f)
-int b2_maxManifoldPoints =2;
+int b2_maxManifoldPoints = 2;
static int ClipSegmentToLine(ClipVertex vOut[2], ClipVertex vIn[2],
- const btVector3& normal, btScalar offset)
+ const btVector3& normal, btScalar offset)
{
// Start with no output points
int numOut = 0;
@@ -133,7 +127,7 @@ static int ClipSegmentToLine(ClipVertex vOut[2], ClipVertex vIn[2],
// Find the separation between poly1 and poly2 for a give edge normal on poly1.
static btScalar EdgeSeparation(const btBox2dShape* poly1, const btTransform& xf1, int edge1,
- const btBox2dShape* poly2, const btTransform& xf2)
+ const btBox2dShape* poly2, const btTransform& xf2)
{
const btVector3* vertices1 = poly1->getVertices();
const btVector3* normals1 = poly1->getNormals();
@@ -151,8 +145,8 @@ static btScalar EdgeSeparation(const btBox2dShape* poly1, const btTransform& xf1
int index = 0;
btScalar minDot = BT_LARGE_FLOAT;
- if( count2 > 0 )
- index = (int) normal1.minDot( vertices2, count2, minDot);
+ if (count2 > 0)
+ index = (int)normal1.minDot(vertices2, count2, minDot);
btVector3 v1 = b2Mul(xf1, vertices1[edge1]);
btVector3 v2 = b2Mul(xf2, vertices2[index]);
@@ -162,8 +156,8 @@ static btScalar EdgeSeparation(const btBox2dShape* poly1, const btTransform& xf1
// Find the max separation between poly1 and poly2 using edge normals from poly1.
static btScalar FindMaxSeparation(int* edgeIndex,
- const btBox2dShape* poly1, const btTransform& xf1,
- const btBox2dShape* poly2, const btTransform& xf2)
+ const btBox2dShape* poly1, const btTransform& xf1,
+ const btBox2dShape* poly2, const btTransform& xf2)
{
int count1 = poly1->getVertexCount();
const btVector3* normals1 = poly1->getNormals();
@@ -174,9 +168,9 @@ static btScalar FindMaxSeparation(int* edgeIndex,
// Find edge normal on poly1 that has the largest projection onto d.
int edge = 0;
- btScalar maxDot;
- if( count1 > 0 )
- edge = (int) dLocal1.maxDot( normals1, count1, maxDot);
+ btScalar maxDot;
+ if (count1 > 0)
+ edge = (int)dLocal1.maxDot(normals1, count1, maxDot);
// Get the separation for the edge normal.
btScalar s = EdgeSeparation(poly1, xf1, edge, poly2, xf2);
@@ -224,7 +218,7 @@ static btScalar FindMaxSeparation(int* edgeIndex,
}
// Perform a local search for the best edge normal.
- for ( ; ; )
+ for (;;)
{
if (increment == -1)
edge = bestEdge - 1 >= 0 ? bestEdge - 1 : count1 - 1;
@@ -285,14 +279,14 @@ static void FindIncidentEdge(ClipVertex c[2],
int i2 = i1 + 1 < count2 ? i1 + 1 : 0;
c[0].v = b2Mul(xf2, vertices2[i1]);
-// c[0].id.features.referenceEdge = (unsigned char)edge1;
-// c[0].id.features.incidentEdge = (unsigned char)i1;
-// c[0].id.features.incidentVertex = 0;
+ // c[0].id.features.referenceEdge = (unsigned char)edge1;
+ // c[0].id.features.incidentEdge = (unsigned char)i1;
+ // c[0].id.features.incidentVertex = 0;
c[1].v = b2Mul(xf2, vertices2[i2]);
-// c[1].id.features.referenceEdge = (unsigned char)edge1;
-// c[1].id.features.incidentEdge = (unsigned char)i2;
-// c[1].id.features.incidentVertex = 1;
+ // c[1].id.features.referenceEdge = (unsigned char)edge1;
+ // c[1].id.features.incidentEdge = (unsigned char)i2;
+ // c[1].id.features.incidentVertex = 1;
}
// Find edge normal of max separation on A - return if separating axis is found
@@ -303,10 +297,9 @@ static void FindIncidentEdge(ClipVertex c[2],
// The normal points from 1 to 2
void b2CollidePolygons(btManifoldResult* manifold,
- const btBox2dShape* polyA, const btTransform& xfA,
- const btBox2dShape* polyB, const btTransform& xfB)
+ const btBox2dShape* polyA, const btTransform& xfA,
+ const btBox2dShape* polyB, const btTransform& xfB)
{
-
int edgeA = 0;
btScalar separationA = FindMaxSeparation(&edgeA, polyA, xfA, polyB, xfB);
if (separationA > 0.0f)
@@ -317,10 +310,10 @@ void b2CollidePolygons(btManifoldResult* manifold,
if (separationB > 0.0f)
return;
- const btBox2dShape* poly1; // reference poly
- const btBox2dShape* poly2; // incident poly
+ const btBox2dShape* poly1; // reference poly
+ const btBox2dShape* poly2; // incident poly
btTransform xf1, xf2;
- int edge1; // reference edge
+ int edge1; // reference edge
unsigned char flip;
const btScalar k_relativeTol = 0.98f;
const btScalar k_absoluteTol = 0.001f;
@@ -352,14 +345,13 @@ void b2CollidePolygons(btManifoldResult* manifold,
const btVector3* vertices1 = poly1->getVertices();
btVector3 v11 = vertices1[edge1];
- btVector3 v12 = edge1 + 1 < count1 ? vertices1[edge1+1] : vertices1[0];
+ btVector3 v12 = edge1 + 1 < count1 ? vertices1[edge1 + 1] : vertices1[0];
//btVector3 dv = v12 - v11;
btVector3 sideNormal = b2Mul(xf1.getBasis(), v12 - v11);
sideNormal.normalize();
btVector3 frontNormal = btCrossS(sideNormal, 1.0f);
-
-
+
v11 = b2Mul(xf1, v11);
v12 = b2Mul(xf1, v12);
@@ -369,13 +361,12 @@ void b2CollidePolygons(btManifoldResult* manifold,
// Clip incident edge against extruded edge1 side edges.
ClipVertex clipPoints1[2];
- clipPoints1[0].v.setValue(0,0,0);
- clipPoints1[1].v.setValue(0,0,0);
+ clipPoints1[0].v.setValue(0, 0, 0);
+ clipPoints1[1].v.setValue(0, 0, 0);
ClipVertex clipPoints2[2];
- clipPoints2[0].v.setValue(0,0,0);
- clipPoints2[1].v.setValue(0,0,0);
-
+ clipPoints2[0].v.setValue(0, 0, 0);
+ clipPoints2[1].v.setValue(0, 0, 0);
int np;
@@ -386,7 +377,7 @@ void b2CollidePolygons(btManifoldResult* manifold,
return;
// Clip to negative box side 1
- np = ClipSegmentToLine(clipPoints2, clipPoints1, sideNormal, sideOffset2);
+ np = ClipSegmentToLine(clipPoints2, clipPoints1, sideNormal, sideOffset2);
if (np < 2)
{
@@ -403,19 +394,18 @@ void b2CollidePolygons(btManifoldResult* manifold,
if (separation <= 0.0f)
{
-
//b2ManifoldPoint* cp = manifold->points + pointCount;
//btScalar separation = separation;
//cp->localPoint1 = b2MulT(xfA, clipPoints2[i].v);
//cp->localPoint2 = b2MulT(xfB, clipPoints2[i].v);
- manifold->addContactPoint(-manifoldNormal,clipPoints2[i].v,separation);
+ manifold->addContactPoint(-manifoldNormal, clipPoints2[i].v, separation);
-// cp->id = clipPoints2[i].id;
-// cp->id.features.flip = flip;
+ // cp->id = clipPoints2[i].id;
+ // cp->id.features.flip = flip;
++pointCount;
}
}
-// manifold->pointCount = pointCount;}
+ // manifold->pointCount = pointCount;}
}
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.h
index 6ea6e89bda..3b66d1fd0b 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.h
@@ -26,22 +26,22 @@ class btPersistentManifold;
///box-box collision detection
class btBox2dBox2dCollisionAlgorithm : public btActivatingCollisionAlgorithm
{
- bool m_ownManifold;
- btPersistentManifold* m_manifoldPtr;
-
+ 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 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 btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut);
- btBox2dBox2dCollisionAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap);
+ btBox2dBox2dCollisionAlgorithm(btPersistentManifold* mf, const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap);
virtual ~btBox2dBox2dCollisionAlgorithm();
- virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
+ virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
{
if (m_manifoldPtr && m_ownManifold)
{
@@ -49,18 +49,15 @@ public:
}
}
-
- struct CreateFunc :public btCollisionAlgorithmCreateFunc
+ struct CreateFunc : public btCollisionAlgorithmCreateFunc
{
- virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap)
+ 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);
+ return new (ptr) btBox2dBox2dCollisionAlgorithm(0, ci, body0Wrap, body1Wrap);
}
};
-
};
-#endif //BT_BOX_2D_BOX_2D__COLLISION_ALGORITHM_H
-
+#endif //BT_BOX_2D_BOX_2D__COLLISION_ALGORITHM_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.cpp
index ac68968f59..7a391e059a 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.cpp
@@ -21,14 +21,14 @@ subject to the following restrictions:
#include "BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h"
#define USE_PERSISTENT_CONTACTS 1
-btBoxBoxCollisionAlgorithm::btBoxBoxCollisionAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap)
-: btActivatingCollisionAlgorithm(ci,body0Wrap,body1Wrap),
-m_ownManifold(false),
-m_manifoldPtr(mf)
+btBoxBoxCollisionAlgorithm::btBoxBoxCollisionAlgorithm(btPersistentManifold* mf, const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap)
+ : btActivatingCollisionAlgorithm(ci, body0Wrap, body1Wrap),
+ m_ownManifold(false),
+ m_manifoldPtr(mf)
{
- if (!m_manifoldPtr && m_dispatcher->needsCollision(body0Wrap->getCollisionObject(),body1Wrap->getCollisionObject()))
+ if (!m_manifoldPtr && m_dispatcher->needsCollision(body0Wrap->getCollisionObject(), body1Wrap->getCollisionObject()))
{
- m_manifoldPtr = m_dispatcher->getNewManifold(body0Wrap->getCollisionObject(),body1Wrap->getCollisionObject());
+ m_manifoldPtr = m_dispatcher->getNewManifold(body0Wrap->getCollisionObject(), body1Wrap->getCollisionObject());
m_ownManifold = true;
}
}
@@ -42,30 +42,27 @@ btBoxBoxCollisionAlgorithm::~btBoxBoxCollisionAlgorithm()
}
}
-void btBoxBoxCollisionAlgorithm::processCollision (const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+void btBoxBoxCollisionAlgorithm::processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
if (!m_manifoldPtr)
return;
-
const btBoxShape* box0 = (btBoxShape*)body0Wrap->getCollisionShape();
const btBoxShape* box1 = (btBoxShape*)body1Wrap->getCollisionShape();
-
-
/// report a contact. internally this will be kept persistent, and contact reduction is done
resultOut->setPersistentManifold(m_manifoldPtr);
-#ifndef USE_PERSISTENT_CONTACTS
+#ifndef USE_PERSISTENT_CONTACTS
m_manifoldPtr->clearManifold();
-#endif //USE_PERSISTENT_CONTACTS
+#endif //USE_PERSISTENT_CONTACTS
btDiscreteCollisionDetectorInterface::ClosestPointInput input;
input.m_maximumDistanceSquared = BT_LARGE_FLOAT;
input.m_transformA = body0Wrap->getWorldTransform();
input.m_transformB = body1Wrap->getWorldTransform();
- btBoxBoxDetector detector(box0,box1);
- detector.getClosestPoints(input,*resultOut,dispatchInfo.m_debugDraw);
+ btBoxBoxDetector detector(box0, box1);
+ detector.getClosestPoints(input, *resultOut, dispatchInfo.m_debugDraw);
#ifdef USE_PERSISTENT_CONTACTS
// refreshContactPoints is only necessary when using persistent contact points. otherwise all points are newly added
@@ -73,11 +70,10 @@ void btBoxBoxCollisionAlgorithm::processCollision (const btCollisionObjectWrappe
{
resultOut->refreshContactPoints();
}
-#endif //USE_PERSISTENT_CONTACTS
-
+#endif //USE_PERSISTENT_CONTACTS
}
-btScalar btBoxBoxCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* /*body0*/,btCollisionObject* /*body1*/,const btDispatcherInfo& /*dispatchInfo*/,btManifoldResult* /*resultOut*/)
+btScalar btBoxBoxCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* /*body0*/, btCollisionObject* /*body1*/, const btDispatcherInfo& /*dispatchInfo*/, btManifoldResult* /*resultOut*/)
{
//not yet
return 1.f;
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.h
index 59808df5a9..eb21065765 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.h
@@ -26,22 +26,22 @@ class btPersistentManifold;
///box-box collision detection
class btBoxBoxCollisionAlgorithm : public btActivatingCollisionAlgorithm
{
- bool m_ownManifold;
- btPersistentManifold* m_manifoldPtr;
-
+ 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 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 btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut);
- btBoxBoxCollisionAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap);
+ btBoxBoxCollisionAlgorithm(btPersistentManifold* mf, const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap);
virtual ~btBoxBoxCollisionAlgorithm();
- virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
+ virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
{
if (m_manifoldPtr && m_ownManifold)
{
@@ -49,18 +49,15 @@ public:
}
}
-
- struct CreateFunc :public btCollisionAlgorithmCreateFunc
+ struct CreateFunc : public btCollisionAlgorithmCreateFunc
{
- virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap)
+ 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);
+ return new (ptr) btBoxBoxCollisionAlgorithm(0, ci, body0Wrap, body1Wrap);
}
};
-
};
-#endif //BT_BOX_BOX__COLLISION_ALGORITHM_H
-
+#endif //BT_BOX_BOX__COLLISION_ALGORITHM_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btBoxBoxDetector.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btBoxBoxDetector.cpp
index 7043bde34f..202039956e 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btBoxBoxDetector.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btBoxBoxDetector.cpp
@@ -24,14 +24,12 @@ subject to the following restrictions:
#include <float.h>
#include <string.h>
-btBoxBoxDetector::btBoxBoxDetector(const btBoxShape* box1,const btBoxShape* box2)
-: m_box1(box1),
-m_box2(box2)
+btBoxBoxDetector::btBoxBoxDetector(const btBoxShape* box1, const btBoxShape* box2)
+ : m_box1(box1),
+ m_box2(box2)
{
-
}
-
// given two boxes (p1,R1,side1) and (p2,R2,side2), collide them together and
// generate contact points. this returns 0 if there is no contact otherwise
// it returns the number of contacts generated.
@@ -48,67 +46,66 @@ m_box2(box2)
// collision functions. this function only fills in the position and depth
// fields.
struct dContactGeom;
-#define dDOTpq(a,b,p,q) ((a)[0]*(b)[0] + (a)[p]*(b)[q] + (a)[2*(p)]*(b)[2*(q)])
+#define dDOTpq(a, b, p, q) ((a)[0] * (b)[0] + (a)[p] * (b)[q] + (a)[2 * (p)] * (b)[2 * (q)])
#define dInfinity FLT_MAX
-
/*PURE_INLINE btScalar dDOT (const btScalar *a, const btScalar *b) { return dDOTpq(a,b,1,1); }
PURE_INLINE btScalar dDOT13 (const btScalar *a, const btScalar *b) { return dDOTpq(a,b,1,3); }
PURE_INLINE btScalar dDOT31 (const btScalar *a, const btScalar *b) { return dDOTpq(a,b,3,1); }
PURE_INLINE btScalar dDOT33 (const btScalar *a, const btScalar *b) { return dDOTpq(a,b,3,3); }
*/
-static btScalar dDOT (const btScalar *a, const btScalar *b) { return dDOTpq(a,b,1,1); }
-static btScalar dDOT44 (const btScalar *a, const btScalar *b) { return dDOTpq(a,b,4,4); }
-static btScalar dDOT41 (const btScalar *a, const btScalar *b) { return dDOTpq(a,b,4,1); }
-static btScalar dDOT14 (const btScalar *a, const btScalar *b) { return dDOTpq(a,b,1,4); }
-#define dMULTIPLYOP1_331(A,op,B,C) \
-{\
- (A)[0] op dDOT41((B),(C)); \
- (A)[1] op dDOT41((B+1),(C)); \
- (A)[2] op dDOT41((B+2),(C)); \
-}
+static btScalar dDOT(const btScalar* a, const btScalar* b) { return dDOTpq(a, b, 1, 1); }
+static btScalar dDOT44(const btScalar* a, const btScalar* b) { return dDOTpq(a, b, 4, 4); }
+static btScalar dDOT41(const btScalar* a, const btScalar* b) { return dDOTpq(a, b, 4, 1); }
+static btScalar dDOT14(const btScalar* a, const btScalar* b) { return dDOTpq(a, b, 1, 4); }
+#define dMULTIPLYOP1_331(A, op, B, C) \
+ { \
+ (A)[0] op dDOT41((B), (C)); \
+ (A)[1] op dDOT41((B + 1), (C)); \
+ (A)[2] op dDOT41((B + 2), (C)); \
+ }
-#define dMULTIPLYOP0_331(A,op,B,C) \
-{ \
- (A)[0] op dDOT((B),(C)); \
- (A)[1] op dDOT((B+4),(C)); \
- (A)[2] op dDOT((B+8),(C)); \
-}
+#define dMULTIPLYOP0_331(A, op, B, C) \
+ { \
+ (A)[0] op dDOT((B), (C)); \
+ (A)[1] op dDOT((B + 4), (C)); \
+ (A)[2] op dDOT((B + 8), (C)); \
+ }
-#define dMULTIPLY1_331(A,B,C) dMULTIPLYOP1_331(A,=,B,C)
-#define dMULTIPLY0_331(A,B,C) dMULTIPLYOP0_331(A,=,B,C)
+#define dMULTIPLY1_331(A, B, C) dMULTIPLYOP1_331(A, =, B, C)
+#define dMULTIPLY0_331(A, B, C) dMULTIPLYOP0_331(A, =, B, C)
-typedef btScalar dMatrix3[4*3];
+typedef btScalar dMatrix3[4 * 3];
-void dLineClosestApproach (const btVector3& pa, const btVector3& ua,
- const btVector3& pb, const btVector3& ub,
- btScalar *alpha, btScalar *beta);
-void dLineClosestApproach (const btVector3& pa, const btVector3& ua,
- const btVector3& pb, const btVector3& ub,
- btScalar *alpha, btScalar *beta)
+void dLineClosestApproach(const btVector3& pa, const btVector3& ua,
+ const btVector3& pb, const btVector3& ub,
+ btScalar* alpha, btScalar* beta);
+void dLineClosestApproach(const btVector3& pa, const btVector3& ua,
+ const btVector3& pb, const btVector3& ub,
+ btScalar* alpha, btScalar* beta)
{
- btVector3 p;
- p[0] = pb[0] - pa[0];
- p[1] = pb[1] - pa[1];
- p[2] = pb[2] - pa[2];
- btScalar uaub = dDOT(ua,ub);
- btScalar q1 = dDOT(ua,p);
- btScalar q2 = -dDOT(ub,p);
- btScalar d = 1-uaub*uaub;
- if (d <= btScalar(0.0001f)) {
- // @@@ this needs to be made more robust
- *alpha = 0;
- *beta = 0;
- }
- else {
- d = 1.f/d;
- *alpha = (q1 + uaub*q2)*d;
- *beta = (uaub*q1 + q2)*d;
- }
+ btVector3 p;
+ p[0] = pb[0] - pa[0];
+ p[1] = pb[1] - pa[1];
+ p[2] = pb[2] - pa[2];
+ btScalar uaub = dDOT(ua, ub);
+ btScalar q1 = dDOT(ua, p);
+ btScalar q2 = -dDOT(ub, p);
+ btScalar d = 1 - uaub * uaub;
+ if (d <= btScalar(0.0001f))
+ {
+ // @@@ this needs to be made more robust
+ *alpha = 0;
+ *beta = 0;
+ }
+ else
+ {
+ d = 1.f / d;
+ *alpha = (q1 + uaub * q2) * d;
+ *beta = (uaub * q1 + q2) * d;
+ }
}
-
-
// find all the intersection points between the 2D rectangle with vertices
// at (+/-h[0],+/-h[1]) and the 2D quadrilateral with vertices (p[0],p[1]),
// (p[2],p[3]),(p[4],p[5]),(p[6],p[7]).
@@ -117,60 +114,66 @@ void dLineClosestApproach (const btVector3& pa, const btVector3& ua,
// the number of intersection points is returned by the function (this will
// be in the range 0 to 8).
-static int intersectRectQuad2 (btScalar h[2], btScalar p[8], btScalar ret[16])
+static int intersectRectQuad2(btScalar h[2], btScalar p[8], btScalar ret[16])
{
- // q (and r) contain nq (and nr) coordinate points for the current (and
- // chopped) polygons
- int nq=4,nr=0;
- btScalar buffer[16];
- btScalar *q = p;
- btScalar *r = ret;
- for (int dir=0; dir <= 1; dir++) {
- // direction notation: xy[0] = x axis, xy[1] = y axis
- for (int sign=-1; sign <= 1; sign += 2) {
- // chop q along the line xy[dir] = sign*h[dir]
- btScalar *pq = q;
- btScalar *pr = r;
- nr = 0;
- for (int i=nq; i > 0; i--) {
- // go through all points in q and all lines between adjacent points
- if (sign*pq[dir] < h[dir]) {
- // this point is inside the chopping line
- pr[0] = pq[0];
- pr[1] = pq[1];
- pr += 2;
- nr++;
- if (nr & 8) {
- q = r;
- goto done;
- }
- }
- btScalar *nextq = (i > 1) ? pq+2 : q;
- if ((sign*pq[dir] < h[dir]) ^ (sign*nextq[dir] < h[dir])) {
- // this line crosses the chopping line
- pr[1-dir] = pq[1-dir] + (nextq[1-dir]-pq[1-dir]) /
- (nextq[dir]-pq[dir]) * (sign*h[dir]-pq[dir]);
- pr[dir] = sign*h[dir];
- pr += 2;
- nr++;
- if (nr & 8) {
- q = r;
- goto done;
- }
+ // q (and r) contain nq (and nr) coordinate points for the current (and
+ // chopped) polygons
+ int nq = 4, nr = 0;
+ btScalar buffer[16];
+ btScalar* q = p;
+ btScalar* r = ret;
+ for (int dir = 0; dir <= 1; dir++)
+ {
+ // direction notation: xy[0] = x axis, xy[1] = y axis
+ for (int sign = -1; sign <= 1; sign += 2)
+ {
+ // chop q along the line xy[dir] = sign*h[dir]
+ btScalar* pq = q;
+ btScalar* pr = r;
+ nr = 0;
+ for (int i = nq; i > 0; i--)
+ {
+ // go through all points in q and all lines between adjacent points
+ if (sign * pq[dir] < h[dir])
+ {
+ // this point is inside the chopping line
+ pr[0] = pq[0];
+ pr[1] = pq[1];
+ pr += 2;
+ nr++;
+ if (nr & 8)
+ {
+ q = r;
+ goto done;
+ }
+ }
+ btScalar* nextq = (i > 1) ? pq + 2 : q;
+ if ((sign * pq[dir] < h[dir]) ^ (sign * nextq[dir] < h[dir]))
+ {
+ // this line crosses the chopping line
+ pr[1 - dir] = pq[1 - dir] + (nextq[1 - dir] - pq[1 - dir]) /
+ (nextq[dir] - pq[dir]) * (sign * h[dir] - pq[dir]);
+ pr[dir] = sign * h[dir];
+ pr += 2;
+ nr++;
+ if (nr & 8)
+ {
+ q = r;
+ goto done;
+ }
+ }
+ pq += 2;
+ }
+ q = r;
+ r = (q == ret) ? buffer : ret;
+ nq = nr;
+ }
}
- pq += 2;
- }
- q = r;
- r = (q==ret) ? buffer : ret;
- nq = nr;
- }
- }
- done:
- if (q != ret) memcpy (ret,q,nr*2*sizeof(btScalar));
- return nr;
+done:
+ if (q != ret) memcpy(ret, q, nr * 2 * sizeof(btScalar));
+ return nr;
}
-
#define M__PI 3.14159265f
// given n points in the plane (array p, of size 2*n), generate m points that
@@ -181,538 +184,584 @@ static int intersectRectQuad2 (btScalar h[2], btScalar p[8], btScalar ret[16])
// n must be in the range [1..8]. m must be in the range [1..n]. i0 must be
// in the range [0..n-1].
-void cullPoints2 (int n, btScalar p[], int m, int i0, int iret[]);
-void cullPoints2 (int n, btScalar p[], int m, int i0, int iret[])
+void cullPoints2(int n, btScalar p[], int m, int i0, int iret[]);
+void cullPoints2(int n, btScalar p[], int m, int i0, int iret[])
{
- // compute the centroid of the polygon in cx,cy
- int i,j;
- btScalar a,cx,cy,q;
- if (n==1) {
- cx = p[0];
- cy = p[1];
- }
- else if (n==2) {
- cx = btScalar(0.5)*(p[0] + p[2]);
- cy = btScalar(0.5)*(p[1] + p[3]);
- }
- else {
- a = 0;
- cx = 0;
- cy = 0;
- for (i=0; i<(n-1); i++) {
- q = p[i*2]*p[i*2+3] - p[i*2+2]*p[i*2+1];
- a += q;
- cx += q*(p[i*2]+p[i*2+2]);
- cy += q*(p[i*2+1]+p[i*2+3]);
- }
- q = p[n*2-2]*p[1] - p[0]*p[n*2-1];
- if (btFabs(a+q) > SIMD_EPSILON)
+ // compute the centroid of the polygon in cx,cy
+ int i, j;
+ btScalar a, cx, cy, q;
+ if (n == 1)
{
- a = 1.f/(btScalar(3.0)*(a+q));
- } else
+ cx = p[0];
+ cy = p[1];
+ }
+ else if (n == 2)
{
- a=BT_LARGE_FLOAT;
+ cx = btScalar(0.5) * (p[0] + p[2]);
+ cy = btScalar(0.5) * (p[1] + p[3]);
}
- cx = a*(cx + q*(p[n*2-2]+p[0]));
- cy = a*(cy + q*(p[n*2-1]+p[1]));
- }
-
- // compute the angle of each point w.r.t. the centroid
- btScalar A[8];
- for (i=0; i<n; i++) A[i] = btAtan2(p[i*2+1]-cy,p[i*2]-cx);
-
- // search for points that have angles closest to A[i0] + i*(2*pi/m).
- int avail[8];
- for (i=0; i<n; i++) avail[i] = 1;
- avail[i0] = 0;
- iret[0] = i0;
- iret++;
- for (j=1; j<m; j++) {
- a = btScalar(j)*(2*M__PI/m) + A[i0];
- if (a > M__PI) a -= 2*M__PI;
- btScalar maxdiff=1e9,diff;
-
- *iret = i0; // iret is not allowed to keep this value, but it sometimes does, when diff=#QNAN0
-
- for (i=0; i<n; i++) {
- if (avail[i]) {
- diff = btFabs (A[i]-a);
- if (diff > M__PI) diff = 2*M__PI - diff;
- if (diff < maxdiff) {
- maxdiff = diff;
- *iret = i;
+ else
+ {
+ a = 0;
+ cx = 0;
+ cy = 0;
+ for (i = 0; i < (n - 1); i++)
+ {
+ q = p[i * 2] * p[i * 2 + 3] - p[i * 2 + 2] * p[i * 2 + 1];
+ a += q;
+ cx += q * (p[i * 2] + p[i * 2 + 2]);
+ cy += q * (p[i * 2 + 1] + p[i * 2 + 3]);
+ }
+ q = p[n * 2 - 2] * p[1] - p[0] * p[n * 2 - 1];
+ if (btFabs(a + q) > SIMD_EPSILON)
+ {
+ a = 1.f / (btScalar(3.0) * (a + q));
+ }
+ else
+ {
+ a = BT_LARGE_FLOAT;
+ }
+ cx = a * (cx + q * (p[n * 2 - 2] + p[0]));
+ cy = a * (cy + q * (p[n * 2 - 1] + p[1]));
}
- }
- }
-#if defined(DEBUG) || defined (_DEBUG)
- btAssert (*iret != i0); // ensure iret got set
+
+ // compute the angle of each point w.r.t. the centroid
+ btScalar A[8];
+ for (i = 0; i < n; i++) A[i] = btAtan2(p[i * 2 + 1] - cy, p[i * 2] - cx);
+
+ // search for points that have angles closest to A[i0] + i*(2*pi/m).
+ int avail[8];
+ for (i = 0; i < n; i++) avail[i] = 1;
+ avail[i0] = 0;
+ iret[0] = i0;
+ iret++;
+ for (j = 1; j < m; j++)
+ {
+ a = btScalar(j) * (2 * M__PI / m) + A[i0];
+ if (a > M__PI) a -= 2 * M__PI;
+ btScalar maxdiff = 1e9, diff;
+
+ *iret = i0; // iret is not allowed to keep this value, but it sometimes does, when diff=#QNAN0
+
+ for (i = 0; i < n; i++)
+ {
+ if (avail[i])
+ {
+ diff = btFabs(A[i] - a);
+ if (diff > M__PI) diff = 2 * M__PI - diff;
+ if (diff < maxdiff)
+ {
+ maxdiff = diff;
+ *iret = i;
+ }
+ }
+ }
+#if defined(DEBUG) || defined(_DEBUG)
+ btAssert(*iret != i0); // ensure iret got set
#endif
- avail[*iret] = 0;
- iret++;
- }
+ avail[*iret] = 0;
+ iret++;
+ }
}
+int dBoxBox2(const btVector3& p1, const dMatrix3 R1,
+ const btVector3& side1, const btVector3& p2,
+ const dMatrix3 R2, const btVector3& side2,
+ btVector3& normal, btScalar* depth, int* return_code,
+ int maxc, dContactGeom* /*contact*/, int /*skip*/, btDiscreteCollisionDetectorInterface::Result& output);
+int dBoxBox2(const btVector3& p1, const dMatrix3 R1,
+ const btVector3& side1, const btVector3& p2,
+ const dMatrix3 R2, const btVector3& side2,
+ btVector3& normal, btScalar* depth, int* return_code,
+ int maxc, dContactGeom* /*contact*/, int /*skip*/, btDiscreteCollisionDetectorInterface::Result& output)
+{
+ const btScalar fudge_factor = btScalar(1.05);
+ btVector3 p, pp, normalC(0.f, 0.f, 0.f);
+ const btScalar* normalR = 0;
+ btScalar A[3], B[3], R11, R12, R13, R21, R22, R23, R31, R32, R33,
+ Q11, Q12, Q13, Q21, Q22, Q23, Q31, Q32, Q33, s, s2, l;
+ int i, j, invert_normal, code;
+
+ // get vector from centers of box 1 to box 2, relative to box 1
+ p = p2 - p1;
+ dMULTIPLY1_331(pp, R1, p); // get pp = p relative to body 1
+
+ // get side lengths / 2
+ A[0] = side1[0] * btScalar(0.5);
+ A[1] = side1[1] * btScalar(0.5);
+ A[2] = side1[2] * btScalar(0.5);
+ B[0] = side2[0] * btScalar(0.5);
+ B[1] = side2[1] * btScalar(0.5);
+ B[2] = side2[2] * btScalar(0.5);
+
+ // Rij is R1'*R2, i.e. the relative rotation between R1 and R2
+ R11 = dDOT44(R1 + 0, R2 + 0);
+ R12 = dDOT44(R1 + 0, R2 + 1);
+ R13 = dDOT44(R1 + 0, R2 + 2);
+ R21 = dDOT44(R1 + 1, R2 + 0);
+ R22 = dDOT44(R1 + 1, R2 + 1);
+ R23 = dDOT44(R1 + 1, R2 + 2);
+ R31 = dDOT44(R1 + 2, R2 + 0);
+ R32 = dDOT44(R1 + 2, R2 + 1);
+ R33 = dDOT44(R1 + 2, R2 + 2);
+
+ Q11 = btFabs(R11);
+ Q12 = btFabs(R12);
+ Q13 = btFabs(R13);
+ Q21 = btFabs(R21);
+ Q22 = btFabs(R22);
+ Q23 = btFabs(R23);
+ Q31 = btFabs(R31);
+ Q32 = btFabs(R32);
+ Q33 = btFabs(R33);
+
+ // for all 15 possible separating axes:
+ // * see if the axis separates the boxes. if so, return 0.
+ // * find the depth of the penetration along the separating axis (s2)
+ // * if this is the largest depth so far, record it.
+ // the normal vector will be set to the separating axis with the smallest
+ // depth. note: normalR is set to point to a column of R1 or R2 if that is
+ // the smallest depth normal so far. otherwise normalR is 0 and normalC is
+ // set to a vector relative to body 1. invert_normal is 1 if the sign of
+ // the normal should be flipped.
+
+#define TST(expr1, expr2, norm, cc) \
+ s2 = btFabs(expr1) - (expr2); \
+ if (s2 > 0) return 0; \
+ if (s2 > s) \
+ { \
+ s = s2; \
+ normalR = norm; \
+ invert_normal = ((expr1) < 0); \
+ code = (cc); \
+ }
+ s = -dInfinity;
+ invert_normal = 0;
+ code = 0;
-int dBoxBox2 (const btVector3& p1, const dMatrix3 R1,
- const btVector3& side1, const btVector3& p2,
- const dMatrix3 R2, const btVector3& side2,
- btVector3& normal, btScalar *depth, int *return_code,
- int maxc, dContactGeom * /*contact*/, int /*skip*/,btDiscreteCollisionDetectorInterface::Result& output);
-int dBoxBox2 (const btVector3& p1, const dMatrix3 R1,
- const btVector3& side1, const btVector3& p2,
- const dMatrix3 R2, const btVector3& side2,
- btVector3& normal, btScalar *depth, int *return_code,
- int maxc, dContactGeom * /*contact*/, int /*skip*/,btDiscreteCollisionDetectorInterface::Result& output)
-{
- const btScalar fudge_factor = btScalar(1.05);
- btVector3 p,pp,normalC(0.f,0.f,0.f);
- const btScalar *normalR = 0;
- btScalar A[3],B[3],R11,R12,R13,R21,R22,R23,R31,R32,R33,
- Q11,Q12,Q13,Q21,Q22,Q23,Q31,Q32,Q33,s,s2,l;
- int i,j,invert_normal,code;
-
- // get vector from centers of box 1 to box 2, relative to box 1
- p = p2 - p1;
- dMULTIPLY1_331 (pp,R1,p); // get pp = p relative to body 1
-
- // get side lengths / 2
- A[0] = side1[0]*btScalar(0.5);
- A[1] = side1[1]*btScalar(0.5);
- A[2] = side1[2]*btScalar(0.5);
- B[0] = side2[0]*btScalar(0.5);
- B[1] = side2[1]*btScalar(0.5);
- B[2] = side2[2]*btScalar(0.5);
-
- // Rij is R1'*R2, i.e. the relative rotation between R1 and R2
- R11 = dDOT44(R1+0,R2+0); R12 = dDOT44(R1+0,R2+1); R13 = dDOT44(R1+0,R2+2);
- R21 = dDOT44(R1+1,R2+0); R22 = dDOT44(R1+1,R2+1); R23 = dDOT44(R1+1,R2+2);
- R31 = dDOT44(R1+2,R2+0); R32 = dDOT44(R1+2,R2+1); R33 = dDOT44(R1+2,R2+2);
-
- Q11 = btFabs(R11); Q12 = btFabs(R12); Q13 = btFabs(R13);
- Q21 = btFabs(R21); Q22 = btFabs(R22); Q23 = btFabs(R23);
- Q31 = btFabs(R31); Q32 = btFabs(R32); Q33 = btFabs(R33);
-
- // for all 15 possible separating axes:
- // * see if the axis separates the boxes. if so, return 0.
- // * find the depth of the penetration along the separating axis (s2)
- // * if this is the largest depth so far, record it.
- // the normal vector will be set to the separating axis with the smallest
- // depth. note: normalR is set to point to a column of R1 or R2 if that is
- // the smallest depth normal so far. otherwise normalR is 0 and normalC is
- // set to a vector relative to body 1. invert_normal is 1 if the sign of
- // the normal should be flipped.
-
-#define TST(expr1,expr2,norm,cc) \
- s2 = btFabs(expr1) - (expr2); \
- if (s2 > 0) return 0; \
- if (s2 > s) { \
- s = s2; \
- normalR = norm; \
- invert_normal = ((expr1) < 0); \
- code = (cc); \
- }
-
- s = -dInfinity;
- invert_normal = 0;
- code = 0;
-
- // separating axis = u1,u2,u3
- TST (pp[0],(A[0] + B[0]*Q11 + B[1]*Q12 + B[2]*Q13),R1+0,1);
- TST (pp[1],(A[1] + B[0]*Q21 + B[1]*Q22 + B[2]*Q23),R1+1,2);
- TST (pp[2],(A[2] + B[0]*Q31 + B[1]*Q32 + B[2]*Q33),R1+2,3);
-
- // separating axis = v1,v2,v3
- TST (dDOT41(R2+0,p),(A[0]*Q11 + A[1]*Q21 + A[2]*Q31 + B[0]),R2+0,4);
- TST (dDOT41(R2+1,p),(A[0]*Q12 + A[1]*Q22 + A[2]*Q32 + B[1]),R2+1,5);
- TST (dDOT41(R2+2,p),(A[0]*Q13 + A[1]*Q23 + A[2]*Q33 + B[2]),R2+2,6);
-
- // note: cross product axes need to be scaled when s is computed.
- // normal (n1,n2,n3) is relative to box 1.
+ // separating axis = u1,u2,u3
+ TST(pp[0], (A[0] + B[0] * Q11 + B[1] * Q12 + B[2] * Q13), R1 + 0, 1);
+ TST(pp[1], (A[1] + B[0] * Q21 + B[1] * Q22 + B[2] * Q23), R1 + 1, 2);
+ TST(pp[2], (A[2] + B[0] * Q31 + B[1] * Q32 + B[2] * Q33), R1 + 2, 3);
+
+ // separating axis = v1,v2,v3
+ TST(dDOT41(R2 + 0, p), (A[0] * Q11 + A[1] * Q21 + A[2] * Q31 + B[0]), R2 + 0, 4);
+ TST(dDOT41(R2 + 1, p), (A[0] * Q12 + A[1] * Q22 + A[2] * Q32 + B[1]), R2 + 1, 5);
+ TST(dDOT41(R2 + 2, p), (A[0] * Q13 + A[1] * Q23 + A[2] * Q33 + B[2]), R2 + 2, 6);
+
+ // note: cross product axes need to be scaled when s is computed.
+ // normal (n1,n2,n3) is relative to box 1.
#undef TST
-#define TST(expr1,expr2,n1,n2,n3,cc) \
- s2 = btFabs(expr1) - (expr2); \
- if (s2 > SIMD_EPSILON) return 0; \
- l = btSqrt((n1)*(n1) + (n2)*(n2) + (n3)*(n3)); \
- if (l > SIMD_EPSILON) { \
- s2 /= l; \
- if (s2*fudge_factor > s) { \
- s = s2; \
- normalR = 0; \
- normalC[0] = (n1)/l; normalC[1] = (n2)/l; normalC[2] = (n3)/l; \
- invert_normal = ((expr1) < 0); \
- code = (cc); \
- } \
- }
-
- btScalar fudge2 (1.0e-5f);
-
- Q11 += fudge2;
- Q12 += fudge2;
- Q13 += fudge2;
-
- Q21 += fudge2;
- Q22 += fudge2;
- Q23 += fudge2;
-
- Q31 += fudge2;
- Q32 += fudge2;
- Q33 += fudge2;
-
- // separating axis = u1 x (v1,v2,v3)
- TST(pp[2]*R21-pp[1]*R31,(A[1]*Q31+A[2]*Q21+B[1]*Q13+B[2]*Q12),0,-R31,R21,7);
- TST(pp[2]*R22-pp[1]*R32,(A[1]*Q32+A[2]*Q22+B[0]*Q13+B[2]*Q11),0,-R32,R22,8);
- TST(pp[2]*R23-pp[1]*R33,(A[1]*Q33+A[2]*Q23+B[0]*Q12+B[1]*Q11),0,-R33,R23,9);
-
- // separating axis = u2 x (v1,v2,v3)
- TST(pp[0]*R31-pp[2]*R11,(A[0]*Q31+A[2]*Q11+B[1]*Q23+B[2]*Q22),R31,0,-R11,10);
- TST(pp[0]*R32-pp[2]*R12,(A[0]*Q32+A[2]*Q12+B[0]*Q23+B[2]*Q21),R32,0,-R12,11);
- TST(pp[0]*R33-pp[2]*R13,(A[0]*Q33+A[2]*Q13+B[0]*Q22+B[1]*Q21),R33,0,-R13,12);
-
- // separating axis = u3 x (v1,v2,v3)
- TST(pp[1]*R11-pp[0]*R21,(A[0]*Q21+A[1]*Q11+B[1]*Q33+B[2]*Q32),-R21,R11,0,13);
- TST(pp[1]*R12-pp[0]*R22,(A[0]*Q22+A[1]*Q12+B[0]*Q33+B[2]*Q31),-R22,R12,0,14);
- TST(pp[1]*R13-pp[0]*R23,(A[0]*Q23+A[1]*Q13+B[0]*Q32+B[1]*Q31),-R23,R13,0,15);
+#define TST(expr1, expr2, n1, n2, n3, cc) \
+ s2 = btFabs(expr1) - (expr2); \
+ if (s2 > SIMD_EPSILON) return 0; \
+ l = btSqrt((n1) * (n1) + (n2) * (n2) + (n3) * (n3)); \
+ if (l > SIMD_EPSILON) \
+ { \
+ s2 /= l; \
+ if (s2 * fudge_factor > s) \
+ { \
+ s = s2; \
+ normalR = 0; \
+ normalC[0] = (n1) / l; \
+ normalC[1] = (n2) / l; \
+ normalC[2] = (n3) / l; \
+ invert_normal = ((expr1) < 0); \
+ code = (cc); \
+ } \
+ }
+
+ btScalar fudge2(1.0e-5f);
+
+ Q11 += fudge2;
+ Q12 += fudge2;
+ Q13 += fudge2;
+
+ Q21 += fudge2;
+ Q22 += fudge2;
+ Q23 += fudge2;
+
+ Q31 += fudge2;
+ Q32 += fudge2;
+ Q33 += fudge2;
+
+ // separating axis = u1 x (v1,v2,v3)
+ TST(pp[2] * R21 - pp[1] * R31, (A[1] * Q31 + A[2] * Q21 + B[1] * Q13 + B[2] * Q12), 0, -R31, R21, 7);
+ TST(pp[2] * R22 - pp[1] * R32, (A[1] * Q32 + A[2] * Q22 + B[0] * Q13 + B[2] * Q11), 0, -R32, R22, 8);
+ TST(pp[2] * R23 - pp[1] * R33, (A[1] * Q33 + A[2] * Q23 + B[0] * Q12 + B[1] * Q11), 0, -R33, R23, 9);
+
+ // separating axis = u2 x (v1,v2,v3)
+ TST(pp[0] * R31 - pp[2] * R11, (A[0] * Q31 + A[2] * Q11 + B[1] * Q23 + B[2] * Q22), R31, 0, -R11, 10);
+ TST(pp[0] * R32 - pp[2] * R12, (A[0] * Q32 + A[2] * Q12 + B[0] * Q23 + B[2] * Q21), R32, 0, -R12, 11);
+ TST(pp[0] * R33 - pp[2] * R13, (A[0] * Q33 + A[2] * Q13 + B[0] * Q22 + B[1] * Q21), R33, 0, -R13, 12);
+
+ // separating axis = u3 x (v1,v2,v3)
+ TST(pp[1] * R11 - pp[0] * R21, (A[0] * Q21 + A[1] * Q11 + B[1] * Q33 + B[2] * Q32), -R21, R11, 0, 13);
+ TST(pp[1] * R12 - pp[0] * R22, (A[0] * Q22 + A[1] * Q12 + B[0] * Q33 + B[2] * Q31), -R22, R12, 0, 14);
+ TST(pp[1] * R13 - pp[0] * R23, (A[0] * Q23 + A[1] * Q13 + B[0] * Q32 + B[1] * Q31), -R23, R13, 0, 15);
#undef TST
- if (!code) return 0;
-
- // if we get to this point, the boxes interpenetrate. compute the normal
- // in global coordinates.
- if (normalR) {
- normal[0] = normalR[0];
- normal[1] = normalR[4];
- normal[2] = normalR[8];
- }
- else {
- dMULTIPLY0_331 (normal,R1,normalC);
- }
- if (invert_normal) {
- normal[0] = -normal[0];
- normal[1] = -normal[1];
- normal[2] = -normal[2];
- }
- *depth = -s;
-
- // compute contact point(s)
-
- if (code > 6) {
- // an edge from box 1 touches an edge from box 2.
- // find a point pa on the intersecting edge of box 1
- btVector3 pa;
- btScalar sign;
- for (i=0; i<3; i++) pa[i] = p1[i];
- for (j=0; j<3; j++) {
- sign = (dDOT14(normal,R1+j) > 0) ? btScalar(1.0) : btScalar(-1.0);
- for (i=0; i<3; i++) pa[i] += sign * A[j] * R1[i*4+j];
- }
-
- // find a point pb on the intersecting edge of box 2
- btVector3 pb;
- for (i=0; i<3; i++) pb[i] = p2[i];
- for (j=0; j<3; j++) {
- sign = (dDOT14(normal,R2+j) > 0) ? btScalar(-1.0) : btScalar(1.0);
- for (i=0; i<3; i++) pb[i] += sign * B[j] * R2[i*4+j];
- }
-
- btScalar alpha,beta;
- btVector3 ua,ub;
- for (i=0; i<3; i++) ua[i] = R1[((code)-7)/3 + i*4];
- for (i=0; i<3; i++) ub[i] = R2[((code)-7)%3 + i*4];
-
- dLineClosestApproach (pa,ua,pb,ub,&alpha,&beta);
- for (i=0; i<3; i++) pa[i] += ua[i]*alpha;
- for (i=0; i<3; i++) pb[i] += ub[i]*beta;
+ if (!code) return 0;
+ // if we get to this point, the boxes interpenetrate. compute the normal
+ // in global coordinates.
+ if (normalR)
+ {
+ normal[0] = normalR[0];
+ normal[1] = normalR[4];
+ normal[2] = normalR[8];
+ }
+ else
{
-
- //contact[0].pos[i] = btScalar(0.5)*(pa[i]+pb[i]);
- //contact[0].depth = *depth;
- btVector3 pointInWorld;
+ dMULTIPLY0_331(normal, R1, normalC);
+ }
+ if (invert_normal)
+ {
+ normal[0] = -normal[0];
+ normal[1] = -normal[1];
+ normal[2] = -normal[2];
+ }
+ *depth = -s;
+
+ // compute contact point(s)
+
+ if (code > 6)
+ {
+ // an edge from box 1 touches an edge from box 2.
+ // find a point pa on the intersecting edge of box 1
+ btVector3 pa;
+ btScalar sign;
+ for (i = 0; i < 3; i++) pa[i] = p1[i];
+ for (j = 0; j < 3; j++)
+ {
+ sign = (dDOT14(normal, R1 + j) > 0) ? btScalar(1.0) : btScalar(-1.0);
+ for (i = 0; i < 3; i++) pa[i] += sign * A[j] * R1[i * 4 + j];
+ }
+
+ // find a point pb on the intersecting edge of box 2
+ btVector3 pb;
+ for (i = 0; i < 3; i++) pb[i] = p2[i];
+ for (j = 0; j < 3; j++)
+ {
+ sign = (dDOT14(normal, R2 + j) > 0) ? btScalar(-1.0) : btScalar(1.0);
+ for (i = 0; i < 3; i++) pb[i] += sign * B[j] * R2[i * 4 + j];
+ }
+
+ btScalar alpha, beta;
+ btVector3 ua, ub;
+ for (i = 0; i < 3; i++) ua[i] = R1[((code)-7) / 3 + i * 4];
+ for (i = 0; i < 3; i++) ub[i] = R2[((code)-7) % 3 + i * 4];
+
+ dLineClosestApproach(pa, ua, pb, ub, &alpha, &beta);
+ for (i = 0; i < 3; i++) pa[i] += ua[i] * alpha;
+ for (i = 0; i < 3; i++) pb[i] += ub[i] * beta;
+
+ {
+ //contact[0].pos[i] = btScalar(0.5)*(pa[i]+pb[i]);
+ //contact[0].depth = *depth;
+ btVector3 pointInWorld;
#ifdef USE_CENTER_POINT
- for (i=0; i<3; i++)
- pointInWorld[i] = (pa[i]+pb[i])*btScalar(0.5);
- output.addContactPoint(-normal,pointInWorld,-*depth);
+ for (i = 0; i < 3; i++)
+ pointInWorld[i] = (pa[i] + pb[i]) * btScalar(0.5);
+ output.addContactPoint(-normal, pointInWorld, -*depth);
#else
- output.addContactPoint(-normal,pb,-*depth);
+ output.addContactPoint(-normal, pb, -*depth);
-#endif //
- *return_code = code;
+#endif //
+ *return_code = code;
+ }
+ return 1;
+ }
+
+ // okay, we have a face-something intersection (because the separating
+ // axis is perpendicular to a face). define face 'a' to be the reference
+ // face (i.e. the normal vector is perpendicular to this) and face 'b' to be
+ // the incident face (the closest face of the other box).
+
+ const btScalar *Ra, *Rb, *pa, *pb, *Sa, *Sb;
+ if (code <= 3)
+ {
+ Ra = R1;
+ Rb = R2;
+ pa = p1;
+ pb = p2;
+ Sa = A;
+ Sb = B;
+ }
+ else
+ {
+ Ra = R2;
+ Rb = R1;
+ pa = p2;
+ pb = p1;
+ Sa = B;
+ Sb = A;
+ }
+
+ // nr = normal vector of reference face dotted with axes of incident box.
+ // anr = absolute values of nr.
+ btVector3 normal2, nr, anr;
+ if (code <= 3)
+ {
+ normal2[0] = normal[0];
+ normal2[1] = normal[1];
+ normal2[2] = normal[2];
+ }
+ else
+ {
+ normal2[0] = -normal[0];
+ normal2[1] = -normal[1];
+ normal2[2] = -normal[2];
}
- return 1;
- }
-
- // okay, we have a face-something intersection (because the separating
- // axis is perpendicular to a face). define face 'a' to be the reference
- // face (i.e. the normal vector is perpendicular to this) and face 'b' to be
- // the incident face (the closest face of the other box).
-
- const btScalar *Ra,*Rb,*pa,*pb,*Sa,*Sb;
- if (code <= 3) {
- Ra = R1;
- Rb = R2;
- pa = p1;
- pb = p2;
- Sa = A;
- Sb = B;
- }
- else {
- Ra = R2;
- Rb = R1;
- pa = p2;
- pb = p1;
- Sa = B;
- Sb = A;
- }
-
- // nr = normal vector of reference face dotted with axes of incident box.
- // anr = absolute values of nr.
- btVector3 normal2,nr,anr;
- if (code <= 3) {
- normal2[0] = normal[0];
- normal2[1] = normal[1];
- normal2[2] = normal[2];
- }
- else {
- normal2[0] = -normal[0];
- normal2[1] = -normal[1];
- normal2[2] = -normal[2];
- }
- dMULTIPLY1_331 (nr,Rb,normal2);
- anr[0] = btFabs (nr[0]);
- anr[1] = btFabs (nr[1]);
- anr[2] = btFabs (nr[2]);
-
- // find the largest compontent of anr: this corresponds to the normal
- // for the indident face. the other axis numbers of the indicent face
- // are stored in a1,a2.
- int lanr,a1,a2;
- if (anr[1] > anr[0]) {
- if (anr[1] > anr[2]) {
- a1 = 0;
- lanr = 1;
- a2 = 2;
- }
- else {
- a1 = 0;
- a2 = 1;
- lanr = 2;
- }
- }
- else {
- if (anr[0] > anr[2]) {
- lanr = 0;
- a1 = 1;
- a2 = 2;
- }
- else {
- a1 = 0;
- a2 = 1;
- lanr = 2;
- }
- }
-
- // compute center point of incident face, in reference-face coordinates
- btVector3 center;
- if (nr[lanr] < 0) {
- for (i=0; i<3; i++) center[i] = pb[i] - pa[i] + Sb[lanr] * Rb[i*4+lanr];
- }
- else {
- for (i=0; i<3; i++) center[i] = pb[i] - pa[i] - Sb[lanr] * Rb[i*4+lanr];
- }
-
- // find the normal and non-normal axis numbers of the reference box
- int codeN,code1,code2;
- if (code <= 3) codeN = code-1; else codeN = code-4;
- if (codeN==0) {
- code1 = 1;
- code2 = 2;
- }
- else if (codeN==1) {
- code1 = 0;
- code2 = 2;
- }
- else {
- code1 = 0;
- code2 = 1;
- }
-
- // find the four corners of the incident face, in reference-face coordinates
- btScalar quad[8]; // 2D coordinate of incident face (x,y pairs)
- btScalar c1,c2,m11,m12,m21,m22;
- c1 = dDOT14 (center,Ra+code1);
- c2 = dDOT14 (center,Ra+code2);
- // optimize this? - we have already computed this data above, but it is not
- // stored in an easy-to-index format. for now it's quicker just to recompute
- // the four dot products.
- m11 = dDOT44 (Ra+code1,Rb+a1);
- m12 = dDOT44 (Ra+code1,Rb+a2);
- m21 = dDOT44 (Ra+code2,Rb+a1);
- m22 = dDOT44 (Ra+code2,Rb+a2);
- {
- btScalar k1 = m11*Sb[a1];
- btScalar k2 = m21*Sb[a1];
- btScalar k3 = m12*Sb[a2];
- btScalar k4 = m22*Sb[a2];
- quad[0] = c1 - k1 - k3;
- quad[1] = c2 - k2 - k4;
- quad[2] = c1 - k1 + k3;
- quad[3] = c2 - k2 + k4;
- quad[4] = c1 + k1 + k3;
- quad[5] = c2 + k2 + k4;
- quad[6] = c1 + k1 - k3;
- quad[7] = c2 + k2 - k4;
- }
-
- // find the size of the reference face
- btScalar rect[2];
- rect[0] = Sa[code1];
- rect[1] = Sa[code2];
-
- // intersect the incident and reference faces
- btScalar ret[16];
- int n = intersectRectQuad2 (rect,quad,ret);
- if (n < 1) return 0; // this should never happen
-
- // convert the intersection points into reference-face coordinates,
- // and compute the contact position and depth for each point. only keep
- // those points that have a positive (penetrating) depth. delete points in
- // the 'ret' array as necessary so that 'point' and 'ret' correspond.
- btScalar point[3*8]; // penetrating contact points
- btScalar dep[8]; // depths for those points
- btScalar det1 = 1.f/(m11*m22 - m12*m21);
- m11 *= det1;
- m12 *= det1;
- m21 *= det1;
- m22 *= det1;
- int cnum = 0; // number of penetrating contact points found
- for (j=0; j < n; j++) {
- btScalar k1 = m22*(ret[j*2]-c1) - m12*(ret[j*2+1]-c2);
- btScalar k2 = -m21*(ret[j*2]-c1) + m11*(ret[j*2+1]-c2);
- for (i=0; i<3; i++) point[cnum*3+i] =
- center[i] + k1*Rb[i*4+a1] + k2*Rb[i*4+a2];
- dep[cnum] = Sa[codeN] - dDOT(normal2,point+cnum*3);
- if (dep[cnum] >= 0) {
- ret[cnum*2] = ret[j*2];
- ret[cnum*2+1] = ret[j*2+1];
- cnum++;
- }
- }
- if (cnum < 1) return 0; // this should never happen
-
- // we can't generate more contacts than we actually have
- if (maxc > cnum) maxc = cnum;
- if (maxc < 1) maxc = 1;
-
- if (cnum <= maxc) {
-
- if (code<4)
- {
- // we have less contacts than we need, so we use them all
- for (j=0; j < cnum; j++)
+ dMULTIPLY1_331(nr, Rb, normal2);
+ anr[0] = btFabs(nr[0]);
+ anr[1] = btFabs(nr[1]);
+ anr[2] = btFabs(nr[2]);
+
+ // find the largest compontent of anr: this corresponds to the normal
+ // for the indident face. the other axis numbers of the indicent face
+ // are stored in a1,a2.
+ int lanr, a1, a2;
+ if (anr[1] > anr[0])
{
- btVector3 pointInWorld;
- for (i=0; i<3; i++)
- pointInWorld[i] = point[j*3+i] + pa[i];
- output.addContactPoint(-normal,pointInWorld,-dep[j]);
-
- }
- } else
- {
- // we have less contacts than we need, so we use them all
- for (j=0; j < cnum; j++)
+ if (anr[1] > anr[2])
{
- btVector3 pointInWorld;
- for (i=0; i<3; i++)
- pointInWorld[i] = point[j*3+i] + pa[i]-normal[i]*dep[j];
+ a1 = 0;
+ lanr = 1;
+ a2 = 2;
+ }
+ else
+ {
+ a1 = 0;
+ a2 = 1;
+ lanr = 2;
+ }
+ }
+ else
+ {
+ if (anr[0] > anr[2])
+ {
+ lanr = 0;
+ a1 = 1;
+ a2 = 2;
+ }
+ else
+ {
+ a1 = 0;
+ a2 = 1;
+ lanr = 2;
+ }
+ }
+
+ // compute center point of incident face, in reference-face coordinates
+ btVector3 center;
+ if (nr[lanr] < 0)
+ {
+ for (i = 0; i < 3; i++) center[i] = pb[i] - pa[i] + Sb[lanr] * Rb[i * 4 + lanr];
+ }
+ else
+ {
+ for (i = 0; i < 3; i++) center[i] = pb[i] - pa[i] - Sb[lanr] * Rb[i * 4 + lanr];
+ }
+
+ // find the normal and non-normal axis numbers of the reference box
+ int codeN, code1, code2;
+ if (code <= 3)
+ codeN = code - 1;
+ else
+ codeN = code - 4;
+ if (codeN == 0)
+ {
+ code1 = 1;
+ code2 = 2;
+ }
+ else if (codeN == 1)
+ {
+ code1 = 0;
+ code2 = 2;
+ }
+ else
+ {
+ code1 = 0;
+ code2 = 1;
+ }
+
+ // find the four corners of the incident face, in reference-face coordinates
+ btScalar quad[8]; // 2D coordinate of incident face (x,y pairs)
+ btScalar c1, c2, m11, m12, m21, m22;
+ c1 = dDOT14(center, Ra + code1);
+ c2 = dDOT14(center, Ra + code2);
+ // optimize this? - we have already computed this data above, but it is not
+ // stored in an easy-to-index format. for now it's quicker just to recompute
+ // the four dot products.
+ m11 = dDOT44(Ra + code1, Rb + a1);
+ m12 = dDOT44(Ra + code1, Rb + a2);
+ m21 = dDOT44(Ra + code2, Rb + a1);
+ m22 = dDOT44(Ra + code2, Rb + a2);
+ {
+ btScalar k1 = m11 * Sb[a1];
+ btScalar k2 = m21 * Sb[a1];
+ btScalar k3 = m12 * Sb[a2];
+ btScalar k4 = m22 * Sb[a2];
+ quad[0] = c1 - k1 - k3;
+ quad[1] = c2 - k2 - k4;
+ quad[2] = c1 - k1 + k3;
+ quad[3] = c2 - k2 + k4;
+ quad[4] = c1 + k1 + k3;
+ quad[5] = c2 + k2 + k4;
+ quad[6] = c1 + k1 - k3;
+ quad[7] = c2 + k2 - k4;
+ }
+
+ // find the size of the reference face
+ btScalar rect[2];
+ rect[0] = Sa[code1];
+ rect[1] = Sa[code2];
+
+ // intersect the incident and reference faces
+ btScalar ret[16];
+ int n = intersectRectQuad2(rect, quad, ret);
+ if (n < 1) return 0; // this should never happen
+
+ // convert the intersection points into reference-face coordinates,
+ // and compute the contact position and depth for each point. only keep
+ // those points that have a positive (penetrating) depth. delete points in
+ // the 'ret' array as necessary so that 'point' and 'ret' correspond.
+ btScalar point[3 * 8]; // penetrating contact points
+ btScalar dep[8]; // depths for those points
+ btScalar det1 = 1.f / (m11 * m22 - m12 * m21);
+ m11 *= det1;
+ m12 *= det1;
+ m21 *= det1;
+ m22 *= det1;
+ int cnum = 0; // number of penetrating contact points found
+ for (j = 0; j < n; j++)
+ {
+ btScalar k1 = m22 * (ret[j * 2] - c1) - m12 * (ret[j * 2 + 1] - c2);
+ btScalar k2 = -m21 * (ret[j * 2] - c1) + m11 * (ret[j * 2 + 1] - c2);
+ for (i = 0; i < 3; i++) point[cnum * 3 + i] =
+ center[i] + k1 * Rb[i * 4 + a1] + k2 * Rb[i * 4 + a2];
+ dep[cnum] = Sa[codeN] - dDOT(normal2, point + cnum * 3);
+ if (dep[cnum] >= 0)
+ {
+ ret[cnum * 2] = ret[j * 2];
+ ret[cnum * 2 + 1] = ret[j * 2 + 1];
+ cnum++;
+ }
+ }
+ if (cnum < 1) return 0; // this should never happen
+
+ // we can't generate more contacts than we actually have
+ if (maxc > cnum) maxc = cnum;
+ if (maxc < 1) maxc = 1;
+
+ if (cnum <= maxc)
+ {
+ if (code < 4)
+ {
+ // we have less contacts than we need, so we use them all
+ for (j = 0; j < cnum; j++)
+ {
+ btVector3 pointInWorld;
+ for (i = 0; i < 3; i++)
+ pointInWorld[i] = point[j * 3 + i] + pa[i];
+ output.addContactPoint(-normal, pointInWorld, -dep[j]);
+ }
+ }
+ else
+ {
+ // we have less contacts than we need, so we use them all
+ for (j = 0; j < cnum; j++)
+ {
+ btVector3 pointInWorld;
+ for (i = 0; i < 3; i++)
+ pointInWorld[i] = point[j * 3 + i] + pa[i] - normal[i] * dep[j];
//pointInWorld[i] = point[j*3+i] + pa[i];
- output.addContactPoint(-normal,pointInWorld,-dep[j]);
+ output.addContactPoint(-normal, pointInWorld, -dep[j]);
+ }
}
- }
- }
- else {
- // we have more contacts than are wanted, some of them must be culled.
- // find the deepest point, it is always the first contact.
- int i1 = 0;
- btScalar maxdepth = dep[0];
- for (i=1; i<cnum; i++) {
- if (dep[i] > maxdepth) {
- maxdepth = dep[i];
- i1 = i;
- }
- }
-
- int iret[8];
- cullPoints2 (cnum,ret,maxc,i1,iret);
-
- for (j=0; j < maxc; j++) {
-// dContactGeom *con = CONTACT(contact,skip*j);
- // for (i=0; i<3; i++) con->pos[i] = point[iret[j]*3+i] + pa[i];
- // con->depth = dep[iret[j]];
-
- btVector3 posInWorld;
- for (i=0; i<3; i++)
- posInWorld[i] = point[iret[j]*3+i] + pa[i];
- if (code<4)
- {
- output.addContactPoint(-normal,posInWorld,-dep[iret[j]]);
- } else
+ }
+ else
+ {
+ // we have more contacts than are wanted, some of them must be culled.
+ // find the deepest point, it is always the first contact.
+ int i1 = 0;
+ btScalar maxdepth = dep[0];
+ for (i = 1; i < cnum; i++)
{
- output.addContactPoint(-normal,posInWorld-normal*dep[iret[j]],-dep[iret[j]]);
+ if (dep[i] > maxdepth)
+ {
+ maxdepth = dep[i];
+ i1 = i;
+ }
}
- }
- cnum = maxc;
- }
- *return_code = code;
- return cnum;
+ int iret[8];
+ cullPoints2(cnum, ret, maxc, i1, iret);
+
+ for (j = 0; j < maxc; j++)
+ {
+ // dContactGeom *con = CONTACT(contact,skip*j);
+ // for (i=0; i<3; i++) con->pos[i] = point[iret[j]*3+i] + pa[i];
+ // con->depth = dep[iret[j]];
+
+ btVector3 posInWorld;
+ for (i = 0; i < 3; i++)
+ posInWorld[i] = point[iret[j] * 3 + i] + pa[i];
+ if (code < 4)
+ {
+ output.addContactPoint(-normal, posInWorld, -dep[iret[j]]);
+ }
+ else
+ {
+ output.addContactPoint(-normal, posInWorld - normal * dep[iret[j]], -dep[iret[j]]);
+ }
+ }
+ cnum = maxc;
+ }
+
+ *return_code = code;
+ return cnum;
}
-void btBoxBoxDetector::getClosestPoints(const ClosestPointInput& input,Result& output,class btIDebugDraw* /*debugDraw*/,bool /*swapResults*/)
+void btBoxBoxDetector::getClosestPoints(const ClosestPointInput& input, Result& output, class btIDebugDraw* /*debugDraw*/, bool /*swapResults*/)
{
-
const btTransform& transformA = input.m_transformA;
const btTransform& transformB = input.m_transformB;
-
+
int skip = 0;
- dContactGeom *contact = 0;
+ dContactGeom* contact = 0;
dMatrix3 R1;
dMatrix3 R2;
- for (int j=0;j<3;j++)
+ for (int j = 0; j < 3; j++)
{
- R1[0+4*j] = transformA.getBasis()[j].x();
- R2[0+4*j] = transformB.getBasis()[j].x();
-
- R1[1+4*j] = transformA.getBasis()[j].y();
- R2[1+4*j] = transformB.getBasis()[j].y();
-
+ R1[0 + 4 * j] = transformA.getBasis()[j].x();
+ R2[0 + 4 * j] = transformB.getBasis()[j].x();
- R1[2+4*j] = transformA.getBasis()[j].z();
- R2[2+4*j] = transformB.getBasis()[j].z();
+ R1[1 + 4 * j] = transformA.getBasis()[j].y();
+ R2[1 + 4 * j] = transformB.getBasis()[j].y();
+ R1[2 + 4 * j] = transformA.getBasis()[j].z();
+ R2[2 + 4 * j] = transformB.getBasis()[j].z();
}
-
-
btVector3 normal;
btScalar depth;
int return_code;
int maxc = 4;
-
- dBoxBox2 (transformA.getOrigin(),
- R1,
- 2.f*m_box1->getHalfExtentsWithMargin(),
- transformB.getOrigin(),
- R2,
- 2.f*m_box2->getHalfExtentsWithMargin(),
- normal, &depth, &return_code,
- maxc, contact, skip,
- output
- );
-
+ dBoxBox2(transformA.getOrigin(),
+ R1,
+ 2.f * m_box1->getHalfExtentsWithMargin(),
+ transformB.getOrigin(),
+ R2,
+ 2.f * m_box2->getHalfExtentsWithMargin(),
+ normal, &depth, &return_code,
+ maxc, contact, skip,
+ output);
}
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btBoxBoxDetector.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btBoxBoxDetector.h
index 3924377705..9f7d988fc1 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btBoxBoxDetector.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btBoxBoxDetector.h
@@ -19,11 +19,9 @@ subject to the following restrictions:
#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
@@ -32,13 +30,11 @@ struct btBoxBoxDetector : public btDiscreteCollisionDetectorInterface
const btBoxShape* m_box2;
public:
+ btBoxBoxDetector(const btBoxShape* box1, const btBoxShape* box2);
- btBoxBoxDetector(const btBoxShape* box1,const btBoxShape* box2);
-
- virtual ~btBoxBoxDetector() {};
-
- virtual void getClosestPoints(const ClosestPointInput& input,Result& output,class btIDebugDraw* debugDraw,bool swapResults=false);
+ virtual ~btBoxBoxDetector(){};
+ virtual void getClosestPoints(const ClosestPointInput& input, Result& output, class btIDebugDraw* debugDraw, bool swapResults = false);
};
-#endif //BT_BOX_BOX_DETECTOR_H
+#endif //BT_BOX_BOX_DETECTOR_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionConfiguration.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionConfiguration.h
index 35f77d4e65..d6e15f555b 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionConfiguration.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionConfiguration.h
@@ -23,11 +23,9 @@ 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
+class btCollisionConfiguration
{
-
public:
-
virtual ~btCollisionConfiguration()
{
}
@@ -37,13 +35,9 @@ public:
virtual btPoolAllocator* getCollisionAlgorithmPool() = 0;
-
- virtual btCollisionAlgorithmCreateFunc* getCollisionAlgorithmCreateFunc(int proxyType0,int proxyType1) =0;
+ virtual btCollisionAlgorithmCreateFunc* getCollisionAlgorithmCreateFunc(int proxyType0, int proxyType1) = 0;
virtual btCollisionAlgorithmCreateFunc* getClosestPointsAlgorithmCreateFunc(int proxyType0, int proxyType1) = 0;
-
-
};
-#endif //BT_COLLISION_CONFIGURATION
-
+#endif //BT_COLLISION_CONFIGURATION
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionCreateFunc.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionCreateFunc.h
index 62ee66c4e9..bd81284939 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionCreateFunc.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionCreateFunc.h
@@ -26,20 +26,18 @@ struct btCollisionAlgorithmConstructionInfo;
struct btCollisionAlgorithmCreateFunc
{
bool m_swapped;
-
+
btCollisionAlgorithmCreateFunc()
- :m_swapped(false)
+ : m_swapped(false)
{
}
virtual ~btCollisionAlgorithmCreateFunc(){};
- virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& , const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap)
+ virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo&, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap)
{
-
(void)body0Wrap;
(void)body1Wrap;
return 0;
}
};
-#endif //BT_COLLISION_CREATE_FUNC
-
+#endif //BT_COLLISION_CREATE_FUNC
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp
index f8794dec47..25b2b1ea46 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp
@@ -13,8 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
-
#include "btCollisionDispatcher.h"
#include "LinearMath/btQuickprof.h"
@@ -31,40 +29,34 @@ subject to the following restrictions:
#include <stdio.h>
#endif
-
-btCollisionDispatcher::btCollisionDispatcher (btCollisionConfiguration* collisionConfiguration):
-m_dispatcherFlags(btCollisionDispatcher::CD_USE_RELATIVE_CONTACT_BREAKING_THRESHOLD),
- m_collisionConfiguration(collisionConfiguration)
+btCollisionDispatcher::btCollisionDispatcher(btCollisionConfiguration* collisionConfiguration) : m_dispatcherFlags(btCollisionDispatcher::CD_USE_RELATIVE_CONTACT_BREAKING_THRESHOLD),
+ m_collisionConfiguration(collisionConfiguration)
{
int i;
setNearCallback(defaultNearCallback);
-
+
m_collisionAlgorithmPoolAllocator = collisionConfiguration->getCollisionAlgorithmPool();
m_persistentManifoldPoolAllocator = collisionConfiguration->getPersistentManifoldPool();
- for (i=0;i<MAX_BROADPHASE_COLLISION_TYPES;i++)
+ for (i = 0; i < MAX_BROADPHASE_COLLISION_TYPES; i++)
{
- for (int j=0;j<MAX_BROADPHASE_COLLISION_TYPES;j++)
+ for (int j = 0; j < MAX_BROADPHASE_COLLISION_TYPES; j++)
{
- m_doubleDispatchContactPoints[i][j] = m_collisionConfiguration->getCollisionAlgorithmCreateFunc(i,j);
+ m_doubleDispatchContactPoints[i][j] = m_collisionConfiguration->getCollisionAlgorithmCreateFunc(i, j);
btAssert(m_doubleDispatchContactPoints[i][j]);
m_doubleDispatchClosestPoints[i][j] = m_collisionConfiguration->getClosestPointsAlgorithmCreateFunc(i, j);
-
}
}
-
-
}
-
-void btCollisionDispatcher::registerCollisionCreateFunc(int proxyType0, int proxyType1, btCollisionAlgorithmCreateFunc *createFunc)
+void btCollisionDispatcher::registerCollisionCreateFunc(int proxyType0, int proxyType1, btCollisionAlgorithmCreateFunc* createFunc)
{
m_doubleDispatchContactPoints[proxyType0][proxyType1] = createFunc;
}
-void btCollisionDispatcher::registerClosestPointsCreateFunc(int proxyType0, int proxyType1, btCollisionAlgorithmCreateFunc *createFunc)
+void btCollisionDispatcher::registerClosestPointsCreateFunc(int proxyType0, int proxyType1, btCollisionAlgorithmCreateFunc* createFunc)
{
m_doubleDispatchClosestPoints[proxyType0][proxyType1] = createFunc;
}
@@ -73,35 +65,33 @@ btCollisionDispatcher::~btCollisionDispatcher()
{
}
-btPersistentManifold* btCollisionDispatcher::getNewManifold(const btCollisionObject* body0,const btCollisionObject* body1)
-{
+btPersistentManifold* btCollisionDispatcher::getNewManifold(const btCollisionObject* body0, const btCollisionObject* body1)
+{
//btAssert(gNumManifold < 65535);
-
-
//optional relative contact breaking threshold, turned on by default (use setDispatcherFlags to switch off feature for improved performance)
-
- btScalar contactBreakingThreshold = (m_dispatcherFlags & btCollisionDispatcher::CD_USE_RELATIVE_CONTACT_BREAKING_THRESHOLD) ?
- btMin(body0->getCollisionShape()->getContactBreakingThreshold(gContactBreakingThreshold) , body1->getCollisionShape()->getContactBreakingThreshold(gContactBreakingThreshold))
- : gContactBreakingThreshold ;
-
- btScalar contactProcessingThreshold = btMin(body0->getContactProcessingThreshold(),body1->getContactProcessingThreshold());
-
- void* mem = m_persistentManifoldPoolAllocator->allocate( sizeof( btPersistentManifold ) );
- if (NULL == mem)
+
+ btScalar contactBreakingThreshold = (m_dispatcherFlags & btCollisionDispatcher::CD_USE_RELATIVE_CONTACT_BREAKING_THRESHOLD) ? btMin(body0->getCollisionShape()->getContactBreakingThreshold(gContactBreakingThreshold), body1->getCollisionShape()->getContactBreakingThreshold(gContactBreakingThreshold))
+ : gContactBreakingThreshold;
+
+ btScalar contactProcessingThreshold = btMin(body0->getContactProcessingThreshold(), body1->getContactProcessingThreshold());
+
+ void* mem = m_persistentManifoldPoolAllocator->allocate(sizeof(btPersistentManifold));
+ if (NULL == mem)
{
- //we got a pool memory overflow, by default we fallback to dynamically allocate memory. If we require a contiguous contact pool then assert.
- if ((m_dispatcherFlags&CD_DISABLE_CONTACTPOOL_DYNAMIC_ALLOCATION)==0)
+ //we got a pool memory overflow, by default we fallback to dynamically allocate memory. If we require a contiguous contact pool then assert.
+ if ((m_dispatcherFlags & CD_DISABLE_CONTACTPOOL_DYNAMIC_ALLOCATION) == 0)
{
- mem = btAlignedAlloc(sizeof(btPersistentManifold),16);
- } else
+ mem = btAlignedAlloc(sizeof(btPersistentManifold), 16);
+ }
+ else
{
btAssert(0);
//make sure to increase the m_defaultMaxPersistentManifoldPoolSize in the btDefaultCollisionConstructionInfo/btDefaultCollisionConfiguration
return 0;
}
}
- btPersistentManifold* manifold = new(mem) btPersistentManifold (body0,body1,0,contactBreakingThreshold,contactProcessingThreshold);
+ btPersistentManifold* manifold = new (mem) btPersistentManifold(body0, body1, 0, contactBreakingThreshold, contactProcessingThreshold);
manifold->m_index1a = m_manifoldsPtr.size();
m_manifoldsPtr.push_back(manifold);
@@ -113,17 +103,14 @@ void btCollisionDispatcher::clearManifold(btPersistentManifold* manifold)
manifold->clearManifold();
}
-
void btCollisionDispatcher::releaseManifold(btPersistentManifold* manifold)
{
-
-
//printf("releaseManifold: gNumManifold %d\n",gNumManifold);
clearManifold(manifold);
int findIndex = manifold->m_index1a;
btAssert(findIndex < m_manifoldsPtr.size());
- m_manifoldsPtr.swap(findIndex,m_manifoldsPtr.size()-1);
+ m_manifoldsPtr.swap(findIndex, m_manifoldsPtr.size() - 1);
m_manifoldsPtr[findIndex]->m_index1a = findIndex;
m_manifoldsPtr.pop_back();
@@ -131,19 +118,15 @@ void btCollisionDispatcher::releaseManifold(btPersistentManifold* manifold)
if (m_persistentManifoldPoolAllocator->validPtr(manifold))
{
m_persistentManifoldPoolAllocator->freeMemory(manifold);
- } else
+ }
+ else
{
btAlignedFree(manifold);
}
-
}
-
-
-
-btCollisionAlgorithm* btCollisionDispatcher::findAlgorithm(const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,btPersistentManifold* sharedManifold, ebtDispatcherQueryType algoType)
+btCollisionAlgorithm* btCollisionDispatcher::findAlgorithm(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, btPersistentManifold* sharedManifold, ebtDispatcherQueryType algoType)
{
-
btCollisionAlgorithmConstructionInfo ci;
ci.m_dispatcher1 = this;
@@ -161,21 +144,18 @@ btCollisionAlgorithm* btCollisionDispatcher::findAlgorithm(const btCollisionObje
return algo;
}
-
-
-
-bool btCollisionDispatcher::needsResponse(const btCollisionObject* body0,const btCollisionObject* body1)
+bool btCollisionDispatcher::needsResponse(const btCollisionObject* body0, const btCollisionObject* body1)
{
//here you can do filtering
- bool hasResponse =
+ bool hasResponse =
(body0->hasContactResponse() && body1->hasContactResponse());
//no response between two static/kinematic bodies:
hasResponse = hasResponse &&
- ((!body0->isStaticOrKinematicObject()) ||(! body1->isStaticOrKinematicObject()));
+ ((!body0->isStaticOrKinematicObject()) || (!body1->isStaticOrKinematicObject()));
return hasResponse;
}
-bool btCollisionDispatcher::needsCollision(const btCollisionObject* body0,const btCollisionObject* body1)
+bool btCollisionDispatcher::needsCollision(const btCollisionObject* body0, const btCollisionObject* body1)
{
btAssert(body0);
btAssert(body1);
@@ -192,31 +172,27 @@ bool btCollisionDispatcher::needsCollision(const btCollisionObject* body0,const
printf("warning btCollisionDispatcher::needsCollision: static-static collision!\n");
}
}
-#endif //BT_DEBUG
+#endif //BT_DEBUG
if ((!body0->isActive()) && (!body1->isActive()))
needsCollision = false;
else if ((!body0->checkCollideWith(body1)) || (!body1->checkCollideWith(body0)))
needsCollision = false;
-
- return needsCollision ;
+ return needsCollision;
}
-
-
///interface for iterating all overlapping collision pairs, no matter how those pairs are stored (array, set, map etc)
///this is useful for the collision dispatcher.
class btCollisionPairCallback : public btOverlapCallback
{
const btDispatcherInfo& m_dispatchInfo;
- btCollisionDispatcher* m_dispatcher;
+ btCollisionDispatcher* m_dispatcher;
public:
-
- btCollisionPairCallback(const btDispatcherInfo& dispatchInfo,btCollisionDispatcher* dispatcher)
- :m_dispatchInfo(dispatchInfo),
- m_dispatcher(dispatcher)
+ btCollisionPairCallback(const btDispatcherInfo& dispatchInfo, btCollisionDispatcher* dispatcher)
+ : m_dispatchInfo(dispatchInfo),
+ m_dispatcher(dispatcher)
{
}
@@ -228,87 +204,76 @@ public:
}
*/
-
virtual ~btCollisionPairCallback() {}
-
- virtual bool processOverlap(btBroadphasePair& pair)
+ virtual bool processOverlap(btBroadphasePair& pair)
{
- (*m_dispatcher->getNearCallback())(pair,*m_dispatcher,m_dispatchInfo);
+ (*m_dispatcher->getNearCallback())(pair, *m_dispatcher, m_dispatchInfo);
return false;
}
};
-
-
-
-void btCollisionDispatcher::dispatchAllCollisionPairs(btOverlappingPairCache* pairCache,const btDispatcherInfo& dispatchInfo,btDispatcher* dispatcher)
+void btCollisionDispatcher::dispatchAllCollisionPairs(btOverlappingPairCache* pairCache, const btDispatcherInfo& dispatchInfo, btDispatcher* dispatcher)
{
//m_blockedForChanges = true;
- btCollisionPairCallback collisionCallback(dispatchInfo,this);
+ btCollisionPairCallback collisionCallback(dispatchInfo, this);
- {
+ {
BT_PROFILE("processAllOverlappingPairs");
- pairCache->processAllOverlappingPairs(&collisionCallback,dispatcher, dispatchInfo);
+ pairCache->processAllOverlappingPairs(&collisionCallback, dispatcher, dispatchInfo);
}
//m_blockedForChanges = false;
-
}
-
-
//by default, Bullet will use this near callback
void btCollisionDispatcher::defaultNearCallback(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo)
{
- btCollisionObject* colObj0 = (btCollisionObject*)collisionPair.m_pProxy0->m_clientObject;
- btCollisionObject* colObj1 = (btCollisionObject*)collisionPair.m_pProxy1->m_clientObject;
+ btCollisionObject* colObj0 = (btCollisionObject*)collisionPair.m_pProxy0->m_clientObject;
+ btCollisionObject* colObj1 = (btCollisionObject*)collisionPair.m_pProxy1->m_clientObject;
+
+ if (dispatcher.needsCollision(colObj0, colObj1))
+ {
+ btCollisionObjectWrapper obj0Wrap(0, colObj0->getCollisionShape(), colObj0, colObj0->getWorldTransform(), -1, -1);
+ btCollisionObjectWrapper obj1Wrap(0, colObj1->getCollisionShape(), colObj1, colObj1->getWorldTransform(), -1, -1);
- if (dispatcher.needsCollision(colObj0,colObj1))
+ //dispatcher will keep algorithms persistent in the collision pair
+ if (!collisionPair.m_algorithm)
{
- btCollisionObjectWrapper obj0Wrap(0,colObj0->getCollisionShape(),colObj0,colObj0->getWorldTransform(),-1,-1);
- btCollisionObjectWrapper obj1Wrap(0,colObj1->getCollisionShape(),colObj1,colObj1->getWorldTransform(),-1,-1);
+ collisionPair.m_algorithm = dispatcher.findAlgorithm(&obj0Wrap, &obj1Wrap, 0, BT_CONTACT_POINT_ALGORITHMS);
+ }
+ if (collisionPair.m_algorithm)
+ {
+ btManifoldResult contactPointResult(&obj0Wrap, &obj1Wrap);
- //dispatcher will keep algorithms persistent in the collision pair
- if (!collisionPair.m_algorithm)
+ if (dispatchInfo.m_dispatchFunc == btDispatcherInfo::DISPATCH_DISCRETE)
{
- collisionPair.m_algorithm = dispatcher.findAlgorithm(&obj0Wrap,&obj1Wrap,0, BT_CONTACT_POINT_ALGORITHMS);
- }
+ //discrete collision detection query
- if (collisionPair.m_algorithm)
+ collisionPair.m_algorithm->processCollision(&obj0Wrap, &obj1Wrap, dispatchInfo, &contactPointResult);
+ }
+ else
{
- btManifoldResult contactPointResult(&obj0Wrap,&obj1Wrap);
-
- if (dispatchInfo.m_dispatchFunc == btDispatcherInfo::DISPATCH_DISCRETE)
- {
- //discrete collision detection query
-
- collisionPair.m_algorithm->processCollision(&obj0Wrap,&obj1Wrap,dispatchInfo,&contactPointResult);
- } else
- {
- //continuous collision detection query, time of impact (toi)
- btScalar toi = collisionPair.m_algorithm->calculateTimeOfImpact(colObj0,colObj1,dispatchInfo,&contactPointResult);
- if (dispatchInfo.m_timeOfImpact > toi)
- dispatchInfo.m_timeOfImpact = toi;
-
- }
+ //continuous collision detection query, time of impact (toi)
+ btScalar toi = collisionPair.m_algorithm->calculateTimeOfImpact(colObj0, colObj1, dispatchInfo, &contactPointResult);
+ if (dispatchInfo.m_timeOfImpact > toi)
+ dispatchInfo.m_timeOfImpact = toi;
}
}
-
+ }
}
-
void* btCollisionDispatcher::allocateCollisionAlgorithm(int size)
{
- void* mem = m_collisionAlgorithmPoolAllocator->allocate( size );
- if (NULL == mem)
- {
- //warn user for overflow?
- return btAlignedAlloc(static_cast<size_t>(size), 16);
- }
- return mem;
+ void* mem = m_collisionAlgorithmPoolAllocator->allocate(size);
+ if (NULL == mem)
+ {
+ //warn user for overflow?
+ return btAlignedAlloc(static_cast<size_t>(size), 16);
+ }
+ return mem;
}
void btCollisionDispatcher::freeCollisionAlgorithm(void* ptr)
@@ -316,7 +281,8 @@ void btCollisionDispatcher::freeCollisionAlgorithm(void* ptr)
if (m_collisionAlgorithmPoolAllocator->validPtr(ptr))
{
m_collisionAlgorithmPoolAllocator->freeMemory(ptr);
- } else
+ }
+ else
{
btAlignedFree(ptr);
}
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcher.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcher.h
index b97ee3c1ba..6b9f5e23a5 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcher.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcher.h
@@ -37,35 +37,30 @@ 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;
- int m_dispatcherFlags;
+ btAlignedObjectArray<btPersistentManifold*> m_manifoldsPtr;
- btAlignedObjectArray<btPersistentManifold*> m_manifoldsPtr;
+ btManifoldResult m_defaultManifoldResult;
- btManifoldResult m_defaultManifoldResult;
+ btNearCallback m_nearCallback;
- btNearCallback m_nearCallback;
-
- btPoolAllocator* m_collisionAlgorithmPoolAllocator;
+ btPoolAllocator* m_collisionAlgorithmPoolAllocator;
- btPoolAllocator* m_persistentManifoldPoolAllocator;
+ 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;
-
+ btCollisionConfiguration* m_collisionConfiguration;
public:
-
enum DispatcherFlags
{
CD_STATIC_STATIC_REPORTED = 1,
@@ -73,103 +68,100 @@ public:
CD_DISABLE_CONTACTPOOL_DYNAMIC_ALLOCATION = 4
};
- int getDispatcherFlags() const
+ int getDispatcherFlags() const
{
return m_dispatcherFlags;
}
- void setDispatcherFlags(int flags)
+ 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 registerCollisionCreateFunc(int proxyType0, int proxyType1, btCollisionAlgorithmCreateFunc* createFunc);
- void registerClosestPointsCreateFunc(int proxyType0, int proxyType1, btCollisionAlgorithmCreateFunc *createFunc);
+ void registerClosestPointsCreateFunc(int proxyType0, int proxyType1, btCollisionAlgorithmCreateFunc* createFunc);
- int getNumManifolds() const
- {
- return int( m_manifoldsPtr.size());
+ int getNumManifolds() const
+ {
+ return int(m_manifoldsPtr.size());
}
- btPersistentManifold** getInternalManifoldPointer()
+ btPersistentManifold** getInternalManifoldPointer()
{
- return m_manifoldsPtr.size()? &m_manifoldsPtr[0] : 0;
+ return m_manifoldsPtr.size() ? &m_manifoldsPtr[0] : 0;
}
- btPersistentManifold* getManifoldByIndexInternal(int index)
+ btPersistentManifold* getManifoldByIndexInternal(int index)
{
return m_manifoldsPtr[index];
}
- const btPersistentManifold* getManifoldByIndexInternal(int index) const
+ const btPersistentManifold* getManifoldByIndexInternal(int index) const
{
return m_manifoldsPtr[index];
}
- btCollisionDispatcher (btCollisionConfiguration* collisionConfiguration);
+ btCollisionDispatcher(btCollisionConfiguration* collisionConfiguration);
virtual ~btCollisionDispatcher();
- virtual btPersistentManifold* getNewManifold(const btCollisionObject* b0,const btCollisionObject* b1);
-
- virtual void releaseManifold(btPersistentManifold* manifold);
+ virtual btPersistentManifold* getNewManifold(const btCollisionObject* b0, const btCollisionObject* b1);
+ virtual void releaseManifold(btPersistentManifold* manifold);
virtual void clearManifold(btPersistentManifold* manifold);
- btCollisionAlgorithm* findAlgorithm(const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,btPersistentManifold* sharedManifold, ebtDispatcherQueryType queryType);
-
- virtual bool needsCollision(const btCollisionObject* body0,const btCollisionObject* body1);
-
- virtual bool needsResponse(const btCollisionObject* body0,const btCollisionObject* body1);
-
- virtual void dispatchAllCollisionPairs(btOverlappingPairCache* pairCache,const btDispatcherInfo& dispatchInfo,btDispatcher* dispatcher) ;
+ btCollisionAlgorithm* findAlgorithm(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, btPersistentManifold* sharedManifold, ebtDispatcherQueryType queryType);
+
+ virtual bool needsCollision(const btCollisionObject* body0, const btCollisionObject* body1);
+
+ virtual bool needsResponse(const btCollisionObject* body0, const btCollisionObject* body1);
- void setNearCallback(btNearCallback nearCallback)
+ virtual void dispatchAllCollisionPairs(btOverlappingPairCache* pairCache, const btDispatcherInfo& dispatchInfo, btDispatcher* dispatcher);
+
+ void setNearCallback(btNearCallback nearCallback)
{
- m_nearCallback = nearCallback;
+ m_nearCallback = nearCallback;
}
- btNearCallback getNearCallback() const
+ btNearCallback getNearCallback() const
{
return m_nearCallback;
}
//by default, Bullet will use this near callback
- static void defaultNearCallback(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo);
+ static void defaultNearCallback(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo);
- virtual void* allocateCollisionAlgorithm(int size);
+ virtual void* allocateCollisionAlgorithm(int size);
- virtual void freeCollisionAlgorithm(void* ptr);
+ virtual void freeCollisionAlgorithm(void* ptr);
- btCollisionConfiguration* getCollisionConfiguration()
+ btCollisionConfiguration* getCollisionConfiguration()
{
return m_collisionConfiguration;
}
- const btCollisionConfiguration* getCollisionConfiguration() const
+ const btCollisionConfiguration* getCollisionConfiguration() const
{
return m_collisionConfiguration;
}
- void setCollisionConfiguration(btCollisionConfiguration* config)
+ void setCollisionConfiguration(btCollisionConfiguration* config)
{
m_collisionConfiguration = config;
}
- virtual btPoolAllocator* getInternalManifoldPool()
+ virtual btPoolAllocator* getInternalManifoldPool()
{
return m_persistentManifoldPoolAllocator;
}
- virtual const btPoolAllocator* getInternalManifoldPool() const
+ virtual const btPoolAllocator* getInternalManifoldPool() const
{
return m_persistentManifoldPoolAllocator;
}
-
};
-#endif //BT_COLLISION__DISPATCHER_H
-
+#endif //BT_COLLISION__DISPATCHER_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.cpp
index 075860c503..6fe56538d2 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.cpp
@@ -13,8 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
-
#include "btCollisionDispatcherMt.h"
#include "LinearMath/btQuickprof.h"
@@ -27,138 +25,132 @@ subject to the following restrictions:
#include "BulletCollision/CollisionDispatch/btCollisionConfiguration.h"
#include "BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h"
-
-btCollisionDispatcherMt::btCollisionDispatcherMt( btCollisionConfiguration* config, int grainSize )
- : btCollisionDispatcher( config )
+btCollisionDispatcherMt::btCollisionDispatcherMt(btCollisionConfiguration* config, int grainSize)
+ : btCollisionDispatcher(config)
{
- m_batchUpdating = false;
- m_grainSize = grainSize; // iterations per task
+ m_batchUpdating = false;
+ m_grainSize = grainSize; // iterations per task
}
-
-btPersistentManifold* btCollisionDispatcherMt::getNewManifold( const btCollisionObject* body0, const btCollisionObject* body1 )
+btPersistentManifold* btCollisionDispatcherMt::getNewManifold(const btCollisionObject* body0, const btCollisionObject* body1)
{
- //optional relative contact breaking threshold, turned on by default (use setDispatcherFlags to switch off feature for improved performance)
-
- btScalar contactBreakingThreshold = ( m_dispatcherFlags & btCollisionDispatcher::CD_USE_RELATIVE_CONTACT_BREAKING_THRESHOLD ) ?
- btMin( body0->getCollisionShape()->getContactBreakingThreshold( gContactBreakingThreshold ), body1->getCollisionShape()->getContactBreakingThreshold( gContactBreakingThreshold ) )
- : gContactBreakingThreshold;
-
- btScalar contactProcessingThreshold = btMin( body0->getContactProcessingThreshold(), body1->getContactProcessingThreshold() );
-
- void* mem = m_persistentManifoldPoolAllocator->allocate( sizeof( btPersistentManifold ) );
- if ( NULL == mem )
- {
- //we got a pool memory overflow, by default we fallback to dynamically allocate memory. If we require a contiguous contact pool then assert.
- if ( ( m_dispatcherFlags&CD_DISABLE_CONTACTPOOL_DYNAMIC_ALLOCATION ) == 0 )
- {
- mem = btAlignedAlloc( sizeof( btPersistentManifold ), 16 );
- }
- else
- {
- btAssert( 0 );
- //make sure to increase the m_defaultMaxPersistentManifoldPoolSize in the btDefaultCollisionConstructionInfo/btDefaultCollisionConfiguration
- return 0;
- }
- }
- btPersistentManifold* manifold = new( mem ) btPersistentManifold( body0, body1, 0, contactBreakingThreshold, contactProcessingThreshold );
- if ( !m_batchUpdating )
- {
- // batch updater will update manifold pointers array after finishing, so
- // only need to update array when not batch-updating
- //btAssert( !btThreadsAreRunning() );
- manifold->m_index1a = m_manifoldsPtr.size();
- m_manifoldsPtr.push_back( manifold );
- }
-
- return manifold;
+ //optional relative contact breaking threshold, turned on by default (use setDispatcherFlags to switch off feature for improved performance)
+
+ btScalar contactBreakingThreshold = (m_dispatcherFlags & btCollisionDispatcher::CD_USE_RELATIVE_CONTACT_BREAKING_THRESHOLD) ? btMin(body0->getCollisionShape()->getContactBreakingThreshold(gContactBreakingThreshold), body1->getCollisionShape()->getContactBreakingThreshold(gContactBreakingThreshold))
+ : gContactBreakingThreshold;
+
+ btScalar contactProcessingThreshold = btMin(body0->getContactProcessingThreshold(), body1->getContactProcessingThreshold());
+
+ void* mem = m_persistentManifoldPoolAllocator->allocate(sizeof(btPersistentManifold));
+ if (NULL == mem)
+ {
+ //we got a pool memory overflow, by default we fallback to dynamically allocate memory. If we require a contiguous contact pool then assert.
+ if ((m_dispatcherFlags & CD_DISABLE_CONTACTPOOL_DYNAMIC_ALLOCATION) == 0)
+ {
+ mem = btAlignedAlloc(sizeof(btPersistentManifold), 16);
+ }
+ else
+ {
+ btAssert(0);
+ //make sure to increase the m_defaultMaxPersistentManifoldPoolSize in the btDefaultCollisionConstructionInfo/btDefaultCollisionConfiguration
+ return 0;
+ }
+ }
+ btPersistentManifold* manifold = new (mem) btPersistentManifold(body0, body1, 0, contactBreakingThreshold, contactProcessingThreshold);
+ if (!m_batchUpdating)
+ {
+ // batch updater will update manifold pointers array after finishing, so
+ // only need to update array when not batch-updating
+ //btAssert( !btThreadsAreRunning() );
+ manifold->m_index1a = m_manifoldsPtr.size();
+ m_manifoldsPtr.push_back(manifold);
+ }
+
+ return manifold;
}
-void btCollisionDispatcherMt::releaseManifold( btPersistentManifold* manifold )
+void btCollisionDispatcherMt::releaseManifold(btPersistentManifold* manifold)
{
- clearManifold( manifold );
- //btAssert( !btThreadsAreRunning() );
- if ( !m_batchUpdating )
- {
- // batch updater will update manifold pointers array after finishing, so
- // only need to update array when not batch-updating
- int findIndex = manifold->m_index1a;
- btAssert( findIndex < m_manifoldsPtr.size() );
- m_manifoldsPtr.swap( findIndex, m_manifoldsPtr.size() - 1 );
- m_manifoldsPtr[ findIndex ]->m_index1a = findIndex;
- m_manifoldsPtr.pop_back();
- }
-
- manifold->~btPersistentManifold();
- if ( m_persistentManifoldPoolAllocator->validPtr( manifold ) )
- {
- m_persistentManifoldPoolAllocator->freeMemory( manifold );
- }
- else
- {
- btAlignedFree( manifold );
- }
+ clearManifold(manifold);
+ //btAssert( !btThreadsAreRunning() );
+ if (!m_batchUpdating)
+ {
+ // batch updater will update manifold pointers array after finishing, so
+ // only need to update array when not batch-updating
+ int findIndex = manifold->m_index1a;
+ btAssert(findIndex < m_manifoldsPtr.size());
+ m_manifoldsPtr.swap(findIndex, m_manifoldsPtr.size() - 1);
+ m_manifoldsPtr[findIndex]->m_index1a = findIndex;
+ m_manifoldsPtr.pop_back();
+ }
+
+ manifold->~btPersistentManifold();
+ if (m_persistentManifoldPoolAllocator->validPtr(manifold))
+ {
+ m_persistentManifoldPoolAllocator->freeMemory(manifold);
+ }
+ else
+ {
+ btAlignedFree(manifold);
+ }
}
struct CollisionDispatcherUpdater : public btIParallelForBody
{
- btBroadphasePair* mPairArray;
- btNearCallback mCallback;
- btCollisionDispatcher* mDispatcher;
- const btDispatcherInfo* mInfo;
-
- CollisionDispatcherUpdater()
- {
- mPairArray = NULL;
- mCallback = NULL;
- mDispatcher = NULL;
- mInfo = NULL;
- }
- void forLoop( int iBegin, int iEnd ) const
- {
- for ( int i = iBegin; i < iEnd; ++i )
- {
- btBroadphasePair* pair = &mPairArray[ i ];
- mCallback( *pair, *mDispatcher, *mInfo );
- }
- }
+ btBroadphasePair* mPairArray;
+ btNearCallback mCallback;
+ btCollisionDispatcher* mDispatcher;
+ const btDispatcherInfo* mInfo;
+
+ CollisionDispatcherUpdater()
+ {
+ mPairArray = NULL;
+ mCallback = NULL;
+ mDispatcher = NULL;
+ mInfo = NULL;
+ }
+ void forLoop(int iBegin, int iEnd) const
+ {
+ for (int i = iBegin; i < iEnd; ++i)
+ {
+ btBroadphasePair* pair = &mPairArray[i];
+ mCallback(*pair, *mDispatcher, *mInfo);
+ }
+ }
};
-
-void btCollisionDispatcherMt::dispatchAllCollisionPairs( btOverlappingPairCache* pairCache, const btDispatcherInfo& info, btDispatcher* dispatcher )
+void btCollisionDispatcherMt::dispatchAllCollisionPairs(btOverlappingPairCache* pairCache, const btDispatcherInfo& info, btDispatcher* dispatcher)
{
- int pairCount = pairCache->getNumOverlappingPairs();
- if ( pairCount == 0 )
- {
- return;
- }
- CollisionDispatcherUpdater updater;
- updater.mCallback = getNearCallback();
- updater.mPairArray = pairCache->getOverlappingPairArrayPtr();
- updater.mDispatcher = this;
- updater.mInfo = &info;
-
- m_batchUpdating = true;
- btParallelFor( 0, pairCount, m_grainSize, updater );
- m_batchUpdating = false;
-
- // reconstruct the manifolds array to ensure determinism
- m_manifoldsPtr.resizeNoInitialize( 0 );
-
- btBroadphasePair* pairs = pairCache->getOverlappingPairArrayPtr();
- for ( int i = 0; i < pairCount; ++i )
- {
- if (btCollisionAlgorithm* algo = pairs[ i ].m_algorithm)
- {
- algo->getAllContactManifolds( m_manifoldsPtr );
- }
- }
-
- // update the indices (used when releasing manifolds)
- for ( int i = 0; i < m_manifoldsPtr.size(); ++i )
- {
- m_manifoldsPtr[ i ]->m_index1a = i;
- }
+ int pairCount = pairCache->getNumOverlappingPairs();
+ if (pairCount == 0)
+ {
+ return;
+ }
+ CollisionDispatcherUpdater updater;
+ updater.mCallback = getNearCallback();
+ updater.mPairArray = pairCache->getOverlappingPairArrayPtr();
+ updater.mDispatcher = this;
+ updater.mInfo = &info;
+
+ m_batchUpdating = true;
+ btParallelFor(0, pairCount, m_grainSize, updater);
+ m_batchUpdating = false;
+
+ // reconstruct the manifolds array to ensure determinism
+ m_manifoldsPtr.resizeNoInitialize(0);
+
+ btBroadphasePair* pairs = pairCache->getOverlappingPairArrayPtr();
+ for (int i = 0; i < pairCount; ++i)
+ {
+ if (btCollisionAlgorithm* algo = pairs[i].m_algorithm)
+ {
+ algo->getAllContactManifolds(m_manifoldsPtr);
+ }
+ }
+
+ // update the indices (used when releasing manifolds)
+ for (int i = 0; i < m_manifoldsPtr.size(); ++i)
+ {
+ m_manifoldsPtr[i]->m_index1a = i;
+ }
}
-
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.h
index f1d7eafdc9..28eba7f32a 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.h
@@ -19,21 +19,19 @@ subject to the following restrictions:
#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h"
#include "LinearMath/btThreads.h"
-
class btCollisionDispatcherMt : public btCollisionDispatcher
{
public:
- btCollisionDispatcherMt( btCollisionConfiguration* config, int grainSize = 40 );
+ btCollisionDispatcherMt(btCollisionConfiguration* config, int grainSize = 40);
- virtual btPersistentManifold* getNewManifold( const btCollisionObject* body0, const btCollisionObject* body1 ) BT_OVERRIDE;
- virtual void releaseManifold( btPersistentManifold* manifold ) BT_OVERRIDE;
+ virtual btPersistentManifold* getNewManifold(const btCollisionObject* body0, const btCollisionObject* body1) BT_OVERRIDE;
+ virtual void releaseManifold(btPersistentManifold* manifold) BT_OVERRIDE;
- virtual void dispatchAllCollisionPairs( btOverlappingPairCache* pairCache, const btDispatcherInfo& info, btDispatcher* dispatcher ) BT_OVERRIDE;
+ virtual void dispatchAllCollisionPairs(btOverlappingPairCache* pairCache, const btDispatcherInfo& info, btDispatcher* dispatcher) BT_OVERRIDE;
protected:
- bool m_batchUpdating;
- int m_grainSize;
+ bool m_batchUpdating;
+ int m_grainSize;
};
-#endif //BT_COLLISION_DISPATCHER_MT_H
-
+#endif //BT_COLLISION_DISPATCHER_MT_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionObject.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionObject.cpp
index 05f96a14bc..98a02d0c45 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionObject.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionObject.cpp
@@ -13,42 +13,41 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btCollisionObject.h"
#include "LinearMath/btSerializer.h"
#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
btCollisionObject::btCollisionObject()
- : m_interpolationLinearVelocity(0.f, 0.f, 0.f),
- m_interpolationAngularVelocity(0.f, 0.f, 0.f),
- m_anisotropicFriction(1.f,1.f,1.f),
- m_hasAnisotropicFriction(false),
- m_contactProcessingThreshold(BT_LARGE_FLOAT),
- m_broadphaseHandle(0),
- m_collisionShape(0),
- m_extensionPointer(0),
- m_rootCollisionShape(0),
- m_collisionFlags(btCollisionObject::CF_STATIC_OBJECT),
- m_islandTag1(-1),
- m_companionId(-1),
- m_worldArrayIndex(-1),
- m_activationState1(1),
- m_deactivationTime(btScalar(0.)),
- m_friction(btScalar(0.5)),
- m_restitution(btScalar(0.)),
- m_rollingFriction(0.0f),
- m_spinningFriction(0.f),
- m_contactDamping(.1),
- m_contactStiffness(BT_LARGE_FLOAT),
- m_internalType(CO_COLLISION_OBJECT),
- m_userObjectPointer(0),
- m_userIndex2(-1),
- m_userIndex(-1),
- m_hitFraction(btScalar(1.)),
- m_ccdSweptSphereRadius(btScalar(0.)),
- m_ccdMotionThreshold(btScalar(0.)),
- m_checkCollideWith(false),
- m_updateRevision(0)
+ : m_interpolationLinearVelocity(0.f, 0.f, 0.f),
+ m_interpolationAngularVelocity(0.f, 0.f, 0.f),
+ m_anisotropicFriction(1.f, 1.f, 1.f),
+ m_hasAnisotropicFriction(false),
+ m_contactProcessingThreshold(BT_LARGE_FLOAT),
+ m_broadphaseHandle(0),
+ m_collisionShape(0),
+ m_extensionPointer(0),
+ m_rootCollisionShape(0),
+ m_collisionFlags(btCollisionObject::CF_STATIC_OBJECT),
+ m_islandTag1(-1),
+ m_companionId(-1),
+ m_worldArrayIndex(-1),
+ m_activationState1(1),
+ m_deactivationTime(btScalar(0.)),
+ m_friction(btScalar(0.5)),
+ m_restitution(btScalar(0.)),
+ m_rollingFriction(0.0f),
+ m_spinningFriction(0.f),
+ m_contactDamping(.1),
+ m_contactStiffness(BT_LARGE_FLOAT),
+ m_internalType(CO_COLLISION_OBJECT),
+ m_userObjectPointer(0),
+ m_userIndex2(-1),
+ m_userIndex(-1),
+ m_hitFraction(btScalar(1.)),
+ m_ccdSweptSphereRadius(btScalar(0.)),
+ m_ccdMotionThreshold(btScalar(0.)),
+ m_checkCollideWith(false),
+ m_updateRevision(0)
{
m_worldTransform.setIdentity();
m_interpolationWorldTransform.setIdentity();
@@ -59,8 +58,8 @@ btCollisionObject::~btCollisionObject()
}
void btCollisionObject::setActivationState(int newState) const
-{
- if ( (m_activationState1 != DISABLE_DEACTIVATION) && (m_activationState1 != DISABLE_SIMULATION))
+{
+ if ((m_activationState1 != DISABLE_DEACTIVATION) && (m_activationState1 != DISABLE_SIMULATION))
m_activationState1 = newState;
}
@@ -71,7 +70,7 @@ void btCollisionObject::forceActivationState(int newState) const
void btCollisionObject::activate(bool forceActivation) const
{
- if (forceActivation || !(m_collisionFlags & (CF_STATIC_OBJECT|CF_KINEMATIC_OBJECT)))
+ if (forceActivation || !(m_collisionFlags & (CF_STATIC_OBJECT | CF_KINEMATIC_OBJECT)))
{
setActivationState(ACTIVE_TAG);
m_deactivationTime = btScalar(0.);
@@ -80,7 +79,6 @@ void btCollisionObject::activate(bool forceActivation) const
const char* btCollisionObject::serialize(void* dataBuffer, btSerializer* serializer) const
{
-
btCollisionObjectData* dataOut = (btCollisionObjectData*)dataBuffer;
m_worldTransform.serialize(dataOut->m_worldTransform);
@@ -92,7 +90,7 @@ const char* btCollisionObject::serialize(void* dataBuffer, btSerializer* seriali
dataOut->m_contactProcessingThreshold = m_contactProcessingThreshold;
dataOut->m_broadphaseHandle = 0;
dataOut->m_collisionShape = serializer->getUniquePointer(m_collisionShape);
- dataOut->m_rootCollisionShape = 0;//@todo
+ dataOut->m_rootCollisionShape = 0; //@todo
dataOut->m_collisionFlags = m_collisionFlags;
dataOut->m_islandTag1 = m_islandTag1;
dataOut->m_companionId = m_companionId;
@@ -104,8 +102,8 @@ const char* btCollisionObject::serialize(void* dataBuffer, btSerializer* seriali
dataOut->m_contactStiffness = m_contactStiffness;
dataOut->m_restitution = m_restitution;
dataOut->m_internalType = m_internalType;
-
- char* name = (char*) serializer->findNameForPointer(this);
+
+ char* name = (char*)serializer->findNameForPointer(this);
dataOut->m_name = (char*)serializer->getUniquePointer(name);
if (dataOut->m_name)
{
@@ -130,11 +128,10 @@ const char* btCollisionObject::serialize(void* dataBuffer, btSerializer* seriali
return btCollisionObjectDataName;
}
-
void btCollisionObject::serializeSingleObject(class btSerializer* serializer) const
{
int len = calculateSerializeBufferSize();
- btChunk* chunk = serializer->allocate(len,1);
+ btChunk* chunk = serializer->allocate(len, 1);
const char* structType = serialize(chunk->m_oldPtr, serializer);
- serializer->finalizeChunk(chunk,structType,BT_COLLISIONOBJECT_CODE,(void*)this);
+ serializer->finalizeChunk(chunk, structType, BT_COLLISIONOBJECT_CODE, (void*)this);
}
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionObject.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionObject.h
index 135f8a033c..56b3d89e56 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionObject.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionObject.h
@@ -25,8 +25,8 @@ subject to the following restrictions:
#define DISABLE_DEACTIVATION 4
#define DISABLE_SIMULATION 5
-struct btBroadphaseProxy;
-class btCollisionShape;
+struct btBroadphaseProxy;
+class btCollisionShape;
struct btCollisionShapeData;
#include "LinearMath/btMotionState.h"
#include "LinearMath/btAlignedAllocator.h"
@@ -42,123 +42,118 @@ typedef btAlignedObjectArray<class btCollisionObject*> btCollisionObjectArray;
#define btCollisionObjectDataName "btCollisionObjectFloatData"
#endif
-
-/// btCollisionObject can be used to manage collision detection objects.
+/// 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
+ATTRIBUTE_ALIGNED16(class)
+btCollisionObject
{
-
protected:
-
- btTransform m_worldTransform;
+ 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)
+ 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;
+ 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;
-
+ 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;
+ btCollisionShape* m_rootCollisionShape;
- int m_collisionFlags;
+ int m_collisionFlags;
- int m_islandTag1;
- int m_companionId;
- int m_worldArrayIndex; // index of object in world's collisionObjects array
+ 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;
+ 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;
-
-
+ 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;
+ int m_internalType;
///users can point to their objects, m_userPointer is not used by Bullet, see setUserPointer/getUserPointer
- void* m_userObjectPointer;
+ void* m_userObjectPointer;
- int m_userIndex2;
-
- int m_userIndex;
+ int m_userIndex2;
+
+ int m_userIndex;
///time of impact calculation
- btScalar m_hitFraction;
-
+ btScalar m_hitFraction;
+
///Swept sphere radius (0.0 by default), see btConvexConvexAlgorithm::
- btScalar m_ccdSweptSphereRadius;
+ btScalar m_ccdSweptSphereRadius;
/// Don't do continuous collision detection if the motion (in one step) is less then m_ccdMotionThreshold
- btScalar m_ccdMotionThreshold;
-
+ btScalar m_ccdMotionThreshold;
+
/// If some object should have elaborate collision filtering by sub-classes
- int m_checkCollideWith;
+ int m_checkCollideWith;
btAlignedObjectArray<const btCollisionObject*> 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;
+ int m_updateRevision;
- btVector3 m_customDebugColorRGB;
+ btVector3 m_customDebugColorRGB;
public:
-
BT_DECLARE_ALIGNED_ALLOCATOR();
enum CollisionFlags
{
- CF_STATIC_OBJECT= 1,
- CF_KINEMATIC_OBJECT= 2,
+ 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_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_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
+ enum CollisionObjectTypes
{
- CO_COLLISION_OBJECT =1,
- CO_RIGID_BODY=2,
+ 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
+ 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_DISABLED = 0,
CF_ANISOTROPIC_FRICTION = 1,
CF_ANISOTROPIC_ROLLING_FRICTION = 2
};
@@ -166,76 +161,77 @@ public:
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);
+ 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)
+ 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 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
+ bool hasAnisotropicFriction(int frictionMode = CF_ANISOTROPIC_FRICTION) const
{
- return (m_hasAnisotropicFriction&frictionMode)!=0;
+ 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)
+ void setContactProcessingThreshold(btScalar contactProcessingThreshold)
{
m_contactProcessingThreshold = contactProcessingThreshold;
}
- btScalar getContactProcessingThreshold() const
+ btScalar getContactProcessingThreshold() const
{
return m_contactProcessingThreshold;
}
- SIMD_FORCE_INLINE bool isStaticObject() const {
+ SIMD_FORCE_INLINE bool isStaticObject() const
+ {
return (m_collisionFlags & CF_STATIC_OBJECT) != 0;
}
- SIMD_FORCE_INLINE bool isKinematicObject() const
+ SIMD_FORCE_INLINE bool isKinematicObject() const
{
return (m_collisionFlags & CF_KINEMATIC_OBJECT) != 0;
}
- SIMD_FORCE_INLINE bool isStaticOrKinematicObject() const
+ SIMD_FORCE_INLINE bool isStaticOrKinematicObject() const
{
- return (m_collisionFlags & (CF_KINEMATIC_OBJECT | CF_STATIC_OBJECT)) != 0 ;
+ return (m_collisionFlags & (CF_KINEMATIC_OBJECT | CF_STATIC_OBJECT)) != 0;
}
- SIMD_FORCE_INLINE bool hasContactResponse() const {
- return (m_collisionFlags & CF_NO_CONTACT_RESPONSE)==0;
+ SIMD_FORCE_INLINE bool hasContactResponse() const
+ {
+ return (m_collisionFlags & CF_NO_CONTACT_RESPONSE) == 0;
}
-
btCollisionObject();
virtual ~btCollisionObject();
- virtual void setCollisionShape(btCollisionShape* collisionShape)
+ virtual void setCollisionShape(btCollisionShape * collisionShape)
{
m_updateRevision++;
m_collisionShape = collisionShape;
m_rootCollisionShape = collisionShape;
}
- SIMD_FORCE_INLINE const btCollisionShape* getCollisionShape() const
+ SIMD_FORCE_INLINE const btCollisionShape* getCollisionShape() const
{
return m_collisionShape;
}
- SIMD_FORCE_INLINE btCollisionShape* getCollisionShape()
+ SIMD_FORCE_INLINE btCollisionShape* getCollisionShape()
{
return m_collisionShape;
}
- void setIgnoreCollisionCheck(const btCollisionObject* co, bool ignoreCollisionCheck)
+ void setIgnoreCollisionCheck(const btCollisionObject* co, bool ignoreCollisionCheck)
{
if (ignoreCollisionCheck)
{
@@ -253,7 +249,7 @@ public:
m_checkCollideWith = m_objectsWithoutCollisionCheck.size() > 0;
}
- virtual bool checkCollideWithOverride(const btCollisionObject* co) const
+ virtual bool checkCollideWithOverride(const btCollisionObject* co) const
{
int index = m_objectsWithoutCollisionCheck.findLinearSearch(co);
if (index < m_objectsWithoutCollisionCheck.size())
@@ -263,317 +259,309 @@ public:
return true;
}
-
-
-
- ///Avoid using this internal API call, the extension pointer is used by some Bullet extensions.
+ ///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
+ 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)
+ void internalSetExtensionPointer(void* pointer)
{
m_extensionPointer = pointer;
}
- SIMD_FORCE_INLINE int getActivationState() const { return m_activationState1;}
-
+ SIMD_FORCE_INLINE int getActivationState() const { return m_activationState1; }
+
void setActivationState(int newState) const;
- void setDeactivationTime(btScalar time)
+ void setDeactivationTime(btScalar time)
{
m_deactivationTime = time;
}
- btScalar getDeactivationTime() const
+ btScalar getDeactivationTime() const
{
return m_deactivationTime;
}
void forceActivationState(int newState) const;
- void activate(bool forceActivation = false) const;
+ void activate(bool forceActivation = false) const;
SIMD_FORCE_INLINE bool isActive() const
{
return ((getActivationState() != ISLAND_SLEEPING) && (getActivationState() != DISABLE_SIMULATION));
}
- void setRestitution(btScalar rest)
+ void setRestitution(btScalar rest)
{
m_updateRevision++;
m_restitution = rest;
}
- btScalar getRestitution() const
+ btScalar getRestitution() const
{
return m_restitution;
}
- void setFriction(btScalar frict)
+ void setFriction(btScalar frict)
{
m_updateRevision++;
m_friction = frict;
}
- btScalar getFriction() const
+ btScalar getFriction() const
{
return m_friction;
}
- void setRollingFriction(btScalar frict)
+ void setRollingFriction(btScalar frict)
{
m_updateRevision++;
m_rollingFriction = frict;
}
- btScalar getRollingFriction() const
+ 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)
+ 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
+
+ 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
+
+ btScalar getContactDamping() const
{
return m_contactDamping;
}
-
+
///reserved for Bullet internal usage
- int getInternalType() const
+ int getInternalType() const
{
return m_internalType;
}
- btTransform& getWorldTransform()
+ btTransform& getWorldTransform()
{
return m_worldTransform;
}
- const btTransform& getWorldTransform() const
+ const btTransform& getWorldTransform() const
{
return m_worldTransform;
}
- void setWorldTransform(const btTransform& worldTrans)
+ void setWorldTransform(const btTransform& worldTrans)
{
m_updateRevision++;
m_worldTransform = worldTrans;
}
-
- SIMD_FORCE_INLINE btBroadphaseProxy* getBroadphaseHandle()
+ SIMD_FORCE_INLINE btBroadphaseProxy* getBroadphaseHandle()
{
return m_broadphaseHandle;
}
- SIMD_FORCE_INLINE const btBroadphaseProxy* getBroadphaseHandle() const
+ SIMD_FORCE_INLINE const btBroadphaseProxy* getBroadphaseHandle() const
{
return m_broadphaseHandle;
}
- void setBroadphaseHandle(btBroadphaseProxy* handle)
+ void setBroadphaseHandle(btBroadphaseProxy * handle)
{
m_broadphaseHandle = handle;
}
-
- const btTransform& getInterpolationWorldTransform() const
+ const btTransform& getInterpolationWorldTransform() const
{
return m_interpolationWorldTransform;
}
- btTransform& getInterpolationWorldTransform()
+ btTransform& getInterpolationWorldTransform()
{
return m_interpolationWorldTransform;
}
- void setInterpolationWorldTransform(const btTransform& trans)
+ void setInterpolationWorldTransform(const btTransform& trans)
{
m_updateRevision++;
m_interpolationWorldTransform = trans;
}
- void setInterpolationLinearVelocity(const btVector3& linvel)
+ void setInterpolationLinearVelocity(const btVector3& linvel)
{
m_updateRevision++;
m_interpolationLinearVelocity = linvel;
}
- void setInterpolationAngularVelocity(const btVector3& angvel)
+ void setInterpolationAngularVelocity(const btVector3& angvel)
{
m_updateRevision++;
m_interpolationAngularVelocity = angvel;
}
- const btVector3& getInterpolationLinearVelocity() const
+ const btVector3& getInterpolationLinearVelocity() const
{
return m_interpolationLinearVelocity;
}
- const btVector3& getInterpolationAngularVelocity() const
+ const btVector3& getInterpolationAngularVelocity() const
{
return m_interpolationAngularVelocity;
}
SIMD_FORCE_INLINE int getIslandTag() const
{
- return m_islandTag1;
+ return m_islandTag1;
}
- void setIslandTag(int tag)
+ void setIslandTag(int tag)
{
m_islandTag1 = tag;
}
SIMD_FORCE_INLINE int getCompanionId() const
{
- return m_companionId;
+ return m_companionId;
}
- void setCompanionId(int id)
+ void setCompanionId(int id)
{
m_companionId = id;
}
- SIMD_FORCE_INLINE int getWorldArrayIndex() const
- {
- return m_worldArrayIndex;
- }
+ SIMD_FORCE_INLINE int getWorldArrayIndex() const
+ {
+ return m_worldArrayIndex;
+ }
- // only should be called by CollisionWorld
- void setWorldArrayIndex(int ix)
- {
- m_worldArrayIndex = ix;
- }
+ // only should be called by CollisionWorld
+ void setWorldArrayIndex(int ix)
+ {
+ m_worldArrayIndex = ix;
+ }
- SIMD_FORCE_INLINE btScalar getHitFraction() const
+ SIMD_FORCE_INLINE btScalar getHitFraction() const
{
- return m_hitFraction;
+ return m_hitFraction;
}
- void setHitFraction(btScalar hitFraction)
+ void setHitFraction(btScalar hitFraction)
{
m_hitFraction = hitFraction;
}
-
- SIMD_FORCE_INLINE int getCollisionFlags() const
+ SIMD_FORCE_INLINE int getCollisionFlags() const
{
return m_collisionFlags;
}
- void setCollisionFlags(int flags)
+ void setCollisionFlags(int flags)
{
m_collisionFlags = flags;
}
-
+
///Swept sphere radius (0.0 by default), see btConvexConvexAlgorithm::
- btScalar getCcdSweptSphereRadius() const
+ btScalar getCcdSweptSphereRadius() const
{
return m_ccdSweptSphereRadius;
}
///Swept sphere radius (0.0 by default), see btConvexConvexAlgorithm::
- void setCcdSweptSphereRadius(btScalar radius)
+ void setCcdSweptSphereRadius(btScalar radius)
{
m_ccdSweptSphereRadius = radius;
}
- btScalar getCcdMotionThreshold() const
+ btScalar getCcdMotionThreshold() const
{
return m_ccdMotionThreshold;
}
- btScalar getCcdSquareMotionThreshold() const
+ btScalar getCcdSquareMotionThreshold() const
{
- return m_ccdMotionThreshold*m_ccdMotionThreshold;
+ 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)
+ void setCcdMotionThreshold(btScalar ccdMotionThreshold)
{
m_ccdMotionThreshold = ccdMotionThreshold;
}
///users can point to their objects, userPointer is not used by Bullet
- void* getUserPointer() const
+ void* getUserPointer() const
{
return m_userObjectPointer;
}
- int getUserIndex() const
+ int getUserIndex() const
{
return m_userIndex;
}
-
- int getUserIndex2() const
+
+ int getUserIndex2() const
{
return m_userIndex2;
}
-
+
///users can point to their objects, userPointer is not used by Bullet
- void setUserPointer(void* userPointer)
+ void setUserPointer(void* userPointer)
{
m_userObjectPointer = userPointer;
}
///users can point to their objects, userPointer is not used by Bullet
- void setUserIndex(int index)
+ void setUserIndex(int index)
{
m_userIndex = index;
}
-
- void setUserIndex2(int index)
+
+ void setUserIndex2(int index)
{
m_userIndex2 = index;
}
- int getUpdateRevisionInternal() const
+ int getUpdateRevisionInternal() const
{
return m_updateRevision;
}
- void setCustomDebugColor(const btVector3& colorRGB)
+ void setCustomDebugColor(const btVector3& colorRGB)
{
m_customDebugColorRGB = colorRGB;
m_collisionFlags |= CF_HAS_CUSTOM_DEBUG_RENDERING_COLOR;
}
- void removeCustomDebugColor()
+ void removeCustomDebugColor()
{
m_collisionFlags &= ~CF_HAS_CUSTOM_DEBUG_RENDERING_COLOR;
}
- bool getCustomDebugColor(btVector3& colorRGB) const
+ bool getCustomDebugColor(btVector3 & colorRGB) const
{
- bool hasCustomColor = (0!=(m_collisionFlags&CF_HAS_CUSTOM_DEBUG_RENDERING_COLOR));
+ bool hasCustomColor = (0 != (m_collisionFlags & CF_HAS_CUSTOM_DEBUG_RENDERING_COLOR));
if (hasCustomColor)
{
colorRGB = m_customDebugColorRGB;
@@ -589,15 +577,16 @@ public:
return true;
}
- virtual int calculateSerializeBufferSize() 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;
+ 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
{
@@ -667,14 +656,11 @@ struct btCollisionObjectFloatData
int m_collisionFilterMask;
int m_uniqueId;
};
+// clang-format on
-
-
-SIMD_FORCE_INLINE int btCollisionObject::calculateSerializeBufferSize() const
+SIMD_FORCE_INLINE int btCollisionObject::calculateSerializeBufferSize() const
{
return sizeof(btCollisionObjectData);
}
-
-
-#endif //BT_COLLISION_OBJECT_H
+#endif //BT_COLLISION_OBJECT_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h
index 952440b7de..1cc4a5ac5f 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h
@@ -1,25 +1,25 @@
#ifndef BT_COLLISION_OBJECT_WRAPPER_H
#define BT_COLLISION_OBJECT_WRAPPER_H
-///btCollisionObjectWrapperis an internal data structure.
+///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
+#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*);
+private: \
+ void* operator new(size_t size); \
+ void operator delete(void*);
struct btCollisionObjectWrapper;
struct btCollisionObjectWrapper
{
-BT_DECLARE_STACK_ONLY_OBJECT
+ BT_DECLARE_STACK_ONLY_OBJECT
private:
- btCollisionObjectWrapper(const btCollisionObjectWrapper&); // not implemented. Not allowed.
+ btCollisionObjectWrapper(const btCollisionObjectWrapper&); // not implemented. Not allowed.
btCollisionObjectWrapper* operator=(const btCollisionObjectWrapper&);
public:
@@ -27,17 +27,17 @@ public:
const btCollisionShape* m_shape;
const btCollisionObject* m_collisionObject;
const btTransform& m_worldTransform;
- int m_partId;
- int m_index;
+ 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_partId(partId), m_index(index)
- {}
+ : m_parent(parent), m_shape(shape), m_collisionObject(collisionObject), m_worldTransform(worldTransform), 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
+#endif //BT_COLLISION_OBJECT_WRAPPER_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionWorld.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionWorld.cpp
index 3de8d6995e..782e9efaf1 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionWorld.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionWorld.cpp
@@ -19,9 +19,9 @@ subject to the following restrictions:
#include "BulletCollision/CollisionShapes/btCollisionShape.h"
#include "BulletCollision/CollisionShapes/btConvexShape.h"
#include "BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h"
-#include "BulletCollision/CollisionShapes/btSphereShape.h" //for raycasting
-#include "BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h" //for raycasting
-#include "BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h" //for raycasting
+#include "BulletCollision/CollisionShapes/btSphereShape.h" //for raycasting
+#include "BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h" //for raycasting
+#include "BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h" //for raycasting
#include "BulletCollision/NarrowPhaseCollision/btRaycastCallback.h"
#include "BulletCollision/CollisionShapes/btCompoundShape.h"
#include "BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h"
@@ -38,7 +38,6 @@ subject to the following restrictions:
//#define DISABLE_DBVT_COMPOUNDSHAPE_RAYCAST_ACCELERATION
-
//#define USE_BRUTEFORCE_RAYBROADPHASE 1
//RECALCULATE_AABB is slower, but benefit is that you don't need to call 'stepSimulation' or 'updateAabbs' before using a rayTest
//#define RECALCULATE_AABB_RAYCAST 1
@@ -48,7 +47,6 @@ subject to the following restrictions:
#include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h"
#include "BulletCollision/CollisionDispatch/btCollisionConfiguration.h"
-
///for debug drawing
//for debug rendering
@@ -65,25 +63,21 @@ subject to the following restrictions:
#include "BulletCollision/CollisionShapes/btTriangleMeshShape.h"
#include "BulletCollision/CollisionShapes/btStaticPlaneShape.h"
-
-
-btCollisionWorld::btCollisionWorld(btDispatcher* dispatcher,btBroadphaseInterface* pairCache, btCollisionConfiguration* collisionConfiguration)
-:m_dispatcher1(dispatcher),
-m_broadphasePairCache(pairCache),
-m_debugDrawer(0),
-m_forceUpdateAllAabbs(true)
+btCollisionWorld::btCollisionWorld(btDispatcher* dispatcher, btBroadphaseInterface* pairCache, btCollisionConfiguration* collisionConfiguration)
+ : m_dispatcher1(dispatcher),
+ m_broadphasePairCache(pairCache),
+ m_debugDrawer(0),
+ m_forceUpdateAllAabbs(true)
{
}
-
btCollisionWorld::~btCollisionWorld()
{
-
//clean up remaining objects
int i;
- for (i=0;i<m_collisionObjects.size();i++)
+ for (i = 0; i < m_collisionObjects.size(); i++)
{
- btCollisionObject* collisionObject= m_collisionObjects[i];
+ btCollisionObject* collisionObject = m_collisionObjects[i];
btBroadphaseProxy* bp = collisionObject->getBroadphaseHandle();
if (bp)
@@ -91,74 +85,83 @@ btCollisionWorld::~btCollisionWorld()
//
// only clear the cached algorithms
//
- getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(bp,m_dispatcher1);
- getBroadphase()->destroyProxy(bp,m_dispatcher1);
+ getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(bp, m_dispatcher1);
+ getBroadphase()->destroyProxy(bp, m_dispatcher1);
collisionObject->setBroadphaseHandle(0);
}
}
-
-
}
-
-
-
-
-
-
-
-
-
-void btCollisionWorld::addCollisionObject(btCollisionObject* collisionObject, int collisionFilterGroup, int collisionFilterMask)
+void btCollisionWorld::refreshBroadphaseProxy(btCollisionObject* collisionObject)
{
+ if (collisionObject->getBroadphaseHandle())
+ {
+ int collisionFilterGroup = collisionObject->getBroadphaseHandle()->m_collisionFilterGroup;
+ int collisionFilterMask = collisionObject->getBroadphaseHandle()->m_collisionFilterMask;
+
+ getBroadphase()->destroyProxy(collisionObject->getBroadphaseHandle(), getDispatcher());
+
+ //calculate new AABB
+ btTransform trans = collisionObject->getWorldTransform();
+
+ btVector3 minAabb;
+ btVector3 maxAabb;
+ collisionObject->getCollisionShape()->getAabb(trans, minAabb, maxAabb);
+
+ int type = collisionObject->getCollisionShape()->getShapeType();
+ collisionObject->setBroadphaseHandle(getBroadphase()->createProxy(
+ minAabb,
+ maxAabb,
+ type,
+ collisionObject,
+ collisionFilterGroup,
+ collisionFilterMask,
+ m_dispatcher1));
+ }
+}
+void btCollisionWorld::addCollisionObject(btCollisionObject* collisionObject, int collisionFilterGroup, int collisionFilterMask)
+{
btAssert(collisionObject);
//check that the object isn't already added
- btAssert( m_collisionObjects.findLinearSearch(collisionObject) == m_collisionObjects.size());
- btAssert(collisionObject->getWorldArrayIndex() == -1); // do not add the same object to more than one collision world
+ btAssert(m_collisionObjects.findLinearSearch(collisionObject) == m_collisionObjects.size());
+ btAssert(collisionObject->getWorldArrayIndex() == -1); // do not add the same object to more than one collision world
- collisionObject->setWorldArrayIndex(m_collisionObjects.size());
+ collisionObject->setWorldArrayIndex(m_collisionObjects.size());
m_collisionObjects.push_back(collisionObject);
//calculate new AABB
btTransform trans = collisionObject->getWorldTransform();
- btVector3 minAabb;
- btVector3 maxAabb;
- collisionObject->getCollisionShape()->getAabb(trans,minAabb,maxAabb);
+ btVector3 minAabb;
+ btVector3 maxAabb;
+ collisionObject->getCollisionShape()->getAabb(trans, minAabb, maxAabb);
int type = collisionObject->getCollisionShape()->getShapeType();
- collisionObject->setBroadphaseHandle( getBroadphase()->createProxy(
+ collisionObject->setBroadphaseHandle(getBroadphase()->createProxy(
minAabb,
maxAabb,
type,
collisionObject,
collisionFilterGroup,
collisionFilterMask,
- m_dispatcher1)) ;
-
-
-
-
-
+ m_dispatcher1));
}
-
-
-void btCollisionWorld::updateSingleAabb(btCollisionObject* colObj)
+void btCollisionWorld::updateSingleAabb(btCollisionObject* colObj)
{
- btVector3 minAabb,maxAabb;
- colObj->getCollisionShape()->getAabb(colObj->getWorldTransform(), minAabb,maxAabb);
+ btVector3 minAabb, maxAabb;
+ colObj->getCollisionShape()->getAabb(colObj->getWorldTransform(), minAabb, maxAabb);
//need to increase the aabb for contact thresholds
- btVector3 contactThreshold(gContactBreakingThreshold,gContactBreakingThreshold,gContactBreakingThreshold);
+ btVector3 contactThreshold(gContactBreakingThreshold, gContactBreakingThreshold, gContactBreakingThreshold);
minAabb -= contactThreshold;
maxAabb += contactThreshold;
- if(getDispatchInfo().m_useContinuous && colObj->getInternalType()==btCollisionObject::CO_RIGID_BODY && !colObj->isStaticOrKinematicObject())
+ if (getDispatchInfo().m_useContinuous && colObj->getInternalType() == btCollisionObject::CO_RIGID_BODY && !colObj->isStaticOrKinematicObject())
{
- btVector3 minAabb2,maxAabb2;
- colObj->getCollisionShape()->getAabb(colObj->getInterpolationWorldTransform(),minAabb2,maxAabb2);
+ btVector3 minAabb2, maxAabb2;
+ colObj->getCollisionShape()->getAabb(colObj->getInterpolationWorldTransform(), minAabb2, maxAabb2);
minAabb2 -= contactThreshold;
maxAabb2 += contactThreshold;
minAabb.setMin(minAabb2);
@@ -168,10 +171,11 @@ void btCollisionWorld::updateSingleAabb(btCollisionObject* colObj)
btBroadphaseInterface* bp = (btBroadphaseInterface*)m_broadphasePairCache;
//moving objects should be moderately sized, probably something wrong if not
- if ( colObj->isStaticObject() || ((maxAabb-minAabb).length2() < btScalar(1e12)))
+ if (colObj->isStaticObject() || ((maxAabb - minAabb).length2() < btScalar(1e12)))
{
- bp->setAabb(colObj->getBroadphaseHandle(),minAabb,maxAabb, m_dispatcher1);
- } else
+ bp->setAabb(colObj->getBroadphaseHandle(), minAabb, maxAabb, m_dispatcher1);
+ }
+ else
{
//something went wrong, investigate
//this assert is unwanted in 3D modelers (danger of loosing work)
@@ -189,15 +193,15 @@ void btCollisionWorld::updateSingleAabb(btCollisionObject* colObj)
}
}
-void btCollisionWorld::updateAabbs()
+void btCollisionWorld::updateAabbs()
{
BT_PROFILE("updateAabbs");
btTransform predictedTrans;
- for ( int i=0;i<m_collisionObjects.size();i++)
+ for (int i = 0; i < m_collisionObjects.size(); i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
- btAssert(colObj->getWorldArrayIndex() == i);
+ btAssert(colObj->getWorldArrayIndex() == i);
//only update aabb of active objects
if (m_forceUpdateAllAabbs || colObj->isActive())
@@ -207,14 +211,13 @@ void btCollisionWorld::updateAabbs()
}
}
-
-void btCollisionWorld::computeOverlappingPairs()
+void btCollisionWorld::computeOverlappingPairs()
{
BT_PROFILE("calculateOverlappingPairs");
m_broadphasePairCache->calculateOverlappingPairs(m_dispatcher1);
}
-void btCollisionWorld::performDiscreteCollisionDetection()
+void btCollisionWorld::performDiscreteCollisionDetection()
{
BT_PROFILE("performDiscreteCollisionDetection");
@@ -228,69 +231,61 @@ void btCollisionWorld::performDiscreteCollisionDetection()
{
BT_PROFILE("dispatchAllCollisionPairs");
if (dispatcher)
- dispatcher->dispatchAllCollisionPairs(m_broadphasePairCache->getOverlappingPairCache(),dispatchInfo,m_dispatcher1);
+ dispatcher->dispatchAllCollisionPairs(m_broadphasePairCache->getOverlappingPairCache(), dispatchInfo, m_dispatcher1);
}
-
}
-
-
-void btCollisionWorld::removeCollisionObject(btCollisionObject* collisionObject)
+void btCollisionWorld::removeCollisionObject(btCollisionObject* collisionObject)
{
-
-
//bool removeFromBroadphase = false;
{
-
btBroadphaseProxy* bp = collisionObject->getBroadphaseHandle();
if (bp)
{
//
// only clear the cached algorithms
//
- getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(bp,m_dispatcher1);
- getBroadphase()->destroyProxy(bp,m_dispatcher1);
+ getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(bp, m_dispatcher1);
+ getBroadphase()->destroyProxy(bp, m_dispatcher1);
collisionObject->setBroadphaseHandle(0);
}
}
-
- int iObj = collisionObject->getWorldArrayIndex();
-// btAssert(iObj >= 0 && iObj < m_collisionObjects.size()); // trying to remove an object that was never added or already removed previously?
- if (iObj >= 0 && iObj < m_collisionObjects.size())
- {
- btAssert(collisionObject == m_collisionObjects[iObj]);
- m_collisionObjects.swap(iObj, m_collisionObjects.size()-1);
- m_collisionObjects.pop_back();
- if (iObj < m_collisionObjects.size())
- {
- m_collisionObjects[iObj]->setWorldArrayIndex(iObj);
- }
- }
- else
- {
- // slow linear search
- //swapremove
- m_collisionObjects.remove(collisionObject);
- }
- collisionObject->setWorldArrayIndex(-1);
+ int iObj = collisionObject->getWorldArrayIndex();
+ // btAssert(iObj >= 0 && iObj < m_collisionObjects.size()); // trying to remove an object that was never added or already removed previously?
+ if (iObj >= 0 && iObj < m_collisionObjects.size())
+ {
+ btAssert(collisionObject == m_collisionObjects[iObj]);
+ m_collisionObjects.swap(iObj, m_collisionObjects.size() - 1);
+ m_collisionObjects.pop_back();
+ if (iObj < m_collisionObjects.size())
+ {
+ m_collisionObjects[iObj]->setWorldArrayIndex(iObj);
+ }
+ }
+ else
+ {
+ // slow linear search
+ //swapremove
+ m_collisionObjects.remove(collisionObject);
+ }
+ collisionObject->setWorldArrayIndex(-1);
}
-
-void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTransform& rayToTrans,
- btCollisionObject* collisionObject,
- const btCollisionShape* collisionShape,
- const btTransform& colObjWorldTransform,
- RayResultCallback& resultCallback)
+void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans, const btTransform& rayToTrans,
+ btCollisionObject* collisionObject,
+ const btCollisionShape* collisionShape,
+ const btTransform& colObjWorldTransform,
+ RayResultCallback& resultCallback)
{
- btCollisionObjectWrapper colObWrap(0,collisionShape,collisionObject,colObjWorldTransform,-1,-1);
- btCollisionWorld::rayTestSingleInternal(rayFromTrans,rayToTrans,&colObWrap,resultCallback);
+ btCollisionObjectWrapper colObWrap(0, collisionShape, collisionObject, colObjWorldTransform, -1, -1);
+ btCollisionWorld::rayTestSingleInternal(rayFromTrans, rayToTrans, &colObWrap, resultCallback);
}
-void btCollisionWorld::rayTestSingleInternal(const btTransform& rayFromTrans,const btTransform& rayToTrans,
- const btCollisionObjectWrapper* collisionObjectWrap,
- RayResultCallback& resultCallback)
+void btCollisionWorld::rayTestSingleInternal(const btTransform& rayFromTrans, const btTransform& rayToTrans,
+ const btCollisionObjectWrapper* collisionObjectWrap,
+ RayResultCallback& resultCallback)
{
btSphereShape pointShape(btScalar(0.0));
pointShape.setMargin(0.f);
@@ -304,12 +299,12 @@ void btCollisionWorld::rayTestSingleInternal(const btTransform& rayFromTrans,con
btConvexCast::CastResult castResult;
castResult.m_fraction = resultCallback.m_closestHitFraction;
- btConvexShape* convexShape = (btConvexShape*) collisionShape;
- btVoronoiSimplexSolver simplexSolver;
- btSubsimplexConvexCast subSimplexConvexCaster(castShape,convexShape,&simplexSolver);
-
- btGjkConvexCast gjkConvexCaster(castShape,convexShape,&simplexSolver);
-
+ btConvexShape* convexShape = (btConvexShape*)collisionShape;
+ btVoronoiSimplexSolver simplexSolver;
+ btSubsimplexConvexCast subSimplexConvexCaster(castShape, convexShape, &simplexSolver);
+
+ btGjkConvexCast gjkConvexCaster(castShape, convexShape, &simplexSolver);
+
//btContinuousConvexCollision convexCaster(castShape,convexShape,&simplexSolver,0);
btConvexCast* convexCasterPtr = 0;
@@ -318,10 +313,10 @@ void btCollisionWorld::rayTestSingleInternal(const btTransform& rayFromTrans,con
convexCasterPtr = &gjkConvexCaster;
else
convexCasterPtr = &subSimplexConvexCaster;
-
+
btConvexCast& convexCaster = *convexCasterPtr;
- if (convexCaster.calcTimeOfImpact(rayFromTrans,rayToTrans,colObjWorldTransform,colObjWorldTransform,castResult))
+ if (convexCaster.calcTimeOfImpact(rayFromTrans, rayToTrans, colObjWorldTransform, colObjWorldTransform, castResult))
{
//add hit
if (castResult.m_normal.length2() > btScalar(0.0001))
@@ -332,81 +327,75 @@ void btCollisionWorld::rayTestSingleInternal(const btTransform& rayFromTrans,con
#ifdef USE_SUBSIMPLEX_CONVEX_CAST
//rotate normal into worldspace
castResult.m_normal = rayFromTrans.getBasis() * castResult.m_normal;
-#endif //USE_SUBSIMPLEX_CONVEX_CAST
+#endif //USE_SUBSIMPLEX_CONVEX_CAST
castResult.m_normal.normalize();
- btCollisionWorld::LocalRayResult localRayResult
- (
+ btCollisionWorld::LocalRayResult localRayResult(
collisionObjectWrap->getCollisionObject(),
0,
castResult.m_normal,
- castResult.m_fraction
- );
+ castResult.m_fraction);
bool normalInWorldSpace = true;
resultCallback.addSingleResult(localRayResult, normalInWorldSpace);
-
}
}
}
- } else {
+ }
+ else
+ {
if (collisionShape->isConcave())
{
-
//ConvexCast::CastResult
- struct BridgeTriangleRaycastCallback : public btTriangleRaycastCallback
+ struct BridgeTriangleRaycastCallback : public btTriangleRaycastCallback
+ {
+ btCollisionWorld::RayResultCallback* m_resultCallback;
+ const btCollisionObject* m_collisionObject;
+ const btConcaveShape* m_triangleMesh;
+
+ btTransform m_colObjWorldTransform;
+
+ BridgeTriangleRaycastCallback(const btVector3& from, const btVector3& to,
+ btCollisionWorld::RayResultCallback* resultCallback, const btCollisionObject* collisionObject, const btConcaveShape* triangleMesh, const btTransform& colObjWorldTransform) : //@BP Mod
+ btTriangleRaycastCallback(from, to, resultCallback->m_flags),
+ m_resultCallback(resultCallback),
+ m_collisionObject(collisionObject),
+ m_triangleMesh(triangleMesh),
+ m_colObjWorldTransform(colObjWorldTransform)
{
- btCollisionWorld::RayResultCallback* m_resultCallback;
- const btCollisionObject* m_collisionObject;
- const btConcaveShape* m_triangleMesh;
-
- btTransform m_colObjWorldTransform;
-
- BridgeTriangleRaycastCallback( const btVector3& from,const btVector3& to,
- btCollisionWorld::RayResultCallback* resultCallback, const btCollisionObject* collisionObject,const btConcaveShape* triangleMesh,const btTransform& colObjWorldTransform):
- //@BP Mod
- btTriangleRaycastCallback(from,to, resultCallback->m_flags),
- m_resultCallback(resultCallback),
- m_collisionObject(collisionObject),
- m_triangleMesh(triangleMesh),
- m_colObjWorldTransform(colObjWorldTransform)
- {
- }
-
-
- virtual btScalar reportHit(const btVector3& hitNormalLocal, btScalar hitFraction, int partId, int triangleIndex )
- {
- btCollisionWorld::LocalShapeInfo shapeInfo;
- shapeInfo.m_shapePart = partId;
- shapeInfo.m_triangleIndex = triangleIndex;
+ }
- btVector3 hitNormalWorld = m_colObjWorldTransform.getBasis() * hitNormalLocal;
+ virtual btScalar reportHit(const btVector3& hitNormalLocal, btScalar hitFraction, int partId, int triangleIndex)
+ {
+ btCollisionWorld::LocalShapeInfo shapeInfo;
+ shapeInfo.m_shapePart = partId;
+ shapeInfo.m_triangleIndex = triangleIndex;
- btCollisionWorld::LocalRayResult rayResult
- (m_collisionObject,
- &shapeInfo,
- hitNormalWorld,
- hitFraction);
+ btVector3 hitNormalWorld = m_colObjWorldTransform.getBasis() * hitNormalLocal;
- bool normalInWorldSpace = true;
- return m_resultCallback->addSingleResult(rayResult,normalInWorldSpace);
- }
+ btCollisionWorld::LocalRayResult rayResult(m_collisionObject,
+ &shapeInfo,
+ hitNormalWorld,
+ hitFraction);
- };
+ bool normalInWorldSpace = true;
+ return m_resultCallback->addSingleResult(rayResult, normalInWorldSpace);
+ }
+ };
btTransform worldTocollisionObject = colObjWorldTransform.inverse();
btVector3 rayFromLocal = worldTocollisionObject * rayFromTrans.getOrigin();
btVector3 rayToLocal = worldTocollisionObject * rayToTrans.getOrigin();
// BT_PROFILE("rayTestConcave");
- if (collisionShape->getShapeType()==TRIANGLE_MESH_SHAPE_PROXYTYPE)
+ if (collisionShape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE)
{
///optimized version for btBvhTriangleMeshShape
btBvhTriangleMeshShape* triangleMesh = (btBvhTriangleMeshShape*)collisionShape;
-
- BridgeTriangleRaycastCallback rcb(rayFromLocal,rayToLocal,&resultCallback,collisionObjectWrap->getCollisionObject(),triangleMesh,colObjWorldTransform);
+
+ BridgeTriangleRaycastCallback rcb(rayFromLocal, rayToLocal, &resultCallback, collisionObjectWrap->getCollisionObject(), triangleMesh, colObjWorldTransform);
rcb.m_hitFraction = resultCallback.m_closestHitFraction;
- triangleMesh->performRaycast(&rcb,rayFromLocal,rayToLocal);
+ triangleMesh->performRaycast(&rcb, rayFromLocal, rayToLocal);
}
else if (collisionShape->getShapeType() == SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE)
{
@@ -418,7 +407,7 @@ void btCollisionWorld::rayTestSingleInternal(const btTransform& rayFromTrans,con
btVector3 scale = scaledTriangleMesh->getLocalScaling();
btVector3 rayFromLocalScaled = rayFromLocal / scale;
btVector3 rayToLocalScaled = rayToLocal / scale;
-
+
//perform raycast in the underlying btBvhTriangleMeshShape
BridgeTriangleRaycastCallback rcb(rayFromLocalScaled, rayToLocalScaled, &resultCallback, collisionObjectWrap->getCollisionObject(), triangleMesh, colObjWorldTransform);
rcb.m_hitFraction = resultCallback.m_closestHitFraction;
@@ -439,45 +428,40 @@ void btCollisionWorld::rayTestSingleInternal(const btTransform& rayFromTrans,con
struct BridgeTriangleRaycastCallback : public btTriangleRaycastCallback
{
btCollisionWorld::RayResultCallback* m_resultCallback;
- const btCollisionObject* m_collisionObject;
- btConcaveShape* m_triangleMesh;
+ const btCollisionObject* m_collisionObject;
+ btConcaveShape* m_triangleMesh;
btTransform m_colObjWorldTransform;
- BridgeTriangleRaycastCallback( const btVector3& from,const btVector3& to,
- btCollisionWorld::RayResultCallback* resultCallback, const btCollisionObject* collisionObject,btConcaveShape* triangleMesh, const btTransform& colObjWorldTransform):
- //@BP Mod
- btTriangleRaycastCallback(from,to, resultCallback->m_flags),
- m_resultCallback(resultCallback),
- m_collisionObject(collisionObject),
- m_triangleMesh(triangleMesh),
- m_colObjWorldTransform(colObjWorldTransform)
+ BridgeTriangleRaycastCallback(const btVector3& from, const btVector3& to,
+ btCollisionWorld::RayResultCallback* resultCallback, const btCollisionObject* collisionObject, btConcaveShape* triangleMesh, const btTransform& colObjWorldTransform) : //@BP Mod
+ btTriangleRaycastCallback(from, to, resultCallback->m_flags),
+ m_resultCallback(resultCallback),
+ m_collisionObject(collisionObject),
+ m_triangleMesh(triangleMesh),
+ m_colObjWorldTransform(colObjWorldTransform)
{
}
-
- virtual btScalar reportHit(const btVector3& hitNormalLocal, btScalar hitFraction, int partId, int triangleIndex )
+ virtual btScalar reportHit(const btVector3& hitNormalLocal, btScalar hitFraction, int partId, int triangleIndex)
{
- btCollisionWorld::LocalShapeInfo shapeInfo;
+ btCollisionWorld::LocalShapeInfo shapeInfo;
shapeInfo.m_shapePart = partId;
shapeInfo.m_triangleIndex = triangleIndex;
btVector3 hitNormalWorld = m_colObjWorldTransform.getBasis() * hitNormalLocal;
- btCollisionWorld::LocalRayResult rayResult
- (m_collisionObject,
- &shapeInfo,
- hitNormalWorld,
- hitFraction);
+ btCollisionWorld::LocalRayResult rayResult(m_collisionObject,
+ &shapeInfo,
+ hitNormalWorld,
+ hitFraction);
- bool normalInWorldSpace = true;
- return m_resultCallback->addSingleResult(rayResult,normalInWorldSpace);
+ bool normalInWorldSpace = true;
+ return m_resultCallback->addSingleResult(rayResult, normalInWorldSpace);
}
-
};
-
- BridgeTriangleRaycastCallback rcb(rayFromLocal,rayToLocal,&resultCallback,collisionObjectWrap->getCollisionObject(),concaveShape, colObjWorldTransform);
+ BridgeTriangleRaycastCallback rcb(rayFromLocal, rayToLocal, &resultCallback, collisionObjectWrap->getCollisionObject(), concaveShape, colObjWorldTransform);
rcb.m_hitFraction = resultCallback.m_closestHitFraction;
btVector3 rayAabbMinLocal = rayFromLocal;
@@ -485,9 +469,11 @@ void btCollisionWorld::rayTestSingleInternal(const btTransform& rayFromTrans,con
btVector3 rayAabbMaxLocal = rayFromLocal;
rayAabbMaxLocal.setMax(rayToLocal);
- concaveShape->processAllTriangles(&rcb,rayAabbMinLocal,rayAabbMaxLocal);
+ concaveShape->processAllTriangles(&rcb, rayAabbMinLocal, rayAabbMaxLocal);
}
- } else {
+ }
+ else
+ {
// BT_PROFILE("rayTestCompound");
if (collisionShape->isCompound())
{
@@ -495,10 +481,10 @@ void btCollisionWorld::rayTestSingleInternal(const btTransform& rayFromTrans,con
{
RayResultCallback* m_userCallback;
int m_i;
-
- LocalInfoAdder2 (int i, RayResultCallback *user)
+
+ LocalInfoAdder2(int i, RayResultCallback* user)
: m_userCallback(user), m_i(i)
- {
+ {
m_closestHitFraction = m_userCallback->m_closestHitFraction;
m_flags = m_userCallback->m_flags;
}
@@ -507,7 +493,7 @@ void btCollisionWorld::rayTestSingleInternal(const btTransform& rayFromTrans,con
return m_userCallback->needsCollision(p);
}
- virtual btScalar addSingleResult (btCollisionWorld::LocalRayResult &r, bool b)
+ virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult& r, bool b)
{
btCollisionWorld::LocalShapeInfo shapeInfo;
shapeInfo.m_shapePart = -1;
@@ -520,7 +506,7 @@ void btCollisionWorld::rayTestSingleInternal(const btTransform& rayFromTrans,con
return result;
}
};
-
+
struct RayTester : btDbvt::ICollide
{
const btCollisionObject* m_collisionObject;
@@ -529,33 +515,29 @@ void btCollisionWorld::rayTestSingleInternal(const btTransform& rayFromTrans,con
const btTransform& m_rayFromTrans;
const btTransform& m_rayToTrans;
RayResultCallback& m_resultCallback;
-
+
RayTester(const btCollisionObject* collisionObject,
- const btCompoundShape* compoundShape,
- const btTransform& colObjWorldTransform,
- const btTransform& rayFromTrans,
- const btTransform& rayToTrans,
- RayResultCallback& resultCallback):
- m_collisionObject(collisionObject),
- m_compoundShape(compoundShape),
- m_colObjWorldTransform(colObjWorldTransform),
- m_rayFromTrans(rayFromTrans),
- m_rayToTrans(rayToTrans),
- m_resultCallback(resultCallback)
+ const btCompoundShape* compoundShape,
+ const btTransform& colObjWorldTransform,
+ const btTransform& rayFromTrans,
+ const btTransform& rayToTrans,
+ RayResultCallback& resultCallback) : m_collisionObject(collisionObject),
+ m_compoundShape(compoundShape),
+ m_colObjWorldTransform(colObjWorldTransform),
+ m_rayFromTrans(rayFromTrans),
+ m_rayToTrans(rayToTrans),
+ m_resultCallback(resultCallback)
{
-
}
-
+
void ProcessLeaf(int i)
{
const btCollisionShape* childCollisionShape = m_compoundShape->getChildShape(i);
const btTransform& childTrans = m_compoundShape->getChildTransform(i);
btTransform childWorldTrans = m_colObjWorldTransform * childTrans;
-
- btCollisionObjectWrapper tmpOb(0,childCollisionShape,m_collisionObject,childWorldTrans,-1,i);
- // replace collision shape so that callback can determine the triangle
-
+ btCollisionObjectWrapper tmpOb(0, childCollisionShape, m_collisionObject, childWorldTrans, -1, i);
+ // replace collision shape so that callback can determine the triangle
LocalInfoAdder2 my_cb(i, &m_resultCallback);
@@ -564,19 +546,17 @@ void btCollisionWorld::rayTestSingleInternal(const btTransform& rayFromTrans,con
m_rayToTrans,
&tmpOb,
my_cb);
-
}
-
+
void Process(const btDbvtNode* leaf)
{
ProcessLeaf(leaf->dataAsInt);
}
};
-
+
const btCompoundShape* compoundShape = static_cast<const btCompoundShape*>(collisionShape);
const btDbvt* dbvt = compoundShape->getDynamicAabbTree();
-
RayTester rayCB(
collisionObjectWrap->getCollisionObject(),
compoundShape,
@@ -584,39 +564,39 @@ void btCollisionWorld::rayTestSingleInternal(const btTransform& rayFromTrans,con
rayFromTrans,
rayToTrans,
resultCallback);
-#ifndef DISABLE_DBVT_COMPOUNDSHAPE_RAYCAST_ACCELERATION
+#ifndef DISABLE_DBVT_COMPOUNDSHAPE_RAYCAST_ACCELERATION
if (dbvt)
{
btVector3 localRayFrom = colObjWorldTransform.inverseTimes(rayFromTrans).getOrigin();
btVector3 localRayTo = colObjWorldTransform.inverseTimes(rayToTrans).getOrigin();
- btDbvt::rayTest(dbvt->m_root, localRayFrom , localRayTo, rayCB);
+ btDbvt::rayTest(dbvt->m_root, localRayFrom, localRayTo, rayCB);
}
else
-#endif //DISABLE_DBVT_COMPOUNDSHAPE_RAYCAST_ACCELERATION
+#endif //DISABLE_DBVT_COMPOUNDSHAPE_RAYCAST_ACCELERATION
{
for (int i = 0, n = compoundShape->getNumChildShapes(); i < n; ++i)
{
rayCB.ProcessLeaf(i);
- }
+ }
}
}
}
}
}
-void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const btTransform& convexFromTrans,const btTransform& convexToTrans,
- btCollisionObject* collisionObject,
- const btCollisionShape* collisionShape,
- const btTransform& colObjWorldTransform,
- ConvexResultCallback& resultCallback, btScalar allowedPenetration)
+void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape, const btTransform& convexFromTrans, const btTransform& convexToTrans,
+ btCollisionObject* collisionObject,
+ const btCollisionShape* collisionShape,
+ const btTransform& colObjWorldTransform,
+ ConvexResultCallback& resultCallback, btScalar allowedPenetration)
{
- btCollisionObjectWrapper tmpOb(0,collisionShape,collisionObject,colObjWorldTransform,-1,-1);
- btCollisionWorld::objectQuerySingleInternal(castShape,convexFromTrans,convexToTrans,&tmpOb,resultCallback,allowedPenetration);
+ btCollisionObjectWrapper tmpOb(0, collisionShape, collisionObject, colObjWorldTransform, -1, -1);
+ btCollisionWorld::objectQuerySingleInternal(castShape, convexFromTrans, convexToTrans, &tmpOb, resultCallback, allowedPenetration);
}
-void btCollisionWorld::objectQuerySingleInternal(const btConvexShape* castShape,const btTransform& convexFromTrans,const btTransform& convexToTrans,
- const btCollisionObjectWrapper* colObjWrap,
- ConvexResultCallback& resultCallback, btScalar allowedPenetration)
+void btCollisionWorld::objectQuerySingleInternal(const btConvexShape* castShape, const btTransform& convexFromTrans, const btTransform& convexToTrans,
+ const btCollisionObjectWrapper* colObjWrap,
+ ConvexResultCallback& resultCallback, btScalar allowedPenetration)
{
const btCollisionShape* collisionShape = colObjWrap->getCollisionShape();
const btTransform& colObjWorldTransform = colObjWrap->getWorldTransform();
@@ -626,21 +606,19 @@ void btCollisionWorld::objectQuerySingleInternal(const btConvexShape* castShape,
//BT_PROFILE("convexSweepConvex");
btConvexCast::CastResult castResult;
castResult.m_allowedPenetration = allowedPenetration;
- castResult.m_fraction = resultCallback.m_closestHitFraction;//btScalar(1.);//??
+ castResult.m_fraction = resultCallback.m_closestHitFraction; //btScalar(1.);//??
- btConvexShape* convexShape = (btConvexShape*) collisionShape;
- btVoronoiSimplexSolver simplexSolver;
- btGjkEpaPenetrationDepthSolver gjkEpaPenetrationSolver;
+ btConvexShape* convexShape = (btConvexShape*)collisionShape;
+ btVoronoiSimplexSolver simplexSolver;
+ btGjkEpaPenetrationDepthSolver gjkEpaPenetrationSolver;
- btContinuousConvexCollision convexCaster1(castShape,convexShape,&simplexSolver,&gjkEpaPenetrationSolver);
+ btContinuousConvexCollision convexCaster1(castShape, convexShape, &simplexSolver, &gjkEpaPenetrationSolver);
//btGjkConvexCast convexCaster2(castShape,convexShape,&simplexSolver);
//btSubsimplexConvexCast convexCaster3(castShape,convexShape,&simplexSolver);
btConvexCast* castPtr = &convexCaster1;
-
-
- if (castPtr->calcTimeOfImpact(convexFromTrans,convexToTrans,colObjWorldTransform,colObjWorldTransform,castResult))
+ if (castPtr->calcTimeOfImpact(convexFromTrans, convexToTrans, colObjWorldTransform, colObjWorldTransform, castResult))
{
//add hit
if (castResult.m_normal.length2() > btScalar(0.0001))
@@ -648,25 +626,24 @@ void btCollisionWorld::objectQuerySingleInternal(const btConvexShape* castShape,
if (castResult.m_fraction < resultCallback.m_closestHitFraction)
{
castResult.m_normal.normalize();
- btCollisionWorld::LocalConvexResult localConvexResult
- (
+ btCollisionWorld::LocalConvexResult localConvexResult(
colObjWrap->getCollisionObject(),
0,
castResult.m_normal,
castResult.m_hitPoint,
- castResult.m_fraction
- );
+ castResult.m_fraction);
bool normalInWorldSpace = true;
resultCallback.addSingleResult(localConvexResult, normalInWorldSpace);
-
}
}
}
- } else {
+ }
+ else
+ {
if (collisionShape->isConcave())
{
- if (collisionShape->getShapeType()==TRIANGLE_MESH_SHAPE_PROXYTYPE)
+ if (collisionShape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE)
{
//BT_PROFILE("convexSweepbtBvhTriangleMesh");
btBvhTriangleMeshShape* triangleMesh = (btBvhTriangleMeshShape*)collisionShape;
@@ -680,62 +657,57 @@ void btCollisionWorld::objectQuerySingleInternal(const btConvexShape* castShape,
struct BridgeTriangleConvexcastCallback : public btTriangleConvexcastCallback
{
btCollisionWorld::ConvexResultCallback* m_resultCallback;
- const btCollisionObject* m_collisionObject;
- btTriangleMeshShape* m_triangleMesh;
-
- BridgeTriangleConvexcastCallback(const btConvexShape* castShape, const btTransform& from,const btTransform& to,
- btCollisionWorld::ConvexResultCallback* resultCallback, const btCollisionObject* collisionObject,btTriangleMeshShape* triangleMesh, const btTransform& triangleToWorld):
- btTriangleConvexcastCallback(castShape, from,to, triangleToWorld, triangleMesh->getMargin()),
- m_resultCallback(resultCallback),
- m_collisionObject(collisionObject),
- m_triangleMesh(triangleMesh)
+ const btCollisionObject* m_collisionObject;
+ btTriangleMeshShape* m_triangleMesh;
+
+ BridgeTriangleConvexcastCallback(const btConvexShape* castShape, const btTransform& from, const btTransform& to,
+ btCollisionWorld::ConvexResultCallback* resultCallback, const btCollisionObject* collisionObject, btTriangleMeshShape* triangleMesh, const btTransform& triangleToWorld) : btTriangleConvexcastCallback(castShape, from, to, triangleToWorld, triangleMesh->getMargin()),
+ m_resultCallback(resultCallback),
+ m_collisionObject(collisionObject),
+ m_triangleMesh(triangleMesh)
{
}
-
- virtual btScalar reportHit(const btVector3& hitNormalLocal, const btVector3& hitPointLocal, btScalar hitFraction, int partId, int triangleIndex )
+ virtual btScalar reportHit(const btVector3& hitNormalLocal, const btVector3& hitPointLocal, btScalar hitFraction, int partId, int triangleIndex)
{
- btCollisionWorld::LocalShapeInfo shapeInfo;
+ btCollisionWorld::LocalShapeInfo shapeInfo;
shapeInfo.m_shapePart = partId;
shapeInfo.m_triangleIndex = triangleIndex;
if (hitFraction <= m_resultCallback->m_closestHitFraction)
{
+ btCollisionWorld::LocalConvexResult convexResult(m_collisionObject,
+ &shapeInfo,
+ hitNormalLocal,
+ hitPointLocal,
+ hitFraction);
- btCollisionWorld::LocalConvexResult convexResult
- (m_collisionObject,
- &shapeInfo,
- hitNormalLocal,
- hitPointLocal,
- hitFraction);
+ bool normalInWorldSpace = true;
- bool normalInWorldSpace = true;
-
-
- return m_resultCallback->addSingleResult(convexResult,normalInWorldSpace);
+ return m_resultCallback->addSingleResult(convexResult, normalInWorldSpace);
}
return hitFraction;
}
-
};
- BridgeTriangleConvexcastCallback tccb(castShape, convexFromTrans,convexToTrans,&resultCallback,colObjWrap->getCollisionObject(),triangleMesh, colObjWorldTransform);
+ BridgeTriangleConvexcastCallback tccb(castShape, convexFromTrans, convexToTrans, &resultCallback, colObjWrap->getCollisionObject(), triangleMesh, colObjWorldTransform);
tccb.m_hitFraction = resultCallback.m_closestHitFraction;
tccb.m_allowedPenetration = allowedPenetration;
btVector3 boxMinLocal, boxMaxLocal;
castShape->getAabb(rotationXform, boxMinLocal, boxMaxLocal);
- triangleMesh->performConvexcast(&tccb,convexFromLocal,convexToLocal,boxMinLocal, boxMaxLocal);
- } else
+ triangleMesh->performConvexcast(&tccb, convexFromLocal, convexToLocal, boxMinLocal, boxMaxLocal);
+ }
+ else
{
- if (collisionShape->getShapeType()==STATIC_PLANE_PROXYTYPE)
+ if (collisionShape->getShapeType() == STATIC_PLANE_PROXYTYPE)
{
btConvexCast::CastResult castResult;
castResult.m_allowedPenetration = allowedPenetration;
castResult.m_fraction = resultCallback.m_closestHitFraction;
- btStaticPlaneShape* planeShape = (btStaticPlaneShape*) collisionShape;
- btContinuousConvexCollision convexCaster1(castShape,planeShape);
+ btStaticPlaneShape* planeShape = (btStaticPlaneShape*)collisionShape;
+ btContinuousConvexCollision convexCaster1(castShape, planeShape);
btConvexCast* castPtr = &convexCaster1;
- if (castPtr->calcTimeOfImpact(convexFromTrans,convexToTrans,colObjWorldTransform,colObjWorldTransform,castResult))
+ if (castPtr->calcTimeOfImpact(convexFromTrans, convexToTrans, colObjWorldTransform, colObjWorldTransform, castResult))
{
//add hit
if (castResult.m_normal.length2() > btScalar(0.0001))
@@ -743,22 +715,20 @@ void btCollisionWorld::objectQuerySingleInternal(const btConvexShape* castShape,
if (castResult.m_fraction < resultCallback.m_closestHitFraction)
{
castResult.m_normal.normalize();
- btCollisionWorld::LocalConvexResult localConvexResult
- (
+ btCollisionWorld::LocalConvexResult localConvexResult(
colObjWrap->getCollisionObject(),
0,
castResult.m_normal,
castResult.m_hitPoint,
- castResult.m_fraction
- );
+ castResult.m_fraction);
bool normalInWorldSpace = true;
resultCallback.addSingleResult(localConvexResult, normalInWorldSpace);
}
}
}
-
- } else
+ }
+ else
{
//BT_PROFILE("convexSweepConcave");
btConcaveShape* concaveShape = (btConcaveShape*)collisionShape;
@@ -772,44 +742,39 @@ void btCollisionWorld::objectQuerySingleInternal(const btConvexShape* castShape,
struct BridgeTriangleConvexcastCallback : public btTriangleConvexcastCallback
{
btCollisionWorld::ConvexResultCallback* m_resultCallback;
- const btCollisionObject* m_collisionObject;
- btConcaveShape* m_triangleMesh;
-
- BridgeTriangleConvexcastCallback(const btConvexShape* castShape, const btTransform& from,const btTransform& to,
- btCollisionWorld::ConvexResultCallback* resultCallback, const btCollisionObject* collisionObject,btConcaveShape* triangleMesh, const btTransform& triangleToWorld):
- btTriangleConvexcastCallback(castShape, from,to, triangleToWorld, triangleMesh->getMargin()),
- m_resultCallback(resultCallback),
- m_collisionObject(collisionObject),
- m_triangleMesh(triangleMesh)
+ const btCollisionObject* m_collisionObject;
+ btConcaveShape* m_triangleMesh;
+
+ BridgeTriangleConvexcastCallback(const btConvexShape* castShape, const btTransform& from, const btTransform& to,
+ btCollisionWorld::ConvexResultCallback* resultCallback, const btCollisionObject* collisionObject, btConcaveShape* triangleMesh, const btTransform& triangleToWorld) : btTriangleConvexcastCallback(castShape, from, to, triangleToWorld, triangleMesh->getMargin()),
+ m_resultCallback(resultCallback),
+ m_collisionObject(collisionObject),
+ m_triangleMesh(triangleMesh)
{
}
-
- virtual btScalar reportHit(const btVector3& hitNormalLocal, const btVector3& hitPointLocal, btScalar hitFraction, int partId, int triangleIndex )
+ virtual btScalar reportHit(const btVector3& hitNormalLocal, const btVector3& hitPointLocal, btScalar hitFraction, int partId, int triangleIndex)
{
- btCollisionWorld::LocalShapeInfo shapeInfo;
+ btCollisionWorld::LocalShapeInfo shapeInfo;
shapeInfo.m_shapePart = partId;
shapeInfo.m_triangleIndex = triangleIndex;
if (hitFraction <= m_resultCallback->m_closestHitFraction)
{
+ btCollisionWorld::LocalConvexResult convexResult(m_collisionObject,
+ &shapeInfo,
+ hitNormalLocal,
+ hitPointLocal,
+ hitFraction);
- btCollisionWorld::LocalConvexResult convexResult
- (m_collisionObject,
- &shapeInfo,
- hitNormalLocal,
- hitPointLocal,
- hitFraction);
-
- bool normalInWorldSpace = true;
+ bool normalInWorldSpace = true;
- return m_resultCallback->addSingleResult(convexResult,normalInWorldSpace);
+ return m_resultCallback->addSingleResult(convexResult, normalInWorldSpace);
}
return hitFraction;
}
-
};
- BridgeTriangleConvexcastCallback tccb(castShape, convexFromTrans,convexToTrans,&resultCallback,colObjWrap->getCollisionObject(),concaveShape, colObjWorldTransform);
+ BridgeTriangleConvexcastCallback tccb(castShape, convexFromTrans, convexToTrans, &resultCallback, colObjWrap->getCollisionObject(), concaveShape, colObjWorldTransform);
tccb.m_hitFraction = resultCallback.m_closestHitFraction;
tccb.m_allowedPenetration = allowedPenetration;
btVector3 boxMinLocal, boxMaxLocal;
@@ -821,35 +786,37 @@ void btCollisionWorld::objectQuerySingleInternal(const btConvexShape* castShape,
rayAabbMaxLocal.setMax(convexToLocal);
rayAabbMinLocal += boxMinLocal;
rayAabbMaxLocal += boxMaxLocal;
- concaveShape->processAllTriangles(&tccb,rayAabbMinLocal,rayAabbMaxLocal);
+ concaveShape->processAllTriangles(&tccb, rayAabbMinLocal, rayAabbMaxLocal);
}
}
- } else {
+ }
+ else
+ {
if (collisionShape->isCompound())
{
- struct btCompoundLeafCallback : btDbvt::ICollide
+ struct btCompoundLeafCallback : btDbvt::ICollide
{
btCompoundLeafCallback(
- const btCollisionObjectWrapper* colObjWrap,
- const btConvexShape* castShape,
- const btTransform& convexFromTrans,
- const btTransform& convexToTrans,
- btScalar allowedPenetration,
- const btCompoundShape* compoundShape,
- const btTransform& colObjWorldTransform,
- ConvexResultCallback& resultCallback)
- :
- m_colObjWrap(colObjWrap),
- m_castShape(castShape),
- m_convexFromTrans(convexFromTrans),
- m_convexToTrans(convexToTrans),
- m_allowedPenetration(allowedPenetration),
- m_compoundShape(compoundShape),
- m_colObjWorldTransform(colObjWorldTransform),
- m_resultCallback(resultCallback) {
+ const btCollisionObjectWrapper* colObjWrap,
+ const btConvexShape* castShape,
+ const btTransform& convexFromTrans,
+ const btTransform& convexToTrans,
+ btScalar allowedPenetration,
+ const btCompoundShape* compoundShape,
+ const btTransform& colObjWorldTransform,
+ ConvexResultCallback& resultCallback)
+ : m_colObjWrap(colObjWrap),
+ m_castShape(castShape),
+ m_convexFromTrans(convexFromTrans),
+ m_convexToTrans(convexToTrans),
+ m_allowedPenetration(allowedPenetration),
+ m_compoundShape(compoundShape),
+ m_colObjWorldTransform(colObjWorldTransform),
+ m_resultCallback(resultCallback)
+ {
}
- const btCollisionObjectWrapper* m_colObjWrap;
+ const btCollisionObjectWrapper* m_colObjWrap;
const btConvexShape* m_castShape;
const btTransform& m_convexFromTrans;
const btTransform& m_convexToTrans;
@@ -859,16 +826,16 @@ void btCollisionWorld::objectQuerySingleInternal(const btConvexShape* castShape,
ConvexResultCallback& m_resultCallback;
public:
-
- void ProcessChild(int index, const btTransform& childTrans, const btCollisionShape* childCollisionShape)
+ void ProcessChild(int index, const btTransform& childTrans, const btCollisionShape* childCollisionShape)
{
btTransform childWorldTrans = m_colObjWorldTransform * childTrans;
- struct LocalInfoAdder : public ConvexResultCallback {
+ struct LocalInfoAdder : public ConvexResultCallback
+ {
ConvexResultCallback* m_userCallback;
int m_i;
- LocalInfoAdder(int i, ConvexResultCallback *user)
+ LocalInfoAdder(int i, ConvexResultCallback* user)
: m_userCallback(user), m_i(i)
{
m_closestHitFraction = m_userCallback->m_closestHitFraction;
@@ -877,9 +844,9 @@ void btCollisionWorld::objectQuerySingleInternal(const btConvexShape* castShape,
{
return m_userCallback->needsCollision(p);
}
- virtual btScalar addSingleResult(btCollisionWorld::LocalConvexResult& r, bool b)
+ virtual btScalar addSingleResult(btCollisionWorld::LocalConvexResult& r, bool b)
{
- btCollisionWorld::LocalShapeInfo shapeInfo;
+ btCollisionWorld::LocalShapeInfo shapeInfo;
shapeInfo.m_shapePart = -1;
shapeInfo.m_triangleIndex = m_i;
if (r.m_localShapeInfo == NULL)
@@ -887,7 +854,6 @@ void btCollisionWorld::objectQuerySingleInternal(const btConvexShape* castShape,
const btScalar result = m_userCallback->addSingleResult(r, b);
m_closestHitFraction = m_userCallback->m_closestHitFraction;
return result;
-
}
};
@@ -898,7 +864,7 @@ void btCollisionWorld::objectQuerySingleInternal(const btConvexShape* castShape,
objectQuerySingleInternal(m_castShape, m_convexFromTrans, m_convexToTrans, &tmpObj, my_cb, m_allowedPenetration);
}
- void Process(const btDbvtNode* leaf)
+ void Process(const btDbvtNode* leaf)
{
// Processing leaf node
int index = leaf->dataAsInt;
@@ -923,15 +889,18 @@ void btCollisionWorld::objectQuerySingleInternal(const btConvexShape* castShape,
fromLocalAabbMax.setMax(toLocalAabbMax);
btCompoundLeafCallback callback(colObjWrap, castShape, convexFromTrans, convexToTrans,
- allowedPenetration, compoundShape, colObjWorldTransform, resultCallback);
+ allowedPenetration, compoundShape, colObjWorldTransform, resultCallback);
const btDbvt* tree = compoundShape->getDynamicAabbTree();
- if (tree) {
- const ATTRIBUTE_ALIGNED16(btDbvtVolume) bounds = btDbvtVolume::FromMM(fromLocalAabbMin, fromLocalAabbMax);
+ if (tree)
+ {
+ const ATTRIBUTE_ALIGNED16(btDbvtVolume) bounds = btDbvtVolume::FromMM(fromLocalAabbMin, fromLocalAabbMax);
tree->collideTV(tree->m_root, bounds, callback);
- } else {
+ }
+ else
+ {
int i;
- for (i=0;i<compoundShape->getNumChildShapes();i++)
+ for (i = 0; i < compoundShape->getNumChildShapes(); i++)
{
const btCollisionShape* childCollisionShape = compoundShape->getChildShape(i);
btTransform childTrans = compoundShape->getChildTransform(i);
@@ -943,33 +912,31 @@ void btCollisionWorld::objectQuerySingleInternal(const btConvexShape* castShape,
}
}
-
struct btSingleRayCallback : public btBroadphaseRayCallback
{
-
- btVector3 m_rayFromWorld;
- btVector3 m_rayToWorld;
- btTransform m_rayFromTrans;
- btTransform m_rayToTrans;
- btVector3 m_hitNormal;
-
- const btCollisionWorld* m_world;
- btCollisionWorld::RayResultCallback& m_resultCallback;
-
- btSingleRayCallback(const btVector3& rayFromWorld,const btVector3& rayToWorld,const btCollisionWorld* world,btCollisionWorld::RayResultCallback& resultCallback)
- :m_rayFromWorld(rayFromWorld),
- m_rayToWorld(rayToWorld),
- m_world(world),
- m_resultCallback(resultCallback)
+ btVector3 m_rayFromWorld;
+ btVector3 m_rayToWorld;
+ btTransform m_rayFromTrans;
+ btTransform m_rayToTrans;
+ btVector3 m_hitNormal;
+
+ const btCollisionWorld* m_world;
+ btCollisionWorld::RayResultCallback& m_resultCallback;
+
+ btSingleRayCallback(const btVector3& rayFromWorld, const btVector3& rayToWorld, const btCollisionWorld* 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);
+ btVector3 rayDir = (rayToWorld - rayFromWorld);
- rayDir.normalize ();
+ rayDir.normalize();
///what about division by zero? --> just set rayDirection[i] to INF/BT_LARGE_FLOAT
m_rayDirectionInverse[0] = rayDir[0] == btScalar(0.0) ? btScalar(BT_LARGE_FLOAT) : btScalar(1.0) / rayDir[0];
m_rayDirectionInverse[1] = rayDir[1] == btScalar(0.0) ? btScalar(BT_LARGE_FLOAT) : btScalar(1.0) / rayDir[1];
@@ -978,22 +945,19 @@ struct btSingleRayCallback : public btBroadphaseRayCallback
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);
-
+ m_lambda_max = rayDir.dot(m_rayToWorld - m_rayFromWorld);
}
-
-
- virtual bool process(const btBroadphaseProxy* proxy)
+ 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;
+ btCollisionObject* collisionObject = (btCollisionObject*)proxy->m_clientObject;
//only perform raycast if filterMask matches
- if(m_resultCallback.needsCollision(collisionObject->getBroadphaseHandle()))
+ if (m_resultCallback.needsCollision(collisionObject->getBroadphaseHandle()))
{
//RigidcollisionObject* collisionObject = ctrl->GetRigidcollisionObject();
//btVector3 collisionObjectAabbMin,collisionObjectAabbMax;
@@ -1011,57 +975,53 @@ struct btSingleRayCallback : public btBroadphaseRayCallback
//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);
+ m_world->rayTestSingle(m_rayFromTrans, m_rayToTrans,
+ collisionObject,
+ collisionObject->getCollisionShape(),
+ collisionObject->getWorldTransform(),
+ m_resultCallback);
}
}
return true;
}
};
-void btCollisionWorld::rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback) const
+void btCollisionWorld::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
- btSingleRayCallback rayCB(rayFromWorld,rayToWorld,this,resultCallback);
+ btSingleRayCallback rayCB(rayFromWorld, rayToWorld, this, resultCallback);
#ifndef USE_BRUTEFORCE_RAYBROADPHASE
- m_broadphasePairCache->rayTest(rayFromWorld,rayToWorld,rayCB);
+ m_broadphasePairCache->rayTest(rayFromWorld, rayToWorld, rayCB);
#else
- for (int i=0;i<this->getNumCollisionObjects();i++)
+ for (int i = 0; i < this->getNumCollisionObjects(); i++)
{
rayCB.process(m_collisionObjects[i]->getBroadphaseHandle());
- }
-#endif //USE_BRUTEFORCE_RAYBROADPHASE
-
+ }
+#endif //USE_BRUTEFORCE_RAYBROADPHASE
}
-
struct btSingleSweepCallback : public btBroadphaseRayCallback
{
-
- btTransform m_convexFromTrans;
- btTransform m_convexToTrans;
- btVector3 m_hitNormal;
- const btCollisionWorld* m_world;
- btCollisionWorld::ConvexResultCallback& m_resultCallback;
- btScalar m_allowedCcdPenetration;
+ btTransform m_convexFromTrans;
+ btTransform m_convexToTrans;
+ btVector3 m_hitNormal;
+ const btCollisionWorld* m_world;
+ btCollisionWorld::ConvexResultCallback& m_resultCallback;
+ btScalar m_allowedCcdPenetration;
const btConvexShape* m_castShape;
-
- btSingleSweepCallback(const btConvexShape* castShape, const btTransform& convexFromTrans,const btTransform& convexToTrans,const btCollisionWorld* world,btCollisionWorld::ConvexResultCallback& resultCallback,btScalar allowedPenetration)
- :m_convexFromTrans(convexFromTrans),
- m_convexToTrans(convexToTrans),
- m_world(world),
- m_resultCallback(resultCallback),
- m_allowedCcdPenetration(allowedPenetration),
- m_castShape(castShape)
+ btSingleSweepCallback(const btConvexShape* castShape, const btTransform& convexFromTrans, const btTransform& convexToTrans, const btCollisionWorld* world, btCollisionWorld::ConvexResultCallback& resultCallback, btScalar allowedPenetration)
+ : m_convexFromTrans(convexFromTrans),
+ m_convexToTrans(convexToTrans),
+ m_world(world),
+ m_resultCallback(resultCallback),
+ m_allowedCcdPenetration(allowedPenetration),
+ m_castShape(castShape)
{
- btVector3 unnormalizedRayDir = (m_convexToTrans.getOrigin()-m_convexFromTrans.getOrigin());
+ btVector3 unnormalizedRayDir = (m_convexToTrans.getOrigin() - m_convexFromTrans.getOrigin());
btVector3 rayDir = unnormalizedRayDir.normalized();
///what about division by zero? --> just set rayDirection[i] to INF/BT_LARGE_FLOAT
m_rayDirectionInverse[0] = rayDir[0] == btScalar(0.0) ? btScalar(BT_LARGE_FLOAT) : btScalar(1.0) / rayDir[0];
@@ -1072,109 +1032,102 @@ struct btSingleSweepCallback : public btBroadphaseRayCallback
m_signs[2] = m_rayDirectionInverse[2] < 0.0;
m_lambda_max = rayDir.dot(unnormalizedRayDir);
-
}
- virtual bool process(const btBroadphaseProxy* proxy)
+ virtual bool process(const btBroadphaseProxy* proxy)
{
///terminate further convex sweep tests, once the closestHitFraction reached zero
if (m_resultCallback.m_closestHitFraction == btScalar(0.f))
return false;
- btCollisionObject* collisionObject = (btCollisionObject*)proxy->m_clientObject;
+ btCollisionObject* collisionObject = (btCollisionObject*)proxy->m_clientObject;
//only perform raycast if filterMask matches
- if(m_resultCallback.needsCollision(collisionObject->getBroadphaseHandle())) {
+ if (m_resultCallback.needsCollision(collisionObject->getBroadphaseHandle()))
+ {
//RigidcollisionObject* collisionObject = ctrl->GetRigidcollisionObject();
- m_world->objectQuerySingle(m_castShape, m_convexFromTrans,m_convexToTrans,
- collisionObject,
- collisionObject->getCollisionShape(),
- collisionObject->getWorldTransform(),
- m_resultCallback,
- m_allowedCcdPenetration);
+ m_world->objectQuerySingle(m_castShape, m_convexFromTrans, m_convexToTrans,
+ collisionObject,
+ collisionObject->getCollisionShape(),
+ collisionObject->getWorldTransform(),
+ m_resultCallback,
+ m_allowedCcdPenetration);
}
return true;
}
};
-
-
-void btCollisionWorld::convexSweepTest(const btConvexShape* castShape, const btTransform& convexFromWorld, const btTransform& convexToWorld, ConvexResultCallback& resultCallback, btScalar allowedCcdPenetration) const
+void btCollisionWorld::convexSweepTest(const btConvexShape* castShape, const btTransform& convexFromWorld, const btTransform& convexToWorld, ConvexResultCallback& resultCallback, btScalar allowedCcdPenetration) const
{
-
BT_PROFILE("convexSweepTest");
/// 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
/// unfortunately the implementation for rayTest and convexSweepTest duplicated, albeit practically identical
-
-
- btTransform convexFromTrans,convexToTrans;
+ btTransform convexFromTrans, convexToTrans;
convexFromTrans = convexFromWorld;
convexToTrans = convexToWorld;
btVector3 castShapeAabbMin, castShapeAabbMax;
/* Compute AABB that encompasses angular movement */
{
btVector3 linVel, angVel;
- btTransformUtil::calculateVelocity (convexFromTrans, convexToTrans, 1.0f, linVel, angVel);
+ btTransformUtil::calculateVelocity(convexFromTrans, convexToTrans, 1.0f, linVel, angVel);
btVector3 zeroLinVel;
- zeroLinVel.setValue(0,0,0);
+ zeroLinVel.setValue(0, 0, 0);
btTransform R;
- R.setIdentity ();
- R.setRotation (convexFromTrans.getRotation());
- castShape->calculateTemporalAabb (R, zeroLinVel, angVel, 1.0f, castShapeAabbMin, castShapeAabbMax);
+ R.setIdentity();
+ R.setRotation(convexFromTrans.getRotation());
+ castShape->calculateTemporalAabb(R, zeroLinVel, angVel, 1.0f, castShapeAabbMin, castShapeAabbMax);
}
#ifndef USE_BRUTEFORCE_RAYBROADPHASE
- btSingleSweepCallback convexCB(castShape,convexFromWorld,convexToWorld,this,resultCallback,allowedCcdPenetration);
+ btSingleSweepCallback convexCB(castShape, convexFromWorld, convexToWorld, this, resultCallback, allowedCcdPenetration);
- m_broadphasePairCache->rayTest(convexFromTrans.getOrigin(),convexToTrans.getOrigin(),convexCB,castShapeAabbMin,castShapeAabbMax);
+ m_broadphasePairCache->rayTest(convexFromTrans.getOrigin(), convexToTrans.getOrigin(), convexCB, castShapeAabbMin, castShapeAabbMax);
#else
/// go over all objects, and if the ray intersects their aabb + cast shape aabb,
// do a ray-shape query using convexCaster (CCD)
int i;
- for (i=0;i<m_collisionObjects.size();i++)
+ for (i = 0; i < m_collisionObjects.size(); i++)
{
- btCollisionObject* collisionObject= m_collisionObjects[i];
+ btCollisionObject* collisionObject = m_collisionObjects[i];
//only perform raycast if filterMask matches
- if(resultCallback.needsCollision(collisionObject->getBroadphaseHandle())) {
+ if (resultCallback.needsCollision(collisionObject->getBroadphaseHandle()))
+ {
//RigidcollisionObject* collisionObject = ctrl->GetRigidcollisionObject();
- btVector3 collisionObjectAabbMin,collisionObjectAabbMax;
- collisionObject->getCollisionShape()->getAabb(collisionObject->getWorldTransform(),collisionObjectAabbMin,collisionObjectAabbMax);
- AabbExpand (collisionObjectAabbMin, collisionObjectAabbMax, castShapeAabbMin, castShapeAabbMax);
- btScalar hitLambda = btScalar(1.); //could use resultCallback.m_closestHitFraction, but needs testing
+ btVector3 collisionObjectAabbMin, collisionObjectAabbMax;
+ collisionObject->getCollisionShape()->getAabb(collisionObject->getWorldTransform(), collisionObjectAabbMin, collisionObjectAabbMax);
+ AabbExpand(collisionObjectAabbMin, collisionObjectAabbMax, castShapeAabbMin, castShapeAabbMax);
+ btScalar hitLambda = btScalar(1.); //could use resultCallback.m_closestHitFraction, but needs testing
btVector3 hitNormal;
- if (btRayAabb(convexFromWorld.getOrigin(),convexToWorld.getOrigin(),collisionObjectAabbMin,collisionObjectAabbMax,hitLambda,hitNormal))
+ if (btRayAabb(convexFromWorld.getOrigin(), convexToWorld.getOrigin(), collisionObjectAabbMin, collisionObjectAabbMax, hitLambda, hitNormal))
{
- objectQuerySingle(castShape, convexFromTrans,convexToTrans,
- collisionObject,
- collisionObject->getCollisionShape(),
- collisionObject->getWorldTransform(),
- resultCallback,
- allowedCcdPenetration);
+ objectQuerySingle(castShape, convexFromTrans, convexToTrans,
+ collisionObject,
+ collisionObject->getCollisionShape(),
+ collisionObject->getWorldTransform(),
+ resultCallback,
+ allowedCcdPenetration);
}
}
}
-#endif //USE_BRUTEFORCE_RAYBROADPHASE
+#endif //USE_BRUTEFORCE_RAYBROADPHASE
}
-
-
struct btBridgedManifoldResult : public btManifoldResult
{
+ btCollisionWorld::ContactResultCallback& m_resultCallback;
- btCollisionWorld::ContactResultCallback& m_resultCallback;
-
- btBridgedManifoldResult( const btCollisionObjectWrapper* obj0Wrap,const btCollisionObjectWrapper* obj1Wrap,btCollisionWorld::ContactResultCallback& resultCallback )
- :btManifoldResult(obj0Wrap,obj1Wrap),
- m_resultCallback(resultCallback)
+ btBridgedManifoldResult(const btCollisionObjectWrapper* obj0Wrap, const btCollisionObjectWrapper* obj1Wrap, btCollisionWorld::ContactResultCallback& resultCallback)
+ : btManifoldResult(obj0Wrap, obj1Wrap),
+ m_resultCallback(resultCallback)
{
}
- virtual void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar depth)
+ virtual void addContactPoint(const btVector3& normalOnBInWorld, const btVector3& pointInWorld, btScalar depth)
{
bool isSwapped = m_manifoldPtr->getBody0() != m_body0Wrap->getCollisionObject();
btVector3 pointA = pointInWorld + normalOnBInWorld * depth;
@@ -1182,78 +1135,74 @@ struct btBridgedManifoldResult : public btManifoldResult
btVector3 localB;
if (isSwapped)
{
- localA = m_body1Wrap->getCollisionObject()->getWorldTransform().invXform(pointA );
+ localA = m_body1Wrap->getCollisionObject()->getWorldTransform().invXform(pointA);
localB = m_body0Wrap->getCollisionObject()->getWorldTransform().invXform(pointInWorld);
- } else
+ }
+ else
{
- localA = m_body0Wrap->getCollisionObject()->getWorldTransform().invXform(pointA );
+ localA = m_body0Wrap->getCollisionObject()->getWorldTransform().invXform(pointA);
localB = m_body1Wrap->getCollisionObject()->getWorldTransform().invXform(pointInWorld);
}
-
- btManifoldPoint newPt(localA,localB,normalOnBInWorld,depth);
+
+ btManifoldPoint newPt(localA, localB, normalOnBInWorld, depth);
newPt.m_positionWorldOnA = pointA;
newPt.m_positionWorldOnB = pointInWorld;
-
- //BP mod, store contact triangles.
+
+ //BP mod, store contact triangles.
if (isSwapped)
{
newPt.m_partId0 = m_partId1;
newPt.m_partId1 = m_partId0;
- newPt.m_index0 = m_index1;
- newPt.m_index1 = m_index0;
- } else
+ newPt.m_index0 = m_index1;
+ newPt.m_index1 = m_index0;
+ }
+ else
{
newPt.m_partId0 = m_partId0;
newPt.m_partId1 = m_partId1;
- newPt.m_index0 = m_index0;
- newPt.m_index1 = m_index1;
+ newPt.m_index0 = m_index0;
+ newPt.m_index1 = m_index1;
}
//experimental feature info, for per-triangle material etc.
- const btCollisionObjectWrapper* obj0Wrap = isSwapped? m_body1Wrap : m_body0Wrap;
- const btCollisionObjectWrapper* obj1Wrap = isSwapped? m_body0Wrap : m_body1Wrap;
- m_resultCallback.addSingleResult(newPt,obj0Wrap,newPt.m_partId0,newPt.m_index0,obj1Wrap,newPt.m_partId1,newPt.m_index1);
-
+ const btCollisionObjectWrapper* obj0Wrap = isSwapped ? m_body1Wrap : m_body0Wrap;
+ const btCollisionObjectWrapper* obj1Wrap = isSwapped ? m_body0Wrap : m_body1Wrap;
+ m_resultCallback.addSingleResult(newPt, obj0Wrap, newPt.m_partId0, newPt.m_index0, obj1Wrap, newPt.m_partId1, newPt.m_index1);
}
-
};
-
-
struct btSingleContactCallback : public btBroadphaseAabbCallback
{
-
btCollisionObject* m_collisionObject;
- btCollisionWorld* m_world;
- btCollisionWorld::ContactResultCallback& m_resultCallback;
-
-
- btSingleContactCallback(btCollisionObject* collisionObject, btCollisionWorld* world,btCollisionWorld::ContactResultCallback& resultCallback)
- :m_collisionObject(collisionObject),
- m_world(world),
- m_resultCallback(resultCallback)
+ btCollisionWorld* m_world;
+ btCollisionWorld::ContactResultCallback& m_resultCallback;
+
+ btSingleContactCallback(btCollisionObject* collisionObject, btCollisionWorld* world, btCollisionWorld::ContactResultCallback& resultCallback)
+ : m_collisionObject(collisionObject),
+ m_world(world),
+ m_resultCallback(resultCallback)
{
}
- virtual bool process(const btBroadphaseProxy* proxy)
+ virtual bool process(const btBroadphaseProxy* proxy)
{
- btCollisionObject* collisionObject = (btCollisionObject*)proxy->m_clientObject;
+ btCollisionObject* collisionObject = (btCollisionObject*)proxy->m_clientObject;
if (collisionObject == m_collisionObject)
return true;
//only perform raycast if filterMask matches
- if(m_resultCallback.needsCollision(collisionObject->getBroadphaseHandle()))
+ if (m_resultCallback.needsCollision(collisionObject->getBroadphaseHandle()))
{
- btCollisionObjectWrapper ob0(0,m_collisionObject->getCollisionShape(),m_collisionObject,m_collisionObject->getWorldTransform(),-1,-1);
- btCollisionObjectWrapper ob1(0,collisionObject->getCollisionShape(),collisionObject,collisionObject->getWorldTransform(),-1,-1);
+ btCollisionObjectWrapper ob0(0, m_collisionObject->getCollisionShape(), m_collisionObject, m_collisionObject->getWorldTransform(), -1, -1);
+ btCollisionObjectWrapper ob1(0, collisionObject->getCollisionShape(), collisionObject, collisionObject->getWorldTransform(), -1, -1);
- btCollisionAlgorithm* algorithm = m_world->getDispatcher()->findAlgorithm(&ob0,&ob1,0, BT_CLOSEST_POINT_ALGORITHMS);
+ btCollisionAlgorithm* algorithm = m_world->getDispatcher()->findAlgorithm(&ob0, &ob1, 0, BT_CLOSEST_POINT_ALGORITHMS);
if (algorithm)
{
- btBridgedManifoldResult contactPointResult(&ob0,&ob1, m_resultCallback);
+ btBridgedManifoldResult contactPointResult(&ob0, &ob1, m_resultCallback);
//discrete collision detection query
-
- algorithm->processCollision(&ob0,&ob1, m_world->getDispatchInfo(),&contactPointResult);
+
+ algorithm->processCollision(&ob0, &ob1, m_world->getDispatchInfo(), &contactPointResult);
algorithm->~btCollisionAlgorithm();
m_world->getDispatcher()->freeCollisionAlgorithm(algorithm);
@@ -1263,271 +1212,247 @@ struct btSingleContactCallback : public btBroadphaseAabbCallback
}
};
-
///contactTest performs a discrete collision test 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 btCollisionWorld::contactTest( btCollisionObject* colObj, ContactResultCallback& resultCallback)
+void btCollisionWorld::contactTest(btCollisionObject* colObj, ContactResultCallback& resultCallback)
{
- btVector3 aabbMin,aabbMax;
- colObj->getCollisionShape()->getAabb(colObj->getWorldTransform(),aabbMin,aabbMax);
- btSingleContactCallback contactCB(colObj,this,resultCallback);
-
- m_broadphasePairCache->aabbTest(aabbMin,aabbMax,contactCB);
-}
+ btVector3 aabbMin, aabbMax;
+ colObj->getCollisionShape()->getAabb(colObj->getWorldTransform(), aabbMin, aabbMax);
+ btSingleContactCallback contactCB(colObj, this, resultCallback);
+ m_broadphasePairCache->aabbTest(aabbMin, aabbMax, contactCB);
+}
///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 btCollisionWorld::contactPairTest(btCollisionObject* colObjA, btCollisionObject* colObjB, ContactResultCallback& resultCallback)
+void btCollisionWorld::contactPairTest(btCollisionObject* colObjA, btCollisionObject* colObjB, ContactResultCallback& resultCallback)
{
- btCollisionObjectWrapper obA(0,colObjA->getCollisionShape(),colObjA,colObjA->getWorldTransform(),-1,-1);
- btCollisionObjectWrapper obB(0,colObjB->getCollisionShape(),colObjB,colObjB->getWorldTransform(),-1,-1);
+ btCollisionObjectWrapper obA(0, colObjA->getCollisionShape(), colObjA, colObjA->getWorldTransform(), -1, -1);
+ btCollisionObjectWrapper obB(0, colObjB->getCollisionShape(), colObjB, colObjB->getWorldTransform(), -1, -1);
- btCollisionAlgorithm* algorithm = getDispatcher()->findAlgorithm(&obA,&obB, 0, BT_CLOSEST_POINT_ALGORITHMS);
+ btCollisionAlgorithm* algorithm = getDispatcher()->findAlgorithm(&obA, &obB, 0, BT_CLOSEST_POINT_ALGORITHMS);
if (algorithm)
{
- btBridgedManifoldResult contactPointResult(&obA,&obB, resultCallback);
+ btBridgedManifoldResult contactPointResult(&obA, &obB, resultCallback);
contactPointResult.m_closestPointDistanceThreshold = resultCallback.m_closestDistanceThreshold;
//discrete collision detection query
- algorithm->processCollision(&obA,&obB, getDispatchInfo(),&contactPointResult);
+ algorithm->processCollision(&obA, &obB, getDispatchInfo(), &contactPointResult);
algorithm->~btCollisionAlgorithm();
getDispatcher()->freeCollisionAlgorithm(algorithm);
}
-
}
-
-
-
class DebugDrawcallback : public btTriangleCallback, public btInternalTriangleIndexCallback
{
- btIDebugDraw* m_debugDrawer;
- btVector3 m_color;
- btTransform m_worldTrans;
+ btIDebugDraw* m_debugDrawer;
+ btVector3 m_color;
+ btTransform m_worldTrans;
public:
+ DebugDrawcallback(btIDebugDraw* debugDrawer, const btTransform& worldTrans, const btVector3& color) : m_debugDrawer(debugDrawer),
+ m_color(color),
+ m_worldTrans(worldTrans)
+ {
+ }
- DebugDrawcallback(btIDebugDraw* debugDrawer,const btTransform& worldTrans,const btVector3& color) :
- m_debugDrawer(debugDrawer),
- m_color(color),
- m_worldTrans(worldTrans)
- {
- }
-
- virtual void internalProcessTriangleIndex(btVector3* triangle,int partId,int triangleIndex)
- {
- processTriangle(triangle,partId,triangleIndex);
- }
-
- virtual void processTriangle(btVector3* triangle,int partId, int triangleIndex)
- {
- (void)partId;
- (void)triangleIndex;
-
- btVector3 wv0,wv1,wv2;
- wv0 = m_worldTrans*triangle[0];
- wv1 = m_worldTrans*triangle[1];
- wv2 = m_worldTrans*triangle[2];
- btVector3 center = (wv0+wv1+wv2)*btScalar(1./3.);
-
- if (m_debugDrawer->getDebugMode() & btIDebugDraw::DBG_DrawNormals )
- {
- btVector3 normal = (wv1-wv0).cross(wv2-wv0);
- normal.normalize();
- btVector3 normalColor(1,1,0);
- m_debugDrawer->drawLine(center,center+normal,normalColor);
- }
- m_debugDrawer->drawLine(wv0,wv1,m_color);
- m_debugDrawer->drawLine(wv1,wv2,m_color);
- m_debugDrawer->drawLine(wv2,wv0,m_color);
- }
-};
+ virtual void internalProcessTriangleIndex(btVector3* triangle, int partId, int triangleIndex)
+ {
+ processTriangle(triangle, partId, triangleIndex);
+ }
+
+ virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex)
+ {
+ (void)partId;
+ (void)triangleIndex;
+ btVector3 wv0, wv1, wv2;
+ wv0 = m_worldTrans * triangle[0];
+ wv1 = m_worldTrans * triangle[1];
+ wv2 = m_worldTrans * triangle[2];
+ btVector3 center = (wv0 + wv1 + wv2) * btScalar(1. / 3.);
+
+ if (m_debugDrawer->getDebugMode() & btIDebugDraw::DBG_DrawNormals)
+ {
+ btVector3 normal = (wv1 - wv0).cross(wv2 - wv0);
+ normal.normalize();
+ btVector3 normalColor(1, 1, 0);
+ m_debugDrawer->drawLine(center, center + normal, normalColor);
+ }
+ m_debugDrawer->drawLine(wv0, wv1, m_color);
+ m_debugDrawer->drawLine(wv1, wv2, m_color);
+ m_debugDrawer->drawLine(wv2, wv0, m_color);
+ }
+};
void btCollisionWorld::debugDrawObject(const btTransform& worldTransform, const btCollisionShape* shape, const btVector3& color)
{
// Draw a small simplex at the center of the object
if (getDebugDrawer() && getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_DrawFrames)
{
- getDebugDrawer()->drawTransform(worldTransform,.1);
+ getDebugDrawer()->drawTransform(worldTransform, .1);
}
if (shape->getShapeType() == COMPOUND_SHAPE_PROXYTYPE)
{
const btCompoundShape* compoundShape = static_cast<const btCompoundShape*>(shape);
- for (int i=compoundShape->getNumChildShapes()-1;i>=0;i--)
+ for (int i = compoundShape->getNumChildShapes() - 1; i >= 0; i--)
{
btTransform childTrans = compoundShape->getChildTransform(i);
const btCollisionShape* colShape = compoundShape->getChildShape(i);
- debugDrawObject(worldTransform*childTrans,colShape,color);
+ debugDrawObject(worldTransform * childTrans, colShape, color);
}
-
- } else
+ }
+ else
{
+ switch (shape->getShapeType())
+ {
+ case BOX_SHAPE_PROXYTYPE:
+ {
+ const btBoxShape* boxShape = static_cast<const btBoxShape*>(shape);
+ btVector3 halfExtents = boxShape->getHalfExtentsWithMargin();
+ getDebugDrawer()->drawBox(-halfExtents, halfExtents, worldTransform, color);
+ break;
+ }
+
+ case SPHERE_SHAPE_PROXYTYPE:
+ {
+ const btSphereShape* sphereShape = static_cast<const btSphereShape*>(shape);
+ btScalar radius = sphereShape->getMargin(); //radius doesn't include the margin, so draw with margin
+
+ getDebugDrawer()->drawSphere(radius, worldTransform, color);
+ break;
+ }
+ case MULTI_SPHERE_SHAPE_PROXYTYPE:
+ {
+ const btMultiSphereShape* multiSphereShape = static_cast<const btMultiSphereShape*>(shape);
+
+ btTransform childTransform;
+ childTransform.setIdentity();
- switch (shape->getShapeType())
- {
-
- case BOX_SHAPE_PROXYTYPE:
- {
- const btBoxShape* boxShape = static_cast<const btBoxShape*>(shape);
- btVector3 halfExtents = boxShape->getHalfExtentsWithMargin();
- getDebugDrawer()->drawBox(-halfExtents,halfExtents,worldTransform,color);
- break;
- }
-
- case SPHERE_SHAPE_PROXYTYPE:
- {
- const btSphereShape* sphereShape = static_cast<const btSphereShape*>(shape);
- btScalar radius = sphereShape->getMargin();//radius doesn't include the margin, so draw with margin
-
- getDebugDrawer()->drawSphere(radius, worldTransform, color);
- break;
- }
- case MULTI_SPHERE_SHAPE_PROXYTYPE:
- {
- const btMultiSphereShape* multiSphereShape = static_cast<const btMultiSphereShape*>(shape);
-
- btTransform childTransform;
- childTransform.setIdentity();
-
- for (int i = multiSphereShape->getSphereCount()-1; i>=0;i--)
- {
- childTransform.setOrigin(multiSphereShape->getSpherePosition(i));
- getDebugDrawer()->drawSphere(multiSphereShape->getSphereRadius(i), worldTransform*childTransform, color);
- }
-
- break;
- }
- case CAPSULE_SHAPE_PROXYTYPE:
- {
- const btCapsuleShape* capsuleShape = static_cast<const btCapsuleShape*>(shape);
-
- btScalar radius = capsuleShape->getRadius();
- btScalar halfHeight = capsuleShape->getHalfHeight();
-
- int upAxis = capsuleShape->getUpAxis();
- getDebugDrawer()->drawCapsule(radius, halfHeight, upAxis, worldTransform, color);
- break;
- }
- case CONE_SHAPE_PROXYTYPE:
- {
- const btConeShape* coneShape = static_cast<const btConeShape*>(shape);
- btScalar radius = coneShape->getRadius();//+coneShape->getMargin();
- btScalar height = coneShape->getHeight();//+coneShape->getMargin();
-
- int upAxis= coneShape->getConeUpIndex();
- getDebugDrawer()->drawCone(radius, height, upAxis, worldTransform, color);
- break;
-
- }
- case CYLINDER_SHAPE_PROXYTYPE:
- {
- const btCylinderShape* cylinder = static_cast<const btCylinderShape*>(shape);
- int upAxis = cylinder->getUpAxis();
- btScalar radius = cylinder->getRadius();
- btScalar halfHeight = cylinder->getHalfExtentsWithMargin()[upAxis];
- getDebugDrawer()->drawCylinder(radius, halfHeight, upAxis, worldTransform, color);
- break;
- }
-
- case STATIC_PLANE_PROXYTYPE:
- {
- const btStaticPlaneShape* staticPlaneShape = static_cast<const btStaticPlaneShape*>(shape);
- btScalar planeConst = staticPlaneShape->getPlaneConstant();
- const btVector3& planeNormal = staticPlaneShape->getPlaneNormal();
- getDebugDrawer()->drawPlane(planeNormal, planeConst,worldTransform, color);
- break;
-
- }
- default:
- {
-
- /// for polyhedral shapes
- if (shape->isPolyhedral())
- {
- btPolyhedralConvexShape* polyshape = (btPolyhedralConvexShape*) shape;
-
- int i;
- if (polyshape->getConvexPolyhedron())
- {
- const btConvexPolyhedron* poly = polyshape->getConvexPolyhedron();
- for (i=0;i<poly->m_faces.size();i++)
- {
- btVector3 centroid(0,0,0);
- int numVerts = poly->m_faces[i].m_indices.size();
- if (numVerts)
- {
- int lastV = poly->m_faces[i].m_indices[numVerts-1];
- for (int v=0;v<poly->m_faces[i].m_indices.size();v++)
- {
- int curVert = poly->m_faces[i].m_indices[v];
- centroid+=poly->m_vertices[curVert];
- getDebugDrawer()->drawLine(worldTransform*poly->m_vertices[lastV],worldTransform*poly->m_vertices[curVert],color);
- lastV = curVert;
- }
- }
- centroid*= btScalar(1.f)/btScalar(numVerts);
- if (getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_DrawNormals)
- {
- btVector3 normalColor(1,1,0);
- btVector3 faceNormal(poly->m_faces[i].m_plane[0],poly->m_faces[i].m_plane[1],poly->m_faces[i].m_plane[2]);
- getDebugDrawer()->drawLine(worldTransform*centroid,worldTransform*(centroid+faceNormal),normalColor);
- }
-
- }
-
-
- } else
- {
- for (i=0;i<polyshape->getNumEdges();i++)
- {
- btVector3 a,b;
- polyshape->getEdge(i,a,b);
- btVector3 wa = worldTransform * a;
- btVector3 wb = worldTransform * b;
- getDebugDrawer()->drawLine(wa,wb,color);
- }
- }
-
-
- }
-
- if (shape->isConcave())
- {
- btConcaveShape* concaveMesh = (btConcaveShape*) shape;
-
- ///@todo pass camera, for some culling? no -> we are not a graphics lib
- btVector3 aabbMax(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
- btVector3 aabbMin(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
-
- DebugDrawcallback drawCallback(getDebugDrawer(),worldTransform,color);
- concaveMesh->processAllTriangles(&drawCallback,aabbMin,aabbMax);
-
- }
-
- if (shape->getShapeType() == CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE)
- {
- btConvexTriangleMeshShape* convexMesh = (btConvexTriangleMeshShape*) shape;
- //todo: pass camera for some culling
- btVector3 aabbMax(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
- btVector3 aabbMin(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
- //DebugDrawcallback drawCallback;
- DebugDrawcallback drawCallback(getDebugDrawer(),worldTransform,color);
- convexMesh->getMeshInterface()->InternalProcessAllTriangles(&drawCallback,aabbMin,aabbMax);
- }
-
-
-
- }
-
+ for (int i = multiSphereShape->getSphereCount() - 1; i >= 0; i--)
+ {
+ childTransform.setOrigin(multiSphereShape->getSpherePosition(i));
+ getDebugDrawer()->drawSphere(multiSphereShape->getSphereRadius(i), worldTransform * childTransform, color);
+ }
+
+ break;
+ }
+ case CAPSULE_SHAPE_PROXYTYPE:
+ {
+ const btCapsuleShape* capsuleShape = static_cast<const btCapsuleShape*>(shape);
+
+ btScalar radius = capsuleShape->getRadius();
+ btScalar halfHeight = capsuleShape->getHalfHeight();
+
+ int upAxis = capsuleShape->getUpAxis();
+ getDebugDrawer()->drawCapsule(radius, halfHeight, upAxis, worldTransform, color);
+ break;
+ }
+ case CONE_SHAPE_PROXYTYPE:
+ {
+ const btConeShape* coneShape = static_cast<const btConeShape*>(shape);
+ btScalar radius = coneShape->getRadius(); //+coneShape->getMargin();
+ btScalar height = coneShape->getHeight(); //+coneShape->getMargin();
+
+ int upAxis = coneShape->getConeUpIndex();
+ getDebugDrawer()->drawCone(radius, height, upAxis, worldTransform, color);
+ break;
+ }
+ case CYLINDER_SHAPE_PROXYTYPE:
+ {
+ const btCylinderShape* cylinder = static_cast<const btCylinderShape*>(shape);
+ int upAxis = cylinder->getUpAxis();
+ btScalar radius = cylinder->getRadius();
+ btScalar halfHeight = cylinder->getHalfExtentsWithMargin()[upAxis];
+ getDebugDrawer()->drawCylinder(radius, halfHeight, upAxis, worldTransform, color);
+ break;
+ }
+
+ case STATIC_PLANE_PROXYTYPE:
+ {
+ const btStaticPlaneShape* staticPlaneShape = static_cast<const btStaticPlaneShape*>(shape);
+ btScalar planeConst = staticPlaneShape->getPlaneConstant();
+ const btVector3& planeNormal = staticPlaneShape->getPlaneNormal();
+ getDebugDrawer()->drawPlane(planeNormal, planeConst, worldTransform, color);
+ break;
+ }
+ default:
+ {
+ /// for polyhedral shapes
+ if (shape->isPolyhedral())
+ {
+ btPolyhedralConvexShape* polyshape = (btPolyhedralConvexShape*)shape;
+
+ int i;
+ if (polyshape->getConvexPolyhedron())
+ {
+ const btConvexPolyhedron* poly = polyshape->getConvexPolyhedron();
+ for (i = 0; i < poly->m_faces.size(); i++)
+ {
+ btVector3 centroid(0, 0, 0);
+ int numVerts = poly->m_faces[i].m_indices.size();
+ if (numVerts)
+ {
+ int lastV = poly->m_faces[i].m_indices[numVerts - 1];
+ for (int v = 0; v < poly->m_faces[i].m_indices.size(); v++)
+ {
+ int curVert = poly->m_faces[i].m_indices[v];
+ centroid += poly->m_vertices[curVert];
+ getDebugDrawer()->drawLine(worldTransform * poly->m_vertices[lastV], worldTransform * poly->m_vertices[curVert], color);
+ lastV = curVert;
+ }
+ }
+ centroid *= btScalar(1.f) / btScalar(numVerts);
+ if (getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_DrawNormals)
+ {
+ btVector3 normalColor(1, 1, 0);
+ btVector3 faceNormal(poly->m_faces[i].m_plane[0], poly->m_faces[i].m_plane[1], poly->m_faces[i].m_plane[2]);
+ getDebugDrawer()->drawLine(worldTransform * centroid, worldTransform * (centroid + faceNormal), normalColor);
+ }
+ }
+ }
+ else
+ {
+ for (i = 0; i < polyshape->getNumEdges(); i++)
+ {
+ btVector3 a, b;
+ polyshape->getEdge(i, a, b);
+ btVector3 wa = worldTransform * a;
+ btVector3 wb = worldTransform * b;
+ getDebugDrawer()->drawLine(wa, wb, color);
+ }
+ }
+ }
+
+ if (shape->isConcave())
+ {
+ btConcaveShape* concaveMesh = (btConcaveShape*)shape;
+
+ ///@todo pass camera, for some culling? no -> we are not a graphics lib
+ btVector3 aabbMax(btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT));
+ btVector3 aabbMin(btScalar(-BT_LARGE_FLOAT), btScalar(-BT_LARGE_FLOAT), btScalar(-BT_LARGE_FLOAT));
+
+ DebugDrawcallback drawCallback(getDebugDrawer(), worldTransform, color);
+ concaveMesh->processAllTriangles(&drawCallback, aabbMin, aabbMax);
+ }
+
+ if (shape->getShapeType() == CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE)
+ {
+ btConvexTriangleMeshShape* convexMesh = (btConvexTriangleMeshShape*)shape;
+ //todo: pass camera for some culling
+ btVector3 aabbMax(btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT));
+ btVector3 aabbMin(btScalar(-BT_LARGE_FLOAT), btScalar(-BT_LARGE_FLOAT), btScalar(-BT_LARGE_FLOAT));
+ //DebugDrawcallback drawCallback;
+ DebugDrawcallback drawCallback(getDebugDrawer(), worldTransform, color);
+ convexMesh->getMeshInterface()->InternalProcessAllTriangles(&drawCallback, aabbMin, aabbMax);
+ }
+ }
}
}
}
-
-void btCollisionWorld::debugDrawWorld()
+void btCollisionWorld::debugDrawWorld()
{
if (getDebugDrawer())
{
@@ -1535,25 +1460,23 @@ void btCollisionWorld::debugDrawWorld()
btIDebugDraw::DefaultColors defaultColors = getDebugDrawer()->getDefaultColors();
- if ( getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_DrawContactPoints)
+ if (getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_DrawContactPoints)
{
-
-
if (getDispatcher())
{
int numManifolds = getDispatcher()->getNumManifolds();
-
- for (int i=0;i<numManifolds;i++)
+
+ for (int i = 0; i < numManifolds; i++)
{
btPersistentManifold* contactManifold = getDispatcher()->getManifoldByIndexInternal(i);
//btCollisionObject* obA = static_cast<btCollisionObject*>(contactManifold->getBody0());
//btCollisionObject* obB = static_cast<btCollisionObject*>(contactManifold->getBody1());
int numContacts = contactManifold->getNumContacts();
- for (int j=0;j<numContacts;j++)
+ for (int j = 0; j < numContacts; j++)
{
btManifoldPoint& cp = contactManifold->getContactPoint(j);
- getDebugDrawer()->drawContactPoint(cp.m_positionWorldOnB,cp.m_normalWorldOnB,cp.getDistance(),cp.getLifeTime(),defaultColors.m_contactPoint);
+ getDebugDrawer()->drawContactPoint(cp.m_positionWorldOnB, cp.m_normalWorldOnB, cp.getDistance(), cp.getLifeTime(), defaultColors.m_contactPoint);
}
}
}
@@ -1563,58 +1486,63 @@ void btCollisionWorld::debugDrawWorld()
{
int i;
- for ( i=0;i<m_collisionObjects.size();i++)
+ for (i = 0; i < m_collisionObjects.size(); i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
- if ((colObj->getCollisionFlags() & btCollisionObject::CF_DISABLE_VISUALIZE_OBJECT)==0)
+ if ((colObj->getCollisionFlags() & btCollisionObject::CF_DISABLE_VISUALIZE_OBJECT) == 0)
{
if (getDebugDrawer() && (getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_DrawWireframe))
{
- btVector3 color(btScalar(0.4),btScalar(0.4),btScalar(0.4));
+ btVector3 color(btScalar(0.4), btScalar(0.4), btScalar(0.4));
- switch(colObj->getActivationState())
+ switch (colObj->getActivationState())
{
- case ACTIVE_TAG:
- color = defaultColors.m_activeObject; break;
- case ISLAND_SLEEPING:
- color = defaultColors.m_deactivatedObject;break;
- case WANTS_DEACTIVATION:
- color = defaultColors.m_wantsDeactivationObject;break;
- case DISABLE_DEACTIVATION:
- color = defaultColors.m_disabledDeactivationObject;break;
- case DISABLE_SIMULATION:
- color = defaultColors.m_disabledSimulationObject;break;
- default:
+ case ACTIVE_TAG:
+ color = defaultColors.m_activeObject;
+ break;
+ case ISLAND_SLEEPING:
+ color = defaultColors.m_deactivatedObject;
+ break;
+ case WANTS_DEACTIVATION:
+ color = defaultColors.m_wantsDeactivationObject;
+ break;
+ case DISABLE_DEACTIVATION:
+ color = defaultColors.m_disabledDeactivationObject;
+ break;
+ case DISABLE_SIMULATION:
+ color = defaultColors.m_disabledSimulationObject;
+ break;
+ default:
{
- color = btVector3(btScalar(.3),btScalar(0.3),btScalar(0.3));
+ color = btVector3(btScalar(.3), btScalar(0.3), btScalar(0.3));
}
};
colObj->getCustomDebugColor(color);
- debugDrawObject(colObj->getWorldTransform(),colObj->getCollisionShape(),color);
+ debugDrawObject(colObj->getWorldTransform(), colObj->getCollisionShape(), color);
}
if (m_debugDrawer && (m_debugDrawer->getDebugMode() & btIDebugDraw::DBG_DrawAabb))
{
- btVector3 minAabb,maxAabb;
+ btVector3 minAabb, maxAabb;
btVector3 colorvec = defaultColors.m_aabb;
- colObj->getCollisionShape()->getAabb(colObj->getWorldTransform(), minAabb,maxAabb);
- btVector3 contactThreshold(gContactBreakingThreshold,gContactBreakingThreshold,gContactBreakingThreshold);
+ colObj->getCollisionShape()->getAabb(colObj->getWorldTransform(), minAabb, maxAabb);
+ btVector3 contactThreshold(gContactBreakingThreshold, gContactBreakingThreshold, gContactBreakingThreshold);
minAabb -= contactThreshold;
maxAabb += contactThreshold;
- btVector3 minAabb2,maxAabb2;
+ btVector3 minAabb2, maxAabb2;
- if(getDispatchInfo().m_useContinuous && colObj->getInternalType()==btCollisionObject::CO_RIGID_BODY && !colObj->isStaticOrKinematicObject())
+ if (getDispatchInfo().m_useContinuous && colObj->getInternalType() == btCollisionObject::CO_RIGID_BODY && !colObj->isStaticOrKinematicObject())
{
- colObj->getCollisionShape()->getAabb(colObj->getInterpolationWorldTransform(),minAabb2,maxAabb2);
+ colObj->getCollisionShape()->getAabb(colObj->getInterpolationWorldTransform(), minAabb2, maxAabb2);
minAabb2 -= contactThreshold;
maxAabb2 += contactThreshold;
minAabb.setMin(minAabb2);
maxAabb.setMax(maxAabb2);
}
- m_debugDrawer->drawAabb(minAabb,maxAabb,colorvec);
+ m_debugDrawer->drawAabb(minAabb, maxAabb, colorvec);
}
}
}
@@ -1622,28 +1550,27 @@ void btCollisionWorld::debugDrawWorld()
}
}
-
-void btCollisionWorld::serializeCollisionObjects(btSerializer* serializer)
+void btCollisionWorld::serializeCollisionObjects(btSerializer* serializer)
{
int i;
///keep track of shapes already serialized
- btHashMap<btHashPtr,btCollisionShape*> serializedShapes;
+ btHashMap<btHashPtr, btCollisionShape*> serializedShapes;
- for (i=0;i<m_collisionObjects.size();i++)
+ for (i = 0; i < m_collisionObjects.size(); i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
btCollisionShape* shape = colObj->getCollisionShape();
if (!serializedShapes.find(shape))
{
- serializedShapes.insert(shape,shape);
+ serializedShapes.insert(shape, shape);
shape->serializeSingleShape(serializer);
}
}
//serialize all collision objects
- for (i=0;i<m_collisionObjects.size();i++)
+ for (i = 0; i < m_collisionObjects.size(); i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
if (colObj->getInternalType() == btCollisionObject::CO_COLLISION_OBJECT)
@@ -1653,8 +1580,6 @@ void btCollisionWorld::serializeCollisionObjects(btSerializer* serializer)
}
}
-
-
void btCollisionWorld::serializeContactManifolds(btSerializer* serializer)
{
if (serializer->getSerializationFlags() & BT_SERIALIZE_CONTACT_MANIFOLDS)
@@ -1663,7 +1588,7 @@ void btCollisionWorld::serializeContactManifolds(btSerializer* serializer)
for (int i = 0; i < numManifolds; i++)
{
const btPersistentManifold* manifold = getDispatcher()->getInternalManifoldPointer()[i];
- //don't serialize empty manifolds, they just take space
+ //don't serialize empty manifolds, they just take space
//(may have to do it anyway if it destroys determinism)
if (manifold->getNumContacts() == 0)
continue;
@@ -1675,16 +1600,13 @@ void btCollisionWorld::serializeContactManifolds(btSerializer* serializer)
}
}
-
-void btCollisionWorld::serialize(btSerializer* serializer)
+void btCollisionWorld::serialize(btSerializer* serializer)
{
-
serializer->startSerialization();
-
+
serializeCollisionObjects(serializer);
serializeContactManifolds(serializer);
-
+
serializer->finishSerialization();
}
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionWorld.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionWorld.h
index 886476e8ad..fd0e5b9bbd 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionWorld.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionWorld.h
@@ -13,7 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
/**
* @mainpage Bullet Documentation
*
@@ -66,8 +65,6 @@ subject to the following restrictions:
* 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
@@ -87,147 +84,138 @@ class btSerializer;
///CollisionWorld is interface and container for the collision detection
class btCollisionWorld
{
-
-
protected:
+ btAlignedObjectArray<btCollisionObject*> m_collisionObjects;
- btAlignedObjectArray<btCollisionObject*> m_collisionObjects;
-
- btDispatcher* m_dispatcher1;
+ btDispatcher* m_dispatcher1;
- btDispatcherInfo m_dispatchInfo;
+ btDispatcherInfo m_dispatchInfo;
- btBroadphaseInterface* m_broadphasePairCache;
+ btBroadphaseInterface* m_broadphasePairCache;
- btIDebugDraw* m_debugDrawer;
+ 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 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);
+ btCollisionWorld(btDispatcher* dispatcher, btBroadphaseInterface* broadphasePairCache, btCollisionConfiguration* collisionConfiguration);
virtual ~btCollisionWorld();
- void setBroadphase(btBroadphaseInterface* pairCache)
+ void setBroadphase(btBroadphaseInterface* pairCache)
{
m_broadphasePairCache = pairCache;
}
- const btBroadphaseInterface* getBroadphase() const
+ const btBroadphaseInterface* getBroadphase() const
{
return m_broadphasePairCache;
}
- btBroadphaseInterface* getBroadphase()
+ btBroadphaseInterface* getBroadphase()
{
return m_broadphasePairCache;
}
- btOverlappingPairCache* getPairCache()
+ btOverlappingPairCache* getPairCache()
{
return m_broadphasePairCache->getOverlappingPairCache();
}
-
- btDispatcher* getDispatcher()
+ btDispatcher* getDispatcher()
{
return m_dispatcher1;
}
- const btDispatcher* getDispatcher() const
+ const btDispatcher* getDispatcher() const
{
return m_dispatcher1;
}
- void updateSingleAabb(btCollisionObject* colObj);
+ void updateSingleAabb(btCollisionObject* colObj);
- virtual void updateAabbs();
+ 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 computeOverlappingPairs();
-
- virtual void setDebugDrawer(btIDebugDraw* debugDrawer)
+ virtual void setDebugDrawer(btIDebugDraw* debugDrawer)
{
- m_debugDrawer = debugDrawer;
+ m_debugDrawer = debugDrawer;
}
- virtual btIDebugDraw* getDebugDrawer()
+ virtual btIDebugDraw* getDebugDrawer()
{
return m_debugDrawer;
}
- virtual void debugDrawWorld();
+ 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
+ struct LocalShapeInfo
{
- int m_shapePart;
- int m_triangleIndex;
-
+ int m_shapePart;
+ int m_triangleIndex;
+
//const btCollisionShape* m_shapeTemp;
//const btTransform* m_shapeLocalTransform;
};
- struct LocalRayResult
+ 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)
+ 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;
-
+ const btCollisionObject* m_collisionObject;
+ LocalShapeInfo* m_localShapeInfo;
+ btVector3 m_hitNormalLocal;
+ btScalar m_hitFraction;
};
///RayResultCallback is used to report new raycast results
- struct RayResultCallback
+ struct RayResultCallback
{
- btScalar m_closestHitFraction;
- const btCollisionObject* m_collisionObject;
- int m_collisionFilterGroup;
- int m_collisionFilterMask;
+ 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
+ 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)
+ : m_closestHitFraction(btScalar(1.)),
+ m_collisionObject(0),
+ m_collisionFilterGroup(btBroadphaseProxy::DefaultFilter),
+ m_collisionFilterMask(btBroadphaseProxy::AllFilter),
+ //@BP Mod
+ m_flags(0)
{
}
@@ -238,62 +226,62 @@ public:
return collides;
}
-
- virtual btScalar addSingleResult(LocalRayResult& rayResult,bool normalInWorldSpace) = 0;
+ virtual btScalar addSingleResult(LocalRayResult& rayResult, bool normalInWorldSpace) = 0;
};
- struct ClosestRayResultCallback : public RayResultCallback
+ struct ClosestRayResultCallback : public RayResultCallback
{
- ClosestRayResultCallback(const btVector3& rayFromWorld,const btVector3& rayToWorld)
- :m_rayFromWorld(rayFromWorld),
- m_rayToWorld(rayToWorld)
+ 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_rayFromWorld; //used to calculate hitPointWorld from hitFraction
+ btVector3 m_rayToWorld;
+
+ btVector3 m_hitNormalWorld;
+ btVector3 m_hitPointWorld;
- btVector3 m_hitNormalWorld;
- btVector3 m_hitPointWorld;
-
- virtual btScalar addSingleResult(LocalRayResult& rayResult,bool normalInWorldSpace)
+ 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
+ }
+ else
{
///need to transform normal into worldspace
- m_hitNormalWorld = m_collisionObject->getWorldTransform().getBasis()*rayResult.m_hitNormalLocal;
+ m_hitNormalWorld = m_collisionObject->getWorldTransform().getBasis() * rayResult.m_hitNormalLocal;
}
- m_hitPointWorld.setInterpolate3(m_rayFromWorld,m_rayToWorld,rayResult.m_hitFraction);
+ m_hitPointWorld.setInterpolate3(m_rayFromWorld, m_rayToWorld, rayResult.m_hitFraction);
return rayResult.m_hitFraction;
}
};
- struct AllHitsRayResultCallback : public RayResultCallback
+ struct AllHitsRayResultCallback : public RayResultCallback
{
- AllHitsRayResultCallback(const btVector3& rayFromWorld,const btVector3& rayToWorld)
- :m_rayFromWorld(rayFromWorld),
- m_rayToWorld(rayToWorld)
+ AllHitsRayResultCallback(const btVector3& rayFromWorld, const btVector3& rayToWorld)
+ : m_rayFromWorld(rayFromWorld),
+ m_rayToWorld(rayToWorld)
{
}
- btAlignedObjectArray<const btCollisionObject*> m_collisionObjects;
+ btAlignedObjectArray<const btCollisionObject*> m_collisionObjects;
- btVector3 m_rayFromWorld;//used to calculate hitPointWorld from hitFraction
- btVector3 m_rayToWorld;
+ btVector3 m_rayFromWorld; //used to calculate hitPointWorld from hitFraction
+ btVector3 m_rayToWorld;
- btAlignedObjectArray<btVector3> m_hitNormalWorld;
- btAlignedObjectArray<btVector3> m_hitPointWorld;
+ btAlignedObjectArray<btVector3> m_hitNormalWorld;
+ btAlignedObjectArray<btVector3> m_hitPointWorld;
btAlignedObjectArray<btScalar> m_hitFractions;
-
- virtual btScalar addSingleResult(LocalRayResult& rayResult,bool normalInWorldSpace)
+
+ virtual btScalar addSingleResult(LocalRayResult& rayResult, bool normalInWorldSpace)
{
m_collisionObject = rayResult.m_collisionObject;
m_collisionObjects.push_back(rayResult.m_collisionObject);
@@ -301,69 +289,66 @@ public:
if (normalInWorldSpace)
{
hitNormalWorld = rayResult.m_hitNormalLocal;
- } else
+ }
+ else
{
///need to transform normal into worldspace
- hitNormalWorld = m_collisionObject->getWorldTransform().getBasis()*rayResult.m_hitNormalLocal;
+ hitNormalWorld = m_collisionObject->getWorldTransform().getBasis() * rayResult.m_hitNormalLocal;
}
m_hitNormalWorld.push_back(hitNormalWorld);
btVector3 hitPointWorld;
- hitPointWorld.setInterpolate3(m_rayFromWorld,m_rayToWorld,rayResult.m_hitFraction);
+ 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)
+ 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;
+ 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
+ struct ConvexResultCallback
{
- btScalar m_closestHitFraction;
- int m_collisionFilterGroup;
- int m_collisionFilterMask;
-
+ btScalar m_closestHitFraction;
+ int m_collisionFilterGroup;
+ int m_collisionFilterMask;
+
ConvexResultCallback()
- :m_closestHitFraction(btScalar(1.)),
- m_collisionFilterGroup(btBroadphaseProxy::DefaultFilter),
- m_collisionFilterMask(btBroadphaseProxy::AllFilter)
+ : m_closestHitFraction(btScalar(1.)),
+ m_collisionFilterGroup(btBroadphaseProxy::DefaultFilter),
+ m_collisionFilterMask(btBroadphaseProxy::AllFilter)
{
}
virtual ~ConvexResultCallback()
{
}
-
- bool hasHit() const
+
+ bool hasHit() const
{
return (m_closestHitFraction < btScalar(1.));
}
-
-
virtual bool needsCollision(btBroadphaseProxy* proxy0) const
{
bool collides = (proxy0->m_collisionFilterGroup & m_collisionFilterMask) != 0;
@@ -371,39 +356,40 @@ public:
return collides;
}
- virtual btScalar addSingleResult(LocalConvexResult& convexResult,bool normalInWorldSpace) = 0;
+ virtual btScalar addSingleResult(LocalConvexResult& convexResult, bool normalInWorldSpace) = 0;
};
- struct ClosestConvexResultCallback : public ConvexResultCallback
+ struct ClosestConvexResultCallback : public ConvexResultCallback
{
- ClosestConvexResultCallback(const btVector3& convexFromWorld,const btVector3& convexToWorld)
- :m_convexFromWorld(convexFromWorld),
- m_convexToWorld(convexToWorld),
- m_hitCollisionObject(0)
+ 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_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)
+ 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
+ //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
+ }
+ else
{
///need to transform normal into worldspace
- m_hitNormalWorld = m_hitCollisionObject->getWorldTransform().getBasis()*convexResult.m_hitNormalLocal;
+ m_hitNormalWorld = m_hitCollisionObject->getWorldTransform().getBasis() * convexResult.m_hitNormalLocal;
}
m_hitPointWorld = convexResult.m_hitPointLocal;
return convexResult.m_hitFraction;
@@ -411,23 +397,23 @@ public:
};
///ContactResultCallback is used to report contact points
- struct ContactResultCallback
+ struct ContactResultCallback
{
- int m_collisionFilterGroup;
- int m_collisionFilterMask;
- btScalar m_closestDistanceThreshold;
+ int m_collisionFilterGroup;
+ int m_collisionFilterMask;
+ btScalar m_closestDistanceThreshold;
ContactResultCallback()
- :m_collisionFilterGroup(btBroadphaseProxy::DefaultFilter),
- m_collisionFilterMask(btBroadphaseProxy::AllFilter),
- m_closestDistanceThreshold(0)
+ : 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;
@@ -435,58 +421,57 @@ public:
return collides;
}
- virtual btScalar addSingleResult(btManifoldPoint& cp, const btCollisionObjectWrapper* colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper* colObj1Wrap,int partId1,int index1) = 0;
+ virtual btScalar addSingleResult(btManifoldPoint& cp, const btCollisionObjectWrapper* colObj0Wrap, int partId0, int index0, const btCollisionObjectWrapper* colObj1Wrap, int partId1, int index1) = 0;
};
-
-
- int getNumCollisionObjects() const
+ 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;
+ 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;
+ 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);
+ 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);
-
+ 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 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);
+ 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 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);
+ 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 addCollisionObject(btCollisionObject* collisionObject, int collisionFilterGroup = btBroadphaseProxy::DefaultFilter, int collisionFilterMask = btBroadphaseProxy::AllFilter);
+
+ virtual void refreshBroadphaseProxy(btCollisionObject* collisionObject);
btCollisionObjectArray& getCollisionObjectArray()
{
@@ -498,10 +483,9 @@ public:
return m_collisionObjects;
}
+ virtual void removeCollisionObject(btCollisionObject* collisionObject);
- virtual void removeCollisionObject(btCollisionObject* collisionObject);
-
- virtual void performDiscreteCollisionDetection();
+ virtual void performDiscreteCollisionDetection();
btDispatcherInfo& getDispatchInfo()
{
@@ -512,20 +496,18 @@ public:
{
return m_dispatchInfo;
}
-
- bool getForceUpdateAllAabbs() const
+
+ bool getForceUpdateAllAabbs() const
{
return m_forceUpdateAllAabbs;
}
- void setForceUpdateAllAabbs( bool 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);
-
+ virtual void serialize(btSerializer* serializer);
};
-
-#endif //BT_COLLISION_WORLD_H
+#endif //BT_COLLISION_WORLD_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionWorldImporter.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionWorldImporter.cpp
index f2b0837808..9f422dc157 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionWorldImporter.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionWorldImporter.cpp
@@ -15,269 +15,251 @@ subject to the following restrictions:
#include "btCollisionWorldImporter.h"
#include "btBulletCollisionCommon.h"
-#include "LinearMath/btSerializer.h" //for btBulletSerializedArrays definition
+#include "LinearMath/btSerializer.h" //for btBulletSerializedArrays definition
#ifdef SUPPORT_GIMPACT_SHAPE_IMPORT
#include "BulletCollision/Gimpact/btGImpactShape.h"
-#endif //SUPPORT_GIMPACT_SHAPE_IMPORT
+#endif //SUPPORT_GIMPACT_SHAPE_IMPORT
btCollisionWorldImporter::btCollisionWorldImporter(btCollisionWorld* world)
-:m_collisionWorld(world),
-m_verboseMode(0)
+ : m_collisionWorld(world),
+ m_verboseMode(0)
{
-
}
btCollisionWorldImporter::~btCollisionWorldImporter()
{
}
-
-
-
-
-bool btCollisionWorldImporter::convertAllObjects( btBulletSerializedArrays* arrays)
+bool btCollisionWorldImporter::convertAllObjects(btBulletSerializedArrays* arrays)
{
-
m_shapeMap.clear();
m_bodyMap.clear();
int i;
- for (i=0;i<arrays->m_bvhsDouble.size();i++)
+ for (i = 0; i < arrays->m_bvhsDouble.size(); i++)
{
btOptimizedBvh* bvh = createOptimizedBvh();
btQuantizedBvhDoubleData* bvhData = arrays->m_bvhsDouble[i];
bvh->deSerializeDouble(*bvhData);
- m_bvhMap.insert(arrays->m_bvhsDouble[i],bvh);
+ m_bvhMap.insert(arrays->m_bvhsDouble[i], bvh);
}
- for (i=0;i<arrays->m_bvhsFloat.size();i++)
- {
- btOptimizedBvh* bvh = createOptimizedBvh();
- btQuantizedBvhFloatData* bvhData = arrays->m_bvhsFloat[i];
+ for (i = 0; i < arrays->m_bvhsFloat.size(); i++)
+ {
+ btOptimizedBvh* bvh = createOptimizedBvh();
+ btQuantizedBvhFloatData* bvhData = arrays->m_bvhsFloat[i];
bvh->deSerializeFloat(*bvhData);
- m_bvhMap.insert(arrays->m_bvhsFloat[i],bvh);
+ m_bvhMap.insert(arrays->m_bvhsFloat[i], bvh);
}
-
-
-
-
- for (i=0;i<arrays->m_colShapeData.size();i++)
+ for (i = 0; i < arrays->m_colShapeData.size(); i++)
{
btCollisionShapeData* shapeData = arrays->m_colShapeData[i];
btCollisionShape* shape = convertCollisionShape(shapeData);
if (shape)
{
- // printf("shapeMap.insert(%x,%x)\n",shapeData,shape);
- m_shapeMap.insert(shapeData,shape);
+ // printf("shapeMap.insert(%x,%x)\n",shapeData,shape);
+ m_shapeMap.insert(shapeData, shape);
}
- if (shape&& shapeData->m_name)
+ if (shape && shapeData->m_name)
{
char* newname = duplicateName(shapeData->m_name);
- m_objectNameMap.insert(shape,newname);
- m_nameShapeMap.insert(newname,shape);
+ m_objectNameMap.insert(shape, newname);
+ m_nameShapeMap.insert(newname, shape);
}
}
-
- for (i=0;i<arrays->m_collisionObjectDataDouble.size();i++)
+ for (i = 0; i < arrays->m_collisionObjectDataDouble.size(); i++)
{
- btCollisionObjectDoubleData* colObjData = arrays->m_collisionObjectDataDouble[i];
- btCollisionShape** shapePtr = m_shapeMap.find(colObjData->m_collisionShape);
- if (shapePtr && *shapePtr)
- {
- btTransform startTransform;
- colObjData->m_worldTransform.m_origin.m_floats[3] = 0.f;
- startTransform.deSerializeDouble(colObjData->m_worldTransform);
-
- btCollisionShape* shape = (btCollisionShape*)*shapePtr;
- btCollisionObject* body = createCollisionObject(startTransform,shape,colObjData->m_name);
- body->setFriction(btScalar(colObjData->m_friction));
- body->setRestitution(btScalar(colObjData->m_restitution));
+ btCollisionObjectDoubleData* colObjData = arrays->m_collisionObjectDataDouble[i];
+ btCollisionShape** shapePtr = m_shapeMap.find(colObjData->m_collisionShape);
+ if (shapePtr && *shapePtr)
+ {
+ btTransform startTransform;
+ colObjData->m_worldTransform.m_origin.m_floats[3] = 0.f;
+ startTransform.deSerializeDouble(colObjData->m_worldTransform);
+
+ btCollisionShape* shape = (btCollisionShape*)*shapePtr;
+ btCollisionObject* body = createCollisionObject(startTransform, shape, colObjData->m_name);
+ body->setFriction(btScalar(colObjData->m_friction));
+ body->setRestitution(btScalar(colObjData->m_restitution));
#ifdef USE_INTERNAL_EDGE_UTILITY
- if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE)
- {
- btBvhTriangleMeshShape* trimesh = (btBvhTriangleMeshShape*)shape;
- if (trimesh->getTriangleInfoMap())
- {
- body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK);
- }
- }
-#endif //USE_INTERNAL_EDGE_UTILITY
- m_bodyMap.insert(colObjData,body);
- } else
- {
- printf("error: no shape found\n");
- }
+ if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE)
+ {
+ btBvhTriangleMeshShape* trimesh = (btBvhTriangleMeshShape*)shape;
+ if (trimesh->getTriangleInfoMap())
+ {
+ body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK);
+ }
+ }
+#endif //USE_INTERNAL_EDGE_UTILITY
+ m_bodyMap.insert(colObjData, body);
+ }
+ else
+ {
+ printf("error: no shape found\n");
+ }
}
- for (i=0;i<arrays->m_collisionObjectDataFloat.size();i++)
+ for (i = 0; i < arrays->m_collisionObjectDataFloat.size(); i++)
{
- btCollisionObjectFloatData* colObjData = arrays->m_collisionObjectDataFloat[i];
- btCollisionShape** shapePtr = m_shapeMap.find(colObjData->m_collisionShape);
- if (shapePtr && *shapePtr)
- {
- btTransform startTransform;
- colObjData->m_worldTransform.m_origin.m_floats[3] = 0.f;
- startTransform.deSerializeFloat(colObjData->m_worldTransform);
+ btCollisionObjectFloatData* colObjData = arrays->m_collisionObjectDataFloat[i];
+ btCollisionShape** shapePtr = m_shapeMap.find(colObjData->m_collisionShape);
+ if (shapePtr && *shapePtr)
+ {
+ btTransform startTransform;
+ colObjData->m_worldTransform.m_origin.m_floats[3] = 0.f;
+ startTransform.deSerializeFloat(colObjData->m_worldTransform);
- btCollisionShape* shape = (btCollisionShape*)*shapePtr;
- btCollisionObject* body = createCollisionObject(startTransform,shape,colObjData->m_name);
+ btCollisionShape* shape = (btCollisionShape*)*shapePtr;
+ btCollisionObject* body = createCollisionObject(startTransform, shape, colObjData->m_name);
#ifdef USE_INTERNAL_EDGE_UTILITY
- if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE)
- {
- btBvhTriangleMeshShape* trimesh = (btBvhTriangleMeshShape*)shape;
- if (trimesh->getTriangleInfoMap())
- {
- body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK);
- }
- }
-#endif //USE_INTERNAL_EDGE_UTILITY
- m_bodyMap.insert(colObjData,body);
- } else
- {
- printf("error: no shape found\n");
- }
- }
+ if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE)
+ {
+ btBvhTriangleMeshShape* trimesh = (btBvhTriangleMeshShape*)shape;
+ if (trimesh->getTriangleInfoMap())
+ {
+ body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK);
+ }
+ }
+#endif //USE_INTERNAL_EDGE_UTILITY
+ m_bodyMap.insert(colObjData, body);
+ }
+ else
+ {
+ printf("error: no shape found\n");
+ }
+ }
return true;
}
-
-
void btCollisionWorldImporter::deleteAllData()
{
int i;
- for (i=0;i<m_allocatedCollisionObjects.size();i++)
+ for (i = 0; i < m_allocatedCollisionObjects.size(); i++)
{
- if(m_collisionWorld)
+ if (m_collisionWorld)
m_collisionWorld->removeCollisionObject(m_allocatedCollisionObjects[i]);
delete m_allocatedCollisionObjects[i];
}
m_allocatedCollisionObjects.clear();
-
- for (i=0;i<m_allocatedCollisionShapes.size();i++)
+ for (i = 0; i < m_allocatedCollisionShapes.size(); i++)
{
delete m_allocatedCollisionShapes[i];
}
m_allocatedCollisionShapes.clear();
-
- for (i=0;i<m_allocatedBvhs.size();i++)
+ for (i = 0; i < m_allocatedBvhs.size(); i++)
{
delete m_allocatedBvhs[i];
}
m_allocatedBvhs.clear();
- for (i=0;i<m_allocatedTriangleInfoMaps.size();i++)
+ for (i = 0; i < m_allocatedTriangleInfoMaps.size(); i++)
{
delete m_allocatedTriangleInfoMaps[i];
}
m_allocatedTriangleInfoMaps.clear();
- for (i=0;i<m_allocatedTriangleIndexArrays.size();i++)
+ for (i = 0; i < m_allocatedTriangleIndexArrays.size(); i++)
{
delete m_allocatedTriangleIndexArrays[i];
}
m_allocatedTriangleIndexArrays.clear();
- for (i=0;i<m_allocatedNames.size();i++)
+ for (i = 0; i < m_allocatedNames.size(); i++)
{
delete[] m_allocatedNames[i];
}
m_allocatedNames.clear();
- for (i=0;i<m_allocatedbtStridingMeshInterfaceDatas.size();i++)
+ for (i = 0; i < m_allocatedbtStridingMeshInterfaceDatas.size(); i++)
{
btStridingMeshInterfaceData* curData = m_allocatedbtStridingMeshInterfaceDatas[i];
- for(int a = 0;a < curData->m_numMeshParts;a++)
+ for (int a = 0; a < curData->m_numMeshParts; a++)
{
btMeshPartData* curPart = &curData->m_meshPartsPtr[a];
- if(curPart->m_vertices3f)
- delete [] curPart->m_vertices3f;
+ if (curPart->m_vertices3f)
+ delete[] curPart->m_vertices3f;
- if(curPart->m_vertices3d)
- delete [] curPart->m_vertices3d;
+ if (curPart->m_vertices3d)
+ delete[] curPart->m_vertices3d;
- if(curPart->m_indices32)
- delete [] curPart->m_indices32;
+ if (curPart->m_indices32)
+ delete[] curPart->m_indices32;
- if(curPart->m_3indices16)
- delete [] curPart->m_3indices16;
+ if (curPart->m_3indices16)
+ delete[] curPart->m_3indices16;
- if(curPart->m_indices16)
- delete [] curPart->m_indices16;
+ if (curPart->m_indices16)
+ delete[] curPart->m_indices16;
if (curPart->m_3indices8)
- delete [] curPart->m_3indices8;
-
+ delete[] curPart->m_3indices8;
}
- delete [] curData->m_meshPartsPtr;
+ delete[] curData->m_meshPartsPtr;
delete curData;
}
m_allocatedbtStridingMeshInterfaceDatas.clear();
- for (i=0;i<m_indexArrays.size();i++)
+ for (i = 0; i < m_indexArrays.size(); i++)
{
btAlignedFree(m_indexArrays[i]);
}
- m_indexArrays.clear();
+ m_indexArrays.clear();
- for (i=0;i<m_shortIndexArrays.size();i++)
+ for (i = 0; i < m_shortIndexArrays.size(); i++)
{
btAlignedFree(m_shortIndexArrays[i]);
}
- m_shortIndexArrays.clear();
+ m_shortIndexArrays.clear();
- for (i=0;i<m_charIndexArrays.size();i++)
+ for (i = 0; i < m_charIndexArrays.size(); i++)
{
btAlignedFree(m_charIndexArrays[i]);
}
- m_charIndexArrays.clear();
+ m_charIndexArrays.clear();
- for (i=0;i<m_floatVertexArrays.size();i++)
+ for (i = 0; i < m_floatVertexArrays.size(); i++)
{
btAlignedFree(m_floatVertexArrays[i]);
}
- m_floatVertexArrays.clear();
+ m_floatVertexArrays.clear();
- for (i=0;i<m_doubleVertexArrays.size();i++)
+ for (i = 0; i < m_doubleVertexArrays.size(); i++)
{
btAlignedFree(m_doubleVertexArrays[i]);
}
- m_doubleVertexArrays.clear();
-
-
+ m_doubleVertexArrays.clear();
}
-
-
-btCollisionShape* btCollisionWorldImporter::convertCollisionShape( btCollisionShapeData* shapeData )
+btCollisionShape* btCollisionWorldImporter::convertCollisionShape(btCollisionShapeData* shapeData)
{
btCollisionShape* shape = 0;
switch (shapeData->m_shapeType)
- {
- case STATIC_PLANE_PROXYTYPE:
+ {
+ case STATIC_PLANE_PROXYTYPE:
{
btStaticPlaneShapeData* planeData = (btStaticPlaneShapeData*)shapeData;
- btVector3 planeNormal,localScaling;
+ btVector3 planeNormal, localScaling;
planeNormal.deSerializeFloat(planeData->m_planeNormal);
localScaling.deSerializeFloat(planeData->m_localScaling);
- shape = createPlaneShape(planeNormal,planeData->m_planeConstant);
+ shape = createPlaneShape(planeNormal, planeData->m_planeConstant);
shape->setLocalScaling(localScaling);
break;
}
- case SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE:
+ case SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE:
{
- btScaledTriangleMeshShapeData* scaledMesh = (btScaledTriangleMeshShapeData*) shapeData;
- btCollisionShapeData* colShapeData = (btCollisionShapeData*) &scaledMesh->m_trimeshShapeData;
+ btScaledTriangleMeshShapeData* scaledMesh = (btScaledTriangleMeshShapeData*)shapeData;
+ btCollisionShapeData* colShapeData = (btCollisionShapeData*)&scaledMesh->m_trimeshShapeData;
colShapeData->m_shapeType = TRIANGLE_MESH_SHAPE_PROXYTYPE;
btCollisionShape* childShape = convertCollisionShape(colShapeData);
btBvhTriangleMeshShape* meshShape = (btBvhTriangleMeshShape*)childShape;
@@ -288,15 +270,14 @@ btCollisionShape* btCollisionWorldImporter::convertCollisionShape( btCollisionS
break;
}
#ifdef SUPPORT_GIMPACT_SHAPE_IMPORT
- case GIMPACT_SHAPE_PROXYTYPE:
+ case GIMPACT_SHAPE_PROXYTYPE:
{
- btGImpactMeshShapeData* gimpactData = (btGImpactMeshShapeData*) shapeData;
+ btGImpactMeshShapeData* gimpactData = (btGImpactMeshShapeData*)shapeData;
if (gimpactData->m_gimpactSubType == CONST_GIMPACT_TRIMESH_SHAPE)
{
btStridingMeshInterfaceData* interfaceData = createStridingMeshInterfaceData(&gimpactData->m_meshInterface);
btTriangleIndexVertexArray* meshInterface = createMeshInterface(*interfaceData);
-
btGImpactMeshShape* gimpactShape = createGimpactShape(meshInterface);
btVector3 localScaling;
localScaling.deSerializeFloat(gimpactData->m_localScaling);
@@ -304,47 +285,45 @@ btCollisionShape* btCollisionWorldImporter::convertCollisionShape( btCollisionS
gimpactShape->setMargin(btScalar(gimpactData->m_collisionMargin));
gimpactShape->updateBound();
shape = gimpactShape;
- } else
+ }
+ else
{
printf("unsupported gimpact sub type\n");
}
break;
}
-#endif //SUPPORT_GIMPACT_SHAPE_IMPORT
- //The btCapsuleShape* API has issue passing the margin/scaling/halfextents unmodified through the API
- //so deal with this
+#endif //SUPPORT_GIMPACT_SHAPE_IMPORT \
+ //The btCapsuleShape* API has issue passing the margin/scaling/halfextents unmodified through the API \
+ //so deal with this
case CAPSULE_SHAPE_PROXYTYPE:
{
btCapsuleShapeData* capData = (btCapsuleShapeData*)shapeData;
-
switch (capData->m_upAxis)
{
- case 0:
+ case 0:
{
- shape = createCapsuleShapeX(1,1);
+ shape = createCapsuleShapeX(1, 1);
break;
}
- case 1:
+ case 1:
{
- shape = createCapsuleShapeY(1,1);
+ shape = createCapsuleShapeY(1, 1);
break;
}
- case 2:
+ case 2:
{
- shape = createCapsuleShapeZ(1,1);
+ shape = createCapsuleShapeZ(1, 1);
break;
}
- default:
+ default:
{
printf("error: wrong up axis for btCapsuleShape\n");
}
-
-
};
if (shape)
{
- btCapsuleShape* cap = (btCapsuleShape*) shape;
+ btCapsuleShape* cap = (btCapsuleShape*)shape;
cap->deSerializeFloat(capData);
}
break;
@@ -355,163 +334,156 @@ btCollisionShape* btCollisionWorldImporter::convertCollisionShape( btCollisionS
case SPHERE_SHAPE_PROXYTYPE:
case MULTI_SPHERE_SHAPE_PROXYTYPE:
case CONVEX_HULL_SHAPE_PROXYTYPE:
+ {
+ btConvexInternalShapeData* bsd = (btConvexInternalShapeData*)shapeData;
+ btVector3 implicitShapeDimensions;
+ implicitShapeDimensions.deSerializeFloat(bsd->m_implicitShapeDimensions);
+ btVector3 localScaling;
+ localScaling.deSerializeFloat(bsd->m_localScaling);
+ btVector3 margin(bsd->m_collisionMargin, bsd->m_collisionMargin, bsd->m_collisionMargin);
+ switch (shapeData->m_shapeType)
{
- btConvexInternalShapeData* bsd = (btConvexInternalShapeData*)shapeData;
- btVector3 implicitShapeDimensions;
- implicitShapeDimensions.deSerializeFloat(bsd->m_implicitShapeDimensions);
- btVector3 localScaling;
- localScaling.deSerializeFloat(bsd->m_localScaling);
- btVector3 margin(bsd->m_collisionMargin,bsd->m_collisionMargin,bsd->m_collisionMargin);
- switch (shapeData->m_shapeType)
+ case BOX_SHAPE_PROXYTYPE:
{
- case BOX_SHAPE_PROXYTYPE:
- {
- btBoxShape* box= (btBoxShape*)createBoxShape(implicitShapeDimensions/localScaling+margin);
- //box->initializePolyhedralFeatures();
- shape = box;
+ btBoxShape* box = (btBoxShape*)createBoxShape(implicitShapeDimensions / localScaling + margin);
+ //box->initializePolyhedralFeatures();
+ shape = box;
+ break;
+ }
+ case SPHERE_SHAPE_PROXYTYPE:
+ {
+ shape = createSphereShape(implicitShapeDimensions.getX());
+ break;
+ }
+
+ case CYLINDER_SHAPE_PROXYTYPE:
+ {
+ btCylinderShapeData* cylData = (btCylinderShapeData*)shapeData;
+ btVector3 halfExtents = implicitShapeDimensions + margin;
+ switch (cylData->m_upAxis)
+ {
+ case 0:
+ {
+ shape = createCylinderShapeX(halfExtents.getY(), halfExtents.getX());
break;
}
- case SPHERE_SHAPE_PROXYTYPE:
+ case 1:
{
- shape = createSphereShape(implicitShapeDimensions.getX());
+ shape = createCylinderShapeY(halfExtents.getX(), halfExtents.getY());
break;
}
-
- case CYLINDER_SHAPE_PROXYTYPE:
+ case 2:
{
- btCylinderShapeData* cylData = (btCylinderShapeData*) shapeData;
- btVector3 halfExtents = implicitShapeDimensions+margin;
- switch (cylData->m_upAxis)
- {
- case 0:
- {
- shape = createCylinderShapeX(halfExtents.getY(),halfExtents.getX());
- break;
- }
- case 1:
- {
- shape = createCylinderShapeY(halfExtents.getX(),halfExtents.getY());
- break;
- }
- case 2:
- {
- shape = createCylinderShapeZ(halfExtents.getX(),halfExtents.getZ());
- break;
- }
- default:
- {
- printf("unknown Cylinder up axis\n");
- }
-
- };
-
-
-
+ shape = createCylinderShapeZ(halfExtents.getX(), halfExtents.getZ());
break;
}
- case CONE_SHAPE_PROXYTYPE:
+ default:
{
- btConeShapeData* conData = (btConeShapeData*) shapeData;
- btVector3 halfExtents = implicitShapeDimensions;//+margin;
- switch (conData->m_upIndex)
- {
- case 0:
- {
- shape = createConeShapeX(halfExtents.getY(),halfExtents.getX());
- break;
- }
- case 1:
- {
- shape = createConeShapeY(halfExtents.getX(),halfExtents.getY());
- break;
- }
- case 2:
- {
- shape = createConeShapeZ(halfExtents.getX(),halfExtents.getZ());
- break;
- }
- default:
- {
- printf("unknown Cone up axis\n");
- }
-
- };
-
-
+ printf("unknown Cylinder up axis\n");
+ }
+ };
+ break;
+ }
+ case CONE_SHAPE_PROXYTYPE:
+ {
+ btConeShapeData* conData = (btConeShapeData*)shapeData;
+ btVector3 halfExtents = implicitShapeDimensions; //+margin;
+ switch (conData->m_upIndex)
+ {
+ case 0:
+ {
+ shape = createConeShapeX(halfExtents.getY(), halfExtents.getX());
break;
}
- case MULTI_SPHERE_SHAPE_PROXYTYPE:
+ case 1:
{
- btMultiSphereShapeData* mss = (btMultiSphereShapeData*)bsd;
- int numSpheres = mss->m_localPositionArraySize;
-
- btAlignedObjectArray<btVector3> tmpPos;
- btAlignedObjectArray<btScalar> radii;
- radii.resize(numSpheres);
- tmpPos.resize(numSpheres);
- int i;
- for ( i=0;i<numSpheres;i++)
- {
- tmpPos[i].deSerializeFloat(mss->m_localPositionArrayPtr[i].m_pos);
- radii[i] = mss->m_localPositionArrayPtr[i].m_radius;
- }
- shape = createMultiSphereShape(&tmpPos[0],&radii[0],numSpheres);
+ shape = createConeShapeY(halfExtents.getX(), halfExtents.getY());
break;
}
- case CONVEX_HULL_SHAPE_PROXYTYPE:
+ case 2:
{
- // int sz = sizeof(btConvexHullShapeData);
- // int sz2 = sizeof(btConvexInternalShapeData);
- // int sz3 = sizeof(btCollisionShapeData);
- btConvexHullShapeData* convexData = (btConvexHullShapeData*)bsd;
- int numPoints = convexData->m_numUnscaledPoints;
-
- btAlignedObjectArray<btVector3> tmpPoints;
- tmpPoints.resize(numPoints);
- int i;
- for ( i=0;i<numPoints;i++)
- {
-#ifdef BT_USE_DOUBLE_PRECISION
- if (convexData->m_unscaledPointsDoublePtr)
- tmpPoints[i].deSerialize(convexData->m_unscaledPointsDoublePtr[i]);
- if (convexData->m_unscaledPointsFloatPtr)
- tmpPoints[i].deSerializeFloat(convexData->m_unscaledPointsFloatPtr[i]);
-#else
- if (convexData->m_unscaledPointsFloatPtr)
- tmpPoints[i].deSerialize(convexData->m_unscaledPointsFloatPtr[i]);
- if (convexData->m_unscaledPointsDoublePtr)
- tmpPoints[i].deSerializeDouble(convexData->m_unscaledPointsDoublePtr[i]);
-#endif //BT_USE_DOUBLE_PRECISION
- }
- btConvexHullShape* hullShape = createConvexHullShape();
- for (i=0;i<numPoints;i++)
- {
- hullShape->addPoint(tmpPoints[i]);
- }
- hullShape->setMargin(bsd->m_collisionMargin);
- //hullShape->initializePolyhedralFeatures();
- shape = hullShape;
+ shape = createConeShapeZ(halfExtents.getX(), halfExtents.getZ());
break;
}
- default:
+ default:
{
- printf("error: cannot create shape type (%d)\n",shapeData->m_shapeType);
+ printf("unknown Cone up axis\n");
}
- }
+ };
- if (shape)
+ break;
+ }
+ case MULTI_SPHERE_SHAPE_PROXYTYPE:
+ {
+ btMultiSphereShapeData* mss = (btMultiSphereShapeData*)bsd;
+ int numSpheres = mss->m_localPositionArraySize;
+
+ btAlignedObjectArray<btVector3> tmpPos;
+ btAlignedObjectArray<btScalar> radii;
+ radii.resize(numSpheres);
+ tmpPos.resize(numSpheres);
+ int i;
+ for (i = 0; i < numSpheres; i++)
+ {
+ tmpPos[i].deSerializeFloat(mss->m_localPositionArrayPtr[i].m_pos);
+ radii[i] = mss->m_localPositionArrayPtr[i].m_radius;
+ }
+ shape = createMultiSphereShape(&tmpPos[0], &radii[0], numSpheres);
+ break;
+ }
+ case CONVEX_HULL_SHAPE_PROXYTYPE:
{
- shape->setMargin(bsd->m_collisionMargin);
+ // int sz = sizeof(btConvexHullShapeData);
+ // int sz2 = sizeof(btConvexInternalShapeData);
+ // int sz3 = sizeof(btCollisionShapeData);
+ btConvexHullShapeData* convexData = (btConvexHullShapeData*)bsd;
+ int numPoints = convexData->m_numUnscaledPoints;
+
+ btAlignedObjectArray<btVector3> tmpPoints;
+ tmpPoints.resize(numPoints);
+ int i;
+ for (i = 0; i < numPoints; i++)
+ {
+#ifdef BT_USE_DOUBLE_PRECISION
+ if (convexData->m_unscaledPointsDoublePtr)
+ tmpPoints[i].deSerialize(convexData->m_unscaledPointsDoublePtr[i]);
+ if (convexData->m_unscaledPointsFloatPtr)
+ tmpPoints[i].deSerializeFloat(convexData->m_unscaledPointsFloatPtr[i]);
+#else
+ if (convexData->m_unscaledPointsFloatPtr)
+ tmpPoints[i].deSerialize(convexData->m_unscaledPointsFloatPtr[i]);
+ if (convexData->m_unscaledPointsDoublePtr)
+ tmpPoints[i].deSerializeDouble(convexData->m_unscaledPointsDoublePtr[i]);
+#endif //BT_USE_DOUBLE_PRECISION
+ }
+ btConvexHullShape* hullShape = createConvexHullShape();
+ for (i = 0; i < numPoints; i++)
+ {
+ hullShape->addPoint(tmpPoints[i]);
+ }
+ hullShape->setMargin(bsd->m_collisionMargin);
+ //hullShape->initializePolyhedralFeatures();
+ shape = hullShape;
+ break;
+ }
+ default:
+ {
+ printf("error: cannot create shape type (%d)\n", shapeData->m_shapeType);
+ }
+ }
- btVector3 localScaling;
- localScaling.deSerializeFloat(bsd->m_localScaling);
- shape->setLocalScaling(localScaling);
+ if (shape)
+ {
+ shape->setMargin(bsd->m_collisionMargin);
- }
- break;
+ btVector3 localScaling;
+ localScaling.deSerializeFloat(bsd->m_localScaling);
+ shape->setLocalScaling(localScaling);
}
+ break;
+ }
case TRIANGLE_MESH_SHAPE_PROXYTYPE:
{
btTriangleMeshShapeData* trimesh = (btTriangleMeshShapeData*)shapeData;
@@ -522,10 +494,10 @@ btCollisionShape* btCollisionWorldImporter::convertCollisionShape( btCollisionS
return 0;
}
- btVector3 scaling; scaling.deSerializeFloat(trimesh->m_meshInterface.m_scaling);
+ btVector3 scaling;
+ scaling.deSerializeFloat(trimesh->m_meshInterface.m_scaling);
meshInterface->setScaling(scaling);
-
btOptimizedBvh* bvh = 0;
#if 1
if (trimesh->m_quantizedFloatBvh)
@@ -534,7 +506,8 @@ btCollisionShape* btCollisionWorldImporter::convertCollisionShape( btCollisionS
if (bvhPtr && *bvhPtr)
{
bvh = *bvhPtr;
- } else
+ }
+ else
{
bvh = createOptimizedBvh();
bvh->deSerializeFloat(*trimesh->m_quantizedFloatBvh);
@@ -546,7 +519,8 @@ btCollisionShape* btCollisionWorldImporter::convertCollisionShape( btCollisionS
if (bvhPtr && *bvhPtr)
{
bvh = *bvhPtr;
- } else
+ }
+ else
{
bvh = createOptimizedBvh();
bvh->deSerializeDouble(*trimesh->m_quantizedDoubleBvh);
@@ -554,8 +528,7 @@ btCollisionShape* btCollisionWorldImporter::convertCollisionShape( btCollisionS
}
#endif
-
- btBvhTriangleMeshShape* trimeshShape = createBvhTriangleMeshShape(meshInterface,bvh);
+ btBvhTriangleMeshShape* trimeshShape = createBvhTriangleMeshShape(meshInterface, bvh);
trimeshShape->setMargin(trimesh->m_collisionMargin);
shape = trimeshShape;
@@ -567,71 +540,66 @@ btCollisionShape* btCollisionWorldImporter::convertCollisionShape( btCollisionS
#ifdef USE_INTERNAL_EDGE_UTILITY
gContactAddedCallback = btAdjustInternalEdgeContactsCallback;
-#endif //USE_INTERNAL_EDGE_UTILITY
-
+#endif //USE_INTERNAL_EDGE_UTILITY
}
//printf("trimesh->m_collisionMargin=%f\n",trimesh->m_collisionMargin);
break;
}
case COMPOUND_SHAPE_PROXYTYPE:
- {
- btCompoundShapeData* compoundData = (btCompoundShapeData*)shapeData;
- btCompoundShape* compoundShape = createCompoundShape();
-
- //btCompoundShapeChildData* childShapeDataArray = &compoundData->m_childShapePtr[0];
+ {
+ btCompoundShapeData* compoundData = (btCompoundShapeData*)shapeData;
+ btCompoundShape* compoundShape = createCompoundShape();
+ //btCompoundShapeChildData* childShapeDataArray = &compoundData->m_childShapePtr[0];
- btAlignedObjectArray<btCollisionShape*> childShapes;
- for (int i=0;i<compoundData->m_numChildShapes;i++)
- {
- //btCompoundShapeChildData* ptr = &compoundData->m_childShapePtr[i];
+ btAlignedObjectArray<btCollisionShape*> childShapes;
+ for (int i = 0; i < compoundData->m_numChildShapes; i++)
+ {
+ //btCompoundShapeChildData* ptr = &compoundData->m_childShapePtr[i];
- btCollisionShapeData* cd = compoundData->m_childShapePtr[i].m_childShape;
+ btCollisionShapeData* cd = compoundData->m_childShapePtr[i].m_childShape;
- btCollisionShape* childShape = convertCollisionShape(cd);
- if (childShape)
- {
- btTransform localTransform;
- localTransform.deSerializeFloat(compoundData->m_childShapePtr[i].m_transform);
- compoundShape->addChildShape(localTransform,childShape);
- } else
- {
+ btCollisionShape* childShape = convertCollisionShape(cd);
+ if (childShape)
+ {
+ btTransform localTransform;
+ localTransform.deSerializeFloat(compoundData->m_childShapePtr[i].m_transform);
+ compoundShape->addChildShape(localTransform, childShape);
+ }
+ else
+ {
#ifdef _DEBUG
- printf("error: couldn't create childShape for compoundShape\n");
+ printf("error: couldn't create childShape for compoundShape\n");
#endif
- }
-
}
- shape = compoundShape;
-
- break;
}
+ shape = compoundShape;
+
+ break;
+ }
case SOFTBODY_SHAPE_PROXYTYPE:
- {
- return 0;
- }
+ {
+ return 0;
+ }
default:
- {
+ {
#ifdef _DEBUG
- printf("unsupported shape type (%d)\n",shapeData->m_shapeType);
+ printf("unsupported shape type (%d)\n", shapeData->m_shapeType);
#endif
- }
}
+ }
- return shape;
-
+ return shape;
}
-
-
char* btCollisionWorldImporter::duplicateName(const char* name)
{
if (name)
{
int l = (int)strlen(name);
- char* newName = new char[l+1];
- memcpy(newName,name,l);
+ char* newName = new char[l + 1];
+ memcpy(newName, name, l);
newName[l] = 0;
m_allocatedNames.push_back(newName);
return newName;
@@ -639,53 +607,43 @@ char* btCollisionWorldImporter::duplicateName(const char* name)
return 0;
}
-
-
-
-
-
-
-
-
-
-
-btTriangleIndexVertexArray* btCollisionWorldImporter::createMeshInterface(btStridingMeshInterfaceData& meshData)
+btTriangleIndexVertexArray* btCollisionWorldImporter::createMeshInterface(btStridingMeshInterfaceData& meshData)
{
btTriangleIndexVertexArray* meshInterface = createTriangleMeshContainer();
- for (int i=0;i<meshData.m_numMeshParts;i++)
+ for (int i = 0; i < meshData.m_numMeshParts; i++)
{
btIndexedMesh meshPart;
meshPart.m_numTriangles = meshData.m_meshPartsPtr[i].m_numTriangles;
meshPart.m_numVertices = meshData.m_meshPartsPtr[i].m_numVertices;
-
if (meshData.m_meshPartsPtr[i].m_indices32)
{
meshPart.m_indexType = PHY_INTEGER;
- meshPart.m_triangleIndexStride = 3*sizeof(int);
- int* indexArray = (int*)btAlignedAlloc(sizeof(int)*3*meshPart.m_numTriangles,16);
+ meshPart.m_triangleIndexStride = 3 * sizeof(int);
+ int* indexArray = (int*)btAlignedAlloc(sizeof(int) * 3 * meshPart.m_numTriangles, 16);
m_indexArrays.push_back(indexArray);
- for (int j=0;j<3*meshPart.m_numTriangles;j++)
+ for (int j = 0; j < 3 * meshPart.m_numTriangles; j++)
{
indexArray[j] = meshData.m_meshPartsPtr[i].m_indices32[j].m_value;
}
meshPart.m_triangleIndexBase = (const unsigned char*)indexArray;
- } else
+ }
+ else
{
if (meshData.m_meshPartsPtr[i].m_3indices16)
{
meshPart.m_indexType = PHY_SHORT;
- meshPart.m_triangleIndexStride = sizeof(short int)*3;//sizeof(btShortIntIndexTripletData);
+ meshPart.m_triangleIndexStride = sizeof(short int) * 3; //sizeof(btShortIntIndexTripletData);
- short int* indexArray = (short int*)btAlignedAlloc(sizeof(short int)*3*meshPart.m_numTriangles,16);
+ short int* indexArray = (short int*)btAlignedAlloc(sizeof(short int) * 3 * meshPart.m_numTriangles, 16);
m_shortIndexArrays.push_back(indexArray);
- for (int j=0;j<meshPart.m_numTriangles;j++)
+ for (int j = 0; j < meshPart.m_numTriangles; j++)
{
- indexArray[3*j] = meshData.m_meshPartsPtr[i].m_3indices16[j].m_values[0];
- indexArray[3*j+1] = meshData.m_meshPartsPtr[i].m_3indices16[j].m_values[1];
- indexArray[3*j+2] = meshData.m_meshPartsPtr[i].m_3indices16[j].m_values[2];
+ indexArray[3 * j] = meshData.m_meshPartsPtr[i].m_3indices16[j].m_values[0];
+ indexArray[3 * j + 1] = meshData.m_meshPartsPtr[i].m_3indices16[j].m_values[1];
+ indexArray[3 * j + 2] = meshData.m_meshPartsPtr[i].m_3indices16[j].m_values[2];
}
meshPart.m_triangleIndexBase = (const unsigned char*)indexArray;
@@ -693,10 +651,10 @@ btTriangleIndexVertexArray* btCollisionWorldImporter::createMeshInterface(btStri
if (meshData.m_meshPartsPtr[i].m_indices16)
{
meshPart.m_indexType = PHY_SHORT;
- meshPart.m_triangleIndexStride = 3*sizeof(short int);
- short int* indexArray = (short int*)btAlignedAlloc(sizeof(short int)*3*meshPart.m_numTriangles,16);
+ meshPart.m_triangleIndexStride = 3 * sizeof(short int);
+ short int* indexArray = (short int*)btAlignedAlloc(sizeof(short int) * 3 * meshPart.m_numTriangles, 16);
m_shortIndexArrays.push_back(indexArray);
- for (int j=0;j<3*meshPart.m_numTriangles;j++)
+ for (int j = 0; j < 3 * meshPart.m_numTriangles; j++)
{
indexArray[j] = meshData.m_meshPartsPtr[i].m_indices16[j].m_value;
}
@@ -707,16 +665,16 @@ btTriangleIndexVertexArray* btCollisionWorldImporter::createMeshInterface(btStri
if (meshData.m_meshPartsPtr[i].m_3indices8)
{
meshPart.m_indexType = PHY_UCHAR;
- meshPart.m_triangleIndexStride = sizeof(unsigned char)*3;
+ meshPart.m_triangleIndexStride = sizeof(unsigned char) * 3;
- unsigned char* indexArray = (unsigned char*)btAlignedAlloc(sizeof(unsigned char)*3*meshPart.m_numTriangles,16);
+ unsigned char* indexArray = (unsigned char*)btAlignedAlloc(sizeof(unsigned char) * 3 * meshPart.m_numTriangles, 16);
m_charIndexArrays.push_back(indexArray);
- for (int j=0;j<meshPart.m_numTriangles;j++)
+ for (int j = 0; j < meshPart.m_numTriangles; j++)
{
- indexArray[3*j] = meshData.m_meshPartsPtr[i].m_3indices8[j].m_values[0];
- indexArray[3*j+1] = meshData.m_meshPartsPtr[i].m_3indices8[j].m_values[1];
- indexArray[3*j+2] = meshData.m_meshPartsPtr[i].m_3indices8[j].m_values[2];
+ indexArray[3 * j] = meshData.m_meshPartsPtr[i].m_3indices8[j].m_values[0];
+ indexArray[3 * j + 1] = meshData.m_meshPartsPtr[i].m_3indices8[j].m_values[1];
+ indexArray[3 * j + 2] = meshData.m_meshPartsPtr[i].m_3indices8[j].m_values[2];
}
meshPart.m_triangleIndexBase = (const unsigned char*)indexArray;
@@ -727,10 +685,10 @@ btTriangleIndexVertexArray* btCollisionWorldImporter::createMeshInterface(btStri
{
meshPart.m_vertexType = PHY_FLOAT;
meshPart.m_vertexStride = sizeof(btVector3FloatData);
- btVector3FloatData* vertices = (btVector3FloatData*) btAlignedAlloc(sizeof(btVector3FloatData)*meshPart.m_numVertices,16);
+ btVector3FloatData* vertices = (btVector3FloatData*)btAlignedAlloc(sizeof(btVector3FloatData) * meshPart.m_numVertices, 16);
m_floatVertexArrays.push_back(vertices);
- for (int j=0;j<meshPart.m_numVertices;j++)
+ for (int j = 0; j < meshPart.m_numVertices; j++)
{
vertices[j].m_floats[0] = meshData.m_meshPartsPtr[i].m_vertices3f[j].m_floats[0];
vertices[j].m_floats[1] = meshData.m_meshPartsPtr[i].m_vertices3f[j].m_floats[1];
@@ -738,16 +696,16 @@ btTriangleIndexVertexArray* btCollisionWorldImporter::createMeshInterface(btStri
vertices[j].m_floats[3] = meshData.m_meshPartsPtr[i].m_vertices3f[j].m_floats[3];
}
meshPart.m_vertexBase = (const unsigned char*)vertices;
- } else
+ }
+ else
{
meshPart.m_vertexType = PHY_DOUBLE;
meshPart.m_vertexStride = sizeof(btVector3DoubleData);
-
- btVector3DoubleData* vertices = (btVector3DoubleData*) btAlignedAlloc(sizeof(btVector3DoubleData)*meshPart.m_numVertices,16);
+ btVector3DoubleData* vertices = (btVector3DoubleData*)btAlignedAlloc(sizeof(btVector3DoubleData) * meshPart.m_numVertices, 16);
m_doubleVertexArrays.push_back(vertices);
- for (int j=0;j<meshPart.m_numVertices;j++)
+ for (int j = 0; j < meshPart.m_numVertices; j++)
{
vertices[j].m_floats[0] = meshData.m_meshPartsPtr[i].m_vertices3d[j].m_floats[0];
vertices[j].m_floats[1] = meshData.m_meshPartsPtr[i].m_vertices3d[j].m_floats[1];
@@ -759,14 +717,13 @@ btTriangleIndexVertexArray* btCollisionWorldImporter::createMeshInterface(btStri
if (meshPart.m_triangleIndexBase && meshPart.m_vertexBase)
{
- meshInterface->addIndexedMesh(meshPart,meshPart.m_indexType);
+ meshInterface->addIndexedMesh(meshPart, meshPart.m_indexType);
}
}
return meshInterface;
}
-
btStridingMeshInterfaceData* btCollisionWorldImporter::createStridingMeshInterfaceData(btStridingMeshInterfaceData* interfaceData)
{
//create a new btStridingMeshInterfaceData that is an exact copy of shapedata and store it in the WorldImporter
@@ -776,7 +733,7 @@ btStridingMeshInterfaceData* btCollisionWorldImporter::createStridingMeshInterfa
newData->m_numMeshParts = interfaceData->m_numMeshParts;
newData->m_meshPartsPtr = new btMeshPartData[newData->m_numMeshParts];
- for(int i = 0;i < newData->m_numMeshParts;i++)
+ for (int i = 0; i < newData->m_numMeshParts; i++)
{
btMeshPartData* curPart = &interfaceData->m_meshPartsPtr[i];
btMeshPartData* curNewPart = &newData->m_meshPartsPtr[i];
@@ -784,18 +741,18 @@ btStridingMeshInterfaceData* btCollisionWorldImporter::createStridingMeshInterfa
curNewPart->m_numTriangles = curPart->m_numTriangles;
curNewPart->m_numVertices = curPart->m_numVertices;
- if(curPart->m_vertices3f)
+ if (curPart->m_vertices3f)
{
curNewPart->m_vertices3f = new btVector3FloatData[curNewPart->m_numVertices];
- memcpy(curNewPart->m_vertices3f,curPart->m_vertices3f,sizeof(btVector3FloatData) * curNewPart->m_numVertices);
+ memcpy(curNewPart->m_vertices3f, curPart->m_vertices3f, sizeof(btVector3FloatData) * curNewPart->m_numVertices);
}
else
curNewPart->m_vertices3f = NULL;
- if(curPart->m_vertices3d)
+ if (curPart->m_vertices3d)
{
curNewPart->m_vertices3d = new btVector3DoubleData[curNewPart->m_numVertices];
- memcpy(curNewPart->m_vertices3d,curPart->m_vertices3d,sizeof(btVector3DoubleData) * curNewPart->m_numVertices);
+ memcpy(curNewPart->m_vertices3d, curPart->m_vertices3d, sizeof(btVector3DoubleData) * curNewPart->m_numVertices);
}
else
curNewPart->m_vertices3d = NULL;
@@ -803,63 +760,60 @@ btStridingMeshInterfaceData* btCollisionWorldImporter::createStridingMeshInterfa
int numIndices = curNewPart->m_numTriangles * 3;
///the m_3indices8 was not initialized in some Bullet versions, this can cause crashes at loading time
///we catch it by only dealing with m_3indices8 if none of the other indices are initialized
- bool uninitialized3indices8Workaround =false;
+ bool uninitialized3indices8Workaround = false;
- if(curPart->m_indices32)
+ if (curPart->m_indices32)
{
- uninitialized3indices8Workaround=true;
+ uninitialized3indices8Workaround = true;
curNewPart->m_indices32 = new btIntIndexData[numIndices];
- memcpy(curNewPart->m_indices32,curPart->m_indices32,sizeof(btIntIndexData) * numIndices);
+ memcpy(curNewPart->m_indices32, curPart->m_indices32, sizeof(btIntIndexData) * numIndices);
}
else
curNewPart->m_indices32 = NULL;
- if(curPart->m_3indices16)
+ if (curPart->m_3indices16)
{
- uninitialized3indices8Workaround=true;
+ uninitialized3indices8Workaround = true;
curNewPart->m_3indices16 = new btShortIntIndexTripletData[curNewPart->m_numTriangles];
- memcpy(curNewPart->m_3indices16,curPart->m_3indices16,sizeof(btShortIntIndexTripletData) * curNewPart->m_numTriangles);
+ memcpy(curNewPart->m_3indices16, curPart->m_3indices16, sizeof(btShortIntIndexTripletData) * curNewPart->m_numTriangles);
}
else
curNewPart->m_3indices16 = NULL;
- if(curPart->m_indices16)
+ if (curPart->m_indices16)
{
- uninitialized3indices8Workaround=true;
+ uninitialized3indices8Workaround = true;
curNewPart->m_indices16 = new btShortIntIndexData[numIndices];
- memcpy(curNewPart->m_indices16,curPart->m_indices16,sizeof(btShortIntIndexData) * numIndices);
+ memcpy(curNewPart->m_indices16, curPart->m_indices16, sizeof(btShortIntIndexData) * numIndices);
}
else
curNewPart->m_indices16 = NULL;
- if(!uninitialized3indices8Workaround && curPart->m_3indices8)
+ if (!uninitialized3indices8Workaround && curPart->m_3indices8)
{
curNewPart->m_3indices8 = new btCharIndexTripletData[curNewPart->m_numTriangles];
- memcpy(curNewPart->m_3indices8,curPart->m_3indices8,sizeof(btCharIndexTripletData) * curNewPart->m_numTriangles);
+ memcpy(curNewPart->m_3indices8, curPart->m_3indices8, sizeof(btCharIndexTripletData) * curNewPart->m_numTriangles);
}
else
curNewPart->m_3indices8 = NULL;
-
}
m_allocatedbtStridingMeshInterfaceDatas.push_back(newData);
- return(newData);
+ return (newData);
}
#ifdef USE_INTERNAL_EDGE_UTILITY
-extern ContactAddedCallback gContactAddedCallback;
+extern ContactAddedCallback gContactAddedCallback;
-static bool btAdjustInternalEdgeContactsCallback(btManifoldPoint& cp, const btCollisionObject* colObj0,int partId0,int index0,const btCollisionObject* colObj1,int partId1,int index1)
+static bool btAdjustInternalEdgeContactsCallback(btManifoldPoint& cp, const btCollisionObject* colObj0, int partId0, int index0, const btCollisionObject* colObj1, int partId1, int index1)
{
-
- btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1);
- //btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1, BT_TRIANGLE_CONVEX_BACKFACE_MODE);
- //btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1, BT_TRIANGLE_CONVEX_DOUBLE_SIDED+BT_TRIANGLE_CONCAVE_DOUBLE_SIDED);
+ btAdjustInternalEdgeContacts(cp, colObj1, colObj0, partId1, index1);
+ //btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1, BT_TRIANGLE_CONVEX_BACKFACE_MODE);
+ //btAdjustInternalEdgeContacts(cp,colObj1,colObj0, partId1,index1, BT_TRIANGLE_CONVEX_DOUBLE_SIDED+BT_TRIANGLE_CONCAVE_DOUBLE_SIDED);
return true;
}
-#endif //USE_INTERNAL_EDGE_UTILITY
-
+#endif //USE_INTERNAL_EDGE_UTILITY
/*
btRigidBody* btWorldImporter::createRigidBody(bool isDynamic, btScalar mass, const btTransform& startTransform,btCollisionShape* shape,const char* bodyName)
@@ -898,29 +852,27 @@ btCollisionObject* btCollisionWorldImporter::getCollisionObjectByName(const char
return 0;
}
-btCollisionObject* btCollisionWorldImporter::createCollisionObject(const btTransform& startTransform,btCollisionShape* shape, const char* bodyName)
+btCollisionObject* btCollisionWorldImporter::createCollisionObject(const btTransform& startTransform, btCollisionShape* shape, const char* bodyName)
{
btCollisionObject* colObj = new btCollisionObject();
colObj->setWorldTransform(startTransform);
colObj->setCollisionShape(shape);
- m_collisionWorld->addCollisionObject(colObj);//todo: flags etc
+ m_collisionWorld->addCollisionObject(colObj); //todo: flags etc
if (bodyName)
{
char* newname = duplicateName(bodyName);
- m_objectNameMap.insert(colObj,newname);
- m_nameColObjMap.insert(newname,colObj);
+ m_objectNameMap.insert(colObj, newname);
+ m_nameColObjMap.insert(newname, colObj);
}
m_allocatedCollisionObjects.push_back(colObj);
return colObj;
}
-
-
-btCollisionShape* btCollisionWorldImporter::createPlaneShape(const btVector3& planeNormal,btScalar planeConstant)
+btCollisionShape* btCollisionWorldImporter::createPlaneShape(const btVector3& planeNormal, btScalar planeConstant)
{
- btStaticPlaneShape* shape = new btStaticPlaneShape(planeNormal,planeConstant);
+ btStaticPlaneShape* shape = new btStaticPlaneShape(planeNormal, planeConstant);
m_allocatedCollisionShapes.push_back(shape);
return shape;
}
@@ -937,85 +889,83 @@ btCollisionShape* btCollisionWorldImporter::createSphereShape(btScalar radius)
return shape;
}
-
btCollisionShape* btCollisionWorldImporter::createCapsuleShapeX(btScalar radius, btScalar height)
{
- btCapsuleShapeX* shape = new btCapsuleShapeX(radius,height);
+ btCapsuleShapeX* shape = new btCapsuleShapeX(radius, height);
m_allocatedCollisionShapes.push_back(shape);
return shape;
}
btCollisionShape* btCollisionWorldImporter::createCapsuleShapeY(btScalar radius, btScalar height)
{
- btCapsuleShape* shape = new btCapsuleShape(radius,height);
+ btCapsuleShape* shape = new btCapsuleShape(radius, height);
m_allocatedCollisionShapes.push_back(shape);
return shape;
}
btCollisionShape* btCollisionWorldImporter::createCapsuleShapeZ(btScalar radius, btScalar height)
{
- btCapsuleShapeZ* shape = new btCapsuleShapeZ(radius,height);
+ btCapsuleShapeZ* shape = new btCapsuleShapeZ(radius, height);
m_allocatedCollisionShapes.push_back(shape);
return shape;
}
-btCollisionShape* btCollisionWorldImporter::createCylinderShapeX(btScalar radius,btScalar height)
+btCollisionShape* btCollisionWorldImporter::createCylinderShapeX(btScalar radius, btScalar height)
{
- btCylinderShapeX* shape = new btCylinderShapeX(btVector3(height,radius,radius));
+ btCylinderShapeX* shape = new btCylinderShapeX(btVector3(height, radius, radius));
m_allocatedCollisionShapes.push_back(shape);
return shape;
}
-btCollisionShape* btCollisionWorldImporter::createCylinderShapeY(btScalar radius,btScalar height)
+btCollisionShape* btCollisionWorldImporter::createCylinderShapeY(btScalar radius, btScalar height)
{
- btCylinderShape* shape = new btCylinderShape(btVector3(radius,height,radius));
+ btCylinderShape* shape = new btCylinderShape(btVector3(radius, height, radius));
m_allocatedCollisionShapes.push_back(shape);
return shape;
}
-btCollisionShape* btCollisionWorldImporter::createCylinderShapeZ(btScalar radius,btScalar height)
+btCollisionShape* btCollisionWorldImporter::createCylinderShapeZ(btScalar radius, btScalar height)
{
- btCylinderShapeZ* shape = new btCylinderShapeZ(btVector3(radius,radius,height));
+ btCylinderShapeZ* shape = new btCylinderShapeZ(btVector3(radius, radius, height));
m_allocatedCollisionShapes.push_back(shape);
return shape;
}
-btCollisionShape* btCollisionWorldImporter::createConeShapeX(btScalar radius,btScalar height)
+btCollisionShape* btCollisionWorldImporter::createConeShapeX(btScalar radius, btScalar height)
{
- btConeShapeX* shape = new btConeShapeX(radius,height);
+ btConeShapeX* shape = new btConeShapeX(radius, height);
m_allocatedCollisionShapes.push_back(shape);
return shape;
}
-btCollisionShape* btCollisionWorldImporter::createConeShapeY(btScalar radius,btScalar height)
+btCollisionShape* btCollisionWorldImporter::createConeShapeY(btScalar radius, btScalar height)
{
- btConeShape* shape = new btConeShape(radius,height);
+ btConeShape* shape = new btConeShape(radius, height);
m_allocatedCollisionShapes.push_back(shape);
return shape;
}
-btCollisionShape* btCollisionWorldImporter::createConeShapeZ(btScalar radius,btScalar height)
+btCollisionShape* btCollisionWorldImporter::createConeShapeZ(btScalar radius, btScalar height)
{
- btConeShapeZ* shape = new btConeShapeZ(radius,height);
+ btConeShapeZ* shape = new btConeShapeZ(radius, height);
m_allocatedCollisionShapes.push_back(shape);
return shape;
}
-btTriangleIndexVertexArray* btCollisionWorldImporter::createTriangleMeshContainer()
+btTriangleIndexVertexArray* btCollisionWorldImporter::createTriangleMeshContainer()
{
btTriangleIndexVertexArray* in = new btTriangleIndexVertexArray();
m_allocatedTriangleIndexArrays.push_back(in);
return in;
}
-btOptimizedBvh* btCollisionWorldImporter::createOptimizedBvh()
+btOptimizedBvh* btCollisionWorldImporter::createOptimizedBvh()
{
btOptimizedBvh* bvh = new btOptimizedBvh();
m_allocatedBvhs.push_back(bvh);
return bvh;
}
-
btTriangleInfoMap* btCollisionWorldImporter::createTriangleInfoMap()
{
btTriangleInfoMap* tim = new btTriangleInfoMap();
@@ -1027,16 +977,15 @@ btBvhTriangleMeshShape* btCollisionWorldImporter::createBvhTriangleMeshShape(btS
{
if (bvh)
{
- btBvhTriangleMeshShape* bvhTriMesh = new btBvhTriangleMeshShape(trimesh,bvh->isQuantized(), false);
+ btBvhTriangleMeshShape* bvhTriMesh = new btBvhTriangleMeshShape(trimesh, bvh->isQuantized(), false);
bvhTriMesh->setOptimizedBvh(bvh);
m_allocatedCollisionShapes.push_back(bvhTriMesh);
return bvhTriMesh;
}
- btBvhTriangleMeshShape* ts = new btBvhTriangleMeshShape(trimesh,true);
+ btBvhTriangleMeshShape* ts = new btBvhTriangleMeshShape(trimesh, true);
m_allocatedCollisionShapes.push_back(ts);
return ts;
-
}
btCollisionShape* btCollisionWorldImporter::createConvexTriangleMeshShape(btStridingMeshInterface* trimesh)
{
@@ -1048,9 +997,8 @@ btGImpactMeshShape* btCollisionWorldImporter::createGimpactShape(btStridingMeshI
btGImpactMeshShape* shape = new btGImpactMeshShape(trimesh);
m_allocatedCollisionShapes.push_back(shape);
return shape;
-
}
-#endif //SUPPORT_GIMPACT_SHAPE_IMPORT
+#endif //SUPPORT_GIMPACT_SHAPE_IMPORT
btConvexHullShape* btCollisionWorldImporter::createConvexHullShape()
{
@@ -1066,25 +1014,22 @@ btCompoundShape* btCollisionWorldImporter::createCompoundShape()
return shape;
}
-
-btScaledBvhTriangleMeshShape* btCollisionWorldImporter::createScaledTrangleMeshShape(btBvhTriangleMeshShape* meshShape,const btVector3& localScaling)
+btScaledBvhTriangleMeshShape* btCollisionWorldImporter::createScaledTrangleMeshShape(btBvhTriangleMeshShape* meshShape, const btVector3& localScaling)
{
- btScaledBvhTriangleMeshShape* shape = new btScaledBvhTriangleMeshShape(meshShape,localScaling);
+ btScaledBvhTriangleMeshShape* shape = new btScaledBvhTriangleMeshShape(meshShape, localScaling);
m_allocatedCollisionShapes.push_back(shape);
return shape;
}
-btMultiSphereShape* btCollisionWorldImporter::createMultiSphereShape(const btVector3* positions,const btScalar* radi,int numSpheres)
+btMultiSphereShape* btCollisionWorldImporter::createMultiSphereShape(const btVector3* positions, const btScalar* radi, int numSpheres)
{
btMultiSphereShape* shape = new btMultiSphereShape(positions, radi, numSpheres);
m_allocatedCollisionShapes.push_back(shape);
return shape;
}
-
-
- // query for data
-int btCollisionWorldImporter::getNumCollisionShapes() const
+// query for data
+int btCollisionWorldImporter::getNumCollisionShapes() const
{
return m_allocatedCollisionShapes.size();
}
@@ -1097,23 +1042,21 @@ btCollisionShape* btCollisionWorldImporter::getCollisionShapeByIndex(int index)
btCollisionShape* btCollisionWorldImporter::getCollisionShapeByName(const char* name)
{
btCollisionShape** shapePtr = m_nameShapeMap.find(name);
- if (shapePtr&& *shapePtr)
+ if (shapePtr && *shapePtr)
{
return *shapePtr;
}
return 0;
}
-
-const char* btCollisionWorldImporter::getNameForPointer(const void* ptr) const
+const char* btCollisionWorldImporter::getNameForPointer(const void* ptr) const
{
- const char*const * namePtr = m_objectNameMap.find(ptr);
+ const char* const* namePtr = m_objectNameMap.find(ptr);
if (namePtr && *namePtr)
return *namePtr;
return 0;
}
-
int btCollisionWorldImporter::getNumRigidBodies() const
{
return m_allocatedRigidBodies.size();
@@ -1124,12 +1067,11 @@ btCollisionObject* btCollisionWorldImporter::getRigidBodyByIndex(int index) cons
return m_allocatedRigidBodies[index];
}
-
int btCollisionWorldImporter::getNumBvhs() const
{
return m_allocatedBvhs.size();
}
- btOptimizedBvh* btCollisionWorldImporter::getBvhByIndex(int index) const
+btOptimizedBvh* btCollisionWorldImporter::getBvhByIndex(int index) const
{
return m_allocatedBvhs[index];
}
@@ -1143,5 +1085,3 @@ btTriangleInfoMap* btCollisionWorldImporter::getTriangleInfoMapByIndex(int index
{
return m_allocatedTriangleInfoMaps[index];
}
-
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionWorldImporter.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionWorldImporter.h
index 81c6142726..5e8bc95341 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionWorldImporter.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCollisionWorldImporter.h
@@ -13,7 +13,6 @@ subject to the following restrictions:
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
@@ -26,7 +25,6 @@ class btCollisionShape;
class btCollisionObject;
struct btBulletSerializedArrays;
-
struct ConstraintInput;
class btCollisionWorld;
struct btCollisionShapeData;
@@ -46,9 +44,6 @@ class btSliderConstraint;
class btGearConstraint;
struct btContactSolverInfo;
-
-
-
class btCollisionWorldImporter
{
protected:
@@ -56,60 +51,53 @@ protected:
int m_verboseMode;
- btAlignedObjectArray<btCollisionShape*> m_allocatedCollisionShapes;
+ btAlignedObjectArray<btCollisionShape*> m_allocatedCollisionShapes;
btAlignedObjectArray<btCollisionObject*> m_allocatedRigidBodies;
- btAlignedObjectArray<btOptimizedBvh*> m_allocatedBvhs;
+ btAlignedObjectArray<btOptimizedBvh*> m_allocatedBvhs;
btAlignedObjectArray<btTriangleInfoMap*> m_allocatedTriangleInfoMaps;
btAlignedObjectArray<btTriangleIndexVertexArray*> m_allocatedTriangleIndexArrays;
btAlignedObjectArray<btStridingMeshInterfaceData*> m_allocatedbtStridingMeshInterfaceDatas;
btAlignedObjectArray<btCollisionObject*> m_allocatedCollisionObjects;
+ btAlignedObjectArray<char*> m_allocatedNames;
- btAlignedObjectArray<char*> m_allocatedNames;
+ btAlignedObjectArray<int*> m_indexArrays;
+ btAlignedObjectArray<short int*> m_shortIndexArrays;
+ btAlignedObjectArray<unsigned char*> m_charIndexArrays;
- btAlignedObjectArray<int*> m_indexArrays;
- btAlignedObjectArray<short int*> m_shortIndexArrays;
- btAlignedObjectArray<unsigned char*> m_charIndexArrays;
+ btAlignedObjectArray<btVector3FloatData*> m_floatVertexArrays;
+ btAlignedObjectArray<btVector3DoubleData*> m_doubleVertexArrays;
- btAlignedObjectArray<btVector3FloatData*> m_floatVertexArrays;
- btAlignedObjectArray<btVector3DoubleData*> m_doubleVertexArrays;
+ btHashMap<btHashPtr, btOptimizedBvh*> m_bvhMap;
+ btHashMap<btHashPtr, btTriangleInfoMap*> m_timMap;
+ btHashMap<btHashString, btCollisionShape*> m_nameShapeMap;
+ btHashMap<btHashString, btCollisionObject*> m_nameColObjMap;
- btHashMap<btHashPtr,btOptimizedBvh*> m_bvhMap;
- btHashMap<btHashPtr,btTriangleInfoMap*> m_timMap;
-
- btHashMap<btHashString,btCollisionShape*> m_nameShapeMap;
- btHashMap<btHashString,btCollisionObject*> m_nameColObjMap;
-
- btHashMap<btHashPtr,const char*> m_objectNameMap;
-
- btHashMap<btHashPtr,btCollisionShape*> m_shapeMap;
- btHashMap<btHashPtr,btCollisionObject*> m_bodyMap;
+ btHashMap<btHashPtr, const char*> m_objectNameMap;
+ btHashMap<btHashPtr, btCollisionShape*> m_shapeMap;
+ btHashMap<btHashPtr, btCollisionObject*> m_bodyMap;
//methods
+ char* duplicateName(const char* name);
-
- char* duplicateName(const char* name);
-
- btCollisionShape* convertCollisionShape( btCollisionShapeData* shapeData );
-
+ btCollisionShape* convertCollisionShape(btCollisionShapeData* shapeData);
public:
-
btCollisionWorldImporter(btCollisionWorld* world);
virtual ~btCollisionWorldImporter();
- bool convertAllObjects( btBulletSerializedArrays* arrays);
+ bool convertAllObjects(btBulletSerializedArrays* arrays);
- ///delete all memory collision shapes, rigid bodies, constraints etc. allocated during the load.
+ ///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)
+ void setVerboseMode(int verboseMode)
{
m_verboseMode = verboseMode;
}
@@ -119,14 +107,14 @@ public:
return m_verboseMode;
}
- // query for data
- int getNumCollisionShapes() const;
+ // 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;
+ btOptimizedBvh* getBvhByIndex(int index) const;
int getNumTriangleInfoMaps() const;
btTriangleInfoMap* getTriangleInfoMapByIndex(int index) const;
@@ -134,56 +122,48 @@ public:
btCollisionShape* getCollisionShapeByName(const char* name);
btCollisionObject* getCollisionObjectByName(const char* name);
-
- const char* getNameForPointer(const void* ptr) const;
+ 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);
+ virtual btCollisionObject* createCollisionObject(const btTransform& startTransform, btCollisionShape* shape, const char* bodyName);
///shapes
- virtual btCollisionShape* createPlaneShape(const btVector3& planeNormal,btScalar planeConstant);
+ 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* 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
+#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 btScaledBvhTriangleMeshShape* createScaledTrangleMeshShape(btBvhTriangleMeshShape* meshShape, const btVector3& localScalingbtBvhTriangleMeshShape);
- virtual class btMultiSphereShape* createMultiSphereShape(const btVector3* positions,const btScalar* radi,int numSpheres);
+ 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 btOptimizedBvh* createOptimizedBvh();
virtual btTriangleInfoMap* createTriangleInfoMap();
-
-
-
-
};
-
-#endif //BT_WORLD_IMPORTER_H
+#endif //BT_WORLD_IMPORTER_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp
index 91b7809c17..633bee4825 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp
@@ -25,62 +25,58 @@ subject to the following restrictions:
btShapePairCallback gCompoundChildShapePairCallback = 0;
-btCompoundCollisionAlgorithm::btCompoundCollisionAlgorithm( const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,bool isSwapped)
-:btActivatingCollisionAlgorithm(ci,body0Wrap,body1Wrap),
-m_isSwapped(isSwapped),
-m_sharedManifold(ci.m_manifold)
+btCompoundCollisionAlgorithm::btCompoundCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, bool isSwapped)
+ : btActivatingCollisionAlgorithm(ci, body0Wrap, body1Wrap),
+ m_isSwapped(isSwapped),
+ m_sharedManifold(ci.m_manifold)
{
m_ownsManifold = false;
- const btCollisionObjectWrapper* colObjWrap = m_isSwapped? body1Wrap : body0Wrap;
- btAssert (colObjWrap->getCollisionShape()->isCompound());
-
+ const btCollisionObjectWrapper* colObjWrap = m_isSwapped ? body1Wrap : body0Wrap;
+ btAssert(colObjWrap->getCollisionShape()->isCompound());
+
const btCompoundShape* compoundShape = static_cast<const btCompoundShape*>(colObjWrap->getCollisionShape());
m_compoundShapeRevision = compoundShape->getUpdateRevision();
-
-
- preallocateChildAlgorithms(body0Wrap,body1Wrap);
+
+ preallocateChildAlgorithms(body0Wrap, body1Wrap);
}
-void btCompoundCollisionAlgorithm::preallocateChildAlgorithms(const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap)
+void btCompoundCollisionAlgorithm::preallocateChildAlgorithms(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap)
{
- const btCollisionObjectWrapper* colObjWrap = m_isSwapped? body1Wrap : body0Wrap;
- const btCollisionObjectWrapper* otherObjWrap = m_isSwapped? body0Wrap : body1Wrap;
- btAssert (colObjWrap->getCollisionShape()->isCompound());
-
+ const btCollisionObjectWrapper* colObjWrap = m_isSwapped ? body1Wrap : body0Wrap;
+ const btCollisionObjectWrapper* otherObjWrap = m_isSwapped ? body0Wrap : body1Wrap;
+ btAssert(colObjWrap->getCollisionShape()->isCompound());
+
const btCompoundShape* compoundShape = static_cast<const btCompoundShape*>(colObjWrap->getCollisionShape());
int numChildren = compoundShape->getNumChildShapes();
int i;
-
+
m_childCollisionAlgorithms.resize(numChildren);
- for (i=0;i<numChildren;i++)
+ for (i = 0; i < numChildren; i++)
{
if (compoundShape->getDynamicAabbTree())
{
m_childCollisionAlgorithms[i] = 0;
- } else
+ }
+ else
{
-
const btCollisionShape* childShape = compoundShape->getChildShape(i);
- btCollisionObjectWrapper childWrap(colObjWrap,childShape,colObjWrap->getCollisionObject(),colObjWrap->getWorldTransform(),-1,i);//wrong child trans, but unused (hopefully)
- m_childCollisionAlgorithms[i] = m_dispatcher->findAlgorithm(&childWrap,otherObjWrap,m_sharedManifold, BT_CONTACT_POINT_ALGORITHMS);
-
+ btCollisionObjectWrapper childWrap(colObjWrap, childShape, colObjWrap->getCollisionObject(), colObjWrap->getWorldTransform(), -1, i); //wrong child trans, but unused (hopefully)
+ m_childCollisionAlgorithms[i] = m_dispatcher->findAlgorithm(&childWrap, otherObjWrap, m_sharedManifold, BT_CONTACT_POINT_ALGORITHMS);
btAlignedObjectArray<btCollisionAlgorithm*> m_childCollisionAlgorithmsContact;
btAlignedObjectArray<btCollisionAlgorithm*> m_childCollisionAlgorithmsClosestPoints;
-
-
}
}
}
-void btCompoundCollisionAlgorithm::removeChildAlgorithms()
+void btCompoundCollisionAlgorithm::removeChildAlgorithms()
{
int numChildren = m_childCollisionAlgorithms.size();
int i;
- for (i=0;i<numChildren;i++)
+ for (i = 0; i < numChildren; i++)
{
if (m_childCollisionAlgorithms[i])
{
@@ -95,66 +91,56 @@ btCompoundCollisionAlgorithm::~btCompoundCollisionAlgorithm()
removeChildAlgorithms();
}
-
-
-
-struct btCompoundLeafCallback : btDbvt::ICollide
+struct btCompoundLeafCallback : btDbvt::ICollide
{
-
public:
-
const btCollisionObjectWrapper* m_compoundColObjWrap;
const btCollisionObjectWrapper* m_otherObjWrap;
btDispatcher* m_dispatcher;
const btDispatcherInfo& m_dispatchInfo;
- btManifoldResult* m_resultOut;
- btCollisionAlgorithm** m_childCollisionAlgorithms;
- btPersistentManifold* m_sharedManifold;
-
- btCompoundLeafCallback (const btCollisionObjectWrapper* compoundObjWrap,const btCollisionObjectWrapper* otherObjWrap,btDispatcher* dispatcher,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut,btCollisionAlgorithm** childCollisionAlgorithms,btPersistentManifold* sharedManifold)
- :m_compoundColObjWrap(compoundObjWrap),m_otherObjWrap(otherObjWrap),m_dispatcher(dispatcher),m_dispatchInfo(dispatchInfo),m_resultOut(resultOut),
- m_childCollisionAlgorithms(childCollisionAlgorithms),
- m_sharedManifold(sharedManifold)
- {
+ btManifoldResult* m_resultOut;
+ btCollisionAlgorithm** m_childCollisionAlgorithms;
+ btPersistentManifold* m_sharedManifold;
+ btCompoundLeafCallback(const btCollisionObjectWrapper* compoundObjWrap, const btCollisionObjectWrapper* otherObjWrap, btDispatcher* dispatcher, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut, btCollisionAlgorithm** childCollisionAlgorithms, btPersistentManifold* sharedManifold)
+ : m_compoundColObjWrap(compoundObjWrap), m_otherObjWrap(otherObjWrap), m_dispatcher(dispatcher), m_dispatchInfo(dispatchInfo), m_resultOut(resultOut), m_childCollisionAlgorithms(childCollisionAlgorithms), m_sharedManifold(sharedManifold)
+ {
}
-
- void ProcessChildShape(const btCollisionShape* childShape,int index)
+ void ProcessChildShape(const btCollisionShape* childShape, int index)
{
- btAssert(index>=0);
+ btAssert(index >= 0);
const btCompoundShape* compoundShape = static_cast<const btCompoundShape*>(m_compoundColObjWrap->getCollisionShape());
- btAssert(index<compoundShape->getNumChildShapes());
+ btAssert(index < compoundShape->getNumChildShapes());
+ if (gCompoundChildShapePairCallback)
+ {
+ if (!gCompoundChildShapePairCallback(m_otherObjWrap->getCollisionShape(), childShape))
+ return;
+ }
//backup
- btTransform orgTrans = m_compoundColObjWrap->getWorldTransform();
-
+ btTransform orgTrans = m_compoundColObjWrap->getWorldTransform();
+
const btTransform& childTrans = compoundShape->getChildTransform(index);
- btTransform newChildWorldTrans = orgTrans*childTrans ;
+ btTransform newChildWorldTrans = orgTrans * childTrans;
//perform an AABB check first
- btVector3 aabbMin0,aabbMax0;
- childShape->getAabb(newChildWorldTrans,aabbMin0,aabbMax0);
+ btVector3 aabbMin0, aabbMax0;
+ childShape->getAabb(newChildWorldTrans, aabbMin0, aabbMax0);
btVector3 extendAabb(m_resultOut->m_closestPointDistanceThreshold, m_resultOut->m_closestPointDistanceThreshold, m_resultOut->m_closestPointDistanceThreshold);
aabbMin0 -= extendAabb;
aabbMax0 += extendAabb;
btVector3 aabbMin1, aabbMax1;
- m_otherObjWrap->getCollisionShape()->getAabb(m_otherObjWrap->getWorldTransform(),aabbMin1,aabbMax1);
+ m_otherObjWrap->getCollisionShape()->getAabb(m_otherObjWrap->getWorldTransform(), aabbMin1, aabbMax1);
- if (gCompoundChildShapePairCallback)
- {
- if (!gCompoundChildShapePairCallback(m_otherObjWrap->getCollisionShape(), childShape))
- return;
- }
- if (TestAabbAgainstAabb2(aabbMin0,aabbMax0,aabbMin1,aabbMax1))
+ if (TestAabbAgainstAabb2(aabbMin0, aabbMax0, aabbMin1, aabbMax1))
{
+ btCollisionObjectWrapper compoundWrap(this->m_compoundColObjWrap, childShape, m_compoundColObjWrap->getCollisionObject(), newChildWorldTrans, -1, index);
- btCollisionObjectWrapper compoundWrap(this->m_compoundColObjWrap,childShape,m_compoundColObjWrap->getCollisionObject(),newChildWorldTrans,-1,index);
-
btCollisionAlgorithm* algo = 0;
bool allocatedAlgorithm = false;
@@ -172,7 +158,7 @@ public:
}
algo = m_childCollisionAlgorithms[index];
}
-
+
const btCollisionObjectWrapper* tmpWrap = 0;
///detect swapping case
@@ -180,15 +166,16 @@ public:
{
tmpWrap = m_resultOut->getBody0Wrap();
m_resultOut->setBody0Wrap(&compoundWrap);
- m_resultOut->setShapeIdentifiersA(-1,index);
- } else
+ m_resultOut->setShapeIdentifiersA(-1, index);
+ }
+ else
{
tmpWrap = m_resultOut->getBody1Wrap();
m_resultOut->setBody1Wrap(&compoundWrap);
- m_resultOut->setShapeIdentifiersB(-1,index);
+ m_resultOut->setShapeIdentifiersB(-1, index);
}
- algo->processCollision(&compoundWrap,m_otherObjWrap,m_dispatchInfo,m_resultOut);
+ algo->processCollision(&compoundWrap, m_otherObjWrap, m_dispatchInfo, m_resultOut);
#if 0
if (m_dispatchInfo.m_debugDraw && (m_dispatchInfo.m_debugDraw->getDebugMode() & btIDebugDraw::DBG_DrawAabb))
@@ -202,18 +189,19 @@ public:
if (m_resultOut->getBody0Internal() == m_compoundColObjWrap->getCollisionObject())
{
m_resultOut->setBody0Wrap(tmpWrap);
- } else
+ }
+ else
{
m_resultOut->setBody1Wrap(tmpWrap);
}
- if(allocatedAlgorithm)
+ if (allocatedAlgorithm)
{
algo->~btCollisionAlgorithm();
m_dispatcher->freeCollisionAlgorithm(algo);
- }
+ }
}
}
- void Process(const btDbvtNode* leaf)
+ void Process(const btDbvtNode* leaf)
{
int index = leaf->dataAsInt;
@@ -230,22 +218,16 @@ public:
}
#endif
- ProcessChildShape(childShape,index);
-
+ ProcessChildShape(childShape, index);
}
};
-
-
-
-
-
-void btCompoundCollisionAlgorithm::processCollision (const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+void btCompoundCollisionAlgorithm::processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
- const btCollisionObjectWrapper* colObjWrap = m_isSwapped? body1Wrap : body0Wrap;
- const btCollisionObjectWrapper* otherObjWrap = m_isSwapped? body0Wrap : body1Wrap;
+ const btCollisionObjectWrapper* colObjWrap = m_isSwapped ? body1Wrap : body0Wrap;
+ const btCollisionObjectWrapper* otherObjWrap = m_isSwapped ? body0Wrap : body1Wrap;
- btAssert (colObjWrap->getCollisionShape()->isCompound());
+ btAssert(colObjWrap->getCollisionShape()->isCompound());
const btCompoundShape* compoundShape = static_cast<const btCompoundShape*>(colObjWrap->getCollisionShape());
///btCompoundShape might have changed:
@@ -254,17 +236,17 @@ void btCompoundCollisionAlgorithm::processCollision (const btCollisionObjectWrap
{
///clear and update all
removeChildAlgorithms();
-
- preallocateChildAlgorithms(body0Wrap,body1Wrap);
+
+ preallocateChildAlgorithms(body0Wrap, body1Wrap);
m_compoundShapeRevision = compoundShape->getUpdateRevision();
}
- if (m_childCollisionAlgorithms.size()==0)
+ if (m_childCollisionAlgorithms.size() == 0)
return;
const btDbvt* tree = compoundShape->getDynamicAabbTree();
//use a dynamic aabb tree to cull potential child-overlaps
- btCompoundLeafCallback callback(colObjWrap,otherObjWrap,m_dispatcher,dispatchInfo,resultOut,&m_childCollisionAlgorithms[0],m_sharedManifold);
+ btCompoundLeafCallback callback(colObjWrap, otherObjWrap, m_dispatcher, dispatchInfo, resultOut, &m_childCollisionAlgorithms[0], m_sharedManifold);
///we need to refresh all contact manifolds
///note that we should actually recursively traverse all children, btCompoundShape can nested more then 1 level deep
@@ -272,18 +254,18 @@ void btCompoundCollisionAlgorithm::processCollision (const btCollisionObjectWrap
{
int i;
manifoldArray.resize(0);
- for (i=0;i<m_childCollisionAlgorithms.size();i++)
+ for (i = 0; i < m_childCollisionAlgorithms.size(); i++)
{
if (m_childCollisionAlgorithms[i])
{
m_childCollisionAlgorithms[i]->getAllContactManifolds(manifoldArray);
- for (int m=0;m<manifoldArray.size();m++)
+ for (int m = 0; m < manifoldArray.size(); m++)
{
if (manifoldArray[m]->getNumContacts())
{
resultOut->setPersistentManifold(manifoldArray[m]);
resultOut->refreshContactPoints();
- resultOut->setPersistentManifold(0);//??necessary?
+ resultOut->setPersistentManifold(0); //??necessary?
}
}
manifoldArray.resize(0);
@@ -293,57 +275,56 @@ void btCompoundCollisionAlgorithm::processCollision (const btCollisionObjectWrap
if (tree)
{
-
- btVector3 localAabbMin,localAabbMax;
+ btVector3 localAabbMin, localAabbMax;
btTransform otherInCompoundSpace;
otherInCompoundSpace = colObjWrap->getWorldTransform().inverse() * otherObjWrap->getWorldTransform();
- otherObjWrap->getCollisionShape()->getAabb(otherInCompoundSpace,localAabbMin,localAabbMax);
+ otherObjWrap->getCollisionShape()->getAabb(otherInCompoundSpace, localAabbMin, localAabbMax);
btVector3 extraExtends(resultOut->m_closestPointDistanceThreshold, resultOut->m_closestPointDistanceThreshold, resultOut->m_closestPointDistanceThreshold);
localAabbMin -= extraExtends;
localAabbMax += extraExtends;
- const ATTRIBUTE_ALIGNED16(btDbvtVolume) bounds=btDbvtVolume::FromMM(localAabbMin,localAabbMax);
+ const ATTRIBUTE_ALIGNED16(btDbvtVolume) bounds = btDbvtVolume::FromMM(localAabbMin, localAabbMax);
//process all children, that overlap with the given AABB bounds
- tree->collideTVNoStackAlloc(tree->m_root,bounds,stack2,callback);
-
- } else
+ tree->collideTVNoStackAlloc(tree->m_root, bounds, stack2, callback);
+ }
+ else
{
//iterate over all children, perform an AABB check inside ProcessChildShape
int numChildren = m_childCollisionAlgorithms.size();
int i;
- for (i=0;i<numChildren;i++)
+ for (i = 0; i < numChildren; i++)
{
- callback.ProcessChildShape(compoundShape->getChildShape(i),i);
+ callback.ProcessChildShape(compoundShape->getChildShape(i), i);
}
}
{
- //iterate over all children, perform an AABB check inside ProcessChildShape
+ //iterate over all children, perform an AABB check inside ProcessChildShape
int numChildren = m_childCollisionAlgorithms.size();
int i;
manifoldArray.resize(0);
- const btCollisionShape* childShape = 0;
- btTransform orgTrans;
-
- btTransform newChildWorldTrans;
- btVector3 aabbMin0,aabbMax0,aabbMin1,aabbMax1;
-
- for (i=0;i<numChildren;i++)
+ const btCollisionShape* childShape = 0;
+ btTransform orgTrans;
+
+ btTransform newChildWorldTrans;
+ btVector3 aabbMin0, aabbMax0, aabbMin1, aabbMax1;
+
+ for (i = 0; i < numChildren; i++)
{
if (m_childCollisionAlgorithms[i])
{
childShape = compoundShape->getChildShape(i);
- //if not longer overlapping, remove the algorithm
+ //if not longer overlapping, remove the algorithm
orgTrans = colObjWrap->getWorldTransform();
-
+
const btTransform& childTrans = compoundShape->getChildTransform(i);
- newChildWorldTrans = orgTrans*childTrans ;
+ newChildWorldTrans = orgTrans * childTrans;
//perform an AABB check first
- childShape->getAabb(newChildWorldTrans,aabbMin0,aabbMax0);
- otherObjWrap->getCollisionShape()->getAabb(otherObjWrap->getWorldTransform(),aabbMin1,aabbMax1);
+ childShape->getAabb(newChildWorldTrans, aabbMin0, aabbMax0);
+ otherObjWrap->getCollisionShape()->getAabb(otherObjWrap->getWorldTransform(), aabbMin1, aabbMax1);
- if (!TestAabbAgainstAabb2(aabbMin0,aabbMax0,aabbMin1,aabbMax1))
+ if (!TestAabbAgainstAabb2(aabbMin0, aabbMax0, aabbMin1, aabbMax1))
{
m_childCollisionAlgorithms[i]->~btCollisionAlgorithm();
m_dispatcher->freeCollisionAlgorithm(m_childCollisionAlgorithms[i]);
@@ -354,15 +335,15 @@ void btCompoundCollisionAlgorithm::processCollision (const btCollisionObjectWrap
}
}
-btScalar btCompoundCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+btScalar btCompoundCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
btAssert(0);
//needs to be fixed, using btCollisionObjectWrapper and NOT modifying internal data structures
- btCollisionObject* colObj = m_isSwapped? body1 : body0;
- btCollisionObject* otherObj = m_isSwapped? body0 : body1;
+ btCollisionObject* colObj = m_isSwapped ? body1 : body0;
+ btCollisionObject* otherObj = m_isSwapped ? body0 : body1;
+
+ btAssert(colObj->getCollisionShape()->isCompound());
- btAssert (colObj->getCollisionShape()->isCompound());
-
btCompoundShape* compoundShape = static_cast<btCompoundShape*>(colObj->getCollisionShape());
//We will use the OptimizedBVH, AABB tree to cull potential child-overlaps
@@ -376,33 +357,29 @@ btScalar btCompoundCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject*
int numChildren = m_childCollisionAlgorithms.size();
int i;
- btTransform orgTrans;
- btScalar frac;
- for (i=0;i<numChildren;i++)
+ btTransform orgTrans;
+ btScalar frac;
+ for (i = 0; i < numChildren; i++)
{
//btCollisionShape* childShape = compoundShape->getChildShape(i);
//backup
- orgTrans = colObj->getWorldTransform();
-
+ orgTrans = colObj->getWorldTransform();
+
const btTransform& childTrans = compoundShape->getChildTransform(i);
//btTransform newChildWorldTrans = orgTrans*childTrans ;
- colObj->setWorldTransform( orgTrans*childTrans );
+ colObj->setWorldTransform(orgTrans * childTrans);
//btCollisionShape* tmpShape = colObj->getCollisionShape();
//colObj->internalSetTemporaryCollisionShape( childShape );
- frac = m_childCollisionAlgorithms[i]->calculateTimeOfImpact(colObj,otherObj,dispatchInfo,resultOut);
- if (frac<hitFraction)
+ frac = m_childCollisionAlgorithms[i]->calculateTimeOfImpact(colObj, otherObj, dispatchInfo, resultOut);
+ if (frac < hitFraction)
{
hitFraction = frac;
}
//revert back
//colObj->internalSetTemporaryCollisionShape( tmpShape);
- colObj->setWorldTransform( orgTrans);
+ colObj->setWorldTransform(orgTrans);
}
return hitFraction;
-
}
-
-
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h
index d2086fbc02..4ea5e77185 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h
@@ -35,7 +35,7 @@ typedef bool (*btShapePairCallback)(const btCollisionShape* pShape0, const btCol
extern btShapePairCallback gCompoundChildShapePairCallback;
/// btCompoundCollisionAlgorithm supports collision between CompoundCollisionShapes and other collision shapes
-class btCompoundCollisionAlgorithm : public btActivatingCollisionAlgorithm
+class btCompoundCollisionAlgorithm : public btActivatingCollisionAlgorithm
{
btNodeStack stack2;
btManifoldArray manifoldArray;
@@ -44,61 +44,56 @@ protected:
btAlignedObjectArray<btCollisionAlgorithm*> m_childCollisionAlgorithms;
bool m_isSwapped;
- class btPersistentManifold* m_sharedManifold;
- bool m_ownsManifold;
+ class btPersistentManifold* m_sharedManifold;
+ bool m_ownsManifold;
+ int m_compoundShapeRevision; //to keep track of changes, so that childAlgorithm array can be updated
- 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);
+ void removeChildAlgorithms();
-public:
+ void preallocateChildAlgorithms(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap);
- btCompoundCollisionAlgorithm( const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,bool isSwapped);
+public:
+ btCompoundCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, bool isSwapped);
virtual ~btCompoundCollisionAlgorithm();
- btCollisionAlgorithm* getChildAlgorithm (int n) const
+ btCollisionAlgorithm* getChildAlgorithm(int n) const
{
return m_childCollisionAlgorithms[n];
}
+ virtual void processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut);
- 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);
- btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
-
- virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
+ virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
{
int i;
- for (i=0;i<m_childCollisionAlgorithms.size();i++)
+ for (i = 0; i < m_childCollisionAlgorithms.size(); i++)
{
if (m_childCollisionAlgorithms[i])
m_childCollisionAlgorithms[i]->getAllContactManifolds(manifoldArray);
}
}
-
- struct CreateFunc :public btCollisionAlgorithmCreateFunc
+ struct CreateFunc : public btCollisionAlgorithmCreateFunc
{
- virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap)
+ 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);
+ return new (mem) btCompoundCollisionAlgorithm(ci, body0Wrap, body1Wrap, false);
}
};
- struct SwappedCreateFunc :public btCollisionAlgorithmCreateFunc
+ struct SwappedCreateFunc : public btCollisionAlgorithmCreateFunc
{
- virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap)
+ 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);
+ return new (mem) btCompoundCollisionAlgorithm(ci, body0Wrap, body1Wrap, true);
}
};
-
};
-#endif //BT_COMPOUND_COLLISION_ALGORITHM_H
+#endif //BT_COMPOUND_COLLISION_ALGORITHM_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCompoundCompoundCollisionAlgorithm.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCompoundCompoundCollisionAlgorithm.cpp
index 20b542f670..044b60dbb1 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCompoundCompoundCollisionAlgorithm.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCompoundCompoundCollisionAlgorithm.cpp
@@ -29,29 +29,25 @@ subject to the following restrictions:
btShapePairCallback gCompoundCompoundChildShapePairCallback = 0;
-btCompoundCompoundCollisionAlgorithm::btCompoundCompoundCollisionAlgorithm( const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,bool isSwapped)
-:btCompoundCollisionAlgorithm(ci,body0Wrap,body1Wrap,isSwapped)
+btCompoundCompoundCollisionAlgorithm::btCompoundCompoundCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, bool isSwapped)
+ : btCompoundCollisionAlgorithm(ci, body0Wrap, body1Wrap, isSwapped)
{
-
- void* ptr = btAlignedAlloc(sizeof(btHashedSimplePairCache),16);
- m_childCollisionAlgorithmCache= new(ptr) btHashedSimplePairCache();
+ void* ptr = btAlignedAlloc(sizeof(btHashedSimplePairCache), 16);
+ m_childCollisionAlgorithmCache = new (ptr) btHashedSimplePairCache();
const btCollisionObjectWrapper* col0ObjWrap = body0Wrap;
- btAssert (col0ObjWrap->getCollisionShape()->isCompound());
+ btAssert(col0ObjWrap->getCollisionShape()->isCompound());
const btCollisionObjectWrapper* col1ObjWrap = body1Wrap;
- btAssert (col1ObjWrap->getCollisionShape()->isCompound());
-
+ btAssert(col1ObjWrap->getCollisionShape()->isCompound());
+
const btCompoundShape* compoundShape0 = static_cast<const btCompoundShape*>(col0ObjWrap->getCollisionShape());
m_compoundShapeRevision0 = compoundShape0->getUpdateRevision();
const btCompoundShape* compoundShape1 = static_cast<const btCompoundShape*>(col1ObjWrap->getCollisionShape());
m_compoundShapeRevision1 = compoundShape1->getUpdateRevision();
-
-
}
-
btCompoundCompoundCollisionAlgorithm::~btCompoundCompoundCollisionAlgorithm()
{
removeChildAlgorithms();
@@ -59,32 +55,30 @@ btCompoundCompoundCollisionAlgorithm::~btCompoundCompoundCollisionAlgorithm()
btAlignedFree(m_childCollisionAlgorithmCache);
}
-void btCompoundCompoundCollisionAlgorithm::getAllContactManifolds(btManifoldArray& manifoldArray)
+void btCompoundCompoundCollisionAlgorithm::getAllContactManifolds(btManifoldArray& manifoldArray)
{
int i;
btSimplePairArray& pairs = m_childCollisionAlgorithmCache->getOverlappingPairArray();
- for (i=0;i<pairs.size();i++)
+ for (i = 0; i < pairs.size(); i++)
{
if (pairs[i].m_userPointer)
{
-
((btCollisionAlgorithm*)pairs[i].m_userPointer)->getAllContactManifolds(manifoldArray);
}
}
}
-
-void btCompoundCompoundCollisionAlgorithm::removeChildAlgorithms()
+void btCompoundCompoundCollisionAlgorithm::removeChildAlgorithms()
{
btSimplePairArray& pairs = m_childCollisionAlgorithmCache->getOverlappingPairArray();
int numChildren = pairs.size();
int i;
- for (i=0;i<numChildren;i++)
+ for (i = 0; i < numChildren; i++)
{
if (pairs[i].m_userPointer)
{
- btCollisionAlgorithm* algo = (btCollisionAlgorithm*) pairs[i].m_userPointer;
+ btCollisionAlgorithm* algo = (btCollisionAlgorithm*)pairs[i].m_userPointer;
algo->~btCollisionAlgorithm();
m_dispatcher->freeCollisionAlgorithm(algo);
}
@@ -92,77 +86,65 @@ void btCompoundCompoundCollisionAlgorithm::removeChildAlgorithms()
m_childCollisionAlgorithmCache->removeAllPairs();
}
-struct btCompoundCompoundLeafCallback : btDbvt::ICollide
+struct btCompoundCompoundLeafCallback : btDbvt::ICollide
{
int m_numOverlapPairs;
-
const btCollisionObjectWrapper* m_compound0ColObjWrap;
const btCollisionObjectWrapper* m_compound1ColObjWrap;
btDispatcher* m_dispatcher;
const btDispatcherInfo& m_dispatchInfo;
- btManifoldResult* m_resultOut;
-
-
- class btHashedSimplePairCache* m_childCollisionAlgorithmCache;
-
- btPersistentManifold* m_sharedManifold;
-
- btCompoundCompoundLeafCallback (const btCollisionObjectWrapper* compound1ObjWrap,
- const btCollisionObjectWrapper* compound0ObjWrap,
- btDispatcher* dispatcher,
- const btDispatcherInfo& dispatchInfo,
- btManifoldResult* resultOut,
- btHashedSimplePairCache* childAlgorithmsCache,
- btPersistentManifold* sharedManifold)
- :m_numOverlapPairs(0),m_compound0ColObjWrap(compound1ObjWrap),m_compound1ColObjWrap(compound0ObjWrap),m_dispatcher(dispatcher),m_dispatchInfo(dispatchInfo),m_resultOut(resultOut),
- m_childCollisionAlgorithmCache(childAlgorithmsCache),
- m_sharedManifold(sharedManifold)
- {
+ btManifoldResult* m_resultOut;
- }
+ class btHashedSimplePairCache* m_childCollisionAlgorithmCache;
+ btPersistentManifold* m_sharedManifold;
+ btCompoundCompoundLeafCallback(const btCollisionObjectWrapper* compound1ObjWrap,
+ const btCollisionObjectWrapper* compound0ObjWrap,
+ btDispatcher* dispatcher,
+ const btDispatcherInfo& dispatchInfo,
+ btManifoldResult* resultOut,
+ btHashedSimplePairCache* childAlgorithmsCache,
+ btPersistentManifold* sharedManifold)
+ : m_numOverlapPairs(0), m_compound0ColObjWrap(compound1ObjWrap), m_compound1ColObjWrap(compound0ObjWrap), m_dispatcher(dispatcher), m_dispatchInfo(dispatchInfo), m_resultOut(resultOut), m_childCollisionAlgorithmCache(childAlgorithmsCache), m_sharedManifold(sharedManifold)
+ {
+ }
-
- void Process(const btDbvtNode* leaf0,const btDbvtNode* leaf1)
+ void Process(const btDbvtNode* leaf0, const btDbvtNode* leaf1)
{
BT_PROFILE("btCompoundCompoundLeafCallback::Process");
m_numOverlapPairs++;
-
int childIndex0 = leaf0->dataAsInt;
int childIndex1 = leaf1->dataAsInt;
-
-
- btAssert(childIndex0>=0);
- btAssert(childIndex1>=0);
+ btAssert(childIndex0 >= 0);
+ btAssert(childIndex1 >= 0);
const btCompoundShape* compoundShape0 = static_cast<const btCompoundShape*>(m_compound0ColObjWrap->getCollisionShape());
- btAssert(childIndex0<compoundShape0->getNumChildShapes());
+ btAssert(childIndex0 < compoundShape0->getNumChildShapes());
const btCompoundShape* compoundShape1 = static_cast<const btCompoundShape*>(m_compound1ColObjWrap->getCollisionShape());
- btAssert(childIndex1<compoundShape1->getNumChildShapes());
+ btAssert(childIndex1 < compoundShape1->getNumChildShapes());
const btCollisionShape* childShape0 = compoundShape0->getChildShape(childIndex0);
const btCollisionShape* childShape1 = compoundShape1->getChildShape(childIndex1);
//backup
- btTransform orgTrans0 = m_compound0ColObjWrap->getWorldTransform();
+ btTransform orgTrans0 = m_compound0ColObjWrap->getWorldTransform();
const btTransform& childTrans0 = compoundShape0->getChildTransform(childIndex0);
- btTransform newChildWorldTrans0 = orgTrans0*childTrans0 ;
-
- btTransform orgTrans1 = m_compound1ColObjWrap->getWorldTransform();
+ btTransform newChildWorldTrans0 = orgTrans0 * childTrans0;
+
+ btTransform orgTrans1 = m_compound1ColObjWrap->getWorldTransform();
const btTransform& childTrans1 = compoundShape1->getChildTransform(childIndex1);
- btTransform newChildWorldTrans1 = orgTrans1*childTrans1 ;
-
+ btTransform newChildWorldTrans1 = orgTrans1 * childTrans1;
//perform an AABB check first
- btVector3 aabbMin0,aabbMax0,aabbMin1,aabbMax1;
- childShape0->getAabb(newChildWorldTrans0,aabbMin0,aabbMax0);
- childShape1->getAabb(newChildWorldTrans1,aabbMin1,aabbMax1);
-
+ btVector3 aabbMin0, aabbMax0, aabbMin1, aabbMax1;
+ childShape0->getAabb(newChildWorldTrans0, aabbMin0, aabbMax0);
+ childShape1->getAabb(newChildWorldTrans1, aabbMin1, aabbMax1);
+
btVector3 thresholdVec(m_resultOut->m_closestPointDistanceThreshold, m_resultOut->m_closestPointDistanceThreshold, m_resultOut->m_closestPointDistanceThreshold);
aabbMin0 -= thresholdVec;
@@ -170,17 +152,16 @@ struct btCompoundCompoundLeafCallback : btDbvt::ICollide
if (gCompoundCompoundChildShapePairCallback)
{
- if (!gCompoundCompoundChildShapePairCallback(childShape0,childShape1))
+ if (!gCompoundCompoundChildShapePairCallback(childShape0, childShape1))
return;
}
- if (TestAabbAgainstAabb2(aabbMin0,aabbMax0,aabbMin1,aabbMax1))
+ if (TestAabbAgainstAabb2(aabbMin0, aabbMax0, aabbMin1, aabbMax1))
{
- btCollisionObjectWrapper compoundWrap0(this->m_compound0ColObjWrap,childShape0, m_compound0ColObjWrap->getCollisionObject(),newChildWorldTrans0,-1,childIndex0);
- btCollisionObjectWrapper compoundWrap1(this->m_compound1ColObjWrap,childShape1,m_compound1ColObjWrap->getCollisionObject(),newChildWorldTrans1,-1,childIndex1);
-
+ btCollisionObjectWrapper compoundWrap0(this->m_compound0ColObjWrap, childShape0, m_compound0ColObjWrap->getCollisionObject(), newChildWorldTrans0, -1, childIndex0);
+ btCollisionObjectWrapper compoundWrap1(this->m_compound1ColObjWrap, childShape1, m_compound1ColObjWrap->getCollisionObject(), newChildWorldTrans1, -1, childIndex1);
- btSimplePair* pair = m_childCollisionAlgorithmCache->findPair(childIndex0,childIndex1);
+ btSimplePair* pair = m_childCollisionAlgorithmCache->findPair(childIndex0, childIndex1);
bool removePair = false;
btCollisionAlgorithm* colAlgo = 0;
if (m_resultOut->m_closestPointDistanceThreshold > 0)
@@ -193,7 +174,6 @@ struct btCompoundCompoundLeafCallback : btDbvt::ICollide
if (pair)
{
colAlgo = (btCollisionAlgorithm*)pair->m_userPointer;
-
}
else
{
@@ -205,7 +185,7 @@ struct btCompoundCompoundLeafCallback : btDbvt::ICollide
}
btAssert(colAlgo);
-
+
const btCollisionObjectWrapper* tmpWrap0 = 0;
const btCollisionObjectWrapper* tmpWrap1 = 0;
@@ -215,105 +195,100 @@ struct btCompoundCompoundLeafCallback : btDbvt::ICollide
m_resultOut->setBody0Wrap(&compoundWrap0);
m_resultOut->setBody1Wrap(&compoundWrap1);
- m_resultOut->setShapeIdentifiersA(-1,childIndex0);
- m_resultOut->setShapeIdentifiersB(-1,childIndex1);
+ m_resultOut->setShapeIdentifiersA(-1, childIndex0);
+ m_resultOut->setShapeIdentifiersB(-1, childIndex1);
+ colAlgo->processCollision(&compoundWrap0, &compoundWrap1, m_dispatchInfo, m_resultOut);
- colAlgo->processCollision(&compoundWrap0,&compoundWrap1,m_dispatchInfo,m_resultOut);
-
m_resultOut->setBody0Wrap(tmpWrap0);
m_resultOut->setBody1Wrap(tmpWrap1);
-
+
if (removePair)
{
colAlgo->~btCollisionAlgorithm();
m_dispatcher->freeCollisionAlgorithm(colAlgo);
}
-
}
}
};
-
-static DBVT_INLINE bool MyIntersect( const btDbvtAabbMm& a,
- const btDbvtAabbMm& b, const btTransform& xform, btScalar distanceThreshold)
+static DBVT_INLINE bool MyIntersect(const btDbvtAabbMm& a,
+ const btDbvtAabbMm& b, const btTransform& xform, btScalar distanceThreshold)
{
- btVector3 newmin,newmax;
- btTransformAabb(b.Mins(),b.Maxs(),0.f,xform,newmin,newmax);
+ btVector3 newmin, newmax;
+ btTransformAabb(b.Mins(), b.Maxs(), 0.f, xform, newmin, newmax);
newmin -= btVector3(distanceThreshold, distanceThreshold, distanceThreshold);
newmax += btVector3(distanceThreshold, distanceThreshold, distanceThreshold);
- btDbvtAabbMm newb = btDbvtAabbMm::FromMM(newmin,newmax);
- return Intersect(a,newb);
+ btDbvtAabbMm newb = btDbvtAabbMm::FromMM(newmin, newmax);
+ return Intersect(a, newb);
}
-
-static inline void MycollideTT( const btDbvtNode* root0,
- const btDbvtNode* root1,
- const btTransform& xform,
- btCompoundCompoundLeafCallback* callback, btScalar distanceThreshold)
+static inline void MycollideTT(const btDbvtNode* root0,
+ const btDbvtNode* root1,
+ const btTransform& xform,
+ btCompoundCompoundLeafCallback* callback, btScalar distanceThreshold)
{
-
- if(root0&&root1)
- {
- int depth=1;
- int treshold=btDbvt::DOUBLE_STACKSIZE-4;
- btAlignedObjectArray<btDbvt::sStkNN> stkStack;
+ if (root0 && root1)
+ {
+ int depth = 1;
+ int treshold = btDbvt::DOUBLE_STACKSIZE - 4;
+ btAlignedObjectArray<btDbvt::sStkNN> stkStack;
#ifdef USE_LOCAL_STACK
- ATTRIBUTE_ALIGNED16(btDbvt::sStkNN localStack[btDbvt::DOUBLE_STACKSIZE]);
- stkStack.initializeFromBuffer(&localStack,btDbvt::DOUBLE_STACKSIZE,btDbvt::DOUBLE_STACKSIZE);
+ ATTRIBUTE_ALIGNED16(btDbvt::sStkNN localStack[btDbvt::DOUBLE_STACKSIZE]);
+ stkStack.initializeFromBuffer(&localStack, btDbvt::DOUBLE_STACKSIZE, btDbvt::DOUBLE_STACKSIZE);
#else
- stkStack.resize(btDbvt::DOUBLE_STACKSIZE);
+ stkStack.resize(btDbvt::DOUBLE_STACKSIZE);
#endif
- stkStack[0]=btDbvt::sStkNN(root0,root1);
- do {
- btDbvt::sStkNN p=stkStack[--depth];
- if(MyIntersect(p.a->volume,p.b->volume,xform, distanceThreshold))
+ stkStack[0] = btDbvt::sStkNN(root0, root1);
+ do
+ {
+ btDbvt::sStkNN p = stkStack[--depth];
+ if (MyIntersect(p.a->volume, p.b->volume, xform, distanceThreshold))
+ {
+ if (depth > treshold)
{
- if(depth>treshold)
+ stkStack.resize(stkStack.size() * 2);
+ treshold = stkStack.size() - 4;
+ }
+ if (p.a->isinternal())
+ {
+ if (p.b->isinternal())
{
- stkStack.resize(stkStack.size()*2);
- treshold=stkStack.size()-4;
+ stkStack[depth++] = btDbvt::sStkNN(p.a->childs[0], p.b->childs[0]);
+ stkStack[depth++] = btDbvt::sStkNN(p.a->childs[1], p.b->childs[0]);
+ stkStack[depth++] = btDbvt::sStkNN(p.a->childs[0], p.b->childs[1]);
+ stkStack[depth++] = btDbvt::sStkNN(p.a->childs[1], p.b->childs[1]);
}
- if(p.a->isinternal())
+ else
{
- if(p.b->isinternal())
- {
- stkStack[depth++]=btDbvt::sStkNN(p.a->childs[0],p.b->childs[0]);
- stkStack[depth++]=btDbvt::sStkNN(p.a->childs[1],p.b->childs[0]);
- stkStack[depth++]=btDbvt::sStkNN(p.a->childs[0],p.b->childs[1]);
- stkStack[depth++]=btDbvt::sStkNN(p.a->childs[1],p.b->childs[1]);
- }
- else
- {
- stkStack[depth++]=btDbvt::sStkNN(p.a->childs[0],p.b);
- stkStack[depth++]=btDbvt::sStkNN(p.a->childs[1],p.b);
- }
+ stkStack[depth++] = btDbvt::sStkNN(p.a->childs[0], p.b);
+ stkStack[depth++] = btDbvt::sStkNN(p.a->childs[1], p.b);
+ }
+ }
+ else
+ {
+ if (p.b->isinternal())
+ {
+ stkStack[depth++] = btDbvt::sStkNN(p.a, p.b->childs[0]);
+ stkStack[depth++] = btDbvt::sStkNN(p.a, p.b->childs[1]);
}
else
{
- if(p.b->isinternal())
- {
- stkStack[depth++]=btDbvt::sStkNN(p.a,p.b->childs[0]);
- stkStack[depth++]=btDbvt::sStkNN(p.a,p.b->childs[1]);
- }
- else
- {
- callback->Process(p.a,p.b);
- }
+ callback->Process(p.a, p.b);
}
}
- } while(depth);
- }
+ }
+ } while (depth);
+ }
}
-void btCompoundCompoundCollisionAlgorithm::processCollision (const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+void btCompoundCompoundCollisionAlgorithm::processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
-
const btCollisionObjectWrapper* col0ObjWrap = body0Wrap;
- const btCollisionObjectWrapper* col1ObjWrap= body1Wrap;
+ const btCollisionObjectWrapper* col1ObjWrap = body1Wrap;
- btAssert (col0ObjWrap->getCollisionShape()->isCompound());
- btAssert (col1ObjWrap->getCollisionShape()->isCompound());
+ btAssert(col0ObjWrap->getCollisionShape()->isCompound());
+ btAssert(col1ObjWrap->getCollisionShape()->isCompound());
const btCompoundShape* compoundShape0 = static_cast<const btCompoundShape*>(col0ObjWrap->getCollisionShape());
const btCompoundShape* compoundShape1 = static_cast<const btCompoundShape*>(col1ObjWrap->getCollisionShape());
@@ -321,7 +296,7 @@ void btCompoundCompoundCollisionAlgorithm::processCollision (const btCollisionOb
const btDbvt* tree1 = compoundShape1->getDynamicAabbTree();
if (!tree0 || !tree1)
{
- return btCompoundCollisionAlgorithm::processCollision(body0Wrap,body1Wrap,dispatchInfo,resultOut);
+ return btCompoundCollisionAlgorithm::processCollision(body0Wrap, body1Wrap, dispatchInfo, resultOut);
}
///btCompoundShape might have changed:
////make sure the internal child collision algorithm caches are still valid
@@ -331,28 +306,26 @@ void btCompoundCompoundCollisionAlgorithm::processCollision (const btCollisionOb
removeChildAlgorithms();
m_compoundShapeRevision0 = compoundShape0->getUpdateRevision();
m_compoundShapeRevision1 = compoundShape1->getUpdateRevision();
-
}
-
///we need to refresh all contact manifolds
///note that we should actually recursively traverse all children, btCompoundShape can nested more then 1 level deep
///so we should add a 'refreshManifolds' in the btCollisionAlgorithm
{
int i;
btManifoldArray manifoldArray;
-#ifdef USE_LOCAL_STACK
+#ifdef USE_LOCAL_STACK
btPersistentManifold localManifolds[4];
- manifoldArray.initializeFromBuffer(&localManifolds,0,4);
+ manifoldArray.initializeFromBuffer(&localManifolds, 0, 4);
#endif
btSimplePairArray& pairs = m_childCollisionAlgorithmCache->getOverlappingPairArray();
- for (i=0;i<pairs.size();i++)
+ for (i = 0; i < pairs.size(); i++)
{
if (pairs[i].m_userPointer)
{
- btCollisionAlgorithm* algo = (btCollisionAlgorithm*) pairs[i].m_userPointer;
+ btCollisionAlgorithm* algo = (btCollisionAlgorithm*)pairs[i].m_userPointer;
algo->getAllContactManifolds(manifoldArray);
- for (int m=0;m<manifoldArray.size();m++)
+ for (int m = 0; m < manifoldArray.size(); m++)
{
if (manifoldArray[m]->getNumContacts())
{
@@ -366,35 +339,27 @@ void btCompoundCompoundCollisionAlgorithm::processCollision (const btCollisionOb
}
}
+ btCompoundCompoundLeafCallback callback(col0ObjWrap, col1ObjWrap, this->m_dispatcher, dispatchInfo, resultOut, this->m_childCollisionAlgorithmCache, m_sharedManifold);
-
-
- btCompoundCompoundLeafCallback callback(col0ObjWrap,col1ObjWrap,this->m_dispatcher,dispatchInfo,resultOut,this->m_childCollisionAlgorithmCache,m_sharedManifold);
-
-
- const btTransform xform=col0ObjWrap->getWorldTransform().inverse()*col1ObjWrap->getWorldTransform();
- MycollideTT(tree0->m_root,tree1->m_root,xform,&callback, resultOut->m_closestPointDistanceThreshold);
+ const btTransform xform = col0ObjWrap->getWorldTransform().inverse() * col1ObjWrap->getWorldTransform();
+ MycollideTT(tree0->m_root, tree1->m_root, xform, &callback, resultOut->m_closestPointDistanceThreshold);
//printf("#compound-compound child/leaf overlap =%d \r",callback.m_numOverlapPairs);
//remove non-overlapping child pairs
{
- btAssert(m_removePairs.size()==0);
+ btAssert(m_removePairs.size() == 0);
//iterate over all children, perform an AABB check inside ProcessChildShape
btSimplePairArray& pairs = m_childCollisionAlgorithmCache->getOverlappingPairArray();
-
+
int i;
- btManifoldArray manifoldArray;
-
-
-
-
-
- btVector3 aabbMin0,aabbMax0,aabbMin1,aabbMax1;
-
- for (i=0;i<pairs.size();i++)
+ btManifoldArray manifoldArray;
+
+ btVector3 aabbMin0, aabbMax0, aabbMin1, aabbMax1;
+
+ for (i = 0; i < pairs.size(); i++)
{
if (pairs[i].m_userPointer)
{
@@ -402,52 +367,47 @@ void btCompoundCompoundCollisionAlgorithm::processCollision (const btCollisionOb
{
const btCollisionShape* childShape0 = 0;
-
- btTransform newChildWorldTrans0;
+
+ btTransform newChildWorldTrans0;
childShape0 = compoundShape0->getChildShape(pairs[i].m_indexA);
const btTransform& childTrans0 = compoundShape0->getChildTransform(pairs[i].m_indexA);
- newChildWorldTrans0 = col0ObjWrap->getWorldTransform()*childTrans0 ;
- childShape0->getAabb(newChildWorldTrans0,aabbMin0,aabbMax0);
+ newChildWorldTrans0 = col0ObjWrap->getWorldTransform() * childTrans0;
+ childShape0->getAabb(newChildWorldTrans0, aabbMin0, aabbMax0);
}
btVector3 thresholdVec(resultOut->m_closestPointDistanceThreshold, resultOut->m_closestPointDistanceThreshold, resultOut->m_closestPointDistanceThreshold);
aabbMin0 -= thresholdVec;
aabbMax0 += thresholdVec;
{
const btCollisionShape* childShape1 = 0;
- btTransform newChildWorldTrans1;
+ btTransform newChildWorldTrans1;
childShape1 = compoundShape1->getChildShape(pairs[i].m_indexB);
const btTransform& childTrans1 = compoundShape1->getChildTransform(pairs[i].m_indexB);
- newChildWorldTrans1 = col1ObjWrap->getWorldTransform()*childTrans1 ;
- childShape1->getAabb(newChildWorldTrans1,aabbMin1,aabbMax1);
+ newChildWorldTrans1 = col1ObjWrap->getWorldTransform() * childTrans1;
+ childShape1->getAabb(newChildWorldTrans1, aabbMin1, aabbMax1);
}
-
+
aabbMin1 -= thresholdVec;
aabbMax1 += thresholdVec;
- if (!TestAabbAgainstAabb2(aabbMin0,aabbMax0,aabbMin1,aabbMax1))
+ if (!TestAabbAgainstAabb2(aabbMin0, aabbMax0, aabbMin1, aabbMax1))
{
algo->~btCollisionAlgorithm();
m_dispatcher->freeCollisionAlgorithm(algo);
- m_removePairs.push_back(btSimplePair(pairs[i].m_indexA,pairs[i].m_indexB));
+ m_removePairs.push_back(btSimplePair(pairs[i].m_indexA, pairs[i].m_indexB));
}
}
}
- for (int i=0;i<m_removePairs.size();i++)
+ for (int i = 0; i < m_removePairs.size(); i++)
{
- m_childCollisionAlgorithmCache->removeOverlappingPair(m_removePairs[i].m_indexA,m_removePairs[i].m_indexB);
+ m_childCollisionAlgorithmCache->removeOverlappingPair(m_removePairs[i].m_indexA, m_removePairs[i].m_indexB);
}
m_removePairs.clear();
}
-
}
-btScalar btCompoundCompoundCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+btScalar btCompoundCompoundCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
btAssert(0);
return 0.f;
-
}
-
-
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCompoundCompoundCollisionAlgorithm.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCompoundCompoundCollisionAlgorithm.h
index f29f7a709a..a940d840e0 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btCompoundCompoundCollisionAlgorithm.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btCompoundCompoundCollisionAlgorithm.h
@@ -34,54 +34,49 @@ class btCollisionObject;
class btCollisionShape;
+extern btShapePairCallback gCompoundCompoundChildShapePairCallback;
+
/// btCompoundCompoundCollisionAlgorithm supports collision between two btCompoundCollisionShape shapes
-class btCompoundCompoundCollisionAlgorithm : public btCompoundCollisionAlgorithm
+class btCompoundCompoundCollisionAlgorithm : public btCompoundCollisionAlgorithm
{
-
- class btHashedSimplePairCache* m_childCollisionAlgorithmCache;
+ 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;
- 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);
+ void removeChildAlgorithms();
-public:
+ // void preallocateChildAlgorithms(const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap);
- btCompoundCompoundCollisionAlgorithm( const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,bool isSwapped);
+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);
- 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);
- btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
+ virtual void getAllContactManifolds(btManifoldArray& manifoldArray);
- virtual void getAllContactManifolds(btManifoldArray& manifoldArray);
-
-
- struct CreateFunc :public btCollisionAlgorithmCreateFunc
+ struct CreateFunc : public btCollisionAlgorithmCreateFunc
{
- virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap)
+ 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);
+ return new (mem) btCompoundCompoundCollisionAlgorithm(ci, body0Wrap, body1Wrap, false);
}
};
- struct SwappedCreateFunc :public btCollisionAlgorithmCreateFunc
+ struct SwappedCreateFunc : public btCollisionAlgorithmCreateFunc
{
- virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap)
+ 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);
+ return new (mem) btCompoundCompoundCollisionAlgorithm(ci, body0Wrap, body1Wrap, true);
}
};
-
};
-#endif //BT_COMPOUND_COMPOUND_COLLISION_ALGORITHM_H
+#endif //BT_COMPOUND_COMPOUND_COLLISION_ALGORITHM_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.cpp
index 1cb3d2e7a1..9087f84398 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.cpp
@@ -22,7 +22,6 @@ subject to the following restrictions:
#include "BulletCollision/CollisionShapes/btConvexShape.h"
#include "BulletCollision/CollisionShapes/btCapsuleShape.h"
-
#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h"
#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h"
@@ -34,8 +33,6 @@ subject to the following restrictions:
#include "BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h"
#include "BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h"
-
-
#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h"
#include "BulletCollision/CollisionShapes/btSphereShape.h"
@@ -45,31 +42,28 @@ subject to the following restrictions:
#include "BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h"
#include "BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h"
-btConvex2dConvex2dAlgorithm::CreateFunc::CreateFunc(btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver)
+btConvex2dConvex2dAlgorithm::CreateFunc::CreateFunc(btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver)
{
m_simplexSolver = simplexSolver;
m_pdSolver = pdSolver;
}
-btConvex2dConvex2dAlgorithm::CreateFunc::~CreateFunc()
-{
+btConvex2dConvex2dAlgorithm::CreateFunc::~CreateFunc()
+{
}
-btConvex2dConvex2dAlgorithm::btConvex2dConvex2dAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver,int /* numPerturbationIterations */, int /* minimumPointsPerturbationThreshold */)
-: btActivatingCollisionAlgorithm(ci,body0Wrap,body1Wrap),
-m_simplexSolver(simplexSolver),
-m_pdSolver(pdSolver),
-m_ownManifold (false),
-m_manifoldPtr(mf),
-m_lowLevelOfDetail(false)
+btConvex2dConvex2dAlgorithm::btConvex2dConvex2dAlgorithm(btPersistentManifold* mf, const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver, int /* numPerturbationIterations */, int /* minimumPointsPerturbationThreshold */)
+ : btActivatingCollisionAlgorithm(ci, body0Wrap, body1Wrap),
+ m_simplexSolver(simplexSolver),
+ m_pdSolver(pdSolver),
+ m_ownManifold(false),
+ m_manifoldPtr(mf),
+ m_lowLevelOfDetail(false)
{
(void)body0Wrap;
(void)body1Wrap;
}
-
-
-
btConvex2dConvex2dAlgorithm::~btConvex2dConvex2dAlgorithm()
{
if (m_ownManifold)
@@ -79,26 +73,22 @@ btConvex2dConvex2dAlgorithm::~btConvex2dConvex2dAlgorithm()
}
}
-void btConvex2dConvex2dAlgorithm ::setLowLevelOfDetail(bool useLowLevel)
+void btConvex2dConvex2dAlgorithm ::setLowLevelOfDetail(bool useLowLevel)
{
m_lowLevelOfDetail = useLowLevel;
}
-
-
extern btScalar gContactBreakingThreshold;
-
//
// Convex-Convex collision algorithm
//
-void btConvex2dConvex2dAlgorithm ::processCollision (const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+void btConvex2dConvex2dAlgorithm ::processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
-
if (!m_manifoldPtr)
{
//swapped?
- m_manifoldPtr = m_dispatcher->getNewManifold(body0Wrap->getCollisionObject(),body1Wrap->getCollisionObject());
+ m_manifoldPtr = m_dispatcher->getNewManifold(body0Wrap->getCollisionObject(), body1Wrap->getCollisionObject());
m_ownManifold = true;
}
resultOut->setPersistentManifold(m_manifoldPtr);
@@ -106,49 +96,41 @@ void btConvex2dConvex2dAlgorithm ::processCollision (const btCollisionObjectWrap
//comment-out next line to test multi-contact generation
//resultOut->getPersistentManifold()->clearManifold();
-
const btConvexShape* min0 = static_cast<const btConvexShape*>(body0Wrap->getCollisionShape());
const btConvexShape* min1 = static_cast<const btConvexShape*>(body1Wrap->getCollisionShape());
- btVector3 normalOnB;
- btVector3 pointOnBWorld;
+ btVector3 normalOnB;
+ btVector3 pointOnBWorld;
{
-
-
btGjkPairDetector::ClosestPointInput input;
- btGjkPairDetector gjkPairDetector(min0,min1,m_simplexSolver,m_pdSolver);
+ btGjkPairDetector gjkPairDetector(min0, min1, m_simplexSolver, m_pdSolver);
//TODO: if (dispatchInfo.m_useContinuous)
gjkPairDetector.setMinkowskiA(min0);
gjkPairDetector.setMinkowskiB(min1);
{
input.m_maximumDistanceSquared = min0->getMargin() + min1->getMargin() + m_manifoldPtr->getContactBreakingThreshold();
- input.m_maximumDistanceSquared*= input.m_maximumDistanceSquared;
+ input.m_maximumDistanceSquared *= input.m_maximumDistanceSquared;
}
input.m_transformA = body0Wrap->getWorldTransform();
input.m_transformB = body1Wrap->getWorldTransform();
- gjkPairDetector.getClosestPoints(input,*resultOut,dispatchInfo.m_debugDraw);
+ gjkPairDetector.getClosestPoints(input, *resultOut, dispatchInfo.m_debugDraw);
- btVector3 v0,v1;
+ btVector3 v0, v1;
btVector3 sepNormalWorldSpace;
-
}
if (m_ownManifold)
{
resultOut->refreshContactPoints();
}
-
}
-
-
-
-btScalar btConvex2dConvex2dAlgorithm::calculateTimeOfImpact(btCollisionObject* col0,btCollisionObject* col1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+btScalar btConvex2dConvex2dAlgorithm::calculateTimeOfImpact(btCollisionObject* col0, btCollisionObject* col1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
(void)resultOut;
(void)dispatchInfo;
@@ -158,7 +140,6 @@ btScalar btConvex2dConvex2dAlgorithm::calculateTimeOfImpact(btCollisionObject* c
///col0->m_worldTransform,
btScalar resultFraction = btScalar(1.);
-
btScalar squareMot0 = (col0->getInterpolationWorldTransform().getOrigin() - col0->getWorldTransform().getOrigin()).length2();
btScalar squareMot1 = (col1->getInterpolationWorldTransform().getOrigin() - col1->getWorldTransform().getOrigin()).length2();
@@ -166,77 +147,65 @@ btScalar btConvex2dConvex2dAlgorithm::calculateTimeOfImpact(btCollisionObject* c
squareMot1 < col1->getCcdSquareMotionThreshold())
return resultFraction;
-
//An adhoc way of testing the Continuous Collision Detection algorithms
//One object is approximated as a sphere, to simplify things
//Starting in penetration should report no time of impact
//For proper CCD, better accuracy and handling of 'allowed' penetration should be added
//also the mainloop of the physics should have a kind of toi queue (something like Brian Mirtich's application of Timewarp for Rigidbodies)
-
/// Convex0 against sphere for Convex1
{
btConvexShape* convex0 = static_cast<btConvexShape*>(col0->getCollisionShape());
- btSphereShape sphere1(col1->getCcdSweptSphereRadius()); //todo: allow non-zero sphere sizes, for better approximation
+ btSphereShape sphere1(col1->getCcdSweptSphereRadius()); //todo: allow non-zero sphere sizes, for better approximation
btConvexCast::CastResult result;
btVoronoiSimplexSolver voronoiSimplex;
//SubsimplexConvexCast ccd0(&sphere,min0,&voronoiSimplex);
///Simplification, one object is simplified as a sphere
- btGjkConvexCast ccd1( convex0 ,&sphere1,&voronoiSimplex);
+ btGjkConvexCast ccd1(convex0, &sphere1, &voronoiSimplex);
//ContinuousConvexCollision ccd(min0,min1,&voronoiSimplex,0);
- if (ccd1.calcTimeOfImpact(col0->getWorldTransform(),col0->getInterpolationWorldTransform(),
- col1->getWorldTransform(),col1->getInterpolationWorldTransform(),result))
+ if (ccd1.calcTimeOfImpact(col0->getWorldTransform(), col0->getInterpolationWorldTransform(),
+ col1->getWorldTransform(), col1->getInterpolationWorldTransform(), result))
{
-
//store result.m_fraction in both bodies
- if (col0->getHitFraction()> result.m_fraction)
- col0->setHitFraction( result.m_fraction );
+ if (col0->getHitFraction() > result.m_fraction)
+ col0->setHitFraction(result.m_fraction);
if (col1->getHitFraction() > result.m_fraction)
- col1->setHitFraction( result.m_fraction);
+ col1->setHitFraction(result.m_fraction);
if (resultFraction > result.m_fraction)
resultFraction = result.m_fraction;
-
}
-
-
-
-
}
/// Sphere (for convex0) against Convex1
{
btConvexShape* convex1 = static_cast<btConvexShape*>(col1->getCollisionShape());
- btSphereShape sphere0(col0->getCcdSweptSphereRadius()); //todo: allow non-zero sphere sizes, for better approximation
+ btSphereShape sphere0(col0->getCcdSweptSphereRadius()); //todo: allow non-zero sphere sizes, for better approximation
btConvexCast::CastResult result;
btVoronoiSimplexSolver voronoiSimplex;
//SubsimplexConvexCast ccd0(&sphere,min0,&voronoiSimplex);
///Simplification, one object is simplified as a sphere
- btGjkConvexCast ccd1(&sphere0,convex1,&voronoiSimplex);
+ btGjkConvexCast ccd1(&sphere0, convex1, &voronoiSimplex);
//ContinuousConvexCollision ccd(min0,min1,&voronoiSimplex,0);
- if (ccd1.calcTimeOfImpact(col0->getWorldTransform(),col0->getInterpolationWorldTransform(),
- col1->getWorldTransform(),col1->getInterpolationWorldTransform(),result))
+ if (ccd1.calcTimeOfImpact(col0->getWorldTransform(), col0->getInterpolationWorldTransform(),
+ col1->getWorldTransform(), col1->getInterpolationWorldTransform(), result))
{
-
//store result.m_fraction in both bodies
- if (col0->getHitFraction() > result.m_fraction)
- col0->setHitFraction( result.m_fraction);
+ if (col0->getHitFraction() > result.m_fraction)
+ col0->setHitFraction(result.m_fraction);
if (col1->getHitFraction() > result.m_fraction)
- col1->setHitFraction( result.m_fraction);
+ col1->setHitFraction(result.m_fraction);
if (resultFraction > result.m_fraction)
resultFraction = result.m_fraction;
-
}
}
return resultFraction;
-
}
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.h
index 24d1336778..9fca463fbe 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.h
@@ -23,70 +23,61 @@ subject to the following restrictions:
#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h"
#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h"
#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h"
-#include "LinearMath/btTransformUtil.h" //for btConvexSeparatingDistanceUtil
+#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;
+ 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);
+ 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 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 btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut);
- virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
+ 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);
- void setLowLevelOfDetail(bool useLowLevel);
-
-
- const btPersistentManifold* getManifold()
+ const btPersistentManifold* getManifold()
{
return m_manifoldPtr;
}
- struct CreateFunc :public btCollisionAlgorithmCreateFunc
+ struct CreateFunc : public btCollisionAlgorithmCreateFunc
{
-
- btConvexPenetrationDepthSolver* m_pdSolver;
- btSimplexSolverInterface* m_simplexSolver;
+ btConvexPenetrationDepthSolver* m_pdSolver;
+ btSimplexSolverInterface* m_simplexSolver;
int m_numPerturbationIterations;
int m_minimumPointsPerturbationThreshold;
- CreateFunc(btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver);
-
+ CreateFunc(btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver);
+
virtual ~CreateFunc();
- virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap)
+ 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);
+ 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
+#endif //BT_CONVEX_2D_CONVEX_2D_ALGORITHM_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp
index d8cbe96142..e50f85e2bb 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp
@@ -13,7 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btConvexConcaveCollisionAlgorithm.h"
#include "LinearMath/btQuickprof.h"
#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
@@ -29,10 +28,10 @@ subject to the following restrictions:
#include "BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h"
#include "BulletCollision/CollisionShapes/btSdfCollisionShape.h"
-btConvexConcaveCollisionAlgorithm::btConvexConcaveCollisionAlgorithm( const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,bool isSwapped)
-: btActivatingCollisionAlgorithm(ci,body0Wrap,body1Wrap),
-m_btConvexTriangleCallback(ci.m_dispatcher1,body0Wrap,body1Wrap,isSwapped),
-m_isSwapped(isSwapped)
+btConvexConcaveCollisionAlgorithm::btConvexConcaveCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, bool isSwapped)
+ : btActivatingCollisionAlgorithm(ci, body0Wrap, body1Wrap),
+ m_btConvexTriangleCallback(ci.m_dispatcher1, body0Wrap, body1Wrap, isSwapped),
+ m_isSwapped(isSwapped)
{
}
@@ -40,7 +39,7 @@ btConvexConcaveCollisionAlgorithm::~btConvexConcaveCollisionAlgorithm()
{
}
-void btConvexConcaveCollisionAlgorithm::getAllContactManifolds(btManifoldArray& manifoldArray)
+void btConvexConcaveCollisionAlgorithm::getAllContactManifolds(btManifoldArray& manifoldArray)
{
if (m_btConvexTriangleCallback.m_manifoldPtr)
{
@@ -48,38 +47,32 @@ void btConvexConcaveCollisionAlgorithm::getAllContactManifolds(btManifoldArray&
}
}
-
-btConvexTriangleCallback::btConvexTriangleCallback(btDispatcher* dispatcher,const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,bool isSwapped):
- m_dispatcher(dispatcher),
- m_dispatchInfoPtr(0)
+btConvexTriangleCallback::btConvexTriangleCallback(btDispatcher* dispatcher, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, bool isSwapped) : m_dispatcher(dispatcher),
+ m_dispatchInfoPtr(0)
{
- m_convexBodyWrap = isSwapped? body1Wrap:body0Wrap;
- m_triBodyWrap = isSwapped? body0Wrap:body1Wrap;
-
- //
- // create the manifold from the dispatcher 'manifold pool'
- //
- m_manifoldPtr = m_dispatcher->getNewManifold(m_convexBodyWrap->getCollisionObject(),m_triBodyWrap->getCollisionObject());
+ m_convexBodyWrap = isSwapped ? body1Wrap : body0Wrap;
+ m_triBodyWrap = isSwapped ? body0Wrap : body1Wrap;
+
+ //
+ // create the manifold from the dispatcher 'manifold pool'
+ //
+ m_manifoldPtr = m_dispatcher->getNewManifold(m_convexBodyWrap->getCollisionObject(), m_triBodyWrap->getCollisionObject());
- clearCache();
+ clearCache();
}
btConvexTriangleCallback::~btConvexTriangleCallback()
{
clearCache();
- m_dispatcher->releaseManifold( m_manifoldPtr );
-
+ m_dispatcher->releaseManifold(m_manifoldPtr);
}
-
-void btConvexTriangleCallback::clearCache()
+void btConvexTriangleCallback::clearCache()
{
m_dispatcher->clearManifold(m_manifoldPtr);
}
-
-void btConvexTriangleCallback::processTriangle(btVector3* triangle,int
-partId, int triangleIndex)
+void btConvexTriangleCallback::processTriangle(btVector3* triangle, int partId, int triangleIndex)
{
BT_PROFILE("btConvexTriangleCallback::processTriangle");
@@ -88,16 +81,12 @@ partId, int triangleIndex)
return;
}
- //just for debugging purposes
- //printf("triangle %d",m_triangleCount++);
-
-
+ //just for debugging purposes
+ //printf("triangle %d",m_triangleCount++);
btCollisionAlgorithmConstructionInfo ci;
ci.m_dispatcher1 = m_dispatcher;
-
-
#if 0
///debug drawing of the overlapping triangles
@@ -111,16 +100,15 @@ partId, int triangleIndex)
m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[2]),tr(triangle[0]),color);
}
#endif
-
+
if (m_convexBodyWrap->getCollisionShape()->isConvex())
{
- btTriangleShape tm(triangle[0],triangle[1],triangle[2]);
+ btTriangleShape tm(triangle[0], triangle[1], triangle[2]);
tm.setMargin(m_collisionMarginTriangle);
-
-
- btCollisionObjectWrapper triObWrap(m_triBodyWrap,&tm,m_triBodyWrap->getCollisionObject(),m_triBodyWrap->getWorldTransform(),partId,triangleIndex);//correct transform?
+
+ btCollisionObjectWrapper triObWrap(m_triBodyWrap, &tm, m_triBodyWrap->getCollisionObject(), m_triBodyWrap->getWorldTransform(), partId, triangleIndex); //correct transform?
btCollisionAlgorithm* colAlgo = 0;
-
+
if (m_resultOut->m_closestPointDistanceThreshold > 0)
{
colAlgo = ci.m_dispatcher1->findAlgorithm(m_convexBodyWrap, &triObWrap, 0, BT_CLOSEST_POINT_ALGORITHMS);
@@ -135,36 +123,32 @@ partId, int triangleIndex)
{
tmpWrap = m_resultOut->getBody0Wrap();
m_resultOut->setBody0Wrap(&triObWrap);
- m_resultOut->setShapeIdentifiersA(partId,triangleIndex);
+ m_resultOut->setShapeIdentifiersA(partId, triangleIndex);
}
else
{
tmpWrap = m_resultOut->getBody1Wrap();
m_resultOut->setBody1Wrap(&triObWrap);
- m_resultOut->setShapeIdentifiersB(partId,triangleIndex);
+ m_resultOut->setShapeIdentifiersB(partId, triangleIndex);
}
-
- colAlgo->processCollision(m_convexBodyWrap,&triObWrap,*m_dispatchInfoPtr,m_resultOut);
+
+ colAlgo->processCollision(m_convexBodyWrap, &triObWrap, *m_dispatchInfoPtr, m_resultOut);
if (m_resultOut->getBody0Internal() == m_triBodyWrap->getCollisionObject())
{
m_resultOut->setBody0Wrap(tmpWrap);
- } else
+ }
+ else
{
m_resultOut->setBody1Wrap(tmpWrap);
}
-
-
colAlgo->~btCollisionAlgorithm();
ci.m_dispatcher1->freeCollisionAlgorithm(colAlgo);
}
-
}
-
-
-void btConvexTriangleCallback::setTimeStepAndCounters(btScalar collisionMarginTriangle, const btDispatcherInfo& dispatchInfo, const btCollisionObjectWrapper* convexBodyWrap, const btCollisionObjectWrapper* triBodyWrap, btManifoldResult* resultOut)
+void btConvexTriangleCallback::setTimeStepAndCounters(btScalar collisionMarginTriangle, const btDispatcherInfo& dispatchInfo, const btCollisionObjectWrapper* convexBodyWrap, const btCollisionObjectWrapper* triBodyWrap, btManifoldResult* resultOut)
{
m_convexBodyWrap = convexBodyWrap;
m_triBodyWrap = triBodyWrap;
@@ -185,16 +169,14 @@ void btConvexTriangleCallback::setTimeStepAndCounters(btScalar collisionMarginTr
m_aabbMax += extra;
m_aabbMin -= extra;
-
}
void btConvexConcaveCollisionAlgorithm::clearCache()
{
m_btConvexTriangleCallback.clearCache();
-
}
-void btConvexConcaveCollisionAlgorithm::processCollision (const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
+void btConvexConcaveCollisionAlgorithm::processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
BT_PROFILE("btConvexConcaveCollisionAlgorithm::processCollision");
@@ -208,7 +190,6 @@ void btConvexConcaveCollisionAlgorithm::processCollision (const btCollisionObjec
btSdfCollisionShape* sdfShape = (btSdfCollisionShape*)triBodyWrap->getCollisionShape();
if (convexBodyWrap->getCollisionShape()->isConvex())
{
-
btConvexShape* convex = (btConvexShape*)convexBodyWrap->getCollisionShape();
btAlignedObjectArray<btVector3> queryVertices;
@@ -229,7 +210,6 @@ void btConvexConcaveCollisionAlgorithm::processCollision (const btCollisionObjec
queryVertices.push_back(btVector3(0, 0, 0));
btSphereShape* sphere = (btSphereShape*)convex;
maxDist = sphere->getRadius() + SIMD_EPSILON;
-
}
if (queryVertices.size())
{
@@ -240,7 +220,7 @@ void btConvexConcaveCollisionAlgorithm::processCollision (const btCollisionObjec
for (int v = 0; v < queryVertices.size(); v++)
{
const btVector3& vtx = queryVertices[v];
- btVector3 vtxWorldSpace = convexBodyWrap->getWorldTransform()*vtx;
+ btVector3 vtxWorldSpace = convexBodyWrap->getWorldTransform() * vtx;
btVector3 vtxInSdf = triBodyWrap->getWorldTransform().invXform(vtxWorldSpace);
btVector3 normalLocal;
@@ -250,58 +230,52 @@ void btConvexConcaveCollisionAlgorithm::processCollision (const btCollisionObjec
if (dist <= maxDist)
{
normalLocal.safeNormalize();
- btVector3 normal = triBodyWrap->getWorldTransform().getBasis()*normalLocal;
+ btVector3 normal = triBodyWrap->getWorldTransform().getBasis() * normalLocal;
if (convex->getShapeType() == SPHERE_SHAPE_PROXYTYPE)
{
btSphereShape* sphere = (btSphereShape*)convex;
dist -= sphere->getRadius();
- vtxWorldSpace -= sphere->getRadius()*normal;
-
+ vtxWorldSpace -= sphere->getRadius() * normal;
}
- resultOut->addContactPoint(normal,vtxWorldSpace-normal*dist, dist);
+ resultOut->addContactPoint(normal, vtxWorldSpace - normal * dist, dist);
}
}
}
resultOut->refreshContactPoints();
}
-
}
- } else
+ }
+ else
{
- const btConcaveShape* concaveShape = static_cast<const btConcaveShape*>( triBodyWrap->getCollisionShape());
-
+ const btConcaveShape* concaveShape = static_cast<const btConcaveShape*>(triBodyWrap->getCollisionShape());
+
if (convexBodyWrap->getCollisionShape()->isConvex())
{
btScalar collisionMarginTriangle = concaveShape->getMargin();
-
+
resultOut->setPersistentManifold(m_btConvexTriangleCallback.m_manifoldPtr);
- m_btConvexTriangleCallback.setTimeStepAndCounters(collisionMarginTriangle,dispatchInfo,convexBodyWrap,triBodyWrap,resultOut);
+ m_btConvexTriangleCallback.setTimeStepAndCounters(collisionMarginTriangle, dispatchInfo, convexBodyWrap, triBodyWrap, resultOut);
- m_btConvexTriangleCallback.m_manifoldPtr->setBodies(convexBodyWrap->getCollisionObject(),triBodyWrap->getCollisionObject());
+ m_btConvexTriangleCallback.m_manifoldPtr->setBodies(convexBodyWrap->getCollisionObject(), triBodyWrap->getCollisionObject());
+
+ concaveShape->processAllTriangles(&m_btConvexTriangleCallback, m_btConvexTriangleCallback.getAabbMin(), m_btConvexTriangleCallback.getAabbMax());
- concaveShape->processAllTriangles( &m_btConvexTriangleCallback,m_btConvexTriangleCallback.getAabbMin(),m_btConvexTriangleCallback.getAabbMax());
-
resultOut->refreshContactPoints();
m_btConvexTriangleCallback.clearWrapperData();
-
}
}
-
}
-
}
-
-btScalar btConvexConcaveCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+btScalar btConvexConcaveCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
(void)resultOut;
(void)dispatchInfo;
btCollisionObject* convexbody = m_isSwapped ? body1 : body0;
btCollisionObject* triBody = m_isSwapped ? body0 : body1;
-
//quick approximation using raycast, todo: hook up to the continuous collision detection (one of the btConvexCast)
//only perform CCD above a certain threshold, this prevents blocking on the long run
@@ -320,25 +294,23 @@ btScalar btConvexConcaveCollisionAlgorithm::calculateTimeOfImpact(btCollisionObj
btTransform convexFromLocal = triInv * convexbody->getWorldTransform();
btTransform convexToLocal = triInv * convexbody->getInterpolationWorldTransform();
- struct LocalTriangleSphereCastCallback : public btTriangleCallback
+ struct LocalTriangleSphereCastCallback : public btTriangleCallback
{
btTransform m_ccdSphereFromTrans;
btTransform m_ccdSphereToTrans;
- btTransform m_meshTransform;
+ btTransform m_meshTransform;
- btScalar m_ccdSphereRadius;
- btScalar m_hitFraction;
-
+ btScalar m_ccdSphereRadius;
+ btScalar m_hitFraction;
- LocalTriangleSphereCastCallback(const btTransform& from,const btTransform& to,btScalar ccdSphereRadius,btScalar hitFraction)
- :m_ccdSphereFromTrans(from),
- m_ccdSphereToTrans(to),
- m_ccdSphereRadius(ccdSphereRadius),
- m_hitFraction(hitFraction)
- {
+ LocalTriangleSphereCastCallback(const btTransform& from, const btTransform& to, btScalar ccdSphereRadius, btScalar hitFraction)
+ : m_ccdSphereFromTrans(from),
+ m_ccdSphereToTrans(to),
+ m_ccdSphereRadius(ccdSphereRadius),
+ m_hitFraction(hitFraction)
+ {
}
-
-
+
virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex)
{
BT_PROFILE("processTriangle");
@@ -349,29 +321,23 @@ btScalar btConvexConcaveCollisionAlgorithm::calculateTimeOfImpact(btCollisionObj
ident.setIdentity();
btConvexCast::CastResult castResult;
castResult.m_fraction = m_hitFraction;
- btSphereShape pointShape(m_ccdSphereRadius);
- btTriangleShape triShape(triangle[0],triangle[1],triangle[2]);
- btVoronoiSimplexSolver simplexSolver;
- btSubsimplexConvexCast convexCaster(&pointShape,&triShape,&simplexSolver);
+ btSphereShape pointShape(m_ccdSphereRadius);
+ btTriangleShape triShape(triangle[0], triangle[1], triangle[2]);
+ btVoronoiSimplexSolver simplexSolver;
+ btSubsimplexConvexCast convexCaster(&pointShape, &triShape, &simplexSolver);
//GjkConvexCast convexCaster(&pointShape,convexShape,&simplexSolver);
//ContinuousConvexCollision convexCaster(&pointShape,convexShape,&simplexSolver,0);
//local space?
- if (convexCaster.calcTimeOfImpact(m_ccdSphereFromTrans,m_ccdSphereToTrans,
- ident,ident,castResult))
+ if (convexCaster.calcTimeOfImpact(m_ccdSphereFromTrans, m_ccdSphereToTrans,
+ ident, ident, castResult))
{
if (m_hitFraction > castResult.m_fraction)
m_hitFraction = castResult.m_fraction;
}
-
}
-
};
-
-
-
-
if (triBody->getCollisionShape()->isConcave())
{
btVector3 rayAabbMin = convexFromLocal.getOrigin();
@@ -379,33 +345,30 @@ btScalar btConvexConcaveCollisionAlgorithm::calculateTimeOfImpact(btCollisionObj
btVector3 rayAabbMax = convexFromLocal.getOrigin();
rayAabbMax.setMax(convexToLocal.getOrigin());
btScalar ccdRadius0 = convexbody->getCcdSweptSphereRadius();
- rayAabbMin -= btVector3(ccdRadius0,ccdRadius0,ccdRadius0);
- rayAabbMax += btVector3(ccdRadius0,ccdRadius0,ccdRadius0);
+ rayAabbMin -= btVector3(ccdRadius0, ccdRadius0, ccdRadius0);
+ rayAabbMax += btVector3(ccdRadius0, ccdRadius0, ccdRadius0);
- btScalar curHitFraction = btScalar(1.); //is this available?
- LocalTriangleSphereCastCallback raycastCallback(convexFromLocal,convexToLocal,
- convexbody->getCcdSweptSphereRadius(),curHitFraction);
+ btScalar curHitFraction = btScalar(1.); //is this available?
+ LocalTriangleSphereCastCallback raycastCallback(convexFromLocal, convexToLocal,
+ convexbody->getCcdSweptSphereRadius(), curHitFraction);
raycastCallback.m_hitFraction = convexbody->getHitFraction();
btCollisionObject* concavebody = triBody;
- btConcaveShape* triangleMesh = (btConcaveShape*) concavebody->getCollisionShape();
-
+ btConcaveShape* triangleMesh = (btConcaveShape*)concavebody->getCollisionShape();
+
if (triangleMesh)
{
- triangleMesh->processAllTriangles(&raycastCallback,rayAabbMin,rayAabbMax);
+ triangleMesh->processAllTriangles(&raycastCallback, rayAabbMin, rayAabbMax);
}
-
-
if (raycastCallback.m_hitFraction < convexbody->getHitFraction())
{
- convexbody->setHitFraction( raycastCallback.m_hitFraction);
+ convexbody->setHitFraction(raycastCallback.m_hitFraction);
return raycastCallback.m_hitFraction;
}
}
return btScalar(1.);
-
}
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h
index 93d842ef50..b72e402981 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h
@@ -26,42 +26,40 @@ class btDispatcher;
#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
+ATTRIBUTE_ALIGNED16(class)
+btConvexTriangleCallback : public btTriangleCallback
{
-
- btVector3 m_aabbMin;
- btVector3 m_aabbMax ;
+ btVector3 m_aabbMin;
+ btVector3 m_aabbMax;
const btCollisionObjectWrapper* m_convexBodyWrap;
const btCollisionObjectWrapper* m_triBodyWrap;
-
-
btManifoldResult* m_resultOut;
- btDispatcher* m_dispatcher;
+ 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);
+ int m_triangleCount;
+
+ btPersistentManifold* m_manifoldPtr;
- void setTimeStepAndCounters(btScalar collisionMarginTriangle,const btDispatcherInfo& dispatchInfo,const btCollisionObjectWrapper* convexBodyWrap, const btCollisionObjectWrapper* triBodyWrap, btManifoldResult* resultOut);
+ btConvexTriangleCallback(btDispatcher * dispatcher, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, bool isSwapped);
- void clearWrapperData()
+ 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);
-
+ virtual void processTriangle(btVector3 * triangle, int partId, int triangleIndex);
+
void clearCache();
SIMD_FORCE_INLINE const btVector3& getAabbMin() const
@@ -72,56 +70,48 @@ int m_triangleCount;
{
return m_aabbMax;
}
-
};
-
-
-
/// btConvexConcaveCollisionAlgorithm supports collision between convex shapes and (concave) trianges meshes.
-ATTRIBUTE_ALIGNED16(class) btConvexConcaveCollisionAlgorithm : public btActivatingCollisionAlgorithm
+ATTRIBUTE_ALIGNED16(class)
+btConvexConcaveCollisionAlgorithm : public btActivatingCollisionAlgorithm
{
-
btConvexTriangleCallback m_btConvexTriangleCallback;
- bool m_isSwapped;
-
-
+ bool m_isSwapped;
public:
-
BT_DECLARE_ALIGNED_ALLOCATOR();
-
- btConvexConcaveCollisionAlgorithm( const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,bool isSwapped);
+
+ 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);
+ 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);
- btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
+ virtual void getAllContactManifolds(btManifoldArray & manifoldArray);
- virtual void getAllContactManifolds(btManifoldArray& manifoldArray);
-
- void clearCache();
+ void clearCache();
- struct CreateFunc :public btCollisionAlgorithmCreateFunc
+ struct CreateFunc : public btCollisionAlgorithmCreateFunc
{
- virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap)
+ 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);
+ return new (mem) btConvexConcaveCollisionAlgorithm(ci, body0Wrap, body1Wrap, false);
}
};
- struct SwappedCreateFunc :public btCollisionAlgorithmCreateFunc
+ struct SwappedCreateFunc : public btCollisionAlgorithmCreateFunc
{
- virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap)
+ 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);
+ return new (mem) btConvexConcaveCollisionAlgorithm(ci, body0Wrap, body1Wrap, true);
}
};
-
};
-#endif //BT_CONVEX_CONCAVE_COLLISION_ALGORITHM_H
+#endif //BT_CONVEX_CONCAVE_COLLISION_ALGORITHM_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp
index 3e8bc6e426..44dd3c553e 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp
@@ -30,8 +30,6 @@ subject to the following restrictions:
#include "BulletCollision/CollisionShapes/btTriangleShape.h"
#include "BulletCollision/CollisionShapes/btConvexPolyhedron.h"
-
-
#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h"
#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h"
@@ -43,8 +41,6 @@ subject to the following restrictions:
#include "BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h"
#include "BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h"
-
-
#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h"
#include "BulletCollision/CollisionShapes/btSphereShape.h"
@@ -57,8 +53,6 @@ subject to the following restrictions:
///////////
-
-
static SIMD_FORCE_INLINE void segmentsClosestPoints(
btVector3& ptsVector,
btVector3& offsetA,
@@ -66,43 +60,49 @@ static SIMD_FORCE_INLINE void segmentsClosestPoints(
btScalar& tA, btScalar& tB,
const btVector3& translation,
const btVector3& dirA, btScalar hlenA,
- const btVector3& dirB, btScalar hlenB )
+ const btVector3& dirB, btScalar hlenB)
{
// compute the parameters of the closest points on each line segment
- btScalar dirA_dot_dirB = btDot(dirA,dirB);
- btScalar dirA_dot_trans = btDot(dirA,translation);
- btScalar dirB_dot_trans = btDot(dirB,translation);
+ btScalar dirA_dot_dirB = btDot(dirA, dirB);
+ btScalar dirA_dot_trans = btDot(dirA, translation);
+ btScalar dirB_dot_trans = btDot(dirB, translation);
btScalar denom = 1.0f - dirA_dot_dirB * dirA_dot_dirB;
- if ( denom == 0.0f ) {
+ if (denom == 0.0f)
+ {
tA = 0.0f;
- } else {
- tA = ( dirA_dot_trans - dirB_dot_trans * dirA_dot_dirB ) / denom;
- if ( tA < -hlenA )
+ }
+ else
+ {
+ tA = (dirA_dot_trans - dirB_dot_trans * dirA_dot_dirB) / denom;
+ if (tA < -hlenA)
tA = -hlenA;
- else if ( tA > hlenA )
+ else if (tA > hlenA)
tA = hlenA;
}
tB = tA * dirA_dot_dirB - dirB_dot_trans;
- if ( tB < -hlenB ) {
+ if (tB < -hlenB)
+ {
tB = -hlenB;
tA = tB * dirA_dot_dirB + dirA_dot_trans;
- if ( tA < -hlenA )
+ if (tA < -hlenA)
tA = -hlenA;
- else if ( tA > hlenA )
+ else if (tA > hlenA)
tA = hlenA;
- } else if ( tB > hlenB ) {
+ }
+ else if (tB > hlenB)
+ {
tB = hlenB;
tA = tB * dirA_dot_dirB + dirA_dot_trans;
- if ( tA < -hlenA )
+ if (tA < -hlenA)
tA = -hlenA;
- else if ( tA > hlenA )
+ else if (tA > hlenA)
tA = hlenA;
}
@@ -114,19 +114,18 @@ static SIMD_FORCE_INLINE void segmentsClosestPoints(
ptsVector = translation - offsetA + offsetB;
}
-
static SIMD_FORCE_INLINE btScalar capsuleCapsuleDistance(
btVector3& normalOnB,
btVector3& pointOnB,
btScalar capsuleLengthA,
- btScalar capsuleRadiusA,
+ btScalar capsuleRadiusA,
btScalar capsuleLengthB,
- btScalar capsuleRadiusB,
+ btScalar capsuleRadiusB,
int capsuleAxisA,
int capsuleAxisB,
const btTransform& transformA,
const btTransform& transformB,
- btScalar distanceThreshold )
+ btScalar distanceThreshold)
{
btVector3 directionA = transformA.getBasis().getColumn(capsuleAxisA);
btVector3 translationA = transformA.getOrigin();
@@ -139,47 +138,38 @@ static SIMD_FORCE_INLINE btScalar capsuleCapsuleDistance(
// compute the closest points of the capsule line segments
- btVector3 ptsVector; // the vector between the closest points
-
- btVector3 offsetA, offsetB; // offsets from segment centers to their closest points
- btScalar tA, tB; // parameters on line segment
+ btVector3 ptsVector; // the vector between the closest points
+
+ btVector3 offsetA, offsetB; // offsets from segment centers to their closest points
+ btScalar tA, tB; // parameters on line segment
- segmentsClosestPoints( ptsVector, offsetA, offsetB, tA, tB, translation,
- directionA, capsuleLengthA, directionB, capsuleLengthB );
+ segmentsClosestPoints(ptsVector, offsetA, offsetB, tA, tB, translation,
+ directionA, capsuleLengthA, directionB, capsuleLengthB);
btScalar distance = ptsVector.length() - capsuleRadiusA - capsuleRadiusB;
- if ( distance > distanceThreshold )
+ if (distance > distanceThreshold)
return distance;
btScalar lenSqr = ptsVector.length2();
- if (lenSqr<= (SIMD_EPSILON*SIMD_EPSILON))
+ if (lenSqr <= (SIMD_EPSILON * SIMD_EPSILON))
{
//degenerate case where 2 capsules are likely at the same location: take a vector tangential to 'directionA'
btVector3 q;
- btPlaneSpace1(directionA,normalOnB,q);
- } else
+ btPlaneSpace1(directionA, normalOnB, q);
+ }
+ else
{
// compute the contact normal
- normalOnB = ptsVector*-btRecipSqrt(lenSqr);
+ normalOnB = ptsVector * -btRecipSqrt(lenSqr);
}
- pointOnB = transformB.getOrigin()+offsetB + normalOnB * capsuleRadiusB;
+ pointOnB = transformB.getOrigin() + offsetB + normalOnB * capsuleRadiusB;
return distance;
}
-
-
-
-
-
-
//////////
-
-
-
-
btConvexConvexAlgorithm::CreateFunc::CreateFunc(btConvexPenetrationDepthSolver* pdSolver)
{
m_numPerturbationIterations = 0;
@@ -187,30 +177,27 @@ btConvexConvexAlgorithm::CreateFunc::CreateFunc(btConvexPenetrationDepthSolver*
m_pdSolver = pdSolver;
}
-btConvexConvexAlgorithm::CreateFunc::~CreateFunc()
-{
+btConvexConvexAlgorithm::CreateFunc::~CreateFunc()
+{
}
-btConvexConvexAlgorithm::btConvexConvexAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,btConvexPenetrationDepthSolver* pdSolver,int numPerturbationIterations, int minimumPointsPerturbationThreshold)
-: btActivatingCollisionAlgorithm(ci,body0Wrap,body1Wrap),
-m_pdSolver(pdSolver),
-m_ownManifold (false),
-m_manifoldPtr(mf),
-m_lowLevelOfDetail(false),
+btConvexConvexAlgorithm::btConvexConvexAlgorithm(btPersistentManifold* mf, const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, btConvexPenetrationDepthSolver* pdSolver, int numPerturbationIterations, int minimumPointsPerturbationThreshold)
+ : btActivatingCollisionAlgorithm(ci, body0Wrap, body1Wrap),
+ m_pdSolver(pdSolver),
+ m_ownManifold(false),
+ m_manifoldPtr(mf),
+ m_lowLevelOfDetail(false),
#ifdef USE_SEPDISTANCE_UTIL2
-m_sepDistance((static_cast<btConvexShape*>(body0->getCollisionShape()))->getAngularMotionDisc(),
- (static_cast<btConvexShape*>(body1->getCollisionShape()))->getAngularMotionDisc()),
+ m_sepDistance((static_cast<btConvexShape*>(body0->getCollisionShape()))->getAngularMotionDisc(),
+ (static_cast<btConvexShape*>(body1->getCollisionShape()))->getAngularMotionDisc()),
#endif
-m_numPerturbationIterations(numPerturbationIterations),
-m_minimumPointsPerturbationThreshold(minimumPointsPerturbationThreshold)
+ m_numPerturbationIterations(numPerturbationIterations),
+ m_minimumPointsPerturbationThreshold(minimumPointsPerturbationThreshold)
{
(void)body0Wrap;
(void)body1Wrap;
}
-
-
-
btConvexConvexAlgorithm::~btConvexConvexAlgorithm()
{
if (m_ownManifold)
@@ -220,112 +207,105 @@ btConvexConvexAlgorithm::~btConvexConvexAlgorithm()
}
}
-void btConvexConvexAlgorithm ::setLowLevelOfDetail(bool useLowLevel)
+void btConvexConvexAlgorithm ::setLowLevelOfDetail(bool useLowLevel)
{
m_lowLevelOfDetail = useLowLevel;
}
-
struct btPerturbedContactResult : public btManifoldResult
{
btManifoldResult* m_originalManifoldResult;
btTransform m_transformA;
btTransform m_transformB;
- btTransform m_unPerturbedTransform;
- bool m_perturbA;
- btIDebugDraw* m_debugDrawer;
-
-
- btPerturbedContactResult(btManifoldResult* originalResult,const btTransform& transformA,const btTransform& transformB,const btTransform& unPerturbedTransform,bool perturbA,btIDebugDraw* debugDrawer)
- :m_originalManifoldResult(originalResult),
- m_transformA(transformA),
- m_transformB(transformB),
- m_unPerturbedTransform(unPerturbedTransform),
- m_perturbA(perturbA),
- m_debugDrawer(debugDrawer)
+ btTransform m_unPerturbedTransform;
+ bool m_perturbA;
+ btIDebugDraw* m_debugDrawer;
+
+ btPerturbedContactResult(btManifoldResult* originalResult, const btTransform& transformA, const btTransform& transformB, const btTransform& unPerturbedTransform, bool perturbA, btIDebugDraw* debugDrawer)
+ : m_originalManifoldResult(originalResult),
+ m_transformA(transformA),
+ m_transformB(transformB),
+ m_unPerturbedTransform(unPerturbedTransform),
+ m_perturbA(perturbA),
+ m_debugDrawer(debugDrawer)
{
}
- virtual ~ btPerturbedContactResult()
+ virtual ~btPerturbedContactResult()
{
}
- virtual void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar orgDepth)
+ virtual void addContactPoint(const btVector3& normalOnBInWorld, const btVector3& pointInWorld, btScalar orgDepth)
{
- btVector3 endPt,startPt;
+ btVector3 endPt, startPt;
btScalar newDepth;
btVector3 newNormal;
if (m_perturbA)
{
- btVector3 endPtOrg = pointInWorld + normalOnBInWorld*orgDepth;
- endPt = (m_unPerturbedTransform*m_transformA.inverse())(endPtOrg);
- newDepth = (endPt - pointInWorld).dot(normalOnBInWorld);
- startPt = endPt - normalOnBInWorld*newDepth;
- } else
+ btVector3 endPtOrg = pointInWorld + normalOnBInWorld * orgDepth;
+ endPt = (m_unPerturbedTransform * m_transformA.inverse())(endPtOrg);
+ newDepth = (endPt - pointInWorld).dot(normalOnBInWorld);
+ startPt = endPt - normalOnBInWorld * newDepth;
+ }
+ else
{
- endPt = pointInWorld + normalOnBInWorld*orgDepth;
- startPt = (m_unPerturbedTransform*m_transformB.inverse())(pointInWorld);
- newDepth = (endPt - startPt).dot(normalOnBInWorld);
-
+ endPt = pointInWorld + normalOnBInWorld * orgDepth;
+ startPt = (m_unPerturbedTransform * m_transformB.inverse())(pointInWorld);
+ newDepth = (endPt - startPt).dot(normalOnBInWorld);
}
//#define DEBUG_CONTACTS 1
#ifdef DEBUG_CONTACTS
- m_debugDrawer->drawLine(startPt,endPt,btVector3(1,0,0));
- m_debugDrawer->drawSphere(startPt,0.05,btVector3(0,1,0));
- m_debugDrawer->drawSphere(endPt,0.05,btVector3(0,0,1));
-#endif //DEBUG_CONTACTS
+ m_debugDrawer->drawLine(startPt, endPt, btVector3(1, 0, 0));
+ m_debugDrawer->drawSphere(startPt, 0.05, btVector3(0, 1, 0));
+ m_debugDrawer->drawSphere(endPt, 0.05, btVector3(0, 0, 1));
+#endif //DEBUG_CONTACTS
-
- m_originalManifoldResult->addContactPoint(normalOnBInWorld,startPt,newDepth);
+ m_originalManifoldResult->addContactPoint(normalOnBInWorld, startPt, newDepth);
}
-
};
extern btScalar gContactBreakingThreshold;
-
//
// Convex-Convex collision algorithm
//
-void btConvexConvexAlgorithm ::processCollision (const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+void btConvexConvexAlgorithm ::processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
-
if (!m_manifoldPtr)
{
//swapped?
- m_manifoldPtr = m_dispatcher->getNewManifold(body0Wrap->getCollisionObject(),body1Wrap->getCollisionObject());
+ m_manifoldPtr = m_dispatcher->getNewManifold(body0Wrap->getCollisionObject(), body1Wrap->getCollisionObject());
m_ownManifold = true;
}
resultOut->setPersistentManifold(m_manifoldPtr);
//comment-out next line to test multi-contact generation
//resultOut->getPersistentManifold()->clearManifold();
-
const btConvexShape* min0 = static_cast<const btConvexShape*>(body0Wrap->getCollisionShape());
const btConvexShape* min1 = static_cast<const btConvexShape*>(body1Wrap->getCollisionShape());
- btVector3 normalOnB;
- btVector3 pointOnBWorld;
+ btVector3 normalOnB;
+ btVector3 pointOnBWorld;
#ifndef BT_DISABLE_CAPSULE_CAPSULE_COLLIDER
if ((min0->getShapeType() == CAPSULE_SHAPE_PROXYTYPE) && (min1->getShapeType() == CAPSULE_SHAPE_PROXYTYPE))
{
//m_manifoldPtr->clearManifold();
- btCapsuleShape* capsuleA = (btCapsuleShape*) min0;
- btCapsuleShape* capsuleB = (btCapsuleShape*) min1;
-
- btScalar threshold = m_manifoldPtr->getContactBreakingThreshold();
+ btCapsuleShape* capsuleA = (btCapsuleShape*)min0;
+ btCapsuleShape* capsuleB = (btCapsuleShape*)min1;
- btScalar dist = capsuleCapsuleDistance(normalOnB, pointOnBWorld,capsuleA->getHalfHeight(),capsuleA->getRadius(),
- capsuleB->getHalfHeight(),capsuleB->getRadius(),capsuleA->getUpAxis(),capsuleB->getUpAxis(),
- body0Wrap->getWorldTransform(),body1Wrap->getWorldTransform(),threshold);
+ btScalar threshold = m_manifoldPtr->getContactBreakingThreshold()+ resultOut->m_closestPointDistanceThreshold;
- if (dist<threshold)
+ btScalar dist = capsuleCapsuleDistance(normalOnB, pointOnBWorld, capsuleA->getHalfHeight(), capsuleA->getRadius(),
+ capsuleB->getHalfHeight(), capsuleB->getRadius(), capsuleA->getUpAxis(), capsuleB->getUpAxis(),
+ body0Wrap->getWorldTransform(), body1Wrap->getWorldTransform(), threshold);
+
+ if (dist < threshold)
{
- btAssert(normalOnB.length2()>=(SIMD_EPSILON*SIMD_EPSILON));
- resultOut->addContactPoint(normalOnB,pointOnBWorld,dist);
+ btAssert(normalOnB.length2() >= (SIMD_EPSILON * SIMD_EPSILON));
+ resultOut->addContactPoint(normalOnB, pointOnBWorld, dist);
}
resultOut->refreshContactPoints();
return;
@@ -335,19 +315,19 @@ void btConvexConvexAlgorithm ::processCollision (const btCollisionObjectWrapper*
{
//m_manifoldPtr->clearManifold();
- btCapsuleShape* capsuleA = (btCapsuleShape*) min0;
- btSphereShape* capsuleB = (btSphereShape*) min1;
-
- btScalar threshold = m_manifoldPtr->getContactBreakingThreshold();
+ btCapsuleShape* capsuleA = (btCapsuleShape*)min0;
+ btSphereShape* capsuleB = (btSphereShape*)min1;
+
+ btScalar threshold = m_manifoldPtr->getContactBreakingThreshold()+ resultOut->m_closestPointDistanceThreshold;
- btScalar dist = capsuleCapsuleDistance(normalOnB, pointOnBWorld,capsuleA->getHalfHeight(),capsuleA->getRadius(),
- 0.,capsuleB->getRadius(),capsuleA->getUpAxis(),1,
- body0Wrap->getWorldTransform(),body1Wrap->getWorldTransform(),threshold);
+ btScalar dist = capsuleCapsuleDistance(normalOnB, pointOnBWorld, capsuleA->getHalfHeight(), capsuleA->getRadius(),
+ 0., capsuleB->getRadius(), capsuleA->getUpAxis(), 1,
+ body0Wrap->getWorldTransform(), body1Wrap->getWorldTransform(), threshold);
- if (dist<threshold)
+ if (dist < threshold)
{
- btAssert(normalOnB.length2()>=(SIMD_EPSILON*SIMD_EPSILON));
- resultOut->addContactPoint(normalOnB,pointOnBWorld,dist);
+ btAssert(normalOnB.length2() >= (SIMD_EPSILON * SIMD_EPSILON));
+ resultOut->addContactPoint(normalOnB, pointOnBWorld, dist);
}
resultOut->refreshContactPoints();
return;
@@ -357,252 +337,227 @@ void btConvexConvexAlgorithm ::processCollision (const btCollisionObjectWrapper*
{
//m_manifoldPtr->clearManifold();
- btSphereShape* capsuleA = (btSphereShape*) min0;
- btCapsuleShape* capsuleB = (btCapsuleShape*) min1;
-
- btScalar threshold = m_manifoldPtr->getContactBreakingThreshold();
+ btSphereShape* capsuleA = (btSphereShape*)min0;
+ btCapsuleShape* capsuleB = (btCapsuleShape*)min1;
+
+ btScalar threshold = m_manifoldPtr->getContactBreakingThreshold()+ resultOut->m_closestPointDistanceThreshold;
- btScalar dist = capsuleCapsuleDistance(normalOnB, pointOnBWorld,0.,capsuleA->getRadius(),
- capsuleB->getHalfHeight(),capsuleB->getRadius(),1,capsuleB->getUpAxis(),
- body0Wrap->getWorldTransform(),body1Wrap->getWorldTransform(),threshold);
+ btScalar dist = capsuleCapsuleDistance(normalOnB, pointOnBWorld, 0., capsuleA->getRadius(),
+ capsuleB->getHalfHeight(), capsuleB->getRadius(), 1, capsuleB->getUpAxis(),
+ body0Wrap->getWorldTransform(), body1Wrap->getWorldTransform(), threshold);
- if (dist<threshold)
+ if (dist < threshold)
{
- btAssert(normalOnB.length2()>=(SIMD_EPSILON*SIMD_EPSILON));
- resultOut->addContactPoint(normalOnB,pointOnBWorld,dist);
+ btAssert(normalOnB.length2() >= (SIMD_EPSILON * SIMD_EPSILON));
+ resultOut->addContactPoint(normalOnB, pointOnBWorld, dist);
}
resultOut->refreshContactPoints();
return;
}
-#endif //BT_DISABLE_CAPSULE_CAPSULE_COLLIDER
-
-
-
+#endif //BT_DISABLE_CAPSULE_CAPSULE_COLLIDER
#ifdef USE_SEPDISTANCE_UTIL2
if (dispatchInfo.m_useConvexConservativeDistanceUtil)
{
- m_sepDistance.updateSeparatingDistance(body0->getWorldTransform(),body1->getWorldTransform());
+ m_sepDistance.updateSeparatingDistance(body0->getWorldTransform(), body1->getWorldTransform());
}
- if (!dispatchInfo.m_useConvexConservativeDistanceUtil || m_sepDistance.getConservativeSeparatingDistance()<=0.f)
-#endif //USE_SEPDISTANCE_UTIL2
+ if (!dispatchInfo.m_useConvexConservativeDistanceUtil || m_sepDistance.getConservativeSeparatingDistance() <= 0.f)
+#endif //USE_SEPDISTANCE_UTIL2
{
-
-
- btGjkPairDetector::ClosestPointInput input;
- btVoronoiSimplexSolver simplexSolver;
- btGjkPairDetector gjkPairDetector( min0, min1, &simplexSolver, m_pdSolver );
- //TODO: if (dispatchInfo.m_useContinuous)
- gjkPairDetector.setMinkowskiA(min0);
- gjkPairDetector.setMinkowskiB(min1);
+ btGjkPairDetector::ClosestPointInput input;
+ btVoronoiSimplexSolver simplexSolver;
+ btGjkPairDetector gjkPairDetector(min0, min1, &simplexSolver, m_pdSolver);
+ //TODO: if (dispatchInfo.m_useContinuous)
+ gjkPairDetector.setMinkowskiA(min0);
+ gjkPairDetector.setMinkowskiB(min1);
#ifdef USE_SEPDISTANCE_UTIL2
- if (dispatchInfo.m_useConvexConservativeDistanceUtil)
- {
- input.m_maximumDistanceSquared = BT_LARGE_FLOAT;
- } else
-#endif //USE_SEPDISTANCE_UTIL2
- {
- //if (dispatchInfo.m_convexMaxDistanceUseCPT)
- //{
- // input.m_maximumDistanceSquared = min0->getMargin() + min1->getMargin() + m_manifoldPtr->getContactProcessingThreshold();
- //} else
- //{
- input.m_maximumDistanceSquared = min0->getMargin() + min1->getMargin() + m_manifoldPtr->getContactBreakingThreshold()+resultOut->m_closestPointDistanceThreshold;
-// }
-
- input.m_maximumDistanceSquared*= input.m_maximumDistanceSquared;
- }
-
- input.m_transformA = body0Wrap->getWorldTransform();
- input.m_transformB = body1Wrap->getWorldTransform();
-
-
-
-
-
-#ifdef USE_SEPDISTANCE_UTIL2
- btScalar sepDist = 0.f;
- if (dispatchInfo.m_useConvexConservativeDistanceUtil)
- {
- sepDist = gjkPairDetector.getCachedSeparatingDistance();
- if (sepDist>SIMD_EPSILON)
+ if (dispatchInfo.m_useConvexConservativeDistanceUtil)
{
- sepDist += dispatchInfo.m_convexConservativeDistanceThreshold;
- //now perturbe directions to get multiple contact points
-
+ input.m_maximumDistanceSquared = BT_LARGE_FLOAT;
+ }
+ else
+#endif //USE_SEPDISTANCE_UTIL2
+ {
+ //if (dispatchInfo.m_convexMaxDistanceUseCPT)
+ //{
+ // input.m_maximumDistanceSquared = min0->getMargin() + min1->getMargin() + m_manifoldPtr->getContactProcessingThreshold();
+ //} else
+ //{
+ input.m_maximumDistanceSquared = min0->getMargin() + min1->getMargin() + m_manifoldPtr->getContactBreakingThreshold() + resultOut->m_closestPointDistanceThreshold;
+ // }
+
+ input.m_maximumDistanceSquared *= input.m_maximumDistanceSquared;
}
- }
-#endif //USE_SEPDISTANCE_UTIL2
-
- if (min0->isPolyhedral() && min1->isPolyhedral())
- {
+ input.m_transformA = body0Wrap->getWorldTransform();
+ input.m_transformB = body1Wrap->getWorldTransform();
- struct btDummyResult : public btDiscreteCollisionDetectorInterface::Result
+#ifdef USE_SEPDISTANCE_UTIL2
+ btScalar sepDist = 0.f;
+ if (dispatchInfo.m_useConvexConservativeDistanceUtil)
{
- btVector3 m_normalOnBInWorld;
- btVector3 m_pointInWorld;
- btScalar m_depth;
- bool m_hasContact;
-
-
- btDummyResult()
- : m_hasContact(false)
+ sepDist = gjkPairDetector.getCachedSeparatingDistance();
+ if (sepDist > SIMD_EPSILON)
{
+ sepDist += dispatchInfo.m_convexConservativeDistanceThreshold;
+ //now perturbe directions to get multiple contact points
}
-
-
- virtual void setShapeIdentifiersA(int partId0,int index0){}
- virtual void setShapeIdentifiersB(int partId1,int index1){}
- virtual void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar depth)
- {
- m_hasContact = true;
- m_normalOnBInWorld = normalOnBInWorld;
- m_pointInWorld = pointInWorld;
- m_depth = depth;
- }
- };
+ }
+#endif //USE_SEPDISTANCE_UTIL2
-
- struct btWithoutMarginResult : public btDiscreteCollisionDetectorInterface::Result
+ if (min0->isPolyhedral() && min1->isPolyhedral())
{
- btDiscreteCollisionDetectorInterface::Result* m_originalResult;
- btVector3 m_reportedNormalOnWorld;
- btScalar m_marginOnA;
- btScalar m_marginOnB;
- btScalar m_reportedDistance;
-
- bool m_foundResult;
- btWithoutMarginResult(btDiscreteCollisionDetectorInterface::Result* result, btScalar marginOnA, btScalar marginOnB)
- :m_originalResult(result),
- m_marginOnA(marginOnA),
- m_marginOnB(marginOnB),
- m_foundResult(false)
- {
- }
-
- virtual void setShapeIdentifiersA(int partId0,int index0){}
- virtual void setShapeIdentifiersB(int partId1,int index1){}
- virtual void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorldOrg,btScalar depthOrg)
+ struct btDummyResult : public btDiscreteCollisionDetectorInterface::Result
{
- m_reportedDistance = depthOrg;
- m_reportedNormalOnWorld = normalOnBInWorld;
-
- btVector3 adjustedPointB = pointInWorldOrg - normalOnBInWorld*m_marginOnB;
- m_reportedDistance = depthOrg+(m_marginOnA+m_marginOnB);
- if (m_reportedDistance<0.f)
+ btVector3 m_normalOnBInWorld;
+ btVector3 m_pointInWorld;
+ btScalar m_depth;
+ bool m_hasContact;
+
+ btDummyResult()
+ : m_hasContact(false)
{
- m_foundResult = true;
}
- m_originalResult->addContactPoint(normalOnBInWorld,adjustedPointB,m_reportedDistance);
- }
- };
-
- btDummyResult dummy;
-
-///btBoxShape is an exception: its vertices are created WITH margin so don't subtract it
+ virtual void setShapeIdentifiersA(int partId0, int index0) {}
+ virtual void setShapeIdentifiersB(int partId1, int index1) {}
+ virtual void addContactPoint(const btVector3& normalOnBInWorld, const btVector3& pointInWorld, btScalar depth)
+ {
+ m_hasContact = true;
+ m_normalOnBInWorld = normalOnBInWorld;
+ m_pointInWorld = pointInWorld;
+ m_depth = depth;
+ }
+ };
- btScalar min0Margin = min0->getShapeType()==BOX_SHAPE_PROXYTYPE? 0.f : min0->getMargin();
- btScalar min1Margin = min1->getShapeType()==BOX_SHAPE_PROXYTYPE? 0.f : min1->getMargin();
+ struct btWithoutMarginResult : public btDiscreteCollisionDetectorInterface::Result
+ {
+ btDiscreteCollisionDetectorInterface::Result* m_originalResult;
+ btVector3 m_reportedNormalOnWorld;
+ btScalar m_marginOnA;
+ btScalar m_marginOnB;
+ btScalar m_reportedDistance;
+
+ bool m_foundResult;
+ btWithoutMarginResult(btDiscreteCollisionDetectorInterface::Result* result, btScalar marginOnA, btScalar marginOnB)
+ : m_originalResult(result),
+ m_marginOnA(marginOnA),
+ m_marginOnB(marginOnB),
+ m_foundResult(false)
+ {
+ }
- btWithoutMarginResult withoutMargin(resultOut, min0Margin,min1Margin);
+ virtual void setShapeIdentifiersA(int partId0, int index0) {}
+ virtual void setShapeIdentifiersB(int partId1, int index1) {}
+ virtual void addContactPoint(const btVector3& normalOnBInWorld, const btVector3& pointInWorldOrg, btScalar depthOrg)
+ {
+ m_reportedDistance = depthOrg;
+ m_reportedNormalOnWorld = normalOnBInWorld;
- btPolyhedralConvexShape* polyhedronA = (btPolyhedralConvexShape*) min0;
- btPolyhedralConvexShape* polyhedronB = (btPolyhedralConvexShape*) min1;
- if (polyhedronA->getConvexPolyhedron() && polyhedronB->getConvexPolyhedron())
- {
+ btVector3 adjustedPointB = pointInWorldOrg - normalOnBInWorld * m_marginOnB;
+ m_reportedDistance = depthOrg + (m_marginOnA + m_marginOnB);
+ if (m_reportedDistance < 0.f)
+ {
+ m_foundResult = true;
+ }
+ m_originalResult->addContactPoint(normalOnBInWorld, adjustedPointB, m_reportedDistance);
+ }
+ };
+ btDummyResult dummy;
-
+ ///btBoxShape is an exception: its vertices are created WITH margin so don't subtract it
- btScalar threshold = m_manifoldPtr->getContactBreakingThreshold();
+ btScalar min0Margin = min0->getShapeType() == BOX_SHAPE_PROXYTYPE ? 0.f : min0->getMargin();
+ btScalar min1Margin = min1->getShapeType() == BOX_SHAPE_PROXYTYPE ? 0.f : min1->getMargin();
- btScalar minDist = -1e30f;
- btVector3 sepNormalWorldSpace;
- bool foundSepAxis = true;
+ btWithoutMarginResult withoutMargin(resultOut, min0Margin, min1Margin);
- if (dispatchInfo.m_enableSatConvex)
- {
- foundSepAxis = btPolyhedralContactClipping::findSeparatingAxis(
- *polyhedronA->getConvexPolyhedron(), *polyhedronB->getConvexPolyhedron(),
- body0Wrap->getWorldTransform(),
- body1Wrap->getWorldTransform(),
- sepNormalWorldSpace,*resultOut);
- } else
+ btPolyhedralConvexShape* polyhedronA = (btPolyhedralConvexShape*)min0;
+ btPolyhedralConvexShape* polyhedronB = (btPolyhedralConvexShape*)min1;
+ if (polyhedronA->getConvexPolyhedron() && polyhedronB->getConvexPolyhedron())
{
+ btScalar threshold = m_manifoldPtr->getContactBreakingThreshold()+ resultOut->m_closestPointDistanceThreshold;
+
+ btScalar minDist = -1e30f;
+ btVector3 sepNormalWorldSpace;
+ bool foundSepAxis = true;
+
+ if (dispatchInfo.m_enableSatConvex)
+ {
+ foundSepAxis = btPolyhedralContactClipping::findSeparatingAxis(
+ *polyhedronA->getConvexPolyhedron(), *polyhedronB->getConvexPolyhedron(),
+ body0Wrap->getWorldTransform(),
+ body1Wrap->getWorldTransform(),
+ sepNormalWorldSpace, *resultOut);
+ }
+ else
+ {
#ifdef ZERO_MARGIN
- gjkPairDetector.setIgnoreMargin(true);
- gjkPairDetector.getClosestPoints(input,*resultOut,dispatchInfo.m_debugDraw);
+ gjkPairDetector.setIgnoreMargin(true);
+ gjkPairDetector.getClosestPoints(input, *resultOut, dispatchInfo.m_debugDraw);
#else
+ gjkPairDetector.getClosestPoints(input, withoutMargin, dispatchInfo.m_debugDraw);
+ //gjkPairDetector.getClosestPoints(input,dummy,dispatchInfo.m_debugDraw);
+#endif //ZERO_MARGIN \
+ //btScalar l2 = gjkPairDetector.getCachedSeparatingAxis().length2(); \
+ //if (l2>SIMD_EPSILON)
+ {
+ sepNormalWorldSpace = withoutMargin.m_reportedNormalOnWorld; //gjkPairDetector.getCachedSeparatingAxis()*(1.f/l2);
+ //minDist = -1e30f;//gjkPairDetector.getCachedSeparatingDistance();
+ minDist = withoutMargin.m_reportedDistance; //gjkPairDetector.getCachedSeparatingDistance()+min0->getMargin()+min1->getMargin();
- gjkPairDetector.getClosestPoints(input,withoutMargin,dispatchInfo.m_debugDraw);
- //gjkPairDetector.getClosestPoints(input,dummy,dispatchInfo.m_debugDraw);
-#endif //ZERO_MARGIN
- //btScalar l2 = gjkPairDetector.getCachedSeparatingAxis().length2();
- //if (l2>SIMD_EPSILON)
- {
- sepNormalWorldSpace = withoutMargin.m_reportedNormalOnWorld;//gjkPairDetector.getCachedSeparatingAxis()*(1.f/l2);
- //minDist = -1e30f;//gjkPairDetector.getCachedSeparatingDistance();
- minDist = withoutMargin.m_reportedDistance;//gjkPairDetector.getCachedSeparatingDistance()+min0->getMargin()+min1->getMargin();
-
#ifdef ZERO_MARGIN
- foundSepAxis = true;//gjkPairDetector.getCachedSeparatingDistance()<0.f;
+ foundSepAxis = true; //gjkPairDetector.getCachedSeparatingDistance()<0.f;
#else
- foundSepAxis = withoutMargin.m_foundResult && minDist<0;//-(min0->getMargin()+min1->getMargin());
+ foundSepAxis = withoutMargin.m_foundResult && minDist < 0; //-(min0->getMargin()+min1->getMargin());
#endif
+ }
}
- }
- if (foundSepAxis)
- {
-
-// printf("sepNormalWorldSpace=%f,%f,%f\n",sepNormalWorldSpace.getX(),sepNormalWorldSpace.getY(),sepNormalWorldSpace.getZ());
-
- worldVertsB1.resize(0);
- btPolyhedralContactClipping::clipHullAgainstHull(sepNormalWorldSpace, *polyhedronA->getConvexPolyhedron(), *polyhedronB->getConvexPolyhedron(),
- body0Wrap->getWorldTransform(),
- body1Wrap->getWorldTransform(), minDist-threshold, threshold, worldVertsB1,worldVertsB2,
- *resultOut);
-
- }
- if (m_ownManifold)
- {
- resultOut->refreshContactPoints();
- }
- return;
-
- } else
- {
-
+ if (foundSepAxis)
+ {
+ // printf("sepNormalWorldSpace=%f,%f,%f\n",sepNormalWorldSpace.getX(),sepNormalWorldSpace.getY(),sepNormalWorldSpace.getZ());
- //we can also deal with convex versus triangle (without connectivity data)
- if (dispatchInfo.m_enableSatConvex && polyhedronA->getConvexPolyhedron() && polyhedronB->getShapeType()==TRIANGLE_SHAPE_PROXYTYPE)
+ worldVertsB1.resize(0);
+ btPolyhedralContactClipping::clipHullAgainstHull(sepNormalWorldSpace, *polyhedronA->getConvexPolyhedron(), *polyhedronB->getConvexPolyhedron(),
+ body0Wrap->getWorldTransform(),
+ body1Wrap->getWorldTransform(), minDist - threshold, threshold, worldVertsB1, worldVertsB2,
+ *resultOut);
+ }
+ if (m_ownManifold)
+ {
+ resultOut->refreshContactPoints();
+ }
+ return;
+ }
+ else
{
+ //we can also deal with convex versus triangle (without connectivity data)
+ if (dispatchInfo.m_enableSatConvex && polyhedronA->getConvexPolyhedron() && polyhedronB->getShapeType() == TRIANGLE_SHAPE_PROXYTYPE)
+ {
+ btVertexArray worldSpaceVertices;
+ btTriangleShape* tri = (btTriangleShape*)polyhedronB;
+ worldSpaceVertices.push_back(body1Wrap->getWorldTransform() * tri->m_vertices1[0]);
+ worldSpaceVertices.push_back(body1Wrap->getWorldTransform() * tri->m_vertices1[1]);
+ worldSpaceVertices.push_back(body1Wrap->getWorldTransform() * tri->m_vertices1[2]);
+ //tri->initializePolyhedralFeatures();
- btVertexArray worldSpaceVertices;
- btTriangleShape* tri = (btTriangleShape*)polyhedronB;
- worldSpaceVertices.push_back( body1Wrap->getWorldTransform()*tri->m_vertices1[0]);
- worldSpaceVertices.push_back( body1Wrap->getWorldTransform()*tri->m_vertices1[1]);
- worldSpaceVertices.push_back( body1Wrap->getWorldTransform()*tri->m_vertices1[2]);
-
- //tri->initializePolyhedralFeatures();
+ btScalar threshold = m_manifoldPtr->getContactBreakingThreshold()+ resultOut->m_closestPointDistanceThreshold;
- btScalar threshold = m_manifoldPtr->getContactBreakingThreshold();
+ btVector3 sepNormalWorldSpace;
+ btScalar minDist = -1e30f;
+ btScalar maxDist = threshold;
- btVector3 sepNormalWorldSpace;
- btScalar minDist =-1e30f;
- btScalar maxDist = threshold;
-
- bool foundSepAxis = false;
- bool useSatSepNormal = true;
+ bool foundSepAxis = false;
+ bool useSatSepNormal = true;
- if (useSatSepNormal)
- {
+ if (useSatSepNormal)
+ {
#if 0
if (0)
{
@@ -610,113 +565,107 @@ void btConvexConvexAlgorithm ::processCollision (const btCollisionObjectWrapper*
polyhedronB->initializePolyhedralFeatures();
} else
#endif
- {
+ {
+ btVector3 uniqueEdges[3] = {tri->m_vertices1[1] - tri->m_vertices1[0],
+ tri->m_vertices1[2] - tri->m_vertices1[1],
+ tri->m_vertices1[0] - tri->m_vertices1[2]};
- btVector3 uniqueEdges[3] = {tri->m_vertices1[1]-tri->m_vertices1[0],
- tri->m_vertices1[2]-tri->m_vertices1[1],
- tri->m_vertices1[0]-tri->m_vertices1[2]};
+ uniqueEdges[0].normalize();
+ uniqueEdges[1].normalize();
+ uniqueEdges[2].normalize();
- uniqueEdges[0].normalize();
- uniqueEdges[1].normalize();
- uniqueEdges[2].normalize();
+ btConvexPolyhedron polyhedron;
+ polyhedron.m_vertices.push_back(tri->m_vertices1[2]);
+ polyhedron.m_vertices.push_back(tri->m_vertices1[0]);
+ polyhedron.m_vertices.push_back(tri->m_vertices1[1]);
- btConvexPolyhedron polyhedron;
- polyhedron.m_vertices.push_back(tri->m_vertices1[2]);
- polyhedron.m_vertices.push_back(tri->m_vertices1[0]);
- polyhedron.m_vertices.push_back(tri->m_vertices1[1]);
-
-
- {
- btFace combinedFaceA;
- combinedFaceA.m_indices.push_back(0);
- combinedFaceA.m_indices.push_back(1);
- combinedFaceA.m_indices.push_back(2);
- btVector3 faceNormal = uniqueEdges[0].cross(uniqueEdges[1]);
- faceNormal.normalize();
- btScalar planeEq=1e30f;
- for (int v=0;v<combinedFaceA.m_indices.size();v++)
{
- btScalar eq = tri->m_vertices1[combinedFaceA.m_indices[v]].dot(faceNormal);
- if (planeEq>eq)
+ btFace combinedFaceA;
+ combinedFaceA.m_indices.push_back(0);
+ combinedFaceA.m_indices.push_back(1);
+ combinedFaceA.m_indices.push_back(2);
+ btVector3 faceNormal = uniqueEdges[0].cross(uniqueEdges[1]);
+ faceNormal.normalize();
+ btScalar planeEq = 1e30f;
+ for (int v = 0; v < combinedFaceA.m_indices.size(); v++)
{
- planeEq=eq;
+ btScalar eq = tri->m_vertices1[combinedFaceA.m_indices[v]].dot(faceNormal);
+ if (planeEq > eq)
+ {
+ planeEq = eq;
+ }
}
+ combinedFaceA.m_plane[0] = faceNormal[0];
+ combinedFaceA.m_plane[1] = faceNormal[1];
+ combinedFaceA.m_plane[2] = faceNormal[2];
+ combinedFaceA.m_plane[3] = -planeEq;
+ polyhedron.m_faces.push_back(combinedFaceA);
}
- combinedFaceA.m_plane[0] = faceNormal[0];
- combinedFaceA.m_plane[1] = faceNormal[1];
- combinedFaceA.m_plane[2] = faceNormal[2];
- combinedFaceA.m_plane[3] = -planeEq;
- polyhedron.m_faces.push_back(combinedFaceA);
- }
- {
- btFace combinedFaceB;
- combinedFaceB.m_indices.push_back(0);
- combinedFaceB.m_indices.push_back(2);
- combinedFaceB.m_indices.push_back(1);
- btVector3 faceNormal = -uniqueEdges[0].cross(uniqueEdges[1]);
- faceNormal.normalize();
- btScalar planeEq=1e30f;
- for (int v=0;v<combinedFaceB.m_indices.size();v++)
{
- btScalar eq = tri->m_vertices1[combinedFaceB.m_indices[v]].dot(faceNormal);
- if (planeEq>eq)
+ btFace combinedFaceB;
+ combinedFaceB.m_indices.push_back(0);
+ combinedFaceB.m_indices.push_back(2);
+ combinedFaceB.m_indices.push_back(1);
+ btVector3 faceNormal = -uniqueEdges[0].cross(uniqueEdges[1]);
+ faceNormal.normalize();
+ btScalar planeEq = 1e30f;
+ for (int v = 0; v < combinedFaceB.m_indices.size(); v++)
{
- planeEq=eq;
+ btScalar eq = tri->m_vertices1[combinedFaceB.m_indices[v]].dot(faceNormal);
+ if (planeEq > eq)
+ {
+ planeEq = eq;
+ }
}
+
+ combinedFaceB.m_plane[0] = faceNormal[0];
+ combinedFaceB.m_plane[1] = faceNormal[1];
+ combinedFaceB.m_plane[2] = faceNormal[2];
+ combinedFaceB.m_plane[3] = -planeEq;
+ polyhedron.m_faces.push_back(combinedFaceB);
}
- combinedFaceB.m_plane[0] = faceNormal[0];
- combinedFaceB.m_plane[1] = faceNormal[1];
- combinedFaceB.m_plane[2] = faceNormal[2];
- combinedFaceB.m_plane[3] = -planeEq;
- polyhedron.m_faces.push_back(combinedFaceB);
- }
+ polyhedron.m_uniqueEdges.push_back(uniqueEdges[0]);
+ polyhedron.m_uniqueEdges.push_back(uniqueEdges[1]);
+ polyhedron.m_uniqueEdges.push_back(uniqueEdges[2]);
+ polyhedron.initialize2();
-
- polyhedron.m_uniqueEdges.push_back(uniqueEdges[0]);
- polyhedron.m_uniqueEdges.push_back(uniqueEdges[1]);
- polyhedron.m_uniqueEdges.push_back(uniqueEdges[2]);
- polyhedron.initialize2();
+ polyhedronB->setPolyhedralFeatures(polyhedron);
+ }
- polyhedronB->setPolyhedralFeatures(polyhedron);
+ foundSepAxis = btPolyhedralContactClipping::findSeparatingAxis(
+ *polyhedronA->getConvexPolyhedron(), *polyhedronB->getConvexPolyhedron(),
+ body0Wrap->getWorldTransform(),
+ body1Wrap->getWorldTransform(),
+ sepNormalWorldSpace, *resultOut);
+ // printf("sepNormalWorldSpace=%f,%f,%f\n",sepNormalWorldSpace.getX(),sepNormalWorldSpace.getY(),sepNormalWorldSpace.getZ());
}
-
-
-
- foundSepAxis = btPolyhedralContactClipping::findSeparatingAxis(
- *polyhedronA->getConvexPolyhedron(), *polyhedronB->getConvexPolyhedron(),
- body0Wrap->getWorldTransform(),
- body1Wrap->getWorldTransform(),
- sepNormalWorldSpace,*resultOut);
- // printf("sepNormalWorldSpace=%f,%f,%f\n",sepNormalWorldSpace.getX(),sepNormalWorldSpace.getY(),sepNormalWorldSpace.getZ());
-
- }
- else
- {
+ else
+ {
#ifdef ZERO_MARGIN
- gjkPairDetector.setIgnoreMargin(true);
- gjkPairDetector.getClosestPoints(input,*resultOut,dispatchInfo.m_debugDraw);
+ gjkPairDetector.setIgnoreMargin(true);
+ gjkPairDetector.getClosestPoints(input, *resultOut, dispatchInfo.m_debugDraw);
#else
- gjkPairDetector.getClosestPoints(input,dummy,dispatchInfo.m_debugDraw);
-#endif//ZERO_MARGIN
-
- if (dummy.m_hasContact && dummy.m_depth<0)
- {
-
- if (foundSepAxis)
+ gjkPairDetector.getClosestPoints(input, dummy, dispatchInfo.m_debugDraw);
+#endif //ZERO_MARGIN
+
+ if (dummy.m_hasContact && dummy.m_depth < 0)
{
- if (dummy.m_normalOnBInWorld.dot(sepNormalWorldSpace)<0.99)
+ if (foundSepAxis)
{
- printf("?\n");
+ if (dummy.m_normalOnBInWorld.dot(sepNormalWorldSpace) < 0.99)
+ {
+ printf("?\n");
+ }
}
- } else
- {
- printf("!\n");
+ else
+ {
+ printf("!\n");
+ }
+ sepNormalWorldSpace.setValue(0, 0, 1); // = dummy.m_normalOnBInWorld;
+ //minDist = dummy.m_depth;
+ foundSepAxis = true;
}
- sepNormalWorldSpace.setValue(0,0,1);// = dummy.m_normalOnBInWorld;
- //minDist = dummy.m_depth;
- foundSepAxis = true;
- }
#if 0
btScalar l2 = gjkPairDetector.getCachedSeparatingAxis().length2();
if (l2>SIMD_EPSILON)
@@ -728,145 +677,131 @@ void btConvexConvexAlgorithm ::processCollision (const btCollisionObjectWrapper*
foundSepAxis = true;
}
#endif
- }
+ }
-
- if (foundSepAxis)
- {
- worldVertsB2.resize(0);
- btPolyhedralContactClipping::clipFaceAgainstHull(sepNormalWorldSpace, *polyhedronA->getConvexPolyhedron(),
- body0Wrap->getWorldTransform(), worldSpaceVertices, worldVertsB2,minDist-threshold, maxDist, *resultOut);
- }
-
-
- if (m_ownManifold)
- {
- resultOut->refreshContactPoints();
+ if (foundSepAxis)
+ {
+ worldVertsB2.resize(0);
+ btPolyhedralContactClipping::clipFaceAgainstHull(sepNormalWorldSpace, *polyhedronA->getConvexPolyhedron(),
+ body0Wrap->getWorldTransform(), worldSpaceVertices, worldVertsB2, minDist - threshold, maxDist, *resultOut);
+ }
+
+ if (m_ownManifold)
+ {
+ resultOut->refreshContactPoints();
+ }
+
+ return;
}
-
- return;
}
-
-
}
+ gjkPairDetector.getClosestPoints(input, *resultOut, dispatchInfo.m_debugDraw);
- }
-
- gjkPairDetector.getClosestPoints(input,*resultOut,dispatchInfo.m_debugDraw);
+ //now perform 'm_numPerturbationIterations' collision queries with the perturbated collision objects
- //now perform 'm_numPerturbationIterations' collision queries with the perturbated collision objects
-
- //perform perturbation when more then 'm_minimumPointsPerturbationThreshold' points
- if (m_numPerturbationIterations && resultOut->getPersistentManifold()->getNumContacts() < m_minimumPointsPerturbationThreshold)
- {
-
- int i;
- btVector3 v0,v1;
- btVector3 sepNormalWorldSpace;
- btScalar l2 = gjkPairDetector.getCachedSeparatingAxis().length2();
-
- if (l2>SIMD_EPSILON)
+ //perform perturbation when more then 'm_minimumPointsPerturbationThreshold' points
+ if (m_numPerturbationIterations && resultOut->getPersistentManifold()->getNumContacts() < m_minimumPointsPerturbationThreshold)
{
- sepNormalWorldSpace = gjkPairDetector.getCachedSeparatingAxis()*(1.f/l2);
-
- btPlaneSpace1(sepNormalWorldSpace,v0,v1);
-
+ int i;
+ btVector3 v0, v1;
+ btVector3 sepNormalWorldSpace;
+ btScalar l2 = gjkPairDetector.getCachedSeparatingAxis().length2();
- bool perturbeA = true;
- const btScalar angleLimit = 0.125f * SIMD_PI;
- btScalar perturbeAngle;
- btScalar radiusA = min0->getAngularMotionDisc();
- btScalar radiusB = min1->getAngularMotionDisc();
- if (radiusA < radiusB)
- {
- perturbeAngle = gContactBreakingThreshold /radiusA;
- perturbeA = true;
- } else
+ if (l2 > SIMD_EPSILON)
{
- perturbeAngle = gContactBreakingThreshold / radiusB;
- perturbeA = false;
- }
- if ( perturbeAngle > angleLimit )
- perturbeAngle = angleLimit;
+ sepNormalWorldSpace = gjkPairDetector.getCachedSeparatingAxis() * (1.f / l2);
- btTransform unPerturbedTransform;
- if (perturbeA)
- {
- unPerturbedTransform = input.m_transformA;
- } else
- {
- unPerturbedTransform = input.m_transformB;
- }
-
- for ( i=0;i<m_numPerturbationIterations;i++)
- {
- if (v0.length2()>SIMD_EPSILON)
+ btPlaneSpace1(sepNormalWorldSpace, v0, v1);
+
+ bool perturbeA = true;
+ const btScalar angleLimit = 0.125f * SIMD_PI;
+ btScalar perturbeAngle;
+ btScalar radiusA = min0->getAngularMotionDisc();
+ btScalar radiusB = min1->getAngularMotionDisc();
+ if (radiusA < radiusB)
{
- btQuaternion perturbeRot(v0,perturbeAngle);
- btScalar iterationAngle = i*(SIMD_2_PI/btScalar(m_numPerturbationIterations));
- btQuaternion rotq(sepNormalWorldSpace,iterationAngle);
-
-
+ perturbeAngle = gContactBreakingThreshold / radiusA;
+ perturbeA = true;
+ }
+ else
+ {
+ perturbeAngle = gContactBreakingThreshold / radiusB;
+ perturbeA = false;
+ }
+ if (perturbeAngle > angleLimit)
+ perturbeAngle = angleLimit;
+
+ btTransform unPerturbedTransform;
if (perturbeA)
{
- input.m_transformA.setBasis( btMatrix3x3(rotq.inverse()*perturbeRot*rotq)*body0Wrap->getWorldTransform().getBasis());
- input.m_transformB = body1Wrap->getWorldTransform();
- #ifdef DEBUG_CONTACTS
- dispatchInfo.m_debugDraw->drawTransform(input.m_transformA,10.0);
- #endif //DEBUG_CONTACTS
- } else
+ unPerturbedTransform = input.m_transformA;
+ }
+ else
{
- input.m_transformA = body0Wrap->getWorldTransform();
- input.m_transformB.setBasis( btMatrix3x3(rotq.inverse()*perturbeRot*rotq)*body1Wrap->getWorldTransform().getBasis());
- #ifdef DEBUG_CONTACTS
- dispatchInfo.m_debugDraw->drawTransform(input.m_transformB,10.0);
- #endif
+ unPerturbedTransform = input.m_transformB;
}
-
- btPerturbedContactResult perturbedResultOut(resultOut,input.m_transformA,input.m_transformB,unPerturbedTransform,perturbeA,dispatchInfo.m_debugDraw);
- gjkPairDetector.getClosestPoints(input,perturbedResultOut,dispatchInfo.m_debugDraw);
+
+ for (i = 0; i < m_numPerturbationIterations; i++)
+ {
+ if (v0.length2() > SIMD_EPSILON)
+ {
+ btQuaternion perturbeRot(v0, perturbeAngle);
+ btScalar iterationAngle = i * (SIMD_2_PI / btScalar(m_numPerturbationIterations));
+ btQuaternion rotq(sepNormalWorldSpace, iterationAngle);
+
+ if (perturbeA)
+ {
+ input.m_transformA.setBasis(btMatrix3x3(rotq.inverse() * perturbeRot * rotq) * body0Wrap->getWorldTransform().getBasis());
+ input.m_transformB = body1Wrap->getWorldTransform();
+#ifdef DEBUG_CONTACTS
+ dispatchInfo.m_debugDraw->drawTransform(input.m_transformA, 10.0);
+#endif //DEBUG_CONTACTS
+ }
+ else
+ {
+ input.m_transformA = body0Wrap->getWorldTransform();
+ input.m_transformB.setBasis(btMatrix3x3(rotq.inverse() * perturbeRot * rotq) * body1Wrap->getWorldTransform().getBasis());
+#ifdef DEBUG_CONTACTS
+ dispatchInfo.m_debugDraw->drawTransform(input.m_transformB, 10.0);
+#endif
+ }
+
+ btPerturbedContactResult perturbedResultOut(resultOut, input.m_transformA, input.m_transformB, unPerturbedTransform, perturbeA, dispatchInfo.m_debugDraw);
+ gjkPairDetector.getClosestPoints(input, perturbedResultOut, dispatchInfo.m_debugDraw);
+ }
}
}
}
- }
-
-
#ifdef USE_SEPDISTANCE_UTIL2
- if (dispatchInfo.m_useConvexConservativeDistanceUtil && (sepDist>SIMD_EPSILON))
- {
- m_sepDistance.initSeparatingDistance(gjkPairDetector.getCachedSeparatingAxis(),sepDist,body0->getWorldTransform(),body1->getWorldTransform());
- }
-#endif //USE_SEPDISTANCE_UTIL2
-
-
+ if (dispatchInfo.m_useConvexConservativeDistanceUtil && (sepDist > SIMD_EPSILON))
+ {
+ m_sepDistance.initSeparatingDistance(gjkPairDetector.getCachedSeparatingAxis(), sepDist, body0->getWorldTransform(), body1->getWorldTransform());
+ }
+#endif //USE_SEPDISTANCE_UTIL2
}
if (m_ownManifold)
{
resultOut->refreshContactPoints();
}
-
}
-
-
bool disableCcd = false;
-btScalar btConvexConvexAlgorithm::calculateTimeOfImpact(btCollisionObject* col0,btCollisionObject* col1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+btScalar btConvexConvexAlgorithm::calculateTimeOfImpact(btCollisionObject* col0, btCollisionObject* col1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
(void)resultOut;
(void)dispatchInfo;
///Rather then checking ALL pairs, only calculate TOI when motion exceeds threshold
-
+
///Linear motion for one of objects needs to exceed m_ccdSquareMotionThreshold
///col0->m_worldTransform,
btScalar resultFraction = btScalar(1.);
-
btScalar squareMot0 = (col0->getInterpolationWorldTransform().getOrigin() - col0->getWorldTransform().getOrigin()).length2();
btScalar squareMot1 = (col1->getInterpolationWorldTransform().getOrigin() - col1->getWorldTransform().getOrigin()).length2();
-
+
if (squareMot0 < col0->getCcdSquareMotionThreshold() &&
squareMot1 < col1->getCcdSquareMotionThreshold())
return resultFraction;
@@ -874,77 +809,65 @@ btScalar btConvexConvexAlgorithm::calculateTimeOfImpact(btCollisionObject* col0,
if (disableCcd)
return btScalar(1.);
-
//An adhoc way of testing the Continuous Collision Detection algorithms
//One object is approximated as a sphere, to simplify things
//Starting in penetration should report no time of impact
//For proper CCD, better accuracy and handling of 'allowed' penetration should be added
//also the mainloop of the physics should have a kind of toi queue (something like Brian Mirtich's application of Timewarp for Rigidbodies)
-
/// Convex0 against sphere for Convex1
{
btConvexShape* convex0 = static_cast<btConvexShape*>(col0->getCollisionShape());
- btSphereShape sphere1(col1->getCcdSweptSphereRadius()); //todo: allow non-zero sphere sizes, for better approximation
+ btSphereShape sphere1(col1->getCcdSweptSphereRadius()); //todo: allow non-zero sphere sizes, for better approximation
btConvexCast::CastResult result;
btVoronoiSimplexSolver voronoiSimplex;
//SubsimplexConvexCast ccd0(&sphere,min0,&voronoiSimplex);
///Simplification, one object is simplified as a sphere
- btGjkConvexCast ccd1( convex0 ,&sphere1,&voronoiSimplex);
+ btGjkConvexCast ccd1(convex0, &sphere1, &voronoiSimplex);
//ContinuousConvexCollision ccd(min0,min1,&voronoiSimplex,0);
- if (ccd1.calcTimeOfImpact(col0->getWorldTransform(),col0->getInterpolationWorldTransform(),
- col1->getWorldTransform(),col1->getInterpolationWorldTransform(),result))
+ if (ccd1.calcTimeOfImpact(col0->getWorldTransform(), col0->getInterpolationWorldTransform(),
+ col1->getWorldTransform(), col1->getInterpolationWorldTransform(), result))
{
-
//store result.m_fraction in both bodies
-
- if (col0->getHitFraction()> result.m_fraction)
- col0->setHitFraction( result.m_fraction );
+
+ if (col0->getHitFraction() > result.m_fraction)
+ col0->setHitFraction(result.m_fraction);
if (col1->getHitFraction() > result.m_fraction)
- col1->setHitFraction( result.m_fraction);
+ col1->setHitFraction(result.m_fraction);
if (resultFraction > result.m_fraction)
resultFraction = result.m_fraction;
-
}
-
-
-
-
}
/// Sphere (for convex0) against Convex1
{
btConvexShape* convex1 = static_cast<btConvexShape*>(col1->getCollisionShape());
- btSphereShape sphere0(col0->getCcdSweptSphereRadius()); //todo: allow non-zero sphere sizes, for better approximation
+ btSphereShape sphere0(col0->getCcdSweptSphereRadius()); //todo: allow non-zero sphere sizes, for better approximation
btConvexCast::CastResult result;
btVoronoiSimplexSolver voronoiSimplex;
//SubsimplexConvexCast ccd0(&sphere,min0,&voronoiSimplex);
///Simplification, one object is simplified as a sphere
- btGjkConvexCast ccd1(&sphere0,convex1,&voronoiSimplex);
+ btGjkConvexCast ccd1(&sphere0, convex1, &voronoiSimplex);
//ContinuousConvexCollision ccd(min0,min1,&voronoiSimplex,0);
- if (ccd1.calcTimeOfImpact(col0->getWorldTransform(),col0->getInterpolationWorldTransform(),
- col1->getWorldTransform(),col1->getInterpolationWorldTransform(),result))
+ if (ccd1.calcTimeOfImpact(col0->getWorldTransform(), col0->getInterpolationWorldTransform(),
+ col1->getWorldTransform(), col1->getInterpolationWorldTransform(), result))
{
-
//store result.m_fraction in both bodies
-
- if (col0->getHitFraction() > result.m_fraction)
- col0->setHitFraction( result.m_fraction);
+
+ if (col0->getHitFraction() > result.m_fraction)
+ col0->setHitFraction(result.m_fraction);
if (col1->getHitFraction() > result.m_fraction)
- col1->setHitFraction( result.m_fraction);
+ col1->setHitFraction(result.m_fraction);
if (resultFraction > result.m_fraction)
resultFraction = result.m_fraction;
-
}
}
-
- return resultFraction;
+ return resultFraction;
}
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h
index cd75ba12d7..eac5b4d824 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h
@@ -23,7 +23,7 @@ subject to the following restrictions:
#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h"
#include "btCollisionCreateFunc.h"
#include "btCollisionDispatcher.h"
-#include "LinearMath/btTransformUtil.h" //for btConvexSeparatingDistanceUtil
+#include "LinearMath/btTransformUtil.h" //for btConvexSeparatingDistanceUtil
#include "BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.h"
class btConvexPenetrationDepthSolver;
@@ -41,69 +41,61 @@ class btConvexPenetrationDepthSolver;
class btConvexConvexAlgorithm : public btActivatingCollisionAlgorithm
{
#ifdef USE_SEPDISTANCE_UTIL2
- btConvexSeparatingDistanceUtil m_sepDistance;
+ btConvexSeparatingDistanceUtil m_sepDistance;
#endif
btConvexPenetrationDepthSolver* m_pdSolver;
btVertexArray worldVertsB1;
btVertexArray worldVertsB2;
-
- bool m_ownManifold;
- btPersistentManifold* m_manifoldPtr;
- bool m_lowLevelOfDetail;
-
+
+ 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);
+ 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 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 btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut);
- virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
+ 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);
- void setLowLevelOfDetail(bool useLowLevel);
-
-
- const btPersistentManifold* getManifold()
+ const btPersistentManifold* getManifold()
{
return m_manifoldPtr;
}
- struct CreateFunc :public btCollisionAlgorithmCreateFunc
+ struct CreateFunc : public btCollisionAlgorithmCreateFunc
{
-
- btConvexPenetrationDepthSolver* m_pdSolver;
+ 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)
+ 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);
+ return new (mem) btConvexConvexAlgorithm(ci.m_manifold, ci, body0Wrap, body1Wrap, m_pdSolver, m_numPerturbationIterations, m_minimumPointsPerturbationThreshold);
}
};
-
-
};
-#endif //BT_CONVEX_CONVEX_ALGORITHM_H
+#endif //BT_CONVEX_CONVEX_ALGORITHM_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.cpp
index cce2d95bcf..ba1bc06b69 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.cpp
@@ -23,25 +23,24 @@ subject to the following restrictions:
//#include <stdio.h>
-btConvexPlaneCollisionAlgorithm::btConvexPlaneCollisionAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* col0Wrap,const btCollisionObjectWrapper* col1Wrap, bool isSwapped, int numPerturbationIterations,int minimumPointsPerturbationThreshold)
-: btCollisionAlgorithm(ci),
-m_ownManifold(false),
-m_manifoldPtr(mf),
-m_isSwapped(isSwapped),
-m_numPerturbationIterations(numPerturbationIterations),
-m_minimumPointsPerturbationThreshold(minimumPointsPerturbationThreshold)
+btConvexPlaneCollisionAlgorithm::btConvexPlaneCollisionAlgorithm(btPersistentManifold* mf, const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* col0Wrap, const btCollisionObjectWrapper* col1Wrap, bool isSwapped, int numPerturbationIterations, int minimumPointsPerturbationThreshold)
+ : btCollisionAlgorithm(ci),
+ m_ownManifold(false),
+ m_manifoldPtr(mf),
+ m_isSwapped(isSwapped),
+ m_numPerturbationIterations(numPerturbationIterations),
+ m_minimumPointsPerturbationThreshold(minimumPointsPerturbationThreshold)
{
- const btCollisionObjectWrapper* convexObjWrap = m_isSwapped? col1Wrap : col0Wrap;
- const btCollisionObjectWrapper* planeObjWrap = m_isSwapped? col0Wrap : col1Wrap;
+ const btCollisionObjectWrapper* convexObjWrap = m_isSwapped ? col1Wrap : col0Wrap;
+ const btCollisionObjectWrapper* planeObjWrap = m_isSwapped ? col0Wrap : col1Wrap;
- if (!m_manifoldPtr && m_dispatcher->needsCollision(convexObjWrap->getCollisionObject(),planeObjWrap->getCollisionObject()))
+ if (!m_manifoldPtr && m_dispatcher->needsCollision(convexObjWrap->getCollisionObject(), planeObjWrap->getCollisionObject()))
{
- m_manifoldPtr = m_dispatcher->getNewManifold(convexObjWrap->getCollisionObject(),planeObjWrap->getCollisionObject());
+ m_manifoldPtr = m_dispatcher->getNewManifold(convexObjWrap->getCollisionObject(), planeObjWrap->getCollisionObject());
m_ownManifold = true;
}
}
-
btConvexPlaneCollisionAlgorithm::~btConvexPlaneCollisionAlgorithm()
{
if (m_ownManifold)
@@ -51,32 +50,32 @@ btConvexPlaneCollisionAlgorithm::~btConvexPlaneCollisionAlgorithm()
}
}
-void btConvexPlaneCollisionAlgorithm::collideSingleContact (const btQuaternion& perturbeRot, const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+void btConvexPlaneCollisionAlgorithm::collideSingleContact(const btQuaternion& perturbeRot, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
- const btCollisionObjectWrapper* convexObjWrap = m_isSwapped? body1Wrap : body0Wrap;
- const btCollisionObjectWrapper* planeObjWrap = m_isSwapped? body0Wrap: body1Wrap;
+ const btCollisionObjectWrapper* convexObjWrap = m_isSwapped ? body1Wrap : body0Wrap;
+ const btCollisionObjectWrapper* planeObjWrap = m_isSwapped ? body0Wrap : body1Wrap;
- btConvexShape* convexShape = (btConvexShape*) convexObjWrap->getCollisionShape();
- btStaticPlaneShape* planeShape = (btStaticPlaneShape*) planeObjWrap->getCollisionShape();
+ btConvexShape* convexShape = (btConvexShape*)convexObjWrap->getCollisionShape();
+ btStaticPlaneShape* planeShape = (btStaticPlaneShape*)planeObjWrap->getCollisionShape();
- bool hasCollision = false;
+ bool hasCollision = false;
const btVector3& planeNormal = planeShape->getPlaneNormal();
const btScalar& planeConstant = planeShape->getPlaneConstant();
-
+
btTransform convexWorldTransform = convexObjWrap->getWorldTransform();
btTransform convexInPlaneTrans;
- convexInPlaneTrans= planeObjWrap->getWorldTransform().inverse() * convexWorldTransform;
+ convexInPlaneTrans = planeObjWrap->getWorldTransform().inverse() * convexWorldTransform;
//now perturbe the convex-world transform
- convexWorldTransform.getBasis()*=btMatrix3x3(perturbeRot);
+ convexWorldTransform.getBasis() *= btMatrix3x3(perturbeRot);
btTransform planeInConvex;
- planeInConvex= convexWorldTransform.inverse() * planeObjWrap->getWorldTransform();
-
- btVector3 vtx = convexShape->localGetSupportingVertex(planeInConvex.getBasis()*-planeNormal);
+ planeInConvex = convexWorldTransform.inverse() * planeObjWrap->getWorldTransform();
+
+ btVector3 vtx = convexShape->localGetSupportingVertex(planeInConvex.getBasis() * -planeNormal);
btVector3 vtxInPlane = convexInPlaneTrans(vtx);
btScalar distance = (planeNormal.dot(vtxInPlane) - planeConstant);
- btVector3 vtxInPlaneProjected = vtxInPlane - distance*planeNormal;
+ btVector3 vtxInPlaneProjected = vtxInPlane - distance * planeNormal;
btVector3 vtxInPlaneWorld = planeObjWrap->getWorldTransform() * vtxInPlaneProjected;
hasCollision = distance < m_manifoldPtr->getContactBreakingThreshold();
@@ -86,70 +85,69 @@ void btConvexPlaneCollisionAlgorithm::collideSingleContact (const btQuaternion&
/// report a contact. internally this will be kept persistent, and contact reduction is done
btVector3 normalOnSurfaceB = planeObjWrap->getWorldTransform().getBasis() * planeNormal;
btVector3 pOnB = vtxInPlaneWorld;
- resultOut->addContactPoint(normalOnSurfaceB,pOnB,distance);
+ resultOut->addContactPoint(normalOnSurfaceB, pOnB, distance);
}
}
-
-void btConvexPlaneCollisionAlgorithm::processCollision (const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+void btConvexPlaneCollisionAlgorithm::processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
(void)dispatchInfo;
if (!m_manifoldPtr)
return;
- const btCollisionObjectWrapper* convexObjWrap = m_isSwapped? body1Wrap : body0Wrap;
- const btCollisionObjectWrapper* planeObjWrap = m_isSwapped? body0Wrap: body1Wrap;
+ const btCollisionObjectWrapper* convexObjWrap = m_isSwapped ? body1Wrap : body0Wrap;
+ const btCollisionObjectWrapper* planeObjWrap = m_isSwapped ? body0Wrap : body1Wrap;
- btConvexShape* convexShape = (btConvexShape*) convexObjWrap->getCollisionShape();
- btStaticPlaneShape* planeShape = (btStaticPlaneShape*) planeObjWrap->getCollisionShape();
+ btConvexShape* convexShape = (btConvexShape*)convexObjWrap->getCollisionShape();
+ btStaticPlaneShape* planeShape = (btStaticPlaneShape*)planeObjWrap->getCollisionShape();
bool hasCollision = false;
const btVector3& planeNormal = planeShape->getPlaneNormal();
const btScalar& planeConstant = planeShape->getPlaneConstant();
btTransform planeInConvex;
- planeInConvex= convexObjWrap->getWorldTransform().inverse() * planeObjWrap->getWorldTransform();
+ planeInConvex = convexObjWrap->getWorldTransform().inverse() * planeObjWrap->getWorldTransform();
btTransform convexInPlaneTrans;
- convexInPlaneTrans= planeObjWrap->getWorldTransform().inverse() * convexObjWrap->getWorldTransform();
+ convexInPlaneTrans = planeObjWrap->getWorldTransform().inverse() * convexObjWrap->getWorldTransform();
- btVector3 vtx = convexShape->localGetSupportingVertex(planeInConvex.getBasis()*-planeNormal);
+ btVector3 vtx = convexShape->localGetSupportingVertex(planeInConvex.getBasis() * -planeNormal);
btVector3 vtxInPlane = convexInPlaneTrans(vtx);
btScalar distance = (planeNormal.dot(vtxInPlane) - planeConstant);
- btVector3 vtxInPlaneProjected = vtxInPlane - distance*planeNormal;
+ btVector3 vtxInPlaneProjected = vtxInPlane - distance * planeNormal;
btVector3 vtxInPlaneWorld = planeObjWrap->getWorldTransform() * vtxInPlaneProjected;
- hasCollision = distance < m_manifoldPtr->getContactBreakingThreshold();
+ hasCollision = distance < m_manifoldPtr->getContactBreakingThreshold()+ resultOut->m_closestPointDistanceThreshold;
resultOut->setPersistentManifold(m_manifoldPtr);
if (hasCollision)
{
/// report a contact. internally this will be kept persistent, and contact reduction is done
btVector3 normalOnSurfaceB = planeObjWrap->getWorldTransform().getBasis() * planeNormal;
btVector3 pOnB = vtxInPlaneWorld;
- resultOut->addContactPoint(normalOnSurfaceB,pOnB,distance);
+ resultOut->addContactPoint(normalOnSurfaceB, pOnB, distance);
}
//the perturbation algorithm doesn't work well with implicit surfaces such as spheres, cylinder and cones:
//they keep on rolling forever because of the additional off-center contact points
//so only enable the feature for polyhedral shapes (btBoxShape, btConvexHullShape etc)
- if (convexShape->isPolyhedral() && resultOut->getPersistentManifold()->getNumContacts()<m_minimumPointsPerturbationThreshold)
+ if (convexShape->isPolyhedral() && resultOut->getPersistentManifold()->getNumContacts() < m_minimumPointsPerturbationThreshold)
{
- btVector3 v0,v1;
- btPlaneSpace1(planeNormal,v0,v1);
+ btVector3 v0, v1;
+ btPlaneSpace1(planeNormal, v0, v1);
//now perform 'm_numPerturbationIterations' collision queries with the perturbated collision objects
const btScalar angleLimit = 0.125f * SIMD_PI;
btScalar perturbeAngle;
btScalar radius = convexShape->getAngularMotionDisc();
perturbeAngle = gContactBreakingThreshold / radius;
- if ( perturbeAngle > angleLimit )
- perturbeAngle = angleLimit;
+ if (perturbeAngle > angleLimit)
+ perturbeAngle = angleLimit;
- btQuaternion perturbeRot(v0,perturbeAngle);
- for (int i=0;i<m_numPerturbationIterations;i++)
+ btQuaternion perturbeRot(v0, perturbeAngle);
+ for (int i = 0; i < m_numPerturbationIterations; i++)
{
- btScalar iterationAngle = i*(SIMD_2_PI/btScalar(m_numPerturbationIterations));
- btQuaternion rotq(planeNormal,iterationAngle);
- collideSingleContact(rotq.inverse()*perturbeRot*rotq,body0Wrap,body1Wrap,dispatchInfo,resultOut);
+ btScalar iterationAngle = i * (SIMD_2_PI / btScalar(m_numPerturbationIterations));
+ btQuaternion rotq(planeNormal, iterationAngle);
+ collideSingleContact(rotq.inverse() * perturbeRot * rotq, body0Wrap, body1Wrap, dispatchInfo, resultOut);
}
}
@@ -162,7 +160,7 @@ void btConvexPlaneCollisionAlgorithm::processCollision (const btCollisionObjectW
}
}
-btScalar btConvexPlaneCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* col0,btCollisionObject* col1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+btScalar btConvexPlaneCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* col0, btCollisionObject* col1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
(void)resultOut;
(void)dispatchInfo;
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.h
index d28c430c4c..b693da118f 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.h
@@ -28,25 +28,24 @@ class btPersistentManifold;
/// 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;
+ 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);
+ 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);
+ 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);
+ 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 btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut);
- virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
+ virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
{
if (m_manifoldPtr && m_ownManifold)
{
@@ -54,31 +53,30 @@ public:
}
}
- struct CreateFunc :public btCollisionAlgorithmCreateFunc
+ struct CreateFunc : public btCollisionAlgorithmCreateFunc
{
- int m_numPerturbationIterations;
+ int m_numPerturbationIterations;
int m_minimumPointsPerturbationThreshold;
-
- CreateFunc()
+
+ CreateFunc()
: m_numPerturbationIterations(1),
- m_minimumPointsPerturbationThreshold(0)
+ m_minimumPointsPerturbationThreshold(0)
{
}
-
- virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap)
+
+ 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, false, m_numPerturbationIterations, m_minimumPointsPerturbationThreshold);
+ }
+ else
{
- return new(mem) btConvexPlaneCollisionAlgorithm(0,ci,body0Wrap,body1Wrap,true,m_numPerturbationIterations,m_minimumPointsPerturbationThreshold);
+ return new (mem) btConvexPlaneCollisionAlgorithm(0, ci, body0Wrap, body1Wrap, true, m_numPerturbationIterations, m_minimumPointsPerturbationThreshold);
}
}
};
-
};
-#endif //BT_CONVEX_PLANE_COLLISION_ALGORITHM_H
-
+#endif //BT_CONVEX_PLANE_COLLISION_ALGORITHM_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.cpp
index f6e4e57b0a..ef3ea9e394 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.cpp
@@ -26,114 +26,108 @@ subject to the following restrictions:
#include "BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h"
#ifdef USE_BUGGY_SPHERE_BOX_ALGORITHM
#include "BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.h"
-#endif //USE_BUGGY_SPHERE_BOX_ALGORITHM
+#endif //USE_BUGGY_SPHERE_BOX_ALGORITHM
#include "BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h"
#include "BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h"
#include "BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h"
#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h"
-
-
#include "LinearMath/btPoolAllocator.h"
-
-
-
-
btDefaultCollisionConfiguration::btDefaultCollisionConfiguration(const btDefaultCollisionConstructionInfo& constructionInfo)
//btDefaultCollisionConfiguration::btDefaultCollisionConfiguration(btStackAlloc* stackAlloc,btPoolAllocator* persistentManifoldPool,btPoolAllocator* collisionAlgorithmPool)
{
-
- void* mem = NULL;
+ void* mem = NULL;
if (constructionInfo.m_useEpaPenetrationAlgorithm)
{
- mem = btAlignedAlloc(sizeof(btGjkEpaPenetrationDepthSolver),16);
- m_pdSolver = new (mem)btGjkEpaPenetrationDepthSolver;
- }else
+ mem = btAlignedAlloc(sizeof(btGjkEpaPenetrationDepthSolver), 16);
+ m_pdSolver = new (mem) btGjkEpaPenetrationDepthSolver;
+ }
+ else
{
- mem = btAlignedAlloc(sizeof(btMinkowskiPenetrationDepthSolver),16);
- m_pdSolver = new (mem)btMinkowskiPenetrationDepthSolver;
+ mem = btAlignedAlloc(sizeof(btMinkowskiPenetrationDepthSolver), 16);
+ m_pdSolver = new (mem) btMinkowskiPenetrationDepthSolver;
}
-
+
//default CreationFunctions, filling the m_doubleDispatch table
- mem = btAlignedAlloc(sizeof(btConvexConvexAlgorithm::CreateFunc),16);
- m_convexConvexCreateFunc = new(mem) btConvexConvexAlgorithm::CreateFunc(m_pdSolver);
- mem = btAlignedAlloc(sizeof(btConvexConcaveCollisionAlgorithm::CreateFunc),16);
- m_convexConcaveCreateFunc = new (mem)btConvexConcaveCollisionAlgorithm::CreateFunc;
- mem = btAlignedAlloc(sizeof(btConvexConcaveCollisionAlgorithm::CreateFunc),16);
- m_swappedConvexConcaveCreateFunc = new (mem)btConvexConcaveCollisionAlgorithm::SwappedCreateFunc;
- mem = btAlignedAlloc(sizeof(btCompoundCollisionAlgorithm::CreateFunc),16);
- m_compoundCreateFunc = new (mem)btCompoundCollisionAlgorithm::CreateFunc;
-
- mem = btAlignedAlloc(sizeof(btCompoundCompoundCollisionAlgorithm::CreateFunc),16);
- m_compoundCompoundCreateFunc = new (mem)btCompoundCompoundCollisionAlgorithm::CreateFunc;
-
- mem = btAlignedAlloc(sizeof(btCompoundCollisionAlgorithm::SwappedCreateFunc),16);
- m_swappedCompoundCreateFunc = new (mem)btCompoundCollisionAlgorithm::SwappedCreateFunc;
- mem = btAlignedAlloc(sizeof(btEmptyAlgorithm::CreateFunc),16);
- m_emptyCreateFunc = new(mem) btEmptyAlgorithm::CreateFunc;
-
- mem = btAlignedAlloc(sizeof(btSphereSphereCollisionAlgorithm::CreateFunc),16);
- m_sphereSphereCF = new(mem) btSphereSphereCollisionAlgorithm::CreateFunc;
+ mem = btAlignedAlloc(sizeof(btConvexConvexAlgorithm::CreateFunc), 16);
+ m_convexConvexCreateFunc = new (mem) btConvexConvexAlgorithm::CreateFunc(m_pdSolver);
+ mem = btAlignedAlloc(sizeof(btConvexConcaveCollisionAlgorithm::CreateFunc), 16);
+ m_convexConcaveCreateFunc = new (mem) btConvexConcaveCollisionAlgorithm::CreateFunc;
+ mem = btAlignedAlloc(sizeof(btConvexConcaveCollisionAlgorithm::CreateFunc), 16);
+ m_swappedConvexConcaveCreateFunc = new (mem) btConvexConcaveCollisionAlgorithm::SwappedCreateFunc;
+ mem = btAlignedAlloc(sizeof(btCompoundCollisionAlgorithm::CreateFunc), 16);
+ m_compoundCreateFunc = new (mem) btCompoundCollisionAlgorithm::CreateFunc;
+
+ mem = btAlignedAlloc(sizeof(btCompoundCompoundCollisionAlgorithm::CreateFunc), 16);
+ m_compoundCompoundCreateFunc = new (mem) btCompoundCompoundCollisionAlgorithm::CreateFunc;
+
+ mem = btAlignedAlloc(sizeof(btCompoundCollisionAlgorithm::SwappedCreateFunc), 16);
+ m_swappedCompoundCreateFunc = new (mem) btCompoundCollisionAlgorithm::SwappedCreateFunc;
+ mem = btAlignedAlloc(sizeof(btEmptyAlgorithm::CreateFunc), 16);
+ m_emptyCreateFunc = new (mem) btEmptyAlgorithm::CreateFunc;
+
+ mem = btAlignedAlloc(sizeof(btSphereSphereCollisionAlgorithm::CreateFunc), 16);
+ m_sphereSphereCF = new (mem) btSphereSphereCollisionAlgorithm::CreateFunc;
#ifdef USE_BUGGY_SPHERE_BOX_ALGORITHM
- mem = btAlignedAlloc(sizeof(btSphereBoxCollisionAlgorithm::CreateFunc),16);
- m_sphereBoxCF = new(mem) btSphereBoxCollisionAlgorithm::CreateFunc;
- mem = btAlignedAlloc(sizeof(btSphereBoxCollisionAlgorithm::CreateFunc),16);
- m_boxSphereCF = new (mem)btSphereBoxCollisionAlgorithm::CreateFunc;
+ mem = btAlignedAlloc(sizeof(btSphereBoxCollisionAlgorithm::CreateFunc), 16);
+ m_sphereBoxCF = new (mem) btSphereBoxCollisionAlgorithm::CreateFunc;
+ mem = btAlignedAlloc(sizeof(btSphereBoxCollisionAlgorithm::CreateFunc), 16);
+ m_boxSphereCF = new (mem) btSphereBoxCollisionAlgorithm::CreateFunc;
m_boxSphereCF->m_swapped = true;
-#endif //USE_BUGGY_SPHERE_BOX_ALGORITHM
+#endif //USE_BUGGY_SPHERE_BOX_ALGORITHM
- mem = btAlignedAlloc(sizeof(btSphereTriangleCollisionAlgorithm::CreateFunc),16);
- m_sphereTriangleCF = new (mem)btSphereTriangleCollisionAlgorithm::CreateFunc;
- mem = btAlignedAlloc(sizeof(btSphereTriangleCollisionAlgorithm::CreateFunc),16);
- m_triangleSphereCF = new (mem)btSphereTriangleCollisionAlgorithm::CreateFunc;
+ mem = btAlignedAlloc(sizeof(btSphereTriangleCollisionAlgorithm::CreateFunc), 16);
+ m_sphereTriangleCF = new (mem) btSphereTriangleCollisionAlgorithm::CreateFunc;
+ mem = btAlignedAlloc(sizeof(btSphereTriangleCollisionAlgorithm::CreateFunc), 16);
+ m_triangleSphereCF = new (mem) btSphereTriangleCollisionAlgorithm::CreateFunc;
m_triangleSphereCF->m_swapped = true;
-
- mem = btAlignedAlloc(sizeof(btBoxBoxCollisionAlgorithm::CreateFunc),16);
- m_boxBoxCF = new(mem)btBoxBoxCollisionAlgorithm::CreateFunc;
+
+ mem = btAlignedAlloc(sizeof(btBoxBoxCollisionAlgorithm::CreateFunc), 16);
+ m_boxBoxCF = new (mem) btBoxBoxCollisionAlgorithm::CreateFunc;
//convex versus plane
- mem = btAlignedAlloc (sizeof(btConvexPlaneCollisionAlgorithm::CreateFunc),16);
+ mem = btAlignedAlloc(sizeof(btConvexPlaneCollisionAlgorithm::CreateFunc), 16);
m_convexPlaneCF = new (mem) btConvexPlaneCollisionAlgorithm::CreateFunc;
- mem = btAlignedAlloc (sizeof(btConvexPlaneCollisionAlgorithm::CreateFunc),16);
+ mem = btAlignedAlloc(sizeof(btConvexPlaneCollisionAlgorithm::CreateFunc), 16);
m_planeConvexCF = new (mem) btConvexPlaneCollisionAlgorithm::CreateFunc;
m_planeConvexCF->m_swapped = true;
-
+
///calculate maximum element size, big enough to fit any collision algorithm in the memory pool
int maxSize = sizeof(btConvexConvexAlgorithm);
int maxSize2 = sizeof(btConvexConcaveCollisionAlgorithm);
int maxSize3 = sizeof(btCompoundCollisionAlgorithm);
int maxSize4 = sizeof(btCompoundCompoundCollisionAlgorithm);
- int collisionAlgorithmMaxElementSize = btMax(maxSize,constructionInfo.m_customCollisionAlgorithmMaxElementSize);
- collisionAlgorithmMaxElementSize = btMax(collisionAlgorithmMaxElementSize,maxSize2);
- collisionAlgorithmMaxElementSize = btMax(collisionAlgorithmMaxElementSize,maxSize3);
- collisionAlgorithmMaxElementSize = btMax(collisionAlgorithmMaxElementSize,maxSize4);
-
+ int collisionAlgorithmMaxElementSize = btMax(maxSize, constructionInfo.m_customCollisionAlgorithmMaxElementSize);
+ collisionAlgorithmMaxElementSize = btMax(collisionAlgorithmMaxElementSize, maxSize2);
+ collisionAlgorithmMaxElementSize = btMax(collisionAlgorithmMaxElementSize, maxSize3);
+ collisionAlgorithmMaxElementSize = btMax(collisionAlgorithmMaxElementSize, maxSize4);
+
if (constructionInfo.m_persistentManifoldPool)
{
m_ownsPersistentManifoldPool = false;
m_persistentManifoldPool = constructionInfo.m_persistentManifoldPool;
- } else
+ }
+ else
{
m_ownsPersistentManifoldPool = true;
- void* mem = btAlignedAlloc(sizeof(btPoolAllocator),16);
- m_persistentManifoldPool = new (mem) btPoolAllocator(sizeof(btPersistentManifold),constructionInfo.m_defaultMaxPersistentManifoldPoolSize);
+ void* mem = btAlignedAlloc(sizeof(btPoolAllocator), 16);
+ m_persistentManifoldPool = new (mem) btPoolAllocator(sizeof(btPersistentManifold), constructionInfo.m_defaultMaxPersistentManifoldPoolSize);
}
-
- collisionAlgorithmMaxElementSize = (collisionAlgorithmMaxElementSize+16)&0xffffffffffff0;
+
+ collisionAlgorithmMaxElementSize = (collisionAlgorithmMaxElementSize + 16) & 0xffffffffffff0;
if (constructionInfo.m_collisionAlgorithmPool)
{
m_ownsCollisionAlgorithmPool = false;
m_collisionAlgorithmPool = constructionInfo.m_collisionAlgorithmPool;
- } else
+ }
+ else
{
m_ownsCollisionAlgorithmPool = true;
- void* mem = btAlignedAlloc(sizeof(btPoolAllocator),16);
- m_collisionAlgorithmPool = new(mem) btPoolAllocator(collisionAlgorithmMaxElementSize,constructionInfo.m_defaultMaxCollisionAlgorithmPoolSize);
+ void* mem = btAlignedAlloc(sizeof(btPoolAllocator), 16);
+ m_collisionAlgorithmPool = new (mem) btPoolAllocator(collisionAlgorithmMaxElementSize, constructionInfo.m_defaultMaxCollisionAlgorithmPoolSize);
}
-
-
}
btDefaultCollisionConfiguration::~btDefaultCollisionConfiguration()
@@ -150,83 +144,78 @@ btDefaultCollisionConfiguration::~btDefaultCollisionConfiguration()
}
m_convexConvexCreateFunc->~btCollisionAlgorithmCreateFunc();
- btAlignedFree( m_convexConvexCreateFunc);
+ btAlignedFree(m_convexConvexCreateFunc);
m_convexConcaveCreateFunc->~btCollisionAlgorithmCreateFunc();
- btAlignedFree( m_convexConcaveCreateFunc);
+ btAlignedFree(m_convexConcaveCreateFunc);
m_swappedConvexConcaveCreateFunc->~btCollisionAlgorithmCreateFunc();
- btAlignedFree( m_swappedConvexConcaveCreateFunc);
+ btAlignedFree(m_swappedConvexConcaveCreateFunc);
m_compoundCreateFunc->~btCollisionAlgorithmCreateFunc();
- btAlignedFree( m_compoundCreateFunc);
+ btAlignedFree(m_compoundCreateFunc);
m_compoundCompoundCreateFunc->~btCollisionAlgorithmCreateFunc();
btAlignedFree(m_compoundCompoundCreateFunc);
m_swappedCompoundCreateFunc->~btCollisionAlgorithmCreateFunc();
- btAlignedFree( m_swappedCompoundCreateFunc);
+ btAlignedFree(m_swappedCompoundCreateFunc);
m_emptyCreateFunc->~btCollisionAlgorithmCreateFunc();
- btAlignedFree( m_emptyCreateFunc);
+ btAlignedFree(m_emptyCreateFunc);
m_sphereSphereCF->~btCollisionAlgorithmCreateFunc();
- btAlignedFree( m_sphereSphereCF);
+ btAlignedFree(m_sphereSphereCF);
#ifdef USE_BUGGY_SPHERE_BOX_ALGORITHM
m_sphereBoxCF->~btCollisionAlgorithmCreateFunc();
- btAlignedFree( m_sphereBoxCF);
+ btAlignedFree(m_sphereBoxCF);
m_boxSphereCF->~btCollisionAlgorithmCreateFunc();
- btAlignedFree( m_boxSphereCF);
-#endif //USE_BUGGY_SPHERE_BOX_ALGORITHM
+ btAlignedFree(m_boxSphereCF);
+#endif //USE_BUGGY_SPHERE_BOX_ALGORITHM
m_sphereTriangleCF->~btCollisionAlgorithmCreateFunc();
- btAlignedFree( m_sphereTriangleCF);
+ btAlignedFree(m_sphereTriangleCF);
m_triangleSphereCF->~btCollisionAlgorithmCreateFunc();
- btAlignedFree( m_triangleSphereCF);
+ btAlignedFree(m_triangleSphereCF);
m_boxBoxCF->~btCollisionAlgorithmCreateFunc();
- btAlignedFree( m_boxBoxCF);
+ btAlignedFree(m_boxBoxCF);
m_convexPlaneCF->~btCollisionAlgorithmCreateFunc();
- btAlignedFree( m_convexPlaneCF);
+ btAlignedFree(m_convexPlaneCF);
m_planeConvexCF->~btCollisionAlgorithmCreateFunc();
- btAlignedFree( m_planeConvexCF);
+ btAlignedFree(m_planeConvexCF);
m_pdSolver->~btConvexPenetrationDepthSolver();
-
- btAlignedFree(m_pdSolver);
-
+ btAlignedFree(m_pdSolver);
}
btCollisionAlgorithmCreateFunc* btDefaultCollisionConfiguration::getClosestPointsAlgorithmCreateFunc(int proxyType0, int proxyType1)
{
-
-
if ((proxyType0 == SPHERE_SHAPE_PROXYTYPE) && (proxyType1 == SPHERE_SHAPE_PROXYTYPE))
{
- return m_sphereSphereCF;
+ return m_sphereSphereCF;
}
#ifdef USE_BUGGY_SPHERE_BOX_ALGORITHM
if ((proxyType0 == SPHERE_SHAPE_PROXYTYPE) && (proxyType1 == BOX_SHAPE_PROXYTYPE))
{
- return m_sphereBoxCF;
+ return m_sphereBoxCF;
}
if ((proxyType0 == BOX_SHAPE_PROXYTYPE) && (proxyType1 == SPHERE_SHAPE_PROXYTYPE))
{
- return m_boxSphereCF;
+ return m_boxSphereCF;
}
-#endif //USE_BUGGY_SPHERE_BOX_ALGORITHM
-
+#endif //USE_BUGGY_SPHERE_BOX_ALGORITHM
if ((proxyType0 == SPHERE_SHAPE_PROXYTYPE) && (proxyType1 == TRIANGLE_SHAPE_PROXYTYPE))
{
- return m_sphereTriangleCF;
+ return m_sphereTriangleCF;
}
if ((proxyType0 == TRIANGLE_SHAPE_PROXYTYPE) && (proxyType1 == SPHERE_SHAPE_PROXYTYPE))
{
- return m_triangleSphereCF;
+ return m_triangleSphereCF;
}
if (btBroadphaseProxy::isConvex(proxyType0) && (proxyType1 == STATIC_PLANE_PROXYTYPE))
@@ -239,8 +228,6 @@ btCollisionAlgorithmCreateFunc* btDefaultCollisionConfiguration::getClosestPoint
return m_planeConvexCF;
}
-
-
if (btBroadphaseProxy::isConvex(proxyType0) && btBroadphaseProxy::isConvex(proxyType1))
{
return m_convexConvexCreateFunc;
@@ -256,7 +243,6 @@ btCollisionAlgorithmCreateFunc* btDefaultCollisionConfiguration::getClosestPoint
return m_swappedConvexConcaveCreateFunc;
}
-
if (btBroadphaseProxy::isCompound(proxyType0) && btBroadphaseProxy::isCompound(proxyType1))
{
return m_compoundCompoundCreateFunc;
@@ -276,46 +262,41 @@ btCollisionAlgorithmCreateFunc* btDefaultCollisionConfiguration::getClosestPoint
//failed to find an algorithm
return m_emptyCreateFunc;
-
}
-btCollisionAlgorithmCreateFunc* btDefaultCollisionConfiguration::getCollisionAlgorithmCreateFunc(int proxyType0,int proxyType1)
+btCollisionAlgorithmCreateFunc* btDefaultCollisionConfiguration::getCollisionAlgorithmCreateFunc(int proxyType0, int proxyType1)
{
-
-
-
- if ((proxyType0 == SPHERE_SHAPE_PROXYTYPE) && (proxyType1==SPHERE_SHAPE_PROXYTYPE))
+ if ((proxyType0 == SPHERE_SHAPE_PROXYTYPE) && (proxyType1 == SPHERE_SHAPE_PROXYTYPE))
{
- return m_sphereSphereCF;
+ return m_sphereSphereCF;
}
#ifdef USE_BUGGY_SPHERE_BOX_ALGORITHM
- if ((proxyType0 == SPHERE_SHAPE_PROXYTYPE) && (proxyType1==BOX_SHAPE_PROXYTYPE))
+ if ((proxyType0 == SPHERE_SHAPE_PROXYTYPE) && (proxyType1 == BOX_SHAPE_PROXYTYPE))
{
- return m_sphereBoxCF;
+ return m_sphereBoxCF;
}
- if ((proxyType0 == BOX_SHAPE_PROXYTYPE ) && (proxyType1==SPHERE_SHAPE_PROXYTYPE))
+ if ((proxyType0 == BOX_SHAPE_PROXYTYPE) && (proxyType1 == SPHERE_SHAPE_PROXYTYPE))
{
- return m_boxSphereCF;
+ return m_boxSphereCF;
}
-#endif //USE_BUGGY_SPHERE_BOX_ALGORITHM
-
+#endif //USE_BUGGY_SPHERE_BOX_ALGORITHM
- if ((proxyType0 == SPHERE_SHAPE_PROXYTYPE ) && (proxyType1==TRIANGLE_SHAPE_PROXYTYPE))
+ if ((proxyType0 == SPHERE_SHAPE_PROXYTYPE) && (proxyType1 == TRIANGLE_SHAPE_PROXYTYPE))
{
- return m_sphereTriangleCF;
+ return m_sphereTriangleCF;
}
- if ((proxyType0 == TRIANGLE_SHAPE_PROXYTYPE ) && (proxyType1==SPHERE_SHAPE_PROXYTYPE))
+ if ((proxyType0 == TRIANGLE_SHAPE_PROXYTYPE) && (proxyType1 == SPHERE_SHAPE_PROXYTYPE))
{
- return m_triangleSphereCF;
- }
+ return m_triangleSphereCF;
+ }
if ((proxyType0 == BOX_SHAPE_PROXYTYPE) && (proxyType1 == BOX_SHAPE_PROXYTYPE))
{
return m_boxBoxCF;
}
-
+
if (btBroadphaseProxy::isConvex(proxyType0) && (proxyType1 == STATIC_PLANE_PROXYTYPE))
{
return m_convexPlaneCF;
@@ -325,8 +306,6 @@ btCollisionAlgorithmCreateFunc* btDefaultCollisionConfiguration::getCollisionAlg
{
return m_planeConvexCF;
}
-
-
if (btBroadphaseProxy::isConvex(proxyType0) && btBroadphaseProxy::isConvex(proxyType1))
{
@@ -343,7 +322,6 @@ btCollisionAlgorithmCreateFunc* btDefaultCollisionConfiguration::getCollisionAlg
return m_swappedConvexConcaveCreateFunc;
}
-
if (btBroadphaseProxy::isCompound(proxyType0) && btBroadphaseProxy::isCompound(proxyType1))
{
return m_compoundCompoundCreateFunc;
@@ -352,7 +330,8 @@ btCollisionAlgorithmCreateFunc* btDefaultCollisionConfiguration::getCollisionAlg
if (btBroadphaseProxy::isCompound(proxyType0))
{
return m_compoundCreateFunc;
- } else
+ }
+ else
{
if (btBroadphaseProxy::isCompound(proxyType1))
{
@@ -366,17 +345,17 @@ btCollisionAlgorithmCreateFunc* btDefaultCollisionConfiguration::getCollisionAlg
void btDefaultCollisionConfiguration::setConvexConvexMultipointIterations(int numPerturbationIterations, int minimumPointsPerturbationThreshold)
{
- btConvexConvexAlgorithm::CreateFunc* convexConvex = (btConvexConvexAlgorithm::CreateFunc*) m_convexConvexCreateFunc;
+ btConvexConvexAlgorithm::CreateFunc* convexConvex = (btConvexConvexAlgorithm::CreateFunc*)m_convexConvexCreateFunc;
convexConvex->m_numPerturbationIterations = numPerturbationIterations;
convexConvex->m_minimumPointsPerturbationThreshold = minimumPointsPerturbationThreshold;
}
-void btDefaultCollisionConfiguration::setPlaneConvexMultipointIterations(int numPerturbationIterations, int minimumPointsPerturbationThreshold)
+void btDefaultCollisionConfiguration::setPlaneConvexMultipointIterations(int numPerturbationIterations, int minimumPointsPerturbationThreshold)
{
btConvexPlaneCollisionAlgorithm::CreateFunc* cpCF = (btConvexPlaneCollisionAlgorithm::CreateFunc*)m_convexPlaneCF;
cpCF->m_numPerturbationIterations = numPerturbationIterations;
cpCF->m_minimumPointsPerturbationThreshold = minimumPointsPerturbationThreshold;
-
+
btConvexPlaneCollisionAlgorithm::CreateFunc* pcCF = (btConvexPlaneCollisionAlgorithm::CreateFunc*)m_planeConvexCF;
pcCF->m_numPerturbationIterations = numPerturbationIterations;
pcCF->m_minimumPointsPerturbationThreshold = minimumPointsPerturbationThreshold;
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h
index 17c7596cff..b39a3f41de 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h
@@ -20,76 +20,68 @@ subject to the following restrictions:
class btVoronoiSimplexSolver;
class btConvexPenetrationDepthSolver;
-struct btDefaultCollisionConstructionInfo
+struct btDefaultCollisionConstructionInfo
{
- btPoolAllocator* m_persistentManifoldPool;
- btPoolAllocator* m_collisionAlgorithmPool;
- int m_defaultMaxPersistentManifoldPoolSize;
- int m_defaultMaxCollisionAlgorithmPoolSize;
- int m_customCollisionAlgorithmMaxElementSize;
- int m_useEpaPenetrationAlgorithm;
+ 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)
+ : 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
+class btDefaultCollisionConfiguration : public btCollisionConfiguration
{
-
protected:
+ int m_persistentManifoldPoolSize;
- int m_persistentManifoldPoolSize;
-
-
- btPoolAllocator* m_persistentManifoldPool;
- bool m_ownsPersistentManifoldPool;
+ btPoolAllocator* m_persistentManifoldPool;
+ bool m_ownsPersistentManifoldPool;
-
- btPoolAllocator* m_collisionAlgorithmPool;
- bool m_ownsCollisionAlgorithmPool;
+ btPoolAllocator* m_collisionAlgorithmPool;
+ bool m_ownsCollisionAlgorithmPool;
//default penetration depth solver
- btConvexPenetrationDepthSolver* m_pdSolver;
-
+ 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_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:
-
+ btCollisionAlgorithmCreateFunc* m_sphereTriangleCF;
+ btCollisionAlgorithmCreateFunc* m_triangleSphereCF;
+ btCollisionAlgorithmCreateFunc* m_planeConvexCF;
+ btCollisionAlgorithmCreateFunc* m_convexPlaneCF;
+public:
btDefaultCollisionConfiguration(const btDefaultCollisionConstructionInfo& constructionInfo = btDefaultCollisionConstructionInfo());
virtual ~btDefaultCollisionConfiguration();
- ///memory pools
+ ///memory pools
virtual btPoolAllocator* getPersistentManifoldPool()
{
return m_persistentManifoldPool;
@@ -100,8 +92,7 @@ public:
return m_collisionAlgorithmPool;
}
-
- virtual btCollisionAlgorithmCreateFunc* getCollisionAlgorithmCreateFunc(int proxyType0,int proxyType1);
+ virtual btCollisionAlgorithmCreateFunc* getCollisionAlgorithmCreateFunc(int proxyType0, int proxyType1);
virtual btCollisionAlgorithmCreateFunc* getClosestPointsAlgorithmCreateFunc(int proxyType0, int proxyType1);
@@ -112,11 +103,9 @@ public:
///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);
+ void setConvexConvexMultipointIterations(int numPerturbationIterations = 3, int minimumPointsPerturbationThreshold = 3);
+ void setPlaneConvexMultipointIterations(int numPerturbationIterations = 3, int minimumPointsPerturbationThreshold = 3);
};
-#endif //BT_DEFAULT_COLLISION_CONFIGURATION
-
+#endif //BT_DEFAULT_COLLISION_CONFIGURATION
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.cpp
index 5fa1c8be5e..7cd41bdb33 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.cpp
@@ -15,20 +15,16 @@ subject to the following restrictions:
#include "btEmptyCollisionAlgorithm.h"
-
-
btEmptyAlgorithm::btEmptyAlgorithm(const btCollisionAlgorithmConstructionInfo& ci)
: btCollisionAlgorithm(ci)
{
}
-void btEmptyAlgorithm::processCollision (const btCollisionObjectWrapper* ,const btCollisionObjectWrapper* ,const btDispatcherInfo& ,btManifoldResult* )
+void btEmptyAlgorithm::processCollision(const btCollisionObjectWrapper*, const btCollisionObjectWrapper*, const btDispatcherInfo&, btManifoldResult*)
{
}
-btScalar btEmptyAlgorithm::calculateTimeOfImpact(btCollisionObject* ,btCollisionObject* ,const btDispatcherInfo& ,btManifoldResult* )
+btScalar btEmptyAlgorithm::calculateTimeOfImpact(btCollisionObject*, btCollisionObject*, const btDispatcherInfo&, btManifoldResult*)
{
return btScalar(1.);
}
-
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h
index cb0f152183..65ef83e094 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h
@@ -25,30 +25,28 @@ subject to the following restrictions:
///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 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 btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut);
- virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
+ virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
{
}
- struct CreateFunc :public btCollisionAlgorithmCreateFunc
+ struct CreateFunc : public btCollisionAlgorithmCreateFunc
{
- virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap)
- {
+ 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);
+ return new (mem) btEmptyAlgorithm(ci);
}
};
} ATTRIBUTE_ALIGNED(16);
-#endif //BT_EMPTY_ALGORITH
+#endif //BT_EMPTY_ALGORITH
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btGhostObject.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btGhostObject.cpp
index 86141fa689..00f16fd0a8 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btGhostObject.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btGhostObject.cpp
@@ -29,60 +29,58 @@ btGhostObject::~btGhostObject()
btAssert(!m_overlappingObjects.size());
}
-
-void btGhostObject::addOverlappingObjectInternal(btBroadphaseProxy* otherProxy,btBroadphaseProxy* thisProxy)
+void btGhostObject::addOverlappingObjectInternal(btBroadphaseProxy* otherProxy, btBroadphaseProxy* thisProxy)
{
btCollisionObject* otherObject = (btCollisionObject*)otherProxy->m_clientObject;
btAssert(otherObject);
///if this linearSearch becomes too slow (too many overlapping objects) we should add a more appropriate data structure
int index = m_overlappingObjects.findLinearSearch(otherObject);
- if (index==m_overlappingObjects.size())
+ if (index == m_overlappingObjects.size())
{
//not found
m_overlappingObjects.push_back(otherObject);
}
}
-void btGhostObject::removeOverlappingObjectInternal(btBroadphaseProxy* otherProxy,btDispatcher* dispatcher,btBroadphaseProxy* thisProxy)
+void btGhostObject::removeOverlappingObjectInternal(btBroadphaseProxy* otherProxy, btDispatcher* dispatcher, btBroadphaseProxy* thisProxy)
{
btCollisionObject* otherObject = (btCollisionObject*)otherProxy->m_clientObject;
btAssert(otherObject);
int index = m_overlappingObjects.findLinearSearch(otherObject);
- if (index<m_overlappingObjects.size())
+ if (index < m_overlappingObjects.size())
{
- m_overlappingObjects[index] = m_overlappingObjects[m_overlappingObjects.size()-1];
+ m_overlappingObjects[index] = m_overlappingObjects[m_overlappingObjects.size() - 1];
m_overlappingObjects.pop_back();
}
}
-
btPairCachingGhostObject::btPairCachingGhostObject()
{
- m_hashPairCache = new (btAlignedAlloc(sizeof(btHashedOverlappingPairCache),16)) btHashedOverlappingPairCache();
+ m_hashPairCache = new (btAlignedAlloc(sizeof(btHashedOverlappingPairCache), 16)) btHashedOverlappingPairCache();
}
btPairCachingGhostObject::~btPairCachingGhostObject()
{
m_hashPairCache->~btHashedOverlappingPairCache();
- btAlignedFree( m_hashPairCache );
+ btAlignedFree(m_hashPairCache);
}
-void btPairCachingGhostObject::addOverlappingObjectInternal(btBroadphaseProxy* otherProxy,btBroadphaseProxy* thisProxy)
+void btPairCachingGhostObject::addOverlappingObjectInternal(btBroadphaseProxy* otherProxy, btBroadphaseProxy* thisProxy)
{
- btBroadphaseProxy*actualThisProxy = thisProxy ? thisProxy : getBroadphaseHandle();
+ btBroadphaseProxy* actualThisProxy = thisProxy ? thisProxy : getBroadphaseHandle();
btAssert(actualThisProxy);
btCollisionObject* otherObject = (btCollisionObject*)otherProxy->m_clientObject;
btAssert(otherObject);
int index = m_overlappingObjects.findLinearSearch(otherObject);
- if (index==m_overlappingObjects.size())
+ if (index == m_overlappingObjects.size())
{
m_overlappingObjects.push_back(otherObject);
- m_hashPairCache->addOverlappingPair(actualThisProxy,otherProxy);
+ m_hashPairCache->addOverlappingPair(actualThisProxy, otherProxy);
}
}
-void btPairCachingGhostObject::removeOverlappingObjectInternal(btBroadphaseProxy* otherProxy,btDispatcher* dispatcher,btBroadphaseProxy* thisProxy1)
+void btPairCachingGhostObject::removeOverlappingObjectInternal(btBroadphaseProxy* otherProxy, btDispatcher* dispatcher, btBroadphaseProxy* thisProxy1)
{
btCollisionObject* otherObject = (btCollisionObject*)otherProxy->m_clientObject;
btBroadphaseProxy* actualThisProxy = thisProxy1 ? thisProxy1 : getBroadphaseHandle();
@@ -90,82 +88,79 @@ void btPairCachingGhostObject::removeOverlappingObjectInternal(btBroadphaseProxy
btAssert(otherObject);
int index = m_overlappingObjects.findLinearSearch(otherObject);
- if (index<m_overlappingObjects.size())
+ if (index < m_overlappingObjects.size())
{
- m_overlappingObjects[index] = m_overlappingObjects[m_overlappingObjects.size()-1];
+ m_overlappingObjects[index] = m_overlappingObjects[m_overlappingObjects.size() - 1];
m_overlappingObjects.pop_back();
- m_hashPairCache->removeOverlappingPair(actualThisProxy,otherProxy,dispatcher);
+ m_hashPairCache->removeOverlappingPair(actualThisProxy, otherProxy, dispatcher);
}
}
-
-void btGhostObject::convexSweepTest(const btConvexShape* castShape, const btTransform& convexFromWorld, const btTransform& convexToWorld, btCollisionWorld::ConvexResultCallback& resultCallback, btScalar allowedCcdPenetration) const
+void btGhostObject::convexSweepTest(const btConvexShape* castShape, const btTransform& convexFromWorld, const btTransform& convexToWorld, btCollisionWorld::ConvexResultCallback& resultCallback, btScalar allowedCcdPenetration) const
{
- btTransform convexFromTrans,convexToTrans;
+ btTransform convexFromTrans, convexToTrans;
convexFromTrans = convexFromWorld;
convexToTrans = convexToWorld;
btVector3 castShapeAabbMin, castShapeAabbMax;
/* Compute AABB that encompasses angular movement */
{
btVector3 linVel, angVel;
- btTransformUtil::calculateVelocity (convexFromTrans, convexToTrans, 1.0, linVel, angVel);
+ btTransformUtil::calculateVelocity(convexFromTrans, convexToTrans, 1.0, linVel, angVel);
btTransform R;
- R.setIdentity ();
- R.setRotation (convexFromTrans.getRotation());
- castShape->calculateTemporalAabb (R, linVel, angVel, 1.0, castShapeAabbMin, castShapeAabbMax);
+ R.setIdentity();
+ R.setRotation(convexFromTrans.getRotation());
+ castShape->calculateTemporalAabb(R, linVel, angVel, 1.0, castShapeAabbMin, castShapeAabbMax);
}
/// go over all objects, and if the ray intersects their aabb + cast shape aabb,
// do a ray-shape query using convexCaster (CCD)
int i;
- for (i=0;i<m_overlappingObjects.size();i++)
+ for (i = 0; i < m_overlappingObjects.size(); i++)
{
- btCollisionObject* collisionObject= m_overlappingObjects[i];
+ btCollisionObject* collisionObject = m_overlappingObjects[i];
//only perform raycast if filterMask matches
- if(resultCallback.needsCollision(collisionObject->getBroadphaseHandle())) {
+ if (resultCallback.needsCollision(collisionObject->getBroadphaseHandle()))
+ {
//RigidcollisionObject* collisionObject = ctrl->GetRigidcollisionObject();
- btVector3 collisionObjectAabbMin,collisionObjectAabbMax;
- collisionObject->getCollisionShape()->getAabb(collisionObject->getWorldTransform(),collisionObjectAabbMin,collisionObjectAabbMax);
- AabbExpand (collisionObjectAabbMin, collisionObjectAabbMax, castShapeAabbMin, castShapeAabbMax);
- btScalar hitLambda = btScalar(1.); //could use resultCallback.m_closestHitFraction, but needs testing
+ btVector3 collisionObjectAabbMin, collisionObjectAabbMax;
+ collisionObject->getCollisionShape()->getAabb(collisionObject->getWorldTransform(), collisionObjectAabbMin, collisionObjectAabbMax);
+ AabbExpand(collisionObjectAabbMin, collisionObjectAabbMax, castShapeAabbMin, castShapeAabbMax);
+ btScalar hitLambda = btScalar(1.); //could use resultCallback.m_closestHitFraction, but needs testing
btVector3 hitNormal;
- if (btRayAabb(convexFromWorld.getOrigin(),convexToWorld.getOrigin(),collisionObjectAabbMin,collisionObjectAabbMax,hitLambda,hitNormal))
+ if (btRayAabb(convexFromWorld.getOrigin(), convexToWorld.getOrigin(), collisionObjectAabbMin, collisionObjectAabbMax, hitLambda, hitNormal))
{
- btCollisionWorld::objectQuerySingle(castShape, convexFromTrans,convexToTrans,
- collisionObject,
- collisionObject->getCollisionShape(),
- collisionObject->getWorldTransform(),
- resultCallback,
- allowedCcdPenetration);
+ btCollisionWorld::objectQuerySingle(castShape, convexFromTrans, convexToTrans,
+ collisionObject,
+ collisionObject->getCollisionShape(),
+ collisionObject->getWorldTransform(),
+ resultCallback,
+ allowedCcdPenetration);
}
}
}
-
}
-void btGhostObject::rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, btCollisionWorld::RayResultCallback& resultCallback) const
+void btGhostObject::rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, btCollisionWorld::RayResultCallback& resultCallback) const
{
btTransform rayFromTrans;
rayFromTrans.setIdentity();
rayFromTrans.setOrigin(rayFromWorld);
- btTransform rayToTrans;
+ btTransform rayToTrans;
rayToTrans.setIdentity();
rayToTrans.setOrigin(rayToWorld);
-
int i;
- for (i=0;i<m_overlappingObjects.size();i++)
+ for (i = 0; i < m_overlappingObjects.size(); i++)
{
- btCollisionObject* collisionObject= m_overlappingObjects[i];
+ btCollisionObject* collisionObject = m_overlappingObjects[i];
//only perform raycast if filterMask matches
- if(resultCallback.needsCollision(collisionObject->getBroadphaseHandle()))
+ if (resultCallback.needsCollision(collisionObject->getBroadphaseHandle()))
{
- btCollisionWorld::rayTestSingle(rayFromTrans,rayToTrans,
- collisionObject,
- collisionObject->getCollisionShape(),
- collisionObject->getWorldTransform(),
- resultCallback);
+ btCollisionWorld::rayTestSingle(rayFromTrans, rayToTrans,
+ collisionObject,
+ collisionObject->getCollisionShape(),
+ collisionObject->getWorldTransform(),
+ resultCallback);
}
}
}
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btGhostObject.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btGhostObject.h
index 8ec8613857..aa7f48d5cb 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btGhostObject.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btGhostObject.h
@@ -16,7 +16,6 @@ subject to the following restrictions:
#ifndef BT_GHOST_OBJECT_H
#define BT_GHOST_OBJECT_H
-
#include "btCollisionObject.h"
#include "BulletCollision/BroadphaseCollision/btOverlappingPairCallback.h"
#include "LinearMath/btAlignedAllocator.h"
@@ -31,48 +30,47 @@ class btDispatcher;
///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
+ATTRIBUTE_ALIGNED16(class)
+btGhostObject : public btCollisionObject
{
protected:
-
btAlignedObjectArray<btCollisionObject*> 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 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;
+ 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);
+ 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);
+ virtual void removeOverlappingObjectInternal(btBroadphaseProxy * otherProxy, btDispatcher * dispatcher, btBroadphaseProxy* thisProxy = 0);
- int getNumOverlappingObjects() const
+ int getNumOverlappingObjects() const
{
return m_overlappingObjects.size();
}
- btCollisionObject* getOverlappingObject(int index)
+ btCollisionObject* getOverlappingObject(int index)
{
return m_overlappingObjects[index];
}
- const btCollisionObject* getOverlappingObject(int index) const
+ const btCollisionObject* getOverlappingObject(int index) const
{
return m_overlappingObjects[index];
}
- btAlignedObjectArray<btCollisionObject*>& getOverlappingPairs()
+ btAlignedObjectArray<btCollisionObject*>& getOverlappingPairs()
{
return m_overlappingObjects;
}
- const btAlignedObjectArray<btCollisionObject*> getOverlappingPairs() const
+ const btAlignedObjectArray<btCollisionObject*> getOverlappingPairs() const
{
return m_overlappingObjects;
}
@@ -81,49 +79,43 @@ public:
// internal cast
//
- static const btGhostObject* upcast(const btCollisionObject* colObj)
+ static const btGhostObject* upcast(const btCollisionObject* colObj)
{
- if (colObj->getInternalType()==CO_GHOST_OBJECT)
+ if (colObj->getInternalType() == CO_GHOST_OBJECT)
return (const btGhostObject*)colObj;
return 0;
}
- static btGhostObject* upcast(btCollisionObject* colObj)
+ static btGhostObject* upcast(btCollisionObject * colObj)
{
- if (colObj->getInternalType()==CO_GHOST_OBJECT)
+ if (colObj->getInternalType() == CO_GHOST_OBJECT)
return (btGhostObject*)colObj;
return 0;
}
-
};
-class btPairCachingGhostObject : public btGhostObject
+class btPairCachingGhostObject : public btGhostObject
{
- btHashedOverlappingPairCache* m_hashPairCache;
+ 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 addOverlappingObjectInternal(btBroadphaseProxy* otherProxy, btBroadphaseProxy* thisProxy = 0);
- virtual void removeOverlappingObjectInternal(btBroadphaseProxy* otherProxy,btDispatcher* dispatcher,btBroadphaseProxy* thisProxy=0);
+ virtual void removeOverlappingObjectInternal(btBroadphaseProxy* otherProxy, btDispatcher* dispatcher, btBroadphaseProxy* thisProxy = 0);
- btHashedOverlappingPairCache* getOverlappingPairCache()
+ 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()
{
@@ -131,15 +123,14 @@ public:
virtual ~btGhostPairCallback()
{
-
}
- virtual btBroadphasePair* addOverlappingPair(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1)
+ 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);
+ 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)
@@ -147,29 +138,25 @@ public:
return 0;
}
- virtual void* removeOverlappingPair(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1,btDispatcher* dispatcher)
+ 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);
+ 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);
+ ghost0->removeOverlappingObjectInternal(proxy1, dispatcher, proxy0);
if (ghost1)
- ghost1->removeOverlappingObjectInternal(proxy0,dispatcher,proxy1);
+ ghost1->removeOverlappingObjectInternal(proxy0, dispatcher, proxy1);
return 0;
}
- virtual void removeOverlappingPairsContainingProxy(btBroadphaseProxy* /*proxy0*/,btDispatcher* /*dispatcher*/)
+ 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/thirdparty/bullet/BulletCollision/CollisionDispatch/btHashedSimplePairCache.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btHashedSimplePairCache.cpp
index 8271981b29..b686d98d1e 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btHashedSimplePairCache.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btHashedSimplePairCache.cpp
@@ -13,64 +13,49 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
-
#include "btHashedSimplePairCache.h"
-
#include <stdio.h>
#ifdef BT_DEBUG_COLLISION_PAIRS
-int gOverlappingSimplePairs = 0;
-int gRemoveSimplePairs =0;
-int gAddedSimplePairs =0;
-int gFindSimplePairs =0;
-#endif //BT_DEBUG_COLLISION_PAIRS
-
-
+int gOverlappingSimplePairs = 0;
+int gRemoveSimplePairs = 0;
+int gAddedSimplePairs = 0;
+int gFindSimplePairs = 0;
+#endif //BT_DEBUG_COLLISION_PAIRS
-btHashedSimplePairCache::btHashedSimplePairCache() {
- int initialAllocatedSize= 2;
+btHashedSimplePairCache::btHashedSimplePairCache()
+{
+ int initialAllocatedSize = 2;
m_overlappingPairArray.reserve(initialAllocatedSize);
growTables();
}
-
-
-
btHashedSimplePairCache::~btHashedSimplePairCache()
{
}
-
-
-
-
-
void btHashedSimplePairCache::removeAllPairs()
{
m_overlappingPairArray.clear();
m_hashTable.clear();
m_next.clear();
- int initialAllocatedSize= 2;
+ int initialAllocatedSize = 2;
m_overlappingPairArray.reserve(initialAllocatedSize);
growTables();
}
-
-
btSimplePair* btHashedSimplePairCache::findPair(int indexA, int indexB)
{
#ifdef BT_DEBUG_COLLISION_PAIRS
gFindSimplePairs++;
#endif
-
-
+
/*if (indexA > indexB)
btSwap(indexA, indexB);*/
- int hash = static_cast<int>(getHash(static_cast<unsigned int>(indexA), static_cast<unsigned int>(indexB)) & (m_overlappingPairArray.capacity()-1));
+ int hash = static_cast<int>(getHash(static_cast<unsigned int>(indexA), static_cast<unsigned int>(indexB)) & (m_overlappingPairArray.capacity() - 1));
if (hash >= m_hashTable.size())
{
@@ -95,9 +80,8 @@ btSimplePair* btHashedSimplePairCache::findPair(int indexA, int indexB)
//#include <stdio.h>
-void btHashedSimplePairCache::growTables()
+void btHashedSimplePairCache::growTables()
{
-
int newCapacity = m_overlappingPairArray.capacity();
if (m_hashTable.size() < newCapacity)
@@ -108,10 +92,9 @@ void btHashedSimplePairCache::growTables()
m_hashTable.resize(newCapacity);
m_next.resize(newCapacity);
-
int i;
- for (i= 0; i < newCapacity; ++i)
+ for (i = 0; i < newCapacity; ++i)
{
m_hashTable[i] = BT_SIMPLE_NULL_PAIR;
}
@@ -120,27 +103,22 @@ void btHashedSimplePairCache::growTables()
m_next[i] = BT_SIMPLE_NULL_PAIR;
}
- for(i=0;i<curHashtableSize;i++)
+ for (i = 0; i < curHashtableSize; i++)
{
-
const btSimplePair& pair = m_overlappingPairArray[i];
int indexA = pair.m_indexA;
int indexB = pair.m_indexB;
-
- int hashValue = static_cast<int>(getHash(static_cast<unsigned int>(indexA),static_cast<unsigned int>(indexB)) & (m_overlappingPairArray.capacity()-1)); // New hash value with new mask
+
+ int hashValue = static_cast<int>(getHash(static_cast<unsigned int>(indexA), static_cast<unsigned int>(indexB)) & (m_overlappingPairArray.capacity() - 1)); // New hash value with new mask
m_next[i] = m_hashTable[hashValue];
m_hashTable[hashValue] = i;
}
-
-
}
}
btSimplePair* btHashedSimplePairCache::internalAddPair(int indexA, int indexB)
{
-
- int hash = static_cast<int>(getHash(static_cast<unsigned int>(indexA),static_cast<unsigned int>(indexB)) & (m_overlappingPairArray.capacity()-1)); // New hash value with new mask
-
+ int hash = static_cast<int>(getHash(static_cast<unsigned int>(indexA), static_cast<unsigned int>(indexB)) & (m_overlappingPairArray.capacity() - 1)); // New hash value with new mask
btSimplePair* pair = internalFindPair(indexA, indexB, hash);
if (pair != NULL)
@@ -158,32 +136,29 @@ btSimplePair* btHashedSimplePairCache::internalAddPair(int indexA, int indexB)
{
growTables();
//hash with new capacity
- hash = static_cast<int>(getHash(static_cast<unsigned int>(indexA),static_cast<unsigned int>(indexB)) & (m_overlappingPairArray.capacity()-1));
+ hash = static_cast<int>(getHash(static_cast<unsigned int>(indexA), static_cast<unsigned int>(indexB)) & (m_overlappingPairArray.capacity() - 1));
}
-
- pair = new (mem) btSimplePair(indexA,indexB);
+
+ pair = new (mem) btSimplePair(indexA, indexB);
pair->m_userPointer = 0;
-
+
m_next[count] = m_hashTable[hash];
m_hashTable[hash] = count;
return pair;
}
-
-
void* btHashedSimplePairCache::removeOverlappingPair(int indexA, int indexB)
{
#ifdef BT_DEBUG_COLLISION_PAIRS
gRemoveSimplePairs++;
#endif
-
/*if (indexA > indexB)
btSwap(indexA, indexB);*/
- int hash = static_cast<int>(getHash(static_cast<unsigned int>(indexA),static_cast<unsigned int>(indexB)) & (m_overlappingPairArray.capacity()-1));
+ int hash = static_cast<int>(getHash(static_cast<unsigned int>(indexA), static_cast<unsigned int>(indexB)) & (m_overlappingPairArray.capacity() - 1));
btSimplePair* pair = internalFindPair(indexA, indexB, hash);
if (pair == NULL)
@@ -191,10 +166,8 @@ void* btHashedSimplePairCache::removeOverlappingPair(int indexA, int indexB)
return 0;
}
-
void* userData = pair->m_userPointer;
-
int pairIndex = int(pair - &m_overlappingPairArray[0]);
btAssert(pairIndex < m_overlappingPairArray.size());
@@ -234,8 +207,8 @@ void* btHashedSimplePairCache::removeOverlappingPair(int indexA, int indexB)
// Remove the last pair from the hash table.
const btSimplePair* last = &m_overlappingPairArray[lastPairIndex];
- /* missing swap here too, Nat. */
- int lastHash = static_cast<int>(getHash(static_cast<unsigned int>(last->m_indexA), static_cast<unsigned int>(last->m_indexB)) & (m_overlappingPairArray.capacity()-1));
+ /* missing swap here too, Nat. */
+ int lastHash = static_cast<int>(getHash(static_cast<unsigned int>(last->m_indexA), static_cast<unsigned int>(last->m_indexB)) & (m_overlappingPairArray.capacity() - 1));
index = m_hashTable[lastHash];
btAssert(index != BT_SIMPLE_NULL_PAIR);
@@ -269,13 +242,3 @@ void* btHashedSimplePairCache::removeOverlappingPair(int indexA, int indexB)
return userData;
}
//#include <stdio.h>
-
-
-
-
-
-
-
-
-
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btHashedSimplePairCache.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btHashedSimplePairCache.h
index 318981cda1..fd38a4f0e1 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btHashedSimplePairCache.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btHashedSimplePairCache.h
@@ -16,144 +16,126 @@ subject to the following restrictions:
#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;
+const int BT_SIMPLE_NULL_PAIR = 0xffffffff;
struct btSimplePair
{
- btSimplePair(int indexA,int indexB)
- :m_indexA(indexA),
- m_indexB(indexB),
- m_userPointer(0)
+ 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;
+ union {
+ void* m_userPointer;
+ int m_userValue;
};
};
-typedef btAlignedObjectArray<btSimplePair> btSimplePairArray;
-
+typedef btAlignedObjectArray<btSimplePair> btSimplePairArray;
#ifdef BT_DEBUG_COLLISION_PAIRS
extern int gOverlappingSimplePairs;
extern int gRemoveSimplePairs;
extern int gAddedSimplePairs;
extern int gFindSimplePairs;
-#endif //BT_DEBUG_COLLISION_PAIRS
-
-
+#endif //BT_DEBUG_COLLISION_PAIRS
class btHashedSimplePairCache
{
- btSimplePairArray m_overlappingPairArray;
-
+ btSimplePairArray m_overlappingPairArray;
protected:
-
- btAlignedObjectArray<int> m_hashTable;
- btAlignedObjectArray<int> m_next;
-
+ btAlignedObjectArray<int> m_hashTable;
+ btAlignedObjectArray<int> m_next;
public:
btHashedSimplePairCache();
virtual ~btHashedSimplePairCache();
-
+
void removeAllPairs();
- virtual void* removeOverlappingPair(int indexA,int indexB);
-
+ 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)
+ virtual btSimplePair* addOverlappingPair(int indexA, int indexB)
{
#ifdef BT_DEBUG_COLLISION_PAIRS
gAddedSimplePairs++;
#endif
- return internalAddPair(indexA,indexB);
+ return internalAddPair(indexA, indexB);
}
-
- virtual btSimplePair* getOverlappingPairArrayPtr()
+ virtual btSimplePair* getOverlappingPairArrayPtr()
{
return &m_overlappingPairArray[0];
}
- const btSimplePair* getOverlappingPairArrayPtr() const
+ const btSimplePair* getOverlappingPairArrayPtr() const
{
return &m_overlappingPairArray[0];
}
- btSimplePairArray& getOverlappingPairArray()
+ btSimplePairArray& getOverlappingPairArray()
{
return m_overlappingPairArray;
}
- const btSimplePairArray& getOverlappingPairArray() const
+ const btSimplePairArray& getOverlappingPairArray() const
{
return m_overlappingPairArray;
}
-
- btSimplePair* findPair(int indexA,int indexB);
+ btSimplePair* findPair(int indexA, int indexB);
int GetCount() const { return m_overlappingPairArray.size(); }
- int getNumOverlappingPairs() const
+ int getNumOverlappingPairs() const
{
return m_overlappingPairArray.size();
}
+
private:
-
- btSimplePair* internalAddPair(int indexA, int indexB);
+ btSimplePair* internalAddPair(int indexA, int indexB);
- void growTables();
+ 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 >> 10);
+ key += (key << 3);
+ key ^= (key >> 6);
key += ~(key << 11);
- key ^= (key >> 16);
+ key ^= (key >> 16);
return key;
}
-
-
-
-
- SIMD_FORCE_INLINE btSimplePair* internalFindPair(int proxyIdA , int proxyIdB, int hash)
+ 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)
+
+ while (index != BT_SIMPLE_NULL_PAIR && equalsPair(m_overlappingPairArray[index], proxyIdA, proxyIdB) == false)
{
index = m_next[index];
}
- if ( index == BT_SIMPLE_NULL_PAIR )
+ if (index == BT_SIMPLE_NULL_PAIR)
{
return NULL;
}
@@ -162,13 +144,6 @@ private:
return &m_overlappingPairArray[index];
}
-
-
};
-
-
-
-#endif //BT_HASHED_SIMPLE_PAIR_CACHE_H
-
-
+#endif //BT_HASHED_SIMPLE_PAIR_CACHE_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp
index 898320ee1a..e74c83f9f1 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp
@@ -12,50 +12,44 @@
#ifdef DEBUG_INTERNAL_EDGE
#include <stdio.h>
-#endif //DEBUG_INTERNAL_EDGE
-
+#endif //DEBUG_INTERNAL_EDGE
#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
static btIDebugDraw* gDebugDrawer = 0;
-void btSetDebugDrawer(btIDebugDraw* debugDrawer)
+void btSetDebugDrawer(btIDebugDraw* debugDrawer)
{
gDebugDrawer = debugDrawer;
}
-static void btDebugDrawLine(const btVector3& from,const btVector3& to, const btVector3& color)
+static void btDebugDrawLine(const btVector3& from, const btVector3& to, const btVector3& color)
{
if (gDebugDrawer)
- gDebugDrawer->drawLine(from,to,color);
+ gDebugDrawer->drawLine(from, to, color);
}
-#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
-
+#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
-static int btGetHash(int partId, int triangleIndex)
+static int btGetHash(int partId, int triangleIndex)
{
- int hash = (partId<<(31-MAX_NUM_PARTS_IN_BITS)) | triangleIndex;
+ int hash = (partId << (31 - MAX_NUM_PARTS_IN_BITS)) | triangleIndex;
return hash;
}
-
-
-static btScalar btGetAngle(const btVector3& edgeA, const btVector3& normalA,const btVector3& normalB)
+static btScalar btGetAngle(const btVector3& edgeA, const btVector3& normalA, const btVector3& normalB)
{
- const btVector3 refAxis0 = edgeA;
- const btVector3 refAxis1 = normalA;
+ const btVector3 refAxis0 = edgeA;
+ const btVector3 refAxis1 = normalA;
const btVector3 swingAxis = normalB;
btScalar angle = btAtan2(swingAxis.dot(refAxis0), swingAxis.dot(refAxis1));
- return angle;
+ return angle;
}
-
struct btConnectivityProcessor : public btTriangleCallback
{
- int m_partIdA;
- int m_triangleIndexA;
- btVector3* m_triangleVerticesA;
- btTriangleInfoMap* m_triangleInfoMap;
-
+ int m_partIdA;
+ int m_triangleIndexA;
+ btVector3* m_triangleVerticesA;
+ btTriangleInfoMap* m_triangleInfoMap;
virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex)
{
@@ -69,18 +63,17 @@ struct btConnectivityProcessor : public btTriangleCallback
//search for shared vertices and edges
int numshared = 0;
- int sharedVertsA[3]={-1,-1,-1};
- int sharedVertsB[3]={-1,-1,-1};
+ int sharedVertsA[3] = {-1, -1, -1};
+ int sharedVertsB[3] = {-1, -1, -1};
///skip degenerate triangles
- btScalar crossBSqr = ((triangle[1]-triangle[0]).cross(triangle[2]-triangle[0])).length2();
+ btScalar crossBSqr = ((triangle[1] - triangle[0]).cross(triangle[2] - triangle[0])).length2();
if (crossBSqr < m_triangleInfoMap->m_equalVertexThreshold)
return;
-
- btScalar crossASqr = ((m_triangleVerticesA[1]-m_triangleVerticesA[0]).cross(m_triangleVerticesA[2]-m_triangleVerticesA[0])).length2();
+ btScalar crossASqr = ((m_triangleVerticesA[1] - m_triangleVerticesA[0]).cross(m_triangleVerticesA[2] - m_triangleVerticesA[0])).length2();
///skip degenerate triangles
- if (crossASqr< m_triangleInfoMap->m_equalVertexThreshold)
+ if (crossASqr < m_triangleInfoMap->m_equalVertexThreshold)
return;
#if 0
@@ -96,36 +89,36 @@ struct btConnectivityProcessor : public btTriangleCallback
triangle[2].getX(),triangle[2].getY(),triangle[2].getZ());
#endif
- for (int i=0;i<3;i++)
+ for (int i = 0; i < 3; i++)
{
- for (int j=0;j<3;j++)
+ for (int j = 0; j < 3; j++)
{
- if ( (m_triangleVerticesA[i]-triangle[j]).length2() < m_triangleInfoMap->m_equalVertexThreshold)
+ if ((m_triangleVerticesA[i] - triangle[j]).length2() < m_triangleInfoMap->m_equalVertexThreshold)
{
sharedVertsA[numshared] = i;
sharedVertsB[numshared] = j;
numshared++;
///degenerate case
- if(numshared >= 3)
+ if (numshared >= 3)
return;
}
}
///degenerate case
- if(numshared >= 3)
+ if (numshared >= 3)
return;
}
switch (numshared)
{
- case 0:
+ case 0:
{
break;
}
- case 1:
+ case 1:
{
//shared vertex
break;
}
- case 2:
+ case 2:
{
//shared edge
//we need to make sure the edge is in the order V2V0 and not V0V2 so that the signs are correct
@@ -138,26 +131,25 @@ struct btConnectivityProcessor : public btTriangleCallback
sharedVertsB[0] = tmp;
}
- int hash = btGetHash(m_partIdA,m_triangleIndexA);
+ int hash = btGetHash(m_partIdA, m_triangleIndexA);
btTriangleInfo* info = m_triangleInfoMap->find(hash);
if (!info)
{
btTriangleInfo tmp;
- m_triangleInfoMap->insert(hash,tmp);
+ m_triangleInfoMap->insert(hash, tmp);
info = m_triangleInfoMap->find(hash);
}
- int sumvertsA = sharedVertsA[0]+sharedVertsA[1];
- int otherIndexA = 3-sumvertsA;
+ int sumvertsA = sharedVertsA[0] + sharedVertsA[1];
+ int otherIndexA = 3 - sumvertsA;
-
- btVector3 edge(m_triangleVerticesA[sharedVertsA[1]]-m_triangleVerticesA[sharedVertsA[0]]);
+ btVector3 edge(m_triangleVerticesA[sharedVertsA[1]] - m_triangleVerticesA[sharedVertsA[0]]);
- btTriangleShape tA(m_triangleVerticesA[0],m_triangleVerticesA[1],m_triangleVerticesA[2]);
- int otherIndexB = 3-(sharedVertsB[0]+sharedVertsB[1]);
+ btTriangleShape tA(m_triangleVerticesA[0], m_triangleVerticesA[1], m_triangleVerticesA[2]);
+ int otherIndexB = 3 - (sharedVertsB[0] + sharedVertsB[1]);
- btTriangleShape tB(triangle[sharedVertsB[1]],triangle[sharedVertsB[0]],triangle[otherIndexB]);
+ btTriangleShape tB(triangle[sharedVertsB[1]], triangle[sharedVertsB[0]], triangle[otherIndexB]);
//btTriangleShape tB(triangle[0],triangle[1],triangle[2]);
btVector3 normalA;
@@ -168,26 +160,25 @@ struct btConnectivityProcessor : public btTriangleCallback
btVector3 edgeCrossA = edge.cross(normalA).normalize();
{
- btVector3 tmp = m_triangleVerticesA[otherIndexA]-m_triangleVerticesA[sharedVertsA[0]];
+ btVector3 tmp = m_triangleVerticesA[otherIndexA] - m_triangleVerticesA[sharedVertsA[0]];
if (edgeCrossA.dot(tmp) < 0)
{
- edgeCrossA*=-1;
+ edgeCrossA *= -1;
}
}
btVector3 edgeCrossB = edge.cross(normalB).normalize();
{
- btVector3 tmp = triangle[otherIndexB]-triangle[sharedVertsB[0]];
+ btVector3 tmp = triangle[otherIndexB] - triangle[sharedVertsB[0]];
if (edgeCrossB.dot(tmp) < 0)
{
- edgeCrossB*=-1;
+ edgeCrossB *= -1;
}
}
- btScalar angle2 = 0;
- btScalar ang4 = 0.f;
-
+ btScalar angle2 = 0;
+ btScalar ang4 = 0.f;
btVector3 calculatedEdge = edgeCrossA.cross(edgeCrossB);
btScalar len2 = calculatedEdge.length2();
@@ -196,52 +187,47 @@ struct btConnectivityProcessor : public btTriangleCallback
//btVector3 calculatedNormalB = normalA;
bool isConvex = false;
- if (len2<m_triangleInfoMap->m_planarEpsilon)
+ if (len2 < m_triangleInfoMap->m_planarEpsilon)
{
angle2 = 0.f;
ang4 = 0.f;
- } else
+ }
+ else
{
-
calculatedEdge.normalize();
btVector3 calculatedNormalA = calculatedEdge.cross(edgeCrossA);
calculatedNormalA.normalize();
- angle2 = btGetAngle(calculatedNormalA,edgeCrossA,edgeCrossB);
- ang4 = SIMD_PI-angle2;
+ angle2 = btGetAngle(calculatedNormalA, edgeCrossA, edgeCrossB);
+ ang4 = SIMD_PI - angle2;
btScalar dotA = normalA.dot(edgeCrossB);
///@todo: check if we need some epsilon, due to floating point imprecision
- isConvex = (dotA<0.);
+ isConvex = (dotA < 0.);
correctedAngle = isConvex ? ang4 : -ang4;
}
-
-
-
-
- //alternatively use
+ //alternatively use
//btVector3 calculatedNormalB2 = quatRotate(orn,normalA);
-
switch (sumvertsA)
{
- case 1:
+ case 1:
{
- btVector3 edge = m_triangleVerticesA[0]-m_triangleVerticesA[1];
- btQuaternion orn(edge,-correctedAngle);
- btVector3 computedNormalB = quatRotate(orn,normalA);
+ btVector3 edge = m_triangleVerticesA[0] - m_triangleVerticesA[1];
+ btQuaternion orn(edge, -correctedAngle);
+ btVector3 computedNormalB = quatRotate(orn, normalA);
btScalar bla = computedNormalB.dot(normalB);
- if (bla<0)
+ if (bla < 0)
{
- computedNormalB*=-1;
+ computedNormalB *= -1;
info->m_flags |= TRI_INFO_V0V1_SWAP_NORMALB;
}
#ifdef DEBUG_INTERNAL_EDGE
- if ((computedNormalB-normalB).length()>0.0001)
+ if ((computedNormalB - normalB).length() > 0.0001)
{
printf("warning: normals not identical\n");
}
-#endif//DEBUG_INTERNAL_EDGE
+#endif //DEBUG_INTERNAL_EDGE
info->m_edgeV0V1Angle = -correctedAngle;
@@ -249,44 +235,44 @@ struct btConnectivityProcessor : public btTriangleCallback
info->m_flags |= TRI_INFO_V0V1_CONVEX;
break;
}
- case 2:
+ case 2:
{
- btVector3 edge = m_triangleVerticesA[2]-m_triangleVerticesA[0];
- btQuaternion orn(edge,-correctedAngle);
- btVector3 computedNormalB = quatRotate(orn,normalA);
- if (computedNormalB.dot(normalB)<0)
+ btVector3 edge = m_triangleVerticesA[2] - m_triangleVerticesA[0];
+ btQuaternion orn(edge, -correctedAngle);
+ btVector3 computedNormalB = quatRotate(orn, normalA);
+ if (computedNormalB.dot(normalB) < 0)
{
- computedNormalB*=-1;
+ computedNormalB *= -1;
info->m_flags |= TRI_INFO_V2V0_SWAP_NORMALB;
}
#ifdef DEBUG_INTERNAL_EDGE
- if ((computedNormalB-normalB).length()>0.0001)
+ if ((computedNormalB - normalB).length() > 0.0001)
{
printf("warning: normals not identical\n");
}
-#endif //DEBUG_INTERNAL_EDGE
+#endif //DEBUG_INTERNAL_EDGE
info->m_edgeV2V0Angle = -correctedAngle;
if (isConvex)
info->m_flags |= TRI_INFO_V2V0_CONVEX;
- break;
+ break;
}
- case 3:
+ case 3:
{
- btVector3 edge = m_triangleVerticesA[1]-m_triangleVerticesA[2];
- btQuaternion orn(edge,-correctedAngle);
- btVector3 computedNormalB = quatRotate(orn,normalA);
- if (computedNormalB.dot(normalB)<0)
+ btVector3 edge = m_triangleVerticesA[1] - m_triangleVerticesA[2];
+ btQuaternion orn(edge, -correctedAngle);
+ btVector3 computedNormalB = quatRotate(orn, normalA);
+ if (computedNormalB.dot(normalB) < 0)
{
info->m_flags |= TRI_INFO_V1V2_SWAP_NORMALB;
- computedNormalB*=-1;
+ computedNormalB *= -1;
}
#ifdef DEBUG_INTERNAL_EDGE
- if ((computedNormalB-normalB).length()>0.0001)
+ if ((computedNormalB - normalB).length() > 0.0001)
{
printf("warning: normals not identical\n");
}
-#endif //DEBUG_INTERNAL_EDGE
+#endif //DEBUG_INTERNAL_EDGE
info->m_edgeV1V2Angle = -correctedAngle;
if (isConvex)
@@ -297,18 +283,17 @@ struct btConnectivityProcessor : public btTriangleCallback
break;
}
- default:
+ default:
{
// printf("warning: duplicate triangle\n");
}
-
}
}
};
/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
-void btGenerateInternalEdgeInfo (btBvhTriangleMeshShape*trimeshShape, btTriangleInfoMap* triangleInfoMap)
+void btGenerateInternalEdgeInfo(btBvhTriangleMeshShape* trimeshShape, btTriangleInfoMap* triangleInfoMap)
{
//the user pointer shouldn't already be used for other purposes, we intend to store connectivity info there!
if (trimeshShape->getTriangleInfoMap())
@@ -319,46 +304,45 @@ void btGenerateInternalEdgeInfo (btBvhTriangleMeshShape*trimeshShape, btTriangle
btStridingMeshInterface* meshInterface = trimeshShape->getMeshInterface();
const btVector3& meshScaling = meshInterface->getScaling();
- for (int partId = 0; partId< meshInterface->getNumSubParts();partId++)
+ for (int partId = 0; partId < meshInterface->getNumSubParts(); partId++)
{
- const unsigned char *vertexbase = 0;
+ const unsigned char* vertexbase = 0;
int numverts = 0;
PHY_ScalarType type = PHY_INTEGER;
int stride = 0;
- const unsigned char *indexbase = 0;
+ const unsigned char* indexbase = 0;
int indexstride = 0;
int numfaces = 0;
PHY_ScalarType indicestype = PHY_INTEGER;
//PHY_ScalarType indexType=0;
btVector3 triangleVerts[3];
- meshInterface->getLockedReadOnlyVertexIndexBase(&vertexbase,numverts, type,stride,&indexbase,indexstride,numfaces,indicestype,partId);
- btVector3 aabbMin,aabbMax;
+ meshInterface->getLockedReadOnlyVertexIndexBase(&vertexbase, numverts, type, stride, &indexbase, indexstride, numfaces, indicestype, partId);
+ btVector3 aabbMin, aabbMax;
- for (int triangleIndex = 0 ; triangleIndex < numfaces;triangleIndex++)
+ for (int triangleIndex = 0; triangleIndex < numfaces; triangleIndex++)
{
- unsigned int* gfxbase = (unsigned int*)(indexbase+triangleIndex*indexstride);
+ unsigned int* gfxbase = (unsigned int*)(indexbase + triangleIndex * indexstride);
- for (int j=2;j>=0;j--)
+ for (int j = 2; j >= 0; j--)
{
-
- int graphicsindex = indicestype==PHY_SHORT?((unsigned short*)gfxbase)[j]:gfxbase[j];
+ int graphicsindex = indicestype == PHY_SHORT ? ((unsigned short*)gfxbase)[j] : gfxbase[j];
if (type == PHY_FLOAT)
{
- float* graphicsbase = (float*)(vertexbase+graphicsindex*stride);
+ float* graphicsbase = (float*)(vertexbase + graphicsindex * stride);
triangleVerts[j] = btVector3(
- graphicsbase[0]*meshScaling.getX(),
- graphicsbase[1]*meshScaling.getY(),
- graphicsbase[2]*meshScaling.getZ());
+ graphicsbase[0] * meshScaling.getX(),
+ graphicsbase[1] * meshScaling.getY(),
+ graphicsbase[2] * meshScaling.getZ());
}
else
{
- double* graphicsbase = (double*)(vertexbase+graphicsindex*stride);
- triangleVerts[j] = btVector3( btScalar(graphicsbase[0]*meshScaling.getX()), btScalar(graphicsbase[1]*meshScaling.getY()), btScalar(graphicsbase[2]*meshScaling.getZ()));
+ double* graphicsbase = (double*)(vertexbase + graphicsindex * stride);
+ triangleVerts[j] = btVector3(btScalar(graphicsbase[0] * meshScaling.getX()), btScalar(graphicsbase[1] * meshScaling.getY()), btScalar(graphicsbase[2] * meshScaling.getZ()));
}
}
- aabbMin.setValue(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
- aabbMax.setValue(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
+ aabbMin.setValue(btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT));
+ aabbMax.setValue(btScalar(-BT_LARGE_FLOAT), btScalar(-BT_LARGE_FLOAT), btScalar(-BT_LARGE_FLOAT));
aabbMin.setMin(triangleVerts[0]);
aabbMax.setMax(triangleVerts[0]);
aabbMin.setMin(triangleVerts[1]);
@@ -370,140 +354,127 @@ void btGenerateInternalEdgeInfo (btBvhTriangleMeshShape*trimeshShape, btTriangle
connectivityProcessor.m_partIdA = partId;
connectivityProcessor.m_triangleIndexA = triangleIndex;
connectivityProcessor.m_triangleVerticesA = &triangleVerts[0];
- connectivityProcessor.m_triangleInfoMap = triangleInfoMap;
+ connectivityProcessor.m_triangleInfoMap = triangleInfoMap;
- trimeshShape->processAllTriangles(&connectivityProcessor,aabbMin,aabbMax);
+ trimeshShape->processAllTriangles(&connectivityProcessor, aabbMin, aabbMax);
}
-
}
-
}
-
-
-
// 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 btNearestPointInLineSegment(const btVector3 &point, const btVector3& line0, const btVector3& line1, btVector3& nearestPoint)
+void btNearestPointInLineSegment(const btVector3& point, const btVector3& line0, const btVector3& line1, btVector3& nearestPoint)
{
- btVector3 lineDelta = line1 - line0;
+ btVector3 lineDelta = line1 - line0;
// Handle degenerate lines
- if ( lineDelta.fuzzyZero())
+ if (lineDelta.fuzzyZero())
{
nearestPoint = line0;
}
else
{
- btScalar delta = (point-line0).dot(lineDelta) / (lineDelta).dot(lineDelta);
+ btScalar delta = (point - line0).dot(lineDelta) / (lineDelta).dot(lineDelta);
// Clamp the point to conform to the segment's endpoints
- if ( delta < 0 )
+ if (delta < 0)
delta = 0;
- else if ( delta > 1 )
+ else if (delta > 1)
delta = 1;
- nearestPoint = line0 + lineDelta*delta;
+ nearestPoint = line0 + lineDelta * delta;
}
}
-
-
-
-bool btClampNormal(const btVector3& edge,const btVector3& tri_normal_org,const btVector3& localContactNormalOnB, btScalar correctedEdgeAngle, btVector3 & clampedLocalNormal)
+bool btClampNormal(const btVector3& edge, const btVector3& tri_normal_org, const btVector3& localContactNormalOnB, btScalar correctedEdgeAngle, btVector3& clampedLocalNormal)
{
btVector3 tri_normal = tri_normal_org;
//we only have a local triangle normal, not a local contact normal -> only normal in world space...
//either compute the current angle all in local space, or all in world space
btVector3 edgeCross = edge.cross(tri_normal).normalize();
- btScalar curAngle = btGetAngle(edgeCross,tri_normal,localContactNormalOnB);
+ btScalar curAngle = btGetAngle(edgeCross, tri_normal, localContactNormalOnB);
- if (correctedEdgeAngle<0)
+ if (correctedEdgeAngle < 0)
{
if (curAngle < correctedEdgeAngle)
{
- btScalar diffAngle = correctedEdgeAngle-curAngle;
- btQuaternion rotation(edge,diffAngle );
- clampedLocalNormal = btMatrix3x3(rotation)*localContactNormalOnB;
+ btScalar diffAngle = correctedEdgeAngle - curAngle;
+ btQuaternion rotation(edge, diffAngle);
+ clampedLocalNormal = btMatrix3x3(rotation) * localContactNormalOnB;
return true;
}
}
- if (correctedEdgeAngle>=0)
+ if (correctedEdgeAngle >= 0)
{
if (curAngle > correctedEdgeAngle)
{
- btScalar diffAngle = correctedEdgeAngle-curAngle;
- btQuaternion rotation(edge,diffAngle );
- clampedLocalNormal = btMatrix3x3(rotation)*localContactNormalOnB;
+ btScalar diffAngle = correctedEdgeAngle - curAngle;
+ btQuaternion rotation(edge, diffAngle);
+ clampedLocalNormal = btMatrix3x3(rotation) * localContactNormalOnB;
return true;
}
}
return false;
}
-
-
/// Changes a btManifoldPoint collision normal to the normal from the mesh.
-void btAdjustInternalEdgeContacts(btManifoldPoint& cp, const btCollisionObjectWrapper* colObj0Wrap,const btCollisionObjectWrapper* colObj1Wrap, int partId0, int index0, int normalAdjustFlags)
+void btAdjustInternalEdgeContacts(btManifoldPoint& cp, const btCollisionObjectWrapper* colObj0Wrap, const btCollisionObjectWrapper* colObj1Wrap, int partId0, int index0, int normalAdjustFlags)
{
//btAssert(colObj0->getCollisionShape()->getShapeType() == TRIANGLE_SHAPE_PROXYTYPE);
if (colObj0Wrap->getCollisionShape()->getShapeType() != TRIANGLE_SHAPE_PROXYTYPE)
return;
btBvhTriangleMeshShape* trimesh = 0;
-
- if( colObj0Wrap->getCollisionObject()->getCollisionShape()->getShapeType() == SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE )
+
+ if (colObj0Wrap->getCollisionObject()->getCollisionShape()->getShapeType() == SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE)
{
trimesh = ((btScaledBvhTriangleMeshShape*)colObj0Wrap->getCollisionObject()->getCollisionShape())->getChildShape();
}
else
{
- if (colObj0Wrap->getCollisionObject()->getCollisionShape()->getShapeType()==TRIANGLE_MESH_SHAPE_PROXYTYPE)
+ if (colObj0Wrap->getCollisionObject()->getCollisionShape()->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE)
{
trimesh = (btBvhTriangleMeshShape*)colObj0Wrap->getCollisionObject()->getCollisionShape();
}
}
- if (trimesh==0)
+ if (trimesh == 0)
return;
- btTriangleInfoMap* triangleInfoMapPtr = (btTriangleInfoMap*) trimesh->getTriangleInfoMap();
+ btTriangleInfoMap* triangleInfoMapPtr = (btTriangleInfoMap*)trimesh->getTriangleInfoMap();
if (!triangleInfoMapPtr)
return;
- int hash = btGetHash(partId0,index0);
-
+ int hash = btGetHash(partId0, index0);
btTriangleInfo* info = triangleInfoMapPtr->find(hash);
if (!info)
return;
- btScalar frontFacing = (normalAdjustFlags & BT_TRIANGLE_CONVEX_BACKFACE_MODE)==0? 1.f : -1.f;
-
+ btScalar frontFacing = (normalAdjustFlags & BT_TRIANGLE_CONVEX_BACKFACE_MODE) == 0 ? 1.f : -1.f;
+
const btTriangleShape* tri_shape = static_cast<const btTriangleShape*>(colObj0Wrap->getCollisionShape());
- btVector3 v0,v1,v2;
- tri_shape->getVertex(0,v0);
- tri_shape->getVertex(1,v1);
- tri_shape->getVertex(2,v2);
+ btVector3 v0, v1, v2;
+ tri_shape->getVertex(0, v0);
+ tri_shape->getVertex(1, v1);
+ tri_shape->getVertex(2, v2);
//btVector3 center = (v0+v1+v2)*btScalar(1./3.);
- btVector3 red(1,0,0), green(0,1,0),blue(0,0,1),white(1,1,1),black(0,0,0);
+ btVector3 red(1, 0, 0), green(0, 1, 0), blue(0, 0, 1), white(1, 1, 1), black(0, 0, 0);
btVector3 tri_normal;
tri_shape->calcNormal(tri_normal);
//btScalar dot = tri_normal.dot(cp.m_normalWorldOnB);
btVector3 nearest;
- btNearestPointInLineSegment(cp.m_localPointB,v0,v1,nearest);
+ btNearestPointInLineSegment(cp.m_localPointB, v0, v1, nearest);
btVector3 contact = cp.m_localPointB;
#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
const btTransform& tr = colObj0->getWorldTransform();
- btDebugDrawLine(tr*nearest,tr*cp.m_localPointB,red);
-#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
-
-
+ btDebugDrawLine(tr * nearest, tr * cp.m_localPointB, red);
+#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
bool isNearEdge = false;
@@ -511,334 +482,325 @@ void btAdjustInternalEdgeContacts(btManifoldPoint& cp, const btCollisionObjectWr
int numConvexEdgeHits = 0;
btVector3 localContactNormalOnB = colObj0Wrap->getWorldTransform().getBasis().transpose() * cp.m_normalWorldOnB;
- localContactNormalOnB.normalize();//is this necessary?
-
+ localContactNormalOnB.normalize(); //is this necessary?
+
// Get closest edge
- int bestedge=-1;
- btScalar disttobestedge=BT_LARGE_FLOAT;
+ int bestedge = -1;
+ btScalar disttobestedge = BT_LARGE_FLOAT;
//
// Edge 0 -> 1
- if (btFabs(info->m_edgeV0V1Angle)< triangleInfoMapPtr->m_maxEdgeAngleThreshold)
- {
- btVector3 nearest;
- btNearestPointInLineSegment( cp.m_localPointB, v0, v1, nearest );
- btScalar len=(contact-nearest).length();
- //
- if( len < disttobestedge )
- {
- bestedge=0;
- disttobestedge=len;
- }
- }
+ if (btFabs(info->m_edgeV0V1Angle) < triangleInfoMapPtr->m_maxEdgeAngleThreshold)
+ {
+ btVector3 nearest;
+ btNearestPointInLineSegment(cp.m_localPointB, v0, v1, nearest);
+ btScalar len = (contact - nearest).length();
+ //
+ if (len < disttobestedge)
+ {
+ bestedge = 0;
+ disttobestedge = len;
+ }
+ }
// Edge 1 -> 2
- if (btFabs(info->m_edgeV1V2Angle)< triangleInfoMapPtr->m_maxEdgeAngleThreshold)
- {
- btVector3 nearest;
- btNearestPointInLineSegment( cp.m_localPointB, v1, v2, nearest );
- btScalar len=(contact-nearest).length();
- //
- if( len < disttobestedge )
- {
- bestedge=1;
- disttobestedge=len;
- }
- }
+ if (btFabs(info->m_edgeV1V2Angle) < triangleInfoMapPtr->m_maxEdgeAngleThreshold)
+ {
+ btVector3 nearest;
+ btNearestPointInLineSegment(cp.m_localPointB, v1, v2, nearest);
+ btScalar len = (contact - nearest).length();
+ //
+ if (len < disttobestedge)
+ {
+ bestedge = 1;
+ disttobestedge = len;
+ }
+ }
// Edge 2 -> 0
- if (btFabs(info->m_edgeV2V0Angle)< triangleInfoMapPtr->m_maxEdgeAngleThreshold)
- {
- btVector3 nearest;
- btNearestPointInLineSegment( cp.m_localPointB, v2, v0, nearest );
- btScalar len=(contact-nearest).length();
- //
- if( len < disttobestedge )
- {
- bestedge=2;
- disttobestedge=len;
- }
- }
-
+ if (btFabs(info->m_edgeV2V0Angle) < triangleInfoMapPtr->m_maxEdgeAngleThreshold)
+ {
+ btVector3 nearest;
+ btNearestPointInLineSegment(cp.m_localPointB, v2, v0, nearest);
+ btScalar len = (contact - nearest).length();
+ //
+ if (len < disttobestedge)
+ {
+ bestedge = 2;
+ disttobestedge = len;
+ }
+ }
+
#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
- btVector3 upfix=tri_normal * btVector3(0.1f,0.1f,0.1f);
- btDebugDrawLine(tr * v0 + upfix, tr * v1 + upfix, red );
-#endif
- if (btFabs(info->m_edgeV0V1Angle)< triangleInfoMapPtr->m_maxEdgeAngleThreshold)
+ btVector3 upfix = tri_normal * btVector3(0.1f, 0.1f, 0.1f);
+ btDebugDrawLine(tr * v0 + upfix, tr * v1 + upfix, red);
+#endif
+ if (btFabs(info->m_edgeV0V1Angle) < triangleInfoMapPtr->m_maxEdgeAngleThreshold)
{
#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
- btDebugDrawLine(tr*contact,tr*(contact+cp.m_normalWorldOnB*10),black);
+ btDebugDrawLine(tr * contact, tr * (contact + cp.m_normalWorldOnB * 10), black);
#endif
- btScalar len = (contact-nearest).length();
- if(len<triangleInfoMapPtr->m_edgeDistanceThreshold)
- if( bestedge==0 )
- {
- btVector3 edge(v0-v1);
- isNearEdge = true;
-
- if (info->m_edgeV0V1Angle==btScalar(0))
- {
- numConcaveEdgeHits++;
- } else
+ btScalar len = (contact - nearest).length();
+ if (len < triangleInfoMapPtr->m_edgeDistanceThreshold)
+ if (bestedge == 0)
{
+ btVector3 edge(v0 - v1);
+ isNearEdge = true;
- bool isEdgeConvex = (info->m_flags & TRI_INFO_V0V1_CONVEX);
- btScalar swapFactor = isEdgeConvex ? btScalar(1) : btScalar(-1);
- #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
- btDebugDrawLine(tr*nearest,tr*(nearest+swapFactor*tri_normal*10),white);
- #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
+ if (info->m_edgeV0V1Angle == btScalar(0))
+ {
+ numConcaveEdgeHits++;
+ }
+ else
+ {
+ bool isEdgeConvex = (info->m_flags & TRI_INFO_V0V1_CONVEX);
+ btScalar swapFactor = isEdgeConvex ? btScalar(1) : btScalar(-1);
+#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
+ btDebugDrawLine(tr * nearest, tr * (nearest + swapFactor * tri_normal * 10), white);
+#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
- btVector3 nA = swapFactor * tri_normal;
+ btVector3 nA = swapFactor * tri_normal;
- btQuaternion orn(edge,info->m_edgeV0V1Angle);
- btVector3 computedNormalB = quatRotate(orn,tri_normal);
- if (info->m_flags & TRI_INFO_V0V1_SWAP_NORMALB)
- computedNormalB*=-1;
- btVector3 nB = swapFactor*computedNormalB;
+ btQuaternion orn(edge, info->m_edgeV0V1Angle);
+ btVector3 computedNormalB = quatRotate(orn, tri_normal);
+ if (info->m_flags & TRI_INFO_V0V1_SWAP_NORMALB)
+ computedNormalB *= -1;
+ btVector3 nB = swapFactor * computedNormalB;
- btScalar NdotA = localContactNormalOnB.dot(nA);
- btScalar NdotB = localContactNormalOnB.dot(nB);
- bool backFacingNormal = (NdotA< triangleInfoMapPtr->m_convexEpsilon) && (NdotB<triangleInfoMapPtr->m_convexEpsilon);
+ btScalar NdotA = localContactNormalOnB.dot(nA);
+ btScalar NdotB = localContactNormalOnB.dot(nB);
+ bool backFacingNormal = (NdotA < triangleInfoMapPtr->m_convexEpsilon) && (NdotB < triangleInfoMapPtr->m_convexEpsilon);
#ifdef DEBUG_INTERNAL_EDGE
- {
-
- btDebugDrawLine(cp.getPositionWorldOnB(),cp.getPositionWorldOnB()+tr.getBasis()*(nB*20),red);
- }
-#endif //DEBUG_INTERNAL_EDGE
-
+ {
+ btDebugDrawLine(cp.getPositionWorldOnB(), cp.getPositionWorldOnB() + tr.getBasis() * (nB * 20), red);
+ }
+#endif //DEBUG_INTERNAL_EDGE
- if (backFacingNormal)
- {
- numConcaveEdgeHits++;
- }
- else
- {
- numConvexEdgeHits++;
- btVector3 clampedLocalNormal;
- bool isClamped = btClampNormal(edge,swapFactor*tri_normal,localContactNormalOnB, info->m_edgeV0V1Angle,clampedLocalNormal);
- if (isClamped)
+ if (backFacingNormal)
+ {
+ numConcaveEdgeHits++;
+ }
+ else
{
- if (((normalAdjustFlags & BT_TRIANGLE_CONVEX_DOUBLE_SIDED)!=0) || (clampedLocalNormal.dot(frontFacing*tri_normal)>0))
+ numConvexEdgeHits++;
+ btVector3 clampedLocalNormal;
+ bool isClamped = btClampNormal(edge, swapFactor * tri_normal, localContactNormalOnB, info->m_edgeV0V1Angle, clampedLocalNormal);
+ if (isClamped)
{
- btVector3 newNormal = colObj0Wrap->getWorldTransform().getBasis() * clampedLocalNormal;
- // cp.m_distance1 = cp.m_distance1 * newNormal.dot(cp.m_normalWorldOnB);
- cp.m_normalWorldOnB = newNormal;
- // Reproject collision point along normal. (what about cp.m_distance1?)
- cp.m_positionWorldOnB = cp.m_positionWorldOnA - cp.m_normalWorldOnB * cp.m_distance1;
- cp.m_localPointB = colObj0Wrap->getWorldTransform().invXform(cp.m_positionWorldOnB);
-
+ if (((normalAdjustFlags & BT_TRIANGLE_CONVEX_DOUBLE_SIDED) != 0) || (clampedLocalNormal.dot(frontFacing * tri_normal) > 0))
+ {
+ btVector3 newNormal = colObj0Wrap->getWorldTransform().getBasis() * clampedLocalNormal;
+ // cp.m_distance1 = cp.m_distance1 * newNormal.dot(cp.m_normalWorldOnB);
+ cp.m_normalWorldOnB = newNormal;
+ // Reproject collision point along normal. (what about cp.m_distance1?)
+ cp.m_positionWorldOnB = cp.m_positionWorldOnA - cp.m_normalWorldOnB * cp.m_distance1;
+ cp.m_localPointB = colObj0Wrap->getWorldTransform().invXform(cp.m_positionWorldOnB);
+ }
}
}
}
}
- }
}
- btNearestPointInLineSegment(contact,v1,v2,nearest);
+ btNearestPointInLineSegment(contact, v1, v2, nearest);
#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
- btDebugDrawLine(tr*nearest,tr*cp.m_localPointB,green);
-#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
+ btDebugDrawLine(tr * nearest, tr * cp.m_localPointB, green);
+#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
- btDebugDrawLine(tr * v1 + upfix, tr * v2 + upfix , green );
-#endif
+ btDebugDrawLine(tr * v1 + upfix, tr * v2 + upfix, green);
+#endif
- if (btFabs(info->m_edgeV1V2Angle)< triangleInfoMapPtr->m_maxEdgeAngleThreshold)
+ if (btFabs(info->m_edgeV1V2Angle) < triangleInfoMapPtr->m_maxEdgeAngleThreshold)
{
#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
- btDebugDrawLine(tr*contact,tr*(contact+cp.m_normalWorldOnB*10),black);
-#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
-
-
-
- btScalar len = (contact-nearest).length();
- if(len<triangleInfoMapPtr->m_edgeDistanceThreshold)
- if( bestedge==1 )
- {
- isNearEdge = true;
-#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
- btDebugDrawLine(tr*nearest,tr*(nearest+tri_normal*10),white);
-#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
+ btDebugDrawLine(tr * contact, tr * (contact + cp.m_normalWorldOnB * 10), black);
+#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
- btVector3 edge(v1-v2);
-
- isNearEdge = true;
-
- if (info->m_edgeV1V2Angle == btScalar(0))
+ btScalar len = (contact - nearest).length();
+ if (len < triangleInfoMapPtr->m_edgeDistanceThreshold)
+ if (bestedge == 1)
{
- numConcaveEdgeHits++;
- } else
- {
- bool isEdgeConvex = (info->m_flags & TRI_INFO_V1V2_CONVEX)!=0;
- btScalar swapFactor = isEdgeConvex ? btScalar(1) : btScalar(-1);
- #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
- btDebugDrawLine(tr*nearest,tr*(nearest+swapFactor*tri_normal*10),white);
- #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
-
- btVector3 nA = swapFactor * tri_normal;
-
- btQuaternion orn(edge,info->m_edgeV1V2Angle);
- btVector3 computedNormalB = quatRotate(orn,tri_normal);
- if (info->m_flags & TRI_INFO_V1V2_SWAP_NORMALB)
- computedNormalB*=-1;
- btVector3 nB = swapFactor*computedNormalB;
-
-#ifdef DEBUG_INTERNAL_EDGE
- {
- btDebugDrawLine(cp.getPositionWorldOnB(),cp.getPositionWorldOnB()+tr.getBasis()*(nB*20),red);
- }
-#endif //DEBUG_INTERNAL_EDGE
+ isNearEdge = true;
+#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
+ btDebugDrawLine(tr * nearest, tr * (nearest + tri_normal * 10), white);
+#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
+ btVector3 edge(v1 - v2);
- btScalar NdotA = localContactNormalOnB.dot(nA);
- btScalar NdotB = localContactNormalOnB.dot(nB);
- bool backFacingNormal = (NdotA< triangleInfoMapPtr->m_convexEpsilon) && (NdotB<triangleInfoMapPtr->m_convexEpsilon);
+ isNearEdge = true;
- if (backFacingNormal)
+ if (info->m_edgeV1V2Angle == btScalar(0))
{
numConcaveEdgeHits++;
}
else
{
- numConvexEdgeHits++;
- btVector3 localContactNormalOnB = colObj0Wrap->getWorldTransform().getBasis().transpose() * cp.m_normalWorldOnB;
- btVector3 clampedLocalNormal;
- bool isClamped = btClampNormal(edge,swapFactor*tri_normal,localContactNormalOnB, info->m_edgeV1V2Angle,clampedLocalNormal);
- if (isClamped)
+ bool isEdgeConvex = (info->m_flags & TRI_INFO_V1V2_CONVEX) != 0;
+ btScalar swapFactor = isEdgeConvex ? btScalar(1) : btScalar(-1);
+#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
+ btDebugDrawLine(tr * nearest, tr * (nearest + swapFactor * tri_normal * 10), white);
+#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
+
+ btVector3 nA = swapFactor * tri_normal;
+
+ btQuaternion orn(edge, info->m_edgeV1V2Angle);
+ btVector3 computedNormalB = quatRotate(orn, tri_normal);
+ if (info->m_flags & TRI_INFO_V1V2_SWAP_NORMALB)
+ computedNormalB *= -1;
+ btVector3 nB = swapFactor * computedNormalB;
+
+#ifdef DEBUG_INTERNAL_EDGE
+ {
+ btDebugDrawLine(cp.getPositionWorldOnB(), cp.getPositionWorldOnB() + tr.getBasis() * (nB * 20), red);
+ }
+#endif //DEBUG_INTERNAL_EDGE
+
+ btScalar NdotA = localContactNormalOnB.dot(nA);
+ btScalar NdotB = localContactNormalOnB.dot(nB);
+ bool backFacingNormal = (NdotA < triangleInfoMapPtr->m_convexEpsilon) && (NdotB < triangleInfoMapPtr->m_convexEpsilon);
+
+ if (backFacingNormal)
+ {
+ numConcaveEdgeHits++;
+ }
+ else
{
- if (((normalAdjustFlags & BT_TRIANGLE_CONVEX_DOUBLE_SIDED)!=0) || (clampedLocalNormal.dot(frontFacing*tri_normal)>0))
+ numConvexEdgeHits++;
+ btVector3 localContactNormalOnB = colObj0Wrap->getWorldTransform().getBasis().transpose() * cp.m_normalWorldOnB;
+ btVector3 clampedLocalNormal;
+ bool isClamped = btClampNormal(edge, swapFactor * tri_normal, localContactNormalOnB, info->m_edgeV1V2Angle, clampedLocalNormal);
+ if (isClamped)
{
- btVector3 newNormal = colObj0Wrap->getWorldTransform().getBasis() * clampedLocalNormal;
- // cp.m_distance1 = cp.m_distance1 * newNormal.dot(cp.m_normalWorldOnB);
- cp.m_normalWorldOnB = newNormal;
- // Reproject collision point along normal.
- cp.m_positionWorldOnB = cp.m_positionWorldOnA - cp.m_normalWorldOnB * cp.m_distance1;
- cp.m_localPointB = colObj0Wrap->getWorldTransform().invXform(cp.m_positionWorldOnB);
+ if (((normalAdjustFlags & BT_TRIANGLE_CONVEX_DOUBLE_SIDED) != 0) || (clampedLocalNormal.dot(frontFacing * tri_normal) > 0))
+ {
+ btVector3 newNormal = colObj0Wrap->getWorldTransform().getBasis() * clampedLocalNormal;
+ // cp.m_distance1 = cp.m_distance1 * newNormal.dot(cp.m_normalWorldOnB);
+ cp.m_normalWorldOnB = newNormal;
+ // Reproject collision point along normal.
+ cp.m_positionWorldOnB = cp.m_positionWorldOnA - cp.m_normalWorldOnB * cp.m_distance1;
+ cp.m_localPointB = colObj0Wrap->getWorldTransform().invXform(cp.m_positionWorldOnB);
+ }
}
}
}
}
- }
}
- btNearestPointInLineSegment(contact,v2,v0,nearest);
+ btNearestPointInLineSegment(contact, v2, v0, nearest);
#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
- btDebugDrawLine(tr*nearest,tr*cp.m_localPointB,blue);
-#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
+ btDebugDrawLine(tr * nearest, tr * cp.m_localPointB, blue);
+#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
- btDebugDrawLine(tr * v2 + upfix, tr * v0 + upfix , blue );
-#endif
+ btDebugDrawLine(tr * v2 + upfix, tr * v0 + upfix, blue);
+#endif
- if (btFabs(info->m_edgeV2V0Angle)< triangleInfoMapPtr->m_maxEdgeAngleThreshold)
+ if (btFabs(info->m_edgeV2V0Angle) < triangleInfoMapPtr->m_maxEdgeAngleThreshold)
{
-
-#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
- btDebugDrawLine(tr*contact,tr*(contact+cp.m_normalWorldOnB*10),black);
-#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
-
- btScalar len = (contact-nearest).length();
- if(len<triangleInfoMapPtr->m_edgeDistanceThreshold)
- if( bestedge==2 )
- {
- isNearEdge = true;
#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
- btDebugDrawLine(tr*nearest,tr*(nearest+tri_normal*10),white);
-#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
+ btDebugDrawLine(tr * contact, tr * (contact + cp.m_normalWorldOnB * 10), black);
+#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
- btVector3 edge(v2-v0);
-
- if (info->m_edgeV2V0Angle==btScalar(0))
- {
- numConcaveEdgeHits++;
- } else
+ btScalar len = (contact - nearest).length();
+ if (len < triangleInfoMapPtr->m_edgeDistanceThreshold)
+ if (bestedge == 2)
{
+ isNearEdge = true;
+#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
+ btDebugDrawLine(tr * nearest, tr * (nearest + tri_normal * 10), white);
+#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
- bool isEdgeConvex = (info->m_flags & TRI_INFO_V2V0_CONVEX)!=0;
- btScalar swapFactor = isEdgeConvex ? btScalar(1) : btScalar(-1);
- #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
- btDebugDrawLine(tr*nearest,tr*(nearest+swapFactor*tri_normal*10),white);
- #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
-
- btVector3 nA = swapFactor * tri_normal;
- btQuaternion orn(edge,info->m_edgeV2V0Angle);
- btVector3 computedNormalB = quatRotate(orn,tri_normal);
- if (info->m_flags & TRI_INFO_V2V0_SWAP_NORMALB)
- computedNormalB*=-1;
- btVector3 nB = swapFactor*computedNormalB;
-
-#ifdef DEBUG_INTERNAL_EDGE
- {
- btDebugDrawLine(cp.getPositionWorldOnB(),cp.getPositionWorldOnB()+tr.getBasis()*(nB*20),red);
- }
-#endif //DEBUG_INTERNAL_EDGE
-
- btScalar NdotA = localContactNormalOnB.dot(nA);
- btScalar NdotB = localContactNormalOnB.dot(nB);
- bool backFacingNormal = (NdotA< triangleInfoMapPtr->m_convexEpsilon) && (NdotB<triangleInfoMapPtr->m_convexEpsilon);
+ btVector3 edge(v2 - v0);
- if (backFacingNormal)
+ if (info->m_edgeV2V0Angle == btScalar(0))
{
numConcaveEdgeHits++;
}
else
{
- numConvexEdgeHits++;
- // printf("hitting convex edge\n");
+ bool isEdgeConvex = (info->m_flags & TRI_INFO_V2V0_CONVEX) != 0;
+ btScalar swapFactor = isEdgeConvex ? btScalar(1) : btScalar(-1);
+#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
+ btDebugDrawLine(tr * nearest, tr * (nearest + swapFactor * tri_normal * 10), white);
+#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
+
+ btVector3 nA = swapFactor * tri_normal;
+ btQuaternion orn(edge, info->m_edgeV2V0Angle);
+ btVector3 computedNormalB = quatRotate(orn, tri_normal);
+ if (info->m_flags & TRI_INFO_V2V0_SWAP_NORMALB)
+ computedNormalB *= -1;
+ btVector3 nB = swapFactor * computedNormalB;
+
+#ifdef DEBUG_INTERNAL_EDGE
+ {
+ btDebugDrawLine(cp.getPositionWorldOnB(), cp.getPositionWorldOnB() + tr.getBasis() * (nB * 20), red);
+ }
+#endif //DEBUG_INTERNAL_EDGE
+ btScalar NdotA = localContactNormalOnB.dot(nA);
+ btScalar NdotB = localContactNormalOnB.dot(nB);
+ bool backFacingNormal = (NdotA < triangleInfoMapPtr->m_convexEpsilon) && (NdotB < triangleInfoMapPtr->m_convexEpsilon);
- btVector3 localContactNormalOnB = colObj0Wrap->getWorldTransform().getBasis().transpose() * cp.m_normalWorldOnB;
- btVector3 clampedLocalNormal;
- bool isClamped = btClampNormal(edge,swapFactor*tri_normal,localContactNormalOnB,info->m_edgeV2V0Angle,clampedLocalNormal);
- if (isClamped)
+ if (backFacingNormal)
+ {
+ numConcaveEdgeHits++;
+ }
+ else
{
- if (((normalAdjustFlags & BT_TRIANGLE_CONVEX_DOUBLE_SIDED)!=0) || (clampedLocalNormal.dot(frontFacing*tri_normal)>0))
+ numConvexEdgeHits++;
+ // printf("hitting convex edge\n");
+
+ btVector3 localContactNormalOnB = colObj0Wrap->getWorldTransform().getBasis().transpose() * cp.m_normalWorldOnB;
+ btVector3 clampedLocalNormal;
+ bool isClamped = btClampNormal(edge, swapFactor * tri_normal, localContactNormalOnB, info->m_edgeV2V0Angle, clampedLocalNormal);
+ if (isClamped)
{
- btVector3 newNormal = colObj0Wrap->getWorldTransform().getBasis() * clampedLocalNormal;
- // cp.m_distance1 = cp.m_distance1 * newNormal.dot(cp.m_normalWorldOnB);
- cp.m_normalWorldOnB = newNormal;
- // Reproject collision point along normal.
- cp.m_positionWorldOnB = cp.m_positionWorldOnA - cp.m_normalWorldOnB * cp.m_distance1;
- cp.m_localPointB = colObj0Wrap->getWorldTransform().invXform(cp.m_positionWorldOnB);
+ if (((normalAdjustFlags & BT_TRIANGLE_CONVEX_DOUBLE_SIDED) != 0) || (clampedLocalNormal.dot(frontFacing * tri_normal) > 0))
+ {
+ btVector3 newNormal = colObj0Wrap->getWorldTransform().getBasis() * clampedLocalNormal;
+ // cp.m_distance1 = cp.m_distance1 * newNormal.dot(cp.m_normalWorldOnB);
+ cp.m_normalWorldOnB = newNormal;
+ // Reproject collision point along normal.
+ cp.m_positionWorldOnB = cp.m_positionWorldOnA - cp.m_normalWorldOnB * cp.m_distance1;
+ cp.m_localPointB = colObj0Wrap->getWorldTransform().invXform(cp.m_positionWorldOnB);
+ }
}
}
- }
+ }
}
-
-
- }
}
#ifdef DEBUG_INTERNAL_EDGE
{
- btVector3 color(0,1,1);
- btDebugDrawLine(cp.getPositionWorldOnB(),cp.getPositionWorldOnB()+cp.m_normalWorldOnB*10,color);
+ btVector3 color(0, 1, 1);
+ btDebugDrawLine(cp.getPositionWorldOnB(), cp.getPositionWorldOnB() + cp.m_normalWorldOnB * 10, color);
}
-#endif //DEBUG_INTERNAL_EDGE
+#endif //DEBUG_INTERNAL_EDGE
if (isNearEdge)
{
-
- if (numConcaveEdgeHits>0)
+ if (numConcaveEdgeHits > 0)
{
- if ((normalAdjustFlags & BT_TRIANGLE_CONCAVE_DOUBLE_SIDED)!=0)
+ if ((normalAdjustFlags & BT_TRIANGLE_CONCAVE_DOUBLE_SIDED) != 0)
{
//fix tri_normal so it pointing the same direction as the current local contact normal
if (tri_normal.dot(localContactNormalOnB) < 0)
{
tri_normal *= -1;
}
- cp.m_normalWorldOnB = colObj0Wrap->getWorldTransform().getBasis()*tri_normal;
- } else
+ cp.m_normalWorldOnB = colObj0Wrap->getWorldTransform().getBasis() * tri_normal;
+ }
+ else
{
- btVector3 newNormal = tri_normal *frontFacing;
+ btVector3 newNormal = tri_normal * frontFacing;
//if the tri_normal is pointing opposite direction as the current local contact normal, skip it
- btScalar d = newNormal.dot(localContactNormalOnB) ;
- if (d< 0)
+ btScalar d = newNormal.dot(localContactNormalOnB);
+ if (d < 0)
{
return;
}
//modify the normal to be the triangle normal (or backfacing normal)
- cp.m_normalWorldOnB = colObj0Wrap->getWorldTransform().getBasis() *newNormal;
+ cp.m_normalWorldOnB = colObj0Wrap->getWorldTransform().getBasis() * newNormal;
}
-
+
// Reproject collision point along normal.
cp.m_positionWorldOnB = cp.m_positionWorldOnA - cp.m_normalWorldOnB * cp.m_distance1;
cp.m_localPointB = colObj0Wrap->getWorldTransform().invXform(cp.m_positionWorldOnB);
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h
index 7d9aafeee6..9d9cff040f 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h
@@ -16,32 +16,26 @@ struct btCollisionObjectWrapper;
class btManifoldPoint;
class btIDebugDraw;
-
-
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_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(btBvhTriangleMeshShape* 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);
+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
+void btSetDebugDrawer(btIDebugDraw* debugDrawer);
+#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
+#endif //BT_INTERNAL_EDGE_UTILITY_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btManifoldResult.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btManifoldResult.cpp
index 23c73c8825..770eb24369 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btManifoldResult.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btManifoldResult.cpp
@@ -13,106 +13,102 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btManifoldResult.h"
#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h"
#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
#include "BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h"
///This is to allow MaterialCombiner/Custom Friction/Restitution values
-ContactAddedCallback gContactAddedCallback=0;
+ContactAddedCallback gContactAddedCallback = 0;
-CalculateCombinedCallback gCalculateCombinedRestitutionCallback = &btManifoldResult::calculateCombinedRestitution;
-CalculateCombinedCallback gCalculateCombinedFrictionCallback = &btManifoldResult::calculateCombinedFriction;
-CalculateCombinedCallback gCalculateCombinedRollingFrictionCallback = &btManifoldResult::calculateCombinedRollingFriction;
-CalculateCombinedCallback gCalculateCombinedSpinningFrictionCallback = &btManifoldResult::calculateCombinedSpinningFriction;
-CalculateCombinedCallback gCalculateCombinedContactDampingCallback = &btManifoldResult::calculateCombinedContactDamping;
-CalculateCombinedCallback gCalculateCombinedContactStiffnessCallback = &btManifoldResult::calculateCombinedContactStiffness;
+CalculateCombinedCallback gCalculateCombinedRestitutionCallback = &btManifoldResult::calculateCombinedRestitution;
+CalculateCombinedCallback gCalculateCombinedFrictionCallback = &btManifoldResult::calculateCombinedFriction;
+CalculateCombinedCallback gCalculateCombinedRollingFrictionCallback = &btManifoldResult::calculateCombinedRollingFriction;
+CalculateCombinedCallback gCalculateCombinedSpinningFrictionCallback = &btManifoldResult::calculateCombinedSpinningFriction;
+CalculateCombinedCallback gCalculateCombinedContactDampingCallback = &btManifoldResult::calculateCombinedContactDamping;
+CalculateCombinedCallback gCalculateCombinedContactStiffnessCallback = &btManifoldResult::calculateCombinedContactStiffness;
-btScalar btManifoldResult::calculateCombinedRollingFriction(const btCollisionObject* body0,const btCollisionObject* body1)
+btScalar btManifoldResult::calculateCombinedRollingFriction(const btCollisionObject* body0, const btCollisionObject* body1)
{
btScalar friction = body0->getRollingFriction() * body1->getFriction() + body1->getRollingFriction() * body0->getFriction();
- const btScalar MAX_FRICTION = btScalar(10.);
+ const btScalar MAX_FRICTION = btScalar(10.);
if (friction < -MAX_FRICTION)
friction = -MAX_FRICTION;
if (friction > MAX_FRICTION)
friction = MAX_FRICTION;
return friction;
-
}
-btScalar btManifoldResult::calculateCombinedSpinningFriction(const btCollisionObject* body0,const btCollisionObject* body1)
+btScalar btManifoldResult::calculateCombinedSpinningFriction(const btCollisionObject* body0, const btCollisionObject* body1)
{
- btScalar friction = body0->getSpinningFriction() * body1->getFriction() + body1->getSpinningFriction() * body0->getFriction();
-
- const btScalar MAX_FRICTION = btScalar(10.);
- if (friction < -MAX_FRICTION)
- friction = -MAX_FRICTION;
- if (friction > MAX_FRICTION)
- friction = MAX_FRICTION;
- return friction;
+ btScalar friction = body0->getSpinningFriction() * body1->getFriction() + body1->getSpinningFriction() * body0->getFriction();
+
+ const btScalar MAX_FRICTION = btScalar(10.);
+ if (friction < -MAX_FRICTION)
+ friction = -MAX_FRICTION;
+ if (friction > MAX_FRICTION)
+ friction = MAX_FRICTION;
+ return friction;
}
///User can override this material combiner by implementing gContactAddedCallback and setting body0->m_collisionFlags |= btCollisionObject::customMaterialCallback;
-btScalar btManifoldResult::calculateCombinedFriction(const btCollisionObject* body0,const btCollisionObject* body1)
+btScalar btManifoldResult::calculateCombinedFriction(const btCollisionObject* body0, const btCollisionObject* body1)
{
btScalar friction = body0->getFriction() * body1->getFriction();
- const btScalar MAX_FRICTION = btScalar(10.);
+ const btScalar MAX_FRICTION = btScalar(10.);
if (friction < -MAX_FRICTION)
friction = -MAX_FRICTION;
if (friction > MAX_FRICTION)
friction = MAX_FRICTION;
return friction;
-
}
-btScalar btManifoldResult::calculateCombinedRestitution(const btCollisionObject* body0,const btCollisionObject* body1)
+btScalar btManifoldResult::calculateCombinedRestitution(const btCollisionObject* body0, const btCollisionObject* body1)
{
return body0->getRestitution() * body1->getRestitution();
}
-btScalar btManifoldResult::calculateCombinedContactDamping(const btCollisionObject* body0,const btCollisionObject* body1)
+btScalar btManifoldResult::calculateCombinedContactDamping(const btCollisionObject* body0, const btCollisionObject* body1)
{
- return body0->getContactDamping() + body1->getContactDamping();
+ return body0->getContactDamping() + body1->getContactDamping();
}
-btScalar btManifoldResult::calculateCombinedContactStiffness(const btCollisionObject* body0,const btCollisionObject* body1)
+btScalar btManifoldResult::calculateCombinedContactStiffness(const btCollisionObject* body0, const btCollisionObject* body1)
{
-
- btScalar s0 = body0->getContactStiffness();
- btScalar s1 = body1->getContactStiffness();
-
- btScalar tmp0 = btScalar(1)/s0;
- btScalar tmp1 = btScalar(1)/s1;
- btScalar combinedStiffness = btScalar(1) / (tmp0+tmp1);
- return combinedStiffness;
-}
+ btScalar s0 = body0->getContactStiffness();
+ btScalar s1 = body1->getContactStiffness();
+ btScalar tmp0 = btScalar(1) / s0;
+ btScalar tmp1 = btScalar(1) / s1;
+ btScalar combinedStiffness = btScalar(1) / (tmp0 + tmp1);
+ return combinedStiffness;
+}
-btManifoldResult::btManifoldResult(const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap)
- :m_manifoldPtr(0),
- m_body0Wrap(body0Wrap),
- m_body1Wrap(body1Wrap)
+btManifoldResult::btManifoldResult(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap)
+ : m_manifoldPtr(0),
+ m_body0Wrap(body0Wrap),
+ m_body1Wrap(body1Wrap)
#ifdef DEBUG_PART_INDEX
- ,m_partId0(-1),
- m_partId1(-1),
- m_index0(-1),
- m_index1(-1)
-#endif //DEBUG_PART_INDEX
- , m_closestPointDistanceThreshold(0)
+ ,
+ m_partId0(-1),
+ m_partId1(-1),
+ m_index0(-1),
+ m_index1(-1)
+#endif //DEBUG_PART_INDEX
+ ,
+ m_closestPointDistanceThreshold(0)
{
}
-
-void btManifoldResult::addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar depth)
+void btManifoldResult::addContactPoint(const btVector3& normalOnBInWorld, const btVector3& pointInWorld, btScalar depth)
{
btAssert(m_manifoldPtr);
//order in manifold needs to match
if (depth > m_manifoldPtr->getContactBreakingThreshold())
-// if (depth > m_manifoldPtr->getContactProcessingThreshold())
+ // if (depth > m_manifoldPtr->getContactProcessingThreshold())
return;
bool isSwapped = m_manifoldPtr->getBody0() != m_body0Wrap->getCollisionObject();
@@ -122,81 +118,82 @@ void btManifoldResult::addContactPoint(const btVector3& normalOnBInWorld,const b
btVector3 localA;
btVector3 localB;
-
+
if (isSwapped)
{
- localA = m_body1Wrap->getCollisionObject()->getWorldTransform().invXform(pointA );
+ localA = m_body1Wrap->getCollisionObject()->getWorldTransform().invXform(pointA);
localB = m_body0Wrap->getCollisionObject()->getWorldTransform().invXform(pointInWorld);
- } else
+ }
+ else
{
- localA = m_body0Wrap->getCollisionObject()->getWorldTransform().invXform(pointA );
+ localA = m_body0Wrap->getCollisionObject()->getWorldTransform().invXform(pointA);
localB = m_body1Wrap->getCollisionObject()->getWorldTransform().invXform(pointInWorld);
}
- btManifoldPoint newPt(localA,localB,normalOnBInWorld,depth);
+ btManifoldPoint newPt(localA, localB, normalOnBInWorld, depth);
newPt.m_positionWorldOnA = pointA;
newPt.m_positionWorldOnB = pointInWorld;
-
+
int insertIndex = m_manifoldPtr->getCacheEntry(newPt);
- newPt.m_combinedFriction = gCalculateCombinedFrictionCallback(m_body0Wrap->getCollisionObject(),m_body1Wrap->getCollisionObject());
- newPt.m_combinedRestitution = gCalculateCombinedRestitutionCallback(m_body0Wrap->getCollisionObject(),m_body1Wrap->getCollisionObject());
- newPt.m_combinedRollingFriction = gCalculateCombinedRollingFrictionCallback(m_body0Wrap->getCollisionObject(),m_body1Wrap->getCollisionObject());
- newPt.m_combinedSpinningFriction = gCalculateCombinedSpinningFrictionCallback(m_body0Wrap->getCollisionObject(),m_body1Wrap->getCollisionObject());
-
- if ( (m_body0Wrap->getCollisionObject()->getCollisionFlags()& btCollisionObject::CF_HAS_CONTACT_STIFFNESS_DAMPING) ||
- (m_body1Wrap->getCollisionObject()->getCollisionFlags()& btCollisionObject::CF_HAS_CONTACT_STIFFNESS_DAMPING))
- {
- newPt.m_combinedContactDamping1 = gCalculateCombinedContactDampingCallback(m_body0Wrap->getCollisionObject(),m_body1Wrap->getCollisionObject());
- newPt.m_combinedContactStiffness1 = gCalculateCombinedContactStiffnessCallback(m_body0Wrap->getCollisionObject(),m_body1Wrap->getCollisionObject());
- newPt.m_contactPointFlags |= BT_CONTACT_FLAG_CONTACT_STIFFNESS_DAMPING;
- }
-
- if ( (m_body0Wrap->getCollisionObject()->getCollisionFlags()& btCollisionObject::CF_HAS_FRICTION_ANCHOR) ||
- (m_body1Wrap->getCollisionObject()->getCollisionFlags()& btCollisionObject::CF_HAS_FRICTION_ANCHOR))
- {
- newPt.m_contactPointFlags |= BT_CONTACT_FLAG_FRICTION_ANCHOR;
- }
-
- btPlaneSpace1(newPt.m_normalWorldOnB,newPt.m_lateralFrictionDir1,newPt.m_lateralFrictionDir2);
-
-
-
- //BP mod, store contact triangles.
+ newPt.m_combinedFriction = gCalculateCombinedFrictionCallback(m_body0Wrap->getCollisionObject(), m_body1Wrap->getCollisionObject());
+ newPt.m_combinedRestitution = gCalculateCombinedRestitutionCallback(m_body0Wrap->getCollisionObject(), m_body1Wrap->getCollisionObject());
+ newPt.m_combinedRollingFriction = gCalculateCombinedRollingFrictionCallback(m_body0Wrap->getCollisionObject(), m_body1Wrap->getCollisionObject());
+ newPt.m_combinedSpinningFriction = gCalculateCombinedSpinningFrictionCallback(m_body0Wrap->getCollisionObject(), m_body1Wrap->getCollisionObject());
+
+ if ((m_body0Wrap->getCollisionObject()->getCollisionFlags() & btCollisionObject::CF_HAS_CONTACT_STIFFNESS_DAMPING) ||
+ (m_body1Wrap->getCollisionObject()->getCollisionFlags() & btCollisionObject::CF_HAS_CONTACT_STIFFNESS_DAMPING))
+ {
+ newPt.m_combinedContactDamping1 = gCalculateCombinedContactDampingCallback(m_body0Wrap->getCollisionObject(), m_body1Wrap->getCollisionObject());
+ newPt.m_combinedContactStiffness1 = gCalculateCombinedContactStiffnessCallback(m_body0Wrap->getCollisionObject(), m_body1Wrap->getCollisionObject());
+ newPt.m_contactPointFlags |= BT_CONTACT_FLAG_CONTACT_STIFFNESS_DAMPING;
+ }
+
+ if ((m_body0Wrap->getCollisionObject()->getCollisionFlags() & btCollisionObject::CF_HAS_FRICTION_ANCHOR) ||
+ (m_body1Wrap->getCollisionObject()->getCollisionFlags() & btCollisionObject::CF_HAS_FRICTION_ANCHOR))
+ {
+ newPt.m_contactPointFlags |= BT_CONTACT_FLAG_FRICTION_ANCHOR;
+ }
+
+ btPlaneSpace1(newPt.m_normalWorldOnB, newPt.m_lateralFrictionDir1, newPt.m_lateralFrictionDir2);
+
+ //BP mod, store contact triangles.
if (isSwapped)
{
newPt.m_partId0 = m_partId1;
newPt.m_partId1 = m_partId0;
- newPt.m_index0 = m_index1;
- newPt.m_index1 = m_index0;
- } else
+ newPt.m_index0 = m_index1;
+ newPt.m_index1 = m_index0;
+ }
+ else
{
newPt.m_partId0 = m_partId0;
newPt.m_partId1 = m_partId1;
- newPt.m_index0 = m_index0;
- newPt.m_index1 = m_index1;
+ newPt.m_index0 = m_index0;
+ newPt.m_index1 = m_index1;
}
//printf("depth=%f\n",depth);
///@todo, check this for any side effects
if (insertIndex >= 0)
{
//const btManifoldPoint& oldPoint = m_manifoldPtr->getContactPoint(insertIndex);
- m_manifoldPtr->replaceContactPoint(newPt,insertIndex);
- } else
+ m_manifoldPtr->replaceContactPoint(newPt, insertIndex);
+ }
+ else
{
insertIndex = m_manifoldPtr->addManifoldPoint(newPt);
}
-
+
//User can override friction and/or restitution
if (gContactAddedCallback &&
//and if either of the two bodies requires custom material
- ((m_body0Wrap->getCollisionObject()->getCollisionFlags() & btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK) ||
- (m_body1Wrap->getCollisionObject()->getCollisionFlags() & btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK)))
+ ((m_body0Wrap->getCollisionObject()->getCollisionFlags() & btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK) ||
+ (m_body1Wrap->getCollisionObject()->getCollisionFlags() & btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK)))
{
//experimental feature info, for per-triangle material etc.
- const btCollisionObjectWrapper* obj0Wrap = isSwapped? m_body1Wrap : m_body0Wrap;
- const btCollisionObjectWrapper* obj1Wrap = isSwapped? m_body0Wrap : m_body1Wrap;
- (*gContactAddedCallback)(m_manifoldPtr->getContactPoint(insertIndex),obj0Wrap,newPt.m_partId0,newPt.m_index0,obj1Wrap,newPt.m_partId1,newPt.m_index1);
+ const btCollisionObjectWrapper* obj0Wrap = isSwapped ? m_body1Wrap : m_body0Wrap;
+ const btCollisionObjectWrapper* obj1Wrap = isSwapped ? m_body0Wrap : m_body1Wrap;
+ (*gContactAddedCallback)(m_manifoldPtr->getContactPoint(insertIndex), obj0Wrap, newPt.m_partId0, newPt.m_index0, obj1Wrap, newPt.m_partId1, newPt.m_index1);
}
if (gContactStartedCallback && isNewCollision)
@@ -204,4 +201,3 @@ void btManifoldResult::addContactPoint(const btVector3& normalOnBInWorld,const b
gContactStartedCallback(m_manifoldPtr);
}
}
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btManifoldResult.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btManifoldResult.h
index 12cdafd1b6..6c0a2d9a43 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btManifoldResult.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btManifoldResult.h
@@ -13,7 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#ifndef BT_MANIFOLD_RESULT_H
#define BT_MANIFOLD_RESULT_H
@@ -29,85 +28,81 @@ class btManifoldPoint;
#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;
+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);
+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;
+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_partId0;
int m_partId1;
int m_index0;
int m_index1;
-
-
-public:
+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)
+
+ 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);
+ btManifoldResult(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap);
- virtual ~btManifoldResult() {};
+ virtual ~btManifoldResult(){};
- void setPersistentManifold(btPersistentManifold* manifoldPtr)
+ void setPersistentManifold(btPersistentManifold* manifoldPtr)
{
m_manifoldPtr = manifoldPtr;
}
- const btPersistentManifold* getPersistentManifold() const
+ const btPersistentManifold* getPersistentManifold() const
{
return m_manifoldPtr;
}
- btPersistentManifold* getPersistentManifold()
+ btPersistentManifold* getPersistentManifold()
{
return m_manifoldPtr;
}
- virtual void setShapeIdentifiersA(int partId0,int index0)
+ virtual void setShapeIdentifiersA(int partId0, int index0)
{
- m_partId0=partId0;
- m_index0=index0;
+ m_partId0 = partId0;
+ m_index0 = index0;
}
- virtual void setShapeIdentifiersB( int partId1,int index1)
+ virtual void setShapeIdentifiersB(int partId1, int index1)
{
- m_partId1=partId1;
- m_index1=index1;
+ m_partId1 = partId1;
+ m_index1 = index1;
}
+ virtual void addContactPoint(const btVector3& normalOnBInWorld, const btVector3& pointInWorld, btScalar depth);
- virtual void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar depth);
-
- SIMD_FORCE_INLINE void refreshContactPoints()
+ SIMD_FORCE_INLINE void refreshContactPoints()
{
btAssert(m_manifoldPtr);
if (!m_manifoldPtr->getNumContacts())
@@ -117,10 +112,11 @@ public:
if (isSwapped)
{
- m_manifoldPtr->refreshContactPoints(m_body1Wrap->getCollisionObject()->getWorldTransform(),m_body0Wrap->getCollisionObject()->getWorldTransform());
- } else
+ m_manifoldPtr->refreshContactPoints(m_body1Wrap->getCollisionObject()->getWorldTransform(), m_body0Wrap->getCollisionObject()->getWorldTransform());
+ }
+ else
{
- m_manifoldPtr->refreshContactPoints(m_body0Wrap->getCollisionObject()->getWorldTransform(),m_body1Wrap->getCollisionObject()->getWorldTransform());
+ m_manifoldPtr->refreshContactPoints(m_body0Wrap->getCollisionObject()->getWorldTransform(), m_body1Wrap->getCollisionObject()->getWorldTransform());
}
}
@@ -153,15 +149,15 @@ public:
return m_body1Wrap->getCollisionObject();
}
- btScalar m_closestPointDistanceThreshold;
+ 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);
+ 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
+#endif //BT_MANIFOLD_RESULT_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp
index 91c76a8dac..e5097ccbbf 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp
@@ -14,7 +14,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "LinearMath/btScalar.h"
#include "btSimulationIslandManager.h"
#include "BulletCollision/BroadphaseCollision/btDispatcher.h"
@@ -25,8 +24,7 @@ subject to the following restrictions:
//#include <stdio.h>
#include "LinearMath/btQuickprof.h"
-btSimulationIslandManager::btSimulationIslandManager():
-m_splitIslands(true)
+btSimulationIslandManager::btSimulationIslandManager() : m_splitIslands(true)
{
}
@@ -34,53 +32,47 @@ btSimulationIslandManager::~btSimulationIslandManager()
{
}
-
void btSimulationIslandManager::initUnionFind(int n)
{
- m_unionFind.reset(n);
+ m_unionFind.reset(n);
}
-
-void btSimulationIslandManager::findUnions(btDispatcher* /* dispatcher */,btCollisionWorld* colWorld)
+void btSimulationIslandManager::findUnions(btDispatcher* /* dispatcher */, btCollisionWorld* colWorld)
{
-
{
btOverlappingPairCache* pairCachePtr = colWorld->getPairCache();
const int numOverlappingPairs = pairCachePtr->getNumOverlappingPairs();
if (numOverlappingPairs)
{
- btBroadphasePair* pairPtr = pairCachePtr->getOverlappingPairArrayPtr();
-
- for (int i=0;i<numOverlappingPairs;i++)
- {
- const btBroadphasePair& collisionPair = pairPtr[i];
- btCollisionObject* colObj0 = (btCollisionObject*)collisionPair.m_pProxy0->m_clientObject;
- btCollisionObject* colObj1 = (btCollisionObject*)collisionPair.m_pProxy1->m_clientObject;
+ btBroadphasePair* pairPtr = pairCachePtr->getOverlappingPairArrayPtr();
- if (((colObj0) && ((colObj0)->mergesSimulationIslands())) &&
- ((colObj1) && ((colObj1)->mergesSimulationIslands())))
+ for (int i = 0; i < numOverlappingPairs; i++)
{
+ const btBroadphasePair& collisionPair = pairPtr[i];
+ btCollisionObject* colObj0 = (btCollisionObject*)collisionPair.m_pProxy0->m_clientObject;
+ btCollisionObject* colObj1 = (btCollisionObject*)collisionPair.m_pProxy1->m_clientObject;
- m_unionFind.unite((colObj0)->getIslandTag(),
- (colObj1)->getIslandTag());
+ if (((colObj0) && ((colObj0)->mergesSimulationIslands())) &&
+ ((colObj1) && ((colObj1)->mergesSimulationIslands())))
+ {
+ m_unionFind.unite((colObj0)->getIslandTag(),
+ (colObj1)->getIslandTag());
+ }
}
}
- }
}
}
#ifdef STATIC_SIMULATION_ISLAND_OPTIMIZATION
-void btSimulationIslandManager::updateActivationState(btCollisionWorld* colWorld,btDispatcher* dispatcher)
+void btSimulationIslandManager::updateActivationState(btCollisionWorld* colWorld, btDispatcher* dispatcher)
{
-
- // put the index into m_controllers into m_tag
+ // put the index into m_controllers into m_tag
int index = 0;
{
-
int i;
- for (i=0;i<colWorld->getCollisionObjectArray().size(); i++)
+ for (i = 0; i < colWorld->getCollisionObjectArray().size(); i++)
{
- btCollisionObject* collisionObject= colWorld->getCollisionObjectArray()[i];
+ btCollisionObject* collisionObject = colWorld->getCollisionObjectArray()[i];
//Adding filtering here
if (!collisionObject->isStaticOrKinematicObject())
{
@@ -92,28 +84,29 @@ void btSimulationIslandManager::updateActivationState(btCollisionWorld* colWor
}
// do the union find
- initUnionFind( index );
+ initUnionFind(index);
- findUnions(dispatcher,colWorld);
+ findUnions(dispatcher, colWorld);
}
-void btSimulationIslandManager::storeIslandActivationState(btCollisionWorld* colWorld)
+void btSimulationIslandManager::storeIslandActivationState(btCollisionWorld* colWorld)
{
- // put the islandId ('find' value) into m_tag
+ // put the islandId ('find' value) into m_tag
{
int index = 0;
int i;
- for (i=0;i<colWorld->getCollisionObjectArray().size();i++)
+ for (i = 0; i < colWorld->getCollisionObjectArray().size(); i++)
{
- btCollisionObject* collisionObject= colWorld->getCollisionObjectArray()[i];
+ btCollisionObject* collisionObject = colWorld->getCollisionObjectArray()[i];
if (!collisionObject->isStaticOrKinematicObject())
{
- collisionObject->setIslandTag( m_unionFind.find(index) );
+ collisionObject->setIslandTag(m_unionFind.find(index));
//Set the correct object offset in Collision Object Array
m_unionFind.getElement(index).m_sz = i;
collisionObject->setCompanionId(-1);
index++;
- } else
+ }
+ else
{
collisionObject->setIslandTag(-1);
collisionObject->setCompanionId(-2);
@@ -122,49 +115,44 @@ void btSimulationIslandManager::storeIslandActivationState(btCollisionWorld* c
}
}
-
-#else //STATIC_SIMULATION_ISLAND_OPTIMIZATION
-void btSimulationIslandManager::updateActivationState(btCollisionWorld* colWorld,btDispatcher* dispatcher)
+#else //STATIC_SIMULATION_ISLAND_OPTIMIZATION
+void btSimulationIslandManager::updateActivationState(btCollisionWorld* colWorld, btDispatcher* dispatcher)
{
+ initUnionFind(int(colWorld->getCollisionObjectArray().size()));
- initUnionFind( int (colWorld->getCollisionObjectArray().size()));
-
- // put the index into m_controllers into m_tag
+ // put the index into m_controllers into m_tag
{
-
int index = 0;
int i;
- for (i=0;i<colWorld->getCollisionObjectArray().size(); i++)
+ for (i = 0; i < colWorld->getCollisionObjectArray().size(); i++)
{
- btCollisionObject* collisionObject= colWorld->getCollisionObjectArray()[i];
+ btCollisionObject* collisionObject = colWorld->getCollisionObjectArray()[i];
collisionObject->setIslandTag(index);
collisionObject->setCompanionId(-1);
collisionObject->setHitFraction(btScalar(1.));
index++;
-
}
}
// do the union find
- findUnions(dispatcher,colWorld);
+ findUnions(dispatcher, colWorld);
}
-void btSimulationIslandManager::storeIslandActivationState(btCollisionWorld* colWorld)
+void btSimulationIslandManager::storeIslandActivationState(btCollisionWorld* colWorld)
{
- // put the islandId ('find' value) into m_tag
+ // put the islandId ('find' value) into m_tag
{
-
-
int index = 0;
int i;
- for (i=0;i<colWorld->getCollisionObjectArray().size();i++)
+ for (i = 0; i < colWorld->getCollisionObjectArray().size(); i++)
{
- btCollisionObject* collisionObject= colWorld->getCollisionObjectArray()[i];
+ btCollisionObject* collisionObject = colWorld->getCollisionObjectArray()[i];
if (!collisionObject->isStaticOrKinematicObject())
{
- collisionObject->setIslandTag( m_unionFind.find(index) );
+ collisionObject->setIslandTag(m_unionFind.find(index));
collisionObject->setCompanionId(-1);
- } else
+ }
+ else
{
collisionObject->setIslandTag(-1);
collisionObject->setCompanionId(-2);
@@ -174,72 +162,59 @@ void btSimulationIslandManager::storeIslandActivationState(btCollisionWorld* col
}
}
-#endif //STATIC_SIMULATION_ISLAND_OPTIMIZATION
+#endif //STATIC_SIMULATION_ISLAND_OPTIMIZATION
-inline int getIslandId(const btPersistentManifold* lhs)
+inline int getIslandId(const btPersistentManifold* lhs)
{
int islandId;
const btCollisionObject* rcolObj0 = static_cast<const btCollisionObject*>(lhs->getBody0());
const btCollisionObject* rcolObj1 = static_cast<const btCollisionObject*>(lhs->getBody1());
- islandId= rcolObj0->getIslandTag()>=0?rcolObj0->getIslandTag():rcolObj1->getIslandTag();
+ islandId = rcolObj0->getIslandTag() >= 0 ? rcolObj0->getIslandTag() : rcolObj1->getIslandTag();
return islandId;
-
}
-
-
/// function object that routes calls to operator<
class btPersistentManifoldSortPredicate
{
- public:
-
- SIMD_FORCE_INLINE bool operator() ( const btPersistentManifold* lhs, const btPersistentManifold* rhs ) const
- {
- return getIslandId(lhs) < getIslandId(rhs);
- }
+public:
+ SIMD_FORCE_INLINE bool operator()(const btPersistentManifold* lhs, const btPersistentManifold* rhs) const
+ {
+ return getIslandId(lhs) < getIslandId(rhs);
+ }
};
class btPersistentManifoldSortPredicateDeterministic
{
public:
-
- SIMD_FORCE_INLINE bool operator() (const btPersistentManifold* lhs, const btPersistentManifold* rhs) const
+ SIMD_FORCE_INLINE bool operator()(const btPersistentManifold* lhs, const btPersistentManifold* rhs) const
{
return (
- (getIslandId(lhs) < getIslandId(rhs))
- || ((getIslandId(lhs) == getIslandId(rhs)) && lhs->getBody0()->getBroadphaseHandle()->m_uniqueId < rhs->getBody0()->getBroadphaseHandle()->m_uniqueId)
- ||((getIslandId(lhs) == getIslandId(rhs)) && (lhs->getBody0()->getBroadphaseHandle()->m_uniqueId == rhs->getBody0()->getBroadphaseHandle()->m_uniqueId) &&
- (lhs->getBody1()->getBroadphaseHandle()->m_uniqueId < rhs->getBody1()->getBroadphaseHandle()->m_uniqueId))
- );
-
+ (getIslandId(lhs) < getIslandId(rhs)) || ((getIslandId(lhs) == getIslandId(rhs)) && lhs->getBody0()->getBroadphaseHandle()->m_uniqueId < rhs->getBody0()->getBroadphaseHandle()->m_uniqueId) || ((getIslandId(lhs) == getIslandId(rhs)) && (lhs->getBody0()->getBroadphaseHandle()->m_uniqueId == rhs->getBody0()->getBroadphaseHandle()->m_uniqueId) && (lhs->getBody1()->getBroadphaseHandle()->m_uniqueId < rhs->getBody1()->getBroadphaseHandle()->m_uniqueId)));
}
};
-
-void btSimulationIslandManager::buildIslands(btDispatcher* dispatcher,btCollisionWorld* collisionWorld)
+void btSimulationIslandManager::buildIslands(btDispatcher* dispatcher, btCollisionWorld* collisionWorld)
{
-
BT_PROFILE("islandUnionFindAndQuickSort");
-
+
btCollisionObjectArray& collisionObjects = collisionWorld->getCollisionObjectArray();
m_islandmanifold.resize(0);
//we are going to sort the unionfind array, and store the element id in the size
//afterwards, we clean unionfind, to make sure no-one uses it anymore
-
+
getUnionFind().sortIslands();
int numElem = getUnionFind().getNumElements();
- int endIslandIndex=1;
+ int endIslandIndex = 1;
int startIslandIndex;
-
//update the sleeping state for bodies, if all are sleeping
- for ( startIslandIndex=0;startIslandIndex<numElem;startIslandIndex = endIslandIndex)
+ for (startIslandIndex = 0; startIslandIndex < numElem; startIslandIndex = endIslandIndex)
{
int islandId = getUnionFind().getElement(startIslandIndex).m_id;
- for (endIslandIndex = startIslandIndex+1;(endIslandIndex<numElem) && (getUnionFind().getElement(endIslandIndex).m_id == islandId);endIslandIndex++)
+ for (endIslandIndex = startIslandIndex + 1; (endIslandIndex < numElem) && (getUnionFind().getElement(endIslandIndex).m_id == islandId); endIslandIndex++)
{
}
@@ -248,69 +223,68 @@ void btSimulationIslandManager::buildIslands(btDispatcher* dispatcher,btCollisio
bool allSleeping = true;
int idx;
- for (idx=startIslandIndex;idx<endIslandIndex;idx++)
+ for (idx = startIslandIndex; idx < endIslandIndex; idx++)
{
int i = getUnionFind().getElement(idx).m_sz;
btCollisionObject* colObj0 = collisionObjects[i];
if ((colObj0->getIslandTag() != islandId) && (colObj0->getIslandTag() != -1))
{
-// printf("error in island management\n");
+ // printf("error in island management\n");
}
btAssert((colObj0->getIslandTag() == islandId) || (colObj0->getIslandTag() == -1));
if (colObj0->getIslandTag() == islandId)
{
- if (colObj0->getActivationState()== ACTIVE_TAG ||
- colObj0->getActivationState()== DISABLE_DEACTIVATION)
+ if (colObj0->getActivationState() == ACTIVE_TAG ||
+ colObj0->getActivationState() == DISABLE_DEACTIVATION)
{
allSleeping = false;
break;
}
}
}
-
if (allSleeping)
{
int idx;
- for (idx=startIslandIndex;idx<endIslandIndex;idx++)
+ for (idx = startIslandIndex; idx < endIslandIndex; idx++)
{
int i = getUnionFind().getElement(idx).m_sz;
btCollisionObject* colObj0 = collisionObjects[i];
if ((colObj0->getIslandTag() != islandId) && (colObj0->getIslandTag() != -1))
{
-// printf("error in island management\n");
+ // printf("error in island management\n");
}
btAssert((colObj0->getIslandTag() == islandId) || (colObj0->getIslandTag() == -1));
if (colObj0->getIslandTag() == islandId)
{
- colObj0->setActivationState( ISLAND_SLEEPING );
+ colObj0->setActivationState(ISLAND_SLEEPING);
}
}
- } else
+ }
+ else
{
-
int idx;
- for (idx=startIslandIndex;idx<endIslandIndex;idx++)
+ for (idx = startIslandIndex; idx < endIslandIndex; idx++)
{
int i = getUnionFind().getElement(idx).m_sz;
btCollisionObject* colObj0 = collisionObjects[i];
if ((colObj0->getIslandTag() != islandId) && (colObj0->getIslandTag() != -1))
{
-// printf("error in island management\n");
+ // printf("error in island management\n");
}
btAssert((colObj0->getIslandTag() == islandId) || (colObj0->getIslandTag() == -1));
if (colObj0->getIslandTag() == islandId)
{
- if ( colObj0->getActivationState() == ISLAND_SLEEPING)
+ if (colObj0->getActivationState() == ISLAND_SLEEPING)
{
- colObj0->setActivationState( WANTS_DEACTIVATION);
+ colObj0->setActivationState(WANTS_DEACTIVATION);
colObj0->setDeactivationTime(0.f);
}
}
@@ -318,34 +292,30 @@ void btSimulationIslandManager::buildIslands(btDispatcher* dispatcher,btCollisio
}
}
-
int i;
int maxNumManifolds = dispatcher->getNumManifolds();
-//#define SPLIT_ISLANDS 1
-//#ifdef SPLIT_ISLANDS
+ //#define SPLIT_ISLANDS 1
+ //#ifdef SPLIT_ISLANDS
-
-//#endif //SPLIT_ISLANDS
+ //#endif //SPLIT_ISLANDS
-
- for (i=0;i<maxNumManifolds ;i++)
+ for (i = 0; i < maxNumManifolds; i++)
{
- btPersistentManifold* manifold = dispatcher->getManifoldByIndexInternal(i);
- if (collisionWorld->getDispatchInfo().m_deterministicOverlappingPairs)
- {
+ btPersistentManifold* manifold = dispatcher->getManifoldByIndexInternal(i);
+ if (collisionWorld->getDispatchInfo().m_deterministicOverlappingPairs)
+ {
if (manifold->getNumContacts() == 0)
continue;
- }
+ }
- const btCollisionObject* colObj0 = static_cast<const btCollisionObject*>(manifold->getBody0());
- const btCollisionObject* colObj1 = static_cast<const btCollisionObject*>(manifold->getBody1());
-
- ///@todo: check sleeping conditions!
- if (((colObj0) && colObj0->getActivationState() != ISLAND_SLEEPING) ||
+ const btCollisionObject* colObj0 = static_cast<const btCollisionObject*>(manifold->getBody0());
+ const btCollisionObject* colObj1 = static_cast<const btCollisionObject*>(manifold->getBody1());
+
+ ///@todo: check sleeping conditions!
+ if (((colObj0) && colObj0->getActivationState() != ISLAND_SLEEPING) ||
((colObj1) && colObj1->getActivationState() != ISLAND_SLEEPING))
{
-
//kinematic objects don't merge islands, but wake up all connected objects
if (colObj0->isKinematicObject() && colObj0->getActivationState() != ISLAND_SLEEPING)
{
@@ -357,36 +327,34 @@ void btSimulationIslandManager::buildIslands(btDispatcher* dispatcher,btCollisio
if (colObj1->hasContactResponse())
colObj0->activate();
}
- if(m_splitIslands)
- {
+ if (m_splitIslands)
+ {
//filtering for response
- if (dispatcher->needsResponse(colObj0,colObj1))
+ if (dispatcher->needsResponse(colObj0, colObj1))
m_islandmanifold.push_back(manifold);
}
}
}
}
-
-
///@todo: this is random access, it can be walked 'cache friendly'!
-void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher,btCollisionWorld* collisionWorld, IslandCallback* callback)
+void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher, btCollisionWorld* collisionWorld, IslandCallback* callback)
{
btCollisionObjectArray& collisionObjects = collisionWorld->getCollisionObjectArray();
- buildIslands(dispatcher,collisionWorld);
+ buildIslands(dispatcher, collisionWorld);
- int endIslandIndex=1;
+ int endIslandIndex = 1;
int startIslandIndex;
int numElem = getUnionFind().getNumElements();
BT_PROFILE("processIslands");
- if(!m_splitIslands)
+ if (!m_splitIslands)
{
btPersistentManifold** manifold = dispatcher->getInternalManifoldPointer();
int maxNumManifolds = dispatcher->getNumManifolds();
- callback->processIsland(&collisionObjects[0],collisionObjects.size(),manifold,maxNumManifolds, -1);
+ callback->processIsland(&collisionObjects[0], collisionObjects.size(), manifold, maxNumManifolds, -1);
}
else
{
@@ -394,7 +362,7 @@ void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher,
// Sort the vector using predicate and std::sort
//std::sort(islandmanifold.begin(), islandmanifold.end(), btPersistentManifoldSortPredicate);
- int numManifolds = int (m_islandmanifold.size());
+ int numManifolds = int(m_islandmanifold.size());
//tried a radix sort, but quicksort/heapsort seems still faster
//@todo rewrite island management
@@ -403,7 +371,8 @@ void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher,
if (collisionWorld->getDispatchInfo().m_deterministicOverlappingPairs)
{
m_islandmanifold.quickSort(btPersistentManifoldSortPredicateDeterministic());
- } else
+ }
+ else
{
m_islandmanifold.quickSort(btPersistentManifoldSortPredicate());
}
@@ -417,55 +386,49 @@ void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher,
//int islandId;
-
-
- // printf("Start Islands\n");
+ // printf("Start Islands\n");
//traverse the simulation islands, and call the solver, unless all objects are sleeping/deactivated
- for ( startIslandIndex=0;startIslandIndex<numElem;startIslandIndex = endIslandIndex)
+ for (startIslandIndex = 0; startIslandIndex < numElem; startIslandIndex = endIslandIndex)
{
int islandId = getUnionFind().getElement(startIslandIndex).m_id;
+ bool islandSleeping = true;
- bool islandSleeping = true;
-
- for (endIslandIndex = startIslandIndex;(endIslandIndex<numElem) && (getUnionFind().getElement(endIslandIndex).m_id == islandId);endIslandIndex++)
- {
- int i = getUnionFind().getElement(endIslandIndex).m_sz;
- btCollisionObject* colObj0 = collisionObjects[i];
- m_islandBodies.push_back(colObj0);
- if (colObj0->isActive())
- islandSleeping = false;
- }
-
+ for (endIslandIndex = startIslandIndex; (endIslandIndex < numElem) && (getUnionFind().getElement(endIslandIndex).m_id == islandId); endIslandIndex++)
+ {
+ int i = getUnionFind().getElement(endIslandIndex).m_sz;
+ btCollisionObject* colObj0 = collisionObjects[i];
+ m_islandBodies.push_back(colObj0);
+ if (colObj0->isActive())
+ islandSleeping = false;
+ }
//find the accompanying contact manifold for this islandId
int numIslandManifolds = 0;
btPersistentManifold** startManifold = 0;
- if (startManifoldIndex<numManifolds)
+ if (startManifoldIndex < numManifolds)
{
int curIslandId = getIslandId(m_islandmanifold[startManifoldIndex]);
if (curIslandId == islandId)
{
startManifold = &m_islandmanifold[startManifoldIndex];
-
- for (endManifoldIndex = startManifoldIndex+1;(endManifoldIndex<numManifolds) && (islandId == getIslandId(m_islandmanifold[endManifoldIndex]));endManifoldIndex++)
- {
+ for (endManifoldIndex = startManifoldIndex + 1; (endManifoldIndex < numManifolds) && (islandId == getIslandId(m_islandmanifold[endManifoldIndex])); endManifoldIndex++)
+ {
}
/// Process the actual simulation, only if not sleeping/deactivated
- numIslandManifolds = endManifoldIndex-startManifoldIndex;
+ numIslandManifolds = endManifoldIndex - startManifoldIndex;
}
-
}
if (!islandSleeping)
{
- callback->processIsland(&m_islandBodies[0],m_islandBodies.size(),startManifold,numIslandManifolds, islandId);
- // printf("Island callback of size:%d bodies, %d manifolds\n",islandBodies.size(),numIslandManifolds);
+ callback->processIsland(&m_islandBodies[0], m_islandBodies.size(), startManifold, numIslandManifolds, islandId);
+ // printf("Island callback of size:%d bodies, %d manifolds\n",islandBodies.size(),numIslandManifolds);
}
-
+
if (numIslandManifolds)
{
startManifoldIndex = endManifoldIndex;
@@ -473,6 +436,5 @@ void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher,
m_islandBodies.resize(0);
}
- } // else if(!splitIslands)
-
+ } // else if(!splitIslands)
}
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btSimulationIslandManager.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btSimulationIslandManager.h
index e24c6afeca..6c2802141c 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btSimulationIslandManager.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btSimulationIslandManager.h
@@ -26,45 +26,39 @@ class btCollisionWorld;
class btDispatcher;
class btPersistentManifold;
-
///SimulationIslandManager creates and handles simulation islands, using btUnionFind
class btSimulationIslandManager
{
btUnionFind m_unionFind;
- btAlignedObjectArray<btPersistentManifold*> m_islandmanifold;
- btAlignedObjectArray<btCollisionObject* > m_islandBodies;
-
+ btAlignedObjectArray<btPersistentManifold*> m_islandmanifold;
+ btAlignedObjectArray<btCollisionObject*> m_islandBodies;
+
bool m_splitIslands;
-
+
public:
btSimulationIslandManager();
virtual ~btSimulationIslandManager();
+ void initUnionFind(int n);
- void initUnionFind(int n);
-
-
- btUnionFind& getUnionFind() { return m_unionFind;}
-
- virtual void updateActivationState(btCollisionWorld* colWorld,btDispatcher* dispatcher);
- virtual void storeIslandActivationState(btCollisionWorld* world);
+ btUnionFind& getUnionFind() { return m_unionFind; }
+ virtual void updateActivationState(btCollisionWorld* colWorld, btDispatcher* dispatcher);
+ virtual void storeIslandActivationState(btCollisionWorld* world);
- void findUnions(btDispatcher* dispatcher,btCollisionWorld* colWorld);
+ void findUnions(btDispatcher* dispatcher, btCollisionWorld* colWorld);
-
-
- struct IslandCallback
+ struct IslandCallback
{
- virtual ~IslandCallback() {};
+ virtual ~IslandCallback(){};
- virtual void processIsland(btCollisionObject** bodies,int numBodies,class btPersistentManifold** manifolds,int numManifolds, int islandId) = 0;
+ virtual void processIsland(btCollisionObject** bodies, int numBodies, class btPersistentManifold** manifolds, int numManifolds, int islandId) = 0;
};
- void buildAndProcessIslands(btDispatcher* dispatcher,btCollisionWorld* collisionWorld, IslandCallback* callback);
+ void buildAndProcessIslands(btDispatcher* dispatcher, btCollisionWorld* collisionWorld, IslandCallback* callback);
- void buildIslands(btDispatcher* dispatcher,btCollisionWorld* colWorld);
+ void buildIslands(btDispatcher* dispatcher, btCollisionWorld* colWorld);
bool getSplitIslands()
{
@@ -74,8 +68,6 @@ public:
{
m_splitIslands = doSplitIslands;
}
-
};
-#endif //BT_SIMULATION_ISLAND_MANAGER_H
-
+#endif //BT_SIMULATION_ISLAND_MANAGER_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.cpp
index e8b567e0ef..bc68b285b8 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.cpp
@@ -21,23 +21,22 @@ subject to the following restrictions:
#include "BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h"
//#include <stdio.h>
-btSphereBoxCollisionAlgorithm::btSphereBoxCollisionAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* col0Wrap,const btCollisionObjectWrapper* col1Wrap, bool isSwapped)
-: btActivatingCollisionAlgorithm(ci,col0Wrap,col1Wrap),
-m_ownManifold(false),
-m_manifoldPtr(mf),
-m_isSwapped(isSwapped)
+btSphereBoxCollisionAlgorithm::btSphereBoxCollisionAlgorithm(btPersistentManifold* mf, const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* col0Wrap, const btCollisionObjectWrapper* col1Wrap, bool isSwapped)
+ : btActivatingCollisionAlgorithm(ci, col0Wrap, col1Wrap),
+ m_ownManifold(false),
+ m_manifoldPtr(mf),
+ m_isSwapped(isSwapped)
{
- const btCollisionObjectWrapper* sphereObjWrap = m_isSwapped? col1Wrap : col0Wrap;
- const btCollisionObjectWrapper* boxObjWrap = m_isSwapped? col0Wrap : col1Wrap;
-
- if (!m_manifoldPtr && m_dispatcher->needsCollision(sphereObjWrap->getCollisionObject(),boxObjWrap->getCollisionObject()))
+ const btCollisionObjectWrapper* sphereObjWrap = m_isSwapped ? col1Wrap : col0Wrap;
+ const btCollisionObjectWrapper* boxObjWrap = m_isSwapped ? col0Wrap : col1Wrap;
+
+ if (!m_manifoldPtr && m_dispatcher->needsCollision(sphereObjWrap->getCollisionObject(), boxObjWrap->getCollisionObject()))
{
- m_manifoldPtr = m_dispatcher->getNewManifold(sphereObjWrap->getCollisionObject(),boxObjWrap->getCollisionObject());
+ m_manifoldPtr = m_dispatcher->getNewManifold(sphereObjWrap->getCollisionObject(), boxObjWrap->getCollisionObject());
m_ownManifold = true;
}
}
-
btSphereBoxCollisionAlgorithm::~btSphereBoxCollisionAlgorithm()
{
if (m_ownManifold)
@@ -47,17 +46,15 @@ btSphereBoxCollisionAlgorithm::~btSphereBoxCollisionAlgorithm()
}
}
-
-
-void btSphereBoxCollisionAlgorithm::processCollision (const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
+void btSphereBoxCollisionAlgorithm::processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
(void)dispatchInfo;
(void)resultOut;
if (!m_manifoldPtr)
return;
- const btCollisionObjectWrapper* sphereObjWrap = m_isSwapped? body1Wrap : body0Wrap;
- const btCollisionObjectWrapper* boxObjWrap = m_isSwapped? body0Wrap : body1Wrap;
+ const btCollisionObjectWrapper* sphereObjWrap = m_isSwapped ? body1Wrap : body0Wrap;
+ const btCollisionObjectWrapper* boxObjWrap = m_isSwapped ? body0Wrap : body1Wrap;
btVector3 pOnBox;
@@ -83,10 +80,9 @@ void btSphereBoxCollisionAlgorithm::processCollision (const btCollisionObjectWra
resultOut->refreshContactPoints();
}
}
-
}
-btScalar btSphereBoxCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* col0,btCollisionObject* col1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+btScalar btSphereBoxCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* col0, btCollisionObject* col1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
(void)resultOut;
(void)dispatchInfo;
@@ -97,27 +93,26 @@ btScalar btSphereBoxCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject*
return btScalar(1.);
}
-
-bool btSphereBoxCollisionAlgorithm::getSphereDistance(const btCollisionObjectWrapper* boxObjWrap, btVector3& pointOnBox, btVector3& normal, btScalar& penetrationDepth, const btVector3& sphereCenter, btScalar fRadius, btScalar maxContactDistance )
+bool btSphereBoxCollisionAlgorithm::getSphereDistance(const btCollisionObjectWrapper* boxObjWrap, btVector3& pointOnBox, btVector3& normal, btScalar& penetrationDepth, const btVector3& sphereCenter, btScalar fRadius, btScalar maxContactDistance)
{
- const btBoxShape* boxShape= (const btBoxShape*)boxObjWrap->getCollisionShape();
- btVector3 const &boxHalfExtent = boxShape->getHalfExtentsWithoutMargin();
+ const btBoxShape* boxShape = (const btBoxShape*)boxObjWrap->getCollisionShape();
+ btVector3 const& boxHalfExtent = boxShape->getHalfExtentsWithoutMargin();
btScalar boxMargin = boxShape->getMargin();
penetrationDepth = 1.0f;
// convert the sphere position to the box's local space
- btTransform const &m44T = boxObjWrap->getWorldTransform();
+ btTransform const& m44T = boxObjWrap->getWorldTransform();
btVector3 sphereRelPos = m44T.invXform(sphereCenter);
// Determine the closest point to the sphere center in the box
btVector3 closestPoint = sphereRelPos;
- closestPoint.setX( btMin(boxHalfExtent.getX(), closestPoint.getX()) );
- closestPoint.setX( btMax(-boxHalfExtent.getX(), closestPoint.getX()) );
- closestPoint.setY( btMin(boxHalfExtent.getY(), closestPoint.getY()) );
- closestPoint.setY( btMax(-boxHalfExtent.getY(), closestPoint.getY()) );
- closestPoint.setZ( btMin(boxHalfExtent.getZ(), closestPoint.getZ()) );
- closestPoint.setZ( btMax(-boxHalfExtent.getZ(), closestPoint.getZ()) );
-
+ closestPoint.setX(btMin(boxHalfExtent.getX(), closestPoint.getX()));
+ closestPoint.setX(btMax(-boxHalfExtent.getX(), closestPoint.getX()));
+ closestPoint.setY(btMin(boxHalfExtent.getY(), closestPoint.getY()));
+ closestPoint.setY(btMax(-boxHalfExtent.getY(), closestPoint.getY()));
+ closestPoint.setZ(btMin(boxHalfExtent.getZ(), closestPoint.getZ()));
+ closestPoint.setZ(btMax(-boxHalfExtent.getZ(), closestPoint.getZ()));
+
btScalar intersectionDist = fRadius + boxMargin;
btScalar contactDist = intersectionDist + maxContactDistance;
normal = sphereRelPos - closestPoint;
@@ -136,42 +131,42 @@ bool btSphereBoxCollisionAlgorithm::getSphereDistance(const btCollisionObjectWra
{
distance = -getSpherePenetration(boxHalfExtent, sphereRelPos, closestPoint, normal);
}
- else //compute the penetration details
+ else //compute the penetration details
{
distance = normal.length();
normal /= distance;
}
pointOnBox = closestPoint + normal * boxMargin;
-// v3PointOnSphere = sphereRelPos - (normal * fRadius);
+ // v3PointOnSphere = sphereRelPos - (normal * fRadius);
penetrationDepth = distance - intersectionDist;
// transform back in world space
btVector3 tmp = m44T(pointOnBox);
pointOnBox = tmp;
-// tmp = m44T(v3PointOnSphere);
-// v3PointOnSphere = tmp;
+ // tmp = m44T(v3PointOnSphere);
+ // v3PointOnSphere = tmp;
tmp = m44T.getBasis() * normal;
normal = tmp;
return true;
}
-btScalar btSphereBoxCollisionAlgorithm::getSpherePenetration( btVector3 const &boxHalfExtent, btVector3 const &sphereRelPos, btVector3 &closestPoint, btVector3& normal )
+btScalar btSphereBoxCollisionAlgorithm::getSpherePenetration(btVector3 const& boxHalfExtent, btVector3 const& sphereRelPos, btVector3& closestPoint, btVector3& normal)
{
//project the center of the sphere on the closest face of the box
btScalar faceDist = boxHalfExtent.getX() - sphereRelPos.getX();
btScalar minDist = faceDist;
- closestPoint.setX( boxHalfExtent.getX() );
- normal.setValue(btScalar(1.0f), btScalar(0.0f), btScalar(0.0f));
+ closestPoint.setX(boxHalfExtent.getX());
+ normal.setValue(btScalar(1.0f), btScalar(0.0f), btScalar(0.0f));
faceDist = boxHalfExtent.getX() + sphereRelPos.getX();
if (faceDist < minDist)
{
minDist = faceDist;
closestPoint = sphereRelPos;
- closestPoint.setX( -boxHalfExtent.getX() );
- normal.setValue(btScalar(-1.0f), btScalar(0.0f), btScalar(0.0f));
+ closestPoint.setX(-boxHalfExtent.getX());
+ normal.setValue(btScalar(-1.0f), btScalar(0.0f), btScalar(0.0f));
}
faceDist = boxHalfExtent.getY() - sphereRelPos.getY();
@@ -179,8 +174,8 @@ btScalar btSphereBoxCollisionAlgorithm::getSpherePenetration( btVector3 const &b
{
minDist = faceDist;
closestPoint = sphereRelPos;
- closestPoint.setY( boxHalfExtent.getY() );
- normal.setValue(btScalar(0.0f), btScalar(1.0f), btScalar(0.0f));
+ closestPoint.setY(boxHalfExtent.getY());
+ normal.setValue(btScalar(0.0f), btScalar(1.0f), btScalar(0.0f));
}
faceDist = boxHalfExtent.getY() + sphereRelPos.getY();
@@ -188,8 +183,8 @@ btScalar btSphereBoxCollisionAlgorithm::getSpherePenetration( btVector3 const &b
{
minDist = faceDist;
closestPoint = sphereRelPos;
- closestPoint.setY( -boxHalfExtent.getY() );
- normal.setValue(btScalar(0.0f), btScalar(-1.0f), btScalar(0.0f));
+ closestPoint.setY(-boxHalfExtent.getY());
+ normal.setValue(btScalar(0.0f), btScalar(-1.0f), btScalar(0.0f));
}
faceDist = boxHalfExtent.getZ() - sphereRelPos.getZ();
@@ -197,8 +192,8 @@ btScalar btSphereBoxCollisionAlgorithm::getSpherePenetration( btVector3 const &b
{
minDist = faceDist;
closestPoint = sphereRelPos;
- closestPoint.setZ( boxHalfExtent.getZ() );
- normal.setValue(btScalar(0.0f), btScalar(0.0f), btScalar(1.0f));
+ closestPoint.setZ(boxHalfExtent.getZ());
+ normal.setValue(btScalar(0.0f), btScalar(0.0f), btScalar(1.0f));
}
faceDist = boxHalfExtent.getZ() + sphereRelPos.getZ();
@@ -206,8 +201,8 @@ btScalar btSphereBoxCollisionAlgorithm::getSpherePenetration( btVector3 const &b
{
minDist = faceDist;
closestPoint = sphereRelPos;
- closestPoint.setZ( -boxHalfExtent.getZ() );
- normal.setValue(btScalar(0.0f), btScalar(0.0f), btScalar(-1.0f));
+ closestPoint.setZ(-boxHalfExtent.getZ());
+ normal.setValue(btScalar(0.0f), btScalar(0.0f), btScalar(-1.0f));
}
return minDist;
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.h
index eefaedc9e7..3348bc89af 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.h
@@ -28,21 +28,20 @@ class btPersistentManifold;
/// Other features are frame-coherency (persistent data) and collision response.
class btSphereBoxCollisionAlgorithm : public btActivatingCollisionAlgorithm
{
- bool m_ownManifold;
- btPersistentManifold* m_manifoldPtr;
- bool m_isSwapped;
-
-public:
+ bool m_ownManifold;
+ btPersistentManifold* m_manifoldPtr;
+ bool m_isSwapped;
- btSphereBoxCollisionAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap, bool 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 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 btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut);
- virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
+ virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
{
if (m_manifoldPtr && m_ownManifold)
{
@@ -50,26 +49,25 @@ public:
}
}
- bool getSphereDistance( const btCollisionObjectWrapper* boxObjWrap, btVector3& v3PointOnBox, btVector3& normal, btScalar& penetrationDepth, const btVector3& v3SphereCenter, btScalar fRadius, btScalar maxContactDistance );
+ 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);
- btScalar getSpherePenetration( btVector3 const &boxHalfExtent, btVector3 const &sphereRelPos, btVector3 &closestPoint, btVector3& normal );
-
- struct CreateFunc :public btCollisionAlgorithmCreateFunc
+ struct CreateFunc : public btCollisionAlgorithmCreateFunc
{
- virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap)
+ 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, false);
+ }
+ else
{
- return new(mem) btSphereBoxCollisionAlgorithm(0,ci,body0Wrap,body1Wrap,true);
+ return new (mem) btSphereBoxCollisionAlgorithm(0, ci, body0Wrap, body1Wrap, true);
}
}
};
-
};
-#endif //BT_SPHERE_BOX_COLLISION_ALGORITHM_H
-
+#endif //BT_SPHERE_BOX_COLLISION_ALGORITHM_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.cpp
index 27eaec3059..7fa0559f97 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.cpp
@@ -20,14 +20,14 @@ subject to the following restrictions:
#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
#include "BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h"
-btSphereSphereCollisionAlgorithm::btSphereSphereCollisionAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* col0Wrap,const btCollisionObjectWrapper* col1Wrap)
-: btActivatingCollisionAlgorithm(ci,col0Wrap,col1Wrap),
-m_ownManifold(false),
-m_manifoldPtr(mf)
+btSphereSphereCollisionAlgorithm::btSphereSphereCollisionAlgorithm(btPersistentManifold* mf, const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* col0Wrap, const btCollisionObjectWrapper* col1Wrap)
+ : btActivatingCollisionAlgorithm(ci, col0Wrap, col1Wrap),
+ m_ownManifold(false),
+ m_manifoldPtr(mf)
{
if (!m_manifoldPtr)
{
- m_manifoldPtr = m_dispatcher->getNewManifold(col0Wrap->getCollisionObject(),col1Wrap->getCollisionObject());
+ m_manifoldPtr = m_dispatcher->getNewManifold(col0Wrap->getCollisionObject(), col1Wrap->getCollisionObject());
m_ownManifold = true;
}
}
@@ -41,7 +41,7 @@ btSphereSphereCollisionAlgorithm::~btSphereSphereCollisionAlgorithm()
}
}
-void btSphereSphereCollisionAlgorithm::processCollision (const btCollisionObjectWrapper* col0Wrap,const btCollisionObjectWrapper* col1Wrap,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+void btSphereSphereCollisionAlgorithm::processCollision(const btCollisionObjectWrapper* col0Wrap, const btCollisionObjectWrapper* col1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
(void)dispatchInfo;
@@ -53,27 +53,27 @@ void btSphereSphereCollisionAlgorithm::processCollision (const btCollisionObject
btSphereShape* sphere0 = (btSphereShape*)col0Wrap->getCollisionShape();
btSphereShape* sphere1 = (btSphereShape*)col1Wrap->getCollisionShape();
- btVector3 diff = col0Wrap->getWorldTransform().getOrigin()- col1Wrap->getWorldTransform().getOrigin();
+ btVector3 diff = col0Wrap->getWorldTransform().getOrigin() - col1Wrap->getWorldTransform().getOrigin();
btScalar len = diff.length();
btScalar radius0 = sphere0->getRadius();
btScalar radius1 = sphere1->getRadius();
#ifdef CLEAR_MANIFOLD
- m_manifoldPtr->clearManifold(); //don't do this, it disables warmstarting
+ m_manifoldPtr->clearManifold(); //don't do this, it disables warmstarting
#endif
///iff distance positive, don't generate a new contact
- if ( len > (radius0+radius1+resultOut->m_closestPointDistanceThreshold))
+ if (len > (radius0 + radius1 + resultOut->m_closestPointDistanceThreshold))
{
#ifndef CLEAR_MANIFOLD
resultOut->refreshContactPoints();
-#endif //CLEAR_MANIFOLD
+#endif //CLEAR_MANIFOLD
return;
}
///distance (negative means penetration)
- btScalar dist = len - (radius0+radius1);
+ btScalar dist = len - (radius0 + radius1);
- btVector3 normalOnSurfaceB(1,0,0);
+ btVector3 normalOnSurfaceB(1, 0, 0);
if (len > SIMD_EPSILON)
{
normalOnSurfaceB = diff / len;
@@ -82,20 +82,18 @@ void btSphereSphereCollisionAlgorithm::processCollision (const btCollisionObject
///point on A (worldspace)
///btVector3 pos0 = col0->getWorldTransform().getOrigin() - radius0 * normalOnSurfaceB;
///point on B (worldspace)
- btVector3 pos1 = col1Wrap->getWorldTransform().getOrigin() + radius1* normalOnSurfaceB;
+ btVector3 pos1 = col1Wrap->getWorldTransform().getOrigin() + radius1 * normalOnSurfaceB;
/// report a contact. internally this will be kept persistent, and contact reduction is done
-
-
- resultOut->addContactPoint(normalOnSurfaceB,pos1,dist);
+
+ resultOut->addContactPoint(normalOnSurfaceB, pos1, dist);
#ifndef CLEAR_MANIFOLD
resultOut->refreshContactPoints();
-#endif //CLEAR_MANIFOLD
-
+#endif //CLEAR_MANIFOLD
}
-btScalar btSphereSphereCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* col0,btCollisionObject* col1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+btScalar btSphereSphereCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* col0, btCollisionObject* col1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
(void)col0;
(void)col1;
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h
index 3517a568a9..b08d0df76d 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h
@@ -28,39 +28,37 @@ class btPersistentManifold;
/// Also provides the most basic sample for custom/user btCollisionAlgorithm
class btSphereSphereCollisionAlgorithm : public btActivatingCollisionAlgorithm
{
- bool m_ownManifold;
- btPersistentManifold* m_manifoldPtr;
-
+ bool m_ownManifold;
+ btPersistentManifold* m_manifoldPtr;
+
public:
- btSphereSphereCollisionAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* col0Wrap,const btCollisionObjectWrapper* col1Wrap);
+ 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 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 btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut);
- virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
+ virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
{
if (m_manifoldPtr && m_ownManifold)
{
manifoldArray.push_back(m_manifoldPtr);
}
}
-
+
virtual ~btSphereSphereCollisionAlgorithm();
- struct CreateFunc :public btCollisionAlgorithmCreateFunc
+ struct CreateFunc : public btCollisionAlgorithmCreateFunc
{
- virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* col0Wrap,const btCollisionObjectWrapper* col1Wrap)
+ 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);
+ return new (mem) btSphereSphereCollisionAlgorithm(0, ci, col0Wrap, col1Wrap);
}
};
-
};
-#endif //BT_SPHERE_SPHERE_COLLISION_ALGORITHM_H
-
+#endif //BT_SPHERE_SPHERE_COLLISION_ALGORITHM_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.cpp
index 86d4e74400..1bc3056c01 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.cpp
@@ -13,7 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btSphereTriangleCollisionAlgorithm.h"
#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h"
#include "BulletCollision/CollisionShapes/btSphereShape.h"
@@ -21,15 +20,15 @@ subject to the following restrictions:
#include "SphereTriangleDetector.h"
#include "BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h"
-btSphereTriangleCollisionAlgorithm::btSphereTriangleCollisionAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,bool swapped)
-: btActivatingCollisionAlgorithm(ci,body0Wrap,body1Wrap),
-m_ownManifold(false),
-m_manifoldPtr(mf),
-m_swapped(swapped)
+btSphereTriangleCollisionAlgorithm::btSphereTriangleCollisionAlgorithm(btPersistentManifold* mf, const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, bool swapped)
+ : btActivatingCollisionAlgorithm(ci, body0Wrap, body1Wrap),
+ m_ownManifold(false),
+ m_manifoldPtr(mf),
+ m_swapped(swapped)
{
if (!m_manifoldPtr)
{
- m_manifoldPtr = m_dispatcher->getNewManifold(body0Wrap->getCollisionObject(),body1Wrap->getCollisionObject());
+ m_manifoldPtr = m_dispatcher->getNewManifold(body0Wrap->getCollisionObject(), body1Wrap->getCollisionObject());
m_ownManifold = true;
}
}
@@ -43,36 +42,35 @@ btSphereTriangleCollisionAlgorithm::~btSphereTriangleCollisionAlgorithm()
}
}
-void btSphereTriangleCollisionAlgorithm::processCollision (const btCollisionObjectWrapper* col0Wrap,const btCollisionObjectWrapper* col1Wrap,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+void btSphereTriangleCollisionAlgorithm::processCollision(const btCollisionObjectWrapper* col0Wrap, const btCollisionObjectWrapper* col1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
if (!m_manifoldPtr)
return;
- const btCollisionObjectWrapper* sphereObjWrap = m_swapped? col1Wrap : col0Wrap;
- const btCollisionObjectWrapper* triObjWrap = m_swapped? col0Wrap : col1Wrap;
+ const btCollisionObjectWrapper* sphereObjWrap = m_swapped ? col1Wrap : col0Wrap;
+ const btCollisionObjectWrapper* triObjWrap = m_swapped ? col0Wrap : col1Wrap;
btSphereShape* sphere = (btSphereShape*)sphereObjWrap->getCollisionShape();
btTriangleShape* triangle = (btTriangleShape*)triObjWrap->getCollisionShape();
-
+
/// report a contact. internally this will be kept persistent, and contact reduction is done
resultOut->setPersistentManifold(m_manifoldPtr);
- SphereTriangleDetector detector(sphere,triangle, m_manifoldPtr->getContactBreakingThreshold()+ resultOut->m_closestPointDistanceThreshold);
-
+ SphereTriangleDetector detector(sphere, triangle, m_manifoldPtr->getContactBreakingThreshold() + resultOut->m_closestPointDistanceThreshold);
+
btDiscreteCollisionDetectorInterface::ClosestPointInput input;
- input.m_maximumDistanceSquared = btScalar(BT_LARGE_FLOAT);///@todo: tighter bounds
+ input.m_maximumDistanceSquared = btScalar(BT_LARGE_FLOAT); ///@todo: tighter bounds
input.m_transformA = sphereObjWrap->getWorldTransform();
input.m_transformB = triObjWrap->getWorldTransform();
bool swapResults = m_swapped;
- detector.getClosestPoints(input,*resultOut,dispatchInfo.m_debugDraw,swapResults);
+ detector.getClosestPoints(input, *resultOut, dispatchInfo.m_debugDraw, swapResults);
if (m_ownManifold)
resultOut->refreshContactPoints();
-
}
-btScalar btSphereTriangleCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* col0,btCollisionObject* col1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+btScalar btSphereTriangleCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* col0, btCollisionObject* col1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
(void)resultOut;
(void)dispatchInfo;
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h
index 6b6e39a72b..d660222f16 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h
@@ -27,43 +27,39 @@ class btPersistentManifold;
/// Also provides the most basic sample for custom/user btCollisionAlgorithm
class btSphereTriangleCollisionAlgorithm : public btActivatingCollisionAlgorithm
{
- bool m_ownManifold;
- btPersistentManifold* m_manifoldPtr;
- bool m_swapped;
-
+ 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(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 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 btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut);
- virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
+ virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
{
if (m_manifoldPtr && m_ownManifold)
{
manifoldArray.push_back(m_manifoldPtr);
}
}
-
+
virtual ~btSphereTriangleCollisionAlgorithm();
- struct CreateFunc :public btCollisionAlgorithmCreateFunc
+ struct CreateFunc : public btCollisionAlgorithmCreateFunc
{
-
- virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap)
+ 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);
+ return new (mem) btSphereTriangleCollisionAlgorithm(ci.m_manifold, ci, body0Wrap, body1Wrap, m_swapped);
}
};
-
};
-#endif //BT_SPHERE_TRIANGLE_COLLISION_ALGORITHM_H
-
+#endif //BT_SPHERE_TRIANGLE_COLLISION_ALGORITHM_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btUnionFind.cpp b/thirdparty/bullet/BulletCollision/CollisionDispatch/btUnionFind.cpp
index 5222933595..816bf1e6ad 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btUnionFind.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btUnionFind.cpp
@@ -15,68 +15,60 @@ subject to the following restrictions:
#include "btUnionFind.h"
-
-
btUnionFind::~btUnionFind()
{
Free();
-
}
btUnionFind::btUnionFind()
-{
-
+{
}
-void btUnionFind::allocate(int N)
+void btUnionFind::allocate(int N)
{
m_elements.resize(N);
}
-void btUnionFind::Free()
+void btUnionFind::Free()
{
m_elements.clear();
}
-
-void btUnionFind::reset(int N)
+void btUnionFind::reset(int N)
{
allocate(N);
- for (int i = 0; i < N; i++)
- {
- m_elements[i].m_id = i; m_elements[i].m_sz = 1;
- }
+ for (int i = 0; i < N; i++)
+ {
+ m_elements[i].m_id = i;
+ m_elements[i].m_sz = 1;
+ }
}
-
class btUnionFindElementSortPredicate
{
- public:
-
- bool operator() ( const btElement& lhs, const btElement& rhs ) const
- {
- return lhs.m_id < rhs.m_id;
- }
+public:
+ bool operator()(const btElement& lhs, const btElement& rhs) const
+ {
+ return lhs.m_id < rhs.m_id;
+ }
};
///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 btUnionFind::sortIslands()
+void btUnionFind::sortIslands()
{
-
//first store the original body index, and islandId
int numElements = m_elements.size();
-
- for (int i=0;i<numElements;i++)
+
+ for (int i = 0; i < numElements; i++)
{
m_elements[i].m_id = find(i);
#ifndef STATIC_SIMULATION_ISLAND_OPTIMIZATION
m_elements[i].m_sz = i;
-#endif //STATIC_SIMULATION_ISLAND_OPTIMIZATION
+#endif //STATIC_SIMULATION_ISLAND_OPTIMIZATION
}
-
- // Sort the vector using predicate and std::sort
- //std::sort(m_elements.begin(), m_elements.end(), btUnionFindElementSortPredicate);
- m_elements.quickSort(btUnionFindElementSortPredicate());
+ // Sort the vector using predicate and std::sort
+ //std::sort(m_elements.begin(), m_elements.end(), btUnionFindElementSortPredicate);
+ m_elements.quickSort(btUnionFindElementSortPredicate());
}
diff --git a/thirdparty/bullet/BulletCollision/CollisionDispatch/btUnionFind.h b/thirdparty/bullet/BulletCollision/CollisionDispatch/btUnionFind.h
index ef2a29202f..d422ef55eb 100644
--- a/thirdparty/bullet/BulletCollision/CollisionDispatch/btUnionFind.h
+++ b/thirdparty/bullet/BulletCollision/CollisionDispatch/btUnionFind.h
@@ -23,107 +23,101 @@ subject to the following restrictions:
///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
+struct btElement
{
- int m_id;
- int m_sz;
+ 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<btElement> 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;
+{
+private:
+ btAlignedObjectArray<btElement> 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
+ //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);
- int find(int x)
- {
+ 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);
-
- 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;
}
+ return x;
+ }
+};
-
- };
-
-
-#endif //BT_UNION_FIND_H
+#endif //BT_UNION_FIND_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btBox2dShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btBox2dShape.cpp
index ecce028c2e..a3d8075daf 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btBox2dShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btBox2dShape.cpp
@@ -15,28 +15,23 @@ subject to the following restrictions:
#include "btBox2dShape.h"
+//{
-//{
-
-
-void btBox2dShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
+void btBox2dShape::getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
{
- btTransformAabb(getHalfExtentsWithoutMargin(),getMargin(),t,aabbMin,aabbMax);
+ btTransformAabb(getHalfExtentsWithoutMargin(), getMargin(), t, aabbMin, aabbMax);
}
-
-void btBox2dShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const
+void btBox2dShape::calculateLocalInertia(btScalar mass, btVector3& inertia) const
{
//btScalar margin = btScalar(0.);
btVector3 halfExtents = getHalfExtentsWithMargin();
- btScalar lx=btScalar(2.)*(halfExtents.x());
- btScalar ly=btScalar(2.)*(halfExtents.y());
- btScalar lz=btScalar(2.)*(halfExtents.z());
-
- inertia.setValue(mass/(btScalar(12.0)) * (ly*ly + lz*lz),
- mass/(btScalar(12.0)) * (lx*lx + lz*lz),
- mass/(btScalar(12.0)) * (lx*lx + ly*ly));
+ btScalar lx = btScalar(2.) * (halfExtents.x());
+ btScalar ly = btScalar(2.) * (halfExtents.y());
+ btScalar lz = btScalar(2.) * (halfExtents.z());
+ inertia.setValue(mass / (btScalar(12.0)) * (ly * ly + lz * lz),
+ mass / (btScalar(12.0)) * (lx * lx + lz * lz),
+ mass / (btScalar(12.0)) * (lx * lx + ly * ly));
}
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btBox2dShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btBox2dShape.h
index 22bee4f2c8..7e085f9e2e 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btBox2dShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btBox2dShape.h
@@ -23,9 +23,9 @@ subject to the following restrictions:
#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
+ATTRIBUTE_ALIGNED16(class)
+btBox2dShape : public btPolyhedralConvexShape
{
-
//btVector3 m_boxHalfExtents1; //use m_implicitShapeDimensions instead
btVector3 m_centroid;
@@ -33,79 +33,75 @@ ATTRIBUTE_ALIGNED16(class) btBox2dShape: public btPolyhedralConvexShape
btVector3 m_normals[4];
public:
-
BT_DECLARE_ALIGNED_ALLOCATOR();
btVector3 getHalfExtentsWithMargin() const
{
btVector3 halfExtents = getHalfExtentsWithoutMargin();
- btVector3 margin(getMargin(),getMargin(),getMargin());
+ 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
+ return m_implicitShapeDimensions; //changed in Bullet 2.63: assume the scaling and margin are included
}
-
- virtual btVector3 localGetSupportingVertex(const btVector3& vec) const
+ virtual btVector3 localGetSupportingVertex(const btVector3& vec) const
{
btVector3 halfExtents = getHalfExtentsWithoutMargin();
- btVector3 margin(getMargin(),getMargin(),getMargin());
+ 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()));
+ btFsels(vec.y(), halfExtents.y(), -halfExtents.y()),
+ btFsels(vec.z(), halfExtents.z(), -halfExtents.z()));
}
- SIMD_FORCE_INLINE btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const
+ 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()));
+ 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
+ virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const
{
const btVector3& halfExtents = getHalfExtentsWithoutMargin();
-
- for (int i=0;i<numVectors;i++)
+
+ 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()));
+ 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)
+ btBox2dShape(const btVector3& boxHalfExtents)
: btPolyhedralConvexShape(),
- m_centroid(0,0,0)
+ 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_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);
+ 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())
+ if (minDimension > boxHalfExtents.getY())
minDimension = boxHalfExtents.getY();
m_shapeType = BOX_2D_SHAPE_PROXYTYPE;
- btVector3 margin(getMargin(),getMargin(),getMargin());
+ btVector3 margin(getMargin(), getMargin(), getMargin());
m_implicitShapeDimensions = (boxHalfExtents * m_localScaling) - margin;
setSafeMargin(minDimension);
@@ -114,42 +110,34 @@ public:
virtual void setMargin(btScalar collisionMargin)
{
//correct the m_implicitShapeDimensions for the margin
- btVector3 oldMargin(getMargin(),getMargin(),getMargin());
- btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions+oldMargin;
-
+ btVector3 oldMargin(getMargin(), getMargin(), getMargin());
+ btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions + oldMargin;
+
btConvexInternalShape::setMargin(collisionMargin);
- btVector3 newMargin(getMargin(),getMargin(),getMargin());
+ btVector3 newMargin(getMargin(), getMargin(), getMargin());
m_implicitShapeDimensions = implicitShapeDimensionsWithMargin - newMargin;
-
}
- virtual void setLocalScaling(const btVector3& scaling)
+ virtual void setLocalScaling(const btVector3& scaling)
{
- btVector3 oldMargin(getMargin(),getMargin(),getMargin());
- btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions+oldMargin;
+ 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 getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const;
+ virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const;
-
- int getVertexCount() const
+ int getVertexCount() const
{
return 4;
}
- virtual int getNumVertices()const
+ virtual int getNumVertices() const
{
return 4;
}
@@ -164,82 +152,70 @@ public:
return &m_normals[0];
}
-
-
-
-
-
-
- virtual void getPlane(btVector3& planeNormal,btVector3& planeSupport,int i ) 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());
+ 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
+ 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));
+ 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
+ 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);
+ 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, btVector3& pa, btVector3& pb) const
//virtual void getEdge(int i,Edge& edge) const
{
int edgeVert0 = 0;
@@ -247,126 +223,117 @@ public:
switch (i)
{
- case 0:
+ case 0:
edgeVert0 = 0;
edgeVert1 = 1;
- break;
- case 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);
-
+ 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 );
+ getVertex(edgeVert0, pa);
+ getVertex(edgeVert1, pb);
}
-
-
-
-
- virtual bool isInside(const btVector3& pt,btScalar tolerance) const
+ 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));
-
+
+ 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
+ virtual const char* getName() const
{
return "Box2d";
}
- virtual int getNumPreferredPenetrationDirections() const
+ virtual int getNumPreferredPenetrationDirections() const
{
return 6;
}
-
- virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const
+
+ 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);
+ 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
-
-
+#endif //BT_OBB_BOX_2D_SHAPE_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btBoxShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btBoxShape.cpp
index 72eeb38911..cb91d023e4 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btBoxShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btBoxShape.cpp
@@ -14,38 +14,32 @@ subject to the following restrictions:
*/
#include "btBoxShape.h"
-btBoxShape::btBoxShape( const btVector3& boxHalfExtents)
-: btPolyhedralConvexShape()
+btBoxShape::btBoxShape(const btVector3& boxHalfExtents)
+ : btPolyhedralConvexShape()
{
m_shapeType = BOX_SHAPE_PROXYTYPE;
- btVector3 margin(getMargin(),getMargin(),getMargin());
+ btVector3 margin(getMargin(), getMargin(), getMargin());
m_implicitShapeDimensions = (boxHalfExtents * m_localScaling) - margin;
setSafeMargin(boxHalfExtents);
};
-
-
-
-void btBoxShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
+void btBoxShape::getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
{
- btTransformAabb(getHalfExtentsWithoutMargin(),getMargin(),t,aabbMin,aabbMax);
+ btTransformAabb(getHalfExtentsWithoutMargin(), getMargin(), t, aabbMin, aabbMax);
}
-
-void btBoxShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const
+void btBoxShape::calculateLocalInertia(btScalar mass, btVector3& inertia) const
{
//btScalar margin = btScalar(0.);
btVector3 halfExtents = getHalfExtentsWithMargin();
- btScalar lx=btScalar(2.)*(halfExtents.x());
- btScalar ly=btScalar(2.)*(halfExtents.y());
- btScalar lz=btScalar(2.)*(halfExtents.z());
-
- inertia.setValue(mass/(btScalar(12.0)) * (ly*ly + lz*lz),
- mass/(btScalar(12.0)) * (lx*lx + lz*lz),
- mass/(btScalar(12.0)) * (lx*lx + ly*ly));
+ btScalar lx = btScalar(2.) * (halfExtents.x());
+ btScalar ly = btScalar(2.) * (halfExtents.y());
+ btScalar lz = btScalar(2.) * (halfExtents.z());
+ inertia.setValue(mass / (btScalar(12.0)) * (ly * ly + lz * lz),
+ mass / (btScalar(12.0)) * (lx * lx + lz * lz),
+ mass / (btScalar(12.0)) * (lx * lx + ly * ly));
}
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btBoxShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btBoxShape.h
index 715e3f2ab9..3c65505d5b 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btBoxShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btBoxShape.h
@@ -23,112 +23,102 @@ subject to the following restrictions:
#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
+ATTRIBUTE_ALIGNED16(class)
+btBoxShape : public btPolyhedralConvexShape
{
-
//btVector3 m_boxHalfExtents1; //use m_implicitShapeDimensions instead
-
public:
-
-BT_DECLARE_ALIGNED_ALLOCATOR();
+ BT_DECLARE_ALIGNED_ALLOCATOR();
btVector3 getHalfExtentsWithMargin() const
{
btVector3 halfExtents = getHalfExtentsWithoutMargin();
- btVector3 margin(getMargin(),getMargin(),getMargin());
+ btVector3 margin(getMargin(), getMargin(), getMargin());
halfExtents += margin;
return halfExtents;
}
-
+
const btVector3& getHalfExtentsWithoutMargin() const
{
- return m_implicitShapeDimensions;//scaling is included, margin is not
+ return m_implicitShapeDimensions; //scaling is included, margin is not
}
-
- virtual btVector3 localGetSupportingVertex(const btVector3& vec) const
+ virtual btVector3 localGetSupportingVertex(const btVector3& vec) const
{
btVector3 halfExtents = getHalfExtentsWithoutMargin();
- btVector3 margin(getMargin(),getMargin(),getMargin());
+ 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()));
+ btFsels(vec.y(), halfExtents.y(), -halfExtents.y()),
+ btFsels(vec.z(), halfExtents.z(), -halfExtents.z()));
}
- SIMD_FORCE_INLINE btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const
+ 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()));
+ 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
+ virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const
{
const btVector3& halfExtents = getHalfExtentsWithoutMargin();
-
- for (int i=0;i<numVectors;i++)
+
+ 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()));
+ btFsels(vec.y(), halfExtents.y(), -halfExtents.y()),
+ btFsels(vec.z(), halfExtents.z(), -halfExtents.z()));
}
-
}
-
- btBoxShape( const btVector3& boxHalfExtents);
+ 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;
-
+ btVector3 oldMargin(getMargin(), getMargin(), getMargin());
+ btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions + oldMargin;
+
btConvexInternalShape::setMargin(collisionMargin);
- btVector3 newMargin(getMargin(),getMargin(),getMargin());
+ btVector3 newMargin(getMargin(), getMargin(), getMargin());
m_implicitShapeDimensions = implicitShapeDimensionsWithMargin - newMargin;
-
}
- virtual void setLocalScaling(const btVector3& scaling)
+ virtual void setLocalScaling(const btVector3& scaling)
{
- btVector3 oldMargin(getMargin(),getMargin(),getMargin());
- btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions+oldMargin;
+ 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 getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const;
-
+ virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const;
- virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
-
- virtual void getPlane(btVector3& planeNormal,btVector3& planeSupport,int i ) 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());
+ 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
+ }
+
+ virtual int getNumVertices() const
{
return 8;
}
@@ -138,49 +128,46 @@ BT_DECLARE_ALIGNED_ALLOCATOR();
return 12;
}
-
- virtual void getVertex(int i,btVector3& vtx) const
+ 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));
+ 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
+ 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);
+ 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, btVector3& pa, btVector3& pb) const
//virtual void getEdge(int i,Edge& edge) const
{
int edgeVert0 = 0;
@@ -188,127 +175,117 @@ BT_DECLARE_ALIGNED_ALLOCATOR();
switch (i)
{
- case 0:
+ case 0:
edgeVert0 = 0;
edgeVert1 = 1;
- break;
- case 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);
-
+ 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 );
+ getVertex(edgeVert0, pa);
+ getVertex(edgeVert1, pb);
}
-
-
-
-
- virtual bool isInside(const btVector3& pt,btScalar tolerance) const
+ 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));
-
+
+ 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
+ virtual const char* getName() const
{
return "Box";
}
- virtual int getNumPreferredPenetrationDirections() const
+ virtual int getNumPreferredPenetrationDirections() const
{
return 6;
}
-
- virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const
+
+ 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);
+ 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
-
-
+#endif //BT_OBB_BOX_MINKOWSKI_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp
index 61f465cb72..d663b3d6d6 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp
@@ -22,11 +22,11 @@ subject to the following restrictions:
///Bvh Concave triangle mesh is a static-triangle mesh shape with Bounding Volume Hierarchy optimization.
///Uses an interface to access the triangles to allow for sharing graphics/physics triangles.
btBvhTriangleMeshShape::btBvhTriangleMeshShape(btStridingMeshInterface* meshInterface, bool useQuantizedAabbCompression, bool buildBvh)
-:btTriangleMeshShape(meshInterface),
-m_bvh(0),
-m_triangleInfoMap(0),
-m_useQuantizedAabbCompression(useQuantizedAabbCompression),
-m_ownsBvh(false)
+ : btTriangleMeshShape(meshInterface),
+ m_bvh(0),
+ m_triangleInfoMap(0),
+ m_useQuantizedAabbCompression(useQuantizedAabbCompression),
+ m_ownsBvh(false)
{
m_shapeType = TRIANGLE_MESH_SHAPE_PROXYTYPE;
//construct bvh from meshInterface
@@ -37,16 +37,15 @@ m_ownsBvh(false)
buildOptimizedBvh();
}
-#endif //DISABLE_BVH
-
+#endif //DISABLE_BVH
}
-btBvhTriangleMeshShape::btBvhTriangleMeshShape(btStridingMeshInterface* meshInterface, bool useQuantizedAabbCompression,const btVector3& bvhAabbMin,const btVector3& bvhAabbMax,bool buildBvh)
-:btTriangleMeshShape(meshInterface),
-m_bvh(0),
-m_triangleInfoMap(0),
-m_useQuantizedAabbCompression(useQuantizedAabbCompression),
-m_ownsBvh(false)
+btBvhTriangleMeshShape::btBvhTriangleMeshShape(btStridingMeshInterface* meshInterface, bool useQuantizedAabbCompression, const btVector3& bvhAabbMin, const btVector3& bvhAabbMax, bool buildBvh)
+ : btTriangleMeshShape(meshInterface),
+ m_bvh(0),
+ m_triangleInfoMap(0),
+ m_useQuantizedAabbCompression(useQuantizedAabbCompression),
+ m_ownsBvh(false)
{
m_shapeType = TRIANGLE_MESH_SHAPE_PROXYTYPE;
//construct bvh from meshInterface
@@ -54,30 +53,28 @@ m_ownsBvh(false)
if (buildBvh)
{
- void* mem = btAlignedAlloc(sizeof(btOptimizedBvh),16);
+ void* mem = btAlignedAlloc(sizeof(btOptimizedBvh), 16);
m_bvh = new (mem) btOptimizedBvh();
-
- m_bvh->build(meshInterface,m_useQuantizedAabbCompression,bvhAabbMin,bvhAabbMax);
+
+ m_bvh->build(meshInterface, m_useQuantizedAabbCompression, bvhAabbMin, bvhAabbMax);
m_ownsBvh = true;
}
-#endif //DISABLE_BVH
-
+#endif //DISABLE_BVH
}
-void btBvhTriangleMeshShape::partialRefitTree(const btVector3& aabbMin,const btVector3& aabbMax)
+void btBvhTriangleMeshShape::partialRefitTree(const btVector3& aabbMin, const btVector3& aabbMax)
{
- m_bvh->refitPartial( m_meshInterface,aabbMin,aabbMax );
-
+ m_bvh->refitPartial(m_meshInterface, aabbMin, aabbMax);
+
m_localAabbMin.setMin(aabbMin);
m_localAabbMax.setMax(aabbMax);
}
-
-void btBvhTriangleMeshShape::refitTree(const btVector3& aabbMin,const btVector3& aabbMax)
+void btBvhTriangleMeshShape::refitTree(const btVector3& aabbMin, const btVector3& aabbMax)
{
- m_bvh->refit( m_meshInterface, aabbMin,aabbMax );
-
+ m_bvh->refit(m_meshInterface, aabbMin, aabbMax);
+
recalcLocalAabb();
}
@@ -90,27 +87,27 @@ btBvhTriangleMeshShape::~btBvhTriangleMeshShape()
}
}
-void btBvhTriangleMeshShape::performRaycast (btTriangleCallback* callback, const btVector3& raySource, const btVector3& rayTarget)
+void btBvhTriangleMeshShape::performRaycast(btTriangleCallback* callback, const btVector3& raySource, const btVector3& rayTarget)
{
- struct MyNodeOverlapCallback : public btNodeOverlapCallback
+ struct MyNodeOverlapCallback : public btNodeOverlapCallback
{
- btStridingMeshInterface* m_meshInterface;
+ btStridingMeshInterface* m_meshInterface;
btTriangleCallback* m_callback;
- MyNodeOverlapCallback(btTriangleCallback* callback,btStridingMeshInterface* meshInterface)
- :m_meshInterface(meshInterface),
- m_callback(callback)
+ MyNodeOverlapCallback(btTriangleCallback* callback, btStridingMeshInterface* meshInterface)
+ : m_meshInterface(meshInterface),
+ m_callback(callback)
{
}
-
+
virtual void processNode(int nodeSubPart, int nodeTriangleIndex)
{
btVector3 m_triangle[3];
- const unsigned char *vertexbase;
+ const unsigned char* vertexbase;
int numverts;
PHY_ScalarType type;
int stride;
- const unsigned char *indexbase;
+ const unsigned char* indexbase;
int indexstride;
int numfaces;
PHY_ScalarType indicestype;
@@ -126,60 +123,60 @@ void btBvhTriangleMeshShape::performRaycast (btTriangleCallback* callback, const
indicestype,
nodeSubPart);
- unsigned int* gfxbase = (unsigned int*)(indexbase+nodeTriangleIndex*indexstride);
- btAssert(indicestype==PHY_INTEGER||indicestype==PHY_SHORT);
-
+ unsigned int* gfxbase = (unsigned int*)(indexbase + nodeTriangleIndex * indexstride);
+ btAssert(indicestype == PHY_INTEGER || indicestype == PHY_SHORT);
+
const btVector3& meshScaling = m_meshInterface->getScaling();
- for (int j=2;j>=0;j--)
+ for (int j = 2; j >= 0; j--)
{
- int graphicsindex = indicestype==PHY_SHORT?((unsigned short*)gfxbase)[j]:gfxbase[j];
-
+ int graphicsindex = indicestype == PHY_SHORT ? ((unsigned short*)gfxbase)[j] : gfxbase[j];
+
if (type == PHY_FLOAT)
{
- float* graphicsbase = (float*)(vertexbase+graphicsindex*stride);
-
- m_triangle[j] = btVector3(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(),graphicsbase[2]*meshScaling.getZ());
+ float* graphicsbase = (float*)(vertexbase + graphicsindex * stride);
+
+ m_triangle[j] = btVector3(graphicsbase[0] * meshScaling.getX(), graphicsbase[1] * meshScaling.getY(), graphicsbase[2] * meshScaling.getZ());
}
else
{
- double* graphicsbase = (double*)(vertexbase+graphicsindex*stride);
-
- m_triangle[j] = btVector3(btScalar(graphicsbase[0])*meshScaling.getX(),btScalar(graphicsbase[1])*meshScaling.getY(),btScalar(graphicsbase[2])*meshScaling.getZ());
+ double* graphicsbase = (double*)(vertexbase + graphicsindex * stride);
+
+ m_triangle[j] = btVector3(btScalar(graphicsbase[0]) * meshScaling.getX(), btScalar(graphicsbase[1]) * meshScaling.getY(), btScalar(graphicsbase[2]) * meshScaling.getZ());
}
}
/* Perform ray vs. triangle collision here */
- m_callback->processTriangle(m_triangle,nodeSubPart,nodeTriangleIndex);
+ m_callback->processTriangle(m_triangle, nodeSubPart, nodeTriangleIndex);
m_meshInterface->unLockReadOnlyVertexBase(nodeSubPart);
}
};
- MyNodeOverlapCallback myNodeCallback(callback,m_meshInterface);
+ MyNodeOverlapCallback myNodeCallback(callback, m_meshInterface);
- m_bvh->reportRayOverlappingNodex(&myNodeCallback,raySource,rayTarget);
+ m_bvh->reportRayOverlappingNodex(&myNodeCallback, raySource, rayTarget);
}
-void btBvhTriangleMeshShape::performConvexcast (btTriangleCallback* callback, const btVector3& raySource, const btVector3& rayTarget, const btVector3& aabbMin, const btVector3& aabbMax)
+void btBvhTriangleMeshShape::performConvexcast(btTriangleCallback* callback, const btVector3& raySource, const btVector3& rayTarget, const btVector3& aabbMin, const btVector3& aabbMax)
{
- struct MyNodeOverlapCallback : public btNodeOverlapCallback
+ struct MyNodeOverlapCallback : public btNodeOverlapCallback
{
- btStridingMeshInterface* m_meshInterface;
+ btStridingMeshInterface* m_meshInterface;
btTriangleCallback* m_callback;
- MyNodeOverlapCallback(btTriangleCallback* callback,btStridingMeshInterface* meshInterface)
- :m_meshInterface(meshInterface),
- m_callback(callback)
+ MyNodeOverlapCallback(btTriangleCallback* callback, btStridingMeshInterface* meshInterface)
+ : m_meshInterface(meshInterface),
+ m_callback(callback)
{
}
-
+
virtual void processNode(int nodeSubPart, int nodeTriangleIndex)
{
btVector3 m_triangle[3];
- const unsigned char *vertexbase;
+ const unsigned char* vertexbase;
int numverts;
PHY_ScalarType type;
int stride;
- const unsigned char *indexbase;
+ const unsigned char* indexbase;
int indexstride;
int numfaces;
PHY_ScalarType indicestype;
@@ -195,77 +192,74 @@ void btBvhTriangleMeshShape::performConvexcast (btTriangleCallback* callback, co
indicestype,
nodeSubPart);
- unsigned int* gfxbase = (unsigned int*)(indexbase+nodeTriangleIndex*indexstride);
- btAssert(indicestype==PHY_INTEGER||indicestype==PHY_SHORT);
-
+ unsigned int* gfxbase = (unsigned int*)(indexbase + nodeTriangleIndex * indexstride);
+ btAssert(indicestype == PHY_INTEGER || indicestype == PHY_SHORT);
+
const btVector3& meshScaling = m_meshInterface->getScaling();
- for (int j=2;j>=0;j--)
+ for (int j = 2; j >= 0; j--)
{
- int graphicsindex = indicestype==PHY_SHORT?((unsigned short*)gfxbase)[j]:gfxbase[j];
+ int graphicsindex = indicestype == PHY_SHORT ? ((unsigned short*)gfxbase)[j] : gfxbase[j];
if (type == PHY_FLOAT)
{
- float* graphicsbase = (float*)(vertexbase+graphicsindex*stride);
+ float* graphicsbase = (float*)(vertexbase + graphicsindex * stride);
- m_triangle[j] = btVector3(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(),graphicsbase[2]*meshScaling.getZ());
+ m_triangle[j] = btVector3(graphicsbase[0] * meshScaling.getX(), graphicsbase[1] * meshScaling.getY(), graphicsbase[2] * meshScaling.getZ());
}
else
{
- double* graphicsbase = (double*)(vertexbase+graphicsindex*stride);
-
- m_triangle[j] = btVector3(btScalar(graphicsbase[0])*meshScaling.getX(),btScalar(graphicsbase[1])*meshScaling.getY(),btScalar(graphicsbase[2])*meshScaling.getZ());
+ double* graphicsbase = (double*)(vertexbase + graphicsindex * stride);
+
+ m_triangle[j] = btVector3(btScalar(graphicsbase[0]) * meshScaling.getX(), btScalar(graphicsbase[1]) * meshScaling.getY(), btScalar(graphicsbase[2]) * meshScaling.getZ());
}
}
/* Perform ray vs. triangle collision here */
- m_callback->processTriangle(m_triangle,nodeSubPart,nodeTriangleIndex);
+ m_callback->processTriangle(m_triangle, nodeSubPart, nodeTriangleIndex);
m_meshInterface->unLockReadOnlyVertexBase(nodeSubPart);
}
};
- MyNodeOverlapCallback myNodeCallback(callback,m_meshInterface);
+ MyNodeOverlapCallback myNodeCallback(callback, m_meshInterface);
- m_bvh->reportBoxCastOverlappingNodex (&myNodeCallback, raySource, rayTarget, aabbMin, aabbMax);
+ m_bvh->reportBoxCastOverlappingNodex(&myNodeCallback, raySource, rayTarget, aabbMin, aabbMax);
}
//perform bvh tree traversal and report overlapping triangles to 'callback'
-void btBvhTriangleMeshShape::processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const
+void btBvhTriangleMeshShape::processAllTriangles(btTriangleCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax) const
{
-
#ifdef DISABLE_BVH
//brute force traverse all triangles
- btTriangleMeshShape::processAllTriangles(callback,aabbMin,aabbMax);
+ btTriangleMeshShape::processAllTriangles(callback, aabbMin, aabbMax);
#else
//first get all the nodes
-
- struct MyNodeOverlapCallback : public btNodeOverlapCallback
+ struct MyNodeOverlapCallback : public btNodeOverlapCallback
{
- btStridingMeshInterface* m_meshInterface;
- btTriangleCallback* m_callback;
- btVector3 m_triangle[3];
+ btStridingMeshInterface* m_meshInterface;
+ btTriangleCallback* m_callback;
+ btVector3 m_triangle[3];
int m_numOverlap;
- MyNodeOverlapCallback(btTriangleCallback* callback,btStridingMeshInterface* meshInterface)
- :m_meshInterface(meshInterface),
- m_callback(callback),
- m_numOverlap(0)
+ MyNodeOverlapCallback(btTriangleCallback* callback, btStridingMeshInterface* meshInterface)
+ : m_meshInterface(meshInterface),
+ m_callback(callback),
+ m_numOverlap(0)
{
}
-
+
virtual void processNode(int nodeSubPart, int nodeTriangleIndex)
{
m_numOverlap++;
- const unsigned char *vertexbase;
+ const unsigned char* vertexbase;
int numverts;
PHY_ScalarType type;
int stride;
- const unsigned char *indexbase;
+ const unsigned char* indexbase;
int indexstride;
int numfaces;
PHY_ScalarType indicestype;
-
m_meshInterface->getLockedReadOnlyVertexIndexBase(
&vertexbase,
@@ -278,67 +272,62 @@ void btBvhTriangleMeshShape::processAllTriangles(btTriangleCallback* callback,co
indicestype,
nodeSubPart);
- unsigned int* gfxbase = (unsigned int*)(indexbase+nodeTriangleIndex*indexstride);
- btAssert(indicestype==PHY_INTEGER||indicestype==PHY_SHORT||indicestype==PHY_UCHAR);
-
+ unsigned int* gfxbase = (unsigned int*)(indexbase + nodeTriangleIndex * indexstride);
+ btAssert(indicestype == PHY_INTEGER || indicestype == PHY_SHORT || indicestype == PHY_UCHAR);
+
const btVector3& meshScaling = m_meshInterface->getScaling();
- for (int j=2;j>=0;j--)
+ for (int j = 2; j >= 0; j--)
{
-
- int graphicsindex = indicestype==PHY_SHORT?((unsigned short*)gfxbase)[j]:indicestype==PHY_INTEGER?gfxbase[j]:((unsigned char*)gfxbase)[j];
-
+ int graphicsindex = indicestype == PHY_SHORT ? ((unsigned short*)gfxbase)[j] : indicestype == PHY_INTEGER ? gfxbase[j] : ((unsigned char*)gfxbase)[j];
#ifdef DEBUG_TRIANGLE_MESH
- printf("%d ,",graphicsindex);
-#endif //DEBUG_TRIANGLE_MESH
+ printf("%d ,", graphicsindex);
+#endif //DEBUG_TRIANGLE_MESH
if (type == PHY_FLOAT)
{
- float* graphicsbase = (float*)(vertexbase+graphicsindex*stride);
-
+ float* graphicsbase = (float*)(vertexbase + graphicsindex * stride);
+
m_triangle[j] = btVector3(
- graphicsbase[0]*meshScaling.getX(),
- graphicsbase[1]*meshScaling.getY(),
- graphicsbase[2]*meshScaling.getZ());
+ graphicsbase[0] * meshScaling.getX(),
+ graphicsbase[1] * meshScaling.getY(),
+ graphicsbase[2] * meshScaling.getZ());
}
else
{
- double* graphicsbase = (double*)(vertexbase+graphicsindex*stride);
+ double* graphicsbase = (double*)(vertexbase + graphicsindex * stride);
m_triangle[j] = btVector3(
- btScalar(graphicsbase[0])*meshScaling.getX(),
- btScalar(graphicsbase[1])*meshScaling.getY(),
- btScalar(graphicsbase[2])*meshScaling.getZ());
+ btScalar(graphicsbase[0]) * meshScaling.getX(),
+ btScalar(graphicsbase[1]) * meshScaling.getY(),
+ btScalar(graphicsbase[2]) * meshScaling.getZ());
}
#ifdef DEBUG_TRIANGLE_MESH
- printf("triangle vertices:%f,%f,%f\n",triangle[j].x(),triangle[j].y(),triangle[j].z());
-#endif //DEBUG_TRIANGLE_MESH
+ printf("triangle vertices:%f,%f,%f\n", triangle[j].x(), triangle[j].y(), triangle[j].z());
+#endif //DEBUG_TRIANGLE_MESH
}
- m_callback->processTriangle(m_triangle,nodeSubPart,nodeTriangleIndex);
+ m_callback->processTriangle(m_triangle, nodeSubPart, nodeTriangleIndex);
m_meshInterface->unLockReadOnlyVertexBase(nodeSubPart);
}
-
};
- MyNodeOverlapCallback myNodeCallback(callback,m_meshInterface);
-
- m_bvh->reportAabbOverlappingNodex(&myNodeCallback,aabbMin,aabbMax);
-
-#endif//DISABLE_BVH
+ MyNodeOverlapCallback myNodeCallback(callback, m_meshInterface);
+ m_bvh->reportAabbOverlappingNodex(&myNodeCallback, aabbMin, aabbMax);
+#endif //DISABLE_BVH
}
-void btBvhTriangleMeshShape::setLocalScaling(const btVector3& scaling)
+void btBvhTriangleMeshShape::setLocalScaling(const btVector3& scaling)
{
- if ((getLocalScaling() -scaling).length2() > SIMD_EPSILON)
- {
- btTriangleMeshShape::setLocalScaling(scaling);
- buildOptimizedBvh();
- }
+ if ((getLocalScaling() - scaling).length2() > SIMD_EPSILON)
+ {
+ btTriangleMeshShape::setLocalScaling(scaling);
+ buildOptimizedBvh();
+ }
}
-void btBvhTriangleMeshShape::buildOptimizedBvh()
+void btBvhTriangleMeshShape::buildOptimizedBvh()
{
if (m_ownsBvh)
{
@@ -346,43 +335,39 @@ void btBvhTriangleMeshShape::buildOptimizedBvh()
btAlignedFree(m_bvh);
}
///m_localAabbMin/m_localAabbMax is already re-calculated in btTriangleMeshShape. We could just scale aabb, but this needs some more work
- void* mem = btAlignedAlloc(sizeof(btOptimizedBvh),16);
- m_bvh = new(mem) btOptimizedBvh();
+ void* mem = btAlignedAlloc(sizeof(btOptimizedBvh), 16);
+ m_bvh = new (mem) btOptimizedBvh();
//rebuild the bvh...
- m_bvh->build(m_meshInterface,m_useQuantizedAabbCompression,m_localAabbMin,m_localAabbMax);
+ m_bvh->build(m_meshInterface, m_useQuantizedAabbCompression, m_localAabbMin, m_localAabbMax);
m_ownsBvh = true;
}
-void btBvhTriangleMeshShape::setOptimizedBvh(btOptimizedBvh* bvh, const btVector3& scaling)
+void btBvhTriangleMeshShape::setOptimizedBvh(btOptimizedBvh* bvh, const btVector3& scaling)
{
- btAssert(!m_bvh);
- btAssert(!m_ownsBvh);
-
- m_bvh = bvh;
- m_ownsBvh = false;
- // update the scaling without rebuilding the bvh
- if ((getLocalScaling() -scaling).length2() > SIMD_EPSILON)
- {
- btTriangleMeshShape::setLocalScaling(scaling);
- }
-}
-
+ btAssert(!m_bvh);
+ btAssert(!m_ownsBvh);
+ m_bvh = bvh;
+ m_ownsBvh = false;
+ // update the scaling without rebuilding the bvh
+ if ((getLocalScaling() - scaling).length2() > SIMD_EPSILON)
+ {
+ btTriangleMeshShape::setLocalScaling(scaling);
+ }
+}
///fills the dataBuffer and returns the struct name (and 0 on failure)
-const char* btBvhTriangleMeshShape::serialize(void* dataBuffer, btSerializer* serializer) const
+const char* btBvhTriangleMeshShape::serialize(void* dataBuffer, btSerializer* serializer) const
{
- btTriangleMeshShapeData* trimeshData = (btTriangleMeshShapeData*) dataBuffer;
+ btTriangleMeshShapeData* trimeshData = (btTriangleMeshShapeData*)dataBuffer;
- btCollisionShape::serialize(&trimeshData->m_collisionShapeData,serializer);
+ btCollisionShape::serialize(&trimeshData->m_collisionShapeData, serializer);
m_meshInterface->serialize(&trimeshData->m_meshInterface, serializer);
trimeshData->m_collisionMargin = float(m_collisionMargin);
-
-
- if (m_bvh && !(serializer->getSerializationFlags()&BT_SERIALIZE_NO_BVH))
+ if (m_bvh && !(serializer->getSerializationFlags() & BT_SERIALIZE_NO_BVH))
{
void* chunk = serializer->findPointer(m_bvh);
if (chunk)
@@ -391,48 +376,49 @@ const char* btBvhTriangleMeshShape::serialize(void* dataBuffer, btSerializer* se
trimeshData->m_quantizedDoubleBvh = (btQuantizedBvhData*)chunk;
trimeshData->m_quantizedFloatBvh = 0;
#else
- trimeshData->m_quantizedFloatBvh = (btQuantizedBvhData*)chunk;
- trimeshData->m_quantizedDoubleBvh= 0;
-#endif //BT_USE_DOUBLE_PRECISION
- } else
+ trimeshData->m_quantizedFloatBvh = (btQuantizedBvhData*)chunk;
+ trimeshData->m_quantizedDoubleBvh = 0;
+#endif //BT_USE_DOUBLE_PRECISION
+ }
+ else
{
-
#ifdef BT_USE_DOUBLE_PRECISION
trimeshData->m_quantizedDoubleBvh = (btQuantizedBvhData*)serializer->getUniquePointer(m_bvh);
trimeshData->m_quantizedFloatBvh = 0;
#else
- trimeshData->m_quantizedFloatBvh = (btQuantizedBvhData*)serializer->getUniquePointer(m_bvh);
- trimeshData->m_quantizedDoubleBvh= 0;
-#endif //BT_USE_DOUBLE_PRECISION
-
+ trimeshData->m_quantizedFloatBvh = (btQuantizedBvhData*)serializer->getUniquePointer(m_bvh);
+ trimeshData->m_quantizedDoubleBvh = 0;
+#endif //BT_USE_DOUBLE_PRECISION
+
int sz = m_bvh->calculateSerializeBufferSizeNew();
- btChunk* chunk = serializer->allocate(sz,1);
+ btChunk* chunk = serializer->allocate(sz, 1);
const char* structType = m_bvh->serialize(chunk->m_oldPtr, serializer);
- serializer->finalizeChunk(chunk,structType,BT_QUANTIZED_BVH_CODE,m_bvh);
+ serializer->finalizeChunk(chunk, structType, BT_QUANTIZED_BVH_CODE, m_bvh);
}
- } else
+ }
+ else
{
trimeshData->m_quantizedFloatBvh = 0;
trimeshData->m_quantizedDoubleBvh = 0;
}
-
-
- if (m_triangleInfoMap && !(serializer->getSerializationFlags()&BT_SERIALIZE_NO_TRIANGLEINFOMAP))
+ if (m_triangleInfoMap && !(serializer->getSerializationFlags() & BT_SERIALIZE_NO_TRIANGLEINFOMAP))
{
void* chunk = serializer->findPointer(m_triangleInfoMap);
if (chunk)
{
trimeshData->m_triangleInfoMap = (btTriangleInfoMapData*)chunk;
- } else
+ }
+ else
{
trimeshData->m_triangleInfoMap = (btTriangleInfoMapData*)serializer->getUniquePointer(m_triangleInfoMap);
int sz = m_triangleInfoMap->calculateSerializeBufferSize();
- btChunk* chunk = serializer->allocate(sz,1);
+ btChunk* chunk = serializer->allocate(sz, 1);
const char* structType = m_triangleInfoMap->serialize(chunk->m_oldPtr, serializer);
- serializer->finalizeChunk(chunk,structType,BT_TRIANLGE_INFO_MAP,m_triangleInfoMap);
+ serializer->finalizeChunk(chunk, structType, BT_TRIANLGE_INFO_MAP, m_triangleInfoMap);
}
- } else
+ }
+ else
{
trimeshData->m_triangleInfoMap = 0;
}
@@ -443,28 +429,24 @@ const char* btBvhTriangleMeshShape::serialize(void* dataBuffer, btSerializer* se
return "btTriangleMeshShapeData";
}
-void btBvhTriangleMeshShape::serializeSingleBvh(btSerializer* serializer) const
+void btBvhTriangleMeshShape::serializeSingleBvh(btSerializer* serializer) const
{
if (m_bvh)
{
- int len = m_bvh->calculateSerializeBufferSizeNew(); //make sure not to use calculateSerializeBufferSize because it is used for in-place
- btChunk* chunk = serializer->allocate(len,1);
+ int len = m_bvh->calculateSerializeBufferSizeNew(); //make sure not to use calculateSerializeBufferSize because it is used for in-place
+ btChunk* chunk = serializer->allocate(len, 1);
const char* structType = m_bvh->serialize(chunk->m_oldPtr, serializer);
- serializer->finalizeChunk(chunk,structType,BT_QUANTIZED_BVH_CODE,(void*)m_bvh);
+ serializer->finalizeChunk(chunk, structType, BT_QUANTIZED_BVH_CODE, (void*)m_bvh);
}
}
-void btBvhTriangleMeshShape::serializeSingleTriangleInfoMap(btSerializer* serializer) const
+void btBvhTriangleMeshShape::serializeSingleTriangleInfoMap(btSerializer* serializer) const
{
if (m_triangleInfoMap)
{
int len = m_triangleInfoMap->calculateSerializeBufferSize();
- btChunk* chunk = serializer->allocate(len,1);
+ btChunk* chunk = serializer->allocate(len, 1);
const char* structType = m_triangleInfoMap->serialize(chunk->m_oldPtr, serializer);
- serializer->finalizeChunk(chunk,structType,BT_TRIANLGE_INFO_MAP,(void*)m_triangleInfoMap);
+ serializer->finalizeChunk(chunk, structType, BT_TRIANLGE_INFO_MAP, (void*)m_triangleInfoMap);
}
}
-
-
-
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h
index 1fa4995d16..8b2f2ee85e 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h
@@ -23,103 +23,99 @@ subject to the following restrictions:
///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.
+///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.
+///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
+ATTRIBUTE_ALIGNED16(class)
+btBvhTriangleMeshShape : public btTriangleMeshShape
{
-
- btOptimizedBvh* m_bvh;
- btTriangleInfoMap* m_triangleInfoMap;
+ 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
+ bool m_pad[11] __attribute__((unused)); ////need padding due to alignment
#else
- bool m_pad[11];////need padding due to alignment
+ bool m_pad[11]; ////need padding due to alignment
#endif
public:
-
BT_DECLARE_ALIGNED_ALLOCATOR();
-
- btBvhTriangleMeshShape(btStridingMeshInterface* meshInterface, bool useQuantizedAabbCompression, bool buildBvh = true);
+ 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);
-
+ btBvhTriangleMeshShape(btStridingMeshInterface * meshInterface, bool useQuantizedAabbCompression, const btVector3& bvhAabbMin, const btVector3& bvhAabbMax, bool buildBvh = true);
+
virtual ~btBvhTriangleMeshShape();
- bool getOwnsBvh () const
+ 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);
-
- 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;
+ virtual void processAllTriangles(btTriangleCallback * callback, const btVector3& aabbMin, const btVector3& aabbMax) const;
- void refitTree(const btVector3& aabbMin,const btVector3& aabbMax);
+ 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);
+ void partialRefitTree(const btVector3& aabbMin, const btVector3& aabbMax);
//debugging
- virtual const char* getName()const {return "BVHTRIANGLEMESH";}
+ virtual const char* getName() const { return "BVHTRIANGLEMESH"; }
+ virtual void setLocalScaling(const btVector3& scaling);
- virtual void setLocalScaling(const btVector3& scaling);
-
- btOptimizedBvh* getOptimizedBvh()
+ btOptimizedBvh* getOptimizedBvh()
{
return m_bvh;
}
- void setOptimizedBvh(btOptimizedBvh* bvh, const btVector3& localScaling=btVector3(1,1,1));
+ void setOptimizedBvh(btOptimizedBvh * bvh, const btVector3& localScaling = btVector3(1, 1, 1));
- void buildOptimizedBvh();
+ void buildOptimizedBvh();
- bool usesQuantizedAabbCompression() const
+ bool usesQuantizedAabbCompression() const
{
- return m_useQuantizedAabbCompression;
+ return m_useQuantizedAabbCompression;
}
- void setTriangleInfoMap(btTriangleInfoMap* triangleInfoMap)
+ void setTriangleInfoMap(btTriangleInfoMap * triangleInfoMap)
{
m_triangleInfoMap = triangleInfoMap;
}
- const btTriangleInfoMap* getTriangleInfoMap() const
+ const btTriangleInfoMap* getTriangleInfoMap() const
{
return m_triangleInfoMap;
}
-
- btTriangleInfoMap* getTriangleInfoMap()
+
+ btTriangleInfoMap* getTriangleInfoMap()
{
return m_triangleInfoMap;
}
- virtual int calculateSerializeBufferSize() 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;
-
- virtual void serializeSingleBvh(btSerializer* serializer) const;
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
- virtual void serializeSingleTriangleInfoMap(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
{
@@ -138,12 +134,11 @@ struct btTriangleMeshShapeData
};
+// clang-format on
-SIMD_FORCE_INLINE int btBvhTriangleMeshShape::calculateSerializeBufferSize() const
+SIMD_FORCE_INLINE int btBvhTriangleMeshShape::calculateSerializeBufferSize() const
{
return sizeof(btTriangleMeshShapeData);
}
-
-
-#endif //BT_BVH_TRIANGLE_MESH_SHAPE_H
+#endif //BT_BVH_TRIANGLE_MESH_SHAPE_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btCapsuleShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btCapsuleShape.cpp
index 0345501ce2..7c33774284 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btCapsuleShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btCapsuleShape.cpp
@@ -13,24 +13,21 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btCapsuleShape.h"
#include "LinearMath/btQuaternion.h"
-btCapsuleShape::btCapsuleShape(btScalar radius, btScalar height) : btConvexInternalShape ()
+btCapsuleShape::btCapsuleShape(btScalar radius, btScalar height) : btConvexInternalShape()
{
m_collisionMargin = radius;
m_shapeType = CAPSULE_SHAPE_PROXYTYPE;
m_upAxis = 1;
- m_implicitShapeDimensions.setValue(radius,0.5f*height,radius);
+ m_implicitShapeDimensions.setValue(radius, 0.5f * height, radius);
}
-
- btVector3 btCapsuleShape::localGetSupportingVertexWithoutMargin(const btVector3& vec0)const
+btVector3 btCapsuleShape::localGetSupportingVertexWithoutMargin(const btVector3& vec0) const
{
-
- btVector3 supVec(0,0,0);
+ btVector3 supVec(0, 0, 0);
btScalar maxDot(btScalar(-BT_LARGE_FLOAT));
@@ -38,20 +35,19 @@ btCapsuleShape::btCapsuleShape(btScalar radius, btScalar height) : btConvexInter
btScalar lenSqr = vec.length2();
if (lenSqr < btScalar(0.0001))
{
- vec.setValue(1,0,0);
- } else
+ vec.setValue(1, 0, 0);
+ }
+ else
{
- btScalar rlen = btScalar(1.) / btSqrt(lenSqr );
+ btScalar rlen = btScalar(1.) / btSqrt(lenSqr);
vec *= rlen;
}
btVector3 vtx;
btScalar newDot;
-
-
{
- btVector3 pos(0,0,0);
+ btVector3 pos(0, 0, 0);
pos[getUpAxis()] = getHalfHeight();
vtx = pos;
@@ -63,7 +59,7 @@ btCapsuleShape::btCapsuleShape(btScalar radius, btScalar height) : btConvexInter
}
}
{
- btVector3 pos(0,0,0);
+ btVector3 pos(0, 0, 0);
pos[getUpAxis()] = -getHalfHeight();
vtx = pos;
@@ -76,15 +72,11 @@ btCapsuleShape::btCapsuleShape(btScalar radius, btScalar height) : btConvexInter
}
return supVec;
-
}
- void btCapsuleShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const
+void btCapsuleShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const
{
-
-
-
- for (int j=0;j<numVectors;j++)
+ for (int j = 0; j < numVectors; j++)
{
btScalar maxDot(btScalar(-BT_LARGE_FLOAT));
const btVector3& vec = vectors[j];
@@ -92,7 +84,7 @@ btCapsuleShape::btCapsuleShape(btScalar radius, btScalar height) : btConvexInter
btVector3 vtx;
btScalar newDot;
{
- btVector3 pos(0,0,0);
+ btVector3 pos(0, 0, 0);
pos[getUpAxis()] = getHalfHeight();
vtx = pos;
newDot = vec.dot(vtx);
@@ -103,7 +95,7 @@ btCapsuleShape::btCapsuleShape(btScalar radius, btScalar height) : btConvexInter
}
}
{
- btVector3 pos(0,0,0);
+ btVector3 pos(0, 0, 0);
pos[getUpAxis()] = -getHalfHeight();
vtx = pos;
newDot = vec.dot(vtx);
@@ -113,57 +105,44 @@ btCapsuleShape::btCapsuleShape(btScalar radius, btScalar height) : btConvexInter
supportVerticesOut[j] = vtx;
}
}
-
}
}
-
-void btCapsuleShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const
+void btCapsuleShape::calculateLocalInertia(btScalar mass, btVector3& inertia) const
{
//as an approximation, take the inertia of the box that bounds the spheres
btTransform ident;
ident.setIdentity();
-
btScalar radius = getRadius();
- btVector3 halfExtents(radius,radius,radius);
- halfExtents[getUpAxis()]+=getHalfHeight();
+ btVector3 halfExtents(radius, radius, radius);
+ halfExtents[getUpAxis()] += getHalfHeight();
- btScalar lx=btScalar(2.)*(halfExtents[0]);
- btScalar ly=btScalar(2.)*(halfExtents[1]);
- btScalar lz=btScalar(2.)*(halfExtents[2]);
- const btScalar x2 = lx*lx;
- const btScalar y2 = ly*ly;
- const btScalar z2 = lz*lz;
+ btScalar lx = btScalar(2.) * (halfExtents[0]);
+ btScalar ly = btScalar(2.) * (halfExtents[1]);
+ btScalar lz = btScalar(2.) * (halfExtents[2]);
+ const btScalar x2 = lx * lx;
+ const btScalar y2 = ly * ly;
+ const btScalar z2 = lz * lz;
const btScalar scaledmass = mass * btScalar(.08333333);
- inertia[0] = scaledmass * (y2+z2);
- inertia[1] = scaledmass * (x2+z2);
- inertia[2] = scaledmass * (x2+y2);
-
+ inertia[0] = scaledmass * (y2 + z2);
+ inertia[1] = scaledmass * (x2 + z2);
+ inertia[2] = scaledmass * (x2 + y2);
}
-btCapsuleShapeX::btCapsuleShapeX(btScalar radius,btScalar height)
+btCapsuleShapeX::btCapsuleShapeX(btScalar radius, btScalar height)
{
m_collisionMargin = radius;
m_upAxis = 0;
- m_implicitShapeDimensions.setValue(0.5f*height, radius,radius);
+ m_implicitShapeDimensions.setValue(0.5f * height, radius, radius);
}
-
-
-
-
-
-btCapsuleShapeZ::btCapsuleShapeZ(btScalar radius,btScalar height)
+btCapsuleShapeZ::btCapsuleShapeZ(btScalar radius, btScalar height)
{
m_collisionMargin = radius;
m_upAxis = 2;
- m_implicitShapeDimensions.setValue(radius,radius,0.5f*height);
+ m_implicitShapeDimensions.setValue(radius, radius, 0.5f * height);
}
-
-
-
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btCapsuleShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btCapsuleShape.h
index 5a3362834a..138d0c0f7c 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btCapsuleShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btCapsuleShape.h
@@ -17,99 +17,96 @@ subject to the following restrictions:
#define BT_CAPSULE_SHAPE_H
#include "btConvexInternalShape.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
-
+#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
+ATTRIBUTE_ALIGNED16(class)
+btCapsuleShape : public btConvexInternalShape
{
protected:
- int m_upAxis;
+ int m_upAxis;
protected:
///only used for btCapsuleShapeZ and btCapsuleShapeX subclasses.
- btCapsuleShape() : btConvexInternalShape() {m_shapeType = CAPSULE_SHAPE_PROXYTYPE;};
+ btCapsuleShape() : btConvexInternalShape() { m_shapeType = CAPSULE_SHAPE_PROXYTYPE; };
public:
-
BT_DECLARE_ALIGNED_ALLOCATOR();
-
- btCapsuleShape(btScalar radius,btScalar height);
+
+ btCapsuleShape(btScalar radius, btScalar height);
///CollisionShape Interface
- virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
+ virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const;
/// btConvexShape Interface
- virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const;
+ virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const;
+
+ virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) 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
+ 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;
+ 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
+ virtual const char* getName() const
{
return "CapsuleShape";
}
- int getUpAxis() const
+ int getUpAxis() const
{
return m_upAxis;
}
- btScalar getRadius() const
+ btScalar getRadius() const
{
- int radiusAxis = (m_upAxis+2)%3;
+ int radiusAxis = (m_upAxis + 2) % 3;
return m_implicitShapeDimensions[radiusAxis];
}
- btScalar getHalfHeight() const
+ btScalar getHalfHeight() const
{
return m_implicitShapeDimensions[m_upAxis];
}
- virtual void setLocalScaling(const btVector3& scaling)
+ virtual void setLocalScaling(const btVector3& scaling)
{
btVector3 unScaledImplicitShapeDimensions = m_implicitShapeDimensions / m_localScaling;
- btConvexInternalShape::setLocalScaling(scaling);
+ btConvexInternalShape::setLocalScaling(scaling);
m_implicitShapeDimensions = (unScaledImplicitShapeDimensions * scaling);
//update m_collisionMargin, since entire radius==margin
- int radiusAxis = (m_upAxis+2)%3;
+ int radiusAxis = (m_upAxis + 2) % 3;
m_collisionMargin = m_implicitShapeDimensions[radiusAxis];
}
- virtual btVector3 getAnisotropicRollingFrictionDirection() const
+ virtual btVector3 getAnisotropicRollingFrictionDirection() const
{
- btVector3 aniDir(0,0,0);
- aniDir[getUpAxis()]=1;
+ btVector3 aniDir(0, 0, 0);
+ aniDir[getUpAxis()] = 1;
return aniDir;
}
-
- virtual int calculateSerializeBufferSize() 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;
-
- SIMD_FORCE_INLINE void deSerializeFloat(struct btCapsuleShapeData* dataBuffer);
+ 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
@@ -117,17 +114,13 @@ public:
class btCapsuleShapeX : public btCapsuleShape
{
public:
+ btCapsuleShapeX(btScalar radius, btScalar height);
- btCapsuleShapeX(btScalar radius,btScalar height);
-
//debugging
- virtual const char* getName()const
+ virtual const char* getName() const
{
return "CapsuleX";
}
-
-
-
};
///btCapsuleShapeZ represents a capsule around the Z axis
@@ -135,38 +128,36 @@ public:
class btCapsuleShapeZ : public btCapsuleShape
{
public:
- btCapsuleShapeZ(btScalar radius,btScalar height);
+ btCapsuleShapeZ(btScalar radius, btScalar height);
- //debugging
- virtual const char* getName()const
+ //debugging
+ virtual const char* getName() const
{
return "CapsuleZ";
}
-
-
};
///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
-struct btCapsuleShapeData
+struct btCapsuleShapeData
{
- btConvexInternalShapeData m_convexInternalShapeData;
+ btConvexInternalShapeData m_convexInternalShapeData;
- int m_upAxis;
+ int m_upAxis;
- char m_padding[4];
+ char m_padding[4];
};
-SIMD_FORCE_INLINE int btCapsuleShape::calculateSerializeBufferSize() const
+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
+///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;
+ btCapsuleShapeData* shapeData = (btCapsuleShapeData*)dataBuffer;
- btConvexInternalShape::serialize(&shapeData->m_convexInternalShapeData,serializer);
+ btConvexInternalShape::serialize(&shapeData->m_convexInternalShapeData, serializer);
shapeData->m_upAxis = m_upAxis;
@@ -179,7 +170,7 @@ SIMD_FORCE_INLINE const char* btCapsuleShape::serialize(void* dataBuffer, btSeri
return "btCapsuleShapeData";
}
-SIMD_FORCE_INLINE void btCapsuleShape::deSerializeFloat(btCapsuleShapeData* dataBuffer)
+SIMD_FORCE_INLINE void btCapsuleShape::deSerializeFloat(btCapsuleShapeData* dataBuffer)
{
m_implicitShapeDimensions.deSerializeFloat(dataBuffer->m_convexInternalShapeData.m_implicitShapeDimensions);
m_collisionMargin = dataBuffer->m_convexInternalShapeData.m_collisionMargin;
@@ -188,4 +179,4 @@ SIMD_FORCE_INLINE void btCapsuleShape::deSerializeFloat(btCapsuleShapeData* data
m_upAxis = dataBuffer->m_upAxis;
}
-#endif //BT_CAPSULE_SHAPE_H
+#endif //BT_CAPSULE_SHAPE_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btCollisionMargin.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btCollisionMargin.h
index 474bf1fb49..abd8ab3eb5 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btCollisionMargin.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btCollisionMargin.h
@@ -19,9 +19,6 @@ subject to the following restrictions:
///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
+#define CONVEX_DISTANCE_MARGIN btScalar(0.04) // btScalar(0.1)//;//btScalar(0.01)
+#endif //BT_COLLISION_MARGIN_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btCollisionShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btCollisionShape.cpp
index 823e2788f2..0b3640a65b 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btCollisionShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btCollisionShape.cpp
@@ -20,47 +20,44 @@ subject to the following restrictions:
can be used by probes that are checking whether the
library is actually installed.
*/
-extern "C"
+extern "C"
{
-void btBulletCollisionProbe ();
+ void btBulletCollisionProbe();
-void btBulletCollisionProbe () {}
+ void btBulletCollisionProbe() {}
}
-
-
-void btCollisionShape::getBoundingSphere(btVector3& center,btScalar& radius) const
+void btCollisionShape::getBoundingSphere(btVector3& center, btScalar& radius) const
{
btTransform tr;
tr.setIdentity();
- btVector3 aabbMin,aabbMax;
+ btVector3 aabbMin, aabbMax;
- getAabb(tr,aabbMin,aabbMax);
+ getAabb(tr, aabbMin, aabbMax);
- radius = (aabbMax-aabbMin).length()*btScalar(0.5);
- center = (aabbMin+aabbMax)*btScalar(0.5);
+ radius = (aabbMax - aabbMin).length() * btScalar(0.5);
+ center = (aabbMin + aabbMax) * btScalar(0.5);
}
-
-btScalar btCollisionShape::getContactBreakingThreshold(btScalar defaultContactThreshold) const
+btScalar btCollisionShape::getContactBreakingThreshold(btScalar defaultContactThreshold) const
{
return getAngularMotionDisc() * defaultContactThreshold;
}
-btScalar btCollisionShape::getAngularMotionDisc() const
+btScalar btCollisionShape::getAngularMotionDisc() const
{
///@todo cache this value, to improve performance
- btVector3 center;
+ btVector3 center;
btScalar disc;
- getBoundingSphere(center,disc);
+ getBoundingSphere(center, disc);
disc += (center).length();
return disc;
}
-void btCollisionShape::calculateTemporalAabb(const btTransform& curTrans,const btVector3& linvel,const btVector3& angvel,btScalar timeStep, btVector3& temporalAabbMin,btVector3& temporalAabbMax) const
+void btCollisionShape::calculateTemporalAabb(const btTransform& curTrans, const btVector3& linvel, const btVector3& angvel, btScalar timeStep, btVector3& temporalAabbMin, btVector3& temporalAabbMax) const
{
//start with static aabb
- getAabb(curTrans,temporalAabbMin,temporalAabbMax);
+ getAabb(curTrans, temporalAabbMin, temporalAabbMax);
btScalar temporalAabbMaxx = temporalAabbMax.getX();
btScalar temporalAabbMaxy = temporalAabbMax.getY();
@@ -70,36 +67,36 @@ void btCollisionShape::calculateTemporalAabb(const btTransform& curTrans,const b
btScalar temporalAabbMinz = temporalAabbMin.getZ();
// add linear motion
- btVector3 linMotion = linvel*timeStep;
+ btVector3 linMotion = linvel * timeStep;
///@todo: simd would have a vector max/min operation, instead of per-element access
if (linMotion.x() > btScalar(0.))
- temporalAabbMaxx += linMotion.x();
+ temporalAabbMaxx += linMotion.x();
else
temporalAabbMinx += linMotion.x();
if (linMotion.y() > btScalar(0.))
- temporalAabbMaxy += linMotion.y();
+ temporalAabbMaxy += linMotion.y();
else
temporalAabbMiny += linMotion.y();
if (linMotion.z() > btScalar(0.))
- temporalAabbMaxz += linMotion.z();
+ temporalAabbMaxz += linMotion.z();
else
temporalAabbMinz += linMotion.z();
//add conservative angular motion
btScalar angularMotion = angvel.length() * getAngularMotionDisc() * timeStep;
- btVector3 angularMotion3d(angularMotion,angularMotion,angularMotion);
- temporalAabbMin = btVector3(temporalAabbMinx,temporalAabbMiny,temporalAabbMinz);
- temporalAabbMax = btVector3(temporalAabbMaxx,temporalAabbMaxy,temporalAabbMaxz);
+ btVector3 angularMotion3d(angularMotion, angularMotion, angularMotion);
+ temporalAabbMin = btVector3(temporalAabbMinx, temporalAabbMiny, temporalAabbMinz);
+ temporalAabbMax = btVector3(temporalAabbMaxx, temporalAabbMaxy, temporalAabbMaxz);
temporalAabbMin -= angularMotion3d;
temporalAabbMax += angularMotion3d;
}
///fills the dataBuffer and returns the struct name (and 0 on failure)
-const char* btCollisionShape::serialize(void* dataBuffer, btSerializer* serializer) const
+const char* btCollisionShape::serialize(void* dataBuffer, btSerializer* serializer) const
{
- btCollisionShapeData* shapeData = (btCollisionShapeData*) dataBuffer;
- char* name = (char*) serializer->findNameForPointer(this);
+ btCollisionShapeData* shapeData = (btCollisionShapeData*)dataBuffer;
+ char* name = (char*)serializer->findNameForPointer(this);
shapeData->m_name = (char*)serializer->getUniquePointer(name);
if (shapeData->m_name)
{
@@ -113,10 +110,10 @@ const char* btCollisionShape::serialize(void* dataBuffer, btSerializer* serializ
return "btCollisionShapeData";
}
-void btCollisionShape::serializeSingleShape(btSerializer* serializer) const
+void btCollisionShape::serializeSingleShape(btSerializer* serializer) const
{
int len = calculateSerializeBufferSize();
- btChunk* chunk = serializer->allocate(len,1);
+ btChunk* chunk = serializer->allocate(len, 1);
const char* structType = serialize(chunk->m_oldPtr, serializer);
- serializer->finalizeChunk(chunk,structType,BT_SHAPE_CODE,(void*)this);
+ serializer->finalizeChunk(chunk, structType, BT_SHAPE_CODE, (void*)this);
} \ No newline at end of file
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btCollisionShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btCollisionShape.h
index 6c4916fbd4..c80e105a4d 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btCollisionShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btCollisionShape.h
@@ -19,12 +19,12 @@ subject to the following restrictions:
#include "LinearMath/btTransform.h"
#include "LinearMath/btVector3.h"
#include "LinearMath/btMatrix3x3.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" //for the shape types
+#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
+ATTRIBUTE_ALIGNED16(class)
+btCollisionShape
{
protected:
int m_shapeType;
@@ -32,10 +32,9 @@ protected:
int m_userIndex;
public:
-
BT_DECLARE_ALIGNED_ALLOCATOR();
- btCollisionShape() : m_shapeType (INVALID_SHAPE_PROXYTYPE), m_userPointer(0), m_userIndex(-1)
+ btCollisionShape() : m_shapeType(INVALID_SHAPE_PROXYTYPE), m_userPointer(0), m_userIndex(-1)
{
}
@@ -44,50 +43,47 @@ public:
}
///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 getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const = 0;
- virtual void getBoundingSphere(btVector3& center,btScalar& radius) const;
+ 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;
+ 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;
-
+ void calculateTemporalAabb(const btTransform& curTrans, const btVector3& linvel, const btVector3& angvel, btScalar timeStep, btVector3& temporalAabbMin, btVector3& temporalAabbMax) const;
-
- SIMD_FORCE_INLINE bool isPolyhedral() const
+ SIMD_FORCE_INLINE bool isPolyhedral() const
{
return btBroadphaseProxy::isPolyhedral(getShapeType());
}
- SIMD_FORCE_INLINE bool isConvex2d() const
+ SIMD_FORCE_INLINE bool isConvex2d() const
{
return btBroadphaseProxy::isConvex2d(getShapeType());
}
- SIMD_FORCE_INLINE bool isConvex() const
+ SIMD_FORCE_INLINE bool isConvex() const
{
return btBroadphaseProxy::isConvex(getShapeType());
}
- SIMD_FORCE_INLINE bool isNonMoving() const
+ SIMD_FORCE_INLINE bool isNonMoving() const
{
return btBroadphaseProxy::isNonMoving(getShapeType());
}
- SIMD_FORCE_INLINE bool isConcave() const
+ SIMD_FORCE_INLINE bool isConcave() const
{
return btBroadphaseProxy::isConcave(getShapeType());
}
- SIMD_FORCE_INLINE bool isCompound() const
+ SIMD_FORCE_INLINE bool isCompound() const
{
return btBroadphaseProxy::isCompound(getShapeType());
}
- SIMD_FORCE_INLINE bool isSoftBody() const
+ SIMD_FORCE_INLINE bool isSoftBody() const
{
return btBroadphaseProxy::isSoftBody(getShapeType());
}
@@ -99,35 +95,35 @@ public:
}
#ifndef __SPU__
- virtual void setLocalScaling(const btVector3& scaling) =0;
- virtual const btVector3& getLocalScaling() const =0;
- virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const = 0;
-
+ 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__
+ //debugging support
+ virtual const char* getName() const = 0;
+#endif //__SPU__
-
- int getShapeType() const { return m_shapeType; }
+ 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
+ virtual btVector3 getAnisotropicRollingFrictionDirection() const
{
- return btVector3(1,1,1);
+ return btVector3(1, 1, 1);
}
- virtual void setMargin(btScalar margin) = 0;
- virtual btScalar getMargin() const = 0;
+ virtual void setMargin(btScalar margin) = 0;
+ virtual btScalar getMargin() const = 0;
-
///optional user data pointer
- void setUserPointer(void* userPtr)
+ void setUserPointer(void* userPtr)
{
m_userPointer = userPtr;
}
- void* getUserPointer() const
+ void* getUserPointer() const
{
return m_userPointer;
}
@@ -141,16 +137,16 @@ public:
return m_userIndex;
}
-
- virtual int calculateSerializeBufferSize() 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;
-
- virtual void serializeSingleShape(btSerializer* serializer) const;
+ 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
{
@@ -158,13 +154,10 @@ struct btCollisionShapeData
int m_shapeType;
char m_padding[4];
};
-
-SIMD_FORCE_INLINE int btCollisionShape::calculateSerializeBufferSize() const
+// clang-format on
+SIMD_FORCE_INLINE int btCollisionShape::calculateSerializeBufferSize() const
{
return sizeof(btCollisionShapeData);
}
-
-
-#endif //BT_COLLISION_SHAPE_H
-
+#endif //BT_COLLISION_SHAPE_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btCompoundShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btCompoundShape.cpp
index 85572da307..fd7828b104 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btCompoundShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btCompoundShape.cpp
@@ -19,26 +19,25 @@ subject to the following restrictions:
#include "LinearMath/btSerializer.h"
btCompoundShape::btCompoundShape(bool enableDynamicAabbTree, const int initialChildCapacity)
-: m_localAabbMin(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT)),
-m_localAabbMax(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT)),
-m_dynamicAabbTree(0),
-m_updateRevision(1),
-m_collisionMargin(btScalar(0.)),
-m_localScaling(btScalar(1.),btScalar(1.),btScalar(1.))
+ : m_localAabbMin(btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT)),
+ m_localAabbMax(btScalar(-BT_LARGE_FLOAT), btScalar(-BT_LARGE_FLOAT), btScalar(-BT_LARGE_FLOAT)),
+ m_dynamicAabbTree(0),
+ m_updateRevision(1),
+ m_collisionMargin(btScalar(0.)),
+ m_localScaling(btScalar(1.), btScalar(1.), btScalar(1.))
{
m_shapeType = COMPOUND_SHAPE_PROXYTYPE;
if (enableDynamicAabbTree)
{
- void* mem = btAlignedAlloc(sizeof(btDbvt),16);
- m_dynamicAabbTree = new(mem) btDbvt();
- btAssert(mem==m_dynamicAabbTree);
+ void* mem = btAlignedAlloc(sizeof(btDbvt), 16);
+ m_dynamicAabbTree = new (mem) btDbvt();
+ btAssert(mem == m_dynamicAabbTree);
}
m_children.reserve(initialChildCapacity);
}
-
btCompoundShape::~btCompoundShape()
{
if (m_dynamicAabbTree)
@@ -48,7 +47,7 @@ btCompoundShape::~btCompoundShape()
}
}
-void btCompoundShape::addChildShape(const btTransform& localTransform,btCollisionShape* shape)
+void btCompoundShape::addChildShape(const btTransform& localTransform, btCollisionShape* shape)
{
m_updateRevision++;
//m_childTransforms.push_back(localTransform);
@@ -60,11 +59,10 @@ void btCompoundShape::addChildShape(const btTransform& localTransform,btCollisio
child.m_childShapeType = shape->getShapeType();
child.m_childMargin = shape->getMargin();
-
//extend the local aabbMin/aabbMax
- btVector3 localAabbMin,localAabbMax;
- shape->getAabb(localTransform,localAabbMin,localAabbMax);
- for (int i=0;i<3;i++)
+ btVector3 localAabbMin, localAabbMax;
+ shape->getAabb(localTransform, localAabbMin, localAabbMax);
+ for (int i = 0; i < 3; i++)
{
if (m_localAabbMin[i] > localAabbMin[i])
{
@@ -74,31 +72,30 @@ void btCompoundShape::addChildShape(const btTransform& localTransform,btCollisio
{
m_localAabbMax[i] = localAabbMax[i];
}
-
}
if (m_dynamicAabbTree)
{
- const btDbvtVolume bounds=btDbvtVolume::FromMM(localAabbMin,localAabbMax);
+ const btDbvtVolume bounds = btDbvtVolume::FromMM(localAabbMin, localAabbMax);
size_t index = m_children.size();
- child.m_node = m_dynamicAabbTree->insert(bounds,reinterpret_cast<void*>(index) );
+ child.m_node = m_dynamicAabbTree->insert(bounds, reinterpret_cast<void*>(index));
}
m_children.push_back(child);
-
}
-void btCompoundShape::updateChildTransform(int childIndex, const btTransform& newChildTransform,bool shouldRecalculateLocalAabb)
+void btCompoundShape::updateChildTransform(int childIndex, const btTransform& newChildTransform, bool shouldRecalculateLocalAabb)
{
m_children[childIndex].m_transform = newChildTransform;
if (m_dynamicAabbTree)
{
///update the dynamic aabb tree
- btVector3 localAabbMin,localAabbMax;
- m_children[childIndex].m_childShape->getAabb(newChildTransform,localAabbMin,localAabbMax);
- ATTRIBUTE_ALIGNED16(btDbvtVolume) bounds=btDbvtVolume::FromMM(localAabbMin,localAabbMax);
+ btVector3 localAabbMin, localAabbMax;
+ m_children[childIndex].m_childShape->getAabb(newChildTransform, localAabbMin, localAabbMax);
+ ATTRIBUTE_ALIGNED16(btDbvtVolume)
+ bounds = btDbvtVolume::FromMM(localAabbMin, localAabbMax);
//int index = m_children.size()-1;
- m_dynamicAabbTree->update(m_children[childIndex].m_node,bounds);
+ m_dynamicAabbTree->update(m_children[childIndex].m_node, bounds);
}
if (shouldRecalculateLocalAabb)
@@ -110,35 +107,30 @@ void btCompoundShape::updateChildTransform(int childIndex, const btTransform& ne
void btCompoundShape::removeChildShapeByIndex(int childShapeIndex)
{
m_updateRevision++;
- btAssert(childShapeIndex >=0 && childShapeIndex < m_children.size());
+ btAssert(childShapeIndex >= 0 && childShapeIndex < m_children.size());
if (m_dynamicAabbTree)
{
m_dynamicAabbTree->remove(m_children[childShapeIndex].m_node);
}
- m_children.swap(childShapeIndex,m_children.size()-1);
- if (m_dynamicAabbTree)
+ m_children.swap(childShapeIndex, m_children.size() - 1);
+ if (m_dynamicAabbTree)
m_children[childShapeIndex].m_node->dataAsInt = childShapeIndex;
m_children.pop_back();
-
}
-
-
void btCompoundShape::removeChildShape(btCollisionShape* shape)
{
m_updateRevision++;
// Find the children containing the shape specified, and remove those children.
//note: there might be multiple children using the same shape!
- for(int i = m_children.size()-1; i >= 0 ; i--)
+ for (int i = m_children.size() - 1; i >= 0; i--)
{
- if(m_children[i].m_childShape == shape)
+ if (m_children[i].m_childShape == shape)
{
removeChildShapeByIndex(i);
}
}
-
-
recalculateLocalAabb();
}
@@ -147,15 +139,15 @@ void btCompoundShape::recalculateLocalAabb()
// Recalculate the local aabb
// Brute force, it iterates over all the shapes left.
- m_localAabbMin = btVector3(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
- m_localAabbMax = btVector3(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
+ m_localAabbMin = btVector3(btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT));
+ m_localAabbMax = btVector3(btScalar(-BT_LARGE_FLOAT), btScalar(-BT_LARGE_FLOAT), btScalar(-BT_LARGE_FLOAT));
//extend the local aabbMin/aabbMax
for (int j = 0; j < m_children.size(); j++)
{
- btVector3 localAabbMin,localAabbMax;
+ btVector3 localAabbMin, localAabbMax;
m_children[j].m_childShape->getAabb(m_children[j].m_transform, localAabbMin, localAabbMax);
- for (int i=0;i<3;i++)
+ for (int i = 0; i < 3; i++)
{
if (m_localAabbMin[i] > localAabbMin[i])
m_localAabbMin[i] = localAabbMin[i];
@@ -166,53 +158,47 @@ void btCompoundShape::recalculateLocalAabb()
}
///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version
-void btCompoundShape::getAabb(const btTransform& trans,btVector3& aabbMin,btVector3& aabbMax) const
+void btCompoundShape::getAabb(const btTransform& trans, btVector3& aabbMin, btVector3& aabbMax) const
{
- btVector3 localHalfExtents = btScalar(0.5)*(m_localAabbMax-m_localAabbMin);
- btVector3 localCenter = btScalar(0.5)*(m_localAabbMax+m_localAabbMin);
-
+ btVector3 localHalfExtents = btScalar(0.5) * (m_localAabbMax - m_localAabbMin);
+ btVector3 localCenter = btScalar(0.5) * (m_localAabbMax + m_localAabbMin);
+
//avoid an illegal AABB when there are no children
if (!m_children.size())
{
- localHalfExtents.setValue(0,0,0);
- localCenter.setValue(0,0,0);
+ localHalfExtents.setValue(0, 0, 0);
+ localCenter.setValue(0, 0, 0);
}
- localHalfExtents += btVector3(getMargin(),getMargin(),getMargin());
-
+ localHalfExtents += btVector3(getMargin(), getMargin(), getMargin());
- btMatrix3x3 abs_b = trans.getBasis().absolute();
+ btMatrix3x3 abs_b = trans.getBasis().absolute();
btVector3 center = trans(localCenter);
- btVector3 extent = localHalfExtents.dot3(abs_b[0], abs_b[1], abs_b[2]);
- aabbMin = center-extent;
- aabbMax = center+extent;
-
+ btVector3 extent = localHalfExtents.dot3(abs_b[0], abs_b[1], abs_b[2]);
+ aabbMin = center - extent;
+ aabbMax = center + extent;
}
-void btCompoundShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const
+void btCompoundShape::calculateLocalInertia(btScalar mass, btVector3& inertia) const
{
//approximation: take the inertia from the aabb for now
btTransform ident;
ident.setIdentity();
- btVector3 aabbMin,aabbMax;
- getAabb(ident,aabbMin,aabbMax);
+ btVector3 aabbMin, aabbMax;
+ getAabb(ident, aabbMin, aabbMax);
- btVector3 halfExtents = (aabbMax-aabbMin)*btScalar(0.5);
+ btVector3 halfExtents = (aabbMax - aabbMin) * btScalar(0.5);
- btScalar lx=btScalar(2.)*(halfExtents.x());
- btScalar ly=btScalar(2.)*(halfExtents.y());
- btScalar lz=btScalar(2.)*(halfExtents.z());
-
- inertia[0] = mass/(btScalar(12.0)) * (ly*ly + lz*lz);
- inertia[1] = mass/(btScalar(12.0)) * (lx*lx + lz*lz);
- inertia[2] = mass/(btScalar(12.0)) * (lx*lx + ly*ly);
+ btScalar lx = btScalar(2.) * (halfExtents.x());
+ btScalar ly = btScalar(2.) * (halfExtents.y());
+ btScalar lz = btScalar(2.) * (halfExtents.z());
+ inertia[0] = mass / (btScalar(12.0)) * (ly * ly + lz * lz);
+ inertia[1] = mass / (btScalar(12.0)) * (lx * lx + lz * lz);
+ inertia[2] = mass / (btScalar(12.0)) * (lx * lx + ly * ly);
}
-
-
-
void btCompoundShape::calculatePrincipalAxisTransform(const btScalar* masses, btTransform& principal, btVector3& inertia) const
{
int n = m_children.size();
@@ -223,18 +209,18 @@ void btCompoundShape::calculatePrincipalAxisTransform(const btScalar* masses, bt
for (k = 0; k < n; k++)
{
- btAssert(masses[k]>0);
+ btAssert(masses[k] > 0);
center += m_children[k].m_transform.getOrigin() * masses[k];
totalMass += masses[k];
}
- btAssert(totalMass>0);
+ btAssert(totalMass > 0);
center /= totalMass;
principal.setOrigin(center);
btMatrix3x3 tensor(0, 0, 0, 0, 0, 0, 0, 0, 0);
- for ( k = 0; k < n; k++)
+ for (k = 0; k < n; k++)
{
btVector3 i;
m_children[k].m_childShape->calculateLocalInertia(masses[k], i);
@@ -259,8 +245,8 @@ void btCompoundShape::calculatePrincipalAxisTransform(const btScalar* masses, bt
j[0].setValue(o2, 0, 0);
j[1].setValue(0, o2, 0);
j[2].setValue(0, 0, o2);
- j[0] += o * -o.x();
- j[1] += o * -o.y();
+ j[0] += o * -o.x();
+ j[1] += o * -o.y();
j[2] += o * -o.z();
//add inertia tensor of pointmass
@@ -273,59 +259,50 @@ void btCompoundShape::calculatePrincipalAxisTransform(const btScalar* masses, bt
inertia.setValue(tensor[0][0], tensor[1][1], tensor[2][2]);
}
-
-
-
-
void btCompoundShape::setLocalScaling(const btVector3& scaling)
{
-
- for(int i = 0; i < m_children.size(); i++)
+ for (int i = 0; i < m_children.size(); i++)
{
btTransform childTrans = getChildTransform(i);
btVector3 childScale = m_children[i].m_childShape->getLocalScaling();
-// childScale = childScale * (childTrans.getBasis() * scaling);
+ // childScale = childScale * (childTrans.getBasis() * scaling);
childScale = childScale * scaling / m_localScaling;
m_children[i].m_childShape->setLocalScaling(childScale);
childTrans.setOrigin((childTrans.getOrigin()) * scaling / m_localScaling);
- updateChildTransform(i, childTrans,false);
+ updateChildTransform(i, childTrans, false);
}
-
+
m_localScaling = scaling;
recalculateLocalAabb();
-
}
-
void btCompoundShape::createAabbTreeFromChildren()
{
- if ( !m_dynamicAabbTree )
- {
- void* mem = btAlignedAlloc(sizeof(btDbvt),16);
- m_dynamicAabbTree = new(mem) btDbvt();
- btAssert(mem==m_dynamicAabbTree);
+ if (!m_dynamicAabbTree)
+ {
+ void* mem = btAlignedAlloc(sizeof(btDbvt), 16);
+ m_dynamicAabbTree = new (mem) btDbvt();
+ btAssert(mem == m_dynamicAabbTree);
- for ( int index = 0; index < m_children.size(); index++ )
- {
- btCompoundShapeChild &child = m_children[index];
+ for (int index = 0; index < m_children.size(); index++)
+ {
+ btCompoundShapeChild& child = m_children[index];
- //extend the local aabbMin/aabbMax
- btVector3 localAabbMin,localAabbMax;
- child.m_childShape->getAabb(child.m_transform,localAabbMin,localAabbMax);
+ //extend the local aabbMin/aabbMax
+ btVector3 localAabbMin, localAabbMax;
+ child.m_childShape->getAabb(child.m_transform, localAabbMin, localAabbMax);
- const btDbvtVolume bounds=btDbvtVolume::FromMM(localAabbMin,localAabbMax);
+ const btDbvtVolume bounds = btDbvtVolume::FromMM(localAabbMin, localAabbMax);
size_t index2 = index;
- child.m_node = m_dynamicAabbTree->insert(bounds, reinterpret_cast<void*>(index2) );
- }
- }
+ child.m_node = m_dynamicAabbTree->insert(bounds, reinterpret_cast<void*>(index2));
+ }
+ }
}
-
///fills the dataBuffer and returns the struct name (and 0 on failure)
-const char* btCompoundShape::serialize(void* dataBuffer, btSerializer* serializer) const
+const char* btCompoundShape::serialize(void* dataBuffer, btSerializer* serializer) const
{
-
- btCompoundShapeData* shapeData = (btCompoundShapeData*) dataBuffer;
+ btCompoundShapeData* shapeData = (btCompoundShapeData*)dataBuffer;
btCollisionShape::serialize(&shapeData->m_collisionShapeData, serializer);
shapeData->m_collisionMargin = float(m_collisionMargin);
@@ -333,27 +310,26 @@ const char* btCompoundShape::serialize(void* dataBuffer, btSerializer* serialize
shapeData->m_childShapePtr = 0;
if (shapeData->m_numChildShapes)
{
- btChunk* chunk = serializer->allocate(sizeof(btCompoundShapeChildData),shapeData->m_numChildShapes);
+ btChunk* chunk = serializer->allocate(sizeof(btCompoundShapeChildData), shapeData->m_numChildShapes);
btCompoundShapeChildData* memPtr = (btCompoundShapeChildData*)chunk->m_oldPtr;
shapeData->m_childShapePtr = (btCompoundShapeChildData*)serializer->getUniquePointer(memPtr);
- for (int i=0;i<shapeData->m_numChildShapes;i++,memPtr++)
+ for (int i = 0; i < shapeData->m_numChildShapes; i++, memPtr++)
{
memPtr->m_childMargin = float(m_children[i].m_childMargin);
memPtr->m_childShape = (btCollisionShapeData*)serializer->getUniquePointer(m_children[i].m_childShape);
//don't serialize shapes that already have been serialized
if (!serializer->findPointer(m_children[i].m_childShape))
{
- btChunk* chunk = serializer->allocate(m_children[i].m_childShape->calculateSerializeBufferSize(),1);
- const char* structType = m_children[i].m_childShape->serialize(chunk->m_oldPtr,serializer);
- serializer->finalizeChunk(chunk,structType,BT_SHAPE_CODE,m_children[i].m_childShape);
- }
+ btChunk* chunk = serializer->allocate(m_children[i].m_childShape->calculateSerializeBufferSize(), 1);
+ const char* structType = m_children[i].m_childShape->serialize(chunk->m_oldPtr, serializer);
+ serializer->finalizeChunk(chunk, structType, BT_SHAPE_CODE, m_children[i].m_childShape);
+ }
memPtr->m_childShapeType = m_children[i].m_childShapeType;
m_children[i].m_transform.serializeFloat(memPtr->m_transform);
}
- serializer->finalizeChunk(chunk,"btCompoundShapeChildData",BT_ARRAY_CODE,chunk->m_oldPtr);
+ serializer->finalizeChunk(chunk, "btCompoundShapeChildData", BT_ARRAY_CODE, chunk->m_oldPtr);
}
return "btCompoundShapeData";
}
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btCompoundShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btCompoundShape.h
index 2cbcd1bfca..7e2d0eb817 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btCompoundShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btCompoundShape.h
@@ -27,45 +27,47 @@ subject to the following restrictions:
//class btOptimizedBvh;
struct btDbvt;
-ATTRIBUTE_ALIGNED16(struct) btCompoundShapeChild
+ATTRIBUTE_ALIGNED16(struct)
+btCompoundShapeChild
{
BT_DECLARE_ALIGNED_ALLOCATOR();
- btTransform m_transform;
- btCollisionShape* m_childShape;
- int m_childShapeType;
- btScalar m_childMargin;
- struct btDbvtNode* m_node;
+ 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 );
+ 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.
+/// 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
+ATTRIBUTE_ALIGNED16(class)
+btCompoundShape : public btCollisionShape
{
protected:
btAlignedObjectArray<btCompoundShapeChild> m_children;
- btVector3 m_localAabbMin;
- btVector3 m_localAabbMax;
+ btVector3 m_localAabbMin;
+ btVector3 m_localAabbMax;
- btDbvt* m_dynamicAabbTree;
+ btDbvt* m_dynamicAabbTree;
///increment m_updateRevision when adding/removing/replacing child shapes, so that some caches can be updated
- int m_updateRevision;
+ int m_updateRevision;
- btScalar m_collisionMargin;
+ btScalar m_collisionMargin;
- btVector3 m_localScaling;
+ btVector3 m_localScaling;
public:
BT_DECLARE_ALIGNED_ALLOCATOR();
@@ -74,17 +76,16 @@ public:
virtual ~btCompoundShape();
- void addChildShape(const btTransform& localTransform,btCollisionShape* shape);
+ void addChildShape(const btTransform& localTransform, btCollisionShape* shape);
/// Remove all children shapes that contain the specified shape
- virtual void removeChildShape(btCollisionShape* shape);
+ virtual void removeChildShape(btCollisionShape * shape);
void removeChildShapeByIndex(int childShapeindex);
-
- int getNumChildShapes() const
+ int getNumChildShapes() const
{
- return int (m_children.size());
+ return int(m_children.size());
}
btCollisionShape* getChildShape(int index)
@@ -96,18 +97,17 @@ public:
return m_children[index].m_childShape;
}
- btTransform& getChildTransform(int index)
+ btTransform& getChildTransform(int index)
{
return m_children[index].m_transform;
}
- const btTransform& getChildTransform(int index) const
+ 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);
-
+ void updateChildTransform(int childIndex, const btTransform& newChildTransform, bool shouldRecalculateLocalAabb = true);
btCompoundShapeChild* getChildList()
{
@@ -115,40 +115,40 @@ public:
}
///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;
+ 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 recalculateLocalAabb();
- virtual void setLocalScaling(const btVector3& scaling);
+ virtual void setLocalScaling(const btVector3& scaling);
- virtual const btVector3& getLocalScaling() const
+ virtual const btVector3& getLocalScaling() const
{
return m_localScaling;
}
- virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
+ virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const;
- virtual void setMargin(btScalar margin)
+ virtual void setMargin(btScalar margin)
{
m_collisionMargin = margin;
}
- virtual btScalar getMargin() const
+ virtual btScalar getMargin() const
{
return m_collisionMargin;
}
- virtual const char* getName()const
+ virtual const char* getName() const
{
return "Compound";
}
- const btDbvt* getDynamicAabbTree() const
+ const btDbvt* getDynamicAabbTree() const
{
return m_dynamicAabbTree;
}
-
- btDbvt* getDynamicAabbTree()
+
+ btDbvt* getDynamicAabbTree()
{
return m_dynamicAabbTree;
}
@@ -162,19 +162,19 @@ public:
///of the collision object by the principal transform.
void calculatePrincipalAxisTransform(const btScalar* masses, btTransform& principal, btVector3& inertia) const;
- int getUpdateRevision() const
+ int getUpdateRevision() const
{
return m_updateRevision;
}
- virtual int calculateSerializeBufferSize() 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;
-
-
+ 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
{
@@ -197,16 +197,11 @@ struct btCompoundShapeData
};
+// clang-format on
-SIMD_FORCE_INLINE int btCompoundShape::calculateSerializeBufferSize() const
+SIMD_FORCE_INLINE int btCompoundShape::calculateSerializeBufferSize() const
{
return sizeof(btCompoundShapeData);
}
-
-
-
-
-
-
-#endif //BT_COMPOUND_SHAPE_H
+#endif //BT_COMPOUND_SHAPE_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btConcaveShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btConcaveShape.cpp
index 58ff84a5b0..5d396844dd 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btConcaveShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btConcaveShape.cpp
@@ -13,15 +13,12 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btConcaveShape.h"
btConcaveShape::btConcaveShape() : m_collisionMargin(btScalar(0.))
{
-
}
btConcaveShape::~btConcaveShape()
{
-
}
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btConcaveShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btConcaveShape.h
index 2917cc5b60..716624e182 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btConcaveShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btConcaveShape.h
@@ -17,12 +17,13 @@ subject to the following restrictions:
#define BT_CONCAVE_SHAPE_H
#include "btCollisionShape.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
+#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 {
+typedef enum PHY_ScalarType
+{
PHY_FLOAT,
PHY_DOUBLE,
PHY_INTEGER,
@@ -33,30 +34,29 @@ typedef enum 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
+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 void processAllTriangles(btTriangleCallback * callback, const btVector3& aabbMin, const btVector3& aabbMax) const = 0;
- virtual btScalar getMargin() const {
+ virtual btScalar getMargin() const
+ {
return m_collisionMargin;
}
virtual void setMargin(btScalar collisionMargin)
{
m_collisionMargin = collisionMargin;
}
-
-
-
};
-#endif //BT_CONCAVE_SHAPE_H
+#endif //BT_CONCAVE_SHAPE_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btConeShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btConeShape.cpp
index 2d83c8bfba..64a6f272ca 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btConeShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btConeShape.cpp
@@ -15,11 +15,9 @@ subject to the following restrictions:
#include "btConeShape.h"
-
-
-btConeShape::btConeShape (btScalar radius,btScalar height): btConvexInternalShape (),
-m_radius (radius),
-m_height(height)
+btConeShape::btConeShape(btScalar radius, btScalar height) : btConvexInternalShape(),
+ m_radius(radius),
+ m_height(height)
{
m_shapeType = CONE_SHAPE_PROXYTYPE;
setConeUpIndex(1);
@@ -27,42 +25,40 @@ m_height(height)
m_sinAngle = (m_radius / btSqrt(m_radius * m_radius + m_height * m_height));
}
-btConeShapeZ::btConeShapeZ (btScalar radius,btScalar height):
-btConeShape(radius,height)
+btConeShapeZ::btConeShapeZ(btScalar radius, btScalar height) : btConeShape(radius, height)
{
setConeUpIndex(2);
}
-btConeShapeX::btConeShapeX (btScalar radius,btScalar height):
-btConeShape(radius,height)
+btConeShapeX::btConeShapeX(btScalar radius, btScalar height) : btConeShape(radius, height)
{
setConeUpIndex(0);
}
///choose upAxis index
-void btConeShape::setConeUpIndex(int upIndex)
+void btConeShape::setConeUpIndex(int upIndex)
{
switch (upIndex)
{
- case 0:
+ case 0:
m_coneIndices[0] = 1;
m_coneIndices[1] = 0;
m_coneIndices[2] = 2;
- break;
- case 1:
+ break;
+ case 1:
m_coneIndices[0] = 0;
m_coneIndices[1] = 1;
m_coneIndices[2] = 2;
- break;
- case 2:
+ break;
+ case 2:
m_coneIndices[0] = 0;
m_coneIndices[1] = 2;
m_coneIndices[2] = 1;
- break;
- default:
- btAssert(0);
+ break;
+ default:
+ btAssert(0);
};
-
+
m_implicitShapeDimensions[m_coneIndices[0]] = m_radius;
m_implicitShapeDimensions[m_coneIndices[1]] = m_height;
m_implicitShapeDimensions[m_coneIndices[2]] = m_radius;
@@ -70,72 +66,71 @@ void btConeShape::setConeUpIndex(int upIndex)
btVector3 btConeShape::coneLocalSupport(const btVector3& v) const
{
-
btScalar halfHeight = m_height * btScalar(0.5);
- if (v[m_coneIndices[1]] > v.length() * m_sinAngle)
- {
- btVector3 tmp;
-
- tmp[m_coneIndices[0]] = btScalar(0.);
- tmp[m_coneIndices[1]] = halfHeight;
- tmp[m_coneIndices[2]] = btScalar(0.);
- return tmp;
- }
- else {
- btScalar s = btSqrt(v[m_coneIndices[0]] * v[m_coneIndices[0]] + v[m_coneIndices[2]] * v[m_coneIndices[2]]);
- if (s > SIMD_EPSILON) {
- btScalar d = m_radius / s;
- btVector3 tmp;
- tmp[m_coneIndices[0]] = v[m_coneIndices[0]] * d;
- tmp[m_coneIndices[1]] = -halfHeight;
- tmp[m_coneIndices[2]] = v[m_coneIndices[2]] * d;
- return tmp;
- }
- else {
+ if (v[m_coneIndices[1]] > v.length() * m_sinAngle)
+ {
btVector3 tmp;
+
tmp[m_coneIndices[0]] = btScalar(0.);
- tmp[m_coneIndices[1]] = -halfHeight;
+ tmp[m_coneIndices[1]] = halfHeight;
tmp[m_coneIndices[2]] = btScalar(0.);
return tmp;
}
- }
-
+ else
+ {
+ btScalar s = btSqrt(v[m_coneIndices[0]] * v[m_coneIndices[0]] + v[m_coneIndices[2]] * v[m_coneIndices[2]]);
+ if (s > SIMD_EPSILON)
+ {
+ btScalar d = m_radius / s;
+ btVector3 tmp;
+ tmp[m_coneIndices[0]] = v[m_coneIndices[0]] * d;
+ tmp[m_coneIndices[1]] = -halfHeight;
+ tmp[m_coneIndices[2]] = v[m_coneIndices[2]] * d;
+ return tmp;
+ }
+ else
+ {
+ btVector3 tmp;
+ tmp[m_coneIndices[0]] = btScalar(0.);
+ tmp[m_coneIndices[1]] = -halfHeight;
+ tmp[m_coneIndices[2]] = btScalar(0.);
+ return tmp;
+ }
+ }
}
-btVector3 btConeShape::localGetSupportingVertexWithoutMargin(const btVector3& vec) const
+btVector3 btConeShape::localGetSupportingVertexWithoutMargin(const btVector3& vec) const
{
- return coneLocalSupport(vec);
+ return coneLocalSupport(vec);
}
-void btConeShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const
+void btConeShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const
{
- for (int i=0;i<numVectors;i++)
+ for (int i = 0; i < numVectors; i++)
{
const btVector3& vec = vectors[i];
supportVerticesOut[i] = coneLocalSupport(vec);
}
}
-
-btVector3 btConeShape::localGetSupportingVertex(const btVector3& vec) const
+btVector3 btConeShape::localGetSupportingVertex(const btVector3& vec) const
{
btVector3 supVertex = coneLocalSupport(vec);
- if ( getMargin()!=btScalar(0.) )
+ if (getMargin() != btScalar(0.))
{
btVector3 vecnorm = vec;
- if (vecnorm .length2() < (SIMD_EPSILON*SIMD_EPSILON))
+ if (vecnorm.length2() < (SIMD_EPSILON * SIMD_EPSILON))
{
- vecnorm.setValue(btScalar(-1.),btScalar(-1.),btScalar(-1.));
- }
+ vecnorm.setValue(btScalar(-1.), btScalar(-1.), btScalar(-1.));
+ }
vecnorm.normalize();
- supVertex+= getMargin() * vecnorm;
+ supVertex += getMargin() * vecnorm;
}
return supVertex;
}
-
-void btConeShape::setLocalScaling(const btVector3& scaling)
+void btConeShape::setLocalScaling(const btVector3& scaling)
{
int axis = m_coneIndices[1];
int r1 = m_coneIndices[0];
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btConeShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btConeShape.h
index 3b44e3f272..49f26bc4e5 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btConeShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btConeShape.h
@@ -17,31 +17,30 @@ subject to the following restrictions:
#define BT_CONE_MINKOWSKI_H
#include "btConvexInternalShape.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
+#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
+ATTRIBUTE_ALIGNED16(class)
+btConeShape : public btConvexInternalShape
{
-
btScalar m_sinAngle;
btScalar m_radius;
btScalar m_height;
- int m_coneIndices[3];
+ 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;}
+ 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)
{
@@ -52,124 +51,115 @@ public:
m_height = height;
}
-
- virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const
+ virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const
{
btTransform identity;
identity.setIdentity();
- btVector3 aabbMin,aabbMax;
- getAabb(identity,aabbMin,aabbMax);
+ btVector3 aabbMin, aabbMax;
+ getAabb(identity, aabbMin, aabbMax);
- btVector3 halfExtents = (aabbMax-aabbMin)*btScalar(0.5);
+ 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;
+ 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 = scaledmass * (btVector3(y2 + z2, x2 + z2, x2 + y2));
-// inertia.x() = scaledmass * (y2+z2);
-// inertia.y() = scaledmass * (x2+z2);
-// inertia.z() = scaledmass * (x2+y2);
+ // inertia.x() = scaledmass * (y2+z2);
+ // inertia.y() = scaledmass * (x2+z2);
+ // inertia.z() = scaledmass * (x2+y2);
}
+ virtual const char* getName() const
+ {
+ return "Cone";
+ }
- 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
+ ///choose upAxis index
+ void setConeUpIndex(int upIndex);
+
+ int getConeUpIndex() const
{
- return btVector3 (0,1,0);
+ return m_coneIndices[1];
}
- 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;
-
+ 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);
+public:
+ btConeShapeX(btScalar radius, btScalar height);
- virtual btVector3 getAnisotropicRollingFrictionDirection() const
+ virtual btVector3 getAnisotropicRollingFrictionDirection() const
{
- return btVector3 (1,0,0);
+ return btVector3(1, 0, 0);
}
//debugging
- virtual const char* getName()const
+ 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);
+ btConeShapeZ(btScalar radius, btScalar height);
- virtual btVector3 getAnisotropicRollingFrictionDirection() const
+ virtual btVector3 getAnisotropicRollingFrictionDirection() const
{
- return btVector3 (0,0,1);
+ return btVector3(0, 0, 1);
}
//debugging
- virtual const char* getName()const
+ virtual const char* getName() const
{
return "ConeZ";
}
-
-
};
///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
-struct btConeShapeData
+struct btConeShapeData
{
- btConvexInternalShapeData m_convexInternalShapeData;
-
- int m_upIndex;
-
- char m_padding[4];
+ btConvexInternalShapeData m_convexInternalShapeData;
+
+ int m_upIndex;
+
+ char m_padding[4];
};
-SIMD_FORCE_INLINE int btConeShape::calculateSerializeBufferSize() const
+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
+SIMD_FORCE_INLINE const char* btConeShape::serialize(void* dataBuffer, btSerializer* serializer) const
{
- btConeShapeData* shapeData = (btConeShapeData*) dataBuffer;
+ btConeShapeData* shapeData = (btConeShapeData*)dataBuffer;
- btConvexInternalShape::serialize(&shapeData->m_convexInternalShapeData,serializer);
+ btConvexInternalShape::serialize(&shapeData->m_convexInternalShapeData, serializer);
shapeData->m_upIndex = m_coneIndices[1];
@@ -182,5 +172,4 @@ SIMD_FORCE_INLINE const char* btConeShape::serialize(void* dataBuffer, btSeriali
return "btConeShapeData";
}
-#endif //BT_CONE_MINKOWSKI_H
-
+#endif //BT_CONE_MINKOWSKI_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvex2dShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvex2dShape.cpp
index 10ea3e981a..7d3d1d362f 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvex2dShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvex2dShape.cpp
@@ -15,54 +15,48 @@ subject to the following restrictions:
#include "btConvex2dShape.h"
-btConvex2dShape::btConvex2dShape( btConvexShape* convexChildShape):
-btConvexShape (), m_childConvexShape(convexChildShape)
+btConvex2dShape::btConvex2dShape(btConvexShape* convexChildShape) : btConvexShape(), m_childConvexShape(convexChildShape)
{
m_shapeType = CONVEX_2D_SHAPE_PROXYTYPE;
}
-
+
btConvex2dShape::~btConvex2dShape()
{
}
-
-
-btVector3 btConvex2dShape::localGetSupportingVertexWithoutMargin(const btVector3& vec)const
+btVector3 btConvex2dShape::localGetSupportingVertexWithoutMargin(const btVector3& vec) const
{
return m_childConvexShape->localGetSupportingVertexWithoutMargin(vec);
}
-void btConvex2dShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const
+void btConvex2dShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const
{
- m_childConvexShape->batchedUnitVectorGetSupportingVertexWithoutMargin(vectors,supportVerticesOut,numVectors);
+ m_childConvexShape->batchedUnitVectorGetSupportingVertexWithoutMargin(vectors, supportVerticesOut, numVectors);
}
-
-btVector3 btConvex2dShape::localGetSupportingVertex(const btVector3& vec)const
+btVector3 btConvex2dShape::localGetSupportingVertex(const btVector3& vec) const
{
return m_childConvexShape->localGetSupportingVertex(vec);
}
-
-void btConvex2dShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const
+void btConvex2dShape::calculateLocalInertia(btScalar mass, btVector3& inertia) const
{
///this linear upscaling is not realistic, but we don't deal with large mass ratios...
- m_childConvexShape->calculateLocalInertia(mass,inertia);
+ m_childConvexShape->calculateLocalInertia(mass, inertia);
}
-
- ///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version
-void btConvex2dShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
+///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version
+void btConvex2dShape::getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
{
- m_childConvexShape->getAabb(t,aabbMin,aabbMax);
+ m_childConvexShape->getAabb(t, aabbMin, aabbMax);
}
-void btConvex2dShape::getAabbSlow(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
+void btConvex2dShape::getAabbSlow(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
{
- m_childConvexShape->getAabbSlow(t,aabbMin,aabbMax);
+ m_childConvexShape->getAabbSlow(t, aabbMin, aabbMax);
}
-void btConvex2dShape::setLocalScaling(const btVector3& scaling)
+void btConvex2dShape::setLocalScaling(const btVector3& scaling)
{
m_childConvexShape->setLocalScaling(scaling);
}
@@ -72,21 +66,21 @@ const btVector3& btConvex2dShape::getLocalScaling() const
return m_childConvexShape->getLocalScaling();
}
-void btConvex2dShape::setMargin(btScalar margin)
+void btConvex2dShape::setMargin(btScalar margin)
{
m_childConvexShape->setMargin(margin);
}
-btScalar btConvex2dShape::getMargin() const
+btScalar btConvex2dShape::getMargin() const
{
return m_childConvexShape->getMargin();
}
-int btConvex2dShape::getNumPreferredPenetrationDirections() const
+int btConvex2dShape::getNumPreferredPenetrationDirections() const
{
return m_childConvexShape->getNumPreferredPenetrationDirections();
}
-
-void btConvex2dShape::getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const
+
+void btConvex2dShape::getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const
{
- m_childConvexShape->getPreferredPenetrationDirection(index,penetrationVector);
+ m_childConvexShape->getPreferredPenetrationDirection(index, penetrationVector);
}
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvex2dShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvex2dShape.h
index bbd1caf42f..cd4f1ef7b8 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvex2dShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvex2dShape.h
@@ -17,66 +17,61 @@ subject to the following restrictions:
#define BT_CONVEX_2D_SHAPE_H
#include "BulletCollision/CollisionShapes/btConvexShape.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
+#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
+ATTRIBUTE_ALIGNED16(class)
+btConvex2dShape : public btConvexShape
{
- btConvexShape* m_childConvexShape;
+ btConvexShape* m_childConvexShape;
- public:
-
+public:
BT_DECLARE_ALIGNED_ALLOCATOR();
-
- btConvex2dShape( btConvexShape* convexChildShape);
-
+
+ btConvex2dShape(btConvexShape * convexChildShape);
+
virtual ~btConvex2dShape();
-
- virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const;
- virtual btVector3 localGetSupportingVertex(const btVector3& vec)const;
+ 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 batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const;
- virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
+ virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const;
- btConvexShape* getChildShape()
+ btConvexShape* getChildShape()
{
return m_childConvexShape;
}
- const btConvexShape* getChildShape() const
+ const btConvexShape* getChildShape() const
{
return m_childConvexShape;
}
- virtual const char* getName()const
+ 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;
+ void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const;
- virtual void setLocalScaling(const btVector3& scaling) ;
- virtual const btVector3& getLocalScaling() const ;
+ virtual void getAabbSlow(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const;
- virtual void setMargin(btScalar margin);
- virtual btScalar getMargin() const;
+ virtual void setLocalScaling(const btVector3& scaling);
+ virtual const btVector3& getLocalScaling() const;
- virtual int getNumPreferredPenetrationDirections() const;
-
- virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) 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
+#endif //BT_CONVEX_2D_SHAPE_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexHullShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexHullShape.cpp
index a7a9598406..703de45922 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexHullShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexHullShape.cpp
@@ -13,7 +13,7 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-#if defined (_WIN32) || defined (__i386__)
+#if defined(_WIN32) || defined(__i386__)
#define BT_USE_SSE_IN_API
#endif
@@ -25,14 +25,14 @@ subject to the following restrictions:
#include "btConvexPolyhedron.h"
#include "LinearMath/btConvexHullComputer.h"
-btConvexHullShape ::btConvexHullShape (const btScalar* points,int numPoints,int stride) : btPolyhedralConvexAabbCachingShape ()
+btConvexHullShape ::btConvexHullShape(const btScalar* points, int numPoints, int stride) : btPolyhedralConvexAabbCachingShape()
{
m_shapeType = CONVEX_HULL_SHAPE_PROXYTYPE;
m_unscaledPoints.resize(numPoints);
unsigned char* pointsAddress = (unsigned char*)points;
- for (int i=0;i<numPoints;i++)
+ for (int i = 0; i < numPoints; i++)
{
btScalar* point = (btScalar*)pointsAddress;
m_unscaledPoints[i] = btVector3(point[0], point[1], point[2]);
@@ -40,11 +40,8 @@ btConvexHullShape ::btConvexHullShape (const btScalar* points,int numPoints,int
}
recalcLocalAabb();
-
}
-
-
void btConvexHullShape::setLocalScaling(const btVector3& scaling)
{
m_localScaling = scaling;
@@ -56,90 +53,81 @@ void btConvexHullShape::addPoint(const btVector3& point, bool recalculateLocalAa
m_unscaledPoints.push_back(point);
if (recalculateLocalAabb)
recalcLocalAabb();
-
}
-btVector3 btConvexHullShape::localGetSupportingVertexWithoutMargin(const btVector3& vec)const
+btVector3 btConvexHullShape::localGetSupportingVertexWithoutMargin(const btVector3& vec) const
{
- btVector3 supVec(btScalar(0.),btScalar(0.),btScalar(0.));
+ btVector3 supVec(btScalar(0.), btScalar(0.), btScalar(0.));
btScalar maxDot = btScalar(-BT_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 < m_unscaledPoints.size() )
- {
- btVector3 scaled = vec * m_localScaling;
- int index = (int) scaled.maxDot( &m_unscaledPoints[0], m_unscaledPoints.size(), maxDot); // FIXME: may violate encapsulation of m_unscaledPoints
- return m_unscaledPoints[index] * m_localScaling;
- }
+ // Here we take advantage of dot(a, b*c) = dot(a*b, c). Note: This is true mathematically, but not numerically.
+ if (0 < m_unscaledPoints.size())
+ {
+ btVector3 scaled = vec * m_localScaling;
+ int index = (int)scaled.maxDot(&m_unscaledPoints[0], m_unscaledPoints.size(), maxDot); // FIXME: may violate encapsulation of m_unscaledPoints
+ return m_unscaledPoints[index] * m_localScaling;
+ }
- return supVec;
+ return supVec;
}
-void btConvexHullShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const
+void btConvexHullShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const
{
btScalar newDot;
//use 'w' component of supportVerticesOut?
{
- for (int i=0;i<numVectors;i++)
+ for (int i = 0; i < numVectors; i++)
{
supportVerticesOut[i][3] = btScalar(-BT_LARGE_FLOAT);
}
}
- for (int j=0;j<numVectors;j++)
- {
- btVector3 vec = vectors[j] * m_localScaling; // dot(a*b,c) = dot(a,b*c)
- if( 0 < m_unscaledPoints.size() )
- {
- int i = (int) vec.maxDot( &m_unscaledPoints[0], m_unscaledPoints.size(), newDot);
- supportVerticesOut[j] = getScaledPoint(i);
- supportVerticesOut[j][3] = newDot;
- }
- else
- supportVerticesOut[j][3] = -BT_LARGE_FLOAT;
- }
-
-
-
+ for (int j = 0; j < numVectors; j++)
+ {
+ btVector3 vec = vectors[j] * m_localScaling; // dot(a*b,c) = dot(a,b*c)
+ if (0 < m_unscaledPoints.size())
+ {
+ int i = (int)vec.maxDot(&m_unscaledPoints[0], m_unscaledPoints.size(), newDot);
+ supportVerticesOut[j] = getScaledPoint(i);
+ supportVerticesOut[j][3] = newDot;
+ }
+ else
+ supportVerticesOut[j][3] = -BT_LARGE_FLOAT;
+ }
}
-
-
-btVector3 btConvexHullShape::localGetSupportingVertex(const btVector3& vec)const
+btVector3 btConvexHullShape::localGetSupportingVertex(const btVector3& vec) const
{
btVector3 supVertex = localGetSupportingVertexWithoutMargin(vec);
- if ( getMargin()!=btScalar(0.) )
+ if (getMargin() != btScalar(0.))
{
btVector3 vecnorm = vec;
- if (vecnorm .length2() < (SIMD_EPSILON*SIMD_EPSILON))
+ if (vecnorm.length2() < (SIMD_EPSILON * SIMD_EPSILON))
{
- vecnorm.setValue(btScalar(-1.),btScalar(-1.),btScalar(-1.));
- }
+ vecnorm.setValue(btScalar(-1.), btScalar(-1.), btScalar(-1.));
+ }
vecnorm.normalize();
- supVertex+= getMargin() * vecnorm;
+ supVertex += getMargin() * vecnorm;
}
return supVertex;
}
-
void btConvexHullShape::optimizeConvexHull()
{
btConvexHullComputer conv;
- conv.compute(&m_unscaledPoints[0].getX(), sizeof(btVector3),m_unscaledPoints.size(),0.f,0.f);
+ conv.compute(&m_unscaledPoints[0].getX(), sizeof(btVector3), m_unscaledPoints.size(), 0.f, 0.f);
int numVerts = conv.vertices.size();
m_unscaledPoints.resize(0);
- for (int i=0;i<numVerts;i++)
- {
- m_unscaledPoints.push_back(conv.vertices[i]);
- }
+ for (int i = 0; i < numVerts; i++)
+ {
+ m_unscaledPoints.push_back(conv.vertices[i]);
+ }
}
-
-
//currently just for debugging (drawing), perhaps future support for algebraic continuous collision detection
//Please note that you can debug-draw btConvexHullShape with the Raytracer Demo
-int btConvexHullShape::getNumVertices() const
+int btConvexHullShape::getNumVertices() const
{
return m_unscaledPoints.size();
}
@@ -149,67 +137,65 @@ int btConvexHullShape::getNumEdges() const
return m_unscaledPoints.size();
}
-void btConvexHullShape::getEdge(int i,btVector3& pa,btVector3& pb) const
+void btConvexHullShape::getEdge(int i, btVector3& pa, btVector3& pb) const
{
-
- int index0 = i%m_unscaledPoints.size();
- int index1 = (i+1)%m_unscaledPoints.size();
+ int index0 = i % m_unscaledPoints.size();
+ int index1 = (i + 1) % m_unscaledPoints.size();
pa = getScaledPoint(index0);
pb = getScaledPoint(index1);
}
-void btConvexHullShape::getVertex(int i,btVector3& vtx) const
+void btConvexHullShape::getVertex(int i, btVector3& vtx) const
{
vtx = getScaledPoint(i);
}
-int btConvexHullShape::getNumPlanes() const
+int btConvexHullShape::getNumPlanes() const
{
return 0;
}
-void btConvexHullShape::getPlane(btVector3& ,btVector3& ,int ) const
+void btConvexHullShape::getPlane(btVector3&, btVector3&, int) const
{
-
btAssert(0);
}
//not yet
-bool btConvexHullShape::isInside(const btVector3& ,btScalar ) const
+bool btConvexHullShape::isInside(const btVector3&, btScalar) const
{
btAssert(0);
return false;
}
///fills the dataBuffer and returns the struct name (and 0 on failure)
-const char* btConvexHullShape::serialize(void* dataBuffer, btSerializer* serializer) const
+const char* btConvexHullShape::serialize(void* dataBuffer, btSerializer* serializer) const
{
//int szc = sizeof(btConvexHullShapeData);
- btConvexHullShapeData* shapeData = (btConvexHullShapeData*) dataBuffer;
+ btConvexHullShapeData* shapeData = (btConvexHullShapeData*)dataBuffer;
btConvexInternalShape::serialize(&shapeData->m_convexInternalShapeData, serializer);
int numElem = m_unscaledPoints.size();
shapeData->m_numUnscaledPoints = numElem;
#ifdef BT_USE_DOUBLE_PRECISION
shapeData->m_unscaledPointsFloatPtr = 0;
- shapeData->m_unscaledPointsDoublePtr = numElem ? (btVector3Data*)serializer->getUniquePointer((void*)&m_unscaledPoints[0]): 0;
+ shapeData->m_unscaledPointsDoublePtr = numElem ? (btVector3Data*)serializer->getUniquePointer((void*)&m_unscaledPoints[0]) : 0;
#else
- shapeData->m_unscaledPointsFloatPtr = numElem ? (btVector3Data*)serializer->getUniquePointer((void*)&m_unscaledPoints[0]): 0;
+ shapeData->m_unscaledPointsFloatPtr = numElem ? (btVector3Data*)serializer->getUniquePointer((void*)&m_unscaledPoints[0]) : 0;
shapeData->m_unscaledPointsDoublePtr = 0;
#endif
-
+
if (numElem)
{
int sz = sizeof(btVector3Data);
- // int sz2 = sizeof(btVector3DoubleData);
- // int sz3 = sizeof(btVector3FloatData);
- btChunk* chunk = serializer->allocate(sz,numElem);
+ // int sz2 = sizeof(btVector3DoubleData);
+ // int sz3 = sizeof(btVector3FloatData);
+ btChunk* chunk = serializer->allocate(sz, numElem);
btVector3Data* memPtr = (btVector3Data*)chunk->m_oldPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
m_unscaledPoints[i].serialize(*memPtr);
}
- serializer->finalizeChunk(chunk,btVector3DataName,BT_ARRAY_CODE,(void*)&m_unscaledPoints[0]);
+ serializer->finalizeChunk(chunk, btVector3DataName, BT_ARRAY_CODE, (void*)&m_unscaledPoints[0]);
}
// Fill padding with zeros to appease msan.
@@ -218,45 +204,41 @@ const char* btConvexHullShape::serialize(void* dataBuffer, btSerializer* seriali
return "btConvexHullShapeData";
}
-void btConvexHullShape::project(const btTransform& trans, const btVector3& dir, btScalar& minProj, btScalar& maxProj, btVector3& witnesPtMin,btVector3& witnesPtMax) const
+void btConvexHullShape::project(const btTransform& trans, const btVector3& dir, btScalar& minProj, btScalar& maxProj, btVector3& witnesPtMin, btVector3& witnesPtMax) const
{
#if 1
minProj = FLT_MAX;
maxProj = -FLT_MAX;
int numVerts = m_unscaledPoints.size();
- for(int i=0;i<numVerts;i++)
+ for (int i = 0; i < numVerts; i++)
{
btVector3 vtx = m_unscaledPoints[i] * m_localScaling;
btVector3 pt = trans * vtx;
btScalar dp = pt.dot(dir);
- if(dp < minProj)
+ if (dp < minProj)
{
minProj = dp;
witnesPtMin = pt;
}
- if(dp > maxProj)
+ if (dp > maxProj)
{
maxProj = dp;
- witnesPtMax=pt;
+ witnesPtMax = pt;
}
}
#else
- btVector3 localAxis = dir*trans.getBasis();
- witnesPtMin = trans(localGetSupportingVertex(localAxis));
+ btVector3 localAxis = dir * trans.getBasis();
+ witnesPtMin = trans(localGetSupportingVertex(localAxis));
witnesPtMax = trans(localGetSupportingVertex(-localAxis));
minProj = witnesPtMin.dot(dir);
maxProj = witnesPtMax.dot(dir);
#endif
- if(minProj>maxProj)
+ if (minProj > maxProj)
{
- btSwap(minProj,maxProj);
- btSwap(witnesPtMin,witnesPtMax);
+ btSwap(minProj, maxProj);
+ btSwap(witnesPtMin, witnesPtMax);
}
-
-
}
-
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexHullShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexHullShape.h
index 0c12aeef15..96136d7dd7 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexHullShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexHullShape.h
@@ -17,28 +17,26 @@ subject to the following restrictions:
#define BT_CONVEX_HULL_SHAPE_H
#include "btPolyhedralConvexShape.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
+#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
+ATTRIBUTE_ALIGNED16(class)
+btConvexHullShape : public btPolyhedralConvexAabbCachingShape
{
- btAlignedObjectArray<btVector3> m_unscaledPoints;
+ btAlignedObjectArray<btVector3> 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));
+ 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];
@@ -55,48 +53,46 @@ public:
return getUnscaledPoints();
}
- void optimizeConvexHull();
-
- SIMD_FORCE_INLINE btVector3 getScaledPoint(int i) const
+ void optimizeConvexHull();
+
+ SIMD_FORCE_INLINE btVector3 getScaledPoint(int i) const
{
return m_unscaledPoints[i] * m_localScaling;
}
- SIMD_FORCE_INLINE int getNumPoints() const
+ 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;
+ 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 const char* getName() const { return "Convex"; }
-
- virtual int getNumVertices() const;
+ 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 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 void setLocalScaling(const btVector3& scaling);
- virtual int calculateSerializeBufferSize() 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;
-
+ 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
{
@@ -110,12 +106,11 @@ struct btConvexHullShapeData
};
+// clang-format on
-SIMD_FORCE_INLINE int btConvexHullShape::calculateSerializeBufferSize() const
+SIMD_FORCE_INLINE int btConvexHullShape::calculateSerializeBufferSize() const
{
return sizeof(btConvexHullShapeData);
}
-
-#endif //BT_CONVEX_HULL_SHAPE_H
-
+#endif //BT_CONVEX_HULL_SHAPE_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexInternalShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexInternalShape.cpp
index 083d60b1b1..4d598b1aa2 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexInternalShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexInternalShape.cpp
@@ -13,139 +13,125 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btConvexInternalShape.h"
-
-
btConvexInternalShape::btConvexInternalShape()
-: m_localScaling(btScalar(1.),btScalar(1.),btScalar(1.)),
-m_collisionMargin(CONVEX_DISTANCE_MARGIN)
+ : m_localScaling(btScalar(1.), btScalar(1.), btScalar(1.)),
+ m_collisionMargin(CONVEX_DISTANCE_MARGIN)
{
}
-
-void btConvexInternalShape::setLocalScaling(const btVector3& scaling)
+void btConvexInternalShape::setLocalScaling(const btVector3& scaling)
{
m_localScaling = scaling.absolute();
}
-
-
-void btConvexInternalShape::getAabbSlow(const btTransform& trans,btVector3&minAabb,btVector3&maxAabb) const
+void btConvexInternalShape::getAabbSlow(const btTransform& trans, btVector3& minAabb, btVector3& maxAabb) const
{
#ifndef __SPU__
//use localGetSupportingVertexWithoutMargin?
btScalar margin = getMargin();
- for (int i=0;i<3;i++)
+ for (int i = 0; i < 3; i++)
{
- btVector3 vec(btScalar(0.),btScalar(0.),btScalar(0.));
+ btVector3 vec(btScalar(0.), btScalar(0.), btScalar(0.));
vec[i] = btScalar(1.);
- btVector3 sv = localGetSupportingVertex(vec*trans.getBasis());
+ btVector3 sv = localGetSupportingVertex(vec * trans.getBasis());
btVector3 tmp = trans(sv);
- maxAabb[i] = tmp[i]+margin;
+ maxAabb[i] = tmp[i] + margin;
vec[i] = btScalar(-1.);
- tmp = trans(localGetSupportingVertex(vec*trans.getBasis()));
- minAabb[i] = tmp[i]-margin;
+ tmp = trans(localGetSupportingVertex(vec * trans.getBasis()));
+ minAabb[i] = tmp[i] - margin;
}
#endif
}
-
-
-btVector3 btConvexInternalShape::localGetSupportingVertex(const btVector3& vec)const
+btVector3 btConvexInternalShape::localGetSupportingVertex(const btVector3& vec) const
{
#ifndef __SPU__
- btVector3 supVertex = localGetSupportingVertexWithoutMargin(vec);
+ btVector3 supVertex = localGetSupportingVertexWithoutMargin(vec);
- if ( getMargin()!=btScalar(0.) )
+ if (getMargin() != btScalar(0.))
{
btVector3 vecnorm = vec;
- if (vecnorm .length2() < (SIMD_EPSILON*SIMD_EPSILON))
+ if (vecnorm.length2() < (SIMD_EPSILON * SIMD_EPSILON))
{
- vecnorm.setValue(btScalar(-1.),btScalar(-1.),btScalar(-1.));
- }
+ vecnorm.setValue(btScalar(-1.), btScalar(-1.), btScalar(-1.));
+ }
vecnorm.normalize();
- supVertex+= getMargin() * vecnorm;
+ supVertex += getMargin() * vecnorm;
}
return supVertex;
#else
btAssert(0);
- return btVector3(0,0,0);
-#endif //__SPU__
-
- }
-
+ return btVector3(0, 0, 0);
+#endif //__SPU__
+}
btConvexInternalAabbCachingShape::btConvexInternalAabbCachingShape()
- : btConvexInternalShape(),
-m_localAabbMin(1,1,1),
-m_localAabbMax(-1,-1,-1),
-m_isLocalAabbValid(false)
+ : btConvexInternalShape(),
+ m_localAabbMin(1, 1, 1),
+ m_localAabbMax(-1, -1, -1),
+ m_isLocalAabbValid(false)
{
}
-
-void btConvexInternalAabbCachingShape::getAabb(const btTransform& trans,btVector3& aabbMin,btVector3& aabbMax) const
+void btConvexInternalAabbCachingShape::getAabb(const btTransform& trans, btVector3& aabbMin, btVector3& aabbMax) const
{
- getNonvirtualAabb(trans,aabbMin,aabbMax,getMargin());
+ getNonvirtualAabb(trans, aabbMin, aabbMax, getMargin());
}
-void btConvexInternalAabbCachingShape::setLocalScaling(const btVector3& scaling)
+void btConvexInternalAabbCachingShape::setLocalScaling(const btVector3& scaling)
{
btConvexInternalShape::setLocalScaling(scaling);
recalcLocalAabb();
}
-
-void btConvexInternalAabbCachingShape::recalcLocalAabb()
+void btConvexInternalAabbCachingShape::recalcLocalAabb()
{
m_isLocalAabbValid = true;
-
- #if 1
+
+#if 1
static const btVector3 _directions[] =
- {
- btVector3( 1., 0., 0.),
- btVector3( 0., 1., 0.),
- btVector3( 0., 0., 1.),
- btVector3( -1., 0., 0.),
- btVector3( 0., -1., 0.),
- btVector3( 0., 0., -1.)
- };
-
+ {
+ btVector3(1., 0., 0.),
+ btVector3(0., 1., 0.),
+ btVector3(0., 0., 1.),
+ btVector3(-1., 0., 0.),
+ btVector3(0., -1., 0.),
+ btVector3(0., 0., -1.)};
+
btVector3 _supporting[] =
- {
- btVector3( 0., 0., 0.),
- btVector3( 0., 0., 0.),
- btVector3( 0., 0., 0.),
- btVector3( 0., 0., 0.),
- btVector3( 0., 0., 0.),
- btVector3( 0., 0., 0.)
- };
-
+ {
+ btVector3(0., 0., 0.),
+ btVector3(0., 0., 0.),
+ btVector3(0., 0., 0.),
+ btVector3(0., 0., 0.),
+ btVector3(0., 0., 0.),
+ btVector3(0., 0., 0.)};
+
batchedUnitVectorGetSupportingVertexWithoutMargin(_directions, _supporting, 6);
-
- for ( int i = 0; i < 3; ++i )
+
+ for (int i = 0; i < 3; ++i)
{
m_localAabbMax[i] = _supporting[i][i] + m_collisionMargin;
m_localAabbMin[i] = _supporting[i + 3][i] - m_collisionMargin;
}
-
- #else
- for (int i=0;i<3;i++)
+#else
+
+ for (int i = 0; i < 3; i++)
{
- btVector3 vec(btScalar(0.),btScalar(0.),btScalar(0.));
+ btVector3 vec(btScalar(0.), btScalar(0.), btScalar(0.));
vec[i] = btScalar(1.);
btVector3 tmp = localGetSupportingVertex(vec);
- m_localAabbMax[i] = tmp[i]+m_collisionMargin;
+ m_localAabbMax[i] = tmp[i] + m_collisionMargin;
vec[i] = btScalar(-1.);
tmp = localGetSupportingVertex(vec);
- m_localAabbMin[i] = tmp[i]-m_collisionMargin;
+ m_localAabbMin[i] = tmp[i] - m_collisionMargin;
}
- #endif
+#endif
}
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexInternalShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexInternalShape.h
index 1213b82fbe..a28c57de4b 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexInternalShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexInternalShape.h
@@ -19,39 +19,35 @@ subject to the following restrictions:
#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),
+///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
+ATTRIBUTE_ALIGNED16(class)
+btConvexInternalShape : public btConvexShape
{
-
- protected:
-
+protected:
//local scaling. collisionMargin is not scaled !
- btVector3 m_localScaling;
+ btVector3 m_localScaling;
+
+ btVector3 m_implicitShapeDimensions;
- btVector3 m_implicitShapeDimensions;
-
- btScalar m_collisionMargin;
+ btScalar m_collisionMargin;
- btScalar m_padding;
+ btScalar m_padding;
btConvexInternalShape();
public:
-
BT_DECLARE_ALIGNED_ALLOCATOR();
virtual ~btConvexInternalShape()
{
-
}
- virtual btVector3 localGetSupportingVertex(const btVector3& vec)const;
+ virtual btVector3 localGetSupportingVertex(const btVector3& vec) const;
const btVector3& getImplicitShapeDimensions() const
{
@@ -62,110 +58,102 @@ public:
///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)
+ void setImplicitShapeDimensions(const btVector3& dimensions)
{
m_implicitShapeDimensions = dimensions;
}
- void setSafeMargin(btScalar minDimension, btScalar defaultMarginMultiplier = 0.1f)
+ void setSafeMargin(btScalar minDimension, btScalar defaultMarginMultiplier = 0.1f)
{
- btScalar safeMargin = defaultMarginMultiplier*minDimension;
+ btScalar safeMargin = defaultMarginMultiplier * minDimension;
if (safeMargin < getMargin())
{
setMargin(safeMargin);
}
}
- void setSafeMargin(const btVector3& halfExtents, btScalar defaultMarginMultiplier = 0.1f)
+ 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()];
+ 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
+ void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
{
- getAabbSlow(t,aabbMin,aabbMax);
+ getAabbSlow(t, aabbMin, aabbMax);
}
+ virtual void getAabbSlow(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 setLocalScaling(const btVector3& scaling);
+ virtual const btVector3& getLocalScaling() const
{
return m_localScaling;
}
- const btVector3& getLocalScalingNV() const
+ const btVector3& getLocalScalingNV() const
{
return m_localScaling;
}
- virtual void setMargin(btScalar margin)
+ virtual void setMargin(btScalar margin)
{
m_collisionMargin = margin;
}
- virtual btScalar getMargin() const
+ virtual btScalar getMargin() const
{
return m_collisionMargin;
}
- btScalar getMarginNV() const
+ btScalar getMarginNV() const
{
return m_collisionMargin;
}
- virtual int getNumPreferredPenetrationDirections() const
+ virtual int getNumPreferredPenetrationDirections() const
{
return 0;
}
-
- virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const
+
+ virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const
{
(void)penetrationVector;
(void)index;
btAssert(0);
}
- virtual int calculateSerializeBufferSize() 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;
-
-
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
};
///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
-struct btConvexInternalShapeData
+struct btConvexInternalShapeData
{
- btCollisionShapeData m_collisionShapeData;
+ btCollisionShapeData m_collisionShapeData;
- btVector3FloatData m_localScaling;
+ btVector3FloatData m_localScaling;
- btVector3FloatData m_implicitShapeDimensions;
-
- float m_collisionMargin;
+ btVector3FloatData m_implicitShapeDimensions;
- int m_padding;
+ float m_collisionMargin;
+ int m_padding;
};
-
-
-SIMD_FORCE_INLINE int btConvexInternalShape::calculateSerializeBufferSize() const
+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
+SIMD_FORCE_INLINE const char* btConvexInternalShape::serialize(void* dataBuffer, btSerializer* serializer) const
{
- btConvexInternalShapeData* shapeData = (btConvexInternalShapeData*) dataBuffer;
+ btConvexInternalShapeData* shapeData = (btConvexInternalShapeData*)dataBuffer;
btCollisionShape::serialize(&shapeData->m_collisionShapeData, serializer);
m_implicitShapeDimensions.serializeFloat(shapeData->m_implicitShapeDimensions);
@@ -178,50 +166,43 @@ SIMD_FORCE_INLINE const char* btConvexInternalShape::serialize(void* dataBuffer,
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;
-
+ btVector3 m_localAabbMin;
+ btVector3 m_localAabbMax;
+ bool m_isLocalAabbValid;
+
protected:
-
btConvexInternalAabbCachingShape();
-
- void setCachedLocalAabb (const btVector3& aabbMin, const btVector3& aabbMax)
+
+ 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
+ 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
+ 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);
+ 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;
+public:
+ virtual void setLocalScaling(const btVector3& scaling);
- void recalcLocalAabb();
+ virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const;
+ void recalcLocalAabb();
};
-#endif //BT_CONVEX_INTERNAL_SHAPE_H
+#endif //BT_CONVEX_INTERNAL_SHAPE_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexPointCloudShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexPointCloudShape.cpp
index ad1d1bf78f..f00a440fa3 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexPointCloudShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexPointCloudShape.cpp
@@ -25,81 +25,73 @@ void btConvexPointCloudShape::setLocalScaling(const btVector3& scaling)
}
#ifndef __SPU__
-btVector3 btConvexPointCloudShape::localGetSupportingVertexWithoutMargin(const btVector3& vec0)const
+btVector3 btConvexPointCloudShape::localGetSupportingVertexWithoutMargin(const btVector3& vec0) const
{
- btVector3 supVec(btScalar(0.),btScalar(0.),btScalar(0.));
+ btVector3 supVec(btScalar(0.), btScalar(0.), btScalar(0.));
btScalar maxDot = btScalar(-BT_LARGE_FLOAT);
btVector3 vec = vec0;
btScalar lenSqr = vec.length2();
if (lenSqr < btScalar(0.0001))
{
- vec.setValue(1,0,0);
- } else
+ vec.setValue(1, 0, 0);
+ }
+ else
{
- btScalar rlen = btScalar(1.) / btSqrt(lenSqr );
+ btScalar rlen = btScalar(1.) / btSqrt(lenSqr);
vec *= rlen;
}
-
- if( m_numPoints > 0 )
- {
- // Here we take advantage of dot(a*b, c) = dot( a, b*c) to do less work. Note this transformation is true mathematically, not numerically.
- // btVector3 scaled = vec * m_localScaling;
- int index = (int) vec.maxDot( &m_unscaledPoints[0], m_numPoints, maxDot); //FIXME: may violate encapsulation of m_unscaledPoints
- return getScaledPoint(index);
- }
+
+ if (m_numPoints > 0)
+ {
+ // Here we take advantage of dot(a*b, c) = dot( a, b*c) to do less work. Note this transformation is true mathematically, not numerically.
+ // btVector3 scaled = vec * m_localScaling;
+ int index = (int)vec.maxDot(&m_unscaledPoints[0], m_numPoints, maxDot); //FIXME: may violate encapsulation of m_unscaledPoints
+ return getScaledPoint(index);
+ }
return supVec;
}
-void btConvexPointCloudShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const
+void btConvexPointCloudShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const
{
- for( int j = 0; j < numVectors; j++ )
- {
- const btVector3& vec = vectors[j] * m_localScaling; // dot( a*c, b) = dot(a, b*c)
- btScalar maxDot;
- int index = (int) vec.maxDot( &m_unscaledPoints[0], m_numPoints, maxDot);
- supportVerticesOut[j][3] = btScalar(-BT_LARGE_FLOAT);
- if( 0 <= index )
- {
- //WARNING: don't swap next lines, the w component would get overwritten!
- supportVerticesOut[j] = getScaledPoint(index);
- supportVerticesOut[j][3] = maxDot;
- }
- }
-
+ for (int j = 0; j < numVectors; j++)
+ {
+ const btVector3& vec = vectors[j] * m_localScaling; // dot( a*c, b) = dot(a, b*c)
+ btScalar maxDot;
+ int index = (int)vec.maxDot(&m_unscaledPoints[0], m_numPoints, maxDot);
+ supportVerticesOut[j][3] = btScalar(-BT_LARGE_FLOAT);
+ if (0 <= index)
+ {
+ //WARNING: don't swap next lines, the w component would get overwritten!
+ supportVerticesOut[j] = getScaledPoint(index);
+ supportVerticesOut[j][3] = maxDot;
+ }
+ }
}
-
-
-btVector3 btConvexPointCloudShape::localGetSupportingVertex(const btVector3& vec)const
+btVector3 btConvexPointCloudShape::localGetSupportingVertex(const btVector3& vec) const
{
btVector3 supVertex = localGetSupportingVertexWithoutMargin(vec);
- if ( getMargin()!=btScalar(0.) )
+ if (getMargin() != btScalar(0.))
{
btVector3 vecnorm = vec;
- if (vecnorm .length2() < (SIMD_EPSILON*SIMD_EPSILON))
+ if (vecnorm.length2() < (SIMD_EPSILON * SIMD_EPSILON))
{
- vecnorm.setValue(btScalar(-1.),btScalar(-1.),btScalar(-1.));
- }
+ vecnorm.setValue(btScalar(-1.), btScalar(-1.), btScalar(-1.));
+ }
vecnorm.normalize();
- supVertex+= getMargin() * vecnorm;
+ supVertex += getMargin() * vecnorm;
}
return supVertex;
}
-
#endif
-
-
-
-
-
//currently just for debugging (drawing), perhaps future support for algebraic continuous collision detection
//Please note that you can debug-draw btConvexHullShape with the Raytracer Demo
-int btConvexPointCloudShape::getNumVertices() const
+int btConvexPointCloudShape::getNumVertices() const
{
return m_numPoints;
}
@@ -109,31 +101,29 @@ int btConvexPointCloudShape::getNumEdges() const
return 0;
}
-void btConvexPointCloudShape::getEdge(int i,btVector3& pa,btVector3& pb) const
+void btConvexPointCloudShape::getEdge(int i, btVector3& pa, btVector3& pb) const
{
- btAssert (0);
+ btAssert(0);
}
-void btConvexPointCloudShape::getVertex(int i,btVector3& vtx) const
+void btConvexPointCloudShape::getVertex(int i, btVector3& vtx) const
{
- vtx = m_unscaledPoints[i]*m_localScaling;
+ vtx = m_unscaledPoints[i] * m_localScaling;
}
-int btConvexPointCloudShape::getNumPlanes() const
+int btConvexPointCloudShape::getNumPlanes() const
{
return 0;
}
-void btConvexPointCloudShape::getPlane(btVector3& ,btVector3& ,int ) const
+void btConvexPointCloudShape::getPlane(btVector3&, btVector3&, int) const
{
-
btAssert(0);
}
//not yet
-bool btConvexPointCloudShape::isInside(const btVector3& ,btScalar ) const
+bool btConvexPointCloudShape::isInside(const btVector3&, btScalar) const
{
btAssert(0);
return false;
}
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexPointCloudShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexPointCloudShape.h
index 54b5afac3e..c7d554a4d3 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexPointCloudShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexPointCloudShape.h
@@ -17,11 +17,12 @@ subject to the following restrictions:
#define BT_CONVEX_POINT_CLOUD_SHAPE_H
#include "btPolyhedralConvexShape.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
+#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
+ATTRIBUTE_ALIGNED16(class)
+btConvexPointCloudShape : public btPolyhedralConvexAabbCachingShape
{
btVector3* m_unscaledPoints;
int m_numPoints;
@@ -31,13 +32,13 @@ public:
btConvexPointCloudShape()
{
- m_localScaling.setValue(1.f,1.f,1.f);
+ 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)
+ btConvexPointCloudShape(btVector3 * points, int numPoints, const btVector3& localScaling, bool computeAabb = true)
{
m_localScaling = localScaling;
m_shapeType = CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE;
@@ -48,7 +49,7 @@ public:
recalcLocalAabb();
}
- void setPoints (btVector3* points, int numPoints, bool computeAabb = true,const btVector3& localScaling=btVector3(1.f,1.f,1.f))
+ 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;
@@ -58,48 +59,45 @@ public:
recalcLocalAabb();
}
- SIMD_FORCE_INLINE btVector3* getUnscaledPoints()
+ SIMD_FORCE_INLINE btVector3* getUnscaledPoints()
{
return m_unscaledPoints;
}
- SIMD_FORCE_INLINE const btVector3* getUnscaledPoints() const
+ SIMD_FORCE_INLINE const btVector3* getUnscaledPoints() const
{
return m_unscaledPoints;
}
- SIMD_FORCE_INLINE int getNumPoints() const
+ SIMD_FORCE_INLINE int getNumPoints() const
{
return m_numPoints;
}
- SIMD_FORCE_INLINE btVector3 getScaledPoint( int index) const
+ 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;
+ 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 const char* getName() const { return "ConvexPointCloud"; }
- virtual int getNumVertices() const;
+ 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 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 void setLocalScaling(const btVector3& scaling);
};
-
-#endif //BT_CONVEX_POINT_CLOUD_SHAPE_H
-
+#endif //BT_CONVEX_POINT_CLOUD_SHAPE_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexPolyhedron.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexPolyhedron.cpp
index 0fea00df5c..65b669e1c0 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexPolyhedron.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexPolyhedron.cpp
@@ -13,7 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
///This file was written by Erwin Coumans
///Separating axis rest based on work from Pierre Terdiman, see
///And contact clipping based on work from Simon Hobbs
@@ -21,49 +20,45 @@ subject to the following restrictions:
#include "btConvexPolyhedron.h"
#include "LinearMath/btHashMap.h"
-
btConvexPolyhedron::btConvexPolyhedron()
{
-
}
btConvexPolyhedron::~btConvexPolyhedron()
{
-
}
-
inline bool IsAlmostZero(const btVector3& v)
{
- if(btFabs(v.x())>1e-6 || btFabs(v.y())>1e-6 || btFabs(v.z())>1e-6) return false;
+ if (btFabs(v.x()) > 1e-6 || btFabs(v.y()) > 1e-6 || btFabs(v.z()) > 1e-6) return false;
return true;
}
struct btInternalVertexPair
{
- btInternalVertexPair(short int v0,short int v1)
- :m_v0(v0),
- m_v1(v1)
+ btInternalVertexPair(short int v0, short int v1)
+ : m_v0(v0),
+ m_v1(v1)
{
- if (m_v1>m_v0)
- btSwap(m_v0,m_v1);
+ if (m_v1 > m_v0)
+ btSwap(m_v0, m_v1);
}
short int m_v0;
short int m_v1;
int getHash() const
{
- return m_v0+(m_v1<<16);
+ return m_v0 + (m_v1 << 16);
}
bool equals(const btInternalVertexPair& other) const
{
- return m_v0==other.m_v0 && m_v1==other.m_v1;
+ return m_v0 == other.m_v0 && m_v1 == other.m_v1;
}
};
struct btInternalEdge
{
btInternalEdge()
- :m_face0(-1),
- m_face1(-1)
+ : m_face0(-1),
+ m_face1(-1)
{
}
short int m_face0;
@@ -75,23 +70,31 @@ struct btInternalEdge
#ifdef TEST_INTERNAL_OBJECTS
bool btConvexPolyhedron::testContainment() const
{
- for(int p=0;p<8;p++)
+ for (int p = 0; p < 8; p++)
{
btVector3 LocalPt;
- if(p==0) LocalPt = m_localCenter + btVector3(m_extents[0], m_extents[1], m_extents[2]);
- else if(p==1) LocalPt = m_localCenter + btVector3(m_extents[0], m_extents[1], -m_extents[2]);
- else if(p==2) LocalPt = m_localCenter + btVector3(m_extents[0], -m_extents[1], m_extents[2]);
- else if(p==3) LocalPt = m_localCenter + btVector3(m_extents[0], -m_extents[1], -m_extents[2]);
- else if(p==4) LocalPt = m_localCenter + btVector3(-m_extents[0], m_extents[1], m_extents[2]);
- else if(p==5) LocalPt = m_localCenter + btVector3(-m_extents[0], m_extents[1], -m_extents[2]);
- else if(p==6) LocalPt = m_localCenter + btVector3(-m_extents[0], -m_extents[1], m_extents[2]);
- else if(p==7) LocalPt = m_localCenter + btVector3(-m_extents[0], -m_extents[1], -m_extents[2]);
-
- for(int i=0;i<m_faces.size();i++)
+ if (p == 0)
+ LocalPt = m_localCenter + btVector3(m_extents[0], m_extents[1], m_extents[2]);
+ else if (p == 1)
+ LocalPt = m_localCenter + btVector3(m_extents[0], m_extents[1], -m_extents[2]);
+ else if (p == 2)
+ LocalPt = m_localCenter + btVector3(m_extents[0], -m_extents[1], m_extents[2]);
+ else if (p == 3)
+ LocalPt = m_localCenter + btVector3(m_extents[0], -m_extents[1], -m_extents[2]);
+ else if (p == 4)
+ LocalPt = m_localCenter + btVector3(-m_extents[0], m_extents[1], m_extents[2]);
+ else if (p == 5)
+ LocalPt = m_localCenter + btVector3(-m_extents[0], m_extents[1], -m_extents[2]);
+ else if (p == 6)
+ LocalPt = m_localCenter + btVector3(-m_extents[0], -m_extents[1], m_extents[2]);
+ else if (p == 7)
+ LocalPt = m_localCenter + btVector3(-m_extents[0], -m_extents[1], -m_extents[2]);
+
+ for (int i = 0; i < m_faces.size(); i++)
{
const btVector3 Normal(m_faces[i].m_plane[0], m_faces[i].m_plane[1], m_faces[i].m_plane[2]);
const btScalar d = LocalPt.dot(Normal) + m_faces[i].m_plane[3];
- if(d>0.0f)
+ if (d > 0.0f)
return false;
}
}
@@ -99,33 +102,28 @@ bool btConvexPolyhedron::testContainment() const
}
#endif
-void btConvexPolyhedron::initialize()
+void btConvexPolyhedron::initialize()
{
+ btHashMap<btInternalVertexPair, btInternalEdge> edges;
- btHashMap<btInternalVertexPair,btInternalEdge> edges;
-
-
-
-
- for(int i=0;i<m_faces.size();i++)
+ for (int i = 0; i < m_faces.size(); i++)
{
int numVertices = m_faces[i].m_indices.size();
int NbTris = numVertices;
- for(int j=0;j<NbTris;j++)
+ for (int j = 0; j < NbTris; j++)
{
- int k = (j+1)%numVertices;
- btInternalVertexPair vp(m_faces[i].m_indices[j],m_faces[i].m_indices[k]);
+ int k = (j + 1) % numVertices;
+ btInternalVertexPair vp(m_faces[i].m_indices[j], m_faces[i].m_indices[k]);
btInternalEdge* edptr = edges.find(vp);
- btVector3 edge = m_vertices[vp.m_v1]-m_vertices[vp.m_v0];
+ btVector3 edge = m_vertices[vp.m_v1] - m_vertices[vp.m_v0];
edge.normalize();
bool found = false;
- for (int p=0;p<m_uniqueEdges.size();p++)
+ for (int p = 0; p < m_uniqueEdges.size(); p++)
{
-
- if (IsAlmostZero(m_uniqueEdges[p]-edge) ||
- IsAlmostZero(m_uniqueEdges[p]+edge))
+ if (IsAlmostZero(m_uniqueEdges[p] - edge) ||
+ IsAlmostZero(m_uniqueEdges[p] + edge))
{
found = true;
break;
@@ -139,112 +137,107 @@ void btConvexPolyhedron::initialize()
if (edptr)
{
- btAssert(edptr->m_face0>=0);
- btAssert(edptr->m_face1<0);
+ btAssert(edptr->m_face0 >= 0);
+ btAssert(edptr->m_face1 < 0);
edptr->m_face1 = i;
- } else
+ }
+ else
{
btInternalEdge ed;
ed.m_face0 = i;
- edges.insert(vp,ed);
+ edges.insert(vp, ed);
}
}
}
#ifdef USE_CONNECTED_FACES
- for(int i=0;i<m_faces.size();i++)
+ for (int i = 0; i < m_faces.size(); i++)
{
int numVertices = m_faces[i].m_indices.size();
m_faces[i].m_connectedFaces.resize(numVertices);
- for(int j=0;j<numVertices;j++)
+ for (int j = 0; j < numVertices; j++)
{
- int k = (j+1)%numVertices;
- btInternalVertexPair vp(m_faces[i].m_indices[j],m_faces[i].m_indices[k]);
+ int k = (j + 1) % numVertices;
+ btInternalVertexPair vp(m_faces[i].m_indices[j], m_faces[i].m_indices[k]);
btInternalEdge* edptr = edges.find(vp);
btAssert(edptr);
- btAssert(edptr->m_face0>=0);
- btAssert(edptr->m_face1>=0);
+ btAssert(edptr->m_face0 >= 0);
+ btAssert(edptr->m_face1 >= 0);
- int connectedFace = (edptr->m_face0==i)?edptr->m_face1:edptr->m_face0;
+ int connectedFace = (edptr->m_face0 == i) ? edptr->m_face1 : edptr->m_face0;
m_faces[i].m_connectedFaces[j] = connectedFace;
}
}
-#endif//USE_CONNECTED_FACES
+#endif //USE_CONNECTED_FACES
initialize2();
}
-void btConvexPolyhedron::initialize2()
+void btConvexPolyhedron::initialize2()
{
m_localCenter.setValue(0, 0, 0);
btScalar TotalArea = 0.0f;
- for(int i=0;i<m_faces.size();i++)
+ for (int i = 0; i < m_faces.size(); i++)
{
int numVertices = m_faces[i].m_indices.size();
- int NbTris = numVertices-2;
-
+ int NbTris = numVertices - 2;
+
const btVector3& p0 = m_vertices[m_faces[i].m_indices[0]];
- for(int j=1;j<=NbTris;j++)
+ for (int j = 1; j <= NbTris; j++)
{
- int k = (j+1)%numVertices;
+ int k = (j + 1) % numVertices;
const btVector3& p1 = m_vertices[m_faces[i].m_indices[j]];
const btVector3& p2 = m_vertices[m_faces[i].m_indices[k]];
btScalar Area = ((p0 - p1).cross(p0 - p2)).length() * 0.5f;
- btVector3 Center = (p0+p1+p2)/3.0f;
+ btVector3 Center = (p0 + p1 + p2) / 3.0f;
m_localCenter += Area * Center;
TotalArea += Area;
}
}
m_localCenter /= TotalArea;
-
-
-
#ifdef TEST_INTERNAL_OBJECTS
- if(1)
+ if (1)
{
m_radius = FLT_MAX;
- for(int i=0;i<m_faces.size();i++)
+ for (int i = 0; i < m_faces.size(); i++)
{
const btVector3 Normal(m_faces[i].m_plane[0], m_faces[i].m_plane[1], m_faces[i].m_plane[2]);
const btScalar dist = btFabs(m_localCenter.dot(Normal) + m_faces[i].m_plane[3]);
- if(dist<m_radius)
+ if (dist < m_radius)
m_radius = dist;
}
-
btScalar MinX = FLT_MAX;
btScalar MinY = FLT_MAX;
btScalar MinZ = FLT_MAX;
btScalar MaxX = -FLT_MAX;
btScalar MaxY = -FLT_MAX;
btScalar MaxZ = -FLT_MAX;
- for(int i=0; i<m_vertices.size(); i++)
+ for (int i = 0; i < m_vertices.size(); i++)
{
const btVector3& pt = m_vertices[i];
- if(pt.x()<MinX) MinX = pt.x();
- if(pt.x()>MaxX) MaxX = pt.x();
- if(pt.y()<MinY) MinY = pt.y();
- if(pt.y()>MaxY) MaxY = pt.y();
- if(pt.z()<MinZ) MinZ = pt.z();
- if(pt.z()>MaxZ) MaxZ = pt.z();
+ if (pt.x() < MinX) MinX = pt.x();
+ if (pt.x() > MaxX) MaxX = pt.x();
+ if (pt.y() < MinY) MinY = pt.y();
+ if (pt.y() > MaxY) MaxY = pt.y();
+ if (pt.z() < MinZ) MinZ = pt.z();
+ if (pt.z() > MaxZ) MaxZ = pt.z();
}
- mC.setValue(MaxX+MinX, MaxY+MinY, MaxZ+MinZ);
- mE.setValue(MaxX-MinX, MaxY-MinY, MaxZ-MinZ);
-
-
+ mC.setValue(MaxX + MinX, MaxY + MinY, MaxZ + MinZ);
+ mE.setValue(MaxX - MinX, MaxY - MinY, MaxZ - MinZ);
-// const btScalar r = m_radius / sqrtf(2.0f);
+ // const btScalar r = m_radius / sqrtf(2.0f);
const btScalar r = m_radius / sqrtf(3.0f);
const int LargestExtent = mE.maxAxis();
- const btScalar Step = (mE[LargestExtent]*0.5f - r)/1024.0f;
+ const btScalar Step = (mE[LargestExtent] * 0.5f - r) / 1024.0f;
m_extents[0] = m_extents[1] = m_extents[2] = r;
- m_extents[LargestExtent] = mE[LargestExtent]*0.5f;
+ m_extents[LargestExtent] = mE[LargestExtent] * 0.5f;
bool FoundBox = false;
- for(int j=0;j<1024;j++)
+ for (int j = 0; j < 1024; j++)
{
- if(testContainment())
+ if (testContainment())
{
FoundBox = true;
break;
@@ -252,25 +245,25 @@ void btConvexPolyhedron::initialize2()
m_extents[LargestExtent] -= Step;
}
- if(!FoundBox)
+ if (!FoundBox)
{
m_extents[0] = m_extents[1] = m_extents[2] = r;
}
else
{
// Refine the box
- const btScalar Step = (m_radius - r)/1024.0f;
- const int e0 = (1<<LargestExtent) & 3;
- const int e1 = (1<<e0) & 3;
+ const btScalar Step = (m_radius - r) / 1024.0f;
+ const int e0 = (1 << LargestExtent) & 3;
+ const int e1 = (1 << e0) & 3;
- for(int j=0;j<1024;j++)
+ for (int j = 0; j < 1024; j++)
{
const btScalar Saved0 = m_extents[e0];
const btScalar Saved1 = m_extents[e1];
m_extents[e0] += Step;
m_extents[e1] += Step;
- if(!testContainment())
+ if (!testContainment())
{
m_extents[e0] = Saved0;
m_extents[e1] = Saved1;
@@ -281,29 +274,29 @@ void btConvexPolyhedron::initialize2()
}
#endif
}
-void btConvexPolyhedron::project(const btTransform& trans, const btVector3& dir, btScalar& minProj, btScalar& maxProj, btVector3& witnesPtMin,btVector3& witnesPtMax) const
+void btConvexPolyhedron::project(const btTransform& trans, const btVector3& dir, btScalar& minProj, btScalar& maxProj, btVector3& witnesPtMin, btVector3& witnesPtMax) const
{
minProj = FLT_MAX;
maxProj = -FLT_MAX;
int numVerts = m_vertices.size();
- for(int i=0;i<numVerts;i++)
+ for (int i = 0; i < numVerts; i++)
{
btVector3 pt = trans * m_vertices[i];
btScalar dp = pt.dot(dir);
- if(dp < minProj)
+ if (dp < minProj)
{
minProj = dp;
witnesPtMin = pt;
}
- if(dp > maxProj)
+ if (dp > maxProj)
{
maxProj = dp;
witnesPtMax = pt;
}
}
- if(minProj>maxProj)
+ if (minProj > maxProj)
{
- btSwap(minProj,maxProj);
- btSwap(witnesPtMin,witnesPtMax);
+ btSwap(minProj, maxProj);
+ btSwap(witnesPtMin, witnesPtMax);
}
}
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexPolyhedron.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexPolyhedron.h
index c5aa20f453..638aa9b3df 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexPolyhedron.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexPolyhedron.h
@@ -13,10 +13,8 @@ subject to the following restrictions:
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
@@ -25,42 +23,37 @@ subject to the following restrictions:
#define TEST_INTERNAL_OBJECTS 1
-
struct btFace
{
- btAlignedObjectArray<int> m_indices;
-// btAlignedObjectArray<int> m_connectedFaces;
- btScalar m_plane[4];
+ btAlignedObjectArray<int> m_indices;
+ // btAlignedObjectArray<int> m_connectedFaces;
+ btScalar m_plane[4];
};
-
-ATTRIBUTE_ALIGNED16(class) btConvexPolyhedron
+ATTRIBUTE_ALIGNED16(class)
+btConvexPolyhedron
{
- public:
-
+public:
BT_DECLARE_ALIGNED_ALLOCATOR();
-
+
btConvexPolyhedron();
- virtual ~btConvexPolyhedron();
+ virtual ~btConvexPolyhedron();
- btAlignedObjectArray<btVector3> m_vertices;
- btAlignedObjectArray<btFace> m_faces;
+ btAlignedObjectArray<btVector3> m_vertices;
+ btAlignedObjectArray<btFace> m_faces;
btAlignedObjectArray<btVector3> m_uniqueEdges;
- btVector3 m_localCenter;
- btVector3 m_extents;
- btScalar m_radius;
- btVector3 mC;
- btVector3 mE;
+ btVector3 m_localCenter;
+ btVector3 m_extents;
+ btScalar m_radius;
+ btVector3 mC;
+ btVector3 mE;
- void initialize();
- void initialize2();
+ void initialize();
+ void initialize2();
bool testContainment() const;
- void project(const btTransform& trans, const btVector3& dir, btScalar& minProj, btScalar& maxProj, btVector3& witnesPtMin,btVector3& witnesPtMax) const;
+ void project(const btTransform& trans, const btVector3& dir, btScalar& minProj, btScalar& maxProj, btVector3& witnesPtMin, btVector3& witnesPtMax) const;
};
-
-#endif //_BT_POLYHEDRAL_FEATURES_H
-
-
+#endif //_BT_POLYHEDRAL_FEATURES_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexShape.cpp
index 2f84858598..f8fb0aa9fd 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexShape.cpp
@@ -13,7 +13,7 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-#if defined (_WIN32) || defined (__i386__)
+#if defined(_WIN32) || defined(__i386__)
#define BT_USE_SSE_IN_API
#endif
@@ -27,30 +27,28 @@ subject to the following restrictions:
#include "btConvexPointCloudShape.h"
///not supported on IBM SDK, until we fix the alignment of btVector3
-#if defined (__CELLOS_LV2__) && defined (__SPU__)
+#if defined(__CELLOS_LV2__) && defined(__SPU__)
#include <spu_intrinsics.h>
-static inline vec_float4 vec_dot3( vec_float4 vec0, vec_float4 vec1 )
+static inline vec_float4 vec_dot3(vec_float4 vec0, vec_float4 vec1)
{
- vec_float4 result;
- result = spu_mul( vec0, vec1 );
- result = spu_madd( spu_rlqwbyte( vec0, 4 ), spu_rlqwbyte( vec1, 4 ), result );
- return spu_madd( spu_rlqwbyte( vec0, 8 ), spu_rlqwbyte( vec1, 8 ), result );
+ vec_float4 result;
+ result = spu_mul(vec0, vec1);
+ result = spu_madd(spu_rlqwbyte(vec0, 4), spu_rlqwbyte(vec1, 4), result);
+ return spu_madd(spu_rlqwbyte(vec0, 8), spu_rlqwbyte(vec1, 8), result);
}
-#endif //__SPU__
+#endif //__SPU__
-btConvexShape::btConvexShape ()
+btConvexShape::btConvexShape()
{
}
btConvexShape::~btConvexShape()
{
-
}
-
-void btConvexShape::project(const btTransform& trans, const btVector3& dir, btScalar& min, btScalar& max, btVector3& witnesPtMin,btVector3& witnesPtMax) const
+void btConvexShape::project(const btTransform& trans, const btVector3& dir, btScalar& min, btScalar& max, btVector3& witnesPtMin, btVector3& witnesPtMax) const
{
- btVector3 localAxis = dir*trans.getBasis();
+ btVector3 localAxis = dir * trans.getBasis();
btVector3 vtx1 = trans(localGetSupportingVertex(localAxis));
btVector3 vtx2 = trans(localGetSupportingVertex(-localAxis));
@@ -58,8 +56,8 @@ void btConvexShape::project(const btTransform& trans, const btVector3& dir, btSc
max = vtx2.dot(dir);
witnesPtMax = vtx2;
witnesPtMin = vtx1;
-
- if(min>max)
+
+ if (min > max)
{
btScalar tmp = min;
min = max;
@@ -69,391 +67,392 @@ void btConvexShape::project(const btTransform& trans, const btVector3& dir, btSc
}
}
-
-static btVector3 convexHullSupport (const btVector3& localDirOrg, const btVector3* points, int numPoints, const btVector3& localScaling)
-{
-
+static btVector3 convexHullSupport(const btVector3& localDirOrg, const btVector3* points, int numPoints, const btVector3& localScaling)
+{
btVector3 vec = localDirOrg * localScaling;
-#if defined (__CELLOS_LV2__) && defined (__SPU__)
+#if defined(__CELLOS_LV2__) && defined(__SPU__)
btVector3 localDir = vec;
- vec_float4 v_distMax = {-FLT_MAX,0,0,0};
- vec_int4 v_idxMax = {-999,0,0,0};
- int v=0;
+ vec_float4 v_distMax = {-FLT_MAX, 0, 0, 0};
+ vec_int4 v_idxMax = {-999, 0, 0, 0};
+ int v = 0;
int numverts = numPoints;
- for(;v<(int)numverts-4;v+=4) {
- vec_float4 p0 = vec_dot3(points[v ].get128(),localDir.get128());
- vec_float4 p1 = vec_dot3(points[v+1].get128(),localDir.get128());
- vec_float4 p2 = vec_dot3(points[v+2].get128(),localDir.get128());
- vec_float4 p3 = vec_dot3(points[v+3].get128(),localDir.get128());
- const vec_int4 i0 = {v ,0,0,0};
- const vec_int4 i1 = {v+1,0,0,0};
- const vec_int4 i2 = {v+2,0,0,0};
- const vec_int4 i3 = {v+3,0,0,0};
- vec_uint4 retGt01 = spu_cmpgt(p0,p1);
- vec_float4 pmax01 = spu_sel(p1,p0,retGt01);
- vec_int4 imax01 = spu_sel(i1,i0,retGt01);
- vec_uint4 retGt23 = spu_cmpgt(p2,p3);
- vec_float4 pmax23 = spu_sel(p3,p2,retGt23);
- vec_int4 imax23 = spu_sel(i3,i2,retGt23);
- vec_uint4 retGt0123 = spu_cmpgt(pmax01,pmax23);
- vec_float4 pmax0123 = spu_sel(pmax23,pmax01,retGt0123);
- vec_int4 imax0123 = spu_sel(imax23,imax01,retGt0123);
- vec_uint4 retGtMax = spu_cmpgt(v_distMax,pmax0123);
- v_distMax = spu_sel(pmax0123,v_distMax,retGtMax);
- v_idxMax = spu_sel(imax0123,v_idxMax,retGtMax);
+ for (; v < (int)numverts - 4; v += 4)
+ {
+ vec_float4 p0 = vec_dot3(points[v].get128(), localDir.get128());
+ vec_float4 p1 = vec_dot3(points[v + 1].get128(), localDir.get128());
+ vec_float4 p2 = vec_dot3(points[v + 2].get128(), localDir.get128());
+ vec_float4 p3 = vec_dot3(points[v + 3].get128(), localDir.get128());
+ const vec_int4 i0 = {v, 0, 0, 0};
+ const vec_int4 i1 = {v + 1, 0, 0, 0};
+ const vec_int4 i2 = {v + 2, 0, 0, 0};
+ const vec_int4 i3 = {v + 3, 0, 0, 0};
+ vec_uint4 retGt01 = spu_cmpgt(p0, p1);
+ vec_float4 pmax01 = spu_sel(p1, p0, retGt01);
+ vec_int4 imax01 = spu_sel(i1, i0, retGt01);
+ vec_uint4 retGt23 = spu_cmpgt(p2, p3);
+ vec_float4 pmax23 = spu_sel(p3, p2, retGt23);
+ vec_int4 imax23 = spu_sel(i3, i2, retGt23);
+ vec_uint4 retGt0123 = spu_cmpgt(pmax01, pmax23);
+ vec_float4 pmax0123 = spu_sel(pmax23, pmax01, retGt0123);
+ vec_int4 imax0123 = spu_sel(imax23, imax01, retGt0123);
+ vec_uint4 retGtMax = spu_cmpgt(v_distMax, pmax0123);
+ v_distMax = spu_sel(pmax0123, v_distMax, retGtMax);
+ v_idxMax = spu_sel(imax0123, v_idxMax, retGtMax);
}
- for(;v<(int)numverts;v++) {
- vec_float4 p = vec_dot3(points[v].get128(),localDir.get128());
- const vec_int4 i = {v,0,0,0};
- vec_uint4 retGtMax = spu_cmpgt(v_distMax,p);
- v_distMax = spu_sel(p,v_distMax,retGtMax);
- v_idxMax = spu_sel(i,v_idxMax,retGtMax);
+ for (; v < (int)numverts; v++)
+ {
+ vec_float4 p = vec_dot3(points[v].get128(), localDir.get128());
+ const vec_int4 i = {v, 0, 0, 0};
+ vec_uint4 retGtMax = spu_cmpgt(v_distMax, p);
+ v_distMax = spu_sel(p, v_distMax, retGtMax);
+ v_idxMax = spu_sel(i, v_idxMax, retGtMax);
}
- int ptIndex = spu_extract(v_idxMax,0);
- const btVector3& supVec= points[ptIndex] * localScaling;
+ int ptIndex = spu_extract(v_idxMax, 0);
+ const btVector3& supVec = points[ptIndex] * localScaling;
return supVec;
#else
btScalar maxDot;
- long ptIndex = vec.maxDot( points, numPoints, maxDot);
+ long ptIndex = vec.maxDot(points, numPoints, maxDot);
btAssert(ptIndex >= 0);
- if (ptIndex<0)
+ if (ptIndex < 0)
{
ptIndex = 0;
}
btVector3 supVec = points[ptIndex] * localScaling;
return supVec;
-#endif //__SPU__
+#endif //__SPU__
}
-btVector3 btConvexShape::localGetSupportVertexWithoutMarginNonVirtual (const btVector3& localDir) const
+btVector3 btConvexShape::localGetSupportVertexWithoutMarginNonVirtual(const btVector3& localDir) const
{
switch (m_shapeType)
{
- case SPHERE_SHAPE_PROXYTYPE:
- {
- return btVector3(0,0,0);
- }
- case BOX_SHAPE_PROXYTYPE:
- {
- btBoxShape* convexShape = (btBoxShape*)this;
- const btVector3& halfExtents = convexShape->getImplicitShapeDimensions();
-
-#if defined( __APPLE__ ) && (defined( BT_USE_SSE )||defined( BT_USE_NEON ))
- #if defined( BT_USE_SSE )
- return btVector3( _mm_xor_ps( _mm_and_ps( localDir.mVec128, (__m128){-0.0f, -0.0f, -0.0f, -0.0f }), halfExtents.mVec128 ));
- #elif defined( BT_USE_NEON )
- return btVector3( (float32x4_t) (((uint32x4_t) localDir.mVec128 & (uint32x4_t){ 0x80000000, 0x80000000, 0x80000000, 0x80000000}) ^ (uint32x4_t) halfExtents.mVec128 ));
- #else
- #error unknown vector arch
- #endif
-#else
- return btVector3(btFsels(localDir.x(), halfExtents.x(), -halfExtents.x()),
- btFsels(localDir.y(), halfExtents.y(), -halfExtents.y()),
- btFsels(localDir.z(), halfExtents.z(), -halfExtents.z()));
-#endif
- }
- case TRIANGLE_SHAPE_PROXYTYPE:
- {
- btTriangleShape* triangleShape = (btTriangleShape*)this;
- btVector3 dir(localDir.getX(),localDir.getY(),localDir.getZ());
- btVector3* vertices = &triangleShape->m_vertices1[0];
- btVector3 dots = dir.dot3(vertices[0], vertices[1], vertices[2]);
- btVector3 sup = vertices[dots.maxAxis()];
- return btVector3(sup.getX(),sup.getY(),sup.getZ());
- }
- case CYLINDER_SHAPE_PROXYTYPE:
- {
- btCylinderShape* cylShape = (btCylinderShape*)this;
- //mapping of halfextents/dimension onto radius/height depends on how cylinder local orientation is (upAxis)
-
- btVector3 halfExtents = cylShape->getImplicitShapeDimensions();
- btVector3 v(localDir.getX(),localDir.getY(),localDir.getZ());
- int cylinderUpAxis = cylShape->getUpAxis();
- int XX(1),YY(0),ZZ(2);
-
- switch (cylinderUpAxis)
- {
- case 0:
+ case SPHERE_SHAPE_PROXYTYPE:
{
- XX = 1;
- YY = 0;
- ZZ = 2;
+ return btVector3(0, 0, 0);
}
- break;
- case 1:
+ case BOX_SHAPE_PROXYTYPE:
{
- XX = 0;
- YY = 1;
- ZZ = 2;
+ btBoxShape* convexShape = (btBoxShape*)this;
+ const btVector3& halfExtents = convexShape->getImplicitShapeDimensions();
+
+#if defined(__APPLE__) && (defined(BT_USE_SSE) || defined(BT_USE_NEON))
+#if defined(BT_USE_SSE)
+ return btVector3(_mm_xor_ps(_mm_and_ps(localDir.mVec128, (__m128){-0.0f, -0.0f, -0.0f, -0.0f}), halfExtents.mVec128));
+#elif defined(BT_USE_NEON)
+ return btVector3((float32x4_t)(((uint32x4_t)localDir.mVec128 & (uint32x4_t){0x80000000, 0x80000000, 0x80000000, 0x80000000}) ^ (uint32x4_t)halfExtents.mVec128));
+#else
+#error unknown vector arch
+#endif
+#else
+ return btVector3(btFsels(localDir.x(), halfExtents.x(), -halfExtents.x()),
+ btFsels(localDir.y(), halfExtents.y(), -halfExtents.y()),
+ btFsels(localDir.z(), halfExtents.z(), -halfExtents.z()));
+#endif
}
- break;
- case 2:
+ case TRIANGLE_SHAPE_PROXYTYPE:
{
- XX = 0;
- YY = 2;
- ZZ = 1;
-
+ btTriangleShape* triangleShape = (btTriangleShape*)this;
+ btVector3 dir(localDir.getX(), localDir.getY(), localDir.getZ());
+ btVector3* vertices = &triangleShape->m_vertices1[0];
+ btVector3 dots = dir.dot3(vertices[0], vertices[1], vertices[2]);
+ btVector3 sup = vertices[dots.maxAxis()];
+ return btVector3(sup.getX(), sup.getY(), sup.getZ());
}
- break;
- default:
- btAssert(0);
- break;
- };
-
- btScalar radius = halfExtents[XX];
- btScalar halfHeight = halfExtents[cylinderUpAxis];
+ case CYLINDER_SHAPE_PROXYTYPE:
+ {
+ btCylinderShape* cylShape = (btCylinderShape*)this;
+ //mapping of halfextents/dimension onto radius/height depends on how cylinder local orientation is (upAxis)
- btVector3 tmp;
- btScalar d ;
+ btVector3 halfExtents = cylShape->getImplicitShapeDimensions();
+ btVector3 v(localDir.getX(), localDir.getY(), localDir.getZ());
+ int cylinderUpAxis = cylShape->getUpAxis();
+ int XX(1), YY(0), ZZ(2);
- btScalar s = btSqrt(v[XX] * v[XX] + v[ZZ] * v[ZZ]);
- if (s != btScalar(0.0))
- {
- d = radius / s;
- tmp[XX] = v[XX] * d;
- tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight;
- tmp[ZZ] = v[ZZ] * d;
- return btVector3(tmp.getX(),tmp.getY(),tmp.getZ());
- } else {
- tmp[XX] = radius;
- tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight;
- tmp[ZZ] = btScalar(0.0);
- return btVector3(tmp.getX(),tmp.getY(),tmp.getZ());
+ switch (cylinderUpAxis)
+ {
+ case 0:
+ {
+ XX = 1;
+ YY = 0;
+ ZZ = 2;
+ }
+ break;
+ case 1:
+ {
+ XX = 0;
+ YY = 1;
+ ZZ = 2;
+ }
+ break;
+ case 2:
+ {
+ XX = 0;
+ YY = 2;
+ ZZ = 1;
+ }
+ break;
+ default:
+ btAssert(0);
+ break;
+ };
+
+ btScalar radius = halfExtents[XX];
+ btScalar halfHeight = halfExtents[cylinderUpAxis];
+
+ btVector3 tmp;
+ btScalar d;
+
+ btScalar s = btSqrt(v[XX] * v[XX] + v[ZZ] * v[ZZ]);
+ if (s != btScalar(0.0))
+ {
+ d = radius / s;
+ tmp[XX] = v[XX] * d;
+ tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight;
+ tmp[ZZ] = v[ZZ] * d;
+ return btVector3(tmp.getX(), tmp.getY(), tmp.getZ());
+ }
+ else
+ {
+ tmp[XX] = radius;
+ tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight;
+ tmp[ZZ] = btScalar(0.0);
+ return btVector3(tmp.getX(), tmp.getY(), tmp.getZ());
+ }
}
- }
- case CAPSULE_SHAPE_PROXYTYPE:
- {
- btVector3 vec0(localDir.getX(),localDir.getY(),localDir.getZ());
+ case CAPSULE_SHAPE_PROXYTYPE:
+ {
+ btVector3 vec0(localDir.getX(), localDir.getY(), localDir.getZ());
- btCapsuleShape* capsuleShape = (btCapsuleShape*)this;
- btScalar halfHeight = capsuleShape->getHalfHeight();
- int capsuleUpAxis = capsuleShape->getUpAxis();
+ btCapsuleShape* capsuleShape = (btCapsuleShape*)this;
+ btScalar halfHeight = capsuleShape->getHalfHeight();
+ int capsuleUpAxis = capsuleShape->getUpAxis();
- btVector3 supVec(0,0,0);
+ btVector3 supVec(0, 0, 0);
- btScalar maxDot(btScalar(-BT_LARGE_FLOAT));
+ btScalar maxDot(btScalar(-BT_LARGE_FLOAT));
- btVector3 vec = vec0;
- btScalar lenSqr = vec.length2();
- if (lenSqr < SIMD_EPSILON*SIMD_EPSILON)
- {
- vec.setValue(1,0,0);
- } else
- {
- btScalar rlen = btScalar(1.) / btSqrt(lenSqr );
- vec *= rlen;
- }
- btVector3 vtx;
- btScalar newDot;
- {
- btVector3 pos(0,0,0);
- pos[capsuleUpAxis] = halfHeight;
+ btVector3 vec = vec0;
+ btScalar lenSqr = vec.length2();
+ if (lenSqr < SIMD_EPSILON * SIMD_EPSILON)
+ {
+ vec.setValue(1, 0, 0);
+ }
+ else
+ {
+ btScalar rlen = btScalar(1.) / btSqrt(lenSqr);
+ vec *= rlen;
+ }
+ btVector3 vtx;
+ btScalar newDot;
+ {
+ btVector3 pos(0, 0, 0);
+ pos[capsuleUpAxis] = halfHeight;
- vtx = pos;
- newDot = vec.dot(vtx);
-
+ vtx = pos;
+ newDot = vec.dot(vtx);
- if (newDot > maxDot)
+ if (newDot > maxDot)
+ {
+ maxDot = newDot;
+ supVec = vtx;
+ }
+ }
{
- maxDot = newDot;
- supVec = vtx;
+ btVector3 pos(0, 0, 0);
+ pos[capsuleUpAxis] = -halfHeight;
+
+ vtx = pos;
+ newDot = vec.dot(vtx);
+ if (newDot > maxDot)
+ {
+ maxDot = newDot;
+ supVec = vtx;
+ }
}
+ return btVector3(supVec.getX(), supVec.getY(), supVec.getZ());
}
+ case CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE:
{
- btVector3 pos(0,0,0);
- pos[capsuleUpAxis] = -halfHeight;
-
- vtx = pos;
- newDot = vec.dot(vtx);
- if (newDot > maxDot)
- {
- maxDot = newDot;
- supVec = vtx;
- }
+ btConvexPointCloudShape* convexPointCloudShape = (btConvexPointCloudShape*)this;
+ btVector3* points = convexPointCloudShape->getUnscaledPoints();
+ int numPoints = convexPointCloudShape->getNumPoints();
+ return convexHullSupport(localDir, points, numPoints, convexPointCloudShape->getLocalScalingNV());
}
- return btVector3(supVec.getX(),supVec.getY(),supVec.getZ());
- }
- case CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE:
- {
- btConvexPointCloudShape* convexPointCloudShape = (btConvexPointCloudShape*)this;
- btVector3* points = convexPointCloudShape->getUnscaledPoints ();
- int numPoints = convexPointCloudShape->getNumPoints ();
- return convexHullSupport (localDir, points, numPoints,convexPointCloudShape->getLocalScalingNV());
- }
- case CONVEX_HULL_SHAPE_PROXYTYPE:
- {
- btConvexHullShape* convexHullShape = (btConvexHullShape*)this;
- btVector3* points = convexHullShape->getUnscaledPoints();
- int numPoints = convexHullShape->getNumPoints ();
- return convexHullSupport (localDir, points, numPoints,convexHullShape->getLocalScalingNV());
- }
- default:
+ case CONVEX_HULL_SHAPE_PROXYTYPE:
+ {
+ btConvexHullShape* convexHullShape = (btConvexHullShape*)this;
+ btVector3* points = convexHullShape->getUnscaledPoints();
+ int numPoints = convexHullShape->getNumPoints();
+ return convexHullSupport(localDir, points, numPoints, convexHullShape->getLocalScalingNV());
+ }
+ default:
#ifndef __SPU__
- return this->localGetSupportingVertexWithoutMargin (localDir);
+ return this->localGetSupportingVertexWithoutMargin(localDir);
#else
- btAssert (0);
+ btAssert(0);
#endif
}
// should never reach here
- btAssert (0);
- return btVector3 (btScalar(0.0f), btScalar(0.0f), btScalar(0.0f));
+ btAssert(0);
+ return btVector3(btScalar(0.0f), btScalar(0.0f), btScalar(0.0f));
}
-btVector3 btConvexShape::localGetSupportVertexNonVirtual (const btVector3& localDir) const
+btVector3 btConvexShape::localGetSupportVertexNonVirtual(const btVector3& localDir) const
{
btVector3 localDirNorm = localDir;
- if (localDirNorm .length2() < (SIMD_EPSILON*SIMD_EPSILON))
+ if (localDirNorm.length2() < (SIMD_EPSILON * SIMD_EPSILON))
{
- localDirNorm.setValue(btScalar(-1.),btScalar(-1.),btScalar(-1.));
+ localDirNorm.setValue(btScalar(-1.), btScalar(-1.), btScalar(-1.));
}
- localDirNorm.normalize ();
+ localDirNorm.normalize();
- return localGetSupportVertexWithoutMarginNonVirtual(localDirNorm)+ getMarginNonVirtual() * localDirNorm;
+ return localGetSupportVertexWithoutMarginNonVirtual(localDirNorm) + getMarginNonVirtual() * localDirNorm;
}
/* TODO: This should be bumped up to btCollisionShape () */
-btScalar btConvexShape::getMarginNonVirtual () const
+btScalar btConvexShape::getMarginNonVirtual() const
{
switch (m_shapeType)
{
- case SPHERE_SHAPE_PROXYTYPE:
- {
- btSphereShape* sphereShape = (btSphereShape*)this;
- return sphereShape->getRadius ();
- }
- case BOX_SHAPE_PROXYTYPE:
- {
- btBoxShape* convexShape = (btBoxShape*)this;
- return convexShape->getMarginNV ();
- }
- case TRIANGLE_SHAPE_PROXYTYPE:
- {
- btTriangleShape* triangleShape = (btTriangleShape*)this;
- return triangleShape->getMarginNV ();
- }
- case CYLINDER_SHAPE_PROXYTYPE:
- {
- btCylinderShape* cylShape = (btCylinderShape*)this;
- return cylShape->getMarginNV();
- }
- case CONE_SHAPE_PROXYTYPE:
- {
- btConeShape* conShape = (btConeShape*)this;
- return conShape->getMarginNV();
- }
- case CAPSULE_SHAPE_PROXYTYPE:
- {
- btCapsuleShape* capsuleShape = (btCapsuleShape*)this;
- return capsuleShape->getMarginNV();
- }
- case CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE:
- /* fall through */
- case CONVEX_HULL_SHAPE_PROXYTYPE:
- {
- btPolyhedralConvexShape* convexHullShape = (btPolyhedralConvexShape*)this;
- return convexHullShape->getMarginNV();
- }
- default:
+ case SPHERE_SHAPE_PROXYTYPE:
+ {
+ btSphereShape* sphereShape = (btSphereShape*)this;
+ return sphereShape->getRadius();
+ }
+ case BOX_SHAPE_PROXYTYPE:
+ {
+ btBoxShape* convexShape = (btBoxShape*)this;
+ return convexShape->getMarginNV();
+ }
+ case TRIANGLE_SHAPE_PROXYTYPE:
+ {
+ btTriangleShape* triangleShape = (btTriangleShape*)this;
+ return triangleShape->getMarginNV();
+ }
+ case CYLINDER_SHAPE_PROXYTYPE:
+ {
+ btCylinderShape* cylShape = (btCylinderShape*)this;
+ return cylShape->getMarginNV();
+ }
+ case CONE_SHAPE_PROXYTYPE:
+ {
+ btConeShape* conShape = (btConeShape*)this;
+ return conShape->getMarginNV();
+ }
+ case CAPSULE_SHAPE_PROXYTYPE:
+ {
+ btCapsuleShape* capsuleShape = (btCapsuleShape*)this;
+ return capsuleShape->getMarginNV();
+ }
+ case CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE:
+ /* fall through */
+ case CONVEX_HULL_SHAPE_PROXYTYPE:
+ {
+ btPolyhedralConvexShape* convexHullShape = (btPolyhedralConvexShape*)this;
+ return convexHullShape->getMarginNV();
+ }
+ default:
#ifndef __SPU__
- return this->getMargin ();
+ return this->getMargin();
#else
- btAssert (0);
+ btAssert(0);
#endif
}
// should never reach here
- btAssert (0);
+ btAssert(0);
return btScalar(0.0f);
}
#ifndef __SPU__
-void btConvexShape::getAabbNonVirtual (const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
+void btConvexShape::getAabbNonVirtual(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
{
switch (m_shapeType)
{
- case SPHERE_SHAPE_PROXYTYPE:
- {
- btSphereShape* sphereShape = (btSphereShape*)this;
- btScalar radius = sphereShape->getImplicitShapeDimensions().getX();// * convexShape->getLocalScaling().getX();
- btScalar margin = radius + sphereShape->getMarginNonVirtual();
- const btVector3& center = t.getOrigin();
- btVector3 extent(margin,margin,margin);
- aabbMin = center - extent;
- aabbMax = center + extent;
- }
- break;
- case CYLINDER_SHAPE_PROXYTYPE:
- /* fall through */
- case BOX_SHAPE_PROXYTYPE:
- {
- btBoxShape* convexShape = (btBoxShape*)this;
- btScalar margin=convexShape->getMarginNonVirtual();
- btVector3 halfExtents = convexShape->getImplicitShapeDimensions();
- halfExtents += btVector3(margin,margin,margin);
- 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;
+ case SPHERE_SHAPE_PROXYTYPE:
+ {
+ btSphereShape* sphereShape = (btSphereShape*)this;
+ btScalar radius = sphereShape->getImplicitShapeDimensions().getX(); // * convexShape->getLocalScaling().getX();
+ btScalar margin = radius + sphereShape->getMarginNonVirtual();
+ const btVector3& center = t.getOrigin();
+ btVector3 extent(margin, margin, margin);
+ aabbMin = center - extent;
+ aabbMax = center + extent;
+ }
break;
- }
- case TRIANGLE_SHAPE_PROXYTYPE:
- {
- btTriangleShape* triangleShape = (btTriangleShape*)this;
- btScalar margin = triangleShape->getMarginNonVirtual();
- for (int i=0;i<3;i++)
+ case CYLINDER_SHAPE_PROXYTYPE:
+ /* fall through */
+ case BOX_SHAPE_PROXYTYPE:
+ {
+ btBoxShape* convexShape = (btBoxShape*)this;
+ btScalar margin = convexShape->getMarginNonVirtual();
+ btVector3 halfExtents = convexShape->getImplicitShapeDimensions();
+ halfExtents += btVector3(margin, margin, margin);
+ 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;
+ break;
+ }
+ case TRIANGLE_SHAPE_PROXYTYPE:
{
- btVector3 vec(btScalar(0.),btScalar(0.),btScalar(0.));
- vec[i] = btScalar(1.);
+ btTriangleShape* triangleShape = (btTriangleShape*)this;
+ btScalar margin = triangleShape->getMarginNonVirtual();
+ for (int i = 0; i < 3; i++)
+ {
+ btVector3 vec(btScalar(0.), btScalar(0.), btScalar(0.));
+ vec[i] = btScalar(1.);
- btVector3 sv = localGetSupportVertexWithoutMarginNonVirtual(vec*t.getBasis());
+ btVector3 sv = localGetSupportVertexWithoutMarginNonVirtual(vec * t.getBasis());
- btVector3 tmp = t(sv);
- aabbMax[i] = tmp[i]+margin;
- vec[i] = btScalar(-1.);
- tmp = t(localGetSupportVertexWithoutMarginNonVirtual(vec*t.getBasis()));
- aabbMin[i] = tmp[i]-margin;
- }
- }
- break;
- case CAPSULE_SHAPE_PROXYTYPE:
- {
- btCapsuleShape* capsuleShape = (btCapsuleShape*)this;
- btVector3 halfExtents(capsuleShape->getRadius(),capsuleShape->getRadius(),capsuleShape->getRadius());
- int m_upAxis = capsuleShape->getUpAxis();
- halfExtents[m_upAxis] = capsuleShape->getRadius() + capsuleShape->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;
- }
- break;
- case CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE:
- case CONVEX_HULL_SHAPE_PROXYTYPE:
- {
- btPolyhedralConvexAabbCachingShape* convexHullShape = (btPolyhedralConvexAabbCachingShape*)this;
- btScalar margin = convexHullShape->getMarginNonVirtual();
- convexHullShape->getNonvirtualAabb (t, aabbMin, aabbMax, margin);
- }
- break;
- default:
+ btVector3 tmp = t(sv);
+ aabbMax[i] = tmp[i] + margin;
+ vec[i] = btScalar(-1.);
+ tmp = t(localGetSupportVertexWithoutMarginNonVirtual(vec * t.getBasis()));
+ aabbMin[i] = tmp[i] - margin;
+ }
+ }
+ break;
+ case CAPSULE_SHAPE_PROXYTYPE:
+ {
+ btCapsuleShape* capsuleShape = (btCapsuleShape*)this;
+ btVector3 halfExtents(capsuleShape->getRadius(), capsuleShape->getRadius(), capsuleShape->getRadius());
+ int m_upAxis = capsuleShape->getUpAxis();
+ halfExtents[m_upAxis] = capsuleShape->getRadius() + capsuleShape->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;
+ }
+ break;
+ case CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE:
+ case CONVEX_HULL_SHAPE_PROXYTYPE:
+ {
+ btPolyhedralConvexAabbCachingShape* convexHullShape = (btPolyhedralConvexAabbCachingShape*)this;
+ btScalar margin = convexHullShape->getMarginNonVirtual();
+ convexHullShape->getNonvirtualAabb(t, aabbMin, aabbMax, margin);
+ }
+ break;
+ default:
#ifndef __SPU__
- this->getAabb (t, aabbMin, aabbMax);
+ this->getAabb(t, aabbMin, aabbMax);
#else
- btAssert (0);
+ btAssert(0);
#endif
- break;
+ break;
}
// should never reach here
- btAssert (0);
+ btAssert(0);
}
-#endif //__SPU__
+#endif //__SPU__
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexShape.h
index 875f2ac195..d3b3ed816e 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexShape.h
@@ -28,58 +28,48 @@ subject to the following restrictions:
/// 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
+ATTRIBUTE_ALIGNED16(class)
+btConvexShape : public btCollisionShape
{
-
-
public:
-
BT_DECLARE_ALIGNED_ALLOCATOR();
- btConvexShape ();
+ btConvexShape();
virtual ~btConvexShape();
- virtual btVector3 localGetSupportingVertex(const btVector3& vec)const = 0;
-
- ////////
- #ifndef __SPU__
- virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const=0;
- #endif //#ifndef __SPU__
+ virtual btVector3 localGetSupportingVertex(const btVector3& vec) const = 0;
- 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;
+////////
+#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;
+ 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;
+ 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;
+ 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 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 setLocalScaling(const btVector3& scaling) = 0;
+ virtual const btVector3& getLocalScaling() const = 0;
- virtual void setMargin(btScalar margin)=0;
+ virtual void setMargin(btScalar margin) = 0;
- virtual btScalar getMargin() const=0;
+ virtual btScalar getMargin() const = 0;
- virtual int getNumPreferredPenetrationDirections() const=0;
-
- virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const=0;
+ virtual int getNumPreferredPenetrationDirections() const = 0;
-
-
-
+ virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const = 0;
};
-
-
-#endif //BT_CONVEX_SHAPE_INTERFACE1
+#endif //BT_CONVEX_SHAPE_INTERFACE1
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp
index 0f9ced554b..f6987cc760 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp
@@ -19,42 +19,37 @@ subject to the following restrictions:
#include "LinearMath/btQuaternion.h"
#include "BulletCollision/CollisionShapes/btStridingMeshInterface.h"
-
-btConvexTriangleMeshShape ::btConvexTriangleMeshShape (btStridingMeshInterface* meshInterface, bool calcAabb)
-: btPolyhedralConvexAabbCachingShape(), m_stridingMesh(meshInterface)
+btConvexTriangleMeshShape ::btConvexTriangleMeshShape(btStridingMeshInterface* meshInterface, bool calcAabb)
+ : btPolyhedralConvexAabbCachingShape(), m_stridingMesh(meshInterface)
{
m_shapeType = CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE;
- if ( calcAabb )
+ if (calcAabb)
recalcLocalAabb();
}
-
-
-
///It's not nice to have all this virtual function overhead, so perhaps we can also gather the points once
///but then we are duplicating
-class LocalSupportVertexCallback: public btInternalTriangleIndexCallback
+class LocalSupportVertexCallback : public btInternalTriangleIndexCallback
{
-
btVector3 m_supportVertexLocal;
-public:
+public:
btScalar m_maxDot;
btVector3 m_supportVecLocal;
LocalSupportVertexCallback(const btVector3& supportVecLocal)
- : m_supportVertexLocal(btScalar(0.),btScalar(0.),btScalar(0.)),
- m_maxDot(btScalar(-BT_LARGE_FLOAT)),
- m_supportVecLocal(supportVecLocal)
+ : m_supportVertexLocal(btScalar(0.), btScalar(0.), btScalar(0.)),
+ m_maxDot(btScalar(-BT_LARGE_FLOAT)),
+ m_supportVecLocal(supportVecLocal)
{
}
- virtual void internalProcessTriangleIndex(btVector3* triangle,int partId,int triangleIndex)
+ virtual void internalProcessTriangleIndex(btVector3* triangle, int partId, int triangleIndex)
{
(void)triangleIndex;
(void)partId;
- for (int i=0;i<3;i++)
+ for (int i = 0; i < 3; i++)
{
btScalar dot = m_supportVecLocal.dot(triangle[i]);
if (dot > m_maxDot)
@@ -64,99 +59,82 @@ public:
}
}
}
-
- btVector3 GetSupportVertexLocal()
+
+ btVector3 GetSupportVertexLocal()
{
return m_supportVertexLocal;
}
-
};
-
-
-
-
-btVector3 btConvexTriangleMeshShape::localGetSupportingVertexWithoutMargin(const btVector3& vec0)const
+btVector3 btConvexTriangleMeshShape::localGetSupportingVertexWithoutMargin(const btVector3& vec0) const
{
- btVector3 supVec(btScalar(0.),btScalar(0.),btScalar(0.));
+ btVector3 supVec(btScalar(0.), btScalar(0.), btScalar(0.));
btVector3 vec = vec0;
btScalar lenSqr = vec.length2();
if (lenSqr < btScalar(0.0001))
{
- vec.setValue(1,0,0);
- } else
+ vec.setValue(1, 0, 0);
+ }
+ else
{
- btScalar rlen = btScalar(1.) / btSqrt(lenSqr );
+ btScalar rlen = btScalar(1.) / btSqrt(lenSqr);
vec *= rlen;
}
- LocalSupportVertexCallback supportCallback(vec);
- btVector3 aabbMax(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
- m_stridingMesh->InternalProcessAllTriangles(&supportCallback,-aabbMax,aabbMax);
+ LocalSupportVertexCallback supportCallback(vec);
+ btVector3 aabbMax(btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT));
+ m_stridingMesh->InternalProcessAllTriangles(&supportCallback, -aabbMax, aabbMax);
supVec = supportCallback.GetSupportVertexLocal();
return supVec;
}
-void btConvexTriangleMeshShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const
+void btConvexTriangleMeshShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const
{
//use 'w' component of supportVerticesOut?
{
- for (int i=0;i<numVectors;i++)
+ for (int i = 0; i < numVectors; i++)
{
supportVerticesOut[i][3] = btScalar(-BT_LARGE_FLOAT);
}
}
-
- ///@todo: could do the batch inside the callback!
+ ///@todo: could do the batch inside the callback!
- for (int j=0;j<numVectors;j++)
+ for (int j = 0; j < numVectors; j++)
{
const btVector3& vec = vectors[j];
- LocalSupportVertexCallback supportCallback(vec);
- btVector3 aabbMax(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
- m_stridingMesh->InternalProcessAllTriangles(&supportCallback,-aabbMax,aabbMax);
+ LocalSupportVertexCallback supportCallback(vec);
+ btVector3 aabbMax(btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT));
+ m_stridingMesh->InternalProcessAllTriangles(&supportCallback, -aabbMax, aabbMax);
supportVerticesOut[j] = supportCallback.GetSupportVertexLocal();
}
-
}
-
-
-btVector3 btConvexTriangleMeshShape::localGetSupportingVertex(const btVector3& vec)const
+btVector3 btConvexTriangleMeshShape::localGetSupportingVertex(const btVector3& vec) const
{
btVector3 supVertex = localGetSupportingVertexWithoutMargin(vec);
- if ( getMargin()!=btScalar(0.) )
+ if (getMargin() != btScalar(0.))
{
btVector3 vecnorm = vec;
- if (vecnorm .length2() < (SIMD_EPSILON*SIMD_EPSILON))
+ if (vecnorm.length2() < (SIMD_EPSILON * SIMD_EPSILON))
{
- vecnorm.setValue(btScalar(-1.),btScalar(-1.),btScalar(-1.));
- }
+ vecnorm.setValue(btScalar(-1.), btScalar(-1.), btScalar(-1.));
+ }
vecnorm.normalize();
- supVertex+= getMargin() * vecnorm;
+ supVertex += getMargin() * vecnorm;
}
return supVertex;
}
-
-
-
-
-
-
-
-
//currently just for debugging (drawing), perhaps future support for algebraic continuous collision detection
//Please note that you can debug-draw btConvexTriangleMeshShape with the Raytracer Demo
-int btConvexTriangleMeshShape::getNumVertices() const
+int btConvexTriangleMeshShape::getNumVertices() const
{
//cache this?
return 0;
-
}
int btConvexTriangleMeshShape::getNumEdges() const
@@ -164,44 +142,40 @@ int btConvexTriangleMeshShape::getNumEdges() const
return 0;
}
-void btConvexTriangleMeshShape::getEdge(int ,btVector3& ,btVector3& ) const
+void btConvexTriangleMeshShape::getEdge(int, btVector3&, btVector3&) const
{
- btAssert(0);
+ btAssert(0);
}
-void btConvexTriangleMeshShape::getVertex(int ,btVector3& ) const
+void btConvexTriangleMeshShape::getVertex(int, btVector3&) const
{
btAssert(0);
}
-int btConvexTriangleMeshShape::getNumPlanes() const
+int btConvexTriangleMeshShape::getNumPlanes() const
{
return 0;
}
-void btConvexTriangleMeshShape::getPlane(btVector3& ,btVector3& ,int ) const
+void btConvexTriangleMeshShape::getPlane(btVector3&, btVector3&, int) const
{
btAssert(0);
}
//not yet
-bool btConvexTriangleMeshShape::isInside(const btVector3& ,btScalar ) const
+bool btConvexTriangleMeshShape::isInside(const btVector3&, btScalar) const
{
btAssert(0);
return false;
}
-
-
-void btConvexTriangleMeshShape::setLocalScaling(const btVector3& scaling)
+void btConvexTriangleMeshShape::setLocalScaling(const btVector3& scaling)
{
m_stridingMesh->setScaling(scaling);
-
+
recalcLocalAabb();
-
}
-
const btVector3& btConvexTriangleMeshShape::getLocalScaling() const
{
return m_stridingMesh->getScaling();
@@ -209,107 +183,101 @@ const btVector3& btConvexTriangleMeshShape::getLocalScaling() const
void btConvexTriangleMeshShape::calculatePrincipalAxisTransform(btTransform& principal, btVector3& inertia, btScalar& volume) const
{
- class CenterCallback: public btInternalTriangleIndexCallback
- {
- bool first;
- btVector3 ref;
- btVector3 sum;
- btScalar volume;
-
- public:
-
- CenterCallback() : first(true), ref(0, 0, 0), sum(0, 0, 0), volume(0)
- {
- }
-
- virtual void internalProcessTriangleIndex(btVector3* triangle, int partId, int triangleIndex)
- {
- (void) triangleIndex;
- (void) partId;
- if (first)
- {
- ref = triangle[0];
- first = false;
- }
- else
- {
- btScalar vol = btFabs((triangle[0] - ref).triple(triangle[1] - ref, triangle[2] - ref));
- sum += (btScalar(0.25) * vol) * ((triangle[0] + triangle[1] + triangle[2] + ref));
- volume += vol;
- }
- }
-
- btVector3 getCenter()
- {
- return (volume > 0) ? sum / volume : ref;
- }
-
- btScalar getVolume()
- {
- return volume * btScalar(1. / 6);
- }
-
- };
-
- class InertiaCallback: public btInternalTriangleIndexCallback
- {
- btMatrix3x3 sum;
- btVector3 center;
-
- public:
-
- InertiaCallback(btVector3& center) : sum(0, 0, 0, 0, 0, 0, 0, 0, 0), center(center)
- {
- }
-
- virtual void internalProcessTriangleIndex(btVector3* triangle, int partId, int triangleIndex)
- {
- (void) triangleIndex;
- (void) partId;
- btMatrix3x3 i;
- btVector3 a = triangle[0] - center;
- btVector3 b = triangle[1] - center;
- btVector3 c = triangle[2] - center;
- btScalar volNeg = -btFabs(a.triple(b, c)) * btScalar(1. / 6);
- for (int j = 0; j < 3; j++)
- {
- for (int k = 0; k <= j; k++)
- {
- i[j][k] = i[k][j] = volNeg * (btScalar(0.1) * (a[j] * a[k] + b[j] * b[k] + c[j] * c[k])
- + btScalar(0.05) * (a[j] * b[k] + a[k] * b[j] + a[j] * c[k] + a[k] * c[j] + b[j] * c[k] + b[k] * c[j]));
- }
- }
- btScalar i00 = -i[0][0];
- btScalar i11 = -i[1][1];
- btScalar i22 = -i[2][2];
- i[0][0] = i11 + i22;
- i[1][1] = i22 + i00;
- i[2][2] = i00 + i11;
- sum[0] += i[0];
- sum[1] += i[1];
- sum[2] += i[2];
- }
-
- btMatrix3x3& getInertia()
- {
- return sum;
- }
-
- };
-
- CenterCallback centerCallback;
- btVector3 aabbMax(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
- m_stridingMesh->InternalProcessAllTriangles(&centerCallback, -aabbMax, aabbMax);
- btVector3 center = centerCallback.getCenter();
- principal.setOrigin(center);
- volume = centerCallback.getVolume();
-
- InertiaCallback inertiaCallback(center);
- m_stridingMesh->InternalProcessAllTriangles(&inertiaCallback, -aabbMax, aabbMax);
-
- btMatrix3x3& i = inertiaCallback.getInertia();
- i.diagonalize(principal.getBasis(), btScalar(0.00001), 20);
- inertia.setValue(i[0][0], i[1][1], i[2][2]);
- inertia /= volume;
-}
+ class CenterCallback : public btInternalTriangleIndexCallback
+ {
+ bool first;
+ btVector3 ref;
+ btVector3 sum;
+ btScalar volume;
+
+ public:
+ CenterCallback() : first(true), ref(0, 0, 0), sum(0, 0, 0), volume(0)
+ {
+ }
+
+ virtual void internalProcessTriangleIndex(btVector3* triangle, int partId, int triangleIndex)
+ {
+ (void)triangleIndex;
+ (void)partId;
+ if (first)
+ {
+ ref = triangle[0];
+ first = false;
+ }
+ else
+ {
+ btScalar vol = btFabs((triangle[0] - ref).triple(triangle[1] - ref, triangle[2] - ref));
+ sum += (btScalar(0.25) * vol) * ((triangle[0] + triangle[1] + triangle[2] + ref));
+ volume += vol;
+ }
+ }
+ btVector3 getCenter()
+ {
+ return (volume > 0) ? sum / volume : ref;
+ }
+
+ btScalar getVolume()
+ {
+ return volume * btScalar(1. / 6);
+ }
+ };
+
+ class InertiaCallback : public btInternalTriangleIndexCallback
+ {
+ btMatrix3x3 sum;
+ btVector3 center;
+
+ public:
+ InertiaCallback(btVector3& center) : sum(0, 0, 0, 0, 0, 0, 0, 0, 0), center(center)
+ {
+ }
+
+ virtual void internalProcessTriangleIndex(btVector3* triangle, int partId, int triangleIndex)
+ {
+ (void)triangleIndex;
+ (void)partId;
+ btMatrix3x3 i;
+ btVector3 a = triangle[0] - center;
+ btVector3 b = triangle[1] - center;
+ btVector3 c = triangle[2] - center;
+ btScalar volNeg = -btFabs(a.triple(b, c)) * btScalar(1. / 6);
+ for (int j = 0; j < 3; j++)
+ {
+ for (int k = 0; k <= j; k++)
+ {
+ i[j][k] = i[k][j] = volNeg * (btScalar(0.1) * (a[j] * a[k] + b[j] * b[k] + c[j] * c[k]) + btScalar(0.05) * (a[j] * b[k] + a[k] * b[j] + a[j] * c[k] + a[k] * c[j] + b[j] * c[k] + b[k] * c[j]));
+ }
+ }
+ btScalar i00 = -i[0][0];
+ btScalar i11 = -i[1][1];
+ btScalar i22 = -i[2][2];
+ i[0][0] = i11 + i22;
+ i[1][1] = i22 + i00;
+ i[2][2] = i00 + i11;
+ sum[0] += i[0];
+ sum[1] += i[1];
+ sum[2] += i[2];
+ }
+
+ btMatrix3x3& getInertia()
+ {
+ return sum;
+ }
+ };
+
+ CenterCallback centerCallback;
+ btVector3 aabbMax(btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT));
+ m_stridingMesh->InternalProcessAllTriangles(&centerCallback, -aabbMax, aabbMax);
+ btVector3 center = centerCallback.getCenter();
+ principal.setOrigin(center);
+ volume = centerCallback.getVolume();
+
+ InertiaCallback inertiaCallback(center);
+ m_stridingMesh->InternalProcessAllTriangles(&inertiaCallback, -aabbMax, aabbMax);
+
+ btMatrix3x3& i = inertiaCallback.getInertia();
+ i.diagonalize(principal.getBasis(), btScalar(0.00001), 20);
+ inertia.setValue(i[0][0], i[1][1], i[2][2]);
+ inertia /= volume;
+}
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h
index f338865ca1..6dac9fff04 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h
@@ -15,24 +15,22 @@ subject to the following restrictions:
#ifndef BT_CONVEX_TRIANGLEMESH_SHAPE_H
#define BT_CONVEX_TRIANGLEMESH_SHAPE_H
-
#include "btPolyhedralConvexShape.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
-
+#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
+ATTRIBUTE_ALIGNED16(class)
+btConvexTriangleMeshShape : public btPolyhedralConvexAabbCachingShape
{
-
- class btStridingMeshInterface* m_stridingMesh;
+ class btStridingMeshInterface* m_stridingMesh;
public:
BT_DECLARE_ALIGNED_ALLOCATOR();
-
- btConvexTriangleMeshShape(btStridingMeshInterface* meshInterface, bool calcAabb = true);
- class btStridingMeshInterface* getMeshInterface()
+ btConvexTriangleMeshShape(btStridingMeshInterface * meshInterface, bool calcAabb = true);
+
+ class btStridingMeshInterface* getMeshInterface()
{
return m_stridingMesh;
}
@@ -40,24 +38,23 @@ public:
{
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;
-
+
+ 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 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 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 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
@@ -65,13 +62,7 @@ public:
///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;
-
+ void calculatePrincipalAxisTransform(btTransform & principal, btVector3 & inertia, btScalar & volume) const;
};
-
-
-#endif //BT_CONVEX_TRIANGLEMESH_SHAPE_H
-
-
-
+#endif //BT_CONVEX_TRIANGLEMESH_SHAPE_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btCylinderShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btCylinderShape.cpp
index 604b3fc770..66dbb8e53d 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btCylinderShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btCylinderShape.cpp
@@ -15,11 +15,11 @@ subject to the following restrictions:
#include "btCylinderShape.h"
-btCylinderShape::btCylinderShape (const btVector3& halfExtents)
-:btConvexInternalShape(),
-m_upAxis(1)
+btCylinderShape::btCylinderShape(const btVector3& halfExtents)
+ : btConvexInternalShape(),
+ m_upAxis(1)
{
- btVector3 margin(getMargin(),getMargin(),getMargin());
+ btVector3 margin(getMargin(), getMargin(), getMargin());
m_implicitShapeDimensions = (halfExtents * m_localScaling) - margin;
setSafeMargin(halfExtents);
@@ -27,30 +27,25 @@ m_upAxis(1)
m_shapeType = CYLINDER_SHAPE_PROXYTYPE;
}
-
-btCylinderShapeX::btCylinderShapeX (const btVector3& halfExtents)
-:btCylinderShape(halfExtents)
+btCylinderShapeX::btCylinderShapeX(const btVector3& halfExtents)
+ : btCylinderShape(halfExtents)
{
m_upAxis = 0;
-
}
-
-btCylinderShapeZ::btCylinderShapeZ (const btVector3& halfExtents)
-:btCylinderShape(halfExtents)
+btCylinderShapeZ::btCylinderShapeZ(const btVector3& halfExtents)
+ : btCylinderShape(halfExtents)
{
m_upAxis = 2;
-
}
-void btCylinderShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
+void btCylinderShape::getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
{
- btTransformAabb(getHalfExtentsWithoutMargin(),getMargin(),t,aabbMin,aabbMax);
+ btTransformAabb(getHalfExtentsWithoutMargin(), getMargin(), t, aabbMin, aabbMax);
}
-void btCylinderShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const
+void btCylinderShape::calculateLocalInertia(btScalar mass, btVector3& inertia) const
{
-
//Until Bullet 2.77 a box approximation was used, so uncomment this if you need backwards compatibility
//#define USE_BOX_INERTIA_APPROXIMATION 1
#ifndef USE_BOX_INERTIA_APPROXIMATION
@@ -64,25 +59,25 @@ void btCylinderShape::calculateLocalInertia(btScalar mass,btVector3& inertia) co
*
*/
- btScalar radius2; // square of cylinder radius
- btScalar height2; // square of cylinder height
- btVector3 halfExtents = getHalfExtentsWithMargin(); // get cylinder dimension
+ btScalar radius2; // square of cylinder radius
+ btScalar height2; // square of cylinder height
+ btVector3 halfExtents = getHalfExtentsWithMargin(); // get cylinder dimension
btScalar div12 = mass / 12.f;
btScalar div4 = mass / 4.f;
btScalar div2 = mass / 2.f;
int idxRadius, idxHeight;
- switch (m_upAxis) // get indices of radius and height of cylinder
+ switch (m_upAxis) // get indices of radius and height of cylinder
{
- case 0: // cylinder is aligned along x
+ case 0: // cylinder is aligned along x
idxRadius = 1;
idxHeight = 0;
break;
- case 2: // cylinder is aligned along z
+ case 2: // cylinder is aligned along z
idxRadius = 0;
idxHeight = 2;
break;
- default: // cylinder is aligned along y
+ default: // cylinder is aligned along y
idxRadius = 0;
idxHeight = 1;
}
@@ -95,188 +90,164 @@ void btCylinderShape::calculateLocalInertia(btScalar mass,btVector3& inertia) co
btScalar t1 = div12 * height2 + div4 * radius2;
btScalar t2 = div2 * radius2;
- switch (m_upAxis) // set diagonal elements of inertia tensor
+ switch (m_upAxis) // set diagonal elements of inertia tensor
{
- case 0: // cylinder is aligned along x
- inertia.setValue(t2,t1,t1);
+ case 0: // cylinder is aligned along x
+ inertia.setValue(t2, t1, t1);
break;
- case 2: // cylinder is aligned along z
- inertia.setValue(t1,t1,t2);
+ case 2: // cylinder is aligned along z
+ inertia.setValue(t1, t1, t2);
break;
- default: // cylinder is aligned along y
- inertia.setValue(t1,t2,t1);
+ default: // cylinder is aligned along y
+ inertia.setValue(t1, t2, t1);
}
-#else //USE_BOX_INERTIA_APPROXIMATION
+#else //USE_BOX_INERTIA_APPROXIMATION
//approximation of box shape
btVector3 halfExtents = getHalfExtentsWithMargin();
- btScalar lx=btScalar(2.)*(halfExtents.x());
- btScalar ly=btScalar(2.)*(halfExtents.y());
- btScalar lz=btScalar(2.)*(halfExtents.z());
+ btScalar lx = btScalar(2.) * (halfExtents.x());
+ btScalar ly = btScalar(2.) * (halfExtents.y());
+ btScalar lz = btScalar(2.) * (halfExtents.z());
- inertia.setValue(mass/(btScalar(12.0)) * (ly*ly + lz*lz),
- mass/(btScalar(12.0)) * (lx*lx + lz*lz),
- mass/(btScalar(12.0)) * (lx*lx + ly*ly));
-#endif //USE_BOX_INERTIA_APPROXIMATION
+ inertia.setValue(mass / (btScalar(12.0)) * (ly * ly + lz * lz),
+ mass / (btScalar(12.0)) * (lx * lx + lz * lz),
+ mass / (btScalar(12.0)) * (lx * lx + ly * ly));
+#endif //USE_BOX_INERTIA_APPROXIMATION
}
-
-SIMD_FORCE_INLINE btVector3 CylinderLocalSupportX(const btVector3& halfExtents,const btVector3& v)
+SIMD_FORCE_INLINE btVector3 CylinderLocalSupportX(const btVector3& halfExtents, const btVector3& v)
{
-const int cylinderUpAxis = 0;
-const int XX = 1;
-const int YY = 0;
-const int ZZ = 2;
+ const int cylinderUpAxis = 0;
+ const int XX = 1;
+ const int YY = 0;
+ const int ZZ = 2;
//mapping depends on how cylinder local orientation is
// extents of the cylinder is: X,Y is for radius, and Z for height
-
btScalar radius = halfExtents[XX];
btScalar halfHeight = halfExtents[cylinderUpAxis];
+ btVector3 tmp;
+ btScalar d;
- btVector3 tmp;
- btScalar d ;
-
- btScalar s = btSqrt(v[XX] * v[XX] + v[ZZ] * v[ZZ]);
- if (s != btScalar(0.0))
+ btScalar s = btSqrt(v[XX] * v[XX] + v[ZZ] * v[ZZ]);
+ if (s != btScalar(0.0))
{
- d = radius / s;
+ d = radius / s;
tmp[XX] = v[XX] * d;
tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight;
tmp[ZZ] = v[ZZ] * d;
return tmp;
}
- else
+ else
{
- tmp[XX] = radius;
+ tmp[XX] = radius;
tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight;
tmp[ZZ] = btScalar(0.0);
return tmp;
- }
-
-
+ }
}
-
-
-
-
-
-inline btVector3 CylinderLocalSupportY(const btVector3& halfExtents,const btVector3& v)
+inline btVector3 CylinderLocalSupportY(const btVector3& halfExtents, const btVector3& v)
{
-
-const int cylinderUpAxis = 1;
-const int XX = 0;
-const int YY = 1;
-const int ZZ = 2;
-
+ const int cylinderUpAxis = 1;
+ const int XX = 0;
+ const int YY = 1;
+ const int ZZ = 2;
btScalar radius = halfExtents[XX];
btScalar halfHeight = halfExtents[cylinderUpAxis];
+ btVector3 tmp;
+ btScalar d;
- btVector3 tmp;
- btScalar d ;
-
- btScalar s = btSqrt(v[XX] * v[XX] + v[ZZ] * v[ZZ]);
- if (s != btScalar(0.0))
+ btScalar s = btSqrt(v[XX] * v[XX] + v[ZZ] * v[ZZ]);
+ if (s != btScalar(0.0))
{
- d = radius / s;
+ d = radius / s;
tmp[XX] = v[XX] * d;
tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight;
tmp[ZZ] = v[ZZ] * d;
return tmp;
}
- else
+ else
{
- tmp[XX] = radius;
+ tmp[XX] = radius;
tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight;
tmp[ZZ] = btScalar(0.0);
return tmp;
- }
-
+ }
}
-inline btVector3 CylinderLocalSupportZ(const btVector3& halfExtents,const btVector3& v)
+inline btVector3 CylinderLocalSupportZ(const btVector3& halfExtents, const btVector3& v)
{
-const int cylinderUpAxis = 2;
-const int XX = 0;
-const int YY = 2;
-const int ZZ = 1;
+ const int cylinderUpAxis = 2;
+ const int XX = 0;
+ const int YY = 2;
+ const int ZZ = 1;
//mapping depends on how cylinder local orientation is
// extents of the cylinder is: X,Y is for radius, and Z for height
-
btScalar radius = halfExtents[XX];
btScalar halfHeight = halfExtents[cylinderUpAxis];
+ btVector3 tmp;
+ btScalar d;
- btVector3 tmp;
- btScalar d ;
-
- btScalar s = btSqrt(v[XX] * v[XX] + v[ZZ] * v[ZZ]);
- if (s != btScalar(0.0))
+ btScalar s = btSqrt(v[XX] * v[XX] + v[ZZ] * v[ZZ]);
+ if (s != btScalar(0.0))
{
- d = radius / s;
+ d = radius / s;
tmp[XX] = v[XX] * d;
tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight;
tmp[ZZ] = v[ZZ] * d;
return tmp;
}
- else
+ else
{
- tmp[XX] = radius;
+ tmp[XX] = radius;
tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight;
tmp[ZZ] = btScalar(0.0);
return tmp;
- }
-
-
+ }
}
-btVector3 btCylinderShapeX::localGetSupportingVertexWithoutMargin(const btVector3& vec)const
+btVector3 btCylinderShapeX::localGetSupportingVertexWithoutMargin(const btVector3& vec) const
{
- return CylinderLocalSupportX(getHalfExtentsWithoutMargin(),vec);
+ return CylinderLocalSupportX(getHalfExtentsWithoutMargin(), vec);
}
-
-btVector3 btCylinderShapeZ::localGetSupportingVertexWithoutMargin(const btVector3& vec)const
+btVector3 btCylinderShapeZ::localGetSupportingVertexWithoutMargin(const btVector3& vec) const
{
- return CylinderLocalSupportZ(getHalfExtentsWithoutMargin(),vec);
+ return CylinderLocalSupportZ(getHalfExtentsWithoutMargin(), vec);
}
-btVector3 btCylinderShape::localGetSupportingVertexWithoutMargin(const btVector3& vec)const
+btVector3 btCylinderShape::localGetSupportingVertexWithoutMargin(const btVector3& vec) const
{
- return CylinderLocalSupportY(getHalfExtentsWithoutMargin(),vec);
+ return CylinderLocalSupportY(getHalfExtentsWithoutMargin(), vec);
}
-void btCylinderShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const
+void btCylinderShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const
{
- for (int i=0;i<numVectors;i++)
+ for (int i = 0; i < numVectors; i++)
{
- supportVerticesOut[i] = CylinderLocalSupportY(getHalfExtentsWithoutMargin(),vectors[i]);
+ supportVerticesOut[i] = CylinderLocalSupportY(getHalfExtentsWithoutMargin(), vectors[i]);
}
}
-void btCylinderShapeZ::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const
+void btCylinderShapeZ::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const
{
- for (int i=0;i<numVectors;i++)
+ for (int i = 0; i < numVectors; i++)
{
- supportVerticesOut[i] = CylinderLocalSupportZ(getHalfExtentsWithoutMargin(),vectors[i]);
+ supportVerticesOut[i] = CylinderLocalSupportZ(getHalfExtentsWithoutMargin(), vectors[i]);
}
}
-
-
-
-void btCylinderShapeX::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const
+void btCylinderShapeX::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const
{
- for (int i=0;i<numVectors;i++)
+ for (int i = 0; i < numVectors; i++)
{
- supportVerticesOut[i] = CylinderLocalSupportX(getHalfExtentsWithoutMargin(),vectors[i]);
+ supportVerticesOut[i] = CylinderLocalSupportX(getHalfExtentsWithoutMargin(), vectors[i]);
}
}
-
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btCylinderShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btCylinderShape.h
index a214a827c9..d3f64508ba 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btCylinderShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btCylinderShape.h
@@ -17,90 +17,84 @@ subject to the following restrictions:
#define BT_CYLINDER_MINKOWSKI_H
#include "btBoxShape.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
+#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
+ATTRIBUTE_ALIGNED16(class)
+btCylinderShape : public btConvexInternalShape
{
-
protected:
-
- int m_upAxis;
+ int m_upAxis;
public:
-
-BT_DECLARE_ALIGNED_ALLOCATOR();
+ BT_DECLARE_ALIGNED_ALLOCATOR();
btVector3 getHalfExtentsWithMargin() const
{
btVector3 halfExtents = getHalfExtentsWithoutMargin();
- btVector3 margin(getMargin(),getMargin(),getMargin());
+ 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
+ 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;
+ btCylinderShape(const btVector3& halfExtents);
+
+ void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const;
- virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
+ virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const;
- virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const;
+ virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const;
- virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) 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;
-
+ btVector3 oldMargin(getMargin(), getMargin(), getMargin());
+ btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions + oldMargin;
+
btConvexInternalShape::setMargin(collisionMargin);
- btVector3 newMargin(getMargin(),getMargin(),getMargin());
+ btVector3 newMargin(getMargin(), getMargin(), getMargin());
m_implicitShapeDimensions = implicitShapeDimensionsWithMargin - newMargin;
-
}
- virtual btVector3 localGetSupportingVertex(const btVector3& vec) const
+ virtual btVector3 localGetSupportingVertex(const btVector3& vec) const
{
-
btVector3 supVertex;
supVertex = localGetSupportingVertexWithoutMargin(vec);
-
- if ( getMargin()!=btScalar(0.) )
+
+ if (getMargin() != btScalar(0.))
{
btVector3 vecnorm = vec;
- if (vecnorm .length2() < (SIMD_EPSILON*SIMD_EPSILON))
+ if (vecnorm.length2() < (SIMD_EPSILON * SIMD_EPSILON))
{
- vecnorm.setValue(btScalar(-1.),btScalar(-1.),btScalar(-1.));
- }
+ vecnorm.setValue(btScalar(-1.), btScalar(-1.), btScalar(-1.));
+ }
vecnorm.normalize();
- supVertex+= getMargin() * vecnorm;
+ supVertex += getMargin() * vecnorm;
}
return supVertex;
}
-
//use box inertia
// virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
-
- int getUpAxis() const
+ int getUpAxis() const
{
return m_upAxis;
}
- virtual btVector3 getAnisotropicRollingFrictionDirection() const
+ virtual btVector3 getAnisotropicRollingFrictionDirection() const
{
- btVector3 aniDir(0,0,0);
- aniDir[getUpAxis()]=1;
+ btVector3 aniDir(0, 0, 0);
+ aniDir[getUpAxis()] = 1;
return aniDir;
}
@@ -109,43 +103,41 @@ BT_DECLARE_ALIGNED_ALLOCATOR();
return getHalfExtentsWithMargin().getX();
}
- virtual void setLocalScaling(const btVector3& scaling)
+ virtual void setLocalScaling(const btVector3& scaling)
{
- btVector3 oldMargin(getMargin(),getMargin(),getMargin());
- btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions+oldMargin;
+ 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
+ virtual const char* getName() const
{
return "CylinderY";
}
- virtual int calculateSerializeBufferSize() 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;
-
+ 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
+
+ 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";
}
@@ -154,21 +146,20 @@ public:
{
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;
+ 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
+ //debugging
+ virtual const char* getName() const
{
return "CylinderZ";
}
@@ -177,30 +168,29 @@ public:
{
return getHalfExtentsWithMargin().getX();
}
-
};
///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
-struct btCylinderShapeData
+struct btCylinderShapeData
{
- btConvexInternalShapeData m_convexInternalShapeData;
+ btConvexInternalShapeData m_convexInternalShapeData;
- int m_upAxis;
+ int m_upAxis;
- char m_padding[4];
+ char m_padding[4];
};
-SIMD_FORCE_INLINE int btCylinderShape::calculateSerializeBufferSize() const
+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
+///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;
+ btCylinderShapeData* shapeData = (btCylinderShapeData*)dataBuffer;
- btConvexInternalShape::serialize(&shapeData->m_convexInternalShapeData,serializer);
+ btConvexInternalShape::serialize(&shapeData->m_convexInternalShapeData, serializer);
shapeData->m_upAxis = m_upAxis;
@@ -213,7 +203,4 @@ SIMD_FORCE_INLINE const char* btCylinderShape::serialize(void* dataBuffer, btSer
return "btCylinderShapeData";
}
-
-
-#endif //BT_CYLINDER_MINKOWSKI_H
-
+#endif //BT_CYLINDER_MINKOWSKI_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btEmptyShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btEmptyShape.cpp
index a9e6df5c58..4699555bd8 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btEmptyShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btEmptyShape.cpp
@@ -15,36 +15,28 @@ subject to the following restrictions:
#include "btEmptyShape.h"
-
#include "btCollisionShape.h"
-
-btEmptyShape::btEmptyShape() : btConcaveShape ()
+btEmptyShape::btEmptyShape() : btConcaveShape()
{
m_shapeType = EMPTY_SHAPE_PROXYTYPE;
}
-
btEmptyShape::~btEmptyShape()
{
}
-
- ///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version
-void btEmptyShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
+///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version
+void btEmptyShape::getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
{
- btVector3 margin(getMargin(),getMargin(),getMargin());
+ btVector3 margin(getMargin(), getMargin(), getMargin());
aabbMin = t.getOrigin() - margin;
aabbMax = t.getOrigin() + margin;
-
}
-void btEmptyShape::calculateLocalInertia(btScalar ,btVector3& ) const
+void btEmptyShape::calculateLocalInertia(btScalar, btVector3&) const
{
btAssert(0);
}
-
-
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btEmptyShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btEmptyShape.h
index 069a79402b..d2e21173b2 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btEmptyShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btEmptyShape.h
@@ -23,50 +23,43 @@ subject to the following restrictions:
#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
+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;
+ void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const;
-
- virtual void setLocalScaling(const btVector3& scaling)
+ virtual void setLocalScaling(const btVector3& scaling)
{
m_localScaling = scaling;
}
- virtual const btVector3& getLocalScaling() const
+ virtual const btVector3& getLocalScaling() const
{
return m_localScaling;
}
- virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
-
- virtual const char* getName()const
+ virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const;
+
+ virtual const char* getName() const
{
return "Empty";
}
- virtual void processAllTriangles(btTriangleCallback* ,const btVector3& ,const btVector3& ) const
+ virtual void processAllTriangles(btTriangleCallback*, const btVector3&, const btVector3&) const
{
}
protected:
- btVector3 m_localScaling;
-
+ btVector3 m_localScaling;
};
-
-
-#endif //BT_EMPTY_SHAPE_H
+#endif //BT_EMPTY_SHAPE_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp
index 441a89c6bb..c85ce2498e 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp
@@ -17,23 +17,17 @@ subject to the following restrictions:
#include "LinearMath/btTransformUtil.h"
-
-
-btHeightfieldTerrainShape::btHeightfieldTerrainShape
-(
-int heightStickWidth, int heightStickLength, const void* heightfieldData,
-btScalar heightScale, btScalar minHeight, btScalar maxHeight,int upAxis,
-PHY_ScalarType hdt, bool flipQuadEdges
-)
+btHeightfieldTerrainShape::btHeightfieldTerrainShape(
+ int heightStickWidth, int heightStickLength, const void* heightfieldData,
+ btScalar heightScale, btScalar minHeight, btScalar maxHeight, int upAxis,
+ PHY_ScalarType hdt, bool flipQuadEdges)
{
initialize(heightStickWidth, heightStickLength, heightfieldData,
- heightScale, minHeight, maxHeight, upAxis, hdt,
- flipQuadEdges);
+ heightScale, minHeight, maxHeight, upAxis, hdt,
+ flipQuadEdges);
}
-
-
-btHeightfieldTerrainShape::btHeightfieldTerrainShape(int heightStickWidth, int heightStickLength,const void* heightfieldData,btScalar maxHeight,int upAxis,bool useFloatData,bool flipQuadEdges)
+btHeightfieldTerrainShape::btHeightfieldTerrainShape(int heightStickWidth, int heightStickLength, const void* heightfieldData, btScalar maxHeight, int upAxis, bool useFloatData, bool flipQuadEdges)
{
// legacy constructor: support only float or unsigned char,
// and min height is zero
@@ -45,27 +39,23 @@ btHeightfieldTerrainShape::btHeightfieldTerrainShape(int heightStickWidth, int h
btScalar heightScale = maxHeight / 65535;
initialize(heightStickWidth, heightStickLength, heightfieldData,
- heightScale, minHeight, maxHeight, upAxis, hdt,
- flipQuadEdges);
+ heightScale, minHeight, maxHeight, upAxis, hdt,
+ flipQuadEdges);
}
-
-
-void btHeightfieldTerrainShape::initialize
-(
-int heightStickWidth, int heightStickLength, const void* heightfieldData,
-btScalar heightScale, btScalar minHeight, btScalar maxHeight, int upAxis,
-PHY_ScalarType hdt, bool flipQuadEdges
-)
+void btHeightfieldTerrainShape::initialize(
+ int heightStickWidth, int heightStickLength, const void* heightfieldData,
+ btScalar heightScale, btScalar minHeight, btScalar maxHeight, int upAxis,
+ PHY_ScalarType hdt, bool flipQuadEdges)
{
// validation
- btAssert(heightStickWidth > 1);// && "bad width");
- btAssert(heightStickLength > 1);// && "bad length");
- btAssert(heightfieldData);// && "null heightfield data");
+ btAssert(heightStickWidth > 1); // && "bad width");
+ btAssert(heightStickLength > 1); // && "bad length");
+ btAssert(heightfieldData); // && "null heightfield data");
// btAssert(heightScale) -- do we care? Trust caller here
- btAssert(minHeight <= maxHeight);// && "bad min/max height");
- btAssert(upAxis >= 0 && upAxis < 3);// && "bad upAxis--should be in range [0,2]");
- btAssert(hdt != PHY_UCHAR || hdt != PHY_FLOAT || hdt != PHY_SHORT);// && "Bad height data type enum");
+ btAssert(minHeight <= maxHeight); // && "bad min/max height");
+ btAssert(upAxis >= 0 && upAxis < 3); // && "bad upAxis--should be in range [0,2]");
+ btAssert(hdt != PHY_UCHAR || hdt != PHY_FLOAT || hdt != PHY_SHORT); // && "Bad height data type enum");
// initialize member variables
m_shapeType = TERRAIN_SHAPE_PROXYTYPE;
@@ -73,8 +63,8 @@ PHY_ScalarType hdt, bool flipQuadEdges
m_heightStickLength = heightStickLength;
m_minHeight = minHeight;
m_maxHeight = maxHeight;
- m_width = (btScalar) (heightStickWidth - 1);
- m_length = (btScalar) (heightStickLength - 1);
+ m_width = (btScalar)(heightStickWidth - 1);
+ m_length = (btScalar)(heightStickLength - 1);
m_heightScale = heightScale;
m_heightfieldDataUnknown = heightfieldData;
m_heightDataType = hdt;
@@ -87,28 +77,28 @@ PHY_ScalarType hdt, bool flipQuadEdges
// determine min/max axis-aligned bounding box (aabb) values
switch (m_upAxis)
{
- case 0:
+ case 0:
{
m_localAabbMin.setValue(m_minHeight, 0, 0);
m_localAabbMax.setValue(m_maxHeight, m_width, m_length);
break;
}
- case 1:
+ case 1:
{
m_localAabbMin.setValue(0, m_minHeight, 0);
m_localAabbMax.setValue(m_width, m_maxHeight, m_length);
break;
};
- case 2:
+ case 2:
{
m_localAabbMin.setValue(0, 0, m_minHeight);
m_localAabbMax.setValue(m_width, m_length, m_maxHeight);
break;
}
- default:
+ default:
{
//need to get valid m_upAxis
- btAssert(0);// && "Bad m_upAxis");
+ btAssert(0); // && "Bad m_upAxis");
}
}
@@ -116,62 +106,57 @@ PHY_ScalarType hdt, bool flipQuadEdges
m_localOrigin = btScalar(0.5) * (m_localAabbMin + m_localAabbMax);
}
-
-
btHeightfieldTerrainShape::~btHeightfieldTerrainShape()
{
}
-
-
-void btHeightfieldTerrainShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
+void btHeightfieldTerrainShape::getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
{
- btVector3 halfExtents = (m_localAabbMax-m_localAabbMin)* m_localScaling * btScalar(0.5);
+ btVector3 halfExtents = (m_localAabbMax - m_localAabbMin) * m_localScaling * btScalar(0.5);
btVector3 localOrigin(0, 0, 0);
localOrigin[m_upAxis] = (m_minHeight + m_maxHeight) * btScalar(0.5);
localOrigin *= m_localScaling;
- btMatrix3x3 abs_b = t.getBasis().absolute();
+ btMatrix3x3 abs_b = t.getBasis().absolute();
btVector3 center = t.getOrigin();
- btVector3 extent = halfExtents.dot3(abs_b[0], abs_b[1], abs_b[2]);
- extent += btVector3(getMargin(),getMargin(),getMargin());
+ btVector3 extent = halfExtents.dot3(abs_b[0], abs_b[1], abs_b[2]);
+ extent += btVector3(getMargin(), getMargin(), getMargin());
aabbMin = center - extent;
aabbMax = center + extent;
}
-
/// This returns the "raw" (user's initial) height, not the actual height.
/// The actual height needs to be adjusted to be relative to the center
/// of the heightfield's AABB.
btScalar
-btHeightfieldTerrainShape::getRawHeightFieldValue(int x,int y) const
+btHeightfieldTerrainShape::getRawHeightFieldValue(int x, int y) const
{
btScalar val = 0.f;
switch (m_heightDataType)
{
- case PHY_FLOAT:
+ case PHY_FLOAT:
{
- val = m_heightfieldDataFloat[(y*m_heightStickWidth)+x];
+ val = m_heightfieldDataFloat[(y * m_heightStickWidth) + x];
break;
}
- case PHY_UCHAR:
+ case PHY_UCHAR:
{
- unsigned char heightFieldValue = m_heightfieldDataUnsignedChar[(y*m_heightStickWidth)+x];
+ unsigned char heightFieldValue = m_heightfieldDataUnsignedChar[(y * m_heightStickWidth) + x];
val = heightFieldValue * m_heightScale;
break;
}
- case PHY_SHORT:
+ case PHY_SHORT:
{
short hfValue = m_heightfieldDataShort[(y * m_heightStickWidth) + x];
val = hfValue * m_heightScale;
break;
}
- default:
+ default:
{
btAssert(!"Bad m_heightDataType");
}
@@ -180,74 +165,63 @@ btHeightfieldTerrainShape::getRawHeightFieldValue(int x,int y) const
return val;
}
-
-
-
/// this returns the vertex in bullet-local coordinates
-void btHeightfieldTerrainShape::getVertex(int x,int y,btVector3& vertex) const
+void btHeightfieldTerrainShape::getVertex(int x, int y, btVector3& vertex) const
{
- btAssert(x>=0);
- btAssert(y>=0);
- btAssert(x<m_heightStickWidth);
- btAssert(y<m_heightStickLength);
+ btAssert(x >= 0);
+ btAssert(y >= 0);
+ btAssert(x < m_heightStickWidth);
+ btAssert(y < m_heightStickLength);
- btScalar height = getRawHeightFieldValue(x,y);
+ btScalar height = getRawHeightFieldValue(x, y);
switch (m_upAxis)
{
- case 0:
+ case 0:
{
- vertex.setValue(
- height - m_localOrigin.getX(),
- (-m_width/btScalar(2.0)) + x,
- (-m_length/btScalar(2.0) ) + y
- );
+ vertex.setValue(
+ height - m_localOrigin.getX(),
+ (-m_width / btScalar(2.0)) + x,
+ (-m_length / btScalar(2.0)) + y);
break;
}
- case 1:
+ case 1:
{
vertex.setValue(
- (-m_width/btScalar(2.0)) + x,
- height - m_localOrigin.getY(),
- (-m_length/btScalar(2.0)) + y
- );
+ (-m_width / btScalar(2.0)) + x,
+ height - m_localOrigin.getY(),
+ (-m_length / btScalar(2.0)) + y);
break;
};
- case 2:
+ case 2:
{
vertex.setValue(
- (-m_width/btScalar(2.0)) + x,
- (-m_length/btScalar(2.0)) + y,
- height - m_localOrigin.getZ()
- );
+ (-m_width / btScalar(2.0)) + x,
+ (-m_length / btScalar(2.0)) + y,
+ height - m_localOrigin.getZ());
break;
}
- default:
+ default:
{
//need to get valid m_upAxis
btAssert(0);
}
}
- vertex*=m_localScaling;
+ vertex *= m_localScaling;
}
-
-
static inline int
-getQuantized
-(
-btScalar x
-)
+getQuantized(
+ btScalar x)
{
- if (x < 0.0) {
- return (int) (x - 0.5);
+ if (x < 0.0)
+ {
+ return (int)(x - 0.5);
}
- return (int) (x + 0.5);
+ return (int)(x + 0.5);
}
-
-
/// given input vector, return quantized version
/**
This routine is basically determining the gridpoint indices for a given
@@ -257,7 +231,7 @@ btScalar x
"with clamp" means that we restrict the point to be in the heightfield's
axis-aligned bounding box.
*/
-void btHeightfieldTerrainShape::quantizeWithClamp(int* out, const btVector3& point,int /*isMax*/) const
+void btHeightfieldTerrainShape::quantizeWithClamp(int* out, const btVector3& point, int /*isMax*/) const
{
btVector3 clampedPoint(point);
clampedPoint.setMax(m_localAabbMin);
@@ -266,11 +240,8 @@ void btHeightfieldTerrainShape::quantizeWithClamp(int* out, const btVector3& poi
out[0] = getQuantized(clampedPoint.getX());
out[1] = getQuantized(clampedPoint.getY());
out[2] = getQuantized(clampedPoint.getZ());
-
}
-
-
/// process all triangles within the provided axis-aligned bounding box
/**
basic algorithm:
@@ -278,128 +249,123 @@ void btHeightfieldTerrainShape::quantizeWithClamp(int* out, const btVector3& poi
- convert input aabb to a range of heightfield grid points (quantize)
- iterate over all triangles in that subset of the grid
*/
-void btHeightfieldTerrainShape::processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const
+void btHeightfieldTerrainShape::processAllTriangles(btTriangleCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax) const
{
// scale down the input aabb's so they are in local (non-scaled) coordinates
- btVector3 localAabbMin = aabbMin*btVector3(1.f/m_localScaling[0],1.f/m_localScaling[1],1.f/m_localScaling[2]);
- btVector3 localAabbMax = aabbMax*btVector3(1.f/m_localScaling[0],1.f/m_localScaling[1],1.f/m_localScaling[2]);
+ btVector3 localAabbMin = aabbMin * btVector3(1.f / m_localScaling[0], 1.f / m_localScaling[1], 1.f / m_localScaling[2]);
+ btVector3 localAabbMax = aabbMax * btVector3(1.f / m_localScaling[0], 1.f / m_localScaling[1], 1.f / m_localScaling[2]);
// account for local origin
localAabbMin += m_localOrigin;
localAabbMax += m_localOrigin;
//quantize the aabbMin and aabbMax, and adjust the start/end ranges
- int quantizedAabbMin[3];
- int quantizedAabbMax[3];
- quantizeWithClamp(quantizedAabbMin, localAabbMin,0);
- quantizeWithClamp(quantizedAabbMax, localAabbMax,1);
-
+ int quantizedAabbMin[3];
+ int quantizedAabbMax[3];
+ quantizeWithClamp(quantizedAabbMin, localAabbMin, 0);
+ quantizeWithClamp(quantizedAabbMax, localAabbMax, 1);
+
// expand the min/max quantized values
// this is to catch the case where the input aabb falls between grid points!
- for (int i = 0; i < 3; ++i) {
+ for (int i = 0; i < 3; ++i)
+ {
quantizedAabbMin[i]--;
quantizedAabbMax[i]++;
- }
+ }
- int startX=0;
- int endX=m_heightStickWidth-1;
- int startJ=0;
- int endJ=m_heightStickLength-1;
+ int startX = 0;
+ int endX = m_heightStickWidth - 1;
+ int startJ = 0;
+ int endJ = m_heightStickLength - 1;
switch (m_upAxis)
{
- case 0:
+ case 0:
{
- if (quantizedAabbMin[1]>startX)
+ if (quantizedAabbMin[1] > startX)
startX = quantizedAabbMin[1];
- if (quantizedAabbMax[1]<endX)
+ if (quantizedAabbMax[1] < endX)
endX = quantizedAabbMax[1];
- if (quantizedAabbMin[2]>startJ)
+ if (quantizedAabbMin[2] > startJ)
startJ = quantizedAabbMin[2];
- if (quantizedAabbMax[2]<endJ)
+ if (quantizedAabbMax[2] < endJ)
endJ = quantizedAabbMax[2];
break;
}
- case 1:
+ case 1:
{
- if (quantizedAabbMin[0]>startX)
+ if (quantizedAabbMin[0] > startX)
startX = quantizedAabbMin[0];
- if (quantizedAabbMax[0]<endX)
+ if (quantizedAabbMax[0] < endX)
endX = quantizedAabbMax[0];
- if (quantizedAabbMin[2]>startJ)
+ if (quantizedAabbMin[2] > startJ)
startJ = quantizedAabbMin[2];
- if (quantizedAabbMax[2]<endJ)
+ if (quantizedAabbMax[2] < endJ)
endJ = quantizedAabbMax[2];
break;
};
- case 2:
+ case 2:
{
- if (quantizedAabbMin[0]>startX)
+ if (quantizedAabbMin[0] > startX)
startX = quantizedAabbMin[0];
- if (quantizedAabbMax[0]<endX)
+ if (quantizedAabbMax[0] < endX)
endX = quantizedAabbMax[0];
- if (quantizedAabbMin[1]>startJ)
+ if (quantizedAabbMin[1] > startJ)
startJ = quantizedAabbMin[1];
- if (quantizedAabbMax[1]<endJ)
+ if (quantizedAabbMax[1] < endJ)
endJ = quantizedAabbMax[1];
break;
}
- default:
+ default:
{
//need to get valid m_upAxis
btAssert(0);
}
}
-
-
-
- for(int j=startJ; j<endJ; j++)
+ for (int j = startJ; j < endJ; j++)
{
- for(int x=startX; x<endX; x++)
+ for (int x = startX; x < endX; x++)
{
btVector3 vertices[3];
- if (m_flipQuadEdges || (m_useDiamondSubdivision && !((j+x) & 1))|| (m_useZigzagSubdivision && !(j & 1)))
+ if (m_flipQuadEdges || (m_useDiamondSubdivision && !((j + x) & 1)) || (m_useZigzagSubdivision && !(j & 1)))
{
- //first triangle
- getVertex(x,j,vertices[0]);
- getVertex(x, j + 1, vertices[1]);
- getVertex(x + 1, j + 1, vertices[2]);
- callback->processTriangle(vertices,x,j);
- //second triangle
- // getVertex(x,j,vertices[0]);//already got this vertex before, thanks to Danny Chapman
- getVertex(x+1,j+1,vertices[1]);
- getVertex(x + 1, j, vertices[2]);
- callback->processTriangle(vertices, x, j);
-
- } else
+ //first triangle
+ getVertex(x, j, vertices[0]);
+ getVertex(x, j + 1, vertices[1]);
+ getVertex(x + 1, j + 1, vertices[2]);
+ callback->processTriangle(vertices, x, j);
+ //second triangle
+ // getVertex(x,j,vertices[0]);//already got this vertex before, thanks to Danny Chapman
+ getVertex(x + 1, j + 1, vertices[1]);
+ getVertex(x + 1, j, vertices[2]);
+ callback->processTriangle(vertices, x, j);
+ }
+ else
{
- //first triangle
- getVertex(x,j,vertices[0]);
- getVertex(x,j+1,vertices[1]);
- getVertex(x+1,j,vertices[2]);
- callback->processTriangle(vertices,x,j);
- //second triangle
- getVertex(x+1,j,vertices[0]);
- //getVertex(x,j+1,vertices[1]);
- getVertex(x+1,j+1,vertices[2]);
- callback->processTriangle(vertices,x,j);
+ //first triangle
+ getVertex(x, j, vertices[0]);
+ getVertex(x, j + 1, vertices[1]);
+ getVertex(x + 1, j, vertices[2]);
+ callback->processTriangle(vertices, x, j);
+ //second triangle
+ getVertex(x + 1, j, vertices[0]);
+ //getVertex(x,j+1,vertices[1]);
+ getVertex(x + 1, j + 1, vertices[2]);
+ callback->processTriangle(vertices, x, j);
}
}
}
-
-
-
}
-void btHeightfieldTerrainShape::calculateLocalInertia(btScalar ,btVector3& inertia) const
+void btHeightfieldTerrainShape::calculateLocalInertia(btScalar, btVector3& inertia) const
{
//moving concave objects not supported
-
- inertia.setValue(btScalar(0.),btScalar(0.),btScalar(0.));
+
+ inertia.setValue(btScalar(0.), btScalar(0.), btScalar(0.));
}
-void btHeightfieldTerrainShape::setLocalScaling(const btVector3& scaling)
+void btHeightfieldTerrainShape::setLocalScaling(const btVector3& scaling)
{
m_localScaling = scaling;
}
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h
index 4a7a4a4bda..8a50a57e31 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h
@@ -68,43 +68,41 @@ subject to the following restrictions:
For usage and testing see the TerrainDemo.
*/
-ATTRIBUTE_ALIGNED16(class) btHeightfieldTerrainShape : public btConcaveShape
+ATTRIBUTE_ALIGNED16(class)
+btHeightfieldTerrainShape : public btConcaveShape
{
protected:
- btVector3 m_localAabbMin;
- btVector3 m_localAabbMax;
- btVector3 m_localOrigin;
+ btVector3 m_localAabbMin;
+ btVector3 m_localAabbMax;
+ btVector3 m_localOrigin;
///terrain data
- int m_heightStickWidth;
+ int m_heightStickWidth;
int m_heightStickLength;
- btScalar m_minHeight;
- btScalar m_maxHeight;
+ 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;
+ 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;
+ PHY_ScalarType m_heightDataType;
+ bool m_flipQuadEdges;
+ bool m_useDiamondSubdivision;
bool m_useZigzagSubdivision;
- int m_upAxis;
-
- btVector3 m_localScaling;
-
- virtual btScalar getRawHeightFieldValue(int x,int y) const;
- void quantizeWithClamp(int* out, const btVector3& point,int isMax) const;
- void getVertex(int x,int y,btVector3& vertex) const;
+ int m_upAxis;
+ btVector3 m_localScaling;
+ virtual btScalar getRawHeightFieldValue(int x, int y) const;
+ void quantizeWithClamp(int* out, const btVector3& point, int isMax) const;
+ void getVertex(int x, int y, btVector3& vertex) const;
/// protected initialization
/**
@@ -112,25 +110,24 @@ protected:
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);
+ 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);
+ btHeightfieldTerrainShape(int heightStickWidth, int heightStickLength,
+ const void* heightfieldData, btScalar heightScale,
+ btScalar minHeight, btScalar maxHeight,
+ int upAxis, PHY_ScalarType heightDataType,
+ bool flipQuadEdges);
/// legacy constructor
/**
@@ -139,29 +136,27 @@ public:
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);
+ 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; }
- 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; }
- ///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;}
+ virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const;
- 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 processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const;
+ virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const;
- virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
+ virtual void setLocalScaling(const btVector3& scaling);
- virtual void setLocalScaling(const btVector3& scaling);
-
virtual const btVector3& getLocalScaling() const;
-
- //debugging
- virtual const char* getName()const {return "HEIGHTFIELD";}
+ //debugging
+ virtual const char* getName() const { return "HEIGHTFIELD"; }
};
-#endif //BT_HEIGHTFIELD_TERRAIN_SHAPE_H
+#endif //BT_HEIGHTFIELD_TERRAIN_SHAPE_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btMaterial.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btMaterial.h
index 866f9b4da4..c9a436bf26 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btMaterial.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btMaterial.h
@@ -21,15 +21,18 @@ subject to the following restrictions:
// 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 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; }
+ 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
-
+#endif // BT_MATERIAL_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btMiniSDF.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btMiniSDF.cpp
index afe45e1d2d..13c0a343f1 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btMiniSDF.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btMiniSDF.cpp
@@ -10,31 +10,31 @@
//
#include <limits.h>
-#include <string.h> //memcpy
+#include <string.h> //memcpy
struct btSdfDataStream
{
const char* m_data;
int m_size;
-
+
int m_currentOffset;
-
+
btSdfDataStream(const char* data, int size)
- :m_data(data),
- m_size(size),
- m_currentOffset(0)
+ : m_data(data),
+ m_size(size),
+ m_currentOffset(0)
{
-
}
- template<class T> bool read(T& val)
+ template <class T>
+ bool read(T& val)
{
int bytes = sizeof(T);
- if (m_currentOffset+bytes<=m_size)
+ if (m_currentOffset + bytes <= m_size)
{
char* dest = (char*)&val;
- memcpy(dest,&m_data[m_currentOffset],bytes);
- m_currentOffset+=bytes;
+ memcpy(dest, &m_data[m_currentOffset], bytes);
+ m_currentOffset += bytes;
return true;
}
btAssert(0);
@@ -42,137 +42,133 @@ struct btSdfDataStream
}
};
-
bool btMiniSDF::load(const char* data, int size)
{
- int fileSize = -1;
+ int fileSize = -1;
- btSdfDataStream ds(data,size);
- {
- double buf[6];
- ds.read(buf);
- m_domain.m_min[0] = buf[0];
- m_domain.m_min[1] = buf[1];
- m_domain.m_min[2] = buf[2];
- m_domain.m_min[3] = 0;
- m_domain.m_max[0] = buf[3];
- m_domain.m_max[1] = buf[4];
- m_domain.m_max[2] = buf[5];
- m_domain.m_max[3] = 0;
- }
- {
- unsigned int buf2[3];
- ds.read(buf2);
- m_resolution[0] = buf2[0];
- m_resolution[1] = buf2[1];
- m_resolution[2] = buf2[2];
- }
- {
- double buf[3];
- ds.read(buf);
- m_cell_size[0] = buf[0];
- m_cell_size[1] = buf[1];
- m_cell_size[2] = buf[2];
- }
- {
- double buf[3];
- ds.read(buf);
- m_inv_cell_size[0] = buf[0];
- m_inv_cell_size[1] = buf[1];
- m_inv_cell_size[2] = buf[2];
- }
- {
- unsigned long long int cells;
- ds.read(cells);
- m_n_cells = cells;
- }
- {
- unsigned long long int fields;
- ds.read(fields);
- m_n_fields = fields;
- }
+ btSdfDataStream ds(data, size);
+ {
+ double buf[6];
+ ds.read(buf);
+ m_domain.m_min[0] = buf[0];
+ m_domain.m_min[1] = buf[1];
+ m_domain.m_min[2] = buf[2];
+ m_domain.m_min[3] = 0;
+ m_domain.m_max[0] = buf[3];
+ m_domain.m_max[1] = buf[4];
+ m_domain.m_max[2] = buf[5];
+ m_domain.m_max[3] = 0;
+ }
+ {
+ unsigned int buf2[3];
+ ds.read(buf2);
+ m_resolution[0] = buf2[0];
+ m_resolution[1] = buf2[1];
+ m_resolution[2] = buf2[2];
+ }
+ {
+ double buf[3];
+ ds.read(buf);
+ m_cell_size[0] = buf[0];
+ m_cell_size[1] = buf[1];
+ m_cell_size[2] = buf[2];
+ }
+ {
+ double buf[3];
+ ds.read(buf);
+ m_inv_cell_size[0] = buf[0];
+ m_inv_cell_size[1] = buf[1];
+ m_inv_cell_size[2] = buf[2];
+ }
+ {
+ unsigned long long int cells;
+ ds.read(cells);
+ m_n_cells = cells;
+ }
+ {
+ unsigned long long int fields;
+ ds.read(fields);
+ m_n_fields = fields;
+ }
-
- unsigned long long int nodes0;
- std::size_t n_nodes0;
- ds.read(nodes0);
- n_nodes0 = nodes0;
- if (n_nodes0 > 1024 * 1024 * 1024)
- {
- return m_isValid;
- }
- m_nodes.resize(n_nodes0);
- for (unsigned int i=0;i<n_nodes0;i++)
+ unsigned long long int nodes0;
+ std::size_t n_nodes0;
+ ds.read(nodes0);
+ n_nodes0 = nodes0;
+ if (n_nodes0 > 1024 * 1024 * 1024)
+ {
+ return m_isValid;
+ }
+ m_nodes.resize(n_nodes0);
+ for (unsigned int i = 0; i < n_nodes0; i++)
+ {
+ unsigned long long int n_nodes1;
+ ds.read(n_nodes1);
+ btAlignedObjectArray<double>& nodes = m_nodes[i];
+ nodes.resize(n_nodes1);
+ for (int j = 0; j < nodes.size(); j++)
{
- unsigned long long int n_nodes1;
- ds.read(n_nodes1);
- btAlignedObjectArray<double>& nodes = m_nodes[i];
- nodes.resize(n_nodes1);
- for ( int j=0;j<nodes.size();j++)
- {
- double& node = nodes[j];
- ds.read(node);
- }
+ double& node = nodes[j];
+ ds.read(node);
}
+ }
- unsigned long long int n_cells0;
- ds.read(n_cells0);
- m_cells.resize(n_cells0);
- for (int i=0;i<n_cells0;i++)
+ unsigned long long int n_cells0;
+ ds.read(n_cells0);
+ m_cells.resize(n_cells0);
+ for (int i = 0; i < n_cells0; i++)
+ {
+ unsigned long long int n_cells1;
+ btAlignedObjectArray<btCell32>& cells = m_cells[i];
+ ds.read(n_cells1);
+ cells.resize(n_cells1);
+ for (int j = 0; j < n_cells1; j++)
{
- unsigned long long int n_cells1;
- btAlignedObjectArray<btCell32 >& cells = m_cells[i];
- ds.read(n_cells1);
- cells.resize(n_cells1);
- for (int j=0;j<n_cells1;j++)
- {
- btCell32& cell = cells[j];
- ds.read(cell);
- }
+ btCell32& cell = cells[j];
+ ds.read(cell);
}
+ }
+
+ {
+ unsigned long long int n_cell_maps0;
+ ds.read(n_cell_maps0);
+ m_cell_map.resize(n_cell_maps0);
+ for (int i = 0; i < n_cell_maps0; i++)
{
- unsigned long long int n_cell_maps0;
- ds.read(n_cell_maps0);
-
- m_cell_map.resize(n_cell_maps0);
- for (int i=0;i<n_cell_maps0;i++)
+ unsigned long long int n_cell_maps1;
+ btAlignedObjectArray<unsigned int>& cell_maps = m_cell_map[i];
+ ds.read(n_cell_maps1);
+ cell_maps.resize(n_cell_maps1);
+ for (int j = 0; j < n_cell_maps1; j++)
{
- unsigned long long int n_cell_maps1;
- btAlignedObjectArray<unsigned int>& cell_maps = m_cell_map[i];
- ds.read(n_cell_maps1);
- cell_maps.resize(n_cell_maps1);
- for (int j=0;j<n_cell_maps1;j++)
- {
- unsigned int& cell_map = cell_maps[j];
- ds.read(cell_map);
- }
+ unsigned int& cell_map = cell_maps[j];
+ ds.read(cell_map);
}
}
+ }
- m_isValid = (ds.m_currentOffset == ds.m_size);
- return m_isValid;
+ m_isValid = (ds.m_currentOffset == ds.m_size);
+ return m_isValid;
}
-
-unsigned int btMiniSDF::multiToSingleIndex(btMultiIndex const & ijk) const
+unsigned int btMiniSDF::multiToSingleIndex(btMultiIndex const& ijk) const
{
return m_resolution[1] * m_resolution[0] * ijk.ijk[2] + m_resolution[0] * ijk.ijk[1] + ijk.ijk[0];
}
-
+
btAlignedBox3d
btMiniSDF::subdomain(btMultiIndex const& ijk) const
{
btAssert(m_isValid);
btVector3 tmp;
- tmp.m_floats[0] = m_cell_size[0]*(double)ijk.ijk[0];
- tmp.m_floats[1] = m_cell_size[1]*(double)ijk.ijk[1];
- tmp.m_floats[2] = m_cell_size[2]*(double)ijk.ijk[2];
-
+ tmp.m_floats[0] = m_cell_size[0] * (double)ijk.ijk[0];
+ tmp.m_floats[1] = m_cell_size[1] * (double)ijk.ijk[1];
+ tmp.m_floats[2] = m_cell_size[2] * (double)ijk.ijk[2];
btVector3 origin = m_domain.min() + tmp;
- btAlignedBox3d box = btAlignedBox3d (origin, origin + m_cell_size);
+ btAlignedBox3d box = btAlignedBox3d(origin, origin + m_cell_size);
return box;
}
@@ -181,8 +177,8 @@ btMiniSDF::singleToMultiIndex(unsigned int l) const
{
btAssert(m_isValid);
unsigned int n01 = m_resolution[0] * m_resolution[1];
- unsigned int k = l / n01;
- unsigned int temp = l % n01;
+ unsigned int k = l / n01;
+ unsigned int temp = l % n01;
unsigned int j = temp / m_resolution[0];
unsigned int i = temp % m_resolution[0];
btMultiIndex mi;
@@ -199,59 +195,57 @@ btMiniSDF::subdomain(unsigned int l) const
return subdomain(singleToMultiIndex(l));
}
-
btShapeMatrix
btMiniSDF::shape_function_(btVector3 const& xi, btShapeGradients* gradient) const
{
btAssert(m_isValid);
btShapeMatrix res;
-
+
btScalar x = xi[0];
btScalar y = xi[1];
btScalar z = xi[2];
- btScalar x2 = x*x;
- btScalar y2 = y*y;
- btScalar z2 = z*z;
-
- btScalar _1mx = 1.0 - x;
- btScalar _1my = 1.0 - y;
- btScalar _1mz = 1.0 - z;
+ btScalar x2 = x * x;
+ btScalar y2 = y * y;
+ btScalar z2 = z * z;
- btScalar _1px = 1.0 + x;
- btScalar _1py = 1.0 + y;
- btScalar _1pz = 1.0 + z;
+ btScalar _1mx = 1.0 - x;
+ btScalar _1my = 1.0 - y;
+ btScalar _1mz = 1.0 - z;
- btScalar _1m3x = 1.0 - 3.0 * x;
- btScalar _1m3y = 1.0 - 3.0 * y;
- btScalar _1m3z = 1.0 - 3.0 * z;
+ btScalar _1px = 1.0 + x;
+ btScalar _1py = 1.0 + y;
+ btScalar _1pz = 1.0 + z;
- btScalar _1p3x = 1.0 + 3.0 * x;
- btScalar _1p3y = 1.0 + 3.0 * y;
- btScalar _1p3z = 1.0 + 3.0 * z;
+ btScalar _1m3x = 1.0 - 3.0 * x;
+ btScalar _1m3y = 1.0 - 3.0 * y;
+ btScalar _1m3z = 1.0 - 3.0 * z;
- btScalar _1mxt1my = _1mx * _1my;
- btScalar _1mxt1py = _1mx * _1py;
- btScalar _1pxt1my = _1px * _1my;
- btScalar _1pxt1py = _1px * _1py;
+ btScalar _1p3x = 1.0 + 3.0 * x;
+ btScalar _1p3y = 1.0 + 3.0 * y;
+ btScalar _1p3z = 1.0 + 3.0 * z;
- btScalar _1mxt1mz = _1mx * _1mz;
- btScalar _1mxt1pz = _1mx * _1pz;
- btScalar _1pxt1mz = _1px * _1mz;
- btScalar _1pxt1pz = _1px * _1pz;
+ btScalar _1mxt1my = _1mx * _1my;
+ btScalar _1mxt1py = _1mx * _1py;
+ btScalar _1pxt1my = _1px * _1my;
+ btScalar _1pxt1py = _1px * _1py;
- btScalar _1myt1mz = _1my * _1mz;
- btScalar _1myt1pz = _1my * _1pz;
- btScalar _1pyt1mz = _1py * _1mz;
- btScalar _1pyt1pz = _1py * _1pz;
+ btScalar _1mxt1mz = _1mx * _1mz;
+ btScalar _1mxt1pz = _1mx * _1pz;
+ btScalar _1pxt1mz = _1px * _1mz;
+ btScalar _1pxt1pz = _1px * _1pz;
- btScalar _1mx2 = 1.0 - x2;
- btScalar _1my2 = 1.0 - y2;
- btScalar _1mz2 = 1.0 - z2;
+ btScalar _1myt1mz = _1my * _1mz;
+ btScalar _1myt1pz = _1my * _1pz;
+ btScalar _1pyt1mz = _1py * _1mz;
+ btScalar _1pyt1pz = _1py * _1pz;
+ btScalar _1mx2 = 1.0 - x2;
+ btScalar _1my2 = 1.0 - y2;
+ btScalar _1mz2 = 1.0 - z2;
// Corner nodes.
- btScalar fac = 1.0 / 64.0 * (9.0 * (x2 + y2 + z2) - 19.0);
+ btScalar fac = 1.0 / 64.0 * (9.0 * (x2 + y2 + z2) - 19.0);
res[0] = fac * _1mxt1my * _1mz;
res[1] = fac * _1pxt1my * _1mz;
res[2] = fac * _1mxt1py * _1mz;
@@ -264,10 +258,10 @@ btMiniSDF::shape_function_(btVector3 const& xi, btShapeGradients* gradient) cons
// Edge nodes.
fac = 9.0 / 64.0 * _1mx2;
- btScalar fact1m3x = fac * _1m3x;
- btScalar fact1p3x = fac * _1p3x;
- res[ 8] = fact1m3x * _1myt1mz;
- res[ 9] = fact1p3x * _1myt1mz;
+ btScalar fact1m3x = fac * _1m3x;
+ btScalar fact1p3x = fac * _1p3x;
+ res[8] = fact1m3x * _1myt1mz;
+ res[9] = fact1p3x * _1myt1mz;
res[10] = fact1m3x * _1myt1pz;
res[11] = fact1p3x * _1myt1pz;
res[12] = fact1m3x * _1pyt1mz;
@@ -276,8 +270,8 @@ btMiniSDF::shape_function_(btVector3 const& xi, btShapeGradients* gradient) cons
res[15] = fact1p3x * _1pyt1pz;
fac = 9.0 / 64.0 * _1my2;
- btScalar fact1m3y = fac * _1m3y;
- btScalar fact1p3y = fac * _1p3y;
+ btScalar fact1m3y = fac * _1m3y;
+ btScalar fact1p3y = fac * _1p3y;
res[16] = fact1m3y * _1mxt1mz;
res[17] = fact1p3y * _1mxt1mz;
res[18] = fact1m3y * _1pxt1mz;
@@ -288,8 +282,8 @@ btMiniSDF::shape_function_(btVector3 const& xi, btShapeGradients* gradient) cons
res[23] = fact1p3y * _1pxt1pz;
fac = 9.0 / 64.0 * _1mz2;
- btScalar fact1m3z = fac * _1m3z;
- btScalar fact1p3z = fac * _1p3z;
+ btScalar fact1m3z = fac * _1m3z;
+ btScalar fact1p3z = fac * _1p3z;
res[24] = fact1m3z * _1mxt1my;
res[25] = fact1p3z * _1mxt1my;
res[26] = fact1m3z * _1mxt1py;
@@ -309,7 +303,7 @@ btMiniSDF::shape_function_(btVector3 const& xi, btShapeGradients* gradient) cons
btScalar _18x = 18.0 * x;
btScalar _18y = 18.0 * y;
btScalar _18z = 18.0 * z;
-
+
btScalar _3m9x2 = 3.0 - 9.0 * x2;
btScalar _3m9y2 = 3.0 - 9.0 * y2;
btScalar _3m9z2 = 3.0 - 9.0 * z2;
@@ -325,132 +319,128 @@ btMiniSDF::shape_function_(btVector3 const& xi, btShapeGradients* gradient) cons
btScalar _18zm9tx2py2p3z2m19 = _18z - _9tx2py2p3z2m19;
btScalar _18zp9tx2py2p3z2m19 = _18z + _9tx2py2p3z2m19;
- dN(0,0) =_18xm9t3x2py2pz2m19 * _1myt1mz;
- dN(0,1) =_1mxt1mz * _18ym9tx2p3y2pz2m19;
- dN(0,2) =_1mxt1my * _18zm9tx2py2p3z2m19;
- dN(1,0) =_18xp9t3x2py2pz2m19 * _1myt1mz;
- dN(1,1) =_1pxt1mz * _18ym9tx2p3y2pz2m19;
- dN(1,2) =_1pxt1my * _18zm9tx2py2p3z2m19;
- dN(2,0) =_18xm9t3x2py2pz2m19 * _1pyt1mz;
- dN(2,1) =_1mxt1mz * _18yp9tx2p3y2pz2m19;
- dN(2,2) =_1mxt1py * _18zm9tx2py2p3z2m19;
- dN(3,0) =_18xp9t3x2py2pz2m19 * _1pyt1mz;
- dN(3,1) =_1pxt1mz * _18yp9tx2p3y2pz2m19;
- dN(3,2) =_1pxt1py * _18zm9tx2py2p3z2m19;
- dN(4,0) =_18xm9t3x2py2pz2m19 * _1myt1pz;
- dN(4,1) =_1mxt1pz * _18ym9tx2p3y2pz2m19;
- dN(4,2) =_1mxt1my * _18zp9tx2py2p3z2m19;
- dN(5,0) =_18xp9t3x2py2pz2m19 * _1myt1pz;
- dN(5,1) =_1pxt1pz * _18ym9tx2p3y2pz2m19;
- dN(5,2) =_1pxt1my * _18zp9tx2py2p3z2m19;
- dN(6,0) =_18xm9t3x2py2pz2m19 * _1pyt1pz;
- dN(6,1) =_1mxt1pz * _18yp9tx2p3y2pz2m19;
- dN(6,2) =_1mxt1py * _18zp9tx2py2p3z2m19;
- dN(7,0) =_18xp9t3x2py2pz2m19 * _1pyt1pz;
- dN(7,1) =_1pxt1pz * _18yp9tx2p3y2pz2m19;
- dN(7,2) =_1pxt1py * _18zp9tx2py2p3z2m19;
+ dN(0, 0) = _18xm9t3x2py2pz2m19 * _1myt1mz;
+ dN(0, 1) = _1mxt1mz * _18ym9tx2p3y2pz2m19;
+ dN(0, 2) = _1mxt1my * _18zm9tx2py2p3z2m19;
+ dN(1, 0) = _18xp9t3x2py2pz2m19 * _1myt1mz;
+ dN(1, 1) = _1pxt1mz * _18ym9tx2p3y2pz2m19;
+ dN(1, 2) = _1pxt1my * _18zm9tx2py2p3z2m19;
+ dN(2, 0) = _18xm9t3x2py2pz2m19 * _1pyt1mz;
+ dN(2, 1) = _1mxt1mz * _18yp9tx2p3y2pz2m19;
+ dN(2, 2) = _1mxt1py * _18zm9tx2py2p3z2m19;
+ dN(3, 0) = _18xp9t3x2py2pz2m19 * _1pyt1mz;
+ dN(3, 1) = _1pxt1mz * _18yp9tx2p3y2pz2m19;
+ dN(3, 2) = _1pxt1py * _18zm9tx2py2p3z2m19;
+ dN(4, 0) = _18xm9t3x2py2pz2m19 * _1myt1pz;
+ dN(4, 1) = _1mxt1pz * _18ym9tx2p3y2pz2m19;
+ dN(4, 2) = _1mxt1my * _18zp9tx2py2p3z2m19;
+ dN(5, 0) = _18xp9t3x2py2pz2m19 * _1myt1pz;
+ dN(5, 1) = _1pxt1pz * _18ym9tx2p3y2pz2m19;
+ dN(5, 2) = _1pxt1my * _18zp9tx2py2p3z2m19;
+ dN(6, 0) = _18xm9t3x2py2pz2m19 * _1pyt1pz;
+ dN(6, 1) = _1mxt1pz * _18yp9tx2p3y2pz2m19;
+ dN(6, 2) = _1mxt1py * _18zp9tx2py2p3z2m19;
+ dN(7, 0) = _18xp9t3x2py2pz2m19 * _1pyt1pz;
+ dN(7, 1) = _1pxt1pz * _18yp9tx2p3y2pz2m19;
+ dN(7, 2) = _1pxt1py * _18zp9tx2py2p3z2m19;
dN.topRowsDivide(8, 64.0);
btScalar _m3m9x2m2x = -_3m9x2 - _2x;
- btScalar _p3m9x2m2x = _3m9x2 - _2x;
+ btScalar _p3m9x2m2x = _3m9x2 - _2x;
btScalar _1mx2t1m3x = _1mx2 * _1m3x;
btScalar _1mx2t1p3x = _1mx2 * _1p3x;
- dN( 8,0) = _m3m9x2m2x * _1myt1mz,
- dN( 8,1) = -_1mx2t1m3x * _1mz,
- dN( 8,2) = -_1mx2t1m3x * _1my;
- dN( 9,0) = _p3m9x2m2x * _1myt1mz,
- dN( 9,1) = -_1mx2t1p3x * _1mz,
- dN( 9,2) = -_1mx2t1p3x * _1my;
- dN(10,0) = _m3m9x2m2x * _1myt1pz,
- dN(10,1) = -_1mx2t1m3x * _1pz,
- dN(10,2) = _1mx2t1m3x * _1my;
- dN(11,0) = _p3m9x2m2x * _1myt1pz,
- dN(11,1) = -_1mx2t1p3x * _1pz,
- dN(11,2) = _1mx2t1p3x * _1my;
- dN(12,0) = _m3m9x2m2x * _1pyt1mz,
- dN(12,1) = _1mx2t1m3x * _1mz,
- dN(12,2) = -_1mx2t1m3x * _1py;
- dN(13,0) = _p3m9x2m2x * _1pyt1mz,
- dN(13,1) = _1mx2t1p3x * _1mz,
- dN(13,2) = -_1mx2t1p3x * _1py;
- dN(14,0) = _m3m9x2m2x * _1pyt1pz,
- dN(14,1) = _1mx2t1m3x * _1pz,
- dN(14,2) = _1mx2t1m3x * _1py;
- dN(15,0) = _p3m9x2m2x * _1pyt1pz,
- dN(15,1) = _1mx2t1p3x * _1pz,
- dN(15,2) = _1mx2t1p3x * _1py;
+ dN(8, 0) = _m3m9x2m2x * _1myt1mz,
+ dN(8, 1) = -_1mx2t1m3x * _1mz,
+ dN(8, 2) = -_1mx2t1m3x * _1my;
+ dN(9, 0) = _p3m9x2m2x * _1myt1mz,
+ dN(9, 1) = -_1mx2t1p3x * _1mz,
+ dN(9, 2) = -_1mx2t1p3x * _1my;
+ dN(10, 0) = _m3m9x2m2x * _1myt1pz,
+ dN(10, 1) = -_1mx2t1m3x * _1pz,
+ dN(10, 2) = _1mx2t1m3x * _1my;
+ dN(11, 0) = _p3m9x2m2x * _1myt1pz,
+ dN(11, 1) = -_1mx2t1p3x * _1pz,
+ dN(11, 2) = _1mx2t1p3x * _1my;
+ dN(12, 0) = _m3m9x2m2x * _1pyt1mz,
+ dN(12, 1) = _1mx2t1m3x * _1mz,
+ dN(12, 2) = -_1mx2t1m3x * _1py;
+ dN(13, 0) = _p3m9x2m2x * _1pyt1mz,
+ dN(13, 1) = _1mx2t1p3x * _1mz,
+ dN(13, 2) = -_1mx2t1p3x * _1py;
+ dN(14, 0) = _m3m9x2m2x * _1pyt1pz,
+ dN(14, 1) = _1mx2t1m3x * _1pz,
+ dN(14, 2) = _1mx2t1m3x * _1py;
+ dN(15, 0) = _p3m9x2m2x * _1pyt1pz,
+ dN(15, 1) = _1mx2t1p3x * _1pz,
+ dN(15, 2) = _1mx2t1p3x * _1py;
btScalar _m3m9y2m2y = -_3m9y2 - _2y;
- btScalar _p3m9y2m2y = _3m9y2 - _2y;
+ btScalar _p3m9y2m2y = _3m9y2 - _2y;
btScalar _1my2t1m3y = _1my2 * _1m3y;
btScalar _1my2t1p3y = _1my2 * _1p3y;
- dN(16,0) = -_1my2t1m3y * _1mz,
- dN(16,1) = _m3m9y2m2y * _1mxt1mz,
- dN(16,2) = -_1my2t1m3y * _1mx;
- dN(17,0) = -_1my2t1p3y * _1mz,
- dN(17,1) = _p3m9y2m2y * _1mxt1mz,
- dN(17,2) = -_1my2t1p3y * _1mx;
- dN(18,0) = _1my2t1m3y * _1mz,
- dN(18,1) = _m3m9y2m2y * _1pxt1mz,
- dN(18,2) = -_1my2t1m3y * _1px;
- dN(19,0) = _1my2t1p3y * _1mz,
- dN(19,1) = _p3m9y2m2y * _1pxt1mz,
- dN(19,2) = -_1my2t1p3y * _1px;
- dN(20,0) = -_1my2t1m3y * _1pz,
- dN(20,1) = _m3m9y2m2y * _1mxt1pz,
- dN(20,2) = _1my2t1m3y * _1mx;
- dN(21,0) = -_1my2t1p3y * _1pz,
- dN(21,1) = _p3m9y2m2y * _1mxt1pz,
- dN(21,2) = _1my2t1p3y * _1mx;
- dN(22,0) = _1my2t1m3y * _1pz,
- dN(22,1) = _m3m9y2m2y * _1pxt1pz,
- dN(22,2) = _1my2t1m3y * _1px;
- dN(23,0) = _1my2t1p3y * _1pz,
- dN(23,1) = _p3m9y2m2y * _1pxt1pz,
- dN(23,2) = _1my2t1p3y * _1px;
-
+ dN(16, 0) = -_1my2t1m3y * _1mz,
+ dN(16, 1) = _m3m9y2m2y * _1mxt1mz,
+ dN(16, 2) = -_1my2t1m3y * _1mx;
+ dN(17, 0) = -_1my2t1p3y * _1mz,
+ dN(17, 1) = _p3m9y2m2y * _1mxt1mz,
+ dN(17, 2) = -_1my2t1p3y * _1mx;
+ dN(18, 0) = _1my2t1m3y * _1mz,
+ dN(18, 1) = _m3m9y2m2y * _1pxt1mz,
+ dN(18, 2) = -_1my2t1m3y * _1px;
+ dN(19, 0) = _1my2t1p3y * _1mz,
+ dN(19, 1) = _p3m9y2m2y * _1pxt1mz,
+ dN(19, 2) = -_1my2t1p3y * _1px;
+ dN(20, 0) = -_1my2t1m3y * _1pz,
+ dN(20, 1) = _m3m9y2m2y * _1mxt1pz,
+ dN(20, 2) = _1my2t1m3y * _1mx;
+ dN(21, 0) = -_1my2t1p3y * _1pz,
+ dN(21, 1) = _p3m9y2m2y * _1mxt1pz,
+ dN(21, 2) = _1my2t1p3y * _1mx;
+ dN(22, 0) = _1my2t1m3y * _1pz,
+ dN(22, 1) = _m3m9y2m2y * _1pxt1pz,
+ dN(22, 2) = _1my2t1m3y * _1px;
+ dN(23, 0) = _1my2t1p3y * _1pz,
+ dN(23, 1) = _p3m9y2m2y * _1pxt1pz,
+ dN(23, 2) = _1my2t1p3y * _1px;
btScalar _m3m9z2m2z = -_3m9z2 - _2z;
- btScalar _p3m9z2m2z = _3m9z2 - _2z;
+ btScalar _p3m9z2m2z = _3m9z2 - _2z;
btScalar _1mz2t1m3z = _1mz2 * _1m3z;
btScalar _1mz2t1p3z = _1mz2 * _1p3z;
- dN(24,0) = -_1mz2t1m3z * _1my,
- dN(24,1) = -_1mz2t1m3z * _1mx,
- dN(24,2) = _m3m9z2m2z * _1mxt1my;
- dN(25,0) = -_1mz2t1p3z * _1my,
- dN(25,1) = -_1mz2t1p3z * _1mx,
- dN(25,2) = _p3m9z2m2z * _1mxt1my;
- dN(26,0) = -_1mz2t1m3z * _1py,
- dN(26,1) = _1mz2t1m3z * _1mx,
- dN(26,2) = _m3m9z2m2z * _1mxt1py;
- dN(27,0) = -_1mz2t1p3z * _1py,
- dN(27,1) = _1mz2t1p3z * _1mx,
- dN(27,2) = _p3m9z2m2z * _1mxt1py;
- dN(28,0) = _1mz2t1m3z * _1my,
- dN(28,1) = -_1mz2t1m3z * _1px,
- dN(28,2) = _m3m9z2m2z * _1pxt1my;
- dN(29,0) = _1mz2t1p3z * _1my,
- dN(29,1) = -_1mz2t1p3z * _1px,
- dN(29,2) = _p3m9z2m2z * _1pxt1my;
- dN(30,0) = _1mz2t1m3z * _1py,
- dN(30,1) = _1mz2t1m3z * _1px,
- dN(30,2) = _m3m9z2m2z * _1pxt1py;
- dN(31,0) = _1mz2t1p3z * _1py,
- dN(31,1) = _1mz2t1p3z * _1px,
- dN(31,2) = _p3m9z2m2z * _1pxt1py;
+ dN(24, 0) = -_1mz2t1m3z * _1my,
+ dN(24, 1) = -_1mz2t1m3z * _1mx,
+ dN(24, 2) = _m3m9z2m2z * _1mxt1my;
+ dN(25, 0) = -_1mz2t1p3z * _1my,
+ dN(25, 1) = -_1mz2t1p3z * _1mx,
+ dN(25, 2) = _p3m9z2m2z * _1mxt1my;
+ dN(26, 0) = -_1mz2t1m3z * _1py,
+ dN(26, 1) = _1mz2t1m3z * _1mx,
+ dN(26, 2) = _m3m9z2m2z * _1mxt1py;
+ dN(27, 0) = -_1mz2t1p3z * _1py,
+ dN(27, 1) = _1mz2t1p3z * _1mx,
+ dN(27, 2) = _p3m9z2m2z * _1mxt1py;
+ dN(28, 0) = _1mz2t1m3z * _1my,
+ dN(28, 1) = -_1mz2t1m3z * _1px,
+ dN(28, 2) = _m3m9z2m2z * _1pxt1my;
+ dN(29, 0) = _1mz2t1p3z * _1my,
+ dN(29, 1) = -_1mz2t1p3z * _1px,
+ dN(29, 2) = _p3m9z2m2z * _1pxt1my;
+ dN(30, 0) = _1mz2t1m3z * _1py,
+ dN(30, 1) = _1mz2t1m3z * _1px,
+ dN(30, 2) = _m3m9z2m2z * _1pxt1py;
+ dN(31, 0) = _1mz2t1p3z * _1py,
+ dN(31, 1) = _1mz2t1p3z * _1px,
+ dN(31, 2) = _p3m9z2m2z * _1pxt1py;
dN.bottomRowsMul(32u - 8u, 9.0 / 64.0);
-
}
return res;
}
-
-
bool btMiniSDF::interpolate(unsigned int field_id, double& dist, btVector3 const& x,
- btVector3* gradient) const
+ btVector3* gradient) const
{
btAssert(m_isValid);
if (!m_isValid)
@@ -459,15 +449,15 @@ bool btMiniSDF::interpolate(unsigned int field_id, double& dist, btVector3 const
if (!m_domain.contains(x))
return false;
- btVector3 tmpmi = ((x - m_domain.min())*(m_inv_cell_size));//.cast<unsigned int>().eval();
- unsigned int mi[3] = {(unsigned int )tmpmi[0],(unsigned int )tmpmi[1],(unsigned int )tmpmi[2]};
+ btVector3 tmpmi = ((x - m_domain.min()) * (m_inv_cell_size)); //.cast<unsigned int>().eval();
+ unsigned int mi[3] = {(unsigned int)tmpmi[0], (unsigned int)tmpmi[1], (unsigned int)tmpmi[2]};
if (mi[0] >= m_resolution[0])
- mi[0] = m_resolution[0]-1;
+ mi[0] = m_resolution[0] - 1;
if (mi[1] >= m_resolution[1])
- mi[1] = m_resolution[1]-1;
+ mi[1] = m_resolution[1] - 1;
if (mi[2] >= m_resolution[2])
- mi[2] = m_resolution[2]-1;
- btMultiIndex mui;
+ mi[2] = m_resolution[2] - 1;
+ btMultiIndex mui;
mui.ijk[0] = mi[0];
mui.ijk[1] = mi[1];
mui.ijk[2] = mi[2];
@@ -478,12 +468,12 @@ bool btMiniSDF::interpolate(unsigned int field_id, double& dist, btVector3 const
btAlignedBox3d sd = subdomain(i);
i = i_;
- btVector3 d = sd.m_max-sd.m_min;//.diagonal().eval();
+ btVector3 d = sd.m_max - sd.m_min; //.diagonal().eval();
btVector3 denom = (sd.max() - sd.min());
- btVector3 c0 = btVector3(2.0,2.0,2.0)/denom;
- btVector3 c1 = (sd.max() + sd.min())/denom;
- btVector3 xi = (c0*x - c1);
+ btVector3 c0 = btVector3(2.0, 2.0, 2.0) / denom;
+ btVector3 c1 = (sd.max() + sd.min()) / denom;
+ btVector3 xi = (c0 * x - c1);
btCell32 const& cell = m_cells[field_id][i];
if (!gradient)
@@ -497,7 +487,8 @@ bool btMiniSDF::interpolate(unsigned int field_id, double& dist, btVector3 const
double c = m_nodes[field_id][v];
if (c == DBL_MAX)
{
- return false;;
+ return false;
+ ;
}
phi += c * N[j];
}
@@ -529,4 +520,3 @@ bool btMiniSDF::interpolate(unsigned int field_id, double& dist, btVector3 const
dist = phi;
return true;
}
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btMiniSDF.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btMiniSDF.h
index 3de90e4f8a..b60fd102fd 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btMiniSDF.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btMiniSDF.h
@@ -5,7 +5,6 @@
#include "LinearMath/btAabbUtil2.h"
#include "LinearMath/btAlignedObjectArray.h"
-
struct btMultiIndex
{
unsigned int ijk[3];
@@ -25,7 +24,6 @@ struct btAlignedBox3d
{
return m_max;
}
-
bool contains(const btVector3& x) const
{
@@ -33,8 +31,8 @@ struct btAlignedBox3d
}
btAlignedBox3d(const btVector3& mn, const btVector3& mx)
- :m_min(mn),
- m_max(mx)
+ : m_min(mn),
+ m_max(mx)
{
}
@@ -47,39 +45,38 @@ struct btShapeMatrix
{
double m_vec[32];
- inline double& operator[](int i)
+ inline double& operator[](int i)
{
return m_vec[i];
}
- inline const double& operator[](int i) const
+ inline const double& operator[](int i) const
{
return m_vec[i];
}
-
};
struct btShapeGradients
{
- btVector3 m_vec[32];
+ btVector3 m_vec[32];
void topRowsDivide(int row, double denom)
{
- for (int i=0;i<row;i++)
+ 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++)
+ for (int i = 32 - row; i < 32; i++)
{
m_vec[i] *= val;
}
}
-
- inline btScalar& operator()(int i, int j)
+
+ inline btScalar& operator()(int i, int j)
{
return m_vec[i][j];
}
@@ -92,7 +89,6 @@ struct btCell32
struct btMiniSDF
{
-
btAlignedBox3d m_domain;
unsigned int m_resolution[3];
btVector3 m_cell_size;
@@ -101,13 +97,12 @@ struct btMiniSDF
std::size_t m_n_fields;
bool m_isValid;
-
btAlignedObjectArray<btAlignedObjectArray<double> > m_nodes;
- btAlignedObjectArray<btAlignedObjectArray<btCell32 > > m_cells;
+ btAlignedObjectArray<btAlignedObjectArray<btCell32> > m_cells;
btAlignedObjectArray<btAlignedObjectArray<unsigned int> > m_cell_map;
btMiniSDF()
- :m_isValid(false)
+ : m_isValid(false)
{
}
bool load(const char* data, int size);
@@ -115,20 +110,18 @@ struct btMiniSDF
{
return m_isValid;
}
- unsigned int multiToSingleIndex(btMultiIndex const & ijk) const;
-
+ 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
+#endif //MINISDF_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btMinkowskiSumShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btMinkowskiSumShape.cpp
index 899ef50056..d4b6a651de 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btMinkowskiSumShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btMinkowskiSumShape.cpp
@@ -13,65 +13,59 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btMinkowskiSumShape.h"
-
-btMinkowskiSumShape::btMinkowskiSumShape(const btConvexShape* shapeA,const btConvexShape* shapeB)
-: btConvexInternalShape (),
-m_shapeA(shapeA),
-m_shapeB(shapeB)
+btMinkowskiSumShape::btMinkowskiSumShape(const btConvexShape* shapeA, const btConvexShape* shapeB)
+ : btConvexInternalShape(),
+ m_shapeA(shapeA),
+ m_shapeB(shapeB)
{
m_shapeType = MINKOWSKI_DIFFERENCE_SHAPE_PROXYTYPE;
m_transA.setIdentity();
m_transB.setIdentity();
}
-btVector3 btMinkowskiSumShape::localGetSupportingVertexWithoutMargin(const btVector3& vec)const
+btVector3 btMinkowskiSumShape::localGetSupportingVertexWithoutMargin(const btVector3& vec) const
{
- btVector3 supVertexA = m_transA(m_shapeA->localGetSupportingVertexWithoutMargin(vec*m_transA.getBasis()));
- btVector3 supVertexB = m_transB(m_shapeB->localGetSupportingVertexWithoutMargin(-vec*m_transB.getBasis()));
- return supVertexA - supVertexB;
+ btVector3 supVertexA = m_transA(m_shapeA->localGetSupportingVertexWithoutMargin(vec * m_transA.getBasis()));
+ btVector3 supVertexB = m_transB(m_shapeB->localGetSupportingVertexWithoutMargin(-vec * m_transB.getBasis()));
+ return supVertexA - supVertexB;
}
-void btMinkowskiSumShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const
+void btMinkowskiSumShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const
{
///@todo: could make recursive use of batching. probably this shape is not used frequently.
- for (int i=0;i<numVectors;i++)
+ for (int i = 0; i < numVectors; i++)
{
supportVerticesOut[i] = localGetSupportingVertexWithoutMargin(vectors[i]);
}
-
}
-
-
-btScalar btMinkowskiSumShape::getMargin() const
+btScalar btMinkowskiSumShape::getMargin() const
{
return m_shapeA->getMargin() + m_shapeB->getMargin();
}
-
-void btMinkowskiSumShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const
+void btMinkowskiSumShape::calculateLocalInertia(btScalar mass, btVector3& inertia) const
{
(void)mass;
//inertia of the AABB of the Minkowski sum
btTransform identity;
identity.setIdentity();
- btVector3 aabbMin,aabbMax;
- getAabb(identity,aabbMin,aabbMax);
+ btVector3 aabbMin, aabbMax;
+ getAabb(identity, aabbMin, aabbMax);
- btVector3 halfExtents = (aabbMax-aabbMin)*btScalar(0.5);
+ 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;
+ 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 = scaledmass * (btVector3(y2 + z2, x2 + z2, x2 + y2));
}
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btMinkowskiSumShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btMinkowskiSumShape.h
index a3f9a47239..3b5150f6d5 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btMinkowskiSumShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btMinkowskiSumShape.h
@@ -17,46 +17,43 @@ subject to the following restrictions:
#define BT_MINKOWSKI_SUM_SHAPE_H
#include "btConvexInternalShape.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
+#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
+ATTRIBUTE_ALIGNED16(class)
+btMinkowskiSumShape : public btConvexInternalShape
{
-
- btTransform m_transA;
- btTransform m_transB;
- const btConvexShape* m_shapeA;
- const btConvexShape* m_shapeB;
+ btTransform m_transA;
+ btTransform m_transB;
+ const btConvexShape* m_shapeA;
+ const btConvexShape* m_shapeB;
public:
+ BT_DECLARE_ALIGNED_ALLOCATOR();
-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;
+ btMinkowskiSumShape(const btConvexShape* shapeA, const btConvexShape* shapeB);
+ virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const;
- virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
+ virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const;
- void setTransformA(const btTransform& transA) { m_transA = transA;}
- void setTransformB(const btTransform& transB) { m_transB = transB;}
+ virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const;
- const btTransform& getTransformA()const { return m_transA;}
- const btTransform& GetTransformB()const { return m_transB;}
+ 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;
+ virtual btScalar getMargin() const;
- const btConvexShape* getShapeA() const { return m_shapeA;}
- const btConvexShape* getShapeB() const { return m_shapeB;}
+ const btConvexShape* getShapeA() const { return m_shapeA; }
+ const btConvexShape* getShapeB() const { return m_shapeB; }
- virtual const char* getName()const
+ virtual const char* getName() const
{
return "MinkowskiSum";
}
};
-#endif //BT_MINKOWSKI_SUM_SHAPE_H
+#endif //BT_MINKOWSKI_SUM_SHAPE_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btMultiSphereShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btMultiSphereShape.cpp
index 4195fa3138..c0cc55dfb0 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btMultiSphereShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btMultiSphereShape.cpp
@@ -13,7 +13,7 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-#if defined (_WIN32) || defined (__i386__)
+#if defined(_WIN32) || defined(__i386__)
#define BT_USE_SSE_IN_API
#endif
@@ -22,43 +22,41 @@ subject to the following restrictions:
#include "LinearMath/btQuaternion.h"
#include "LinearMath/btSerializer.h"
-btMultiSphereShape::btMultiSphereShape (const btVector3* positions,const btScalar* radi,int numSpheres)
-:btConvexInternalAabbCachingShape ()
+btMultiSphereShape::btMultiSphereShape(const btVector3* positions, const btScalar* radi, int numSpheres)
+ : btConvexInternalAabbCachingShape()
{
m_shapeType = MULTI_SPHERE_SHAPE_PROXYTYPE;
//btScalar startMargin = btScalar(BT_LARGE_FLOAT);
m_localPositionArray.resize(numSpheres);
m_radiArray.resize(numSpheres);
- for (int i=0;i<numSpheres;i++)
+ for (int i = 0; i < numSpheres; i++)
{
m_localPositionArray[i] = positions[i];
m_radiArray[i] = radi[i];
-
}
recalcLocalAabb();
-
}
#ifndef MIN
- #define MIN( _a, _b) ((_a) < (_b) ? (_a) : (_b))
+#define MIN(_a, _b) ((_a) < (_b) ? (_a) : (_b))
#endif
- btVector3 btMultiSphereShape::localGetSupportingVertexWithoutMargin(const btVector3& vec0)const
+btVector3 btMultiSphereShape::localGetSupportingVertexWithoutMargin(const btVector3& vec0) const
{
- btVector3 supVec(0,0,0);
+ btVector3 supVec(0, 0, 0);
btScalar maxDot(btScalar(-BT_LARGE_FLOAT));
-
btVector3 vec = vec0;
btScalar lenSqr = vec.length2();
- if (lenSqr < (SIMD_EPSILON*SIMD_EPSILON))
+ if (lenSqr < (SIMD_EPSILON * SIMD_EPSILON))
{
- vec.setValue(1,0,0);
- } else
+ vec.setValue(1, 0, 0);
+ }
+ else
{
- btScalar rlen = btScalar(1.) / btSqrt(lenSqr );
+ btScalar rlen = btScalar(1.) / btSqrt(lenSqr);
vec *= rlen;
}
@@ -69,32 +67,30 @@ btMultiSphereShape::btMultiSphereShape (const btVector3* positions,const btScala
const btScalar* rad = &m_radiArray[0];
int numSpheres = m_localPositionArray.size();
- for( int k = 0; k < numSpheres; k+= 128 )
+ for (int k = 0; k < numSpheres; k += 128)
{
btVector3 temp[128];
- int inner_count = MIN( numSpheres - k, 128 );
- for( long i = 0; i < inner_count; i++ )
- {
- temp[i] = (*pos)*m_localScaling +vec*m_localScaling*(*rad) - vec * getMargin();
- pos++;
- rad++;
- }
- long i = vec.maxDot( temp, inner_count, newDot);
- if( newDot > maxDot )
+ int inner_count = MIN(numSpheres - k, 128);
+ for (long i = 0; i < inner_count; i++)
+ {
+ temp[i] = (*pos) * m_localScaling + vec * m_localScaling * (*rad) - vec * getMargin();
+ pos++;
+ rad++;
+ }
+ long i = vec.maxDot(temp, inner_count, newDot);
+ if (newDot > maxDot)
{
maxDot = newDot;
supVec = temp[i];
}
- }
+ }
return supVec;
-
}
- void btMultiSphereShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const
+void btMultiSphereShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const
{
-
- for (int j=0;j<numVectors;j++)
+ for (int j = 0; j < numVectors; j++)
{
btScalar maxDot(btScalar(-BT_LARGE_FLOAT));
@@ -107,73 +103,63 @@ btMultiSphereShape::btMultiSphereShape (const btVector3* positions,const btScala
const btScalar* rad = &m_radiArray[0];
int numSpheres = m_localPositionArray.size();
- for( int k = 0; k < numSpheres; k+= 128 )
- {
- btVector3 temp[128];
- int inner_count = MIN( numSpheres - k, 128 );
- for( long i = 0; i < inner_count; i++ )
- {
- temp[i] = (*pos)*m_localScaling +vec*m_localScaling*(*rad) - vec * getMargin();
- pos++;
- rad++;
- }
- long i = vec.maxDot( temp, inner_count, newDot);
- if( newDot > maxDot )
- {
- maxDot = newDot;
- supportVerticesOut[j] = temp[i];
- }
- }
-
+ for (int k = 0; k < numSpheres; k += 128)
+ {
+ btVector3 temp[128];
+ int inner_count = MIN(numSpheres - k, 128);
+ for (long i = 0; i < inner_count; i++)
+ {
+ temp[i] = (*pos) * m_localScaling + vec * m_localScaling * (*rad) - vec * getMargin();
+ pos++;
+ rad++;
+ }
+ long i = vec.maxDot(temp, inner_count, newDot);
+ if (newDot > maxDot)
+ {
+ maxDot = newDot;
+ supportVerticesOut[j] = temp[i];
+ }
+ }
}
}
-
-
-
-
-
-
-
-void btMultiSphereShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const
+void btMultiSphereShape::calculateLocalInertia(btScalar mass, btVector3& inertia) const
{
//as an approximation, take the inertia of the box that bounds the spheres
- btVector3 localAabbMin,localAabbMax;
- getCachedLocalAabb(localAabbMin,localAabbMax);
- btVector3 halfExtents = (localAabbMax-localAabbMin)*btScalar(0.5);
+ btVector3 localAabbMin, localAabbMax;
+ getCachedLocalAabb(localAabbMin, localAabbMax);
+ btVector3 halfExtents = (localAabbMax - localAabbMin) * btScalar(0.5);
- btScalar lx=btScalar(2.)*(halfExtents.x());
- btScalar ly=btScalar(2.)*(halfExtents.y());
- btScalar lz=btScalar(2.)*(halfExtents.z());
-
- inertia.setValue(mass/(btScalar(12.0)) * (ly*ly + lz*lz),
- mass/(btScalar(12.0)) * (lx*lx + lz*lz),
- mass/(btScalar(12.0)) * (lx*lx + ly*ly));
+ btScalar lx = btScalar(2.) * (halfExtents.x());
+ btScalar ly = btScalar(2.) * (halfExtents.y());
+ btScalar lz = btScalar(2.) * (halfExtents.z());
+ inertia.setValue(mass / (btScalar(12.0)) * (ly * ly + lz * lz),
+ mass / (btScalar(12.0)) * (lx * lx + lz * lz),
+ mass / (btScalar(12.0)) * (lx * lx + ly * ly));
}
-
///fills the dataBuffer and returns the struct name (and 0 on failure)
-const char* btMultiSphereShape::serialize(void* dataBuffer, btSerializer* serializer) const
+const char* btMultiSphereShape::serialize(void* dataBuffer, btSerializer* serializer) const
{
- btMultiSphereShapeData* shapeData = (btMultiSphereShapeData*) dataBuffer;
+ btMultiSphereShapeData* shapeData = (btMultiSphereShapeData*)dataBuffer;
btConvexInternalShape::serialize(&shapeData->m_convexInternalShapeData, serializer);
int numElem = m_localPositionArray.size();
- shapeData->m_localPositionArrayPtr = numElem ? (btPositionAndRadius*)serializer->getUniquePointer((void*)&m_localPositionArray[0]): 0;
-
+ shapeData->m_localPositionArrayPtr = numElem ? (btPositionAndRadius*)serializer->getUniquePointer((void*)&m_localPositionArray[0]) : 0;
+
shapeData->m_localPositionArraySize = numElem;
if (numElem)
{
- btChunk* chunk = serializer->allocate(sizeof(btPositionAndRadius),numElem);
+ btChunk* chunk = serializer->allocate(sizeof(btPositionAndRadius), numElem);
btPositionAndRadius* memPtr = (btPositionAndRadius*)chunk->m_oldPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
m_localPositionArray[i].serializeFloat(memPtr->m_pos);
memPtr->m_radius = float(m_radiArray[i]);
}
- serializer->finalizeChunk(chunk,"btPositionAndRadius",BT_ARRAY_CODE,(void*)&m_localPositionArray[0]);
+ serializer->finalizeChunk(chunk, "btPositionAndRadius", BT_ARRAY_CODE, (void*)&m_localPositionArray[0]);
}
// Fill padding with zeros to appease msan.
@@ -181,5 +167,3 @@ const char* btMultiSphereShape::serialize(void* dataBuffer, btSerializer* serial
return "btMultiSphereShapeData";
}
-
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btMultiSphereShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btMultiSphereShape.h
index 5d3b402684..2d79c07ca4 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btMultiSphereShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btMultiSphereShape.h
@@ -17,69 +17,65 @@ subject to the following restrictions:
#define BT_MULTI_SPHERE_MINKOWSKI_H
#include "btConvexInternalShape.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
+#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
+ATTRIBUTE_ALIGNED16(class)
+btMultiSphereShape : public btConvexInternalAabbCachingShape
{
-
btAlignedObjectArray<btVector3> m_localPositionArray;
- btAlignedObjectArray<btScalar> m_radiArray;
-
+ btAlignedObjectArray<btScalar> m_radiArray;
+
public:
BT_DECLARE_ALIGNED_ALLOCATOR();
-
- btMultiSphereShape (const btVector3* positions,const btScalar* radi,int numSpheres);
+
+ btMultiSphereShape(const btVector3* positions, const btScalar* radi, int numSpheres);
///CollisionShape Interface
- virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
+ virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const;
/// btConvexShape Interface
- virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const;
+ virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const;
- virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const;
-
- int getSphereCount() 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
+ const btVector3& getSpherePosition(int index) const
{
return m_localPositionArray[index];
}
- btScalar getSphereRadius(int index) const
+ btScalar getSphereRadius(int index) const
{
return m_radiArray[index];
}
-
- virtual const char* getName()const
+ virtual const char* getName() const
{
return "MultiSphere";
}
- virtual int calculateSerializeBufferSize() 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;
-
-
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
};
-
-struct btPositionAndRadius
+struct btPositionAndRadius
{
- btVector3FloatData m_pos;
- float m_radius;
+ btVector3FloatData m_pos;
+ float m_radius;
};
+// clang-format off
+
struct btMultiSphereShapeData
{
btConvexInternalShapeData m_convexInternalShapeData;
@@ -89,13 +85,11 @@ struct btMultiSphereShapeData
char m_padding[4];
};
+// clang-format on
-
-SIMD_FORCE_INLINE int btMultiSphereShape::calculateSerializeBufferSize() const
+SIMD_FORCE_INLINE int btMultiSphereShape::calculateSerializeBufferSize() const
{
return sizeof(btMultiSphereShapeData);
}
-
-
-#endif //BT_MULTI_SPHERE_MINKOWSKI_H
+#endif //BT_MULTI_SPHERE_MINKOWSKI_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.cpp
index 58799ac96a..30108c9e7b 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.cpp
@@ -19,27 +19,25 @@ subject to the following restrictions:
#include "BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.h"
//#include "BulletCollision/CollisionShapes/btOptimizedBvh.h"
-
///Obtains the material for a specific triangle
-const btMaterial * btMultimaterialTriangleMeshShape::getMaterialProperties(int partID, int triIndex)
+const btMaterial *btMultimaterialTriangleMeshShape::getMaterialProperties(int partID, int triIndex)
{
- const unsigned char * materialBase = 0;
- int numMaterials;
- PHY_ScalarType materialType;
- int materialStride;
- const unsigned char * triangleMaterialBase = 0;
- int numTriangles;
- int triangleMaterialStride;
- PHY_ScalarType triangleType;
-
- ((btTriangleIndexVertexMaterialArray*)m_meshInterface)->getLockedReadOnlyMaterialBase(&materialBase, numMaterials, materialType, materialStride,
- &triangleMaterialBase, numTriangles, triangleMaterialStride, triangleType, partID);
-
- // return the pointer to the place with the friction for the triangle
- // TODO: This depends on whether it's a moving mesh or not
- // BUG IN GIMPACT
- //return (btScalar*)(&materialBase[triangleMaterialBase[(triIndex-1) * triangleMaterialStride] * materialStride]);
- int * matInd = (int *)(&(triangleMaterialBase[(triIndex * triangleMaterialStride)]));
- btMaterial *matVal = (btMaterial *)(&(materialBase[*matInd * materialStride]));
- return (matVal);
+ const unsigned char *materialBase = 0;
+ int numMaterials;
+ PHY_ScalarType materialType;
+ int materialStride;
+ const unsigned char *triangleMaterialBase = 0;
+ int numTriangles;
+ int triangleMaterialStride;
+ PHY_ScalarType triangleType;
+
+ ((btTriangleIndexVertexMaterialArray *)m_meshInterface)->getLockedReadOnlyMaterialBase(&materialBase, numMaterials, materialType, materialStride, &triangleMaterialBase, numTriangles, triangleMaterialStride, triangleType, partID);
+
+ // return the pointer to the place with the friction for the triangle
+ // TODO: This depends on whether it's a moving mesh or not
+ // BUG IN GIMPACT
+ //return (btScalar*)(&materialBase[triangleMaterialBase[(triIndex-1) * triangleMaterialStride] * materialStride]);
+ int *matInd = (int *)(&(triangleMaterialBase[(triIndex * triangleMaterialStride)]));
+ btMaterial *matVal = (btMaterial *)(&(materialBase[*matInd * materialStride]));
+ return (matVal);
}
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.h
index 5ebaede4a8..d1d42f8e04 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.h
@@ -22,82 +22,80 @@ subject to the following restrictions:
#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
+ATTRIBUTE_ALIGNED16(class)
+btMultimaterialTriangleMeshShape : public btBvhTriangleMeshShape
{
- btAlignedObjectArray <btMaterial*> m_materialList;
+ btAlignedObjectArray<btMaterial *> 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));
- }
- }
+ 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()
- {
-/*
+ 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]);
@@ -106,14 +104,12 @@ public:
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);
+ 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
+#endif //BT_BVH_TRIANGLE_MATERIAL_MESH_SHAPE_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btOptimizedBvh.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btOptimizedBvh.cpp
index 6f36775f7c..687399e0a9 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btOptimizedBvh.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btOptimizedBvh.cpp
@@ -13,51 +13,46 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btOptimizedBvh.h"
#include "btStridingMeshInterface.h"
#include "LinearMath/btAabbUtil2.h"
#include "LinearMath/btIDebugDraw.h"
-
btOptimizedBvh::btOptimizedBvh()
-{
+{
}
btOptimizedBvh::~btOptimizedBvh()
{
}
-
void btOptimizedBvh::build(btStridingMeshInterface* triangles, bool useQuantizedAabbCompression, const btVector3& bvhAabbMin, const btVector3& bvhAabbMax)
{
m_useQuantization = useQuantizedAabbCompression;
-
// NodeArray triangleNodes;
- struct NodeTriangleCallback : public btInternalTriangleIndexCallback
+ struct NodeTriangleCallback : public btInternalTriangleIndexCallback
{
-
- NodeArray& m_triangleNodes;
+ NodeArray& m_triangleNodes;
NodeTriangleCallback& operator=(NodeTriangleCallback& other)
{
m_triangleNodes.copyFromArray(other.m_triangleNodes);
return *this;
}
-
- NodeTriangleCallback(NodeArray& triangleNodes)
- :m_triangleNodes(triangleNodes)
+
+ NodeTriangleCallback(NodeArray& triangleNodes)
+ : m_triangleNodes(triangleNodes)
{
}
- virtual void internalProcessTriangleIndex(btVector3* triangle,int partId,int triangleIndex)
+ virtual void internalProcessTriangleIndex(btVector3* triangle, int partId, int triangleIndex)
{
btOptimizedBvhNode node;
- btVector3 aabbMin,aabbMax;
- aabbMin.setValue(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
- aabbMax.setValue(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
+ btVector3 aabbMin, aabbMax;
+ aabbMin.setValue(btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT));
+ aabbMax.setValue(btScalar(-BT_LARGE_FLOAT), btScalar(-BT_LARGE_FLOAT), btScalar(-BT_LARGE_FLOAT));
aabbMin.setMin(triangle[0]);
aabbMax.setMax(triangle[0]);
aabbMin.setMin(triangle[1]);
@@ -70,17 +65,17 @@ void btOptimizedBvh::build(btStridingMeshInterface* triangles, bool useQuantized
node.m_aabbMaxOrg = aabbMax;
node.m_escapeIndex = -1;
-
+
//for child nodes
node.m_subPart = partId;
node.m_triangleIndex = triangleIndex;
m_triangleNodes.push_back(node);
}
};
- struct QuantizedNodeTriangleCallback : public btInternalTriangleIndexCallback
+ struct QuantizedNodeTriangleCallback : public btInternalTriangleIndexCallback
{
- QuantizedNodeArray& m_triangleNodes;
- const btQuantizedBvh* m_optimizedTree; // for quantization
+ QuantizedNodeArray& m_triangleNodes;
+ const btQuantizedBvh* m_optimizedTree; // for quantization
QuantizedNodeTriangleCallback& operator=(QuantizedNodeTriangleCallback& other)
{
@@ -89,23 +84,23 @@ void btOptimizedBvh::build(btStridingMeshInterface* triangles, bool useQuantized
return *this;
}
- QuantizedNodeTriangleCallback(QuantizedNodeArray& triangleNodes,const btQuantizedBvh* tree)
- :m_triangleNodes(triangleNodes),m_optimizedTree(tree)
+ QuantizedNodeTriangleCallback(QuantizedNodeArray& triangleNodes, const btQuantizedBvh* tree)
+ : m_triangleNodes(triangleNodes), m_optimizedTree(tree)
{
}
- virtual void internalProcessTriangleIndex(btVector3* triangle,int partId,int triangleIndex)
+ virtual void internalProcessTriangleIndex(btVector3* triangle, int partId, int triangleIndex)
{
// The partId and triangle index must fit in the same (positive) integer
- btAssert(partId < (1<<MAX_NUM_PARTS_IN_BITS));
- btAssert(triangleIndex < (1<<(31-MAX_NUM_PARTS_IN_BITS)));
+ btAssert(partId < (1 << MAX_NUM_PARTS_IN_BITS));
+ btAssert(triangleIndex < (1 << (31 - MAX_NUM_PARTS_IN_BITS)));
//negative indices are reserved for escapeIndex
- btAssert(triangleIndex>=0);
+ btAssert(triangleIndex >= 0);
btQuantizedBvhNode node;
- btVector3 aabbMin,aabbMax;
- aabbMin.setValue(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
- aabbMax.setValue(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
+ btVector3 aabbMin, aabbMax;
+ aabbMin.setValue(btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT));
+ aabbMax.setValue(btScalar(-BT_LARGE_FLOAT), btScalar(-BT_LARGE_FLOAT), btScalar(-BT_LARGE_FLOAT));
aabbMin.setMin(triangle[0]);
aabbMax.setMax(triangle[0]);
aabbMin.setMin(triangle[1]);
@@ -132,59 +127,52 @@ void btOptimizedBvh::build(btStridingMeshInterface* triangles, bool useQuantized
aabbMin.setZ(aabbMin.z() - MIN_AABB_HALF_DIMENSION);
}
- m_optimizedTree->quantize(&node.m_quantizedAabbMin[0],aabbMin,0);
- m_optimizedTree->quantize(&node.m_quantizedAabbMax[0],aabbMax,1);
+ m_optimizedTree->quantize(&node.m_quantizedAabbMin[0], aabbMin, 0);
+ m_optimizedTree->quantize(&node.m_quantizedAabbMax[0], aabbMax, 1);
- node.m_escapeIndexOrTriangleIndex = (partId<<(31-MAX_NUM_PARTS_IN_BITS)) | triangleIndex;
+ node.m_escapeIndexOrTriangleIndex = (partId << (31 - MAX_NUM_PARTS_IN_BITS)) | triangleIndex;
m_triangleNodes.push_back(node);
}
};
-
-
int numLeafNodes = 0;
-
if (m_useQuantization)
{
-
//initialize quantization values
- setQuantizationValues(bvhAabbMin,bvhAabbMax);
+ setQuantizationValues(bvhAabbMin, bvhAabbMax);
- QuantizedNodeTriangleCallback callback(m_quantizedLeafNodes,this);
+ QuantizedNodeTriangleCallback callback(m_quantizedLeafNodes, this);
-
- triangles->InternalProcessAllTriangles(&callback,m_bvhAabbMin,m_bvhAabbMax);
+ triangles->InternalProcessAllTriangles(&callback, m_bvhAabbMin, m_bvhAabbMax);
//now we have an array of leafnodes in m_leafNodes
numLeafNodes = m_quantizedLeafNodes.size();
-
- m_quantizedContiguousNodes.resize(2*numLeafNodes);
-
-
- } else
+ m_quantizedContiguousNodes.resize(2 * numLeafNodes);
+ }
+ else
{
- NodeTriangleCallback callback(m_leafNodes);
+ NodeTriangleCallback callback(m_leafNodes);
- btVector3 aabbMin(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
- btVector3 aabbMax(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
+ btVector3 aabbMin(btScalar(-BT_LARGE_FLOAT), btScalar(-BT_LARGE_FLOAT), btScalar(-BT_LARGE_FLOAT));
+ btVector3 aabbMax(btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT));
- triangles->InternalProcessAllTriangles(&callback,aabbMin,aabbMax);
+ triangles->InternalProcessAllTriangles(&callback, aabbMin, aabbMax);
//now we have an array of leafnodes in m_leafNodes
numLeafNodes = m_leafNodes.size();
- m_contiguousNodes.resize(2*numLeafNodes);
+ m_contiguousNodes.resize(2 * numLeafNodes);
}
m_curNodeIndex = 0;
- buildTree(0,numLeafNodes);
+ buildTree(0, numLeafNodes);
///if the entire tree is small then subtree size, we need to create a header info for the tree
- if(m_useQuantization && !m_SubtreeHeaders.size())
+ if (m_useQuantization && !m_SubtreeHeaders.size())
{
btBvhSubtreeInfo& subtree = m_SubtreeHeaders.expand();
subtree.setAabbFromQuantizeNode(m_quantizedContiguousNodes[0]);
@@ -200,37 +188,29 @@ void btOptimizedBvh::build(btStridingMeshInterface* triangles, bool useQuantized
m_leafNodes.clear();
}
-
-
-
-void btOptimizedBvh::refit(btStridingMeshInterface* meshInterface,const btVector3& aabbMin,const btVector3& aabbMax)
+void btOptimizedBvh::refit(btStridingMeshInterface* meshInterface, const btVector3& aabbMin, const btVector3& aabbMax)
{
if (m_useQuantization)
{
+ setQuantizationValues(aabbMin, aabbMax);
- setQuantizationValues(aabbMin,aabbMax);
-
- updateBvhNodes(meshInterface,0,m_curNodeIndex,0);
+ updateBvhNodes(meshInterface, 0, m_curNodeIndex, 0);
///now update all subtree headers
int i;
- for (i=0;i<m_SubtreeHeaders.size();i++)
+ for (i = 0; i < m_SubtreeHeaders.size(); i++)
{
btBvhSubtreeInfo& subtree = m_SubtreeHeaders[i];
subtree.setAabbFromQuantizeNode(m_quantizedContiguousNodes[subtree.m_rootNodeIndex]);
}
-
- } else
+ }
+ else
{
-
}
}
-
-
-
-void btOptimizedBvh::refitPartial(btStridingMeshInterface* meshInterface,const btVector3& aabbMin,const btVector3& aabbMax)
+void btOptimizedBvh::refitPartial(btStridingMeshInterface* meshInterface, const btVector3& aabbMin, const btVector3& aabbMax)
{
//incrementally initialize quantization values
btAssert(m_useQuantization);
@@ -245,147 +225,135 @@ void btOptimizedBvh::refitPartial(btStridingMeshInterface* meshInterface,const b
///we should update all quantization values, using updateBvhNodes(meshInterface);
///but we only update chunks that overlap the given aabb
-
- unsigned short quantizedQueryAabbMin[3];
- unsigned short quantizedQueryAabbMax[3];
- quantize(&quantizedQueryAabbMin[0],aabbMin,0);
- quantize(&quantizedQueryAabbMax[0],aabbMax,1);
+ unsigned short quantizedQueryAabbMin[3];
+ unsigned short quantizedQueryAabbMax[3];
+
+ quantize(&quantizedQueryAabbMin[0], aabbMin, 0);
+ quantize(&quantizedQueryAabbMax[0], aabbMax, 1);
int i;
- for (i=0;i<this->m_SubtreeHeaders.size();i++)
+ for (i = 0; i < this->m_SubtreeHeaders.size(); i++)
{
btBvhSubtreeInfo& subtree = m_SubtreeHeaders[i];
//PCK: unsigned instead of bool
- unsigned overlap = testQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin,quantizedQueryAabbMax,subtree.m_quantizedAabbMin,subtree.m_quantizedAabbMax);
+ unsigned overlap = testQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin, quantizedQueryAabbMax, subtree.m_quantizedAabbMin, subtree.m_quantizedAabbMax);
if (overlap != 0)
{
- updateBvhNodes(meshInterface,subtree.m_rootNodeIndex,subtree.m_rootNodeIndex+subtree.m_subtreeSize,i);
+ updateBvhNodes(meshInterface, subtree.m_rootNodeIndex, subtree.m_rootNodeIndex + subtree.m_subtreeSize, i);
subtree.setAabbFromQuantizeNode(m_quantizedContiguousNodes[subtree.m_rootNodeIndex]);
}
}
-
}
-void btOptimizedBvh::updateBvhNodes(btStridingMeshInterface* meshInterface,int firstNode,int endNode,int index)
+void btOptimizedBvh::updateBvhNodes(btStridingMeshInterface* meshInterface, int firstNode, int endNode, int index)
{
(void)index;
btAssert(m_useQuantization);
- int curNodeSubPart=-1;
+ int curNodeSubPart = -1;
//get access info to trianglemesh data
- const unsigned char *vertexbase = 0;
- int numverts = 0;
- PHY_ScalarType type = PHY_INTEGER;
- int stride = 0;
- const unsigned char *indexbase = 0;
- int indexstride = 0;
- int numfaces = 0;
- PHY_ScalarType indicestype = PHY_INTEGER;
-
- btVector3 triangleVerts[3];
- btVector3 aabbMin,aabbMax;
- const btVector3& meshScaling = meshInterface->getScaling();
-
- int i;
- for (i=endNode-1;i>=firstNode;i--)
+ const unsigned char* vertexbase = 0;
+ int numverts = 0;
+ PHY_ScalarType type = PHY_INTEGER;
+ int stride = 0;
+ const unsigned char* indexbase = 0;
+ int indexstride = 0;
+ int numfaces = 0;
+ PHY_ScalarType indicestype = PHY_INTEGER;
+
+ btVector3 triangleVerts[3];
+ btVector3 aabbMin, aabbMax;
+ const btVector3& meshScaling = meshInterface->getScaling();
+
+ int i;
+ for (i = endNode - 1; i >= firstNode; i--)
+ {
+ btQuantizedBvhNode& curNode = m_quantizedContiguousNodes[i];
+ if (curNode.isLeafNode())
{
+ //recalc aabb from triangle data
+ int nodeSubPart = curNode.getPartId();
+ int nodeTriangleIndex = curNode.getTriangleIndex();
+ if (nodeSubPart != curNodeSubPart)
+ {
+ if (curNodeSubPart >= 0)
+ meshInterface->unLockReadOnlyVertexBase(curNodeSubPart);
+ meshInterface->getLockedReadOnlyVertexIndexBase(&vertexbase, numverts, type, stride, &indexbase, indexstride, numfaces, indicestype, nodeSubPart);
+ curNodeSubPart = nodeSubPart;
+ btAssert(indicestype == PHY_INTEGER || indicestype == PHY_SHORT);
+ }
+ //triangles->getLockedReadOnlyVertexIndexBase(vertexBase,numVerts,
- btQuantizedBvhNode& curNode = m_quantizedContiguousNodes[i];
- if (curNode.isLeafNode())
+ unsigned int* gfxbase = (unsigned int*)(indexbase + nodeTriangleIndex * indexstride);
+
+ for (int j = 2; j >= 0; j--)
{
- //recalc aabb from triangle data
- int nodeSubPart = curNode.getPartId();
- int nodeTriangleIndex = curNode.getTriangleIndex();
- if (nodeSubPart != curNodeSubPart)
+ int graphicsindex = indicestype == PHY_SHORT ? ((unsigned short*)gfxbase)[j] : gfxbase[j];
+ if (type == PHY_FLOAT)
{
- if (curNodeSubPart >= 0)
- meshInterface->unLockReadOnlyVertexBase(curNodeSubPart);
- meshInterface->getLockedReadOnlyVertexIndexBase(&vertexbase,numverts, type,stride,&indexbase,indexstride,numfaces,indicestype,nodeSubPart);
-
- curNodeSubPart = nodeSubPart;
- btAssert(indicestype==PHY_INTEGER||indicestype==PHY_SHORT);
+ float* graphicsbase = (float*)(vertexbase + graphicsindex * stride);
+ triangleVerts[j] = btVector3(
+ graphicsbase[0] * meshScaling.getX(),
+ graphicsbase[1] * meshScaling.getY(),
+ graphicsbase[2] * meshScaling.getZ());
}
- //triangles->getLockedReadOnlyVertexIndexBase(vertexBase,numVerts,
-
- unsigned int* gfxbase = (unsigned int*)(indexbase+nodeTriangleIndex*indexstride);
-
-
- for (int j=2;j>=0;j--)
+ else
{
-
- int graphicsindex = indicestype==PHY_SHORT?((unsigned short*)gfxbase)[j]:gfxbase[j];
- if (type == PHY_FLOAT)
- {
- float* graphicsbase = (float*)(vertexbase+graphicsindex*stride);
- triangleVerts[j] = btVector3(
- graphicsbase[0]*meshScaling.getX(),
- graphicsbase[1]*meshScaling.getY(),
- graphicsbase[2]*meshScaling.getZ());
- }
- else
- {
- double* graphicsbase = (double*)(vertexbase+graphicsindex*stride);
- triangleVerts[j] = btVector3( btScalar(graphicsbase[0]*meshScaling.getX()), btScalar(graphicsbase[1]*meshScaling.getY()), btScalar(graphicsbase[2]*meshScaling.getZ()));
- }
+ double* graphicsbase = (double*)(vertexbase + graphicsindex * stride);
+ triangleVerts[j] = btVector3(btScalar(graphicsbase[0] * meshScaling.getX()), btScalar(graphicsbase[1] * meshScaling.getY()), btScalar(graphicsbase[2] * meshScaling.getZ()));
}
+ }
+ aabbMin.setValue(btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT));
+ aabbMax.setValue(btScalar(-BT_LARGE_FLOAT), btScalar(-BT_LARGE_FLOAT), btScalar(-BT_LARGE_FLOAT));
+ aabbMin.setMin(triangleVerts[0]);
+ aabbMax.setMax(triangleVerts[0]);
+ aabbMin.setMin(triangleVerts[1]);
+ aabbMax.setMax(triangleVerts[1]);
+ aabbMin.setMin(triangleVerts[2]);
+ aabbMax.setMax(triangleVerts[2]);
+
+ quantize(&curNode.m_quantizedAabbMin[0], aabbMin, 0);
+ quantize(&curNode.m_quantizedAabbMax[0], aabbMax, 1);
+ }
+ else
+ {
+ //combine aabb from both children
-
- aabbMin.setValue(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
- aabbMax.setValue(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
- aabbMin.setMin(triangleVerts[0]);
- aabbMax.setMax(triangleVerts[0]);
- aabbMin.setMin(triangleVerts[1]);
- aabbMax.setMax(triangleVerts[1]);
- aabbMin.setMin(triangleVerts[2]);
- aabbMax.setMax(triangleVerts[2]);
-
- quantize(&curNode.m_quantizedAabbMin[0],aabbMin,0);
- quantize(&curNode.m_quantizedAabbMax[0],aabbMax,1);
-
- } else
- {
- //combine aabb from both children
+ btQuantizedBvhNode* leftChildNode = &m_quantizedContiguousNodes[i + 1];
- btQuantizedBvhNode* leftChildNode = &m_quantizedContiguousNodes[i+1];
-
- btQuantizedBvhNode* rightChildNode = leftChildNode->isLeafNode() ? &m_quantizedContiguousNodes[i+2] :
- &m_quantizedContiguousNodes[i+1+leftChildNode->getEscapeIndex()];
-
+ btQuantizedBvhNode* rightChildNode = leftChildNode->isLeafNode() ? &m_quantizedContiguousNodes[i + 2] : &m_quantizedContiguousNodes[i + 1 + leftChildNode->getEscapeIndex()];
+ {
+ for (int i = 0; i < 3; i++)
{
- for (int i=0;i<3;i++)
- {
- curNode.m_quantizedAabbMin[i] = leftChildNode->m_quantizedAabbMin[i];
- if (curNode.m_quantizedAabbMin[i]>rightChildNode->m_quantizedAabbMin[i])
- curNode.m_quantizedAabbMin[i]=rightChildNode->m_quantizedAabbMin[i];
-
- curNode.m_quantizedAabbMax[i] = leftChildNode->m_quantizedAabbMax[i];
- if (curNode.m_quantizedAabbMax[i] < rightChildNode->m_quantizedAabbMax[i])
- curNode.m_quantizedAabbMax[i] = rightChildNode->m_quantizedAabbMax[i];
- }
+ curNode.m_quantizedAabbMin[i] = leftChildNode->m_quantizedAabbMin[i];
+ if (curNode.m_quantizedAabbMin[i] > rightChildNode->m_quantizedAabbMin[i])
+ curNode.m_quantizedAabbMin[i] = rightChildNode->m_quantizedAabbMin[i];
+
+ curNode.m_quantizedAabbMax[i] = leftChildNode->m_quantizedAabbMax[i];
+ if (curNode.m_quantizedAabbMax[i] < rightChildNode->m_quantizedAabbMax[i])
+ curNode.m_quantizedAabbMax[i] = rightChildNode->m_quantizedAabbMax[i];
}
}
-
}
+ }
- if (curNodeSubPart >= 0)
- meshInterface->unLockReadOnlyVertexBase(curNodeSubPart);
-
-
+ if (curNodeSubPart >= 0)
+ meshInterface->unLockReadOnlyVertexBase(curNodeSubPart);
}
///deSerializeInPlace loads and initializes a BVH from a buffer in memory 'in place'
-btOptimizedBvh* btOptimizedBvh::deSerializeInPlace(void *i_alignedDataBuffer, unsigned int i_dataBufferSize, bool i_swapEndian)
+btOptimizedBvh* btOptimizedBvh::deSerializeInPlace(void* i_alignedDataBuffer, unsigned int i_dataBufferSize, bool i_swapEndian)
{
- btQuantizedBvh* bvh = btQuantizedBvh::deSerializeInPlace(i_alignedDataBuffer,i_dataBufferSize,i_swapEndian);
-
+ btQuantizedBvh* bvh = btQuantizedBvh::deSerializeInPlace(i_alignedDataBuffer, i_dataBufferSize, i_swapEndian);
+
//we don't add additional data so just do a static upcast
return static_cast<btOptimizedBvh*>(bvh);
}
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btOptimizedBvh.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btOptimizedBvh.h
index 715961f552..22f131c8b2 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btOptimizedBvh.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btOptimizedBvh.h
@@ -22,44 +22,35 @@ subject to the following restrictions:
class btStridingMeshInterface;
-
///The btOptimizedBvh extends the btQuantizedBvh to create AABB tree for triangle meshes, through the btStridingMeshInterface.
-ATTRIBUTE_ALIGNED16(class) btOptimizedBvh : public btQuantizedBvh
+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 build(btStridingMeshInterface * triangles, bool useQuantizedAabbCompression, const btVector3& bvhAabbMin, const btVector3& bvhAabbMax);
- void refit(btStridingMeshInterface* triangles,const btVector3& aabbMin,const btVector3& aabbMax);
+ void refit(btStridingMeshInterface * triangles, const btVector3& aabbMin, const btVector3& aabbMax);
- void refitPartial(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);
+ 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
+ virtual bool serializeInPlace(void* o_alignedDataBuffer, unsigned i_dataBufferSize, bool i_swapEndian) const
{
- return btQuantizedBvh::serialize(o_alignedDataBuffer,i_dataBufferSize,i_swapEndian);
-
+ 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);
-
-
+ static btOptimizedBvh* deSerializeInPlace(void* i_alignedDataBuffer, unsigned int i_dataBufferSize, bool i_swapEndian);
};
-
-#endif //BT_OPTIMIZED_BVH_H
-
-
+#endif //BT_OPTIMIZED_BVH_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btPolyhedralConvexShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btPolyhedralConvexShape.cpp
index d51b6760fc..521ecfc760 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btPolyhedralConvexShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btPolyhedralConvexShape.cpp
@@ -12,7 +12,7 @@ subject to the following restrictions:
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
-#if defined (_WIN32) || defined (__i386__)
+#if defined(_WIN32) || defined(__i386__)
#define BT_USE_SSE_IN_API
#endif
@@ -23,11 +23,9 @@ subject to the following restrictions:
#include "LinearMath/btGeometryUtil.h"
#include "LinearMath/btGrahamScan2dConvexHull.h"
-
-btPolyhedralConvexShape::btPolyhedralConvexShape() :btConvexInternalShape(),
-m_polyhedron(0)
+btPolyhedralConvexShape::btPolyhedralConvexShape() : btConvexInternalShape(),
+ m_polyhedron(0)
{
-
}
btPolyhedralConvexShape::~btPolyhedralConvexShape()
@@ -44,65 +42,65 @@ void btPolyhedralConvexShape::setPolyhedralFeatures(btConvexPolyhedron& polyhedr
if (m_polyhedron)
{
*m_polyhedron = polyhedron;
- } else
+ }
+ else
{
- void* mem = btAlignedAlloc(sizeof(btConvexPolyhedron),16);
+ void* mem = btAlignedAlloc(sizeof(btConvexPolyhedron), 16);
m_polyhedron = new (mem) btConvexPolyhedron(polyhedron);
}
}
-bool btPolyhedralConvexShape::initializePolyhedralFeatures(int shiftVerticesByMargin)
+bool btPolyhedralConvexShape::initializePolyhedralFeatures(int shiftVerticesByMargin)
{
-
if (m_polyhedron)
{
m_polyhedron->~btConvexPolyhedron();
btAlignedFree(m_polyhedron);
}
-
- void* mem = btAlignedAlloc(sizeof(btConvexPolyhedron),16);
+
+ void* mem = btAlignedAlloc(sizeof(btConvexPolyhedron), 16);
m_polyhedron = new (mem) btConvexPolyhedron;
btAlignedObjectArray<btVector3> orgVertices;
- for (int i=0;i<getNumVertices();i++)
+ for (int i = 0; i < getNumVertices(); i++)
{
btVector3& newVertex = orgVertices.expand();
- getVertex(i,newVertex);
+ getVertex(i, newVertex);
}
-
+
btConvexHullComputer conv;
-
+
if (shiftVerticesByMargin)
{
btAlignedObjectArray<btVector3> planeEquations;
- btGeometryUtil::getPlaneEquationsFromVertices(orgVertices,planeEquations);
+ btGeometryUtil::getPlaneEquationsFromVertices(orgVertices, planeEquations);
btAlignedObjectArray<btVector3> shiftedPlaneEquations;
- for (int p=0;p<planeEquations.size();p++)
+ for (int p = 0; p < planeEquations.size(); p++)
{
- btVector3 plane = planeEquations[p];
- // btScalar margin = getMargin();
- plane[3] -= getMargin();
- shiftedPlaneEquations.push_back(plane);
+ btVector3 plane = planeEquations[p];
+ // btScalar margin = getMargin();
+ plane[3] -= getMargin();
+ shiftedPlaneEquations.push_back(plane);
}
btAlignedObjectArray<btVector3> tmpVertices;
- btGeometryUtil::getVerticesFromPlaneEquations(shiftedPlaneEquations,tmpVertices);
-
- conv.compute(&tmpVertices[0].getX(), sizeof(btVector3),tmpVertices.size(),0.f,0.f);
- } else
+ btGeometryUtil::getVerticesFromPlaneEquations(shiftedPlaneEquations, tmpVertices);
+
+ conv.compute(&tmpVertices[0].getX(), sizeof(btVector3), tmpVertices.size(), 0.f, 0.f);
+ }
+ else
{
-
- conv.compute(&orgVertices[0].getX(), sizeof(btVector3),orgVertices.size(),0.f,0.f);
+ conv.compute(&orgVertices[0].getX(), sizeof(btVector3), orgVertices.size(), 0.f, 0.f);
}
#ifndef BT_RECONSTRUCT_FACES
-
+
int numVertices = conv.vertices.size();
m_polyhedron->m_vertices.resize(numVertices);
- for (int p=0;p<numVertices;p++)
+ for (int p = 0; p < numVertices; p++)
{
m_polyhedron->m_vertices[p] = conv.vertices[p];
}
@@ -115,78 +113,72 @@ bool btPolyhedralConvexShape::initializePolyhedralFeatures(int shiftVerticesByMa
btFace combinedFace;
const btConvexHullComputer::Edge* edge = &conv.edges[conv.faces[j]];
v0 = edge->getSourceVertex();
- int prevVertex=v0;
+ int prevVertex = v0;
combinedFace.m_indices.push_back(v0);
v1 = edge->getTargetVertex();
while (v1 != v0)
{
-
btVector3 wa = conv.vertices[prevVertex];
btVector3 wb = conv.vertices[v1];
- btVector3 newEdge = wb-wa;
+ btVector3 newEdge = wb - wa;
newEdge.normalize();
- if (numEdges<2)
+ if (numEdges < 2)
edges[numEdges++] = newEdge;
-
//face->addIndex(v1);
combinedFace.m_indices.push_back(v1);
edge = edge->getNextEdgeOfFace();
prevVertex = v1;
int v01 = edge->getSourceVertex();
v1 = edge->getTargetVertex();
-
}
-
+
btAssert(combinedFace.m_indices.size() > 2);
btVector3 faceNormal = edges[0].cross(edges[1]);
faceNormal.normalize();
- btScalar planeEq=1e30f;
+ btScalar planeEq = 1e30f;
- for (int v=0;v<combinedFace.m_indices.size();v++)
+ for (int v = 0; v < combinedFace.m_indices.size(); v++)
{
btScalar eq = m_polyhedron->m_vertices[combinedFace.m_indices[v]].dot(faceNormal);
- if (planeEq>eq)
+ if (planeEq > eq)
{
- planeEq=eq;
+ planeEq = eq;
}
}
combinedFace.m_plane[0] = faceNormal.getX();
combinedFace.m_plane[1] = faceNormal.getY();
combinedFace.m_plane[2] = faceNormal.getZ();
combinedFace.m_plane[3] = -planeEq;
-
+
m_polyhedron->m_faces.push_back(combinedFace);
}
-
-#else//BT_RECONSTRUCT_FACES
+#else //BT_RECONSTRUCT_FACES
btAlignedObjectArray<btVector3> faceNormals;
int numFaces = conv.faces.size();
faceNormals.resize(numFaces);
btConvexHullComputer* convexUtil = &conv;
-
- btAlignedObjectArray<btFace> tmpFaces;
+ btAlignedObjectArray<btFace> tmpFaces;
tmpFaces.resize(numFaces);
int numVertices = convexUtil->vertices.size();
m_polyhedron->m_vertices.resize(numVertices);
- for (int p=0;p<numVertices;p++)
+ for (int p = 0; p < numVertices; p++)
{
m_polyhedron->m_vertices[p] = convexUtil->vertices[p];
}
-
- for (int i=0;i<numFaces;i++)
+ for (int i = 0; i < numFaces; i++)
{
int face = convexUtil->faces[i];
//printf("face=%d\n",face);
- const btConvexHullComputer::Edge* firstEdge = &convexUtil->edges[face];
- const btConvexHullComputer::Edge* edge = firstEdge;
+ const btConvexHullComputer::Edge* firstEdge = &convexUtil->edges[face];
+ const btConvexHullComputer::Edge* edge = firstEdge;
btVector3 edges[3];
int numEdges = 0;
@@ -194,25 +186,23 @@ bool btPolyhedralConvexShape::initializePolyhedralFeatures(int shiftVerticesByMa
do
{
-
int src = edge->getSourceVertex();
tmpFaces[i].m_indices.push_back(src);
int targ = edge->getTargetVertex();
btVector3 wa = convexUtil->vertices[src];
btVector3 wb = convexUtil->vertices[targ];
- btVector3 newEdge = wb-wa;
+ btVector3 newEdge = wb - wa;
newEdge.normalize();
- if (numEdges<2)
+ if (numEdges < 2)
edges[numEdges++] = newEdge;
edge = edge->getNextEdgeOfFace();
- } while (edge!=firstEdge);
+ } while (edge != firstEdge);
btScalar planeEq = 1e30f;
-
- if (numEdges==2)
+ if (numEdges == 2)
{
faceNormals[i] = edges[0].cross(edges[1]);
faceNormals[i].normalize();
@@ -220,20 +210,19 @@ bool btPolyhedralConvexShape::initializePolyhedralFeatures(int shiftVerticesByMa
tmpFaces[i].m_plane[1] = faceNormals[i].getY();
tmpFaces[i].m_plane[2] = faceNormals[i].getZ();
tmpFaces[i].m_plane[3] = planeEq;
-
}
else
{
- btAssert(0);//degenerate?
+ btAssert(0); //degenerate?
faceNormals[i].setZero();
}
- for (int v=0;v<tmpFaces[i].m_indices.size();v++)
+ for (int v = 0; v < tmpFaces[i].m_indices.size(); v++)
{
btScalar eq = m_polyhedron->m_vertices[tmpFaces[i].m_indices[v]].dot(faceNormals[i]);
- if (planeEq>eq)
+ if (planeEq > eq)
{
- planeEq=eq;
+ planeEq = eq;
}
}
tmpFaces[i].m_plane[3] = -planeEq;
@@ -241,89 +230,86 @@ bool btPolyhedralConvexShape::initializePolyhedralFeatures(int shiftVerticesByMa
//merge coplanar faces and copy them to m_polyhedron
- btScalar faceWeldThreshold= 0.999f;
+ btScalar faceWeldThreshold = 0.999f;
btAlignedObjectArray<int> todoFaces;
- for (int i=0;i<tmpFaces.size();i++)
+ for (int i = 0; i < tmpFaces.size(); i++)
todoFaces.push_back(i);
while (todoFaces.size())
{
btAlignedObjectArray<int> coplanarFaceGroup;
- int refFace = todoFaces[todoFaces.size()-1];
+ int refFace = todoFaces[todoFaces.size() - 1];
coplanarFaceGroup.push_back(refFace);
btFace& faceA = tmpFaces[refFace];
todoFaces.pop_back();
- btVector3 faceNormalA(faceA.m_plane[0],faceA.m_plane[1],faceA.m_plane[2]);
- for (int j=todoFaces.size()-1;j>=0;j--)
+ btVector3 faceNormalA(faceA.m_plane[0], faceA.m_plane[1], faceA.m_plane[2]);
+ for (int j = todoFaces.size() - 1; j >= 0; j--)
{
int i = todoFaces[j];
btFace& faceB = tmpFaces[i];
- btVector3 faceNormalB(faceB.m_plane[0],faceB.m_plane[1],faceB.m_plane[2]);
- if (faceNormalA.dot(faceNormalB)>faceWeldThreshold)
+ btVector3 faceNormalB(faceB.m_plane[0], faceB.m_plane[1], faceB.m_plane[2]);
+ if (faceNormalA.dot(faceNormalB) > faceWeldThreshold)
{
coplanarFaceGroup.push_back(i);
todoFaces.remove(i);
}
}
-
bool did_merge = false;
- if (coplanarFaceGroup.size()>1)
+ if (coplanarFaceGroup.size() > 1)
{
//do the merge: use Graham Scan 2d convex hull
btAlignedObjectArray<GrahamVector3> orgpoints;
- btVector3 averageFaceNormal(0,0,0);
+ btVector3 averageFaceNormal(0, 0, 0);
- for (int i=0;i<coplanarFaceGroup.size();i++)
+ for (int i = 0; i < coplanarFaceGroup.size(); i++)
{
-// m_polyhedron->m_faces.push_back(tmpFaces[coplanarFaceGroup[i]]);
+ // m_polyhedron->m_faces.push_back(tmpFaces[coplanarFaceGroup[i]]);
btFace& face = tmpFaces[coplanarFaceGroup[i]];
- btVector3 faceNormal(face.m_plane[0],face.m_plane[1],face.m_plane[2]);
- averageFaceNormal+=faceNormal;
- for (int f=0;f<face.m_indices.size();f++)
+ btVector3 faceNormal(face.m_plane[0], face.m_plane[1], face.m_plane[2]);
+ averageFaceNormal += faceNormal;
+ for (int f = 0; f < face.m_indices.size(); f++)
{
int orgIndex = face.m_indices[f];
btVector3 pt = m_polyhedron->m_vertices[orgIndex];
-
+
bool found = false;
- for (int i=0;i<orgpoints.size();i++)
+ for (int i = 0; i < orgpoints.size(); i++)
{
//if ((orgpoints[i].m_orgIndex == orgIndex) || ((rotatedPt-orgpoints[i]).length2()<0.0001))
if (orgpoints[i].m_orgIndex == orgIndex)
{
- found=true;
+ found = true;
break;
}
}
if (!found)
- orgpoints.push_back(GrahamVector3(pt,orgIndex));
+ orgpoints.push_back(GrahamVector3(pt, orgIndex));
}
}
-
-
btFace combinedFace;
- for (int i=0;i<4;i++)
+ for (int i = 0; i < 4; i++)
combinedFace.m_plane[i] = tmpFaces[coplanarFaceGroup[0]].m_plane[i];
btAlignedObjectArray<GrahamVector3> hull;
averageFaceNormal.normalize();
- GrahamScanConvexHull2D(orgpoints,hull,averageFaceNormal);
+ GrahamScanConvexHull2D(orgpoints, hull, averageFaceNormal);
- for (int i=0;i<hull.size();i++)
+ for (int i = 0; i < hull.size(); i++)
{
combinedFace.m_indices.push_back(hull[i].m_orgIndex);
- for(int k = 0; k < orgpoints.size(); k++)
+ for (int k = 0; k < orgpoints.size(); k++)
{
- if(orgpoints[k].m_orgIndex == hull[i].m_orgIndex)
+ if (orgpoints[k].m_orgIndex == hull[i].m_orgIndex)
{
- orgpoints[k].m_orgIndex = -1; // invalidate...
+ orgpoints[k].m_orgIndex = -1; // invalidate...
break;
}
}
@@ -331,38 +317,41 @@ bool btPolyhedralConvexShape::initializePolyhedralFeatures(int shiftVerticesByMa
// are there rejected vertices?
bool reject_merge = false;
-
-
- for(int i = 0; i < orgpoints.size(); i++) {
- if(orgpoints[i].m_orgIndex == -1)
- continue; // this is in the hull...
+ for (int i = 0; i < orgpoints.size(); i++)
+ {
+ if (orgpoints[i].m_orgIndex == -1)
+ continue; // this is in the hull...
// this vertex is rejected -- is anybody else using this vertex?
- for(int j = 0; j < tmpFaces.size(); j++) {
-
+ for (int j = 0; j < tmpFaces.size(); j++)
+ {
btFace& face = tmpFaces[j];
// is this a face of the current coplanar group?
bool is_in_current_group = false;
- for(int k = 0; k < coplanarFaceGroup.size(); k++) {
- if(coplanarFaceGroup[k] == j) {
+ for (int k = 0; k < coplanarFaceGroup.size(); k++)
+ {
+ if (coplanarFaceGroup[k] == j)
+ {
is_in_current_group = true;
break;
}
}
- if(is_in_current_group) // ignore this face...
+ if (is_in_current_group) // ignore this face...
continue;
// does this face use this rejected vertex?
- for(int v = 0; v < face.m_indices.size(); v++) {
- if(face.m_indices[v] == orgpoints[i].m_orgIndex) {
+ for (int v = 0; v < face.m_indices.size(); v++)
+ {
+ if (face.m_indices[v] == orgpoints[i].m_orgIndex)
+ {
// this rejected vertex is used in another face -- reject merge
reject_merge = true;
break;
}
}
- if(reject_merge)
+ if (reject_merge)
break;
}
- if(reject_merge)
+ if (reject_merge)
break;
}
@@ -373,21 +362,17 @@ bool btPolyhedralConvexShape::initializePolyhedralFeatures(int shiftVerticesByMa
m_polyhedron->m_faces.push_back(combinedFace);
}
}
- if(!did_merge)
+ if (!did_merge)
{
- for (int i=0;i<coplanarFaceGroup.size();i++)
+ for (int i = 0; i < coplanarFaceGroup.size(); i++)
{
btFace face = tmpFaces[coplanarFaceGroup[i]];
m_polyhedron->m_faces.push_back(face);
}
-
- }
-
-
-
+ }
}
-#endif //BT_RECONSTRUCT_FACES
+#endif //BT_RECONSTRUCT_FACES
m_polyhedron->initialize();
@@ -395,14 +380,12 @@ bool btPolyhedralConvexShape::initializePolyhedralFeatures(int shiftVerticesByMa
}
#ifndef MIN
- #define MIN(_a, _b) ((_a) < (_b) ? (_a) : (_b))
+#define MIN(_a, _b) ((_a) < (_b) ? (_a) : (_b))
#endif
-btVector3 btPolyhedralConvexShape::localGetSupportingVertexWithoutMargin(const btVector3& vec0)const
+btVector3 btPolyhedralConvexShape::localGetSupportingVertexWithoutMargin(const btVector3& vec0) const
{
-
-
- btVector3 supVec(0,0,0);
+ btVector3 supVec(0, 0, 0);
#ifndef __SPU__
int i;
btScalar maxDot(btScalar(-BT_LARGE_FLOAT));
@@ -411,37 +394,36 @@ btVector3 btPolyhedralConvexShape::localGetSupportingVertexWithoutMargin(const b
btScalar lenSqr = vec.length2();
if (lenSqr < btScalar(0.0001))
{
- vec.setValue(1,0,0);
- } else
+ vec.setValue(1, 0, 0);
+ }
+ else
{
- btScalar rlen = btScalar(1.) / btSqrt(lenSqr );
+ btScalar rlen = btScalar(1.) / btSqrt(lenSqr);
vec *= rlen;
}
btVector3 vtx;
btScalar newDot;
- for( int k = 0; k < getNumVertices(); k += 128 )
- {
- btVector3 temp[128];
- int inner_count = MIN(getNumVertices() - k, 128);
- for( i = 0; i < inner_count; i++ )
- getVertex(i,temp[i]);
- i = (int) vec.maxDot( temp, inner_count, newDot);
+ for (int k = 0; k < getNumVertices(); k += 128)
+ {
+ btVector3 temp[128];
+ int inner_count = MIN(getNumVertices() - k, 128);
+ for (i = 0; i < inner_count; i++)
+ getVertex(i, temp[i]);
+ i = (int)vec.maxDot(temp, inner_count, newDot);
if (newDot > maxDot)
{
maxDot = newDot;
supVec = temp[i];
- }
- }
-
-#endif //__SPU__
+ }
+ }
+
+#endif //__SPU__
return supVec;
}
-
-
-void btPolyhedralConvexShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const
+void btPolyhedralConvexShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const
{
#ifndef __SPU__
int i;
@@ -449,36 +431,34 @@ void btPolyhedralConvexShape::batchedUnitVectorGetSupportingVertexWithoutMargin(
btVector3 vtx;
btScalar newDot;
- for (i=0;i<numVectors;i++)
+ for (i = 0; i < numVectors; i++)
{
supportVerticesOut[i][3] = btScalar(-BT_LARGE_FLOAT);
}
- for (int j=0;j<numVectors;j++)
+ for (int j = 0; j < numVectors; j++)
{
- const btVector3& vec = vectors[j];
-
- for( int k = 0; k < getNumVertices(); k += 128 )
- {
- btVector3 temp[128];
- int inner_count = MIN(getNumVertices() - k, 128);
- for( i = 0; i < inner_count; i++ )
- getVertex(i,temp[i]);
- i = (int) vec.maxDot( temp, inner_count, newDot);
- if (newDot > supportVerticesOut[j][3])
- {
+ const btVector3& vec = vectors[j];
+
+ for (int k = 0; k < getNumVertices(); k += 128)
+ {
+ btVector3 temp[128];
+ int inner_count = MIN(getNumVertices() - k, 128);
+ for (i = 0; i < inner_count; i++)
+ getVertex(i, temp[i]);
+ i = (int)vec.maxDot(temp, inner_count, newDot);
+ if (newDot > supportVerticesOut[j][3])
+ {
supportVerticesOut[j] = temp[i];
supportVerticesOut[j][3] = newDot;
- }
- }
- }
+ }
+ }
+ }
-#endif //__SPU__
+#endif //__SPU__
}
-
-
-void btPolyhedralConvexShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const
+void btPolyhedralConvexShape::calculateLocalInertia(btScalar mass, btVector3& inertia) const
{
#ifndef __SPU__
//not yet, return box inertia
@@ -487,81 +467,77 @@ void btPolyhedralConvexShape::calculateLocalInertia(btScalar mass,btVector3& ine
btTransform ident;
ident.setIdentity();
- btVector3 aabbMin,aabbMax;
- getAabb(ident,aabbMin,aabbMax);
- btVector3 halfExtents = (aabbMax-aabbMin)*btScalar(0.5);
-
- 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;
+ btVector3 aabbMin, aabbMax;
+ getAabb(ident, aabbMin, aabbMax);
+ btVector3 halfExtents = (aabbMax - aabbMin) * btScalar(0.5);
+
+ 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));
-#endif //__SPU__
+ inertia = scaledmass * (btVector3(y2 + z2, x2 + z2, x2 + y2));
+#endif //__SPU__
}
-
-
-void btPolyhedralConvexAabbCachingShape::setLocalScaling(const btVector3& scaling)
+void btPolyhedralConvexAabbCachingShape::setLocalScaling(const btVector3& scaling)
{
btConvexInternalShape::setLocalScaling(scaling);
recalcLocalAabb();
}
btPolyhedralConvexAabbCachingShape::btPolyhedralConvexAabbCachingShape()
-:btPolyhedralConvexShape(),
-m_localAabbMin(1,1,1),
-m_localAabbMax(-1,-1,-1),
-m_isLocalAabbValid(false)
+ : btPolyhedralConvexShape(),
+ m_localAabbMin(1, 1, 1),
+ m_localAabbMax(-1, -1, -1),
+ m_isLocalAabbValid(false)
{
}
-void btPolyhedralConvexAabbCachingShape::getAabb(const btTransform& trans,btVector3& aabbMin,btVector3& aabbMax) const
+void btPolyhedralConvexAabbCachingShape::getAabb(const btTransform& trans, btVector3& aabbMin, btVector3& aabbMax) const
{
- getNonvirtualAabb(trans,aabbMin,aabbMax,getMargin());
+ getNonvirtualAabb(trans, aabbMin, aabbMax, getMargin());
}
-void btPolyhedralConvexAabbCachingShape::recalcLocalAabb()
+void btPolyhedralConvexAabbCachingShape::recalcLocalAabb()
{
m_isLocalAabbValid = true;
-
- #if 1
+
+#if 1
static const btVector3 _directions[] =
- {
- btVector3( 1., 0., 0.),
- btVector3( 0., 1., 0.),
- btVector3( 0., 0., 1.),
- btVector3( -1., 0., 0.),
- btVector3( 0., -1., 0.),
- btVector3( 0., 0., -1.)
- };
-
+ {
+ btVector3(1., 0., 0.),
+ btVector3(0., 1., 0.),
+ btVector3(0., 0., 1.),
+ btVector3(-1., 0., 0.),
+ btVector3(0., -1., 0.),
+ btVector3(0., 0., -1.)};
+
btVector3 _supporting[] =
- {
- btVector3( 0., 0., 0.),
- btVector3( 0., 0., 0.),
- btVector3( 0., 0., 0.),
- btVector3( 0., 0., 0.),
- btVector3( 0., 0., 0.),
- btVector3( 0., 0., 0.)
- };
-
+ {
+ btVector3(0., 0., 0.),
+ btVector3(0., 0., 0.),
+ btVector3(0., 0., 0.),
+ btVector3(0., 0., 0.),
+ btVector3(0., 0., 0.),
+ btVector3(0., 0., 0.)};
+
batchedUnitVectorGetSupportingVertexWithoutMargin(_directions, _supporting, 6);
-
- for ( int i = 0; i < 3; ++i )
+
+ for (int i = 0; i < 3; ++i)
{
m_localAabbMax[i] = _supporting[i][i] + m_collisionMargin;
m_localAabbMin[i] = _supporting[i + 3][i] - m_collisionMargin;
}
-
- #else
- for (int i=0;i<3;i++)
+#else
+
+ for (int i = 0; i < 3; i++)
{
- btVector3 vec(btScalar(0.),btScalar(0.),btScalar(0.));
+ btVector3 vec(btScalar(0.), btScalar(0.), btScalar(0.));
vec[i] = btScalar(1.);
btVector3 tmp = localGetSupportingVertex(vec);
m_localAabbMax[i] = tmp[i];
@@ -569,9 +545,5 @@ void btPolyhedralConvexAabbCachingShape::recalcLocalAabb()
tmp = localGetSupportingVertex(vec);
m_localAabbMin[i] = tmp[i];
}
- #endif
+#endif
}
-
-
-
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btPolyhedralConvexShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btPolyhedralConvexShape.h
index b7ddb6e060..b3ffab7a23 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btPolyhedralConvexShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btPolyhedralConvexShape.h
@@ -20,20 +20,15 @@ subject to the following restrictions:
#include "btConvexInternalShape.h"
class btConvexPolyhedron;
-
///The btPolyhedralConvexShape is an internal interface class for polyhedral convex shapes.
-ATTRIBUTE_ALIGNED16(class) btPolyhedralConvexShape : public btConvexInternalShape
+ATTRIBUTE_ALIGNED16(class)
+btPolyhedralConvexShape : public btConvexInternalShape
{
-
-
protected:
-
btConvexPolyhedron* m_polyhedron;
public:
-
BT_DECLARE_ALIGNED_ALLOCATOR();
-
btPolyhedralConvexShape();
@@ -41,55 +36,49 @@ public:
///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 bool initializePolyhedralFeatures(int shiftVerticesByMargin = 0);
- virtual void setPolyhedralFeatures(btConvexPolyhedron& polyhedron);
-
+ virtual void setPolyhedralFeatures(btConvexPolyhedron & polyhedron);
- const btConvexPolyhedron* getConvexPolyhedron() const
+ 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 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;
-
-};
+ 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;
- btVector3 m_localAabbMin;
- btVector3 m_localAabbMax;
- bool m_isLocalAabbValid;
-
protected:
-
- void setCachedLocalAabb (const btVector3& aabbMin, const btVector3& aabbMax)
+ 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
+ inline void getCachedLocalAabb(btVector3& aabbMin, btVector3& aabbMax) const
{
btAssert(m_isLocalAabbValid);
aabbMin = m_localAabbMin;
@@ -97,25 +86,21 @@ protected:
}
protected:
-
btPolyhedralConvexAabbCachingShape();
-
+
public:
-
- inline void getNonvirtualAabb(const btTransform& trans,btVector3& aabbMin,btVector3& aabbMax, btScalar margin) const
+ 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);
+ 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;
+ virtual void setLocalScaling(const btVector3& scaling);
- void recalcLocalAabb();
+ virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const;
+ void recalcLocalAabb();
};
-#endif //BT_POLYHEDRAL_CONVEX_SHAPE_H
+#endif //BT_POLYHEDRAL_CONVEX_SHAPE_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.cpp
index 6a337c786c..f427319974 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.cpp
@@ -13,11 +13,10 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btScaledBvhTriangleMeshShape.h"
-btScaledBvhTriangleMeshShape::btScaledBvhTriangleMeshShape(btBvhTriangleMeshShape* childShape,const btVector3& localScaling)
-:m_localScaling(localScaling),m_bvhTriMeshShape(childShape)
+btScaledBvhTriangleMeshShape::btScaledBvhTriangleMeshShape(btBvhTriangleMeshShape* childShape, const btVector3& localScaling)
+ : m_localScaling(localScaling), m_bvhTriMeshShape(childShape)
{
m_shapeType = SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE;
}
@@ -26,55 +25,51 @@ btScaledBvhTriangleMeshShape::~btScaledBvhTriangleMeshShape()
{
}
-
class btScaledTriangleCallback : public btTriangleCallback
{
btTriangleCallback* m_originalCallback;
- btVector3 m_localScaling;
+ btVector3 m_localScaling;
public:
-
- btScaledTriangleCallback(btTriangleCallback* originalCallback,const btVector3& localScaling)
- :m_originalCallback(originalCallback),
- m_localScaling(localScaling)
+ btScaledTriangleCallback(btTriangleCallback* originalCallback, const btVector3& localScaling)
+ : m_originalCallback(originalCallback),
+ m_localScaling(localScaling)
{
}
virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex)
{
btVector3 newTriangle[3];
- newTriangle[0] = triangle[0]*m_localScaling;
- newTriangle[1] = triangle[1]*m_localScaling;
- newTriangle[2] = triangle[2]*m_localScaling;
- m_originalCallback->processTriangle(&newTriangle[0],partId,triangleIndex);
+ newTriangle[0] = triangle[0] * m_localScaling;
+ newTriangle[1] = triangle[1] * m_localScaling;
+ newTriangle[2] = triangle[2] * m_localScaling;
+ m_originalCallback->processTriangle(&newTriangle[0], partId, triangleIndex);
}
};
-void btScaledBvhTriangleMeshShape::processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const
+void btScaledBvhTriangleMeshShape::processAllTriangles(btTriangleCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax) const
{
- btScaledTriangleCallback scaledCallback(callback,m_localScaling);
-
- btVector3 invLocalScaling(1.f/m_localScaling.getX(),1.f/m_localScaling.getY(),1.f/m_localScaling.getZ());
- btVector3 scaledAabbMin,scaledAabbMax;
+ btScaledTriangleCallback scaledCallback(callback, m_localScaling);
+
+ btVector3 invLocalScaling(1.f / m_localScaling.getX(), 1.f / m_localScaling.getY(), 1.f / m_localScaling.getZ());
+ btVector3 scaledAabbMin, scaledAabbMax;
///support negative scaling
scaledAabbMin[0] = m_localScaling.getX() >= 0. ? aabbMin[0] * invLocalScaling[0] : aabbMax[0] * invLocalScaling[0];
scaledAabbMin[1] = m_localScaling.getY() >= 0. ? aabbMin[1] * invLocalScaling[1] : aabbMax[1] * invLocalScaling[1];
scaledAabbMin[2] = m_localScaling.getZ() >= 0. ? aabbMin[2] * invLocalScaling[2] : aabbMax[2] * invLocalScaling[2];
scaledAabbMin[3] = 0.f;
-
+
scaledAabbMax[0] = m_localScaling.getX() <= 0. ? aabbMin[0] * invLocalScaling[0] : aabbMax[0] * invLocalScaling[0];
scaledAabbMax[1] = m_localScaling.getY() <= 0. ? aabbMin[1] * invLocalScaling[1] : aabbMax[1] * invLocalScaling[1];
scaledAabbMax[2] = m_localScaling.getZ() <= 0. ? aabbMin[2] * invLocalScaling[2] : aabbMax[2] * invLocalScaling[2];
scaledAabbMax[3] = 0.f;
-
-
- m_bvhTriMeshShape->processAllTriangles(&scaledCallback,scaledAabbMin,scaledAabbMax);
-}
+ m_bvhTriMeshShape->processAllTriangles(&scaledCallback, scaledAabbMin, scaledAabbMax);
+}
-void btScaledBvhTriangleMeshShape::getAabb(const btTransform& trans,btVector3& aabbMin,btVector3& aabbMax) const
+void btScaledBvhTriangleMeshShape::getAabb(const btTransform& trans, btVector3& aabbMin, btVector3& aabbMax) const
{
btVector3 localAabbMin = m_bvhTriMeshShape->getLocalAabbMin();
btVector3 localAabbMax = m_bvhTriMeshShape->getLocalAabbMax();
@@ -89,22 +84,21 @@ void btScaledBvhTriangleMeshShape::getAabb(const btTransform& trans,btVector3& a
localAabbMax[1] = (m_localScaling.getY() <= 0.) ? tmpLocalAabbMin[1] : tmpLocalAabbMax[1];
localAabbMax[2] = (m_localScaling.getZ() <= 0.) ? tmpLocalAabbMin[2] : tmpLocalAabbMax[2];
- btVector3 localHalfExtents = btScalar(0.5)*(localAabbMax-localAabbMin);
+ btVector3 localHalfExtents = btScalar(0.5) * (localAabbMax - localAabbMin);
btScalar margin = m_bvhTriMeshShape->getMargin();
- localHalfExtents += btVector3(margin,margin,margin);
- btVector3 localCenter = btScalar(0.5)*(localAabbMax+localAabbMin);
-
- btMatrix3x3 abs_b = trans.getBasis().absolute();
+ 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]);
+ btVector3 extent = localHalfExtents.dot3(abs_b[0], abs_b[1], abs_b[2]);
aabbMin = center - extent;
aabbMax = center + extent;
-
}
-void btScaledBvhTriangleMeshShape::setLocalScaling(const btVector3& scaling)
+void btScaledBvhTriangleMeshShape::setLocalScaling(const btVector3& scaling)
{
m_localScaling = scaling;
}
@@ -114,8 +108,8 @@ const btVector3& btScaledBvhTriangleMeshShape::getLocalScaling() const
return m_localScaling;
}
-void btScaledBvhTriangleMeshShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const
+void btScaledBvhTriangleMeshShape::calculateLocalInertia(btScalar mass, btVector3& inertia) const
{
///don't make this a movable object!
-// btAssert(0);
+ // btAssert(0);
}
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h
index 39049eaf08..4d6feb61af 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h
@@ -18,78 +18,69 @@ subject to the following restrictions:
#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
+ATTRIBUTE_ALIGNED16(class)
+btScaledBvhTriangleMeshShape : public btConcaveShape
{
-
-
- btVector3 m_localScaling;
+ btVector3 m_localScaling;
- btBvhTriangleMeshShape* m_bvhTriMeshShape;
+ btBvhTriangleMeshShape* m_bvhTriMeshShape;
public:
-
BT_DECLARE_ALIGNED_ALLOCATOR();
-
- btScaledBvhTriangleMeshShape(btBvhTriangleMeshShape* childShape,const btVector3& localScaling);
+ 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 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 calculateLocalInertia(btScalar mass, btVector3 & inertia) const;
- virtual void processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const;
+ virtual void processAllTriangles(btTriangleCallback * callback, const btVector3& aabbMin, const btVector3& aabbMax) const;
- btBvhTriangleMeshShape* getChildShape()
+ btBvhTriangleMeshShape* getChildShape()
{
return m_bvhTriMeshShape;
}
- const btBvhTriangleMeshShape* getChildShape() const
+ const btBvhTriangleMeshShape* getChildShape() const
{
return m_bvhTriMeshShape;
}
//debugging
- virtual const char* getName()const {return "SCALEDBVHTRIANGLEMESH";}
+ virtual const char* getName() const { return "SCALEDBVHTRIANGLEMESH"; }
- virtual int calculateSerializeBufferSize() 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;
-
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
};
///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
-struct btScaledTriangleMeshShapeData
+struct btScaledTriangleMeshShapeData
{
- btTriangleMeshShapeData m_trimeshShapeData;
+ btTriangleMeshShapeData m_trimeshShapeData;
- btVector3FloatData m_localScaling;
+ btVector3FloatData m_localScaling;
};
-
-SIMD_FORCE_INLINE int btScaledBvhTriangleMeshShape::calculateSerializeBufferSize() const
+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
+SIMD_FORCE_INLINE const char* btScaledBvhTriangleMeshShape::serialize(void* dataBuffer, btSerializer* serializer) const
{
- btScaledTriangleMeshShapeData* scaledMeshData = (btScaledTriangleMeshShapeData*) dataBuffer;
- m_bvhTriMeshShape->serialize(&scaledMeshData->m_trimeshShapeData,serializer);
+ 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
+#endif //BT_SCALED_BVH_TRIANGLE_MESH_SHAPE_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btSdfCollisionShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btSdfCollisionShape.cpp
index 828acda470..4a95dbea4f 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btSdfCollisionShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btSdfCollisionShape.cpp
@@ -9,10 +9,9 @@ struct btSdfCollisionShapeInternalData
btMiniSDF m_sdf;
btSdfCollisionShapeInternalData()
- :m_localScaling(1,1,1),
- m_margin(0)
+ : m_localScaling(1, 1, 1),
+ m_margin(0)
{
-
}
};
@@ -26,8 +25,6 @@ btSdfCollisionShape::btSdfCollisionShape()
m_shapeType = SDF_SHAPE_PROXYTYPE;
m_data = new btSdfCollisionShapeInternalData();
-
-
//"E:/develop/bullet3/data/toys/ground_hole64_64_8.cdf");//ground_cube.cdf");
/*unsigned int field_id=0;
Eigen::Vector3d x (1,10,1);
@@ -35,25 +32,22 @@ btSdfCollisionShape::btSdfCollisionShape()
double dist = m_data->m_sdf.interpolate(field_id, x, &gradient);
printf("dist=%g\n", dist);
*/
-
}
btSdfCollisionShape::~btSdfCollisionShape()
{
delete m_data;
}
-void btSdfCollisionShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
+void btSdfCollisionShape::getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
{
btAssert(m_data->m_sdf.isValid());
btVector3 localAabbMin = m_data->m_sdf.m_domain.m_min;
btVector3 localAabbMax = m_data->m_sdf.m_domain.m_max;
btScalar margin(0);
- btTransformAabb(localAabbMin,localAabbMax,margin,t,aabbMin,aabbMax);
-
+ btTransformAabb(localAabbMin, localAabbMax, margin, t, aabbMin, aabbMax);
}
-
-void btSdfCollisionShape::setLocalScaling(const btVector3& scaling)
+void btSdfCollisionShape::setLocalScaling(const btVector3& scaling)
{
m_data->m_localScaling = scaling;
}
@@ -61,39 +55,38 @@ const btVector3& btSdfCollisionShape::getLocalScaling() const
{
return m_data->m_localScaling;
}
-void btSdfCollisionShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const
+void btSdfCollisionShape::calculateLocalInertia(btScalar mass, btVector3& inertia) const
{
- inertia.setValue(0,0,0);
+ inertia.setValue(0, 0, 0);
}
-const char* btSdfCollisionShape::getName()const
+const char* btSdfCollisionShape::getName() const
{
return "btSdfCollisionShape";
}
-void btSdfCollisionShape::setMargin(btScalar margin)
+void btSdfCollisionShape::setMargin(btScalar margin)
{
m_data->m_margin = margin;
}
-btScalar btSdfCollisionShape::getMargin() const
+btScalar btSdfCollisionShape::getMargin() const
{
return m_data->m_margin;
}
-void btSdfCollisionShape::processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const
+void btSdfCollisionShape::processAllTriangles(btTriangleCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax) const
{
//not yet
}
-
bool btSdfCollisionShape::queryPoint(const btVector3& ptInSDF, btScalar& distOut, btVector3& normal)
{
int field = 0;
btVector3 grad;
double dist;
- bool hasResult = m_data->m_sdf.interpolate(field,dist, ptInSDF,&grad);
+ bool hasResult = m_data->m_sdf.interpolate(field, dist, ptInSDF, &grad);
if (hasResult)
{
- normal.setValue(grad[0],grad[1],grad[2]);
- distOut= dist;
+ normal.setValue(grad[0], grad[1], grad[2]);
+ distOut = dist;
}
return hasResult;
}
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btSdfCollisionShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btSdfCollisionShape.h
index 6e32db9cd8..3989d6245e 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btSdfCollisionShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btSdfCollisionShape.h
@@ -8,23 +8,22 @@ 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 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 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;
+ 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
+#endif //BT_SDF_COLLISION_SHAPE_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btShapeHull.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btShapeHull.cpp
index 9f712fe555..a2c490faf9 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btShapeHull.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btShapeHull.cpp
@@ -15,53 +15,48 @@ subject to the following restrictions:
//btShapeHull was implemented by John McCutchan.
-
#include "btShapeHull.h"
#include "LinearMath/btConvexHull.h"
#define NUM_UNITSPHERE_POINTS 42
#define NUM_UNITSPHERE_POINTS_HIGHRES 256
-
-btShapeHull::btShapeHull (const btConvexShape* shape)
+btShapeHull::btShapeHull(const btConvexShape* shape)
{
m_shape = shape;
- m_vertices.clear ();
+ m_vertices.clear();
m_indices.clear();
m_numIndices = 0;
}
-btShapeHull::~btShapeHull ()
+btShapeHull::~btShapeHull()
{
- m_indices.clear();
- m_vertices.clear ();
+ m_indices.clear();
+ m_vertices.clear();
}
-bool
-btShapeHull::buildHull (btScalar /*margin*/, int highres)
+bool btShapeHull::buildHull(btScalar /*margin*/, int highres)
{
- int numSampleDirections = highres? NUM_UNITSPHERE_POINTS_HIGHRES:NUM_UNITSPHERE_POINTS;
- {
- int numPDA = m_shape->getNumPreferredPenetrationDirections();
- if (numPDA)
- {
- for (int i=0;i<numPDA;i++)
- {
- btVector3 norm;
- m_shape->getPreferredPenetrationDirection(i,norm);
- getUnitSpherePoints(highres)[numSampleDirections] = norm;
- numSampleDirections++;
- }
- }
- }
-
- btVector3 supportPoints[NUM_UNITSPHERE_POINTS_HIGHRES+MAX_PREFERRED_PENETRATION_DIRECTIONS*2];
+
+ int numSampleDirections = highres ? NUM_UNITSPHERE_POINTS_HIGHRES : NUM_UNITSPHERE_POINTS;
+ btVector3 supportPoints[NUM_UNITSPHERE_POINTS_HIGHRES + MAX_PREFERRED_PENETRATION_DIRECTIONS * 2];
int i;
for (i = 0; i < numSampleDirections; i++)
{
supportPoints[i] = m_shape->localGetSupportingVertex(getUnitSpherePoints(highres)[i]);
}
+ int numPDA = m_shape->getNumPreferredPenetrationDirections();
+ if (numPDA)
+ {
+ for (int s = 0; s < numPDA; s++)
+ {
+ btVector3 norm;
+ m_shape->getPreferredPenetrationDirection(s, norm);
+ supportPoints[i++] = m_shape->localGetSupportingVertex(norm);
+ numSampleDirections++;
+ }
+ }
HullDesc hd;
hd.mFlags = QF_TRIANGLES;
hd.mVcount = static_cast<unsigned int>(numSampleDirections);
@@ -71,18 +66,17 @@ btShapeHull::buildHull (btScalar /*margin*/, int highres)
hd.mVertexStride = sizeof(btVector3);
#else
hd.mVertices = &supportPoints[0];
- hd.mVertexStride = sizeof (btVector3);
+ hd.mVertexStride = sizeof(btVector3);
#endif
HullLibrary hl;
HullResult hr;
- if (hl.CreateConvexHull (hd, hr) == QE_FAIL)
+ if (hl.CreateConvexHull(hd, hr) == QE_FAIL)
{
return false;
}
- m_vertices.resize (static_cast<int>(hr.mNumOutputVertices));
-
+ m_vertices.resize(static_cast<int>(hr.mNumOutputVertices));
for (i = 0; i < static_cast<int>(hr.mNumOutputVertices); i++)
{
@@ -96,338 +90,332 @@ btShapeHull::buildHull (btScalar /*margin*/, int highres)
}
// free temporary hull result that we just copied
- hl.ReleaseResult (hr);
+ hl.ReleaseResult(hr);
return true;
}
-int
-btShapeHull::numTriangles () const
+int btShapeHull::numTriangles() const
{
return static_cast<int>(m_numIndices / 3);
}
-int
-btShapeHull::numVertices () const
+int btShapeHull::numVertices() const
{
- return m_vertices.size ();
+ return m_vertices.size();
}
-int
-btShapeHull::numIndices () const
+int btShapeHull::numIndices() const
{
return static_cast<int>(m_numIndices);
}
-
btVector3* btShapeHull::getUnitSpherePoints(int highres)
{
static btVector3 sUnitSpherePointsHighres[NUM_UNITSPHERE_POINTS_HIGHRES + MAX_PREFERRED_PENETRATION_DIRECTIONS * 2] =
- {
- btVector3(btScalar(0.997604), btScalar(0.067004), btScalar(0.017144)),
- btVector3(btScalar(0.984139), btScalar(-0.086784), btScalar(-0.154427)),
- btVector3(btScalar(0.971065), btScalar(0.124164), btScalar(-0.203224)),
- btVector3(btScalar(0.955844), btScalar(0.291173), btScalar(-0.037704)),
- btVector3(btScalar(0.957405), btScalar(0.212238), btScalar(0.195157)),
- btVector3(btScalar(0.971650), btScalar(-0.012709), btScalar(0.235561)),
- btVector3(btScalar(0.984920), btScalar(-0.161831), btScalar(0.059695)),
- btVector3(btScalar(0.946673), btScalar(-0.299288), btScalar(-0.117536)),
- btVector3(btScalar(0.922670), btScalar(-0.219186), btScalar(-0.317019)),
- btVector3(btScalar(0.928134), btScalar(-0.007265), btScalar(-0.371867)),
- btVector3(btScalar(0.875642), btScalar(0.198434), btScalar(-0.439988)),
- btVector3(btScalar(0.908035), btScalar(0.325975), btScalar(-0.262562)),
- btVector3(btScalar(0.864519), btScalar(0.488706), btScalar(-0.116755)),
- btVector3(btScalar(0.893009), btScalar(0.428046), btScalar(0.137185)),
- btVector3(btScalar(0.857494), btScalar(0.362137), btScalar(0.364776)),
- btVector3(btScalar(0.900815), btScalar(0.132524), btScalar(0.412987)),
- btVector3(btScalar(0.934964), btScalar(-0.241739), btScalar(0.259179)),
- btVector3(btScalar(0.894570), btScalar(-0.103504), btScalar(0.434263)),
- btVector3(btScalar(0.922085), btScalar(-0.376668), btScalar(0.086241)),
- btVector3(btScalar(0.862177), btScalar(-0.499154), btScalar(-0.085330)),
- btVector3(btScalar(0.861982), btScalar(-0.420218), btScalar(-0.282861)),
- btVector3(btScalar(0.818076), btScalar(-0.328256), btScalar(-0.471804)),
- btVector3(btScalar(0.762657), btScalar(-0.179329), btScalar(-0.621124)),
- btVector3(btScalar(0.826857), btScalar(0.019760), btScalar(-0.561786)),
- btVector3(btScalar(0.731434), btScalar(0.206599), btScalar(-0.649817)),
- btVector3(btScalar(0.769486), btScalar(0.379052), btScalar(-0.513770)),
- btVector3(btScalar(0.796806), btScalar(0.507176), btScalar(-0.328145)),
- btVector3(btScalar(0.679722), btScalar(0.684101), btScalar(-0.264123)),
- btVector3(btScalar(0.786854), btScalar(0.614886), btScalar(0.050912)),
- btVector3(btScalar(0.769486), btScalar(0.571141), btScalar(0.285139)),
- btVector3(btScalar(0.707432), btScalar(0.492789), btScalar(0.506288)),
- btVector3(btScalar(0.774560), btScalar(0.268037), btScalar(0.572652)),
- btVector3(btScalar(0.796220), btScalar(0.031230), btScalar(0.604077)),
- btVector3(btScalar(0.837395), btScalar(-0.320285), btScalar(0.442461)),
- btVector3(btScalar(0.848127), btScalar(-0.450548), btScalar(0.278307)),
- btVector3(btScalar(0.775536), btScalar(-0.206354), btScalar(0.596465)),
- btVector3(btScalar(0.816320), btScalar(-0.567007), btScalar(0.109469)),
- btVector3(btScalar(0.741191), btScalar(-0.668690), btScalar(-0.056832)),
- btVector3(btScalar(0.755632), btScalar(-0.602975), btScalar(-0.254949)),
- btVector3(btScalar(0.720311), btScalar(-0.521318), btScalar(-0.457165)),
- btVector3(btScalar(0.670746), btScalar(-0.386583), btScalar(-0.632835)),
- btVector3(btScalar(0.587031), btScalar(-0.219769), btScalar(-0.778836)),
- btVector3(btScalar(0.676015), btScalar(-0.003182), btScalar(-0.736676)),
- btVector3(btScalar(0.566932), btScalar(0.186963), btScalar(-0.802064)),
- btVector3(btScalar(0.618254), btScalar(0.398105), btScalar(-0.677533)),
- btVector3(btScalar(0.653964), btScalar(0.575224), btScalar(-0.490933)),
- btVector3(btScalar(0.525367), btScalar(0.743205), btScalar(-0.414028)),
- btVector3(btScalar(0.506439), btScalar(0.836528), btScalar(-0.208885)),
- btVector3(btScalar(0.651427), btScalar(0.756426), btScalar(-0.056247)),
- btVector3(btScalar(0.641670), btScalar(0.745149), btScalar(0.180908)),
- btVector3(btScalar(0.602643), btScalar(0.687211), btScalar(0.405180)),
- btVector3(btScalar(0.516586), btScalar(0.596999), btScalar(0.613447)),
- btVector3(btScalar(0.602252), btScalar(0.387801), btScalar(0.697573)),
- btVector3(btScalar(0.646549), btScalar(0.153911), btScalar(0.746956)),
- btVector3(btScalar(0.650842), btScalar(-0.087756), btScalar(0.753983)),
- btVector3(btScalar(0.740411), btScalar(-0.497404), btScalar(0.451830)),
- btVector3(btScalar(0.726946), btScalar(-0.619890), btScalar(0.295093)),
- btVector3(btScalar(0.637768), btScalar(-0.313092), btScalar(0.703624)),
- btVector3(btScalar(0.678942), btScalar(-0.722934), btScalar(0.126645)),
- btVector3(btScalar(0.489072), btScalar(-0.867195), btScalar(-0.092942)),
- btVector3(btScalar(0.622742), btScalar(-0.757541), btScalar(-0.194636)),
- btVector3(btScalar(0.596788), btScalar(-0.693576), btScalar(-0.403098)),
- btVector3(btScalar(0.550150), btScalar(-0.582172), btScalar(-0.598287)),
- btVector3(btScalar(0.474436), btScalar(-0.429745), btScalar(-0.768101)),
- btVector3(btScalar(0.372574), btScalar(-0.246016), btScalar(-0.894583)),
- btVector3(btScalar(0.480095), btScalar(-0.026513), btScalar(-0.876626)),
- btVector3(btScalar(0.352474), btScalar(0.177242), btScalar(-0.918787)),
- btVector3(btScalar(0.441848), btScalar(0.374386), btScalar(-0.814946)),
- btVector3(btScalar(0.492389), btScalar(0.582223), btScalar(-0.646693)),
- btVector3(btScalar(0.343498), btScalar(0.866080), btScalar(-0.362693)),
- btVector3(btScalar(0.362036), btScalar(0.745149), btScalar(-0.559639)),
- btVector3(btScalar(0.334131), btScalar(0.937044), btScalar(-0.099774)),
- btVector3(btScalar(0.486925), btScalar(0.871718), btScalar(0.052473)),
- btVector3(btScalar(0.452776), btScalar(0.845665), btScalar(0.281820)),
- btVector3(btScalar(0.399503), btScalar(0.771785), btScalar(0.494576)),
- btVector3(btScalar(0.296469), btScalar(0.673018), btScalar(0.677469)),
- btVector3(btScalar(0.392088), btScalar(0.479179), btScalar(0.785213)),
- btVector3(btScalar(0.452190), btScalar(0.252094), btScalar(0.855286)),
- btVector3(btScalar(0.478339), btScalar(0.013149), btScalar(0.877928)),
- btVector3(btScalar(0.481656), btScalar(-0.219380), btScalar(0.848259)),
- btVector3(btScalar(0.615327), btScalar(-0.494293), btScalar(0.613837)),
- btVector3(btScalar(0.594642), btScalar(-0.650414), btScalar(0.472325)),
- btVector3(btScalar(0.562249), btScalar(-0.771345), btScalar(0.297631)),
- btVector3(btScalar(0.467411), btScalar(-0.437133), btScalar(0.768231)),
- btVector3(btScalar(0.519513), btScalar(-0.847947), btScalar(0.103808)),
- btVector3(btScalar(0.297640), btScalar(-0.938159), btScalar(-0.176288)),
- btVector3(btScalar(0.446727), btScalar(-0.838615), btScalar(-0.311359)),
- btVector3(btScalar(0.331790), btScalar(-0.942437), btScalar(0.040762)),
- btVector3(btScalar(0.413358), btScalar(-0.748403), btScalar(-0.518259)),
- btVector3(btScalar(0.347596), btScalar(-0.621640), btScalar(-0.701737)),
- btVector3(btScalar(0.249831), btScalar(-0.456186), btScalar(-0.853984)),
- btVector3(btScalar(0.131772), btScalar(-0.262931), btScalar(-0.955678)),
- btVector3(btScalar(0.247099), btScalar(-0.042261), btScalar(-0.967975)),
- btVector3(btScalar(0.113624), btScalar(0.165965), btScalar(-0.979491)),
- btVector3(btScalar(0.217438), btScalar(0.374580), btScalar(-0.901220)),
- btVector3(btScalar(0.307983), btScalar(0.554615), btScalar(-0.772786)),
- btVector3(btScalar(0.166702), btScalar(0.953181), btScalar(-0.252021)),
- btVector3(btScalar(0.172751), btScalar(0.844499), btScalar(-0.506743)),
- btVector3(btScalar(0.177630), btScalar(0.711125), btScalar(-0.679876)),
- btVector3(btScalar(0.120064), btScalar(0.992260), btScalar(-0.030482)),
- btVector3(btScalar(0.289640), btScalar(0.949098), btScalar(0.122546)),
- btVector3(btScalar(0.239879), btScalar(0.909047), btScalar(0.340377)),
- btVector3(btScalar(0.181142), btScalar(0.821363), btScalar(0.540641)),
- btVector3(btScalar(0.066986), btScalar(0.719097), btScalar(0.691327)),
- btVector3(btScalar(0.156750), btScalar(0.545478), btScalar(0.823079)),
- btVector3(btScalar(0.236172), btScalar(0.342306), btScalar(0.909353)),
- btVector3(btScalar(0.277541), btScalar(0.112693), btScalar(0.953856)),
- btVector3(btScalar(0.295299), btScalar(-0.121974), btScalar(0.947415)),
- btVector3(btScalar(0.287883), btScalar(-0.349254), btScalar(0.891591)),
- btVector3(btScalar(0.437165), btScalar(-0.634666), btScalar(0.636869)),
- btVector3(btScalar(0.407113), btScalar(-0.784954), btScalar(0.466664)),
- btVector3(btScalar(0.375111), btScalar(-0.888193), btScalar(0.264839)),
- btVector3(btScalar(0.275394), btScalar(-0.560591), btScalar(0.780723)),
- btVector3(btScalar(0.122015), btScalar(-0.992209), btScalar(-0.024821)),
- btVector3(btScalar(0.087866), btScalar(-0.966156), btScalar(-0.241676)),
- btVector3(btScalar(0.239489), btScalar(-0.885665), btScalar(-0.397437)),
- btVector3(btScalar(0.167287), btScalar(-0.965184), btScalar(0.200817)),
- btVector3(btScalar(0.201632), btScalar(-0.776789), btScalar(-0.596335)),
- btVector3(btScalar(0.122015), btScalar(-0.637971), btScalar(-0.760098)),
- btVector3(btScalar(0.008054), btScalar(-0.464741), btScalar(-0.885214)),
- btVector3(btScalar(-0.116054), btScalar(-0.271096), btScalar(-0.955482)),
- btVector3(btScalar(-0.000727), btScalar(-0.056065), btScalar(-0.998424)),
- btVector3(btScalar(-0.134007), btScalar(0.152939), btScalar(-0.978905)),
- btVector3(btScalar(-0.025900), btScalar(0.366026), btScalar(-0.930108)),
- btVector3(btScalar(0.081231), btScalar(0.557337), btScalar(-0.826072)),
- btVector3(btScalar(-0.002874), btScalar(0.917213), btScalar(-0.398023)),
- btVector3(btScalar(-0.050683), btScalar(0.981761), btScalar(-0.182534)),
- btVector3(btScalar(-0.040536), btScalar(0.710153), btScalar(-0.702713)),
- btVector3(btScalar(-0.139081), btScalar(0.827973), btScalar(-0.543048)),
- btVector3(btScalar(-0.101029), btScalar(0.994010), btScalar(0.041152)),
- btVector3(btScalar(0.069328), btScalar(0.978067), btScalar(0.196133)),
- btVector3(btScalar(0.023860), btScalar(0.911380), btScalar(0.410645)),
- btVector3(btScalar(-0.153521), btScalar(0.736789), btScalar(0.658145)),
- btVector3(btScalar(-0.070002), btScalar(0.591750), btScalar(0.802780)),
- btVector3(btScalar(0.002590), btScalar(0.312948), btScalar(0.949562)),
- btVector3(btScalar(0.090988), btScalar(-0.020680), btScalar(0.995627)),
- btVector3(btScalar(0.088842), btScalar(-0.250099), btScalar(0.964006)),
- btVector3(btScalar(0.083378), btScalar(-0.470185), btScalar(0.878318)),
- btVector3(btScalar(0.240074), btScalar(-0.749764), btScalar(0.616374)),
- btVector3(btScalar(0.210803), btScalar(-0.885860), btScalar(0.412987)),
- btVector3(btScalar(0.077524), btScalar(-0.660524), btScalar(0.746565)),
- btVector3(btScalar(-0.096736), btScalar(-0.990070), btScalar(-0.100945)),
- btVector3(btScalar(-0.052634), btScalar(-0.990264), btScalar(0.127426)),
- btVector3(btScalar(-0.106102), btScalar(-0.938354), btScalar(-0.328340)),
- btVector3(btScalar(0.013323), btScalar(-0.863112), btScalar(-0.504596)),
- btVector3(btScalar(-0.002093), btScalar(-0.936993), btScalar(0.349161)),
- btVector3(btScalar(-0.106297), btScalar(-0.636610), btScalar(-0.763612)),
- btVector3(btScalar(-0.229430), btScalar(-0.463769), btScalar(-0.855546)),
- btVector3(btScalar(-0.245236), btScalar(-0.066175), btScalar(-0.966999)),
- btVector3(btScalar(-0.351587), btScalar(-0.270513), btScalar(-0.896145)),
- btVector3(btScalar(-0.370906), btScalar(0.133108), btScalar(-0.918982)),
- btVector3(btScalar(-0.264360), btScalar(0.346000), btScalar(-0.900049)),
- btVector3(btScalar(-0.151375), btScalar(0.543728), btScalar(-0.825291)),
- btVector3(btScalar(-0.218697), btScalar(0.912741), btScalar(-0.344346)),
- btVector3(btScalar(-0.274507), btScalar(0.953764), btScalar(-0.121635)),
- btVector3(btScalar(-0.259677), btScalar(0.692266), btScalar(-0.673044)),
- btVector3(btScalar(-0.350416), btScalar(0.798810), btScalar(-0.488786)),
- btVector3(btScalar(-0.320170), btScalar(0.941127), btScalar(0.108297)),
- btVector3(btScalar(-0.147667), btScalar(0.952792), btScalar(0.265034)),
- btVector3(btScalar(-0.188061), btScalar(0.860636), btScalar(0.472910)),
- btVector3(btScalar(-0.370906), btScalar(0.739900), btScalar(0.560941)),
- btVector3(btScalar(-0.297143), btScalar(0.585334), btScalar(0.754178)),
- btVector3(btScalar(-0.189622), btScalar(0.428241), btScalar(0.883393)),
- btVector3(btScalar(-0.091272), btScalar(0.098695), btScalar(0.990747)),
- btVector3(btScalar(-0.256945), btScalar(0.228375), btScalar(0.938827)),
- btVector3(btScalar(-0.111761), btScalar(-0.133251), btScalar(0.984696)),
- btVector3(btScalar(-0.118006), btScalar(-0.356253), btScalar(0.926725)),
- btVector3(btScalar(-0.119372), btScalar(-0.563896), btScalar(0.817029)),
- btVector3(btScalar(0.041228), btScalar(-0.833949), btScalar(0.550010)),
- btVector3(btScalar(-0.121909), btScalar(-0.736543), btScalar(0.665172)),
- btVector3(btScalar(-0.307681), btScalar(-0.931160), btScalar(-0.195026)),
- btVector3(btScalar(-0.283679), btScalar(-0.957990), btScalar(0.041348)),
- btVector3(btScalar(-0.227284), btScalar(-0.935243), btScalar(0.270890)),
- btVector3(btScalar(-0.293436), btScalar(-0.858252), btScalar(-0.420860)),
- btVector3(btScalar(-0.175767), btScalar(-0.780677), btScalar(-0.599262)),
- btVector3(btScalar(-0.170108), btScalar(-0.858835), btScalar(0.482865)),
- btVector3(btScalar(-0.332854), btScalar(-0.635055), btScalar(-0.696857)),
- btVector3(btScalar(-0.447791), btScalar(-0.445299), btScalar(-0.775128)),
- btVector3(btScalar(-0.470622), btScalar(-0.074146), btScalar(-0.879164)),
- btVector3(btScalar(-0.639417), btScalar(-0.340505), btScalar(-0.689049)),
- btVector3(btScalar(-0.598438), btScalar(0.104722), btScalar(-0.794256)),
- btVector3(btScalar(-0.488575), btScalar(0.307699), btScalar(-0.816313)),
- btVector3(btScalar(-0.379882), btScalar(0.513592), btScalar(-0.769077)),
- btVector3(btScalar(-0.425740), btScalar(0.862775), btScalar(-0.272516)),
- btVector3(btScalar(-0.480769), btScalar(0.875412), btScalar(-0.048439)),
- btVector3(btScalar(-0.467890), btScalar(0.648716), btScalar(-0.600043)),
- btVector3(btScalar(-0.543799), btScalar(0.730956), btScalar(-0.411881)),
- btVector3(btScalar(-0.516284), btScalar(0.838277), btScalar(0.174076)),
- btVector3(btScalar(-0.353343), btScalar(0.876384), btScalar(0.326519)),
- btVector3(btScalar(-0.572875), btScalar(0.614497), btScalar(0.542007)),
- btVector3(btScalar(-0.503600), btScalar(0.497261), btScalar(0.706161)),
- btVector3(btScalar(-0.530920), btScalar(0.754870), btScalar(0.384685)),
- btVector3(btScalar(-0.395884), btScalar(0.366414), btScalar(0.841818)),
- btVector3(btScalar(-0.300656), btScalar(0.001678), btScalar(0.953661)),
- btVector3(btScalar(-0.461060), btScalar(0.146912), btScalar(0.875000)),
- btVector3(btScalar(-0.315486), btScalar(-0.232212), btScalar(0.919893)),
- btVector3(btScalar(-0.323682), btScalar(-0.449187), btScalar(0.832644)),
- btVector3(btScalar(-0.318999), btScalar(-0.639527), btScalar(0.699134)),
- btVector3(btScalar(-0.496771), btScalar(-0.866029), btScalar(-0.055271)),
- btVector3(btScalar(-0.496771), btScalar(-0.816257), btScalar(-0.294377)),
- btVector3(btScalar(-0.456377), btScalar(-0.869528), btScalar(0.188130)),
- btVector3(btScalar(-0.380858), btScalar(-0.827144), btScalar(0.412792)),
- btVector3(btScalar(-0.449352), btScalar(-0.727405), btScalar(-0.518259)),
- btVector3(btScalar(-0.570533), btScalar(-0.551064), btScalar(-0.608632)),
- btVector3(btScalar(-0.656394), btScalar(-0.118280), btScalar(-0.744874)),
- btVector3(btScalar(-0.756696), btScalar(-0.438105), btScalar(-0.484882)),
- btVector3(btScalar(-0.801773), btScalar(-0.204798), btScalar(-0.561005)),
- btVector3(btScalar(-0.785186), btScalar(0.038618), btScalar(-0.617805)),
- btVector3(btScalar(-0.709082), btScalar(0.262399), btScalar(-0.654306)),
- btVector3(btScalar(-0.583412), btScalar(0.462265), btScalar(-0.667383)),
- btVector3(btScalar(-0.616001), btScalar(0.761286), btScalar(-0.201272)),
- btVector3(btScalar(-0.660687), btScalar(0.750204), btScalar(0.020072)),
- btVector3(btScalar(-0.744987), btScalar(0.435823), btScalar(-0.504791)),
- btVector3(btScalar(-0.713765), btScalar(0.605554), btScalar(-0.351373)),
- btVector3(btScalar(-0.686251), btScalar(0.687600), btScalar(0.236927)),
- btVector3(btScalar(-0.680201), btScalar(0.429407), btScalar(0.593732)),
- btVector3(btScalar(-0.733474), btScalar(0.546450), btScalar(0.403814)),
- btVector3(btScalar(-0.591023), btScalar(0.292923), btScalar(0.751445)),
- btVector3(btScalar(-0.500283), btScalar(-0.080757), btScalar(0.861922)),
- btVector3(btScalar(-0.643710), btScalar(0.070115), btScalar(0.761985)),
- btVector3(btScalar(-0.506332), btScalar(-0.308425), btScalar(0.805122)),
- btVector3(btScalar(-0.503015), btScalar(-0.509847), btScalar(0.697573)),
- btVector3(btScalar(-0.482525), btScalar(-0.682105), btScalar(0.549229)),
- btVector3(btScalar(-0.680396), btScalar(-0.716323), btScalar(-0.153451)),
- btVector3(btScalar(-0.658346), btScalar(-0.746264), btScalar(0.097562)),
- btVector3(btScalar(-0.653272), btScalar(-0.646915), btScalar(-0.392948)),
- btVector3(btScalar(-0.590828), btScalar(-0.732655), btScalar(0.337645)),
- btVector3(btScalar(-0.819140), btScalar(-0.518013), btScalar(-0.246166)),
- btVector3(btScalar(-0.900513), btScalar(-0.282178), btScalar(-0.330487)),
- btVector3(btScalar(-0.914953), btScalar(-0.028652), btScalar(-0.402122)),
- btVector3(btScalar(-0.859924), btScalar(0.220209), btScalar(-0.459898)),
- btVector3(btScalar(-0.777185), btScalar(0.613720), btScalar(-0.137836)),
- btVector3(btScalar(-0.805285), btScalar(0.586889), btScalar(0.082728)),
- btVector3(btScalar(-0.872413), btScalar(0.406077), btScalar(-0.271735)),
- btVector3(btScalar(-0.859339), btScalar(0.448072), btScalar(0.246101)),
- btVector3(btScalar(-0.757671), btScalar(0.216320), btScalar(0.615594)),
- btVector3(btScalar(-0.826165), btScalar(0.348139), btScalar(0.442851)),
- btVector3(btScalar(-0.671810), btScalar(-0.162803), btScalar(0.722557)),
- btVector3(btScalar(-0.796504), btScalar(-0.004543), btScalar(0.604468)),
- btVector3(btScalar(-0.676298), btScalar(-0.378223), btScalar(0.631794)),
- btVector3(btScalar(-0.668883), btScalar(-0.558258), btScalar(0.490673)),
- btVector3(btScalar(-0.821287), btScalar(-0.570118), btScalar(0.006994)),
- btVector3(btScalar(-0.767428), btScalar(-0.587810), btScalar(0.255470)),
- btVector3(btScalar(-0.933296), btScalar(-0.349837), btScalar(-0.079865)),
- btVector3(btScalar(-0.982667), btScalar(-0.100393), btScalar(-0.155208)),
- btVector3(btScalar(-0.961396), btScalar(0.160910), btScalar(-0.222938)),
- btVector3(btScalar(-0.934858), btScalar(0.354555), btScalar(-0.006864)),
- btVector3(btScalar(-0.941687), btScalar(0.229736), btScalar(0.245711)),
- btVector3(btScalar(-0.884317), btScalar(0.131552), btScalar(0.447536)),
- btVector3(btScalar(-0.810359), btScalar(-0.219769), btScalar(0.542788)),
- btVector3(btScalar(-0.915929), btScalar(-0.210048), btScalar(0.341743)),
- btVector3(btScalar(-0.816799), btScalar(-0.407192), btScalar(0.408303)),
- btVector3(btScalar(-0.903050), btScalar(-0.392416), btScalar(0.174076)),
- btVector3(btScalar(-0.980325), btScalar(-0.170969), btScalar(0.096586)),
- btVector3(btScalar(-0.995936), btScalar(0.084891), btScalar(0.029441)),
- btVector3(btScalar(-0.960031), btScalar(0.002650), btScalar(0.279283)),
- };
+ {
+ btVector3(btScalar(0.997604), btScalar(0.067004), btScalar(0.017144)),
+ btVector3(btScalar(0.984139), btScalar(-0.086784), btScalar(-0.154427)),
+ btVector3(btScalar(0.971065), btScalar(0.124164), btScalar(-0.203224)),
+ btVector3(btScalar(0.955844), btScalar(0.291173), btScalar(-0.037704)),
+ btVector3(btScalar(0.957405), btScalar(0.212238), btScalar(0.195157)),
+ btVector3(btScalar(0.971650), btScalar(-0.012709), btScalar(0.235561)),
+ btVector3(btScalar(0.984920), btScalar(-0.161831), btScalar(0.059695)),
+ btVector3(btScalar(0.946673), btScalar(-0.299288), btScalar(-0.117536)),
+ btVector3(btScalar(0.922670), btScalar(-0.219186), btScalar(-0.317019)),
+ btVector3(btScalar(0.928134), btScalar(-0.007265), btScalar(-0.371867)),
+ btVector3(btScalar(0.875642), btScalar(0.198434), btScalar(-0.439988)),
+ btVector3(btScalar(0.908035), btScalar(0.325975), btScalar(-0.262562)),
+ btVector3(btScalar(0.864519), btScalar(0.488706), btScalar(-0.116755)),
+ btVector3(btScalar(0.893009), btScalar(0.428046), btScalar(0.137185)),
+ btVector3(btScalar(0.857494), btScalar(0.362137), btScalar(0.364776)),
+ btVector3(btScalar(0.900815), btScalar(0.132524), btScalar(0.412987)),
+ btVector3(btScalar(0.934964), btScalar(-0.241739), btScalar(0.259179)),
+ btVector3(btScalar(0.894570), btScalar(-0.103504), btScalar(0.434263)),
+ btVector3(btScalar(0.922085), btScalar(-0.376668), btScalar(0.086241)),
+ btVector3(btScalar(0.862177), btScalar(-0.499154), btScalar(-0.085330)),
+ btVector3(btScalar(0.861982), btScalar(-0.420218), btScalar(-0.282861)),
+ btVector3(btScalar(0.818076), btScalar(-0.328256), btScalar(-0.471804)),
+ btVector3(btScalar(0.762657), btScalar(-0.179329), btScalar(-0.621124)),
+ btVector3(btScalar(0.826857), btScalar(0.019760), btScalar(-0.561786)),
+ btVector3(btScalar(0.731434), btScalar(0.206599), btScalar(-0.649817)),
+ btVector3(btScalar(0.769486), btScalar(0.379052), btScalar(-0.513770)),
+ btVector3(btScalar(0.796806), btScalar(0.507176), btScalar(-0.328145)),
+ btVector3(btScalar(0.679722), btScalar(0.684101), btScalar(-0.264123)),
+ btVector3(btScalar(0.786854), btScalar(0.614886), btScalar(0.050912)),
+ btVector3(btScalar(0.769486), btScalar(0.571141), btScalar(0.285139)),
+ btVector3(btScalar(0.707432), btScalar(0.492789), btScalar(0.506288)),
+ btVector3(btScalar(0.774560), btScalar(0.268037), btScalar(0.572652)),
+ btVector3(btScalar(0.796220), btScalar(0.031230), btScalar(0.604077)),
+ btVector3(btScalar(0.837395), btScalar(-0.320285), btScalar(0.442461)),
+ btVector3(btScalar(0.848127), btScalar(-0.450548), btScalar(0.278307)),
+ btVector3(btScalar(0.775536), btScalar(-0.206354), btScalar(0.596465)),
+ btVector3(btScalar(0.816320), btScalar(-0.567007), btScalar(0.109469)),
+ btVector3(btScalar(0.741191), btScalar(-0.668690), btScalar(-0.056832)),
+ btVector3(btScalar(0.755632), btScalar(-0.602975), btScalar(-0.254949)),
+ btVector3(btScalar(0.720311), btScalar(-0.521318), btScalar(-0.457165)),
+ btVector3(btScalar(0.670746), btScalar(-0.386583), btScalar(-0.632835)),
+ btVector3(btScalar(0.587031), btScalar(-0.219769), btScalar(-0.778836)),
+ btVector3(btScalar(0.676015), btScalar(-0.003182), btScalar(-0.736676)),
+ btVector3(btScalar(0.566932), btScalar(0.186963), btScalar(-0.802064)),
+ btVector3(btScalar(0.618254), btScalar(0.398105), btScalar(-0.677533)),
+ btVector3(btScalar(0.653964), btScalar(0.575224), btScalar(-0.490933)),
+ btVector3(btScalar(0.525367), btScalar(0.743205), btScalar(-0.414028)),
+ btVector3(btScalar(0.506439), btScalar(0.836528), btScalar(-0.208885)),
+ btVector3(btScalar(0.651427), btScalar(0.756426), btScalar(-0.056247)),
+ btVector3(btScalar(0.641670), btScalar(0.745149), btScalar(0.180908)),
+ btVector3(btScalar(0.602643), btScalar(0.687211), btScalar(0.405180)),
+ btVector3(btScalar(0.516586), btScalar(0.596999), btScalar(0.613447)),
+ btVector3(btScalar(0.602252), btScalar(0.387801), btScalar(0.697573)),
+ btVector3(btScalar(0.646549), btScalar(0.153911), btScalar(0.746956)),
+ btVector3(btScalar(0.650842), btScalar(-0.087756), btScalar(0.753983)),
+ btVector3(btScalar(0.740411), btScalar(-0.497404), btScalar(0.451830)),
+ btVector3(btScalar(0.726946), btScalar(-0.619890), btScalar(0.295093)),
+ btVector3(btScalar(0.637768), btScalar(-0.313092), btScalar(0.703624)),
+ btVector3(btScalar(0.678942), btScalar(-0.722934), btScalar(0.126645)),
+ btVector3(btScalar(0.489072), btScalar(-0.867195), btScalar(-0.092942)),
+ btVector3(btScalar(0.622742), btScalar(-0.757541), btScalar(-0.194636)),
+ btVector3(btScalar(0.596788), btScalar(-0.693576), btScalar(-0.403098)),
+ btVector3(btScalar(0.550150), btScalar(-0.582172), btScalar(-0.598287)),
+ btVector3(btScalar(0.474436), btScalar(-0.429745), btScalar(-0.768101)),
+ btVector3(btScalar(0.372574), btScalar(-0.246016), btScalar(-0.894583)),
+ btVector3(btScalar(0.480095), btScalar(-0.026513), btScalar(-0.876626)),
+ btVector3(btScalar(0.352474), btScalar(0.177242), btScalar(-0.918787)),
+ btVector3(btScalar(0.441848), btScalar(0.374386), btScalar(-0.814946)),
+ btVector3(btScalar(0.492389), btScalar(0.582223), btScalar(-0.646693)),
+ btVector3(btScalar(0.343498), btScalar(0.866080), btScalar(-0.362693)),
+ btVector3(btScalar(0.362036), btScalar(0.745149), btScalar(-0.559639)),
+ btVector3(btScalar(0.334131), btScalar(0.937044), btScalar(-0.099774)),
+ btVector3(btScalar(0.486925), btScalar(0.871718), btScalar(0.052473)),
+ btVector3(btScalar(0.452776), btScalar(0.845665), btScalar(0.281820)),
+ btVector3(btScalar(0.399503), btScalar(0.771785), btScalar(0.494576)),
+ btVector3(btScalar(0.296469), btScalar(0.673018), btScalar(0.677469)),
+ btVector3(btScalar(0.392088), btScalar(0.479179), btScalar(0.785213)),
+ btVector3(btScalar(0.452190), btScalar(0.252094), btScalar(0.855286)),
+ btVector3(btScalar(0.478339), btScalar(0.013149), btScalar(0.877928)),
+ btVector3(btScalar(0.481656), btScalar(-0.219380), btScalar(0.848259)),
+ btVector3(btScalar(0.615327), btScalar(-0.494293), btScalar(0.613837)),
+ btVector3(btScalar(0.594642), btScalar(-0.650414), btScalar(0.472325)),
+ btVector3(btScalar(0.562249), btScalar(-0.771345), btScalar(0.297631)),
+ btVector3(btScalar(0.467411), btScalar(-0.437133), btScalar(0.768231)),
+ btVector3(btScalar(0.519513), btScalar(-0.847947), btScalar(0.103808)),
+ btVector3(btScalar(0.297640), btScalar(-0.938159), btScalar(-0.176288)),
+ btVector3(btScalar(0.446727), btScalar(-0.838615), btScalar(-0.311359)),
+ btVector3(btScalar(0.331790), btScalar(-0.942437), btScalar(0.040762)),
+ btVector3(btScalar(0.413358), btScalar(-0.748403), btScalar(-0.518259)),
+ btVector3(btScalar(0.347596), btScalar(-0.621640), btScalar(-0.701737)),
+ btVector3(btScalar(0.249831), btScalar(-0.456186), btScalar(-0.853984)),
+ btVector3(btScalar(0.131772), btScalar(-0.262931), btScalar(-0.955678)),
+ btVector3(btScalar(0.247099), btScalar(-0.042261), btScalar(-0.967975)),
+ btVector3(btScalar(0.113624), btScalar(0.165965), btScalar(-0.979491)),
+ btVector3(btScalar(0.217438), btScalar(0.374580), btScalar(-0.901220)),
+ btVector3(btScalar(0.307983), btScalar(0.554615), btScalar(-0.772786)),
+ btVector3(btScalar(0.166702), btScalar(0.953181), btScalar(-0.252021)),
+ btVector3(btScalar(0.172751), btScalar(0.844499), btScalar(-0.506743)),
+ btVector3(btScalar(0.177630), btScalar(0.711125), btScalar(-0.679876)),
+ btVector3(btScalar(0.120064), btScalar(0.992260), btScalar(-0.030482)),
+ btVector3(btScalar(0.289640), btScalar(0.949098), btScalar(0.122546)),
+ btVector3(btScalar(0.239879), btScalar(0.909047), btScalar(0.340377)),
+ btVector3(btScalar(0.181142), btScalar(0.821363), btScalar(0.540641)),
+ btVector3(btScalar(0.066986), btScalar(0.719097), btScalar(0.691327)),
+ btVector3(btScalar(0.156750), btScalar(0.545478), btScalar(0.823079)),
+ btVector3(btScalar(0.236172), btScalar(0.342306), btScalar(0.909353)),
+ btVector3(btScalar(0.277541), btScalar(0.112693), btScalar(0.953856)),
+ btVector3(btScalar(0.295299), btScalar(-0.121974), btScalar(0.947415)),
+ btVector3(btScalar(0.287883), btScalar(-0.349254), btScalar(0.891591)),
+ btVector3(btScalar(0.437165), btScalar(-0.634666), btScalar(0.636869)),
+ btVector3(btScalar(0.407113), btScalar(-0.784954), btScalar(0.466664)),
+ btVector3(btScalar(0.375111), btScalar(-0.888193), btScalar(0.264839)),
+ btVector3(btScalar(0.275394), btScalar(-0.560591), btScalar(0.780723)),
+ btVector3(btScalar(0.122015), btScalar(-0.992209), btScalar(-0.024821)),
+ btVector3(btScalar(0.087866), btScalar(-0.966156), btScalar(-0.241676)),
+ btVector3(btScalar(0.239489), btScalar(-0.885665), btScalar(-0.397437)),
+ btVector3(btScalar(0.167287), btScalar(-0.965184), btScalar(0.200817)),
+ btVector3(btScalar(0.201632), btScalar(-0.776789), btScalar(-0.596335)),
+ btVector3(btScalar(0.122015), btScalar(-0.637971), btScalar(-0.760098)),
+ btVector3(btScalar(0.008054), btScalar(-0.464741), btScalar(-0.885214)),
+ btVector3(btScalar(-0.116054), btScalar(-0.271096), btScalar(-0.955482)),
+ btVector3(btScalar(-0.000727), btScalar(-0.056065), btScalar(-0.998424)),
+ btVector3(btScalar(-0.134007), btScalar(0.152939), btScalar(-0.978905)),
+ btVector3(btScalar(-0.025900), btScalar(0.366026), btScalar(-0.930108)),
+ btVector3(btScalar(0.081231), btScalar(0.557337), btScalar(-0.826072)),
+ btVector3(btScalar(-0.002874), btScalar(0.917213), btScalar(-0.398023)),
+ btVector3(btScalar(-0.050683), btScalar(0.981761), btScalar(-0.182534)),
+ btVector3(btScalar(-0.040536), btScalar(0.710153), btScalar(-0.702713)),
+ btVector3(btScalar(-0.139081), btScalar(0.827973), btScalar(-0.543048)),
+ btVector3(btScalar(-0.101029), btScalar(0.994010), btScalar(0.041152)),
+ btVector3(btScalar(0.069328), btScalar(0.978067), btScalar(0.196133)),
+ btVector3(btScalar(0.023860), btScalar(0.911380), btScalar(0.410645)),
+ btVector3(btScalar(-0.153521), btScalar(0.736789), btScalar(0.658145)),
+ btVector3(btScalar(-0.070002), btScalar(0.591750), btScalar(0.802780)),
+ btVector3(btScalar(0.002590), btScalar(0.312948), btScalar(0.949562)),
+ btVector3(btScalar(0.090988), btScalar(-0.020680), btScalar(0.995627)),
+ btVector3(btScalar(0.088842), btScalar(-0.250099), btScalar(0.964006)),
+ btVector3(btScalar(0.083378), btScalar(-0.470185), btScalar(0.878318)),
+ btVector3(btScalar(0.240074), btScalar(-0.749764), btScalar(0.616374)),
+ btVector3(btScalar(0.210803), btScalar(-0.885860), btScalar(0.412987)),
+ btVector3(btScalar(0.077524), btScalar(-0.660524), btScalar(0.746565)),
+ btVector3(btScalar(-0.096736), btScalar(-0.990070), btScalar(-0.100945)),
+ btVector3(btScalar(-0.052634), btScalar(-0.990264), btScalar(0.127426)),
+ btVector3(btScalar(-0.106102), btScalar(-0.938354), btScalar(-0.328340)),
+ btVector3(btScalar(0.013323), btScalar(-0.863112), btScalar(-0.504596)),
+ btVector3(btScalar(-0.002093), btScalar(-0.936993), btScalar(0.349161)),
+ btVector3(btScalar(-0.106297), btScalar(-0.636610), btScalar(-0.763612)),
+ btVector3(btScalar(-0.229430), btScalar(-0.463769), btScalar(-0.855546)),
+ btVector3(btScalar(-0.245236), btScalar(-0.066175), btScalar(-0.966999)),
+ btVector3(btScalar(-0.351587), btScalar(-0.270513), btScalar(-0.896145)),
+ btVector3(btScalar(-0.370906), btScalar(0.133108), btScalar(-0.918982)),
+ btVector3(btScalar(-0.264360), btScalar(0.346000), btScalar(-0.900049)),
+ btVector3(btScalar(-0.151375), btScalar(0.543728), btScalar(-0.825291)),
+ btVector3(btScalar(-0.218697), btScalar(0.912741), btScalar(-0.344346)),
+ btVector3(btScalar(-0.274507), btScalar(0.953764), btScalar(-0.121635)),
+ btVector3(btScalar(-0.259677), btScalar(0.692266), btScalar(-0.673044)),
+ btVector3(btScalar(-0.350416), btScalar(0.798810), btScalar(-0.488786)),
+ btVector3(btScalar(-0.320170), btScalar(0.941127), btScalar(0.108297)),
+ btVector3(btScalar(-0.147667), btScalar(0.952792), btScalar(0.265034)),
+ btVector3(btScalar(-0.188061), btScalar(0.860636), btScalar(0.472910)),
+ btVector3(btScalar(-0.370906), btScalar(0.739900), btScalar(0.560941)),
+ btVector3(btScalar(-0.297143), btScalar(0.585334), btScalar(0.754178)),
+ btVector3(btScalar(-0.189622), btScalar(0.428241), btScalar(0.883393)),
+ btVector3(btScalar(-0.091272), btScalar(0.098695), btScalar(0.990747)),
+ btVector3(btScalar(-0.256945), btScalar(0.228375), btScalar(0.938827)),
+ btVector3(btScalar(-0.111761), btScalar(-0.133251), btScalar(0.984696)),
+ btVector3(btScalar(-0.118006), btScalar(-0.356253), btScalar(0.926725)),
+ btVector3(btScalar(-0.119372), btScalar(-0.563896), btScalar(0.817029)),
+ btVector3(btScalar(0.041228), btScalar(-0.833949), btScalar(0.550010)),
+ btVector3(btScalar(-0.121909), btScalar(-0.736543), btScalar(0.665172)),
+ btVector3(btScalar(-0.307681), btScalar(-0.931160), btScalar(-0.195026)),
+ btVector3(btScalar(-0.283679), btScalar(-0.957990), btScalar(0.041348)),
+ btVector3(btScalar(-0.227284), btScalar(-0.935243), btScalar(0.270890)),
+ btVector3(btScalar(-0.293436), btScalar(-0.858252), btScalar(-0.420860)),
+ btVector3(btScalar(-0.175767), btScalar(-0.780677), btScalar(-0.599262)),
+ btVector3(btScalar(-0.170108), btScalar(-0.858835), btScalar(0.482865)),
+ btVector3(btScalar(-0.332854), btScalar(-0.635055), btScalar(-0.696857)),
+ btVector3(btScalar(-0.447791), btScalar(-0.445299), btScalar(-0.775128)),
+ btVector3(btScalar(-0.470622), btScalar(-0.074146), btScalar(-0.879164)),
+ btVector3(btScalar(-0.639417), btScalar(-0.340505), btScalar(-0.689049)),
+ btVector3(btScalar(-0.598438), btScalar(0.104722), btScalar(-0.794256)),
+ btVector3(btScalar(-0.488575), btScalar(0.307699), btScalar(-0.816313)),
+ btVector3(btScalar(-0.379882), btScalar(0.513592), btScalar(-0.769077)),
+ btVector3(btScalar(-0.425740), btScalar(0.862775), btScalar(-0.272516)),
+ btVector3(btScalar(-0.480769), btScalar(0.875412), btScalar(-0.048439)),
+ btVector3(btScalar(-0.467890), btScalar(0.648716), btScalar(-0.600043)),
+ btVector3(btScalar(-0.543799), btScalar(0.730956), btScalar(-0.411881)),
+ btVector3(btScalar(-0.516284), btScalar(0.838277), btScalar(0.174076)),
+ btVector3(btScalar(-0.353343), btScalar(0.876384), btScalar(0.326519)),
+ btVector3(btScalar(-0.572875), btScalar(0.614497), btScalar(0.542007)),
+ btVector3(btScalar(-0.503600), btScalar(0.497261), btScalar(0.706161)),
+ btVector3(btScalar(-0.530920), btScalar(0.754870), btScalar(0.384685)),
+ btVector3(btScalar(-0.395884), btScalar(0.366414), btScalar(0.841818)),
+ btVector3(btScalar(-0.300656), btScalar(0.001678), btScalar(0.953661)),
+ btVector3(btScalar(-0.461060), btScalar(0.146912), btScalar(0.875000)),
+ btVector3(btScalar(-0.315486), btScalar(-0.232212), btScalar(0.919893)),
+ btVector3(btScalar(-0.323682), btScalar(-0.449187), btScalar(0.832644)),
+ btVector3(btScalar(-0.318999), btScalar(-0.639527), btScalar(0.699134)),
+ btVector3(btScalar(-0.496771), btScalar(-0.866029), btScalar(-0.055271)),
+ btVector3(btScalar(-0.496771), btScalar(-0.816257), btScalar(-0.294377)),
+ btVector3(btScalar(-0.456377), btScalar(-0.869528), btScalar(0.188130)),
+ btVector3(btScalar(-0.380858), btScalar(-0.827144), btScalar(0.412792)),
+ btVector3(btScalar(-0.449352), btScalar(-0.727405), btScalar(-0.518259)),
+ btVector3(btScalar(-0.570533), btScalar(-0.551064), btScalar(-0.608632)),
+ btVector3(btScalar(-0.656394), btScalar(-0.118280), btScalar(-0.744874)),
+ btVector3(btScalar(-0.756696), btScalar(-0.438105), btScalar(-0.484882)),
+ btVector3(btScalar(-0.801773), btScalar(-0.204798), btScalar(-0.561005)),
+ btVector3(btScalar(-0.785186), btScalar(0.038618), btScalar(-0.617805)),
+ btVector3(btScalar(-0.709082), btScalar(0.262399), btScalar(-0.654306)),
+ btVector3(btScalar(-0.583412), btScalar(0.462265), btScalar(-0.667383)),
+ btVector3(btScalar(-0.616001), btScalar(0.761286), btScalar(-0.201272)),
+ btVector3(btScalar(-0.660687), btScalar(0.750204), btScalar(0.020072)),
+ btVector3(btScalar(-0.744987), btScalar(0.435823), btScalar(-0.504791)),
+ btVector3(btScalar(-0.713765), btScalar(0.605554), btScalar(-0.351373)),
+ btVector3(btScalar(-0.686251), btScalar(0.687600), btScalar(0.236927)),
+ btVector3(btScalar(-0.680201), btScalar(0.429407), btScalar(0.593732)),
+ btVector3(btScalar(-0.733474), btScalar(0.546450), btScalar(0.403814)),
+ btVector3(btScalar(-0.591023), btScalar(0.292923), btScalar(0.751445)),
+ btVector3(btScalar(-0.500283), btScalar(-0.080757), btScalar(0.861922)),
+ btVector3(btScalar(-0.643710), btScalar(0.070115), btScalar(0.761985)),
+ btVector3(btScalar(-0.506332), btScalar(-0.308425), btScalar(0.805122)),
+ btVector3(btScalar(-0.503015), btScalar(-0.509847), btScalar(0.697573)),
+ btVector3(btScalar(-0.482525), btScalar(-0.682105), btScalar(0.549229)),
+ btVector3(btScalar(-0.680396), btScalar(-0.716323), btScalar(-0.153451)),
+ btVector3(btScalar(-0.658346), btScalar(-0.746264), btScalar(0.097562)),
+ btVector3(btScalar(-0.653272), btScalar(-0.646915), btScalar(-0.392948)),
+ btVector3(btScalar(-0.590828), btScalar(-0.732655), btScalar(0.337645)),
+ btVector3(btScalar(-0.819140), btScalar(-0.518013), btScalar(-0.246166)),
+ btVector3(btScalar(-0.900513), btScalar(-0.282178), btScalar(-0.330487)),
+ btVector3(btScalar(-0.914953), btScalar(-0.028652), btScalar(-0.402122)),
+ btVector3(btScalar(-0.859924), btScalar(0.220209), btScalar(-0.459898)),
+ btVector3(btScalar(-0.777185), btScalar(0.613720), btScalar(-0.137836)),
+ btVector3(btScalar(-0.805285), btScalar(0.586889), btScalar(0.082728)),
+ btVector3(btScalar(-0.872413), btScalar(0.406077), btScalar(-0.271735)),
+ btVector3(btScalar(-0.859339), btScalar(0.448072), btScalar(0.246101)),
+ btVector3(btScalar(-0.757671), btScalar(0.216320), btScalar(0.615594)),
+ btVector3(btScalar(-0.826165), btScalar(0.348139), btScalar(0.442851)),
+ btVector3(btScalar(-0.671810), btScalar(-0.162803), btScalar(0.722557)),
+ btVector3(btScalar(-0.796504), btScalar(-0.004543), btScalar(0.604468)),
+ btVector3(btScalar(-0.676298), btScalar(-0.378223), btScalar(0.631794)),
+ btVector3(btScalar(-0.668883), btScalar(-0.558258), btScalar(0.490673)),
+ btVector3(btScalar(-0.821287), btScalar(-0.570118), btScalar(0.006994)),
+ btVector3(btScalar(-0.767428), btScalar(-0.587810), btScalar(0.255470)),
+ btVector3(btScalar(-0.933296), btScalar(-0.349837), btScalar(-0.079865)),
+ btVector3(btScalar(-0.982667), btScalar(-0.100393), btScalar(-0.155208)),
+ btVector3(btScalar(-0.961396), btScalar(0.160910), btScalar(-0.222938)),
+ btVector3(btScalar(-0.934858), btScalar(0.354555), btScalar(-0.006864)),
+ btVector3(btScalar(-0.941687), btScalar(0.229736), btScalar(0.245711)),
+ btVector3(btScalar(-0.884317), btScalar(0.131552), btScalar(0.447536)),
+ btVector3(btScalar(-0.810359), btScalar(-0.219769), btScalar(0.542788)),
+ btVector3(btScalar(-0.915929), btScalar(-0.210048), btScalar(0.341743)),
+ btVector3(btScalar(-0.816799), btScalar(-0.407192), btScalar(0.408303)),
+ btVector3(btScalar(-0.903050), btScalar(-0.392416), btScalar(0.174076)),
+ btVector3(btScalar(-0.980325), btScalar(-0.170969), btScalar(0.096586)),
+ btVector3(btScalar(-0.995936), btScalar(0.084891), btScalar(0.029441)),
+ btVector3(btScalar(-0.960031), btScalar(0.002650), btScalar(0.279283)),
+ };
static btVector3 sUnitSpherePoints[NUM_UNITSPHERE_POINTS + MAX_PREFERRED_PENETRATION_DIRECTIONS * 2] =
- {
- btVector3(btScalar(0.000000) , btScalar(-0.000000),btScalar(-1.000000)),
- btVector3(btScalar(0.723608) , btScalar(-0.525725),btScalar(-0.447219)),
- btVector3(btScalar(-0.276388) , btScalar(-0.850649),btScalar(-0.447219)),
- btVector3(btScalar(-0.894426) , btScalar(-0.000000),btScalar(-0.447216)),
- btVector3(btScalar(-0.276388) , btScalar(0.850649),btScalar(-0.447220)),
- btVector3(btScalar(0.723608) , btScalar(0.525725),btScalar(-0.447219)),
- btVector3(btScalar(0.276388) , btScalar(-0.850649),btScalar(0.447220)),
- btVector3(btScalar(-0.723608) , btScalar(-0.525725),btScalar(0.447219)),
- btVector3(btScalar(-0.723608) , btScalar(0.525725),btScalar(0.447219)),
- btVector3(btScalar(0.276388) , btScalar(0.850649),btScalar(0.447219)),
- btVector3(btScalar(0.894426) , btScalar(0.000000),btScalar(0.447216)),
- btVector3(btScalar(-0.000000) , btScalar(0.000000),btScalar(1.000000)),
- btVector3(btScalar(0.425323) , btScalar(-0.309011),btScalar(-0.850654)),
- btVector3(btScalar(-0.162456) , btScalar(-0.499995),btScalar(-0.850654)),
- btVector3(btScalar(0.262869) , btScalar(-0.809012),btScalar(-0.525738)),
- btVector3(btScalar(0.425323) , btScalar(0.309011),btScalar(-0.850654)),
- btVector3(btScalar(0.850648) , btScalar(-0.000000),btScalar(-0.525736)),
- btVector3(btScalar(-0.525730) , btScalar(-0.000000),btScalar(-0.850652)),
- btVector3(btScalar(-0.688190) , btScalar(-0.499997),btScalar(-0.525736)),
- btVector3(btScalar(-0.162456) , btScalar(0.499995),btScalar(-0.850654)),
- btVector3(btScalar(-0.688190) , btScalar(0.499997),btScalar(-0.525736)),
- btVector3(btScalar(0.262869) , btScalar(0.809012),btScalar(-0.525738)),
- btVector3(btScalar(0.951058) , btScalar(0.309013),btScalar(0.000000)),
- btVector3(btScalar(0.951058) , btScalar(-0.309013),btScalar(0.000000)),
- btVector3(btScalar(0.587786) , btScalar(-0.809017),btScalar(0.000000)),
- btVector3(btScalar(0.000000) , btScalar(-1.000000),btScalar(0.000000)),
- btVector3(btScalar(-0.587786) , btScalar(-0.809017),btScalar(0.000000)),
- btVector3(btScalar(-0.951058) , btScalar(-0.309013),btScalar(-0.000000)),
- btVector3(btScalar(-0.951058) , btScalar(0.309013),btScalar(-0.000000)),
- btVector3(btScalar(-0.587786) , btScalar(0.809017),btScalar(-0.000000)),
- btVector3(btScalar(-0.000000) , btScalar(1.000000),btScalar(-0.000000)),
- btVector3(btScalar(0.587786) , btScalar(0.809017),btScalar(-0.000000)),
- btVector3(btScalar(0.688190) , btScalar(-0.499997),btScalar(0.525736)),
- btVector3(btScalar(-0.262869) , btScalar(-0.809012),btScalar(0.525738)),
- btVector3(btScalar(-0.850648) , btScalar(0.000000),btScalar(0.525736)),
- btVector3(btScalar(-0.262869) , btScalar(0.809012),btScalar(0.525738)),
- btVector3(btScalar(0.688190) , btScalar(0.499997),btScalar(0.525736)),
- btVector3(btScalar(0.525730) , btScalar(0.000000),btScalar(0.850652)),
- btVector3(btScalar(0.162456) , btScalar(-0.499995),btScalar(0.850654)),
- btVector3(btScalar(-0.425323) , btScalar(-0.309011),btScalar(0.850654)),
- btVector3(btScalar(-0.425323) , btScalar(0.309011),btScalar(0.850654)),
- btVector3(btScalar(0.162456) , btScalar(0.499995),btScalar(0.850654))
- };
+ {
+ btVector3(btScalar(0.000000), btScalar(-0.000000), btScalar(-1.000000)),
+ btVector3(btScalar(0.723608), btScalar(-0.525725), btScalar(-0.447219)),
+ btVector3(btScalar(-0.276388), btScalar(-0.850649), btScalar(-0.447219)),
+ btVector3(btScalar(-0.894426), btScalar(-0.000000), btScalar(-0.447216)),
+ btVector3(btScalar(-0.276388), btScalar(0.850649), btScalar(-0.447220)),
+ btVector3(btScalar(0.723608), btScalar(0.525725), btScalar(-0.447219)),
+ btVector3(btScalar(0.276388), btScalar(-0.850649), btScalar(0.447220)),
+ btVector3(btScalar(-0.723608), btScalar(-0.525725), btScalar(0.447219)),
+ btVector3(btScalar(-0.723608), btScalar(0.525725), btScalar(0.447219)),
+ btVector3(btScalar(0.276388), btScalar(0.850649), btScalar(0.447219)),
+ btVector3(btScalar(0.894426), btScalar(0.000000), btScalar(0.447216)),
+ btVector3(btScalar(-0.000000), btScalar(0.000000), btScalar(1.000000)),
+ btVector3(btScalar(0.425323), btScalar(-0.309011), btScalar(-0.850654)),
+ btVector3(btScalar(-0.162456), btScalar(-0.499995), btScalar(-0.850654)),
+ btVector3(btScalar(0.262869), btScalar(-0.809012), btScalar(-0.525738)),
+ btVector3(btScalar(0.425323), btScalar(0.309011), btScalar(-0.850654)),
+ btVector3(btScalar(0.850648), btScalar(-0.000000), btScalar(-0.525736)),
+ btVector3(btScalar(-0.525730), btScalar(-0.000000), btScalar(-0.850652)),
+ btVector3(btScalar(-0.688190), btScalar(-0.499997), btScalar(-0.525736)),
+ btVector3(btScalar(-0.162456), btScalar(0.499995), btScalar(-0.850654)),
+ btVector3(btScalar(-0.688190), btScalar(0.499997), btScalar(-0.525736)),
+ btVector3(btScalar(0.262869), btScalar(0.809012), btScalar(-0.525738)),
+ btVector3(btScalar(0.951058), btScalar(0.309013), btScalar(0.000000)),
+ btVector3(btScalar(0.951058), btScalar(-0.309013), btScalar(0.000000)),
+ btVector3(btScalar(0.587786), btScalar(-0.809017), btScalar(0.000000)),
+ btVector3(btScalar(0.000000), btScalar(-1.000000), btScalar(0.000000)),
+ btVector3(btScalar(-0.587786), btScalar(-0.809017), btScalar(0.000000)),
+ btVector3(btScalar(-0.951058), btScalar(-0.309013), btScalar(-0.000000)),
+ btVector3(btScalar(-0.951058), btScalar(0.309013), btScalar(-0.000000)),
+ btVector3(btScalar(-0.587786), btScalar(0.809017), btScalar(-0.000000)),
+ btVector3(btScalar(-0.000000), btScalar(1.000000), btScalar(-0.000000)),
+ btVector3(btScalar(0.587786), btScalar(0.809017), btScalar(-0.000000)),
+ btVector3(btScalar(0.688190), btScalar(-0.499997), btScalar(0.525736)),
+ btVector3(btScalar(-0.262869), btScalar(-0.809012), btScalar(0.525738)),
+ btVector3(btScalar(-0.850648), btScalar(0.000000), btScalar(0.525736)),
+ btVector3(btScalar(-0.262869), btScalar(0.809012), btScalar(0.525738)),
+ btVector3(btScalar(0.688190), btScalar(0.499997), btScalar(0.525736)),
+ btVector3(btScalar(0.525730), btScalar(0.000000), btScalar(0.850652)),
+ btVector3(btScalar(0.162456), btScalar(-0.499995), btScalar(0.850654)),
+ btVector3(btScalar(-0.425323), btScalar(-0.309011), btScalar(0.850654)),
+ btVector3(btScalar(-0.425323), btScalar(0.309011), btScalar(0.850654)),
+ btVector3(btScalar(0.162456), btScalar(0.499995), btScalar(0.850654))};
if (highres)
return sUnitSpherePointsHighres;
return sUnitSpherePoints;
}
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btShapeHull.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btShapeHull.h
index 78ea4b6501..54439f9ca2 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btShapeHull.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btShapeHull.h
@@ -21,32 +21,31 @@ subject to the following restrictions:
#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
+ATTRIBUTE_ALIGNED16(class)
+btShapeHull
{
protected:
-
btAlignedObjectArray<btVector3> m_vertices;
btAlignedObjectArray<unsigned int> m_indices;
unsigned int m_numIndices;
const btConvexShape* m_shape;
- static btVector3* getUnitSpherePoints(int highres=0);
+ static btVector3* getUnitSpherePoints(int highres = 0);
public:
BT_DECLARE_ALIGNED_ALLOCATOR();
-
- btShapeHull (const btConvexShape* shape);
- ~btShapeHull ();
- bool buildHull (btScalar margin, int highres=0);
+ btShapeHull(const btConvexShape* shape);
+ ~btShapeHull();
+
+ bool buildHull(btScalar margin, int highres = 0);
- int numTriangles () const;
- int numVertices () const;
- int numIndices () const;
+ int numTriangles() const;
+ int numVertices() const;
+ int numIndices() const;
const btVector3* getVertexPointer() const
{
@@ -58,4 +57,4 @@ public:
}
};
-#endif //BT_SHAPE_HULL_H
+#endif //BT_SHAPE_HULL_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btSphereShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btSphereShape.cpp
index b9a736c0fd..027db2e104 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btSphereShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btSphereShape.cpp
@@ -18,54 +18,48 @@ subject to the following restrictions:
#include "LinearMath/btQuaternion.h"
-btVector3 btSphereShape::localGetSupportingVertexWithoutMargin(const btVector3& vec)const
+btVector3 btSphereShape::localGetSupportingVertexWithoutMargin(const btVector3& vec) const
{
(void)vec;
- return btVector3(btScalar(0.),btScalar(0.),btScalar(0.));
+ return btVector3(btScalar(0.), btScalar(0.), btScalar(0.));
}
-void btSphereShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const
+void btSphereShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const
{
(void)vectors;
- for (int i=0;i<numVectors;i++)
+ for (int i = 0; i < numVectors; i++)
{
- supportVerticesOut[i].setValue(btScalar(0.),btScalar(0.),btScalar(0.));
+ supportVerticesOut[i].setValue(btScalar(0.), btScalar(0.), btScalar(0.));
}
}
-
-btVector3 btSphereShape::localGetSupportingVertex(const btVector3& vec)const
+btVector3 btSphereShape::localGetSupportingVertex(const btVector3& vec) const
{
btVector3 supVertex;
supVertex = localGetSupportingVertexWithoutMargin(vec);
btVector3 vecnorm = vec;
- if (vecnorm .length2() < (SIMD_EPSILON*SIMD_EPSILON))
+ if (vecnorm.length2() < (SIMD_EPSILON * SIMD_EPSILON))
{
- vecnorm.setValue(btScalar(-1.),btScalar(-1.),btScalar(-1.));
- }
+ vecnorm.setValue(btScalar(-1.), btScalar(-1.), btScalar(-1.));
+ }
vecnorm.normalize();
- supVertex+= getMargin() * vecnorm;
+ supVertex += getMargin() * vecnorm;
return supVertex;
}
-
//broken due to scaling
-void btSphereShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
+void btSphereShape::getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
{
const btVector3& center = t.getOrigin();
- btVector3 extent(getMargin(),getMargin(),getMargin());
+ btVector3 extent(getMargin(), getMargin(), getMargin());
aabbMin = center - extent;
aabbMax = center + extent;
}
-
-
-void btSphereShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const
+void btSphereShape::calculateLocalInertia(btScalar mass, btVector3& inertia) const
{
- btScalar elem = btScalar(0.4) * mass * getMargin()*getMargin();
- inertia.setValue(elem,elem,elem);
-
+ btScalar elem = btScalar(0.4) * mass * getMargin() * getMargin();
+ inertia.setValue(elem, elem, elem);
}
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btSphereShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btSphereShape.h
index 50561f7f54..75e4fd8e18 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btSphereShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btSphereShape.h
@@ -16,17 +16,17 @@ subject to the following restrictions:
#define BT_SPHERE_MINKOWSKI_H
#include "btConvexInternalShape.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
+#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
+ATTRIBUTE_ALIGNED16(class)
+btSphereShape : public btConvexInternalShape
{
-
public:
BT_DECLARE_ALIGNED_ALLOCATOR();
- btSphereShape (btScalar radius) : btConvexInternalShape ()
+ btSphereShape(btScalar radius) : btConvexInternalShape()
{
m_shapeType = SPHERE_SHAPE_PROXYTYPE;
m_localScaling.setValue(1.0, 1.0, 1.0);
@@ -35,42 +35,37 @@ public:
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 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 getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) 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();}
+ btScalar getRadius() const { return m_implicitShapeDimensions.getX() * m_localScaling.getX(); }
- void setUnscaledRadius(btScalar radius)
+ void setUnscaledRadius(btScalar radius)
{
m_implicitShapeDimensions.setX(radius);
btConvexInternalShape::setMargin(radius);
}
//debugging
- virtual const char* getName()const {return "SPHERE";}
+ virtual const char* getName() const { return "SPHERE"; }
- virtual void setMargin(btScalar margin)
+ virtual void setMargin(btScalar margin)
{
btConvexInternalShape::setMargin(margin);
}
- virtual btScalar getMargin() const
+ 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
+#endif //BT_SPHERE_MINKOWSKI_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btStaticPlaneShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btStaticPlaneShape.cpp
index b5e0e716d4..9238c919d5 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btStaticPlaneShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btStaticPlaneShape.cpp
@@ -17,24 +17,18 @@ subject to the following restrictions:
#include "LinearMath/btTransformUtil.h"
-
-btStaticPlaneShape::btStaticPlaneShape(const btVector3& planeNormal,btScalar planeConstant)
-: btConcaveShape (), m_planeNormal(planeNormal.normalized()),
-m_planeConstant(planeConstant),
-m_localScaling(btScalar(1.),btScalar(1.),btScalar(1.))
+btStaticPlaneShape::btStaticPlaneShape(const btVector3& planeNormal, btScalar planeConstant)
+ : btConcaveShape(), m_planeNormal(planeNormal.normalized()), m_planeConstant(planeConstant), m_localScaling(btScalar(1.), btScalar(1.), btScalar(1.))
{
m_shapeType = STATIC_PLANE_PROXYTYPE;
// btAssert( btFuzzyZero(m_planeNormal.length() - btScalar(1.)) );
}
-
btStaticPlaneShape::~btStaticPlaneShape()
{
}
-
-
-void btStaticPlaneShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
+void btStaticPlaneShape::getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
{
(void)t;
/*
@@ -47,55 +41,49 @@ void btStaticPlaneShape::getAabb(const btTransform& t,btVector3& aabbMin,btVecto
aabbMax.setMax(center - infvec*m_planeNormal);
*/
- aabbMin.setValue(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
- aabbMax.setValue(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
-
+ aabbMin.setValue(btScalar(-BT_LARGE_FLOAT), btScalar(-BT_LARGE_FLOAT), btScalar(-BT_LARGE_FLOAT));
+ aabbMax.setValue(btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT));
}
-
-
-
-void btStaticPlaneShape::processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const
+void btStaticPlaneShape::processAllTriangles(btTriangleCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax) const
{
-
btVector3 halfExtents = (aabbMax - aabbMin) * btScalar(0.5);
btScalar radius = halfExtents.length();
btVector3 center = (aabbMax + aabbMin) * btScalar(0.5);
-
+
//this is where the triangles are generated, given AABB and plane equation (normal/constant)
- btVector3 tangentDir0,tangentDir1;
+ btVector3 tangentDir0, tangentDir1;
//tangentDir0/tangentDir1 can be precalculated
- btPlaneSpace1(m_planeNormal,tangentDir0,tangentDir1);
+ btPlaneSpace1(m_planeNormal, tangentDir0, tangentDir1);
- btVector3 projectedCenter = center - (m_planeNormal.dot(center) - m_planeConstant)*m_planeNormal;
-
- btVector3 triangle[3];
- triangle[0] = projectedCenter + tangentDir0*radius + tangentDir1*radius;
- triangle[1] = projectedCenter + tangentDir0*radius - tangentDir1*radius;
- triangle[2] = projectedCenter - tangentDir0*radius - tangentDir1*radius;
+ btVector3 projectedCenter = center - (m_planeNormal.dot(center) - m_planeConstant) * m_planeNormal;
- callback->processTriangle(triangle,0,0);
+ btVector3 triangle[3];
+ triangle[0] = projectedCenter + tangentDir0 * radius + tangentDir1 * radius;
+ triangle[1] = projectedCenter + tangentDir0 * radius - tangentDir1 * radius;
+ triangle[2] = projectedCenter - tangentDir0 * radius - tangentDir1 * radius;
- triangle[0] = projectedCenter - tangentDir0*radius - tangentDir1*radius;
- triangle[1] = projectedCenter - tangentDir0*radius + tangentDir1*radius;
- triangle[2] = projectedCenter + tangentDir0*radius + tangentDir1*radius;
+ callback->processTriangle(triangle, 0, 0);
- callback->processTriangle(triangle,0,1);
+ triangle[0] = projectedCenter - tangentDir0 * radius - tangentDir1 * radius;
+ triangle[1] = projectedCenter - tangentDir0 * radius + tangentDir1 * radius;
+ triangle[2] = projectedCenter + tangentDir0 * radius + tangentDir1 * radius;
+ callback->processTriangle(triangle, 0, 1);
}
-void btStaticPlaneShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const
+void btStaticPlaneShape::calculateLocalInertia(btScalar mass, btVector3& inertia) const
{
(void)mass;
//moving concave objects not supported
-
- inertia.setValue(btScalar(0.),btScalar(0.),btScalar(0.));
+
+ inertia.setValue(btScalar(0.), btScalar(0.), btScalar(0.));
}
-void btStaticPlaneShape::setLocalScaling(const btVector3& scaling)
+void btStaticPlaneShape::setLocalScaling(const btVector3& scaling)
{
m_localScaling = scaling;
}
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btStaticPlaneShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btStaticPlaneShape.h
index 5e9eccc77d..1cda8bbc75 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btStaticPlaneShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btStaticPlaneShape.h
@@ -18,78 +18,74 @@ subject to the following restrictions:
#include "btConcaveShape.h"
-
///The btStaticPlaneShape simulates an infinite non-moving (static) collision plane.
-ATTRIBUTE_ALIGNED16(class) btStaticPlaneShape : public btConcaveShape
+ATTRIBUTE_ALIGNED16(class)
+btStaticPlaneShape : public btConcaveShape
{
protected:
- btVector3 m_localAabbMin;
- btVector3 m_localAabbMax;
-
- btVector3 m_planeNormal;
- btScalar m_planeConstant;
- btVector3 m_localScaling;
+ 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);
+ btStaticPlaneShape(const btVector3& planeNormal, btScalar planeConstant);
virtual ~btStaticPlaneShape();
+ virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const;
- 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 processAllTriangles(btTriangleCallback * callback, const btVector3& aabbMin, const btVector3& aabbMax) const;
- virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
+ virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const;
- virtual void setLocalScaling(const btVector3& scaling);
+ virtual void setLocalScaling(const btVector3& scaling);
virtual const btVector3& getLocalScaling() const;
-
- const btVector3& getPlaneNormal() const
+
+ const btVector3& getPlaneNormal() const
{
- return m_planeNormal;
+ return m_planeNormal;
}
- const btScalar& getPlaneConstant() const
+ const btScalar& getPlaneConstant() const
{
- return m_planeConstant;
+ return m_planeConstant;
}
//debugging
- virtual const char* getName()const {return "STATICPLANE";}
+ virtual const char* getName() const { return "STATICPLANE"; }
- virtual int calculateSerializeBufferSize() 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;
-
-
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
};
///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
-struct btStaticPlaneShapeData
+struct btStaticPlaneShapeData
{
- btCollisionShapeData m_collisionShapeData;
+ btCollisionShapeData m_collisionShapeData;
- btVector3FloatData m_localScaling;
- btVector3FloatData m_planeNormal;
- float m_planeConstant;
- char m_pad[4];
+ btVector3FloatData m_localScaling;
+ btVector3FloatData m_planeNormal;
+ float m_planeConstant;
+ char m_pad[4];
};
-
-SIMD_FORCE_INLINE int btStaticPlaneShape::calculateSerializeBufferSize() const
+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
+SIMD_FORCE_INLINE const char* btStaticPlaneShape::serialize(void* dataBuffer, btSerializer* serializer) const
{
- btStaticPlaneShapeData* planeData = (btStaticPlaneShapeData*) dataBuffer;
- btCollisionShape::serialize(&planeData->m_collisionShapeData,serializer);
+ btStaticPlaneShapeData* planeData = (btStaticPlaneShapeData*)dataBuffer;
+ btCollisionShape::serialize(&planeData->m_collisionShapeData, serializer);
m_localScaling.serializeFloat(planeData->m_localScaling);
m_planeNormal.serializeFloat(planeData->m_planeNormal);
@@ -104,8 +100,4 @@ SIMD_FORCE_INLINE const char* btStaticPlaneShape::serialize(void* dataBuffer, bt
return "btStaticPlaneShapeData";
}
-
-#endif //BT_STATIC_PLANE_SHAPE_H
-
-
-
+#endif //BT_STATIC_PLANE_SHAPE_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp
index 78ddeb3704..eb288e99c9 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp
@@ -18,32 +18,30 @@ subject to the following restrictions:
btStridingMeshInterface::~btStridingMeshInterface()
{
-
}
-
-void btStridingMeshInterface::InternalProcessAllTriangles(btInternalTriangleIndexCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const
+void btStridingMeshInterface::InternalProcessAllTriangles(btInternalTriangleIndexCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax) const
{
(void)aabbMin;
(void)aabbMax;
int numtotalphysicsverts = 0;
- int part,graphicssubparts = getNumSubParts();
- const unsigned char * vertexbase;
- const unsigned char * indexbase;
+ int part, graphicssubparts = getNumSubParts();
+ const unsigned char* vertexbase;
+ const unsigned char* indexbase;
int indexstride;
PHY_ScalarType type;
PHY_ScalarType gfxindextype;
- int stride,numverts,numtriangles;
+ int stride, numverts, numtriangles;
int gfxindex;
btVector3 triangle[3];
btVector3 meshScaling = getScaling();
///if the number of parts is big, the performance might drop due to the innerloop switch on indextype
- for (part=0;part<graphicssubparts ;part++)
+ for (part = 0; part < graphicssubparts; part++)
{
- getLockedReadOnlyVertexIndexBase(&vertexbase,numverts,type,stride,&indexbase,indexstride,numtriangles,gfxindextype,part);
- numtotalphysicsverts+=numtriangles*3; //upper bound
+ getLockedReadOnlyVertexIndexBase(&vertexbase, numverts, type, stride, &indexbase, indexstride, numtriangles, gfxindextype, part);
+ numtotalphysicsverts += numtriangles * 3; //upper bound
///unlike that developers want to pass in double-precision meshes in single-precision Bullet build
///so disable this feature by default
@@ -51,143 +49,141 @@ void btStridingMeshInterface::InternalProcessAllTriangles(btInternalTriangleInde
switch (type)
{
- case PHY_FLOAT:
- {
-
- float* graphicsbase;
-
- switch (gfxindextype)
- {
- case PHY_INTEGER:
- {
- for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
- {
- unsigned int* tri_indices= (unsigned int*)(indexbase+gfxindex*indexstride);
- graphicsbase = (float*)(vertexbase+tri_indices[0]*stride);
- triangle[0].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(),graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (float*)(vertexbase+tri_indices[1]*stride);
- triangle[1].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(), graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (float*)(vertexbase+tri_indices[2]*stride);
- triangle[2].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(), graphicsbase[2]*meshScaling.getZ());
- callback->internalProcessTriangleIndex(triangle,part,gfxindex);
- }
- break;
- }
- case PHY_SHORT:
- {
- for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
- {
- unsigned short int* tri_indices= (unsigned short int*)(indexbase+gfxindex*indexstride);
- graphicsbase = (float*)(vertexbase+tri_indices[0]*stride);
- triangle[0].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(),graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (float*)(vertexbase+tri_indices[1]*stride);
- triangle[1].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(), graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (float*)(vertexbase+tri_indices[2]*stride);
- triangle[2].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(), graphicsbase[2]*meshScaling.getZ());
- callback->internalProcessTriangleIndex(triangle,part,gfxindex);
- }
- break;
- }
- case PHY_UCHAR:
- {
- for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
- {
- unsigned char* tri_indices= (unsigned char*)(indexbase+gfxindex*indexstride);
- graphicsbase = (float*)(vertexbase+tri_indices[0]*stride);
- triangle[0].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(),graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (float*)(vertexbase+tri_indices[1]*stride);
- triangle[1].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(), graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (float*)(vertexbase+tri_indices[2]*stride);
- triangle[2].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(), graphicsbase[2]*meshScaling.getZ());
- callback->internalProcessTriangleIndex(triangle,part,gfxindex);
- }
- break;
- }
- default:
- btAssert((gfxindextype == PHY_INTEGER) || (gfxindextype == PHY_SHORT));
- }
- break;
- }
-
- case PHY_DOUBLE:
+ case PHY_FLOAT:
+ {
+ float* graphicsbase;
+
+ switch (gfxindextype)
+ {
+ case PHY_INTEGER:
+ {
+ for (gfxindex = 0; gfxindex < numtriangles; gfxindex++)
+ {
+ unsigned int* tri_indices = (unsigned int*)(indexbase + gfxindex * indexstride);
+ graphicsbase = (float*)(vertexbase + tri_indices[0] * stride);
+ triangle[0].setValue(graphicsbase[0] * meshScaling.getX(), graphicsbase[1] * meshScaling.getY(), graphicsbase[2] * meshScaling.getZ());
+ graphicsbase = (float*)(vertexbase + tri_indices[1] * stride);
+ triangle[1].setValue(graphicsbase[0] * meshScaling.getX(), graphicsbase[1] * meshScaling.getY(), graphicsbase[2] * meshScaling.getZ());
+ graphicsbase = (float*)(vertexbase + tri_indices[2] * stride);
+ triangle[2].setValue(graphicsbase[0] * meshScaling.getX(), graphicsbase[1] * meshScaling.getY(), graphicsbase[2] * meshScaling.getZ());
+ callback->internalProcessTriangleIndex(triangle, part, gfxindex);
+ }
+ break;
+ }
+ case PHY_SHORT:
+ {
+ for (gfxindex = 0; gfxindex < numtriangles; gfxindex++)
+ {
+ unsigned short int* tri_indices = (unsigned short int*)(indexbase + gfxindex * indexstride);
+ graphicsbase = (float*)(vertexbase + tri_indices[0] * stride);
+ triangle[0].setValue(graphicsbase[0] * meshScaling.getX(), graphicsbase[1] * meshScaling.getY(), graphicsbase[2] * meshScaling.getZ());
+ graphicsbase = (float*)(vertexbase + tri_indices[1] * stride);
+ triangle[1].setValue(graphicsbase[0] * meshScaling.getX(), graphicsbase[1] * meshScaling.getY(), graphicsbase[2] * meshScaling.getZ());
+ graphicsbase = (float*)(vertexbase + tri_indices[2] * stride);
+ triangle[2].setValue(graphicsbase[0] * meshScaling.getX(), graphicsbase[1] * meshScaling.getY(), graphicsbase[2] * meshScaling.getZ());
+ callback->internalProcessTriangleIndex(triangle, part, gfxindex);
+ }
+ break;
+ }
+ case PHY_UCHAR:
+ {
+ for (gfxindex = 0; gfxindex < numtriangles; gfxindex++)
+ {
+ unsigned char* tri_indices = (unsigned char*)(indexbase + gfxindex * indexstride);
+ graphicsbase = (float*)(vertexbase + tri_indices[0] * stride);
+ triangle[0].setValue(graphicsbase[0] * meshScaling.getX(), graphicsbase[1] * meshScaling.getY(), graphicsbase[2] * meshScaling.getZ());
+ graphicsbase = (float*)(vertexbase + tri_indices[1] * stride);
+ triangle[1].setValue(graphicsbase[0] * meshScaling.getX(), graphicsbase[1] * meshScaling.getY(), graphicsbase[2] * meshScaling.getZ());
+ graphicsbase = (float*)(vertexbase + tri_indices[2] * stride);
+ triangle[2].setValue(graphicsbase[0] * meshScaling.getX(), graphicsbase[1] * meshScaling.getY(), graphicsbase[2] * meshScaling.getZ());
+ callback->internalProcessTriangleIndex(triangle, part, gfxindex);
+ }
+ break;
+ }
+ default:
+ btAssert((gfxindextype == PHY_INTEGER) || (gfxindextype == PHY_SHORT));
+ }
+ break;
+ }
+
+ case PHY_DOUBLE:
{
double* graphicsbase;
switch (gfxindextype)
{
- case PHY_INTEGER:
+ case PHY_INTEGER:
{
- for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
+ for (gfxindex = 0; gfxindex < numtriangles; gfxindex++)
{
- unsigned int* tri_indices= (unsigned int*)(indexbase+gfxindex*indexstride);
- graphicsbase = (double*)(vertexbase+tri_indices[0]*stride);
- triangle[0].setValue((btScalar)graphicsbase[0]*meshScaling.getX(),(btScalar)graphicsbase[1]*meshScaling.getY(),(btScalar)graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (double*)(vertexbase+tri_indices[1]*stride);
- triangle[1].setValue((btScalar)graphicsbase[0]*meshScaling.getX(),(btScalar)graphicsbase[1]*meshScaling.getY(), (btScalar)graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (double*)(vertexbase+tri_indices[2]*stride);
- triangle[2].setValue((btScalar)graphicsbase[0]*meshScaling.getX(),(btScalar)graphicsbase[1]*meshScaling.getY(), (btScalar)graphicsbase[2]*meshScaling.getZ());
- callback->internalProcessTriangleIndex(triangle,part,gfxindex);
+ unsigned int* tri_indices = (unsigned int*)(indexbase + gfxindex * indexstride);
+ graphicsbase = (double*)(vertexbase + tri_indices[0] * stride);
+ triangle[0].setValue((btScalar)graphicsbase[0] * meshScaling.getX(), (btScalar)graphicsbase[1] * meshScaling.getY(), (btScalar)graphicsbase[2] * meshScaling.getZ());
+ graphicsbase = (double*)(vertexbase + tri_indices[1] * stride);
+ triangle[1].setValue((btScalar)graphicsbase[0] * meshScaling.getX(), (btScalar)graphicsbase[1] * meshScaling.getY(), (btScalar)graphicsbase[2] * meshScaling.getZ());
+ graphicsbase = (double*)(vertexbase + tri_indices[2] * stride);
+ triangle[2].setValue((btScalar)graphicsbase[0] * meshScaling.getX(), (btScalar)graphicsbase[1] * meshScaling.getY(), (btScalar)graphicsbase[2] * meshScaling.getZ());
+ callback->internalProcessTriangleIndex(triangle, part, gfxindex);
}
break;
}
- case PHY_SHORT:
+ case PHY_SHORT:
{
- for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
+ for (gfxindex = 0; gfxindex < numtriangles; gfxindex++)
{
- unsigned short int* tri_indices= (unsigned short int*)(indexbase+gfxindex*indexstride);
- graphicsbase = (double*)(vertexbase+tri_indices[0]*stride);
- triangle[0].setValue((btScalar)graphicsbase[0]*meshScaling.getX(),(btScalar)graphicsbase[1]*meshScaling.getY(),(btScalar)graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (double*)(vertexbase+tri_indices[1]*stride);
- triangle[1].setValue((btScalar)graphicsbase[0]*meshScaling.getX(),(btScalar)graphicsbase[1]*meshScaling.getY(), (btScalar)graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (double*)(vertexbase+tri_indices[2]*stride);
- triangle[2].setValue((btScalar)graphicsbase[0]*meshScaling.getX(),(btScalar)graphicsbase[1]*meshScaling.getY(), (btScalar)graphicsbase[2]*meshScaling.getZ());
- callback->internalProcessTriangleIndex(triangle,part,gfxindex);
+ unsigned short int* tri_indices = (unsigned short int*)(indexbase + gfxindex * indexstride);
+ graphicsbase = (double*)(vertexbase + tri_indices[0] * stride);
+ triangle[0].setValue((btScalar)graphicsbase[0] * meshScaling.getX(), (btScalar)graphicsbase[1] * meshScaling.getY(), (btScalar)graphicsbase[2] * meshScaling.getZ());
+ graphicsbase = (double*)(vertexbase + tri_indices[1] * stride);
+ triangle[1].setValue((btScalar)graphicsbase[0] * meshScaling.getX(), (btScalar)graphicsbase[1] * meshScaling.getY(), (btScalar)graphicsbase[2] * meshScaling.getZ());
+ graphicsbase = (double*)(vertexbase + tri_indices[2] * stride);
+ triangle[2].setValue((btScalar)graphicsbase[0] * meshScaling.getX(), (btScalar)graphicsbase[1] * meshScaling.getY(), (btScalar)graphicsbase[2] * meshScaling.getZ());
+ callback->internalProcessTriangleIndex(triangle, part, gfxindex);
}
break;
}
- case PHY_UCHAR:
+ case PHY_UCHAR:
{
- for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
+ for (gfxindex = 0; gfxindex < numtriangles; gfxindex++)
{
- unsigned char* tri_indices= (unsigned char*)(indexbase+gfxindex*indexstride);
- graphicsbase = (double*)(vertexbase+tri_indices[0]*stride);
- triangle[0].setValue((btScalar)graphicsbase[0]*meshScaling.getX(),(btScalar)graphicsbase[1]*meshScaling.getY(),(btScalar)graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (double*)(vertexbase+tri_indices[1]*stride);
- triangle[1].setValue((btScalar)graphicsbase[0]*meshScaling.getX(),(btScalar)graphicsbase[1]*meshScaling.getY(), (btScalar)graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (double*)(vertexbase+tri_indices[2]*stride);
- triangle[2].setValue((btScalar)graphicsbase[0]*meshScaling.getX(),(btScalar)graphicsbase[1]*meshScaling.getY(), (btScalar)graphicsbase[2]*meshScaling.getZ());
- callback->internalProcessTriangleIndex(triangle,part,gfxindex);
+ unsigned char* tri_indices = (unsigned char*)(indexbase + gfxindex * indexstride);
+ graphicsbase = (double*)(vertexbase + tri_indices[0] * stride);
+ triangle[0].setValue((btScalar)graphicsbase[0] * meshScaling.getX(), (btScalar)graphicsbase[1] * meshScaling.getY(), (btScalar)graphicsbase[2] * meshScaling.getZ());
+ graphicsbase = (double*)(vertexbase + tri_indices[1] * stride);
+ triangle[1].setValue((btScalar)graphicsbase[0] * meshScaling.getX(), (btScalar)graphicsbase[1] * meshScaling.getY(), (btScalar)graphicsbase[2] * meshScaling.getZ());
+ graphicsbase = (double*)(vertexbase + tri_indices[2] * stride);
+ triangle[2].setValue((btScalar)graphicsbase[0] * meshScaling.getX(), (btScalar)graphicsbase[1] * meshScaling.getY(), (btScalar)graphicsbase[2] * meshScaling.getZ());
+ callback->internalProcessTriangleIndex(triangle, part, gfxindex);
}
break;
}
- default:
- btAssert((gfxindextype == PHY_INTEGER) || (gfxindextype == PHY_SHORT));
+ default:
+ btAssert((gfxindextype == PHY_INTEGER) || (gfxindextype == PHY_SHORT));
}
break;
}
- default:
- btAssert((type == PHY_FLOAT) || (type == PHY_DOUBLE));
+ default:
+ btAssert((type == PHY_FLOAT) || (type == PHY_DOUBLE));
}
unLockReadOnlyVertexBase(part);
}
}
-void btStridingMeshInterface::calculateAabbBruteForce(btVector3& aabbMin,btVector3& aabbMax)
+void btStridingMeshInterface::calculateAabbBruteForce(btVector3& aabbMin, btVector3& aabbMax)
{
-
- struct AabbCalculationCallback : public btInternalTriangleIndexCallback
+ struct AabbCalculationCallback : public btInternalTriangleIndexCallback
{
- btVector3 m_aabbMin;
- btVector3 m_aabbMax;
+ btVector3 m_aabbMin;
+ btVector3 m_aabbMax;
AabbCalculationCallback()
{
- m_aabbMin.setValue(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
- m_aabbMax.setValue(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
+ m_aabbMin.setValue(btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT));
+ m_aabbMax.setValue(btScalar(-BT_LARGE_FLOAT), btScalar(-BT_LARGE_FLOAT), btScalar(-BT_LARGE_FLOAT));
}
- virtual void internalProcessTriangleIndex(btVector3* triangle,int partId,int triangleIndex)
+ virtual void internalProcessTriangleIndex(btVector3* triangle, int partId, int triangleIndex)
{
(void)partId;
(void)triangleIndex;
@@ -202,21 +198,19 @@ void btStridingMeshInterface::calculateAabbBruteForce(btVector3& aabbMin,btVecto
};
//first calculate the total aabb for all triangles
- AabbCalculationCallback aabbCallback;
- aabbMin.setValue(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
- aabbMax.setValue(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
- InternalProcessAllTriangles(&aabbCallback,aabbMin,aabbMax);
+ AabbCalculationCallback aabbCallback;
+ aabbMin.setValue(btScalar(-BT_LARGE_FLOAT), btScalar(-BT_LARGE_FLOAT), btScalar(-BT_LARGE_FLOAT));
+ aabbMax.setValue(btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT));
+ InternalProcessAllTriangles(&aabbCallback, aabbMin, aabbMax);
aabbMin = aabbCallback.m_aabbMin;
aabbMax = aabbCallback.m_aabbMax;
}
-
-
///fills the dataBuffer and returns the struct name (and 0 on failure)
-const char* btStridingMeshInterface::serialize(void* dataBuffer, btSerializer* serializer) const
+const char* btStridingMeshInterface::serialize(void* dataBuffer, btSerializer* serializer) const
{
- btStridingMeshInterfaceData* trimeshData = (btStridingMeshInterfaceData*) dataBuffer;
+ btStridingMeshInterfaceData* trimeshData = (btStridingMeshInterfaceData*)dataBuffer;
trimeshData->m_numMeshParts = getNumSubParts();
@@ -226,29 +220,28 @@ const char* btStridingMeshInterface::serialize(void* dataBuffer, btSerializer* s
if (trimeshData->m_numMeshParts)
{
- btChunk* chunk = serializer->allocate(sizeof(btMeshPartData),trimeshData->m_numMeshParts);
+ btChunk* chunk = serializer->allocate(sizeof(btMeshPartData), trimeshData->m_numMeshParts);
btMeshPartData* memPtr = (btMeshPartData*)chunk->m_oldPtr;
- trimeshData->m_meshPartsPtr = (btMeshPartData *)serializer->getUniquePointer(memPtr);
-
+ trimeshData->m_meshPartsPtr = (btMeshPartData*)serializer->getUniquePointer(memPtr);
- // int numtotalphysicsverts = 0;
- int part,graphicssubparts = getNumSubParts();
- const unsigned char * vertexbase;
- const unsigned char * indexbase;
+ // int numtotalphysicsverts = 0;
+ int part, graphicssubparts = getNumSubParts();
+ const unsigned char* vertexbase;
+ const unsigned char* indexbase;
int indexstride;
PHY_ScalarType type;
PHY_ScalarType gfxindextype;
- int stride,numverts,numtriangles;
+ int stride, numverts, numtriangles;
int gfxindex;
- // btVector3 triangle[3];
+ // btVector3 triangle[3];
- // btVector3 meshScaling = getScaling();
+ // btVector3 meshScaling = getScaling();
///if the number of parts is big, the performance might drop due to the innerloop switch on indextype
- for (part=0;part<graphicssubparts ;part++,memPtr++)
+ for (part = 0; part < graphicssubparts; part++, memPtr++)
{
- getLockedReadOnlyVertexIndexBase(&vertexbase,numverts,type,stride,&indexbase,indexstride,numtriangles,gfxindextype,part);
- memPtr->m_numTriangles = numtriangles;//indices = 3*numtriangles
+ getLockedReadOnlyVertexIndexBase(&vertexbase, numverts, type, stride, &indexbase, indexstride, numtriangles, gfxindextype, part);
+ memPtr->m_numTriangles = numtriangles; //indices = 3*numtriangles
memPtr->m_numVertices = numverts;
memPtr->m_indices16 = 0;
memPtr->m_indices32 = 0;
@@ -257,39 +250,38 @@ const char* btStridingMeshInterface::serialize(void* dataBuffer, btSerializer* s
memPtr->m_vertices3f = 0;
memPtr->m_vertices3d = 0;
-
switch (gfxindextype)
{
- case PHY_INTEGER:
+ case PHY_INTEGER:
{
- int numindices = numtriangles*3;
-
+ int numindices = numtriangles * 3;
+
if (numindices)
{
- btChunk* chunk = serializer->allocate(sizeof(btIntIndexData),numindices);
+ btChunk* chunk = serializer->allocate(sizeof(btIntIndexData), numindices);
btIntIndexData* tmpIndices = (btIntIndexData*)chunk->m_oldPtr;
memPtr->m_indices32 = (btIntIndexData*)serializer->getUniquePointer(tmpIndices);
- for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
+ for (gfxindex = 0; gfxindex < numtriangles; gfxindex++)
{
- unsigned int* tri_indices= (unsigned int*)(indexbase+gfxindex*indexstride);
- tmpIndices[gfxindex*3].m_value = tri_indices[0];
- tmpIndices[gfxindex*3+1].m_value = tri_indices[1];
- tmpIndices[gfxindex*3+2].m_value = tri_indices[2];
+ unsigned int* tri_indices = (unsigned int*)(indexbase + gfxindex * indexstride);
+ tmpIndices[gfxindex * 3].m_value = tri_indices[0];
+ tmpIndices[gfxindex * 3 + 1].m_value = tri_indices[1];
+ tmpIndices[gfxindex * 3 + 2].m_value = tri_indices[2];
}
- serializer->finalizeChunk(chunk,"btIntIndexData",BT_ARRAY_CODE,(void*)chunk->m_oldPtr);
+ serializer->finalizeChunk(chunk, "btIntIndexData", BT_ARRAY_CODE, (void*)chunk->m_oldPtr);
}
break;
}
- case PHY_SHORT:
+ case PHY_SHORT:
{
if (numtriangles)
{
- btChunk* chunk = serializer->allocate(sizeof(btShortIntIndexTripletData),numtriangles);
+ btChunk* chunk = serializer->allocate(sizeof(btShortIntIndexTripletData), numtriangles);
btShortIntIndexTripletData* tmpIndices = (btShortIntIndexTripletData*)chunk->m_oldPtr;
- memPtr->m_3indices16 = (btShortIntIndexTripletData*) serializer->getUniquePointer(tmpIndices);
- for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
+ memPtr->m_3indices16 = (btShortIntIndexTripletData*)serializer->getUniquePointer(tmpIndices);
+ for (gfxindex = 0; gfxindex < numtriangles; gfxindex++)
{
- unsigned short int* tri_indices= (unsigned short int*)(indexbase+gfxindex*indexstride);
+ unsigned short int* tri_indices = (unsigned short int*)(indexbase + gfxindex * indexstride);
tmpIndices[gfxindex].m_values[0] = tri_indices[0];
tmpIndices[gfxindex].m_values[1] = tri_indices[1];
tmpIndices[gfxindex].m_values[2] = tri_indices[2];
@@ -297,7 +289,7 @@ const char* btStridingMeshInterface::serialize(void* dataBuffer, btSerializer* s
tmpIndices[gfxindex].m_pad[0] = 0;
tmpIndices[gfxindex].m_pad[1] = 0;
}
- serializer->finalizeChunk(chunk,"btShortIntIndexTripletData",BT_ARRAY_CODE,(void*)chunk->m_oldPtr);
+ serializer->finalizeChunk(chunk, "btShortIntIndexTripletData", BT_ARRAY_CODE, (void*)chunk->m_oldPtr);
}
break;
}
@@ -305,23 +297,23 @@ const char* btStridingMeshInterface::serialize(void* dataBuffer, btSerializer* s
{
if (numtriangles)
{
- btChunk* chunk = serializer->allocate(sizeof(btCharIndexTripletData),numtriangles);
+ btChunk* chunk = serializer->allocate(sizeof(btCharIndexTripletData), numtriangles);
btCharIndexTripletData* tmpIndices = (btCharIndexTripletData*)chunk->m_oldPtr;
- memPtr->m_3indices8 = (btCharIndexTripletData*) serializer->getUniquePointer(tmpIndices);
- for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
+ memPtr->m_3indices8 = (btCharIndexTripletData*)serializer->getUniquePointer(tmpIndices);
+ for (gfxindex = 0; gfxindex < numtriangles; gfxindex++)
{
- unsigned char* tri_indices= (unsigned char*)(indexbase+gfxindex*indexstride);
+ unsigned char* tri_indices = (unsigned char*)(indexbase + gfxindex * indexstride);
tmpIndices[gfxindex].m_values[0] = tri_indices[0];
tmpIndices[gfxindex].m_values[1] = tri_indices[1];
tmpIndices[gfxindex].m_values[2] = tri_indices[2];
// Fill padding with zeros to appease msan.
tmpIndices[gfxindex].m_pad = 0;
}
- serializer->finalizeChunk(chunk,"btCharIndexTripletData",BT_ARRAY_CODE,(void*)chunk->m_oldPtr);
+ serializer->finalizeChunk(chunk, "btCharIndexTripletData", BT_ARRAY_CODE, (void*)chunk->m_oldPtr);
}
break;
}
- default:
+ default:
{
btAssert(0);
//unknown index type
@@ -330,54 +322,54 @@ const char* btStridingMeshInterface::serialize(void* dataBuffer, btSerializer* s
switch (type)
{
- case PHY_FLOAT:
- {
- float* graphicsbase;
-
- if (numverts)
- {
- btChunk* chunk = serializer->allocate(sizeof(btVector3FloatData),numverts);
- btVector3FloatData* tmpVertices = (btVector3FloatData*) chunk->m_oldPtr;
- memPtr->m_vertices3f = (btVector3FloatData *)serializer->getUniquePointer(tmpVertices);
- for (int i=0;i<numverts;i++)
- {
- graphicsbase = (float*)(vertexbase+i*stride);
- tmpVertices[i].m_floats[0] = graphicsbase[0];
- tmpVertices[i].m_floats[1] = graphicsbase[1];
- tmpVertices[i].m_floats[2] = graphicsbase[2];
- }
- serializer->finalizeChunk(chunk,"btVector3FloatData",BT_ARRAY_CODE,(void*)chunk->m_oldPtr);
- }
- break;
+ case PHY_FLOAT:
+ {
+ float* graphicsbase;
+
+ if (numverts)
+ {
+ btChunk* chunk = serializer->allocate(sizeof(btVector3FloatData), numverts);
+ btVector3FloatData* tmpVertices = (btVector3FloatData*)chunk->m_oldPtr;
+ memPtr->m_vertices3f = (btVector3FloatData*)serializer->getUniquePointer(tmpVertices);
+ for (int i = 0; i < numverts; i++)
+ {
+ graphicsbase = (float*)(vertexbase + i * stride);
+ tmpVertices[i].m_floats[0] = graphicsbase[0];
+ tmpVertices[i].m_floats[1] = graphicsbase[1];
+ tmpVertices[i].m_floats[2] = graphicsbase[2];
+ }
+ serializer->finalizeChunk(chunk, "btVector3FloatData", BT_ARRAY_CODE, (void*)chunk->m_oldPtr);
+ }
+ break;
}
- case PHY_DOUBLE:
+ case PHY_DOUBLE:
{
if (numverts)
{
- btChunk* chunk = serializer->allocate(sizeof(btVector3DoubleData),numverts);
- btVector3DoubleData* tmpVertices = (btVector3DoubleData*) chunk->m_oldPtr;
- memPtr->m_vertices3d = (btVector3DoubleData *) serializer->getUniquePointer(tmpVertices);
- for (int i=0;i<numverts;i++)
- {
- double* graphicsbase = (double*)(vertexbase+i*stride);//for now convert to float, might leave it at double
- tmpVertices[i].m_floats[0] = graphicsbase[0];
- tmpVertices[i].m_floats[1] = graphicsbase[1];
- tmpVertices[i].m_floats[2] = graphicsbase[2];
- }
- serializer->finalizeChunk(chunk,"btVector3DoubleData",BT_ARRAY_CODE,(void*)chunk->m_oldPtr);
+ btChunk* chunk = serializer->allocate(sizeof(btVector3DoubleData), numverts);
+ btVector3DoubleData* tmpVertices = (btVector3DoubleData*)chunk->m_oldPtr;
+ memPtr->m_vertices3d = (btVector3DoubleData*)serializer->getUniquePointer(tmpVertices);
+ for (int i = 0; i < numverts; i++)
+ {
+ double* graphicsbase = (double*)(vertexbase + i * stride); //for now convert to float, might leave it at double
+ tmpVertices[i].m_floats[0] = graphicsbase[0];
+ tmpVertices[i].m_floats[1] = graphicsbase[1];
+ tmpVertices[i].m_floats[2] = graphicsbase[2];
+ }
+ serializer->finalizeChunk(chunk, "btVector3DoubleData", BT_ARRAY_CODE, (void*)chunk->m_oldPtr);
}
break;
}
- default:
- btAssert((type == PHY_FLOAT) || (type == PHY_DOUBLE));
+ default:
+ btAssert((type == PHY_FLOAT) || (type == PHY_DOUBLE));
}
unLockReadOnlyVertexBase(part);
}
- serializer->finalizeChunk(chunk,"btMeshPartData",BT_ARRAY_CODE,chunk->m_oldPtr);
+ serializer->finalizeChunk(chunk, "btMeshPartData", BT_ARRAY_CODE, chunk->m_oldPtr);
}
// Fill padding with zeros to appease msan.
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btStridingMeshInterface.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btStridingMeshInterface.h
index 9fbe139768..7d729ee0d7 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btStridingMeshInterface.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btStridingMeshInterface.h
@@ -20,110 +20,102 @@ subject to the following restrictions:
#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
+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 seperate 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;
-
-
+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 seperate 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
+struct btIntIndexData
{
- int m_value;
+ int m_value;
};
-struct btShortIntIndexData
+struct btShortIntIndexData
{
short m_value;
char m_pad[2];
};
-struct btShortIntIndexTripletData
+struct btShortIntIndexTripletData
{
- short m_values[3];
- char m_pad[2];
+ short m_values[3];
+ char m_pad[2];
};
-struct btCharIndexTripletData
+struct btCharIndexTripletData
{
unsigned char m_values[3];
- char m_pad;
+ char m_pad;
};
+// clang-format off
///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
struct btMeshPartData
@@ -151,14 +143,11 @@ struct btStridingMeshInterfaceData
char m_padding[4];
};
+// clang-format on
-
-
-SIMD_FORCE_INLINE int btStridingMeshInterface::calculateSerializeBufferSize() const
+SIMD_FORCE_INLINE int btStridingMeshInterface::calculateSerializeBufferSize() const
{
return sizeof(btStridingMeshInterfaceData);
}
-
-
-#endif //BT_STRIDING_MESHINTERFACE_H
+#endif //BT_STRIDING_MESHINTERFACE_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btTetrahedronShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btTetrahedronShape.cpp
index 52f346bf72..c4d33c429f 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btTetrahedronShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btTetrahedronShape.cpp
@@ -16,29 +16,29 @@ subject to the following restrictions:
#include "btTetrahedronShape.h"
#include "LinearMath/btMatrix3x3.h"
-btBU_Simplex1to4::btBU_Simplex1to4() : btPolyhedralConvexAabbCachingShape (),
-m_numVertices(0)
+btBU_Simplex1to4::btBU_Simplex1to4() : btPolyhedralConvexAabbCachingShape(),
+ m_numVertices(0)
{
m_shapeType = TETRAHEDRAL_SHAPE_PROXYTYPE;
}
-btBU_Simplex1to4::btBU_Simplex1to4(const btVector3& pt0) : btPolyhedralConvexAabbCachingShape (),
-m_numVertices(0)
+btBU_Simplex1to4::btBU_Simplex1to4(const btVector3& pt0) : btPolyhedralConvexAabbCachingShape(),
+ m_numVertices(0)
{
m_shapeType = TETRAHEDRAL_SHAPE_PROXYTYPE;
addVertex(pt0);
}
-btBU_Simplex1to4::btBU_Simplex1to4(const btVector3& pt0,const btVector3& pt1) : btPolyhedralConvexAabbCachingShape (),
-m_numVertices(0)
+btBU_Simplex1to4::btBU_Simplex1to4(const btVector3& pt0, const btVector3& pt1) : btPolyhedralConvexAabbCachingShape(),
+ m_numVertices(0)
{
m_shapeType = TETRAHEDRAL_SHAPE_PROXYTYPE;
addVertex(pt0);
addVertex(pt1);
}
-btBU_Simplex1to4::btBU_Simplex1to4(const btVector3& pt0,const btVector3& pt1,const btVector3& pt2) : btPolyhedralConvexAabbCachingShape (),
-m_numVertices(0)
+btBU_Simplex1to4::btBU_Simplex1to4(const btVector3& pt0, const btVector3& pt1, const btVector3& pt2) : btPolyhedralConvexAabbCachingShape(),
+ m_numVertices(0)
{
m_shapeType = TETRAHEDRAL_SHAPE_PROXYTYPE;
addVertex(pt0);
@@ -46,8 +46,8 @@ m_numVertices(0)
addVertex(pt2);
}
-btBU_Simplex1to4::btBU_Simplex1to4(const btVector3& pt0,const btVector3& pt1,const btVector3& pt2,const btVector3& pt3) : btPolyhedralConvexAabbCachingShape (),
-m_numVertices(0)
+btBU_Simplex1to4::btBU_Simplex1to4(const btVector3& pt0, const btVector3& pt1, const btVector3& pt2, const btVector3& pt3) : btPolyhedralConvexAabbCachingShape(),
+ m_numVertices(0)
{
m_shapeType = TETRAHEDRAL_SHAPE_PROXYTYPE;
addVertex(pt0);
@@ -56,17 +56,16 @@ m_numVertices(0)
addVertex(pt3);
}
-
-void btBU_Simplex1to4::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
+void btBU_Simplex1to4::getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
{
#if 1
- btPolyhedralConvexAabbCachingShape::getAabb(t,aabbMin,aabbMax);
+ btPolyhedralConvexAabbCachingShape::getAabb(t, aabbMin, aabbMax);
#else
- aabbMin.setValue(BT_LARGE_FLOAT,BT_LARGE_FLOAT,BT_LARGE_FLOAT);
- aabbMax.setValue(-BT_LARGE_FLOAT,-BT_LARGE_FLOAT,-BT_LARGE_FLOAT);
+ aabbMin.setValue(BT_LARGE_FLOAT, BT_LARGE_FLOAT, BT_LARGE_FLOAT);
+ aabbMax.setValue(-BT_LARGE_FLOAT, -BT_LARGE_FLOAT, -BT_LARGE_FLOAT);
//just transform the vertices in worldspace, and take their AABB
- for (int i=0;i<m_numVertices;i++)
+ for (int i = 0; i < m_numVertices; i++)
{
btVector3 worldVertex = t(m_vertices[i]);
aabbMin.setMin(worldVertex);
@@ -75,18 +74,13 @@ void btBU_Simplex1to4::getAabb(const btTransform& t,btVector3& aabbMin,btVector3
#endif
}
-
-
-
-
void btBU_Simplex1to4::addVertex(const btVector3& pt)
{
m_vertices[m_numVertices++] = pt;
recalcLocalAabb();
}
-
-int btBU_Simplex1to4::getNumVertices() const
+int btBU_Simplex1to4::getNumVertices() const
{
return m_numVertices;
}
@@ -97,122 +91,113 @@ int btBU_Simplex1to4::getNumEdges() const
switch (m_numVertices)
{
- case 0:
- return 0;
- case 1: return 0;
- case 2: return 1;
- case 3: return 3;
- case 4: return 6;
-
-
+ case 0:
+ return 0;
+ case 1:
+ return 0;
+ case 2:
+ return 1;
+ case 3:
+ return 3;
+ case 4:
+ return 6;
}
return 0;
}
-void btBU_Simplex1to4::getEdge(int i,btVector3& pa,btVector3& pb) const
+void btBU_Simplex1to4::getEdge(int i, btVector3& pa, btVector3& pb) const
{
-
- switch (m_numVertices)
+ switch (m_numVertices)
{
-
- case 2:
- pa = m_vertices[0];
- pb = m_vertices[1];
- break;
- case 3:
- switch (i)
- {
- case 0:
- pa = m_vertices[0];
- pb = m_vertices[1];
- break;
- case 1:
- pa = m_vertices[1];
- pb = m_vertices[2];
- break;
case 2:
- pa = m_vertices[2];
- pb = m_vertices[0];
- break;
-
- }
- break;
- case 4:
- switch (i)
- {
- case 0:
pa = m_vertices[0];
pb = m_vertices[1];
break;
- case 1:
- pa = m_vertices[1];
- pb = m_vertices[2];
- break;
- case 2:
- pa = m_vertices[2];
- pb = m_vertices[0];
- break;
case 3:
- pa = m_vertices[0];
- pb = m_vertices[3];
+ switch (i)
+ {
+ case 0:
+ pa = m_vertices[0];
+ pb = m_vertices[1];
+ break;
+ case 1:
+ pa = m_vertices[1];
+ pb = m_vertices[2];
+ break;
+ case 2:
+ pa = m_vertices[2];
+ pb = m_vertices[0];
+ break;
+ }
break;
case 4:
- pa = m_vertices[1];
- pb = m_vertices[3];
- break;
- case 5:
- pa = m_vertices[2];
- pb = m_vertices[3];
- break;
- }
-
+ switch (i)
+ {
+ case 0:
+ pa = m_vertices[0];
+ pb = m_vertices[1];
+ break;
+ case 1:
+ pa = m_vertices[1];
+ pb = m_vertices[2];
+ break;
+ case 2:
+ pa = m_vertices[2];
+ pb = m_vertices[0];
+ break;
+ case 3:
+ pa = m_vertices[0];
+ pb = m_vertices[3];
+ break;
+ case 4:
+ pa = m_vertices[1];
+ pb = m_vertices[3];
+ break;
+ case 5:
+ pa = m_vertices[2];
+ pb = m_vertices[3];
+ break;
+ }
}
-
-
-
-
}
-void btBU_Simplex1to4::getVertex(int i,btVector3& vtx) const
+void btBU_Simplex1to4::getVertex(int i, btVector3& vtx) const
{
vtx = m_vertices[i];
}
-int btBU_Simplex1to4::getNumPlanes() const
+int btBU_Simplex1to4::getNumPlanes() const
{
switch (m_numVertices)
{
- case 0:
+ case 0:
return 0;
- case 1:
+ case 1:
return 0;
- case 2:
+ case 2:
return 0;
- case 3:
+ case 3:
return 2;
- case 4:
+ case 4:
return 4;
- default:
+ default:
{
}
}
return 0;
}
-
-void btBU_Simplex1to4::getPlane(btVector3&, btVector3& ,int ) const
+void btBU_Simplex1to4::getPlane(btVector3&, btVector3&, int) const
{
-
}
-int btBU_Simplex1to4::getIndex(int ) const
+int btBU_Simplex1to4::getIndex(int) const
{
return 0;
}
-bool btBU_Simplex1to4::isInside(const btVector3& ,btScalar ) const
+bool btBU_Simplex1to4::isInside(const btVector3&, btScalar) const
{
return false;
}
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btTetrahedronShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btTetrahedronShape.h
index b69209835e..f5e2209ed0 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btTetrahedronShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btTetrahedronShape.h
@@ -16,61 +16,56 @@ subject to the following restrictions:
#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
+ATTRIBUTE_ALIGNED16(class)
+btBU_Simplex1to4 : public btPolyhedralConvexAabbCachingShape
{
protected:
-
- int m_numVertices;
- btVector3 m_vertices[4];
+ 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);
+ 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()
+ void reset()
{
m_numVertices = 0;
}
-
- virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const;
+
+ virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const;
void addVertex(const btVector3& pt);
//PolyhedralConvexShape interface
- virtual int getNumVertices() const;
+ 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 void getEdge(int i, btVector3& pa, btVector3& pb) const;
- virtual int getNumPlanes() const;
+ virtual void getVertex(int i, btVector3& vtx) const;
- virtual void getPlane(btVector3& planeNormal,btVector3& planeSupport,int i) const;
+ virtual int getNumPlanes() const;
- virtual int getIndex(int i) const;
+ virtual void getPlane(btVector3 & planeNormal, btVector3 & planeSupport, int i) const;
- virtual bool isInside(const btVector3& pt,btScalar tolerance) 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";}
-
+ virtual const char* getName() const { return "btBU_Simplex1to4"; }
};
-#endif //BT_SIMPLEX_1TO4_SHAPE
+#endif //BT_SIMPLEX_1TO4_SHAPE
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleBuffer.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleBuffer.cpp
index 3027e65b25..3b6db2b39f 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleBuffer.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleBuffer.cpp
@@ -15,21 +15,14 @@ subject to the following restrictions:
#include "btTriangleBuffer.h"
-
-
-
-
-
-
-void btTriangleBuffer::processTriangle(btVector3* triangle,int partId,int triangleIndex)
+void btTriangleBuffer::processTriangle(btVector3* triangle, int partId, int triangleIndex)
{
- btTriangle tri;
- tri.m_vertex0 = triangle[0];
- tri.m_vertex1 = triangle[1];
- tri.m_vertex2 = triangle[2];
- tri.m_partId = partId;
- tri.m_triangleIndex = triangleIndex;
-
- m_triangleBuffer.push_back(tri);
+ btTriangle tri;
+ tri.m_vertex0 = triangle[0];
+ tri.m_vertex1 = triangle[1];
+ tri.m_vertex2 = triangle[2];
+ tri.m_partId = partId;
+ tri.m_triangleIndex = triangleIndex;
+
+ m_triangleBuffer.push_back(tri);
}
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleBuffer.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleBuffer.h
index b71fc8b374..a89b9cd8a4 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleBuffer.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleBuffer.h
@@ -19,13 +19,13 @@ subject to the following restrictions:
#include "btTriangleCallback.h"
#include "LinearMath/btAlignedObjectArray.h"
-struct btTriangle
+struct btTriangle
{
- btVector3 m_vertex0;
- btVector3 m_vertex1;
- btVector3 m_vertex2;
- int m_partId;
- int m_triangleIndex;
+ 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'
@@ -39,31 +39,25 @@ struct btTriangle
/// }
class btTriangleBuffer : public btTriangleCallback
{
+ btAlignedObjectArray<btTriangle> m_triangleBuffer;
- btAlignedObjectArray<btTriangle> m_triangleBuffer;
-
public:
-
-
virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex);
-
- int getNumTriangles() const
+
+ int getNumTriangles() const
{
return int(m_triangleBuffer.size());
}
-
- const btTriangle& getTriangle(int index) const
+
+ const btTriangle& getTriangle(int index) const
{
return m_triangleBuffer[index];
}
- void clearBuffer()
+ void clearBuffer()
{
m_triangleBuffer.clear();
}
-
};
-
-#endif //BT_TRIANGLE_BUFFER_H
-
+#endif //BT_TRIANGLE_BUFFER_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleCallback.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleCallback.cpp
index f558bf6d24..5bd2c595fe 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleCallback.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleCallback.cpp
@@ -17,12 +17,8 @@ subject to the following restrictions:
btTriangleCallback::~btTriangleCallback()
{
-
}
-
btInternalTriangleIndexCallback::~btInternalTriangleIndexCallback()
{
-
}
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleCallback.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleCallback.h
index 461c57f877..d3644891ee 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleCallback.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleCallback.h
@@ -18,13 +18,11 @@ subject to the following restrictions:
#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;
};
@@ -32,11 +30,8 @@ public:
class btInternalTriangleIndexCallback
{
public:
-
virtual ~btInternalTriangleIndexCallback();
- virtual void internalProcessTriangleIndex(btVector3* triangle,int partId,int triangleIndex) = 0;
+ virtual void internalProcessTriangleIndex(btVector3* triangle, int partId, int triangleIndex) = 0;
};
-
-
-#endif //BT_TRIANGLE_CALLBACK_H
+#endif //BT_TRIANGLE_CALLBACK_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp
index a665024cb6..dae4255194 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp
@@ -15,81 +15,76 @@ subject to the following restrictions:
#include "btTriangleIndexVertexArray.h"
-btTriangleIndexVertexArray::btTriangleIndexVertexArray(int numTriangles,int* triangleIndexBase,int triangleIndexStride,int numVertices,btScalar* vertexBase,int vertexStride)
-: m_hasAabb(0)
+btTriangleIndexVertexArray::btTriangleIndexVertexArray(int numTriangles, int* triangleIndexBase, int triangleIndexStride, int numVertices, btScalar* vertexBase, int vertexStride)
+ : m_hasAabb(0)
{
btIndexedMesh mesh;
mesh.m_numTriangles = numTriangles;
- mesh.m_triangleIndexBase = (const unsigned char *)triangleIndexBase;
+ mesh.m_triangleIndexBase = (const unsigned char*)triangleIndexBase;
mesh.m_triangleIndexStride = triangleIndexStride;
mesh.m_numVertices = numVertices;
- mesh.m_vertexBase = (const unsigned char *)vertexBase;
+ mesh.m_vertexBase = (const unsigned char*)vertexBase;
mesh.m_vertexStride = vertexStride;
addIndexedMesh(mesh);
-
}
btTriangleIndexVertexArray::~btTriangleIndexVertexArray()
{
-
}
-void btTriangleIndexVertexArray::getLockedVertexIndexBase(unsigned char **vertexbase, int& numverts,PHY_ScalarType& type, int& vertexStride,unsigned char **indexbase,int & indexstride,int& numfaces,PHY_ScalarType& indicestype,int subpart)
+void btTriangleIndexVertexArray::getLockedVertexIndexBase(unsigned char** vertexbase, int& numverts, PHY_ScalarType& type, int& vertexStride, unsigned char** indexbase, int& indexstride, int& numfaces, PHY_ScalarType& indicestype, int subpart)
{
- btAssert(subpart< getNumSubParts() );
+ btAssert(subpart < getNumSubParts());
btIndexedMesh& mesh = m_indexedMeshes[subpart];
numverts = mesh.m_numVertices;
- (*vertexbase) = (unsigned char *) mesh.m_vertexBase;
+ (*vertexbase) = (unsigned char*)mesh.m_vertexBase;
- type = mesh.m_vertexType;
+ type = mesh.m_vertexType;
vertexStride = mesh.m_vertexStride;
numfaces = mesh.m_numTriangles;
- (*indexbase) = (unsigned char *)mesh.m_triangleIndexBase;
+ (*indexbase) = (unsigned char*)mesh.m_triangleIndexBase;
indexstride = mesh.m_triangleIndexStride;
indicestype = mesh.m_indexType;
}
-void btTriangleIndexVertexArray::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) const
+void btTriangleIndexVertexArray::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) const
{
const btIndexedMesh& mesh = m_indexedMeshes[subpart];
numverts = mesh.m_numVertices;
- (*vertexbase) = (const unsigned char *)mesh.m_vertexBase;
+ (*vertexbase) = (const unsigned char*)mesh.m_vertexBase;
+
+ type = mesh.m_vertexType;
- type = mesh.m_vertexType;
-
vertexStride = mesh.m_vertexStride;
numfaces = mesh.m_numTriangles;
- (*indexbase) = (const unsigned char *)mesh.m_triangleIndexBase;
+ (*indexbase) = (const unsigned char*)mesh.m_triangleIndexBase;
indexstride = mesh.m_triangleIndexStride;
indicestype = mesh.m_indexType;
}
-bool btTriangleIndexVertexArray::hasPremadeAabb() const
+bool btTriangleIndexVertexArray::hasPremadeAabb() const
{
return (m_hasAabb == 1);
}
-
-void btTriangleIndexVertexArray::setPremadeAabb(const btVector3& aabbMin, const btVector3& aabbMax ) const
+void btTriangleIndexVertexArray::setPremadeAabb(const btVector3& aabbMin, const btVector3& aabbMax) const
{
m_aabbMin = aabbMin;
m_aabbMax = aabbMax;
- m_hasAabb = 1; // this is intentionally an int see notes in header
+ m_hasAabb = 1; // this is intentionally an int see notes in header
}
-void btTriangleIndexVertexArray::getPremadeAabb(btVector3* aabbMin, btVector3* aabbMax ) const
+void btTriangleIndexVertexArray::getPremadeAabb(btVector3* aabbMin, btVector3* aabbMax) const
{
*aabbMin = m_aabbMin;
*aabbMax = m_aabbMax;
}
-
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h
index b7a6f74361..8ebb22baae 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h
@@ -20,62 +20,59 @@ subject to the following restrictions:
#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
+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),
+ 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
- {
- }
-}
-;
-
+ m_vertexType(PHY_DOUBLE)
+#else // BT_USE_DOUBLE_PRECISION
+ m_vertexType(PHY_FLOAT)
+#endif // BT_USE_DOUBLE_PRECISION
+ {
+ }
+};
-typedef btAlignedObjectArray<btIndexedMesh> IndexedMeshArray;
+typedef btAlignedObjectArray<btIndexedMesh> 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
+ATTRIBUTE_ALIGNED16(class)
+btTriangleIndexVertexArray : public btStridingMeshInterface
{
protected:
- IndexedMeshArray m_indexedMeshes;
+ IndexedMeshArray m_indexedMeshes;
int m_pad[2];
- mutable int m_hasAabb; // using int instead of bool to maintain alignment
+ 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)
@@ -85,49 +82,47 @@ public:
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)
+ 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;
+ 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;
+ 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 unLockVertexBase(int subpart) { (void)subpart; }
- virtual void unLockReadOnlyVertexBase(int subpart) const {(void)subpart;}
+ virtual void unLockReadOnlyVertexBase(int subpart) const { (void)subpart; }
/// getNumSubParts returns the number of seperate subparts
/// each subpart has a continuous array of vertices and indices
- virtual int getNumSubParts() const {
+ virtual int getNumSubParts() const
+ {
return (int)m_indexedMeshes.size();
}
- IndexedMeshArray& getIndexedMeshArray()
+ IndexedMeshArray& getIndexedMeshArray()
{
return m_indexedMeshes;
}
- const IndexedMeshArray& getIndexedMeshArray() const
+ 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;
+ 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
+#endif //BT_TRIANGLE_INDEX_VERTEX_ARRAY_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.cpp
index dc562941ad..4bf133d7ac 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.cpp
@@ -17,70 +17,68 @@ subject to the following restrictions:
#include "btTriangleIndexVertexMaterialArray.h"
-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) :
-btTriangleIndexVertexArray(numTriangles, triangleIndexBase, triangleIndexStride, numVertices, vertexBase, vertexStride)
+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) : btTriangleIndexVertexArray(numTriangles, triangleIndexBase, triangleIndexStride, numVertices, vertexBase, vertexStride)
{
- btMaterialProperties mat;
+ btMaterialProperties mat;
- mat.m_numMaterials = numMaterials;
- mat.m_materialBase = materialBase;
- mat.m_materialStride = materialStride;
+ mat.m_numMaterials = numMaterials;
+ mat.m_materialBase = materialBase;
+ mat.m_materialStride = materialStride;
#ifdef BT_USE_DOUBLE_PRECISION
- mat.m_materialType = PHY_DOUBLE;
+ mat.m_materialType = PHY_DOUBLE;
#else
- mat.m_materialType = PHY_FLOAT;
+ mat.m_materialType = PHY_FLOAT;
#endif
- mat.m_numTriangles = numTriangles;
- mat.m_triangleMaterialsBase = (unsigned char *)triangleMaterialsBase;
- mat.m_triangleMaterialStride = materialIndexStride;
- mat.m_triangleType = PHY_INTEGER;
+ mat.m_numTriangles = numTriangles;
+ mat.m_triangleMaterialsBase = (unsigned char*)triangleMaterialsBase;
+ mat.m_triangleMaterialStride = materialIndexStride;
+ mat.m_triangleType = PHY_INTEGER;
- addMaterialProperties(mat);
+ addMaterialProperties(mat);
}
-
-void btTriangleIndexVertexMaterialArray::getLockedMaterialBase(unsigned char **materialBase, int& numMaterials, PHY_ScalarType& materialType, int& materialStride,
- unsigned char ** triangleMaterialBase, int& numTriangles, int& triangleMaterialStride, PHY_ScalarType& triangleType, int subpart)
+void btTriangleIndexVertexMaterialArray::getLockedMaterialBase(unsigned char** materialBase, int& numMaterials, PHY_ScalarType& materialType, int& materialStride,
+ unsigned char** triangleMaterialBase, int& numTriangles, int& triangleMaterialStride, PHY_ScalarType& triangleType, int subpart)
{
- btAssert(subpart< getNumSubParts() );
+ btAssert(subpart < getNumSubParts());
- btMaterialProperties& mats = m_materials[subpart];
+ btMaterialProperties& mats = m_materials[subpart];
- numMaterials = mats.m_numMaterials;
- (*materialBase) = (unsigned char *) mats.m_materialBase;
+ numMaterials = mats.m_numMaterials;
+ (*materialBase) = (unsigned char*)mats.m_materialBase;
#ifdef BT_USE_DOUBLE_PRECISION
- materialType = PHY_DOUBLE;
+ materialType = PHY_DOUBLE;
#else
- materialType = PHY_FLOAT;
+ materialType = PHY_FLOAT;
#endif
- materialStride = mats.m_materialStride;
+ materialStride = mats.m_materialStride;
- numTriangles = mats.m_numTriangles;
- (*triangleMaterialBase) = (unsigned char *)mats.m_triangleMaterialsBase;
- triangleMaterialStride = mats.m_triangleMaterialStride;
- triangleType = mats.m_triangleType;
+ numTriangles = mats.m_numTriangles;
+ (*triangleMaterialBase) = (unsigned char*)mats.m_triangleMaterialsBase;
+ triangleMaterialStride = mats.m_triangleMaterialStride;
+ triangleType = mats.m_triangleType;
}
-void btTriangleIndexVertexMaterialArray::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)
+void btTriangleIndexVertexMaterialArray::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)
{
- btMaterialProperties& mats = m_materials[subpart];
+ btMaterialProperties& mats = m_materials[subpart];
- numMaterials = mats.m_numMaterials;
- (*materialBase) = (const unsigned char *) mats.m_materialBase;
+ numMaterials = mats.m_numMaterials;
+ (*materialBase) = (const unsigned char*)mats.m_materialBase;
#ifdef BT_USE_DOUBLE_PRECISION
- materialType = PHY_DOUBLE;
+ materialType = PHY_DOUBLE;
#else
- materialType = PHY_FLOAT;
+ materialType = PHY_FLOAT;
#endif
- materialStride = mats.m_materialStride;
+ materialStride = mats.m_materialStride;
- numTriangles = mats.m_numTriangles;
- (*triangleMaterialBase) = (const unsigned char *)mats.m_triangleMaterialsBase;
- triangleMaterialStride = mats.m_triangleMaterialStride;
- triangleType = mats.m_triangleType;
+ numTriangles = mats.m_numTriangles;
+ (*triangleMaterialBase) = (const unsigned char*)mats.m_triangleMaterialsBase;
+ triangleMaterialStride = mats.m_triangleMaterialStride;
+ triangleType = mats.m_triangleType;
}
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.h
index ba4f7b4607..315b1e21f3 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.h
@@ -20,26 +20,26 @@ subject to the following restrictions:
#include "btTriangleIndexVertexArray.h"
-
-ATTRIBUTE_ALIGNED16( struct) btMaterialProperties
+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;
+ ///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<btMaterialProperties> MaterialArray;
+typedef btAlignedObjectArray<btMaterialProperties> MaterialArray;
///Teh btTriangleIndexVertexMaterialArray is built on TriangleIndexVertexArray
///The addition of a material array allows for the utilization of the partID and
@@ -47,38 +47,37 @@ typedef btAlignedObjectArray<btMaterialProperties> MaterialArray;
///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
+ATTRIBUTE_ALIGNED16(class)
+btTriangleIndexVertexMaterialArray : public btTriangleIndexVertexArray
{
protected:
- MaterialArray m_materials;
-
+ MaterialArray m_materials;
+
public:
BT_DECLARE_ALIGNED_ALLOCATOR();
- btTriangleIndexVertexMaterialArray()
+ 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() {}
+ btTriangleIndexVertexMaterialArray(int numTriangles, int* triangleIndexBase, int triangleIndexStride,
+ int numVertices, btScalar* vertexBase, int vertexStride,
+ int numMaterials, unsigned char* materialBase, int materialStride,
+ int* triangleMaterialsBase, int materialIndexStride);
- 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 ~btTriangleIndexVertexMaterialArray() {}
- 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);
+ 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 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);
+ 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
+#endif //BT_MULTIMATERIAL_TRIANGLE_INDEX_VERTEX_ARRAY_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleInfoMap.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleInfoMap.h
index 6427589590..8ee35ef5fa 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleInfoMap.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleInfoMap.h
@@ -16,11 +16,9 @@ subject to the following restrictions:
#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
@@ -30,61 +28,58 @@ subject to the following restrictions:
#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
+///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;
+ m_flags = 0;
}
- int m_flags;
-
- btScalar m_edgeV0V1Angle;
- btScalar m_edgeV1V2Angle;
- btScalar m_edgeV2V0Angle;
+ int m_flags;
+ btScalar m_edgeV0V1Angle;
+ btScalar m_edgeV1V2Angle;
+ btScalar m_edgeV2V0Angle;
};
-typedef btHashMap<btHashInt,btTriangleInfo> btInternalTriangleInfoMap;
-
+typedef btHashMap<btHashInt, btTriangleInfo> btInternalTriangleInfoMap;
///The btTriangleInfoMap stores edge angle information for some triangles. You can compute this information yourself or using btGenerateInternalEdgeInfo.
-struct btTriangleInfoMap : public btInternalTriangleInfoMap
+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)
-
-
+ 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_equalVertexThreshold = btScalar(0.0001) * btScalar(0.0001);
m_edgeDistanceThreshold = btScalar(0.1);
- m_zeroAreaThreshold = btScalar(0.0001)*btScalar(0.0001);
+ m_zeroAreaThreshold = btScalar(0.0001) * btScalar(0.0001);
m_maxEdgeAngleThreshold = SIMD_2_PI;
}
virtual ~btTriangleInfoMap() {}
- virtual int calculateSerializeBufferSize() 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;
-
- void deSerialize(struct btTriangleInfoMapData& data);
+ 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
{
@@ -114,86 +109,86 @@ struct btTriangleInfoMapData
char m_padding[4];
};
-SIMD_FORCE_INLINE int btTriangleInfoMap::calculateSerializeBufferSize() const
+// 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
+SIMD_FORCE_INLINE const char* btTriangleInfoMap::serialize(void* dataBuffer, btSerializer* serializer) const
{
- btTriangleInfoMapData* tmapData = (btTriangleInfoMapData*) dataBuffer;
+ btTriangleInfoMapData* tmapData = (btTriangleInfoMapData*)dataBuffer;
tmapData->m_convexEpsilon = (float)m_convexEpsilon;
tmapData->m_planarEpsilon = (float)m_planarEpsilon;
- tmapData->m_equalVertexThreshold =(float) m_equalVertexThreshold;
+ 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);
+ btChunk* chunk = serializer->allocate(sz, numElem);
int* memPtr = (int*)chunk->m_oldPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
*memPtr = m_hashTable[i];
}
- serializer->finalizeChunk(chunk,"int",BT_ARRAY_CODE,(void*)&m_hashTable[0]);
-
+ 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;
+ 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);
+ btChunk* chunk = serializer->allocate(sz, numElem);
int* memPtr = (int*)chunk->m_oldPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
*memPtr = m_next[i];
}
- serializer->finalizeChunk(chunk,"int",BT_ARRAY_CODE,(void*)&m_next[0]);
+ 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;
+ 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);
+ btChunk* chunk = serializer->allocate(sz, numElem);
btTriangleInfoData* memPtr = (btTriangleInfoData*)chunk->m_oldPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ 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]);
+ 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);
+ btChunk* chunk = serializer->allocate(sz, numElem);
int* memPtr = (int*)chunk->m_oldPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
*memPtr = m_keyArray[i].getUid1();
}
- serializer->finalizeChunk(chunk,"int",BT_ARRAY_CODE,(void*) &m_keyArray[0]);
-
+ serializer->finalizeChunk(chunk, "int", BT_ARRAY_CODE, (void*)&m_keyArray[0]);
}
// Fill padding with zeros to appease msan.
@@ -205,44 +200,39 @@ SIMD_FORCE_INLINE const char* btTriangleInfoMap::serialize(void* dataBuffer, btS
return "btTriangleInfoMapData";
}
-
-
///fills the dataBuffer and returns the struct name (and 0 on failure)
-SIMD_FORCE_INLINE void btTriangleInfoMap::deSerialize(btTriangleInfoMapData& tmapData )
+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++)
+ 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++)
+ 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++)
+ 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.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
+#endif //_BT_TRIANGLE_INFO_MAP_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleMesh.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleMesh.cpp
index e4de732093..abd8c22786 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleMesh.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleMesh.cpp
@@ -13,38 +13,36 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btTriangleMesh.h"
-
-
-btTriangleMesh::btTriangleMesh (bool use32bitIndices,bool use4componentVertices)
-:m_use32bitIndices(use32bitIndices),
-m_use4componentVertices(use4componentVertices),
-m_weldingThreshold(0.0)
+btTriangleMesh::btTriangleMesh(bool use32bitIndices, bool use4componentVertices)
+ : m_use32bitIndices(use32bitIndices),
+ m_use4componentVertices(use4componentVertices),
+ m_weldingThreshold(0.0)
{
btIndexedMesh meshIndex;
meshIndex.m_numTriangles = 0;
meshIndex.m_numVertices = 0;
meshIndex.m_indexType = PHY_INTEGER;
meshIndex.m_triangleIndexBase = 0;
- meshIndex.m_triangleIndexStride = 3*sizeof(int);
+ meshIndex.m_triangleIndexStride = 3 * sizeof(int);
meshIndex.m_vertexBase = 0;
meshIndex.m_vertexStride = sizeof(btVector3);
m_indexedMeshes.push_back(meshIndex);
if (m_use32bitIndices)
{
- m_indexedMeshes[0].m_numTriangles = m_32bitIndices.size()/3;
+ m_indexedMeshes[0].m_numTriangles = m_32bitIndices.size() / 3;
m_indexedMeshes[0].m_triangleIndexBase = 0;
m_indexedMeshes[0].m_indexType = PHY_INTEGER;
- m_indexedMeshes[0].m_triangleIndexStride = 3*sizeof(int);
- } else
+ m_indexedMeshes[0].m_triangleIndexStride = 3 * sizeof(int);
+ }
+ else
{
- m_indexedMeshes[0].m_numTriangles = m_16bitIndices.size()/3;
+ m_indexedMeshes[0].m_numTriangles = m_16bitIndices.size() / 3;
m_indexedMeshes[0].m_triangleIndexBase = 0;
m_indexedMeshes[0].m_indexType = PHY_SHORT;
- m_indexedMeshes[0].m_triangleIndexStride = 3*sizeof(short int);
+ m_indexedMeshes[0].m_triangleIndexStride = 3 * sizeof(short int);
}
if (m_use4componentVertices)
@@ -52,48 +50,48 @@ m_weldingThreshold(0.0)
m_indexedMeshes[0].m_numVertices = m_4componentVertices.size();
m_indexedMeshes[0].m_vertexBase = 0;
m_indexedMeshes[0].m_vertexStride = sizeof(btVector3);
- } else
+ }
+ else
{
- m_indexedMeshes[0].m_numVertices = m_3componentVertices.size()/3;
+ m_indexedMeshes[0].m_numVertices = m_3componentVertices.size() / 3;
m_indexedMeshes[0].m_vertexBase = 0;
- m_indexedMeshes[0].m_vertexStride = 3*sizeof(btScalar);
+ m_indexedMeshes[0].m_vertexStride = 3 * sizeof(btScalar);
}
-
-
}
-void btTriangleMesh::addIndex(int index)
+void btTriangleMesh::addIndex(int index)
{
if (m_use32bitIndices)
{
m_32bitIndices.push_back(index);
- m_indexedMeshes[0].m_triangleIndexBase = (unsigned char*) &m_32bitIndices[0];
- } else
+ m_indexedMeshes[0].m_triangleIndexBase = (unsigned char*)&m_32bitIndices[0];
+ }
+ else
{
m_16bitIndices.push_back(index);
- m_indexedMeshes[0].m_triangleIndexBase = (unsigned char*) &m_16bitIndices[0];
+ m_indexedMeshes[0].m_triangleIndexBase = (unsigned char*)&m_16bitIndices[0];
}
}
-void btTriangleMesh::addTriangleIndices(int index1, int index2, int index3 )
+void btTriangleMesh::addTriangleIndices(int index1, int index2, int index3)
{
m_indexedMeshes[0].m_numTriangles++;
- addIndex( index1 );
- addIndex( index2 );
- addIndex( index3 );
+ addIndex(index1);
+ addIndex(index2);
+ addIndex(index3);
}
-int btTriangleMesh::findOrAddVertex(const btVector3& vertex, bool removeDuplicateVertices)
+int btTriangleMesh::findOrAddVertex(const btVector3& vertex, bool removeDuplicateVertices)
{
//return index of new/existing vertex
///@todo: could use acceleration structure for this
if (m_use4componentVertices)
{
if (removeDuplicateVertices)
+ {
+ for (int i = 0; i < m_4componentVertices.size(); i++)
{
- for (int i=0;i< m_4componentVertices.size();i++)
- {
- if ((m_4componentVertices[i]-vertex).length2() <= m_weldingThreshold)
+ if ((m_4componentVertices[i] - vertex).length2() <= m_weldingThreshold)
{
return i;
}
@@ -103,19 +101,18 @@ int btTriangleMesh::findOrAddVertex(const btVector3& vertex, bool removeDuplicat
m_4componentVertices.push_back(vertex);
m_indexedMeshes[0].m_vertexBase = (unsigned char*)&m_4componentVertices[0];
- return m_4componentVertices.size()-1;
-
- } else
+ return m_4componentVertices.size() - 1;
+ }
+ else
{
-
if (removeDuplicateVertices)
{
- for (int i=0;i< m_3componentVertices.size();i+=3)
+ for (int i = 0; i < m_3componentVertices.size(); i += 3)
{
- btVector3 vtx(m_3componentVertices[i],m_3componentVertices[i+1],m_3componentVertices[i+2]);
- if ((vtx-vertex).length2() <= m_weldingThreshold)
+ btVector3 vtx(m_3componentVertices[i], m_3componentVertices[i + 1], m_3componentVertices[i + 2]);
+ if ((vtx - vertex).length2() <= m_weldingThreshold)
{
- return i/3;
+ return i / 3;
}
}
}
@@ -124,17 +121,16 @@ int btTriangleMesh::findOrAddVertex(const btVector3& vertex, bool removeDuplicat
m_3componentVertices.push_back(vertex.getZ());
m_indexedMeshes[0].m_numVertices++;
m_indexedMeshes[0].m_vertexBase = (unsigned char*)&m_3componentVertices[0];
- return (m_3componentVertices.size()/3)-1;
+ return (m_3componentVertices.size() / 3) - 1;
}
-
}
-
-void btTriangleMesh::addTriangle(const btVector3& vertex0,const btVector3& vertex1,const btVector3& vertex2,bool removeDuplicateVertices)
+
+void btTriangleMesh::addTriangle(const btVector3& vertex0, const btVector3& vertex1, const btVector3& vertex2, bool removeDuplicateVertices)
{
m_indexedMeshes[0].m_numTriangles++;
- addIndex(findOrAddVertex(vertex0,removeDuplicateVertices));
- addIndex(findOrAddVertex(vertex1,removeDuplicateVertices));
- addIndex(findOrAddVertex(vertex2,removeDuplicateVertices));
+ addIndex(findOrAddVertex(vertex0, removeDuplicateVertices));
+ addIndex(findOrAddVertex(vertex1, removeDuplicateVertices));
+ addIndex(findOrAddVertex(vertex2, removeDuplicateVertices));
}
int btTriangleMesh::getNumTriangles() const
@@ -151,7 +147,8 @@ void btTriangleMesh::preallocateVertices(int numverts)
if (m_use4componentVertices)
{
m_4componentVertices.reserve(numverts);
- } else
+ }
+ else
{
m_3componentVertices.reserve(numverts);
}
@@ -162,7 +159,8 @@ void btTriangleMesh::preallocateIndices(int numindices)
if (m_use32bitIndices)
{
m_32bitIndices.reserve(numindices);
- } else
+ }
+ else
{
m_16bitIndices.reserve(numindices);
}
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleMesh.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleMesh.h
index ac4afa7f6b..a8a362355c 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleMesh.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleMesh.h
@@ -26,47 +26,44 @@ subject to the following restrictions:
///Performance of btTriangleMesh and btTriangleIndexVertexArray used in a btBvhTriangleMeshShape is the same.
class btTriangleMesh : public btTriangleIndexVertexArray
{
- btAlignedObjectArray<btVector3> m_4componentVertices;
- btAlignedObjectArray<btScalar> m_3componentVertices;
+ btAlignedObjectArray<btVector3> m_4componentVertices;
+ btAlignedObjectArray<btScalar> m_3componentVertices;
- btAlignedObjectArray<unsigned int> m_32bitIndices;
- btAlignedObjectArray<unsigned short int> m_16bitIndices;
- bool m_use32bitIndices;
- bool m_use4componentVertices;
-
+ btAlignedObjectArray<unsigned int> m_32bitIndices;
+ btAlignedObjectArray<unsigned short int> m_16bitIndices;
+ bool m_use32bitIndices;
+ bool m_use4componentVertices;
- public:
- btScalar m_weldingThreshold;
+public:
+ btScalar m_weldingThreshold;
- btTriangleMesh (bool use32bitIndices=true,bool use4componentVertices=true);
+ btTriangleMesh(bool use32bitIndices = true, bool use4componentVertices = true);
- bool getUse32bitIndices() const
- {
- return m_use32bitIndices;
- }
+ 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);
+ 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;
+ ///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);
- virtual void preallocateVertices(int numverts);
- virtual void preallocateIndices(int numindices);
+ int getNumTriangles() const;
- ///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);
-
-};
+ virtual void preallocateVertices(int numverts);
+ virtual void preallocateIndices(int numindices);
-#endif //BT_TRIANGLE_MESH_H
+ ///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/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp
index 0e17951405..aec239063c 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp
@@ -20,12 +20,11 @@ subject to the following restrictions:
#include "LinearMath/btAabbUtil2.h"
#include "BulletCollision/CollisionShapes/btCollisionMargin.h"
-
btTriangleMeshShape::btTriangleMeshShape(btStridingMeshInterface* meshInterface)
-: btConcaveShape (), m_meshInterface(meshInterface)
+ : btConcaveShape(), m_meshInterface(meshInterface)
{
m_shapeType = TRIANGLE_MESH_SHAPE_PROXYTYPE;
- if(meshInterface->hasPremadeAabb())
+ if (meshInterface->hasPremadeAabb())
{
meshInterface->getPremadeAabb(&m_localAabbMin, &m_localAabbMax);
}
@@ -35,69 +34,60 @@ btTriangleMeshShape::btTriangleMeshShape(btStridingMeshInterface* meshInterface)
}
}
-
btTriangleMeshShape::~btTriangleMeshShape()
{
-
}
-
-
-
-void btTriangleMeshShape::getAabb(const btTransform& trans,btVector3& aabbMin,btVector3& aabbMax) const
+void btTriangleMeshShape::getAabb(const btTransform& trans, btVector3& aabbMin, btVector3& aabbMax) const
{
+ btVector3 localHalfExtents = btScalar(0.5) * (m_localAabbMax - m_localAabbMin);
+ localHalfExtents += btVector3(getMargin(), getMargin(), getMargin());
+ btVector3 localCenter = btScalar(0.5) * (m_localAabbMax + m_localAabbMin);
- btVector3 localHalfExtents = btScalar(0.5)*(m_localAabbMax-m_localAabbMin);
- localHalfExtents += btVector3(getMargin(),getMargin(),getMargin());
- btVector3 localCenter = btScalar(0.5)*(m_localAabbMax+m_localAabbMin);
-
- btMatrix3x3 abs_b = trans.getBasis().absolute();
+ btMatrix3x3 abs_b = trans.getBasis().absolute();
btVector3 center = trans(localCenter);
- btVector3 extent = localHalfExtents.dot3(abs_b[0], abs_b[1], abs_b[2]);
+ btVector3 extent = localHalfExtents.dot3(abs_b[0], abs_b[1], abs_b[2]);
aabbMin = center - extent;
aabbMax = center + extent;
}
-void btTriangleMeshShape::recalcLocalAabb()
+void btTriangleMeshShape::recalcLocalAabb()
{
- for (int i=0;i<3;i++)
+ for (int i = 0; i < 3; i++)
{
- btVector3 vec(btScalar(0.),btScalar(0.),btScalar(0.));
+ btVector3 vec(btScalar(0.), btScalar(0.), btScalar(0.));
vec[i] = btScalar(1.);
btVector3 tmp = localGetSupportingVertex(vec);
- m_localAabbMax[i] = tmp[i]+m_collisionMargin;
+ m_localAabbMax[i] = tmp[i] + m_collisionMargin;
vec[i] = btScalar(-1.);
tmp = localGetSupportingVertex(vec);
- m_localAabbMin[i] = tmp[i]-m_collisionMargin;
+ m_localAabbMin[i] = tmp[i] - m_collisionMargin;
}
}
-
-
class SupportVertexCallback : public btTriangleCallback
{
-
btVector3 m_supportVertexLocal;
-public:
- btTransform m_worldTrans;
+public:
+ btTransform m_worldTrans;
btScalar m_maxDot;
btVector3 m_supportVecLocal;
- SupportVertexCallback(const btVector3& supportVecWorld,const btTransform& trans)
- : m_supportVertexLocal(btScalar(0.),btScalar(0.),btScalar(0.)), m_worldTrans(trans) ,m_maxDot(btScalar(-BT_LARGE_FLOAT))
-
+ SupportVertexCallback(const btVector3& supportVecWorld, const btTransform& trans)
+ : m_supportVertexLocal(btScalar(0.), btScalar(0.), btScalar(0.)), m_worldTrans(trans), m_maxDot(btScalar(-BT_LARGE_FLOAT))
+
{
m_supportVecLocal = supportVecWorld * m_worldTrans.getBasis();
}
- virtual void processTriangle( btVector3* triangle,int partId, int triangleIndex)
+ virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex)
{
(void)partId;
(void)triangleIndex;
- for (int i=0;i<3;i++)
+ for (int i = 0; i < 3; i++)
{
btScalar dot = m_supportVecLocal.dot(triangle[i]);
if (dot > m_maxDot)
@@ -113,14 +103,12 @@ public:
return m_worldTrans(m_supportVertexLocal);
}
- btVector3 GetSupportVertexLocal()
+ btVector3 GetSupportVertexLocal()
{
return m_supportVertexLocal;
}
-
};
-
void btTriangleMeshShape::setLocalScaling(const btVector3& scaling)
{
m_meshInterface->setScaling(scaling);
@@ -132,60 +120,46 @@ const btVector3& btTriangleMeshShape::getLocalScaling() const
return m_meshInterface->getScaling();
}
-
-
-
-
-
//#define DEBUG_TRIANGLE_MESH
-
-
-void btTriangleMeshShape::processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const
+void btTriangleMeshShape::processAllTriangles(btTriangleCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax) const
{
- struct FilteredCallback : public btInternalTriangleIndexCallback
+ struct FilteredCallback : public btInternalTriangleIndexCallback
{
btTriangleCallback* m_callback;
btVector3 m_aabbMin;
btVector3 m_aabbMax;
- FilteredCallback(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax)
- :m_callback(callback),
- m_aabbMin(aabbMin),
- m_aabbMax(aabbMax)
+ FilteredCallback(btTriangleCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax)
+ : m_callback(callback),
+ m_aabbMin(aabbMin),
+ m_aabbMax(aabbMax)
{
}
- virtual void internalProcessTriangleIndex(btVector3* triangle,int partId,int triangleIndex)
+ virtual void internalProcessTriangleIndex(btVector3* triangle, int partId, int triangleIndex)
{
- if (TestTriangleAgainstAabb2(&triangle[0],m_aabbMin,m_aabbMax))
+ if (TestTriangleAgainstAabb2(&triangle[0], m_aabbMin, m_aabbMax))
{
//check aabb in triangle-space, before doing this
- m_callback->processTriangle(triangle,partId,triangleIndex);
+ m_callback->processTriangle(triangle, partId, triangleIndex);
}
-
}
-
};
- FilteredCallback filterCallback(callback,aabbMin,aabbMax);
+ FilteredCallback filterCallback(callback, aabbMin, aabbMax);
- m_meshInterface->InternalProcessAllTriangles(&filterCallback,aabbMin,aabbMax);
+ m_meshInterface->InternalProcessAllTriangles(&filterCallback, aabbMin, aabbMax);
}
-
-
-
-
-void btTriangleMeshShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const
+void btTriangleMeshShape::calculateLocalInertia(btScalar mass, btVector3& inertia) const
{
(void)mass;
//moving concave objects not supported
btAssert(0);
- inertia.setValue(btScalar(0.),btScalar(0.),btScalar(0.));
+ inertia.setValue(btScalar(0.), btScalar(0.), btScalar(0.));
}
-
btVector3 btTriangleMeshShape::localGetSupportingVertex(const btVector3& vec) const
{
btVector3 supportVertex;
@@ -193,15 +167,13 @@ btVector3 btTriangleMeshShape::localGetSupportingVertex(const btVector3& vec) co
btTransform ident;
ident.setIdentity();
- SupportVertexCallback supportCallback(vec,ident);
+ SupportVertexCallback supportCallback(vec, ident);
+
+ btVector3 aabbMax(btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT));
+
+ processAllTriangles(&supportCallback, -aabbMax, aabbMax);
- btVector3 aabbMax(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
-
- processAllTriangles(&supportCallback,-aabbMax,aabbMax);
-
supportVertex = supportCallback.GetSupportVertexLocal();
return supportVertex;
}
-
-
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleMeshShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleMeshShape.h
index 453e58005a..4a70e283fa 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleMeshShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleMeshShape.h
@@ -19,18 +19,18 @@ subject to the following restrictions:
#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
+ATTRIBUTE_ALIGNED16(class)
+btTriangleMeshShape : public btConcaveShape
{
protected:
- btVector3 m_localAabbMin;
- btVector3 m_localAabbMax;
+ 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);
+ btTriangleMeshShape(btStridingMeshInterface * meshInterface);
public:
BT_DECLARE_ALIGNED_ALLOCATOR();
@@ -39,23 +39,23 @@ public:
virtual btVector3 localGetSupportingVertex(const btVector3& vec) const;
- virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const
+ virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const
{
btAssert(0);
return localGetSupportingVertex(vec);
}
- void recalcLocalAabb();
+ void recalcLocalAabb();
- virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const;
+ 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 processAllTriangles(btTriangleCallback * callback, const btVector3& aabbMin, const btVector3& aabbMax) const;
- virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
+ virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const;
- virtual void setLocalScaling(const btVector3& scaling);
+ virtual void setLocalScaling(const btVector3& scaling);
virtual const btVector3& getLocalScaling() const;
-
+
btStridingMeshInterface* getMeshInterface()
{
return m_meshInterface;
@@ -75,16 +75,8 @@ public:
return m_localAabbMax;
}
-
-
//debugging
- virtual const char* getName()const {return "TRIANGLEMESH";}
-
-
-
+ virtual const char* getName() const { return "TRIANGLEMESH"; }
};
-
-
-
-#endif //BT_TRIANGLE_MESH_SHAPE_H
+#endif //BT_TRIANGLE_MESH_SHAPE_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleShape.h
index a8a80f82fe..190cbdae69 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btTriangleShape.h
@@ -19,15 +19,13 @@ subject to the following restrictions:
#include "btConvexShape.h"
#include "btBoxShape.h"
-ATTRIBUTE_ALIGNED16(class) btTriangleShape : public btPolyhedralConvexShape
+ATTRIBUTE_ALIGNED16(class)
+btTriangleShape : public btPolyhedralConvexShape
{
-
-
public:
+ BT_DECLARE_ALIGNED_ALLOCATOR();
-BT_DECLARE_ALIGNED_ALLOCATOR();
-
- btVector3 m_vertices1[3];
+ btVector3 m_vertices1[3];
virtual int getNumVertices() const
{
@@ -43,7 +41,7 @@ BT_DECLARE_ALIGNED_ALLOCATOR();
{
return m_vertices1[index];
}
- virtual void getVertex(int index,btVector3& vert) const
+ virtual void getVertex(int index, btVector3& vert) const
{
vert = m_vertices1[index];
}
@@ -52,83 +50,79 @@ BT_DECLARE_ALIGNED_ALLOCATOR();
{
return 3;
}
-
- virtual void getEdge(int i,btVector3& pa,btVector3& pb) const
+
+ virtual void getEdge(int i, btVector3& pa, btVector3& pb) const
{
- getVertex(i,pa);
- getVertex((i+1)%3,pb);
+ getVertex(i, pa);
+ getVertex((i + 1) % 3, pb);
}
-
- virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax)const
+ virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
{
-// btAssert(0);
- getAabbSlow(t,aabbMin,aabbMax);
+ // btAssert(0);
+ getAabbSlow(t, aabbMin, aabbMax);
}
- btVector3 localGetSupportingVertexWithoutMargin(const btVector3& dir)const
+ btVector3 localGetSupportingVertexWithoutMargin(const btVector3& dir) const
{
- btVector3 dots = dir.dot3(m_vertices1[0], m_vertices1[1], m_vertices1[2]);
- return m_vertices1[dots.maxAxis()];
-
+ 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
+ virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const
{
- for (int i=0;i<numVectors;i++)
+ 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()];
+ btVector3 dots = dir.dot3(m_vertices1[0], m_vertices1[1], m_vertices1[2]);
+ supportVerticesOut[i] = m_vertices1[dots.maxAxis()];
}
-
}
- btTriangleShape() : btPolyhedralConvexShape ()
- {
+ btTriangleShape() : btPolyhedralConvexShape()
+ {
m_shapeType = TRIANGLE_SHAPE_PROXYTYPE;
}
- btTriangleShape(const btVector3& p0,const btVector3& p1,const btVector3& p2) : btPolyhedralConvexShape ()
- {
+ 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;
- }
-
+ m_vertices1[0] = p0;
+ m_vertices1[1] = p1;
+ m_vertices1[2] = p2;
+ }
- virtual void getPlane(btVector3& planeNormal,btVector3& planeSupport,int i) const
+ virtual void getPlane(btVector3 & planeNormal, btVector3 & planeSupport, int i) const
{
- getPlaneEquation(i,planeNormal,planeSupport);
+ getPlaneEquation(i, planeNormal, planeSupport);
}
- virtual int getNumPlanes() const
+ virtual int getNumPlanes() const
{
return 1;
}
- void calcNormal(btVector3& normal) const
+ void calcNormal(btVector3 & normal) const
{
- normal = (m_vertices1[1]-m_vertices1[0]).cross(m_vertices1[2]-m_vertices1[0]);
+ 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
+ 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
+ virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const
{
(void)mass;
btAssert(0);
- inertia.setValue(btScalar(0.),btScalar(0.),btScalar(0.));
+ inertia.setValue(btScalar(0.), btScalar(0.), btScalar(0.));
}
- virtual bool isInside(const btVector3& pt,btScalar tolerance) const
+ virtual bool isInside(const btVector3& pt, btScalar tolerance) const
{
btVector3 normal;
calcNormal(normal);
@@ -140,45 +134,42 @@ BT_DECLARE_ALIGNED_ALLOCATOR();
{
//inside check on edge-planes
int i;
- for (i=0;i<3;i++)
+ for (i = 0; i < 3; i++)
{
- btVector3 pa,pb;
- getEdge(i,pa,pb);
- btVector3 edge = pb-pa;
+ btVector3 pa, pb;
+ getEdge(i, pa, pb);
+ btVector3 edge = pb - pa;
btVector3 edgeNormal = edge.cross(normal);
edgeNormal.normalize();
- btScalar dist = pt.dot( edgeNormal);
+ 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.);
- }
+ //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
-
+#endif //BT_OBB_TRIANGLE_MINKOWSKI_H
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btUniformScalingShape.cpp b/thirdparty/bullet/BulletCollision/CollisionShapes/btUniformScalingShape.cpp
index b148bbd99a..ed3cd2d259 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btUniformScalingShape.cpp
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btUniformScalingShape.cpp
@@ -15,122 +15,112 @@ subject to the following restrictions:
#include "btUniformScalingShape.h"
-btUniformScalingShape::btUniformScalingShape( btConvexShape* convexChildShape,btScalar uniformScalingFactor):
-btConvexShape (), m_childConvexShape(convexChildShape),
-m_uniformScalingFactor(uniformScalingFactor)
+btUniformScalingShape::btUniformScalingShape(btConvexShape* convexChildShape, btScalar uniformScalingFactor) : btConvexShape(), m_childConvexShape(convexChildShape), m_uniformScalingFactor(uniformScalingFactor)
{
m_shapeType = UNIFORM_SCALING_SHAPE_PROXYTYPE;
}
-
+
btUniformScalingShape::~btUniformScalingShape()
{
}
-
-btVector3 btUniformScalingShape::localGetSupportingVertexWithoutMargin(const btVector3& vec)const
+btVector3 btUniformScalingShape::localGetSupportingVertexWithoutMargin(const btVector3& vec) const
{
btVector3 tmpVertex;
tmpVertex = m_childConvexShape->localGetSupportingVertexWithoutMargin(vec);
- return tmpVertex*m_uniformScalingFactor;
+ return tmpVertex * m_uniformScalingFactor;
}
-void btUniformScalingShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const
+void btUniformScalingShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const
{
- m_childConvexShape->batchedUnitVectorGetSupportingVertexWithoutMargin(vectors,supportVerticesOut,numVectors);
+ m_childConvexShape->batchedUnitVectorGetSupportingVertexWithoutMargin(vectors, supportVerticesOut, numVectors);
int i;
- for (i=0;i<numVectors;i++)
+ for (i = 0; i < numVectors; i++)
{
supportVerticesOut[i] = supportVerticesOut[i] * m_uniformScalingFactor;
}
}
-
-btVector3 btUniformScalingShape::localGetSupportingVertex(const btVector3& vec)const
+btVector3 btUniformScalingShape::localGetSupportingVertex(const btVector3& vec) const
{
btVector3 tmpVertex;
tmpVertex = m_childConvexShape->localGetSupportingVertex(vec);
- return tmpVertex*m_uniformScalingFactor;
+ return tmpVertex * m_uniformScalingFactor;
}
-
-void btUniformScalingShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const
+void btUniformScalingShape::calculateLocalInertia(btScalar mass, btVector3& inertia) const
{
-
///this linear upscaling is not realistic, but we don't deal with large mass ratios...
btVector3 tmpInertia;
- m_childConvexShape->calculateLocalInertia(mass,tmpInertia);
+ m_childConvexShape->calculateLocalInertia(mass, tmpInertia);
inertia = tmpInertia * m_uniformScalingFactor;
}
-
- ///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version
-void btUniformScalingShape::getAabb(const btTransform& trans,btVector3& aabbMin,btVector3& aabbMax) const
+///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version
+void btUniformScalingShape::getAabb(const btTransform& trans, btVector3& aabbMin, btVector3& aabbMax) const
{
- getAabbSlow(trans,aabbMin,aabbMax);
-
+ getAabbSlow(trans, aabbMin, aabbMax);
}
-void btUniformScalingShape::getAabbSlow(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
+void btUniformScalingShape::getAabbSlow(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
{
#if 1
btVector3 _directions[] =
- {
- btVector3( 1., 0., 0.),
- btVector3( 0., 1., 0.),
- btVector3( 0., 0., 1.),
- btVector3( -1., 0., 0.),
- btVector3( 0., -1., 0.),
- btVector3( 0., 0., -1.)
- };
-
+ {
+ btVector3(1., 0., 0.),
+ btVector3(0., 1., 0.),
+ btVector3(0., 0., 1.),
+ btVector3(-1., 0., 0.),
+ btVector3(0., -1., 0.),
+ btVector3(0., 0., -1.)};
+
btVector3 _supporting[] =
+ {
+ btVector3(0., 0., 0.),
+ btVector3(0., 0., 0.),
+ btVector3(0., 0., 0.),
+ btVector3(0., 0., 0.),
+ btVector3(0., 0., 0.),
+ btVector3(0., 0., 0.)};
+
+ for (int i = 0; i < 6; i++)
{
- btVector3( 0., 0., 0.),
- btVector3( 0., 0., 0.),
- btVector3( 0., 0., 0.),
- btVector3( 0., 0., 0.),
- btVector3( 0., 0., 0.),
- btVector3( 0., 0., 0.)
- };
-
- for (int i=0;i<6;i++)
- {
- _directions[i] = _directions[i]*t.getBasis();
+ _directions[i] = _directions[i] * t.getBasis();
}
-
+
batchedUnitVectorGetSupportingVertexWithoutMargin(_directions, _supporting, 6);
-
- btVector3 aabbMin1(0,0,0),aabbMax1(0,0,0);
- for ( int i = 0; i < 3; ++i )
+ btVector3 aabbMin1(0, 0, 0), aabbMax1(0, 0, 0);
+
+ for (int i = 0; i < 3; ++i)
{
aabbMax1[i] = t(_supporting[i])[i];
aabbMin1[i] = t(_supporting[i + 3])[i];
}
- btVector3 marginVec(getMargin(),getMargin(),getMargin());
- aabbMin = aabbMin1-marginVec;
- aabbMax = aabbMax1+marginVec;
-
+ btVector3 marginVec(getMargin(), getMargin(), getMargin());
+ aabbMin = aabbMin1 - marginVec;
+ aabbMax = aabbMax1 + marginVec;
+
#else
btScalar margin = getMargin();
- for (int i=0;i<3;i++)
+ for (int i = 0; i < 3; i++)
{
- btVector3 vec(btScalar(0.),btScalar(0.),btScalar(0.));
+ btVector3 vec(btScalar(0.), btScalar(0.), btScalar(0.));
vec[i] = btScalar(1.);
- btVector3 sv = localGetSupportingVertex(vec*t.getBasis());
+ btVector3 sv = localGetSupportingVertex(vec * t.getBasis());
btVector3 tmp = t(sv);
- aabbMax[i] = tmp[i]+margin;
+ aabbMax[i] = tmp[i] + margin;
vec[i] = btScalar(-1.);
- sv = localGetSupportingVertex(vec*t.getBasis());
+ sv = localGetSupportingVertex(vec * t.getBasis());
tmp = t(sv);
- aabbMin[i] = tmp[i]-margin;
+ aabbMin[i] = tmp[i] - margin;
}
#endif
}
-void btUniformScalingShape::setLocalScaling(const btVector3& scaling)
+void btUniformScalingShape::setLocalScaling(const btVector3& scaling)
{
m_childConvexShape->setLocalScaling(scaling);
}
@@ -140,21 +130,21 @@ const btVector3& btUniformScalingShape::getLocalScaling() const
return m_childConvexShape->getLocalScaling();
}
-void btUniformScalingShape::setMargin(btScalar margin)
+void btUniformScalingShape::setMargin(btScalar margin)
{
m_childConvexShape->setMargin(margin);
}
-btScalar btUniformScalingShape::getMargin() const
+btScalar btUniformScalingShape::getMargin() const
{
return m_childConvexShape->getMargin() * m_uniformScalingFactor;
}
-int btUniformScalingShape::getNumPreferredPenetrationDirections() const
+int btUniformScalingShape::getNumPreferredPenetrationDirections() const
{
return m_childConvexShape->getNumPreferredPenetrationDirections();
}
-
-void btUniformScalingShape::getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const
+
+void btUniformScalingShape::getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const
{
- m_childConvexShape->getPreferredPenetrationDirection(index,penetrationVector);
+ m_childConvexShape->getPreferredPenetrationDirection(index, penetrationVector);
}
diff --git a/thirdparty/bullet/BulletCollision/CollisionShapes/btUniformScalingShape.h b/thirdparty/bullet/BulletCollision/CollisionShapes/btUniformScalingShape.h
index a10f58d242..4dfe34efbd 100644
--- a/thirdparty/bullet/BulletCollision/CollisionShapes/btUniformScalingShape.h
+++ b/thirdparty/bullet/BulletCollision/CollisionShapes/btUniformScalingShape.h
@@ -17,73 +17,68 @@ subject to the following restrictions:
#define BT_UNIFORM_SCALING_SHAPE_H
#include "btConvexShape.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
+#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
+ATTRIBUTE_ALIGNED16(class)
+btUniformScalingShape : public btConvexShape
{
- btConvexShape* m_childConvexShape;
+ btConvexShape* m_childConvexShape;
- btScalar m_uniformScalingFactor;
-
- public:
-
+ btScalar m_uniformScalingFactor;
+
+public:
BT_DECLARE_ALIGNED_ALLOCATOR();
-
- btUniformScalingShape( btConvexShape* convexChildShape, btScalar uniformScalingFactor);
-
+
+ btUniformScalingShape(btConvexShape * convexChildShape, btScalar uniformScalingFactor);
+
virtual ~btUniformScalingShape();
-
- virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const;
- virtual btVector3 localGetSupportingVertex(const btVector3& vec)const;
+ 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 batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const;
- virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
+ virtual void calculateLocalInertia(btScalar mass, btVector3 & inertia) const;
- btScalar getUniformScalingFactor() const
+ btScalar getUniformScalingFactor() const
{
return m_uniformScalingFactor;
}
- btConvexShape* getChildShape()
+ btConvexShape* getChildShape()
{
return m_childConvexShape;
}
- const btConvexShape* getChildShape() const
+ const btConvexShape* getChildShape() const
{
return m_childConvexShape;
}
- virtual const char* getName()const
+ 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;
+ void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const;
- virtual void setLocalScaling(const btVector3& scaling) ;
- virtual const btVector3& getLocalScaling() const ;
+ virtual void getAabbSlow(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const;
- virtual void setMargin(btScalar margin);
- virtual btScalar getMargin() const;
+ virtual void setLocalScaling(const btVector3& scaling);
+ virtual const btVector3& getLocalScaling() const;
- virtual int getNumPreferredPenetrationDirections() const;
-
- virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) 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
+#endif //BT_UNIFORM_SCALING_SHAPE_H
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/btBoxCollision.h b/thirdparty/bullet/BulletCollision/Gimpact/btBoxCollision.h
index 0a0357e5a8..182835c3b4 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/btBoxCollision.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/btBoxCollision.h
@@ -26,27 +26,21 @@ subject to the following restrictions:
#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))
-
-
+#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
{
@@ -115,152 +109,144 @@ enum eBT_PLANE_INTERSECTION_TYPE
// 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_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_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_Z_AXIS_MCR(edge,absolute_edge,pointa,pointb,_extend)\
-{\
- TEST_CROSS_EDGE_BOX_MCR(edge,absolute_edge,pointa,pointb,_extend,1,0,0,1);\
-}\
+#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)
+ const btMatrix3x3 &mat, const btVector3 &vec3, int colindex)
{
- return vec3[0]*mat[0][colindex] + vec3[1]*mat[1][colindex] + vec3[2]*mat[2][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
+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
+ 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;
+ // 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();
- for(i=0;i<3;i++)
- {
- for(j=0;j<3;j++ )
- {
- m_AR[i][j] = 1e-6f + btFabs(m_R1to0[i][j]);
- }
- }
+ 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)
+ 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)
+ 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_T1to0 += m_R1to0 * trans1.getOrigin();
m_R1to0 *= trans1.getBasis();
calc_absolute_matrix();
}
- SIMD_FORCE_INLINE btVector3 transform(const btVector3 & point) const
+ SIMD_FORCE_INLINE btVector3 transform(const btVector3 &point) const
{
- return point.dot3( m_R1to0[0], m_R1to0[1], m_R1to0[2] ) + m_T1to0;
+ 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
+ATTRIBUTE_ALIGNED16(class)
+btAABB
{
public:
btVector3 m_min;
btVector3 m_max;
btAABB()
- {}
-
+ {
+ }
- btAABB(const btVector3 & V1,
- const btVector3 & V2,
- const btVector3 & V3)
+ 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_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_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)
+ 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_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_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;
@@ -270,13 +256,11 @@ public:
m_max[2] += margin;
}
- btAABB(const btAABB &other):
- m_min(other.m_min),m_max(other.m_max)
+ 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)
+ btAABB(const btAABB &other, btScalar margin) : m_min(other.m_min), m_max(other.m_max)
{
m_min[0] -= margin;
m_min[1] -= margin;
@@ -317,34 +301,34 @@ public:
m_max[2] = other.m_max[2] + margin;
}
- template<typename CLASS_POINT>
+ template <typename CLASS_POINT>
SIMD_FORCE_INLINE void calc_from_triangle(
- const CLASS_POINT & V1,
- const CLASS_POINT & V2,
- const CLASS_POINT & V3)
+ 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_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_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<typename CLASS_POINT>
+ template <typename CLASS_POINT>
SIMD_FORCE_INLINE void calc_from_triangle_margin(
- const CLASS_POINT & V1,
- const CLASS_POINT & V2,
- const CLASS_POINT & V3, btScalar 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_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_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;
@@ -355,91 +339,89 @@ public:
}
//! Apply a transform to an AABB
- SIMD_FORCE_INLINE void appy_transform(const btTransform & trans)
+ SIMD_FORCE_INLINE void appy_transform(const btTransform &trans)
{
- btVector3 center = (m_max+m_min)*0.5f;
+ 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());
+ 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)
+ SIMD_FORCE_INLINE void appy_transform_trans_cache(const BT_BOX_BOX_TRANSFORM_CACHE &trans)
{
- btVector3 center = (m_max+m_min)*0.5f;
+ 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());
-
+ 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)
+ 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_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]);
+ 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<typename CLASS_POINT>
- SIMD_FORCE_INLINE void merge_point(const CLASS_POINT & point)
+ template <typename CLASS_POINT>
+ 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_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]);
+ 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
+ SIMD_FORCE_INLINE void get_center_extend(btVector3 & center, btVector3 & extend) const
{
- center = (m_max+m_min)*0.5f;
+ 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
+ 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_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]);
+ 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
+ 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])
+ 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;
}
@@ -451,35 +433,34 @@ public:
\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
+ SIMD_FORCE_INLINE bool collide_ray(const btVector3 &vorigin, const btVector3 &vdir) const
{
- btVector3 extents,center;
- this->get_center_extend(center,extents);;
+ 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;
+ 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;
+ 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;
-
+ 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;
+ 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;
+ 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;
+ 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
+ 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;
+ btVector3 center = (m_max + m_min) * 0.5f;
+ btVector3 extend = m_max - center;
- btScalar _fOrigin = direction.dot(center);
+ btScalar _fOrigin = direction.dot(center);
btScalar _fMaximumExtent = extend.dot(direction.absolute());
vmin = _fOrigin - _fMaximumExtent;
vmax = _fOrigin + _fMaximumExtent;
@@ -487,30 +468,30 @@ public:
SIMD_FORCE_INLINE eBT_PLANE_INTERSECTION_TYPE plane_classify(const btVector4 &plane) const
{
- btScalar _fmin,_fmax;
- this->projection_interval(plane,_fmin,_fmax);
+ btScalar _fmin, _fmax;
+ this->projection_interval(plane, _fmin, _fmax);
- if(plane[3] > _fmax + BOX_PLANE_EPSILON)
+ if (plane[3] > _fmax + BOX_PLANE_EPSILON)
{
- return BT_CONST_BACK_PLANE; // 0
+ return BT_CONST_BACK_PLANE; // 0
}
- if(plane[3]+BOX_PLANE_EPSILON >=_fmin)
+ if (plane[3] + BOX_PLANE_EPSILON >= _fmin)
{
- return BT_CONST_COLLIDE_PLANE; //1
+ return BT_CONST_COLLIDE_PLANE; //1
}
- return BT_CONST_FRONT_PLANE;//2
+ return BT_CONST_FRONT_PLANE; //2
}
- SIMD_FORCE_INLINE bool overlapping_trans_conservative(const btAABB & box, btTransform & trans1_to_0) const
+ 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
+ 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);
@@ -519,52 +500,50 @@ public:
//! 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
+ 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 ea, eb; //extends
+ btVector3 ca, cb; //extends
+ get_center_extend(ca, ea);
+ box.get_center_extend(cb, eb);
btVector3 T;
- btScalar t,t2;
+ btScalar t, t2;
int i;
// Class I : A's basis vectors
- for(i=0;i<3;i++)
+ for (i = 0; i < 3; i++)
{
- T[i] = transcache.m_R1to0[i].dot(cb) + transcache.m_T1to0[i] - ca[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;
+ if (BT_GREATER(T[i], t)) return false;
}
// Class II : B's basis vectors
- for(i=0;i<3;i++)
+ 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;
+ 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)
+ if (fulltest)
{
- int j,m,n,o,p,q,r;
- for(i=0;i<3;i++)
+ 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++)
+ 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;
+ 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;
}
}
}
@@ -573,7 +552,7 @@ public:
//! Simple test for planes.
SIMD_FORCE_INLINE bool collide_plane(
- const btVector4 & plane) const
+ const btVector4 &plane) const
{
eBT_PLANE_INTERSECTION_TYPE classify = plane_classify(plane);
return (classify == BT_CONST_COLLIDE_PLANE);
@@ -581,15 +560,15 @@ public:
//! 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
+ const btVector3 &p1,
+ const btVector3 &p2,
+ const btVector3 &p3,
+ const btVector4 &triangle_plane) const
{
- if(!collide_plane(triangle_plane)) return false;
+ if (!collide_plane(triangle_plane)) return false;
- btVector3 center,extends;
- this->get_center_extend(center,extends);
+ btVector3 center, extends;
+ this->get_center_extend(center, extends);
const btVector3 v1(p1 - center);
const btVector3 v2(p2 - center);
@@ -599,47 +578,43 @@ public:
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_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_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);
-
+ 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_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_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);
+ 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_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_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);
+ 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)
+SIMD_FORCE_INLINE bool btCompareTransformsEqual(const btTransform &t1, const btTransform &t2)
{
- if(!(t1.getOrigin() == t2.getOrigin()) ) return false;
+ 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;
+ 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
+#endif // GIM_BOX_COLLISION_H_INCLUDED
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/btClipPolygon.h b/thirdparty/bullet/BulletCollision/Gimpact/btClipPolygon.h
index de0a5231ba..38c23e222d 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/btClipPolygon.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/btClipPolygon.h
@@ -27,77 +27,74 @@ subject to the following restrictions:
#include "LinearMath/btTransform.h"
#include "LinearMath/btGeometryUtil.h"
-
-SIMD_FORCE_INLINE btScalar bt_distance_point_plane(const btVector4 & plane,const btVector3 &point)
+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)
+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;
+ 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)
+ 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)
+ 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);
+ btScalar blendfactor = -dist0 / (dist1 - dist0);
+ bt_vec_blend(clipped[clipped_count], point0, point1, blendfactor);
clipped_count++;
}
- if(!_classif)
+ 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)
+ const btVector4 &plane,
+ const btVector3 *polygon_points,
+ int polygon_point_count,
+ btVector3 *clipped)
{
- int clipped_count = 0;
-
+ int clipped_count = 0;
- //clip first point
- btScalar firstdist = bt_distance_point_plane(plane,polygon_points[0]);;
- if(!(firstdist>SIMD_EPSILON))
+ //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++)
+ for (int i = 1; i < polygon_point_count; i++)
{
- btScalar dist = bt_distance_point_plane(plane,polygon_points[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);
-
+ polygon_points[i - 1], polygon_points[i],
+ olddist,
+ dist,
+ clipped,
+ clipped_count);
olddist = dist;
}
@@ -105,11 +102,11 @@ SIMD_FORCE_INLINE int bt_plane_clip_polygon(
//RETURN TO FIRST point
bt_plane_clip_polygon_collect(
- polygon_points[polygon_point_count-1],polygon_points[0],
- olddist,
- firstdist,
- clipped,
- clipped_count);
+ polygon_points[polygon_point_count - 1], polygon_points[0],
+ olddist,
+ firstdist,
+ clipped,
+ clipped_count);
return clipped_count;
}
@@ -120,18 +117,19 @@ SIMD_FORCE_INLINE int bt_plane_clip_polygon(
*\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
- )
+ 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;
+ int clipped_count = 0;
- //clip first point0
- btScalar firstdist = bt_distance_point_plane(plane,point0);;
- if(!(firstdist>SIMD_EPSILON))
+ //clip first point0
+ btScalar firstdist = bt_distance_point_plane(plane, point0);
+ ;
+ if (!(firstdist > SIMD_EPSILON))
{
clipped[clipped_count] = point0;
clipped_count++;
@@ -139,44 +137,37 @@ SIMD_FORCE_INLINE int bt_plane_clip_triangle(
// point 1
btScalar olddist = firstdist;
- btScalar dist = bt_distance_point_plane(plane,point1);
+ btScalar dist = bt_distance_point_plane(plane, point1);
bt_plane_clip_polygon_collect(
- point0,point1,
- olddist,
- dist,
- clipped,
- clipped_count);
+ point0, point1,
+ olddist,
+ dist,
+ clipped,
+ clipped_count);
olddist = dist;
-
// point 2
- dist = bt_distance_point_plane(plane,point2);
+ dist = bt_distance_point_plane(plane, point2);
bt_plane_clip_polygon_collect(
- point1,point2,
- olddist,
- dist,
- clipped,
- clipped_count);
+ 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);
+ point2, point0,
+ olddist,
+ firstdist,
+ clipped,
+ clipped_count);
return clipped_count;
}
-
-
-
-
-#endif // GIM_TRI_COLLISION_H_INCLUDED
+#endif // GIM_TRI_COLLISION_H_INCLUDED
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/btCompoundFromGimpact.h b/thirdparty/bullet/BulletCollision/Gimpact/btCompoundFromGimpact.h
index 19f7ecddd0..ede59e8a57 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/btCompoundFromGimpact.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/btCompoundFromGimpact.h
@@ -5,7 +5,8 @@
#include "btGImpactShape.h"
#include "BulletCollision/NarrowPhaseCollision/btRaycastCallback.h"
-ATTRIBUTE_ALIGNED16(class) btCompoundFromGimpactShape : public btCompoundShape
+ATTRIBUTE_ALIGNED16(class)
+btCompoundFromGimpactShape : public btCompoundShape
{
public:
BT_DECLARE_ALIGNED_ALLOCATOR();
@@ -18,92 +19,87 @@ public:
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)
{
- 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
+ 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)
{
- 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)
+ 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
+
+ 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/thirdparty/bullet/BulletCollision/Gimpact/btContactProcessing.cpp b/thirdparty/bullet/BulletCollision/Gimpact/btContactProcessing.cpp
index eed31d839f..f2e3e18d61 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/btContactProcessing.cpp
+++ b/thirdparty/bullet/BulletCollision/Gimpact/btContactProcessing.cpp
@@ -27,54 +27,50 @@ struct CONTACT_KEY_TOKEN
unsigned int m_key;
int m_value;
CONTACT_KEY_TOKEN()
- {
- }
-
- CONTACT_KEY_TOKEN(unsigned int key,int token)
- {
- m_key = key;
- m_value = token;
- }
-
- CONTACT_KEY_TOKEN(const CONTACT_KEY_TOKEN& rtoken)
- {
- m_key = rtoken.m_key;
- m_value = rtoken.m_value;
- }
-
- inline bool operator <(const CONTACT_KEY_TOKEN& other) const
+ {
+ }
+
+ CONTACT_KEY_TOKEN(unsigned int key, int token)
+ {
+ m_key = key;
+ m_value = token;
+ }
+
+ CONTACT_KEY_TOKEN(const CONTACT_KEY_TOKEN& rtoken)
+ {
+ m_key = rtoken.m_key;
+ m_value = rtoken.m_value;
+ }
+
+ inline bool operator<(const CONTACT_KEY_TOKEN& other) const
{
return (m_key < other.m_key);
}
- inline bool operator >(const CONTACT_KEY_TOKEN& other) const
+ inline bool operator>(const CONTACT_KEY_TOKEN& other) const
{
return (m_key > other.m_key);
}
-
};
class CONTACT_KEY_TOKEN_COMP
{
- public:
-
- bool operator() ( const CONTACT_KEY_TOKEN& a, const CONTACT_KEY_TOKEN& b ) const
- {
- return ( a < b );
- }
+public:
+ bool operator()(const CONTACT_KEY_TOKEN& a, const CONTACT_KEY_TOKEN& b) const
+ {
+ return (a < b);
+ }
};
-
void btContactArray::merge_contacts(
- const btContactArray & contacts, bool normal_contact_average)
+ const btContactArray& contacts, bool normal_contact_average)
{
clear();
int i;
- if(contacts.size()==0) return;
-
+ if (contacts.size() == 0) return;
- if(contacts.size()==1)
+ if (contacts.size() == 1)
{
push_back(contacts[0]);
return;
@@ -86,16 +82,16 @@ void btContactArray::merge_contacts(
//fill key contacts
- for ( i = 0;i<contacts.size() ;i++ )
+ for (i = 0; i < contacts.size(); i++)
{
- keycontacts.push_back(CONTACT_KEY_TOKEN(contacts[i].calc_key_contact(),i));
+ keycontacts.push_back(CONTACT_KEY_TOKEN(contacts[i].calc_key_contact(), i));
}
//sort keys
keycontacts.quickSort(CONTACT_KEY_TOKEN_COMP());
// Merge contacts
- int coincident_count=0;
+ int coincident_count = 0;
btVector3 coincident_normals[MAX_COINCIDENT];
unsigned int last_key = keycontacts[0].m_key;
@@ -103,56 +99,56 @@ void btContactArray::merge_contacts(
push_back(contacts[keycontacts[0].m_value]);
- GIM_CONTACT * pcontact = &(*this)[0];
+ GIM_CONTACT* pcontact = &(*this)[0];
- for( i=1;i<keycontacts.size();i++)
+ for (i = 1; i < keycontacts.size(); i++)
{
- key = keycontacts[i].m_key;
- const GIM_CONTACT * scontact = &contacts[keycontacts[i].m_value];
+ key = keycontacts[i].m_key;
+ const GIM_CONTACT* scontact = &contacts[keycontacts[i].m_value];
- if(last_key == key)//same points
+ if (last_key == key) //same points
{
//merge contact
- if(pcontact->m_depth - CONTACT_DIFF_EPSILON > scontact->m_depth)//)
+ if (pcontact->m_depth - CONTACT_DIFF_EPSILON > scontact->m_depth) //)
{
*pcontact = *scontact;
- coincident_count = 0;
+ coincident_count = 0;
}
- else if(normal_contact_average)
+ else if (normal_contact_average)
{
- if(btFabs(pcontact->m_depth - scontact->m_depth)<CONTACT_DIFF_EPSILON)
- {
- if(coincident_count<MAX_COINCIDENT)
- {
- coincident_normals[coincident_count] = scontact->m_normal;
- coincident_count++;
- }
- }
+ if (btFabs(pcontact->m_depth - scontact->m_depth) < CONTACT_DIFF_EPSILON)
+ {
+ if (coincident_count < MAX_COINCIDENT)
+ {
+ coincident_normals[coincident_count] = scontact->m_normal;
+ coincident_count++;
+ }
+ }
}
}
else
- {//add new contact
+ { //add new contact
- if(normal_contact_average && coincident_count>0)
- {
- pcontact->interpolate_normals(coincident_normals,coincident_count);
- coincident_count = 0;
- }
+ if (normal_contact_average && coincident_count > 0)
+ {
+ pcontact->interpolate_normals(coincident_normals, coincident_count);
+ coincident_count = 0;
+ }
- push_back(*scontact);
- pcontact = &(*this)[this->size()-1];
- }
+ push_back(*scontact);
+ pcontact = &(*this)[this->size() - 1];
+ }
last_key = key;
}
}
-void btContactArray::merge_contacts_unique(const btContactArray & contacts)
+void btContactArray::merge_contacts_unique(const btContactArray& contacts)
{
clear();
- if(contacts.size()==0) return;
+ if (contacts.size() == 0) return;
- if(contacts.size()==1)
+ if (contacts.size() == 1)
{
push_back(contacts[0]);
return;
@@ -160,14 +156,14 @@ void btContactArray::merge_contacts_unique(const btContactArray & contacts)
GIM_CONTACT average_contact = contacts[0];
- for (int i=1;i<contacts.size() ;i++ )
+ for (int i = 1; i < contacts.size(); i++)
{
average_contact.m_point += contacts[i].m_point;
average_contact.m_normal += contacts[i].m_normal * contacts[i].m_depth;
}
//divide
- btScalar divide_average = 1.0f/((btScalar)contacts.size());
+ btScalar divide_average = 1.0f / ((btScalar)contacts.size());
average_contact.m_point *= divide_average;
@@ -176,6 +172,4 @@ void btContactArray::merge_contacts_unique(const btContactArray & contacts)
average_contact.m_depth = average_contact.m_normal.length();
average_contact.m_normal /= average_contact.m_depth;
-
}
-
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/btContactProcessing.h b/thirdparty/bullet/BulletCollision/Gimpact/btContactProcessing.h
index d1027dbe67..4ff09d7cdd 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/btContactProcessing.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/btContactProcessing.h
@@ -29,7 +29,7 @@ subject to the following restrictions:
#include "btTriangleShapeEx.h"
#include "btContactProcessingStructs.h"
-class btContactArray:public btAlignedObjectArray<GIM_CONTACT>
+class btContactArray : public btAlignedObjectArray<GIM_CONTACT>
{
public:
btContactArray()
@@ -38,28 +38,28 @@ public:
}
SIMD_FORCE_INLINE void push_contact(
- const btVector3 &point,const btVector3 & normal,
+ const btVector3 &point, const btVector3 &normal,
btScalar depth, int feature1, int feature2)
{
- push_back( GIM_CONTACT(point,normal,depth,feature1,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)
+ const GIM_TRIANGLE_CONTACT &tricontact,
+ int feature1, int feature2)
{
- for(int i = 0;i<tricontact.m_point_count ;i++ )
+ 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);
+ tricontact.m_penetration_depth, feature1, feature2);
}
}
- void merge_contacts(const btContactArray & contacts, bool normal_contact_average = true);
+ void merge_contacts(const btContactArray &contacts, bool normal_contact_average = true);
- void merge_contacts_unique(const btContactArray & contacts);
+ void merge_contacts_unique(const btContactArray &contacts);
};
-#endif // GIM_CONTACT_H_INCLUDED
+#endif // GIM_CONTACT_H_INCLUDED
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/btContactProcessingStructs.h b/thirdparty/bullet/BulletCollision/Gimpact/btContactProcessingStructs.h
index efbc4a567a..bc8a709246 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/btContactProcessingStructs.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/btContactProcessingStructs.h
@@ -28,7 +28,6 @@ subject to the following restrictions:
#include "LinearMath/btAlignedObjectArray.h"
#include "btTriangleShapeEx.h"
-
/**
Configuration var for applying interpolation of contact normals
*/
@@ -41,69 +40,66 @@ Configuration var for applying interpolation of contact normals
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
+ 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)
- {
- }
+ 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;
+ 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;
+ _hash += (*_uitmp) << 4;
_uitmp++;
- _hash += (*_uitmp)<<8;
+ _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++)
+ 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;
+ 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);
- }
-
+ m_normal = vec_sum / btSqrt(vec_sum_len);
+ }
};
-#endif // BT_CONTACT_H_STRUCTS_INCLUDED
+#endif // BT_CONTACT_H_STRUCTS_INCLUDED
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/btGImpactBvh.cpp b/thirdparty/bullet/BulletCollision/Gimpact/btGImpactBvh.cpp
index 863233163a..bb520e061d 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/btGImpactBvh.cpp
+++ b/thirdparty/bullet/BulletCollision/Gimpact/btGImpactBvh.cpp
@@ -30,7 +30,6 @@ btClock g_tree_clock;
float g_accum_tree_collision_time = 0;
int g_count_traversing = 0;
-
void bt_begin_gim02_tree_time()
{
g_tree_clock.reset();
@@ -45,7 +44,7 @@ void bt_end_gim02_tree_time()
//! Gets the average time in miliseconds of tree collisions
float btGImpactBvh::getAverageTreeCollisionTime()
{
- if(g_count_traversing == 0) return 0;
+ if (g_count_traversing == 0) return 0;
float avgtime = g_accum_tree_collision_time;
avgtime /= (float)g_count_traversing;
@@ -54,80 +53,76 @@ float btGImpactBvh::getAverageTreeCollisionTime()
g_count_traversing = 0;
return avgtime;
-// float avgtime = g_count_traversing;
-// g_count_traversing = 0;
-// return avgtime;
-
+ // float avgtime = g_count_traversing;
+ // g_count_traversing = 0;
+ // return avgtime;
}
-#endif //TRI_COLLISION_PROFILING
+#endif //TRI_COLLISION_PROFILING
/////////////////////// btBvhTree /////////////////////////////////
int btBvhTree::_calc_splitting_axis(
- GIM_BVH_DATA_ARRAY & primitive_boxes, int startIndex, int endIndex)
+ GIM_BVH_DATA_ARRAY& primitive_boxes, int startIndex, int endIndex)
{
-
int i;
- btVector3 means(btScalar(0.),btScalar(0.),btScalar(0.));
- btVector3 variance(btScalar(0.),btScalar(0.),btScalar(0.));
- int numIndices = endIndex-startIndex;
+ btVector3 means(btScalar(0.), btScalar(0.), btScalar(0.));
+ btVector3 variance(btScalar(0.), btScalar(0.), btScalar(0.));
+ int numIndices = endIndex - startIndex;
- for (i=startIndex;i<endIndex;i++)
+ for (i = startIndex; i < endIndex; i++)
{
- btVector3 center = btScalar(0.5)*(primitive_boxes[i].m_bound.m_max +
- primitive_boxes[i].m_bound.m_min);
- means+=center;
+ btVector3 center = btScalar(0.5) * (primitive_boxes[i].m_bound.m_max +
+ primitive_boxes[i].m_bound.m_min);
+ means += center;
}
- means *= (btScalar(1.)/(btScalar)numIndices);
+ means *= (btScalar(1.) / (btScalar)numIndices);
- for (i=startIndex;i<endIndex;i++)
+ for (i = startIndex; i < endIndex; i++)
{
- btVector3 center = btScalar(0.5)*(primitive_boxes[i].m_bound.m_max +
- primitive_boxes[i].m_bound.m_min);
- btVector3 diff2 = center-means;
+ btVector3 center = btScalar(0.5) * (primitive_boxes[i].m_bound.m_max +
+ primitive_boxes[i].m_bound.m_min);
+ btVector3 diff2 = center - means;
diff2 = diff2 * diff2;
variance += diff2;
}
- variance *= (btScalar(1.)/ ((btScalar)numIndices-1) );
+ variance *= (btScalar(1.) / ((btScalar)numIndices - 1));
return variance.maxAxis();
}
-
int btBvhTree::_sort_and_calc_splitting_index(
- GIM_BVH_DATA_ARRAY & primitive_boxes, int startIndex,
+ GIM_BVH_DATA_ARRAY& primitive_boxes, int startIndex,
int endIndex, int splitAxis)
{
int i;
- int splitIndex =startIndex;
+ int splitIndex = startIndex;
int numIndices = endIndex - startIndex;
// average of centers
btScalar splitValue = 0.0f;
- btVector3 means(btScalar(0.),btScalar(0.),btScalar(0.));
- for (i=startIndex;i<endIndex;i++)
+ btVector3 means(btScalar(0.), btScalar(0.), btScalar(0.));
+ for (i = startIndex; i < endIndex; i++)
{
- btVector3 center = btScalar(0.5)*(primitive_boxes[i].m_bound.m_max +
- primitive_boxes[i].m_bound.m_min);
- means+=center;
+ btVector3 center = btScalar(0.5) * (primitive_boxes[i].m_bound.m_max +
+ primitive_boxes[i].m_bound.m_min);
+ means += center;
}
- means *= (btScalar(1.)/(btScalar)numIndices);
+ means *= (btScalar(1.) / (btScalar)numIndices);
splitValue = means[splitAxis];
-
//sort leafNodes so all values larger then splitValue comes first, and smaller values start from 'splitIndex'.
- for (i=startIndex;i<endIndex;i++)
+ for (i = startIndex; i < endIndex; i++)
{
- btVector3 center = btScalar(0.5)*(primitive_boxes[i].m_bound.m_max +
- primitive_boxes[i].m_bound.m_min);
+ btVector3 center = btScalar(0.5) * (primitive_boxes[i].m_bound.m_max +
+ primitive_boxes[i].m_bound.m_min);
if (center[splitAxis] > splitValue)
{
//swap
- primitive_boxes.swap(i,splitIndex);
+ primitive_boxes.swap(i, splitIndex);
//swapLeafNodes(i,splitIndex);
splitIndex++;
}
@@ -142,32 +137,30 @@ int btBvhTree::_sort_and_calc_splitting_index(
//bool unbalanced2 = true;
//this should be safe too:
- int rangeBalancedIndices = numIndices/3;
- bool unbalanced = ((splitIndex<=(startIndex+rangeBalancedIndices)) || (splitIndex >=(endIndex-1-rangeBalancedIndices)));
+ int rangeBalancedIndices = numIndices / 3;
+ bool unbalanced = ((splitIndex <= (startIndex + rangeBalancedIndices)) || (splitIndex >= (endIndex - 1 - rangeBalancedIndices)));
if (unbalanced)
{
- splitIndex = startIndex+ (numIndices>>1);
+ splitIndex = startIndex + (numIndices >> 1);
}
- btAssert(!((splitIndex==startIndex) || (splitIndex == (endIndex))));
+ btAssert(!((splitIndex == startIndex) || (splitIndex == (endIndex))));
return splitIndex;
-
}
-
-void btBvhTree::_build_sub_tree(GIM_BVH_DATA_ARRAY & primitive_boxes, int startIndex, int endIndex)
+void btBvhTree::_build_sub_tree(GIM_BVH_DATA_ARRAY& primitive_boxes, int startIndex, int endIndex)
{
int curIndex = m_num_nodes;
m_num_nodes++;
- btAssert((endIndex-startIndex)>0);
+ btAssert((endIndex - startIndex) > 0);
- if ((endIndex-startIndex)==1)
+ if ((endIndex - startIndex) == 1)
{
- //We have a leaf node
- setNodeBound(curIndex,primitive_boxes[startIndex].m_bound);
+ //We have a leaf node
+ setNodeBound(curIndex, primitive_boxes[startIndex].m_bound);
m_node_array[curIndex].setDataIndex(primitive_boxes[startIndex].m_data);
return;
@@ -175,47 +168,42 @@ void btBvhTree::_build_sub_tree(GIM_BVH_DATA_ARRAY & primitive_boxes, int startI
//calculate Best Splitting Axis and where to split it. Sort the incoming 'leafNodes' array within range 'startIndex/endIndex'.
//split axis
- int splitIndex = _calc_splitting_axis(primitive_boxes,startIndex,endIndex);
+ int splitIndex = _calc_splitting_axis(primitive_boxes, startIndex, endIndex);
splitIndex = _sort_and_calc_splitting_index(
- primitive_boxes,startIndex,endIndex,
- splitIndex//split axis
- );
-
+ primitive_boxes, startIndex, endIndex,
+ splitIndex //split axis
+ );
//calc this node bounding box
btAABB node_bound;
node_bound.invalidate();
- for (int i=startIndex;i<endIndex;i++)
+ for (int i = startIndex; i < endIndex; i++)
{
node_bound.merge(primitive_boxes[i].m_bound);
}
- setNodeBound(curIndex,node_bound);
-
+ setNodeBound(curIndex, node_bound);
//build left branch
- _build_sub_tree(primitive_boxes, startIndex, splitIndex );
-
+ _build_sub_tree(primitive_boxes, startIndex, splitIndex);
//build right branch
- _build_sub_tree(primitive_boxes, splitIndex ,endIndex);
+ _build_sub_tree(primitive_boxes, splitIndex, endIndex);
m_node_array[curIndex].setEscapeIndex(m_num_nodes - curIndex);
-
-
}
//! stackless build tree
void btBvhTree::build_tree(
- GIM_BVH_DATA_ARRAY & primitive_boxes)
+ GIM_BVH_DATA_ARRAY& primitive_boxes)
{
// initialize node count to 0
m_num_nodes = 0;
// allocate nodes
- m_node_array.resize(primitive_boxes.size()*2);
+ m_node_array.resize(primitive_boxes.size() * 2);
_build_sub_tree(primitive_boxes, 0, primitive_boxes.size());
}
@@ -225,13 +213,13 @@ void btBvhTree::build_tree(
void btGImpactBvh::refit()
{
int nodecount = getNodeCount();
- while(nodecount--)
+ while (nodecount--)
{
- if(isLeafNode(nodecount))
+ if (isLeafNode(nodecount))
{
btAABB leafbox;
- m_primitive_manager->get_primitive_box(getNodeData(nodecount),leafbox);
- setNodeBound(nodecount,leafbox);
+ m_primitive_manager->get_primitive_box(getNodeData(nodecount), leafbox);
+ setNodeBound(nodecount, leafbox);
}
else
{
@@ -243,20 +231,20 @@ void btGImpactBvh::refit()
btAABB temp_box;
int child_node = getLeftNode(nodecount);
- if(child_node)
+ if (child_node)
{
- getNodeBound(child_node,temp_box);
+ getNodeBound(child_node, temp_box);
bound.merge(temp_box);
}
child_node = getRightNode(nodecount);
- if(child_node)
+ if (child_node)
{
- getNodeBound(child_node,temp_box);
+ getNodeBound(child_node, temp_box);
bound.merge(temp_box);
}
- setNodeBound(nodecount,bound);
+ setNodeBound(nodecount, bound);
}
}
}
@@ -268,17 +256,17 @@ void btGImpactBvh::buildSet()
GIM_BVH_DATA_ARRAY primitive_boxes;
primitive_boxes.resize(m_primitive_manager->get_primitive_count());
- for (int i = 0;i<primitive_boxes.size() ;i++ )
+ for (int 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_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
-bool btGImpactBvh::boxQuery(const btAABB & box, btAlignedObjectArray<int> & collided_results) const
+bool btGImpactBvh::boxQuery(const btAABB& box, btAlignedObjectArray<int>& collided_results) const
{
int curIndex = 0;
int numNodes = getNodeCount();
@@ -286,7 +274,7 @@ bool btGImpactBvh::boxQuery(const btAABB & box, btAlignedObjectArray<int> & coll
while (curIndex < numNodes)
{
btAABB bound;
- getNodeBound(curIndex,bound);
+ getNodeBound(curIndex, bound);
//catch bugs in tree data
@@ -306,19 +294,17 @@ bool btGImpactBvh::boxQuery(const btAABB & box, btAlignedObjectArray<int> & coll
else
{
//skip node
- curIndex+= getEscapeNodeIndex(curIndex);
+ curIndex += getEscapeNodeIndex(curIndex);
}
}
- if(collided_results.size()>0) return true;
+ if (collided_results.size() > 0) return true;
return false;
}
-
-
//! returns the indices of the primitives in the m_primitive_manager
bool btGImpactBvh::rayQuery(
- const btVector3 & ray_dir,const btVector3 & ray_origin ,
- btAlignedObjectArray<int> & collided_results) const
+ const btVector3& ray_dir, const btVector3& ray_origin,
+ btAlignedObjectArray<int>& collided_results) const
{
int curIndex = 0;
int numNodes = getNodeCount();
@@ -326,16 +312,16 @@ bool btGImpactBvh::rayQuery(
while (curIndex < numNodes)
{
btAABB bound;
- getNodeBound(curIndex,bound);
+ getNodeBound(curIndex, bound);
//catch bugs in tree data
- bool aabbOverlap = bound.collide_ray(ray_origin,ray_dir);
+ bool aabbOverlap = bound.collide_ray(ray_origin, ray_dir);
bool isleafnode = isLeafNode(curIndex);
if (isleafnode && aabbOverlap)
{
- collided_results.push_back(getNodeData( curIndex));
+ collided_results.push_back(getNodeData(curIndex));
}
if (aabbOverlap || isleafnode)
@@ -346,153 +332,133 @@ bool btGImpactBvh::rayQuery(
else
{
//skip node
- curIndex+= getEscapeNodeIndex(curIndex);
+ curIndex += getEscapeNodeIndex(curIndex);
}
}
- if(collided_results.size()>0) return true;
+ if (collided_results.size() > 0) return true;
return false;
}
-
SIMD_FORCE_INLINE bool _node_collision(
- btGImpactBvh * boxset0, btGImpactBvh * boxset1,
- const BT_BOX_BOX_TRANSFORM_CACHE & trans_cache_1to0,
- int node0 ,int node1, bool complete_primitive_tests)
+ btGImpactBvh* boxset0, btGImpactBvh* boxset1,
+ const BT_BOX_BOX_TRANSFORM_CACHE& trans_cache_1to0,
+ int node0, int node1, bool complete_primitive_tests)
{
btAABB box0;
- boxset0->getNodeBound(node0,box0);
+ boxset0->getNodeBound(node0, box0);
btAABB box1;
- boxset1->getNodeBound(node1,box1);
-
- return box0.overlapping_trans_cache(box1,trans_cache_1to0,complete_primitive_tests );
-// box1.appy_transform_trans_cache(trans_cache_1to0);
-// return box0.has_collision(box1);
+ boxset1->getNodeBound(node1, box1);
+ return box0.overlapping_trans_cache(box1, trans_cache_1to0, complete_primitive_tests);
+ // box1.appy_transform_trans_cache(trans_cache_1to0);
+ // return box0.has_collision(box1);
}
-
//stackless recursive collision routine
static void _find_collision_pairs_recursive(
- btGImpactBvh * boxset0, btGImpactBvh * boxset1,
- btPairSet * collision_pairs,
- const BT_BOX_BOX_TRANSFORM_CACHE & trans_cache_1to0,
+ btGImpactBvh* boxset0, btGImpactBvh* boxset1,
+ btPairSet* collision_pairs,
+ const BT_BOX_BOX_TRANSFORM_CACHE& trans_cache_1to0,
int node0, int node1, bool complete_primitive_tests)
{
+ if (_node_collision(
+ boxset0, boxset1, trans_cache_1to0,
+ node0, node1, complete_primitive_tests) == false) return; //avoid colliding internal nodes
-
-
- if( _node_collision(
- boxset0,boxset1,trans_cache_1to0,
- node0,node1,complete_primitive_tests) ==false) return;//avoid colliding internal nodes
-
- if(boxset0->isLeafNode(node0))
+ if (boxset0->isLeafNode(node0))
{
- if(boxset1->isLeafNode(node1))
+ if (boxset1->isLeafNode(node1))
{
// collision result
collision_pairs->push_pair(
- boxset0->getNodeData(node0),boxset1->getNodeData(node1));
+ boxset0->getNodeData(node0), boxset1->getNodeData(node1));
return;
}
else
{
-
//collide left recursive
_find_collision_pairs_recursive(
- boxset0,boxset1,
- collision_pairs,trans_cache_1to0,
- node0,boxset1->getLeftNode(node1),false);
+ boxset0, boxset1,
+ collision_pairs, trans_cache_1to0,
+ node0, boxset1->getLeftNode(node1), false);
//collide right recursive
_find_collision_pairs_recursive(
- boxset0,boxset1,
- collision_pairs,trans_cache_1to0,
- node0,boxset1->getRightNode(node1),false);
-
-
+ boxset0, boxset1,
+ collision_pairs, trans_cache_1to0,
+ node0, boxset1->getRightNode(node1), false);
}
}
else
{
- if(boxset1->isLeafNode(node1))
+ if (boxset1->isLeafNode(node1))
{
-
//collide left recursive
_find_collision_pairs_recursive(
- boxset0,boxset1,
- collision_pairs,trans_cache_1to0,
- boxset0->getLeftNode(node0),node1,false);
-
+ boxset0, boxset1,
+ collision_pairs, trans_cache_1to0,
+ boxset0->getLeftNode(node0), node1, false);
//collide right recursive
_find_collision_pairs_recursive(
- boxset0,boxset1,
- collision_pairs,trans_cache_1to0,
- boxset0->getRightNode(node0),node1,false);
-
-
+ boxset0, boxset1,
+ collision_pairs, trans_cache_1to0,
+ boxset0->getRightNode(node0), node1, false);
}
else
{
//collide left0 left1
-
-
_find_collision_pairs_recursive(
- boxset0,boxset1,
- collision_pairs,trans_cache_1to0,
- boxset0->getLeftNode(node0),boxset1->getLeftNode(node1),false);
+ boxset0, boxset1,
+ collision_pairs, trans_cache_1to0,
+ boxset0->getLeftNode(node0), boxset1->getLeftNode(node1), false);
//collide left0 right1
_find_collision_pairs_recursive(
- boxset0,boxset1,
- collision_pairs,trans_cache_1to0,
- boxset0->getLeftNode(node0),boxset1->getRightNode(node1),false);
-
+ boxset0, boxset1,
+ collision_pairs, trans_cache_1to0,
+ boxset0->getLeftNode(node0), boxset1->getRightNode(node1), false);
//collide right0 left1
_find_collision_pairs_recursive(
- boxset0,boxset1,
- collision_pairs,trans_cache_1to0,
- boxset0->getRightNode(node0),boxset1->getLeftNode(node1),false);
+ boxset0, boxset1,
+ collision_pairs, trans_cache_1to0,
+ boxset0->getRightNode(node0), boxset1->getLeftNode(node1), false);
//collide right0 right1
_find_collision_pairs_recursive(
- boxset0,boxset1,
- collision_pairs,trans_cache_1to0,
- boxset0->getRightNode(node0),boxset1->getRightNode(node1),false);
+ boxset0, boxset1,
+ collision_pairs, trans_cache_1to0,
+ boxset0->getRightNode(node0), boxset1->getRightNode(node1), false);
- }// else if node1 is not a leaf
- }// else if node0 is not a leaf
+ } // else if node1 is not a leaf
+ } // else if node0 is not a leaf
}
-
-void btGImpactBvh::find_collision(btGImpactBvh * boxset0, const btTransform & trans0,
- btGImpactBvh * boxset1, const btTransform & trans1,
- btPairSet & collision_pairs)
+void btGImpactBvh::find_collision(btGImpactBvh* boxset0, const btTransform& trans0,
+ btGImpactBvh* boxset1, const btTransform& trans1,
+ btPairSet& collision_pairs)
{
-
- if(boxset0->getNodeCount()==0 || boxset1->getNodeCount()==0 ) return;
+ if (boxset0->getNodeCount() == 0 || boxset1->getNodeCount() == 0) return;
BT_BOX_BOX_TRANSFORM_CACHE trans_cache_1to0;
- trans_cache_1to0.calc_from_homogenic(trans0,trans1);
+ trans_cache_1to0.calc_from_homogenic(trans0, trans1);
#ifdef TRI_COLLISION_PROFILING
bt_begin_gim02_tree_time();
-#endif //TRI_COLLISION_PROFILING
+#endif //TRI_COLLISION_PROFILING
_find_collision_pairs_recursive(
- boxset0,boxset1,
- &collision_pairs,trans_cache_1to0,0,0,true);
+ boxset0, boxset1,
+ &collision_pairs, trans_cache_1to0, 0, 0, true);
#ifdef TRI_COLLISION_PROFILING
bt_end_gim02_tree_time();
-#endif //TRI_COLLISION_PROFILING
-
+#endif //TRI_COLLISION_PROFILING
}
-
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/btGImpactBvh.h b/thirdparty/bullet/BulletCollision/Gimpact/btGImpactBvh.h
index e20e03cc1d..3cd8fa24e7 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/btGImpactBvh.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/btGImpactBvh.h
@@ -1,5 +1,5 @@
-#ifndef GIM_BOX_SET_H_INCLUDED
-#define GIM_BOX_SET_H_INCLUDED
+#ifndef BT_GIMPACT_BVH_H_INCLUDED
+#define BT_GIMPACT_BVH_H_INCLUDED
/*! \file gim_box_set.h
\author Francisco Leon Najera
@@ -24,7 +24,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "LinearMath/btAlignedObjectArray.h"
#include "btBoxCollision.h"
@@ -32,50 +31,48 @@ subject to the following restrictions:
#include "btGImpactBvhStructs.h"
//! A pairset array
-class btPairSet: public btAlignedObjectArray<GIM_PAIR>
+class btPairSet : public btAlignedObjectArray<GIM_PAIR>
{
public:
btPairSet()
{
reserve(32);
}
- inline void push_pair(int index1,int index2)
+ inline void push_pair(int index1, int index2)
{
- push_back(GIM_PAIR(index1,index2));
+ push_back(GIM_PAIR(index1, index2));
}
- inline void push_pair_inv(int index1,int index2)
+ inline void push_pair_inv(int index1, int index2)
{
- push_back(GIM_PAIR(index2,index1));
+ push_back(GIM_PAIR(index2, index1));
}
};
-class GIM_BVH_DATA_ARRAY:public btAlignedObjectArray<GIM_BVH_DATA>
+class GIM_BVH_DATA_ARRAY : public btAlignedObjectArray<GIM_BVH_DATA>
{
};
-
-class GIM_BVH_TREE_NODE_ARRAY:public btAlignedObjectArray<GIM_BVH_TREE_NODE>
+class GIM_BVH_TREE_NODE_ARRAY : public btAlignedObjectArray<GIM_BVH_TREE_NODE>
{
};
-
-
-
//! 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);
+ 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);
+ 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);
- void _build_sub_tree(GIM_BVH_DATA_ARRAY & primitive_boxes, int startIndex, int endIndex);
public:
btBvhTree()
{
@@ -84,7 +81,7 @@ public:
//! prototype functions for box tree management
//!@{
- void build_tree(GIM_BVH_DATA_ARRAY & primitive_boxes);
+ void build_tree(GIM_BVH_DATA_ARRAY& primitive_boxes);
SIMD_FORCE_INLINE void clearNodes()
{
@@ -109,25 +106,25 @@ public:
return m_node_array[nodeindex].getDataIndex();
}
- SIMD_FORCE_INLINE void getNodeBound(int nodeindex, btAABB & bound) const
+ 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)
+ 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;
+ 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();
+ 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
@@ -135,7 +132,7 @@ public:
return m_node_array[nodeindex].getEscapeIndex();
}
- SIMD_FORCE_INLINE const GIM_BVH_TREE_NODE * get_node_pointer(int index = 0) const
+ SIMD_FORCE_INLINE const GIM_BVH_TREE_NODE* get_node_pointer(int index = 0) const
{
return &m_node_array[index];
}
@@ -143,7 +140,6 @@ public:
//!@}
};
-
//! Prototype Base class for primitive classification
/*!
This class is a wrapper for primitive collections.
@@ -153,18 +149,16 @@ This class can manage Compound shapes and trimeshes, and if it is managing trime
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;
+ 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;
+ 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.
@@ -174,13 +168,13 @@ class btGImpactBvh
{
protected:
btBvhTree m_box_tree;
- btPrimitiveManagerBase * m_primitive_manager;
+ btPrimitiveManagerBase* m_primitive_manager;
protected:
//stackless refit
void refit();
-public:
+public:
//! this constructor doesn't build the tree. you must call buildSet
btGImpactBvh()
{
@@ -188,31 +182,30 @@ public:
}
//! this constructor doesn't build the tree. you must call buildSet
- btGImpactBvh(btPrimitiveManagerBase * primitive_manager)
+ btGImpactBvh(btPrimitiveManagerBase* primitive_manager)
{
m_primitive_manager = primitive_manager;
}
- SIMD_FORCE_INLINE btAABB getGlobalBox() const
+ SIMD_FORCE_INLINE btAABB getGlobalBox() const
{
btAABB totalbox;
getNodeBound(0, totalbox);
return totalbox;
}
- SIMD_FORCE_INLINE void setPrimitiveManager(btPrimitiveManagerBase * primitive_manager)
+ SIMD_FORCE_INLINE void setPrimitiveManager(btPrimitiveManagerBase* primitive_manager)
{
m_primitive_manager = primitive_manager;
}
- SIMD_FORCE_INLINE btPrimitiveManagerBase * getPrimitiveManager() const
+ SIMD_FORCE_INLINE btPrimitiveManagerBase* getPrimitiveManager() const
{
return m_primitive_manager;
}
-
-//! node manager prototype functions
-///@{
+ //! node manager prototype functions
+ ///@{
//! this attemps to refit the box set.
SIMD_FORCE_INLINE void update()
@@ -224,21 +217,21 @@ public:
void buildSet();
//! returns the indices of the primitives in the m_primitive_manager
- bool boxQuery(const btAABB & box, btAlignedObjectArray<int> & collided_results) const;
+ bool boxQuery(const btAABB& box, btAlignedObjectArray<int>& 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<int> & collided_results) const
+ SIMD_FORCE_INLINE bool boxQueryTrans(const btAABB& box,
+ const btTransform& transform, btAlignedObjectArray<int>& collided_results) const
{
- btAABB transbox=box;
+ btAABB transbox = box;
transbox.appy_transform(transform);
- return boxQuery(transbox,collided_results);
+ 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<int> & collided_results) const;
+ const btVector3& ray_dir, const btVector3& ray_origin,
+ btAlignedObjectArray<int>& collided_results) const;
//! tells if this set has hierarcht
SIMD_FORCE_INLINE bool hasHierarchy() const
@@ -247,7 +240,7 @@ public:
}
//! tells if this set is a trimesh
- SIMD_FORCE_INLINE bool isTrimesh() const
+ SIMD_FORCE_INLINE bool isTrimesh() const
{
return m_primitive_manager->is_trimesh();
}
@@ -269,17 +262,16 @@ public:
return m_box_tree.getNodeData(nodeindex);
}
- SIMD_FORCE_INLINE void getNodeBound(int nodeindex, btAABB & bound) const
+ 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)
+ 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);
@@ -295,24 +287,23 @@ public:
return m_box_tree.getEscapeNodeIndex(nodeindex);
}
- SIMD_FORCE_INLINE void getNodeTriangle(int nodeindex,btPrimitiveTriangle & triangle) const
+ SIMD_FORCE_INLINE void getNodeTriangle(int nodeindex, btPrimitiveTriangle& triangle) const
{
- m_primitive_manager->get_primitive_triangle(getNodeData(nodeindex),triangle);
+ m_primitive_manager->get_primitive_triangle(getNodeData(nodeindex), triangle);
}
-
- SIMD_FORCE_INLINE const GIM_BVH_TREE_NODE * get_node_pointer(int index = 0) const
+ 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
+#endif //TRI_COLLISION_PROFILING
- static void find_collision(btGImpactBvh * boxset1, const btTransform & trans1,
- btGImpactBvh * boxset2, const btTransform & trans2,
- btPairSet & collision_pairs);
+ static void find_collision(btGImpactBvh* boxset1, const btTransform& trans1,
+ btGImpactBvh* boxset2, const btTransform& trans2,
+ btPairSet& collision_pairs);
};
-#endif // GIM_BOXPRUNING_H_INCLUDED
+#endif // BT_GIMPACT_BVH_H_INCLUDED
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/btGImpactBvhStructs.h b/thirdparty/bullet/BulletCollision/Gimpact/btGImpactBvhStructs.h
index 9342a572d0..54888c6757 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/btGImpactBvhStructs.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/btGImpactBvhStructs.h
@@ -24,7 +24,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "LinearMath/btAlignedObjectArray.h"
#include "btBoxCollision.h"
@@ -33,21 +32,22 @@ subject to the following restrictions:
//! 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;
+ 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;
+ {
+ m_index1 = index1;
+ m_index2 = index2;
}
};
@@ -63,8 +63,10 @@ class GIM_BVH_TREE_NODE
{
public:
btAABB m_bound;
+
protected:
- int m_escapeIndexOrDataIndex;
+ int m_escapeIndexOrDataIndex;
+
public:
GIM_BVH_TREE_NODE()
{
@@ -74,7 +76,7 @@ public:
SIMD_FORCE_INLINE bool isLeafNode() const
{
//skipindex is negative (internal node), triangleindex >=0 (leafnode)
- return (m_escapeIndexOrDataIndex>=0);
+ return (m_escapeIndexOrDataIndex >= 0);
}
SIMD_FORCE_INLINE int getEscapeIndex() const
@@ -99,7 +101,6 @@ public:
{
m_escapeIndexOrDataIndex = index;
}
-
};
-#endif // GIM_BOXPRUNING_H_INCLUDED
+#endif // GIM_BOXPRUNING_H_INCLUDED
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.cpp b/thirdparty/bullet/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.cpp
index 2e87475e39..3d8ab9f520 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.cpp
+++ b/thirdparty/bullet/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.cpp
@@ -31,18 +31,16 @@ Concave-Concave Collision
#include "btContactProcessing.h"
#include "LinearMath/btQuickprof.h"
-
//! Class for accessing the plane equation
class btPlaneShape : public btStaticPlaneShape
{
public:
-
btPlaneShape(const btVector3& v, float f)
- :btStaticPlaneShape(v,f)
+ : btStaticPlaneShape(v, f)
{
}
- void get_plane_equation(btVector4 &equation)
+ void get_plane_equation(btVector4& equation)
{
equation[0] = m_planeNormal[0];
equation[1] = m_planeNormal[1];
@@ -50,18 +48,16 @@ public:
equation[3] = m_planeConstant;
}
-
- void get_plane_equation_transformed(const btTransform & trans,btVector4 &equation) const
+ void get_plane_equation_transformed(const btTransform& trans, btVector4& equation) const
{
- equation[0] = trans.getBasis().getRow(0).dot(m_planeNormal);
- equation[1] = trans.getBasis().getRow(1).dot(m_planeNormal);
- equation[2] = trans.getBasis().getRow(2).dot(m_planeNormal);
- equation[3] = trans.getOrigin().dot(m_planeNormal) + m_planeConstant;
+ const btVector3 normal = trans.getBasis() * m_planeNormal;
+ equation[0] = normal[0];
+ equation[1] = normal[1];
+ equation[2] = normal[2];
+ equation[3] = normal.dot(trans * (m_planeConstant * m_planeNormal));
}
};
-
-
//////////////////////////////////////////////////////////////////////////////////////////////
#ifdef TRI_COLLISION_PROFILING
@@ -80,7 +76,7 @@ void bt_end_gim02_tri_time()
g_accum_triangle_collision_time += g_triangle_clock.getTimeMicroseconds();
g_count_triangle_collision++;
}
-#endif //TRI_COLLISION_PROFILING
+#endif //TRI_COLLISION_PROFILING
//! Retrieving shapes shapes
/*!
Declared here due of insuficent space on Pool allocators
@@ -89,7 +85,7 @@ Declared here due of insuficent space on Pool allocators
class GIM_ShapeRetriever
{
public:
- const btGImpactShapeInterface * m_gim_shape;
+ const btGImpactShapeInterface* m_gim_shape;
btTriangleShapeEx m_trishape;
btTetrahedronShapeEx m_tetrashape;
@@ -97,51 +93,50 @@ public:
class ChildShapeRetriever
{
public:
- GIM_ShapeRetriever * m_parent;
- virtual const btCollisionShape * getChildShape(int index)
+ GIM_ShapeRetriever* m_parent;
+ virtual const btCollisionShape* getChildShape(int index)
{
return m_parent->m_gim_shape->getChildShape(index);
}
virtual ~ChildShapeRetriever() {}
};
- class TriangleShapeRetriever:public ChildShapeRetriever
+ class TriangleShapeRetriever : public ChildShapeRetriever
{
public:
-
- virtual btCollisionShape * getChildShape(int index)
+ virtual btCollisionShape* getChildShape(int index)
{
- m_parent->m_gim_shape->getBulletTriangle(index,m_parent->m_trishape);
+ m_parent->m_gim_shape->getBulletTriangle(index, m_parent->m_trishape);
return &m_parent->m_trishape;
}
virtual ~TriangleShapeRetriever() {}
};
- class TetraShapeRetriever:public ChildShapeRetriever
+ class TetraShapeRetriever : public ChildShapeRetriever
{
public:
-
- virtual btCollisionShape * getChildShape(int index)
+ virtual btCollisionShape* getChildShape(int index)
{
- m_parent->m_gim_shape->getBulletTetrahedron(index,m_parent->m_tetrashape);
+ m_parent->m_gim_shape->getBulletTetrahedron(index, m_parent->m_tetrashape);
return &m_parent->m_tetrashape;
}
};
+
public:
ChildShapeRetriever m_child_retriever;
TriangleShapeRetriever m_tri_retriever;
- TetraShapeRetriever m_tetra_retriever;
- ChildShapeRetriever * m_current_retriever;
+ TetraShapeRetriever m_tetra_retriever;
+ ChildShapeRetriever* m_current_retriever;
- GIM_ShapeRetriever(const btGImpactShapeInterface * gim_shape)
+ GIM_ShapeRetriever(const btGImpactShapeInterface* gim_shape)
{
m_gim_shape = gim_shape;
//select retriever
- if(m_gim_shape->needsRetrieveTriangles())
+ if (m_gim_shape->needsRetrieveTriangles())
{
m_current_retriever = &m_tri_retriever;
}
- else if(m_gim_shape->needsRetrieveTetrahedrons())
+ else if (m_gim_shape->needsRetrieveTetrahedrons())
{
m_current_retriever = &m_tetra_retriever;
}
@@ -153,32 +148,26 @@ public:
m_current_retriever->m_parent = this;
}
- const btCollisionShape * getChildShape(int index)
+ const btCollisionShape* getChildShape(int index)
{
return m_current_retriever->getChildShape(index);
}
-
-
};
-
-
//!@}
-
#ifdef TRI_COLLISION_PROFILING
//! Gets the average time in miliseconds of tree collisions
float btGImpactCollisionAlgorithm::getAverageTreeCollisionTime()
{
return btGImpactBoxSet::getAverageTreeCollisionTime();
-
}
//! Gets the average time in miliseconds of triangle collisions
float btGImpactCollisionAlgorithm::getAverageTriangleCollisionTime()
{
- if(g_count_triangle_collision == 0) return 0;
+ if (g_count_triangle_collision == 0) return 0;
float avgtime = g_accum_triangle_collision_time;
avgtime /= (float)g_count_triangle_collision;
@@ -189,12 +178,10 @@ float btGImpactCollisionAlgorithm::getAverageTriangleCollisionTime()
return avgtime;
}
-#endif //TRI_COLLISION_PROFILING
-
+#endif //TRI_COLLISION_PROFILING
-
-btGImpactCollisionAlgorithm::btGImpactCollisionAlgorithm( const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap)
-: btActivatingCollisionAlgorithm(ci,body0Wrap,body1Wrap)
+btGImpactCollisionAlgorithm::btGImpactCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap)
+ : btActivatingCollisionAlgorithm(ci, body0Wrap, body1Wrap)
{
m_manifoldPtr = NULL;
m_convex_algorithm = NULL;
@@ -205,77 +192,62 @@ btGImpactCollisionAlgorithm::~btGImpactCollisionAlgorithm()
clearCache();
}
-
-
-
-
-void btGImpactCollisionAlgorithm::addContactPoint(const btCollisionObjectWrapper * body0Wrap,
- const btCollisionObjectWrapper * body1Wrap,
- const btVector3 & point,
- const btVector3 & normal,
- btScalar distance)
+void btGImpactCollisionAlgorithm::addContactPoint(const btCollisionObjectWrapper* body0Wrap,
+ const btCollisionObjectWrapper* body1Wrap,
+ const btVector3& point,
+ const btVector3& normal,
+ btScalar distance)
{
- m_resultOut->setShapeIdentifiersA(m_part0,m_triface0);
- m_resultOut->setShapeIdentifiersB(m_part1,m_triface1);
- checkManifold(body0Wrap,body1Wrap);
- m_resultOut->addContactPoint(normal,point,distance);
+ m_resultOut->setShapeIdentifiersA(m_part0, m_triface0);
+ m_resultOut->setShapeIdentifiersB(m_part1, m_triface1);
+ checkManifold(body0Wrap, body1Wrap);
+ m_resultOut->addContactPoint(normal, point, distance);
}
-
void btGImpactCollisionAlgorithm::shape_vs_shape_collision(
- const btCollisionObjectWrapper * body0Wrap,
- const btCollisionObjectWrapper* body1Wrap,
- const btCollisionShape * shape0,
- const btCollisionShape * shape1)
+ const btCollisionObjectWrapper* body0Wrap,
+ const btCollisionObjectWrapper* body1Wrap,
+ const btCollisionShape* shape0,
+ const btCollisionShape* shape1)
{
-
-
{
-
- btCollisionAlgorithm* algor = newAlgorithm(body0Wrap,body1Wrap);
+ btCollisionAlgorithm* algor = newAlgorithm(body0Wrap, body1Wrap);
// post : checkManifold is called
- m_resultOut->setShapeIdentifiersA(m_part0,m_triface0);
- m_resultOut->setShapeIdentifiersB(m_part1,m_triface1);
-
- algor->processCollision(body0Wrap,body1Wrap,*m_dispatchInfo,m_resultOut);
-
+ m_resultOut->setShapeIdentifiersA(m_part0, m_triface0);
+ m_resultOut->setShapeIdentifiersB(m_part1, m_triface1);
+
+ algor->processCollision(body0Wrap, body1Wrap, *m_dispatchInfo, m_resultOut);
+
algor->~btCollisionAlgorithm();
m_dispatcher->freeCollisionAlgorithm(algor);
}
-
}
void btGImpactCollisionAlgorithm::convex_vs_convex_collision(
- const btCollisionObjectWrapper* body0Wrap,
- const btCollisionObjectWrapper* body1Wrap,
- const btCollisionShape* shape0,
- const btCollisionShape* shape1)
+ const btCollisionObjectWrapper* body0Wrap,
+ const btCollisionObjectWrapper* body1Wrap,
+ const btCollisionShape* shape0,
+ const btCollisionShape* shape1)
{
+ m_resultOut->setShapeIdentifiersA(m_part0, m_triface0);
+ m_resultOut->setShapeIdentifiersB(m_part1, m_triface1);
- m_resultOut->setShapeIdentifiersA(m_part0,m_triface0);
- m_resultOut->setShapeIdentifiersB(m_part1,m_triface1);
-
- btCollisionObjectWrapper ob0(body0Wrap,shape0,body0Wrap->getCollisionObject(),body0Wrap->getWorldTransform(),m_part0,m_triface0);
- btCollisionObjectWrapper ob1(body1Wrap,shape1,body1Wrap->getCollisionObject(),body1Wrap->getWorldTransform(),m_part1,m_triface1);
- checkConvexAlgorithm(&ob0,&ob1);
- m_convex_algorithm->processCollision(&ob0,&ob1,*m_dispatchInfo,m_resultOut);
-
-
+ btCollisionObjectWrapper ob0(body0Wrap, shape0, body0Wrap->getCollisionObject(), body0Wrap->getWorldTransform(), m_part0, m_triface0);
+ btCollisionObjectWrapper ob1(body1Wrap, shape1, body1Wrap->getCollisionObject(), body1Wrap->getWorldTransform(), m_part1, m_triface1);
+ checkConvexAlgorithm(&ob0, &ob1);
+ m_convex_algorithm->processCollision(&ob0, &ob1, *m_dispatchInfo, m_resultOut);
}
-
-
-
void btGImpactCollisionAlgorithm::gimpact_vs_gimpact_find_pairs(
- const btTransform & trans0,
- const btTransform & trans1,
- const btGImpactShapeInterface * shape0,
- const btGImpactShapeInterface * shape1,btPairSet & pairset)
+ const btTransform& trans0,
+ const btTransform& trans1,
+ const btGImpactShapeInterface* shape0,
+ const btGImpactShapeInterface* shape1, btPairSet& pairset)
{
- if(shape0->hasBoxSet() && shape1->hasBoxSet())
+ if (shape0->hasBoxSet() && shape1->hasBoxSet())
{
- btGImpactBoxSet::find_collision(shape0->getBoxSet(),trans0,shape1->getBoxSet(),trans1,pairset);
+ btGImpactBoxSet::find_collision(shape0->getBoxSet(), trans0, shape1->getBoxSet(), trans1, pairset);
}
else
{
@@ -283,74 +255,66 @@ void btGImpactCollisionAlgorithm::gimpact_vs_gimpact_find_pairs(
btAABB boxshape1;
int i = shape0->getNumChildShapes();
- while(i--)
+ while (i--)
{
- shape0->getChildAabb(i,trans0,boxshape0.m_min,boxshape0.m_max);
+ shape0->getChildAabb(i, trans0, boxshape0.m_min, boxshape0.m_max);
int j = shape1->getNumChildShapes();
- while(j--)
+ while (j--)
{
- shape1->getChildAabb(i,trans1,boxshape1.m_min,boxshape1.m_max);
+ shape1->getChildAabb(i, trans1, boxshape1.m_min, boxshape1.m_max);
- if(boxshape1.has_collision(boxshape0))
+ if (boxshape1.has_collision(boxshape0))
{
- pairset.push_pair(i,j);
+ pairset.push_pair(i, j);
}
}
}
}
-
-
}
-
void btGImpactCollisionAlgorithm::gimpact_vs_shape_find_pairs(
- const btTransform & trans0,
- const btTransform & trans1,
- const btGImpactShapeInterface * shape0,
- const btCollisionShape * shape1,
- btAlignedObjectArray<int> & collided_primitives)
+ const btTransform& trans0,
+ const btTransform& trans1,
+ const btGImpactShapeInterface* shape0,
+ const btCollisionShape* shape1,
+ btAlignedObjectArray<int>& collided_primitives)
{
-
btAABB boxshape;
-
- if(shape0->hasBoxSet())
+ if (shape0->hasBoxSet())
{
btTransform trans1to0 = trans0.inverse();
trans1to0 *= trans1;
- shape1->getAabb(trans1to0,boxshape.m_min,boxshape.m_max);
+ shape1->getAabb(trans1to0, boxshape.m_min, boxshape.m_max);
shape0->getBoxSet()->boxQuery(boxshape, collided_primitives);
}
else
{
- shape1->getAabb(trans1,boxshape.m_min,boxshape.m_max);
+ shape1->getAabb(trans1, boxshape.m_min, boxshape.m_max);
btAABB boxshape0;
int i = shape0->getNumChildShapes();
- while(i--)
+ while (i--)
{
- shape0->getChildAabb(i,trans0,boxshape0.m_min,boxshape0.m_max);
+ shape0->getChildAabb(i, trans0, boxshape0.m_min, boxshape0.m_max);
- if(boxshape.has_collision(boxshape0))
+ if (boxshape.has_collision(boxshape0))
{
collided_primitives.push_back(i);
}
}
-
}
-
}
-
-void btGImpactCollisionAlgorithm::collide_gjk_triangles(const btCollisionObjectWrapper * body0Wrap,
- const btCollisionObjectWrapper * body1Wrap,
- const btGImpactMeshShapePart * shape0,
- const btGImpactMeshShapePart * shape1,
- const int * pairs, int pair_count)
+void btGImpactCollisionAlgorithm::collide_gjk_triangles(const btCollisionObjectWrapper* body0Wrap,
+ const btCollisionObjectWrapper* body1Wrap,
+ const btGImpactMeshShapePart* shape0,
+ const btGImpactMeshShapePart* shape1,
+ const int* pairs, int pair_count)
{
btTriangleShapeEx tri0;
btTriangleShapeEx tri1;
@@ -358,27 +322,22 @@ void btGImpactCollisionAlgorithm::collide_gjk_triangles(const btCollisionObjectW
shape0->lockChildShapes();
shape1->lockChildShapes();
- const int * pair_pointer = pairs;
+ const int* pair_pointer = pairs;
- while(pair_count--)
+ while (pair_count--)
{
-
m_triface0 = *(pair_pointer);
- m_triface1 = *(pair_pointer+1);
- pair_pointer+=2;
-
-
-
- shape0->getBulletTriangle(m_triface0,tri0);
- shape1->getBulletTriangle(m_triface1,tri1);
+ m_triface1 = *(pair_pointer + 1);
+ pair_pointer += 2;
+ shape0->getBulletTriangle(m_triface0, tri0);
+ shape1->getBulletTriangle(m_triface1, tri1);
//collide two convex shapes
- if(tri0.overlap_test_conservative(tri1))
+ if (tri0.overlap_test_conservative(tri1))
{
- convex_vs_convex_collision(body0Wrap,body1Wrap,&tri0,&tri1);
+ convex_vs_convex_collision(body0Wrap, body1Wrap, &tri0, &tri1);
}
-
}
shape0->unlockChildShapes();
@@ -386,10 +345,10 @@ void btGImpactCollisionAlgorithm::collide_gjk_triangles(const btCollisionObjectW
}
void btGImpactCollisionAlgorithm::collide_sat_triangles(const btCollisionObjectWrapper* body0Wrap,
- const btCollisionObjectWrapper* body1Wrap,
- const btGImpactMeshShapePart * shape0,
- const btGImpactMeshShapePart * shape1,
- const int * pairs, int pair_count)
+ const btCollisionObjectWrapper* body1Wrap,
+ const btGImpactMeshShapePart* shape0,
+ const btGImpactMeshShapePart* shape1,
+ const int* pairs, int pair_count)
{
btTransform orgtrans0 = body0Wrap->getWorldTransform();
btTransform orgtrans1 = body1Wrap->getWorldTransform();
@@ -401,119 +360,105 @@ void btGImpactCollisionAlgorithm::collide_sat_triangles(const btCollisionObjectW
shape0->lockChildShapes();
shape1->lockChildShapes();
- const int * pair_pointer = pairs;
+ const int* pair_pointer = pairs;
- while(pair_count--)
+ while (pair_count--)
{
-
m_triface0 = *(pair_pointer);
- m_triface1 = *(pair_pointer+1);
- pair_pointer+=2;
+ m_triface1 = *(pair_pointer + 1);
+ pair_pointer += 2;
+ shape0->getPrimitiveTriangle(m_triface0, ptri0);
+ shape1->getPrimitiveTriangle(m_triface1, ptri1);
- shape0->getPrimitiveTriangle(m_triface0,ptri0);
- shape1->getPrimitiveTriangle(m_triface1,ptri1);
-
- #ifdef TRI_COLLISION_PROFILING
+#ifdef TRI_COLLISION_PROFILING
bt_begin_gim02_tri_time();
- #endif
+#endif
ptri0.applyTransform(orgtrans0);
ptri1.applyTransform(orgtrans1);
-
//build planes
ptri0.buildTriPlane();
ptri1.buildTriPlane();
// test conservative
-
-
- if(ptri0.overlap_test_conservative(ptri1))
+ if (ptri0.overlap_test_conservative(ptri1))
{
- if(ptri0.find_triangle_collision_clip_method(ptri1,contact_data))
+ if (ptri0.find_triangle_collision_clip_method(ptri1, contact_data))
{
-
int j = contact_data.m_point_count;
- while(j--)
+ while (j--)
{
-
addContactPoint(body0Wrap, body1Wrap,
- contact_data.m_points[j],
- contact_data.m_separating_normal,
- -contact_data.m_penetration_depth);
+ contact_data.m_points[j],
+ contact_data.m_separating_normal,
+ -contact_data.m_penetration_depth);
}
}
}
- #ifdef TRI_COLLISION_PROFILING
+#ifdef TRI_COLLISION_PROFILING
bt_end_gim02_tri_time();
- #endif
-
+#endif
}
shape0->unlockChildShapes();
shape1->unlockChildShapes();
-
}
-
void btGImpactCollisionAlgorithm::gimpact_vs_gimpact(
- const btCollisionObjectWrapper* body0Wrap,
- const btCollisionObjectWrapper * body1Wrap,
- const btGImpactShapeInterface * shape0,
- const btGImpactShapeInterface * shape1)
+ const btCollisionObjectWrapper* body0Wrap,
+ const btCollisionObjectWrapper* body1Wrap,
+ const btGImpactShapeInterface* shape0,
+ const btGImpactShapeInterface* shape1)
{
-
- if(shape0->getGImpactShapeType()==CONST_GIMPACT_TRIMESH_SHAPE)
+ if (shape0->getGImpactShapeType() == CONST_GIMPACT_TRIMESH_SHAPE)
{
- const btGImpactMeshShape * meshshape0 = static_cast<const btGImpactMeshShape *>(shape0);
+ const btGImpactMeshShape* meshshape0 = static_cast<const btGImpactMeshShape*>(shape0);
m_part0 = meshshape0->getMeshPartCount();
- while(m_part0--)
+ while (m_part0--)
{
- gimpact_vs_gimpact(body0Wrap,body1Wrap,meshshape0->getMeshPart(m_part0),shape1);
+ gimpact_vs_gimpact(body0Wrap, body1Wrap, meshshape0->getMeshPart(m_part0), shape1);
}
return;
}
- if(shape1->getGImpactShapeType()==CONST_GIMPACT_TRIMESH_SHAPE)
+ if (shape1->getGImpactShapeType() == CONST_GIMPACT_TRIMESH_SHAPE)
{
- const btGImpactMeshShape * meshshape1 = static_cast<const btGImpactMeshShape *>(shape1);
+ const btGImpactMeshShape* meshshape1 = static_cast<const btGImpactMeshShape*>(shape1);
m_part1 = meshshape1->getMeshPartCount();
- while(m_part1--)
+ while (m_part1--)
{
-
- gimpact_vs_gimpact(body0Wrap,body1Wrap,shape0,meshshape1->getMeshPart(m_part1));
-
+ gimpact_vs_gimpact(body0Wrap, body1Wrap, shape0, meshshape1->getMeshPart(m_part1));
}
return;
}
-
btTransform orgtrans0 = body0Wrap->getWorldTransform();
btTransform orgtrans1 = body1Wrap->getWorldTransform();
btPairSet pairset;
- gimpact_vs_gimpact_find_pairs(orgtrans0,orgtrans1,shape0,shape1,pairset);
+ gimpact_vs_gimpact_find_pairs(orgtrans0, orgtrans1, shape0, shape1, pairset);
- if(pairset.size()== 0) return;
+ if (pairset.size() == 0) return;
- if(shape0->getGImpactShapeType() == CONST_GIMPACT_TRIMESH_SHAPE_PART &&
+ if (shape0->getGImpactShapeType() == CONST_GIMPACT_TRIMESH_SHAPE_PART &&
shape1->getGImpactShapeType() == CONST_GIMPACT_TRIMESH_SHAPE_PART)
{
- const btGImpactMeshShapePart * shapepart0 = static_cast<const btGImpactMeshShapePart * >(shape0);
- const btGImpactMeshShapePart * shapepart1 = static_cast<const btGImpactMeshShapePart * >(shape1);
- //specialized function
- #ifdef BULLET_TRIANGLE_COLLISION
- collide_gjk_triangles(body0Wrap,body1Wrap,shapepart0,shapepart1,&pairset[0].m_index1,pairset.size());
- #else
- collide_sat_triangles(body0Wrap,body1Wrap,shapepart0,shapepart1,&pairset[0].m_index1,pairset.size());
- #endif
+ const btGImpactMeshShapePart* shapepart0 = static_cast<const btGImpactMeshShapePart*>(shape0);
+ const btGImpactMeshShapePart* shapepart1 = static_cast<const btGImpactMeshShapePart*>(shape1);
+//specialized function
+#ifdef BULLET_TRIANGLE_COLLISION
+ collide_gjk_triangles(body0Wrap, body1Wrap, shapepart0, shapepart1, &pairset[0].m_index1, pairset.size());
+#else
+ collide_sat_triangles(body0Wrap, body1Wrap, shapepart0, shapepart1, &pairset[0].m_index1, pairset.size());
+#endif
return;
}
@@ -530,32 +475,32 @@ void btGImpactCollisionAlgorithm::gimpact_vs_gimpact(
bool child_has_transform1 = shape1->childrenHasTransform();
int i = pairset.size();
- while(i--)
+ while (i--)
{
- GIM_PAIR * pair = &pairset[i];
+ GIM_PAIR* pair = &pairset[i];
m_triface0 = pair->m_index1;
m_triface1 = pair->m_index2;
- const btCollisionShape * colshape0 = retriever0.getChildShape(m_triface0);
- const btCollisionShape * colshape1 = retriever1.getChildShape(m_triface1);
+ const btCollisionShape* colshape0 = retriever0.getChildShape(m_triface0);
+ const btCollisionShape* colshape1 = retriever1.getChildShape(m_triface1);
btTransform tr0 = body0Wrap->getWorldTransform();
btTransform tr1 = body1Wrap->getWorldTransform();
- if(child_has_transform0)
+ if (child_has_transform0)
{
- tr0 = orgtrans0*shape0->getChildTransform(m_triface0);
+ tr0 = orgtrans0 * shape0->getChildTransform(m_triface0);
}
- if(child_has_transform1)
+ if (child_has_transform1)
{
- tr1 = orgtrans1*shape1->getChildTransform(m_triface1);
+ tr1 = orgtrans1 * shape1->getChildTransform(m_triface1);
}
- btCollisionObjectWrapper ob0(body0Wrap,colshape0,body0Wrap->getCollisionObject(),tr0,m_part0,m_triface0);
- btCollisionObjectWrapper ob1(body1Wrap,colshape1,body1Wrap->getCollisionObject(),tr1,m_part1,m_triface1);
+ btCollisionObjectWrapper ob0(body0Wrap, colshape0, body0Wrap->getCollisionObject(), tr0, m_part0, m_triface0);
+ btCollisionObjectWrapper ob1(body1Wrap, colshape1, body1Wrap->getCollisionObject(), tr1, m_part1, m_triface1);
//collide two convex shapes
- convex_vs_convex_collision(&ob0,&ob1,colshape0,colshape1);
+ convex_vs_convex_collision(&ob0, &ob1, colshape0, colshape1);
}
shape0->unlockChildShapes();
@@ -563,159 +508,149 @@ void btGImpactCollisionAlgorithm::gimpact_vs_gimpact(
}
void btGImpactCollisionAlgorithm::gimpact_vs_shape(const btCollisionObjectWrapper* body0Wrap,
- const btCollisionObjectWrapper * body1Wrap,
- const btGImpactShapeInterface * shape0,
- const btCollisionShape * shape1,bool swapped)
+ const btCollisionObjectWrapper* body1Wrap,
+ const btGImpactShapeInterface* shape0,
+ const btCollisionShape* shape1, bool swapped)
{
- if(shape0->getGImpactShapeType()==CONST_GIMPACT_TRIMESH_SHAPE)
+ if (shape0->getGImpactShapeType() == CONST_GIMPACT_TRIMESH_SHAPE)
{
- const btGImpactMeshShape * meshshape0 = static_cast<const btGImpactMeshShape *>(shape0);
+ const btGImpactMeshShape* meshshape0 = static_cast<const btGImpactMeshShape*>(shape0);
int& part = swapped ? m_part1 : m_part0;
part = meshshape0->getMeshPartCount();
- while(part--)
+ while (part--)
{
-
gimpact_vs_shape(body0Wrap,
- body1Wrap,
- meshshape0->getMeshPart(part),
- shape1,swapped);
-
+ body1Wrap,
+ meshshape0->getMeshPart(part),
+ shape1, swapped);
}
return;
}
- #ifdef GIMPACT_VS_PLANE_COLLISION
- if(shape0->getGImpactShapeType() == CONST_GIMPACT_TRIMESH_SHAPE_PART &&
+#ifdef GIMPACT_VS_PLANE_COLLISION
+ if (shape0->getGImpactShapeType() == CONST_GIMPACT_TRIMESH_SHAPE_PART &&
shape1->getShapeType() == STATIC_PLANE_PROXYTYPE)
{
- const btGImpactMeshShapePart * shapepart = static_cast<const btGImpactMeshShapePart *>(shape0);
- const btStaticPlaneShape * planeshape = static_cast<const btStaticPlaneShape * >(shape1);
- gimpacttrimeshpart_vs_plane_collision(body0Wrap,body1Wrap,shapepart,planeshape,swapped);
+ const btGImpactMeshShapePart* shapepart = static_cast<const btGImpactMeshShapePart*>(shape0);
+ const btStaticPlaneShape* planeshape = static_cast<const btStaticPlaneShape*>(shape1);
+ gimpacttrimeshpart_vs_plane_collision(body0Wrap, body1Wrap, shapepart, planeshape, swapped);
return;
}
- #endif
-
+#endif
-
- if(shape1->isCompound())
+ if (shape1->isCompound())
{
- const btCompoundShape * compoundshape = static_cast<const btCompoundShape *>(shape1);
- gimpact_vs_compoundshape(body0Wrap,body1Wrap,shape0,compoundshape,swapped);
+ const btCompoundShape* compoundshape = static_cast<const btCompoundShape*>(shape1);
+ gimpact_vs_compoundshape(body0Wrap, body1Wrap, shape0, compoundshape, swapped);
return;
}
- else if(shape1->isConcave())
+ else if (shape1->isConcave())
{
- const btConcaveShape * concaveshape = static_cast<const btConcaveShape *>(shape1);
- gimpact_vs_concave(body0Wrap,body1Wrap,shape0,concaveshape,swapped);
+ const btConcaveShape* concaveshape = static_cast<const btConcaveShape*>(shape1);
+ gimpact_vs_concave(body0Wrap, body1Wrap, shape0, concaveshape, swapped);
return;
}
-
btTransform orgtrans0 = body0Wrap->getWorldTransform();
btTransform orgtrans1 = body1Wrap->getWorldTransform();
btAlignedObjectArray<int> collided_results;
- gimpact_vs_shape_find_pairs(orgtrans0,orgtrans1,shape0,shape1,collided_results);
-
- if(collided_results.size() == 0) return;
+ gimpact_vs_shape_find_pairs(orgtrans0, orgtrans1, shape0, shape1, collided_results);
+ if (collided_results.size() == 0) return;
shape0->lockChildShapes();
GIM_ShapeRetriever retriever0(shape0);
-
bool child_has_transform0 = shape0->childrenHasTransform();
-
int i = collided_results.size();
- while(i--)
+ while (i--)
{
int child_index = collided_results[i];
- if(swapped)
- m_triface1 = child_index;
- else
- m_triface0 = child_index;
+ if (swapped)
+ m_triface1 = child_index;
+ else
+ m_triface0 = child_index;
- const btCollisionShape * colshape0 = retriever0.getChildShape(child_index);
+ const btCollisionShape* colshape0 = retriever0.getChildShape(child_index);
btTransform tr0 = body0Wrap->getWorldTransform();
- if(child_has_transform0)
+ if (child_has_transform0)
{
- tr0 = orgtrans0*shape0->getChildTransform(child_index);
+ tr0 = orgtrans0 * shape0->getChildTransform(child_index);
}
- btCollisionObjectWrapper ob0(body0Wrap,colshape0,body0Wrap->getCollisionObject(),body0Wrap->getWorldTransform(),m_part0,m_triface0);
+ btCollisionObjectWrapper ob0(body0Wrap, colshape0, body0Wrap->getCollisionObject(), body0Wrap->getWorldTransform(), m_part0, m_triface0);
const btCollisionObjectWrapper* prevObj0 = m_resultOut->getBody0Wrap();
-
- if (m_resultOut->getBody0Wrap()->getCollisionObject()==ob0.getCollisionObject())
+
+ if (m_resultOut->getBody0Wrap()->getCollisionObject() == ob0.getCollisionObject())
{
m_resultOut->setBody0Wrap(&ob0);
- } else
+ }
+ else
{
m_resultOut->setBody1Wrap(&ob0);
}
//collide two shapes
- if(swapped)
+ if (swapped)
{
-
- shape_vs_shape_collision(body1Wrap,&ob0,shape1,colshape0);
+ shape_vs_shape_collision(body1Wrap, &ob0, shape1, colshape0);
}
else
{
-
- shape_vs_shape_collision(&ob0,body1Wrap,colshape0,shape1);
+ shape_vs_shape_collision(&ob0, body1Wrap, colshape0, shape1);
}
m_resultOut->setBody0Wrap(prevObj0);
-
}
shape0->unlockChildShapes();
-
}
void btGImpactCollisionAlgorithm::gimpact_vs_compoundshape(const btCollisionObjectWrapper* body0Wrap,
- const btCollisionObjectWrapper* body1Wrap,
- const btGImpactShapeInterface * shape0,
- const btCompoundShape * shape1,bool swapped)
+ const btCollisionObjectWrapper* body1Wrap,
+ const btGImpactShapeInterface* shape0,
+ const btCompoundShape* shape1, bool swapped)
{
btTransform orgtrans1 = body1Wrap->getWorldTransform();
int i = shape1->getNumChildShapes();
- while(i--)
+ while (i--)
{
+ const btCollisionShape* colshape1 = shape1->getChildShape(i);
+ btTransform childtrans1 = orgtrans1 * shape1->getChildTransform(i);
- const btCollisionShape * colshape1 = shape1->getChildShape(i);
- btTransform childtrans1 = orgtrans1*shape1->getChildTransform(i);
+ btCollisionObjectWrapper ob1(body1Wrap, colshape1, body1Wrap->getCollisionObject(), childtrans1, -1, i);
- btCollisionObjectWrapper ob1(body1Wrap,colshape1,body1Wrap->getCollisionObject(),childtrans1,-1,i);
-
const btCollisionObjectWrapper* tmp = 0;
- if (m_resultOut->getBody0Wrap()->getCollisionObject()==ob1.getCollisionObject())
+ if (m_resultOut->getBody0Wrap()->getCollisionObject() == ob1.getCollisionObject())
{
tmp = m_resultOut->getBody0Wrap();
m_resultOut->setBody0Wrap(&ob1);
- } else
+ }
+ else
{
tmp = m_resultOut->getBody1Wrap();
m_resultOut->setBody1Wrap(&ob1);
}
//collide child shape
gimpact_vs_shape(body0Wrap, &ob1,
- shape0,colshape1,swapped);
+ shape0, colshape1, swapped);
- if (m_resultOut->getBody0Wrap()->getCollisionObject()==ob1.getCollisionObject())
+ if (m_resultOut->getBody0Wrap()->getCollisionObject() == ob1.getCollisionObject())
{
m_resultOut->setBody0Wrap(tmp);
- } else
+ }
+ else
{
m_resultOut->setBody1Wrap(tmp);
}
@@ -723,27 +658,25 @@ void btGImpactCollisionAlgorithm::gimpact_vs_compoundshape(const btCollisionObje
}
void btGImpactCollisionAlgorithm::gimpacttrimeshpart_vs_plane_collision(
- const btCollisionObjectWrapper * body0Wrap,
- const btCollisionObjectWrapper * body1Wrap,
- const btGImpactMeshShapePart * shape0,
- const btStaticPlaneShape * shape1,bool swapped)
+ const btCollisionObjectWrapper* body0Wrap,
+ const btCollisionObjectWrapper* body1Wrap,
+ const btGImpactMeshShapePart* shape0,
+ const btStaticPlaneShape* shape1, bool swapped)
{
-
-
btTransform orgtrans0 = body0Wrap->getWorldTransform();
btTransform orgtrans1 = body1Wrap->getWorldTransform();
- const btPlaneShape * planeshape = static_cast<const btPlaneShape *>(shape1);
+ const btPlaneShape* planeshape = static_cast<const btPlaneShape*>(shape1);
btVector4 plane;
- planeshape->get_plane_equation_transformed(orgtrans1,plane);
+ planeshape->get_plane_equation_transformed(orgtrans1, plane);
//test box against plane
btAABB tribox;
- shape0->getAabb(orgtrans0,tribox.m_min,tribox.m_max);
+ shape0->getAabb(orgtrans0, tribox.m_min, tribox.m_max);
tribox.increment_margin(planeshape->getMargin());
- if( tribox.plane_classify(plane)!= BT_CONST_COLLIDE_PLANE) return;
+ if (tribox.plane_classify(plane) != BT_CONST_COLLIDE_PLANE) return;
shape0->lockChildShapes();
@@ -751,28 +684,28 @@ void btGImpactCollisionAlgorithm::gimpacttrimeshpart_vs_plane_collision(
btVector3 vertex;
int vi = shape0->getVertexCount();
- while(vi--)
+ while (vi--)
{
- shape0->getVertex(vi,vertex);
+ shape0->getVertex(vi, vertex);
vertex = orgtrans0(vertex);
btScalar distance = vertex.dot(plane) - plane[3] - margin;
- if(distance<0.0)//add contact
+ if (distance < 0.0) //add contact
{
- if(swapped)
+ if (swapped)
{
addContactPoint(body1Wrap, body0Wrap,
- vertex,
- -plane,
- distance);
+ vertex,
+ -plane,
+ distance);
}
else
{
addContactPoint(body0Wrap, body1Wrap,
- vertex,
- plane,
- distance);
+ vertex,
+ plane,
+ distance);
}
}
}
@@ -780,69 +713,64 @@ void btGImpactCollisionAlgorithm::gimpacttrimeshpart_vs_plane_collision(
shape0->unlockChildShapes();
}
-
-
-
-class btGImpactTriangleCallback: public btTriangleCallback
+class btGImpactTriangleCallback : public btTriangleCallback
{
public:
- btGImpactCollisionAlgorithm * algorithm;
- const btCollisionObjectWrapper * body0Wrap;
- const btCollisionObjectWrapper * body1Wrap;
- const btGImpactShapeInterface * gimpactshape0;
+ btGImpactCollisionAlgorithm* algorithm;
+ const btCollisionObjectWrapper* body0Wrap;
+ const btCollisionObjectWrapper* body1Wrap;
+ const btGImpactShapeInterface* gimpactshape0;
bool swapped;
btScalar margin;
virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex)
{
- btTriangleShapeEx tri1(triangle[0],triangle[1],triangle[2]);
+ btTriangleShapeEx tri1(triangle[0], triangle[1], triangle[2]);
tri1.setMargin(margin);
- if(swapped)
- {
- algorithm->setPart0(partId);
- algorithm->setFace0(triangleIndex);
- }
- else
- {
- algorithm->setPart1(partId);
- algorithm->setFace1(triangleIndex);
- }
-
- btCollisionObjectWrapper ob1Wrap(body1Wrap,&tri1,body1Wrap->getCollisionObject(),body1Wrap->getWorldTransform(),partId,triangleIndex);
- const btCollisionObjectWrapper * tmp = 0;
-
- if (algorithm->internalGetResultOut()->getBody0Wrap()->getCollisionObject()==ob1Wrap.getCollisionObject())
+ if (swapped)
+ {
+ algorithm->setPart0(partId);
+ algorithm->setFace0(triangleIndex);
+ }
+ else
+ {
+ algorithm->setPart1(partId);
+ algorithm->setFace1(triangleIndex);
+ }
+
+ btCollisionObjectWrapper ob1Wrap(body1Wrap, &tri1, body1Wrap->getCollisionObject(), body1Wrap->getWorldTransform(), partId, triangleIndex);
+ const btCollisionObjectWrapper* tmp = 0;
+
+ if (algorithm->internalGetResultOut()->getBody0Wrap()->getCollisionObject() == ob1Wrap.getCollisionObject())
{
tmp = algorithm->internalGetResultOut()->getBody0Wrap();
algorithm->internalGetResultOut()->setBody0Wrap(&ob1Wrap);
- } else
+ }
+ else
{
tmp = algorithm->internalGetResultOut()->getBody1Wrap();
algorithm->internalGetResultOut()->setBody1Wrap(&ob1Wrap);
}
-
+
algorithm->gimpact_vs_shape(
- body0Wrap,&ob1Wrap,gimpactshape0,&tri1,swapped);
+ body0Wrap, &ob1Wrap, gimpactshape0, &tri1, swapped);
- if (algorithm->internalGetResultOut()->getBody0Wrap()->getCollisionObject()==ob1Wrap.getCollisionObject())
+ if (algorithm->internalGetResultOut()->getBody0Wrap()->getCollisionObject() == ob1Wrap.getCollisionObject())
{
algorithm->internalGetResultOut()->setBody0Wrap(tmp);
- } else
+ }
+ else
{
algorithm->internalGetResultOut()->setBody1Wrap(tmp);
}
-
}
};
-
-
-
void btGImpactCollisionAlgorithm::gimpact_vs_concave(
- const btCollisionObjectWrapper* body0Wrap,
- const btCollisionObjectWrapper * body1Wrap,
- const btGImpactShapeInterface * shape0,
- const btConcaveShape * shape1,bool swapped)
+ const btCollisionObjectWrapper* body0Wrap,
+ const btCollisionObjectWrapper* body1Wrap,
+ const btGImpactShapeInterface* shape0,
+ const btConcaveShape* shape1, bool swapped)
{
//create the callback
btGImpactTriangleCallback tricallback;
@@ -858,75 +786,71 @@ void btGImpactCollisionAlgorithm::gimpact_vs_concave(
gimpactInConcaveSpace = body1Wrap->getWorldTransform().inverse() * body0Wrap->getWorldTransform();
- btVector3 minAABB,maxAABB;
- shape0->getAabb(gimpactInConcaveSpace,minAABB,maxAABB);
-
- shape1->processAllTriangles(&tricallback,minAABB,maxAABB);
+ btVector3 minAABB, maxAABB;
+ shape0->getAabb(gimpactInConcaveSpace, minAABB, maxAABB);
+ shape1->processAllTriangles(&tricallback, minAABB, maxAABB);
}
-
-
-void btGImpactCollisionAlgorithm::processCollision (const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+void btGImpactCollisionAlgorithm::processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
- clearCache();
+ clearCache();
- m_resultOut = resultOut;
+ m_resultOut = resultOut;
m_dispatchInfo = &dispatchInfo;
- const btGImpactShapeInterface * gimpactshape0;
- const btGImpactShapeInterface * gimpactshape1;
+ const btGImpactShapeInterface* gimpactshape0;
+ const btGImpactShapeInterface* gimpactshape1;
- if (body0Wrap->getCollisionShape()->getShapeType()==GIMPACT_SHAPE_PROXYTYPE)
+ if (body0Wrap->getCollisionShape()->getShapeType() == GIMPACT_SHAPE_PROXYTYPE)
{
- gimpactshape0 = static_cast<const btGImpactShapeInterface *>(body0Wrap->getCollisionShape());
+ gimpactshape0 = static_cast<const btGImpactShapeInterface*>(body0Wrap->getCollisionShape());
- if( body1Wrap->getCollisionShape()->getShapeType()==GIMPACT_SHAPE_PROXYTYPE )
+ if (body1Wrap->getCollisionShape()->getShapeType() == GIMPACT_SHAPE_PROXYTYPE)
{
- gimpactshape1 = static_cast<const btGImpactShapeInterface *>(body1Wrap->getCollisionShape());
+ gimpactshape1 = static_cast<const btGImpactShapeInterface*>(body1Wrap->getCollisionShape());
- gimpact_vs_gimpact(body0Wrap,body1Wrap,gimpactshape0,gimpactshape1);
+ gimpact_vs_gimpact(body0Wrap, body1Wrap, gimpactshape0, gimpactshape1);
}
else
{
- gimpact_vs_shape(body0Wrap,body1Wrap,gimpactshape0,body1Wrap->getCollisionShape(),false);
+ gimpact_vs_shape(body0Wrap, body1Wrap, gimpactshape0, body1Wrap->getCollisionShape(), false);
}
-
}
- else if (body1Wrap->getCollisionShape()->getShapeType()==GIMPACT_SHAPE_PROXYTYPE )
+ else if (body1Wrap->getCollisionShape()->getShapeType() == GIMPACT_SHAPE_PROXYTYPE)
{
- gimpactshape1 = static_cast<const btGImpactShapeInterface *>(body1Wrap->getCollisionShape());
+ gimpactshape1 = static_cast<const btGImpactShapeInterface*>(body1Wrap->getCollisionShape());
- gimpact_vs_shape(body1Wrap,body0Wrap,gimpactshape1,body0Wrap->getCollisionShape(),true);
+ gimpact_vs_shape(body1Wrap, body0Wrap, gimpactshape1, body0Wrap->getCollisionShape(), true);
}
-}
+ // Ensure that gContactProcessedCallback is called for concave shapes.
+ if (getLastManifold())
+ {
+ m_resultOut->refreshContactPoints();
+ }
+}
-btScalar btGImpactCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+btScalar btGImpactCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
return 1.f;
-
}
///////////////////////////////////// REGISTERING ALGORITHM //////////////////////////////////////////////
-
-
//! Use this function for register the algorithm externally
-void btGImpactCollisionAlgorithm::registerAlgorithm(btCollisionDispatcher * dispatcher)
+void btGImpactCollisionAlgorithm::registerAlgorithm(btCollisionDispatcher* dispatcher)
{
-
static btGImpactCollisionAlgorithm::CreateFunc s_gimpact_cf;
int i;
- for ( i = 0;i < MAX_BROADPHASE_COLLISION_TYPES ;i++ )
+ for (i = 0; i < MAX_BROADPHASE_COLLISION_TYPES; i++)
{
- dispatcher->registerCollisionCreateFunc(GIMPACT_SHAPE_PROXYTYPE,i ,&s_gimpact_cf);
+ dispatcher->registerCollisionCreateFunc(GIMPACT_SHAPE_PROXYTYPE, i, &s_gimpact_cf);
}
- for ( i = 0;i < MAX_BROADPHASE_COLLISION_TYPES ;i++ )
+ for (i = 0; i < MAX_BROADPHASE_COLLISION_TYPES; i++)
{
- dispatcher->registerCollisionCreateFunc(i,GIMPACT_SHAPE_PROXYTYPE ,&s_gimpact_cf);
+ dispatcher->registerCollisionCreateFunc(i, GIMPACT_SHAPE_PROXYTYPE, &s_gimpact_cf);
}
-
}
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h b/thirdparty/bullet/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h
index 3e5675f729..a368c8a0c0 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h
@@ -42,7 +42,6 @@ class btDispatcher;
#include "LinearMath/btIDebugDraw.h"
#include "BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h"
-
//! Collision Algorithm for GImpact Shapes
/*!
For register this algorithm in Bullet, proceed as following:
@@ -54,36 +53,35 @@ btGImpactCollisionAlgorithm::registerAlgorithm(dispatcher);
class btGImpactCollisionAlgorithm : public btActivatingCollisionAlgorithm
{
protected:
- btCollisionAlgorithm * m_convex_algorithm;
- btPersistentManifold * m_manifoldPtr;
+ btCollisionAlgorithm* m_convex_algorithm;
+ btPersistentManifold* m_manifoldPtr;
btManifoldResult* m_resultOut;
- const btDispatcherInfo * m_dispatchInfo;
+ 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)
+ SIMD_FORCE_INLINE btPersistentManifold* newContactManifold(const btCollisionObject* body0, const btCollisionObject* body1)
{
- m_manifoldPtr = m_dispatcher->getNewManifold(body0,body1);
+ m_manifoldPtr = m_dispatcher->getNewManifold(body0, body1);
return m_manifoldPtr;
}
SIMD_FORCE_INLINE void destroyConvexAlgorithm()
{
- if(m_convex_algorithm)
+ if (m_convex_algorithm)
{
m_convex_algorithm->~btCollisionAlgorithm();
- m_dispatcher->freeCollisionAlgorithm( m_convex_algorithm);
+ m_dispatcher->freeCollisionAlgorithm(m_convex_algorithm);
m_convex_algorithm = NULL;
}
}
SIMD_FORCE_INLINE void destroyContactManifolds()
{
- if(m_manifoldPtr == NULL) return;
+ if (m_manifoldPtr == NULL) return;
m_dispatcher->releaseManifold(m_manifoldPtr);
m_manifoldPtr = NULL;
}
@@ -104,207 +102,187 @@ protected:
return m_manifoldPtr;
}
-
// Call before process collision
- SIMD_FORCE_INLINE void checkManifold(const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap)
+ SIMD_FORCE_INLINE void checkManifold(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap)
{
- if(getLastManifold() == 0)
+ if (getLastManifold() == 0)
{
- newContactManifold(body0Wrap->getCollisionObject(),body1Wrap->getCollisionObject());
+ newContactManifold(body0Wrap->getCollisionObject(), body1Wrap->getCollisionObject());
}
m_resultOut->setPersistentManifold(getLastManifold());
}
// Call before process collision
- SIMD_FORCE_INLINE btCollisionAlgorithm * newAlgorithm(const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap)
+ SIMD_FORCE_INLINE btCollisionAlgorithm* newAlgorithm(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap)
{
- checkManifold(body0Wrap,body1Wrap);
+ checkManifold(body0Wrap, body1Wrap);
- btCollisionAlgorithm * convex_algorithm = m_dispatcher->findAlgorithm(
- body0Wrap,body1Wrap,getLastManifold(), BT_CONTACT_POINT_ALGORITHMS);
- return convex_algorithm ;
+ 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)
+ SIMD_FORCE_INLINE void checkConvexAlgorithm(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap)
{
- if(m_convex_algorithm) return;
- m_convex_algorithm = newAlgorithm(body0Wrap,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);
-
-
- void addContactPoint(const btCollisionObjectWrapper * body0Wrap,
- const btCollisionObjectWrapper * body1Wrap,
- const btVector3 & point,
- const btVector3 & normal,
- btScalar distance);
-
-//! Collision routines
-//!@{
+ //! Collision routines
+ //!@{
void collide_gjk_triangles(const btCollisionObjectWrapper* body0Wrap,
- const btCollisionObjectWrapper* body1Wrap,
- const btGImpactMeshShapePart * shape0,
- const btGImpactMeshShapePart * shape1,
- const int * pairs, int pair_count);
+ 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);
-
-
-
+ 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);
+ 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);
-
-
+ 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);
+ 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<int> & collided_primitives);
-
+ const btTransform& trans0,
+ const btTransform& trans1,
+ const btGImpactShapeInterface* shape0,
+ const btCollisionShape* shape1,
+ btAlignedObjectArray<int>& collided_primitives);
void gimpacttrimeshpart_vs_plane_collision(
- const btCollisionObjectWrapper * body0Wrap,
- const btCollisionObjectWrapper * body1Wrap,
- const btGImpactMeshShapePart * shape0,
- const btStaticPlaneShape * shape1,bool swapped);
-
+ 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);
+ 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);
+ 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);
+ btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut);
- virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
+ virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
{
if (m_manifoldPtr)
manifoldArray.push_back(m_manifoldPtr);
}
- btManifoldResult* internalGetResultOut()
+ btManifoldResult* internalGetResultOut()
{
return m_resultOut;
}
- struct CreateFunc :public btCollisionAlgorithmCreateFunc
+ struct CreateFunc : public btCollisionAlgorithmCreateFunc
{
- virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap)
+ 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);
+ return new (mem) btGImpactCollisionAlgorithm(ci, body0Wrap, body1Wrap);
}
};
//! Use this function for register the algorithm externally
- static void registerAlgorithm(btCollisionDispatcher * dispatcher);
+ 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
+#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);
+ 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);
+ 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_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;
- }
+ 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
+#endif //BT_GIMPACT_BVH_CONCAVE_COLLISION_ALGORITHM_H
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/btGImpactMassUtil.h b/thirdparty/bullet/BulletCollision/Gimpact/btGImpactMassUtil.h
index 2543aefcfc..1cde46ed8b 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/btGImpactMassUtil.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/btGImpactMassUtil.h
@@ -21,40 +21,36 @@ subject to the following restrictions:
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)
+ const btVector3& source_inertia, const btVector3& added_inertia, const btTransform& transform)
{
- btMatrix3x3 rotatedTensor = transform.getBasis().scaled(added_inertia) * transform.getBasis().transpose();
+ btMatrix3x3 rotatedTensor = transform.getBasis().scaled(added_inertia) * transform.getBasis().transpose();
btScalar x2 = transform.getOrigin()[0];
- x2*= x2;
+ x2 *= x2;
btScalar y2 = transform.getOrigin()[1];
- y2*= y2;
+ y2 *= y2;
btScalar z2 = transform.getOrigin()[2];
- z2*= z2;
+ z2 *= z2;
- btScalar ix = rotatedTensor[0][0]*(y2+z2);
- btScalar iy = rotatedTensor[1][1]*(x2+z2);
- btScalar iz = rotatedTensor[2][2]*(x2+y2);
+ 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);
+ 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)
+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));
+ 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
+#endif //GIMPACT_MESH_SHAPE_H
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/btGImpactQuantizedBvh.cpp b/thirdparty/bullet/BulletCollision/Gimpact/btGImpactQuantizedBvh.cpp
index 4528758c37..b81fc97044 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/btGImpactQuantizedBvh.cpp
+++ b/thirdparty/bullet/BulletCollision/Gimpact/btGImpactQuantizedBvh.cpp
@@ -27,11 +27,9 @@ subject to the following restrictions:
#ifdef TRI_COLLISION_PROFILING
btClock g_q_tree_clock;
-
float g_q_accum_tree_collision_time = 0;
int g_q_count_traversing = 0;
-
void bt_begin_gim02_q_tree_time()
{
g_q_tree_clock.reset();
@@ -43,11 +41,10 @@ void bt_end_gim02_q_tree_time()
g_q_count_traversing++;
}
-
//! Gets the average time in miliseconds of tree collisions
float btGImpactQuantizedBvh::getAverageTreeCollisionTime()
{
- if(g_q_count_traversing == 0) return 0;
+ if (g_q_count_traversing == 0) return 0;
float avgtime = g_q_accum_tree_collision_time;
avgtime /= (float)g_q_count_traversing;
@@ -56,99 +53,92 @@ float btGImpactQuantizedBvh::getAverageTreeCollisionTime()
g_q_count_traversing = 0;
return avgtime;
-// float avgtime = g_q_count_traversing;
-// g_q_count_traversing = 0;
-// return avgtime;
-
+ // float avgtime = g_q_count_traversing;
+ // g_q_count_traversing = 0;
+ // return avgtime;
}
-#endif //TRI_COLLISION_PROFILING
+#endif //TRI_COLLISION_PROFILING
/////////////////////// btQuantizedBvhTree /////////////////////////////////
void btQuantizedBvhTree::calc_quantization(
- GIM_BVH_DATA_ARRAY & primitive_boxes, btScalar boundMargin)
+ GIM_BVH_DATA_ARRAY& primitive_boxes, btScalar boundMargin)
{
//calc globa box
btAABB global_bound;
global_bound.invalidate();
- for (int i=0;i<primitive_boxes.size() ;i++ )
+ for (int i = 0; i < primitive_boxes.size(); i++)
{
global_bound.merge(primitive_boxes[i].m_bound);
}
bt_calc_quantization_parameters(
- m_global_bound.m_min,m_global_bound.m_max,m_bvhQuantization,global_bound.m_min,global_bound.m_max,boundMargin);
-
+ m_global_bound.m_min, m_global_bound.m_max, m_bvhQuantization, global_bound.m_min, global_bound.m_max, boundMargin);
}
-
-
int btQuantizedBvhTree::_calc_splitting_axis(
- GIM_BVH_DATA_ARRAY & primitive_boxes, int startIndex, int endIndex)
+ GIM_BVH_DATA_ARRAY& primitive_boxes, int startIndex, int endIndex)
{
-
int i;
- btVector3 means(btScalar(0.),btScalar(0.),btScalar(0.));
- btVector3 variance(btScalar(0.),btScalar(0.),btScalar(0.));
- int numIndices = endIndex-startIndex;
+ btVector3 means(btScalar(0.), btScalar(0.), btScalar(0.));
+ btVector3 variance(btScalar(0.), btScalar(0.), btScalar(0.));
+ int numIndices = endIndex - startIndex;
- for (i=startIndex;i<endIndex;i++)
+ for (i = startIndex; i < endIndex; i++)
{
- btVector3 center = btScalar(0.5)*(primitive_boxes[i].m_bound.m_max +
- primitive_boxes[i].m_bound.m_min);
- means+=center;
+ btVector3 center = btScalar(0.5) * (primitive_boxes[i].m_bound.m_max +
+ primitive_boxes[i].m_bound.m_min);
+ means += center;
}
- means *= (btScalar(1.)/(btScalar)numIndices);
+ means *= (btScalar(1.) / (btScalar)numIndices);
- for (i=startIndex;i<endIndex;i++)
+ for (i = startIndex; i < endIndex; i++)
{
- btVector3 center = btScalar(0.5)*(primitive_boxes[i].m_bound.m_max +
- primitive_boxes[i].m_bound.m_min);
- btVector3 diff2 = center-means;
+ btVector3 center = btScalar(0.5) * (primitive_boxes[i].m_bound.m_max +
+ primitive_boxes[i].m_bound.m_min);
+ btVector3 diff2 = center - means;
diff2 = diff2 * diff2;
variance += diff2;
}
- variance *= (btScalar(1.)/ ((btScalar)numIndices-1) );
+ variance *= (btScalar(1.) / ((btScalar)numIndices - 1));
return variance.maxAxis();
}
-
int btQuantizedBvhTree::_sort_and_calc_splitting_index(
- GIM_BVH_DATA_ARRAY & primitive_boxes, int startIndex,
+ GIM_BVH_DATA_ARRAY& primitive_boxes, int startIndex,
int endIndex, int splitAxis)
{
int i;
- int splitIndex =startIndex;
+ int splitIndex = startIndex;
int numIndices = endIndex - startIndex;
// average of centers
btScalar splitValue = 0.0f;
- btVector3 means(btScalar(0.),btScalar(0.),btScalar(0.));
- for (i=startIndex;i<endIndex;i++)
+ btVector3 means(btScalar(0.), btScalar(0.), btScalar(0.));
+ for (i = startIndex; i < endIndex; i++)
{
- btVector3 center = btScalar(0.5)*(primitive_boxes[i].m_bound.m_max +
- primitive_boxes[i].m_bound.m_min);
- means+=center;
+ btVector3 center = btScalar(0.5) * (primitive_boxes[i].m_bound.m_max +
+ primitive_boxes[i].m_bound.m_min);
+ means += center;
}
- means *= (btScalar(1.)/(btScalar)numIndices);
+ means *= (btScalar(1.) / (btScalar)numIndices);
splitValue = means[splitAxis];
-
//sort leafNodes so all values larger then splitValue comes first, and smaller values start from 'splitIndex'.
- for (i=startIndex;i<endIndex;i++)
+ for (i = startIndex; i < endIndex; i++)
{
- btVector3 center = btScalar(0.5)*(primitive_boxes[i].m_bound.m_max +
- primitive_boxes[i].m_bound.m_min);
+ btVector3 center = btScalar(0.5) * (primitive_boxes[i].m_bound.m_max +
+ primitive_boxes[i].m_bound.m_min);
if (center[splitAxis] > splitValue)
{
//swap
- primitive_boxes.swap(i,splitIndex);
+ primitive_boxes.swap(i, splitIndex);
//swapLeafNodes(i,splitIndex);
splitIndex++;
}
@@ -163,32 +153,30 @@ int btQuantizedBvhTree::_sort_and_calc_splitting_index(
//bool unbalanced2 = true;
//this should be safe too:
- int rangeBalancedIndices = numIndices/3;
- bool unbalanced = ((splitIndex<=(startIndex+rangeBalancedIndices)) || (splitIndex >=(endIndex-1-rangeBalancedIndices)));
+ int rangeBalancedIndices = numIndices / 3;
+ bool unbalanced = ((splitIndex <= (startIndex + rangeBalancedIndices)) || (splitIndex >= (endIndex - 1 - rangeBalancedIndices)));
if (unbalanced)
{
- splitIndex = startIndex+ (numIndices>>1);
+ splitIndex = startIndex + (numIndices >> 1);
}
- btAssert(!((splitIndex==startIndex) || (splitIndex == (endIndex))));
+ btAssert(!((splitIndex == startIndex) || (splitIndex == (endIndex))));
return splitIndex;
-
}
-
-void btQuantizedBvhTree::_build_sub_tree(GIM_BVH_DATA_ARRAY & primitive_boxes, int startIndex, int endIndex)
+void btQuantizedBvhTree::_build_sub_tree(GIM_BVH_DATA_ARRAY& primitive_boxes, int startIndex, int endIndex)
{
int curIndex = m_num_nodes;
m_num_nodes++;
- btAssert((endIndex-startIndex)>0);
+ btAssert((endIndex - startIndex) > 0);
- if ((endIndex-startIndex)==1)
+ if ((endIndex - startIndex) == 1)
{
- //We have a leaf node
- setNodeBound(curIndex,primitive_boxes[startIndex].m_bound);
+ //We have a leaf node
+ setNodeBound(curIndex, primitive_boxes[startIndex].m_bound);
m_node_array[curIndex].setDataIndex(primitive_boxes[startIndex].m_data);
return;
@@ -196,48 +184,43 @@ void btQuantizedBvhTree::_build_sub_tree(GIM_BVH_DATA_ARRAY & primitive_boxes, i
//calculate Best Splitting Axis and where to split it. Sort the incoming 'leafNodes' array within range 'startIndex/endIndex'.
//split axis
- int splitIndex = _calc_splitting_axis(primitive_boxes,startIndex,endIndex);
+ int splitIndex = _calc_splitting_axis(primitive_boxes, startIndex, endIndex);
splitIndex = _sort_and_calc_splitting_index(
- primitive_boxes,startIndex,endIndex,
- splitIndex//split axis
- );
-
+ primitive_boxes, startIndex, endIndex,
+ splitIndex //split axis
+ );
//calc this node bounding box
btAABB node_bound;
node_bound.invalidate();
- for (int i=startIndex;i<endIndex;i++)
+ for (int i = startIndex; i < endIndex; i++)
{
node_bound.merge(primitive_boxes[i].m_bound);
}
- setNodeBound(curIndex,node_bound);
-
+ setNodeBound(curIndex, node_bound);
//build left branch
- _build_sub_tree(primitive_boxes, startIndex, splitIndex );
-
+ _build_sub_tree(primitive_boxes, startIndex, splitIndex);
//build right branch
- _build_sub_tree(primitive_boxes, splitIndex ,endIndex);
+ _build_sub_tree(primitive_boxes, splitIndex, endIndex);
m_node_array[curIndex].setEscapeIndex(m_num_nodes - curIndex);
-
-
}
//! stackless build tree
void btQuantizedBvhTree::build_tree(
- GIM_BVH_DATA_ARRAY & primitive_boxes)
+ GIM_BVH_DATA_ARRAY& primitive_boxes)
{
calc_quantization(primitive_boxes);
// initialize node count to 0
m_num_nodes = 0;
// allocate nodes
- m_node_array.resize(primitive_boxes.size()*2);
+ m_node_array.resize(primitive_boxes.size() * 2);
_build_sub_tree(primitive_boxes, 0, primitive_boxes.size());
}
@@ -247,13 +230,13 @@ void btQuantizedBvhTree::build_tree(
void btGImpactQuantizedBvh::refit()
{
int nodecount = getNodeCount();
- while(nodecount--)
+ while (nodecount--)
{
- if(isLeafNode(nodecount))
+ if (isLeafNode(nodecount))
{
btAABB leafbox;
- m_primitive_manager->get_primitive_box(getNodeData(nodecount),leafbox);
- setNodeBound(nodecount,leafbox);
+ m_primitive_manager->get_primitive_box(getNodeData(nodecount), leafbox);
+ setNodeBound(nodecount, leafbox);
}
else
{
@@ -265,20 +248,20 @@ void btGImpactQuantizedBvh::refit()
btAABB temp_box;
int child_node = getLeftNode(nodecount);
- if(child_node)
+ if (child_node)
{
- getNodeBound(child_node,temp_box);
+ getNodeBound(child_node, temp_box);
bound.merge(temp_box);
}
child_node = getRightNode(nodecount);
- if(child_node)
+ if (child_node)
{
- getNodeBound(child_node,temp_box);
+ getNodeBound(child_node, temp_box);
bound.merge(temp_box);
}
- setNodeBound(nodecount,bound);
+ setNodeBound(nodecount, bound);
}
}
}
@@ -290,17 +273,17 @@ void btGImpactQuantizedBvh::buildSet()
GIM_BVH_DATA_ARRAY primitive_boxes;
primitive_boxes.resize(m_primitive_manager->get_primitive_count());
- for (int i = 0;i<primitive_boxes.size() ;i++ )
+ for (int 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_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
-bool btGImpactQuantizedBvh::boxQuery(const btAABB & box, btAlignedObjectArray<int> & collided_results) const
+bool btGImpactQuantizedBvh::boxQuery(const btAABB& box, btAlignedObjectArray<int>& collided_results) const
{
int curIndex = 0;
int numNodes = getNodeCount();
@@ -310,16 +293,14 @@ bool btGImpactQuantizedBvh::boxQuery(const btAABB & box, btAlignedObjectArray<in
unsigned short quantizedMin[3];
unsigned short quantizedMax[3];
- m_box_tree.quantizePoint(quantizedMin,box.m_min);
- m_box_tree.quantizePoint(quantizedMax,box.m_max);
-
+ m_box_tree.quantizePoint(quantizedMin, box.m_min);
+ m_box_tree.quantizePoint(quantizedMax, box.m_max);
while (curIndex < numNodes)
{
-
//catch bugs in tree data
- bool aabbOverlap = m_box_tree.testQuantizedBoxOverlapp(curIndex, quantizedMin,quantizedMax);
+ bool aabbOverlap = m_box_tree.testQuantizedBoxOverlapp(curIndex, quantizedMin, quantizedMax);
bool isleafnode = isLeafNode(curIndex);
if (isleafnode && aabbOverlap)
@@ -335,19 +316,17 @@ bool btGImpactQuantizedBvh::boxQuery(const btAABB & box, btAlignedObjectArray<in
else
{
//skip node
- curIndex+= getEscapeNodeIndex(curIndex);
+ curIndex += getEscapeNodeIndex(curIndex);
}
}
- if(collided_results.size()>0) return true;
+ if (collided_results.size() > 0) return true;
return false;
}
-
-
//! returns the indices of the primitives in the m_primitive_manager
bool btGImpactQuantizedBvh::rayQuery(
- const btVector3 & ray_dir,const btVector3 & ray_origin ,
- btAlignedObjectArray<int> & collided_results) const
+ const btVector3& ray_dir, const btVector3& ray_origin,
+ btAlignedObjectArray<int>& collided_results) const
{
int curIndex = 0;
int numNodes = getNodeCount();
@@ -355,16 +334,16 @@ bool btGImpactQuantizedBvh::rayQuery(
while (curIndex < numNodes)
{
btAABB bound;
- getNodeBound(curIndex,bound);
+ getNodeBound(curIndex, bound);
//catch bugs in tree data
- bool aabbOverlap = bound.collide_ray(ray_origin,ray_dir);
+ bool aabbOverlap = bound.collide_ray(ray_origin, ray_dir);
bool isleafnode = isLeafNode(curIndex);
if (isleafnode && aabbOverlap)
{
- collided_results.push_back(getNodeData( curIndex));
+ collided_results.push_back(getNodeData(curIndex));
}
if (aabbOverlap || isleafnode)
@@ -375,154 +354,133 @@ bool btGImpactQuantizedBvh::rayQuery(
else
{
//skip node
- curIndex+= getEscapeNodeIndex(curIndex);
+ curIndex += getEscapeNodeIndex(curIndex);
}
}
- if(collided_results.size()>0) return true;
+ if (collided_results.size() > 0) return true;
return false;
}
-
SIMD_FORCE_INLINE bool _quantized_node_collision(
- const btGImpactQuantizedBvh * boxset0, const btGImpactQuantizedBvh * boxset1,
- const BT_BOX_BOX_TRANSFORM_CACHE & trans_cache_1to0,
- int node0 ,int node1, bool complete_primitive_tests)
+ const btGImpactQuantizedBvh* boxset0, const btGImpactQuantizedBvh* boxset1,
+ const BT_BOX_BOX_TRANSFORM_CACHE& trans_cache_1to0,
+ int node0, int node1, bool complete_primitive_tests)
{
btAABB box0;
- boxset0->getNodeBound(node0,box0);
+ boxset0->getNodeBound(node0, box0);
btAABB box1;
- boxset1->getNodeBound(node1,box1);
-
- return box0.overlapping_trans_cache(box1,trans_cache_1to0,complete_primitive_tests );
-// box1.appy_transform_trans_cache(trans_cache_1to0);
-// return box0.has_collision(box1);
+ boxset1->getNodeBound(node1, box1);
+ return box0.overlapping_trans_cache(box1, trans_cache_1to0, complete_primitive_tests);
+ // box1.appy_transform_trans_cache(trans_cache_1to0);
+ // return box0.has_collision(box1);
}
-
//stackless recursive collision routine
static void _find_quantized_collision_pairs_recursive(
- const btGImpactQuantizedBvh * boxset0, const btGImpactQuantizedBvh * boxset1,
- btPairSet * collision_pairs,
- const BT_BOX_BOX_TRANSFORM_CACHE & trans_cache_1to0,
+ const btGImpactQuantizedBvh* boxset0, const btGImpactQuantizedBvh* boxset1,
+ btPairSet* collision_pairs,
+ const BT_BOX_BOX_TRANSFORM_CACHE& trans_cache_1to0,
int node0, int node1, bool complete_primitive_tests)
{
+ if (_quantized_node_collision(
+ boxset0, boxset1, trans_cache_1to0,
+ node0, node1, complete_primitive_tests) == false) return; //avoid colliding internal nodes
-
-
- if( _quantized_node_collision(
- boxset0,boxset1,trans_cache_1to0,
- node0,node1,complete_primitive_tests) ==false) return;//avoid colliding internal nodes
-
- if(boxset0->isLeafNode(node0))
+ if (boxset0->isLeafNode(node0))
{
- if(boxset1->isLeafNode(node1))
+ if (boxset1->isLeafNode(node1))
{
// collision result
collision_pairs->push_pair(
- boxset0->getNodeData(node0),boxset1->getNodeData(node1));
+ boxset0->getNodeData(node0), boxset1->getNodeData(node1));
return;
}
else
{
-
//collide left recursive
_find_quantized_collision_pairs_recursive(
- boxset0,boxset1,
- collision_pairs,trans_cache_1to0,
- node0,boxset1->getLeftNode(node1),false);
+ boxset0, boxset1,
+ collision_pairs, trans_cache_1to0,
+ node0, boxset1->getLeftNode(node1), false);
//collide right recursive
_find_quantized_collision_pairs_recursive(
- boxset0,boxset1,
- collision_pairs,trans_cache_1to0,
- node0,boxset1->getRightNode(node1),false);
-
-
+ boxset0, boxset1,
+ collision_pairs, trans_cache_1to0,
+ node0, boxset1->getRightNode(node1), false);
}
}
else
{
- if(boxset1->isLeafNode(node1))
+ if (boxset1->isLeafNode(node1))
{
-
//collide left recursive
_find_quantized_collision_pairs_recursive(
- boxset0,boxset1,
- collision_pairs,trans_cache_1to0,
- boxset0->getLeftNode(node0),node1,false);
-
+ boxset0, boxset1,
+ collision_pairs, trans_cache_1to0,
+ boxset0->getLeftNode(node0), node1, false);
//collide right recursive
_find_quantized_collision_pairs_recursive(
- boxset0,boxset1,
- collision_pairs,trans_cache_1to0,
- boxset0->getRightNode(node0),node1,false);
-
-
+ boxset0, boxset1,
+ collision_pairs, trans_cache_1to0,
+ boxset0->getRightNode(node0), node1, false);
}
else
{
//collide left0 left1
-
-
_find_quantized_collision_pairs_recursive(
- boxset0,boxset1,
- collision_pairs,trans_cache_1to0,
- boxset0->getLeftNode(node0),boxset1->getLeftNode(node1),false);
+ boxset0, boxset1,
+ collision_pairs, trans_cache_1to0,
+ boxset0->getLeftNode(node0), boxset1->getLeftNode(node1), false);
//collide left0 right1
_find_quantized_collision_pairs_recursive(
- boxset0,boxset1,
- collision_pairs,trans_cache_1to0,
- boxset0->getLeftNode(node0),boxset1->getRightNode(node1),false);
-
+ boxset0, boxset1,
+ collision_pairs, trans_cache_1to0,
+ boxset0->getLeftNode(node0), boxset1->getRightNode(node1), false);
//collide right0 left1
_find_quantized_collision_pairs_recursive(
- boxset0,boxset1,
- collision_pairs,trans_cache_1to0,
- boxset0->getRightNode(node0),boxset1->getLeftNode(node1),false);
+ boxset0, boxset1,
+ collision_pairs, trans_cache_1to0,
+ boxset0->getRightNode(node0), boxset1->getLeftNode(node1), false);
//collide right0 right1
_find_quantized_collision_pairs_recursive(
- boxset0,boxset1,
- collision_pairs,trans_cache_1to0,
- boxset0->getRightNode(node0),boxset1->getRightNode(node1),false);
+ boxset0, boxset1,
+ collision_pairs, trans_cache_1to0,
+ boxset0->getRightNode(node0), boxset1->getRightNode(node1), false);
- }// else if node1 is not a leaf
- }// else if node0 is not a leaf
+ } // else if node1 is not a leaf
+ } // else if node0 is not a leaf
}
-
-void btGImpactQuantizedBvh::find_collision(const btGImpactQuantizedBvh * boxset0, const btTransform & trans0,
- const btGImpactQuantizedBvh * boxset1, const btTransform & trans1,
- btPairSet & collision_pairs)
+void btGImpactQuantizedBvh::find_collision(const btGImpactQuantizedBvh* boxset0, const btTransform& trans0,
+ const btGImpactQuantizedBvh* boxset1, const btTransform& trans1,
+ btPairSet& collision_pairs)
{
-
- if(boxset0->getNodeCount()==0 || boxset1->getNodeCount()==0 ) return;
+ if (boxset0->getNodeCount() == 0 || boxset1->getNodeCount() == 0) return;
BT_BOX_BOX_TRANSFORM_CACHE trans_cache_1to0;
- trans_cache_1to0.calc_from_homogenic(trans0,trans1);
+ trans_cache_1to0.calc_from_homogenic(trans0, trans1);
#ifdef TRI_COLLISION_PROFILING
bt_begin_gim02_q_tree_time();
-#endif //TRI_COLLISION_PROFILING
+#endif //TRI_COLLISION_PROFILING
_find_quantized_collision_pairs_recursive(
- boxset0,boxset1,
- &collision_pairs,trans_cache_1to0,0,0,true);
+ boxset0, boxset1,
+ &collision_pairs, trans_cache_1to0, 0, 0, true);
#ifdef TRI_COLLISION_PROFILING
bt_end_gim02_q_tree_time();
-#endif //TRI_COLLISION_PROFILING
-
+#endif //TRI_COLLISION_PROFILING
}
-
-
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/btGImpactQuantizedBvh.h b/thirdparty/bullet/BulletCollision/Gimpact/btGImpactQuantizedBvh.h
index 42e5520fc0..b231c1e832 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/btGImpactQuantizedBvh.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/btGImpactQuantizedBvh.h
@@ -28,13 +28,10 @@ subject to the following restrictions:
#include "btQuantization.h"
#include "btGImpactQuantizedBvhStructs.h"
-class GIM_QUANTIZED_BVH_NODE_ARRAY:public btAlignedObjectArray<BT_QUANTIZED_BVH_NODE>
+class GIM_QUANTIZED_BVH_NODE_ARRAY : public btAlignedObjectArray<BT_QUANTIZED_BVH_NODE>
{
};
-
-
-
//! Basic Box tree structure
class btQuantizedBvhTree
{
@@ -43,16 +40,18 @@ protected:
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) );
+ 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);
+ 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);
+ 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);
- void _build_sub_tree(GIM_BVH_DATA_ARRAY & primitive_boxes, int startIndex, int endIndex);
public:
btQuantizedBvhTree()
{
@@ -61,20 +60,19 @@ public:
//! prototype functions for box tree management
//!@{
- void build_tree(GIM_BVH_DATA_ARRAY & primitive_boxes);
+ void build_tree(GIM_BVH_DATA_ARRAY& primitive_boxes);
SIMD_FORCE_INLINE void quantizePoint(
- unsigned short * quantizedpoint, const btVector3 & point) const
+ unsigned short* quantizedpoint, const btVector3& point) const
{
- bt_quantize_clamp(quantizedpoint,point,m_global_bound.m_min,m_global_bound.m_max,m_bvhQuantization);
+ 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
+ unsigned short* quantizedMin, unsigned short* quantizedMax) const
{
- return m_node_array[node_index].testQuantizedBoxOverlapp(quantizedMin,quantizedMax);
+ return m_node_array[node_index].testQuantizedBoxOverlapp(quantizedMin, quantizedMax);
}
SIMD_FORCE_INLINE void clearNodes()
@@ -100,41 +98,41 @@ public:
return m_node_array[nodeindex].getDataIndex();
}
- SIMD_FORCE_INLINE void getNodeBound(int nodeindex, btAABB & bound) const
+ 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);
+ 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);
+ m_global_bound.m_min, m_bvhQuantization);
}
- SIMD_FORCE_INLINE void setNodeBound(int nodeindex, const btAABB & bound)
+ 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_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);
+ 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;
+ 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();
+ 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
@@ -142,7 +140,7 @@ public:
return m_node_array[nodeindex].getEscapeIndex();
}
- SIMD_FORCE_INLINE const BT_QUANTIZED_BVH_NODE * get_node_pointer(int index = 0) const
+ SIMD_FORCE_INLINE const BT_QUANTIZED_BVH_NODE* get_node_pointer(int index = 0) const
{
return &m_node_array[index];
}
@@ -150,8 +148,6 @@ public:
//!@}
};
-
-
//! Structure for containing Boxes
/*!
This class offers an structure for managing a box tree of primitives.
@@ -161,13 +157,13 @@ class btGImpactQuantizedBvh
{
protected:
btQuantizedBvhTree m_box_tree;
- btPrimitiveManagerBase * m_primitive_manager;
+ btPrimitiveManagerBase* m_primitive_manager;
protected:
//stackless refit
void refit();
-public:
+public:
//! this constructor doesn't build the tree. you must call buildSet
btGImpactQuantizedBvh()
{
@@ -175,31 +171,30 @@ public:
}
//! this constructor doesn't build the tree. you must call buildSet
- btGImpactQuantizedBvh(btPrimitiveManagerBase * primitive_manager)
+ btGImpactQuantizedBvh(btPrimitiveManagerBase* primitive_manager)
{
m_primitive_manager = primitive_manager;
}
- SIMD_FORCE_INLINE btAABB getGlobalBox() const
+ SIMD_FORCE_INLINE btAABB getGlobalBox() const
{
btAABB totalbox;
getNodeBound(0, totalbox);
return totalbox;
}
- SIMD_FORCE_INLINE void setPrimitiveManager(btPrimitiveManagerBase * primitive_manager)
+ SIMD_FORCE_INLINE void setPrimitiveManager(btPrimitiveManagerBase* primitive_manager)
{
m_primitive_manager = primitive_manager;
}
- SIMD_FORCE_INLINE btPrimitiveManagerBase * getPrimitiveManager() const
+ SIMD_FORCE_INLINE btPrimitiveManagerBase* getPrimitiveManager() const
{
return m_primitive_manager;
}
-
-//! node manager prototype functions
-///@{
+ //! node manager prototype functions
+ ///@{
//! this attemps to refit the box set.
SIMD_FORCE_INLINE void update()
@@ -211,21 +206,21 @@ public:
void buildSet();
//! returns the indices of the primitives in the m_primitive_manager
- bool boxQuery(const btAABB & box, btAlignedObjectArray<int> & collided_results) const;
+ bool boxQuery(const btAABB& box, btAlignedObjectArray<int>& 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<int> & collided_results) const
+ SIMD_FORCE_INLINE bool boxQueryTrans(const btAABB& box,
+ const btTransform& transform, btAlignedObjectArray<int>& collided_results) const
{
- btAABB transbox=box;
+ btAABB transbox = box;
transbox.appy_transform(transform);
- return boxQuery(transbox,collided_results);
+ 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<int> & collided_results) const;
+ const btVector3& ray_dir, const btVector3& ray_origin,
+ btAlignedObjectArray<int>& collided_results) const;
//! tells if this set has hierarcht
SIMD_FORCE_INLINE bool hasHierarchy() const
@@ -234,7 +229,7 @@ public:
}
//! tells if this set is a trimesh
- SIMD_FORCE_INLINE bool isTrimesh() const
+ SIMD_FORCE_INLINE bool isTrimesh() const
{
return m_primitive_manager->is_trimesh();
}
@@ -256,17 +251,16 @@ public:
return m_box_tree.getNodeData(nodeindex);
}
- SIMD_FORCE_INLINE void getNodeBound(int nodeindex, btAABB & bound) const
+ 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)
+ 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);
@@ -282,24 +276,23 @@ public:
return m_box_tree.getEscapeNodeIndex(nodeindex);
}
- SIMD_FORCE_INLINE void getNodeTriangle(int nodeindex,btPrimitiveTriangle & triangle) const
+ SIMD_FORCE_INLINE void getNodeTriangle(int nodeindex, btPrimitiveTriangle& triangle) const
{
- m_primitive_manager->get_primitive_triangle(getNodeData(nodeindex),triangle);
+ m_primitive_manager->get_primitive_triangle(getNodeData(nodeindex), triangle);
}
-
- SIMD_FORCE_INLINE const BT_QUANTIZED_BVH_NODE * get_node_pointer(int index = 0) const
+ 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
+#endif //TRI_COLLISION_PROFILING
- static void find_collision(const btGImpactQuantizedBvh * boxset1, const btTransform & trans1,
- const btGImpactQuantizedBvh * boxset2, const btTransform & trans2,
- btPairSet & collision_pairs);
+ static void find_collision(const btGImpactQuantizedBvh* boxset1, const btTransform& trans1,
+ const btGImpactQuantizedBvh* boxset2, const btTransform& trans2,
+ btPairSet& collision_pairs);
};
-#endif // GIM_BOXPRUNING_H_INCLUDED
+#endif // GIM_BOXPRUNING_H_INCLUDED
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/btGImpactQuantizedBvhStructs.h b/thirdparty/bullet/BulletCollision/Gimpact/btGImpactQuantizedBvhStructs.h
index 7dd5a1b9d0..bd50cb5b87 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/btGImpactQuantizedBvhStructs.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/btGImpactQuantizedBvhStructs.h
@@ -29,13 +29,14 @@ subject to the following restrictions:
///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
+ATTRIBUTE_ALIGNED16(struct)
+BT_QUANTIZED_BVH_NODE
{
//12 bytes
- unsigned short int m_quantizedAabbMin[3];
- unsigned short int m_quantizedAabbMax[3];
+ unsigned short int m_quantizedAabbMin[3];
+ unsigned short int m_quantizedAabbMax[3];
//4 bytes
- int m_escapeIndexOrDataIndex;
+ int m_escapeIndexOrDataIndex;
BT_QUANTIZED_BVH_NODE()
{
@@ -45,7 +46,7 @@ ATTRIBUTE_ALIGNED16 (struct) BT_QUANTIZED_BVH_NODE
SIMD_FORCE_INLINE bool isLeafNode() const
{
//skipindex is negative (internal node), triangleindex >=0 (leafnode)
- return (m_escapeIndexOrDataIndex>=0);
+ return (m_escapeIndexOrDataIndex >= 0);
}
SIMD_FORCE_INLINE int getEscapeIndex() const
@@ -72,20 +73,19 @@ ATTRIBUTE_ALIGNED16 (struct) BT_QUANTIZED_BVH_NODE
}
SIMD_FORCE_INLINE bool testQuantizedBoxOverlapp(
- unsigned short * quantizedMin,unsigned short * quantizedMax) const
+ 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])
+ 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
+#endif // GIM_QUANTIZED_SET_STRUCTS_H_INCLUDED
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/btGImpactShape.cpp b/thirdparty/bullet/BulletCollision/Gimpact/btGImpactShape.cpp
index 30c85e3fff..34c229a3ab 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/btGImpactShape.cpp
+++ b/thirdparty/bullet/BulletCollision/Gimpact/btGImpactShape.cpp
@@ -18,178 +18,169 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btGImpactShape.h"
#include "btGImpactMassUtil.h"
-
-btGImpactMeshShapePart::btGImpactMeshShapePart( btStridingMeshInterface * meshInterface, int part )
+btGImpactMeshShapePart::btGImpactMeshShapePart(btStridingMeshInterface* meshInterface, int part)
{
- // moved from .h to .cpp because of conditional compilation
- // (The setting of BT_THREADSAFE may differ between various cpp files, so it is best to
- // avoid using it in h files)
- m_primitive_manager.m_meshInterface = meshInterface;
- m_primitive_manager.m_part = part;
- m_box_set.setPrimitiveManager( &m_primitive_manager );
+ // moved from .h to .cpp because of conditional compilation
+ // (The setting of BT_THREADSAFE may differ between various cpp files, so it is best to
+ // avoid using it in h files)
+ m_primitive_manager.m_meshInterface = meshInterface;
+ m_primitive_manager.m_part = part;
+ m_box_set.setPrimitiveManager(&m_primitive_manager);
#if BT_THREADSAFE
- // If threadsafe is requested, this object uses a different lock/unlock
- // model with the btStridingMeshInterface -- lock once when the object is constructed
- // and unlock once in the destructor.
- // The other way of locking and unlocking for each collision check in the narrowphase
- // is not threadsafe. Note these are not thread-locks, they are calls to the meshInterface's
- // getLockedReadOnlyVertexIndexBase virtual function, which by default just returns a couple of
- // pointers. In theory a client could override the lock function to do all sorts of
- // things like reading data from GPU memory, or decompressing data on the fly, but such things
- // do not seem all that likely or useful, given the performance cost.
- m_primitive_manager.lock();
+ // If threadsafe is requested, this object uses a different lock/unlock
+ // model with the btStridingMeshInterface -- lock once when the object is constructed
+ // and unlock once in the destructor.
+ // The other way of locking and unlocking for each collision check in the narrowphase
+ // is not threadsafe. Note these are not thread-locks, they are calls to the meshInterface's
+ // getLockedReadOnlyVertexIndexBase virtual function, which by default just returns a couple of
+ // pointers. In theory a client could override the lock function to do all sorts of
+ // things like reading data from GPU memory, or decompressing data on the fly, but such things
+ // do not seem all that likely or useful, given the performance cost.
+ m_primitive_manager.lock();
#endif
}
btGImpactMeshShapePart::~btGImpactMeshShapePart()
{
- // moved from .h to .cpp because of conditional compilation
+ // moved from .h to .cpp because of conditional compilation
#if BT_THREADSAFE
- m_primitive_manager.unlock();
+ m_primitive_manager.unlock();
#endif
}
void btGImpactMeshShapePart::lockChildShapes() const
{
- // moved from .h to .cpp because of conditional compilation
-#if ! BT_THREADSAFE
- // called in the narrowphase -- not threadsafe!
- void * dummy = (void*) ( m_box_set.getPrimitiveManager() );
- TrimeshPrimitiveManager * dummymanager = static_cast<TrimeshPrimitiveManager *>( dummy );
- dummymanager->lock();
+ // moved from .h to .cpp because of conditional compilation
+#if !BT_THREADSAFE
+ // called in the narrowphase -- not threadsafe!
+ void* dummy = (void*)(m_box_set.getPrimitiveManager());
+ TrimeshPrimitiveManager* dummymanager = static_cast<TrimeshPrimitiveManager*>(dummy);
+ dummymanager->lock();
#endif
}
-void btGImpactMeshShapePart::unlockChildShapes() const
+void btGImpactMeshShapePart::unlockChildShapes() const
{
- // moved from .h to .cpp because of conditional compilation
-#if ! BT_THREADSAFE
- // called in the narrowphase -- not threadsafe!
- void * dummy = (void*) ( m_box_set.getPrimitiveManager() );
- TrimeshPrimitiveManager * dummymanager = static_cast<TrimeshPrimitiveManager *>( dummy );
- dummymanager->unlock();
+ // moved from .h to .cpp because of conditional compilation
+#if !BT_THREADSAFE
+ // called in the narrowphase -- not threadsafe!
+ void* dummy = (void*)(m_box_set.getPrimitiveManager());
+ TrimeshPrimitiveManager* dummymanager = static_cast<TrimeshPrimitiveManager*>(dummy);
+ dummymanager->unlock();
#endif
}
-
#define CALC_EXACT_INERTIA 1
-
-void btGImpactCompoundShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const
+void btGImpactCompoundShape::calculateLocalInertia(btScalar mass, btVector3& inertia) const
{
lockChildShapes();
#ifdef CALC_EXACT_INERTIA
- inertia.setValue(0.f,0.f,0.f);
+ inertia.setValue(0.f, 0.f, 0.f);
int i = this->getNumChildShapes();
- btScalar shapemass = mass/btScalar(i);
+ btScalar shapemass = mass / btScalar(i);
- while(i--)
+ while (i--)
{
btVector3 temp_inertia;
- m_childShapes[i]->calculateLocalInertia(shapemass,temp_inertia);
- if(childrenHasTransform())
+ m_childShapes[i]->calculateLocalInertia(shapemass, temp_inertia);
+ if (childrenHasTransform())
{
- inertia = gim_inertia_add_transformed( inertia,temp_inertia,m_childTransforms[i]);
+ inertia = gim_inertia_add_transformed(inertia, temp_inertia, m_childTransforms[i]);
}
else
{
- inertia = gim_inertia_add_transformed( inertia,temp_inertia,btTransform::getIdentity());
+ inertia = gim_inertia_add_transformed(inertia, temp_inertia, btTransform::getIdentity());
}
-
}
#else
// Calc box inertia
- btScalar lx= m_localAABB.m_max[0] - m_localAABB.m_min[0];
- btScalar ly= m_localAABB.m_max[1] - m_localAABB.m_min[1];
- btScalar lz= m_localAABB.m_max[2] - m_localAABB.m_min[2];
- const btScalar x2 = lx*lx;
- const btScalar y2 = ly*ly;
- const btScalar z2 = lz*lz;
+ btScalar lx = m_localAABB.m_max[0] - m_localAABB.m_min[0];
+ btScalar ly = m_localAABB.m_max[1] - m_localAABB.m_min[1];
+ btScalar lz = m_localAABB.m_max[2] - m_localAABB.m_min[2];
+ 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 = scaledmass * (btVector3(y2 + z2, x2 + z2, x2 + y2));
#endif
unlockChildShapes();
}
-
-
-void btGImpactMeshShapePart::calculateLocalInertia(btScalar mass,btVector3& inertia) const
+void btGImpactMeshShapePart::calculateLocalInertia(btScalar mass, btVector3& inertia) const
{
lockChildShapes();
-
#ifdef CALC_EXACT_INERTIA
- inertia.setValue(0.f,0.f,0.f);
+ inertia.setValue(0.f, 0.f, 0.f);
int i = this->getVertexCount();
- btScalar pointmass = mass/btScalar(i);
+ btScalar pointmass = mass / btScalar(i);
- while(i--)
+ while (i--)
{
btVector3 pointintertia;
- this->getVertex(i,pointintertia);
- pointintertia = gim_get_point_inertia(pointintertia,pointmass);
- inertia+=pointintertia;
+ this->getVertex(i, pointintertia);
+ pointintertia = gim_get_point_inertia(pointintertia, pointmass);
+ inertia += pointintertia;
}
#else
// Calc box inertia
- btScalar lx= m_localAABB.m_max[0] - m_localAABB.m_min[0];
- btScalar ly= m_localAABB.m_max[1] - m_localAABB.m_min[1];
- btScalar lz= m_localAABB.m_max[2] - m_localAABB.m_min[2];
- const btScalar x2 = lx*lx;
- const btScalar y2 = ly*ly;
- const btScalar z2 = lz*lz;
+ btScalar lx = m_localAABB.m_max[0] - m_localAABB.m_min[0];
+ btScalar ly = m_localAABB.m_max[1] - m_localAABB.m_min[1];
+ btScalar lz = m_localAABB.m_max[2] - m_localAABB.m_min[2];
+ 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 = scaledmass * (btVector3(y2 + z2, x2 + z2, x2 + y2));
#endif
unlockChildShapes();
}
-void btGImpactMeshShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const
+void btGImpactMeshShape::calculateLocalInertia(btScalar mass, btVector3& inertia) const
{
-
#ifdef CALC_EXACT_INERTIA
- inertia.setValue(0.f,0.f,0.f);
+ inertia.setValue(0.f, 0.f, 0.f);
int i = this->getMeshPartCount();
- btScalar partmass = mass/btScalar(i);
+ btScalar partmass = mass / btScalar(i);
- while(i--)
+ while (i--)
{
btVector3 partinertia;
- getMeshPart(i)->calculateLocalInertia(partmass,partinertia);
- inertia+=partinertia;
+ getMeshPart(i)->calculateLocalInertia(partmass, partinertia);
+ inertia += partinertia;
}
#else
// Calc box inertia
- btScalar lx= m_localAABB.m_max[0] - m_localAABB.m_min[0];
- btScalar ly= m_localAABB.m_max[1] - m_localAABB.m_min[1];
- btScalar lz= m_localAABB.m_max[2] - m_localAABB.m_min[2];
- const btScalar x2 = lx*lx;
- const btScalar y2 = ly*ly;
- const btScalar z2 = lz*lz;
+ btScalar lx = m_localAABB.m_max[0] - m_localAABB.m_min[0];
+ btScalar ly = m_localAABB.m_max[1] - m_localAABB.m_min[1];
+ btScalar lz = m_localAABB.m_max[2] - m_localAABB.m_min[2];
+ 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 = scaledmass * (btVector3(y2 + z2, x2 + z2, x2 + y2));
#endif
}
@@ -198,7 +189,7 @@ void btGImpactMeshShape::rayTest(const btVector3& rayFrom, const btVector3& rayT
{
}
-void btGImpactMeshShapePart::processAllTrianglesRay(btTriangleCallback* callback,const btVector3& rayFrom, const btVector3& rayTo) const
+void btGImpactMeshShapePart::processAllTrianglesRay(btTriangleCallback* callback, const btVector3& rayFrom, const btVector3& rayTo) const
{
lockChildShapes();
@@ -207,7 +198,7 @@ void btGImpactMeshShapePart::processAllTrianglesRay(btTriangleCallback* callback
rayDir.normalize();
m_box_set.rayQuery(rayDir, rayFrom, collided);
- if(collided.size()==0)
+ if (collided.size() == 0)
{
unlockChildShapes();
return;
@@ -216,15 +207,15 @@ void btGImpactMeshShapePart::processAllTrianglesRay(btTriangleCallback* callback
int part = (int)getPart();
btPrimitiveTriangle triangle;
int i = collided.size();
- while(i--)
+ while (i--)
{
- getPrimitiveTriangle(collided[i],triangle);
- callback->processTriangle(triangle.m_vertices,part,collided[i]);
+ getPrimitiveTriangle(collided[i], triangle);
+ callback->processTriangle(triangle.m_vertices, part, collided[i]);
}
unlockChildShapes();
}
-void btGImpactMeshShapePart::processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const
+void btGImpactMeshShapePart::processAllTriangles(btTriangleCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax) const
{
lockChildShapes();
btAABB box;
@@ -232,9 +223,9 @@ void btGImpactMeshShapePart::processAllTriangles(btTriangleCallback* callback,co
box.m_max = aabbMax;
btAlignedObjectArray<int> collided;
- m_box_set.boxQuery(box,collided);
+ m_box_set.boxQuery(box, collided);
- if(collided.size()==0)
+ if (collided.size() == 0)
{
unlockChildShapes();
return;
@@ -243,40 +234,38 @@ void btGImpactMeshShapePart::processAllTriangles(btTriangleCallback* callback,co
int part = (int)getPart();
btPrimitiveTriangle triangle;
int i = collided.size();
- while(i--)
+ while (i--)
{
- this->getPrimitiveTriangle(collided[i],triangle);
- callback->processTriangle(triangle.m_vertices,part,collided[i]);
+ this->getPrimitiveTriangle(collided[i], triangle);
+ callback->processTriangle(triangle.m_vertices, part, collided[i]);
}
unlockChildShapes();
-
}
-void btGImpactMeshShape::processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const
+void btGImpactMeshShape::processAllTriangles(btTriangleCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax) const
{
int i = m_mesh_parts.size();
- while(i--)
+ while (i--)
{
- m_mesh_parts[i]->processAllTriangles(callback,aabbMin,aabbMax);
+ m_mesh_parts[i]->processAllTriangles(callback, aabbMin, aabbMax);
}
}
-void btGImpactMeshShape::processAllTrianglesRay(btTriangleCallback* callback,const btVector3& rayFrom, const btVector3& rayTo) const
+void btGImpactMeshShape::processAllTrianglesRay(btTriangleCallback* callback, const btVector3& rayFrom, const btVector3& rayTo) const
{
int i = m_mesh_parts.size();
- while(i--)
+ while (i--)
{
m_mesh_parts[i]->processAllTrianglesRay(callback, rayFrom, rayTo);
}
}
-
///fills the dataBuffer and returns the struct name (and 0 on failure)
-const char* btGImpactMeshShape::serialize(void* dataBuffer, btSerializer* serializer) const
+const char* btGImpactMeshShape::serialize(void* dataBuffer, btSerializer* serializer) const
{
- btGImpactMeshShapeData* trimeshData = (btGImpactMeshShapeData*) dataBuffer;
+ btGImpactMeshShapeData* trimeshData = (btGImpactMeshShapeData*)dataBuffer;
- btCollisionShape::serialize(&trimeshData->m_collisionShapeData,serializer);
+ btCollisionShape::serialize(&trimeshData->m_collisionShapeData, serializer);
m_meshInterface->serialize(&trimeshData->m_meshInterface, serializer);
@@ -288,4 +277,3 @@ const char* btGImpactMeshShape::serialize(void* dataBuffer, btSerializer* serial
return "btGImpactMeshShapeData";
}
-
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/btGImpactShape.h b/thirdparty/bullet/BulletCollision/Gimpact/btGImpactShape.h
index 9d7e40562c..5b85e87041 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/btGImpactShape.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/btGImpactShape.h
@@ -21,7 +21,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#ifndef GIMPACT_SHAPE_H
#define GIMPACT_SHAPE_H
@@ -37,8 +36,7 @@ subject to the following restrictions:
#include "LinearMath/btMatrix3x3.h"
#include "LinearMath/btAlignedObjectArray.h"
-#include "btGImpactQuantizedBvh.h" // box tree class
-
+#include "btGImpactQuantizedBvh.h" // box tree class
//! declare Quantized trees, (you can change to float based trees)
typedef btGImpactQuantizedBvh btGImpactBoxSet;
@@ -50,10 +48,8 @@ enum eGIMPACT_SHAPE_TYPE
CONST_GIMPACT_TRIMESH_SHAPE
};
-
-
//! Helper class for tetrahedrons
-class btTetrahedronShapeEx:public btBU_Simplex1to4
+class btTetrahedronShapeEx : public btBU_Simplex1to4
{
public:
btTetrahedronShapeEx()
@@ -61,10 +57,9 @@ public:
m_numVertices = 4;
}
-
SIMD_FORCE_INLINE void setVertices(
- const btVector3 & v0,const btVector3 & v1,
- const btVector3 & v2,const btVector3 & v3)
+ const btVector3& v0, const btVector3& v1,
+ const btVector3& v2, const btVector3& v3)
{
m_vertices[0] = v0;
m_vertices[1] = v1;
@@ -74,45 +69,42 @@ public:
}
};
-
//! 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
+ 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()
- {
+ //! 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();
- }
+ 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_shapeType = GIMPACT_SHAPE_PROXYTYPE;
m_localAABB.invalidate();
m_needs_update = true;
- localScaling.setValue(1.f,1.f,1.f);
+ localScaling.setValue(1.f, 1.f, 1.f);
}
-
//! performs refit operation
/*!
Updates the entire Box set of this shape.
@@ -120,47 +112,46 @@ public:
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.
- /*!
+ 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;
- }
+ 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()
+ SIMD_FORCE_INLINE const btAABB& getLocalBox()
{
return m_localAABB;
}
+ virtual int getShapeType() const
+ {
+ return GIMPACT_SHAPE_PROXYTYPE;
+ }
- virtual int getShapeType() const
- {
- return GIMPACT_SHAPE_PROXYTYPE;
- }
-
- /*!
+ /*!
\post You must call updateBound() for update the box set.
*/
- virtual void setLocalScaling(const btVector3& scaling)
+ virtual void setLocalScaling(const btVector3& scaling)
{
localScaling = scaling;
postUpdate();
@@ -171,46 +162,43 @@ public:
return localScaling;
}
-
virtual void setMargin(btScalar margin)
- {
- m_collisionMargin = margin;
- int i = getNumChildShapes();
- while(i--)
- {
+ {
+ 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 ;
+ virtual eGIMPACT_SHAPE_TYPE getGImpactShapeType() const = 0;
//! gets boxset
- SIMD_FORCE_INLINE const btGImpactBoxSet * getBoxSet() const
+ 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
+ SIMD_FORCE_INLINE bool hasBoxSet() const
{
- if(m_box_set.getNodeCount() == 0) return false;
+ if (m_box_set.getNodeCount() == 0) return false;
return true;
}
//! Obtains the primitive manager
- virtual const btPrimitiveManagerBase * getPrimitiveManager() const = 0;
-
+ virtual const btPrimitiveManagerBase* getPrimitiveManager() const = 0;
//! Gets the number of children
- virtual int getNumChildShapes() const = 0;
+ virtual int getNumChildShapes() const = 0;
//! if true, then its children must get transforms.
virtual bool childrenHasTransform() const = 0;
@@ -221,11 +209,9 @@ public:
//! 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;
-
+ 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
@@ -237,94 +223,91 @@ public:
}
//! if this trimesh
- SIMD_FORCE_INLINE void getPrimitiveTriangle(int index,btPrimitiveTriangle & triangle) const
+ SIMD_FORCE_INLINE void getPrimitiveTriangle(int index, btPrimitiveTriangle& triangle) const
{
- getPrimitiveManager()->get_primitive_triangle(index,triangle);
+ 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;
- }
+ 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;
+ 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 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
+ virtual void rayTest(const btVector3& rayFrom, const btVector3& rayTo, btCollisionWorld::RayResultCallback& resultCallback) const
{
- (void) rayFrom; (void) rayTo; (void) resultCallback;
+ (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
+ virtual void processAllTriangles(btTriangleCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax) const
{
- (void) callback; (void) aabbMin; (void) aabbMax;
+ (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
+ 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
+class btGImpactCompoundShape : public btGImpactShapeInterface
{
public:
//! compound primitive manager
- class CompoundPrimitiveManager:public btPrimitiveManagerBase
+ class CompoundPrimitiveManager : public btPrimitiveManagerBase
{
public:
virtual ~CompoundPrimitiveManager() {}
- btGImpactCompoundShape * m_compoundShape;
-
+ btGImpactCompoundShape* m_compoundShape;
CompoundPrimitiveManager(const CompoundPrimitiveManager& compound)
- : btPrimitiveManagerBase()
+ : btPrimitiveManagerBase()
{
m_compoundShape = compound.m_compoundShape;
}
- CompoundPrimitiveManager(btGImpactCompoundShape * compoundShape)
+ CompoundPrimitiveManager(btGImpactCompoundShape* compoundShape)
{
m_compoundShape = compoundShape;
}
@@ -341,13 +324,13 @@ public:
virtual int get_primitive_count() const
{
- return (int )m_compoundShape->getNumChildShapes();
+ return (int)m_compoundShape->getNumChildShapes();
}
- virtual void get_primitive_box(int prim_index ,btAABB & primbox) const
+ virtual void get_primitive_box(int prim_index, btAABB& primbox) const
{
btTransform prim_trans;
- if(m_compoundShape->childrenHasTransform())
+ if (m_compoundShape->childrenHasTransform())
{
prim_trans = m_compoundShape->getChildTransform(prim_index);
}
@@ -356,30 +339,26 @@ public:
prim_trans.setIdentity();
}
const btCollisionShape* shape = m_compoundShape->getChildShape(prim_index);
- shape->getAabb(prim_trans,primbox.m_min,primbox.m_max);
+ shape->getAabb(prim_trans, primbox.m_min, primbox.m_max);
}
- virtual void get_primitive_triangle(int prim_index,btPrimitiveTriangle & triangle) const
+ virtual void get_primitive_triangle(int prim_index, btPrimitiveTriangle& triangle) const
{
btAssert(0);
- (void) prim_index; (void) triangle;
+ (void)prim_index;
+ (void)triangle;
}
-
};
-
-
protected:
CompoundPrimitiveManager m_primitive_manager;
- btAlignedObjectArray<btTransform> m_childTransforms;
- btAlignedObjectArray<btCollisionShape*> m_childShapes;
-
+ btAlignedObjectArray<btTransform> m_childTransforms;
+ btAlignedObjectArray<btCollisionShape*> m_childShapes;
public:
-
btGImpactCompoundShape(bool children_has_transform = true)
{
- (void) children_has_transform;
+ (void)children_has_transform;
m_primitive_manager.m_compoundShape = this;
m_box_set.setPrimitiveManager(&m_primitive_manager);
}
@@ -388,36 +367,33 @@ public:
{
}
-
//! if true, then its children must get transforms.
virtual bool childrenHasTransform() const
{
- if(m_childTransforms.size()==0) return false;
+ if (m_childTransforms.size() == 0) return false;
return true;
}
-
//! Obtains the primitive manager
- virtual const btPrimitiveManagerBase * getPrimitiveManager() const
+ virtual const btPrimitiveManagerBase* getPrimitiveManager() const
{
return &m_primitive_manager;
}
//! Obtains the compopund primitive manager
- SIMD_FORCE_INLINE CompoundPrimitiveManager * getCompoundPrimitiveManager()
+ SIMD_FORCE_INLINE CompoundPrimitiveManager* getCompoundPrimitiveManager()
{
return &m_primitive_manager;
}
//! Gets the number of children
- virtual int getNumChildShapes() const
+ 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)
+ void addChildShape(const btTransform& localTransform, btCollisionShape* shape)
{
btAssert(shape->isConvex());
m_childTransforms.push_back(localTransform);
@@ -444,24 +420,22 @@ public:
}
//! 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);
- }
- }
-
+ 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
+ virtual btTransform getChildTransform(int index) const
{
btAssert(m_childTransforms.size() == m_childShapes.size());
return m_childTransforms[index];
@@ -471,7 +445,7 @@ public:
/*!
\post You must call updateBound() for update the box set.
*/
- virtual void setChildTransform(int index, const btTransform & transform)
+ virtual void setChildTransform(int index, const btTransform& transform)
{
btAssert(m_childTransforms.size() == m_childShapes.size());
m_childTransforms[index] = transform;
@@ -490,24 +464,24 @@ public:
return false;
}
-
- virtual void getBulletTriangle(int prim_index,btTriangleShapeEx & triangle) const
+ virtual void getBulletTriangle(int prim_index, btTriangleShapeEx& triangle) const
{
- (void) prim_index; (void) triangle;
+ (void)prim_index;
+ (void)triangle;
btAssert(0);
}
- virtual void getBulletTetrahedron(int prim_index,btTetrahedronShapeEx & tetrahedron) const
+ virtual void getBulletTetrahedron(int prim_index, btTetrahedronShapeEx& tetrahedron) const
{
- (void) prim_index; (void) tetrahedron;
+ (void)prim_index;
+ (void)tetrahedron;
btAssert(0);
}
-
//! Calculates the exact inertia tensor for this shape
- virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
+ virtual void calculateLocalInertia(btScalar mass, btVector3& inertia) const;
- virtual const char* getName()const
+ virtual const char* getName() const
{
return "GImpactCompound";
}
@@ -516,11 +490,8 @@ public:
{
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
@@ -535,21 +506,21 @@ public:
/*!
Manages the info from btStridingMeshInterface object and controls the Lock/Unlock mechanism
*/
- class TrimeshPrimitiveManager:public btPrimitiveManagerBase
+ class TrimeshPrimitiveManager : public btPrimitiveManagerBase
{
public:
btScalar m_margin;
- btStridingMeshInterface * m_meshInterface;
+ btStridingMeshInterface* m_meshInterface;
btVector3 m_scale;
int m_part;
int m_lock_count;
- const unsigned char *vertexbase;
+ const unsigned char* vertexbase;
int numverts;
PHY_ScalarType type;
int stride;
- const unsigned char *indexbase;
+ const unsigned char* indexbase;
int indexstride;
- int numfaces;
+ int numfaces;
PHY_ScalarType indicestype;
TrimeshPrimitiveManager()
@@ -557,7 +528,7 @@ public:
m_meshInterface = NULL;
m_part = 0;
m_margin = 0.01f;
- m_scale = btVector3(1.f,1.f,1.f);
+ m_scale = btVector3(1.f, 1.f, 1.f);
m_lock_count = 0;
vertexbase = 0;
numverts = 0;
@@ -567,8 +538,8 @@ public:
numfaces = 0;
}
- TrimeshPrimitiveManager(const TrimeshPrimitiveManager & manager)
- : btPrimitiveManagerBase()
+ TrimeshPrimitiveManager(const TrimeshPrimitiveManager& manager)
+ : btPrimitiveManagerBase()
{
m_meshInterface = manager.m_meshInterface;
m_part = manager.m_part;
@@ -581,11 +552,10 @@ public:
indexbase = 0;
indexstride = 0;
numfaces = 0;
-
}
TrimeshPrimitiveManager(
- btStridingMeshInterface * meshInterface, int part)
+ btStridingMeshInterface* meshInterface, int part)
{
m_meshInterface = meshInterface;
m_part = part;
@@ -598,29 +568,28 @@ public:
indexbase = 0;
indexstride = 0;
numfaces = 0;
-
}
virtual ~TrimeshPrimitiveManager() {}
void lock()
{
- if(m_lock_count>0)
+ if (m_lock_count > 0)
{
m_lock_count++;
return;
}
m_meshInterface->getLockedReadOnlyVertexIndexBase(
- &vertexbase,numverts,
- type, stride,&indexbase, indexstride, numfaces,indicestype,m_part);
+ &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)
+ if (m_lock_count == 0) return;
+ if (m_lock_count > 1)
{
--m_lock_count;
return;
@@ -637,93 +606,91 @@ public:
virtual int get_primitive_count() const
{
- return (int )numfaces;
+ return (int)numfaces;
}
SIMD_FORCE_INLINE int get_vertex_count() const
{
- return (int )numverts;
+ return (int)numverts;
}
- SIMD_FORCE_INLINE void get_indices(int face_index,unsigned int &i0,unsigned int &i1,unsigned int &i2) const
+ SIMD_FORCE_INLINE void get_indices(int face_index, unsigned int& i0, unsigned int& i1, unsigned int& i2) const
{
- if(indicestype == PHY_SHORT)
+ if (indicestype == PHY_SHORT)
{
- unsigned short* s_indices = (unsigned short *)(indexbase + face_index * indexstride);
+ unsigned short* s_indices = (unsigned short*)(indexbase + face_index * indexstride);
i0 = s_indices[0];
i1 = s_indices[1];
i2 = s_indices[2];
}
else
{
- unsigned int * i_indices = (unsigned int *)(indexbase + face_index*indexstride);
+ unsigned int* i_indices = (unsigned int*)(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
+ SIMD_FORCE_INLINE void get_vertex(unsigned int vertex_index, btVector3& vertex) const
{
- if(type == PHY_DOUBLE)
+ 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]);
+ 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];
+ 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
+ virtual void get_primitive_box(int prim_index, btAABB& primbox) const
{
- btPrimitiveTriangle triangle;
- get_primitive_triangle(prim_index,triangle);
+ 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);
+ triangle.m_vertices[1], triangle.m_vertices[2], triangle.m_margin);
}
- virtual void get_primitive_triangle(int prim_index,btPrimitiveTriangle & triangle) const
+ 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]);
+ 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
+ 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]);
+ 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:
+public:
btGImpactMeshShapePart()
{
m_box_set.setPrimitiveManager(&m_primitive_manager);
}
- btGImpactMeshShapePart( btStridingMeshInterface * meshInterface, int part );
- virtual ~btGImpactMeshShapePart();
+ btGImpactMeshShapePart(btStridingMeshInterface* meshInterface, int part);
+ virtual ~btGImpactMeshShapePart();
//! if true, then its children must get transforms.
virtual bool childrenHasTransform() const
@@ -731,40 +698,36 @@ public:
return false;
}
-
//! call when reading child shapes
- virtual void lockChildShapes() const;
- virtual void unlockChildShapes() const;
+ virtual void lockChildShapes() const;
+ virtual void unlockChildShapes() const;
//! Gets the number of children
- virtual int getNumChildShapes() const
+ virtual int getNumChildShapes() const
{
return m_primitive_manager.get_primitive_count();
}
-
//! Gets the children
virtual btCollisionShape* getChildShape(int index)
{
- (void) index;
+ (void)index;
btAssert(0);
return NULL;
}
-
-
//! Gets the child
virtual const btCollisionShape* getChildShape(int index) const
{
- (void) index;
+ (void)index;
btAssert(0);
return NULL;
}
//! Gets the children transform
- virtual btTransform getChildTransform(int index) const
+ virtual btTransform getChildTransform(int index) const
{
- (void) index;
+ (void)index;
btAssert(0);
return btTransform();
}
@@ -773,35 +736,27 @@ public:
/*!
\post You must call updateBound() for update the box set.
*/
- virtual void setChildTransform(int index, const btTransform & transform)
+ virtual void setChildTransform(int index, const btTransform& transform)
{
- (void) index;
- (void) transform;
+ (void)index;
+ (void)transform;
btAssert(0);
}
-
//! Obtains the primitive manager
- virtual const btPrimitiveManagerBase * getPrimitiveManager() const
+ virtual const btPrimitiveManagerBase* getPrimitiveManager() const
{
return &m_primitive_manager;
}
- SIMD_FORCE_INLINE TrimeshPrimitiveManager * getTrimeshPrimitiveManager()
+ SIMD_FORCE_INLINE TrimeshPrimitiveManager* getTrimeshPrimitiveManager()
{
return &m_primitive_manager;
}
+ virtual void calculateLocalInertia(btScalar mass, btVector3& inertia) const;
-
-
-
- virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
-
-
-
-
- virtual const char* getName()const
+ virtual const char* getName() const
{
return "GImpactMeshShapePart";
}
@@ -823,61 +778,58 @@ public:
return false;
}
- virtual void getBulletTriangle(int prim_index,btTriangleShapeEx & triangle) const
+ virtual void getBulletTriangle(int prim_index, btTriangleShapeEx& triangle) const
{
- m_primitive_manager.get_bullet_triangle(prim_index,triangle);
+ m_primitive_manager.get_bullet_triangle(prim_index, triangle);
}
- virtual void getBulletTetrahedron(int prim_index,btTetrahedronShapeEx & tetrahedron) const
+ virtual void getBulletTetrahedron(int prim_index, btTetrahedronShapeEx& tetrahedron) const
{
- (void) prim_index;
- (void) tetrahedron;
+ (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
+ SIMD_FORCE_INLINE void getVertex(int vertex_index, btVector3& vertex) const
{
- m_primitive_manager.get_vertex(vertex_index,vertex);
+ 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;
-};
+ {
+ 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.
/*!
@@ -893,29 +845,29 @@ class btGImpactMeshShape : public btGImpactShapeInterface
protected:
btAlignedObjectArray<btGImpactMeshShapePart*> m_mesh_parts;
- void buildMeshParts(btStridingMeshInterface * meshInterface)
+ void buildMeshParts(btStridingMeshInterface* meshInterface)
{
- for (int i=0;i<meshInterface->getNumSubParts() ;++i )
+ for (int i = 0; i < meshInterface->getNumSubParts(); ++i)
{
- btGImpactMeshShapePart * newpart = new btGImpactMeshShapePart(meshInterface,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());
- }
- }
+ 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)
+ btGImpactMeshShape(btStridingMeshInterface* meshInterface)
{
m_meshInterface = meshInterface;
buildMeshParts(meshInterface);
@@ -924,15 +876,14 @@ public:
virtual ~btGImpactMeshShape()
{
int i = m_mesh_parts.size();
- while(i--)
- {
- btGImpactMeshShapePart * part = m_mesh_parts[i];
+ while (i--)
+ {
+ btGImpactMeshShapePart* part = m_mesh_parts[i];
delete part;
- }
+ }
m_mesh_parts.clear();
}
-
btStridingMeshInterface* getMeshInterface()
{
return m_meshInterface;
@@ -948,79 +899,73 @@ public:
return m_mesh_parts.size();
}
- btGImpactMeshShapePart * getMeshPart(int index)
+ btGImpactMeshShapePart* getMeshPart(int index)
{
return m_mesh_parts[index];
}
-
-
- const btGImpactMeshShapePart * getMeshPart(int index) const
+ const btGImpactMeshShapePart* getMeshPart(int index) const
{
return m_mesh_parts[index];
}
-
- virtual void setLocalScaling(const btVector3& scaling)
+ virtual void setLocalScaling(const btVector3& scaling)
{
localScaling = scaling;
int i = m_mesh_parts.size();
- while(i--)
- {
- btGImpactMeshShapePart * part = m_mesh_parts[i];
+ while (i--)
+ {
+ btGImpactMeshShapePart* part = m_mesh_parts[i];
part->setLocalScaling(scaling);
- }
+ }
m_needs_update = true;
}
virtual void setMargin(btScalar margin)
- {
- m_collisionMargin = margin;
+ {
+ m_collisionMargin = margin;
int i = m_mesh_parts.size();
- while(i--)
- {
- btGImpactMeshShapePart * part = m_mesh_parts[i];
+ 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()
- {
+ virtual void postUpdate()
+ {
int i = m_mesh_parts.size();
- while(i--)
- {
- btGImpactMeshShapePart * part = m_mesh_parts[i];
+ while (i--)
+ {
+ btGImpactMeshShapePart* part = m_mesh_parts[i];
part->postUpdate();
- }
-
- m_needs_update = true;
- }
+ }
- virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
+ m_needs_update = true;
+ }
+ virtual void calculateLocalInertia(btScalar mass, btVector3& inertia) const;
//! Obtains the primitive manager
- virtual const btPrimitiveManagerBase * getPrimitiveManager() const
+ virtual const btPrimitiveManagerBase* getPrimitiveManager() const
{
btAssert(0);
return NULL;
}
-
//! Gets the number of children
- virtual int getNumChildShapes() const
+ virtual int getNumChildShapes() const
{
btAssert(0);
return 0;
}
-
//! if true, then its children must get transforms.
virtual bool childrenHasTransform() const
{
@@ -1042,15 +987,17 @@ public:
return false;
}
- virtual void getBulletTriangle(int prim_index,btTriangleShapeEx & triangle) const
+ virtual void getBulletTriangle(int prim_index, btTriangleShapeEx& triangle) const
{
- (void) prim_index; (void) triangle;
+ (void)prim_index;
+ (void)triangle;
btAssert(0);
}
- virtual void getBulletTetrahedron(int prim_index,btTetrahedronShapeEx & tetrahedron) const
+ virtual void getBulletTetrahedron(int prim_index, btTetrahedronShapeEx& tetrahedron) const
{
- (void) prim_index; (void) tetrahedron;
+ (void)prim_index;
+ (void)tetrahedron;
btAssert(0);
}
@@ -1065,39 +1012,38 @@ public:
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);
- }
+ 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;
+ (void)index;
btAssert(0);
return NULL;
}
-
//! Gets the child
virtual const btCollisionShape* getChildShape(int index) const
{
- (void) index;
+ (void)index;
btAssert(0);
return NULL;
}
//! Gets the children transform
- virtual btTransform getChildTransform(int index) const
+ virtual btTransform getChildTransform(int index) const
{
- (void) index;
+ (void)index;
btAssert(0);
return btTransform();
}
@@ -1106,59 +1052,56 @@ public:
/*!
\post You must call updateBound() for update the box set.
*/
- virtual void setChildTransform(int index, const btTransform & transform)
+ virtual void setChildTransform(int index, const btTransform& transform)
{
- (void) index; (void) transform;
+ (void)index;
+ (void)transform;
btAssert(0);
}
-
virtual eGIMPACT_SHAPE_TYPE getGImpactShapeType() const
{
return CONST_GIMPACT_TRIMESH_SHAPE;
}
-
- virtual const char* getName()const
+ virtual const char* getName() const
{
return "GImpactMesh";
}
- virtual void rayTest(const btVector3& rayFrom, const btVector3& rayTo, btCollisionWorld::RayResultCallback& resultCallback) const;
+ 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 processAllTriangles(btTriangleCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax) const;
- virtual void processAllTrianglesRay (btTriangleCallback* callback,const btVector3& rayFrom,const btVector3& rayTo) const;
+ virtual void processAllTrianglesRay(btTriangleCallback* callback, const btVector3& rayFrom, const btVector3& rayTo) const;
- virtual int calculateSerializeBufferSize() 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;
-
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
};
///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
-struct btGImpactMeshShapeData
+struct btGImpactMeshShapeData
{
- btCollisionShapeData m_collisionShapeData;
+ btCollisionShapeData m_collisionShapeData;
btStridingMeshInterfaceData m_meshInterface;
- btVector3FloatData m_localScaling;
+ btVector3FloatData m_localScaling;
- float m_collisionMargin;
+ float m_collisionMargin;
- int m_gimpactSubType;
+ int m_gimpactSubType;
};
-SIMD_FORCE_INLINE int btGImpactMeshShape::calculateSerializeBufferSize() const
+SIMD_FORCE_INLINE int btGImpactMeshShape::calculateSerializeBufferSize() const
{
return sizeof(btGImpactMeshShapeData);
}
-
-#endif //GIMPACT_MESH_SHAPE_H
+#endif //GIMPACT_MESH_SHAPE_H
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/btGenericPoolAllocator.cpp b/thirdparty/bullet/BulletCollision/Gimpact/btGenericPoolAllocator.cpp
index 5d07d1adb9..bfdb3db5d0 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/btGenericPoolAllocator.cpp
+++ b/thirdparty/bullet/BulletCollision/Gimpact/btGenericPoolAllocator.cpp
@@ -20,48 +20,45 @@ subject to the following restrictions:
#include "btGenericPoolAllocator.h"
-
-
/// *************** btGenericMemoryPool ******************///////////
size_t btGenericMemoryPool::allocate_from_free_nodes(size_t num_elements)
{
size_t ptr = BT_UINT_MAX;
- if(m_free_nodes_count == 0) return BT_UINT_MAX;
+ if (m_free_nodes_count == 0) return BT_UINT_MAX;
// find an avaliable free node with the correct size
size_t revindex = m_free_nodes_count;
- while(revindex-- && ptr == BT_UINT_MAX)
+ while (revindex-- && ptr == BT_UINT_MAX)
{
- if(m_allocated_sizes[m_free_nodes[revindex]]>=num_elements)
+ if (m_allocated_sizes[m_free_nodes[revindex]] >= num_elements)
{
ptr = revindex;
}
}
- if(ptr == BT_UINT_MAX) return BT_UINT_MAX; // not found
-
+ if (ptr == BT_UINT_MAX) return BT_UINT_MAX; // not found
revindex = ptr;
ptr = m_free_nodes[revindex];
// post: ptr contains the node index, and revindex the index in m_free_nodes
- size_t finalsize = m_allocated_sizes[ptr];
+ size_t finalsize = m_allocated_sizes[ptr];
finalsize -= num_elements;
m_allocated_sizes[ptr] = num_elements;
// post: finalsize>=0, m_allocated_sizes[ptr] has the requested size
- if(finalsize>0) // preserve free node, there are some free memory
+ if (finalsize > 0) // preserve free node, there are some free memory
{
m_free_nodes[revindex] = ptr + num_elements;
m_allocated_sizes[ptr + num_elements] = finalsize;
}
- else // delete free node
+ else // delete free node
{
// swap with end
- m_free_nodes[revindex] = m_free_nodes[m_free_nodes_count-1];
+ m_free_nodes[revindex] = m_free_nodes[m_free_nodes_count - 1];
m_free_nodes_count--;
}
@@ -70,17 +67,16 @@ size_t btGenericMemoryPool::allocate_from_free_nodes(size_t num_elements)
size_t btGenericMemoryPool::allocate_from_pool(size_t num_elements)
{
- if(m_allocated_count+num_elements>m_max_element_count) return BT_UINT_MAX;
+ if (m_allocated_count + num_elements > m_max_element_count) return BT_UINT_MAX;
size_t ptr = m_allocated_count;
m_allocated_sizes[m_allocated_count] = num_elements;
- m_allocated_count+=num_elements;
+ m_allocated_count += num_elements;
return ptr;
}
-
void btGenericMemoryPool::init_pool(size_t element_size, size_t element_count)
{
m_allocated_count = 0;
@@ -89,14 +85,11 @@ void btGenericMemoryPool::init_pool(size_t element_size, size_t element_count)
m_element_size = element_size;
m_max_element_count = element_count;
+ m_pool = (unsigned char *)btAlignedAlloc(m_element_size * m_max_element_count, 16);
+ m_free_nodes = (size_t *)btAlignedAlloc(sizeof(size_t) * m_max_element_count, 16);
+ m_allocated_sizes = (size_t *)btAlignedAlloc(sizeof(size_t) * m_max_element_count, 16);
-
-
- m_pool = (unsigned char *) btAlignedAlloc(m_element_size*m_max_element_count,16);
- m_free_nodes = (size_t *) btAlignedAlloc(sizeof(size_t)*m_max_element_count,16);
- m_allocated_sizes = (size_t *) btAlignedAlloc(sizeof(size_t)*m_max_element_count,16);
-
- for (size_t i = 0;i< m_max_element_count;i++ )
+ for (size_t i = 0; i < m_max_element_count; i++)
{
m_allocated_sizes[i] = 0;
}
@@ -111,150 +104,141 @@ void btGenericMemoryPool::end_pool()
m_free_nodes_count = 0;
}
-
//! Allocates memory in pool
/*!
\param size_bytes size in bytes of the buffer
*/
-void * btGenericMemoryPool::allocate(size_t size_bytes)
+void *btGenericMemoryPool::allocate(size_t size_bytes)
{
-
- size_t module = size_bytes%m_element_size;
- size_t element_count = size_bytes/m_element_size;
- if(module>0) element_count++;
+ size_t module = size_bytes % m_element_size;
+ size_t element_count = size_bytes / m_element_size;
+ if (module > 0) element_count++;
size_t alloc_pos = allocate_from_free_nodes(element_count);
// a free node is found
- if(alloc_pos != BT_UINT_MAX)
+ if (alloc_pos != BT_UINT_MAX)
{
return get_element_data(alloc_pos);
}
// allocate directly on pool
alloc_pos = allocate_from_pool(element_count);
- if(alloc_pos == BT_UINT_MAX) return NULL; // not space
+ if (alloc_pos == BT_UINT_MAX) return NULL; // not space
return get_element_data(alloc_pos);
}
-bool btGenericMemoryPool::freeMemory(void * pointer)
+bool btGenericMemoryPool::freeMemory(void *pointer)
{
- unsigned char * pointer_pos = (unsigned char *)pointer;
- unsigned char * pool_pos = (unsigned char *)m_pool;
+ unsigned char *pointer_pos = (unsigned char *)pointer;
+ unsigned char *pool_pos = (unsigned char *)m_pool;
// calc offset
- if(pointer_pos<pool_pos) return false;//other pool
+ if (pointer_pos < pool_pos) return false; //other pool
size_t offset = size_t(pointer_pos - pool_pos);
- if(offset>=get_pool_capacity()) return false;// far away
+ if (offset >= get_pool_capacity()) return false; // far away
// find free position
- m_free_nodes[m_free_nodes_count] = offset/m_element_size;
+ m_free_nodes[m_free_nodes_count] = offset / m_element_size;
m_free_nodes_count++;
return true;
}
-
/// *******************! btGenericPoolAllocator *******************!///
-
btGenericPoolAllocator::~btGenericPoolAllocator()
{
// destroy pools
size_t i;
- for (i=0;i<m_pool_count;i++)
+ for (i = 0; i < m_pool_count; i++)
{
m_pools[i]->end_pool();
btAlignedFree(m_pools[i]);
}
}
-
// creates a pool
-btGenericMemoryPool * btGenericPoolAllocator::push_new_pool()
+btGenericMemoryPool *btGenericPoolAllocator::push_new_pool()
{
- if(m_pool_count >= BT_DEFAULT_MAX_POOLS) return NULL;
+ if (m_pool_count >= BT_DEFAULT_MAX_POOLS) return NULL;
- btGenericMemoryPool * newptr = (btGenericMemoryPool *)btAlignedAlloc(sizeof(btGenericMemoryPool),16);
+ btGenericMemoryPool *newptr = (btGenericMemoryPool *)btAlignedAlloc(sizeof(btGenericMemoryPool), 16);
m_pools[m_pool_count] = newptr;
- m_pools[m_pool_count]->init_pool(m_pool_element_size,m_pool_element_count);
+ m_pools[m_pool_count]->init_pool(m_pool_element_size, m_pool_element_count);
m_pool_count++;
return newptr;
}
-void * btGenericPoolAllocator::failback_alloc(size_t size_bytes)
+void *btGenericPoolAllocator::failback_alloc(size_t size_bytes)
{
+ btGenericMemoryPool *pool = NULL;
- btGenericMemoryPool * pool = NULL;
-
-
- if(size_bytes<=get_pool_capacity())
+ if (size_bytes <= get_pool_capacity())
{
- pool = push_new_pool();
+ pool = push_new_pool();
}
- if(pool==NULL) // failback
+ if (pool == NULL) // failback
{
- return btAlignedAlloc(size_bytes,16);
+ return btAlignedAlloc(size_bytes, 16);
}
return pool->allocate(size_bytes);
}
-bool btGenericPoolAllocator::failback_free(void * pointer)
+bool btGenericPoolAllocator::failback_free(void *pointer)
{
btAlignedFree(pointer);
return true;
}
-
//! Allocates memory in pool
/*!
\param size_bytes size in bytes of the buffer
*/
-void * btGenericPoolAllocator::allocate(size_t size_bytes)
+void *btGenericPoolAllocator::allocate(size_t size_bytes)
{
- void * ptr = NULL;
+ void *ptr = NULL;
size_t i = 0;
- while(i<m_pool_count && ptr == NULL)
+ while (i < m_pool_count && ptr == NULL)
{
ptr = m_pools[i]->allocate(size_bytes);
++i;
}
- if(ptr) return ptr;
+ if (ptr) return ptr;
return failback_alloc(size_bytes);
}
-bool btGenericPoolAllocator::freeMemory(void * pointer)
+bool btGenericPoolAllocator::freeMemory(void *pointer)
{
bool result = false;
size_t i = 0;
- while(i<m_pool_count && result == false)
+ while (i < m_pool_count && result == false)
{
result = m_pools[i]->freeMemory(pointer);
++i;
}
- if(result) return true;
+ if (result) return true;
return failback_free(pointer);
}
/// ************** STANDARD ALLOCATOR ***************************///
-
#define BT_DEFAULT_POOL_SIZE 32768
#define BT_DEFAULT_POOL_ELEMENT_SIZE 8
// main allocator
-class GIM_STANDARD_ALLOCATOR: public btGenericPoolAllocator
+class GIM_STANDARD_ALLOCATOR : public btGenericPoolAllocator
{
public:
- GIM_STANDARD_ALLOCATOR():btGenericPoolAllocator(BT_DEFAULT_POOL_ELEMENT_SIZE,BT_DEFAULT_POOL_SIZE)
+ GIM_STANDARD_ALLOCATOR() : btGenericPoolAllocator(BT_DEFAULT_POOL_ELEMENT_SIZE, BT_DEFAULT_POOL_SIZE)
{
}
};
@@ -262,19 +246,18 @@ public:
// global allocator
GIM_STANDARD_ALLOCATOR g_main_allocator;
-
-void * btPoolAlloc(size_t size)
+void *btPoolAlloc(size_t size)
{
return g_main_allocator.allocate(size);
}
-void * btPoolRealloc(void *ptr, size_t oldsize, size_t newsize)
+void *btPoolRealloc(void *ptr, size_t oldsize, size_t newsize)
{
- void * newptr = btPoolAlloc(newsize);
- size_t copysize = oldsize<newsize?oldsize:newsize;
- memcpy(newptr,ptr,copysize);
- btPoolFree(ptr);
- return newptr;
+ void *newptr = btPoolAlloc(newsize);
+ size_t copysize = oldsize < newsize ? oldsize : newsize;
+ memcpy(newptr, ptr, copysize);
+ btPoolFree(ptr);
+ return newptr;
}
void btPoolFree(void *ptr)
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/btGenericPoolAllocator.h b/thirdparty/bullet/BulletCollision/Gimpact/btGenericPoolAllocator.h
index b46d851634..a535088e48 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/btGenericPoolAllocator.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/btGenericPoolAllocator.h
@@ -29,16 +29,16 @@ subject to the following restrictions:
#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
+ 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;
@@ -47,12 +47,10 @@ protected:
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);
@@ -63,10 +61,9 @@ public:
end_pool();
}
-
inline size_t get_pool_capacity()
{
- return m_element_size*m_max_element_count;
+ return m_element_size * m_max_element_count;
}
inline size_t gem_element_size()
@@ -89,23 +86,20 @@ public:
return m_free_nodes_count;
}
- inline void * get_element_data(size_t element_index)
+ inline void *get_element_data(size_t element_index)
{
- return &m_pool[element_index*m_element_size];
+ 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);
+ void *allocate(size_t size_bytes);
- bool freeMemory(void * pointer);
+ bool freeMemory(void *pointer);
};
-
-
-
//! Generic Allocator with pools
/*!
General purpose Allocator which can create Memory Pools dynamiacally as needed.
@@ -115,26 +109,25 @@ class btGenericPoolAllocator
protected:
size_t m_pool_element_size;
size_t m_pool_element_count;
+
public:
- btGenericMemoryPool * m_pools[BT_DEFAULT_MAX_POOLS];
+ 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;
+ return m_pool_element_size * m_pool_element_count;
}
-
protected:
// creates a pool
- btGenericMemoryPool * push_new_pool();
+ btGenericMemoryPool *push_new_pool();
- void * failback_alloc(size_t size_bytes);
+ void *failback_alloc(size_t size_bytes);
- bool failback_free(void * pointer);
-public:
+ bool failback_free(void *pointer);
+public:
btGenericPoolAllocator(size_t pool_element_size, size_t pool_element_count)
{
m_pool_count = 0;
@@ -148,16 +141,13 @@ public:
/*!
\param size_bytes size in bytes of the buffer
*/
- void * allocate(size_t size_bytes);
+ void *allocate(size_t size_bytes);
- bool freeMemory(void * pointer);
+ bool freeMemory(void *pointer);
};
-
-
-void * btPoolAlloc(size_t size);
-void * btPoolRealloc(void *ptr, size_t oldsize, size_t newsize);
+void *btPoolAlloc(size_t size);
+void *btPoolRealloc(void *ptr, size_t oldsize, size_t newsize);
void btPoolFree(void *ptr);
-
#endif
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/btGeometryOperations.h b/thirdparty/bullet/BulletCollision/Gimpact/btGeometryOperations.h
index 60f06510ad..6a1ee6dcf9 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/btGeometryOperations.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/btGeometryOperations.h
@@ -27,52 +27,44 @@ subject to the following restrictions:
#include "btBoxCollision.h"
-
-
-
-
#define PLANEDIREPSILON 0.0000001f
#define PARALELENORMALS 0.000001f
-
-#define BT_CLAMP(number,minval,maxval) (number<minval?minval:(number>maxval?maxval:number))
+#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)
+SIMD_FORCE_INLINE void bt_edge_plane(const btVector3 &e1, const btVector3 &e2, const btVector3 &normal, btVector4 &plane)
{
- btVector3 planenormal = (e2-e1).cross(normal);
+ btVector3 planenormal = (e2 - e1).cross(normal);
planenormal.normalize();
- plane.setValue(planenormal[0],planenormal[1],planenormal[2],e2.dot(planenormal));
+ 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 &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)
+ btVector3 n = e2 - e1;
+ cp = v - e1;
+ btScalar _scalar = cp.dot(n) / n.dot(n);
+ if (_scalar < 0.0f)
{
- cp = e1;
+ cp = e1;
}
- else if(_scalar >1.0f)
+ else if (_scalar > 1.0f)
{
- cp = e2;
+ cp = e2;
}
else
{
- cp = _scalar*n + e1;
+ cp = _scalar * n + e1;
}
}
-
//! line plane collision
/*!
*\return
@@ -82,131 +74,125 @@ SIMD_FORCE_INLINE void bt_closest_point_on_segment(
*/
SIMD_FORCE_INLINE int bt_line_plane_collision(
- const btVector4 & plane,
- const btVector3 & vDir,
- const btVector3 & vPoint,
- btVector3 & pout,
+ 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)
+ if (btFabs(_dotdir) < PLANEDIREPSILON)
{
tparam = tmax;
- return 0;
+ return 0;
}
- btScalar _dis = bt_distance_point_plane(plane,vPoint);
- char returnvalue = _dis<0.0f? 2:1;
- tparam = -_dis/_dotdir;
+ btScalar _dis = bt_distance_point_plane(plane, vPoint);
+ char returnvalue = _dis < 0.0f ? 2 : 1;
+ tparam = -_dis / _dotdir;
- if(tparam<tmin)
+ if (tparam < tmin)
{
returnvalue = 0;
tparam = tmin;
}
- else if(tparam>tmax)
+ else if (tparam > tmax)
{
returnvalue = 0;
tparam = tmax;
}
- pout = tparam*vDir + vPoint;
+ 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)
+ 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));
+ btVector3 AD = vA2 - vA1;
+ btVector3 BD = vB2 - vB1;
+ btVector3 N = AD.cross(BD);
+ btScalar tp = N.length2();
- // 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);
+ btVector4 _M; //plane
- vPointB = tp*BD + vB1;
-}
+ 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
+#endif // GIM_VECTOR_H_INCLUDED
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/btQuantization.h b/thirdparty/bullet/BulletCollision/Gimpact/btQuantization.h
index bd2633cfc5..19a02a2177 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/btQuantization.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/btQuantization.h
@@ -27,54 +27,47 @@ subject to the following restrictions:
#include "LinearMath/btTransform.h"
-
-
-
-
-
SIMD_FORCE_INLINE void bt_calc_quantization_parameters(
- btVector3 & outMinBound,
- btVector3 & outMaxBound,
- btVector3 & bvhQuantization,
- const btVector3& srcMinBound,const btVector3& srcMaxBound,
+ 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);
+ 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;
+ 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)
+ 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);
+ 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)
+ const btVector3& offset,
+ const btVector3& bvhQuantization)
{
- btVector3 vecOut;
+ btVector3 vecOut;
vecOut.setValue(
(btScalar)(vecIn[0]) / (bvhQuantization.getX()),
(btScalar)(vecIn[1]) / (bvhQuantization.getY()),
@@ -83,6 +76,4 @@ SIMD_FORCE_INLINE btVector3 bt_unquantize(
return vecOut;
}
-
-
-#endif // BT_GIMPACT_QUANTIZATION_H_INCLUDED
+#endif // BT_GIMPACT_QUANTIZATION_H_INCLUDED
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/btTriangleShapeEx.cpp b/thirdparty/bullet/BulletCollision/Gimpact/btTriangleShapeEx.cpp
index ca76cc54a1..292ef8c1ff 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/btTriangleShapeEx.cpp
+++ b/thirdparty/bullet/BulletCollision/Gimpact/btTriangleShapeEx.cpp
@@ -23,196 +23,181 @@ subject to the following restrictions:
#include "btTriangleShapeEx.h"
-
-
-void GIM_TRIANGLE_CONTACT::merge_points(const btVector4 & plane,
- btScalar margin, const btVector3 * points, int point_count)
+void GIM_TRIANGLE_CONTACT::merge_points(const btVector4& plane,
+ btScalar margin, const btVector3* points, int point_count)
{
- m_point_count = 0;
- m_penetration_depth= -1000.0f;
+ m_point_count = 0;
+ m_penetration_depth = -1000.0f;
- int point_indices[MAX_TRI_CLIPPING];
+ int point_indices[MAX_TRI_CLIPPING];
int _k;
- for ( _k=0;_k<point_count;_k++)
- {
- btScalar _dist = - bt_distance_point_plane(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+SIMD_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]];
- }
+ for (_k = 0; _k < point_count; _k++)
+ {
+ btScalar _dist = -bt_distance_point_plane(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 + SIMD_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]];
+ }
}
///class btPrimitiveTriangle
bool btPrimitiveTriangle::overlap_test_conservative(const btPrimitiveTriangle& other)
{
- btScalar total_margin = m_margin + other.m_margin;
- // classify points on other triangle
- btScalar dis0 = bt_distance_point_plane(m_plane,other.m_vertices[0]) - total_margin;
+ btScalar total_margin = m_margin + other.m_margin;
+ // classify points on other triangle
+ btScalar dis0 = bt_distance_point_plane(m_plane, other.m_vertices[0]) - total_margin;
- btScalar dis1 = bt_distance_point_plane(m_plane,other.m_vertices[1]) - total_margin;
+ btScalar dis1 = bt_distance_point_plane(m_plane, other.m_vertices[1]) - total_margin;
- btScalar dis2 = bt_distance_point_plane(m_plane,other.m_vertices[2]) - total_margin;
+ btScalar dis2 = bt_distance_point_plane(m_plane, other.m_vertices[2]) - total_margin;
- if (dis0>0.0f&&dis1>0.0f&&dis2>0.0f) return false;
+ if (dis0 > 0.0f && dis1 > 0.0f && dis2 > 0.0f) return false;
- // classify points on this triangle
- dis0 = bt_distance_point_plane(other.m_plane,m_vertices[0]) - total_margin;
+ // classify points on this triangle
+ dis0 = bt_distance_point_plane(other.m_plane, m_vertices[0]) - total_margin;
- dis1 = bt_distance_point_plane(other.m_plane,m_vertices[1]) - total_margin;
+ dis1 = bt_distance_point_plane(other.m_plane, m_vertices[1]) - total_margin;
- dis2 = bt_distance_point_plane(other.m_plane,m_vertices[2]) - total_margin;
+ dis2 = bt_distance_point_plane(other.m_plane, m_vertices[2]) - total_margin;
- if (dis0>0.0f&&dis1>0.0f&&dis2>0.0f) return false;
+ if (dis0 > 0.0f && dis1 > 0.0f && dis2 > 0.0f) return false;
- return true;
+ return true;
}
-int btPrimitiveTriangle::clip_triangle(btPrimitiveTriangle & other, btVector3 * clipped_points )
+int btPrimitiveTriangle::clip_triangle(btPrimitiveTriangle& other, btVector3* clipped_points)
{
- // edge 0
-
- btVector3 temp_points[MAX_TRI_CLIPPING];
-
+ // edge 0
- btVector4 edgeplane;
+ btVector3 temp_points[MAX_TRI_CLIPPING];
- get_edge_plane(0,edgeplane);
+ btVector4 edgeplane;
+ get_edge_plane(0, edgeplane);
- int clipped_count = bt_plane_clip_triangle(
- edgeplane,other.m_vertices[0],other.m_vertices[1],other.m_vertices[2],temp_points);
+ int clipped_count = bt_plane_clip_triangle(
+ edgeplane, other.m_vertices[0], other.m_vertices[1], other.m_vertices[2], temp_points);
- if (clipped_count == 0) return 0;
+ if (clipped_count == 0) return 0;
- btVector3 temp_points1[MAX_TRI_CLIPPING];
+ btVector3 temp_points1[MAX_TRI_CLIPPING];
+ // edge 1
+ get_edge_plane(1, edgeplane);
- // edge 1
- get_edge_plane(1,edgeplane);
+ clipped_count = bt_plane_clip_polygon(edgeplane, temp_points, clipped_count, temp_points1);
+ if (clipped_count == 0) return 0;
- clipped_count = bt_plane_clip_polygon(edgeplane,temp_points,clipped_count,temp_points1);
+ // edge 2
+ get_edge_plane(2, edgeplane);
- if (clipped_count == 0) return 0;
+ clipped_count = bt_plane_clip_polygon(
+ edgeplane, temp_points1, clipped_count, clipped_points);
- // edge 2
- get_edge_plane(2,edgeplane);
-
- clipped_count = bt_plane_clip_polygon(
- edgeplane,temp_points1,clipped_count,clipped_points);
-
- return clipped_count;
+ return clipped_count;
}
-bool btPrimitiveTriangle::find_triangle_collision_clip_method(btPrimitiveTriangle & other, GIM_TRIANGLE_CONTACT & contacts)
+bool btPrimitiveTriangle::find_triangle_collision_clip_method(btPrimitiveTriangle& other, GIM_TRIANGLE_CONTACT& contacts)
{
- btScalar margin = m_margin + other.m_margin;
-
- btVector3 clipped_points[MAX_TRI_CLIPPING];
- int clipped_count;
- //create planes
- // plane v vs U points
-
- GIM_TRIANGLE_CONTACT contacts1;
-
- contacts1.m_separating_normal = m_plane;
-
-
- clipped_count = clip_triangle(other,clipped_points);
-
- if (clipped_count == 0 )
- {
- return false;//Reject
- }
-
- //find most deep interval face1
- contacts1.merge_points(contacts1.m_separating_normal,margin,clipped_points,clipped_count);
- if (contacts1.m_point_count == 0) return false; // too far
- //Normal pointing to this triangle
- contacts1.m_separating_normal *= -1.f;
-
-
- //Clip tri1 by tri2 edges
- GIM_TRIANGLE_CONTACT contacts2;
- contacts2.m_separating_normal = other.m_plane;
-
- clipped_count = other.clip_triangle(*this,clipped_points);
-
- if (clipped_count == 0 )
- {
- return false;//Reject
- }
-
- //find most deep interval face1
- contacts2.merge_points(contacts2.m_separating_normal,margin,clipped_points,clipped_count);
- if (contacts2.m_point_count == 0) return false; // too far
-
-
-
-
- ////check most dir for contacts
- if (contacts2.m_penetration_depth<contacts1.m_penetration_depth)
- {
- contacts.copy_from(contacts2);
- }
- else
- {
- contacts.copy_from(contacts1);
- }
- return true;
+ btScalar margin = m_margin + other.m_margin;
+
+ btVector3 clipped_points[MAX_TRI_CLIPPING];
+ int clipped_count;
+ //create planes
+ // plane v vs U points
+
+ GIM_TRIANGLE_CONTACT contacts1;
+
+ contacts1.m_separating_normal = m_plane;
+
+ clipped_count = clip_triangle(other, clipped_points);
+
+ if (clipped_count == 0)
+ {
+ return false; //Reject
+ }
+
+ //find most deep interval face1
+ contacts1.merge_points(contacts1.m_separating_normal, margin, clipped_points, clipped_count);
+ if (contacts1.m_point_count == 0) return false; // too far
+ //Normal pointing to this triangle
+ contacts1.m_separating_normal *= -1.f;
+
+ //Clip tri1 by tri2 edges
+ GIM_TRIANGLE_CONTACT contacts2;
+ contacts2.m_separating_normal = other.m_plane;
+
+ clipped_count = other.clip_triangle(*this, clipped_points);
+
+ if (clipped_count == 0)
+ {
+ return false; //Reject
+ }
+
+ //find most deep interval face1
+ contacts2.merge_points(contacts2.m_separating_normal, margin, clipped_points, clipped_count);
+ if (contacts2.m_point_count == 0) return false; // too far
+
+ ////check most dir for contacts
+ if (contacts2.m_penetration_depth < contacts1.m_penetration_depth)
+ {
+ contacts.copy_from(contacts2);
+ }
+ else
+ {
+ contacts.copy_from(contacts1);
+ }
+ return true;
}
-
-
///class btTriangleShapeEx: public btTriangleShape
bool btTriangleShapeEx::overlap_test_conservative(const btTriangleShapeEx& other)
{
- btScalar total_margin = getMargin() + other.getMargin();
+ btScalar total_margin = getMargin() + other.getMargin();
- btVector4 plane0;
- buildTriPlane(plane0);
- btVector4 plane1;
- other.buildTriPlane(plane1);
+ btVector4 plane0;
+ buildTriPlane(plane0);
+ btVector4 plane1;
+ other.buildTriPlane(plane1);
- // classify points on other triangle
- btScalar dis0 = bt_distance_point_plane(plane0,other.m_vertices1[0]) - total_margin;
+ // classify points on other triangle
+ btScalar dis0 = bt_distance_point_plane(plane0, other.m_vertices1[0]) - total_margin;
- btScalar dis1 = bt_distance_point_plane(plane0,other.m_vertices1[1]) - total_margin;
+ btScalar dis1 = bt_distance_point_plane(plane0, other.m_vertices1[1]) - total_margin;
- btScalar dis2 = bt_distance_point_plane(plane0,other.m_vertices1[2]) - total_margin;
+ btScalar dis2 = bt_distance_point_plane(plane0, other.m_vertices1[2]) - total_margin;
- if (dis0>0.0f&&dis1>0.0f&&dis2>0.0f) return false;
+ if (dis0 > 0.0f && dis1 > 0.0f && dis2 > 0.0f) return false;
- // classify points on this triangle
- dis0 = bt_distance_point_plane(plane1,m_vertices1[0]) - total_margin;
+ // classify points on this triangle
+ dis0 = bt_distance_point_plane(plane1, m_vertices1[0]) - total_margin;
- dis1 = bt_distance_point_plane(plane1,m_vertices1[1]) - total_margin;
+ dis1 = bt_distance_point_plane(plane1, m_vertices1[1]) - total_margin;
- dis2 = bt_distance_point_plane(plane1,m_vertices1[2]) - total_margin;
+ dis2 = bt_distance_point_plane(plane1, m_vertices1[2]) - total_margin;
- if (dis0>0.0f&&dis1>0.0f&&dis2>0.0f) return false;
+ if (dis0 > 0.0f && dis1 > 0.0f && dis2 > 0.0f) return false;
- return true;
+ return true;
}
-
-
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/btTriangleShapeEx.h b/thirdparty/bullet/BulletCollision/Gimpact/btTriangleShapeEx.h
index 973c2ed127..568a1ce811 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/btTriangleShapeEx.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/btTriangleShapeEx.h
@@ -21,7 +21,6 @@ subject to the following restrictions:
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
@@ -31,16 +30,15 @@ subject to the following restrictions:
#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];
+ 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)
{
@@ -48,7 +46,7 @@ struct GIM_TRIANGLE_CONTACT
m_separating_normal = other.m_separating_normal;
m_point_count = other.m_point_count;
int i = m_point_count;
- while(i--)
+ while (i--)
{
m_points[i] = other.m_points[i];
}
@@ -63,14 +61,11 @@ struct GIM_TRIANGLE_CONTACT
copy_from(other);
}
- //! classify points that are closer
- void merge_points(const btVector4 & plane,
- btScalar margin, const btVector3 * points, int point_count);
-
+ //! classify points that are closer
+ void merge_points(const btVector4& plane,
+ btScalar margin, const btVector3* points, int point_count);
};
-
-
class btPrimitiveTriangle
{
public:
@@ -78,17 +73,15 @@ public:
btVector4 m_plane;
btScalar m_margin;
btScalar m_dummy;
- btPrimitiveTriangle():m_margin(0.01f)
+ 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]);
+ 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));
+ m_plane.setValue(normal[0], normal[1], normal[2], m_vertices[0].dot(normal));
}
//! Test if triangles could collide
@@ -98,14 +91,14 @@ public:
/*!
\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)
+ 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]);
@@ -117,44 +110,41 @@ public:
\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 );
+ 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);
+ 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
+class btTriangleShapeEx : public btTriangleShape
{
public:
-
- btTriangleShapeEx():btTriangleShape(btVector3(0,0,0),btVector3(0,0,0),btVector3(0,0,0))
+ 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 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])
+ 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
+ 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);
+ btAABB trianglebox(tv0, tv1, tv2, m_collisionMargin);
aabbMin = trianglebox.m_min;
aabbMax = trianglebox.m_max;
}
@@ -166,15 +156,14 @@ public:
m_vertices1[2] = t(m_vertices1[2]);
}
- SIMD_FORCE_INLINE void buildTriPlane(btVector4 & plane) const
+ SIMD_FORCE_INLINE void buildTriPlane(btVector4& plane) const
{
- btVector3 normal = (m_vertices1[1]-m_vertices1[0]).cross(m_vertices1[2]-m_vertices1[0]);
+ 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));
+ 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
+#endif //GIMPACT_TRIANGLE_MESH_SHAPE_H
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/gim_array.h b/thirdparty/bullet/BulletCollision/Gimpact/gim_array.h
index cda51a5fce..fc2dc38a33 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/gim_array.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/gim_array.h
@@ -34,47 +34,46 @@ email: projectileman@yahoo.com
#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<typename T>
+template <typename T>
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;
+ //! 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)
+ if (newsize == 0)
{
destroyData();
return true;
}
- if(m_size>0)
+ if (m_size > 0)
{
- m_data = (T*)gim_realloc(m_data,m_size*sizeof(T),newsize*sizeof(T));
+ m_data = (T*)gim_realloc(m_data, m_size * sizeof(T), newsize * sizeof(T));
}
else
{
- m_data = (T*)gim_alloc(newsize*sizeof(T));
+ m_data = (T*)gim_alloc(newsize * sizeof(T));
}
m_allocated_size = newsize;
return true;
@@ -82,243 +81,238 @@ public:
inline bool growingCheck()
{
- if(m_allocated_size<=m_size)
+ 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;
+ 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)
+ //!@}
+ //! 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
+ 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* pointer() { return m_data; }
+ inline const T* pointer() const
+ {
+ return m_data;
+ }
- inline T * get_pointer_at(GUINT i)
+ inline T* get_pointer_at(GUINT i)
{
return m_data + i;
}
- inline const T * get_pointer_at(GUINT i) const
+ inline const T* get_pointer_at(GUINT i) const
{
return m_data + i;
}
- inline T & at(GUINT i)
+ inline T& at(GUINT i)
{
return m_data[i];
}
- inline const T & at(GUINT i) const
+ inline const T& at(GUINT i) const
{
return m_data[i];
}
- inline T & front()
+ inline T& front()
{
return *m_data;
}
- inline const T & front() const
+ inline const T& front() const
{
return *m_data;
}
- inline T & back()
+ inline T& back()
{
- return m_data[m_size-1];
+ return m_data[m_size - 1];
}
- inline const T & back() const
+ inline const T& back() const
{
- return m_data[m_size-1];
+ return m_data[m_size - 1];
}
-
inline void swap(GUINT i, GUINT j)
{
- gim_swap_elements(m_data,i,j);
+ gim_swap_elements(m_data, i, j);
}
- inline void push_back(const T & obj)
+ inline void push_back(const T& obj)
{
- this->growingCheck();
- m_data[m_size] = obj;
- m_size++;
+ 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++;
+ this->growingCheck();
+ m_size++;
}
- inline void push_back_memcpy(const T & obj)
+ inline void push_back_memcpy(const T& obj)
{
- this->growingCheck();
- gim_simd_memcpy(&m_data[m_size],&obj,sizeof(T));
- m_size++;
+ 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();
+ 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--;
+ m_size--;
}
- //! fast erase
+ //! fast erase
inline void erase(GUINT index)
{
- if(index<m_size-1)
- {
- swap(index,m_size-1);
- }
- pop_back();
+ 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));
- }
+ 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);
+ 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;
- }
+ 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 refit()
+ inline void insert(const T& obj, GUINT index)
{
- resizeData(m_size);
+ 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
+#endif // GIM_CONTAINERS_H_INCLUDED
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/gim_basic_geometry_operations.h b/thirdparty/bullet/BulletCollision/Gimpact/gim_basic_geometry_operations.h
index 0c48cb60fc..7ab783672d 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/gim_basic_geometry_operations.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/gim_basic_geometry_operations.h
@@ -35,12 +35,8 @@ email: projectileman@yahoo.com
-----------------------------------------------------------------------------
*/
-
#include "gim_linear_math.h"
-
-
-
#ifndef PLANEDIREPSILON
#define PLANEDIREPSILON 0.0000001f
#endif
@@ -49,77 +45,82 @@ email: projectileman@yahoo.com
#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); \
-}\
+#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);\
-}\
+#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);\
-}\
+#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); \
-}\
+#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<typename CLASS_POINT,typename CLASS_PLANE>
+template <typename CLASS_POINT, typename CLASS_PLANE>
SIMD_FORCE_INLINE bool POINT_IN_HULL(
- const CLASS_POINT& point,const CLASS_PLANE * planes,GUINT plane_count)
+ const CLASS_POINT &point, const CLASS_PLANE *planes, GUINT plane_count)
{
GREAL _dis;
- for (GUINT _i = 0;_i< plane_count;++_i)
+ for (GUINT _i = 0; _i < plane_count; ++_i)
{
- _dis = DISTANCE_PLANE_POINT(planes[_i],point);
- if(_dis>0.0f) return false;
+ _dis = DISTANCE_PLANE_POINT(planes[_i], point);
+ if (_dis > 0.0f) return false;
}
return true;
}
-template<typename CLASS_POINT,typename CLASS_PLANE>
+template <typename CLASS_POINT, typename CLASS_PLANE>
SIMD_FORCE_INLINE void PLANE_CLIP_SEGMENT(
- const CLASS_POINT& s1,
- const CLASS_POINT &s2,const CLASS_PLANE &plane,CLASS_POINT &clipped)
+ 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);
+ 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
@@ -152,30 +153,30 @@ intersection type must have the following values
</ul>
*/
-template<typename CLASS_POINT,typename CLASS_PLANE>
+template <typename CLASS_POINT, typename CLASS_PLANE>
SIMD_FORCE_INLINE eLINE_PLANE_INTERSECTION_TYPE PLANE_CLIP_SEGMENT2(
- const CLASS_POINT& s1,
+ const CLASS_POINT &s1,
const CLASS_POINT &s2,
- const CLASS_PLANE &plane,CLASS_POINT &clipped)
+ 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)
+ 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;
+ if (_dis1 < _dis2) return G_FRONT_PLANE_S1;
+ return G_FRONT_PLANE_S2;
}
- else if(_dis1 <G_EPSILON && _dis2 <G_EPSILON)
+ else if (_dis1 < G_EPSILON && _dis2 < G_EPSILON)
{
- if(_dis1>_dis2) return G_BACK_PLANE_S1;
- return G_BACK_PLANE_S2;
+ 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;
+ 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;
}
@@ -194,43 +195,42 @@ intersection_type must have the following values
<li> 5 : Segment collides plane, s2 in back
</ul>
*/
-template<typename CLASS_POINT,typename CLASS_PLANE>
+template <typename CLASS_POINT, typename CLASS_PLANE>
SIMD_FORCE_INLINE eLINE_PLANE_INTERSECTION_TYPE PLANE_CLIP_SEGMENT_CLOSEST(
- const CLASS_POINT& s1,
+ const CLASS_POINT &s1,
const CLASS_POINT &s2,
const CLASS_PLANE &plane,
- CLASS_POINT &clipped1,CLASS_POINT &clipped2)
+ CLASS_POINT &clipped1, CLASS_POINT &clipped2)
{
- eLINE_PLANE_INTERSECTION_TYPE intersection_type = PLANE_CLIP_SEGMENT2(s1,s2,plane,clipped1);
- switch(intersection_type)
+ 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;
+ 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)
@@ -239,23 +239,23 @@ SIMD_FORCE_INLINE eLINE_PLANE_INTERSECTION_TYPE PLANE_CLIP_SEGMENT_CLOSEST(
Intersects plane in one way only. The ray must face the plane (normals must be in opossite directions).<br/>
It uses the PLANEDIREPSILON constant.
*/
-template<typename T,typename CLASS_POINT,typename CLASS_PLANE>
+template <typename T, typename CLASS_POINT, typename CLASS_PLANE>
SIMD_FORCE_INLINE bool RAY_PLANE_COLLISION(
- const CLASS_PLANE & plane,
- const CLASS_POINT & vDir,
- const CLASS_POINT & vPoint,
- CLASS_POINT & pout,T &tparam)
+ 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)
+ GREAL _dis, _dotdir;
+ _dotdir = VEC_DOT(plane, vDir);
+ if (_dotdir < PLANEDIREPSILON)
{
- return false;
+ return false;
}
- _dis = DISTANCE_PLANE_POINT(plane,vPoint);
- tparam = -_dis/_dotdir;
- VEC_SCALE(pout,tparam,vDir);
- VEC_SUM(pout,vPoint,pout);
+ _dis = DISTANCE_PLANE_POINT(plane, vPoint);
+ tparam = -_dis / _dotdir;
+ VEC_SCALE(pout, tparam, vDir);
+ VEC_SUM(pout, vPoint, pout);
return true;
}
@@ -266,39 +266,39 @@ SIMD_FORCE_INLINE bool RAY_PLANE_COLLISION(
-1 if the ray collides in front
-2 if the ray collides in back
*/
-template<typename T,typename CLASS_POINT,typename CLASS_PLANE>
+template <typename T, typename CLASS_POINT, typename CLASS_PLANE>
SIMD_FORCE_INLINE GUINT LINE_PLANE_COLLISION(
- const CLASS_PLANE & plane,
- const CLASS_POINT & vDir,
- const CLASS_POINT & vPoint,
- CLASS_POINT & pout,
+ 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)
+ GREAL _dis, _dotdir;
+ _dotdir = VEC_DOT(plane, vDir);
+ if (btFabs(_dotdir) < PLANEDIREPSILON)
{
tparam = tmax;
- return 0;
+ return 0;
}
- _dis = DISTANCE_PLANE_POINT(plane,vPoint);
- char returnvalue = _dis<0.0f?2:1;
- tparam = -_dis/_dotdir;
+ _dis = DISTANCE_PLANE_POINT(plane, vPoint);
+ char returnvalue = _dis < 0.0f ? 2 : 1;
+ tparam = -_dis / _dotdir;
- if(tparam<tmin)
+ if (tparam < tmin)
{
returnvalue = 0;
tparam = tmin;
}
- else if(tparam>tmax)
+ else if (tparam > tmax)
{
returnvalue = 0;
tparam = tmax;
}
- VEC_SCALE(pout,tparam,vDir);
- VEC_SUM(pout,vPoint,pout);
+ VEC_SCALE(pout, tparam, vDir);
+ VEC_SUM(pout, vPoint, pout);
return returnvalue;
}
@@ -312,24 +312,24 @@ SIMD_FORCE_INLINE GUINT LINE_PLANE_COLLISION(
\return true if the planes intersect, 0 if paralell.
*/
-template<typename CLASS_POINT,typename CLASS_PLANE>
+template <typename CLASS_POINT, typename CLASS_PLANE>
SIMD_FORCE_INLINE bool INTERSECT_PLANES(
- const CLASS_PLANE &p1,
- const CLASS_PLANE &p2,
- CLASS_POINT &p,
- CLASS_POINT &d)
+ 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;
+ 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;
+ _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;
}
@@ -337,32 +337,31 @@ SIMD_FORCE_INLINE bool INTERSECT_PLANES(
/*! Finds the closest point(cp) to (v) on a segment (e1,e2)
*/
-template<typename CLASS_POINT>
+template <typename CLASS_POINT>
SIMD_FORCE_INLINE void CLOSEST_POINT_ON_SEGMENT(
- CLASS_POINT & cp, const CLASS_POINT & v,
- const CLASS_POINT &e1,const CLASS_POINT &e2)
+ 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);
+ 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)
+ _scalar /= VEC_DOT(_n, _n);
+ if (_scalar < 0.0f)
{
- VEC_COPY(cp,e1);
+ VEC_COPY(cp, e1);
}
- else if(_scalar >1.0f)
+ else if (_scalar > 1.0f)
{
- VEC_COPY(cp,e2);
+ VEC_COPY(cp, e2);
}
else
{
- VEC_SCALE(cp,_scalar,_n);
- VEC_SUM(cp,cp,e1);
+ 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
@@ -374,117 +373,113 @@ SIMD_FORCE_INLINE void CLOSEST_POINT_ON_SEGMENT(
\param dointersect 0 if the lines won't intersect, else 1
*/
-template<typename T,typename CLASS_POINT>
+template <typename T, typename CLASS_POINT>
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)
+ 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);
+ 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;
+ 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<typename CLASS_POINT>
+template <typename CLASS_POINT>
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)
+ 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);
-}
-
+ 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
/*!
@@ -497,37 +492,36 @@ SIMD_FORCE_INLINE void SEGMENT_COLLISION(
*\param tlast the maximum projection. Assign to INFINITY at first.
*\return true if there is an intersection.
*/
-template<typename T>
-SIMD_FORCE_INLINE bool BOX_AXIS_INTERSECT(T pos, T dir,T bmin, T bmax, T & tfirst, T & tlast)
+template <typename T>
+SIMD_FORCE_INLINE bool BOX_AXIS_INTERSECT(T pos, T dir, T bmin, T bmax, T &tfirst, T &tlast)
{
- if(GIM_IS_ZERO(dir))
+ if (GIM_IS_ZERO(dir))
{
- return !(pos < bmin || pos > bmax);
+ return !(pos < bmin || pos > bmax);
}
GREAL a0 = (bmin - pos) / dir;
GREAL a1 = (bmax - pos) / dir;
- if(a0 > a1) GIM_SWAP_NUMBERS(a0, a1);
+ 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<typename T>
+template <typename T>
SIMD_FORCE_INLINE void SORT_3_INDICES(
- const T * values,
- GUINT * order_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;
+ GUINT i0 = (order_indices[0] + 1) % 3;
+ GUINT i1 = (i0 + 1) % 3;
- if(values[i0] < values[i1])
+ if (values[i0] < values[i1])
{
order_indices[1] = i0;
order_indices[2] = i1;
@@ -539,8 +533,4 @@ SIMD_FORCE_INLINE void SORT_3_INDICES(
}
}
-
-
-
-
-#endif // GIM_VECTOR_H_INCLUDED
+#endif // GIM_VECTOR_H_INCLUDED
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/gim_bitset.h b/thirdparty/bullet/BulletCollision/Gimpact/gim_bitset.h
index 7dee48a4c7..c1fb41a5c0 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/gim_bitset.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/gim_bitset.h
@@ -34,34 +34,32 @@ email: projectileman@yahoo.com
#include "gim_array.h"
-
#define GUINT_BIT_COUNT 32
#define GUINT_EXPONENT 5
class gim_bitset
{
public:
- gim_array<GUINT> m_container;
-
- gim_bitset()
- {
+ gim_array<GUINT> m_container;
- }
+ gim_bitset()
+ {
+ }
- gim_bitset(GUINT bits_count)
- {
- resize(bits_count);
- }
+ gim_bitset(GUINT bits_count)
+ {
+ resize(bits_count);
+ }
- ~gim_bitset()
- {
- }
+ ~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.resize(newsize / GUINT_BIT_COUNT + 1, false);
+ while (oldsize < m_container.size())
{
m_container[oldsize] = 0;
}
@@ -70,12 +68,12 @@ public:
inline GUINT size()
{
- return m_container.size()*GUINT_BIT_COUNT;
+ return m_container.size() * GUINT_BIT_COUNT;
}
inline void set_all()
{
- for(GUINT i = 0;i<m_container.size();++i)
+ for (GUINT i = 0; i < m_container.size(); ++i)
{
m_container[i] = 0xffffffff;
}
@@ -83,7 +81,7 @@ public:
inline void clear_all()
{
- for(GUINT i = 0;i<m_container.size();++i)
+ for (GUINT i = 0; i < m_container.size(); ++i)
{
m_container[i] = 0;
}
@@ -91,33 +89,29 @@ public:
inline void set(GUINT bit_index)
{
- if(bit_index>=size())
+ if (bit_index >= size())
{
resize(bit_index);
}
- m_container[bit_index >> GUINT_EXPONENT] |= (1 << (bit_index & (GUINT_BIT_COUNT-1)));
+ 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())
+ if (bit_index >= size())
{
return 0;
}
char value = m_container[bit_index >> GUINT_EXPONENT] &
- (1 << (bit_index & (GUINT_BIT_COUNT-1)));
+ (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)));
+ m_container[bit_index >> GUINT_EXPONENT] &= ~(1 << (bit_index & (GUINT_BIT_COUNT - 1)));
}
};
-
-
-
-
-#endif // GIM_CONTAINERS_H_INCLUDED
+#endif // GIM_CONTAINERS_H_INCLUDED
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/gim_box_collision.h b/thirdparty/bullet/BulletCollision/Gimpact/gim_box_collision.h
index a051b4fdbf..9f7cbe732f 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/gim_box_collision.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/gim_box_collision.h
@@ -35,8 +35,6 @@ email: projectileman@yahoo.com
#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,
@@ -99,52 +97,50 @@ email: projectileman@yahoo.com
#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;\
-}\
+#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);\
-}\
+#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
+ 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);
+ 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();
@@ -154,42 +150,40 @@ public:
{
}
-
- GIM_BOX_BOX_TRANSFORM_CACHE(mat4f trans1_to_0)
+ 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)
+ 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)
+ 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_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)
+ 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_T1to0 += m_R1to0 * trans1.getOrigin();
m_R1to0 *= trans1.getBasis();
calc_absolute_matrix();
}
- SIMD_FORCE_INLINE btVector3 transform(const btVector3 & point)
+ SIMD_FORCE_INLINE btVector3 transform(const btVector3 &point)
{
- return point.dot3(m_R1to0[0], m_R1to0[1], m_R1to0[2]) + m_T1to0;
+ return point.dot3(m_R1to0[0], m_R1to0[1], m_R1to0[2]) + m_T1to0;
}
};
@@ -205,34 +199,34 @@ public:
btVector3 m_max;
GIM_AABB()
- {}
-
+ {
+ }
- GIM_AABB(const btVector3 & V1,
- const btVector3 & V2,
- const btVector3 & V3)
+ 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_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_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,
+ 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_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_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;
@@ -242,13 +236,11 @@ public:
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) : 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)
+ 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;
@@ -289,34 +281,34 @@ public:
m_max[2] = other.m_max[2] + margin;
}
- template<typename CLASS_POINT>
+ template <typename CLASS_POINT>
SIMD_FORCE_INLINE void calc_from_triangle(
- const CLASS_POINT & V1,
- const CLASS_POINT & V2,
- const CLASS_POINT & V3)
+ 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_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_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<typename CLASS_POINT>
+ template <typename CLASS_POINT>
SIMD_FORCE_INLINE void calc_from_triangle_margin(
- const CLASS_POINT & V1,
- const CLASS_POINT & V2,
- const CLASS_POINT & V3, btScalar 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_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_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;
@@ -327,74 +319,73 @@ public:
}
//! Apply a transform to an AABB
- SIMD_FORCE_INLINE void appy_transform(const btTransform & trans)
+ SIMD_FORCE_INLINE void appy_transform(const btTransform &trans)
{
- btVector3 center = (m_max+m_min)*0.5f;
+ 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());
-
+ 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)
+ 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_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]);
+ 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<typename CLASS_POINT>
- SIMD_FORCE_INLINE void merge_point(const CLASS_POINT & point)
+ template <typename CLASS_POINT>
+ 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_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]);
+ 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 & center,btVector3 & extend) const
+ SIMD_FORCE_INLINE void get_center_extend(btVector3 &center, btVector3 &extend) const
{
- center = (m_max+m_min)*0.5f;
+ 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
+ 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_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]);
+ 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
+ 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])
+ 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;
}
@@ -406,35 +397,34 @@ public:
\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)
+ SIMD_FORCE_INLINE bool collide_ray(const btVector3 &vorigin, const btVector3 &vdir)
{
- btVector3 extents,center;
- this->get_center_extend(center,extents);;
+ 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;
+ 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;
+ 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;
-
+ 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;
+ 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;
+ 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;
+ 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
+ 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;
+ btVector3 center = (m_max + m_min) * 0.5f;
+ btVector3 extend = m_max - center;
- btScalar _fOrigin = direction.dot(center);
+ btScalar _fOrigin = direction.dot(center);
btScalar _fMaximumExtent = extend.dot(direction.absolute());
vmin = _fOrigin - _fMaximumExtent;
vmax = _fOrigin + _fMaximumExtent;
@@ -442,22 +432,22 @@ public:
SIMD_FORCE_INLINE ePLANE_INTERSECTION_TYPE plane_classify(const btVector4 &plane) const
{
- btScalar _fmin,_fmax;
- this->projection_interval(plane,_fmin,_fmax);
+ btScalar _fmin, _fmax;
+ this->projection_interval(plane, _fmin, _fmax);
- if(plane[3] > _fmax + BOX_PLANE_EPSILON)
+ if (plane[3] > _fmax + BOX_PLANE_EPSILON)
{
- return G_BACK_PLANE; // 0
+ return G_BACK_PLANE; // 0
}
- if(plane[3]+BOX_PLANE_EPSILON >=_fmin)
+ if (plane[3] + BOX_PLANE_EPSILON >= _fmin)
{
- return G_COLLIDE_PLANE; //1
+ return G_COLLIDE_PLANE; //1
}
- return G_FRONT_PLANE;//2
+ return G_FRONT_PLANE; //2
}
- SIMD_FORCE_INLINE bool overlapping_trans_conservative(const GIM_AABB & box, btTransform & trans1_to_0)
+ 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);
@@ -466,52 +456,50 @@ public:
//! 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)
+ 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 ea, eb; //extends
+ btVector3 ca, cb; //extends
+ get_center_extend(ca, ea);
+ box.get_center_extend(cb, eb);
btVector3 T;
- btScalar t,t2;
+ btScalar t, t2;
int i;
// Class I : A's basis vectors
- for(i=0;i<3;i++)
+ for (i = 0; i < 3; i++)
{
- T[i] = transcache.m_R1to0[i].dot(cb) + transcache.m_T1to0[i] - ca[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;
+ if (GIM_GREATER(T[i], t)) return false;
}
// Class II : B's basis vectors
- for(i=0;i<3;i++)
+ 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;
+ 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)
+ if (fulltest)
{
- int j,m,n,o,p,q,r;
- for(i=0;i<3;i++)
+ 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++)
+ 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;
+ 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;
}
}
}
@@ -520,7 +508,7 @@ public:
//! Simple test for planes.
SIMD_FORCE_INLINE bool collide_plane(
- const btVector4 & plane)
+ const btVector4 &plane)
{
ePLANE_INTERSECTION_TYPE classify = plane_classify(plane);
return (classify == G_COLLIDE_PLANE);
@@ -528,15 +516,15 @@ public:
//! 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 btVector3 &p1,
+ const btVector3 &p2,
+ const btVector3 &p3,
+ const btVector4 &triangle_plane)
{
- if(!collide_plane(triangle_plane)) return false;
+ if (!collide_plane(triangle_plane)) return false;
- btVector3 center,extends;
- this->get_center_extend(center,extends);
+ btVector3 center, extends;
+ this->get_center_extend(center, extends);
const btVector3 v1(p1 - center);
const btVector3 v2(p2 - center);
@@ -546,30 +534,29 @@ public:
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_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_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);
-
+ 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_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_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);
+ 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_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_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);
+ TEST_CROSS_EDGE_BOX_Z_AXIS_MCR(diff, abs_diff, v3, v2, extends);
return true;
}
@@ -577,17 +564,15 @@ public:
#ifndef BT_BOX_COLLISION_H_INCLUDED
//! Compairison of transformation objects
-SIMD_FORCE_INLINE bool btCompareTransformsEqual(const btTransform & t1,const btTransform & t2)
+SIMD_FORCE_INLINE bool btCompareTransformsEqual(const btTransform &t1, const btTransform &t2)
{
- if(!(t1.getOrigin() == t2.getOrigin()) ) return false;
+ 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;
+ 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
+#endif // GIM_BOX_COLLISION_H_INCLUDED
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/gim_box_set.cpp b/thirdparty/bullet/BulletCollision/Gimpact/gim_box_set.cpp
index 0c3d7ba8db..0c7a6b7fc1 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/gim_box_set.cpp
+++ b/thirdparty/bullet/BulletCollision/Gimpact/gim_box_set.cpp
@@ -28,67 +28,64 @@ email: projectileman@yahoo.com
-----------------------------------------------------------------------------
*/
-
#include "gim_box_set.h"
-
GUINT GIM_BOX_TREE::_calc_splitting_axis(
- gim_array<GIM_AABB_DATA> & primitive_boxes, GUINT startIndex, GUINT endIndex)
+ gim_array<GIM_AABB_DATA>& primitive_boxes, GUINT startIndex, GUINT endIndex)
{
GUINT i;
- btVector3 means(btScalar(0.),btScalar(0.),btScalar(0.));
- btVector3 variance(btScalar(0.),btScalar(0.),btScalar(0.));
- GUINT numIndices = endIndex-startIndex;
+ btVector3 means(btScalar(0.), btScalar(0.), btScalar(0.));
+ btVector3 variance(btScalar(0.), btScalar(0.), btScalar(0.));
+ GUINT numIndices = endIndex - startIndex;
- for (i=startIndex;i<endIndex;i++)
+ for (i = startIndex; i < endIndex; i++)
{
- btVector3 center = btScalar(0.5)*(primitive_boxes[i].m_bound.m_max +
- primitive_boxes[i].m_bound.m_min);
- means+=center;
+ btVector3 center = btScalar(0.5) * (primitive_boxes[i].m_bound.m_max +
+ primitive_boxes[i].m_bound.m_min);
+ means += center;
}
- means *= (btScalar(1.)/(btScalar)numIndices);
+ means *= (btScalar(1.) / (btScalar)numIndices);
- for (i=startIndex;i<endIndex;i++)
+ for (i = startIndex; i < endIndex; i++)
{
- btVector3 center = btScalar(0.5)*(primitive_boxes[i].m_bound.m_max +
- primitive_boxes[i].m_bound.m_min);
- btVector3 diff2 = center-means;
+ btVector3 center = btScalar(0.5) * (primitive_boxes[i].m_bound.m_max +
+ primitive_boxes[i].m_bound.m_min);
+ btVector3 diff2 = center - means;
diff2 = diff2 * diff2;
variance += diff2;
}
- variance *= (btScalar(1.)/ ((btScalar)numIndices-1) );
+ variance *= (btScalar(1.) / ((btScalar)numIndices - 1));
return variance.maxAxis();
}
-
GUINT GIM_BOX_TREE::_sort_and_calc_splitting_index(
- gim_array<GIM_AABB_DATA> & primitive_boxes, GUINT startIndex,
+ gim_array<GIM_AABB_DATA>& primitive_boxes, GUINT startIndex,
GUINT endIndex, GUINT splitAxis)
{
GUINT i;
- GUINT splitIndex =startIndex;
+ GUINT splitIndex = startIndex;
GUINT numIndices = endIndex - startIndex;
// average of centers
btScalar splitValue = 0.0f;
- for (i=startIndex;i<endIndex;i++)
+ for (i = startIndex; i < endIndex; i++)
{
- splitValue+= 0.5f*(primitive_boxes[i].m_bound.m_max[splitAxis] +
- primitive_boxes[i].m_bound.m_min[splitAxis]);
+ splitValue += 0.5f * (primitive_boxes[i].m_bound.m_max[splitAxis] +
+ primitive_boxes[i].m_bound.m_min[splitAxis]);
}
splitValue /= (btScalar)numIndices;
//sort leafNodes so all values larger then splitValue comes first, and smaller values start from 'splitIndex'.
- for (i=startIndex;i<endIndex;i++)
+ for (i = startIndex; i < endIndex; i++)
{
- btScalar center = 0.5f*(primitive_boxes[i].m_bound.m_max[splitAxis] +
- primitive_boxes[i].m_bound.m_min[splitAxis]);
+ btScalar center = 0.5f * (primitive_boxes[i].m_bound.m_max[splitAxis] +
+ primitive_boxes[i].m_bound.m_min[splitAxis]);
if (center > splitValue)
{
//swap
- primitive_boxes.swap(i,splitIndex);
+ primitive_boxes.swap(i, splitIndex);
splitIndex++;
}
}
@@ -102,28 +99,27 @@ GUINT GIM_BOX_TREE::_sort_and_calc_splitting_index(
//bool unbalanced2 = true;
//this should be safe too:
- GUINT rangeBalancedIndices = numIndices/3;
- bool unbalanced = ((splitIndex<=(startIndex+rangeBalancedIndices)) || (splitIndex >=(endIndex-1-rangeBalancedIndices)));
+ GUINT rangeBalancedIndices = numIndices / 3;
+ bool unbalanced = ((splitIndex <= (startIndex + rangeBalancedIndices)) || (splitIndex >= (endIndex - 1 - rangeBalancedIndices)));
if (unbalanced)
{
- splitIndex = startIndex+ (numIndices>>1);
+ splitIndex = startIndex + (numIndices >> 1);
}
- btAssert(!((splitIndex==startIndex) || (splitIndex == (endIndex))));
+ btAssert(!((splitIndex == startIndex) || (splitIndex == (endIndex))));
return splitIndex;
}
-
-void GIM_BOX_TREE::_build_sub_tree(gim_array<GIM_AABB_DATA> & primitive_boxes, GUINT startIndex, GUINT endIndex)
+void GIM_BOX_TREE::_build_sub_tree(gim_array<GIM_AABB_DATA>& primitive_boxes, GUINT startIndex, GUINT endIndex)
{
GUINT current_index = m_num_nodes++;
- btAssert((endIndex-startIndex)>0);
+ btAssert((endIndex - startIndex) > 0);
- if((endIndex-startIndex) == 1) //we got a leaf
- {
+ if ((endIndex - startIndex) == 1) //we got a leaf
+ {
m_node_array[current_index].m_left = 0;
m_node_array[current_index].m_right = 0;
m_node_array[current_index].m_escapeIndex = 0;
@@ -138,8 +134,8 @@ void GIM_BOX_TREE::_build_sub_tree(gim_array<GIM_AABB_DATA> & primitive_boxes, G
GUINT splitIndex;
//calc this node bounding box
- m_node_array[current_index].m_bound.invalidate();
- for (splitIndex=startIndex;splitIndex<endIndex;splitIndex++)
+ m_node_array[current_index].m_bound.invalidate();
+ for (splitIndex = startIndex; splitIndex < endIndex; splitIndex++)
{
m_node_array[current_index].m_bound.merge(primitive_boxes[splitIndex].m_bound);
}
@@ -147,36 +143,34 @@ void GIM_BOX_TREE::_build_sub_tree(gim_array<GIM_AABB_DATA> & primitive_boxes, G
//calculate Best Splitting Axis and where to split it. Sort the incoming 'leafNodes' array within range 'startIndex/endIndex'.
//split axis
- splitIndex = _calc_splitting_axis(primitive_boxes,startIndex,endIndex);
+ splitIndex = _calc_splitting_axis(primitive_boxes, startIndex, endIndex);
splitIndex = _sort_and_calc_splitting_index(
- primitive_boxes,startIndex,endIndex,splitIndex);
+ primitive_boxes, startIndex, endIndex, splitIndex);
//configure this inner node : the left node index
m_node_array[current_index].m_left = m_num_nodes;
//build left child tree
- _build_sub_tree(primitive_boxes, startIndex, splitIndex );
+ _build_sub_tree(primitive_boxes, startIndex, splitIndex);
//configure this inner node : the right node index
m_node_array[current_index].m_right = m_num_nodes;
//build right child tree
- _build_sub_tree(primitive_boxes, splitIndex ,endIndex);
+ _build_sub_tree(primitive_boxes, splitIndex, endIndex);
//configure this inner node : the escape index
- m_node_array[current_index].m_escapeIndex = m_num_nodes - current_index;
+ m_node_array[current_index].m_escapeIndex = m_num_nodes - current_index;
}
//! stackless build tree
void GIM_BOX_TREE::build_tree(
- gim_array<GIM_AABB_DATA> & primitive_boxes)
+ gim_array<GIM_AABB_DATA>& primitive_boxes)
{
// initialize node count to 0
m_num_nodes = 0;
// allocate nodes
- m_node_array.resize(primitive_boxes.size()*2);
-
+ m_node_array.resize(primitive_boxes.size() * 2);
+
_build_sub_tree(primitive_boxes, 0, primitive_boxes.size());
}
-
-
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/gim_box_set.h b/thirdparty/bullet/BulletCollision/Gimpact/gim_box_set.h
index 61d190a7df..0522007e4f 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/gim_box_set.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/gim_box_set.h
@@ -33,54 +33,51 @@ email: projectileman@yahoo.com
-----------------------------------------------------------------------------
*/
-
#include "gim_array.h"
#include "gim_radixsort.h"
#include "gim_box_collision.h"
#include "gim_tri_collision.h"
-
-
//! Overlapping pair
struct GIM_PAIR
{
- GUINT m_index1;
- GUINT m_index2;
- GIM_PAIR()
- {}
+ GUINT m_index1;
+ GUINT m_index2;
+ GIM_PAIR()
+ {
+ }
- GIM_PAIR(const GIM_PAIR & p)
- {
- m_index1 = p.m_index1;
- m_index2 = p.m_index2;
+ GIM_PAIR(const GIM_PAIR& p)
+ {
+ m_index1 = p.m_index1;
+ m_index2 = p.m_index2;
}
GIM_PAIR(GUINT index1, GUINT index2)
- {
- m_index1 = index1;
- m_index2 = index2;
+ {
+ m_index1 = index1;
+ m_index2 = index2;
}
};
//! A pairset array
-class gim_pair_set: public gim_array<GIM_PAIR>
+class gim_pair_set : public gim_array<GIM_PAIR>
{
public:
- gim_pair_set():gim_array<GIM_PAIR>(32)
+ gim_pair_set() : gim_array<GIM_PAIR>(32)
{
}
- inline void push_pair(GUINT index1,GUINT index2)
+ inline void push_pair(GUINT index1, GUINT index2)
{
- push_back(GIM_PAIR(index1,index2));
+ push_back(GIM_PAIR(index1, index2));
}
- inline void push_pair_inv(GUINT index1,GUINT index2)
+ inline void push_pair_inv(GUINT index1, GUINT index2)
{
- push_back(GIM_PAIR(index2,index1));
+ push_back(GIM_PAIR(index2, index1));
}
};
-
//! Prototype Base class for primitive classification
/*!
This class is a wrapper for primitive collections.
@@ -90,16 +87,14 @@ This class can manage Compound shapes and trimeshes, and if it is managing trime
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;
+ 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;
@@ -110,22 +105,22 @@ struct GIM_AABB_DATA
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
+ 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;
+ 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);
+ return (!m_left && !m_right);
}
};
@@ -135,14 +130,16 @@ class GIM_BOX_TREE
protected:
GUINT m_num_nodes;
gim_array<GIM_BOX_TREE_NODE> m_node_array;
+
protected:
GUINT _sort_and_calc_splitting_index(
- gim_array<GIM_AABB_DATA> & primitive_boxes,
- GUINT startIndex, GUINT endIndex, GUINT splitAxis);
+ gim_array<GIM_AABB_DATA>& primitive_boxes,
+ GUINT startIndex, GUINT endIndex, GUINT splitAxis);
- GUINT _calc_splitting_axis(gim_array<GIM_AABB_DATA> & primitive_boxes, GUINT startIndex, GUINT endIndex);
+ GUINT _calc_splitting_axis(gim_array<GIM_AABB_DATA>& primitive_boxes, GUINT startIndex, GUINT endIndex);
+
+ void _build_sub_tree(gim_array<GIM_AABB_DATA>& primitive_boxes, GUINT startIndex, GUINT endIndex);
- void _build_sub_tree(gim_array<GIM_AABB_DATA> & primitive_boxes, GUINT startIndex, GUINT endIndex);
public:
GIM_BOX_TREE()
{
@@ -151,7 +148,7 @@ public:
//! prototype functions for box tree management
//!@{
- void build_tree(gim_array<GIM_AABB_DATA> & primitive_boxes);
+ void build_tree(gim_array<GIM_AABB_DATA>& primitive_boxes);
SIMD_FORCE_INLINE void clearNodes()
{
@@ -176,22 +173,22 @@ public:
return m_node_array[nodeindex].m_data;
}
- SIMD_FORCE_INLINE void getNodeBound(GUINT nodeindex, GIM_AABB & bound) const
+ 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)
+ 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
+ SIMD_FORCE_INLINE GUINT getLeftNodeIndex(GUINT nodeindex) const
{
return m_node_array[nodeindex].m_left;
}
- SIMD_FORCE_INLINE GUINT getRightNodeIndex(GUINT nodeindex) const
+ SIMD_FORCE_INLINE GUINT getRightNodeIndex(GUINT nodeindex) const
{
return m_node_array[nodeindex].m_right;
}
@@ -204,78 +201,78 @@ public:
//!@}
};
-
//! 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<typename _GIM_PRIMITIVE_MANAGER_PROTOTYPE, typename _GIM_BOX_TREE_PROTOTYPE>
+template <typename _GIM_PRIMITIVE_MANAGER_PROTOTYPE, typename _GIM_BOX_TREE_PROTOTYPE>
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--)
+ while (nodecount--)
{
- if(isLeafNode(nodecount))
+ if (isLeafNode(nodecount))
{
GIM_AABB leafbox;
- m_primitive_manager.get_primitive_box(getNodeData(nodecount),leafbox);
- setNodeBound(nodecount,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);
+ getNodeBound(childindex, bound);
//get right bound
childindex = getRightNodeIndex(nodecount);
GIM_AABB bound2;
- getNodeBound(childindex,bound2);
+ getNodeBound(childindex, bound2);
bound.merge(bound2);
- setNodeBound(nodecount,bound);
+ setNodeBound(nodecount, bound);
}
}
}
-public:
+public:
GIM_BOX_TREE_TEMPLATE_SET()
{
}
- SIMD_FORCE_INLINE GIM_AABB getGlobalBox() const
+ 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)
+ SIMD_FORCE_INLINE void setPrimitiveManager(const _GIM_PRIMITIVE_MANAGER_PROTOTYPE& primitive_manager)
{
m_primitive_manager = primitive_manager;
}
- const _GIM_PRIMITIVE_MANAGER_PROTOTYPE & getPrimitiveManager() const
+ const _GIM_PRIMITIVE_MANAGER_PROTOTYPE& getPrimitiveManager() const
{
return m_primitive_manager;
}
- _GIM_PRIMITIVE_MANAGER_PROTOTYPE & getPrimitiveManager()
+ _GIM_PRIMITIVE_MANAGER_PROTOTYPE& getPrimitiveManager()
{
return m_primitive_manager;
}
-//! node manager prototype functions
-///@{
+ //! node manager prototype functions
+ ///@{
//! this attemps to refit the box set.
SIMD_FORCE_INLINE void update()
@@ -288,19 +285,19 @@ public:
{
//obtain primitive boxes
gim_array<GIM_AABB_DATA> primitive_boxes;
- primitive_boxes.resize(m_primitive_manager.get_primitive_count(),false);
+ primitive_boxes.resize(m_primitive_manager.get_primitive_count(), false);
- for (GUINT i = 0;i<primitive_boxes.size() ;i++ )
+ 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_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<GUINT> & collided_results) const
+ SIMD_FORCE_INLINE bool boxQuery(const GIM_AABB& box, gim_array<GUINT>& collided_results) const
{
GUINT curIndex = 0;
GUINT numNodes = getNodeCount();
@@ -308,7 +305,7 @@ public:
while (curIndex < numNodes)
{
GIM_AABB bound;
- getNodeBound(curIndex,bound);
+ getNodeBound(curIndex, bound);
//catch bugs in tree data
@@ -328,26 +325,26 @@ public:
else
{
//skip node
- curIndex+= getScapeNodeIndex(curIndex);
+ curIndex += getScapeNodeIndex(curIndex);
}
}
- if(collided_results.size()>0) return true;
+ 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<GUINT> & collided_results) const
+ SIMD_FORCE_INLINE bool boxQueryTrans(const GIM_AABB& box,
+ const btTransform& transform, gim_array<GUINT>& collided_results) const
{
- GIM_AABB transbox=box;
+ GIM_AABB transbox = box;
transbox.appy_transform(transform);
- return boxQuery(transbox,collided_results);
+ 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<GUINT> & collided_results) const
+ const btVector3& ray_dir, const btVector3& ray_origin,
+ gim_array<GUINT>& collided_results) const
{
GUINT curIndex = 0;
GUINT numNodes = getNodeCount();
@@ -355,16 +352,16 @@ public:
while (curIndex < numNodes)
{
GIM_AABB bound;
- getNodeBound(curIndex,bound);
+ getNodeBound(curIndex, bound);
//catch bugs in tree data
- bool aabbOverlap = bound.collide_ray(ray_origin,ray_dir);
+ bool aabbOverlap = bound.collide_ray(ray_origin, ray_dir);
bool isleafnode = isLeafNode(curIndex);
if (isleafnode && aabbOverlap)
{
- collided_results.push_back(getNodeData( curIndex));
+ collided_results.push_back(getNodeData(curIndex));
}
if (aabbOverlap || isleafnode)
@@ -375,10 +372,10 @@ public:
else
{
//skip node
- curIndex+= getScapeNodeIndex(curIndex);
+ curIndex += getScapeNodeIndex(curIndex);
}
}
- if(collided_results.size()>0) return true;
+ if (collided_results.size() > 0) return true;
return false;
}
@@ -389,7 +386,7 @@ public:
}
//! tells if this set is a trimesh
- SIMD_FORCE_INLINE bool isTrimesh() const
+ SIMD_FORCE_INLINE bool isTrimesh() const
{
return m_primitive_manager.is_trimesh();
}
@@ -411,12 +408,12 @@ public:
return m_box_tree.getNodeData(nodeindex);
}
- SIMD_FORCE_INLINE void getNodeBound(GUINT nodeindex, GIM_AABB & bound) const
+ 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)
+ SIMD_FORCE_INLINE void setNodeBound(GUINT nodeindex, const GIM_AABB& bound)
{
m_box_tree.setNodeBound(nodeindex, bound);
}
@@ -436,36 +433,30 @@ public:
return m_box_tree.getScapeNodeIndex(nodeindex);
}
- SIMD_FORCE_INLINE void getNodeTriangle(GUINT nodeindex,GIM_TRIANGLE & triangle) const
+ SIMD_FORCE_INLINE void getNodeTriangle(GUINT nodeindex, GIM_TRIANGLE& triangle) const
{
- m_primitive_manager.get_primitive_triangle(getNodeData(nodeindex),triangle);
+ 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<typename _GIM_PRIMITIVE_MANAGER_PROTOTYPE>
-class GIM_BOX_TREE_SET: public GIM_BOX_TREE_TEMPLATE_SET< _GIM_PRIMITIVE_MANAGER_PROTOTYPE, GIM_BOX_TREE>
+template <typename _GIM_PRIMITIVE_MANAGER_PROTOTYPE>
+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<typename BOX_SET_CLASS0,typename BOX_SET_CLASS1>
+template <typename BOX_SET_CLASS0, typename BOX_SET_CLASS1>
class GIM_TREE_TREE_COLLIDER
{
public:
- gim_pair_set * m_collision_pairs;
- BOX_SET_CLASS0 * m_boxset0;
- BOX_SET_CLASS1 * m_boxset1;
+ 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;
@@ -483,18 +474,18 @@ public:
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);
+ 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]);
@@ -506,8 +497,8 @@ protected:
SIMD_FORCE_INLINE void retrieve_node1_triangle(GUINT node1)
{
- if(node1_has_triangle) return;
- m_boxset1->getNodeTriangle(node1,m_tri1);
+ 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]);
@@ -519,8 +510,8 @@ protected:
SIMD_FORCE_INLINE void retrieve_node0_info(GUINT node0)
{
- if(node0 == current_node0) return;
- m_boxset0->getNodeBound(node0,m_box0);
+ 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;
@@ -528,21 +519,21 @@ protected:
SIMD_FORCE_INLINE void retrieve_node1_info(GUINT node1)
{
- if(node1 == current_node1) return;
- m_boxset1->getNodeBound(node1,m_box1);
+ 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)
+ 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;
+ bool result = m_box0.overlapping_trans_cache(m_box1, trans_cache_1to0, true);
+ if (!result) return false;
- if(t0_is_trimesh && node0_is_leaf)
+ if (t0_is_trimesh && node0_is_leaf)
{
//perform primitive vs box collision
retrieve_node0_triangle(node0);
@@ -550,14 +541,14 @@ protected:
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_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;
+ if (!result) return false;
return true;
}
- else if(t1_is_trimesh && node1_is_leaf)
+ else if (t1_is_trimesh && node1_is_leaf)
{
//perform primitive vs box collision
retrieve_node1_triangle(node1);
@@ -565,11 +556,11 @@ protected:
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_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;
+ if (!result) return false;
return true;
}
return true;
@@ -582,40 +573,39 @@ protected:
stack_collisions.reserve(32);
//add the first pair
- stack_collisions.push_pair(0,0);
+ stack_collisions.push_pair(0, 0);
-
- while(stack_collisions.size())
+ 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 (node_collision(node0, node1)) // a collision is found
{
- if(node0_is_leaf)
+ if (node0_is_leaf)
{
- if(node1_is_leaf)
+ if (node1_is_leaf)
{
- m_collision_pairs->push_pair(m_boxset0->getNodeData(node0),m_boxset1->getNodeData(node1));
+ 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));
+ stack_collisions.push_pair(node0, m_boxset1->getLeftNodeIndex(node1));
//collide right
- stack_collisions.push_pair(node0,m_boxset1->getRightNodeIndex(node1));
+ stack_collisions.push_pair(node0, m_boxset1->getRightNodeIndex(node1));
}
}
else
{
- if(node1_is_leaf)
+ if (node1_is_leaf)
{
//collide left
- stack_collisions.push_pair(m_boxset0->getLeftNodeIndex(node0),node1);
+ stack_collisions.push_pair(m_boxset0->getLeftNodeIndex(node0), node1);
//collide right
- stack_collisions.push_pair(m_boxset0->getRightNodeIndex(node0),node1);
+ stack_collisions.push_pair(m_boxset0->getRightNodeIndex(node0), node1);
}
else
{
@@ -624,36 +614,36 @@ protected:
GUINT left1 = m_boxset1->getLeftNodeIndex(node1);
GUINT right1 = m_boxset1->getRightNodeIndex(node1);
//collide left
- stack_collisions.push_pair(left0,left1);
+ stack_collisions.push_pair(left0, left1);
//collide right
- stack_collisions.push_pair(left0,right1);
+ stack_collisions.push_pair(left0, right1);
//collide left
- stack_collisions.push_pair(right0,left1);
+ stack_collisions.push_pair(right0, left1);
//collide right
- stack_collisions.push_pair(right0,right1);
+ stack_collisions.push_pair(right0, right1);
- }// else if node1 is not a leaf
- }// else if node0 is not a leaf
+ } // else if node1 is not a leaf
+ } // else if node0 is not a leaf
- }// if(node_collision(node0,node1))
- }//while(stack_collisions.size())
+ } // 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)
+ 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_1to0.calc_from_homogenic(trans1, trans2);
- trans_cache_0to1 = trans2.inverse();
+ trans_cache_0to1 = trans2.inverse();
trans_cache_0to1 *= trans1;
-
- if(complete_primitive_tests)
+ if (complete_primitive_tests)
{
t0_is_trimesh = boxset1->getPrimitiveManager().is_trimesh();
t1_is_trimesh = boxset2->getPrimitiveManager().is_trimesh();
@@ -668,7 +658,4 @@ public:
}
};
-
-#endif // GIM_BOXPRUNING_H_INCLUDED
-
-
+#endif // GIM_BOXPRUNING_H_INCLUDED
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/gim_clip_polygon.h b/thirdparty/bullet/BulletCollision/Gimpact/gim_clip_polygon.h
index e342459ce5..57b9c5c91a 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/gim_clip_polygon.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/gim_clip_polygon.h
@@ -33,91 +33,86 @@ email: projectileman@yahoo.com
-----------------------------------------------------------------------------
*/
-
//! This function calcs the distance from a 3D plane
class DISTANCE_PLANE_3D_FUNC
{
public:
- template<typename CLASS_POINT,typename CLASS_PLANE>
- inline GREAL operator()(const CLASS_PLANE & plane, const CLASS_POINT & point)
+ template <typename CLASS_POINT, typename CLASS_PLANE>
+ inline GREAL operator()(const CLASS_PLANE& plane, const CLASS_POINT& point)
{
return DISTANCE_PLANE_POINT(plane, point);
}
};
-
-
-template<typename CLASS_POINT>
+template <typename CLASS_POINT>
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)
+ 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)
+ 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);
+ GREAL blendfactor = -dist0 / (dist1 - dist0);
+ VEC_BLEND(clipped[clipped_count], point0, point1, blendfactor);
clipped_count++;
}
- if(!_classif)
+ if (!_classif)
{
- VEC_COPY(clipped[clipped_count],point1);
+ VEC_COPY(clipped[clipped_count], point1);
clipped_count++;
}
}
-
//! Clips a polygon by a plane
/*!
*\return The count of the clipped counts
*/
-template<typename CLASS_POINT,typename CLASS_PLANE, typename DISTANCE_PLANE_FUNC>
+template <typename CLASS_POINT, typename CLASS_PLANE, typename DISTANCE_PLANE_FUNC>
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)
+ 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;
+ GUINT clipped_count = 0;
-
- //clip first point
- GREAL firstdist = distance_func(plane,polygon_points[0]);;
- if(!(firstdist>G_EPSILON))
+ //clip first point
+ GREAL firstdist = distance_func(plane, polygon_points[0]);
+ ;
+ if (!(firstdist > G_EPSILON))
{
- VEC_COPY(clipped[clipped_count],polygon_points[0]);
+ 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]);
+ 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);
+ polygon_points[_i - 1], polygon_points[_i],
+ olddist,
+ dist,
+ clipped,
+ clipped_count);
-
- olddist = dist;
+ olddist = dist;
}
- //RETURN TO FIRST point
+ //RETURN TO FIRST point
PLANE_CLIP_POLYGON_COLLECT(
- polygon_points[polygon_point_count-1],polygon_points[0],
- olddist,
- firstdist,
- clipped,
- clipped_count);
+ polygon_points[polygon_point_count - 1], polygon_points[0],
+ olddist,
+ firstdist,
+ clipped,
+ clipped_count);
return clipped_count;
}
@@ -126,85 +121,79 @@ SIMD_FORCE_INLINE GUINT PLANE_CLIP_POLYGON_GENERIC(
/*!
*\return The count of the clipped counts
*/
-template<typename CLASS_POINT,typename CLASS_PLANE, typename DISTANCE_PLANE_FUNC>
+template <typename CLASS_POINT, typename CLASS_PLANE, typename DISTANCE_PLANE_FUNC>
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)
+ 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;
+ GUINT clipped_count = 0;
- //clip first point
- GREAL firstdist = distance_func(plane,point0);;
- if(!(firstdist>G_EPSILON))
+ //clip first point
+ GREAL firstdist = distance_func(plane, point0);
+ ;
+ if (!(firstdist > G_EPSILON))
{
- VEC_COPY(clipped[clipped_count],point0);
+ VEC_COPY(clipped[clipped_count], point0);
clipped_count++;
}
// point 1
GREAL olddist = firstdist;
- GREAL dist = distance_func(plane,point1);
+ GREAL dist = distance_func(plane, point1);
PLANE_CLIP_POLYGON_COLLECT(
- point0,point1,
- olddist,
- dist,
- clipped,
- clipped_count);
+ point0, point1,
+ olddist,
+ dist,
+ clipped,
+ clipped_count);
olddist = dist;
-
// point 2
- dist = distance_func(plane,point2);
+ dist = distance_func(plane, point2);
PLANE_CLIP_POLYGON_COLLECT(
- point1,point2,
- olddist,
- dist,
- clipped,
- clipped_count);
+ point1, point2,
+ olddist,
+ dist,
+ clipped,
+ clipped_count);
olddist = dist;
-
-
//RETURN TO FIRST point
PLANE_CLIP_POLYGON_COLLECT(
- point2,point0,
- olddist,
- firstdist,
- clipped,
- clipped_count);
+ point2, point0,
+ olddist,
+ firstdist,
+ clipped,
+ clipped_count);
return clipped_count;
}
-
-template<typename CLASS_POINT,typename CLASS_PLANE>
+template <typename CLASS_POINT, typename CLASS_PLANE>
SIMD_FORCE_INLINE GUINT PLANE_CLIP_POLYGON3D(
- const CLASS_PLANE & plane,
- const CLASS_POINT * polygon_points,
- GUINT polygon_point_count,
- CLASS_POINT * clipped)
+ const CLASS_PLANE& plane,
+ const CLASS_POINT* polygon_points,
+ GUINT polygon_point_count,
+ CLASS_POINT* clipped)
{
- return PLANE_CLIP_POLYGON_GENERIC<CLASS_POINT,CLASS_PLANE>(plane,polygon_points,polygon_point_count,clipped,DISTANCE_PLANE_3D_FUNC());
+ return PLANE_CLIP_POLYGON_GENERIC<CLASS_POINT, CLASS_PLANE>(plane, polygon_points, polygon_point_count, clipped, DISTANCE_PLANE_3D_FUNC());
}
-
-template<typename CLASS_POINT,typename CLASS_PLANE>
+template <typename CLASS_POINT, typename CLASS_PLANE>
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)
+ const CLASS_PLANE& plane,
+ const CLASS_POINT& point0,
+ const CLASS_POINT& point1,
+ const CLASS_POINT& point2,
+ CLASS_POINT* clipped)
{
- return PLANE_CLIP_TRIANGLE_GENERIC<CLASS_POINT,CLASS_PLANE>(plane,point0,point1,point2,clipped,DISTANCE_PLANE_3D_FUNC());
+ return PLANE_CLIP_TRIANGLE_GENERIC<CLASS_POINT, CLASS_PLANE>(plane, point0, point1, point2, clipped, DISTANCE_PLANE_3D_FUNC());
}
-
-
-#endif // GIM_TRI_COLLISION_H_INCLUDED
+#endif // GIM_TRI_COLLISION_H_INCLUDED
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/gim_contact.cpp b/thirdparty/bullet/BulletCollision/Gimpact/gim_contact.cpp
index 20e41de089..390225709e 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/gim_contact.cpp
+++ b/thirdparty/bullet/BulletCollision/Gimpact/gim_contact.cpp
@@ -33,91 +33,89 @@ email: projectileman@yahoo.com
#define MAX_COINCIDENT 8
void gim_contact_array::merge_contacts(
- const gim_contact_array & contacts, bool normal_contact_average)
+ const gim_contact_array& contacts, bool normal_contact_average)
{
clear();
- if(contacts.size()==1)
+ if (contacts.size() == 1)
{
push_back(contacts.back());
return;
}
gim_array<GIM_RSORT_TOKEN> keycontacts(contacts.size());
- keycontacts.resize(contacts.size(),false);
+ keycontacts.resize(contacts.size(), false);
//fill key contacts
GUINT i;
- for (i = 0;i<contacts.size() ;i++ )
+ for (i = 0; i < contacts.size(); i++)
{
keycontacts[i].m_key = contacts[i].calc_key_contact();
keycontacts[i].m_value = i;
}
//sort keys
- gim_heap_sort(keycontacts.pointer(),keycontacts.size(),GIM_RSORT_TOKEN_COMPARATOR());
+ gim_heap_sort(keycontacts.pointer(), keycontacts.size(), GIM_RSORT_TOKEN_COMPARATOR());
// Merge contacts
- GUINT coincident_count=0;
+ GUINT coincident_count = 0;
btVector3 coincident_normals[MAX_COINCIDENT];
GUINT last_key = keycontacts[0].m_key;
GUINT key = 0;
push_back(contacts[keycontacts[0].m_value]);
- GIM_CONTACT * pcontact = &back();
+ GIM_CONTACT* pcontact = &back();
-
-
- for( i=1;i<keycontacts.size();i++)
+ for (i = 1; i < keycontacts.size(); i++)
{
- key = keycontacts[i].m_key;
- const GIM_CONTACT * scontact = &contacts[keycontacts[i].m_value];
+ key = keycontacts[i].m_key;
+ const GIM_CONTACT* scontact = &contacts[keycontacts[i].m_value];
- if(last_key == key)//same points
+ if (last_key == key) //same points
{
//merge contact
- if(pcontact->m_depth - CONTACT_DIFF_EPSILON > scontact->m_depth)//)
+ if (pcontact->m_depth - CONTACT_DIFF_EPSILON > scontact->m_depth) //)
{
*pcontact = *scontact;
- coincident_count = 0;
+ coincident_count = 0;
}
- else if(normal_contact_average)
+ else if (normal_contact_average)
{
- if(btFabs(pcontact->m_depth - scontact->m_depth)<CONTACT_DIFF_EPSILON)
- {
- if(coincident_count<MAX_COINCIDENT)
- {
- coincident_normals[coincident_count] = scontact->m_normal;
- coincident_count++;
- }
- }
+ if (btFabs(pcontact->m_depth - scontact->m_depth) < CONTACT_DIFF_EPSILON)
+ {
+ if (coincident_count < MAX_COINCIDENT)
+ {
+ coincident_normals[coincident_count] = scontact->m_normal;
+ coincident_count++;
+ }
+ }
}
}
else
- {//add new contact
+ { //add new contact
- if(normal_contact_average && coincident_count>0)
- {
- pcontact->interpolate_normals(coincident_normals,coincident_count);
- coincident_count = 0;
- }
+ if (normal_contact_average && coincident_count > 0)
+ {
+ pcontact->interpolate_normals(coincident_normals, coincident_count);
+ coincident_count = 0;
+ }
- push_back(*scontact);
- pcontact = &back();
- }
+ push_back(*scontact);
+ pcontact = &back();
+ }
last_key = key;
}
}
-void gim_contact_array::merge_contacts_unique(const gim_contact_array & contacts)
+void gim_contact_array::merge_contacts_unique(const gim_contact_array& contacts)
{
clear();
- if(contacts.size()==1)
+ if (contacts.size() == 1)
{
push_back(contacts.back());
return;
@@ -125,14 +123,14 @@ void gim_contact_array::merge_contacts_unique(const gim_contact_array & contacts
GIM_CONTACT average_contact = contacts.back();
- for (GUINT i=1;i<contacts.size() ;i++ )
+ for (GUINT i = 1; i < contacts.size(); i++)
{
average_contact.m_point += contacts[i].m_point;
average_contact.m_normal += contacts[i].m_normal * contacts[i].m_depth;
}
//divide
- GREAL divide_average = 1.0f/((GREAL)contacts.size());
+ GREAL divide_average = 1.0f / ((GREAL)contacts.size());
average_contact.m_point *= divide_average;
@@ -141,6 +139,4 @@ void gim_contact_array::merge_contacts_unique(const gim_contact_array & contacts
average_contact.m_depth = average_contact.m_normal.length();
average_contact.m_normal /= average_contact.m_depth;
-
}
-
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/gim_contact.h b/thirdparty/bullet/BulletCollision/Gimpact/gim_contact.h
index b41c714b5f..9deb28a26e 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/gim_contact.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/gim_contact.h
@@ -36,7 +36,6 @@ email: projectileman@yahoo.com
#include "gim_radixsort.h"
#include "gim_array.h"
-
/**
Configuration var for applying interpolation of contact normals
*/
@@ -58,90 +57,87 @@ Configuration var for applying interpolation of contact normals
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
+ 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)
- {
- }
+ 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;
+ 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;
+ _hash += (*_uitmp) << 4;
_uitmp++;
- _hash += (*_uitmp)<<8;
+ _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++)
+ 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)
+ if (vec_sum_len < CONTACT_DIFF_EPSILON) return;
- m_normal = vec_sum*vec_sum_len;
- }
+ 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<GIM_CONTACT>
+class gim_contact_array : public gim_array<GIM_CONTACT>
{
public:
- gim_contact_array():gim_array<GIM_CONTACT>(64)
+ gim_contact_array() : gim_array<GIM_CONTACT>(64)
{
}
- SIMD_FORCE_INLINE void push_contact(const btVector3 &point,const btVector3 & normal,
- GREAL depth, GUINT feature1, GUINT feature2)
+ 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();
+ GIM_CONTACT &newele = back();
newele.m_point = point;
newele.m_normal = normal;
newele.m_depth = depth;
@@ -150,13 +146,13 @@ public:
}
SIMD_FORCE_INLINE void push_triangle_contacts(
- const GIM_TRIANGLE_CONTACT_DATA & tricontact,
- GUINT feature1,GUINT feature2)
+ const GIM_TRIANGLE_CONTACT_DATA &tricontact,
+ GUINT feature1, GUINT feature2)
{
- for(GUINT i = 0;i<tricontact.m_point_count ;i++ )
+ for (GUINT i = 0; i < tricontact.m_point_count; i++)
{
push_back_mem();
- GIM_CONTACT & newele = back();
+ 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;
@@ -165,8 +161,8 @@ public:
}
}
- void merge_contacts(const gim_contact_array & contacts, bool normal_contact_average = true);
- void merge_contacts_unique(const gim_contact_array & contacts);
+ 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
+#endif // GIM_CONTACT_H_INCLUDED
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/gim_geom_types.h b/thirdparty/bullet/BulletCollision/Gimpact/gim_geom_types.h
index 6b8f9ea6c2..9dc48f354b 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/gim_geom_types.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/gim_geom_types.h
@@ -33,11 +33,8 @@ email: projectileman@yahoo.com
-----------------------------------------------------------------------------
*/
-
#include "gim_math.h"
-
-
//! Short Integer vector 2D
typedef GSHORT vec2s[2];
//! Integer vector 3D
@@ -92,6 +89,4 @@ typedef GREAL quatf[4];
//typedef struct _aabb3f aabb3f;
-
-
-#endif // GIM_GEOM_TYPES_H_INCLUDED
+#endif // GIM_GEOM_TYPES_H_INCLUDED
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/gim_geometry.h b/thirdparty/bullet/BulletCollision/Gimpact/gim_geometry.h
index c67a6991c0..4a7ac3c4d8 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/gim_geometry.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/gim_geometry.h
@@ -39,4 +39,4 @@ email: projectileman@yahoo.com
#include "gim_box_collision.h"
#include "gim_tri_collision.h"
-#endif // GIM_VECTOR_H_INCLUDED
+#endif // GIM_VECTOR_H_INCLUDED
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/gim_hash_table.h b/thirdparty/bullet/BulletCollision/Gimpact/gim_hash_table.h
index e4237c2c57..abf88d3108 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/gim_hash_table.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/gim_hash_table.h
@@ -34,53 +34,52 @@ email: projectileman@yahoo.com
#include "gim_radixsort.h"
-
-#define GIM_INVALID_HASH 0xffffffff //!< A very very high value
+#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
+#define GIM_MIN_RADIX_SORT_SIZE 860 //!< calibrated on a PIII
-template<typename T>
+template <typename T>
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<T> & other) const
+ 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<T>& other) const
{
///inverse order, further objects are first
- if(m_key < other.m_key) return true;
+ if (m_key < other.m_key) return true;
return false;
}
- bool operator >(const GIM_HASH_TABLE_NODE<T> & other) const
+ bool operator>(const GIM_HASH_TABLE_NODE<T>& other) const
{
///inverse order, further objects are first
- if(m_key > other.m_key) return true;
+ if (m_key > other.m_key) return true;
return false;
}
- bool operator ==(const GIM_HASH_TABLE_NODE<T> & other) const
+ bool operator==(const GIM_HASH_TABLE_NODE<T>& other) const
{
///inverse order, further objects are first
- if(m_key == other.m_key) return true;
+ if (m_key == other.m_key) return true;
return false;
}
};
@@ -89,21 +88,19 @@ struct GIM_HASH_TABLE_NODE
class GIM_HASH_NODE_GET_KEY
{
public:
- template<class T>
- inline GUINT operator()( const T& a)
+ template <class T>
+ 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<class T>
- inline int operator() ( const T& a, GUINT key)
+ template <class T>
+ inline int operator()(const T& a, GUINT key)
{
return ((int)(a.m_key - key));
}
@@ -113,65 +110,53 @@ public:
class GIM_HASH_NODE_CMP_MACRO
{
public:
- template<class T>
- inline int operator() ( const T& a, const T& b )
+ template <class T>
+ 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<typename T>
-void gim_sort_hash_node_array(T * array, GUINT array_count)
+template <typename T>
+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);
- }
+ 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
-};
+ {
+ 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);
+ //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];
+ // 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.
@@ -187,129 +172,124 @@ When the array size reaches the size equivalent to 'min_hash_table_size', then i
</ul>
*/
-template<class T>
+template <class T>
class gim_hash_table
{
protected:
- typedef GIM_HASH_TABLE_NODE<T> _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.
- /*!
+ typedef GIM_HASH_TABLE_NODE<T> _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);
+ 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
@@ -318,585 +298,560 @@ protected:
//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
- /*!
+ }
+ }
+ }
+
+ //! 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;
- }
+ 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 cell_index = _assign_hash_table_cell(hashkey);
- GUINT value_key = m_hash_table[cell_index];
+ GUINT value_key = m_hash_table[cell_index];
- if(value_key!= GIM_INVALID_HASH) return value_key;// Not overrited
+ if (value_key != GIM_INVALID_HASH) return value_key; // Not overrited
- m_hash_table[cell_index] = m_nodes.size();
+ m_hash_table[cell_index] = m_nodes.size();
- _insert_unsorted(hashkey,value);
- return GIM_INVALID_HASH;
- }
+ _insert_unsorted(hashkey, value);
+ return GIM_INVALID_HASH;
+ }
- //! insert an element in hash table.
- /*!
+ //! 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)
+ 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);
+ 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
- /*!
+ }
+ 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;
- }
-
-
+ 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();
+ }
-public:
+ //! 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:
+ /*!
<li> 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.
<li> If node_size != 0, then this container becomes a hash table for ever
</ul>
*/
- 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
- /*!
+ 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
- /*!
+ 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];
- }
+ 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;
+ 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();
+ _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());
+ 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;
+ }
- if(found) return result_ind;
- }
- return GIM_INVALID_HASH;
- }
-
- //! Retrieves the value associated with the index
- /*!
+ //! 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 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_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
- }
+ 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
- /*!
+ //! 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.
- /*!
+ 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);
- }
-
+ 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
+#endif // GIM_CONTAINERS_H_INCLUDED
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/gim_linear_math.h b/thirdparty/bullet/BulletCollision/Gimpact/gim_linear_math.h
index 64f11b4954..98401a404a 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/gim_linear_math.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/gim_linear_math.h
@@ -34,962 +34,900 @@ email: projectileman@yahoo.com
-----------------------------------------------------------------------------
*/
-
#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; \
-}\
-
+#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; \
-}\
-
+#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; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
+#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]);\
-}\
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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])
-
+#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])
+#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])
+#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_;\
-}\
-
+#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); \
-}\
+#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);\
-}\
-
+#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);\
-}\
-
+#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);\
-}\
+#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);\
-}\
-
+#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);\
-}\
-
+#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);\
-}\
-
-
+#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); \
-}\
-
+#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);\
-}\
-
+#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; \
- } \
-}\
+#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; \
- } \
-}\
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
+#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_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];
+#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);\
-}\
+#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_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]))
+#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; \
-}\
-
-
-
-
-
+#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; \
-}\
+#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; \
-}\
+#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; \
-}\
+#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; \
-}\
+#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; \
-}\
+#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; \
-}\
+#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]; \
- \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
+#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]; \
- \
-}\
+#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]; \
-}\
-
+#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];\
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
+#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<br>
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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
+#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];\
-}\
-
-
+#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
*
@@ -1000,22 +938,22 @@ Last column is added as the position
* 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; \
- } \
-}\
-
+#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
@@ -1024,550 +962,527 @@ Last column is added as the position
* 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); \
- } \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]; \
-}\
-
+#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]); \
-}\
-
+#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); \
- } \
-}\
-
+#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; \
-}\
-
+#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]; \
-}\
-
+#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]); \
-}\
-
+#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); \
- } \
- } \
-}\
-
+#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]; \
-}\
-
+#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]); \
-}\
-
+#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_); \
- } \
- } \
-}\
-
+#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]; \
-}\
-
+#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]); \
-}\
-
+#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; \
- } \
- } \
-}\
+#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); \
-}\
-
+#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); \
-}\
-
+#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); \
-}\
+#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]; \
-}\
+#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];\
-}\
-
+#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];\
-}\
+#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]; \
-}\
+#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];\
-}\
-
+#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];\
-}\
+#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);\
-}\
+#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);\
-}\
+#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);\
-}\
-
+#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];\
-}\
+#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];\
-}\
+#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];\
-}\
-
+#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]; \
-}\
+#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]; \
-}\
-
-
+#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])
+#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])
+#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])
-
+#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])
+#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])
+#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])
+#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<br>
*/
-#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
+#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/thirdparty/bullet/BulletCollision/Gimpact/gim_math.h b/thirdparty/bullet/BulletCollision/Gimpact/gim_math.h
index 939079e104..3c4f821a72 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/gim_math.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/gim_math.h
@@ -34,8 +34,6 @@ email: projectileman@yahoo.com
#include "LinearMath/btScalar.h"
-
-
#define GREAL btScalar
#define GREAL2 double
#define GINT int
@@ -45,8 +43,6 @@ email: projectileman@yahoo.com
#define GINT64 long long
#define GUINT64 unsigned long long
-
-
#define G_PI 3.14159265358979f
#define G_HALF_PI 1.5707963f
//267948966
@@ -54,16 +50,14 @@ email: projectileman@yahoo.com
//71795864
#define G_ROOT3 1.73205f
#define G_ROOT2 1.41421f
-#define G_UINT_INFINITY 0xffffffff //!< A very very high value
+#define G_UINT_INFINITY 0xffffffff //!< A very very high value
#define G_REAL_INFINITY FLT_MAX
-#define G_SIGN_BITMASK 0x80000000
+#define G_SIGN_BITMASK 0x80000000
#define G_EPSILON SIMD_EPSILON
-
-
enum GIM_SCALAR_TYPES
{
- G_STYPE_REAL =0,
+ G_STYPE_REAL = 0,
G_STYPE_REAL2,
G_STYPE_SHORT,
G_STYPE_USHORT,
@@ -73,85 +67,82 @@ enum GIM_SCALAR_TYPES
G_STYPE_UINT64
};
-
-
-#define G_DEGTORAD(X) ((X)*3.1415926f/180.0f)
-#define G_RADTODEG(X) ((X)*180.0f/3.1415926f)
+#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))
+#define GIM_IR(x) ((GUINT&)(x))
//! Signed integer representation of a floating-point value.
-#define GIM_SIR(x) ((GINT&)(x))
+#define GIM_SIR(x) ((GINT&)(x))
//! Absolute integer representation of a floating-point value
-#define GIM_AIR(x) (GIM_IR(x)&0x7fffffff)
+#define GIM_AIR(x) (GIM_IR(x) & 0x7fffffff)
//! Floating-point representation of an integer value.
-#define GIM_FR(x) ((GREAL&)(x))
+#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_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_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_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))
+#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_CLAMP(number, minval, maxval) (number < minval ? minval : (number > maxval ? maxval : number))
-#define GIM_GREATER(x, y) btFabs(x) > (y)
+#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;\
-}\
+#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;
+ GREAL r;
+ GIM_INV_SQRT(f, r);
+ return r;
}
inline GREAL gim_sqrt(GREAL f)
{
- GREAL r;
- GIM_SQRT(f,r);
- return r;
+ GREAL r;
+ GIM_SQRT(f, r);
+ return r;
}
-
-
-#endif // GIM_MATH_H_INCLUDED
+#endif // GIM_MATH_H_INCLUDED
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/gim_memory.cpp b/thirdparty/bullet/BulletCollision/Gimpact/gim_memory.cpp
index 1636eb7867..9e29ab91d6 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/gim_memory.cpp
+++ b/thirdparty/bullet/BulletCollision/Gimpact/gim_memory.cpp
@@ -27,7 +27,6 @@ email: projectileman@yahoo.com
-----------------------------------------------------------------------------
*/
-
#include "gim_memory.h"
#include "stdlib.h"
@@ -40,52 +39,49 @@ static gim_alloca_function *g_allocafn = 0;
static gim_realloc_function *g_reallocfn = 0;
static gim_free_function *g_freefn = 0;
-void gim_set_alloc_handler (gim_alloc_function *fn)
+void gim_set_alloc_handler(gim_alloc_function *fn)
{
- g_allocfn = fn;
+ g_allocfn = fn;
}
-void gim_set_alloca_handler (gim_alloca_function *fn)
+void gim_set_alloca_handler(gim_alloca_function *fn)
{
- g_allocafn = fn;
+ g_allocafn = fn;
}
-void gim_set_realloc_handler (gim_realloc_function *fn)
+void gim_set_realloc_handler(gim_realloc_function *fn)
{
- g_reallocfn = fn;
+ g_reallocfn = fn;
}
-void gim_set_free_handler (gim_free_function *fn)
+void gim_set_free_handler(gim_free_function *fn)
{
- g_freefn = fn;
+ g_freefn = fn;
}
gim_alloc_function *gim_get_alloc_handler()
{
- return g_allocfn;
+ return g_allocfn;
}
gim_alloca_function *gim_get_alloca_handler()
{
- return g_allocafn;
+ return g_allocafn;
}
-
-gim_realloc_function *gim_get_realloc_handler ()
+gim_realloc_function *gim_get_realloc_handler()
{
- return g_reallocfn;
+ return g_reallocfn;
}
-
-gim_free_function *gim_get_free_handler ()
+gim_free_function *gim_get_free_handler()
{
- return g_freefn;
+ return g_freefn;
}
-
-void * gim_alloc(size_t size)
+void *gim_alloc(size_t size)
{
- void * ptr;
+ void *ptr;
if (g_allocfn)
{
ptr = g_allocfn(size);
@@ -93,27 +89,29 @@ void * gim_alloc(size_t size)
else
{
#ifdef GIM_SIMD_MEMORY
- ptr = btAlignedAlloc(size,16);
+ ptr = btAlignedAlloc(size, 16);
#else
ptr = malloc(size);
#endif
}
- return ptr;
+ return ptr;
}
-void * gim_alloca(size_t size)
+void *gim_alloca(size_t size)
{
- if (g_allocafn) return g_allocafn(size); else return gim_alloc(size);
+ if (g_allocafn)
+ return g_allocafn(size);
+ else
+ return gim_alloc(size);
}
-
-void * gim_realloc(void *ptr, size_t oldsize, size_t newsize)
+void *gim_realloc(void *ptr, size_t oldsize, size_t newsize)
{
- void * newptr = gim_alloc(newsize);
- size_t copysize = oldsize<newsize?oldsize:newsize;
- gim_simd_memcpy(newptr,ptr,copysize);
- gim_free(ptr);
- return newptr;
+ void *newptr = gim_alloc(newsize);
+ size_t copysize = oldsize < newsize ? oldsize : newsize;
+ gim_simd_memcpy(newptr, ptr, copysize);
+ gim_free(ptr);
+ return newptr;
}
void gim_free(void *ptr)
@@ -121,15 +119,14 @@ void gim_free(void *ptr)
if (!ptr) return;
if (g_freefn)
{
- g_freefn(ptr);
+ g_freefn(ptr);
}
else
{
- #ifdef GIM_SIMD_MEMORY
+#ifdef GIM_SIMD_MEMORY
btAlignedFree(ptr);
- #else
+#else
free(ptr);
- #endif
+#endif
}
}
-
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/gim_memory.h b/thirdparty/bullet/BulletCollision/Gimpact/gim_memory.h
index e203888a1e..fffbfa23d8 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/gim_memory.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/gim_memory.h
@@ -32,93 +32,84 @@ email: projectileman@yahoo.com
-----------------------------------------------------------------------------
*/
-
#include "gim_math.h"
#include <string.h>
#ifdef PREFETCH
-#include <xmmintrin.h> // for prefetch
-#define pfval 64
-#define pfval2 128
+#include <xmmintrin.h> // for prefetch
+#define pfval 64
+#define pfval2 128
//! Prefetch 64
-#define pf(_x,_i) _mm_prefetch((void *)(_x + _i + pfval), 0)
+#define pf(_x, _i) _mm_prefetch((void *)(_x + _i + pfval), 0)
//! Prefetch 128
-#define pf2(_x,_i) _mm_prefetch((void *)(_x + _i + pfval2), 0)
+#define pf2(_x, _i) _mm_prefetch((void *)(_x + _i + pfval2), 0)
#else
//! Prefetch 64
-#define pf(_x,_i)
+#define pf(_x, _i)
//! Prefetch 128
-#define pf2(_x,_i)
+#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;\
- }\
-}\
-
+#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);
-
+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);
-
+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_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);
-
+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_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
+#if defined(_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__)
+#define GIM_SIMD_MEMORY 1
#endif
//! SIMD POINTER INTEGER
@@ -126,11 +117,10 @@ void gim_free(void *ptr);
//! SIMD INTEGER SIZE
#define SIMD_T_SIZE sizeof(SIMD_T)
-
-inline void gim_simd_memcpy(void * dst, const void * src, size_t copysize)
+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;
@@ -143,48 +133,45 @@ inline void gim_simd_memcpy(void * dst, const void * src, size_t copysize)
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;
+ 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);
+ memcpy(dst, src, copysize);
#endif
}
-
-
-template<class T>
-inline void gim_swap_elements(T* _array,size_t _i,size_t _j)
+template <class T>
+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<class T>
-inline void gim_swap_elements_memcpy(T* _array,size_t _i,size_t _j)
+template <class T>
+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));
+ 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 <int SIZE>
-inline void gim_swap_elements_ptr(char * _array,size_t _i,size_t _j)
+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);
+ _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
+#endif // GIM_MEMORY_H_INCLUDED
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/gim_radixsort.h b/thirdparty/bullet/BulletCollision/Gimpact/gim_radixsort.h
index c246ef1254..ff7907adca 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/gim_radixsort.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/gim_radixsort.h
@@ -40,24 +40,22 @@ email: projectileman@yahoo.com
//! Prototype for comparators
class less_comparator
{
- public:
-
- template<class T,class Z>
- inline int operator() ( const T& a, const Z& b )
+public:
+ template <class T, class Z>
+ inline int operator()(const T& a, const Z& b)
{
- return ( a<b?-1:(a>b?1:0));
+ return (a < b ? -1 : (a > b ? 1 : 0));
}
};
//! Prototype for comparators
class integer_comparator
{
- public:
-
- template<class T>
- inline int operator() ( const T& a, const T& b )
+public:
+ template <class T>
+ inline int operator()(const T& a, const T& b)
{
- return (int)(a-b);
+ return (int)(a - b);
}
};
@@ -65,20 +63,19 @@ class integer_comparator
class uint_key_func
{
public:
- template<class T>
- inline GUINT operator()( const T& a)
+ template <class T>
+ inline GUINT operator()(const T& a)
{
return (GUINT)a;
}
};
-
//!Prototype for copying elements
class copy_elements_func
{
public:
- template<class T>
- inline void operator()(T& a,T& b)
+ template <class T>
+ inline void operator()(T& a, T& b)
{
a = b;
}
@@ -88,34 +85,33 @@ public:
class memcopy_elements_func
{
public:
- template<class T>
- inline void operator()(T& a,T& b)
+ template <class T>
+ inline void operator()(T& a, T& b)
{
- gim_simd_memcpy(&a,&b,sizeof(T));
+ 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;
- }
+ 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
+ inline bool operator<(const GIM_RSORT_TOKEN& other) const
{
return (m_key < other.m_key);
}
- inline bool operator >(const GIM_RSORT_TOKEN& other) const
+ inline bool operator>(const GIM_RSORT_TOKEN& other) const
{
return (m_key > other.m_key);
}
@@ -124,33 +120,28 @@ struct GIM_RSORT_TOKEN
//! Prototype for comparators
class GIM_RSORT_TOKEN_COMPARATOR
{
- public:
-
- inline int operator()( const GIM_RSORT_TOKEN& a, const GIM_RSORT_TOKEN& b )
+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 )
-
-
+#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)
+ 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;
+ GUINT* b1 = b0 + kHist;
+ GUINT* b2 = b1 + kHist;
for (i = 0; i < kHist * 3; ++i)
{
b0[i] = 0;
@@ -159,10 +150,10 @@ inline void gim_radix_sort_rtokens(
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)] ++;
+ fi = array[i].m_key;
+ b0[D11_0(fi)]++;
+ b1[D11_1(fi)]++;
+ b2[D11_2(fi)]++;
}
{
GUINT sum0 = 0, sum1 = 0, sum2 = 0;
@@ -182,7 +173,7 @@ inline void gim_radix_sort_rtokens(
}
for (i = 0; i < element_count; ++i)
{
- fi = array[i].m_key;
+ fi = array[i].m_key;
pos = D11_0(fi);
pos = ++b0[pos];
sorted[pos].m_key = array[i].m_key;
@@ -190,7 +181,7 @@ inline void gim_radix_sort_rtokens(
}
for (i = 0; i < element_count; ++i)
{
- fi = sorted[i].m_key;
+ fi = sorted[i].m_key;
pos = D11_1(fi);
pos = ++b1[pos];
array[pos].m_key = sorted[i].m_key;
@@ -198,7 +189,7 @@ inline void gim_radix_sort_rtokens(
}
for (i = 0; i < element_count; ++i)
{
- fi = array[i].m_key;
+ fi = array[i].m_key;
pos = D11_2(fi);
pos = ++b2[pos];
sorted[pos].m_key = array[i].m_key;
@@ -206,9 +197,6 @@ inline void gim_radix_sort_rtokens(
}
}
-
-
-
/// Get the sorted tokens from an array. For generic use. Tokens are IRR_RSORT_TOKEN
/*!
*\param array Array of elements to sort
@@ -216,21 +204,21 @@ inline void gim_radix_sort_rtokens(
*\param element_count element count
*\param uintkey_macro Functor which retrieves the integer representation of an array element
*/
-template<typename T, class GETKEY_CLASS>
+template <typename T, class GETKEY_CLASS>
void gim_radix_sort_array_tokens(
- T* array ,
- GIM_RSORT_TOKEN * sorted_tokens,
- GUINT element_count,GETKEY_CLASS uintkey_macro)
+ 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);
+ 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
@@ -241,21 +229,21 @@ void gim_radix_sort_array_tokens(
\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<typename T, class GETKEY_CLASS, class COPY_CLASS>
+template <typename T, class GETKEY_CLASS, class COPY_CLASS>
void gim_radix_sort(
- T * array, GUINT element_count,
+ 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);
+ 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,
@@ -269,20 +257,20 @@ If the element is not found, it returns the nearest upper element position, may
\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<class T, typename KEYCLASS, typename COMP_CLASS>
-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)
+template <class T, typename KEYCLASS, typename COMP_CLASS>
+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;
+ GUINT _j = _end_i + 1;
while (_i < _j)
{
- _k = (_j+_i-1)/2;
+ _k = (_j + _i - 1) / 2;
_comp_result = _comp_macro(_array[_k], _search_key);
if (_comp_result == 0)
{
@@ -291,7 +279,7 @@ bool gim_binary_search_ex(
}
else if (_comp_result < 0)
{
- _i = _k+1;
+ _i = _k + 1;
}
else
{
@@ -302,8 +290,6 @@ bool gim_binary_search_ex(
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.
@@ -314,26 +300,26 @@ If the element is not found, it returns the nearest upper element position, may
\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<class T>
+template <class T>
bool gim_binary_search(
- const T*_array,GUINT _start_i,
- GUINT _end_i,const T & _search_key,
- GUINT & _result_index)
+ 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 _j = _end_i + 1;
GUINT _k;
- while(_i < _j)
+ while (_i < _j)
{
- _k = (_j+_i-1)/2;
- if(_array[_k]==_search_key)
+ _k = (_j + _i - 1) / 2;
+ if (_array[_k] == _search_key)
{
_result_index = _k;
return true;
}
- else if (_array[_k]<_search_key)
+ else if (_array[_k] < _search_key)
{
- _i = _k+1;
+ _i = _k + 1;
}
else
{
@@ -344,27 +330,25 @@ bool gim_binary_search(
return false;
}
-
-
///heap sort from http://www.csse.monash.edu.au/~lloyd/tildeAlgDS/Sort/Heap/
template <typename T, typename COMP_CLASS>
-void gim_down_heap(T *pArr, GUINT k, GUINT n,COMP_CLASS CompareFunc)
+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)
+ while (k <= n / 2)
{
- int child = 2*k;
+ int child = 2 * k;
- if ((child < (int)n) && CompareFunc(pArr[child - 1] , pArr[child])<0)
+ if ((child < (int)n) && CompareFunc(pArr[child - 1], pArr[child]) < 0)
{
child++;
}
/* pick larger child */
- if (CompareFunc(temp , pArr[child - 1])<0)
+ if (CompareFunc(temp, pArr[child - 1]) < 0)
{
/* move child up */
pArr[k - 1] = pArr[child - 1];
@@ -378,29 +362,25 @@ void gim_down_heap(T *pArr, GUINT k, GUINT n,COMP_CLASS CompareFunc)
pArr[k - 1] = temp;
} /*downHeap*/
-
template <typename T, typename COMP_CLASS>
-void gim_heap_sort(T *pArr, GUINT element_count, COMP_CLASS CompareFunc)
+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--)
+ for (k = n / 2; k > 0; k--)
{
gim_down_heap(pArr, k, n, CompareFunc);
}
/* a[1..N] is now a heap */
- while ( n>=2 )
+ while (n >= 2)
{
- gim_swap_elements(pArr,0,n-1); /* largest of a[0..n-1] */
+ 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
+#endif // GIM_RADIXSORT_H_INCLUDED
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/gim_tri_collision.cpp b/thirdparty/bullet/BulletCollision/Gimpact/gim_tri_collision.cpp
index f9727e1d53..8d83e95da4 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/gim_tri_collision.cpp
+++ b/thirdparty/bullet/BulletCollision/Gimpact/gim_tri_collision.cpp
@@ -33,15 +33,13 @@ email: projectileman@yahoo.com
#include "gim_tri_collision.h"
-
#define TRI_LOCAL_EPSILON 0.000001f
#define MIN_EDGE_EDGE_DIS 0.00001f
-
class GIM_TRIANGLE_CALCULATION_CACHE
{
public:
- GREAL margin;
+ GREAL margin;
btVector3 tu_vertices[3];
btVector3 tv_vertices[3];
btVector4 tu_plane;
@@ -55,46 +53,47 @@ public:
GREAL du0du2;
GREAL dv[4];
GREAL dv0dv1;
- GREAL dv0dv2;
+ GREAL dv0dv2;
btVector3 temp_points[MAX_TRI_CLIPPING];
btVector3 temp_points1[MAX_TRI_CLIPPING];
btVector3 contact_points[MAX_TRI_CLIPPING];
-
-
//! if returns false, the faces are paralele
SIMD_FORCE_INLINE bool compute_intervals(
- const GREAL &D0,
- const GREAL &D1,
- const GREAL &D2,
- const GREAL &D0D1,
- const GREAL &D0D2,
- GREAL & scale_edge0,
- GREAL & scale_edge1,
- GUINT &edge_index0,
- GUINT &edge_index1)
+ const GREAL &D0,
+ const GREAL &D1,
+ const GREAL &D2,
+ const GREAL &D0D1,
+ const GREAL &D0D2,
+ GREAL &scale_edge0,
+ GREAL &scale_edge1,
+ GUINT &edge_index0,
+ GUINT &edge_index1)
{
- if(D0D1>0.0f)
+ if (D0D1 > 0.0f)
{
/* here we know that D0D2<=0.0 */
/* that is D0, D1 are on the same side, D2 on the other or on the plane */
- scale_edge0 = -D2/(D0-D2);
- scale_edge1 = -D1/(D2-D1);
- edge_index0 = 2;edge_index1 = 1;
+ scale_edge0 = -D2 / (D0 - D2);
+ scale_edge1 = -D1 / (D2 - D1);
+ edge_index0 = 2;
+ edge_index1 = 1;
}
- else if(D0D2>0.0f)
+ else if (D0D2 > 0.0f)
{
/* here we know that d0d1<=0.0 */
- scale_edge0 = -D0/(D1-D0);
- scale_edge1 = -D1/(D2-D1);
- edge_index0 = 0;edge_index1 = 1;
+ scale_edge0 = -D0 / (D1 - D0);
+ scale_edge1 = -D1 / (D2 - D1);
+ edge_index0 = 0;
+ edge_index1 = 1;
}
- else if(D1*D2>0.0f || D0!=0.0f)
+ else if (D1 * D2 > 0.0f || D0 != 0.0f)
{
/* here we know that d0d1<=0.0 or that D0!=0.0 */
- scale_edge0 = -D0/(D1-D0);
- scale_edge1 = -D2/(D0-D2);
- edge_index0 = 0 ;edge_index1 = 2;
+ scale_edge0 = -D0 / (D1 - D0);
+ scale_edge1 = -D2 / (D0 - D2);
+ edge_index0 = 0;
+ edge_index1 = 2;
}
else
{
@@ -103,46 +102,44 @@ public:
return true;
}
-
//! clip triangle
/*!
*/
SIMD_FORCE_INLINE GUINT clip_triangle(
- const btVector4 & tri_plane,
- const btVector3 * tripoints,
- const btVector3 * srcpoints,
- btVector3 * clip_points)
+ const btVector4 &tri_plane,
+ const btVector3 *tripoints,
+ const btVector3 *srcpoints,
+ btVector3 *clip_points)
{
// edge 0
btVector4 edgeplane;
- EDGE_PLANE(tripoints[0],tripoints[1],tri_plane,edgeplane);
+ EDGE_PLANE(tripoints[0], tripoints[1], tri_plane, edgeplane);
GUINT clipped_count = PLANE_CLIP_TRIANGLE3D(
- edgeplane,srcpoints[0],srcpoints[1],srcpoints[2],temp_points);
+ edgeplane, srcpoints[0], srcpoints[1], srcpoints[2], temp_points);
- if(clipped_count == 0) return 0;
+ if (clipped_count == 0) return 0;
// edge 1
- EDGE_PLANE(tripoints[1],tripoints[2],tri_plane,edgeplane);
+ EDGE_PLANE(tripoints[1], tripoints[2], tri_plane, edgeplane);
clipped_count = PLANE_CLIP_POLYGON3D(
- edgeplane,temp_points,clipped_count,temp_points1);
+ edgeplane, temp_points, clipped_count, temp_points1);
- if(clipped_count == 0) return 0;
+ if (clipped_count == 0) return 0;
// edge 2
- EDGE_PLANE(tripoints[2],tripoints[0],tri_plane,edgeplane);
+ EDGE_PLANE(tripoints[2], tripoints[0], tri_plane, edgeplane);
clipped_count = PLANE_CLIP_POLYGON3D(
- edgeplane,temp_points1,clipped_count,clip_points);
+ edgeplane, temp_points1, clipped_count, clip_points);
return clipped_count;
-
/*GUINT i0 = (tri_plane.closestAxis()+1)%3;
GUINT i1 = (i0+1)%3;
// edge 0
@@ -172,13 +169,13 @@ public:
}
SIMD_FORCE_INLINE void sort_isect(
- GREAL & isect0,GREAL & isect1,GUINT &e0,GUINT &e1,btVector3 & vec0,btVector3 & vec1)
+ GREAL &isect0, GREAL &isect1, GUINT &e0, GUINT &e1, btVector3 &vec0, btVector3 &vec1)
{
- if(isect1<isect0)
+ if (isect1 < isect0)
{
//swap
- GIM_SWAP_NUMBERS(isect0,isect1);
- GIM_SWAP_NUMBERS(e0,e1);
+ GIM_SWAP_NUMBERS(isect0, isect1);
+ GIM_SWAP_NUMBERS(e0, e1);
btVector3 tmp = vec0;
vec0 = vec1;
vec1 = tmp;
@@ -202,53 +199,52 @@ public:
// Compute direction of intersection line
edge_edge_dir = tu_plane.cross(tv_plane);
GREAL Dlen;
- VEC_LENGTH(edge_edge_dir,Dlen);
+ VEC_LENGTH(edge_edge_dir, Dlen);
- if(Dlen<0.0001)
+ if (Dlen < 0.0001)
{
- return 0; //faces near paralele
+ return 0; //faces near paralele
}
- edge_edge_dir*= 1/Dlen;//normalize
-
+ edge_edge_dir *= 1 / Dlen; //normalize
// Compute interval for triangle 1
- GUINT tu_e0,tu_e1;//edge indices
- GREAL tu_scale_e0,tu_scale_e1;//edge scale
- if(!compute_intervals(du[0],du[1],du[2],
- du0du1,du0du2,tu_scale_e0,tu_scale_e1,tu_e0,tu_e1)) return 0;
+ GUINT tu_e0, tu_e1; //edge indices
+ GREAL tu_scale_e0, tu_scale_e1; //edge scale
+ if (!compute_intervals(du[0], du[1], du[2],
+ du0du1, du0du2, tu_scale_e0, tu_scale_e1, tu_e0, tu_e1)) return 0;
// Compute interval for triangle 2
- GUINT tv_e0,tv_e1;//edge indices
- GREAL tv_scale_e0,tv_scale_e1;//edge scale
+ GUINT tv_e0, tv_e1; //edge indices
+ GREAL tv_scale_e0, tv_scale_e1; //edge scale
- if(!compute_intervals(dv[0],dv[1],dv[2],
- dv0dv1,dv0dv2,tv_scale_e0,tv_scale_e1,tv_e0,tv_e1)) return 0;
+ if (!compute_intervals(dv[0], dv[1], dv[2],
+ dv0dv1, dv0dv2, tv_scale_e0, tv_scale_e1, tv_e0, tv_e1)) return 0;
//proyected vertices
- btVector3 up_e0 = tu_vertices[tu_e0].lerp(tu_vertices[(tu_e0+1)%3],tu_scale_e0);
- btVector3 up_e1 = tu_vertices[tu_e1].lerp(tu_vertices[(tu_e1+1)%3],tu_scale_e1);
+ btVector3 up_e0 = tu_vertices[tu_e0].lerp(tu_vertices[(tu_e0 + 1) % 3], tu_scale_e0);
+ btVector3 up_e1 = tu_vertices[tu_e1].lerp(tu_vertices[(tu_e1 + 1) % 3], tu_scale_e1);
- btVector3 vp_e0 = tv_vertices[tv_e0].lerp(tv_vertices[(tv_e0+1)%3],tv_scale_e0);
- btVector3 vp_e1 = tv_vertices[tv_e1].lerp(tv_vertices[(tv_e1+1)%3],tv_scale_e1);
+ btVector3 vp_e0 = tv_vertices[tv_e0].lerp(tv_vertices[(tv_e0 + 1) % 3], tv_scale_e0);
+ btVector3 vp_e1 = tv_vertices[tv_e1].lerp(tv_vertices[(tv_e1 + 1) % 3], tv_scale_e1);
//proyected intervals
- GREAL isect_u[] = {up_e0.dot(edge_edge_dir),up_e1.dot(edge_edge_dir)};
- GREAL isect_v[] = {vp_e0.dot(edge_edge_dir),vp_e1.dot(edge_edge_dir)};
+ GREAL isect_u[] = {up_e0.dot(edge_edge_dir), up_e1.dot(edge_edge_dir)};
+ GREAL isect_v[] = {vp_e0.dot(edge_edge_dir), vp_e1.dot(edge_edge_dir)};
- sort_isect(isect_u[0],isect_u[1],tu_e0,tu_e1,up_e0,up_e1);
- sort_isect(isect_v[0],isect_v[1],tv_e0,tv_e1,vp_e0,vp_e1);
+ sort_isect(isect_u[0], isect_u[1], tu_e0, tu_e1, up_e0, up_e1);
+ sort_isect(isect_v[0], isect_v[1], tv_e0, tv_e1, vp_e0, vp_e1);
- const GREAL midpoint_u = 0.5f*(isect_u[0]+isect_u[1]); // midpoint
- const GREAL midpoint_v = 0.5f*(isect_v[0]+isect_v[1]); // midpoint
+ const GREAL midpoint_u = 0.5f * (isect_u[0] + isect_u[1]); // midpoint
+ const GREAL midpoint_v = 0.5f * (isect_v[0] + isect_v[1]); // midpoint
- if(midpoint_u<midpoint_v)
+ if (midpoint_u < midpoint_v)
{
- if(isect_u[1]>=isect_v[1]) // face U casts face V
+ if (isect_u[1] >= isect_v[1]) // face U casts face V
{
return 1;
}
- else if(isect_v[0]<=isect_u[0]) // face V casts face U
+ else if (isect_v[0] <= isect_u[0]) // face V casts face U
{
return 2;
}
@@ -257,32 +253,31 @@ public:
closest_point_v = vp_e0;
// calc edges and separation
- if(isect_u[1]+ MIN_EDGE_EDGE_DIS<isect_v[0]) //calc distance between two lines instead
+ if (isect_u[1] + MIN_EDGE_EDGE_DIS < isect_v[0]) //calc distance between two lines instead
{
SEGMENT_COLLISION(
- tu_vertices[tu_e1],tu_vertices[(tu_e1+1)%3],
- tv_vertices[tv_e0],tv_vertices[(tv_e0+1)%3],
+ tu_vertices[tu_e1], tu_vertices[(tu_e1 + 1) % 3],
+ tv_vertices[tv_e0], tv_vertices[(tv_e0 + 1) % 3],
closest_point_u,
closest_point_v);
- edge_edge_dir = closest_point_u-closest_point_v;
- VEC_LENGTH(edge_edge_dir,distances[2]);
- edge_edge_dir *= 1.0f/distances[2];// normalize
+ edge_edge_dir = closest_point_u - closest_point_v;
+ VEC_LENGTH(edge_edge_dir, distances[2]);
+ edge_edge_dir *= 1.0f / distances[2]; // normalize
}
else
{
- distances[2] = isect_v[0]-isect_u[1];//distance negative
- //edge_edge_dir *= -1.0f; //normal pointing from V to U
+ distances[2] = isect_v[0] - isect_u[1]; //distance negative
+ //edge_edge_dir *= -1.0f; //normal pointing from V to U
}
-
}
else
{
- if(isect_v[1]>=isect_u[1]) // face V casts face U
+ if (isect_v[1] >= isect_u[1]) // face V casts face U
{
return 2;
}
- else if(isect_u[0]<=isect_v[0]) // face U casts face V
+ else if (isect_u[0] <= isect_v[0]) // face U casts face V
{
return 1;
}
@@ -291,41 +286,39 @@ public:
closest_point_v = vp_e1;
// calc edges and separation
- if(isect_v[1]+MIN_EDGE_EDGE_DIS<isect_u[0]) //calc distance between two lines instead
+ if (isect_v[1] + MIN_EDGE_EDGE_DIS < isect_u[0]) //calc distance between two lines instead
{
SEGMENT_COLLISION(
- tu_vertices[tu_e0],tu_vertices[(tu_e0+1)%3],
- tv_vertices[tv_e1],tv_vertices[(tv_e1+1)%3],
+ tu_vertices[tu_e0], tu_vertices[(tu_e0 + 1) % 3],
+ tv_vertices[tv_e1], tv_vertices[(tv_e1 + 1) % 3],
closest_point_u,
closest_point_v);
- edge_edge_dir = closest_point_u-closest_point_v;
- VEC_LENGTH(edge_edge_dir,distances[2]);
- edge_edge_dir *= 1.0f/distances[2];// normalize
+ edge_edge_dir = closest_point_u - closest_point_v;
+ VEC_LENGTH(edge_edge_dir, distances[2]);
+ edge_edge_dir *= 1.0f / distances[2]; // normalize
}
else
{
- distances[2] = isect_u[0]-isect_v[1];//distance negative
- //edge_edge_dir *= -1.0f; //normal pointing from V to U
+ distances[2] = isect_u[0] - isect_v[1]; //distance negative
+ //edge_edge_dir *= -1.0f; //normal pointing from V to U
}
}
return 3;
}
-
//! collides by two sides
SIMD_FORCE_INLINE bool triangle_collision(
- const btVector3 & u0,
- const btVector3 & u1,
- const btVector3 & u2,
- GREAL margin_u,
- const btVector3 & v0,
- const btVector3 & v1,
- const btVector3 & v2,
- GREAL margin_v,
- GIM_TRIANGLE_CONTACT_DATA & contacts)
+ const btVector3 &u0,
+ const btVector3 &u1,
+ const btVector3 &u2,
+ GREAL margin_u,
+ const btVector3 &v0,
+ const btVector3 &v1,
+ const btVector3 &v2,
+ GREAL margin_v,
+ GIM_TRIANGLE_CONTACT_DATA &contacts)
{
-
margin = margin_u + margin_v;
tu_vertices[0] = u0;
@@ -339,103 +332,99 @@ public:
//create planes
// plane v vs U points
- TRIANGLE_PLANE(tv_vertices[0],tv_vertices[1],tv_vertices[2],tv_plane);
-
- du[0] = DISTANCE_PLANE_POINT(tv_plane,tu_vertices[0]);
- du[1] = DISTANCE_PLANE_POINT(tv_plane,tu_vertices[1]);
- du[2] = DISTANCE_PLANE_POINT(tv_plane,tu_vertices[2]);
+ TRIANGLE_PLANE(tv_vertices[0], tv_vertices[1], tv_vertices[2], tv_plane);
+ du[0] = DISTANCE_PLANE_POINT(tv_plane, tu_vertices[0]);
+ du[1] = DISTANCE_PLANE_POINT(tv_plane, tu_vertices[1]);
+ du[2] = DISTANCE_PLANE_POINT(tv_plane, tu_vertices[2]);
du0du1 = du[0] * du[1];
du0du2 = du[0] * du[2];
-
- if(du0du1>0.0f && du0du2>0.0f) // same sign on all of them + not equal 0 ?
+ if (du0du1 > 0.0f && du0du2 > 0.0f) // same sign on all of them + not equal 0 ?
{
- if(du[0]<0) //we need test behind the triangle plane
+ if (du[0] < 0) //we need test behind the triangle plane
{
- distances[0] = GIM_MAX3(du[0],du[1],du[2]);
+ distances[0] = GIM_MAX3(du[0], du[1], du[2]);
distances[0] = -distances[0];
- if(distances[0]>margin) return false; //never intersect
+ if (distances[0] > margin) return false; //never intersect
//reorder triangle v
- VEC_SWAP(tv_vertices[0],tv_vertices[1]);
- VEC_SCALE_4(tv_plane,-1.0f,tv_plane);
+ VEC_SWAP(tv_vertices[0], tv_vertices[1]);
+ VEC_SCALE_4(tv_plane, -1.0f, tv_plane);
}
else
{
- distances[0] = GIM_MIN3(du[0],du[1],du[2]);
- if(distances[0]>margin) return false; //never intersect
+ distances[0] = GIM_MIN3(du[0], du[1], du[2]);
+ if (distances[0] > margin) return false; //never intersect
}
}
else
{
//Look if we need to invert the triangle
- distances[0] = (du[0]+du[1]+du[2])/3.0f; //centroid
+ distances[0] = (du[0] + du[1] + du[2]) / 3.0f; //centroid
- if(distances[0]<0.0f)
+ if (distances[0] < 0.0f)
{
//reorder triangle v
- VEC_SWAP(tv_vertices[0],tv_vertices[1]);
- VEC_SCALE_4(tv_plane,-1.0f,tv_plane);
+ VEC_SWAP(tv_vertices[0], tv_vertices[1]);
+ VEC_SCALE_4(tv_plane, -1.0f, tv_plane);
- distances[0] = GIM_MAX3(du[0],du[1],du[2]);
+ distances[0] = GIM_MAX3(du[0], du[1], du[2]);
distances[0] = -distances[0];
}
else
{
- distances[0] = GIM_MIN3(du[0],du[1],du[2]);
+ distances[0] = GIM_MIN3(du[0], du[1], du[2]);
}
}
-
// plane U vs V points
- TRIANGLE_PLANE(tu_vertices[0],tu_vertices[1],tu_vertices[2],tu_plane);
+ TRIANGLE_PLANE(tu_vertices[0], tu_vertices[1], tu_vertices[2], tu_plane);
- dv[0] = DISTANCE_PLANE_POINT(tu_plane,tv_vertices[0]);
- dv[1] = DISTANCE_PLANE_POINT(tu_plane,tv_vertices[1]);
- dv[2] = DISTANCE_PLANE_POINT(tu_plane,tv_vertices[2]);
+ dv[0] = DISTANCE_PLANE_POINT(tu_plane, tv_vertices[0]);
+ dv[1] = DISTANCE_PLANE_POINT(tu_plane, tv_vertices[1]);
+ dv[2] = DISTANCE_PLANE_POINT(tu_plane, tv_vertices[2]);
dv0dv1 = dv[0] * dv[1];
dv0dv2 = dv[0] * dv[2];
-
- if(dv0dv1>0.0f && dv0dv2>0.0f) // same sign on all of them + not equal 0 ?
+ if (dv0dv1 > 0.0f && dv0dv2 > 0.0f) // same sign on all of them + not equal 0 ?
{
- if(dv[0]<0) //we need test behind the triangle plane
+ if (dv[0] < 0) //we need test behind the triangle plane
{
- distances[1] = GIM_MAX3(dv[0],dv[1],dv[2]);
+ distances[1] = GIM_MAX3(dv[0], dv[1], dv[2]);
distances[1] = -distances[1];
- if(distances[1]>margin) return false; //never intersect
+ if (distances[1] > margin) return false; //never intersect
//reorder triangle u
- VEC_SWAP(tu_vertices[0],tu_vertices[1]);
- VEC_SCALE_4(tu_plane,-1.0f,tu_plane);
+ VEC_SWAP(tu_vertices[0], tu_vertices[1]);
+ VEC_SCALE_4(tu_plane, -1.0f, tu_plane);
}
else
{
- distances[1] = GIM_MIN3(dv[0],dv[1],dv[2]);
- if(distances[1]>margin) return false; //never intersect
+ distances[1] = GIM_MIN3(dv[0], dv[1], dv[2]);
+ if (distances[1] > margin) return false; //never intersect
}
}
else
{
//Look if we need to invert the triangle
- distances[1] = (dv[0]+dv[1]+dv[2])/3.0f; //centroid
+ distances[1] = (dv[0] + dv[1] + dv[2]) / 3.0f; //centroid
- if(distances[1]<0.0f)
+ if (distances[1] < 0.0f)
{
//reorder triangle v
- VEC_SWAP(tu_vertices[0],tu_vertices[1]);
- VEC_SCALE_4(tu_plane,-1.0f,tu_plane);
+ VEC_SWAP(tu_vertices[0], tu_vertices[1]);
+ VEC_SCALE_4(tu_plane, -1.0f, tu_plane);
- distances[1] = GIM_MAX3(dv[0],dv[1],dv[2]);
+ distances[1] = GIM_MAX3(dv[0], dv[1], dv[2]);
distances[1] = -distances[1];
}
else
{
- distances[1] = GIM_MIN3(dv[0],dv[1],dv[2]);
+ distances[1] = GIM_MIN3(dv[0], dv[1], dv[2]);
}
}
@@ -448,47 +437,44 @@ public:
}
else
{*/
- bl = 0;
- if(distances[0]<distances[1]) bl = 1;
+ bl = 0;
+ if (distances[0] < distances[1]) bl = 1;
//}
- if(bl==2) //edge edge separation
+ if (bl == 2) //edge edge separation
{
- if(distances[2]>margin) return false;
+ if (distances[2] > margin) return false;
contacts.m_penetration_depth = -distances[2] + margin;
contacts.m_points[0] = closest_point_v;
contacts.m_point_count = 1;
- VEC_COPY(contacts.m_separating_normal,edge_edge_dir);
+ VEC_COPY(contacts.m_separating_normal, edge_edge_dir);
return true;
}
//clip face against other
-
GUINT point_count;
//TODO
- if(bl == 0) //clip U points against V
+ if (bl == 0) //clip U points against V
{
- point_count = clip_triangle(tv_plane,tv_vertices,tu_vertices,contact_points);
- if(point_count == 0) return false;
- contacts.merge_points(tv_plane,margin,contact_points,point_count);
+ point_count = clip_triangle(tv_plane, tv_vertices, tu_vertices, contact_points);
+ if (point_count == 0) return false;
+ contacts.merge_points(tv_plane, margin, contact_points, point_count);
}
- else //clip V points against U
+ else //clip V points against U
{
- point_count = clip_triangle(tu_plane,tu_vertices,tv_vertices,contact_points);
- if(point_count == 0) return false;
- contacts.merge_points(tu_plane,margin,contact_points,point_count);
+ point_count = clip_triangle(tu_plane, tu_vertices, tv_vertices, contact_points);
+ if (point_count == 0) return false;
+ contacts.merge_points(tu_plane, margin, contact_points, point_count);
contacts.m_separating_normal *= -1.f;
}
- if(contacts.m_point_count == 0) return false;
+ if (contacts.m_point_count == 0) return false;
return true;
}
-
};
-
/*class GIM_TRIANGLE_CALCULATION_CACHE
{
public:
@@ -621,20 +607,13 @@ public:
};*/
-
-
bool GIM_TRIANGLE::collide_triangle_hard_test(
- const GIM_TRIANGLE & other,
- GIM_TRIANGLE_CONTACT_DATA & contact_data) const
+ const GIM_TRIANGLE &other,
+ GIM_TRIANGLE_CONTACT_DATA &contact_data) const
{
- GIM_TRIANGLE_CALCULATION_CACHE calc_cache;
+ GIM_TRIANGLE_CALCULATION_CACHE calc_cache;
return calc_cache.triangle_collision(
- m_vertices[0],m_vertices[1],m_vertices[2],m_margin,
- other.m_vertices[0],other.m_vertices[1],other.m_vertices[2],other.m_margin,
- contact_data);
-
+ m_vertices[0], m_vertices[1], m_vertices[2], m_margin,
+ other.m_vertices[0], other.m_vertices[1], other.m_vertices[2], other.m_margin,
+ contact_data);
}
-
-
-
-
diff --git a/thirdparty/bullet/BulletCollision/Gimpact/gim_tri_collision.h b/thirdparty/bullet/BulletCollision/Gimpact/gim_tri_collision.h
index 267f806e7e..e6d4bf5470 100644
--- a/thirdparty/bullet/BulletCollision/Gimpact/gim_tri_collision.h
+++ b/thirdparty/bullet/BulletCollision/Gimpact/gim_tri_collision.h
@@ -36,8 +36,6 @@ email: projectileman@yahoo.com
#include "gim_box_collision.h"
#include "gim_clip_polygon.h"
-
-
#ifndef MAX_TRI_CLIPPING
#define MAX_TRI_CLIPPING 16
#endif
@@ -45,18 +43,18 @@ email: projectileman@yahoo.com
//! 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];
+ 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)
+ 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--)
+ while (i--)
{
m_points[i] = other.m_points[i];
}
@@ -66,39 +64,36 @@ struct GIM_TRIANGLE_CONTACT_DATA
{
}
- GIM_TRIANGLE_CONTACT_DATA(const GIM_TRIANGLE_CONTACT_DATA& other)
+ GIM_TRIANGLE_CONTACT_DATA(const GIM_TRIANGLE_CONTACT_DATA &other)
{
copy_from(other);
}
-
-
-
- //! classify points that are closer
- template<typename DISTANCE_FUNC,typename CLASS_PLANE>
- 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;
+ //! classify points that are closer
+ template <typename DISTANCE_FUNC, typename CLASS_PLANE>
+ 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++)
+ for (_k = 0; _k < point_count; _k++)
{
- GREAL _dist = -distance_func(plane,points[_k]) + margin;
+ GREAL _dist = -distance_func(plane, points[_k]) + margin;
- if(_dist>=0.0f)
+ if (_dist >= 0.0f)
{
- if(_dist>m_penetration_depth)
+ if (_dist > m_penetration_depth)
{
m_penetration_depth = _dist;
point_indices[0] = _k;
- m_point_count=1;
+ m_point_count = 1;
}
- else if((_dist+G_EPSILON)>=m_penetration_depth)
+ else if ((_dist + G_EPSILON) >= m_penetration_depth)
{
point_indices[m_point_count] = _k;
m_point_count++;
@@ -106,88 +101,87 @@ struct GIM_TRIANGLE_CONTACT_DATA
}
}
- for( _k=0;_k<m_point_count;_k++)
+ 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)
+ 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
- /*!
+ 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);
+ SIMD_FORCE_INLINE void get_triangle_transform(btTransform &triangle_transform) const
+ {
+ btMatrix3x3 &matrix = triangle_transform.getBasis();
- btVector3 xaxis = m_vertices[1] - m_vertices[0];
- VEC_NORMALIZE(xaxis);
- MAT_SET_X(matrix,xaxis);
+ btVector3 zaxis;
+ get_normal(zaxis);
+ MAT_SET_Z(matrix, zaxis);
- //y axis
- xaxis = zaxis.cross(xaxis);
- MAT_SET_Y(matrix,xaxis);
+ btVector3 xaxis = m_vertices[1] - m_vertices[0];
+ VEC_NORMALIZE(xaxis);
+ MAT_SET_X(matrix, xaxis);
- triangle_transform.setOrigin(m_vertices[0]);
- }
+ //y axis
+ xaxis = zaxis.cross(xaxis);
+ MAT_SET_Y(matrix, xaxis);
+ triangle_transform.setOrigin(m_vertices[0]);
+ }
//! Test triangles by finding separating axis
/*!
@@ -195,8 +189,8 @@ public:
\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;
+ const GIM_TRIANGLE &other,
+ GIM_TRIANGLE_CONTACT_DATA &contact_data) const;
//! Test boxes before doing hard test
/*!
@@ -205,16 +199,16 @@ public:
\
*/
SIMD_FORCE_INLINE bool collide_triangle(
- const GIM_TRIANGLE & other,
- GIM_TRIANGLE_CONTACT_DATA & contact_data) const
+ 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;
+ 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);
+ return collide_triangle_hard_test(other, contact_data);
}
/*!
@@ -246,43 +240,43 @@ 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
+ 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 _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)
+ 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];
+ 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];
+ 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)
+ if (u < -G_EPSILON)
{
return false;
}
- else if(v<-G_EPSILON)
+ else if (v < -G_EPSILON)
{
return false;
}
else
{
btScalar sumuv;
- sumuv = u+v;
- if(sumuv<-G_EPSILON)
+ sumuv = u + v;
+ if (sumuv < -G_EPSILON)
{
return false;
}
- else if(sumuv-1.0f>G_EPSILON)
+ else if (sumuv - 1.0f > G_EPSILON)
{
return false;
}
@@ -294,50 +288,49 @@ if 0.0<= u+v <=1.0 then they are inside of triangle
/*!
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
+ 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(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(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
+ 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)
+ 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);
+ 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;
+ 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
+ if (res == 2) //invert normal
{
- triangle_normal.setValue(-faceplane[0],-faceplane[1],-faceplane[2]);
+ triangle_normal.setValue(-faceplane[0], -faceplane[1], -faceplane[2]);
}
else
{
- triangle_normal.setValue(faceplane[0],faceplane[1],faceplane[2]);
+ triangle_normal.setValue(faceplane[0], faceplane[1], faceplane[2]);
}
VEC_NORMALIZE(triangle_normal);
@@ -345,36 +338,31 @@ if 0.0<= u+v <=1.0 then they are inside of triangle
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)
+ 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);
+ 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;
+ 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;
+ if (!is_point_inside(pout, faceplane)) return false;
- triangle_normal.setValue(faceplane[0],faceplane[1],faceplane[2]);
+ triangle_normal.setValue(faceplane[0], faceplane[1], faceplane[2]);
VEC_NORMALIZE(triangle_normal);
return true;
}
-
};
-
-
-
-#endif // GIM_TRI_COLLISION_H_INCLUDED
+#endif // GIM_TRI_COLLISION_H_INCLUDED
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btComputeGjkEpaPenetration.h b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btComputeGjkEpaPenetration.h
index 9eb880b8df..c94391d816 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btComputeGjkEpaPenetration.h
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btComputeGjkEpaPenetration.h
@@ -16,163 +16,153 @@ subject to the following restrictions:
#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 "LinearMath/btTransform.h" // Note that btVector3 might be double precision...
#include "btGjkEpa3.h"
#include "btGjkCollisionDescription.h"
#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h"
+template <typename btConvexTemplate>
+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))
-template <typename btConvexTemplate>
-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;
+ {
+ // 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 <typename btConvexTemplate, typename btGjkDistanceTemplate>
-int btComputeGjkEpaPenetration(const btConvexTemplate& a, const btConvexTemplate& b, const btGjkCollisionDescription& colDesc, btVoronoiSimplexSolver& simplexSolver, btGjkDistanceTemplate* distInfo)
+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 seperatingAxisInA = (-m_cachedSeparatingAxis)* localTransA.getBasis();
- btVector3 seperatingAxisInB = m_cachedSeparatingAxis* localTransB.getBasis();
-
- btVector3 pInA = a.getLocalSupportWithoutMargin(seperatingAxisInA);
- btVector3 qInB = b.getLocalSupportWithoutMargin(seperatingAxisInB);
-
- 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();
+ 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 seperatingAxisInA = (-m_cachedSeparatingAxis) * localTransA.getBasis();
+ btVector3 seperatingAxisInB = m_cachedSeparatingAxis * localTransB.getBasis();
+
+ btVector3 pInA = a.getLocalSupportWithoutMargin(seperatingAxisInA);
+ btVector3 qInB = b.getLocalSupportWithoutMargin(seperatingAxisInB);
+
+ 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)
@@ -182,188 +172,183 @@ int btComputeGjkEpaPenetration(const btConvexTemplate& a, const btConvexTemplate
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 //
+
+ //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;
-}
+ 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
+#endif //BT_GJK_EPA_PENETATION_CONVEX_COLLISION_H
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp
index 3481fec850..38df8d4808 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp
@@ -13,7 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btContinuousConvexCollision.h"
#include "BulletCollision/CollisionShapes/btConvexShape.h"
#include "BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h"
@@ -24,59 +23,60 @@ subject to the following restrictions:
#include "btPointCollector.h"
#include "BulletCollision/CollisionShapes/btStaticPlaneShape.h"
-
-
-btContinuousConvexCollision::btContinuousConvexCollision ( const btConvexShape* convexA,const btConvexShape* convexB,btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* penetrationDepthSolver)
-:m_simplexSolver(simplexSolver),
-m_penetrationDepthSolver(penetrationDepthSolver),
-m_convexA(convexA),m_convexB1(convexB),m_planeShape(0)
+btContinuousConvexCollision::btContinuousConvexCollision(const btConvexShape* convexA, const btConvexShape* convexB, btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* penetrationDepthSolver)
+ : m_simplexSolver(simplexSolver),
+ m_penetrationDepthSolver(penetrationDepthSolver),
+ m_convexA(convexA),
+ m_convexB1(convexB),
+ m_planeShape(0)
{
}
-
-btContinuousConvexCollision::btContinuousConvexCollision( const btConvexShape* convexA,const btStaticPlaneShape* plane)
-:m_simplexSolver(0),
-m_penetrationDepthSolver(0),
-m_convexA(convexA),m_convexB1(0),m_planeShape(plane)
+btContinuousConvexCollision::btContinuousConvexCollision(const btConvexShape* convexA, const btStaticPlaneShape* plane)
+ : m_simplexSolver(0),
+ m_penetrationDepthSolver(0),
+ m_convexA(convexA),
+ m_convexB1(0),
+ m_planeShape(plane)
{
}
-
/// This maximum should not be necessary. It allows for untested/degenerate cases in production code.
/// You don't want your game ever to lock-up.
#define MAX_ITERATIONS 64
-void btContinuousConvexCollision::computeClosestPoints( const btTransform& transA, const btTransform& transB,btPointCollector& pointCollector)
+void btContinuousConvexCollision::computeClosestPoints(const btTransform& transA, const btTransform& transB, btPointCollector& pointCollector)
{
if (m_convexB1)
{
m_simplexSolver->reset();
- btGjkPairDetector gjk(m_convexA,m_convexB1,m_convexA->getShapeType(),m_convexB1->getShapeType(),m_convexA->getMargin(),m_convexB1->getMargin(),m_simplexSolver,m_penetrationDepthSolver);
+ btGjkPairDetector gjk(m_convexA, m_convexB1, m_convexA->getShapeType(), m_convexB1->getShapeType(), m_convexA->getMargin(), m_convexB1->getMargin(), m_simplexSolver, m_penetrationDepthSolver);
btGjkPairDetector::ClosestPointInput input;
input.m_transformA = transA;
input.m_transformB = transB;
- gjk.getClosestPoints(input,pointCollector,0);
- } else
+ gjk.getClosestPoints(input, pointCollector, 0);
+ }
+ else
{
//convex versus plane
const btConvexShape* convexShape = m_convexA;
const btStaticPlaneShape* planeShape = m_planeShape;
-
+
const btVector3& planeNormal = planeShape->getPlaneNormal();
const btScalar& planeConstant = planeShape->getPlaneConstant();
-
+
btTransform convexWorldTransform = transA;
btTransform convexInPlaneTrans;
- convexInPlaneTrans= transB.inverse() * convexWorldTransform;
+ convexInPlaneTrans = transB.inverse() * convexWorldTransform;
btTransform planeInConvex;
- planeInConvex= convexWorldTransform.inverse() * transB;
-
- btVector3 vtx = convexShape->localGetSupportingVertex(planeInConvex.getBasis()*-planeNormal);
+ planeInConvex = convexWorldTransform.inverse() * transB;
+
+ btVector3 vtx = convexShape->localGetSupportingVertex(planeInConvex.getBasis() * -planeNormal);
btVector3 vtxInPlane = convexInPlaneTrans(vtx);
btScalar distance = (planeNormal.dot(vtxInPlane) - planeConstant);
- btVector3 vtxInPlaneProjected = vtxInPlane - distance*planeNormal;
+ btVector3 vtxInPlaneProjected = vtxInPlane - distance * planeNormal;
btVector3 vtxInPlaneWorld = transB * vtxInPlaneProjected;
btVector3 normalOnSurfaceB = transB.getBasis() * planeNormal;
@@ -87,36 +87,33 @@ void btContinuousConvexCollision::computeClosestPoints( const btTransform& trans
}
}
-bool btContinuousConvexCollision::calcTimeOfImpact(
- const btTransform& fromA,
- const btTransform& toA,
- const btTransform& fromB,
- const btTransform& toB,
- CastResult& result)
+bool btContinuousConvexCollision::calcTimeOfImpact(
+ const btTransform& fromA,
+ const btTransform& toA,
+ const btTransform& fromB,
+ const btTransform& toB,
+ CastResult& result)
{
-
-
/// compute linear and angular velocity for this interval, to interpolate
- btVector3 linVelA,angVelA,linVelB,angVelB;
- btTransformUtil::calculateVelocity(fromA,toA,btScalar(1.),linVelA,angVelA);
- btTransformUtil::calculateVelocity(fromB,toB,btScalar(1.),linVelB,angVelB);
-
+ btVector3 linVelA, angVelA, linVelB, angVelB;
+ btTransformUtil::calculateVelocity(fromA, toA, btScalar(1.), linVelA, angVelA);
+ btTransformUtil::calculateVelocity(fromB, toB, btScalar(1.), linVelB, angVelB);
btScalar boundingRadiusA = m_convexA->getAngularMotionDisc();
- btScalar boundingRadiusB = m_convexB1?m_convexB1->getAngularMotionDisc():0.f;
+ btScalar boundingRadiusB = m_convexB1 ? m_convexB1->getAngularMotionDisc() : 0.f;
btScalar maxAngularProjectedVelocity = angVelA.length() * boundingRadiusA + angVelB.length() * boundingRadiusB;
- btVector3 relLinVel = (linVelB-linVelA);
+ btVector3 relLinVel = (linVelB - linVelA);
+
+ btScalar relLinVelocLength = (linVelB - linVelA).length();
- btScalar relLinVelocLength = (linVelB-linVelA).length();
-
- if ((relLinVelocLength+maxAngularProjectedVelocity) == 0.f)
+ if ((relLinVelocLength + maxAngularProjectedVelocity) == 0.f)
return false;
btScalar lambda = btScalar(0.);
btVector3 n;
- n.setValue(btScalar(0.),btScalar(0.),btScalar(0.));
+ n.setValue(btScalar(0.), btScalar(0.), btScalar(0.));
bool hasResult = false;
btVector3 c;
@@ -126,14 +123,13 @@ bool btContinuousConvexCollision::calcTimeOfImpact(
int numIter = 0;
//first solution, using GJK
-
btScalar radius = 0.001f;
-// result.drawCoordSystem(sphereTr);
+ // result.drawCoordSystem(sphereTr);
- btPointCollector pointCollector1;
+ btPointCollector pointCollector1;
- {
- computeClosestPoints(fromA,fromB,pointCollector1);
+ {
+ computeClosestPoints(fromA, fromB, pointCollector1);
hasResult = pointCollector1.m_hasResult;
c = pointCollector1.m_pointInWorld;
@@ -145,7 +141,7 @@ bool btContinuousConvexCollision::calcTimeOfImpact(
dist = pointCollector1.m_distance + result.m_allowedPenetration;
n = pointCollector1.m_normalOnBInWorld;
btScalar projectedLinearVelocity = relLinVel.dot(n);
- if ((projectedLinearVelocity+ maxAngularProjectedVelocity)<=SIMD_EPSILON)
+ if ((projectedLinearVelocity + maxAngularProjectedVelocity) <= SIMD_EPSILON)
return false;
//not close enough
@@ -153,18 +149,17 @@ bool btContinuousConvexCollision::calcTimeOfImpact(
{
if (result.m_debugDrawer)
{
- result.m_debugDrawer->drawSphere(c,0.2f,btVector3(1,1,1));
+ result.m_debugDrawer->drawSphere(c, 0.2f, btVector3(1, 1, 1));
}
btScalar dLambda = btScalar(0.);
projectedLinearVelocity = relLinVel.dot(n);
-
//don't report time of impact for motion away from the contact normal (or causes minor penetration)
- if ((projectedLinearVelocity+ maxAngularProjectedVelocity)<=SIMD_EPSILON)
+ if ((projectedLinearVelocity + maxAngularProjectedVelocity) <= SIMD_EPSILON)
return false;
-
- dLambda = dist / (projectedLinearVelocity+ maxAngularProjectedVelocity);
+
+ dLambda = dist / (projectedLinearVelocity + maxAngularProjectedVelocity);
lambda += dLambda;
@@ -181,28 +176,29 @@ bool btContinuousConvexCollision::calcTimeOfImpact(
lastLambda = lambda;
//interpolate to next lambda
- btTransform interpolatedTransA,interpolatedTransB,relativeTrans;
+ btTransform interpolatedTransA, interpolatedTransB, relativeTrans;
- btTransformUtil::integrateTransform(fromA,linVelA,angVelA,lambda,interpolatedTransA);
- btTransformUtil::integrateTransform(fromB,linVelB,angVelB,lambda,interpolatedTransB);
+ btTransformUtil::integrateTransform(fromA, linVelA, angVelA, lambda, interpolatedTransA);
+ btTransformUtil::integrateTransform(fromB, linVelB, angVelB, lambda, interpolatedTransB);
relativeTrans = interpolatedTransB.inverseTimes(interpolatedTransA);
if (result.m_debugDrawer)
{
- result.m_debugDrawer->drawSphere(interpolatedTransA.getOrigin(),0.2f,btVector3(1,0,0));
+ result.m_debugDrawer->drawSphere(interpolatedTransA.getOrigin(), 0.2f, btVector3(1, 0, 0));
}
- result.DebugDraw( lambda );
+ result.DebugDraw(lambda);
- btPointCollector pointCollector;
- computeClosestPoints(interpolatedTransA,interpolatedTransB,pointCollector);
+ btPointCollector pointCollector;
+ computeClosestPoints(interpolatedTransA, interpolatedTransB, pointCollector);
if (pointCollector.m_hasResult)
{
- dist = pointCollector.m_distance+result.m_allowedPenetration;
- c = pointCollector.m_pointInWorld;
+ dist = pointCollector.m_distance + result.m_allowedPenetration;
+ c = pointCollector.m_pointInWorld;
n = pointCollector.m_normalOnBInWorld;
- } else
+ }
+ else
{
result.reportFailure(-1, numIter);
return false;
@@ -215,7 +211,7 @@ bool btContinuousConvexCollision::calcTimeOfImpact(
return false;
}
}
-
+
result.m_fraction = lambda;
result.m_normal = n;
result.m_hitPoint = c;
@@ -224,4 +220,3 @@ bool btContinuousConvexCollision::calcTimeOfImpact(
return false;
}
-
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.h b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.h
index 528b5e0101..67b2205c36 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.h
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.h
@@ -13,7 +13,6 @@ subject to the following restrictions:
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
@@ -30,30 +29,25 @@ class btStaticPlaneShape;
class btContinuousConvexCollision : public btConvexCast
{
btSimplexSolverInterface* m_simplexSolver;
- btConvexPenetrationDepthSolver* m_penetrationDepthSolver;
- const btConvexShape* m_convexA;
+ 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;
+ const btConvexShape* m_convexB1;
+ const btStaticPlaneShape* m_planeShape;
- void computeClosestPoints( const btTransform& transA, const btTransform& transB,struct btPointCollector& pointCollector);
+ 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 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);
-
+ 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
-
+#endif //BT_CONTINUOUS_COLLISION_CONVEX_CAST_H
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btConvexCast.h b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btConvexCast.h
index bfd79d03be..76f54699c5 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btConvexCast.h
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btConvexCast.h
@@ -13,7 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#ifndef BT_CONVEX_CAST_H
#define BT_CONVEX_CAST_H
@@ -23,51 +22,69 @@ subject to the following restrictions:
class btMinkowskiSumShape;
#include "LinearMath/btIDebugDraw.h"
+#ifdef BT_USE_DOUBLE_PRECISION
+#define MAX_ITERATIONS 64
+#define MAX_EPSILON (SIMD_EPSILON * 10)
+#else
+#define MAX_ITERATIONS 32
+#define MAX_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
+ 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;}
+
+ 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_fraction(btScalar(BT_LARGE_FLOAT)),
+ m_debugDrawer(0),
+ m_allowedPenetration(btScalar(0)),
+ m_subSimplexCastMaxIterations(MAX_ITERATIONS),
+ m_subSimplexCastEpsilon(MAX_EPSILON)
{
}
+ virtual ~CastResult(){};
- virtual ~CastResult() {};
-
- btTransform m_hitTransformA;
- btTransform m_hitTransformB;
- btVector3 m_normal;
- btVector3 m_hitPoint;
- btScalar m_fraction; //input and output
+ btTransform m_hitTransformA;
+ btTransform m_hitTransformB;
+ btVector3 m_normal;
+ btVector3 m_hitPoint;
+ btScalar m_fraction; //input and output
btIDebugDraw* m_debugDrawer;
- btScalar m_allowedPenetration;
+ 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;
+ virtual bool calcTimeOfImpact(
+ const btTransform& fromA,
+ const btTransform& toA,
+ const btTransform& fromB,
+ const btTransform& toB,
+ CastResult& result) = 0;
};
-#endif //BT_CONVEX_CAST_H
+#endif //BT_CONVEX_CAST_H
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h
index 29620abffb..65c9df9340 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h
@@ -13,7 +13,6 @@ subject to the following restrictions:
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
@@ -25,16 +24,12 @@ 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;
-
-
+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
-
+#endif //BT_CONVEX_PENETRATION_DEPTH_H
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h
index 0ea7b483cf..d1bbb1a46e 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h
@@ -13,7 +13,6 @@ subject to the following restrictions:
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
@@ -27,64 +26,60 @@ subject to the following restrictions:
/// by taking closestPointInA = closestPointInB + m_distance * m_normalOnSurfaceB
struct btDiscreteCollisionDetectorInterface
{
-
struct Result
{
-
- virtual ~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;
+ 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))
+ : m_maximumDistanceSquared(btScalar(BT_LARGE_FLOAT))
{
}
btTransform m_transformA;
btTransform m_transformB;
- btScalar m_maximumDistanceSquared;
+ btScalar m_maximumDistanceSquared;
};
- virtual ~btDiscreteCollisionDetectorInterface() {};
+ 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;
-
+ 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 !
+ btVector3 m_normalOnSurfaceB;
+ btVector3 m_closestPointInB;
+ btScalar m_distance; //negative means penetration !
- protected:
- btStorageResult() : m_distance(btScalar(BT_LARGE_FLOAT))
- {
- }
-
- public:
- virtual ~btStorageResult() {};
+protected:
+ btStorageResult() : m_distance(btScalar(BT_LARGE_FLOAT))
+ {
+ }
+
+public:
+ virtual ~btStorageResult(){};
- virtual void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar depth)
+ virtual void addContactPoint(const btVector3& normalOnBInWorld, const btVector3& pointInWorld, btScalar depth)
+ {
+ if (depth < m_distance)
{
- if (depth < m_distance)
- {
- m_normalOnSurfaceB = normalOnBInWorld;
- m_closestPointInB = pointInWorld;
- m_distance = depth;
- }
+ m_normalOnSurfaceB = normalOnBInWorld;
+ m_closestPointInB = pointInWorld;
+ m_distance = depth;
}
+ }
};
-#endif //BT_DISCRETE_COLLISION_DETECTOR1_INTERFACE_H
-
+#endif //BT_DISCRETE_COLLISION_DETECTOR1_INTERFACE_H
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkCollisionDescription.h b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkCollisionDescription.h
index 0b49b0ecc6..c9fd84bebf 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkCollisionDescription.h
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkCollisionDescription.h
@@ -13,7 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#ifndef GJK_COLLISION_DESCRIPTION_H
#define GJK_COLLISION_DESCRIPTION_H
@@ -21,21 +20,20 @@ subject to the following restrictions:
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()
- {
- }
+ 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
-
+#endif //GJK_COLLISION_DESCRIPTION_H
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.cpp b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.cpp
index bef697a0a1..9d61e75dac 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.cpp
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.cpp
@@ -13,8 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
-
#include "btGjkConvexCast.h"
#include "BulletCollision/CollisionShapes/btSphereShape.h"
#include "btGjkPairDetector.h"
@@ -27,41 +25,39 @@ subject to the following restrictions:
#define MAX_ITERATIONS 32
#endif
-btGjkConvexCast::btGjkConvexCast(const btConvexShape* convexA,const btConvexShape* convexB,btSimplexSolverInterface* simplexSolver)
-:m_simplexSolver(simplexSolver),
-m_convexA(convexA),
-m_convexB(convexB)
+btGjkConvexCast::btGjkConvexCast(const btConvexShape* convexA, const btConvexShape* convexB, btSimplexSolverInterface* simplexSolver)
+ : m_simplexSolver(simplexSolver),
+ m_convexA(convexA),
+ m_convexB(convexB)
{
}
-bool btGjkConvexCast::calcTimeOfImpact(
- const btTransform& fromA,
- const btTransform& toA,
- const btTransform& fromB,
- const btTransform& toB,
- CastResult& result)
+bool btGjkConvexCast::calcTimeOfImpact(
+ const btTransform& fromA,
+ const btTransform& toA,
+ const btTransform& fromB,
+ const btTransform& toB,
+ CastResult& result)
{
-
-
m_simplexSolver->reset();
/// compute linear velocity for this interval, to interpolate
//assume no rotation/angular velocity, assert here?
- btVector3 linVelA,linVelB;
- linVelA = toA.getOrigin()-fromA.getOrigin();
- linVelB = toB.getOrigin()-fromB.getOrigin();
+ btVector3 linVelA, linVelB;
+ linVelA = toA.getOrigin() - fromA.getOrigin();
+ linVelB = toB.getOrigin() - fromB.getOrigin();
btScalar radius = btScalar(0.001);
btScalar lambda = btScalar(0.);
- btVector3 v(1,0,0);
+ btVector3 v(1, 0, 0);
int maxIter = MAX_ITERATIONS;
btVector3 n;
- n.setValue(btScalar(0.),btScalar(0.),btScalar(0.));
+ n.setValue(btScalar(0.), btScalar(0.), btScalar(0.));
bool hasResult = false;
btVector3 c;
- btVector3 r = (linVelA-linVelB);
+ btVector3 r = (linVelA - linVelB);
btScalar lastLambda = lambda;
//btScalar epsilon = btScalar(0.001);
@@ -69,17 +65,14 @@ bool btGjkConvexCast::calcTimeOfImpact(
int numIter = 0;
//first solution, using GJK
-
btTransform identityTrans;
identityTrans.setIdentity();
+ // result.drawCoordSystem(sphereTr);
-// result.drawCoordSystem(sphereTr);
-
- btPointCollector pointCollector;
+ btPointCollector pointCollector;
-
- btGjkPairDetector gjk(m_convexA,m_convexB,m_simplexSolver,0);//m_penetrationDepthSolver);
+ btGjkPairDetector gjk(m_convexA, m_convexB, m_simplexSolver, 0); //m_penetrationDepthSolver);
btGjkPairDetector::ClosestPointInput input;
//we don't use margins during CCD
@@ -87,7 +80,7 @@ bool btGjkConvexCast::calcTimeOfImpact(
input.m_transformA = fromA;
input.m_transformB = fromB;
- gjk.getClosestPoints(input,pointCollector,0);
+ gjk.getClosestPoints(input, pointCollector, 0);
hasResult = pointCollector.m_hasResult;
c = pointCollector.m_pointInWorld;
@@ -98,20 +91,18 @@ bool btGjkConvexCast::calcTimeOfImpact(
dist = pointCollector.m_distance;
n = pointCollector.m_normalOnBInWorld;
-
-
//not close enough
while (dist > radius)
{
numIter++;
if (numIter > maxIter)
{
- return false; //todo: report a failure
+ return false; //todo: report a failure
}
btScalar dLambda = btScalar(0.);
btScalar projectedLinearVelocity = r.dot(n);
-
+
dLambda = dist / (projectedLinearVelocity);
lambda = lambda - dLambda;
@@ -132,35 +123,35 @@ bool btGjkConvexCast::calcTimeOfImpact(
lastLambda = lambda;
//interpolate to next lambda
- result.DebugDraw( lambda );
- input.m_transformA.getOrigin().setInterpolate3(fromA.getOrigin(),toA.getOrigin(),lambda);
- input.m_transformB.getOrigin().setInterpolate3(fromB.getOrigin(),toB.getOrigin(),lambda);
-
- gjk.getClosestPoints(input,pointCollector,0);
+ result.DebugDraw(lambda);
+ input.m_transformA.getOrigin().setInterpolate3(fromA.getOrigin(), toA.getOrigin(), lambda);
+ input.m_transformB.getOrigin().setInterpolate3(fromB.getOrigin(), toB.getOrigin(), lambda);
+
+ gjk.getClosestPoints(input, pointCollector, 0);
if (pointCollector.m_hasResult)
{
if (pointCollector.m_distance < btScalar(0.))
{
result.m_fraction = lastLambda;
n = pointCollector.m_normalOnBInWorld;
- result.m_normal=n;
+ result.m_normal = n;
result.m_hitPoint = pointCollector.m_pointInWorld;
return true;
}
- c = pointCollector.m_pointInWorld;
+ c = pointCollector.m_pointInWorld;
n = pointCollector.m_normalOnBInWorld;
dist = pointCollector.m_distance;
- } else
+ }
+ else
{
//??
return false;
}
-
}
//is n normalized?
//don't report time of impact for motion away from the contact normal (or causes minor penetration)
- if (n.dot(r)>=-result.m_allowedPenetration)
+ if (n.dot(r) >= -result.m_allowedPenetration)
return false;
result.m_fraction = lambda;
@@ -170,7 +161,4 @@ bool btGjkConvexCast::calcTimeOfImpact(
}
return false;
-
-
}
-
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h
index 6a42ee63b0..ef5979173e 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h
@@ -13,8 +13,6 @@ subject to the following restrictions:
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
@@ -29,22 +27,20 @@ class btMinkowskiSumShape;
///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;
+ btSimplexSolverInterface* m_simplexSolver;
+ const btConvexShape* m_convexA;
+ const btConvexShape* m_convexB;
public:
-
- btGjkConvexCast(const btConvexShape* convexA,const btConvexShape* convexB,btSimplexSolverInterface* simplexSolver);
+ 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);
-
+ virtual bool calcTimeOfImpact(
+ const btTransform& fromA,
+ const btTransform& toA,
+ const btTransform& fromB,
+ const btTransform& toB,
+ CastResult& result);
};
-#endif //BT_GJK_CONVEX_CAST_H
+#endif //BT_GJK_CONVEX_CAST_H
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpa2.cpp b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpa2.cpp
index eefb974bbd..45d1817135 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpa2.cpp
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpa2.cpp
@@ -26,1010 +26,1065 @@ GJK-EPA collision solver by Nathanael Presson, 2008
#include "BulletCollision/CollisionShapes/btSphereShape.h"
#include "btGjkEpa2.h"
-#if defined(DEBUG) || defined (_DEBUG)
-#include <stdio.h> //for debug printf
+#if defined(DEBUG) || defined(_DEBUG)
+#include <stdio.h> //for debug printf
#ifdef __SPU__
#include <spu_printf.h>
#define printf spu_printf
-#endif //__SPU__
+#endif //__SPU__
#endif
namespace gjkepa2_impl
{
+// Config
- // Config
-
- /* GJK */
-#define GJK_MAX_ITERATIONS 128
+/* GJK */
+#define GJK_MAX_ITERATIONS 128
#ifdef BT_USE_DOUBLE_PRECISION
- #define GJK_ACCURACY ((btScalar)1e-12)
- #define GJK_MIN_DISTANCE ((btScalar)1e-12)
- #define GJK_DUPLICATED_EPS ((btScalar)1e-12)
+#define GJK_ACCURACY ((btScalar)1e-12)
+#define GJK_MIN_DISTANCE ((btScalar)1e-12)
+#define GJK_DUPLICATED_EPS ((btScalar)1e-12)
#else
- #define GJK_ACCURACY ((btScalar)0.0001)
- #define GJK_MIN_DISTANCE ((btScalar)0.0001)
- #define GJK_DUPLICATED_EPS ((btScalar)0.0001)
-#endif //BT_USE_DOUBLE_PRECISION
-
+#define GJK_ACCURACY ((btScalar)0.0001)
+#define GJK_MIN_DISTANCE ((btScalar)0.0001)
+#define GJK_DUPLICATED_EPS ((btScalar)0.0001)
+#endif //BT_USE_DOUBLE_PRECISION
-#define GJK_SIMPLEX2_EPS ((btScalar)0.0)
-#define GJK_SIMPLEX3_EPS ((btScalar)0.0)
-#define GJK_SIMPLEX4_EPS ((btScalar)0.0)
+#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 128
-#define EPA_MAX_ITERATIONS 255
+/* EPA */
+#define EPA_MAX_VERTICES 128
+#define EPA_MAX_ITERATIONS 255
#ifdef BT_USE_DOUBLE_PRECISION
- #define EPA_ACCURACY ((btScalar)1e-12)
- #define EPA_PLANE_EPS ((btScalar)1e-14)
- #define EPA_INSIDE_EPS ((btScalar)1e-9)
+#define EPA_ACCURACY ((btScalar)1e-12)
+#define EPA_PLANE_EPS ((btScalar)1e-14)
+#define EPA_INSIDE_EPS ((btScalar)1e-9)
#else
- #define EPA_ACCURACY ((btScalar)0.0001)
- #define EPA_PLANE_EPS ((btScalar)0.00001)
- #define EPA_INSIDE_EPS ((btScalar)0.01)
+#define EPA_ACCURACY ((btScalar)0.0001)
+#define EPA_PLANE_EPS ((btScalar)0.00001)
+#define EPA_INSIDE_EPS ((btScalar)0.01)
#endif
-#define EPA_FALLBACK (10*EPA_ACCURACY)
-#define EPA_MAX_FACES (EPA_MAX_VERTICES*2)
-
+#define EPA_FALLBACK (10 * EPA_ACCURACY)
+#define EPA_MAX_FACES (EPA_MAX_VERTICES * 2)
- // Shorthands
- typedef unsigned int U;
- typedef unsigned char U1;
+// Shorthands
+typedef unsigned int U;
+typedef unsigned char U1;
- // MinkowskiDiff
- struct MinkowskiDiff
- {
- const btConvexShape* m_shapes[2];
- btMatrix3x3 m_toshape1;
- btTransform m_toshape0;
+// MinkowskiDiff
+struct MinkowskiDiff
+{
+ const btConvexShape* m_shapes[2];
+ btMatrix3x3 m_toshape1;
+ btTransform m_toshape0;
#ifdef __SPU__
- bool m_enableMargin;
+ bool m_enableMargin;
#else
- btVector3 (btConvexShape::*Ls)(const btVector3&) const;
-#endif//__SPU__
-
+ btVector3 (btConvexShape::*Ls)(const btVector3&) const;
+#endif //__SPU__
- MinkowskiDiff()
- {
-
- }
+ MinkowskiDiff()
+ {
+ }
#ifdef __SPU__
- void EnableMargin(bool enable)
- {
- m_enableMargin = enable;
- }
- inline btVector3 Support0(const btVector3& d) const
- {
- if (m_enableMargin)
- {
- return m_shapes[0]->localGetSupportVertexNonVirtual(d);
- } else
- {
- return m_shapes[0]->localGetSupportVertexWithoutMarginNonVirtual(d);
- }
- }
- inline btVector3 Support1(const btVector3& d) const
- {
- if (m_enableMargin)
- {
- return m_toshape0*(m_shapes[1]->localGetSupportVertexNonVirtual(m_toshape1*d));
- } else
- {
- return m_toshape0*(m_shapes[1]->localGetSupportVertexWithoutMarginNonVirtual(m_toshape1*d));
- }
- }
-#else
- void EnableMargin(bool enable)
- {
- if(enable)
- Ls=&btConvexShape::localGetSupportVertexNonVirtual;
- else
- Ls=&btConvexShape::localGetSupportVertexWithoutMarginNonVirtual;
- }
- inline btVector3 Support0(const btVector3& d) const
+ void EnableMargin(bool enable)
+ {
+ m_enableMargin = enable;
+ }
+ inline btVector3 Support0(const btVector3& d) const
+ {
+ if (m_enableMargin)
{
- return(((m_shapes[0])->*(Ls))(d));
+ return m_shapes[0]->localGetSupportVertexNonVirtual(d);
}
- inline btVector3 Support1(const btVector3& d) const
+ else
{
- return(m_toshape0*((m_shapes[1])->*(Ls))(m_toshape1*d));
+ return m_shapes[0]->localGetSupportVertexWithoutMarginNonVirtual(d);
}
-#endif //__SPU__
-
- inline btVector3 Support(const btVector3& d) const
+ }
+ inline btVector3 Support1(const btVector3& d) const
+ {
+ if (m_enableMargin)
{
- return(Support0(d)-Support1(-d));
+ return m_toshape0 * (m_shapes[1]->localGetSupportVertexNonVirtual(m_toshape1 * d));
}
- btVector3 Support(const btVector3& d,U index) const
+ else
{
- if(index)
- return(Support1(d));
- else
- return(Support0(d));
+ return m_toshape0 * (m_shapes[1]->localGetSupportVertexWithoutMarginNonVirtual(m_toshape1 * d));
}
- };
+ }
+#else
+ void EnableMargin(bool enable)
+ {
+ if (enable)
+ Ls = &btConvexShape::localGetSupportVertexNonVirtual;
+ else
+ Ls = &btConvexShape::localGetSupportVertexWithoutMarginNonVirtual;
+ }
+ inline btVector3 Support0(const btVector3& d) const
+ {
+ return (((m_shapes[0])->*(Ls))(d));
+ }
+ inline btVector3 Support1(const btVector3& d) const
+ {
+ return (m_toshape0 * ((m_shapes[1])->*(Ls))(m_toshape1 * d));
+ }
+#endif //__SPU__
- typedef MinkowskiDiff tShape;
+ 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));
+ }
+};
+typedef MinkowskiDiff tShape;
- // GJK
- struct GJK
+// GJK
+struct GJK
+{
+ /* Types */
+ struct sSV
{
- /* Types */
- struct sSV
- {
- btVector3 d,w;
- };
- struct sSimplex
+ btVector3 d, w;
+ };
+ struct sSimplex
+ {
+ sSV* c[4];
+ btScalar p[4];
+ U rank;
+ };
+ struct eStatus
+ {
+ enum _
{
- sSV* c[4];
- btScalar p[4];
- U rank;
- };
- struct eStatus { enum _ {
Valid,
Inside,
- Failed };};
- /* Fields */
- tShape 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;
- eStatus::_ m_status;
- /* Methods */
- GJK()
- {
- Initialize();
+ Failed
+ };
+ };
+ /* Fields */
+ tShape 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;
+ eStatus::_ m_status;
+ /* Methods */
+ GJK()
+ {
+ Initialize();
+ }
+ void Initialize()
+ {
+ m_ray = btVector3(0, 0, 0);
+ m_nfree = 0;
+ m_status = eStatus::Failed;
+ m_current = 0;
+ m_distance = 0;
+ }
+ eStatus::_ Evaluate(const tShape& 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 = eStatus::Valid;
+ 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 = eStatus::Inside;
+ break;
}
- void Initialize()
+ /* 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)
{
- m_ray = btVector3(0,0,0);
- m_nfree = 0;
- m_status = eStatus::Failed;
- m_current = 0;
- m_distance = 0;
+ 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_ACCURACY * rl)) <= 0)
+ { /* Return old simplex */
+ removevertice(m_simplices[m_current]);
+ break;
}
- eStatus::_ Evaluate(const tShape& shapearg,const btVector3& guess)
+ /* Reduce simplex */
+ btScalar weights[4];
+ U mask = 0;
+ switch (cs.rank)
{
- 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 = eStatus::Valid;
- 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=eStatus::Inside;
- 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)
+ 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))
{
- if((w-lastw[i]).length2()<GJK_DUPLICATED_EPS)
- { found=true;break; }
- }
- if(found)
- {/* Return old simplex */
- removevertice(m_simplices[m_current]);
- break;
+ ns.c[ns.rank] = cs.c[i];
+ ns.p[ns.rank++] = weights[i];
+ m_ray += cs.c[i]->w * weights[i];
}
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_ACCURACY*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=eStatus::Inside;
+ m_free[m_nfree++] = cs.c[i];
}
- else
- {/* Return old simplex */
- removevertice(m_simplices[m_current]);
- break;
- }
- m_status=((++iterations)<GJK_MAX_ITERATIONS)?m_status:eStatus::Failed;
- } while(m_status==eStatus::Valid);
- m_simplex=&m_simplices[m_current];
- switch(m_status)
+ }
+ if (mask == 15) m_status = eStatus::Inside;
+ }
+ else
+ { /* Return old simplex */
+ removevertice(m_simplices[m_current]);
+ break;
+ }
+ m_status = ((++iterations) < GJK_MAX_ITERATIONS) ? m_status : eStatus::Failed;
+ } while (m_status == eStatus::Valid);
+ m_simplex = &m_simplices[m_current];
+ switch (m_status)
+ {
+ case eStatus::Valid:
+ m_distance = m_ray.length();
+ break;
+ case eStatus::Inside:
+ m_distance = 0;
+ break;
+ default:
+ {
+ }
+ }
+ return (m_status);
+ }
+ bool EncloseOrigin()
+ {
+ switch (m_simplex->rank)
+ {
+ case 1:
+ {
+ for (U i = 0; i < 3; ++i)
{
- case eStatus::Valid: m_distance=m_ray.length();break;
- case eStatus::Inside: m_distance=0;break;
- default:
- {
- }
- }
- return(m_status);
+ 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);
+ }
}
- bool EncloseOrigin()
+ break;
+ case 2:
{
- switch(m_simplex->rank)
+ const btVector3 d = m_simplex->c[1]->w - m_simplex->c[0]->w;
+ for (U i = 0; i < 3; ++i)
{
- 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:
+ btVector3 axis = btVector3(0, 0, 0);
+ axis[i] = 1;
+ const btVector3 p = btCross(d, axis);
+ if (p.length2() > 0)
{
- 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);
+ appendvertice(*m_simplex, p);
+ if (EncloseOrigin()) return (true);
+ removevertice(*m_simplex);
+ appendvertice(*m_simplex, -p);
+ if (EncloseOrigin()) return (true);
+ removevertice(*m_simplex);
}
- break;
}
- return(false);
}
- /* Internals */
- void getsupport(const btVector3& d,sSV& sv) const
+ break;
+ case 3:
{
- sv.d = d/d.length();
- sv.w = m_shape.Support(sv.d);
+ 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);
+ }
}
- void removevertice(sSimplex& simplex)
+ break;
+ case 4:
{
- m_free[m_nfree++]=simplex.c[--simplex.rank];
+ 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);
}
- void appendvertice(sSimplex& simplex,const btVector3& v)
+ 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)
{
- simplex.p[simplex.rank]=0;
- simplex.c[simplex.rank]=m_free[--m_nfree];
- getsupport(v,*simplex.c[simplex.rank++]);
+ w[0] = 0;
+ w[1] = 1;
+ m = 2;
+ return (b.length2());
}
- static btScalar det(const btVector3& a,const btVector3& b,const btVector3& c)
+ else if (t <= 0)
{
- 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());
+ w[0] = 1;
+ w[1] = 0;
+ m = 1;
+ return (a.length2());
}
- static btScalar projectorigin( const btVector3& a,
- const btVector3& b,
- btScalar* w,U& m)
+ else
{
- 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);
+ w[0] = 1 - (w[1] = t);
+ m = 3;
+ return ((a + d * t).length2());
}
- static btScalar projectorigin( const btVector3& a,
- const btVector3& b,
- const btVector3& c,
- btScalar* w,U& m)
+ }
+ 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)
{
- 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)
+ if (btDot(*vt[i], btCross(dl[i], n)) > 0)
{
- btScalar mindist=-1;
- btScalar subw[2]={0.f,0.f};
- U subm(0);
- for(U i=0;i<3;++i)
+ const U j = imd3[i];
+ const btScalar subd(projectorigin(*vt[i], *vt[j], subw, subm));
+ if ((mindist < 0) || (subd < mindist))
{
- 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<U>(((subm&1)?1<<i:0)+((subm&2)?1<<j:0));
- w[i] = subw[0];
- w[j] = subw[1];
- w[imd3[j]] = 0;
- }
- }
+ mindist = subd;
+ m = static_cast<U>(((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)
+ if (mindist < 0)
{
- 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))
+ 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)
{
- 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<U>((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)
+ const btScalar subd = projectorigin(*vt[i], *vt[j], d, subw, subm);
+ if ((mindist < 0) || (subd < mindist))
{
- 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]);
+ mindist = subd;
+ m = static_cast<U>((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];
}
- return(mindist);
}
- return(-1);
}
- };
+ 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);
+ }
+};
- // EPA
- struct EPA
+// EPA
+struct EPA
+{
+ /* Types */
+ typedef GJK::sSV sSV;
+ struct sFace
{
- /* Types */
- typedef GJK::sSV sSV;
- struct sFace
- {
- btVector3 n;
- btScalar d;
- 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
+ btVector3 n;
+ btScalar d;
+ 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) {}
+ };
+ struct eStatus
+ {
+ enum _
{
- sFace* cf;
- sFace* ff;
- U nf;
- sHorizon() : cf(0),ff(0),nf(0) {}
- };
- struct eStatus { enum _ {
Valid,
Touching,
Degenerated,
NonConvex,
- InvalidHull,
+ InvalidHull,
OutOfFaces,
OutOfVertices,
AccuraryReached,
FallBack,
- Failed };};
- /* Fields */
- eStatus::_ m_status;
- GJK::sSimplex m_result;
- btVector3 m_normal;
- btScalar m_depth;
- 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();
- }
+ Failed
+ };
+ };
+ /* Fields */
+ eStatus::_ m_status;
+ GJK::sSimplex m_result;
+ btVector3 m_normal;
+ btScalar m_depth;
+ 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;
+ }
- 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)
+ void Initialize()
+ {
+ m_status = eStatus::Failed;
+ 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]);
+ }
+ }
+ eStatus::_ Evaluate(GJK& gjk, const btVector3& guess)
+ {
+ GJK::sSimplex& simplex = *gjk.m_simplex;
+ if ((simplex.rank > 1) && gjk.EncloseOrigin())
+ {
+ /* Clean up */
+ while (m_hull.root)
{
- face->l[0] = 0;
- face->l[1] = list.root;
- if(list.root) list.root->l[0]=face;
- list.root = face;
- ++list.count;
+ sFace* f = m_hull.root;
+ remove(m_hull, f);
+ append(m_stock, f);
}
- static inline void remove(sList& list,sFace* face)
+ m_status = eStatus::Valid;
+ 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)
{
- 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;
+ btSwap(simplex.c[0], simplex.c[1]);
+ btSwap(simplex.p[0], simplex.p[1]);
}
-
-
- void Initialize()
+ /* 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)
{
- m_status = eStatus::Failed;
- m_normal = btVector3(0,0,0);
- m_depth = 0;
- m_nextsv = 0;
- for(U i=0;i<EPA_MAX_FACES;++i)
+ 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 = eStatus::Valid;
+ for (; iterations < EPA_MAX_ITERATIONS; ++iterations)
{
- append(m_stock,&m_fc_store[EPA_MAX_FACES-i-1]);
- }
- }
- eStatus::_ Evaluate(GJK& gjk,const btVector3& guess)
- {
- 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 = eStatus::Valid;
- 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)
+ if (m_nextsv < EPA_MAX_VERTICES)
{
- 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=eStatus::Valid;
- for(;iterations<EPA_MAX_ITERATIONS;++iterations)
+ sHorizon horizon;
+ 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)
{
- if(m_nextsv<EPA_MAX_VERTICES)
- {
- sHorizon horizon;
- 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=eStatus::InvalidHull;break; }
- } else { m_status=eStatus::AccuraryReached;break; }
- } else { m_status=eStatus::OutOfVertices;break; }
+ 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 = eStatus::InvalidHull;
+ break;
+ }
+ }
+ else
+ {
+ m_status = eStatus::AccuraryReached;
+ 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 = eStatus::FallBack;
- 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, sSV* a, 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));
+ m_status = eStatus::OutOfVertices;
+ break;
}
-
- return true;
}
+ 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 = eStatus::FallBack;
+ 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, sSV* a, 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
- return false;
+ 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();
}
- sFace* newface(sSV* a,sSV* b,sSV* c,bool forced)
+ else if (b_dot_ba < 0)
{
- 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;
+ // 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));
+ }
- 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;
- }
+ return true;
+ }
- face->n /= l;
- if(forced || (face->d >= -EPA_PLANE_EPS))
- {
- return face;
- }
- else
- m_status=eStatus::NonConvex;
- }
- else
- m_status=eStatus::Degenerated;
+ return false;
+ }
+ sFace* newface(sSV* a, sSV* b, 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;
- remove(m_hull, face);
- append(m_stock, face);
- return 0;
+ 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;
}
- m_status = m_stock.root ? eStatus::OutOfVertices : eStatus::OutOfFaces;
- return 0;
+ else
+ m_status = eStatus::NonConvex;
+ }
+ else
+ m_status = eStatus::Degenerated;
+
+ remove(m_hull, face);
+ append(m_stock, face);
+ return 0;
+ }
+ m_status = m_stock.root ? eStatus::OutOfVertices : eStatus::OutOfFaces;
+ 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;
}
- sFace* findbest()
+ }
+ return (minf);
+ }
+ bool expand(U pass, 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* minf=m_hull.root;
- btScalar mind=minf->d*minf->d;
- for(sFace* f=minf->l[1];f;f=f->l[1])
+ sFace* nf = newface(f->c[e1], f->c[e], w, false);
+ if (nf)
{
- const btScalar sqd=f->d*f->d;
- if(sqd<mind)
- {
- minf=f;
- mind=sqd;
- }
+ 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);
}
- return(minf);
}
- bool expand(U pass,sSV* w,sFace* f,U e,sHorizon& horizon)
+ else
{
- static const U i1m3[]={1,2,0};
- static const U i2m3[]={2,0,1};
- if(f->pass!=pass)
+ 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))
{
- 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);
- }
- }
+ remove(m_hull, f);
+ append(m_stock, f);
+ return (true);
}
- return(false);
}
-
- };
-
- //
- static void Initialize( const btConvexShape* shape0,const btTransform& wtrs0,
- const btConvexShape* shape1,const btTransform& wtrs1,
- btGjkEpaSolver2::sResults& results,
- tShape& shape,
- bool withmargins)
- {
- /* Results */
- results.witnesses[0] =
- results.witnesses[1] = btVector3(0,0,0);
- results.status = btGjkEpaSolver2::sResults::Separated;
- /* Shape */
- shape.m_shapes[0] = shape0;
- shape.m_shapes[1] = shape1;
- shape.m_toshape1 = wtrs1.getBasis().transposeTimes(wtrs0.getBasis());
- shape.m_toshape0 = wtrs0.inverseTimes(wtrs1);
- shape.EnableMargin(withmargins);
+ }
+ return (false);
}
+};
+//
+static void Initialize(const btConvexShape* shape0, const btTransform& wtrs0,
+ const btConvexShape* shape1, const btTransform& wtrs1,
+ btGjkEpaSolver2::sResults& results,
+ tShape& shape,
+ bool withmargins)
+{
+ /* Results */
+ results.witnesses[0] =
+ results.witnesses[1] = btVector3(0, 0, 0);
+ results.status = btGjkEpaSolver2::sResults::Separated;
+ /* Shape */
+ shape.m_shapes[0] = shape0;
+ shape.m_shapes[1] = shape1;
+ shape.m_toshape1 = wtrs1.getBasis().transposeTimes(wtrs0.getBasis());
+ shape.m_toshape0 = wtrs0.inverseTimes(wtrs1);
+ shape.EnableMargin(withmargins);
}
+} // namespace gjkepa2_impl
+
//
// Api
//
-using namespace gjkepa2_impl;
+using namespace gjkepa2_impl;
//
-int btGjkEpaSolver2::StackSizeRequirement()
+int btGjkEpaSolver2::StackSizeRequirement()
{
- return(sizeof(GJK)+sizeof(EPA));
+ return (sizeof(GJK) + sizeof(EPA));
}
//
-bool btGjkEpaSolver2::Distance( const btConvexShape* shape0,
- const btTransform& wtrs0,
- const btConvexShape* shape1,
- const btTransform& wtrs1,
- const btVector3& guess,
- sResults& results)
+bool btGjkEpaSolver2::Distance(const btConvexShape* shape0,
+ const btTransform& wtrs0,
+ const btConvexShape* shape1,
+ const btTransform& wtrs1,
+ const btVector3& guess,
+ sResults& results)
{
- tShape shape;
- Initialize(shape0,wtrs0,shape1,wtrs1,results,shape,false);
- GJK gjk;
- GJK::eStatus::_ gjk_status=gjk.Evaluate(shape,guess);
- if(gjk_status==GJK::eStatus::Valid)
+ tShape shape;
+ Initialize(shape0, wtrs0, shape1, wtrs1, results, shape, false);
+ GJK gjk;
+ GJK::eStatus::_ gjk_status = gjk.Evaluate(shape, guess);
+ if (gjk_status == GJK::eStatus::Valid)
{
- btVector3 w0=btVector3(0,0,0);
- btVector3 w1=btVector3(0,0,0);
- for(U i=0;i<gjk.m_simplex->rank;++i)
+ 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;
+ 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] = wtrs0*w0;
- results.witnesses[1] = wtrs0*w1;
- results.normal = w0-w1;
- results.distance = results.normal.length();
- results.normal /= results.distance>GJK_MIN_DISTANCE?results.distance:1;
- return(true);
+ results.witnesses[0] = wtrs0 * w0;
+ results.witnesses[1] = wtrs0 * 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==GJK::eStatus::Inside?
- sResults::Penetrating :
- sResults::GJK_Failed ;
- return(false);
+ results.status = gjk_status == GJK::eStatus::Inside ? sResults::Penetrating : sResults::GJK_Failed;
+ return (false);
}
}
//
-bool btGjkEpaSolver2::Penetration( const btConvexShape* shape0,
- const btTransform& wtrs0,
- const btConvexShape* shape1,
- const btTransform& wtrs1,
- const btVector3& guess,
- sResults& results,
- bool usemargins)
+bool btGjkEpaSolver2::Penetration(const btConvexShape* shape0,
+ const btTransform& wtrs0,
+ const btConvexShape* shape1,
+ const btTransform& wtrs1,
+ const btVector3& guess,
+ sResults& results,
+ bool usemargins)
{
- tShape shape;
- Initialize(shape0,wtrs0,shape1,wtrs1,results,shape,usemargins);
- GJK gjk;
- GJK::eStatus::_ gjk_status=gjk.Evaluate(shape,-guess);
- switch(gjk_status)
+ tShape shape;
+ Initialize(shape0, wtrs0, shape1, wtrs1, results, shape, usemargins);
+ GJK gjk;
+ GJK::eStatus::_ gjk_status = gjk.Evaluate(shape, -guess);
+ switch (gjk_status)
{
- case GJK::eStatus::Inside:
+ case GJK::eStatus::Inside:
{
- EPA epa;
- EPA::eStatus::_ epa_status=epa.Evaluate(gjk,-guess);
- if(epa_status!=EPA::eStatus::Failed)
+ EPA epa;
+ EPA::eStatus::_ epa_status = epa.Evaluate(gjk, -guess);
+ if (epa_status != EPA::eStatus::Failed)
{
- btVector3 w0=btVector3(0,0,0);
- for(U i=0;i<epa.m_result.rank;++i)
+ 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];
+ w0 += shape.Support(epa.m_result.c[i]->d, 0) * epa.m_result.p[i];
}
- results.status = sResults::Penetrating;
- results.witnesses[0] = wtrs0*w0;
- results.witnesses[1] = wtrs0*(w0-epa.m_normal*epa.m_depth);
- results.normal = -epa.m_normal;
- results.distance = -epa.m_depth;
- return(true);
- } else results.status=sResults::EPA_Failed;
+ results.status = sResults::Penetrating;
+ results.witnesses[0] = wtrs0 * w0;
+ results.witnesses[1] = wtrs0 * (w0 - epa.m_normal * epa.m_depth);
+ results.normal = -epa.m_normal;
+ results.distance = -epa.m_depth;
+ return (true);
+ }
+ else
+ results.status = sResults::EPA_Failed;
}
break;
- case GJK::eStatus::Failed:
- results.status=sResults::GJK_Failed;
- break;
+ case GJK::eStatus::Failed:
+ results.status = sResults::GJK_Failed;
+ break;
default:
- {
- }
+ {
+ }
}
- return(false);
+ return (false);
}
#ifndef __SPU__
//
-btScalar btGjkEpaSolver2::SignedDistance(const btVector3& position,
- btScalar margin,
- const btConvexShape* shape0,
- const btTransform& wtrs0,
- sResults& results)
+btScalar btGjkEpaSolver2::SignedDistance(const btVector3& position,
+ btScalar margin,
+ const btConvexShape* shape0,
+ const btTransform& wtrs0,
+ sResults& results)
{
- tShape shape;
- btSphereShape shape1(margin);
- btTransform wtrs1(btQuaternion(0,0,0,1),position);
- Initialize(shape0,wtrs0,&shape1,wtrs1,results,shape,false);
- GJK gjk;
- GJK::eStatus::_ gjk_status=gjk.Evaluate(shape,btVector3(1,1,1));
- if(gjk_status==GJK::eStatus::Valid)
+ tShape shape;
+ btSphereShape shape1(margin);
+ btTransform wtrs1(btQuaternion(0, 0, 0, 1), position);
+ Initialize(shape0, wtrs0, &shape1, wtrs1, results, shape, false);
+ GJK gjk;
+ GJK::eStatus::_ gjk_status = gjk.Evaluate(shape, btVector3(1, 1, 1));
+ if (gjk_status == GJK::eStatus::Valid)
{
- btVector3 w0=btVector3(0,0,0);
- btVector3 w1=btVector3(0,0,0);
- for(U i=0;i<gjk.m_simplex->rank;++i)
+ 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;
+ 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] = wtrs0*w0;
- results.witnesses[1] = wtrs0*w1;
- const btVector3 delta= results.witnesses[1]-
- results.witnesses[0];
- const btScalar margin= shape0->getMarginNonVirtual()+
- shape1.getMarginNonVirtual();
- const btScalar length= delta.length();
- results.normal = delta/length;
- results.witnesses[0] += results.normal*margin;
- return(length-margin);
+ results.witnesses[0] = wtrs0 * w0;
+ results.witnesses[1] = wtrs0 * w1;
+ const btVector3 delta = results.witnesses[1] -
+ results.witnesses[0];
+ const btScalar margin = shape0->getMarginNonVirtual() +
+ shape1.getMarginNonVirtual();
+ const btScalar length = delta.length();
+ results.normal = delta / length;
+ results.witnesses[0] += results.normal * margin;
+ return (length - margin);
}
else
{
- if(gjk_status==GJK::eStatus::Inside)
+ if (gjk_status == GJK::eStatus::Inside)
{
- if(Penetration(shape0,wtrs0,&shape1,wtrs1,gjk.m_ray,results))
+ if (Penetration(shape0, wtrs0, &shape1, wtrs1, gjk.m_ray, results))
{
- const btVector3 delta= results.witnesses[0]-
- results.witnesses[1];
- const btScalar length= delta.length();
+ const btVector3 delta = results.witnesses[0] -
+ results.witnesses[1];
+ const btScalar length = delta.length();
if (length >= SIMD_EPSILON)
- results.normal = delta/length;
- return(-length);
+ results.normal = delta / length;
+ return (-length);
}
- }
+ }
}
- return(SIMD_INFINITY);
+ return (SIMD_INFINITY);
}
//
-bool btGjkEpaSolver2::SignedDistance(const btConvexShape* shape0,
- const btTransform& wtrs0,
- const btConvexShape* shape1,
- const btTransform& wtrs1,
- const btVector3& guess,
- sResults& results)
+bool btGjkEpaSolver2::SignedDistance(const btConvexShape* shape0,
+ const btTransform& wtrs0,
+ const btConvexShape* shape1,
+ const btTransform& wtrs1,
+ const btVector3& guess,
+ sResults& results)
{
- if(!Distance(shape0,wtrs0,shape1,wtrs1,guess,results))
- return(Penetration(shape0,wtrs0,shape1,wtrs1,guess,results,false));
+ if (!Distance(shape0, wtrs0, shape1, wtrs1, guess, results))
+ return (Penetration(shape0, wtrs0, shape1, wtrs1, guess, results, false));
else
- return(true);
+ return (true);
}
-#endif //__SPU__
+#endif //__SPU__
-/* Symbols cleanup */
+/* Symbols cleanup */
#undef GJK_MAX_ITERATIONS
#undef GJK_ACCURACY
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpa2.h b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpa2.h
index ac501d5ecf..893daea3f5 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpa2.h
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpa2.h
@@ -28,48 +28,46 @@ GJK-EPA collision solver by Nathanael Presson, 2008
#include "BulletCollision/CollisionShapes/btConvexShape.h"
///btGjkEpaSolver contributed under zlib by Nathanael Presson
-struct btGjkEpaSolver2
+struct btGjkEpaSolver2
{
-struct sResults
+ struct sResults
{
- enum eStatus
+ 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;
+ 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 int StackSizeRequirement();
-static bool Distance( const btConvexShape* shape0,const btTransform& wtrs0,
- const btConvexShape* shape1,const btTransform& wtrs1,
- const btVector3& guess,
- sResults& results);
+ 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,
+ static bool Penetration(const btConvexShape* shape0, const btTransform& wtrs0,
+ const btConvexShape* shape1, const btTransform& wtrs1,
const btVector3& guess,
sResults& results,
- bool usemargins=true);
+ 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__
+ 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
-
+#endif //BT_GJK_EPA2_H
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpa3.h b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpa3.h
index ce1f24bc50..6fedbbb3e5 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpa3.h
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpa3.h
@@ -29,915 +29,946 @@ Improvements and refactoring by Erwin Coumans, 2008-2014
#include "LinearMath/btTransform.h"
#include "btGjkCollisionDescription.h"
-
-
-struct btGjkEpaSolver3
+struct btGjkEpaSolver3
{
-struct sResults
+ struct sResults
{
- enum eStatus
+ 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;
+ 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 <stdio.h> //for debug printf
+#if defined(DEBUG) || defined(_DEBUG)
+#include <stdio.h> //for debug printf
#ifdef __SPU__
#include <spu_printf.h>
#define printf spu_printf
-#endif //__SPU__
+#endif //__SPU__
#endif
+// Config
-
- // 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 <typename btConvexTemplate>
- 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
+/* 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 <typename btConvexTemplate>
+struct MinkowskiDiff
{
- eGjkValid,
- eGjkInside,
- eGjkFailed
+ 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));
+ }
};
- // GJK
- template <typename btConvexTemplate>
- struct GJK
- {
- /* Types */
- struct sSV
- {
- btVector3 d,w;
- };
- struct sSimplex
- {
- sSV* c[4];
- btScalar p[4];
- U rank;
- };
-
- /* Fields */
-
- MinkowskiDiff<btConvexTemplate> 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<btConvexTemplate>& 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<U>(((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<U>((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 eGjkStatus
+{
+ eGjkValid,
+ eGjkInside,
+ eGjkFailed
+};
+
+// GJK
+template <typename btConvexTemplate>
+struct GJK
+{
+ /* Types */
+ struct sSV
+ {
+ btVector3 d, w;
+ };
+ struct sSimplex
+ {
+ sSV* c[4];
+ btScalar p[4];
+ U rank;
+ };
+
+ /* Fields */
+ MinkowskiDiff<btConvexTemplate> 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<btConvexTemplate>& 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<U>(((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<U>((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
+enum eEpaStatus
{
- eEpaValid,
- eEpaTouching,
- eEpaDegenerated,
- eEpaNonConvex,
- eEpaInvalidHull,
- eEpaOutOfFaces,
- eEpaOutOfVertices,
- eEpaAccuraryReached,
- eEpaFallBack,
- eEpaFailed
+ eEpaValid,
+ eEpaTouching,
+ eEpaDegenerated,
+ eEpaNonConvex,
+ eEpaInvalidHull,
+ eEpaOutOfFaces,
+ eEpaOutOfVertices,
+ eEpaAccuraryReached,
+ eEpaFallBack,
+ eEpaFailed
};
+// EPA
+template <typename btConvexTemplate>
+struct EPA
+{
+ /* Types */
+
+ struct sFace
+ {
+ btVector3 n;
+ btScalar d;
+ typename GJK<btConvexTemplate>::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<btConvexTemplate>::sSimplex m_result;
+ btVector3 m_normal;
+ btScalar m_depth;
+ typename GJK<btConvexTemplate>::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<btConvexTemplate>& gjk, const btVector3& guess)
+ {
+ typename GJK<btConvexTemplate>::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<btConvexTemplate>::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<btConvexTemplate>::sSV* a, typename GJK<btConvexTemplate>::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<btConvexTemplate>::sSV* a, typename GJK<btConvexTemplate>::sSV* b, typename GJK<btConvexTemplate>::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<btConvexTemplate>::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);
+ }
+};
- // EPA
template <typename btConvexTemplate>
- struct EPA
- {
- /* Types */
-
- struct sFace
- {
- btVector3 n;
- btScalar d;
- typename GJK<btConvexTemplate>::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<btConvexTemplate>::sSimplex m_result;
- btVector3 m_normal;
- btScalar m_depth;
- typename GJK<btConvexTemplate>::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<btConvexTemplate>& gjk,const btVector3& guess)
- {
- typename GJK<btConvexTemplate>::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<btConvexTemplate>::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<btConvexTemplate>::sSV* a, typename GJK<btConvexTemplate>::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<btConvexTemplate>::sSV* a,typename GJK<btConvexTemplate>::sSV* b,typename GJK<btConvexTemplate>::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<btConvexTemplate>::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 <typename btConvexTemplate>
- static void Initialize( const btConvexTemplate& a, const btConvexTemplate& b,
- btGjkEpaSolver3::sResults& results,
- MinkowskiDiff<btConvexTemplate>& 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());
-
- }
-
+static void Initialize(const btConvexTemplate& a, const btConvexTemplate& b,
+ btGjkEpaSolver3::sResults& results,
+ MinkowskiDiff<btConvexTemplate>& 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 <typename btConvexTemplate>
-bool btGjkEpaSolver3_Distance(const btConvexTemplate& a, const btConvexTemplate& b,
- const btVector3& guess,
- btGjkEpaSolver3::sResults& results)
+bool btGjkEpaSolver3_Distance(const btConvexTemplate& a, const btConvexTemplate& b,
+ const btVector3& guess,
+ btGjkEpaSolver3::sResults& results)
{
- MinkowskiDiff<btConvexTemplate> shape(a,b);
- Initialize(a,b,results,shape);
- GJK<btConvexTemplate> 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);
- }
+ MinkowskiDiff<btConvexTemplate> shape(a, b);
+ Initialize(a, b, results, shape);
+ GJK<btConvexTemplate> 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 <typename btConvexTemplate>
-bool btGjkEpaSolver3_Penetration(const btConvexTemplate& a,
- const btConvexTemplate& b,
- const btVector3& guess,
- btGjkEpaSolver3::sResults& results)
+bool btGjkEpaSolver3_Penetration(const btConvexTemplate& a,
+ const btConvexTemplate& b,
+ const btVector3& guess,
+ btGjkEpaSolver3::sResults& results)
{
- MinkowskiDiff<btConvexTemplate> shape(a,b);
- Initialize(a,b,results,shape);
- GJK<btConvexTemplate> gjk(a,b);
- eGjkStatus gjk_status=gjk.Evaluate(shape,-guess);
- switch(gjk_status)
- {
- case eGjkInside:
- {
- EPA<btConvexTemplate> 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);
+ MinkowskiDiff<btConvexTemplate> shape(a, b);
+ Initialize(a, b, results, shape);
+ GJK<btConvexTemplate> gjk(a, b);
+ eGjkStatus gjk_status = gjk.Evaluate(shape, -guess);
+ switch (gjk_status)
+ {
+ case eGjkInside:
+ {
+ EPA<btConvexTemplate> 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
@@ -990,28 +1021,28 @@ int btComputeGjkEpaPenetration2(const btCollisionDescription& colDesc, btDistanc
#endif
template <typename btConvexTemplate, typename btDistanceInfoTemplate>
-int btComputeGjkDistance(const btConvexTemplate& a, const btConvexTemplate& b,
- const btGjkCollisionDescription& colDesc, btDistanceInfoTemplate* distInfo)
+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;
+ 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 */
+/* Symbols cleanup */
#undef GJK_MAX_ITERATIONS
#undef GJK_ACCURARY
@@ -1029,7 +1060,4 @@ int btComputeGjkDistance(const btConvexTemplate& a, const btConvexTemplate& b,
#undef EPA_PLANE_EPS
#undef EPA_INSIDE_EPS
-
-
-#endif //BT_GJK_EPA3_H
-
+#endif //BT_GJK_EPA3_H
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.cpp b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.cpp
index b79f49d611..07629229ab 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.cpp
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.cpp
@@ -18,23 +18,21 @@ subject to the following restrictions:
#include "BulletCollision/CollisionShapes/btConvexShape.h"
#include "btGjkEpaPenetrationDepthSolver.h"
-
#include "BulletCollision/NarrowPhaseCollision/btGjkEpa2.h"
bool btGjkEpaPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& simplexSolver,
- const btConvexShape* pConvexA, const btConvexShape* pConvexB,
- const btTransform& transformA, const btTransform& transformB,
- btVector3& v, btVector3& wWitnessOnA, btVector3& wWitnessOnB,
- class btIDebugDraw* debugDraw)
+ const btConvexShape* pConvexA, const btConvexShape* pConvexB,
+ const btTransform& transformA, const btTransform& transformB,
+ btVector3& v, btVector3& wWitnessOnA, btVector3& wWitnessOnB,
+ class btIDebugDraw* debugDraw)
{
-
(void)debugDraw;
(void)v;
(void)simplexSolver;
btVector3 guessVectors[] = {
- btVector3(transformB.getOrigin() - transformA.getOrigin()).normalized(),
- btVector3(transformA.getOrigin() - transformB.getOrigin()).normalized(),
+ btVector3(transformB.getOrigin() - transformA.getOrigin()).safeNormalize(),
+ btVector3(transformA.getOrigin() - transformB.getOrigin()).safeNormalize(),
btVector3(0, 0, 1),
btVector3(0, 1, 0),
btVector3(1, 0, 0),
@@ -49,13 +47,13 @@ bool btGjkEpaPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& simp
for (int i = 0; i < numVectors; i++)
{
simplexSolver.reset();
- btVector3 guessVector = guessVectors[i];
+ btVector3 guessVector = guessVectors[i];
- btGjkEpaSolver2::sResults results;
+ btGjkEpaSolver2::sResults results;
if (btGjkEpaSolver2::Penetration(pConvexA, transformA,
- pConvexB, transformB,
- guessVector, results))
+ pConvexB, transformB,
+ guessVector, results))
{
wWitnessOnA = results.witnesses[0];
@@ -81,4 +79,3 @@ bool btGjkEpaPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& simp
v.setValue(0, 0, 0);
return false;
}
-
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h
index 1ed6340af3..92d6df1729 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h
@@ -23,21 +23,18 @@ subject to the following restrictions:
///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 :
-
+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
-
+#endif // BT_GJP_EPA_PENETRATION_DEPTH_H
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp
index a0b825f0e8..803f6e0671 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp
@@ -18,75 +18,69 @@ subject to the following restrictions:
#include "BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h"
#include "BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h"
-
-
-#if defined(DEBUG) || defined (_DEBUG)
+#if defined(DEBUG) || defined(_DEBUG)
//#define TEST_NON_VIRTUAL 1
-#include <stdio.h> //for debug printf
+#include <stdio.h> //for debug printf
#ifdef __SPU__
#include <spu_printf.h>
#define printf spu_printf
-#endif //__SPU__
+#endif //__SPU__
#endif
//must be above the machine epsilon
-#ifdef BT_USE_DOUBLE_PRECISION
- #define REL_ERROR2 btScalar(1.0e-12)
- btScalar gGjkEpaPenetrationTolerance = 1.0e-12;
+#ifdef BT_USE_DOUBLE_PRECISION
+#define REL_ERROR2 btScalar(1.0e-12)
+btScalar gGjkEpaPenetrationTolerance = 1.0e-12;
#else
- #define REL_ERROR2 btScalar(1.0e-6)
- btScalar gGjkEpaPenetrationTolerance = 0.001;
+#define REL_ERROR2 btScalar(1.0e-6)
+btScalar gGjkEpaPenetrationTolerance = 0.001;
#endif
-//temp globals, to improve GJK/EPA/penetration calculations
-int gNumDeepPenetrationChecks = 0;
-int gNumGjkChecks = 0;
-
-
-btGjkPairDetector::btGjkPairDetector(const btConvexShape* objectA,const btConvexShape* objectB,btSimplexSolverInterface* simplexSolver,btConvexPenetrationDepthSolver* penetrationDepthSolver)
-:m_cachedSeparatingAxis(btScalar(0.),btScalar(1.),btScalar(0.)),
-m_penetrationDepthSolver(penetrationDepthSolver),
-m_simplexSolver(simplexSolver),
-m_minkowskiA(objectA),
-m_minkowskiB(objectB),
-m_shapeTypeA(objectA->getShapeType()),
-m_shapeTypeB(objectB->getShapeType()),
-m_marginA(objectA->getMargin()),
-m_marginB(objectB->getMargin()),
-m_ignoreMargin(false),
-m_lastUsedMethod(-1),
-m_catchDegeneracies(1),
-m_fixContactNormalDirection(1)
+
+btGjkPairDetector::btGjkPairDetector(const btConvexShape *objectA, const btConvexShape *objectB, btSimplexSolverInterface *simplexSolver, btConvexPenetrationDepthSolver *penetrationDepthSolver)
+ : m_cachedSeparatingAxis(btScalar(0.), btScalar(1.), btScalar(0.)),
+ m_penetrationDepthSolver(penetrationDepthSolver),
+ m_simplexSolver(simplexSolver),
+ m_minkowskiA(objectA),
+ m_minkowskiB(objectB),
+ m_shapeTypeA(objectA->getShapeType()),
+ m_shapeTypeB(objectB->getShapeType()),
+ m_marginA(objectA->getMargin()),
+ m_marginB(objectB->getMargin()),
+ m_ignoreMargin(false),
+ m_lastUsedMethod(-1),
+ m_catchDegeneracies(1),
+ m_fixContactNormalDirection(1)
{
}
-btGjkPairDetector::btGjkPairDetector(const btConvexShape* objectA,const btConvexShape* objectB,int shapeTypeA,int shapeTypeB,btScalar marginA, btScalar marginB, btSimplexSolverInterface* simplexSolver,btConvexPenetrationDepthSolver* penetrationDepthSolver)
-:m_cachedSeparatingAxis(btScalar(0.),btScalar(1.),btScalar(0.)),
-m_penetrationDepthSolver(penetrationDepthSolver),
-m_simplexSolver(simplexSolver),
-m_minkowskiA(objectA),
-m_minkowskiB(objectB),
-m_shapeTypeA(shapeTypeA),
-m_shapeTypeB(shapeTypeB),
-m_marginA(marginA),
-m_marginB(marginB),
-m_ignoreMargin(false),
-m_lastUsedMethod(-1),
-m_catchDegeneracies(1),
-m_fixContactNormalDirection(1)
+btGjkPairDetector::btGjkPairDetector(const btConvexShape *objectA, const btConvexShape *objectB, int shapeTypeA, int shapeTypeB, btScalar marginA, btScalar marginB, btSimplexSolverInterface *simplexSolver, btConvexPenetrationDepthSolver *penetrationDepthSolver)
+ : m_cachedSeparatingAxis(btScalar(0.), btScalar(1.), btScalar(0.)),
+ m_penetrationDepthSolver(penetrationDepthSolver),
+ m_simplexSolver(simplexSolver),
+ m_minkowskiA(objectA),
+ m_minkowskiB(objectB),
+ m_shapeTypeA(shapeTypeA),
+ m_shapeTypeB(shapeTypeB),
+ m_marginA(marginA),
+ m_marginB(marginB),
+ m_ignoreMargin(false),
+ m_lastUsedMethod(-1),
+ m_catchDegeneracies(1),
+ m_fixContactNormalDirection(1)
{
}
-void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result& output,class btIDebugDraw* debugDraw,bool swapResults)
+void btGjkPairDetector::getClosestPoints(const ClosestPointInput &input, Result &output, class btIDebugDraw *debugDraw, bool swapResults)
{
(void)swapResults;
- getClosestPointsNonVirtual(input,output,debugDraw);
+ getClosestPointsNonVirtual(input, output, debugDraw);
}
-static void btComputeSupport(const btConvexShape* convexA, const btTransform& localTransA, const btConvexShape* convexB, const btTransform& localTransB, const btVector3& dir, bool check2d, btVector3& supAworld, btVector3& supBworld, btVector3& aMinb)
+static void btComputeSupport(const btConvexShape *convexA, const btTransform &localTransA, const btConvexShape *convexB, const btTransform &localTransB, const btVector3 &dir, bool check2d, btVector3 &supAworld, btVector3 &supBworld, btVector3 &aMinb)
{
- btVector3 seperatingAxisInA = (dir)* localTransA.getBasis();
- btVector3 seperatingAxisInB = (-dir)* localTransB.getBasis();
+ btVector3 seperatingAxisInA = (dir)*localTransA.getBasis();
+ btVector3 seperatingAxisInB = (-dir) * localTransB.getBasis();
btVector3 pInANoMargin = convexA->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInA);
btVector3 qInBNoMargin = convexB->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInB);
@@ -106,22 +100,21 @@ static void btComputeSupport(const btConvexShape* convexA, const btTransform& lo
aMinb = supAworld - supBworld;
}
-struct btSupportVector
+struct btSupportVector
{
- btVector3 v; //!< Support point in minkowski sum
- btVector3 v1; //!< Support point in obj1
- btVector3 v2; //!< Support point in obj2
+ btVector3 v; //!< Support point in minkowski sum
+ btVector3 v1; //!< Support point in obj1
+ btVector3 v2; //!< Support point in obj2
};
-struct btSimplex
+struct btSimplex
{
btSupportVector ps[4];
- int last; //!< index of last added point
+ int last; //!< index of last added point
};
static btVector3 ccd_vec3_origin(0, 0, 0);
-
inline void btSimplexInit(btSimplex *s)
{
s->last = -1;
@@ -142,19 +135,18 @@ inline void btSupportCopy(btSupportVector *d, const btSupportVector *s)
*d = *s;
}
-inline void btVec3Copy(btVector3 *v, const btVector3* w)
+inline void btVec3Copy(btVector3 *v, const btVector3 *w)
{
*v = *w;
}
-inline void ccdVec3Add(btVector3*v, const btVector3*w)
+inline void ccdVec3Add(btVector3 *v, const btVector3 *w)
{
v->m_floats[0] += w->m_floats[0];
v->m_floats[1] += w->m_floats[1];
v->m_floats[2] += w->m_floats[2];
}
-
inline void ccdVec3Sub(btVector3 *v, const btVector3 *w)
{
*v -= *w;
@@ -162,24 +154,22 @@ inline void ccdVec3Sub(btVector3 *v, const btVector3 *w)
inline void btVec3Sub2(btVector3 *d, const btVector3 *v, const btVector3 *w)
{
*d = (*v) - (*w);
-
}
-inline btScalar btVec3Dot(const btVector3 *a, const btVector3 *b)
+inline btScalar btVec3Dot(const btVector3 *a, const btVector3 *b)
{
btScalar dot;
dot = a->dot(*b);
-
+
return dot;
}
-inline btScalar ccdVec3Dist2(const btVector3 *a, const btVector3*b)
+inline btScalar ccdVec3Dist2(const btVector3 *a, const btVector3 *b)
{
btVector3 ab;
btVec3Sub2(&ab, a, b);
return btVec3Dot(&ab, &ab);
}
-
inline void btVec3Scale(btVector3 *d, btScalar k)
{
d->m_floats[0] *= k;
@@ -195,7 +185,7 @@ inline void btVec3Cross(btVector3 *d, const btVector3 *a, const btVector3 *b)
}
inline void btTripleCross(const btVector3 *a, const btVector3 *b,
- const btVector3 *c, btVector3 *d)
+ const btVector3 *c, btVector3 *d)
{
btVector3 e;
btVec3Cross(&e, a, b);
@@ -213,36 +203,35 @@ inline int ccdEq(btScalar _a, btScalar _b)
a = btFabs(_a);
b = btFabs(_b);
- if (b > a) {
+ if (b > a)
+ {
return ab < SIMD_EPSILON * b;
}
- else {
+ else
+ {
return ab < SIMD_EPSILON * a;
}
}
-btScalar ccdVec3X(const btVector3* v)
+btScalar ccdVec3X(const btVector3 *v)
{
return v->x();
}
-btScalar ccdVec3Y(const btVector3* v)
+btScalar ccdVec3Y(const btVector3 *v)
{
return v->y();
}
-btScalar ccdVec3Z(const btVector3* v)
+btScalar ccdVec3Z(const btVector3 *v)
{
return v->z();
}
inline int btVec3Eq(const btVector3 *a, const btVector3 *b)
{
- return ccdEq(ccdVec3X(a), ccdVec3X(b))
- && ccdEq(ccdVec3Y(a), ccdVec3Y(b))
- && ccdEq(ccdVec3Z(a), ccdVec3Z(b));
+ return ccdEq(ccdVec3X(a), ccdVec3X(b)) && ccdEq(ccdVec3Y(a), ccdVec3Y(b)) && ccdEq(ccdVec3Z(a), ccdVec3Z(b));
}
-
inline void btSimplexAdd(btSimplex *s, const btSupportVector *v)
{
// here is no check on boundaries in sake of speed
@@ -250,7 +239,6 @@ inline void btSimplexAdd(btSimplex *s, const btSupportVector *v)
btSupportCopy(s->ps + s->last, v);
}
-
inline void btSimplexSet(btSimplex *s, size_t pos, const btSupportVector *a)
{
btSupportCopy(s->ps + pos, a);
@@ -268,27 +256,28 @@ inline const btSupportVector *ccdSimplexLast(const btSimplex *s)
inline int ccdSign(btScalar val)
{
- if (btFuzzyZero(val)) {
+ if (btFuzzyZero(val))
+ {
return 0;
}
- else if (val < btScalar(0)) {
+ else if (val < btScalar(0))
+ {
return -1;
}
return 1;
}
-
inline btScalar btVec3PointSegmentDist2(const btVector3 *P,
- const btVector3 *x0,
- const btVector3 *b,
- btVector3 *witness)
+ 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
@@ -310,24 +299,29 @@ inline btScalar btVec3PointSegmentDist2(const btVector3 *P,
t = -btScalar(1.) * btVec3Dot(&a, &d);
t /= btVec3Dot(&d, &d);
- if (t < btScalar(0) || btFuzzyZero(t)) {
+ if (t < btScalar(0) || btFuzzyZero(t))
+ {
dist = ccdVec3Dist2(x0, P);
if (witness)
btVec3Copy(witness, x0);
}
- else if (t > btScalar(1) || ccdEq(t, btScalar(1))) {
+ else if (t > btScalar(1) || ccdEq(t, btScalar(1)))
+ {
dist = ccdVec3Dist2(b, P);
if (witness)
btVec3Copy(witness, b);
}
- else {
- if (witness) {
+ else
+ {
+ if (witness)
+ {
btVec3Copy(witness, &d);
btVec3Scale(witness, t);
ccdVec3Add(witness, x0);
dist = ccdVec3Dist2(witness, P);
}
- else {
+ else
+ {
// recycling variables
btVec3Scale(&d, t);
ccdVec3Add(&d, &a);
@@ -338,11 +332,10 @@ inline btScalar btVec3PointSegmentDist2(const btVector3 *P,
return dist;
}
-
btScalar btVec3PointTriDist2(const btVector3 *P,
- const btVector3 *x0, const btVector3 *B,
- const btVector3 *C,
- btVector3 *witness)
+ 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
@@ -372,13 +365,9 @@ btScalar btVec3PointTriDist2(const btVector3 *P,
s = (q * r - w * p) / (w * v - r * r);
t = (-s * r - q) / w;
- if ((btFuzzyZero(s) || s > btScalar(0))
- && (ccdEq(s, btScalar(1)) || s < btScalar(1))
- && (btFuzzyZero(t) || t > btScalar(0))
- && (ccdEq(t, btScalar(1)) || t < btScalar(1))
- && (ccdEq(t + s, btScalar(1)) || t + s < btScalar(1))) {
-
- if (witness)
+ if ((btFuzzyZero(s) || s > btScalar(0)) && (ccdEq(s, btScalar(1)) || s < btScalar(1)) && (btFuzzyZero(t) || t > btScalar(0)) && (ccdEq(t, btScalar(1)) || t < btScalar(1)) && (ccdEq(t + s, btScalar(1)) || t + s < btScalar(1)))
+ {
+ if (witness)
{
btVec3Scale(&d1, s);
btVec3Scale(&d2, t);
@@ -388,7 +377,7 @@ btScalar btVec3PointTriDist2(const btVector3 *P,
dist = ccdVec3Dist2(witness, P);
}
- else
+ else
{
dist = s * s * v;
dist += t * t * w;
@@ -398,18 +387,21 @@ btScalar btVec3PointTriDist2(const btVector3 *P,
dist += u;
}
}
- else {
+ else
+ {
dist = btVec3PointSegmentDist2(P, x0, B, witness);
dist2 = btVec3PointSegmentDist2(P, x0, C, &witness2);
- if (dist2 < dist) {
+ if (dist2 < dist)
+ {
dist = dist2;
if (witness)
btVec3Copy(witness, &witness2);
}
dist2 = btVec3PointSegmentDist2(P, B, C, &witness2);
- if (dist2 < dist) {
+ if (dist2 < dist)
+ {
dist = dist2;
if (witness)
btVec3Copy(witness, &witness2);
@@ -419,7 +411,6 @@ btScalar btVec3PointTriDist2(const btVector3 *P,
return dist;
}
-
static int btDoSimplex2(btSimplex *simplex, btVector3 *dir)
{
const btSupportVector *A, *B;
@@ -441,18 +432,21 @@ static int btDoSimplex2(btSimplex *simplex, btVector3 *dir)
// check if origin doesn't lie on AB segment
btVec3Cross(&tmp, &AB, &AO);
- if (btFuzzyZero(btVec3Dot(&tmp, &tmp)) && dot > btScalar(0)) {
+ if (btFuzzyZero(btVec3Dot(&tmp, &tmp)) && dot > btScalar(0))
+ {
return 1;
}
// check if origin is in area where AB segment is
- if (btFuzzyZero(dot) || dot < btScalar(0)) {
+ if (btFuzzyZero(dot) || dot < btScalar(0))
+ {
// origin is in outside are of A
btSimplexSet(simplex, 0, A);
btSimplexSetSize(simplex, 1);
btVec3Copy(dir, &AO);
}
- else {
+ else
+ {
// origin is in area where AB segment is
// keep simplex untouched and set direction to
@@ -463,8 +457,6 @@ static int btDoSimplex2(btSimplex *simplex, btVector3 *dir)
return 0;
}
-
-
static int btDoSimplex3(btSimplex *simplex, btVector3 *dir)
{
const btSupportVector *A, *B, *C;
@@ -479,13 +471,15 @@ static int btDoSimplex3(btSimplex *simplex, btVector3 *dir)
// check touching contact
dist = btVec3PointTriDist2(&ccd_vec3_origin, &A->v, &B->v, &C->v, 0);
- if (btFuzzyZero(dist)) {
+ if (btFuzzyZero(dist))
+ {
return 1;
}
// check if triangle is really triangle (has area > 0)
// if not simplex can't be expanded and thus no itersection is found
- if (btVec3Eq(&A->v, &B->v) || btVec3Eq(&A->v, &C->v)) {
+ if (btVec3Eq(&A->v, &B->v) || btVec3Eq(&A->v, &C->v))
+ {
return -1;
}
@@ -500,54 +494,64 @@ static int btDoSimplex3(btSimplex *simplex, btVector3 *dir)
btVec3Cross(&tmp, &ABC, &AC);
dot = btVec3Dot(&tmp, &AO);
- if (btFuzzyZero(dot) || dot > btScalar(0)) {
+ if (btFuzzyZero(dot) || dot > btScalar(0))
+ {
dot = btVec3Dot(&AC, &AO);
- if (btFuzzyZero(dot) || dot > btScalar(0)) {
+ if (btFuzzyZero(dot) || dot > btScalar(0))
+ {
// C is already in place
btSimplexSet(simplex, 1, A);
btSimplexSetSize(simplex, 2);
btTripleCross(&AC, &AO, &AC, dir);
}
- else {
-
+ else
+ {
dot = btVec3Dot(&AB, &AO);
- if (btFuzzyZero(dot) || dot > btScalar(0)) {
+ if (btFuzzyZero(dot) || dot > btScalar(0))
+ {
btSimplexSet(simplex, 0, B);
btSimplexSet(simplex, 1, A);
btSimplexSetSize(simplex, 2);
btTripleCross(&AB, &AO, &AB, dir);
}
- else {
+ else
+ {
btSimplexSet(simplex, 0, A);
btSimplexSetSize(simplex, 1);
btVec3Copy(dir, &AO);
}
}
}
- else {
+ else
+ {
btVec3Cross(&tmp, &AB, &ABC);
dot = btVec3Dot(&tmp, &AO);
- if (btFuzzyZero(dot) || dot > btScalar(0))
+ if (btFuzzyZero(dot) || dot > btScalar(0))
{
dot = btVec3Dot(&AB, &AO);
- if (btFuzzyZero(dot) || dot > btScalar(0)) {
+ if (btFuzzyZero(dot) || dot > btScalar(0))
+ {
btSimplexSet(simplex, 0, B);
btSimplexSet(simplex, 1, A);
btSimplexSetSize(simplex, 2);
btTripleCross(&AB, &AO, &AB, dir);
}
- else {
+ else
+ {
btSimplexSet(simplex, 0, A);
btSimplexSetSize(simplex, 1);
btVec3Copy(dir, &AO);
}
}
- else {
+ else
+ {
dot = btVec3Dot(&ABC, &AO);
- if (btFuzzyZero(dot) || dot > btScalar(0)) {
+ if (btFuzzyZero(dot) || dot > btScalar(0))
+ {
btVec3Copy(dir, &ABC);
}
- else {
+ else
+ {
btSupportVector tmp;
btSupportCopy(&tmp, C);
btSimplexSet(simplex, 0, B);
@@ -581,7 +585,8 @@ static int btDoSimplex4(btSimplex *simplex, btVector3 *dir)
// if it is not simplex can't be expanded and thus no intersection is
// found
dist = btVec3PointTriDist2(&A->v, &B->v, &C->v, &D->v, 0);
- if (btFuzzyZero(dist)) {
+ if (btFuzzyZero(dist))
+ {
return -1;
}
@@ -622,12 +627,14 @@ static int btDoSimplex4(btSimplex *simplex, btVector3 *dir)
AC_O = ccdSign(btVec3Dot(&ADB, &AO)) == C_on_ADB;
AD_O = ccdSign(btVec3Dot(&ABC, &AO)) == D_on_ABC;
- if (AB_O && AC_O && AD_O) {
+ if (AB_O && AC_O && AD_O)
+ {
// origin is in tetrahedron
return 1;
// rearrange simplex to triangle and call btDoSimplex3()
}
- else if (!AB_O) {
+ else if (!AB_O)
+ {
// B is farthest from the origin among all of the tetrahedron's
// points, so remove it from the list and go on with the triangle
// case
@@ -636,14 +643,16 @@ static int btDoSimplex4(btSimplex *simplex, btVector3 *dir)
btSimplexSet(simplex, 2, A);
btSimplexSetSize(simplex, 3);
}
- else if (!AC_O) {
+ else if (!AC_O)
+ {
// C is farthest
btSimplexSet(simplex, 1, D);
btSimplexSet(simplex, 0, B);
btSimplexSet(simplex, 2, A);
btSimplexSetSize(simplex, 3);
}
- else { // (!AD_O)
+ else
+ { // (!AD_O)
btSimplexSet(simplex, 0, C);
btSimplexSet(simplex, 1, B);
btSimplexSet(simplex, 2, A);
@@ -655,36 +664,39 @@ static int btDoSimplex4(btSimplex *simplex, btVector3 *dir)
static int btDoSimplex(btSimplex *simplex, btVector3 *dir)
{
- if (btSimplexSize(simplex) == 2) {
+ if (btSimplexSize(simplex) == 2)
+ {
// simplex contains segment only one segment
return btDoSimplex2(simplex, dir);
}
- else if (btSimplexSize(simplex) == 3) {
+ else if (btSimplexSize(simplex) == 3)
+ {
// simplex contains triangle
return btDoSimplex3(simplex, dir);
}
- else { // btSimplexSize(simplex) == 4
- // tetrahedron - this is the only shape which can encapsule origin
- // so btDoSimplex4() also contains test on it
+ else
+ { // btSimplexSize(simplex) == 4
+ // tetrahedron - this is the only shape which can encapsule origin
+ // so btDoSimplex4() also contains test on it
return btDoSimplex4(simplex, dir);
}
}
#ifdef __SPU__
-void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& input,Result& output,class btIDebugDraw* debugDraw)
+void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput &input, Result &output, class btIDebugDraw *debugDraw)
#else
-void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& input, Result& output, class btIDebugDraw* debugDraw)
+void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput &input, Result &output, class btIDebugDraw *debugDraw)
#endif
{
m_cachedSeparatingDistance = 0.f;
- btScalar distance=btScalar(0.);
- btVector3 normalInB(btScalar(0.),btScalar(0.),btScalar(0.));
+ btScalar distance = btScalar(0.);
+ btVector3 normalInB(btScalar(0.), btScalar(0.), btScalar(0.));
- btVector3 pointOnA,pointOnB;
- btTransform localTransA = input.m_transformA;
+ btVector3 pointOnA, pointOnB;
+ btTransform localTransA = input.m_transformA;
btTransform localTransB = input.m_transformB;
- btVector3 positionOffset=(localTransA.getOrigin() + localTransB.getOrigin()) * btScalar(0.5);
+ btVector3 positionOffset = (localTransA.getOrigin() + localTransB.getOrigin()) * btScalar(0.5);
localTransA.getOrigin() -= positionOffset;
localTransB.getOrigin() -= positionOffset;
@@ -693,7 +705,6 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu
btScalar marginA = m_marginA;
btScalar marginB = m_marginB;
- gNumGjkChecks++;
//for CCD we don't use margins
if (m_ignoreMargin)
@@ -703,19 +714,19 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu
}
m_curIter = 0;
- int gGjkMaxIter = 1000;//this is to catch invalid input, perhaps check for #NaN?
- m_cachedSeparatingAxis.setValue(0,1,0);
+ int gGjkMaxIter = 1000; //this is to catch invalid input, perhaps check for #NaN?
+ m_cachedSeparatingAxis.setValue(0, 1, 0);
bool isValid = false;
bool checkSimplex = false;
bool checkPenetration = true;
m_degenerateSimplex = 0;
-
+
m_lastUsedMethod = -1;
int status = -2;
btVector3 orgNormalInB(0, 0, 0);
btScalar margin = marginA + marginB;
-
+
//we add a separate implementation to check if the convex shapes intersect
//See also "Real-time Collision Detection with Implicit Objects" by Leif Olvang
//Todo: integrate the simplex penetration check directly inside the Bullet btVoronoiSimplexSolver
@@ -726,22 +737,18 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu
btScalar squaredDistance = BT_LARGE_FLOAT;
btScalar delta = btScalar(0.);
-
-
-
btSimplex simplex1;
- btSimplex* simplex = &simplex1;
+ btSimplex *simplex = &simplex1;
btSimplexInit(simplex);
btVector3 dir(1, 0, 0);
{
-
btVector3 lastSupV;
btVector3 supAworld;
btVector3 supBworld;
btComputeSupport(m_minkowskiA, localTransA, m_minkowskiB, localTransB, dir, check2d, supAworld, supBworld, lastSupV);
-
+
btSupportVector last;
last.v = lastSupV;
last.v1 = supAworld;
@@ -751,10 +758,8 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu
dir = -lastSupV;
-
-
// start iterations
- for (int iterations = 0; iterations <gGjkMaxIter; iterations++)
+ for (int iterations = 0; iterations < gGjkMaxIter; iterations++)
{
// obtain support point
btComputeSupport(m_minkowskiA, localTransA, m_minkowskiB, localTransB, dir, check2d, supAworld, supBworld, lastSupV);
@@ -769,7 +774,7 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu
status = -1;
break;
}
-
+
// add last support vector to simplex
last.v = lastSupV;
last.v1 = supAworld;
@@ -781,21 +786,21 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu
// intersect and 0 if algorithm should continue
btVector3 newDir;
- int do_simplex_res = btDoSimplex(simplex, &dir);
+ int do_simplex_res = btDoSimplex(simplex, &dir);
- if (do_simplex_res == 1)
+ if (do_simplex_res == 1)
{
- status = 0; // intersection found
+ status = 0; // intersection found
break;
}
- else if (do_simplex_res == -1)
+ else if (do_simplex_res == -1)
{
// intersection not found
status = -1;
break;
}
-
- if (btFuzzyZero(btVec3Dot(&dir, &dir)))
+
+ if (btFuzzyZero(btVec3Dot(&dir, &dir)))
{
// intersection not found
status = -1;
@@ -815,7 +820,6 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu
break;
}
}
-
}
m_simplexSolver->reset();
@@ -825,27 +829,24 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu
//printf("Intersect!\n");
}
- if (status==-1)
+ if (status == -1)
{
//printf("not intersect\n");
}
//printf("dir=%f,%f,%f\n",dir[0],dir[1],dir[2]);
if (1)
{
- for (; ; )
- //while (true)
+ for (;;)
+ //while (true)
{
-
- btVector3 seperatingAxisInA = (-m_cachedSeparatingAxis)* localTransA.getBasis();
- btVector3 seperatingAxisInB = m_cachedSeparatingAxis* localTransB.getBasis();
-
+ btVector3 seperatingAxisInA = (-m_cachedSeparatingAxis) * localTransA.getBasis();
+ btVector3 seperatingAxisInB = m_cachedSeparatingAxis * localTransB.getBasis();
btVector3 pInA = m_minkowskiA->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInA);
btVector3 qInB = m_minkowskiB->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInB);
- btVector3 pWorld = localTransA(pInA);
- btVector3 qWorld = localTransB(qInB);
-
+ btVector3 pWorld = localTransA(pInA);
+ btVector3 qWorld = localTransB(qInB);
if (check2d)
{
@@ -921,8 +922,7 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu
checkSimplex = false;
break;
}
-#endif //
-
+#endif //
//redundant m_simplexSolver->compute_points(pointOnA, pointOnB);
@@ -938,33 +938,31 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu
m_cachedSeparatingAxis = newCachedSeparatingAxis;
- //degeneracy, this is typically due to invalid/uninitialized worldtransforms for a btCollisionObject
+ //degeneracy, this is typically due to invalid/uninitialized worldtransforms for a btCollisionObject
if (m_curIter++ > gGjkMaxIter)
{
-#if defined(DEBUG) || defined (_DEBUG)
+#if defined(DEBUG) || defined(_DEBUG)
printf("btGjkPairDetector maxIter exceeded:%i\n", m_curIter);
printf("sepAxis=(%f,%f,%f), squaredDistance = %f, shapeTypeA=%i,shapeTypeB=%i\n",
- m_cachedSeparatingAxis.getX(),
- m_cachedSeparatingAxis.getY(),
- m_cachedSeparatingAxis.getZ(),
- squaredDistance,
- m_minkowskiA->getShapeType(),
- m_minkowskiB->getShapeType());
-
-#endif
- break;
+ m_cachedSeparatingAxis.getX(),
+ m_cachedSeparatingAxis.getY(),
+ m_cachedSeparatingAxis.getZ(),
+ squaredDistance,
+ m_minkowskiA->getShapeType(),
+ m_minkowskiB->getShapeType());
+#endif
+ break;
}
-
bool check = (!m_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_simplexSolver->backup_closest(m_cachedSeparatingAxis);
m_degenerateSimplex = 13;
break;
}
@@ -972,20 +970,20 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu
if (checkSimplex)
{
- m_simplexSolver->compute_points(pointOnA, pointOnB);
- normalInB = m_cachedSeparatingAxis;
+ m_simplexSolver->compute_points(pointOnA, pointOnB);
+ normalInB = m_cachedSeparatingAxis;
+
+ btScalar lenSqr = m_cachedSeparatingAxis.length2();
- btScalar lenSqr =m_cachedSeparatingAxis.length2();
-
//valid normal
if (lenSqr < REL_ERROR2)
{
m_degenerateSimplex = 5;
}
- if (lenSqr > SIMD_EPSILON*SIMD_EPSILON)
+ if (lenSqr > SIMD_EPSILON * SIMD_EPSILON)
{
btScalar rlen = btScalar(1.) / btSqrt(lenSqr);
- normalInB *= rlen; //normalize
+ normalInB *= rlen; //normalize
btScalar s = btSqrt(squaredDistance);
@@ -1005,13 +1003,11 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu
}
}
-
-
- bool catchDegeneratePenetrationCase =
- (m_catchDegeneracies && m_penetrationDepthSolver && m_degenerateSimplex && ((distance+margin) < gGjkEpaPenetrationTolerance));
+ bool catchDegeneratePenetrationCase =
+ (m_catchDegeneracies && m_penetrationDepthSolver && m_degenerateSimplex && ((distance + margin) < gGjkEpaPenetrationTolerance));
//if (checkPenetration && !isValid)
- if ((checkPenetration && (!isValid || catchDegeneratePenetrationCase )) || (status == 0))
+ if ((checkPenetration && (!isValid || catchDegeneratePenetrationCase)) || (status == 0))
{
//penetration case
@@ -1019,19 +1015,16 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu
if (m_penetrationDepthSolver)
{
// Penetration depth case.
- btVector3 tmpPointOnA,tmpPointOnB;
-
- gNumDeepPenetrationChecks++;
+ btVector3 tmpPointOnA, tmpPointOnB;
+
m_cachedSeparatingAxis.setZero();
- bool isValid2 = m_penetrationDepthSolver->calcPenDepth(
- *m_simplexSolver,
- m_minkowskiA,m_minkowskiB,
- localTransA,localTransB,
+ bool isValid2 = m_penetrationDepthSolver->calcPenDepth(
+ *m_simplexSolver,
+ m_minkowskiA, m_minkowskiB,
+ localTransA, localTransB,
m_cachedSeparatingAxis, tmpPointOnA, tmpPointOnB,
- debugDraw
- );
-
+ debugDraw);
if (m_cachedSeparatingAxis.length2())
{
@@ -1039,13 +1032,13 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu
{
btVector3 tmpNormalInB = tmpPointOnB - tmpPointOnA;
btScalar lenSqr = tmpNormalInB.length2();
- if (lenSqr <= (SIMD_EPSILON*SIMD_EPSILON))
+ if (lenSqr <= (SIMD_EPSILON * SIMD_EPSILON))
{
tmpNormalInB = m_cachedSeparatingAxis;
lenSqr = m_cachedSeparatingAxis.length2();
}
- if (lenSqr > (SIMD_EPSILON*SIMD_EPSILON))
+ if (lenSqr > (SIMD_EPSILON * SIMD_EPSILON))
{
tmpNormalInB /= btSqrt(lenSqr);
btScalar distance2 = -(tmpPointOnA - tmpPointOnB).length();
@@ -1058,7 +1051,6 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu
pointOnB = tmpPointOnB;
normalInB = tmpNormalInB;
isValid = true;
-
}
else
{
@@ -1079,7 +1071,6 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu
///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;
@@ -1103,109 +1094,90 @@ void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& inpu
}
}
}
- } else
+ }
+ else
{
//printf("EPA didn't return a valid value\n");
}
-
}
-
}
}
-
-
- if (isValid && ((distance < 0) || (distance*distance < input.m_maximumDistanceSquared)))
+ if (isValid && ((distance < 0) || (distance * distance < input.m_maximumDistanceSquared)))
{
-
m_cachedSeparatingAxis = normalInB;
m_cachedSeparatingDistance = distance;
if (1)
{
- ///todo: need to track down this EPA penetration solver degeneracy
- ///the penetration solver reports penetration but the contact normal
- ///connecting the contact points is pointing in the opposite direction
- ///until then, detect the issue and revert the normal
+ ///todo: need to track down this EPA penetration solver degeneracy
+ ///the penetration solver reports penetration but the contact normal
+ ///connecting the contact points is pointing in the opposite direction
+ ///until then, detect the issue and revert the normal
btScalar d2 = 0.f;
{
- btVector3 seperatingAxisInA = (-orgNormalInB)* localTransA.getBasis();
- btVector3 seperatingAxisInB = orgNormalInB* localTransB.getBasis();
-
+ btVector3 seperatingAxisInA = (-orgNormalInB) * localTransA.getBasis();
+ btVector3 seperatingAxisInB = orgNormalInB * localTransB.getBasis();
btVector3 pInA = m_minkowskiA->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInA);
btVector3 qInB = m_minkowskiB->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInB);
- btVector3 pWorld = localTransA(pInA);
- btVector3 qWorld = localTransB(qInB);
+ btVector3 pWorld = localTransA(pInA);
+ btVector3 qWorld = localTransB(qInB);
btVector3 w = pWorld - qWorld;
- d2 = orgNormalInB.dot(w)- margin;
+ d2 = orgNormalInB.dot(w) - margin;
}
-
- btScalar d1=0;
+
+ btScalar d1 = 0;
{
-
- btVector3 seperatingAxisInA = (normalInB)* localTransA.getBasis();
- btVector3 seperatingAxisInB = -normalInB* localTransB.getBasis();
-
+ btVector3 seperatingAxisInA = (normalInB)*localTransA.getBasis();
+ btVector3 seperatingAxisInB = -normalInB * localTransB.getBasis();
btVector3 pInA = m_minkowskiA->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInA);
btVector3 qInB = m_minkowskiB->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInB);
- btVector3 pWorld = localTransA(pInA);
- btVector3 qWorld = localTransB(qInB);
- btVector3 w = pWorld - qWorld;
- d1 = (-normalInB).dot(w)- margin;
-
+ btVector3 pWorld = localTransA(pInA);
+ btVector3 qWorld = localTransB(qInB);
+ btVector3 w = pWorld - qWorld;
+ d1 = (-normalInB).dot(w) - margin;
}
btScalar d0 = 0.f;
{
- btVector3 seperatingAxisInA = (-normalInB)* input.m_transformA.getBasis();
- btVector3 seperatingAxisInB = normalInB* input.m_transformB.getBasis();
-
+ btVector3 seperatingAxisInA = (-normalInB) * input.m_transformA.getBasis();
+ btVector3 seperatingAxisInB = normalInB * input.m_transformB.getBasis();
btVector3 pInA = m_minkowskiA->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInA);
btVector3 qInB = m_minkowskiB->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInB);
- btVector3 pWorld = localTransA(pInA);
- btVector3 qWorld = localTransB(qInB);
- btVector3 w = pWorld - qWorld;
- d0 = normalInB.dot(w)-margin;
+ btVector3 pWorld = localTransA(pInA);
+ btVector3 qWorld = localTransB(qInB);
+ btVector3 w = pWorld - qWorld;
+ d0 = normalInB.dot(w) - margin;
}
-
- if (d1>d0)
+
+ if (d1 > d0)
{
m_lastUsedMethod = 10;
- normalInB*=-1;
- }
+ normalInB *= -1;
+ }
if (orgNormalInB.length2())
{
if (d2 > d0 && d2 > d1 && d2 > distance)
{
-
normalInB = orgNormalInB;
distance = d2;
}
}
}
-
output.addContactPoint(
normalInB,
- pointOnB+positionOffset,
+ pointOnB + positionOffset,
distance);
-
}
else
{
//printf("invalid gjk query\n");
}
-
-
}
-
-
-
-
-
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h
index feeae68621..659b63551e 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h
@@ -13,9 +13,6 @@ subject to the following restrictions:
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
@@ -29,39 +26,34 @@ class btConvexPenetrationDepthSolver;
/// btGjkPairDetector uses GJK to implement the btDiscreteCollisionDetectorInterface
class btGjkPairDetector : public btDiscreteCollisionDetectorInterface
{
-
-
- btVector3 m_cachedSeparatingAxis;
- btConvexPenetrationDepthSolver* m_penetrationDepthSolver;
+ btVector3 m_cachedSeparatingAxis;
+ btConvexPenetrationDepthSolver* m_penetrationDepthSolver;
btSimplexSolverInterface* m_simplexSolver;
const btConvexShape* m_minkowskiA;
const btConvexShape* m_minkowskiB;
- int m_shapeTypeA;
+ int m_shapeTypeA;
int m_shapeTypeB;
- btScalar m_marginA;
- btScalar m_marginB;
+ btScalar m_marginA;
+ btScalar m_marginB;
- bool m_ignoreMargin;
- btScalar m_cachedSeparatingDistance;
-
+ 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;
+ 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() {};
+ 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);
+ 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 getClosestPointsNonVirtual(const ClosestPointInput& input, Result& output, class btIDebugDraw* debugDraw);
void setMinkowskiA(const btConvexShape* minkA)
{
@@ -81,23 +73,21 @@ public:
{
return m_cachedSeparatingAxis;
}
- btScalar getCachedSeparatingDistance() const
+ btScalar getCachedSeparatingDistance() const
{
return m_cachedSeparatingDistance;
}
- void setPenetrationDepthSolver(btConvexPenetrationDepthSolver* penetrationDepthSolver)
+ void setPenetrationDepthSolver(btConvexPenetrationDepthSolver* penetrationDepthSolver)
{
m_penetrationDepthSolver = penetrationDepthSolver;
}
///don't use setIgnoreMargin, it's for Bullet's internal use
- void setIgnoreMargin(bool ignoreMargin)
+ void setIgnoreMargin(bool ignoreMargin)
{
m_ignoreMargin = ignoreMargin;
}
-
-
};
-#endif //BT_GJK_PAIR_DETECTOR_H
+#endif //BT_GJK_PAIR_DETECTOR_H
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h
index 571ad2c5f7..6d21f66202 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h
@@ -20,161 +20,152 @@ subject to the following restrictions:
#include "LinearMath/btTransformUtil.h"
#ifdef PFX_USE_FREE_VECTORMATH
- #include "physics_effects/base_level/solver/pfx_constraint_row.h"
+#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
+// 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_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_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_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)
{
- public:
- btManifoldPoint()
- :m_userPersistentData(0),
- m_contactPointFlags(0),
- m_appliedImpulse(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_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_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;
- }
-
-
+ }
+
+ 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_appliedImpulseLateral1;
+ btScalar m_appliedImpulseLateral2;
+ btScalar m_contactMotion1;
+ btScalar m_contactMotion2;
+
+ union {
+ btScalar m_contactCFM;
+ btScalar m_combinedContactStiffness1;
+ };
+ union {
+ btScalar m_contactERP;
+ btScalar m_combinedContactDamping1;
};
-#endif //BT_MANIFOLD_CONTACT_POINT_H
+ 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/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.cpp b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.cpp
index fa45f49037..a77449812f 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.cpp
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.cpp
@@ -21,42 +21,38 @@ subject to the following restrictions:
#define NUM_UNITSPHERE_POINTS 42
-
bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& simplexSolver,
- const btConvexShape* convexA,const btConvexShape* convexB,
- const btTransform& transA,const btTransform& transB,
- btVector3& v, btVector3& pa, btVector3& pb,
- class btIDebugDraw* debugDraw
- )
+ const btConvexShape* convexA, const btConvexShape* convexB,
+ const btTransform& transA, const btTransform& transB,
+ btVector3& v, btVector3& pa, btVector3& pb,
+ class btIDebugDraw* debugDraw)
{
-
(void)v;
-
- bool check2d= convexA->isConvex2d() && convexB->isConvex2d();
+
+ bool check2d = convexA->isConvex2d() && convexB->isConvex2d();
struct btIntermediateResult : public btDiscreteCollisionDetectorInterface::Result
{
-
- btIntermediateResult():m_hasResult(false)
+ btIntermediateResult() : m_hasResult(false)
{
}
-
+
btVector3 m_normalOnBInWorld;
btVector3 m_pointInWorld;
btScalar m_depth;
- bool m_hasResult;
+ bool m_hasResult;
- virtual void setShapeIdentifiersA(int partId0,int index0)
+ virtual void setShapeIdentifiersA(int partId0, int index0)
{
(void)partId0;
(void)index0;
}
- virtual void setShapeIdentifiersB(int partId1,int index1)
+ virtual void setShapeIdentifiersB(int partId1, int index1)
{
(void)partId1;
(void)index1;
}
- void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar depth)
+ void addContactPoint(const btVector3& normalOnBInWorld, const btVector3& pointInWorld, btScalar depth)
{
m_normalOnBInWorld = normalOnBInWorld;
m_pointInWorld = pointInWorld;
@@ -68,39 +64,39 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
//just take fixed number of orientation, and sample the penetration depth in that direction
btScalar minProj = btScalar(BT_LARGE_FLOAT);
btVector3 minNorm(btScalar(0.), btScalar(0.), btScalar(0.));
- btVector3 minA,minB;
- btVector3 seperatingAxisInA,seperatingAxisInB;
- btVector3 pInA,qInB,pWorld,qWorld,w;
+ btVector3 minA, minB;
+ btVector3 seperatingAxisInA, seperatingAxisInB;
+ btVector3 pInA, qInB, pWorld, qWorld, w;
#ifndef __SPU__
#define USE_BATCHED_SUPPORT 1
#endif
#ifdef USE_BATCHED_SUPPORT
- btVector3 supportVerticesABatch[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2];
- btVector3 supportVerticesBBatch[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2];
- btVector3 seperatingAxisInABatch[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2];
- btVector3 seperatingAxisInBBatch[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2];
+ btVector3 supportVerticesABatch[NUM_UNITSPHERE_POINTS + MAX_PREFERRED_PENETRATION_DIRECTIONS * 2];
+ btVector3 supportVerticesBBatch[NUM_UNITSPHERE_POINTS + MAX_PREFERRED_PENETRATION_DIRECTIONS * 2];
+ btVector3 seperatingAxisInABatch[NUM_UNITSPHERE_POINTS + MAX_PREFERRED_PENETRATION_DIRECTIONS * 2];
+ btVector3 seperatingAxisInBBatch[NUM_UNITSPHERE_POINTS + MAX_PREFERRED_PENETRATION_DIRECTIONS * 2];
int i;
int numSampleDirections = NUM_UNITSPHERE_POINTS;
- for (i=0;i<numSampleDirections;i++)
+ for (i = 0; i < numSampleDirections; i++)
{
btVector3 norm = getPenetrationDirections()[i];
- seperatingAxisInABatch[i] = (-norm) * transA.getBasis() ;
- seperatingAxisInBBatch[i] = norm * transB.getBasis() ;
+ seperatingAxisInABatch[i] = (-norm) * transA.getBasis();
+ seperatingAxisInBBatch[i] = norm * transB.getBasis();
}
{
int numPDA = convexA->getNumPreferredPenetrationDirections();
if (numPDA)
{
- for (int i=0;i<numPDA;i++)
+ for (int i = 0; i < numPDA; i++)
{
btVector3 norm;
- convexA->getPreferredPenetrationDirection(i,norm);
- norm = transA.getBasis() * norm;
+ convexA->getPreferredPenetrationDirection(i, norm);
+ norm = transA.getBasis() * norm;
getPenetrationDirections()[numSampleDirections] = norm;
seperatingAxisInABatch[numSampleDirections] = (-norm) * transA.getBasis();
seperatingAxisInBBatch[numSampleDirections] = norm * transB.getBasis();
@@ -113,11 +109,11 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
int numPDB = convexB->getNumPreferredPenetrationDirections();
if (numPDB)
{
- for (int i=0;i<numPDB;i++)
+ for (int i = 0; i < numPDB; i++)
{
btVector3 norm;
- convexB->getPreferredPenetrationDirection(i,norm);
- norm = transB.getBasis() * norm;
+ convexB->getPreferredPenetrationDirection(i, norm);
+ norm = transB.getBasis() * norm;
getPenetrationDirections()[numSampleDirections] = norm;
seperatingAxisInABatch[numSampleDirections] = (-norm) * transA.getBasis();
seperatingAxisInBBatch[numSampleDirections] = norm * transB.getBasis();
@@ -126,29 +122,25 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
}
}
+ convexA->batchedUnitVectorGetSupportingVertexWithoutMargin(seperatingAxisInABatch, supportVerticesABatch, numSampleDirections);
+ convexB->batchedUnitVectorGetSupportingVertexWithoutMargin(seperatingAxisInBBatch, supportVerticesBBatch, numSampleDirections);
-
-
- convexA->batchedUnitVectorGetSupportingVertexWithoutMargin(seperatingAxisInABatch,supportVerticesABatch,numSampleDirections);
- convexB->batchedUnitVectorGetSupportingVertexWithoutMargin(seperatingAxisInBBatch,supportVerticesBBatch,numSampleDirections);
-
- for (i=0;i<numSampleDirections;i++)
+ for (i = 0; i < numSampleDirections; i++)
{
btVector3 norm = getPenetrationDirections()[i];
if (check2d)
{
norm[2] = 0.f;
}
- if (norm.length2()>0.01)
+ if (norm.length2() > 0.01)
{
-
seperatingAxisInA = seperatingAxisInABatch[i];
seperatingAxisInB = seperatingAxisInBBatch[i];
pInA = supportVerticesABatch[i];
qInB = supportVerticesBBatch[i];
- pWorld = transA(pInA);
+ pWorld = transA(pInA);
qWorld = transB(qInB);
if (check2d)
{
@@ -156,7 +148,7 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
qWorld[2] = 0.f;
}
- w = qWorld - pWorld;
+ w = qWorld - pWorld;
btScalar delta = norm.dot(w);
//find smallest delta
if (delta < minProj)
@@ -167,7 +159,7 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
minB = qWorld;
}
}
- }
+ }
#else
int numSampleDirections = NUM_UNITSPHERE_POINTS;
@@ -177,11 +169,11 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
int numPDA = convexA->getNumPreferredPenetrationDirections();
if (numPDA)
{
- for (int i=0;i<numPDA;i++)
+ for (int i = 0; i < numPDA; i++)
{
btVector3 norm;
- convexA->getPreferredPenetrationDirection(i,norm);
- norm = transA.getBasis() * norm;
+ convexA->getPreferredPenetrationDirection(i, norm);
+ norm = transA.getBasis() * norm;
getPenetrationDirections()[numSampleDirections] = norm;
numSampleDirections++;
}
@@ -192,28 +184,28 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
int numPDB = convexB->getNumPreferredPenetrationDirections();
if (numPDB)
{
- for (int i=0;i<numPDB;i++)
+ for (int i = 0; i < numPDB; i++)
{
btVector3 norm;
- convexB->getPreferredPenetrationDirection(i,norm);
- norm = transB.getBasis() * norm;
+ convexB->getPreferredPenetrationDirection(i, norm);
+ norm = transB.getBasis() * norm;
getPenetrationDirections()[numSampleDirections] = norm;
numSampleDirections++;
}
}
}
-#endif // __SPU__
+#endif // __SPU__
- for (int i=0;i<numSampleDirections;i++)
+ for (int i = 0; i < numSampleDirections; i++)
{
const btVector3& norm = getPenetrationDirections()[i];
- seperatingAxisInA = (-norm)* transA.getBasis();
- seperatingAxisInB = norm* transB.getBasis();
+ seperatingAxisInA = (-norm) * transA.getBasis();
+ seperatingAxisInB = norm * transB.getBasis();
pInA = convexA->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInA);
qInB = convexB->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInB);
- pWorld = transA(pInA);
+ pWorld = transA(pInA);
qWorld = transB(qInB);
- w = qWorld - pWorld;
+ w = qWorld - pWorld;
btScalar delta = norm.dot(w);
//find smallest delta
if (delta < minProj)
@@ -224,48 +216,39 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
minB = qWorld;
}
}
-#endif //USE_BATCHED_SUPPORT
+#endif //USE_BATCHED_SUPPORT
//add the margins
- minA += minNorm*convexA->getMarginNonVirtual();
- minB -= minNorm*convexB->getMarginNonVirtual();
+ minA += minNorm * convexA->getMarginNonVirtual();
+ minB -= minNorm * convexB->getMarginNonVirtual();
//no penetration
if (minProj < btScalar(0.))
return false;
- btScalar extraSeparation = 0.5f;///scale dependent
- minProj += extraSeparation+(convexA->getMarginNonVirtual() + convexB->getMarginNonVirtual());
-
-
-
-
+ btScalar extraSeparation = 0.5f; ///scale dependent
+ minProj += extraSeparation + (convexA->getMarginNonVirtual() + convexB->getMarginNonVirtual());
//#define DEBUG_DRAW 1
#ifdef DEBUG_DRAW
if (debugDraw)
{
- btVector3 color(0,1,0);
- debugDraw->drawLine(minA,minB,color);
- color = btVector3 (1,1,1);
- btVector3 vec = minB-minA;
+ btVector3 color(0, 1, 0);
+ debugDraw->drawLine(minA, minB, color);
+ color = btVector3(1, 1, 1);
+ btVector3 vec = minB - minA;
btScalar prj2 = minNorm.dot(vec);
- debugDraw->drawLine(minA,minA+(minNorm*minProj),color);
-
+ debugDraw->drawLine(minA, minA + (minNorm * minProj), color);
}
-#endif //DEBUG_DRAW
+#endif //DEBUG_DRAW
-
-
- btGjkPairDetector gjkdet(convexA,convexB,&simplexSolver,0);
+ btGjkPairDetector gjkdet(convexA, convexB, &simplexSolver, 0);
btScalar offsetDist = minProj;
btVector3 offset = minNorm * offsetDist;
-
-
btGjkPairDetector::ClosestPointInput input;
-
+
btVector3 newOrg = transA.getOrigin() + offset;
btTransform displacedTrans = transA;
@@ -273,89 +256,81 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
input.m_transformA = displacedTrans;
input.m_transformB = transB;
- input.m_maximumDistanceSquared = btScalar(BT_LARGE_FLOAT);//minProj;
-
+ input.m_maximumDistanceSquared = btScalar(BT_LARGE_FLOAT); //minProj;
+
btIntermediateResult res;
gjkdet.setCachedSeperatingAxis(-minNorm);
- gjkdet.getClosestPoints(input,res,debugDraw);
+ gjkdet.getClosestPoints(input, res, debugDraw);
btScalar correctedMinNorm = minProj - res.m_depth;
-
//the penetration depth is over-estimated, relax it
- btScalar penetration_relaxation= btScalar(1.);
- minNorm*=penetration_relaxation;
-
+ btScalar penetration_relaxation = btScalar(1.);
+ minNorm *= penetration_relaxation;
if (res.m_hasResult)
{
-
pa = res.m_pointInWorld - minNorm * correctedMinNorm;
pb = res.m_pointInWorld;
v = minNorm;
-
+
#ifdef DEBUG_DRAW
if (debugDraw)
{
- btVector3 color(1,0,0);
- debugDraw->drawLine(pa,pb,color);
+ btVector3 color(1, 0, 0);
+ debugDraw->drawLine(pa, pb, color);
}
-#endif//DEBUG_DRAW
-
-
+#endif //DEBUG_DRAW
}
return res.m_hasResult;
}
-btVector3* btMinkowskiPenetrationDepthSolver::getPenetrationDirections()
+btVector3* btMinkowskiPenetrationDepthSolver::getPenetrationDirections()
{
- static btVector3 sPenetrationDirections[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2] =
- {
- btVector3(btScalar(0.000000) , btScalar(-0.000000),btScalar(-1.000000)),
- btVector3(btScalar(0.723608) , btScalar(-0.525725),btScalar(-0.447219)),
- btVector3(btScalar(-0.276388) , btScalar(-0.850649),btScalar(-0.447219)),
- btVector3(btScalar(-0.894426) , btScalar(-0.000000),btScalar(-0.447216)),
- btVector3(btScalar(-0.276388) , btScalar(0.850649),btScalar(-0.447220)),
- btVector3(btScalar(0.723608) , btScalar(0.525725),btScalar(-0.447219)),
- btVector3(btScalar(0.276388) , btScalar(-0.850649),btScalar(0.447220)),
- btVector3(btScalar(-0.723608) , btScalar(-0.525725),btScalar(0.447219)),
- btVector3(btScalar(-0.723608) , btScalar(0.525725),btScalar(0.447219)),
- btVector3(btScalar(0.276388) , btScalar(0.850649),btScalar(0.447219)),
- btVector3(btScalar(0.894426) , btScalar(0.000000),btScalar(0.447216)),
- btVector3(btScalar(-0.000000) , btScalar(0.000000),btScalar(1.000000)),
- btVector3(btScalar(0.425323) , btScalar(-0.309011),btScalar(-0.850654)),
- btVector3(btScalar(-0.162456) , btScalar(-0.499995),btScalar(-0.850654)),
- btVector3(btScalar(0.262869) , btScalar(-0.809012),btScalar(-0.525738)),
- btVector3(btScalar(0.425323) , btScalar(0.309011),btScalar(-0.850654)),
- btVector3(btScalar(0.850648) , btScalar(-0.000000),btScalar(-0.525736)),
- btVector3(btScalar(-0.525730) , btScalar(-0.000000),btScalar(-0.850652)),
- btVector3(btScalar(-0.688190) , btScalar(-0.499997),btScalar(-0.525736)),
- btVector3(btScalar(-0.162456) , btScalar(0.499995),btScalar(-0.850654)),
- btVector3(btScalar(-0.688190) , btScalar(0.499997),btScalar(-0.525736)),
- btVector3(btScalar(0.262869) , btScalar(0.809012),btScalar(-0.525738)),
- btVector3(btScalar(0.951058) , btScalar(0.309013),btScalar(0.000000)),
- btVector3(btScalar(0.951058) , btScalar(-0.309013),btScalar(0.000000)),
- btVector3(btScalar(0.587786) , btScalar(-0.809017),btScalar(0.000000)),
- btVector3(btScalar(0.000000) , btScalar(-1.000000),btScalar(0.000000)),
- btVector3(btScalar(-0.587786) , btScalar(-0.809017),btScalar(0.000000)),
- btVector3(btScalar(-0.951058) , btScalar(-0.309013),btScalar(-0.000000)),
- btVector3(btScalar(-0.951058) , btScalar(0.309013),btScalar(-0.000000)),
- btVector3(btScalar(-0.587786) , btScalar(0.809017),btScalar(-0.000000)),
- btVector3(btScalar(-0.000000) , btScalar(1.000000),btScalar(-0.000000)),
- btVector3(btScalar(0.587786) , btScalar(0.809017),btScalar(-0.000000)),
- btVector3(btScalar(0.688190) , btScalar(-0.499997),btScalar(0.525736)),
- btVector3(btScalar(-0.262869) , btScalar(-0.809012),btScalar(0.525738)),
- btVector3(btScalar(-0.850648) , btScalar(0.000000),btScalar(0.525736)),
- btVector3(btScalar(-0.262869) , btScalar(0.809012),btScalar(0.525738)),
- btVector3(btScalar(0.688190) , btScalar(0.499997),btScalar(0.525736)),
- btVector3(btScalar(0.525730) , btScalar(0.000000),btScalar(0.850652)),
- btVector3(btScalar(0.162456) , btScalar(-0.499995),btScalar(0.850654)),
- btVector3(btScalar(-0.425323) , btScalar(-0.309011),btScalar(0.850654)),
- btVector3(btScalar(-0.425323) , btScalar(0.309011),btScalar(0.850654)),
- btVector3(btScalar(0.162456) , btScalar(0.499995),btScalar(0.850654))
- };
+ static btVector3 sPenetrationDirections[NUM_UNITSPHERE_POINTS + MAX_PREFERRED_PENETRATION_DIRECTIONS * 2] =
+ {
+ btVector3(btScalar(0.000000), btScalar(-0.000000), btScalar(-1.000000)),
+ btVector3(btScalar(0.723608), btScalar(-0.525725), btScalar(-0.447219)),
+ btVector3(btScalar(-0.276388), btScalar(-0.850649), btScalar(-0.447219)),
+ btVector3(btScalar(-0.894426), btScalar(-0.000000), btScalar(-0.447216)),
+ btVector3(btScalar(-0.276388), btScalar(0.850649), btScalar(-0.447220)),
+ btVector3(btScalar(0.723608), btScalar(0.525725), btScalar(-0.447219)),
+ btVector3(btScalar(0.276388), btScalar(-0.850649), btScalar(0.447220)),
+ btVector3(btScalar(-0.723608), btScalar(-0.525725), btScalar(0.447219)),
+ btVector3(btScalar(-0.723608), btScalar(0.525725), btScalar(0.447219)),
+ btVector3(btScalar(0.276388), btScalar(0.850649), btScalar(0.447219)),
+ btVector3(btScalar(0.894426), btScalar(0.000000), btScalar(0.447216)),
+ btVector3(btScalar(-0.000000), btScalar(0.000000), btScalar(1.000000)),
+ btVector3(btScalar(0.425323), btScalar(-0.309011), btScalar(-0.850654)),
+ btVector3(btScalar(-0.162456), btScalar(-0.499995), btScalar(-0.850654)),
+ btVector3(btScalar(0.262869), btScalar(-0.809012), btScalar(-0.525738)),
+ btVector3(btScalar(0.425323), btScalar(0.309011), btScalar(-0.850654)),
+ btVector3(btScalar(0.850648), btScalar(-0.000000), btScalar(-0.525736)),
+ btVector3(btScalar(-0.525730), btScalar(-0.000000), btScalar(-0.850652)),
+ btVector3(btScalar(-0.688190), btScalar(-0.499997), btScalar(-0.525736)),
+ btVector3(btScalar(-0.162456), btScalar(0.499995), btScalar(-0.850654)),
+ btVector3(btScalar(-0.688190), btScalar(0.499997), btScalar(-0.525736)),
+ btVector3(btScalar(0.262869), btScalar(0.809012), btScalar(-0.525738)),
+ btVector3(btScalar(0.951058), btScalar(0.309013), btScalar(0.000000)),
+ btVector3(btScalar(0.951058), btScalar(-0.309013), btScalar(0.000000)),
+ btVector3(btScalar(0.587786), btScalar(-0.809017), btScalar(0.000000)),
+ btVector3(btScalar(0.000000), btScalar(-1.000000), btScalar(0.000000)),
+ btVector3(btScalar(-0.587786), btScalar(-0.809017), btScalar(0.000000)),
+ btVector3(btScalar(-0.951058), btScalar(-0.309013), btScalar(-0.000000)),
+ btVector3(btScalar(-0.951058), btScalar(0.309013), btScalar(-0.000000)),
+ btVector3(btScalar(-0.587786), btScalar(0.809017), btScalar(-0.000000)),
+ btVector3(btScalar(-0.000000), btScalar(1.000000), btScalar(-0.000000)),
+ btVector3(btScalar(0.587786), btScalar(0.809017), btScalar(-0.000000)),
+ btVector3(btScalar(0.688190), btScalar(-0.499997), btScalar(0.525736)),
+ btVector3(btScalar(-0.262869), btScalar(-0.809012), btScalar(0.525738)),
+ btVector3(btScalar(-0.850648), btScalar(0.000000), btScalar(0.525736)),
+ btVector3(btScalar(-0.262869), btScalar(0.809012), btScalar(0.525738)),
+ btVector3(btScalar(0.688190), btScalar(0.499997), btScalar(0.525736)),
+ btVector3(btScalar(0.525730), btScalar(0.000000), btScalar(0.850652)),
+ btVector3(btScalar(0.162456), btScalar(-0.499995), btScalar(0.850654)),
+ btVector3(btScalar(-0.425323), btScalar(-0.309011), btScalar(0.850654)),
+ btVector3(btScalar(-0.425323), btScalar(0.309011), btScalar(0.850654)),
+ btVector3(btScalar(0.162456), btScalar(0.499995), btScalar(0.850654))};
return sPenetrationDirections;
}
-
-
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h
index fd533b4fc3..8e3e393259 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h
@@ -23,18 +23,14 @@ subject to the following restrictions:
class btMinkowskiPenetrationDepthSolver : public btConvexPenetrationDepthSolver
{
protected:
-
- static btVector3* getPenetrationDirections();
+ 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
- );
+ 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
-
+#endif //BT_MINKOWSKI_PENETRATION_DEPTH_SOLVER_H
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btMprPenetration.h b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btMprPenetration.h
index a22a0bae66..358bc95d81 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btMprPenetration.h
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btMprPenetration.h
@@ -28,32 +28,31 @@
//#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()
- {
- }
+ 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;
+ btVector3 m_pointOnA;
+ btVector3 m_pointOnB;
+ btVector3 m_normalBtoA;
+ btScalar m_distance;
};
#ifdef __cplusplus
@@ -67,131 +66,112 @@ struct btMprDistanceInfo
#define BT_MPR_TOLERANCE 1E-6f
#define BT_MPR_MAX_ITERATIONS 1000
-struct _btMprSupport_t
+struct _btMprSupport_t
{
- btVector3 v; //!< Support point in minkowski sum
- btVector3 v1; //!< Support point in obj1
- btVector3 v2; //!< Support point in obj2
+ 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
+struct _btMprSimplex_t
{
- btMprSupport_t ps[4];
- int last; //!< index of last added point
+ 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)
+inline btMprSupport_t *btMprSimplexPointW(btMprSimplex_t *s, int idx)
{
- return &s->ps[idx];
+ return &s->ps[idx];
}
inline void btMprSimplexSetSize(btMprSimplex_t *s, int size)
{
- s->last = size - 1;
+ s->last = size - 1;
}
#ifdef DEBUG_MPR
-inline void btPrintPortalVertex(_btMprSimplex_t* portal, int index)
+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());
+ 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
-
-
-
+#endif //DEBUG_MPR
inline int btMprSimplexSize(const btMprSimplex_t *s)
{
- return s->last + 1;
+ return s->last + 1;
}
-
-inline const btMprSupport_t* btMprSimplexPoint(const btMprSimplex_t* s, int idx)
+inline const btMprSupport_t *btMprSimplexPoint(const btMprSimplex_t *s, int idx)
{
- // here is no check on boundaries
- return &s->ps[idx];
+ // here is no check on boundaries
+ return &s->ps[idx];
}
inline void btMprSupportCopy(btMprSupport_t *d, const btMprSupport_t *s)
{
- *d = *s;
+ *d = *s;
}
inline void btMprSimplexSet(btMprSimplex_t *s, size_t pos, const btMprSupport_t *a)
{
- btMprSupportCopy(s->ps + pos, a);
+ btMprSupportCopy(s->ps + pos, a);
}
-
inline void btMprSimplexSwap(btMprSimplex_t *s, size_t pos1, size_t pos2)
{
- btMprSupport_t supp;
+ btMprSupport_t supp;
- btMprSupportCopy(&supp, &s->ps[pos1]);
- btMprSupportCopy(&s->ps[pos1], &s->ps[pos2]);
- btMprSupportCopy(&s->ps[pos2], &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;
+ return BT_MPR_FABS(val) < FLT_EPSILON;
}
-
-
inline int btMprEq(float _a, float _b)
{
- float ab;
- float a, b;
+ float ab;
+ float a, b;
- ab = BT_MPR_FABS(_a - _b);
- if (BT_MPR_FABS(ab) < FLT_EPSILON)
- return 1;
+ 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;
- }
+ 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)
+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());
+ return btMprEq((*a).x(), (*b).x()) && btMprEq((*a).y(), (*b).y()) && btMprEq((*a).z(), (*b).z());
}
-
-
-
-
-
-
-
-
-
-
template <typename btConvexTemplate>
-inline void btFindOrigin(const btConvexTemplate& a, const btConvexTemplate& b, const btMprCollisionDescription& colDesc,btMprSupport_t *center)
+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;
+ 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);
+ v->setValue(x, y, z);
}
inline void btMprVec3Add(btVector3 *v, const btVector3 *w)
@@ -201,41 +181,38 @@ inline void btMprVec3Add(btVector3 *v, const btVector3 *w)
inline void btMprVec3Copy(btVector3 *v, const btVector3 *w)
{
- *v = *w;
+ *v = *w;
}
inline void btMprVec3Scale(btVector3 *d, float k)
{
- *d *= k;
+ *d *= k;
}
inline float btMprVec3Dot(const btVector3 *a, const btVector3 *b)
{
- float dot;
+ float dot;
- dot = btDot(*a,*b);
- return dot;
+ dot = btDot(*a, *b);
+ return dot;
}
-
inline float btMprVec3Len2(const btVector3 *v)
{
- return btMprVec3Dot(v, v);
+ return btMprVec3Dot(v, v);
}
inline void btMprVec3Normalize(btVector3 *d)
{
- float k = 1.f / BT_MPR_SQRT(btMprVec3Len2(d));
- btMprVec3Scale(d, k);
+ 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);
-
+ *d = btCross(*a, *b);
}
-
inline void btMprVec3Sub2(btVector3 *d, const btVector3 *v, const btVector3 *w)
{
*d = *v - *w;
@@ -243,89 +220,97 @@ inline void btMprVec3Sub2(btVector3 *d, const btVector3 *v, const btVector3 *w)
inline void btPortalDir(const btMprSimplex_t *portal, btVector3 *dir)
{
- btVector3 v2v1, v3v1;
+ 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);
+ 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)
+ const btVector3 *dir)
{
- float dot;
- dot = btMprVec3Dot(dir, &btMprSimplexPoint(portal, 1)->v);
- return btMprIsZero(dot) || dot > 0.f;
+ 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)
+ const btMprSupport_t *v4,
+ const btVector3 *dir)
{
- float dv1, dv2, dv3, dv4;
- float dot1, dot2, dot3;
+ float dv1, dv2, dv3, dv4;
+ float dot1, dot2, dot3;
- // find the smallest dot product of dir and {v1-v4, v2-v4, v3-v4}
+ // 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);
+ 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 = dv4 - dv1;
+ dot2 = dv4 - dv2;
+ dot3 = dv4 - dv3;
- dot1 = BT_MPR_FMIN(dot1, dot2);
- dot1 = BT_MPR_FMIN(dot1, dot3);
+ dot1 = BT_MPR_FMIN(dot1, dot2);
+ dot1 = BT_MPR_FMIN(dot1, dot3);
- return btMprEq(dot1, BT_MPR_TOLERANCE) || dot1 < BT_MPR_TOLERANCE;
+ return btMprEq(dot1, BT_MPR_TOLERANCE) || dot1 < BT_MPR_TOLERANCE;
}
inline int portalCanEncapsuleOrigin(const btMprSimplex_t *portal,
- const btMprSupport_t *v4,
- const btVector3 *dir)
+ const btMprSupport_t *v4,
+ const btVector3 *dir)
{
- float dot;
- dot = btMprVec3Dot(&v4->v, dir);
- return btMprIsZero(dot) || dot > 0.f;
+ 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);
- }
- }
+ 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 <typename btConvexTemplate>
-inline void btMprSupport(const btConvexTemplate& a, const btConvexTemplate& b,
- const btMprCollisionDescription& colDesc,
- const btVector3& dir, btMprSupport_t *supp)
+inline void btMprSupport(const btConvexTemplate &a, const btConvexTemplate &b,
+ const btMprCollisionDescription &colDesc,
+ const btVector3 &dir, btMprSupport_t *supp)
{
- btVector3 seperatingAxisInA = dir* a.getWorldTransform().getBasis();
- btVector3 seperatingAxisInB = -dir* b.getWorldTransform().getBasis();
+ btVector3 seperatingAxisInA = dir * a.getWorldTransform().getBasis();
+ btVector3 seperatingAxisInB = -dir * b.getWorldTransform().getBasis();
btVector3 pInA = a.getLocalSupportWithMargin(seperatingAxisInA);
btVector3 qInB = b.getLocalSupportWithMargin(seperatingAxisInB);
@@ -335,574 +320,565 @@ inline void btMprSupport(const btConvexTemplate& a, const btConvexTemplate& b,
supp->v = supp->v1 - supp->v2;
}
-
template <typename btConvexTemplate>
-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;
+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 <typename btConvexTemplate>
-static int btRefinePortal(const btConvexTemplate& a, const btConvexTemplate& b,const btMprCollisionDescription& colDesc,
- btMprSimplex_t *portal)
+static int btRefinePortal(const btConvexTemplate &a, const btConvexTemplate &b, const btMprCollisionDescription &colDesc,
+ btMprSimplex_t *portal)
{
- btVector3 dir;
- btMprSupport_t v4;
+ btVector3 dir;
+ btMprSupport_t v4;
- for (int i=0;i<BT_MPR_MAX_ITERATIONS;i++)
- //while (1)
+ for (int i = 0; i < BT_MPR_MAX_ITERATIONS; i++)
+ //while (1)
{
- // compute direction outside the portal (from v0 throught v1,v2,v3
- // face)
- btPortalDir(portal, &dir);
+ // compute direction outside the portal (from v0 throught v1,v2,v3
+ // face)
+ btPortalDir(portal, &dir);
- // test if origin is inside the portal
- if (portalEncapsulesOrigin(portal, &dir))
- return 0;
+ // test if origin is inside the portal
+ if (portalEncapsulesOrigin(portal, &dir))
+ return 0;
- // get next support point
-
- btMprSupport(a,b,colDesc, dir, &v4);
+ // 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))
+ // 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;
- }
+ return -1;
+ }
- // v1-v2-v3 triangle must be rearranged to face outside Minkowski
- // difference (direction from v0).
- btExpandPortal(portal, &v4);
- }
+ // v1-v2-v3 triangle must be rearranged to face outside Minkowski
+ // difference (direction from v0).
+ btExpandPortal(portal, &v4);
+ }
- return -1;
+ return -1;
}
static void btFindPos(const btMprSimplex_t *portal, btVector3 *pos)
{
+ btVector3 zero = btVector3(0, 0, 0);
+ btVector3 *origin = &zero;
- btVector3 zero = btVector3(0,0,0);
- btVector3* origin = &zero;
-
- btVector3 dir;
- size_t i;
- float b[4], sum, inv;
- btVector3 vec, p1, p2;
+ btVector3 dir;
+ size_t i;
+ float b[4], sum, inv;
+ btVector3 vec, p1, p2;
- btPortalDir(portal, &dir);
+ 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);
+ // 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, 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, 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);
+ 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){
+ 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);
+ 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);
+ 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);
+ btMprVec3Copy(pos, &p1);
+ btMprVec3Add(pos, &p2);
+ btMprVec3Scale(pos, 0.5);
#else
- btMprVec3Copy(pos, &p2);
-#endif//MPR_AVERAGE_CONTACT_POSITIONS
+ 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);
+ 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;
-}
-
+ 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);
+ 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 = -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;
+ 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 <typename btConvexTemplate>
-static void btFindPenetr(const btConvexTemplate& a, const btConvexTemplate& b,
- const btMprCollisionDescription& colDesc,
- btMprSimplex_t *portal,
- float *depth, btVector3 *pdir, btVector3 *pos)
+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 dir;
+ btMprSupport_t v4;
+ unsigned long iterations;
- btVector3 zero = btVector3(0,0,0);
- btVector3* origin = &zero;
+ btVector3 zero = btVector3(0, 0, 0);
+ btVector3 *origin = &zero;
-
- iterations = 1UL;
- for (int i=0;i<BT_MPR_MAX_ITERATIONS;i++)
- //while (1)
+ 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);
+ // 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)
+ // 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);
-
+ *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);
+ // barycentric coordinates:
+ btFindPos(portal, pos);
- return;
- }
+ return;
+ }
- btExpandPortal(portal, &v4);
+ btExpandPortal(portal, &v4);
- iterations++;
- }
+ iterations++;
+ }
}
-static void btFindPenetrTouch(btMprSimplex_t *portal,float *depth, btVector3 *dir, btVector3 *pos)
+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;
-
+ // 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);
+ btMprVec3Copy(pos, &btMprSimplexPoint(portal, 1)->v1);
+ btMprVec3Add(pos, &btMprSimplexPoint(portal, 1)->v2);
+ btMprVec3Scale(pos, 0.5);
#else
- btMprVec3Copy(pos, &btMprSimplexPoint(portal, 1)->v2);
+ btMprVec3Copy(pos, &btMprSimplexPoint(portal, 1)->v2);
#endif
}
static void btFindPenetrSegment(btMprSimplex_t *portal,
- float *depth, btVector3 *dir, btVector3 *pos)
+ float *depth, btVector3 *dir, btVector3 *pos)
{
-
- // Origin lies on v0-v1 segment.
- // Depth is distance to v1, direction also and position must be
- // computed
+ // 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);
+ 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);
+ 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 <typename btConvexTemplate>
-inline int btMprPenetration( const btConvexTemplate& a, const btConvexTemplate& b,
- const btMprCollisionDescription& colDesc,
- float *depthOut, btVector3* dirOut, btVector3* posOut)
+inline int btMprPenetration(const btConvexTemplate &a, const btConvexTemplate &b,
+ const btMprCollisionDescription &colDesc,
+ float *depthOut, btVector3 *dirOut, btVector3 *posOut)
{
-
- btMprSimplex_t portal;
+ btMprSimplex_t portal;
+ // Phase 1: Portal discovery
+ int result = btDiscoverPortal(a, b, colDesc, &portal);
- // Phase 1: Portal discovery
- int result = btDiscoverPortal(a,b,colDesc, &portal);
-
-
//sepAxis[pairIndex] = *pdir;//or -dir?
switch (result)
{
- case 0:
+ case 0:
{
// Phase 2: Portal refinement
-
- result = btRefinePortal(a,b,colDesc, &portal);
+
+ result = btRefinePortal(a, b, colDesc, &portal);
if (result < 0)
return -1;
// Phase 3. Penetration info
- btFindPenetr(a,b,colDesc, &portal, depthOut, dirOut, posOut);
-
-
+ btFindPenetr(a, b, colDesc, &portal, depthOut, dirOut, posOut);
+
break;
}
- case 1:
+ case 1:
{
- // Touching contact on portal's v1.
+ // Touching contact on portal's v1.
btFindPenetrTouch(&portal, depthOut, dirOut, posOut);
- result=0;
+ result = 0;
break;
}
- case 2:
+ case 2:
{
-
- btFindPenetrSegment( &portal, depthOut, dirOut, posOut);
- result=0;
+ btFindPenetrSegment(&portal, depthOut, dirOut, posOut);
+ result = 0;
break;
}
- default:
+ default:
{
//if (res < 0)
//{
- // Origin isn't inside portal - no collision.
- result = -1;
+ // Origin isn't inside portal - no collision.
+ result = -1;
//}
}
};
-
+
return result;
};
-
-template<typename btConvexTemplate, typename btMprDistanceTemplate>
-inline int btComputeMprPenetration( const btConvexTemplate& a, const btConvexTemplate& b, const
- btMprCollisionDescription& colDesc, btMprDistanceTemplate* distInfo)
+template <typename btConvexTemplate, typename btMprDistanceTemplate>
+inline int btComputeMprPenetration(const btConvexTemplate &a, const btConvexTemplate &b, const btMprCollisionDescription &colDesc, btMprDistanceTemplate *distInfo)
{
- btVector3 dir,pos;
+ btVector3 dir, pos;
float depth;
- int res = btMprPenetration(a,b,colDesc,&depth, &dir, &pos);
- if (res==0)
+ 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;
+ distInfo->m_pointOnA = pos - distInfo->m_distance * dir;
return 0;
}
return -1;
}
-
-
-#endif //BT_MPR_PENETRATION_H
+#endif //BT_MPR_PENETRATION_H
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp
index 9603a8bbdc..f1422cad4d 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp
@@ -13,7 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btPersistentManifold.h"
#include "LinearMath/btTransform.h"
#include "LinearMath/btSerializer.h"
@@ -24,83 +23,76 @@ subject to the following restrictions:
#define btCollisionObjectData btCollisionObjectFloatData
#endif
-btScalar gContactBreakingThreshold = btScalar(0.02);
-ContactDestroyedCallback gContactDestroyedCallback = 0;
-ContactProcessedCallback gContactProcessedCallback = 0;
-ContactStartedCallback gContactStartedCallback = 0;
-ContactEndedCallback gContactEndedCallback = 0;
+btScalar gContactBreakingThreshold = btScalar(0.02);
+ContactDestroyedCallback gContactDestroyedCallback = 0;
+ContactProcessedCallback gContactProcessedCallback = 0;
+ContactStartedCallback gContactStartedCallback = 0;
+ContactEndedCallback gContactEndedCallback = 0;
///gContactCalcArea3Points will approximate the convex hull area using 3 points
///when setting it to false, it will use 4 points to compute the area: it is more accurate but slower
-bool gContactCalcArea3Points = true;
-
+bool gContactCalcArea3Points = true;
btPersistentManifold::btPersistentManifold()
-:btTypedObject(BT_PERSISTENT_MANIFOLD_TYPE),
-m_body0(0),
-m_body1(0),
-m_cachedPoints (0),
-m_companionIdA(0),
-m_companionIdB(0),
-m_index1a(0)
+ : btTypedObject(BT_PERSISTENT_MANIFOLD_TYPE),
+ m_body0(0),
+ m_body1(0),
+ m_cachedPoints(0),
+ m_companionIdA(0),
+ m_companionIdB(0),
+ m_index1a(0)
{
}
-
-
-
#ifdef DEBUG_PERSISTENCY
#include <stdio.h>
-void btPersistentManifold::DebugPersistency()
+void btPersistentManifold::DebugPersistency()
{
int i;
- printf("DebugPersistency : numPoints %d\n",m_cachedPoints);
- for (i=0;i<m_cachedPoints;i++)
+ printf("DebugPersistency : numPoints %d\n", m_cachedPoints);
+ for (i = 0; i < m_cachedPoints; i++)
{
- printf("m_pointCache[%d].m_userPersistentData = %x\n",i,m_pointCache[i].m_userPersistentData);
+ printf("m_pointCache[%d].m_userPersistentData = %x\n", i, m_pointCache[i].m_userPersistentData);
}
}
-#endif //DEBUG_PERSISTENCY
+#endif //DEBUG_PERSISTENCY
void btPersistentManifold::clearUserCache(btManifoldPoint& pt)
{
-
void* oldPtr = pt.m_userPersistentData;
if (oldPtr)
{
#ifdef DEBUG_PERSISTENCY
int i;
int occurance = 0;
- for (i=0;i<m_cachedPoints;i++)
+ for (i = 0; i < m_cachedPoints; i++)
{
if (m_pointCache[i].m_userPersistentData == oldPtr)
{
occurance++;
- if (occurance>1)
+ if (occurance > 1)
printf("error in clearUserCache\n");
}
}
- btAssert(occurance<=0);
-#endif //DEBUG_PERSISTENCY
+ btAssert(occurance <= 0);
+#endif //DEBUG_PERSISTENCY
if (pt.m_userPersistentData && gContactDestroyedCallback)
{
(*gContactDestroyedCallback)(pt.m_userPersistentData);
pt.m_userPersistentData = 0;
}
-
+
#ifdef DEBUG_PERSISTENCY
DebugPersistency();
#endif
}
-
-
}
-static inline btScalar calcArea4Points(const btVector3 &p0,const btVector3 &p1,const btVector3 &p2,const btVector3 &p3)
+static inline btScalar calcArea4Points(const btVector3& p0, const btVector3& p1, const btVector3& p2, const btVector3& p3)
{
// It calculates possible 3 area constructed from random 4 points and returns the biggest one.
- btVector3 a[3],b[3];
+ btVector3 a[3], b[3];
a[0] = p0 - p1;
a[1] = p0 - p2;
a[2] = p0 - p3;
@@ -113,100 +105,102 @@ static inline btScalar calcArea4Points(const btVector3 &p0,const btVector3 &p1,c
btVector3 tmp1 = a[1].cross(b[1]);
btVector3 tmp2 = a[2].cross(b[2]);
- return btMax(btMax(tmp0.length2(),tmp1.length2()),tmp2.length2());
+ return btMax(btMax(tmp0.length2(), tmp1.length2()), tmp2.length2());
}
-int btPersistentManifold::sortCachedPoints(const btManifoldPoint& pt)
+int btPersistentManifold::sortCachedPoints(const btManifoldPoint& pt)
{
- //calculate 4 possible cases areas, and take biggest area
- //also need to keep 'deepest'
-
- int maxPenetrationIndex = -1;
+ //calculate 4 possible cases areas, and take biggest area
+ //also need to keep 'deepest'
+
+ int maxPenetrationIndex = -1;
#define KEEP_DEEPEST_POINT 1
#ifdef KEEP_DEEPEST_POINT
- btScalar maxPenetration = pt.getDistance();
- for (int i=0;i<4;i++)
+ btScalar maxPenetration = pt.getDistance();
+ for (int i = 0; i < 4; i++)
+ {
+ if (m_pointCache[i].getDistance() < maxPenetration)
{
- if (m_pointCache[i].getDistance() < maxPenetration)
- {
- maxPenetrationIndex = i;
- maxPenetration = m_pointCache[i].getDistance();
- }
+ maxPenetrationIndex = i;
+ maxPenetration = m_pointCache[i].getDistance();
}
-#endif //KEEP_DEEPEST_POINT
-
- btScalar res0(btScalar(0.)),res1(btScalar(0.)),res2(btScalar(0.)),res3(btScalar(0.));
+ }
+#endif //KEEP_DEEPEST_POINT
+
+ btScalar res0(btScalar(0.)), res1(btScalar(0.)), res2(btScalar(0.)), res3(btScalar(0.));
if (gContactCalcArea3Points)
{
if (maxPenetrationIndex != 0)
{
- btVector3 a0 = pt.m_localPointA-m_pointCache[1].m_localPointA;
- btVector3 b0 = m_pointCache[3].m_localPointA-m_pointCache[2].m_localPointA;
+ btVector3 a0 = pt.m_localPointA - m_pointCache[1].m_localPointA;
+ btVector3 b0 = m_pointCache[3].m_localPointA - m_pointCache[2].m_localPointA;
btVector3 cross = a0.cross(b0);
res0 = cross.length2();
}
if (maxPenetrationIndex != 1)
{
- btVector3 a1 = pt.m_localPointA-m_pointCache[0].m_localPointA;
- btVector3 b1 = m_pointCache[3].m_localPointA-m_pointCache[2].m_localPointA;
+ btVector3 a1 = pt.m_localPointA - m_pointCache[0].m_localPointA;
+ btVector3 b1 = m_pointCache[3].m_localPointA - m_pointCache[2].m_localPointA;
btVector3 cross = a1.cross(b1);
res1 = cross.length2();
}
if (maxPenetrationIndex != 2)
{
- btVector3 a2 = pt.m_localPointA-m_pointCache[0].m_localPointA;
- btVector3 b2 = m_pointCache[3].m_localPointA-m_pointCache[1].m_localPointA;
+ btVector3 a2 = pt.m_localPointA - m_pointCache[0].m_localPointA;
+ btVector3 b2 = m_pointCache[3].m_localPointA - m_pointCache[1].m_localPointA;
btVector3 cross = a2.cross(b2);
res2 = cross.length2();
}
if (maxPenetrationIndex != 3)
{
- btVector3 a3 = pt.m_localPointA-m_pointCache[0].m_localPointA;
- btVector3 b3 = m_pointCache[2].m_localPointA-m_pointCache[1].m_localPointA;
+ btVector3 a3 = pt.m_localPointA - m_pointCache[0].m_localPointA;
+ btVector3 b3 = m_pointCache[2].m_localPointA - m_pointCache[1].m_localPointA;
btVector3 cross = a3.cross(b3);
res3 = cross.length2();
}
- }
+ }
else
{
- if(maxPenetrationIndex != 0) {
- res0 = calcArea4Points(pt.m_localPointA,m_pointCache[1].m_localPointA,m_pointCache[2].m_localPointA,m_pointCache[3].m_localPointA);
+ if (maxPenetrationIndex != 0)
+ {
+ res0 = calcArea4Points(pt.m_localPointA, m_pointCache[1].m_localPointA, m_pointCache[2].m_localPointA, m_pointCache[3].m_localPointA);
}
- if(maxPenetrationIndex != 1) {
- res1 = calcArea4Points(pt.m_localPointA,m_pointCache[0].m_localPointA,m_pointCache[2].m_localPointA,m_pointCache[3].m_localPointA);
+ if (maxPenetrationIndex != 1)
+ {
+ res1 = calcArea4Points(pt.m_localPointA, m_pointCache[0].m_localPointA, m_pointCache[2].m_localPointA, m_pointCache[3].m_localPointA);
}
- if(maxPenetrationIndex != 2) {
- res2 = calcArea4Points(pt.m_localPointA,m_pointCache[0].m_localPointA,m_pointCache[1].m_localPointA,m_pointCache[3].m_localPointA);
+ if (maxPenetrationIndex != 2)
+ {
+ res2 = calcArea4Points(pt.m_localPointA, m_pointCache[0].m_localPointA, m_pointCache[1].m_localPointA, m_pointCache[3].m_localPointA);
}
- if(maxPenetrationIndex != 3) {
- res3 = calcArea4Points(pt.m_localPointA,m_pointCache[0].m_localPointA,m_pointCache[1].m_localPointA,m_pointCache[2].m_localPointA);
+ if (maxPenetrationIndex != 3)
+ {
+ res3 = calcArea4Points(pt.m_localPointA, m_pointCache[0].m_localPointA, m_pointCache[1].m_localPointA, m_pointCache[2].m_localPointA);
}
}
- btVector4 maxvec(res0,res1,res2,res3);
+ btVector4 maxvec(res0, res1, res2, res3);
int biggestarea = maxvec.closestAxis4();
return biggestarea;
-
}
-
int btPersistentManifold::getCacheEntry(const btManifoldPoint& newPoint) const
{
- btScalar shortestDist = getContactBreakingThreshold() * getContactBreakingThreshold();
+ btScalar shortestDist = getContactBreakingThreshold() * getContactBreakingThreshold();
int size = getNumContacts();
int nearestPoint = -1;
- for( int i = 0; i < size; i++ )
+ for (int i = 0; i < size; i++)
{
- const btManifoldPoint &mp = m_pointCache[i];
+ const btManifoldPoint& mp = m_pointCache[i];
- btVector3 diffA = mp.m_localPointA- newPoint.m_localPointA;
+ btVector3 diffA = mp.m_localPointA - newPoint.m_localPointA;
const btScalar distToManiPoint = diffA.dot(diffA);
- if( distToManiPoint < shortestDist )
+ if (distToManiPoint < shortestDist)
{
shortestDist = distToManiPoint;
nearestPoint = i;
@@ -221,7 +215,7 @@ int btPersistentManifold::addManifoldPoint(const btManifoldPoint& newPoint, bool
{
btAssert(validContactDistance(newPoint));
}
-
+
int insertIndex = getNumContacts();
if (insertIndex == MANIFOLD_CACHE_SIZE)
{
@@ -232,91 +226,87 @@ int btPersistentManifold::addManifoldPoint(const btManifoldPoint& newPoint, bool
insertIndex = 0;
#endif
clearUserCache(m_pointCache[insertIndex]);
-
- } else
+ }
+ else
{
m_cachedPoints++;
-
-
}
- if (insertIndex<0)
- insertIndex=0;
+ if (insertIndex < 0)
+ insertIndex = 0;
- btAssert(m_pointCache[insertIndex].m_userPersistentData==0);
+ btAssert(m_pointCache[insertIndex].m_userPersistentData == 0);
m_pointCache[insertIndex] = newPoint;
return insertIndex;
}
-btScalar btPersistentManifold::getContactBreakingThreshold() const
+btScalar btPersistentManifold::getContactBreakingThreshold() const
{
return m_contactBreakingThreshold;
}
-
-
-void btPersistentManifold::refreshContactPoints(const btTransform& trA,const btTransform& trB)
+void btPersistentManifold::refreshContactPoints(const btTransform& trA, const btTransform& trB)
{
int i;
#ifdef DEBUG_PERSISTENCY
printf("refreshContactPoints posA = (%f,%f,%f) posB = (%f,%f,%f)\n",
- trA.getOrigin().getX(),
- trA.getOrigin().getY(),
- trA.getOrigin().getZ(),
- trB.getOrigin().getX(),
- trB.getOrigin().getY(),
- trB.getOrigin().getZ());
-#endif //DEBUG_PERSISTENCY
+ trA.getOrigin().getX(),
+ trA.getOrigin().getY(),
+ trA.getOrigin().getZ(),
+ trB.getOrigin().getX(),
+ trB.getOrigin().getY(),
+ trB.getOrigin().getZ());
+#endif //DEBUG_PERSISTENCY
/// first refresh worldspace positions and distance
- for (i=getNumContacts()-1;i>=0;i--)
+ for (i = getNumContacts() - 1; i >= 0; i--)
{
- btManifoldPoint &manifoldPoint = m_pointCache[i];
- manifoldPoint.m_positionWorldOnA = trA( manifoldPoint.m_localPointA );
- manifoldPoint.m_positionWorldOnB = trB( manifoldPoint.m_localPointB );
- manifoldPoint.m_distance1 = (manifoldPoint.m_positionWorldOnA - manifoldPoint.m_positionWorldOnB).dot(manifoldPoint.m_normalWorldOnB);
+ btManifoldPoint& manifoldPoint = m_pointCache[i];
+ manifoldPoint.m_positionWorldOnA = trA(manifoldPoint.m_localPointA);
+ manifoldPoint.m_positionWorldOnB = trB(manifoldPoint.m_localPointB);
+ manifoldPoint.m_distance1 = (manifoldPoint.m_positionWorldOnA - manifoldPoint.m_positionWorldOnB).dot(manifoldPoint.m_normalWorldOnB);
manifoldPoint.m_lifeTime++;
}
- /// then
+ /// then
btScalar distance2d;
- btVector3 projectedDifference,projectedPoint;
- for (i=getNumContacts()-1;i>=0;i--)
+ btVector3 projectedDifference, projectedPoint;
+ for (i = getNumContacts() - 1; i >= 0; i--)
{
-
- btManifoldPoint &manifoldPoint = m_pointCache[i];
+ btManifoldPoint& manifoldPoint = m_pointCache[i];
//contact becomes invalid when signed distance exceeds margin (projected on contactnormal direction)
if (!validContactDistance(manifoldPoint))
{
removeContactPoint(i);
- } else
+ }
+ else
{
- //todo: friction anchor may require the contact to be around a bit longer
+ //todo: friction anchor may require the contact to be around a bit longer
//contact also becomes invalid when relative movement orthogonal to normal exceeds margin
projectedPoint = manifoldPoint.m_positionWorldOnA - manifoldPoint.m_normalWorldOnB * manifoldPoint.m_distance1;
projectedDifference = manifoldPoint.m_positionWorldOnB - projectedPoint;
distance2d = projectedDifference.dot(projectedDifference);
- if (distance2d > getContactBreakingThreshold()*getContactBreakingThreshold() )
+ if (distance2d > getContactBreakingThreshold() * getContactBreakingThreshold())
{
removeContactPoint(i);
- } else
+ }
+ else
{
//contact point processed callback
if (gContactProcessedCallback)
- (*gContactProcessedCallback)(manifoldPoint,(void*)m_body0,(void*)m_body1);
+ (*gContactProcessedCallback)(manifoldPoint, (void*)m_body0, (void*)m_body1);
}
}
}
#ifdef DEBUG_PERSISTENCY
DebugPersistency();
-#endif //
+#endif //
}
-
-int btPersistentManifold::calculateSerializeBufferSize() const
+int btPersistentManifold::calculateSerializeBufferSize() const
{
return sizeof(btPersistentManifoldData);
}
-const char* btPersistentManifold::serialize(const class btPersistentManifold* manifold, void* dataBuffer, class btSerializer* serializer) const
+const char* btPersistentManifold::serialize(const class btPersistentManifold* manifold, void* dataBuffer, class btSerializer* serializer) const
{
btPersistentManifoldData* dataOut = (btPersistentManifoldData*)dataBuffer;
memset(dataOut, 0, sizeof(btPersistentManifoldData));
@@ -379,7 +369,7 @@ void btPersistentManifold::deSerialize(const struct btPersistentManifoldDoubleDa
for (int i = 0; i < this->getNumContacts(); i++)
{
btManifoldPoint& pt = m_pointCache[i];
-
+
pt.m_appliedImpulse = manifoldDataPtr->m_pointCacheAppliedImpulse[i];
pt.m_appliedImpulseLateral1 = manifoldDataPtr->m_pointCacheAppliedImpulseLateral1[i];
pt.m_appliedImpulseLateral2 = manifoldDataPtr->m_pointCacheAppliedImpulseLateral2[i];
@@ -409,7 +399,6 @@ void btPersistentManifold::deSerialize(const struct btPersistentManifoldDoubleDa
pt.m_contactMotion1 = manifoldDataPtr->m_pointCacheContactMotion1[i];
pt.m_contactMotion2 = manifoldDataPtr->m_pointCacheContactMotion2[i];
}
-
}
void btPersistentManifold::deSerialize(const struct btPersistentManifoldFloatData* manifoldDataPtr)
@@ -455,5 +444,4 @@ void btPersistentManifold::deSerialize(const struct btPersistentManifoldFloatDat
pt.m_contactMotion1 = manifoldDataPtr->m_pointCacheContactMotion1[i];
pt.m_contactMotion2 = manifoldDataPtr->m_pointCacheContactMotion2[i];
}
-
} \ No newline at end of file
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h
index 67be0c48eb..8a9134c95c 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h
@@ -16,7 +16,6 @@ subject to the following restrictions:
#ifndef BT_PERSISTENT_MANIFOLD_H
#define BT_PERSISTENT_MANIFOLD_H
-
#include "LinearMath/btVector3.h"
#include "LinearMath/btTransform.h"
#include "btManifoldPoint.h"
@@ -34,14 +33,14 @@ extern btScalar gContactBreakingThreshold;
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;
+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
+#endif //SWIG
//the enum starts at 1024 to avoid type conflicts with btTypedConstraint
enum btContactManifoldTypes
@@ -60,73 +59,74 @@ enum btContactManifoldTypes
///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
+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;
+ int m_cachedPoints;
- btScalar m_contactBreakingThreshold;
- btScalar m_contactProcessingThreshold;
+ btScalar m_contactBreakingThreshold;
+ btScalar m_contactProcessingThreshold;
-
/// sort cached points so most isolated points come first
- int sortCachedPoints(const btManifoldPoint& pt);
+ int sortCachedPoints(const btManifoldPoint& pt);
- int findContactPoint(const btManifoldPoint* unUsed, int numUnused,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_companionIdA;
+ int m_companionIdB;
int m_index1a;
btPersistentManifold();
- btPersistentManifold(const btCollisionObject* body0,const btCollisionObject* body1,int , btScalar contactBreakingThreshold,btScalar contactProcessingThreshold)
+ 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)
+ 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;}
+ 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)
+ void setBodies(const btCollisionObject* body0, const btCollisionObject* body1)
{
m_body0 = body0;
m_body1 = body1;
}
- void clearUserCache(btManifoldPoint& pt);
+ void clearUserCache(btManifoldPoint & pt);
#ifdef DEBUG_PERSISTENCY
- void DebugPersistency();
-#endif //
-
- SIMD_FORCE_INLINE int getNumContacts() const { return m_cachedPoints;}
+ 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);
@@ -140,39 +140,36 @@ public:
}
///@todo: get this margin from the current physics / collision environment
- btScalar getContactBreakingThreshold() const;
+ btScalar getContactBreakingThreshold() const;
- btScalar getContactProcessingThreshold() const
+ btScalar getContactProcessingThreshold() const
{
return m_contactProcessingThreshold;
}
-
+
void setContactBreakingThreshold(btScalar contactBreakingThreshold)
{
m_contactBreakingThreshold = contactBreakingThreshold;
}
- void setContactProcessingThreshold(btScalar contactProcessingThreshold)
+ void setContactProcessingThreshold(btScalar contactProcessingThreshold)
{
m_contactProcessingThreshold = contactProcessingThreshold;
}
-
-
-
int getCacheEntry(const btManifoldPoint& newPoint) const;
- int addManifoldPoint( const btManifoldPoint& newPoint, bool isPredictive=false);
+ int addManifoldPoint(const btManifoldPoint& newPoint, bool isPredictive = false);
- void removeContactPoint (int index)
+ 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];
+ if (index != lastUsedIndex)
{
- m_pointCache[index] = m_pointCache[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;
@@ -182,7 +179,7 @@ public:
m_pointCache[lastUsedIndex].m_lifeTime = 0;
}
- btAssert(m_pointCache[lastUsedIndex].m_userPersistentData==0);
+ btAssert(m_pointCache[lastUsedIndex].m_userPersistentData == 0);
m_cachedPoints--;
if (gContactEndedCallback && m_cachedPoints == 0)
@@ -243,13 +240,12 @@ public:
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);
+ void refreshContactPoints(const btTransform& trA, const btTransform& trB);
-
- SIMD_FORCE_INLINE void clearManifold()
+ SIMD_FORCE_INLINE void clearManifold()
{
int i;
- for (i=0;i<m_cachedPoints;i++)
+ for (i = 0; i < m_cachedPoints; i++)
{
clearUserCache(m_pointCache[i]);
}
@@ -261,15 +257,13 @@ public:
m_cachedPoints = 0;
}
- int calculateSerializeBufferSize() const;
- const char* serialize(const class btPersistentManifold* manifold, void* dataBuffer, class btSerializer* serializer) const;
+ 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
{
@@ -362,17 +356,14 @@ struct btPersistentManifoldFloatData
btCollisionObjectFloatData *m_body1;
};
+// clang-format on
+
#ifdef BT_USE_DOUBLE_PRECISION
-#define btPersistentManifoldData btPersistentManifoldDoubleData
-#define btPersistentManifoldDataName "btPersistentManifoldDoubleData"
+#define btPersistentManifoldData btPersistentManifoldDoubleData
+#define btPersistentManifoldDataName "btPersistentManifoldDoubleData"
#else
-#define btPersistentManifoldData btPersistentManifoldFloatData
-#define btPersistentManifoldDataName "btPersistentManifoldFloatData"
-#endif //BT_USE_DOUBLE_PRECISION
-
-
-
-
-
+#define btPersistentManifoldData btPersistentManifoldFloatData
+#define btPersistentManifoldDataName "btPersistentManifoldFloatData"
+#endif //BT_USE_DOUBLE_PRECISION
-#endif //BT_PERSISTENT_MANIFOLD_H
+#endif //BT_PERSISTENT_MANIFOLD_H
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btPointCollector.h b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btPointCollector.h
index 18da171011..0900eb6e85 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btPointCollector.h
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btPointCollector.h
@@ -18,38 +18,33 @@ subject to the following restrictions:
#include "btDiscreteCollisionDetectorInterface.h"
-
-
struct btPointCollector : public btDiscreteCollisionDetectorInterface::Result
{
-
-
btVector3 m_normalOnBInWorld;
btVector3 m_pointInWorld;
- btScalar m_distance;//negative means penetration
+ btScalar m_distance; //negative means penetration
- bool m_hasResult;
+ bool m_hasResult;
- btPointCollector ()
- : m_distance(btScalar(BT_LARGE_FLOAT)),m_hasResult(false)
+ btPointCollector()
+ : m_distance(btScalar(BT_LARGE_FLOAT)), m_hasResult(false)
{
}
- virtual void setShapeIdentifiersA(int partId0,int index0)
+ virtual void setShapeIdentifiersA(int partId0, int index0)
{
(void)partId0;
(void)index0;
-
}
- virtual void setShapeIdentifiersB(int partId1,int index1)
+ virtual void setShapeIdentifiersB(int partId1, int index1)
{
(void)partId1;
(void)index1;
}
- virtual void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar depth)
+ virtual void addContactPoint(const btVector3& normalOnBInWorld, const btVector3& pointInWorld, btScalar depth)
{
- if (depth< m_distance)
+ if (depth < m_distance)
{
m_hasResult = true;
m_normalOnBInWorld = normalOnBInWorld;
@@ -60,5 +55,4 @@ struct btPointCollector : public btDiscreteCollisionDetectorInterface::Result
}
};
-#endif //BT_POINT_COLLECTOR_H
-
+#endif //BT_POINT_COLLECTOR_H
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.cpp b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.cpp
index ea380bc5f1..9d1836037d 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.cpp
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.cpp
@@ -13,45 +13,42 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
///This file was written by Erwin Coumans
///Separating axis rest based on work from Pierre Terdiman, see
///And contact clipping based on work from Simon Hobbs
-
#include "btPolyhedralContactClipping.h"
#include "BulletCollision/CollisionShapes/btConvexPolyhedron.h"
-#include <float.h> //for FLT_MAX
+#include <float.h> //for FLT_MAX
-int gExpectedNbTests=0;
+int gExpectedNbTests = 0;
int gActualNbTests = 0;
bool gUseInternalObject = true;
// Clips a face to the back of a plane
-void btPolyhedralContactClipping::clipFace(const btVertexArray& pVtxIn, btVertexArray& ppVtxOut, const btVector3& planeNormalWS,btScalar planeEqWS)
+void btPolyhedralContactClipping::clipFace(const btVertexArray& pVtxIn, btVertexArray& ppVtxOut, const btVector3& planeNormalWS, btScalar planeEqWS)
{
-
int ve;
btScalar ds, de;
int numVerts = pVtxIn.size();
if (numVerts < 2)
return;
- btVector3 firstVertex=pVtxIn[pVtxIn.size()-1];
+ btVector3 firstVertex = pVtxIn[pVtxIn.size() - 1];
btVector3 endVertex = pVtxIn[0];
-
- ds = planeNormalWS.dot(firstVertex)+planeEqWS;
+
+ ds = planeNormalWS.dot(firstVertex) + planeEqWS;
for (ve = 0; ve < numVerts; ve++)
{
- endVertex=pVtxIn[ve];
+ endVertex = pVtxIn[ve];
- de = planeNormalWS.dot(endVertex)+planeEqWS;
+ de = planeNormalWS.dot(endVertex) + planeEqWS;
- if (ds<0)
+ if (ds < 0)
{
- if (de<0)
+ if (de < 0)
{
// Start < 0, end < 0, so output endVertex
ppVtxOut.push_back(endVertex);
@@ -59,15 +56,15 @@ void btPolyhedralContactClipping::clipFace(const btVertexArray& pVtxIn, btVertex
else
{
// Start < 0, end >= 0, so output intersection
- ppVtxOut.push_back( firstVertex.lerp(endVertex,btScalar(ds * 1.f/(ds - de))));
+ ppVtxOut.push_back(firstVertex.lerp(endVertex, btScalar(ds * 1.f / (ds - de))));
}
}
else
{
- if (de<0)
+ if (de < 0)
{
// Start >= 0, end < 0 so output intersection and end
- ppVtxOut.push_back(firstVertex.lerp(endVertex,btScalar(ds * 1.f/(ds - de))));
+ ppVtxOut.push_back(firstVertex.lerp(endVertex, btScalar(ds * 1.f / (ds - de))));
ppVtxOut.push_back(endVertex);
}
}
@@ -76,47 +73,44 @@ void btPolyhedralContactClipping::clipFace(const btVertexArray& pVtxIn, btVertex
}
}
-
-static bool TestSepAxis(const btConvexPolyhedron& hullA, const btConvexPolyhedron& hullB, const btTransform& transA,const btTransform& transB, const btVector3& sep_axis, btScalar& depth, btVector3& witnessPointA, btVector3& witnessPointB)
+static bool TestSepAxis(const btConvexPolyhedron& hullA, const btConvexPolyhedron& hullB, const btTransform& transA, const btTransform& transB, const btVector3& sep_axis, btScalar& depth, btVector3& witnessPointA, btVector3& witnessPointB)
{
- btScalar Min0,Max0;
- btScalar Min1,Max1;
- btVector3 witnesPtMinA,witnesPtMaxA;
- btVector3 witnesPtMinB,witnesPtMaxB;
+ btScalar Min0, Max0;
+ btScalar Min1, Max1;
+ btVector3 witnesPtMinA, witnesPtMaxA;
+ btVector3 witnesPtMinB, witnesPtMaxB;
- hullA.project(transA,sep_axis, Min0, Max0,witnesPtMinA,witnesPtMaxA);
- hullB.project(transB, sep_axis, Min1, Max1,witnesPtMinB,witnesPtMaxB);
+ hullA.project(transA, sep_axis, Min0, Max0, witnesPtMinA, witnesPtMaxA);
+ hullB.project(transB, sep_axis, Min1, Max1, witnesPtMinB, witnesPtMaxB);
- if(Max0<Min1 || Max1<Min0)
+ if (Max0 < Min1 || Max1 < Min0)
return false;
btScalar d0 = Max0 - Min1;
- btAssert(d0>=0.0f);
+ btAssert(d0 >= 0.0f);
btScalar d1 = Max1 - Min0;
- btAssert(d1>=0.0f);
- if (d0<d1)
+ btAssert(d1 >= 0.0f);
+ if (d0 < d1)
{
depth = d0;
witnessPointA = witnesPtMaxA;
witnessPointB = witnesPtMinB;
-
- } else
+ }
+ else
{
depth = d1;
witnessPointA = witnesPtMinA;
witnessPointB = witnesPtMaxB;
}
-
+
return true;
}
-
-
-static int gActualSATPairTests=0;
+static int gActualSATPairTests = 0;
inline bool IsAlmostZero(const btVector3& v)
{
- if(btFabs(v.x())>1e-6 || btFabs(v.y())>1e-6 || btFabs(v.z())>1e-6) return false;
+ if (btFabs(v.x()) > 1e-6 || btFabs(v.y()) > 1e-6 || btFabs(v.z()) > 1e-6) return false;
return true;
}
@@ -125,9 +119,9 @@ inline bool IsAlmostZero(const btVector3& v)
inline void BoxSupport(const btScalar extents[3], const btScalar sv[3], btScalar p[3])
{
// This version is ~11.000 cycles (4%) faster overall in one of the tests.
-// IR(p[0]) = IR(extents[0])|(IR(sv[0])&SIGN_BITMASK);
-// IR(p[1]) = IR(extents[1])|(IR(sv[1])&SIGN_BITMASK);
-// IR(p[2]) = IR(extents[2])|(IR(sv[2])&SIGN_BITMASK);
+ // IR(p[0]) = IR(extents[0])|(IR(sv[0])&SIGN_BITMASK);
+ // IR(p[1]) = IR(extents[1])|(IR(sv[1])&SIGN_BITMASK);
+ // IR(p[2]) = IR(extents[2])|(IR(sv[2])&SIGN_BITMASK);
p[0] = sv[0] < 0.0f ? -extents[0] : extents[0];
p[1] = sv[1] < 0.0f ? -extents[1] : extents[1];
p[2] = sv[2] < 0.0f ? -extents[2] : extents[2];
@@ -140,90 +134,94 @@ void InverseTransformPoint3x3(btVector3& out, const btVector3& in, const btTrans
const btVector3& r1 = rot[1];
const btVector3& r2 = rot[2];
- const btScalar x = r0.x()*in.x() + r1.x()*in.y() + r2.x()*in.z();
- const btScalar y = r0.y()*in.x() + r1.y()*in.y() + r2.y()*in.z();
- const btScalar z = r0.z()*in.x() + r1.z()*in.y() + r2.z()*in.z();
+ const btScalar x = r0.x() * in.x() + r1.x() * in.y() + r2.x() * in.z();
+ const btScalar y = r0.y() * in.x() + r1.y() * in.y() + r2.y() * in.z();
+ const btScalar z = r0.z() * in.x() + r1.z() * in.y() + r2.z() * in.z();
out.setValue(x, y, z);
}
- bool TestInternalObjects( const btTransform& trans0, const btTransform& trans1, const btVector3& delta_c, const btVector3& axis, const btConvexPolyhedron& convex0, const btConvexPolyhedron& convex1, btScalar dmin)
+bool TestInternalObjects(const btTransform& trans0, const btTransform& trans1, const btVector3& delta_c, const btVector3& axis, const btConvexPolyhedron& convex0, const btConvexPolyhedron& convex1, btScalar dmin)
{
const btScalar dp = delta_c.dot(axis);
btVector3 localAxis0;
- InverseTransformPoint3x3(localAxis0, axis,trans0);
+ InverseTransformPoint3x3(localAxis0, axis, trans0);
btVector3 localAxis1;
- InverseTransformPoint3x3(localAxis1, axis,trans1);
+ InverseTransformPoint3x3(localAxis1, axis, trans1);
btScalar p0[3];
BoxSupport(convex0.m_extents, localAxis0, p0);
btScalar p1[3];
BoxSupport(convex1.m_extents, localAxis1, p1);
- const btScalar Radius0 = p0[0]*localAxis0.x() + p0[1]*localAxis0.y() + p0[2]*localAxis0.z();
- const btScalar Radius1 = p1[0]*localAxis1.x() + p1[1]*localAxis1.y() + p1[2]*localAxis1.z();
+ const btScalar Radius0 = p0[0] * localAxis0.x() + p0[1] * localAxis0.y() + p0[2] * localAxis0.z();
+ const btScalar Radius1 = p1[0] * localAxis1.x() + p1[1] * localAxis1.y() + p1[2] * localAxis1.z();
- const btScalar MinRadius = Radius0>convex0.m_radius ? Radius0 : convex0.m_radius;
- const btScalar MaxRadius = Radius1>convex1.m_radius ? Radius1 : convex1.m_radius;
+ const btScalar MinRadius = Radius0 > convex0.m_radius ? Radius0 : convex0.m_radius;
+ const btScalar MaxRadius = Radius1 > convex1.m_radius ? Radius1 : convex1.m_radius;
const btScalar MinMaxRadius = MaxRadius + MinRadius;
const btScalar d0 = MinMaxRadius + dp;
const btScalar d1 = MinMaxRadius - dp;
- const btScalar depth = d0<d1 ? d0:d1;
- if(depth>dmin)
+ const btScalar depth = d0 < d1 ? d0 : d1;
+ if (depth > dmin)
return false;
return true;
}
-#endif //TEST_INTERNAL_OBJECTS
+#endif //TEST_INTERNAL_OBJECTS
-
-
- SIMD_FORCE_INLINE void btSegmentsClosestPoints(
+SIMD_FORCE_INLINE void btSegmentsClosestPoints(
btVector3& ptsVector,
btVector3& offsetA,
btVector3& offsetB,
btScalar& tA, btScalar& tB,
const btVector3& translation,
const btVector3& dirA, btScalar hlenA,
- const btVector3& dirB, btScalar hlenB )
+ const btVector3& dirB, btScalar hlenB)
{
// compute the parameters of the closest points on each line segment
- btScalar dirA_dot_dirB = btDot(dirA,dirB);
- btScalar dirA_dot_trans = btDot(dirA,translation);
- btScalar dirB_dot_trans = btDot(dirB,translation);
+ btScalar dirA_dot_dirB = btDot(dirA, dirB);
+ btScalar dirA_dot_trans = btDot(dirA, translation);
+ btScalar dirB_dot_trans = btDot(dirB, translation);
btScalar denom = 1.0f - dirA_dot_dirB * dirA_dot_dirB;
- if ( denom == 0.0f ) {
+ if (denom == 0.0f)
+ {
tA = 0.0f;
- } else {
- tA = ( dirA_dot_trans - dirB_dot_trans * dirA_dot_dirB ) / denom;
- if ( tA < -hlenA )
+ }
+ else
+ {
+ tA = (dirA_dot_trans - dirB_dot_trans * dirA_dot_dirB) / denom;
+ if (tA < -hlenA)
tA = -hlenA;
- else if ( tA > hlenA )
+ else if (tA > hlenA)
tA = hlenA;
}
tB = tA * dirA_dot_dirB - dirB_dot_trans;
- if ( tB < -hlenB ) {
+ if (tB < -hlenB)
+ {
tB = -hlenB;
tA = tB * dirA_dot_dirB + dirA_dot_trans;
- if ( tA < -hlenA )
+ if (tA < -hlenA)
tA = -hlenA;
- else if ( tA > hlenA )
+ else if (tA > hlenA)
tA = hlenA;
- } else if ( tB > hlenB ) {
+ }
+ else if (tB > hlenB)
+ {
tB = hlenB;
tA = tB * dirA_dot_dirB + dirA_dot_trans;
- if ( tA < -hlenA )
+ if (tA < -hlenA)
tA = -hlenA;
- else if ( tA > hlenA )
+ else if (tA > hlenA)
tA = hlenA;
}
@@ -235,44 +233,42 @@ void InverseTransformPoint3x3(btVector3& out, const btVector3& in, const btTrans
ptsVector = translation - offsetA + offsetB;
}
-
-
-bool btPolyhedralContactClipping::findSeparatingAxis( const btConvexPolyhedron& hullA, const btConvexPolyhedron& hullB, const btTransform& transA,const btTransform& transB, btVector3& sep, btDiscreteCollisionDetectorInterface::Result& resultOut)
+bool btPolyhedralContactClipping::findSeparatingAxis(const btConvexPolyhedron& hullA, const btConvexPolyhedron& hullB, const btTransform& transA, const btTransform& transB, btVector3& sep, btDiscreteCollisionDetectorInterface::Result& resultOut)
{
gActualSATPairTests++;
-//#ifdef TEST_INTERNAL_OBJECTS
+ //#ifdef TEST_INTERNAL_OBJECTS
const btVector3 c0 = transA * hullA.m_localCenter;
const btVector3 c1 = transB * hullB.m_localCenter;
const btVector3 DeltaC2 = c0 - c1;
-//#endif
+ //#endif
btScalar dmin = FLT_MAX;
- int curPlaneTests=0;
+ int curPlaneTests = 0;
int numFacesA = hullA.m_faces.size();
// Test normals from hullA
- for(int i=0;i<numFacesA;i++)
+ for (int i = 0; i < numFacesA; i++)
{
const btVector3 Normal(hullA.m_faces[i].m_plane[0], hullA.m_faces[i].m_plane[1], hullA.m_faces[i].m_plane[2]);
btVector3 faceANormalWS = transA.getBasis() * Normal;
- if (DeltaC2.dot(faceANormalWS)<0)
- faceANormalWS*=-1.f;
+ if (DeltaC2.dot(faceANormalWS) < 0)
+ faceANormalWS *= -1.f;
curPlaneTests++;
#ifdef TEST_INTERNAL_OBJECTS
gExpectedNbTests++;
- if(gUseInternalObject && !TestInternalObjects(transA,transB, DeltaC2, faceANormalWS, hullA, hullB, dmin))
+ if (gUseInternalObject && !TestInternalObjects(transA, transB, DeltaC2, faceANormalWS, hullA, hullB, dmin))
continue;
gActualNbTests++;
#endif
btScalar d;
- btVector3 wA,wB;
- if(!TestSepAxis( hullA, hullB, transA,transB, faceANormalWS, d,wA,wB))
+ btVector3 wA, wB;
+ if (!TestSepAxis(hullA, hullB, transA, transB, faceANormalWS, d, wA, wB))
return false;
- if(d<dmin)
+ if (d < dmin)
{
dmin = d;
sep = faceANormalWS;
@@ -281,92 +277,89 @@ bool btPolyhedralContactClipping::findSeparatingAxis( const btConvexPolyhedron&
int numFacesB = hullB.m_faces.size();
// Test normals from hullB
- for(int i=0;i<numFacesB;i++)
+ for (int i = 0; i < numFacesB; i++)
{
const btVector3 Normal(hullB.m_faces[i].m_plane[0], hullB.m_faces[i].m_plane[1], hullB.m_faces[i].m_plane[2]);
btVector3 WorldNormal = transB.getBasis() * Normal;
- if (DeltaC2.dot(WorldNormal)<0)
- WorldNormal *=-1.f;
+ if (DeltaC2.dot(WorldNormal) < 0)
+ WorldNormal *= -1.f;
curPlaneTests++;
#ifdef TEST_INTERNAL_OBJECTS
gExpectedNbTests++;
- if(gUseInternalObject && !TestInternalObjects(transA,transB,DeltaC2, WorldNormal, hullA, hullB, dmin))
+ if (gUseInternalObject && !TestInternalObjects(transA, transB, DeltaC2, WorldNormal, hullA, hullB, dmin))
continue;
gActualNbTests++;
#endif
btScalar d;
- btVector3 wA,wB;
- if(!TestSepAxis(hullA, hullB,transA,transB, WorldNormal,d,wA,wB))
+ btVector3 wA, wB;
+ if (!TestSepAxis(hullA, hullB, transA, transB, WorldNormal, d, wA, wB))
return false;
- if(d<dmin)
+ if (d < dmin)
{
dmin = d;
sep = WorldNormal;
}
}
- btVector3 edgeAstart,edgeAend,edgeBstart,edgeBend;
- int edgeA=-1;
- int edgeB=-1;
+ btVector3 edgeAstart, edgeAend, edgeBstart, edgeBend;
+ int edgeA = -1;
+ int edgeB = -1;
btVector3 worldEdgeA;
btVector3 worldEdgeB;
- btVector3 witnessPointA(0,0,0),witnessPointB(0,0,0);
-
+ btVector3 witnessPointA(0, 0, 0), witnessPointB(0, 0, 0);
int curEdgeEdge = 0;
// Test edges
- for(int e0=0;e0<hullA.m_uniqueEdges.size();e0++)
+ for (int e0 = 0; e0 < hullA.m_uniqueEdges.size(); e0++)
{
const btVector3 edge0 = hullA.m_uniqueEdges[e0];
const btVector3 WorldEdge0 = transA.getBasis() * edge0;
- for(int e1=0;e1<hullB.m_uniqueEdges.size();e1++)
+ for (int e1 = 0; e1 < hullB.m_uniqueEdges.size(); e1++)
{
const btVector3 edge1 = hullB.m_uniqueEdges[e1];
const btVector3 WorldEdge1 = transB.getBasis() * edge1;
btVector3 Cross = WorldEdge0.cross(WorldEdge1);
curEdgeEdge++;
- if(!IsAlmostZero(Cross))
+ if (!IsAlmostZero(Cross))
{
Cross = Cross.normalize();
- if (DeltaC2.dot(Cross)<0)
+ if (DeltaC2.dot(Cross) < 0)
Cross *= -1.f;
-
#ifdef TEST_INTERNAL_OBJECTS
gExpectedNbTests++;
- if(gUseInternalObject && !TestInternalObjects(transA,transB,DeltaC2, Cross, hullA, hullB, dmin))
+ if (gUseInternalObject && !TestInternalObjects(transA, transB, DeltaC2, Cross, hullA, hullB, dmin))
continue;
gActualNbTests++;
#endif
btScalar dist;
- btVector3 wA,wB;
- if(!TestSepAxis( hullA, hullB, transA,transB, Cross, dist,wA,wB))
+ btVector3 wA, wB;
+ if (!TestSepAxis(hullA, hullB, transA, transB, Cross, dist, wA, wB))
return false;
- if(dist<dmin)
+ if (dist < dmin)
{
dmin = dist;
sep = Cross;
- edgeA=e0;
- edgeB=e1;
+ edgeA = e0;
+ edgeB = e1;
worldEdgeA = WorldEdge0;
worldEdgeB = WorldEdge1;
- witnessPointA=wA;
- witnessPointB=wB;
+ witnessPointA = wA;
+ witnessPointB = wB;
}
}
}
-
}
- if (edgeA>=0&&edgeB>=0)
+ if (edgeA >= 0 && edgeB >= 0)
{
-// printf("edge-edge\n");
+ // printf("edge-edge\n");
//add an edge-edge contact
btVector3 ptsVector;
@@ -375,57 +368,55 @@ bool btPolyhedralContactClipping::findSeparatingAxis( const btConvexPolyhedron&
btScalar tA;
btScalar tB;
- btVector3 translation = witnessPointB-witnessPointA;
+ btVector3 translation = witnessPointB - witnessPointA;
btVector3 dirA = worldEdgeA;
btVector3 dirB = worldEdgeB;
-
+
btScalar hlenB = 1e30f;
btScalar hlenA = 1e30f;
- btSegmentsClosestPoints(ptsVector,offsetA,offsetB,tA,tB,
- translation,
- dirA, hlenA,
- dirB,hlenB);
+ btSegmentsClosestPoints(ptsVector, offsetA, offsetB, tA, tB,
+ translation,
+ dirA, hlenA,
+ dirB, hlenB);
btScalar nlSqrt = ptsVector.length2();
- if (nlSqrt>SIMD_EPSILON)
+ if (nlSqrt > SIMD_EPSILON)
{
btScalar nl = btSqrt(nlSqrt);
- ptsVector *= 1.f/nl;
- if (ptsVector.dot(DeltaC2)<0.f)
+ ptsVector *= 1.f / nl;
+ if (ptsVector.dot(DeltaC2) < 0.f)
{
- ptsVector*=-1.f;
+ ptsVector *= -1.f;
}
btVector3 ptOnB = witnessPointB + offsetB;
btScalar distance = nl;
- resultOut.addContactPoint(ptsVector, ptOnB,-distance);
+ resultOut.addContactPoint(ptsVector, ptOnB, -distance);
}
-
}
-
- if((DeltaC2.dot(sep))<0.0f)
+ if ((DeltaC2.dot(sep)) < 0.0f)
sep = -sep;
return true;
}
-void btPolyhedralContactClipping::clipFaceAgainstHull(const btVector3& separatingNormal, const btConvexPolyhedron& hullA, const btTransform& transA, btVertexArray& worldVertsB1,btVertexArray& worldVertsB2, const btScalar minDist, btScalar maxDist,btDiscreteCollisionDetectorInterface::Result& resultOut)
+void btPolyhedralContactClipping::clipFaceAgainstHull(const btVector3& separatingNormal, const btConvexPolyhedron& hullA, const btTransform& transA, btVertexArray& worldVertsB1, btVertexArray& worldVertsB2, const btScalar minDist, btScalar maxDist, btDiscreteCollisionDetectorInterface::Result& resultOut)
{
worldVertsB2.resize(0);
btVertexArray* pVtxIn = &worldVertsB1;
btVertexArray* pVtxOut = &worldVertsB2;
pVtxOut->reserve(pVtxIn->size());
- int closestFaceA=-1;
+ int closestFaceA = -1;
{
btScalar dmin = FLT_MAX;
- for(int face=0;face<hullA.m_faces.size();face++)
+ for (int face = 0; face < hullA.m_faces.size(); face++)
{
const btVector3 Normal(hullA.m_faces[face].m_plane[0], hullA.m_faces[face].m_plane[1], hullA.m_faces[face].m_plane[2]);
const btVector3 faceANormalWS = transA.getBasis() * Normal;
-
+
btScalar d = faceANormalWS.dot(separatingNormal);
if (d < dmin)
{
@@ -434,69 +425,66 @@ void btPolyhedralContactClipping::clipFaceAgainstHull(const btVector3& separatin
}
}
}
- if (closestFaceA<0)
+ if (closestFaceA < 0)
return;
const btFace& polyA = hullA.m_faces[closestFaceA];
- // clip polygon to back of planes of all faces of hull A that are adjacent to witness face
+ // clip polygon to back of planes of all faces of hull A that are adjacent to witness face
int numVerticesA = polyA.m_indices.size();
- for(int e0=0;e0<numVerticesA;e0++)
+ for (int e0 = 0; e0 < numVerticesA; e0++)
{
const btVector3& a = hullA.m_vertices[polyA.m_indices[e0]];
- const btVector3& b = hullA.m_vertices[polyA.m_indices[(e0+1)%numVerticesA]];
+ const btVector3& b = hullA.m_vertices[polyA.m_indices[(e0 + 1) % numVerticesA]];
const btVector3 edge0 = a - b;
const btVector3 WorldEdge0 = transA.getBasis() * edge0;
- btVector3 worldPlaneAnormal1 = transA.getBasis()* btVector3(polyA.m_plane[0],polyA.m_plane[1],polyA.m_plane[2]);
+ btVector3 worldPlaneAnormal1 = transA.getBasis() * btVector3(polyA.m_plane[0], polyA.m_plane[1], polyA.m_plane[2]);
- btVector3 planeNormalWS1 = -WorldEdge0.cross(worldPlaneAnormal1);//.cross(WorldEdge0);
- btVector3 worldA1 = transA*a;
+ btVector3 planeNormalWS1 = -WorldEdge0.cross(worldPlaneAnormal1); //.cross(WorldEdge0);
+ btVector3 worldA1 = transA * a;
btScalar planeEqWS1 = -worldA1.dot(planeNormalWS1);
-
+
//int otherFace=0;
#ifdef BLA1
int otherFace = polyA.m_connectedFaces[e0];
- btVector3 localPlaneNormal (hullA.m_faces[otherFace].m_plane[0],hullA.m_faces[otherFace].m_plane[1],hullA.m_faces[otherFace].m_plane[2]);
+ btVector3 localPlaneNormal(hullA.m_faces[otherFace].m_plane[0], hullA.m_faces[otherFace].m_plane[1], hullA.m_faces[otherFace].m_plane[2]);
btScalar localPlaneEq = hullA.m_faces[otherFace].m_plane[3];
- btVector3 planeNormalWS = transA.getBasis()*localPlaneNormal;
- btScalar planeEqWS=localPlaneEq-planeNormalWS.dot(transA.getOrigin());
-#else
+ btVector3 planeNormalWS = transA.getBasis() * localPlaneNormal;
+ btScalar planeEqWS = localPlaneEq - planeNormalWS.dot(transA.getOrigin());
+#else
btVector3 planeNormalWS = planeNormalWS1;
- btScalar planeEqWS=planeEqWS1;
-
+ btScalar planeEqWS = planeEqWS1;
+
#endif
//clip face
- clipFace(*pVtxIn, *pVtxOut,planeNormalWS,planeEqWS);
- btSwap(pVtxIn,pVtxOut);
+ clipFace(*pVtxIn, *pVtxOut, planeNormalWS, planeEqWS);
+ btSwap(pVtxIn, pVtxOut);
pVtxOut->resize(0);
}
-
-
-//#define ONLY_REPORT_DEEPEST_POINT
+ //#define ONLY_REPORT_DEEPEST_POINT
btVector3 point;
-
// only keep points that are behind the witness face
{
- btVector3 localPlaneNormal (polyA.m_plane[0],polyA.m_plane[1],polyA.m_plane[2]);
+ btVector3 localPlaneNormal(polyA.m_plane[0], polyA.m_plane[1], polyA.m_plane[2]);
btScalar localPlaneEq = polyA.m_plane[3];
- btVector3 planeNormalWS = transA.getBasis()*localPlaneNormal;
- btScalar planeEqWS=localPlaneEq-planeNormalWS.dot(transA.getOrigin());
- for (int i=0;i<pVtxIn->size();i++)
+ btVector3 planeNormalWS = transA.getBasis() * localPlaneNormal;
+ btScalar planeEqWS = localPlaneEq - planeNormalWS.dot(transA.getOrigin());
+ for (int i = 0; i < pVtxIn->size(); i++)
{
btVector3 vtx = pVtxIn->at(i);
- btScalar depth = planeNormalWS.dot(vtx)+planeEqWS;
- if (depth <=minDist)
+ btScalar depth = planeNormalWS.dot(vtx) + planeEqWS;
+ if (depth <= minDist)
{
-// printf("clamped: depth=%f to minDist=%f\n",depth,minDist);
+ // printf("clamped: depth=%f to minDist=%f\n",depth,minDist);
depth = minDist;
}
- if (depth <=maxDist)
+ if (depth <= maxDist)
{
btVector3 point = pVtxIn->at(i);
#ifdef ONLY_REPORT_DEEPEST_POINT
@@ -507,40 +495,32 @@ void btPolyhedralContactClipping::clipFaceAgainstHull(const btVector3& separatin
{
printf("error in btPolyhedralContactClipping depth = %f\n", depth);
printf("likely wrong separatingNormal passed in\n");
- }
-#endif
- resultOut.addContactPoint(separatingNormal,point,depth);
+ }
+#endif
+ resultOut.addContactPoint(separatingNormal, point, depth);
#endif
}
}
}
#ifdef ONLY_REPORT_DEEPEST_POINT
- if (curMaxDist<maxDist)
+ if (curMaxDist < maxDist)
{
- resultOut.addContactPoint(separatingNormal,point,curMaxDist);
+ resultOut.addContactPoint(separatingNormal, point, curMaxDist);
}
-#endif //ONLY_REPORT_DEEPEST_POINT
-
+#endif //ONLY_REPORT_DEEPEST_POINT
}
-
-
-
-
-void btPolyhedralContactClipping::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)
+void btPolyhedralContactClipping::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)
{
-
btVector3 separatingNormal = separatingNormal1.normalized();
-// const btVector3 c0 = transA * hullA.m_localCenter;
-// const btVector3 c1 = transB * hullB.m_localCenter;
+ // const btVector3 c0 = transA * hullA.m_localCenter;
+ // const btVector3 c1 = transB * hullB.m_localCenter;
//const btVector3 DeltaC2 = c0 - c1;
-
-
- int closestFaceB=-1;
+ int closestFaceB = -1;
btScalar dmax = -FLT_MAX;
{
- for(int face=0;face<hullB.m_faces.size();face++)
+ for (int face = 0; face < hullB.m_faces.size(); face++)
{
const btVector3 Normal(hullB.m_faces[face].m_plane[0], hullB.m_faces[face].m_plane[1], hullB.m_faces[face].m_plane[2]);
const btVector3 WorldNormal = transB.getBasis() * Normal;
@@ -553,18 +533,16 @@ void btPolyhedralContactClipping::clipHullAgainstHull(const btVector3& separatin
}
}
worldVertsB1.resize(0);
- {
- const btFace& polyB = hullB.m_faces[closestFaceB];
- const int numVertices = polyB.m_indices.size();
- for(int e0=0;e0<numVertices;e0++)
- {
- const btVector3& b = hullB.m_vertices[polyB.m_indices[e0]];
- worldVertsB1.push_back(transB*b);
- }
- }
-
-
- if (closestFaceB>=0)
- clipFaceAgainstHull(separatingNormal, hullA, transA,worldVertsB1, worldVertsB2,minDist, maxDist,resultOut);
+ {
+ const btFace& polyB = hullB.m_faces[closestFaceB];
+ const int numVertices = polyB.m_indices.size();
+ for (int e0 = 0; e0 < numVertices; e0++)
+ {
+ const btVector3& b = hullB.m_vertices[polyB.m_indices[e0]];
+ worldVertsB1.push_back(transB * b);
+ }
+ }
+ if (closestFaceB >= 0)
+ clipFaceAgainstHull(separatingNormal, hullA, transA, worldVertsB1, worldVertsB2, minDist, maxDist, resultOut);
}
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.h b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.h
index 30e3db687b..328f6424bc 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.h
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.h
@@ -13,14 +13,11 @@ subject to the following restrictions:
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"
@@ -32,18 +29,14 @@ typedef btAlignedObjectArray<btVector3> 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 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 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);
+ 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);
-
+ static void clipFace(const btVertexArray& pVtxIn, btVertexArray& ppVtxOut, const btVector3& planeNormalWS, btScalar planeEqWS);
};
-#endif // BT_POLYHEDRAL_CONTACT_CLIPPING_H
-
+#endif // BT_POLYHEDRAL_CONTACT_CLIPPING_H
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp
index 786efd1820..3d11e5bce5 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp
@@ -23,39 +23,38 @@ subject to the following restrictions:
#include "BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h"
#include "btRaycastCallback.h"
-btTriangleRaycastCallback::btTriangleRaycastCallback(const btVector3& from,const btVector3& to, unsigned int flags)
- :
- m_from(from),
- m_to(to),
- //@BP Mod
- m_flags(flags),
- m_hitFraction(btScalar(1.))
+btTriangleRaycastCallback::btTriangleRaycastCallback(const btVector3& from, const btVector3& to, unsigned int flags)
+ : m_from(from),
+ m_to(to),
+ //@BP Mod
+ m_flags(flags),
+ m_hitFraction(btScalar(1.))
{
-
}
-
-
-void btTriangleRaycastCallback::processTriangle(btVector3* triangle,int partId, int triangleIndex)
+void btTriangleRaycastCallback::processTriangle(btVector3* triangle, int partId, int triangleIndex)
{
- const btVector3 &vert0=triangle[0];
- const btVector3 &vert1=triangle[1];
- const btVector3 &vert2=triangle[2];
+ const btVector3& vert0 = triangle[0];
+ const btVector3& vert1 = triangle[1];
+ const btVector3& vert2 = triangle[2];
+
+ btVector3 v10;
+ v10 = vert1 - vert0;
+ btVector3 v20;
+ v20 = vert2 - vert0;
- btVector3 v10; v10 = vert1 - vert0 ;
- btVector3 v20; v20 = vert2 - vert0 ;
+ btVector3 triangleNormal;
+ triangleNormal = v10.cross(v20);
- btVector3 triangleNormal; triangleNormal = v10.cross( v20 );
-
const btScalar dist = vert0.dot(triangleNormal);
- btScalar dist_a = triangleNormal.dot(m_from) ;
- dist_a-= dist;
+ btScalar dist_a = triangleNormal.dot(m_from);
+ dist_a -= dist;
btScalar dist_b = triangleNormal.dot(m_to);
dist_b -= dist;
- if ( dist_a * dist_b >= btScalar(0.0) )
+ if (dist_a * dist_b >= btScalar(0.0))
{
- return ; // same sign
+ return; // same sign
}
if (((m_flags & kF_FilterBackfaces) != 0) && (dist_a <= btScalar(0.0)))
@@ -64,52 +63,52 @@ void btTriangleRaycastCallback::processTriangle(btVector3* triangle,int partId,
return;
}
-
- const btScalar proj_length=dist_a-dist_b;
- const btScalar distance = (dist_a)/(proj_length);
+ const btScalar proj_length = dist_a - dist_b;
+ const btScalar distance = (dist_a) / (proj_length);
// Now we have the intersection point on the plane, we'll see if it's inside the triangle
// Add an epsilon as a tolerance for the raycast,
// in case the ray hits exacly on the edge of the triangle.
// It must be scaled for the triangle size.
-
- if(distance < m_hitFraction)
- {
-
- btScalar edge_tolerance =triangleNormal.length2();
+ if (distance < m_hitFraction)
+ {
+ btScalar edge_tolerance = triangleNormal.length2();
edge_tolerance *= btScalar(-0.0001);
- btVector3 point; point.setInterpolate3( m_from, m_to, distance);
+ btVector3 point;
+ point.setInterpolate3(m_from, m_to, distance);
{
- btVector3 v0p; v0p = vert0 - point;
- btVector3 v1p; v1p = vert1 - point;
- btVector3 cp0; cp0 = v0p.cross( v1p );
-
- if ( (btScalar)(cp0.dot(triangleNormal)) >=edge_tolerance)
+ btVector3 v0p;
+ v0p = vert0 - point;
+ btVector3 v1p;
+ v1p = vert1 - point;
+ btVector3 cp0;
+ cp0 = v0p.cross(v1p);
+
+ if ((btScalar)(cp0.dot(triangleNormal)) >= edge_tolerance)
{
-
-
- btVector3 v2p; v2p = vert2 - point;
+ btVector3 v2p;
+ v2p = vert2 - point;
btVector3 cp1;
- cp1 = v1p.cross( v2p);
- if ( (btScalar)(cp1.dot(triangleNormal)) >=edge_tolerance)
+ cp1 = v1p.cross(v2p);
+ if ((btScalar)(cp1.dot(triangleNormal)) >= edge_tolerance)
{
btVector3 cp2;
cp2 = v2p.cross(v0p);
-
- if ( (btScalar)(cp2.dot(triangleNormal)) >=edge_tolerance)
+
+ if ((btScalar)(cp2.dot(triangleNormal)) >= edge_tolerance)
{
- //@BP Mod
- // Triangle normal isn't normalized
- triangleNormal.normalize();
+ //@BP Mod
+ // Triangle normal isn't normalized
+ triangleNormal.normalize();
- //@BP Mod - Allow for unflipped normal when raycasting against backfaces
+ //@BP Mod - Allow for unflipped normal when raycasting against backfaces
if (((m_flags & kF_KeepUnflippedNormal) == 0) && (dist_a <= btScalar(0.0)))
{
- m_hitFraction = reportHit(-triangleNormal,distance,partId,triangleIndex);
+ m_hitFraction = reportHit(-triangleNormal, distance, partId, triangleIndex);
}
else
{
- m_hitFraction = reportHit(triangleNormal,distance,partId,triangleIndex);
+ m_hitFraction = reportHit(triangleNormal, distance, partId, triangleIndex);
}
}
}
@@ -118,8 +117,7 @@ void btTriangleRaycastCallback::processTriangle(btVector3* triangle,int partId,
}
}
-
-btTriangleConvexcastCallback::btTriangleConvexcastCallback (const btConvexShape* convexShape, const btTransform& convexShapeFrom, const btTransform& convexShapeTo, const btTransform& triangleToWorld, const btScalar triangleCollisionMargin)
+btTriangleConvexcastCallback::btTriangleConvexcastCallback(const btConvexShape* convexShape, const btTransform& convexShapeFrom, const btTransform& convexShapeTo, const btTransform& triangleToWorld, const btScalar triangleCollisionMargin)
{
m_convexShape = convexShape;
m_convexShapeFrom = convexShapeFrom;
@@ -130,14 +128,13 @@ btTriangleConvexcastCallback::btTriangleConvexcastCallback (const btConvexShape*
m_allowedPenetration = 0.f;
}
-void
-btTriangleConvexcastCallback::processTriangle (btVector3* triangle, int partId, int triangleIndex)
+void btTriangleConvexcastCallback::processTriangle(btVector3* triangle, int partId, int triangleIndex)
{
- btTriangleShape triangleShape (triangle[0], triangle[1], triangle[2]);
- triangleShape.setMargin(m_triangleCollisionMargin);
+ btTriangleShape triangleShape(triangle[0], triangle[1], triangle[2]);
+ triangleShape.setMargin(m_triangleCollisionMargin);
- btVoronoiSimplexSolver simplexSolver;
- btGjkEpaPenetrationDepthSolver gjkEpaPenetrationSolver;
+ btVoronoiSimplexSolver simplexSolver;
+ btGjkEpaPenetrationDepthSolver gjkEpaPenetrationSolver;
//#define USE_SUBSIMPLEX_CONVEX_CAST 1
//if you reenable USE_SUBSIMPLEX_CONVEX_CAST see commented out code below
@@ -145,21 +142,21 @@ btTriangleConvexcastCallback::processTriangle (btVector3* triangle, int partId,
btSubsimplexConvexCast convexCaster(m_convexShape, &triangleShape, &simplexSolver);
#else
//btGjkConvexCast convexCaster(m_convexShape,&triangleShape,&simplexSolver);
- btContinuousConvexCollision convexCaster(m_convexShape,&triangleShape,&simplexSolver,&gjkEpaPenetrationSolver);
-#endif //#USE_SUBSIMPLEX_CONVEX_CAST
-
+ btContinuousConvexCollision convexCaster(m_convexShape, &triangleShape, &simplexSolver, &gjkEpaPenetrationSolver);
+#endif //#USE_SUBSIMPLEX_CONVEX_CAST
+
btConvexCast::CastResult castResult;
castResult.m_fraction = btScalar(1.);
castResult.m_allowedPenetration = m_allowedPenetration;
- if (convexCaster.calcTimeOfImpact(m_convexShapeFrom,m_convexShapeTo,m_triangleToWorld, m_triangleToWorld, castResult))
+ if (convexCaster.calcTimeOfImpact(m_convexShapeFrom, m_convexShapeTo, m_triangleToWorld, m_triangleToWorld, castResult))
{
//add hit
if (castResult.m_normal.length2() > btScalar(0.0001))
- {
+ {
if (castResult.m_fraction < m_hitFraction)
{
-/* btContinuousConvexCast's normal is already in world space */
-/*
+ /* btContinuousConvexCast's normal is already in world space */
+ /*
#ifdef USE_SUBSIMPLEX_CONVEX_CAST
//rotate normal into worldspace
castResult.m_normal = m_convexShapeFrom.getBasis() * castResult.m_normal;
@@ -167,11 +164,11 @@ btTriangleConvexcastCallback::processTriangle (btVector3* triangle, int partId,
*/
castResult.m_normal.normalize();
- reportHit (castResult.m_normal,
- castResult.m_hitPoint,
- castResult.m_fraction,
- partId,
- triangleIndex);
+ reportHit(castResult.m_normal,
+ castResult.m_hitPoint,
+ castResult.m_fraction,
+ partId,
+ triangleIndex);
}
}
}
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h
index f2ed0cd39c..2b2dfabec2 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h
@@ -21,35 +21,33 @@ subject to the following restrictions:
struct btBroadphaseProxy;
class btConvexShape;
-class btTriangleRaycastCallback: public btTriangleCallback
+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_Terminator = 0xFFFFFFFF
- };
- unsigned int m_flags;
+ //@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_Terminator = 0xFFFFFFFF
+ };
+ unsigned int m_flags;
+
+ btScalar m_hitFraction;
- btScalar m_hitFraction;
+ btTriangleRaycastCallback(const btVector3& from, const btVector3& to, unsigned int flags = 0);
- 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;
-
+ virtual btScalar reportHit(const btVector3& hitNormalLocal, btScalar hitFraction, int partId, int triangleIndex) = 0;
};
class btTriangleConvexcastCallback : public btTriangleCallback
@@ -63,12 +61,11 @@ public:
btScalar m_triangleCollisionMargin;
btScalar m_allowedPenetration;
- btTriangleConvexcastCallback (const btConvexShape* convexShape, const btTransform& convexShapeFrom, const btTransform& convexShapeTo, const btTransform& triangleToWorld, const btScalar triangleCollisionMargin);
+ 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 void processTriangle(btVector3* triangle, int partId, int triangleIndex);
- virtual btScalar reportHit (const btVector3& hitNormalLocal, const btVector3& hitPointLocal, btScalar hitFraction, int partId, int triangleIndex) = 0;
+ virtual btScalar reportHit(const btVector3& hitNormalLocal, const btVector3& hitPointLocal, btScalar hitFraction, int partId, int triangleIndex) = 0;
};
-#endif //BT_RAYCAST_TRI_CALLBACK_H
-
+#endif //BT_RAYCAST_TRI_CALLBACK_H
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h
index da8a13914c..ccd227109d 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h
@@ -13,8 +13,6 @@ subject to the following restrictions:
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
@@ -31,33 +29,30 @@ subject to the following restrictions:
/// voronoi regions or barycentric coordinates
class btSimplexSolverInterface
{
- public:
- virtual ~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 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;
-
-
+ virtual int numVertices() const = 0;
};
#endif
-#endif //BT_SIMPLEX_SOLVER_INTERFACE_H
-
+#endif //BT_SIMPLEX_SOLVER_INTERFACE_H
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp
index 08d6e6de86..37458339e7 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp
@@ -13,7 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btSubSimplexConvexCast.h"
#include "BulletCollision/CollisionShapes/btConvexShape.h"
@@ -22,32 +21,26 @@ subject to the following restrictions:
#include "btPointCollector.h"
#include "LinearMath/btTransformUtil.h"
-btSubsimplexConvexCast::btSubsimplexConvexCast (const btConvexShape* convexA,const btConvexShape* convexB,btSimplexSolverInterface* simplexSolver)
-:m_simplexSolver(simplexSolver),
-m_convexA(convexA),m_convexB(convexB)
+btSubsimplexConvexCast::btSubsimplexConvexCast(const btConvexShape* convexA, const btConvexShape* convexB, btSimplexSolverInterface* simplexSolver)
+ : m_simplexSolver(simplexSolver),
+ m_convexA(convexA),
+ m_convexB(convexB)
{
}
-///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
-#ifdef BT_USE_DOUBLE_PRECISION
-#define MAX_ITERATIONS 64
-#else
-#define MAX_ITERATIONS 32
-#endif
-bool btSubsimplexConvexCast::calcTimeOfImpact(
- const btTransform& fromA,
- const btTransform& toA,
- const btTransform& fromB,
- const btTransform& toB,
- CastResult& result)
-{
+bool btSubsimplexConvexCast::calcTimeOfImpact(
+ const btTransform& fromA,
+ const btTransform& toA,
+ const btTransform& fromB,
+ const btTransform& toB,
+ CastResult& result)
+{
m_simplexSolver->reset();
- btVector3 linVelA,linVelB;
- linVelA = toA.getOrigin()-fromA.getOrigin();
- linVelB = toB.getOrigin()-fromB.getOrigin();
+ btVector3 linVelA, linVelB;
+ linVelA = toA.getOrigin() - fromA.getOrigin();
+ linVelB = toB.getOrigin() - fromB.getOrigin();
btScalar lambda = btScalar(0.);
@@ -55,43 +48,31 @@ bool btSubsimplexConvexCast::calcTimeOfImpact(
btTransform interpolatedTransB = fromB;
///take relative motion
- btVector3 r = (linVelA-linVelB);
+ btVector3 r = (linVelA - linVelB);
btVector3 v;
-
- btVector3 supVertexA = fromA(m_convexA->localGetSupportingVertex(-r*fromA.getBasis()));
- btVector3 supVertexB = fromB(m_convexB->localGetSupportingVertex(r*fromB.getBasis()));
- v = supVertexA-supVertexB;
- int maxIter = MAX_ITERATIONS;
- btVector3 n;
- n.setValue(btScalar(0.),btScalar(0.),btScalar(0.));
-
- btVector3 c;
+ btVector3 supVertexA = fromA(m_convexA->localGetSupportingVertex(-r * fromA.getBasis()));
+ btVector3 supVertexB = fromB(m_convexB->localGetSupportingVertex(r * fromB.getBasis()));
+ v = supVertexA - supVertexB;
+ int maxIter = result.m_subSimplexCastMaxIterations;
-
+ btVector3 n;
+ n.setValue(btScalar(0.), btScalar(0.), btScalar(0.));
+ btVector3 c;
btScalar dist2 = v.length2();
-#ifdef BT_USE_DOUBLE_PRECISION
- btScalar epsilon = SIMD_EPSILON * 10;
-#else
-//todo: epsilon kept for backward compatibility of unit tests.
-//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)
- btScalar epsilon = btScalar(0.0001);
-#endif //BT_USE_DOUBLE_PRECISION
- btVector3 w,p;
+ btVector3 w, p;
btScalar VdotR;
-
- while ( (dist2 > epsilon) && maxIter--)
+
+ while ((dist2 > result.m_subSimplexCastEpsilon) && maxIter--)
{
- supVertexA = interpolatedTransA(m_convexA->localGetSupportingVertex(-v*interpolatedTransA.getBasis()));
- supVertexB = interpolatedTransB(m_convexB->localGetSupportingVertex(v*interpolatedTransB.getBasis()));
- w = supVertexA-supVertexB;
+ supVertexA = interpolatedTransA(m_convexA->localGetSupportingVertex(-v * interpolatedTransA.getBasis()));
+ supVertexB = interpolatedTransB(m_convexB->localGetSupportingVertex(v * interpolatedTransB.getBasis()));
+ w = supVertexA - supVertexB;
btScalar VdotW = v.dot(w);
@@ -100,68 +81,63 @@ bool btSubsimplexConvexCast::calcTimeOfImpact(
return false;
}
- if ( VdotW > btScalar(0.))
+ if (VdotW > btScalar(0.))
{
VdotR = v.dot(r);
- if (VdotR >= -(SIMD_EPSILON*SIMD_EPSILON))
+ if (VdotR >= -(SIMD_EPSILON * SIMD_EPSILON))
return false;
else
{
lambda = lambda - VdotW / VdotR;
//interpolate to next lambda
// x = s + lambda * r;
- interpolatedTransA.getOrigin().setInterpolate3(fromA.getOrigin(),toA.getOrigin(),lambda);
- interpolatedTransB.getOrigin().setInterpolate3(fromB.getOrigin(),toB.getOrigin(),lambda);
+ interpolatedTransA.getOrigin().setInterpolate3(fromA.getOrigin(), toA.getOrigin(), lambda);
+ interpolatedTransB.getOrigin().setInterpolate3(fromB.getOrigin(), toB.getOrigin(), lambda);
//m_simplexSolver->reset();
//check next line
- w = supVertexA-supVertexB;
-
+ w = supVertexA - supVertexB;
+
n = v;
-
}
- }
+ }
///Just like regular GJK only add the vertex if it isn't already (close) to current vertex, it would lead to divisions by zero and NaN etc.
if (!m_simplexSolver->inSimplex(w))
- m_simplexSolver->addVertex( w, supVertexA , supVertexB);
+ m_simplexSolver->addVertex(w, supVertexA, supVertexB);
if (m_simplexSolver->closest(v))
{
dist2 = v.length2();
-
+
//todo: check this normal for validity
//n=v;
//printf("V=%f , %f, %f\n",v[0],v[1],v[2]);
//printf("DIST2=%f\n",dist2);
//printf("numverts = %i\n",m_simplexSolver->numVertices());
- } else
+ }
+ else
{
dist2 = btScalar(0.);
- }
+ }
}
//int numiter = MAX_ITERATIONS - maxIter;
-// printf("number of iterations: %d", numiter);
-
+ // printf("number of iterations: %d", numiter);
+
//don't report a time of impact when moving 'away' from the hitnormal
-
result.m_fraction = lambda;
- if (n.length2() >= (SIMD_EPSILON*SIMD_EPSILON))
+ if (n.length2() >= (SIMD_EPSILON * SIMD_EPSILON))
result.m_normal = n.normalized();
else
result.m_normal = btVector3(btScalar(0.0), btScalar(0.0), btScalar(0.0));
//don't report time of impact for motion away from the contact normal (or causes minor penetration)
- if (result.m_normal.dot(r)>=-result.m_allowedPenetration)
+ if (result.m_normal.dot(r) >= -result.m_allowedPenetration)
return false;
- btVector3 hitA,hitB;
- m_simplexSolver->compute_points(hitA,hitB);
- result.m_hitPoint=hitB;
+ btVector3 hitA, hitB;
+ m_simplexSolver->compute_points(hitA, hitB);
+ result.m_hitPoint = hitB;
return true;
}
-
-
-
-
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h
index 6c8127983e..0638a30eb1 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h
@@ -13,7 +13,6 @@ subject to the following restrictions:
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
@@ -28,23 +27,21 @@ class btConvexShape;
class btSubsimplexConvexCast : public btConvexCast
{
btSimplexSolverInterface* m_simplexSolver;
- const btConvexShape* m_convexA;
- const btConvexShape* m_convexB;
+ const btConvexShape* m_convexA;
+ const btConvexShape* m_convexB;
public:
-
- btSubsimplexConvexCast (const btConvexShape* shapeA,const btConvexShape* shapeB,btSimplexSolverInterface* simplexSolver);
+ 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);
-
+ virtual bool calcTimeOfImpact(
+ const btTransform& fromA,
+ const btTransform& toA,
+ const btTransform& fromB,
+ const btTransform& toB,
+ CastResult& result);
};
-#endif //BT_SUBSIMPLEX_CONVEX_CAST_H
+#endif //BT_SUBSIMPLEX_CONVEX_CAST_H
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.cpp b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.cpp
index 756373c9b5..8fda94d2ad 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.cpp
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.cpp
@@ -23,26 +23,24 @@ subject to the following restrictions:
*/
-
#include "btVoronoiSimplexSolver.h"
-#define VERTA 0
-#define VERTB 1
-#define VERTC 2
-#define VERTD 3
+#define VERTA 0
+#define VERTB 1
+#define VERTC 2
+#define VERTD 3
#define CATCH_DEGENERATE_TETRAHEDRON 1
-void btVoronoiSimplexSolver::removeVertex(int index)
+void btVoronoiSimplexSolver::removeVertex(int index)
{
-
- btAssert(m_numVertices>0);
+ btAssert(m_numVertices > 0);
m_numVertices--;
m_simplexVectorW[index] = m_simplexVectorW[m_numVertices];
m_simplexPointsP[index] = m_simplexPointsP[m_numVertices];
m_simplexPointsQ[index] = m_simplexPointsQ[m_numVertices];
}
-void btVoronoiSimplexSolver::reduceVertices (const btUsageBitfield& usedVerts)
+void btVoronoiSimplexSolver::reduceVertices(const btUsageBitfield& usedVerts)
{
if ((numVertices() >= 4) && (!usedVerts.usedVertexD))
removeVertex(3);
@@ -52,29 +50,22 @@ void btVoronoiSimplexSolver::reduceVertices (const btUsageBitfield& usedVerts)
if ((numVertices() >= 2) && (!usedVerts.usedVertexB))
removeVertex(1);
-
+
if ((numVertices() >= 1) && (!usedVerts.usedVertexA))
removeVertex(0);
-
}
-
-
-
-
//clear the simplex, remove all the vertices
void btVoronoiSimplexSolver::reset()
{
m_cachedValidClosest = false;
m_numVertices = 0;
m_needsUpdate = true;
- m_lastW = btVector3(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
+ m_lastW = btVector3(btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT));
m_cachedBC.reset();
}
-
-
- //add a vertex
+//add a vertex
void btVoronoiSimplexSolver::addVertex(const btVector3& w, const btVector3& p, const btVector3& q)
{
m_lastW = w;
@@ -87,9 +78,8 @@ void btVoronoiSimplexSolver::addVertex(const btVector3& w, const btVector3& p, c
m_numVertices++;
}
-bool btVoronoiSimplexSolver::updateClosestVectorAndPoints()
+bool btVoronoiSimplexSolver::updateClosestVectorAndPoints()
{
-
if (m_needsUpdate)
{
m_cachedBC.reset();
@@ -98,127 +88,131 @@ bool btVoronoiSimplexSolver::updateClosestVectorAndPoints()
switch (numVertices())
{
- case 0:
+ case 0:
m_cachedValidClosest = false;
break;
- case 1:
+ case 1:
{
m_cachedP1 = m_simplexPointsP[0];
m_cachedP2 = m_simplexPointsQ[0];
- m_cachedV = m_cachedP1-m_cachedP2; //== m_simplexVectorW[0]
+ m_cachedV = m_cachedP1 - m_cachedP2; //== m_simplexVectorW[0]
m_cachedBC.reset();
- m_cachedBC.setBarycentricCoordinates(btScalar(1.),btScalar(0.),btScalar(0.),btScalar(0.));
+ m_cachedBC.setBarycentricCoordinates(btScalar(1.), btScalar(0.), btScalar(0.), btScalar(0.));
m_cachedValidClosest = m_cachedBC.isValid();
break;
};
- case 2:
+ case 2:
{
- //closest point origin from line segment
- const btVector3& from = m_simplexVectorW[0];
- const btVector3& to = m_simplexVectorW[1];
- btVector3 nearest;
-
- btVector3 p (btScalar(0.),btScalar(0.),btScalar(0.));
- btVector3 diff = p - from;
- btVector3 v = to - from;
- btScalar t = v.dot(diff);
-
- if (t > 0) {
- btScalar dotVV = v.dot(v);
- if (t < dotVV) {
- t /= dotVV;
- diff -= t*v;
- m_cachedBC.m_usedVertices.usedVertexA = true;
- m_cachedBC.m_usedVertices.usedVertexB = true;
- } else {
- t = 1;
- diff -= v;
- //reduce to 1 point
- m_cachedBC.m_usedVertices.usedVertexB = true;
- }
- } else
+ //closest point origin from line segment
+ const btVector3& from = m_simplexVectorW[0];
+ const btVector3& to = m_simplexVectorW[1];
+ btVector3 nearest;
+
+ btVector3 p(btScalar(0.), btScalar(0.), btScalar(0.));
+ btVector3 diff = p - from;
+ btVector3 v = to - from;
+ btScalar t = v.dot(diff);
+
+ if (t > 0)
+ {
+ btScalar dotVV = v.dot(v);
+ if (t < dotVV)
{
- t = 0;
- //reduce to 1 point
+ t /= dotVV;
+ diff -= t * v;
m_cachedBC.m_usedVertices.usedVertexA = true;
+ m_cachedBC.m_usedVertices.usedVertexB = true;
+ }
+ else
+ {
+ t = 1;
+ diff -= v;
+ //reduce to 1 point
+ m_cachedBC.m_usedVertices.usedVertexB = true;
}
- m_cachedBC.setBarycentricCoordinates(1-t,t);
- nearest = from + t*v;
+ }
+ else
+ {
+ t = 0;
+ //reduce to 1 point
+ m_cachedBC.m_usedVertices.usedVertexA = true;
+ }
+ m_cachedBC.setBarycentricCoordinates(1 - t, t);
+ nearest = from + t * v;
- m_cachedP1 = m_simplexPointsP[0] + t * (m_simplexPointsP[1] - m_simplexPointsP[0]);
- m_cachedP2 = m_simplexPointsQ[0] + t * (m_simplexPointsQ[1] - m_simplexPointsQ[0]);
- m_cachedV = m_cachedP1 - m_cachedP2;
-
- reduceVertices(m_cachedBC.m_usedVertices);
+ m_cachedP1 = m_simplexPointsP[0] + t * (m_simplexPointsP[1] - m_simplexPointsP[0]);
+ m_cachedP2 = m_simplexPointsQ[0] + t * (m_simplexPointsQ[1] - m_simplexPointsQ[0]);
+ m_cachedV = m_cachedP1 - m_cachedP2;
- m_cachedValidClosest = m_cachedBC.isValid();
- break;
+ reduceVertices(m_cachedBC.m_usedVertices);
+
+ m_cachedValidClosest = m_cachedBC.isValid();
+ break;
}
- case 3:
- {
- //closest point origin from triangle
- btVector3 p (btScalar(0.),btScalar(0.),btScalar(0.));
+ case 3:
+ {
+ //closest point origin from triangle
+ btVector3 p(btScalar(0.), btScalar(0.), btScalar(0.));
- const btVector3& a = m_simplexVectorW[0];
- const btVector3& b = m_simplexVectorW[1];
- const btVector3& c = m_simplexVectorW[2];
+ const btVector3& a = m_simplexVectorW[0];
+ const btVector3& b = m_simplexVectorW[1];
+ const btVector3& c = m_simplexVectorW[2];
- closestPtPointTriangle(p,a,b,c,m_cachedBC);
- m_cachedP1 = m_simplexPointsP[0] * m_cachedBC.m_barycentricCoords[0] +
- m_simplexPointsP[1] * m_cachedBC.m_barycentricCoords[1] +
- m_simplexPointsP[2] * m_cachedBC.m_barycentricCoords[2];
+ closestPtPointTriangle(p, a, b, c, m_cachedBC);
+ m_cachedP1 = m_simplexPointsP[0] * m_cachedBC.m_barycentricCoords[0] +
+ m_simplexPointsP[1] * m_cachedBC.m_barycentricCoords[1] +
+ m_simplexPointsP[2] * m_cachedBC.m_barycentricCoords[2];
- m_cachedP2 = m_simplexPointsQ[0] * m_cachedBC.m_barycentricCoords[0] +
- m_simplexPointsQ[1] * m_cachedBC.m_barycentricCoords[1] +
- m_simplexPointsQ[2] * m_cachedBC.m_barycentricCoords[2];
+ m_cachedP2 = m_simplexPointsQ[0] * m_cachedBC.m_barycentricCoords[0] +
+ m_simplexPointsQ[1] * m_cachedBC.m_barycentricCoords[1] +
+ m_simplexPointsQ[2] * m_cachedBC.m_barycentricCoords[2];
- m_cachedV = m_cachedP1-m_cachedP2;
+ m_cachedV = m_cachedP1 - m_cachedP2;
- reduceVertices (m_cachedBC.m_usedVertices);
- m_cachedValidClosest = m_cachedBC.isValid();
+ reduceVertices(m_cachedBC.m_usedVertices);
+ m_cachedValidClosest = m_cachedBC.isValid();
- break;
+ break;
}
- case 4:
+ case 4:
{
+ btVector3 p(btScalar(0.), btScalar(0.), btScalar(0.));
-
- btVector3 p (btScalar(0.),btScalar(0.),btScalar(0.));
-
const btVector3& a = m_simplexVectorW[0];
const btVector3& b = m_simplexVectorW[1];
const btVector3& c = m_simplexVectorW[2];
const btVector3& d = m_simplexVectorW[3];
- bool hasSeparation = closestPtPointTetrahedron(p,a,b,c,d,m_cachedBC);
+ bool hasSeparation = closestPtPointTetrahedron(p, a, b, c, d, m_cachedBC);
if (hasSeparation)
{
-
m_cachedP1 = m_simplexPointsP[0] * m_cachedBC.m_barycentricCoords[0] +
- m_simplexPointsP[1] * m_cachedBC.m_barycentricCoords[1] +
- m_simplexPointsP[2] * m_cachedBC.m_barycentricCoords[2] +
- m_simplexPointsP[3] * m_cachedBC.m_barycentricCoords[3];
+ m_simplexPointsP[1] * m_cachedBC.m_barycentricCoords[1] +
+ m_simplexPointsP[2] * m_cachedBC.m_barycentricCoords[2] +
+ m_simplexPointsP[3] * m_cachedBC.m_barycentricCoords[3];
m_cachedP2 = m_simplexPointsQ[0] * m_cachedBC.m_barycentricCoords[0] +
- m_simplexPointsQ[1] * m_cachedBC.m_barycentricCoords[1] +
- m_simplexPointsQ[2] * m_cachedBC.m_barycentricCoords[2] +
- m_simplexPointsQ[3] * m_cachedBC.m_barycentricCoords[3];
+ m_simplexPointsQ[1] * m_cachedBC.m_barycentricCoords[1] +
+ m_simplexPointsQ[2] * m_cachedBC.m_barycentricCoords[2] +
+ m_simplexPointsQ[3] * m_cachedBC.m_barycentricCoords[3];
- m_cachedV = m_cachedP1-m_cachedP2;
- reduceVertices (m_cachedBC.m_usedVertices);
- } else
+ m_cachedV = m_cachedP1 - m_cachedP2;
+ reduceVertices(m_cachedBC.m_usedVertices);
+ }
+ else
{
-// printf("sub distance got penetration\n");
+ // printf("sub distance got penetration\n");
if (m_cachedBC.m_degenerate)
{
m_cachedValidClosest = false;
- } else
+ }
+ else
{
m_cachedValidClosest = true;
//degenerate case == false, penetration = true + zero
- m_cachedV.setValue(btScalar(0.),btScalar(0.),btScalar(0.));
+ m_cachedV.setValue(btScalar(0.), btScalar(0.), btScalar(0.));
}
break;
}
@@ -228,7 +222,7 @@ bool btVoronoiSimplexSolver::updateClosestVectorAndPoints()
//closest point origin from tetrahedron
break;
}
- default:
+ default:
{
m_cachedValidClosest = false;
}
@@ -236,7 +230,6 @@ bool btVoronoiSimplexSolver::updateClosestVectorAndPoints()
}
return m_cachedValidClosest;
-
}
//return/calculate the closest vertex
@@ -247,13 +240,11 @@ bool btVoronoiSimplexSolver::closest(btVector3& v)
return succes;
}
-
-
btScalar btVoronoiSimplexSolver::maxVertex()
{
int i, numverts = numVertices();
btScalar maxV = btScalar(0.);
- for (i=0;i<numverts;i++)
+ for (i = 0; i < numverts; i++)
{
btScalar curLen2 = m_simplexVectorW[i].length2();
if (maxV < curLen2)
@@ -262,13 +253,11 @@ btScalar btVoronoiSimplexSolver::maxVertex()
return maxV;
}
-
-
- //return the current simplex
-int btVoronoiSimplexSolver::getSimplex(btVector3 *pBuf, btVector3 *qBuf, btVector3 *yBuf) const
+//return the current simplex
+int btVoronoiSimplexSolver::getSimplex(btVector3* pBuf, btVector3* qBuf, btVector3* yBuf) const
{
int i;
- for (i=0;i<numVertices();i++)
+ for (i = 0; i < numVertices(); i++)
{
yBuf[i] = m_simplexVectorW[i];
pBuf[i] = m_simplexPointsP[i];
@@ -277,20 +266,17 @@ int btVoronoiSimplexSolver::getSimplex(btVector3 *pBuf, btVector3 *qBuf, btVecto
return numVertices();
}
-
-
-
bool btVoronoiSimplexSolver::inSimplex(const btVector3& w)
{
bool found = false;
int i, numverts = numVertices();
//btScalar maxV = btScalar(0.);
-
+
//w is in the current (reduced) simplex
- for (i=0;i<numverts;i++)
+ for (i = 0; i < numverts; i++)
{
#ifdef BT_USE_EQUAL_VERTEX_THRESHOLD
- if ( m_simplexVectorW[i].distance2(w) <= m_equalVertexThreshold)
+ if (m_simplexVectorW[i].distance2(w) <= m_equalVertexThreshold)
#else
if (m_simplexVectorW[i] == w)
#endif
@@ -303,199 +289,190 @@ bool btVoronoiSimplexSolver::inSimplex(const btVector3& w)
//check in case lastW is already removed
if (w == m_lastW)
return true;
-
+
return found;
}
-void btVoronoiSimplexSolver::backup_closest(btVector3& v)
+void btVoronoiSimplexSolver::backup_closest(btVector3& v)
{
v = m_cachedV;
}
-
-bool btVoronoiSimplexSolver::emptySimplex() const
+bool btVoronoiSimplexSolver::emptySimplex() const
{
return (numVertices() == 0);
-
}
-void btVoronoiSimplexSolver::compute_points(btVector3& p1, btVector3& p2)
+void btVoronoiSimplexSolver::compute_points(btVector3& p1, btVector3& p2)
{
updateClosestVectorAndPoints();
p1 = m_cachedP1;
p2 = m_cachedP2;
-
}
-
-
-
-bool btVoronoiSimplexSolver::closestPtPointTriangle(const btVector3& p, const btVector3& a, const btVector3& b, const btVector3& c,btSubSimplexClosestResult& result)
+bool btVoronoiSimplexSolver::closestPtPointTriangle(const btVector3& p, const btVector3& a, const btVector3& b, const btVector3& c, btSubSimplexClosestResult& result)
{
result.m_usedVertices.reset();
- // Check if P in vertex region outside A
- btVector3 ab = b - a;
- btVector3 ac = c - a;
- btVector3 ap = p - a;
- btScalar d1 = ab.dot(ap);
- btScalar d2 = ac.dot(ap);
- if (d1 <= btScalar(0.0) && d2 <= btScalar(0.0))
+ // Check if P in vertex region outside A
+ btVector3 ab = b - a;
+ btVector3 ac = c - a;
+ btVector3 ap = p - a;
+ btScalar d1 = ab.dot(ap);
+ btScalar d2 = ac.dot(ap);
+ if (d1 <= btScalar(0.0) && d2 <= btScalar(0.0))
{
result.m_closestPointOnSimplex = a;
result.m_usedVertices.usedVertexA = true;
- result.setBarycentricCoordinates(1,0,0);
- return true;// a; // barycentric coordinates (1,0,0)
+ result.setBarycentricCoordinates(1, 0, 0);
+ return true; // a; // barycentric coordinates (1,0,0)
}
- // Check if P in vertex region outside B
- btVector3 bp = p - b;
- btScalar d3 = ab.dot(bp);
- btScalar d4 = ac.dot(bp);
- if (d3 >= btScalar(0.0) && d4 <= d3)
+ // Check if P in vertex region outside B
+ btVector3 bp = p - b;
+ btScalar d3 = ab.dot(bp);
+ btScalar d4 = ac.dot(bp);
+ if (d3 >= btScalar(0.0) && d4 <= d3)
{
result.m_closestPointOnSimplex = b;
result.m_usedVertices.usedVertexB = true;
- result.setBarycentricCoordinates(0,1,0);
+ result.setBarycentricCoordinates(0, 1, 0);
- return true; // b; // barycentric coordinates (0,1,0)
+ return true; // b; // barycentric coordinates (0,1,0)
}
- // Check if P in edge region of AB, if so return projection of P onto AB
- btScalar vc = d1*d4 - d3*d2;
- if (vc <= btScalar(0.0) && d1 >= btScalar(0.0) && d3 <= btScalar(0.0)) {
- btScalar v = d1 / (d1 - d3);
+ // Check if P in edge region of AB, if so return projection of P onto AB
+ btScalar vc = d1 * d4 - d3 * d2;
+ if (vc <= btScalar(0.0) && d1 >= btScalar(0.0) && d3 <= btScalar(0.0))
+ {
+ btScalar v = d1 / (d1 - d3);
result.m_closestPointOnSimplex = a + v * ab;
result.m_usedVertices.usedVertexA = true;
result.m_usedVertices.usedVertexB = true;
- result.setBarycentricCoordinates(1-v,v,0);
+ result.setBarycentricCoordinates(1 - v, v, 0);
return true;
- //return a + v * ab; // barycentric coordinates (1-v,v,0)
- }
-
- // Check if P in vertex region outside C
- btVector3 cp = p - c;
- btScalar d5 = ab.dot(cp);
- btScalar d6 = ac.dot(cp);
- if (d6 >= btScalar(0.0) && d5 <= d6)
+ //return a + v * ab; // barycentric coordinates (1-v,v,0)
+ }
+
+ // Check if P in vertex region outside C
+ btVector3 cp = p - c;
+ btScalar d5 = ab.dot(cp);
+ btScalar d6 = ac.dot(cp);
+ if (d6 >= btScalar(0.0) && d5 <= d6)
{
result.m_closestPointOnSimplex = c;
result.m_usedVertices.usedVertexC = true;
- result.setBarycentricCoordinates(0,0,1);
- return true;//c; // barycentric coordinates (0,0,1)
+ result.setBarycentricCoordinates(0, 0, 1);
+ return true; //c; // barycentric coordinates (0,0,1)
}
- // Check if P in edge region of AC, if so return projection of P onto AC
- btScalar vb = d5*d2 - d1*d6;
- if (vb <= btScalar(0.0) && d2 >= btScalar(0.0) && d6 <= btScalar(0.0)) {
- btScalar w = d2 / (d2 - d6);
+ // Check if P in edge region of AC, if so return projection of P onto AC
+ btScalar vb = d5 * d2 - d1 * d6;
+ if (vb <= btScalar(0.0) && d2 >= btScalar(0.0) && d6 <= btScalar(0.0))
+ {
+ btScalar w = d2 / (d2 - d6);
result.m_closestPointOnSimplex = a + w * ac;
result.m_usedVertices.usedVertexA = true;
result.m_usedVertices.usedVertexC = true;
- result.setBarycentricCoordinates(1-w,0,w);
+ result.setBarycentricCoordinates(1 - w, 0, w);
return true;
- //return a + w * ac; // barycentric coordinates (1-w,0,w)
- }
+ //return a + w * ac; // barycentric coordinates (1-w,0,w)
+ }
+
+ // Check if P in edge region of BC, if so return projection of P onto BC
+ btScalar va = d3 * d6 - d5 * d4;
+ if (va <= btScalar(0.0) && (d4 - d3) >= btScalar(0.0) && (d5 - d6) >= btScalar(0.0))
+ {
+ btScalar w = (d4 - d3) / ((d4 - d3) + (d5 - d6));
- // Check if P in edge region of BC, if so return projection of P onto BC
- btScalar va = d3*d6 - d5*d4;
- if (va <= btScalar(0.0) && (d4 - d3) >= btScalar(0.0) && (d5 - d6) >= btScalar(0.0)) {
- btScalar w = (d4 - d3) / ((d4 - d3) + (d5 - d6));
-
result.m_closestPointOnSimplex = b + w * (c - b);
result.m_usedVertices.usedVertexB = true;
result.m_usedVertices.usedVertexC = true;
- result.setBarycentricCoordinates(0,1-w,w);
- return true;
- // return b + w * (c - b); // barycentric coordinates (0,1-w,w)
- }
-
- // P inside face region. Compute Q through its barycentric coordinates (u,v,w)
- btScalar denom = btScalar(1.0) / (va + vb + vc);
- btScalar v = vb * denom;
- btScalar w = vc * denom;
-
+ result.setBarycentricCoordinates(0, 1 - w, w);
+ return true;
+ // return b + w * (c - b); // barycentric coordinates (0,1-w,w)
+ }
+
+ // P inside face region. Compute Q through its barycentric coordinates (u,v,w)
+ btScalar denom = btScalar(1.0) / (va + vb + vc);
+ btScalar v = vb * denom;
+ btScalar w = vc * denom;
+
result.m_closestPointOnSimplex = a + ab * v + ac * w;
result.m_usedVertices.usedVertexA = true;
result.m_usedVertices.usedVertexB = true;
result.m_usedVertices.usedVertexC = true;
- result.setBarycentricCoordinates(1-v-w,v,w);
-
- return true;
-// return a + ab * v + ac * w; // = u*a + v*b + w*c, u = va * denom = btScalar(1.0) - v - w
+ result.setBarycentricCoordinates(1 - v - w, v, w);
+ return true;
+ // return a + ab * v + ac * w; // = u*a + v*b + w*c, u = va * denom = btScalar(1.0) - v - w
}
-
-
-
-
/// Test if point p and d lie on opposite sides of plane through abc
int btVoronoiSimplexSolver::pointOutsideOfPlane(const btVector3& p, const btVector3& a, const btVector3& b, const btVector3& c, const btVector3& d)
{
- btVector3 normal = (b-a).cross(c-a);
+ btVector3 normal = (b - a).cross(c - a);
- btScalar signp = (p - a).dot(normal); // [AP AB AC]
- btScalar signd = (d - a).dot( normal); // [AD AB AC]
+ btScalar signp = (p - a).dot(normal); // [AP AB AC]
+ btScalar signd = (d - a).dot(normal); // [AD AB AC]
#ifdef CATCH_DEGENERATE_TETRAHEDRON
#ifdef BT_USE_DOUBLE_PRECISION
-if (signd * signd < (btScalar(1e-8) * btScalar(1e-8)))
+ if (signd * signd < (btScalar(1e-8) * btScalar(1e-8)))
{
return -1;
}
#else
if (signd * signd < (btScalar(1e-4) * btScalar(1e-4)))
{
-// printf("affine dependent/degenerate\n");//
+ // printf("affine dependent/degenerate\n");//
return -1;
}
#endif
#endif
// Points on opposite sides if expression signs are opposite
- return signp * signd < btScalar(0.);
+ return signp * signd < btScalar(0.);
}
-
-bool btVoronoiSimplexSolver::closestPtPointTetrahedron(const btVector3& p, const btVector3& a, const btVector3& b, const btVector3& c, const btVector3& d, btSubSimplexClosestResult& finalResult)
+bool btVoronoiSimplexSolver::closestPtPointTetrahedron(const btVector3& p, const btVector3& a, const btVector3& b, const btVector3& c, const btVector3& d, btSubSimplexClosestResult& finalResult)
{
btSubSimplexClosestResult tempResult;
- // Start out assuming point inside all halfspaces, so closest to itself
+ // Start out assuming point inside all halfspaces, so closest to itself
finalResult.m_closestPointOnSimplex = p;
finalResult.m_usedVertices.reset();
- finalResult.m_usedVertices.usedVertexA = true;
+ finalResult.m_usedVertices.usedVertexA = true;
finalResult.m_usedVertices.usedVertexB = true;
finalResult.m_usedVertices.usedVertexC = true;
finalResult.m_usedVertices.usedVertexD = true;
- int pointOutsideABC = pointOutsideOfPlane(p, a, b, c, d);
+ int pointOutsideABC = pointOutsideOfPlane(p, a, b, c, d);
int pointOutsideACD = pointOutsideOfPlane(p, a, c, d, b);
- int pointOutsideADB = pointOutsideOfPlane(p, a, d, b, c);
- int pointOutsideBDC = pointOutsideOfPlane(p, b, d, c, a);
-
- if (pointOutsideABC < 0 || pointOutsideACD < 0 || pointOutsideADB < 0 || pointOutsideBDC < 0)
- {
- finalResult.m_degenerate = true;
- return false;
- }
+ int pointOutsideADB = pointOutsideOfPlane(p, a, d, b, c);
+ int pointOutsideBDC = pointOutsideOfPlane(p, b, d, c, a);
- if (!pointOutsideABC && !pointOutsideACD && !pointOutsideADB && !pointOutsideBDC)
- {
- return false;
- }
+ if (pointOutsideABC < 0 || pointOutsideACD < 0 || pointOutsideADB < 0 || pointOutsideBDC < 0)
+ {
+ finalResult.m_degenerate = true;
+ return false;
+ }
+ if (!pointOutsideABC && !pointOutsideACD && !pointOutsideADB && !pointOutsideBDC)
+ {
+ return false;
+ }
- btScalar bestSqDist = FLT_MAX;
- // If point outside face abc then compute closest point on abc
- if (pointOutsideABC)
+ btScalar bestSqDist = FLT_MAX;
+ // If point outside face abc then compute closest point on abc
+ if (pointOutsideABC)
{
- closestPtPointTriangle(p, a, b, c,tempResult);
+ closestPtPointTriangle(p, a, b, c, tempResult);
btVector3 q = tempResult.m_closestPointOnSimplex;
-
- btScalar sqDist = (q - p).dot( q - p);
- // Update best closest point if (squared) distance is less than current best
- if (sqDist < bestSqDist) {
+
+ btScalar sqDist = (q - p).dot(q - p);
+ // Update best closest point if (squared) distance is less than current best
+ if (sqDist < bestSqDist)
+ {
bestSqDist = sqDist;
finalResult.m_closestPointOnSimplex = q;
//convert result bitmask!
@@ -504,25 +481,22 @@ bool btVoronoiSimplexSolver::closestPtPointTetrahedron(const btVector3& p, const
finalResult.m_usedVertices.usedVertexB = tempResult.m_usedVertices.usedVertexB;
finalResult.m_usedVertices.usedVertexC = tempResult.m_usedVertices.usedVertexC;
finalResult.setBarycentricCoordinates(
- tempResult.m_barycentricCoords[VERTA],
- tempResult.m_barycentricCoords[VERTB],
- tempResult.m_barycentricCoords[VERTC],
- 0
- );
-
+ tempResult.m_barycentricCoords[VERTA],
+ tempResult.m_barycentricCoords[VERTB],
+ tempResult.m_barycentricCoords[VERTC],
+ 0);
}
- }
-
+ }
// Repeat test for face acd
- if (pointOutsideACD)
+ if (pointOutsideACD)
{
- closestPtPointTriangle(p, a, c, d,tempResult);
+ closestPtPointTriangle(p, a, c, d, tempResult);
btVector3 q = tempResult.m_closestPointOnSimplex;
//convert result bitmask!
- btScalar sqDist = (q - p).dot( q - p);
- if (sqDist < bestSqDist)
+ btScalar sqDist = (q - p).dot(q - p);
+ if (sqDist < bestSqDist)
{
bestSqDist = sqDist;
finalResult.m_closestPointOnSimplex = q;
@@ -532,52 +506,46 @@ bool btVoronoiSimplexSolver::closestPtPointTetrahedron(const btVector3& p, const
finalResult.m_usedVertices.usedVertexC = tempResult.m_usedVertices.usedVertexB;
finalResult.m_usedVertices.usedVertexD = tempResult.m_usedVertices.usedVertexC;
finalResult.setBarycentricCoordinates(
- tempResult.m_barycentricCoords[VERTA],
- 0,
- tempResult.m_barycentricCoords[VERTB],
- tempResult.m_barycentricCoords[VERTC]
- );
-
+ tempResult.m_barycentricCoords[VERTA],
+ 0,
+ tempResult.m_barycentricCoords[VERTB],
+ tempResult.m_barycentricCoords[VERTC]);
}
- }
- // Repeat test for face adb
+ }
+ // Repeat test for face adb
-
if (pointOutsideADB)
{
- closestPtPointTriangle(p, a, d, b,tempResult);
+ closestPtPointTriangle(p, a, d, b, tempResult);
btVector3 q = tempResult.m_closestPointOnSimplex;
//convert result bitmask!
- btScalar sqDist = (q - p).dot( q - p);
- if (sqDist < bestSqDist)
+ btScalar sqDist = (q - p).dot(q - p);
+ if (sqDist < bestSqDist)
{
bestSqDist = sqDist;
finalResult.m_closestPointOnSimplex = q;
finalResult.m_usedVertices.reset();
finalResult.m_usedVertices.usedVertexA = tempResult.m_usedVertices.usedVertexA;
finalResult.m_usedVertices.usedVertexB = tempResult.m_usedVertices.usedVertexC;
-
+
finalResult.m_usedVertices.usedVertexD = tempResult.m_usedVertices.usedVertexB;
finalResult.setBarycentricCoordinates(
- tempResult.m_barycentricCoords[VERTA],
- tempResult.m_barycentricCoords[VERTC],
- 0,
- tempResult.m_barycentricCoords[VERTB]
- );
-
+ tempResult.m_barycentricCoords[VERTA],
+ tempResult.m_barycentricCoords[VERTC],
+ 0,
+ tempResult.m_barycentricCoords[VERTB]);
}
- }
- // Repeat test for face bdc
-
+ }
+ // Repeat test for face bdc
if (pointOutsideBDC)
{
- closestPtPointTriangle(p, b, d, c,tempResult);
+ closestPtPointTriangle(p, b, d, c, tempResult);
btVector3 q = tempResult.m_closestPointOnSimplex;
//convert result bitmask!
- btScalar sqDist = (q - p).dot( q - p);
- if (sqDist < bestSqDist)
+ btScalar sqDist = (q - p).dot(q - p);
+ if (sqDist < bestSqDist)
{
bestSqDist = sqDist;
finalResult.m_closestPointOnSimplex = q;
@@ -588,25 +556,22 @@ bool btVoronoiSimplexSolver::closestPtPointTetrahedron(const btVector3& p, const
finalResult.m_usedVertices.usedVertexD = tempResult.m_usedVertices.usedVertexB;
finalResult.setBarycentricCoordinates(
- 0,
- tempResult.m_barycentricCoords[VERTA],
- tempResult.m_barycentricCoords[VERTC],
- tempResult.m_barycentricCoords[VERTB]
- );
-
+ 0,
+ tempResult.m_barycentricCoords[VERTA],
+ tempResult.m_barycentricCoords[VERTC],
+ tempResult.m_barycentricCoords[VERTB]);
}
- }
+ }
//help! we ended up full !
-
+
if (finalResult.m_usedVertices.usedVertexA &&
finalResult.m_usedVertices.usedVertexB &&
finalResult.m_usedVertices.usedVertexC &&
- finalResult.m_usedVertices.usedVertexD)
+ finalResult.m_usedVertices.usedVertexD)
{
return true;
}
- return true;
+ return true;
}
-
diff --git a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h
index 80fd490f4e..24a0a8f2df 100644
--- a/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h
+++ b/thirdparty/bullet/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h
@@ -13,15 +13,11 @@ subject to the following restrictions:
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
@@ -31,9 +27,10 @@ subject to the following restrictions:
#define VORONOI_DEFAULT_EQUAL_VERTEX_THRESHOLD 1e-12f
#else
#define VORONOI_DEFAULT_EQUAL_VERTEX_THRESHOLD 0.0001f
-#endif//BT_USE_DOUBLE_PRECISION
+#endif //BT_USE_DOUBLE_PRECISION
-struct btUsageBitfield{
+struct btUsageBitfield
+{
btUsageBitfield()
{
reset();
@@ -46,140 +43,131 @@ struct btUsageBitfield{
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;
+ 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
+struct btSubSimplexClosestResult
{
- btVector3 m_closestPointOnSimplex;
+ btVector3 m_closestPointOnSimplex;
//MASK for m_usedVertices
- //stores the simplex vertex-usage, using the MASK,
+ //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];
+ btUsageBitfield m_usedVertices;
+ btScalar m_barycentricCoords[4];
bool m_degenerate;
- void reset()
+ void reset()
{
m_degenerate = false;
setBarycentricCoordinates();
m_usedVertices.reset();
}
- bool isValid()
+ bool isValid()
{
bool valid = (m_barycentricCoords[0] >= btScalar(0.)) &&
- (m_barycentricCoords[1] >= btScalar(0.)) &&
- (m_barycentricCoords[2] >= btScalar(0.)) &&
- (m_barycentricCoords[3] >= 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.))
+ 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
+ATTRIBUTE_ALIGNED16(class)
+btVoronoiSimplexSolver
#else
-ATTRIBUTE_ALIGNED16(class) btVoronoiSimplexSolver : public btSimplexSolverInterface
+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];
+ 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;
+ 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 m_needsUpdate;
- 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);
+ void removeVertex(int index);
+ void reduceVertices(const btUsageBitfield& usedVerts);
+ bool updateClosestVectorAndPoints();
-public:
+ 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)
+ : m_equalVertexThreshold(VORONOI_DEFAULT_EQUAL_VERTEX_THRESHOLD)
{
}
- void reset();
-
- void addVertex(const btVector3& w, const btVector3& p, const btVector3& q);
+ void reset();
- void setEqualVertexThreshold(btScalar threshold)
- {
- m_equalVertexThreshold = threshold;
- }
+ void addVertex(const btVector3& w, const btVector3& p, const btVector3& q);
- btScalar getEqualVertexThreshold() const
- {
- return m_equalVertexThreshold;
- }
+ void setEqualVertexThreshold(btScalar threshold)
+ {
+ m_equalVertexThreshold = threshold;
+ }
- bool closest(btVector3& v);
+ btScalar getEqualVertexThreshold() const
+ {
+ return m_equalVertexThreshold;
+ }
- btScalar maxVertex();
+ bool closest(btVector3 & v);
- bool fullSimplex() const
- {
- return (m_numVertices == 4);
- }
+ btScalar maxVertex();
- int getSimplex(btVector3 *pBuf, btVector3 *qBuf, btVector3 *yBuf) const;
+ bool fullSimplex() const
+ {
+ return (m_numVertices == 4);
+ }
- bool inSimplex(const btVector3& w);
-
- void backup_closest(btVector3& v) ;
+ int getSimplex(btVector3 * pBuf, btVector3 * qBuf, btVector3 * yBuf) const;
- bool emptySimplex() const ;
+ bool inSimplex(const btVector3& w);
- void compute_points(btVector3& p1, btVector3& p2) ;
+ void backup_closest(btVector3 & v);
- int numVertices() const
- {
- return m_numVertices;
- }
+ bool emptySimplex() const;
+ void compute_points(btVector3 & p1, btVector3 & p2);
+ int numVertices() const
+ {
+ return m_numVertices;
+ }
};
-#endif //BT_VORONOI_SIMPLEX_SOLVER_H
-
+#endif //BT_VORONOI_SIMPLEX_SOLVER_H
diff --git a/thirdparty/bullet/BulletDynamics/Character/btCharacterControllerInterface.h b/thirdparty/bullet/BulletDynamics/Character/btCharacterControllerInterface.h
index abe24b5ca6..2ccf317b92 100644
--- a/thirdparty/bullet/BulletDynamics/Character/btCharacterControllerInterface.h
+++ b/thirdparty/bullet/BulletDynamics/Character/btCharacterControllerInterface.h
@@ -26,22 +26,21 @@ 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;
-};
+ 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;
-#endif //BT_CHARACTER_CONTROLLER_INTERFACE_H
+ 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/thirdparty/bullet/BulletDynamics/Character/btKinematicCharacterController.cpp b/thirdparty/bullet/BulletDynamics/Character/btKinematicCharacterController.cpp
index cb1aa71a14..2bbccb291c 100644
--- a/thirdparty/bullet/BulletDynamics/Character/btKinematicCharacterController.cpp
+++ b/thirdparty/bullet/BulletDynamics/Character/btKinematicCharacterController.cpp
@@ -13,7 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include <stdio.h>
#include "LinearMath/btIDebugDraw.h"
#include "BulletCollision/CollisionDispatch/btGhostObject.h"
@@ -24,20 +23,19 @@ subject to the following restrictions:
#include "LinearMath/btDefaultMotionState.h"
#include "btKinematicCharacterController.h"
-
// static helper method
static btVector3
getNormalizedVector(const btVector3& v)
{
btVector3 n(0, 0, 0);
- if (v.length() > SIMD_EPSILON) {
+ if (v.length() > SIMD_EPSILON)
+ {
n = v.normalized();
}
return n;
}
-
///@todo Interact with dynamic objects,
///Ride kinematicly animated platforms properly
///More realistic (or maybe just a config option) falling
@@ -47,18 +45,19 @@ getNormalizedVector(const btVector3& v)
class btKinematicClosestNotMeRayResultCallback : public btCollisionWorld::ClosestRayResultCallback
{
public:
- btKinematicClosestNotMeRayResultCallback (btCollisionObject* me) : btCollisionWorld::ClosestRayResultCallback(btVector3(0.0, 0.0, 0.0), btVector3(0.0, 0.0, 0.0))
+ btKinematicClosestNotMeRayResultCallback(btCollisionObject* me) : btCollisionWorld::ClosestRayResultCallback(btVector3(0.0, 0.0, 0.0), btVector3(0.0, 0.0, 0.0))
{
m_me = me;
}
- virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult& rayResult,bool normalInWorldSpace)
+ virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult& rayResult, bool normalInWorldSpace)
{
if (rayResult.m_collisionObject == m_me)
return 1.0;
- return ClosestRayResultCallback::addSingleResult (rayResult, normalInWorldSpace);
+ return ClosestRayResultCallback::addSingleResult(rayResult, normalInWorldSpace);
}
+
protected:
btCollisionObject* m_me;
};
@@ -66,15 +65,12 @@ protected:
class btKinematicClosestNotMeConvexResultCallback : public btCollisionWorld::ClosestConvexResultCallback
{
public:
- btKinematicClosestNotMeConvexResultCallback (btCollisionObject* me, const btVector3& up, btScalar minSlopeDot)
- : btCollisionWorld::ClosestConvexResultCallback(btVector3(0.0, 0.0, 0.0), btVector3(0.0, 0.0, 0.0))
- , m_me(me)
- , m_up(up)
- , m_minSlopeDot(minSlopeDot)
+ btKinematicClosestNotMeConvexResultCallback(btCollisionObject* me, const btVector3& up, btScalar minSlopeDot)
+ : btCollisionWorld::ClosestConvexResultCallback(btVector3(0.0, 0.0, 0.0), btVector3(0.0, 0.0, 0.0)), m_me(me), m_up(up), m_minSlopeDot(minSlopeDot)
{
}
- virtual btScalar addSingleResult(btCollisionWorld::LocalConvexResult& convexResult,bool normalInWorldSpace)
+ virtual btScalar addSingleResult(btCollisionWorld::LocalConvexResult& convexResult, bool normalInWorldSpace)
{
if (convexResult.m_hitCollisionObject == m_me)
return btScalar(1.0);
@@ -86,19 +82,22 @@ public:
if (normalInWorldSpace)
{
hitNormalWorld = convexResult.m_hitNormalLocal;
- } else
+ }
+ else
{
///need to transform normal into worldspace
- hitNormalWorld = convexResult.m_hitCollisionObject->getWorldTransform().getBasis()*convexResult.m_hitNormalLocal;
+ hitNormalWorld = convexResult.m_hitCollisionObject->getWorldTransform().getBasis() * convexResult.m_hitNormalLocal;
}
btScalar dotUp = m_up.dot(hitNormalWorld);
- if (dotUp < m_minSlopeDot) {
+ if (dotUp < m_minSlopeDot)
+ {
return btScalar(1.0);
}
- return ClosestConvexResultCallback::addSingleResult (convexResult, normalInWorldSpace);
+ return ClosestConvexResultCallback::addSingleResult(convexResult, normalInWorldSpace);
}
+
protected:
btCollisionObject* m_me;
const btVector3 m_up;
@@ -110,7 +109,7 @@ protected:
*
* from: http://www-cs-students.stanford.edu/~adityagp/final/node3.html
*/
-btVector3 btKinematicCharacterController::computeReflectionDirection (const btVector3& direction, const btVector3& normal)
+btVector3 btKinematicCharacterController::computeReflectionDirection(const btVector3& direction, const btVector3& normal)
{
return direction - (btScalar(2.0) * direction.dot(normal)) * normal;
}
@@ -118,7 +117,7 @@ btVector3 btKinematicCharacterController::computeReflectionDirection (const btVe
/*
* Returns the portion of 'direction' that is parallel to 'normal'
*/
-btVector3 btKinematicCharacterController::parallelComponent (const btVector3& direction, const btVector3& normal)
+btVector3 btKinematicCharacterController::parallelComponent(const btVector3& direction, const btVector3& normal)
{
btScalar magnitude = direction.dot(normal);
return normal * magnitude;
@@ -127,29 +126,29 @@ btVector3 btKinematicCharacterController::parallelComponent (const btVector3& di
/*
* Returns the portion of 'direction' that is perpindicular to 'normal'
*/
-btVector3 btKinematicCharacterController::perpindicularComponent (const btVector3& direction, const btVector3& normal)
+btVector3 btKinematicCharacterController::perpindicularComponent(const btVector3& direction, const btVector3& normal)
{
return direction - parallelComponent(direction, normal);
}
-btKinematicCharacterController::btKinematicCharacterController (btPairCachingGhostObject* ghostObject,btConvexShape* convexShape,btScalar stepHeight, const btVector3& up)
+btKinematicCharacterController::btKinematicCharacterController(btPairCachingGhostObject* ghostObject, btConvexShape* convexShape, btScalar stepHeight, const btVector3& up)
{
m_ghostObject = ghostObject;
m_up.setValue(0.0f, 0.0f, 1.0f);
m_jumpAxis.setValue(0.0f, 0.0f, 1.0f);
m_addedMargin = 0.02;
- m_walkDirection.setValue(0.0,0.0,0.0);
+ m_walkDirection.setValue(0.0, 0.0, 0.0);
m_AngVel.setValue(0.0, 0.0, 0.0);
- m_useGhostObjectSweepTest = true;
+ m_useGhostObjectSweepTest = true;
m_turnAngle = btScalar(0.0);
- m_convexShape=convexShape;
- m_useWalkDirection = true; // use walk direction by default, legacy behavior
+ m_convexShape = convexShape;
+ m_useWalkDirection = true; // use walk direction by default, legacy behavior
m_velocityTimeInterval = 0.0;
m_verticalVelocity = 0.0;
m_verticalOffset = 0.0;
- m_gravity = 9.8 * 3.0 ; // 3G acceleration.
- m_fallSpeed = 55.0; // Terminal velocity of a sky diver in m/s.
- m_jumpSpeed = 10.0; // ?
+ m_gravity = 9.8 * 3.0; // 3G acceleration.
+ m_fallSpeed = 55.0; // Terminal velocity of a sky diver in m/s.
+ m_jumpSpeed = 10.0; // ?
m_SetjumpSpeed = m_jumpSpeed;
m_wasOnGround = false;
m_wasJumping = false;
@@ -166,7 +165,7 @@ btKinematicCharacterController::btKinematicCharacterController (btPairCachingGho
setMaxSlope(btRadians(45.0));
}
-btKinematicCharacterController::~btKinematicCharacterController ()
+btKinematicCharacterController::~btKinematicCharacterController()
{
}
@@ -175,7 +174,7 @@ btPairCachingGhostObject* btKinematicCharacterController::getGhostObject()
return m_ghostObject;
}
-bool btKinematicCharacterController::recoverFromPenetration ( btCollisionWorld* collisionWorld)
+bool btKinematicCharacterController::recoverFromPenetration(btCollisionWorld* collisionWorld)
{
// Here we must refresh the overlapping paircache as the penetrating movement itself or the
// previous recovery iteration might have used setWorldTransform and pushed us into an object
@@ -186,19 +185,19 @@ bool btKinematicCharacterController::recoverFromPenetration ( btCollisionWorld*
// paircache and the ghostobject's internal paircache at the same time. /BW
btVector3 minAabb, maxAabb;
- m_convexShape->getAabb(m_ghostObject->getWorldTransform(), minAabb,maxAabb);
- collisionWorld->getBroadphase()->setAabb(m_ghostObject->getBroadphaseHandle(),
- minAabb,
- maxAabb,
- collisionWorld->getDispatcher());
-
+ m_convexShape->getAabb(m_ghostObject->getWorldTransform(), minAabb, maxAabb);
+ collisionWorld->getBroadphase()->setAabb(m_ghostObject->getBroadphaseHandle(),
+ minAabb,
+ maxAabb,
+ collisionWorld->getDispatcher());
+
bool penetration = false;
collisionWorld->getDispatcher()->dispatchAllCollisionPairs(m_ghostObject->getOverlappingPairCache(), collisionWorld->getDispatchInfo(), collisionWorld->getDispatcher());
m_currentPosition = m_ghostObject->getWorldTransform().getOrigin();
-
-// btScalar maxPen = btScalar(0.0);
+
+ // btScalar maxPen = btScalar(0.0);
for (int i = 0; i < m_ghostObject->getOverlappingPairCache()->getNumOverlappingPairs(); i++)
{
m_manifoldArray.resize(0);
@@ -206,25 +205,24 @@ bool btKinematicCharacterController::recoverFromPenetration ( btCollisionWorld*
btBroadphasePair* collisionPair = &m_ghostObject->getOverlappingPairCache()->getOverlappingPairArray()[i];
btCollisionObject* obj0 = static_cast<btCollisionObject*>(collisionPair->m_pProxy0->m_clientObject);
- btCollisionObject* obj1 = static_cast<btCollisionObject*>(collisionPair->m_pProxy1->m_clientObject);
+ btCollisionObject* obj1 = static_cast<btCollisionObject*>(collisionPair->m_pProxy1->m_clientObject);
if ((obj0 && !obj0->hasContactResponse()) || (obj1 && !obj1->hasContactResponse()))
continue;
if (!needsCollision(obj0, obj1))
continue;
-
+
if (collisionPair->m_algorithm)
collisionPair->m_algorithm->getAllContactManifolds(m_manifoldArray);
-
- for (int j=0;j<m_manifoldArray.size();j++)
+ for (int j = 0; j < m_manifoldArray.size(); j++)
{
btPersistentManifold* manifold = m_manifoldArray[j];
btScalar directionSign = manifold->getBody0() == m_ghostObject ? btScalar(-1.0) : btScalar(1.0);
- for (int p=0;p<manifold->getNumContacts();p++)
+ for (int p = 0; p < manifold->getNumContacts(); p++)
{
- const btManifoldPoint&pt = manifold->getContactPoint(p);
+ const btManifoldPoint& pt = manifold->getContactPoint(p);
btScalar dist = pt.getDistance();
@@ -239,22 +237,24 @@ bool btKinematicCharacterController::recoverFromPenetration ( btCollisionWorld*
//}
m_currentPosition += pt.m_normalWorldOnB * directionSign * dist * btScalar(0.2);
penetration = true;
- } else {
+ }
+ else
+ {
//printf("touching %f\n", dist);
}
}
-
+
//manifold->clearManifold();
}
}
btTransform newTrans = m_ghostObject->getWorldTransform();
newTrans.setOrigin(m_currentPosition);
m_ghostObject->setWorldTransform(newTrans);
-// printf("m_touchingNormal = %f,%f,%f\n",m_touchingNormal[0],m_touchingNormal[1],m_touchingNormal[2]);
+ // printf("m_touchingNormal = %f,%f,%f\n",m_touchingNormal[0],m_touchingNormal[1],m_touchingNormal[2]);
return penetration;
}
-void btKinematicCharacterController::stepUp ( btCollisionWorld* world)
+void btKinematicCharacterController::stepUp(btCollisionWorld* world)
{
btScalar stepHeight = 0.0f;
if (m_verticalVelocity < 0.0)
@@ -263,8 +263,8 @@ void btKinematicCharacterController::stepUp ( btCollisionWorld* world)
// phase 1: up
btTransform start, end;
- start.setIdentity ();
- end.setIdentity ();
+ start.setIdentity();
+ end.setIdentity();
/* FIXME: Handle penetration properly */
start.setOrigin(m_currentPosition);
@@ -272,7 +272,7 @@ void btKinematicCharacterController::stepUp ( btCollisionWorld* world)
m_targetPosition = m_currentPosition + m_up * (stepHeight) + m_jumpAxis * ((m_verticalOffset > 0.f ? m_verticalOffset : 0.f));
m_currentPosition = m_targetPosition;
- end.setOrigin (m_targetPosition);
+ end.setOrigin(m_targetPosition);
start.setRotation(m_currentOrientation);
end.setRotation(m_targetOrientation);
@@ -280,10 +280,10 @@ void btKinematicCharacterController::stepUp ( btCollisionWorld* world)
btKinematicClosestNotMeConvexResultCallback callback(m_ghostObject, -m_up, m_maxSlopeCosine);
callback.m_collisionFilterGroup = getGhostObject()->getBroadphaseHandle()->m_collisionFilterGroup;
callback.m_collisionFilterMask = getGhostObject()->getBroadphaseHandle()->m_collisionFilterMask;
-
+
if (m_useGhostObjectSweepTest)
{
- m_ghostObject->convexSweepTest (m_convexShape, start, end, callback, world->getDispatchInfo().m_allowedCcdPenetration);
+ m_ghostObject->convexSweepTest(m_convexShape, start, end, callback, world->getDispatchInfo().m_allowedCcdPenetration);
}
else
{
@@ -298,7 +298,7 @@ void btKinematicCharacterController::stepUp ( btCollisionWorld* world)
// we moved up only a fraction of the step height
m_currentStepOffset = stepHeight * callback.m_closestHitFraction;
if (m_interpolateUp == true)
- m_currentPosition.setInterpolate3 (m_currentPosition, m_targetPosition, callback.m_closestHitFraction);
+ m_currentPosition.setInterpolate3(m_currentPosition, m_targetPosition, callback.m_closestHitFraction);
else
m_currentPosition = m_targetPosition;
}
@@ -329,7 +329,9 @@ void btKinematicCharacterController::stepUp ( btCollisionWorld* world)
m_verticalVelocity = 0.0;
m_currentStepOffset = m_stepHeight;
}
- } else {
+ }
+ else
+ {
m_currentStepOffset = stepHeight;
m_currentPosition = m_targetPosition;
}
@@ -342,43 +344,44 @@ bool btKinematicCharacterController::needsCollision(const btCollisionObject* bod
return collides;
}
-void btKinematicCharacterController::updateTargetPositionBasedOnCollision (const btVector3& hitNormal, btScalar tangentMag, btScalar normalMag)
+void btKinematicCharacterController::updateTargetPositionBasedOnCollision(const btVector3& hitNormal, btScalar tangentMag, btScalar normalMag)
{
btVector3 movementDirection = m_targetPosition - m_currentPosition;
btScalar movementLength = movementDirection.length();
- if (movementLength>SIMD_EPSILON)
+ if (movementLength > SIMD_EPSILON)
{
movementDirection.normalize();
- btVector3 reflectDir = computeReflectionDirection (movementDirection, hitNormal);
+ btVector3 reflectDir = computeReflectionDirection(movementDirection, hitNormal);
reflectDir.normalize();
btVector3 parallelDir, perpindicularDir;
- parallelDir = parallelComponent (reflectDir, hitNormal);
- perpindicularDir = perpindicularComponent (reflectDir, hitNormal);
+ parallelDir = parallelComponent(reflectDir, hitNormal);
+ perpindicularDir = perpindicularComponent(reflectDir, hitNormal);
m_targetPosition = m_currentPosition;
- if (0)//tangentMag != 0.0)
+ if (0) //tangentMag != 0.0)
{
- btVector3 parComponent = parallelDir * btScalar (tangentMag*movementLength);
-// printf("parComponent=%f,%f,%f\n",parComponent[0],parComponent[1],parComponent[2]);
- m_targetPosition += parComponent;
+ btVector3 parComponent = parallelDir * btScalar(tangentMag * movementLength);
+ // printf("parComponent=%f,%f,%f\n",parComponent[0],parComponent[1],parComponent[2]);
+ m_targetPosition += parComponent;
}
if (normalMag != 0.0)
{
- btVector3 perpComponent = perpindicularDir * btScalar (normalMag*movementLength);
-// printf("perpComponent=%f,%f,%f\n",perpComponent[0],perpComponent[1],perpComponent[2]);
+ btVector3 perpComponent = perpindicularDir * btScalar(normalMag * movementLength);
+ // printf("perpComponent=%f,%f,%f\n",perpComponent[0],perpComponent[1],perpComponent[2]);
m_targetPosition += perpComponent;
}
- } else
+ }
+ else
{
-// printf("movementLength don't normalize a zero vector\n");
+ // printf("movementLength don't normalize a zero vector\n");
}
}
-void btKinematicCharacterController::stepForwardAndStrafe ( btCollisionWorld* collisionWorld, const btVector3& walkMove)
+void btKinematicCharacterController::stepForwardAndStrafe(btCollisionWorld* collisionWorld, const btVector3& walkMove)
{
// printf("m_normalizedDirection=%f,%f,%f\n",
// m_normalizedDirection[0],m_normalizedDirection[1],m_normalizedDirection[2]);
@@ -387,29 +390,28 @@ void btKinematicCharacterController::stepForwardAndStrafe ( btCollisionWorld* co
m_targetPosition = m_currentPosition + walkMove;
- start.setIdentity ();
- end.setIdentity ();
-
+ start.setIdentity();
+ end.setIdentity();
+
btScalar fraction = 1.0;
- btScalar distance2 = (m_currentPosition-m_targetPosition).length2();
-// printf("distance2=%f\n",distance2);
+ btScalar distance2 = (m_currentPosition - m_targetPosition).length2();
+ // printf("distance2=%f\n",distance2);
int maxIter = 10;
while (fraction > btScalar(0.01) && maxIter-- > 0)
{
- start.setOrigin (m_currentPosition);
- end.setOrigin (m_targetPosition);
+ start.setOrigin(m_currentPosition);
+ end.setOrigin(m_targetPosition);
btVector3 sweepDirNegative(m_currentPosition - m_targetPosition);
start.setRotation(m_currentOrientation);
end.setRotation(m_targetOrientation);
- btKinematicClosestNotMeConvexResultCallback callback (m_ghostObject, sweepDirNegative, btScalar(0.0));
+ btKinematicClosestNotMeConvexResultCallback callback(m_ghostObject, sweepDirNegative, btScalar(0.0));
callback.m_collisionFilterGroup = getGhostObject()->getBroadphaseHandle()->m_collisionFilterGroup;
callback.m_collisionFilterMask = getGhostObject()->getBroadphaseHandle()->m_collisionFilterMask;
-
btScalar margin = m_convexShape->getMargin();
m_convexShape->setMargin(margin + m_addedMargin);
@@ -426,18 +428,17 @@ void btKinematicCharacterController::stepForwardAndStrafe ( btCollisionWorld* co
}
m_convexShape->setMargin(margin);
-
fraction -= callback.m_closestHitFraction;
if (callback.hasHit() && m_ghostObject->hasContactResponse() && needsCollision(m_ghostObject, callback.m_hitCollisionObject))
- {
+ {
// we moved only a fraction
//btScalar hitDistance;
//hitDistance = (callback.m_hitPointWorld - m_currentPosition).length();
-// m_currentPosition.setInterpolate3 (m_currentPosition, m_targetPosition, callback.m_closestHitFraction);
+ // m_currentPosition.setInterpolate3 (m_currentPosition, m_targetPosition, callback.m_closestHitFraction);
- updateTargetPositionBasedOnCollision (callback.m_hitNormalWorld);
+ updateTargetPositionBasedOnCollision(callback.m_hitNormalWorld);
btVector3 currentDir = m_targetPosition - m_currentPosition;
distance2 = currentDir.length2();
if (distance2 > SIMD_EPSILON)
@@ -448,21 +449,21 @@ void btKinematicCharacterController::stepForwardAndStrafe ( btCollisionWorld* co
{
break;
}
- } else
+ }
+ else
{
-// printf("currentDir: don't normalize a zero vector\n");
+ // printf("currentDir: don't normalize a zero vector\n");
break;
}
-
}
- else
- {
- m_currentPosition = m_targetPosition;
+ else
+ {
+ m_currentPosition = m_targetPosition;
}
}
}
-void btKinematicCharacterController::stepDown ( btCollisionWorld* collisionWorld, btScalar dt)
+void btKinematicCharacterController::stepDown(btCollisionWorld* collisionWorld, btScalar dt)
{
btTransform start, end, end_double;
bool runonce = false;
@@ -475,64 +476,64 @@ void btKinematicCharacterController::stepDown ( btCollisionWorld* collisionWorld
m_targetPosition -= (step_drop + gravity_drop);*/
btVector3 orig_position = m_targetPosition;
-
- btScalar downVelocity = (m_verticalVelocity<0.f?-m_verticalVelocity:0.f) * dt;
+
+ btScalar downVelocity = (m_verticalVelocity < 0.f ? -m_verticalVelocity : 0.f) * dt;
if (m_verticalVelocity > 0.0)
return;
- if(downVelocity > 0.0 && downVelocity > m_fallSpeed
- && (m_wasOnGround || !m_wasJumping))
+ if (downVelocity > 0.0 && downVelocity > m_fallSpeed && (m_wasOnGround || !m_wasJumping))
downVelocity = m_fallSpeed;
btVector3 step_drop = m_up * (m_currentStepOffset + downVelocity);
m_targetPosition -= step_drop;
btKinematicClosestNotMeConvexResultCallback callback(m_ghostObject, m_up, m_maxSlopeCosine);
- callback.m_collisionFilterGroup = getGhostObject()->getBroadphaseHandle()->m_collisionFilterGroup;
- callback.m_collisionFilterMask = getGhostObject()->getBroadphaseHandle()->m_collisionFilterMask;
+ callback.m_collisionFilterGroup = getGhostObject()->getBroadphaseHandle()->m_collisionFilterGroup;
+ callback.m_collisionFilterMask = getGhostObject()->getBroadphaseHandle()->m_collisionFilterMask;
btKinematicClosestNotMeConvexResultCallback callback2(m_ghostObject, m_up, m_maxSlopeCosine);
- callback2.m_collisionFilterGroup = getGhostObject()->getBroadphaseHandle()->m_collisionFilterGroup;
- callback2.m_collisionFilterMask = getGhostObject()->getBroadphaseHandle()->m_collisionFilterMask;
+ callback2.m_collisionFilterGroup = getGhostObject()->getBroadphaseHandle()->m_collisionFilterGroup;
+ callback2.m_collisionFilterMask = getGhostObject()->getBroadphaseHandle()->m_collisionFilterMask;
while (1)
{
- start.setIdentity ();
- end.setIdentity ();
+ start.setIdentity();
+ end.setIdentity();
- end_double.setIdentity ();
+ end_double.setIdentity();
- start.setOrigin (m_currentPosition);
- end.setOrigin (m_targetPosition);
+ start.setOrigin(m_currentPosition);
+ end.setOrigin(m_targetPosition);
start.setRotation(m_currentOrientation);
end.setRotation(m_targetOrientation);
//set double test for 2x the step drop, to check for a large drop vs small drop
- end_double.setOrigin (m_targetPosition - step_drop);
+ end_double.setOrigin(m_targetPosition - step_drop);
if (m_useGhostObjectSweepTest)
{
- m_ghostObject->convexSweepTest (m_convexShape, start, end, callback, collisionWorld->getDispatchInfo().m_allowedCcdPenetration);
+ m_ghostObject->convexSweepTest(m_convexShape, start, end, callback, collisionWorld->getDispatchInfo().m_allowedCcdPenetration);
if (!callback.hasHit() && m_ghostObject->hasContactResponse())
{
//test a double fall height, to see if the character should interpolate it's fall (full) or not (partial)
- m_ghostObject->convexSweepTest (m_convexShape, start, end_double, callback2, collisionWorld->getDispatchInfo().m_allowedCcdPenetration);
+ m_ghostObject->convexSweepTest(m_convexShape, start, end_double, callback2, collisionWorld->getDispatchInfo().m_allowedCcdPenetration);
}
- } else
+ }
+ else
{
- collisionWorld->convexSweepTest (m_convexShape, start, end, callback, collisionWorld->getDispatchInfo().m_allowedCcdPenetration);
+ collisionWorld->convexSweepTest(m_convexShape, start, end, callback, collisionWorld->getDispatchInfo().m_allowedCcdPenetration);
if (!callback.hasHit() && m_ghostObject->hasContactResponse())
{
//test a double fall height, to see if the character should interpolate it's fall (large) or not (small)
- collisionWorld->convexSweepTest (m_convexShape, start, end_double, callback2, collisionWorld->getDispatchInfo().m_allowedCcdPenetration);
+ collisionWorld->convexSweepTest(m_convexShape, start, end_double, callback2, collisionWorld->getDispatchInfo().m_allowedCcdPenetration);
}
}
-
- btScalar downVelocity2 = (m_verticalVelocity<0.f?-m_verticalVelocity:0.f) * dt;
+
+ btScalar downVelocity2 = (m_verticalVelocity < 0.f ? -m_verticalVelocity : 0.f) * dt;
bool has_hit;
if (bounce_fix == true)
has_hit = (callback.hasHit() || callback2.hasHit()) && m_ghostObject->hasContactResponse() && needsCollision(m_ghostObject, callback.m_hitCollisionObject);
@@ -543,8 +544,7 @@ void btKinematicCharacterController::stepDown ( btCollisionWorld* collisionWorld
if (m_verticalVelocity < 0.0)
stepHeight = m_stepHeight;
- if (downVelocity2 > 0.0 && downVelocity2 < stepHeight && has_hit == true && runonce == false
- && (m_wasOnGround || !m_wasJumping))
+ if (downVelocity2 > 0.0 && downVelocity2 < stepHeight && has_hit == true && runonce == false && (m_wasOnGround || !m_wasJumping))
{
//redo the velocity calculation when falling a small amount, for fast stairs motion
//for larger falls, use the smoother/slower interpolated movement by not touching the target position
@@ -555,7 +555,7 @@ void btKinematicCharacterController::stepDown ( btCollisionWorld* collisionWorld
step_drop = m_up * (m_currentStepOffset + downVelocity);
m_targetPosition -= step_drop;
runonce = true;
- continue; //re-run previous tests
+ continue; //re-run previous tests
}
break;
}
@@ -570,30 +570,32 @@ void btKinematicCharacterController::stepDown ( btCollisionWorld* collisionWorld
if (bounce_fix == true)
{
if (full_drop == true)
- m_currentPosition.setInterpolate3 (m_currentPosition, m_targetPosition, callback.m_closestHitFraction);
- else
+ m_currentPosition.setInterpolate3(m_currentPosition, m_targetPosition, callback.m_closestHitFraction);
+ else
//due to errors in the closestHitFraction variable when used with large polygons, calculate the hit fraction manually
- m_currentPosition.setInterpolate3 (m_currentPosition, m_targetPosition, fraction);
+ m_currentPosition.setInterpolate3(m_currentPosition, m_targetPosition, fraction);
}
else
- m_currentPosition.setInterpolate3 (m_currentPosition, m_targetPosition, callback.m_closestHitFraction);
+ m_currentPosition.setInterpolate3(m_currentPosition, m_targetPosition, callback.m_closestHitFraction);
full_drop = false;
m_verticalVelocity = 0.0;
m_verticalOffset = 0.0;
m_wasJumping = false;
- } else {
+ }
+ else
+ {
// we dropped the full height
full_drop = true;
if (bounce_fix == true)
{
- downVelocity = (m_verticalVelocity<0.f?-m_verticalVelocity:0.f) * dt;
+ downVelocity = (m_verticalVelocity < 0.f ? -m_verticalVelocity : 0.f) * dt;
if (downVelocity > m_fallSpeed && (m_wasOnGround || !m_wasJumping))
{
- m_targetPosition += step_drop; //undo previous target change
+ m_targetPosition += step_drop; //undo previous target change
downVelocity = m_fallSpeed;
step_drop = m_up * (m_currentStepOffset + downVelocity);
m_targetPosition -= step_drop;
@@ -605,30 +607,22 @@ void btKinematicCharacterController::stepDown ( btCollisionWorld* collisionWorld
}
}
-
-
-void btKinematicCharacterController::setWalkDirection
-(
-const btVector3& walkDirection
-)
+void btKinematicCharacterController::setWalkDirection(
+ const btVector3& walkDirection)
{
m_useWalkDirection = true;
m_walkDirection = walkDirection;
m_normalizedDirection = getNormalizedVector(m_walkDirection);
}
-
-
-void btKinematicCharacterController::setVelocityForTimeInterval
-(
-const btVector3& velocity,
-btScalar timeInterval
-)
+void btKinematicCharacterController::setVelocityForTimeInterval(
+ const btVector3& velocity,
+ btScalar timeInterval)
{
-// printf("setVelocity!\n");
-// printf(" interval: %f\n", timeInterval);
-// printf(" velocity: (%f, %f, %f)\n",
-// velocity.x(), velocity.y(), velocity.z());
+ // printf("setVelocity!\n");
+ // printf(" interval: %f\n", timeInterval);
+ // printf(" velocity: (%f, %f, %f)\n",
+ // velocity.x(), velocity.y(), velocity.z());
m_useWalkDirection = false;
m_walkDirection = velocity;
@@ -661,7 +655,7 @@ void btKinematicCharacterController::setLinearVelocity(const btVector3& velocity
btVector3 upComponent = m_up * (btSin(SIMD_HALF_PI - btAcos(c)) * m_walkDirection.length());
m_walkDirection -= upComponent;
m_verticalVelocity = (c < 0.0f ? -1 : 1) * upComponent.length();
-
+
if (c > 0.0f)
{
m_wasJumping = true;
@@ -678,46 +672,45 @@ btVector3 btKinematicCharacterController::getLinearVelocity() const
return m_walkDirection + (m_verticalVelocity * m_up);
}
-void btKinematicCharacterController::reset ( btCollisionWorld* collisionWorld )
+void btKinematicCharacterController::reset(btCollisionWorld* collisionWorld)
{
- m_verticalVelocity = 0.0;
- m_verticalOffset = 0.0;
- m_wasOnGround = false;
- m_wasJumping = false;
- m_walkDirection.setValue(0,0,0);
- m_velocityTimeInterval = 0.0;
+ m_verticalVelocity = 0.0;
+ m_verticalOffset = 0.0;
+ m_wasOnGround = false;
+ m_wasJumping = false;
+ m_walkDirection.setValue(0, 0, 0);
+ m_velocityTimeInterval = 0.0;
- //clear pair cache
- btHashedOverlappingPairCache *cache = m_ghostObject->getOverlappingPairCache();
- while (cache->getOverlappingPairArray().size() > 0)
- {
- cache->removeOverlappingPair(cache->getOverlappingPairArray()[0].m_pProxy0, cache->getOverlappingPairArray()[0].m_pProxy1, collisionWorld->getDispatcher());
- }
+ //clear pair cache
+ btHashedOverlappingPairCache* cache = m_ghostObject->getOverlappingPairCache();
+ while (cache->getOverlappingPairArray().size() > 0)
+ {
+ cache->removeOverlappingPair(cache->getOverlappingPairArray()[0].m_pProxy0, cache->getOverlappingPairArray()[0].m_pProxy1, collisionWorld->getDispatcher());
+ }
}
-void btKinematicCharacterController::warp (const btVector3& origin)
+void btKinematicCharacterController::warp(const btVector3& origin)
{
btTransform xform;
xform.setIdentity();
- xform.setOrigin (origin);
- m_ghostObject->setWorldTransform (xform);
+ xform.setOrigin(origin);
+ m_ghostObject->setWorldTransform(xform);
}
-
-void btKinematicCharacterController::preStep ( btCollisionWorld* collisionWorld)
+void btKinematicCharacterController::preStep(btCollisionWorld* collisionWorld)
{
m_currentPosition = m_ghostObject->getWorldTransform().getOrigin();
m_targetPosition = m_currentPosition;
m_currentOrientation = m_ghostObject->getWorldTransform().getRotation();
m_targetOrientation = m_currentOrientation;
-// printf("m_targetPosition=%f,%f,%f\n",m_targetPosition[0],m_targetPosition[1],m_targetPosition[2]);
+ // printf("m_targetPosition=%f,%f,%f\n",m_targetPosition[0],m_targetPosition[1],m_targetPosition[2]);
}
-void btKinematicCharacterController::playerStep ( btCollisionWorld* collisionWorld, btScalar dt)
+void btKinematicCharacterController::playerStep(btCollisionWorld* collisionWorld, btScalar dt)
{
-// printf("playerStep(): ");
-// printf(" dt = %f", dt);
+ // printf("playerStep(): ");
+ // printf(" dt = %f", dt);
if (m_AngVel.length2() > 0.0f)
{
@@ -744,16 +737,17 @@ void btKinematicCharacterController::playerStep ( btCollisionWorld* collisionWo
}
// quick check...
- if (!m_useWalkDirection && (m_velocityTimeInterval <= 0.0)) {
-// printf("\n");
- return; // no motion
+ if (!m_useWalkDirection && (m_velocityTimeInterval <= 0.0 || m_walkDirection.fuzzyZero()))
+ {
+ // printf("\n");
+ return; // no motion
}
m_wasOnGround = onGround();
//btVector3 lvel = m_walkDirection;
//btScalar c = 0.0f;
-
+
if (m_walkDirection.length2() > 0)
{
// apply damping
@@ -761,7 +755,7 @@ void btKinematicCharacterController::playerStep ( btCollisionWorld* collisionWo
}
m_verticalVelocity *= btPow(btScalar(1) - m_linearDamping, dt);
-
+
// Update fall velocity.
m_verticalVelocity -= m_gravity * dt;
if (m_verticalVelocity > 0.0 && m_verticalVelocity > m_jumpSpeed)
@@ -777,12 +771,12 @@ void btKinematicCharacterController::playerStep ( btCollisionWorld* collisionWo
btTransform xform;
xform = m_ghostObject->getWorldTransform();
-// printf("walkDirection(%f,%f,%f)\n",walkDirection[0],walkDirection[1],walkDirection[2]);
-// printf("walkSpeed=%f\n",walkSpeed);
+ // printf("walkDirection(%f,%f,%f)\n",walkDirection[0],walkDirection[1],walkDirection[2]);
+ // printf("walkSpeed=%f\n",walkSpeed);
stepUp(collisionWorld);
//todo: Experimenting with behavior of controller when it hits a ceiling..
- //bool hitUp = stepUp (collisionWorld);
+ //bool hitUp = stepUp (collisionWorld);
//if (hitUp)
//{
// m_verticalVelocity -= m_gravity * dt;
@@ -799,9 +793,12 @@ void btKinematicCharacterController::playerStep ( btCollisionWorld* collisionWo
// xform = m_ghostObject->getWorldTransform();
//}
- if (m_useWalkDirection) {
- stepForwardAndStrafe (collisionWorld, m_walkDirection);
- } else {
+ if (m_useWalkDirection)
+ {
+ stepForwardAndStrafe(collisionWorld, m_walkDirection);
+ }
+ else
+ {
//printf(" time: %f", m_velocityTimeInterval);
// still have some time left for moving!
btScalar dtMoving =
@@ -816,7 +813,7 @@ void btKinematicCharacterController::playerStep ( btCollisionWorld* collisionWo
// okay, step
stepForwardAndStrafe(collisionWorld, move);
}
- stepDown (collisionWorld, dt);
+ stepDown(collisionWorld, dt);
//todo: Experimenting with max jump height
//if (m_wasJumping)
@@ -827,7 +824,7 @@ void btKinematicCharacterController::playerStep ( btCollisionWorld* collisionWo
// // substract the overshoot
// m_currentPosition[m_upAxis] -= ds - m_maxJumpHeight;
- // // max height was reached, so potential energy is at max
+ // // max height was reached, so potential energy is at max
// // and kinematic energy is 0, thus velocity is 0.
// if (m_verticalVelocity > 0.0)
// m_verticalVelocity = 0.0;
@@ -835,8 +832,8 @@ void btKinematicCharacterController::playerStep ( btCollisionWorld* collisionWo
//}
// printf("\n");
- xform.setOrigin (m_currentPosition);
- m_ghostObject->setWorldTransform (xform);
+ xform.setOrigin(m_currentPosition);
+ m_ghostObject->setWorldTransform(xform);
int numPenetrationLoops = 0;
m_touchingContact = false;
@@ -852,23 +849,23 @@ void btKinematicCharacterController::playerStep ( btCollisionWorld* collisionWo
}
}
-void btKinematicCharacterController::setFallSpeed (btScalar fallSpeed)
+void btKinematicCharacterController::setFallSpeed(btScalar fallSpeed)
{
m_fallSpeed = fallSpeed;
}
-void btKinematicCharacterController::setJumpSpeed (btScalar jumpSpeed)
+void btKinematicCharacterController::setJumpSpeed(btScalar jumpSpeed)
{
m_jumpSpeed = jumpSpeed;
m_SetjumpSpeed = m_jumpSpeed;
}
-void btKinematicCharacterController::setMaxJumpHeight (btScalar maxJumpHeight)
+void btKinematicCharacterController::setMaxJumpHeight(btScalar maxJumpHeight)
{
m_maxJumpHeight = maxJumpHeight;
}
-bool btKinematicCharacterController::canJump () const
+bool btKinematicCharacterController::canJump() const
{
return onGround();
}
@@ -927,20 +924,20 @@ btScalar btKinematicCharacterController::getMaxPenetrationDepth() const
return m_maxPenetrationDepth;
}
-bool btKinematicCharacterController::onGround () const
+bool btKinematicCharacterController::onGround() const
{
return (fabs(m_verticalVelocity) < SIMD_EPSILON) && (fabs(m_verticalOffset) < SIMD_EPSILON);
}
-void btKinematicCharacterController::setStepHeight(btScalar h)
+void btKinematicCharacterController::setStepHeight(btScalar h)
{
m_stepHeight = h;
}
btVector3* btKinematicCharacterController::getUpAxisDirections()
{
- static btVector3 sUpAxisDirection[3] = { btVector3(1.0f, 0.0f, 0.0f), btVector3(0.0f, 1.0f, 0.0f), btVector3(0.0f, 0.0f, 1.0f) };
-
+ static btVector3 sUpAxisDirection[3] = {btVector3(1.0f, 0.0f, 0.0f), btVector3(0.0f, 1.0f, 0.0f), btVector3(0.0f, 0.0f, 1.0f)};
+
return sUpAxisDirection;
}
@@ -997,4 +994,3 @@ btQuaternion btKinematicCharacterController::getRotation(btVector3& v0, btVector
return shortestArcQuatNormalize2(v0, v1);
}
-
diff --git a/thirdparty/bullet/BulletDynamics/Character/btKinematicCharacterController.h b/thirdparty/bullet/BulletDynamics/Character/btKinematicCharacterController.h
index 00c59c0248..ff34fc871a 100644
--- a/thirdparty/bullet/BulletDynamics/Character/btKinematicCharacterController.h
+++ b/thirdparty/bullet/BulletDynamics/Character/btKinematicCharacterController.h
@@ -13,7 +13,6 @@ subject to the following restrictions:
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
@@ -23,7 +22,6 @@ subject to the following restrictions:
#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h"
-
class btCollisionShape;
class btConvexShape;
class btRigidBody;
@@ -34,15 +32,15 @@ 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
+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
-
+ 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;
@@ -50,33 +48,33 @@ protected:
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_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
+ 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_walkDirection;
+ btVector3 m_normalizedDirection;
+ btVector3 m_AngVel;
- btVector3 m_jumpPosition;
+ btVector3 m_jumpPosition;
//some internal variables
btVector3 m_currentPosition;
- btScalar m_currentStepOffset;
+ btScalar m_currentStepOffset;
btVector3 m_targetPosition;
btQuaternion m_currentOrientation;
btQuaternion m_targetOrientation;
///keep track of the contact manifolds
- btManifoldArray m_manifoldArray;
+ btManifoldArray m_manifoldArray;
bool m_touchingContact;
btVector3 m_touchingNormal;
@@ -84,52 +82,50 @@ protected:
btScalar m_linearDamping;
btScalar m_angularDamping;
- bool m_wasOnGround;
- bool m_wasJumping;
- bool m_useGhostObjectSweepTest;
- bool m_useWalkDirection;
- btScalar m_velocityTimeInterval;
+ 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;
+ 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);
+ 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);
+ 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;
+ 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 ();
-
+ 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)
+ virtual void updateAction(btCollisionWorld * collisionWorld, btScalar deltaTime)
{
- preStep ( collisionWorld);
- playerStep (collisionWorld, deltaTime);
+ preStep(collisionWorld);
+ playerStep(collisionWorld, deltaTime);
}
-
+
///btActionInterface interface
- void debugDraw(btIDebugDraw* debugDrawer);
+ void debugDraw(btIDebugDraw * debugDrawer);
void setUp(const btVector3& up);
@@ -140,7 +136,7 @@ public:
/// increment the position each simulation iteration, regardless
/// of dt.
/// This call will reset any velocity set by setVelocityForTimeInterval().
- virtual void setWalkDirection(const btVector3& walkDirection);
+ 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
@@ -148,7 +144,7 @@ public:
/// 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);
+ btScalar timeInterval);
virtual void setAngularVelocity(const btVector3& velocity);
virtual const btVector3& getAngularVelocity() const;
@@ -157,24 +153,24 @@ public:
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; }
+ 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; }
+ btScalar getAngularDamping() const { return m_angularDamping; }
- void reset ( btCollisionWorld* collisionWorld );
- void warp (const btVector3& origin);
+ void reset(btCollisionWorld * collisionWorld);
+ void warp(const btVector3& origin);
- void preStep ( btCollisionWorld* collisionWorld);
- void playerStep ( btCollisionWorld* collisionWorld, btScalar dt);
+ void preStep(btCollisionWorld * collisionWorld);
+ void playerStep(btCollisionWorld * collisionWorld, btScalar dt);
void setStepHeight(btScalar h);
btScalar getStepHeight() const { return m_stepHeight; }
- void setFallSpeed (btScalar fallSpeed);
+ void setFallSpeed(btScalar fallSpeed);
btScalar getFallSpeed() const { return m_fallSpeed; }
- void setJumpSpeed (btScalar jumpSpeed);
+ void setJumpSpeed(btScalar jumpSpeed);
btScalar getJumpSpeed() const { return m_jumpSpeed; }
- void setMaxJumpHeight (btScalar maxJumpHeight);
- bool canJump () const;
+ void setMaxJumpHeight(btScalar maxJumpHeight);
+ bool canJump() const;
void jump(const btVector3& v = btVector3(0, 0, 0));
@@ -192,13 +188,13 @@ public:
btScalar getMaxPenetrationDepth() const;
btPairCachingGhostObject* getGhostObject();
- void setUseGhostSweepTest(bool useGhostObjectSweepTest)
+ void setUseGhostSweepTest(bool useGhostObjectSweepTest)
{
m_useGhostObjectSweepTest = useGhostObjectSweepTest;
}
- bool onGround () const;
- void setUpInterpolate (bool value);
+ bool onGround() const;
+ void setUpInterpolate(bool value);
};
-#endif // BT_KINEMATIC_CHARACTER_CONTROLLER_H
+#endif // BT_KINEMATIC_CHARACTER_CONTROLLER_H
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btBatchedConstraints.cpp b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btBatchedConstraints.cpp
index c82ba87f9f..b51dfaad3c 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btBatchedConstraints.cpp
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btBatchedConstraints.cpp
@@ -13,7 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btBatchedConstraints.h"
#include "LinearMath/btIDebugDraw.h"
@@ -21,606 +20,573 @@ subject to the following restrictions:
#include "LinearMath/btStackAlloc.h"
#include "LinearMath/btQuickprof.h"
-#include <string.h> //for memset
+#include <string.h> //for memset
const int kNoMerge = -1;
bool btBatchedConstraints::s_debugDrawBatches = false;
-
struct btBatchedConstraintInfo
{
- int constraintIndex;
- int numConstraintRows;
- int bodyIds[2];
+ int constraintIndex;
+ int numConstraintRows;
+ int bodyIds[2];
};
-
struct btBatchInfo
{
- int numConstraints;
- int mergeIndex;
+ int numConstraints;
+ int mergeIndex;
- btBatchInfo() : numConstraints(0), mergeIndex(kNoMerge) {}
+ btBatchInfo() : numConstraints(0), mergeIndex(kNoMerge) {}
};
-
bool btBatchedConstraints::validate(btConstraintArray* constraints, const btAlignedObjectArray<btSolverBody>& bodies) const
{
- //
- // validate: for debugging only. Verify coloring of bodies, that no body is touched by more than one batch in any given phase
- //
- int errors = 0;
- const int kUnassignedBatch = -1;
-
- btAlignedObjectArray<int> bodyBatchId;
- for (int iPhase = 0; iPhase < m_phases.size(); ++iPhase)
- {
- bodyBatchId.resizeNoInitialize(0);
- bodyBatchId.resize( bodies.size(), kUnassignedBatch );
- const Range& phase = m_phases[iPhase];
- for (int iBatch = phase.begin; iBatch < phase.end; ++iBatch)
- {
- const Range& batch = m_batches[iBatch];
- for (int iiCons = batch.begin; iiCons < batch.end; ++iiCons)
- {
- int iCons = m_constraintIndices[iiCons];
- const btSolverConstraint& cons = constraints->at(iCons);
- const btSolverBody& bodyA = bodies[cons.m_solverBodyIdA];
- const btSolverBody& bodyB = bodies[cons.m_solverBodyIdB];
- if (! bodyA.internalGetInvMass().isZero())
- {
- int thisBodyBatchId = bodyBatchId[cons.m_solverBodyIdA];
- if (thisBodyBatchId == kUnassignedBatch)
- {
- bodyBatchId[cons.m_solverBodyIdA] = iBatch;
- }
- else if (thisBodyBatchId != iBatch)
- {
- btAssert( !"dynamic body is used in 2 different batches in the same phase" );
- errors++;
- }
- }
- if (! bodyB.internalGetInvMass().isZero())
- {
- int thisBodyBatchId = bodyBatchId[cons.m_solverBodyIdB];
- if (thisBodyBatchId == kUnassignedBatch)
- {
- bodyBatchId[cons.m_solverBodyIdB] = iBatch;
- }
- else if (thisBodyBatchId != iBatch)
- {
- btAssert( !"dynamic body is used in 2 different batches in the same phase" );
- errors++;
- }
- }
- }
- }
- }
- return errors == 0;
+ //
+ // validate: for debugging only. Verify coloring of bodies, that no body is touched by more than one batch in any given phase
+ //
+ int errors = 0;
+ const int kUnassignedBatch = -1;
+
+ btAlignedObjectArray<int> bodyBatchId;
+ for (int iPhase = 0; iPhase < m_phases.size(); ++iPhase)
+ {
+ bodyBatchId.resizeNoInitialize(0);
+ bodyBatchId.resize(bodies.size(), kUnassignedBatch);
+ const Range& phase = m_phases[iPhase];
+ for (int iBatch = phase.begin; iBatch < phase.end; ++iBatch)
+ {
+ const Range& batch = m_batches[iBatch];
+ for (int iiCons = batch.begin; iiCons < batch.end; ++iiCons)
+ {
+ int iCons = m_constraintIndices[iiCons];
+ const btSolverConstraint& cons = constraints->at(iCons);
+ const btSolverBody& bodyA = bodies[cons.m_solverBodyIdA];
+ const btSolverBody& bodyB = bodies[cons.m_solverBodyIdB];
+ if (!bodyA.internalGetInvMass().isZero())
+ {
+ int thisBodyBatchId = bodyBatchId[cons.m_solverBodyIdA];
+ if (thisBodyBatchId == kUnassignedBatch)
+ {
+ bodyBatchId[cons.m_solverBodyIdA] = iBatch;
+ }
+ else if (thisBodyBatchId != iBatch)
+ {
+ btAssert(!"dynamic body is used in 2 different batches in the same phase");
+ errors++;
+ }
+ }
+ if (!bodyB.internalGetInvMass().isZero())
+ {
+ int thisBodyBatchId = bodyBatchId[cons.m_solverBodyIdB];
+ if (thisBodyBatchId == kUnassignedBatch)
+ {
+ bodyBatchId[cons.m_solverBodyIdB] = iBatch;
+ }
+ else if (thisBodyBatchId != iBatch)
+ {
+ btAssert(!"dynamic body is used in 2 different batches in the same phase");
+ errors++;
+ }
+ }
+ }
+ }
+ }
+ return errors == 0;
}
-
-static void debugDrawSingleBatch( const btBatchedConstraints* bc,
- btConstraintArray* constraints,
- const btAlignedObjectArray<btSolverBody>& bodies,
- int iBatch,
- const btVector3& color,
- const btVector3& offset
- )
+static void debugDrawSingleBatch(const btBatchedConstraints* bc,
+ btConstraintArray* constraints,
+ const btAlignedObjectArray<btSolverBody>& bodies,
+ int iBatch,
+ const btVector3& color,
+ const btVector3& offset)
{
- if (bc && bc->m_debugDrawer && iBatch < bc->m_batches.size())
- {
- const btBatchedConstraints::Range& b = bc->m_batches[iBatch];
- for (int iiCon = b.begin; iiCon < b.end; ++iiCon)
- {
- int iCon = bc->m_constraintIndices[iiCon];
- const btSolverConstraint& con = constraints->at(iCon);
- int iBody0 = con.m_solverBodyIdA;
- int iBody1 = con.m_solverBodyIdB;
- btVector3 pos0 = bodies[iBody0].getWorldTransform().getOrigin() + offset;
- btVector3 pos1 = bodies[iBody1].getWorldTransform().getOrigin() + offset;
- bc->m_debugDrawer->drawLine(pos0, pos1, color);
- }
- }
+ if (bc && bc->m_debugDrawer && iBatch < bc->m_batches.size())
+ {
+ const btBatchedConstraints::Range& b = bc->m_batches[iBatch];
+ for (int iiCon = b.begin; iiCon < b.end; ++iiCon)
+ {
+ int iCon = bc->m_constraintIndices[iiCon];
+ const btSolverConstraint& con = constraints->at(iCon);
+ int iBody0 = con.m_solverBodyIdA;
+ int iBody1 = con.m_solverBodyIdB;
+ btVector3 pos0 = bodies[iBody0].getWorldTransform().getOrigin() + offset;
+ btVector3 pos1 = bodies[iBody1].getWorldTransform().getOrigin() + offset;
+ bc->m_debugDrawer->drawLine(pos0, pos1, color);
+ }
+ }
}
-
-static void debugDrawPhase( const btBatchedConstraints* bc,
- btConstraintArray* constraints,
- const btAlignedObjectArray<btSolverBody>& bodies,
- int iPhase,
- const btVector3& color0,
- const btVector3& color1,
- const btVector3& offset
- )
+static void debugDrawPhase(const btBatchedConstraints* bc,
+ btConstraintArray* constraints,
+ const btAlignedObjectArray<btSolverBody>& bodies,
+ int iPhase,
+ const btVector3& color0,
+ const btVector3& color1,
+ const btVector3& offset)
{
- BT_PROFILE( "debugDrawPhase" );
- if ( bc && bc->m_debugDrawer && iPhase < bc->m_phases.size() )
- {
- const btBatchedConstraints::Range& phase = bc->m_phases[iPhase];
- for (int iBatch = phase.begin; iBatch < phase.end; ++iBatch)
- {
- float tt = float(iBatch - phase.begin) / float(btMax(1, phase.end - phase.begin - 1));
- btVector3 col = lerp(color0, color1, tt);
- debugDrawSingleBatch(bc, constraints, bodies, iBatch, col, offset);
- }
- }
+ BT_PROFILE("debugDrawPhase");
+ if (bc && bc->m_debugDrawer && iPhase < bc->m_phases.size())
+ {
+ const btBatchedConstraints::Range& phase = bc->m_phases[iPhase];
+ for (int iBatch = phase.begin; iBatch < phase.end; ++iBatch)
+ {
+ float tt = float(iBatch - phase.begin) / float(btMax(1, phase.end - phase.begin - 1));
+ btVector3 col = lerp(color0, color1, tt);
+ debugDrawSingleBatch(bc, constraints, bodies, iBatch, col, offset);
+ }
+ }
}
-
-static void debugDrawAllBatches( const btBatchedConstraints* bc,
- btConstraintArray* constraints,
- const btAlignedObjectArray<btSolverBody>& bodies
- )
+static void debugDrawAllBatches(const btBatchedConstraints* bc,
+ btConstraintArray* constraints,
+ const btAlignedObjectArray<btSolverBody>& bodies)
{
- BT_PROFILE( "debugDrawAllBatches" );
- if ( bc && bc->m_debugDrawer && bc->m_phases.size() > 0 )
- {
- btVector3 bboxMin(BT_LARGE_FLOAT, BT_LARGE_FLOAT, BT_LARGE_FLOAT);
- btVector3 bboxMax = -bboxMin;
- for (int iBody = 0; iBody < bodies.size(); ++iBody)
- {
- const btVector3& pos = bodies[iBody].getWorldTransform().getOrigin();
- bboxMin.setMin(pos);
- bboxMax.setMax(pos);
- }
- btVector3 bboxExtent = bboxMax - bboxMin;
- btVector3 offsetBase = btVector3( 0, bboxExtent.y()*1.1f, 0 );
- btVector3 offsetStep = btVector3( 0, 0, bboxExtent.z()*1.1f );
- int numPhases = bc->m_phases.size();
- for (int iPhase = 0; iPhase < numPhases; ++iPhase)
- {
- float b = float(iPhase)/float(numPhases-1);
- btVector3 color0 = btVector3(1,0,b);
- btVector3 color1 = btVector3(0,1,b);
- btVector3 offset = offsetBase + offsetStep*(float(iPhase) - float(numPhases-1)*0.5);
- debugDrawPhase(bc, constraints, bodies, iPhase, color0, color1, offset);
- }
- }
+ BT_PROFILE("debugDrawAllBatches");
+ if (bc && bc->m_debugDrawer && bc->m_phases.size() > 0)
+ {
+ btVector3 bboxMin(BT_LARGE_FLOAT, BT_LARGE_FLOAT, BT_LARGE_FLOAT);
+ btVector3 bboxMax = -bboxMin;
+ for (int iBody = 0; iBody < bodies.size(); ++iBody)
+ {
+ const btVector3& pos = bodies[iBody].getWorldTransform().getOrigin();
+ bboxMin.setMin(pos);
+ bboxMax.setMax(pos);
+ }
+ btVector3 bboxExtent = bboxMax - bboxMin;
+ btVector3 offsetBase = btVector3(0, bboxExtent.y() * 1.1f, 0);
+ btVector3 offsetStep = btVector3(0, 0, bboxExtent.z() * 1.1f);
+ int numPhases = bc->m_phases.size();
+ for (int iPhase = 0; iPhase < numPhases; ++iPhase)
+ {
+ float b = float(iPhase) / float(numPhases - 1);
+ btVector3 color0 = btVector3(1, 0, b);
+ btVector3 color1 = btVector3(0, 1, b);
+ btVector3 offset = offsetBase + offsetStep * (float(iPhase) - float(numPhases - 1) * 0.5);
+ debugDrawPhase(bc, constraints, bodies, iPhase, color0, color1, offset);
+ }
+ }
}
-
static void initBatchedBodyDynamicFlags(btAlignedObjectArray<bool>* outBodyDynamicFlags, const btAlignedObjectArray<btSolverBody>& bodies)
{
- BT_PROFILE("initBatchedBodyDynamicFlags");
- btAlignedObjectArray<bool>& bodyDynamicFlags = *outBodyDynamicFlags;
- bodyDynamicFlags.resizeNoInitialize(bodies.size());
- for (int i = 0; i < bodies.size(); ++i)
- {
- const btSolverBody& body = bodies[ i ];
- bodyDynamicFlags[i] = ( body.internalGetInvMass().x() > btScalar( 0 ) );
- }
+ BT_PROFILE("initBatchedBodyDynamicFlags");
+ btAlignedObjectArray<bool>& bodyDynamicFlags = *outBodyDynamicFlags;
+ bodyDynamicFlags.resizeNoInitialize(bodies.size());
+ for (int i = 0; i < bodies.size(); ++i)
+ {
+ const btSolverBody& body = bodies[i];
+ bodyDynamicFlags[i] = (body.internalGetInvMass().x() > btScalar(0));
+ }
}
-
static int runLengthEncodeConstraintInfo(btBatchedConstraintInfo* outConInfos, int numConstraints)
{
- BT_PROFILE("runLengthEncodeConstraintInfo");
- // detect and run-length encode constraint rows that repeat the same bodies
- int iDest = 0;
- int iSrc = 0;
- while (iSrc < numConstraints)
- {
- const btBatchedConstraintInfo& srcConInfo = outConInfos[iSrc];
- btBatchedConstraintInfo& conInfo = outConInfos[iDest];
- conInfo.constraintIndex = iSrc;
- conInfo.bodyIds[0] = srcConInfo.bodyIds[0];
- conInfo.bodyIds[1] = srcConInfo.bodyIds[1];
- while (iSrc < numConstraints && outConInfos[iSrc].bodyIds[0] == srcConInfo.bodyIds[0] && outConInfos[iSrc].bodyIds[1] == srcConInfo.bodyIds[1])
- {
- ++iSrc;
- }
- conInfo.numConstraintRows = iSrc - conInfo.constraintIndex;
- ++iDest;
- }
- return iDest;
+ BT_PROFILE("runLengthEncodeConstraintInfo");
+ // detect and run-length encode constraint rows that repeat the same bodies
+ int iDest = 0;
+ int iSrc = 0;
+ while (iSrc < numConstraints)
+ {
+ const btBatchedConstraintInfo& srcConInfo = outConInfos[iSrc];
+ btBatchedConstraintInfo& conInfo = outConInfos[iDest];
+ conInfo.constraintIndex = iSrc;
+ conInfo.bodyIds[0] = srcConInfo.bodyIds[0];
+ conInfo.bodyIds[1] = srcConInfo.bodyIds[1];
+ while (iSrc < numConstraints && outConInfos[iSrc].bodyIds[0] == srcConInfo.bodyIds[0] && outConInfos[iSrc].bodyIds[1] == srcConInfo.bodyIds[1])
+ {
+ ++iSrc;
+ }
+ conInfo.numConstraintRows = iSrc - conInfo.constraintIndex;
+ ++iDest;
+ }
+ return iDest;
}
-
struct ReadSolverConstraintsLoop : public btIParallelForBody
{
- btBatchedConstraintInfo* m_outConInfos;
- btConstraintArray* m_constraints;
-
- ReadSolverConstraintsLoop( btBatchedConstraintInfo* outConInfos, btConstraintArray* constraints )
- {
- m_outConInfos = outConInfos;
- m_constraints = constraints;
- }
- void forLoop( int iBegin, int iEnd ) const BT_OVERRIDE
- {
- for (int i = iBegin; i < iEnd; ++i)
- {
- btBatchedConstraintInfo& conInfo = m_outConInfos[i];
- const btSolverConstraint& con = m_constraints->at( i );
- conInfo.bodyIds[0] = con.m_solverBodyIdA;
- conInfo.bodyIds[1] = con.m_solverBodyIdB;
- conInfo.constraintIndex = i;
- conInfo.numConstraintRows = 1;
- }
- }
+ btBatchedConstraintInfo* m_outConInfos;
+ btConstraintArray* m_constraints;
+
+ ReadSolverConstraintsLoop(btBatchedConstraintInfo* outConInfos, btConstraintArray* constraints)
+ {
+ m_outConInfos = outConInfos;
+ m_constraints = constraints;
+ }
+ void forLoop(int iBegin, int iEnd) const BT_OVERRIDE
+ {
+ for (int i = iBegin; i < iEnd; ++i)
+ {
+ btBatchedConstraintInfo& conInfo = m_outConInfos[i];
+ const btSolverConstraint& con = m_constraints->at(i);
+ conInfo.bodyIds[0] = con.m_solverBodyIdA;
+ conInfo.bodyIds[1] = con.m_solverBodyIdB;
+ conInfo.constraintIndex = i;
+ conInfo.numConstraintRows = 1;
+ }
+ }
};
-
static int initBatchedConstraintInfo(btBatchedConstraintInfo* outConInfos, btConstraintArray* constraints)
{
- BT_PROFILE("initBatchedConstraintInfo");
- int numConstraints = constraints->size();
- bool inParallel = true;
- if (inParallel)
- {
- ReadSolverConstraintsLoop loop(outConInfos, constraints);
- int grainSize = 1200;
- btParallelFor(0, numConstraints, grainSize, loop);
- }
- else
- {
- for (int i = 0; i < numConstraints; ++i)
- {
- btBatchedConstraintInfo& conInfo = outConInfos[i];
- const btSolverConstraint& con = constraints->at( i );
- conInfo.bodyIds[0] = con.m_solverBodyIdA;
- conInfo.bodyIds[1] = con.m_solverBodyIdB;
- conInfo.constraintIndex = i;
- conInfo.numConstraintRows = 1;
- }
- }
- bool useRunLengthEncoding = true;
- if (useRunLengthEncoding)
- {
- numConstraints = runLengthEncodeConstraintInfo(outConInfos, numConstraints);
- }
- return numConstraints;
+ BT_PROFILE("initBatchedConstraintInfo");
+ int numConstraints = constraints->size();
+ bool inParallel = true;
+ if (inParallel)
+ {
+ ReadSolverConstraintsLoop loop(outConInfos, constraints);
+ int grainSize = 1200;
+ btParallelFor(0, numConstraints, grainSize, loop);
+ }
+ else
+ {
+ for (int i = 0; i < numConstraints; ++i)
+ {
+ btBatchedConstraintInfo& conInfo = outConInfos[i];
+ const btSolverConstraint& con = constraints->at(i);
+ conInfo.bodyIds[0] = con.m_solverBodyIdA;
+ conInfo.bodyIds[1] = con.m_solverBodyIdB;
+ conInfo.constraintIndex = i;
+ conInfo.numConstraintRows = 1;
+ }
+ }
+ bool useRunLengthEncoding = true;
+ if (useRunLengthEncoding)
+ {
+ numConstraints = runLengthEncodeConstraintInfo(outConInfos, numConstraints);
+ }
+ return numConstraints;
}
-
static void expandConstraintRowsInPlace(int* constraintBatchIds, const btBatchedConstraintInfo* conInfos, int numConstraints, int numConstraintRows)
{
- BT_PROFILE("expandConstraintRowsInPlace");
- if (numConstraintRows > numConstraints)
- {
- // we walk the array in reverse to avoid overwriteing
- for (int iCon = numConstraints - 1; iCon >= 0; --iCon)
- {
- const btBatchedConstraintInfo& conInfo = conInfos[iCon];
- int iBatch = constraintBatchIds[iCon];
- for (int i = conInfo.numConstraintRows - 1; i >= 0; --i)
- {
- int iDest = conInfo.constraintIndex + i;
- btAssert(iDest >= iCon);
- btAssert(iDest >= 0 && iDest < numConstraintRows);
- constraintBatchIds[iDest] = iBatch;
- }
- }
- }
+ BT_PROFILE("expandConstraintRowsInPlace");
+ if (numConstraintRows > numConstraints)
+ {
+ // we walk the array in reverse to avoid overwriteing
+ for (int iCon = numConstraints - 1; iCon >= 0; --iCon)
+ {
+ const btBatchedConstraintInfo& conInfo = conInfos[iCon];
+ int iBatch = constraintBatchIds[iCon];
+ for (int i = conInfo.numConstraintRows - 1; i >= 0; --i)
+ {
+ int iDest = conInfo.constraintIndex + i;
+ btAssert(iDest >= iCon);
+ btAssert(iDest >= 0 && iDest < numConstraintRows);
+ constraintBatchIds[iDest] = iBatch;
+ }
+ }
+ }
}
-
static void expandConstraintRows(int* destConstraintBatchIds, const int* srcConstraintBatchIds, const btBatchedConstraintInfo* conInfos, int numConstraints, int numConstraintRows)
{
- BT_PROFILE("expandConstraintRows");
- for ( int iCon = 0; iCon < numConstraints; ++iCon )
- {
- const btBatchedConstraintInfo& conInfo = conInfos[ iCon ];
- int iBatch = srcConstraintBatchIds[ iCon ];
- for ( int i = 0; i < conInfo.numConstraintRows; ++i )
- {
- int iDest = conInfo.constraintIndex + i;
- btAssert( iDest >= iCon );
- btAssert( iDest >= 0 && iDest < numConstraintRows );
- destConstraintBatchIds[ iDest ] = iBatch;
- }
- }
+ BT_PROFILE("expandConstraintRows");
+ for (int iCon = 0; iCon < numConstraints; ++iCon)
+ {
+ const btBatchedConstraintInfo& conInfo = conInfos[iCon];
+ int iBatch = srcConstraintBatchIds[iCon];
+ for (int i = 0; i < conInfo.numConstraintRows; ++i)
+ {
+ int iDest = conInfo.constraintIndex + i;
+ btAssert(iDest >= iCon);
+ btAssert(iDest >= 0 && iDest < numConstraintRows);
+ destConstraintBatchIds[iDest] = iBatch;
+ }
+ }
}
-
struct ExpandConstraintRowsLoop : public btIParallelForBody
{
- int* m_destConstraintBatchIds;
- const int* m_srcConstraintBatchIds;
- const btBatchedConstraintInfo* m_conInfos;
- int m_numConstraintRows;
-
- ExpandConstraintRowsLoop( int* destConstraintBatchIds, const int* srcConstraintBatchIds, const btBatchedConstraintInfo* conInfos, int numConstraintRows)
- {
- m_destConstraintBatchIds = destConstraintBatchIds;
- m_srcConstraintBatchIds = srcConstraintBatchIds;
- m_conInfos = conInfos;
- m_numConstraintRows = numConstraintRows;
- }
- void forLoop( int iBegin, int iEnd ) const BT_OVERRIDE
- {
- expandConstraintRows(m_destConstraintBatchIds, m_srcConstraintBatchIds + iBegin, m_conInfos + iBegin, iEnd - iBegin, m_numConstraintRows);
- }
+ int* m_destConstraintBatchIds;
+ const int* m_srcConstraintBatchIds;
+ const btBatchedConstraintInfo* m_conInfos;
+ int m_numConstraintRows;
+
+ ExpandConstraintRowsLoop(int* destConstraintBatchIds, const int* srcConstraintBatchIds, const btBatchedConstraintInfo* conInfos, int numConstraintRows)
+ {
+ m_destConstraintBatchIds = destConstraintBatchIds;
+ m_srcConstraintBatchIds = srcConstraintBatchIds;
+ m_conInfos = conInfos;
+ m_numConstraintRows = numConstraintRows;
+ }
+ void forLoop(int iBegin, int iEnd) const BT_OVERRIDE
+ {
+ expandConstraintRows(m_destConstraintBatchIds, m_srcConstraintBatchIds + iBegin, m_conInfos + iBegin, iEnd - iBegin, m_numConstraintRows);
+ }
};
-
static void expandConstraintRowsMt(int* destConstraintBatchIds, const int* srcConstraintBatchIds, const btBatchedConstraintInfo* conInfos, int numConstraints, int numConstraintRows)
{
- BT_PROFILE("expandConstraintRowsMt");
- ExpandConstraintRowsLoop loop(destConstraintBatchIds, srcConstraintBatchIds, conInfos, numConstraintRows);
- int grainSize = 600;
- btParallelFor(0, numConstraints, grainSize, loop);
+ BT_PROFILE("expandConstraintRowsMt");
+ ExpandConstraintRowsLoop loop(destConstraintBatchIds, srcConstraintBatchIds, conInfos, numConstraintRows);
+ int grainSize = 600;
+ btParallelFor(0, numConstraints, grainSize, loop);
}
-
static void initBatchedConstraintInfoArray(btAlignedObjectArray<btBatchedConstraintInfo>* outConInfos, btConstraintArray* constraints)
{
- BT_PROFILE("initBatchedConstraintInfoArray");
- btAlignedObjectArray<btBatchedConstraintInfo>& conInfos = *outConInfos;
- int numConstraints = constraints->size();
- conInfos.resizeNoInitialize(numConstraints);
+ BT_PROFILE("initBatchedConstraintInfoArray");
+ btAlignedObjectArray<btBatchedConstraintInfo>& conInfos = *outConInfos;
+ int numConstraints = constraints->size();
+ conInfos.resizeNoInitialize(numConstraints);
- int newSize = initBatchedConstraintInfo(&outConInfos->at(0), constraints);
- conInfos.resizeNoInitialize(newSize);
+ int newSize = initBatchedConstraintInfo(&outConInfos->at(0), constraints);
+ conInfos.resizeNoInitialize(newSize);
}
-
static void mergeSmallBatches(btBatchInfo* batches, int iBeginBatch, int iEndBatch, int minBatchSize, int maxBatchSize)
{
- BT_PROFILE("mergeSmallBatches");
- for ( int iBatch = iEndBatch - 1; iBatch >= iBeginBatch; --iBatch )
- {
- btBatchInfo& batch = batches[ iBatch ];
- if ( batch.mergeIndex == kNoMerge && batch.numConstraints > 0 && batch.numConstraints < minBatchSize )
- {
- for ( int iDestBatch = iBatch - 1; iDestBatch >= iBeginBatch; --iDestBatch )
- {
- btBatchInfo& destBatch = batches[ iDestBatch ];
- if ( destBatch.mergeIndex == kNoMerge && ( destBatch.numConstraints + batch.numConstraints ) < maxBatchSize )
- {
- destBatch.numConstraints += batch.numConstraints;
- batch.numConstraints = 0;
- batch.mergeIndex = iDestBatch;
- break;
- }
- }
- }
- }
- // flatten mergeIndexes
- // e.g. in case where A was merged into B and then B was merged into C, we need A to point to C instead of B
- // Note: loop goes forward through batches because batches always merge from higher indexes to lower,
- // so by going from low to high it reduces the amount of trail-following
- for ( int iBatch = iBeginBatch; iBatch < iEndBatch; ++iBatch )
- {
- btBatchInfo& batch = batches[ iBatch ];
- if ( batch.mergeIndex != kNoMerge )
- {
- int iMergeDest = batches[ batch.mergeIndex ].mergeIndex;
- // follow trail of merges to the end
- while ( iMergeDest != kNoMerge )
- {
- int iNext = batches[ iMergeDest ].mergeIndex;
- if ( iNext == kNoMerge )
- {
- batch.mergeIndex = iMergeDest;
- break;
- }
- iMergeDest = iNext;
- }
- }
- }
+ BT_PROFILE("mergeSmallBatches");
+ for (int iBatch = iEndBatch - 1; iBatch >= iBeginBatch; --iBatch)
+ {
+ btBatchInfo& batch = batches[iBatch];
+ if (batch.mergeIndex == kNoMerge && batch.numConstraints > 0 && batch.numConstraints < minBatchSize)
+ {
+ for (int iDestBatch = iBatch - 1; iDestBatch >= iBeginBatch; --iDestBatch)
+ {
+ btBatchInfo& destBatch = batches[iDestBatch];
+ if (destBatch.mergeIndex == kNoMerge && (destBatch.numConstraints + batch.numConstraints) < maxBatchSize)
+ {
+ destBatch.numConstraints += batch.numConstraints;
+ batch.numConstraints = 0;
+ batch.mergeIndex = iDestBatch;
+ break;
+ }
+ }
+ }
+ }
+ // flatten mergeIndexes
+ // e.g. in case where A was merged into B and then B was merged into C, we need A to point to C instead of B
+ // Note: loop goes forward through batches because batches always merge from higher indexes to lower,
+ // so by going from low to high it reduces the amount of trail-following
+ for (int iBatch = iBeginBatch; iBatch < iEndBatch; ++iBatch)
+ {
+ btBatchInfo& batch = batches[iBatch];
+ if (batch.mergeIndex != kNoMerge)
+ {
+ int iMergeDest = batches[batch.mergeIndex].mergeIndex;
+ // follow trail of merges to the end
+ while (iMergeDest != kNoMerge)
+ {
+ int iNext = batches[iMergeDest].mergeIndex;
+ if (iNext == kNoMerge)
+ {
+ batch.mergeIndex = iMergeDest;
+ break;
+ }
+ iMergeDest = iNext;
+ }
+ }
+ }
}
-
static void updateConstraintBatchIdsForMerges(int* constraintBatchIds, int numConstraints, const btBatchInfo* batches, int numBatches)
{
- BT_PROFILE("updateConstraintBatchIdsForMerges");
- // update batchIds to account for merges
- for (int i = 0; i < numConstraints; ++i)
- {
- int iBatch = constraintBatchIds[i];
- btAssert(iBatch < numBatches);
- // if this constraint references a batch that was merged into another batch
- if (batches[iBatch].mergeIndex != kNoMerge)
- {
- // update batchId
- constraintBatchIds[i] = batches[iBatch].mergeIndex;
- }
- }
+ BT_PROFILE("updateConstraintBatchIdsForMerges");
+ // update batchIds to account for merges
+ for (int i = 0; i < numConstraints; ++i)
+ {
+ int iBatch = constraintBatchIds[i];
+ btAssert(iBatch < numBatches);
+ // if this constraint references a batch that was merged into another batch
+ if (batches[iBatch].mergeIndex != kNoMerge)
+ {
+ // update batchId
+ constraintBatchIds[i] = batches[iBatch].mergeIndex;
+ }
+ }
}
-
struct UpdateConstraintBatchIdsForMergesLoop : public btIParallelForBody
{
- int* m_constraintBatchIds;
- const btBatchInfo* m_batches;
- int m_numBatches;
-
- UpdateConstraintBatchIdsForMergesLoop( int* constraintBatchIds, const btBatchInfo* batches, int numBatches )
- {
- m_constraintBatchIds = constraintBatchIds;
- m_batches = batches;
- m_numBatches = numBatches;
- }
- void forLoop( int iBegin, int iEnd ) const BT_OVERRIDE
- {
- BT_PROFILE( "UpdateConstraintBatchIdsForMergesLoop" );
- updateConstraintBatchIdsForMerges( m_constraintBatchIds + iBegin, iEnd - iBegin, m_batches, m_numBatches );
- }
+ int* m_constraintBatchIds;
+ const btBatchInfo* m_batches;
+ int m_numBatches;
+
+ UpdateConstraintBatchIdsForMergesLoop(int* constraintBatchIds, const btBatchInfo* batches, int numBatches)
+ {
+ m_constraintBatchIds = constraintBatchIds;
+ m_batches = batches;
+ m_numBatches = numBatches;
+ }
+ void forLoop(int iBegin, int iEnd) const BT_OVERRIDE
+ {
+ BT_PROFILE("UpdateConstraintBatchIdsForMergesLoop");
+ updateConstraintBatchIdsForMerges(m_constraintBatchIds + iBegin, iEnd - iBegin, m_batches, m_numBatches);
+ }
};
-
static void updateConstraintBatchIdsForMergesMt(int* constraintBatchIds, int numConstraints, const btBatchInfo* batches, int numBatches)
{
- BT_PROFILE( "updateConstraintBatchIdsForMergesMt" );
- UpdateConstraintBatchIdsForMergesLoop loop(constraintBatchIds, batches, numBatches);
- int grainSize = 800;
- btParallelFor(0, numConstraints, grainSize, loop);
+ BT_PROFILE("updateConstraintBatchIdsForMergesMt");
+ UpdateConstraintBatchIdsForMergesLoop loop(constraintBatchIds, batches, numBatches);
+ int grainSize = 800;
+ btParallelFor(0, numConstraints, grainSize, loop);
}
-
inline bool BatchCompare(const btBatchedConstraints::Range& a, const btBatchedConstraints::Range& b)
{
- int lenA = a.end - a.begin;
- int lenB = b.end - b.begin;
- return lenA > lenB;
+ int lenA = a.end - a.begin;
+ int lenB = b.end - b.begin;
+ return lenA > lenB;
}
-
static void writeOutConstraintIndicesForRangeOfBatches(btBatchedConstraints* bc,
- const int* constraintBatchIds,
- int numConstraints,
- int* constraintIdPerBatch,
- int batchBegin,
- int batchEnd
- )
+ const int* constraintBatchIds,
+ int numConstraints,
+ int* constraintIdPerBatch,
+ int batchBegin,
+ int batchEnd)
{
- BT_PROFILE("writeOutConstraintIndicesForRangeOfBatches");
- for ( int iCon = 0; iCon < numConstraints; ++iCon )
- {
- int iBatch = constraintBatchIds[ iCon ];
- if (iBatch >= batchBegin && iBatch < batchEnd)
- {
- int iDestCon = constraintIdPerBatch[ iBatch ];
- constraintIdPerBatch[ iBatch ] = iDestCon + 1;
- bc->m_constraintIndices[ iDestCon ] = iCon;
- }
- }
+ BT_PROFILE("writeOutConstraintIndicesForRangeOfBatches");
+ for (int iCon = 0; iCon < numConstraints; ++iCon)
+ {
+ int iBatch = constraintBatchIds[iCon];
+ if (iBatch >= batchBegin && iBatch < batchEnd)
+ {
+ int iDestCon = constraintIdPerBatch[iBatch];
+ constraintIdPerBatch[iBatch] = iDestCon + 1;
+ bc->m_constraintIndices[iDestCon] = iCon;
+ }
+ }
}
-
struct WriteOutConstraintIndicesLoop : public btIParallelForBody
{
- btBatchedConstraints* m_batchedConstraints;
- const int* m_constraintBatchIds;
- int m_numConstraints;
- int* m_constraintIdPerBatch;
- int m_maxNumBatchesPerPhase;
-
- WriteOutConstraintIndicesLoop( btBatchedConstraints* bc, const int* constraintBatchIds, int numConstraints, int* constraintIdPerBatch, int maxNumBatchesPerPhase )
- {
- m_batchedConstraints = bc;
- m_constraintBatchIds = constraintBatchIds;
- m_numConstraints = numConstraints;
- m_constraintIdPerBatch = constraintIdPerBatch;
- m_maxNumBatchesPerPhase = maxNumBatchesPerPhase;
- }
- void forLoop( int iBegin, int iEnd ) const BT_OVERRIDE
- {
- BT_PROFILE( "WriteOutConstraintIndicesLoop" );
- int batchBegin = iBegin * m_maxNumBatchesPerPhase;
- int batchEnd = iEnd * m_maxNumBatchesPerPhase;
- writeOutConstraintIndicesForRangeOfBatches(m_batchedConstraints,
- m_constraintBatchIds,
- m_numConstraints,
- m_constraintIdPerBatch,
- batchBegin,
- batchEnd
- );
- }
+ btBatchedConstraints* m_batchedConstraints;
+ const int* m_constraintBatchIds;
+ int m_numConstraints;
+ int* m_constraintIdPerBatch;
+ int m_maxNumBatchesPerPhase;
+
+ WriteOutConstraintIndicesLoop(btBatchedConstraints* bc, const int* constraintBatchIds, int numConstraints, int* constraintIdPerBatch, int maxNumBatchesPerPhase)
+ {
+ m_batchedConstraints = bc;
+ m_constraintBatchIds = constraintBatchIds;
+ m_numConstraints = numConstraints;
+ m_constraintIdPerBatch = constraintIdPerBatch;
+ m_maxNumBatchesPerPhase = maxNumBatchesPerPhase;
+ }
+ void forLoop(int iBegin, int iEnd) const BT_OVERRIDE
+ {
+ BT_PROFILE("WriteOutConstraintIndicesLoop");
+ int batchBegin = iBegin * m_maxNumBatchesPerPhase;
+ int batchEnd = iEnd * m_maxNumBatchesPerPhase;
+ writeOutConstraintIndicesForRangeOfBatches(m_batchedConstraints,
+ m_constraintBatchIds,
+ m_numConstraints,
+ m_constraintIdPerBatch,
+ batchBegin,
+ batchEnd);
+ }
};
-
static void writeOutConstraintIndicesMt(btBatchedConstraints* bc,
- const int* constraintBatchIds,
- int numConstraints,
- int* constraintIdPerBatch,
- int maxNumBatchesPerPhase,
- int numPhases
- )
+ const int* constraintBatchIds,
+ int numConstraints,
+ int* constraintIdPerBatch,
+ int maxNumBatchesPerPhase,
+ int numPhases)
{
- BT_PROFILE("writeOutConstraintIndicesMt");
- bool inParallel = true;
- if (inParallel)
- {
- WriteOutConstraintIndicesLoop loop( bc, constraintBatchIds, numConstraints, constraintIdPerBatch, maxNumBatchesPerPhase );
- btParallelFor( 0, numPhases, 1, loop );
- }
- else
- {
- for ( int iCon = 0; iCon < numConstraints; ++iCon )
- {
- int iBatch = constraintBatchIds[ iCon ];
- int iDestCon = constraintIdPerBatch[ iBatch ];
- constraintIdPerBatch[ iBatch ] = iDestCon + 1;
- bc->m_constraintIndices[ iDestCon ] = iCon;
- }
- }
+ BT_PROFILE("writeOutConstraintIndicesMt");
+ bool inParallel = true;
+ if (inParallel)
+ {
+ WriteOutConstraintIndicesLoop loop(bc, constraintBatchIds, numConstraints, constraintIdPerBatch, maxNumBatchesPerPhase);
+ btParallelFor(0, numPhases, 1, loop);
+ }
+ else
+ {
+ for (int iCon = 0; iCon < numConstraints; ++iCon)
+ {
+ int iBatch = constraintBatchIds[iCon];
+ int iDestCon = constraintIdPerBatch[iBatch];
+ constraintIdPerBatch[iBatch] = iDestCon + 1;
+ bc->m_constraintIndices[iDestCon] = iCon;
+ }
+ }
}
-
static void writeGrainSizes(btBatchedConstraints* bc)
{
- typedef btBatchedConstraints::Range Range;
- int numPhases = bc->m_phases.size();
- bc->m_phaseGrainSize.resizeNoInitialize(numPhases);
- int numThreads = btGetTaskScheduler()->getNumThreads();
- for (int iPhase = 0; iPhase < numPhases; ++iPhase)
- {
- const Range& phase = bc->m_phases[ iPhase ];
- int numBatches = phase.end - phase.begin;
- float grainSize = floor((0.25f*numBatches / float(numThreads)) + 0.0f);
- bc->m_phaseGrainSize[ iPhase ] = btMax(1, int(grainSize));
- }
+ typedef btBatchedConstraints::Range Range;
+ int numPhases = bc->m_phases.size();
+ bc->m_phaseGrainSize.resizeNoInitialize(numPhases);
+ int numThreads = btGetTaskScheduler()->getNumThreads();
+ for (int iPhase = 0; iPhase < numPhases; ++iPhase)
+ {
+ const Range& phase = bc->m_phases[iPhase];
+ int numBatches = phase.end - phase.begin;
+ float grainSize = floor((0.25f * numBatches / float(numThreads)) + 0.0f);
+ bc->m_phaseGrainSize[iPhase] = btMax(1, int(grainSize));
+ }
}
-
static void writeOutBatches(btBatchedConstraints* bc,
- const int* constraintBatchIds,
- int numConstraints,
- const btBatchInfo* batches,
- int* batchWork,
- int maxNumBatchesPerPhase,
- int numPhases
-)
+ const int* constraintBatchIds,
+ int numConstraints,
+ const btBatchInfo* batches,
+ int* batchWork,
+ int maxNumBatchesPerPhase,
+ int numPhases)
{
- BT_PROFILE("writeOutBatches");
- typedef btBatchedConstraints::Range Range;
- bc->m_constraintIndices.reserve( numConstraints );
- bc->m_batches.resizeNoInitialize( 0 );
- bc->m_phases.resizeNoInitialize( 0 );
-
- //int maxNumBatches = numPhases * maxNumBatchesPerPhase;
- {
- int* constraintIdPerBatch = batchWork; // for each batch, keep an index into the next available slot in the m_constraintIndices array
- int iConstraint = 0;
- for (int iPhase = 0; iPhase < numPhases; ++iPhase)
- {
- int curPhaseBegin = bc->m_batches.size();
- int iBegin = iPhase * maxNumBatchesPerPhase;
- int iEnd = iBegin + maxNumBatchesPerPhase;
- for ( int i = iBegin; i < iEnd; ++i )
- {
- const btBatchInfo& batch = batches[ i ];
- int curBatchBegin = iConstraint;
- constraintIdPerBatch[ i ] = curBatchBegin; // record the start of each batch in m_constraintIndices array
- int numConstraints = batch.numConstraints;
- iConstraint += numConstraints;
- if ( numConstraints > 0 )
- {
- bc->m_batches.push_back( Range( curBatchBegin, iConstraint ) );
- }
- }
- // if any batches were emitted this phase,
- if ( bc->m_batches.size() > curPhaseBegin )
- {
- // output phase
- bc->m_phases.push_back( Range( curPhaseBegin, bc->m_batches.size() ) );
- }
- }
-
- btAssert(iConstraint == numConstraints);
- bc->m_constraintIndices.resizeNoInitialize( numConstraints );
- writeOutConstraintIndicesMt( bc, constraintBatchIds, numConstraints, constraintIdPerBatch, maxNumBatchesPerPhase, numPhases );
- }
- // for each phase
- for (int iPhase = 0; iPhase < bc->m_phases.size(); ++iPhase)
- {
- // sort the batches from largest to smallest (can be helpful to some task schedulers)
- const Range& curBatches = bc->m_phases[iPhase];
- bc->m_batches.quickSortInternal(BatchCompare, curBatches.begin, curBatches.end-1);
- }
- bc->m_phaseOrder.resize(bc->m_phases.size());
- for (int i = 0; i < bc->m_phases.size(); ++i)
- {
- bc->m_phaseOrder[i] = i;
- }
- writeGrainSizes(bc);
+ BT_PROFILE("writeOutBatches");
+ typedef btBatchedConstraints::Range Range;
+ bc->m_constraintIndices.reserve(numConstraints);
+ bc->m_batches.resizeNoInitialize(0);
+ bc->m_phases.resizeNoInitialize(0);
+
+ //int maxNumBatches = numPhases * maxNumBatchesPerPhase;
+ {
+ int* constraintIdPerBatch = batchWork; // for each batch, keep an index into the next available slot in the m_constraintIndices array
+ int iConstraint = 0;
+ for (int iPhase = 0; iPhase < numPhases; ++iPhase)
+ {
+ int curPhaseBegin = bc->m_batches.size();
+ int iBegin = iPhase * maxNumBatchesPerPhase;
+ int iEnd = iBegin + maxNumBatchesPerPhase;
+ for (int i = iBegin; i < iEnd; ++i)
+ {
+ const btBatchInfo& batch = batches[i];
+ int curBatchBegin = iConstraint;
+ constraintIdPerBatch[i] = curBatchBegin; // record the start of each batch in m_constraintIndices array
+ int numConstraints = batch.numConstraints;
+ iConstraint += numConstraints;
+ if (numConstraints > 0)
+ {
+ bc->m_batches.push_back(Range(curBatchBegin, iConstraint));
+ }
+ }
+ // if any batches were emitted this phase,
+ if (bc->m_batches.size() > curPhaseBegin)
+ {
+ // output phase
+ bc->m_phases.push_back(Range(curPhaseBegin, bc->m_batches.size()));
+ }
+ }
+
+ btAssert(iConstraint == numConstraints);
+ bc->m_constraintIndices.resizeNoInitialize(numConstraints);
+ writeOutConstraintIndicesMt(bc, constraintBatchIds, numConstraints, constraintIdPerBatch, maxNumBatchesPerPhase, numPhases);
+ }
+ // for each phase
+ for (int iPhase = 0; iPhase < bc->m_phases.size(); ++iPhase)
+ {
+ // sort the batches from largest to smallest (can be helpful to some task schedulers)
+ const Range& curBatches = bc->m_phases[iPhase];
+ bc->m_batches.quickSortInternal(BatchCompare, curBatches.begin, curBatches.end - 1);
+ }
+ bc->m_phaseOrder.resize(bc->m_phases.size());
+ for (int i = 0; i < bc->m_phases.size(); ++i)
+ {
+ bc->m_phaseOrder[i] = i;
+ }
+ writeGrainSizes(bc);
}
-
//
// PreallocatedMemoryHelper -- helper object for allocating a number of chunks of memory in a single contiguous block.
// It is generally more efficient to do a single larger allocation than many smaller allocations.
@@ -639,191 +605,184 @@ static void writeOutBatches(btBatchedConstraints* bc,
template <int N>
class PreallocatedMemoryHelper
{
- struct Chunk
- {
- void** ptr;
- size_t size;
- };
- Chunk m_chunks[N];
- int m_numChunks;
+ struct Chunk
+ {
+ void** ptr;
+ size_t size;
+ };
+ Chunk m_chunks[N];
+ int m_numChunks;
+
public:
- PreallocatedMemoryHelper() {m_numChunks=0;}
- void addChunk( void** ptr, size_t sz )
- {
- btAssert( m_numChunks < N );
- if ( m_numChunks < N )
- {
- Chunk& chunk = m_chunks[ m_numChunks ];
- chunk.ptr = ptr;
- chunk.size = sz;
- m_numChunks++;
- }
- }
- size_t getSizeToAllocate() const
- {
- size_t totalSize = 0;
- for (int i = 0; i < m_numChunks; ++i)
- {
- totalSize += m_chunks[i].size;
- }
- return totalSize;
- }
- void setChunkPointers(void* mem) const
- {
- size_t totalSize = 0;
- for (int i = 0; i < m_numChunks; ++i)
- {
- const Chunk& chunk = m_chunks[ i ];
- char* chunkPtr = static_cast<char*>(mem) + totalSize;
- *chunk.ptr = chunkPtr;
- totalSize += chunk.size;
- }
- }
+ PreallocatedMemoryHelper() { m_numChunks = 0; }
+ void addChunk(void** ptr, size_t sz)
+ {
+ btAssert(m_numChunks < N);
+ if (m_numChunks < N)
+ {
+ Chunk& chunk = m_chunks[m_numChunks];
+ chunk.ptr = ptr;
+ chunk.size = sz;
+ m_numChunks++;
+ }
+ }
+ size_t getSizeToAllocate() const
+ {
+ size_t totalSize = 0;
+ for (int i = 0; i < m_numChunks; ++i)
+ {
+ totalSize += m_chunks[i].size;
+ }
+ return totalSize;
+ }
+ void setChunkPointers(void* mem) const
+ {
+ size_t totalSize = 0;
+ for (int i = 0; i < m_numChunks; ++i)
+ {
+ const Chunk& chunk = m_chunks[i];
+ char* chunkPtr = static_cast<char*>(mem) + totalSize;
+ *chunk.ptr = chunkPtr;
+ totalSize += chunk.size;
+ }
+ }
};
-
-
static btVector3 findMaxDynamicConstraintExtent(
- btVector3* bodyPositions,
- bool* bodyDynamicFlags,
- btBatchedConstraintInfo* conInfos,
- int numConstraints,
- int numBodies
- )
+ btVector3* bodyPositions,
+ bool* bodyDynamicFlags,
+ btBatchedConstraintInfo* conInfos,
+ int numConstraints,
+ int numBodies)
{
- BT_PROFILE("findMaxDynamicConstraintExtent");
- btVector3 consExtent = btVector3(1,1,1) * 0.001;
- for (int iCon = 0; iCon < numConstraints; ++iCon)
- {
- const btBatchedConstraintInfo& con = conInfos[ iCon ];
- int iBody0 = con.bodyIds[0];
- int iBody1 = con.bodyIds[1];
- btAssert(iBody0 >= 0 && iBody0 < numBodies);
- btAssert(iBody1 >= 0 && iBody1 < numBodies);
- // is it a dynamic constraint?
- if (bodyDynamicFlags[iBody0] && bodyDynamicFlags[iBody1])
- {
- btVector3 delta = bodyPositions[iBody1] - bodyPositions[iBody0];
- consExtent.setMax(delta.absolute());
- }
- }
- return consExtent;
+ BT_PROFILE("findMaxDynamicConstraintExtent");
+ btVector3 consExtent = btVector3(1, 1, 1) * 0.001;
+ for (int iCon = 0; iCon < numConstraints; ++iCon)
+ {
+ const btBatchedConstraintInfo& con = conInfos[iCon];
+ int iBody0 = con.bodyIds[0];
+ int iBody1 = con.bodyIds[1];
+ btAssert(iBody0 >= 0 && iBody0 < numBodies);
+ btAssert(iBody1 >= 0 && iBody1 < numBodies);
+ // is it a dynamic constraint?
+ if (bodyDynamicFlags[iBody0] && bodyDynamicFlags[iBody1])
+ {
+ btVector3 delta = bodyPositions[iBody1] - bodyPositions[iBody0];
+ consExtent.setMax(delta.absolute());
+ }
+ }
+ return consExtent;
}
-
struct btIntVec3
{
- int m_ints[ 3 ];
+ int m_ints[3];
- SIMD_FORCE_INLINE const int& operator[](int i) const {return m_ints[i];}
- SIMD_FORCE_INLINE int& operator[](int i) {return m_ints[i];}
+ SIMD_FORCE_INLINE const int& operator[](int i) const { return m_ints[i]; }
+ SIMD_FORCE_INLINE int& operator[](int i) { return m_ints[i]; }
};
-
struct AssignConstraintsToGridBatchesParams
{
- bool* bodyDynamicFlags;
- btIntVec3* bodyGridCoords;
- int numBodies;
- btBatchedConstraintInfo* conInfos;
- int* constraintBatchIds;
- btIntVec3 gridChunkDim;
- int maxNumBatchesPerPhase;
- int numPhases;
- int phaseMask;
-
- AssignConstraintsToGridBatchesParams()
- {
- memset(this, 0, sizeof(*this));
- }
+ bool* bodyDynamicFlags;
+ btIntVec3* bodyGridCoords;
+ int numBodies;
+ btBatchedConstraintInfo* conInfos;
+ int* constraintBatchIds;
+ btIntVec3 gridChunkDim;
+ int maxNumBatchesPerPhase;
+ int numPhases;
+ int phaseMask;
+
+ AssignConstraintsToGridBatchesParams()
+ {
+ memset(this, 0, sizeof(*this));
+ }
};
-
static void assignConstraintsToGridBatches(const AssignConstraintsToGridBatchesParams& params, int iConBegin, int iConEnd)
{
- BT_PROFILE("assignConstraintsToGridBatches");
- // (can be done in parallel)
- for ( int iCon = iConBegin; iCon < iConEnd; ++iCon )
- {
- const btBatchedConstraintInfo& con = params.conInfos[ iCon ];
- int iBody0 = con.bodyIds[ 0 ];
- int iBody1 = con.bodyIds[ 1 ];
- int iPhase = iCon; //iBody0; // pseudorandom choice to distribute evenly amongst phases
- iPhase &= params.phaseMask;
- int gridCoord[ 3 ];
- // is it a dynamic constraint?
- if ( params.bodyDynamicFlags[ iBody0 ] && params.bodyDynamicFlags[ iBody1 ] )
- {
- const btIntVec3& body0Coords = params.bodyGridCoords[iBody0];
- const btIntVec3& body1Coords = params.bodyGridCoords[iBody1];
- // for each dimension x,y,z,
- for (int i = 0; i < 3; ++i)
- {
- int coordMin = btMin(body0Coords.m_ints[i], body1Coords.m_ints[i]);
- int coordMax = btMax(body0Coords.m_ints[i], body1Coords.m_ints[i]);
- if (coordMin != coordMax)
- {
- btAssert( coordMax == coordMin + 1 );
- if ((coordMin&1) == 0)
- {
- iPhase &= ~(1 << i); // force bit off
- }
- else
- {
- iPhase |= (1 << i); // force bit on
- iPhase &= params.phaseMask;
- }
- }
- gridCoord[ i ] = coordMin;
- }
- }
- else
- {
- if ( !params.bodyDynamicFlags[ iBody0 ] )
- {
- iBody0 = con.bodyIds[ 1 ];
- }
- btAssert(params.bodyDynamicFlags[ iBody0 ]);
- const btIntVec3& body0Coords = params.bodyGridCoords[iBody0];
- // for each dimension x,y,z,
- for ( int i = 0; i < 3; ++i )
- {
- gridCoord[ i ] = body0Coords.m_ints[ i ];
- }
- }
- // calculate chunk coordinates
- int chunkCoord[ 3 ];
- btIntVec3 gridChunkDim = params.gridChunkDim;
- // for each dimension x,y,z,
- for ( int i = 0; i < 3; ++i )
- {
- int coordOffset = ( iPhase >> i ) & 1;
- chunkCoord[ i ] = (gridCoord[ i ] - coordOffset)/2;
- btClamp( chunkCoord[ i ], 0, gridChunkDim[ i ] - 1);
- btAssert( chunkCoord[ i ] < gridChunkDim[ i ] );
- }
- int iBatch = iPhase * params.maxNumBatchesPerPhase + chunkCoord[ 0 ] + chunkCoord[ 1 ] * gridChunkDim[ 0 ] + chunkCoord[ 2 ] * gridChunkDim[ 0 ] * gridChunkDim[ 1 ];
- btAssert(iBatch >= 0 && iBatch < params.maxNumBatchesPerPhase*params.numPhases);
- params.constraintBatchIds[ iCon ] = iBatch;
- }
+ BT_PROFILE("assignConstraintsToGridBatches");
+ // (can be done in parallel)
+ for (int iCon = iConBegin; iCon < iConEnd; ++iCon)
+ {
+ const btBatchedConstraintInfo& con = params.conInfos[iCon];
+ int iBody0 = con.bodyIds[0];
+ int iBody1 = con.bodyIds[1];
+ int iPhase = iCon; //iBody0; // pseudorandom choice to distribute evenly amongst phases
+ iPhase &= params.phaseMask;
+ int gridCoord[3];
+ // is it a dynamic constraint?
+ if (params.bodyDynamicFlags[iBody0] && params.bodyDynamicFlags[iBody1])
+ {
+ const btIntVec3& body0Coords = params.bodyGridCoords[iBody0];
+ const btIntVec3& body1Coords = params.bodyGridCoords[iBody1];
+ // for each dimension x,y,z,
+ for (int i = 0; i < 3; ++i)
+ {
+ int coordMin = btMin(body0Coords.m_ints[i], body1Coords.m_ints[i]);
+ int coordMax = btMax(body0Coords.m_ints[i], body1Coords.m_ints[i]);
+ if (coordMin != coordMax)
+ {
+ btAssert(coordMax == coordMin + 1);
+ if ((coordMin & 1) == 0)
+ {
+ iPhase &= ~(1 << i); // force bit off
+ }
+ else
+ {
+ iPhase |= (1 << i); // force bit on
+ iPhase &= params.phaseMask;
+ }
+ }
+ gridCoord[i] = coordMin;
+ }
+ }
+ else
+ {
+ if (!params.bodyDynamicFlags[iBody0])
+ {
+ iBody0 = con.bodyIds[1];
+ }
+ btAssert(params.bodyDynamicFlags[iBody0]);
+ const btIntVec3& body0Coords = params.bodyGridCoords[iBody0];
+ // for each dimension x,y,z,
+ for (int i = 0; i < 3; ++i)
+ {
+ gridCoord[i] = body0Coords.m_ints[i];
+ }
+ }
+ // calculate chunk coordinates
+ int chunkCoord[3];
+ btIntVec3 gridChunkDim = params.gridChunkDim;
+ // for each dimension x,y,z,
+ for (int i = 0; i < 3; ++i)
+ {
+ int coordOffset = (iPhase >> i) & 1;
+ chunkCoord[i] = (gridCoord[i] - coordOffset) / 2;
+ btClamp(chunkCoord[i], 0, gridChunkDim[i] - 1);
+ btAssert(chunkCoord[i] < gridChunkDim[i]);
+ }
+ int iBatch = iPhase * params.maxNumBatchesPerPhase + chunkCoord[0] + chunkCoord[1] * gridChunkDim[0] + chunkCoord[2] * gridChunkDim[0] * gridChunkDim[1];
+ btAssert(iBatch >= 0 && iBatch < params.maxNumBatchesPerPhase * params.numPhases);
+ params.constraintBatchIds[iCon] = iBatch;
+ }
}
-
struct AssignConstraintsToGridBatchesLoop : public btIParallelForBody
{
- const AssignConstraintsToGridBatchesParams* m_params;
-
- AssignConstraintsToGridBatchesLoop( const AssignConstraintsToGridBatchesParams& params )
- {
- m_params = &params;
- }
- void forLoop( int iBegin, int iEnd ) const BT_OVERRIDE
- {
- assignConstraintsToGridBatches(*m_params, iBegin, iEnd);
- }
+ const AssignConstraintsToGridBatchesParams* m_params;
+
+ AssignConstraintsToGridBatchesLoop(const AssignConstraintsToGridBatchesParams& params)
+ {
+ m_params = &params;
+ }
+ void forLoop(int iBegin, int iEnd) const BT_OVERRIDE
+ {
+ assignConstraintsToGridBatches(*m_params, iBegin, iEnd);
+ }
};
-
//
// setupSpatialGridBatchesMt -- generate batches using a uniform 3D grid
//
@@ -853,276 +812,269 @@ to 4. With fewer phases, there are more constraints per phase and this makes it
*/
//
static void setupSpatialGridBatchesMt(
- btBatchedConstraints* batchedConstraints,
- btAlignedObjectArray<char>* scratchMemory,
- btConstraintArray* constraints,
- const btAlignedObjectArray<btSolverBody>& bodies,
- int minBatchSize,
- int maxBatchSize,
- bool use2DGrid
-)
+ btBatchedConstraints* batchedConstraints,
+ btAlignedObjectArray<char>* scratchMemory,
+ btConstraintArray* constraints,
+ const btAlignedObjectArray<btSolverBody>& bodies,
+ int minBatchSize,
+ int maxBatchSize,
+ bool use2DGrid)
{
- BT_PROFILE("setupSpatialGridBatchesMt");
- const int numPhases = 8;
- int numConstraints = constraints->size();
- int numConstraintRows = constraints->size();
-
- const int maxGridChunkCount = 128;
- int allocNumBatchesPerPhase = maxGridChunkCount;
- int minNumBatchesPerPhase = 16;
- int allocNumBatches = allocNumBatchesPerPhase * numPhases;
-
- btVector3* bodyPositions = NULL;
- bool* bodyDynamicFlags = NULL;
- btIntVec3* bodyGridCoords = NULL;
- btBatchInfo* batches = NULL;
- int* batchWork = NULL;
- btBatchedConstraintInfo* conInfos = NULL;
- int* constraintBatchIds = NULL;
- int* constraintRowBatchIds = NULL;
- {
- PreallocatedMemoryHelper<10> memHelper;
- memHelper.addChunk( (void**) &bodyPositions, sizeof( btVector3 ) * bodies.size() );
- memHelper.addChunk( (void**) &bodyDynamicFlags, sizeof( bool ) * bodies.size() );
- memHelper.addChunk( (void**) &bodyGridCoords, sizeof( btIntVec3 ) * bodies.size() );
- memHelper.addChunk( (void**) &batches, sizeof( btBatchInfo )* allocNumBatches );
- memHelper.addChunk( (void**) &batchWork, sizeof( int )* allocNumBatches );
- memHelper.addChunk( (void**) &conInfos, sizeof( btBatchedConstraintInfo ) * numConstraints );
- memHelper.addChunk( (void**) &constraintBatchIds, sizeof( int ) * numConstraints );
- memHelper.addChunk( (void**) &constraintRowBatchIds, sizeof( int ) * numConstraintRows );
- size_t scratchSize = memHelper.getSizeToAllocate();
- // if we need to reallocate
- if (scratchMemory->capacity() < scratchSize)
- {
- // allocate 6.25% extra to avoid repeated reallocs
- scratchMemory->reserve( scratchSize + scratchSize/16 );
- }
- scratchMemory->resizeNoInitialize( scratchSize );
- char* memPtr = &scratchMemory->at(0);
- memHelper.setChunkPointers( memPtr );
- }
-
- numConstraints = initBatchedConstraintInfo(conInfos, constraints);
-
- // compute bounding box around all dynamic bodies
- // (could be done in parallel)
- btVector3 bboxMin(BT_LARGE_FLOAT, BT_LARGE_FLOAT, BT_LARGE_FLOAT);
- btVector3 bboxMax = -bboxMin;
- //int dynamicBodyCount = 0;
- for (int i = 0; i < bodies.size(); ++i)
- {
- const btSolverBody& body = bodies[i];
- btVector3 bodyPos = body.getWorldTransform().getOrigin();
- bool isDynamic = ( body.internalGetInvMass().x() > btScalar( 0 ) );
- bodyPositions[i] = bodyPos;
- bodyDynamicFlags[i] = isDynamic;
- if (isDynamic)
- {
- //dynamicBodyCount++;
- bboxMin.setMin(bodyPos);
- bboxMax.setMax(bodyPos);
- }
- }
-
- // find max extent of all dynamic constraints
- // (could be done in parallel)
- btVector3 consExtent = findMaxDynamicConstraintExtent(bodyPositions, bodyDynamicFlags, conInfos, numConstraints, bodies.size());
-
- btVector3 gridExtent = bboxMax - bboxMin;
-
- btVector3 gridCellSize = consExtent;
- int gridDim[3];
- gridDim[ 0 ] = int( 1.0 + gridExtent.x() / gridCellSize.x() );
- gridDim[ 1 ] = int( 1.0 + gridExtent.y() / gridCellSize.y() );
- gridDim[ 2 ] = int( 1.0 + gridExtent.z() / gridCellSize.z() );
-
- // if we can collapse an axis, it will cut our number of phases in half which could be more efficient
- int phaseMask = 7;
- bool collapseAxis = use2DGrid;
- if ( collapseAxis )
- {
- // pick the smallest axis to collapse, leaving us with the greatest number of cells in our grid
- int iAxisToCollapse = 0;
- int axisDim = gridDim[iAxisToCollapse];
- //for each dimension
- for ( int i = 0; i < 3; ++i )
- {
- if (gridDim[i] < axisDim)
- {
- iAxisToCollapse = i;
- axisDim = gridDim[i];
- }
- }
- // collapse it
- gridCellSize[iAxisToCollapse] = gridExtent[iAxisToCollapse] * 2.0f;
- phaseMask &= ~(1 << iAxisToCollapse);
- }
-
- int numGridChunks = 0;
- btIntVec3 gridChunkDim; // each chunk is 2x2x2 group of cells
- while (true)
- {
- gridDim[0] = int( 1.0 + gridExtent.x() / gridCellSize.x() );
- gridDim[1] = int( 1.0 + gridExtent.y() / gridCellSize.y() );
- gridDim[2] = int( 1.0 + gridExtent.z() / gridCellSize.z() );
- gridChunkDim[ 0 ] = btMax( 1, ( gridDim[ 0 ] + 0 ) / 2 );
- gridChunkDim[ 1 ] = btMax( 1, ( gridDim[ 1 ] + 0 ) / 2 );
- gridChunkDim[ 2 ] = btMax( 1, ( gridDim[ 2 ] + 0 ) / 2 );
- numGridChunks = gridChunkDim[ 0 ] * gridChunkDim[ 1 ] * gridChunkDim[ 2 ];
- float nChunks = float(gridChunkDim[0]) * float(gridChunkDim[1]) * float(gridChunkDim[2]); // suceptible to integer overflow
- if ( numGridChunks <= maxGridChunkCount && nChunks <= maxGridChunkCount )
- {
- break;
- }
- gridCellSize *= 1.25; // should roughly cut numCells in half
- }
- btAssert(numGridChunks <= maxGridChunkCount );
- int maxNumBatchesPerPhase = numGridChunks;
-
- // for each dynamic body, compute grid coords
- btVector3 invGridCellSize = btVector3(1,1,1)/gridCellSize;
- // (can be done in parallel)
- for (int iBody = 0; iBody < bodies.size(); ++iBody)
- {
- btIntVec3& coords = bodyGridCoords[iBody];
- if (bodyDynamicFlags[iBody])
- {
- btVector3 v = ( bodyPositions[ iBody ] - bboxMin )*invGridCellSize;
- coords.m_ints[0] = int(v.x());
- coords.m_ints[1] = int(v.y());
- coords.m_ints[2] = int(v.z());
- btAssert(coords.m_ints[0] >= 0 && coords.m_ints[0] < gridDim[0]);
- btAssert(coords.m_ints[1] >= 0 && coords.m_ints[1] < gridDim[1]);
- btAssert(coords.m_ints[2] >= 0 && coords.m_ints[2] < gridDim[2]);
- }
- else
- {
- coords.m_ints[0] = -1;
- coords.m_ints[1] = -1;
- coords.m_ints[2] = -1;
- }
- }
-
- for (int iPhase = 0; iPhase < numPhases; ++iPhase)
- {
- int batchBegin = iPhase * maxNumBatchesPerPhase;
- int batchEnd = batchBegin + maxNumBatchesPerPhase;
- for ( int iBatch = batchBegin; iBatch < batchEnd; ++iBatch )
- {
- btBatchInfo& batch = batches[ iBatch ];
- batch = btBatchInfo();
- }
- }
-
- {
- AssignConstraintsToGridBatchesParams params;
- params.bodyDynamicFlags = bodyDynamicFlags;
- params.bodyGridCoords = bodyGridCoords;
- params.numBodies = bodies.size();
- params.conInfos = conInfos;
- params.constraintBatchIds = constraintBatchIds;
- params.gridChunkDim = gridChunkDim;
- params.maxNumBatchesPerPhase = maxNumBatchesPerPhase;
- params.numPhases = numPhases;
- params.phaseMask = phaseMask;
- bool inParallel = true;
- if (inParallel)
- {
- AssignConstraintsToGridBatchesLoop loop(params);
- int grainSize = 250;
- btParallelFor(0, numConstraints, grainSize, loop);
- }
- else
- {
- assignConstraintsToGridBatches( params, 0, numConstraints );
- }
- }
- for ( int iCon = 0; iCon < numConstraints; ++iCon )
- {
- const btBatchedConstraintInfo& con = conInfos[ iCon ];
- int iBatch = constraintBatchIds[ iCon ];
- btBatchInfo& batch = batches[iBatch];
- batch.numConstraints += con.numConstraintRows;
- }
-
- for (int iPhase = 0; iPhase < numPhases; ++iPhase)
- {
- // if phase is legit,
- if (iPhase == (iPhase&phaseMask))
- {
- int iBeginBatch = iPhase * maxNumBatchesPerPhase;
- int iEndBatch = iBeginBatch + maxNumBatchesPerPhase;
- mergeSmallBatches( batches, iBeginBatch, iEndBatch, minBatchSize, maxBatchSize );
- }
- }
- // all constraints have been assigned a batchId
- updateConstraintBatchIdsForMergesMt(constraintBatchIds, numConstraints, batches, maxNumBatchesPerPhase*numPhases);
-
- if (numConstraintRows > numConstraints)
- {
- expandConstraintRowsMt(&constraintRowBatchIds[0], &constraintBatchIds[0], &conInfos[0], numConstraints, numConstraintRows);
- }
- else
- {
- constraintRowBatchIds = constraintBatchIds;
- }
-
- writeOutBatches(batchedConstraints, constraintRowBatchIds, numConstraintRows, batches, batchWork, maxNumBatchesPerPhase, numPhases);
- btAssert(batchedConstraints->validate(constraints, bodies));
+ BT_PROFILE("setupSpatialGridBatchesMt");
+ const int numPhases = 8;
+ int numConstraints = constraints->size();
+ int numConstraintRows = constraints->size();
+
+ const int maxGridChunkCount = 128;
+ int allocNumBatchesPerPhase = maxGridChunkCount;
+ int minNumBatchesPerPhase = 16;
+ int allocNumBatches = allocNumBatchesPerPhase * numPhases;
+
+ btVector3* bodyPositions = NULL;
+ bool* bodyDynamicFlags = NULL;
+ btIntVec3* bodyGridCoords = NULL;
+ btBatchInfo* batches = NULL;
+ int* batchWork = NULL;
+ btBatchedConstraintInfo* conInfos = NULL;
+ int* constraintBatchIds = NULL;
+ int* constraintRowBatchIds = NULL;
+ {
+ PreallocatedMemoryHelper<10> memHelper;
+ memHelper.addChunk((void**)&bodyPositions, sizeof(btVector3) * bodies.size());
+ memHelper.addChunk((void**)&bodyDynamicFlags, sizeof(bool) * bodies.size());
+ memHelper.addChunk((void**)&bodyGridCoords, sizeof(btIntVec3) * bodies.size());
+ memHelper.addChunk((void**)&batches, sizeof(btBatchInfo) * allocNumBatches);
+ memHelper.addChunk((void**)&batchWork, sizeof(int) * allocNumBatches);
+ memHelper.addChunk((void**)&conInfos, sizeof(btBatchedConstraintInfo) * numConstraints);
+ memHelper.addChunk((void**)&constraintBatchIds, sizeof(int) * numConstraints);
+ memHelper.addChunk((void**)&constraintRowBatchIds, sizeof(int) * numConstraintRows);
+ size_t scratchSize = memHelper.getSizeToAllocate();
+ // if we need to reallocate
+ if (scratchMemory->capacity() < scratchSize)
+ {
+ // allocate 6.25% extra to avoid repeated reallocs
+ scratchMemory->reserve(scratchSize + scratchSize / 16);
+ }
+ scratchMemory->resizeNoInitialize(scratchSize);
+ char* memPtr = &scratchMemory->at(0);
+ memHelper.setChunkPointers(memPtr);
+ }
+
+ numConstraints = initBatchedConstraintInfo(conInfos, constraints);
+
+ // compute bounding box around all dynamic bodies
+ // (could be done in parallel)
+ btVector3 bboxMin(BT_LARGE_FLOAT, BT_LARGE_FLOAT, BT_LARGE_FLOAT);
+ btVector3 bboxMax = -bboxMin;
+ //int dynamicBodyCount = 0;
+ for (int i = 0; i < bodies.size(); ++i)
+ {
+ const btSolverBody& body = bodies[i];
+ btVector3 bodyPos = body.getWorldTransform().getOrigin();
+ bool isDynamic = (body.internalGetInvMass().x() > btScalar(0));
+ bodyPositions[i] = bodyPos;
+ bodyDynamicFlags[i] = isDynamic;
+ if (isDynamic)
+ {
+ //dynamicBodyCount++;
+ bboxMin.setMin(bodyPos);
+ bboxMax.setMax(bodyPos);
+ }
+ }
+
+ // find max extent of all dynamic constraints
+ // (could be done in parallel)
+ btVector3 consExtent = findMaxDynamicConstraintExtent(bodyPositions, bodyDynamicFlags, conInfos, numConstraints, bodies.size());
+
+ btVector3 gridExtent = bboxMax - bboxMin;
+
+ btVector3 gridCellSize = consExtent;
+ int gridDim[3];
+ gridDim[0] = int(1.0 + gridExtent.x() / gridCellSize.x());
+ gridDim[1] = int(1.0 + gridExtent.y() / gridCellSize.y());
+ gridDim[2] = int(1.0 + gridExtent.z() / gridCellSize.z());
+
+ // if we can collapse an axis, it will cut our number of phases in half which could be more efficient
+ int phaseMask = 7;
+ bool collapseAxis = use2DGrid;
+ if (collapseAxis)
+ {
+ // pick the smallest axis to collapse, leaving us with the greatest number of cells in our grid
+ int iAxisToCollapse = 0;
+ int axisDim = gridDim[iAxisToCollapse];
+ //for each dimension
+ for (int i = 0; i < 3; ++i)
+ {
+ if (gridDim[i] < axisDim)
+ {
+ iAxisToCollapse = i;
+ axisDim = gridDim[i];
+ }
+ }
+ // collapse it
+ gridCellSize[iAxisToCollapse] = gridExtent[iAxisToCollapse] * 2.0f;
+ phaseMask &= ~(1 << iAxisToCollapse);
+ }
+
+ int numGridChunks = 0;
+ btIntVec3 gridChunkDim; // each chunk is 2x2x2 group of cells
+ while (true)
+ {
+ gridDim[0] = int(1.0 + gridExtent.x() / gridCellSize.x());
+ gridDim[1] = int(1.0 + gridExtent.y() / gridCellSize.y());
+ gridDim[2] = int(1.0 + gridExtent.z() / gridCellSize.z());
+ gridChunkDim[0] = btMax(1, (gridDim[0] + 0) / 2);
+ gridChunkDim[1] = btMax(1, (gridDim[1] + 0) / 2);
+ gridChunkDim[2] = btMax(1, (gridDim[2] + 0) / 2);
+ numGridChunks = gridChunkDim[0] * gridChunkDim[1] * gridChunkDim[2];
+ float nChunks = float(gridChunkDim[0]) * float(gridChunkDim[1]) * float(gridChunkDim[2]); // suceptible to integer overflow
+ if (numGridChunks <= maxGridChunkCount && nChunks <= maxGridChunkCount)
+ {
+ break;
+ }
+ gridCellSize *= 1.25; // should roughly cut numCells in half
+ }
+ btAssert(numGridChunks <= maxGridChunkCount);
+ int maxNumBatchesPerPhase = numGridChunks;
+
+ // for each dynamic body, compute grid coords
+ btVector3 invGridCellSize = btVector3(1, 1, 1) / gridCellSize;
+ // (can be done in parallel)
+ for (int iBody = 0; iBody < bodies.size(); ++iBody)
+ {
+ btIntVec3& coords = bodyGridCoords[iBody];
+ if (bodyDynamicFlags[iBody])
+ {
+ btVector3 v = (bodyPositions[iBody] - bboxMin) * invGridCellSize;
+ coords.m_ints[0] = int(v.x());
+ coords.m_ints[1] = int(v.y());
+ coords.m_ints[2] = int(v.z());
+ btAssert(coords.m_ints[0] >= 0 && coords.m_ints[0] < gridDim[0]);
+ btAssert(coords.m_ints[1] >= 0 && coords.m_ints[1] < gridDim[1]);
+ btAssert(coords.m_ints[2] >= 0 && coords.m_ints[2] < gridDim[2]);
+ }
+ else
+ {
+ coords.m_ints[0] = -1;
+ coords.m_ints[1] = -1;
+ coords.m_ints[2] = -1;
+ }
+ }
+
+ for (int iPhase = 0; iPhase < numPhases; ++iPhase)
+ {
+ int batchBegin = iPhase * maxNumBatchesPerPhase;
+ int batchEnd = batchBegin + maxNumBatchesPerPhase;
+ for (int iBatch = batchBegin; iBatch < batchEnd; ++iBatch)
+ {
+ btBatchInfo& batch = batches[iBatch];
+ batch = btBatchInfo();
+ }
+ }
+
+ {
+ AssignConstraintsToGridBatchesParams params;
+ params.bodyDynamicFlags = bodyDynamicFlags;
+ params.bodyGridCoords = bodyGridCoords;
+ params.numBodies = bodies.size();
+ params.conInfos = conInfos;
+ params.constraintBatchIds = constraintBatchIds;
+ params.gridChunkDim = gridChunkDim;
+ params.maxNumBatchesPerPhase = maxNumBatchesPerPhase;
+ params.numPhases = numPhases;
+ params.phaseMask = phaseMask;
+ bool inParallel = true;
+ if (inParallel)
+ {
+ AssignConstraintsToGridBatchesLoop loop(params);
+ int grainSize = 250;
+ btParallelFor(0, numConstraints, grainSize, loop);
+ }
+ else
+ {
+ assignConstraintsToGridBatches(params, 0, numConstraints);
+ }
+ }
+ for (int iCon = 0; iCon < numConstraints; ++iCon)
+ {
+ const btBatchedConstraintInfo& con = conInfos[iCon];
+ int iBatch = constraintBatchIds[iCon];
+ btBatchInfo& batch = batches[iBatch];
+ batch.numConstraints += con.numConstraintRows;
+ }
+
+ for (int iPhase = 0; iPhase < numPhases; ++iPhase)
+ {
+ // if phase is legit,
+ if (iPhase == (iPhase & phaseMask))
+ {
+ int iBeginBatch = iPhase * maxNumBatchesPerPhase;
+ int iEndBatch = iBeginBatch + maxNumBatchesPerPhase;
+ mergeSmallBatches(batches, iBeginBatch, iEndBatch, minBatchSize, maxBatchSize);
+ }
+ }
+ // all constraints have been assigned a batchId
+ updateConstraintBatchIdsForMergesMt(constraintBatchIds, numConstraints, batches, maxNumBatchesPerPhase * numPhases);
+
+ if (numConstraintRows > numConstraints)
+ {
+ expandConstraintRowsMt(&constraintRowBatchIds[0], &constraintBatchIds[0], &conInfos[0], numConstraints, numConstraintRows);
+ }
+ else
+ {
+ constraintRowBatchIds = constraintBatchIds;
+ }
+
+ writeOutBatches(batchedConstraints, constraintRowBatchIds, numConstraintRows, batches, batchWork, maxNumBatchesPerPhase, numPhases);
+ btAssert(batchedConstraints->validate(constraints, bodies));
}
-
static void setupSingleBatch(
- btBatchedConstraints* bc,
- int numConstraints
-)
+ btBatchedConstraints* bc,
+ int numConstraints)
{
- BT_PROFILE("setupSingleBatch");
- typedef btBatchedConstraints::Range Range;
-
- bc->m_constraintIndices.resize( numConstraints );
- for ( int i = 0; i < numConstraints; ++i )
- {
- bc->m_constraintIndices[ i ] = i;
- }
-
- bc->m_batches.resizeNoInitialize( 0 );
- bc->m_phases.resizeNoInitialize( 0 );
- bc->m_phaseOrder.resizeNoInitialize( 0 );
- bc->m_phaseGrainSize.resizeNoInitialize( 0 );
-
- if (numConstraints > 0)
- {
- bc->m_batches.push_back( Range( 0, numConstraints ) );
- bc->m_phases.push_back( Range( 0, 1 ) );
- bc->m_phaseOrder.push_back(0);
- bc->m_phaseGrainSize.push_back(1);
- }
+ BT_PROFILE("setupSingleBatch");
+ typedef btBatchedConstraints::Range Range;
+
+ bc->m_constraintIndices.resize(numConstraints);
+ for (int i = 0; i < numConstraints; ++i)
+ {
+ bc->m_constraintIndices[i] = i;
+ }
+
+ bc->m_batches.resizeNoInitialize(0);
+ bc->m_phases.resizeNoInitialize(0);
+ bc->m_phaseOrder.resizeNoInitialize(0);
+ bc->m_phaseGrainSize.resizeNoInitialize(0);
+
+ if (numConstraints > 0)
+ {
+ bc->m_batches.push_back(Range(0, numConstraints));
+ bc->m_phases.push_back(Range(0, 1));
+ bc->m_phaseOrder.push_back(0);
+ bc->m_phaseGrainSize.push_back(1);
+ }
}
-
void btBatchedConstraints::setup(
- btConstraintArray* constraints,
- const btAlignedObjectArray<btSolverBody>& bodies,
- BatchingMethod batchingMethod,
- int minBatchSize,
- int maxBatchSize,
- btAlignedObjectArray<char>* scratchMemory
- )
+ btConstraintArray* constraints,
+ const btAlignedObjectArray<btSolverBody>& bodies,
+ BatchingMethod batchingMethod,
+ int minBatchSize,
+ int maxBatchSize,
+ btAlignedObjectArray<char>* scratchMemory)
{
- if (constraints->size() >= minBatchSize*4)
- {
- bool use2DGrid = batchingMethod == BATCHING_METHOD_SPATIAL_GRID_2D;
- setupSpatialGridBatchesMt( this, scratchMemory, constraints, bodies, minBatchSize, maxBatchSize, use2DGrid );
- if (s_debugDrawBatches)
- {
- debugDrawAllBatches( this, constraints, bodies );
- }
- }
- else
- {
- setupSingleBatch( this, constraints->size() );
- }
+ if (constraints->size() >= minBatchSize * 4)
+ {
+ bool use2DGrid = batchingMethod == BATCHING_METHOD_SPATIAL_GRID_2D;
+ setupSpatialGridBatchesMt(this, scratchMemory, constraints, bodies, minBatchSize, maxBatchSize, use2DGrid);
+ if (s_debugDrawBatches)
+ {
+ debugDrawAllBatches(this, constraints, bodies);
+ }
+ }
+ else
+ {
+ setupSingleBatch(this, constraints->size());
+ }
}
-
-
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btBatchedConstraints.h b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btBatchedConstraints.h
index 0fd8f31dd4..5d982ca370 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btBatchedConstraints.h
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btBatchedConstraints.h
@@ -21,46 +21,42 @@ subject to the following restrictions:
#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<int> m_constraintIndices;
- btAlignedObjectArray<Range> m_batches; // each batch is a range of indices in the m_constraintIndices array
- btAlignedObjectArray<Range> m_phases; // each phase is range of indices in the m_batches array
- btAlignedObjectArray<char> m_phaseGrainSize; // max grain size for each phase
- btAlignedObjectArray<int> 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<btSolverBody>& bodies,
- BatchingMethod batchingMethod,
- int minBatchSize,
- int maxBatchSize,
- btAlignedObjectArray<char>* scratchMemory
- );
- bool validate( btConstraintArray* constraints, const btAlignedObjectArray<btSolverBody>& bodies ) const;
+ 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<int> m_constraintIndices;
+ btAlignedObjectArray<Range> m_batches; // each batch is a range of indices in the m_constraintIndices array
+ btAlignedObjectArray<Range> m_phases; // each phase is range of indices in the m_batches array
+ btAlignedObjectArray<char> m_phaseGrainSize; // max grain size for each phase
+ btAlignedObjectArray<int> 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<btSolverBody>& bodies,
+ BatchingMethod batchingMethod,
+ int minBatchSize,
+ int maxBatchSize,
+ btAlignedObjectArray<char>* scratchMemory);
+ bool validate(btConstraintArray* constraints, const btAlignedObjectArray<btSolverBody>& bodies) const;
};
-
-#endif // BT_BATCHED_CONSTRAINTS_H
-
+#endif // BT_BATCHED_CONSTRAINTS_H
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp
index 0572256f74..10678b2a61 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp
@@ -15,49 +15,37 @@ subject to the following restrictions:
Written by: Marcus Hennix
*/
-
#include "btConeTwistConstraint.h"
#include "BulletDynamics/Dynamics/btRigidBody.h"
#include "LinearMath/btTransformUtil.h"
#include "LinearMath/btMinMax.h"
#include <new>
-
-
//#define CONETWIST_USE_OBSOLETE_SOLVER true
#define CONETWIST_USE_OBSOLETE_SOLVER false
#define CONETWIST_DEF_FIX_THRESH btScalar(.05f)
-
SIMD_FORCE_INLINE btScalar computeAngularImpulseDenominator(const btVector3& axis, const btMatrix3x3& invInertiaWorld)
{
btVector3 vec = axis * invInertiaWorld;
return axis.dot(vec);
}
-
-
-
-btConeTwistConstraint::btConeTwistConstraint(btRigidBody& rbA,btRigidBody& rbB,
- const btTransform& rbAFrame,const btTransform& rbBFrame)
- :btTypedConstraint(CONETWIST_CONSTRAINT_TYPE, rbA,rbB),m_rbAFrame(rbAFrame),m_rbBFrame(rbBFrame),
- m_angularOnly(false),
- m_useSolveConstraintObsolete(CONETWIST_USE_OBSOLETE_SOLVER)
+btConeTwistConstraint::btConeTwistConstraint(btRigidBody& rbA, btRigidBody& rbB,
+ const btTransform& rbAFrame, const btTransform& rbBFrame)
+ : btTypedConstraint(CONETWIST_CONSTRAINT_TYPE, rbA, rbB), m_rbAFrame(rbAFrame), m_rbBFrame(rbBFrame), m_angularOnly(false), m_useSolveConstraintObsolete(CONETWIST_USE_OBSOLETE_SOLVER)
{
init();
}
-btConeTwistConstraint::btConeTwistConstraint(btRigidBody& rbA,const btTransform& rbAFrame)
- :btTypedConstraint(CONETWIST_CONSTRAINT_TYPE,rbA),m_rbAFrame(rbAFrame),
- m_angularOnly(false),
- m_useSolveConstraintObsolete(CONETWIST_USE_OBSOLETE_SOLVER)
+btConeTwistConstraint::btConeTwistConstraint(btRigidBody& rbA, const btTransform& rbAFrame)
+ : btTypedConstraint(CONETWIST_CONSTRAINT_TYPE, rbA), m_rbAFrame(rbAFrame), m_angularOnly(false), m_useSolveConstraintObsolete(CONETWIST_USE_OBSOLETE_SOLVER)
{
m_rbBFrame = m_rbAFrame;
m_rbBFrame.setOrigin(btVector3(0., 0., 0.));
- init();
+ init();
}
-
void btConeTwistConstraint::init()
{
m_angularOnly = false;
@@ -75,30 +63,29 @@ void btConeTwistConstraint::init()
m_angCFM = btScalar(0.f);
}
-
-void btConeTwistConstraint::getInfo1 (btConstraintInfo1* info)
+void btConeTwistConstraint::getInfo1(btConstraintInfo1* info)
{
if (m_useSolveConstraintObsolete)
{
info->m_numConstraintRows = 0;
info->nub = 0;
- }
+ }
else
{
info->m_numConstraintRows = 3;
info->nub = 3;
- calcAngleInfo2(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform(),m_rbA.getInvInertiaTensorWorld(),m_rbB.getInvInertiaTensorWorld());
- if(m_solveSwingLimit)
+ calcAngleInfo2(m_rbA.getCenterOfMassTransform(), m_rbB.getCenterOfMassTransform(), m_rbA.getInvInertiaTensorWorld(), m_rbB.getInvInertiaTensorWorld());
+ if (m_solveSwingLimit)
{
info->m_numConstraintRows++;
info->nub--;
- if((m_swingSpan1 < m_fixThresh) && (m_swingSpan2 < m_fixThresh))
+ if ((m_swingSpan1 < m_fixThresh) && (m_swingSpan2 < m_fixThresh))
{
info->m_numConstraintRows++;
info->nub--;
}
}
- if(m_solveTwistLimit)
+ if (m_solveTwistLimit)
{
info->m_numConstraintRows++;
info->nub--;
@@ -106,90 +93,88 @@ void btConeTwistConstraint::getInfo1 (btConstraintInfo1* info)
}
}
-void btConeTwistConstraint::getInfo1NonVirtual (btConstraintInfo1* info)
+void btConeTwistConstraint::getInfo1NonVirtual(btConstraintInfo1* info)
{
//always reserve 6 rows: object transform is not available on SPU
info->m_numConstraintRows = 6;
info->nub = 0;
-
}
-
-void btConeTwistConstraint::getInfo2 (btConstraintInfo2* info)
+void btConeTwistConstraint::getInfo2(btConstraintInfo2* info)
{
- getInfo2NonVirtual(info,m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform(),m_rbA.getInvInertiaTensorWorld(),m_rbB.getInvInertiaTensorWorld());
+ getInfo2NonVirtual(info, m_rbA.getCenterOfMassTransform(), m_rbB.getCenterOfMassTransform(), m_rbA.getInvInertiaTensorWorld(), m_rbB.getInvInertiaTensorWorld());
}
-void btConeTwistConstraint::getInfo2NonVirtual (btConstraintInfo2* info,const btTransform& transA,const btTransform& transB,const btMatrix3x3& invInertiaWorldA,const btMatrix3x3& invInertiaWorldB)
+void btConeTwistConstraint::getInfo2NonVirtual(btConstraintInfo2* info, const btTransform& transA, const btTransform& transB, const btMatrix3x3& invInertiaWorldA, const btMatrix3x3& invInertiaWorldB)
{
- calcAngleInfo2(transA,transB,invInertiaWorldA,invInertiaWorldB);
-
+ calcAngleInfo2(transA, transB, invInertiaWorldA, invInertiaWorldB);
+
btAssert(!m_useSolveConstraintObsolete);
- // set jacobian
- info->m_J1linearAxis[0] = 1;
- info->m_J1linearAxis[info->rowskip+1] = 1;
- info->m_J1linearAxis[2*info->rowskip+2] = 1;
+ // set jacobian
+ info->m_J1linearAxis[0] = 1;
+ info->m_J1linearAxis[info->rowskip + 1] = 1;
+ info->m_J1linearAxis[2 * info->rowskip + 2] = 1;
btVector3 a1 = transA.getBasis() * m_rbAFrame.getOrigin();
{
btVector3* angular0 = (btVector3*)(info->m_J1angularAxis);
- btVector3* angular1 = (btVector3*)(info->m_J1angularAxis+info->rowskip);
- btVector3* angular2 = (btVector3*)(info->m_J1angularAxis+2*info->rowskip);
+ btVector3* angular1 = (btVector3*)(info->m_J1angularAxis + info->rowskip);
+ btVector3* angular2 = (btVector3*)(info->m_J1angularAxis + 2 * info->rowskip);
btVector3 a1neg = -a1;
- a1neg.getSkewSymmetricMatrix(angular0,angular1,angular2);
+ a1neg.getSkewSymmetricMatrix(angular0, angular1, angular2);
}
- info->m_J2linearAxis[0] = -1;
- info->m_J2linearAxis[info->rowskip+1] = -1;
- info->m_J2linearAxis[2*info->rowskip+2] = -1;
+ info->m_J2linearAxis[0] = -1;
+ info->m_J2linearAxis[info->rowskip + 1] = -1;
+ info->m_J2linearAxis[2 * info->rowskip + 2] = -1;
btVector3 a2 = transB.getBasis() * m_rbBFrame.getOrigin();
{
btVector3* angular0 = (btVector3*)(info->m_J2angularAxis);
- btVector3* angular1 = (btVector3*)(info->m_J2angularAxis+info->rowskip);
- btVector3* angular2 = (btVector3*)(info->m_J2angularAxis+2*info->rowskip);
- a2.getSkewSymmetricMatrix(angular0,angular1,angular2);
+ btVector3* angular1 = (btVector3*)(info->m_J2angularAxis + info->rowskip);
+ btVector3* angular2 = (btVector3*)(info->m_J2angularAxis + 2 * info->rowskip);
+ a2.getSkewSymmetricMatrix(angular0, angular1, angular2);
}
- // set right hand side
+ // set right hand side
btScalar linERP = (m_flags & BT_CONETWIST_FLAGS_LIN_ERP) ? m_linERP : info->erp;
- btScalar k = info->fps * linERP;
- int j;
- for (j=0; j<3; j++)
- {
- info->m_constraintError[j*info->rowskip] = k * (a2[j] + transB.getOrigin()[j] - a1[j] - transA.getOrigin()[j]);
- info->m_lowerLimit[j*info->rowskip] = -SIMD_INFINITY;
- info->m_upperLimit[j*info->rowskip] = SIMD_INFINITY;
- if(m_flags & BT_CONETWIST_FLAGS_LIN_CFM)
+ btScalar k = info->fps * linERP;
+ int j;
+ for (j = 0; j < 3; j++)
+ {
+ info->m_constraintError[j * info->rowskip] = k * (a2[j] + transB.getOrigin()[j] - a1[j] - transA.getOrigin()[j]);
+ info->m_lowerLimit[j * info->rowskip] = -SIMD_INFINITY;
+ info->m_upperLimit[j * info->rowskip] = SIMD_INFINITY;
+ if (m_flags & BT_CONETWIST_FLAGS_LIN_CFM)
{
- info->cfm[j*info->rowskip] = m_linCFM;
+ info->cfm[j * info->rowskip] = m_linCFM;
}
- }
+ }
int row = 3;
- int srow = row * info->rowskip;
+ int srow = row * info->rowskip;
btVector3 ax1;
// angular limits
- if(m_solveSwingLimit)
+ if (m_solveSwingLimit)
{
- btScalar *J1 = info->m_J1angularAxis;
- btScalar *J2 = info->m_J2angularAxis;
- if((m_swingSpan1 < m_fixThresh) && (m_swingSpan2 < m_fixThresh))
+ btScalar* J1 = info->m_J1angularAxis;
+ btScalar* J2 = info->m_J2angularAxis;
+ if ((m_swingSpan1 < m_fixThresh) && (m_swingSpan2 < m_fixThresh))
{
- btTransform trA = transA*m_rbAFrame;
+ btTransform trA = transA * m_rbAFrame;
btVector3 p = trA.getBasis().getColumn(1);
btVector3 q = trA.getBasis().getColumn(2);
int srow1 = srow + info->rowskip;
- J1[srow+0] = p[0];
- J1[srow+1] = p[1];
- J1[srow+2] = p[2];
- J1[srow1+0] = q[0];
- J1[srow1+1] = q[1];
- J1[srow1+2] = q[2];
- J2[srow+0] = -p[0];
- J2[srow+1] = -p[1];
- J2[srow+2] = -p[2];
- J2[srow1+0] = -q[0];
- J2[srow1+1] = -q[1];
- J2[srow1+2] = -q[2];
+ J1[srow + 0] = p[0];
+ J1[srow + 1] = p[1];
+ J1[srow + 2] = p[2];
+ J1[srow1 + 0] = q[0];
+ J1[srow1 + 1] = q[1];
+ J1[srow1 + 2] = q[2];
+ J2[srow + 0] = -p[0];
+ J2[srow + 1] = -p[1];
+ J2[srow + 2] = -p[2];
+ J2[srow1 + 0] = -q[0];
+ J2[srow1 + 1] = -q[1];
+ J2[srow1 + 2] = -q[2];
btScalar fact = info->fps * m_relaxationFactor;
- info->m_constraintError[srow] = fact * m_swingAxis.dot(p);
- info->m_constraintError[srow1] = fact * m_swingAxis.dot(q);
+ info->m_constraintError[srow] = fact * m_swingAxis.dot(p);
+ info->m_constraintError[srow1] = fact * m_swingAxis.dot(q);
info->m_lowerLimit[srow] = -SIMD_INFINITY;
info->m_upperLimit[srow] = SIMD_INFINITY;
info->m_lowerLimit[srow1] = -SIMD_INFINITY;
@@ -199,16 +184,16 @@ void btConeTwistConstraint::getInfo2NonVirtual (btConstraintInfo2* info,const bt
else
{
ax1 = m_swingAxis * m_relaxationFactor * m_relaxationFactor;
- J1[srow+0] = ax1[0];
- J1[srow+1] = ax1[1];
- J1[srow+2] = ax1[2];
- J2[srow+0] = -ax1[0];
- J2[srow+1] = -ax1[1];
- J2[srow+2] = -ax1[2];
+ J1[srow + 0] = ax1[0];
+ J1[srow + 1] = ax1[1];
+ J1[srow + 2] = ax1[2];
+ J2[srow + 0] = -ax1[0];
+ J2[srow + 1] = -ax1[1];
+ J2[srow + 2] = -ax1[2];
btScalar k = info->fps * m_biasFactor;
info->m_constraintError[srow] = k * m_swingCorrection;
- if(m_flags & BT_CONETWIST_FLAGS_ANG_CFM)
+ if (m_flags & BT_CONETWIST_FLAGS_ANG_CFM)
{
info->cfm[srow] = m_angCFM;
}
@@ -218,36 +203,35 @@ void btConeTwistConstraint::getInfo2NonVirtual (btConstraintInfo2* info,const bt
srow += info->rowskip;
}
}
- if(m_solveTwistLimit)
+ if (m_solveTwistLimit)
{
ax1 = m_twistAxis * m_relaxationFactor * m_relaxationFactor;
- btScalar *J1 = info->m_J1angularAxis;
- btScalar *J2 = info->m_J2angularAxis;
- J1[srow+0] = ax1[0];
- J1[srow+1] = ax1[1];
- J1[srow+2] = ax1[2];
- J2[srow+0] = -ax1[0];
- J2[srow+1] = -ax1[1];
- J2[srow+2] = -ax1[2];
+ btScalar* J1 = info->m_J1angularAxis;
+ btScalar* J2 = info->m_J2angularAxis;
+ J1[srow + 0] = ax1[0];
+ J1[srow + 1] = ax1[1];
+ J1[srow + 2] = ax1[2];
+ J2[srow + 0] = -ax1[0];
+ J2[srow + 1] = -ax1[1];
+ J2[srow + 2] = -ax1[2];
btScalar k = info->fps * m_biasFactor;
info->m_constraintError[srow] = k * m_twistCorrection;
- if(m_flags & BT_CONETWIST_FLAGS_ANG_CFM)
+ if (m_flags & BT_CONETWIST_FLAGS_ANG_CFM)
{
info->cfm[srow] = m_angCFM;
}
- if(m_twistSpan > 0.0f)
+ if (m_twistSpan > 0.0f)
{
-
- if(m_twistCorrection > 0.0f)
+ if (m_twistCorrection > 0.0f)
{
info->m_lowerLimit[srow] = 0;
info->m_upperLimit[srow] = SIMD_INFINITY;
- }
+ }
else
{
info->m_lowerLimit[srow] = -SIMD_INFINITY;
info->m_upperLimit[srow] = 0;
- }
+ }
}
else
{
@@ -257,22 +241,20 @@ void btConeTwistConstraint::getInfo2NonVirtual (btConstraintInfo2* info,const bt
srow += info->rowskip;
}
}
-
-
-void btConeTwistConstraint::buildJacobian()
+void btConeTwistConstraint::buildJacobian()
{
if (m_useSolveConstraintObsolete)
{
m_appliedImpulse = btScalar(0.);
m_accTwistLimitImpulse = btScalar(0.);
m_accSwingLimitImpulse = btScalar(0.);
- m_accMotorImpulse = btVector3(0.,0.,0.);
+ m_accMotorImpulse = btVector3(0., 0., 0.);
if (!m_angularOnly)
{
- btVector3 pivotAInW = m_rbA.getCenterOfMassTransform()*m_rbAFrame.getOrigin();
- btVector3 pivotBInW = m_rbB.getCenterOfMassTransform()*m_rbBFrame.getOrigin();
+ btVector3 pivotAInW = m_rbA.getCenterOfMassTransform() * m_rbAFrame.getOrigin();
+ btVector3 pivotBInW = m_rbB.getCenterOfMassTransform() * m_rbBFrame.getOrigin();
btVector3 relPos = pivotBInW - pivotAInW;
btVector3 normal[3];
@@ -282,71 +264,68 @@ void btConeTwistConstraint::buildJacobian()
}
else
{
- normal[0].setValue(btScalar(1.0),0,0);
+ normal[0].setValue(btScalar(1.0), 0, 0);
}
btPlaneSpace1(normal[0], normal[1], normal[2]);
- for (int i=0;i<3;i++)
+ for (int i = 0; i < 3; i++)
{
new (&m_jac[i]) btJacobianEntry(
- m_rbA.getCenterOfMassTransform().getBasis().transpose(),
- m_rbB.getCenterOfMassTransform().getBasis().transpose(),
- pivotAInW - m_rbA.getCenterOfMassPosition(),
- pivotBInW - m_rbB.getCenterOfMassPosition(),
- normal[i],
- m_rbA.getInvInertiaDiagLocal(),
- m_rbA.getInvMass(),
- m_rbB.getInvInertiaDiagLocal(),
- m_rbB.getInvMass());
+ m_rbA.getCenterOfMassTransform().getBasis().transpose(),
+ m_rbB.getCenterOfMassTransform().getBasis().transpose(),
+ pivotAInW - m_rbA.getCenterOfMassPosition(),
+ pivotBInW - m_rbB.getCenterOfMassPosition(),
+ normal[i],
+ m_rbA.getInvInertiaDiagLocal(),
+ m_rbA.getInvMass(),
+ m_rbB.getInvInertiaDiagLocal(),
+ m_rbB.getInvMass());
}
}
- calcAngleInfo2(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform(),m_rbA.getInvInertiaTensorWorld(),m_rbB.getInvInertiaTensorWorld());
+ calcAngleInfo2(m_rbA.getCenterOfMassTransform(), m_rbB.getCenterOfMassTransform(), m_rbA.getInvInertiaTensorWorld(), m_rbB.getInvInertiaTensorWorld());
}
}
-
-
-void btConeTwistConstraint::solveConstraintObsolete(btSolverBody& bodyA,btSolverBody& bodyB,btScalar timeStep)
+void btConeTwistConstraint::solveConstraintObsolete(btSolverBody& bodyA, btSolverBody& bodyB, btScalar timeStep)
{
- #ifndef __SPU__
+#ifndef __SPU__
if (m_useSolveConstraintObsolete)
{
- btVector3 pivotAInW = m_rbA.getCenterOfMassTransform()*m_rbAFrame.getOrigin();
- btVector3 pivotBInW = m_rbB.getCenterOfMassTransform()*m_rbBFrame.getOrigin();
+ btVector3 pivotAInW = m_rbA.getCenterOfMassTransform() * m_rbAFrame.getOrigin();
+ btVector3 pivotBInW = m_rbB.getCenterOfMassTransform() * m_rbBFrame.getOrigin();
btScalar tau = btScalar(0.3);
//linear part
if (!m_angularOnly)
{
- btVector3 rel_pos1 = pivotAInW - m_rbA.getCenterOfMassPosition();
+ btVector3 rel_pos1 = pivotAInW - m_rbA.getCenterOfMassPosition();
btVector3 rel_pos2 = pivotBInW - m_rbB.getCenterOfMassPosition();
btVector3 vel1;
- bodyA.internalGetVelocityInLocalPointObsolete(rel_pos1,vel1);
+ bodyA.internalGetVelocityInLocalPointObsolete(rel_pos1, vel1);
btVector3 vel2;
- bodyB.internalGetVelocityInLocalPointObsolete(rel_pos2,vel2);
+ bodyB.internalGetVelocityInLocalPointObsolete(rel_pos2, vel2);
btVector3 vel = vel1 - vel2;
- for (int i=0;i<3;i++)
- {
+ for (int i = 0; i < 3; i++)
+ {
const btVector3& normal = m_jac[i].m_linearJointAxis;
btScalar jacDiagABInv = btScalar(1.) / m_jac[i].getDiagonal();
btScalar rel_vel;
rel_vel = normal.dot(vel);
//positional error (zeroth order error)
- btScalar depth = -(pivotAInW - pivotBInW).dot(normal); //this is the error projected on the normal
- btScalar impulse = depth*tau/timeStep * jacDiagABInv - rel_vel * jacDiagABInv;
+ btScalar depth = -(pivotAInW - pivotBInW).dot(normal); //this is the error projected on the normal
+ btScalar impulse = depth * tau / timeStep * jacDiagABInv - rel_vel * jacDiagABInv;
m_appliedImpulse += impulse;
-
+
btVector3 ftorqueAxis1 = rel_pos1.cross(normal);
btVector3 ftorqueAxis2 = rel_pos2.cross(normal);
- bodyA.internalApplyImpulse(normal*m_rbA.getInvMass(), m_rbA.getInvInertiaTensorWorld()*ftorqueAxis1,impulse);
- bodyB.internalApplyImpulse(normal*m_rbB.getInvMass(), m_rbB.getInvInertiaTensorWorld()*ftorqueAxis2,-impulse);
-
+ bodyA.internalApplyImpulse(normal * m_rbA.getInvMass(), m_rbA.getInvInertiaTensorWorld() * ftorqueAxis1, impulse);
+ bodyB.internalApplyImpulse(normal * m_rbB.getInvMass(), m_rbB.getInvInertiaTensorWorld() * ftorqueAxis2, -impulse);
}
}
@@ -356,13 +335,17 @@ void btConeTwistConstraint::solveConstraintObsolete(btSolverBody& bodyA,btSolver
// compute current and predicted transforms
btTransform trACur = m_rbA.getCenterOfMassTransform();
btTransform trBCur = m_rbB.getCenterOfMassTransform();
- btVector3 omegaA; bodyA.internalGetAngularVelocity(omegaA);
- btVector3 omegaB; bodyB.internalGetAngularVelocity(omegaB);
- btTransform trAPred; trAPred.setIdentity();
- btVector3 zerovec(0,0,0);
+ btVector3 omegaA;
+ bodyA.internalGetAngularVelocity(omegaA);
+ btVector3 omegaB;
+ bodyB.internalGetAngularVelocity(omegaB);
+ btTransform trAPred;
+ trAPred.setIdentity();
+ btVector3 zerovec(0, 0, 0);
btTransformUtil::integrateTransform(
trACur, zerovec, omegaA, timeStep, trAPred);
- btTransform trBPred; trBPred.setIdentity();
+ btTransform trBPred;
+ trBPred.setIdentity();
btTransformUtil::integrateTransform(
trBCur, zerovec, omegaB, timeStep, trBPred);
@@ -374,7 +357,7 @@ void btConeTwistConstraint::solveConstraintObsolete(btSolverBody& bodyA,btSolver
// compute desired omegas in world
btVector3 omegaADes, omegaBDes;
-
+
btTransformUtil::calculateVelocity(trACur, trADes, timeStep, zerovec, omegaADes);
btTransformUtil::calculateVelocity(trBCur, trBDes, timeStep, zerovec, omegaBDes);
@@ -415,10 +398,10 @@ void btConeTwistConstraint::solveConstraintObsolete(btSolverBody& bodyA,btSolver
{
btScalar fMaxImpulse = m_maxMotorImpulse;
if (m_bNormalizedMotorStrength)
- fMaxImpulse = fMaxImpulse/kAxisAInv;
+ fMaxImpulse = fMaxImpulse / kAxisAInv;
btVector3 newUnclampedAccImpulse = m_accMotorImpulse + impulse;
- btScalar newUnclampedMag = newUnclampedAccImpulse.length();
+ btScalar newUnclampedMag = newUnclampedAccImpulse.length();
if (newUnclampedMag > fMaxImpulse)
{
newUnclampedAccImpulse.normalize();
@@ -428,31 +411,32 @@ void btConeTwistConstraint::solveConstraintObsolete(btSolverBody& bodyA,btSolver
m_accMotorImpulse += impulse;
}
- btScalar impulseMag = impulse.length();
- btVector3 impulseAxis = impulse / impulseMag;
-
- bodyA.internalApplyImpulse(btVector3(0,0,0), m_rbA.getInvInertiaTensorWorld()*impulseAxis, impulseMag);
- bodyB.internalApplyImpulse(btVector3(0,0,0), m_rbB.getInvInertiaTensorWorld()*impulseAxis, -impulseMag);
+ btScalar impulseMag = impulse.length();
+ btVector3 impulseAxis = impulse / impulseMag;
+ bodyA.internalApplyImpulse(btVector3(0, 0, 0), m_rbA.getInvInertiaTensorWorld() * impulseAxis, impulseMag);
+ bodyB.internalApplyImpulse(btVector3(0, 0, 0), m_rbB.getInvInertiaTensorWorld() * impulseAxis, -impulseMag);
}
}
- else if (m_damping > SIMD_EPSILON) // no motor: do a little damping
+ else if (m_damping > SIMD_EPSILON) // no motor: do a little damping
{
- btVector3 angVelA; bodyA.internalGetAngularVelocity(angVelA);
- btVector3 angVelB; bodyB.internalGetAngularVelocity(angVelB);
+ btVector3 angVelA;
+ bodyA.internalGetAngularVelocity(angVelA);
+ btVector3 angVelB;
+ bodyB.internalGetAngularVelocity(angVelB);
btVector3 relVel = angVelB - angVelA;
if (relVel.length2() > SIMD_EPSILON)
{
btVector3 relVelAxis = relVel.normalized();
- btScalar m_kDamping = btScalar(1.) /
- (getRigidBodyA().computeAngularImpulseDenominator(relVelAxis) +
- getRigidBodyB().computeAngularImpulseDenominator(relVelAxis));
+ btScalar m_kDamping = btScalar(1.) /
+ (getRigidBodyA().computeAngularImpulseDenominator(relVelAxis) +
+ getRigidBodyB().computeAngularImpulseDenominator(relVelAxis));
btVector3 impulse = m_damping * m_kDamping * relVel;
- btScalar impulseMag = impulse.length();
+ btScalar impulseMag = impulse.length();
btVector3 impulseAxis = impulse / impulseMag;
- bodyA.internalApplyImpulse(btVector3(0,0,0), m_rbA.getInvInertiaTensorWorld()*impulseAxis, impulseMag);
- bodyB.internalApplyImpulse(btVector3(0,0,0), m_rbB.getInvInertiaTensorWorld()*impulseAxis, -impulseMag);
+ bodyA.internalApplyImpulse(btVector3(0, 0, 0), m_rbA.getInvInertiaTensorWorld() * impulseAxis, impulseMag);
+ bodyB.internalApplyImpulse(btVector3(0, 0, 0), m_rbB.getInvInertiaTensorWorld() * impulseAxis, -impulseMag);
}
}
@@ -467,7 +451,7 @@ void btConeTwistConstraint::solveConstraintObsolete(btSolverBody& bodyA,btSolver
// solve swing limit
if (m_solveSwingLimit)
{
- btScalar amplitude = m_swingLimitRatio * m_swingCorrection*m_biasFactor/timeStep;
+ btScalar amplitude = m_swingLimitRatio * m_swingCorrection * m_biasFactor / timeStep;
btScalar relSwingVel = (angVelB - angVelA).dot(m_swingAxis);
if (relSwingVel > 0)
amplitude += m_swingLimitRatio * relSwingVel * m_relaxationFactor;
@@ -475,7 +459,7 @@ void btConeTwistConstraint::solveConstraintObsolete(btSolverBody& bodyA,btSolver
// Clamp the accumulated impulse
btScalar temp = m_accSwingLimitImpulse;
- m_accSwingLimitImpulse = btMax(m_accSwingLimitImpulse + impulseMag, btScalar(0.0) );
+ m_accSwingLimitImpulse = btMax(m_accSwingLimitImpulse + impulseMag, btScalar(0.0));
impulseMag = m_accSwingLimitImpulse - temp;
btVector3 impulse = m_swingAxis * impulseMag;
@@ -491,47 +475,41 @@ void btConeTwistConstraint::solveConstraintObsolete(btSolverBody& bodyA,btSolver
impulseMag = impulse.length();
btVector3 noTwistSwingAxis = impulse / impulseMag;
- bodyA.internalApplyImpulse(btVector3(0,0,0), m_rbA.getInvInertiaTensorWorld()*noTwistSwingAxis, impulseMag);
- bodyB.internalApplyImpulse(btVector3(0,0,0), m_rbB.getInvInertiaTensorWorld()*noTwistSwingAxis, -impulseMag);
+ bodyA.internalApplyImpulse(btVector3(0, 0, 0), m_rbA.getInvInertiaTensorWorld() * noTwistSwingAxis, impulseMag);
+ bodyB.internalApplyImpulse(btVector3(0, 0, 0), m_rbB.getInvInertiaTensorWorld() * noTwistSwingAxis, -impulseMag);
}
-
// solve twist limit
if (m_solveTwistLimit)
{
- btScalar amplitude = m_twistLimitRatio * m_twistCorrection*m_biasFactor/timeStep;
- btScalar relTwistVel = (angVelB - angVelA).dot( m_twistAxis );
- if (relTwistVel > 0) // only damp when moving towards limit (m_twistAxis flipping is important)
+ btScalar amplitude = m_twistLimitRatio * m_twistCorrection * m_biasFactor / timeStep;
+ btScalar relTwistVel = (angVelB - angVelA).dot(m_twistAxis);
+ if (relTwistVel > 0) // only damp when moving towards limit (m_twistAxis flipping is important)
amplitude += m_twistLimitRatio * relTwistVel * m_relaxationFactor;
btScalar impulseMag = amplitude * m_kTwist;
// Clamp the accumulated impulse
btScalar temp = m_accTwistLimitImpulse;
- m_accTwistLimitImpulse = btMax(m_accTwistLimitImpulse + impulseMag, btScalar(0.0) );
+ m_accTwistLimitImpulse = btMax(m_accTwistLimitImpulse + impulseMag, btScalar(0.0));
impulseMag = m_accTwistLimitImpulse - temp;
- // btVector3 impulse = m_twistAxis * impulseMag;
+ // btVector3 impulse = m_twistAxis * impulseMag;
- bodyA.internalApplyImpulse(btVector3(0,0,0), m_rbA.getInvInertiaTensorWorld()*m_twistAxis,impulseMag);
- bodyB.internalApplyImpulse(btVector3(0,0,0), m_rbB.getInvInertiaTensorWorld()*m_twistAxis,-impulseMag);
- }
+ bodyA.internalApplyImpulse(btVector3(0, 0, 0), m_rbA.getInvInertiaTensorWorld() * m_twistAxis, impulseMag);
+ bodyB.internalApplyImpulse(btVector3(0, 0, 0), m_rbB.getInvInertiaTensorWorld() * m_twistAxis, -impulseMag);
+ }
}
}
#else
-btAssert(0);
-#endif //__SPU__
+ btAssert(0);
+#endif //__SPU__
}
-
-
-
-void btConeTwistConstraint::updateRHS(btScalar timeStep)
+void btConeTwistConstraint::updateRHS(btScalar timeStep)
{
(void)timeStep;
-
}
-
#ifndef __SPU__
void btConeTwistConstraint::calcAngleInfo()
{
@@ -540,15 +518,15 @@ void btConeTwistConstraint::calcAngleInfo()
m_solveTwistLimit = false;
m_solveSwingLimit = false;
- btVector3 b1Axis1(0,0,0),b1Axis2(0,0,0),b1Axis3(0,0,0);
- btVector3 b2Axis1(0,0,0),b2Axis2(0,0,0);
+ btVector3 b1Axis1(0, 0, 0), b1Axis2(0, 0, 0), b1Axis3(0, 0, 0);
+ btVector3 b2Axis1(0, 0, 0), b2Axis2(0, 0, 0);
b1Axis1 = getRigidBodyA().getCenterOfMassTransform().getBasis() * this->m_rbAFrame.getBasis().getColumn(0);
b2Axis1 = getRigidBodyB().getCenterOfMassTransform().getBasis() * this->m_rbBFrame.getBasis().getColumn(0);
- btScalar swing1=btScalar(0.),swing2 = btScalar(0.);
+ btScalar swing1 = btScalar(0.), swing2 = btScalar(0.);
- btScalar swx=btScalar(0.),swy = btScalar(0.);
+ btScalar swx = btScalar(0.), swy = btScalar(0.);
btScalar thresh = btScalar(10.);
btScalar fact;
@@ -558,33 +536,33 @@ void btConeTwistConstraint::calcAngleInfo()
b1Axis2 = getRigidBodyA().getCenterOfMassTransform().getBasis() * this->m_rbAFrame.getBasis().getColumn(1);
swx = b2Axis1.dot(b1Axis1);
swy = b2Axis1.dot(b1Axis2);
- swing1 = btAtan2Fast(swy, swx);
- fact = (swy*swy + swx*swx) * thresh * thresh;
+ swing1 = btAtan2Fast(swy, swx);
+ fact = (swy * swy + swx * swx) * thresh * thresh;
fact = fact / (fact + btScalar(1.0));
- swing1 *= fact;
+ swing1 *= fact;
}
if (m_swingSpan2 >= btScalar(0.05f))
{
- b1Axis3 = getRigidBodyA().getCenterOfMassTransform().getBasis() * this->m_rbAFrame.getBasis().getColumn(2);
+ b1Axis3 = getRigidBodyA().getCenterOfMassTransform().getBasis() * this->m_rbAFrame.getBasis().getColumn(2);
swx = b2Axis1.dot(b1Axis1);
swy = b2Axis1.dot(b1Axis3);
- swing2 = btAtan2Fast(swy, swx);
- fact = (swy*swy + swx*swx) * thresh * thresh;
+ swing2 = btAtan2Fast(swy, swx);
+ fact = (swy * swy + swx * swx) * thresh * thresh;
fact = fact / (fact + btScalar(1.0));
- swing2 *= fact;
+ swing2 *= fact;
}
- btScalar RMaxAngle1Sq = 1.0f / (m_swingSpan1*m_swingSpan1);
- btScalar RMaxAngle2Sq = 1.0f / (m_swingSpan2*m_swingSpan2);
- btScalar EllipseAngle = btFabs(swing1*swing1)* RMaxAngle1Sq + btFabs(swing2*swing2) * RMaxAngle2Sq;
+ btScalar RMaxAngle1Sq = 1.0f / (m_swingSpan1 * m_swingSpan1);
+ btScalar RMaxAngle2Sq = 1.0f / (m_swingSpan2 * m_swingSpan2);
+ btScalar EllipseAngle = btFabs(swing1 * swing1) * RMaxAngle1Sq + btFabs(swing2 * swing2) * RMaxAngle2Sq;
if (EllipseAngle > 1.0f)
{
- m_swingCorrection = EllipseAngle-1.0f;
+ m_swingCorrection = EllipseAngle - 1.0f;
m_solveSwingLimit = true;
// Calculate necessary axis & factors
- m_swingAxis = b2Axis1.cross(b1Axis2* b2Axis1.dot(b1Axis2) + b1Axis3* b2Axis1.dot(b1Axis3));
+ m_swingAxis = b2Axis1.cross(b1Axis2 * b2Axis1.dot(b1Axis2) + b1Axis3 * b2Axis1.dot(b1Axis3));
m_swingAxis.normalize();
btScalar swingAxisSign = (b2Axis1.dot(b1Axis1) >= 0.0f) ? 1.0f : -1.0f;
m_swingAxis *= swingAxisSign;
@@ -594,14 +572,14 @@ void btConeTwistConstraint::calcAngleInfo()
if (m_twistSpan >= btScalar(0.))
{
btVector3 b2Axis2 = getRigidBodyB().getCenterOfMassTransform().getBasis() * this->m_rbBFrame.getBasis().getColumn(1);
- btQuaternion rotationArc = shortestArcQuat(b2Axis1,b1Axis1);
- btVector3 TwistRef = quatRotate(rotationArc,b2Axis2);
- btScalar twist = btAtan2Fast( TwistRef.dot(b1Axis3), TwistRef.dot(b1Axis2) );
+ btQuaternion rotationArc = shortestArcQuat(b2Axis1, b1Axis1);
+ btVector3 TwistRef = quatRotate(rotationArc, b2Axis2);
+ btScalar twist = btAtan2Fast(TwistRef.dot(b1Axis3), TwistRef.dot(b1Axis2));
m_twistAngle = twist;
-// btScalar lockedFreeFactor = (m_twistSpan > btScalar(0.05f)) ? m_limitSoftness : btScalar(0.);
+ // btScalar lockedFreeFactor = (m_twistSpan > btScalar(0.05f)) ? m_limitSoftness : btScalar(0.);
btScalar lockedFreeFactor = (m_twistSpan > btScalar(0.05f)) ? btScalar(1.0f) : btScalar(0.);
- if (twist <= -m_twistSpan*lockedFreeFactor)
+ if (twist <= -m_twistSpan * lockedFreeFactor)
{
m_twistCorrection = -(twist + m_twistSpan);
m_solveTwistLimit = true;
@@ -609,7 +587,7 @@ void btConeTwistConstraint::calcAngleInfo()
m_twistAxis.normalize();
m_twistAxis *= -1.0f;
}
- else if (twist > m_twistSpan*lockedFreeFactor)
+ else if (twist > m_twistSpan * lockedFreeFactor)
{
m_twistCorrection = (twist - m_twistSpan);
m_solveTwistLimit = true;
@@ -618,13 +596,11 @@ void btConeTwistConstraint::calcAngleInfo()
}
}
}
-#endif //__SPU__
-
-static btVector3 vTwist(1,0,0); // twist axis in constraint's space
+#endif //__SPU__
+static btVector3 vTwist(1, 0, 0); // twist axis in constraint's space
-
-void btConeTwistConstraint::calcAngleInfo2(const btTransform& transA, const btTransform& transB, const btMatrix3x3& invInertiaWorldA,const btMatrix3x3& invInertiaWorldB)
+void btConeTwistConstraint::calcAngleInfo2(const btTransform& transA, const btTransform& transB, const btMatrix3x3& invInertiaWorldA, const btMatrix3x3& invInertiaWorldB)
{
m_swingCorrection = btScalar(0.);
m_twistLimitSign = btScalar(0.);
@@ -632,7 +608,7 @@ void btConeTwistConstraint::calcAngleInfo2(const btTransform& transA, const btTr
m_solveSwingLimit = false;
// compute rotation of A wrt B (in constraint space)
if (m_bMotorEnabled && (!m_useSolveConstraintObsolete))
- { // it is assumed that setMotorTarget() was alredy called
+ { // it is assumed that setMotorTarget() was alredy called
// and motor target m_qTarget is within constraint limits
// TODO : split rotation to pure swing and pure twist
// compute desired transforms in world
@@ -641,23 +617,22 @@ void btConeTwistConstraint::calcAngleInfo2(const btTransform& transA, const btTr
btTransform trB = transB * m_rbBFrame;
btTransform trDeltaAB = trB * trPose * trA.inverse();
btQuaternion qDeltaAB = trDeltaAB.getRotation();
- btVector3 swingAxis = btVector3(qDeltaAB.x(), qDeltaAB.y(), qDeltaAB.z());
+ btVector3 swingAxis = btVector3(qDeltaAB.x(), qDeltaAB.y(), qDeltaAB.z());
btScalar swingAxisLen2 = swingAxis.length2();
- if(btFuzzyZero(swingAxisLen2))
+ if (btFuzzyZero(swingAxisLen2))
{
- return;
+ return;
}
m_swingAxis = swingAxis;
m_swingAxis.normalize();
m_swingCorrection = qDeltaAB.getAngle();
- if(!btFuzzyZero(m_swingCorrection))
+ if (!btFuzzyZero(m_swingCorrection))
{
m_solveSwingLimit = true;
}
return;
}
-
{
// compute rotation of A wrt B (in constraint space)
btQuaternion qA = transA.getRotation() * m_rbAFrame.getRotation();
@@ -665,13 +640,17 @@ void btConeTwistConstraint::calcAngleInfo2(const btTransform& transA, const btTr
btQuaternion qAB = qB.inverse() * qA;
// split rotation into cone and twist
// (all this is done from B's perspective. Maybe I should be averaging axes...)
- btVector3 vConeNoTwist = quatRotate(qAB, vTwist); vConeNoTwist.normalize();
- btQuaternion qABCone = shortestArcQuat(vTwist, vConeNoTwist); qABCone.normalize();
- btQuaternion qABTwist = qABCone.inverse() * qAB; qABTwist.normalize();
+ btVector3 vConeNoTwist = quatRotate(qAB, vTwist);
+ vConeNoTwist.normalize();
+ btQuaternion qABCone = shortestArcQuat(vTwist, vConeNoTwist);
+ qABCone.normalize();
+ btQuaternion qABTwist = qABCone.inverse() * qAB;
+ qABTwist.normalize();
if (m_swingSpan1 >= m_fixThresh && m_swingSpan2 >= m_fixThresh)
{
- btScalar swingAngle, swingLimit = 0; btVector3 swingAxis;
+ btScalar swingAngle, swingLimit = 0;
+ btVector3 swingAxis;
computeConeLimitInfo(qABCone, swingAngle, swingAxis, swingLimit);
if (swingAngle > swingLimit * m_limitSoftness)
@@ -684,9 +663,9 @@ void btConeTwistConstraint::calcAngleInfo2(const btTransform& transA, const btTr
m_swingLimitRatio = 1.f;
if (swingAngle < swingLimit && m_limitSoftness < 1.f - SIMD_EPSILON)
{
- m_swingLimitRatio = (swingAngle - swingLimit * m_limitSoftness)/
+ m_swingLimitRatio = (swingAngle - swingLimit * m_limitSoftness) /
(swingLimit - swingLimit * m_limitSoftness);
- }
+ }
// swing correction tries to get back to soft limit
m_swingCorrection = swingAngle - (swingLimit * m_limitSoftness);
@@ -694,14 +673,14 @@ void btConeTwistConstraint::calcAngleInfo2(const btTransform& transA, const btTr
// adjustment of swing axis (based on ellipse normal)
adjustSwingAxisToUseEllipseNormal(swingAxis);
- // Calculate necessary axis & factors
+ // Calculate necessary axis & factors
m_swingAxis = quatRotate(qB, -swingAxis);
- m_twistAxisA.setValue(0,0,0);
+ m_twistAxisA.setValue(0, 0, 0);
- m_kSwing = btScalar(1.) /
- (computeAngularImpulseDenominator(m_swingAxis,invInertiaWorldA) +
- computeAngularImpulseDenominator(m_swingAxis,invInertiaWorldB));
+ m_kSwing = btScalar(1.) /
+ (computeAngularImpulseDenominator(m_swingAxis, invInertiaWorldA) +
+ computeAngularImpulseDenominator(m_swingAxis, invInertiaWorldB));
}
}
else
@@ -717,9 +696,9 @@ void btConeTwistConstraint::calcAngleInfo2(const btTransform& transA, const btTr
btScalar x = ivB.dot(ivA);
btScalar y = ivB.dot(jvA);
btScalar z = ivB.dot(kvA);
- if((m_swingSpan1 < m_fixThresh) && (m_swingSpan2 < m_fixThresh))
- { // fixed. We'll need to add one more row to constraint
- if((!btFuzzyZero(y)) || (!(btFuzzyZero(z))))
+ if ((m_swingSpan1 < m_fixThresh) && (m_swingSpan2 < m_fixThresh))
+ { // fixed. We'll need to add one more row to constraint
+ if ((!btFuzzyZero(y)) || (!(btFuzzyZero(z))))
{
m_solveSwingLimit = true;
m_swingAxis = -ivB.cross(ivA);
@@ -727,47 +706,47 @@ void btConeTwistConstraint::calcAngleInfo2(const btTransform& transA, const btTr
}
else
{
- if(m_swingSpan1 < m_fixThresh)
- { // hinge around Y axis
-// if(!(btFuzzyZero(y)))
- if((!(btFuzzyZero(x))) || (!(btFuzzyZero(z))))
+ if (m_swingSpan1 < m_fixThresh)
+ { // hinge around Y axis
+ // if(!(btFuzzyZero(y)))
+ if ((!(btFuzzyZero(x))) || (!(btFuzzyZero(z))))
{
m_solveSwingLimit = true;
- if(m_swingSpan2 >= m_fixThresh)
+ if (m_swingSpan2 >= m_fixThresh)
{
y = btScalar(0.f);
btScalar span2 = btAtan2(z, x);
- if(span2 > m_swingSpan2)
+ if (span2 > m_swingSpan2)
{
x = btCos(m_swingSpan2);
z = btSin(m_swingSpan2);
}
- else if(span2 < -m_swingSpan2)
+ else if (span2 < -m_swingSpan2)
{
- x = btCos(m_swingSpan2);
+ x = btCos(m_swingSpan2);
z = -btSin(m_swingSpan2);
}
}
}
}
else
- { // hinge around Z axis
-// if(!btFuzzyZero(z))
- if((!(btFuzzyZero(x))) || (!(btFuzzyZero(y))))
+ { // hinge around Z axis
+ // if(!btFuzzyZero(z))
+ if ((!(btFuzzyZero(x))) || (!(btFuzzyZero(y))))
{
m_solveSwingLimit = true;
- if(m_swingSpan1 >= m_fixThresh)
+ if (m_swingSpan1 >= m_fixThresh)
{
z = btScalar(0.f);
btScalar span1 = btAtan2(y, x);
- if(span1 > m_swingSpan1)
+ if (span1 > m_swingSpan1)
{
x = btCos(m_swingSpan1);
y = btSin(m_swingSpan1);
}
- else if(span1 < -m_swingSpan1)
+ else if (span1 < -m_swingSpan1)
{
- x = btCos(m_swingSpan1);
+ x = btCos(m_swingSpan1);
y = -btSin(m_swingSpan1);
}
}
@@ -778,10 +757,10 @@ void btConeTwistConstraint::calcAngleInfo2(const btTransform& transA, const btTr
target[2] = x * ivA[2] + y * jvA[2] + z * kvA[2];
target.normalize();
m_swingAxis = -ivB.cross(target);
- m_swingCorrection = m_swingAxis.length();
+ m_swingCorrection = m_swingAxis.length();
- if (!btFuzzyZero(m_swingCorrection))
- m_swingAxis.normalize();
+ if (!btFuzzyZero(m_swingCorrection))
+ m_swingAxis.normalize();
}
}
@@ -790,15 +769,15 @@ void btConeTwistConstraint::calcAngleInfo2(const btTransform& transA, const btTr
btVector3 twistAxis;
computeTwistLimitInfo(qABTwist, m_twistAngle, twistAxis);
- if (m_twistAngle > m_twistSpan*m_limitSoftness)
+ if (m_twistAngle > m_twistSpan * m_limitSoftness)
{
m_solveTwistLimit = true;
m_twistLimitRatio = 1.f;
if (m_twistAngle < m_twistSpan && m_limitSoftness < 1.f - SIMD_EPSILON)
{
- m_twistLimitRatio = (m_twistAngle - m_twistSpan * m_limitSoftness)/
- (m_twistSpan - m_twistSpan * m_limitSoftness);
+ m_twistLimitRatio = (m_twistAngle - m_twistSpan * m_limitSoftness) /
+ (m_twistSpan - m_twistSpan * m_limitSoftness);
}
// twist correction tries to get back to soft limit
@@ -807,8 +786,8 @@ void btConeTwistConstraint::calcAngleInfo2(const btTransform& transA, const btTr
m_twistAxis = quatRotate(qB, -twistAxis);
m_kTwist = btScalar(1.) /
- (computeAngularImpulseDenominator(m_twistAxis,invInertiaWorldA) +
- computeAngularImpulseDenominator(m_twistAxis,invInertiaWorldB));
+ (computeAngularImpulseDenominator(m_twistAxis, invInertiaWorldA) +
+ computeAngularImpulseDenominator(m_twistAxis, invInertiaWorldB));
}
if (m_solveSwingLimit)
@@ -821,15 +800,13 @@ void btConeTwistConstraint::calcAngleInfo2(const btTransform& transA, const btTr
}
}
-
-
// given a cone rotation in constraint space, (pre: twist must already be removed)
// this method computes its corresponding swing angle and axis.
// more interestingly, it computes the cone/swing limit (angle) for this cone "pose".
void btConeTwistConstraint::computeConeLimitInfo(const btQuaternion& qCone,
- btScalar& swingAngle, // out
- btVector3& vSwingAxis, // out
- btScalar& swingLimit) // out
+ btScalar& swingAngle, // out
+ btVector3& vSwingAxis, // out
+ btScalar& swingLimit) // out
{
swingAngle = qCone.getAngle();
if (swingAngle > SIMD_EPSILON)
@@ -840,7 +817,7 @@ void btConeTwistConstraint::computeConeLimitInfo(const btQuaternion& qCone,
// non-zero twist?! this should never happen.
btAssert(fabs(vSwingAxis.x()) <= SIMD_EPSILON));
#endif
-
+
// Compute limit for given swing. tricky:
// Given a swing axis, we're looking for the intersection with the bounding cone ellipse.
// (Since we're dealing with angles, this ellipse is embedded on the surface of a sphere.)
@@ -848,7 +825,7 @@ void btConeTwistConstraint::computeConeLimitInfo(const btQuaternion& qCone,
// For starters, compute the direction from center to surface of ellipse.
// This is just the perpendicular (ie. rotate 2D vector by PI/2) of the swing axis.
// (vSwingAxis is the cone rotation (in z,y); change vars and rotate to (x,y) coords.)
- btScalar xEllipse = vSwingAxis.y();
+ btScalar xEllipse = vSwingAxis.y();
btScalar yEllipse = -vSwingAxis.z();
// Now, we use the slope of the vector (using x/yEllipse) and find the length
@@ -858,10 +835,10 @@ void btConeTwistConstraint::computeConeLimitInfo(const btQuaternion& qCone,
// a^2 b^2
// Do the math and it should be clear.
- swingLimit = m_swingSpan1; // if xEllipse == 0, we have a pure vSwingAxis.z rotation: just use swingspan1
+ swingLimit = m_swingSpan1; // if xEllipse == 0, we have a pure vSwingAxis.z rotation: just use swingspan1
if (fabs(xEllipse) > SIMD_EPSILON)
{
- btScalar surfaceSlope2 = (yEllipse*yEllipse)/(xEllipse*xEllipse);
+ btScalar surfaceSlope2 = (yEllipse * yEllipse) / (xEllipse * xEllipse);
btScalar norm = 1 / (m_swingSpan2 * m_swingSpan2);
norm += surfaceSlope2 / (m_swingSpan1 * m_swingSpan1);
btScalar swingLimit2 = (1 + surfaceSlope2) / norm;
@@ -887,7 +864,7 @@ void btConeTwistConstraint::computeConeLimitInfo(const btQuaternion& qCone,
#if 0
btAssert(0);
#endif
- }
+ }
}
btVector3 btConeTwistConstraint::GetPointForAngle(btScalar fAngleInRadians, btScalar fLength) const
@@ -903,10 +880,10 @@ btVector3 btConeTwistConstraint::GetPointForAngle(btScalar fAngleInRadians, btSc
// a^2 b^2
// Do the math and it should be clear.
- btScalar swingLimit = m_swingSpan1; // if xEllipse == 0, just use axis b (1)
+ btScalar swingLimit = m_swingSpan1; // if xEllipse == 0, just use axis b (1)
if (fabs(xEllipse) > SIMD_EPSILON)
{
- btScalar surfaceSlope2 = (yEllipse*yEllipse)/(xEllipse*xEllipse);
+ btScalar surfaceSlope2 = (yEllipse * yEllipse) / (xEllipse * xEllipse);
btScalar norm = 1 / (m_swingSpan2 * m_swingSpan2);
norm += surfaceSlope2 / (m_swingSpan1 * m_swingSpan1);
btScalar swingLimit2 = (1 + surfaceSlope2) / norm;
@@ -917,20 +894,20 @@ btVector3 btConeTwistConstraint::GetPointForAngle(btScalar fAngleInRadians, btSc
// note: twist is x-axis, swing 1 and 2 are along the z and y axes respectively
btVector3 vSwingAxis(0, xEllipse, -yEllipse);
btQuaternion qSwing(vSwingAxis, swingLimit);
- btVector3 vPointInConstraintSpace(fLength,0,0);
+ btVector3 vPointInConstraintSpace(fLength, 0, 0);
return quatRotate(qSwing, vPointInConstraintSpace);
}
// given a twist rotation in constraint space, (pre: cone must already be removed)
// this method computes its corresponding angle and axis.
void btConeTwistConstraint::computeTwistLimitInfo(const btQuaternion& qTwist,
- btScalar& twistAngle, // out
- btVector3& vTwistAxis) // out
+ btScalar& twistAngle, // out
+ btVector3& vTwistAxis) // out
{
btQuaternion qMinTwist = qTwist;
twistAngle = qTwist.getAngle();
- if (twistAngle > SIMD_PI) // long way around. flip quat and recalculate.
+ if (twistAngle > SIMD_PI) // long way around. flip quat and recalculate.
{
qMinTwist = -(qTwist);
twistAngle = qMinTwist.getAngle();
@@ -948,80 +925,79 @@ void btConeTwistConstraint::computeTwistLimitInfo(const btQuaternion& qTwist,
vTwistAxis.normalize();
}
-
void btConeTwistConstraint::adjustSwingAxisToUseEllipseNormal(btVector3& vSwingAxis) const
{
// the swing axis is computed as the "twist-free" cone rotation,
// but the cone limit is not circular, but elliptical (if swingspan1 != swingspan2).
- // so, if we're outside the limits, the closest way back inside the cone isn't
+ // so, if we're outside the limits, the closest way back inside the cone isn't
// along the vector back to the center. better (and more stable) to use the ellipse normal.
// convert swing axis to direction from center to surface of ellipse
// (ie. rotate 2D vector by PI/2)
btScalar y = -vSwingAxis.z();
- btScalar z = vSwingAxis.y();
+ btScalar z = vSwingAxis.y();
// do the math...
- if (fabs(z) > SIMD_EPSILON) // avoid division by 0. and we don't need an update if z == 0.
+ if (fabs(z) > SIMD_EPSILON) // avoid division by 0. and we don't need an update if z == 0.
{
// compute gradient/normal of ellipse surface at current "point"
- btScalar grad = y/z;
+ btScalar grad = y / z;
grad *= m_swingSpan2 / m_swingSpan1;
// adjust y/z to represent normal at point (instead of vector to point)
if (y > 0)
- y = fabs(grad * z);
+ y = fabs(grad * z);
else
y = -fabs(grad * z);
// convert ellipse direction back to swing axis
vSwingAxis.setZ(-y);
- vSwingAxis.setY( z);
+ vSwingAxis.setY(z);
vSwingAxis.normalize();
}
}
-
-
-void btConeTwistConstraint::setMotorTarget(const btQuaternion &q)
+void btConeTwistConstraint::setMotorTarget(const btQuaternion& q)
{
//btTransform trACur = m_rbA.getCenterOfMassTransform();
//btTransform trBCur = m_rbB.getCenterOfMassTransform();
-// btTransform trABCur = trBCur.inverse() * trACur;
-// btQuaternion qABCur = trABCur.getRotation();
-// btTransform trConstraintCur = (trBCur * m_rbBFrame).inverse() * (trACur * m_rbAFrame);
+ // btTransform trABCur = trBCur.inverse() * trACur;
+ // btQuaternion qABCur = trABCur.getRotation();
+ // btTransform trConstraintCur = (trBCur * m_rbBFrame).inverse() * (trACur * m_rbAFrame);
//btQuaternion qConstraintCur = trConstraintCur.getRotation();
btQuaternion qConstraint = m_rbBFrame.getRotation().inverse() * q * m_rbAFrame.getRotation();
setMotorTargetInConstraintSpace(qConstraint);
}
-
-void btConeTwistConstraint::setMotorTargetInConstraintSpace(const btQuaternion &q)
+void btConeTwistConstraint::setMotorTargetInConstraintSpace(const btQuaternion& q)
{
m_qTarget = q;
// clamp motor target to within limits
{
- btScalar softness = 1.f;//m_limitSoftness;
+ btScalar softness = 1.f; //m_limitSoftness;
// split into twist and cone
btVector3 vTwisted = quatRotate(m_qTarget, vTwist);
- btQuaternion qTargetCone = shortestArcQuat(vTwist, vTwisted); qTargetCone.normalize();
- btQuaternion qTargetTwist = qTargetCone.inverse() * m_qTarget; qTargetTwist.normalize();
+ btQuaternion qTargetCone = shortestArcQuat(vTwist, vTwisted);
+ qTargetCone.normalize();
+ btQuaternion qTargetTwist = qTargetCone.inverse() * m_qTarget;
+ qTargetTwist.normalize();
// clamp cone
if (m_swingSpan1 >= btScalar(0.05f) && m_swingSpan2 >= btScalar(0.05f))
{
- btScalar swingAngle, swingLimit; btVector3 swingAxis;
+ btScalar swingAngle, swingLimit;
+ btVector3 swingAxis;
computeConeLimitInfo(qTargetCone, swingAngle, swingAxis, swingLimit);
if (fabs(swingAngle) > SIMD_EPSILON)
{
- if (swingAngle > swingLimit*softness)
- swingAngle = swingLimit*softness;
- else if (swingAngle < -swingLimit*softness)
- swingAngle = -swingLimit*softness;
+ if (swingAngle > swingLimit * softness)
+ swingAngle = swingLimit * softness;
+ else if (swingAngle < -swingLimit * softness)
+ swingAngle = -swingLimit * softness;
qTargetCone = btQuaternion(swingAxis, swingAngle);
}
}
@@ -1029,16 +1005,17 @@ void btConeTwistConstraint::setMotorTargetInConstraintSpace(const btQuaternion &
// clamp twist
if (m_twistSpan >= btScalar(0.05f))
{
- btScalar twistAngle; btVector3 twistAxis;
+ btScalar twistAngle;
+ btVector3 twistAxis;
computeTwistLimitInfo(qTargetTwist, twistAngle, twistAxis);
if (fabs(twistAngle) > SIMD_EPSILON)
{
// eddy todo: limitSoftness used here???
- if (twistAngle > m_twistSpan*softness)
- twistAngle = m_twistSpan*softness;
- else if (twistAngle < -m_twistSpan*softness)
- twistAngle = -m_twistSpan*softness;
+ if (twistAngle > m_twistSpan * softness)
+ twistAngle = m_twistSpan * softness;
+ else if (twistAngle < -m_twistSpan * softness)
+ twistAngle = -m_twistSpan * softness;
qTargetTwist = btQuaternion(twistAxis, twistAngle);
}
}
@@ -1047,15 +1024,15 @@ void btConeTwistConstraint::setMotorTargetInConstraintSpace(const btQuaternion &
}
}
-///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5).
+///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.
void btConeTwistConstraint::setParam(int num, btScalar value, int axis)
{
- switch(num)
+ switch (num)
{
- case BT_CONSTRAINT_ERP :
- case BT_CONSTRAINT_STOP_ERP :
- if((axis >= 0) && (axis < 3))
+ case BT_CONSTRAINT_ERP:
+ case BT_CONSTRAINT_STOP_ERP:
+ if ((axis >= 0) && (axis < 3))
{
m_linERP = value;
m_flags |= BT_CONETWIST_FLAGS_LIN_ERP;
@@ -1065,9 +1042,9 @@ void btConeTwistConstraint::setParam(int num, btScalar value, int axis)
m_biasFactor = value;
}
break;
- case BT_CONSTRAINT_CFM :
- case BT_CONSTRAINT_STOP_CFM :
- if((axis >= 0) && (axis < 3))
+ case BT_CONSTRAINT_CFM:
+ case BT_CONSTRAINT_STOP_CFM:
+ if ((axis >= 0) && (axis < 3))
{
m_linCFM = value;
m_flags |= BT_CONETWIST_FLAGS_LIN_CFM;
@@ -1085,19 +1062,19 @@ void btConeTwistConstraint::setParam(int num, btScalar value, int axis)
}
///return the local value of parameter
-btScalar btConeTwistConstraint::getParam(int num, int axis) const
+btScalar btConeTwistConstraint::getParam(int num, int axis) const
{
btScalar retVal = 0;
- switch(num)
+ switch (num)
{
- case BT_CONSTRAINT_ERP :
- case BT_CONSTRAINT_STOP_ERP :
- if((axis >= 0) && (axis < 3))
+ case BT_CONSTRAINT_ERP:
+ case BT_CONSTRAINT_STOP_ERP:
+ if ((axis >= 0) && (axis < 3))
{
btAssertConstrParams(m_flags & BT_CONETWIST_FLAGS_LIN_ERP);
retVal = m_linERP;
}
- else if((axis >= 3) && (axis < 6))
+ else if ((axis >= 3) && (axis < 6))
{
retVal = m_biasFactor;
}
@@ -1106,14 +1083,14 @@ btScalar btConeTwistConstraint::getParam(int num, int axis) const
btAssertConstrParams(0);
}
break;
- case BT_CONSTRAINT_CFM :
- case BT_CONSTRAINT_STOP_CFM :
- if((axis >= 0) && (axis < 3))
+ case BT_CONSTRAINT_CFM:
+ case BT_CONSTRAINT_STOP_CFM:
+ if ((axis >= 0) && (axis < 3))
{
btAssertConstrParams(m_flags & BT_CONETWIST_FLAGS_LIN_CFM);
retVal = m_linCFM;
}
- else if((axis >= 3) && (axis < 6))
+ else if ((axis >= 3) && (axis < 6))
{
btAssertConstrParams(m_flags & BT_CONETWIST_FLAGS_ANG_CFM);
retVal = m_angCFM;
@@ -1123,21 +1100,16 @@ btScalar btConeTwistConstraint::getParam(int num, int axis) const
btAssertConstrParams(0);
}
break;
- default :
+ default:
btAssertConstrParams(0);
}
return retVal;
}
-
-void btConeTwistConstraint::setFrames(const btTransform & frameA, const btTransform & frameB)
+void btConeTwistConstraint::setFrames(const btTransform& frameA, const btTransform& frameB)
{
m_rbAFrame = frameA;
m_rbBFrame = frameB;
buildJacobian();
//calculateTransforms();
}
-
-
-
-
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h
index 7a33d01d1e..64f44df1cb 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h
@@ -15,8 +15,6 @@ subject to the following restrictions:
Written by: Marcus Hennix
*/
-
-
/*
Overview:
@@ -31,8 +29,6 @@ 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
@@ -41,13 +37,12 @@ and swing 1 and 2 are along the z and y axes respectively.
#include "btTypedConstraint.h"
#ifdef BT_USE_DOUBLE_PRECISION
-#define btConeTwistConstraintData2 btConeTwistConstraintDoubleData
-#define btConeTwistConstraintDataName "btConeTwistConstraintDoubleData"
+#define btConeTwistConstraintData2 btConeTwistConstraintDoubleData
+#define btConeTwistConstraintDataName "btConeTwistConstraintDoubleData"
#else
-#define btConeTwistConstraintData2 btConeTwistConstraintData
-#define btConeTwistConstraintDataName "btConeTwistConstraintData"
-#endif //BT_USE_DOUBLE_PRECISION
-
+#define btConeTwistConstraintData2 btConeTwistConstraintData
+#define btConeTwistConstraintDataName "btConeTwistConstraintData"
+#endif //BT_USE_DOUBLE_PRECISION
class btRigidBody;
@@ -59,103 +54,99 @@ enum btConeTwistFlags
};
///btConeTwistConstraint can be used to simulate ragdoll joints (upper arm, leg etc)
-ATTRIBUTE_ALIGNED16(class) btConeTwistConstraint : public btTypedConstraint
+ATTRIBUTE_ALIGNED16(class)
+btConeTwistConstraint : public btTypedConstraint
{
#ifdef IN_PARALLELL_SOLVER
public:
#endif
- btJacobianEntry m_jac[3]; //3 orthogonal linear constraints
+ btJacobianEntry m_jac[3]; //3 orthogonal linear constraints
- btTransform m_rbAFrame;
+ btTransform m_rbAFrame;
btTransform m_rbBFrame;
- btScalar m_limitSoftness;
- btScalar m_biasFactor;
- btScalar m_relaxationFactor;
+ btScalar m_limitSoftness;
+ btScalar m_biasFactor;
+ btScalar m_relaxationFactor;
- btScalar m_damping;
+ btScalar m_damping;
- btScalar m_swingSpan1;
- btScalar m_swingSpan2;
- btScalar m_twistSpan;
+ btScalar m_swingSpan1;
+ btScalar m_swingSpan2;
+ btScalar m_twistSpan;
- btScalar m_fixThresh;
+ btScalar m_fixThresh;
- btVector3 m_swingAxis;
- btVector3 m_twistAxis;
+ btVector3 m_swingAxis;
+ btVector3 m_twistAxis;
- btScalar m_kSwing;
- btScalar m_kTwist;
+ btScalar m_kSwing;
+ btScalar m_kTwist;
- btScalar m_twistLimitSign;
- btScalar m_swingCorrection;
- btScalar m_twistCorrection;
+ btScalar m_twistLimitSign;
+ btScalar m_swingCorrection;
+ btScalar m_twistCorrection;
- btScalar m_twistAngle;
+ btScalar m_twistAngle;
- btScalar m_accSwingLimitImpulse;
- btScalar m_accTwistLimitImpulse;
+ btScalar m_accSwingLimitImpulse;
+ btScalar m_accTwistLimitImpulse;
- bool m_angularOnly;
- bool m_solveTwistLimit;
- bool m_solveSwingLimit;
+ bool m_angularOnly;
+ bool m_solveTwistLimit;
+ bool m_solveSwingLimit;
- bool m_useSolveConstraintObsolete;
+ bool m_useSolveConstraintObsolete;
// not yet used...
- btScalar m_swingLimitRatio;
- btScalar m_twistLimitRatio;
- btVector3 m_twistAxisA;
+ btScalar m_swingLimitRatio;
+ btScalar m_twistLimitRatio;
+ btVector3 m_twistAxisA;
// motor
- bool m_bMotorEnabled;
- bool m_bNormalizedMotorStrength;
+ bool m_bMotorEnabled;
+ bool m_bNormalizedMotorStrength;
btQuaternion m_qTarget;
- btScalar m_maxMotorImpulse;
- btVector3 m_accMotorImpulse;
-
+ btScalar m_maxMotorImpulse;
+ btVector3 m_accMotorImpulse;
+
// parameters
- int m_flags;
- btScalar m_linCFM;
- btScalar m_linERP;
- btScalar m_angCFM;
-
-protected:
+ 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 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;
+ 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);
+ btConeTwistConstraint(btRigidBody & rbA, btRigidBody & rbB, const btTransform& rbAFrame, const btTransform& rbBFrame);
+
+ btConeTwistConstraint(btRigidBody & rbA, const btTransform& rbAFrame);
+
+ virtual void buildJacobian();
- virtual void buildJacobian();
+ virtual void getInfo1(btConstraintInfo1 * info);
- virtual void getInfo1 (btConstraintInfo1* info);
+ void getInfo1NonVirtual(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 getInfo2(btConstraintInfo2 * info);
- virtual void solveConstraintObsolete(btSolverBody& bodyA,btSolverBody& bodyB,btScalar timeStep);
+ void getInfo2NonVirtual(btConstraintInfo2 * info, const btTransform& transA, const btTransform& transB, const btMatrix3x3& invInertiaWorldA, const btMatrix3x3& invInertiaWorldB);
-
- void updateRHS(btScalar timeStep);
+ virtual void solveConstraintObsolete(btSolverBody & bodyA, btSolverBody & bodyB, btScalar timeStep);
+ void updateRHS(btScalar timeStep);
const btRigidBody& getRigidBodyA() const
{
@@ -166,64 +157,64 @@ public:
return m_rbB;
}
- void setAngularOnly(bool angularOnly)
+ void setAngularOnly(bool angularOnly)
{
m_angularOnly = angularOnly;
}
-
- bool getAngularOnly() const
+
+ bool getAngularOnly() const
{
- return m_angularOnly;
+ return m_angularOnly;
}
- void setLimit(int limitIndex,btScalar limitValue)
+ void setLimit(int limitIndex, btScalar limitValue)
{
switch (limitIndex)
{
- case 3:
+ case 3:
{
m_twistSpan = limitValue;
break;
}
- case 4:
+ case 4:
{
m_swingSpan2 = limitValue;
break;
}
- case 5:
+ case 5:
{
m_swingSpan1 = limitValue;
break;
}
- default:
+ default:
{
}
};
}
- btScalar getLimit(int limitIndex) const
+ btScalar getLimit(int limitIndex) const
{
switch (limitIndex)
{
- case 3:
+ case 3:
{
return m_twistSpan;
break;
}
- case 4:
+ case 4:
{
return m_swingSpan2;
break;
}
- case 5:
+ case 5:
{
return m_swingSpan1;
break;
}
- default:
+ default:
{
- btAssert(0 && "Invalid limitIndex specified for btConeTwistConstraint");
- return 0.0;
+ btAssert(0 && "Invalid limitIndex specified for btConeTwistConstraint");
+ return 0.0;
}
};
}
@@ -239,18 +230,18 @@ public:
// __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)
+ 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_twistSpan = _twistSpan;
- m_limitSoftness = _softness;
+ m_limitSoftness = _softness;
m_biasFactor = _biasFactor;
m_relaxationFactor = _relaxationFactor;
}
- const btTransform& getAFrame() const { return m_rbAFrame; };
+ const btTransform& getAFrame() const { return m_rbAFrame; };
const btTransform& getBFrame() const { return m_rbBFrame; };
inline int getSolveTwistLimit()
@@ -269,7 +260,7 @@ public:
}
void calcAngleInfo();
- void calcAngleInfo2(const btTransform& transA, const btTransform& transB,const btMatrix3x3& invInertiaWorldA,const btMatrix3x3& invInertiaWorldB);
+ void calcAngleInfo2(const btTransform& transA, const btTransform& transB, const btMatrix3x3& invInertiaWorldA, const btMatrix3x3& invInertiaWorldB);
inline btScalar getSwingSpan1() const
{
@@ -308,8 +299,16 @@ public:
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; }
+ 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; }
@@ -318,17 +317,17 @@ public:
// 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);
+ 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);
+ 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).
+ ///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 setParam(int num, btScalar value, int axis = -1);
virtual void setFrames(const btTransform& frameA, const btTransform& frameB);
@@ -342,84 +341,74 @@ public:
return m_rbBFrame;
}
-
///return the local value of parameter
- virtual btScalar getParam(int num, int axis = -1) const;
+ virtual btScalar getParam(int num, int axis = -1) const;
int getFlags() const
{
return m_flags;
}
- virtual int calculateSerializeBufferSize() 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;
-
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
};
-
-
-struct btConeTwistConstraintDoubleData
+struct btConeTwistConstraintDoubleData
{
- btTypedConstraintDoubleData m_typeConstraintData;
+ 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;
-
-
-
+ 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
+struct btConeTwistConstraintData
{
- btTypedConstraintData m_typeConstraintData;
+ 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];
+ 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
+#endif //BT_BACKWARDS_COMPATIBLE_SERIALIZATION
//
-SIMD_FORCE_INLINE int btConeTwistConstraint::calculateSerializeBufferSize() const
+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
+///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);
+ 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;
@@ -431,5 +420,4 @@ SIMD_FORCE_INLINE const char* btConeTwistConstraint::serialize(void* dataBuffer,
return btConeTwistConstraintDataName;
}
-
-#endif //BT_CONETWISTCONSTRAINT_H
+#endif //BT_CONETWISTCONSTRAINT_H
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btConstraintSolver.h b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btConstraintSolver.h
index 0491639f70..808433477c 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btConstraintSolver.h
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btConstraintSolver.h
@@ -26,41 +26,33 @@ struct btContactSolverInfo;
struct btBroadphaseProxy;
class btIDebugDraw;
class btStackAlloc;
-class btDispatcher;
+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_SEQUENTIAL_IMPULSE_SOLVER = 1,
+ BT_MLCP_SOLVER = 2,
+ BT_NNCG_SOLVER = 4,
+ BT_MULTIBODY_SOLVER = 8,
};
class btConstraintSolver
{
-
public:
-
virtual ~btConstraintSolver() {}
-
- virtual void prepareSolve (int /* numBodies */, int /* numManifolds */) {;}
+
+ 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 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 */) {;}
+ 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;
-
+ virtual void reset() = 0;
+ virtual btConstraintSolverType getSolverType() const = 0;
};
-
-
-
-#endif //BT_CONSTRAINT_SOLVER_H
+#endif //BT_CONSTRAINT_SOLVER_H
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btContactConstraint.cpp b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btContactConstraint.cpp
index 1098d0c96b..4b22b2fff5 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btContactConstraint.cpp
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btContactConstraint.cpp
@@ -13,7 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btContactConstraint.h"
#include "BulletDynamics/Dynamics/btRigidBody.h"
#include "LinearMath/btVector3.h"
@@ -22,44 +21,33 @@ subject to the following restrictions:
#include "LinearMath/btMinMax.h"
#include "BulletCollision/NarrowPhaseCollision/btManifoldPoint.h"
-
-
-btContactConstraint::btContactConstraint(btPersistentManifold* contactManifold,btRigidBody& rbA,btRigidBody& rbB)
-:btTypedConstraint(CONTACT_CONSTRAINT_TYPE,rbA,rbB),
- m_contactManifold(*contactManifold)
+btContactConstraint::btContactConstraint(btPersistentManifold* contactManifold, btRigidBody& rbA, btRigidBody& rbB)
+ : btTypedConstraint(CONTACT_CONSTRAINT_TYPE, rbA, rbB),
+ m_contactManifold(*contactManifold)
{
-
}
btContactConstraint::~btContactConstraint()
{
-
}
-void btContactConstraint::setContactManifold(btPersistentManifold* contactManifold)
+void btContactConstraint::setContactManifold(btPersistentManifold* contactManifold)
{
m_contactManifold = *contactManifold;
}
-void btContactConstraint::getInfo1 (btConstraintInfo1* info)
+void btContactConstraint::getInfo1(btConstraintInfo1* info)
{
-
}
-void btContactConstraint::getInfo2 (btConstraintInfo2* info)
+void btContactConstraint::getInfo2(btConstraintInfo2* info)
{
-
}
-void btContactConstraint::buildJacobian()
+void btContactConstraint::buildJacobian()
{
-
}
-
-
-
-
#include "btContactConstraint.h"
#include "BulletDynamics/Dynamics/btRigidBody.h"
#include "LinearMath/btVector3.h"
@@ -68,64 +56,59 @@ void btContactConstraint::buildJacobian()
#include "LinearMath/btMinMax.h"
#include "BulletCollision/NarrowPhaseCollision/btManifoldPoint.h"
-
-
//response between two dynamic objects without friction and no restitution, assuming 0 penetration depth
btScalar resolveSingleCollision(
- btRigidBody* body1,
- btCollisionObject* colObj2,
- const btVector3& contactPositionWorld,
- const btVector3& contactNormalOnB,
- const btContactSolverInfo& solverInfo,
- btScalar distance)
+ btRigidBody* body1,
+ btCollisionObject* colObj2,
+ const btVector3& contactPositionWorld,
+ const btVector3& contactNormalOnB,
+ const btContactSolverInfo& solverInfo,
+ btScalar distance)
{
btRigidBody* body2 = btRigidBody::upcast(colObj2);
-
-
- const btVector3& normal = contactNormalOnB;
-
- btVector3 rel_pos1 = contactPositionWorld - body1->getWorldTransform().getOrigin();
- btVector3 rel_pos2 = contactPositionWorld - colObj2->getWorldTransform().getOrigin();
-
- btVector3 vel1 = body1->getVelocityInLocalPoint(rel_pos1);
- btVector3 vel2 = body2? body2->getVelocityInLocalPoint(rel_pos2) : btVector3(0,0,0);
- btVector3 vel = vel1 - vel2;
- btScalar rel_vel;
- rel_vel = normal.dot(vel);
-
- btScalar combinedRestitution = 0.f;
- btScalar restitution = combinedRestitution* -rel_vel;
-
- btScalar positionalError = solverInfo.m_erp *-distance /solverInfo.m_timeStep ;
- btScalar velocityError = -(1.0f + restitution) * rel_vel;// * damping;
- btScalar denom0 = body1->computeImpulseDenominator(contactPositionWorld,normal);
- btScalar denom1 = body2? body2->computeImpulseDenominator(contactPositionWorld,normal) : 0.f;
+
+ const btVector3& normal = contactNormalOnB;
+
+ btVector3 rel_pos1 = contactPositionWorld - body1->getWorldTransform().getOrigin();
+ btVector3 rel_pos2 = contactPositionWorld - colObj2->getWorldTransform().getOrigin();
+
+ btVector3 vel1 = body1->getVelocityInLocalPoint(rel_pos1);
+ btVector3 vel2 = body2 ? body2->getVelocityInLocalPoint(rel_pos2) : btVector3(0, 0, 0);
+ btVector3 vel = vel1 - vel2;
+ btScalar rel_vel;
+ rel_vel = normal.dot(vel);
+
+ btScalar combinedRestitution = 0.f;
+ btScalar restitution = combinedRestitution * -rel_vel;
+
+ btScalar positionalError = solverInfo.m_erp * -distance / solverInfo.m_timeStep;
+ btScalar velocityError = -(1.0f + restitution) * rel_vel; // * damping;
+ btScalar denom0 = body1->computeImpulseDenominator(contactPositionWorld, normal);
+ btScalar denom1 = body2 ? body2->computeImpulseDenominator(contactPositionWorld, normal) : 0.f;
btScalar relaxation = 1.f;
- btScalar jacDiagABInv = relaxation/(denom0+denom1);
+ btScalar jacDiagABInv = relaxation / (denom0 + denom1);
- btScalar penetrationImpulse = positionalError * jacDiagABInv;
- btScalar velocityImpulse = velocityError * jacDiagABInv;
+ btScalar penetrationImpulse = positionalError * jacDiagABInv;
+ btScalar velocityImpulse = velocityError * jacDiagABInv;
- btScalar normalImpulse = penetrationImpulse+velocityImpulse;
- normalImpulse = 0.f > normalImpulse ? 0.f: normalImpulse;
+ btScalar normalImpulse = penetrationImpulse + velocityImpulse;
+ normalImpulse = 0.f > normalImpulse ? 0.f : normalImpulse;
- body1->applyImpulse(normal*(normalImpulse), rel_pos1);
- if (body2)
- body2->applyImpulse(-normal*(normalImpulse), rel_pos2);
-
- return normalImpulse;
-}
+ body1->applyImpulse(normal * (normalImpulse), rel_pos1);
+ if (body2)
+ body2->applyImpulse(-normal * (normalImpulse), rel_pos2);
+ return normalImpulse;
+}
//bilateral constraint 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)
+ btRigidBody& body2, const btVector3& pos2,
+ btScalar distance, const btVector3& normal, btScalar& impulse, btScalar timeStep)
{
(void)timeStep;
(void)distance;
-
btScalar normalLenSqr = normal.length2();
btAssert(btFabs(normalLenSqr) < btScalar(1.1));
if (normalLenSqr > btScalar(1.1))
@@ -133,45 +116,38 @@ void resolveSingleBilateral(btRigidBody& body1, const btVector3& pos1,
impulse = btScalar(0.);
return;
}
- btVector3 rel_pos1 = pos1 - body1.getCenterOfMassPosition();
+ btVector3 rel_pos1 = pos1 - body1.getCenterOfMassPosition();
btVector3 rel_pos2 = pos2 - body2.getCenterOfMassPosition();
//this jacobian entry could be re-used for all iterations
-
+
btVector3 vel1 = body1.getVelocityInLocalPoint(rel_pos1);
btVector3 vel2 = body2.getVelocityInLocalPoint(rel_pos2);
btVector3 vel = vel1 - vel2;
-
- btJacobianEntry jac(body1.getCenterOfMassTransform().getBasis().transpose(),
- body2.getCenterOfMassTransform().getBasis().transpose(),
- rel_pos1,rel_pos2,normal,body1.getInvInertiaDiagLocal(),body1.getInvMass(),
- body2.getInvInertiaDiagLocal(),body2.getInvMass());
+ btJacobianEntry jac(body1.getCenterOfMassTransform().getBasis().transpose(),
+ body2.getCenterOfMassTransform().getBasis().transpose(),
+ rel_pos1, rel_pos2, normal, body1.getInvInertiaDiagLocal(), body1.getInvMass(),
+ body2.getInvInertiaDiagLocal(), body2.getInvMass());
btScalar jacDiagAB = jac.getDiagonal();
btScalar jacDiagABInv = btScalar(1.) / jacDiagAB;
-
- btScalar rel_vel = jac.getRelativeVelocity(
+
+ btScalar rel_vel = jac.getRelativeVelocity(
body1.getLinearVelocity(),
body1.getCenterOfMassTransform().getBasis().transpose() * body1.getAngularVelocity(),
body2.getLinearVelocity(),
- body2.getCenterOfMassTransform().getBasis().transpose() * body2.getAngularVelocity());
-
-
+ body2.getCenterOfMassTransform().getBasis().transpose() * body2.getAngularVelocity());
rel_vel = normal.dot(vel);
-
+
//todo: move this into proper structure
btScalar contactDamping = btScalar(0.2);
#ifdef ONLY_USE_LINEAR_MASS
btScalar massTerm = btScalar(1.) / (body1.getInvMass() + body2.getInvMass());
- impulse = - contactDamping * rel_vel * massTerm;
-#else
+ impulse = -contactDamping * rel_vel * massTerm;
+#else
btScalar velocityImpulse = -contactDamping * rel_vel * jacDiagABInv;
impulse = velocityImpulse;
#endif
}
-
-
-
-
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btContactConstraint.h b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btContactConstraint.h
index adb2268353..255489be99 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btContactConstraint.h
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btContactConstraint.h
@@ -22,20 +22,17 @@ subject to the following restrictions:
#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
+ATTRIBUTE_ALIGNED16(class)
+btContactConstraint : public btTypedConstraint
{
protected:
-
btPersistentManifold m_contactManifold;
protected:
-
-
- btContactConstraint(btPersistentManifold* contactManifold,btRigidBody& rbA,btRigidBody& rbB);
+ btContactConstraint(btPersistentManifold * contactManifold, btRigidBody & rbA, btRigidBody & rbB);
public:
-
- void setContactManifold(btPersistentManifold* contactManifold);
+ void setContactManifold(btPersistentManifold * contactManifold);
btPersistentManifold* getContactManifold()
{
@@ -49,25 +46,20 @@ public:
virtual ~btContactConstraint();
- virtual void getInfo1 (btConstraintInfo1* info);
+ virtual void getInfo1(btConstraintInfo1 * info);
- virtual void getInfo2 (btConstraintInfo2* info);
+ virtual void getInfo2(btConstraintInfo2 * info);
///obsolete methods
- virtual void buildJacobian();
-
-
+ 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);
-
+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);
-
-
+ btRigidBody& body2, const btVector3& pos2,
+ btScalar distance, const btVector3& normal, btScalar& impulse, btScalar timeStep);
-#endif //BT_CONTACT_CONSTRAINT_H
+#endif //BT_CONTACT_CONSTRAINT_H
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btContactSolverInfo.h b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btContactSolverInfo.h
index 93865cbc59..89f8db8b1a 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btContactSolverInfo.h
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btContactSolverInfo.h
@@ -18,7 +18,7 @@ subject to the following restrictions:
#include "LinearMath/btScalar.h"
-enum btSolverMode
+enum btSolverMode
{
SOLVER_RANDMIZE_ORDER = 1,
SOLVER_FRICTION_SEPARATE = 2,
@@ -35,134 +35,129 @@ enum btSolverMode
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_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;
-
- int m_solverMode;
- int m_restingContactRestitutionThreshold;
- int m_minimumSolverBatchSize;
- btScalar m_maxGyroscopicForce;
- btScalar m_singleAxisRollingFrictionThreshold;
- btScalar m_leastSquaresResidualThreshold;
- btScalar m_restitutionVelocityThreshold;
-
+ 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_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;
+
+ 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;
};
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_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_globalCfm = btScalar(0.);
- m_frictionERP = btScalar(0.2);//positional friction 'anchors' are disabled by default
+ 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_warmstartingFactor = 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_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_restitutionVelocityThreshold = 0.2f; //if the relative velocity is below this threshold, there is zero restitution
+ m_jointFeedbackInWorldSpace = false;
+ m_jointFeedbackInJointFrame = false;
}
};
///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_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];
-
+ 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; ///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_maxGyroscopicForce;
- float m_singleAxisRollingFrictionThreshold;
-
- int m_numIterations;
- int m_solverMode;
- int m_restingContactRestitutionThreshold;
- int m_minimumSolverBatchSize;
-
- int m_splitImpulse;
- char m_padding[4];
+ 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 //BT_CONTACT_SOLVER_INFO
+#endif //BT_CONTACT_SOLVER_INFO
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btFixedConstraint.cpp b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btFixedConstraint.cpp
index 75d81cc08c..bba102d905 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btFixedConstraint.cpp
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btFixedConstraint.cpp
@@ -13,25 +13,20 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btFixedConstraint.h"
#include "BulletDynamics/Dynamics/btRigidBody.h"
#include "LinearMath/btTransformUtil.h"
#include <new>
-
-btFixedConstraint::btFixedConstraint(btRigidBody& rbA,btRigidBody& rbB, const btTransform& frameInA,const btTransform& frameInB)
-:btGeneric6DofSpring2Constraint(rbA,rbB,frameInA,frameInB)
+btFixedConstraint::btFixedConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB)
+ : btGeneric6DofSpring2Constraint(rbA, rbB, frameInA, frameInB)
{
- setAngularLowerLimit(btVector3(0,0,0));
- setAngularUpperLimit(btVector3(0,0,0));
- setLinearLowerLimit(btVector3(0,0,0));
- setLinearUpperLimit(btVector3(0,0,0));
+ setAngularLowerLimit(btVector3(0, 0, 0));
+ setAngularUpperLimit(btVector3(0, 0, 0));
+ setLinearLowerLimit(btVector3(0, 0, 0));
+ setLinearUpperLimit(btVector3(0, 0, 0));
}
-
-
-
-btFixedConstraint::~btFixedConstraint ()
+btFixedConstraint::~btFixedConstraint()
{
}
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btFixedConstraint.h b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btFixedConstraint.h
index bff2008b28..6d474ea81d 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btFixedConstraint.h
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btFixedConstraint.h
@@ -18,16 +18,13 @@ subject to the following restrictions:
#include "btGeneric6DofSpring2Constraint.h"
-
-ATTRIBUTE_ALIGNED16(class) btFixedConstraint : public btGeneric6DofSpring2Constraint
+ATTRIBUTE_ALIGNED16(class)
+btFixedConstraint : public btGeneric6DofSpring2Constraint
{
-
public:
- btFixedConstraint(btRigidBody& rbA,btRigidBody& rbB, const btTransform& frameInA,const btTransform& frameInB);
+ btFixedConstraint(btRigidBody & rbA, btRigidBody & rbB, const btTransform& frameInA, const btTransform& frameInB);
-
virtual ~btFixedConstraint();
-
};
-#endif //BT_FIXED_CONSTRAINT_H
+#endif //BT_FIXED_CONSTRAINT_H
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGearConstraint.cpp b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGearConstraint.cpp
index bcd457b673..7535c52c05 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGearConstraint.cpp
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGearConstraint.cpp
@@ -17,38 +17,36 @@ subject to the following restrictions:
#include "btGearConstraint.h"
-btGearConstraint::btGearConstraint(btRigidBody& rbA, btRigidBody& rbB, const btVector3& axisInA,const btVector3& axisInB, btScalar ratio)
-:btTypedConstraint(GEAR_CONSTRAINT_TYPE,rbA,rbB),
-m_axisInA(axisInA),
-m_axisInB(axisInB),
-m_ratio(ratio)
+btGearConstraint::btGearConstraint(btRigidBody& rbA, btRigidBody& rbB, const btVector3& axisInA, const btVector3& axisInB, btScalar ratio)
+ : btTypedConstraint(GEAR_CONSTRAINT_TYPE, rbA, rbB),
+ m_axisInA(axisInA),
+ m_axisInB(axisInB),
+ m_ratio(ratio)
{
}
-btGearConstraint::~btGearConstraint ()
+btGearConstraint::~btGearConstraint()
{
}
-void btGearConstraint::getInfo1 (btConstraintInfo1* info)
+void btGearConstraint::getInfo1(btConstraintInfo1* info)
{
info->m_numConstraintRows = 1;
info->nub = 1;
}
-void btGearConstraint::getInfo2 (btConstraintInfo2* info)
+void btGearConstraint::getInfo2(btConstraintInfo2* info)
{
btVector3 globalAxisA, globalAxisB;
- globalAxisA = m_rbA.getWorldTransform().getBasis()*this->m_axisInA;
- globalAxisB = m_rbB.getWorldTransform().getBasis()*this->m_axisInB;
+ globalAxisA = m_rbA.getWorldTransform().getBasis() * this->m_axisInA;
+ globalAxisB = m_rbB.getWorldTransform().getBasis() * this->m_axisInB;
info->m_J1angularAxis[0] = globalAxisA[0];
info->m_J1angularAxis[1] = globalAxisA[1];
info->m_J1angularAxis[2] = globalAxisA[2];
- info->m_J2angularAxis[0] = m_ratio*globalAxisB[0];
- info->m_J2angularAxis[1] = m_ratio*globalAxisB[1];
- info->m_J2angularAxis[2] = m_ratio*globalAxisB[2];
-
+ info->m_J2angularAxis[0] = m_ratio * globalAxisB[0];
+ info->m_J2angularAxis[1] = m_ratio * globalAxisB[1];
+ info->m_J2angularAxis[2] = m_ratio * globalAxisB[2];
}
-
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGearConstraint.h b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGearConstraint.h
index e4613455a2..64b15dfbce 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGearConstraint.h
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGearConstraint.h
@@ -13,45 +13,40 @@ subject to the following restrictions:
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"
+#define btGearConstraintData btGearConstraintDoubleData
+#define btGearConstraintDataName "btGearConstraintDoubleData"
#else
-#define btGearConstraintData btGearConstraintFloatData
-#define btGearConstraintDataName "btGearConstraintFloatData"
-#endif //BT_USE_DOUBLE_PRECISION
-
-
+#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;
+ 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 ();
+ 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);
+ virtual void getInfo1(btConstraintInfo1* info);
///internal method used by the constraint solver, don't use them directly
- virtual void getInfo2 (btConstraintInfo2* info);
+ virtual void getInfo2(btConstraintInfo2* info);
- void setAxisA(btVector3& axisA)
+ void setAxisA(btVector3& axisA)
{
m_axisInA = axisA;
}
@@ -76,68 +71,64 @@ public:
return m_ratio;
}
-
- virtual void setParam(int num, btScalar value, int axis = -1)
+ virtual void setParam(int num, btScalar value, int axis = -1)
{
- (void) num;
- (void) value;
- (void) axis;
+ (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;
+ virtual btScalar getParam(int num, int axis = -1) const
+ {
+ (void)num;
+ (void)axis;
btAssert(0);
return 0.f;
}
- virtual int calculateSerializeBufferSize() 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;
+ 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;
+ btTypedConstraintFloatData m_typeConstraintData;
- btVector3FloatData m_axisInA;
- btVector3FloatData m_axisInB;
+ btVector3FloatData m_axisInA;
+ btVector3FloatData m_axisInB;
- float m_ratio;
- char m_padding[4];
+ float m_ratio;
+ char m_padding[4];
};
struct btGearConstraintDoubleData
{
- btTypedConstraintDoubleData m_typeConstraintData;
+ btTypedConstraintDoubleData m_typeConstraintData;
- btVector3DoubleData m_axisInA;
- btVector3DoubleData m_axisInB;
+ btVector3DoubleData m_axisInA;
+ btVector3DoubleData m_axisInB;
- double m_ratio;
+ double m_ratio;
};
-SIMD_FORCE_INLINE int btGearConstraint::calculateSerializeBufferSize() const
+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
+///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);
+ btTypedConstraint::serialize(&gear->m_typeConstraintData, serializer);
- m_axisInA.serialize( gear->m_axisInA );
- m_axisInB.serialize( gear->m_axisInB );
+ m_axisInA.serialize(gear->m_axisInA);
+ m_axisInB.serialize(gear->m_axisInB);
gear->m_ratio = m_ratio;
@@ -152,9 +143,4 @@ SIMD_FORCE_INLINE const char* btGearConstraint::serialize(void* dataBuffer, btSe
return btGearConstraintDataName;
}
-
-
-
-
-
-#endif //BT_GEAR_CONSTRAINT_H
+#endif //BT_GEAR_CONSTRAINT_H
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp
index c38b8353f0..1f54203532 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp
@@ -25,83 +25,61 @@ http://gimpact.sf.net
#include "LinearMath/btTransformUtil.h"
#include <new>
-
-
#define D6_USE_OBSOLETE_METHOD false
#define D6_USE_FRAME_OFFSET true
-
-
-
-
-
btGeneric6DofConstraint::btGeneric6DofConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB, bool useLinearReferenceFrameA)
-: btTypedConstraint(D6_CONSTRAINT_TYPE, rbA, rbB)
-, m_frameInA(frameInA)
-, m_frameInB(frameInB),
-m_useLinearReferenceFrameA(useLinearReferenceFrameA),
-m_useOffsetForConstraintFrame(D6_USE_FRAME_OFFSET),
-m_flags(0),
-m_useSolveConstraintObsolete(D6_USE_OBSOLETE_METHOD)
+ : btTypedConstraint(D6_CONSTRAINT_TYPE, rbA, rbB), m_frameInA(frameInA), m_frameInB(frameInB), m_useLinearReferenceFrameA(useLinearReferenceFrameA), m_useOffsetForConstraintFrame(D6_USE_FRAME_OFFSET), m_flags(0), m_useSolveConstraintObsolete(D6_USE_OBSOLETE_METHOD)
{
calculateTransforms();
}
-
-
btGeneric6DofConstraint::btGeneric6DofConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameB)
- : btTypedConstraint(D6_CONSTRAINT_TYPE, getFixedBody(), rbB),
- m_frameInB(frameInB),
- m_useLinearReferenceFrameA(useLinearReferenceFrameB),
- m_useOffsetForConstraintFrame(D6_USE_FRAME_OFFSET),
- m_flags(0),
- m_useSolveConstraintObsolete(false)
+ : btTypedConstraint(D6_CONSTRAINT_TYPE, getFixedBody(), rbB),
+ m_frameInB(frameInB),
+ m_useLinearReferenceFrameA(useLinearReferenceFrameB),
+ m_useOffsetForConstraintFrame(D6_USE_FRAME_OFFSET),
+ m_flags(0),
+ m_useSolveConstraintObsolete(false)
{
///not providing rigidbody A means implicitly using worldspace for body A
m_frameInA = rbB.getCenterOfMassTransform() * m_frameInB;
calculateTransforms();
}
-
-
-
#define GENERIC_D6_DISABLE_WARMSTARTING 1
-
-
btScalar btGetMatrixElem(const btMatrix3x3& mat, int index);
btScalar btGetMatrixElem(const btMatrix3x3& mat, int index)
{
- int i = index%3;
- int j = index/3;
+ int i = index % 3;
+ int j = index / 3;
return mat[i][j];
}
-
-
///MatrixToEulerXYZ from http://www.geometrictools.com/LibFoundation/Mathematics/Wm4Matrix3.inl.html
-bool matrixToEulerXYZ(const btMatrix3x3& mat,btVector3& xyz);
-bool matrixToEulerXYZ(const btMatrix3x3& mat,btVector3& xyz)
+bool matrixToEulerXYZ(const btMatrix3x3& mat, btVector3& xyz);
+bool matrixToEulerXYZ(const btMatrix3x3& mat, btVector3& xyz)
{
// // rot = cy*cz -cy*sz sy
// // cz*sx*sy+cx*sz cx*cz-sx*sy*sz -cy*sx
// // -cx*cz*sy+sx*sz cz*sx+cx*sy*sz cx*cy
//
- btScalar fi = btGetMatrixElem(mat,2);
+ btScalar fi = btGetMatrixElem(mat, 2);
if (fi < btScalar(1.0f))
{
if (fi > btScalar(-1.0f))
{
- xyz[0] = btAtan2(-btGetMatrixElem(mat,5),btGetMatrixElem(mat,8));
- xyz[1] = btAsin(btGetMatrixElem(mat,2));
- xyz[2] = btAtan2(-btGetMatrixElem(mat,1),btGetMatrixElem(mat,0));
+ xyz[0] = btAtan2(-btGetMatrixElem(mat, 5), btGetMatrixElem(mat, 8));
+ xyz[1] = btAsin(btGetMatrixElem(mat, 2));
+ xyz[2] = btAtan2(-btGetMatrixElem(mat, 1), btGetMatrixElem(mat, 0));
return true;
}
else
{
// WARNING. Not unique. XA - ZA = -atan2(r10,r11)
- xyz[0] = -btAtan2(btGetMatrixElem(mat,3),btGetMatrixElem(mat,4));
+ xyz[0] = -btAtan2(btGetMatrixElem(mat, 3), btGetMatrixElem(mat, 4));
xyz[1] = -SIMD_HALF_PI;
xyz[2] = btScalar(0.0);
return false;
@@ -110,7 +88,7 @@ bool matrixToEulerXYZ(const btMatrix3x3& mat,btVector3& xyz)
else
{
// WARNING. Not unique. XAngle + ZAngle = atan2(r10,r11)
- xyz[0] = btAtan2(btGetMatrixElem(mat,3),btGetMatrixElem(mat,4));
+ xyz[0] = btAtan2(btGetMatrixElem(mat, 3), btGetMatrixElem(mat, 4));
xyz[1] = SIMD_HALF_PI;
xyz[2] = 0.0;
}
@@ -121,52 +99,49 @@ bool matrixToEulerXYZ(const btMatrix3x3& mat,btVector3& xyz)
int btRotationalLimitMotor::testLimitValue(btScalar test_value)
{
- if(m_loLimit>m_hiLimit)
+ if (m_loLimit > m_hiLimit)
{
- m_currentLimit = 0;//Free from violation
+ m_currentLimit = 0; //Free from violation
return 0;
}
if (test_value < m_loLimit)
{
- m_currentLimit = 1;//low limit violation
- m_currentLimitError = test_value - m_loLimit;
- if(m_currentLimitError>SIMD_PI)
- m_currentLimitError-=SIMD_2_PI;
- else if(m_currentLimitError<-SIMD_PI)
- m_currentLimitError+=SIMD_2_PI;
+ m_currentLimit = 1; //low limit violation
+ m_currentLimitError = test_value - m_loLimit;
+ if (m_currentLimitError > SIMD_PI)
+ m_currentLimitError -= SIMD_2_PI;
+ else if (m_currentLimitError < -SIMD_PI)
+ m_currentLimitError += SIMD_2_PI;
return 1;
}
- else if (test_value> m_hiLimit)
+ else if (test_value > m_hiLimit)
{
- m_currentLimit = 2;//High limit violation
+ m_currentLimit = 2; //High limit violation
m_currentLimitError = test_value - m_hiLimit;
- if(m_currentLimitError>SIMD_PI)
- m_currentLimitError-=SIMD_2_PI;
- else if(m_currentLimitError<-SIMD_PI)
- m_currentLimitError+=SIMD_2_PI;
+ if (m_currentLimitError > SIMD_PI)
+ m_currentLimitError -= SIMD_2_PI;
+ else if (m_currentLimitError < -SIMD_PI)
+ m_currentLimitError += SIMD_2_PI;
return 2;
};
- m_currentLimit = 0;//Free from violation
+ m_currentLimit = 0; //Free from violation
return 0;
-
}
-
-
btScalar btRotationalLimitMotor::solveAngularLimits(
- btScalar timeStep,btVector3& axis,btScalar jacDiagABInv,
- btRigidBody * body0, btRigidBody * body1 )
+ btScalar timeStep, btVector3& axis, btScalar jacDiagABInv,
+ btRigidBody* body0, btRigidBody* body1)
{
- if (needApplyTorques()==false) return 0.0f;
+ if (needApplyTorques() == false) return 0.0f;
btScalar target_velocity = m_targetVelocity;
btScalar maxMotorForce = m_maxMotorForce;
//current error correction
- if (m_currentLimit!=0)
+ if (m_currentLimit != 0)
{
- target_velocity = -m_stopERP*m_currentLimitError/(timeStep);
+ target_velocity = -m_stopERP * m_currentLimitError / (timeStep);
maxMotorForce = m_maxLimitForce;
}
@@ -178,42 +153,37 @@ btScalar btRotationalLimitMotor::solveAngularLimits(
btVector3 angVelB = body1->getAngularVelocity();
btVector3 vel_diff;
- vel_diff = angVelA-angVelB;
-
-
+ vel_diff = angVelA - angVelB;
btScalar rel_vel = axis.dot(vel_diff);
// correction velocity
- btScalar motor_relvel = m_limitSoftness*(target_velocity - m_damping*rel_vel);
+ btScalar motor_relvel = m_limitSoftness * (target_velocity - m_damping * rel_vel);
-
- if ( motor_relvel < SIMD_EPSILON && motor_relvel > -SIMD_EPSILON )
+ if (motor_relvel < SIMD_EPSILON && motor_relvel > -SIMD_EPSILON)
{
- return 0.0f;//no need for applying force
+ return 0.0f; //no need for applying force
}
-
// correction impulse
- btScalar unclippedMotorImpulse = (1+m_bounce)*motor_relvel*jacDiagABInv;
+ btScalar unclippedMotorImpulse = (1 + m_bounce) * motor_relvel * jacDiagABInv;
// clip correction impulse
btScalar clippedMotorImpulse;
///@todo: should clip against accumulated impulse
- if (unclippedMotorImpulse>0.0f)
+ if (unclippedMotorImpulse > 0.0f)
{
- clippedMotorImpulse = unclippedMotorImpulse > maxMotorForce? maxMotorForce: unclippedMotorImpulse;
+ clippedMotorImpulse = unclippedMotorImpulse > maxMotorForce ? maxMotorForce : unclippedMotorImpulse;
}
else
{
- clippedMotorImpulse = unclippedMotorImpulse < -maxMotorForce ? -maxMotorForce: unclippedMotorImpulse;
+ clippedMotorImpulse = unclippedMotorImpulse < -maxMotorForce ? -maxMotorForce : unclippedMotorImpulse;
}
-
// sort with accumulated impulses
- btScalar lo = btScalar(-BT_LARGE_FLOAT);
- btScalar hi = btScalar(BT_LARGE_FLOAT);
+ btScalar lo = btScalar(-BT_LARGE_FLOAT);
+ btScalar hi = btScalar(BT_LARGE_FLOAT);
btScalar oldaccumImpulse = m_accumulatedImpulse;
btScalar sum = oldaccumImpulse + clippedMotorImpulse;
@@ -227,59 +197,50 @@ btScalar btRotationalLimitMotor::solveAngularLimits(
body1->applyTorqueImpulse(-motorImp);
return clippedMotorImpulse;
-
-
}
//////////////////////////// End btRotationalLimitMotor ////////////////////////////////////
-
-
-
//////////////////////////// btTranslationalLimitMotor ////////////////////////////////////
-
int btTranslationalLimitMotor::testLimitValue(int limitIndex, btScalar test_value)
{
btScalar loLimit = m_lowerLimit[limitIndex];
btScalar hiLimit = m_upperLimit[limitIndex];
- if(loLimit > hiLimit)
+ if (loLimit > hiLimit)
{
- m_currentLimit[limitIndex] = 0;//Free from violation
+ m_currentLimit[limitIndex] = 0; //Free from violation
m_currentLimitError[limitIndex] = btScalar(0.f);
return 0;
}
if (test_value < loLimit)
{
- m_currentLimit[limitIndex] = 2;//low limit violation
- m_currentLimitError[limitIndex] = test_value - loLimit;
+ m_currentLimit[limitIndex] = 2; //low limit violation
+ m_currentLimitError[limitIndex] = test_value - loLimit;
return 2;
}
- else if (test_value> hiLimit)
+ else if (test_value > hiLimit)
{
- m_currentLimit[limitIndex] = 1;//High limit violation
+ m_currentLimit[limitIndex] = 1; //High limit violation
m_currentLimitError[limitIndex] = test_value - hiLimit;
return 1;
};
- m_currentLimit[limitIndex] = 0;//Free from violation
+ m_currentLimit[limitIndex] = 0; //Free from violation
m_currentLimitError[limitIndex] = btScalar(0.f);
return 0;
}
-
-
btScalar btTranslationalLimitMotor::solveLinearAxis(
btScalar timeStep,
btScalar jacDiagABInv,
- btRigidBody& body1,const btVector3 &pointInA,
- btRigidBody& body2,const btVector3 &pointInB,
+ btRigidBody& body1, const btVector3& pointInA,
+ btRigidBody& body2, const btVector3& pointInB,
int limit_index,
- const btVector3 & axis_normal_on_a,
- const btVector3 & anchorPos)
+ const btVector3& axis_normal_on_a,
+ const btVector3& anchorPos)
{
-
///find relative velocity
// btVector3 rel_pos1 = pointInA - body1.getCenterOfMassPosition();
// btVector3 rel_pos2 = pointInB - body2.getCenterOfMassPosition();
@@ -292,14 +253,12 @@ btScalar btTranslationalLimitMotor::solveLinearAxis(
btScalar rel_vel = axis_normal_on_a.dot(vel);
-
-
/// apply displacement correction
//positional error (zeroth order error)
btScalar depth = -(pointInA - pointInB).dot(axis_normal_on_a);
- btScalar lo = btScalar(-BT_LARGE_FLOAT);
- btScalar hi = btScalar(BT_LARGE_FLOAT);
+ btScalar lo = btScalar(-BT_LARGE_FLOAT);
+ btScalar hi = btScalar(BT_LARGE_FLOAT);
btScalar minLimit = m_lowerLimit[limit_index];
btScalar maxLimit = m_upperLimit[limit_index];
@@ -312,7 +271,6 @@ btScalar btTranslationalLimitMotor::solveLinearAxis(
{
depth -= maxLimit;
lo = btScalar(0.);
-
}
else
{
@@ -329,10 +287,7 @@ btScalar btTranslationalLimitMotor::solveLinearAxis(
}
}
- btScalar normalImpulse= m_limitSoftness*(m_restitution*depth/timeStep - m_damping*rel_vel) * jacDiagABInv;
-
-
-
+ btScalar normalImpulse = m_limitSoftness * (m_restitution * depth / timeStep - m_damping * rel_vel) * jacDiagABInv;
btScalar oldNormalImpulse = m_accumulatedImpulse[limit_index];
btScalar sum = oldNormalImpulse + normalImpulse;
@@ -340,11 +295,9 @@ btScalar btTranslationalLimitMotor::solveLinearAxis(
normalImpulse = m_accumulatedImpulse[limit_index] - oldNormalImpulse;
btVector3 impulse_vector = axis_normal_on_a * normalImpulse;
- body1.applyImpulse( impulse_vector, rel_pos1);
+ body1.applyImpulse(impulse_vector, rel_pos1);
body2.applyImpulse(-impulse_vector, rel_pos2);
-
-
return normalImpulse;
}
@@ -352,8 +305,8 @@ btScalar btTranslationalLimitMotor::solveLinearAxis(
void btGeneric6DofConstraint::calculateAngleInfo()
{
- btMatrix3x3 relative_frame = m_calculatedTransformA.getBasis().inverse()*m_calculatedTransformB.getBasis();
- matrixToEulerXYZ(relative_frame,m_calculatedAxisAngleDiff);
+ btMatrix3x3 relative_frame = m_calculatedTransformA.getBasis().inverse() * m_calculatedTransformB.getBasis();
+ matrixToEulerXYZ(relative_frame, m_calculatedAxisAngleDiff);
// in euler angle mode we do not actually constrain the angular velocity
// along the axes axis[0] and axis[2] (although we do use axis[1]) :
//
@@ -378,31 +331,30 @@ void btGeneric6DofConstraint::calculateAngleInfo()
m_calculatedAxis[0].normalize();
m_calculatedAxis[1].normalize();
m_calculatedAxis[2].normalize();
-
}
void btGeneric6DofConstraint::calculateTransforms()
{
- calculateTransforms(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
+ calculateTransforms(m_rbA.getCenterOfMassTransform(), m_rbB.getCenterOfMassTransform());
}
-void btGeneric6DofConstraint::calculateTransforms(const btTransform& transA,const btTransform& transB)
+void btGeneric6DofConstraint::calculateTransforms(const btTransform& transA, const btTransform& transB)
{
m_calculatedTransformA = transA * m_frameInA;
m_calculatedTransformB = transB * m_frameInB;
calculateLinearInfo();
calculateAngleInfo();
- if(m_useOffsetForConstraintFrame)
- { // get weight factors depending on masses
+ if (m_useOffsetForConstraintFrame)
+ { // get weight factors depending on masses
btScalar miA = getRigidBodyA().getInvMass();
btScalar miB = getRigidBodyB().getInvMass();
m_hasStaticBody = (miA < SIMD_EPSILON) || (miB < SIMD_EPSILON);
btScalar miS = miA + miB;
- if(miS > btScalar(0.f))
+ if (miS > btScalar(0.f))
{
m_factA = miB / miS;
}
- else
+ else
{
m_factA = btScalar(0.5f);
}
@@ -410,39 +362,32 @@ void btGeneric6DofConstraint::calculateTransforms(const btTransform& transA,cons
}
}
-
-
void btGeneric6DofConstraint::buildLinearJacobian(
- btJacobianEntry & jacLinear,const btVector3 & normalWorld,
- const btVector3 & pivotAInW,const btVector3 & pivotBInW)
+ btJacobianEntry& jacLinear, const btVector3& normalWorld,
+ const btVector3& pivotAInW, const btVector3& pivotBInW)
{
new (&jacLinear) btJacobianEntry(
- m_rbA.getCenterOfMassTransform().getBasis().transpose(),
- m_rbB.getCenterOfMassTransform().getBasis().transpose(),
- pivotAInW - m_rbA.getCenterOfMassPosition(),
- pivotBInW - m_rbB.getCenterOfMassPosition(),
- normalWorld,
- m_rbA.getInvInertiaDiagLocal(),
- m_rbA.getInvMass(),
- m_rbB.getInvInertiaDiagLocal(),
- m_rbB.getInvMass());
+ m_rbA.getCenterOfMassTransform().getBasis().transpose(),
+ m_rbB.getCenterOfMassTransform().getBasis().transpose(),
+ pivotAInW - m_rbA.getCenterOfMassPosition(),
+ pivotBInW - m_rbB.getCenterOfMassPosition(),
+ normalWorld,
+ m_rbA.getInvInertiaDiagLocal(),
+ m_rbA.getInvMass(),
+ m_rbB.getInvInertiaDiagLocal(),
+ m_rbB.getInvMass());
}
-
-
void btGeneric6DofConstraint::buildAngularJacobian(
- btJacobianEntry & jacAngular,const btVector3 & jointAxisW)
+ btJacobianEntry& jacAngular, const btVector3& jointAxisW)
{
- new (&jacAngular) btJacobianEntry(jointAxisW,
- m_rbA.getCenterOfMassTransform().getBasis().transpose(),
- m_rbB.getCenterOfMassTransform().getBasis().transpose(),
- m_rbA.getInvInertiaDiagLocal(),
- m_rbB.getInvInertiaDiagLocal());
-
+ new (&jacAngular) btJacobianEntry(jointAxisW,
+ m_rbA.getCenterOfMassTransform().getBasis().transpose(),
+ m_rbB.getCenterOfMassTransform().getBasis().transpose(),
+ m_rbA.getInvInertiaDiagLocal(),
+ m_rbB.getInvInertiaDiagLocal());
}
-
-
bool btGeneric6DofConstraint::testAngularLimitMotor(int axis_index)
{
btScalar angle = m_calculatedAxisAngleDiff[axis_index];
@@ -453,23 +398,20 @@ bool btGeneric6DofConstraint::testAngularLimitMotor(int axis_index)
return m_angularLimits[axis_index].needApplyTorques();
}
-
-
void btGeneric6DofConstraint::buildJacobian()
{
#ifndef __SPU__
if (m_useSolveConstraintObsolete)
{
-
// Clear accumulated impulses for the next simulation step
m_linearLimits.m_accumulatedImpulse.setValue(btScalar(0.), btScalar(0.), btScalar(0.));
int i;
- for(i = 0; i < 3; i++)
+ for (i = 0; i < 3; i++)
{
m_angularLimits[i].m_accumulatedImpulse = btScalar(0.);
}
//calculates transform
- calculateTransforms(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
+ calculateTransforms(m_rbA.getCenterOfMassTransform(), m_rbB.getCenterOfMassTransform());
// const btVector3& pivotAInW = m_calculatedTransformA.getOrigin();
// const btVector3& pivotBInW = m_calculatedTransformB.getOrigin();
@@ -483,7 +425,7 @@ void btGeneric6DofConstraint::buildJacobian()
btVector3 normalWorld;
//linear part
- for (i=0;i<3;i++)
+ for (i = 0; i < 3; i++)
{
if (m_linearLimits.isLimited(i))
{
@@ -493,56 +435,53 @@ void btGeneric6DofConstraint::buildJacobian()
normalWorld = m_calculatedTransformB.getBasis().getColumn(i);
buildLinearJacobian(
- m_jacLinear[i],normalWorld ,
- pivotAInW,pivotBInW);
-
+ m_jacLinear[i], normalWorld,
+ pivotAInW, pivotBInW);
}
}
// angular part
- for (i=0;i<3;i++)
+ for (i = 0; i < 3; i++)
{
//calculates error angle
if (testAngularLimitMotor(i))
{
normalWorld = this->getAxis(i);
// Create angular atom
- buildAngularJacobian(m_jacAng[i],normalWorld);
+ buildAngularJacobian(m_jacAng[i], normalWorld);
}
}
-
}
-#endif //__SPU__
-
+#endif //__SPU__
}
-
-void btGeneric6DofConstraint::getInfo1 (btConstraintInfo1* info)
+void btGeneric6DofConstraint::getInfo1(btConstraintInfo1* info)
{
if (m_useSolveConstraintObsolete)
{
info->m_numConstraintRows = 0;
info->nub = 0;
- } else
+ }
+ else
{
//prepare constraint
- calculateTransforms(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
+ calculateTransforms(m_rbA.getCenterOfMassTransform(), m_rbB.getCenterOfMassTransform());
info->m_numConstraintRows = 0;
info->nub = 6;
int i;
//test linear limits
- for(i = 0; i < 3; i++)
+ for (i = 0; i < 3; i++)
{
- if(m_linearLimits.needApplyForce(i))
+ if (m_linearLimits.needApplyForce(i))
{
info->m_numConstraintRows++;
info->nub--;
}
}
//test angular limits
- for (i=0;i<3 ;i++ )
+ for (i = 0; i < 3; i++)
{
- if(testAngularLimitMotor(i))
+ if (testAngularLimitMotor(i))
{
info->m_numConstraintRows++;
info->nub--;
@@ -551,13 +490,14 @@ void btGeneric6DofConstraint::getInfo1 (btConstraintInfo1* info)
}
}
-void btGeneric6DofConstraint::getInfo1NonVirtual (btConstraintInfo1* info)
+void btGeneric6DofConstraint::getInfo1NonVirtual(btConstraintInfo1* info)
{
if (m_useSolveConstraintObsolete)
{
info->m_numConstraintRows = 0;
info->nub = 0;
- } else
+ }
+ else
{
//pre-allocate all 6
info->m_numConstraintRows = 6;
@@ -565,8 +505,7 @@ void btGeneric6DofConstraint::getInfo1NonVirtual (btConstraintInfo1* info)
}
}
-
-void btGeneric6DofConstraint::getInfo2 (btConstraintInfo2* info)
+void btGeneric6DofConstraint::getInfo2(btConstraintInfo2* info)
{
btAssert(!m_useSolveConstraintObsolete);
@@ -577,136 +516,124 @@ void btGeneric6DofConstraint::getInfo2 (btConstraintInfo2* info)
const btVector3& angVelA = m_rbA.getAngularVelocity();
const btVector3& angVelB = m_rbB.getAngularVelocity();
- if(m_useOffsetForConstraintFrame)
- { // for stability better to solve angular limits first
- int row = setAngularLimits(info, 0,transA,transB,linVelA,linVelB,angVelA,angVelB);
- setLinearLimits(info, row, transA,transB,linVelA,linVelB,angVelA,angVelB);
+ if (m_useOffsetForConstraintFrame)
+ { // for stability better to solve angular limits first
+ int row = setAngularLimits(info, 0, transA, transB, linVelA, linVelB, angVelA, angVelB);
+ setLinearLimits(info, row, transA, transB, linVelA, linVelB, angVelA, angVelB);
}
else
- { // leave old version for compatibility
- int row = setLinearLimits(info, 0, transA,transB,linVelA,linVelB,angVelA,angVelB);
- setAngularLimits(info, row,transA,transB,linVelA,linVelB,angVelA,angVelB);
+ { // leave old version for compatibility
+ int row = setLinearLimits(info, 0, transA, transB, linVelA, linVelB, angVelA, angVelB);
+ setAngularLimits(info, row, transA, transB, linVelA, linVelB, angVelA, angVelB);
}
-
}
-
-void btGeneric6DofConstraint::getInfo2NonVirtual (btConstraintInfo2* info, const btTransform& transA,const btTransform& transB,const btVector3& linVelA,const btVector3& linVelB,const btVector3& angVelA,const btVector3& angVelB)
+void btGeneric6DofConstraint::getInfo2NonVirtual(btConstraintInfo2* info, const btTransform& transA, const btTransform& transB, const btVector3& linVelA, const btVector3& linVelB, const btVector3& angVelA, const btVector3& angVelB)
{
-
btAssert(!m_useSolveConstraintObsolete);
//prepare constraint
- calculateTransforms(transA,transB);
+ calculateTransforms(transA, transB);
int i;
- for (i=0;i<3 ;i++ )
+ for (i = 0; i < 3; i++)
{
testAngularLimitMotor(i);
}
- if(m_useOffsetForConstraintFrame)
- { // for stability better to solve angular limits first
- int row = setAngularLimits(info, 0,transA,transB,linVelA,linVelB,angVelA,angVelB);
- setLinearLimits(info, row, transA,transB,linVelA,linVelB,angVelA,angVelB);
+ if (m_useOffsetForConstraintFrame)
+ { // for stability better to solve angular limits first
+ int row = setAngularLimits(info, 0, transA, transB, linVelA, linVelB, angVelA, angVelB);
+ setLinearLimits(info, row, transA, transB, linVelA, linVelB, angVelA, angVelB);
}
else
- { // leave old version for compatibility
- int row = setLinearLimits(info, 0, transA,transB,linVelA,linVelB,angVelA,angVelB);
- setAngularLimits(info, row,transA,transB,linVelA,linVelB,angVelA,angVelB);
+ { // leave old version for compatibility
+ int row = setLinearLimits(info, 0, transA, transB, linVelA, linVelB, angVelA, angVelB);
+ setAngularLimits(info, row, transA, transB, linVelA, linVelB, angVelA, angVelB);
}
}
-
-
-int btGeneric6DofConstraint::setLinearLimits(btConstraintInfo2* info, int row, const btTransform& transA,const btTransform& transB,const btVector3& linVelA,const btVector3& linVelB,const btVector3& angVelA,const btVector3& angVelB)
+int btGeneric6DofConstraint::setLinearLimits(btConstraintInfo2* info, int row, const btTransform& transA, const btTransform& transB, const btVector3& linVelA, const btVector3& linVelB, const btVector3& angVelA, const btVector3& angVelB)
{
-// int row = 0;
+ // int row = 0;
//solve linear limits
btRotationalLimitMotor limot;
- for (int i=0;i<3 ;i++ )
+ for (int i = 0; i < 3; i++)
{
- if(m_linearLimits.needApplyForce(i))
- { // re-use rotational motor code
+ if (m_linearLimits.needApplyForce(i))
+ { // re-use rotational motor code
limot.m_bounce = btScalar(0.f);
limot.m_currentLimit = m_linearLimits.m_currentLimit[i];
limot.m_currentPosition = m_linearLimits.m_currentLinearDiff[i];
- limot.m_currentLimitError = m_linearLimits.m_currentLimitError[i];
- limot.m_damping = m_linearLimits.m_damping;
- limot.m_enableMotor = m_linearLimits.m_enableMotor[i];
- limot.m_hiLimit = m_linearLimits.m_upperLimit[i];
- limot.m_limitSoftness = m_linearLimits.m_limitSoftness;
- limot.m_loLimit = m_linearLimits.m_lowerLimit[i];
- limot.m_maxLimitForce = btScalar(0.f);
- limot.m_maxMotorForce = m_linearLimits.m_maxMotorForce[i];
- limot.m_targetVelocity = m_linearLimits.m_targetVelocity[i];
+ limot.m_currentLimitError = m_linearLimits.m_currentLimitError[i];
+ limot.m_damping = m_linearLimits.m_damping;
+ limot.m_enableMotor = m_linearLimits.m_enableMotor[i];
+ limot.m_hiLimit = m_linearLimits.m_upperLimit[i];
+ limot.m_limitSoftness = m_linearLimits.m_limitSoftness;
+ limot.m_loLimit = m_linearLimits.m_lowerLimit[i];
+ limot.m_maxLimitForce = btScalar(0.f);
+ limot.m_maxMotorForce = m_linearLimits.m_maxMotorForce[i];
+ limot.m_targetVelocity = m_linearLimits.m_targetVelocity[i];
btVector3 axis = m_calculatedTransformA.getBasis().getColumn(i);
int flags = m_flags >> (i * BT_6DOF_FLAGS_AXIS_SHIFT);
- limot.m_normalCFM = (flags & BT_6DOF_FLAGS_CFM_NORM) ? m_linearLimits.m_normalCFM[i] : info->cfm[0];
- limot.m_stopCFM = (flags & BT_6DOF_FLAGS_CFM_STOP) ? m_linearLimits.m_stopCFM[i] : info->cfm[0];
- limot.m_stopERP = (flags & BT_6DOF_FLAGS_ERP_STOP) ? m_linearLimits.m_stopERP[i] : info->erp;
- if(m_useOffsetForConstraintFrame)
+ limot.m_normalCFM = (flags & BT_6DOF_FLAGS_CFM_NORM) ? m_linearLimits.m_normalCFM[i] : info->cfm[0];
+ limot.m_stopCFM = (flags & BT_6DOF_FLAGS_CFM_STOP) ? m_linearLimits.m_stopCFM[i] : info->cfm[0];
+ limot.m_stopERP = (flags & BT_6DOF_FLAGS_ERP_STOP) ? m_linearLimits.m_stopERP[i] : info->erp;
+ if (m_useOffsetForConstraintFrame)
{
int indx1 = (i + 1) % 3;
int indx2 = (i + 2) % 3;
- int rotAllowed = 1; // rotations around orthos to current axis
- if(m_angularLimits[indx1].m_currentLimit && m_angularLimits[indx2].m_currentLimit)
+ int rotAllowed = 1; // rotations around orthos to current axis
+ if (m_angularLimits[indx1].m_currentLimit && m_angularLimits[indx2].m_currentLimit)
{
rotAllowed = 0;
}
- row += get_limit_motor_info2(&limot, transA,transB,linVelA,linVelB,angVelA,angVelB, info, row, axis, 0, rotAllowed);
+ row += get_limit_motor_info2(&limot, transA, transB, linVelA, linVelB, angVelA, angVelB, info, row, axis, 0, rotAllowed);
}
else
{
- row += get_limit_motor_info2(&limot, transA,transB,linVelA,linVelB,angVelA,angVelB, info, row, axis, 0);
+ row += get_limit_motor_info2(&limot, transA, transB, linVelA, linVelB, angVelA, angVelB, info, row, axis, 0);
}
}
}
return row;
}
-
-
-int btGeneric6DofConstraint::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 btGeneric6DofConstraint::setAngularLimits(btConstraintInfo2* info, int row_offset, const btTransform& transA, const btTransform& transB, const btVector3& linVelA, const btVector3& linVelB, const btVector3& angVelA, const btVector3& angVelB)
{
- btGeneric6DofConstraint * d6constraint = this;
+ btGeneric6DofConstraint* d6constraint = this;
int row = row_offset;
//solve angular limits
- for (int i=0;i<3 ;i++ )
+ for (int i = 0; i < 3; i++)
{
- if(d6constraint->getRotationalLimitMotor(i)->needApplyTorques())
+ if (d6constraint->getRotationalLimitMotor(i)->needApplyTorques())
{
btVector3 axis = d6constraint->getAxis(i);
int flags = m_flags >> ((i + 3) * BT_6DOF_FLAGS_AXIS_SHIFT);
- if(!(flags & BT_6DOF_FLAGS_CFM_NORM))
+ if (!(flags & BT_6DOF_FLAGS_CFM_NORM))
{
m_angularLimits[i].m_normalCFM = info->cfm[0];
}
- if(!(flags & BT_6DOF_FLAGS_CFM_STOP))
+ if (!(flags & BT_6DOF_FLAGS_CFM_STOP))
{
m_angularLimits[i].m_stopCFM = info->cfm[0];
}
- if(!(flags & BT_6DOF_FLAGS_ERP_STOP))
+ if (!(flags & BT_6DOF_FLAGS_ERP_STOP))
{
m_angularLimits[i].m_stopERP = info->erp;
}
row += get_limit_motor_info2(d6constraint->getRotationalLimitMotor(i),
- transA,transB,linVelA,linVelB,angVelA,angVelB, info,row,axis,1);
+ transA, transB, linVelA, linVelB, angVelA, angVelB, info, row, axis, 1);
}
}
return row;
}
-
-
-
-void btGeneric6DofConstraint::updateRHS(btScalar timeStep)
+void btGeneric6DofConstraint::updateRHS(btScalar timeStep)
{
(void)timeStep;
-
}
-
void btGeneric6DofConstraint::setFrames(const btTransform& frameA, const btTransform& frameB)
{
m_frameInA = frameA;
@@ -715,33 +642,27 @@ void btGeneric6DofConstraint::setFrames(const btTransform& frameA, const btTrans
calculateTransforms();
}
-
-
btVector3 btGeneric6DofConstraint::getAxis(int axis_index) const
{
return m_calculatedAxis[axis_index];
}
-
-btScalar btGeneric6DofConstraint::getRelativePivotPosition(int axisIndex) const
+btScalar btGeneric6DofConstraint::getRelativePivotPosition(int axisIndex) const
{
return m_calculatedLinearDiff[axisIndex];
}
-
btScalar btGeneric6DofConstraint::getAngle(int axisIndex) const
{
return m_calculatedAxisAngleDiff[axisIndex];
}
-
-
void btGeneric6DofConstraint::calcAnchorPos(void)
{
btScalar imA = m_rbA.getInvMass();
btScalar imB = m_rbB.getInvMass();
btScalar weight;
- if(imB == btScalar(0.0))
+ if (imB == btScalar(0.0))
{
weight = btScalar(1.0);
}
@@ -755,43 +676,39 @@ void btGeneric6DofConstraint::calcAnchorPos(void)
return;
}
-
-
void btGeneric6DofConstraint::calculateLinearInfo()
{
m_calculatedLinearDiff = m_calculatedTransformB.getOrigin() - m_calculatedTransformA.getOrigin();
m_calculatedLinearDiff = m_calculatedTransformA.getBasis().inverse() * m_calculatedLinearDiff;
- for(int i = 0; i < 3; i++)
+ for (int i = 0; i < 3; i++)
{
m_linearLimits.m_currentLinearDiff[i] = m_calculatedLinearDiff[i];
m_linearLimits.testLimitValue(i, m_calculatedLinearDiff[i]);
}
}
-
-
int btGeneric6DofConstraint::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)
-{
- int srow = row * info->rowskip;
- bool powered = limot->m_enableMotor;
- int limit = limot->m_currentLimit;
- if (powered || limit)
- { // if the joint is powered, or has joint limits, add in the extra row
- btScalar *J1 = rotational ? info->m_J1angularAxis : info->m_J1linearAxis;
- btScalar *J2 = rotational ? info->m_J2angularAxis : info->m_J2linearAxis;
- J1[srow+0] = ax1[0];
- J1[srow+1] = ax1[1];
- J1[srow+2] = ax1[2];
-
- J2[srow+0] = -ax1[0];
- J2[srow+1] = -ax1[1];
- J2[srow+2] = -ax1[2];
-
- if((!rotational))
- {
+ 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)
+{
+ int srow = row * info->rowskip;
+ bool powered = limot->m_enableMotor;
+ int limit = limot->m_currentLimit;
+ if (powered || limit)
+ { // if the joint is powered, or has joint limits, add in the extra row
+ btScalar* J1 = rotational ? info->m_J1angularAxis : info->m_J1linearAxis;
+ btScalar* J2 = rotational ? info->m_J2angularAxis : info->m_J2linearAxis;
+ J1[srow + 0] = ax1[0];
+ J1[srow + 1] = ax1[1];
+ J1[srow + 2] = ax1[2];
+
+ J2[srow + 0] = -ax1[0];
+ J2[srow + 1] = -ax1[1];
+ J2[srow + 2] = -ax1[2];
+
+ if ((!rotational))
+ {
if (m_useOffsetForConstraintFrame)
{
btVector3 tmpA, tmpB, relA, relB;
@@ -814,55 +731,56 @@ int btGeneric6DofConstraint::get_limit_motor_info2(
relB = orthoB - totalDist * m_factB;
tmpA = relA.cross(ax1);
tmpB = relB.cross(ax1);
- if(m_hasStaticBody && (!rotAllowed))
+ if (m_hasStaticBody && (!rotAllowed))
{
tmpA *= m_factA;
tmpB *= m_factB;
}
int i;
- for (i=0; i<3; i++) info->m_J1angularAxis[srow+i] = tmpA[i];
- for (i=0; i<3; i++) info->m_J2angularAxis[srow+i] = -tmpB[i];
- } else
+ for (i = 0; i < 3; i++) info->m_J1angularAxis[srow + i] = tmpA[i];
+ for (i = 0; i < 3; i++) info->m_J2angularAxis[srow + i] = -tmpB[i];
+ }
+ else
{
- btVector3 ltd; // Linear Torque Decoupling vector
+ btVector3 ltd; // Linear Torque Decoupling vector
btVector3 c = m_calculatedTransformB.getOrigin() - transA.getOrigin();
ltd = c.cross(ax1);
- info->m_J1angularAxis[srow+0] = ltd[0];
- info->m_J1angularAxis[srow+1] = ltd[1];
- info->m_J1angularAxis[srow+2] = ltd[2];
+ info->m_J1angularAxis[srow + 0] = ltd[0];
+ info->m_J1angularAxis[srow + 1] = ltd[1];
+ info->m_J1angularAxis[srow + 2] = ltd[2];
c = m_calculatedTransformB.getOrigin() - transB.getOrigin();
ltd = -c.cross(ax1);
- info->m_J2angularAxis[srow+0] = ltd[0];
- info->m_J2angularAxis[srow+1] = ltd[1];
- info->m_J2angularAxis[srow+2] = ltd[2];
+ info->m_J2angularAxis[srow + 0] = ltd[0];
+ info->m_J2angularAxis[srow + 1] = ltd[1];
+ info->m_J2angularAxis[srow + 2] = ltd[2];
}
- }
- // if we're limited low and high simultaneously, the joint motor is
- // ineffective
- if (limit && (limot->m_loLimit == limot->m_hiLimit)) powered = false;
- info->m_constraintError[srow] = btScalar(0.f);
- if (powered)
- {
+ }
+ // if we're limited low and high simultaneously, the joint motor is
+ // ineffective
+ if (limit && (limot->m_loLimit == limot->m_hiLimit)) powered = false;
+ info->m_constraintError[srow] = btScalar(0.f);
+ if (powered)
+ {
info->cfm[srow] = limot->m_normalCFM;
- if(!limit)
- {
+ if (!limit)
+ {
btScalar tag_vel = rotational ? limot->m_targetVelocity : -limot->m_targetVelocity;
- btScalar mot_fact = getMotorFactor( limot->m_currentPosition,
- limot->m_loLimit,
- limot->m_hiLimit,
- tag_vel,
- info->fps * limot->m_stopERP);
+ btScalar mot_fact = getMotorFactor(limot->m_currentPosition,
+ limot->m_loLimit,
+ limot->m_hiLimit,
+ tag_vel,
+ info->fps * limot->m_stopERP);
info->m_constraintError[srow] += mot_fact * limot->m_targetVelocity;
- info->m_lowerLimit[srow] = -limot->m_maxMotorForce / info->fps;
- info->m_upperLimit[srow] = limot->m_maxMotorForce / info->fps;
- }
- }
- if(limit)
- {
- btScalar k = info->fps * limot->m_stopERP;
- if(!rotational)
+ info->m_lowerLimit[srow] = -limot->m_maxMotorForce / info->fps;
+ info->m_upperLimit[srow] = limot->m_maxMotorForce / info->fps;
+ }
+ }
+ if (limit)
+ {
+ btScalar k = info->fps * limot->m_stopERP;
+ if (!rotational)
{
info->m_constraintError[srow] += k * limot->m_currentLimitError;
}
@@ -871,116 +789,112 @@ int btGeneric6DofConstraint::get_limit_motor_info2(
info->m_constraintError[srow] += -k * limot->m_currentLimitError;
}
info->cfm[srow] = limot->m_stopCFM;
- if (limot->m_loLimit == limot->m_hiLimit)
- { // limited low and high simultaneously
- info->m_lowerLimit[srow] = -SIMD_INFINITY;
- info->m_upperLimit[srow] = SIMD_INFINITY;
- }
- else
- {
- if (limit == 1)
- {
- info->m_lowerLimit[srow] = 0;
- info->m_upperLimit[srow] = SIMD_INFINITY;
- }
- else
- {
- info->m_lowerLimit[srow] = -SIMD_INFINITY;
- info->m_upperLimit[srow] = 0;
- }
- // deal with bounce
- if (limot->m_bounce > 0)
- {
- // calculate joint velocity
- btScalar vel;
- if (rotational)
- {
- vel = angVelA.dot(ax1);
-//make sure that if no body -> angVelB == zero vec
-// if (body1)
- vel -= angVelB.dot(ax1);
- }
- else
- {
- vel = linVelA.dot(ax1);
-//make sure that if no body -> angVelB == zero vec
-// if (body1)
- vel -= linVelB.dot(ax1);
- }
- // only apply bounce if the velocity is incoming, and if the
- // resulting c[] exceeds what we already have.
- if (limit == 1)
- {
- if (vel < 0)
- {
- btScalar newc = -limot->m_bounce* vel;
- if (newc > info->m_constraintError[srow])
+ if (limot->m_loLimit == limot->m_hiLimit)
+ { // limited low and high simultaneously
+ info->m_lowerLimit[srow] = -SIMD_INFINITY;
+ info->m_upperLimit[srow] = SIMD_INFINITY;
+ }
+ else
+ {
+ if (limit == 1)
+ {
+ info->m_lowerLimit[srow] = 0;
+ info->m_upperLimit[srow] = SIMD_INFINITY;
+ }
+ else
+ {
+ info->m_lowerLimit[srow] = -SIMD_INFINITY;
+ info->m_upperLimit[srow] = 0;
+ }
+ // deal with bounce
+ if (limot->m_bounce > 0)
+ {
+ // calculate joint velocity
+ btScalar vel;
+ if (rotational)
+ {
+ vel = angVelA.dot(ax1);
+ //make sure that if no body -> angVelB == zero vec
+ // if (body1)
+ vel -= angVelB.dot(ax1);
+ }
+ else
+ {
+ vel = linVelA.dot(ax1);
+ //make sure that if no body -> angVelB == zero vec
+ // if (body1)
+ vel -= linVelB.dot(ax1);
+ }
+ // only apply bounce if the velocity is incoming, and if the
+ // resulting c[] exceeds what we already have.
+ if (limit == 1)
+ {
+ if (vel < 0)
+ {
+ btScalar newc = -limot->m_bounce * vel;
+ if (newc > info->m_constraintError[srow])
info->m_constraintError[srow] = newc;
- }
- }
- else
- {
- if (vel > 0)
- {
- btScalar newc = -limot->m_bounce * vel;
- if (newc < info->m_constraintError[srow])
+ }
+ }
+ else
+ {
+ if (vel > 0)
+ {
+ btScalar newc = -limot->m_bounce * vel;
+ if (newc < info->m_constraintError[srow])
info->m_constraintError[srow] = newc;
- }
- }
- }
- }
- }
- return 1;
- }
- else return 0;
+ }
+ }
+ }
+ }
+ }
+ return 1;
+ }
+ else
+ return 0;
}
-
-
-
-
-
- ///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.
+///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.
void btGeneric6DofConstraint::setParam(int num, btScalar value, int axis)
{
- if((axis >= 0) && (axis < 3))
+ if ((axis >= 0) && (axis < 3))
{
- switch(num)
+ switch (num)
{
- case BT_CONSTRAINT_STOP_ERP :
+ case BT_CONSTRAINT_STOP_ERP:
m_linearLimits.m_stopERP[axis] = value;
m_flags |= BT_6DOF_FLAGS_ERP_STOP << (axis * BT_6DOF_FLAGS_AXIS_SHIFT);
break;
- case BT_CONSTRAINT_STOP_CFM :
+ case BT_CONSTRAINT_STOP_CFM:
m_linearLimits.m_stopCFM[axis] = value;
m_flags |= BT_6DOF_FLAGS_CFM_STOP << (axis * BT_6DOF_FLAGS_AXIS_SHIFT);
break;
- case BT_CONSTRAINT_CFM :
+ case BT_CONSTRAINT_CFM:
m_linearLimits.m_normalCFM[axis] = value;
m_flags |= BT_6DOF_FLAGS_CFM_NORM << (axis * BT_6DOF_FLAGS_AXIS_SHIFT);
break;
- default :
+ default:
btAssertConstrParams(0);
}
}
- else if((axis >=3) && (axis < 6))
+ else if ((axis >= 3) && (axis < 6))
{
- switch(num)
+ switch (num)
{
- case BT_CONSTRAINT_STOP_ERP :
+ case BT_CONSTRAINT_STOP_ERP:
m_angularLimits[axis - 3].m_stopERP = value;
m_flags |= BT_6DOF_FLAGS_ERP_STOP << (axis * BT_6DOF_FLAGS_AXIS_SHIFT);
break;
- case BT_CONSTRAINT_STOP_CFM :
+ case BT_CONSTRAINT_STOP_CFM:
m_angularLimits[axis - 3].m_stopCFM = value;
m_flags |= BT_6DOF_FLAGS_CFM_STOP << (axis * BT_6DOF_FLAGS_AXIS_SHIFT);
break;
- case BT_CONSTRAINT_CFM :
+ case BT_CONSTRAINT_CFM:
m_angularLimits[axis - 3].m_normalCFM = value;
m_flags |= BT_6DOF_FLAGS_CFM_NORM << (axis * BT_6DOF_FLAGS_AXIS_SHIFT);
break;
- default :
+ default:
btAssertConstrParams(0);
}
}
@@ -990,47 +904,47 @@ void btGeneric6DofConstraint::setParam(int num, btScalar value, int axis)
}
}
- ///return the local value of parameter
-btScalar btGeneric6DofConstraint::getParam(int num, int axis) const
+///return the local value of parameter
+btScalar btGeneric6DofConstraint::getParam(int num, int axis) const
{
btScalar retVal = 0;
- if((axis >= 0) && (axis < 3))
+ if ((axis >= 0) && (axis < 3))
{
- switch(num)
+ switch (num)
{
- case BT_CONSTRAINT_STOP_ERP :
+ case BT_CONSTRAINT_STOP_ERP:
btAssertConstrParams(m_flags & (BT_6DOF_FLAGS_ERP_STOP << (axis * BT_6DOF_FLAGS_AXIS_SHIFT)));
retVal = m_linearLimits.m_stopERP[axis];
break;
- case BT_CONSTRAINT_STOP_CFM :
+ case BT_CONSTRAINT_STOP_CFM:
btAssertConstrParams(m_flags & (BT_6DOF_FLAGS_CFM_STOP << (axis * BT_6DOF_FLAGS_AXIS_SHIFT)));
retVal = m_linearLimits.m_stopCFM[axis];
break;
- case BT_CONSTRAINT_CFM :
+ case BT_CONSTRAINT_CFM:
btAssertConstrParams(m_flags & (BT_6DOF_FLAGS_CFM_NORM << (axis * BT_6DOF_FLAGS_AXIS_SHIFT)));
retVal = m_linearLimits.m_normalCFM[axis];
break;
- default :
+ default:
btAssertConstrParams(0);
}
}
- else if((axis >=3) && (axis < 6))
+ else if ((axis >= 3) && (axis < 6))
{
- switch(num)
+ switch (num)
{
- case BT_CONSTRAINT_STOP_ERP :
+ case BT_CONSTRAINT_STOP_ERP:
btAssertConstrParams(m_flags & (BT_6DOF_FLAGS_ERP_STOP << (axis * BT_6DOF_FLAGS_AXIS_SHIFT)));
retVal = m_angularLimits[axis - 3].m_stopERP;
break;
- case BT_CONSTRAINT_STOP_CFM :
+ case BT_CONSTRAINT_STOP_CFM:
btAssertConstrParams(m_flags & (BT_6DOF_FLAGS_CFM_STOP << (axis * BT_6DOF_FLAGS_AXIS_SHIFT)));
retVal = m_angularLimits[axis - 3].m_stopCFM;
break;
- case BT_CONSTRAINT_CFM :
+ case BT_CONSTRAINT_CFM:
btAssertConstrParams(m_flags & (BT_6DOF_FLAGS_CFM_NORM << (axis * BT_6DOF_FLAGS_AXIS_SHIFT)));
retVal = m_angularLimits[axis - 3].m_normalCFM;
break;
- default :
+ default:
btAssertConstrParams(0);
}
}
@@ -1041,23 +955,21 @@ btScalar btGeneric6DofConstraint::getParam(int num, int axis) const
return retVal;
}
-
-
-void btGeneric6DofConstraint::setAxis(const btVector3& axis1,const btVector3& axis2)
+void btGeneric6DofConstraint::setAxis(const btVector3& axis1, const btVector3& axis2)
{
btVector3 zAxis = axis1.normalized();
btVector3 yAxis = axis2.normalized();
- btVector3 xAxis = yAxis.cross(zAxis); // we want right coordinate system
-
+ btVector3 xAxis = yAxis.cross(zAxis); // we want right coordinate system
+
btTransform frameInW;
frameInW.setIdentity();
- frameInW.getBasis().setValue( xAxis[0], yAxis[0], zAxis[0],
- xAxis[1], yAxis[1], zAxis[1],
- xAxis[2], yAxis[2], zAxis[2]);
-
+ frameInW.getBasis().setValue(xAxis[0], yAxis[0], zAxis[0],
+ xAxis[1], yAxis[1], zAxis[1],
+ xAxis[2], yAxis[2], zAxis[2]);
+
// now get constraint frame in local coordinate systems
m_frameInA = m_rbA.getCenterOfMassTransform().inverse() * frameInW;
m_frameInB = m_rbB.getCenterOfMassTransform().inverse() * frameInW;
-
+
calculateTransforms();
}
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h
index b2ad45f749..b9e762e175 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h
@@ -23,7 +23,6 @@ email: projectileman@yahoo.com
http://gimpact.sf.net
*/
-
#ifndef BT_GENERIC_6DOF_CONSTRAINT_H
#define BT_GENERIC_6DOF_CONSTRAINT_H
@@ -33,96 +32,91 @@ http://gimpact.sf.net
class btRigidBody;
-
-
#ifdef BT_USE_DOUBLE_PRECISION
-#define btGeneric6DofConstraintData2 btGeneric6DofConstraintDoubleData2
-#define btGeneric6DofConstraintDataName "btGeneric6DofConstraintDoubleData2"
+#define btGeneric6DofConstraintData2 btGeneric6DofConstraintDoubleData2
+#define btGeneric6DofConstraintDataName "btGeneric6DofConstraintDoubleData2"
#else
-#define btGeneric6DofConstraintData2 btGeneric6DofConstraintData
-#define btGeneric6DofConstraintDataName "btGeneric6DofConstraintData"
-#endif //BT_USE_DOUBLE_PRECISION
-
+#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;
+ //! 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_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;
- }
-
-
+ 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;
- }
+ 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;
- }
+ bool needApplyTorques() const
+ {
+ if (m_currentLimit == 0 && m_enableMotor == false) return false;
+ return true;
+ }
//! calculates error
/*!
@@ -131,104 +125,98 @@ public:
int testLimitValue(btScalar test_value);
//! apply the correction impulses for two bodies
- btScalar solveAngularLimits(btScalar timeStep,btVector3& axis, btScalar jacDiagABInv,btRigidBody * body0, btRigidBody * body1);
-
+ 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);
+ 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_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;
+ 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_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++)
+ 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
+ //! 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;
- }
+ 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);
-
-
+ 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
@@ -237,8 +225,7 @@ enum bt6DofFlags
BT_6DOF_FLAGS_CFM_STOP = 2,
BT_6DOF_FLAGS_ERP_STOP = 4
};
-#define BT_6DOF_FLAGS_AXIS_SHIFT 3 // bits per axis
-
+#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
/*!
@@ -276,254 +263,245 @@ This brings support for limit parameters and motors. </li>
</ul>
*/
-ATTRIBUTE_ALIGNED16(class) btGeneric6DofConstraint : public btTypedConstraint
+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
- //!@}
+ //!@{
+ 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
- //!@}
+ //! 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];
+ //!@{
+ 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
+ //! 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;
- bool m_useLinearReferenceFrameA;
- bool m_useOffsetForConstraintFrame;
-
- int m_flags;
+ btVector3 m_AnchorPos; // point betwen pivots of bodies A and B to solve linear axes
- //!@}
+ bool m_useLinearReferenceFrameA;
+ bool m_useOffsetForConstraintFrame;
- btGeneric6DofConstraint& operator=(btGeneric6DofConstraint& other)
- {
- btAssert(0);
- (void) other;
- return *this;
- }
+ int m_flags;
+ //!@}
- 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);
+ btGeneric6DofConstraint& operator=(btGeneric6DofConstraint& other)
+ {
+ btAssert(0);
+ (void)other;
+ return *this;
+ }
- int setLinearLimits(btConstraintInfo2 *info, int row, const btTransform& transA,const btTransform& transB,const btVector3& linVelA,const btVector3& linVelB,const btVector3& angVelA,const btVector3& angVelB);
+ 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);
- void buildLinearJacobian(
- btJacobianEntry & jacLinear,const btVector3 & normalWorld,
- const btVector3 & pivotAInW,const btVector3 & pivotBInW);
+ 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 buildAngularJacobian(btJacobianEntry & jacAngular,const btVector3 & jointAxisW);
+ 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();
-
-
+ void calculateAngleInfo();
public:
-
BT_DECLARE_ALIGNED_ALLOCATOR();
-
+
///for backwards compatibility during the transition to 'getInfo/getInfo2'
- bool m_useSolveConstraintObsolete;
+ bool m_useSolveConstraintObsolete;
+
+ btGeneric6DofConstraint(btRigidBody & rbA, btRigidBody & rbB, const btTransform& frameInA, const btTransform& frameInB, bool useLinearReferenceFrameA);
+ btGeneric6DofConstraint(btRigidBody & rbB, const btTransform& frameInB, bool useLinearReferenceFrameB);
- 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(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;
- }
+ const btTransform& getCalculatedTransformA() const
+ {
+ return m_calculatedTransformA;
+ }
- //! Gets the global transform of the offset for body B
- /*!
+ //! 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;
- }
+ const btTransform& getCalculatedTransformB() const
+ {
+ return m_calculatedTransformB;
+ }
+ const btTransform& getFrameOffsetA() const
+ {
+ return m_frameInA;
+ }
- btTransform & getFrameOffsetA()
- {
- return m_frameInA;
- }
+ const btTransform& getFrameOffsetB() const
+ {
+ return m_frameInB;
+ }
- btTransform & getFrameOffsetB()
- {
- 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);
+ virtual void buildJacobian();
- void getInfo1NonVirtual (btConstraintInfo1* info);
+ virtual void getInfo1(btConstraintInfo1 * info);
- virtual void getInfo2 (btConstraintInfo2* info);
+ void getInfo1NonVirtual(btConstraintInfo1 * info);
- void getInfo2NonVirtual (btConstraintInfo2* info,const btTransform& transA,const btTransform& transB,const btVector3& linVelA,const btVector3& linVelB,const btVector3& angVelA,const btVector3& angVelB);
+ 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);
+ void updateRHS(btScalar timeStep);
//! Get the rotation axis in global coordinates
/*!
\pre btGeneric6DofConstraint.buildJacobian must be called previously.
*/
- btVector3 getAxis(int axis_index) const;
+ btVector3 getAxis(int axis_index) const;
- //! Get the relative Euler angle
- /*!
+ //! Get the relative Euler angle
+ /*!
\pre btGeneric6DofConstraint::calculateTransforms() must be called previously.
*/
- btScalar getAngle(int axis_index) const;
+ 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);
+ 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);
+ bool testAngularLimitMotor(int axis_index);
- void setLinearLowerLimit(const btVector3& linearLower)
- {
- m_linearLimits.m_lowerLimit = linearLower;
- }
+ void setLinearLowerLimit(const btVector3& linearLower)
+ {
+ m_linearLimits.m_lowerLimit = linearLower;
+ }
- void getLinearLowerLimit(btVector3& linearLower) const
+ void getLinearLowerLimit(btVector3 & linearLower) const
{
linearLower = m_linearLimits.m_lowerLimit;
}
- void setLinearUpperLimit(const btVector3& linearUpper)
+ void setLinearUpperLimit(const btVector3& linearUpper)
{
m_linearLimits.m_upperLimit = linearUpper;
}
- void getLinearUpperLimit(btVector3& linearUpper) const
+ void getLinearUpperLimit(btVector3 & linearUpper) const
{
linearUpper = m_linearLimits.m_upperLimit;
}
- void setAngularLowerLimit(const btVector3& angularLower)
- {
- for(int i = 0; i < 3; i++)
+ 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
+ void getAngularLowerLimit(btVector3 & angularLower) const
{
- for(int i = 0; i < 3; i++)
+ 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++)
+ 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
+ void getAngularUpperLimit(btVector3 & angularUpper) const
{
- for(int i = 0; i < 3; i++)
+ 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
- {
+ 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;
- }
- }
+ m_angularLimits[axis - 3].m_loLimit = lo;
+ m_angularLimits[axis - 3].m_hiLimit = hi;
+ }
+ }
//! Test limit
/*!
@@ -532,116 +510,106 @@ public:
- limited means upper > lower
- limitIndex: first 3 are linear, next 3 are angular
*/
- bool isLimited(int limitIndex) const
- {
- if(limitIndex<3)
- {
+ bool isLimited(int limitIndex) const
+ {
+ if (limitIndex < 3)
+ {
return m_linearLimits.isLimited(limitIndex);
+ }
+ return m_angularLimits[limitIndex - 3].isLimited();
+ }
- }
- return m_angularLimits[limitIndex-3].isLimited();
- }
-
- virtual void calcAnchorPos(void); // overridable
+ 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);
+ 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).
+ ///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 setParam(int num, btScalar value, int axis = -1);
///return the local value of parameter
- virtual btScalar getParam(int num, int axis = -1) const;
+ virtual btScalar getParam(int num, int axis = -1) const;
- void setAxis( const btVector3& axis1, const btVector3& axis2);
+ void setAxis(const btVector3& axis1, const btVector3& axis2);
- virtual int getFlags() const
- {
- return m_flags;
+ virtual int getFlags() const
+ {
+ return m_flags;
}
- virtual int calculateSerializeBufferSize() 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;
-
-
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
};
-
struct btGeneric6DofConstraintData
{
- btTypedConstraintData m_typeConstraintData;
- btTransformFloatData m_rbAFrame; // constraint axii. Assumes z is hinge axis.
+ 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;
+
+ 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.
+ 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;
+
+ 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
+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
+///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);
+ 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++)
+ 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_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_useLinearReferenceFrameA = m_useLinearReferenceFrameA ? 1 : 0;
dof->m_useOffsetForConstraintFrame = m_useOffsetForConstraintFrame ? 1 : 0;
return btGeneric6DofConstraintDataName;
}
-
-
-
-
-#endif //BT_GENERIC_6DOF_CONSTRAINT_H
+#endif //BT_GENERIC_6DOF_CONSTRAINT_H
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.cpp b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.cpp
index 540dcd18f7..49c8d9bbf7 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.cpp
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.cpp
@@ -37,67 +37,54 @@ email: projectileman@yahoo.com
http://gimpact.sf.net
*/
-
-
#include "btGeneric6DofSpring2Constraint.h"
#include "BulletDynamics/Dynamics/btRigidBody.h"
#include "LinearMath/btTransformUtil.h"
#include <new>
-
-
btGeneric6DofSpring2Constraint::btGeneric6DofSpring2Constraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB, RotateOrder rotOrder)
- : btTypedConstraint(D6_SPRING_2_CONSTRAINT_TYPE, rbA, rbB)
- , m_frameInA(frameInA)
- , m_frameInB(frameInB)
- , m_rotateOrder(rotOrder)
- , m_flags(0)
+ : btTypedConstraint(D6_SPRING_2_CONSTRAINT_TYPE, rbA, rbB), m_frameInA(frameInA), m_frameInB(frameInB), m_rotateOrder(rotOrder), m_flags(0)
{
calculateTransforms();
}
-
btGeneric6DofSpring2Constraint::btGeneric6DofSpring2Constraint(btRigidBody& rbB, const btTransform& frameInB, RotateOrder rotOrder)
- : btTypedConstraint(D6_SPRING_2_CONSTRAINT_TYPE, getFixedBody(), rbB)
- , m_frameInB(frameInB)
- , m_rotateOrder(rotOrder)
- , m_flags(0)
+ : btTypedConstraint(D6_SPRING_2_CONSTRAINT_TYPE, getFixedBody(), rbB), m_frameInB(frameInB), m_rotateOrder(rotOrder), m_flags(0)
{
///not providing rigidbody A means implicitly using worldspace for body A
m_frameInA = rbB.getCenterOfMassTransform() * m_frameInB;
calculateTransforms();
}
-
btScalar btGeneric6DofSpring2Constraint::btGetMatrixElem(const btMatrix3x3& mat, int index)
{
- int i = index%3;
- int j = index/3;
+ int i = index % 3;
+ int j = index / 3;
return mat[i][j];
}
// MatrixToEulerXYZ from http://www.geometrictools.com/LibFoundation/Mathematics/Wm4Matrix3.inl.html
-bool btGeneric6DofSpring2Constraint::matrixToEulerXYZ(const btMatrix3x3& mat,btVector3& xyz)
+bool btGeneric6DofSpring2Constraint::matrixToEulerXYZ(const btMatrix3x3& mat, btVector3& xyz)
{
// rot = cy*cz -cy*sz sy
// cz*sx*sy+cx*sz cx*cz-sx*sy*sz -cy*sx
// -cx*cz*sy+sx*sz cz*sx+cx*sy*sz cx*cy
- btScalar fi = btGetMatrixElem(mat,2);
+ btScalar fi = btGetMatrixElem(mat, 2);
if (fi < btScalar(1.0f))
{
if (fi > btScalar(-1.0f))
{
- xyz[0] = btAtan2(-btGetMatrixElem(mat,5),btGetMatrixElem(mat,8));
- xyz[1] = btAsin(btGetMatrixElem(mat,2));
- xyz[2] = btAtan2(-btGetMatrixElem(mat,1),btGetMatrixElem(mat,0));
+ xyz[0] = btAtan2(-btGetMatrixElem(mat, 5), btGetMatrixElem(mat, 8));
+ xyz[1] = btAsin(btGetMatrixElem(mat, 2));
+ xyz[2] = btAtan2(-btGetMatrixElem(mat, 1), btGetMatrixElem(mat, 0));
return true;
}
else
{
// WARNING. Not unique. XA - ZA = -atan2(r10,r11)
- xyz[0] = -btAtan2(btGetMatrixElem(mat,3),btGetMatrixElem(mat,4));
+ xyz[0] = -btAtan2(btGetMatrixElem(mat, 3), btGetMatrixElem(mat, 4));
xyz[1] = -SIMD_HALF_PI;
xyz[2] = btScalar(0.0);
return false;
@@ -106,32 +93,32 @@ bool btGeneric6DofSpring2Constraint::matrixToEulerXYZ(const btMatrix3x3& mat,btV
else
{
// WARNING. Not unique. XAngle + ZAngle = atan2(r10,r11)
- xyz[0] = btAtan2(btGetMatrixElem(mat,3),btGetMatrixElem(mat,4));
+ xyz[0] = btAtan2(btGetMatrixElem(mat, 3), btGetMatrixElem(mat, 4));
xyz[1] = SIMD_HALF_PI;
xyz[2] = 0.0;
}
return false;
}
-bool btGeneric6DofSpring2Constraint::matrixToEulerXZY(const btMatrix3x3& mat,btVector3& xyz)
+bool btGeneric6DofSpring2Constraint::matrixToEulerXZY(const btMatrix3x3& mat, btVector3& xyz)
{
// rot = cy*cz -sz sy*cz
// cy*cx*sz+sx*sy cx*cz sy*cx*sz-cy*sx
// cy*sx*sz-cx*sy sx*cz sy*sx*sz+cx*cy
- btScalar fi = btGetMatrixElem(mat,1);
+ btScalar fi = btGetMatrixElem(mat, 1);
if (fi < btScalar(1.0f))
{
if (fi > btScalar(-1.0f))
{
- xyz[0] = btAtan2(btGetMatrixElem(mat,7),btGetMatrixElem(mat,4));
- xyz[1] = btAtan2(btGetMatrixElem(mat,2),btGetMatrixElem(mat,0));
- xyz[2] = btAsin(-btGetMatrixElem(mat,1));
+ xyz[0] = btAtan2(btGetMatrixElem(mat, 7), btGetMatrixElem(mat, 4));
+ xyz[1] = btAtan2(btGetMatrixElem(mat, 2), btGetMatrixElem(mat, 0));
+ xyz[2] = btAsin(-btGetMatrixElem(mat, 1));
return true;
}
else
{
- xyz[0] = -btAtan2(-btGetMatrixElem(mat,6),btGetMatrixElem(mat,8));
+ xyz[0] = -btAtan2(-btGetMatrixElem(mat, 6), btGetMatrixElem(mat, 8));
xyz[1] = btScalar(0.0);
xyz[2] = SIMD_HALF_PI;
return false;
@@ -139,33 +126,33 @@ bool btGeneric6DofSpring2Constraint::matrixToEulerXZY(const btMatrix3x3& mat,btV
}
else
{
- xyz[0] = btAtan2(-btGetMatrixElem(mat,6),btGetMatrixElem(mat,8));
+ xyz[0] = btAtan2(-btGetMatrixElem(mat, 6), btGetMatrixElem(mat, 8));
xyz[1] = 0.0;
xyz[2] = -SIMD_HALF_PI;
}
return false;
}
-bool btGeneric6DofSpring2Constraint::matrixToEulerYXZ(const btMatrix3x3& mat,btVector3& xyz)
+bool btGeneric6DofSpring2Constraint::matrixToEulerYXZ(const btMatrix3x3& mat, btVector3& xyz)
{
// rot = cy*cz+sy*sx*sz cz*sy*sx-cy*sz cx*sy
// cx*sz cx*cz -sx
// cy*sx*sz-cz*sy sy*sz+cy*cz*sx cy*cx
- btScalar fi = btGetMatrixElem(mat,5);
+ btScalar fi = btGetMatrixElem(mat, 5);
if (fi < btScalar(1.0f))
{
if (fi > btScalar(-1.0f))
{
- xyz[0] = btAsin(-btGetMatrixElem(mat,5));
- xyz[1] = btAtan2(btGetMatrixElem(mat,2),btGetMatrixElem(mat,8));
- xyz[2] = btAtan2(btGetMatrixElem(mat,3),btGetMatrixElem(mat,4));
+ xyz[0] = btAsin(-btGetMatrixElem(mat, 5));
+ xyz[1] = btAtan2(btGetMatrixElem(mat, 2), btGetMatrixElem(mat, 8));
+ xyz[2] = btAtan2(btGetMatrixElem(mat, 3), btGetMatrixElem(mat, 4));
return true;
}
else
{
xyz[0] = SIMD_HALF_PI;
- xyz[1] = -btAtan2(-btGetMatrixElem(mat,1),btGetMatrixElem(mat,0));
+ xyz[1] = -btAtan2(-btGetMatrixElem(mat, 1), btGetMatrixElem(mat, 0));
xyz[2] = btScalar(0.0);
return false;
}
@@ -173,32 +160,32 @@ bool btGeneric6DofSpring2Constraint::matrixToEulerYXZ(const btMatrix3x3& mat,btV
else
{
xyz[0] = -SIMD_HALF_PI;
- xyz[1] = btAtan2(-btGetMatrixElem(mat,1),btGetMatrixElem(mat,0));
+ xyz[1] = btAtan2(-btGetMatrixElem(mat, 1), btGetMatrixElem(mat, 0));
xyz[2] = 0.0;
}
return false;
}
-bool btGeneric6DofSpring2Constraint::matrixToEulerYZX(const btMatrix3x3& mat,btVector3& xyz)
+bool btGeneric6DofSpring2Constraint::matrixToEulerYZX(const btMatrix3x3& mat, btVector3& xyz)
{
// rot = cy*cz sy*sx-cy*cx*sz cx*sy+cy*sz*sx
// sz cz*cx -cz*sx
// -cz*sy cy*sx+cx*sy*sz cy*cx-sy*sz*sx
- btScalar fi = btGetMatrixElem(mat,3);
+ btScalar fi = btGetMatrixElem(mat, 3);
if (fi < btScalar(1.0f))
{
if (fi > btScalar(-1.0f))
{
- xyz[0] = btAtan2(-btGetMatrixElem(mat,5),btGetMatrixElem(mat,4));
- xyz[1] = btAtan2(-btGetMatrixElem(mat,6),btGetMatrixElem(mat,0));
- xyz[2] = btAsin(btGetMatrixElem(mat,3));
+ xyz[0] = btAtan2(-btGetMatrixElem(mat, 5), btGetMatrixElem(mat, 4));
+ xyz[1] = btAtan2(-btGetMatrixElem(mat, 6), btGetMatrixElem(mat, 0));
+ xyz[2] = btAsin(btGetMatrixElem(mat, 3));
return true;
}
else
{
xyz[0] = btScalar(0.0);
- xyz[1] = -btAtan2(btGetMatrixElem(mat,7),btGetMatrixElem(mat,8));
+ xyz[1] = -btAtan2(btGetMatrixElem(mat, 7), btGetMatrixElem(mat, 8));
xyz[2] = -SIMD_HALF_PI;
return false;
}
@@ -206,33 +193,33 @@ bool btGeneric6DofSpring2Constraint::matrixToEulerYZX(const btMatrix3x3& mat,btV
else
{
xyz[0] = btScalar(0.0);
- xyz[1] = btAtan2(btGetMatrixElem(mat,7),btGetMatrixElem(mat,8));
+ xyz[1] = btAtan2(btGetMatrixElem(mat, 7), btGetMatrixElem(mat, 8));
xyz[2] = SIMD_HALF_PI;
}
return false;
}
-bool btGeneric6DofSpring2Constraint::matrixToEulerZXY(const btMatrix3x3& mat,btVector3& xyz)
+bool btGeneric6DofSpring2Constraint::matrixToEulerZXY(const btMatrix3x3& mat, btVector3& xyz)
{
// rot = cz*cy-sz*sx*sy -cx*sz cz*sy+cy*sz*sx
// cy*sz+cz*sx*sy cz*cx sz*sy-cz*xy*sx
// -cx*sy sx cx*cy
- btScalar fi = btGetMatrixElem(mat,7);
+ btScalar fi = btGetMatrixElem(mat, 7);
if (fi < btScalar(1.0f))
{
if (fi > btScalar(-1.0f))
{
- xyz[0] = btAsin(btGetMatrixElem(mat,7));
- xyz[1] = btAtan2(-btGetMatrixElem(mat,6),btGetMatrixElem(mat,8));
- xyz[2] = btAtan2(-btGetMatrixElem(mat,1),btGetMatrixElem(mat,4));
+ xyz[0] = btAsin(btGetMatrixElem(mat, 7));
+ xyz[1] = btAtan2(-btGetMatrixElem(mat, 6), btGetMatrixElem(mat, 8));
+ xyz[2] = btAtan2(-btGetMatrixElem(mat, 1), btGetMatrixElem(mat, 4));
return true;
}
else
{
xyz[0] = -SIMD_HALF_PI;
xyz[1] = btScalar(0.0);
- xyz[2] = -btAtan2(btGetMatrixElem(mat,2),btGetMatrixElem(mat,0));
+ xyz[2] = -btAtan2(btGetMatrixElem(mat, 2), btGetMatrixElem(mat, 0));
return false;
}
}
@@ -240,32 +227,32 @@ bool btGeneric6DofSpring2Constraint::matrixToEulerZXY(const btMatrix3x3& mat,btV
{
xyz[0] = SIMD_HALF_PI;
xyz[1] = btScalar(0.0);
- xyz[2] = btAtan2(btGetMatrixElem(mat,2),btGetMatrixElem(mat,0));
+ xyz[2] = btAtan2(btGetMatrixElem(mat, 2), btGetMatrixElem(mat, 0));
}
return false;
}
-bool btGeneric6DofSpring2Constraint::matrixToEulerZYX(const btMatrix3x3& mat,btVector3& xyz)
+bool btGeneric6DofSpring2Constraint::matrixToEulerZYX(const btMatrix3x3& mat, btVector3& xyz)
{
// rot = cz*cy cz*sy*sx-cx*sz sz*sx+cz*cx*sy
// cy*sz cz*cx+sz*sy*sx cx*sz*sy-cz*sx
// -sy cy*sx cy*cx
- btScalar fi = btGetMatrixElem(mat,6);
+ btScalar fi = btGetMatrixElem(mat, 6);
if (fi < btScalar(1.0f))
{
if (fi > btScalar(-1.0f))
{
- xyz[0] = btAtan2(btGetMatrixElem(mat,7), btGetMatrixElem(mat,8));
- xyz[1] = btAsin(-btGetMatrixElem(mat,6));
- xyz[2] = btAtan2(btGetMatrixElem(mat,3),btGetMatrixElem(mat,0));
+ xyz[0] = btAtan2(btGetMatrixElem(mat, 7), btGetMatrixElem(mat, 8));
+ xyz[1] = btAsin(-btGetMatrixElem(mat, 6));
+ xyz[2] = btAtan2(btGetMatrixElem(mat, 3), btGetMatrixElem(mat, 0));
return true;
}
else
{
xyz[0] = btScalar(0.0);
xyz[1] = SIMD_HALF_PI;
- xyz[2] = -btAtan2(btGetMatrixElem(mat,1),btGetMatrixElem(mat,2));
+ xyz[2] = -btAtan2(btGetMatrixElem(mat, 1), btGetMatrixElem(mat, 2));
return false;
}
}
@@ -273,23 +260,36 @@ bool btGeneric6DofSpring2Constraint::matrixToEulerZYX(const btMatrix3x3& mat,btV
{
xyz[0] = btScalar(0.0);
xyz[1] = -SIMD_HALF_PI;
- xyz[2] = btAtan2(-btGetMatrixElem(mat,1),-btGetMatrixElem(mat,2));
+ xyz[2] = btAtan2(-btGetMatrixElem(mat, 1), -btGetMatrixElem(mat, 2));
}
return false;
}
void btGeneric6DofSpring2Constraint::calculateAngleInfo()
{
- btMatrix3x3 relative_frame = m_calculatedTransformA.getBasis().inverse()*m_calculatedTransformB.getBasis();
+ btMatrix3x3 relative_frame = m_calculatedTransformA.getBasis().inverse() * m_calculatedTransformB.getBasis();
switch (m_rotateOrder)
{
- case RO_XYZ : matrixToEulerXYZ(relative_frame,m_calculatedAxisAngleDiff); break;
- case RO_XZY : matrixToEulerXZY(relative_frame,m_calculatedAxisAngleDiff); break;
- case RO_YXZ : matrixToEulerYXZ(relative_frame,m_calculatedAxisAngleDiff); break;
- case RO_YZX : matrixToEulerYZX(relative_frame,m_calculatedAxisAngleDiff); break;
- case RO_ZXY : matrixToEulerZXY(relative_frame,m_calculatedAxisAngleDiff); break;
- case RO_ZYX : matrixToEulerZYX(relative_frame,m_calculatedAxisAngleDiff); break;
- default : btAssert(false);
+ case RO_XYZ:
+ matrixToEulerXYZ(relative_frame, m_calculatedAxisAngleDiff);
+ break;
+ case RO_XZY:
+ matrixToEulerXZY(relative_frame, m_calculatedAxisAngleDiff);
+ break;
+ case RO_YXZ:
+ matrixToEulerYXZ(relative_frame, m_calculatedAxisAngleDiff);
+ break;
+ case RO_YZX:
+ matrixToEulerYZX(relative_frame, m_calculatedAxisAngleDiff);
+ break;
+ case RO_ZXY:
+ matrixToEulerZXY(relative_frame, m_calculatedAxisAngleDiff);
+ break;
+ case RO_ZYX:
+ matrixToEulerZYX(relative_frame, m_calculatedAxisAngleDiff);
+ break;
+ default:
+ btAssert(false);
}
// in euler angle mode we do not actually constrain the angular velocity
// along the axes axis[0] and axis[2] (although we do use axis[1]) :
@@ -307,14 +307,14 @@ void btGeneric6DofSpring2Constraint::calculateAngleInfo()
// to the components of w and set that to 0.
switch (m_rotateOrder)
{
- case RO_XYZ :
+ case RO_XYZ:
{
//Is this the "line of nodes" calculation choosing planes YZ (B coordinate system) and xy (A coordinate system)? (http://en.wikipedia.org/wiki/Euler_angles)
//The two planes are non-homologous, so this is a Tait–Bryan angle formalism and not a proper Euler
//Extrinsic rotations are equal to the reversed order intrinsic rotations so the above xyz extrinsic rotations (axes are fixed) are the same as the zy'x" intrinsic rotations (axes are refreshed after each rotation)
//that is why xy and YZ planes are chosen (this will describe a zy'x" intrinsic rotation) (see the figure on the left at http://en.wikipedia.org/wiki/Euler_angles under Tait–Bryan angles)
// x' = Nperp = N.cross(axis2)
- // y' = N = axis2.cross(axis0)
+ // y' = N = axis2.cross(axis0)
// z' = z
//
// x" = X
@@ -324,7 +324,7 @@ void btGeneric6DofSpring2Constraint::calculateAngleInfo()
//first rotate around z
//second rotate around y'= z.cross(X)
//third rotate around x" = X
- //Original XYZ extrinsic rotation order.
+ //Original XYZ extrinsic rotation order.
//Planes: xy and YZ normals: z, X. Plane intersection (N) is z.cross(X)
btVector3 axis0 = m_calculatedTransformB.getBasis().getColumn(0);
btVector3 axis2 = m_calculatedTransformA.getBasis().getColumn(2);
@@ -333,7 +333,7 @@ void btGeneric6DofSpring2Constraint::calculateAngleInfo()
m_calculatedAxis[2] = axis0.cross(m_calculatedAxis[1]);
break;
}
- case RO_XZY :
+ case RO_XZY:
{
//planes: xz,ZY normals: y, X
//first rotate around y
@@ -346,7 +346,7 @@ void btGeneric6DofSpring2Constraint::calculateAngleInfo()
m_calculatedAxis[1] = m_calculatedAxis[2].cross(axis0);
break;
}
- case RO_YXZ :
+ case RO_YXZ:
{
//planes: yx,XZ normals: z, Y
//first rotate around z
@@ -359,7 +359,7 @@ void btGeneric6DofSpring2Constraint::calculateAngleInfo()
m_calculatedAxis[2] = m_calculatedAxis[0].cross(axis1);
break;
}
- case RO_YZX :
+ case RO_YZX:
{
//planes: yz,ZX normals: x, Y
//first rotate around x
@@ -372,7 +372,7 @@ void btGeneric6DofSpring2Constraint::calculateAngleInfo()
m_calculatedAxis[1] = m_calculatedAxis[2].cross(axis0);
break;
}
- case RO_ZXY :
+ case RO_ZXY:
{
//planes: zx,XY normals: y, Z
//first rotate around y
@@ -385,7 +385,7 @@ void btGeneric6DofSpring2Constraint::calculateAngleInfo()
m_calculatedAxis[2] = m_calculatedAxis[0].cross(axis1);
break;
}
- case RO_ZYX :
+ case RO_ZYX:
{
//planes: zy,YX normals: x, Z
//first rotate around x
@@ -398,22 +398,21 @@ void btGeneric6DofSpring2Constraint::calculateAngleInfo()
m_calculatedAxis[2] = axis0.cross(m_calculatedAxis[1]);
break;
}
- default:
- btAssert(false);
+ default:
+ btAssert(false);
}
m_calculatedAxis[0].normalize();
m_calculatedAxis[1].normalize();
m_calculatedAxis[2].normalize();
-
}
void btGeneric6DofSpring2Constraint::calculateTransforms()
{
- calculateTransforms(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
+ calculateTransforms(m_rbA.getCenterOfMassTransform(), m_rbB.getCenterOfMassTransform());
}
-void btGeneric6DofSpring2Constraint::calculateTransforms(const btTransform& transA,const btTransform& transB)
+void btGeneric6DofSpring2Constraint::calculateTransforms(const btTransform& transA, const btTransform& transB)
{
m_calculatedTransformA = transA * m_frameInA;
m_calculatedTransformB = transB * m_frameInB;
@@ -424,18 +423,17 @@ void btGeneric6DofSpring2Constraint::calculateTransforms(const btTransform& tran
btScalar miB = getRigidBodyB().getInvMass();
m_hasStaticBody = (miA < SIMD_EPSILON) || (miB < SIMD_EPSILON);
btScalar miS = miA + miB;
- if(miS > btScalar(0.f))
+ if (miS > btScalar(0.f))
{
m_factA = miB / miS;
}
- else
+ else
{
m_factA = btScalar(0.5f);
}
m_factB = btScalar(1.0f) - m_factA;
}
-
void btGeneric6DofSpring2Constraint::testAngularLimitMotor(int axis_index)
{
btScalar angle = m_calculatedAxisAngleDiff[axis_index];
@@ -444,35 +442,37 @@ void btGeneric6DofSpring2Constraint::testAngularLimitMotor(int axis_index)
m_angularLimits[axis_index].testLimitValue(angle);
}
-
-void btGeneric6DofSpring2Constraint::getInfo1 (btConstraintInfo1* info)
+void btGeneric6DofSpring2Constraint::getInfo1(btConstraintInfo1* info)
{
//prepare constraint
- calculateTransforms(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
+ calculateTransforms(m_rbA.getCenterOfMassTransform(), m_rbB.getCenterOfMassTransform());
info->m_numConstraintRows = 0;
info->nub = 0;
int i;
//test linear limits
- for(i = 0; i < 3; i++)
+ for (i = 0; i < 3; i++)
{
- if (m_linearLimits.m_currentLimit[i]==4) info->m_numConstraintRows += 2;
- else if (m_linearLimits.m_currentLimit[i]!=0) info->m_numConstraintRows += 1;
- if (m_linearLimits.m_enableMotor[i] ) info->m_numConstraintRows += 1;
+ if (m_linearLimits.m_currentLimit[i] == 4)
+ info->m_numConstraintRows += 2;
+ else if (m_linearLimits.m_currentLimit[i] != 0)
+ info->m_numConstraintRows += 1;
+ if (m_linearLimits.m_enableMotor[i]) info->m_numConstraintRows += 1;
if (m_linearLimits.m_enableSpring[i]) info->m_numConstraintRows += 1;
}
//test angular limits
- for (i=0;i<3 ;i++ )
+ for (i = 0; i < 3; i++)
{
testAngularLimitMotor(i);
- if (m_angularLimits[i].m_currentLimit==4) info->m_numConstraintRows += 2;
- else if (m_angularLimits[i].m_currentLimit!=0) info->m_numConstraintRows += 1;
- if (m_angularLimits[i].m_enableMotor ) info->m_numConstraintRows += 1;
+ if (m_angularLimits[i].m_currentLimit == 4)
+ info->m_numConstraintRows += 2;
+ else if (m_angularLimits[i].m_currentLimit != 0)
+ info->m_numConstraintRows += 1;
+ if (m_angularLimits[i].m_enableMotor) info->m_numConstraintRows += 1;
if (m_angularLimits[i].m_enableSpring) info->m_numConstraintRows += 1;
}
}
-
-void btGeneric6DofSpring2Constraint::getInfo2 (btConstraintInfo2* info)
+void btGeneric6DofSpring2Constraint::getInfo2(btConstraintInfo2* info)
{
const btTransform& transA = m_rbA.getCenterOfMassTransform();
const btTransform& transB = m_rbB.getCenterOfMassTransform();
@@ -482,118 +482,138 @@ void btGeneric6DofSpring2Constraint::getInfo2 (btConstraintInfo2* info)
const btVector3& angVelB = m_rbB.getAngularVelocity();
// for stability better to solve angular limits first
- int row = setAngularLimits(info, 0,transA,transB,linVelA,linVelB,angVelA,angVelB);
- setLinearLimits(info, row, transA,transB,linVelA,linVelB,angVelA,angVelB);
+ int row = setAngularLimits(info, 0, transA, transB, linVelA, linVelB, angVelA, angVelB);
+ setLinearLimits(info, row, transA, transB, linVelA, linVelB, angVelA, angVelB);
}
-
-int btGeneric6DofSpring2Constraint::setLinearLimits(btConstraintInfo2* info, int row, const btTransform& transA,const btTransform& transB,const btVector3& linVelA,const btVector3& linVelB,const btVector3& angVelA,const btVector3& angVelB)
+int btGeneric6DofSpring2Constraint::setLinearLimits(btConstraintInfo2* info, int row, const btTransform& transA, const btTransform& transB, const btVector3& linVelA, const btVector3& linVelB, const btVector3& angVelA, const btVector3& angVelB)
{
//solve linear limits
btRotationalLimitMotor2 limot;
- for (int i=0;i<3 ;i++ )
+ for (int i = 0; i < 3; i++)
{
- if(m_linearLimits.m_currentLimit[i] || m_linearLimits.m_enableMotor[i] || m_linearLimits.m_enableSpring[i])
- { // re-use rotational motor code
- limot.m_bounce = m_linearLimits.m_bounce[i];
- limot.m_currentLimit = m_linearLimits.m_currentLimit[i];
- limot.m_currentPosition = m_linearLimits.m_currentLinearDiff[i];
- limot.m_currentLimitError = m_linearLimits.m_currentLimitError[i];
- limot.m_currentLimitErrorHi = m_linearLimits.m_currentLimitErrorHi[i];
- limot.m_enableMotor = m_linearLimits.m_enableMotor[i];
- limot.m_servoMotor = m_linearLimits.m_servoMotor[i];
- limot.m_servoTarget = m_linearLimits.m_servoTarget[i];
- limot.m_enableSpring = m_linearLimits.m_enableSpring[i];
- limot.m_springStiffness = m_linearLimits.m_springStiffness[i];
+ if (m_linearLimits.m_currentLimit[i] || m_linearLimits.m_enableMotor[i] || m_linearLimits.m_enableSpring[i])
+ { // re-use rotational motor code
+ limot.m_bounce = m_linearLimits.m_bounce[i];
+ limot.m_currentLimit = m_linearLimits.m_currentLimit[i];
+ limot.m_currentPosition = m_linearLimits.m_currentLinearDiff[i];
+ limot.m_currentLimitError = m_linearLimits.m_currentLimitError[i];
+ limot.m_currentLimitErrorHi = m_linearLimits.m_currentLimitErrorHi[i];
+ limot.m_enableMotor = m_linearLimits.m_enableMotor[i];
+ limot.m_servoMotor = m_linearLimits.m_servoMotor[i];
+ limot.m_servoTarget = m_linearLimits.m_servoTarget[i];
+ limot.m_enableSpring = m_linearLimits.m_enableSpring[i];
+ limot.m_springStiffness = m_linearLimits.m_springStiffness[i];
limot.m_springStiffnessLimited = m_linearLimits.m_springStiffnessLimited[i];
- limot.m_springDamping = m_linearLimits.m_springDamping[i];
- limot.m_springDampingLimited = m_linearLimits.m_springDampingLimited[i];
- limot.m_equilibriumPoint = m_linearLimits.m_equilibriumPoint[i];
- limot.m_hiLimit = m_linearLimits.m_upperLimit[i];
- limot.m_loLimit = m_linearLimits.m_lowerLimit[i];
- limot.m_maxMotorForce = m_linearLimits.m_maxMotorForce[i];
- limot.m_targetVelocity = m_linearLimits.m_targetVelocity[i];
+ limot.m_springDamping = m_linearLimits.m_springDamping[i];
+ limot.m_springDampingLimited = m_linearLimits.m_springDampingLimited[i];
+ limot.m_equilibriumPoint = m_linearLimits.m_equilibriumPoint[i];
+ limot.m_hiLimit = m_linearLimits.m_upperLimit[i];
+ limot.m_loLimit = m_linearLimits.m_lowerLimit[i];
+ limot.m_maxMotorForce = m_linearLimits.m_maxMotorForce[i];
+ limot.m_targetVelocity = m_linearLimits.m_targetVelocity[i];
btVector3 axis = m_calculatedTransformA.getBasis().getColumn(i);
int flags = m_flags >> (i * BT_6DOF_FLAGS_AXIS_SHIFT2);
- limot.m_stopCFM = (flags & BT_6DOF_FLAGS_CFM_STOP2) ? m_linearLimits.m_stopCFM[i] : info->cfm[0];
- limot.m_stopERP = (flags & BT_6DOF_FLAGS_ERP_STOP2) ? m_linearLimits.m_stopERP[i] : info->erp;
+ limot.m_stopCFM = (flags & BT_6DOF_FLAGS_CFM_STOP2) ? m_linearLimits.m_stopCFM[i] : info->cfm[0];
+ limot.m_stopERP = (flags & BT_6DOF_FLAGS_ERP_STOP2) ? m_linearLimits.m_stopERP[i] : info->erp;
limot.m_motorCFM = (flags & BT_6DOF_FLAGS_CFM_MOTO2) ? m_linearLimits.m_motorCFM[i] : info->cfm[0];
limot.m_motorERP = (flags & BT_6DOF_FLAGS_ERP_MOTO2) ? m_linearLimits.m_motorERP[i] : info->erp;
//rotAllowed is a bit of a magic from the original 6dof. The calculation of it here is something that imitates the original behavior as much as possible.
int indx1 = (i + 1) % 3;
int indx2 = (i + 2) % 3;
- int rotAllowed = 1; // rotations around orthos to current axis (it is used only when one of the body is static)
- #define D6_LIMIT_ERROR_THRESHOLD_FOR_ROTATION 1.0e-3
+ int rotAllowed = 1; // rotations around orthos to current axis (it is used only when one of the body is static)
+#define D6_LIMIT_ERROR_THRESHOLD_FOR_ROTATION 1.0e-3
bool indx1Violated = m_angularLimits[indx1].m_currentLimit == 1 ||
- m_angularLimits[indx1].m_currentLimit == 2 ||
- ( m_angularLimits[indx1].m_currentLimit == 3 && ( m_angularLimits[indx1].m_currentLimitError < -D6_LIMIT_ERROR_THRESHOLD_FOR_ROTATION || m_angularLimits[indx1].m_currentLimitError > D6_LIMIT_ERROR_THRESHOLD_FOR_ROTATION ) ) ||
- ( m_angularLimits[indx1].m_currentLimit == 4 && ( m_angularLimits[indx1].m_currentLimitError < -D6_LIMIT_ERROR_THRESHOLD_FOR_ROTATION || m_angularLimits[indx1].m_currentLimitErrorHi > D6_LIMIT_ERROR_THRESHOLD_FOR_ROTATION ) );
+ m_angularLimits[indx1].m_currentLimit == 2 ||
+ (m_angularLimits[indx1].m_currentLimit == 3 && (m_angularLimits[indx1].m_currentLimitError < -D6_LIMIT_ERROR_THRESHOLD_FOR_ROTATION || m_angularLimits[indx1].m_currentLimitError > D6_LIMIT_ERROR_THRESHOLD_FOR_ROTATION)) ||
+ (m_angularLimits[indx1].m_currentLimit == 4 && (m_angularLimits[indx1].m_currentLimitError < -D6_LIMIT_ERROR_THRESHOLD_FOR_ROTATION || m_angularLimits[indx1].m_currentLimitErrorHi > D6_LIMIT_ERROR_THRESHOLD_FOR_ROTATION));
bool indx2Violated = m_angularLimits[indx2].m_currentLimit == 1 ||
- m_angularLimits[indx2].m_currentLimit == 2 ||
- ( m_angularLimits[indx2].m_currentLimit == 3 && ( m_angularLimits[indx2].m_currentLimitError < -D6_LIMIT_ERROR_THRESHOLD_FOR_ROTATION || m_angularLimits[indx2].m_currentLimitError > D6_LIMIT_ERROR_THRESHOLD_FOR_ROTATION ) ) ||
- ( m_angularLimits[indx2].m_currentLimit == 4 && ( m_angularLimits[indx2].m_currentLimitError < -D6_LIMIT_ERROR_THRESHOLD_FOR_ROTATION || m_angularLimits[indx2].m_currentLimitErrorHi > D6_LIMIT_ERROR_THRESHOLD_FOR_ROTATION ) );
- if( indx1Violated && indx2Violated )
+ m_angularLimits[indx2].m_currentLimit == 2 ||
+ (m_angularLimits[indx2].m_currentLimit == 3 && (m_angularLimits[indx2].m_currentLimitError < -D6_LIMIT_ERROR_THRESHOLD_FOR_ROTATION || m_angularLimits[indx2].m_currentLimitError > D6_LIMIT_ERROR_THRESHOLD_FOR_ROTATION)) ||
+ (m_angularLimits[indx2].m_currentLimit == 4 && (m_angularLimits[indx2].m_currentLimitError < -D6_LIMIT_ERROR_THRESHOLD_FOR_ROTATION || m_angularLimits[indx2].m_currentLimitErrorHi > D6_LIMIT_ERROR_THRESHOLD_FOR_ROTATION));
+ if (indx1Violated && indx2Violated)
{
rotAllowed = 0;
}
- row += get_limit_motor_info2(&limot, transA,transB,linVelA,linVelB,angVelA,angVelB, info, row, axis, 0, rotAllowed);
-
+ row += get_limit_motor_info2(&limot, transA, transB, linVelA, linVelB, angVelA, angVelB, info, row, axis, 0, rotAllowed);
}
}
return row;
}
-
-
-int btGeneric6DofSpring2Constraint::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 btGeneric6DofSpring2Constraint::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 row = row_offset;
//order of rotational constraint rows
int cIdx[] = {0, 1, 2};
- switch(m_rotateOrder)
+ switch (m_rotateOrder)
{
- case RO_XYZ : cIdx[0] = 0; cIdx[1] = 1; cIdx[2] = 2; break;
- case RO_XZY : cIdx[0] = 0; cIdx[1] = 2; cIdx[2] = 1; break;
- case RO_YXZ : cIdx[0] = 1; cIdx[1] = 0; cIdx[2] = 2; break;
- case RO_YZX : cIdx[0] = 1; cIdx[1] = 2; cIdx[2] = 0; break;
- case RO_ZXY : cIdx[0] = 2; cIdx[1] = 0; cIdx[2] = 1; break;
- case RO_ZYX : cIdx[0] = 2; cIdx[1] = 1; cIdx[2] = 0; break;
- default : btAssert(false);
+ case RO_XYZ:
+ cIdx[0] = 0;
+ cIdx[1] = 1;
+ cIdx[2] = 2;
+ break;
+ case RO_XZY:
+ cIdx[0] = 0;
+ cIdx[1] = 2;
+ cIdx[2] = 1;
+ break;
+ case RO_YXZ:
+ cIdx[0] = 1;
+ cIdx[1] = 0;
+ cIdx[2] = 2;
+ break;
+ case RO_YZX:
+ cIdx[0] = 1;
+ cIdx[1] = 2;
+ cIdx[2] = 0;
+ break;
+ case RO_ZXY:
+ cIdx[0] = 2;
+ cIdx[1] = 0;
+ cIdx[2] = 1;
+ break;
+ case RO_ZYX:
+ cIdx[0] = 2;
+ cIdx[1] = 1;
+ cIdx[2] = 0;
+ break;
+ default:
+ btAssert(false);
}
- for (int ii = 0; ii < 3 ; ii++ )
+ for (int ii = 0; ii < 3; ii++)
{
int i = cIdx[ii];
- if(m_angularLimits[i].m_currentLimit || m_angularLimits[i].m_enableMotor || m_angularLimits[i].m_enableSpring)
+ if (m_angularLimits[i].m_currentLimit || m_angularLimits[i].m_enableMotor || m_angularLimits[i].m_enableSpring)
{
btVector3 axis = getAxis(i);
int flags = m_flags >> ((i + 3) * BT_6DOF_FLAGS_AXIS_SHIFT2);
- if(!(flags & BT_6DOF_FLAGS_CFM_STOP2))
+ if (!(flags & BT_6DOF_FLAGS_CFM_STOP2))
{
m_angularLimits[i].m_stopCFM = info->cfm[0];
}
- if(!(flags & BT_6DOF_FLAGS_ERP_STOP2))
+ if (!(flags & BT_6DOF_FLAGS_ERP_STOP2))
{
m_angularLimits[i].m_stopERP = info->erp;
}
- if(!(flags & BT_6DOF_FLAGS_CFM_MOTO2))
+ if (!(flags & BT_6DOF_FLAGS_CFM_MOTO2))
{
m_angularLimits[i].m_motorCFM = info->cfm[0];
}
- if(!(flags & BT_6DOF_FLAGS_ERP_MOTO2))
+ if (!(flags & BT_6DOF_FLAGS_ERP_MOTO2))
{
m_angularLimits[i].m_motorERP = info->erp;
}
- row += get_limit_motor_info2(&m_angularLimits[i],transA,transB,linVelA,linVelB,angVelA,angVelB, info,row,axis,1);
+ row += get_limit_motor_info2(&m_angularLimits[i], transA, transB, linVelA, linVelB, angVelA, angVelB, info, row, axis, 1);
}
}
return row;
}
-
void btGeneric6DofSpring2Constraint::setFrames(const btTransform& frameA, const btTransform& frameB)
{
m_frameInA = frameA;
@@ -602,32 +622,31 @@ void btGeneric6DofSpring2Constraint::setFrames(const btTransform& frameA, const
calculateTransforms();
}
-
void btGeneric6DofSpring2Constraint::calculateLinearInfo()
{
m_calculatedLinearDiff = m_calculatedTransformB.getOrigin() - m_calculatedTransformA.getOrigin();
m_calculatedLinearDiff = m_calculatedTransformA.getBasis().inverse() * m_calculatedLinearDiff;
- for(int i = 0; i < 3; i++)
+ for (int i = 0; i < 3; i++)
{
m_linearLimits.m_currentLinearDiff[i] = m_calculatedLinearDiff[i];
m_linearLimits.testLimitValue(i, m_calculatedLinearDiff[i]);
}
}
-void btGeneric6DofSpring2Constraint::calculateJacobi(btRotationalLimitMotor2 * limot, const btTransform& transA,const btTransform& transB, btConstraintInfo2 *info, int srow, btVector3& ax1, int rotational, int rotAllowed)
+void btGeneric6DofSpring2Constraint::calculateJacobi(btRotationalLimitMotor2* limot, const btTransform& transA, const btTransform& transB, btConstraintInfo2* info, int srow, btVector3& ax1, int rotational, int rotAllowed)
{
- btScalar *J1 = rotational ? info->m_J1angularAxis : info->m_J1linearAxis;
- btScalar *J2 = rotational ? info->m_J2angularAxis : info->m_J2linearAxis;
+ btScalar* J1 = rotational ? info->m_J1angularAxis : info->m_J1linearAxis;
+ btScalar* J2 = rotational ? info->m_J2angularAxis : info->m_J2linearAxis;
- J1[srow+0] = ax1[0];
- J1[srow+1] = ax1[1];
- J1[srow+2] = ax1[2];
+ J1[srow + 0] = ax1[0];
+ J1[srow + 1] = ax1[1];
+ J1[srow + 2] = ax1[2];
- J2[srow+0] = -ax1[0];
- J2[srow+1] = -ax1[1];
- J2[srow+2] = -ax1[2];
+ J2[srow + 0] = -ax1[0];
+ J2[srow + 1] = -ax1[1];
+ J2[srow + 2] = -ax1[2];
- if(!rotational)
+ if (!rotational)
{
btVector3 tmpA, tmpB, relA, relB;
// get vector from bodyB to frameB in WCS
@@ -636,40 +655,44 @@ void btGeneric6DofSpring2Constraint::calculateJacobi(btRotationalLimitMotor2 * l
relA = m_calculatedTransformA.getOrigin() - transA.getOrigin();
tmpA = relA.cross(ax1);
tmpB = relB.cross(ax1);
- if(m_hasStaticBody && (!rotAllowed))
+ if (m_hasStaticBody && (!rotAllowed))
{
tmpA *= m_factA;
tmpB *= m_factB;
}
int i;
- for (i=0; i<3; i++) info->m_J1angularAxis[srow+i] = tmpA[i];
- for (i=0; i<3; i++) info->m_J2angularAxis[srow+i] = -tmpB[i];
+ for (i = 0; i < 3; i++) info->m_J1angularAxis[srow + i] = tmpA[i];
+ for (i = 0; i < 3; i++) info->m_J2angularAxis[srow + i] = -tmpB[i];
}
}
-
int btGeneric6DofSpring2Constraint::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)
+ 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)
{
int count = 0;
int srow = row * info->rowskip;
- if (limot->m_currentLimit==4)
+ if (limot->m_currentLimit == 4)
{
btScalar vel = rotational ? angVelA.dot(ax1) - angVelB.dot(ax1) : linVelA.dot(ax1) - linVelB.dot(ax1);
- calculateJacobi(limot,transA,transB,info,srow,ax1,rotational,rotAllowed);
+ calculateJacobi(limot, transA, transB, info, srow, ax1, rotational, rotAllowed);
info->m_constraintError[srow] = info->fps * limot->m_stopERP * limot->m_currentLimitError * (rotational ? -1 : 1);
- if (rotational) {
- if (info->m_constraintError[srow]-vel*limot->m_stopERP > 0) {
- btScalar bounceerror = -limot->m_bounce* vel;
+ if (rotational)
+ {
+ if (info->m_constraintError[srow] - vel * limot->m_stopERP > 0)
+ {
+ btScalar bounceerror = -limot->m_bounce * vel;
if (bounceerror > info->m_constraintError[srow]) info->m_constraintError[srow] = bounceerror;
}
- } else {
- if (info->m_constraintError[srow]-vel*limot->m_stopERP < 0) {
- btScalar bounceerror = -limot->m_bounce* vel;
+ }
+ else
+ {
+ if (info->m_constraintError[srow] - vel * limot->m_stopERP < 0)
+ {
+ btScalar bounceerror = -limot->m_bounce * vel;
if (bounceerror < info->m_constraintError[srow]) info->m_constraintError[srow] = bounceerror;
}
}
@@ -679,16 +702,21 @@ int btGeneric6DofSpring2Constraint::get_limit_motor_info2(
srow += info->rowskip;
++count;
- calculateJacobi(limot,transA,transB,info,srow,ax1,rotational,rotAllowed);
+ calculateJacobi(limot, transA, transB, info, srow, ax1, rotational, rotAllowed);
info->m_constraintError[srow] = info->fps * limot->m_stopERP * limot->m_currentLimitErrorHi * (rotational ? -1 : 1);
- if (rotational) {
- if (info->m_constraintError[srow]-vel*limot->m_stopERP < 0) {
- btScalar bounceerror = -limot->m_bounce* vel;
+ if (rotational)
+ {
+ if (info->m_constraintError[srow] - vel * limot->m_stopERP < 0)
+ {
+ btScalar bounceerror = -limot->m_bounce * vel;
if (bounceerror < info->m_constraintError[srow]) info->m_constraintError[srow] = bounceerror;
}
- } else {
- if (info->m_constraintError[srow]-vel*limot->m_stopERP > 0) {
- btScalar bounceerror = -limot->m_bounce* vel;
+ }
+ else
+ {
+ if (info->m_constraintError[srow] - vel * limot->m_stopERP > 0)
+ {
+ btScalar bounceerror = -limot->m_bounce * vel;
if (bounceerror > info->m_constraintError[srow]) info->m_constraintError[srow] = bounceerror;
}
}
@@ -697,10 +725,10 @@ int btGeneric6DofSpring2Constraint::get_limit_motor_info2(
info->cfm[srow] = limot->m_stopCFM;
srow += info->rowskip;
++count;
- } else
- if (limot->m_currentLimit==3)
+ }
+ else if (limot->m_currentLimit == 3)
{
- calculateJacobi(limot,transA,transB,info,srow,ax1,rotational,rotAllowed);
+ calculateJacobi(limot, transA, transB, info, srow, ax1, rotational, rotAllowed);
info->m_constraintError[srow] = info->fps * limot->m_stopERP * limot->m_currentLimitError * (rotational ? -1 : 1);
info->m_lowerLimit[srow] = -SIMD_INFINITY;
info->m_upperLimit[srow] = SIMD_INFINITY;
@@ -711,13 +739,13 @@ int btGeneric6DofSpring2Constraint::get_limit_motor_info2(
if (limot->m_enableMotor && !limot->m_servoMotor)
{
- calculateJacobi(limot,transA,transB,info,srow,ax1,rotational,rotAllowed);
+ calculateJacobi(limot, transA, transB, info, srow, ax1, rotational, rotAllowed);
btScalar tag_vel = rotational ? limot->m_targetVelocity : -limot->m_targetVelocity;
- btScalar mot_fact = getMotorFactor(limot->m_currentPosition,
- limot->m_loLimit,
- limot->m_hiLimit,
- tag_vel,
- info->fps * limot->m_motorERP);
+ btScalar mot_fact = getMotorFactor(limot->m_currentPosition,
+ limot->m_loLimit,
+ limot->m_hiLimit,
+ tag_vel,
+ info->fps * limot->m_motorERP);
info->m_constraintError[srow] = mot_fact * limot->m_targetVelocity;
info->m_lowerLimit[srow] = -limot->m_maxMotorForce / info->fps;
info->m_upperLimit[srow] = limot->m_maxMotorForce / info->fps;
@@ -735,36 +763,36 @@ int btGeneric6DofSpring2Constraint::get_limit_motor_info2(
if (error > SIMD_PI)
{
error -= SIMD_2_PI;
- curServoTarget +=SIMD_2_PI;
+ curServoTarget += SIMD_2_PI;
}
if (error < -SIMD_PI)
{
error += SIMD_2_PI;
- curServoTarget -=SIMD_2_PI;
+ curServoTarget -= SIMD_2_PI;
}
}
- calculateJacobi(limot,transA,transB,info,srow,ax1,rotational,rotAllowed);
- btScalar targetvelocity = error<0 ? -limot->m_targetVelocity : limot->m_targetVelocity;
+ calculateJacobi(limot, transA, transB, info, srow, ax1, rotational, rotAllowed);
+ btScalar targetvelocity = error < 0 ? -limot->m_targetVelocity : limot->m_targetVelocity;
btScalar tag_vel = -targetvelocity;
btScalar mot_fact;
- if(error != 0)
+ if (error != 0)
{
btScalar lowLimit;
btScalar hiLimit;
- if(limot->m_loLimit > limot->m_hiLimit)
+ if (limot->m_loLimit > limot->m_hiLimit)
{
lowLimit = error > 0 ? curServoTarget : -SIMD_INFINITY;
- hiLimit = error < 0 ? curServoTarget : SIMD_INFINITY;
+ hiLimit = error < 0 ? curServoTarget : SIMD_INFINITY;
}
else
{
- lowLimit = error > 0 && curServoTarget>limot->m_loLimit ? curServoTarget : limot->m_loLimit;
- hiLimit = error < 0 && curServoTarget<limot->m_hiLimit ? curServoTarget : limot->m_hiLimit;
+ lowLimit = error > 0 && curServoTarget > limot->m_loLimit ? curServoTarget : limot->m_loLimit;
+ hiLimit = error < 0 && curServoTarget < limot->m_hiLimit ? curServoTarget : limot->m_hiLimit;
}
mot_fact = getMotorFactor(limot->m_currentPosition, lowLimit, hiLimit, tag_vel, info->fps * limot->m_motorERP);
- }
- else
+ }
+ else
{
mot_fact = 0;
}
@@ -779,7 +807,7 @@ int btGeneric6DofSpring2Constraint::get_limit_motor_info2(
if (limot->m_enableSpring)
{
btScalar error = limot->m_currentPosition - limot->m_equilibriumPoint;
- calculateJacobi(limot,transA,transB,info,srow,ax1,rotational,rotAllowed);
+ calculateJacobi(limot, transA, transB, info, srow, ax1, rotational, rotAllowed);
//btScalar cfm = 1.0 / ((1.0/info->fps)*limot->m_springStiffness+ limot->m_springDamping);
//if(cfm > 0.99999)
@@ -792,34 +820,46 @@ int btGeneric6DofSpring2Constraint::get_limit_motor_info2(
btScalar dt = BT_ONE / info->fps;
btScalar kd = limot->m_springDamping;
btScalar ks = limot->m_springStiffness;
- btScalar vel = rotational ? angVelA.dot(ax1) - angVelB.dot(ax1) : linVelA.dot(ax1) - linVelB.dot(ax1);
-// btScalar erp = 0.1;
+ btScalar vel;
+ if (rotational)
+ {
+ vel = angVelA.dot(ax1) - angVelB.dot(ax1);
+ }
+ else
+ {
+ btVector3 tanVelA = angVelA.cross(m_calculatedTransformA.getOrigin() - transA.getOrigin());
+ btVector3 tanVelB = angVelB.cross(m_calculatedTransformB.getOrigin() - transB.getOrigin());
+ vel = (linVelA + tanVelA).dot(ax1) - (linVelB + tanVelB).dot(ax1);
+ }
btScalar cfm = BT_ZERO;
btScalar mA = BT_ONE / m_rbA.getInvMass();
btScalar mB = BT_ONE / m_rbB.getInvMass();
- if (rotational) {
+ if (rotational)
+ {
btScalar rrA = (m_calculatedTransformA.getOrigin() - transA.getOrigin()).length2();
btScalar rrB = (m_calculatedTransformB.getOrigin() - transB.getOrigin()).length2();
if (m_rbA.getInvMass()) mA = mA * rrA + 1 / (m_rbA.getInvInertiaTensorWorld() * ax1).length();
if (m_rbB.getInvMass()) mB = mB * rrB + 1 / (m_rbB.getInvInertiaTensorWorld() * ax1).length();
}
- btScalar m = mA > mB ? mB : mA;
+ btScalar m;
+ if (m_rbA.getInvMass() == 0) m = mB; else
+ if (m_rbB.getInvMass() == 0) m = mA; else
+ m = mA*mB / (mA + mB);
btScalar angularfreq = sqrt(ks / m);
-
//limit stiffness (the spring should not be sampled faster that the quarter of its angular frequency)
- if(limot->m_springStiffnessLimited && 0.25 < angularfreq * dt)
+ if (limot->m_springStiffnessLimited && 0.25 < angularfreq * dt)
{
ks = BT_ONE / dt / dt / btScalar(16.0) * m;
}
//avoid damping that would blow up the spring
- if(limot->m_springDampingLimited && kd * dt > m)
+ if (limot->m_springDampingLimited && kd * dt > m)
{
kd = m / dt;
}
btScalar fs = ks * error * dt;
btScalar fd = -kd * (vel) * (rotational ? -1 : 1) * dt;
- btScalar f = (fs+fd);
+ btScalar f = (fs + fd);
// after the spring force affecting the body(es) the new velocity will be
// vel + f / m * (rotational ? -1 : 1)
@@ -828,15 +868,18 @@ int btGeneric6DofSpring2Constraint::get_limit_motor_info2(
// however in practice any value is fine as long as it is greater then the "proper" velocity,
// because the m_lowerLimit and the m_upperLimit will determinate the strength of the final pulling force
// so it is much simpler (and more robust) just to simply use inf (with the proper sign)
+ // (Even with our best intent the "new" velocity is only an estimation. If we underestimate
+ // the "proper" velocity that will weaken the spring, however if we overestimate it, it doesn't
+ // matter, because the solver will limit it according the force limit)
// you may also wonder what if the current velocity (vel) so high that the pulling force will not change its direction (in this iteration)
// will we not request a velocity with the wrong direction ?
- // and the answare is not, because in practice during the solving the current velocity is subtracted from the m_constraintError
+ // and the answer is not, because in practice during the solving the current velocity is subtracted from the m_constraintError
// so the sign of the force that is really matters
info->m_constraintError[srow] = (rotational ? -1 : 1) * (f < 0 ? -SIMD_INFINITY : SIMD_INFINITY);
btScalar minf = f < fd ? f : fd;
btScalar maxf = f < fd ? fd : f;
- if(!rotational)
+ if (!rotational)
{
info->m_lowerLimit[srow] = minf > 0 ? 0 : minf;
info->m_upperLimit[srow] = maxf < 0 ? 0 : maxf;
@@ -855,56 +898,55 @@ int btGeneric6DofSpring2Constraint::get_limit_motor_info2(
return count;
}
-
-//override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5).
+//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.
void btGeneric6DofSpring2Constraint::setParam(int num, btScalar value, int axis)
{
- if((axis >= 0) && (axis < 3))
+ if ((axis >= 0) && (axis < 3))
{
- switch(num)
+ switch (num)
{
- case BT_CONSTRAINT_STOP_ERP :
+ case BT_CONSTRAINT_STOP_ERP:
m_linearLimits.m_stopERP[axis] = value;
m_flags |= BT_6DOF_FLAGS_ERP_STOP2 << (axis * BT_6DOF_FLAGS_AXIS_SHIFT2);
break;
- case BT_CONSTRAINT_STOP_CFM :
+ case BT_CONSTRAINT_STOP_CFM:
m_linearLimits.m_stopCFM[axis] = value;
m_flags |= BT_6DOF_FLAGS_CFM_STOP2 << (axis * BT_6DOF_FLAGS_AXIS_SHIFT2);
break;
- case BT_CONSTRAINT_ERP :
+ case BT_CONSTRAINT_ERP:
m_linearLimits.m_motorERP[axis] = value;
m_flags |= BT_6DOF_FLAGS_ERP_MOTO2 << (axis * BT_6DOF_FLAGS_AXIS_SHIFT2);
break;
- case BT_CONSTRAINT_CFM :
+ case BT_CONSTRAINT_CFM:
m_linearLimits.m_motorCFM[axis] = value;
m_flags |= BT_6DOF_FLAGS_CFM_MOTO2 << (axis * BT_6DOF_FLAGS_AXIS_SHIFT2);
break;
- default :
+ default:
btAssertConstrParams(0);
}
}
- else if((axis >=3) && (axis < 6))
+ else if ((axis >= 3) && (axis < 6))
{
- switch(num)
+ switch (num)
{
- case BT_CONSTRAINT_STOP_ERP :
+ case BT_CONSTRAINT_STOP_ERP:
m_angularLimits[axis - 3].m_stopERP = value;
m_flags |= BT_6DOF_FLAGS_ERP_STOP2 << (axis * BT_6DOF_FLAGS_AXIS_SHIFT2);
break;
- case BT_CONSTRAINT_STOP_CFM :
+ case BT_CONSTRAINT_STOP_CFM:
m_angularLimits[axis - 3].m_stopCFM = value;
m_flags |= BT_6DOF_FLAGS_CFM_STOP2 << (axis * BT_6DOF_FLAGS_AXIS_SHIFT2);
break;
- case BT_CONSTRAINT_ERP :
+ case BT_CONSTRAINT_ERP:
m_angularLimits[axis - 3].m_motorERP = value;
m_flags |= BT_6DOF_FLAGS_ERP_MOTO2 << (axis * BT_6DOF_FLAGS_AXIS_SHIFT2);
break;
- case BT_CONSTRAINT_CFM :
+ case BT_CONSTRAINT_CFM:
m_angularLimits[axis - 3].m_motorCFM = value;
m_flags |= BT_6DOF_FLAGS_CFM_MOTO2 << (axis * BT_6DOF_FLAGS_AXIS_SHIFT2);
break;
- default :
+ default:
btAssertConstrParams(0);
}
}
@@ -915,54 +957,54 @@ void btGeneric6DofSpring2Constraint::setParam(int num, btScalar value, int axis)
}
//return the local value of parameter
-btScalar btGeneric6DofSpring2Constraint::getParam(int num, int axis) const
+btScalar btGeneric6DofSpring2Constraint::getParam(int num, int axis) const
{
btScalar retVal = 0;
- if((axis >= 0) && (axis < 3))
+ if ((axis >= 0) && (axis < 3))
{
- switch(num)
+ switch (num)
{
- case BT_CONSTRAINT_STOP_ERP :
+ case BT_CONSTRAINT_STOP_ERP:
btAssertConstrParams(m_flags & (BT_6DOF_FLAGS_ERP_STOP2 << (axis * BT_6DOF_FLAGS_AXIS_SHIFT2)));
retVal = m_linearLimits.m_stopERP[axis];
break;
- case BT_CONSTRAINT_STOP_CFM :
+ case BT_CONSTRAINT_STOP_CFM:
btAssertConstrParams(m_flags & (BT_6DOF_FLAGS_CFM_STOP2 << (axis * BT_6DOF_FLAGS_AXIS_SHIFT2)));
retVal = m_linearLimits.m_stopCFM[axis];
break;
- case BT_CONSTRAINT_ERP :
+ case BT_CONSTRAINT_ERP:
btAssertConstrParams(m_flags & (BT_6DOF_FLAGS_ERP_MOTO2 << (axis * BT_6DOF_FLAGS_AXIS_SHIFT2)));
retVal = m_linearLimits.m_motorERP[axis];
break;
- case BT_CONSTRAINT_CFM :
+ case BT_CONSTRAINT_CFM:
btAssertConstrParams(m_flags & (BT_6DOF_FLAGS_CFM_MOTO2 << (axis * BT_6DOF_FLAGS_AXIS_SHIFT2)));
retVal = m_linearLimits.m_motorCFM[axis];
break;
- default :
+ default:
btAssertConstrParams(0);
}
}
- else if((axis >=3) && (axis < 6))
+ else if ((axis >= 3) && (axis < 6))
{
- switch(num)
+ switch (num)
{
- case BT_CONSTRAINT_STOP_ERP :
+ case BT_CONSTRAINT_STOP_ERP:
btAssertConstrParams(m_flags & (BT_6DOF_FLAGS_ERP_STOP2 << (axis * BT_6DOF_FLAGS_AXIS_SHIFT2)));
retVal = m_angularLimits[axis - 3].m_stopERP;
break;
- case BT_CONSTRAINT_STOP_CFM :
+ case BT_CONSTRAINT_STOP_CFM:
btAssertConstrParams(m_flags & (BT_6DOF_FLAGS_CFM_STOP2 << (axis * BT_6DOF_FLAGS_AXIS_SHIFT2)));
retVal = m_angularLimits[axis - 3].m_stopCFM;
break;
- case BT_CONSTRAINT_ERP :
+ case BT_CONSTRAINT_ERP:
btAssertConstrParams(m_flags & (BT_6DOF_FLAGS_ERP_MOTO2 << (axis * BT_6DOF_FLAGS_AXIS_SHIFT2)));
retVal = m_angularLimits[axis - 3].m_motorERP;
break;
- case BT_CONSTRAINT_CFM :
+ case BT_CONSTRAINT_CFM:
btAssertConstrParams(m_flags & (BT_6DOF_FLAGS_CFM_MOTO2 << (axis * BT_6DOF_FLAGS_AXIS_SHIFT2)));
retVal = m_angularLimits[axis - 3].m_motorCFM;
break;
- default :
+ default:
btAssertConstrParams(0);
}
}
@@ -973,31 +1015,29 @@ btScalar btGeneric6DofSpring2Constraint::getParam(int num, int axis) const
return retVal;
}
-
-
-void btGeneric6DofSpring2Constraint::setAxis(const btVector3& axis1,const btVector3& axis2)
+void btGeneric6DofSpring2Constraint::setAxis(const btVector3& axis1, const btVector3& axis2)
{
btVector3 zAxis = axis1.normalized();
btVector3 yAxis = axis2.normalized();
- btVector3 xAxis = yAxis.cross(zAxis); // we want right coordinate system
-
+ btVector3 xAxis = yAxis.cross(zAxis); // we want right coordinate system
+
btTransform frameInW;
frameInW.setIdentity();
- frameInW.getBasis().setValue( xAxis[0], yAxis[0], zAxis[0],
- xAxis[1], yAxis[1], zAxis[1],
- xAxis[2], yAxis[2], zAxis[2]);
-
+ frameInW.getBasis().setValue(xAxis[0], yAxis[0], zAxis[0],
+ xAxis[1], yAxis[1], zAxis[1],
+ xAxis[2], yAxis[2], zAxis[2]);
+
// now get constraint frame in local coordinate systems
m_frameInA = m_rbA.getCenterOfMassTransform().inverse() * frameInW;
m_frameInB = m_rbB.getCenterOfMassTransform().inverse() * frameInW;
-
+
calculateTransforms();
}
void btGeneric6DofSpring2Constraint::setBounce(int index, btScalar bounce)
{
btAssert((index >= 0) && (index < 6));
- if (index<3)
+ if (index < 3)
m_linearLimits.m_bounce[index] = bounce;
else
m_angularLimits[index - 3].m_bounce = bounce;
@@ -1006,7 +1046,7 @@ void btGeneric6DofSpring2Constraint::setBounce(int index, btScalar bounce)
void btGeneric6DofSpring2Constraint::enableMotor(int index, bool onOff)
{
btAssert((index >= 0) && (index < 6));
- if (index<3)
+ if (index < 3)
m_linearLimits.m_enableMotor[index] = onOff;
else
m_angularLimits[index - 3].m_enableMotor = onOff;
@@ -1015,7 +1055,7 @@ void btGeneric6DofSpring2Constraint::enableMotor(int index, bool onOff)
void btGeneric6DofSpring2Constraint::setServo(int index, bool onOff)
{
btAssert((index >= 0) && (index < 6));
- if (index<3)
+ if (index < 3)
m_linearLimits.m_servoMotor[index] = onOff;
else
m_angularLimits[index - 3].m_servoMotor = onOff;
@@ -1024,18 +1064,16 @@ void btGeneric6DofSpring2Constraint::setServo(int index, bool onOff)
void btGeneric6DofSpring2Constraint::setTargetVelocity(int index, btScalar velocity)
{
btAssert((index >= 0) && (index < 6));
- if (index<3)
+ if (index < 3)
m_linearLimits.m_targetVelocity[index] = velocity;
else
m_angularLimits[index - 3].m_targetVelocity = velocity;
}
-
-
void btGeneric6DofSpring2Constraint::setServoTarget(int index, btScalar targetOrg)
{
btAssert((index >= 0) && (index < 6));
- if (index<3)
+ if (index < 3)
{
m_linearLimits.m_servoTarget[index] = targetOrg;
}
@@ -1044,23 +1082,24 @@ void btGeneric6DofSpring2Constraint::setServoTarget(int index, btScalar targetOr
//wrap between -PI and PI, see also
//https://stackoverflow.com/questions/4633177/c-how-to-wrap-a-float-to-the-interval-pi-pi
- btScalar target = targetOrg+SIMD_PI;
+ btScalar target = targetOrg + SIMD_PI;
if (1)
{
- btScalar m = target - SIMD_2_PI * floor(target/SIMD_2_PI);
+ btScalar m = target - SIMD_2_PI * floor(target / SIMD_2_PI);
// handle boundary cases resulted from floating-point cut off:
{
- if (m>=SIMD_2_PI)
+ if (m >= SIMD_2_PI)
{
target = 0;
- } else
+ }
+ else
{
- if (m<0 )
+ if (m < 0)
{
- if (SIMD_2_PI+m == SIMD_2_PI)
+ if (SIMD_2_PI + m == SIMD_2_PI)
target = 0;
else
- target = SIMD_2_PI+m;
+ target = SIMD_2_PI + m;
}
else
{
@@ -1070,7 +1109,7 @@ void btGeneric6DofSpring2Constraint::setServoTarget(int index, btScalar targetOr
}
target -= SIMD_PI;
}
-
+
m_angularLimits[index - 3].m_servoTarget = target;
}
}
@@ -1078,7 +1117,7 @@ void btGeneric6DofSpring2Constraint::setServoTarget(int index, btScalar targetOr
void btGeneric6DofSpring2Constraint::setMaxMotorForce(int index, btScalar force)
{
btAssert((index >= 0) && (index < 6));
- if (index<3)
+ if (index < 3)
m_linearLimits.m_maxMotorForce[index] = force;
else
m_angularLimits[index - 3].m_maxMotorForce = force;
@@ -1087,19 +1126,22 @@ void btGeneric6DofSpring2Constraint::setMaxMotorForce(int index, btScalar force)
void btGeneric6DofSpring2Constraint::enableSpring(int index, bool onOff)
{
btAssert((index >= 0) && (index < 6));
- if (index<3)
+ if (index < 3)
m_linearLimits.m_enableSpring[index] = onOff;
else
- m_angularLimits[index - 3] .m_enableSpring = onOff;
+ m_angularLimits[index - 3].m_enableSpring = onOff;
}
void btGeneric6DofSpring2Constraint::setStiffness(int index, btScalar stiffness, bool limitIfNeeded)
{
btAssert((index >= 0) && (index < 6));
- if (index<3) {
+ if (index < 3)
+ {
m_linearLimits.m_springStiffness[index] = stiffness;
m_linearLimits.m_springStiffnessLimited[index] = limitIfNeeded;
- } else {
+ }
+ else
+ {
m_angularLimits[index - 3].m_springStiffness = stiffness;
m_angularLimits[index - 3].m_springStiffnessLimited = limitIfNeeded;
}
@@ -1108,10 +1150,13 @@ void btGeneric6DofSpring2Constraint::setStiffness(int index, btScalar stiffness,
void btGeneric6DofSpring2Constraint::setDamping(int index, btScalar damping, bool limitIfNeeded)
{
btAssert((index >= 0) && (index < 6));
- if (index<3) {
+ if (index < 3)
+ {
m_linearLimits.m_springDamping[index] = damping;
m_linearLimits.m_springDampingLimited[index] = limitIfNeeded;
- } else {
+ }
+ else
+ {
m_angularLimits[index - 3].m_springDamping = damping;
m_angularLimits[index - 3].m_springDampingLimited = limitIfNeeded;
}
@@ -1121,9 +1166,9 @@ void btGeneric6DofSpring2Constraint::setEquilibriumPoint()
{
calculateTransforms();
int i;
- for( i = 0; i < 3; i++)
+ for (i = 0; i < 3; i++)
m_linearLimits.m_equilibriumPoint[i] = m_calculatedLinearDiff[i];
- for(i = 0; i < 3; i++)
+ for (i = 0; i < 3; i++)
m_angularLimits[i].m_equilibriumPoint = m_calculatedAxisAngleDiff[i];
}
@@ -1131,35 +1176,38 @@ void btGeneric6DofSpring2Constraint::setEquilibriumPoint(int index)
{
btAssert((index >= 0) && (index < 6));
calculateTransforms();
- if (index<3)
+ if (index < 3)
m_linearLimits.m_equilibriumPoint[index] = m_calculatedLinearDiff[index];
else
- m_angularLimits[index - 3] .m_equilibriumPoint = m_calculatedAxisAngleDiff[index - 3];
+ m_angularLimits[index - 3].m_equilibriumPoint = m_calculatedAxisAngleDiff[index - 3];
}
void btGeneric6DofSpring2Constraint::setEquilibriumPoint(int index, btScalar val)
{
btAssert((index >= 0) && (index < 6));
- if (index<3)
+ if (index < 3)
m_linearLimits.m_equilibriumPoint[index] = val;
else
- m_angularLimits[index - 3] .m_equilibriumPoint = val;
+ m_angularLimits[index - 3].m_equilibriumPoint = val;
}
-
//////////////////////////// btRotationalLimitMotor2 ////////////////////////////////////
void btRotationalLimitMotor2::testLimitValue(btScalar test_value)
{
//we can't normalize the angles here because we would lost the sign that we use later, but it doesn't seem to be a problem
- if(m_loLimit > m_hiLimit) {
+ if (m_loLimit > m_hiLimit)
+ {
m_currentLimit = 0;
m_currentLimitError = btScalar(0.f);
}
- else if(m_loLimit == m_hiLimit) {
+ else if (m_loLimit == m_hiLimit)
+ {
m_currentLimitError = test_value - m_loLimit;
m_currentLimit = 3;
- } else {
+ }
+ else
+ {
m_currentLimitError = test_value - m_loLimit;
m_currentLimitErrorHi = test_value - m_hiLimit;
m_currentLimit = 4;
@@ -1172,18 +1220,20 @@ void btTranslationalLimitMotor2::testLimitValue(int limitIndex, btScalar test_va
{
btScalar loLimit = m_lowerLimit[limitIndex];
btScalar hiLimit = m_upperLimit[limitIndex];
- if(loLimit > hiLimit) {
+ if (loLimit > hiLimit)
+ {
m_currentLimitError[limitIndex] = 0;
m_currentLimit[limitIndex] = 0;
}
- else if(loLimit == hiLimit) {
+ else if (loLimit == hiLimit)
+ {
m_currentLimitError[limitIndex] = test_value - loLimit;
m_currentLimit[limitIndex] = 3;
- } else {
+ }
+ else
+ {
m_currentLimitError[limitIndex] = test_value - loLimit;
m_currentLimitErrorHi[limitIndex] = test_value - hiLimit;
m_currentLimit[limitIndex] = 4;
}
}
-
-
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.h b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.h
index 1b8d0eace9..bc3ee6d210 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.h
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.h
@@ -37,7 +37,6 @@ email: projectileman@yahoo.com
http://gimpact.sf.net
*/
-
#ifndef BT_GENERIC_6DOF_CONSTRAINT2_H
#define BT_GENERIC_6DOF_CONSTRAINT2_H
@@ -47,18 +46,17 @@ http://gimpact.sf.net
class btRigidBody;
-
#ifdef BT_USE_DOUBLE_PRECISION
-#define btGeneric6DofSpring2ConstraintData2 btGeneric6DofSpring2ConstraintDoubleData2
-#define btGeneric6DofSpring2ConstraintDataName "btGeneric6DofSpring2ConstraintDoubleData2"
+#define btGeneric6DofSpring2ConstraintData2 btGeneric6DofSpring2ConstraintDoubleData2
+#define btGeneric6DofSpring2ConstraintDataName "btGeneric6DofSpring2ConstraintDoubleData2"
#else
-#define btGeneric6DofSpring2ConstraintData2 btGeneric6DofSpring2ConstraintData
-#define btGeneric6DofSpring2ConstraintDataName "btGeneric6DofSpring2ConstraintData"
-#endif //BT_USE_DOUBLE_PRECISION
+#define btGeneric6DofSpring2ConstraintData2 btGeneric6DofSpring2ConstraintData
+#define btGeneric6DofSpring2ConstraintDataName "btGeneric6DofSpring2ConstraintData"
+#endif //BT_USE_DOUBLE_PRECISION
enum RotateOrder
{
- RO_XYZ=0,
+ RO_XYZ = 0,
RO_XZY,
RO_YXZ,
RO_YZX,
@@ -69,9 +67,9 @@ enum RotateOrder
class btRotationalLimitMotor2
{
public:
-// upper < lower means free
-// upper == lower means locked
-// upper > lower means limited
+ // upper < lower means free
+ // upper == lower means locked
+ // upper > lower means limited
btScalar m_loLimit;
btScalar m_hiLimit;
btScalar m_bounce;
@@ -79,95 +77,92 @@ public:
btScalar m_stopCFM;
btScalar m_motorERP;
btScalar m_motorCFM;
- bool m_enableMotor;
+ bool m_enableMotor;
btScalar m_targetVelocity;
btScalar m_maxMotorForce;
- bool m_servoMotor;
+ bool m_servoMotor;
btScalar m_servoTarget;
- bool m_enableSpring;
+ bool m_enableSpring;
btScalar m_springStiffness;
- bool m_springStiffnessLimited;
+ bool m_springStiffnessLimited;
btScalar m_springDamping;
- bool m_springDampingLimited;
+ bool m_springDampingLimited;
btScalar m_equilibriumPoint;
btScalar m_currentLimitError;
btScalar m_currentLimitErrorHi;
btScalar m_currentPosition;
- int m_currentLimit;
+ 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_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_springDamping = 0;
+ m_springDampingLimited = false;
+ m_equilibriumPoint = 0;
- m_currentLimitError = 0;
+ m_currentLimitError = 0;
m_currentLimitErrorHi = 0;
- m_currentPosition = 0;
- m_currentLimit = 0;
+ m_currentPosition = 0;
+ m_currentLimit = 0;
}
- btRotationalLimitMotor2(const btRotationalLimitMotor2 & limot)
+ 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_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_springDamping = limot.m_springDamping;
+ m_springDampingLimited = limot.m_springDampingLimited;
+ m_equilibriumPoint = limot.m_equilibriumPoint;
- m_currentLimitError = limot.m_currentLimitError;
+ m_currentLimitError = limot.m_currentLimitError;
m_currentLimitErrorHi = limot.m_currentLimitErrorHi;
- m_currentPosition = limot.m_currentPosition;
- m_currentLimit = limot.m_currentLimit;
+ m_currentPosition = limot.m_currentPosition;
+ m_currentLimit = limot.m_currentLimit;
}
-
bool isLimited()
{
- if(m_loLimit > m_hiLimit) return false;
+ 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
+ // upper < lower means free
+ // upper == lower means locked
+ // upper > lower means limited
btVector3 m_lowerLimit;
btVector3 m_upperLimit;
btVector3 m_bounce;
@@ -175,14 +170,14 @@ public:
btVector3 m_stopCFM;
btVector3 m_motorERP;
btVector3 m_motorCFM;
- bool m_enableMotor[3];
- bool m_servoMotor[3];
- bool m_enableSpring[3];
+ bool m_enableMotor[3];
+ bool m_servoMotor[3];
+ bool m_enableSpring[3];
btVector3 m_servoTarget;
btVector3 m_springStiffness;
- bool m_springStiffnessLimited[3];
+ bool m_springStiffnessLimited[3];
btVector3 m_springDamping;
- bool m_springDampingLimited[3];
+ bool m_springDampingLimited[3];
btVector3 m_equilibriumPoint;
btVector3 m_targetVelocity;
btVector3 m_maxMotorForce;
@@ -190,69 +185,69 @@ public:
btVector3 m_currentLimitError;
btVector3 m_currentLimitErrorHi;
btVector3 m_currentLinearDiff;
- int m_currentLimit[3];
+ 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_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_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;
+ 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 )
+ 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_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;
+ m_currentLinearDiff = other.m_currentLinearDiff;
- for(int i=0; i < 3; i++)
+ 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_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_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];
+ m_currentLimit[i] = other.m_currentLimit[i];
}
}
@@ -269,15 +264,14 @@ 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_ERP_MOTO2 = 8,
};
-#define BT_6DOF_FLAGS_AXIS_SHIFT2 4 // bits per axis
+#define BT_6DOF_FLAGS_AXIS_SHIFT2 4 // bits per axis
-
-ATTRIBUTE_ALIGNED16(class) btGeneric6DofSpring2Constraint : public btTypedConstraint
+ATTRIBUTE_ALIGNED16(class)
+btGeneric6DofSpring2Constraint : public btTypedConstraint
{
protected:
-
btTransform m_frameInA;
btTransform m_frameInB;
@@ -290,45 +284,43 @@ protected:
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=(btGeneric6DofSpring2Constraint&)
+ 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=(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);
+ 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);
+ 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);
+ 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 void getInfo1(btConstraintInfo1 * info);
+ virtual void getInfo2(btConstraintInfo2 * info);
virtual int calculateSerializeBufferSize() const;
virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
@@ -336,19 +328,19 @@ public:
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(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; }
+ 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& getCalculatedTransformB() const { return m_calculatedTransformB; }
- const btTransform & getFrameOffsetA() const { return m_frameInA; }
- const btTransform & getFrameOffsetB() const { return m_frameInB; }
+ const btTransform& getFrameOffsetA() const { return m_frameInA; }
+ const btTransform& getFrameOffsetB() const { return m_frameInB; }
- btTransform & getFrameOffsetA() { return m_frameInA; }
- btTransform & getFrameOffsetB() { 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]; }
@@ -359,58 +351,58 @@ public:
// 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 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 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 getLinearUpperLimit(btVector3 & linearUpper) { linearUpper = m_linearLimits.m_upperLimit; }
void setAngularLowerLimit(const btVector3& angularLower)
{
- for(int i = 0; i < 3; i++)
+ 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++)
+ for (int i = 0; i < 3; i++)
m_angularLimits[i].m_hiLimit = btNormalizeAngle(-angularLower[i]);
}
- void getAngularLowerLimit(btVector3& angularLower)
+ void getAngularLowerLimit(btVector3 & angularLower)
{
- for(int i = 0; i < 3; i++)
+ for (int i = 0; i < 3; i++)
angularLower[i] = m_angularLimits[i].m_loLimit;
}
- void getAngularLowerLimitReversed(btVector3& angularLower)
+ void getAngularLowerLimitReversed(btVector3 & angularLower)
{
- for(int i = 0; i < 3; i++)
+ 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++)
+ 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++)
+ for (int i = 0; i < 3; i++)
m_angularLimits[i].m_loLimit = btNormalizeAngle(-angularUpper[i]);
}
- void getAngularUpperLimit(btVector3& angularUpper)
+ void getAngularUpperLimit(btVector3 & angularUpper)
{
- for(int i = 0; i < 3; i++)
+ for (int i = 0; i < 3; i++)
angularUpper[i] = m_angularLimits[i].m_hiLimit;
}
- void getAngularUpperLimitReversed(btVector3& angularUpper)
+ void getAngularUpperLimitReversed(btVector3 & angularUpper)
{
- for(int i = 0; i < 3; i++)
+ for (int i = 0; i < 3; i++)
angularUpper[i] = -m_angularLimits[i].m_loLimit;
}
@@ -418,7 +410,7 @@ public:
void setLimit(int axis, btScalar lo, btScalar hi)
{
- if(axis<3)
+ if (axis < 3)
{
m_linearLimits.m_lowerLimit[axis] = lo;
m_linearLimits.m_upperLimit[axis] = hi;
@@ -427,14 +419,14 @@ public:
{
lo = btNormalizeAngle(lo);
hi = btNormalizeAngle(hi);
- m_angularLimits[axis-3].m_loLimit = lo;
- m_angularLimits[axis-3].m_hiLimit = 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)
+ if (axis < 3)
{
m_linearLimits.m_lowerLimit[axis] = lo;
m_linearLimits.m_upperLimit[axis] = hi;
@@ -443,54 +435,53 @@ public:
{
lo = btNormalizeAngle(lo);
hi = btNormalizeAngle(hi);
- m_angularLimits[axis-3].m_hiLimit = -lo;
- m_angularLimits[axis-3].m_loLimit = -hi;
+ m_angularLimits[axis - 3].m_hiLimit = -lo;
+ m_angularLimits[axis - 3].m_loLimit = -hi;
}
}
bool isLimited(int limitIndex)
{
- if(limitIndex<3)
+ if (limitIndex < 3)
{
return m_linearLimits.isLimited(limitIndex);
}
- return m_angularLimits[limitIndex-3].isLimited();
+ 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 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 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 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).
+ //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);
-};
+ 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
{
@@ -511,12 +502,12 @@ struct btGeneric6DofSpring2ConstraintData
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];
+ 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;
@@ -531,13 +522,13 @@ struct btGeneric6DofSpring2ConstraintData
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];
+ char m_angularEnableMotor[4];
+ char m_angularServoMotor[4];
+ char m_angularEnableSpring[4];
+ char m_angularSpringStiffnessLimited[4];
+ char m_angularSpringDampingLimited[4];
- int m_rotateOrder;
+ int m_rotateOrder;
};
struct btGeneric6DofSpring2ConstraintDoubleData2
@@ -559,12 +550,12 @@ struct btGeneric6DofSpring2ConstraintDoubleData2
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];
+ 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;
@@ -579,13 +570,13 @@ struct btGeneric6DofSpring2ConstraintDoubleData2
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];
+ char m_angularEnableMotor[4];
+ char m_angularServoMotor[4];
+ char m_angularEnableSpring[4];
+ char m_angularSpringStiffnessLimited[4];
+ char m_angularSpringDampingLimited[4];
- int m_rotateOrder;
+ int m_rotateOrder;
};
SIMD_FORCE_INLINE int btGeneric6DofSpring2Constraint::calculateSerializeBufferSize() const
@@ -596,70 +587,70 @@ SIMD_FORCE_INLINE int btGeneric6DofSpring2Constraint::calculateSerializeBufferSi
SIMD_FORCE_INLINE const char* btGeneric6DofSpring2Constraint::serialize(void* dataBuffer, btSerializer* serializer) const
{
btGeneric6DofSpring2ConstraintData2* dof = (btGeneric6DofSpring2ConstraintData2*)dataBuffer;
- btTypedConstraint::serialize(&dof->m_typeConstraintData,serializer);
+ 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++)
+ 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_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_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++)
+ 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;
+ 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++)
+ 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_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;
@@ -672,8 +663,4 @@ SIMD_FORCE_INLINE const char* btGeneric6DofSpring2Constraint::serialize(void* da
return btGeneric6DofSpring2ConstraintDataName;
}
-
-
-
-
-#endif //BT_GENERIC_6DOF_CONSTRAINT_H
+#endif //BT_GENERIC_6DOF_CONSTRAINT_H
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.cpp b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.cpp
index 3f875989ea..8baf52bcd1 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.cpp
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.cpp
@@ -17,26 +17,23 @@ subject to the following restrictions:
#include "BulletDynamics/Dynamics/btRigidBody.h"
#include "LinearMath/btTransformUtil.h"
-
-btGeneric6DofSpringConstraint::btGeneric6DofSpringConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA)
+btGeneric6DofSpringConstraint::btGeneric6DofSpringConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB, bool useLinearReferenceFrameA)
: btGeneric6DofConstraint(rbA, rbB, frameInA, frameInB, useLinearReferenceFrameA)
{
- init();
+ init();
}
-
btGeneric6DofSpringConstraint::btGeneric6DofSpringConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameB)
- : btGeneric6DofConstraint(rbB, frameInB, useLinearReferenceFrameB)
+ : btGeneric6DofConstraint(rbB, frameInB, useLinearReferenceFrameB)
{
- init();
+ init();
}
-
void btGeneric6DofSpringConstraint::init()
{
m_objectType = D6_SPRING_CONSTRAINT_TYPE;
- for(int i = 0; i < 6; i++)
+ for (int i = 0; i < 6; i++)
{
m_springEnabled[i] = false;
m_equilibriumPoint[i] = btScalar(0.f);
@@ -45,12 +42,11 @@ void btGeneric6DofSpringConstraint::init()
}
}
-
void btGeneric6DofSpringConstraint::enableSpring(int index, bool onOff)
{
btAssert((index >= 0) && (index < 6));
m_springEnabled[index] = onOff;
- if(index < 3)
+ if (index < 3)
{
m_linearLimits.m_enableMotor[index] = onOff;
}
@@ -60,44 +56,38 @@ void btGeneric6DofSpringConstraint::enableSpring(int index, bool onOff)
}
}
-
-
void btGeneric6DofSpringConstraint::setStiffness(int index, btScalar stiffness)
{
btAssert((index >= 0) && (index < 6));
m_springStiffness[index] = stiffness;
}
-
void btGeneric6DofSpringConstraint::setDamping(int index, btScalar damping)
{
btAssert((index >= 0) && (index < 6));
m_springDamping[index] = damping;
}
-
void btGeneric6DofSpringConstraint::setEquilibriumPoint()
{
calculateTransforms();
int i;
- for( i = 0; i < 3; i++)
+ for (i = 0; i < 3; i++)
{
m_equilibriumPoint[i] = m_calculatedLinearDiff[i];
}
- for(i = 0; i < 3; i++)
+ for (i = 0; i < 3; i++)
{
m_equilibriumPoint[i + 3] = m_calculatedAxisAngleDiff[i];
}
}
-
-
void btGeneric6DofSpringConstraint::setEquilibriumPoint(int index)
{
btAssert((index >= 0) && (index < 6));
calculateTransforms();
- if(index < 3)
+ if (index < 3)
{
m_equilibriumPoint[index] = m_calculatedLinearDiff[index];
}
@@ -113,15 +103,14 @@ void btGeneric6DofSpringConstraint::setEquilibriumPoint(int index, btScalar val)
m_equilibriumPoint[index] = val;
}
-
void btGeneric6DofSpringConstraint::internalUpdateSprings(btConstraintInfo2* info)
{
// it is assumed that calculateTransforms() have been called before this call
int i;
//btVector3 relVel = m_rbB.getLinearVelocity() - m_rbA.getLinearVelocity();
- for(i = 0; i < 3; i++)
+ for (i = 0; i < 3; i++)
{
- if(m_springEnabled[i])
+ if (m_springEnabled[i])
{
// get current position of constraint
btScalar currPos = m_calculatedLinearDiff[i];
@@ -130,28 +119,27 @@ void btGeneric6DofSpringConstraint::internalUpdateSprings(btConstraintInfo2* inf
// spring force is (delta * m_stiffness) according to Hooke's Law
btScalar force = delta * m_springStiffness[i];
btScalar velFactor = info->fps * m_springDamping[i] / btScalar(info->m_numIterations);
- m_linearLimits.m_targetVelocity[i] = velFactor * force;
- m_linearLimits.m_maxMotorForce[i] = btFabs(force);
+ m_linearLimits.m_targetVelocity[i] = velFactor * force;
+ m_linearLimits.m_maxMotorForce[i] = btFabs(force);
}
}
- for(i = 0; i < 3; i++)
+ for (i = 0; i < 3; i++)
{
- if(m_springEnabled[i + 3])
+ if (m_springEnabled[i + 3])
{
// get current position of constraint
btScalar currPos = m_calculatedAxisAngleDiff[i];
// calculate difference
- btScalar delta = currPos - m_equilibriumPoint[i+3];
+ btScalar delta = currPos - m_equilibriumPoint[i + 3];
// spring force is (-delta * m_stiffness) according to Hooke's Law
- btScalar force = -delta * m_springStiffness[i+3];
- btScalar velFactor = info->fps * m_springDamping[i+3] / btScalar(info->m_numIterations);
+ btScalar force = -delta * m_springStiffness[i + 3];
+ btScalar velFactor = info->fps * m_springDamping[i + 3] / btScalar(info->m_numIterations);
m_angularLimits[i].m_targetVelocity = velFactor * force;
m_angularLimits[i].m_maxMotorForce = btFabs(force);
}
}
}
-
void btGeneric6DofSpringConstraint::getInfo2(btConstraintInfo2* info)
{
// this will be called by constraint solver at the constraint setup stage
@@ -161,25 +149,21 @@ void btGeneric6DofSpringConstraint::getInfo2(btConstraintInfo2* info)
btGeneric6DofConstraint::getInfo2(info);
}
-
-void btGeneric6DofSpringConstraint::setAxis(const btVector3& axis1,const btVector3& axis2)
+void btGeneric6DofSpringConstraint::setAxis(const btVector3& axis1, const btVector3& axis2)
{
btVector3 zAxis = axis1.normalized();
btVector3 yAxis = axis2.normalized();
- btVector3 xAxis = yAxis.cross(zAxis); // we want right coordinate system
+ btVector3 xAxis = yAxis.cross(zAxis); // we want right coordinate system
btTransform frameInW;
frameInW.setIdentity();
- frameInW.getBasis().setValue( xAxis[0], yAxis[0], zAxis[0],
- xAxis[1], yAxis[1], zAxis[1],
- xAxis[2], yAxis[2], zAxis[2]);
+ frameInW.getBasis().setValue(xAxis[0], yAxis[0], zAxis[0],
+ xAxis[1], yAxis[1], zAxis[1],
+ xAxis[2], yAxis[2], zAxis[2]);
// now get constraint frame in local coordinate systems
m_frameInA = m_rbA.getCenterOfMassTransform().inverse() * frameInW;
m_frameInB = m_rbB.getCenterOfMassTransform().inverse() * frameInW;
- calculateTransforms();
+ calculateTransforms();
}
-
-
-
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h
index dac59c6889..02b9d4d05d 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h
@@ -16,20 +16,17 @@ subject to the following restrictions:
#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"
+#define btGeneric6DofSpringConstraintData2 btGeneric6DofSpringConstraintDoubleData2
+#define btGeneric6DofSpringConstraintDataName "btGeneric6DofSpringConstraintDoubleData2"
#else
-#define btGeneric6DofSpringConstraintData2 btGeneric6DofSpringConstraintData
-#define btGeneric6DofSpringConstraintDataName "btGeneric6DofSpringConstraintData"
-#endif //BT_USE_DOUBLE_PRECISION
-
-
+#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
@@ -41,101 +38,98 @@ subject to the following restrictions:
/// 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
+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)
+ 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:
-
+ 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);
+
+ 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(); // 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];
+ return m_springEnabled[index];
}
btScalar getStiffness(int index) const
{
- return m_springStiffness[index];
+ return m_springStiffness[index];
}
btScalar getDamping(int index) const
{
- return m_springDamping[index];
+ return m_springDamping[index];
}
btScalar getEquilibriumPoint(int index) const
{
- return m_equilibriumPoint[index];
+ return m_equilibriumPoint[index];
}
- virtual void setAxis( const btVector3& axis1, const btVector3& axis2);
+ virtual void setAxis(const btVector3& axis1, const btVector3& axis2);
- virtual void getInfo2 (btConstraintInfo2* info);
+ virtual void getInfo2(btConstraintInfo2 * info);
- virtual int calculateSerializeBufferSize() 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;
-
+ 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];
+ 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];
-};
+ 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
+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
+///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);
+ btGeneric6DofConstraint::serialize(&dof->m_6dofData, serializer);
int i;
- for (i=0;i<6;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_springEnabled[i] = m_springEnabled[i] ? 1 : 0;
dof->m_springStiffness[i] = m_springStiffness[i];
}
return btGeneric6DofSpringConstraintDataName;
}
-#endif // BT_GENERIC_6DOF_SPRING_CONSTRAINT_H
-
+#endif // BT_GENERIC_6DOF_SPRING_CONSTRAINT_H
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btHinge2Constraint.cpp b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btHinge2Constraint.cpp
index 4be2aabe4d..6507e1a0a7 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btHinge2Constraint.cpp
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btHinge2Constraint.cpp
@@ -13,54 +13,49 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
-
#include "btHinge2Constraint.h"
#include "BulletDynamics/Dynamics/btRigidBody.h"
#include "LinearMath/btTransformUtil.h"
-
-
// constructor
// anchor, axis1 and axis2 are in world coordinate system
// axis1 must be orthogonal to axis2
btHinge2Constraint::btHinge2Constraint(btRigidBody& rbA, btRigidBody& rbB, btVector3& anchor, btVector3& axis1, btVector3& axis2)
-: btGeneric6DofSpring2Constraint(rbA, rbB, btTransform::getIdentity(), btTransform::getIdentity(),RO_XYZ),
- m_anchor(anchor),
- m_axis1(axis1),
- m_axis2(axis2)
+ : btGeneric6DofSpring2Constraint(rbA, rbB, btTransform::getIdentity(), btTransform::getIdentity(), RO_XYZ),
+ m_anchor(anchor),
+ m_axis1(axis1),
+ m_axis2(axis2)
{
// build frame basis
// 6DOF constraint uses Euler angles and to define limits
// it is assumed that rotational order is :
// Z - first, allowed limits are (-PI,PI);
- // new position of Y - second (allowed limits are (-PI/2 + epsilon, PI/2 - epsilon), where epsilon is a small positive number
+ // new position of Y - second (allowed limits are (-PI/2 + epsilon, PI/2 - epsilon), where epsilon is a small positive number
// used to prevent constraint from instability on poles;
// new position of X, allowed limits are (-PI,PI);
// So to simulate ODE Universal joint we should use parent axis as Z, child axis as Y and limit all other DOFs
// Build the frame in world coordinate system first
btVector3 zAxis = axis1.normalize();
btVector3 xAxis = axis2.normalize();
- btVector3 yAxis = zAxis.cross(xAxis); // we want right coordinate system
+ btVector3 yAxis = zAxis.cross(xAxis); // we want right coordinate system
btTransform frameInW;
frameInW.setIdentity();
- frameInW.getBasis().setValue( xAxis[0], yAxis[0], zAxis[0],
- xAxis[1], yAxis[1], zAxis[1],
- xAxis[2], yAxis[2], zAxis[2]);
+ frameInW.getBasis().setValue(xAxis[0], yAxis[0], zAxis[0],
+ xAxis[1], yAxis[1], zAxis[1],
+ xAxis[2], yAxis[2], zAxis[2]);
frameInW.setOrigin(anchor);
// now get constraint frame in local coordinate systems
m_frameInA = rbA.getCenterOfMassTransform().inverse() * frameInW;
m_frameInB = rbB.getCenterOfMassTransform().inverse() * frameInW;
// sei limits
setLinearLowerLimit(btVector3(0.f, 0.f, -1.f));
- setLinearUpperLimit(btVector3(0.f, 0.f, 1.f));
+ setLinearUpperLimit(btVector3(0.f, 0.f, 1.f));
// like front wheels of a car
- setAngularLowerLimit(btVector3(1.f, 0.f, -SIMD_HALF_PI * 0.5f));
- setAngularUpperLimit(btVector3(-1.f, 0.f, SIMD_HALF_PI * 0.5f));
+ setAngularLowerLimit(btVector3(1.f, 0.f, -SIMD_HALF_PI * 0.5f));
+ setAngularUpperLimit(btVector3(-1.f, 0.f, SIMD_HALF_PI * 0.5f));
// enable suspension
enableSpring(2, true);
setStiffness(2, SIMD_PI * SIMD_PI * 4.f);
setDamping(2, 0.01f);
setEquilibriumPoint();
}
-
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btHinge2Constraint.h b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btHinge2Constraint.h
index 06a8e3ecd1..95f604a890 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btHinge2Constraint.h
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btHinge2Constraint.h
@@ -16,32 +16,30 @@ subject to the following restrictions:
#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
+ATTRIBUTE_ALIGNED16(class)
+btHinge2Constraint : public btGeneric6DofSpring2Constraint
{
protected:
- btVector3 m_anchor;
- btVector3 m_axis1;
- btVector3 m_axis2;
+ btVector3 m_anchor;
+ btVector3 m_axis1;
+ btVector3 m_axis2;
+
public:
- BT_DECLARE_ALIGNED_ALLOCATOR();
-
+ 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);
+ 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(); }
@@ -51,10 +49,7 @@ public:
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)); }
+ void setLowerLimit(btScalar ang1min) { setAngularLowerLimit(btVector3(1.f, 0.f, ang1min)); }
};
-
-
-#endif // BT_HINGE2_CONSTRAINT_H
-
+#endif // BT_HINGE2_CONSTRAINT_H
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp
index 7e5e6f9e54..aa6f69000d 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp
@@ -13,7 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btHingeConstraint.h"
#include "BulletDynamics/Dynamics/btRigidBody.h"
#include "LinearMath/btTransformUtil.h"
@@ -21,8 +20,6 @@ subject to the following restrictions:
#include <new>
#include "btSolverBody.h"
-
-
//#define HINGE_USE_OBSOLETE_SOLVER false
#define HINGE_USE_OBSOLETE_SOLVER false
@@ -30,59 +27,60 @@ subject to the following restrictions:
#ifndef __SPU__
-
-
-
-
-btHingeConstraint::btHingeConstraint(btRigidBody& rbA,btRigidBody& rbB, const btVector3& pivotInA,const btVector3& pivotInB,
- const btVector3& axisInA,const btVector3& axisInB, bool useReferenceFrameA)
- :btTypedConstraint(HINGE_CONSTRAINT_TYPE, rbA,rbB),
+btHingeConstraint::btHingeConstraint(btRigidBody& rbA, btRigidBody& rbB, const btVector3& pivotInA, const btVector3& pivotInB,
+ const btVector3& axisInA, const btVector3& axisInB, bool useReferenceFrameA)
+ : btTypedConstraint(HINGE_CONSTRAINT_TYPE, rbA, rbB),
#ifdef _BT_USE_CENTER_LIMIT_
- m_limit(),
+ m_limit(),
#endif
- m_angularOnly(false),
- m_enableAngularMotor(false),
- m_useSolveConstraintObsolete(HINGE_USE_OBSOLETE_SOLVER),
- m_useOffsetForConstraintFrame(HINGE_USE_FRAME_OFFSET),
- m_useReferenceFrameA(useReferenceFrameA),
- m_flags(0),
- m_normalCFM(0),
- m_normalERP(0),
- m_stopCFM(0),
- m_stopERP(0)
+ m_angularOnly(false),
+ m_enableAngularMotor(false),
+ m_useSolveConstraintObsolete(HINGE_USE_OBSOLETE_SOLVER),
+ m_useOffsetForConstraintFrame(HINGE_USE_FRAME_OFFSET),
+ m_useReferenceFrameA(useReferenceFrameA),
+ m_flags(0),
+ m_normalCFM(0),
+ m_normalERP(0),
+ m_stopCFM(0),
+ m_stopERP(0)
{
m_rbAFrame.getOrigin() = pivotInA;
-
+
// since no frame is given, assume this to be zero angle and just pick rb transform axis
btVector3 rbAxisA1 = rbA.getCenterOfMassTransform().getBasis().getColumn(0);
btVector3 rbAxisA2;
btScalar projection = axisInA.dot(rbAxisA1);
- if (projection >= 1.0f - SIMD_EPSILON) {
+ if (projection >= 1.0f - SIMD_EPSILON)
+ {
rbAxisA1 = -rbA.getCenterOfMassTransform().getBasis().getColumn(2);
rbAxisA2 = rbA.getCenterOfMassTransform().getBasis().getColumn(1);
- } else if (projection <= -1.0f + SIMD_EPSILON) {
+ }
+ else if (projection <= -1.0f + SIMD_EPSILON)
+ {
rbAxisA1 = rbA.getCenterOfMassTransform().getBasis().getColumn(2);
- rbAxisA2 = rbA.getCenterOfMassTransform().getBasis().getColumn(1);
- } else {
+ rbAxisA2 = rbA.getCenterOfMassTransform().getBasis().getColumn(1);
+ }
+ else
+ {
rbAxisA2 = axisInA.cross(rbAxisA1);
rbAxisA1 = rbAxisA2.cross(axisInA);
}
- m_rbAFrame.getBasis().setValue( rbAxisA1.getX(),rbAxisA2.getX(),axisInA.getX(),
- rbAxisA1.getY(),rbAxisA2.getY(),axisInA.getY(),
- rbAxisA1.getZ(),rbAxisA2.getZ(),axisInA.getZ() );
+ m_rbAFrame.getBasis().setValue(rbAxisA1.getX(), rbAxisA2.getX(), axisInA.getX(),
+ rbAxisA1.getY(), rbAxisA2.getY(), axisInA.getY(),
+ rbAxisA1.getZ(), rbAxisA2.getZ(), axisInA.getZ());
+
+ btQuaternion rotationArc = shortestArcQuat(axisInA, axisInB);
+ btVector3 rbAxisB1 = quatRotate(rotationArc, rbAxisA1);
+ btVector3 rbAxisB2 = axisInB.cross(rbAxisB1);
- btQuaternion rotationArc = shortestArcQuat(axisInA,axisInB);
- btVector3 rbAxisB1 = quatRotate(rotationArc,rbAxisA1);
- btVector3 rbAxisB2 = axisInB.cross(rbAxisB1);
-
m_rbBFrame.getOrigin() = pivotInB;
- m_rbBFrame.getBasis().setValue( rbAxisB1.getX(),rbAxisB2.getX(),axisInB.getX(),
- rbAxisB1.getY(),rbAxisB2.getY(),axisInB.getY(),
- rbAxisB1.getZ(),rbAxisB2.getZ(),axisInB.getZ() );
-
-#ifndef _BT_USE_CENTER_LIMIT_
+ m_rbBFrame.getBasis().setValue(rbAxisB1.getX(), rbAxisB2.getX(), axisInB.getX(),
+ rbAxisB1.getY(), rbAxisB2.getY(), axisInB.getY(),
+ rbAxisB1.getZ(), rbAxisB2.getZ(), axisInB.getZ());
+
+#ifndef _BT_USE_CENTER_LIMIT_
//start with free
m_lowerLimit = btScalar(1.0f);
m_upperLimit = btScalar(-1.0f);
@@ -94,47 +92,44 @@ btHingeConstraint::btHingeConstraint(btRigidBody& rbA,btRigidBody& rbB, const bt
m_referenceSign = m_useReferenceFrameA ? btScalar(-1.f) : btScalar(1.f);
}
-
-
-btHingeConstraint::btHingeConstraint(btRigidBody& rbA,const btVector3& pivotInA,const btVector3& axisInA, bool useReferenceFrameA)
-:btTypedConstraint(HINGE_CONSTRAINT_TYPE, rbA),
+btHingeConstraint::btHingeConstraint(btRigidBody& rbA, const btVector3& pivotInA, const btVector3& axisInA, bool useReferenceFrameA)
+ : btTypedConstraint(HINGE_CONSTRAINT_TYPE, rbA),
#ifdef _BT_USE_CENTER_LIMIT_
-m_limit(),
+ m_limit(),
#endif
-m_angularOnly(false), m_enableAngularMotor(false),
-m_useSolveConstraintObsolete(HINGE_USE_OBSOLETE_SOLVER),
-m_useOffsetForConstraintFrame(HINGE_USE_FRAME_OFFSET),
-m_useReferenceFrameA(useReferenceFrameA),
-m_flags(0),
-m_normalCFM(0),
-m_normalERP(0),
-m_stopCFM(0),
-m_stopERP(0)
+ m_angularOnly(false),
+ m_enableAngularMotor(false),
+ m_useSolveConstraintObsolete(HINGE_USE_OBSOLETE_SOLVER),
+ m_useOffsetForConstraintFrame(HINGE_USE_FRAME_OFFSET),
+ m_useReferenceFrameA(useReferenceFrameA),
+ m_flags(0),
+ m_normalCFM(0),
+ m_normalERP(0),
+ m_stopCFM(0),
+ m_stopERP(0)
{
-
// since no frame is given, assume this to be zero angle and just pick rb transform axis
// fixed axis in worldspace
btVector3 rbAxisA1, rbAxisA2;
btPlaneSpace1(axisInA, rbAxisA1, rbAxisA2);
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() );
+ m_rbAFrame.getBasis().setValue(rbAxisA1.getX(), rbAxisA2.getX(), axisInA.getX(),
+ rbAxisA1.getY(), rbAxisA2.getY(), axisInA.getY(),
+ rbAxisA1.getZ(), rbAxisA2.getZ(), axisInA.getZ());
btVector3 axisInB = rbA.getCenterOfMassTransform().getBasis() * axisInA;
- btQuaternion rotationArc = shortestArcQuat(axisInA,axisInB);
- btVector3 rbAxisB1 = quatRotate(rotationArc,rbAxisA1);
+ btQuaternion rotationArc = shortestArcQuat(axisInA, axisInB);
+ btVector3 rbAxisB1 = quatRotate(rotationArc, rbAxisA1);
btVector3 rbAxisB2 = axisInB.cross(rbAxisB1);
-
m_rbBFrame.getOrigin() = 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() );
-
-#ifndef _BT_USE_CENTER_LIMIT_
+ m_rbBFrame.getBasis().setValue(rbAxisB1.getX(), rbAxisB2.getX(), axisInB.getX(),
+ rbAxisB1.getY(), rbAxisB2.getY(), axisInB.getY(),
+ rbAxisB1.getZ(), rbAxisB2.getZ(), axisInB.getZ());
+
+#ifndef _BT_USE_CENTER_LIMIT_
//start with free
m_lowerLimit = btScalar(1.0f);
m_upperLimit = btScalar(-1.0f);
@@ -146,26 +141,24 @@ m_stopERP(0)
m_referenceSign = m_useReferenceFrameA ? btScalar(-1.f) : btScalar(1.f);
}
-
-
-btHingeConstraint::btHingeConstraint(btRigidBody& rbA,btRigidBody& rbB,
- const btTransform& rbAFrame, const btTransform& rbBFrame, bool useReferenceFrameA)
-:btTypedConstraint(HINGE_CONSTRAINT_TYPE, rbA,rbB),m_rbAFrame(rbAFrame),m_rbBFrame(rbBFrame),
+btHingeConstraint::btHingeConstraint(btRigidBody& rbA, btRigidBody& rbB,
+ const btTransform& rbAFrame, const btTransform& rbBFrame, bool useReferenceFrameA)
+ : btTypedConstraint(HINGE_CONSTRAINT_TYPE, rbA, rbB), m_rbAFrame(rbAFrame), m_rbBFrame(rbBFrame),
#ifdef _BT_USE_CENTER_LIMIT_
-m_limit(),
+ m_limit(),
#endif
-m_angularOnly(false),
-m_enableAngularMotor(false),
-m_useSolveConstraintObsolete(HINGE_USE_OBSOLETE_SOLVER),
-m_useOffsetForConstraintFrame(HINGE_USE_FRAME_OFFSET),
-m_useReferenceFrameA(useReferenceFrameA),
-m_flags(0),
-m_normalCFM(0),
-m_normalERP(0),
-m_stopCFM(0),
-m_stopERP(0)
+ m_angularOnly(false),
+ m_enableAngularMotor(false),
+ m_useSolveConstraintObsolete(HINGE_USE_OBSOLETE_SOLVER),
+ m_useOffsetForConstraintFrame(HINGE_USE_FRAME_OFFSET),
+ m_useReferenceFrameA(useReferenceFrameA),
+ m_flags(0),
+ m_normalCFM(0),
+ m_normalERP(0),
+ m_stopCFM(0),
+ m_stopERP(0)
{
-#ifndef _BT_USE_CENTER_LIMIT_
+#ifndef _BT_USE_CENTER_LIMIT_
//start with free
m_lowerLimit = btScalar(1.0f);
m_upperLimit = btScalar(-1.0f);
@@ -175,30 +168,28 @@ m_stopERP(0)
m_solveLimit = false;
#endif
m_referenceSign = m_useReferenceFrameA ? btScalar(-1.f) : btScalar(1.f);
-}
-
-
+}
btHingeConstraint::btHingeConstraint(btRigidBody& rbA, const btTransform& rbAFrame, bool useReferenceFrameA)
-:btTypedConstraint(HINGE_CONSTRAINT_TYPE, rbA),m_rbAFrame(rbAFrame),m_rbBFrame(rbAFrame),
+ : btTypedConstraint(HINGE_CONSTRAINT_TYPE, rbA), m_rbAFrame(rbAFrame), m_rbBFrame(rbAFrame),
#ifdef _BT_USE_CENTER_LIMIT_
-m_limit(),
+ m_limit(),
#endif
-m_angularOnly(false),
-m_enableAngularMotor(false),
-m_useSolveConstraintObsolete(HINGE_USE_OBSOLETE_SOLVER),
-m_useOffsetForConstraintFrame(HINGE_USE_FRAME_OFFSET),
-m_useReferenceFrameA(useReferenceFrameA),
-m_flags(0),
-m_normalCFM(0),
-m_normalERP(0),
-m_stopCFM(0),
-m_stopERP(0)
+ m_angularOnly(false),
+ m_enableAngularMotor(false),
+ m_useSolveConstraintObsolete(HINGE_USE_OBSOLETE_SOLVER),
+ m_useOffsetForConstraintFrame(HINGE_USE_FRAME_OFFSET),
+ m_useReferenceFrameA(useReferenceFrameA),
+ m_flags(0),
+ m_normalCFM(0),
+ m_normalERP(0),
+ m_stopCFM(0),
+ m_stopERP(0)
{
///not providing rigidbody B means implicitly using worldspace for body B
m_rbBFrame.getOrigin() = m_rbA.getCenterOfMassTransform()(m_rbAFrame.getOrigin());
-#ifndef _BT_USE_CENTER_LIMIT_
+#ifndef _BT_USE_CENTER_LIMIT_
//start with free
m_lowerLimit = btScalar(1.0f);
m_upperLimit = btScalar(-1.0f);
@@ -210,9 +201,7 @@ m_stopERP(0)
m_referenceSign = m_useReferenceFrameA ? btScalar(-1.f) : btScalar(1.f);
}
-
-
-void btHingeConstraint::buildJacobian()
+void btHingeConstraint::buildJacobian()
{
if (m_useSolveConstraintObsolete)
{
@@ -221,8 +210,8 @@ void btHingeConstraint::buildJacobian()
if (!m_angularOnly)
{
- btVector3 pivotAInW = m_rbA.getCenterOfMassTransform()*m_rbAFrame.getOrigin();
- btVector3 pivotBInW = m_rbB.getCenterOfMassTransform()*m_rbBFrame.getOrigin();
+ btVector3 pivotAInW = m_rbA.getCenterOfMassTransform() * m_rbAFrame.getOrigin();
+ btVector3 pivotBInW = m_rbB.getCenterOfMassTransform() * m_rbBFrame.getOrigin();
btVector3 relPos = pivotBInW - pivotAInW;
btVector3 normal[3];
@@ -232,23 +221,23 @@ void btHingeConstraint::buildJacobian()
}
else
{
- normal[0].setValue(btScalar(1.0),0,0);
+ normal[0].setValue(btScalar(1.0), 0, 0);
}
btPlaneSpace1(normal[0], normal[1], normal[2]);
- for (int i=0;i<3;i++)
+ for (int i = 0; i < 3; i++)
{
new (&m_jac[i]) btJacobianEntry(
- m_rbA.getCenterOfMassTransform().getBasis().transpose(),
- m_rbB.getCenterOfMassTransform().getBasis().transpose(),
- pivotAInW - m_rbA.getCenterOfMassPosition(),
- pivotBInW - m_rbB.getCenterOfMassPosition(),
- normal[i],
- m_rbA.getInvInertiaDiagLocal(),
- m_rbA.getInvMass(),
- m_rbB.getInvInertiaDiagLocal(),
- m_rbB.getInvMass());
+ m_rbA.getCenterOfMassTransform().getBasis().transpose(),
+ m_rbB.getCenterOfMassTransform().getBasis().transpose(),
+ pivotAInW - m_rbA.getCenterOfMassPosition(),
+ pivotBInW - m_rbB.getCenterOfMassPosition(),
+ normal[i],
+ m_rbA.getInvInertiaDiagLocal(),
+ m_rbA.getInvMass(),
+ m_rbB.getInvInertiaDiagLocal(),
+ m_rbB.getInvMass());
}
}
@@ -258,60 +247,55 @@ void btHingeConstraint::buildJacobian()
//this is unused for now, it's a todo
btVector3 jointAxis0local;
btVector3 jointAxis1local;
-
- btPlaneSpace1(m_rbAFrame.getBasis().getColumn(2),jointAxis0local,jointAxis1local);
+
+ btPlaneSpace1(m_rbAFrame.getBasis().getColumn(2), jointAxis0local, jointAxis1local);
btVector3 jointAxis0 = getRigidBodyA().getCenterOfMassTransform().getBasis() * jointAxis0local;
btVector3 jointAxis1 = getRigidBodyA().getCenterOfMassTransform().getBasis() * jointAxis1local;
btVector3 hingeAxisWorld = getRigidBodyA().getCenterOfMassTransform().getBasis() * m_rbAFrame.getBasis().getColumn(2);
-
- new (&m_jacAng[0]) btJacobianEntry(jointAxis0,
- m_rbA.getCenterOfMassTransform().getBasis().transpose(),
- m_rbB.getCenterOfMassTransform().getBasis().transpose(),
- m_rbA.getInvInertiaDiagLocal(),
- m_rbB.getInvInertiaDiagLocal());
-
- new (&m_jacAng[1]) btJacobianEntry(jointAxis1,
- m_rbA.getCenterOfMassTransform().getBasis().transpose(),
- m_rbB.getCenterOfMassTransform().getBasis().transpose(),
- m_rbA.getInvInertiaDiagLocal(),
- m_rbB.getInvInertiaDiagLocal());
-
- new (&m_jacAng[2]) btJacobianEntry(hingeAxisWorld,
- m_rbA.getCenterOfMassTransform().getBasis().transpose(),
- m_rbB.getCenterOfMassTransform().getBasis().transpose(),
- m_rbA.getInvInertiaDiagLocal(),
- m_rbB.getInvInertiaDiagLocal());
-
- // clear accumulator
- m_accLimitImpulse = btScalar(0.);
-
- // test angular limit
- testLimit(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
- //Compute K = J*W*J' for hinge axis
- btVector3 axisA = getRigidBodyA().getCenterOfMassTransform().getBasis() * m_rbAFrame.getBasis().getColumn(2);
- m_kHinge = 1.0f / (getRigidBodyA().computeAngularImpulseDenominator(axisA) +
- getRigidBodyB().computeAngularImpulseDenominator(axisA));
+ new (&m_jacAng[0]) btJacobianEntry(jointAxis0,
+ m_rbA.getCenterOfMassTransform().getBasis().transpose(),
+ m_rbB.getCenterOfMassTransform().getBasis().transpose(),
+ m_rbA.getInvInertiaDiagLocal(),
+ m_rbB.getInvInertiaDiagLocal());
- }
-}
+ new (&m_jacAng[1]) btJacobianEntry(jointAxis1,
+ m_rbA.getCenterOfMassTransform().getBasis().transpose(),
+ m_rbB.getCenterOfMassTransform().getBasis().transpose(),
+ m_rbA.getInvInertiaDiagLocal(),
+ m_rbB.getInvInertiaDiagLocal());
+ new (&m_jacAng[2]) btJacobianEntry(hingeAxisWorld,
+ m_rbA.getCenterOfMassTransform().getBasis().transpose(),
+ m_rbB.getCenterOfMassTransform().getBasis().transpose(),
+ m_rbA.getInvInertiaDiagLocal(),
+ m_rbB.getInvInertiaDiagLocal());
-#endif //__SPU__
+ // clear accumulator
+ m_accLimitImpulse = btScalar(0.);
+ // test angular limit
+ testLimit(m_rbA.getCenterOfMassTransform(), m_rbB.getCenterOfMassTransform());
-static inline btScalar btNormalizeAnglePositive(btScalar angle)
-{
- return btFmod(btFmod(angle, btScalar(2.0*SIMD_PI)) + btScalar(2.0*SIMD_PI), btScalar(2.0*SIMD_PI));
+ //Compute K = J*W*J' for hinge axis
+ btVector3 axisA = getRigidBodyA().getCenterOfMassTransform().getBasis() * m_rbAFrame.getBasis().getColumn(2);
+ m_kHinge = 1.0f / (getRigidBodyA().computeAngularImpulseDenominator(axisA) +
+ getRigidBodyB().computeAngularImpulseDenominator(axisA));
+ }
}
+#endif //__SPU__
+static inline btScalar btNormalizeAnglePositive(btScalar angle)
+{
+ return btFmod(btFmod(angle, btScalar(2.0 * SIMD_PI)) + btScalar(2.0 * SIMD_PI), btScalar(2.0 * SIMD_PI));
+}
static btScalar btShortestAngularDistance(btScalar accAngle, btScalar curAngle)
{
btScalar result = btNormalizeAngle(btNormalizeAnglePositive(btNormalizeAnglePositive(curAngle) -
- btNormalizeAnglePositive(accAngle)));
+ btNormalizeAnglePositive(accAngle)));
return result;
}
@@ -320,41 +304,36 @@ static btScalar btShortestAngleUpdate(btScalar accAngle, btScalar curAngle)
btScalar tol(0.3);
btScalar result = btShortestAngularDistance(accAngle, curAngle);
- if (btFabs(result) > tol)
+ if (btFabs(result) > tol)
return curAngle;
- else
+ else
return accAngle + result;
return curAngle;
}
-
btScalar btHingeAccumulatedAngleConstraint::getAccumulatedHingeAngle()
{
btScalar hingeAngle = getHingeAngle();
- m_accumulatedAngle = btShortestAngleUpdate(m_accumulatedAngle,hingeAngle);
+ m_accumulatedAngle = btShortestAngleUpdate(m_accumulatedAngle, hingeAngle);
return m_accumulatedAngle;
}
-void btHingeAccumulatedAngleConstraint::setAccumulatedHingeAngle(btScalar accAngle)
+void btHingeAccumulatedAngleConstraint::setAccumulatedHingeAngle(btScalar accAngle)
{
- m_accumulatedAngle = accAngle;
+ m_accumulatedAngle = accAngle;
}
void btHingeAccumulatedAngleConstraint::getInfo1(btConstraintInfo1* info)
{
//update m_accumulatedAngle
btScalar curHingeAngle = getHingeAngle();
- m_accumulatedAngle = btShortestAngleUpdate(m_accumulatedAngle,curHingeAngle);
+ m_accumulatedAngle = btShortestAngleUpdate(m_accumulatedAngle, curHingeAngle);
btHingeConstraint::getInfo1(info);
-
}
-
void btHingeConstraint::getInfo1(btConstraintInfo1* info)
{
-
-
if (m_useSolveConstraintObsolete)
{
info->m_numConstraintRows = 0;
@@ -362,17 +341,16 @@ void btHingeConstraint::getInfo1(btConstraintInfo1* info)
}
else
{
- info->m_numConstraintRows = 5; // Fixed 3 linear + 2 angular
- info->nub = 1;
+ info->m_numConstraintRows = 5; // Fixed 3 linear + 2 angular
+ info->nub = 1;
//always add the row, to avoid computation (data is not available yet)
//prepare constraint
- testLimit(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
- if(getSolveLimit() || getEnableAngularMotor())
+ testLimit(m_rbA.getCenterOfMassTransform(), m_rbB.getCenterOfMassTransform());
+ if (getSolveLimit() || getEnableAngularMotor())
{
- info->m_numConstraintRows++; // limit 3rd anguar as well
- info->nub--;
+ info->m_numConstraintRows++; // limit 3rd anguar as well
+ info->nub--;
}
-
}
}
@@ -386,41 +364,38 @@ void btHingeConstraint::getInfo1NonVirtual(btConstraintInfo1* info)
else
{
//always add the 'limit' row, to avoid computation (data is not available yet)
- info->m_numConstraintRows = 6; // Fixed 3 linear + 2 angular
- info->nub = 0;
+ info->m_numConstraintRows = 6; // Fixed 3 linear + 2 angular
+ info->nub = 0;
}
}
-void btHingeConstraint::getInfo2 (btConstraintInfo2* info)
+void btHingeConstraint::getInfo2(btConstraintInfo2* info)
{
- if(m_useOffsetForConstraintFrame)
+ if (m_useOffsetForConstraintFrame)
{
- getInfo2InternalUsingFrameOffset(info, m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform(),m_rbA.getAngularVelocity(),m_rbB.getAngularVelocity());
+ getInfo2InternalUsingFrameOffset(info, m_rbA.getCenterOfMassTransform(), m_rbB.getCenterOfMassTransform(), m_rbA.getAngularVelocity(), m_rbB.getAngularVelocity());
}
else
{
- getInfo2Internal(info, m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform(),m_rbA.getAngularVelocity(),m_rbB.getAngularVelocity());
+ getInfo2Internal(info, m_rbA.getCenterOfMassTransform(), m_rbB.getCenterOfMassTransform(), m_rbA.getAngularVelocity(), m_rbB.getAngularVelocity());
}
}
-
-void btHingeConstraint::getInfo2NonVirtual (btConstraintInfo2* info,const btTransform& transA,const btTransform& transB,const btVector3& angVelA,const btVector3& angVelB)
+void btHingeConstraint::getInfo2NonVirtual(btConstraintInfo2* info, const btTransform& transA, const btTransform& transB, const btVector3& angVelA, const btVector3& angVelB)
{
///the regular (virtual) implementation getInfo2 already performs 'testLimit' during getInfo1, so we need to do it now
- testLimit(transA,transB);
+ testLimit(transA, transB);
- getInfo2Internal(info,transA,transB,angVelA,angVelB);
+ getInfo2Internal(info, transA, transB, angVelA, angVelB);
}
-
-void btHingeConstraint::getInfo2Internal(btConstraintInfo2* info, const btTransform& transA,const btTransform& transB,const btVector3& angVelA,const btVector3& angVelB)
+void btHingeConstraint::getInfo2Internal(btConstraintInfo2* info, const btTransform& transA, const btTransform& transB, const btVector3& angVelA, const btVector3& angVelB)
{
-
btAssert(!m_useSolveConstraintObsolete);
int i, skip = info->rowskip;
// transforms in world space
- btTransform trA = transA*m_rbAFrame;
- btTransform trB = transB*m_rbBFrame;
+ btTransform trA = transA * m_rbAFrame;
+ btTransform trB = transB * m_rbBFrame;
// pivot point
btVector3 pivotAInW = trA.getOrigin();
btVector3 pivotBInW = trB.getOrigin();
@@ -448,7 +423,7 @@ void btHingeConstraint::getInfo2Internal(btConstraintInfo2* info, const btTransf
info->m_constraintError[i*skip]=0.f;
}
}
-#endif //#if 0
+#endif //#if 0
// linear (all fixed)
if (!m_angularOnly)
@@ -460,10 +435,7 @@ void btHingeConstraint::getInfo2Internal(btConstraintInfo2* info, const btTransf
info->m_J2linearAxis[0] = -1;
info->m_J2linearAxis[skip + 1] = -1;
info->m_J2linearAxis[2 * skip + 2] = -1;
- }
-
-
-
+ }
btVector3 a1 = pivotAInW - transA.getOrigin();
{
@@ -471,22 +443,22 @@ void btHingeConstraint::getInfo2Internal(btConstraintInfo2* info, const btTransf
btVector3* angular1 = (btVector3*)(info->m_J1angularAxis + skip);
btVector3* angular2 = (btVector3*)(info->m_J1angularAxis + 2 * skip);
btVector3 a1neg = -a1;
- a1neg.getSkewSymmetricMatrix(angular0,angular1,angular2);
+ a1neg.getSkewSymmetricMatrix(angular0, angular1, angular2);
}
btVector3 a2 = pivotBInW - transB.getOrigin();
{
btVector3* angular0 = (btVector3*)(info->m_J2angularAxis);
btVector3* angular1 = (btVector3*)(info->m_J2angularAxis + skip);
btVector3* angular2 = (btVector3*)(info->m_J2angularAxis + 2 * skip);
- a2.getSkewSymmetricMatrix(angular0,angular1,angular2);
+ a2.getSkewSymmetricMatrix(angular0, angular1, angular2);
}
// linear RHS
btScalar normalErp = (m_flags & BT_HINGE_FLAGS_ERP_NORM) ? m_normalERP : info->erp;
- btScalar k = info->fps * normalErp;
+ btScalar k = info->fps * normalErp;
if (!m_angularOnly)
{
- for(i = 0; i < 3; i++)
+ for (i = 0; i < 3; i++)
{
info->m_constraintError[i * skip] = k * (pivotBInW[i] - pivotAInW[i]);
}
@@ -504,9 +476,9 @@ void btHingeConstraint::getInfo2Internal(btConstraintInfo2* info, const btTransf
// get 2 orthos to hinge axis (X, Y)
btVector3 p = trA.getBasis().getColumn(0);
btVector3 q = trA.getBasis().getColumn(1);
- // set the two hinge angular rows
- int s3 = 3 * info->rowskip;
- int s4 = 4 * info->rowskip;
+ // set the two hinge angular rows
+ int s3 = 3 * info->rowskip;
+ int s4 = 4 * info->rowskip;
info->m_J1angularAxis[s3 + 0] = p[0];
info->m_J1angularAxis[s3 + 1] = p[1];
@@ -521,181 +493,172 @@ void btHingeConstraint::getInfo2Internal(btConstraintInfo2* info, const btTransf
info->m_J2angularAxis[s4 + 0] = -q[0];
info->m_J2angularAxis[s4 + 1] = -q[1];
info->m_J2angularAxis[s4 + 2] = -q[2];
- // compute the right hand side of the constraint equation. set relative
- // body velocities along p and q to bring the hinge back into alignment.
- // if ax1,ax2 are the unit length hinge axes as computed from body1 and
- // body2, we need to rotate both bodies along the axis u = (ax1 x ax2).
- // if `theta' is the angle between ax1 and ax2, we need an angular velocity
- // along u to cover angle erp*theta in one step :
- // |angular_velocity| = angle/time = erp*theta / stepsize
- // = (erp*fps) * theta
- // angular_velocity = |angular_velocity| * (ax1 x ax2) / |ax1 x ax2|
- // = (erp*fps) * theta * (ax1 x ax2) / sin(theta)
- // ...as ax1 and ax2 are unit length. if theta is smallish,
- // theta ~= sin(theta), so
- // angular_velocity = (erp*fps) * (ax1 x ax2)
- // ax1 x ax2 is in the plane space of ax1, so we project the angular
- // velocity to p and q to find the right hand side.
- btVector3 ax2 = trB.getBasis().getColumn(2);
+ // compute the right hand side of the constraint equation. set relative
+ // body velocities along p and q to bring the hinge back into alignment.
+ // if ax1,ax2 are the unit length hinge axes as computed from body1 and
+ // body2, we need to rotate both bodies along the axis u = (ax1 x ax2).
+ // if `theta' is the angle between ax1 and ax2, we need an angular velocity
+ // along u to cover angle erp*theta in one step :
+ // |angular_velocity| = angle/time = erp*theta / stepsize
+ // = (erp*fps) * theta
+ // angular_velocity = |angular_velocity| * (ax1 x ax2) / |ax1 x ax2|
+ // = (erp*fps) * theta * (ax1 x ax2) / sin(theta)
+ // ...as ax1 and ax2 are unit length. if theta is smallish,
+ // theta ~= sin(theta), so
+ // angular_velocity = (erp*fps) * (ax1 x ax2)
+ // ax1 x ax2 is in the plane space of ax1, so we project the angular
+ // velocity to p and q to find the right hand side.
+ btVector3 ax2 = trB.getBasis().getColumn(2);
btVector3 u = ax1.cross(ax2);
info->m_constraintError[s3] = k * u.dot(p);
info->m_constraintError[s4] = k * u.dot(q);
// check angular limits
- int nrow = 4; // last filled row
+ int nrow = 4; // last filled row
int srow;
btScalar limit_err = btScalar(0.0);
int limit = 0;
- if(getSolveLimit())
+ if (getSolveLimit())
{
-#ifdef _BT_USE_CENTER_LIMIT_
- limit_err = m_limit.getCorrection() * m_referenceSign;
+#ifdef _BT_USE_CENTER_LIMIT_
+ limit_err = m_limit.getCorrection() * m_referenceSign;
#else
- limit_err = m_correction * m_referenceSign;
+ limit_err = m_correction * m_referenceSign;
#endif
- limit = (limit_err > btScalar(0.0)) ? 1 : 2;
-
+ limit = (limit_err > btScalar(0.0)) ? 1 : 2;
}
// if the hinge has joint limits or motor, add in the extra row
bool powered = getEnableAngularMotor();
- if(limit || powered)
+ if (limit || powered)
{
nrow++;
srow = nrow * info->rowskip;
- info->m_J1angularAxis[srow+0] = ax1[0];
- info->m_J1angularAxis[srow+1] = ax1[1];
- info->m_J1angularAxis[srow+2] = ax1[2];
+ info->m_J1angularAxis[srow + 0] = ax1[0];
+ info->m_J1angularAxis[srow + 1] = ax1[1];
+ info->m_J1angularAxis[srow + 2] = ax1[2];
- info->m_J2angularAxis[srow+0] = -ax1[0];
- info->m_J2angularAxis[srow+1] = -ax1[1];
- info->m_J2angularAxis[srow+2] = -ax1[2];
+ info->m_J2angularAxis[srow + 0] = -ax1[0];
+ info->m_J2angularAxis[srow + 1] = -ax1[1];
+ info->m_J2angularAxis[srow + 2] = -ax1[2];
btScalar lostop = getLowerLimit();
btScalar histop = getUpperLimit();
- if(limit && (lostop == histop))
+ if (limit && (lostop == histop))
{ // the joint motor is ineffective
powered = false;
}
info->m_constraintError[srow] = btScalar(0.0f);
btScalar currERP = (m_flags & BT_HINGE_FLAGS_ERP_STOP) ? m_stopERP : normalErp;
- if(powered)
+ if (powered)
{
- if(m_flags & BT_HINGE_FLAGS_CFM_NORM)
+ if (m_flags & BT_HINGE_FLAGS_CFM_NORM)
{
info->cfm[srow] = m_normalCFM;
}
btScalar mot_fact = getMotorFactor(m_hingeAngle, lostop, histop, m_motorTargetVelocity, info->fps * currERP);
info->m_constraintError[srow] += mot_fact * m_motorTargetVelocity * m_referenceSign;
- info->m_lowerLimit[srow] = - m_maxMotorImpulse;
- info->m_upperLimit[srow] = m_maxMotorImpulse;
+ info->m_lowerLimit[srow] = -m_maxMotorImpulse;
+ info->m_upperLimit[srow] = m_maxMotorImpulse;
}
- if(limit)
+ if (limit)
{
k = info->fps * currERP;
info->m_constraintError[srow] += k * limit_err;
- if(m_flags & BT_HINGE_FLAGS_CFM_STOP)
+ if (m_flags & BT_HINGE_FLAGS_CFM_STOP)
{
info->cfm[srow] = m_stopCFM;
}
- if(lostop == histop)
+ if (lostop == histop)
{
// limited low and high simultaneously
info->m_lowerLimit[srow] = -SIMD_INFINITY;
info->m_upperLimit[srow] = SIMD_INFINITY;
}
- else if(limit == 1)
- { // low limit
+ else if (limit == 1)
+ { // low limit
info->m_lowerLimit[srow] = 0;
info->m_upperLimit[srow] = SIMD_INFINITY;
}
- else
- { // high limit
+ else
+ { // high limit
info->m_lowerLimit[srow] = -SIMD_INFINITY;
info->m_upperLimit[srow] = 0;
}
// bounce (we'll use slider parameter abs(1.0 - m_dampingLimAng) for that)
-#ifdef _BT_USE_CENTER_LIMIT_
+#ifdef _BT_USE_CENTER_LIMIT_
btScalar bounce = m_limit.getRelaxationFactor();
#else
btScalar bounce = m_relaxationFactor;
#endif
- if(bounce > btScalar(0.0))
+ if (bounce > btScalar(0.0))
{
btScalar vel = angVelA.dot(ax1);
vel -= angVelB.dot(ax1);
// only apply bounce if the velocity is incoming, and if the
// resulting c[] exceeds what we already have.
- if(limit == 1)
- { // low limit
- if(vel < 0)
+ if (limit == 1)
+ { // low limit
+ if (vel < 0)
{
btScalar newc = -bounce * vel;
- if(newc > info->m_constraintError[srow])
+ if (newc > info->m_constraintError[srow])
{
info->m_constraintError[srow] = newc;
}
}
}
else
- { // high limit - all those computations are reversed
- if(vel > 0)
+ { // high limit - all those computations are reversed
+ if (vel > 0)
{
btScalar newc = -bounce * vel;
- if(newc < info->m_constraintError[srow])
+ if (newc < info->m_constraintError[srow])
{
info->m_constraintError[srow] = newc;
}
}
}
}
-#ifdef _BT_USE_CENTER_LIMIT_
+#ifdef _BT_USE_CENTER_LIMIT_
info->m_constraintError[srow] *= m_limit.getBiasFactor();
#else
info->m_constraintError[srow] *= m_biasFactor;
#endif
- } // if(limit)
- } // if angular limit or powered
+ } // if(limit)
+ } // if angular limit or powered
}
-
-void btHingeConstraint::setFrames(const btTransform & frameA, const btTransform & frameB)
+void btHingeConstraint::setFrames(const btTransform& frameA, const btTransform& frameB)
{
m_rbAFrame = frameA;
m_rbBFrame = frameB;
buildJacobian();
}
-
-void btHingeConstraint::updateRHS(btScalar timeStep)
+void btHingeConstraint::updateRHS(btScalar timeStep)
{
(void)timeStep;
-
}
-
-
-
btScalar btHingeConstraint::getHingeAngle()
{
- return getHingeAngle(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
+ return getHingeAngle(m_rbA.getCenterOfMassTransform(), m_rbB.getCenterOfMassTransform());
}
-btScalar btHingeConstraint::getHingeAngle(const btTransform& transA,const btTransform& transB)
+btScalar btHingeConstraint::getHingeAngle(const btTransform& transA, const btTransform& transB)
{
- const btVector3 refAxis0 = transA.getBasis() * m_rbAFrame.getBasis().getColumn(0);
- const btVector3 refAxis1 = transA.getBasis() * m_rbAFrame.getBasis().getColumn(1);
+ const btVector3 refAxis0 = transA.getBasis() * m_rbAFrame.getBasis().getColumn(0);
+ const btVector3 refAxis1 = transA.getBasis() * m_rbAFrame.getBasis().getColumn(1);
const btVector3 swingAxis = transB.getBasis() * m_rbBFrame.getBasis().getColumn(1);
-// btScalar angle = btAtan2Fast(swingAxis.dot(refAxis0), swingAxis.dot(refAxis1));
+ // btScalar angle = btAtan2Fast(swingAxis.dot(refAxis0), swingAxis.dot(refAxis1));
btScalar angle = btAtan2(swingAxis.dot(refAxis0), swingAxis.dot(refAxis1));
return m_referenceSign * angle;
}
-
-
-void btHingeConstraint::testLimit(const btTransform& transA,const btTransform& transB)
+void btHingeConstraint::testLimit(const btTransform& transA, const btTransform& transB)
{
// Compute limit information
- m_hingeAngle = getHingeAngle(transA,transB);
-#ifdef _BT_USE_CENTER_LIMIT_
+ m_hingeAngle = getHingeAngle(transA, transB);
+#ifdef _BT_USE_CENTER_LIMIT_
m_limit.test(m_hingeAngle);
#else
m_correction = btScalar(0.);
@@ -709,7 +672,7 @@ void btHingeConstraint::testLimit(const btTransform& transA,const btTransform& t
m_correction = (m_lowerLimit - m_hingeAngle);
m_limitSign = 1.0f;
m_solveLimit = true;
- }
+ }
else if (m_hingeAngle >= m_upperLimit)
{
m_correction = m_upperLimit - m_hingeAngle;
@@ -721,7 +684,6 @@ void btHingeConstraint::testLimit(const btTransform& transA,const btTransform& t
return;
}
-
static btVector3 vHinge(0, 0, btScalar(1));
void btHingeConstraint::setMotorTarget(const btQuaternion& qAinB, btScalar dt)
@@ -731,14 +693,15 @@ void btHingeConstraint::setMotorTarget(const btQuaternion& qAinB, btScalar dt)
qConstraint.normalize();
// extract "pure" hinge component
- btVector3 vNoHinge = quatRotate(qConstraint, vHinge); vNoHinge.normalize();
+ btVector3 vNoHinge = quatRotate(qConstraint, vHinge);
+ vNoHinge.normalize();
btQuaternion qNoHinge = shortestArcQuat(vHinge, vNoHinge);
btQuaternion qHinge = qNoHinge.inverse() * qConstraint;
qHinge.normalize();
// compute angular target, clamped to limits
btScalar targetAngle = qHinge.getAngle();
- if (targetAngle > SIMD_PI) // long way around. flip quat and recalculate.
+ if (targetAngle > SIMD_PI) // long way around. flip quat and recalculate.
{
qHinge = -(qHinge);
targetAngle = qHinge.getAngle();
@@ -751,7 +714,7 @@ void btHingeConstraint::setMotorTarget(const btQuaternion& qAinB, btScalar dt)
void btHingeConstraint::setMotorTarget(btScalar targetAngle, btScalar dt)
{
-#ifdef _BT_USE_CENTER_LIMIT_
+#ifdef _BT_USE_CENTER_LIMIT_
m_limit.fit(targetAngle);
#else
if (m_lowerLimit < m_upperLimit)
@@ -763,20 +726,18 @@ void btHingeConstraint::setMotorTarget(btScalar targetAngle, btScalar dt)
}
#endif
// compute angular velocity
- btScalar curAngle = getHingeAngle(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
+ btScalar curAngle = getHingeAngle(m_rbA.getCenterOfMassTransform(), m_rbB.getCenterOfMassTransform());
btScalar dAngle = targetAngle - curAngle;
m_motorTargetVelocity = dAngle / dt;
}
-
-
-void btHingeConstraint::getInfo2InternalUsingFrameOffset(btConstraintInfo2* info, const btTransform& transA,const btTransform& transB,const btVector3& angVelA,const btVector3& angVelB)
+void btHingeConstraint::getInfo2InternalUsingFrameOffset(btConstraintInfo2* info, const btTransform& transA, const btTransform& transB, const btVector3& angVelA, const btVector3& angVelB)
{
btAssert(!m_useSolveConstraintObsolete);
int i, s = info->rowskip;
// transforms in world space
- btTransform trA = transA*m_rbAFrame;
- btTransform trB = transB*m_rbBFrame;
+ btTransform trA = transA * m_rbAFrame;
+ btTransform trB = transB * m_rbBFrame;
// pivot point
// btVector3 pivotAInW = trA.getOrigin();
// btVector3 pivotBInW = trB.getOrigin();
@@ -789,11 +750,11 @@ void btHingeConstraint::getInfo2InternalUsingFrameOffset(btConstraintInfo2* info
bool hasStaticBody = (miA < SIMD_EPSILON) || (miB < SIMD_EPSILON);
btScalar miS = miA + miB;
btScalar factA, factB;
- if(miS > btScalar(0.f))
+ if (miS > btScalar(0.f))
{
factA = miB / miS;
}
- else
+ else
{
factA = btScalar(0.5f);
}
@@ -803,15 +764,21 @@ void btHingeConstraint::getInfo2InternalUsingFrameOffset(btConstraintInfo2* info
btVector3 ax1A = trA.getBasis().getColumn(2);
btVector3 ax1B = trB.getBasis().getColumn(2);
btVector3 ax1 = ax1A * factA + ax1B * factB;
+ if (ax1.length2()<SIMD_EPSILON)
+ {
+ factA=0.f;
+ factB=1.f;
+ ax1 = ax1A * factA + ax1B * factB;
+ }
ax1.normalize();
- // fill first 3 rows
+ // fill first 3 rows
// we want: velA + wA x relA == velB + wB x relB
btTransform bodyA_trans = transA;
btTransform bodyB_trans = transB;
int s0 = 0;
int s1 = s;
int s2 = s * 2;
- int nrow = 2; // last filled row
+ int nrow = 2; // last filled row
btVector3 tmpA, tmpB, relA, relB, p, q;
// get vector from bodyB to frameB in WCS
relB = trB.getOrigin() - bodyB_trans.getOrigin();
@@ -830,7 +797,7 @@ void btHingeConstraint::getInfo2InternalUsingFrameOffset(btConstraintInfo2* info
// now choose average ortho to hinge axis
p = orthoB * factA + orthoA * factB;
btScalar len2 = p.length2();
- if(len2 > SIMD_EPSILON)
+ if (len2 > SIMD_EPSILON)
{
p /= btSqrt(len2);
}
@@ -843,44 +810,44 @@ void btHingeConstraint::getInfo2InternalUsingFrameOffset(btConstraintInfo2* info
// fill three rows
tmpA = relA.cross(p);
tmpB = relB.cross(p);
- for (i=0; i<3; i++) info->m_J1angularAxis[s0+i] = tmpA[i];
- for (i=0; i<3; i++) info->m_J2angularAxis[s0+i] = -tmpB[i];
+ for (i = 0; i < 3; i++) info->m_J1angularAxis[s0 + i] = tmpA[i];
+ for (i = 0; i < 3; i++) info->m_J2angularAxis[s0 + i] = -tmpB[i];
tmpA = relA.cross(q);
tmpB = relB.cross(q);
- if(hasStaticBody && getSolveLimit())
- { // to make constraint between static and dynamic objects more rigid
+ if (hasStaticBody && getSolveLimit())
+ { // to make constraint between static and dynamic objects more rigid
// remove wA (or wB) from equation if angular limit is hit
tmpB *= factB;
tmpA *= factA;
}
- for (i=0; i<3; i++) info->m_J1angularAxis[s1+i] = tmpA[i];
- for (i=0; i<3; i++) info->m_J2angularAxis[s1+i] = -tmpB[i];
+ for (i = 0; i < 3; i++) info->m_J1angularAxis[s1 + i] = tmpA[i];
+ for (i = 0; i < 3; i++) info->m_J2angularAxis[s1 + i] = -tmpB[i];
tmpA = relA.cross(ax1);
tmpB = relB.cross(ax1);
- if(hasStaticBody)
- { // to make constraint between static and dynamic objects more rigid
+ if (hasStaticBody)
+ { // to make constraint between static and dynamic objects more rigid
// remove wA (or wB) from equation
tmpB *= factB;
tmpA *= factA;
}
- for (i=0; i<3; i++) info->m_J1angularAxis[s2+i] = tmpA[i];
- for (i=0; i<3; i++) info->m_J2angularAxis[s2+i] = -tmpB[i];
+ for (i = 0; i < 3; i++) info->m_J1angularAxis[s2 + i] = tmpA[i];
+ for (i = 0; i < 3; i++) info->m_J2angularAxis[s2 + i] = -tmpB[i];
- btScalar normalErp = (m_flags & BT_HINGE_FLAGS_ERP_NORM)? m_normalERP : info->erp;
+ btScalar normalErp = (m_flags & BT_HINGE_FLAGS_ERP_NORM) ? m_normalERP : info->erp;
btScalar k = info->fps * normalErp;
if (!m_angularOnly)
{
- for (i=0; i<3; i++) info->m_J1linearAxis[s0+i] = p[i];
- for (i=0; i<3; i++) info->m_J1linearAxis[s1+i] = q[i];
- for (i=0; i<3; i++) info->m_J1linearAxis[s2+i] = ax1[i];
+ for (i = 0; i < 3; i++) info->m_J1linearAxis[s0 + i] = p[i];
+ for (i = 0; i < 3; i++) info->m_J1linearAxis[s1 + i] = q[i];
+ for (i = 0; i < 3; i++) info->m_J1linearAxis[s2 + i] = ax1[i];
+
+ for (i = 0; i < 3; i++) info->m_J2linearAxis[s0 + i] = -p[i];
+ for (i = 0; i < 3; i++) info->m_J2linearAxis[s1 + i] = -q[i];
+ for (i = 0; i < 3; i++) info->m_J2linearAxis[s2 + i] = -ax1[i];
- for (i=0; i<3; i++) info->m_J2linearAxis[s0+i] = -p[i];
- for (i=0; i<3; i++) info->m_J2linearAxis[s1+i] = -q[i];
- for (i=0; i<3; i++) info->m_J2linearAxis[s2+i] = -ax1[i];
+ // compute three elements of right hand side
- // compute three elements of right hand side
-
btScalar rhs = k * p.dot(ofs);
info->m_constraintError[s0] = rhs;
rhs = k * q.dot(ofs);
@@ -925,146 +892,144 @@ void btHingeConstraint::getInfo2InternalUsingFrameOffset(btConstraintInfo2* info
// angular_velocity = (erp*fps) * (ax1 x ax2)
// ax1 x ax2 is in the plane space of ax1, so we project the angular
// velocity to p and q to find the right hand side.
- k = info->fps * normalErp;//??
+ k = info->fps * normalErp; //??
btVector3 u = ax1A.cross(ax1B);
info->m_constraintError[s3] = k * u.dot(p);
info->m_constraintError[s4] = k * u.dot(q);
#endif
// check angular limits
- nrow = 4; // last filled row
+ nrow = 4; // last filled row
int srow;
btScalar limit_err = btScalar(0.0);
int limit = 0;
- if(getSolveLimit())
+ if (getSolveLimit())
{
-#ifdef _BT_USE_CENTER_LIMIT_
- limit_err = m_limit.getCorrection() * m_referenceSign;
+#ifdef _BT_USE_CENTER_LIMIT_
+ limit_err = m_limit.getCorrection() * m_referenceSign;
#else
- limit_err = m_correction * m_referenceSign;
+ limit_err = m_correction * m_referenceSign;
#endif
- limit = (limit_err > btScalar(0.0)) ? 1 : 2;
-
+ limit = (limit_err > btScalar(0.0)) ? 1 : 2;
}
// if the hinge has joint limits or motor, add in the extra row
bool powered = getEnableAngularMotor();
- if(limit || powered)
+ if (limit || powered)
{
nrow++;
srow = nrow * info->rowskip;
- info->m_J1angularAxis[srow+0] = ax1[0];
- info->m_J1angularAxis[srow+1] = ax1[1];
- info->m_J1angularAxis[srow+2] = ax1[2];
+ info->m_J1angularAxis[srow + 0] = ax1[0];
+ info->m_J1angularAxis[srow + 1] = ax1[1];
+ info->m_J1angularAxis[srow + 2] = ax1[2];
- info->m_J2angularAxis[srow+0] = -ax1[0];
- info->m_J2angularAxis[srow+1] = -ax1[1];
- info->m_J2angularAxis[srow+2] = -ax1[2];
+ info->m_J2angularAxis[srow + 0] = -ax1[0];
+ info->m_J2angularAxis[srow + 1] = -ax1[1];
+ info->m_J2angularAxis[srow + 2] = -ax1[2];
btScalar lostop = getLowerLimit();
btScalar histop = getUpperLimit();
- if(limit && (lostop == histop))
+ if (limit && (lostop == histop))
{ // the joint motor is ineffective
powered = false;
}
info->m_constraintError[srow] = btScalar(0.0f);
btScalar currERP = (m_flags & BT_HINGE_FLAGS_ERP_STOP) ? m_stopERP : normalErp;
- if(powered)
+ if (powered)
{
- if(m_flags & BT_HINGE_FLAGS_CFM_NORM)
+ if (m_flags & BT_HINGE_FLAGS_CFM_NORM)
{
info->cfm[srow] = m_normalCFM;
}
btScalar mot_fact = getMotorFactor(m_hingeAngle, lostop, histop, m_motorTargetVelocity, info->fps * currERP);
info->m_constraintError[srow] += mot_fact * m_motorTargetVelocity * m_referenceSign;
- info->m_lowerLimit[srow] = - m_maxMotorImpulse;
- info->m_upperLimit[srow] = m_maxMotorImpulse;
+ info->m_lowerLimit[srow] = -m_maxMotorImpulse;
+ info->m_upperLimit[srow] = m_maxMotorImpulse;
}
- if(limit)
+ if (limit)
{
k = info->fps * currERP;
info->m_constraintError[srow] += k * limit_err;
- if(m_flags & BT_HINGE_FLAGS_CFM_STOP)
+ if (m_flags & BT_HINGE_FLAGS_CFM_STOP)
{
info->cfm[srow] = m_stopCFM;
}
- if(lostop == histop)
+ if (lostop == histop)
{
// limited low and high simultaneously
info->m_lowerLimit[srow] = -SIMD_INFINITY;
info->m_upperLimit[srow] = SIMD_INFINITY;
}
- else if(limit == 1)
- { // low limit
+ else if (limit == 1)
+ { // low limit
info->m_lowerLimit[srow] = 0;
info->m_upperLimit[srow] = SIMD_INFINITY;
}
- else
- { // high limit
+ else
+ { // high limit
info->m_lowerLimit[srow] = -SIMD_INFINITY;
info->m_upperLimit[srow] = 0;
}
// bounce (we'll use slider parameter abs(1.0 - m_dampingLimAng) for that)
-#ifdef _BT_USE_CENTER_LIMIT_
+#ifdef _BT_USE_CENTER_LIMIT_
btScalar bounce = m_limit.getRelaxationFactor();
#else
btScalar bounce = m_relaxationFactor;
#endif
- if(bounce > btScalar(0.0))
+ if (bounce > btScalar(0.0))
{
btScalar vel = angVelA.dot(ax1);
vel -= angVelB.dot(ax1);
// only apply bounce if the velocity is incoming, and if the
// resulting c[] exceeds what we already have.
- if(limit == 1)
- { // low limit
- if(vel < 0)
+ if (limit == 1)
+ { // low limit
+ if (vel < 0)
{
btScalar newc = -bounce * vel;
- if(newc > info->m_constraintError[srow])
+ if (newc > info->m_constraintError[srow])
{
info->m_constraintError[srow] = newc;
}
}
}
else
- { // high limit - all those computations are reversed
- if(vel > 0)
+ { // high limit - all those computations are reversed
+ if (vel > 0)
{
btScalar newc = -bounce * vel;
- if(newc < info->m_constraintError[srow])
+ if (newc < info->m_constraintError[srow])
{
info->m_constraintError[srow] = newc;
}
}
}
}
-#ifdef _BT_USE_CENTER_LIMIT_
+#ifdef _BT_USE_CENTER_LIMIT_
info->m_constraintError[srow] *= m_limit.getBiasFactor();
#else
info->m_constraintError[srow] *= m_biasFactor;
#endif
- } // if(limit)
- } // if angular limit or powered
+ } // if(limit)
+ } // if angular limit or powered
}
-
-///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5).
+///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.
void btHingeConstraint::setParam(int num, btScalar value, int axis)
{
- if((axis == -1) || (axis == 5))
+ if ((axis == -1) || (axis == 5))
{
- switch(num)
- {
- case BT_CONSTRAINT_STOP_ERP :
+ switch (num)
+ {
+ case BT_CONSTRAINT_STOP_ERP:
m_stopERP = value;
m_flags |= BT_HINGE_FLAGS_ERP_STOP;
break;
- case BT_CONSTRAINT_STOP_CFM :
+ case BT_CONSTRAINT_STOP_CFM:
m_stopCFM = value;
m_flags |= BT_HINGE_FLAGS_CFM_STOP;
break;
- case BT_CONSTRAINT_CFM :
+ case BT_CONSTRAINT_CFM:
m_normalCFM = value;
m_flags |= BT_HINGE_FLAGS_CFM_NORM;
break;
@@ -1072,7 +1037,7 @@ void btHingeConstraint::setParam(int num, btScalar value, int axis)
m_normalERP = value;
m_flags |= BT_HINGE_FLAGS_ERP_NORM;
break;
- default :
+ default:
btAssertConstrParams(0);
}
}
@@ -1083,22 +1048,22 @@ void btHingeConstraint::setParam(int num, btScalar value, int axis)
}
///return the local value of parameter
-btScalar btHingeConstraint::getParam(int num, int axis) const
+btScalar btHingeConstraint::getParam(int num, int axis) const
{
btScalar retVal = 0;
- if((axis == -1) || (axis == 5))
+ if ((axis == -1) || (axis == 5))
{
- switch(num)
- {
- case BT_CONSTRAINT_STOP_ERP :
+ switch (num)
+ {
+ case BT_CONSTRAINT_STOP_ERP:
btAssertConstrParams(m_flags & BT_HINGE_FLAGS_ERP_STOP);
retVal = m_stopERP;
break;
- case BT_CONSTRAINT_STOP_CFM :
+ case BT_CONSTRAINT_STOP_CFM:
btAssertConstrParams(m_flags & BT_HINGE_FLAGS_CFM_STOP);
retVal = m_stopCFM;
break;
- case BT_CONSTRAINT_CFM :
+ case BT_CONSTRAINT_CFM:
btAssertConstrParams(m_flags & BT_HINGE_FLAGS_CFM_NORM);
retVal = m_normalCFM;
break;
@@ -1106,7 +1071,7 @@ btScalar btHingeConstraint::getParam(int num, int axis) const
btAssertConstrParams(m_flags & BT_HINGE_FLAGS_ERP_NORM);
retVal = m_normalERP;
break;
- default :
+ default:
btAssertConstrParams(0);
}
}
@@ -1116,5 +1081,3 @@ btScalar btHingeConstraint::getParam(int num, int axis) const
}
return retVal;
}
-
-
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btHingeConstraint.h b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btHingeConstraint.h
index 3c3df24dba..c7509e30af 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btHingeConstraint.h
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btHingeConstraint.h
@@ -20,7 +20,6 @@ subject to the following restrictions:
#define _BT_USE_CENTER_LIMIT_ 1
-
#include "LinearMath/btVector3.h"
#include "btJacobianEntry.h"
#include "btTypedConstraint.h"
@@ -28,14 +27,12 @@ subject to the following restrictions:
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"
+#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
-
-
+#define btHingeConstraintData btHingeConstraintFloatData
+#define btHingeConstraintDataName "btHingeConstraintFloatData"
+#endif //BT_USE_DOUBLE_PRECISION
enum btHingeFlags
{
@@ -45,89 +42,83 @@ enum btHingeFlags
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
+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
+ 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_rbAFrame; // constraint axii. Assumes z is hinge axis.
btTransform m_rbBFrame;
- btScalar m_motorTargetVelocity;
- btScalar m_maxMotorImpulse;
-
+ btScalar m_motorTargetVelocity;
+ btScalar m_maxMotorImpulse;
-#ifdef _BT_USE_CENTER_LIMIT_
- btAngularLimit m_limit;
+#ifdef _BT_USE_CENTER_LIMIT_
+ btAngularLimit m_limit;
#else
- btScalar m_lowerLimit;
- btScalar m_upperLimit;
- btScalar m_limitSign;
- btScalar m_correction;
+ btScalar m_lowerLimit;
+ btScalar m_upperLimit;
+ btScalar m_limitSign;
+ btScalar m_correction;
- btScalar m_limitSoftness;
- btScalar m_biasFactor;
- btScalar m_relaxationFactor;
+ btScalar m_limitSoftness;
+ btScalar m_biasFactor;
+ btScalar m_relaxationFactor;
- bool m_solveLimit;
+ bool m_solveLimit;
#endif
- btScalar m_kHinge;
-
+ btScalar m_kHinge;
- btScalar m_accLimitImpulse;
- btScalar m_hingeAngle;
- btScalar m_referenceSign;
+ btScalar m_accLimitImpulse;
+ btScalar m_hingeAngle;
+ btScalar m_referenceSign;
- bool m_angularOnly;
- bool m_enableAngularMotor;
- bool m_useSolveConstraintObsolete;
- bool m_useOffsetForConstraintFrame;
- bool m_useReferenceFrameA;
+ bool m_angularOnly;
+ bool m_enableAngularMotor;
+ bool m_useSolveConstraintObsolete;
+ bool m_useOffsetForConstraintFrame;
+ bool m_useReferenceFrameA;
- btScalar m_accMotorImpulse;
+ btScalar m_accMotorImpulse;
- int m_flags;
- btScalar m_normalCFM;
- btScalar m_normalERP;
- btScalar m_stopCFM;
- btScalar m_stopERP;
+ 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, 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,const btTransform& rbAFrame, 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 buildJacobian();
- virtual void getInfo1 (btConstraintInfo1* info);
+ virtual void getInfo1(btConstraintInfo1 * info);
- void getInfo1NonVirtual(btConstraintInfo1* info);
+ void getInfo1NonVirtual(btConstraintInfo1 * info);
- virtual void getInfo2 (btConstraintInfo2* info);
+ virtual void getInfo2(btConstraintInfo2 * info);
- void getInfo2NonVirtual(btConstraintInfo2* info,const btTransform& transA,const btTransform& transB,const btVector3& angVelA,const btVector3& angVelB);
+ 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 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);
+ void updateRHS(btScalar timeStep);
const btRigidBody& getRigidBodyA() const
{
@@ -138,19 +129,19 @@ public:
return m_rbB;
}
- btRigidBody& getRigidBodyA()
- {
- return m_rbA;
- }
+ btRigidBody& getRigidBodyA()
+ {
+ return m_rbA;
+ }
- btRigidBody& getRigidBodyB()
- {
- return m_rbB;
+ btRigidBody& getRigidBodyB()
+ {
+ return m_rbB;
}
btTransform& getFrameOffsetA()
{
- return m_rbAFrame;
+ return m_rbAFrame;
}
btTransform& getFrameOffsetB()
@@ -159,15 +150,15 @@ public:
}
void setFrames(const btTransform& frameA, const btTransform& frameB);
-
- void setAngularOnly(bool angularOnly)
+
+ void setAngularOnly(bool angularOnly)
{
m_angularOnly = angularOnly;
}
- void enableAngularMotor(bool enableMotor,btScalar targetVelocity,btScalar maxMotorImpulse)
+ void enableAngularMotor(bool enableMotor, btScalar targetVelocity, btScalar maxMotorImpulse)
{
- m_enableAngularMotor = enableMotor;
+ m_enableAngularMotor = enableMotor;
m_motorTargetVelocity = targetVelocity;
m_maxMotorImpulse = maxMotorImpulse;
}
@@ -175,29 +166,28 @@ public:
// 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 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(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)
+ void setLimit(btScalar low, btScalar high, btScalar _softness = 0.9f, btScalar _biasFactor = 0.3f, btScalar _relaxationFactor = 1.0f)
{
-#ifdef _BT_USE_CENTER_LIMIT_
+#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_limitSoftness = _softness;
m_biasFactor = _biasFactor;
m_relaxationFactor = _relaxationFactor;
#endif
}
-
+
btScalar getLimitSoftness() const
{
-#ifdef _BT_USE_CENTER_LIMIT_
+#ifdef _BT_USE_CENTER_LIMIT_
return m_limit.getSoftness();
#else
return m_limitSoftness;
@@ -206,7 +196,7 @@ public:
btScalar getLimitBiasFactor() const
{
-#ifdef _BT_USE_CENTER_LIMIT_
+#ifdef _BT_USE_CENTER_LIMIT_
return m_limit.getBiasFactor();
#else
return m_biasFactor;
@@ -215,112 +205,110 @@ public:
btScalar getLimitRelaxationFactor() const
{
-#ifdef _BT_USE_CENTER_LIMIT_
+#ifdef _BT_USE_CENTER_LIMIT_
return m_limit.getRelaxationFactor();
#else
return m_relaxationFactor;
#endif
}
- void setAxis(btVector3& axisInA)
+ 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() );
+ // 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);
+ 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().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;
+ bool hasLimit() const
+ {
+#ifdef _BT_USE_CENTER_LIMIT_
+ return m_limit.getHalfRange() > 0;
#else
- return m_lowerLimit <= m_upperLimit;
+ return m_lowerLimit <= m_upperLimit;
#endif
- }
+ }
- btScalar getLowerLimit() const
+ btScalar getLowerLimit() const
{
-#ifdef _BT_USE_CENTER_LIMIT_
- return m_limit.getLow();
+#ifdef _BT_USE_CENTER_LIMIT_
+ return m_limit.getLow();
#else
- return m_lowerLimit;
+ return m_lowerLimit;
#endif
}
- btScalar getUpperLimit() const
+ btScalar getUpperLimit() const
{
-#ifdef _BT_USE_CENTER_LIMIT_
- return m_limit.getHigh();
-#else
- return m_upperLimit;
+#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);
+ 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& getAFrame() const { return m_rbAFrame; };
const btTransform& getBFrame() const { return m_rbBFrame; };
- btTransform& getAFrame() { return m_rbAFrame; };
+ btTransform& getAFrame() { return m_rbAFrame; };
btTransform& getBFrame() { return m_rbBFrame; };
inline int getSolveLimit()
{
-#ifdef _BT_USE_CENTER_LIMIT_
- return m_limit.isLimit();
+#ifdef _BT_USE_CENTER_LIMIT_
+ return m_limit.isLimit();
#else
- return m_solveLimit;
+ return m_solveLimit;
#endif
}
inline btScalar getLimitSign()
{
-#ifdef _BT_USE_CENTER_LIMIT_
- return m_limit.getSign();
+#ifdef _BT_USE_CENTER_LIMIT_
+ return m_limit.getSign();
#else
return m_limitSign;
#endif
}
- inline bool getAngularOnly()
- {
- return m_angularOnly;
+ inline bool getAngularOnly()
+ {
+ return m_angularOnly;
}
- inline bool getEnableAngularMotor()
- {
- return m_enableAngularMotor;
+ inline bool getEnableAngularMotor()
+ {
+ return m_enableAngularMotor;
}
- inline btScalar getMotorTargetVelocity()
- {
- return m_motorTargetVelocity;
+ inline btScalar getMotorTargetVelocity()
+ {
+ return m_motorTargetVelocity;
}
- inline btScalar getMaxMotorImpulse()
- {
- return m_maxMotorImpulse;
+ inline btScalar getMaxMotorImpulse()
+ {
+ return m_maxMotorImpulse;
}
// access for UseFrameOffset
bool getUseFrameOffset() { return m_useOffsetForConstraintFrame; }
@@ -329,143 +317,132 @@ public:
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).
+ ///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 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
+ virtual btScalar getParam(int num, int axis = -1) const;
+
+ virtual int getFlags() const
{
- return m_flags;
+ return m_flags;
}
- virtual int calculateSerializeBufferSize() 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;
-
-
+ 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
+struct btHingeConstraintDoubleData
{
- btTypedConstraintData m_typeConstraintData;
- btTransformDoubleData m_rbAFrame; // constraint axii. Assumes z is hinge axis.
+ 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;
-
+ 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
+#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
+ATTRIBUTE_ALIGNED16(class)
+btHingeAccumulatedAngleConstraint : public btHingeConstraint
{
protected:
- btScalar m_accumulatedAngle;
-public:
+ 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 )
+
+ 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();
+ m_accumulatedAngle = getHingeAngle();
}
- btHingeAccumulatedAngleConstraint(btRigidBody& rbA,const btVector3& pivotInA,const btVector3& axisInA, bool useReferenceFrameA = false)
- :btHingeConstraint(rbA,pivotInA,axisInA, useReferenceFrameA)
+ btHingeAccumulatedAngleConstraint(btRigidBody & rbA, const btVector3& pivotInA, const btVector3& axisInA, bool useReferenceFrameA = false)
+ : btHingeConstraint(rbA, pivotInA, axisInA, useReferenceFrameA)
{
- m_accumulatedAngle=getHingeAngle();
+ m_accumulatedAngle = getHingeAngle();
}
-
- btHingeAccumulatedAngleConstraint(btRigidBody& rbA,btRigidBody& rbB, const btTransform& rbAFrame, const btTransform& rbBFrame, bool useReferenceFrameA = false)
- :btHingeConstraint(rbA,rbB, rbAFrame, rbBFrame, useReferenceFrameA )
+
+ btHingeAccumulatedAngleConstraint(btRigidBody & rbA, btRigidBody & rbB, const btTransform& rbAFrame, const btTransform& rbBFrame, bool useReferenceFrameA = false)
+ : btHingeConstraint(rbA, rbB, rbAFrame, rbBFrame, useReferenceFrameA)
{
- m_accumulatedAngle=getHingeAngle();
+ m_accumulatedAngle = getHingeAngle();
}
- btHingeAccumulatedAngleConstraint(btRigidBody& rbA,const btTransform& rbAFrame, bool useReferenceFrameA = false)
- :btHingeConstraint(rbA,rbAFrame, useReferenceFrameA )
+ btHingeAccumulatedAngleConstraint(btRigidBody & rbA, const btTransform& rbAFrame, bool useReferenceFrameA = false)
+ : btHingeConstraint(rbA, rbAFrame, useReferenceFrameA)
{
- m_accumulatedAngle=getHingeAngle();
+ m_accumulatedAngle = getHingeAngle();
}
btScalar getAccumulatedHingeAngle();
- void setAccumulatedHingeAngle(btScalar accAngle);
- virtual void getInfo1 (btConstraintInfo1* info);
-
+ void setAccumulatedHingeAngle(btScalar accAngle);
+ virtual void getInfo1(btConstraintInfo1 * info);
};
-struct btHingeConstraintFloatData
+struct btHingeConstraintFloatData
{
- btTypedConstraintData m_typeConstraintData;
- btTransformFloatData m_rbAFrame; // constraint axii. Assumes z is hinge axis.
+ 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;
-
+ 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
+struct btHingeConstraintDoubleData2
{
- btTypedConstraintDoubleData m_typeConstraintData;
- btTransformDoubleData m_rbAFrame; // constraint axii. Assumes z is hinge axis.
+ 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];
-
+ 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
+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
+///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);
+ btTypedConstraint::serialize(&hingeData->m_typeConstraintData, serializer);
m_rbAFrame.serialize(hingeData->m_rbAFrame);
m_rbBFrame.serialize(hingeData->m_rbBFrame);
@@ -475,7 +452,7 @@ SIMD_FORCE_INLINE const char* btHingeConstraint::serialize(void* dataBuffer, btS
hingeData->m_maxMotorImpulse = float(m_maxMotorImpulse);
hingeData->m_motorTargetVelocity = float(m_motorTargetVelocity);
hingeData->m_useReferenceFrameA = m_useReferenceFrameA;
-#ifdef _BT_USE_CENTER_LIMIT_
+#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());
@@ -500,4 +477,4 @@ SIMD_FORCE_INLINE const char* btHingeConstraint::serialize(void* dataBuffer, btS
return btHingeConstraintDataName;
}
-#endif //BT_HINGECONSTRAINT_H
+#endif //BT_HINGECONSTRAINT_H
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btJacobianEntry.h b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btJacobianEntry.h
index 125580d199..438456fe51 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btJacobianEntry.h
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btJacobianEntry.h
@@ -18,7 +18,6 @@ subject to the following restrictions:
#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
@@ -27,25 +26,26 @@ subject to the following restrictions:
/// 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
+ATTRIBUTE_ALIGNED16(class)
+btJacobianEntry
{
public:
- btJacobianEntry() {};
+ btJacobianEntry(){};
//constraint between two different rigidbodies
btJacobianEntry(
const btMatrix3x3& world2A,
const btMatrix3x3& world2B,
- const btVector3& rel_pos1,const btVector3& rel_pos2,
+ const btVector3& rel_pos1, const btVector3& rel_pos2,
const btVector3& jointAxis,
- const btVector3& inertiaInvA,
+ const btVector3& inertiaInvA,
const btScalar massInvA,
const btVector3& inertiaInvB,
const btScalar massInvB)
- :m_linearJointAxis(jointAxis)
+ : 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_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);
@@ -54,33 +54,31 @@ public:
//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.)))
+ 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_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);
+ 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)
+ 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_0MinvJt = inertiaInvA * m_aJ;
m_1MinvJt = inertiaInvB * m_bJ;
- m_Adiag = m_0MinvJt.dot(m_aJ) + m_1MinvJt.dot(m_bJ);
+ m_Adiag = m_0MinvJt.dot(m_aJ) + m_1MinvJt.dot(m_bJ);
btAssert(m_Adiag > btScalar(0.0));
}
@@ -88,25 +86,25 @@ public:
//constraint on one rigidbody
btJacobianEntry(
const btMatrix3x3& world2A,
- const btVector3& rel_pos1,const btVector3& rel_pos2,
+ const btVector3& rel_pos1, const btVector3& rel_pos2,
const btVector3& jointAxis,
- const btVector3& inertiaInvA,
+ const btVector3& inertiaInvA,
const btScalar massInvA)
- :m_linearJointAxis(jointAxis)
+ : 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_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; }
+ 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
+ btScalar getNonDiagonal(const btJacobianEntry& jacB, const btScalar massInvA) const
{
const btJacobianEntry& jacA = *this;
btScalar lin = massInvA * jacA.m_linearJointAxis.dot(jacB.m_linearJointAxis);
@@ -114,42 +112,39 @@ public:
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
+ 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 lin0 = massInvA * lin;
btVector3 lin1 = massInvB * lin;
- btVector3 sum = ang0+ang1+lin0+lin1;
- return sum[0]+sum[1]+sum[2];
+ 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)
+ 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;
+ 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];
+ btScalar rel_vel2 = angvela[0] + angvela[1] + angvela[2];
return rel_vel2 + SIMD_EPSILON;
}
-//private:
+ //private:
- btVector3 m_linearJointAxis;
- btVector3 m_aJ;
- btVector3 m_bJ;
- btVector3 m_0MinvJt;
- btVector3 m_1MinvJt;
+ 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;
-
+ btScalar m_Adiag;
};
-#endif //BT_JACOBIAN_ENTRY_H
+#endif //BT_JACOBIAN_ENTRY_H
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btNNCGConstraintSolver.cpp b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btNNCGConstraintSolver.cpp
index f3979be358..ccf8916049 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btNNCGConstraintSolver.cpp
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btNNCGConstraintSolver.cpp
@@ -15,14 +15,9 @@ subject to the following restrictions:
#include "btNNCGConstraintSolver.h"
-
-
-
-
-
-btScalar btNNCGConstraintSolver::solveGroupCacheFriendlySetup(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer)
+btScalar btNNCGConstraintSolver::solveGroupCacheFriendlySetup(btCollisionObject** bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer)
{
- btScalar val = btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup( bodies,numBodies,manifoldPtr, numManifolds, constraints,numConstraints,infoGlobal,debugDrawer);
+ btScalar val = btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(bodies, numBodies, manifoldPtr, numManifolds, constraints, numConstraints, infoGlobal, debugDrawer);
m_pNC.resizeNoInitialize(m_tmpSolverNonContactConstraintPool.size());
m_pC.resizeNoInitialize(m_tmpSolverContactConstraintPool.size());
@@ -37,38 +32,39 @@ btScalar btNNCGConstraintSolver::solveGroupCacheFriendlySetup(btCollisionObject*
return val;
}
-btScalar btNNCGConstraintSolver::solveSingleIteration(int iteration, btCollisionObject** /*bodies */,int /*numBodies*/,btPersistentManifold** /*manifoldPtr*/, int /*numManifolds*/,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* /*debugDrawer*/)
+btScalar btNNCGConstraintSolver::solveSingleIteration(int iteration, btCollisionObject** /*bodies */, int /*numBodies*/, btPersistentManifold** /*manifoldPtr*/, int /*numManifolds*/, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* /*debugDrawer*/)
{
-
int numNonContactPool = m_tmpSolverNonContactConstraintPool.size();
int numConstraintPool = m_tmpSolverContactConstraintPool.size();
int numFrictionPool = m_tmpSolverContactFrictionConstraintPool.size();
if (infoGlobal.m_solverMode & SOLVER_RANDMIZE_ORDER)
{
- if (1) // uncomment this for a bit less random ((iteration & 7) == 0)
+ if (1) // uncomment this for a bit less random ((iteration & 7) == 0)
{
-
- for (int j=0; j<numNonContactPool; ++j) {
+ for (int j = 0; j < numNonContactPool; ++j)
+ {
int tmp = m_orderNonContactConstraintPool[j];
- int swapi = btRandInt2(j+1);
+ int swapi = btRandInt2(j + 1);
m_orderNonContactConstraintPool[j] = m_orderNonContactConstraintPool[swapi];
m_orderNonContactConstraintPool[swapi] = tmp;
}
- //contact/friction constraints are not solved more than
- if (iteration< infoGlobal.m_numIterations)
+ //contact/friction constraints are not solved more than
+ if (iteration < infoGlobal.m_numIterations)
{
- for (int j=0; j<numConstraintPool; ++j) {
+ for (int j = 0; j < numConstraintPool; ++j)
+ {
int tmp = m_orderTmpConstraintPool[j];
- int swapi = btRandInt2(j+1);
+ int swapi = btRandInt2(j + 1);
m_orderTmpConstraintPool[j] = m_orderTmpConstraintPool[swapi];
m_orderTmpConstraintPool[swapi] = tmp;
}
- for (int j=0; j<numFrictionPool; ++j) {
+ for (int j = 0; j < numFrictionPool; ++j)
+ {
int tmp = m_orderFrictionConstraintPool[j];
- int swapi = btRandInt2(j+1);
+ int swapi = btRandInt2(j + 1);
m_orderFrictionConstraintPool[j] = m_orderFrictionConstraintPool[swapi];
m_orderFrictionConstraintPool[swapi] = tmp;
}
@@ -76,39 +72,40 @@ btScalar btNNCGConstraintSolver::solveSingleIteration(int iteration, btCollision
}
}
-
btScalar deltaflengthsqr = 0;
{
- for (int j=0;j<m_tmpSolverNonContactConstraintPool.size();j++)
+ for (int j = 0; j < m_tmpSolverNonContactConstraintPool.size(); j++)
{
btSolverConstraint& constraint = m_tmpSolverNonContactConstraintPool[m_orderNonContactConstraintPool[j]];
- if (iteration < constraint.m_overrideNumSolverIterations)
+ if (iteration < constraint.m_overrideNumSolverIterations)
{
- btScalar deltaf = resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[constraint.m_solverBodyIdA],m_tmpSolverBodyPool[constraint.m_solverBodyIdB],constraint);
+ btScalar deltaf = resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[constraint.m_solverBodyIdA], m_tmpSolverBodyPool[constraint.m_solverBodyIdB], constraint);
m_deltafNC[j] = deltaf;
deltaflengthsqr += deltaf * deltaf;
}
}
}
-
- if (m_onlyForNoneContact)
+ if (m_onlyForNoneContact)
{
- if (iteration==0)
+ if (iteration == 0)
+ {
+ for (int j = 0; j < m_tmpSolverNonContactConstraintPool.size(); j++) m_pNC[j] = m_deltafNC[j];
+ }
+ else
{
- for (int j=0;j<m_tmpSolverNonContactConstraintPool.size();j++) m_pNC[j] = m_deltafNC[j];
- } else {
// deltaflengthsqrprev can be 0 only if the solver solved the problem exactly in the previous iteration. In this case we should have quit, but mainly for debug reason with this 'hack' it is now allowed to continue the calculation
- btScalar beta = m_deltafLengthSqrPrev>0 ? deltaflengthsqr / m_deltafLengthSqrPrev : 2;
- if (beta>1)
+ btScalar beta = m_deltafLengthSqrPrev > 0 ? deltaflengthsqr / m_deltafLengthSqrPrev : 2;
+ if (beta > 1)
{
- for (int j=0;j<m_tmpSolverNonContactConstraintPool.size();j++) m_pNC[j] = 0;
- } else
+ for (int j = 0; j < m_tmpSolverNonContactConstraintPool.size(); j++) m_pNC[j] = 0;
+ }
+ else
{
- for (int j=0;j<m_tmpSolverNonContactConstraintPool.size();j++)
+ for (int j = 0; j < m_tmpSolverNonContactConstraintPool.size(); j++)
{
btSolverConstraint& constraint = m_tmpSolverNonContactConstraintPool[m_orderNonContactConstraintPool[j]];
- if (iteration < constraint.m_overrideNumSolverIterations)
+ if (iteration < constraint.m_overrideNumSolverIterations)
{
btScalar additionaldeltaimpulse = beta * m_pNC[j];
constraint.m_appliedImpulse = btScalar(constraint.m_appliedImpulse) + additionaldeltaimpulse;
@@ -116,8 +113,8 @@ btScalar btNNCGConstraintSolver::solveSingleIteration(int iteration, btCollision
btSolverBody& body1 = m_tmpSolverBodyPool[constraint.m_solverBodyIdA];
btSolverBody& body2 = m_tmpSolverBodyPool[constraint.m_solverBodyIdB];
const btSolverConstraint& c = constraint;
- body1.internalApplyImpulse(c.m_contactNormal1*body1.internalGetInvMass(),c.m_angularComponentA,additionaldeltaimpulse);
- body2.internalApplyImpulse(c.m_contactNormal2*body2.internalGetInvMass(),c.m_angularComponentB,additionaldeltaimpulse);
+ body1.internalApplyImpulse(c.m_contactNormal1 * body1.internalGetInvMass(), c.m_angularComponentA, additionaldeltaimpulse);
+ body2.internalApplyImpulse(c.m_contactNormal2 * body2.internalGetInvMass(), c.m_angularComponentB, additionaldeltaimpulse);
}
}
}
@@ -125,21 +122,18 @@ btScalar btNNCGConstraintSolver::solveSingleIteration(int iteration, btCollision
m_deltafLengthSqrPrev = deltaflengthsqr;
}
-
-
{
-
- if (iteration< infoGlobal.m_numIterations)
+ if (iteration < infoGlobal.m_numIterations)
{
- for (int j=0;j<numConstraints;j++)
+ for (int j = 0; j < numConstraints; j++)
{
if (constraints[j]->isEnabled())
{
- int bodyAid = getOrInitSolverBody(constraints[j]->getRigidBodyA(),infoGlobal.m_timeStep);
- int bodyBid = getOrInitSolverBody(constraints[j]->getRigidBodyB(),infoGlobal.m_timeStep);
+ int bodyAid = getOrInitSolverBody(constraints[j]->getRigidBodyA(), infoGlobal.m_timeStep);
+ int bodyBid = getOrInitSolverBody(constraints[j]->getRigidBodyB(), infoGlobal.m_timeStep);
btSolverBody& bodyA = m_tmpSolverBodyPool[bodyAid];
btSolverBody& bodyB = m_tmpSolverBodyPool[bodyBid];
- constraints[j]->solveConstraintObsolete(bodyA,bodyB,infoGlobal.m_timeStep);
+ constraints[j]->solveConstraintObsolete(bodyA, bodyB, infoGlobal.m_timeStep);
}
}
@@ -147,203 +141,206 @@ btScalar btNNCGConstraintSolver::solveSingleIteration(int iteration, btCollision
if (infoGlobal.m_solverMode & SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS)
{
int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
- int multiplier = (infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS)? 2 : 1;
+ int multiplier = (infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS) ? 2 : 1;
- for (int c=0;c<numPoolConstraints;c++)
+ for (int c = 0; c < numPoolConstraints; c++)
{
- btScalar totalImpulse =0;
+ btScalar totalImpulse = 0;
{
const btSolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[m_orderTmpConstraintPool[c]];
- btScalar deltaf = resolveSingleConstraintRowLowerLimit(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
+ btScalar deltaf = resolveSingleConstraintRowLowerLimit(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA], m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB], solveManifold);
m_deltafC[c] = deltaf;
- deltaflengthsqr += deltaf*deltaf;
+ deltaflengthsqr += deltaf * deltaf;
totalImpulse = solveManifold.m_appliedImpulse;
}
bool applyFriction = true;
if (applyFriction)
{
{
+ btSolverConstraint& solveManifold = m_tmpSolverContactFrictionConstraintPool[m_orderFrictionConstraintPool[c * multiplier]];
- btSolverConstraint& solveManifold = m_tmpSolverContactFrictionConstraintPool[m_orderFrictionConstraintPool[c*multiplier]];
-
- if (totalImpulse>btScalar(0))
+ if (totalImpulse > btScalar(0))
{
- solveManifold.m_lowerLimit = -(solveManifold.m_friction*totalImpulse);
- solveManifold.m_upperLimit = solveManifold.m_friction*totalImpulse;
- btScalar deltaf = resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
- m_deltafCF[c*multiplier] = deltaf;
- deltaflengthsqr += deltaf*deltaf;
- } else {
- m_deltafCF[c*multiplier] = 0;
+ solveManifold.m_lowerLimit = -(solveManifold.m_friction * totalImpulse);
+ solveManifold.m_upperLimit = solveManifold.m_friction * totalImpulse;
+ btScalar deltaf = resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA], m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB], solveManifold);
+ m_deltafCF[c * multiplier] = deltaf;
+ deltaflengthsqr += deltaf * deltaf;
+ }
+ else
+ {
+ m_deltafCF[c * multiplier] = 0;
}
}
if (infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS)
{
+ btSolverConstraint& solveManifold = m_tmpSolverContactFrictionConstraintPool[m_orderFrictionConstraintPool[c * multiplier + 1]];
- btSolverConstraint& solveManifold = m_tmpSolverContactFrictionConstraintPool[m_orderFrictionConstraintPool[c*multiplier+1]];
-
- if (totalImpulse>btScalar(0))
+ if (totalImpulse > btScalar(0))
+ {
+ solveManifold.m_lowerLimit = -(solveManifold.m_friction * totalImpulse);
+ solveManifold.m_upperLimit = solveManifold.m_friction * totalImpulse;
+ btScalar deltaf = resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA], m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB], solveManifold);
+ m_deltafCF[c * multiplier + 1] = deltaf;
+ deltaflengthsqr += deltaf * deltaf;
+ }
+ else
{
- solveManifold.m_lowerLimit = -(solveManifold.m_friction*totalImpulse);
- solveManifold.m_upperLimit = solveManifold.m_friction*totalImpulse;
- btScalar deltaf = resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
- m_deltafCF[c*multiplier+1] = deltaf;
- deltaflengthsqr += deltaf*deltaf;
- } else {
- m_deltafCF[c*multiplier+1] = 0;
+ m_deltafCF[c * multiplier + 1] = 0;
}
}
}
}
-
}
- else//SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS
+ else //SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS
{
//solve the friction constraints after all contact constraints, don't interleave them
int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
int j;
- for (j=0;j<numPoolConstraints;j++)
+ for (j = 0; j < numPoolConstraints; j++)
{
const btSolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[m_orderTmpConstraintPool[j]];
- btScalar deltaf = resolveSingleConstraintRowLowerLimit(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
+ btScalar deltaf = resolveSingleConstraintRowLowerLimit(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA], m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB], solveManifold);
m_deltafC[j] = deltaf;
- deltaflengthsqr += deltaf*deltaf;
+ deltaflengthsqr += deltaf * deltaf;
}
-
-
///solve all friction constraints
int numFrictionPoolConstraints = m_tmpSolverContactFrictionConstraintPool.size();
- for (j=0;j<numFrictionPoolConstraints;j++)
+ for (j = 0; j < numFrictionPoolConstraints; j++)
{
btSolverConstraint& solveManifold = m_tmpSolverContactFrictionConstraintPool[m_orderFrictionConstraintPool[j]];
btScalar totalImpulse = m_tmpSolverContactConstraintPool[solveManifold.m_frictionIndex].m_appliedImpulse;
- if (totalImpulse>btScalar(0))
+ if (totalImpulse > btScalar(0))
{
- solveManifold.m_lowerLimit = -(solveManifold.m_friction*totalImpulse);
- solveManifold.m_upperLimit = solveManifold.m_friction*totalImpulse;
+ solveManifold.m_lowerLimit = -(solveManifold.m_friction * totalImpulse);
+ solveManifold.m_upperLimit = solveManifold.m_friction * totalImpulse;
- btScalar deltaf = resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
+ btScalar deltaf = resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA], m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB], solveManifold);
m_deltafCF[j] = deltaf;
- deltaflengthsqr += deltaf*deltaf;
- } else {
+ deltaflengthsqr += deltaf * deltaf;
+ }
+ else
+ {
m_deltafCF[j] = 0;
}
}
}
- {
+ {
int numRollingFrictionPoolConstraints = m_tmpSolverContactRollingFrictionConstraintPool.size();
- for (int j=0;j<numRollingFrictionPoolConstraints;j++)
+ for (int j = 0; j < numRollingFrictionPoolConstraints; j++)
{
-
btSolverConstraint& rollingFrictionConstraint = m_tmpSolverContactRollingFrictionConstraintPool[j];
btScalar totalImpulse = m_tmpSolverContactConstraintPool[rollingFrictionConstraint.m_frictionIndex].m_appliedImpulse;
- if (totalImpulse>btScalar(0))
+ if (totalImpulse > btScalar(0))
{
- btScalar rollingFrictionMagnitude = rollingFrictionConstraint.m_friction*totalImpulse;
- if (rollingFrictionMagnitude>rollingFrictionConstraint.m_friction)
+ btScalar rollingFrictionMagnitude = rollingFrictionConstraint.m_friction * totalImpulse;
+ if (rollingFrictionMagnitude > rollingFrictionConstraint.m_friction)
rollingFrictionMagnitude = rollingFrictionConstraint.m_friction;
rollingFrictionConstraint.m_lowerLimit = -rollingFrictionMagnitude;
rollingFrictionConstraint.m_upperLimit = rollingFrictionMagnitude;
- btScalar deltaf = resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[rollingFrictionConstraint.m_solverBodyIdA],m_tmpSolverBodyPool[rollingFrictionConstraint.m_solverBodyIdB],rollingFrictionConstraint);
+ btScalar deltaf = resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[rollingFrictionConstraint.m_solverBodyIdA], m_tmpSolverBodyPool[rollingFrictionConstraint.m_solverBodyIdB], rollingFrictionConstraint);
m_deltafCRF[j] = deltaf;
- deltaflengthsqr += deltaf*deltaf;
- } else {
+ deltaflengthsqr += deltaf * deltaf;
+ }
+ else
+ {
m_deltafCRF[j] = 0;
}
}
- }
-
+ }
}
-
-
-
}
-
-
-
- if (!m_onlyForNoneContact)
+ if (!m_onlyForNoneContact)
{
- if (iteration==0)
+ if (iteration == 0)
{
- for (int j=0;j<m_tmpSolverNonContactConstraintPool.size();j++) m_pNC[j] = m_deltafNC[j];
- for (int j=0;j<m_tmpSolverContactConstraintPool.size();j++) m_pC[j] = m_deltafC[j];
- for (int j=0;j<m_tmpSolverContactFrictionConstraintPool.size();j++) m_pCF[j] = m_deltafCF[j];
- for (int j=0;j<m_tmpSolverContactRollingFrictionConstraintPool.size();j++) m_pCRF[j] = m_deltafCRF[j];
- } else
+ for (int j = 0; j < m_tmpSolverNonContactConstraintPool.size(); j++) m_pNC[j] = m_deltafNC[j];
+ for (int j = 0; j < m_tmpSolverContactConstraintPool.size(); j++) m_pC[j] = m_deltafC[j];
+ for (int j = 0; j < m_tmpSolverContactFrictionConstraintPool.size(); j++) m_pCF[j] = m_deltafCF[j];
+ for (int j = 0; j < m_tmpSolverContactRollingFrictionConstraintPool.size(); j++) m_pCRF[j] = m_deltafCRF[j];
+ }
+ else
{
// deltaflengthsqrprev can be 0 only if the solver solved the problem exactly in the previous iteration. In this case we should have quit, but mainly for debug reason with this 'hack' it is now allowed to continue the calculation
- btScalar beta = m_deltafLengthSqrPrev>0 ? deltaflengthsqr / m_deltafLengthSqrPrev : 2;
- if (beta>1) {
- for (int j=0;j<m_tmpSolverNonContactConstraintPool.size();j++) m_pNC[j] = 0;
- for (int j=0;j<m_tmpSolverContactConstraintPool.size();j++) m_pC[j] = 0;
- for (int j=0;j<m_tmpSolverContactFrictionConstraintPool.size();j++) m_pCF[j] = 0;
- for (int j=0;j<m_tmpSolverContactRollingFrictionConstraintPool.size();j++) m_pCRF[j] = 0;
- } else {
- for (int j=0;j<m_tmpSolverNonContactConstraintPool.size();j++)
+ btScalar beta = m_deltafLengthSqrPrev > 0 ? deltaflengthsqr / m_deltafLengthSqrPrev : 2;
+ if (beta > 1)
+ {
+ for (int j = 0; j < m_tmpSolverNonContactConstraintPool.size(); j++) m_pNC[j] = 0;
+ for (int j = 0; j < m_tmpSolverContactConstraintPool.size(); j++) m_pC[j] = 0;
+ for (int j = 0; j < m_tmpSolverContactFrictionConstraintPool.size(); j++) m_pCF[j] = 0;
+ for (int j = 0; j < m_tmpSolverContactRollingFrictionConstraintPool.size(); j++) m_pCRF[j] = 0;
+ }
+ else
+ {
+ for (int j = 0; j < m_tmpSolverNonContactConstraintPool.size(); j++)
{
btSolverConstraint& constraint = m_tmpSolverNonContactConstraintPool[m_orderNonContactConstraintPool[j]];
- if (iteration < constraint.m_overrideNumSolverIterations) {
+ if (iteration < constraint.m_overrideNumSolverIterations)
+ {
btScalar additionaldeltaimpulse = beta * m_pNC[j];
constraint.m_appliedImpulse = btScalar(constraint.m_appliedImpulse) + additionaldeltaimpulse;
m_pNC[j] = beta * m_pNC[j] + m_deltafNC[j];
btSolverBody& body1 = m_tmpSolverBodyPool[constraint.m_solverBodyIdA];
btSolverBody& body2 = m_tmpSolverBodyPool[constraint.m_solverBodyIdB];
const btSolverConstraint& c = constraint;
- body1.internalApplyImpulse(c.m_contactNormal1*body1.internalGetInvMass(),c.m_angularComponentA,additionaldeltaimpulse);
- body2.internalApplyImpulse(c.m_contactNormal2*body2.internalGetInvMass(),c.m_angularComponentB,additionaldeltaimpulse);
+ body1.internalApplyImpulse(c.m_contactNormal1 * body1.internalGetInvMass(), c.m_angularComponentA, additionaldeltaimpulse);
+ body2.internalApplyImpulse(c.m_contactNormal2 * body2.internalGetInvMass(), c.m_angularComponentB, additionaldeltaimpulse);
}
}
- for (int j=0;j<m_tmpSolverContactConstraintPool.size();j++)
+ for (int j = 0; j < m_tmpSolverContactConstraintPool.size(); j++)
{
btSolverConstraint& constraint = m_tmpSolverContactConstraintPool[m_orderTmpConstraintPool[j]];
- if (iteration< infoGlobal.m_numIterations) {
+ if (iteration < infoGlobal.m_numIterations)
+ {
btScalar additionaldeltaimpulse = beta * m_pC[j];
constraint.m_appliedImpulse = btScalar(constraint.m_appliedImpulse) + additionaldeltaimpulse;
m_pC[j] = beta * m_pC[j] + m_deltafC[j];
btSolverBody& body1 = m_tmpSolverBodyPool[constraint.m_solverBodyIdA];
btSolverBody& body2 = m_tmpSolverBodyPool[constraint.m_solverBodyIdB];
const btSolverConstraint& c = constraint;
- body1.internalApplyImpulse(c.m_contactNormal1*body1.internalGetInvMass(),c.m_angularComponentA,additionaldeltaimpulse);
- body2.internalApplyImpulse(c.m_contactNormal2*body2.internalGetInvMass(),c.m_angularComponentB,additionaldeltaimpulse);
+ body1.internalApplyImpulse(c.m_contactNormal1 * body1.internalGetInvMass(), c.m_angularComponentA, additionaldeltaimpulse);
+ body2.internalApplyImpulse(c.m_contactNormal2 * body2.internalGetInvMass(), c.m_angularComponentB, additionaldeltaimpulse);
}
}
- for (int j=0;j<m_tmpSolverContactFrictionConstraintPool.size();j++)
+ for (int j = 0; j < m_tmpSolverContactFrictionConstraintPool.size(); j++)
{
btSolverConstraint& constraint = m_tmpSolverContactFrictionConstraintPool[m_orderFrictionConstraintPool[j]];
- if (iteration< infoGlobal.m_numIterations) {
+ if (iteration < infoGlobal.m_numIterations)
+ {
btScalar additionaldeltaimpulse = beta * m_pCF[j];
constraint.m_appliedImpulse = btScalar(constraint.m_appliedImpulse) + additionaldeltaimpulse;
m_pCF[j] = beta * m_pCF[j] + m_deltafCF[j];
btSolverBody& body1 = m_tmpSolverBodyPool[constraint.m_solverBodyIdA];
btSolverBody& body2 = m_tmpSolverBodyPool[constraint.m_solverBodyIdB];
const btSolverConstraint& c = constraint;
- body1.internalApplyImpulse(c.m_contactNormal1*body1.internalGetInvMass(),c.m_angularComponentA,additionaldeltaimpulse);
- body2.internalApplyImpulse(c.m_contactNormal2*body2.internalGetInvMass(),c.m_angularComponentB,additionaldeltaimpulse);
+ body1.internalApplyImpulse(c.m_contactNormal1 * body1.internalGetInvMass(), c.m_angularComponentA, additionaldeltaimpulse);
+ body2.internalApplyImpulse(c.m_contactNormal2 * body2.internalGetInvMass(), c.m_angularComponentB, additionaldeltaimpulse);
}
}
{
- for (int j=0;j<m_tmpSolverContactRollingFrictionConstraintPool.size();j++)
+ for (int j = 0; j < m_tmpSolverContactRollingFrictionConstraintPool.size(); j++)
{
btSolverConstraint& constraint = m_tmpSolverContactRollingFrictionConstraintPool[j];
- if (iteration< infoGlobal.m_numIterations) {
+ if (iteration < infoGlobal.m_numIterations)
+ {
btScalar additionaldeltaimpulse = beta * m_pCRF[j];
constraint.m_appliedImpulse = btScalar(constraint.m_appliedImpulse) + additionaldeltaimpulse;
m_pCRF[j] = beta * m_pCRF[j] + m_deltafCRF[j];
btSolverBody& body1 = m_tmpSolverBodyPool[constraint.m_solverBodyIdA];
btSolverBody& body2 = m_tmpSolverBodyPool[constraint.m_solverBodyIdB];
const btSolverConstraint& c = constraint;
- body1.internalApplyImpulse(c.m_contactNormal1*body1.internalGetInvMass(),c.m_angularComponentA,additionaldeltaimpulse);
- body2.internalApplyImpulse(c.m_contactNormal2*body2.internalGetInvMass(),c.m_angularComponentB,additionaldeltaimpulse);
+ body1.internalApplyImpulse(c.m_contactNormal1 * body1.internalGetInvMass(), c.m_angularComponentA, additionaldeltaimpulse);
+ body2.internalApplyImpulse(c.m_contactNormal2 * body2.internalGetInvMass(), c.m_angularComponentB, additionaldeltaimpulse);
}
}
}
@@ -355,7 +352,7 @@ btScalar btNNCGConstraintSolver::solveSingleIteration(int iteration, btCollision
return deltaflengthsqr;
}
-btScalar btNNCGConstraintSolver::solveGroupCacheFriendlyFinish(btCollisionObject** bodies,int numBodies,const btContactSolverInfo& infoGlobal)
+btScalar btNNCGConstraintSolver::solveGroupCacheFriendlyFinish(btCollisionObject** bodies, int numBodies, const btContactSolverInfo& infoGlobal)
{
m_pNC.resizeNoInitialize(0);
m_pC.resizeNoInitialize(0);
@@ -369,6 +366,3 @@ btScalar btNNCGConstraintSolver::solveGroupCacheFriendlyFinish(btCollisionObject
return btSequentialImpulseConstraintSolver::solveGroupCacheFriendlyFinish(bodies, numBodies, infoGlobal);
}
-
-
-
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btNNCGConstraintSolver.h b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btNNCGConstraintSolver.h
index a300929cd5..c84f274a99 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btNNCGConstraintSolver.h
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btNNCGConstraintSolver.h
@@ -18,33 +18,30 @@ subject to the following restrictions:
#include "btSequentialImpulseConstraintSolver.h"
-ATTRIBUTE_ALIGNED16(class) btNNCGConstraintSolver : public btSequentialImpulseConstraintSolver
+ATTRIBUTE_ALIGNED16(class)
+btNNCGConstraintSolver : public btSequentialImpulseConstraintSolver
{
protected:
-
btScalar m_deltafLengthSqrPrev;
- btAlignedObjectArray<btScalar> m_pNC; // p for None Contact constraints
- btAlignedObjectArray<btScalar> m_pC; // p for Contact constraints
- btAlignedObjectArray<btScalar> m_pCF; // p for ContactFriction constraints
- btAlignedObjectArray<btScalar> m_pCRF; // p for ContactRollingFriction constraints
+ btAlignedObjectArray<btScalar> m_pNC; // p for None Contact constraints
+ btAlignedObjectArray<btScalar> m_pC; // p for Contact constraints
+ btAlignedObjectArray<btScalar> m_pCF; // p for ContactFriction constraints
+ btAlignedObjectArray<btScalar> m_pCRF; // p for ContactRollingFriction constraints
//These are recalculated in every iterations. We just keep these to prevent reallocation in each iteration.
- btAlignedObjectArray<btScalar> m_deltafNC; // deltaf for NoneContact constraints
- btAlignedObjectArray<btScalar> m_deltafC; // deltaf for Contact constraints
- btAlignedObjectArray<btScalar> m_deltafCF; // deltaf for ContactFriction constraints
- btAlignedObjectArray<btScalar> m_deltafCRF; // deltaf for ContactRollingFriction constraints
+ btAlignedObjectArray<btScalar> m_deltafNC; // deltaf for NoneContact constraints
+ btAlignedObjectArray<btScalar> m_deltafC; // deltaf for Contact constraints
+ btAlignedObjectArray<btScalar> m_deltafCF; // deltaf for ContactFriction constraints
+ btAlignedObjectArray<btScalar> 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 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 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) {}
@@ -57,8 +54,4 @@ public:
bool m_onlyForNoneContact;
};
-
-
-
-#endif //BT_NNCG_CONSTRAINT_SOLVER_H
-
+#endif //BT_NNCG_CONSTRAINT_SOLVER_H
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.cpp b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.cpp
index 3c0430b903..ad399dc57f 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.cpp
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.cpp
@@ -13,217 +13,193 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btPoint2PointConstraint.h"
#include "BulletDynamics/Dynamics/btRigidBody.h"
#include <new>
-
-
-
-
-btPoint2PointConstraint::btPoint2PointConstraint(btRigidBody& rbA,btRigidBody& rbB, const btVector3& pivotInA,const btVector3& pivotInB)
-:btTypedConstraint(POINT2POINT_CONSTRAINT_TYPE,rbA,rbB),m_pivotInA(pivotInA),m_pivotInB(pivotInB),
-m_flags(0),
-m_useSolveConstraintObsolete(false)
+btPoint2PointConstraint::btPoint2PointConstraint(btRigidBody& rbA, btRigidBody& rbB, const btVector3& pivotInA, const btVector3& pivotInB)
+ : btTypedConstraint(POINT2POINT_CONSTRAINT_TYPE, rbA, rbB), m_pivotInA(pivotInA), m_pivotInB(pivotInB), m_flags(0), m_useSolveConstraintObsolete(false)
{
-
}
-
-btPoint2PointConstraint::btPoint2PointConstraint(btRigidBody& rbA,const btVector3& pivotInA)
-:btTypedConstraint(POINT2POINT_CONSTRAINT_TYPE,rbA),m_pivotInA(pivotInA),m_pivotInB(rbA.getCenterOfMassTransform()(pivotInA)),
-m_flags(0),
-m_useSolveConstraintObsolete(false)
+btPoint2PointConstraint::btPoint2PointConstraint(btRigidBody& rbA, const btVector3& pivotInA)
+ : btTypedConstraint(POINT2POINT_CONSTRAINT_TYPE, rbA), m_pivotInA(pivotInA), m_pivotInB(rbA.getCenterOfMassTransform()(pivotInA)), m_flags(0), m_useSolveConstraintObsolete(false)
{
-
}
-void btPoint2PointConstraint::buildJacobian()
+void btPoint2PointConstraint::buildJacobian()
{
-
///we need it for both methods
{
m_appliedImpulse = btScalar(0.);
- btVector3 normal(0,0,0);
+ btVector3 normal(0, 0, 0);
- for (int i=0;i<3;i++)
+ for (int i = 0; i < 3; i++)
{
normal[i] = 1;
new (&m_jac[i]) btJacobianEntry(
- m_rbA.getCenterOfMassTransform().getBasis().transpose(),
- m_rbB.getCenterOfMassTransform().getBasis().transpose(),
- m_rbA.getCenterOfMassTransform()*m_pivotInA - m_rbA.getCenterOfMassPosition(),
- m_rbB.getCenterOfMassTransform()*m_pivotInB - m_rbB.getCenterOfMassPosition(),
- normal,
- m_rbA.getInvInertiaDiagLocal(),
- m_rbA.getInvMass(),
- m_rbB.getInvInertiaDiagLocal(),
- m_rbB.getInvMass());
- normal[i] = 0;
+ m_rbA.getCenterOfMassTransform().getBasis().transpose(),
+ m_rbB.getCenterOfMassTransform().getBasis().transpose(),
+ m_rbA.getCenterOfMassTransform() * m_pivotInA - m_rbA.getCenterOfMassPosition(),
+ m_rbB.getCenterOfMassTransform() * m_pivotInB - m_rbB.getCenterOfMassPosition(),
+ normal,
+ m_rbA.getInvInertiaDiagLocal(),
+ m_rbA.getInvMass(),
+ m_rbB.getInvInertiaDiagLocal(),
+ m_rbB.getInvMass());
+ normal[i] = 0;
}
}
-
-
}
-void btPoint2PointConstraint::getInfo1 (btConstraintInfo1* info)
+void btPoint2PointConstraint::getInfo1(btConstraintInfo1* info)
{
getInfo1NonVirtual(info);
}
-void btPoint2PointConstraint::getInfo1NonVirtual (btConstraintInfo1* info)
+void btPoint2PointConstraint::getInfo1NonVirtual(btConstraintInfo1* info)
{
if (m_useSolveConstraintObsolete)
{
info->m_numConstraintRows = 0;
info->nub = 0;
- } else
+ }
+ else
{
info->m_numConstraintRows = 3;
info->nub = 3;
}
}
-
-
-
-void btPoint2PointConstraint::getInfo2 (btConstraintInfo2* info)
+void btPoint2PointConstraint::getInfo2(btConstraintInfo2* info)
{
- getInfo2NonVirtual(info, m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
+ getInfo2NonVirtual(info, m_rbA.getCenterOfMassTransform(), m_rbB.getCenterOfMassTransform());
}
-void btPoint2PointConstraint::getInfo2NonVirtual (btConstraintInfo2* info, const btTransform& body0_trans, const btTransform& body1_trans)
+void btPoint2PointConstraint::getInfo2NonVirtual(btConstraintInfo2* info, const btTransform& body0_trans, const btTransform& body1_trans)
{
btAssert(!m_useSolveConstraintObsolete);
- //retrieve matrices
+ //retrieve matrices
// anchor points in global coordinates with respect to body PORs.
-
- // set jacobian
- info->m_J1linearAxis[0] = 1;
- info->m_J1linearAxis[info->rowskip+1] = 1;
- info->m_J1linearAxis[2*info->rowskip+2] = 1;
- btVector3 a1 = body0_trans.getBasis()*getPivotInA();
+ // set jacobian
+ info->m_J1linearAxis[0] = 1;
+ info->m_J1linearAxis[info->rowskip + 1] = 1;
+ info->m_J1linearAxis[2 * info->rowskip + 2] = 1;
+
+ btVector3 a1 = body0_trans.getBasis() * getPivotInA();
{
btVector3* angular0 = (btVector3*)(info->m_J1angularAxis);
- btVector3* angular1 = (btVector3*)(info->m_J1angularAxis+info->rowskip);
- btVector3* angular2 = (btVector3*)(info->m_J1angularAxis+2*info->rowskip);
+ btVector3* angular1 = (btVector3*)(info->m_J1angularAxis + info->rowskip);
+ btVector3* angular2 = (btVector3*)(info->m_J1angularAxis + 2 * info->rowskip);
btVector3 a1neg = -a1;
- a1neg.getSkewSymmetricMatrix(angular0,angular1,angular2);
+ a1neg.getSkewSymmetricMatrix(angular0, angular1, angular2);
}
-
+
info->m_J2linearAxis[0] = -1;
- info->m_J2linearAxis[info->rowskip+1] = -1;
- info->m_J2linearAxis[2*info->rowskip+2] = -1;
-
- btVector3 a2 = body1_trans.getBasis()*getPivotInB();
-
+ info->m_J2linearAxis[info->rowskip + 1] = -1;
+ info->m_J2linearAxis[2 * info->rowskip + 2] = -1;
+
+ btVector3 a2 = body1_trans.getBasis() * getPivotInB();
+
{
- // btVector3 a2n = -a2;
+ // btVector3 a2n = -a2;
btVector3* angular0 = (btVector3*)(info->m_J2angularAxis);
- btVector3* angular1 = (btVector3*)(info->m_J2angularAxis+info->rowskip);
- btVector3* angular2 = (btVector3*)(info->m_J2angularAxis+2*info->rowskip);
- a2.getSkewSymmetricMatrix(angular0,angular1,angular2);
+ btVector3* angular1 = (btVector3*)(info->m_J2angularAxis + info->rowskip);
+ btVector3* angular2 = (btVector3*)(info->m_J2angularAxis + 2 * info->rowskip);
+ a2.getSkewSymmetricMatrix(angular0, angular1, angular2);
}
-
-
- // set right hand side
+ // set right hand side
btScalar currERP = (m_flags & BT_P2P_FLAGS_ERP) ? m_erp : info->erp;
- btScalar k = info->fps * currERP;
- int j;
- for (j=0; j<3; j++)
- {
- info->m_constraintError[j*info->rowskip] = k * (a2[j] + body1_trans.getOrigin()[j] - a1[j] - body0_trans.getOrigin()[j]);
+ btScalar k = info->fps * currERP;
+ int j;
+ for (j = 0; j < 3; j++)
+ {
+ info->m_constraintError[j * info->rowskip] = k * (a2[j] + body1_trans.getOrigin()[j] - a1[j] - body0_trans.getOrigin()[j]);
//printf("info->m_constraintError[%d]=%f\n",j,info->m_constraintError[j]);
- }
- if(m_flags & BT_P2P_FLAGS_CFM)
+ }
+ if (m_flags & BT_P2P_FLAGS_CFM)
{
- for (j=0; j<3; j++)
+ for (j = 0; j < 3; j++)
{
- info->cfm[j*info->rowskip] = m_cfm;
+ info->cfm[j * info->rowskip] = m_cfm;
}
}
- btScalar impulseClamp = m_setting.m_impulseClamp;//
- for (j=0; j<3; j++)
- {
+ btScalar impulseClamp = m_setting.m_impulseClamp; //
+ for (j = 0; j < 3; j++)
+ {
if (m_setting.m_impulseClamp > 0)
{
- info->m_lowerLimit[j*info->rowskip] = -impulseClamp;
- info->m_upperLimit[j*info->rowskip] = impulseClamp;
+ info->m_lowerLimit[j * info->rowskip] = -impulseClamp;
+ info->m_upperLimit[j * info->rowskip] = impulseClamp;
}
}
info->m_damping = m_setting.m_damping;
-
}
-
-
-void btPoint2PointConstraint::updateRHS(btScalar timeStep)
+void btPoint2PointConstraint::updateRHS(btScalar timeStep)
{
(void)timeStep;
-
}
-///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5).
+///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.
void btPoint2PointConstraint::setParam(int num, btScalar value, int axis)
{
- if(axis != -1)
+ if (axis != -1)
{
btAssertConstrParams(0);
}
else
{
- switch(num)
+ switch (num)
{
- case BT_CONSTRAINT_ERP :
- case BT_CONSTRAINT_STOP_ERP :
- m_erp = value;
+ case BT_CONSTRAINT_ERP:
+ case BT_CONSTRAINT_STOP_ERP:
+ m_erp = value;
m_flags |= BT_P2P_FLAGS_ERP;
break;
- case BT_CONSTRAINT_CFM :
- case BT_CONSTRAINT_STOP_CFM :
- m_cfm = value;
+ case BT_CONSTRAINT_CFM:
+ case BT_CONSTRAINT_STOP_CFM:
+ m_cfm = value;
m_flags |= BT_P2P_FLAGS_CFM;
break;
- default:
+ default:
btAssertConstrParams(0);
}
}
}
///return the local value of parameter
-btScalar btPoint2PointConstraint::getParam(int num, int axis) const
+btScalar btPoint2PointConstraint::getParam(int num, int axis) const
{
btScalar retVal(SIMD_INFINITY);
- if(axis != -1)
+ if (axis != -1)
{
btAssertConstrParams(0);
}
else
{
- switch(num)
+ switch (num)
{
- case BT_CONSTRAINT_ERP :
- case BT_CONSTRAINT_STOP_ERP :
+ case BT_CONSTRAINT_ERP:
+ case BT_CONSTRAINT_STOP_ERP:
btAssertConstrParams(m_flags & BT_P2P_FLAGS_ERP);
- retVal = m_erp;
+ retVal = m_erp;
break;
- case BT_CONSTRAINT_CFM :
- case BT_CONSTRAINT_STOP_CFM :
+ case BT_CONSTRAINT_CFM:
+ case BT_CONSTRAINT_STOP_CFM:
btAssertConstrParams(m_flags & BT_P2P_FLAGS_CFM);
- retVal = m_cfm;
+ retVal = m_cfm;
break;
- default:
+ default:
btAssertConstrParams(0);
}
}
return retVal;
}
-
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h
index 8fa03d719d..4717e19800 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h
@@ -22,26 +22,24 @@ subject to the following restrictions:
class btRigidBody;
-
#ifdef BT_USE_DOUBLE_PRECISION
-#define btPoint2PointConstraintData2 btPoint2PointConstraintDoubleData2
-#define btPoint2PointConstraintDataName "btPoint2PointConstraintDoubleData2"
+#define btPoint2PointConstraintData2 btPoint2PointConstraintDoubleData2
+#define btPoint2PointConstraintDataName "btPoint2PointConstraintDoubleData2"
#else
-#define btPoint2PointConstraintData2 btPoint2PointConstraintFloatData
-#define btPoint2PointConstraintDataName "btPoint2PointConstraintFloatData"
-#endif //BT_USE_DOUBLE_PRECISION
+#define btPoint2PointConstraintData2 btPoint2PointConstraintFloatData
+#define btPoint2PointConstraintDataName "btPoint2PointConstraintFloatData"
+#endif //BT_USE_DOUBLE_PRECISION
-struct btConstraintSetting
+struct btConstraintSetting
{
- btConstraintSetting() :
- m_tau(btScalar(0.3)),
- m_damping(btScalar(1.)),
- m_impulseClamp(btScalar(0.))
+ btConstraintSetting() : m_tau(btScalar(0.3)),
+ m_damping(btScalar(1.)),
+ m_impulseClamp(btScalar(0.))
{
}
- btScalar m_tau;
- btScalar m_damping;
- btScalar m_impulseClamp;
+ btScalar m_tau;
+ btScalar m_damping;
+ btScalar m_impulseClamp;
};
enum btPoint2PointFlags
@@ -51,52 +49,51 @@ enum btPoint2PointFlags
};
/// 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
+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:
+ 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;
+ bool m_useSolveConstraintObsolete;
- btPoint2PointConstraint(btRigidBody& rbA,btRigidBody& rbB, const btVector3& pivotInA,const btVector3& pivotInB);
+ btConstraintSetting m_setting;
- btPoint2PointConstraint(btRigidBody& rbA,const btVector3& pivotInA);
+ btPoint2PointConstraint(btRigidBody & rbA, btRigidBody & rbB, const btVector3& pivotInA, const btVector3& pivotInB);
+ btPoint2PointConstraint(btRigidBody & rbA, const btVector3& pivotInA);
- virtual void buildJacobian();
+ virtual void buildJacobian();
- virtual void getInfo1 (btConstraintInfo1* info);
+ virtual void getInfo1(btConstraintInfo1 * info);
- void getInfo1NonVirtual (btConstraintInfo1* info);
+ void getInfo1NonVirtual(btConstraintInfo1 * info);
- virtual void getInfo2 (btConstraintInfo2* info);
+ virtual void getInfo2(btConstraintInfo2 * info);
- void getInfo2NonVirtual (btConstraintInfo2* info, const btTransform& body0_trans, const btTransform& body1_trans);
+ void getInfo2NonVirtual(btConstraintInfo2 * info, const btTransform& body0_trans, const btTransform& body1_trans);
- void updateRHS(btScalar timeStep);
+ void updateRHS(btScalar timeStep);
- void setPivotA(const btVector3& pivotA)
+ void setPivotA(const btVector3& pivotA)
{
m_pivotInA = pivotA;
}
- void setPivotB(const btVector3& pivotB)
+ void setPivotB(const btVector3& pivotB)
{
m_pivotInB = pivotB;
}
@@ -111,70 +108,66 @@ public:
return m_pivotInB;
}
- ///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5).
+ ///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 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
+ virtual btScalar getParam(int num, int axis = -1) const;
+
+ virtual int getFlags() const
{
- return m_flags;
- }
+ return m_flags;
+ }
- virtual int calculateSerializeBufferSize() 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;
-
-
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
};
///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
-struct btPoint2PointConstraintFloatData
+struct btPoint2PointConstraintFloatData
{
- btTypedConstraintData m_typeConstraintData;
- btVector3FloatData m_pivotInA;
- btVector3FloatData m_pivotInB;
+ btTypedConstraintData m_typeConstraintData;
+ btVector3FloatData m_pivotInA;
+ btVector3FloatData m_pivotInB;
};
///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
-struct btPoint2PointConstraintDoubleData2
+struct btPoint2PointConstraintDoubleData2
{
- btTypedConstraintDoubleData m_typeConstraintData;
- btVector3DoubleData m_pivotInA;
- btVector3DoubleData m_pivotInB;
+ 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
+struct btPoint2PointConstraintDoubleData
{
- btTypedConstraintData m_typeConstraintData;
- btVector3DoubleData m_pivotInA;
- btVector3DoubleData m_pivotInB;
+ btTypedConstraintData m_typeConstraintData;
+ btVector3DoubleData m_pivotInA;
+ btVector3DoubleData m_pivotInB;
};
-#endif //BT_BACKWARDS_COMPATIBLE_SERIALIZATION
+#endif //BT_BACKWARDS_COMPATIBLE_SERIALIZATION
-
-SIMD_FORCE_INLINE int btPoint2PointConstraint::calculateSerializeBufferSize() const
+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
+///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);
+ btTypedConstraint::serialize(&p2pData->m_typeConstraintData, serializer);
m_pivotInA.serialize(p2pData->m_pivotInA);
m_pivotInB.serialize(p2pData->m_pivotInB);
return btPoint2PointConstraintDataName;
}
-#endif //BT_POINT2POINTCONSTRAINT_H
+#endif //BT_POINT2POINTCONSTRAINT_H
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp
index 63174a6ec0..def3227b43 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp
@@ -21,7 +21,6 @@ subject to the following restrictions:
#include "btSequentialImpulseConstraintSolver.h"
#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h"
-
#include "LinearMath/btIDebugDraw.h"
#include "LinearMath/btCpuFeatureUtility.h"
@@ -34,9 +33,9 @@ subject to the following restrictions:
//#include "btSolverBody.h"
//#include "btSolverConstraint.h"
#include "LinearMath/btAlignedObjectArray.h"
-#include <string.h> //for memset
+#include <string.h> //for memset
-int gNumSplitImpulseRecoveries = 0;
+int gNumSplitImpulseRecoveries = 0;
#include "BulletDynamics/Dynamics/btRigidBody.h"
@@ -45,13 +44,13 @@ int gNumSplitImpulseRecoveries = 0;
///Below are optional SSE2 and SSE4/FMA3 versions. We assume most hardware has SSE2. For SSE4/FMA3 we perform a CPU feature check.
static btScalar gResolveSingleConstraintRowGeneric_scalar_reference(btSolverBody& bodyA, btSolverBody& bodyB, const btSolverConstraint& c)
{
- btScalar deltaImpulse = c.m_rhs - btScalar(c.m_appliedImpulse)*c.m_cfm;
+ btScalar deltaImpulse = c.m_rhs - btScalar(c.m_appliedImpulse) * c.m_cfm;
const btScalar deltaVel1Dotn = c.m_contactNormal1.dot(bodyA.internalGetDeltaLinearVelocity()) + c.m_relpos1CrossNormal.dot(bodyA.internalGetDeltaAngularVelocity());
const btScalar deltaVel2Dotn = c.m_contactNormal2.dot(bodyB.internalGetDeltaLinearVelocity()) + c.m_relpos2CrossNormal.dot(bodyB.internalGetDeltaAngularVelocity());
// const btScalar delta_rel_vel = deltaVel1Dotn-deltaVel2Dotn;
- deltaImpulse -= deltaVel1Dotn*c.m_jacDiagABInv;
- deltaImpulse -= deltaVel2Dotn*c.m_jacDiagABInv;
+ deltaImpulse -= deltaVel1Dotn * c.m_jacDiagABInv;
+ deltaImpulse -= deltaVel2Dotn * c.m_jacDiagABInv;
const btScalar sum = btScalar(c.m_appliedImpulse) + deltaImpulse;
if (sum < c.m_lowerLimit)
@@ -69,21 +68,20 @@ static btScalar gResolveSingleConstraintRowGeneric_scalar_reference(btSolverBody
c.m_appliedImpulse = sum;
}
- bodyA.internalApplyImpulse(c.m_contactNormal1*bodyA.internalGetInvMass(), c.m_angularComponentA, deltaImpulse);
- bodyB.internalApplyImpulse(c.m_contactNormal2*bodyB.internalGetInvMass(), c.m_angularComponentB, deltaImpulse);
+ bodyA.internalApplyImpulse(c.m_contactNormal1 * bodyA.internalGetInvMass(), c.m_angularComponentA, deltaImpulse);
+ bodyB.internalApplyImpulse(c.m_contactNormal2 * bodyB.internalGetInvMass(), c.m_angularComponentB, deltaImpulse);
- return deltaImpulse*(1./c.m_jacDiagABInv);
+ return deltaImpulse * (1. / c.m_jacDiagABInv);
}
-
static btScalar gResolveSingleConstraintRowLowerLimit_scalar_reference(btSolverBody& bodyA, btSolverBody& bodyB, const btSolverConstraint& c)
{
- btScalar deltaImpulse = c.m_rhs - btScalar(c.m_appliedImpulse)*c.m_cfm;
+ btScalar deltaImpulse = c.m_rhs - btScalar(c.m_appliedImpulse) * c.m_cfm;
const btScalar deltaVel1Dotn = c.m_contactNormal1.dot(bodyA.internalGetDeltaLinearVelocity()) + c.m_relpos1CrossNormal.dot(bodyA.internalGetDeltaAngularVelocity());
const btScalar deltaVel2Dotn = c.m_contactNormal2.dot(bodyB.internalGetDeltaLinearVelocity()) + c.m_relpos2CrossNormal.dot(bodyB.internalGetDeltaAngularVelocity());
- deltaImpulse -= deltaVel1Dotn*c.m_jacDiagABInv;
- deltaImpulse -= deltaVel2Dotn*c.m_jacDiagABInv;
+ deltaImpulse -= deltaVel1Dotn * c.m_jacDiagABInv;
+ deltaImpulse -= deltaVel2Dotn * c.m_jacDiagABInv;
const btScalar sum = btScalar(c.m_appliedImpulse) + deltaImpulse;
if (sum < c.m_lowerLimit)
{
@@ -94,58 +92,55 @@ static btScalar gResolveSingleConstraintRowLowerLimit_scalar_reference(btSolverB
{
c.m_appliedImpulse = sum;
}
- bodyA.internalApplyImpulse(c.m_contactNormal1*bodyA.internalGetInvMass(), c.m_angularComponentA, deltaImpulse);
- bodyB.internalApplyImpulse(c.m_contactNormal2*bodyB.internalGetInvMass(), c.m_angularComponentB, deltaImpulse);
+ bodyA.internalApplyImpulse(c.m_contactNormal1 * bodyA.internalGetInvMass(), c.m_angularComponentA, deltaImpulse);
+ bodyB.internalApplyImpulse(c.m_contactNormal2 * bodyB.internalGetInvMass(), c.m_angularComponentB, deltaImpulse);
- return deltaImpulse*(1./c.m_jacDiagABInv);
+ return deltaImpulse * (1. / c.m_jacDiagABInv);
}
-
-
#ifdef USE_SIMD
#include <emmintrin.h>
-
-#define btVecSplat(x, e) _mm_shuffle_ps(x, x, _MM_SHUFFLE(e,e,e,e))
-static inline __m128 btSimdDot3( __m128 vec0, __m128 vec1 )
+#define btVecSplat(x, e) _mm_shuffle_ps(x, x, _MM_SHUFFLE(e, e, e, e))
+static inline __m128 btSimdDot3(__m128 vec0, __m128 vec1)
{
- __m128 result = _mm_mul_ps( vec0, vec1);
- return _mm_add_ps( btVecSplat( result, 0 ), _mm_add_ps( btVecSplat( result, 1 ), btVecSplat( result, 2 ) ) );
+ __m128 result = _mm_mul_ps(vec0, vec1);
+ return _mm_add_ps(btVecSplat(result, 0), _mm_add_ps(btVecSplat(result, 1), btVecSplat(result, 2)));
}
-#if defined (BT_ALLOW_SSE4)
+#if defined(BT_ALLOW_SSE4)
#include <intrin.h>
-#define USE_FMA 1
-#define USE_FMA3_INSTEAD_FMA4 1
-#define USE_SSE4_DOT 1
+#define USE_FMA 1
+#define USE_FMA3_INSTEAD_FMA4 1
+#define USE_SSE4_DOT 1
-#define SSE4_DP(a, b) _mm_dp_ps(a, b, 0x7f)
-#define SSE4_DP_FP(a, b) _mm_cvtss_f32(_mm_dp_ps(a, b, 0x7f))
+#define SSE4_DP(a, b) _mm_dp_ps(a, b, 0x7f)
+#define SSE4_DP_FP(a, b) _mm_cvtss_f32(_mm_dp_ps(a, b, 0x7f))
#if USE_SSE4_DOT
-#define DOT_PRODUCT(a, b) SSE4_DP(a, b)
+#define DOT_PRODUCT(a, b) SSE4_DP(a, b)
#else
-#define DOT_PRODUCT(a, b) btSimdDot3(a, b)
+#define DOT_PRODUCT(a, b) btSimdDot3(a, b)
#endif
#if USE_FMA
#if USE_FMA3_INSTEAD_FMA4
// a*b + c
-#define FMADD(a, b, c) _mm_fmadd_ps(a, b, c)
+#define FMADD(a, b, c) _mm_fmadd_ps(a, b, c)
// -(a*b) + c
-#define FMNADD(a, b, c) _mm_fnmadd_ps(a, b, c)
-#else // USE_FMA3
+#define FMNADD(a, b, c) _mm_fnmadd_ps(a, b, c)
+#else // USE_FMA3
// a*b + c
-#define FMADD(a, b, c) _mm_macc_ps(a, b, c)
+#define FMADD(a, b, c) _mm_macc_ps(a, b, c)
// -(a*b) + c
-#define FMNADD(a, b, c) _mm_nmacc_ps(a, b, c)
+#define FMNADD(a, b, c) _mm_nmacc_ps(a, b, c)
#endif
-#else // USE_FMA
+#else // USE_FMA
// c + a*b
-#define FMADD(a, b, c) _mm_add_ps(c, _mm_mul_ps(a, b))
+#define FMADD(a, b, c) _mm_add_ps(c, _mm_mul_ps(a, b))
// c - a*b
-#define FMNADD(a, b, c) _mm_sub_ps(c, _mm_mul_ps(a, b))
+#define FMNADD(a, b, c) _mm_sub_ps(c, _mm_mul_ps(a, b))
#endif
#endif
@@ -153,8 +148,8 @@ static inline __m128 btSimdDot3( __m128 vec0, __m128 vec1 )
static btScalar gResolveSingleConstraintRowGeneric_sse2(btSolverBody& bodyA, btSolverBody& bodyB, const btSolverConstraint& c)
{
__m128 cpAppliedImp = _mm_set1_ps(c.m_appliedImpulse);
- __m128 lowerLimit1 = _mm_set1_ps(c.m_lowerLimit);
- __m128 upperLimit1 = _mm_set1_ps(c.m_upperLimit);
+ __m128 lowerLimit1 = _mm_set1_ps(c.m_lowerLimit);
+ __m128 upperLimit1 = _mm_set1_ps(c.m_upperLimit);
btSimdScalar deltaImpulse = _mm_sub_ps(_mm_set1_ps(c.m_rhs), _mm_mul_ps(_mm_set1_ps(c.m_appliedImpulse), _mm_set1_ps(c.m_cfm)));
__m128 deltaVel1Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal1.mVec128, bodyA.internalGetDeltaLinearVelocity().mVec128), btSimdDot3(c.m_relpos1CrossNormal.mVec128, bodyA.internalGetDeltaAngularVelocity().mVec128));
__m128 deltaVel2Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal2.mVec128, bodyB.internalGetDeltaLinearVelocity().mVec128), btSimdDot3(c.m_relpos2CrossNormal.mVec128, bodyB.internalGetDeltaAngularVelocity().mVec128));
@@ -170,52 +165,49 @@ static btScalar gResolveSingleConstraintRowGeneric_sse2(btSolverBody& bodyA, btS
__m128 upperMinApplied = _mm_sub_ps(upperLimit1, cpAppliedImp);
deltaImpulse = _mm_or_ps(_mm_and_ps(resultUpperLess, deltaImpulse), _mm_andnot_ps(resultUpperLess, upperMinApplied));
c.m_appliedImpulse = _mm_or_ps(_mm_and_ps(resultUpperLess, c.m_appliedImpulse), _mm_andnot_ps(resultUpperLess, upperLimit1));
- __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal1.mVec128, bodyA.internalGetInvMass().mVec128);
- __m128 linearComponentB = _mm_mul_ps((c.m_contactNormal2).mVec128, bodyB.internalGetInvMass().mVec128);
+ __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal1.mVec128, bodyA.internalGetInvMass().mVec128);
+ __m128 linearComponentB = _mm_mul_ps((c.m_contactNormal2).mVec128, bodyB.internalGetInvMass().mVec128);
__m128 impulseMagnitude = deltaImpulse;
bodyA.internalGetDeltaLinearVelocity().mVec128 = _mm_add_ps(bodyA.internalGetDeltaLinearVelocity().mVec128, _mm_mul_ps(linearComponentA, impulseMagnitude));
bodyA.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(bodyA.internalGetDeltaAngularVelocity().mVec128, _mm_mul_ps(c.m_angularComponentA.mVec128, impulseMagnitude));
bodyB.internalGetDeltaLinearVelocity().mVec128 = _mm_add_ps(bodyB.internalGetDeltaLinearVelocity().mVec128, _mm_mul_ps(linearComponentB, impulseMagnitude));
bodyB.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(bodyB.internalGetDeltaAngularVelocity().mVec128, _mm_mul_ps(c.m_angularComponentB.mVec128, impulseMagnitude));
- return deltaImpulse.m_floats[0]/c.m_jacDiagABInv;
+ return deltaImpulse.m_floats[0] / c.m_jacDiagABInv;
}
-
// Enhanced version of gResolveSingleConstraintRowGeneric_sse2 with SSE4.1 and FMA3
static btScalar gResolveSingleConstraintRowGeneric_sse4_1_fma3(btSolverBody& bodyA, btSolverBody& bodyB, const btSolverConstraint& c)
{
-#if defined (BT_ALLOW_SSE4)
- __m128 tmp = _mm_set_ps1(c.m_jacDiagABInv);
- __m128 deltaImpulse = _mm_set_ps1(c.m_rhs - btScalar(c.m_appliedImpulse)*c.m_cfm);
- const __m128 lowerLimit = _mm_set_ps1(c.m_lowerLimit);
- const __m128 upperLimit = _mm_set_ps1(c.m_upperLimit);
- const __m128 deltaVel1Dotn = _mm_add_ps(DOT_PRODUCT(c.m_contactNormal1.mVec128, bodyA.internalGetDeltaLinearVelocity().mVec128), DOT_PRODUCT(c.m_relpos1CrossNormal.mVec128, bodyA.internalGetDeltaAngularVelocity().mVec128));
- const __m128 deltaVel2Dotn = _mm_add_ps(DOT_PRODUCT(c.m_contactNormal2.mVec128, bodyB.internalGetDeltaLinearVelocity().mVec128), DOT_PRODUCT(c.m_relpos2CrossNormal.mVec128, bodyB.internalGetDeltaAngularVelocity().mVec128));
- deltaImpulse = FMNADD(deltaVel1Dotn, tmp, deltaImpulse);
- deltaImpulse = FMNADD(deltaVel2Dotn, tmp, deltaImpulse);
- tmp = _mm_add_ps(c.m_appliedImpulse, deltaImpulse); // sum
- const __m128 maskLower = _mm_cmpgt_ps(tmp, lowerLimit);
- const __m128 maskUpper = _mm_cmpgt_ps(upperLimit, tmp);
- deltaImpulse = _mm_blendv_ps(_mm_sub_ps(lowerLimit, c.m_appliedImpulse), _mm_blendv_ps(_mm_sub_ps(upperLimit, c.m_appliedImpulse), deltaImpulse, maskUpper), maskLower);
- c.m_appliedImpulse = _mm_blendv_ps(lowerLimit, _mm_blendv_ps(upperLimit, tmp, maskUpper), maskLower);
- bodyA.internalGetDeltaLinearVelocity().mVec128 = FMADD(_mm_mul_ps(c.m_contactNormal1.mVec128, bodyA.internalGetInvMass().mVec128), deltaImpulse, bodyA.internalGetDeltaLinearVelocity().mVec128);
+#if defined(BT_ALLOW_SSE4)
+ __m128 tmp = _mm_set_ps1(c.m_jacDiagABInv);
+ __m128 deltaImpulse = _mm_set_ps1(c.m_rhs - btScalar(c.m_appliedImpulse) * c.m_cfm);
+ const __m128 lowerLimit = _mm_set_ps1(c.m_lowerLimit);
+ const __m128 upperLimit = _mm_set_ps1(c.m_upperLimit);
+ const __m128 deltaVel1Dotn = _mm_add_ps(DOT_PRODUCT(c.m_contactNormal1.mVec128, bodyA.internalGetDeltaLinearVelocity().mVec128), DOT_PRODUCT(c.m_relpos1CrossNormal.mVec128, bodyA.internalGetDeltaAngularVelocity().mVec128));
+ const __m128 deltaVel2Dotn = _mm_add_ps(DOT_PRODUCT(c.m_contactNormal2.mVec128, bodyB.internalGetDeltaLinearVelocity().mVec128), DOT_PRODUCT(c.m_relpos2CrossNormal.mVec128, bodyB.internalGetDeltaAngularVelocity().mVec128));
+ deltaImpulse = FMNADD(deltaVel1Dotn, tmp, deltaImpulse);
+ deltaImpulse = FMNADD(deltaVel2Dotn, tmp, deltaImpulse);
+ tmp = _mm_add_ps(c.m_appliedImpulse, deltaImpulse); // sum
+ const __m128 maskLower = _mm_cmpgt_ps(tmp, lowerLimit);
+ const __m128 maskUpper = _mm_cmpgt_ps(upperLimit, tmp);
+ deltaImpulse = _mm_blendv_ps(_mm_sub_ps(lowerLimit, c.m_appliedImpulse), _mm_blendv_ps(_mm_sub_ps(upperLimit, c.m_appliedImpulse), deltaImpulse, maskUpper), maskLower);
+ c.m_appliedImpulse = _mm_blendv_ps(lowerLimit, _mm_blendv_ps(upperLimit, tmp, maskUpper), maskLower);
+ bodyA.internalGetDeltaLinearVelocity().mVec128 = FMADD(_mm_mul_ps(c.m_contactNormal1.mVec128, bodyA.internalGetInvMass().mVec128), deltaImpulse, bodyA.internalGetDeltaLinearVelocity().mVec128);
bodyA.internalGetDeltaAngularVelocity().mVec128 = FMADD(c.m_angularComponentA.mVec128, deltaImpulse, bodyA.internalGetDeltaAngularVelocity().mVec128);
- bodyB.internalGetDeltaLinearVelocity().mVec128 = FMADD(_mm_mul_ps(c.m_contactNormal2.mVec128, bodyB.internalGetInvMass().mVec128), deltaImpulse, bodyB.internalGetDeltaLinearVelocity().mVec128);
+ bodyB.internalGetDeltaLinearVelocity().mVec128 = FMADD(_mm_mul_ps(c.m_contactNormal2.mVec128, bodyB.internalGetInvMass().mVec128), deltaImpulse, bodyB.internalGetDeltaLinearVelocity().mVec128);
bodyB.internalGetDeltaAngularVelocity().mVec128 = FMADD(c.m_angularComponentB.mVec128, deltaImpulse, bodyB.internalGetDeltaAngularVelocity().mVec128);
btSimdScalar deltaImp = deltaImpulse;
- return deltaImp.m_floats[0]*(1./c.m_jacDiagABInv);
+ return deltaImp.m_floats[0] * (1. / c.m_jacDiagABInv);
#else
- return gResolveSingleConstraintRowGeneric_sse2(bodyA,bodyB,c);
+ return gResolveSingleConstraintRowGeneric_sse2(bodyA, bodyB, c);
#endif
}
-
-
static btScalar gResolveSingleConstraintRowLowerLimit_sse2(btSolverBody& bodyA, btSolverBody& bodyB, const btSolverConstraint& c)
{
__m128 cpAppliedImp = _mm_set1_ps(c.m_appliedImpulse);
- __m128 lowerLimit1 = _mm_set1_ps(c.m_lowerLimit);
- __m128 upperLimit1 = _mm_set1_ps(c.m_upperLimit);
+ __m128 lowerLimit1 = _mm_set1_ps(c.m_lowerLimit);
+ __m128 upperLimit1 = _mm_set1_ps(c.m_upperLimit);
btSimdScalar deltaImpulse = _mm_sub_ps(_mm_set1_ps(c.m_rhs), _mm_mul_ps(_mm_set1_ps(c.m_appliedImpulse), _mm_set1_ps(c.m_cfm)));
__m128 deltaVel1Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal1.mVec128, bodyA.internalGetDeltaLinearVelocity().mVec128), btSimdDot3(c.m_relpos1CrossNormal.mVec128, bodyA.internalGetDeltaAngularVelocity().mVec128));
__m128 deltaVel2Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal2.mVec128, bodyB.internalGetDeltaLinearVelocity().mVec128), btSimdDot3(c.m_relpos2CrossNormal.mVec128, bodyB.internalGetDeltaAngularVelocity().mVec128));
@@ -228,104 +220,98 @@ static btScalar gResolveSingleConstraintRowLowerLimit_sse2(btSolverBody& bodyA,
__m128 lowMinApplied = _mm_sub_ps(lowerLimit1, cpAppliedImp);
deltaImpulse = _mm_or_ps(_mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse));
c.m_appliedImpulse = _mm_or_ps(_mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum));
- __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal1.mVec128, bodyA.internalGetInvMass().mVec128);
- __m128 linearComponentB = _mm_mul_ps(c.m_contactNormal2.mVec128, bodyB.internalGetInvMass().mVec128);
+ __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal1.mVec128, bodyA.internalGetInvMass().mVec128);
+ __m128 linearComponentB = _mm_mul_ps(c.m_contactNormal2.mVec128, bodyB.internalGetInvMass().mVec128);
__m128 impulseMagnitude = deltaImpulse;
bodyA.internalGetDeltaLinearVelocity().mVec128 = _mm_add_ps(bodyA.internalGetDeltaLinearVelocity().mVec128, _mm_mul_ps(linearComponentA, impulseMagnitude));
bodyA.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(bodyA.internalGetDeltaAngularVelocity().mVec128, _mm_mul_ps(c.m_angularComponentA.mVec128, impulseMagnitude));
bodyB.internalGetDeltaLinearVelocity().mVec128 = _mm_add_ps(bodyB.internalGetDeltaLinearVelocity().mVec128, _mm_mul_ps(linearComponentB, impulseMagnitude));
bodyB.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(bodyB.internalGetDeltaAngularVelocity().mVec128, _mm_mul_ps(c.m_angularComponentB.mVec128, impulseMagnitude));
- return deltaImpulse.m_floats[0]/c.m_jacDiagABInv;
+ return deltaImpulse.m_floats[0] / c.m_jacDiagABInv;
}
-
// Enhanced version of gResolveSingleConstraintRowGeneric_sse2 with SSE4.1 and FMA3
static btScalar gResolveSingleConstraintRowLowerLimit_sse4_1_fma3(btSolverBody& bodyA, btSolverBody& bodyB, const btSolverConstraint& c)
{
#ifdef BT_ALLOW_SSE4
- __m128 tmp = _mm_set_ps1(c.m_jacDiagABInv);
- __m128 deltaImpulse = _mm_set_ps1(c.m_rhs - btScalar(c.m_appliedImpulse)*c.m_cfm);
- const __m128 lowerLimit = _mm_set_ps1(c.m_lowerLimit);
- const __m128 deltaVel1Dotn = _mm_add_ps(DOT_PRODUCT(c.m_contactNormal1.mVec128, bodyA.internalGetDeltaLinearVelocity().mVec128), DOT_PRODUCT(c.m_relpos1CrossNormal.mVec128, bodyA.internalGetDeltaAngularVelocity().mVec128));
- const __m128 deltaVel2Dotn = _mm_add_ps(DOT_PRODUCT(c.m_contactNormal2.mVec128, bodyB.internalGetDeltaLinearVelocity().mVec128), DOT_PRODUCT(c.m_relpos2CrossNormal.mVec128, bodyB.internalGetDeltaAngularVelocity().mVec128));
- deltaImpulse = FMNADD(deltaVel1Dotn, tmp, deltaImpulse);
- deltaImpulse = FMNADD(deltaVel2Dotn, tmp, deltaImpulse);
- tmp = _mm_add_ps(c.m_appliedImpulse, deltaImpulse);
- const __m128 mask = _mm_cmpgt_ps(tmp, lowerLimit);
- deltaImpulse = _mm_blendv_ps(_mm_sub_ps(lowerLimit, c.m_appliedImpulse), deltaImpulse, mask);
- c.m_appliedImpulse = _mm_blendv_ps(lowerLimit, tmp, mask);
- bodyA.internalGetDeltaLinearVelocity().mVec128 = FMADD(_mm_mul_ps(c.m_contactNormal1.mVec128, bodyA.internalGetInvMass().mVec128), deltaImpulse, bodyA.internalGetDeltaLinearVelocity().mVec128);
+ __m128 tmp = _mm_set_ps1(c.m_jacDiagABInv);
+ __m128 deltaImpulse = _mm_set_ps1(c.m_rhs - btScalar(c.m_appliedImpulse) * c.m_cfm);
+ const __m128 lowerLimit = _mm_set_ps1(c.m_lowerLimit);
+ const __m128 deltaVel1Dotn = _mm_add_ps(DOT_PRODUCT(c.m_contactNormal1.mVec128, bodyA.internalGetDeltaLinearVelocity().mVec128), DOT_PRODUCT(c.m_relpos1CrossNormal.mVec128, bodyA.internalGetDeltaAngularVelocity().mVec128));
+ const __m128 deltaVel2Dotn = _mm_add_ps(DOT_PRODUCT(c.m_contactNormal2.mVec128, bodyB.internalGetDeltaLinearVelocity().mVec128), DOT_PRODUCT(c.m_relpos2CrossNormal.mVec128, bodyB.internalGetDeltaAngularVelocity().mVec128));
+ deltaImpulse = FMNADD(deltaVel1Dotn, tmp, deltaImpulse);
+ deltaImpulse = FMNADD(deltaVel2Dotn, tmp, deltaImpulse);
+ tmp = _mm_add_ps(c.m_appliedImpulse, deltaImpulse);
+ const __m128 mask = _mm_cmpgt_ps(tmp, lowerLimit);
+ deltaImpulse = _mm_blendv_ps(_mm_sub_ps(lowerLimit, c.m_appliedImpulse), deltaImpulse, mask);
+ c.m_appliedImpulse = _mm_blendv_ps(lowerLimit, tmp, mask);
+ bodyA.internalGetDeltaLinearVelocity().mVec128 = FMADD(_mm_mul_ps(c.m_contactNormal1.mVec128, bodyA.internalGetInvMass().mVec128), deltaImpulse, bodyA.internalGetDeltaLinearVelocity().mVec128);
bodyA.internalGetDeltaAngularVelocity().mVec128 = FMADD(c.m_angularComponentA.mVec128, deltaImpulse, bodyA.internalGetDeltaAngularVelocity().mVec128);
- bodyB.internalGetDeltaLinearVelocity().mVec128 = FMADD(_mm_mul_ps(c.m_contactNormal2.mVec128, bodyB.internalGetInvMass().mVec128), deltaImpulse, bodyB.internalGetDeltaLinearVelocity().mVec128);
+ bodyB.internalGetDeltaLinearVelocity().mVec128 = FMADD(_mm_mul_ps(c.m_contactNormal2.mVec128, bodyB.internalGetInvMass().mVec128), deltaImpulse, bodyB.internalGetDeltaLinearVelocity().mVec128);
bodyB.internalGetDeltaAngularVelocity().mVec128 = FMADD(c.m_angularComponentB.mVec128, deltaImpulse, bodyB.internalGetDeltaAngularVelocity().mVec128);
btSimdScalar deltaImp = deltaImpulse;
- return deltaImp.m_floats[0]*(1./c.m_jacDiagABInv);
+ return deltaImp.m_floats[0] * (1. / c.m_jacDiagABInv);
#else
- return gResolveSingleConstraintRowLowerLimit_sse2(bodyA,bodyB,c);
-#endif //BT_ALLOW_SSE4
+ return gResolveSingleConstraintRowLowerLimit_sse2(bodyA, bodyB, c);
+#endif //BT_ALLOW_SSE4
}
+#endif //USE_SIMD
-#endif //USE_SIMD
-
-
-
-btScalar btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGenericSIMD(btSolverBody& bodyA,btSolverBody& bodyB,const btSolverConstraint& c)
+btScalar btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGenericSIMD(btSolverBody& bodyA, btSolverBody& bodyB, const btSolverConstraint& c)
{
return m_resolveSingleConstraintRowGeneric(bodyA, bodyB, c);
}
// Project Gauss Seidel or the equivalent Sequential Impulse
-btScalar btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGeneric(btSolverBody& bodyA,btSolverBody& bodyB,const btSolverConstraint& c)
+btScalar btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGeneric(btSolverBody& bodyA, btSolverBody& bodyB, const btSolverConstraint& c)
{
return m_resolveSingleConstraintRowGeneric(bodyA, bodyB, c);
}
-btScalar btSequentialImpulseConstraintSolver::resolveSingleConstraintRowLowerLimitSIMD(btSolverBody& bodyA,btSolverBody& bodyB,const btSolverConstraint& c)
+btScalar btSequentialImpulseConstraintSolver::resolveSingleConstraintRowLowerLimitSIMD(btSolverBody& bodyA, btSolverBody& bodyB, const btSolverConstraint& c)
{
return m_resolveSingleConstraintRowLowerLimit(bodyA, bodyB, c);
}
-
-btScalar btSequentialImpulseConstraintSolver::resolveSingleConstraintRowLowerLimit(btSolverBody& bodyA,btSolverBody& bodyB,const btSolverConstraint& c)
+btScalar btSequentialImpulseConstraintSolver::resolveSingleConstraintRowLowerLimit(btSolverBody& bodyA, btSolverBody& bodyB, const btSolverConstraint& c)
{
return m_resolveSingleConstraintRowLowerLimit(bodyA, bodyB, c);
}
-
static btScalar gResolveSplitPenetrationImpulse_scalar_reference(
- btSolverBody& bodyA,
- btSolverBody& bodyB,
- const btSolverConstraint& c)
+ btSolverBody& bodyA,
+ btSolverBody& bodyB,
+ const btSolverConstraint& c)
{
btScalar deltaImpulse = 0.f;
- if (c.m_rhsPenetration)
- {
- gNumSplitImpulseRecoveries++;
- deltaImpulse = c.m_rhsPenetration-btScalar(c.m_appliedPushImpulse)*c.m_cfm;
- const btScalar deltaVel1Dotn = c.m_contactNormal1.dot(bodyA.internalGetPushVelocity()) + c.m_relpos1CrossNormal.dot(bodyA.internalGetTurnVelocity());
- const btScalar deltaVel2Dotn = c.m_contactNormal2.dot(bodyB.internalGetPushVelocity()) + c.m_relpos2CrossNormal.dot(bodyB.internalGetTurnVelocity());
-
- deltaImpulse -= deltaVel1Dotn*c.m_jacDiagABInv;
- deltaImpulse -= deltaVel2Dotn*c.m_jacDiagABInv;
- const btScalar sum = btScalar(c.m_appliedPushImpulse) + deltaImpulse;
- if (sum < c.m_lowerLimit)
- {
- deltaImpulse = c.m_lowerLimit-c.m_appliedPushImpulse;
- c.m_appliedPushImpulse = c.m_lowerLimit;
- }
- else
- {
- c.m_appliedPushImpulse = sum;
- }
- bodyA.internalApplyPushImpulse(c.m_contactNormal1*bodyA.internalGetInvMass(),c.m_angularComponentA,deltaImpulse);
- bodyB.internalApplyPushImpulse(c.m_contactNormal2*bodyB.internalGetInvMass(),c.m_angularComponentB,deltaImpulse);
- }
- return deltaImpulse*(1./c.m_jacDiagABInv);
+ if (c.m_rhsPenetration)
+ {
+ gNumSplitImpulseRecoveries++;
+ deltaImpulse = c.m_rhsPenetration - btScalar(c.m_appliedPushImpulse) * c.m_cfm;
+ const btScalar deltaVel1Dotn = c.m_contactNormal1.dot(bodyA.internalGetPushVelocity()) + c.m_relpos1CrossNormal.dot(bodyA.internalGetTurnVelocity());
+ const btScalar deltaVel2Dotn = c.m_contactNormal2.dot(bodyB.internalGetPushVelocity()) + c.m_relpos2CrossNormal.dot(bodyB.internalGetTurnVelocity());
+
+ deltaImpulse -= deltaVel1Dotn * c.m_jacDiagABInv;
+ deltaImpulse -= deltaVel2Dotn * c.m_jacDiagABInv;
+ const btScalar sum = btScalar(c.m_appliedPushImpulse) + deltaImpulse;
+ if (sum < c.m_lowerLimit)
+ {
+ deltaImpulse = c.m_lowerLimit - c.m_appliedPushImpulse;
+ c.m_appliedPushImpulse = c.m_lowerLimit;
+ }
+ else
+ {
+ c.m_appliedPushImpulse = sum;
+ }
+ bodyA.internalApplyPushImpulse(c.m_contactNormal1 * bodyA.internalGetInvMass(), c.m_angularComponentA, deltaImpulse);
+ bodyB.internalApplyPushImpulse(c.m_contactNormal2 * bodyB.internalGetInvMass(), c.m_angularComponentB, deltaImpulse);
+ }
+ return deltaImpulse * (1. / c.m_jacDiagABInv);
}
-static btScalar gResolveSplitPenetrationImpulse_sse2(btSolverBody& bodyA,btSolverBody& bodyB,const btSolverConstraint& c)
+static btScalar gResolveSplitPenetrationImpulse_sse2(btSolverBody& bodyA, btSolverBody& bodyB, const btSolverConstraint& c)
{
#ifdef USE_SIMD
if (!c.m_rhsPenetration)
@@ -334,113 +320,109 @@ static btScalar gResolveSplitPenetrationImpulse_sse2(btSolverBody& bodyA,btSolve
gNumSplitImpulseRecoveries++;
__m128 cpAppliedImp = _mm_set1_ps(c.m_appliedPushImpulse);
- __m128 lowerLimit1 = _mm_set1_ps(c.m_lowerLimit);
- __m128 upperLimit1 = _mm_set1_ps(c.m_upperLimit);
- __m128 deltaImpulse = _mm_sub_ps(_mm_set1_ps(c.m_rhsPenetration), _mm_mul_ps(_mm_set1_ps(c.m_appliedPushImpulse),_mm_set1_ps(c.m_cfm)));
- __m128 deltaVel1Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal1.mVec128,bodyA.internalGetPushVelocity().mVec128), btSimdDot3(c.m_relpos1CrossNormal.mVec128,bodyA.internalGetTurnVelocity().mVec128));
- __m128 deltaVel2Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal2.mVec128,bodyB.internalGetPushVelocity().mVec128), btSimdDot3(c.m_relpos2CrossNormal.mVec128,bodyB.internalGetTurnVelocity().mVec128));
- deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel1Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
- deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel2Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
- btSimdScalar sum = _mm_add_ps(cpAppliedImp,deltaImpulse);
- btSimdScalar resultLowerLess,resultUpperLess;
- resultLowerLess = _mm_cmplt_ps(sum,lowerLimit1);
- resultUpperLess = _mm_cmplt_ps(sum,upperLimit1);
- __m128 lowMinApplied = _mm_sub_ps(lowerLimit1,cpAppliedImp);
- deltaImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse) );
- c.m_appliedPushImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum) );
- __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal1.mVec128,bodyA.internalGetInvMass().mVec128);
- __m128 linearComponentB = _mm_mul_ps(c.m_contactNormal2.mVec128,bodyB.internalGetInvMass().mVec128);
+ __m128 lowerLimit1 = _mm_set1_ps(c.m_lowerLimit);
+ __m128 upperLimit1 = _mm_set1_ps(c.m_upperLimit);
+ __m128 deltaImpulse = _mm_sub_ps(_mm_set1_ps(c.m_rhsPenetration), _mm_mul_ps(_mm_set1_ps(c.m_appliedPushImpulse), _mm_set1_ps(c.m_cfm)));
+ __m128 deltaVel1Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal1.mVec128, bodyA.internalGetPushVelocity().mVec128), btSimdDot3(c.m_relpos1CrossNormal.mVec128, bodyA.internalGetTurnVelocity().mVec128));
+ __m128 deltaVel2Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal2.mVec128, bodyB.internalGetPushVelocity().mVec128), btSimdDot3(c.m_relpos2CrossNormal.mVec128, bodyB.internalGetTurnVelocity().mVec128));
+ deltaImpulse = _mm_sub_ps(deltaImpulse, _mm_mul_ps(deltaVel1Dotn, _mm_set1_ps(c.m_jacDiagABInv)));
+ deltaImpulse = _mm_sub_ps(deltaImpulse, _mm_mul_ps(deltaVel2Dotn, _mm_set1_ps(c.m_jacDiagABInv)));
+ btSimdScalar sum = _mm_add_ps(cpAppliedImp, deltaImpulse);
+ btSimdScalar resultLowerLess, resultUpperLess;
+ resultLowerLess = _mm_cmplt_ps(sum, lowerLimit1);
+ resultUpperLess = _mm_cmplt_ps(sum, upperLimit1);
+ __m128 lowMinApplied = _mm_sub_ps(lowerLimit1, cpAppliedImp);
+ deltaImpulse = _mm_or_ps(_mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse));
+ c.m_appliedPushImpulse = _mm_or_ps(_mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum));
+ __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal1.mVec128, bodyA.internalGetInvMass().mVec128);
+ __m128 linearComponentB = _mm_mul_ps(c.m_contactNormal2.mVec128, bodyB.internalGetInvMass().mVec128);
__m128 impulseMagnitude = deltaImpulse;
- bodyA.internalGetPushVelocity().mVec128 = _mm_add_ps(bodyA.internalGetPushVelocity().mVec128,_mm_mul_ps(linearComponentA,impulseMagnitude));
- bodyA.internalGetTurnVelocity().mVec128 = _mm_add_ps(bodyA.internalGetTurnVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentA.mVec128,impulseMagnitude));
- bodyB.internalGetPushVelocity().mVec128 = _mm_add_ps(bodyB.internalGetPushVelocity().mVec128,_mm_mul_ps(linearComponentB,impulseMagnitude));
- bodyB.internalGetTurnVelocity().mVec128 = _mm_add_ps(bodyB.internalGetTurnVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentB.mVec128,impulseMagnitude));
+ bodyA.internalGetPushVelocity().mVec128 = _mm_add_ps(bodyA.internalGetPushVelocity().mVec128, _mm_mul_ps(linearComponentA, impulseMagnitude));
+ bodyA.internalGetTurnVelocity().mVec128 = _mm_add_ps(bodyA.internalGetTurnVelocity().mVec128, _mm_mul_ps(c.m_angularComponentA.mVec128, impulseMagnitude));
+ bodyB.internalGetPushVelocity().mVec128 = _mm_add_ps(bodyB.internalGetPushVelocity().mVec128, _mm_mul_ps(linearComponentB, impulseMagnitude));
+ bodyB.internalGetTurnVelocity().mVec128 = _mm_add_ps(bodyB.internalGetTurnVelocity().mVec128, _mm_mul_ps(c.m_angularComponentB.mVec128, impulseMagnitude));
btSimdScalar deltaImp = deltaImpulse;
return deltaImp.m_floats[0] * (1. / c.m_jacDiagABInv);
#else
- return gResolveSplitPenetrationImpulse_scalar_reference(bodyA,bodyB,c);
+ return gResolveSplitPenetrationImpulse_scalar_reference(bodyA, bodyB, c);
#endif
}
-
btSequentialImpulseConstraintSolver::btSequentialImpulseConstraintSolver()
{
- m_btSeed2 = 0;
- m_cachedSolverMode = 0;
- setupSolverFunctions( false );
+ m_btSeed2 = 0;
+ m_cachedSolverMode = 0;
+ setupSolverFunctions(false);
}
-void btSequentialImpulseConstraintSolver::setupSolverFunctions( bool useSimd )
+void btSequentialImpulseConstraintSolver::setupSolverFunctions(bool useSimd)
{
- m_resolveSingleConstraintRowGeneric = gResolveSingleConstraintRowGeneric_scalar_reference;
- m_resolveSingleConstraintRowLowerLimit = gResolveSingleConstraintRowLowerLimit_scalar_reference;
- m_resolveSplitPenetrationImpulse = gResolveSplitPenetrationImpulse_scalar_reference;
+ m_resolveSingleConstraintRowGeneric = gResolveSingleConstraintRowGeneric_scalar_reference;
+ m_resolveSingleConstraintRowLowerLimit = gResolveSingleConstraintRowLowerLimit_scalar_reference;
+ m_resolveSplitPenetrationImpulse = gResolveSplitPenetrationImpulse_scalar_reference;
- if ( useSimd )
- {
+ if (useSimd)
+ {
#ifdef USE_SIMD
- m_resolveSingleConstraintRowGeneric = gResolveSingleConstraintRowGeneric_sse2;
- m_resolveSingleConstraintRowLowerLimit = gResolveSingleConstraintRowLowerLimit_sse2;
- m_resolveSplitPenetrationImpulse = gResolveSplitPenetrationImpulse_sse2;
+ m_resolveSingleConstraintRowGeneric = gResolveSingleConstraintRowGeneric_sse2;
+ m_resolveSingleConstraintRowLowerLimit = gResolveSingleConstraintRowLowerLimit_sse2;
+ m_resolveSplitPenetrationImpulse = gResolveSplitPenetrationImpulse_sse2;
#ifdef BT_ALLOW_SSE4
- int cpuFeatures = btCpuFeatureUtility::getCpuFeatures();
- if ((cpuFeatures & btCpuFeatureUtility::CPU_FEATURE_FMA3) && (cpuFeatures & btCpuFeatureUtility::CPU_FEATURE_SSE4_1))
- {
- m_resolveSingleConstraintRowGeneric = gResolveSingleConstraintRowGeneric_sse4_1_fma3;
- m_resolveSingleConstraintRowLowerLimit = gResolveSingleConstraintRowLowerLimit_sse4_1_fma3;
- }
-#endif//BT_ALLOW_SSE4
-#endif //USE_SIMD
- }
+ int cpuFeatures = btCpuFeatureUtility::getCpuFeatures();
+ if ((cpuFeatures & btCpuFeatureUtility::CPU_FEATURE_FMA3) && (cpuFeatures & btCpuFeatureUtility::CPU_FEATURE_SSE4_1))
+ {
+ m_resolveSingleConstraintRowGeneric = gResolveSingleConstraintRowGeneric_sse4_1_fma3;
+ m_resolveSingleConstraintRowLowerLimit = gResolveSingleConstraintRowLowerLimit_sse4_1_fma3;
+ }
+#endif //BT_ALLOW_SSE4
+#endif //USE_SIMD
+ }
}
- btSequentialImpulseConstraintSolver::~btSequentialImpulseConstraintSolver()
- {
- }
-
- btSingleConstraintRowSolver btSequentialImpulseConstraintSolver::getScalarConstraintRowSolverGeneric()
- {
- return gResolveSingleConstraintRowGeneric_scalar_reference;
- }
+btSequentialImpulseConstraintSolver::~btSequentialImpulseConstraintSolver()
+{
+}
- btSingleConstraintRowSolver btSequentialImpulseConstraintSolver::getScalarConstraintRowSolverLowerLimit()
- {
- return gResolveSingleConstraintRowLowerLimit_scalar_reference;
- }
+btSingleConstraintRowSolver btSequentialImpulseConstraintSolver::getScalarConstraintRowSolverGeneric()
+{
+ return gResolveSingleConstraintRowGeneric_scalar_reference;
+}
+btSingleConstraintRowSolver btSequentialImpulseConstraintSolver::getScalarConstraintRowSolverLowerLimit()
+{
+ return gResolveSingleConstraintRowLowerLimit_scalar_reference;
+}
#ifdef USE_SIMD
- btSingleConstraintRowSolver btSequentialImpulseConstraintSolver::getSSE2ConstraintRowSolverGeneric()
- {
- return gResolveSingleConstraintRowGeneric_sse2;
- }
- btSingleConstraintRowSolver btSequentialImpulseConstraintSolver::getSSE2ConstraintRowSolverLowerLimit()
- {
- return gResolveSingleConstraintRowLowerLimit_sse2;
- }
+btSingleConstraintRowSolver btSequentialImpulseConstraintSolver::getSSE2ConstraintRowSolverGeneric()
+{
+ return gResolveSingleConstraintRowGeneric_sse2;
+}
+btSingleConstraintRowSolver btSequentialImpulseConstraintSolver::getSSE2ConstraintRowSolverLowerLimit()
+{
+ return gResolveSingleConstraintRowLowerLimit_sse2;
+}
#ifdef BT_ALLOW_SSE4
- btSingleConstraintRowSolver btSequentialImpulseConstraintSolver::getSSE4_1ConstraintRowSolverGeneric()
- {
- return gResolveSingleConstraintRowGeneric_sse4_1_fma3;
- }
- btSingleConstraintRowSolver btSequentialImpulseConstraintSolver::getSSE4_1ConstraintRowSolverLowerLimit()
- {
- return gResolveSingleConstraintRowLowerLimit_sse4_1_fma3;
- }
-#endif //BT_ALLOW_SSE4
-#endif //USE_SIMD
+btSingleConstraintRowSolver btSequentialImpulseConstraintSolver::getSSE4_1ConstraintRowSolverGeneric()
+{
+ return gResolveSingleConstraintRowGeneric_sse4_1_fma3;
+}
+btSingleConstraintRowSolver btSequentialImpulseConstraintSolver::getSSE4_1ConstraintRowSolverLowerLimit()
+{
+ return gResolveSingleConstraintRowLowerLimit_sse4_1_fma3;
+}
+#endif //BT_ALLOW_SSE4
+#endif //USE_SIMD
unsigned long btSequentialImpulseConstraintSolver::btRand2()
{
- m_btSeed2 = (1664525L*m_btSeed2 + 1013904223L) & 0xffffffff;
+ m_btSeed2 = (1664525L * m_btSeed2 + 1013904223L) & 0xffffffff;
return m_btSeed2;
}
-
-
//See ODE: adam's all-int straightforward(?) dRandInt (0..n-1)
-int btSequentialImpulseConstraintSolver::btRandInt2 (int n)
+int btSequentialImpulseConstraintSolver::btRandInt2(int n)
{
// seems good; xor-fold and modulus
const unsigned long un = static_cast<unsigned long>(n);
@@ -448,15 +430,20 @@ int btSequentialImpulseConstraintSolver::btRandInt2 (int n)
// note: probably more aggressive than it needs to be -- might be
// able to get away without one or two of the innermost branches.
- if (un <= 0x00010000UL) {
+ if (un <= 0x00010000UL)
+ {
r ^= (r >> 16);
- if (un <= 0x00000100UL) {
+ if (un <= 0x00000100UL)
+ {
r ^= (r >> 8);
- if (un <= 0x00000010UL) {
+ if (un <= 0x00000010UL)
+ {
r ^= (r >> 4);
- if (un <= 0x00000004UL) {
+ if (un <= 0x00000004UL)
+ {
r ^= (r >> 2);
- if (un <= 0x00000002UL) {
+ if (un <= 0x00000002UL)
+ {
r ^= (r >> 1);
}
}
@@ -464,70 +451,56 @@ int btSequentialImpulseConstraintSolver::btRandInt2 (int n)
}
}
- return (int) (r % un);
+ return (int)(r % un);
}
-
-
-void btSequentialImpulseConstraintSolver::initSolverBody(btSolverBody* solverBody, btCollisionObject* collisionObject, btScalar timeStep)
+void btSequentialImpulseConstraintSolver::initSolverBody(btSolverBody* solverBody, btCollisionObject* collisionObject, btScalar timeStep)
{
+ btRigidBody* rb = collisionObject ? btRigidBody::upcast(collisionObject) : 0;
- btRigidBody* rb = collisionObject? btRigidBody::upcast(collisionObject) : 0;
-
- solverBody->internalGetDeltaLinearVelocity().setValue(0.f,0.f,0.f);
- solverBody->internalGetDeltaAngularVelocity().setValue(0.f,0.f,0.f);
- solverBody->internalGetPushVelocity().setValue(0.f,0.f,0.f);
- solverBody->internalGetTurnVelocity().setValue(0.f,0.f,0.f);
+ solverBody->internalGetDeltaLinearVelocity().setValue(0.f, 0.f, 0.f);
+ solverBody->internalGetDeltaAngularVelocity().setValue(0.f, 0.f, 0.f);
+ solverBody->internalGetPushVelocity().setValue(0.f, 0.f, 0.f);
+ solverBody->internalGetTurnVelocity().setValue(0.f, 0.f, 0.f);
if (rb)
{
solverBody->m_worldTransform = rb->getWorldTransform();
- solverBody->internalSetInvMass(btVector3(rb->getInvMass(),rb->getInvMass(),rb->getInvMass())*rb->getLinearFactor());
+ solverBody->internalSetInvMass(btVector3(rb->getInvMass(), rb->getInvMass(), rb->getInvMass()) * rb->getLinearFactor());
solverBody->m_originalBody = rb;
solverBody->m_angularFactor = rb->getAngularFactor();
solverBody->m_linearFactor = rb->getLinearFactor();
solverBody->m_linearVelocity = rb->getLinearVelocity();
solverBody->m_angularVelocity = rb->getAngularVelocity();
- solverBody->m_externalForceImpulse = rb->getTotalForce()*rb->getInvMass()*timeStep;
- solverBody->m_externalTorqueImpulse = rb->getTotalTorque()*rb->getInvInertiaTensorWorld()*timeStep ;
-
- } else
+ solverBody->m_externalForceImpulse = rb->getTotalForce() * rb->getInvMass() * timeStep;
+ solverBody->m_externalTorqueImpulse = rb->getTotalTorque() * rb->getInvInertiaTensorWorld() * timeStep;
+ }
+ else
{
solverBody->m_worldTransform.setIdentity();
- solverBody->internalSetInvMass(btVector3(0,0,0));
+ solverBody->internalSetInvMass(btVector3(0, 0, 0));
solverBody->m_originalBody = 0;
- solverBody->m_angularFactor.setValue(1,1,1);
- solverBody->m_linearFactor.setValue(1,1,1);
- solverBody->m_linearVelocity.setValue(0,0,0);
- solverBody->m_angularVelocity.setValue(0,0,0);
- solverBody->m_externalForceImpulse.setValue(0,0,0);
- solverBody->m_externalTorqueImpulse.setValue(0,0,0);
+ solverBody->m_angularFactor.setValue(1, 1, 1);
+ solverBody->m_linearFactor.setValue(1, 1, 1);
+ solverBody->m_linearVelocity.setValue(0, 0, 0);
+ solverBody->m_angularVelocity.setValue(0, 0, 0);
+ solverBody->m_externalForceImpulse.setValue(0, 0, 0);
+ solverBody->m_externalTorqueImpulse.setValue(0, 0, 0);
}
-
-
}
-
-
-
-
-
btScalar btSequentialImpulseConstraintSolver::restitutionCurve(btScalar rel_vel, btScalar restitution, btScalar velocityThreshold)
{
//printf("rel_vel =%f\n", rel_vel);
- if (btFabs(rel_vel)<velocityThreshold)
+ if (btFabs(rel_vel) < velocityThreshold)
return 0.;
btScalar rest = restitution * -rel_vel;
return rest;
}
-
-
-void btSequentialImpulseConstraintSolver::applyAnisotropicFriction(btCollisionObject* colObj,btVector3& frictionDirection, int frictionMode)
+void btSequentialImpulseConstraintSolver::applyAnisotropicFriction(btCollisionObject* colObj, btVector3& frictionDirection, int frictionMode)
{
-
-
if (colObj && colObj->hasAnisotropicFriction(frictionMode))
{
// transform to local coordinates
@@ -538,16 +511,10 @@ void btSequentialImpulseConstraintSolver::applyAnisotropicFriction(btCollisionOb
// ... and transform it back to global coordinates
frictionDirection = colObj->getWorldTransform().getBasis() * loc_lateral;
}
-
}
-
-
-
-void btSequentialImpulseConstraintSolver::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, btScalar cfmSlip)
+void btSequentialImpulseConstraintSolver::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, btScalar cfmSlip)
{
-
-
btSolverBody& solverBodyA = m_tmpSolverBodyPool[solverBodyIdA];
btSolverBody& solverBodyB = m_tmpSolverBodyPool[solverBodyIdB];
@@ -568,12 +535,13 @@ void btSequentialImpulseConstraintSolver::setupFrictionConstraint(btSolverConstr
solverConstraint.m_contactNormal1 = normalAxis;
btVector3 ftorqueAxis1 = rel_pos1.cross(solverConstraint.m_contactNormal1);
solverConstraint.m_relpos1CrossNormal = ftorqueAxis1;
- solverConstraint.m_angularComponentA = body0->getInvInertiaTensorWorld()*ftorqueAxis1*body0->getAngularFactor();
- }else
+ solverConstraint.m_angularComponentA = body0->getInvInertiaTensorWorld() * ftorqueAxis1 * body0->getAngularFactor();
+ }
+ else
{
solverConstraint.m_contactNormal1.setZero();
solverConstraint.m_relpos1CrossNormal.setZero();
- solverConstraint.m_angularComponentA .setZero();
+ solverConstraint.m_angularComponentA.setZero();
}
if (bodyA)
@@ -581,8 +549,9 @@ void btSequentialImpulseConstraintSolver::setupFrictionConstraint(btSolverConstr
solverConstraint.m_contactNormal2 = -normalAxis;
btVector3 ftorqueAxis1 = rel_pos2.cross(solverConstraint.m_contactNormal2);
solverConstraint.m_relpos2CrossNormal = ftorqueAxis1;
- solverConstraint.m_angularComponentB = bodyA->getInvInertiaTensorWorld()*ftorqueAxis1*bodyA->getAngularFactor();
- } else
+ solverConstraint.m_angularComponentB = bodyA->getInvInertiaTensorWorld() * ftorqueAxis1 * bodyA->getAngularFactor();
+ }
+ else
{
solverConstraint.m_contactNormal2.setZero();
solverConstraint.m_relpos2CrossNormal.setZero();
@@ -595,32 +564,28 @@ void btSequentialImpulseConstraintSolver::setupFrictionConstraint(btSolverConstr
btScalar denom1 = 0.f;
if (body0)
{
- vec = ( solverConstraint.m_angularComponentA).cross(rel_pos1);
+ vec = (solverConstraint.m_angularComponentA).cross(rel_pos1);
denom0 = body0->getInvMass() + normalAxis.dot(vec);
}
if (bodyA)
{
- vec = ( -solverConstraint.m_angularComponentB).cross(rel_pos2);
+ vec = (-solverConstraint.m_angularComponentB).cross(rel_pos2);
denom1 = bodyA->getInvMass() + normalAxis.dot(vec);
}
- btScalar denom = relaxation/(denom0+denom1);
+ btScalar denom = relaxation / (denom0 + denom1);
solverConstraint.m_jacDiagABInv = denom;
}
{
-
-
btScalar rel_vel;
- btScalar vel1Dotn = solverConstraint.m_contactNormal1.dot(body0?solverBodyA.m_linearVelocity+solverBodyA.m_externalForceImpulse:btVector3(0,0,0))
- + solverConstraint.m_relpos1CrossNormal.dot(body0?solverBodyA.m_angularVelocity:btVector3(0,0,0));
- btScalar vel2Dotn = solverConstraint.m_contactNormal2.dot(bodyA?solverBodyB.m_linearVelocity+solverBodyB.m_externalForceImpulse:btVector3(0,0,0))
- + solverConstraint.m_relpos2CrossNormal.dot(bodyA?solverBodyB.m_angularVelocity:btVector3(0,0,0));
+ btScalar vel1Dotn = solverConstraint.m_contactNormal1.dot(body0 ? solverBodyA.m_linearVelocity + solverBodyA.m_externalForceImpulse : btVector3(0, 0, 0)) + solverConstraint.m_relpos1CrossNormal.dot(body0 ? solverBodyA.m_angularVelocity : btVector3(0, 0, 0));
+ btScalar vel2Dotn = solverConstraint.m_contactNormal2.dot(bodyA ? solverBodyB.m_linearVelocity + solverBodyB.m_externalForceImpulse : btVector3(0, 0, 0)) + solverConstraint.m_relpos2CrossNormal.dot(bodyA ? solverBodyB.m_angularVelocity : btVector3(0, 0, 0));
- rel_vel = vel1Dotn+vel2Dotn;
+ rel_vel = vel1Dotn + vel2Dotn;
-// btScalar positionalError = 0.f;
+ // btScalar positionalError = 0.f;
- btScalar velocityError = desiredVelocity - rel_vel;
+ btScalar velocityError = desiredVelocity - rel_vel;
btScalar velocityImpulse = velocityError * solverConstraint.m_jacDiagABInv;
btScalar penetrationImpulse = btScalar(0);
@@ -628,8 +593,8 @@ void btSequentialImpulseConstraintSolver::setupFrictionConstraint(btSolverConstr
if (cp.m_contactPointFlags & BT_CONTACT_FLAG_FRICTION_ANCHOR)
{
btScalar distance = (cp.getPositionWorldOnA() - cp.getPositionWorldOnB()).dot(normalAxis);
- btScalar positionalError = -distance * infoGlobal.m_frictionERP/infoGlobal.m_timeStep;
- penetrationImpulse = positionalError*solverConstraint.m_jacDiagABInv;
+ btScalar positionalError = -distance * infoGlobal.m_frictionERP / infoGlobal.m_timeStep;
+ penetrationImpulse = positionalError * solverConstraint.m_jacDiagABInv;
}
solverConstraint.m_rhs = penetrationImpulse + velocityImpulse;
@@ -637,11 +602,10 @@ void btSequentialImpulseConstraintSolver::setupFrictionConstraint(btSolverConstr
solverConstraint.m_cfm = cfmSlip;
solverConstraint.m_lowerLimit = -solverConstraint.m_friction;
solverConstraint.m_upperLimit = solverConstraint.m_friction;
-
}
}
-btSolverConstraint& btSequentialImpulseConstraintSolver::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, btScalar cfmSlip)
+btSolverConstraint& btSequentialImpulseConstraintSolver::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, btScalar cfmSlip)
{
btSolverConstraint& solverConstraint = m_tmpSolverContactFrictionConstraintPool.expandNonInitializing();
solverConstraint.m_frictionIndex = frictionIndex;
@@ -650,15 +614,13 @@ btSolverConstraint& btSequentialImpulseConstraintSolver::addFrictionConstraint(c
return solverConstraint;
}
-
-void btSequentialImpulseConstraintSolver::setupTorsionalFrictionConstraint( btSolverConstraint& solverConstraint, const btVector3& normalAxis1,int solverBodyIdA,int solverBodyIdB,
- btManifoldPoint& cp,btScalar combinedTorsionalFriction, const btVector3& rel_pos1,const btVector3& rel_pos2,
- btCollisionObject* colObj0,btCollisionObject* colObj1, btScalar relaxation,
- btScalar desiredVelocity, btScalar cfmSlip)
+void btSequentialImpulseConstraintSolver::setupTorsionalFrictionConstraint(btSolverConstraint& solverConstraint, const btVector3& normalAxis1, int solverBodyIdA, int solverBodyIdB,
+ btManifoldPoint& cp, btScalar combinedTorsionalFriction, const btVector3& rel_pos1, const btVector3& rel_pos2,
+ btCollisionObject* colObj0, btCollisionObject* colObj1, btScalar relaxation,
+ btScalar desiredVelocity, btScalar cfmSlip)
{
- btVector3 normalAxis(0,0,0);
-
+ btVector3 normalAxis(0, 0, 0);
solverConstraint.m_contactNormal1 = normalAxis;
solverConstraint.m_contactNormal2 = -normalAxis;
@@ -671,8 +633,8 @@ void btSequentialImpulseConstraintSolver::setupTorsionalFrictionConstraint( btSo
solverConstraint.m_solverBodyIdA = solverBodyIdA;
solverConstraint.m_solverBodyIdB = solverBodyIdB;
- solverConstraint.m_friction = combinedTorsionalFriction;
- solverConstraint.m_originalContactPoint = 0;
+ solverConstraint.m_friction = combinedTorsionalFriction;
+ solverConstraint.m_originalContactPoint = 0;
solverConstraint.m_appliedImpulse = 0.f;
solverConstraint.m_appliedPushImpulse = 0.f;
@@ -680,138 +642,125 @@ void btSequentialImpulseConstraintSolver::setupTorsionalFrictionConstraint( btSo
{
btVector3 ftorqueAxis1 = -normalAxis1;
solverConstraint.m_relpos1CrossNormal = ftorqueAxis1;
- solverConstraint.m_angularComponentA = body0 ? body0->getInvInertiaTensorWorld()*ftorqueAxis1*body0->getAngularFactor() : btVector3(0,0,0);
+ solverConstraint.m_angularComponentA = body0 ? body0->getInvInertiaTensorWorld() * ftorqueAxis1 * body0->getAngularFactor() : btVector3(0, 0, 0);
}
{
btVector3 ftorqueAxis1 = normalAxis1;
solverConstraint.m_relpos2CrossNormal = ftorqueAxis1;
- solverConstraint.m_angularComponentB = bodyA ? bodyA->getInvInertiaTensorWorld()*ftorqueAxis1*bodyA->getAngularFactor() : btVector3(0,0,0);
+ solverConstraint.m_angularComponentB = bodyA ? bodyA->getInvInertiaTensorWorld() * ftorqueAxis1 * bodyA->getAngularFactor() : btVector3(0, 0, 0);
}
-
{
- btVector3 iMJaA = body0?body0->getInvInertiaTensorWorld()*solverConstraint.m_relpos1CrossNormal:btVector3(0,0,0);
- btVector3 iMJaB = bodyA?bodyA->getInvInertiaTensorWorld()*solverConstraint.m_relpos2CrossNormal:btVector3(0,0,0);
+ btVector3 iMJaA = body0 ? body0->getInvInertiaTensorWorld() * solverConstraint.m_relpos1CrossNormal : btVector3(0, 0, 0);
+ btVector3 iMJaB = bodyA ? bodyA->getInvInertiaTensorWorld() * solverConstraint.m_relpos2CrossNormal : btVector3(0, 0, 0);
btScalar sum = 0;
sum += iMJaA.dot(solverConstraint.m_relpos1CrossNormal);
sum += iMJaB.dot(solverConstraint.m_relpos2CrossNormal);
- solverConstraint.m_jacDiagABInv = btScalar(1.)/sum;
+ solverConstraint.m_jacDiagABInv = btScalar(1.) / sum;
}
{
-
-
btScalar rel_vel;
- btScalar vel1Dotn = solverConstraint.m_contactNormal1.dot(body0?solverBodyA.m_linearVelocity+solverBodyA.m_externalForceImpulse:btVector3(0,0,0))
- + solverConstraint.m_relpos1CrossNormal.dot(body0?solverBodyA.m_angularVelocity:btVector3(0,0,0));
- btScalar vel2Dotn = solverConstraint.m_contactNormal2.dot(bodyA?solverBodyB.m_linearVelocity+solverBodyB.m_externalForceImpulse:btVector3(0,0,0))
- + solverConstraint.m_relpos2CrossNormal.dot(bodyA?solverBodyB.m_angularVelocity:btVector3(0,0,0));
+ btScalar vel1Dotn = solverConstraint.m_contactNormal1.dot(body0 ? solverBodyA.m_linearVelocity + solverBodyA.m_externalForceImpulse : btVector3(0, 0, 0)) + solverConstraint.m_relpos1CrossNormal.dot(body0 ? solverBodyA.m_angularVelocity : btVector3(0, 0, 0));
+ btScalar vel2Dotn = solverConstraint.m_contactNormal2.dot(bodyA ? solverBodyB.m_linearVelocity + solverBodyB.m_externalForceImpulse : btVector3(0, 0, 0)) + solverConstraint.m_relpos2CrossNormal.dot(bodyA ? solverBodyB.m_angularVelocity : btVector3(0, 0, 0));
- rel_vel = vel1Dotn+vel2Dotn;
+ rel_vel = vel1Dotn + vel2Dotn;
-// btScalar positionalError = 0.f;
+ // btScalar positionalError = 0.f;
- btSimdScalar velocityError = desiredVelocity - rel_vel;
- btSimdScalar velocityImpulse = velocityError * btSimdScalar(solverConstraint.m_jacDiagABInv);
+ btSimdScalar velocityError = desiredVelocity - rel_vel;
+ btSimdScalar velocityImpulse = velocityError * btSimdScalar(solverConstraint.m_jacDiagABInv);
solverConstraint.m_rhs = velocityImpulse;
solverConstraint.m_cfm = cfmSlip;
solverConstraint.m_lowerLimit = -solverConstraint.m_friction;
solverConstraint.m_upperLimit = solverConstraint.m_friction;
-
}
}
-
-
-
-
-
-
-
-btSolverConstraint& btSequentialImpulseConstraintSolver::addTorsionalFrictionConstraint(const btVector3& normalAxis,int solverBodyIdA,int solverBodyIdB,int frictionIndex,btManifoldPoint& cp,btScalar combinedTorsionalFriction, const btVector3& rel_pos1,const btVector3& rel_pos2,btCollisionObject* colObj0,btCollisionObject* colObj1, btScalar relaxation, btScalar desiredVelocity, btScalar cfmSlip)
+btSolverConstraint& btSequentialImpulseConstraintSolver::addTorsionalFrictionConstraint(const btVector3& normalAxis, int solverBodyIdA, int solverBodyIdB, int frictionIndex, btManifoldPoint& cp, btScalar combinedTorsionalFriction, const btVector3& rel_pos1, const btVector3& rel_pos2, btCollisionObject* colObj0, btCollisionObject* colObj1, btScalar relaxation, btScalar desiredVelocity, btScalar cfmSlip)
{
btSolverConstraint& solverConstraint = m_tmpSolverContactRollingFrictionConstraintPool.expandNonInitializing();
solverConstraint.m_frictionIndex = frictionIndex;
- setupTorsionalFrictionConstraint(solverConstraint, normalAxis, solverBodyIdA, solverBodyIdB, cp, combinedTorsionalFriction,rel_pos1, rel_pos2,
- colObj0, colObj1, relaxation, desiredVelocity, cfmSlip);
+ setupTorsionalFrictionConstraint(solverConstraint, normalAxis, solverBodyIdA, solverBodyIdB, cp, combinedTorsionalFriction, rel_pos1, rel_pos2,
+ colObj0, colObj1, relaxation, desiredVelocity, cfmSlip);
return solverConstraint;
}
-
-int btSequentialImpulseConstraintSolver::getOrInitSolverBody(btCollisionObject& body,btScalar timeStep)
+int btSequentialImpulseConstraintSolver::getOrInitSolverBody(btCollisionObject& body, btScalar timeStep)
{
#if BT_THREADSAFE
- int solverBodyId = -1;
- bool isRigidBodyType = btRigidBody::upcast( &body ) != NULL;
- if ( isRigidBodyType && !body.isStaticOrKinematicObject() )
- {
- // dynamic body
- // Dynamic bodies can only be in one island, so it's safe to write to the companionId
- solverBodyId = body.getCompanionId();
- if ( solverBodyId < 0 )
- {
- solverBodyId = m_tmpSolverBodyPool.size();
- btSolverBody& solverBody = m_tmpSolverBodyPool.expand();
- initSolverBody( &solverBody, &body, timeStep );
- body.setCompanionId( solverBodyId );
- }
- }
- else if (isRigidBodyType && body.isKinematicObject())
- {
- //
- // NOTE: must test for kinematic before static because some kinematic objects also
- // identify as "static"
- //
- // Kinematic bodies can be in multiple islands at once, so it is a
- // race condition to write to them, so we use an alternate method
- // to record the solverBodyId
- int uniqueId = body.getWorldArrayIndex();
- const int INVALID_SOLVER_BODY_ID = -1;
- if (uniqueId >= m_kinematicBodyUniqueIdToSolverBodyTable.size())
- {
- m_kinematicBodyUniqueIdToSolverBodyTable.resize(uniqueId + 1, INVALID_SOLVER_BODY_ID);
- }
- solverBodyId = m_kinematicBodyUniqueIdToSolverBodyTable[ uniqueId ];
- // if no table entry yet,
- if ( solverBodyId == INVALID_SOLVER_BODY_ID )
- {
- // create a table entry for this body
- solverBodyId = m_tmpSolverBodyPool.size();
- btSolverBody& solverBody = m_tmpSolverBodyPool.expand();
- initSolverBody( &solverBody, &body, timeStep );
- m_kinematicBodyUniqueIdToSolverBodyTable[ uniqueId ] = solverBodyId;
- }
- }
- else
- {
- bool isMultiBodyType = (body.getInternalType()&btCollisionObject::CO_FEATHERSTONE_LINK);
- // Incorrectly set collision object flags can degrade performance in various ways.
+ int solverBodyId = -1;
+ bool isRigidBodyType = btRigidBody::upcast(&body) != NULL;
+ if (isRigidBodyType && !body.isStaticOrKinematicObject())
+ {
+ // dynamic body
+ // Dynamic bodies can only be in one island, so it's safe to write to the companionId
+ solverBodyId = body.getCompanionId();
+ if (solverBodyId < 0)
+ {
+ solverBodyId = m_tmpSolverBodyPool.size();
+ btSolverBody& solverBody = m_tmpSolverBodyPool.expand();
+ initSolverBody(&solverBody, &body, timeStep);
+ body.setCompanionId(solverBodyId);
+ }
+ }
+ else if (isRigidBodyType && body.isKinematicObject())
+ {
+ //
+ // NOTE: must test for kinematic before static because some kinematic objects also
+ // identify as "static"
+ //
+ // Kinematic bodies can be in multiple islands at once, so it is a
+ // race condition to write to them, so we use an alternate method
+ // to record the solverBodyId
+ int uniqueId = body.getWorldArrayIndex();
+ const int INVALID_SOLVER_BODY_ID = -1;
+ if (uniqueId >= m_kinematicBodyUniqueIdToSolverBodyTable.size())
+ {
+ m_kinematicBodyUniqueIdToSolverBodyTable.resize(uniqueId + 1, INVALID_SOLVER_BODY_ID);
+ }
+ solverBodyId = m_kinematicBodyUniqueIdToSolverBodyTable[uniqueId];
+ // if no table entry yet,
+ if (solverBodyId == INVALID_SOLVER_BODY_ID)
+ {
+ // create a table entry for this body
+ solverBodyId = m_tmpSolverBodyPool.size();
+ btSolverBody& solverBody = m_tmpSolverBodyPool.expand();
+ initSolverBody(&solverBody, &body, timeStep);
+ m_kinematicBodyUniqueIdToSolverBodyTable[uniqueId] = solverBodyId;
+ }
+ }
+ else
+ {
+ bool isMultiBodyType = (body.getInternalType() & btCollisionObject::CO_FEATHERSTONE_LINK);
+ // Incorrectly set collision object flags can degrade performance in various ways.
if (!isMultiBodyType)
{
- btAssert( body.isStaticOrKinematicObject() );
+ btAssert(body.isStaticOrKinematicObject());
}
- //it could be a multibody link collider
- // all fixed bodies (inf mass) get mapped to a single solver id
- if ( m_fixedBodyId < 0 )
- {
- m_fixedBodyId = m_tmpSolverBodyPool.size();
- btSolverBody& fixedBody = m_tmpSolverBodyPool.expand();
- initSolverBody( &fixedBody, 0, timeStep );
- }
- solverBodyId = m_fixedBodyId;
- }
- btAssert( solverBodyId >= 0 && solverBodyId < m_tmpSolverBodyPool.size() );
+ //it could be a multibody link collider
+ // all fixed bodies (inf mass) get mapped to a single solver id
+ if (m_fixedBodyId < 0)
+ {
+ m_fixedBodyId = m_tmpSolverBodyPool.size();
+ btSolverBody& fixedBody = m_tmpSolverBodyPool.expand();
+ initSolverBody(&fixedBody, 0, timeStep);
+ }
+ solverBodyId = m_fixedBodyId;
+ }
+ btAssert(solverBodyId >= 0 && solverBodyId < m_tmpSolverBodyPool.size());
return solverBodyId;
-#else // BT_THREADSAFE
+#else // BT_THREADSAFE
- int solverBodyIdA = -1;
+ int solverBodyIdA = -1;
if (body.getCompanionId() >= 0)
{
//body has already been converted
solverBodyIdA = body.getCompanionId();
- btAssert(solverBodyIdA < m_tmpSolverBodyPool.size());
- } else
+ btAssert(solverBodyIdA < m_tmpSolverBodyPool.size());
+ }
+ else
{
btRigidBody* rb = btRigidBody::upcast(&body);
//convert both active and kinematic objects (for their velocity)
@@ -819,233 +768,216 @@ int btSequentialImpulseConstraintSolver::getOrInitSolverBody(btCollisionObject&
{
solverBodyIdA = m_tmpSolverBodyPool.size();
btSolverBody& solverBody = m_tmpSolverBodyPool.expand();
- initSolverBody(&solverBody,&body,timeStep);
+ initSolverBody(&solverBody, &body, timeStep);
body.setCompanionId(solverBodyIdA);
- } else
+ }
+ else
{
-
- if (m_fixedBodyId<0)
+ if (m_fixedBodyId < 0)
{
m_fixedBodyId = m_tmpSolverBodyPool.size();
btSolverBody& fixedBody = m_tmpSolverBodyPool.expand();
- initSolverBody(&fixedBody,0,timeStep);
+ initSolverBody(&fixedBody, 0, timeStep);
}
return m_fixedBodyId;
-// return 0;//assume first one is a fixed solver body
+ // return 0;//assume first one is a fixed solver body
}
}
return solverBodyIdA;
-#endif // BT_THREADSAFE
-
+#endif // BT_THREADSAFE
}
#include <stdio.h>
-
void btSequentialImpulseConstraintSolver::setupContactConstraint(btSolverConstraint& solverConstraint,
int solverBodyIdA, int solverBodyIdB,
btManifoldPoint& cp, const btContactSolverInfo& infoGlobal,
btScalar& relaxation,
const btVector3& rel_pos1, const btVector3& rel_pos2)
{
+ // const btVector3& pos1 = cp.getPositionWorldOnA();
+ // const btVector3& pos2 = cp.getPositionWorldOnB();
- // const btVector3& pos1 = cp.getPositionWorldOnA();
- // const btVector3& pos2 = cp.getPositionWorldOnB();
-
- btSolverBody* bodyA = &m_tmpSolverBodyPool[solverBodyIdA];
- btSolverBody* bodyB = &m_tmpSolverBodyPool[solverBodyIdB];
-
- btRigidBody* rb0 = bodyA->m_originalBody;
- btRigidBody* rb1 = bodyB->m_originalBody;
-
-// btVector3 rel_pos1 = pos1 - colObj0->getWorldTransform().getOrigin();
-// btVector3 rel_pos2 = pos2 - colObj1->getWorldTransform().getOrigin();
- //rel_pos1 = pos1 - bodyA->getWorldTransform().getOrigin();
- //rel_pos2 = pos2 - bodyB->getWorldTransform().getOrigin();
-
- relaxation = infoGlobal.m_sor;
- btScalar invTimeStep = btScalar(1)/infoGlobal.m_timeStep;
-
- //cfm = 1 / ( dt * kp + kd )
- //erp = dt * kp / ( dt * kp + kd )
-
- btScalar cfm = infoGlobal.m_globalCfm;
- btScalar erp = infoGlobal.m_erp2;
-
- if ((cp.m_contactPointFlags&BT_CONTACT_FLAG_HAS_CONTACT_CFM) || (cp.m_contactPointFlags&BT_CONTACT_FLAG_HAS_CONTACT_ERP))
- {
- if (cp.m_contactPointFlags&BT_CONTACT_FLAG_HAS_CONTACT_CFM)
- cfm = cp.m_contactCFM;
- if (cp.m_contactPointFlags&BT_CONTACT_FLAG_HAS_CONTACT_ERP)
- erp = cp.m_contactERP;
- } else
- {
- if (cp.m_contactPointFlags & BT_CONTACT_FLAG_CONTACT_STIFFNESS_DAMPING)
- {
- btScalar denom = ( infoGlobal.m_timeStep * cp.m_combinedContactStiffness1 + cp.m_combinedContactDamping1 );
- if (denom < SIMD_EPSILON)
- {
- denom = SIMD_EPSILON;
- }
- cfm = btScalar(1) / denom;
- erp = (infoGlobal.m_timeStep * cp.m_combinedContactStiffness1) / denom;
- }
- }
-
- cfm *= invTimeStep;
-
-
- btVector3 torqueAxis0 = rel_pos1.cross(cp.m_normalWorldOnB);
- solverConstraint.m_angularComponentA = rb0 ? rb0->getInvInertiaTensorWorld()*torqueAxis0*rb0->getAngularFactor() : btVector3(0,0,0);
- btVector3 torqueAxis1 = rel_pos2.cross(cp.m_normalWorldOnB);
- solverConstraint.m_angularComponentB = rb1 ? rb1->getInvInertiaTensorWorld()*-torqueAxis1*rb1->getAngularFactor() : btVector3(0,0,0);
-
- {
-#ifdef COMPUTE_IMPULSE_DENOM
- btScalar denom0 = rb0->computeImpulseDenominator(pos1,cp.m_normalWorldOnB);
- btScalar denom1 = rb1->computeImpulseDenominator(pos2,cp.m_normalWorldOnB);
-#else
- btVector3 vec;
- btScalar denom0 = 0.f;
- btScalar denom1 = 0.f;
- if (rb0)
- {
- vec = ( solverConstraint.m_angularComponentA).cross(rel_pos1);
- denom0 = rb0->getInvMass() + cp.m_normalWorldOnB.dot(vec);
- }
- if (rb1)
- {
- vec = ( -solverConstraint.m_angularComponentB).cross(rel_pos2);
- denom1 = rb1->getInvMass() + cp.m_normalWorldOnB.dot(vec);
- }
-#endif //COMPUTE_IMPULSE_DENOM
-
- btScalar denom = relaxation/(denom0+denom1+cfm);
- solverConstraint.m_jacDiagABInv = denom;
- }
-
- if (rb0)
- {
- solverConstraint.m_contactNormal1 = cp.m_normalWorldOnB;
- solverConstraint.m_relpos1CrossNormal = torqueAxis0;
- } else
- {
- solverConstraint.m_contactNormal1.setZero();
- solverConstraint.m_relpos1CrossNormal.setZero();
- }
- if (rb1)
- {
- solverConstraint.m_contactNormal2 = -cp.m_normalWorldOnB;
- solverConstraint.m_relpos2CrossNormal = -torqueAxis1;
- }else
- {
- solverConstraint.m_contactNormal2.setZero();
- solverConstraint.m_relpos2CrossNormal.setZero();
- }
-
- btScalar restitution = 0.f;
- btScalar penetration = cp.getDistance()+infoGlobal.m_linearSlop;
-
- {
- btVector3 vel1,vel2;
+ btSolverBody* bodyA = &m_tmpSolverBodyPool[solverBodyIdA];
+ btSolverBody* bodyB = &m_tmpSolverBodyPool[solverBodyIdB];
- vel1 = rb0? rb0->getVelocityInLocalPoint(rel_pos1) : btVector3(0,0,0);
- vel2 = rb1? rb1->getVelocityInLocalPoint(rel_pos2) : btVector3(0,0,0);
+ btRigidBody* rb0 = bodyA->m_originalBody;
+ btRigidBody* rb1 = bodyB->m_originalBody;
- // btVector3 vel2 = rb1 ? rb1->getVelocityInLocalPoint(rel_pos2) : btVector3(0,0,0);
- btVector3 vel = vel1 - vel2;
- btScalar rel_vel = cp.m_normalWorldOnB.dot(vel);
+ // btVector3 rel_pos1 = pos1 - colObj0->getWorldTransform().getOrigin();
+ // btVector3 rel_pos2 = pos2 - colObj1->getWorldTransform().getOrigin();
+ //rel_pos1 = pos1 - bodyA->getWorldTransform().getOrigin();
+ //rel_pos2 = pos2 - bodyB->getWorldTransform().getOrigin();
+ relaxation = infoGlobal.m_sor;
+ btScalar invTimeStep = btScalar(1) / infoGlobal.m_timeStep;
+ //cfm = 1 / ( dt * kp + kd )
+ //erp = dt * kp / ( dt * kp + kd )
- solverConstraint.m_friction = cp.m_combinedFriction;
+ btScalar cfm = infoGlobal.m_globalCfm;
+ btScalar erp = infoGlobal.m_erp2;
+ if ((cp.m_contactPointFlags & BT_CONTACT_FLAG_HAS_CONTACT_CFM) || (cp.m_contactPointFlags & BT_CONTACT_FLAG_HAS_CONTACT_ERP))
+ {
+ if (cp.m_contactPointFlags & BT_CONTACT_FLAG_HAS_CONTACT_CFM)
+ cfm = cp.m_contactCFM;
+ if (cp.m_contactPointFlags & BT_CONTACT_FLAG_HAS_CONTACT_ERP)
+ erp = cp.m_contactERP;
+ }
+ else
+ {
+ if (cp.m_contactPointFlags & BT_CONTACT_FLAG_CONTACT_STIFFNESS_DAMPING)
+ {
+ btScalar denom = (infoGlobal.m_timeStep * cp.m_combinedContactStiffness1 + cp.m_combinedContactDamping1);
+ if (denom < SIMD_EPSILON)
+ {
+ denom = SIMD_EPSILON;
+ }
+ cfm = btScalar(1) / denom;
+ erp = (infoGlobal.m_timeStep * cp.m_combinedContactStiffness1) / denom;
+ }
+ }
- restitution = restitutionCurve(rel_vel, cp.m_combinedRestitution, infoGlobal.m_restitutionVelocityThreshold);
- if (restitution <= btScalar(0.))
- {
- restitution = 0.f;
- };
- }
+ cfm *= invTimeStep;
+ btVector3 torqueAxis0 = rel_pos1.cross(cp.m_normalWorldOnB);
+ solverConstraint.m_angularComponentA = rb0 ? rb0->getInvInertiaTensorWorld() * torqueAxis0 * rb0->getAngularFactor() : btVector3(0, 0, 0);
+ btVector3 torqueAxis1 = rel_pos2.cross(cp.m_normalWorldOnB);
+ solverConstraint.m_angularComponentB = rb1 ? rb1->getInvInertiaTensorWorld() * -torqueAxis1 * rb1->getAngularFactor() : btVector3(0, 0, 0);
- ///warm starting (or zero if disabled)
- if (infoGlobal.m_solverMode & SOLVER_USE_WARMSTARTING)
- {
- solverConstraint.m_appliedImpulse = cp.m_appliedImpulse * infoGlobal.m_warmstartingFactor;
- if (rb0)
- bodyA->internalApplyImpulse(solverConstraint.m_contactNormal1*bodyA->internalGetInvMass()*rb0->getLinearFactor(),solverConstraint.m_angularComponentA,solverConstraint.m_appliedImpulse);
- if (rb1)
- bodyB->internalApplyImpulse(-solverConstraint.m_contactNormal2*bodyB->internalGetInvMass()*rb1->getLinearFactor(),-solverConstraint.m_angularComponentB,-(btScalar)solverConstraint.m_appliedImpulse);
- } else
- {
- solverConstraint.m_appliedImpulse = 0.f;
- }
+ {
+#ifdef COMPUTE_IMPULSE_DENOM
+ btScalar denom0 = rb0->computeImpulseDenominator(pos1, cp.m_normalWorldOnB);
+ btScalar denom1 = rb1->computeImpulseDenominator(pos2, cp.m_normalWorldOnB);
+#else
+ btVector3 vec;
+ btScalar denom0 = 0.f;
+ btScalar denom1 = 0.f;
+ if (rb0)
+ {
+ vec = (solverConstraint.m_angularComponentA).cross(rel_pos1);
+ denom0 = rb0->getInvMass() + cp.m_normalWorldOnB.dot(vec);
+ }
+ if (rb1)
+ {
+ vec = (-solverConstraint.m_angularComponentB).cross(rel_pos2);
+ denom1 = rb1->getInvMass() + cp.m_normalWorldOnB.dot(vec);
+ }
+#endif //COMPUTE_IMPULSE_DENOM
- solverConstraint.m_appliedPushImpulse = 0.f;
+ btScalar denom = relaxation / (denom0 + denom1 + cfm);
+ solverConstraint.m_jacDiagABInv = denom;
+ }
- {
+ if (rb0)
+ {
+ solverConstraint.m_contactNormal1 = cp.m_normalWorldOnB;
+ solverConstraint.m_relpos1CrossNormal = torqueAxis0;
+ }
+ else
+ {
+ solverConstraint.m_contactNormal1.setZero();
+ solverConstraint.m_relpos1CrossNormal.setZero();
+ }
+ if (rb1)
+ {
+ solverConstraint.m_contactNormal2 = -cp.m_normalWorldOnB;
+ solverConstraint.m_relpos2CrossNormal = -torqueAxis1;
+ }
+ else
+ {
+ solverConstraint.m_contactNormal2.setZero();
+ solverConstraint.m_relpos2CrossNormal.setZero();
+ }
- btVector3 externalForceImpulseA = bodyA->m_originalBody ? bodyA->m_externalForceImpulse: btVector3(0,0,0);
- btVector3 externalTorqueImpulseA = bodyA->m_originalBody ? bodyA->m_externalTorqueImpulse: btVector3(0,0,0);
- btVector3 externalForceImpulseB = bodyB->m_originalBody ? bodyB->m_externalForceImpulse: btVector3(0,0,0);
- btVector3 externalTorqueImpulseB = bodyB->m_originalBody ?bodyB->m_externalTorqueImpulse : btVector3(0,0,0);
+ btScalar restitution = 0.f;
+ btScalar penetration = cp.getDistance() + infoGlobal.m_linearSlop;
+ {
+ btVector3 vel1, vel2;
- btScalar vel1Dotn = solverConstraint.m_contactNormal1.dot(bodyA->m_linearVelocity+externalForceImpulseA)
- + solverConstraint.m_relpos1CrossNormal.dot(bodyA->m_angularVelocity+externalTorqueImpulseA);
- btScalar vel2Dotn = solverConstraint.m_contactNormal2.dot(bodyB->m_linearVelocity+externalForceImpulseB)
- + solverConstraint.m_relpos2CrossNormal.dot(bodyB->m_angularVelocity+externalTorqueImpulseB);
- btScalar rel_vel = vel1Dotn+vel2Dotn;
+ vel1 = rb0 ? rb0->getVelocityInLocalPoint(rel_pos1) : btVector3(0, 0, 0);
+ vel2 = rb1 ? rb1->getVelocityInLocalPoint(rel_pos2) : btVector3(0, 0, 0);
- btScalar positionalError = 0.f;
- btScalar velocityError = restitution - rel_vel;// * damping;
+ // btVector3 vel2 = rb1 ? rb1->getVelocityInLocalPoint(rel_pos2) : btVector3(0,0,0);
+ btVector3 vel = vel1 - vel2;
+ btScalar rel_vel = cp.m_normalWorldOnB.dot(vel);
+ solverConstraint.m_friction = cp.m_combinedFriction;
-
- if (penetration>0)
- {
- positionalError = 0;
+ restitution = restitutionCurve(rel_vel, cp.m_combinedRestitution, infoGlobal.m_restitutionVelocityThreshold);
+ if (restitution <= btScalar(0.))
+ {
+ restitution = 0.f;
+ };
+ }
- velocityError -= penetration *invTimeStep;
- } else
- {
- positionalError = -penetration * erp*invTimeStep;
+ ///warm starting (or zero if disabled)
+ if (infoGlobal.m_solverMode & SOLVER_USE_WARMSTARTING)
+ {
+ solverConstraint.m_appliedImpulse = cp.m_appliedImpulse * infoGlobal.m_warmstartingFactor;
+ if (rb0)
+ bodyA->internalApplyImpulse(solverConstraint.m_contactNormal1 * bodyA->internalGetInvMass(), solverConstraint.m_angularComponentA, solverConstraint.m_appliedImpulse);
+ if (rb1)
+ bodyB->internalApplyImpulse(-solverConstraint.m_contactNormal2 * bodyB->internalGetInvMass() , -solverConstraint.m_angularComponentB, -(btScalar)solverConstraint.m_appliedImpulse);
+ }
+ else
+ {
+ solverConstraint.m_appliedImpulse = 0.f;
+ }
- }
+ solverConstraint.m_appliedPushImpulse = 0.f;
- btScalar penetrationImpulse = positionalError*solverConstraint.m_jacDiagABInv;
- btScalar velocityImpulse = velocityError *solverConstraint.m_jacDiagABInv;
+ {
+ btVector3 externalForceImpulseA = bodyA->m_originalBody ? bodyA->m_externalForceImpulse : btVector3(0, 0, 0);
+ btVector3 externalTorqueImpulseA = bodyA->m_originalBody ? bodyA->m_externalTorqueImpulse : btVector3(0, 0, 0);
+ btVector3 externalForceImpulseB = bodyB->m_originalBody ? bodyB->m_externalForceImpulse : btVector3(0, 0, 0);
+ btVector3 externalTorqueImpulseB = bodyB->m_originalBody ? bodyB->m_externalTorqueImpulse : btVector3(0, 0, 0);
- if (!infoGlobal.m_splitImpulse || (penetration > infoGlobal.m_splitImpulsePenetrationThreshold))
- {
- //combine position and velocity into rhs
- solverConstraint.m_rhs = penetrationImpulse+velocityImpulse;//-solverConstraint.m_contactNormal1.dot(bodyA->m_externalForce*bodyA->m_invMass-bodyB->m_externalForce/bodyB->m_invMass)*solverConstraint.m_jacDiagABInv;
- solverConstraint.m_rhsPenetration = 0.f;
+ btScalar vel1Dotn = solverConstraint.m_contactNormal1.dot(bodyA->m_linearVelocity + externalForceImpulseA) + solverConstraint.m_relpos1CrossNormal.dot(bodyA->m_angularVelocity + externalTorqueImpulseA);
+ btScalar vel2Dotn = solverConstraint.m_contactNormal2.dot(bodyB->m_linearVelocity + externalForceImpulseB) + solverConstraint.m_relpos2CrossNormal.dot(bodyB->m_angularVelocity + externalTorqueImpulseB);
+ btScalar rel_vel = vel1Dotn + vel2Dotn;
- } else
- {
- //split position and velocity into rhs and m_rhsPenetration
- solverConstraint.m_rhs = velocityImpulse;
- solverConstraint.m_rhsPenetration = penetrationImpulse;
- }
- solverConstraint.m_cfm = cfm*solverConstraint.m_jacDiagABInv;
- solverConstraint.m_lowerLimit = 0;
- solverConstraint.m_upperLimit = 1e10f;
- }
+ btScalar positionalError = 0.f;
+ btScalar velocityError = restitution - rel_vel; // * damping;
+ if (penetration > 0)
+ {
+ positionalError = 0;
+ velocityError -= penetration * invTimeStep;
+ }
+ else
+ {
+ positionalError = -penetration * erp * invTimeStep;
+ }
+ btScalar penetrationImpulse = positionalError * solverConstraint.m_jacDiagABInv;
+ btScalar velocityImpulse = velocityError * solverConstraint.m_jacDiagABInv;
+ if (!infoGlobal.m_splitImpulse || (penetration > infoGlobal.m_splitImpulsePenetrationThreshold))
+ {
+ //combine position and velocity into rhs
+ solverConstraint.m_rhs = penetrationImpulse + velocityImpulse; //-solverConstraint.m_contactNormal1.dot(bodyA->m_externalForce*bodyA->m_invMass-bodyB->m_externalForce/bodyB->m_invMass)*solverConstraint.m_jacDiagABInv;
+ solverConstraint.m_rhsPenetration = 0.f;
+ }
+ else
+ {
+ //split position and velocity into rhs and m_rhsPenetration
+ solverConstraint.m_rhs = velocityImpulse;
+ solverConstraint.m_rhsPenetration = penetrationImpulse;
+ }
+ solverConstraint.m_cfm = cfm * solverConstraint.m_jacDiagABInv;
+ solverConstraint.m_lowerLimit = 0;
+ solverConstraint.m_upperLimit = 1e10f;
+ }
}
-
-
-void btSequentialImpulseConstraintSolver::setFrictionConstraintImpulse( btSolverConstraint& solverConstraint,
- int solverBodyIdA, int solverBodyIdB,
- btManifoldPoint& cp, const btContactSolverInfo& infoGlobal)
+void btSequentialImpulseConstraintSolver::setFrictionConstraintImpulse(btSolverConstraint& solverConstraint,
+ int solverBodyIdA, int solverBodyIdB,
+ btManifoldPoint& cp, const btContactSolverInfo& infoGlobal)
{
-
btSolverBody* bodyA = &m_tmpSolverBodyPool[solverBodyIdA];
btSolverBody* bodyB = &m_tmpSolverBodyPool[solverBodyIdB];
@@ -1058,10 +990,11 @@ void btSequentialImpulseConstraintSolver::setFrictionConstraintImpulse( btSolver
{
frictionConstraint1.m_appliedImpulse = cp.m_appliedImpulseLateral1 * infoGlobal.m_warmstartingFactor;
if (rb0)
- bodyA->internalApplyImpulse(frictionConstraint1.m_contactNormal1*rb0->getInvMass()*rb0->getLinearFactor(),frictionConstraint1.m_angularComponentA,frictionConstraint1.m_appliedImpulse);
+ bodyA->internalApplyImpulse(frictionConstraint1.m_contactNormal1 * rb0->getInvMass() , frictionConstraint1.m_angularComponentA, frictionConstraint1.m_appliedImpulse);
if (rb1)
- bodyB->internalApplyImpulse(-frictionConstraint1.m_contactNormal2*rb1->getInvMass()*rb1->getLinearFactor(),-frictionConstraint1.m_angularComponentB,-(btScalar)frictionConstraint1.m_appliedImpulse);
- } else
+ bodyB->internalApplyImpulse(-frictionConstraint1.m_contactNormal2 * rb1->getInvMass() , -frictionConstraint1.m_angularComponentB, -(btScalar)frictionConstraint1.m_appliedImpulse);
+ }
+ else
{
frictionConstraint1.m_appliedImpulse = 0.f;
}
@@ -1069,50 +1002,45 @@ void btSequentialImpulseConstraintSolver::setFrictionConstraintImpulse( btSolver
if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS))
{
- btSolverConstraint& frictionConstraint2 = m_tmpSolverContactFrictionConstraintPool[solverConstraint.m_frictionIndex+1];
+ btSolverConstraint& frictionConstraint2 = m_tmpSolverContactFrictionConstraintPool[solverConstraint.m_frictionIndex + 1];
if (infoGlobal.m_solverMode & SOLVER_USE_WARMSTARTING)
{
- frictionConstraint2.m_appliedImpulse = cp.m_appliedImpulseLateral2 * infoGlobal.m_warmstartingFactor;
+ frictionConstraint2.m_appliedImpulse = cp.m_appliedImpulseLateral2 * infoGlobal.m_warmstartingFactor;
if (rb0)
- bodyA->internalApplyImpulse(frictionConstraint2.m_contactNormal1*rb0->getInvMass(),frictionConstraint2.m_angularComponentA,frictionConstraint2.m_appliedImpulse);
+ bodyA->internalApplyImpulse(frictionConstraint2.m_contactNormal1 * rb0->getInvMass(), frictionConstraint2.m_angularComponentA, frictionConstraint2.m_appliedImpulse);
if (rb1)
- bodyB->internalApplyImpulse(-frictionConstraint2.m_contactNormal2*rb1->getInvMass(),-frictionConstraint2.m_angularComponentB,-(btScalar)frictionConstraint2.m_appliedImpulse);
- } else
+ bodyB->internalApplyImpulse(-frictionConstraint2.m_contactNormal2 * rb1->getInvMass(), -frictionConstraint2.m_angularComponentB, -(btScalar)frictionConstraint2.m_appliedImpulse);
+ }
+ else
{
frictionConstraint2.m_appliedImpulse = 0.f;
}
}
}
-
-
-
-void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* manifold,const btContactSolverInfo& infoGlobal)
+void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* manifold, const btContactSolverInfo& infoGlobal)
{
- btCollisionObject* colObj0=0,*colObj1=0;
+ btCollisionObject *colObj0 = 0, *colObj1 = 0;
colObj0 = (btCollisionObject*)manifold->getBody0();
colObj1 = (btCollisionObject*)manifold->getBody1();
- int solverBodyIdA = getOrInitSolverBody(*colObj0,infoGlobal.m_timeStep);
- int solverBodyIdB = getOrInitSolverBody(*colObj1,infoGlobal.m_timeStep);
+ int solverBodyIdA = getOrInitSolverBody(*colObj0, infoGlobal.m_timeStep);
+ int solverBodyIdB = getOrInitSolverBody(*colObj1, infoGlobal.m_timeStep);
-// btRigidBody* bodyA = btRigidBody::upcast(colObj0);
-// btRigidBody* bodyB = btRigidBody::upcast(colObj1);
+ // btRigidBody* bodyA = btRigidBody::upcast(colObj0);
+ // btRigidBody* bodyB = btRigidBody::upcast(colObj1);
btSolverBody* solverBodyA = &m_tmpSolverBodyPool[solverBodyIdA];
btSolverBody* solverBodyB = &m_tmpSolverBodyPool[solverBodyIdB];
-
-
///avoid collision response between two static objects
if (!solverBodyA || (solverBodyA->m_invMass.fuzzyZero() && (!solverBodyB || solverBodyB->m_invMass.fuzzyZero())))
return;
- int rollingFriction=1;
- for (int j=0;j<manifold->getNumContacts();j++)
+ int rollingFriction = 1;
+ for (int j = 0; j < manifold->getNumContacts(); j++)
{
-
btManifoldPoint& cp = manifold->getContactPoint(j);
if (cp.getDistance() <= manifold->getContactProcessingThreshold())
@@ -1121,7 +1049,6 @@ void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* m
btVector3 rel_pos2;
btScalar relaxation;
-
int frictionIndex = m_tmpSolverContactConstraintPool.size();
btSolverConstraint& solverConstraint = m_tmpSolverContactConstraintPool.expandNonInitializing();
solverConstraint.m_solverBodyIdA = solverBodyIdA;
@@ -1137,43 +1064,38 @@ void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* m
btVector3 vel1;
btVector3 vel2;
-
- solverBodyA->getVelocityInLocalPointNoDelta(rel_pos1,vel1);
- solverBodyB->getVelocityInLocalPointNoDelta(rel_pos2,vel2 );
- btVector3 vel = vel1 - vel2;
+ solverBodyA->getVelocityInLocalPointNoDelta(rel_pos1, vel1);
+ solverBodyB->getVelocityInLocalPointNoDelta(rel_pos2, vel2);
+
+ btVector3 vel = vel1 - vel2;
btScalar rel_vel = cp.m_normalWorldOnB.dot(vel);
setupContactConstraint(solverConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal, relaxation, rel_pos1, rel_pos2);
-
-
-
/////setup the friction constraints
solverConstraint.m_frictionIndex = m_tmpSolverContactFrictionConstraintPool.size();
- if ((cp.m_combinedRollingFriction>0.f) && (rollingFriction>0))
+ if ((cp.m_combinedRollingFriction > 0.f) && (rollingFriction > 0))
{
-
{
- addTorsionalFrictionConstraint(cp.m_normalWorldOnB,solverBodyIdA,solverBodyIdB,frictionIndex,cp,cp.m_combinedSpinningFriction, rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
- btVector3 axis0,axis1;
- btPlaneSpace1(cp.m_normalWorldOnB,axis0,axis1);
+ addTorsionalFrictionConstraint(cp.m_normalWorldOnB, solverBodyIdA, solverBodyIdB, frictionIndex, cp, cp.m_combinedSpinningFriction, rel_pos1, rel_pos2, colObj0, colObj1, relaxation);
+ btVector3 axis0, axis1;
+ btPlaneSpace1(cp.m_normalWorldOnB, axis0, axis1);
axis0.normalize();
axis1.normalize();
-
- applyAnisotropicFriction(colObj0,axis0,btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION);
- applyAnisotropicFriction(colObj1,axis0,btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION);
- applyAnisotropicFriction(colObj0,axis1,btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION);
- applyAnisotropicFriction(colObj1,axis1,btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION);
- if (axis0.length()>0.001)
- addTorsionalFrictionConstraint(axis0,solverBodyIdA,solverBodyIdB,frictionIndex,cp,
- cp.m_combinedRollingFriction, rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
- if (axis1.length()>0.001)
- addTorsionalFrictionConstraint(axis1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,
- cp.m_combinedRollingFriction, rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
+ applyAnisotropicFriction(colObj0, axis0, btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION);
+ applyAnisotropicFriction(colObj1, axis0, btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION);
+ applyAnisotropicFriction(colObj0, axis1, btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION);
+ applyAnisotropicFriction(colObj1, axis1, btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION);
+ if (axis0.length() > 0.001)
+ addTorsionalFrictionConstraint(axis0, solverBodyIdA, solverBodyIdB, frictionIndex, cp,
+ cp.m_combinedRollingFriction, rel_pos1, rel_pos2, colObj0, colObj1, relaxation);
+ if (axis1.length() > 0.001)
+ addTorsionalFrictionConstraint(axis1, solverBodyIdA, solverBodyIdB, frictionIndex, cp,
+ cp.m_combinedRollingFriction, rel_pos1, rel_pos2, colObj0, colObj1, relaxation);
}
}
@@ -1188,106 +1110,97 @@ void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* m
///If you choose SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION, then the friction will be independent from the relative projected velocity.
///
///The user can manually override the friction directions for certain contacts using a contact callback,
- ///and set the cp.m_lateralFrictionInitialized to true
+ ///and use contactPoint.m_contactPointFlags |= BT_CONTACT_FLAG_LATERAL_FRICTION_INITIALIZED
///In that case, you can set the target relative motion in each friction direction (cp.m_contactMotion1 and cp.m_contactMotion2)
///this will give a conveyor belt effect
///
-
- if (!(infoGlobal.m_solverMode & SOLVER_ENABLE_FRICTION_DIRECTION_CACHING) || !(cp.m_contactPointFlags&BT_CONTACT_FLAG_LATERAL_FRICTION_INITIALIZED))
+
+ if (!(infoGlobal.m_solverMode & SOLVER_ENABLE_FRICTION_DIRECTION_CACHING) || !(cp.m_contactPointFlags & BT_CONTACT_FLAG_LATERAL_FRICTION_INITIALIZED))
{
cp.m_lateralFrictionDir1 = vel - cp.m_normalWorldOnB * rel_vel;
btScalar lat_rel_vel = cp.m_lateralFrictionDir1.length2();
if (!(infoGlobal.m_solverMode & SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION) && lat_rel_vel > SIMD_EPSILON)
{
- cp.m_lateralFrictionDir1 *= 1.f/btSqrt(lat_rel_vel);
- applyAnisotropicFriction(colObj0,cp.m_lateralFrictionDir1,btCollisionObject::CF_ANISOTROPIC_FRICTION);
- applyAnisotropicFriction(colObj1,cp.m_lateralFrictionDir1,btCollisionObject::CF_ANISOTROPIC_FRICTION);
- addFrictionConstraint(cp.m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation,infoGlobal);
+ cp.m_lateralFrictionDir1 *= 1.f / btSqrt(lat_rel_vel);
+ applyAnisotropicFriction(colObj0, cp.m_lateralFrictionDir1, btCollisionObject::CF_ANISOTROPIC_FRICTION);
+ applyAnisotropicFriction(colObj1, cp.m_lateralFrictionDir1, btCollisionObject::CF_ANISOTROPIC_FRICTION);
+ addFrictionConstraint(cp.m_lateralFrictionDir1, solverBodyIdA, solverBodyIdB, frictionIndex, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal);
- if((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS))
+ if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS))
{
cp.m_lateralFrictionDir2 = cp.m_lateralFrictionDir1.cross(cp.m_normalWorldOnB);
- cp.m_lateralFrictionDir2.normalize();//??
- applyAnisotropicFriction(colObj0,cp.m_lateralFrictionDir2,btCollisionObject::CF_ANISOTROPIC_FRICTION);
- applyAnisotropicFriction(colObj1,cp.m_lateralFrictionDir2,btCollisionObject::CF_ANISOTROPIC_FRICTION);
- addFrictionConstraint(cp.m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation, infoGlobal);
+ cp.m_lateralFrictionDir2.normalize(); //??
+ applyAnisotropicFriction(colObj0, cp.m_lateralFrictionDir2, btCollisionObject::CF_ANISOTROPIC_FRICTION);
+ applyAnisotropicFriction(colObj1, cp.m_lateralFrictionDir2, btCollisionObject::CF_ANISOTROPIC_FRICTION);
+ addFrictionConstraint(cp.m_lateralFrictionDir2, solverBodyIdA, solverBodyIdB, frictionIndex, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal);
}
-
- } else
+ }
+ else
{
- btPlaneSpace1(cp.m_normalWorldOnB,cp.m_lateralFrictionDir1,cp.m_lateralFrictionDir2);
+ btPlaneSpace1(cp.m_normalWorldOnB, cp.m_lateralFrictionDir1, cp.m_lateralFrictionDir2);
- applyAnisotropicFriction(colObj0,cp.m_lateralFrictionDir1,btCollisionObject::CF_ANISOTROPIC_FRICTION);
- applyAnisotropicFriction(colObj1,cp.m_lateralFrictionDir1,btCollisionObject::CF_ANISOTROPIC_FRICTION);
- addFrictionConstraint(cp.m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation, infoGlobal);
+ applyAnisotropicFriction(colObj0, cp.m_lateralFrictionDir1, btCollisionObject::CF_ANISOTROPIC_FRICTION);
+ applyAnisotropicFriction(colObj1, cp.m_lateralFrictionDir1, btCollisionObject::CF_ANISOTROPIC_FRICTION);
+ addFrictionConstraint(cp.m_lateralFrictionDir1, solverBodyIdA, solverBodyIdB, frictionIndex, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal);
if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS))
{
- applyAnisotropicFriction(colObj0,cp.m_lateralFrictionDir2,btCollisionObject::CF_ANISOTROPIC_FRICTION);
- applyAnisotropicFriction(colObj1,cp.m_lateralFrictionDir2,btCollisionObject::CF_ANISOTROPIC_FRICTION);
- addFrictionConstraint(cp.m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation, infoGlobal);
+ applyAnisotropicFriction(colObj0, cp.m_lateralFrictionDir2, btCollisionObject::CF_ANISOTROPIC_FRICTION);
+ applyAnisotropicFriction(colObj1, cp.m_lateralFrictionDir2, btCollisionObject::CF_ANISOTROPIC_FRICTION);
+ addFrictionConstraint(cp.m_lateralFrictionDir2, solverBodyIdA, solverBodyIdB, frictionIndex, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal);
}
-
if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS) && (infoGlobal.m_solverMode & SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION))
{
- cp.m_contactPointFlags|=BT_CONTACT_FLAG_LATERAL_FRICTION_INITIALIZED;
+ cp.m_contactPointFlags |= BT_CONTACT_FLAG_LATERAL_FRICTION_INITIALIZED;
}
}
-
- } else
+ }
+ else
{
- addFrictionConstraint(cp.m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation, infoGlobal, cp.m_contactMotion1, cp.m_frictionCFM);
+ addFrictionConstraint(cp.m_lateralFrictionDir1, solverBodyIdA, solverBodyIdB, frictionIndex, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal, cp.m_contactMotion1, cp.m_frictionCFM);
if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS))
- addFrictionConstraint(cp.m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation, infoGlobal, cp.m_contactMotion2, cp.m_frictionCFM);
-
+ addFrictionConstraint(cp.m_lateralFrictionDir2, solverBodyIdA, solverBodyIdB, frictionIndex, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal, cp.m_contactMotion2, cp.m_frictionCFM);
}
- setFrictionConstraintImpulse( solverConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal);
-
-
-
-
+ setFrictionConstraintImpulse(solverConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal);
}
}
}
-void btSequentialImpulseConstraintSolver::convertContacts(btPersistentManifold** manifoldPtr,int numManifolds, const btContactSolverInfo& infoGlobal)
+void btSequentialImpulseConstraintSolver::convertContacts(btPersistentManifold** manifoldPtr, int numManifolds, const btContactSolverInfo& infoGlobal)
{
int i;
btPersistentManifold* manifold = 0;
-// btCollisionObject* colObj0=0,*colObj1=0;
-
+ // btCollisionObject* colObj0=0,*colObj1=0;
- for (i=0;i<numManifolds;i++)
+ for (i = 0; i < numManifolds; i++)
{
manifold = manifoldPtr[i];
- convertContact(manifold,infoGlobal);
+ convertContact(manifold, infoGlobal);
}
}
-
void btSequentialImpulseConstraintSolver::convertJoint(btSolverConstraint* currentConstraintRow,
- btTypedConstraint* constraint,
- const btTypedConstraint::btConstraintInfo1& info1,
- int solverBodyIdA,
- int solverBodyIdB,
- const btContactSolverInfo& infoGlobal
- )
+ btTypedConstraint* constraint,
+ const btTypedConstraint::btConstraintInfo1& info1,
+ int solverBodyIdA,
+ int solverBodyIdB,
+ const btContactSolverInfo& infoGlobal)
{
const btRigidBody& rbA = constraint->getRigidBodyA();
const btRigidBody& rbB = constraint->getRigidBodyB();
- const btSolverBody* bodyAPtr = &m_tmpSolverBodyPool[solverBodyIdA];
- const btSolverBody* bodyBPtr = &m_tmpSolverBodyPool[solverBodyIdB];
+ const btSolverBody* bodyAPtr = &m_tmpSolverBodyPool[solverBodyIdA];
+ const btSolverBody* bodyBPtr = &m_tmpSolverBodyPool[solverBodyIdB];
int overrideNumSolverIterations = constraint->getOverrideNumSolverIterations() > 0 ? constraint->getOverrideNumSolverIterations() : infoGlobal.m_numIterations;
- if (overrideNumSolverIterations>m_maxOverrideNumSolverIterations)
+ if (overrideNumSolverIterations > m_maxOverrideNumSolverIterations)
m_maxOverrideNumSolverIterations = overrideNumSolverIterations;
- for (int j=0;j<info1.m_numConstraintRows;j++)
+ for (int j = 0; j < info1.m_numConstraintRows; j++)
{
- memset(&currentConstraintRow[j],0,sizeof(btSolverConstraint));
+ memset(&currentConstraintRow[j], 0, sizeof(btSolverConstraint));
currentConstraintRow[j].m_lowerLimit = -SIMD_INFINITY;
currentConstraintRow[j].m_upperLimit = SIMD_INFINITY;
currentConstraintRow[j].m_appliedImpulse = 0.f;
@@ -1297,15 +1210,15 @@ void btSequentialImpulseConstraintSolver::convertJoint(btSolverConstraint* curre
currentConstraintRow[j].m_overrideNumSolverIterations = overrideNumSolverIterations;
}
- // these vectors are already cleared in initSolverBody, no need to redundantly clear again
- btAssert(bodyAPtr->getDeltaLinearVelocity().isZero());
- btAssert(bodyAPtr->getDeltaAngularVelocity().isZero());
- btAssert(bodyAPtr->getPushVelocity().isZero());
- btAssert(bodyAPtr->getTurnVelocity().isZero());
- btAssert(bodyBPtr->getDeltaLinearVelocity().isZero());
- btAssert(bodyBPtr->getDeltaAngularVelocity().isZero());
- btAssert(bodyBPtr->getPushVelocity().isZero());
- btAssert(bodyBPtr->getTurnVelocity().isZero());
+ // these vectors are already cleared in initSolverBody, no need to redundantly clear again
+ btAssert(bodyAPtr->getDeltaLinearVelocity().isZero());
+ btAssert(bodyAPtr->getDeltaAngularVelocity().isZero());
+ btAssert(bodyAPtr->getPushVelocity().isZero());
+ btAssert(bodyAPtr->getTurnVelocity().isZero());
+ btAssert(bodyBPtr->getDeltaLinearVelocity().isZero());
+ btAssert(bodyBPtr->getDeltaAngularVelocity().isZero());
+ btAssert(bodyBPtr->getPushVelocity().isZero());
+ btAssert(bodyBPtr->getTurnVelocity().isZero());
//bodyAPtr->internalGetDeltaLinearVelocity().setValue(0.f,0.f,0.f);
//bodyAPtr->internalGetDeltaAngularVelocity().setValue(0.f,0.f,0.f);
//bodyAPtr->internalGetPushVelocity().setValue(0.f,0.f,0.f);
@@ -1315,17 +1228,16 @@ void btSequentialImpulseConstraintSolver::convertJoint(btSolverConstraint* curre
//bodyBPtr->internalGetPushVelocity().setValue(0.f,0.f,0.f);
//bodyBPtr->internalGetTurnVelocity().setValue(0.f,0.f,0.f);
-
btTypedConstraint::btConstraintInfo2 info2;
- info2.fps = 1.f/infoGlobal.m_timeStep;
+ info2.fps = 1.f / infoGlobal.m_timeStep;
info2.erp = infoGlobal.m_erp;
info2.m_J1linearAxis = currentConstraintRow->m_contactNormal1;
info2.m_J1angularAxis = currentConstraintRow->m_relpos1CrossNormal;
info2.m_J2linearAxis = currentConstraintRow->m_contactNormal2;
info2.m_J2angularAxis = currentConstraintRow->m_relpos2CrossNormal;
- info2.rowskip = sizeof(btSolverConstraint)/sizeof(btScalar);//check this
+ info2.rowskip = sizeof(btSolverConstraint) / sizeof(btScalar); //check this
///the size of btSolverConstraint needs be a multiple of btScalar
- btAssert(info2.rowskip*sizeof(btScalar)== sizeof(btSolverConstraint));
+ btAssert(info2.rowskip * sizeof(btScalar) == sizeof(btSolverConstraint));
info2.m_constraintError = &currentConstraintRow->m_rhs;
currentConstraintRow->m_cfm = infoGlobal.m_globalCfm;
info2.m_damping = infoGlobal.m_damping;
@@ -1336,16 +1248,16 @@ void btSequentialImpulseConstraintSolver::convertJoint(btSolverConstraint* curre
constraint->getInfo2(&info2);
///finalize the constraint setup
- for (int j=0;j<info1.m_numConstraintRows;j++)
+ for (int j = 0; j < info1.m_numConstraintRows; j++)
{
btSolverConstraint& solverConstraint = currentConstraintRow[j];
- if (solverConstraint.m_upperLimit>=constraint->getBreakingImpulseThreshold())
+ if (solverConstraint.m_upperLimit >= constraint->getBreakingImpulseThreshold())
{
solverConstraint.m_upperLimit = constraint->getBreakingImpulseThreshold();
}
- if (solverConstraint.m_lowerLimit<=-constraint->getBreakingImpulseThreshold())
+ if (solverConstraint.m_lowerLimit <= -constraint->getBreakingImpulseThreshold())
{
solverConstraint.m_lowerLimit = -constraint->getBreakingImpulseThreshold();
}
@@ -1354,18 +1266,18 @@ void btSequentialImpulseConstraintSolver::convertJoint(btSolverConstraint* curre
{
const btVector3& ftorqueAxis1 = solverConstraint.m_relpos1CrossNormal;
- solverConstraint.m_angularComponentA = constraint->getRigidBodyA().getInvInertiaTensorWorld()*ftorqueAxis1*constraint->getRigidBodyA().getAngularFactor();
+ solverConstraint.m_angularComponentA = constraint->getRigidBodyA().getInvInertiaTensorWorld() * ftorqueAxis1 * constraint->getRigidBodyA().getAngularFactor();
}
{
const btVector3& ftorqueAxis2 = solverConstraint.m_relpos2CrossNormal;
- solverConstraint.m_angularComponentB = constraint->getRigidBodyB().getInvInertiaTensorWorld()*ftorqueAxis2*constraint->getRigidBodyB().getAngularFactor();
+ solverConstraint.m_angularComponentB = constraint->getRigidBodyB().getInvInertiaTensorWorld() * ftorqueAxis2 * constraint->getRigidBodyB().getAngularFactor();
}
{
- btVector3 iMJlA = solverConstraint.m_contactNormal1*rbA.getInvMass();
- btVector3 iMJaA = rbA.getInvInertiaTensorWorld()*solverConstraint.m_relpos1CrossNormal;
- btVector3 iMJlB = solverConstraint.m_contactNormal2*rbB.getInvMass();//sign of normal?
- btVector3 iMJaB = rbB.getInvInertiaTensorWorld()*solverConstraint.m_relpos2CrossNormal;
+ btVector3 iMJlA = solverConstraint.m_contactNormal1 * rbA.getInvMass();
+ btVector3 iMJaA = rbA.getInvInertiaTensorWorld() * solverConstraint.m_relpos1CrossNormal;
+ btVector3 iMJlB = solverConstraint.m_contactNormal2 * rbB.getInvMass(); //sign of normal?
+ btVector3 iMJaB = rbB.getInvInertiaTensorWorld() * solverConstraint.m_relpos2CrossNormal;
btScalar sum = iMJlA.dot(solverConstraint.m_contactNormal1);
sum += iMJaA.dot(solverConstraint.m_relpos1CrossNormal);
@@ -1373,41 +1285,38 @@ void btSequentialImpulseConstraintSolver::convertJoint(btSolverConstraint* curre
sum += iMJaB.dot(solverConstraint.m_relpos2CrossNormal);
btScalar fsum = btFabs(sum);
btAssert(fsum > SIMD_EPSILON);
- btScalar sorRelaxation = 1.f;//todo: get from globalInfo?
- solverConstraint.m_jacDiagABInv = fsum>SIMD_EPSILON?sorRelaxation/sum : 0.f;
+ btScalar sorRelaxation = 1.f; //todo: get from globalInfo?
+ solverConstraint.m_jacDiagABInv = fsum > SIMD_EPSILON ? sorRelaxation / sum : 0.f;
}
{
btScalar rel_vel;
- btVector3 externalForceImpulseA = bodyAPtr->m_originalBody ? bodyAPtr->m_externalForceImpulse : btVector3(0,0,0);
- btVector3 externalTorqueImpulseA = bodyAPtr->m_originalBody ? bodyAPtr->m_externalTorqueImpulse : btVector3(0,0,0);
+ btVector3 externalForceImpulseA = bodyAPtr->m_originalBody ? bodyAPtr->m_externalForceImpulse : btVector3(0, 0, 0);
+ btVector3 externalTorqueImpulseA = bodyAPtr->m_originalBody ? bodyAPtr->m_externalTorqueImpulse : btVector3(0, 0, 0);
- btVector3 externalForceImpulseB = bodyBPtr->m_originalBody ? bodyBPtr->m_externalForceImpulse : btVector3(0,0,0);
- btVector3 externalTorqueImpulseB = bodyBPtr->m_originalBody ?bodyBPtr->m_externalTorqueImpulse : btVector3(0,0,0);
+ btVector3 externalForceImpulseB = bodyBPtr->m_originalBody ? bodyBPtr->m_externalForceImpulse : btVector3(0, 0, 0);
+ btVector3 externalTorqueImpulseB = bodyBPtr->m_originalBody ? bodyBPtr->m_externalTorqueImpulse : btVector3(0, 0, 0);
- btScalar vel1Dotn = solverConstraint.m_contactNormal1.dot(rbA.getLinearVelocity()+externalForceImpulseA)
- + solverConstraint.m_relpos1CrossNormal.dot(rbA.getAngularVelocity()+externalTorqueImpulseA);
+ btScalar vel1Dotn = solverConstraint.m_contactNormal1.dot(rbA.getLinearVelocity() + externalForceImpulseA) + solverConstraint.m_relpos1CrossNormal.dot(rbA.getAngularVelocity() + externalTorqueImpulseA);
- btScalar vel2Dotn = solverConstraint.m_contactNormal2.dot(rbB.getLinearVelocity()+externalForceImpulseB)
- + solverConstraint.m_relpos2CrossNormal.dot(rbB.getAngularVelocity()+externalTorqueImpulseB);
+ btScalar vel2Dotn = solverConstraint.m_contactNormal2.dot(rbB.getLinearVelocity() + externalForceImpulseB) + solverConstraint.m_relpos2CrossNormal.dot(rbB.getAngularVelocity() + externalTorqueImpulseB);
- rel_vel = vel1Dotn+vel2Dotn;
+ rel_vel = vel1Dotn + vel2Dotn;
btScalar restitution = 0.f;
- btScalar positionalError = solverConstraint.m_rhs;//already filled in by getConstraintInfo2
- btScalar velocityError = restitution - rel_vel * info2.m_damping;
- btScalar penetrationImpulse = positionalError*solverConstraint.m_jacDiagABInv;
- btScalar velocityImpulse = velocityError *solverConstraint.m_jacDiagABInv;
- solverConstraint.m_rhs = penetrationImpulse+velocityImpulse;
+ btScalar positionalError = solverConstraint.m_rhs; //already filled in by getConstraintInfo2
+ btScalar velocityError = restitution - rel_vel * info2.m_damping;
+ btScalar penetrationImpulse = positionalError * solverConstraint.m_jacDiagABInv;
+ btScalar velocityImpulse = velocityError * solverConstraint.m_jacDiagABInv;
+ solverConstraint.m_rhs = penetrationImpulse + velocityImpulse;
solverConstraint.m_appliedImpulse = 0.f;
}
}
}
-
-void btSequentialImpulseConstraintSolver::convertJoints(btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal)
+void btSequentialImpulseConstraintSolver::convertJoints(btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal)
{
- BT_PROFILE("convertJoints");
- for (int j=0;j<numConstraints;j++)
+ BT_PROFILE("convertJoints");
+ for (int j = 0; j < numConstraints; j++)
{
btTypedConstraint* constraint = constraints[j];
constraint->buildJacobian();
@@ -1418,7 +1327,7 @@ void btSequentialImpulseConstraintSolver::convertJoints(btTypedConstraint** cons
m_tmpConstraintSizesPool.resizeNoInitialize(numConstraints);
//calculate the total number of contraint rows
- for (int i=0;i<numConstraints;i++)
+ for (int i = 0; i < numConstraints; i++)
{
btTypedConstraint::btConstraintInfo1& info1 = m_tmpConstraintSizesPool[i];
btJointFeedback* fb = constraints[i]->getJointFeedback();
@@ -1433,7 +1342,8 @@ void btSequentialImpulseConstraintSolver::convertJoints(btTypedConstraint** cons
if (constraints[i]->isEnabled())
{
constraints[i]->getInfo1(&info1);
- } else
+ }
+ else
{
info1.m_numConstraintRows = 0;
info1.nub = 0;
@@ -1442,110 +1352,105 @@ void btSequentialImpulseConstraintSolver::convertJoints(btTypedConstraint** cons
}
m_tmpSolverNonContactConstraintPool.resizeNoInitialize(totalNumRows);
-
///setup the btSolverConstraints
int currentRow = 0;
- for (int i=0;i<numConstraints;i++)
+ for (int i = 0; i < numConstraints; i++)
{
const btTypedConstraint::btConstraintInfo1& info1 = m_tmpConstraintSizesPool[i];
if (info1.m_numConstraintRows)
{
- btAssert(currentRow<totalNumRows);
+ btAssert(currentRow < totalNumRows);
btSolverConstraint* currentConstraintRow = &m_tmpSolverNonContactConstraintPool[currentRow];
btTypedConstraint* constraint = constraints[i];
btRigidBody& rbA = constraint->getRigidBodyA();
btRigidBody& rbB = constraint->getRigidBodyB();
- int solverBodyIdA = getOrInitSolverBody(rbA,infoGlobal.m_timeStep);
- int solverBodyIdB = getOrInitSolverBody(rbB,infoGlobal.m_timeStep);
+ int solverBodyIdA = getOrInitSolverBody(rbA, infoGlobal.m_timeStep);
+ int solverBodyIdB = getOrInitSolverBody(rbB, infoGlobal.m_timeStep);
- convertJoint(currentConstraintRow, constraint, info1, solverBodyIdA, solverBodyIdB, infoGlobal);
- }
- currentRow+=info1.m_numConstraintRows;
+ convertJoint(currentConstraintRow, constraint, info1, solverBodyIdA, solverBodyIdB, infoGlobal);
+ }
+ currentRow += info1.m_numConstraintRows;
}
}
-
void btSequentialImpulseConstraintSolver::convertBodies(btCollisionObject** bodies, int numBodies, const btContactSolverInfo& infoGlobal)
{
- BT_PROFILE("convertBodies");
+ BT_PROFILE("convertBodies");
for (int i = 0; i < numBodies; i++)
{
bodies[i]->setCompanionId(-1);
}
#if BT_THREADSAFE
- m_kinematicBodyUniqueIdToSolverBodyTable.resize( 0 );
-#endif // BT_THREADSAFE
+ m_kinematicBodyUniqueIdToSolverBodyTable.resize(0);
+#endif // BT_THREADSAFE
- m_tmpSolverBodyPool.reserve(numBodies+1);
+ m_tmpSolverBodyPool.reserve(numBodies + 1);
m_tmpSolverBodyPool.resize(0);
//btSolverBody& fixedBody = m_tmpSolverBodyPool.expand();
- //initSolverBody(&fixedBody,0);
+ //initSolverBody(&fixedBody,0);
- for (int i=0;i<numBodies;i++)
+ for (int i = 0; i < numBodies; i++)
{
- int bodyId = getOrInitSolverBody(*bodies[i],infoGlobal.m_timeStep);
+ int bodyId = getOrInitSolverBody(*bodies[i], infoGlobal.m_timeStep);
btRigidBody* body = btRigidBody::upcast(bodies[i]);
if (body && body->getInvMass())
{
btSolverBody& solverBody = m_tmpSolverBodyPool[bodyId];
- btVector3 gyroForce (0,0,0);
- if (body->getFlags()&BT_ENABLE_GYROSCOPIC_FORCE_EXPLICIT)
+ btVector3 gyroForce(0, 0, 0);
+ if (body->getFlags() & BT_ENABLE_GYROSCOPIC_FORCE_EXPLICIT)
{
gyroForce = body->computeGyroscopicForceExplicit(infoGlobal.m_maxGyroscopicForce);
- solverBody.m_externalTorqueImpulse -= gyroForce*body->getInvInertiaTensorWorld()*infoGlobal.m_timeStep;
+ solverBody.m_externalTorqueImpulse -= gyroForce * body->getInvInertiaTensorWorld() * infoGlobal.m_timeStep;
}
- if (body->getFlags()&BT_ENABLE_GYROSCOPIC_FORCE_IMPLICIT_WORLD)
+ if (body->getFlags() & BT_ENABLE_GYROSCOPIC_FORCE_IMPLICIT_WORLD)
{
gyroForce = body->computeGyroscopicImpulseImplicit_World(infoGlobal.m_timeStep);
solverBody.m_externalTorqueImpulse += gyroForce;
}
- if (body->getFlags()&BT_ENABLE_GYROSCOPIC_FORCE_IMPLICIT_BODY)
+ if (body->getFlags() & BT_ENABLE_GYROSCOPIC_FORCE_IMPLICIT_BODY)
{
gyroForce = body->computeGyroscopicImpulseImplicit_Body(infoGlobal.m_timeStep);
solverBody.m_externalTorqueImpulse += gyroForce;
-
}
}
}
}
-
-btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCollisionObject** bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer)
+btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCollisionObject** bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer)
{
m_fixedBodyId = -1;
BT_PROFILE("solveGroupCacheFriendlySetup");
(void)debugDrawer;
- // if solver mode has changed,
- if ( infoGlobal.m_solverMode != m_cachedSolverMode )
- {
- // update solver functions to use SIMD or non-SIMD
- bool useSimd = !!( infoGlobal.m_solverMode & SOLVER_SIMD );
- setupSolverFunctions( useSimd );
- m_cachedSolverMode = infoGlobal.m_solverMode;
- }
+ // if solver mode has changed,
+ if (infoGlobal.m_solverMode != m_cachedSolverMode)
+ {
+ // update solver functions to use SIMD or non-SIMD
+ bool useSimd = !!(infoGlobal.m_solverMode & SOLVER_SIMD);
+ setupSolverFunctions(useSimd);
+ m_cachedSolverMode = infoGlobal.m_solverMode;
+ }
m_maxOverrideNumSolverIterations = 0;
#ifdef BT_ADDITIONAL_DEBUG
- //make sure that dynamic bodies exist for all (enabled) constraints
- for (int i=0;i<numConstraints;i++)
+ //make sure that dynamic bodies exist for all (enabled) constraints
+ for (int i = 0; i < numConstraints; i++)
{
btTypedConstraint* constraint = constraints[i];
if (constraint->isEnabled())
{
if (!constraint->getRigidBodyA().isStaticOrKinematicObject())
{
- bool found=false;
- for (int b=0;b<numBodies;b++)
+ bool found = false;
+ for (int b = 0; b < numBodies; b++)
{
-
- if (&constraint->getRigidBodyA()==bodies[b])
+ if (&constraint->getRigidBodyA() == bodies[b])
{
found = true;
break;
@@ -1555,10 +1460,10 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
}
if (!constraint->getRigidBodyB().isStaticOrKinematicObject())
{
- bool found=false;
- for (int b=0;b<numBodies;b++)
+ bool found = false;
+ for (int b = 0; b < numBodies; b++)
{
- if (&constraint->getRigidBodyB()==bodies[b])
+ if (&constraint->getRigidBodyB() == bodies[b])
{
found = true;
break;
@@ -1568,50 +1473,46 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
}
}
}
- //make sure that dynamic bodies exist for all contact manifolds
- for (int i=0;i<numManifolds;i++)
- {
- if (!manifoldPtr[i]->getBody0()->isStaticOrKinematicObject())
- {
- bool found=false;
- for (int b=0;b<numBodies;b++)
- {
-
- if (manifoldPtr[i]->getBody0()==bodies[b])
- {
- found = true;
- break;
- }
- }
- btAssert(found);
- }
- if (!manifoldPtr[i]->getBody1()->isStaticOrKinematicObject())
- {
- bool found=false;
- for (int b=0;b<numBodies;b++)
- {
- if (manifoldPtr[i]->getBody1()==bodies[b])
- {
- found = true;
- break;
- }
- }
- btAssert(found);
- }
- }
-#endif //BT_ADDITIONAL_DEBUG
-
+ //make sure that dynamic bodies exist for all contact manifolds
+ for (int i = 0; i < numManifolds; i++)
+ {
+ if (!manifoldPtr[i]->getBody0()->isStaticOrKinematicObject())
+ {
+ bool found = false;
+ for (int b = 0; b < numBodies; b++)
+ {
+ if (manifoldPtr[i]->getBody0() == bodies[b])
+ {
+ found = true;
+ break;
+ }
+ }
+ btAssert(found);
+ }
+ if (!manifoldPtr[i]->getBody1()->isStaticOrKinematicObject())
+ {
+ bool found = false;
+ for (int b = 0; b < numBodies; b++)
+ {
+ if (manifoldPtr[i]->getBody1() == bodies[b])
+ {
+ found = true;
+ break;
+ }
+ }
+ btAssert(found);
+ }
+ }
+#endif //BT_ADDITIONAL_DEBUG
//convert all bodies
- convertBodies(bodies, numBodies, infoGlobal);
-
- convertJoints(constraints, numConstraints, infoGlobal);
+ convertBodies(bodies, numBodies, infoGlobal);
- convertContacts(manifoldPtr,numManifolds,infoGlobal);
+ convertJoints(constraints, numConstraints, infoGlobal);
+ convertContacts(manifoldPtr, numManifolds, infoGlobal);
-// btContactSolverInfo info = infoGlobal;
-
+ // btContactSolverInfo info = infoGlobal;
int numNonContactPool = m_tmpSolverNonContactConstraintPool.size();
int numConstraintPool = m_tmpSolverContactConstraintPool.size();
@@ -1620,35 +1521,33 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
///@todo: use stack allocator for such temporarily memory, same for solver bodies/constraints
m_orderNonContactConstraintPool.resizeNoInitialize(numNonContactPool);
if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS))
- m_orderTmpConstraintPool.resizeNoInitialize(numConstraintPool*2);
+ m_orderTmpConstraintPool.resizeNoInitialize(numConstraintPool * 2);
else
m_orderTmpConstraintPool.resizeNoInitialize(numConstraintPool);
m_orderFrictionConstraintPool.resizeNoInitialize(numFrictionPool);
{
int i;
- for (i=0;i<numNonContactPool;i++)
+ for (i = 0; i < numNonContactPool; i++)
{
m_orderNonContactConstraintPool[i] = i;
}
- for (i=0;i<numConstraintPool;i++)
+ for (i = 0; i < numConstraintPool; i++)
{
m_orderTmpConstraintPool[i] = i;
}
- for (i=0;i<numFrictionPool;i++)
+ for (i = 0; i < numFrictionPool; i++)
{
m_orderFrictionConstraintPool[i] = i;
}
}
return 0.f;
-
}
-
-btScalar btSequentialImpulseConstraintSolver::solveSingleIteration(int iteration, btCollisionObject** /*bodies */,int /*numBodies*/,btPersistentManifold** /*manifoldPtr*/, int /*numManifolds*/,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* /*debugDrawer*/)
+btScalar btSequentialImpulseConstraintSolver::solveSingleIteration(int iteration, btCollisionObject** /*bodies */, int /*numBodies*/, btPersistentManifold** /*manifoldPtr*/, int /*numManifolds*/, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* /*debugDrawer*/)
{
- BT_PROFILE("solveSingleIteration");
+ BT_PROFILE("solveSingleIteration");
btScalar leastSquaresResidual = 0.f;
int numNonContactPool = m_tmpSolverNonContactConstraintPool.size();
@@ -1657,29 +1556,31 @@ btScalar btSequentialImpulseConstraintSolver::solveSingleIteration(int iteration
if (infoGlobal.m_solverMode & SOLVER_RANDMIZE_ORDER)
{
- if (1) // uncomment this for a bit less random ((iteration & 7) == 0)
+ if (1) // uncomment this for a bit less random ((iteration & 7) == 0)
{
-
- for (int j=0; j<numNonContactPool; ++j) {
+ for (int j = 0; j < numNonContactPool; ++j)
+ {
int tmp = m_orderNonContactConstraintPool[j];
- int swapi = btRandInt2(j+1);
+ int swapi = btRandInt2(j + 1);
m_orderNonContactConstraintPool[j] = m_orderNonContactConstraintPool[swapi];
m_orderNonContactConstraintPool[swapi] = tmp;
}
//contact/friction constraints are not solved more than
- if (iteration< infoGlobal.m_numIterations)
+ if (iteration < infoGlobal.m_numIterations)
{
- for (int j=0; j<numConstraintPool; ++j) {
+ for (int j = 0; j < numConstraintPool; ++j)
+ {
int tmp = m_orderTmpConstraintPool[j];
- int swapi = btRandInt2(j+1);
+ int swapi = btRandInt2(j + 1);
m_orderTmpConstraintPool[j] = m_orderTmpConstraintPool[swapi];
m_orderTmpConstraintPool[swapi] = tmp;
}
- for (int j=0; j<numFrictionPool; ++j) {
+ for (int j = 0; j < numFrictionPool; ++j)
+ {
int tmp = m_orderFrictionConstraintPool[j];
- int swapi = btRandInt2(j+1);
+ int swapi = btRandInt2(j + 1);
m_orderFrictionConstraintPool[j] = m_orderFrictionConstraintPool[swapi];
m_orderFrictionConstraintPool[swapi] = tmp;
}
@@ -1687,253 +1588,240 @@ btScalar btSequentialImpulseConstraintSolver::solveSingleIteration(int iteration
}
}
- ///solve all joint constraints
- for (int j=0;j<m_tmpSolverNonContactConstraintPool.size();j++)
+ ///solve all joint constraints
+ for (int j = 0; j < m_tmpSolverNonContactConstraintPool.size(); j++)
+ {
+ btSolverConstraint& constraint = m_tmpSolverNonContactConstraintPool[m_orderNonContactConstraintPool[j]];
+ if (iteration < constraint.m_overrideNumSolverIterations)
{
- btSolverConstraint& constraint = m_tmpSolverNonContactConstraintPool[m_orderNonContactConstraintPool[j]];
- if (iteration < constraint.m_overrideNumSolverIterations)
- {
- btScalar residual = resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[constraint.m_solverBodyIdA],m_tmpSolverBodyPool[constraint.m_solverBodyIdB],constraint);
- leastSquaresResidual = btMax(leastSquaresResidual, residual*residual);
- }
+ btScalar residual = resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[constraint.m_solverBodyIdA], m_tmpSolverBodyPool[constraint.m_solverBodyIdB], constraint);
+ leastSquaresResidual = btMax(leastSquaresResidual, residual * residual);
}
+ }
- if (iteration< infoGlobal.m_numIterations)
+ if (iteration < infoGlobal.m_numIterations)
+ {
+ for (int j = 0; j < numConstraints; j++)
{
- for (int j=0;j<numConstraints;j++)
+ if (constraints[j]->isEnabled())
{
- if (constraints[j]->isEnabled())
- {
- int bodyAid = getOrInitSolverBody(constraints[j]->getRigidBodyA(),infoGlobal.m_timeStep);
- int bodyBid = getOrInitSolverBody(constraints[j]->getRigidBodyB(),infoGlobal.m_timeStep);
- btSolverBody& bodyA = m_tmpSolverBodyPool[bodyAid];
- btSolverBody& bodyB = m_tmpSolverBodyPool[bodyBid];
- constraints[j]->solveConstraintObsolete(bodyA,bodyB,infoGlobal.m_timeStep);
- }
+ int bodyAid = getOrInitSolverBody(constraints[j]->getRigidBodyA(), infoGlobal.m_timeStep);
+ int bodyBid = getOrInitSolverBody(constraints[j]->getRigidBodyB(), infoGlobal.m_timeStep);
+ btSolverBody& bodyA = m_tmpSolverBodyPool[bodyAid];
+ btSolverBody& bodyB = m_tmpSolverBodyPool[bodyBid];
+ constraints[j]->solveConstraintObsolete(bodyA, bodyB, infoGlobal.m_timeStep);
}
+ }
+
+ ///solve all contact constraints
+ if (infoGlobal.m_solverMode & SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS)
+ {
+ int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
+ int multiplier = (infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS) ? 2 : 1;
- ///solve all contact constraints
- if (infoGlobal.m_solverMode & SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS)
+ for (int c = 0; c < numPoolConstraints; c++)
{
- int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
- int multiplier = (infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS)? 2 : 1;
+ btScalar totalImpulse = 0;
- for (int c=0;c<numPoolConstraints;c++)
{
- btScalar totalImpulse =0;
+ const btSolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[m_orderTmpConstraintPool[c]];
+ btScalar residual = resolveSingleConstraintRowLowerLimit(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA], m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB], solveManifold);
+ leastSquaresResidual = btMax(leastSquaresResidual, residual * residual);
+ totalImpulse = solveManifold.m_appliedImpulse;
+ }
+ bool applyFriction = true;
+ if (applyFriction)
+ {
{
- const btSolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[m_orderTmpConstraintPool[c]];
- btScalar residual = resolveSingleConstraintRowLowerLimit(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
- leastSquaresResidual = btMax(leastSquaresResidual, residual*residual);
+ btSolverConstraint& solveManifold = m_tmpSolverContactFrictionConstraintPool[m_orderFrictionConstraintPool[c * multiplier]];
- totalImpulse = solveManifold.m_appliedImpulse;
- }
- bool applyFriction = true;
- if (applyFriction)
- {
+ if (totalImpulse > btScalar(0))
{
+ solveManifold.m_lowerLimit = -(solveManifold.m_friction * totalImpulse);
+ solveManifold.m_upperLimit = solveManifold.m_friction * totalImpulse;
- btSolverConstraint& solveManifold = m_tmpSolverContactFrictionConstraintPool[m_orderFrictionConstraintPool[c*multiplier]];
-
- if (totalImpulse>btScalar(0))
- {
- solveManifold.m_lowerLimit = -(solveManifold.m_friction*totalImpulse);
- solveManifold.m_upperLimit = solveManifold.m_friction*totalImpulse;
-
- btScalar residual = resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
- leastSquaresResidual = btMax(leastSquaresResidual, residual*residual);
- }
+ btScalar residual = resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA], m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB], solveManifold);
+ leastSquaresResidual = btMax(leastSquaresResidual, residual * residual);
}
+ }
- if (infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS)
- {
-
- btSolverConstraint& solveManifold = m_tmpSolverContactFrictionConstraintPool[m_orderFrictionConstraintPool[c*multiplier+1]];
+ if (infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS)
+ {
+ btSolverConstraint& solveManifold = m_tmpSolverContactFrictionConstraintPool[m_orderFrictionConstraintPool[c * multiplier + 1]];
- if (totalImpulse>btScalar(0))
- {
- solveManifold.m_lowerLimit = -(solveManifold.m_friction*totalImpulse);
- solveManifold.m_upperLimit = solveManifold.m_friction*totalImpulse;
+ if (totalImpulse > btScalar(0))
+ {
+ solveManifold.m_lowerLimit = -(solveManifold.m_friction * totalImpulse);
+ solveManifold.m_upperLimit = solveManifold.m_friction * totalImpulse;
- btScalar residual = resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
- leastSquaresResidual = btMax(leastSquaresResidual, residual*residual);
- }
+ btScalar residual = resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA], m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB], solveManifold);
+ leastSquaresResidual = btMax(leastSquaresResidual, residual * residual);
}
}
}
-
}
- else//SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS
- {
- //solve the friction constraints after all contact constraints, don't interleave them
- int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
- int j;
-
- for (j=0;j<numPoolConstraints;j++)
- {
- const btSolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[m_orderTmpConstraintPool[j]];
- btScalar residual = resolveSingleConstraintRowLowerLimit(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
- leastSquaresResidual = btMax(leastSquaresResidual, residual*residual);
- }
+ }
+ else //SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS
+ {
+ //solve the friction constraints after all contact constraints, don't interleave them
+ int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
+ int j;
+ for (j = 0; j < numPoolConstraints; j++)
+ {
+ const btSolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[m_orderTmpConstraintPool[j]];
+ btScalar residual = resolveSingleConstraintRowLowerLimit(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA], m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB], solveManifold);
+ leastSquaresResidual = btMax(leastSquaresResidual, residual * residual);
+ }
+ ///solve all friction constraints
- ///solve all friction constraints
+ int numFrictionPoolConstraints = m_tmpSolverContactFrictionConstraintPool.size();
+ for (j = 0; j < numFrictionPoolConstraints; j++)
+ {
+ btSolverConstraint& solveManifold = m_tmpSolverContactFrictionConstraintPool[m_orderFrictionConstraintPool[j]];
+ btScalar totalImpulse = m_tmpSolverContactConstraintPool[solveManifold.m_frictionIndex].m_appliedImpulse;
- int numFrictionPoolConstraints = m_tmpSolverContactFrictionConstraintPool.size();
- for (j=0;j<numFrictionPoolConstraints;j++)
+ if (totalImpulse > btScalar(0))
{
- btSolverConstraint& solveManifold = m_tmpSolverContactFrictionConstraintPool[m_orderFrictionConstraintPool[j]];
- btScalar totalImpulse = m_tmpSolverContactConstraintPool[solveManifold.m_frictionIndex].m_appliedImpulse;
+ solveManifold.m_lowerLimit = -(solveManifold.m_friction * totalImpulse);
+ solveManifold.m_upperLimit = solveManifold.m_friction * totalImpulse;
- if (totalImpulse>btScalar(0))
- {
- solveManifold.m_lowerLimit = -(solveManifold.m_friction*totalImpulse);
- solveManifold.m_upperLimit = solveManifold.m_friction*totalImpulse;
-
- btScalar residual = resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
- leastSquaresResidual = btMax(leastSquaresResidual, residual*residual);
- }
+ btScalar residual = resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA], m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB], solveManifold);
+ leastSquaresResidual = btMax(leastSquaresResidual, residual * residual);
}
}
+ }
+ int numRollingFrictionPoolConstraints = m_tmpSolverContactRollingFrictionConstraintPool.size();
+ for (int j = 0; j < numRollingFrictionPoolConstraints; j++)
+ {
+ btSolverConstraint& rollingFrictionConstraint = m_tmpSolverContactRollingFrictionConstraintPool[j];
+ btScalar totalImpulse = m_tmpSolverContactConstraintPool[rollingFrictionConstraint.m_frictionIndex].m_appliedImpulse;
+ if (totalImpulse > btScalar(0))
+ {
+ btScalar rollingFrictionMagnitude = rollingFrictionConstraint.m_friction * totalImpulse;
+ if (rollingFrictionMagnitude > rollingFrictionConstraint.m_friction)
+ rollingFrictionMagnitude = rollingFrictionConstraint.m_friction;
- int numRollingFrictionPoolConstraints = m_tmpSolverContactRollingFrictionConstraintPool.size();
- for (int j=0;j<numRollingFrictionPoolConstraints;j++)
- {
-
- btSolverConstraint& rollingFrictionConstraint = m_tmpSolverContactRollingFrictionConstraintPool[j];
- btScalar totalImpulse = m_tmpSolverContactConstraintPool[rollingFrictionConstraint.m_frictionIndex].m_appliedImpulse;
- if (totalImpulse>btScalar(0))
- {
- btScalar rollingFrictionMagnitude = rollingFrictionConstraint.m_friction*totalImpulse;
- if (rollingFrictionMagnitude>rollingFrictionConstraint.m_friction)
- rollingFrictionMagnitude = rollingFrictionConstraint.m_friction;
-
- rollingFrictionConstraint.m_lowerLimit = -rollingFrictionMagnitude;
- rollingFrictionConstraint.m_upperLimit = rollingFrictionMagnitude;
-
- btScalar residual = resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[rollingFrictionConstraint.m_solverBodyIdA],m_tmpSolverBodyPool[rollingFrictionConstraint.m_solverBodyIdB],rollingFrictionConstraint);
- leastSquaresResidual = btMax(leastSquaresResidual, residual*residual);
- }
- }
-
+ rollingFrictionConstraint.m_lowerLimit = -rollingFrictionMagnitude;
+ rollingFrictionConstraint.m_upperLimit = rollingFrictionMagnitude;
+ btScalar residual = resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[rollingFrictionConstraint.m_solverBodyIdA], m_tmpSolverBodyPool[rollingFrictionConstraint.m_solverBodyIdB], rollingFrictionConstraint);
+ leastSquaresResidual = btMax(leastSquaresResidual, residual * residual);
+ }
}
+ }
return leastSquaresResidual;
}
-
-void btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySplitImpulseIterations(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer)
+void btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySplitImpulseIterations(btCollisionObject** bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer)
{
BT_PROFILE("solveGroupCacheFriendlySplitImpulseIterations");
int iteration;
if (infoGlobal.m_splitImpulse)
{
{
- for ( iteration = 0;iteration<infoGlobal.m_numIterations;iteration++)
+ for (iteration = 0; iteration < infoGlobal.m_numIterations; iteration++)
{
- btScalar leastSquaresResidual =0.f;
+ btScalar leastSquaresResidual = 0.f;
{
int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
int j;
- for (j=0;j<numPoolConstraints;j++)
+ for (j = 0; j < numPoolConstraints; j++)
{
const btSolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[m_orderTmpConstraintPool[j]];
- btScalar residual = resolveSplitPenetrationImpulse(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
- leastSquaresResidual = btMax(leastSquaresResidual, residual*residual);
+ btScalar residual = resolveSplitPenetrationImpulse(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA], m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB], solveManifold);
+ leastSquaresResidual = btMax(leastSquaresResidual, residual * residual);
}
}
- if (leastSquaresResidual <= infoGlobal.m_leastSquaresResidualThreshold || iteration>=(infoGlobal.m_numIterations-1))
+ if (leastSquaresResidual <= infoGlobal.m_leastSquaresResidualThreshold || iteration >= (infoGlobal.m_numIterations - 1))
{
#ifdef VERBOSE_RESIDUAL_PRINTF
- printf("residual = %f at iteration #%d\n",leastSquaresResidual,iteration);
+ printf("residual = %f at iteration #%d\n", leastSquaresResidual, iteration);
#endif
break;
}
}
- }
+ }
}
}
-btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlyIterations(btCollisionObject** bodies ,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer)
+btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlyIterations(btCollisionObject** bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer)
{
BT_PROFILE("solveGroupCacheFriendlyIterations");
{
///this is a special step to resolve penetrations (just for contacts)
- solveGroupCacheFriendlySplitImpulseIterations(bodies ,numBodies,manifoldPtr, numManifolds,constraints,numConstraints,infoGlobal,debugDrawer);
+ solveGroupCacheFriendlySplitImpulseIterations(bodies, numBodies, manifoldPtr, numManifolds, constraints, numConstraints, infoGlobal, debugDrawer);
- int maxIterations = m_maxOverrideNumSolverIterations > infoGlobal.m_numIterations? m_maxOverrideNumSolverIterations : infoGlobal.m_numIterations;
+ int maxIterations = m_maxOverrideNumSolverIterations > infoGlobal.m_numIterations ? m_maxOverrideNumSolverIterations : infoGlobal.m_numIterations;
- for ( int iteration = 0 ; iteration< maxIterations ; iteration++)
+ for (int iteration = 0; iteration < maxIterations; iteration++)
//for ( int iteration = maxIterations-1 ; iteration >= 0;iteration--)
{
- m_leastSquaresResidual = solveSingleIteration(iteration, bodies ,numBodies,manifoldPtr, numManifolds,constraints,numConstraints,infoGlobal,debugDrawer);
+ m_leastSquaresResidual = solveSingleIteration(iteration, bodies, numBodies, manifoldPtr, numManifolds, constraints, numConstraints, infoGlobal, debugDrawer);
- if (m_leastSquaresResidual <= infoGlobal.m_leastSquaresResidualThreshold || (iteration>= (maxIterations-1)))
+ if (m_leastSquaresResidual <= infoGlobal.m_leastSquaresResidualThreshold || (iteration >= (maxIterations - 1)))
{
#ifdef VERBOSE_RESIDUAL_PRINTF
- printf("residual = %f at iteration #%d\n",m_leastSquaresResidual,iteration);
+ printf("residual = %f at iteration #%d\n", m_leastSquaresResidual, iteration);
#endif
break;
}
}
-
}
return 0.f;
}
void btSequentialImpulseConstraintSolver::writeBackContacts(int iBegin, int iEnd, const btContactSolverInfo& infoGlobal)
{
- for (int j=iBegin; j<iEnd; j++)
- {
- const btSolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[j];
- btManifoldPoint* pt = (btManifoldPoint*) solveManifold.m_originalContactPoint;
- btAssert(pt);
- pt->m_appliedImpulse = solveManifold.m_appliedImpulse;
+ for (int j = iBegin; j < iEnd; j++)
+ {
+ const btSolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[j];
+ btManifoldPoint* pt = (btManifoldPoint*)solveManifold.m_originalContactPoint;
+ btAssert(pt);
+ pt->m_appliedImpulse = solveManifold.m_appliedImpulse;
// float f = m_tmpSolverContactFrictionConstraintPool[solveManifold.m_frictionIndex].m_appliedImpulse;
- // printf("pt->m_appliedImpulseLateral1 = %f\n", f);
- pt->m_appliedImpulseLateral1 = m_tmpSolverContactFrictionConstraintPool[solveManifold.m_frictionIndex].m_appliedImpulse;
- //printf("pt->m_appliedImpulseLateral1 = %f\n", pt->m_appliedImpulseLateral1);
- if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS))
- {
- pt->m_appliedImpulseLateral2 = m_tmpSolverContactFrictionConstraintPool[solveManifold.m_frictionIndex+1].m_appliedImpulse;
- }
- //do a callback here?
+ // printf("pt->m_appliedImpulseLateral1 = %f\n", f);
+ pt->m_appliedImpulseLateral1 = m_tmpSolverContactFrictionConstraintPool[solveManifold.m_frictionIndex].m_appliedImpulse;
+ //printf("pt->m_appliedImpulseLateral1 = %f\n", pt->m_appliedImpulseLateral1);
+ if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS))
+ {
+ pt->m_appliedImpulseLateral2 = m_tmpSolverContactFrictionConstraintPool[solveManifold.m_frictionIndex + 1].m_appliedImpulse;
}
+ //do a callback here?
+ }
}
void btSequentialImpulseConstraintSolver::writeBackJoints(int iBegin, int iEnd, const btContactSolverInfo& infoGlobal)
{
- for (int j=iBegin; j<iEnd; j++)
+ for (int j = iBegin; j < iEnd; j++)
{
const btSolverConstraint& solverConstr = m_tmpSolverNonContactConstraintPool[j];
btTypedConstraint* constr = (btTypedConstraint*)solverConstr.m_originalContactPoint;
btJointFeedback* fb = constr->getJointFeedback();
if (fb)
{
- fb->m_appliedForceBodyA += solverConstr.m_contactNormal1*solverConstr.m_appliedImpulse*constr->getRigidBodyA().getLinearFactor()/infoGlobal.m_timeStep;
- fb->m_appliedForceBodyB += solverConstr.m_contactNormal2*solverConstr.m_appliedImpulse*constr->getRigidBodyB().getLinearFactor()/infoGlobal.m_timeStep;
- fb->m_appliedTorqueBodyA += solverConstr.m_relpos1CrossNormal* constr->getRigidBodyA().getAngularFactor()*solverConstr.m_appliedImpulse/infoGlobal.m_timeStep;
- fb->m_appliedTorqueBodyB += solverConstr.m_relpos2CrossNormal* constr->getRigidBodyB().getAngularFactor()*solverConstr.m_appliedImpulse/infoGlobal.m_timeStep; /*RGM ???? */
-
+ fb->m_appliedForceBodyA += solverConstr.m_contactNormal1 * solverConstr.m_appliedImpulse * constr->getRigidBodyA().getLinearFactor() / infoGlobal.m_timeStep;
+ fb->m_appliedForceBodyB += solverConstr.m_contactNormal2 * solverConstr.m_appliedImpulse * constr->getRigidBodyB().getLinearFactor() / infoGlobal.m_timeStep;
+ fb->m_appliedTorqueBodyA += solverConstr.m_relpos1CrossNormal * constr->getRigidBodyA().getAngularFactor() * solverConstr.m_appliedImpulse / infoGlobal.m_timeStep;
+ fb->m_appliedTorqueBodyB += solverConstr.m_relpos2CrossNormal * constr->getRigidBodyB().getAngularFactor() * solverConstr.m_appliedImpulse / infoGlobal.m_timeStep; /*RGM ???? */
}
constr->internalSetAppliedImpulse(solverConstr.m_appliedImpulse);
- if (btFabs(solverConstr.m_appliedImpulse)>=constr->getBreakingImpulseThreshold())
+ if (btFabs(solverConstr.m_appliedImpulse) >= constr->getBreakingImpulseThreshold())
{
constr->setEnabled(false);
}
}
}
-
void btSequentialImpulseConstraintSolver::writeBackBodies(int iBegin, int iEnd, const btContactSolverInfo& infoGlobal)
{
- for (int i=iBegin; i<iEnd; i++)
+ for (int i = iBegin; i < iEnd; i++)
{
btRigidBody* body = m_tmpSolverBodyPool[i].m_originalBody;
if (body)
@@ -1944,11 +1832,11 @@ void btSequentialImpulseConstraintSolver::writeBackBodies(int iBegin, int iEnd,
m_tmpSolverBodyPool[i].writebackVelocity();
m_tmpSolverBodyPool[i].m_originalBody->setLinearVelocity(
- m_tmpSolverBodyPool[i].m_linearVelocity+
+ m_tmpSolverBodyPool[i].m_linearVelocity +
m_tmpSolverBodyPool[i].m_externalForceImpulse);
m_tmpSolverBodyPool[i].m_originalBody->setAngularVelocity(
- m_tmpSolverBodyPool[i].m_angularVelocity+
+ m_tmpSolverBodyPool[i].m_angularVelocity +
m_tmpSolverBodyPool[i].m_externalTorqueImpulse);
if (infoGlobal.m_splitImpulse)
@@ -1959,17 +1847,17 @@ void btSequentialImpulseConstraintSolver::writeBackBodies(int iBegin, int iEnd,
}
}
-btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlyFinish(btCollisionObject** bodies,int numBodies,const btContactSolverInfo& infoGlobal)
+btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlyFinish(btCollisionObject** bodies, int numBodies, const btContactSolverInfo& infoGlobal)
{
BT_PROFILE("solveGroupCacheFriendlyFinish");
if (infoGlobal.m_solverMode & SOLVER_USE_WARMSTARTING)
{
- writeBackContacts(0, m_tmpSolverContactConstraintPool.size(), infoGlobal);
+ writeBackContacts(0, m_tmpSolverContactConstraintPool.size(), infoGlobal);
}
- writeBackJoints(0, m_tmpSolverNonContactConstraintPool.size(), infoGlobal);
- writeBackBodies(0, m_tmpSolverBodyPool.size(), infoGlobal);
+ writeBackJoints(0, m_tmpSolverNonContactConstraintPool.size(), infoGlobal);
+ writeBackBodies(0, m_tmpSolverBodyPool.size(), infoGlobal);
m_tmpSolverContactConstraintPool.resizeNoInitialize(0);
m_tmpSolverNonContactConstraintPool.resizeNoInitialize(0);
@@ -1980,25 +1868,22 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlyFinish(btCo
return 0.f;
}
-
-
/// btSequentialImpulseConstraintSolver Sequentially applies impulses
-btScalar btSequentialImpulseConstraintSolver::solveGroup(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btDispatcher* /*dispatcher*/)
+btScalar btSequentialImpulseConstraintSolver::solveGroup(btCollisionObject** bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer, btDispatcher* /*dispatcher*/)
{
-
BT_PROFILE("solveGroup");
//you need to provide at least some bodies
- solveGroupCacheFriendlySetup( bodies, numBodies, manifoldPtr, numManifolds,constraints, numConstraints,infoGlobal,debugDrawer);
+ solveGroupCacheFriendlySetup(bodies, numBodies, manifoldPtr, numManifolds, constraints, numConstraints, infoGlobal, debugDrawer);
- solveGroupCacheFriendlyIterations(bodies, numBodies, manifoldPtr, numManifolds,constraints, numConstraints,infoGlobal,debugDrawer);
+ solveGroupCacheFriendlyIterations(bodies, numBodies, manifoldPtr, numManifolds, constraints, numConstraints, infoGlobal, debugDrawer);
solveGroupCacheFriendlyFinish(bodies, numBodies, infoGlobal);
return 0.f;
}
-void btSequentialImpulseConstraintSolver::reset()
+void btSequentialImpulseConstraintSolver::reset()
{
m_btSeed2 = 0;
}
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h
index b834c3dac3..70db83b063 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h
@@ -27,147 +27,142 @@ class btCollisionObject;
#include "BulletCollision/NarrowPhaseCollision/btManifoldPoint.h"
#include "BulletDynamics/ConstraintSolver/btConstraintSolver.h"
-typedef btScalar(*btSingleConstraintRowSolver)(btSolverBody&, btSolverBody&, const btSolverConstraint&);
+typedef btScalar (*btSingleConstraintRowSolver)(btSolverBody&, btSolverBody&, const btSolverConstraint&);
///The btSequentialImpulseConstraintSolver is a fast SIMD implementation of the Projected Gauss Seidel (iterative LCP) method.
-ATTRIBUTE_ALIGNED16(class) btSequentialImpulseConstraintSolver : public btConstraintSolver
+ATTRIBUTE_ALIGNED16(class)
+btSequentialImpulseConstraintSolver : public btConstraintSolver
{
protected:
- btAlignedObjectArray<btSolverBody> m_tmpSolverBodyPool;
- btConstraintArray m_tmpSolverContactConstraintPool;
- btConstraintArray m_tmpSolverNonContactConstraintPool;
- btConstraintArray m_tmpSolverContactFrictionConstraintPool;
- btConstraintArray m_tmpSolverContactRollingFrictionConstraintPool;
-
- btAlignedObjectArray<int> m_orderTmpConstraintPool;
- btAlignedObjectArray<int> m_orderNonContactConstraintPool;
- btAlignedObjectArray<int> m_orderFrictionConstraintPool;
+ btAlignedObjectArray<btSolverBody> m_tmpSolverBodyPool;
+ btConstraintArray m_tmpSolverContactConstraintPool;
+ btConstraintArray m_tmpSolverNonContactConstraintPool;
+ btConstraintArray m_tmpSolverContactFrictionConstraintPool;
+ btConstraintArray m_tmpSolverContactRollingFrictionConstraintPool;
+
+ btAlignedObjectArray<int> m_orderTmpConstraintPool;
+ btAlignedObjectArray<int> m_orderNonContactConstraintPool;
+ btAlignedObjectArray<int> m_orderFrictionConstraintPool;
btAlignedObjectArray<btTypedConstraint::btConstraintInfo1> m_tmpConstraintSizesPool;
- int m_maxOverrideNumSolverIterations;
+ 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<int> m_kinematicBodyUniqueIdToSolverBodyTable; // only used for multithreading
+ // 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<int> 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 );
+ btSingleConstraintRowSolver m_resolveSplitPenetrationImpulse;
+ int m_cachedSolverMode; // used to check if SOLVER_SIMD flag has been changed
+ void setupSolverFunctions(bool useSimd);
- btScalar m_leastSquaresResidual;
+ 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 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.);
+ 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);
+ 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);
- 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);
- static void applyAnisotropicFriction(btCollisionObject* colObj,btVector3& frictionDirection, int frictionMode);
-
- void setFrictionConstraintImpulse( btSolverConstraint& solverConstraint, int solverBodyIdA,int solverBodyIdB,
- btManifoldPoint& cp, const btContactSolverInfo& infoGlobal);
+ 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;
-
+ unsigned long m_btSeed2;
btScalar restitutionCurve(btScalar rel_vel, btScalar restitution, btScalar velocityThreshold);
- virtual void convertContacts(btPersistentManifold** manifoldPtr, int numManifolds, const btContactSolverInfo& infoGlobal);
+ virtual void convertContacts(btPersistentManifold * *manifoldPtr, int numManifolds, const btContactSolverInfo& infoGlobal);
- void convertContact(btPersistentManifold* manifold,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 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);
+ 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 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 );
- }
+ 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 );
- }
+ 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);
- 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);
-
+ 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);
+ 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();
+ virtual void reset();
unsigned long btRand2();
- int btRandInt2 (int n);
+ int btRandInt2(int n);
- void setRandSeed(unsigned long seed)
+ void setRandSeed(unsigned long seed)
{
m_btSeed2 = seed;
}
- unsigned long getRandSeed() const
+ unsigned long getRandSeed() const
{
return m_btSeed2;
}
-
- virtual btConstraintSolverType getSolverType() const
+ virtual btConstraintSolverType getSolverType() const
{
return BT_SEQUENTIAL_IMPULSE_SOLVER;
}
- btSingleConstraintRowSolver getActiveConstraintRowSolverGeneric()
+ btSingleConstraintRowSolver getActiveConstraintRowSolverGeneric()
{
return m_resolveSingleConstraintRowGeneric;
}
@@ -175,7 +170,7 @@ public:
{
m_resolveSingleConstraintRowGeneric = rowSolver;
}
- btSingleConstraintRowSolver getActiveConstraintRowSolverLowerLimit()
+ btSingleConstraintRowSolver getActiveConstraintRowSolverLowerLimit()
{
return m_resolveSingleConstraintRowLowerLimit;
}
@@ -185,18 +180,14 @@ public:
}
///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();
+ 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();
+ btSingleConstraintRowSolver getScalarConstraintRowSolverLowerLimit();
+ btSingleConstraintRowSolver getSSE2ConstraintRowSolverLowerLimit();
+ btSingleConstraintRowSolver getSSE4_1ConstraintRowSolverLowerLimit();
};
-
-
-
-#endif //BT_SEQUENTIAL_IMPULSE_CONSTRAINT_SOLVER_H
-
+#endif //BT_SEQUENTIAL_IMPULSE_CONSTRAINT_SOLVER_H
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolverMt.cpp b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolverMt.cpp
index 4306c37e49..2718da4a50 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolverMt.cpp
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolverMt.cpp
@@ -13,7 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btSequentialImpulseConstraintSolverMt.h"
#include "LinearMath/btQuickprof.h"
@@ -23,8 +22,6 @@ subject to the following restrictions:
#include "BulletDynamics/ConstraintSolver/btTypedConstraint.h"
#include "BulletDynamics/Dynamics/btRigidBody.h"
-
-
bool btSequentialImpulseConstraintSolverMt::s_allowNestedParallelForLoops = false; // some task schedulers don't like nested loops
int btSequentialImpulseConstraintSolverMt::s_minimumContactManifoldsForBatching = 250;
int btSequentialImpulseConstraintSolverMt::s_minBatchSize = 50;
@@ -32,613 +29,594 @@ int btSequentialImpulseConstraintSolverMt::s_maxBatchSize = 100;
btBatchedConstraints::BatchingMethod btSequentialImpulseConstraintSolverMt::s_contactBatchingMethod = btBatchedConstraints::BATCHING_METHOD_SPATIAL_GRID_2D;
btBatchedConstraints::BatchingMethod btSequentialImpulseConstraintSolverMt::s_jointBatchingMethod = btBatchedConstraints::BATCHING_METHOD_SPATIAL_GRID_2D;
-
btSequentialImpulseConstraintSolverMt::btSequentialImpulseConstraintSolverMt()
{
- m_numFrictionDirections = 1;
- m_useBatching = false;
- m_useObsoleteJointConstraints = false;
+ m_numFrictionDirections = 1;
+ m_useBatching = false;
+ m_useObsoleteJointConstraints = false;
}
-
btSequentialImpulseConstraintSolverMt::~btSequentialImpulseConstraintSolverMt()
{
}
-
void btSequentialImpulseConstraintSolverMt::setupBatchedContactConstraints()
{
- BT_PROFILE("setupBatchedContactConstraints");
- m_batchedContactConstraints.setup( &m_tmpSolverContactConstraintPool,
- m_tmpSolverBodyPool,
- s_contactBatchingMethod,
- s_minBatchSize,
- s_maxBatchSize,
- &m_scratchMemory
- );
+ BT_PROFILE("setupBatchedContactConstraints");
+ m_batchedContactConstraints.setup(&m_tmpSolverContactConstraintPool,
+ m_tmpSolverBodyPool,
+ s_contactBatchingMethod,
+ s_minBatchSize,
+ s_maxBatchSize,
+ &m_scratchMemory);
}
-
void btSequentialImpulseConstraintSolverMt::setupBatchedJointConstraints()
{
- BT_PROFILE("setupBatchedJointConstraints");
- m_batchedJointConstraints.setup( &m_tmpSolverNonContactConstraintPool,
- m_tmpSolverBodyPool,
- s_jointBatchingMethod,
- s_minBatchSize,
- s_maxBatchSize,
- &m_scratchMemory
- );
+ BT_PROFILE("setupBatchedJointConstraints");
+ m_batchedJointConstraints.setup(&m_tmpSolverNonContactConstraintPool,
+ m_tmpSolverBodyPool,
+ s_jointBatchingMethod,
+ s_minBatchSize,
+ s_maxBatchSize,
+ &m_scratchMemory);
}
-
void btSequentialImpulseConstraintSolverMt::internalSetupContactConstraints(int iContactConstraint, const btContactSolverInfo& infoGlobal)
{
- btSolverConstraint& contactConstraint = m_tmpSolverContactConstraintPool[iContactConstraint];
-
- btVector3 rel_pos1;
- btVector3 rel_pos2;
- btScalar relaxation;
-
- int solverBodyIdA = contactConstraint.m_solverBodyIdA;
- int solverBodyIdB = contactConstraint.m_solverBodyIdB;
-
- btSolverBody* solverBodyA = &m_tmpSolverBodyPool[ solverBodyIdA ];
- btSolverBody* solverBodyB = &m_tmpSolverBodyPool[ solverBodyIdB ];
-
- btRigidBody* colObj0 = solverBodyA->m_originalBody;
- btRigidBody* colObj1 = solverBodyB->m_originalBody;
-
- btManifoldPoint& cp = *static_cast<btManifoldPoint*>( contactConstraint.m_originalContactPoint );
-
- const btVector3& pos1 = cp.getPositionWorldOnA();
- const btVector3& pos2 = cp.getPositionWorldOnB();
-
- rel_pos1 = pos1 - solverBodyA->getWorldTransform().getOrigin();
- rel_pos2 = pos2 - solverBodyB->getWorldTransform().getOrigin();
-
- btVector3 vel1;
- btVector3 vel2;
-
- solverBodyA->getVelocityInLocalPointNoDelta( rel_pos1, vel1 );
- solverBodyB->getVelocityInLocalPointNoDelta( rel_pos2, vel2 );
-
- btVector3 vel = vel1 - vel2;
- btScalar rel_vel = cp.m_normalWorldOnB.dot( vel );
-
- setupContactConstraint( contactConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal, relaxation, rel_pos1, rel_pos2 );
-
- // setup rolling friction constraints
- int rollingFrictionIndex = m_rollingFrictionIndexTable[iContactConstraint];
- if (rollingFrictionIndex >= 0)
- {
- btSolverConstraint& spinningFrictionConstraint = m_tmpSolverContactRollingFrictionConstraintPool[ rollingFrictionIndex ];
- btAssert( spinningFrictionConstraint.m_frictionIndex == iContactConstraint );
- setupTorsionalFrictionConstraint( spinningFrictionConstraint,
- cp.m_normalWorldOnB,
- solverBodyIdA,
- solverBodyIdB,
- cp,
- cp.m_combinedSpinningFriction,
- rel_pos1,
- rel_pos2,
- colObj0,
- colObj1,
- relaxation,
- 0.0f,
- 0.0f
- );
- btVector3 axis[2];
- btPlaneSpace1( cp.m_normalWorldOnB, axis[0], axis[1] );
- axis[0].normalize();
- axis[1].normalize();
-
- applyAnisotropicFriction( colObj0, axis[0], btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION );
- applyAnisotropicFriction( colObj1, axis[0], btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION );
- applyAnisotropicFriction( colObj0, axis[1], btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION );
- applyAnisotropicFriction( colObj1, axis[1], btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION );
- // put the largest axis first
- if (axis[1].length2() > axis[0].length2())
- {
- btSwap(axis[0], axis[1]);
- }
- const btScalar kRollingFrictionThreshold = 0.001f;
- for (int i = 0; i < 2; ++i)
- {
- int iRollingFric = rollingFrictionIndex + 1 + i;
- btSolverConstraint& rollingFrictionConstraint = m_tmpSolverContactRollingFrictionConstraintPool[ iRollingFric ];
- btAssert(rollingFrictionConstraint.m_frictionIndex == iContactConstraint);
- btVector3 dir = axis[i];
- if ( dir.length() > kRollingFrictionThreshold )
- {
- setupTorsionalFrictionConstraint( rollingFrictionConstraint,
- dir,
- solverBodyIdA,
- solverBodyIdB,
- cp,
- cp.m_combinedRollingFriction,
- rel_pos1,
- rel_pos2,
- colObj0,
- colObj1,
- relaxation,
- 0.0f,
- 0.0f
- );
- }
- else
- {
- rollingFrictionConstraint.m_frictionIndex = -1; // disable constraint
- }
- }
- }
-
- // setup friction constraints
- // setupFrictionConstraint(solverConstraint, normalAxis, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal, desiredVelocity, cfmSlip);
- {
- ///Bullet has several options to set the friction directions
- ///By default, each contact has only a single friction direction that is recomputed automatically very frame
- ///based on the relative linear velocity.
- ///If the relative velocity it zero, it will automatically compute a friction direction.
-
- ///You can also enable two friction directions, using the SOLVER_USE_2_FRICTION_DIRECTIONS.
- ///In that case, the second friction direction will be orthogonal to both contact normal and first friction direction.
- ///
- ///If you choose SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION, then the friction will be independent from the relative projected velocity.
- ///
- ///The user can manually override the friction directions for certain contacts using a contact callback,
- ///and set the cp.m_lateralFrictionInitialized to true
- ///In that case, you can set the target relative motion in each friction direction (cp.m_contactMotion1 and cp.m_contactMotion2)
- ///this will give a conveyor belt effect
- ///
- btSolverConstraint* frictionConstraint1 = &m_tmpSolverContactFrictionConstraintPool[contactConstraint.m_frictionIndex];
- btAssert(frictionConstraint1->m_frictionIndex == iContactConstraint);
-
- btSolverConstraint* frictionConstraint2 = NULL;
- if ( infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS )
- {
- frictionConstraint2 = &m_tmpSolverContactFrictionConstraintPool[contactConstraint.m_frictionIndex + 1];
- btAssert( frictionConstraint2->m_frictionIndex == iContactConstraint );
- }
-
- if ( !( infoGlobal.m_solverMode & SOLVER_ENABLE_FRICTION_DIRECTION_CACHING ) || !( cp.m_contactPointFlags&BT_CONTACT_FLAG_LATERAL_FRICTION_INITIALIZED ) )
- {
- cp.m_lateralFrictionDir1 = vel - cp.m_normalWorldOnB * rel_vel;
- btScalar lat_rel_vel = cp.m_lateralFrictionDir1.length2();
- if ( !( infoGlobal.m_solverMode & SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION ) && lat_rel_vel > SIMD_EPSILON )
- {
- cp.m_lateralFrictionDir1 *= 1.f / btSqrt( lat_rel_vel );
- applyAnisotropicFriction( colObj0, cp.m_lateralFrictionDir1, btCollisionObject::CF_ANISOTROPIC_FRICTION );
- applyAnisotropicFriction( colObj1, cp.m_lateralFrictionDir1, btCollisionObject::CF_ANISOTROPIC_FRICTION );
- setupFrictionConstraint( *frictionConstraint1, cp.m_lateralFrictionDir1, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal );
-
- if ( frictionConstraint2 )
- {
- cp.m_lateralFrictionDir2 = cp.m_lateralFrictionDir1.cross( cp.m_normalWorldOnB );
- cp.m_lateralFrictionDir2.normalize();//??
- applyAnisotropicFriction( colObj0, cp.m_lateralFrictionDir2, btCollisionObject::CF_ANISOTROPIC_FRICTION );
- applyAnisotropicFriction( colObj1, cp.m_lateralFrictionDir2, btCollisionObject::CF_ANISOTROPIC_FRICTION );
- setupFrictionConstraint( *frictionConstraint2, cp.m_lateralFrictionDir2, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal );
- }
- }
- else
- {
- btPlaneSpace1( cp.m_normalWorldOnB, cp.m_lateralFrictionDir1, cp.m_lateralFrictionDir2 );
-
- applyAnisotropicFriction( colObj0, cp.m_lateralFrictionDir1, btCollisionObject::CF_ANISOTROPIC_FRICTION );
- applyAnisotropicFriction( colObj1, cp.m_lateralFrictionDir1, btCollisionObject::CF_ANISOTROPIC_FRICTION );
- setupFrictionConstraint( *frictionConstraint1, cp.m_lateralFrictionDir1, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal );
-
- if ( frictionConstraint2 )
- {
- applyAnisotropicFriction( colObj0, cp.m_lateralFrictionDir2, btCollisionObject::CF_ANISOTROPIC_FRICTION );
- applyAnisotropicFriction( colObj1, cp.m_lateralFrictionDir2, btCollisionObject::CF_ANISOTROPIC_FRICTION );
- setupFrictionConstraint( *frictionConstraint2, cp.m_lateralFrictionDir2, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal );
- }
-
- if ( ( infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS ) && ( infoGlobal.m_solverMode & SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION ) )
- {
- cp.m_contactPointFlags |= BT_CONTACT_FLAG_LATERAL_FRICTION_INITIALIZED;
- }
- }
- }
- else
- {
- setupFrictionConstraint( *frictionConstraint1, cp.m_lateralFrictionDir1, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal, cp.m_contactMotion1, cp.m_frictionCFM );
- if ( frictionConstraint2 )
- {
- setupFrictionConstraint( *frictionConstraint2, cp.m_lateralFrictionDir2, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal, cp.m_contactMotion2, cp.m_frictionCFM );
- }
- }
- }
-
- setFrictionConstraintImpulse( contactConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal );
-}
+ btSolverConstraint& contactConstraint = m_tmpSolverContactConstraintPool[iContactConstraint];
+
+ btVector3 rel_pos1;
+ btVector3 rel_pos2;
+ btScalar relaxation;
+
+ int solverBodyIdA = contactConstraint.m_solverBodyIdA;
+ int solverBodyIdB = contactConstraint.m_solverBodyIdB;
+
+ btSolverBody* solverBodyA = &m_tmpSolverBodyPool[solverBodyIdA];
+ btSolverBody* solverBodyB = &m_tmpSolverBodyPool[solverBodyIdB];
+
+ btRigidBody* colObj0 = solverBodyA->m_originalBody;
+ btRigidBody* colObj1 = solverBodyB->m_originalBody;
+
+ btManifoldPoint& cp = *static_cast<btManifoldPoint*>(contactConstraint.m_originalContactPoint);
+
+ const btVector3& pos1 = cp.getPositionWorldOnA();
+ const btVector3& pos2 = cp.getPositionWorldOnB();
+
+ rel_pos1 = pos1 - solverBodyA->getWorldTransform().getOrigin();
+ rel_pos2 = pos2 - solverBodyB->getWorldTransform().getOrigin();
+
+ btVector3 vel1;
+ btVector3 vel2;
+
+ solverBodyA->getVelocityInLocalPointNoDelta(rel_pos1, vel1);
+ solverBodyB->getVelocityInLocalPointNoDelta(rel_pos2, vel2);
+
+ btVector3 vel = vel1 - vel2;
+ btScalar rel_vel = cp.m_normalWorldOnB.dot(vel);
+
+ setupContactConstraint(contactConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal, relaxation, rel_pos1, rel_pos2);
+
+ // setup rolling friction constraints
+ int rollingFrictionIndex = m_rollingFrictionIndexTable[iContactConstraint];
+ if (rollingFrictionIndex >= 0)
+ {
+ btSolverConstraint& spinningFrictionConstraint = m_tmpSolverContactRollingFrictionConstraintPool[rollingFrictionIndex];
+ btAssert(spinningFrictionConstraint.m_frictionIndex == iContactConstraint);
+ setupTorsionalFrictionConstraint(spinningFrictionConstraint,
+ cp.m_normalWorldOnB,
+ solverBodyIdA,
+ solverBodyIdB,
+ cp,
+ cp.m_combinedSpinningFriction,
+ rel_pos1,
+ rel_pos2,
+ colObj0,
+ colObj1,
+ relaxation,
+ 0.0f,
+ 0.0f);
+ btVector3 axis[2];
+ btPlaneSpace1(cp.m_normalWorldOnB, axis[0], axis[1]);
+ axis[0].normalize();
+ axis[1].normalize();
+
+ applyAnisotropicFriction(colObj0, axis[0], btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION);
+ applyAnisotropicFriction(colObj1, axis[0], btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION);
+ applyAnisotropicFriction(colObj0, axis[1], btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION);
+ applyAnisotropicFriction(colObj1, axis[1], btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION);
+ // put the largest axis first
+ if (axis[1].length2() > axis[0].length2())
+ {
+ btSwap(axis[0], axis[1]);
+ }
+ const btScalar kRollingFrictionThreshold = 0.001f;
+ for (int i = 0; i < 2; ++i)
+ {
+ int iRollingFric = rollingFrictionIndex + 1 + i;
+ btSolverConstraint& rollingFrictionConstraint = m_tmpSolverContactRollingFrictionConstraintPool[iRollingFric];
+ btAssert(rollingFrictionConstraint.m_frictionIndex == iContactConstraint);
+ btVector3 dir = axis[i];
+ if (dir.length() > kRollingFrictionThreshold)
+ {
+ setupTorsionalFrictionConstraint(rollingFrictionConstraint,
+ dir,
+ solverBodyIdA,
+ solverBodyIdB,
+ cp,
+ cp.m_combinedRollingFriction,
+ rel_pos1,
+ rel_pos2,
+ colObj0,
+ colObj1,
+ relaxation,
+ 0.0f,
+ 0.0f);
+ }
+ else
+ {
+ rollingFrictionConstraint.m_frictionIndex = -1; // disable constraint
+ }
+ }
+ }
+
+ // setup friction constraints
+ // setupFrictionConstraint(solverConstraint, normalAxis, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal, desiredVelocity, cfmSlip);
+ {
+ ///Bullet has several options to set the friction directions
+ ///By default, each contact has only a single friction direction that is recomputed automatically very frame
+ ///based on the relative linear velocity.
+ ///If the relative velocity it zero, it will automatically compute a friction direction.
+
+ ///You can also enable two friction directions, using the SOLVER_USE_2_FRICTION_DIRECTIONS.
+ ///In that case, the second friction direction will be orthogonal to both contact normal and first friction direction.
+ ///
+ ///If you choose SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION, then the friction will be independent from the relative projected velocity.
+ ///
+ ///The user can manually override the friction directions for certain contacts using a contact callback,
+ ///and set the cp.m_lateralFrictionInitialized to true
+ ///In that case, you can set the target relative motion in each friction direction (cp.m_contactMotion1 and cp.m_contactMotion2)
+ ///this will give a conveyor belt effect
+ ///
+ btSolverConstraint* frictionConstraint1 = &m_tmpSolverContactFrictionConstraintPool[contactConstraint.m_frictionIndex];
+ btAssert(frictionConstraint1->m_frictionIndex == iContactConstraint);
+
+ btSolverConstraint* frictionConstraint2 = NULL;
+ if (infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS)
+ {
+ frictionConstraint2 = &m_tmpSolverContactFrictionConstraintPool[contactConstraint.m_frictionIndex + 1];
+ btAssert(frictionConstraint2->m_frictionIndex == iContactConstraint);
+ }
+
+ if (!(infoGlobal.m_solverMode & SOLVER_ENABLE_FRICTION_DIRECTION_CACHING) || !(cp.m_contactPointFlags & BT_CONTACT_FLAG_LATERAL_FRICTION_INITIALIZED))
+ {
+ cp.m_lateralFrictionDir1 = vel - cp.m_normalWorldOnB * rel_vel;
+ btScalar lat_rel_vel = cp.m_lateralFrictionDir1.length2();
+ if (!(infoGlobal.m_solverMode & SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION) && lat_rel_vel > SIMD_EPSILON)
+ {
+ cp.m_lateralFrictionDir1 *= 1.f / btSqrt(lat_rel_vel);
+ applyAnisotropicFriction(colObj0, cp.m_lateralFrictionDir1, btCollisionObject::CF_ANISOTROPIC_FRICTION);
+ applyAnisotropicFriction(colObj1, cp.m_lateralFrictionDir1, btCollisionObject::CF_ANISOTROPIC_FRICTION);
+ setupFrictionConstraint(*frictionConstraint1, cp.m_lateralFrictionDir1, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal);
+
+ if (frictionConstraint2)
+ {
+ cp.m_lateralFrictionDir2 = cp.m_lateralFrictionDir1.cross(cp.m_normalWorldOnB);
+ cp.m_lateralFrictionDir2.normalize(); //??
+ applyAnisotropicFriction(colObj0, cp.m_lateralFrictionDir2, btCollisionObject::CF_ANISOTROPIC_FRICTION);
+ applyAnisotropicFriction(colObj1, cp.m_lateralFrictionDir2, btCollisionObject::CF_ANISOTROPIC_FRICTION);
+ setupFrictionConstraint(*frictionConstraint2, cp.m_lateralFrictionDir2, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal);
+ }
+ }
+ else
+ {
+ btPlaneSpace1(cp.m_normalWorldOnB, cp.m_lateralFrictionDir1, cp.m_lateralFrictionDir2);
+
+ applyAnisotropicFriction(colObj0, cp.m_lateralFrictionDir1, btCollisionObject::CF_ANISOTROPIC_FRICTION);
+ applyAnisotropicFriction(colObj1, cp.m_lateralFrictionDir1, btCollisionObject::CF_ANISOTROPIC_FRICTION);
+ setupFrictionConstraint(*frictionConstraint1, cp.m_lateralFrictionDir1, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal);
+
+ if (frictionConstraint2)
+ {
+ applyAnisotropicFriction(colObj0, cp.m_lateralFrictionDir2, btCollisionObject::CF_ANISOTROPIC_FRICTION);
+ applyAnisotropicFriction(colObj1, cp.m_lateralFrictionDir2, btCollisionObject::CF_ANISOTROPIC_FRICTION);
+ setupFrictionConstraint(*frictionConstraint2, cp.m_lateralFrictionDir2, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal);
+ }
+
+ if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS) && (infoGlobal.m_solverMode & SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION))
+ {
+ cp.m_contactPointFlags |= BT_CONTACT_FLAG_LATERAL_FRICTION_INITIALIZED;
+ }
+ }
+ }
+ else
+ {
+ setupFrictionConstraint(*frictionConstraint1, cp.m_lateralFrictionDir1, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal, cp.m_contactMotion1, cp.m_frictionCFM);
+ if (frictionConstraint2)
+ {
+ setupFrictionConstraint(*frictionConstraint2, cp.m_lateralFrictionDir2, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal, cp.m_contactMotion2, cp.m_frictionCFM);
+ }
+ }
+ }
+ setFrictionConstraintImpulse(contactConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal);
+}
struct SetupContactConstraintsLoop : public btIParallelForBody
{
- btSequentialImpulseConstraintSolverMt* m_solver;
- const btBatchedConstraints* m_bc;
- const btContactSolverInfo* m_infoGlobal;
-
- SetupContactConstraintsLoop( btSequentialImpulseConstraintSolverMt* solver, const btBatchedConstraints* bc, const btContactSolverInfo& infoGlobal )
- {
- m_solver = solver;
- m_bc = bc;
- m_infoGlobal = &infoGlobal;
- }
- void forLoop( int iBegin, int iEnd ) const BT_OVERRIDE
- {
- BT_PROFILE( "SetupContactConstraintsLoop" );
- for ( int iBatch = iBegin; iBatch < iEnd; ++iBatch )
- {
- const btBatchedConstraints::Range& batch = m_bc->m_batches[ iBatch ];
- for (int i = batch.begin; i < batch.end; ++i)
- {
- int iContact = m_bc->m_constraintIndices[i];
- m_solver->internalSetupContactConstraints( iContact, *m_infoGlobal );
- }
- }
- }
-};
+ btSequentialImpulseConstraintSolverMt* m_solver;
+ const btBatchedConstraints* m_bc;
+ const btContactSolverInfo* m_infoGlobal;
+ SetupContactConstraintsLoop(btSequentialImpulseConstraintSolverMt* solver, const btBatchedConstraints* bc, const btContactSolverInfo& infoGlobal)
+ {
+ m_solver = solver;
+ m_bc = bc;
+ m_infoGlobal = &infoGlobal;
+ }
+ void forLoop(int iBegin, int iEnd) const BT_OVERRIDE
+ {
+ BT_PROFILE("SetupContactConstraintsLoop");
+ for (int iBatch = iBegin; iBatch < iEnd; ++iBatch)
+ {
+ const btBatchedConstraints::Range& batch = m_bc->m_batches[iBatch];
+ for (int i = batch.begin; i < batch.end; ++i)
+ {
+ int iContact = m_bc->m_constraintIndices[i];
+ m_solver->internalSetupContactConstraints(iContact, *m_infoGlobal);
+ }
+ }
+ }
+};
void btSequentialImpulseConstraintSolverMt::setupAllContactConstraints(const btContactSolverInfo& infoGlobal)
{
- BT_PROFILE( "setupAllContactConstraints" );
- if ( m_useBatching )
- {
- const btBatchedConstraints& batchedCons = m_batchedContactConstraints;
- SetupContactConstraintsLoop loop( this, &batchedCons, infoGlobal );
- for ( int iiPhase = 0; iiPhase < batchedCons.m_phases.size(); ++iiPhase )
- {
- int iPhase = batchedCons.m_phaseOrder[ iiPhase ];
- const btBatchedConstraints::Range& phase = batchedCons.m_phases[ iPhase ];
- int grainSize = 1;
- btParallelFor( phase.begin, phase.end, grainSize, loop );
- }
- }
- else
- {
- for ( int i = 0; i < m_tmpSolverContactConstraintPool.size(); ++i )
- {
- internalSetupContactConstraints( i, infoGlobal );
- }
- }
+ BT_PROFILE("setupAllContactConstraints");
+ if (m_useBatching)
+ {
+ const btBatchedConstraints& batchedCons = m_batchedContactConstraints;
+ SetupContactConstraintsLoop loop(this, &batchedCons, infoGlobal);
+ for (int iiPhase = 0; iiPhase < batchedCons.m_phases.size(); ++iiPhase)
+ {
+ int iPhase = batchedCons.m_phaseOrder[iiPhase];
+ const btBatchedConstraints::Range& phase = batchedCons.m_phases[iPhase];
+ int grainSize = 1;
+ btParallelFor(phase.begin, phase.end, grainSize, loop);
+ }
+ }
+ else
+ {
+ for (int i = 0; i < m_tmpSolverContactConstraintPool.size(); ++i)
+ {
+ internalSetupContactConstraints(i, infoGlobal);
+ }
+ }
}
-
-int btSequentialImpulseConstraintSolverMt::getOrInitSolverBodyThreadsafe(btCollisionObject& body,btScalar timeStep)
+int btSequentialImpulseConstraintSolverMt::getOrInitSolverBodyThreadsafe(btCollisionObject& body, btScalar timeStep)
{
- //
- // getOrInitSolverBody is threadsafe only for a single thread per solver (with potentially multiple solvers)
- //
- // getOrInitSolverBodyThreadsafe -- attempts to be fully threadsafe (however may affect determinism)
- //
- int solverBodyId = -1;
- bool isRigidBodyType = btRigidBody::upcast( &body ) != NULL;
- if ( isRigidBodyType && !body.isStaticOrKinematicObject() )
- {
- // dynamic body
- // Dynamic bodies can only be in one island, so it's safe to write to the companionId
- solverBodyId = body.getCompanionId();
- if ( solverBodyId < 0 )
- {
- m_bodySolverArrayMutex.lock();
- // now that we have the lock, check again
- solverBodyId = body.getCompanionId();
- if ( solverBodyId < 0 )
- {
- solverBodyId = m_tmpSolverBodyPool.size();
- btSolverBody& solverBody = m_tmpSolverBodyPool.expand();
- initSolverBody( &solverBody, &body, timeStep );
- body.setCompanionId( solverBodyId );
- }
- m_bodySolverArrayMutex.unlock();
- }
- }
- else if (isRigidBodyType && body.isKinematicObject())
- {
- //
- // NOTE: must test for kinematic before static because some kinematic objects also
- // identify as "static"
- //
- // Kinematic bodies can be in multiple islands at once, so it is a
- // race condition to write to them, so we use an alternate method
- // to record the solverBodyId
- int uniqueId = body.getWorldArrayIndex();
- const int INVALID_SOLVER_BODY_ID = -1;
- if (m_kinematicBodyUniqueIdToSolverBodyTable.size() <= uniqueId )
- {
- m_kinematicBodyUniqueIdToSolverBodyTableMutex.lock();
- // now that we have the lock, check again
- if ( m_kinematicBodyUniqueIdToSolverBodyTable.size() <= uniqueId )
- {
- m_kinematicBodyUniqueIdToSolverBodyTable.resize( uniqueId + 1, INVALID_SOLVER_BODY_ID );
- }
- m_kinematicBodyUniqueIdToSolverBodyTableMutex.unlock();
- }
- solverBodyId = m_kinematicBodyUniqueIdToSolverBodyTable[ uniqueId ];
- // if no table entry yet,
- if ( INVALID_SOLVER_BODY_ID == solverBodyId )
- {
- // need to acquire both locks
- m_kinematicBodyUniqueIdToSolverBodyTableMutex.lock();
- m_bodySolverArrayMutex.lock();
- // now that we have the lock, check again
- solverBodyId = m_kinematicBodyUniqueIdToSolverBodyTable[ uniqueId ];
- if ( INVALID_SOLVER_BODY_ID == solverBodyId )
- {
- // create a table entry for this body
- solverBodyId = m_tmpSolverBodyPool.size();
- btSolverBody& solverBody = m_tmpSolverBodyPool.expand();
- initSolverBody( &solverBody, &body, timeStep );
- m_kinematicBodyUniqueIdToSolverBodyTable[ uniqueId ] = solverBodyId;
- }
- m_bodySolverArrayMutex.unlock();
- m_kinematicBodyUniqueIdToSolverBodyTableMutex.unlock();
- }
- }
- else
- {
- // all fixed bodies (inf mass) get mapped to a single solver id
- if ( m_fixedBodyId < 0 )
- {
- m_bodySolverArrayMutex.lock();
- // now that we have the lock, check again
- if ( m_fixedBodyId < 0 )
- {
- m_fixedBodyId = m_tmpSolverBodyPool.size();
- btSolverBody& fixedBody = m_tmpSolverBodyPool.expand();
- initSolverBody( &fixedBody, 0, timeStep );
- }
- m_bodySolverArrayMutex.unlock();
- }
- solverBodyId = m_fixedBodyId;
- }
- btAssert( solverBodyId >= 0 && solverBodyId < m_tmpSolverBodyPool.size() );
+ //
+ // getOrInitSolverBody is threadsafe only for a single thread per solver (with potentially multiple solvers)
+ //
+ // getOrInitSolverBodyThreadsafe -- attempts to be fully threadsafe (however may affect determinism)
+ //
+ int solverBodyId = -1;
+ bool isRigidBodyType = btRigidBody::upcast(&body) != NULL;
+ if (isRigidBodyType && !body.isStaticOrKinematicObject())
+ {
+ // dynamic body
+ // Dynamic bodies can only be in one island, so it's safe to write to the companionId
+ solverBodyId = body.getCompanionId();
+ if (solverBodyId < 0)
+ {
+ m_bodySolverArrayMutex.lock();
+ // now that we have the lock, check again
+ solverBodyId = body.getCompanionId();
+ if (solverBodyId < 0)
+ {
+ solverBodyId = m_tmpSolverBodyPool.size();
+ btSolverBody& solverBody = m_tmpSolverBodyPool.expand();
+ initSolverBody(&solverBody, &body, timeStep);
+ body.setCompanionId(solverBodyId);
+ }
+ m_bodySolverArrayMutex.unlock();
+ }
+ }
+ else if (isRigidBodyType && body.isKinematicObject())
+ {
+ //
+ // NOTE: must test for kinematic before static because some kinematic objects also
+ // identify as "static"
+ //
+ // Kinematic bodies can be in multiple islands at once, so it is a
+ // race condition to write to them, so we use an alternate method
+ // to record the solverBodyId
+ int uniqueId = body.getWorldArrayIndex();
+ const int INVALID_SOLVER_BODY_ID = -1;
+ if (m_kinematicBodyUniqueIdToSolverBodyTable.size() <= uniqueId)
+ {
+ m_kinematicBodyUniqueIdToSolverBodyTableMutex.lock();
+ // now that we have the lock, check again
+ if (m_kinematicBodyUniqueIdToSolverBodyTable.size() <= uniqueId)
+ {
+ m_kinematicBodyUniqueIdToSolverBodyTable.resize(uniqueId + 1, INVALID_SOLVER_BODY_ID);
+ }
+ m_kinematicBodyUniqueIdToSolverBodyTableMutex.unlock();
+ }
+ solverBodyId = m_kinematicBodyUniqueIdToSolverBodyTable[uniqueId];
+ // if no table entry yet,
+ if (INVALID_SOLVER_BODY_ID == solverBodyId)
+ {
+ // need to acquire both locks
+ m_kinematicBodyUniqueIdToSolverBodyTableMutex.lock();
+ m_bodySolverArrayMutex.lock();
+ // now that we have the lock, check again
+ solverBodyId = m_kinematicBodyUniqueIdToSolverBodyTable[uniqueId];
+ if (INVALID_SOLVER_BODY_ID == solverBodyId)
+ {
+ // create a table entry for this body
+ solverBodyId = m_tmpSolverBodyPool.size();
+ btSolverBody& solverBody = m_tmpSolverBodyPool.expand();
+ initSolverBody(&solverBody, &body, timeStep);
+ m_kinematicBodyUniqueIdToSolverBodyTable[uniqueId] = solverBodyId;
+ }
+ m_bodySolverArrayMutex.unlock();
+ m_kinematicBodyUniqueIdToSolverBodyTableMutex.unlock();
+ }
+ }
+ else
+ {
+ // all fixed bodies (inf mass) get mapped to a single solver id
+ if (m_fixedBodyId < 0)
+ {
+ m_bodySolverArrayMutex.lock();
+ // now that we have the lock, check again
+ if (m_fixedBodyId < 0)
+ {
+ m_fixedBodyId = m_tmpSolverBodyPool.size();
+ btSolverBody& fixedBody = m_tmpSolverBodyPool.expand();
+ initSolverBody(&fixedBody, 0, timeStep);
+ }
+ m_bodySolverArrayMutex.unlock();
+ }
+ solverBodyId = m_fixedBodyId;
+ }
+ btAssert(solverBodyId >= 0 && solverBodyId < m_tmpSolverBodyPool.size());
return solverBodyId;
}
-
void btSequentialImpulseConstraintSolverMt::internalCollectContactManifoldCachedInfo(btContactManifoldCachedInfo* cachedInfoArray, btPersistentManifold** manifoldPtr, int numManifolds, const btContactSolverInfo& infoGlobal)
{
- BT_PROFILE("internalCollectContactManifoldCachedInfo");
- for (int i = 0; i < numManifolds; ++i)
- {
- btContactManifoldCachedInfo* cachedInfo = &cachedInfoArray[i];
- btPersistentManifold* manifold = manifoldPtr[i];
- btCollisionObject* colObj0 = (btCollisionObject*) manifold->getBody0();
- btCollisionObject* colObj1 = (btCollisionObject*) manifold->getBody1();
-
- int solverBodyIdA = getOrInitSolverBodyThreadsafe( *colObj0, infoGlobal.m_timeStep );
- int solverBodyIdB = getOrInitSolverBodyThreadsafe( *colObj1, infoGlobal.m_timeStep );
-
- cachedInfo->solverBodyIds[ 0 ] = solverBodyIdA;
- cachedInfo->solverBodyIds[ 1 ] = solverBodyIdB;
- cachedInfo->numTouchingContacts = 0;
-
- btSolverBody* solverBodyA = &m_tmpSolverBodyPool[ solverBodyIdA ];
- btSolverBody* solverBodyB = &m_tmpSolverBodyPool[ solverBodyIdB ];
-
- // A contact manifold between 2 static object should not exist!
- // check the collision flags of your objects if this assert fires.
- // Incorrectly set collision object flags can degrade performance in various ways.
- btAssert( !m_tmpSolverBodyPool[ solverBodyIdA ].m_invMass.isZero() || !m_tmpSolverBodyPool[ solverBodyIdB ].m_invMass.isZero() );
-
- int iContact = 0;
- for ( int j = 0; j < manifold->getNumContacts(); j++ )
- {
- btManifoldPoint& cp = manifold->getContactPoint( j );
-
- if ( cp.getDistance() <= manifold->getContactProcessingThreshold() )
- {
- cachedInfo->contactPoints[ iContact ] = &cp;
- cachedInfo->contactHasRollingFriction[ iContact ] = ( cp.m_combinedRollingFriction > 0.f );
- iContact++;
- }
- }
- cachedInfo->numTouchingContacts = iContact;
- }
-}
+ BT_PROFILE("internalCollectContactManifoldCachedInfo");
+ for (int i = 0; i < numManifolds; ++i)
+ {
+ btContactManifoldCachedInfo* cachedInfo = &cachedInfoArray[i];
+ btPersistentManifold* manifold = manifoldPtr[i];
+ btCollisionObject* colObj0 = (btCollisionObject*)manifold->getBody0();
+ btCollisionObject* colObj1 = (btCollisionObject*)manifold->getBody1();
+
+ int solverBodyIdA = getOrInitSolverBodyThreadsafe(*colObj0, infoGlobal.m_timeStep);
+ int solverBodyIdB = getOrInitSolverBodyThreadsafe(*colObj1, infoGlobal.m_timeStep);
+
+ cachedInfo->solverBodyIds[0] = solverBodyIdA;
+ cachedInfo->solverBodyIds[1] = solverBodyIdB;
+ cachedInfo->numTouchingContacts = 0;
+
+ btSolverBody* solverBodyA = &m_tmpSolverBodyPool[solverBodyIdA];
+ btSolverBody* solverBodyB = &m_tmpSolverBodyPool[solverBodyIdB];
+ // A contact manifold between 2 static object should not exist!
+ // check the collision flags of your objects if this assert fires.
+ // Incorrectly set collision object flags can degrade performance in various ways.
+ btAssert(!m_tmpSolverBodyPool[solverBodyIdA].m_invMass.isZero() || !m_tmpSolverBodyPool[solverBodyIdB].m_invMass.isZero());
+
+ int iContact = 0;
+ for (int j = 0; j < manifold->getNumContacts(); j++)
+ {
+ btManifoldPoint& cp = manifold->getContactPoint(j);
+
+ if (cp.getDistance() <= manifold->getContactProcessingThreshold())
+ {
+ cachedInfo->contactPoints[iContact] = &cp;
+ cachedInfo->contactHasRollingFriction[iContact] = (cp.m_combinedRollingFriction > 0.f);
+ iContact++;
+ }
+ }
+ cachedInfo->numTouchingContacts = iContact;
+ }
+}
struct CollectContactManifoldCachedInfoLoop : public btIParallelForBody
{
- btSequentialImpulseConstraintSolverMt* m_solver;
- btSequentialImpulseConstraintSolverMt::btContactManifoldCachedInfo* m_cachedInfoArray;
- btPersistentManifold** m_manifoldPtr;
- const btContactSolverInfo* m_infoGlobal;
-
- CollectContactManifoldCachedInfoLoop( btSequentialImpulseConstraintSolverMt* solver, btSequentialImpulseConstraintSolverMt::btContactManifoldCachedInfo* cachedInfoArray, btPersistentManifold** manifoldPtr, const btContactSolverInfo& infoGlobal )
- {
- m_solver = solver;
- m_cachedInfoArray = cachedInfoArray;
- m_manifoldPtr = manifoldPtr;
- m_infoGlobal = &infoGlobal;
- }
- void forLoop( int iBegin, int iEnd ) const BT_OVERRIDE
- {
- m_solver->internalCollectContactManifoldCachedInfo( m_cachedInfoArray + iBegin, m_manifoldPtr + iBegin, iEnd - iBegin, *m_infoGlobal );
- }
-};
+ btSequentialImpulseConstraintSolverMt* m_solver;
+ btSequentialImpulseConstraintSolverMt::btContactManifoldCachedInfo* m_cachedInfoArray;
+ btPersistentManifold** m_manifoldPtr;
+ const btContactSolverInfo* m_infoGlobal;
+ CollectContactManifoldCachedInfoLoop(btSequentialImpulseConstraintSolverMt* solver, btSequentialImpulseConstraintSolverMt::btContactManifoldCachedInfo* cachedInfoArray, btPersistentManifold** manifoldPtr, const btContactSolverInfo& infoGlobal)
+ {
+ m_solver = solver;
+ m_cachedInfoArray = cachedInfoArray;
+ m_manifoldPtr = manifoldPtr;
+ m_infoGlobal = &infoGlobal;
+ }
+ void forLoop(int iBegin, int iEnd) const BT_OVERRIDE
+ {
+ m_solver->internalCollectContactManifoldCachedInfo(m_cachedInfoArray + iBegin, m_manifoldPtr + iBegin, iEnd - iBegin, *m_infoGlobal);
+ }
+};
void btSequentialImpulseConstraintSolverMt::internalAllocContactConstraints(const btContactManifoldCachedInfo* cachedInfoArray, int numManifolds)
{
- BT_PROFILE("internalAllocContactConstraints");
- // possibly parallel part
- for ( int iManifold = 0; iManifold < numManifolds; ++iManifold )
- {
- const btContactManifoldCachedInfo& cachedInfo = cachedInfoArray[ iManifold ];
- int contactIndex = cachedInfo.contactIndex;
- int frictionIndex = contactIndex * m_numFrictionDirections;
- int rollingFrictionIndex = cachedInfo.rollingFrictionIndex;
- for ( int i = 0; i < cachedInfo.numTouchingContacts; i++ )
- {
- btSolverConstraint& contactConstraint = m_tmpSolverContactConstraintPool[contactIndex];
- contactConstraint.m_solverBodyIdA = cachedInfo.solverBodyIds[ 0 ];
- contactConstraint.m_solverBodyIdB = cachedInfo.solverBodyIds[ 1 ];
- contactConstraint.m_originalContactPoint = cachedInfo.contactPoints[ i ];
-
- // allocate the friction constraints
- contactConstraint.m_frictionIndex = frictionIndex;
- for ( int iDir = 0; iDir < m_numFrictionDirections; ++iDir )
- {
- btSolverConstraint& frictionConstraint = m_tmpSolverContactFrictionConstraintPool[frictionIndex];
- frictionConstraint.m_frictionIndex = contactIndex;
- frictionIndex++;
- }
-
- // allocate rolling friction constraints
- if ( cachedInfo.contactHasRollingFriction[ i ] )
- {
- m_rollingFrictionIndexTable[ contactIndex ] = rollingFrictionIndex;
- // allocate 3 (although we may use only 2 sometimes)
- for ( int i = 0; i < 3; i++ )
- {
- m_tmpSolverContactRollingFrictionConstraintPool[ rollingFrictionIndex ].m_frictionIndex = contactIndex;
- rollingFrictionIndex++;
- }
- }
- else
- {
- // indicate there is no rolling friction for this contact point
- m_rollingFrictionIndexTable[ contactIndex ] = -1;
- }
- contactIndex++;
- }
- }
-}
+ BT_PROFILE("internalAllocContactConstraints");
+ // possibly parallel part
+ for (int iManifold = 0; iManifold < numManifolds; ++iManifold)
+ {
+ const btContactManifoldCachedInfo& cachedInfo = cachedInfoArray[iManifold];
+ int contactIndex = cachedInfo.contactIndex;
+ int frictionIndex = contactIndex * m_numFrictionDirections;
+ int rollingFrictionIndex = cachedInfo.rollingFrictionIndex;
+ for (int i = 0; i < cachedInfo.numTouchingContacts; i++)
+ {
+ btSolverConstraint& contactConstraint = m_tmpSolverContactConstraintPool[contactIndex];
+ contactConstraint.m_solverBodyIdA = cachedInfo.solverBodyIds[0];
+ contactConstraint.m_solverBodyIdB = cachedInfo.solverBodyIds[1];
+ contactConstraint.m_originalContactPoint = cachedInfo.contactPoints[i];
+
+ // allocate the friction constraints
+ contactConstraint.m_frictionIndex = frictionIndex;
+ for (int iDir = 0; iDir < m_numFrictionDirections; ++iDir)
+ {
+ btSolverConstraint& frictionConstraint = m_tmpSolverContactFrictionConstraintPool[frictionIndex];
+ frictionConstraint.m_frictionIndex = contactIndex;
+ frictionIndex++;
+ }
+ // allocate rolling friction constraints
+ if (cachedInfo.contactHasRollingFriction[i])
+ {
+ m_rollingFrictionIndexTable[contactIndex] = rollingFrictionIndex;
+ // allocate 3 (although we may use only 2 sometimes)
+ for (int i = 0; i < 3; i++)
+ {
+ m_tmpSolverContactRollingFrictionConstraintPool[rollingFrictionIndex].m_frictionIndex = contactIndex;
+ rollingFrictionIndex++;
+ }
+ }
+ else
+ {
+ // indicate there is no rolling friction for this contact point
+ m_rollingFrictionIndexTable[contactIndex] = -1;
+ }
+ contactIndex++;
+ }
+ }
+}
struct AllocContactConstraintsLoop : public btIParallelForBody
{
- btSequentialImpulseConstraintSolverMt* m_solver;
- const btSequentialImpulseConstraintSolverMt::btContactManifoldCachedInfo* m_cachedInfoArray;
-
- AllocContactConstraintsLoop( btSequentialImpulseConstraintSolverMt* solver, btSequentialImpulseConstraintSolverMt::btContactManifoldCachedInfo* cachedInfoArray )
- {
- m_solver = solver;
- m_cachedInfoArray = cachedInfoArray;
- }
- void forLoop( int iBegin, int iEnd ) const BT_OVERRIDE
- {
- m_solver->internalAllocContactConstraints( m_cachedInfoArray + iBegin, iEnd - iBegin );
- }
-};
+ btSequentialImpulseConstraintSolverMt* m_solver;
+ const btSequentialImpulseConstraintSolverMt::btContactManifoldCachedInfo* m_cachedInfoArray;
+ AllocContactConstraintsLoop(btSequentialImpulseConstraintSolverMt* solver, btSequentialImpulseConstraintSolverMt::btContactManifoldCachedInfo* cachedInfoArray)
+ {
+ m_solver = solver;
+ m_cachedInfoArray = cachedInfoArray;
+ }
+ void forLoop(int iBegin, int iEnd) const BT_OVERRIDE
+ {
+ m_solver->internalAllocContactConstraints(m_cachedInfoArray + iBegin, iEnd - iBegin);
+ }
+};
void btSequentialImpulseConstraintSolverMt::allocAllContactConstraints(btPersistentManifold** manifoldPtr, int numManifolds, const btContactSolverInfo& infoGlobal)
{
- BT_PROFILE( "allocAllContactConstraints" );
- btAlignedObjectArray<btContactManifoldCachedInfo> cachedInfoArray; // = m_manifoldCachedInfoArray;
- cachedInfoArray.resizeNoInitialize( numManifolds );
- if (/* DISABLES CODE */ (false))
- {
- // sequential
- internalCollectContactManifoldCachedInfo(&cachedInfoArray[ 0 ], manifoldPtr, numManifolds, infoGlobal);
- }
- else
- {
- // may alter ordering of bodies which affects determinism
- CollectContactManifoldCachedInfoLoop loop( this, &cachedInfoArray[ 0 ], manifoldPtr, infoGlobal );
- int grainSize = 200;
- btParallelFor( 0, numManifolds, grainSize, loop );
- }
-
- {
- // serial part
- int numContacts = 0;
- int numRollingFrictionConstraints = 0;
- for ( int iManifold = 0; iManifold < numManifolds; ++iManifold )
- {
- btContactManifoldCachedInfo& cachedInfo = cachedInfoArray[ iManifold ];
- cachedInfo.contactIndex = numContacts;
- cachedInfo.rollingFrictionIndex = numRollingFrictionConstraints;
- numContacts += cachedInfo.numTouchingContacts;
- for (int i = 0; i < cachedInfo.numTouchingContacts; ++i)
- {
- if (cachedInfo.contactHasRollingFriction[i])
- {
- numRollingFrictionConstraints += 3;
- }
- }
- }
- {
- BT_PROFILE( "allocPools" );
- if ( m_tmpSolverContactConstraintPool.capacity() < numContacts )
- {
- // if we need to reallocate, reserve some extra so we don't have to reallocate again next frame
- int extraReserve = numContacts / 16;
- m_tmpSolverContactConstraintPool.reserve( numContacts + extraReserve );
- m_rollingFrictionIndexTable.reserve( numContacts + extraReserve );
- m_tmpSolverContactFrictionConstraintPool.reserve( ( numContacts + extraReserve )*m_numFrictionDirections );
- m_tmpSolverContactRollingFrictionConstraintPool.reserve( numRollingFrictionConstraints + extraReserve );
- }
- m_tmpSolverContactConstraintPool.resizeNoInitialize( numContacts );
- m_rollingFrictionIndexTable.resizeNoInitialize( numContacts );
- m_tmpSolverContactFrictionConstraintPool.resizeNoInitialize( numContacts*m_numFrictionDirections );
- m_tmpSolverContactRollingFrictionConstraintPool.resizeNoInitialize( numRollingFrictionConstraints );
- }
- }
- {
- AllocContactConstraintsLoop loop(this, &cachedInfoArray[0]);
- int grainSize = 200;
- btParallelFor( 0, numManifolds, grainSize, loop );
- }
-}
+ BT_PROFILE("allocAllContactConstraints");
+ btAlignedObjectArray<btContactManifoldCachedInfo> cachedInfoArray; // = m_manifoldCachedInfoArray;
+ cachedInfoArray.resizeNoInitialize(numManifolds);
+ if (/* DISABLES CODE */ (false))
+ {
+ // sequential
+ internalCollectContactManifoldCachedInfo(&cachedInfoArray[0], manifoldPtr, numManifolds, infoGlobal);
+ }
+ else
+ {
+ // may alter ordering of bodies which affects determinism
+ CollectContactManifoldCachedInfoLoop loop(this, &cachedInfoArray[0], manifoldPtr, infoGlobal);
+ int grainSize = 200;
+ btParallelFor(0, numManifolds, grainSize, loop);
+ }
+ {
+ // serial part
+ int numContacts = 0;
+ int numRollingFrictionConstraints = 0;
+ for (int iManifold = 0; iManifold < numManifolds; ++iManifold)
+ {
+ btContactManifoldCachedInfo& cachedInfo = cachedInfoArray[iManifold];
+ cachedInfo.contactIndex = numContacts;
+ cachedInfo.rollingFrictionIndex = numRollingFrictionConstraints;
+ numContacts += cachedInfo.numTouchingContacts;
+ for (int i = 0; i < cachedInfo.numTouchingContacts; ++i)
+ {
+ if (cachedInfo.contactHasRollingFriction[i])
+ {
+ numRollingFrictionConstraints += 3;
+ }
+ }
+ }
+ {
+ BT_PROFILE("allocPools");
+ if (m_tmpSolverContactConstraintPool.capacity() < numContacts)
+ {
+ // if we need to reallocate, reserve some extra so we don't have to reallocate again next frame
+ int extraReserve = numContacts / 16;
+ m_tmpSolverContactConstraintPool.reserve(numContacts + extraReserve);
+ m_rollingFrictionIndexTable.reserve(numContacts + extraReserve);
+ m_tmpSolverContactFrictionConstraintPool.reserve((numContacts + extraReserve) * m_numFrictionDirections);
+ m_tmpSolverContactRollingFrictionConstraintPool.reserve(numRollingFrictionConstraints + extraReserve);
+ }
+ m_tmpSolverContactConstraintPool.resizeNoInitialize(numContacts);
+ m_rollingFrictionIndexTable.resizeNoInitialize(numContacts);
+ m_tmpSolverContactFrictionConstraintPool.resizeNoInitialize(numContacts * m_numFrictionDirections);
+ m_tmpSolverContactRollingFrictionConstraintPool.resizeNoInitialize(numRollingFrictionConstraints);
+ }
+ }
+ {
+ AllocContactConstraintsLoop loop(this, &cachedInfoArray[0]);
+ int grainSize = 200;
+ btParallelFor(0, numManifolds, grainSize, loop);
+ }
+}
void btSequentialImpulseConstraintSolverMt::convertContacts(btPersistentManifold** manifoldPtr, int numManifolds, const btContactSolverInfo& infoGlobal)
{
- if (!m_useBatching)
- {
- btSequentialImpulseConstraintSolver::convertContacts(manifoldPtr, numManifolds, infoGlobal);
- return;
- }
- BT_PROFILE( "convertContacts" );
- if (numManifolds > 0)
- {
- if ( m_fixedBodyId < 0 )
- {
- m_fixedBodyId = m_tmpSolverBodyPool.size();
- btSolverBody& fixedBody = m_tmpSolverBodyPool.expand();
- initSolverBody( &fixedBody, 0, infoGlobal.m_timeStep );
- }
- allocAllContactConstraints( manifoldPtr, numManifolds, infoGlobal );
- if ( m_useBatching )
- {
- setupBatchedContactConstraints();
- }
- setupAllContactConstraints( infoGlobal );
- }
+ if (!m_useBatching)
+ {
+ btSequentialImpulseConstraintSolver::convertContacts(manifoldPtr, numManifolds, infoGlobal);
+ return;
+ }
+ BT_PROFILE("convertContacts");
+ if (numManifolds > 0)
+ {
+ if (m_fixedBodyId < 0)
+ {
+ m_fixedBodyId = m_tmpSolverBodyPool.size();
+ btSolverBody& fixedBody = m_tmpSolverBodyPool.expand();
+ initSolverBody(&fixedBody, 0, infoGlobal.m_timeStep);
+ }
+ allocAllContactConstraints(manifoldPtr, numManifolds, infoGlobal);
+ if (m_useBatching)
+ {
+ setupBatchedContactConstraints();
+ }
+ setupAllContactConstraints(infoGlobal);
+ }
}
-
-void btSequentialImpulseConstraintSolverMt::internalInitMultipleJoints( btTypedConstraint** constraints, int iBegin, int iEnd )
+void btSequentialImpulseConstraintSolverMt::internalInitMultipleJoints(btTypedConstraint** constraints, int iBegin, int iEnd)
{
- BT_PROFILE("internalInitMultipleJoints");
- for ( int i = iBegin; i < iEnd; i++ )
+ BT_PROFILE("internalInitMultipleJoints");
+ for (int i = iBegin; i < iEnd; i++)
{
btTypedConstraint* constraint = constraints[i];
btTypedConstraint::btConstraintInfo1& info1 = m_tmpConstraintSizesPool[i];
if (constraint->isEnabled())
- {
- constraint->buildJacobian();
- constraint->internalSetAppliedImpulse( 0.0f );
- btJointFeedback* fb = constraint->getJointFeedback();
- if ( fb )
- {
- fb->m_appliedForceBodyA.setZero();
- fb->m_appliedTorqueBodyA.setZero();
- fb->m_appliedForceBodyB.setZero();
- fb->m_appliedTorqueBodyB.setZero();
- }
- constraint->getInfo1( &info1 );
- }
- else
+ {
+ constraint->buildJacobian();
+ constraint->internalSetAppliedImpulse(0.0f);
+ btJointFeedback* fb = constraint->getJointFeedback();
+ if (fb)
+ {
+ fb->m_appliedForceBodyA.setZero();
+ fb->m_appliedTorqueBodyA.setZero();
+ fb->m_appliedForceBodyB.setZero();
+ fb->m_appliedTorqueBodyB.setZero();
+ }
+ constraint->getInfo1(&info1);
+ }
+ else
{
info1.m_numConstraintRows = 0;
info1.nub = 0;
@@ -646,158 +624,151 @@ void btSequentialImpulseConstraintSolverMt::internalInitMultipleJoints( btTypedC
}
}
-
struct InitJointsLoop : public btIParallelForBody
{
- btSequentialImpulseConstraintSolverMt* m_solver;
- btTypedConstraint** m_constraints;
-
- InitJointsLoop( btSequentialImpulseConstraintSolverMt* solver, btTypedConstraint** constraints )
- {
- m_solver = solver;
- m_constraints = constraints;
- }
- void forLoop( int iBegin, int iEnd ) const BT_OVERRIDE
- {
- m_solver->internalInitMultipleJoints( m_constraints, iBegin, iEnd );
- }
-};
+ btSequentialImpulseConstraintSolverMt* m_solver;
+ btTypedConstraint** m_constraints;
+ InitJointsLoop(btSequentialImpulseConstraintSolverMt* solver, btTypedConstraint** constraints)
+ {
+ m_solver = solver;
+ m_constraints = constraints;
+ }
+ void forLoop(int iBegin, int iEnd) const BT_OVERRIDE
+ {
+ m_solver->internalInitMultipleJoints(m_constraints, iBegin, iEnd);
+ }
+};
-void btSequentialImpulseConstraintSolverMt::internalConvertMultipleJoints( const btAlignedObjectArray<JointParams>& jointParamsArray, btTypedConstraint** constraints, int iBegin, int iEnd, const btContactSolverInfo& infoGlobal )
+void btSequentialImpulseConstraintSolverMt::internalConvertMultipleJoints(const btAlignedObjectArray<JointParams>& jointParamsArray, btTypedConstraint** constraints, int iBegin, int iEnd, const btContactSolverInfo& infoGlobal)
{
- BT_PROFILE("internalConvertMultipleJoints");
- for ( int i = iBegin; i < iEnd; ++i )
- {
- const JointParams& jointParams = jointParamsArray[ i ];
- int currentRow = jointParams.m_solverConstraint;
- if ( currentRow != -1 )
- {
- const btTypedConstraint::btConstraintInfo1& info1 = m_tmpConstraintSizesPool[ i ];
- btAssert( currentRow < m_tmpSolverNonContactConstraintPool.size() );
- btAssert( info1.m_numConstraintRows > 0 );
-
- btSolverConstraint* currentConstraintRow = &m_tmpSolverNonContactConstraintPool[ currentRow ];
- btTypedConstraint* constraint = constraints[ i ];
-
- convertJoint( currentConstraintRow, constraint, info1, jointParams.m_solverBodyA, jointParams.m_solverBodyB, infoGlobal );
- }
- }
-}
+ BT_PROFILE("internalConvertMultipleJoints");
+ for (int i = iBegin; i < iEnd; ++i)
+ {
+ const JointParams& jointParams = jointParamsArray[i];
+ int currentRow = jointParams.m_solverConstraint;
+ if (currentRow != -1)
+ {
+ const btTypedConstraint::btConstraintInfo1& info1 = m_tmpConstraintSizesPool[i];
+ btAssert(currentRow < m_tmpSolverNonContactConstraintPool.size());
+ btAssert(info1.m_numConstraintRows > 0);
+
+ btSolverConstraint* currentConstraintRow = &m_tmpSolverNonContactConstraintPool[currentRow];
+ btTypedConstraint* constraint = constraints[i];
+ convertJoint(currentConstraintRow, constraint, info1, jointParams.m_solverBodyA, jointParams.m_solverBodyB, infoGlobal);
+ }
+ }
+}
struct ConvertJointsLoop : public btIParallelForBody
{
- btSequentialImpulseConstraintSolverMt* m_solver;
- const btAlignedObjectArray<btSequentialImpulseConstraintSolverMt::JointParams>& m_jointParamsArray;
- btTypedConstraint** m_srcConstraints;
- const btContactSolverInfo& m_infoGlobal;
-
- ConvertJointsLoop( btSequentialImpulseConstraintSolverMt* solver,
- const btAlignedObjectArray<btSequentialImpulseConstraintSolverMt::JointParams>& jointParamsArray,
- btTypedConstraint** srcConstraints,
- const btContactSolverInfo& infoGlobal
- ) :
- m_jointParamsArray(jointParamsArray),
- m_infoGlobal(infoGlobal)
- {
- m_solver = solver;
- m_srcConstraints = srcConstraints;
- }
- void forLoop( int iBegin, int iEnd ) const BT_OVERRIDE
- {
- m_solver->internalConvertMultipleJoints( m_jointParamsArray, m_srcConstraints, iBegin, iEnd, m_infoGlobal );
- }
+ btSequentialImpulseConstraintSolverMt* m_solver;
+ const btAlignedObjectArray<btSequentialImpulseConstraintSolverMt::JointParams>& m_jointParamsArray;
+ btTypedConstraint** m_srcConstraints;
+ const btContactSolverInfo& m_infoGlobal;
+
+ ConvertJointsLoop(btSequentialImpulseConstraintSolverMt* solver,
+ const btAlignedObjectArray<btSequentialImpulseConstraintSolverMt::JointParams>& jointParamsArray,
+ btTypedConstraint** srcConstraints,
+ const btContactSolverInfo& infoGlobal) : m_jointParamsArray(jointParamsArray),
+ m_infoGlobal(infoGlobal)
+ {
+ m_solver = solver;
+ m_srcConstraints = srcConstraints;
+ }
+ void forLoop(int iBegin, int iEnd) const BT_OVERRIDE
+ {
+ m_solver->internalConvertMultipleJoints(m_jointParamsArray, m_srcConstraints, iBegin, iEnd, m_infoGlobal);
+ }
};
-
void btSequentialImpulseConstraintSolverMt::convertJoints(btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal)
{
- if ( !m_useBatching )
- {
- btSequentialImpulseConstraintSolver::convertJoints(constraints, numConstraints, infoGlobal);
- return;
- }
- BT_PROFILE("convertJoints");
- bool parallelJointSetup = true;
+ if (!m_useBatching)
+ {
+ btSequentialImpulseConstraintSolver::convertJoints(constraints, numConstraints, infoGlobal);
+ return;
+ }
+ BT_PROFILE("convertJoints");
+ bool parallelJointSetup = true;
m_tmpConstraintSizesPool.resizeNoInitialize(numConstraints);
- if (parallelJointSetup)
- {
- InitJointsLoop loop(this, constraints);
- int grainSize = 40;
- btParallelFor(0, numConstraints, grainSize, loop);
- }
- else
- {
- internalInitMultipleJoints( constraints, 0, numConstraints );
- }
+ if (parallelJointSetup)
+ {
+ InitJointsLoop loop(this, constraints);
+ int grainSize = 40;
+ btParallelFor(0, numConstraints, grainSize, loop);
+ }
+ else
+ {
+ internalInitMultipleJoints(constraints, 0, numConstraints);
+ }
int totalNumRows = 0;
- btAlignedObjectArray<JointParams> jointParamsArray;
- jointParamsArray.resizeNoInitialize(numConstraints);
+ btAlignedObjectArray<JointParams> jointParamsArray;
+ jointParamsArray.resizeNoInitialize(numConstraints);
//calculate the total number of contraint rows
- for (int i=0;i<numConstraints;i++)
+ for (int i = 0; i < numConstraints; i++)
{
- btTypedConstraint* constraint = constraints[ i ];
+ btTypedConstraint* constraint = constraints[i];
- JointParams& params = jointParamsArray[ i ];
+ JointParams& params = jointParamsArray[i];
const btTypedConstraint::btConstraintInfo1& info1 = m_tmpConstraintSizesPool[i];
if (info1.m_numConstraintRows)
{
- params.m_solverConstraint = totalNumRows;
- params.m_solverBodyA = getOrInitSolverBody( constraint->getRigidBodyA(), infoGlobal.m_timeStep );
- params.m_solverBodyB = getOrInitSolverBody( constraint->getRigidBodyB(), infoGlobal.m_timeStep );
+ params.m_solverConstraint = totalNumRows;
+ params.m_solverBodyA = getOrInitSolverBody(constraint->getRigidBodyA(), infoGlobal.m_timeStep);
+ params.m_solverBodyB = getOrInitSolverBody(constraint->getRigidBodyB(), infoGlobal.m_timeStep);
}
- else
+ else
{
- params.m_solverConstraint = -1;
+ params.m_solverConstraint = -1;
}
totalNumRows += info1.m_numConstraintRows;
}
m_tmpSolverNonContactConstraintPool.resizeNoInitialize(totalNumRows);
///setup the btSolverConstraints
- if ( parallelJointSetup )
- {
- ConvertJointsLoop loop(this, jointParamsArray, constraints, infoGlobal);
- int grainSize = 20;
- btParallelFor(0, numConstraints, grainSize, loop);
- }
- else
- {
- internalConvertMultipleJoints( jointParamsArray, constraints, 0, numConstraints, infoGlobal );
- }
- setupBatchedJointConstraints();
+ if (parallelJointSetup)
+ {
+ ConvertJointsLoop loop(this, jointParamsArray, constraints, infoGlobal);
+ int grainSize = 20;
+ btParallelFor(0, numConstraints, grainSize, loop);
+ }
+ else
+ {
+ internalConvertMultipleJoints(jointParamsArray, constraints, 0, numConstraints, infoGlobal);
+ }
+ setupBatchedJointConstraints();
}
-
void btSequentialImpulseConstraintSolverMt::internalConvertBodies(btCollisionObject** bodies, int iBegin, int iEnd, const btContactSolverInfo& infoGlobal)
{
- BT_PROFILE("internalConvertBodies");
- for (int i=iBegin; i < iEnd; i++)
+ BT_PROFILE("internalConvertBodies");
+ for (int i = iBegin; i < iEnd; i++)
{
- btCollisionObject* obj = bodies[i];
+ btCollisionObject* obj = bodies[i];
obj->setCompanionId(i);
btSolverBody& solverBody = m_tmpSolverBodyPool[i];
- initSolverBody(&solverBody, obj, infoGlobal.m_timeStep);
+ initSolverBody(&solverBody, obj, infoGlobal.m_timeStep);
btRigidBody* body = btRigidBody::upcast(obj);
if (body && body->getInvMass())
{
- btVector3 gyroForce (0,0,0);
- if (body->getFlags()&BT_ENABLE_GYROSCOPIC_FORCE_EXPLICIT)
+ btVector3 gyroForce(0, 0, 0);
+ if (body->getFlags() & BT_ENABLE_GYROSCOPIC_FORCE_EXPLICIT)
{
gyroForce = body->computeGyroscopicForceExplicit(infoGlobal.m_maxGyroscopicForce);
- solverBody.m_externalTorqueImpulse -= gyroForce*body->getInvInertiaTensorWorld()*infoGlobal.m_timeStep;
+ solverBody.m_externalTorqueImpulse -= gyroForce * body->getInvInertiaTensorWorld() * infoGlobal.m_timeStep;
}
- if (body->getFlags()&BT_ENABLE_GYROSCOPIC_FORCE_IMPLICIT_WORLD)
+ if (body->getFlags() & BT_ENABLE_GYROSCOPIC_FORCE_IMPLICIT_WORLD)
{
gyroForce = body->computeGyroscopicImpulseImplicit_World(infoGlobal.m_timeStep);
solverBody.m_externalTorqueImpulse += gyroForce;
}
- if (body->getFlags()&BT_ENABLE_GYROSCOPIC_FORCE_IMPLICIT_BODY)
+ if (body->getFlags() & BT_ENABLE_GYROSCOPIC_FORCE_IMPLICIT_BODY)
{
gyroForce = body->computeGyroscopicImpulseImplicit_Body(infoGlobal.m_timeStep);
solverBody.m_externalTorqueImpulse += gyroForce;
@@ -806,809 +777,772 @@ void btSequentialImpulseConstraintSolverMt::internalConvertBodies(btCollisionObj
}
}
-
struct ConvertBodiesLoop : public btIParallelForBody
{
- btSequentialImpulseConstraintSolverMt* m_solver;
- btCollisionObject** m_bodies;
- int m_numBodies;
- const btContactSolverInfo& m_infoGlobal;
-
- ConvertBodiesLoop( btSequentialImpulseConstraintSolverMt* solver,
- btCollisionObject** bodies,
- int numBodies,
- const btContactSolverInfo& infoGlobal
- ) :
- m_infoGlobal(infoGlobal)
- {
- m_solver = solver;
- m_bodies = bodies;
- m_numBodies = numBodies;
- }
- void forLoop( int iBegin, int iEnd ) const BT_OVERRIDE
- {
- m_solver->internalConvertBodies( m_bodies, iBegin, iEnd, m_infoGlobal );
- }
+ btSequentialImpulseConstraintSolverMt* m_solver;
+ btCollisionObject** m_bodies;
+ int m_numBodies;
+ const btContactSolverInfo& m_infoGlobal;
+
+ ConvertBodiesLoop(btSequentialImpulseConstraintSolverMt* solver,
+ btCollisionObject** bodies,
+ int numBodies,
+ const btContactSolverInfo& infoGlobal) : m_infoGlobal(infoGlobal)
+ {
+ m_solver = solver;
+ m_bodies = bodies;
+ m_numBodies = numBodies;
+ }
+ void forLoop(int iBegin, int iEnd) const BT_OVERRIDE
+ {
+ m_solver->internalConvertBodies(m_bodies, iBegin, iEnd, m_infoGlobal);
+ }
};
-
void btSequentialImpulseConstraintSolverMt::convertBodies(btCollisionObject** bodies, int numBodies, const btContactSolverInfo& infoGlobal)
{
- BT_PROFILE("convertBodies");
- m_kinematicBodyUniqueIdToSolverBodyTable.resize( 0 );
-
- m_tmpSolverBodyPool.resizeNoInitialize(numBodies+1);
-
- m_fixedBodyId = numBodies;
- {
- btSolverBody& fixedBody = m_tmpSolverBodyPool[ m_fixedBodyId ];
- initSolverBody( &fixedBody, NULL, infoGlobal.m_timeStep );
- }
-
- bool parallelBodySetup = true;
- if (parallelBodySetup)
- {
- ConvertBodiesLoop loop(this, bodies, numBodies, infoGlobal);
- int grainSize = 40;
- btParallelFor(0, numBodies, grainSize, loop);
- }
- else
- {
- internalConvertBodies( bodies, 0, numBodies, infoGlobal );
- }
-}
+ BT_PROFILE("convertBodies");
+ m_kinematicBodyUniqueIdToSolverBodyTable.resize(0);
+ m_tmpSolverBodyPool.resizeNoInitialize(numBodies + 1);
+
+ m_fixedBodyId = numBodies;
+ {
+ btSolverBody& fixedBody = m_tmpSolverBodyPool[m_fixedBodyId];
+ initSolverBody(&fixedBody, NULL, infoGlobal.m_timeStep);
+ }
+
+ bool parallelBodySetup = true;
+ if (parallelBodySetup)
+ {
+ ConvertBodiesLoop loop(this, bodies, numBodies, infoGlobal);
+ int grainSize = 40;
+ btParallelFor(0, numBodies, grainSize, loop);
+ }
+ else
+ {
+ internalConvertBodies(bodies, 0, numBodies, infoGlobal);
+ }
+}
btScalar btSequentialImpulseConstraintSolverMt::solveGroupCacheFriendlySetup(
- btCollisionObject** bodies,
- int numBodies,
- btPersistentManifold** manifoldPtr,
- int numManifolds,
- btTypedConstraint** constraints,
- int numConstraints,
- const btContactSolverInfo& infoGlobal,
- btIDebugDraw* debugDrawer
- )
+ btCollisionObject** bodies,
+ int numBodies,
+ btPersistentManifold** manifoldPtr,
+ int numManifolds,
+ btTypedConstraint** constraints,
+ int numConstraints,
+ const btContactSolverInfo& infoGlobal,
+ btIDebugDraw* debugDrawer)
{
- m_numFrictionDirections = (infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS) ? 2 : 1;
- m_useBatching = false;
- if ( numManifolds >= s_minimumContactManifoldsForBatching &&
- (s_allowNestedParallelForLoops || !btThreadsAreRunning())
- )
- {
- m_useBatching = true;
- m_batchedContactConstraints.m_debugDrawer = debugDrawer;
- m_batchedJointConstraints.m_debugDrawer = debugDrawer;
- }
- btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup( bodies,
- numBodies,
- manifoldPtr,
- numManifolds,
- constraints,
- numConstraints,
- infoGlobal,
- debugDrawer
- );
- return 0.0f;
+ m_numFrictionDirections = (infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS) ? 2 : 1;
+ m_useBatching = false;
+ if (numManifolds >= s_minimumContactManifoldsForBatching &&
+ (s_allowNestedParallelForLoops || !btThreadsAreRunning()))
+ {
+ m_useBatching = true;
+ m_batchedContactConstraints.m_debugDrawer = debugDrawer;
+ m_batchedJointConstraints.m_debugDrawer = debugDrawer;
+ }
+ btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(bodies,
+ numBodies,
+ manifoldPtr,
+ numManifolds,
+ constraints,
+ numConstraints,
+ infoGlobal,
+ debugDrawer);
+ return 0.0f;
}
-
-btScalar btSequentialImpulseConstraintSolverMt::resolveMultipleContactSplitPenetrationImpulseConstraints( const btAlignedObjectArray<int>& consIndices, int batchBegin, int batchEnd )
+btScalar btSequentialImpulseConstraintSolverMt::resolveMultipleContactSplitPenetrationImpulseConstraints(const btAlignedObjectArray<int>& consIndices, int batchBegin, int batchEnd)
{
- btScalar leastSquaresResidual = 0.f;
- for ( int iiCons = batchBegin; iiCons < batchEnd; ++iiCons )
- {
- int iCons = consIndices[ iiCons ];
- const btSolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[ iCons ];
- btSolverBody& bodyA = m_tmpSolverBodyPool[ solveManifold.m_solverBodyIdA ];
- btSolverBody& bodyB = m_tmpSolverBodyPool[ solveManifold.m_solverBodyIdB ];
- btScalar residual = resolveSplitPenetrationImpulse( bodyA, bodyB, solveManifold );
- leastSquaresResidual += residual*residual;
- }
- return leastSquaresResidual;
+ btScalar leastSquaresResidual = 0.f;
+ for (int iiCons = batchBegin; iiCons < batchEnd; ++iiCons)
+ {
+ int iCons = consIndices[iiCons];
+ const btSolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[iCons];
+ btSolverBody& bodyA = m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA];
+ btSolverBody& bodyB = m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB];
+ btScalar residual = resolveSplitPenetrationImpulse(bodyA, bodyB, solveManifold);
+ leastSquaresResidual += residual * residual;
+ }
+ return leastSquaresResidual;
}
-
struct ContactSplitPenetrationImpulseSolverLoop : public btIParallelSumBody
{
- btSequentialImpulseConstraintSolverMt* m_solver;
- const btBatchedConstraints* m_bc;
-
- ContactSplitPenetrationImpulseSolverLoop( btSequentialImpulseConstraintSolverMt* solver, const btBatchedConstraints* bc )
- {
- m_solver = solver;
- m_bc = bc;
- }
- btScalar sumLoop( int iBegin, int iEnd ) const BT_OVERRIDE
- {
- BT_PROFILE( "ContactSplitPenetrationImpulseSolverLoop" );
- btScalar sum = 0;
- for ( int iBatch = iBegin; iBatch < iEnd; ++iBatch )
- {
- const btBatchedConstraints::Range& batch = m_bc->m_batches[ iBatch ];
- sum += m_solver->resolveMultipleContactSplitPenetrationImpulseConstraints( m_bc->m_constraintIndices, batch.begin, batch.end );
- }
- return sum;
- }
-};
+ btSequentialImpulseConstraintSolverMt* m_solver;
+ const btBatchedConstraints* m_bc;
+ ContactSplitPenetrationImpulseSolverLoop(btSequentialImpulseConstraintSolverMt* solver, const btBatchedConstraints* bc)
+ {
+ m_solver = solver;
+ m_bc = bc;
+ }
+ btScalar sumLoop(int iBegin, int iEnd) const BT_OVERRIDE
+ {
+ BT_PROFILE("ContactSplitPenetrationImpulseSolverLoop");
+ btScalar sum = 0;
+ for (int iBatch = iBegin; iBatch < iEnd; ++iBatch)
+ {
+ const btBatchedConstraints::Range& batch = m_bc->m_batches[iBatch];
+ sum += m_solver->resolveMultipleContactSplitPenetrationImpulseConstraints(m_bc->m_constraintIndices, batch.begin, batch.end);
+ }
+ return sum;
+ }
+};
-void btSequentialImpulseConstraintSolverMt::solveGroupCacheFriendlySplitImpulseIterations(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer)
+void btSequentialImpulseConstraintSolverMt::solveGroupCacheFriendlySplitImpulseIterations(btCollisionObject** bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer)
{
BT_PROFILE("solveGroupCacheFriendlySplitImpulseIterations");
if (infoGlobal.m_splitImpulse)
{
- for ( int iteration = 0; iteration < infoGlobal.m_numIterations; iteration++ )
- {
- btScalar leastSquaresResidual = 0.f;
- if (m_useBatching)
- {
- const btBatchedConstraints& batchedCons = m_batchedContactConstraints;
- ContactSplitPenetrationImpulseSolverLoop loop( this, &batchedCons );
- btScalar leastSquaresResidual = 0.f;
- for ( int iiPhase = 0; iiPhase < batchedCons.m_phases.size(); ++iiPhase )
- {
- int iPhase = batchedCons.m_phaseOrder[ iiPhase ];
- const btBatchedConstraints::Range& phase = batchedCons.m_phases[ iPhase ];
- int grainSize = batchedCons.m_phaseGrainSize[iPhase];
- leastSquaresResidual += btParallelSum( phase.begin, phase.end, grainSize, loop );
- }
- }
- else
- {
- // non-batched
- leastSquaresResidual = resolveMultipleContactSplitPenetrationImpulseConstraints(m_orderTmpConstraintPool, 0, m_tmpSolverContactConstraintPool.size());
- }
- if ( leastSquaresResidual <= infoGlobal.m_leastSquaresResidualThreshold || iteration >= ( infoGlobal.m_numIterations - 1 ) )
- {
+ for (int iteration = 0; iteration < infoGlobal.m_numIterations; iteration++)
+ {
+ btScalar leastSquaresResidual = 0.f;
+ if (m_useBatching)
+ {
+ const btBatchedConstraints& batchedCons = m_batchedContactConstraints;
+ ContactSplitPenetrationImpulseSolverLoop loop(this, &batchedCons);
+ btScalar leastSquaresResidual = 0.f;
+ for (int iiPhase = 0; iiPhase < batchedCons.m_phases.size(); ++iiPhase)
+ {
+ int iPhase = batchedCons.m_phaseOrder[iiPhase];
+ const btBatchedConstraints::Range& phase = batchedCons.m_phases[iPhase];
+ int grainSize = batchedCons.m_phaseGrainSize[iPhase];
+ leastSquaresResidual += btParallelSum(phase.begin, phase.end, grainSize, loop);
+ }
+ }
+ else
+ {
+ // non-batched
+ leastSquaresResidual = resolveMultipleContactSplitPenetrationImpulseConstraints(m_orderTmpConstraintPool, 0, m_tmpSolverContactConstraintPool.size());
+ }
+ if (leastSquaresResidual <= infoGlobal.m_leastSquaresResidualThreshold || iteration >= (infoGlobal.m_numIterations - 1))
+ {
#ifdef VERBOSE_RESIDUAL_PRINTF
- printf( "residual = %f at iteration #%d\n", leastSquaresResidual, iteration );
+ printf("residual = %f at iteration #%d\n", leastSquaresResidual, iteration);
#endif
- break;
- }
- }
+ break;
+ }
+ }
}
}
-
-btScalar btSequentialImpulseConstraintSolverMt::solveSingleIteration(int iteration, btCollisionObject** bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer)
+btScalar btSequentialImpulseConstraintSolverMt::solveSingleIteration(int iteration, btCollisionObject** bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer)
{
- if ( !m_useBatching )
- {
- return btSequentialImpulseConstraintSolver::solveSingleIteration( iteration, bodies, numBodies, manifoldPtr, numManifolds, constraints, numConstraints, infoGlobal, debugDrawer );
- }
- BT_PROFILE( "solveSingleIterationMt" );
- btScalar leastSquaresResidual = 0.f;
+ if (!m_useBatching)
+ {
+ return btSequentialImpulseConstraintSolver::solveSingleIteration(iteration, bodies, numBodies, manifoldPtr, numManifolds, constraints, numConstraints, infoGlobal, debugDrawer);
+ }
+ BT_PROFILE("solveSingleIterationMt");
+ btScalar leastSquaresResidual = 0.f;
if (infoGlobal.m_solverMode & SOLVER_RANDMIZE_ORDER)
{
- if (1) // uncomment this for a bit less random ((iteration & 7) == 0)
+ if (1) // uncomment this for a bit less random ((iteration & 7) == 0)
{
- randomizeConstraintOrdering(iteration, infoGlobal.m_numIterations);
+ randomizeConstraintOrdering(iteration, infoGlobal.m_numIterations);
}
}
{
///solve all joint constraints
- leastSquaresResidual += resolveAllJointConstraints(iteration);
+ leastSquaresResidual += resolveAllJointConstraints(iteration);
- if (iteration< infoGlobal.m_numIterations)
+ if (iteration < infoGlobal.m_numIterations)
{
- // this loop is only used for cone-twist constraints,
- // it would be nice to skip this loop if none of the constraints need it
- if ( m_useObsoleteJointConstraints )
- {
- for ( int j = 0; j<numConstraints; j++ )
- {
- if ( constraints[ j ]->isEnabled() )
- {
- int bodyAid = getOrInitSolverBody( constraints[ j ]->getRigidBodyA(), infoGlobal.m_timeStep );
- int bodyBid = getOrInitSolverBody( constraints[ j ]->getRigidBodyB(), infoGlobal.m_timeStep );
- btSolverBody& bodyA = m_tmpSolverBodyPool[ bodyAid ];
- btSolverBody& bodyB = m_tmpSolverBodyPool[ bodyBid ];
- constraints[ j ]->solveConstraintObsolete( bodyA, bodyB, infoGlobal.m_timeStep );
- }
- }
- }
+ // this loop is only used for cone-twist constraints,
+ // it would be nice to skip this loop if none of the constraints need it
+ if (m_useObsoleteJointConstraints)
+ {
+ for (int j = 0; j < numConstraints; j++)
+ {
+ if (constraints[j]->isEnabled())
+ {
+ int bodyAid = getOrInitSolverBody(constraints[j]->getRigidBodyA(), infoGlobal.m_timeStep);
+ int bodyBid = getOrInitSolverBody(constraints[j]->getRigidBodyB(), infoGlobal.m_timeStep);
+ btSolverBody& bodyA = m_tmpSolverBodyPool[bodyAid];
+ btSolverBody& bodyB = m_tmpSolverBodyPool[bodyBid];
+ constraints[j]->solveConstraintObsolete(bodyA, bodyB, infoGlobal.m_timeStep);
+ }
+ }
+ }
if (infoGlobal.m_solverMode & SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS)
{
- // solve all contact, contact-friction, and rolling friction constraints interleaved
- leastSquaresResidual += resolveAllContactConstraintsInterleaved();
+ // solve all contact, contact-friction, and rolling friction constraints interleaved
+ leastSquaresResidual += resolveAllContactConstraintsInterleaved();
}
- else//SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS
+ else //SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS
{
- // don't interleave them
+ // don't interleave them
// solve all contact constraints
- leastSquaresResidual += resolveAllContactConstraints();
+ leastSquaresResidual += resolveAllContactConstraints();
// solve all contact friction constraints
- leastSquaresResidual += resolveAllContactFrictionConstraints();
+ leastSquaresResidual += resolveAllContactFrictionConstraints();
- // solve all rolling friction constraints
- leastSquaresResidual += resolveAllRollingFrictionConstraints();
+ // solve all rolling friction constraints
+ leastSquaresResidual += resolveAllRollingFrictionConstraints();
}
}
}
- return leastSquaresResidual;
+ return leastSquaresResidual;
}
-
-btScalar btSequentialImpulseConstraintSolverMt::resolveMultipleJointConstraints( const btAlignedObjectArray<int>& consIndices, int batchBegin, int batchEnd, int iteration )
+btScalar btSequentialImpulseConstraintSolverMt::resolveMultipleJointConstraints(const btAlignedObjectArray<int>& consIndices, int batchBegin, int batchEnd, int iteration)
{
- btScalar leastSquaresResidual = 0.f;
- for ( int iiCons = batchBegin; iiCons < batchEnd; ++iiCons )
- {
- int iCons = consIndices[ iiCons ];
- const btSolverConstraint& constraint = m_tmpSolverNonContactConstraintPool[ iCons ];
- if ( iteration < constraint.m_overrideNumSolverIterations )
- {
- btSolverBody& bodyA = m_tmpSolverBodyPool[ constraint.m_solverBodyIdA ];
- btSolverBody& bodyB = m_tmpSolverBodyPool[ constraint.m_solverBodyIdB ];
- btScalar residual = resolveSingleConstraintRowGeneric( bodyA, bodyB, constraint );
- leastSquaresResidual += residual*residual;
- }
- }
- return leastSquaresResidual;
+ btScalar leastSquaresResidual = 0.f;
+ for (int iiCons = batchBegin; iiCons < batchEnd; ++iiCons)
+ {
+ int iCons = consIndices[iiCons];
+ const btSolverConstraint& constraint = m_tmpSolverNonContactConstraintPool[iCons];
+ if (iteration < constraint.m_overrideNumSolverIterations)
+ {
+ btSolverBody& bodyA = m_tmpSolverBodyPool[constraint.m_solverBodyIdA];
+ btSolverBody& bodyB = m_tmpSolverBodyPool[constraint.m_solverBodyIdB];
+ btScalar residual = resolveSingleConstraintRowGeneric(bodyA, bodyB, constraint);
+ leastSquaresResidual += residual * residual;
+ }
+ }
+ return leastSquaresResidual;
}
-
-btScalar btSequentialImpulseConstraintSolverMt::resolveMultipleContactConstraints( const btAlignedObjectArray<int>& consIndices, int batchBegin, int batchEnd )
+btScalar btSequentialImpulseConstraintSolverMt::resolveMultipleContactConstraints(const btAlignedObjectArray<int>& consIndices, int batchBegin, int batchEnd)
{
- btScalar leastSquaresResidual = 0.f;
- for ( int iiCons = batchBegin; iiCons < batchEnd; ++iiCons )
- {
- int iCons = consIndices[ iiCons ];
- const btSolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[ iCons ];
- btSolverBody& bodyA = m_tmpSolverBodyPool[ solveManifold.m_solverBodyIdA ];
- btSolverBody& bodyB = m_tmpSolverBodyPool[ solveManifold.m_solverBodyIdB ];
- btScalar residual = resolveSingleConstraintRowLowerLimit( bodyA, bodyB, solveManifold );
- leastSquaresResidual += residual*residual;
- }
- return leastSquaresResidual;
+ btScalar leastSquaresResidual = 0.f;
+ for (int iiCons = batchBegin; iiCons < batchEnd; ++iiCons)
+ {
+ int iCons = consIndices[iiCons];
+ const btSolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[iCons];
+ btSolverBody& bodyA = m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA];
+ btSolverBody& bodyB = m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB];
+ btScalar residual = resolveSingleConstraintRowLowerLimit(bodyA, bodyB, solveManifold);
+ leastSquaresResidual += residual * residual;
+ }
+ return leastSquaresResidual;
}
-
-btScalar btSequentialImpulseConstraintSolverMt::resolveMultipleContactFrictionConstraints( const btAlignedObjectArray<int>& consIndices, int batchBegin, int batchEnd )
+btScalar btSequentialImpulseConstraintSolverMt::resolveMultipleContactFrictionConstraints(const btAlignedObjectArray<int>& consIndices, int batchBegin, int batchEnd)
{
- btScalar leastSquaresResidual = 0.f;
- for ( int iiCons = batchBegin; iiCons < batchEnd; ++iiCons )
- {
- int iContact = consIndices[ iiCons ];
- btScalar totalImpulse = m_tmpSolverContactConstraintPool[ iContact ].m_appliedImpulse;
-
- // apply sliding friction
- if ( totalImpulse > 0.0f )
- {
- int iBegin = iContact * m_numFrictionDirections;
- int iEnd = iBegin + m_numFrictionDirections;
- for ( int iFriction = iBegin; iFriction < iEnd; ++iFriction )
- {
- btSolverConstraint& solveManifold = m_tmpSolverContactFrictionConstraintPool[ iFriction++ ];
- btAssert( solveManifold.m_frictionIndex == iContact );
-
- solveManifold.m_lowerLimit = -( solveManifold.m_friction*totalImpulse );
- solveManifold.m_upperLimit = solveManifold.m_friction*totalImpulse;
-
- btSolverBody& bodyA = m_tmpSolverBodyPool[ solveManifold.m_solverBodyIdA ];
- btSolverBody& bodyB = m_tmpSolverBodyPool[ solveManifold.m_solverBodyIdB ];
- btScalar residual = resolveSingleConstraintRowGeneric( bodyA, bodyB, solveManifold );
- leastSquaresResidual += residual*residual;
- }
- }
- }
- return leastSquaresResidual;
-}
+ btScalar leastSquaresResidual = 0.f;
+ for (int iiCons = batchBegin; iiCons < batchEnd; ++iiCons)
+ {
+ int iContact = consIndices[iiCons];
+ btScalar totalImpulse = m_tmpSolverContactConstraintPool[iContact].m_appliedImpulse;
+ // apply sliding friction
+ if (totalImpulse > 0.0f)
+ {
+ int iBegin = iContact * m_numFrictionDirections;
+ int iEnd = iBegin + m_numFrictionDirections;
+ for (int iFriction = iBegin; iFriction < iEnd; ++iFriction)
+ {
+ btSolverConstraint& solveManifold = m_tmpSolverContactFrictionConstraintPool[iFriction++];
+ btAssert(solveManifold.m_frictionIndex == iContact);
-btScalar btSequentialImpulseConstraintSolverMt::resolveMultipleContactRollingFrictionConstraints( const btAlignedObjectArray<int>& consIndices, int batchBegin, int batchEnd )
-{
- btScalar leastSquaresResidual = 0.f;
- for ( int iiCons = batchBegin; iiCons < batchEnd; ++iiCons )
- {
- int iContact = consIndices[ iiCons ];
- int iFirstRollingFriction = m_rollingFrictionIndexTable[ iContact ];
- if ( iFirstRollingFriction >= 0 )
- {
- btScalar totalImpulse = m_tmpSolverContactConstraintPool[ iContact ].m_appliedImpulse;
- // apply rolling friction
- if ( totalImpulse > 0.0f )
- {
- int iBegin = iFirstRollingFriction;
- int iEnd = iBegin + 3;
- for ( int iRollingFric = iBegin; iRollingFric < iEnd; ++iRollingFric )
- {
- btSolverConstraint& rollingFrictionConstraint = m_tmpSolverContactRollingFrictionConstraintPool[ iRollingFric ];
- if ( rollingFrictionConstraint.m_frictionIndex != iContact )
- {
- break;
- }
- btScalar rollingFrictionMagnitude = rollingFrictionConstraint.m_friction*totalImpulse;
- if ( rollingFrictionMagnitude > rollingFrictionConstraint.m_friction )
- {
- rollingFrictionMagnitude = rollingFrictionConstraint.m_friction;
- }
-
- rollingFrictionConstraint.m_lowerLimit = -rollingFrictionMagnitude;
- rollingFrictionConstraint.m_upperLimit = rollingFrictionMagnitude;
-
- btScalar residual = resolveSingleConstraintRowGeneric( m_tmpSolverBodyPool[ rollingFrictionConstraint.m_solverBodyIdA ], m_tmpSolverBodyPool[ rollingFrictionConstraint.m_solverBodyIdB ], rollingFrictionConstraint );
- leastSquaresResidual += residual*residual;
- }
- }
- }
- }
- return leastSquaresResidual;
-}
+ solveManifold.m_lowerLimit = -(solveManifold.m_friction * totalImpulse);
+ solveManifold.m_upperLimit = solveManifold.m_friction * totalImpulse;
+ btSolverBody& bodyA = m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA];
+ btSolverBody& bodyB = m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB];
+ btScalar residual = resolveSingleConstraintRowGeneric(bodyA, bodyB, solveManifold);
+ leastSquaresResidual += residual * residual;
+ }
+ }
+ }
+ return leastSquaresResidual;
+}
-btScalar btSequentialImpulseConstraintSolverMt::resolveMultipleContactConstraintsInterleaved( const btAlignedObjectArray<int>& contactIndices,
- int batchBegin,
- int batchEnd
- )
+btScalar btSequentialImpulseConstraintSolverMt::resolveMultipleContactRollingFrictionConstraints(const btAlignedObjectArray<int>& consIndices, int batchBegin, int batchEnd)
{
- btScalar leastSquaresResidual = 0.f;
- int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
-
- for ( int iiCons = batchBegin; iiCons < batchEnd; iiCons++ )
- {
- btScalar totalImpulse = 0;
- int iContact = contactIndices[ iiCons ];
- // apply penetration constraint
- {
- const btSolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[ iContact ];
- btScalar residual = resolveSingleConstraintRowLowerLimit( m_tmpSolverBodyPool[ solveManifold.m_solverBodyIdA ], m_tmpSolverBodyPool[ solveManifold.m_solverBodyIdB ], solveManifold );
- leastSquaresResidual += residual*residual;
- totalImpulse = solveManifold.m_appliedImpulse;
- }
-
- // apply sliding friction
- if ( totalImpulse > 0.0f )
- {
- int iBegin = iContact * m_numFrictionDirections;
- int iEnd = iBegin + m_numFrictionDirections;
- for ( int iFriction = iBegin; iFriction < iEnd; ++iFriction )
- {
- btSolverConstraint& solveManifold = m_tmpSolverContactFrictionConstraintPool[ iFriction ];
- btAssert( solveManifold.m_frictionIndex == iContact );
-
- solveManifold.m_lowerLimit = -( solveManifold.m_friction*totalImpulse );
- solveManifold.m_upperLimit = solveManifold.m_friction*totalImpulse;
-
- btSolverBody& bodyA = m_tmpSolverBodyPool[ solveManifold.m_solverBodyIdA ];
- btSolverBody& bodyB = m_tmpSolverBodyPool[ solveManifold.m_solverBodyIdB ];
- btScalar residual = resolveSingleConstraintRowGeneric( bodyA, bodyB, solveManifold );
- leastSquaresResidual += residual*residual;
- }
- }
-
- // apply rolling friction
- int iFirstRollingFriction = m_rollingFrictionIndexTable[ iContact ];
- if ( totalImpulse > 0.0f && iFirstRollingFriction >= 0)
- {
- int iBegin = iFirstRollingFriction;
- int iEnd = iBegin + 3;
- for ( int iRollingFric = iBegin; iRollingFric < iEnd; ++iRollingFric )
- {
- btSolverConstraint& rollingFrictionConstraint = m_tmpSolverContactRollingFrictionConstraintPool[ iRollingFric ];
- if ( rollingFrictionConstraint.m_frictionIndex != iContact )
- {
- break;
- }
- btScalar rollingFrictionMagnitude = rollingFrictionConstraint.m_friction*totalImpulse;
- if ( rollingFrictionMagnitude > rollingFrictionConstraint.m_friction )
- {
- rollingFrictionMagnitude = rollingFrictionConstraint.m_friction;
- }
-
- rollingFrictionConstraint.m_lowerLimit = -rollingFrictionMagnitude;
- rollingFrictionConstraint.m_upperLimit = rollingFrictionMagnitude;
-
- btScalar residual = resolveSingleConstraintRowGeneric( m_tmpSolverBodyPool[ rollingFrictionConstraint.m_solverBodyIdA ], m_tmpSolverBodyPool[ rollingFrictionConstraint.m_solverBodyIdB ], rollingFrictionConstraint );
- leastSquaresResidual += residual*residual;
- }
- }
- }
- return leastSquaresResidual;
+ btScalar leastSquaresResidual = 0.f;
+ for (int iiCons = batchBegin; iiCons < batchEnd; ++iiCons)
+ {
+ int iContact = consIndices[iiCons];
+ int iFirstRollingFriction = m_rollingFrictionIndexTable[iContact];
+ if (iFirstRollingFriction >= 0)
+ {
+ btScalar totalImpulse = m_tmpSolverContactConstraintPool[iContact].m_appliedImpulse;
+ // apply rolling friction
+ if (totalImpulse > 0.0f)
+ {
+ int iBegin = iFirstRollingFriction;
+ int iEnd = iBegin + 3;
+ for (int iRollingFric = iBegin; iRollingFric < iEnd; ++iRollingFric)
+ {
+ btSolverConstraint& rollingFrictionConstraint = m_tmpSolverContactRollingFrictionConstraintPool[iRollingFric];
+ if (rollingFrictionConstraint.m_frictionIndex != iContact)
+ {
+ break;
+ }
+ btScalar rollingFrictionMagnitude = rollingFrictionConstraint.m_friction * totalImpulse;
+ if (rollingFrictionMagnitude > rollingFrictionConstraint.m_friction)
+ {
+ rollingFrictionMagnitude = rollingFrictionConstraint.m_friction;
+ }
+
+ rollingFrictionConstraint.m_lowerLimit = -rollingFrictionMagnitude;
+ rollingFrictionConstraint.m_upperLimit = rollingFrictionMagnitude;
+
+ btScalar residual = resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[rollingFrictionConstraint.m_solverBodyIdA], m_tmpSolverBodyPool[rollingFrictionConstraint.m_solverBodyIdB], rollingFrictionConstraint);
+ leastSquaresResidual += residual * residual;
+ }
+ }
+ }
+ }
+ return leastSquaresResidual;
}
-
-void btSequentialImpulseConstraintSolverMt::randomizeBatchedConstraintOrdering( btBatchedConstraints* batchedConstraints )
+btScalar btSequentialImpulseConstraintSolverMt::resolveMultipleContactConstraintsInterleaved(const btAlignedObjectArray<int>& contactIndices,
+ int batchBegin,
+ int batchEnd)
{
- btBatchedConstraints& bc = *batchedConstraints;
- // randomize ordering of phases
- for ( int ii = 1; ii < bc.m_phaseOrder.size(); ++ii )
- {
- int iSwap = btRandInt2( ii + 1 );
- bc.m_phaseOrder.swap( ii, iSwap );
- }
-
- // for each batch,
- for ( int iBatch = 0; iBatch < bc.m_batches.size(); ++iBatch )
- {
- // randomize ordering of constraints within the batch
- const btBatchedConstraints::Range& batch = bc.m_batches[ iBatch ];
- for ( int iiCons = batch.begin; iiCons < batch.end; ++iiCons )
- {
- int iSwap = batch.begin + btRandInt2( iiCons - batch.begin + 1 );
- btAssert(iSwap >= batch.begin && iSwap < batch.end);
- bc.m_constraintIndices.swap( iiCons, iSwap );
- }
- }
+ btScalar leastSquaresResidual = 0.f;
+ int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
+
+ for (int iiCons = batchBegin; iiCons < batchEnd; iiCons++)
+ {
+ btScalar totalImpulse = 0;
+ int iContact = contactIndices[iiCons];
+ // apply penetration constraint
+ {
+ const btSolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[iContact];
+ btScalar residual = resolveSingleConstraintRowLowerLimit(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA], m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB], solveManifold);
+ leastSquaresResidual += residual * residual;
+ totalImpulse = solveManifold.m_appliedImpulse;
+ }
+
+ // apply sliding friction
+ if (totalImpulse > 0.0f)
+ {
+ int iBegin = iContact * m_numFrictionDirections;
+ int iEnd = iBegin + m_numFrictionDirections;
+ for (int iFriction = iBegin; iFriction < iEnd; ++iFriction)
+ {
+ btSolverConstraint& solveManifold = m_tmpSolverContactFrictionConstraintPool[iFriction];
+ btAssert(solveManifold.m_frictionIndex == iContact);
+
+ solveManifold.m_lowerLimit = -(solveManifold.m_friction * totalImpulse);
+ solveManifold.m_upperLimit = solveManifold.m_friction * totalImpulse;
+
+ btSolverBody& bodyA = m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA];
+ btSolverBody& bodyB = m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB];
+ btScalar residual = resolveSingleConstraintRowGeneric(bodyA, bodyB, solveManifold);
+ leastSquaresResidual += residual * residual;
+ }
+ }
+
+ // apply rolling friction
+ int iFirstRollingFriction = m_rollingFrictionIndexTable[iContact];
+ if (totalImpulse > 0.0f && iFirstRollingFriction >= 0)
+ {
+ int iBegin = iFirstRollingFriction;
+ int iEnd = iBegin + 3;
+ for (int iRollingFric = iBegin; iRollingFric < iEnd; ++iRollingFric)
+ {
+ btSolverConstraint& rollingFrictionConstraint = m_tmpSolverContactRollingFrictionConstraintPool[iRollingFric];
+ if (rollingFrictionConstraint.m_frictionIndex != iContact)
+ {
+ break;
+ }
+ btScalar rollingFrictionMagnitude = rollingFrictionConstraint.m_friction * totalImpulse;
+ if (rollingFrictionMagnitude > rollingFrictionConstraint.m_friction)
+ {
+ rollingFrictionMagnitude = rollingFrictionConstraint.m_friction;
+ }
+
+ rollingFrictionConstraint.m_lowerLimit = -rollingFrictionMagnitude;
+ rollingFrictionConstraint.m_upperLimit = rollingFrictionMagnitude;
+
+ btScalar residual = resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[rollingFrictionConstraint.m_solverBodyIdA], m_tmpSolverBodyPool[rollingFrictionConstraint.m_solverBodyIdB], rollingFrictionConstraint);
+ leastSquaresResidual += residual * residual;
+ }
+ }
+ }
+ return leastSquaresResidual;
}
+void btSequentialImpulseConstraintSolverMt::randomizeBatchedConstraintOrdering(btBatchedConstraints* batchedConstraints)
+{
+ btBatchedConstraints& bc = *batchedConstraints;
+ // randomize ordering of phases
+ for (int ii = 1; ii < bc.m_phaseOrder.size(); ++ii)
+ {
+ int iSwap = btRandInt2(ii + 1);
+ bc.m_phaseOrder.swap(ii, iSwap);
+ }
+
+ // for each batch,
+ for (int iBatch = 0; iBatch < bc.m_batches.size(); ++iBatch)
+ {
+ // randomize ordering of constraints within the batch
+ const btBatchedConstraints::Range& batch = bc.m_batches[iBatch];
+ for (int iiCons = batch.begin; iiCons < batch.end; ++iiCons)
+ {
+ int iSwap = batch.begin + btRandInt2(iiCons - batch.begin + 1);
+ btAssert(iSwap >= batch.begin && iSwap < batch.end);
+ bc.m_constraintIndices.swap(iiCons, iSwap);
+ }
+ }
+}
void btSequentialImpulseConstraintSolverMt::randomizeConstraintOrdering(int iteration, int numIterations)
{
- // randomize ordering of joint constraints
- randomizeBatchedConstraintOrdering( &m_batchedJointConstraints );
-
- //contact/friction constraints are not solved more than numIterations
- if ( iteration < numIterations )
- {
- randomizeBatchedConstraintOrdering( &m_batchedContactConstraints );
- }
-}
+ // randomize ordering of joint constraints
+ randomizeBatchedConstraintOrdering(&m_batchedJointConstraints);
+ //contact/friction constraints are not solved more than numIterations
+ if (iteration < numIterations)
+ {
+ randomizeBatchedConstraintOrdering(&m_batchedContactConstraints);
+ }
+}
struct JointSolverLoop : public btIParallelSumBody
{
- btSequentialImpulseConstraintSolverMt* m_solver;
- const btBatchedConstraints* m_bc;
- int m_iteration;
-
- JointSolverLoop( btSequentialImpulseConstraintSolverMt* solver, const btBatchedConstraints* bc, int iteration )
- {
- m_solver = solver;
- m_bc = bc;
- m_iteration = iteration;
- }
- btScalar sumLoop( int iBegin, int iEnd ) const BT_OVERRIDE
- {
- BT_PROFILE( "JointSolverLoop" );
- btScalar sum = 0;
- for ( int iBatch = iBegin; iBatch < iEnd; ++iBatch )
- {
- const btBatchedConstraints::Range& batch = m_bc->m_batches[ iBatch ];
- sum += m_solver->resolveMultipleJointConstraints( m_bc->m_constraintIndices, batch.begin, batch.end, m_iteration );
- }
- return sum;
- }
-};
+ btSequentialImpulseConstraintSolverMt* m_solver;
+ const btBatchedConstraints* m_bc;
+ int m_iteration;
+ JointSolverLoop(btSequentialImpulseConstraintSolverMt* solver, const btBatchedConstraints* bc, int iteration)
+ {
+ m_solver = solver;
+ m_bc = bc;
+ m_iteration = iteration;
+ }
+ btScalar sumLoop(int iBegin, int iEnd) const BT_OVERRIDE
+ {
+ BT_PROFILE("JointSolverLoop");
+ btScalar sum = 0;
+ for (int iBatch = iBegin; iBatch < iEnd; ++iBatch)
+ {
+ const btBatchedConstraints::Range& batch = m_bc->m_batches[iBatch];
+ sum += m_solver->resolveMultipleJointConstraints(m_bc->m_constraintIndices, batch.begin, batch.end, m_iteration);
+ }
+ return sum;
+ }
+};
btScalar btSequentialImpulseConstraintSolverMt::resolveAllJointConstraints(int iteration)
{
- BT_PROFILE( "resolveAllJointConstraints" );
- const btBatchedConstraints& batchedCons = m_batchedJointConstraints;
- JointSolverLoop loop( this, &batchedCons, iteration );
- btScalar leastSquaresResidual = 0.f;
- for ( int iiPhase = 0; iiPhase < batchedCons.m_phases.size(); ++iiPhase )
- {
- int iPhase = batchedCons.m_phaseOrder[ iiPhase ];
- const btBatchedConstraints::Range& phase = batchedCons.m_phases[ iPhase ];
- int grainSize = 1;
- leastSquaresResidual += btParallelSum( phase.begin, phase.end, grainSize, loop );
- }
- return leastSquaresResidual;
+ BT_PROFILE("resolveAllJointConstraints");
+ const btBatchedConstraints& batchedCons = m_batchedJointConstraints;
+ JointSolverLoop loop(this, &batchedCons, iteration);
+ btScalar leastSquaresResidual = 0.f;
+ for (int iiPhase = 0; iiPhase < batchedCons.m_phases.size(); ++iiPhase)
+ {
+ int iPhase = batchedCons.m_phaseOrder[iiPhase];
+ const btBatchedConstraints::Range& phase = batchedCons.m_phases[iPhase];
+ int grainSize = 1;
+ leastSquaresResidual += btParallelSum(phase.begin, phase.end, grainSize, loop);
+ }
+ return leastSquaresResidual;
}
-
struct ContactSolverLoop : public btIParallelSumBody
{
- btSequentialImpulseConstraintSolverMt* m_solver;
- const btBatchedConstraints* m_bc;
-
- ContactSolverLoop( btSequentialImpulseConstraintSolverMt* solver, const btBatchedConstraints* bc )
- {
- m_solver = solver;
- m_bc = bc;
- }
- btScalar sumLoop( int iBegin, int iEnd ) const BT_OVERRIDE
- {
- BT_PROFILE( "ContactSolverLoop" );
- btScalar sum = 0;
- for ( int iBatch = iBegin; iBatch < iEnd; ++iBatch )
- {
- const btBatchedConstraints::Range& batch = m_bc->m_batches[ iBatch ];
- sum += m_solver->resolveMultipleContactConstraints( m_bc->m_constraintIndices, batch.begin, batch.end );
- }
- return sum;
- }
-};
+ btSequentialImpulseConstraintSolverMt* m_solver;
+ const btBatchedConstraints* m_bc;
+ ContactSolverLoop(btSequentialImpulseConstraintSolverMt* solver, const btBatchedConstraints* bc)
+ {
+ m_solver = solver;
+ m_bc = bc;
+ }
+ btScalar sumLoop(int iBegin, int iEnd) const BT_OVERRIDE
+ {
+ BT_PROFILE("ContactSolverLoop");
+ btScalar sum = 0;
+ for (int iBatch = iBegin; iBatch < iEnd; ++iBatch)
+ {
+ const btBatchedConstraints::Range& batch = m_bc->m_batches[iBatch];
+ sum += m_solver->resolveMultipleContactConstraints(m_bc->m_constraintIndices, batch.begin, batch.end);
+ }
+ return sum;
+ }
+};
btScalar btSequentialImpulseConstraintSolverMt::resolveAllContactConstraints()
{
- BT_PROFILE( "resolveAllContactConstraints" );
- const btBatchedConstraints& batchedCons = m_batchedContactConstraints;
- ContactSolverLoop loop( this, &batchedCons );
- btScalar leastSquaresResidual = 0.f;
- for ( int iiPhase = 0; iiPhase < batchedCons.m_phases.size(); ++iiPhase )
- {
- int iPhase = batchedCons.m_phaseOrder[ iiPhase ];
- const btBatchedConstraints::Range& phase = batchedCons.m_phases[ iPhase ];
- int grainSize = batchedCons.m_phaseGrainSize[iPhase];
- leastSquaresResidual += btParallelSum( phase.begin, phase.end, grainSize, loop );
- }
- return leastSquaresResidual;
+ BT_PROFILE("resolveAllContactConstraints");
+ const btBatchedConstraints& batchedCons = m_batchedContactConstraints;
+ ContactSolverLoop loop(this, &batchedCons);
+ btScalar leastSquaresResidual = 0.f;
+ for (int iiPhase = 0; iiPhase < batchedCons.m_phases.size(); ++iiPhase)
+ {
+ int iPhase = batchedCons.m_phaseOrder[iiPhase];
+ const btBatchedConstraints::Range& phase = batchedCons.m_phases[iPhase];
+ int grainSize = batchedCons.m_phaseGrainSize[iPhase];
+ leastSquaresResidual += btParallelSum(phase.begin, phase.end, grainSize, loop);
+ }
+ return leastSquaresResidual;
}
-
struct ContactFrictionSolverLoop : public btIParallelSumBody
{
- btSequentialImpulseConstraintSolverMt* m_solver;
- const btBatchedConstraints* m_bc;
-
- ContactFrictionSolverLoop( btSequentialImpulseConstraintSolverMt* solver, const btBatchedConstraints* bc )
- {
- m_solver = solver;
- m_bc = bc;
- }
- btScalar sumLoop( int iBegin, int iEnd ) const BT_OVERRIDE
- {
- BT_PROFILE( "ContactFrictionSolverLoop" );
- btScalar sum = 0;
- for ( int iBatch = iBegin; iBatch < iEnd; ++iBatch )
- {
- const btBatchedConstraints::Range& batch = m_bc->m_batches[ iBatch ];
- sum += m_solver->resolveMultipleContactFrictionConstraints( m_bc->m_constraintIndices, batch.begin, batch.end );
- }
- return sum;
- }
-};
+ btSequentialImpulseConstraintSolverMt* m_solver;
+ const btBatchedConstraints* m_bc;
+ ContactFrictionSolverLoop(btSequentialImpulseConstraintSolverMt* solver, const btBatchedConstraints* bc)
+ {
+ m_solver = solver;
+ m_bc = bc;
+ }
+ btScalar sumLoop(int iBegin, int iEnd) const BT_OVERRIDE
+ {
+ BT_PROFILE("ContactFrictionSolverLoop");
+ btScalar sum = 0;
+ for (int iBatch = iBegin; iBatch < iEnd; ++iBatch)
+ {
+ const btBatchedConstraints::Range& batch = m_bc->m_batches[iBatch];
+ sum += m_solver->resolveMultipleContactFrictionConstraints(m_bc->m_constraintIndices, batch.begin, batch.end);
+ }
+ return sum;
+ }
+};
btScalar btSequentialImpulseConstraintSolverMt::resolveAllContactFrictionConstraints()
{
- BT_PROFILE( "resolveAllContactFrictionConstraints" );
- const btBatchedConstraints& batchedCons = m_batchedContactConstraints;
- ContactFrictionSolverLoop loop( this, &batchedCons );
- btScalar leastSquaresResidual = 0.f;
- for ( int iiPhase = 0; iiPhase < batchedCons.m_phases.size(); ++iiPhase )
- {
- int iPhase = batchedCons.m_phaseOrder[ iiPhase ];
- const btBatchedConstraints::Range& phase = batchedCons.m_phases[ iPhase ];
- int grainSize = batchedCons.m_phaseGrainSize[iPhase];
- leastSquaresResidual += btParallelSum( phase.begin, phase.end, grainSize, loop );
- }
- return leastSquaresResidual;
+ BT_PROFILE("resolveAllContactFrictionConstraints");
+ const btBatchedConstraints& batchedCons = m_batchedContactConstraints;
+ ContactFrictionSolverLoop loop(this, &batchedCons);
+ btScalar leastSquaresResidual = 0.f;
+ for (int iiPhase = 0; iiPhase < batchedCons.m_phases.size(); ++iiPhase)
+ {
+ int iPhase = batchedCons.m_phaseOrder[iiPhase];
+ const btBatchedConstraints::Range& phase = batchedCons.m_phases[iPhase];
+ int grainSize = batchedCons.m_phaseGrainSize[iPhase];
+ leastSquaresResidual += btParallelSum(phase.begin, phase.end, grainSize, loop);
+ }
+ return leastSquaresResidual;
}
-
struct InterleavedContactSolverLoop : public btIParallelSumBody
{
- btSequentialImpulseConstraintSolverMt* m_solver;
- const btBatchedConstraints* m_bc;
-
- InterleavedContactSolverLoop( btSequentialImpulseConstraintSolverMt* solver, const btBatchedConstraints* bc )
- {
- m_solver = solver;
- m_bc = bc;
- }
- btScalar sumLoop( int iBegin, int iEnd ) const BT_OVERRIDE
- {
- BT_PROFILE( "InterleavedContactSolverLoop" );
- btScalar sum = 0;
- for ( int iBatch = iBegin; iBatch < iEnd; ++iBatch )
- {
- const btBatchedConstraints::Range& batch = m_bc->m_batches[ iBatch ];
- sum += m_solver->resolveMultipleContactConstraintsInterleaved( m_bc->m_constraintIndices, batch.begin, batch.end );
- }
- return sum;
- }
-};
+ btSequentialImpulseConstraintSolverMt* m_solver;
+ const btBatchedConstraints* m_bc;
+ InterleavedContactSolverLoop(btSequentialImpulseConstraintSolverMt* solver, const btBatchedConstraints* bc)
+ {
+ m_solver = solver;
+ m_bc = bc;
+ }
+ btScalar sumLoop(int iBegin, int iEnd) const BT_OVERRIDE
+ {
+ BT_PROFILE("InterleavedContactSolverLoop");
+ btScalar sum = 0;
+ for (int iBatch = iBegin; iBatch < iEnd; ++iBatch)
+ {
+ const btBatchedConstraints::Range& batch = m_bc->m_batches[iBatch];
+ sum += m_solver->resolveMultipleContactConstraintsInterleaved(m_bc->m_constraintIndices, batch.begin, batch.end);
+ }
+ return sum;
+ }
+};
btScalar btSequentialImpulseConstraintSolverMt::resolveAllContactConstraintsInterleaved()
{
- BT_PROFILE( "resolveAllContactConstraintsInterleaved" );
- const btBatchedConstraints& batchedCons = m_batchedContactConstraints;
- InterleavedContactSolverLoop loop( this, &batchedCons );
- btScalar leastSquaresResidual = 0.f;
- for ( int iiPhase = 0; iiPhase < batchedCons.m_phases.size(); ++iiPhase )
- {
- int iPhase = batchedCons.m_phaseOrder[ iiPhase ];
- const btBatchedConstraints::Range& phase = batchedCons.m_phases[ iPhase ];
- int grainSize = 1;
- leastSquaresResidual += btParallelSum( phase.begin, phase.end, grainSize, loop );
- }
- return leastSquaresResidual;
+ BT_PROFILE("resolveAllContactConstraintsInterleaved");
+ const btBatchedConstraints& batchedCons = m_batchedContactConstraints;
+ InterleavedContactSolverLoop loop(this, &batchedCons);
+ btScalar leastSquaresResidual = 0.f;
+ for (int iiPhase = 0; iiPhase < batchedCons.m_phases.size(); ++iiPhase)
+ {
+ int iPhase = batchedCons.m_phaseOrder[iiPhase];
+ const btBatchedConstraints::Range& phase = batchedCons.m_phases[iPhase];
+ int grainSize = 1;
+ leastSquaresResidual += btParallelSum(phase.begin, phase.end, grainSize, loop);
+ }
+ return leastSquaresResidual;
}
-
struct ContactRollingFrictionSolverLoop : public btIParallelSumBody
{
- btSequentialImpulseConstraintSolverMt* m_solver;
- const btBatchedConstraints* m_bc;
-
- ContactRollingFrictionSolverLoop( btSequentialImpulseConstraintSolverMt* solver, const btBatchedConstraints* bc )
- {
- m_solver = solver;
- m_bc = bc;
- }
- btScalar sumLoop( int iBegin, int iEnd ) const BT_OVERRIDE
- {
- BT_PROFILE( "ContactFrictionSolverLoop" );
- btScalar sum = 0;
- for ( int iBatch = iBegin; iBatch < iEnd; ++iBatch )
- {
- const btBatchedConstraints::Range& batch = m_bc->m_batches[ iBatch ];
- sum += m_solver->resolveMultipleContactRollingFrictionConstraints( m_bc->m_constraintIndices, batch.begin, batch.end );
- }
- return sum;
- }
-};
+ btSequentialImpulseConstraintSolverMt* m_solver;
+ const btBatchedConstraints* m_bc;
+ ContactRollingFrictionSolverLoop(btSequentialImpulseConstraintSolverMt* solver, const btBatchedConstraints* bc)
+ {
+ m_solver = solver;
+ m_bc = bc;
+ }
+ btScalar sumLoop(int iBegin, int iEnd) const BT_OVERRIDE
+ {
+ BT_PROFILE("ContactFrictionSolverLoop");
+ btScalar sum = 0;
+ for (int iBatch = iBegin; iBatch < iEnd; ++iBatch)
+ {
+ const btBatchedConstraints::Range& batch = m_bc->m_batches[iBatch];
+ sum += m_solver->resolveMultipleContactRollingFrictionConstraints(m_bc->m_constraintIndices, batch.begin, batch.end);
+ }
+ return sum;
+ }
+};
btScalar btSequentialImpulseConstraintSolverMt::resolveAllRollingFrictionConstraints()
{
- BT_PROFILE( "resolveAllRollingFrictionConstraints" );
- btScalar leastSquaresResidual = 0.f;
- //
- // We do not generate batches for rolling friction constraints. We assume that
- // one of two cases is true:
- //
- // 1. either most bodies in the simulation have rolling friction, in which case we can use the
- // batches for contacts and use a lookup table to translate contact indices to rolling friction
- // (ignoring any contact indices that don't map to a rolling friction constraint). As long as
- // most contacts have a corresponding rolling friction constraint, this should parallelize well.
- //
- // -OR-
- //
- // 2. few bodies in the simulation have rolling friction, so it is not worth trying to use the
- // batches from contacts as most of the contacts won't have corresponding rolling friction
- // constraints and most threads would end up doing very little work. Most of the time would
- // go to threading overhead, so we don't bother with threading.
- //
- int numRollingFrictionPoolConstraints = m_tmpSolverContactRollingFrictionConstraintPool.size();
- if (numRollingFrictionPoolConstraints >= m_tmpSolverContactConstraintPool.size())
- {
- // use batching if there are many rolling friction constraints
- const btBatchedConstraints& batchedCons = m_batchedContactConstraints;
- ContactRollingFrictionSolverLoop loop( this, &batchedCons );
- btScalar leastSquaresResidual = 0.f;
- for ( int iiPhase = 0; iiPhase < batchedCons.m_phases.size(); ++iiPhase )
- {
- int iPhase = batchedCons.m_phaseOrder[ iiPhase ];
- const btBatchedConstraints::Range& phase = batchedCons.m_phases[ iPhase ];
- int grainSize = 1;
- leastSquaresResidual += btParallelSum( phase.begin, phase.end, grainSize, loop );
- }
- }
- else
- {
- // no batching, also ignores SOLVER_RANDMIZE_ORDER
- for ( int j = 0; j < numRollingFrictionPoolConstraints; j++ )
- {
- btSolverConstraint& rollingFrictionConstraint = m_tmpSolverContactRollingFrictionConstraintPool[ j ];
- if ( rollingFrictionConstraint.m_frictionIndex >= 0 )
- {
- btScalar totalImpulse = m_tmpSolverContactConstraintPool[ rollingFrictionConstraint.m_frictionIndex ].m_appliedImpulse;
- if ( totalImpulse > 0.0f )
- {
- btScalar rollingFrictionMagnitude = rollingFrictionConstraint.m_friction*totalImpulse;
- if ( rollingFrictionMagnitude > rollingFrictionConstraint.m_friction )
- rollingFrictionMagnitude = rollingFrictionConstraint.m_friction;
-
- rollingFrictionConstraint.m_lowerLimit = -rollingFrictionMagnitude;
- rollingFrictionConstraint.m_upperLimit = rollingFrictionMagnitude;
-
- btScalar residual = resolveSingleConstraintRowGeneric( m_tmpSolverBodyPool[ rollingFrictionConstraint.m_solverBodyIdA ], m_tmpSolverBodyPool[ rollingFrictionConstraint.m_solverBodyIdB ], rollingFrictionConstraint );
- leastSquaresResidual += residual*residual;
- }
- }
- }
- }
- return leastSquaresResidual;
+ BT_PROFILE("resolveAllRollingFrictionConstraints");
+ btScalar leastSquaresResidual = 0.f;
+ //
+ // We do not generate batches for rolling friction constraints. We assume that
+ // one of two cases is true:
+ //
+ // 1. either most bodies in the simulation have rolling friction, in which case we can use the
+ // batches for contacts and use a lookup table to translate contact indices to rolling friction
+ // (ignoring any contact indices that don't map to a rolling friction constraint). As long as
+ // most contacts have a corresponding rolling friction constraint, this should parallelize well.
+ //
+ // -OR-
+ //
+ // 2. few bodies in the simulation have rolling friction, so it is not worth trying to use the
+ // batches from contacts as most of the contacts won't have corresponding rolling friction
+ // constraints and most threads would end up doing very little work. Most of the time would
+ // go to threading overhead, so we don't bother with threading.
+ //
+ int numRollingFrictionPoolConstraints = m_tmpSolverContactRollingFrictionConstraintPool.size();
+ if (numRollingFrictionPoolConstraints >= m_tmpSolverContactConstraintPool.size())
+ {
+ // use batching if there are many rolling friction constraints
+ const btBatchedConstraints& batchedCons = m_batchedContactConstraints;
+ ContactRollingFrictionSolverLoop loop(this, &batchedCons);
+ btScalar leastSquaresResidual = 0.f;
+ for (int iiPhase = 0; iiPhase < batchedCons.m_phases.size(); ++iiPhase)
+ {
+ int iPhase = batchedCons.m_phaseOrder[iiPhase];
+ const btBatchedConstraints::Range& phase = batchedCons.m_phases[iPhase];
+ int grainSize = 1;
+ leastSquaresResidual += btParallelSum(phase.begin, phase.end, grainSize, loop);
+ }
+ }
+ else
+ {
+ // no batching, also ignores SOLVER_RANDMIZE_ORDER
+ for (int j = 0; j < numRollingFrictionPoolConstraints; j++)
+ {
+ btSolverConstraint& rollingFrictionConstraint = m_tmpSolverContactRollingFrictionConstraintPool[j];
+ if (rollingFrictionConstraint.m_frictionIndex >= 0)
+ {
+ btScalar totalImpulse = m_tmpSolverContactConstraintPool[rollingFrictionConstraint.m_frictionIndex].m_appliedImpulse;
+ if (totalImpulse > 0.0f)
+ {
+ btScalar rollingFrictionMagnitude = rollingFrictionConstraint.m_friction * totalImpulse;
+ if (rollingFrictionMagnitude > rollingFrictionConstraint.m_friction)
+ rollingFrictionMagnitude = rollingFrictionConstraint.m_friction;
+
+ rollingFrictionConstraint.m_lowerLimit = -rollingFrictionMagnitude;
+ rollingFrictionConstraint.m_upperLimit = rollingFrictionMagnitude;
+
+ btScalar residual = resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[rollingFrictionConstraint.m_solverBodyIdA], m_tmpSolverBodyPool[rollingFrictionConstraint.m_solverBodyIdB], rollingFrictionConstraint);
+ leastSquaresResidual += residual * residual;
+ }
+ }
+ }
+ }
+ return leastSquaresResidual;
}
-
-void btSequentialImpulseConstraintSolverMt::internalWriteBackContacts( int iBegin, int iEnd, const btContactSolverInfo& infoGlobal )
+void btSequentialImpulseConstraintSolverMt::internalWriteBackContacts(int iBegin, int iEnd, const btContactSolverInfo& infoGlobal)
{
- BT_PROFILE("internalWriteBackContacts");
- writeBackContacts(iBegin, iEnd, infoGlobal);
- //for ( int iContact = iBegin; iContact < iEnd; ++iContact)
- //{
- // const btSolverConstraint& contactConstraint = m_tmpSolverContactConstraintPool[ iContact ];
- // btManifoldPoint* pt = (btManifoldPoint*) contactConstraint.m_originalContactPoint;
- // btAssert( pt );
- // pt->m_appliedImpulse = contactConstraint.m_appliedImpulse;
- // pt->m_appliedImpulseLateral1 = m_tmpSolverContactFrictionConstraintPool[ contactConstraint.m_frictionIndex ].m_appliedImpulse;
- // if ( m_numFrictionDirections == 2 )
- // {
- // pt->m_appliedImpulseLateral2 = m_tmpSolverContactFrictionConstraintPool[ contactConstraint.m_frictionIndex + 1 ].m_appliedImpulse;
- // }
- //}
+ BT_PROFILE("internalWriteBackContacts");
+ writeBackContacts(iBegin, iEnd, infoGlobal);
+ //for ( int iContact = iBegin; iContact < iEnd; ++iContact)
+ //{
+ // const btSolverConstraint& contactConstraint = m_tmpSolverContactConstraintPool[ iContact ];
+ // btManifoldPoint* pt = (btManifoldPoint*) contactConstraint.m_originalContactPoint;
+ // btAssert( pt );
+ // pt->m_appliedImpulse = contactConstraint.m_appliedImpulse;
+ // pt->m_appliedImpulseLateral1 = m_tmpSolverContactFrictionConstraintPool[ contactConstraint.m_frictionIndex ].m_appliedImpulse;
+ // if ( m_numFrictionDirections == 2 )
+ // {
+ // pt->m_appliedImpulseLateral2 = m_tmpSolverContactFrictionConstraintPool[ contactConstraint.m_frictionIndex + 1 ].m_appliedImpulse;
+ // }
+ //}
}
-
-void btSequentialImpulseConstraintSolverMt::internalWriteBackJoints( int iBegin, int iEnd, const btContactSolverInfo& infoGlobal )
+void btSequentialImpulseConstraintSolverMt::internalWriteBackJoints(int iBegin, int iEnd, const btContactSolverInfo& infoGlobal)
{
BT_PROFILE("internalWriteBackJoints");
- writeBackJoints(iBegin, iEnd, infoGlobal);
+ writeBackJoints(iBegin, iEnd, infoGlobal);
}
-
-void btSequentialImpulseConstraintSolverMt::internalWriteBackBodies( int iBegin, int iEnd, const btContactSolverInfo& infoGlobal )
+void btSequentialImpulseConstraintSolverMt::internalWriteBackBodies(int iBegin, int iEnd, const btContactSolverInfo& infoGlobal)
{
BT_PROFILE("internalWriteBackBodies");
- writeBackBodies( iBegin, iEnd, infoGlobal );
+ writeBackBodies(iBegin, iEnd, infoGlobal);
}
-
struct WriteContactPointsLoop : public btIParallelForBody
{
- btSequentialImpulseConstraintSolverMt* m_solver;
- const btContactSolverInfo* m_infoGlobal;
-
- WriteContactPointsLoop( btSequentialImpulseConstraintSolverMt* solver, const btContactSolverInfo& infoGlobal )
- {
- m_solver = solver;
- m_infoGlobal = &infoGlobal;
- }
- void forLoop( int iBegin, int iEnd ) const BT_OVERRIDE
- {
- m_solver->internalWriteBackContacts( iBegin, iEnd, *m_infoGlobal );
- }
-};
+ btSequentialImpulseConstraintSolverMt* m_solver;
+ const btContactSolverInfo* m_infoGlobal;
+ WriteContactPointsLoop(btSequentialImpulseConstraintSolverMt* solver, const btContactSolverInfo& infoGlobal)
+ {
+ m_solver = solver;
+ m_infoGlobal = &infoGlobal;
+ }
+ void forLoop(int iBegin, int iEnd) const BT_OVERRIDE
+ {
+ m_solver->internalWriteBackContacts(iBegin, iEnd, *m_infoGlobal);
+ }
+};
struct WriteJointsLoop : public btIParallelForBody
{
- btSequentialImpulseConstraintSolverMt* m_solver;
- const btContactSolverInfo* m_infoGlobal;
-
- WriteJointsLoop( btSequentialImpulseConstraintSolverMt* solver, const btContactSolverInfo& infoGlobal )
- {
- m_solver = solver;
- m_infoGlobal = &infoGlobal;
- }
- void forLoop( int iBegin, int iEnd ) const BT_OVERRIDE
- {
- m_solver->internalWriteBackJoints( iBegin, iEnd, *m_infoGlobal );
- }
-};
+ btSequentialImpulseConstraintSolverMt* m_solver;
+ const btContactSolverInfo* m_infoGlobal;
+ WriteJointsLoop(btSequentialImpulseConstraintSolverMt* solver, const btContactSolverInfo& infoGlobal)
+ {
+ m_solver = solver;
+ m_infoGlobal = &infoGlobal;
+ }
+ void forLoop(int iBegin, int iEnd) const BT_OVERRIDE
+ {
+ m_solver->internalWriteBackJoints(iBegin, iEnd, *m_infoGlobal);
+ }
+};
struct WriteBodiesLoop : public btIParallelForBody
{
- btSequentialImpulseConstraintSolverMt* m_solver;
- const btContactSolverInfo* m_infoGlobal;
-
- WriteBodiesLoop( btSequentialImpulseConstraintSolverMt* solver, const btContactSolverInfo& infoGlobal )
- {
- m_solver = solver;
- m_infoGlobal = &infoGlobal;
- }
- void forLoop( int iBegin, int iEnd ) const BT_OVERRIDE
- {
- m_solver->internalWriteBackBodies( iBegin, iEnd, *m_infoGlobal );
- }
-};
+ btSequentialImpulseConstraintSolverMt* m_solver;
+ const btContactSolverInfo* m_infoGlobal;
+ WriteBodiesLoop(btSequentialImpulseConstraintSolverMt* solver, const btContactSolverInfo& infoGlobal)
+ {
+ m_solver = solver;
+ m_infoGlobal = &infoGlobal;
+ }
+ void forLoop(int iBegin, int iEnd) const BT_OVERRIDE
+ {
+ m_solver->internalWriteBackBodies(iBegin, iEnd, *m_infoGlobal);
+ }
+};
btScalar btSequentialImpulseConstraintSolverMt::solveGroupCacheFriendlyFinish(btCollisionObject** bodies, int numBodies, const btContactSolverInfo& infoGlobal)
{
BT_PROFILE("solveGroupCacheFriendlyFinish");
if (infoGlobal.m_solverMode & SOLVER_USE_WARMSTARTING)
- {
- WriteContactPointsLoop loop( this, infoGlobal );
- int grainSize = 500;
- btParallelFor( 0, m_tmpSolverContactConstraintPool.size(), grainSize, loop );
- }
-
- {
- WriteJointsLoop loop( this, infoGlobal );
- int grainSize = 400;
- btParallelFor( 0, m_tmpSolverNonContactConstraintPool.size(), grainSize, loop );
- }
- {
- WriteBodiesLoop loop( this, infoGlobal );
- int grainSize = 100;
- btParallelFor( 0, m_tmpSolverBodyPool.size(), grainSize, loop );
- }
+ {
+ WriteContactPointsLoop loop(this, infoGlobal);
+ int grainSize = 500;
+ btParallelFor(0, m_tmpSolverContactConstraintPool.size(), grainSize, loop);
+ }
+
+ {
+ WriteJointsLoop loop(this, infoGlobal);
+ int grainSize = 400;
+ btParallelFor(0, m_tmpSolverNonContactConstraintPool.size(), grainSize, loop);
+ }
+ {
+ WriteBodiesLoop loop(this, infoGlobal);
+ int grainSize = 100;
+ btParallelFor(0, m_tmpSolverBodyPool.size(), grainSize, loop);
+ }
m_tmpSolverContactConstraintPool.resizeNoInitialize(0);
m_tmpSolverNonContactConstraintPool.resizeNoInitialize(0);
@@ -1618,4 +1552,3 @@ btScalar btSequentialImpulseConstraintSolverMt::solveGroupCacheFriendlyFinish(bt
m_tmpSolverBodyPool.resizeNoInitialize(0);
return 0.f;
}
-
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolverMt.h b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolverMt.h
index 55d53474c4..1861ddd7d7 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolverMt.h
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolverMt.h
@@ -53,102 +53,98 @@ subject to the following restrictions:
/// 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
+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<JointParams>& 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;
+ 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<JointParams>& 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<btContactManifoldCachedInfo> m_manifoldCachedInfoArray;
- btAlignedObjectArray<int> 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<char> 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 );
+ static const int CACHE_LINE_SIZE = 64;
+
+ btBatchedConstraints m_batchedContactConstraints;
+ btBatchedConstraints m_batchedJointConstraints;
+ int m_numFrictionDirections;
+ bool m_useBatching;
+ bool m_useObsoleteJointConstraints;
+ btAlignedObjectArray<btContactManifoldCachedInfo> m_manifoldCachedInfoArray;
+ btAlignedObjectArray<int> 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<char> 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<int>& consIndices, int batchBegin, int batchEnd, int iteration );
- btScalar resolveMultipleContactConstraints( const btAlignedObjectArray<int>& consIndices, int batchBegin, int batchEnd );
- btScalar resolveMultipleContactSplitPenetrationImpulseConstraints( const btAlignedObjectArray<int>& consIndices, int batchBegin, int batchEnd );
- btScalar resolveMultipleContactFrictionConstraints( const btAlignedObjectArray<int>& consIndices, int batchBegin, int batchEnd );
- btScalar resolveMultipleContactRollingFrictionConstraints( const btAlignedObjectArray<int>& consIndices, int batchBegin, int batchEnd );
- btScalar resolveMultipleContactConstraintsInterleaved( const btAlignedObjectArray<int>& 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);
+ btScalar resolveMultipleJointConstraints(const btAlignedObjectArray<int>& consIndices, int batchBegin, int batchEnd, int iteration);
+ btScalar resolveMultipleContactConstraints(const btAlignedObjectArray<int>& consIndices, int batchBegin, int batchEnd);
+ btScalar resolveMultipleContactSplitPenetrationImpulseConstraints(const btAlignedObjectArray<int>& consIndices, int batchBegin, int batchEnd);
+ btScalar resolveMultipleContactFrictionConstraints(const btAlignedObjectArray<int>& consIndices, int batchBegin, int batchEnd);
+ btScalar resolveMultipleContactRollingFrictionConstraints(const btAlignedObjectArray<int>& consIndices, int batchBegin, int batchEnd);
+ btScalar resolveMultipleContactConstraintsInterleaved(const btAlignedObjectArray<int>& 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
-
+#endif //BT_SEQUENTIAL_IMPULSE_CONSTRAINT_SOLVER_MT_H
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSliderConstraint.cpp b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSliderConstraint.cpp
index d63cef0316..cac5302a73 100755
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSliderConstraint.cpp
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSliderConstraint.cpp
@@ -18,8 +18,6 @@ Added by Roman Ponomarev (rponom@gmail.com)
April 04, 2008
*/
-
-
#include "btSliderConstraint.h"
#include "BulletDynamics/Dynamics/btRigidBody.h"
#include "LinearMath/btTransformUtil.h"
@@ -29,10 +27,10 @@ April 04, 2008
void btSliderConstraint::initParams()
{
- m_lowerLinLimit = btScalar(1.0);
- m_upperLinLimit = btScalar(-1.0);
- m_lowerAngLimit = btScalar(0.);
- m_upperAngLimit = btScalar(0.);
+ m_lowerLinLimit = btScalar(1.0);
+ m_upperLinLimit = btScalar(-1.0);
+ m_lowerAngLimit = btScalar(0.);
+ m_upperAngLimit = btScalar(0.);
m_softnessDirLin = SLIDER_CONSTRAINT_DEF_SOFTNESS;
m_restitutionDirLin = SLIDER_CONSTRAINT_DEF_RESTITUTION;
m_dampingDirLin = btScalar(0.);
@@ -59,13 +57,13 @@ void btSliderConstraint::initParams()
m_cfmLimAng = SLIDER_CONSTRAINT_DEF_CFM;
m_poweredLinMotor = false;
- m_targetLinMotorVelocity = btScalar(0.);
- m_maxLinMotorForce = btScalar(0.);
+ m_targetLinMotorVelocity = btScalar(0.);
+ m_maxLinMotorForce = btScalar(0.);
m_accumulatedLinMotorImpulse = btScalar(0.0);
m_poweredAngMotor = false;
- m_targetAngMotorVelocity = btScalar(0.);
- m_maxAngMotorForce = btScalar(0.);
+ m_targetAngMotorVelocity = btScalar(0.);
+ m_maxAngMotorForce = btScalar(0.);
m_accumulatedAngMotorImpulse = btScalar(0.0);
m_flags = 0;
@@ -73,43 +71,32 @@ void btSliderConstraint::initParams()
m_useOffsetForConstraintFrame = USE_OFFSET_FOR_CONSTANT_FRAME;
- calculateTransforms(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
+ calculateTransforms(m_rbA.getCenterOfMassTransform(), m_rbB.getCenterOfMassTransform());
}
-
-
-
-
btSliderConstraint::btSliderConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB, bool useLinearReferenceFrameA)
- : btTypedConstraint(SLIDER_CONSTRAINT_TYPE, rbA, rbB),
- m_useSolveConstraintObsolete(false),
- m_frameInA(frameInA),
- m_frameInB(frameInB),
- m_useLinearReferenceFrameA(useLinearReferenceFrameA)
+ : btTypedConstraint(SLIDER_CONSTRAINT_TYPE, rbA, rbB),
+ m_useSolveConstraintObsolete(false),
+ m_frameInA(frameInA),
+ m_frameInB(frameInB),
+ m_useLinearReferenceFrameA(useLinearReferenceFrameA)
{
initParams();
}
-
-
btSliderConstraint::btSliderConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameA)
- : btTypedConstraint(SLIDER_CONSTRAINT_TYPE, getFixedBody(), rbB),
- m_useSolveConstraintObsolete(false),
- m_frameInB(frameInB),
- m_useLinearReferenceFrameA(useLinearReferenceFrameA)
+ : btTypedConstraint(SLIDER_CONSTRAINT_TYPE, getFixedBody(), rbB),
+ m_useSolveConstraintObsolete(false),
+ m_frameInB(frameInB),
+ m_useLinearReferenceFrameA(useLinearReferenceFrameA)
{
///not providing rigidbody A means implicitly using worldspace for body A
m_frameInA = rbB.getCenterOfMassTransform() * m_frameInB;
-// m_frameInA.getOrigin() = m_rbA.getCenterOfMassTransform()(m_frameInA.getOrigin());
+ // m_frameInA.getOrigin() = m_rbA.getCenterOfMassTransform()(m_frameInA.getOrigin());
initParams();
}
-
-
-
-
-
void btSliderConstraint::getInfo1(btConstraintInfo1* info)
{
if (m_useSolveConstraintObsolete)
@@ -119,46 +106,39 @@ void btSliderConstraint::getInfo1(btConstraintInfo1* info)
}
else
{
- info->m_numConstraintRows = 4; // Fixed 2 linear + 2 angular
- info->nub = 2;
+ info->m_numConstraintRows = 4; // Fixed 2 linear + 2 angular
+ info->nub = 2;
//prepare constraint
- calculateTransforms(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
+ calculateTransforms(m_rbA.getCenterOfMassTransform(), m_rbB.getCenterOfMassTransform());
testAngLimits();
testLinLimits();
- if(getSolveLinLimit() || getPoweredLinMotor())
+ if (getSolveLinLimit() || getPoweredLinMotor())
{
- info->m_numConstraintRows++; // limit 3rd linear as well
- info->nub--;
+ info->m_numConstraintRows++; // limit 3rd linear as well
+ info->nub--;
}
- if(getSolveAngLimit() || getPoweredAngMotor())
+ if (getSolveAngLimit() || getPoweredAngMotor())
{
- info->m_numConstraintRows++; // limit 3rd angular as well
- info->nub--;
+ info->m_numConstraintRows++; // limit 3rd angular as well
+ info->nub--;
}
}
}
void btSliderConstraint::getInfo1NonVirtual(btConstraintInfo1* info)
{
-
- info->m_numConstraintRows = 6; // Fixed 2 linear + 2 angular + 1 limit (even if not used)
- info->nub = 0;
+ info->m_numConstraintRows = 6; // Fixed 2 linear + 2 angular + 1 limit (even if not used)
+ info->nub = 0;
}
void btSliderConstraint::getInfo2(btConstraintInfo2* info)
{
- getInfo2NonVirtual(info,m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform(), m_rbA.getLinearVelocity(),m_rbB.getLinearVelocity(), m_rbA.getInvMass(),m_rbB.getInvMass());
+ getInfo2NonVirtual(info, m_rbA.getCenterOfMassTransform(), m_rbB.getCenterOfMassTransform(), m_rbA.getLinearVelocity(), m_rbB.getLinearVelocity(), m_rbA.getInvMass(), m_rbB.getInvMass());
}
-
-
-
-
-
-
-void btSliderConstraint::calculateTransforms(const btTransform& transA,const btTransform& transB)
+void btSliderConstraint::calculateTransforms(const btTransform& transA, const btTransform& transB)
{
- if(m_useLinearReferenceFrameA || (!m_useSolveConstraintObsolete))
+ if (m_useLinearReferenceFrameA || (!m_useSolveConstraintObsolete))
{
m_calculatedTransformA = transA * m_frameInA;
m_calculatedTransformB = transB * m_frameInB;
@@ -170,8 +150,8 @@ void btSliderConstraint::calculateTransforms(const btTransform& transA,const btT
}
m_realPivotAInW = m_calculatedTransformA.getOrigin();
m_realPivotBInW = m_calculatedTransformB.getOrigin();
- m_sliderAxis = m_calculatedTransformA.getBasis().getColumn(0); // along X
- if(m_useLinearReferenceFrameA || m_useSolveConstraintObsolete)
+ m_sliderAxis = m_calculatedTransformA.getBasis().getColumn(0); // along X
+ if (m_useLinearReferenceFrameA || m_useSolveConstraintObsolete)
{
m_delta = m_realPivotBInW - m_realPivotAInW;
}
@@ -180,30 +160,28 @@ void btSliderConstraint::calculateTransforms(const btTransform& transA,const btT
m_delta = m_realPivotAInW - m_realPivotBInW;
}
m_projPivotInW = m_realPivotAInW + m_sliderAxis.dot(m_delta) * m_sliderAxis;
- btVector3 normalWorld;
- int i;
- //linear part
- for(i = 0; i < 3; i++)
- {
+ btVector3 normalWorld;
+ int i;
+ //linear part
+ for (i = 0; i < 3; i++)
+ {
normalWorld = m_calculatedTransformA.getBasis().getColumn(i);
m_depth[i] = m_delta.dot(normalWorld);
- }
+ }
}
-
-
void btSliderConstraint::testLinLimits(void)
{
m_solveLinLim = false;
m_linPos = m_depth[0];
- if(m_lowerLinLimit <= m_upperLinLimit)
+ if (m_lowerLinLimit <= m_upperLinLimit)
{
- if(m_depth[0] > m_upperLinLimit)
+ if (m_depth[0] > m_upperLinLimit)
{
m_depth[0] -= m_upperLinLimit;
m_solveLinLim = true;
}
- else if(m_depth[0] < m_lowerLinLimit)
+ else if (m_depth[0] < m_lowerLinLimit)
{
m_depth[0] -= m_lowerLinLimit;
m_solveLinLim = true;
@@ -219,27 +197,25 @@ void btSliderConstraint::testLinLimits(void)
}
}
-
-
void btSliderConstraint::testAngLimits(void)
{
m_angDepth = btScalar(0.);
m_solveAngLim = false;
- if(m_lowerAngLimit <= m_upperAngLimit)
+ if (m_lowerAngLimit <= m_upperAngLimit)
{
const btVector3 axisA0 = m_calculatedTransformA.getBasis().getColumn(1);
const btVector3 axisA1 = m_calculatedTransformA.getBasis().getColumn(2);
const btVector3 axisB0 = m_calculatedTransformB.getBasis().getColumn(1);
-// btScalar rot = btAtan2Fast(axisB0.dot(axisA1), axisB0.dot(axisA0));
- btScalar rot = btAtan2(axisB0.dot(axisA1), axisB0.dot(axisA0));
+ // btScalar rot = btAtan2Fast(axisB0.dot(axisA1), axisB0.dot(axisA0));
+ btScalar rot = btAtan2(axisB0.dot(axisA1), axisB0.dot(axisA0));
rot = btAdjustAngleToLimits(rot, m_lowerAngLimit, m_upperAngLimit);
m_angPos = rot;
- if(rot < m_lowerAngLimit)
+ if (rot < m_lowerAngLimit)
{
m_angDepth = rot - m_lowerAngLimit;
m_solveAngLim = true;
- }
- else if(rot > m_upperAngLimit)
+ }
+ else if (rot > m_upperAngLimit)
{
m_angDepth = rot - m_upperAngLimit;
m_solveAngLim = true;
@@ -255,8 +231,6 @@ btVector3 btSliderConstraint::getAncorInA(void)
return ancorInA;
}
-
-
btVector3 btSliderConstraint::getAncorInB(void)
{
btVector3 ancorInB;
@@ -264,17 +238,16 @@ btVector3 btSliderConstraint::getAncorInB(void)
return ancorInB;
}
-
-void btSliderConstraint::getInfo2NonVirtual(btConstraintInfo2* info, const btTransform& transA,const btTransform& transB, const btVector3& linVelA,const btVector3& linVelB, btScalar rbAinvMass,btScalar rbBinvMass )
+void btSliderConstraint::getInfo2NonVirtual(btConstraintInfo2* info, const btTransform& transA, const btTransform& transB, const btVector3& linVelA, const btVector3& linVelB, btScalar rbAinvMass, btScalar rbBinvMass)
{
const btTransform& trA = getCalculatedTransformA();
const btTransform& trB = getCalculatedTransformB();
-
+
btAssert(!m_useSolveConstraintObsolete);
int i, s = info->rowskip;
-
+
btScalar signFact = m_useLinearReferenceFrameA ? btScalar(1.0f) : btScalar(-1.0f);
-
+
// difference between frames in WCS
btVector3 ofs = trB.getOrigin() - trA.getOrigin();
// now get weight factors depending on masses
@@ -283,11 +256,11 @@ void btSliderConstraint::getInfo2NonVirtual(btConstraintInfo2* info, const btTra
bool hasStaticBody = (miA < SIMD_EPSILON) || (miB < SIMD_EPSILON);
btScalar miS = miA + miB;
btScalar factA, factB;
- if(miS > btScalar(0.f))
+ if (miS > btScalar(0.f))
{
factA = miB / miS;
}
- else
+ else
{
factA = btScalar(0.5f);
}
@@ -295,17 +268,17 @@ void btSliderConstraint::getInfo2NonVirtual(btConstraintInfo2* info, const btTra
btVector3 ax1, p, q;
btVector3 ax1A = trA.getBasis().getColumn(0);
btVector3 ax1B = trB.getBasis().getColumn(0);
- if(m_useOffsetForConstraintFrame)
+ if (m_useOffsetForConstraintFrame)
{
// get the desired direction of slider axis
// as weighted sum of X-orthos of frameA and frameB in WCS
ax1 = ax1A * factA + ax1B * factB;
ax1.normalize();
// construct two orthos to slider axis
- btPlaneSpace1 (ax1, p, q);
+ btPlaneSpace1(ax1, p, q);
}
else
- { // old way - use frameA
+ { // old way - use frameA
ax1 = trA.getBasis().getColumn(0);
// get 2 orthos to slider axis (Y, Z)
p = trA.getBasis().getColumn(1);
@@ -322,16 +295,16 @@ void btSliderConstraint::getInfo2NonVirtual(btConstraintInfo2* info, const btTra
info->m_J1angularAxis[0] = p[0];
info->m_J1angularAxis[1] = p[1];
info->m_J1angularAxis[2] = p[2];
- info->m_J1angularAxis[s+0] = q[0];
- info->m_J1angularAxis[s+1] = q[1];
- info->m_J1angularAxis[s+2] = q[2];
+ info->m_J1angularAxis[s + 0] = q[0];
+ info->m_J1angularAxis[s + 1] = q[1];
+ info->m_J1angularAxis[s + 2] = q[2];
info->m_J2angularAxis[0] = -p[0];
info->m_J2angularAxis[1] = -p[1];
info->m_J2angularAxis[2] = -p[2];
- info->m_J2angularAxis[s+0] = -q[0];
- info->m_J2angularAxis[s+1] = -q[1];
- info->m_J2angularAxis[s+2] = -q[2];
+ info->m_J2angularAxis[s + 0] = -q[0];
+ info->m_J2angularAxis[s + 1] = -q[1];
+ info->m_J2angularAxis[s + 2] = -q[2];
// compute the right hand side of the constraint equation. set relative
// body velocities along p and q to bring the slider back into alignment.
// if ax1A,ax1B are the unit length slider axes as computed from bodyA and
@@ -347,25 +320,25 @@ void btSliderConstraint::getInfo2NonVirtual(btConstraintInfo2* info, const btTra
// angular_velocity = (erp*fps) * (ax1 x ax2)
// ax1 x ax2 is in the plane space of ax1, so we project the angular
// velocity to p and q to find the right hand side.
-// btScalar k = info->fps * info->erp * getSoftnessOrthoAng();
+ // btScalar k = info->fps * info->erp * getSoftnessOrthoAng();
btScalar currERP = (m_flags & BT_SLIDER_FLAGS_ERP_ORTANG) ? m_softnessOrthoAng : m_softnessOrthoAng * info->erp;
btScalar k = info->fps * currERP;
btVector3 u = ax1A.cross(ax1B);
info->m_constraintError[0] = k * u.dot(p);
info->m_constraintError[s] = k * u.dot(q);
- if(m_flags & BT_SLIDER_FLAGS_CFM_ORTANG)
+ if (m_flags & BT_SLIDER_FLAGS_CFM_ORTANG)
{
info->cfm[0] = m_cfmOrthoAng;
info->cfm[s] = m_cfmOrthoAng;
}
- int nrow = 1; // last filled row
+ int nrow = 1; // last filled row
int srow;
btScalar limit_err;
int limit;
- // next two rows.
+ // next two rows.
// we want: velA + wA x relA == velB + wB x relB ... but this would
// result in three equations, so we project along two orthos to the slider axis
@@ -375,8 +348,8 @@ void btSliderConstraint::getInfo2NonVirtual(btConstraintInfo2* info, const btTra
int s2 = nrow * s;
nrow++;
int s3 = nrow * s;
- btVector3 tmpA(0,0,0), tmpB(0,0,0), relA(0,0,0), relB(0,0,0), c(0,0,0);
- if(m_useOffsetForConstraintFrame)
+ btVector3 tmpA(0, 0, 0), tmpB(0, 0, 0), relA(0, 0, 0), relB(0, 0, 0), c(0, 0, 0);
+ if (m_useOffsetForConstraintFrame)
{
// get vector from bodyB to frameB in WCS
relB = trB.getOrigin() - bodyB_trans.getOrigin();
@@ -398,7 +371,7 @@ void btSliderConstraint::getInfo2NonVirtual(btConstraintInfo2* info, const btTra
// now choose average ortho to slider axis
p = orthoB * factA + orthoA * factB;
btScalar len2 = p.length2();
- if(len2 > SIMD_EPSILON)
+ if (len2 > SIMD_EPSILON)
{
p /= btSqrt(len2);
}
@@ -411,38 +384,38 @@ void btSliderConstraint::getInfo2NonVirtual(btConstraintInfo2* info, const btTra
// fill two rows
tmpA = relA.cross(p);
tmpB = relB.cross(p);
- for (i=0; i<3; i++) info->m_J1angularAxis[s2+i] = tmpA[i];
- for (i=0; i<3; i++) info->m_J2angularAxis[s2+i] = -tmpB[i];
+ for (i = 0; i < 3; i++) info->m_J1angularAxis[s2 + i] = tmpA[i];
+ for (i = 0; i < 3; i++) info->m_J2angularAxis[s2 + i] = -tmpB[i];
tmpA = relA.cross(q);
tmpB = relB.cross(q);
- if(hasStaticBody && getSolveAngLimit())
- { // to make constraint between static and dynamic objects more rigid
+ if (hasStaticBody && getSolveAngLimit())
+ { // to make constraint between static and dynamic objects more rigid
// remove wA (or wB) from equation if angular limit is hit
tmpB *= factB;
tmpA *= factA;
}
- for (i=0; i<3; i++) info->m_J1angularAxis[s3+i] = tmpA[i];
- for (i=0; i<3; i++) info->m_J2angularAxis[s3+i] = -tmpB[i];
- for (i=0; i<3; i++) info->m_J1linearAxis[s2+i] = p[i];
- for (i=0; i<3; i++) info->m_J1linearAxis[s3+i] = q[i];
- for (i=0; i<3; i++) info->m_J2linearAxis[s2+i] = -p[i];
- for (i=0; i<3; i++) info->m_J2linearAxis[s3+i] = -q[i];
+ for (i = 0; i < 3; i++) info->m_J1angularAxis[s3 + i] = tmpA[i];
+ for (i = 0; i < 3; i++) info->m_J2angularAxis[s3 + i] = -tmpB[i];
+ for (i = 0; i < 3; i++) info->m_J1linearAxis[s2 + i] = p[i];
+ for (i = 0; i < 3; i++) info->m_J1linearAxis[s3 + i] = q[i];
+ for (i = 0; i < 3; i++) info->m_J2linearAxis[s2 + i] = -p[i];
+ for (i = 0; i < 3; i++) info->m_J2linearAxis[s3 + i] = -q[i];
}
else
- { // old way - maybe incorrect if bodies are not on the slider axis
+ { // old way - maybe incorrect if bodies are not on the slider axis
// see discussion "Bug in slider constraint" http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?f=9&t=4024&start=0
c = bodyB_trans.getOrigin() - bodyA_trans.getOrigin();
btVector3 tmp = c.cross(p);
- for (i=0; i<3; i++) info->m_J1angularAxis[s2+i] = factA*tmp[i];
- for (i=0; i<3; i++) info->m_J2angularAxis[s2+i] = factB*tmp[i];
+ for (i = 0; i < 3; i++) info->m_J1angularAxis[s2 + i] = factA * tmp[i];
+ for (i = 0; i < 3; i++) info->m_J2angularAxis[s2 + i] = factB * tmp[i];
tmp = c.cross(q);
- for (i=0; i<3; i++) info->m_J1angularAxis[s3+i] = factA*tmp[i];
- for (i=0; i<3; i++) info->m_J2angularAxis[s3+i] = factB*tmp[i];
+ for (i = 0; i < 3; i++) info->m_J1angularAxis[s3 + i] = factA * tmp[i];
+ for (i = 0; i < 3; i++) info->m_J2angularAxis[s3 + i] = factB * tmp[i];
- for (i=0; i<3; i++) info->m_J1linearAxis[s2+i] = p[i];
- for (i=0; i<3; i++) info->m_J1linearAxis[s3+i] = q[i];
- for (i=0; i<3; i++) info->m_J2linearAxis[s2+i] = -p[i];
- for (i=0; i<3; i++) info->m_J2linearAxis[s3+i] = -q[i];
+ for (i = 0; i < 3; i++) info->m_J1linearAxis[s2 + i] = p[i];
+ for (i = 0; i < 3; i++) info->m_J1linearAxis[s3 + i] = q[i];
+ for (i = 0; i < 3; i++) info->m_J2linearAxis[s2 + i] = -p[i];
+ for (i = 0; i < 3; i++) info->m_J2linearAxis[s3 + i] = -q[i];
}
// compute two elements of right hand side
@@ -454,19 +427,18 @@ void btSliderConstraint::getInfo2NonVirtual(btConstraintInfo2* info, const btTra
info->m_constraintError[s2] = rhs;
rhs = k * q.dot(ofs);
info->m_constraintError[s3] = rhs;
- if(m_flags & BT_SLIDER_FLAGS_CFM_ORTLIN)
+ if (m_flags & BT_SLIDER_FLAGS_CFM_ORTLIN)
{
info->cfm[s2] = m_cfmOrthoLin;
info->cfm[s3] = m_cfmOrthoLin;
}
-
// check linear limits
limit_err = btScalar(0.0);
limit = 0;
- if(getSolveLinLimit())
+ if (getSolveLinLimit())
{
- limit_err = getLinDepth() * signFact;
+ limit_err = getLinDepth() * signFact;
limit = (limit_err > btScalar(0.0)) ? 2 : 1;
}
bool powered = getPoweredLinMotor();
@@ -475,12 +447,12 @@ void btSliderConstraint::getInfo2NonVirtual(btConstraintInfo2* info, const btTra
{
nrow++;
srow = nrow * info->rowskip;
- info->m_J1linearAxis[srow+0] = ax1[0];
- info->m_J1linearAxis[srow+1] = ax1[1];
- info->m_J1linearAxis[srow+2] = ax1[2];
- info->m_J2linearAxis[srow+0] = -ax1[0];
- info->m_J2linearAxis[srow+1] = -ax1[1];
- info->m_J2linearAxis[srow+2] = -ax1[2];
+ info->m_J1linearAxis[srow + 0] = ax1[0];
+ info->m_J1linearAxis[srow + 1] = ax1[1];
+ info->m_J1linearAxis[srow + 2] = ax1[2];
+ info->m_J2linearAxis[srow + 0] = -ax1[0];
+ info->m_J2linearAxis[srow + 1] = -ax1[1];
+ info->m_J2linearAxis[srow + 2] = -ax1[2];
// linear torque decoupling step:
//
// we have to be careful that the linear constraint forces (+/- ax1) applied to the two bodies
@@ -488,36 +460,36 @@ void btSliderConstraint::getInfo2NonVirtual(btConstraintInfo2* info, const btTra
// constraint force is applied at must lie along the same ax1 axis.
// a torque couple will result in limited slider-jointed free
// bodies from gaining angular momentum.
- if(m_useOffsetForConstraintFrame)
+ if (m_useOffsetForConstraintFrame)
{
// this is needed only when bodyA and bodyB are both dynamic.
- if(!hasStaticBody)
+ if (!hasStaticBody)
{
tmpA = relA.cross(ax1);
tmpB = relB.cross(ax1);
- info->m_J1angularAxis[srow+0] = tmpA[0];
- info->m_J1angularAxis[srow+1] = tmpA[1];
- info->m_J1angularAxis[srow+2] = tmpA[2];
- info->m_J2angularAxis[srow+0] = -tmpB[0];
- info->m_J2angularAxis[srow+1] = -tmpB[1];
- info->m_J2angularAxis[srow+2] = -tmpB[2];
+ info->m_J1angularAxis[srow + 0] = tmpA[0];
+ info->m_J1angularAxis[srow + 1] = tmpA[1];
+ info->m_J1angularAxis[srow + 2] = tmpA[2];
+ info->m_J2angularAxis[srow + 0] = -tmpB[0];
+ info->m_J2angularAxis[srow + 1] = -tmpB[1];
+ info->m_J2angularAxis[srow + 2] = -tmpB[2];
}
}
else
- { // The old way. May be incorrect if bodies are not on the slider axis
- btVector3 ltd; // Linear Torque Decoupling vector (a torque)
+ { // The old way. May be incorrect if bodies are not on the slider axis
+ btVector3 ltd; // Linear Torque Decoupling vector (a torque)
ltd = c.cross(ax1);
- info->m_J1angularAxis[srow+0] = factA*ltd[0];
- info->m_J1angularAxis[srow+1] = factA*ltd[1];
- info->m_J1angularAxis[srow+2] = factA*ltd[2];
- info->m_J2angularAxis[srow+0] = factB*ltd[0];
- info->m_J2angularAxis[srow+1] = factB*ltd[1];
- info->m_J2angularAxis[srow+2] = factB*ltd[2];
+ info->m_J1angularAxis[srow + 0] = factA * ltd[0];
+ info->m_J1angularAxis[srow + 1] = factA * ltd[1];
+ info->m_J1angularAxis[srow + 2] = factA * ltd[2];
+ info->m_J2angularAxis[srow + 0] = factB * ltd[0];
+ info->m_J2angularAxis[srow + 1] = factB * ltd[1];
+ info->m_J2angularAxis[srow + 2] = factB * ltd[2];
}
// right-hand part
btScalar lostop = getLowerLinLimit();
btScalar histop = getUpperLinLimit();
- if(limit && (lostop == histop))
+ if (limit && (lostop == histop))
{ // the joint motor is ineffective
powered = false;
}
@@ -525,9 +497,9 @@ void btSliderConstraint::getInfo2NonVirtual(btConstraintInfo2* info, const btTra
info->m_lowerLimit[srow] = 0.;
info->m_upperLimit[srow] = 0.;
currERP = (m_flags & BT_SLIDER_FLAGS_ERP_LIMLIN) ? m_softnessLimLin : info->erp;
- if(powered)
+ if (powered)
{
- if(m_flags & BT_SLIDER_FLAGS_CFM_DIRLIN)
+ if (m_flags & BT_SLIDER_FLAGS_CFM_DIRLIN)
{
info->cfm[srow] = m_cfmDirLin;
}
@@ -537,41 +509,41 @@ void btSliderConstraint::getInfo2NonVirtual(btConstraintInfo2* info, const btTra
info->m_lowerLimit[srow] += -getMaxLinMotorForce() / info->fps;
info->m_upperLimit[srow] += getMaxLinMotorForce() / info->fps;
}
- if(limit)
+ if (limit)
{
k = info->fps * currERP;
info->m_constraintError[srow] += k * limit_err;
- if(m_flags & BT_SLIDER_FLAGS_CFM_LIMLIN)
+ if (m_flags & BT_SLIDER_FLAGS_CFM_LIMLIN)
{
info->cfm[srow] = m_cfmLimLin;
}
- if(lostop == histop)
- { // limited low and high simultaneously
+ if (lostop == histop)
+ { // limited low and high simultaneously
info->m_lowerLimit[srow] = -SIMD_INFINITY;
info->m_upperLimit[srow] = SIMD_INFINITY;
}
- else if(limit == 1)
- { // low limit
+ else if (limit == 1)
+ { // low limit
info->m_lowerLimit[srow] = -SIMD_INFINITY;
info->m_upperLimit[srow] = 0;
}
- else
- { // high limit
+ else
+ { // high limit
info->m_lowerLimit[srow] = 0;
info->m_upperLimit[srow] = SIMD_INFINITY;
}
// bounce (we'll use slider parameter abs(1.0 - m_dampingLimLin) for that)
btScalar bounce = btFabs(btScalar(1.0) - getDampingLimLin());
- if(bounce > btScalar(0.0))
+ if (bounce > btScalar(0.0))
{
btScalar vel = linVelA.dot(ax1);
vel -= linVelB.dot(ax1);
vel *= signFact;
// only apply bounce if the velocity is incoming, and if the
// resulting c[] exceeds what we already have.
- if(limit == 1)
- { // low limit
- if(vel < 0)
+ if (limit == 1)
+ { // low limit
+ if (vel < 0)
{
btScalar newc = -bounce * vel;
if (newc > info->m_constraintError[srow])
@@ -581,11 +553,11 @@ void btSliderConstraint::getInfo2NonVirtual(btConstraintInfo2* info, const btTra
}
}
else
- { // high limit - all those computations are reversed
- if(vel > 0)
+ { // high limit - all those computations are reversed
+ if (vel > 0)
{
btScalar newc = -bounce * vel;
- if(newc < info->m_constraintError[srow])
+ if (newc < info->m_constraintError[srow])
{
info->m_constraintError[srow] = newc;
}
@@ -593,40 +565,40 @@ void btSliderConstraint::getInfo2NonVirtual(btConstraintInfo2* info, const btTra
}
}
info->m_constraintError[srow] *= getSoftnessLimLin();
- } // if(limit)
- } // if linear limit
+ } // if(limit)
+ } // if linear limit
// check angular limits
limit_err = btScalar(0.0);
limit = 0;
- if(getSolveAngLimit())
+ if (getSolveAngLimit())
{
limit_err = getAngDepth();
limit = (limit_err > btScalar(0.0)) ? 1 : 2;
}
// if the slider has joint limits, add in the extra row
powered = getPoweredAngMotor();
- if(limit || powered)
+ if (limit || powered)
{
nrow++;
srow = nrow * info->rowskip;
- info->m_J1angularAxis[srow+0] = ax1[0];
- info->m_J1angularAxis[srow+1] = ax1[1];
- info->m_J1angularAxis[srow+2] = ax1[2];
+ info->m_J1angularAxis[srow + 0] = ax1[0];
+ info->m_J1angularAxis[srow + 1] = ax1[1];
+ info->m_J1angularAxis[srow + 2] = ax1[2];
- info->m_J2angularAxis[srow+0] = -ax1[0];
- info->m_J2angularAxis[srow+1] = -ax1[1];
- info->m_J2angularAxis[srow+2] = -ax1[2];
+ info->m_J2angularAxis[srow + 0] = -ax1[0];
+ info->m_J2angularAxis[srow + 1] = -ax1[1];
+ info->m_J2angularAxis[srow + 2] = -ax1[2];
btScalar lostop = getLowerAngLimit();
btScalar histop = getUpperAngLimit();
- if(limit && (lostop == histop))
+ if (limit && (lostop == histop))
{ // the joint motor is ineffective
powered = false;
}
currERP = (m_flags & BT_SLIDER_FLAGS_ERP_LIMANG) ? m_softnessLimAng : info->erp;
- if(powered)
+ if (powered)
{
- if(m_flags & BT_SLIDER_FLAGS_CFM_DIRANG)
+ if (m_flags & BT_SLIDER_FLAGS_CFM_DIRANG)
{
info->cfm[srow] = m_cfmDirAng;
}
@@ -635,55 +607,55 @@ void btSliderConstraint::getInfo2NonVirtual(btConstraintInfo2* info, const btTra
info->m_lowerLimit[srow] = -getMaxAngMotorForce() / info->fps;
info->m_upperLimit[srow] = getMaxAngMotorForce() / info->fps;
}
- if(limit)
+ if (limit)
{
k = info->fps * currERP;
info->m_constraintError[srow] += k * limit_err;
- if(m_flags & BT_SLIDER_FLAGS_CFM_LIMANG)
+ if (m_flags & BT_SLIDER_FLAGS_CFM_LIMANG)
{
info->cfm[srow] = m_cfmLimAng;
}
- if(lostop == histop)
+ if (lostop == histop)
{
// limited low and high simultaneously
info->m_lowerLimit[srow] = -SIMD_INFINITY;
info->m_upperLimit[srow] = SIMD_INFINITY;
}
- else if(limit == 1)
- { // low limit
+ else if (limit == 1)
+ { // low limit
info->m_lowerLimit[srow] = 0;
info->m_upperLimit[srow] = SIMD_INFINITY;
}
- else
- { // high limit
+ else
+ { // high limit
info->m_lowerLimit[srow] = -SIMD_INFINITY;
info->m_upperLimit[srow] = 0;
}
// bounce (we'll use slider parameter abs(1.0 - m_dampingLimAng) for that)
btScalar bounce = btFabs(btScalar(1.0) - getDampingLimAng());
- if(bounce > btScalar(0.0))
+ if (bounce > btScalar(0.0))
{
btScalar vel = m_rbA.getAngularVelocity().dot(ax1);
vel -= m_rbB.getAngularVelocity().dot(ax1);
// only apply bounce if the velocity is incoming, and if the
// resulting c[] exceeds what we already have.
- if(limit == 1)
- { // low limit
- if(vel < 0)
+ if (limit == 1)
+ { // low limit
+ if (vel < 0)
{
btScalar newc = -bounce * vel;
- if(newc > info->m_constraintError[srow])
+ if (newc > info->m_constraintError[srow])
{
info->m_constraintError[srow] = newc;
}
}
}
else
- { // high limit - all those computations are reversed
- if(vel > 0)
+ { // high limit - all those computations are reversed
+ if (vel > 0)
{
btScalar newc = -bounce * vel;
- if(newc < info->m_constraintError[srow])
+ if (newc < info->m_constraintError[srow])
{
info->m_constraintError[srow] = newc;
}
@@ -691,165 +663,161 @@ void btSliderConstraint::getInfo2NonVirtual(btConstraintInfo2* info, const btTra
}
}
info->m_constraintError[srow] *= getSoftnessLimAng();
- } // if(limit)
- } // if angular limit or powered
+ } // if(limit)
+ } // if angular limit or powered
}
-
-///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5).
+///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.
void btSliderConstraint::setParam(int num, btScalar value, int axis)
{
- switch(num)
+ switch (num)
{
- case BT_CONSTRAINT_STOP_ERP :
- if(axis < 1)
- {
- m_softnessLimLin = value;
- m_flags |= BT_SLIDER_FLAGS_ERP_LIMLIN;
- }
- else if(axis < 3)
- {
- m_softnessOrthoLin = value;
- m_flags |= BT_SLIDER_FLAGS_ERP_ORTLIN;
- }
- else if(axis == 3)
- {
- m_softnessLimAng = value;
- m_flags |= BT_SLIDER_FLAGS_ERP_LIMANG;
- }
- else if(axis < 6)
- {
- m_softnessOrthoAng = value;
- m_flags |= BT_SLIDER_FLAGS_ERP_ORTANG;
- }
- else
- {
- btAssertConstrParams(0);
- }
- break;
- case BT_CONSTRAINT_CFM :
- if(axis < 1)
- {
- m_cfmDirLin = value;
- m_flags |= BT_SLIDER_FLAGS_CFM_DIRLIN;
- }
- else if(axis == 3)
- {
- m_cfmDirAng = value;
- m_flags |= BT_SLIDER_FLAGS_CFM_DIRANG;
- }
- else
- {
- btAssertConstrParams(0);
- }
- break;
- case BT_CONSTRAINT_STOP_CFM :
- if(axis < 1)
- {
- m_cfmLimLin = value;
- m_flags |= BT_SLIDER_FLAGS_CFM_LIMLIN;
- }
- else if(axis < 3)
- {
- m_cfmOrthoLin = value;
- m_flags |= BT_SLIDER_FLAGS_CFM_ORTLIN;
- }
- else if(axis == 3)
- {
- m_cfmLimAng = value;
- m_flags |= BT_SLIDER_FLAGS_CFM_LIMANG;
- }
- else if(axis < 6)
- {
- m_cfmOrthoAng = value;
- m_flags |= BT_SLIDER_FLAGS_CFM_ORTANG;
- }
- else
- {
- btAssertConstrParams(0);
- }
- break;
+ case BT_CONSTRAINT_STOP_ERP:
+ if (axis < 1)
+ {
+ m_softnessLimLin = value;
+ m_flags |= BT_SLIDER_FLAGS_ERP_LIMLIN;
+ }
+ else if (axis < 3)
+ {
+ m_softnessOrthoLin = value;
+ m_flags |= BT_SLIDER_FLAGS_ERP_ORTLIN;
+ }
+ else if (axis == 3)
+ {
+ m_softnessLimAng = value;
+ m_flags |= BT_SLIDER_FLAGS_ERP_LIMANG;
+ }
+ else if (axis < 6)
+ {
+ m_softnessOrthoAng = value;
+ m_flags |= BT_SLIDER_FLAGS_ERP_ORTANG;
+ }
+ else
+ {
+ btAssertConstrParams(0);
+ }
+ break;
+ case BT_CONSTRAINT_CFM:
+ if (axis < 1)
+ {
+ m_cfmDirLin = value;
+ m_flags |= BT_SLIDER_FLAGS_CFM_DIRLIN;
+ }
+ else if (axis == 3)
+ {
+ m_cfmDirAng = value;
+ m_flags |= BT_SLIDER_FLAGS_CFM_DIRANG;
+ }
+ else
+ {
+ btAssertConstrParams(0);
+ }
+ break;
+ case BT_CONSTRAINT_STOP_CFM:
+ if (axis < 1)
+ {
+ m_cfmLimLin = value;
+ m_flags |= BT_SLIDER_FLAGS_CFM_LIMLIN;
+ }
+ else if (axis < 3)
+ {
+ m_cfmOrthoLin = value;
+ m_flags |= BT_SLIDER_FLAGS_CFM_ORTLIN;
+ }
+ else if (axis == 3)
+ {
+ m_cfmLimAng = value;
+ m_flags |= BT_SLIDER_FLAGS_CFM_LIMANG;
+ }
+ else if (axis < 6)
+ {
+ m_cfmOrthoAng = value;
+ m_flags |= BT_SLIDER_FLAGS_CFM_ORTANG;
+ }
+ else
+ {
+ btAssertConstrParams(0);
+ }
+ break;
}
}
///return the local value of parameter
-btScalar btSliderConstraint::getParam(int num, int axis) const
+btScalar btSliderConstraint::getParam(int num, int axis) const
{
btScalar retVal(SIMD_INFINITY);
- switch(num)
+ switch (num)
{
- case BT_CONSTRAINT_STOP_ERP :
- if(axis < 1)
- {
- btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_ERP_LIMLIN);
- retVal = m_softnessLimLin;
- }
- else if(axis < 3)
- {
- btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_ERP_ORTLIN);
- retVal = m_softnessOrthoLin;
- }
- else if(axis == 3)
- {
- btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_ERP_LIMANG);
- retVal = m_softnessLimAng;
- }
- else if(axis < 6)
- {
- btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_ERP_ORTANG);
- retVal = m_softnessOrthoAng;
- }
- else
- {
- btAssertConstrParams(0);
- }
- break;
- case BT_CONSTRAINT_CFM :
- if(axis < 1)
- {
- btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_CFM_DIRLIN);
- retVal = m_cfmDirLin;
- }
- else if(axis == 3)
- {
- btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_CFM_DIRANG);
- retVal = m_cfmDirAng;
- }
- else
- {
- btAssertConstrParams(0);
- }
- break;
- case BT_CONSTRAINT_STOP_CFM :
- if(axis < 1)
- {
- btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_CFM_LIMLIN);
- retVal = m_cfmLimLin;
- }
- else if(axis < 3)
- {
- btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_CFM_ORTLIN);
- retVal = m_cfmOrthoLin;
- }
- else if(axis == 3)
- {
- btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_CFM_LIMANG);
- retVal = m_cfmLimAng;
- }
- else if(axis < 6)
- {
- btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_CFM_ORTANG);
- retVal = m_cfmOrthoAng;
- }
- else
- {
- btAssertConstrParams(0);
- }
- break;
+ case BT_CONSTRAINT_STOP_ERP:
+ if (axis < 1)
+ {
+ btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_ERP_LIMLIN);
+ retVal = m_softnessLimLin;
+ }
+ else if (axis < 3)
+ {
+ btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_ERP_ORTLIN);
+ retVal = m_softnessOrthoLin;
+ }
+ else if (axis == 3)
+ {
+ btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_ERP_LIMANG);
+ retVal = m_softnessLimAng;
+ }
+ else if (axis < 6)
+ {
+ btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_ERP_ORTANG);
+ retVal = m_softnessOrthoAng;
+ }
+ else
+ {
+ btAssertConstrParams(0);
+ }
+ break;
+ case BT_CONSTRAINT_CFM:
+ if (axis < 1)
+ {
+ btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_CFM_DIRLIN);
+ retVal = m_cfmDirLin;
+ }
+ else if (axis == 3)
+ {
+ btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_CFM_DIRANG);
+ retVal = m_cfmDirAng;
+ }
+ else
+ {
+ btAssertConstrParams(0);
+ }
+ break;
+ case BT_CONSTRAINT_STOP_CFM:
+ if (axis < 1)
+ {
+ btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_CFM_LIMLIN);
+ retVal = m_cfmLimLin;
+ }
+ else if (axis < 3)
+ {
+ btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_CFM_ORTLIN);
+ retVal = m_cfmOrthoLin;
+ }
+ else if (axis == 3)
+ {
+ btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_CFM_LIMANG);
+ retVal = m_cfmLimAng;
+ }
+ else if (axis < 6)
+ {
+ btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_CFM_ORTANG);
+ retVal = m_cfmOrthoAng;
+ }
+ else
+ {
+ btAssertConstrParams(0);
+ }
+ break;
}
return retVal;
}
-
-
-
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSliderConstraint.h b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSliderConstraint.h
index 1957f08a96..75ca34e978 100755
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSliderConstraint.h
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSliderConstraint.h
@@ -25,31 +25,26 @@ TODO:
#ifndef BT_SLIDER_CONSTRAINT_H
#define BT_SLIDER_CONSTRAINT_H
-#include "LinearMath/btScalar.h"//for BT_USE_DOUBLE_PRECISION
+#include "LinearMath/btScalar.h" //for BT_USE_DOUBLE_PRECISION
#ifdef BT_USE_DOUBLE_PRECISION
-#define btSliderConstraintData2 btSliderConstraintDoubleData
-#define btSliderConstraintDataName "btSliderConstraintDoubleData"
+#define btSliderConstraintData2 btSliderConstraintDoubleData
+#define btSliderConstraintDataName "btSliderConstraintDoubleData"
#else
-#define btSliderConstraintData2 btSliderConstraintData
-#define btSliderConstraintDataName "btSliderConstraintData"
-#endif //BT_USE_DOUBLE_PRECISION
+#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))
-
+#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
{
@@ -67,15 +62,15 @@ enum btSliderFlags
BT_SLIDER_FLAGS_ERP_LIMANG = (1 << 11)
};
-
-ATTRIBUTE_ALIGNED16(class) btSliderConstraint : public btTypedConstraint
+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;
+ bool m_useSolveConstraintObsolete;
+ bool m_useOffsetForConstraintFrame;
+ btTransform m_frameInA;
+ btTransform m_frameInB;
// use frameA fo define limits, if true
bool m_useLinearReferenceFrameA;
// linear limits
@@ -119,21 +114,21 @@ protected:
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_jacLin[3];
+ btScalar m_jacLinDiagABInv[3];
- btJacobianEntry m_jacAng[3];
+ btJacobianEntry m_jacAng[3];
btScalar m_timeStep;
- btTransform m_calculatedTransformA;
- btTransform m_calculatedTransformB;
+ btTransform m_calculatedTransformA;
+ btTransform m_calculatedTransformB;
btVector3 m_sliderAxis;
btVector3 m_realPivotAInW;
@@ -150,57 +145,57 @@ protected:
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;
-
- //------------------------
+ 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);
+ 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);
+ virtual void getInfo1(btConstraintInfo1 * info);
- void getInfo1NonVirtual(btConstraintInfo1* info);
-
- virtual void getInfo2 (btConstraintInfo2* info);
+ void getInfo1NonVirtual(btConstraintInfo1 * info);
- void getInfo2NonVirtual(btConstraintInfo2* info, const btTransform& transA, const btTransform& transB,const btVector3& linVelA,const btVector3& linVelB, btScalar rbAinvMass,btScalar rbBinvMass);
+ 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); }
+ 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 getDampingDirLin() { return m_dampingDirLin; }
btScalar getSoftnessDirAng() { return m_softnessDirAng; }
btScalar getRestitutionDirAng() { return m_restitutionDirAng; }
btScalar getDampingDirAng() { return m_dampingDirAng; }
@@ -249,8 +244,6 @@ public:
btScalar getLinearPos() const { return m_linPos; }
btScalar getAngularPos() const { return m_angPos; }
-
-
// access for ODE solver
bool getSolveLinLimit() { return m_solveLinLim; }
@@ -258,9 +251,9 @@ public:
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();
+ void calculateTransforms(const btTransform& transA, const btTransform& transB);
+ void testLinLimits();
+ void testAngLimits();
// access for PE Solver
btVector3 getAncorInA();
btVector3 getAncorInB();
@@ -268,84 +261,75 @@ public:
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());
+ 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).
+ ///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 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
- {
+ virtual btScalar getParam(int num, int axis = -1) const;
+
+ virtual int getFlags() const
+ {
return m_flags;
}
- virtual int calculateSerializeBufferSize() 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;
-
-
+ 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.
+ 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;
+ float m_linearUpperLimit;
+ float m_linearLowerLimit;
- int m_useLinearReferenceFrameA;
- int m_useOffsetForConstraintFrame;
+ 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.
+ 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;
+ double m_linearUpperLimit;
+ double m_linearLowerLimit;
- int m_useLinearReferenceFrameA;
- int m_useOffsetForConstraintFrame;
+ double m_angularUpperLimit;
+ double m_angularLowerLimit;
+ int m_useLinearReferenceFrameA;
+ int m_useOffsetForConstraintFrame;
};
-SIMD_FORCE_INLINE int btSliderConstraint::calculateSerializeBufferSize() const
+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
+///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);
+ btSliderConstraintData2* sliderData = (btSliderConstraintData2*)dataBuffer;
+ btTypedConstraint::serialize(&sliderData->m_typeConstraintData, serializer);
m_frameInA.serialize(sliderData->m_rbAFrame);
m_frameInB.serialize(sliderData->m_rbBFrame);
@@ -362,7 +346,4 @@ SIMD_FORCE_INLINE const char* btSliderConstraint::serialize(void* dataBuffer, bt
return btSliderConstraintDataName;
}
-
-
-#endif //BT_SLIDER_CONSTRAINT_H
-
+#endif //BT_SLIDER_CONSTRAINT_H
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.cpp b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.cpp
index 0c7dbd668b..1ea20edcb2 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.cpp
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.cpp
@@ -13,43 +13,38 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
-
#include "btSolve2LinearConstraint.h"
#include "BulletDynamics/Dynamics/btRigidBody.h"
#include "LinearMath/btVector3.h"
#include "btJacobianEntry.h"
-
void btSolve2LinearConstraint::resolveUnilateralPairConstraint(
- btRigidBody* body1,
- btRigidBody* body2,
-
- 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)
+ btRigidBody* body1,
+ btRigidBody* body2,
+
+ 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)linvelA;
(void)linvelB;
(void)angvelB;
(void)angvelA;
-
-
imp0 = btScalar(0.);
imp1 = btScalar(0.);
@@ -59,86 +54,76 @@ void btSolve2LinearConstraint::resolveUnilateralPairConstraint(
btAssert(len < SIMD_EPSILON);
-
//this jacobian entry could be re-used for all iterations
- btJacobianEntry jacA(world2A,world2B,rel_posA1,rel_posA2,normalA,invInertiaADiag,invMassA,
- invInertiaBDiag,invMassB);
- btJacobianEntry jacB(world2A,world2B,rel_posB1,rel_posB2,normalB,invInertiaADiag,invMassA,
- invInertiaBDiag,invMassB);
-
+ btJacobianEntry jacA(world2A, world2B, rel_posA1, rel_posA2, normalA, invInertiaADiag, invMassA,
+ invInertiaBDiag, invMassB);
+ btJacobianEntry jacB(world2A, world2B, rel_posB1, rel_posB2, normalB, invInertiaADiag, invMassA,
+ invInertiaBDiag, invMassB);
+
//const btScalar vel0 = jacA.getRelativeVelocity(linvelA,angvelA,linvelB,angvelB);
//const btScalar vel1 = jacB.getRelativeVelocity(linvelA,angvelA,linvelB,angvelB);
- const btScalar vel0 = normalA.dot(body1->getVelocityInLocalPoint(rel_posA1)-body2->getVelocityInLocalPoint(rel_posA1));
- const btScalar vel1 = normalB.dot(body1->getVelocityInLocalPoint(rel_posB1)-body2->getVelocityInLocalPoint(rel_posB1));
+ const btScalar vel0 = normalA.dot(body1->getVelocityInLocalPoint(rel_posA1) - body2->getVelocityInLocalPoint(rel_posA1));
+ const btScalar vel1 = normalB.dot(body1->getVelocityInLocalPoint(rel_posB1) - body2->getVelocityInLocalPoint(rel_posB1));
-// btScalar penetrationImpulse = (depth*contactTau*timeCorrection) * massTerm;//jacDiagABInv
+ // btScalar penetrationImpulse = (depth*contactTau*timeCorrection) * massTerm;//jacDiagABInv
btScalar massTerm = btScalar(1.) / (invMassA + invMassB);
-
// calculate rhs (or error) terms
- const btScalar dv0 = depthA * m_tau * massTerm - vel0 * m_damping;
- const btScalar dv1 = depthB * m_tau * massTerm - vel1 * m_damping;
-
+ const btScalar dv0 = depthA * m_tau * massTerm - vel0 * m_damping;
+ const btScalar dv1 = depthB * m_tau * massTerm - vel1 * m_damping;
// dC/dv * dv = -C
-
+
// jacobian * impulse = -error
//
//impulse = jacobianInverse * -error
// inverting 2x2 symmetric system (offdiagonal are equal!)
- //
+ //
+ btScalar nonDiag = jacA.getNonDiagonal(jacB, invMassA, invMassB);
+ btScalar invDet = btScalar(1.0) / (jacA.getDiagonal() * jacB.getDiagonal() - nonDiag * nonDiag);
- btScalar nonDiag = jacA.getNonDiagonal(jacB,invMassA,invMassB);
- btScalar invDet = btScalar(1.0) / (jacA.getDiagonal() * jacB.getDiagonal() - nonDiag * nonDiag );
-
//imp0 = dv0 * jacA.getDiagonal() * invDet + dv1 * -nonDiag * invDet;
//imp1 = dv1 * jacB.getDiagonal() * invDet + dv0 * - nonDiag * invDet;
imp0 = dv0 * jacA.getDiagonal() * invDet + dv1 * -nonDiag * invDet;
- imp1 = dv1 * jacB.getDiagonal() * invDet + dv0 * - nonDiag * invDet;
+ imp1 = dv1 * jacB.getDiagonal() * invDet + dv0 * -nonDiag * invDet;
//[a b] [d -c]
//[c d] inverse = (1 / determinant) * [-b a] where determinant is (ad - bc)
//[jA nD] * [imp0] = [dv0]
//[nD jB] [imp1] [dv1]
-
}
-
-
void btSolve2LinearConstraint::resolveBilateralPairConstraint(
- btRigidBody* body1,
- btRigidBody* body2,
- 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)
+ btRigidBody* body1,
+ btRigidBody* body2,
+ 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)linvelA;
(void)linvelB;
(void)angvelA;
(void)angvelB;
-
-
imp0 = btScalar(0.);
imp1 = btScalar(0.);
@@ -148,42 +133,40 @@ void btSolve2LinearConstraint::resolveBilateralPairConstraint(
btAssert(len < SIMD_EPSILON);
-
//this jacobian entry could be re-used for all iterations
- btJacobianEntry jacA(world2A,world2B,rel_posA1,rel_posA2,normalA,invInertiaADiag,invMassA,
- invInertiaBDiag,invMassB);
- btJacobianEntry jacB(world2A,world2B,rel_posB1,rel_posB2,normalB,invInertiaADiag,invMassA,
- invInertiaBDiag,invMassB);
-
+ btJacobianEntry jacA(world2A, world2B, rel_posA1, rel_posA2, normalA, invInertiaADiag, invMassA,
+ invInertiaBDiag, invMassB);
+ btJacobianEntry jacB(world2A, world2B, rel_posB1, rel_posB2, normalB, invInertiaADiag, invMassA,
+ invInertiaBDiag, invMassB);
+
//const btScalar vel0 = jacA.getRelativeVelocity(linvelA,angvelA,linvelB,angvelB);
//const btScalar vel1 = jacB.getRelativeVelocity(linvelA,angvelA,linvelB,angvelB);
- const btScalar vel0 = normalA.dot(body1->getVelocityInLocalPoint(rel_posA1)-body2->getVelocityInLocalPoint(rel_posA1));
- const btScalar vel1 = normalB.dot(body1->getVelocityInLocalPoint(rel_posB1)-body2->getVelocityInLocalPoint(rel_posB1));
+ const btScalar vel0 = normalA.dot(body1->getVelocityInLocalPoint(rel_posA1) - body2->getVelocityInLocalPoint(rel_posA1));
+ const btScalar vel1 = normalB.dot(body1->getVelocityInLocalPoint(rel_posB1) - body2->getVelocityInLocalPoint(rel_posB1));
// calculate rhs (or error) terms
- const btScalar dv0 = depthA * m_tau - vel0 * m_damping;
- const btScalar dv1 = depthB * m_tau - vel1 * m_damping;
+ const btScalar dv0 = depthA * m_tau - vel0 * m_damping;
+ const btScalar dv1 = depthB * m_tau - vel1 * m_damping;
// dC/dv * dv = -C
-
+
// jacobian * impulse = -error
//
//impulse = jacobianInverse * -error
// inverting 2x2 symmetric system (offdiagonal are equal!)
- //
+ //
+ btScalar nonDiag = jacA.getNonDiagonal(jacB, invMassA, invMassB);
+ btScalar invDet = btScalar(1.0) / (jacA.getDiagonal() * jacB.getDiagonal() - nonDiag * nonDiag);
- btScalar nonDiag = jacA.getNonDiagonal(jacB,invMassA,invMassB);
- btScalar invDet = btScalar(1.0) / (jacA.getDiagonal() * jacB.getDiagonal() - nonDiag * nonDiag );
-
//imp0 = dv0 * jacA.getDiagonal() * invDet + dv1 * -nonDiag * invDet;
//imp1 = dv1 * jacB.getDiagonal() * invDet + dv0 * - nonDiag * invDet;
imp0 = dv0 * jacA.getDiagonal() * invDet + dv1 * -nonDiag * invDet;
- imp1 = dv1 * jacB.getDiagonal() * invDet + dv0 * - nonDiag * invDet;
+ imp1 = dv1 * jacB.getDiagonal() * invDet + dv0 * -nonDiag * invDet;
//[a b] [d -c]
//[c d] inverse = (1 / determinant) * [-b a] where determinant is (ad - bc)
@@ -191,9 +174,9 @@ void btSolve2LinearConstraint::resolveBilateralPairConstraint(
//[jA nD] * [imp0] = [dv0]
//[nD jB] [imp1] [dv1]
- if ( imp0 > btScalar(0.0))
+ if (imp0 > btScalar(0.0))
{
- if ( imp1 > btScalar(0.0) )
+ if (imp1 > btScalar(0.0))
{
//both positive
}
@@ -203,9 +186,10 @@ void btSolve2LinearConstraint::resolveBilateralPairConstraint(
// now imp0>0 imp1<0
imp0 = dv0 / jacA.getDiagonal();
- if ( imp0 > btScalar(0.0) )
+ if (imp0 > btScalar(0.0))
{
- } else
+ }
+ else
{
imp0 = btScalar(0.);
}
@@ -216,24 +200,25 @@ void btSolve2LinearConstraint::resolveBilateralPairConstraint(
imp0 = btScalar(0.);
imp1 = dv1 / jacB.getDiagonal();
- if ( imp1 <= btScalar(0.0) )
+ if (imp1 <= btScalar(0.0))
{
imp1 = btScalar(0.);
// now imp0>0 imp1<0
imp0 = dv0 / jacA.getDiagonal();
- if ( imp0 > btScalar(0.0) )
+ if (imp0 > btScalar(0.0))
{
- } else
+ }
+ else
{
imp0 = btScalar(0.);
}
- } else
+ }
+ else
{
}
}
}
-
/*
void btSolve2LinearConstraint::resolveAngularConstraint( const btMatrix3x3& invInertiaAWS,
const btScalar invMassA,
@@ -252,4 +237,3 @@ void btSolve2LinearConstraint::resolveAngularConstraint( const btMatrix3x3& invI
}
*/
-
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.h b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.h
index e8bfabf864..fca8ecec81 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.h
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.h
@@ -19,20 +19,16 @@ subject to the following restrictions:
#include "LinearMath/btMatrix3x3.h"
#include "LinearMath/btVector3.h"
-
class btRigidBody;
-
-
/// constraint class used for lateral tyre friction.
-class btSolve2LinearConstraint
+class btSolve2LinearConstraint
{
- btScalar m_tau;
- btScalar m_damping;
+ btScalar m_tau;
+ btScalar m_damping;
public:
-
- btSolve2LinearConstraint(btScalar tau,btScalar damping)
+ btSolve2LinearConstraint(btScalar tau, btScalar damping)
{
m_tau = tau;
m_damping = damping;
@@ -40,52 +36,51 @@ public:
//
// solve unilateral constraint (equality, direct method)
//
- void resolveUnilateralPairConstraint(
- btRigidBody* body0,
+ 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);
-
+ 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,
+ 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);
-
-/*
+ 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,
@@ -101,7 +96,6 @@ public:
btScalar& imp0,btScalar& imp1);
*/
-
};
-#endif //BT_SOLVE_2LINEAR_CONSTRAINT_H
+#endif //BT_SOLVE_2LINEAR_CONSTRAINT_H
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSolverBody.h b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSolverBody.h
index 27ccefe416..409aa8a08c 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSolverBody.h
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSolverBody.h
@@ -16,7 +16,7 @@ subject to the following restrictions:
#ifndef BT_SOLVER_BODY_H
#define BT_SOLVER_BODY_H
-class btRigidBody;
+class btRigidBody;
#include "LinearMath/btVector3.h"
#include "LinearMath/btMatrix3x3.h"
@@ -26,103 +26,99 @@ class btRigidBody;
///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 //
-
+#endif //
#ifdef USE_SIMD
-struct btSimdScalar
+struct btSimdScalar
{
- SIMD_FORCE_INLINE btSimdScalar()
+ SIMD_FORCE_INLINE btSimdScalar()
{
-
}
- SIMD_FORCE_INLINE btSimdScalar(float fl)
- :m_vec128 (_mm_set1_ps(fl))
+ SIMD_FORCE_INLINE btSimdScalar(float fl)
+ : m_vec128(_mm_set1_ps(fl))
{
}
- SIMD_FORCE_INLINE btSimdScalar(__m128 v128)
- :m_vec128(v128)
+ SIMD_FORCE_INLINE btSimdScalar(__m128 v128)
+ : m_vec128(v128)
{
}
- union
- {
- __m128 m_vec128;
- float m_floats[4];
- int m_ints[4];
- btScalar m_unusedPadding;
+ union {
+ __m128 m_vec128;
+ float m_floats[4];
+ int m_ints[4];
+ btScalar m_unusedPadding;
};
- SIMD_FORCE_INLINE __m128 get128()
+ SIMD_FORCE_INLINE __m128 get128()
{
return m_vec128;
}
- SIMD_FORCE_INLINE const __m128 get128() const
+ SIMD_FORCE_INLINE const __m128 get128() const
{
return m_vec128;
}
- SIMD_FORCE_INLINE void set128(__m128 v128)
+ 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 __m128()
+ {
+ return m_vec128;
}
-
- SIMD_FORCE_INLINE operator float() const
- {
- return m_floats[0];
+ 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)
+SIMD_FORCE_INLINE btSimdScalar
+operator*(const btSimdScalar& v1, const btSimdScalar& v2)
{
- return btSimdScalar(_mm_mul_ps(v1.get128(),v2.get128()));
+ 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)
+SIMD_FORCE_INLINE btSimdScalar
+operator+(const btSimdScalar& v1, const btSimdScalar& v2)
{
- return btSimdScalar(_mm_add_ps(v1.get128(),v2.get128()));
+ 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
+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)
+ 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;
}
@@ -131,56 +127,50 @@ ATTRIBUTE_ALIGNED16 (struct) btSolverBody
{
return m_worldTransform;
}
-
-
- SIMD_FORCE_INLINE void getVelocityInLocalPointNoDelta(const btVector3& rel_pos, btVector3& velocity ) const
+ 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);
+ velocity = m_linearVelocity + m_externalForceImpulse + (m_angularVelocity + m_externalTorqueImpulse).cross(rel_pos);
else
- velocity.setValue(0,0,0);
+ velocity.setValue(0, 0, 0);
}
-
- SIMD_FORCE_INLINE void getVelocityInLocalPointObsolete(const btVector3& rel_pos, btVector3& velocity ) const
+ 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);
+ velocity = m_linearVelocity + m_deltaLinearVelocity + (m_angularVelocity + m_deltaAngularVelocity).cross(rel_pos);
else
- velocity.setValue(0,0,0);
+ velocity.setValue(0, 0, 0);
}
- SIMD_FORCE_INLINE void getAngularVelocity(btVector3& angVel) const
+ SIMD_FORCE_INLINE void getAngularVelocity(btVector3 & angVel) const
{
if (m_originalBody)
- angVel =m_angularVelocity+m_deltaAngularVelocity;
+ angVel = m_angularVelocity + m_deltaAngularVelocity;
else
- angVel.setValue(0,0,0);
+ 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)
+ 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);
+ 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)
+ 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);
+ m_pushVelocity += linearComponent * impulseMagnitude * m_linearFactor;
+ m_turnVelocity += angularComponent * (impulseMagnitude * m_angularFactor);
}
}
-
-
const btVector3& getDeltaLinearVelocity() const
{
return m_deltaLinearVelocity;
@@ -191,20 +181,19 @@ ATTRIBUTE_ALIGNED16 (struct) btSolverBody
return m_deltaAngularVelocity;
}
- const btVector3& getPushVelocity() const
+ const btVector3& getPushVelocity() const
{
return m_pushVelocity;
}
- const btVector3& getTurnVelocity() const
+ const btVector3& getTurnVelocity() const
{
return m_turnVelocity;
}
-
////////////////////////////////////////////////
///some internal methods, don't use them
-
+
btVector3& internalGetDeltaLinearVelocity()
{
return m_deltaLinearVelocity;
@@ -229,7 +218,7 @@ ATTRIBUTE_ALIGNED16 (struct) btSolverBody
{
m_invMass = invMass;
}
-
+
btVector3& internalGetPushVelocity()
{
return m_pushVelocity;
@@ -240,67 +229,57 @@ ATTRIBUTE_ALIGNED16 (struct) btSolverBody
return m_turnVelocity;
}
- SIMD_FORCE_INLINE void internalGetVelocityInLocalPointObsolete(const btVector3& rel_pos, btVector3& velocity ) const
+ SIMD_FORCE_INLINE void internalGetVelocityInLocalPointObsolete(const btVector3& rel_pos, btVector3& velocity) const
{
- velocity = m_linearVelocity+m_deltaLinearVelocity + (m_angularVelocity+m_deltaAngularVelocity).cross(rel_pos);
+ velocity = m_linearVelocity + m_deltaLinearVelocity + (m_angularVelocity + m_deltaAngularVelocity).cross(rel_pos);
}
- SIMD_FORCE_INLINE void internalGetAngularVelocity(btVector3& angVel) const
+ SIMD_FORCE_INLINE void internalGetAngularVelocity(btVector3 & angVel) const
{
- angVel = m_angularVelocity+m_deltaAngularVelocity;
+ 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)
+ 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);
+ m_deltaLinearVelocity += linearComponent * impulseMagnitude * m_linearFactor;
+ m_deltaAngularVelocity += angularComponent * (impulseMagnitude * m_angularFactor);
}
}
-
-
-
- void writebackVelocity()
+ void writebackVelocity()
{
if (m_originalBody)
{
- m_linearVelocity +=m_deltaLinearVelocity;
+ m_linearVelocity += m_deltaLinearVelocity;
m_angularVelocity += m_deltaAngularVelocity;
-
+
//m_originalBody->setCompanionId(-1);
}
}
-
- void writebackVelocityAndTransform(btScalar timeStep, btScalar splitImpulseTurnErp)
+ void writebackVelocityAndTransform(btScalar timeStep, btScalar splitImpulseTurnErp)
{
- (void) timeStep;
+ (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)
+ 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);
+ // 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
-
-
+#endif //BT_SOLVER_BODY_H
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSolverConstraint.h b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSolverConstraint.h
index 5515e6b311..c7938df867 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSolverConstraint.h
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btSolverConstraint.h
@@ -16,7 +16,7 @@ subject to the following restrictions:
#ifndef BT_SOLVER_CONSTRAINT_H
#define BT_SOLVER_CONSTRAINT_H
-class btRigidBody;
+class btRigidBody;
#include "LinearMath/btVector3.h"
#include "LinearMath/btMatrix3x3.h"
#include "btJacobianEntry.h"
@@ -25,56 +25,50 @@ class btRigidBody;
//#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
+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;
+ 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_overrideNumSolverIterations;
+ int m_frictionIndex;
int m_solverBodyIdA;
int m_solverBodyIdB;
-
- enum btSolverConstraintType
+ enum btSolverConstraintType
{
BT_SOLVER_CONTACT_1D = 0,
BT_SOLVER_FRICTION_1D
};
};
-typedef btAlignedObjectArray<btSolverConstraint> btConstraintArray;
-
-
-#endif //BT_SOLVER_CONSTRAINT_H
-
-
+typedef btAlignedObjectArray<btSolverConstraint> btConstraintArray;
+#endif //BT_SOLVER_CONSTRAINT_H
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btTypedConstraint.cpp b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btTypedConstraint.cpp
index 9f04f28053..ebe679c449 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btTypedConstraint.cpp
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btTypedConstraint.cpp
@@ -13,69 +13,63 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btTypedConstraint.h"
#include "BulletDynamics/Dynamics/btRigidBody.h"
#include "LinearMath/btSerializer.h"
-
#define DEFAULT_DEBUGDRAW_SIZE btScalar(0.05f)
btTypedConstraint::btTypedConstraint(btTypedConstraintType type, btRigidBody& rbA)
-:btTypedObject(type),
-m_userConstraintType(-1),
-m_userConstraintPtr((void*)-1),
-m_breakingImpulseThreshold(SIMD_INFINITY),
-m_isEnabled(true),
-m_needsFeedback(false),
-m_overrideNumSolverIterations(-1),
-m_rbA(rbA),
-m_rbB(getFixedBody()),
-m_appliedImpulse(btScalar(0.)),
-m_dbgDrawSize(DEFAULT_DEBUGDRAW_SIZE),
-m_jointFeedback(0)
+ : btTypedObject(type),
+ m_userConstraintType(-1),
+ m_userConstraintPtr((void*)-1),
+ m_breakingImpulseThreshold(SIMD_INFINITY),
+ m_isEnabled(true),
+ m_needsFeedback(false),
+ m_overrideNumSolverIterations(-1),
+ m_rbA(rbA),
+ m_rbB(getFixedBody()),
+ m_appliedImpulse(btScalar(0.)),
+ m_dbgDrawSize(DEFAULT_DEBUGDRAW_SIZE),
+ m_jointFeedback(0)
{
}
-
-btTypedConstraint::btTypedConstraint(btTypedConstraintType type, btRigidBody& rbA,btRigidBody& rbB)
-:btTypedObject(type),
-m_userConstraintType(-1),
-m_userConstraintPtr((void*)-1),
-m_breakingImpulseThreshold(SIMD_INFINITY),
-m_isEnabled(true),
-m_needsFeedback(false),
-m_overrideNumSolverIterations(-1),
-m_rbA(rbA),
-m_rbB(rbB),
-m_appliedImpulse(btScalar(0.)),
-m_dbgDrawSize(DEFAULT_DEBUGDRAW_SIZE),
-m_jointFeedback(0)
+btTypedConstraint::btTypedConstraint(btTypedConstraintType type, btRigidBody& rbA, btRigidBody& rbB)
+ : btTypedObject(type),
+ m_userConstraintType(-1),
+ m_userConstraintPtr((void*)-1),
+ m_breakingImpulseThreshold(SIMD_INFINITY),
+ m_isEnabled(true),
+ m_needsFeedback(false),
+ m_overrideNumSolverIterations(-1),
+ m_rbA(rbA),
+ m_rbB(rbB),
+ m_appliedImpulse(btScalar(0.)),
+ m_dbgDrawSize(DEFAULT_DEBUGDRAW_SIZE),
+ m_jointFeedback(0)
{
}
-
-
-
btScalar btTypedConstraint::getMotorFactor(btScalar pos, btScalar lowLim, btScalar uppLim, btScalar vel, btScalar timeFact)
{
- if(lowLim > uppLim)
+ if (lowLim > uppLim)
{
return btScalar(1.0f);
}
- else if(lowLim == uppLim)
+ else if (lowLim == uppLim)
{
return btScalar(0.0f);
}
btScalar lim_fact = btScalar(1.0f);
btScalar delta_max = vel / timeFact;
- if(delta_max < btScalar(0.0f))
+ if (delta_max < btScalar(0.0f))
{
- if((pos >= lowLim) && (pos < (lowLim - delta_max)))
+ if ((pos >= lowLim) && (pos < (lowLim - delta_max)))
{
lim_fact = (lowLim - pos) / delta_max;
}
- else if(pos < lowLim)
+ else if (pos < lowLim)
{
lim_fact = btScalar(0.0f);
}
@@ -84,13 +78,13 @@ btScalar btTypedConstraint::getMotorFactor(btScalar pos, btScalar lowLim, btScal
lim_fact = btScalar(1.0f);
}
}
- else if(delta_max > btScalar(0.0f))
+ else if (delta_max > btScalar(0.0f))
{
- if((pos <= uppLim) && (pos > (uppLim - delta_max)))
+ if ((pos <= uppLim) && (pos > (uppLim - delta_max)))
{
lim_fact = (uppLim - pos) / delta_max;
}
- else if(pos > uppLim)
+ else if (pos > uppLim)
{
lim_fact = btScalar(0.0f);
}
@@ -101,19 +95,19 @@ btScalar btTypedConstraint::getMotorFactor(btScalar pos, btScalar lowLim, btScal
}
else
{
- lim_fact = btScalar(0.0f);
+ lim_fact = btScalar(0.0f);
}
return lim_fact;
}
///fills the dataBuffer and returns the struct name (and 0 on failure)
-const char* btTypedConstraint::serialize(void* dataBuffer, btSerializer* serializer) const
+const char* btTypedConstraint::serialize(void* dataBuffer, btSerializer* serializer) const
{
- btTypedConstraintData2* tcd = (btTypedConstraintData2*) dataBuffer;
+ btTypedConstraintData2* tcd = (btTypedConstraintData2*)dataBuffer;
tcd->m_rbA = (btRigidBodyData*)serializer->getUniquePointer(&m_rbA);
tcd->m_rbB = (btRigidBodyData*)serializer->getUniquePointer(&m_rbB);
- char* name = (char*) serializer->findNameForPointer(this);
+ char* name = (char*)serializer->findNameForPointer(this);
tcd->m_name = (char*)serializer->getUniquePointer(name);
if (tcd->m_name)
{
@@ -124,10 +118,10 @@ const char* btTypedConstraint::serialize(void* dataBuffer, btSerializer* seriali
tcd->m_needsFeedback = m_needsFeedback;
tcd->m_overrideNumSolverIterations = m_overrideNumSolverIterations;
tcd->m_breakingImpulseThreshold = m_breakingImpulseThreshold;
- tcd->m_isEnabled = m_isEnabled? 1: 0;
-
- tcd->m_userConstraintId =m_userConstraintId;
- tcd->m_userConstraintType =m_userConstraintType;
+ tcd->m_isEnabled = m_isEnabled ? 1 : 0;
+
+ tcd->m_userConstraintId = m_userConstraintId;
+ tcd->m_userConstraintType = m_userConstraintType;
tcd->m_appliedImpulse = m_appliedImpulse;
tcd->m_dbgDrawSize = m_dbgDrawSize;
@@ -135,10 +129,10 @@ const char* btTypedConstraint::serialize(void* dataBuffer, btSerializer* seriali
tcd->m_disableCollisionsBetweenLinkedBodies = false;
int i;
- for (i=0;i<m_rbA.getNumConstraintRefs();i++)
+ for (i = 0; i < m_rbA.getNumConstraintRefs(); i++)
if (m_rbA.getConstraintRef(i) == this)
tcd->m_disableCollisionsBetweenLinkedBodies = true;
- for (i=0;i<m_rbB.getNumConstraintRefs();i++)
+ for (i = 0; i < m_rbB.getNumConstraintRefs(); i++)
if (m_rbB.getConstraintRef(i) == this)
tcd->m_disableCollisionsBetweenLinkedBodies = true;
@@ -147,17 +141,16 @@ const char* btTypedConstraint::serialize(void* dataBuffer, btSerializer* seriali
btRigidBody& btTypedConstraint::getFixedBody()
{
- static btRigidBody s_fixed(0, 0,0);
- s_fixed.setMassProps(btScalar(0.),btVector3(btScalar(0.),btScalar(0.),btScalar(0.)));
+ static btRigidBody s_fixed(0, 0, 0);
+ s_fixed.setMassProps(btScalar(0.), btVector3(btScalar(0.), btScalar(0.), btScalar(0.)));
return s_fixed;
}
-
void btAngularLimit::set(btScalar low, btScalar high, btScalar _softness, btScalar _biasFactor, btScalar _relaxationFactor)
{
m_halfRange = (high - low) / 2.0f;
m_center = btNormalizeAngle(low + m_halfRange);
- m_softness = _softness;
+ m_softness = _softness;
m_biasFactor = _biasFactor;
m_relaxationFactor = _relaxationFactor;
}
@@ -174,7 +167,7 @@ void btAngularLimit::test(const btScalar angle)
if (deviation < -m_halfRange)
{
m_solveLimit = true;
- m_correction = - (deviation + m_halfRange);
+ m_correction = -(deviation + m_halfRange);
m_sign = +1.0f;
}
else if (deviation > m_halfRange)
@@ -186,7 +179,6 @@ void btAngularLimit::test(const btScalar angle)
}
}
-
btScalar btAngularLimit::getError() const
{
return m_correction * m_sign;
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btTypedConstraint.h b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btTypedConstraint.h
index 8a2a2d1ae7..d30f3dee5c 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btTypedConstraint.h
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btTypedConstraint.h
@@ -16,26 +16,24 @@ subject to the following restrictions:
#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"
+#define btTypedConstraintData2 btTypedConstraintDoubleData
+#define btTypedConstraintDataName "btTypedConstraintDoubleData"
#else
-#define btTypedConstraintData2 btTypedConstraintFloatData
-#define btTypedConstraintDataName "btTypedConstraintFloatData"
-#endif //BT_USE_DOUBLE_PRECISION
-
+#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,
+ POINT2POINT_CONSTRAINT_TYPE = 3,
HINGE_CONSTRAINT_TYPE,
CONETWIST_CONSTRAINT_TYPE,
D6_CONSTRAINT_TYPE,
@@ -48,91 +46,88 @@ enum btTypedConstraintType
MAX_CONSTRAINT_TYPE
};
-
enum btConstraintParams
{
- BT_CONSTRAINT_ERP=1,
+ BT_CONSTRAINT_ERP = 1,
BT_CONSTRAINT_STOP_ERP,
BT_CONSTRAINT_CFM,
BT_CONSTRAINT_STOP_CFM
};
#if 1
- #define btAssertConstrParams(_par) btAssert(_par)
+#define btAssertConstrParams(_par) btAssert(_par)
#else
- #define btAssertConstrParams(_par)
+#define btAssertConstrParams(_par)
#endif
-
-ATTRIBUTE_ALIGNED16(struct) btJointFeedback
+ATTRIBUTE_ALIGNED16(struct)
+btJointFeedback
{
BT_DECLARE_ALIGNED_ALLOCATOR();
- btVector3 m_appliedForceBodyA;
- btVector3 m_appliedTorqueBodyA;
- btVector3 m_appliedForceBodyB;
- btVector3 m_appliedTorqueBodyB;
+ 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
+ATTRIBUTE_ALIGNED16(class)
+btTypedConstraint : public btTypedObject
{
- int m_userConstraintType;
+ int m_userConstraintType;
- union
- {
- int m_userConstraintId;
+ union {
+ int m_userConstraintId;
void* m_userConstraintPtr;
};
- btScalar m_breakingImpulseThreshold;
- bool m_isEnabled;
- bool m_needsFeedback;
- int m_overrideNumSolverIterations;
+ btScalar m_breakingImpulseThreshold;
+ bool m_isEnabled;
+ bool m_needsFeedback;
+ int m_overrideNumSolverIterations;
-
- btTypedConstraint& operator=(btTypedConstraint& other)
+ btTypedConstraint& operator=(btTypedConstraint& other)
{
btAssert(0);
- (void) other;
+ (void)other;
return *this;
}
protected:
- btRigidBody& m_rbA;
- btRigidBody& m_rbB;
- btScalar m_appliedImpulse;
- btScalar m_dbgDrawSize;
- btJointFeedback* m_jointFeedback;
+ 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);
+ virtual ~btTypedConstraint(){};
+ btTypedConstraint(btTypedConstraintType type, btRigidBody & rbA);
+ btTypedConstraint(btTypedConstraintType type, btRigidBody & rbA, btRigidBody & rbB);
- struct btConstraintInfo1 {
- int m_numConstraintRows,nub;
+ struct btConstraintInfo1
+ {
+ int m_numConstraintRows, nub;
};
static btRigidBody& getFixedBody();
- struct btConstraintInfo2 {
+ struct btConstraintInfo2
+ {
// integrator parameters: frames per second (1/stepsize), default error
// reduction parameter (0..1).
- btScalar fps,erp;
+ 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;
+ btScalar *m_J1linearAxis, *m_J1angularAxis, *m_J2linearAxis, *m_J2angularAxis;
// elements to jump from one row to the next in J's
int rowskip;
@@ -140,19 +135,19 @@ public:
// 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;
+ btScalar *m_constraintError, *cfm;
// lo and hi limits for variables (set to -/+ infinity on entry).
- btScalar *m_lowerLimit,*m_upperLimit;
+ btScalar *m_lowerLimit, *m_upperLimit;
// number of solver iterations
int m_numIterations;
//damping of the velocity
- btScalar m_damping;
+ btScalar m_damping;
};
- int getOverrideNumSolverIterations() const
+ int getOverrideNumSolverIterations() const
{
return m_overrideNumSolverIterations;
}
@@ -165,60 +160,57 @@ public:
}
///internal method used by the constraint solver, don't use them directly
- virtual void buildJacobian() {};
+ 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)
+ virtual void setupSolverConstraint(btConstraintArray & ca, int solverBodyA, int solverBodyB, btScalar timeStep)
{
- (void)ca;
- (void)solverBodyA;
- (void)solverBodyB;
- (void)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;
+ virtual void getInfo1(btConstraintInfo1 * info) = 0;
///internal method used by the constraint solver, don't use them directly
- virtual void getInfo2 (btConstraintInfo2* info)=0;
+ virtual void getInfo2(btConstraintInfo2 * info) = 0;
///internal method used by the constraint solver, don't use them directly
- void internalSetAppliedImpulse(btScalar appliedImpulse)
+ void internalSetAppliedImpulse(btScalar appliedImpulse)
{
m_appliedImpulse = appliedImpulse;
}
///internal method used by the constraint solver, don't use them directly
- btScalar internalGetAppliedImpulse()
+ btScalar internalGetAppliedImpulse()
{
return m_appliedImpulse;
}
-
- btScalar getBreakingImpulseThreshold() const
+ btScalar getBreakingImpulseThreshold() const
{
- return m_breakingImpulseThreshold;
+ return m_breakingImpulseThreshold;
}
- void setBreakingImpulseThreshold(btScalar threshold)
+ void setBreakingImpulseThreshold(btScalar threshold)
{
m_breakingImpulseThreshold = threshold;
}
- bool isEnabled() const
+ bool isEnabled() const
{
return m_isEnabled;
}
- void setEnabled(bool enabled)
+ void setEnabled(bool enabled)
{
- m_isEnabled=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*/) {};
+ virtual void solveConstraintObsolete(btSolverBody& /*bodyA*/, btSolverBody& /*bodyB*/, btScalar /*timeStep*/){};
-
const btRigidBody& getRigidBodyA() const
{
return m_rbA;
@@ -228,7 +220,7 @@ public:
return m_rbB;
}
- btRigidBody& getRigidBodyA()
+ btRigidBody& getRigidBodyA()
{
return m_rbA;
}
@@ -239,15 +231,15 @@ public:
int getUserConstraintType() const
{
- return m_userConstraintType ;
+ return m_userConstraintType;
}
- void setUserConstraintType(int userConstraintType)
+ void setUserConstraintType(int userConstraintType)
{
m_userConstraintType = userConstraintType;
};
- void setUserConstraintId(int uid)
+ void setUserConstraintId(int uid)
{
m_userConstraintId = uid;
}
@@ -257,17 +249,17 @@ public:
return m_userConstraintId;
}
- void setUserConstraintPtr(void* ptr)
+ void setUserConstraintPtr(void* ptr)
{
m_userConstraintPtr = ptr;
}
- void* getUserConstraintPtr()
+ void* getUserConstraintPtr()
{
return m_userConstraintPtr;
}
- void setJointFeedback(btJointFeedback* jointFeedback)
+ void setJointFeedback(btJointFeedback * jointFeedback)
{
m_jointFeedback = jointFeedback;
}
@@ -282,37 +274,36 @@ public:
return m_jointFeedback;
}
-
int getUid() const
{
- return m_userConstraintId;
- }
+ return m_userConstraintId;
+ }
- bool needsFeedback() const
+ 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)
+ void enableFeedback(bool needsFeedback)
{
m_needsFeedback = needsFeedback;
}
- ///getAppliedImpulse is an estimated total applied impulse.
+ ///getAppliedImpulse is an estimated total applied impulse.
///This feedback could be used to determine breaking constraints or playing sounds.
- btScalar getAppliedImpulse() const
+ btScalar getAppliedImpulse() const
{
btAssert(m_needsFeedback);
return m_appliedImpulse;
}
- btTypedConstraintType getConstraintType () const
+ btTypedConstraintType getConstraintType() const
{
return btTypedConstraintType(m_objectType);
}
-
+
void setDbgDrawSize(btScalar dbgDrawSize)
{
m_dbgDrawSize = dbgDrawSize;
@@ -322,35 +313,34 @@ public:
return m_dbgDrawSize;
}
- ///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5).
+ ///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;
+ 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;
+ virtual btScalar getParam(int num, int axis = -1) const = 0;
- ///fills the dataBuffer and returns the struct name (and 0 on failure)
- virtual const char* serialize(void* dataBuffer, btSerializer* serializer) 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;
};
-// returns angle in range [-SIMD_2_PI, SIMD_2_PI], closest to one of the limits
+// 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)
+ if (angleLowerLimitInRadians >= angleUpperLimitInRadians)
{
return angleInRadians;
}
- else if(angleInRadians < angleLowerLimitInRadians)
+ 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)
+ else if (angleInRadians > angleUpperLimitInRadians)
{
btScalar diffHi = btFabs(btNormalizeAngle(angleInRadians - angleUpperLimitInRadians));
btScalar diffLo = btFabs(btNormalizeAngle(angleInRadians - angleLowerLimitInRadians));
@@ -362,6 +352,8 @@ SIMD_FORCE_INLINE btScalar btAdjustAngleToLimits(btScalar angleInRadians, btScal
}
}
+// clang-format off
+
///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
struct btTypedConstraintFloatData
{
@@ -385,6 +377,8 @@ struct btTypedConstraintFloatData
};
+
+
///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
#define BT_BACKWARDS_COMPATIBLE_SERIALIZATION
@@ -436,18 +430,17 @@ struct btTypedConstraintDoubleData
};
+// clang-format on
-SIMD_FORCE_INLINE int btTypedConstraint::calculateSerializeBufferSize() const
+SIMD_FORCE_INLINE int btTypedConstraint::calculateSerializeBufferSize() const
{
return sizeof(btTypedConstraintData2);
}
-
-
class btAngularLimit
{
private:
- btScalar
+ btScalar
m_center,
m_halfRange,
m_softness,
@@ -462,15 +455,16 @@ private:
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)
- {}
+ : 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.
@@ -499,13 +493,13 @@ public:
return m_relaxationFactor;
}
- /// Returns correction value evaluated when test() was invoked
+ /// Returns correction value evaluated when test() was invoked
inline btScalar getCorrection() const
{
return m_correction;
}
- /// Returns sign value evaluated when test() was invoked
+ /// Returns sign value evaluated when test() was invoked
inline btScalar getSign() const
{
return m_sign;
@@ -533,9 +527,6 @@ public:
btScalar getLow() const;
btScalar getHigh() const;
-
};
-
-
-#endif //BT_TYPED_CONSTRAINT_H
+#endif //BT_TYPED_CONSTRAINT_H
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btUniversalConstraint.cpp b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btUniversalConstraint.cpp
index b009f41aec..42ed1fbb87 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btUniversalConstraint.cpp
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btUniversalConstraint.cpp
@@ -13,43 +13,38 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
-
#include "btUniversalConstraint.h"
#include "BulletDynamics/Dynamics/btRigidBody.h"
#include "LinearMath/btTransformUtil.h"
-
-
#define UNIV_EPS btScalar(0.01f)
-
// constructor
// anchor, axis1 and axis2 are in world coordinate system
// axis1 must be orthogonal to axis2
btUniversalConstraint::btUniversalConstraint(btRigidBody& rbA, btRigidBody& rbB, const btVector3& anchor, const btVector3& axis1, const btVector3& axis2)
-: btGeneric6DofConstraint(rbA, rbB, btTransform::getIdentity(), btTransform::getIdentity(), true),
- m_anchor(anchor),
- m_axis1(axis1),
- m_axis2(axis2)
+ : btGeneric6DofConstraint(rbA, rbB, btTransform::getIdentity(), btTransform::getIdentity(), true),
+ m_anchor(anchor),
+ m_axis1(axis1),
+ m_axis2(axis2)
{
// build frame basis
// 6DOF constraint uses Euler angles and to define limits
// it is assumed that rotational order is :
// Z - first, allowed limits are (-PI,PI);
- // new position of Y - second (allowed limits are (-PI/2 + epsilon, PI/2 - epsilon), where epsilon is a small positive number
+ // new position of Y - second (allowed limits are (-PI/2 + epsilon, PI/2 - epsilon), where epsilon is a small positive number
// used to prevent constraint from instability on poles;
// new position of X, allowed limits are (-PI,PI);
// So to simulate ODE Universal joint we should use parent axis as Z, child axis as Y and limit all other DOFs
// Build the frame in world coordinate system first
btVector3 zAxis = m_axis1.normalize();
btVector3 yAxis = m_axis2.normalize();
- btVector3 xAxis = yAxis.cross(zAxis); // we want right coordinate system
+ btVector3 xAxis = yAxis.cross(zAxis); // we want right coordinate system
btTransform frameInW;
frameInW.setIdentity();
- frameInW.getBasis().setValue( xAxis[0], yAxis[0], zAxis[0],
- xAxis[1], yAxis[1], zAxis[1],
- xAxis[2], yAxis[2], zAxis[2]);
+ frameInW.getBasis().setValue(xAxis[0], yAxis[0], zAxis[0],
+ xAxis[1], yAxis[1], zAxis[1],
+ xAxis[2], yAxis[2], zAxis[2]);
frameInW.setOrigin(anchor);
// now get constraint frame in local coordinate systems
m_frameInA = rbA.getCenterOfMassTransform().inverse() * frameInW;
@@ -58,30 +53,28 @@ btUniversalConstraint::btUniversalConstraint(btRigidBody& rbA, btRigidBody& rbB,
setLinearLowerLimit(btVector3(0., 0., 0.));
setLinearUpperLimit(btVector3(0., 0., 0.));
setAngularLowerLimit(btVector3(0.f, -SIMD_HALF_PI + UNIV_EPS, -SIMD_PI + UNIV_EPS));
- setAngularUpperLimit(btVector3(0.f, SIMD_HALF_PI - UNIV_EPS, SIMD_PI - UNIV_EPS));
+ setAngularUpperLimit(btVector3(0.f, SIMD_HALF_PI - UNIV_EPS, SIMD_PI - UNIV_EPS));
}
-void btUniversalConstraint::setAxis(const btVector3& axis1,const btVector3& axis2)
+void btUniversalConstraint::setAxis(const btVector3& axis1, const btVector3& axis2)
{
- m_axis1 = axis1;
- m_axis2 = axis2;
+ m_axis1 = axis1;
+ m_axis2 = axis2;
btVector3 zAxis = axis1.normalized();
btVector3 yAxis = axis2.normalized();
- btVector3 xAxis = yAxis.cross(zAxis); // we want right coordinate system
+ btVector3 xAxis = yAxis.cross(zAxis); // we want right coordinate system
btTransform frameInW;
frameInW.setIdentity();
- frameInW.getBasis().setValue( xAxis[0], yAxis[0], zAxis[0],
- xAxis[1], yAxis[1], zAxis[1],
- xAxis[2], yAxis[2], zAxis[2]);
+ frameInW.getBasis().setValue(xAxis[0], yAxis[0], zAxis[0],
+ xAxis[1], yAxis[1], zAxis[1],
+ xAxis[2], yAxis[2], zAxis[2]);
frameInW.setOrigin(m_anchor);
// now get constraint frame in local coordinate systems
m_frameInA = m_rbA.getCenterOfMassTransform().inverse() * frameInW;
m_frameInB = m_rbB.getCenterOfMassTransform().inverse() * frameInW;
- calculateTransforms();
+ calculateTransforms();
}
-
-
diff --git a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btUniversalConstraint.h b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btUniversalConstraint.h
index 9e70841043..8c24d93a64 100644
--- a/thirdparty/bullet/BulletDynamics/ConstraintSolver/btUniversalConstraint.h
+++ b/thirdparty/bullet/BulletDynamics/ConstraintSolver/btUniversalConstraint.h
@@ -16,35 +16,32 @@ subject to the following restrictions:
#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.
+/// 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
+ATTRIBUTE_ALIGNED16(class)
+btUniversalConstraint : public btGeneric6DofConstraint
{
protected:
- btVector3 m_anchor;
- btVector3 m_axis1;
- btVector3 m_axis2;
+ 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);
+ 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(); }
@@ -56,10 +53,7 @@ public:
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);
+ void setAxis(const btVector3& axis1, const btVector3& axis2);
};
-
-
-#endif // BT_UNIVERSAL_CONSTRAINT_H
-
+#endif // BT_UNIVERSAL_CONSTRAINT_H
diff --git a/thirdparty/bullet/BulletDynamics/Dynamics/btActionInterface.h b/thirdparty/bullet/BulletDynamics/Dynamics/btActionInterface.h
index e1fea3a49c..b5cac56cdc 100644
--- a/thirdparty/bullet/BulletDynamics/Dynamics/btActionInterface.h
+++ b/thirdparty/bullet/BulletDynamics/Dynamics/btActionInterface.h
@@ -26,21 +26,16 @@ class btCollisionWorld;
class btActionInterface
{
protected:
-
static btRigidBody& getFixedBody();
-
-
-public:
+public:
virtual ~btActionInterface()
{
}
- virtual void updateAction( btCollisionWorld* collisionWorld, btScalar deltaTimeStep)=0;
+ virtual void updateAction(btCollisionWorld* collisionWorld, btScalar deltaTimeStep) = 0;
virtual void debugDraw(btIDebugDraw* debugDrawer) = 0;
-
};
-#endif //_BT_ACTION_INTERFACE_H
-
+#endif //_BT_ACTION_INTERFACE_H
diff --git a/thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp b/thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp
index b9944c138b..dfbbdb154f 100644
--- a/thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp
+++ b/thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp
@@ -13,7 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btDiscreteDynamicsWorld.h"
//collision detection
@@ -38,11 +37,9 @@ subject to the following restrictions:
#include "BulletDynamics/ConstraintSolver/btSliderConstraint.h"
#include "BulletDynamics/ConstraintSolver/btContactConstraint.h"
-
#include "LinearMath/btIDebugDraw.h"
#include "BulletCollision/CollisionShapes/btSphereShape.h"
-
#include "BulletDynamics/Dynamics/btActionInterface.h"
#include "LinearMath/btQuickprof.h"
#include "LinearMath/btMotionState.h"
@@ -56,57 +53,52 @@ int startHit=2;
int firstHit=startHit;
#endif
-SIMD_FORCE_INLINE int btGetConstraintIslandId(const btTypedConstraint* lhs)
+SIMD_FORCE_INLINE int btGetConstraintIslandId(const btTypedConstraint* lhs)
{
int islandId;
const btCollisionObject& rcolObj0 = lhs->getRigidBodyA();
const btCollisionObject& rcolObj1 = lhs->getRigidBodyB();
- islandId= rcolObj0.getIslandTag()>=0?rcolObj0.getIslandTag():rcolObj1.getIslandTag();
+ islandId = rcolObj0.getIslandTag() >= 0 ? rcolObj0.getIslandTag() : rcolObj1.getIslandTag();
return islandId;
-
}
-
class btSortConstraintOnIslandPredicate
{
- public:
-
- bool operator() ( const btTypedConstraint* lhs, const btTypedConstraint* rhs ) const
- {
- int rIslandId0,lIslandId0;
- rIslandId0 = btGetConstraintIslandId(rhs);
- lIslandId0 = btGetConstraintIslandId(lhs);
- return lIslandId0 < rIslandId0;
- }
+public:
+ bool operator()(const btTypedConstraint* lhs, const btTypedConstraint* rhs) const
+ {
+ int rIslandId0, lIslandId0;
+ rIslandId0 = btGetConstraintIslandId(rhs);
+ lIslandId0 = btGetConstraintIslandId(lhs);
+ return lIslandId0 < rIslandId0;
+ }
};
struct InplaceSolverIslandCallback : public btSimulationIslandManager::IslandCallback
{
- btContactSolverInfo* m_solverInfo;
- btConstraintSolver* m_solver;
- btTypedConstraint** m_sortedConstraints;
- int m_numConstraints;
- btIDebugDraw* m_debugDrawer;
- btDispatcher* m_dispatcher;
+ btContactSolverInfo* m_solverInfo;
+ btConstraintSolver* m_solver;
+ btTypedConstraint** m_sortedConstraints;
+ int m_numConstraints;
+ btIDebugDraw* m_debugDrawer;
+ btDispatcher* m_dispatcher;
btAlignedObjectArray<btCollisionObject*> m_bodies;
btAlignedObjectArray<btPersistentManifold*> m_manifolds;
btAlignedObjectArray<btTypedConstraint*> m_constraints;
-
InplaceSolverIslandCallback(
- btConstraintSolver* solver,
+ btConstraintSolver* solver,
btStackAlloc* stackAlloc,
btDispatcher* dispatcher)
- :m_solverInfo(NULL),
- m_solver(solver),
- m_sortedConstraints(NULL),
- m_numConstraints(0),
- m_debugDrawer(NULL),
- m_dispatcher(dispatcher)
+ : m_solverInfo(NULL),
+ m_solver(solver),
+ m_sortedConstraints(NULL),
+ m_numConstraints(0),
+ m_debugDrawer(NULL),
+ m_dispatcher(dispatcher)
{
-
}
InplaceSolverIslandCallback& operator=(InplaceSolverIslandCallback& other)
@@ -116,34 +108,34 @@ struct InplaceSolverIslandCallback : public btSimulationIslandManager::IslandCal
return *this;
}
- SIMD_FORCE_INLINE void setup ( btContactSolverInfo* solverInfo, btTypedConstraint** sortedConstraints, int numConstraints, btIDebugDraw* debugDrawer)
+ SIMD_FORCE_INLINE void setup(btContactSolverInfo* solverInfo, btTypedConstraint** sortedConstraints, int numConstraints, btIDebugDraw* debugDrawer)
{
btAssert(solverInfo);
m_solverInfo = solverInfo;
m_sortedConstraints = sortedConstraints;
m_numConstraints = numConstraints;
m_debugDrawer = debugDrawer;
- m_bodies.resize (0);
- m_manifolds.resize (0);
- m_constraints.resize (0);
+ m_bodies.resize(0);
+ m_manifolds.resize(0);
+ m_constraints.resize(0);
}
-
- virtual void processIsland(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifolds,int numManifolds, int islandId)
+ virtual void processIsland(btCollisionObject** bodies, int numBodies, btPersistentManifold** manifolds, int numManifolds, int islandId)
{
- if (islandId<0)
+ 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->solveGroup( bodies,numBodies,manifolds, numManifolds,&m_sortedConstraints[0],m_numConstraints,*m_solverInfo,m_debugDrawer,m_dispatcher);
- } else
+ m_solver->solveGroup(bodies, numBodies, manifolds, numManifolds, &m_sortedConstraints[0], m_numConstraints, *m_solverInfo, m_debugDrawer, m_dispatcher);
+ }
+ else
{
- //also add all non-contact constraints/joints for this island
+ //also add all non-contact constraints/joints for this island
btTypedConstraint** startConstraint = 0;
int numCurConstraints = 0;
int i;
//find the first constraint for this island
- for (i=0;i<m_numConstraints;i++)
+ for (i = 0; i < m_numConstraints; i++)
{
if (btGetConstraintIslandId(m_sortedConstraints[i]) == islandId)
{
@@ -152,7 +144,7 @@ struct InplaceSolverIslandCallback : public btSimulationIslandManager::IslandCal
}
}
//count the number of constraints in this island
- for (;i<m_numConstraints;i++)
+ for (; i < m_numConstraints; i++)
{
if (btGetConstraintIslandId(m_sortedConstraints[i]) == islandId)
{
@@ -160,91 +152,87 @@ struct InplaceSolverIslandCallback : public btSimulationIslandManager::IslandCal
}
}
- if (m_solverInfo->m_minimumSolverBatchSize<=1)
+ if (m_solverInfo->m_minimumSolverBatchSize <= 1)
{
- m_solver->solveGroup( bodies,numBodies,manifolds, numManifolds,startConstraint,numCurConstraints,*m_solverInfo,m_debugDrawer,m_dispatcher);
- } else
+ m_solver->solveGroup(bodies, numBodies, manifolds, numManifolds, startConstraint, numCurConstraints, *m_solverInfo, m_debugDrawer, m_dispatcher);
+ }
+ else
{
-
- for (i=0;i<numBodies;i++)
+ for (i = 0; i < numBodies; i++)
m_bodies.push_back(bodies[i]);
- for (i=0;i<numManifolds;i++)
+ for (i = 0; i < numManifolds; i++)
m_manifolds.push_back(manifolds[i]);
- for (i=0;i<numCurConstraints;i++)
+ for (i = 0; i < numCurConstraints; i++)
m_constraints.push_back(startConstraint[i]);
- if ((m_constraints.size()+m_manifolds.size())>m_solverInfo->m_minimumSolverBatchSize)
+ if ((m_constraints.size() + m_manifolds.size()) > m_solverInfo->m_minimumSolverBatchSize)
{
processConstraints();
- } else
+ }
+ else
{
//printf("deferred\n");
}
}
}
}
- void processConstraints()
+ void processConstraints()
{
+ 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;
- 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;
-
- m_solver->solveGroup( bodies,m_bodies.size(),manifold, m_manifolds.size(),constraints, m_constraints.size() ,*m_solverInfo,m_debugDrawer,m_dispatcher);
+ m_solver->solveGroup(bodies, m_bodies.size(), manifold, m_manifolds.size(), constraints, m_constraints.size(), *m_solverInfo, m_debugDrawer, m_dispatcher);
m_bodies.resize(0);
m_manifolds.resize(0);
m_constraints.resize(0);
-
}
-
};
-
-
-btDiscreteDynamicsWorld::btDiscreteDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* pairCache,btConstraintSolver* constraintSolver, btCollisionConfiguration* collisionConfiguration)
-:btDynamicsWorld(dispatcher,pairCache,collisionConfiguration),
-m_sortedConstraints (),
-m_solverIslandCallback ( NULL ),
-m_constraintSolver(constraintSolver),
-m_gravity(0,-10,0),
-m_localTime(0),
-m_fixedTimeStep(0),
-m_synchronizeAllMotionStates(false),
-m_applySpeculativeContactRestitution(false),
-m_profileTimings(0),
-m_latencyMotionStateInterpolation(true)
+btDiscreteDynamicsWorld::btDiscreteDynamicsWorld(btDispatcher* dispatcher, btBroadphaseInterface* pairCache, btConstraintSolver* constraintSolver, btCollisionConfiguration* collisionConfiguration)
+ : btDynamicsWorld(dispatcher, pairCache, collisionConfiguration),
+ m_sortedConstraints(),
+ m_solverIslandCallback(NULL),
+ m_constraintSolver(constraintSolver),
+ m_gravity(0, -10, 0),
+ m_localTime(0),
+ m_fixedTimeStep(0),
+ m_synchronizeAllMotionStates(false),
+ m_applySpeculativeContactRestitution(false),
+ m_profileTimings(0),
+ m_latencyMotionStateInterpolation(true)
{
if (!m_constraintSolver)
{
- void* mem = btAlignedAlloc(sizeof(btSequentialImpulseConstraintSolver),16);
+ void* mem = btAlignedAlloc(sizeof(btSequentialImpulseConstraintSolver), 16);
m_constraintSolver = new (mem) btSequentialImpulseConstraintSolver;
m_ownsConstraintSolver = true;
- } else
+ }
+ else
{
m_ownsConstraintSolver = false;
}
{
- void* mem = btAlignedAlloc(sizeof(btSimulationIslandManager),16);
+ void* mem = btAlignedAlloc(sizeof(btSimulationIslandManager), 16);
m_islandManager = new (mem) btSimulationIslandManager();
}
m_ownsIslandManager = true;
{
- void* mem = btAlignedAlloc(sizeof(InplaceSolverIslandCallback),16);
- m_solverIslandCallback = new (mem) InplaceSolverIslandCallback (m_constraintSolver, 0, dispatcher);
+ void* mem = btAlignedAlloc(sizeof(InplaceSolverIslandCallback), 16);
+ m_solverIslandCallback = new (mem) InplaceSolverIslandCallback(m_constraintSolver, 0, dispatcher);
}
}
-
btDiscreteDynamicsWorld::~btDiscreteDynamicsWorld()
{
//only delete it when we created it
if (m_ownsIslandManager)
{
m_islandManager->~btSimulationIslandManager();
- btAlignedFree( m_islandManager);
+ btAlignedFree(m_islandManager);
}
if (m_solverIslandCallback)
{
@@ -253,18 +241,17 @@ btDiscreteDynamicsWorld::~btDiscreteDynamicsWorld()
}
if (m_ownsConstraintSolver)
{
-
m_constraintSolver->~btConstraintSolver();
btAlignedFree(m_constraintSolver);
}
}
-void btDiscreteDynamicsWorld::saveKinematicState(btScalar timeStep)
+void btDiscreteDynamicsWorld::saveKinematicState(btScalar timeStep)
{
-///would like to iterate over m_nonStaticRigidBodies, but unfortunately old API allows
-///to switch status _after_ adding kinematic objects to the world
-///fix it for Bullet 3.x release
- for (int i=0;i<m_collisionObjects.size();i++)
+ ///would like to iterate over m_nonStaticRigidBodies, but unfortunately old API allows
+ ///to switch status _after_ adding kinematic objects to the world
+ ///fix it for Bullet 3.x release
+ for (int i = 0; i < m_collisionObjects.size(); i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
btRigidBody* body = btRigidBody::upcast(colObj);
@@ -277,10 +264,9 @@ void btDiscreteDynamicsWorld::saveKinematicState(btScalar timeStep)
}
}
}
-
}
-void btDiscreteDynamicsWorld::debugDrawWorld()
+void btDiscreteDynamicsWorld::debugDrawWorld()
{
BT_PROFILE("debugDrawWorld");
@@ -290,43 +276,40 @@ void btDiscreteDynamicsWorld::debugDrawWorld()
if (getDebugDrawer())
{
int mode = getDebugDrawer()->getDebugMode();
- if(mode & (btIDebugDraw::DBG_DrawConstraints | btIDebugDraw::DBG_DrawConstraintLimits))
+ if (mode & (btIDebugDraw::DBG_DrawConstraints | btIDebugDraw::DBG_DrawConstraintLimits))
{
drawConstraints = true;
}
}
- if(drawConstraints)
+ if (drawConstraints)
{
- for(int i = getNumConstraints()-1; i>=0 ;i--)
+ for (int i = getNumConstraints() - 1; i >= 0; i--)
{
btTypedConstraint* constraint = getConstraint(i);
debugDrawConstraint(constraint);
}
}
-
-
- if (getDebugDrawer() && (getDebugDrawer()->getDebugMode() & (btIDebugDraw::DBG_DrawWireframe | btIDebugDraw::DBG_DrawAabb | btIDebugDraw::DBG_DrawNormals)))
+ if (getDebugDrawer() && (getDebugDrawer()->getDebugMode() & (btIDebugDraw::DBG_DrawWireframe | btIDebugDraw::DBG_DrawAabb | btIDebugDraw::DBG_DrawNormals)))
{
int i;
if (getDebugDrawer() && getDebugDrawer()->getDebugMode())
{
- for (i=0;i<m_actions.size();i++)
+ for (i = 0; i < m_actions.size(); i++)
{
m_actions[i]->debugDraw(m_debugDrawer);
}
}
}
- if (getDebugDrawer())
- getDebugDrawer()->flushLines();
-
+ if (getDebugDrawer())
+ getDebugDrawer()->flushLines();
}
-void btDiscreteDynamicsWorld::clearForces()
+void btDiscreteDynamicsWorld::clearForces()
{
///@todo: iterate over awake simulation islands!
- for ( int i=0;i<m_nonStaticRigidBodies.size();i++)
+ for (int i = 0; i < m_nonStaticRigidBodies.size(); i++)
{
btRigidBody* body = m_nonStaticRigidBodies[i];
//need to check if next line is ok
@@ -336,10 +319,10 @@ void btDiscreteDynamicsWorld::clearForces()
}
///apply gravity, call this once per timestep
-void btDiscreteDynamicsWorld::applyGravity()
+void btDiscreteDynamicsWorld::applyGravity()
{
///@todo: iterate over awake simulation islands!
- for ( int i=0;i<m_nonStaticRigidBodies.size();i++)
+ for (int i = 0; i < m_nonStaticRigidBodies.size(); i++)
{
btRigidBody* body = m_nonStaticRigidBodies[i];
if (body->isActive())
@@ -349,8 +332,7 @@ void btDiscreteDynamicsWorld::applyGravity()
}
}
-
-void btDiscreteDynamicsWorld::synchronizeSingleMotionState(btRigidBody* body)
+void btDiscreteDynamicsWorld::synchronizeSingleMotionState(btRigidBody* body)
{
btAssert(body);
@@ -363,32 +345,32 @@ void btDiscreteDynamicsWorld::synchronizeSingleMotionState(btRigidBody* body)
{
btTransform interpolatedTransform;
btTransformUtil::integrateTransform(body->getInterpolationWorldTransform(),
- body->getInterpolationLinearVelocity(),body->getInterpolationAngularVelocity(),
- (m_latencyMotionStateInterpolation && m_fixedTimeStep) ? m_localTime - m_fixedTimeStep : m_localTime*body->getHitFraction(),
- interpolatedTransform);
+ body->getInterpolationLinearVelocity(), body->getInterpolationAngularVelocity(),
+ (m_latencyMotionStateInterpolation && m_fixedTimeStep) ? m_localTime - m_fixedTimeStep : m_localTime * body->getHitFraction(),
+ interpolatedTransform);
body->getMotionState()->setWorldTransform(interpolatedTransform);
}
}
}
-
-void btDiscreteDynamicsWorld::synchronizeMotionStates()
+void btDiscreteDynamicsWorld::synchronizeMotionStates()
{
-// BT_PROFILE("synchronizeMotionStates");
+ // BT_PROFILE("synchronizeMotionStates");
if (m_synchronizeAllMotionStates)
{
//iterate over all collision objects
- for ( int i=0;i<m_collisionObjects.size();i++)
+ for (int i = 0; i < m_collisionObjects.size(); i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
btRigidBody* body = btRigidBody::upcast(colObj);
if (body)
synchronizeSingleMotionState(body);
}
- } else
+ }
+ else
{
//iterate over all active rigid bodies
- for ( int i=0;i<m_nonStaticRigidBodies.size();i++)
+ for (int i = 0; i < m_nonStaticRigidBodies.size(); i++)
{
btRigidBody* body = m_nonStaticRigidBodies[i];
if (body->isActive())
@@ -397,12 +379,10 @@ void btDiscreteDynamicsWorld::synchronizeMotionStates()
}
}
-
-int btDiscreteDynamicsWorld::stepSimulation( btScalar timeStep,int maxSubSteps, btScalar fixedTimeStep)
+int btDiscreteDynamicsWorld::stepSimulation(btScalar timeStep, int maxSubSteps, btScalar fixedTimeStep)
{
startProfiling(timeStep);
-
int numSimulationSubSteps = 0;
if (maxSubSteps)
@@ -412,10 +392,11 @@ int btDiscreteDynamicsWorld::stepSimulation( btScalar timeStep,int maxSubSteps,
m_localTime += timeStep;
if (m_localTime >= fixedTimeStep)
{
- numSimulationSubSteps = int( m_localTime / fixedTimeStep);
+ numSimulationSubSteps = int(m_localTime / fixedTimeStep);
m_localTime -= numSimulationSubSteps * fixedTimeStep;
}
- } else
+ }
+ else
{
//variable timestep
fixedTimeStep = timeStep;
@@ -425,7 +406,8 @@ int btDiscreteDynamicsWorld::stepSimulation( btScalar timeStep,int maxSubSteps,
{
numSimulationSubSteps = 0;
maxSubSteps = 0;
- } else
+ }
+ else
{
numSimulationSubSteps = 1;
maxSubSteps = 1;
@@ -435,28 +417,25 @@ int btDiscreteDynamicsWorld::stepSimulation( btScalar timeStep,int maxSubSteps,
//process some debugging flags
if (getDebugDrawer())
{
- btIDebugDraw* debugDrawer = getDebugDrawer ();
+ btIDebugDraw* debugDrawer = getDebugDrawer();
gDisableDeactivation = (debugDrawer->getDebugMode() & btIDebugDraw::DBG_NoDeactivation) != 0;
}
if (numSimulationSubSteps)
{
-
//clamp the number of substeps, to prevent simulation grinding spiralling down to a halt
- int clampedSimulationSteps = (numSimulationSubSteps > maxSubSteps)? maxSubSteps : numSimulationSubSteps;
+ int clampedSimulationSteps = (numSimulationSubSteps > maxSubSteps) ? maxSubSteps : numSimulationSubSteps;
- saveKinematicState(fixedTimeStep*clampedSimulationSteps);
+ saveKinematicState(fixedTimeStep * clampedSimulationSteps);
applyGravity();
-
-
- for (int i=0;i<clampedSimulationSteps;i++)
+ for (int i = 0; i < clampedSimulationSteps; i++)
{
internalSingleStepSimulation(fixedTimeStep);
synchronizeMotionStates();
}
-
- } else
+ }
+ else
{
synchronizeMotionStates();
}
@@ -465,17 +444,17 @@ int btDiscreteDynamicsWorld::stepSimulation( btScalar timeStep,int maxSubSteps,
#ifndef BT_NO_PROFILE
CProfileManager::Increment_Frame_Counter();
-#endif //BT_NO_PROFILE
+#endif //BT_NO_PROFILE
return numSimulationSubSteps;
}
-void btDiscreteDynamicsWorld::internalSingleStepSimulation(btScalar timeStep)
+void btDiscreteDynamicsWorld::internalSingleStepSimulation(btScalar timeStep)
{
-
BT_PROFILE("internalSingleStepSimulation");
- if(0 != m_internalPreTickCallback) {
+ if (0 != m_internalPreTickCallback)
+ {
(*m_internalPreTickCallback)(this, timeStep);
}
@@ -488,19 +467,15 @@ void btDiscreteDynamicsWorld::internalSingleStepSimulation(btScalar timeStep)
dispatchInfo.m_stepCount = 0;
dispatchInfo.m_debugDraw = getDebugDrawer();
-
- createPredictiveContacts(timeStep);
+ createPredictiveContacts(timeStep);
///perform collision detection
performDiscreteCollisionDetection();
calculateSimulationIslands();
-
getSolverInfo().m_timeStep = timeStep;
-
-
///solve contact and other joint constraints
solveConstraints(getSolverInfo());
@@ -513,37 +488,38 @@ void btDiscreteDynamicsWorld::internalSingleStepSimulation(btScalar timeStep)
///update vehicle simulation
updateActions(timeStep);
- updateActivationState( timeStep );
+ updateActivationState(timeStep);
- if(0 != m_internalTickCallback) {
+ if (0 != m_internalTickCallback)
+ {
(*m_internalTickCallback)(this, timeStep);
}
}
-void btDiscreteDynamicsWorld::setGravity(const btVector3& gravity)
+void btDiscreteDynamicsWorld::setGravity(const btVector3& gravity)
{
m_gravity = gravity;
- for ( int i=0;i<m_nonStaticRigidBodies.size();i++)
+ for (int i = 0; i < m_nonStaticRigidBodies.size(); i++)
{
btRigidBody* body = m_nonStaticRigidBodies[i];
- if (body->isActive() && !(body->getFlags() &BT_DISABLE_WORLD_GRAVITY))
+ if (body->isActive() && !(body->getFlags() & BT_DISABLE_WORLD_GRAVITY))
{
body->setGravity(gravity);
}
}
}
-btVector3 btDiscreteDynamicsWorld::getGravity () const
+btVector3 btDiscreteDynamicsWorld::getGravity() const
{
return m_gravity;
}
-void btDiscreteDynamicsWorld::addCollisionObject(btCollisionObject* collisionObject, int collisionFilterGroup, int collisionFilterMask)
+void btDiscreteDynamicsWorld::addCollisionObject(btCollisionObject* collisionObject, int collisionFilterGroup, int collisionFilterMask)
{
- btCollisionWorld::addCollisionObject(collisionObject,collisionFilterGroup,collisionFilterMask);
+ btCollisionWorld::addCollisionObject(collisionObject, collisionFilterGroup, collisionFilterMask);
}
-void btDiscreteDynamicsWorld::removeCollisionObject(btCollisionObject* collisionObject)
+void btDiscreteDynamicsWorld::removeCollisionObject(btCollisionObject* collisionObject)
{
btRigidBody* body = btRigidBody::upcast(collisionObject);
if (body)
@@ -552,16 +528,15 @@ void btDiscreteDynamicsWorld::removeCollisionObject(btCollisionObject* collision
btCollisionWorld::removeCollisionObject(collisionObject);
}
-void btDiscreteDynamicsWorld::removeRigidBody(btRigidBody* body)
+void btDiscreteDynamicsWorld::removeRigidBody(btRigidBody* body)
{
m_nonStaticRigidBodies.remove(body);
btCollisionWorld::removeCollisionObject(body);
}
-
-void btDiscreteDynamicsWorld::addRigidBody(btRigidBody* body)
+void btDiscreteDynamicsWorld::addRigidBody(btRigidBody* body)
{
- if (!body->isStaticOrKinematicObject() && !(body->getFlags() &BT_DISABLE_WORLD_GRAVITY))
+ if (!body->isStaticOrKinematicObject() && !(body->getFlags() & BT_DISABLE_WORLD_GRAVITY))
{
body->setGravity(m_gravity);
}
@@ -571,22 +546,23 @@ void btDiscreteDynamicsWorld::addRigidBody(btRigidBody* body)
if (!body->isStaticObject())
{
m_nonStaticRigidBodies.push_back(body);
- } else
+ }
+ else
{
body->setActivationState(ISLAND_SLEEPING);
}
bool isDynamic = !(body->isStaticObject() || body->isKinematicObject());
- int collisionFilterGroup = isDynamic? int(btBroadphaseProxy::DefaultFilter) : int(btBroadphaseProxy::StaticFilter);
- int collisionFilterMask = isDynamic? int(btBroadphaseProxy::AllFilter) : int(btBroadphaseProxy::AllFilter ^ btBroadphaseProxy::StaticFilter);
+ int collisionFilterGroup = isDynamic ? int(btBroadphaseProxy::DefaultFilter) : int(btBroadphaseProxy::StaticFilter);
+ int collisionFilterMask = isDynamic ? int(btBroadphaseProxy::AllFilter) : int(btBroadphaseProxy::AllFilter ^ btBroadphaseProxy::StaticFilter);
- addCollisionObject(body,collisionFilterGroup,collisionFilterMask);
+ addCollisionObject(body, collisionFilterGroup, collisionFilterMask);
}
}
-void btDiscreteDynamicsWorld::addRigidBody(btRigidBody* body, int group, int mask)
+void btDiscreteDynamicsWorld::addRigidBody(btRigidBody* body, int group, int mask)
{
- if (!body->isStaticOrKinematicObject() && !(body->getFlags() &BT_DISABLE_WORLD_GRAVITY))
+ if (!body->isStaticOrKinematicObject() && !(body->getFlags() & BT_DISABLE_WORLD_GRAVITY))
{
body->setGravity(m_gravity);
}
@@ -597,31 +573,29 @@ void btDiscreteDynamicsWorld::addRigidBody(btRigidBody* body, int group, int mas
{
m_nonStaticRigidBodies.push_back(body);
}
- else
+ else
{
body->setActivationState(ISLAND_SLEEPING);
}
- addCollisionObject(body,group,mask);
+ addCollisionObject(body, group, mask);
}
}
-
-void btDiscreteDynamicsWorld::updateActions(btScalar timeStep)
+void btDiscreteDynamicsWorld::updateActions(btScalar timeStep)
{
BT_PROFILE("updateActions");
- for ( int i=0;i<m_actions.size();i++)
+ for (int i = 0; i < m_actions.size(); i++)
{
- m_actions[i]->updateAction( this, timeStep);
+ m_actions[i]->updateAction(this, timeStep);
}
}
-
-void btDiscreteDynamicsWorld::updateActivationState(btScalar timeStep)
+void btDiscreteDynamicsWorld::updateActivationState(btScalar timeStep)
{
BT_PROFILE("updateActivationState");
- for ( int i=0;i<m_nonStaticRigidBodies.size();i++)
+ for (int i = 0; i < m_nonStaticRigidBodies.size(); i++)
{
btRigidBody* body = m_nonStaticRigidBodies[i];
if (body)
@@ -633,32 +607,33 @@ void btDiscreteDynamicsWorld::updateActivationState(btScalar timeStep)
if (body->isStaticOrKinematicObject())
{
body->setActivationState(ISLAND_SLEEPING);
- } else
+ }
+ else
{
if (body->getActivationState() == ACTIVE_TAG)
- body->setActivationState( WANTS_DEACTIVATION );
+ body->setActivationState(WANTS_DEACTIVATION);
if (body->getActivationState() == ISLAND_SLEEPING)
{
- body->setAngularVelocity(btVector3(0,0,0));
- body->setLinearVelocity(btVector3(0,0,0));
+ body->setAngularVelocity(btVector3(0, 0, 0));
+ body->setLinearVelocity(btVector3(0, 0, 0));
}
-
}
- } else
+ }
+ else
{
if (body->getActivationState() != DISABLE_DEACTIVATION)
- body->setActivationState( ACTIVE_TAG );
+ body->setActivationState(ACTIVE_TAG);
}
}
}
}
-void btDiscreteDynamicsWorld::addConstraint(btTypedConstraint* constraint,bool disableCollisionsBetweenLinkedBodies)
+void btDiscreteDynamicsWorld::addConstraint(btTypedConstraint* constraint, bool disableCollisionsBetweenLinkedBodies)
{
m_constraints.push_back(constraint);
- //Make sure the two bodies of a type constraint are different (possibly add this to the btTypedConstraint constructor?)
- btAssert(&constraint->getRigidBodyA()!=&constraint->getRigidBodyB());
-
+ //Make sure the two bodies of a type constraint are different (possibly add this to the btTypedConstraint constructor?)
+ btAssert(&constraint->getRigidBodyA() != &constraint->getRigidBodyB());
+
if (disableCollisionsBetweenLinkedBodies)
{
constraint->getRigidBodyA().addConstraintRef(constraint);
@@ -666,105 +641,98 @@ void btDiscreteDynamicsWorld::addConstraint(btTypedConstraint* constraint,bool d
}
}
-void btDiscreteDynamicsWorld::removeConstraint(btTypedConstraint* constraint)
+void btDiscreteDynamicsWorld::removeConstraint(btTypedConstraint* constraint)
{
m_constraints.remove(constraint);
constraint->getRigidBodyA().removeConstraintRef(constraint);
constraint->getRigidBodyB().removeConstraintRef(constraint);
}
-void btDiscreteDynamicsWorld::addAction(btActionInterface* action)
+void btDiscreteDynamicsWorld::addAction(btActionInterface* action)
{
m_actions.push_back(action);
}
-void btDiscreteDynamicsWorld::removeAction(btActionInterface* action)
+void btDiscreteDynamicsWorld::removeAction(btActionInterface* action)
{
m_actions.remove(action);
}
-
-void btDiscreteDynamicsWorld::addVehicle(btActionInterface* vehicle)
+void btDiscreteDynamicsWorld::addVehicle(btActionInterface* vehicle)
{
addAction(vehicle);
}
-void btDiscreteDynamicsWorld::removeVehicle(btActionInterface* vehicle)
+void btDiscreteDynamicsWorld::removeVehicle(btActionInterface* vehicle)
{
removeAction(vehicle);
}
-void btDiscreteDynamicsWorld::addCharacter(btActionInterface* character)
+void btDiscreteDynamicsWorld::addCharacter(btActionInterface* character)
{
addAction(character);
}
-void btDiscreteDynamicsWorld::removeCharacter(btActionInterface* character)
+void btDiscreteDynamicsWorld::removeCharacter(btActionInterface* character)
{
removeAction(character);
}
-
-
-
-void btDiscreteDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo)
+void btDiscreteDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo)
{
BT_PROFILE("solveConstraints");
- m_sortedConstraints.resize( m_constraints.size());
+ m_sortedConstraints.resize(m_constraints.size());
int i;
- for (i=0;i<getNumConstraints();i++)
+ for (i = 0; i < getNumConstraints(); i++)
{
m_sortedConstraints[i] = m_constraints[i];
}
-// btAssert(0);
-
-
+ // btAssert(0);
m_sortedConstraints.quickSort(btSortConstraintOnIslandPredicate());
btTypedConstraint** constraintsPtr = getNumConstraints() ? &m_sortedConstraints[0] : 0;
- m_solverIslandCallback->setup(&solverInfo,constraintsPtr,m_sortedConstraints.size(),getDebugDrawer());
+ m_solverIslandCallback->setup(&solverInfo, constraintsPtr, m_sortedConstraints.size(), getDebugDrawer());
m_constraintSolver->prepareSolve(getCollisionWorld()->getNumCollisionObjects(), getCollisionWorld()->getDispatcher()->getNumManifolds());
/// solve all the constraints for this island
- m_islandManager->buildAndProcessIslands(getCollisionWorld()->getDispatcher(),getCollisionWorld(),m_solverIslandCallback);
+ m_islandManager->buildAndProcessIslands(getCollisionWorld()->getDispatcher(), getCollisionWorld(), m_solverIslandCallback);
m_solverIslandCallback->processConstraints();
m_constraintSolver->allSolved(solverInfo, m_debugDrawer);
}
-
-void btDiscreteDynamicsWorld::calculateSimulationIslands()
+void btDiscreteDynamicsWorld::calculateSimulationIslands()
{
BT_PROFILE("calculateSimulationIslands");
- getSimulationIslandManager()->updateActivationState(getCollisionWorld(),getCollisionWorld()->getDispatcher());
+ getSimulationIslandManager()->updateActivationState(getCollisionWorld(), getCollisionWorld()->getDispatcher());
- {
- //merge islands based on speculative contact manifolds too
- for (int i=0;i<this->m_predictiveManifolds.size();i++)
- {
- btPersistentManifold* manifold = m_predictiveManifolds[i];
+ {
+ //merge islands based on speculative contact manifolds too
+ for (int i = 0; i < this->m_predictiveManifolds.size(); i++)
+ {
+ btPersistentManifold* manifold = m_predictiveManifolds[i];
- const btCollisionObject* colObj0 = manifold->getBody0();
- const btCollisionObject* colObj1 = manifold->getBody1();
+ const btCollisionObject* colObj0 = manifold->getBody0();
+ const btCollisionObject* colObj1 = manifold->getBody1();
- if (((colObj0) && (!(colObj0)->isStaticOrKinematicObject())) &&
- ((colObj1) && (!(colObj1)->isStaticOrKinematicObject())))
- {
- getSimulationIslandManager()->getUnionFind().unite((colObj0)->getIslandTag(),(colObj1)->getIslandTag());
- }
- }
- }
+ if (((colObj0) && (!(colObj0)->isStaticOrKinematicObject())) &&
+ ((colObj1) && (!(colObj1)->isStaticOrKinematicObject())))
+ {
+ getSimulationIslandManager()->getUnionFind().unite((colObj0)->getIslandTag(), (colObj1)->getIslandTag());
+ }
+ }
+ }
{
int i;
int numConstraints = int(m_constraints.size());
- for (i=0;i< numConstraints ; i++ )
+ for (i = 0; i < numConstraints; i++)
{
btTypedConstraint* constraint = m_constraints[i];
if (constraint->isEnabled())
@@ -775,7 +743,7 @@ void btDiscreteDynamicsWorld::calculateSimulationIslands()
if (((colObj0) && (!(colObj0)->isStaticOrKinematicObject())) &&
((colObj1) && (!(colObj1)->isStaticOrKinematicObject())))
{
- getSimulationIslandManager()->getUnionFind().unite((colObj0)->getIslandTag(),(colObj1)->getIslandTag());
+ getSimulationIslandManager()->getUnionFind().unite((colObj0)->getIslandTag(), (colObj1)->getIslandTag());
}
}
}
@@ -783,51 +751,44 @@ void btDiscreteDynamicsWorld::calculateSimulationIslands()
//Store the island id in each body
getSimulationIslandManager()->storeIslandActivationState(getCollisionWorld());
-
-
}
-
-
-
class btClosestNotMeConvexResultCallback : public btCollisionWorld::ClosestConvexResultCallback
{
public:
-
btCollisionObject* m_me;
btScalar m_allowedPenetration;
btOverlappingPairCache* m_pairCache;
btDispatcher* m_dispatcher;
public:
- btClosestNotMeConvexResultCallback (btCollisionObject* me,const btVector3& fromA,const btVector3& toA,btOverlappingPairCache* pairCache,btDispatcher* dispatcher) :
- btCollisionWorld::ClosestConvexResultCallback(fromA,toA),
- m_me(me),
- m_allowedPenetration(0.0f),
- m_pairCache(pairCache),
- m_dispatcher(dispatcher)
+ btClosestNotMeConvexResultCallback(btCollisionObject* me, const btVector3& fromA, const btVector3& toA, btOverlappingPairCache* pairCache, btDispatcher* dispatcher) : btCollisionWorld::ClosestConvexResultCallback(fromA, toA),
+ m_me(me),
+ m_allowedPenetration(0.0f),
+ m_pairCache(pairCache),
+ m_dispatcher(dispatcher)
{
}
- virtual btScalar addSingleResult(btCollisionWorld::LocalConvexResult& convexResult,bool normalInWorldSpace)
+ virtual btScalar addSingleResult(btCollisionWorld::LocalConvexResult& convexResult, bool normalInWorldSpace)
{
if (convexResult.m_hitCollisionObject == m_me)
return 1.0f;
//ignore result if there is no contact response
- if(!convexResult.m_hitCollisionObject->hasContactResponse())
+ if (!convexResult.m_hitCollisionObject->hasContactResponse())
return 1.0f;
- btVector3 linVelA,linVelB;
- linVelA = m_convexToWorld-m_convexFromWorld;
- linVelB = btVector3(0,0,0);//toB.getOrigin()-fromB.getOrigin();
+ btVector3 linVelA, linVelB;
+ linVelA = m_convexToWorld - m_convexFromWorld;
+ linVelB = btVector3(0, 0, 0); //toB.getOrigin()-fromB.getOrigin();
- btVector3 relativeVelocity = (linVelA-linVelB);
+ btVector3 relativeVelocity = (linVelA - linVelB);
//don't report time of impact for motion away from the contact normal (or causes minor penetration)
- if (convexResult.m_hitNormalLocal.dot(relativeVelocity)>=-m_allowedPenetration)
+ if (convexResult.m_hitNormalLocal.dot(relativeVelocity) >= -m_allowedPenetration)
return 1.f;
- return ClosestConvexResultCallback::addSingleResult (convexResult, normalInWorldSpace);
+ return ClosestConvexResultCallback::addSingleResult(convexResult, normalInWorldSpace);
}
virtual bool needsCollision(btBroadphaseProxy* proxy0) const
@@ -840,13 +801,13 @@ public:
if (!ClosestConvexResultCallback::needsCollision(proxy0))
return false;
- btCollisionObject* otherObj = (btCollisionObject*) proxy0->m_clientObject;
+ btCollisionObject* otherObj = (btCollisionObject*)proxy0->m_clientObject;
- if(!m_dispatcher->needsCollision(m_me, otherObj))
+ if (!m_dispatcher->needsCollision(m_me, otherObj))
return false;
//call needsResponse, see http://code.google.com/p/bullet/issues/detail?id=179
- if (m_dispatcher->needsResponse(m_me,otherObj))
+ if (m_dispatcher->needsResponse(m_me, otherObj))
{
#if 0
///don't do CCD when there are already contact points (touching contact/penetration)
@@ -872,28 +833,24 @@ public:
return false;
}
-
-
};
///internal debugging variable. this value shouldn't be too high
-int gNumClampedCcdMotions=0;
-
+int gNumClampedCcdMotions = 0;
-void btDiscreteDynamicsWorld::createPredictiveContactsInternal( btRigidBody** bodies, int numBodies, btScalar timeStep)
+void btDiscreteDynamicsWorld::createPredictiveContactsInternal(btRigidBody** bodies, int numBodies, btScalar timeStep)
{
btTransform predictedTrans;
- for ( int i=0;i<numBodies;i++)
+ for (int i = 0; i < numBodies; i++)
{
btRigidBody* body = bodies[i];
body->setHitFraction(1.f);
if (body->isActive() && (!body->isStaticOrKinematicObject()))
{
-
body->predictIntegratedTransform(timeStep, predictedTrans);
- btScalar squareMotion = (predictedTrans.getOrigin()-body->getWorldTransform().getOrigin()).length2();
+ btScalar squareMotion = (predictedTrans.getOrigin() - body->getWorldTransform().getOrigin()).length2();
if (getDispatchInfo().m_useContinuous && body->getCcdSquareMotionThreshold() && body->getCcdSquareMotionThreshold() < squareMotion)
{
@@ -905,60 +862,55 @@ void btDiscreteDynamicsWorld::createPredictiveContactsInternal( btRigidBody** bo
class StaticOnlyCallback : public btClosestNotMeConvexResultCallback
{
public:
-
- StaticOnlyCallback (btCollisionObject* me,const btVector3& fromA,const btVector3& toA,btOverlappingPairCache* pairCache,btDispatcher* dispatcher) :
- btClosestNotMeConvexResultCallback(me,fromA,toA,pairCache,dispatcher)
+ StaticOnlyCallback(btCollisionObject* me, const btVector3& fromA, const btVector3& toA, btOverlappingPairCache* pairCache, btDispatcher* dispatcher) : btClosestNotMeConvexResultCallback(me, fromA, toA, pairCache, dispatcher)
{
}
- virtual bool needsCollision(btBroadphaseProxy* proxy0) const
+ virtual bool needsCollision(btBroadphaseProxy* proxy0) const
{
- btCollisionObject* otherObj = (btCollisionObject*) proxy0->m_clientObject;
+ btCollisionObject* otherObj = (btCollisionObject*)proxy0->m_clientObject;
if (!otherObj->isStaticOrKinematicObject())
return false;
return btClosestNotMeConvexResultCallback::needsCollision(proxy0);
}
};
- StaticOnlyCallback sweepResults(body,body->getWorldTransform().getOrigin(),predictedTrans.getOrigin(),getBroadphase()->getOverlappingPairCache(),getDispatcher());
+ StaticOnlyCallback sweepResults(body, body->getWorldTransform().getOrigin(), predictedTrans.getOrigin(), getBroadphase()->getOverlappingPairCache(), getDispatcher());
#else
- btClosestNotMeConvexResultCallback sweepResults(body,body->getWorldTransform().getOrigin(),predictedTrans.getOrigin(),getBroadphase()->getOverlappingPairCache(),getDispatcher());
+ btClosestNotMeConvexResultCallback sweepResults(body, body->getWorldTransform().getOrigin(), predictedTrans.getOrigin(), getBroadphase()->getOverlappingPairCache(), getDispatcher());
#endif
//btConvexShape* convexShape = static_cast<btConvexShape*>(body->getCollisionShape());
- btSphereShape tmpSphere(body->getCcdSweptSphereRadius());//btConvexShape* convexShape = static_cast<btConvexShape*>(body->getCollisionShape());
- sweepResults.m_allowedPenetration=getDispatchInfo().m_allowedCcdPenetration;
+ btSphereShape tmpSphere(body->getCcdSweptSphereRadius()); //btConvexShape* convexShape = static_cast<btConvexShape*>(body->getCollisionShape());
+ sweepResults.m_allowedPenetration = getDispatchInfo().m_allowedCcdPenetration;
sweepResults.m_collisionFilterGroup = body->getBroadphaseProxy()->m_collisionFilterGroup;
- sweepResults.m_collisionFilterMask = body->getBroadphaseProxy()->m_collisionFilterMask;
+ sweepResults.m_collisionFilterMask = body->getBroadphaseProxy()->m_collisionFilterMask;
btTransform modifiedPredictedTrans = predictedTrans;
modifiedPredictedTrans.setBasis(body->getWorldTransform().getBasis());
- convexSweepTest(&tmpSphere,body->getWorldTransform(),modifiedPredictedTrans,sweepResults);
+ convexSweepTest(&tmpSphere, body->getWorldTransform(), modifiedPredictedTrans, sweepResults);
if (sweepResults.hasHit() && (sweepResults.m_closestHitFraction < 1.f))
{
-
- btVector3 distVec = (predictedTrans.getOrigin()-body->getWorldTransform().getOrigin())*sweepResults.m_closestHitFraction;
+ btVector3 distVec = (predictedTrans.getOrigin() - body->getWorldTransform().getOrigin()) * sweepResults.m_closestHitFraction;
btScalar distance = distVec.dot(-sweepResults.m_hitNormalWorld);
-
- btPersistentManifold* manifold = m_dispatcher1->getNewManifold(body,sweepResults.m_hitCollisionObject);
- btMutexLock( &m_predictiveManifoldsMutex );
+ btPersistentManifold* manifold = m_dispatcher1->getNewManifold(body, sweepResults.m_hitCollisionObject);
+ btMutexLock(&m_predictiveManifoldsMutex);
m_predictiveManifolds.push_back(manifold);
- btMutexUnlock( &m_predictiveManifoldsMutex );
+ btMutexUnlock(&m_predictiveManifoldsMutex);
- btVector3 worldPointB = body->getWorldTransform().getOrigin()+distVec;
- btVector3 localPointB = sweepResults.m_hitCollisionObject->getWorldTransform().inverse()*worldPointB;
+ btVector3 worldPointB = body->getWorldTransform().getOrigin() + distVec;
+ btVector3 localPointB = sweepResults.m_hitCollisionObject->getWorldTransform().inverse() * worldPointB;
- btManifoldPoint newPoint(btVector3(0,0,0), localPointB,sweepResults.m_hitNormalWorld,distance);
+ btManifoldPoint newPoint(btVector3(0, 0, 0), localPointB, sweepResults.m_hitNormalWorld, distance);
bool isPredictive = true;
int index = manifold->addManifoldPoint(newPoint, isPredictive);
btManifoldPoint& pt = manifold->getContactPoint(index);
pt.m_combinedRestitution = 0;
- pt.m_combinedFriction = gCalculateCombinedFrictionCallback(body,sweepResults.m_hitCollisionObject);
+ pt.m_combinedFriction = gCalculateCombinedFrictionCallback(body, sweepResults.m_hitCollisionObject);
pt.m_positionWorldOnA = body->getWorldTransform().getOrigin();
pt.m_positionWorldOnB = worldPointB;
-
}
}
}
@@ -968,42 +920,39 @@ void btDiscreteDynamicsWorld::createPredictiveContactsInternal( btRigidBody** bo
void btDiscreteDynamicsWorld::releasePredictiveContacts()
{
- BT_PROFILE( "release predictive contact manifolds" );
-
- for ( int i = 0; i < m_predictiveManifolds.size(); i++ )
- {
- btPersistentManifold* manifold = m_predictiveManifolds[ i ];
- this->m_dispatcher1->releaseManifold( manifold );
- }
- m_predictiveManifolds.clear();
+ BT_PROFILE("release predictive contact manifolds");
+
+ for (int i = 0; i < m_predictiveManifolds.size(); i++)
+ {
+ btPersistentManifold* manifold = m_predictiveManifolds[i];
+ this->m_dispatcher1->releaseManifold(manifold);
+ }
+ m_predictiveManifolds.clear();
}
void btDiscreteDynamicsWorld::createPredictiveContacts(btScalar timeStep)
{
BT_PROFILE("createPredictiveContacts");
- releasePredictiveContacts();
- if (m_nonStaticRigidBodies.size() > 0)
- {
- createPredictiveContactsInternal( &m_nonStaticRigidBodies[ 0 ], m_nonStaticRigidBodies.size(), timeStep );
- }
+ releasePredictiveContacts();
+ if (m_nonStaticRigidBodies.size() > 0)
+ {
+ createPredictiveContactsInternal(&m_nonStaticRigidBodies[0], m_nonStaticRigidBodies.size(), timeStep);
+ }
}
-void btDiscreteDynamicsWorld::integrateTransformsInternal( btRigidBody** bodies, int numBodies, btScalar timeStep )
+void btDiscreteDynamicsWorld::integrateTransformsInternal(btRigidBody** bodies, int numBodies, btScalar timeStep)
{
btTransform predictedTrans;
- for (int i=0;i<numBodies;i++)
+ for (int i = 0; i < numBodies; i++)
{
btRigidBody* body = bodies[i];
body->setHitFraction(1.f);
if (body->isActive() && (!body->isStaticOrKinematicObject()))
{
-
body->predictIntegratedTransform(timeStep, predictedTrans);
- btScalar squareMotion = (predictedTrans.getOrigin()-body->getWorldTransform().getOrigin()).length2();
-
-
+ btScalar squareMotion = (predictedTrans.getOrigin() - body->getWorldTransform().getOrigin()).length2();
if (getDispatchInfo().m_useContinuous && body->getCcdSquareMotionThreshold() && body->getCcdSquareMotionThreshold() < squareMotion)
{
@@ -1015,43 +964,40 @@ void btDiscreteDynamicsWorld::integrateTransformsInternal( btRigidBody** bodies,
class StaticOnlyCallback : public btClosestNotMeConvexResultCallback
{
public:
-
- StaticOnlyCallback (btCollisionObject* me,const btVector3& fromA,const btVector3& toA,btOverlappingPairCache* pairCache,btDispatcher* dispatcher) :
- btClosestNotMeConvexResultCallback(me,fromA,toA,pairCache,dispatcher)
+ StaticOnlyCallback(btCollisionObject* me, const btVector3& fromA, const btVector3& toA, btOverlappingPairCache* pairCache, btDispatcher* dispatcher) : btClosestNotMeConvexResultCallback(me, fromA, toA, pairCache, dispatcher)
{
}
- virtual bool needsCollision(btBroadphaseProxy* proxy0) const
+ virtual bool needsCollision(btBroadphaseProxy* proxy0) const
{
- btCollisionObject* otherObj = (btCollisionObject*) proxy0->m_clientObject;
+ btCollisionObject* otherObj = (btCollisionObject*)proxy0->m_clientObject;
if (!otherObj->isStaticOrKinematicObject())
return false;
return btClosestNotMeConvexResultCallback::needsCollision(proxy0);
}
};
- StaticOnlyCallback sweepResults(body,body->getWorldTransform().getOrigin(),predictedTrans.getOrigin(),getBroadphase()->getOverlappingPairCache(),getDispatcher());
+ StaticOnlyCallback sweepResults(body, body->getWorldTransform().getOrigin(), predictedTrans.getOrigin(), getBroadphase()->getOverlappingPairCache(), getDispatcher());
#else
- btClosestNotMeConvexResultCallback sweepResults(body,body->getWorldTransform().getOrigin(),predictedTrans.getOrigin(),getBroadphase()->getOverlappingPairCache(),getDispatcher());
+ btClosestNotMeConvexResultCallback sweepResults(body, body->getWorldTransform().getOrigin(), predictedTrans.getOrigin(), getBroadphase()->getOverlappingPairCache(), getDispatcher());
#endif
//btConvexShape* convexShape = static_cast<btConvexShape*>(body->getCollisionShape());
- btSphereShape tmpSphere(body->getCcdSweptSphereRadius());//btConvexShape* convexShape = static_cast<btConvexShape*>(body->getCollisionShape());
- sweepResults.m_allowedPenetration=getDispatchInfo().m_allowedCcdPenetration;
+ btSphereShape tmpSphere(body->getCcdSweptSphereRadius()); //btConvexShape* convexShape = static_cast<btConvexShape*>(body->getCollisionShape());
+ sweepResults.m_allowedPenetration = getDispatchInfo().m_allowedCcdPenetration;
sweepResults.m_collisionFilterGroup = body->getBroadphaseProxy()->m_collisionFilterGroup;
- sweepResults.m_collisionFilterMask = body->getBroadphaseProxy()->m_collisionFilterMask;
+ sweepResults.m_collisionFilterMask = body->getBroadphaseProxy()->m_collisionFilterMask;
btTransform modifiedPredictedTrans = predictedTrans;
modifiedPredictedTrans.setBasis(body->getWorldTransform().getBasis());
- convexSweepTest(&tmpSphere,body->getWorldTransform(),modifiedPredictedTrans,sweepResults);
+ convexSweepTest(&tmpSphere, body->getWorldTransform(), modifiedPredictedTrans, sweepResults);
if (sweepResults.hasHit() && (sweepResults.m_closestHitFraction < 1.f))
{
-
//printf("clamped integration to hit fraction = %f\n",fraction);
body->setHitFraction(sweepResults.m_closestHitFraction);
- body->predictIntegratedTransform(timeStep*body->getHitFraction(), predictedTrans);
+ body->predictIntegratedTransform(timeStep * body->getHitFraction(), predictedTrans);
body->setHitFraction(0.f);
- body->proceedToTransform( predictedTrans);
+ body->proceedToTransform(predictedTrans);
#if 0
btVector3 linVel = body->getLinearVelocity();
@@ -1078,50 +1024,45 @@ void btDiscreteDynamicsWorld::integrateTransformsInternal( btRigidBody** bodies,
//btScalar depth = 0.f;
//appliedImpulse = resolveSingleCollision(body,(btCollisionObject*)sweepResults.m_hitCollisionObject,sweepResults.m_hitPointWorld,sweepResults.m_hitNormalWorld,getSolverInfo(), depth);
-
#endif
- continue;
+ continue;
}
}
}
-
- body->proceedToTransform( predictedTrans);
-
+ body->proceedToTransform(predictedTrans);
}
-
}
-
}
void btDiscreteDynamicsWorld::integrateTransforms(btScalar timeStep)
{
BT_PROFILE("integrateTransforms");
- if (m_nonStaticRigidBodies.size() > 0)
- {
- integrateTransformsInternal(&m_nonStaticRigidBodies[0], m_nonStaticRigidBodies.size(), timeStep);
- }
+ if (m_nonStaticRigidBodies.size() > 0)
+ {
+ integrateTransformsInternal(&m_nonStaticRigidBodies[0], m_nonStaticRigidBodies.size(), timeStep);
+ }
- ///this should probably be switched on by default, but it is not well tested yet
+ ///this should probably be switched on by default, but it is not well tested yet
if (m_applySpeculativeContactRestitution)
{
BT_PROFILE("apply speculative contact restitution");
- for (int i=0;i<m_predictiveManifolds.size();i++)
+ for (int i = 0; i < m_predictiveManifolds.size(); i++)
{
btPersistentManifold* manifold = m_predictiveManifolds[i];
btRigidBody* body0 = btRigidBody::upcast((btCollisionObject*)manifold->getBody0());
btRigidBody* body1 = btRigidBody::upcast((btCollisionObject*)manifold->getBody1());
- for (int p=0;p<manifold->getNumContacts();p++)
+ for (int p = 0; p < manifold->getNumContacts(); p++)
{
const btManifoldPoint& pt = manifold->getContactPoint(p);
btScalar combinedRestitution = gCalculateCombinedRestitutionCallback(body0, body1);
- if (combinedRestitution>0 && pt.m_appliedImpulse != 0.f)
+ if (combinedRestitution > 0 && pt.m_appliedImpulse != 0.f)
//if (pt.getDistance()>0 && combinedRestitution>0 && pt.m_appliedImpulse != 0.f)
{
- btVector3 imp = -pt.m_normalWorldOnB * pt.m_appliedImpulse* combinedRestitution;
+ btVector3 imp = -pt.m_normalWorldOnB * pt.m_appliedImpulse * combinedRestitution;
const btVector3& pos1 = pt.getPositionWorldOnA();
const btVector3& pos2 = pt.getPositionWorldOnB();
@@ -1130,23 +1071,19 @@ void btDiscreteDynamicsWorld::integrateTransforms(btScalar timeStep)
btVector3 rel_pos1 = pos2 - body1->getWorldTransform().getOrigin();
if (body0)
- body0->applyImpulse(imp,rel_pos0);
+ body0->applyImpulse(imp, rel_pos0);
if (body1)
- body1->applyImpulse(-imp,rel_pos1);
+ body1->applyImpulse(-imp, rel_pos1);
}
}
}
}
}
-
-
-
-
-void btDiscreteDynamicsWorld::predictUnconstraintMotion(btScalar timeStep)
+void btDiscreteDynamicsWorld::predictUnconstraintMotion(btScalar timeStep)
{
BT_PROFILE("predictUnconstraintMotion");
- for ( int i=0;i<m_nonStaticRigidBodies.size();i++)
+ for (int i = 0; i < m_nonStaticRigidBodies.size(); i++)
{
btRigidBody* body = m_nonStaticRigidBodies[i];
if (!body->isStaticOrKinematicObject())
@@ -1155,179 +1092,171 @@ void btDiscreteDynamicsWorld::predictUnconstraintMotion(btScalar timeStep)
body->applyDamping(timeStep);
- body->predictIntegratedTransform(timeStep,body->getInterpolationWorldTransform());
+ body->predictIntegratedTransform(timeStep, body->getInterpolationWorldTransform());
}
}
}
-
-void btDiscreteDynamicsWorld::startProfiling(btScalar timeStep)
+void btDiscreteDynamicsWorld::startProfiling(btScalar timeStep)
{
(void)timeStep;
#ifndef BT_NO_PROFILE
CProfileManager::Reset();
-#endif //BT_NO_PROFILE
-
+#endif //BT_NO_PROFILE
}
-
-
-
-
-
void btDiscreteDynamicsWorld::debugDrawConstraint(btTypedConstraint* constraint)
{
bool drawFrames = (getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_DrawConstraints) != 0;
bool drawLimits = (getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_DrawConstraintLimits) != 0;
btScalar dbgDrawSize = constraint->getDbgDrawSize();
- if(dbgDrawSize <= btScalar(0.f))
+ if (dbgDrawSize <= btScalar(0.f))
{
return;
}
- switch(constraint->getConstraintType())
+ switch (constraint->getConstraintType())
{
case POINT2POINT_CONSTRAINT_TYPE:
+ {
+ btPoint2PointConstraint* p2pC = (btPoint2PointConstraint*)constraint;
+ btTransform tr;
+ tr.setIdentity();
+ btVector3 pivot = p2pC->getPivotInA();
+ pivot = p2pC->getRigidBodyA().getCenterOfMassTransform() * pivot;
+ tr.setOrigin(pivot);
+ getDebugDrawer()->drawTransform(tr, dbgDrawSize);
+ // that ideally should draw the same frame
+ pivot = p2pC->getPivotInB();
+ pivot = p2pC->getRigidBodyB().getCenterOfMassTransform() * pivot;
+ tr.setOrigin(pivot);
+ if (drawFrames) getDebugDrawer()->drawTransform(tr, dbgDrawSize);
+ }
+ break;
+ case HINGE_CONSTRAINT_TYPE:
+ {
+ btHingeConstraint* pHinge = (btHingeConstraint*)constraint;
+ btTransform tr = pHinge->getRigidBodyA().getCenterOfMassTransform() * pHinge->getAFrame();
+ if (drawFrames) getDebugDrawer()->drawTransform(tr, dbgDrawSize);
+ tr = pHinge->getRigidBodyB().getCenterOfMassTransform() * pHinge->getBFrame();
+ if (drawFrames) getDebugDrawer()->drawTransform(tr, dbgDrawSize);
+ btScalar minAng = pHinge->getLowerLimit();
+ btScalar maxAng = pHinge->getUpperLimit();
+ if (minAng == maxAng)
{
- btPoint2PointConstraint* p2pC = (btPoint2PointConstraint*)constraint;
- btTransform tr;
- tr.setIdentity();
- btVector3 pivot = p2pC->getPivotInA();
- pivot = p2pC->getRigidBodyA().getCenterOfMassTransform() * pivot;
- tr.setOrigin(pivot);
- getDebugDrawer()->drawTransform(tr, dbgDrawSize);
- // that ideally should draw the same frame
- pivot = p2pC->getPivotInB();
- pivot = p2pC->getRigidBodyB().getCenterOfMassTransform() * pivot;
- tr.setOrigin(pivot);
- if(drawFrames) getDebugDrawer()->drawTransform(tr, dbgDrawSize);
+ break;
}
- break;
- case HINGE_CONSTRAINT_TYPE:
+ bool drawSect = true;
+ if (!pHinge->hasLimit())
{
- btHingeConstraint* pHinge = (btHingeConstraint*)constraint;
- btTransform tr = pHinge->getRigidBodyA().getCenterOfMassTransform() * pHinge->getAFrame();
- if(drawFrames) getDebugDrawer()->drawTransform(tr, dbgDrawSize);
- tr = pHinge->getRigidBodyB().getCenterOfMassTransform() * pHinge->getBFrame();
- if(drawFrames) getDebugDrawer()->drawTransform(tr, dbgDrawSize);
- btScalar minAng = pHinge->getLowerLimit();
- btScalar maxAng = pHinge->getUpperLimit();
- if(minAng == maxAng)
- {
- break;
- }
- bool drawSect = true;
- if(!pHinge->hasLimit())
- {
- minAng = btScalar(0.f);
- maxAng = SIMD_2_PI;
- drawSect = false;
- }
- if(drawLimits)
- {
- btVector3& center = tr.getOrigin();
- btVector3 normal = tr.getBasis().getColumn(2);
- btVector3 axis = tr.getBasis().getColumn(0);
- getDebugDrawer()->drawArc(center, normal, axis, dbgDrawSize, dbgDrawSize, minAng, maxAng, btVector3(0,0,0), drawSect);
- }
+ minAng = btScalar(0.f);
+ maxAng = SIMD_2_PI;
+ drawSect = false;
}
- break;
+ if (drawLimits)
+ {
+ btVector3& center = tr.getOrigin();
+ btVector3 normal = tr.getBasis().getColumn(2);
+ btVector3 axis = tr.getBasis().getColumn(0);
+ getDebugDrawer()->drawArc(center, normal, axis, dbgDrawSize, dbgDrawSize, minAng, maxAng, btVector3(0, 0, 0), drawSect);
+ }
+ }
+ break;
case CONETWIST_CONSTRAINT_TYPE:
+ {
+ btConeTwistConstraint* pCT = (btConeTwistConstraint*)constraint;
+ btTransform tr = pCT->getRigidBodyA().getCenterOfMassTransform() * pCT->getAFrame();
+ if (drawFrames) getDebugDrawer()->drawTransform(tr, dbgDrawSize);
+ tr = pCT->getRigidBodyB().getCenterOfMassTransform() * pCT->getBFrame();
+ if (drawFrames) getDebugDrawer()->drawTransform(tr, dbgDrawSize);
+ if (drawLimits)
{
- btConeTwistConstraint* pCT = (btConeTwistConstraint*)constraint;
- btTransform tr = pCT->getRigidBodyA().getCenterOfMassTransform() * pCT->getAFrame();
- if(drawFrames) getDebugDrawer()->drawTransform(tr, dbgDrawSize);
- tr = pCT->getRigidBodyB().getCenterOfMassTransform() * pCT->getBFrame();
- if(drawFrames) getDebugDrawer()->drawTransform(tr, dbgDrawSize);
- if(drawLimits)
+ //const btScalar length = btScalar(5);
+ const btScalar length = dbgDrawSize;
+ static int nSegments = 8 * 4;
+ btScalar fAngleInRadians = btScalar(2. * 3.1415926) * (btScalar)(nSegments - 1) / btScalar(nSegments);
+ btVector3 pPrev = pCT->GetPointForAngle(fAngleInRadians, length);
+ pPrev = tr * pPrev;
+ for (int i = 0; i < nSegments; i++)
{
- //const btScalar length = btScalar(5);
- const btScalar length = dbgDrawSize;
- static int nSegments = 8*4;
- btScalar fAngleInRadians = btScalar(2.*3.1415926) * (btScalar)(nSegments-1)/btScalar(nSegments);
- btVector3 pPrev = pCT->GetPointForAngle(fAngleInRadians, length);
- pPrev = tr * pPrev;
- for (int i=0; i<nSegments; i++)
- {
- fAngleInRadians = btScalar(2.*3.1415926) * (btScalar)i/btScalar(nSegments);
- btVector3 pCur = pCT->GetPointForAngle(fAngleInRadians, length);
- pCur = tr * pCur;
- getDebugDrawer()->drawLine(pPrev, pCur, btVector3(0,0,0));
-
- if (i%(nSegments/8) == 0)
- getDebugDrawer()->drawLine(tr.getOrigin(), pCur, btVector3(0,0,0));
+ fAngleInRadians = btScalar(2. * 3.1415926) * (btScalar)i / btScalar(nSegments);
+ btVector3 pCur = pCT->GetPointForAngle(fAngleInRadians, length);
+ pCur = tr * pCur;
+ getDebugDrawer()->drawLine(pPrev, pCur, btVector3(0, 0, 0));
- pPrev = pCur;
- }
- btScalar tws = pCT->getTwistSpan();
- btScalar twa = pCT->getTwistAngle();
- bool useFrameB = (pCT->getRigidBodyB().getInvMass() > btScalar(0.f));
- if(useFrameB)
- {
- tr = pCT->getRigidBodyB().getCenterOfMassTransform() * pCT->getBFrame();
- }
- else
- {
- tr = pCT->getRigidBodyA().getCenterOfMassTransform() * pCT->getAFrame();
- }
- btVector3 pivot = tr.getOrigin();
- btVector3 normal = tr.getBasis().getColumn(0);
- btVector3 axis1 = tr.getBasis().getColumn(1);
- getDebugDrawer()->drawArc(pivot, normal, axis1, dbgDrawSize, dbgDrawSize, -twa-tws, -twa+tws, btVector3(0,0,0), true);
+ if (i % (nSegments / 8) == 0)
+ getDebugDrawer()->drawLine(tr.getOrigin(), pCur, btVector3(0, 0, 0));
+ pPrev = pCur;
+ }
+ btScalar tws = pCT->getTwistSpan();
+ btScalar twa = pCT->getTwistAngle();
+ bool useFrameB = (pCT->getRigidBodyB().getInvMass() > btScalar(0.f));
+ if (useFrameB)
+ {
+ tr = pCT->getRigidBodyB().getCenterOfMassTransform() * pCT->getBFrame();
}
+ else
+ {
+ tr = pCT->getRigidBodyA().getCenterOfMassTransform() * pCT->getAFrame();
+ }
+ btVector3 pivot = tr.getOrigin();
+ btVector3 normal = tr.getBasis().getColumn(0);
+ btVector3 axis1 = tr.getBasis().getColumn(1);
+ getDebugDrawer()->drawArc(pivot, normal, axis1, dbgDrawSize, dbgDrawSize, -twa - tws, -twa + tws, btVector3(0, 0, 0), true);
}
- break;
+ }
+ break;
case D6_SPRING_CONSTRAINT_TYPE:
case D6_CONSTRAINT_TYPE:
+ {
+ btGeneric6DofConstraint* p6DOF = (btGeneric6DofConstraint*)constraint;
+ btTransform tr = p6DOF->getCalculatedTransformA();
+ if (drawFrames) getDebugDrawer()->drawTransform(tr, dbgDrawSize);
+ tr = p6DOF->getCalculatedTransformB();
+ if (drawFrames) getDebugDrawer()->drawTransform(tr, dbgDrawSize);
+ if (drawLimits)
{
- btGeneric6DofConstraint* p6DOF = (btGeneric6DofConstraint*)constraint;
- btTransform tr = p6DOF->getCalculatedTransformA();
- if(drawFrames) getDebugDrawer()->drawTransform(tr, dbgDrawSize);
+ tr = p6DOF->getCalculatedTransformA();
+ const btVector3& center = p6DOF->getCalculatedTransformB().getOrigin();
+ btVector3 up = tr.getBasis().getColumn(2);
+ btVector3 axis = tr.getBasis().getColumn(0);
+ btScalar minTh = p6DOF->getRotationalLimitMotor(1)->m_loLimit;
+ btScalar maxTh = p6DOF->getRotationalLimitMotor(1)->m_hiLimit;
+ btScalar minPs = p6DOF->getRotationalLimitMotor(2)->m_loLimit;
+ btScalar maxPs = p6DOF->getRotationalLimitMotor(2)->m_hiLimit;
+ getDebugDrawer()->drawSpherePatch(center, up, axis, dbgDrawSize * btScalar(.9f), minTh, maxTh, minPs, maxPs, btVector3(0, 0, 0));
+ axis = tr.getBasis().getColumn(1);
+ btScalar ay = p6DOF->getAngle(1);
+ btScalar az = p6DOF->getAngle(2);
+ btScalar cy = btCos(ay);
+ btScalar sy = btSin(ay);
+ btScalar cz = btCos(az);
+ btScalar sz = btSin(az);
+ btVector3 ref;
+ ref[0] = cy * cz * axis[0] + cy * sz * axis[1] - sy * axis[2];
+ ref[1] = -sz * axis[0] + cz * axis[1];
+ ref[2] = cz * sy * axis[0] + sz * sy * axis[1] + cy * axis[2];
tr = p6DOF->getCalculatedTransformB();
- if(drawFrames) getDebugDrawer()->drawTransform(tr, dbgDrawSize);
- if(drawLimits)
+ btVector3 normal = -tr.getBasis().getColumn(0);
+ btScalar minFi = p6DOF->getRotationalLimitMotor(0)->m_loLimit;
+ btScalar maxFi = p6DOF->getRotationalLimitMotor(0)->m_hiLimit;
+ if (minFi > maxFi)
{
- tr = p6DOF->getCalculatedTransformA();
- const btVector3& center = p6DOF->getCalculatedTransformB().getOrigin();
- btVector3 up = tr.getBasis().getColumn(2);
- btVector3 axis = tr.getBasis().getColumn(0);
- btScalar minTh = p6DOF->getRotationalLimitMotor(1)->m_loLimit;
- btScalar maxTh = p6DOF->getRotationalLimitMotor(1)->m_hiLimit;
- btScalar minPs = p6DOF->getRotationalLimitMotor(2)->m_loLimit;
- btScalar maxPs = p6DOF->getRotationalLimitMotor(2)->m_hiLimit;
- getDebugDrawer()->drawSpherePatch(center, up, axis, dbgDrawSize * btScalar(.9f), minTh, maxTh, minPs, maxPs, btVector3(0,0,0));
- axis = tr.getBasis().getColumn(1);
- btScalar ay = p6DOF->getAngle(1);
- btScalar az = p6DOF->getAngle(2);
- btScalar cy = btCos(ay);
- btScalar sy = btSin(ay);
- btScalar cz = btCos(az);
- btScalar sz = btSin(az);
- btVector3 ref;
- ref[0] = cy*cz*axis[0] + cy*sz*axis[1] - sy*axis[2];
- ref[1] = -sz*axis[0] + cz*axis[1];
- ref[2] = cz*sy*axis[0] + sz*sy*axis[1] + cy*axis[2];
- tr = p6DOF->getCalculatedTransformB();
- btVector3 normal = -tr.getBasis().getColumn(0);
- btScalar minFi = p6DOF->getRotationalLimitMotor(0)->m_loLimit;
- btScalar maxFi = p6DOF->getRotationalLimitMotor(0)->m_hiLimit;
- if(minFi > maxFi)
- {
- getDebugDrawer()->drawArc(center, normal, ref, dbgDrawSize, dbgDrawSize, -SIMD_PI, SIMD_PI, btVector3(0,0,0), false);
- }
- else if(minFi < maxFi)
- {
- getDebugDrawer()->drawArc(center, normal, ref, dbgDrawSize, dbgDrawSize, minFi, maxFi, btVector3(0,0,0), true);
- }
- tr = p6DOF->getCalculatedTransformA();
- btVector3 bbMin = p6DOF->getTranslationalLimitMotor()->m_lowerLimit;
- btVector3 bbMax = p6DOF->getTranslationalLimitMotor()->m_upperLimit;
- getDebugDrawer()->drawBox(bbMin, bbMax, tr, btVector3(0,0,0));
+ getDebugDrawer()->drawArc(center, normal, ref, dbgDrawSize, dbgDrawSize, -SIMD_PI, SIMD_PI, btVector3(0, 0, 0), false);
}
+ else if (minFi < maxFi)
+ {
+ getDebugDrawer()->drawArc(center, normal, ref, dbgDrawSize, dbgDrawSize, minFi, maxFi, btVector3(0, 0, 0), true);
+ }
+ tr = p6DOF->getCalculatedTransformA();
+ btVector3 bbMin = p6DOF->getTranslationalLimitMotor()->m_lowerLimit;
+ btVector3 bbMax = p6DOF->getTranslationalLimitMotor()->m_upperLimit;
+ getDebugDrawer()->drawBox(bbMin, bbMax, tr, btVector3(0, 0, 0));
}
- break;
+ }
+ break;
///note: the code for D6_SPRING_2_CONSTRAINT_TYPE is identical to D6_CONSTRAINT_TYPE, the D6_CONSTRAINT_TYPE+D6_SPRING_CONSTRAINT_TYPE will likely become obsolete/deprecated at some stage
case D6_SPRING_2_CONSTRAINT_TYPE:
{
@@ -1359,9 +1288,9 @@ void btDiscreteDynamicsWorld::debugDrawConstraint(btTypedConstraint* constraint)
btScalar cz = btCos(az);
btScalar sz = btSin(az);
btVector3 ref;
- ref[0] = cy*cz*axis[0] + cy*sz*axis[1] - sy*axis[2];
- ref[1] = -sz*axis[0] + cz*axis[1];
- ref[2] = cz*sy*axis[0] + sz*sy*axis[1] + cy*axis[2];
+ ref[0] = cy * cz * axis[0] + cy * sz * axis[1] - sy * axis[2];
+ ref[1] = -sz * axis[0] + cz * axis[1];
+ ref[2] = cz * sy * axis[0] + sz * sy * axis[1] + cy * axis[2];
tr = p6DOF->getCalculatedTransformB();
btVector3 normal = -tr.getBasis().getColumn(0);
btScalar minFi = p6DOF->getRotationalLimitMotor(0)->m_loLimit;
@@ -1383,42 +1312,38 @@ void btDiscreteDynamicsWorld::debugDrawConstraint(btTypedConstraint* constraint)
break;
}
case SLIDER_CONSTRAINT_TYPE:
+ {
+ btSliderConstraint* pSlider = (btSliderConstraint*)constraint;
+ btTransform tr = pSlider->getCalculatedTransformA();
+ if (drawFrames) getDebugDrawer()->drawTransform(tr, dbgDrawSize);
+ tr = pSlider->getCalculatedTransformB();
+ if (drawFrames) getDebugDrawer()->drawTransform(tr, dbgDrawSize);
+ if (drawLimits)
{
- btSliderConstraint* pSlider = (btSliderConstraint*)constraint;
- btTransform tr = pSlider->getCalculatedTransformA();
- if(drawFrames) getDebugDrawer()->drawTransform(tr, dbgDrawSize);
- tr = pSlider->getCalculatedTransformB();
- if(drawFrames) getDebugDrawer()->drawTransform(tr, dbgDrawSize);
- if(drawLimits)
- {
- btTransform tr = pSlider->getUseLinearReferenceFrameA() ? pSlider->getCalculatedTransformA() : pSlider->getCalculatedTransformB();
- btVector3 li_min = tr * btVector3(pSlider->getLowerLinLimit(), 0.f, 0.f);
- btVector3 li_max = tr * btVector3(pSlider->getUpperLinLimit(), 0.f, 0.f);
- getDebugDrawer()->drawLine(li_min, li_max, btVector3(0, 0, 0));
- btVector3 normal = tr.getBasis().getColumn(0);
- btVector3 axis = tr.getBasis().getColumn(1);
- btScalar a_min = pSlider->getLowerAngLimit();
- btScalar a_max = pSlider->getUpperAngLimit();
- const btVector3& center = pSlider->getCalculatedTransformB().getOrigin();
- getDebugDrawer()->drawArc(center, normal, axis, dbgDrawSize, dbgDrawSize, a_min, a_max, btVector3(0,0,0), true);
- }
+ btTransform tr = pSlider->getUseLinearReferenceFrameA() ? pSlider->getCalculatedTransformA() : pSlider->getCalculatedTransformB();
+ btVector3 li_min = tr * btVector3(pSlider->getLowerLinLimit(), 0.f, 0.f);
+ btVector3 li_max = tr * btVector3(pSlider->getUpperLinLimit(), 0.f, 0.f);
+ getDebugDrawer()->drawLine(li_min, li_max, btVector3(0, 0, 0));
+ btVector3 normal = tr.getBasis().getColumn(0);
+ btVector3 axis = tr.getBasis().getColumn(1);
+ btScalar a_min = pSlider->getLowerAngLimit();
+ btScalar a_max = pSlider->getUpperAngLimit();
+ const btVector3& center = pSlider->getCalculatedTransformB().getOrigin();
+ getDebugDrawer()->drawArc(center, normal, axis, dbgDrawSize, dbgDrawSize, a_min, a_max, btVector3(0, 0, 0), true);
}
- break;
- default :
+ }
+ break;
+ default:
break;
}
return;
}
-
-
-
-
-void btDiscreteDynamicsWorld::setConstraintSolver(btConstraintSolver* solver)
+void btDiscreteDynamicsWorld::setConstraintSolver(btConstraintSolver* solver)
{
if (m_ownsConstraintSolver)
{
- btAlignedFree( m_constraintSolver);
+ btAlignedFree(m_constraintSolver);
}
m_ownsConstraintSolver = false;
m_constraintSolver = solver;
@@ -1430,8 +1355,7 @@ btConstraintSolver* btDiscreteDynamicsWorld::getConstraintSolver()
return m_constraintSolver;
}
-
-int btDiscreteDynamicsWorld::getNumConstraints() const
+int btDiscreteDynamicsWorld::getNumConstraints() const
{
return int(m_constraints.size());
}
@@ -1444,93 +1368,87 @@ const btTypedConstraint* btDiscreteDynamicsWorld::getConstraint(int index) const
return m_constraints[index];
}
-
-
-void btDiscreteDynamicsWorld::serializeRigidBodies(btSerializer* serializer)
+void btDiscreteDynamicsWorld::serializeRigidBodies(btSerializer* serializer)
{
int i;
//serialize all collision objects
- for (i=0;i<m_collisionObjects.size();i++)
+ for (i = 0; i < m_collisionObjects.size(); i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
if (colObj->getInternalType() & btCollisionObject::CO_RIGID_BODY)
{
int len = colObj->calculateSerializeBufferSize();
- btChunk* chunk = serializer->allocate(len,1);
+ btChunk* chunk = serializer->allocate(len, 1);
const char* structType = colObj->serialize(chunk->m_oldPtr, serializer);
- serializer->finalizeChunk(chunk,structType,BT_RIGIDBODY_CODE,colObj);
+ serializer->finalizeChunk(chunk, structType, BT_RIGIDBODY_CODE, colObj);
}
}
- for (i=0;i<m_constraints.size();i++)
+ for (i = 0; i < m_constraints.size(); i++)
{
btTypedConstraint* constraint = m_constraints[i];
int size = constraint->calculateSerializeBufferSize();
- btChunk* chunk = serializer->allocate(size,1);
- const char* structType = constraint->serialize(chunk->m_oldPtr,serializer);
- serializer->finalizeChunk(chunk,structType,BT_CONSTRAINT_CODE,constraint);
+ btChunk* chunk = serializer->allocate(size, 1);
+ const char* structType = constraint->serialize(chunk->m_oldPtr, serializer);
+ serializer->finalizeChunk(chunk, structType, BT_CONSTRAINT_CODE, constraint);
}
}
-
-
-
-void btDiscreteDynamicsWorld::serializeDynamicsWorldInfo(btSerializer* serializer)
+void btDiscreteDynamicsWorld::serializeDynamicsWorldInfo(btSerializer* serializer)
{
#ifdef BT_USE_DOUBLE_PRECISION
- int len = sizeof(btDynamicsWorldDoubleData);
- btChunk* chunk = serializer->allocate(len,1);
- btDynamicsWorldDoubleData* worldInfo = (btDynamicsWorldDoubleData*)chunk->m_oldPtr;
-#else//BT_USE_DOUBLE_PRECISION
- int len = sizeof(btDynamicsWorldFloatData);
- btChunk* chunk = serializer->allocate(len,1);
- btDynamicsWorldFloatData* worldInfo = (btDynamicsWorldFloatData*)chunk->m_oldPtr;
-#endif//BT_USE_DOUBLE_PRECISION
-
- memset(worldInfo ,0x00,len);
-
- m_gravity.serialize(worldInfo->m_gravity);
- worldInfo->m_solverInfo.m_tau = getSolverInfo().m_tau;
- worldInfo->m_solverInfo.m_damping = getSolverInfo().m_damping;
- worldInfo->m_solverInfo.m_friction = getSolverInfo().m_friction;
- worldInfo->m_solverInfo.m_timeStep = getSolverInfo().m_timeStep;
-
- worldInfo->m_solverInfo.m_restitution = getSolverInfo().m_restitution;
- worldInfo->m_solverInfo.m_maxErrorReduction = getSolverInfo().m_maxErrorReduction;
- worldInfo->m_solverInfo.m_sor = getSolverInfo().m_sor;
- worldInfo->m_solverInfo.m_erp = getSolverInfo().m_erp;
-
- worldInfo->m_solverInfo.m_erp2 = getSolverInfo().m_erp2;
- worldInfo->m_solverInfo.m_globalCfm = getSolverInfo().m_globalCfm;
- worldInfo->m_solverInfo.m_splitImpulsePenetrationThreshold = getSolverInfo().m_splitImpulsePenetrationThreshold;
- worldInfo->m_solverInfo.m_splitImpulseTurnErp = getSolverInfo().m_splitImpulseTurnErp;
-
- worldInfo->m_solverInfo.m_linearSlop = getSolverInfo().m_linearSlop;
- worldInfo->m_solverInfo.m_warmstartingFactor = getSolverInfo().m_warmstartingFactor;
- worldInfo->m_solverInfo.m_maxGyroscopicForce = getSolverInfo().m_maxGyroscopicForce;
- worldInfo->m_solverInfo.m_singleAxisRollingFrictionThreshold = getSolverInfo().m_singleAxisRollingFrictionThreshold;
-
- worldInfo->m_solverInfo.m_numIterations = getSolverInfo().m_numIterations;
- worldInfo->m_solverInfo.m_solverMode = getSolverInfo().m_solverMode;
- worldInfo->m_solverInfo.m_restingContactRestitutionThreshold = getSolverInfo().m_restingContactRestitutionThreshold;
- worldInfo->m_solverInfo.m_minimumSolverBatchSize = getSolverInfo().m_minimumSolverBatchSize;
-
- worldInfo->m_solverInfo.m_splitImpulse = getSolverInfo().m_splitImpulse;
-
- // Fill padding with zeros to appease msan.
- memset(worldInfo->m_solverInfo.m_padding, 0, sizeof(worldInfo->m_solverInfo.m_padding));
+ int len = sizeof(btDynamicsWorldDoubleData);
+ btChunk* chunk = serializer->allocate(len, 1);
+ btDynamicsWorldDoubleData* worldInfo = (btDynamicsWorldDoubleData*)chunk->m_oldPtr;
+#else //BT_USE_DOUBLE_PRECISION
+ int len = sizeof(btDynamicsWorldFloatData);
+ btChunk* chunk = serializer->allocate(len, 1);
+ btDynamicsWorldFloatData* worldInfo = (btDynamicsWorldFloatData*)chunk->m_oldPtr;
+#endif //BT_USE_DOUBLE_PRECISION
+
+ memset(worldInfo, 0x00, len);
+
+ m_gravity.serialize(worldInfo->m_gravity);
+ worldInfo->m_solverInfo.m_tau = getSolverInfo().m_tau;
+ worldInfo->m_solverInfo.m_damping = getSolverInfo().m_damping;
+ worldInfo->m_solverInfo.m_friction = getSolverInfo().m_friction;
+ worldInfo->m_solverInfo.m_timeStep = getSolverInfo().m_timeStep;
+
+ worldInfo->m_solverInfo.m_restitution = getSolverInfo().m_restitution;
+ worldInfo->m_solverInfo.m_maxErrorReduction = getSolverInfo().m_maxErrorReduction;
+ worldInfo->m_solverInfo.m_sor = getSolverInfo().m_sor;
+ worldInfo->m_solverInfo.m_erp = getSolverInfo().m_erp;
+
+ worldInfo->m_solverInfo.m_erp2 = getSolverInfo().m_erp2;
+ worldInfo->m_solverInfo.m_globalCfm = getSolverInfo().m_globalCfm;
+ worldInfo->m_solverInfo.m_splitImpulsePenetrationThreshold = getSolverInfo().m_splitImpulsePenetrationThreshold;
+ worldInfo->m_solverInfo.m_splitImpulseTurnErp = getSolverInfo().m_splitImpulseTurnErp;
+
+ worldInfo->m_solverInfo.m_linearSlop = getSolverInfo().m_linearSlop;
+ worldInfo->m_solverInfo.m_warmstartingFactor = getSolverInfo().m_warmstartingFactor;
+ worldInfo->m_solverInfo.m_maxGyroscopicForce = getSolverInfo().m_maxGyroscopicForce;
+ worldInfo->m_solverInfo.m_singleAxisRollingFrictionThreshold = getSolverInfo().m_singleAxisRollingFrictionThreshold;
+
+ worldInfo->m_solverInfo.m_numIterations = getSolverInfo().m_numIterations;
+ worldInfo->m_solverInfo.m_solverMode = getSolverInfo().m_solverMode;
+ worldInfo->m_solverInfo.m_restingContactRestitutionThreshold = getSolverInfo().m_restingContactRestitutionThreshold;
+ worldInfo->m_solverInfo.m_minimumSolverBatchSize = getSolverInfo().m_minimumSolverBatchSize;
+
+ worldInfo->m_solverInfo.m_splitImpulse = getSolverInfo().m_splitImpulse;
+
+ // Fill padding with zeros to appease msan.
+ memset(worldInfo->m_solverInfo.m_padding, 0, sizeof(worldInfo->m_solverInfo.m_padding));
#ifdef BT_USE_DOUBLE_PRECISION
- const char* structType = "btDynamicsWorldDoubleData";
-#else//BT_USE_DOUBLE_PRECISION
- const char* structType = "btDynamicsWorldFloatData";
-#endif//BT_USE_DOUBLE_PRECISION
- serializer->finalizeChunk(chunk,structType,BT_DYNAMICSWORLD_CODE,worldInfo);
+ const char* structType = "btDynamicsWorldDoubleData";
+#else //BT_USE_DOUBLE_PRECISION
+ const char* structType = "btDynamicsWorldFloatData";
+#endif //BT_USE_DOUBLE_PRECISION
+ serializer->finalizeChunk(chunk, structType, BT_DYNAMICSWORLD_CODE, worldInfo);
}
-void btDiscreteDynamicsWorld::serialize(btSerializer* serializer)
+void btDiscreteDynamicsWorld::serialize(btSerializer* serializer)
{
-
serializer->startSerialization();
serializeDynamicsWorldInfo(serializer);
@@ -1543,4 +1461,3 @@ void btDiscreteDynamicsWorld::serialize(btSerializer* serializer)
serializer->finishSerialization();
}
-
diff --git a/thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h b/thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h
index b0d19f48a3..7fe9619213 100644
--- a/thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h
+++ b/thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h
@@ -13,7 +13,6 @@ subject to the following restrictions:
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
@@ -32,159 +31,153 @@ 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
+ATTRIBUTE_ALIGNED16(class)
+btDiscreteDynamicsWorld : public btDynamicsWorld
{
protected:
-
- btAlignedObjectArray<btTypedConstraint*> m_sortedConstraints;
- InplaceSolverIslandCallback* m_solverIslandCallback;
+ btAlignedObjectArray<btTypedConstraint*> m_sortedConstraints;
+ InplaceSolverIslandCallback* m_solverIslandCallback;
- btConstraintSolver* m_constraintSolver;
+ btConstraintSolver* m_constraintSolver;
- btSimulationIslandManager* m_islandManager;
+ btSimulationIslandManager* m_islandManager;
btAlignedObjectArray<btTypedConstraint*> m_constraints;
btAlignedObjectArray<btRigidBody*> m_nonStaticRigidBodies;
- btVector3 m_gravity;
+ btVector3 m_gravity;
//for variable timesteps
- btScalar m_localTime;
- btScalar m_fixedTimeStep;
+ btScalar m_localTime;
+ btScalar m_fixedTimeStep;
//for variable timesteps
- bool m_ownsIslandManager;
- bool m_ownsConstraintSolver;
- bool m_synchronizeAllMotionStates;
- bool m_applySpeculativeContactRestitution;
+ bool m_ownsIslandManager;
+ bool m_ownsConstraintSolver;
+ bool m_synchronizeAllMotionStates;
+ bool m_applySpeculativeContactRestitution;
- btAlignedObjectArray<btActionInterface*> m_actions;
-
- int m_profileTimings;
+ btAlignedObjectArray<btActionInterface*> m_actions;
- bool m_latencyMotionStateInterpolation;
+ int m_profileTimings;
- btAlignedObjectArray<btPersistentManifold*> m_predictiveManifolds;
- btSpinMutex m_predictiveManifoldsMutex; // used to synchronize threads creating predictive contacts
+ bool m_latencyMotionStateInterpolation;
- 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();
+ btAlignedObjectArray<btPersistentManifold*> m_predictiveManifolds;
+ btSpinMutex m_predictiveManifoldsMutex; // used to synchronize threads creating predictive contacts
- virtual void solveConstraints(btContactSolverInfo& solverInfo);
-
- virtual void updateActivationState(btScalar timeStep);
+ virtual void predictUnconstraintMotion(btScalar timeStep);
- void updateActions(btScalar timeStep);
+ void integrateTransformsInternal(btRigidBody * *bodies, int numBodies, btScalar timeStep); // can be called in parallel
+ virtual void integrateTransforms(btScalar timeStep);
- void startProfiling(btScalar timeStep);
+ virtual void calculateSimulationIslands();
- virtual void internalSingleStepSimulation( btScalar timeStep);
+ virtual void solveConstraints(btContactSolverInfo & solverInfo);
- void releasePredictiveContacts();
- void createPredictiveContactsInternal( btRigidBody** bodies, int numBodies, btScalar timeStep ); // can be called in parallel
- virtual void createPredictiveContacts(btScalar timeStep);
+ virtual void updateActivationState(btScalar timeStep);
- virtual void saveKinematicState(btScalar timeStep);
+ void updateActions(btScalar timeStep);
- void serializeRigidBodies(btSerializer* serializer);
+ void startProfiling(btScalar timeStep);
- void serializeDynamicsWorldInfo(btSerializer* serializer);
+ virtual void internalSingleStepSimulation(btScalar timeStep);
-public:
+ 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);
+ 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 int stepSimulation(btScalar timeStep, int maxSubSteps = 1, btScalar fixedTimeStep = btScalar(1.) / btScalar(60.));
-
- virtual void synchronizeMotionStates();
+ virtual void synchronizeMotionStates();
///this can be useful to synchronize a single rigid body -> graphics object
- void synchronizeSingleMotionState(btRigidBody* body);
+ void synchronizeSingleMotionState(btRigidBody * body);
+
+ virtual void addConstraint(btTypedConstraint * constraint, bool disableCollisionsBetweenLinkedBodies = false);
- virtual void addConstraint(btTypedConstraint* constraint, bool disableCollisionsBetweenLinkedBodies=false);
+ virtual void removeConstraint(btTypedConstraint * constraint);
- virtual void removeConstraint(btTypedConstraint* constraint);
+ virtual void addAction(btActionInterface*);
- virtual void addAction(btActionInterface*);
+ virtual void removeAction(btActionInterface*);
- virtual void removeAction(btActionInterface*);
-
- btSimulationIslandManager* getSimulationIslandManager()
+ btSimulationIslandManager* getSimulationIslandManager()
{
return m_islandManager;
}
- const btSimulationIslandManager* getSimulationIslandManager() const
+ const btSimulationIslandManager* getSimulationIslandManager() const
{
return m_islandManager;
}
- btCollisionWorld* getCollisionWorld()
+ btCollisionWorld* getCollisionWorld()
{
return this;
}
- virtual void setGravity(const btVector3& gravity);
+ virtual void setGravity(const btVector3& gravity);
- virtual btVector3 getGravity () const;
+ virtual btVector3 getGravity() const;
- virtual void addCollisionObject(btCollisionObject* collisionObject, int collisionFilterGroup=btBroadphaseProxy::StaticFilter, int collisionFilterMask=btBroadphaseProxy::AllFilter ^ btBroadphaseProxy::StaticFilter);
+ 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);
- virtual void addRigidBody(btRigidBody* body, int group, int mask);
+ virtual void addRigidBody(btRigidBody * body, int group, int mask);
- virtual void removeRigidBody(btRigidBody* body);
+ 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 removeCollisionObject(btCollisionObject * collisionObject);
- virtual void debugDrawConstraint(btTypedConstraint* constraint);
+ virtual void debugDrawConstraint(btTypedConstraint * constraint);
- virtual void debugDrawWorld();
+ virtual void debugDrawWorld();
- virtual void setConstraintSolver(btConstraintSolver* solver);
+ virtual void setConstraintSolver(btConstraintSolver * solver);
virtual btConstraintSolver* getConstraintSolver();
-
- virtual int getNumConstraints() const;
- virtual btTypedConstraint* getConstraint(int index) ;
+ virtual int getNumConstraints() const;
+
+ virtual btTypedConstraint* getConstraint(int index);
virtual const btTypedConstraint* getConstraint(int index) const;
-
- virtual btDynamicsWorldType getWorldType() 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();
+ virtual void clearForces();
///apply gravity, call this once per timestep
- virtual void applyGravity();
+ virtual void applyGravity();
- virtual void setNumTasks(int numTasks)
+ virtual void setNumTasks(int numTasks)
{
- (void) numTasks;
+ (void)numTasks;
}
///obsolete, use updateActions instead
@@ -194,15 +187,15 @@ public:
}
///obsolete, use addAction instead
- virtual void addVehicle(btActionInterface* vehicle);
+ virtual void addVehicle(btActionInterface * vehicle);
///obsolete, use removeAction instead
- virtual void removeVehicle(btActionInterface* vehicle);
+ virtual void removeVehicle(btActionInterface * vehicle);
///obsolete, use addAction instead
- virtual void addCharacter(btActionInterface* character);
+ virtual void addCharacter(btActionInterface * character);
///obsolete, use removeAction instead
- virtual void removeCharacter(btActionInterface* character);
+ virtual void removeCharacter(btActionInterface * character);
- void setSynchronizeAllMotionStates(bool synchronizeAll)
+ void setSynchronizeAllMotionStates(bool synchronizeAll)
{
m_synchronizeAllMotionStates = synchronizeAll;
}
@@ -215,18 +208,18 @@ public:
{
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);
+ 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 )
+ void setLatencyMotionStateInterpolation(bool latencyInterpolation)
{
m_latencyMotionStateInterpolation = latencyInterpolation;
}
@@ -236,4 +229,4 @@ public:
}
};
-#endif //BT_DISCRETE_DYNAMICS_WORLD_H
+#endif //BT_DISCRETE_DYNAMICS_WORLD_H
diff --git a/thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorldMt.cpp b/thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorldMt.cpp
index d705bf2381..8207b47135 100644
--- a/thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorldMt.cpp
+++ b/thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorldMt.cpp
@@ -13,7 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btDiscreteDynamicsWorldMt.h"
//collision detection
@@ -38,148 +37,139 @@ subject to the following restrictions:
#include "BulletDynamics/ConstraintSolver/btSliderConstraint.h"
#include "BulletDynamics/ConstraintSolver/btContactConstraint.h"
-
#include "LinearMath/btIDebugDraw.h"
#include "BulletCollision/CollisionShapes/btSphereShape.h"
-
#include "BulletDynamics/Dynamics/btActionInterface.h"
#include "LinearMath/btQuickprof.h"
#include "LinearMath/btMotionState.h"
#include "LinearMath/btSerializer.h"
-
-
///
/// btConstraintSolverPoolMt
///
btConstraintSolverPoolMt::ThreadSolver* btConstraintSolverPoolMt::getAndLockThreadSolver()
{
- int i = 0;
+ int i = 0;
#if BT_THREADSAFE
- i = btGetCurrentThreadIndex() % m_solvers.size();
-#endif // #if BT_THREADSAFE
- while ( true )
- {
- ThreadSolver& solver = m_solvers[ i ];
- if ( solver.mutex.tryLock() )
- {
- return &solver;
- }
- // failed, try the next one
- i = ( i + 1 ) % m_solvers.size();
- }
- return NULL;
+ i = btGetCurrentThreadIndex() % m_solvers.size();
+#endif // #if BT_THREADSAFE
+ while (true)
+ {
+ ThreadSolver& solver = m_solvers[i];
+ if (solver.mutex.tryLock())
+ {
+ return &solver;
+ }
+ // failed, try the next one
+ i = (i + 1) % m_solvers.size();
+ }
+ return NULL;
}
-void btConstraintSolverPoolMt::init( btConstraintSolver** solvers, int numSolvers )
+void btConstraintSolverPoolMt::init(btConstraintSolver** solvers, int numSolvers)
{
- m_solverType = BT_SEQUENTIAL_IMPULSE_SOLVER;
- m_solvers.resize( numSolvers );
- for ( int i = 0; i < numSolvers; ++i )
- {
- m_solvers[ i ].solver = solvers[ i ];
- }
- if ( numSolvers > 0 )
- {
- m_solverType = solvers[ 0 ]->getSolverType();
- }
+ m_solverType = BT_SEQUENTIAL_IMPULSE_SOLVER;
+ m_solvers.resize(numSolvers);
+ for (int i = 0; i < numSolvers; ++i)
+ {
+ m_solvers[i].solver = solvers[i];
+ }
+ if (numSolvers > 0)
+ {
+ m_solverType = solvers[0]->getSolverType();
+ }
}
// create the solvers for me
-btConstraintSolverPoolMt::btConstraintSolverPoolMt( int numSolvers )
+btConstraintSolverPoolMt::btConstraintSolverPoolMt(int numSolvers)
{
- btAlignedObjectArray<btConstraintSolver*> solvers;
- solvers.reserve( numSolvers );
- for ( int i = 0; i < numSolvers; ++i )
- {
- btConstraintSolver* solver = new btSequentialImpulseConstraintSolver();
- solvers.push_back( solver );
- }
- init( &solvers[ 0 ], numSolvers );
+ btAlignedObjectArray<btConstraintSolver*> solvers;
+ solvers.reserve(numSolvers);
+ for (int i = 0; i < numSolvers; ++i)
+ {
+ btConstraintSolver* solver = new btSequentialImpulseConstraintSolver();
+ solvers.push_back(solver);
+ }
+ init(&solvers[0], numSolvers);
}
// pass in fully constructed solvers (destructor will delete them)
-btConstraintSolverPoolMt::btConstraintSolverPoolMt( btConstraintSolver** solvers, int numSolvers )
+btConstraintSolverPoolMt::btConstraintSolverPoolMt(btConstraintSolver** solvers, int numSolvers)
{
- init( solvers, numSolvers );
+ init(solvers, numSolvers);
}
btConstraintSolverPoolMt::~btConstraintSolverPoolMt()
{
- // delete all solvers
- for ( int i = 0; i < m_solvers.size(); ++i )
- {
- ThreadSolver& solver = m_solvers[ i ];
- delete solver.solver;
- solver.solver = NULL;
- }
+ // delete all solvers
+ for (int i = 0; i < m_solvers.size(); ++i)
+ {
+ ThreadSolver& solver = m_solvers[i];
+ delete solver.solver;
+ solver.solver = NULL;
+ }
}
///solve a group of constraints
-btScalar btConstraintSolverPoolMt::solveGroup( btCollisionObject** bodies,
- int numBodies,
- btPersistentManifold** manifolds,
- int numManifolds,
- btTypedConstraint** constraints,
- int numConstraints,
- const btContactSolverInfo& info,
- btIDebugDraw* debugDrawer,
- btDispatcher* dispatcher
-)
+btScalar btConstraintSolverPoolMt::solveGroup(btCollisionObject** bodies,
+ int numBodies,
+ btPersistentManifold** manifolds,
+ int numManifolds,
+ btTypedConstraint** constraints,
+ int numConstraints,
+ const btContactSolverInfo& info,
+ btIDebugDraw* debugDrawer,
+ btDispatcher* dispatcher)
{
- ThreadSolver* ts = getAndLockThreadSolver();
- ts->solver->solveGroup( bodies, numBodies, manifolds, numManifolds, constraints, numConstraints, info, debugDrawer, dispatcher );
- ts->mutex.unlock();
- return 0.0f;
+ ThreadSolver* ts = getAndLockThreadSolver();
+ ts->solver->solveGroup(bodies, numBodies, manifolds, numManifolds, constraints, numConstraints, info, debugDrawer, dispatcher);
+ ts->mutex.unlock();
+ return 0.0f;
}
void btConstraintSolverPoolMt::reset()
{
- for ( int i = 0; i < m_solvers.size(); ++i )
- {
- ThreadSolver& solver = m_solvers[ i ];
- solver.mutex.lock();
- solver.solver->reset();
- solver.mutex.unlock();
- }
+ for (int i = 0; i < m_solvers.size(); ++i)
+ {
+ ThreadSolver& solver = m_solvers[i];
+ solver.mutex.lock();
+ solver.solver->reset();
+ solver.mutex.unlock();
+ }
}
-
///
/// btDiscreteDynamicsWorldMt
///
btDiscreteDynamicsWorldMt::btDiscreteDynamicsWorldMt(btDispatcher* dispatcher,
- btBroadphaseInterface* pairCache,
- btConstraintSolverPoolMt* constraintSolver,
- btConstraintSolver* constraintSolverMt,
- btCollisionConfiguration* collisionConfiguration
-)
-: btDiscreteDynamicsWorld(dispatcher,pairCache,constraintSolver,collisionConfiguration)
+ btBroadphaseInterface* pairCache,
+ btConstraintSolverPoolMt* solverPool,
+ btConstraintSolver* constraintSolverMt,
+ btCollisionConfiguration* collisionConfiguration)
+ : btDiscreteDynamicsWorld(dispatcher, pairCache, solverPool, collisionConfiguration)
{
if (m_ownsIslandManager)
{
m_islandManager->~btSimulationIslandManager();
- btAlignedFree( m_islandManager);
+ btAlignedFree(m_islandManager);
}
{
- void* mem = btAlignedAlloc(sizeof(btSimulationIslandManagerMt),16);
+ void* mem = btAlignedAlloc(sizeof(btSimulationIslandManagerMt), 16);
btSimulationIslandManagerMt* im = new (mem) btSimulationIslandManagerMt();
- im->setMinimumSolverBatchSize( m_solverInfo.m_minimumSolverBatchSize );
- m_islandManager = im;
+ im->setMinimumSolverBatchSize(m_solverInfo.m_minimumSolverBatchSize);
+ m_islandManager = im;
}
- m_constraintSolverMt = constraintSolverMt;
+ m_constraintSolverMt = constraintSolverMt;
}
-
btDiscreteDynamicsWorldMt::~btDiscreteDynamicsWorldMt()
{
}
-
void btDiscreteDynamicsWorldMt::solveConstraints(btContactSolverInfo& solverInfo)
{
BT_PROFILE("solveConstraints");
@@ -187,92 +177,87 @@ void btDiscreteDynamicsWorldMt::solveConstraints(btContactSolverInfo& solverInfo
m_constraintSolver->prepareSolve(getCollisionWorld()->getNumCollisionObjects(), getCollisionWorld()->getDispatcher()->getNumManifolds());
/// solve all the constraints for this island
- btSimulationIslandManagerMt* im = static_cast<btSimulationIslandManagerMt*>(m_islandManager);
- btSimulationIslandManagerMt::SolverParams solverParams;
- solverParams.m_solverPool = m_constraintSolver;
- solverParams.m_solverMt = m_constraintSolverMt;
- solverParams.m_solverInfo = &solverInfo;
- solverParams.m_debugDrawer = m_debugDrawer;
- solverParams.m_dispatcher = getCollisionWorld()->getDispatcher();
- im->buildAndProcessIslands( getCollisionWorld()->getDispatcher(), getCollisionWorld(), m_constraints, solverParams );
+ btSimulationIslandManagerMt* im = static_cast<btSimulationIslandManagerMt*>(m_islandManager);
+ btSimulationIslandManagerMt::SolverParams solverParams;
+ solverParams.m_solverPool = m_constraintSolver;
+ solverParams.m_solverMt = m_constraintSolverMt;
+ solverParams.m_solverInfo = &solverInfo;
+ solverParams.m_debugDrawer = m_debugDrawer;
+ solverParams.m_dispatcher = getCollisionWorld()->getDispatcher();
+ im->buildAndProcessIslands(getCollisionWorld()->getDispatcher(), getCollisionWorld(), m_constraints, solverParams);
m_constraintSolver->allSolved(solverInfo, m_debugDrawer);
}
-
struct UpdaterUnconstrainedMotion : public btIParallelForBody
{
- btScalar timeStep;
- btRigidBody** rigidBodies;
+ btScalar timeStep;
+ btRigidBody** rigidBodies;
- void forLoop( int iBegin, int iEnd ) const BT_OVERRIDE
- {
- for ( int i = iBegin; i < iEnd; ++i )
- {
- btRigidBody* body = rigidBodies[ i ];
- if ( !body->isStaticOrKinematicObject() )
- {
- //don't integrate/update velocities here, it happens in the constraint solver
- body->applyDamping( timeStep );
- body->predictIntegratedTransform( timeStep, body->getInterpolationWorldTransform() );
- }
- }
- }
+ void forLoop(int iBegin, int iEnd) const BT_OVERRIDE
+ {
+ for (int i = iBegin; i < iEnd; ++i)
+ {
+ btRigidBody* body = rigidBodies[i];
+ if (!body->isStaticOrKinematicObject())
+ {
+ //don't integrate/update velocities here, it happens in the constraint solver
+ body->applyDamping(timeStep);
+ body->predictIntegratedTransform(timeStep, body->getInterpolationWorldTransform());
+ }
+ }
+ }
};
-
-void btDiscreteDynamicsWorldMt::predictUnconstraintMotion( btScalar timeStep )
+void btDiscreteDynamicsWorldMt::predictUnconstraintMotion(btScalar timeStep)
{
- BT_PROFILE( "predictUnconstraintMotion" );
- if ( m_nonStaticRigidBodies.size() > 0 )
- {
- UpdaterUnconstrainedMotion update;
- update.timeStep = timeStep;
- update.rigidBodies = &m_nonStaticRigidBodies[ 0 ];
- int grainSize = 50; // num of iterations per task for task scheduler
- btParallelFor( 0, m_nonStaticRigidBodies.size(), grainSize, update );
- }
+ BT_PROFILE("predictUnconstraintMotion");
+ if (m_nonStaticRigidBodies.size() > 0)
+ {
+ UpdaterUnconstrainedMotion update;
+ update.timeStep = timeStep;
+ update.rigidBodies = &m_nonStaticRigidBodies[0];
+ int grainSize = 50; // num of iterations per task for task scheduler
+ btParallelFor(0, m_nonStaticRigidBodies.size(), grainSize, update);
+ }
}
-
-void btDiscreteDynamicsWorldMt::createPredictiveContacts( btScalar timeStep )
+void btDiscreteDynamicsWorldMt::createPredictiveContacts(btScalar timeStep)
{
- BT_PROFILE( "createPredictiveContacts" );
- releasePredictiveContacts();
- if ( m_nonStaticRigidBodies.size() > 0 )
- {
- UpdaterCreatePredictiveContacts update;
- update.world = this;
- update.timeStep = timeStep;
- update.rigidBodies = &m_nonStaticRigidBodies[ 0 ];
- int grainSize = 50; // num of iterations per task for task scheduler
- btParallelFor( 0, m_nonStaticRigidBodies.size(), grainSize, update );
- }
+ BT_PROFILE("createPredictiveContacts");
+ releasePredictiveContacts();
+ if (m_nonStaticRigidBodies.size() > 0)
+ {
+ UpdaterCreatePredictiveContacts update;
+ update.world = this;
+ update.timeStep = timeStep;
+ update.rigidBodies = &m_nonStaticRigidBodies[0];
+ int grainSize = 50; // num of iterations per task for task scheduler
+ btParallelFor(0, m_nonStaticRigidBodies.size(), grainSize, update);
+ }
}
-
-void btDiscreteDynamicsWorldMt::integrateTransforms( btScalar timeStep )
+void btDiscreteDynamicsWorldMt::integrateTransforms(btScalar timeStep)
{
- BT_PROFILE( "integrateTransforms" );
- if ( m_nonStaticRigidBodies.size() > 0 )
- {
- UpdaterIntegrateTransforms update;
- update.world = this;
- update.timeStep = timeStep;
- update.rigidBodies = &m_nonStaticRigidBodies[ 0 ];
- int grainSize = 50; // num of iterations per task for task scheduler
- btParallelFor( 0, m_nonStaticRigidBodies.size(), grainSize, update );
- }
+ BT_PROFILE("integrateTransforms");
+ if (m_nonStaticRigidBodies.size() > 0)
+ {
+ UpdaterIntegrateTransforms update;
+ update.world = this;
+ update.timeStep = timeStep;
+ update.rigidBodies = &m_nonStaticRigidBodies[0];
+ int grainSize = 50; // num of iterations per task for task scheduler
+ btParallelFor(0, m_nonStaticRigidBodies.size(), grainSize, update);
+ }
}
-
-int btDiscreteDynamicsWorldMt::stepSimulation( btScalar timeStep, int maxSubSteps, btScalar fixedTimeStep )
+int btDiscreteDynamicsWorldMt::stepSimulation(btScalar timeStep, int maxSubSteps, btScalar fixedTimeStep)
{
- int numSubSteps = btDiscreteDynamicsWorld::stepSimulation(timeStep, maxSubSteps, fixedTimeStep);
- if (btITaskScheduler* scheduler = btGetTaskScheduler())
- {
- // tell Bullet's threads to sleep, so other threads can run
- scheduler->sleepWorkerThreadsHint();
- }
- return numSubSteps;
+ int numSubSteps = btDiscreteDynamicsWorld::stepSimulation(timeStep, maxSubSteps, fixedTimeStep);
+ if (btITaskScheduler* scheduler = btGetTaskScheduler())
+ {
+ // tell Bullet's threads to sleep, so other threads can run
+ scheduler->sleepWorkerThreadsHint();
+ }
+ return numSubSteps;
}
diff --git a/thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorldMt.h b/thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorldMt.h
index 667fe5800e..dccf35d7a7 100644
--- a/thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorldMt.h
+++ b/thirdparty/bullet/BulletDynamics/Dynamics/btDiscreteDynamicsWorldMt.h
@@ -13,7 +13,6 @@ subject to the following restrictions:
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
@@ -21,7 +20,6 @@ subject to the following restrictions:
#include "btSimulationIslandManagerMt.h"
#include "BulletDynamics/ConstraintSolver/btConstraintSolver.h"
-
///
/// btConstraintSolverPoolMt - masquerades as a constraint solver, but really it is a threadsafe pool of them.
///
@@ -34,46 +32,43 @@ subject to the following restrictions:
class btConstraintSolverPoolMt : public btConstraintSolver
{
public:
- // create the solvers for me
- explicit btConstraintSolverPoolMt( int numSolvers );
+ // create the solvers for me
+ explicit btConstraintSolverPoolMt(int numSolvers);
- // pass in fully constructed solvers (destructor will delete them)
- btConstraintSolverPoolMt( btConstraintSolver** solvers, int numSolvers );
+ // pass in fully constructed solvers (destructor will delete them)
+ btConstraintSolverPoolMt(btConstraintSolver** solvers, int numSolvers);
- virtual ~btConstraintSolverPoolMt();
+ 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;
+ ///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; }
+ 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<ThreadSolver> m_solvers;
- btConstraintSolverType m_solverType;
-
- ThreadSolver* getAndLockThreadSolver();
- void init( btConstraintSolver** solvers, int numSolvers );
+ 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<ThreadSolver> 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.
@@ -84,53 +79,53 @@ private:
/// - integrateTransforms
/// - createPredictiveContacts
///
-ATTRIBUTE_ALIGNED16(class) btDiscreteDynamicsWorldMt : public btDiscreteDynamicsWorld
+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;
+ 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* constraintSolver, // Note this should be a solver-pool for multi-threading
- btConstraintSolver* constraintSolverMt, // single multi-threaded solver for large islands (or NULL)
- btCollisionConfiguration* collisionConfiguration
- );
+ 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;
+ virtual int stepSimulation(btScalar timeStep, int maxSubSteps, btScalar fixedTimeStep) BT_OVERRIDE;
};
-#endif //BT_DISCRETE_DYNAMICS_WORLD_H
+#endif //BT_DISCRETE_DYNAMICS_WORLD_H
diff --git a/thirdparty/bullet/BulletDynamics/Dynamics/btDynamicsWorld.h b/thirdparty/bullet/BulletDynamics/Dynamics/btDynamicsWorld.h
index 42d8fc0de3..eadd8c12e7 100644
--- a/thirdparty/bullet/BulletDynamics/Dynamics/btDynamicsWorld.h
+++ b/thirdparty/bullet/BulletDynamics/Dynamics/btDynamicsWorld.h
@@ -24,150 +24,150 @@ class btActionInterface;
class btConstraintSolver;
class btDynamicsWorld;
-
/// Type for the callback for each tick
-typedef void (*btInternalTickCallback)(btDynamicsWorld *world, btScalar timeStep);
+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_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
};
///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;
+ btInternalTickCallback m_internalTickCallback;
+ btInternalTickCallback m_internalPreTickCallback;
+ void* m_worldUserInfo;
- btContactSolverInfo m_solverInfo;
+ btContactSolverInfo m_solverInfo;
public:
-
+ btDynamicsWorld(btDispatcher* dispatcher, btBroadphaseInterface* broadphase, btCollisionConfiguration* collisionConfiguration)
+ : btCollisionWorld(dispatcher, broadphase, collisionConfiguration), m_internalTickCallback(0), m_internalPreTickCallback(0), m_worldUserInfo(0)
+ {
+ }
- btDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* broadphase,btCollisionConfiguration* collisionConfiguration)
- :btCollisionWorld(dispatcher,broadphase,collisionConfiguration), m_internalTickCallback(0),m_internalPreTickCallback(0), m_worldUserInfo(0)
- {
- }
+ virtual ~btDynamicsWorld()
+ {
+ }
- 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;
- }
+ ///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 removeConstraint(btTypedConstraint* constraint) {(void)constraint;}
+ virtual void debugDrawWorld() = 0;
- virtual void addAction(btActionInterface* action) = 0;
+ virtual void addConstraint(btTypedConstraint* constraint, bool disableCollisionsBetweenLinkedBodies = false)
+ {
+ (void)constraint;
+ (void)disableCollisionsBetweenLinkedBodies;
+ }
- virtual void removeAction(btActionInterface* action) = 0;
+ virtual void removeConstraint(btTypedConstraint* constraint) { (void)constraint; }
- //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 addAction(btActionInterface* action) = 0;
- virtual void synchronizeMotionStates() = 0;
+ virtual void removeAction(btActionInterface* action) = 0;
- virtual void addRigidBody(btRigidBody* body) = 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 addRigidBody(btRigidBody* body, int group, int mask) = 0;
+ virtual void synchronizeMotionStates() = 0;
- virtual void removeRigidBody(btRigidBody* body) = 0;
+ virtual void addRigidBody(btRigidBody* body) = 0;
- virtual void setConstraintSolver(btConstraintSolver* solver) = 0;
+ virtual void addRigidBody(btRigidBody* body, int group, int mask) = 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 void removeRigidBody(btRigidBody* body) = 0;
- virtual btDynamicsWorldType getWorldType() const=0;
+ virtual void setConstraintSolver(btConstraintSolver* solver) = 0;
- virtual void clearForces() = 0;
+ virtual btConstraintSolver* getConstraintSolver() = 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;
- }
+ virtual int getNumConstraints() const { return 0; }
- void setWorldUserInfo(void* worldUserInfo)
- {
- m_worldUserInfo = worldUserInfo;
- }
+ virtual btTypedConstraint* getConstraint(int index)
+ {
+ (void)index;
+ return 0;
+ }
- void* getWorldUserInfo() const
- {
- return m_worldUserInfo;
- }
+ virtual const btTypedConstraint* getConstraint(int index) const
+ {
+ (void)index;
+ return 0;
+ }
+
+ virtual btDynamicsWorldType getWorldType() const = 0;
+
+ virtual void clearForces() = 0;
- btContactSolverInfo& getSolverInfo()
+ /// 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)
{
- return m_solverInfo;
+ m_internalPreTickCallback = cb;
}
-
- const btContactSolverInfo& getSolverInfo() const
+ else
{
- return m_solverInfo;
+ m_internalTickCallback = cb;
}
-
-
- ///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;}
-
-
+ 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;
+ 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;
+ btContactSolverInfoFloatData m_solverInfo;
+ btVector3FloatData m_gravity;
};
-
-#endif //BT_DYNAMICS_WORLD_H
-
-
+#endif //BT_DYNAMICS_WORLD_H
diff --git a/thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.cpp b/thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.cpp
index ca0714fcfa..f4bcabada2 100644
--- a/thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.cpp
+++ b/thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.cpp
@@ -22,36 +22,34 @@ subject to the following restrictions:
#include "LinearMath/btSerializer.h"
//'temporarily' global variables
-btScalar gDeactivationTime = btScalar(2.);
-bool gDisableDeactivation = false;
+btScalar gDeactivationTime = btScalar(2.);
+bool gDisableDeactivation = false;
static int uniqueId = 0;
-
btRigidBody::btRigidBody(const btRigidBody::btRigidBodyConstructionInfo& constructionInfo)
{
setupRigidBody(constructionInfo);
}
-btRigidBody::btRigidBody(btScalar mass, btMotionState *motionState, btCollisionShape *collisionShape, const btVector3 &localInertia)
+btRigidBody::btRigidBody(btScalar mass, btMotionState* motionState, btCollisionShape* collisionShape, const btVector3& localInertia)
{
- btRigidBodyConstructionInfo cinfo(mass,motionState,collisionShape,localInertia);
+ btRigidBodyConstructionInfo cinfo(mass, motionState, collisionShape, localInertia);
setupRigidBody(cinfo);
}
-void btRigidBody::setupRigidBody(const btRigidBody::btRigidBodyConstructionInfo& constructionInfo)
+void btRigidBody::setupRigidBody(const btRigidBody::btRigidBodyConstructionInfo& constructionInfo)
{
-
- m_internalType=CO_RIGID_BODY;
+ m_internalType = CO_RIGID_BODY;
m_linearVelocity.setValue(btScalar(0.0), btScalar(0.0), btScalar(0.0));
- m_angularVelocity.setValue(btScalar(0.),btScalar(0.),btScalar(0.));
- m_angularFactor.setValue(1,1,1);
- m_linearFactor.setValue(1,1,1);
+ m_angularVelocity.setValue(btScalar(0.), btScalar(0.), btScalar(0.));
+ m_angularFactor.setValue(1, 1, 1);
+ m_linearFactor.setValue(1, 1, 1);
m_gravity.setValue(btScalar(0.0), btScalar(0.0), btScalar(0.0));
m_gravity_acceleration.setValue(btScalar(0.0), btScalar(0.0), btScalar(0.0));
m_totalForce.setValue(btScalar(0.0), btScalar(0.0), btScalar(0.0));
m_totalTorque.setValue(btScalar(0.0), btScalar(0.0), btScalar(0.0)),
- setDamping(constructionInfo.m_linearDamping, constructionInfo.m_angularDamping);
+ setDamping(constructionInfo.m_linearDamping, constructionInfo.m_angularDamping);
m_linearSleepingThreshold = constructionInfo.m_linearSleepingThreshold;
m_angularSleepingThreshold = constructionInfo.m_angularSleepingThreshold;
@@ -67,48 +65,44 @@ void btRigidBody::setupRigidBody(const btRigidBody::btRigidBodyConstructionInfo&
if (m_optionalMotionState)
{
m_optionalMotionState->getWorldTransform(m_worldTransform);
- } else
+ }
+ else
{
m_worldTransform = constructionInfo.m_startWorldTransform;
}
m_interpolationWorldTransform = m_worldTransform;
- m_interpolationLinearVelocity.setValue(0,0,0);
- m_interpolationAngularVelocity.setValue(0,0,0);
-
+ m_interpolationLinearVelocity.setValue(0, 0, 0);
+ m_interpolationAngularVelocity.setValue(0, 0, 0);
+
//moved to btCollisionObject
m_friction = constructionInfo.m_friction;
m_rollingFriction = constructionInfo.m_rollingFriction;
- m_spinningFriction = constructionInfo.m_spinningFriction;
-
+ m_spinningFriction = constructionInfo.m_spinningFriction;
+
m_restitution = constructionInfo.m_restitution;
- setCollisionShape( constructionInfo.m_collisionShape );
+ setCollisionShape(constructionInfo.m_collisionShape);
m_debugBodyId = uniqueId++;
-
+
setMassProps(constructionInfo.m_mass, constructionInfo.m_localInertia);
updateInertiaTensor();
m_rigidbodyFlags = BT_ENABLE_GYROSCOPIC_FORCE_IMPLICIT_BODY;
-
m_deltaLinearVelocity.setZero();
m_deltaAngularVelocity.setZero();
- m_invMass = m_inverseMass*m_linearFactor;
+ m_invMass = m_inverseMass * m_linearFactor;
m_pushVelocity.setZero();
m_turnVelocity.setZero();
-
-
-
}
-
-void btRigidBody::predictIntegratedTransform(btScalar timeStep,btTransform& predictedTransform)
+void btRigidBody::predictIntegratedTransform(btScalar timeStep, btTransform& predictedTransform)
{
- btTransformUtil::integrateTransform(m_worldTransform,m_linearVelocity,m_angularVelocity,timeStep,predictedTransform);
+ btTransformUtil::integrateTransform(m_worldTransform, m_linearVelocity, m_angularVelocity, timeStep, predictedTransform);
}
-void btRigidBody::saveKinematicState(btScalar timeStep)
+void btRigidBody::saveKinematicState(btScalar timeStep)
{
//todo: clamp to some (user definable) safe minimum timestep, to limit maximum angular/linear velocities
if (timeStep != btScalar(0.))
@@ -116,25 +110,22 @@ void btRigidBody::saveKinematicState(btScalar timeStep)
//if we use motionstate to synchronize world transforms, get the new kinematic/animated world transform
if (getMotionState())
getMotionState()->getWorldTransform(m_worldTransform);
- btVector3 linVel,angVel;
-
- btTransformUtil::calculateVelocity(m_interpolationWorldTransform,m_worldTransform,timeStep,m_linearVelocity,m_angularVelocity);
+ btVector3 linVel, angVel;
+
+ btTransformUtil::calculateVelocity(m_interpolationWorldTransform, m_worldTransform, timeStep, m_linearVelocity, m_angularVelocity);
m_interpolationLinearVelocity = m_linearVelocity;
m_interpolationAngularVelocity = m_angularVelocity;
m_interpolationWorldTransform = m_worldTransform;
//printf("angular = %f %f %f\n",m_angularVelocity.getX(),m_angularVelocity.getY(),m_angularVelocity.getZ());
}
}
-
-void btRigidBody::getAabb(btVector3& aabbMin,btVector3& aabbMax) const
+
+void btRigidBody::getAabb(btVector3& aabbMin, btVector3& aabbMax) const
{
- getCollisionShape()->getAabb(m_worldTransform,aabbMin,aabbMax);
+ getCollisionShape()->getAabb(m_worldTransform, aabbMin, aabbMax);
}
-
-
-
-void btRigidBody::setGravity(const btVector3& acceleration)
+void btRigidBody::setGravity(const btVector3& acceleration)
{
if (m_inverseMass != btScalar(0.0))
{
@@ -143,22 +134,14 @@ void btRigidBody::setGravity(const btVector3& acceleration)
m_gravity_acceleration = acceleration;
}
-
-
-
-
-
void btRigidBody::setDamping(btScalar lin_damping, btScalar ang_damping)
{
m_linearDamping = btClamped(lin_damping, (btScalar)btScalar(0.0), (btScalar)btScalar(1.0));
m_angularDamping = btClamped(ang_damping, (btScalar)btScalar(0.0), (btScalar)btScalar(1.0));
}
-
-
-
///applyDamping damps the velocity, using the given m_linearDamping and m_angularDamping
-void btRigidBody::applyDamping(btScalar timeStep)
+void btRigidBody::applyDamping(btScalar timeStep)
{
//On new damping: see discussion/issue report here: http://code.google.com/p/bullet/issues/detail?id=74
//todo: do some performance comparisons (but other parts of the engine are probably bottleneck anyway
@@ -168,8 +151,8 @@ void btRigidBody::applyDamping(btScalar timeStep)
m_linearVelocity *= GEN_clamped((btScalar(1.) - timeStep * m_linearDamping), (btScalar)btScalar(0.0), (btScalar)btScalar(1.0));
m_angularVelocity *= GEN_clamped((btScalar(1.) - timeStep * m_angularDamping), (btScalar)btScalar(0.0), (btScalar)btScalar(1.0));
#else
- m_linearVelocity *= btPow(btScalar(1)-m_linearDamping, timeStep);
- m_angularVelocity *= btPow(btScalar(1)-m_angularDamping, timeStep);
+ m_linearVelocity *= btPow(btScalar(1) - m_linearDamping, timeStep);
+ m_angularVelocity *= btPow(btScalar(1) - m_angularDamping, timeStep);
#endif
if (m_additionalDamping)
@@ -182,7 +165,6 @@ void btRigidBody::applyDamping(btScalar timeStep)
m_angularVelocity *= m_additionalDampingFactor;
m_linearVelocity *= m_additionalDampingFactor;
}
-
btScalar speed = m_linearVelocity.length();
if (speed < m_linearDamping)
@@ -191,10 +173,11 @@ void btRigidBody::applyDamping(btScalar timeStep)
if (speed > dampVel)
{
btVector3 dir = m_linearVelocity.normalized();
- m_linearVelocity -= dir * dampVel;
- } else
+ m_linearVelocity -= dir * dampVel;
+ }
+ else
{
- m_linearVelocity.setValue(btScalar(0.),btScalar(0.),btScalar(0.));
+ m_linearVelocity.setValue(btScalar(0.), btScalar(0.), btScalar(0.));
}
}
@@ -205,30 +188,28 @@ void btRigidBody::applyDamping(btScalar timeStep)
if (angSpeed > angDampVel)
{
btVector3 dir = m_angularVelocity.normalized();
- m_angularVelocity -= dir * angDampVel;
- } else
+ m_angularVelocity -= dir * angDampVel;
+ }
+ else
{
- m_angularVelocity.setValue(btScalar(0.),btScalar(0.),btScalar(0.));
+ m_angularVelocity.setValue(btScalar(0.), btScalar(0.), btScalar(0.));
}
}
}
}
-
void btRigidBody::applyGravity()
{
if (isStaticOrKinematicObject())
return;
-
- applyCentralForce(m_gravity);
+ applyCentralForce(m_gravity);
}
void btRigidBody::proceedToTransform(const btTransform& newTrans)
{
- setCenterOfMassTransform( newTrans );
+ setCenterOfMassTransform(newTrans);
}
-
void btRigidBody::setMassProps(btScalar mass, const btVector3& inertia)
{
@@ -236,7 +217,8 @@ void btRigidBody::setMassProps(btScalar mass, const btVector3& inertia)
{
m_collisionFlags |= btCollisionObject::CF_STATIC_OBJECT;
m_inverseMass = btScalar(0.);
- } else
+ }
+ else
{
m_collisionFlags &= (~btCollisionObject::CF_STATIC_OBJECT);
m_inverseMass = btScalar(1.0) / mass;
@@ -244,50 +226,45 @@ void btRigidBody::setMassProps(btScalar mass, const btVector3& inertia)
//Fg = m * a
m_gravity = mass * m_gravity_acceleration;
-
- m_invInertiaLocal.setValue(inertia.x() != btScalar(0.0) ? btScalar(1.0) / inertia.x(): btScalar(0.0),
- inertia.y() != btScalar(0.0) ? btScalar(1.0) / inertia.y(): btScalar(0.0),
- inertia.z() != btScalar(0.0) ? btScalar(1.0) / inertia.z(): btScalar(0.0));
- m_invMass = m_linearFactor*m_inverseMass;
+ m_invInertiaLocal.setValue(inertia.x() != btScalar(0.0) ? btScalar(1.0) / inertia.x() : btScalar(0.0),
+ inertia.y() != btScalar(0.0) ? btScalar(1.0) / inertia.y() : btScalar(0.0),
+ inertia.z() != btScalar(0.0) ? btScalar(1.0) / inertia.z() : btScalar(0.0));
+
+ m_invMass = m_linearFactor * m_inverseMass;
}
-
-void btRigidBody::updateInertiaTensor()
+void btRigidBody::updateInertiaTensor()
{
m_invInertiaTensorWorld = m_worldTransform.getBasis().scaled(m_invInertiaLocal) * m_worldTransform.getBasis().transpose();
}
-
-
btVector3 btRigidBody::getLocalInertia() const
{
-
btVector3 inertiaLocal;
const btVector3 inertia = m_invInertiaLocal;
inertiaLocal.setValue(inertia.x() != btScalar(0.0) ? btScalar(1.0) / inertia.x() : btScalar(0.0),
- inertia.y() != btScalar(0.0) ? btScalar(1.0) / inertia.y() : btScalar(0.0),
- inertia.z() != btScalar(0.0) ? btScalar(1.0) / inertia.z() : btScalar(0.0));
+ inertia.y() != btScalar(0.0) ? btScalar(1.0) / inertia.y() : btScalar(0.0),
+ inertia.z() != btScalar(0.0) ? btScalar(1.0) / inertia.z() : btScalar(0.0));
return inertiaLocal;
}
inline btVector3 evalEulerEqn(const btVector3& w1, const btVector3& w0, const btVector3& T, const btScalar dt,
- const btMatrix3x3 &I)
+ const btMatrix3x3& I)
{
- const btVector3 w2 = I*w1 + w1.cross(I*w1)*dt - (T*dt + I*w0);
+ const btVector3 w2 = I * w1 + w1.cross(I * w1) * dt - (T * dt + I * w0);
return w2;
}
inline btMatrix3x3 evalEulerEqnDeriv(const btVector3& w1, const btVector3& w0, const btScalar dt,
- const btMatrix3x3 &I)
+ const btMatrix3x3& I)
{
-
btMatrix3x3 w1x, Iw1x;
- const btVector3 Iwi = (I*w1);
+ const btVector3 Iwi = (I * w1);
w1.getSkewSymmetricMatrix(&w1x[0], &w1x[1], &w1x[2]);
Iwi.getSkewSymmetricMatrix(&Iw1x[0], &Iw1x[1], &Iw1x[2]);
- const btMatrix3x3 dfw1 = I + (w1x*I - Iw1x)*dt;
+ const btMatrix3x3 dfw1 = I + (w1x * I - Iw1x) * dt;
return dfw1;
}
@@ -295,58 +272,55 @@ btVector3 btRigidBody::computeGyroscopicForceExplicit(btScalar maxGyroscopicForc
{
btVector3 inertiaLocal = getLocalInertia();
btMatrix3x3 inertiaTensorWorld = getWorldTransform().getBasis().scaled(inertiaLocal) * getWorldTransform().getBasis().transpose();
- btVector3 tmp = inertiaTensorWorld*getAngularVelocity();
+ btVector3 tmp = inertiaTensorWorld * getAngularVelocity();
btVector3 gf = getAngularVelocity().cross(tmp);
btScalar l2 = gf.length2();
- if (l2>maxGyroscopicForce*maxGyroscopicForce)
+ if (l2 > maxGyroscopicForce * maxGyroscopicForce)
{
- gf *= btScalar(1.)/btSqrt(l2)*maxGyroscopicForce;
+ gf *= btScalar(1.) / btSqrt(l2) * maxGyroscopicForce;
}
return gf;
}
-
btVector3 btRigidBody::computeGyroscopicImpulseImplicit_Body(btScalar step) const
-{
+{
btVector3 idl = getLocalInertia();
btVector3 omega1 = getAngularVelocity();
btQuaternion q = getWorldTransform().getRotation();
-
+
// Convert to body coordinates
btVector3 omegab = quatRotate(q.inverse(), omega1);
btMatrix3x3 Ib;
- Ib.setValue(idl.x(),0,0,
- 0,idl.y(),0,
- 0,0,idl.z());
-
- btVector3 ibo = Ib*omegab;
+ Ib.setValue(idl.x(), 0, 0,
+ 0, idl.y(), 0,
+ 0, 0, idl.z());
+
+ btVector3 ibo = Ib * omegab;
// Residual vector
btVector3 f = step * omegab.cross(ibo);
-
+
btMatrix3x3 skew0;
omegab.getSkewSymmetricMatrix(&skew0[0], &skew0[1], &skew0[2]);
- btVector3 om = Ib*omegab;
+ btVector3 om = Ib * omegab;
btMatrix3x3 skew1;
- om.getSkewSymmetricMatrix(&skew1[0],&skew1[1],&skew1[2]);
-
+ om.getSkewSymmetricMatrix(&skew1[0], &skew1[1], &skew1[2]);
+
// Jacobian
- btMatrix3x3 J = Ib + (skew0*Ib - skew1)*step;
-
-// btMatrix3x3 Jinv = J.inverse();
-// btVector3 omega_div = Jinv*f;
+ btMatrix3x3 J = Ib + (skew0 * Ib - skew1) * step;
+
+ // btMatrix3x3 Jinv = J.inverse();
+ // btVector3 omega_div = Jinv*f;
btVector3 omega_div = J.solve33(f);
-
+
// Single Newton-Raphson update
- omegab = omegab - omega_div;//Solve33(J, f);
+ omegab = omegab - omega_div; //Solve33(J, f);
// Back to world coordinates
- btVector3 omega2 = quatRotate(q,omegab);
- btVector3 gf = omega2-omega1;
+ btVector3 omega2 = quatRotate(q, omegab);
+ btVector3 gf = omega2 - omega1;
return gf;
}
-
-
btVector3 btRigidBody::computeGyroscopicImpulseImplicit_World(btScalar step) const
{
// use full newton-euler equations. common practice to drop the wxIw term. want it for better tumbling behavior.
@@ -361,7 +335,7 @@ btVector3 btRigidBody::computeGyroscopicImpulseImplicit_World(btScalar step) con
m_worldTransform.getBasis().transpose();
// use newtons method to find implicit solution for new angular velocity (w')
- // f(w') = -(T*step + Iw) + Iw' + w' + w'xIw'*step = 0
+ // f(w') = -(T*step + Iw) + Iw' + w' + w'xIw'*step = 0
// df/dw' = I + 1xIw'*step + w'xI*step
btVector3 w1 = w0;
@@ -383,8 +357,7 @@ btVector3 btRigidBody::computeGyroscopicImpulseImplicit_World(btScalar step) con
return gf;
}
-
-void btRigidBody::integrateVelocities(btScalar step)
+void btRigidBody::integrateVelocities(btScalar step)
{
if (isStaticOrKinematicObject())
return;
@@ -393,30 +366,28 @@ void btRigidBody::integrateVelocities(btScalar step)
m_angularVelocity += m_invInertiaTensorWorld * m_totalTorque * step;
#define MAX_ANGVEL SIMD_HALF_PI
- /// clamp angular velocity. collision calculations will fail on higher angular velocities
+ /// clamp angular velocity. collision calculations will fail on higher angular velocities
btScalar angvel = m_angularVelocity.length();
- if (angvel*step > MAX_ANGVEL)
+ if (angvel * step > MAX_ANGVEL)
{
- m_angularVelocity *= (MAX_ANGVEL/step) /angvel;
+ m_angularVelocity *= (MAX_ANGVEL / step) / angvel;
}
-
}
btQuaternion btRigidBody::getOrientation() const
{
- btQuaternion orn;
- m_worldTransform.getBasis().getRotation(orn);
- return orn;
+ btQuaternion orn;
+ m_worldTransform.getBasis().getRotation(orn);
+ return orn;
}
-
-
+
void btRigidBody::setCenterOfMassTransform(const btTransform& xform)
{
-
if (isKinematicObject())
{
m_interpolationWorldTransform = m_worldTransform;
- } else
+ }
+ else
{
m_interpolationWorldTransform = xform;
}
@@ -426,10 +397,6 @@ void btRigidBody::setCenterOfMassTransform(const btTransform& xform)
updateInertiaTensor();
}
-
-
-
-
void btRigidBody::addConstraintRef(btTypedConstraint* c)
{
///disable collision with the 'other' body
@@ -450,39 +417,39 @@ void btRigidBody::addConstraintRef(btTypedConstraint* c)
{
colObjB->setIgnoreCollisionCheck(colObjA, true);
}
- }
+ }
}
void btRigidBody::removeConstraintRef(btTypedConstraint* c)
{
int index = m_constraintRefs.findLinearSearch(c);
//don't remove constraints that are not referenced
- if(index < m_constraintRefs.size())
- {
- m_constraintRefs.remove(c);
- btCollisionObject* colObjA = &c->getRigidBodyA();
- btCollisionObject* colObjB = &c->getRigidBodyB();
- if (colObjA == this)
- {
- colObjA->setIgnoreCollisionCheck(colObjB, false);
- }
- else
- {
- colObjB->setIgnoreCollisionCheck(colObjA, false);
- }
- }
+ if (index < m_constraintRefs.size())
+ {
+ m_constraintRefs.remove(c);
+ btCollisionObject* colObjA = &c->getRigidBodyA();
+ btCollisionObject* colObjB = &c->getRigidBodyB();
+ if (colObjA == this)
+ {
+ colObjA->setIgnoreCollisionCheck(colObjB, false);
+ }
+ else
+ {
+ colObjB->setIgnoreCollisionCheck(colObjA, false);
+ }
+ }
}
-int btRigidBody::calculateSerializeBufferSize() const
+int btRigidBody::calculateSerializeBufferSize() const
{
int sz = sizeof(btRigidBodyData);
return sz;
}
- ///fills the dataBuffer and returns the struct name (and 0 on failure)
-const char* btRigidBody::serialize(void* dataBuffer, class btSerializer* serializer) const
+///fills the dataBuffer and returns the struct name (and 0 on failure)
+const char* btRigidBody::serialize(void* dataBuffer, class btSerializer* serializer) const
{
- btRigidBodyData* rbd = (btRigidBodyData*) dataBuffer;
+ btRigidBodyData* rbd = (btRigidBodyData*)dataBuffer;
btCollisionObject::serialize(&rbd->m_collisionObjectData, serializer);
@@ -504,7 +471,7 @@ const char* btRigidBody::serialize(void* dataBuffer, class btSerializer* seriali
rbd->m_additionalLinearDampingThresholdSqr = m_additionalLinearDampingThresholdSqr;
rbd->m_additionalAngularDampingThresholdSqr = m_additionalAngularDampingThresholdSqr;
rbd->m_additionalAngularDampingFactor = m_additionalAngularDampingFactor;
- rbd->m_linearSleepingThreshold=m_linearSleepingThreshold;
+ rbd->m_linearSleepingThreshold = m_linearSleepingThreshold;
rbd->m_angularSleepingThreshold = m_angularSleepingThreshold;
// Fill padding with zeros to appease msan.
@@ -515,13 +482,9 @@ const char* btRigidBody::serialize(void* dataBuffer, class btSerializer* seriali
return btRigidBodyDataName;
}
-
-
void btRigidBody::serializeSingleObject(class btSerializer* serializer) const
{
- btChunk* chunk = serializer->allocate(calculateSerializeBufferSize(),1);
+ btChunk* chunk = serializer->allocate(calculateSerializeBufferSize(), 1);
const char* structType = serialize(chunk->m_oldPtr, serializer);
- serializer->finalizeChunk(chunk,structType,BT_RIGIDBODY_CODE,(void*)this);
+ serializer->finalizeChunk(chunk, structType, BT_RIGIDBODY_CODE, (void*)this);
}
-
-
diff --git a/thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.h b/thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.h
index 372245031b..05f270a4b8 100644
--- a/thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.h
+++ b/thirdparty/bullet/BulletDynamics/Dynamics/btRigidBody.h
@@ -25,209 +25,195 @@ class btCollisionShape;
class btMotionState;
class btTypedConstraint;
-
extern btScalar gDeactivationTime;
extern bool gDisableDeactivation;
#ifdef BT_USE_DOUBLE_PRECISION
-#define btRigidBodyData btRigidBodyDoubleData
-#define btRigidBodyDataName "btRigidBodyDoubleData"
+#define btRigidBodyData btRigidBodyDoubleData
+#define btRigidBodyDataName "btRigidBodyDoubleData"
#else
-#define btRigidBodyData btRigidBodyFloatData
-#define btRigidBodyDataName "btRigidBodyFloatData"
-#endif //BT_USE_DOUBLE_PRECISION
-
+#define btRigidBodyData btRigidBodyFloatData
+#define btRigidBodyDataName "btRigidBodyFloatData"
+#endif //BT_USE_DOUBLE_PRECISION
-enum btRigidBodyFlags
+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_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:
+///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 on-way interaction, and Bullet calculates a velocity based on the timestep and previous and current world transform.
+///- 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
+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;
+ 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;
+ btMotionState* m_optionalMotionState;
//keep track of typed constraints referencing this rigid body, to disable collision between linked bodies
btAlignedObjectArray<btTypedConstraint*> m_constraintRefs;
- int m_rigidbodyFlags;
-
- int m_debugBodyId;
-
+ int m_rigidbodyFlags;
-protected:
-
- ATTRIBUTE_ALIGNED16(btVector3 m_deltaLinearVelocity);
- btVector3 m_deltaAngularVelocity;
- btVector3 m_angularFactor;
- btVector3 m_invMass;
- btVector3 m_pushVelocity;
- btVector3 m_turnVelocity;
+ 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.
+ ///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
+ struct btRigidBodyConstructionInfo
{
- btScalar m_mass;
+ 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;
+ btMotionState* m_motionState;
+ btTransform m_startWorldTransform;
- btCollisionShape* m_collisionShape;
- btVector3 m_localInertia;
- btScalar m_linearDamping;
- btScalar m_angularDamping;
+ btCollisionShape* m_collisionShape;
+ btVector3 m_localInertia;
+ btScalar m_linearDamping;
+ btScalar m_angularDamping;
///best simulation results when friction is non-zero
- btScalar m_friction;
+ 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
-
+ btScalar m_rollingFriction;
+ btScalar m_spinningFriction; //torsional friction around contact normal
+
///best simulation results using zero restitution.
- btScalar m_restitution;
+ btScalar m_restitution;
- btScalar m_linearSleepingThreshold;
- btScalar m_angularSleepingThreshold;
+ 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))
+ 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(const btRigidBodyConstructionInfo& constructionInfo);
- ///btRigidBody constructor for backwards compatibility.
+ ///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));
-
+ 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);
- }
+ {
+ //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);
+ void setupRigidBody(const btRigidBodyConstructionInfo& constructionInfo);
public:
+ void proceedToTransform(const btTransform& newTrans);
- 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)
+ static const btRigidBody* upcast(const btCollisionObject* colObj)
{
- if (colObj->getInternalType()&btCollisionObject::CO_RIGID_BODY)
+ if (colObj->getInternalType() & btCollisionObject::CO_RIGID_BODY)
return (const btRigidBody*)colObj;
return 0;
}
- static btRigidBody* upcast(btCollisionObject* colObj)
+ static btRigidBody* upcast(btCollisionObject* colObj)
{
- if (colObj->getInternalType()&btCollisionObject::CO_RIGID_BODY)
+ 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 setGravity(const btVector3& acceleration);
+ void predictIntegratedTransform(btScalar step, btTransform& predictedTransform);
+
+ void saveKinematicState(btScalar step);
+
+ void applyGravity();
+
+ void setGravity(const btVector3& acceleration);
- const btVector3& getGravity() const
+ const btVector3& getGravity() const
{
return m_gravity_acceleration;
}
- void setDamping(btScalar lin_damping, btScalar ang_damping);
+ void setDamping(btScalar lin_damping, btScalar ang_damping);
btScalar getLinearDamping() const
{
@@ -249,18 +235,20 @@ public:
return m_angularSleepingThreshold;
}
- void applyDamping(btScalar timeStep);
+ void applyDamping(btScalar timeStep);
- SIMD_FORCE_INLINE const btCollisionShape* getCollisionShape() const {
+ SIMD_FORCE_INLINE const btCollisionShape* getCollisionShape() const
+ {
return m_collisionShape;
}
- SIMD_FORCE_INLINE btCollisionShape* getCollisionShape() {
- return m_collisionShape;
+ SIMD_FORCE_INLINE btCollisionShape* getCollisionShape()
+ {
+ return m_collisionShape;
}
-
- void setMassProps(btScalar mass, const btVector3& inertia);
-
+
+ void setMassProps(btScalar mass, const btVector3& inertia);
+
const btVector3& getLinearFactor() const
{
return m_linearFactor;
@@ -268,20 +256,21 @@ public:
void setLinearFactor(const btVector3& linearFactor)
{
m_linearFactor = linearFactor;
- m_invMass = m_linearFactor*m_inverseMass;
+ m_invMass = m_linearFactor * m_inverseMass;
}
- btScalar getInvMass() const { return m_inverseMass; }
- const btMatrix3x3& getInvInertiaTensorWorld() const {
- return m_invInertiaTensorWorld;
+ btScalar getInvMass() const { return m_inverseMass; }
+ const btMatrix3x3& getInvInertiaTensorWorld() const
+ {
+ return m_invInertiaTensorWorld;
}
-
- void integrateVelocities(btScalar step);
- void setCenterOfMassTransform(const btTransform& xform);
+ void integrateVelocities(btScalar step);
+
+ void setCenterOfMassTransform(const btTransform& xform);
- void applyCentralForce(const btVector3& force)
+ void applyCentralForce(const btVector3& force)
{
- m_totalForce += force*m_linearFactor;
+ m_totalForce += force * m_linearFactor;
}
const btVector3& getTotalForce() const
@@ -293,90 +282,93 @@ public:
{
return m_totalTorque;
};
-
+
const btVector3& getInvInertiaDiagLocal() const
{
return m_invInertiaLocal;
};
- void setInvInertiaDiagLocal(const btVector3& diagInvInertia)
+ void setInvInertiaDiagLocal(const btVector3& diagInvInertia)
{
m_invInertiaLocal = diagInvInertia;
}
- void setSleepingThresholds(btScalar linear,btScalar angular)
+ void setSleepingThresholds(btScalar linear, btScalar angular)
{
m_linearSleepingThreshold = linear;
m_angularSleepingThreshold = angular;
}
- void applyTorque(const btVector3& torque)
+ void applyTorque(const btVector3& torque)
{
- m_totalTorque += torque*m_angularFactor;
+ m_totalTorque += torque * m_angularFactor;
}
-
- void applyForce(const btVector3& force, const btVector3& rel_pos)
+
+ void applyForce(const btVector3& force, const btVector3& rel_pos)
{
applyCentralForce(force);
- applyTorque(rel_pos.cross(force*m_linearFactor));
+ applyTorque(rel_pos.cross(force * m_linearFactor));
}
-
+
void applyCentralImpulse(const btVector3& impulse)
{
- m_linearVelocity += impulse *m_linearFactor * m_inverseMass;
+ m_linearVelocity += impulse * m_linearFactor * m_inverseMass;
}
-
- void applyTorqueImpulse(const btVector3& torque)
+
+ void applyTorqueImpulse(const btVector3& torque)
{
- m_angularVelocity += m_invInertiaTensorWorld * torque * m_angularFactor;
+ m_angularVelocity += m_invInertiaTensorWorld * torque * m_angularFactor;
}
-
- void applyImpulse(const btVector3& impulse, const btVector3& rel_pos)
+
+ 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));
+ applyTorqueImpulse(rel_pos.cross(impulse * m_linearFactor));
}
}
}
- void clearForces()
+ 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();
+
+ void updateInertiaTensor();
+
+ const btVector3& getCenterOfMassPosition() const
+ {
+ return m_worldTransform.getOrigin();
}
btQuaternion getOrientation() const;
-
- const btTransform& getCenterOfMassTransform() const {
- return m_worldTransform;
+
+ const btTransform& getCenterOfMassTransform() const
+ {
+ return m_worldTransform;
}
- const btVector3& getLinearVelocity() const {
- return m_linearVelocity;
+ const btVector3& getLinearVelocity() const
+ {
+ return m_linearVelocity;
}
- const btVector3& getAngularVelocity() const {
- return m_angularVelocity;
+ const btVector3& getAngularVelocity() const
+ {
+ return m_angularVelocity;
}
-
inline void setLinearVelocity(const btVector3& lin_vel)
- {
+ {
m_updateRevision++;
- m_linearVelocity = lin_vel;
+ m_linearVelocity = lin_vel;
}
- inline void setAngularVelocity(const btVector3& ang_vel)
- {
+ inline void setAngularVelocity(const btVector3& ang_vel)
+ {
m_updateRevision++;
- m_angularVelocity = ang_vel;
+ m_angularVelocity = ang_vel;
}
btVector3 getVelocityInLocalPoint(const btVector3& rel_pos) const
@@ -388,18 +380,13 @@ public:
// return (m_worldTransform(rel_pos) - m_interpolationWorldTransform(rel_pos)) / m_kinematicTimeStep;
}
- void translate(const btVector3& v)
+ void translate(const btVector3& v)
{
- m_worldTransform.getOrigin() += v;
+ m_worldTransform.getOrigin() += v;
}
-
- void getAabb(btVector3& aabbMin,btVector3& aabbMax) const;
-
+ void getAabb(btVector3& aabbMin, btVector3& aabbMax) const;
-
-
-
SIMD_FORCE_INLINE btScalar computeImpulseDenominator(const btVector3& pos, const btVector3& normal) const
{
btVector3 r0 = pos - getCenterOfMassPosition();
@@ -409,7 +396,6 @@ public:
btVector3 vec = (c0 * getInvInertiaTensorWorld()).cross(r0);
return m_inverseMass + normal.dot(vec);
-
}
SIMD_FORCE_INLINE btScalar computeAngularImpulseDenominator(const btVector3& axis) const
@@ -418,26 +404,25 @@ public:
return axis.dot(vec);
}
- SIMD_FORCE_INLINE void updateDeactivation(btScalar timeStep)
+ SIMD_FORCE_INLINE void updateDeactivation(btScalar timeStep)
{
- if ( (getActivationState() == ISLAND_SLEEPING) || (getActivationState() == DISABLE_DEACTIVATION))
+ if ((getActivationState() == ISLAND_SLEEPING) || (getActivationState() == DISABLE_DEACTIVATION))
return;
- if ((getLinearVelocity().length2() < m_linearSleepingThreshold*m_linearSleepingThreshold) &&
- (getAngularVelocity().length2() < m_angularSleepingThreshold*m_angularSleepingThreshold))
+ if ((getLinearVelocity().length2() < m_linearSleepingThreshold * m_linearSleepingThreshold) &&
+ (getAngularVelocity().length2() < m_angularSleepingThreshold * m_angularSleepingThreshold))
{
m_deactivationTime += timeStep;
- } else
+ }
+ else
{
- m_deactivationTime=btScalar(0.);
+ m_deactivationTime = btScalar(0.);
setActivationState(0);
}
-
}
- SIMD_FORCE_INLINE bool wantsSleeping()
+ SIMD_FORCE_INLINE bool wantsSleeping()
{
-
if (getActivationState() == DISABLE_DEACTIVATION)
return false;
@@ -445,41 +430,39 @@ public:
if (gDisableDeactivation || (gDeactivationTime == btScalar(0.)))
return false;
- if ( (getActivationState() == ISLAND_SLEEPING) || (getActivationState() == WANTS_DEACTIVATION))
+ if ((getActivationState() == ISLAND_SLEEPING) || (getActivationState() == WANTS_DEACTIVATION))
return true;
- if (m_deactivationTime> gDeactivationTime)
+ if (m_deactivationTime > gDeactivationTime)
{
return true;
}
return false;
}
-
-
- const btBroadphaseProxy* getBroadphaseProxy() const
+ const btBroadphaseProxy* getBroadphaseProxy() const
{
return m_broadphaseHandle;
}
- btBroadphaseProxy* getBroadphaseProxy()
+ btBroadphaseProxy* getBroadphaseProxy()
{
return m_broadphaseHandle;
}
- void setNewBroadphaseProxy(btBroadphaseProxy* broadphaseProxy)
+ void setNewBroadphaseProxy(btBroadphaseProxy* broadphaseProxy)
{
m_broadphaseHandle = broadphaseProxy;
}
//btMotionState allows to automatic synchronize the world transform for active objects
- btMotionState* getMotionState()
+ btMotionState* getMotionState()
{
return m_optionalMotionState;
}
- const btMotionState* getMotionState() const
+ const btMotionState* getMotionState() const
{
return m_optionalMotionState;
}
- void setMotionState(btMotionState* motionState)
+ void setMotionState(btMotionState* motionState)
{
m_optionalMotionState = motionState;
if (m_optionalMotionState)
@@ -487,27 +470,27 @@ public:
}
//for experimental overriding of friction/contact solver func
- int m_contactSolverType;
- int m_frictionSolverType;
+ int m_contactSolverType;
+ int m_frictionSolverType;
- void setAngularFactor(const btVector3& angFac)
+ void setAngularFactor(const btVector3& angFac)
{
m_updateRevision++;
m_angularFactor = angFac;
}
- void setAngularFactor(btScalar angFac)
+ void setAngularFactor(btScalar angFac)
{
m_updateRevision++;
- m_angularFactor.setValue(angFac,angFac,angFac);
+ m_angularFactor.setValue(angFac, angFac, angFac);
}
- const btVector3& getAngularFactor() const
+ const btVector3& getAngularFactor() const
{
return m_angularFactor;
}
//is this rigidbody added to a btCollisionWorld/btDynamicsWorld/btBroadphase?
- bool isInWorld() const
+ bool isInWorld() const
{
return (getBroadphaseProxy() != 0);
}
@@ -525,7 +508,7 @@ public:
return m_constraintRefs.size();
}
- void setFlags(int flags)
+ void setFlags(int flags)
{
m_rigidbodyFlags = flags;
}
@@ -535,12 +518,9 @@ public:
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;
@@ -550,70 +530,66 @@ public:
///////////////////////////////////////////////
- virtual int calculateSerializeBufferSize() 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 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
+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;
+ 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
+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];
+ 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
-
+#endif //BT_RIGIDBODY_H
diff --git a/thirdparty/bullet/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp b/thirdparty/bullet/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp
index 6f63b87c80..8103390fb1 100644
--- a/thirdparty/bullet/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp
+++ b/thirdparty/bullet/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp
@@ -21,47 +21,40 @@ subject to the following restrictions:
#include "BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h"
#include "BulletDynamics/ConstraintSolver/btContactSolverInfo.h"
-
/*
Make sure this dummy function never changes so that it
can be used by probes that are checking whether the
library is actually installed.
*/
-extern "C"
+extern "C"
{
- void btBulletDynamicsProbe ();
- void btBulletDynamicsProbe () {}
+ void btBulletDynamicsProbe();
+ void btBulletDynamicsProbe() {}
}
-
-
-
-btSimpleDynamicsWorld::btSimpleDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* pairCache,btConstraintSolver* constraintSolver,btCollisionConfiguration* collisionConfiguration)
-:btDynamicsWorld(dispatcher,pairCache,collisionConfiguration),
-m_constraintSolver(constraintSolver),
-m_ownsConstraintSolver(false),
-m_gravity(0,0,-10)
+btSimpleDynamicsWorld::btSimpleDynamicsWorld(btDispatcher* dispatcher, btBroadphaseInterface* pairCache, btConstraintSolver* constraintSolver, btCollisionConfiguration* collisionConfiguration)
+ : btDynamicsWorld(dispatcher, pairCache, collisionConfiguration),
+ m_constraintSolver(constraintSolver),
+ m_ownsConstraintSolver(false),
+ m_gravity(0, 0, -10)
{
-
}
-
btSimpleDynamicsWorld::~btSimpleDynamicsWorld()
{
if (m_ownsConstraintSolver)
- btAlignedFree( m_constraintSolver);
+ btAlignedFree(m_constraintSolver);
}
-int btSimpleDynamicsWorld::stepSimulation( btScalar timeStep,int maxSubSteps, btScalar fixedTimeStep)
+int btSimpleDynamicsWorld::stepSimulation(btScalar timeStep, int maxSubSteps, btScalar fixedTimeStep)
{
(void)fixedTimeStep;
(void)maxSubSteps;
-
///apply gravity, predict motion
predictUnconstraintMotion(timeStep);
- btDispatcherInfo& dispatchInfo = getDispatchInfo();
+ btDispatcherInfo& dispatchInfo = getDispatchInfo();
dispatchInfo.m_timeStep = timeStep;
dispatchInfo.m_stepCount = 0;
dispatchInfo.m_debugDraw = getDebugDrawer();
@@ -74,17 +67,17 @@ int btSimpleDynamicsWorld::stepSimulation( btScalar timeStep,int maxSubSteps, b
if (numManifolds)
{
btPersistentManifold** manifoldPtr = ((btCollisionDispatcher*)m_dispatcher1)->getInternalManifoldPointer();
-
+
btContactSolverInfo infoGlobal;
infoGlobal.m_timeStep = timeStep;
- m_constraintSolver->prepareSolve(0,numManifolds);
- m_constraintSolver->solveGroup(&getCollisionObjectArray()[0],getNumCollisionObjects(),manifoldPtr, numManifolds,0,0,infoGlobal,m_debugDrawer, m_dispatcher1);
- m_constraintSolver->allSolved(infoGlobal,m_debugDrawer);
+ m_constraintSolver->prepareSolve(0, numManifolds);
+ m_constraintSolver->solveGroup(&getCollisionObjectArray()[0], getNumCollisionObjects(), manifoldPtr, numManifolds, 0, 0, infoGlobal, m_debugDrawer, m_dispatcher1);
+ m_constraintSolver->allSolved(infoGlobal, m_debugDrawer);
}
///integrate transforms
integrateTransforms(timeStep);
-
+
updateAabbs();
synchronizeMotionStates();
@@ -92,29 +85,27 @@ int btSimpleDynamicsWorld::stepSimulation( btScalar timeStep,int maxSubSteps, b
clearForces();
return 1;
-
}
-void btSimpleDynamicsWorld::clearForces()
+void btSimpleDynamicsWorld::clearForces()
{
///@todo: iterate over awake simulation islands!
- for ( int i=0;i<m_collisionObjects.size();i++)
+ for (int i = 0; i < m_collisionObjects.size(); i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
-
+
btRigidBody* body = btRigidBody::upcast(colObj);
if (body)
{
body->clearForces();
}
}
-}
-
+}
-void btSimpleDynamicsWorld::setGravity(const btVector3& gravity)
+void btSimpleDynamicsWorld::setGravity(const btVector3& gravity)
{
m_gravity = gravity;
- for ( int i=0;i<m_collisionObjects.size();i++)
+ for (int i = 0; i < m_collisionObjects.size(); i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
btRigidBody* body = btRigidBody::upcast(colObj);
@@ -125,17 +116,17 @@ void btSimpleDynamicsWorld::setGravity(const btVector3& gravity)
}
}
-btVector3 btSimpleDynamicsWorld::getGravity () const
+btVector3 btSimpleDynamicsWorld::getGravity() const
{
return m_gravity;
}
-void btSimpleDynamicsWorld::removeRigidBody(btRigidBody* body)
+void btSimpleDynamicsWorld::removeRigidBody(btRigidBody* body)
{
btCollisionWorld::removeCollisionObject(body);
}
-void btSimpleDynamicsWorld::removeCollisionObject(btCollisionObject* collisionObject)
+void btSimpleDynamicsWorld::removeCollisionObject(btCollisionObject* collisionObject)
{
btRigidBody* body = btRigidBody::upcast(collisionObject);
if (body)
@@ -144,8 +135,7 @@ void btSimpleDynamicsWorld::removeCollisionObject(btCollisionObject* collisionOb
btCollisionWorld::removeCollisionObject(collisionObject);
}
-
-void btSimpleDynamicsWorld::addRigidBody(btRigidBody* body)
+void btSimpleDynamicsWorld::addRigidBody(btRigidBody* body)
{
body->setGravity(m_gravity);
@@ -155,37 +145,32 @@ void btSimpleDynamicsWorld::addRigidBody(btRigidBody* body)
}
}
-void btSimpleDynamicsWorld::addRigidBody(btRigidBody* body, int group, int mask)
+void btSimpleDynamicsWorld::addRigidBody(btRigidBody* body, int group, int mask)
{
body->setGravity(m_gravity);
if (body->getCollisionShape())
{
- addCollisionObject(body,group,mask);
+ addCollisionObject(body, group, mask);
}
}
-
-void btSimpleDynamicsWorld::debugDrawWorld()
+void btSimpleDynamicsWorld::debugDrawWorld()
{
-
}
-
-void btSimpleDynamicsWorld::addAction(btActionInterface* action)
-{
+void btSimpleDynamicsWorld::addAction(btActionInterface* action)
+{
}
-void btSimpleDynamicsWorld::removeAction(btActionInterface* action)
+void btSimpleDynamicsWorld::removeAction(btActionInterface* action)
{
-
}
-
-void btSimpleDynamicsWorld::updateAabbs()
+void btSimpleDynamicsWorld::updateAabbs()
{
btTransform predictedTrans;
- for ( int i=0;i<m_collisionObjects.size();i++)
+ for (int i = 0; i < m_collisionObjects.size(); i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
btRigidBody* body = btRigidBody::upcast(colObj);
@@ -193,19 +178,19 @@ void btSimpleDynamicsWorld::updateAabbs()
{
if (body->isActive() && (!body->isStaticObject()))
{
- btVector3 minAabb,maxAabb;
- colObj->getCollisionShape()->getAabb(colObj->getWorldTransform(), minAabb,maxAabb);
+ btVector3 minAabb, maxAabb;
+ colObj->getCollisionShape()->getAabb(colObj->getWorldTransform(), minAabb, maxAabb);
btBroadphaseInterface* bp = getBroadphase();
- bp->setAabb(body->getBroadphaseHandle(),minAabb,maxAabb, m_dispatcher1);
+ bp->setAabb(body->getBroadphaseHandle(), minAabb, maxAabb, m_dispatcher1);
}
}
}
}
-void btSimpleDynamicsWorld::integrateTransforms(btScalar timeStep)
+void btSimpleDynamicsWorld::integrateTransforms(btScalar timeStep)
{
btTransform predictedTrans;
- for ( int i=0;i<m_collisionObjects.size();i++)
+ for (int i = 0; i < m_collisionObjects.size(); i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
btRigidBody* body = btRigidBody::upcast(colObj);
@@ -214,17 +199,15 @@ void btSimpleDynamicsWorld::integrateTransforms(btScalar timeStep)
if (body->isActive() && (!body->isStaticObject()))
{
body->predictIntegratedTransform(timeStep, predictedTrans);
- body->proceedToTransform( predictedTrans);
+ body->proceedToTransform(predictedTrans);
}
}
}
}
-
-
-void btSimpleDynamicsWorld::predictUnconstraintMotion(btScalar timeStep)
+void btSimpleDynamicsWorld::predictUnconstraintMotion(btScalar timeStep)
{
- for ( int i=0;i<m_collisionObjects.size();i++)
+ for (int i = 0; i < m_collisionObjects.size(); i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
btRigidBody* body = btRigidBody::upcast(colObj);
@@ -235,20 +218,19 @@ void btSimpleDynamicsWorld::predictUnconstraintMotion(btScalar timeStep)
if (body->isActive())
{
body->applyGravity();
- body->integrateVelocities( timeStep);
+ body->integrateVelocities(timeStep);
body->applyDamping(timeStep);
- body->predictIntegratedTransform(timeStep,body->getInterpolationWorldTransform());
+ body->predictIntegratedTransform(timeStep, body->getInterpolationWorldTransform());
}
}
}
}
}
-
-void btSimpleDynamicsWorld::synchronizeMotionStates()
+void btSimpleDynamicsWorld::synchronizeMotionStates()
{
///@todo: iterate over awake simulation islands!
- for ( int i=0;i<m_collisionObjects.size();i++)
+ for (int i = 0; i < m_collisionObjects.size(); i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
btRigidBody* body = btRigidBody::upcast(colObj);
@@ -260,11 +242,9 @@ void btSimpleDynamicsWorld::synchronizeMotionStates()
}
}
}
-
}
-
-void btSimpleDynamicsWorld::setConstraintSolver(btConstraintSolver* solver)
+void btSimpleDynamicsWorld::setConstraintSolver(btConstraintSolver* solver)
{
if (m_ownsConstraintSolver)
{
diff --git a/thirdparty/bullet/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h b/thirdparty/bullet/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h
index 44b7e7fb34..12be231c7f 100644
--- a/thirdparty/bullet/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h
+++ b/thirdparty/bullet/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h
@@ -27,63 +27,58 @@ class btConstraintSolver;
class btSimpleDynamicsWorld : public btDynamicsWorld
{
protected:
+ btConstraintSolver* m_constraintSolver;
- btConstraintSolver* m_constraintSolver;
+ bool m_ownsConstraintSolver;
- bool m_ownsConstraintSolver;
-
- void predictUnconstraintMotion(btScalar timeStep);
-
- void integrateTransforms(btScalar timeStep);
-
- btVector3 m_gravity;
-
-public:
+ 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);
+ 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 int stepSimulation(btScalar timeStep, int maxSubSteps = 1, btScalar fixedTimeStep = btScalar(1.) / btScalar(60.));
- virtual void setGravity(const btVector3& gravity);
+ virtual void setGravity(const btVector3& gravity);
- virtual btVector3 getGravity () const;
+ virtual btVector3 getGravity() const;
- virtual void addRigidBody(btRigidBody* body);
+ virtual void addRigidBody(btRigidBody* body);
- virtual void addRigidBody(btRigidBody* body, int group, int mask);
+ virtual void addRigidBody(btRigidBody* body, int group, int mask);
- virtual void removeRigidBody(btRigidBody* body);
+ virtual void removeRigidBody(btRigidBody* body);
- virtual void debugDrawWorld();
-
- virtual void addAction(btActionInterface* action);
+ virtual void debugDrawWorld();
- virtual void removeAction(btActionInterface* action);
+ 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 removeCollisionObject(btCollisionObject* collisionObject);
+
+ virtual void updateAabbs();
- virtual void synchronizeMotionStates();
+ virtual void synchronizeMotionStates();
- virtual void setConstraintSolver(btConstraintSolver* solver);
+ virtual void setConstraintSolver(btConstraintSolver* solver);
virtual btConstraintSolver* getConstraintSolver();
- virtual btDynamicsWorldType getWorldType() const
+ virtual btDynamicsWorldType getWorldType() const
{
return BT_SIMPLE_DYNAMICS_WORLD;
}
- virtual void clearForces();
-
+ virtual void clearForces();
};
-#endif //BT_SIMPLE_DYNAMICS_WORLD_H
+#endif //BT_SIMPLE_DYNAMICS_WORLD_H
diff --git a/thirdparty/bullet/BulletDynamics/Dynamics/btSimulationIslandManagerMt.cpp b/thirdparty/bullet/BulletDynamics/Dynamics/btSimulationIslandManagerMt.cpp
index fc54f0ba6e..17287aa82a 100644
--- a/thirdparty/bullet/BulletDynamics/Dynamics/btSimulationIslandManagerMt.cpp
+++ b/thirdparty/bullet/BulletDynamics/Dynamics/btSimulationIslandManagerMt.cpp
@@ -13,7 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "LinearMath/btScalar.h"
#include "LinearMath/btThreads.h"
#include "btSimulationIslandManagerMt.h"
@@ -27,273 +26,259 @@ subject to the following restrictions:
//#include <stdio.h>
#include "LinearMath/btQuickprof.h"
-
-SIMD_FORCE_INLINE int calcBatchCost( int bodies, int manifolds, int constraints )
+SIMD_FORCE_INLINE int calcBatchCost(int bodies, int manifolds, int constraints)
{
- // rough estimate of the cost of a batch, used for merging
- int batchCost = bodies + 8 * manifolds + 4 * constraints;
- return batchCost;
+ // rough estimate of the cost of a batch, used for merging
+ int batchCost = bodies + 8 * manifolds + 4 * constraints;
+ return batchCost;
}
-
-SIMD_FORCE_INLINE int calcBatchCost( const btSimulationIslandManagerMt::Island* island )
+SIMD_FORCE_INLINE int calcBatchCost(const btSimulationIslandManagerMt::Island* island)
{
- return calcBatchCost( island->bodyArray.size(), island->manifoldArray.size(), island->constraintArray.size() );
+ return calcBatchCost(island->bodyArray.size(), island->manifoldArray.size(), island->constraintArray.size());
}
-
btSimulationIslandManagerMt::btSimulationIslandManagerMt()
{
- m_minimumSolverBatchSize = calcBatchCost(0, 128, 0);
- m_batchIslandMinBodyCount = 32;
- m_islandDispatch = parallelIslandDispatch;
- m_batchIsland = NULL;
+ m_minimumSolverBatchSize = calcBatchCost(0, 128, 0);
+ m_batchIslandMinBodyCount = 32;
+ m_islandDispatch = parallelIslandDispatch;
+ m_batchIsland = NULL;
}
-
btSimulationIslandManagerMt::~btSimulationIslandManagerMt()
{
- for ( int i = 0; i < m_allocatedIslands.size(); ++i )
- {
- delete m_allocatedIslands[ i ];
- }
- m_allocatedIslands.resize( 0 );
- m_activeIslands.resize( 0 );
- m_freeIslands.resize( 0 );
+ for (int i = 0; i < m_allocatedIslands.size(); ++i)
+ {
+ delete m_allocatedIslands[i];
+ }
+ m_allocatedIslands.resize(0);
+ m_activeIslands.resize(0);
+ m_freeIslands.resize(0);
}
-
-inline int getIslandId(const btPersistentManifold* lhs)
+inline int getIslandId(const btPersistentManifold* lhs)
{
const btCollisionObject* rcolObj0 = static_cast<const btCollisionObject*>(lhs->getBody0());
const btCollisionObject* rcolObj1 = static_cast<const btCollisionObject*>(lhs->getBody1());
- int islandId = rcolObj0->getIslandTag() >= 0 ? rcolObj0->getIslandTag() : rcolObj1->getIslandTag();
+ int islandId = rcolObj0->getIslandTag() >= 0 ? rcolObj0->getIslandTag() : rcolObj1->getIslandTag();
return islandId;
}
-
-SIMD_FORCE_INLINE int btGetConstraintIslandId( const btTypedConstraint* lhs )
+SIMD_FORCE_INLINE int btGetConstraintIslandId(const btTypedConstraint* lhs)
{
- const btCollisionObject& rcolObj0 = lhs->getRigidBodyA();
- const btCollisionObject& rcolObj1 = lhs->getRigidBodyB();
- int islandId = rcolObj0.getIslandTag() >= 0 ? rcolObj0.getIslandTag() : rcolObj1.getIslandTag();
- return islandId;
+ const btCollisionObject& rcolObj0 = lhs->getRigidBodyA();
+ const btCollisionObject& rcolObj1 = lhs->getRigidBodyB();
+ int islandId = rcolObj0.getIslandTag() >= 0 ? rcolObj0.getIslandTag() : rcolObj1.getIslandTag();
+ return islandId;
}
/// function object that routes calls to operator<
class IslandBatchSizeSortPredicate
{
public:
- bool operator() ( const btSimulationIslandManagerMt::Island* lhs, const btSimulationIslandManagerMt::Island* rhs ) const
- {
- int lCost = calcBatchCost( lhs );
- int rCost = calcBatchCost( rhs );
- return lCost > rCost;
- }
+ bool operator()(const btSimulationIslandManagerMt::Island* lhs, const btSimulationIslandManagerMt::Island* rhs) const
+ {
+ int lCost = calcBatchCost(lhs);
+ int rCost = calcBatchCost(rhs);
+ return lCost > rCost;
+ }
};
-
class IslandBodyCapacitySortPredicate
{
public:
- bool operator() ( const btSimulationIslandManagerMt::Island* lhs, const btSimulationIslandManagerMt::Island* rhs ) const
- {
- return lhs->bodyArray.capacity() > rhs->bodyArray.capacity();
- }
+ bool operator()(const btSimulationIslandManagerMt::Island* lhs, const btSimulationIslandManagerMt::Island* rhs) const
+ {
+ return lhs->bodyArray.capacity() > rhs->bodyArray.capacity();
+ }
};
-
-void btSimulationIslandManagerMt::Island::append( const Island& other )
+void btSimulationIslandManagerMt::Island::append(const Island& other)
{
- // append bodies
- for ( int i = 0; i < other.bodyArray.size(); ++i )
- {
- bodyArray.push_back( other.bodyArray[ i ] );
- }
- // append manifolds
- for ( int i = 0; i < other.manifoldArray.size(); ++i )
- {
- manifoldArray.push_back( other.manifoldArray[ i ] );
- }
- // append constraints
- for ( int i = 0; i < other.constraintArray.size(); ++i )
- {
- constraintArray.push_back( other.constraintArray[ i ] );
- }
+ // append bodies
+ for (int i = 0; i < other.bodyArray.size(); ++i)
+ {
+ bodyArray.push_back(other.bodyArray[i]);
+ }
+ // append manifolds
+ for (int i = 0; i < other.manifoldArray.size(); ++i)
+ {
+ manifoldArray.push_back(other.manifoldArray[i]);
+ }
+ // append constraints
+ for (int i = 0; i < other.constraintArray.size(); ++i)
+ {
+ constraintArray.push_back(other.constraintArray[i]);
+ }
}
-
-bool btIsBodyInIsland( const btSimulationIslandManagerMt::Island& island, const btCollisionObject* obj )
+bool btIsBodyInIsland(const btSimulationIslandManagerMt::Island& island, const btCollisionObject* obj)
{
- for ( int i = 0; i < island.bodyArray.size(); ++i )
- {
- if ( island.bodyArray[ i ] == obj )
- {
- return true;
- }
- }
- return false;
+ for (int i = 0; i < island.bodyArray.size(); ++i)
+ {
+ if (island.bodyArray[i] == obj)
+ {
+ return true;
+ }
+ }
+ return false;
}
-
void btSimulationIslandManagerMt::initIslandPools()
{
- // reset island pools
- int numElem = getUnionFind().getNumElements();
- m_lookupIslandFromId.resize( numElem );
- for ( int i = 0; i < m_lookupIslandFromId.size(); ++i )
- {
- m_lookupIslandFromId[ i ] = NULL;
- }
- m_activeIslands.resize( 0 );
- m_freeIslands.resize( 0 );
- // check whether allocated islands are sorted by body capacity (largest to smallest)
- int lastCapacity = 0;
- bool isSorted = true;
- for ( int i = 0; i < m_allocatedIslands.size(); ++i )
- {
- Island* island = m_allocatedIslands[ i ];
- int cap = island->bodyArray.capacity();
- if ( cap > lastCapacity )
- {
- isSorted = false;
- break;
- }
- lastCapacity = cap;
- }
- if ( !isSorted )
- {
- m_allocatedIslands.quickSort( IslandBodyCapacitySortPredicate() );
- }
-
- m_batchIsland = NULL;
- // mark all islands free (but avoid deallocation)
- for ( int i = 0; i < m_allocatedIslands.size(); ++i )
- {
- Island* island = m_allocatedIslands[ i ];
- island->bodyArray.resize( 0 );
- island->manifoldArray.resize( 0 );
- island->constraintArray.resize( 0 );
- island->id = -1;
- island->isSleeping = true;
- m_freeIslands.push_back( island );
- }
-}
+ // reset island pools
+ int numElem = getUnionFind().getNumElements();
+ m_lookupIslandFromId.resize(numElem);
+ for (int i = 0; i < m_lookupIslandFromId.size(); ++i)
+ {
+ m_lookupIslandFromId[i] = NULL;
+ }
+ m_activeIslands.resize(0);
+ m_freeIslands.resize(0);
+ // check whether allocated islands are sorted by body capacity (largest to smallest)
+ int lastCapacity = 0;
+ bool isSorted = true;
+ for (int i = 0; i < m_allocatedIslands.size(); ++i)
+ {
+ Island* island = m_allocatedIslands[i];
+ int cap = island->bodyArray.capacity();
+ if (cap > lastCapacity)
+ {
+ isSorted = false;
+ break;
+ }
+ lastCapacity = cap;
+ }
+ if (!isSorted)
+ {
+ m_allocatedIslands.quickSort(IslandBodyCapacitySortPredicate());
+ }
+ m_batchIsland = NULL;
+ // mark all islands free (but avoid deallocation)
+ for (int i = 0; i < m_allocatedIslands.size(); ++i)
+ {
+ Island* island = m_allocatedIslands[i];
+ island->bodyArray.resize(0);
+ island->manifoldArray.resize(0);
+ island->constraintArray.resize(0);
+ island->id = -1;
+ island->isSleeping = true;
+ m_freeIslands.push_back(island);
+ }
+}
-btSimulationIslandManagerMt::Island* btSimulationIslandManagerMt::getIsland( int id )
+btSimulationIslandManagerMt::Island* btSimulationIslandManagerMt::getIsland(int id)
{
- Island* island = m_lookupIslandFromId[ id ];
- if ( island == NULL )
- {
- // search for existing island
- for ( int i = 0; i < m_activeIslands.size(); ++i )
- {
- if ( m_activeIslands[ i ]->id == id )
- {
- island = m_activeIslands[ i ];
- break;
- }
- }
- m_lookupIslandFromId[ id ] = island;
- }
- return island;
+ Island* island = m_lookupIslandFromId[id];
+ if (island == NULL)
+ {
+ // search for existing island
+ for (int i = 0; i < m_activeIslands.size(); ++i)
+ {
+ if (m_activeIslands[i]->id == id)
+ {
+ island = m_activeIslands[i];
+ break;
+ }
+ }
+ m_lookupIslandFromId[id] = island;
+ }
+ return island;
}
-
-btSimulationIslandManagerMt::Island* btSimulationIslandManagerMt::allocateIsland( int id, int numBodies )
+btSimulationIslandManagerMt::Island* btSimulationIslandManagerMt::allocateIsland(int id, int numBodies)
{
- Island* island = NULL;
- int allocSize = numBodies;
- if ( numBodies < m_batchIslandMinBodyCount )
- {
- if ( m_batchIsland )
- {
- island = m_batchIsland;
- m_lookupIslandFromId[ id ] = island;
- // if we've made a large enough batch,
- if ( island->bodyArray.size() + numBodies >= m_batchIslandMinBodyCount )
- {
- // next time start a new batch
- m_batchIsland = NULL;
- }
- return island;
- }
- else
- {
- // need to allocate a batch island
- allocSize = m_batchIslandMinBodyCount * 2;
- }
- }
- btAlignedObjectArray<Island*>& freeIslands = m_freeIslands;
-
- // search for free island
- if ( freeIslands.size() > 0 )
- {
- // try to reuse a previously allocated island
- int iFound = freeIslands.size();
- // linear search for smallest island that can hold our bodies
- for ( int i = freeIslands.size() - 1; i >= 0; --i )
- {
- if ( freeIslands[ i ]->bodyArray.capacity() >= allocSize )
- {
- iFound = i;
- island = freeIslands[ i ];
- island->id = id;
- break;
- }
- }
- // if found, shrink array while maintaining ordering
- if ( island )
- {
- int iDest = iFound;
- int iSrc = iDest + 1;
- while ( iSrc < freeIslands.size() )
- {
- freeIslands[ iDest++ ] = freeIslands[ iSrc++ ];
- }
- freeIslands.pop_back();
- }
- }
- if ( island == NULL )
- {
- // no free island found, allocate
- island = new Island(); // TODO: change this to use the pool allocator
- island->id = id;
- island->bodyArray.reserve( allocSize );
- m_allocatedIslands.push_back( island );
- }
- m_lookupIslandFromId[ id ] = island;
- if ( numBodies < m_batchIslandMinBodyCount )
- {
- m_batchIsland = island;
- }
- m_activeIslands.push_back( island );
- return island;
-}
+ Island* island = NULL;
+ int allocSize = numBodies;
+ if (numBodies < m_batchIslandMinBodyCount)
+ {
+ if (m_batchIsland)
+ {
+ island = m_batchIsland;
+ m_lookupIslandFromId[id] = island;
+ // if we've made a large enough batch,
+ if (island->bodyArray.size() + numBodies >= m_batchIslandMinBodyCount)
+ {
+ // next time start a new batch
+ m_batchIsland = NULL;
+ }
+ return island;
+ }
+ else
+ {
+ // need to allocate a batch island
+ allocSize = m_batchIslandMinBodyCount * 2;
+ }
+ }
+ btAlignedObjectArray<Island*>& freeIslands = m_freeIslands;
+ // search for free island
+ if (freeIslands.size() > 0)
+ {
+ // try to reuse a previously allocated island
+ int iFound = freeIslands.size();
+ // linear search for smallest island that can hold our bodies
+ for (int i = freeIslands.size() - 1; i >= 0; --i)
+ {
+ if (freeIslands[i]->bodyArray.capacity() >= allocSize)
+ {
+ iFound = i;
+ island = freeIslands[i];
+ island->id = id;
+ break;
+ }
+ }
+ // if found, shrink array while maintaining ordering
+ if (island)
+ {
+ int iDest = iFound;
+ int iSrc = iDest + 1;
+ while (iSrc < freeIslands.size())
+ {
+ freeIslands[iDest++] = freeIslands[iSrc++];
+ }
+ freeIslands.pop_back();
+ }
+ }
+ if (island == NULL)
+ {
+ // no free island found, allocate
+ island = new Island(); // TODO: change this to use the pool allocator
+ island->id = id;
+ island->bodyArray.reserve(allocSize);
+ m_allocatedIslands.push_back(island);
+ }
+ m_lookupIslandFromId[id] = island;
+ if (numBodies < m_batchIslandMinBodyCount)
+ {
+ m_batchIsland = island;
+ }
+ m_activeIslands.push_back(island);
+ return island;
+}
-void btSimulationIslandManagerMt::buildIslands( btDispatcher* dispatcher, btCollisionWorld* collisionWorld )
+void btSimulationIslandManagerMt::buildIslands(btDispatcher* dispatcher, btCollisionWorld* collisionWorld)
{
-
BT_PROFILE("buildIslands");
-
+
btCollisionObjectArray& collisionObjects = collisionWorld->getCollisionObjectArray();
//we are going to sort the unionfind array, and store the element id in the size
//afterwards, we clean unionfind, to make sure no-one uses it anymore
-
+
getUnionFind().sortIslands();
int numElem = getUnionFind().getNumElements();
- int endIslandIndex=1;
+ int endIslandIndex = 1;
int startIslandIndex;
//update the sleeping state for bodies, if all are sleeping
- for ( startIslandIndex=0;startIslandIndex<numElem;startIslandIndex = endIslandIndex)
+ for (startIslandIndex = 0; startIslandIndex < numElem; startIslandIndex = endIslandIndex)
{
int islandId = getUnionFind().getElement(startIslandIndex).m_id;
- for (endIslandIndex = startIslandIndex+1;(endIslandIndex<numElem) && (getUnionFind().getElement(endIslandIndex).m_id == islandId);endIslandIndex++)
+ for (endIslandIndex = startIslandIndex + 1; (endIslandIndex < numElem) && (getUnionFind().getElement(endIslandIndex).m_id == islandId); endIslandIndex++)
{
}
@@ -302,21 +287,21 @@ void btSimulationIslandManagerMt::buildIslands( btDispatcher* dispatcher, btColl
bool allSleeping = true;
int idx;
- for (idx=startIslandIndex;idx<endIslandIndex;idx++)
+ for (idx = startIslandIndex; idx < endIslandIndex; idx++)
{
int i = getUnionFind().getElement(idx).m_sz;
btCollisionObject* colObj0 = collisionObjects[i];
if ((colObj0->getIslandTag() != islandId) && (colObj0->getIslandTag() != -1))
{
-// printf("error in island management\n");
+ // printf("error in island management\n");
}
btAssert((colObj0->getIslandTag() == islandId) || (colObj0->getIslandTag() == -1));
if (colObj0->getIslandTag() == islandId)
{
- if (colObj0->getActivationState()== ACTIVE_TAG ||
- colObj0->getActivationState()== DISABLE_DEACTIVATION)
+ if (colObj0->getActivationState() == ACTIVE_TAG ||
+ colObj0->getActivationState() == DISABLE_DEACTIVATION)
{
allSleeping = false;
break;
@@ -327,43 +312,43 @@ void btSimulationIslandManagerMt::buildIslands( btDispatcher* dispatcher, btColl
if (allSleeping)
{
int idx;
- for (idx=startIslandIndex;idx<endIslandIndex;idx++)
+ for (idx = startIslandIndex; idx < endIslandIndex; idx++)
{
int i = getUnionFind().getElement(idx).m_sz;
btCollisionObject* colObj0 = collisionObjects[i];
if ((colObj0->getIslandTag() != islandId) && (colObj0->getIslandTag() != -1))
{
-// printf("error in island management\n");
+ // printf("error in island management\n");
}
btAssert((colObj0->getIslandTag() == islandId) || (colObj0->getIslandTag() == -1));
if (colObj0->getIslandTag() == islandId)
{
- colObj0->setActivationState( ISLAND_SLEEPING );
+ colObj0->setActivationState(ISLAND_SLEEPING);
}
}
- } else
+ }
+ else
{
-
int idx;
- for (idx=startIslandIndex;idx<endIslandIndex;idx++)
+ for (idx = startIslandIndex; idx < endIslandIndex; idx++)
{
int i = getUnionFind().getElement(idx).m_sz;
btCollisionObject* colObj0 = collisionObjects[i];
if ((colObj0->getIslandTag() != islandId) && (colObj0->getIslandTag() != -1))
{
-// printf("error in island management\n");
+ // printf("error in island management\n");
}
btAssert((colObj0->getIslandTag() == islandId) || (colObj0->getIslandTag() == -1));
if (colObj0->getIslandTag() == islandId)
{
- if ( colObj0->getActivationState() == ISLAND_SLEEPING)
+ if (colObj0->getActivationState() == ISLAND_SLEEPING)
{
- colObj0->setActivationState( WANTS_DEACTIVATION);
+ colObj0->setActivationState(WANTS_DEACTIVATION);
colObj0->setDeactivationTime(0.f);
}
}
@@ -372,352 +357,338 @@ void btSimulationIslandManagerMt::buildIslands( btDispatcher* dispatcher, btColl
}
}
-
-void btSimulationIslandManagerMt::addBodiesToIslands( btCollisionWorld* collisionWorld )
+void btSimulationIslandManagerMt::addBodiesToIslands(btCollisionWorld* collisionWorld)
{
- btCollisionObjectArray& collisionObjects = collisionWorld->getCollisionObjectArray();
- int endIslandIndex = 1;
- int startIslandIndex;
- int numElem = getUnionFind().getNumElements();
-
- // create explicit islands and add bodies to each
- for ( startIslandIndex = 0; startIslandIndex < numElem; startIslandIndex = endIslandIndex )
- {
- int islandId = getUnionFind().getElement( startIslandIndex ).m_id;
-
- // find end index
- for ( endIslandIndex = startIslandIndex; ( endIslandIndex < numElem ) && ( getUnionFind().getElement( endIslandIndex ).m_id == islandId ); endIslandIndex++ )
- {
- }
- // check if island is sleeping
- bool islandSleeping = true;
- for ( int iElem = startIslandIndex; iElem < endIslandIndex; iElem++ )
- {
- int i = getUnionFind().getElement( iElem ).m_sz;
- btCollisionObject* colObj = collisionObjects[ i ];
- if ( colObj->isActive() )
- {
- islandSleeping = false;
- }
- }
- if ( !islandSleeping )
- {
- // want to count the number of bodies before allocating the island to optimize memory usage of the Island structures
- int numBodies = endIslandIndex - startIslandIndex;
- Island* island = allocateIsland( islandId, numBodies );
- island->isSleeping = false;
-
- // add bodies to island
- for ( int iElem = startIslandIndex; iElem < endIslandIndex; iElem++ )
- {
- int i = getUnionFind().getElement( iElem ).m_sz;
- btCollisionObject* colObj = collisionObjects[ i ];
- island->bodyArray.push_back( colObj );
- }
- }
- }
+ btCollisionObjectArray& collisionObjects = collisionWorld->getCollisionObjectArray();
+ int endIslandIndex = 1;
+ int startIslandIndex;
+ int numElem = getUnionFind().getNumElements();
-}
+ // create explicit islands and add bodies to each
+ for (startIslandIndex = 0; startIslandIndex < numElem; startIslandIndex = endIslandIndex)
+ {
+ int islandId = getUnionFind().getElement(startIslandIndex).m_id;
+ // find end index
+ for (endIslandIndex = startIslandIndex; (endIslandIndex < numElem) && (getUnionFind().getElement(endIslandIndex).m_id == islandId); endIslandIndex++)
+ {
+ }
+ // check if island is sleeping
+ bool islandSleeping = true;
+ for (int iElem = startIslandIndex; iElem < endIslandIndex; iElem++)
+ {
+ int i = getUnionFind().getElement(iElem).m_sz;
+ btCollisionObject* colObj = collisionObjects[i];
+ if (colObj->isActive())
+ {
+ islandSleeping = false;
+ }
+ }
+ if (!islandSleeping)
+ {
+ // want to count the number of bodies before allocating the island to optimize memory usage of the Island structures
+ int numBodies = endIslandIndex - startIslandIndex;
+ Island* island = allocateIsland(islandId, numBodies);
+ island->isSleeping = false;
-void btSimulationIslandManagerMt::addManifoldsToIslands( btDispatcher* dispatcher )
-{
- // walk all the manifolds, activating bodies touched by kinematic objects, and add each manifold to its Island
- int maxNumManifolds = dispatcher->getNumManifolds();
- for ( int i = 0; i < maxNumManifolds; i++ )
- {
- btPersistentManifold* manifold = dispatcher->getManifoldByIndexInternal( i );
-
- const btCollisionObject* colObj0 = static_cast<const btCollisionObject*>( manifold->getBody0() );
- const btCollisionObject* colObj1 = static_cast<const btCollisionObject*>( manifold->getBody1() );
-
- ///@todo: check sleeping conditions!
- if ( ( ( colObj0 ) && colObj0->getActivationState() != ISLAND_SLEEPING ) ||
- ( ( colObj1 ) && colObj1->getActivationState() != ISLAND_SLEEPING ) )
- {
-
- //kinematic objects don't merge islands, but wake up all connected objects
- if ( colObj0->isKinematicObject() && colObj0->getActivationState() != ISLAND_SLEEPING )
- {
- if ( colObj0->hasContactResponse() )
- colObj1->activate();
- }
- if ( colObj1->isKinematicObject() && colObj1->getActivationState() != ISLAND_SLEEPING )
- {
- if ( colObj1->hasContactResponse() )
- colObj0->activate();
- }
- //filtering for response
- if ( dispatcher->needsResponse( colObj0, colObj1 ) )
- {
- // scatter manifolds into various islands
- int islandId = getIslandId( manifold );
- // if island not sleeping,
- if ( Island* island = getIsland( islandId ) )
- {
- island->manifoldArray.push_back( manifold );
- }
- }
- }
- }
+ // add bodies to island
+ for (int iElem = startIslandIndex; iElem < endIslandIndex; iElem++)
+ {
+ int i = getUnionFind().getElement(iElem).m_sz;
+ btCollisionObject* colObj = collisionObjects[i];
+ island->bodyArray.push_back(colObj);
+ }
+ }
+ }
}
-
-void btSimulationIslandManagerMt::addConstraintsToIslands( btAlignedObjectArray<btTypedConstraint*>& constraints )
+void btSimulationIslandManagerMt::addManifoldsToIslands(btDispatcher* dispatcher)
{
- // walk constraints
- for ( int i = 0; i < constraints.size(); i++ )
- {
- // scatter constraints into various islands
- btTypedConstraint* constraint = constraints[ i ];
- if ( constraint->isEnabled() )
- {
- int islandId = btGetConstraintIslandId( constraint );
- // if island is not sleeping,
- if ( Island* island = getIsland( islandId ) )
- {
- island->constraintArray.push_back( constraint );
- }
- }
- }
+ // walk all the manifolds, activating bodies touched by kinematic objects, and add each manifold to its Island
+ int maxNumManifolds = dispatcher->getNumManifolds();
+ for (int i = 0; i < maxNumManifolds; i++)
+ {
+ btPersistentManifold* manifold = dispatcher->getManifoldByIndexInternal(i);
+
+ const btCollisionObject* colObj0 = static_cast<const btCollisionObject*>(manifold->getBody0());
+ const btCollisionObject* colObj1 = static_cast<const btCollisionObject*>(manifold->getBody1());
+
+ ///@todo: check sleeping conditions!
+ if (((colObj0) && colObj0->getActivationState() != ISLAND_SLEEPING) ||
+ ((colObj1) && colObj1->getActivationState() != ISLAND_SLEEPING))
+ {
+ //kinematic objects don't merge islands, but wake up all connected objects
+ if (colObj0->isKinematicObject() && colObj0->getActivationState() != ISLAND_SLEEPING)
+ {
+ if (colObj0->hasContactResponse())
+ colObj1->activate();
+ }
+ if (colObj1->isKinematicObject() && colObj1->getActivationState() != ISLAND_SLEEPING)
+ {
+ if (colObj1->hasContactResponse())
+ colObj0->activate();
+ }
+ //filtering for response
+ if (dispatcher->needsResponse(colObj0, colObj1))
+ {
+ // scatter manifolds into various islands
+ int islandId = getIslandId(manifold);
+ // if island not sleeping,
+ if (Island* island = getIsland(islandId))
+ {
+ island->manifoldArray.push_back(manifold);
+ }
+ }
+ }
+ }
}
+void btSimulationIslandManagerMt::addConstraintsToIslands(btAlignedObjectArray<btTypedConstraint*>& constraints)
+{
+ // walk constraints
+ for (int i = 0; i < constraints.size(); i++)
+ {
+ // scatter constraints into various islands
+ btTypedConstraint* constraint = constraints[i];
+ if (constraint->isEnabled())
+ {
+ int islandId = btGetConstraintIslandId(constraint);
+ // if island is not sleeping,
+ if (Island* island = getIsland(islandId))
+ {
+ island->constraintArray.push_back(constraint);
+ }
+ }
+ }
+}
void btSimulationIslandManagerMt::mergeIslands()
{
- // sort islands in order of decreasing batch size
- m_activeIslands.quickSort( IslandBatchSizeSortPredicate() );
-
- // merge small islands to satisfy minimum batch size
- // find first small batch island
- int destIslandIndex = m_activeIslands.size();
- for ( int i = 0; i < m_activeIslands.size(); ++i )
- {
- Island* island = m_activeIslands[ i ];
- int batchSize = calcBatchCost( island );
- if ( batchSize < m_minimumSolverBatchSize )
- {
- destIslandIndex = i;
- break;
- }
- }
- int lastIndex = m_activeIslands.size() - 1;
- while ( destIslandIndex < lastIndex )
- {
- // merge islands from the back of the list
- Island* island = m_activeIslands[ destIslandIndex ];
- int numBodies = island->bodyArray.size();
- int numManifolds = island->manifoldArray.size();
- int numConstraints = island->constraintArray.size();
- int firstIndex = lastIndex;
- // figure out how many islands we want to merge and find out how many bodies, manifolds and constraints we will have
- while ( true )
- {
- Island* src = m_activeIslands[ firstIndex ];
- numBodies += src->bodyArray.size();
- numManifolds += src->manifoldArray.size();
- numConstraints += src->constraintArray.size();
- int batchCost = calcBatchCost( numBodies, numManifolds, numConstraints );
- if ( batchCost >= m_minimumSolverBatchSize )
- {
- break;
- }
- if ( firstIndex - 1 == destIslandIndex )
- {
- break;
- }
- firstIndex--;
- }
- // reserve space for these pointers to minimize reallocation
- island->bodyArray.reserve( numBodies );
- island->manifoldArray.reserve( numManifolds );
- island->constraintArray.reserve( numConstraints );
- // merge islands
- for ( int i = firstIndex; i <= lastIndex; ++i )
- {
- island->append( *m_activeIslands[ i ] );
- }
- // shrink array to exclude the islands that were merged from
- m_activeIslands.resize( firstIndex );
- lastIndex = firstIndex - 1;
- destIslandIndex++;
- }
-}
+ // sort islands in order of decreasing batch size
+ m_activeIslands.quickSort(IslandBatchSizeSortPredicate());
+ // merge small islands to satisfy minimum batch size
+ // find first small batch island
+ int destIslandIndex = m_activeIslands.size();
+ for (int i = 0; i < m_activeIslands.size(); ++i)
+ {
+ Island* island = m_activeIslands[i];
+ int batchSize = calcBatchCost(island);
+ if (batchSize < m_minimumSolverBatchSize)
+ {
+ destIslandIndex = i;
+ break;
+ }
+ }
+ int lastIndex = m_activeIslands.size() - 1;
+ while (destIslandIndex < lastIndex)
+ {
+ // merge islands from the back of the list
+ Island* island = m_activeIslands[destIslandIndex];
+ int numBodies = island->bodyArray.size();
+ int numManifolds = island->manifoldArray.size();
+ int numConstraints = island->constraintArray.size();
+ int firstIndex = lastIndex;
+ // figure out how many islands we want to merge and find out how many bodies, manifolds and constraints we will have
+ while (true)
+ {
+ Island* src = m_activeIslands[firstIndex];
+ numBodies += src->bodyArray.size();
+ numManifolds += src->manifoldArray.size();
+ numConstraints += src->constraintArray.size();
+ int batchCost = calcBatchCost(numBodies, numManifolds, numConstraints);
+ if (batchCost >= m_minimumSolverBatchSize)
+ {
+ break;
+ }
+ if (firstIndex - 1 == destIslandIndex)
+ {
+ break;
+ }
+ firstIndex--;
+ }
+ // reserve space for these pointers to minimize reallocation
+ island->bodyArray.reserve(numBodies);
+ island->manifoldArray.reserve(numManifolds);
+ island->constraintArray.reserve(numConstraints);
+ // merge islands
+ for (int i = firstIndex; i <= lastIndex; ++i)
+ {
+ island->append(*m_activeIslands[i]);
+ }
+ // shrink array to exclude the islands that were merged from
+ m_activeIslands.resize(firstIndex);
+ lastIndex = firstIndex - 1;
+ destIslandIndex++;
+ }
+}
void btSimulationIslandManagerMt::solveIsland(btConstraintSolver* solver, Island& island, const SolverParams& solverParams)
{
- btPersistentManifold** manifolds = island.manifoldArray.size() ? &island.manifoldArray[ 0 ] : NULL;
- btTypedConstraint** constraintsPtr = island.constraintArray.size() ? &island.constraintArray[ 0 ] : NULL;
- solver->solveGroup( &island.bodyArray[ 0 ],
- island.bodyArray.size(),
- manifolds,
- island.manifoldArray.size(),
- constraintsPtr,
- island.constraintArray.size(),
- *solverParams.m_solverInfo,
- solverParams.m_debugDrawer,
- solverParams.m_dispatcher
- );
+ btPersistentManifold** manifolds = island.manifoldArray.size() ? &island.manifoldArray[0] : NULL;
+ btTypedConstraint** constraintsPtr = island.constraintArray.size() ? &island.constraintArray[0] : NULL;
+ solver->solveGroup(&island.bodyArray[0],
+ island.bodyArray.size(),
+ manifolds,
+ island.manifoldArray.size(),
+ constraintsPtr,
+ island.constraintArray.size(),
+ *solverParams.m_solverInfo,
+ solverParams.m_debugDrawer,
+ solverParams.m_dispatcher);
}
-
-void btSimulationIslandManagerMt::serialIslandDispatch( btAlignedObjectArray<Island*>* islandsPtr, const SolverParams& solverParams )
+void btSimulationIslandManagerMt::serialIslandDispatch(btAlignedObjectArray<Island*>* islandsPtr, const SolverParams& solverParams)
{
- BT_PROFILE( "serialIslandDispatch" );
- // serial dispatch
- btAlignedObjectArray<Island*>& islands = *islandsPtr;
- btConstraintSolver* solver = solverParams.m_solverMt ? solverParams.m_solverMt : solverParams.m_solverPool;
- for ( int i = 0; i < islands.size(); ++i )
- {
- solveIsland(solver, *islands[ i ], solverParams);
- }
+ BT_PROFILE("serialIslandDispatch");
+ // serial dispatch
+ btAlignedObjectArray<Island*>& islands = *islandsPtr;
+ btConstraintSolver* solver = solverParams.m_solverMt ? solverParams.m_solverMt : solverParams.m_solverPool;
+ for (int i = 0; i < islands.size(); ++i)
+ {
+ solveIsland(solver, *islands[i], solverParams);
+ }
}
-
struct UpdateIslandDispatcher : public btIParallelForBody
{
- btAlignedObjectArray<btSimulationIslandManagerMt::Island*>& m_islandsPtr;
- const btSimulationIslandManagerMt::SolverParams& m_solverParams;
-
- UpdateIslandDispatcher(btAlignedObjectArray<btSimulationIslandManagerMt::Island*>& islandsPtr, const btSimulationIslandManagerMt::SolverParams& solverParams)
- : m_islandsPtr(islandsPtr), m_solverParams(solverParams)
- {}
-
- void forLoop( int iBegin, int iEnd ) const BT_OVERRIDE
- {
- btConstraintSolver* solver = m_solverParams.m_solverPool;
- for ( int i = iBegin; i < iEnd; ++i )
- {
- btSimulationIslandManagerMt::Island* island = m_islandsPtr[ i ];
- btSimulationIslandManagerMt::solveIsland( solver, *island, m_solverParams );
- }
- }
-};
+ btAlignedObjectArray<btSimulationIslandManagerMt::Island*>& m_islandsPtr;
+ const btSimulationIslandManagerMt::SolverParams& m_solverParams;
+ UpdateIslandDispatcher(btAlignedObjectArray<btSimulationIslandManagerMt::Island*>& islandsPtr, const btSimulationIslandManagerMt::SolverParams& solverParams)
+ : m_islandsPtr(islandsPtr), m_solverParams(solverParams)
+ {
+ }
+
+ void forLoop(int iBegin, int iEnd) const BT_OVERRIDE
+ {
+ btConstraintSolver* solver = m_solverParams.m_solverPool;
+ for (int i = iBegin; i < iEnd; ++i)
+ {
+ btSimulationIslandManagerMt::Island* island = m_islandsPtr[i];
+ btSimulationIslandManagerMt::solveIsland(solver, *island, m_solverParams);
+ }
+ }
+};
-void btSimulationIslandManagerMt::parallelIslandDispatch( btAlignedObjectArray<Island*>* islandsPtr, const SolverParams& solverParams )
+void btSimulationIslandManagerMt::parallelIslandDispatch(btAlignedObjectArray<Island*>* islandsPtr, const SolverParams& solverParams)
{
- BT_PROFILE( "parallelIslandDispatch" );
- //
- // if there are islands with many contacts, it may be faster to submit these
- // large islands *serially* to a single parallel constraint solver, and then later
- // submit the remaining smaller islands in parallel to multiple sequential solvers.
- //
- // Some task schedulers do not deal well with nested parallelFor loops. One implementation
- // of OpenMP was actually slower than doing everything single-threaded. Intel TBB
- // on the other hand, seems to do a pretty respectable job with it.
- //
- // When solving islands in parallel, the worst case performance happens when there
- // is one very large island and then perhaps a smattering of very small
- // islands -- one worker thread takes the large island and the remaining workers
- // tear through the smaller islands and then sit idle waiting for the first worker
- // to finish. Solving islands in parallel works best when there are numerous small
- // islands, roughly equal in size.
- //
- // By contrast, the other approach -- the parallel constraint solver -- is only
- // able to deliver a worthwhile speedup when the island is large. For smaller islands,
- // it is difficult to extract a useful amount of parallelism -- the overhead of grouping
- // the constraints into batches and sending the batches to worker threads can nullify
- // any gains from parallelism.
- //
-
- UpdateIslandDispatcher dispatcher(*islandsPtr, solverParams);
- // We take advantage of the fact the islands are sorted in order of decreasing size
- int iBegin = 0;
- if (solverParams.m_solverMt)
- {
- while ( iBegin < islandsPtr->size() )
- {
- btSimulationIslandManagerMt::Island* island = ( *islandsPtr )[ iBegin ];
- if ( island->manifoldArray.size() < btSequentialImpulseConstraintSolverMt::s_minimumContactManifoldsForBatching )
- {
- // OK to submit the rest of the array in parallel
- break;
- }
- // serial dispatch to parallel solver for large islands (if any)
- solveIsland(solverParams.m_solverMt, *island, solverParams);
- ++iBegin;
- }
- }
- // parallel dispatch to sequential solvers for rest
- btParallelFor( iBegin, islandsPtr->size(), 1, dispatcher );
+ BT_PROFILE("parallelIslandDispatch");
+ //
+ // if there are islands with many contacts, it may be faster to submit these
+ // large islands *serially* to a single parallel constraint solver, and then later
+ // submit the remaining smaller islands in parallel to multiple sequential solvers.
+ //
+ // Some task schedulers do not deal well with nested parallelFor loops. One implementation
+ // of OpenMP was actually slower than doing everything single-threaded. Intel TBB
+ // on the other hand, seems to do a pretty respectable job with it.
+ //
+ // When solving islands in parallel, the worst case performance happens when there
+ // is one very large island and then perhaps a smattering of very small
+ // islands -- one worker thread takes the large island and the remaining workers
+ // tear through the smaller islands and then sit idle waiting for the first worker
+ // to finish. Solving islands in parallel works best when there are numerous small
+ // islands, roughly equal in size.
+ //
+ // By contrast, the other approach -- the parallel constraint solver -- is only
+ // able to deliver a worthwhile speedup when the island is large. For smaller islands,
+ // it is difficult to extract a useful amount of parallelism -- the overhead of grouping
+ // the constraints into batches and sending the batches to worker threads can nullify
+ // any gains from parallelism.
+ //
+
+ UpdateIslandDispatcher dispatcher(*islandsPtr, solverParams);
+ // We take advantage of the fact the islands are sorted in order of decreasing size
+ int iBegin = 0;
+ if (solverParams.m_solverMt)
+ {
+ while (iBegin < islandsPtr->size())
+ {
+ btSimulationIslandManagerMt::Island* island = (*islandsPtr)[iBegin];
+ if (island->manifoldArray.size() < btSequentialImpulseConstraintSolverMt::s_minimumContactManifoldsForBatching)
+ {
+ // OK to submit the rest of the array in parallel
+ break;
+ }
+ // serial dispatch to parallel solver for large islands (if any)
+ solveIsland(solverParams.m_solverMt, *island, solverParams);
+ ++iBegin;
+ }
+ }
+ // parallel dispatch to sequential solvers for rest
+ btParallelFor(iBegin, islandsPtr->size(), 1, dispatcher);
}
-
///@todo: this is random access, it can be walked 'cache friendly'!
-void btSimulationIslandManagerMt::buildAndProcessIslands( btDispatcher* dispatcher,
- btCollisionWorld* collisionWorld,
- btAlignedObjectArray<btTypedConstraint*>& constraints,
- const SolverParams& solverParams
- )
+void btSimulationIslandManagerMt::buildAndProcessIslands(btDispatcher* dispatcher,
+ btCollisionWorld* collisionWorld,
+ btAlignedObjectArray<btTypedConstraint*>& constraints,
+ const SolverParams& solverParams)
{
BT_PROFILE("buildAndProcessIslands");
btCollisionObjectArray& collisionObjects = collisionWorld->getCollisionObjectArray();
- buildIslands(dispatcher,collisionWorld);
+ buildIslands(dispatcher, collisionWorld);
- if(!getSplitIslands())
+ if (!getSplitIslands())
{
- btPersistentManifold** manifolds = dispatcher->getInternalManifoldPointer();
- int maxNumManifolds = dispatcher->getNumManifolds();
-
- for ( int i = 0; i < maxNumManifolds; i++ )
- {
- btPersistentManifold* manifold = manifolds[ i ];
-
- const btCollisionObject* colObj0 = static_cast<const btCollisionObject*>( manifold->getBody0() );
- const btCollisionObject* colObj1 = static_cast<const btCollisionObject*>( manifold->getBody1() );
-
- ///@todo: check sleeping conditions!
- if ( ( ( colObj0 ) && colObj0->getActivationState() != ISLAND_SLEEPING ) ||
- ( ( colObj1 ) && colObj1->getActivationState() != ISLAND_SLEEPING ) )
- {
-
- //kinematic objects don't merge islands, but wake up all connected objects
- if ( colObj0->isKinematicObject() && colObj0->getActivationState() != ISLAND_SLEEPING )
- {
- if ( colObj0->hasContactResponse() )
- colObj1->activate();
- }
- if ( colObj1->isKinematicObject() && colObj1->getActivationState() != ISLAND_SLEEPING )
- {
- if ( colObj1->hasContactResponse() )
- colObj0->activate();
- }
- }
- }
- btTypedConstraint** constraintsPtr = constraints.size() ? &constraints[ 0 ] : NULL;
- btConstraintSolver* solver = solverParams.m_solverMt ? solverParams.m_solverMt : solverParams.m_solverPool;
- solver->solveGroup(&collisionObjects[0],
- collisionObjects.size(),
- manifolds,
- maxNumManifolds,
- constraintsPtr,
- constraints.size(),
- *solverParams.m_solverInfo,
- solverParams.m_debugDrawer,
- solverParams.m_dispatcher
- );
+ btPersistentManifold** manifolds = dispatcher->getInternalManifoldPointer();
+ int maxNumManifolds = dispatcher->getNumManifolds();
+
+ for (int i = 0; i < maxNumManifolds; i++)
+ {
+ btPersistentManifold* manifold = manifolds[i];
+
+ const btCollisionObject* colObj0 = static_cast<const btCollisionObject*>(manifold->getBody0());
+ const btCollisionObject* colObj1 = static_cast<const btCollisionObject*>(manifold->getBody1());
+
+ ///@todo: check sleeping conditions!
+ if (((colObj0) && colObj0->getActivationState() != ISLAND_SLEEPING) ||
+ ((colObj1) && colObj1->getActivationState() != ISLAND_SLEEPING))
+ {
+ //kinematic objects don't merge islands, but wake up all connected objects
+ if (colObj0->isKinematicObject() && colObj0->getActivationState() != ISLAND_SLEEPING)
+ {
+ if (colObj0->hasContactResponse())
+ colObj1->activate();
+ }
+ if (colObj1->isKinematicObject() && colObj1->getActivationState() != ISLAND_SLEEPING)
+ {
+ if (colObj1->hasContactResponse())
+ colObj0->activate();
+ }
+ }
+ }
+ btTypedConstraint** constraintsPtr = constraints.size() ? &constraints[0] : NULL;
+ btConstraintSolver* solver = solverParams.m_solverMt ? solverParams.m_solverMt : solverParams.m_solverPool;
+ solver->solveGroup(&collisionObjects[0],
+ collisionObjects.size(),
+ manifolds,
+ maxNumManifolds,
+ constraintsPtr,
+ constraints.size(),
+ *solverParams.m_solverInfo,
+ solverParams.m_debugDrawer,
+ solverParams.m_dispatcher);
}
else
{
- initIslandPools();
-
- //traverse the simulation islands, and call the solver, unless all objects are sleeping/deactivated
- addBodiesToIslands( collisionWorld );
- addManifoldsToIslands( dispatcher );
- addConstraintsToIslands( constraints );
-
- // m_activeIslands array should now contain all non-sleeping Islands, and each Island should
- // have all the necessary bodies, manifolds and constraints.
-
- // if we want to merge islands with small batch counts,
- if ( m_minimumSolverBatchSize > 1 )
- {
- mergeIslands();
- }
- // dispatch islands to solver
- m_islandDispatch( &m_activeIslands, solverParams );
+ initIslandPools();
+
+ //traverse the simulation islands, and call the solver, unless all objects are sleeping/deactivated
+ addBodiesToIslands(collisionWorld);
+ addManifoldsToIslands(dispatcher);
+ addConstraintsToIslands(constraints);
+
+ // m_activeIslands array should now contain all non-sleeping Islands, and each Island should
+ // have all the necessary bodies, manifolds and constraints.
+
+ // if we want to merge islands with small batch counts,
+ if (m_minimumSolverBatchSize > 1)
+ {
+ mergeIslands();
+ }
+ // dispatch islands to solver
+ m_islandDispatch(&m_activeIslands, solverParams);
}
}
diff --git a/thirdparty/bullet/BulletDynamics/Dynamics/btSimulationIslandManagerMt.h b/thirdparty/bullet/BulletDynamics/Dynamics/btSimulationIslandManagerMt.h
index 563577a6f4..ab73a899f1 100644
--- a/thirdparty/bullet/BulletDynamics/Dynamics/btSimulationIslandManagerMt.h
+++ b/thirdparty/bullet/BulletDynamics/Dynamics/btSimulationIslandManagerMt.h
@@ -35,80 +35,78 @@ class btIDebugDraw;
class btSimulationIslandManagerMt : public btSimulationIslandManager
{
public:
- struct Island
- {
- // a simulation island consisting of bodies, manifolds and constraints,
- // to be passed into a constraint solver.
- btAlignedObjectArray<btCollisionObject*> bodyArray;
- btAlignedObjectArray<btPersistentManifold*> manifoldArray;
- btAlignedObjectArray<btTypedConstraint*> constraintArray;
- int id; // island id
- bool isSleeping;
+ struct Island
+ {
+ // a simulation island consisting of bodies, manifolds and constraints,
+ // to be passed into a constraint solver.
+ btAlignedObjectArray<btCollisionObject*> bodyArray;
+ btAlignedObjectArray<btPersistentManifold*> manifoldArray;
+ btAlignedObjectArray<btTypedConstraint*> 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);
+ 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<Island*>* islands, const SolverParams& solverParams);
+ static void serialIslandDispatch(btAlignedObjectArray<Island*>* islandsPtr, const SolverParams& solverParams);
+ static void parallelIslandDispatch(btAlignedObjectArray<Island*>* islandsPtr, const SolverParams& solverParams);
- typedef void( *IslandDispatchFunc ) ( btAlignedObjectArray<Island*>* islands, const SolverParams& solverParams );
- static void serialIslandDispatch( btAlignedObjectArray<Island*>* islandsPtr, const SolverParams& solverParams );
- static void parallelIslandDispatch( btAlignedObjectArray<Island*>* islandsPtr, const SolverParams& solverParams );
protected:
- btAlignedObjectArray<Island*> m_allocatedIslands; // owner of all Islands
- btAlignedObjectArray<Island*> m_activeIslands; // islands actively in use
- btAlignedObjectArray<Island*> m_freeIslands; // islands ready to be reused
- btAlignedObjectArray<Island*> m_lookupIslandFromId; // big lookup table to map islandId to Island pointer
- Island* m_batchIsland;
- int m_minimumSolverBatchSize;
- int m_batchIslandMinBodyCount;
- IslandDispatchFunc m_islandDispatch;
+ btAlignedObjectArray<Island*> m_allocatedIslands; // owner of all Islands
+ btAlignedObjectArray<Island*> m_activeIslands; // islands actively in use
+ btAlignedObjectArray<Island*> m_freeIslands; // islands ready to be reused
+ btAlignedObjectArray<Island*> 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<btTypedConstraint*>& constraints);
+ virtual void mergeIslands();
- 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<btTypedConstraint*>& constraints );
- virtual void mergeIslands();
-
public:
btSimulationIslandManagerMt();
virtual ~btSimulationIslandManagerMt();
- virtual void buildAndProcessIslands( btDispatcher* dispatcher,
- btCollisionWorld* collisionWorld,
- btAlignedObjectArray<btTypedConstraint*>& constraints,
- const SolverParams& solverParams
- );
+ virtual void buildAndProcessIslands(btDispatcher* dispatcher,
+ btCollisionWorld* collisionWorld,
+ btAlignedObjectArray<btTypedConstraint*>& constraints,
+ const SolverParams& solverParams);
- virtual void buildIslands(btDispatcher* dispatcher,btCollisionWorld* colWorld);
+ 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;
- }
+ 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
-
+#endif //BT_SIMULATION_ISLAND_MANAGER_H
diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBody.cpp b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBody.cpp
index 0e85b55728..53fc48d4b9 100644
--- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBody.cpp
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBody.cpp
@@ -21,7 +21,6 @@
*/
-
#include "btMultiBody.h"
#include "btMultiBodyLink.h"
#include "btMultiBodyLinkCollider.h"
@@ -29,28 +28,29 @@
#include "LinearMath/btTransformUtil.h"
#include "LinearMath/btSerializer.h"
//#include "Bullet3Common/b3Logging.h"
-// #define INCLUDE_GYRO_TERM
+// #define INCLUDE_GYRO_TERM
-///todo: determine if we need these options. If so, make a proper API, otherwise delete those globals
-bool gJointFeedbackInWorldSpace = false;
-bool gJointFeedbackInJointFrame = false;
-namespace {
- const btScalar SLEEP_EPSILON = btScalar(0.05); // this is a squared velocity (m^2 s^-2)
- const btScalar SLEEP_TIMEOUT = btScalar(2); // in seconds
+namespace
+{
+const btScalar SLEEP_EPSILON = btScalar(0.05); // this is a squared velocity (m^2 s^-2)
+const btScalar SLEEP_TIMEOUT = btScalar(2); // in seconds
+} // namespace
+
+void btMultiBody::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
+{
+ top_out = rotation_matrix * top_in;
+ bottom_out = -displacement.cross(top_out) + rotation_matrix * bottom_in;
}
-namespace {
- 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
- {
- top_out = rotation_matrix * top_in;
- bottom_out = -displacement.cross(top_out) + rotation_matrix * bottom_in;
- }
+namespace
+{
+
#if 0
void InverseSpatialTransform(const btMatrix3x3 &rotation_matrix,
@@ -83,60 +83,58 @@ namespace {
bottom_out = a_bottom.cross(b_top) + a_top.cross(b_bottom);
}
#endif
-
-}
+} // namespace
//
// Implementation of class btMultiBody
//
btMultiBody::btMultiBody(int n_links,
- btScalar mass,
- const btVector3 &inertia,
- bool fixedBase,
- bool canSleep,
- bool /*deprecatedUseMultiDof*/)
- :
- m_baseCollider(0),
- m_baseName(0),
- m_basePos(0,0,0),
- m_baseQuat(0, 0, 0, 1),
- m_baseMass(mass),
- m_baseInertia(inertia),
-
- m_fixedBase(fixedBase),
- m_awake(true),
- m_canSleep(canSleep),
- m_sleepTimer(0),
- m_userObjectPointer(0),
- m_userIndex2(-1),
- m_userIndex(-1),
- m_companionId(-1),
- m_linearDamping(0.04f),
- m_angularDamping(0.04f),
- m_useGyroTerm(true),
- m_maxAppliedImpulse(1000.f),
- m_maxCoordinateVelocity(100.f),
- m_hasSelfCollision(true),
- __posUpdated(false),
- m_dofCount(0),
- m_posVarCnt(0),
- m_useRK4(false),
- m_useGlobalVelocities(false),
- m_internalNeedsJointFeedback(false)
-{
- m_cachedInertiaTopLeft.setValue(0,0,0,0,0,0,0,0,0);
- m_cachedInertiaTopRight.setValue(0,0,0,0,0,0,0,0,0);
- m_cachedInertiaLowerLeft.setValue(0,0,0,0,0,0,0,0,0);
- m_cachedInertiaLowerRight.setValue(0,0,0,0,0,0,0,0,0);
- m_cachedInertiaValid=false;
+ btScalar mass,
+ const btVector3 &inertia,
+ bool fixedBase,
+ bool canSleep,
+ bool /*deprecatedUseMultiDof*/)
+ : m_baseCollider(0),
+ m_baseName(0),
+ m_basePos(0, 0, 0),
+ m_baseQuat(0, 0, 0, 1),
+ m_baseMass(mass),
+ m_baseInertia(inertia),
+
+ m_fixedBase(fixedBase),
+ m_awake(true),
+ m_canSleep(canSleep),
+ m_sleepTimer(0),
+ m_userObjectPointer(0),
+ m_userIndex2(-1),
+ m_userIndex(-1),
+ m_companionId(-1),
+ m_linearDamping(0.04f),
+ m_angularDamping(0.04f),
+ m_useGyroTerm(true),
+ m_maxAppliedImpulse(1000.f),
+ m_maxCoordinateVelocity(100.f),
+ m_hasSelfCollision(true),
+ __posUpdated(false),
+ m_dofCount(0),
+ m_posVarCnt(0),
+ m_useRK4(false),
+ m_useGlobalVelocities(false),
+ m_internalNeedsJointFeedback(false)
+{
+ m_cachedInertiaTopLeft.setValue(0, 0, 0, 0, 0, 0, 0, 0, 0);
+ m_cachedInertiaTopRight.setValue(0, 0, 0, 0, 0, 0, 0, 0, 0);
+ m_cachedInertiaLowerLeft.setValue(0, 0, 0, 0, 0, 0, 0, 0, 0);
+ m_cachedInertiaLowerRight.setValue(0, 0, 0, 0, 0, 0, 0, 0, 0);
+ m_cachedInertiaValid = false;
m_links.resize(n_links);
m_matrixBuf.resize(n_links + 1);
- m_baseForce.setValue(0, 0, 0);
- m_baseTorque.setValue(0, 0, 0);
+ m_baseForce.setValue(0, 0, 0);
+ m_baseTorque.setValue(0, 0, 0);
clearConstraintForces();
clearForcesAndTorques();
@@ -147,131 +145,125 @@ btMultiBody::~btMultiBody()
}
void btMultiBody::setupFixed(int i,
- btScalar mass,
- const btVector3 &inertia,
- int parent,
- const btQuaternion &rotParentToThis,
- const btVector3 &parentComToThisPivotOffset,
- const btVector3 &thisPivotToThisComOffset, bool /*deprecatedDisableParentCollision*/)
-{
-
+ btScalar mass,
+ const btVector3 &inertia,
+ int parent,
+ const btQuaternion &rotParentToThis,
+ const btVector3 &parentComToThisPivotOffset,
+ const btVector3 &thisPivotToThisComOffset, bool /*deprecatedDisableParentCollision*/)
+{
m_links[i].m_mass = mass;
- m_links[i].m_inertiaLocal = inertia;
- m_links[i].m_parent = parent;
- m_links[i].setAxisTop(0, 0., 0., 0.);
- m_links[i].setAxisBottom(0, btVector3(0,0,0));
- m_links[i].m_zeroRotParentToThis = rotParentToThis;
+ m_links[i].m_inertiaLocal = inertia;
+ m_links[i].m_parent = parent;
+ m_links[i].setAxisTop(0, 0., 0., 0.);
+ m_links[i].setAxisBottom(0, btVector3(0, 0, 0));
+ m_links[i].m_zeroRotParentToThis = rotParentToThis;
m_links[i].m_dVector = thisPivotToThisComOffset;
- m_links[i].m_eVector = parentComToThisPivotOffset;
+ m_links[i].m_eVector = parentComToThisPivotOffset;
m_links[i].m_jointType = btMultibodyLink::eFixed;
m_links[i].m_dofCount = 0;
m_links[i].m_posVarCount = 0;
- m_links[i].m_flags |=BT_MULTIBODYLINKFLAGS_DISABLE_PARENT_COLLISION;
-
+ m_links[i].m_flags |= BT_MULTIBODYLINKFLAGS_DISABLE_PARENT_COLLISION;
+
m_links[i].updateCacheMultiDof();
updateLinksDofOffsets();
-
}
-
void btMultiBody::setupPrismatic(int i,
- btScalar mass,
- const btVector3 &inertia,
- int parent,
- const btQuaternion &rotParentToThis,
- const btVector3 &jointAxis,
- const btVector3 &parentComToThisPivotOffset,
- const btVector3 &thisPivotToThisComOffset,
- bool disableParentCollision)
+ btScalar mass,
+ const btVector3 &inertia,
+ int parent,
+ const btQuaternion &rotParentToThis,
+ const btVector3 &jointAxis,
+ const btVector3 &parentComToThisPivotOffset,
+ const btVector3 &thisPivotToThisComOffset,
+ bool disableParentCollision)
{
m_dofCount += 1;
m_posVarCnt += 1;
-
- m_links[i].m_mass = mass;
- m_links[i].m_inertiaLocal = inertia;
- m_links[i].m_parent = parent;
- m_links[i].m_zeroRotParentToThis = rotParentToThis;
- m_links[i].setAxisTop(0, 0., 0., 0.);
- m_links[i].setAxisBottom(0, jointAxis);
- m_links[i].m_eVector = parentComToThisPivotOffset;
+
+ m_links[i].m_mass = mass;
+ m_links[i].m_inertiaLocal = inertia;
+ m_links[i].m_parent = parent;
+ m_links[i].m_zeroRotParentToThis = rotParentToThis;
+ m_links[i].setAxisTop(0, 0., 0., 0.);
+ m_links[i].setAxisBottom(0, jointAxis);
+ m_links[i].m_eVector = parentComToThisPivotOffset;
m_links[i].m_dVector = thisPivotToThisComOffset;
- m_links[i].m_cachedRotParentToThis = rotParentToThis;
+ m_links[i].m_cachedRotParentToThis = rotParentToThis;
m_links[i].m_jointType = btMultibodyLink::ePrismatic;
m_links[i].m_dofCount = 1;
- m_links[i].m_posVarCount = 1;
+ m_links[i].m_posVarCount = 1;
m_links[i].m_jointPos[0] = 0.f;
m_links[i].m_jointTorque[0] = 0.f;
if (disableParentCollision)
- m_links[i].m_flags |=BT_MULTIBODYLINKFLAGS_DISABLE_PARENT_COLLISION;
+ m_links[i].m_flags |= BT_MULTIBODYLINKFLAGS_DISABLE_PARENT_COLLISION;
//
-
+
m_links[i].updateCacheMultiDof();
-
+
updateLinksDofOffsets();
}
void btMultiBody::setupRevolute(int i,
- btScalar mass,
- const btVector3 &inertia,
- int parent,
- const btQuaternion &rotParentToThis,
- const btVector3 &jointAxis,
- const btVector3 &parentComToThisPivotOffset,
- const btVector3 &thisPivotToThisComOffset,
- bool disableParentCollision)
+ btScalar mass,
+ const btVector3 &inertia,
+ int parent,
+ const btQuaternion &rotParentToThis,
+ const btVector3 &jointAxis,
+ const btVector3 &parentComToThisPivotOffset,
+ const btVector3 &thisPivotToThisComOffset,
+ bool disableParentCollision)
{
m_dofCount += 1;
m_posVarCnt += 1;
-
- m_links[i].m_mass = mass;
- m_links[i].m_inertiaLocal = inertia;
- m_links[i].m_parent = parent;
- m_links[i].m_zeroRotParentToThis = rotParentToThis;
- m_links[i].setAxisTop(0, jointAxis);
- m_links[i].setAxisBottom(0, jointAxis.cross(thisPivotToThisComOffset));
- m_links[i].m_dVector = thisPivotToThisComOffset;
- m_links[i].m_eVector = parentComToThisPivotOffset;
+
+ m_links[i].m_mass = mass;
+ m_links[i].m_inertiaLocal = inertia;
+ m_links[i].m_parent = parent;
+ m_links[i].m_zeroRotParentToThis = rotParentToThis;
+ m_links[i].setAxisTop(0, jointAxis);
+ m_links[i].setAxisBottom(0, jointAxis.cross(thisPivotToThisComOffset));
+ m_links[i].m_dVector = thisPivotToThisComOffset;
+ m_links[i].m_eVector = parentComToThisPivotOffset;
m_links[i].m_jointType = btMultibodyLink::eRevolute;
m_links[i].m_dofCount = 1;
- m_links[i].m_posVarCount = 1;
+ m_links[i].m_posVarCount = 1;
m_links[i].m_jointPos[0] = 0.f;
m_links[i].m_jointTorque[0] = 0.f;
if (disableParentCollision)
- m_links[i].m_flags |=BT_MULTIBODYLINKFLAGS_DISABLE_PARENT_COLLISION;
- //
+ m_links[i].m_flags |= BT_MULTIBODYLINKFLAGS_DISABLE_PARENT_COLLISION;
+ //
m_links[i].updateCacheMultiDof();
//
updateLinksDofOffsets();
}
-
-
void btMultiBody::setupSpherical(int i,
- btScalar mass,
- const btVector3 &inertia,
- int parent,
- const btQuaternion &rotParentToThis,
- const btVector3 &parentComToThisPivotOffset,
- const btVector3 &thisPivotToThisComOffset,
- bool disableParentCollision)
-{
-
+ btScalar mass,
+ const btVector3 &inertia,
+ int parent,
+ const btQuaternion &rotParentToThis,
+ const btVector3 &parentComToThisPivotOffset,
+ const btVector3 &thisPivotToThisComOffset,
+ bool disableParentCollision)
+{
m_dofCount += 3;
m_posVarCnt += 4;
m_links[i].m_mass = mass;
- m_links[i].m_inertiaLocal = inertia;
- m_links[i].m_parent = parent;
- m_links[i].m_zeroRotParentToThis = rotParentToThis;
- m_links[i].m_dVector = thisPivotToThisComOffset;
- m_links[i].m_eVector = parentComToThisPivotOffset;
+ m_links[i].m_inertiaLocal = inertia;
+ m_links[i].m_parent = parent;
+ m_links[i].m_zeroRotParentToThis = rotParentToThis;
+ m_links[i].m_dVector = thisPivotToThisComOffset;
+ m_links[i].m_eVector = parentComToThisPivotOffset;
m_links[i].m_jointType = btMultibodyLink::eSpherical;
m_links[i].m_dofCount = 3;
@@ -282,281 +274,297 @@ void btMultiBody::setupSpherical(int i,
m_links[i].setAxisBottom(0, m_links[i].getAxisTop(0).cross(thisPivotToThisComOffset));
m_links[i].setAxisBottom(1, m_links[i].getAxisTop(1).cross(thisPivotToThisComOffset));
m_links[i].setAxisBottom(2, m_links[i].getAxisTop(2).cross(thisPivotToThisComOffset));
- m_links[i].m_jointPos[0] = m_links[i].m_jointPos[1] = m_links[i].m_jointPos[2] = 0.f; m_links[i].m_jointPos[3] = 1.f;
+ m_links[i].m_jointPos[0] = m_links[i].m_jointPos[1] = m_links[i].m_jointPos[2] = 0.f;
+ m_links[i].m_jointPos[3] = 1.f;
m_links[i].m_jointTorque[0] = m_links[i].m_jointTorque[1] = m_links[i].m_jointTorque[2] = 0.f;
-
if (disableParentCollision)
- m_links[i].m_flags |=BT_MULTIBODYLINKFLAGS_DISABLE_PARENT_COLLISION;
+ m_links[i].m_flags |= BT_MULTIBODYLINKFLAGS_DISABLE_PARENT_COLLISION;
//
- m_links[i].updateCacheMultiDof();
+ m_links[i].updateCacheMultiDof();
//
updateLinksDofOffsets();
}
void btMultiBody::setupPlanar(int i,
- btScalar mass,
- const btVector3 &inertia,
- int parent,
- const btQuaternion &rotParentToThis,
- const btVector3 &rotationAxis,
- const btVector3 &parentComToThisComOffset,
- bool disableParentCollision)
-{
-
+ btScalar mass,
+ const btVector3 &inertia,
+ int parent,
+ const btQuaternion &rotParentToThis,
+ const btVector3 &rotationAxis,
+ const btVector3 &parentComToThisComOffset,
+ bool disableParentCollision)
+{
m_dofCount += 3;
m_posVarCnt += 3;
m_links[i].m_mass = mass;
- m_links[i].m_inertiaLocal = inertia;
- m_links[i].m_parent = parent;
- m_links[i].m_zeroRotParentToThis = rotParentToThis;
+ m_links[i].m_inertiaLocal = inertia;
+ m_links[i].m_parent = parent;
+ m_links[i].m_zeroRotParentToThis = rotParentToThis;
m_links[i].m_dVector.setZero();
- m_links[i].m_eVector = parentComToThisComOffset;
+ m_links[i].m_eVector = parentComToThisComOffset;
//
btVector3 vecNonParallelToRotAxis(1, 0, 0);
- if(rotationAxis.normalized().dot(vecNonParallelToRotAxis) > 0.999)
+ if (rotationAxis.normalized().dot(vecNonParallelToRotAxis) > 0.999)
vecNonParallelToRotAxis.setValue(0, 1, 0);
//
m_links[i].m_jointType = btMultibodyLink::ePlanar;
m_links[i].m_dofCount = 3;
m_links[i].m_posVarCount = 3;
- btVector3 n=rotationAxis.normalized();
- m_links[i].setAxisTop(0, n[0],n[1],n[2]);
- m_links[i].setAxisTop(1,0,0,0);
- m_links[i].setAxisTop(2,0,0,0);
- m_links[i].setAxisBottom(0,0,0,0);
+ btVector3 n = rotationAxis.normalized();
+ m_links[i].setAxisTop(0, n[0], n[1], n[2]);
+ m_links[i].setAxisTop(1, 0, 0, 0);
+ m_links[i].setAxisTop(2, 0, 0, 0);
+ m_links[i].setAxisBottom(0, 0, 0, 0);
btVector3 cr = m_links[i].getAxisTop(0).cross(vecNonParallelToRotAxis);
- m_links[i].setAxisBottom(1,cr[0],cr[1],cr[2]);
+ m_links[i].setAxisBottom(1, cr[0], cr[1], cr[2]);
cr = m_links[i].getAxisBottom(1).cross(m_links[i].getAxisTop(0));
- m_links[i].setAxisBottom(2,cr[0],cr[1],cr[2]);
+ m_links[i].setAxisBottom(2, cr[0], cr[1], cr[2]);
m_links[i].m_jointPos[0] = m_links[i].m_jointPos[1] = m_links[i].m_jointPos[2] = 0.f;
m_links[i].m_jointTorque[0] = m_links[i].m_jointTorque[1] = m_links[i].m_jointTorque[2] = 0.f;
if (disableParentCollision)
- m_links[i].m_flags |=BT_MULTIBODYLINKFLAGS_DISABLE_PARENT_COLLISION;
- //
+ m_links[i].m_flags |= BT_MULTIBODYLINKFLAGS_DISABLE_PARENT_COLLISION;
+ //
m_links[i].updateCacheMultiDof();
//
updateLinksDofOffsets();
+
+ m_links[i].setAxisBottom(1, m_links[i].getAxisBottom(1).normalized());
+ m_links[i].setAxisBottom(2, m_links[i].getAxisBottom(2).normalized());
}
void btMultiBody::finalizeMultiDof()
{
m_deltaV.resize(0);
m_deltaV.resize(6 + m_dofCount);
- m_realBuf.resize(6 + m_dofCount + m_dofCount*m_dofCount + 6 + m_dofCount); //m_dofCount for joint-space vels + m_dofCount^2 for "D" matrices + delta-pos vector (6 base "vels" + joint "vels")
- m_vectorBuf.resize(2 * m_dofCount); //two 3-vectors (i.e. one six-vector) for each system dof ("h" matrices)
- for (int i=0;i<m_vectorBuf.size();i++)
+ m_realBuf.resize(6 + m_dofCount + m_dofCount * m_dofCount + 6 + m_dofCount); //m_dofCount for joint-space vels + m_dofCount^2 for "D" matrices + delta-pos vector (6 base "vels" + joint "vels")
+ m_vectorBuf.resize(2 * m_dofCount); //two 3-vectors (i.e. one six-vector) for each system dof ("h" matrices)
+ for (int i = 0; i < m_vectorBuf.size(); i++)
{
- m_vectorBuf[i].setValue(0,0,0);
+ m_vectorBuf[i].setValue(0, 0, 0);
}
updateLinksDofOffsets();
}
-
+
int btMultiBody::getParent(int i) const
{
- return m_links[i].m_parent;
+ return m_links[i].m_parent;
}
btScalar btMultiBody::getLinkMass(int i) const
{
- return m_links[i].m_mass;
+ return m_links[i].m_mass;
}
-const btVector3 & btMultiBody::getLinkInertia(int i) const
+const btVector3 &btMultiBody::getLinkInertia(int i) const
{
- return m_links[i].m_inertiaLocal;
+ return m_links[i].m_inertiaLocal;
}
btScalar btMultiBody::getJointPos(int i) const
{
- return m_links[i].m_jointPos[0];
+ return m_links[i].m_jointPos[0];
}
btScalar btMultiBody::getJointVel(int i) const
{
- return m_realBuf[6 + m_links[i].m_dofOffset];
+ return m_realBuf[6 + m_links[i].m_dofOffset];
}
-btScalar * btMultiBody::getJointPosMultiDof(int i)
+btScalar *btMultiBody::getJointPosMultiDof(int i)
{
return &m_links[i].m_jointPos[0];
}
-btScalar * btMultiBody::getJointVelMultiDof(int i)
+btScalar *btMultiBody::getJointVelMultiDof(int i)
{
return &m_realBuf[6 + m_links[i].m_dofOffset];
}
-const btScalar * btMultiBody::getJointPosMultiDof(int i) const
+const btScalar *btMultiBody::getJointPosMultiDof(int i) const
{
return &m_links[i].m_jointPos[0];
}
-const btScalar * btMultiBody::getJointVelMultiDof(int i) const
+const btScalar *btMultiBody::getJointVelMultiDof(int i) const
{
return &m_realBuf[6 + m_links[i].m_dofOffset];
}
-
void btMultiBody::setJointPos(int i, btScalar q)
{
- m_links[i].m_jointPos[0] = q;
- m_links[i].updateCacheMultiDof();
+ m_links[i].m_jointPos[0] = q;
+ m_links[i].updateCacheMultiDof();
+}
+
+
+void btMultiBody::setJointPosMultiDof(int i, const double *q)
+{
+ for (int pos = 0; pos < m_links[i].m_posVarCount; ++pos)
+ m_links[i].m_jointPos[pos] = (btScalar)q[pos];
+
+ m_links[i].updateCacheMultiDof();
}
-void btMultiBody::setJointPosMultiDof(int i, btScalar *q)
+void btMultiBody::setJointPosMultiDof(int i, const float *q)
{
- for(int pos = 0; pos < m_links[i].m_posVarCount; ++pos)
- m_links[i].m_jointPos[pos] = q[pos];
+ for (int pos = 0; pos < m_links[i].m_posVarCount; ++pos)
+ m_links[i].m_jointPos[pos] = (btScalar)q[pos];
- m_links[i].updateCacheMultiDof();
+ m_links[i].updateCacheMultiDof();
}
+
+
void btMultiBody::setJointVel(int i, btScalar qdot)
{
- m_realBuf[6 + m_links[i].m_dofOffset] = qdot;
+ m_realBuf[6 + m_links[i].m_dofOffset] = qdot;
}
-void btMultiBody::setJointVelMultiDof(int i, btScalar *qdot)
+void btMultiBody::setJointVelMultiDof(int i, const double *qdot)
{
- for(int dof = 0; dof < m_links[i].m_dofCount; ++dof)
- m_realBuf[6 + m_links[i].m_dofOffset + dof] = qdot[dof];
+ for (int dof = 0; dof < m_links[i].m_dofCount; ++dof)
+ m_realBuf[6 + m_links[i].m_dofOffset + dof] = (btScalar)qdot[dof];
}
-const btVector3 & btMultiBody::getRVector(int i) const
+void btMultiBody::setJointVelMultiDof(int i, const float* qdot)
{
- return m_links[i].m_cachedRVector;
+ for (int dof = 0; dof < m_links[i].m_dofCount; ++dof)
+ m_realBuf[6 + m_links[i].m_dofOffset + dof] = (btScalar)qdot[dof];
}
-const btQuaternion & btMultiBody::getParentToLocalRot(int i) const
+const btVector3 &btMultiBody::getRVector(int i) const
{
- return m_links[i].m_cachedRotParentToThis;
+ return m_links[i].m_cachedRVector;
+}
+
+const btQuaternion &btMultiBody::getParentToLocalRot(int i) const
+{
+ return m_links[i].m_cachedRotParentToThis;
}
btVector3 btMultiBody::localPosToWorld(int i, const btVector3 &local_pos) const
{
- btAssert(i>=-1);
- btAssert(i<m_links.size());
- if ((i<-1) || (i>=m_links.size()))
+ btAssert(i >= -1);
+ btAssert(i < m_links.size());
+ if ((i < -1) || (i >= m_links.size()))
{
- return btVector3(SIMD_INFINITY,SIMD_INFINITY,SIMD_INFINITY);
+ return btVector3(SIMD_INFINITY, SIMD_INFINITY, SIMD_INFINITY);
}
- btVector3 result = local_pos;
- while (i != -1) {
- // 'result' is in frame i. transform it to frame parent(i)
- result += getRVector(i);
- result = quatRotate(getParentToLocalRot(i).inverse(),result);
- i = getParent(i);
- }
+ btVector3 result = local_pos;
+ while (i != -1)
+ {
+ // 'result' is in frame i. transform it to frame parent(i)
+ result += getRVector(i);
+ result = quatRotate(getParentToLocalRot(i).inverse(), result);
+ i = getParent(i);
+ }
- // 'result' is now in the base frame. transform it to world frame
- result = quatRotate(getWorldToBaseRot().inverse() ,result);
- result += getBasePos();
+ // 'result' is now in the base frame. transform it to world frame
+ result = quatRotate(getWorldToBaseRot().inverse(), result);
+ result += getBasePos();
- return result;
+ return result;
}
btVector3 btMultiBody::worldPosToLocal(int i, const btVector3 &world_pos) const
{
- btAssert(i>=-1);
- btAssert(i<m_links.size());
- if ((i<-1) || (i>=m_links.size()))
+ btAssert(i >= -1);
+ btAssert(i < m_links.size());
+ if ((i < -1) || (i >= m_links.size()))
{
- return btVector3(SIMD_INFINITY,SIMD_INFINITY,SIMD_INFINITY);
+ return btVector3(SIMD_INFINITY, SIMD_INFINITY, SIMD_INFINITY);
}
- if (i == -1) {
- // world to base
- return quatRotate(getWorldToBaseRot(),(world_pos - getBasePos()));
- } else {
- // find position in parent frame, then transform to current frame
- return quatRotate(getParentToLocalRot(i),worldPosToLocal(getParent(i), world_pos)) - getRVector(i);
- }
+ if (i == -1)
+ {
+ // world to base
+ return quatRotate(getWorldToBaseRot(), (world_pos - getBasePos()));
+ }
+ else
+ {
+ // find position in parent frame, then transform to current frame
+ return quatRotate(getParentToLocalRot(i), worldPosToLocal(getParent(i), world_pos)) - getRVector(i);
+ }
}
btVector3 btMultiBody::localDirToWorld(int i, const btVector3 &local_dir) const
{
- btAssert(i>=-1);
- btAssert(i<m_links.size());
- if ((i<-1) || (i>=m_links.size()))
+ btAssert(i >= -1);
+ btAssert(i < m_links.size());
+ if ((i < -1) || (i >= m_links.size()))
{
- return btVector3(SIMD_INFINITY,SIMD_INFINITY,SIMD_INFINITY);
+ return btVector3(SIMD_INFINITY, SIMD_INFINITY, SIMD_INFINITY);
}
-
- btVector3 result = local_dir;
- while (i != -1) {
- result = quatRotate(getParentToLocalRot(i).inverse() , result);
- i = getParent(i);
- }
- result = quatRotate(getWorldToBaseRot().inverse() , result);
- return result;
+ btVector3 result = local_dir;
+ while (i != -1)
+ {
+ result = quatRotate(getParentToLocalRot(i).inverse(), result);
+ i = getParent(i);
+ }
+ result = quatRotate(getWorldToBaseRot().inverse(), result);
+ return result;
}
btVector3 btMultiBody::worldDirToLocal(int i, const btVector3 &world_dir) const
{
- btAssert(i>=-1);
- btAssert(i<m_links.size());
- if ((i<-1) || (i>=m_links.size()))
+ btAssert(i >= -1);
+ btAssert(i < m_links.size());
+ if ((i < -1) || (i >= m_links.size()))
{
- return btVector3(SIMD_INFINITY,SIMD_INFINITY,SIMD_INFINITY);
+ return btVector3(SIMD_INFINITY, SIMD_INFINITY, SIMD_INFINITY);
}
- if (i == -1) {
- return quatRotate(getWorldToBaseRot(), world_dir);
- } else {
- return quatRotate(getParentToLocalRot(i) ,worldDirToLocal(getParent(i), world_dir));
- }
+ if (i == -1)
+ {
+ return quatRotate(getWorldToBaseRot(), world_dir);
+ }
+ else
+ {
+ return quatRotate(getParentToLocalRot(i), worldDirToLocal(getParent(i), world_dir));
+ }
}
btMatrix3x3 btMultiBody::localFrameToWorld(int i, const btMatrix3x3 &local_frame) const
{
- btMatrix3x3 result = local_frame;
- btVector3 frameInWorld0 = localDirToWorld(i, local_frame.getColumn(0));
- btVector3 frameInWorld1 = localDirToWorld(i, local_frame.getColumn(1));
- btVector3 frameInWorld2 = localDirToWorld(i, local_frame.getColumn(2));
- result.setValue(frameInWorld0[0], frameInWorld1[0], frameInWorld2[0], frameInWorld0[1], frameInWorld1[1], frameInWorld2[1], frameInWorld0[2], frameInWorld1[2], frameInWorld2[2]);
- return result;
+ btMatrix3x3 result = local_frame;
+ btVector3 frameInWorld0 = localDirToWorld(i, local_frame.getColumn(0));
+ btVector3 frameInWorld1 = localDirToWorld(i, local_frame.getColumn(1));
+ btVector3 frameInWorld2 = localDirToWorld(i, local_frame.getColumn(2));
+ result.setValue(frameInWorld0[0], frameInWorld1[0], frameInWorld2[0], frameInWorld0[1], frameInWorld1[1], frameInWorld2[1], frameInWorld0[2], frameInWorld1[2], frameInWorld2[2]);
+ return result;
}
void btMultiBody::compTreeLinkVelocities(btVector3 *omega, btVector3 *vel) const
{
int num_links = getNumLinks();
- // Calculates the velocities of each link (and the base) in its local frame
- omega[0] = quatRotate(m_baseQuat ,getBaseOmega());
- vel[0] = quatRotate(m_baseQuat ,getBaseVel());
-
- for (int i = 0; i < num_links; ++i)
+ // Calculates the velocities of each link (and the base) in its local frame
+ const btQuaternion& base_rot = getWorldToBaseRot();
+ omega[0] = quatRotate(base_rot, getBaseOmega());
+ vel[0] = quatRotate(base_rot, getBaseVel());
+
+ for (int i = 0; i < num_links; ++i)
{
- const int parent = m_links[i].m_parent;
+ const btMultibodyLink& link = getLink(i);
+ const int parent = link.m_parent;
- // transform parent vel into this frame, store in omega[i+1], vel[i+1]
- SpatialTransform(btMatrix3x3(m_links[i].m_cachedRotParentToThis), m_links[i].m_cachedRVector,
- omega[parent+1], vel[parent+1],
- omega[i+1], vel[i+1]);
+ // transform parent vel into this frame, store in omega[i+1], vel[i+1]
+ spatialTransform(btMatrix3x3(link.m_cachedRotParentToThis), link.m_cachedRVector,
+ omega[parent + 1], vel[parent + 1],
+ omega[i + 1], vel[i + 1]);
- // now add qidot * shat_i
- //only supported for revolute/prismatic joints, todo: spherical and planar joints
- switch(m_links[i].m_jointType)
+ // now add qidot * shat_i
+ const btScalar* jointVel = getJointVelMultiDof(i);
+ for (int dof = 0; dof < link.m_dofCount; ++dof)
{
- case btMultibodyLink::ePrismatic:
- case btMultibodyLink::eRevolute:
- {
- btVector3 axisTop = m_links[i].getAxisTop(0);
- btVector3 axisBottom = m_links[i].getAxisBottom(0);
- btScalar jointVel = getJointVel(i);
- omega[i+1] += jointVel * axisTop;
- vel[i+1] += jointVel * axisBottom;
- break;
- }
- default:
- {
- }
+ omega[i + 1] += jointVel[dof] * link.getAxisTop(dof);
+ vel[i + 1] += jointVel[dof] * link.getAxisBottom(dof);
}
}
}
@@ -564,41 +572,48 @@ void btMultiBody::compTreeLinkVelocities(btVector3 *omega, btVector3 *vel) const
btScalar btMultiBody::getKineticEnergy() const
{
int num_links = getNumLinks();
- // TODO: would be better not to allocate memory here
- btAlignedObjectArray<btVector3> omega;omega.resize(num_links+1);
- btAlignedObjectArray<btVector3> vel;vel.resize(num_links+1);
- compTreeLinkVelocities(&omega[0], &vel[0]);
-
- // we will do the factor of 0.5 at the end
- btScalar result = m_baseMass * vel[0].dot(vel[0]);
- result += omega[0].dot(m_baseInertia * omega[0]);
-
- for (int i = 0; i < num_links; ++i) {
- result += m_links[i].m_mass * vel[i+1].dot(vel[i+1]);
- result += omega[i+1].dot(m_links[i].m_inertiaLocal * omega[i+1]);
- }
+ // TODO: would be better not to allocate memory here
+ btAlignedObjectArray<btVector3> omega;
+ omega.resize(num_links + 1);
+ btAlignedObjectArray<btVector3> vel;
+ vel.resize(num_links + 1);
+ compTreeLinkVelocities(&omega[0], &vel[0]);
+
+ // we will do the factor of 0.5 at the end
+ btScalar result = m_baseMass * vel[0].dot(vel[0]);
+ result += omega[0].dot(m_baseInertia * omega[0]);
+
+ for (int i = 0; i < num_links; ++i)
+ {
+ result += m_links[i].m_mass * vel[i + 1].dot(vel[i + 1]);
+ result += omega[i + 1].dot(m_links[i].m_inertiaLocal * omega[i + 1]);
+ }
- return 0.5f * result;
+ return 0.5f * result;
}
btVector3 btMultiBody::getAngularMomentum() const
{
int num_links = getNumLinks();
- // TODO: would be better not to allocate memory here
- btAlignedObjectArray<btVector3> omega;omega.resize(num_links+1);
- btAlignedObjectArray<btVector3> vel;vel.resize(num_links+1);
- btAlignedObjectArray<btQuaternion> rot_from_world;rot_from_world.resize(num_links+1);
- compTreeLinkVelocities(&omega[0], &vel[0]);
-
- rot_from_world[0] = m_baseQuat;
- btVector3 result = quatRotate(rot_from_world[0].inverse() , (m_baseInertia * omega[0]));
-
- for (int i = 0; i < num_links; ++i) {
- rot_from_world[i+1] = m_links[i].m_cachedRotParentToThis * rot_from_world[m_links[i].m_parent+1];
- result += (quatRotate(rot_from_world[i+1].inverse() , (m_links[i].m_inertiaLocal * omega[i+1])));
- }
+ // TODO: would be better not to allocate memory here
+ btAlignedObjectArray<btVector3> omega;
+ omega.resize(num_links + 1);
+ btAlignedObjectArray<btVector3> vel;
+ vel.resize(num_links + 1);
+ btAlignedObjectArray<btQuaternion> rot_from_world;
+ rot_from_world.resize(num_links + 1);
+ compTreeLinkVelocities(&omega[0], &vel[0]);
+
+ rot_from_world[0] = m_baseQuat;
+ btVector3 result = quatRotate(rot_from_world[0].inverse(), (m_baseInertia * omega[0]));
+
+ for (int i = 0; i < num_links; ++i)
+ {
+ rot_from_world[i + 1] = m_links[i].m_cachedRotParentToThis * rot_from_world[m_links[i].m_parent + 1];
+ result += (quatRotate(rot_from_world[i + 1].inverse(), (m_links[i].m_inertiaLocal * omega[i + 1])));
+ }
- return result;
+ return result;
}
void btMultiBody::clearConstraintForces()
@@ -606,57 +621,55 @@ void btMultiBody::clearConstraintForces()
m_baseConstraintForce.setValue(0, 0, 0);
m_baseConstraintTorque.setValue(0, 0, 0);
-
- for (int i = 0; i < getNumLinks(); ++i) {
- m_links[i].m_appliedConstraintForce.setValue(0, 0, 0);
- m_links[i].m_appliedConstraintTorque.setValue(0, 0, 0);
- }
+ for (int i = 0; i < getNumLinks(); ++i)
+ {
+ m_links[i].m_appliedConstraintForce.setValue(0, 0, 0);
+ m_links[i].m_appliedConstraintTorque.setValue(0, 0, 0);
+ }
}
void btMultiBody::clearForcesAndTorques()
{
- m_baseForce.setValue(0, 0, 0);
- m_baseTorque.setValue(0, 0, 0);
+ m_baseForce.setValue(0, 0, 0);
+ m_baseTorque.setValue(0, 0, 0);
-
- for (int i = 0; i < getNumLinks(); ++i) {
- m_links[i].m_appliedForce.setValue(0, 0, 0);
- m_links[i].m_appliedTorque.setValue(0, 0, 0);
+ for (int i = 0; i < getNumLinks(); ++i)
+ {
+ m_links[i].m_appliedForce.setValue(0, 0, 0);
+ m_links[i].m_appliedTorque.setValue(0, 0, 0);
m_links[i].m_jointTorque[0] = m_links[i].m_jointTorque[1] = m_links[i].m_jointTorque[2] = m_links[i].m_jointTorque[3] = m_links[i].m_jointTorque[4] = m_links[i].m_jointTorque[5] = 0.f;
- }
+ }
}
void btMultiBody::clearVelocities()
{
- for (int i = 0; i < 6 + getNumDofs(); ++i)
+ for (int i = 0; i < 6 + getNumDofs(); ++i)
{
m_realBuf[i] = 0.f;
}
}
void btMultiBody::addLinkForce(int i, const btVector3 &f)
{
- m_links[i].m_appliedForce += f;
+ m_links[i].m_appliedForce += f;
}
void btMultiBody::addLinkTorque(int i, const btVector3 &t)
{
- m_links[i].m_appliedTorque += t;
+ m_links[i].m_appliedTorque += t;
}
void btMultiBody::addLinkConstraintForce(int i, const btVector3 &f)
{
- m_links[i].m_appliedConstraintForce += f;
+ m_links[i].m_appliedConstraintForce += f;
}
void btMultiBody::addLinkConstraintTorque(int i, const btVector3 &t)
{
- m_links[i].m_appliedConstraintTorque += t;
+ m_links[i].m_appliedConstraintTorque += t;
}
-
-
void btMultiBody::addJointTorque(int i, btScalar Q)
{
- m_links[i].m_jointTorque[0] += Q;
+ m_links[i].m_jointTorque[0] += Q;
}
void btMultiBody::addJointTorqueMultiDof(int i, int dof, btScalar Q)
@@ -666,70 +679,72 @@ void btMultiBody::addJointTorqueMultiDof(int i, int dof, btScalar Q)
void btMultiBody::addJointTorqueMultiDof(int i, const btScalar *Q)
{
- for(int dof = 0; dof < m_links[i].m_dofCount; ++dof)
+ for (int dof = 0; dof < m_links[i].m_dofCount; ++dof)
m_links[i].m_jointTorque[dof] = Q[dof];
}
-const btVector3 & btMultiBody::getLinkForce(int i) const
+const btVector3 &btMultiBody::getLinkForce(int i) const
{
- return m_links[i].m_appliedForce;
+ return m_links[i].m_appliedForce;
}
-const btVector3 & btMultiBody::getLinkTorque(int i) const
+const btVector3 &btMultiBody::getLinkTorque(int i) const
{
- return m_links[i].m_appliedTorque;
+ return m_links[i].m_appliedTorque;
}
btScalar btMultiBody::getJointTorque(int i) const
{
- return m_links[i].m_jointTorque[0];
+ return m_links[i].m_jointTorque[0];
}
-btScalar * btMultiBody::getJointTorqueMultiDof(int i)
+btScalar *btMultiBody::getJointTorqueMultiDof(int i)
{
- return &m_links[i].m_jointTorque[0];
+ return &m_links[i].m_jointTorque[0];
}
-inline btMatrix3x3 outerProduct(const btVector3& v0, const btVector3& v1) //renamed it from vecMulVecTranspose (http://en.wikipedia.org/wiki/Outer_product); maybe it should be moved to btVector3 like dot and cross?
-{
- btVector3 row0 = btVector3(
- v0.x() * v1.x(),
- v0.x() * v1.y(),
- v0.x() * v1.z());
- btVector3 row1 = btVector3(
- v0.y() * v1.x(),
- v0.y() * v1.y(),
- v0.y() * v1.z());
- btVector3 row2 = btVector3(
- v0.z() * v1.x(),
- v0.z() * v1.y(),
- v0.z() * v1.z());
-
- btMatrix3x3 m(row0[0],row0[1],row0[2],
- row1[0],row1[1],row1[2],
- row2[0],row2[1],row2[2]);
- return m;
+inline btMatrix3x3 outerProduct(const btVector3 &v0, const btVector3 &v1) //renamed it from vecMulVecTranspose (http://en.wikipedia.org/wiki/Outer_product); maybe it should be moved to btVector3 like dot and cross?
+{
+ btVector3 row0 = btVector3(
+ v0.x() * v1.x(),
+ v0.x() * v1.y(),
+ v0.x() * v1.z());
+ btVector3 row1 = btVector3(
+ v0.y() * v1.x(),
+ v0.y() * v1.y(),
+ v0.y() * v1.z());
+ btVector3 row2 = btVector3(
+ v0.z() * v1.x(),
+ v0.z() * v1.y(),
+ v0.z() * v1.z());
+
+ btMatrix3x3 m(row0[0], row0[1], row0[2],
+ row1[0], row1[1], row1[2],
+ row2[0], row2[1], row2[2]);
+ return m;
}
#define vecMulVecTranspose(v0, v1Transposed) outerProduct(v0, v1Transposed)
//
void btMultiBody::computeAccelerationsArticulatedBodyAlgorithmMultiDof(btScalar dt,
- btAlignedObjectArray<btScalar> &scratch_r,
- btAlignedObjectArray<btVector3> &scratch_v,
- btAlignedObjectArray<btMatrix3x3> &scratch_m,
- bool isConstraintPass)
+ btAlignedObjectArray<btScalar> &scratch_r,
+ btAlignedObjectArray<btVector3> &scratch_v,
+ btAlignedObjectArray<btMatrix3x3> &scratch_m,
+ bool isConstraintPass,
+ bool jointFeedbackInWorldSpace,
+ bool jointFeedbackInJointFrame)
{
- // Implement Featherstone's algorithm to calculate joint accelerations (q_double_dot)
- // and the base linear & angular accelerations.
+ // Implement Featherstone's algorithm to calculate joint accelerations (q_double_dot)
+ // and the base linear & angular accelerations.
- // We apply damping forces in this routine as well as any external forces specified by the
- // caller (via addBaseForce etc).
+ // We apply damping forces in this routine as well as any external forces specified by the
+ // caller (via addBaseForce etc).
+
+ // output should point to an array of 6 + num_links reals.
+ // Format is: 3 angular accelerations (in world frame), 3 linear accelerations (in world frame),
+ // num_links joint acceleration values.
- // output should point to an array of 6 + num_links reals.
- // Format is: 3 angular accelerations (in world frame), 3 linear accelerations (in world frame),
- // num_links joint acceleration values.
-
// We added support for multi degree of freedom (multi dof) joints.
// In addition we also can compute the joint reaction forces. This is performed in a second pass,
// so that we can include the effect of the constraint solver forces (computed in the PGS LCP solver)
@@ -738,96 +753,96 @@ void btMultiBody::computeAccelerationsArticulatedBodyAlgorithmMultiDof(btScalar
int num_links = getNumLinks();
- const btScalar DAMPING_K1_LINEAR = m_linearDamping;
+ const btScalar DAMPING_K1_LINEAR = m_linearDamping;
const btScalar DAMPING_K2_LINEAR = m_linearDamping;
const btScalar DAMPING_K1_ANGULAR = m_angularDamping;
- const btScalar DAMPING_K2_ANGULAR= m_angularDamping;
+ const btScalar DAMPING_K2_ANGULAR = m_angularDamping;
const btVector3 base_vel = getBaseVel();
const btVector3 base_omega = getBaseOmega();
- // Temporary matrices/vectors -- use scratch space from caller
- // so that we don't have to keep reallocating every frame
+ // Temporary matrices/vectors -- use scratch space from caller
+ // so that we don't have to keep reallocating every frame
- scratch_r.resize(2*m_dofCount + 7); //multidof? ("Y"s use it and it is used to store qdd) => 2 x m_dofCount
- scratch_v.resize(8*num_links + 6);
- scratch_m.resize(4*num_links + 4);
+ scratch_r.resize(2 * m_dofCount + 7); //multidof? ("Y"s use it and it is used to store qdd) => 2 x m_dofCount
+ scratch_v.resize(8 * num_links + 6);
+ scratch_m.resize(4 * num_links + 4);
//btScalar * r_ptr = &scratch_r[0];
- btScalar * output = &scratch_r[m_dofCount]; // "output" holds the q_double_dot results
- btVector3 * v_ptr = &scratch_v[0];
-
- // vhat_i (top = angular, bottom = linear part)
+ btScalar *output = &scratch_r[m_dofCount]; // "output" holds the q_double_dot results
+ btVector3 *v_ptr = &scratch_v[0];
+
+ // vhat_i (top = angular, bottom = linear part)
btSpatialMotionVector *spatVel = (btSpatialMotionVector *)v_ptr;
v_ptr += num_links * 2 + 2;
//
- // zhat_i^A
- btSpatialForceVector * zeroAccSpatFrc = (btSpatialForceVector *)v_ptr;
+ // zhat_i^A
+ btSpatialForceVector *zeroAccSpatFrc = (btSpatialForceVector *)v_ptr;
v_ptr += num_links * 2 + 2;
//
- // chat_i (note NOT defined for the base)
- btSpatialMotionVector * spatCoriolisAcc = (btSpatialMotionVector *)v_ptr;
+ // chat_i (note NOT defined for the base)
+ btSpatialMotionVector *spatCoriolisAcc = (btSpatialMotionVector *)v_ptr;
v_ptr += num_links * 2;
//
- // Ihat_i^A.
- btSymmetricSpatialDyad * spatInertia = (btSymmetricSpatialDyad *)&scratch_m[num_links + 1];
-
- // Cached 3x3 rotation matrices from parent frame to this frame.
- btMatrix3x3 * rot_from_parent = &m_matrixBuf[0];
- btMatrix3x3 * rot_from_world = &scratch_m[0];
-
- // hhat_i, ahat_i
- // hhat is NOT stored for the base (but ahat is)
- btSpatialForceVector * h = (btSpatialForceVector *)(m_dofCount > 0 ? &m_vectorBuf[0] : 0);
- btSpatialMotionVector * spatAcc = (btSpatialMotionVector *)v_ptr;
- v_ptr += num_links * 2 + 2;
+ // Ihat_i^A.
+ btSymmetricSpatialDyad *spatInertia = (btSymmetricSpatialDyad *)&scratch_m[num_links + 1];
+
+ // Cached 3x3 rotation matrices from parent frame to this frame.
+ btMatrix3x3 *rot_from_parent = &m_matrixBuf[0];
+ btMatrix3x3 *rot_from_world = &scratch_m[0];
+
+ // hhat_i, ahat_i
+ // hhat is NOT stored for the base (but ahat is)
+ btSpatialForceVector *h = (btSpatialForceVector *)(m_dofCount > 0 ? &m_vectorBuf[0] : 0);
+ btSpatialMotionVector *spatAcc = (btSpatialMotionVector *)v_ptr;
+ v_ptr += num_links * 2 + 2;
//
- // Y_i, invD_i
- btScalar * invD = m_dofCount > 0 ? &m_realBuf[6 + m_dofCount] : 0;
- btScalar * Y = &scratch_r[0];
+ // Y_i, invD_i
+ btScalar *invD = m_dofCount > 0 ? &m_realBuf[6 + m_dofCount] : 0;
+ btScalar *Y = &scratch_r[0];
//
- //aux variables
- btSpatialMotionVector spatJointVel; //spatial velocity due to the joint motion (i.e. without predecessors' influence)
- btScalar D[36]; //"D" matrix; it's dofxdof for each body so asingle 6x6 D matrix will do
- btScalar invD_times_Y[6]; //D^{-1} * Y [dofxdof x dofx1 = dofx1] <=> D^{-1} * u; better moved to buffers since it is recalced in calcAccelerationDeltasMultiDof; num_dof of btScalar would cover all bodies
- btSpatialMotionVector result; //holds results of the SolveImatrix op; it is a spatial motion vector (accel)
- btScalar Y_minus_hT_a[6]; //Y - h^{T} * a; it's dofx1 for each body so a single 6x1 temp is enough
- btSpatialForceVector spatForceVecTemps[6]; //6 temporary spatial force vectors
- btSpatialTransformationMatrix fromParent; //spatial transform from parent to child
- btSymmetricSpatialDyad dyadTemp; //inertia matrix temp
+ //aux variables
+ btSpatialMotionVector spatJointVel; //spatial velocity due to the joint motion (i.e. without predecessors' influence)
+ btScalar D[36]; //"D" matrix; it's dofxdof for each body so asingle 6x6 D matrix will do
+ btScalar invD_times_Y[6]; //D^{-1} * Y [dofxdof x dofx1 = dofx1] <=> D^{-1} * u; better moved to buffers since it is recalced in calcAccelerationDeltasMultiDof; num_dof of btScalar would cover all bodies
+ btSpatialMotionVector result; //holds results of the SolveImatrix op; it is a spatial motion vector (accel)
+ btScalar Y_minus_hT_a[6]; //Y - h^{T} * a; it's dofx1 for each body so a single 6x1 temp is enough
+ btSpatialForceVector spatForceVecTemps[6]; //6 temporary spatial force vectors
+ btSpatialTransformationMatrix fromParent; //spatial transform from parent to child
+ btSymmetricSpatialDyad dyadTemp; //inertia matrix temp
btSpatialTransformationMatrix fromWorld;
fromWorld.m_trnVec.setZero();
/////////////////
- // ptr to the joint accel part of the output
- btScalar * joint_accel = output + 6;
+ // ptr to the joint accel part of the output
+ btScalar *joint_accel = output + 6;
- // Start of the algorithm proper.
-
- // First 'upward' loop.
- // Combines CompTreeLinkVelocities and InitTreeLinks from Mirtich.
+ // Start of the algorithm proper.
+
+ // First 'upward' loop.
+ // Combines CompTreeLinkVelocities and InitTreeLinks from Mirtich.
- rot_from_parent[0] = btMatrix3x3(m_baseQuat); //m_baseQuat assumed to be alias!?
+ rot_from_parent[0] = btMatrix3x3(m_baseQuat); //m_baseQuat assumed to be alias!?
//create the vector of spatial velocity of the base by transforming global-coor linear and angular velocities into base-local coordinates
spatVel[0].setVector(rot_from_parent[0] * base_omega, rot_from_parent[0] * base_vel);
- if (m_fixedBase)
- {
+ if (m_fixedBase)
+ {
zeroAccSpatFrc[0].setZero();
- }
- else
+ }
+ else
{
- const btVector3& baseForce = isConstraintPass? m_baseConstraintForce : m_baseForce;
- const btVector3& baseTorque = isConstraintPass? m_baseConstraintTorque : m_baseTorque;
- //external forces
- zeroAccSpatFrc[0].setVector(-(rot_from_parent[0] * baseTorque), -(rot_from_parent[0] * baseForce));
+ const btVector3 &baseForce = isConstraintPass ? m_baseConstraintForce : m_baseForce;
+ const btVector3 &baseTorque = isConstraintPass ? m_baseConstraintTorque : m_baseTorque;
+ //external forces
+ zeroAccSpatFrc[0].setVector(-(rot_from_parent[0] * baseTorque), -(rot_from_parent[0] * baseForce));
//adding damping terms (only)
const btScalar linDampMult = 1., angDampMult = 1.;
zeroAccSpatFrc[0].addVector(angDampMult * m_baseInertia * spatVel[0].getAngular() * (DAMPING_K1_ANGULAR + DAMPING_K2_ANGULAR * spatVel[0].getAngular().safeNorm()),
- linDampMult * m_baseMass * spatVel[0].getLinear() * (DAMPING_K1_LINEAR + DAMPING_K2_LINEAR * spatVel[0].getLinear().safeNorm()));
+ linDampMult * m_baseMass * spatVel[0].getLinear() * (DAMPING_K1_LINEAR + DAMPING_K2_LINEAR * spatVel[0].getLinear().safeNorm()));
//
//p += vhat x Ihat vhat - done in a simpler way
@@ -835,67 +850,66 @@ void btMultiBody::computeAccelerationsArticulatedBodyAlgorithmMultiDof(btScalar
zeroAccSpatFrc[0].addAngular(spatVel[0].getAngular().cross(m_baseInertia * spatVel[0].getAngular()));
//
zeroAccSpatFrc[0].addLinear(m_baseMass * spatVel[0].getAngular().cross(spatVel[0].getLinear()));
- }
-
+ }
//init the spatial AB inertia (it has the simple form thanks to choosing local body frames origins at their COMs)
- spatInertia[0].setMatrix( btMatrix3x3(0,0,0,0,0,0,0,0,0),
- //
- btMatrix3x3(m_baseMass, 0, 0,
- 0, m_baseMass, 0,
- 0, 0, m_baseMass),
- //
- btMatrix3x3(m_baseInertia[0], 0, 0,
- 0, m_baseInertia[1], 0,
- 0, 0, m_baseInertia[2])
- );
-
- rot_from_world[0] = rot_from_parent[0];
+ spatInertia[0].setMatrix(btMatrix3x3(0, 0, 0, 0, 0, 0, 0, 0, 0),
+ //
+ btMatrix3x3(m_baseMass, 0, 0,
+ 0, m_baseMass, 0,
+ 0, 0, m_baseMass),
+ //
+ btMatrix3x3(m_baseInertia[0], 0, 0,
+ 0, m_baseInertia[1], 0,
+ 0, 0, m_baseInertia[2]));
+
+ rot_from_world[0] = rot_from_parent[0];
//
- for (int i = 0; i < num_links; ++i) {
- const int parent = m_links[i].m_parent;
- rot_from_parent[i+1] = btMatrix3x3(m_links[i].m_cachedRotParentToThis);
- rot_from_world[i+1] = rot_from_parent[i+1] * rot_from_world[parent+1];
+ for (int i = 0; i < num_links; ++i)
+ {
+ const int parent = m_links[i].m_parent;
+ rot_from_parent[i + 1] = btMatrix3x3(m_links[i].m_cachedRotParentToThis);
+ rot_from_world[i + 1] = rot_from_parent[i + 1] * rot_from_world[parent + 1];
- fromParent.m_rotMat = rot_from_parent[i+1]; fromParent.m_trnVec = m_links[i].m_cachedRVector;
- fromWorld.m_rotMat = rot_from_world[i+1];
- fromParent.transform(spatVel[parent+1], spatVel[i+1]);
+ fromParent.m_rotMat = rot_from_parent[i + 1];
+ fromParent.m_trnVec = m_links[i].m_cachedRVector;
+ fromWorld.m_rotMat = rot_from_world[i + 1];
+ fromParent.transform(spatVel[parent + 1], spatVel[i + 1]);
// now set vhat_i to its true value by doing
- // vhat_i += qidot * shat_i
- if(!m_useGlobalVelocities)
+ // vhat_i += qidot * shat_i
+ if (!m_useGlobalVelocities)
{
spatJointVel.setZero();
- for(int dof = 0; dof < m_links[i].m_dofCount; ++dof)
+ for (int dof = 0; dof < m_links[i].m_dofCount; ++dof)
spatJointVel += m_links[i].m_axes[dof] * getJointVelMultiDof(i)[dof];
// remember vhat_i is really vhat_p(i) (but in current frame) at this point => we need to add velocity across the inboard joint
- spatVel[i+1] += spatJointVel;
+ spatVel[i + 1] += spatJointVel;
//
// vhat_i is vhat_p(i) transformed to local coors + the velocity across the i-th inboard joint
//spatVel[i+1] = fromParent * spatVel[parent+1] + spatJointVel;
-
}
else
{
- fromWorld.transformRotationOnly(m_links[i].m_absFrameTotVelocity, spatVel[i+1]);
+ fromWorld.transformRotationOnly(m_links[i].m_absFrameTotVelocity, spatVel[i + 1]);
fromWorld.transformRotationOnly(m_links[i].m_absFrameLocVelocity, spatJointVel);
}
- // we can now calculate chat_i
- spatVel[i+1].cross(spatJointVel, spatCoriolisAcc[i]);
+ // we can now calculate chat_i
+ spatVel[i + 1].cross(spatJointVel, spatCoriolisAcc[i]);
- // calculate zhat_i^A
+ // calculate zhat_i^A
//
- //external forces
- btVector3 linkAppliedForce = isConstraintPass? m_links[i].m_appliedConstraintForce : m_links[i].m_appliedForce;
- btVector3 linkAppliedTorque =isConstraintPass ? m_links[i].m_appliedConstraintTorque : m_links[i].m_appliedTorque;
-
- zeroAccSpatFrc[i+1].setVector(-(rot_from_world[i+1] * linkAppliedTorque), -(rot_from_world[i+1] * linkAppliedForce ));
-
+ //external forces
+ btVector3 linkAppliedForce = isConstraintPass ? m_links[i].m_appliedConstraintForce : m_links[i].m_appliedForce;
+ btVector3 linkAppliedTorque = isConstraintPass ? m_links[i].m_appliedConstraintTorque : m_links[i].m_appliedTorque;
+
+ zeroAccSpatFrc[i + 1].setVector(-(rot_from_world[i + 1] * linkAppliedTorque), -(rot_from_world[i + 1] * linkAppliedForce));
+
#if 0
{
@@ -913,27 +927,26 @@ void btMultiBody::computeAccelerationsArticulatedBodyAlgorithmMultiDof(btScalar
//
//adding damping terms (only)
btScalar linDampMult = 1., angDampMult = 1.;
- zeroAccSpatFrc[i+1].addVector(angDampMult * m_links[i].m_inertiaLocal * spatVel[i+1].getAngular() * (DAMPING_K1_ANGULAR + DAMPING_K2_ANGULAR * spatVel[i+1].getAngular().safeNorm()),
- linDampMult * m_links[i].m_mass * spatVel[i+1].getLinear() * (DAMPING_K1_LINEAR + DAMPING_K2_LINEAR * spatVel[i+1].getLinear().safeNorm()));
-
- // calculate Ihat_i^A
+ zeroAccSpatFrc[i + 1].addVector(angDampMult * m_links[i].m_inertiaLocal * spatVel[i + 1].getAngular() * (DAMPING_K1_ANGULAR + DAMPING_K2_ANGULAR * spatVel[i + 1].getAngular().safeNorm()),
+ linDampMult * m_links[i].m_mass * spatVel[i + 1].getLinear() * (DAMPING_K1_LINEAR + DAMPING_K2_LINEAR * spatVel[i + 1].getLinear().safeNorm()));
+
+ // calculate Ihat_i^A
//init the spatial AB inertia (it has the simple form thanks to choosing local body frames origins at their COMs)
- spatInertia[i+1].setMatrix( btMatrix3x3(0,0,0,0,0,0,0,0,0),
- //
- btMatrix3x3(m_links[i].m_mass, 0, 0,
- 0, m_links[i].m_mass, 0,
- 0, 0, m_links[i].m_mass),
- //
- btMatrix3x3(m_links[i].m_inertiaLocal[0], 0, 0,
- 0, m_links[i].m_inertiaLocal[1], 0,
- 0, 0, m_links[i].m_inertiaLocal[2])
- );
+ spatInertia[i + 1].setMatrix(btMatrix3x3(0, 0, 0, 0, 0, 0, 0, 0, 0),
+ //
+ btMatrix3x3(m_links[i].m_mass, 0, 0,
+ 0, m_links[i].m_mass, 0,
+ 0, 0, m_links[i].m_mass),
+ //
+ btMatrix3x3(m_links[i].m_inertiaLocal[0], 0, 0,
+ 0, m_links[i].m_inertiaLocal[1], 0,
+ 0, 0, m_links[i].m_inertiaLocal[2]));
//
//p += vhat x Ihat vhat - done in a simpler way
- if(m_useGyroTerm)
- zeroAccSpatFrc[i+1].addAngular(spatVel[i+1].getAngular().cross(m_links[i].m_inertiaLocal * spatVel[i+1].getAngular()));
- //
- zeroAccSpatFrc[i+1].addLinear(m_links[i].m_mass * spatVel[i+1].getAngular().cross(spatVel[i+1].getLinear()));
+ if (m_useGyroTerm)
+ zeroAccSpatFrc[i + 1].addAngular(spatVel[i + 1].getAngular().cross(m_links[i].m_inertiaLocal * spatVel[i + 1].getAngular()));
+ //
+ zeroAccSpatFrc[i + 1].addLinear(m_links[i].m_mass * spatVel[i + 1].getAngular().cross(spatVel[i + 1].getLinear()));
//btVector3 temp = m_links[i].m_mass * spatVel[i+1].getAngular().cross(spatVel[i+1].getLinear());
////clamp parent's omega
//btScalar parOmegaMod = temp.length();
@@ -944,52 +957,49 @@ void btMultiBody::computeAccelerationsArticulatedBodyAlgorithmMultiDof(btScalar
//printf("|zeroAccSpatFrc[%d]| = %.4f\n", i+1, temp.length());
//temp = spatCoriolisAcc[i].getLinear();
//printf("|spatCoriolisAcc[%d]| = %.4f\n", i+1, temp.length());
-
-
//printf("w[%d] = [%.4f %.4f %.4f]\n", i, vel_top_angular[i+1].x(), vel_top_angular[i+1].y(), vel_top_angular[i+1].z());
- //printf("v[%d] = [%.4f %.4f %.4f]\n", i, vel_bottom_linear[i+1].x(), vel_bottom_linear[i+1].y(), vel_bottom_linear[i+1].z());
+ //printf("v[%d] = [%.4f %.4f %.4f]\n", i, vel_bottom_linear[i+1].x(), vel_bottom_linear[i+1].y(), vel_bottom_linear[i+1].z());
//printf("c[%d] = [%.4f %.4f %.4f]\n", i, coriolis_bottom_linear[i].x(), coriolis_bottom_linear[i].y(), coriolis_bottom_linear[i].z());
- }
-
- // 'Downward' loop.
- // (part of TreeForwardDynamics in Mirtich.)
- for (int i = num_links - 1; i >= 0; --i)
+ }
+
+ // 'Downward' loop.
+ // (part of TreeForwardDynamics in Mirtich.)
+ for (int i = num_links - 1; i >= 0; --i)
{
const int parent = m_links[i].m_parent;
- fromParent.m_rotMat = rot_from_parent[i+1]; fromParent.m_trnVec = m_links[i].m_cachedRVector;
+ fromParent.m_rotMat = rot_from_parent[i + 1];
+ fromParent.m_trnVec = m_links[i].m_cachedRVector;
- for(int dof = 0; dof < m_links[i].m_dofCount; ++dof)
+ for (int dof = 0; dof < m_links[i].m_dofCount; ++dof)
{
btSpatialForceVector &hDof = h[m_links[i].m_dofOffset + dof];
//
- hDof = spatInertia[i+1] * m_links[i].m_axes[dof];
+ hDof = spatInertia[i + 1] * m_links[i].m_axes[dof];
//
- Y[m_links[i].m_dofOffset + dof] = m_links[i].m_jointTorque[dof]
- - m_links[i].m_axes[dof].dot(zeroAccSpatFrc[i+1])
- - spatCoriolisAcc[i].dot(hDof);
-
+ Y[m_links[i].m_dofOffset + dof] = m_links[i].m_jointTorque[dof] - m_links[i].m_axes[dof].dot(zeroAccSpatFrc[i + 1]) - spatCoriolisAcc[i].dot(hDof);
}
- for(int dof = 0; dof < m_links[i].m_dofCount; ++dof)
- {
+ for (int dof = 0; dof < m_links[i].m_dofCount; ++dof)
+ {
btScalar *D_row = &D[dof * m_links[i].m_dofCount];
- for(int dof2 = 0; dof2 < m_links[i].m_dofCount; ++dof2)
+ for (int dof2 = 0; dof2 < m_links[i].m_dofCount; ++dof2)
{
const btSpatialForceVector &hDof2 = h[m_links[i].m_dofOffset + dof2];
D_row[dof2] = m_links[i].m_axes[dof].dot(hDof2);
}
}
- btScalar *invDi = &invD[m_links[i].m_dofOffset*m_links[i].m_dofOffset];
- switch(m_links[i].m_jointType)
+ btScalar *invDi = &invD[m_links[i].m_dofOffset * m_links[i].m_dofOffset];
+ switch (m_links[i].m_jointType)
{
case btMultibodyLink::ePrismatic:
case btMultibodyLink::eRevolute:
{
- if (D[0]>=SIMD_EPSILON)
+ if (D[0] >= SIMD_EPSILON)
{
invDi[0] = 1.0f / D[0];
- } else
+ }
+ else
{
invDi[0] = 0;
}
@@ -1002,10 +1012,10 @@ void btMultiBody::computeAccelerationsArticulatedBodyAlgorithmMultiDof(btScalar
const btMatrix3x3 invD3x3(D3x3.inverse());
//unroll the loop?
- for(int row = 0; row < 3; ++row)
+ for (int row = 0; row < 3; ++row)
{
- for(int col = 0; col < 3; ++col)
- {
+ for (int col = 0; col < 3; ++col)
+ {
invDi[row * 3 + col] = invD3x3[row][col];
}
}
@@ -1014,86 +1024,82 @@ void btMultiBody::computeAccelerationsArticulatedBodyAlgorithmMultiDof(btScalar
}
default:
{
-
}
}
//determine h*D^{-1}
- for(int dof = 0; dof < m_links[i].m_dofCount; ++dof)
+ for (int dof = 0; dof < m_links[i].m_dofCount; ++dof)
{
spatForceVecTemps[dof].setZero();
- for(int dof2 = 0; dof2 < m_links[i].m_dofCount; ++dof2)
- {
+ for (int dof2 = 0; dof2 < m_links[i].m_dofCount; ++dof2)
+ {
const btSpatialForceVector &hDof2 = h[m_links[i].m_dofOffset + dof2];
- //
+ //
spatForceVecTemps[dof] += hDof2 * invDi[dof2 * m_links[i].m_dofCount + dof];
}
}
- dyadTemp = spatInertia[i+1];
+ dyadTemp = spatInertia[i + 1];
//determine (h*D^{-1}) * h^{T}
- for(int dof = 0; dof < m_links[i].m_dofCount; ++dof)
- {
+ for (int dof = 0; dof < m_links[i].m_dofCount; ++dof)
+ {
const btSpatialForceVector &hDof = h[m_links[i].m_dofOffset + dof];
//
dyadTemp -= symmetricSpatialOuterProduct(hDof, spatForceVecTemps[dof]);
}
- fromParent.transformInverse(dyadTemp, spatInertia[parent+1], btSpatialTransformationMatrix::Add);
-
- for(int dof = 0; dof < m_links[i].m_dofCount; ++dof)
+ fromParent.transformInverse(dyadTemp, spatInertia[parent + 1], btSpatialTransformationMatrix::Add);
+
+ for (int dof = 0; dof < m_links[i].m_dofCount; ++dof)
{
invD_times_Y[dof] = 0.f;
- for(int dof2 = 0; dof2 < m_links[i].m_dofCount; ++dof2)
+ for (int dof2 = 0; dof2 < m_links[i].m_dofCount; ++dof2)
{
- invD_times_Y[dof] += invDi[dof * m_links[i].m_dofCount + dof2] * Y[m_links[i].m_dofOffset + dof2];
- }
+ invD_times_Y[dof] += invDi[dof * m_links[i].m_dofCount + dof2] * Y[m_links[i].m_dofOffset + dof2];
+ }
}
-
- spatForceVecTemps[0] = zeroAccSpatFrc[i+1] + spatInertia[i+1] * spatCoriolisAcc[i];
- for(int dof = 0; dof < m_links[i].m_dofCount; ++dof)
- {
+ spatForceVecTemps[0] = zeroAccSpatFrc[i + 1] + spatInertia[i + 1] * spatCoriolisAcc[i];
+
+ for (int dof = 0; dof < m_links[i].m_dofCount; ++dof)
+ {
const btSpatialForceVector &hDof = h[m_links[i].m_dofOffset + dof];
//
- spatForceVecTemps[0] += hDof * invD_times_Y[dof];
+ spatForceVecTemps[0] += hDof * invD_times_Y[dof];
}
-
+
fromParent.transformInverse(spatForceVecTemps[0], spatForceVecTemps[1]);
-
- zeroAccSpatFrc[parent+1] += spatForceVecTemps[1];
- }
+ zeroAccSpatFrc[parent + 1] += spatForceVecTemps[1];
+ }
- // Second 'upward' loop
- // (part of TreeForwardDynamics in Mirtich)
+ // Second 'upward' loop
+ // (part of TreeForwardDynamics in Mirtich)
- if (m_fixedBase)
+ if (m_fixedBase)
{
- spatAcc[0].setZero();
- }
- else
+ spatAcc[0].setZero();
+ }
+ else
{
- if (num_links > 0)
+ if (num_links > 0)
{
m_cachedInertiaValid = true;
m_cachedInertiaTopLeft = spatInertia[0].m_topLeftMat;
m_cachedInertiaTopRight = spatInertia[0].m_topRightMat;
m_cachedInertiaLowerLeft = spatInertia[0].m_bottomLeftMat;
- m_cachedInertiaLowerRight= spatInertia[0].m_topLeftMat.transpose();
+ m_cachedInertiaLowerRight = spatInertia[0].m_topLeftMat.transpose();
+ }
- }
-
solveImatrix(zeroAccSpatFrc[0], result);
spatAcc[0] = -result;
- }
-
-
- // now do the loop over the m_links
- for (int i = 0; i < num_links; ++i)
+ }
+
+ // now do the loop over the m_links
+ for (int i = 0; i < num_links; ++i)
{
// qdd = D^{-1} * (Y - h^{T}*apar) = (S^{T}*I*S)^{-1} * (tau - S^{T}*I*cor - S^{T}*zeroAccFrc - S^{T}*I*apar)
// a = apar + cor + Sqdd
@@ -1101,73 +1107,73 @@ void btMultiBody::computeAccelerationsArticulatedBodyAlgorithmMultiDof(btScalar
// qdd = D^{-1} * (Y - h^{T}*(apar+cor))
// a = apar + Sqdd
- const int parent = m_links[i].m_parent;
- fromParent.m_rotMat = rot_from_parent[i+1]; fromParent.m_trnVec = m_links[i].m_cachedRVector;
+ const int parent = m_links[i].m_parent;
+ fromParent.m_rotMat = rot_from_parent[i + 1];
+ fromParent.m_trnVec = m_links[i].m_cachedRVector;
+
+ fromParent.transform(spatAcc[parent + 1], spatAcc[i + 1]);
- fromParent.transform(spatAcc[parent+1], spatAcc[i+1]);
-
- for(int dof = 0; dof < m_links[i].m_dofCount; ++dof)
+ for (int dof = 0; dof < m_links[i].m_dofCount; ++dof)
{
const btSpatialForceVector &hDof = h[m_links[i].m_dofOffset + dof];
- //
- Y_minus_hT_a[dof] = Y[m_links[i].m_dofOffset + dof] - spatAcc[i+1].dot(hDof);
+ //
+ Y_minus_hT_a[dof] = Y[m_links[i].m_dofOffset + dof] - spatAcc[i + 1].dot(hDof);
}
- btScalar *invDi = &invD[m_links[i].m_dofOffset*m_links[i].m_dofOffset];
+ btScalar *invDi = &invD[m_links[i].m_dofOffset * m_links[i].m_dofOffset];
//D^{-1} * (Y - h^{T}*apar)
mulMatrix(invDi, Y_minus_hT_a, m_links[i].m_dofCount, m_links[i].m_dofCount, m_links[i].m_dofCount, 1, &joint_accel[m_links[i].m_dofOffset]);
- spatAcc[i+1] += spatCoriolisAcc[i];
+ spatAcc[i + 1] += spatCoriolisAcc[i];
- for(int dof = 0; dof < m_links[i].m_dofCount; ++dof)
- spatAcc[i+1] += m_links[i].m_axes[dof] * joint_accel[m_links[i].m_dofOffset + dof];
+ for (int dof = 0; dof < m_links[i].m_dofCount; ++dof)
+ spatAcc[i + 1] += m_links[i].m_axes[dof] * joint_accel[m_links[i].m_dofOffset + dof];
if (m_links[i].m_jointFeedback)
{
m_internalNeedsJointFeedback = true;
- btVector3 angularBotVec = (spatInertia[i+1]*spatAcc[i+1]+zeroAccSpatFrc[i+1]).m_bottomVec;
- btVector3 linearTopVec = (spatInertia[i+1]*spatAcc[i+1]+zeroAccSpatFrc[i+1]).m_topVec;
+ btVector3 angularBotVec = (spatInertia[i + 1] * spatAcc[i + 1] + zeroAccSpatFrc[i + 1]).m_bottomVec;
+ btVector3 linearTopVec = (spatInertia[i + 1] * spatAcc[i + 1] + zeroAccSpatFrc[i + 1]).m_topVec;
- if (gJointFeedbackInJointFrame)
+ if (jointFeedbackInJointFrame)
{
//shift the reaction forces to the joint frame
//linear (force) component is the same
//shift the angular (torque, moment) component using the relative position, m_links[i].m_dVector
- angularBotVec = angularBotVec - linearTopVec.cross(m_links[i].m_dVector);
+ angularBotVec = angularBotVec - linearTopVec.cross(m_links[i].m_dVector);
}
-
- if (gJointFeedbackInWorldSpace)
+ if (jointFeedbackInWorldSpace)
{
if (isConstraintPass)
{
- m_links[i].m_jointFeedback->m_reactionForces.m_bottomVec += m_links[i].m_cachedWorldTransform.getBasis()*angularBotVec;
- m_links[i].m_jointFeedback->m_reactionForces.m_topVec += m_links[i].m_cachedWorldTransform.getBasis()*linearTopVec;
- } else
+ m_links[i].m_jointFeedback->m_reactionForces.m_bottomVec += m_links[i].m_cachedWorldTransform.getBasis() * angularBotVec;
+ m_links[i].m_jointFeedback->m_reactionForces.m_topVec += m_links[i].m_cachedWorldTransform.getBasis() * linearTopVec;
+ }
+ else
{
- m_links[i].m_jointFeedback->m_reactionForces.m_bottomVec = m_links[i].m_cachedWorldTransform.getBasis()*angularBotVec;
- m_links[i].m_jointFeedback->m_reactionForces.m_topVec = m_links[i].m_cachedWorldTransform.getBasis()*linearTopVec;
+ m_links[i].m_jointFeedback->m_reactionForces.m_bottomVec = m_links[i].m_cachedWorldTransform.getBasis() * angularBotVec;
+ m_links[i].m_jointFeedback->m_reactionForces.m_topVec = m_links[i].m_cachedWorldTransform.getBasis() * linearTopVec;
}
- } else
+ }
+ else
{
if (isConstraintPass)
{
- m_links[i].m_jointFeedback->m_reactionForces.m_bottomVec += angularBotVec;
- m_links[i].m_jointFeedback->m_reactionForces.m_topVec += linearTopVec;
-
+ m_links[i].m_jointFeedback->m_reactionForces.m_bottomVec += angularBotVec;
+ m_links[i].m_jointFeedback->m_reactionForces.m_topVec += linearTopVec;
}
else
{
- m_links[i].m_jointFeedback->m_reactionForces.m_bottomVec = angularBotVec;
- m_links[i].m_jointFeedback->m_reactionForces.m_topVec = linearTopVec;
- }
- }
+ m_links[i].m_jointFeedback->m_reactionForces.m_bottomVec = angularBotVec;
+ m_links[i].m_jointFeedback->m_reactionForces.m_topVec = linearTopVec;
+ }
+ }
+ }
}
- }
-
- // transform base accelerations back to the world frame.
+ // transform base accelerations back to the world frame.
const btVector3 omegadot_out = rot_from_parent[0].transpose() * spatAcc[0].getAngular();
output[0] = omegadot_out[0];
output[1] = omegadot_out[1];
@@ -1196,26 +1202,25 @@ void btMultiBody::computeAccelerationsArticulatedBodyAlgorithmMultiDof(btScalar
//printf("]\n");
/////////////////
- // Final step: add the accelerations (times dt) to the velocities.
+ // Final step: add the accelerations (times dt) to the velocities.
if (!isConstraintPass)
{
- if(dt > 0.)
- applyDeltaVeeMultiDof(output, dt);
-
+ if (dt > 0.)
+ applyDeltaVeeMultiDof(output, dt);
}
/////
//btScalar angularThres = 1;
- //btScalar maxAngVel = 0.;
+ //btScalar maxAngVel = 0.;
//bool scaleDown = 1.;
//for(int link = 0; link < m_links.size(); ++link)
- //{
+ //{
// if(spatVel[link+1].getAngular().length() > maxAngVel)
// {
// maxAngVel = spatVel[link+1].getAngular().length();
// scaleDown = angularThres / spatVel[link+1].getAngular().length();
// break;
- // }
+ // }
//}
//if(scaleDown != 1.)
@@ -1232,77 +1237,77 @@ void btMultiBody::computeAccelerationsArticulatedBodyAlgorithmMultiDof(btScalar
/////
/////////////////////
- if(m_useGlobalVelocities)
+ if (m_useGlobalVelocities)
{
- for (int i = 0; i < num_links; ++i)
+ for (int i = 0; i < num_links; ++i)
{
const int parent = m_links[i].m_parent;
//rot_from_parent[i+1] = btMatrix3x3(m_links[i].m_cachedRotParentToThis); /// <- done
//rot_from_world[i+1] = rot_from_parent[i+1] * rot_from_world[parent+1]; /// <- done
-
- fromParent.m_rotMat = rot_from_parent[i+1]; fromParent.m_trnVec = m_links[i].m_cachedRVector;
- fromWorld.m_rotMat = rot_from_world[i+1];
-
- // vhat_i = i_xhat_p(i) * vhat_p(i)
- fromParent.transform(spatVel[parent+1], spatVel[i+1]);
+
+ fromParent.m_rotMat = rot_from_parent[i + 1];
+ fromParent.m_trnVec = m_links[i].m_cachedRVector;
+ fromWorld.m_rotMat = rot_from_world[i + 1];
+
+ // vhat_i = i_xhat_p(i) * vhat_p(i)
+ fromParent.transform(spatVel[parent + 1], spatVel[i + 1]);
//nice alternative below (using operator *) but it generates temps
/////////////////////////////////////////////////////////////
// now set vhat_i to its true value by doing
- // vhat_i += qidot * shat_i
+ // vhat_i += qidot * shat_i
spatJointVel.setZero();
- for(int dof = 0; dof < m_links[i].m_dofCount; ++dof)
+ for (int dof = 0; dof < m_links[i].m_dofCount; ++dof)
spatJointVel += m_links[i].m_axes[dof] * getJointVelMultiDof(i)[dof];
-
- // remember vhat_i is really vhat_p(i) (but in current frame) at this point => we need to add velocity across the inboard joint
- spatVel[i+1] += spatJointVel;
+ // remember vhat_i is really vhat_p(i) (but in current frame) at this point => we need to add velocity across the inboard joint
+ spatVel[i + 1] += spatJointVel;
- fromWorld.transformInverseRotationOnly(spatVel[i+1], m_links[i].m_absFrameTotVelocity);
+ fromWorld.transformInverseRotationOnly(spatVel[i + 1], m_links[i].m_absFrameTotVelocity);
fromWorld.transformInverseRotationOnly(spatJointVel, m_links[i].m_absFrameLocVelocity);
}
}
-
}
-
-
-void btMultiBody::solveImatrix(const btVector3& rhs_top, const btVector3& rhs_bot, btScalar result[6]) const
+void btMultiBody::solveImatrix(const btVector3 &rhs_top, const btVector3 &rhs_bot, btScalar result[6]) const
{
int num_links = getNumLinks();
///solve I * x = rhs, so the result = invI * rhs
- if (num_links == 0)
+ if (num_links == 0)
{
// in the case of 0 m_links (i.e. a plain rigid body, not a multibody) rhs * invI is easier
-
- if ((m_baseInertia[0] >= SIMD_EPSILON) && (m_baseInertia[1] >= SIMD_EPSILON) && (m_baseInertia[2] >= SIMD_EPSILON))
- {
- result[0] = rhs_bot[0] / m_baseInertia[0];
- result[1] = rhs_bot[1] / m_baseInertia[1];
- result[2] = rhs_bot[2] / m_baseInertia[2];
- } else
- {
- result[0] = 0;
- result[1] = 0;
- result[2] = 0;
- }
- if (m_baseMass>=SIMD_EPSILON)
- {
- result[3] = rhs_top[0] / m_baseMass;
- result[4] = rhs_top[1] / m_baseMass;
- result[5] = rhs_top[2] / m_baseMass;
- } else
- {
- result[3] = 0;
- result[4] = 0;
- result[5] = 0;
+
+ if ((m_baseInertia[0] >= SIMD_EPSILON) && (m_baseInertia[1] >= SIMD_EPSILON) && (m_baseInertia[2] >= SIMD_EPSILON))
+ {
+ result[0] = rhs_bot[0] / m_baseInertia[0];
+ result[1] = rhs_bot[1] / m_baseInertia[1];
+ result[2] = rhs_bot[2] / m_baseInertia[2];
+ }
+ else
+ {
+ result[0] = 0;
+ result[1] = 0;
+ result[2] = 0;
+ }
+ if (m_baseMass >= SIMD_EPSILON)
+ {
+ result[3] = rhs_top[0] / m_baseMass;
+ result[4] = rhs_top[1] / m_baseMass;
+ result[5] = rhs_top[2] / m_baseMass;
+ }
+ else
+ {
+ result[3] = 0;
+ result[4] = 0;
+ result[5] = 0;
+ }
}
- } else
+ else
{
if (!m_cachedInertiaValid)
{
- for (int i=0;i<6;i++)
+ for (int i = 0; i < 6; i++)
{
result[i] = 0.f;
}
@@ -1310,94 +1315,95 @@ void btMultiBody::solveImatrix(const btVector3& rhs_top, const btVector3& rhs_bo
}
/// Special routine for calculating the inverse of a spatial inertia matrix
///the 6x6 matrix is stored as 4 blocks of 3x3 matrices
- btMatrix3x3 Binv = m_cachedInertiaTopRight.inverse()*-1.f;
+ btMatrix3x3 Binv = m_cachedInertiaTopRight.inverse() * -1.f;
btMatrix3x3 tmp = m_cachedInertiaLowerRight * Binv;
btMatrix3x3 invIupper_right = (tmp * m_cachedInertiaTopLeft + m_cachedInertiaLowerLeft).inverse();
tmp = invIupper_right * m_cachedInertiaLowerRight;
btMatrix3x3 invI_upper_left = (tmp * Binv);
btMatrix3x3 invI_lower_right = (invI_upper_left).transpose();
- tmp = m_cachedInertiaTopLeft * invI_upper_left;
- tmp[0][0]-= 1.0;
- tmp[1][1]-= 1.0;
- tmp[2][2]-= 1.0;
+ tmp = m_cachedInertiaTopLeft * invI_upper_left;
+ tmp[0][0] -= 1.0;
+ tmp[1][1] -= 1.0;
+ tmp[2][2] -= 1.0;
btMatrix3x3 invI_lower_left = (Binv * tmp);
//multiply result = invI * rhs
{
- btVector3 vtop = invI_upper_left*rhs_top;
- btVector3 tmp;
- tmp = invIupper_right * rhs_bot;
- vtop += tmp;
- btVector3 vbot = invI_lower_left*rhs_top;
- tmp = invI_lower_right * rhs_bot;
- vbot += tmp;
- result[0] = vtop[0];
- result[1] = vtop[1];
- result[2] = vtop[2];
- result[3] = vbot[0];
- result[4] = vbot[1];
- result[5] = vbot[2];
+ btVector3 vtop = invI_upper_left * rhs_top;
+ btVector3 tmp;
+ tmp = invIupper_right * rhs_bot;
+ vtop += tmp;
+ btVector3 vbot = invI_lower_left * rhs_top;
+ tmp = invI_lower_right * rhs_bot;
+ vbot += tmp;
+ result[0] = vtop[0];
+ result[1] = vtop[1];
+ result[2] = vtop[2];
+ result[3] = vbot[0];
+ result[4] = vbot[1];
+ result[5] = vbot[2];
}
-
- }
+ }
}
void btMultiBody::solveImatrix(const btSpatialForceVector &rhs, btSpatialMotionVector &result) const
{
int num_links = getNumLinks();
///solve I * x = rhs, so the result = invI * rhs
- if (num_links == 0)
+ if (num_links == 0)
{
// in the case of 0 m_links (i.e. a plain rigid body, not a multibody) rhs * invI is easier
if ((m_baseInertia[0] >= SIMD_EPSILON) && (m_baseInertia[1] >= SIMD_EPSILON) && (m_baseInertia[2] >= SIMD_EPSILON))
- {
- result.setAngular(rhs.getAngular() / m_baseInertia);
- } else
- {
- result.setAngular(btVector3(0,0,0));
- }
- if (m_baseMass>=SIMD_EPSILON)
- {
- result.setLinear(rhs.getLinear() / m_baseMass);
- } else
- {
- result.setLinear(btVector3(0,0,0));
- }
- } else
+ {
+ result.setAngular(rhs.getAngular() / m_baseInertia);
+ }
+ else
+ {
+ result.setAngular(btVector3(0, 0, 0));
+ }
+ if (m_baseMass >= SIMD_EPSILON)
+ {
+ result.setLinear(rhs.getLinear() / m_baseMass);
+ }
+ else
+ {
+ result.setLinear(btVector3(0, 0, 0));
+ }
+ }
+ else
{
/// Special routine for calculating the inverse of a spatial inertia matrix
///the 6x6 matrix is stored as 4 blocks of 3x3 matrices
if (!m_cachedInertiaValid)
{
- result.setLinear(btVector3(0,0,0));
- result.setAngular(btVector3(0,0,0));
- result.setVector(btVector3(0,0,0),btVector3(0,0,0));
+ result.setLinear(btVector3(0, 0, 0));
+ result.setAngular(btVector3(0, 0, 0));
+ result.setVector(btVector3(0, 0, 0), btVector3(0, 0, 0));
return;
}
- btMatrix3x3 Binv = m_cachedInertiaTopRight.inverse()*-1.f;
+ btMatrix3x3 Binv = m_cachedInertiaTopRight.inverse() * -1.f;
btMatrix3x3 tmp = m_cachedInertiaLowerRight * Binv;
btMatrix3x3 invIupper_right = (tmp * m_cachedInertiaTopLeft + m_cachedInertiaLowerLeft).inverse();
tmp = invIupper_right * m_cachedInertiaLowerRight;
btMatrix3x3 invI_upper_left = (tmp * Binv);
btMatrix3x3 invI_lower_right = (invI_upper_left).transpose();
- tmp = m_cachedInertiaTopLeft * invI_upper_left;
- tmp[0][0]-= 1.0;
- tmp[1][1]-= 1.0;
- tmp[2][2]-= 1.0;
+ tmp = m_cachedInertiaTopLeft * invI_upper_left;
+ tmp[0][0] -= 1.0;
+ tmp[1][1] -= 1.0;
+ tmp[2][2] -= 1.0;
btMatrix3x3 invI_lower_left = (Binv * tmp);
//multiply result = invI * rhs
{
- btVector3 vtop = invI_upper_left*rhs.getLinear();
- btVector3 tmp;
- tmp = invIupper_right * rhs.getAngular();
- vtop += tmp;
- btVector3 vbot = invI_lower_left*rhs.getLinear();
- tmp = invI_lower_right * rhs.getAngular();
- vbot += tmp;
- result.setVector(vtop, vbot);
+ btVector3 vtop = invI_upper_left * rhs.getLinear();
+ btVector3 tmp;
+ tmp = invIupper_right * rhs.getAngular();
+ vtop += tmp;
+ btVector3 vbot = invI_lower_left * rhs.getLinear();
+ tmp = invI_lower_right * rhs.getAngular();
+ vbot += tmp;
+ result.setVector(vtop, vbot);
}
-
- }
+ }
}
void btMultiBody::mulMatrix(btScalar *pA, btScalar *pB, int rowsA, int colsA, int rowsB, int colsB, btScalar *pC) const
@@ -1416,155 +1422,152 @@ void btMultiBody::mulMatrix(btScalar *pA, btScalar *pB, int rowsA, int colsA, in
}
void btMultiBody::calcAccelerationDeltasMultiDof(const btScalar *force, btScalar *output,
- btAlignedObjectArray<btScalar> &scratch_r, btAlignedObjectArray<btVector3> &scratch_v) const
+ btAlignedObjectArray<btScalar> &scratch_r, btAlignedObjectArray<btVector3> &scratch_v) const
{
- // Temporary matrices/vectors -- use scratch space from caller
- // so that we don't have to keep reallocating every frame
+ // Temporary matrices/vectors -- use scratch space from caller
+ // so that we don't have to keep reallocating every frame
-
- int num_links = getNumLinks();
- scratch_r.resize(m_dofCount);
- scratch_v.resize(4*num_links + 4);
+ int num_links = getNumLinks();
+ scratch_r.resize(m_dofCount);
+ scratch_v.resize(4 * num_links + 4);
- btScalar * r_ptr = m_dofCount ? &scratch_r[0] : 0;
- btVector3 * v_ptr = &scratch_v[0];
+ btScalar *r_ptr = m_dofCount ? &scratch_r[0] : 0;
+ btVector3 *v_ptr = &scratch_v[0];
- // zhat_i^A (scratch space)
- btSpatialForceVector * zeroAccSpatFrc = (btSpatialForceVector *)v_ptr;
+ // zhat_i^A (scratch space)
+ btSpatialForceVector *zeroAccSpatFrc = (btSpatialForceVector *)v_ptr;
v_ptr += num_links * 2 + 2;
- // rot_from_parent (cached from calcAccelerations)
- const btMatrix3x3 * rot_from_parent = &m_matrixBuf[0];
+ // rot_from_parent (cached from calcAccelerations)
+ const btMatrix3x3 *rot_from_parent = &m_matrixBuf[0];
- // hhat (cached), accel (scratch)
- // hhat is NOT stored for the base (but ahat is)
- const btSpatialForceVector * h = (btSpatialForceVector *)(m_dofCount > 0 ? &m_vectorBuf[0] : 0);
- btSpatialMotionVector * spatAcc = (btSpatialMotionVector *)v_ptr;
+ // hhat (cached), accel (scratch)
+ // hhat is NOT stored for the base (but ahat is)
+ const btSpatialForceVector *h = (btSpatialForceVector *)(m_dofCount > 0 ? &m_vectorBuf[0] : 0);
+ btSpatialMotionVector *spatAcc = (btSpatialMotionVector *)v_ptr;
v_ptr += num_links * 2 + 2;
- // Y_i (scratch), invD_i (cached)
- const btScalar * invD = m_dofCount > 0 ? &m_realBuf[6 + m_dofCount] : 0;
- btScalar * Y = r_ptr;
+ // Y_i (scratch), invD_i (cached)
+ const btScalar *invD = m_dofCount > 0 ? &m_realBuf[6 + m_dofCount] : 0;
+ btScalar *Y = r_ptr;
////////////////
//aux variables
- btScalar invD_times_Y[6]; //D^{-1} * Y [dofxdof x dofx1 = dofx1] <=> D^{-1} * u; better moved to buffers since it is recalced in calcAccelerationDeltasMultiDof; num_dof of btScalar would cover all bodies
- btSpatialMotionVector result; //holds results of the SolveImatrix op; it is a spatial motion vector (accel)
- btScalar Y_minus_hT_a[6]; //Y - h^{T} * a; it's dofx1 for each body so a single 6x1 temp is enough
- btSpatialForceVector spatForceVecTemps[6]; //6 temporary spatial force vectors
- btSpatialTransformationMatrix fromParent;
+ btScalar invD_times_Y[6]; //D^{-1} * Y [dofxdof x dofx1 = dofx1] <=> D^{-1} * u; better moved to buffers since it is recalced in calcAccelerationDeltasMultiDof; num_dof of btScalar would cover all bodies
+ btSpatialMotionVector result; //holds results of the SolveImatrix op; it is a spatial motion vector (accel)
+ btScalar Y_minus_hT_a[6]; //Y - h^{T} * a; it's dofx1 for each body so a single 6x1 temp is enough
+ btSpatialForceVector spatForceVecTemps[6]; //6 temporary spatial force vectors
+ btSpatialTransformationMatrix fromParent;
/////////////////
- // First 'upward' loop.
- // Combines CompTreeLinkVelocities and InitTreeLinks from Mirtich.
-
+ // First 'upward' loop.
+ // Combines CompTreeLinkVelocities and InitTreeLinks from Mirtich.
+
// Fill in zero_acc
- // -- set to force/torque on the base, zero otherwise
- if (m_fixedBase)
+ // -- set to force/torque on the base, zero otherwise
+ if (m_fixedBase)
+ {
+ zeroAccSpatFrc[0].setZero();
+ }
+ else
{
- zeroAccSpatFrc[0].setZero();
- } else
- {
//test forces
fromParent.m_rotMat = rot_from_parent[0];
- fromParent.transformRotationOnly(btSpatialForceVector(-force[0],-force[1],-force[2], -force[3],-force[4],-force[5]), zeroAccSpatFrc[0]);
- }
- for (int i = 0; i < num_links; ++i)
+ fromParent.transformRotationOnly(btSpatialForceVector(-force[0], -force[1], -force[2], -force[3], -force[4], -force[5]), zeroAccSpatFrc[0]);
+ }
+ for (int i = 0; i < num_links; ++i)
{
- zeroAccSpatFrc[i+1].setZero();
- }
+ zeroAccSpatFrc[i + 1].setZero();
+ }
// 'Downward' loop.
- // (part of TreeForwardDynamics in Mirtich.)
- for (int i = num_links - 1; i >= 0; --i)
+ // (part of TreeForwardDynamics in Mirtich.)
+ for (int i = num_links - 1; i >= 0; --i)
{
const int parent = m_links[i].m_parent;
- fromParent.m_rotMat = rot_from_parent[i+1]; fromParent.m_trnVec = m_links[i].m_cachedRVector;
+ fromParent.m_rotMat = rot_from_parent[i + 1];
+ fromParent.m_trnVec = m_links[i].m_cachedRVector;
- for(int dof = 0; dof < m_links[i].m_dofCount; ++dof)
+ for (int dof = 0; dof < m_links[i].m_dofCount; ++dof)
{
- Y[m_links[i].m_dofOffset + dof] = force[6 + m_links[i].m_dofOffset + dof]
- - m_links[i].m_axes[dof].dot(zeroAccSpatFrc[i+1])
- ;
+ Y[m_links[i].m_dofOffset + dof] = force[6 + m_links[i].m_dofOffset + dof] - m_links[i].m_axes[dof].dot(zeroAccSpatFrc[i + 1]);
}
btVector3 in_top, in_bottom, out_top, out_bottom;
- const btScalar *invDi = &invD[m_links[i].m_dofOffset*m_links[i].m_dofOffset];
-
- for(int dof = 0; dof < m_links[i].m_dofCount; ++dof)
+ const btScalar *invDi = &invD[m_links[i].m_dofOffset * m_links[i].m_dofOffset];
+
+ for (int dof = 0; dof < m_links[i].m_dofCount; ++dof)
{
invD_times_Y[dof] = 0.f;
- for(int dof2 = 0; dof2 < m_links[i].m_dofCount; ++dof2)
+ for (int dof2 = 0; dof2 < m_links[i].m_dofCount; ++dof2)
{
- invD_times_Y[dof] += invDi[dof * m_links[i].m_dofCount + dof2] * Y[m_links[i].m_dofOffset + dof2];
- }
+ invD_times_Y[dof] += invDi[dof * m_links[i].m_dofCount + dof2] * Y[m_links[i].m_dofOffset + dof2];
+ }
}
-
- // Zp += pXi * (Zi + hi*Yi/Di)
- spatForceVecTemps[0] = zeroAccSpatFrc[i+1];
- for(int dof = 0; dof < m_links[i].m_dofCount; ++dof)
+ // Zp += pXi * (Zi + hi*Yi/Di)
+ spatForceVecTemps[0] = zeroAccSpatFrc[i + 1];
+
+ for (int dof = 0; dof < m_links[i].m_dofCount; ++dof)
{
const btSpatialForceVector &hDof = h[m_links[i].m_dofOffset + dof];
//
- spatForceVecTemps[0] += hDof * invD_times_Y[dof];
+ spatForceVecTemps[0] += hDof * invD_times_Y[dof];
}
-
fromParent.transformInverse(spatForceVecTemps[0], spatForceVecTemps[1]);
-
- zeroAccSpatFrc[parent+1] += spatForceVecTemps[1];
- }
-
- // ptr to the joint accel part of the output
- btScalar * joint_accel = output + 6;
+ zeroAccSpatFrc[parent + 1] += spatForceVecTemps[1];
+ }
- // Second 'upward' loop
- // (part of TreeForwardDynamics in Mirtich)
+ // ptr to the joint accel part of the output
+ btScalar *joint_accel = output + 6;
- if (m_fixedBase)
+ // Second 'upward' loop
+ // (part of TreeForwardDynamics in Mirtich)
+
+ if (m_fixedBase)
{
- spatAcc[0].setZero();
- }
- else
+ spatAcc[0].setZero();
+ }
+ else
{
solveImatrix(zeroAccSpatFrc[0], result);
spatAcc[0] = -result;
+ }
- }
-
- // now do the loop over the m_links
- for (int i = 0; i < num_links; ++i)
+ // now do the loop over the m_links
+ for (int i = 0; i < num_links; ++i)
{
- const int parent = m_links[i].m_parent;
- fromParent.m_rotMat = rot_from_parent[i+1]; fromParent.m_trnVec = m_links[i].m_cachedRVector;
+ const int parent = m_links[i].m_parent;
+ fromParent.m_rotMat = rot_from_parent[i + 1];
+ fromParent.m_trnVec = m_links[i].m_cachedRVector;
- fromParent.transform(spatAcc[parent+1], spatAcc[i+1]);
-
- for(int dof = 0; dof < m_links[i].m_dofCount; ++dof)
+ fromParent.transform(spatAcc[parent + 1], spatAcc[i + 1]);
+
+ for (int dof = 0; dof < m_links[i].m_dofCount; ++dof)
{
const btSpatialForceVector &hDof = h[m_links[i].m_dofOffset + dof];
- //
- Y_minus_hT_a[dof] = Y[m_links[i].m_dofOffset + dof] - spatAcc[i+1].dot(hDof);
+ //
+ Y_minus_hT_a[dof] = Y[m_links[i].m_dofOffset + dof] - spatAcc[i + 1].dot(hDof);
}
- const btScalar *invDi = &invD[m_links[i].m_dofOffset*m_links[i].m_dofOffset];
- mulMatrix(const_cast<btScalar*>(invDi), Y_minus_hT_a, m_links[i].m_dofCount, m_links[i].m_dofCount, m_links[i].m_dofCount, 1, &joint_accel[m_links[i].m_dofOffset]);
+ const btScalar *invDi = &invD[m_links[i].m_dofOffset * m_links[i].m_dofOffset];
+ mulMatrix(const_cast<btScalar *>(invDi), Y_minus_hT_a, m_links[i].m_dofCount, m_links[i].m_dofCount, m_links[i].m_dofCount, 1, &joint_accel[m_links[i].m_dofOffset]);
- for(int dof = 0; dof < m_links[i].m_dofCount; ++dof)
- spatAcc[i+1] += m_links[i].m_axes[dof] * joint_accel[m_links[i].m_dofOffset + dof];
- }
+ for (int dof = 0; dof < m_links[i].m_dofCount; ++dof)
+ spatAcc[i + 1] += m_links[i].m_axes[dof] * joint_accel[m_links[i].m_dofOffset + dof];
+ }
- // transform base accelerations back to the world frame.
- btVector3 omegadot_out;
- omegadot_out = rot_from_parent[0].transpose() * spatAcc[0].getAngular();
+ // transform base accelerations back to the world frame.
+ btVector3 omegadot_out;
+ omegadot_out = rot_from_parent[0].transpose() * spatAcc[0].getAngular();
output[0] = omegadot_out[0];
output[1] = omegadot_out[1];
output[2] = omegadot_out[2];
- btVector3 vdot_out;
- vdot_out = rot_from_parent[0].transpose() * spatAcc[0].getLinear();
+ btVector3 vdot_out;
+ vdot_out = rot_from_parent[0].transpose() * spatAcc[0].getLinear();
output[3] = vdot_out[0];
output[4] = vdot_out[1];
output[5] = vdot_out[2];
@@ -1577,19 +1580,16 @@ void btMultiBody::calcAccelerationDeltasMultiDof(const btScalar *force, btScalar
/////////////////
}
-
-
-
void btMultiBody::stepPositionsMultiDof(btScalar dt, btScalar *pq, btScalar *pqd)
-{
+{
int num_links = getNumLinks();
- // step position by adding dt * velocity
- //btVector3 v = getBaseVel();
- //m_basePos += dt * v;
+ // step position by adding dt * velocity
+ //btVector3 v = getBaseVel();
+ //m_basePos += dt * v;
//
btScalar *pBasePos = (pq ? &pq[4] : m_basePos);
- btScalar *pBaseVel = (pqd ? &pqd[3] : &m_realBuf[3]); //note: the !pqd case assumes m_realBuf holds with base velocity at 3,4,5 (should be wrapped for safety)
- //
+ btScalar *pBaseVel = (pqd ? &pqd[3] : &m_realBuf[3]); //note: the !pqd case assumes m_realBuf holds with base velocity at 3,4,5 (should be wrapped for safety)
+ //
pBasePos[0] += dt * pBaseVel[0];
pBasePos[1] += dt * pBaseVel[1];
pBasePos[2] += dt * pBaseVel[2];
@@ -1599,92 +1599,98 @@ void btMultiBody::stepPositionsMultiDof(btScalar dt, btScalar *pq, btScalar *pqd
struct
{
//"exponential map" based on btTransformUtil::integrateTransform(..)
- void operator() (const btVector3 &omega, btQuaternion &quat, bool baseBody, btScalar dt)
+ void operator()(const btVector3 &omega, btQuaternion &quat, bool baseBody, btScalar dt)
{
//baseBody => quat is alias and omega is global coor
- //!baseBody => quat is alibi and omega is local coor
-
+ //!baseBody => quat is alibi and omega is local coor
+
btVector3 axis;
btVector3 angvel;
- if(!baseBody)
- angvel = quatRotate(quat, omega); //if quat is not m_baseQuat, it is alibi => ok
+ if (!baseBody)
+ angvel = quatRotate(quat, omega); //if quat is not m_baseQuat, it is alibi => ok
else
angvel = omega;
-
- btScalar fAngle = angvel.length();
+
+ btScalar fAngle = angvel.length();
//limit the angular motion
if (fAngle * dt > ANGULAR_MOTION_THRESHOLD)
{
- fAngle = btScalar(0.5)*SIMD_HALF_PI / dt;
+ fAngle = btScalar(0.5) * SIMD_HALF_PI / dt;
}
- if ( fAngle < btScalar(0.001) )
+ if (fAngle < btScalar(0.001))
{
// use Taylor's expansions of sync function
- axis = angvel*( btScalar(0.5)*dt-(dt*dt*dt)*(btScalar(0.020833333333))*fAngle*fAngle );
+ axis = angvel * (btScalar(0.5) * dt - (dt * dt * dt) * (btScalar(0.020833333333)) * fAngle * fAngle);
}
else
{
// sync(fAngle) = sin(c*fAngle)/t
- axis = angvel*( btSin(btScalar(0.5)*fAngle*dt)/fAngle );
+ axis = angvel * (btSin(btScalar(0.5) * fAngle * dt) / fAngle);
}
-
- if(!baseBody)
- quat = btQuaternion(axis.x(),axis.y(),axis.z(),btCos( fAngle*dt*btScalar(0.5) )) * quat;
- else
- quat = quat * btQuaternion(-axis.x(),-axis.y(),-axis.z(),btCos( fAngle*dt*btScalar(0.5) ));
- //equivalent to: quat = (btQuaternion(axis.x(),axis.y(),axis.z(),btCos( fAngle*dt*btScalar(0.5) )) * quat.inverse()).inverse();
-
+
+ if (!baseBody)
+ quat = btQuaternion(axis.x(), axis.y(), axis.z(), btCos(fAngle * dt * btScalar(0.5))) * quat;
+ else
+ quat = quat * btQuaternion(-axis.x(), -axis.y(), -axis.z(), btCos(fAngle * dt * btScalar(0.5)));
+ //equivalent to: quat = (btQuaternion(axis.x(),axis.y(),axis.z(),btCos( fAngle*dt*btScalar(0.5) )) * quat.inverse()).inverse();
+
quat.normalize();
}
} pQuatUpdateFun;
///////////////////////////////
//pQuatUpdateFun(getBaseOmega(), m_baseQuat, true, dt);
- //
- btScalar *pBaseQuat = pq ? pq : m_baseQuat;
- btScalar *pBaseOmega = pqd ? pqd : &m_realBuf[0]; //note: the !pqd case assumes m_realBuf starts with base omega (should be wrapped for safety)
//
- btQuaternion baseQuat; baseQuat.setValue(pBaseQuat[0], pBaseQuat[1], pBaseQuat[2], pBaseQuat[3]);
- btVector3 baseOmega; baseOmega.setValue(pBaseOmega[0], pBaseOmega[1], pBaseOmega[2]);
+ btScalar *pBaseQuat = pq ? pq : m_baseQuat;
+ btScalar *pBaseOmega = pqd ? pqd : &m_realBuf[0]; //note: the !pqd case assumes m_realBuf starts with base omega (should be wrapped for safety)
+ //
+ btQuaternion baseQuat;
+ baseQuat.setValue(pBaseQuat[0], pBaseQuat[1], pBaseQuat[2], pBaseQuat[3]);
+ btVector3 baseOmega;
+ baseOmega.setValue(pBaseOmega[0], pBaseOmega[1], pBaseOmega[2]);
pQuatUpdateFun(baseOmega, baseQuat, true, dt);
pBaseQuat[0] = baseQuat.x();
pBaseQuat[1] = baseQuat.y();
pBaseQuat[2] = baseQuat.z();
pBaseQuat[3] = baseQuat.w();
-
//printf("pBaseOmega = %.4f %.4f %.4f\n", pBaseOmega->x(), pBaseOmega->y(), pBaseOmega->z());
//printf("pBaseVel = %.4f %.4f %.4f\n", pBaseVel->x(), pBaseVel->y(), pBaseVel->z());
//printf("baseQuat = %.4f %.4f %.4f %.4f\n", pBaseQuat->x(), pBaseQuat->y(), pBaseQuat->z(), pBaseQuat->w());
- if(pq)
+ if (pq)
pq += 7;
- if(pqd)
+ if (pqd)
pqd += 6;
// Finally we can update m_jointPos for each of the m_links
- for (int i = 0; i < num_links; ++i)
+ for (int i = 0; i < num_links; ++i)
{
- btScalar *pJointPos = (pq ? pq : &m_links[i].m_jointPos[0]);
+ btScalar *pJointPos = (pq ? pq : &m_links[i].m_jointPos[0]);
btScalar *pJointVel = (pqd ? pqd : getJointVelMultiDof(i));
- switch(m_links[i].m_jointType)
+ switch (m_links[i].m_jointType)
{
case btMultibodyLink::ePrismatic:
case btMultibodyLink::eRevolute:
{
- btScalar jointVel = pJointVel[0];
+ btScalar jointVel = pJointVel[0];
pJointPos[0] += dt * jointVel;
break;
}
case btMultibodyLink::eSpherical:
{
- btVector3 jointVel; jointVel.setValue(pJointVel[0], pJointVel[1], pJointVel[2]);
- btQuaternion jointOri; jointOri.setValue(pJointPos[0], pJointPos[1], pJointPos[2], pJointPos[3]);
+ btVector3 jointVel;
+ jointVel.setValue(pJointVel[0], pJointVel[1], pJointVel[2]);
+ btQuaternion jointOri;
+ jointOri.setValue(pJointPos[0], pJointPos[1], pJointPos[2], pJointPos[3]);
pQuatUpdateFun(jointVel, jointOri, false, dt);
- pJointPos[0] = jointOri.x(); pJointPos[1] = jointOri.y(); pJointPos[2] = jointOri.z(); pJointPos[3] = jointOri.w();
+ pJointPos[0] = jointOri.x();
+ pJointPos[1] = jointOri.y();
+ pJointPos[2] = jointOri.z();
+ pJointPos[3] = jointOri.w();
break;
}
case btMultibodyLink::ePlanar:
@@ -1701,122 +1707,135 @@ void btMultiBody::stepPositionsMultiDof(btScalar dt, btScalar *pq, btScalar *pqd
default:
{
}
-
}
m_links[i].updateCacheMultiDof(pq);
- if(pq)
+ if (pq)
pq += m_links[i].m_posVarCount;
- if(pqd)
+ if (pqd)
pqd += m_links[i].m_dofCount;
- }
+ }
}
void btMultiBody::fillConstraintJacobianMultiDof(int link,
- const btVector3 &contact_point,
- const btVector3 &normal_ang,
- const btVector3 &normal_lin,
- btScalar *jac,
- btAlignedObjectArray<btScalar> &scratch_r,
- btAlignedObjectArray<btVector3> &scratch_v,
- btAlignedObjectArray<btMatrix3x3> &scratch_m) const
-{
- // temporary space
+ const btVector3 &contact_point,
+ const btVector3 &normal_ang,
+ const btVector3 &normal_lin,
+ btScalar *jac,
+ btAlignedObjectArray<btScalar> &scratch_r1,
+ btAlignedObjectArray<btVector3> &scratch_v,
+ btAlignedObjectArray<btMatrix3x3> &scratch_m) const
+{
+ // temporary space
int num_links = getNumLinks();
int m_dofCount = getNumDofs();
- scratch_v.resize(3*num_links + 3); //(num_links + base) offsets + (num_links + base) normals_lin + (num_links + base) normals_ang
- scratch_m.resize(num_links + 1);
-
- btVector3 * v_ptr = &scratch_v[0];
- btVector3 * p_minus_com_local = v_ptr; v_ptr += num_links + 1;
- btVector3 * n_local_lin = v_ptr; v_ptr += num_links + 1;
- btVector3 * n_local_ang = v_ptr; v_ptr += num_links + 1;
- btAssert(v_ptr - &scratch_v[0] == scratch_v.size());
-
- scratch_r.resize(m_dofCount);
- btScalar * results = m_dofCount > 0 ? &scratch_r[0] : 0;
-
- btMatrix3x3 * rot_from_world = &scratch_m[0];
+ scratch_v.resize(3 * num_links + 3); //(num_links + base) offsets + (num_links + base) normals_lin + (num_links + base) normals_ang
+ scratch_m.resize(num_links + 1);
+
+ btVector3 *v_ptr = &scratch_v[0];
+ btVector3 *p_minus_com_local = v_ptr;
+ v_ptr += num_links + 1;
+ btVector3 *n_local_lin = v_ptr;
+ v_ptr += num_links + 1;
+ btVector3 *n_local_ang = v_ptr;
+ v_ptr += num_links + 1;
+ btAssert(v_ptr - &scratch_v[0] == scratch_v.size());
+
+ //scratch_r.resize(m_dofCount);
+ //btScalar *results = m_dofCount > 0 ? &scratch_r[0] : 0;
+
+ scratch_r1.resize(m_dofCount+num_links);
+ btScalar * results = m_dofCount > 0 ? &scratch_r1[0] : 0;
+ btScalar* links = num_links? &scratch_r1[m_dofCount] : 0;
+ int numLinksChildToRoot=0;
+ int l = link;
+ while (l != -1)
+ {
+ links[numLinksChildToRoot++]=l;
+ l = m_links[l].m_parent;
+ }
+
+ btMatrix3x3 *rot_from_world = &scratch_m[0];
- const btVector3 p_minus_com_world = contact_point - m_basePos;
- const btVector3 &normal_lin_world = normal_lin; //convenience
+ const btVector3 p_minus_com_world = contact_point - m_basePos;
+ const btVector3 &normal_lin_world = normal_lin; //convenience
const btVector3 &normal_ang_world = normal_ang;
- rot_from_world[0] = btMatrix3x3(m_baseQuat);
-
- // omega coeffients first.
- btVector3 omega_coeffs_world;
- omega_coeffs_world = p_minus_com_world.cross(normal_lin_world);
+ rot_from_world[0] = btMatrix3x3(m_baseQuat);
+
+ // omega coeffients first.
+ btVector3 omega_coeffs_world;
+ omega_coeffs_world = p_minus_com_world.cross(normal_lin_world);
jac[0] = omega_coeffs_world[0] + normal_ang_world[0];
jac[1] = omega_coeffs_world[1] + normal_ang_world[1];
jac[2] = omega_coeffs_world[2] + normal_ang_world[2];
- // then v coefficients
- jac[3] = normal_lin_world[0];
- jac[4] = normal_lin_world[1];
- jac[5] = normal_lin_world[2];
+ // then v coefficients
+ jac[3] = normal_lin_world[0];
+ jac[4] = normal_lin_world[1];
+ jac[5] = normal_lin_world[2];
//create link-local versions of p_minus_com and normal
p_minus_com_local[0] = rot_from_world[0] * p_minus_com_world;
- n_local_lin[0] = rot_from_world[0] * normal_lin_world;
+ n_local_lin[0] = rot_from_world[0] * normal_lin_world;
n_local_ang[0] = rot_from_world[0] * normal_ang_world;
- // Set remaining jac values to zero for now.
- for (int i = 6; i < 6 + m_dofCount; ++i)
+ // Set remaining jac values to zero for now.
+ for (int i = 6; i < 6 + m_dofCount; ++i)
{
- jac[i] = 0;
- }
-
- // Qdot coefficients, if necessary.
- if (num_links > 0 && link > -1) {
-
- // TODO: speed this up -- don't calculate for m_links we don't need.
- // (Also, we are making 3 separate calls to this function, for the normal & the 2 friction directions,
- // which is resulting in repeated work being done...)
-
- // calculate required normals & positions in the local frames.
- for (int i = 0; i < num_links; ++i) {
+ jac[i] = 0;
+ }
- // transform to local frame
- const int parent = m_links[i].m_parent;
- const btMatrix3x3 mtx(m_links[i].m_cachedRotParentToThis);
- rot_from_world[i+1] = mtx * rot_from_world[parent+1];
+ // Qdot coefficients, if necessary.
+ if (num_links > 0 && link > -1)
+ {
+ // TODO: (Also, we are making 3 separate calls to this function, for the normal & the 2 friction directions,
+ // which is resulting in repeated work being done...)
+
+ // calculate required normals & positions in the local frames.
+ for (int a = 0; a < numLinksChildToRoot; a++)
+ {
+ int i = links[numLinksChildToRoot-1-a];
+ // transform to local frame
+ const int parent = m_links[i].m_parent;
+ const btMatrix3x3 mtx(m_links[i].m_cachedRotParentToThis);
+ rot_from_world[i + 1] = mtx * rot_from_world[parent + 1];
- n_local_lin[i+1] = mtx * n_local_lin[parent+1];
- n_local_ang[i+1] = mtx * n_local_ang[parent+1];
- p_minus_com_local[i+1] = mtx * p_minus_com_local[parent+1] - m_links[i].m_cachedRVector;
+ n_local_lin[i + 1] = mtx * n_local_lin[parent + 1];
+ n_local_ang[i + 1] = mtx * n_local_ang[parent + 1];
+ p_minus_com_local[i + 1] = mtx * p_minus_com_local[parent + 1] - m_links[i].m_cachedRVector;
// calculate the jacobian entry
- switch(m_links[i].m_jointType)
+ switch (m_links[i].m_jointType)
{
case btMultibodyLink::eRevolute:
{
- results[m_links[i].m_dofOffset] = n_local_lin[i+1].dot(m_links[i].getAxisTop(0).cross(p_minus_com_local[i+1]) + m_links[i].getAxisBottom(0));
- results[m_links[i].m_dofOffset] += n_local_ang[i+1].dot(m_links[i].getAxisTop(0));
+ results[m_links[i].m_dofOffset] = n_local_lin[i + 1].dot(m_links[i].getAxisTop(0).cross(p_minus_com_local[i + 1]) + m_links[i].getAxisBottom(0));
+ results[m_links[i].m_dofOffset] += n_local_ang[i + 1].dot(m_links[i].getAxisTop(0));
break;
}
case btMultibodyLink::ePrismatic:
{
- results[m_links[i].m_dofOffset] = n_local_lin[i+1].dot(m_links[i].getAxisBottom(0));
+ results[m_links[i].m_dofOffset] = n_local_lin[i + 1].dot(m_links[i].getAxisBottom(0));
break;
}
case btMultibodyLink::eSpherical:
{
- results[m_links[i].m_dofOffset + 0] = n_local_lin[i+1].dot(m_links[i].getAxisTop(0).cross(p_minus_com_local[i+1]) + m_links[i].getAxisBottom(0));
- results[m_links[i].m_dofOffset + 1] = n_local_lin[i+1].dot(m_links[i].getAxisTop(1).cross(p_minus_com_local[i+1]) + m_links[i].getAxisBottom(1));
- results[m_links[i].m_dofOffset + 2] = n_local_lin[i+1].dot(m_links[i].getAxisTop(2).cross(p_minus_com_local[i+1]) + m_links[i].getAxisBottom(2));
-
- results[m_links[i].m_dofOffset + 0] += n_local_ang[i+1].dot(m_links[i].getAxisTop(0));
- results[m_links[i].m_dofOffset + 1] += n_local_ang[i+1].dot(m_links[i].getAxisTop(1));
- results[m_links[i].m_dofOffset + 2] += n_local_ang[i+1].dot(m_links[i].getAxisTop(2));
+ results[m_links[i].m_dofOffset + 0] = n_local_lin[i + 1].dot(m_links[i].getAxisTop(0).cross(p_minus_com_local[i + 1]) + m_links[i].getAxisBottom(0));
+ results[m_links[i].m_dofOffset + 1] = n_local_lin[i + 1].dot(m_links[i].getAxisTop(1).cross(p_minus_com_local[i + 1]) + m_links[i].getAxisBottom(1));
+ results[m_links[i].m_dofOffset + 2] = n_local_lin[i + 1].dot(m_links[i].getAxisTop(2).cross(p_minus_com_local[i + 1]) + m_links[i].getAxisBottom(2));
+
+ results[m_links[i].m_dofOffset + 0] += n_local_ang[i + 1].dot(m_links[i].getAxisTop(0));
+ results[m_links[i].m_dofOffset + 1] += n_local_ang[i + 1].dot(m_links[i].getAxisTop(1));
+ results[m_links[i].m_dofOffset + 2] += n_local_ang[i + 1].dot(m_links[i].getAxisTop(2));
break;
}
case btMultibodyLink::ePlanar:
{
- results[m_links[i].m_dofOffset + 0] = n_local_lin[i+1].dot(m_links[i].getAxisTop(0).cross(p_minus_com_local[i+1]));// + m_links[i].getAxisBottom(0));
- results[m_links[i].m_dofOffset + 1] = n_local_lin[i+1].dot(m_links[i].getAxisBottom(1));
- results[m_links[i].m_dofOffset + 2] = n_local_lin[i+1].dot(m_links[i].getAxisBottom(2));
+ results[m_links[i].m_dofOffset + 0] = n_local_lin[i + 1].dot(m_links[i].getAxisTop(0).cross(p_minus_com_local[i + 1])); // + m_links[i].getAxisBottom(0));
+ results[m_links[i].m_dofOffset + 1] = n_local_lin[i + 1].dot(m_links[i].getAxisBottom(1));
+ results[m_links[i].m_dofOffset + 2] = n_local_lin[i + 1].dot(m_links[i].getAxisBottom(2));
break;
}
@@ -1824,269 +1843,260 @@ void btMultiBody::fillConstraintJacobianMultiDof(int link,
{
}
}
-
- }
+ }
- // Now copy through to output.
+ // Now copy through to output.
//printf("jac[%d] = ", link);
- while (link != -1)
+ while (link != -1)
{
- for(int dof = 0; dof < m_links[link].m_dofCount; ++dof)
+ for (int dof = 0; dof < m_links[link].m_dofCount; ++dof)
{
jac[6 + m_links[link].m_dofOffset + dof] = results[m_links[link].m_dofOffset + dof];
//printf("%.2f\t", jac[6 + m_links[link].m_dofOffset + dof]);
}
-
+
link = m_links[link].m_parent;
- }
+ }
//printf("]\n");
- }
+ }
}
-
void btMultiBody::wakeUp()
{
m_sleepTimer = 0;
- m_awake = true;
+ m_awake = true;
}
void btMultiBody::goToSleep()
{
- m_awake = false;
+ m_awake = false;
}
void btMultiBody::checkMotionAndSleepIfRequired(btScalar timestep)
{
extern bool gDisableDeactivation;
- if (!m_canSleep || gDisableDeactivation)
+ if (!m_canSleep || gDisableDeactivation)
{
m_awake = true;
m_sleepTimer = 0;
return;
}
- // motion is computed as omega^2 + v^2 + (sum of squares of joint velocities)
- btScalar motion = 0;
+ // motion is computed as omega^2 + v^2 + (sum of squares of joint velocities)
+ btScalar motion = 0;
{
- for (int i = 0; i < 6 + m_dofCount; ++i)
+ for (int i = 0; i < 6 + m_dofCount; ++i)
motion += m_realBuf[i] * m_realBuf[i];
}
-
-
- if (motion < SLEEP_EPSILON) {
- m_sleepTimer += timestep;
- if (m_sleepTimer > SLEEP_TIMEOUT) {
- goToSleep();
- }
- } else {
- m_sleepTimer = 0;
+
+ if (motion < SLEEP_EPSILON)
+ {
+ m_sleepTimer += timestep;
+ if (m_sleepTimer > SLEEP_TIMEOUT)
+ {
+ goToSleep();
+ }
+ }
+ else
+ {
+ m_sleepTimer = 0;
if (!m_awake)
wakeUp();
- }
+ }
}
-
-void btMultiBody::forwardKinematics(btAlignedObjectArray<btQuaternion>& world_to_local,btAlignedObjectArray<btVector3>& local_origin)
+void btMultiBody::forwardKinematics(btAlignedObjectArray<btQuaternion> &world_to_local, btAlignedObjectArray<btVector3> &local_origin)
{
-
int num_links = getNumLinks();
// Cached 3x3 rotation matrices from parent frame to this frame.
- btMatrix3x3* rot_from_parent =(btMatrix3x3 *) &m_matrixBuf[0];
+ btMatrix3x3 *rot_from_parent = (btMatrix3x3 *)&m_matrixBuf[0];
- rot_from_parent[0] = btMatrix3x3(m_baseQuat); //m_baseQuat assumed to be alias!?
-
- for (int i = 0; i < num_links; ++i)
+ rot_from_parent[0] = btMatrix3x3(m_baseQuat); //m_baseQuat assumed to be alias!?
+
+ for (int i = 0; i < num_links; ++i)
{
- rot_from_parent[i+1] = btMatrix3x3(m_links[i].m_cachedRotParentToThis);
+ rot_from_parent[i + 1] = btMatrix3x3(m_links[i].m_cachedRotParentToThis);
}
-
+
int nLinks = getNumLinks();
///base + num m_links
- world_to_local.resize(nLinks+1);
- local_origin.resize(nLinks+1);
+ world_to_local.resize(nLinks + 1);
+ local_origin.resize(nLinks + 1);
world_to_local[0] = getWorldToBaseRot();
local_origin[0] = getBasePos();
-
- for (int k=0;k<getNumLinks();k++)
+
+ for (int k = 0; k < getNumLinks(); k++)
{
const int parent = getParent(k);
- world_to_local[k+1] = getParentToLocalRot(k) * world_to_local[parent+1];
- local_origin[k+1] = local_origin[parent+1] + (quatRotate(world_to_local[k+1].inverse() , getRVector(k)));
+ world_to_local[k + 1] = getParentToLocalRot(k) * world_to_local[parent + 1];
+ local_origin[k + 1] = local_origin[parent + 1] + (quatRotate(world_to_local[k + 1].inverse(), getRVector(k)));
}
- for (int link=0;link<getNumLinks();link++)
+ for (int link = 0; link < getNumLinks(); link++)
{
- int index = link+1;
+ int index = link + 1;
btVector3 posr = local_origin[index];
- btScalar quat[4]={-world_to_local[index].x(),-world_to_local[index].y(),-world_to_local[index].z(),world_to_local[index].w()};
+ btScalar quat[4] = {-world_to_local[index].x(), -world_to_local[index].y(), -world_to_local[index].z(), world_to_local[index].w()};
btTransform tr;
tr.setIdentity();
tr.setOrigin(posr);
- tr.setRotation(btQuaternion(quat[0],quat[1],quat[2],quat[3]));
+ tr.setRotation(btQuaternion(quat[0], quat[1], quat[2], quat[3]));
getLink(link).m_cachedWorldTransform = tr;
-
}
-
}
-void btMultiBody::updateCollisionObjectWorldTransforms(btAlignedObjectArray<btQuaternion>& world_to_local,btAlignedObjectArray<btVector3>& local_origin)
+void btMultiBody::updateCollisionObjectWorldTransforms(btAlignedObjectArray<btQuaternion> &world_to_local, btAlignedObjectArray<btVector3> &local_origin)
{
- world_to_local.resize(getNumLinks()+1);
- local_origin.resize(getNumLinks()+1);
-
+ world_to_local.resize(getNumLinks() + 1);
+ local_origin.resize(getNumLinks() + 1);
+
world_to_local[0] = getWorldToBaseRot();
local_origin[0] = getBasePos();
-
+
if (getBaseCollider())
{
btVector3 posr = local_origin[0];
// float pos[4]={posr.x(),posr.y(),posr.z(),1};
- btScalar quat[4]={-world_to_local[0].x(),-world_to_local[0].y(),-world_to_local[0].z(),world_to_local[0].w()};
+ btScalar quat[4] = {-world_to_local[0].x(), -world_to_local[0].y(), -world_to_local[0].z(), world_to_local[0].w()};
btTransform tr;
tr.setIdentity();
tr.setOrigin(posr);
- tr.setRotation(btQuaternion(quat[0],quat[1],quat[2],quat[3]));
-
+ tr.setRotation(btQuaternion(quat[0], quat[1], quat[2], quat[3]));
+
getBaseCollider()->setWorldTransform(tr);
-
}
-
- for (int k=0;k<getNumLinks();k++)
+
+ for (int k = 0; k < getNumLinks(); k++)
{
const int parent = getParent(k);
- world_to_local[k+1] = getParentToLocalRot(k) * world_to_local[parent+1];
- local_origin[k+1] = local_origin[parent+1] + (quatRotate(world_to_local[k+1].inverse() , getRVector(k)));
+ world_to_local[k + 1] = getParentToLocalRot(k) * world_to_local[parent + 1];
+ local_origin[k + 1] = local_origin[parent + 1] + (quatRotate(world_to_local[k + 1].inverse(), getRVector(k)));
}
-
-
- for (int m=0;m<getNumLinks();m++)
+
+ for (int m = 0; m < getNumLinks(); m++)
{
- btMultiBodyLinkCollider* col = getLink(m).m_collider;
+ btMultiBodyLinkCollider *col = getLink(m).m_collider;
if (col)
{
int link = col->m_link;
btAssert(link == m);
-
- int index = link+1;
-
+
+ int index = link + 1;
+
btVector3 posr = local_origin[index];
// float pos[4]={posr.x(),posr.y(),posr.z(),1};
- btScalar quat[4]={-world_to_local[index].x(),-world_to_local[index].y(),-world_to_local[index].z(),world_to_local[index].w()};
+ btScalar quat[4] = {-world_to_local[index].x(), -world_to_local[index].y(), -world_to_local[index].z(), world_to_local[index].w()};
btTransform tr;
tr.setIdentity();
tr.setOrigin(posr);
- tr.setRotation(btQuaternion(quat[0],quat[1],quat[2],quat[3]));
-
+ tr.setRotation(btQuaternion(quat[0], quat[1], quat[2], quat[3]));
+
col->setWorldTransform(tr);
}
}
}
-int btMultiBody::calculateSerializeBufferSize() const
+int btMultiBody::calculateSerializeBufferSize() const
{
int sz = sizeof(btMultiBodyData);
return sz;
}
- ///fills the dataBuffer and returns the struct name (and 0 on failure)
-const char* btMultiBody::serialize(void* dataBuffer, class btSerializer* serializer) const
+///fills the dataBuffer and returns the struct name (and 0 on failure)
+const char *btMultiBody::serialize(void *dataBuffer, class btSerializer *serializer) const
{
- btMultiBodyData* mbd = (btMultiBodyData*) dataBuffer;
- getBasePos().serialize(mbd->m_baseWorldPosition);
- getWorldToBaseRot().inverse().serialize(mbd->m_baseWorldOrientation);
- getBaseVel().serialize(mbd->m_baseLinearVelocity);
- getBaseOmega().serialize(mbd->m_baseAngularVelocity);
-
- mbd->m_baseMass = this->getBaseMass();
- getBaseInertia().serialize(mbd->m_baseInertia);
+ btMultiBodyData *mbd = (btMultiBodyData *)dataBuffer;
+ getBasePos().serialize(mbd->m_baseWorldPosition);
+ getWorldToBaseRot().inverse().serialize(mbd->m_baseWorldOrientation);
+ getBaseVel().serialize(mbd->m_baseLinearVelocity);
+ getBaseOmega().serialize(mbd->m_baseAngularVelocity);
+
+ mbd->m_baseMass = this->getBaseMass();
+ getBaseInertia().serialize(mbd->m_baseInertia);
+ {
+ char *name = (char *)serializer->findNameForPointer(m_baseName);
+ mbd->m_baseName = (char *)serializer->getUniquePointer(name);
+ if (mbd->m_baseName)
{
- char* name = (char*) serializer->findNameForPointer(m_baseName);
- mbd->m_baseName = (char*)serializer->getUniquePointer(name);
- if (mbd->m_baseName)
- {
- serializer->serializeName(name);
- }
+ serializer->serializeName(name);
}
- mbd->m_numLinks = this->getNumLinks();
- if (mbd->m_numLinks)
+ }
+ mbd->m_numLinks = this->getNumLinks();
+ if (mbd->m_numLinks)
+ {
+ int sz = sizeof(btMultiBodyLinkData);
+ int numElem = mbd->m_numLinks;
+ btChunk *chunk = serializer->allocate(sz, numElem);
+ btMultiBodyLinkData *memPtr = (btMultiBodyLinkData *)chunk->m_oldPtr;
+ for (int i = 0; i < numElem; i++, memPtr++)
{
- int sz = sizeof(btMultiBodyLinkData);
- int numElem = mbd->m_numLinks;
- btChunk* chunk = serializer->allocate(sz,numElem);
- btMultiBodyLinkData* memPtr = (btMultiBodyLinkData*)chunk->m_oldPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ memPtr->m_jointType = getLink(i).m_jointType;
+ memPtr->m_dofCount = getLink(i).m_dofCount;
+ memPtr->m_posVarCount = getLink(i).m_posVarCount;
+
+ getLink(i).m_inertiaLocal.serialize(memPtr->m_linkInertia);
+
+ getLink(i).m_absFrameTotVelocity.m_topVec.serialize(memPtr->m_absFrameTotVelocityTop);
+ getLink(i).m_absFrameTotVelocity.m_bottomVec.serialize(memPtr->m_absFrameTotVelocityBottom);
+ getLink(i).m_absFrameLocVelocity.m_topVec.serialize(memPtr->m_absFrameLocVelocityTop);
+ getLink(i).m_absFrameLocVelocity.m_bottomVec.serialize(memPtr->m_absFrameLocVelocityBottom);
+
+ memPtr->m_linkMass = getLink(i).m_mass;
+ memPtr->m_parentIndex = getLink(i).m_parent;
+ memPtr->m_jointDamping = getLink(i).m_jointDamping;
+ memPtr->m_jointFriction = getLink(i).m_jointFriction;
+ memPtr->m_jointLowerLimit = getLink(i).m_jointLowerLimit;
+ memPtr->m_jointUpperLimit = getLink(i).m_jointUpperLimit;
+ memPtr->m_jointMaxForce = getLink(i).m_jointMaxForce;
+ memPtr->m_jointMaxVelocity = getLink(i).m_jointMaxVelocity;
+
+ getLink(i).m_eVector.serialize(memPtr->m_parentComToThisPivotOffset);
+ getLink(i).m_dVector.serialize(memPtr->m_thisPivotToThisComOffset);
+ getLink(i).m_zeroRotParentToThis.serialize(memPtr->m_zeroRotParentToThis);
+ btAssert(memPtr->m_dofCount <= 3);
+ for (int dof = 0; dof < getLink(i).m_dofCount; dof++)
{
+ getLink(i).getAxisBottom(dof).serialize(memPtr->m_jointAxisBottom[dof]);
+ getLink(i).getAxisTop(dof).serialize(memPtr->m_jointAxisTop[dof]);
- memPtr->m_jointType = getLink(i).m_jointType;
- memPtr->m_dofCount = getLink(i).m_dofCount;
- memPtr->m_posVarCount = getLink(i).m_posVarCount;
-
- getLink(i).m_inertiaLocal.serialize(memPtr->m_linkInertia);
-
- getLink(i).m_absFrameTotVelocity.m_topVec.serialize(memPtr->m_absFrameTotVelocityTop);
- getLink(i).m_absFrameTotVelocity.m_bottomVec.serialize(memPtr->m_absFrameTotVelocityBottom);
- getLink(i).m_absFrameLocVelocity.m_topVec.serialize(memPtr->m_absFrameLocVelocityTop);
- getLink(i).m_absFrameLocVelocity.m_bottomVec.serialize(memPtr->m_absFrameLocVelocityBottom);
-
- memPtr->m_linkMass = getLink(i).m_mass;
- memPtr->m_parentIndex = getLink(i).m_parent;
- memPtr->m_jointDamping = getLink(i).m_jointDamping;
- memPtr->m_jointFriction = getLink(i).m_jointFriction;
- memPtr->m_jointLowerLimit = getLink(i).m_jointLowerLimit;
- memPtr->m_jointUpperLimit = getLink(i).m_jointUpperLimit;
- memPtr->m_jointMaxForce = getLink(i).m_jointMaxForce;
- memPtr->m_jointMaxVelocity = getLink(i).m_jointMaxVelocity;
-
- getLink(i).m_eVector.serialize(memPtr->m_parentComToThisPivotOffset);
- getLink(i).m_dVector.serialize(memPtr->m_thisPivotToThisComOffset);
- getLink(i).m_zeroRotParentToThis.serialize(memPtr->m_zeroRotParentToThis);
- btAssert(memPtr->m_dofCount<=3);
- for (int dof = 0;dof<getLink(i).m_dofCount;dof++)
- {
- getLink(i).getAxisBottom(dof).serialize(memPtr->m_jointAxisBottom[dof]);
- getLink(i).getAxisTop(dof).serialize(memPtr->m_jointAxisTop[dof]);
-
- memPtr->m_jointTorque[dof] = getLink(i).m_jointTorque[dof];
- memPtr->m_jointVel[dof] = getJointVelMultiDof(i)[dof];
+ memPtr->m_jointTorque[dof] = getLink(i).m_jointTorque[dof];
+ memPtr->m_jointVel[dof] = getJointVelMultiDof(i)[dof];
+ }
+ int numPosVar = getLink(i).m_posVarCount;
+ for (int posvar = 0; posvar < numPosVar; posvar++)
+ {
+ memPtr->m_jointPos[posvar] = getLink(i).m_jointPos[posvar];
+ }
- }
- int numPosVar = getLink(i).m_posVarCount;
- for (int posvar = 0; posvar < numPosVar;posvar++)
- {
- memPtr->m_jointPos[posvar] = getLink(i).m_jointPos[posvar];
- }
-
-
+ {
+ char *name = (char *)serializer->findNameForPointer(m_links[i].m_linkName);
+ memPtr->m_linkName = (char *)serializer->getUniquePointer(name);
+ if (memPtr->m_linkName)
{
- char* name = (char*) serializer->findNameForPointer(m_links[i].m_linkName);
- memPtr->m_linkName = (char*)serializer->getUniquePointer(name);
- if (memPtr->m_linkName)
- {
- serializer->serializeName(name);
- }
+ serializer->serializeName(name);
}
+ }
+ {
+ char *name = (char *)serializer->findNameForPointer(m_links[i].m_jointName);
+ memPtr->m_jointName = (char *)serializer->getUniquePointer(name);
+ if (memPtr->m_jointName)
{
- char* name = (char*) serializer->findNameForPointer(m_links[i].m_jointName);
- memPtr->m_jointName = (char*)serializer->getUniquePointer(name);
- if (memPtr->m_jointName)
- {
- serializer->serializeName(name);
- }
+ serializer->serializeName(name);
}
- memPtr->m_linkCollider = (btCollisionObjectData*)serializer->getUniquePointer(getLink(i).m_collider);
-
}
- serializer->finalizeChunk(chunk,btMultiBodyLinkDataName,BT_ARRAY_CODE,(void*) &m_links[0]);
+ memPtr->m_linkCollider = (btCollisionObjectData *)serializer->getUniquePointer(getLink(i).m_collider);
}
- mbd->m_links = mbd->m_numLinks? (btMultiBodyLinkData*) serializer->getUniquePointer((void*)&m_links[0]):0;
+ serializer->finalizeChunk(chunk, btMultiBodyLinkDataName, BT_ARRAY_CODE, (void *)&m_links[0]);
+ }
+ mbd->m_links = mbd->m_numLinks ? (btMultiBodyLinkData *)serializer->getUniquePointer((void *)&m_links[0]) : 0;
- // Fill padding with zeros to appease msan.
+ // Fill padding with zeros to appease msan.
#ifdef BT_USE_DOUBLE_PRECISION
- memset(mbd->m_padding, 0, sizeof(mbd->m_padding));
+ memset(mbd->m_padding, 0, sizeof(mbd->m_padding));
#endif
- return btMultiBodyDataName;
+ return btMultiBodyDataName;
}
diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBody.h b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBody.h
index 5cd00e5173..e5c0f1806b 100644
--- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBody.h
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBody.h
@@ -21,7 +21,6 @@
*/
-
#ifndef BT_MULTIBODY_H
#define BT_MULTIBODY_H
@@ -31,116 +30,111 @@
#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"
+#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
+#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
+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);
+ //
+ // 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 linkIndex,
- btScalar mass,
- const btVector3 &inertia,
- int parent,
- const btQuaternion &rotParentToThis,
- const btVector3 &parentComToThisPivotOffset,
- const btVector3 &thisPivotToThisComOffset, bool deprecatedDisableParentCollision=true);
-
-
+ 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 linkIndex, // 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 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
+ btScalar mass,
+ const btVector3 &inertia,
+ int parent,
+ const btQuaternion &rotParentToThis,
+ const btVector3 &jointAxis,
+ const btVector3 &parentComToThisPivotOffset,
+ const btVector3 &thisPivotToThisComOffset,
+ bool disableParentCollision);
+
+ void setupRevolute(int linkIndex, // 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 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)
+ btMultibodyLink &getLink(int index)
{
return m_links[index];
}
-
- void setBaseCollider(btMultiBodyLinkCollider* collider)//collider can be NULL to disable collision for the base
+ void setBaseCollider(btMultiBodyLinkCollider * collider) //collider can be NULL to disable collision for the base
{
m_baseCollider = collider;
}
- const btMultiBodyLinkCollider* getBaseCollider() const
+ const btMultiBodyLinkCollider *getBaseCollider() const
{
return m_baseCollider;
}
- btMultiBodyLinkCollider* getBaseCollider()
+ btMultiBodyLinkCollider *getBaseCollider()
{
return m_baseCollider;
}
- btMultiBodyLinkCollider* getLinkCollider(int index)
+ const btMultiBodyLinkCollider *getLinkCollider(int index) const
{
if (index >= 0 && index < getNumLinks())
{
@@ -149,61 +143,65 @@ public:
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
- //
+ 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 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;
-
-
+ 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)
- //
+ //
+ // 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; }
+ 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
+ //
- //
- // 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;
- } // rotates world vectors into base frame
- btVector3 getBaseOmega() const { return btVector3(m_realBuf[0],m_realBuf[1],m_realBuf[2]); } // in world frame
+ 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;
+ } // 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;
+ void setBasePos(const btVector3 &pos)
+ {
+ m_basePos = pos;
}
- void setBaseWorldTransform(const btTransform& tr)
+ void setBaseWorldTransform(const btTransform &tr)
{
setBasePos(tr.getOrigin());
setWorldToBaseRot(tr.getRotation().inverse());
-
}
btTransform getBaseWorldTransform() const
@@ -214,190 +212,186 @@ public:
return tr;
}
- void setBaseVel(const btVector3 &vel)
- {
-
- m_realBuf[3]=vel[0]; m_realBuf[4]=vel[1]; m_realBuf[5]=vel[2];
+ 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!?
+ void setWorldToBaseRot(const btQuaternion &rot)
+ {
+ m_baseQuat = rot; //m_baseQuat asumed to ba alias!?
}
- void setBaseOmega(const btVector3 &omega)
- {
- m_realBuf[0]=omega[0];
- m_realBuf[1]=omega[1];
- m_realBuf[2]=omega[2];
+ void setBaseOmega(const btVector3 &omega)
+ {
+ m_realBuf[0] = omega[0];
+ m_realBuf[1] = omega[1];
+ m_realBuf[2] = omega[2];
}
+ //
+ // get/set pos/vel for child m_links (i = 0 to num_links-1)
+ //
- //
- // 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 ;
+ btScalar getJointPos(int i) const;
+ btScalar getJointVel(int i) const;
- void setJointPos(int i, btScalar q);
- void setJointVel(int i, btScalar qdot);
- void setJointPosMultiDof(int i, btScalar *q);
- void setJointVelMultiDof(int i, btScalar *qdot);
+ 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];
+ //
+ // 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];
}
-/* btScalar * getVelocityVector()
+ /* 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)
- //
+ //
+ // 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 &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.
+ //
+ // transform vectors in local frame of link i to world frame (or vice versa)
+ //
+ btVector3 localPosToWorld(int i, const btVector3 &vec) const;
+ btVector3 localDirToWorld(int i, const btVector3 &vec) const;
+ btVector3 worldPosToLocal(int i, const btVector3 &vec) const;
+ btVector3 worldDirToLocal(int i, const btVector3 &vec) const;
- //
- // transform vectors in local frame of link i to world frame (or vice versa)
- //
- btVector3 localPosToWorld(int i, const btVector3 &vec) const;
- btVector3 localDirToWorld(int i, const btVector3 &vec) const;
- btVector3 worldPosToLocal(int i, const btVector3 &vec) const;
- btVector3 worldDirToLocal(int i, const btVector3 &vec) const;
+ //
+ // transform a frame in local coordinate to a frame in world coordinate
+ //
+ btMatrix3x3 localFrameToWorld(int i, const btMatrix3x3 &mat) const;
- //
- // transform a frame in local coordinate to a frame in world coordinate
- //
- btMatrix3x3 localFrameToWorld(int i, const btMatrix3x3 &mat) const;
+ //
+ // calculate kinetic energy and angular momentum
+ // useful for debugging.
+ //
- //
- // calculate kinetic energy and angular momentum
- // useful for debugging.
- //
+ btScalar getKineticEnergy() const;
+ btVector3 getAngularMomentum() const;
- btScalar getKineticEnergy() const;
- btVector3 getAngularMomentum() const;
-
+ //
+ // set external forces and torques. Note all external forces/torques are given in the WORLD frame.
+ //
- //
- // set external forces and torques. Note all external forces/torques are given in the WORLD frame.
- //
-
- void clearForcesAndTorques();
- void clearConstraintForces();
+ 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 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).
- //
-
-
+ 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<btScalar> &scratch_r,
- btAlignedObjectArray<btVector3> &scratch_v,
- btAlignedObjectArray<btMatrix3x3> &scratch_m,
- bool isConstraintPass=false
- );
-
-///stepVelocitiesMultiDof is deprecated, use computeAccelerationsArticulatedBodyAlgorithmMultiDof instead
- void stepVelocitiesMultiDof(btScalar dt,
- btAlignedObjectArray<btScalar> &scratch_r,
- btAlignedObjectArray<btVector3> &scratch_v,
- btAlignedObjectArray<btMatrix3x3> &scratch_m,
- bool isConstraintPass=false)
- {
- computeAccelerationsArticulatedBodyAlgorithmMultiDof(dt,scratch_r,scratch_v,scratch_m,isConstraintPass);
- }
-
- // 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.
+ btAlignedObjectArray<btScalar> & scratch_r,
+ btAlignedObjectArray<btVector3> & scratch_v,
+ btAlignedObjectArray<btMatrix3x3> & scratch_m,
+ bool isConstraintPass,
+ bool jointFeedbackInWorldSpace,
+ bool jointFeedbackInJointFrame
+ );
+
+ ///stepVelocitiesMultiDof is deprecated, use computeAccelerationsArticulatedBodyAlgorithmMultiDof instead
+ //void stepVelocitiesMultiDof(btScalar dt,
+ // btAlignedObjectArray<btScalar> & scratch_r,
+ // btAlignedObjectArray<btVector3> & scratch_v,
+ // btAlignedObjectArray<btMatrix3x3> & 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<btScalar> &scratch_r,
- btAlignedObjectArray<btVector3> &scratch_v) const;
-
-
- void applyDeltaVeeMultiDof2(const btScalar * delta_vee, btScalar multiplier)
+ btAlignedObjectArray<btScalar> &scratch_r,
+ btAlignedObjectArray<btVector3> &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;
- }
+ {
+ m_deltaV[dof] += delta_vee[dof] * multiplier;
+ }
}
void processDeltaVeeMultiDof2()
{
- applyDeltaVeeMultiDof(&m_deltaV[0],1);
+ 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)
+ void applyDeltaVeeMultiDof(const btScalar *delta_vee, btScalar multiplier)
{
//for (int dof = 0; dof < 6 + getNumDofs(); ++dof)
// printf("%.4f ", delta_vee[dof]*multiplier);
@@ -418,65 +412,61 @@ void addJointTorque(int i, btScalar Q);
for (int dof = 0; dof < 6 + getNumDofs(); ++dof)
{
m_realBuf[dof] += delta_vee[dof] * multiplier;
- btClamp(m_realBuf[dof],-m_maxCoordinateVelocity,m_maxCoordinateVelocity);
+ btClamp(m_realBuf[dof], -m_maxCoordinateVelocity, m_maxCoordinateVelocity);
}
- }
+ }
-
-
- // timestep the positions (given current velocities).
+ // timestep the positions (given current velocities).
void stepPositionsMultiDof(btScalar dt, btScalar *pq = 0, btScalar *pqd = 0);
+ //
+ // contacts
+ //
- //
- // 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.
- // 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<btScalar> &scratch_r,
- btAlignedObjectArray<btVector3> &scratch_v,
- btAlignedObjectArray<btMatrix3x3> &scratch_m) const { fillConstraintJacobianMultiDof(link, contact_point, btVector3(0, 0, 0), normal, jac, scratch_r, scratch_v, scratch_m); }
+ const btVector3 &contact_point,
+ const btVector3 &normal,
+ btScalar *jac,
+ btAlignedObjectArray<btScalar> &scratch_r,
+ btAlignedObjectArray<btVector3> &scratch_v,
+ btAlignedObjectArray<btMatrix3x3> &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<btScalar> &scratch_r,
- btAlignedObjectArray<btVector3> &scratch_v,
- btAlignedObjectArray<btMatrix3x3> &scratch_m) const;
-
-
- //
- // sleeping
- //
- void setCanSleep(bool canSleep)
+ const btVector3 &contact_point,
+ const btVector3 &normal_ang,
+ const btVector3 &normal_lin,
+ btScalar *jac,
+ btAlignedObjectArray<btScalar> &scratch_r,
+ btAlignedObjectArray<btVector3> &scratch_v,
+ btAlignedObjectArray<btMatrix3x3> &scratch_m) const;
+
+ //
+ // sleeping
+ //
+ void setCanSleep(bool canSleep)
{
m_canSleep = canSleep;
}
- bool getCanSleep()const
+ bool getCanSleep() const
{
return m_canSleep;
}
- bool isAwake() const { return m_awake; }
- void wakeUp();
- void goToSleep();
- void checkMotionAndSleepIfRequired(btScalar timestep);
-
+ bool isAwake() const { return m_awake; }
+ void wakeUp();
+ void goToSleep();
+ void checkMotionAndSleepIfRequired(btScalar timestep);
+
bool hasFixedBase() const
{
- return m_fixedBase;
+ return m_fixedBase;
}
int getCompanionId() const
@@ -489,16 +479,16 @@ void addJointTorque(int i, btScalar Q);
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
+ 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;
+ return m_linearDamping;
}
- void setLinearDamping( btScalar damp)
+ void setLinearDamping(btScalar damp)
{
m_linearDamping = damp;
}
@@ -506,11 +496,11 @@ void addJointTorque(int i, btScalar Q);
{
return m_angularDamping;
}
- void setAngularDamping( btScalar damp)
+ void setAngularDamping(btScalar damp)
{
m_angularDamping = damp;
}
-
+
bool getUseGyroTerm() const
{
return m_useGyroTerm;
@@ -519,24 +509,24 @@ void addJointTorque(int i, btScalar Q);
{
m_useGyroTerm = useGyro;
}
- btScalar getMaxCoordinateVelocity() const
+ btScalar getMaxCoordinateVelocity() const
{
- return m_maxCoordinateVelocity ;
+ return m_maxCoordinateVelocity;
}
- void setMaxCoordinateVelocity(btScalar maxVel)
+ void setMaxCoordinateVelocity(btScalar maxVel)
{
m_maxCoordinateVelocity = maxVel;
}
- btScalar getMaxAppliedImpulse() const
+ btScalar getMaxAppliedImpulse() const
{
return m_maxAppliedImpulse;
}
- void setMaxAppliedImpulse(btScalar maxImp)
+ void setMaxAppliedImpulse(btScalar maxImp)
{
m_maxAppliedImpulse = maxImp;
}
- void setHasSelfCollision(bool hasSelfCollision)
+ void setHasSelfCollision(bool hasSelfCollision)
{
m_hasSelfCollision = hasSelfCollision;
}
@@ -545,7 +535,6 @@ void addJointTorque(int i, btScalar Q);
return m_hasSelfCollision;
}
-
void finalizeMultiDof();
void useRK4Integration(bool use) { m_useRK4 = use; }
@@ -561,126 +550,132 @@ void addJointTorque(int i, btScalar Q);
{
__posUpdated = updated;
}
-
+
//internalNeedsJointFeedback is for internal use only
bool internalNeedsJointFeedback() const
{
return m_internalNeedsJointFeedback;
}
- void forwardKinematics(btAlignedObjectArray<btQuaternion>& scratch_q,btAlignedObjectArray<btVector3>& scratch_m);
+ void forwardKinematics(btAlignedObjectArray<btQuaternion> & scratch_q, btAlignedObjectArray<btVector3> & scratch_m);
+
+ void compTreeLinkVelocities(btVector3 * omega, btVector3 * vel) const;
- void compTreeLinkVelocities(btVector3 *omega, btVector3 *vel) const;
+ void updateCollisionObjectWorldTransforms(btAlignedObjectArray<btQuaternion> & scratch_q, btAlignedObjectArray<btVector3> & scratch_m);
- void updateCollisionObjectWorldTransforms(btAlignedObjectArray<btQuaternion>& scratch_q,btAlignedObjectArray<btVector3>& scratch_m);
-
- virtual int calculateSerializeBufferSize() 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 const char *serialize(void *dataBuffer, class btSerializer *serializer) const;
- const char* getBaseName() const
+ const char *getBaseName() const
{
return m_baseName;
}
///memory of setBaseName needs to be manager by user
- void setBaseName(const char* name)
+ void setBaseName(const char *name)
{
m_baseName = name;
}
///users can point to their objects, userPointer is not used by Bullet
- void* getUserPointer() const
+ void *getUserPointer() const
{
return m_userObjectPointer;
}
- int getUserIndex() const
+ int getUserIndex() const
{
return m_userIndex;
}
- int getUserIndex2() const
+ int getUserIndex2() const
{
return m_userIndex2;
}
///users can point to their objects, userPointer is not used by Bullet
- void setUserPointer(void* userPointer)
+ void setUserPointer(void *userPointer)
{
m_userObjectPointer = userPointer;
}
///users can point to their objects, userPointer is not used by Bullet
- void setUserIndex(int index)
+ void setUserIndex(int index)
{
m_userIndex = index;
}
- void setUserIndex2(int index)
+ void setUserIndex2(int index)
{
m_userIndex2 = index;
}
-private:
- btMultiBody(const btMultiBody &); // not implemented
- void operator=(const btMultiBody &); // not implemented
+ 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 solveImatrix(const btVector3& rhs_top, const btVector3& rhs_bot, btScalar result[6]) 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)
+ 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;
+ 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)
- btQuaternion m_baseQuat; // rotates world points into base frame
-
- 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<btMultibodyLink> 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<btScalar> m_deltaV;
- btAlignedObjectArray<btScalar> m_realBuf;
- btAlignedObjectArray<btVector3> m_vectorBuf;
- btAlignedObjectArray<btMatrix3x3> m_matrixBuf;
+ 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)
+ btQuaternion m_baseQuat; // rotates world points into base frame
+
+ 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<btMultibodyLink> 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<btScalar> m_deltaV;
+ btAlignedObjectArray<btScalar> m_realBuf;
+ btAlignedObjectArray<btVector3> m_vectorBuf;
+ btAlignedObjectArray<btMatrix3x3> m_matrixBuf;
btMatrix3x3 m_cachedInertiaTopLeft;
btMatrix3x3 m_cachedInertiaTopRight;
@@ -688,25 +683,25 @@ private:
btMatrix3x3 m_cachedInertiaLowerRight;
bool m_cachedInertiaValid;
- bool m_fixedBase;
+ bool m_fixedBase;
- // Sleep parameters.
- bool m_awake;
- bool m_canSleep;
- btScalar m_sleepTimer;
+ // Sleep parameters.
+ bool m_awake;
+ bool m_canSleep;
+ btScalar m_sleepTimer;
- void* m_userObjectPointer;
+ 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;
-
+ 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;
@@ -720,117 +715,108 @@ private:
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;
-
+ 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;
-
+ 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
+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;
-
-
+ 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
+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;
+ 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/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyConstraint.cpp b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyConstraint.cpp
index 9f61874b83..e17ab94d98 100644
--- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyConstraint.cpp
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyConstraint.cpp
@@ -1,32 +1,29 @@
#include "btMultiBodyConstraint.h"
#include "BulletDynamics/Dynamics/btRigidBody.h"
-#include "btMultiBodyPoint2Point.h" //for testing (BTMBP2PCONSTRAINT_BLOCK_ANGULAR_MOTION_TEST macro)
+#include "btMultiBodyPoint2Point.h" //for testing (BTMBP2PCONSTRAINT_BLOCK_ANGULAR_MOTION_TEST macro)
-
-
-btMultiBodyConstraint::btMultiBodyConstraint(btMultiBody* bodyA,btMultiBody* bodyB,int linkA, int linkB, int numRows, bool isUnilateral)
- :m_bodyA(bodyA),
- m_bodyB(bodyB),
- m_linkA(linkA),
- m_linkB(linkB),
- m_numRows(numRows),
- m_jacSizeA(0),
- m_jacSizeBoth(0),
- m_isUnilateral(isUnilateral),
- m_numDofsFinalized(-1),
- m_maxAppliedImpulse(100)
+btMultiBodyConstraint::btMultiBodyConstraint(btMultiBody* bodyA, btMultiBody* bodyB, int linkA, int linkB, int numRows, bool isUnilateral)
+ : m_bodyA(bodyA),
+ m_bodyB(bodyB),
+ m_linkA(linkA),
+ m_linkB(linkB),
+ m_numRows(numRows),
+ m_jacSizeA(0),
+ m_jacSizeBoth(0),
+ m_isUnilateral(isUnilateral),
+ m_numDofsFinalized(-1),
+ m_maxAppliedImpulse(100)
{
-
}
void btMultiBodyConstraint::updateJacobianSizes()
{
- if(m_bodyA)
+ if (m_bodyA)
{
m_jacSizeA = (6 + m_bodyA->getNumDofs());
}
- if(m_bodyB)
+ if (m_bodyB)
{
m_jacSizeBoth = m_jacSizeA + 6 + m_bodyB->getNumDofs();
}
@@ -38,7 +35,7 @@ void btMultiBodyConstraint::allocateJacobiansMultiDof()
{
updateJacobianSizes();
- m_posOffset = ((1 + m_jacSizeBoth)*m_numRows);
+ m_posOffset = ((1 + m_jacSizeBoth) * m_numRows);
m_data.resize((2 + m_jacSizeBoth) * m_numRows);
}
@@ -46,298 +43,307 @@ btMultiBodyConstraint::~btMultiBodyConstraint()
{
}
-void btMultiBodyConstraint::applyDeltaVee(btMultiBodyJacobianData& data, btScalar* delta_vee, btScalar impulse, int velocityIndex, int ndof)
+void btMultiBodyConstraint::applyDeltaVee(btMultiBodyJacobianData& data, btScalar* delta_vee, btScalar impulse, int velocityIndex, int ndof)
{
for (int i = 0; i < ndof; ++i)
- data.m_deltaVelocities[velocityIndex+i] += delta_vee[i] * impulse;
+ data.m_deltaVelocities[velocityIndex + i] += delta_vee[i] * impulse;
}
-btScalar btMultiBodyConstraint::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,
- btScalar relaxation,
- bool isFriction, btScalar desiredVelocity, btScalar cfmSlip)
+btScalar btMultiBodyConstraint::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,
+ btScalar relaxation,
+ bool isFriction, btScalar desiredVelocity, btScalar cfmSlip)
{
- solverConstraint.m_multiBodyA = m_bodyA;
- solverConstraint.m_multiBodyB = m_bodyB;
- solverConstraint.m_linkA = m_linkA;
- solverConstraint.m_linkB = m_linkB;
-
- btMultiBody* multiBodyA = solverConstraint.m_multiBodyA;
- btMultiBody* multiBodyB = solverConstraint.m_multiBodyB;
-
- btSolverBody* bodyA = multiBodyA ? 0 : &data.m_solverBodyPool->at(solverConstraint.m_solverBodyIdA);
- btSolverBody* bodyB = multiBodyB ? 0 : &data.m_solverBodyPool->at(solverConstraint.m_solverBodyIdB);
-
- btRigidBody* rb0 = multiBodyA ? 0 : bodyA->m_originalBody;
- btRigidBody* rb1 = multiBodyB ? 0 : bodyB->m_originalBody;
-
- btVector3 rel_pos1, rel_pos2; //these two used to be inited to posAworld and posBworld (respectively) but it does not seem necessary
- if (bodyA)
- rel_pos1 = posAworld - bodyA->getWorldTransform().getOrigin();
- if (bodyB)
- rel_pos2 = posBworld - bodyB->getWorldTransform().getOrigin();
-
- if (multiBodyA)
- {
- if (solverConstraint.m_linkA<0)
- {
- rel_pos1 = posAworld - multiBodyA->getBasePos();
- } else
- {
- rel_pos1 = posAworld - multiBodyA->getLink(solverConstraint.m_linkA).m_cachedWorldTransform.getOrigin();
- }
-
- const int ndofA = multiBodyA->getNumDofs() + 6;
-
- solverConstraint.m_deltaVelAindex = multiBodyA->getCompanionId();
-
- if (solverConstraint.m_deltaVelAindex <0)
- {
- solverConstraint.m_deltaVelAindex = data.m_deltaVelocities.size();
- multiBodyA->setCompanionId(solverConstraint.m_deltaVelAindex);
- data.m_deltaVelocities.resize(data.m_deltaVelocities.size()+ndofA);
- } else
- {
- btAssert(data.m_deltaVelocities.size() >= solverConstraint.m_deltaVelAindex+ndofA);
- }
-
- //determine jacobian of this 1D constraint in terms of multibodyA's degrees of freedom
- //resize..
- solverConstraint.m_jacAindex = data.m_jacobians.size();
- data.m_jacobians.resize(data.m_jacobians.size()+ndofA);
- //copy/determine
- if(jacOrgA)
- {
- for (int i=0;i<ndofA;i++)
- data.m_jacobians[solverConstraint.m_jacAindex+i] = jacOrgA[i];
- }
- else
- {
- btScalar* jac1=&data.m_jacobians[solverConstraint.m_jacAindex];
- //multiBodyA->fillContactJacobianMultiDof(solverConstraint.m_linkA, posAworld, constraintNormalLin, jac1, data.scratch_r, data.scratch_v, data.scratch_m);
- multiBodyA->fillConstraintJacobianMultiDof(solverConstraint.m_linkA, posAworld, constraintNormalAng, constraintNormalLin, jac1, data.scratch_r, data.scratch_v, data.scratch_m);
- }
-
- //determine the velocity response of multibodyA to reaction impulses of this constraint (i.e. A[i,i] for i=1,...n_con: multibody's inverse inertia with respect to this 1D constraint)
- //resize..
- data.m_deltaVelocitiesUnitImpulse.resize(data.m_deltaVelocitiesUnitImpulse.size()+ndofA); //=> each constraint row has the constrained tree dofs allocated in m_deltaVelocitiesUnitImpulse
- btAssert(data.m_jacobians.size() == data.m_deltaVelocitiesUnitImpulse.size());
- btScalar* delta = &data.m_deltaVelocitiesUnitImpulse[solverConstraint.m_jacAindex];
- //determine..
- multiBodyA->calcAccelerationDeltasMultiDof(&data.m_jacobians[solverConstraint.m_jacAindex],delta,data.scratch_r, data.scratch_v);
-
- btVector3 torqueAxis0;
- if (angConstraint) {
- torqueAxis0 = constraintNormalAng;
- }
- else {
- torqueAxis0 = rel_pos1.cross(constraintNormalLin);
-
- }
- solverConstraint.m_relpos1CrossNormal = torqueAxis0;
- solverConstraint.m_contactNormal1 = constraintNormalLin;
- }
- else //if(rb0)
- {
- btVector3 torqueAxis0;
- if (angConstraint) {
- torqueAxis0 = constraintNormalAng;
- }
- else {
- torqueAxis0 = rel_pos1.cross(constraintNormalLin);
- }
- solverConstraint.m_angularComponentA = rb0 ? rb0->getInvInertiaTensorWorld()*torqueAxis0*rb0->getAngularFactor() : btVector3(0,0,0);
- solverConstraint.m_relpos1CrossNormal = torqueAxis0;
- solverConstraint.m_contactNormal1 = constraintNormalLin;
- }
-
- if (multiBodyB)
- {
- if (solverConstraint.m_linkB<0)
- {
- rel_pos2 = posBworld - multiBodyB->getBasePos();
- } else
- {
- rel_pos2 = posBworld - multiBodyB->getLink(solverConstraint.m_linkB).m_cachedWorldTransform.getOrigin();
- }
-
- const int ndofB = multiBodyB->getNumDofs() + 6;
-
- solverConstraint.m_deltaVelBindex = multiBodyB->getCompanionId();
- if (solverConstraint.m_deltaVelBindex <0)
- {
- solverConstraint.m_deltaVelBindex = data.m_deltaVelocities.size();
- multiBodyB->setCompanionId(solverConstraint.m_deltaVelBindex);
- data.m_deltaVelocities.resize(data.m_deltaVelocities.size()+ndofB);
- }
-
- //determine jacobian of this 1D constraint in terms of multibodyB's degrees of freedom
- //resize..
- solverConstraint.m_jacBindex = data.m_jacobians.size();
- data.m_jacobians.resize(data.m_jacobians.size()+ndofB);
- //copy/determine..
- if(jacOrgB)
- {
- for (int i=0;i<ndofB;i++)
- data.m_jacobians[solverConstraint.m_jacBindex+i] = jacOrgB[i];
- }
- else
- {
- //multiBodyB->fillContactJacobianMultiDof(solverConstraint.m_linkB, posBworld, -constraintNormalLin, &data.m_jacobians[solverConstraint.m_jacBindex], data.scratch_r, data.scratch_v, data.scratch_m);
- multiBodyB->fillConstraintJacobianMultiDof(solverConstraint.m_linkB, posBworld, -constraintNormalAng, -constraintNormalLin, &data.m_jacobians[solverConstraint.m_jacBindex], data.scratch_r, data.scratch_v, data.scratch_m);
- }
-
- //determine velocity response of multibodyB to reaction impulses of this constraint (i.e. A[i,i] for i=1,...n_con: multibody's inverse inertia with respect to this 1D constraint)
- //resize..
- data.m_deltaVelocitiesUnitImpulse.resize(data.m_deltaVelocitiesUnitImpulse.size()+ndofB);
- btAssert(data.m_jacobians.size() == data.m_deltaVelocitiesUnitImpulse.size());
- btScalar* delta = &data.m_deltaVelocitiesUnitImpulse[solverConstraint.m_jacBindex];
- //determine..
- multiBodyB->calcAccelerationDeltasMultiDof(&data.m_jacobians[solverConstraint.m_jacBindex],delta,data.scratch_r, data.scratch_v);
-
- btVector3 torqueAxis1;
- if (angConstraint) {
- torqueAxis1 = constraintNormalAng;
- }
- else {
- torqueAxis1 = rel_pos2.cross(constraintNormalLin);
- }
- solverConstraint.m_relpos2CrossNormal = -torqueAxis1;
- solverConstraint.m_contactNormal2 = -constraintNormalLin;
- }
- else //if(rb1)
- {
- btVector3 torqueAxis1;
- if (angConstraint) {
- torqueAxis1 = constraintNormalAng;
- }
- else {
- torqueAxis1 = rel_pos2.cross(constraintNormalLin);
- }
- solverConstraint.m_angularComponentB = rb1 ? rb1->getInvInertiaTensorWorld()*-torqueAxis1*rb1->getAngularFactor() : btVector3(0,0,0);
- solverConstraint.m_relpos2CrossNormal = -torqueAxis1;
- solverConstraint.m_contactNormal2 = -constraintNormalLin;
- }
- {
-
- btVector3 vec;
- btScalar denom0 = 0.f;
- btScalar denom1 = 0.f;
- btScalar* jacB = 0;
- btScalar* jacA = 0;
- btScalar* deltaVelA = 0;
- btScalar* deltaVelB = 0;
- int ndofA = 0;
- //determine the "effective mass" of the constrained multibodyA with respect to this 1D constraint (i.e. 1/A[i,i])
- if (multiBodyA)
- {
- ndofA = multiBodyA->getNumDofs() + 6;
- jacA = &data.m_jacobians[solverConstraint.m_jacAindex];
- deltaVelA = &data.m_deltaVelocitiesUnitImpulse[solverConstraint.m_jacAindex];
- for (int i = 0; i < ndofA; ++i)
- {
- btScalar j = jacA[i] ;
- btScalar l = deltaVelA[i];
- denom0 += j*l;
- }
- }
- else if(rb0)
- {
- vec = ( solverConstraint.m_angularComponentA).cross(rel_pos1);
- if (angConstraint) {
+ solverConstraint.m_multiBodyA = m_bodyA;
+ solverConstraint.m_multiBodyB = m_bodyB;
+ solverConstraint.m_linkA = m_linkA;
+ solverConstraint.m_linkB = m_linkB;
+
+ btMultiBody* multiBodyA = solverConstraint.m_multiBodyA;
+ btMultiBody* multiBodyB = solverConstraint.m_multiBodyB;
+
+ btSolverBody* bodyA = multiBodyA ? 0 : &data.m_solverBodyPool->at(solverConstraint.m_solverBodyIdA);
+ btSolverBody* bodyB = multiBodyB ? 0 : &data.m_solverBodyPool->at(solverConstraint.m_solverBodyIdB);
+
+ btRigidBody* rb0 = multiBodyA ? 0 : bodyA->m_originalBody;
+ btRigidBody* rb1 = multiBodyB ? 0 : bodyB->m_originalBody;
+
+ btVector3 rel_pos1, rel_pos2; //these two used to be inited to posAworld and posBworld (respectively) but it does not seem necessary
+ if (bodyA)
+ rel_pos1 = posAworld - bodyA->getWorldTransform().getOrigin();
+ if (bodyB)
+ rel_pos2 = posBworld - bodyB->getWorldTransform().getOrigin();
+
+ if (multiBodyA)
+ {
+ if (solverConstraint.m_linkA < 0)
+ {
+ rel_pos1 = posAworld - multiBodyA->getBasePos();
+ }
+ else
+ {
+ rel_pos1 = posAworld - multiBodyA->getLink(solverConstraint.m_linkA).m_cachedWorldTransform.getOrigin();
+ }
+
+ const int ndofA = multiBodyA->getNumDofs() + 6;
+
+ solverConstraint.m_deltaVelAindex = multiBodyA->getCompanionId();
+
+ if (solverConstraint.m_deltaVelAindex < 0)
+ {
+ solverConstraint.m_deltaVelAindex = data.m_deltaVelocities.size();
+ multiBodyA->setCompanionId(solverConstraint.m_deltaVelAindex);
+ data.m_deltaVelocities.resize(data.m_deltaVelocities.size() + ndofA);
+ }
+ else
+ {
+ btAssert(data.m_deltaVelocities.size() >= solverConstraint.m_deltaVelAindex + ndofA);
+ }
+
+ //determine jacobian of this 1D constraint in terms of multibodyA's degrees of freedom
+ //resize..
+ solverConstraint.m_jacAindex = data.m_jacobians.size();
+ data.m_jacobians.resize(data.m_jacobians.size() + ndofA);
+ //copy/determine
+ if (jacOrgA)
+ {
+ for (int i = 0; i < ndofA; i++)
+ data.m_jacobians[solverConstraint.m_jacAindex + i] = jacOrgA[i];
+ }
+ else
+ {
+ btScalar* jac1 = &data.m_jacobians[solverConstraint.m_jacAindex];
+ //multiBodyA->fillContactJacobianMultiDof(solverConstraint.m_linkA, posAworld, constraintNormalLin, jac1, data.scratch_r, data.scratch_v, data.scratch_m);
+ multiBodyA->fillConstraintJacobianMultiDof(solverConstraint.m_linkA, posAworld, constraintNormalAng, constraintNormalLin, jac1, data.scratch_r, data.scratch_v, data.scratch_m);
+ }
+
+ //determine the velocity response of multibodyA to reaction impulses of this constraint (i.e. A[i,i] for i=1,...n_con: multibody's inverse inertia with respect to this 1D constraint)
+ //resize..
+ data.m_deltaVelocitiesUnitImpulse.resize(data.m_deltaVelocitiesUnitImpulse.size() + ndofA); //=> each constraint row has the constrained tree dofs allocated in m_deltaVelocitiesUnitImpulse
+ btAssert(data.m_jacobians.size() == data.m_deltaVelocitiesUnitImpulse.size());
+ btScalar* delta = &data.m_deltaVelocitiesUnitImpulse[solverConstraint.m_jacAindex];
+ //determine..
+ multiBodyA->calcAccelerationDeltasMultiDof(&data.m_jacobians[solverConstraint.m_jacAindex], delta, data.scratch_r, data.scratch_v);
+
+ btVector3 torqueAxis0;
+ if (angConstraint)
+ {
+ torqueAxis0 = constraintNormalAng;
+ }
+ else
+ {
+ torqueAxis0 = rel_pos1.cross(constraintNormalLin);
+ }
+ solverConstraint.m_relpos1CrossNormal = torqueAxis0;
+ solverConstraint.m_contactNormal1 = constraintNormalLin;
+ }
+ else //if(rb0)
+ {
+ btVector3 torqueAxis0;
+ if (angConstraint)
+ {
+ torqueAxis0 = constraintNormalAng;
+ }
+ else
+ {
+ torqueAxis0 = rel_pos1.cross(constraintNormalLin);
+ }
+ solverConstraint.m_angularComponentA = rb0 ? rb0->getInvInertiaTensorWorld() * torqueAxis0 * rb0->getAngularFactor() : btVector3(0, 0, 0);
+ solverConstraint.m_relpos1CrossNormal = torqueAxis0;
+ solverConstraint.m_contactNormal1 = constraintNormalLin;
+ }
+
+ if (multiBodyB)
+ {
+ if (solverConstraint.m_linkB < 0)
+ {
+ rel_pos2 = posBworld - multiBodyB->getBasePos();
+ }
+ else
+ {
+ rel_pos2 = posBworld - multiBodyB->getLink(solverConstraint.m_linkB).m_cachedWorldTransform.getOrigin();
+ }
+
+ const int ndofB = multiBodyB->getNumDofs() + 6;
+
+ solverConstraint.m_deltaVelBindex = multiBodyB->getCompanionId();
+ if (solverConstraint.m_deltaVelBindex < 0)
+ {
+ solverConstraint.m_deltaVelBindex = data.m_deltaVelocities.size();
+ multiBodyB->setCompanionId(solverConstraint.m_deltaVelBindex);
+ data.m_deltaVelocities.resize(data.m_deltaVelocities.size() + ndofB);
+ }
+
+ //determine jacobian of this 1D constraint in terms of multibodyB's degrees of freedom
+ //resize..
+ solverConstraint.m_jacBindex = data.m_jacobians.size();
+ data.m_jacobians.resize(data.m_jacobians.size() + ndofB);
+ //copy/determine..
+ if (jacOrgB)
+ {
+ for (int i = 0; i < ndofB; i++)
+ data.m_jacobians[solverConstraint.m_jacBindex + i] = jacOrgB[i];
+ }
+ else
+ {
+ //multiBodyB->fillContactJacobianMultiDof(solverConstraint.m_linkB, posBworld, -constraintNormalLin, &data.m_jacobians[solverConstraint.m_jacBindex], data.scratch_r, data.scratch_v, data.scratch_m);
+ multiBodyB->fillConstraintJacobianMultiDof(solverConstraint.m_linkB, posBworld, -constraintNormalAng, -constraintNormalLin, &data.m_jacobians[solverConstraint.m_jacBindex], data.scratch_r, data.scratch_v, data.scratch_m);
+ }
+
+ //determine velocity response of multibodyB to reaction impulses of this constraint (i.e. A[i,i] for i=1,...n_con: multibody's inverse inertia with respect to this 1D constraint)
+ //resize..
+ data.m_deltaVelocitiesUnitImpulse.resize(data.m_deltaVelocitiesUnitImpulse.size() + ndofB);
+ btAssert(data.m_jacobians.size() == data.m_deltaVelocitiesUnitImpulse.size());
+ btScalar* delta = &data.m_deltaVelocitiesUnitImpulse[solverConstraint.m_jacBindex];
+ //determine..
+ multiBodyB->calcAccelerationDeltasMultiDof(&data.m_jacobians[solverConstraint.m_jacBindex], delta, data.scratch_r, data.scratch_v);
+
+ btVector3 torqueAxis1;
+ if (angConstraint)
+ {
+ torqueAxis1 = constraintNormalAng;
+ }
+ else
+ {
+ torqueAxis1 = rel_pos2.cross(constraintNormalLin);
+ }
+ solverConstraint.m_relpos2CrossNormal = -torqueAxis1;
+ solverConstraint.m_contactNormal2 = -constraintNormalLin;
+ }
+ else //if(rb1)
+ {
+ btVector3 torqueAxis1;
+ if (angConstraint)
+ {
+ torqueAxis1 = constraintNormalAng;
+ }
+ else
+ {
+ torqueAxis1 = rel_pos2.cross(constraintNormalLin);
+ }
+ solverConstraint.m_angularComponentB = rb1 ? rb1->getInvInertiaTensorWorld() * -torqueAxis1 * rb1->getAngularFactor() : btVector3(0, 0, 0);
+ solverConstraint.m_relpos2CrossNormal = -torqueAxis1;
+ solverConstraint.m_contactNormal2 = -constraintNormalLin;
+ }
+ {
+ btVector3 vec;
+ btScalar denom0 = 0.f;
+ btScalar denom1 = 0.f;
+ btScalar* jacB = 0;
+ btScalar* jacA = 0;
+ btScalar* deltaVelA = 0;
+ btScalar* deltaVelB = 0;
+ int ndofA = 0;
+ //determine the "effective mass" of the constrained multibodyA with respect to this 1D constraint (i.e. 1/A[i,i])
+ if (multiBodyA)
+ {
+ ndofA = multiBodyA->getNumDofs() + 6;
+ jacA = &data.m_jacobians[solverConstraint.m_jacAindex];
+ deltaVelA = &data.m_deltaVelocitiesUnitImpulse[solverConstraint.m_jacAindex];
+ for (int i = 0; i < ndofA; ++i)
+ {
+ btScalar j = jacA[i];
+ btScalar l = deltaVelA[i];
+ denom0 += j * l;
+ }
+ }
+ else if (rb0)
+ {
+ vec = (solverConstraint.m_angularComponentA).cross(rel_pos1);
+ if (angConstraint)
+ {
denom0 = constraintNormalAng.dot(solverConstraint.m_angularComponentA);
- }
- else {
- denom0 = rb0->getInvMass() + constraintNormalLin.dot(vec);
- }
- }
- //
- if (multiBodyB)
- {
- const int ndofB = multiBodyB->getNumDofs() + 6;
- jacB = &data.m_jacobians[solverConstraint.m_jacBindex];
- deltaVelB = &data.m_deltaVelocitiesUnitImpulse[solverConstraint.m_jacBindex];
- for (int i = 0; i < ndofB; ++i)
- {
- btScalar j = jacB[i] ;
- btScalar l = deltaVelB[i];
- denom1 += j*l;
- }
-
- }
- else if(rb1)
- {
- vec = ( -solverConstraint.m_angularComponentB).cross(rel_pos2);
- if (angConstraint) {
+ }
+ else
+ {
+ denom0 = rb0->getInvMass() + constraintNormalLin.dot(vec);
+ }
+ }
+ //
+ if (multiBodyB)
+ {
+ const int ndofB = multiBodyB->getNumDofs() + 6;
+ jacB = &data.m_jacobians[solverConstraint.m_jacBindex];
+ deltaVelB = &data.m_deltaVelocitiesUnitImpulse[solverConstraint.m_jacBindex];
+ for (int i = 0; i < ndofB; ++i)
+ {
+ btScalar j = jacB[i];
+ btScalar l = deltaVelB[i];
+ denom1 += j * l;
+ }
+ }
+ else if (rb1)
+ {
+ vec = (-solverConstraint.m_angularComponentB).cross(rel_pos2);
+ if (angConstraint)
+ {
denom1 = constraintNormalAng.dot(-solverConstraint.m_angularComponentB);
- }
- else {
- denom1 = rb1->getInvMass() + constraintNormalLin.dot(vec);
- }
- }
-
- //
- btScalar d = denom0+denom1;
- if (d>SIMD_EPSILON)
- {
- solverConstraint.m_jacDiagABInv = relaxation/(d);
- }
- else
- {
- //disable the constraint row to handle singularity/redundant constraint
- solverConstraint.m_jacDiagABInv = 0.f;
- }
- }
-
-
- //compute rhs and remaining solverConstraint fields
- btScalar penetration = isFriction? 0 : posError;
-
- btScalar rel_vel = 0.f;
- int ndofA = 0;
- int ndofB = 0;
- {
- btVector3 vel1,vel2;
- if (multiBodyA)
- {
- ndofA = multiBodyA->getNumDofs() + 6;
- btScalar* jacA = &data.m_jacobians[solverConstraint.m_jacAindex];
- for (int i = 0; i < ndofA ; ++i)
- rel_vel += multiBodyA->getVelocityVector()[i] * jacA[i];
- }
- else if(rb0)
- {
+ }
+ else
+ {
+ denom1 = rb1->getInvMass() + constraintNormalLin.dot(vec);
+ }
+ }
+
+ //
+ btScalar d = denom0 + denom1;
+ if (d > SIMD_EPSILON)
+ {
+ solverConstraint.m_jacDiagABInv = relaxation / (d);
+ }
+ else
+ {
+ //disable the constraint row to handle singularity/redundant constraint
+ solverConstraint.m_jacDiagABInv = 0.f;
+ }
+ }
+
+ //compute rhs and remaining solverConstraint fields
+ btScalar penetration = isFriction ? 0 : posError;
+
+ btScalar rel_vel = 0.f;
+ int ndofA = 0;
+ int ndofB = 0;
+ {
+ btVector3 vel1, vel2;
+ if (multiBodyA)
+ {
+ ndofA = multiBodyA->getNumDofs() + 6;
+ btScalar* jacA = &data.m_jacobians[solverConstraint.m_jacAindex];
+ for (int i = 0; i < ndofA; ++i)
+ rel_vel += multiBodyA->getVelocityVector()[i] * jacA[i];
+ }
+ else if (rb0)
+ {
rel_vel += rb0->getLinearVelocity().dot(solverConstraint.m_contactNormal1);
rel_vel += rb0->getAngularVelocity().dot(solverConstraint.m_relpos1CrossNormal);
- }
- if (multiBodyB)
- {
- ndofB = multiBodyB->getNumDofs() + 6;
- btScalar* jacB = &data.m_jacobians[solverConstraint.m_jacBindex];
- for (int i = 0; i < ndofB ; ++i)
- rel_vel += multiBodyB->getVelocityVector()[i] * jacB[i];
-
- }
- else if(rb1)
- {
+ }
+ if (multiBodyB)
+ {
+ ndofB = multiBodyB->getNumDofs() + 6;
+ btScalar* jacB = &data.m_jacobians[solverConstraint.m_jacBindex];
+ for (int i = 0; i < ndofB; ++i)
+ rel_vel += multiBodyB->getVelocityVector()[i] * jacB[i];
+ }
+ else if (rb1)
+ {
rel_vel += rb1->getLinearVelocity().dot(solverConstraint.m_contactNormal2);
rel_vel += rb1->getAngularVelocity().dot(solverConstraint.m_relpos2CrossNormal);
- }
-
- solverConstraint.m_friction = 0.f;//cp.m_combinedFriction;
- }
-
-
- ///warm starting (or zero if disabled)
- /*
+ }
+
+ solverConstraint.m_friction = 0.f; //cp.m_combinedFriction;
+ }
+
+ ///warm starting (or zero if disabled)
+ /*
if (infoGlobal.m_solverMode & SOLVER_USE_WARMSTARTING)
{
solverConstraint.m_appliedImpulse = isFriction ? 0 : cp.m_appliedImpulse * infoGlobal.m_warmstartingFactor;
@@ -369,38 +375,35 @@ btScalar btMultiBodyConstraint::fillMultiBodyConstraint( btMultiBodySolverConstr
}
} else
*/
-
- solverConstraint.m_appliedImpulse = 0.f;
- solverConstraint.m_appliedPushImpulse = 0.f;
-
- {
-
- btScalar positionalError = 0.f;
- btScalar velocityError = desiredVelocity - rel_vel;// * damping;
-
-
- btScalar erp = infoGlobal.m_erp2;
-
+
+ solverConstraint.m_appliedImpulse = 0.f;
+ solverConstraint.m_appliedPushImpulse = 0.f;
+
+ {
+ btScalar positionalError = 0.f;
+ btScalar velocityError = desiredVelocity - rel_vel; // * damping;
+
+ btScalar erp = infoGlobal.m_erp2;
+
//split impulse is not implemented yet for btMultiBody*
//if (!infoGlobal.m_splitImpulse || (penetration > infoGlobal.m_splitImpulsePenetrationThreshold))
- {
- erp = infoGlobal.m_erp;
- }
-
- positionalError = -penetration * erp/infoGlobal.m_timeStep;
-
- btScalar penetrationImpulse = positionalError*solverConstraint.m_jacDiagABInv;
- btScalar velocityImpulse = velocityError *solverConstraint.m_jacDiagABInv;
-
+ {
+ erp = infoGlobal.m_erp;
+ }
+
+ positionalError = -penetration * erp / infoGlobal.m_timeStep;
+
+ btScalar penetrationImpulse = positionalError * solverConstraint.m_jacDiagABInv;
+ btScalar velocityImpulse = velocityError * solverConstraint.m_jacDiagABInv;
+
//split impulse is not implemented yet for btMultiBody*
- // if (!infoGlobal.m_splitImpulse || (penetration > infoGlobal.m_splitImpulsePenetrationThreshold))
- {
- //combine position and velocity into rhs
- solverConstraint.m_rhs = penetrationImpulse+velocityImpulse;
- solverConstraint.m_rhsPenetration = 0.f;
-
- }
+ // if (!infoGlobal.m_splitImpulse || (penetration > infoGlobal.m_splitImpulsePenetrationThreshold))
+ {
+ //combine position and velocity into rhs
+ solverConstraint.m_rhs = penetrationImpulse + velocityImpulse;
+ solverConstraint.m_rhsPenetration = 0.f;
+ }
/*else
{
//split position and velocity into rhs and m_rhsPenetration
@@ -409,11 +412,10 @@ btScalar btMultiBodyConstraint::fillMultiBodyConstraint( btMultiBodySolverConstr
}
*/
- solverConstraint.m_cfm = 0.f;
- solverConstraint.m_lowerLimit = lowerLimit;
- solverConstraint.m_upperLimit = upperLimit;
- }
-
- return rel_vel;
-
+ solverConstraint.m_cfm = 0.f;
+ solverConstraint.m_lowerLimit = lowerLimit;
+ solverConstraint.m_upperLimit = upperLimit;
+ }
+
+ return rel_vel;
}
diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyConstraint.h b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyConstraint.h
index a2ae571273..5c15f3e851 100644
--- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyConstraint.h
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyConstraint.h
@@ -27,66 +27,62 @@ struct btSolverInfo;
struct btMultiBodyJacobianData
{
- btAlignedObjectArray<btScalar> m_jacobians;
- btAlignedObjectArray<btScalar> m_deltaVelocitiesUnitImpulse; //holds the joint-space response of the corresp. tree to the test impulse in each constraint space dimension
- btAlignedObjectArray<btScalar> m_deltaVelocities; //holds joint-space vectors of all the constrained trees accumulating the effect of corrective impulses applied in SI
- btAlignedObjectArray<btScalar> scratch_r;
- btAlignedObjectArray<btVector3> scratch_v;
- btAlignedObjectArray<btMatrix3x3> scratch_m;
- btAlignedObjectArray<btSolverBody>* m_solverBodyPool;
- int m_fixedBodyId;
-
+ btAlignedObjectArray<btScalar> m_jacobians;
+ btAlignedObjectArray<btScalar> m_deltaVelocitiesUnitImpulse; //holds the joint-space response of the corresp. tree to the test impulse in each constraint space dimension
+ btAlignedObjectArray<btScalar> m_deltaVelocities; //holds joint-space vectors of all the constrained trees accumulating the effect of corrective impulses applied in SI
+ btAlignedObjectArray<btScalar> scratch_r;
+ btAlignedObjectArray<btVector3> scratch_v;
+ btAlignedObjectArray<btMatrix3x3> scratch_m;
+ btAlignedObjectArray<btSolverBody>* m_solverBodyPool;
+ int m_fixedBodyId;
};
-
-ATTRIBUTE_ALIGNED16(class) btMultiBodyConstraint
+ATTRIBUTE_ALIGNED16(class)
+btMultiBodyConstraint
{
protected:
-
- btMultiBody* m_bodyA;
- btMultiBody* m_bodyB;
- int m_linkA;
- int m_linkB;
-
- 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<btScalar> 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);
+ btMultiBody* m_bodyA;
+ btMultiBody* m_bodyB;
+ int m_linkA;
+ int m_linkB;
+
+ 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<btScalar> 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);
+ btMultiBodyConstraint(btMultiBody * bodyA, btMultiBody * bodyB, int linkA, int linkB, int numRows, bool isUnilateral);
virtual ~btMultiBodyConstraint();
void updateJacobianSizes();
@@ -94,27 +90,27 @@ public:
//many constraints have setFrameInB/setPivotInB. Will use 'getConstraintType' later.
virtual void setFrameInB(const btMatrix3x3& frameInB) {}
- virtual void setPivotInB(const btVector3& pivotInB){}
+ virtual void setPivotInB(const btVector3& pivotInB) {}
- virtual void finalizeMultiDof()=0;
+ virtual void finalizeMultiDof() = 0;
- virtual int getIslandIdA() const =0;
- virtual int getIslandIdB() const =0;
+ virtual int getIslandIdA() const = 0;
+ virtual int getIslandIdB() const = 0;
- virtual void createConstraintRows(btMultiBodyConstraintArray& constraintRows,
- btMultiBodyJacobianData& data,
- const btContactSolverInfo& infoGlobal)=0;
+ virtual void createConstraintRows(btMultiBodyConstraintArray & constraintRows,
+ btMultiBodyJacobianData & data,
+ const btContactSolverInfo& infoGlobal) = 0;
- int getNumRows() const
+ int getNumRows() const
{
return m_numRows;
}
- btMultiBody* getMultiBodyA()
+ btMultiBody* getMultiBodyA()
{
return m_bodyA;
}
- btMultiBody* getMultiBodyB()
+ btMultiBody* getMultiBodyB()
{
return m_bodyB;
}
@@ -127,77 +123,72 @@ public:
{
return m_linkB;
}
- void internalSetAppliedImpulse(int dof, btScalar appliedImpulse)
+ void internalSetAppliedImpulse(int dof, btScalar appliedImpulse)
{
- btAssert(dof>=0);
+ btAssert(dof >= 0);
btAssert(dof < getNumRows());
m_data[dof] = appliedImpulse;
-
}
-
- btScalar getAppliedImpulse(int dof)
+
+ btScalar getAppliedImpulse(int dof)
{
- btAssert(dof>=0);
+ 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
+ // 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)
+ 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)
+ // 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
+ const btScalar* jacobianA(int row) const
{
return &m_data[m_numRows + (row * m_jacSizeBoth)];
}
- btScalar* jacobianB(int row)
+ btScalar* jacobianB(int row)
{
return &m_data[m_numRows + (row * m_jacSizeBoth) + m_jacSizeA];
}
- const btScalar* jacobianB(int row) const
+ const btScalar* jacobianB(int row) const
{
return &m_data[m_numRows + (row * m_jacSizeBoth) + m_jacSizeA];
}
- btScalar getMaxAppliedImpulse() const
+ btScalar getMaxAppliedImpulse() const
{
return m_maxAppliedImpulse;
}
- void setMaxAppliedImpulse(btScalar maxImp)
+ void setMaxAppliedImpulse(btScalar maxImp)
{
m_maxAppliedImpulse = maxImp;
}
- virtual void debugDraw(class btIDebugDraw* drawer)=0;
+ 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){}
-
-
+ virtual void setRelativePositionTarget(btScalar relPosTarget) {}
+ virtual void setErp(btScalar erp) {}
};
-#endif //BT_MULTIBODY_CONSTRAINT_H
-
+#endif //BT_MULTIBODY_CONSTRAINT_H
diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyConstraintSolver.cpp b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyConstraintSolver.cpp
index cd84826e1a..e97bd71cc4 100644
--- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyConstraintSolver.cpp
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyConstraintSolver.cpp
@@ -13,7 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btMultiBodyConstraintSolver.h"
#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h"
#include "btMultiBodyLinkCollider.h"
@@ -24,33 +23,33 @@ subject to the following restrictions:
#include "LinearMath/btQuickprof.h"
-btScalar btMultiBodyConstraintSolver::solveSingleIteration(int iteration, btCollisionObject** bodies ,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer)
+btScalar btMultiBodyConstraintSolver::solveSingleIteration(int iteration, btCollisionObject** bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer)
{
- btScalar leastSquaredResidual = btSequentialImpulseConstraintSolver::solveSingleIteration(iteration, bodies ,numBodies,manifoldPtr, numManifolds,constraints,numConstraints,infoGlobal,debugDrawer);
-
+ btScalar leastSquaredResidual = btSequentialImpulseConstraintSolver::solveSingleIteration(iteration, bodies, numBodies, manifoldPtr, numManifolds, constraints, numConstraints, infoGlobal, debugDrawer);
+
//solve featherstone non-contact constraints
//printf("m_multiBodyNonContactConstraints = %d\n",m_multiBodyNonContactConstraints.size());
- for (int j=0;j<m_multiBodyNonContactConstraints.size();j++)
+ for (int j = 0; j < m_multiBodyNonContactConstraints.size(); j++)
{
- int index = iteration&1? j : m_multiBodyNonContactConstraints.size()-1-j;
+ int index = iteration & 1 ? j : m_multiBodyNonContactConstraints.size() - 1 - j;
btMultiBodySolverConstraint& constraint = m_multiBodyNonContactConstraints[index];
-
+
btScalar residual = resolveSingleConstraintRowGeneric(constraint);
- leastSquaredResidual = btMax(leastSquaredResidual,residual*residual);
+ leastSquaredResidual = btMax(leastSquaredResidual, residual * residual);
- if(constraint.m_multiBodyA)
+ if (constraint.m_multiBodyA)
constraint.m_multiBodyA->setPosUpdated(false);
- if(constraint.m_multiBodyB)
+ if (constraint.m_multiBodyB)
constraint.m_multiBodyB->setPosUpdated(false);
}
//solve featherstone normal contact
- for (int j0=0;j0<m_multiBodyNormalContactConstraints.size();j0++)
+ for (int j0 = 0; j0 < m_multiBodyNormalContactConstraints.size(); j0++)
{
- int index = j0;//iteration&1? j0 : m_multiBodyNormalContactConstraints.size()-1-j0;
+ int index = j0; //iteration&1? j0 : m_multiBodyNormalContactConstraints.size()-1-j0;
btMultiBodySolverConstraint& constraint = m_multiBodyNormalContactConstraints[index];
btScalar residual = 0.f;
@@ -60,32 +59,32 @@ btScalar btMultiBodyConstraintSolver::solveSingleIteration(int iteration, btColl
residual = resolveSingleConstraintRowGeneric(constraint);
}
- leastSquaredResidual = btMax(leastSquaredResidual,residual*residual);
-
- if(constraint.m_multiBodyA)
+ leastSquaredResidual = btMax(leastSquaredResidual, residual * residual);
+
+ if (constraint.m_multiBodyA)
constraint.m_multiBodyA->setPosUpdated(false);
- if(constraint.m_multiBodyB)
+ if (constraint.m_multiBodyB)
constraint.m_multiBodyB->setPosUpdated(false);
}
//solve featherstone frictional contact
- if (infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS && ((infoGlobal.m_solverMode&SOLVER_DISABLE_IMPLICIT_CONE_FRICTION) == 0))
+ if (infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS && ((infoGlobal.m_solverMode & SOLVER_DISABLE_IMPLICIT_CONE_FRICTION) == 0))
{
- for (int j1 = 0; j1<this->m_multiBodyTorsionalFrictionContactConstraints.size(); j1++)
+ for (int j1 = 0; j1 < this->m_multiBodyTorsionalFrictionContactConstraints.size(); j1++)
{
if (iteration < infoGlobal.m_numIterations)
{
- int index = j1;//iteration&1? j1 : m_multiBodyTorsionalFrictionContactConstraints.size()-1-j1;
+ int index = j1; //iteration&1? j1 : m_multiBodyTorsionalFrictionContactConstraints.size()-1-j1;
btMultiBodySolverConstraint& frictionConstraint = m_multiBodyTorsionalFrictionContactConstraints[index];
btScalar totalImpulse = m_multiBodyNormalContactConstraints[frictionConstraint.m_frictionIndex].m_appliedImpulse;
//adjust friction limits here
- if (totalImpulse>btScalar(0))
+ if (totalImpulse > btScalar(0))
{
- frictionConstraint.m_lowerLimit = -(frictionConstraint.m_friction*totalImpulse);
- frictionConstraint.m_upperLimit = frictionConstraint.m_friction*totalImpulse;
+ frictionConstraint.m_lowerLimit = -(frictionConstraint.m_friction * totalImpulse);
+ frictionConstraint.m_upperLimit = frictionConstraint.m_friction * totalImpulse;
btScalar residual = resolveSingleConstraintRowGeneric(frictionConstraint);
- leastSquaredResidual = btMax(leastSquaredResidual , residual*residual);
+ leastSquaredResidual = btMax(leastSquaredResidual, residual * residual);
if (frictionConstraint.m_multiBodyA)
frictionConstraint.m_multiBodyA->setPosUpdated(false);
@@ -99,29 +98,29 @@ btScalar btMultiBodyConstraintSolver::solveSingleIteration(int iteration, btColl
{
if (iteration < infoGlobal.m_numIterations)
{
- int index = j1;//iteration&1? j1 : m_multiBodyFrictionContactConstraints.size()-1-j1;
+ int index = j1; //iteration&1? j1 : m_multiBodyFrictionContactConstraints.size()-1-j1;
btMultiBodySolverConstraint& frictionConstraint = m_multiBodyFrictionContactConstraints[index];
btScalar totalImpulse = m_multiBodyNormalContactConstraints[frictionConstraint.m_frictionIndex].m_appliedImpulse;
j1++;
- int index2 = j1;//iteration&1? j1 : m_multiBodyFrictionContactConstraints.size()-1-j1;
+ int index2 = j1; //iteration&1? j1 : m_multiBodyFrictionContactConstraints.size()-1-j1;
btMultiBodySolverConstraint& frictionConstraintB = m_multiBodyFrictionContactConstraints[index2];
btAssert(frictionConstraint.m_frictionIndex == frictionConstraintB.m_frictionIndex);
if (frictionConstraint.m_frictionIndex == frictionConstraintB.m_frictionIndex)
{
- frictionConstraint.m_lowerLimit = -(frictionConstraint.m_friction*totalImpulse);
- frictionConstraint.m_upperLimit = frictionConstraint.m_friction*totalImpulse;
- frictionConstraintB.m_lowerLimit = -(frictionConstraintB.m_friction*totalImpulse);
- frictionConstraintB.m_upperLimit = frictionConstraintB.m_friction*totalImpulse;
+ frictionConstraint.m_lowerLimit = -(frictionConstraint.m_friction * totalImpulse);
+ frictionConstraint.m_upperLimit = frictionConstraint.m_friction * totalImpulse;
+ frictionConstraintB.m_lowerLimit = -(frictionConstraintB.m_friction * totalImpulse);
+ frictionConstraintB.m_upperLimit = frictionConstraintB.m_friction * totalImpulse;
btScalar residual = resolveConeFrictionConstraintRows(frictionConstraint, frictionConstraintB);
- leastSquaredResidual = btMax(leastSquaredResidual, residual*residual);
-
+ leastSquaredResidual = btMax(leastSquaredResidual, residual * residual);
+
if (frictionConstraintB.m_multiBodyA)
frictionConstraintB.m_multiBodyA->setPosUpdated(false);
if (frictionConstraintB.m_multiBodyB)
frictionConstraintB.m_multiBodyB->setPosUpdated(false);
-
+
if (frictionConstraint.m_multiBodyA)
frictionConstraint.m_multiBodyA->setPosUpdated(false);
if (frictionConstraint.m_multiBodyB)
@@ -129,26 +128,24 @@ btScalar btMultiBodyConstraintSolver::solveSingleIteration(int iteration, btColl
}
}
}
-
-
}
else
{
- for (int j1 = 0; j1<this->m_multiBodyFrictionContactConstraints.size(); j1++)
+ for (int j1 = 0; j1 < this->m_multiBodyFrictionContactConstraints.size(); j1++)
{
if (iteration < infoGlobal.m_numIterations)
{
- int index = j1;//iteration&1? j1 : m_multiBodyFrictionContactConstraints.size()-1-j1;
+ int index = j1; //iteration&1? j1 : m_multiBodyFrictionContactConstraints.size()-1-j1;
btMultiBodySolverConstraint& frictionConstraint = m_multiBodyFrictionContactConstraints[index];
btScalar totalImpulse = m_multiBodyNormalContactConstraints[frictionConstraint.m_frictionIndex].m_appliedImpulse;
//adjust friction limits here
- if (totalImpulse>btScalar(0))
+ if (totalImpulse > btScalar(0))
{
- frictionConstraint.m_lowerLimit = -(frictionConstraint.m_friction*totalImpulse);
- frictionConstraint.m_upperLimit = frictionConstraint.m_friction*totalImpulse;
+ frictionConstraint.m_lowerLimit = -(frictionConstraint.m_friction * totalImpulse);
+ frictionConstraint.m_upperLimit = frictionConstraint.m_friction * totalImpulse;
btScalar residual = resolveSingleConstraintRowGeneric(frictionConstraint);
- leastSquaredResidual = btMax(leastSquaredResidual, residual*residual);
+ leastSquaredResidual = btMax(leastSquaredResidual, residual * residual);
if (frictionConstraint.m_multiBodyA)
frictionConstraint.m_multiBodyA->setPosUpdated(false);
@@ -161,18 +158,18 @@ btScalar btMultiBodyConstraintSolver::solveSingleIteration(int iteration, btColl
return leastSquaredResidual;
}
-btScalar btMultiBodyConstraintSolver::solveGroupCacheFriendlySetup(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer)
+btScalar btMultiBodyConstraintSolver::solveGroupCacheFriendlySetup(btCollisionObject** bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer)
{
m_multiBodyNonContactConstraints.resize(0);
m_multiBodyNormalContactConstraints.resize(0);
m_multiBodyFrictionContactConstraints.resize(0);
m_multiBodyTorsionalFrictionContactConstraints.resize(0);
-
+
m_data.m_jacobians.resize(0);
m_data.m_deltaVelocitiesUnitImpulse.resize(0);
m_data.m_deltaVelocities.resize(0);
- for (int i=0;i<numBodies;i++)
+ for (int i = 0; i < numBodies; i++)
{
const btMultiBodyLinkCollider* fcA = btMultiBodyLinkCollider::upcast(bodies[i]);
if (fcA)
@@ -181,21 +178,20 @@ btScalar btMultiBodyConstraintSolver::solveGroupCacheFriendlySetup(btCollisionOb
}
}
- btScalar val = btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup( bodies,numBodies,manifoldPtr, numManifolds, constraints,numConstraints,infoGlobal,debugDrawer);
+ btScalar val = btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(bodies, numBodies, manifoldPtr, numManifolds, constraints, numConstraints, infoGlobal, debugDrawer);
return val;
}
-void btMultiBodyConstraintSolver::applyDeltaVee(btScalar* delta_vee, btScalar impulse, int velocityIndex, int ndof)
+void btMultiBodyConstraintSolver::applyDeltaVee(btScalar* delta_vee, btScalar impulse, int velocityIndex, int ndof)
{
- for (int i = 0; i < ndof; ++i)
- m_data.m_deltaVelocities[velocityIndex+i] += delta_vee[i] * impulse;
+ for (int i = 0; i < ndof; ++i)
+ m_data.m_deltaVelocities[velocityIndex + i] += delta_vee[i] * impulse;
}
btScalar btMultiBodyConstraintSolver::resolveSingleConstraintRowGeneric(const btMultiBodySolverConstraint& c)
{
-
- btScalar deltaImpulse = c.m_rhs - btScalar(c.m_appliedImpulse)*c.m_cfm;
+ btScalar deltaImpulse = c.m_rhs - btScalar(c.m_appliedImpulse) * c.m_cfm;
btScalar deltaVelADotn = 0;
btScalar deltaVelBDotn = 0;
btSolverBody* bodyA = 0;
@@ -227,9 +223,8 @@ btScalar btMultiBodyConstraintSolver::resolveSingleConstraintRowGeneric(const bt
deltaVelBDotn += c.m_contactNormal2.dot(bodyB->internalGetDeltaLinearVelocity()) + c.m_relpos2CrossNormal.dot(bodyB->internalGetDeltaAngularVelocity());
}
-
- deltaImpulse -= deltaVelADotn*c.m_jacDiagABInv;//m_jacDiagABInv = 1./denom
- deltaImpulse -= deltaVelBDotn*c.m_jacDiagABInv;
+ deltaImpulse -= deltaVelADotn * c.m_jacDiagABInv; //m_jacDiagABInv = 1./denom
+ deltaImpulse -= deltaVelBDotn * c.m_jacDiagABInv;
const btScalar sum = btScalar(c.m_appliedImpulse) + deltaImpulse;
if (sum < c.m_lowerLimit)
@@ -246,7 +241,7 @@ btScalar btMultiBodyConstraintSolver::resolveSingleConstraintRowGeneric(const bt
{
c.m_appliedImpulse = sum;
}
-
+
if (c.m_multiBodyA)
{
applyDeltaVee(&m_data.m_deltaVelocitiesUnitImpulse[c.m_jacAindex], deltaImpulse, c.m_deltaVelAindex, ndofA);
@@ -254,12 +249,11 @@ btScalar btMultiBodyConstraintSolver::resolveSingleConstraintRowGeneric(const bt
//note: update of the actual velocities (below) in the multibody does not have to happen now since m_deltaVelocities can be applied after all iterations
//it would make the multibody solver more like the regular one with m_deltaVelocities being equivalent to btSolverBody::m_deltaLinearVelocity/m_deltaAngularVelocity
c.m_multiBodyA->applyDeltaVeeMultiDof2(&m_data.m_deltaVelocitiesUnitImpulse[c.m_jacAindex], deltaImpulse);
-#endif //DIRECTLY_UPDATE_VELOCITY_DURING_SOLVER_ITERATIONS
+#endif //DIRECTLY_UPDATE_VELOCITY_DURING_SOLVER_ITERATIONS
}
else if (c.m_solverBodyIdA >= 0)
{
- bodyA->internalApplyImpulse(c.m_contactNormal1*bodyA->internalGetInvMass(), c.m_angularComponentA, deltaImpulse);
-
+ bodyA->internalApplyImpulse(c.m_contactNormal1 * bodyA->internalGetInvMass(), c.m_angularComponentA, deltaImpulse);
}
if (c.m_multiBodyB)
{
@@ -268,54 +262,54 @@ btScalar btMultiBodyConstraintSolver::resolveSingleConstraintRowGeneric(const bt
//note: update of the actual velocities (below) in the multibody does not have to happen now since m_deltaVelocities can be applied after all iterations
//it would make the multibody solver more like the regular one with m_deltaVelocities being equivalent to btSolverBody::m_deltaLinearVelocity/m_deltaAngularVelocity
c.m_multiBodyB->applyDeltaVeeMultiDof2(&m_data.m_deltaVelocitiesUnitImpulse[c.m_jacBindex], deltaImpulse);
-#endif //DIRECTLY_UPDATE_VELOCITY_DURING_SOLVER_ITERATIONS
+#endif //DIRECTLY_UPDATE_VELOCITY_DURING_SOLVER_ITERATIONS
}
else if (c.m_solverBodyIdB >= 0)
{
- bodyB->internalApplyImpulse(c.m_contactNormal2*bodyB->internalGetInvMass(), c.m_angularComponentB, deltaImpulse);
+ bodyB->internalApplyImpulse(c.m_contactNormal2 * bodyB->internalGetInvMass(), c.m_angularComponentB, deltaImpulse);
}
- btScalar deltaVel =deltaImpulse/c.m_jacDiagABInv;
+ btScalar deltaVel = deltaImpulse / c.m_jacDiagABInv;
return deltaVel;
}
-
-btScalar btMultiBodyConstraintSolver::resolveConeFrictionConstraintRows(const btMultiBodySolverConstraint& cA1,const btMultiBodySolverConstraint& cB)
+btScalar btMultiBodyConstraintSolver::resolveConeFrictionConstraintRows(const btMultiBodySolverConstraint& cA1, const btMultiBodySolverConstraint& cB)
{
- int ndofA=0;
- int ndofB=0;
+ int ndofA = 0;
+ int ndofB = 0;
btSolverBody* bodyA = 0;
btSolverBody* bodyB = 0;
btScalar deltaImpulseB = 0.f;
btScalar sumB = 0.f;
{
- deltaImpulseB = cB.m_rhs-btScalar(cB.m_appliedImpulse)*cB.m_cfm;
- btScalar deltaVelADotn=0;
- btScalar deltaVelBDotn=0;
+ deltaImpulseB = cB.m_rhs - btScalar(cB.m_appliedImpulse) * cB.m_cfm;
+ btScalar deltaVelADotn = 0;
+ btScalar deltaVelBDotn = 0;
if (cB.m_multiBodyA)
{
- ndofA = cB.m_multiBodyA->getNumDofs() + 6;
- for (int i = 0; i < ndofA; ++i)
- deltaVelADotn += m_data.m_jacobians[cB.m_jacAindex+i] * m_data.m_deltaVelocities[cB.m_deltaVelAindex+i];
- } else if(cB.m_solverBodyIdA >= 0)
+ ndofA = cB.m_multiBodyA->getNumDofs() + 6;
+ for (int i = 0; i < ndofA; ++i)
+ deltaVelADotn += m_data.m_jacobians[cB.m_jacAindex + i] * m_data.m_deltaVelocities[cB.m_deltaVelAindex + i];
+ }
+ else if (cB.m_solverBodyIdA >= 0)
{
bodyA = &m_tmpSolverBodyPool[cB.m_solverBodyIdA];
- deltaVelADotn += cB.m_contactNormal1.dot(bodyA->internalGetDeltaLinearVelocity()) + cB.m_relpos1CrossNormal.dot(bodyA->internalGetDeltaAngularVelocity());
+ deltaVelADotn += cB.m_contactNormal1.dot(bodyA->internalGetDeltaLinearVelocity()) + cB.m_relpos1CrossNormal.dot(bodyA->internalGetDeltaAngularVelocity());
}
if (cB.m_multiBodyB)
{
- ndofB = cB.m_multiBodyB->getNumDofs() + 6;
- for (int i = 0; i < ndofB; ++i)
- deltaVelBDotn += m_data.m_jacobians[cB.m_jacBindex+i] * m_data.m_deltaVelocities[cB.m_deltaVelBindex+i];
- } else if(cB.m_solverBodyIdB >= 0)
+ ndofB = cB.m_multiBodyB->getNumDofs() + 6;
+ for (int i = 0; i < ndofB; ++i)
+ deltaVelBDotn += m_data.m_jacobians[cB.m_jacBindex + i] * m_data.m_deltaVelocities[cB.m_deltaVelBindex + i];
+ }
+ else if (cB.m_solverBodyIdB >= 0)
{
bodyB = &m_tmpSolverBodyPool[cB.m_solverBodyIdB];
- deltaVelBDotn += cB.m_contactNormal2.dot(bodyB->internalGetDeltaLinearVelocity()) + cB.m_relpos2CrossNormal.dot(bodyB->internalGetDeltaAngularVelocity());
+ deltaVelBDotn += cB.m_contactNormal2.dot(bodyB->internalGetDeltaLinearVelocity()) + cB.m_relpos2CrossNormal.dot(bodyB->internalGetDeltaAngularVelocity());
}
-
- deltaImpulseB -= deltaVelADotn*cB.m_jacDiagABInv;//m_jacDiagABInv = 1./denom
- deltaImpulseB -= deltaVelBDotn*cB.m_jacDiagABInv;
+ deltaImpulseB -= deltaVelADotn * cB.m_jacDiagABInv; //m_jacDiagABInv = 1./denom
+ deltaImpulseB -= deltaVelBDotn * cB.m_jacDiagABInv;
sumB = btScalar(cB.m_appliedImpulse) + deltaImpulseB;
}
@@ -324,45 +318,45 @@ btScalar btMultiBodyConstraintSolver::resolveConeFrictionConstraintRows(const bt
const btMultiBodySolverConstraint& cA = cA1;
{
{
- deltaImpulseA = cA.m_rhs-btScalar(cA.m_appliedImpulse)*cA.m_cfm;
- btScalar deltaVelADotn=0;
- btScalar deltaVelBDotn=0;
+ deltaImpulseA = cA.m_rhs - btScalar(cA.m_appliedImpulse) * cA.m_cfm;
+ btScalar deltaVelADotn = 0;
+ btScalar deltaVelBDotn = 0;
if (cA.m_multiBodyA)
{
- ndofA = cA.m_multiBodyA->getNumDofs() + 6;
- for (int i = 0; i < ndofA; ++i)
- deltaVelADotn += m_data.m_jacobians[cA.m_jacAindex+i] * m_data.m_deltaVelocities[cA.m_deltaVelAindex+i];
- } else if(cA.m_solverBodyIdA >= 0)
+ ndofA = cA.m_multiBodyA->getNumDofs() + 6;
+ for (int i = 0; i < ndofA; ++i)
+ deltaVelADotn += m_data.m_jacobians[cA.m_jacAindex + i] * m_data.m_deltaVelocities[cA.m_deltaVelAindex + i];
+ }
+ else if (cA.m_solverBodyIdA >= 0)
{
bodyA = &m_tmpSolverBodyPool[cA.m_solverBodyIdA];
- deltaVelADotn += cA.m_contactNormal1.dot(bodyA->internalGetDeltaLinearVelocity()) + cA.m_relpos1CrossNormal.dot(bodyA->internalGetDeltaAngularVelocity());
+ deltaVelADotn += cA.m_contactNormal1.dot(bodyA->internalGetDeltaLinearVelocity()) + cA.m_relpos1CrossNormal.dot(bodyA->internalGetDeltaAngularVelocity());
}
if (cA.m_multiBodyB)
{
- ndofB = cA.m_multiBodyB->getNumDofs() + 6;
- for (int i = 0; i < ndofB; ++i)
- deltaVelBDotn += m_data.m_jacobians[cA.m_jacBindex+i] * m_data.m_deltaVelocities[cA.m_deltaVelBindex+i];
- } else if(cA.m_solverBodyIdB >= 0)
+ ndofB = cA.m_multiBodyB->getNumDofs() + 6;
+ for (int i = 0; i < ndofB; ++i)
+ deltaVelBDotn += m_data.m_jacobians[cA.m_jacBindex + i] * m_data.m_deltaVelocities[cA.m_deltaVelBindex + i];
+ }
+ else if (cA.m_solverBodyIdB >= 0)
{
bodyB = &m_tmpSolverBodyPool[cA.m_solverBodyIdB];
- deltaVelBDotn += cA.m_contactNormal2.dot(bodyB->internalGetDeltaLinearVelocity()) + cA.m_relpos2CrossNormal.dot(bodyB->internalGetDeltaAngularVelocity());
+ deltaVelBDotn += cA.m_contactNormal2.dot(bodyB->internalGetDeltaLinearVelocity()) + cA.m_relpos2CrossNormal.dot(bodyB->internalGetDeltaAngularVelocity());
}
-
- deltaImpulseA -= deltaVelADotn*cA.m_jacDiagABInv;//m_jacDiagABInv = 1./denom
- deltaImpulseA -= deltaVelBDotn*cA.m_jacDiagABInv;
+ deltaImpulseA -= deltaVelADotn * cA.m_jacDiagABInv; //m_jacDiagABInv = 1./denom
+ deltaImpulseA -= deltaVelBDotn * cA.m_jacDiagABInv;
sumA = btScalar(cA.m_appliedImpulse) + deltaImpulseA;
}
}
- if (sumA*sumA+sumB*sumB>=cA.m_lowerLimit*cB.m_lowerLimit)
+ if (sumA * sumA + sumB * sumB >= cA.m_lowerLimit * cB.m_lowerLimit)
{
- btScalar angle = btAtan2(sumA,sumB);
- btScalar sumAclipped = btFabs(cA.m_lowerLimit*btSin(angle));
- btScalar sumBclipped = btFabs(cB.m_lowerLimit*btCos(angle));
+ btScalar angle = btAtan2(sumA, sumB);
+ btScalar sumAclipped = btFabs(cA.m_lowerLimit * btSin(angle));
+ btScalar sumBclipped = btFabs(cB.m_lowerLimit * btCos(angle));
-
if (sumA < -sumAclipped)
{
deltaImpulseA = -sumAclipped - cA.m_appliedImpulse;
@@ -396,78 +390,77 @@ btScalar btMultiBodyConstraintSolver::resolveConeFrictionConstraintRows(const bt
//cA.m_appliedImpulse = sumAclipped;
//deltaImpulseB = sumBclipped-cB.m_appliedImpulse;
//cB.m_appliedImpulse = sumBclipped;
- }
+ }
else
{
cA.m_appliedImpulse = sumA;
cB.m_appliedImpulse = sumB;
}
-
+
if (cA.m_multiBodyA)
{
- applyDeltaVee(&m_data.m_deltaVelocitiesUnitImpulse[cA.m_jacAindex],deltaImpulseA,cA.m_deltaVelAindex,ndofA);
+ applyDeltaVee(&m_data.m_deltaVelocitiesUnitImpulse[cA.m_jacAindex], deltaImpulseA, cA.m_deltaVelAindex, ndofA);
#ifdef DIRECTLY_UPDATE_VELOCITY_DURING_SOLVER_ITERATIONS
//note: update of the actual velocities (below) in the multibody does not have to happen now since m_deltaVelocities can be applied after all iterations
//it would make the multibody solver more like the regular one with m_deltaVelocities being equivalent to btSolverBody::m_deltaLinearVelocity/m_deltaAngularVelocity
- cA.m_multiBodyA->applyDeltaVeeMultiDof2(&m_data.m_deltaVelocitiesUnitImpulse[cA.m_jacAindex],deltaImpulseA);
-#endif //DIRECTLY_UPDATE_VELOCITY_DURING_SOLVER_ITERATIONS
- } else if(cA.m_solverBodyIdA >= 0)
+ cA.m_multiBodyA->applyDeltaVeeMultiDof2(&m_data.m_deltaVelocitiesUnitImpulse[cA.m_jacAindex], deltaImpulseA);
+#endif //DIRECTLY_UPDATE_VELOCITY_DURING_SOLVER_ITERATIONS
+ }
+ else if (cA.m_solverBodyIdA >= 0)
{
- bodyA->internalApplyImpulse(cA.m_contactNormal1*bodyA->internalGetInvMass(),cA.m_angularComponentA,deltaImpulseA);
-
+ bodyA->internalApplyImpulse(cA.m_contactNormal1 * bodyA->internalGetInvMass(), cA.m_angularComponentA, deltaImpulseA);
}
if (cA.m_multiBodyB)
{
- applyDeltaVee(&m_data.m_deltaVelocitiesUnitImpulse[cA.m_jacBindex],deltaImpulseA,cA.m_deltaVelBindex,ndofB);
+ applyDeltaVee(&m_data.m_deltaVelocitiesUnitImpulse[cA.m_jacBindex], deltaImpulseA, cA.m_deltaVelBindex, ndofB);
#ifdef DIRECTLY_UPDATE_VELOCITY_DURING_SOLVER_ITERATIONS
//note: update of the actual velocities (below) in the multibody does not have to happen now since m_deltaVelocities can be applied after all iterations
//it would make the multibody solver more like the regular one with m_deltaVelocities being equivalent to btSolverBody::m_deltaLinearVelocity/m_deltaAngularVelocity
- cA.m_multiBodyB->applyDeltaVeeMultiDof2(&m_data.m_deltaVelocitiesUnitImpulse[cA.m_jacBindex],deltaImpulseA);
-#endif //DIRECTLY_UPDATE_VELOCITY_DURING_SOLVER_ITERATIONS
- } else if(cA.m_solverBodyIdB >= 0)
+ cA.m_multiBodyB->applyDeltaVeeMultiDof2(&m_data.m_deltaVelocitiesUnitImpulse[cA.m_jacBindex], deltaImpulseA);
+#endif //DIRECTLY_UPDATE_VELOCITY_DURING_SOLVER_ITERATIONS
+ }
+ else if (cA.m_solverBodyIdB >= 0)
{
- bodyB->internalApplyImpulse(cA.m_contactNormal2*bodyB->internalGetInvMass(),cA.m_angularComponentB,deltaImpulseA);
+ bodyB->internalApplyImpulse(cA.m_contactNormal2 * bodyB->internalGetInvMass(), cA.m_angularComponentB, deltaImpulseA);
}
if (cB.m_multiBodyA)
{
- applyDeltaVee(&m_data.m_deltaVelocitiesUnitImpulse[cB.m_jacAindex],deltaImpulseB,cB.m_deltaVelAindex,ndofA);
+ applyDeltaVee(&m_data.m_deltaVelocitiesUnitImpulse[cB.m_jacAindex], deltaImpulseB, cB.m_deltaVelAindex, ndofA);
#ifdef DIRECTLY_UPDATE_VELOCITY_DURING_SOLVER_ITERATIONS
//note: update of the actual velocities (below) in the multibody does not have to happen now since m_deltaVelocities can be applied after all iterations
//it would make the multibody solver more like the regular one with m_deltaVelocities being equivalent to btSolverBody::m_deltaLinearVelocity/m_deltaAngularVelocity
- cB.m_multiBodyA->applyDeltaVeeMultiDof2(&m_data.m_deltaVelocitiesUnitImpulse[cB.m_jacAindex],deltaImpulseB);
-#endif //DIRECTLY_UPDATE_VELOCITY_DURING_SOLVER_ITERATIONS
- } else if(cB.m_solverBodyIdA >= 0)
+ cB.m_multiBodyA->applyDeltaVeeMultiDof2(&m_data.m_deltaVelocitiesUnitImpulse[cB.m_jacAindex], deltaImpulseB);
+#endif //DIRECTLY_UPDATE_VELOCITY_DURING_SOLVER_ITERATIONS
+ }
+ else if (cB.m_solverBodyIdA >= 0)
{
- bodyA->internalApplyImpulse(cB.m_contactNormal1*bodyA->internalGetInvMass(),cB.m_angularComponentA,deltaImpulseB);
+ bodyA->internalApplyImpulse(cB.m_contactNormal1 * bodyA->internalGetInvMass(), cB.m_angularComponentA, deltaImpulseB);
}
if (cB.m_multiBodyB)
{
- applyDeltaVee(&m_data.m_deltaVelocitiesUnitImpulse[cB.m_jacBindex],deltaImpulseB,cB.m_deltaVelBindex,ndofB);
+ applyDeltaVee(&m_data.m_deltaVelocitiesUnitImpulse[cB.m_jacBindex], deltaImpulseB, cB.m_deltaVelBindex, ndofB);
#ifdef DIRECTLY_UPDATE_VELOCITY_DURING_SOLVER_ITERATIONS
//note: update of the actual velocities (below) in the multibody does not have to happen now since m_deltaVelocities can be applied after all iterations
//it would make the multibody solver more like the regular one with m_deltaVelocities being equivalent to btSolverBody::m_deltaLinearVelocity/m_deltaAngularVelocity
- cB.m_multiBodyB->applyDeltaVeeMultiDof2(&m_data.m_deltaVelocitiesUnitImpulse[cB.m_jacBindex],deltaImpulseB);
-#endif //DIRECTLY_UPDATE_VELOCITY_DURING_SOLVER_ITERATIONS
- } else if(cB.m_solverBodyIdB >= 0)
+ cB.m_multiBodyB->applyDeltaVeeMultiDof2(&m_data.m_deltaVelocitiesUnitImpulse[cB.m_jacBindex], deltaImpulseB);
+#endif //DIRECTLY_UPDATE_VELOCITY_DURING_SOLVER_ITERATIONS
+ }
+ else if (cB.m_solverBodyIdB >= 0)
{
- bodyB->internalApplyImpulse(cB.m_contactNormal2*bodyB->internalGetInvMass(),cB.m_angularComponentB,deltaImpulseB);
+ bodyB->internalApplyImpulse(cB.m_contactNormal2 * bodyB->internalGetInvMass(), cB.m_angularComponentB, deltaImpulseB);
}
- btScalar deltaVel =deltaImpulseA/cA.m_jacDiagABInv+deltaImpulseB/cB.m_jacDiagABInv;
- return deltaVel;
+ btScalar deltaVel = deltaImpulseA / cA.m_jacDiagABInv + deltaImpulseB / cB.m_jacDiagABInv;
+ return deltaVel;
}
-
-
-
-void btMultiBodyConstraintSolver::setupMultiBodyContactConstraint(btMultiBodySolverConstraint& solverConstraint,
- const btVector3& contactNormal,
- btManifoldPoint& cp, const btContactSolverInfo& infoGlobal,
- btScalar& relaxation,
- bool isFriction, btScalar desiredVelocity, btScalar cfmSlip)
+void btMultiBodyConstraintSolver::setupMultiBodyContactConstraint(btMultiBodySolverConstraint& solverConstraint,
+ const btVector3& contactNormal,
+ btManifoldPoint& cp, const btContactSolverInfo& infoGlobal,
+ btScalar& relaxation,
+ bool isFriction, btScalar desiredVelocity, btScalar cfmSlip)
{
-
BT_PROFILE("setupMultiBodyContactConstraint");
btVector3 rel_pos1;
btVector3 rel_pos2;
@@ -485,44 +478,46 @@ void btMultiBodyConstraintSolver::setupMultiBodyContactConstraint(btMultiBodySol
btRigidBody* rb1 = multiBodyB ? 0 : bodyB->m_originalBody;
if (bodyA)
- rel_pos1 = pos1 - bodyA->getWorldTransform().getOrigin();
+ rel_pos1 = pos1 - bodyA->getWorldTransform().getOrigin();
if (bodyB)
rel_pos2 = pos2 - bodyB->getWorldTransform().getOrigin();
relaxation = infoGlobal.m_sor;
-
- btScalar invTimeStep = btScalar(1)/infoGlobal.m_timeStep;
-
- //cfm = 1 / ( dt * kp + kd )
- //erp = dt * kp / ( dt * kp + kd )
-
- btScalar cfm;
+
+ btScalar invTimeStep = btScalar(1) / infoGlobal.m_timeStep;
+
+ //cfm = 1 / ( dt * kp + kd )
+ //erp = dt * kp / ( dt * kp + kd )
+
+ btScalar cfm;
btScalar erp;
if (isFriction)
{
cfm = infoGlobal.m_frictionCFM;
erp = infoGlobal.m_frictionERP;
- } else
+ }
+ else
{
cfm = infoGlobal.m_globalCfm;
erp = infoGlobal.m_erp2;
- if ((cp.m_contactPointFlags&BT_CONTACT_FLAG_HAS_CONTACT_CFM) || (cp.m_contactPointFlags&BT_CONTACT_FLAG_HAS_CONTACT_ERP))
+ if ((cp.m_contactPointFlags & BT_CONTACT_FLAG_HAS_CONTACT_CFM) || (cp.m_contactPointFlags & BT_CONTACT_FLAG_HAS_CONTACT_ERP))
{
- if (cp.m_contactPointFlags&BT_CONTACT_FLAG_HAS_CONTACT_CFM)
- cfm = cp.m_contactCFM;
- if (cp.m_contactPointFlags&BT_CONTACT_FLAG_HAS_CONTACT_ERP)
- erp = cp.m_contactERP;
- } else
+ if (cp.m_contactPointFlags & BT_CONTACT_FLAG_HAS_CONTACT_CFM)
+ cfm = cp.m_contactCFM;
+ if (cp.m_contactPointFlags & BT_CONTACT_FLAG_HAS_CONTACT_ERP)
+ erp = cp.m_contactERP;
+ }
+ else
{
if (cp.m_contactPointFlags & BT_CONTACT_FLAG_CONTACT_STIFFNESS_DAMPING)
{
- btScalar denom = ( infoGlobal.m_timeStep * cp.m_combinedContactStiffness1 + cp.m_combinedContactDamping1 );
+ btScalar denom = (infoGlobal.m_timeStep * cp.m_combinedContactStiffness1 + cp.m_combinedContactDamping1);
if (denom < SIMD_EPSILON)
{
denom = SIMD_EPSILON;
}
- cfm = btScalar(1) / denom;
+ cfm = btScalar(1) / denom;
erp = (infoGlobal.m_timeStep * cp.m_combinedContactStiffness1) / denom;
}
}
@@ -532,218 +527,217 @@ void btMultiBodyConstraintSolver::setupMultiBodyContactConstraint(btMultiBodySol
if (multiBodyA)
{
- if (solverConstraint.m_linkA<0)
+ if (solverConstraint.m_linkA < 0)
{
rel_pos1 = pos1 - multiBodyA->getBasePos();
- } else
+ }
+ else
{
rel_pos1 = pos1 - multiBodyA->getLink(solverConstraint.m_linkA).m_cachedWorldTransform.getOrigin();
}
- const int ndofA = multiBodyA->getNumDofs() + 6;
+ const int ndofA = multiBodyA->getNumDofs() + 6;
solverConstraint.m_deltaVelAindex = multiBodyA->getCompanionId();
- if (solverConstraint.m_deltaVelAindex <0)
+ if (solverConstraint.m_deltaVelAindex < 0)
{
solverConstraint.m_deltaVelAindex = m_data.m_deltaVelocities.size();
multiBodyA->setCompanionId(solverConstraint.m_deltaVelAindex);
- m_data.m_deltaVelocities.resize(m_data.m_deltaVelocities.size()+ndofA);
- } else
+ m_data.m_deltaVelocities.resize(m_data.m_deltaVelocities.size() + ndofA);
+ }
+ else
{
- btAssert(m_data.m_deltaVelocities.size() >= solverConstraint.m_deltaVelAindex+ndofA);
+ btAssert(m_data.m_deltaVelocities.size() >= solverConstraint.m_deltaVelAindex + ndofA);
}
solverConstraint.m_jacAindex = m_data.m_jacobians.size();
- m_data.m_jacobians.resize(m_data.m_jacobians.size()+ndofA);
- m_data.m_deltaVelocitiesUnitImpulse.resize(m_data.m_deltaVelocitiesUnitImpulse.size()+ndofA);
+ m_data.m_jacobians.resize(m_data.m_jacobians.size() + ndofA);
+ m_data.m_deltaVelocitiesUnitImpulse.resize(m_data.m_deltaVelocitiesUnitImpulse.size() + ndofA);
btAssert(m_data.m_jacobians.size() == m_data.m_deltaVelocitiesUnitImpulse.size());
- btScalar* jac1=&m_data.m_jacobians[solverConstraint.m_jacAindex];
+ btScalar* jac1 = &m_data.m_jacobians[solverConstraint.m_jacAindex];
multiBodyA->fillContactJacobianMultiDof(solverConstraint.m_linkA, cp.getPositionWorldOnA(), contactNormal, jac1, m_data.scratch_r, m_data.scratch_v, m_data.scratch_m);
btScalar* delta = &m_data.m_deltaVelocitiesUnitImpulse[solverConstraint.m_jacAindex];
- multiBodyA->calcAccelerationDeltasMultiDof(&m_data.m_jacobians[solverConstraint.m_jacAindex],delta,m_data.scratch_r, m_data.scratch_v);
+ multiBodyA->calcAccelerationDeltasMultiDof(&m_data.m_jacobians[solverConstraint.m_jacAindex], delta, m_data.scratch_r, m_data.scratch_v);
btVector3 torqueAxis0 = rel_pos1.cross(contactNormal);
solverConstraint.m_relpos1CrossNormal = torqueAxis0;
solverConstraint.m_contactNormal1 = contactNormal;
- } else
+ }
+ else
{
btVector3 torqueAxis0 = rel_pos1.cross(contactNormal);
solverConstraint.m_relpos1CrossNormal = torqueAxis0;
solverConstraint.m_contactNormal1 = contactNormal;
- solverConstraint.m_angularComponentA = rb0 ? rb0->getInvInertiaTensorWorld()*torqueAxis0*rb0->getAngularFactor() : btVector3(0,0,0);
+ solverConstraint.m_angularComponentA = rb0 ? rb0->getInvInertiaTensorWorld() * torqueAxis0 * rb0->getAngularFactor() : btVector3(0, 0, 0);
}
-
-
if (multiBodyB)
{
- if (solverConstraint.m_linkB<0)
+ if (solverConstraint.m_linkB < 0)
{
rel_pos2 = pos2 - multiBodyB->getBasePos();
- } else
+ }
+ else
{
rel_pos2 = pos2 - multiBodyB->getLink(solverConstraint.m_linkB).m_cachedWorldTransform.getOrigin();
}
- const int ndofB = multiBodyB->getNumDofs() + 6;
+ const int ndofB = multiBodyB->getNumDofs() + 6;
solverConstraint.m_deltaVelBindex = multiBodyB->getCompanionId();
- if (solverConstraint.m_deltaVelBindex <0)
+ if (solverConstraint.m_deltaVelBindex < 0)
{
solverConstraint.m_deltaVelBindex = m_data.m_deltaVelocities.size();
multiBodyB->setCompanionId(solverConstraint.m_deltaVelBindex);
- m_data.m_deltaVelocities.resize(m_data.m_deltaVelocities.size()+ndofB);
+ m_data.m_deltaVelocities.resize(m_data.m_deltaVelocities.size() + ndofB);
}
solverConstraint.m_jacBindex = m_data.m_jacobians.size();
- m_data.m_jacobians.resize(m_data.m_jacobians.size()+ndofB);
- m_data.m_deltaVelocitiesUnitImpulse.resize(m_data.m_deltaVelocitiesUnitImpulse.size()+ndofB);
+ m_data.m_jacobians.resize(m_data.m_jacobians.size() + ndofB);
+ m_data.m_deltaVelocitiesUnitImpulse.resize(m_data.m_deltaVelocitiesUnitImpulse.size() + ndofB);
btAssert(m_data.m_jacobians.size() == m_data.m_deltaVelocitiesUnitImpulse.size());
multiBodyB->fillContactJacobianMultiDof(solverConstraint.m_linkB, cp.getPositionWorldOnB(), -contactNormal, &m_data.m_jacobians[solverConstraint.m_jacBindex], m_data.scratch_r, m_data.scratch_v, m_data.scratch_m);
- multiBodyB->calcAccelerationDeltasMultiDof(&m_data.m_jacobians[solverConstraint.m_jacBindex],&m_data.m_deltaVelocitiesUnitImpulse[solverConstraint.m_jacBindex],m_data.scratch_r, m_data.scratch_v);
-
- btVector3 torqueAxis1 = rel_pos2.cross(contactNormal);
+ multiBodyB->calcAccelerationDeltasMultiDof(&m_data.m_jacobians[solverConstraint.m_jacBindex], &m_data.m_deltaVelocitiesUnitImpulse[solverConstraint.m_jacBindex], m_data.scratch_r, m_data.scratch_v);
+
+ btVector3 torqueAxis1 = rel_pos2.cross(contactNormal);
solverConstraint.m_relpos2CrossNormal = -torqueAxis1;
solverConstraint.m_contactNormal2 = -contactNormal;
-
- } else
+ }
+ else
{
- btVector3 torqueAxis1 = rel_pos2.cross(contactNormal);
+ btVector3 torqueAxis1 = rel_pos2.cross(contactNormal);
solverConstraint.m_relpos2CrossNormal = -torqueAxis1;
solverConstraint.m_contactNormal2 = -contactNormal;
-
- solverConstraint.m_angularComponentB = rb1 ? rb1->getInvInertiaTensorWorld()*-torqueAxis1*rb1->getAngularFactor() : btVector3(0,0,0);
+
+ solverConstraint.m_angularComponentB = rb1 ? rb1->getInvInertiaTensorWorld() * -torqueAxis1 * rb1->getAngularFactor() : btVector3(0, 0, 0);
}
{
-
btVector3 vec;
btScalar denom0 = 0.f;
btScalar denom1 = 0.f;
btScalar* jacB = 0;
btScalar* jacA = 0;
- btScalar* lambdaA =0;
- btScalar* lambdaB =0;
- int ndofA = 0;
+ btScalar* lambdaA = 0;
+ btScalar* lambdaB = 0;
+ int ndofA = 0;
if (multiBodyA)
{
- ndofA = multiBodyA->getNumDofs() + 6;
+ ndofA = multiBodyA->getNumDofs() + 6;
jacA = &m_data.m_jacobians[solverConstraint.m_jacAindex];
lambdaA = &m_data.m_deltaVelocitiesUnitImpulse[solverConstraint.m_jacAindex];
for (int i = 0; i < ndofA; ++i)
{
- btScalar j = jacA[i] ;
- btScalar l =lambdaA[i];
- denom0 += j*l;
+ btScalar j = jacA[i];
+ btScalar l = lambdaA[i];
+ denom0 += j * l;
}
- } else
+ }
+ else
{
if (rb0)
{
- vec = ( solverConstraint.m_angularComponentA).cross(rel_pos1);
+ vec = (solverConstraint.m_angularComponentA).cross(rel_pos1);
denom0 = rb0->getInvMass() + contactNormal.dot(vec);
}
}
if (multiBodyB)
{
- const int ndofB = multiBodyB->getNumDofs() + 6;
+ const int ndofB = multiBodyB->getNumDofs() + 6;
jacB = &m_data.m_jacobians[solverConstraint.m_jacBindex];
lambdaB = &m_data.m_deltaVelocitiesUnitImpulse[solverConstraint.m_jacBindex];
for (int i = 0; i < ndofB; ++i)
{
- btScalar j = jacB[i] ;
- btScalar l =lambdaB[i];
- denom1 += j*l;
+ btScalar j = jacB[i];
+ btScalar l = lambdaB[i];
+ denom1 += j * l;
}
-
- } else
+ }
+ else
{
if (rb1)
{
- vec = ( -solverConstraint.m_angularComponentB).cross(rel_pos2);
+ vec = (-solverConstraint.m_angularComponentB).cross(rel_pos2);
denom1 = rb1->getInvMass() + contactNormal.dot(vec);
}
}
-
-
- btScalar d = denom0+denom1+cfm;
- if (d>SIMD_EPSILON)
- {
- solverConstraint.m_jacDiagABInv = relaxation/(d);
- } else
- {
+ btScalar d = denom0 + denom1 + cfm;
+ if (d > SIMD_EPSILON)
+ {
+ solverConstraint.m_jacDiagABInv = relaxation / (d);
+ }
+ else
+ {
//disable the constraint row to handle singularity/redundant constraint
- solverConstraint.m_jacDiagABInv = 0.f;
- }
-
+ solverConstraint.m_jacDiagABInv = 0.f;
+ }
}
-
//compute rhs and remaining solverConstraint fields
-
-
btScalar restitution = 0.f;
- btScalar distance = 0;
- if (!isFriction)
- {
- distance = cp.getDistance()+infoGlobal.m_linearSlop;
- } else
- {
- if (cp.m_contactPointFlags & BT_CONTACT_FLAG_FRICTION_ANCHOR)
- {
- distance = (cp.getPositionWorldOnA() - cp.getPositionWorldOnB()).dot(contactNormal);
- }
- }
-
-
- btScalar rel_vel = 0.f;
- int ndofA = 0;
- int ndofB = 0;
+ btScalar distance = 0;
+ if (!isFriction)
+ {
+ distance = cp.getDistance() + infoGlobal.m_linearSlop;
+ }
+ else
{
+ if (cp.m_contactPointFlags & BT_CONTACT_FLAG_FRICTION_ANCHOR)
+ {
+ distance = (cp.getPositionWorldOnA() - cp.getPositionWorldOnB()).dot(contactNormal);
+ }
+ }
- btVector3 vel1,vel2;
+ btScalar rel_vel = 0.f;
+ int ndofA = 0;
+ int ndofB = 0;
+ {
+ btVector3 vel1, vel2;
if (multiBodyA)
{
- ndofA = multiBodyA->getNumDofs() + 6;
+ ndofA = multiBodyA->getNumDofs() + 6;
btScalar* jacA = &m_data.m_jacobians[solverConstraint.m_jacAindex];
- for (int i = 0; i < ndofA ; ++i)
+ for (int i = 0; i < ndofA; ++i)
rel_vel += multiBodyA->getVelocityVector()[i] * jacA[i];
- } else
+ }
+ else
{
if (rb0)
{
- rel_vel += (rb0->getVelocityInLocalPoint(rel_pos1) +
- (rb0->getTotalTorque()*rb0->getInvInertiaTensorWorld()*infoGlobal.m_timeStep).cross(rel_pos1)+
- rb0->getTotalForce()*rb0->getInvMass()*infoGlobal.m_timeStep).dot(solverConstraint.m_contactNormal1);
+ rel_vel += (rb0->getVelocityInLocalPoint(rel_pos1) +
+ (rb0->getTotalTorque() * rb0->getInvInertiaTensorWorld() * infoGlobal.m_timeStep).cross(rel_pos1) +
+ rb0->getTotalForce() * rb0->getInvMass() * infoGlobal.m_timeStep)
+ .dot(solverConstraint.m_contactNormal1);
}
}
if (multiBodyB)
{
- ndofB = multiBodyB->getNumDofs() + 6;
+ ndofB = multiBodyB->getNumDofs() + 6;
btScalar* jacB = &m_data.m_jacobians[solverConstraint.m_jacBindex];
- for (int i = 0; i < ndofB ; ++i)
+ for (int i = 0; i < ndofB; ++i)
rel_vel += multiBodyB->getVelocityVector()[i] * jacB[i];
-
- } else
+ }
+ else
{
if (rb1)
{
- rel_vel += (rb1->getVelocityInLocalPoint(rel_pos2)+
- (rb1->getTotalTorque()*rb1->getInvInertiaTensorWorld()*infoGlobal.m_timeStep).cross(rel_pos2) +
- rb1->getTotalForce()*rb1->getInvMass()*infoGlobal.m_timeStep).dot(solverConstraint.m_contactNormal2);
+ rel_vel += (rb1->getVelocityInLocalPoint(rel_pos2) +
+ (rb1->getTotalTorque() * rb1->getInvInertiaTensorWorld() * infoGlobal.m_timeStep).cross(rel_pos2) +
+ rb1->getTotalForce() * rb1->getInvMass() * infoGlobal.m_timeStep)
+ .dot(solverConstraint.m_contactNormal2);
}
}
solverConstraint.m_friction = cp.m_combinedFriction;
- if(!isFriction)
+ if (!isFriction)
{
- restitution = restitutionCurve(rel_vel, cp.m_combinedRestitution, infoGlobal.m_restitutionVelocityThreshold);
+ restitution = restitutionCurve(rel_vel, cp.m_combinedRestitution, infoGlobal.m_restitutionVelocityThreshold);
if (restitution <= btScalar(0.))
{
restitution = 0.f;
@@ -751,10 +745,9 @@ void btMultiBodyConstraintSolver::setupMultiBodyContactConstraint(btMultiBodySol
}
}
-
///warm starting (or zero if disabled)
//disable warmstarting for btMultiBody, it has issues gaining energy (==explosion)
- if (0)//infoGlobal.m_solverMode & SOLVER_USE_WARMSTARTING)
+ if (0) //infoGlobal.m_solverMode & SOLVER_USE_WARMSTARTING)
{
solverConstraint.m_appliedImpulse = isFriction ? 0 : cp.m_appliedImpulse * infoGlobal.m_warmstartingFactor;
@@ -764,27 +757,30 @@ void btMultiBodyConstraintSolver::setupMultiBodyContactConstraint(btMultiBodySol
{
btScalar impulse = solverConstraint.m_appliedImpulse;
btScalar* deltaV = &m_data.m_deltaVelocitiesUnitImpulse[solverConstraint.m_jacAindex];
- multiBodyA->applyDeltaVeeMultiDof(deltaV,impulse);
-
- applyDeltaVee(deltaV,impulse,solverConstraint.m_deltaVelAindex,ndofA);
- } else
+ multiBodyA->applyDeltaVeeMultiDof(deltaV, impulse);
+
+ applyDeltaVee(deltaV, impulse, solverConstraint.m_deltaVelAindex, ndofA);
+ }
+ else
{
if (rb0)
- bodyA->internalApplyImpulse(solverConstraint.m_contactNormal1*bodyA->internalGetInvMass()*rb0->getLinearFactor(),solverConstraint.m_angularComponentA,solverConstraint.m_appliedImpulse);
+ bodyA->internalApplyImpulse(solverConstraint.m_contactNormal1 * bodyA->internalGetInvMass() * rb0->getLinearFactor(), solverConstraint.m_angularComponentA, solverConstraint.m_appliedImpulse);
}
if (multiBodyB)
{
btScalar impulse = solverConstraint.m_appliedImpulse;
btScalar* deltaV = &m_data.m_deltaVelocitiesUnitImpulse[solverConstraint.m_jacBindex];
- multiBodyB->applyDeltaVeeMultiDof(deltaV,impulse);
- applyDeltaVee(deltaV,impulse,solverConstraint.m_deltaVelBindex,ndofB);
- } else
+ multiBodyB->applyDeltaVeeMultiDof(deltaV, impulse);
+ applyDeltaVee(deltaV, impulse, solverConstraint.m_deltaVelBindex, ndofB);
+ }
+ else
{
if (rb1)
- bodyB->internalApplyImpulse(-solverConstraint.m_contactNormal2*bodyB->internalGetInvMass()*rb1->getLinearFactor(),-solverConstraint.m_angularComponentB,-(btScalar)solverConstraint.m_appliedImpulse);
+ bodyB->internalApplyImpulse(-solverConstraint.m_contactNormal2 * bodyB->internalGetInvMass() * rb1->getLinearFactor(), -solverConstraint.m_angularComponentB, -(btScalar)solverConstraint.m_appliedImpulse);
}
}
- } else
+ }
+ else
{
solverConstraint.m_appliedImpulse = 0.f;
}
@@ -792,38 +788,37 @@ void btMultiBodyConstraintSolver::setupMultiBodyContactConstraint(btMultiBodySol
solverConstraint.m_appliedPushImpulse = 0.f;
{
-
btScalar positionalError = 0.f;
- btScalar velocityError = restitution - rel_vel;// * damping; //note for friction restitution is always set to 0 (check above) so it is acutally velocityError = -rel_vel for friction
+ btScalar velocityError = restitution - rel_vel; // * damping; //note for friction restitution is always set to 0 (check above) so it is acutally velocityError = -rel_vel for friction
if (isFriction)
{
- positionalError = -distance * erp/infoGlobal.m_timeStep;
- } else
+ positionalError = -distance * erp / infoGlobal.m_timeStep;
+ }
+ else
{
- if (distance>0)
+ if (distance > 0)
{
positionalError = 0;
velocityError -= distance / infoGlobal.m_timeStep;
-
- } else
+ }
+ else
{
- positionalError = -distance * erp/infoGlobal.m_timeStep;
+ positionalError = -distance * erp / infoGlobal.m_timeStep;
}
}
- btScalar penetrationImpulse = positionalError*solverConstraint.m_jacDiagABInv;
- btScalar velocityImpulse = velocityError *solverConstraint.m_jacDiagABInv;
+ btScalar penetrationImpulse = positionalError * solverConstraint.m_jacDiagABInv;
+ btScalar velocityImpulse = velocityError * solverConstraint.m_jacDiagABInv;
- if(!isFriction)
+ if (!isFriction)
{
- // if (!infoGlobal.m_splitImpulse || (penetration > infoGlobal.m_splitImpulsePenetrationThreshold))
+ // if (!infoGlobal.m_splitImpulse || (penetration > infoGlobal.m_splitImpulsePenetrationThreshold))
{
//combine position and velocity into rhs
- solverConstraint.m_rhs = penetrationImpulse+velocityImpulse;
+ solverConstraint.m_rhs = penetrationImpulse + velocityImpulse;
solverConstraint.m_rhsPenetration = 0.f;
-
}
- /*else
+ /*else
{
//split position and velocity into rhs and m_rhsPenetration
solverConstraint.m_rhs = velocityImpulse;
@@ -835,309 +830,288 @@ void btMultiBodyConstraintSolver::setupMultiBodyContactConstraint(btMultiBodySol
}
else
{
- solverConstraint.m_rhs = penetrationImpulse+velocityImpulse;
+ solverConstraint.m_rhs = penetrationImpulse + velocityImpulse;
solverConstraint.m_rhsPenetration = 0.f;
solverConstraint.m_lowerLimit = -solverConstraint.m_friction;
solverConstraint.m_upperLimit = solverConstraint.m_friction;
}
- solverConstraint.m_cfm = cfm*solverConstraint.m_jacDiagABInv;
-
-
-
+ solverConstraint.m_cfm = cfm * solverConstraint.m_jacDiagABInv;
}
-
}
void btMultiBodyConstraintSolver::setupMultiBodyTorsionalFrictionConstraint(btMultiBodySolverConstraint& solverConstraint,
- const btVector3& constraintNormal,
- btManifoldPoint& cp,
- btScalar combinedTorsionalFriction,
- const btContactSolverInfo& infoGlobal,
- btScalar& relaxation,
- bool isFriction, btScalar desiredVelocity, btScalar cfmSlip)
+ const btVector3& constraintNormal,
+ btManifoldPoint& cp,
+ btScalar combinedTorsionalFriction,
+ const btContactSolverInfo& infoGlobal,
+ btScalar& relaxation,
+ bool isFriction, btScalar desiredVelocity, btScalar cfmSlip)
{
-
- BT_PROFILE("setupMultiBodyRollingFrictionConstraint");
- btVector3 rel_pos1;
- btVector3 rel_pos2;
-
- btMultiBody* multiBodyA = solverConstraint.m_multiBodyA;
- btMultiBody* multiBodyB = solverConstraint.m_multiBodyB;
-
- const btVector3& pos1 = cp.getPositionWorldOnA();
- const btVector3& pos2 = cp.getPositionWorldOnB();
-
- btSolverBody* bodyA = multiBodyA ? 0 : &m_tmpSolverBodyPool[solverConstraint.m_solverBodyIdA];
- btSolverBody* bodyB = multiBodyB ? 0 : &m_tmpSolverBodyPool[solverConstraint.m_solverBodyIdB];
-
- btRigidBody* rb0 = multiBodyA ? 0 : bodyA->m_originalBody;
- btRigidBody* rb1 = multiBodyB ? 0 : bodyB->m_originalBody;
-
- if (bodyA)
- rel_pos1 = pos1 - bodyA->getWorldTransform().getOrigin();
- if (bodyB)
- rel_pos2 = pos2 - bodyB->getWorldTransform().getOrigin();
-
- relaxation = infoGlobal.m_sor;
-
- // btScalar invTimeStep = btScalar(1)/infoGlobal.m_timeStep;
-
-
- if (multiBodyA)
- {
- if (solverConstraint.m_linkA<0)
- {
- rel_pos1 = pos1 - multiBodyA->getBasePos();
- } else
- {
- rel_pos1 = pos1 - multiBodyA->getLink(solverConstraint.m_linkA).m_cachedWorldTransform.getOrigin();
- }
- const int ndofA = multiBodyA->getNumDofs() + 6;
-
- solverConstraint.m_deltaVelAindex = multiBodyA->getCompanionId();
-
- if (solverConstraint.m_deltaVelAindex <0)
- {
- solverConstraint.m_deltaVelAindex = m_data.m_deltaVelocities.size();
- multiBodyA->setCompanionId(solverConstraint.m_deltaVelAindex);
- m_data.m_deltaVelocities.resize(m_data.m_deltaVelocities.size()+ndofA);
- } else
- {
- btAssert(m_data.m_deltaVelocities.size() >= solverConstraint.m_deltaVelAindex+ndofA);
- }
-
- solverConstraint.m_jacAindex = m_data.m_jacobians.size();
- m_data.m_jacobians.resize(m_data.m_jacobians.size()+ndofA);
- m_data.m_deltaVelocitiesUnitImpulse.resize(m_data.m_deltaVelocitiesUnitImpulse.size()+ndofA);
- btAssert(m_data.m_jacobians.size() == m_data.m_deltaVelocitiesUnitImpulse.size());
-
- btScalar* jac1=&m_data.m_jacobians[solverConstraint.m_jacAindex];
- multiBodyA->fillConstraintJacobianMultiDof(solverConstraint.m_linkA, cp.getPositionWorldOnA(), constraintNormal, btVector3(0,0,0), jac1, m_data.scratch_r, m_data.scratch_v, m_data.scratch_m);
- btScalar* delta = &m_data.m_deltaVelocitiesUnitImpulse[solverConstraint.m_jacAindex];
- multiBodyA->calcAccelerationDeltasMultiDof(&m_data.m_jacobians[solverConstraint.m_jacAindex],delta,m_data.scratch_r, m_data.scratch_v);
-
- btVector3 torqueAxis0 = -constraintNormal;
- solverConstraint.m_relpos1CrossNormal = torqueAxis0;
- solverConstraint.m_contactNormal1 = btVector3(0,0,0);
- } else
- {
- btVector3 torqueAxis0 = -constraintNormal;
- solverConstraint.m_relpos1CrossNormal = torqueAxis0;
- solverConstraint.m_contactNormal1 = btVector3(0,0,0);
- solverConstraint.m_angularComponentA = rb0 ? rb0->getInvInertiaTensorWorld()*torqueAxis0*rb0->getAngularFactor() : btVector3(0,0,0);
- }
-
-
-
- if (multiBodyB)
- {
- if (solverConstraint.m_linkB<0)
- {
- rel_pos2 = pos2 - multiBodyB->getBasePos();
- } else
- {
- rel_pos2 = pos2 - multiBodyB->getLink(solverConstraint.m_linkB).m_cachedWorldTransform.getOrigin();
- }
-
- const int ndofB = multiBodyB->getNumDofs() + 6;
-
- solverConstraint.m_deltaVelBindex = multiBodyB->getCompanionId();
- if (solverConstraint.m_deltaVelBindex <0)
- {
- solverConstraint.m_deltaVelBindex = m_data.m_deltaVelocities.size();
- multiBodyB->setCompanionId(solverConstraint.m_deltaVelBindex);
- m_data.m_deltaVelocities.resize(m_data.m_deltaVelocities.size()+ndofB);
- }
-
- solverConstraint.m_jacBindex = m_data.m_jacobians.size();
-
- m_data.m_jacobians.resize(m_data.m_jacobians.size()+ndofB);
- m_data.m_deltaVelocitiesUnitImpulse.resize(m_data.m_deltaVelocitiesUnitImpulse.size()+ndofB);
- btAssert(m_data.m_jacobians.size() == m_data.m_deltaVelocitiesUnitImpulse.size());
-
- multiBodyB->fillConstraintJacobianMultiDof(solverConstraint.m_linkB, cp.getPositionWorldOnB(), -constraintNormal, btVector3(0,0,0), &m_data.m_jacobians[solverConstraint.m_jacBindex], m_data.scratch_r, m_data.scratch_v, m_data.scratch_m);
- multiBodyB->calcAccelerationDeltasMultiDof(&m_data.m_jacobians[solverConstraint.m_jacBindex],&m_data.m_deltaVelocitiesUnitImpulse[solverConstraint.m_jacBindex],m_data.scratch_r, m_data.scratch_v);
-
- btVector3 torqueAxis1 = constraintNormal;
- solverConstraint.m_relpos2CrossNormal = torqueAxis1;
- solverConstraint.m_contactNormal2 = -btVector3(0,0,0);
-
- } else
- {
- btVector3 torqueAxis1 = constraintNormal;
- solverConstraint.m_relpos2CrossNormal = torqueAxis1;
- solverConstraint.m_contactNormal2 = -btVector3(0,0,0);
-
- solverConstraint.m_angularComponentB = rb1 ? rb1->getInvInertiaTensorWorld()*torqueAxis1*rb1->getAngularFactor() : btVector3(0,0,0);
- }
-
- {
-
- btScalar denom0 = 0.f;
- btScalar denom1 = 0.f;
- btScalar* jacB = 0;
- btScalar* jacA = 0;
- btScalar* lambdaA =0;
- btScalar* lambdaB =0;
- int ndofA = 0;
- if (multiBodyA)
- {
- ndofA = multiBodyA->getNumDofs() + 6;
- jacA = &m_data.m_jacobians[solverConstraint.m_jacAindex];
- lambdaA = &m_data.m_deltaVelocitiesUnitImpulse[solverConstraint.m_jacAindex];
- for (int i = 0; i < ndofA; ++i)
- {
- btScalar j = jacA[i] ;
- btScalar l =lambdaA[i];
- denom0 += j*l;
- }
- } else
- {
- if (rb0)
- {
- btVector3 iMJaA = rb0?rb0->getInvInertiaTensorWorld()*solverConstraint.m_relpos1CrossNormal:btVector3(0,0,0);
+ BT_PROFILE("setupMultiBodyRollingFrictionConstraint");
+ btVector3 rel_pos1;
+ btVector3 rel_pos2;
+
+ btMultiBody* multiBodyA = solverConstraint.m_multiBodyA;
+ btMultiBody* multiBodyB = solverConstraint.m_multiBodyB;
+
+ const btVector3& pos1 = cp.getPositionWorldOnA();
+ const btVector3& pos2 = cp.getPositionWorldOnB();
+
+ btSolverBody* bodyA = multiBodyA ? 0 : &m_tmpSolverBodyPool[solverConstraint.m_solverBodyIdA];
+ btSolverBody* bodyB = multiBodyB ? 0 : &m_tmpSolverBodyPool[solverConstraint.m_solverBodyIdB];
+
+ btRigidBody* rb0 = multiBodyA ? 0 : bodyA->m_originalBody;
+ btRigidBody* rb1 = multiBodyB ? 0 : bodyB->m_originalBody;
+
+ if (bodyA)
+ rel_pos1 = pos1 - bodyA->getWorldTransform().getOrigin();
+ if (bodyB)
+ rel_pos2 = pos2 - bodyB->getWorldTransform().getOrigin();
+
+ relaxation = infoGlobal.m_sor;
+
+ // btScalar invTimeStep = btScalar(1)/infoGlobal.m_timeStep;
+
+ if (multiBodyA)
+ {
+ if (solverConstraint.m_linkA < 0)
+ {
+ rel_pos1 = pos1 - multiBodyA->getBasePos();
+ }
+ else
+ {
+ rel_pos1 = pos1 - multiBodyA->getLink(solverConstraint.m_linkA).m_cachedWorldTransform.getOrigin();
+ }
+ const int ndofA = multiBodyA->getNumDofs() + 6;
+
+ solverConstraint.m_deltaVelAindex = multiBodyA->getCompanionId();
+
+ if (solverConstraint.m_deltaVelAindex < 0)
+ {
+ solverConstraint.m_deltaVelAindex = m_data.m_deltaVelocities.size();
+ multiBodyA->setCompanionId(solverConstraint.m_deltaVelAindex);
+ m_data.m_deltaVelocities.resize(m_data.m_deltaVelocities.size() + ndofA);
+ }
+ else
+ {
+ btAssert(m_data.m_deltaVelocities.size() >= solverConstraint.m_deltaVelAindex + ndofA);
+ }
+
+ solverConstraint.m_jacAindex = m_data.m_jacobians.size();
+ m_data.m_jacobians.resize(m_data.m_jacobians.size() + ndofA);
+ m_data.m_deltaVelocitiesUnitImpulse.resize(m_data.m_deltaVelocitiesUnitImpulse.size() + ndofA);
+ btAssert(m_data.m_jacobians.size() == m_data.m_deltaVelocitiesUnitImpulse.size());
+
+ btScalar* jac1 = &m_data.m_jacobians[solverConstraint.m_jacAindex];
+ multiBodyA->fillConstraintJacobianMultiDof(solverConstraint.m_linkA, cp.getPositionWorldOnA(), constraintNormal, btVector3(0, 0, 0), jac1, m_data.scratch_r, m_data.scratch_v, m_data.scratch_m);
+ btScalar* delta = &m_data.m_deltaVelocitiesUnitImpulse[solverConstraint.m_jacAindex];
+ multiBodyA->calcAccelerationDeltasMultiDof(&m_data.m_jacobians[solverConstraint.m_jacAindex], delta, m_data.scratch_r, m_data.scratch_v);
+
+ btVector3 torqueAxis0 = -constraintNormal;
+ solverConstraint.m_relpos1CrossNormal = torqueAxis0;
+ solverConstraint.m_contactNormal1 = btVector3(0, 0, 0);
+ }
+ else
+ {
+ btVector3 torqueAxis0 = -constraintNormal;
+ solverConstraint.m_relpos1CrossNormal = torqueAxis0;
+ solverConstraint.m_contactNormal1 = btVector3(0, 0, 0);
+ solverConstraint.m_angularComponentA = rb0 ? rb0->getInvInertiaTensorWorld() * torqueAxis0 * rb0->getAngularFactor() : btVector3(0, 0, 0);
+ }
+
+ if (multiBodyB)
+ {
+ if (solverConstraint.m_linkB < 0)
+ {
+ rel_pos2 = pos2 - multiBodyB->getBasePos();
+ }
+ else
+ {
+ rel_pos2 = pos2 - multiBodyB->getLink(solverConstraint.m_linkB).m_cachedWorldTransform.getOrigin();
+ }
+
+ const int ndofB = multiBodyB->getNumDofs() + 6;
+
+ solverConstraint.m_deltaVelBindex = multiBodyB->getCompanionId();
+ if (solverConstraint.m_deltaVelBindex < 0)
+ {
+ solverConstraint.m_deltaVelBindex = m_data.m_deltaVelocities.size();
+ multiBodyB->setCompanionId(solverConstraint.m_deltaVelBindex);
+ m_data.m_deltaVelocities.resize(m_data.m_deltaVelocities.size() + ndofB);
+ }
+
+ solverConstraint.m_jacBindex = m_data.m_jacobians.size();
+
+ m_data.m_jacobians.resize(m_data.m_jacobians.size() + ndofB);
+ m_data.m_deltaVelocitiesUnitImpulse.resize(m_data.m_deltaVelocitiesUnitImpulse.size() + ndofB);
+ btAssert(m_data.m_jacobians.size() == m_data.m_deltaVelocitiesUnitImpulse.size());
+
+ multiBodyB->fillConstraintJacobianMultiDof(solverConstraint.m_linkB, cp.getPositionWorldOnB(), -constraintNormal, btVector3(0, 0, 0), &m_data.m_jacobians[solverConstraint.m_jacBindex], m_data.scratch_r, m_data.scratch_v, m_data.scratch_m);
+ multiBodyB->calcAccelerationDeltasMultiDof(&m_data.m_jacobians[solverConstraint.m_jacBindex], &m_data.m_deltaVelocitiesUnitImpulse[solverConstraint.m_jacBindex], m_data.scratch_r, m_data.scratch_v);
+
+ btVector3 torqueAxis1 = constraintNormal;
+ solverConstraint.m_relpos2CrossNormal = torqueAxis1;
+ solverConstraint.m_contactNormal2 = -btVector3(0, 0, 0);
+ }
+ else
+ {
+ btVector3 torqueAxis1 = constraintNormal;
+ solverConstraint.m_relpos2CrossNormal = torqueAxis1;
+ solverConstraint.m_contactNormal2 = -btVector3(0, 0, 0);
+
+ solverConstraint.m_angularComponentB = rb1 ? rb1->getInvInertiaTensorWorld() * torqueAxis1 * rb1->getAngularFactor() : btVector3(0, 0, 0);
+ }
+
+ {
+ btScalar denom0 = 0.f;
+ btScalar denom1 = 0.f;
+ btScalar* jacB = 0;
+ btScalar* jacA = 0;
+ btScalar* lambdaA = 0;
+ btScalar* lambdaB = 0;
+ int ndofA = 0;
+ if (multiBodyA)
+ {
+ ndofA = multiBodyA->getNumDofs() + 6;
+ jacA = &m_data.m_jacobians[solverConstraint.m_jacAindex];
+ lambdaA = &m_data.m_deltaVelocitiesUnitImpulse[solverConstraint.m_jacAindex];
+ for (int i = 0; i < ndofA; ++i)
+ {
+ btScalar j = jacA[i];
+ btScalar l = lambdaA[i];
+ denom0 += j * l;
+ }
+ }
+ else
+ {
+ if (rb0)
+ {
+ btVector3 iMJaA = rb0 ? rb0->getInvInertiaTensorWorld() * solverConstraint.m_relpos1CrossNormal : btVector3(0, 0, 0);
denom0 = iMJaA.dot(solverConstraint.m_relpos1CrossNormal);
- }
- }
- if (multiBodyB)
- {
- const int ndofB = multiBodyB->getNumDofs() + 6;
- jacB = &m_data.m_jacobians[solverConstraint.m_jacBindex];
- lambdaB = &m_data.m_deltaVelocitiesUnitImpulse[solverConstraint.m_jacBindex];
- for (int i = 0; i < ndofB; ++i)
- {
- btScalar j = jacB[i] ;
- btScalar l =lambdaB[i];
- denom1 += j*l;
- }
-
- } else
- {
- if (rb1)
- {
- btVector3 iMJaB = rb1?rb1->getInvInertiaTensorWorld()*solverConstraint.m_relpos2CrossNormal:btVector3(0,0,0);
+ }
+ }
+ if (multiBodyB)
+ {
+ const int ndofB = multiBodyB->getNumDofs() + 6;
+ jacB = &m_data.m_jacobians[solverConstraint.m_jacBindex];
+ lambdaB = &m_data.m_deltaVelocitiesUnitImpulse[solverConstraint.m_jacBindex];
+ for (int i = 0; i < ndofB; ++i)
+ {
+ btScalar j = jacB[i];
+ btScalar l = lambdaB[i];
+ denom1 += j * l;
+ }
+ }
+ else
+ {
+ if (rb1)
+ {
+ btVector3 iMJaB = rb1 ? rb1->getInvInertiaTensorWorld() * solverConstraint.m_relpos2CrossNormal : btVector3(0, 0, 0);
denom1 = iMJaB.dot(solverConstraint.m_relpos2CrossNormal);
- }
- }
-
-
-
- btScalar d = denom0+denom1+infoGlobal.m_globalCfm;
- if (d>SIMD_EPSILON)
- {
- solverConstraint.m_jacDiagABInv = relaxation/(d);
- } else
- {
- //disable the constraint row to handle singularity/redundant constraint
- solverConstraint.m_jacDiagABInv = 0.f;
- }
-
- }
-
-
- //compute rhs and remaining solverConstraint fields
-
-
-
- btScalar restitution = 0.f;
- btScalar penetration = isFriction? 0 : cp.getDistance();
-
- btScalar rel_vel = 0.f;
- int ndofA = 0;
- int ndofB = 0;
- {
-
- btVector3 vel1,vel2;
- if (multiBodyA)
- {
- ndofA = multiBodyA->getNumDofs() + 6;
- btScalar* jacA = &m_data.m_jacobians[solverConstraint.m_jacAindex];
- for (int i = 0; i < ndofA ; ++i)
- rel_vel += multiBodyA->getVelocityVector()[i] * jacA[i];
- } else
- {
- if (rb0)
- {
+ }
+ }
+
+ btScalar d = denom0 + denom1 + infoGlobal.m_globalCfm;
+ if (d > SIMD_EPSILON)
+ {
+ solverConstraint.m_jacDiagABInv = relaxation / (d);
+ }
+ else
+ {
+ //disable the constraint row to handle singularity/redundant constraint
+ solverConstraint.m_jacDiagABInv = 0.f;
+ }
+ }
+
+ //compute rhs and remaining solverConstraint fields
+
+ btScalar restitution = 0.f;
+ btScalar penetration = isFriction ? 0 : cp.getDistance();
+
+ btScalar rel_vel = 0.f;
+ int ndofA = 0;
+ int ndofB = 0;
+ {
+ btVector3 vel1, vel2;
+ if (multiBodyA)
+ {
+ ndofA = multiBodyA->getNumDofs() + 6;
+ btScalar* jacA = &m_data.m_jacobians[solverConstraint.m_jacAindex];
+ for (int i = 0; i < ndofA; ++i)
+ rel_vel += multiBodyA->getVelocityVector()[i] * jacA[i];
+ }
+ else
+ {
+ if (rb0)
+ {
btSolverBody* solverBodyA = &m_tmpSolverBodyPool[solverConstraint.m_solverBodyIdA];
- rel_vel += solverConstraint.m_contactNormal1.dot(rb0?solverBodyA->m_linearVelocity+solverBodyA->m_externalForceImpulse:btVector3(0,0,0))
- + solverConstraint.m_relpos1CrossNormal.dot(rb0?solverBodyA->m_angularVelocity:btVector3(0,0,0));
-
- }
- }
- if (multiBodyB)
- {
- ndofB = multiBodyB->getNumDofs() + 6;
- btScalar* jacB = &m_data.m_jacobians[solverConstraint.m_jacBindex];
- for (int i = 0; i < ndofB ; ++i)
- rel_vel += multiBodyB->getVelocityVector()[i] * jacB[i];
-
- } else
- {
- if (rb1)
- {
+ rel_vel += solverConstraint.m_contactNormal1.dot(rb0 ? solverBodyA->m_linearVelocity + solverBodyA->m_externalForceImpulse : btVector3(0, 0, 0)) + solverConstraint.m_relpos1CrossNormal.dot(rb0 ? solverBodyA->m_angularVelocity : btVector3(0, 0, 0));
+ }
+ }
+ if (multiBodyB)
+ {
+ ndofB = multiBodyB->getNumDofs() + 6;
+ btScalar* jacB = &m_data.m_jacobians[solverConstraint.m_jacBindex];
+ for (int i = 0; i < ndofB; ++i)
+ rel_vel += multiBodyB->getVelocityVector()[i] * jacB[i];
+ }
+ else
+ {
+ if (rb1)
+ {
btSolverBody* solverBodyB = &m_tmpSolverBodyPool[solverConstraint.m_solverBodyIdB];
- rel_vel += solverConstraint.m_contactNormal2.dot(rb1?solverBodyB->m_linearVelocity+solverBodyB->m_externalForceImpulse:btVector3(0,0,0))
- + solverConstraint.m_relpos2CrossNormal.dot(rb1?solverBodyB->m_angularVelocity:btVector3(0,0,0));
-
- }
- }
-
- solverConstraint.m_friction =combinedTorsionalFriction;
-
- if(!isFriction)
- {
- restitution = restitutionCurve(rel_vel, cp.m_combinedRestitution, infoGlobal.m_restitutionVelocityThreshold);
- if (restitution <= btScalar(0.))
- {
- restitution = 0.f;
- }
- }
- }
-
-
- solverConstraint.m_appliedImpulse = 0.f;
- solverConstraint.m_appliedPushImpulse = 0.f;
-
- {
-
- btScalar velocityError = 0 - rel_vel;// * damping; //note for friction restitution is always set to 0 (check above) so it is acutally velocityError = -rel_vel for friction
-
-
-
- btScalar velocityImpulse = velocityError*solverConstraint.m_jacDiagABInv;
-
- solverConstraint.m_rhs = velocityImpulse;
- solverConstraint.m_rhsPenetration = 0.f;
- solverConstraint.m_lowerLimit = -solverConstraint.m_friction;
- solverConstraint.m_upperLimit = solverConstraint.m_friction;
-
- solverConstraint.m_cfm = infoGlobal.m_globalCfm*solverConstraint.m_jacDiagABInv;
-
-
-
- }
-
+ rel_vel += solverConstraint.m_contactNormal2.dot(rb1 ? solverBodyB->m_linearVelocity + solverBodyB->m_externalForceImpulse : btVector3(0, 0, 0)) + solverConstraint.m_relpos2CrossNormal.dot(rb1 ? solverBodyB->m_angularVelocity : btVector3(0, 0, 0));
+ }
+ }
+
+ solverConstraint.m_friction = combinedTorsionalFriction;
+
+ if (!isFriction)
+ {
+ restitution = restitutionCurve(rel_vel, cp.m_combinedRestitution, infoGlobal.m_restitutionVelocityThreshold);
+ if (restitution <= btScalar(0.))
+ {
+ restitution = 0.f;
+ }
+ }
+ }
+
+ solverConstraint.m_appliedImpulse = 0.f;
+ solverConstraint.m_appliedPushImpulse = 0.f;
+
+ {
+ btScalar velocityError = 0 - rel_vel; // * damping; //note for friction restitution is always set to 0 (check above) so it is acutally velocityError = -rel_vel for friction
+
+ btScalar velocityImpulse = velocityError * solverConstraint.m_jacDiagABInv;
+
+ solverConstraint.m_rhs = velocityImpulse;
+ solverConstraint.m_rhsPenetration = 0.f;
+ solverConstraint.m_lowerLimit = -solverConstraint.m_friction;
+ solverConstraint.m_upperLimit = solverConstraint.m_friction;
+
+ solverConstraint.m_cfm = infoGlobal.m_globalCfm * solverConstraint.m_jacDiagABInv;
+ }
}
-btMultiBodySolverConstraint& btMultiBodyConstraintSolver::addMultiBodyFrictionConstraint(const btVector3& normalAxis,btPersistentManifold* manifold,int frictionIndex,btManifoldPoint& cp,btCollisionObject* colObj0,btCollisionObject* colObj1, btScalar relaxation, const btContactSolverInfo& infoGlobal, btScalar desiredVelocity, btScalar cfmSlip)
+btMultiBodySolverConstraint& btMultiBodyConstraintSolver::addMultiBodyFrictionConstraint(const btVector3& normalAxis, btPersistentManifold* manifold, int frictionIndex, btManifoldPoint& cp, btCollisionObject* colObj0, btCollisionObject* colObj1, btScalar relaxation, const btContactSolverInfo& infoGlobal, btScalar desiredVelocity, btScalar cfmSlip)
{
BT_PROFILE("addMultiBodyFrictionConstraint");
btMultiBodySolverConstraint& solverConstraint = m_multiBodyFrictionContactConstraints.expandNonInitializing();
- solverConstraint.m_orgConstraint = 0;
- solverConstraint.m_orgDofIndex = -1;
-
+ solverConstraint.m_orgConstraint = 0;
+ solverConstraint.m_orgDofIndex = -1;
+
solverConstraint.m_frictionIndex = frictionIndex;
bool isFriction = true;
const btMultiBodyLinkCollider* fcA = btMultiBodyLinkCollider::upcast(manifold->getBody0());
const btMultiBodyLinkCollider* fcB = btMultiBodyLinkCollider::upcast(manifold->getBody1());
-
- btMultiBody* mbA = fcA? fcA->m_multiBody : 0;
- btMultiBody* mbB = fcB? fcB->m_multiBody : 0;
- int solverBodyIdA = mbA? -1 : getOrInitSolverBody(*colObj0,infoGlobal.m_timeStep);
- int solverBodyIdB = mbB ? -1 : getOrInitSolverBody(*colObj1,infoGlobal.m_timeStep);
+ btMultiBody* mbA = fcA ? fcA->m_multiBody : 0;
+ btMultiBody* mbB = fcB ? fcB->m_multiBody : 0;
+
+ int solverBodyIdA = mbA ? -1 : getOrInitSolverBody(*colObj0, infoGlobal.m_timeStep);
+ int solverBodyIdB = mbB ? -1 : getOrInitSolverBody(*colObj1, infoGlobal.m_timeStep);
solverConstraint.m_solverBodyIdA = solverBodyIdA;
solverConstraint.m_solverBodyIdB = solverBodyIdB;
@@ -1151,95 +1125,92 @@ btMultiBodySolverConstraint& btMultiBodyConstraintSolver::addMultiBodyFrictionCo
solverConstraint.m_originalContactPoint = &cp;
- setupMultiBodyContactConstraint(solverConstraint, normalAxis, cp, infoGlobal,relaxation,isFriction, desiredVelocity, cfmSlip);
+ setupMultiBodyContactConstraint(solverConstraint, normalAxis, cp, infoGlobal, relaxation, isFriction, desiredVelocity, cfmSlip);
return solverConstraint;
}
-btMultiBodySolverConstraint& btMultiBodyConstraintSolver::addMultiBodyTorsionalFrictionConstraint(const btVector3& normalAxis,btPersistentManifold* manifold,int frictionIndex,btManifoldPoint& cp,
- btScalar combinedTorsionalFriction,
- btCollisionObject* colObj0,btCollisionObject* colObj1, btScalar relaxation, const btContactSolverInfo& infoGlobal, btScalar desiredVelocity, btScalar cfmSlip)
+btMultiBodySolverConstraint& btMultiBodyConstraintSolver::addMultiBodyTorsionalFrictionConstraint(const btVector3& normalAxis, btPersistentManifold* manifold, int frictionIndex, btManifoldPoint& cp,
+ btScalar combinedTorsionalFriction,
+ btCollisionObject* colObj0, btCollisionObject* colObj1, btScalar relaxation, const btContactSolverInfo& infoGlobal, btScalar desiredVelocity, btScalar cfmSlip)
{
- BT_PROFILE("addMultiBodyRollingFrictionConstraint");
-
- bool useTorsionalAndConeFriction = (infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS && ((infoGlobal.m_solverMode&SOLVER_DISABLE_IMPLICIT_CONE_FRICTION) == 0));
-
- btMultiBodySolverConstraint& solverConstraint = useTorsionalAndConeFriction? m_multiBodyTorsionalFrictionContactConstraints.expandNonInitializing() : m_multiBodyFrictionContactConstraints.expandNonInitializing();
- solverConstraint.m_orgConstraint = 0;
- solverConstraint.m_orgDofIndex = -1;
-
- solverConstraint.m_frictionIndex = frictionIndex;
- bool isFriction = true;
-
- const btMultiBodyLinkCollider* fcA = btMultiBodyLinkCollider::upcast(manifold->getBody0());
- const btMultiBodyLinkCollider* fcB = btMultiBodyLinkCollider::upcast(manifold->getBody1());
-
- btMultiBody* mbA = fcA? fcA->m_multiBody : 0;
- btMultiBody* mbB = fcB? fcB->m_multiBody : 0;
-
- int solverBodyIdA = mbA? -1 : getOrInitSolverBody(*colObj0,infoGlobal.m_timeStep);
- int solverBodyIdB = mbB ? -1 : getOrInitSolverBody(*colObj1,infoGlobal.m_timeStep);
-
- solverConstraint.m_solverBodyIdA = solverBodyIdA;
- solverConstraint.m_solverBodyIdB = solverBodyIdB;
- solverConstraint.m_multiBodyA = mbA;
- if (mbA)
- solverConstraint.m_linkA = fcA->m_link;
-
- solverConstraint.m_multiBodyB = mbB;
- if (mbB)
- solverConstraint.m_linkB = fcB->m_link;
-
- solverConstraint.m_originalContactPoint = &cp;
-
- setupMultiBodyTorsionalFrictionConstraint(solverConstraint, normalAxis, cp, combinedTorsionalFriction,infoGlobal,relaxation,isFriction, desiredVelocity, cfmSlip);
- return solverConstraint;
+ BT_PROFILE("addMultiBodyRollingFrictionConstraint");
+
+ bool useTorsionalAndConeFriction = (infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS && ((infoGlobal.m_solverMode & SOLVER_DISABLE_IMPLICIT_CONE_FRICTION) == 0));
+
+ btMultiBodySolverConstraint& solverConstraint = useTorsionalAndConeFriction ? m_multiBodyTorsionalFrictionContactConstraints.expandNonInitializing() : m_multiBodyFrictionContactConstraints.expandNonInitializing();
+ solverConstraint.m_orgConstraint = 0;
+ solverConstraint.m_orgDofIndex = -1;
+
+ solverConstraint.m_frictionIndex = frictionIndex;
+ bool isFriction = true;
+
+ const btMultiBodyLinkCollider* fcA = btMultiBodyLinkCollider::upcast(manifold->getBody0());
+ const btMultiBodyLinkCollider* fcB = btMultiBodyLinkCollider::upcast(manifold->getBody1());
+
+ btMultiBody* mbA = fcA ? fcA->m_multiBody : 0;
+ btMultiBody* mbB = fcB ? fcB->m_multiBody : 0;
+
+ int solverBodyIdA = mbA ? -1 : getOrInitSolverBody(*colObj0, infoGlobal.m_timeStep);
+ int solverBodyIdB = mbB ? -1 : getOrInitSolverBody(*colObj1, infoGlobal.m_timeStep);
+
+ solverConstraint.m_solverBodyIdA = solverBodyIdA;
+ solverConstraint.m_solverBodyIdB = solverBodyIdB;
+ solverConstraint.m_multiBodyA = mbA;
+ if (mbA)
+ solverConstraint.m_linkA = fcA->m_link;
+
+ solverConstraint.m_multiBodyB = mbB;
+ if (mbB)
+ solverConstraint.m_linkB = fcB->m_link;
+
+ solverConstraint.m_originalContactPoint = &cp;
+
+ setupMultiBodyTorsionalFrictionConstraint(solverConstraint, normalAxis, cp, combinedTorsionalFriction, infoGlobal, relaxation, isFriction, desiredVelocity, cfmSlip);
+ return solverConstraint;
}
-void btMultiBodyConstraintSolver::convertMultiBodyContact(btPersistentManifold* manifold,const btContactSolverInfo& infoGlobal)
+void btMultiBodyConstraintSolver::convertMultiBodyContact(btPersistentManifold* manifold, const btContactSolverInfo& infoGlobal)
{
const btMultiBodyLinkCollider* fcA = btMultiBodyLinkCollider::upcast(manifold->getBody0());
const btMultiBodyLinkCollider* fcB = btMultiBodyLinkCollider::upcast(manifold->getBody1());
-
- btMultiBody* mbA = fcA? fcA->m_multiBody : 0;
- btMultiBody* mbB = fcB? fcB->m_multiBody : 0;
- btCollisionObject* colObj0=0,*colObj1=0;
+ btMultiBody* mbA = fcA ? fcA->m_multiBody : 0;
+ btMultiBody* mbB = fcB ? fcB->m_multiBody : 0;
+
+ btCollisionObject *colObj0 = 0, *colObj1 = 0;
colObj0 = (btCollisionObject*)manifold->getBody0();
colObj1 = (btCollisionObject*)manifold->getBody1();
- int solverBodyIdA = mbA? -1 : getOrInitSolverBody(*colObj0,infoGlobal.m_timeStep);
- int solverBodyIdB = mbB ? -1 : getOrInitSolverBody(*colObj1,infoGlobal.m_timeStep);
-
-// btSolverBody* solverBodyA = mbA ? 0 : &m_tmpSolverBodyPool[solverBodyIdA];
-// btSolverBody* solverBodyB = mbB ? 0 : &m_tmpSolverBodyPool[solverBodyIdB];
+ int solverBodyIdA = mbA ? -1 : getOrInitSolverBody(*colObj0, infoGlobal.m_timeStep);
+ int solverBodyIdB = mbB ? -1 : getOrInitSolverBody(*colObj1, infoGlobal.m_timeStep);
+ // btSolverBody* solverBodyA = mbA ? 0 : &m_tmpSolverBodyPool[solverBodyIdA];
+ // btSolverBody* solverBodyB = mbB ? 0 : &m_tmpSolverBodyPool[solverBodyIdB];
///avoid collision response between two static objects
-// if (!solverBodyA || (solverBodyA->m_invMass.isZero() && (!solverBodyB || solverBodyB->m_invMass.isZero())))
+ // if (!solverBodyA || (solverBodyA->m_invMass.isZero() && (!solverBodyB || solverBodyB->m_invMass.isZero())))
// return;
- //only a single rollingFriction per manifold
- int rollingFriction=1;
-
- for (int j=0;j<manifold->getNumContacts();j++)
- {
+ //only a single rollingFriction per manifold
+ int rollingFriction = 1;
+ for (int j = 0; j < manifold->getNumContacts(); j++)
+ {
btManifoldPoint& cp = manifold->getContactPoint(j);
if (cp.getDistance() <= manifold->getContactProcessingThreshold())
{
-
btScalar relaxation;
int frictionIndex = m_multiBodyNormalContactConstraints.size();
btMultiBodySolverConstraint& solverConstraint = m_multiBodyNormalContactConstraints.expandNonInitializing();
- // btRigidBody* rb0 = btRigidBody::upcast(colObj0);
- // btRigidBody* rb1 = btRigidBody::upcast(colObj1);
- solverConstraint.m_orgConstraint = 0;
- solverConstraint.m_orgDofIndex = -1;
+ // btRigidBody* rb0 = btRigidBody::upcast(colObj0);
+ // btRigidBody* rb1 = btRigidBody::upcast(colObj1);
+ solverConstraint.m_orgConstraint = 0;
+ solverConstraint.m_orgDofIndex = -1;
solverConstraint.m_solverBodyIdA = solverBodyIdA;
solverConstraint.m_solverBodyIdB = solverBodyIdB;
solverConstraint.m_multiBodyA = mbA;
@@ -1253,60 +1224,59 @@ void btMultiBodyConstraintSolver::convertMultiBodyContact(btPersistentManifold*
solverConstraint.m_originalContactPoint = &cp;
bool isFriction = false;
- setupMultiBodyContactConstraint(solverConstraint, cp.m_normalWorldOnB,cp, infoGlobal, relaxation, isFriction);
+ setupMultiBodyContactConstraint(solverConstraint, cp.m_normalWorldOnB, cp, infoGlobal, relaxation, isFriction);
-// const btVector3& pos1 = cp.getPositionWorldOnA();
-// const btVector3& pos2 = cp.getPositionWorldOnB();
+ // const btVector3& pos1 = cp.getPositionWorldOnA();
+ // const btVector3& pos2 = cp.getPositionWorldOnB();
/////setup the friction constraints
#define ENABLE_FRICTION
#ifdef ENABLE_FRICTION
- solverConstraint.m_frictionIndex = frictionIndex;
+ solverConstraint.m_frictionIndex = m_multiBodyFrictionContactConstraints.size();
///Bullet has several options to set the friction directions
///By default, each contact has only a single friction direction that is recomputed automatically every frame
///based on the relative linear velocity.
///If the relative velocity is zero, it will automatically compute a friction direction.
-
+
///You can also enable two friction directions, using the SOLVER_USE_2_FRICTION_DIRECTIONS.
///In that case, the second friction direction will be orthogonal to both contact normal and first friction direction.
///
///If you choose SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION, then the friction will be independent from the relative projected velocity.
///
- ///The user can manually override the friction directions for certain contacts using a contact callback,
+ ///The user can manually override the friction directions for certain contacts using a contact callback,
///and set the cp.m_lateralFrictionInitialized to true
///In that case, you can set the target relative motion in each friction direction (cp.m_contactMotion1 and cp.m_contactMotion2)
///this will give a conveyor belt effect
///
- btPlaneSpace1(cp.m_normalWorldOnB,cp.m_lateralFrictionDir1,cp.m_lateralFrictionDir2);
+ btPlaneSpace1(cp.m_normalWorldOnB, cp.m_lateralFrictionDir1, cp.m_lateralFrictionDir2);
cp.m_lateralFrictionDir1.normalize();
cp.m_lateralFrictionDir2.normalize();
- if (rollingFriction > 0 )
- {
- if (cp.m_combinedSpinningFriction>0)
- {
- addMultiBodyTorsionalFrictionConstraint(cp.m_normalWorldOnB,manifold,frictionIndex,cp,cp.m_combinedSpinningFriction, colObj0,colObj1, relaxation,infoGlobal);
- }
- if (cp.m_combinedRollingFriction>0)
- {
-
- applyAnisotropicFriction(colObj0,cp.m_lateralFrictionDir1,btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION);
- applyAnisotropicFriction(colObj1,cp.m_lateralFrictionDir1,btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION);
- applyAnisotropicFriction(colObj0,cp.m_lateralFrictionDir2,btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION);
- applyAnisotropicFriction(colObj1,cp.m_lateralFrictionDir2,btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION);
-
- if (cp.m_lateralFrictionDir1.length()>0.001)
- addMultiBodyTorsionalFrictionConstraint(cp.m_lateralFrictionDir1,manifold,frictionIndex,cp,cp.m_combinedRollingFriction, colObj0,colObj1, relaxation,infoGlobal);
-
- if (cp.m_lateralFrictionDir2.length()>0.001)
- addMultiBodyTorsionalFrictionConstraint(cp.m_lateralFrictionDir2,manifold,frictionIndex,cp,cp.m_combinedRollingFriction, colObj0,colObj1, relaxation,infoGlobal);
- }
- rollingFriction--;
- }
- if (!(infoGlobal.m_solverMode & SOLVER_ENABLE_FRICTION_DIRECTION_CACHING) || !(cp.m_contactPointFlags&BT_CONTACT_FLAG_LATERAL_FRICTION_INITIALIZED))
- {/*
+ if (rollingFriction > 0)
+ {
+ if (cp.m_combinedSpinningFriction > 0)
+ {
+ addMultiBodyTorsionalFrictionConstraint(cp.m_normalWorldOnB, manifold, frictionIndex, cp, cp.m_combinedSpinningFriction, colObj0, colObj1, relaxation, infoGlobal);
+ }
+ if (cp.m_combinedRollingFriction > 0)
+ {
+ applyAnisotropicFriction(colObj0, cp.m_lateralFrictionDir1, btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION);
+ applyAnisotropicFriction(colObj1, cp.m_lateralFrictionDir1, btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION);
+ applyAnisotropicFriction(colObj0, cp.m_lateralFrictionDir2, btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION);
+ applyAnisotropicFriction(colObj1, cp.m_lateralFrictionDir2, btCollisionObject::CF_ANISOTROPIC_ROLLING_FRICTION);
+
+ if (cp.m_lateralFrictionDir1.length() > 0.001)
+ addMultiBodyTorsionalFrictionConstraint(cp.m_lateralFrictionDir1, manifold, frictionIndex, cp, cp.m_combinedRollingFriction, colObj0, colObj1, relaxation, infoGlobal);
+
+ if (cp.m_lateralFrictionDir2.length() > 0.001)
+ addMultiBodyTorsionalFrictionConstraint(cp.m_lateralFrictionDir2, manifold, frictionIndex, cp, cp.m_combinedRollingFriction, colObj0, colObj1, relaxation, infoGlobal);
+ }
+ rollingFriction--;
+ }
+ if (!(infoGlobal.m_solverMode & SOLVER_ENABLE_FRICTION_DIRECTION_CACHING) || !(cp.m_contactPointFlags & BT_CONTACT_FLAG_LATERAL_FRICTION_INITIALIZED))
+ { /*
cp.m_lateralFrictionDir1 = vel - cp.m_normalWorldOnB * rel_vel;
btScalar lat_rel_vel = cp.m_lateralFrictionDir1.length2();
if (!(infoGlobal.m_solverMode & SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION) && lat_rel_vel > SIMD_EPSILON)
@@ -1329,85 +1299,77 @@ void btMultiBodyConstraintSolver::convertMultiBodyContact(btPersistentManifold*
} else
*/
{
-
-
- applyAnisotropicFriction(colObj0,cp.m_lateralFrictionDir1,btCollisionObject::CF_ANISOTROPIC_FRICTION);
- applyAnisotropicFriction(colObj1,cp.m_lateralFrictionDir1,btCollisionObject::CF_ANISOTROPIC_FRICTION);
- addMultiBodyFrictionConstraint(cp.m_lateralFrictionDir1,manifold,frictionIndex,cp,colObj0,colObj1, relaxation,infoGlobal);
-
+ applyAnisotropicFriction(colObj0, cp.m_lateralFrictionDir1, btCollisionObject::CF_ANISOTROPIC_FRICTION);
+ applyAnisotropicFriction(colObj1, cp.m_lateralFrictionDir1, btCollisionObject::CF_ANISOTROPIC_FRICTION);
+ addMultiBodyFrictionConstraint(cp.m_lateralFrictionDir1, manifold, frictionIndex, cp, colObj0, colObj1, relaxation, infoGlobal);
if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS))
{
- applyAnisotropicFriction(colObj0,cp.m_lateralFrictionDir2,btCollisionObject::CF_ANISOTROPIC_FRICTION);
- applyAnisotropicFriction(colObj1,cp.m_lateralFrictionDir2,btCollisionObject::CF_ANISOTROPIC_FRICTION);
- addMultiBodyFrictionConstraint(cp.m_lateralFrictionDir2,manifold,frictionIndex,cp,colObj0,colObj1, relaxation,infoGlobal);
+ applyAnisotropicFriction(colObj0, cp.m_lateralFrictionDir2, btCollisionObject::CF_ANISOTROPIC_FRICTION);
+ applyAnisotropicFriction(colObj1, cp.m_lateralFrictionDir2, btCollisionObject::CF_ANISOTROPIC_FRICTION);
+ addMultiBodyFrictionConstraint(cp.m_lateralFrictionDir2, manifold, frictionIndex, cp, colObj0, colObj1, relaxation, infoGlobal);
}
if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS) && (infoGlobal.m_solverMode & SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION))
{
- cp.m_contactPointFlags|=BT_CONTACT_FLAG_LATERAL_FRICTION_INITIALIZED;
+ cp.m_contactPointFlags |= BT_CONTACT_FLAG_LATERAL_FRICTION_INITIALIZED;
}
}
-
- } else
+ }
+ else
{
- addMultiBodyFrictionConstraint(cp.m_lateralFrictionDir1,manifold,frictionIndex,cp,colObj0,colObj1, relaxation,infoGlobal,cp.m_contactMotion1, cp.m_frictionCFM);
+ addMultiBodyFrictionConstraint(cp.m_lateralFrictionDir1, manifold, frictionIndex, cp, colObj0, colObj1, relaxation, infoGlobal, cp.m_contactMotion1, cp.m_frictionCFM);
if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS))
- addMultiBodyFrictionConstraint(cp.m_lateralFrictionDir2,manifold,frictionIndex,cp,colObj0,colObj1, relaxation, infoGlobal,cp.m_contactMotion2, cp.m_frictionCFM);
+ addMultiBodyFrictionConstraint(cp.m_lateralFrictionDir2, manifold, frictionIndex, cp, colObj0, colObj1, relaxation, infoGlobal, cp.m_contactMotion2, cp.m_frictionCFM);
//setMultiBodyFrictionConstraintImpulse( solverConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal);
//todo:
solverConstraint.m_appliedImpulse = 0.f;
solverConstraint.m_appliedPushImpulse = 0.f;
}
-
-
-#endif //ENABLE_FRICTION
+#endif //ENABLE_FRICTION
}
}
}
-void btMultiBodyConstraintSolver::convertContacts(btPersistentManifold** manifoldPtr,int numManifolds, const btContactSolverInfo& infoGlobal)
+void btMultiBodyConstraintSolver::convertContacts(btPersistentManifold** manifoldPtr, int numManifolds, const btContactSolverInfo& infoGlobal)
{
//btPersistentManifold* manifold = 0;
- for (int i=0;i<numManifolds;i++)
+ for (int i = 0; i < numManifolds; i++)
{
- btPersistentManifold* manifold= manifoldPtr[i];
+ btPersistentManifold* manifold = manifoldPtr[i];
const btMultiBodyLinkCollider* fcA = btMultiBodyLinkCollider::upcast(manifold->getBody0());
const btMultiBodyLinkCollider* fcB = btMultiBodyLinkCollider::upcast(manifold->getBody1());
if (!fcA && !fcB)
{
//the contact doesn't involve any Featherstone btMultiBody, so deal with the regular btRigidBody/btCollisionObject case
- convertContact(manifold,infoGlobal);
- } else
+ convertContact(manifold, infoGlobal);
+ }
+ else
{
- convertMultiBodyContact(manifold,infoGlobal);
+ convertMultiBodyContact(manifold, infoGlobal);
}
}
//also convert the multibody constraints, if any
-
- for (int i=0;i<m_tmpNumMultiBodyConstraints;i++)
+ for (int i = 0; i < m_tmpNumMultiBodyConstraints; i++)
{
btMultiBodyConstraint* c = m_tmpMultiBodyConstraints[i];
m_data.m_solverBodyPool = &m_tmpSolverBodyPool;
m_data.m_fixedBodyId = m_fixedBodyId;
-
- c->createConstraintRows(m_multiBodyNonContactConstraints,m_data, infoGlobal);
- }
+ c->createConstraintRows(m_multiBodyNonContactConstraints, m_data, infoGlobal);
+ }
}
-
-
-btScalar btMultiBodyConstraintSolver::solveGroup(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifold,int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& info, btIDebugDraw* debugDrawer,btDispatcher* dispatcher)
+btScalar btMultiBodyConstraintSolver::solveGroup(btCollisionObject** bodies, int numBodies, btPersistentManifold** manifold, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& info, btIDebugDraw* debugDrawer, btDispatcher* dispatcher)
{
//printf("btMultiBodyConstraintSolver::solveGroup: numBodies=%d, numConstraints=%d\n", numBodies, numConstraints);
- return btSequentialImpulseConstraintSolver::solveGroup(bodies,numBodies,manifold,numManifolds,constraints,numConstraints,info,debugDrawer,dispatcher);
+ return btSequentialImpulseConstraintSolver::solveGroup(bodies, numBodies, manifold, numManifolds, constraints, numConstraints, info, debugDrawer, dispatcher);
}
#if 0
@@ -1431,56 +1393,54 @@ static void applyJointFeedback(btMultiBodyJacobianData& data, const btMultiBodyS
}
#endif
-
void btMultiBodyConstraintSolver::writeBackSolverBodyToMultiBody(btMultiBodySolverConstraint& c, btScalar deltaTime)
{
-#if 1
-
+#if 1
+
//bod->addBaseForce(m_gravity * bod->getBaseMass());
//bod->addLinkForce(j, m_gravity * bod->getLinkMass(j));
if (c.m_orgConstraint)
{
- c.m_orgConstraint->internalSetAppliedImpulse(c.m_orgDofIndex,c.m_appliedImpulse);
+ c.m_orgConstraint->internalSetAppliedImpulse(c.m_orgDofIndex, c.m_appliedImpulse);
}
-
if (c.m_multiBodyA)
{
-
c.m_multiBodyA->setCompanionId(-1);
- btVector3 force = c.m_contactNormal1*(c.m_appliedImpulse/deltaTime);
- btVector3 torque = c.m_relpos1CrossNormal*(c.m_appliedImpulse/deltaTime);
- if (c.m_linkA<0)
+ btVector3 force = c.m_contactNormal1 * (c.m_appliedImpulse / deltaTime);
+ btVector3 torque = c.m_relpos1CrossNormal * (c.m_appliedImpulse / deltaTime);
+ if (c.m_linkA < 0)
{
c.m_multiBodyA->addBaseConstraintForce(force);
c.m_multiBodyA->addBaseConstraintTorque(torque);
- } else
+ }
+ else
{
- c.m_multiBodyA->addLinkConstraintForce(c.m_linkA,force);
- //b3Printf("force = %f,%f,%f\n",force[0],force[1],force[2]);//[0],torque[1],torque[2]);
- c.m_multiBodyA->addLinkConstraintTorque(c.m_linkA,torque);
+ c.m_multiBodyA->addLinkConstraintForce(c.m_linkA, force);
+ //b3Printf("force = %f,%f,%f\n",force[0],force[1],force[2]);//[0],torque[1],torque[2]);
+ c.m_multiBodyA->addLinkConstraintTorque(c.m_linkA, torque);
}
}
-
+
if (c.m_multiBodyB)
{
{
c.m_multiBodyB->setCompanionId(-1);
- btVector3 force = c.m_contactNormal2*(c.m_appliedImpulse/deltaTime);
- btVector3 torque = c.m_relpos2CrossNormal*(c.m_appliedImpulse/deltaTime);
- if (c.m_linkB<0)
+ btVector3 force = c.m_contactNormal2 * (c.m_appliedImpulse / deltaTime);
+ btVector3 torque = c.m_relpos2CrossNormal * (c.m_appliedImpulse / deltaTime);
+ if (c.m_linkB < 0)
{
c.m_multiBodyB->addBaseConstraintForce(force);
c.m_multiBodyB->addBaseConstraintTorque(torque);
- } else
+ }
+ else
{
{
- c.m_multiBodyB->addLinkConstraintForce(c.m_linkB,force);
+ c.m_multiBodyB->addLinkConstraintForce(c.m_linkB, force);
//b3Printf("t = %f,%f,%f\n",force[0],force[1],force[2]);//[0],torque[1],torque[2]);
- c.m_multiBodyB->addLinkConstraintTorque(c.m_linkB,torque);
+ c.m_multiBodyB->addLinkConstraintTorque(c.m_linkB, torque);
}
-
}
}
}
@@ -1490,66 +1450,64 @@ void btMultiBodyConstraintSolver::writeBackSolverBodyToMultiBody(btMultiBodySolv
if (c.m_multiBodyA)
{
- c.m_multiBodyA->applyDeltaVeeMultiDof(&m_data.m_deltaVelocitiesUnitImpulse[c.m_jacAindex],c.m_appliedImpulse);
+ c.m_multiBodyA->applyDeltaVeeMultiDof(&m_data.m_deltaVelocitiesUnitImpulse[c.m_jacAindex], c.m_appliedImpulse);
}
-
+
if (c.m_multiBodyB)
{
- c.m_multiBodyB->applyDeltaVeeMultiDof(&m_data.m_deltaVelocitiesUnitImpulse[c.m_jacBindex],c.m_appliedImpulse);
+ c.m_multiBodyB->applyDeltaVeeMultiDof(&m_data.m_deltaVelocitiesUnitImpulse[c.m_jacBindex], c.m_appliedImpulse);
}
#endif
-
-
-
}
-btScalar btMultiBodyConstraintSolver::solveGroupCacheFriendlyFinish(btCollisionObject** bodies,int numBodies,const btContactSolverInfo& infoGlobal)
+btScalar btMultiBodyConstraintSolver::solveGroupCacheFriendlyFinish(btCollisionObject** bodies, int numBodies, const btContactSolverInfo& infoGlobal)
{
BT_PROFILE("btMultiBodyConstraintSolver::solveGroupCacheFriendlyFinish");
int numPoolConstraints = m_multiBodyNormalContactConstraints.size();
-
- //write back the delta v to the multi bodies, either as applied impulse (direct velocity change)
+ //write back the delta v to the multi bodies, either as applied impulse (direct velocity change)
//or as applied force, so we can measure the joint reaction forces easier
- for (int i=0;i<numPoolConstraints;i++)
+ for (int i = 0; i < numPoolConstraints; i++)
{
btMultiBodySolverConstraint& solverConstraint = m_multiBodyNormalContactConstraints[i];
- writeBackSolverBodyToMultiBody(solverConstraint,infoGlobal.m_timeStep);
+ writeBackSolverBodyToMultiBody(solverConstraint, infoGlobal.m_timeStep);
- writeBackSolverBodyToMultiBody(m_multiBodyFrictionContactConstraints[solverConstraint.m_frictionIndex],infoGlobal.m_timeStep);
+ writeBackSolverBodyToMultiBody(m_multiBodyFrictionContactConstraints[solverConstraint.m_frictionIndex], infoGlobal.m_timeStep);
if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS))
{
- writeBackSolverBodyToMultiBody(m_multiBodyFrictionContactConstraints[solverConstraint.m_frictionIndex+1],infoGlobal.m_timeStep);
+ writeBackSolverBodyToMultiBody(m_multiBodyFrictionContactConstraints[solverConstraint.m_frictionIndex + 1], infoGlobal.m_timeStep);
}
}
-
- for (int i=0;i<m_multiBodyNonContactConstraints.size();i++)
+ for (int i = 0; i < m_multiBodyNonContactConstraints.size(); i++)
{
btMultiBodySolverConstraint& solverConstraint = m_multiBodyNonContactConstraints[i];
- writeBackSolverBodyToMultiBody(solverConstraint,infoGlobal.m_timeStep);
+ writeBackSolverBodyToMultiBody(solverConstraint, infoGlobal.m_timeStep);
}
-
if (infoGlobal.m_solverMode & SOLVER_USE_WARMSTARTING)
{
BT_PROFILE("warm starting write back");
- for (int j=0;j<numPoolConstraints;j++)
+ for (int j = 0; j < numPoolConstraints; j++)
{
const btMultiBodySolverConstraint& solverConstraint = m_multiBodyNormalContactConstraints[j];
- btManifoldPoint* pt = (btManifoldPoint*) solverConstraint.m_originalContactPoint;
+ btManifoldPoint* pt = (btManifoldPoint*)solverConstraint.m_originalContactPoint;
btAssert(pt);
pt->m_appliedImpulse = solverConstraint.m_appliedImpulse;
pt->m_appliedImpulseLateral1 = m_multiBodyFrictionContactConstraints[solverConstraint.m_frictionIndex].m_appliedImpulse;
-
+
//printf("pt->m_appliedImpulseLateral1 = %f\n", pt->m_appliedImpulseLateral1);
if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS))
{
- pt->m_appliedImpulseLateral2 = m_multiBodyFrictionContactConstraints[solverConstraint.m_frictionIndex+1].m_appliedImpulse;
+ pt->m_appliedImpulseLateral2 = m_multiBodyFrictionContactConstraints[solverConstraint.m_frictionIndex + 1].m_appliedImpulse;
+ } else
+ {
+ pt->m_appliedImpulseLateral2 = 0;
}
- //do a callback here?
}
+
+ //do a callback here?
}
#if 0
//multibody joint feedback
@@ -1648,25 +1606,22 @@ btScalar btMultiBodyConstraintSolver::solveGroupCacheFriendlyFinish(btCollisionO
}
}
-#endif
+#endif
#endif
- return btSequentialImpulseConstraintSolver::solveGroupCacheFriendlyFinish(bodies,numBodies,infoGlobal);
+ return btSequentialImpulseConstraintSolver::solveGroupCacheFriendlyFinish(bodies, numBodies, infoGlobal);
}
-
-void btMultiBodyConstraintSolver::solveMultiBodyGroup(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifold,int numManifolds,btTypedConstraint** constraints,int numConstraints,btMultiBodyConstraint** multiBodyConstraints, int numMultiBodyConstraints, const btContactSolverInfo& info, btIDebugDraw* debugDrawer,btDispatcher* dispatcher)
+void btMultiBodyConstraintSolver::solveMultiBodyGroup(btCollisionObject** bodies, int numBodies, btPersistentManifold** manifold, int numManifolds, btTypedConstraint** constraints, int numConstraints, btMultiBodyConstraint** multiBodyConstraints, int numMultiBodyConstraints, const btContactSolverInfo& info, btIDebugDraw* debugDrawer, btDispatcher* dispatcher)
{
//printf("solveMultiBodyGroup: numBodies=%d, numConstraints=%d, numManifolds=%d, numMultiBodyConstraints=%d\n", numBodies, numConstraints, numManifolds, numMultiBodyConstraints);
//printf("solveMultiBodyGroup start\n");
m_tmpMultiBodyConstraints = multiBodyConstraints;
m_tmpNumMultiBodyConstraints = numMultiBodyConstraints;
-
- btSequentialImpulseConstraintSolver::solveGroup(bodies,numBodies,manifold,numManifolds,constraints,numConstraints,info,debugDrawer,dispatcher);
+
+ btSequentialImpulseConstraintSolver::solveGroup(bodies, numBodies, manifold, numManifolds, constraints, numConstraints, info, debugDrawer, dispatcher);
m_tmpMultiBodyConstraints = 0;
m_tmpNumMultiBodyConstraints = 0;
-
-
}
diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyConstraintSolver.h b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyConstraintSolver.h
index 29f484e1d8..f39f2879fc 100644
--- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyConstraintSolver.h
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyConstraintSolver.h
@@ -25,80 +25,71 @@ class btMultiBody;
#include "btMultiBodyConstraint.h"
-
-
-ATTRIBUTE_ALIGNED16(class) btMultiBodyConstraintSolver : public btSequentialImpulseConstraintSolver
+ATTRIBUTE_ALIGNED16(class)
+btMultiBodyConstraintSolver : public btSequentialImpulseConstraintSolver
{
-
protected:
+ btMultiBodyConstraintArray m_multiBodyNonContactConstraints;
- btMultiBodyConstraintArray m_multiBodyNonContactConstraints;
+ btMultiBodyConstraintArray m_multiBodyNormalContactConstraints;
+ btMultiBodyConstraintArray m_multiBodyFrictionContactConstraints;
+ btMultiBodyConstraintArray m_multiBodyTorsionalFrictionContactConstraints;
- btMultiBodyConstraintArray m_multiBodyNormalContactConstraints;
- btMultiBodyConstraintArray m_multiBodyFrictionContactConstraints;
- btMultiBodyConstraintArray m_multiBodyTorsionalFrictionContactConstraints;
+ btMultiBodyJacobianData m_data;
- btMultiBodyJacobianData m_data;
-
//temp storage for multi body constraints for a specific island/group called by 'solveGroup'
- btMultiBodyConstraint** m_tmpMultiBodyConstraints;
- int m_tmpNumMultiBodyConstraints;
+ 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,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);
-
- void setupMultiBodyJointLimitConstraint(btMultiBodySolverConstraint& constraintRow,
- btScalar* jacA,btScalar* jacB,
- btScalar penetration,btScalar combinedFrictionCoeff, btScalar combinedRestitutionCoeff,
- const btContactSolverInfo& infoGlobal);
-
- void setupMultiBodyContactConstraint(btMultiBodySolverConstraint& solverConstraint,
- const btVector3& contactNormal,
- 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();
+ void convertContacts(btPersistentManifold * *manifoldPtr, int numManifolds, const btContactSolverInfo& infoGlobal);
- ///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);
-};
+ btMultiBodySolverConstraint& addMultiBodyFrictionConstraint(const btVector3& normalAxis, 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);
-
-
+ void setupMultiBodyJointLimitConstraint(btMultiBodySolverConstraint & constraintRow,
+ btScalar * jacA, btScalar * jacB,
+ btScalar penetration, btScalar combinedFrictionCoeff, btScalar combinedRestitutionCoeff,
+ const btContactSolverInfo& infoGlobal);
+ void setupMultiBodyContactConstraint(btMultiBodySolverConstraint & solverConstraint,
+ const btVector3& contactNormal,
+ btManifoldPoint& cp, const btContactSolverInfo& infoGlobal,
+ btScalar& relaxation,
+ bool isFriction, btScalar desiredVelocity = 0, btScalar cfmSlip = 0);
-#endif //BT_MULTIBODY_CONSTRAINT_SOLVER_H
+ //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/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyDynamicsWorld.cpp b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyDynamicsWorld.cpp
index 9c5f3ad8a9..1557987bc3 100644
--- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyDynamicsWorld.cpp
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyDynamicsWorld.cpp
@@ -23,45 +23,43 @@ subject to the following restrictions:
#include "LinearMath/btIDebugDraw.h"
#include "LinearMath/btSerializer.h"
-
-void btMultiBodyDynamicsWorld::addMultiBody(btMultiBody* body, int group, int mask)
+void btMultiBodyDynamicsWorld::addMultiBody(btMultiBody* body, int group, int mask)
{
m_multiBodies.push_back(body);
-
}
-void btMultiBodyDynamicsWorld::removeMultiBody(btMultiBody* body)
+void btMultiBodyDynamicsWorld::removeMultiBody(btMultiBody* body)
{
m_multiBodies.remove(body);
}
-void btMultiBodyDynamicsWorld::calculateSimulationIslands()
+void btMultiBodyDynamicsWorld::calculateSimulationIslands()
{
BT_PROFILE("calculateSimulationIslands");
- getSimulationIslandManager()->updateActivationState(getCollisionWorld(),getCollisionWorld()->getDispatcher());
-
- {
- //merge islands based on speculative contact manifolds too
- for (int i=0;i<this->m_predictiveManifolds.size();i++)
- {
- btPersistentManifold* manifold = m_predictiveManifolds[i];
-
- const btCollisionObject* colObj0 = manifold->getBody0();
- const btCollisionObject* colObj1 = manifold->getBody1();
-
- if (((colObj0) && (!(colObj0)->isStaticOrKinematicObject())) &&
- ((colObj1) && (!(colObj1)->isStaticOrKinematicObject())))
- {
- getSimulationIslandManager()->getUnionFind().unite((colObj0)->getIslandTag(),(colObj1)->getIslandTag());
- }
- }
- }
-
+ getSimulationIslandManager()->updateActivationState(getCollisionWorld(), getCollisionWorld()->getDispatcher());
+
+ {
+ //merge islands based on speculative contact manifolds too
+ for (int i = 0; i < this->m_predictiveManifolds.size(); i++)
+ {
+ btPersistentManifold* manifold = m_predictiveManifolds[i];
+
+ const btCollisionObject* colObj0 = manifold->getBody0();
+ const btCollisionObject* colObj1 = manifold->getBody1();
+
+ if (((colObj0) && (!(colObj0)->isStaticOrKinematicObject())) &&
+ ((colObj1) && (!(colObj1)->isStaticOrKinematicObject())))
+ {
+ getSimulationIslandManager()->getUnionFind().unite((colObj0)->getIslandTag(), (colObj1)->getIslandTag());
+ }
+ }
+ }
+
{
int i;
int numConstraints = int(m_constraints.size());
- for (i=0;i< numConstraints ; i++ )
+ for (i = 0; i < numConstraints; i++)
{
btTypedConstraint* constraint = m_constraints[i];
if (constraint->isEnabled())
@@ -72,23 +70,23 @@ void btMultiBodyDynamicsWorld::calculateSimulationIslands()
if (((colObj0) && (!(colObj0)->isStaticOrKinematicObject())) &&
((colObj1) && (!(colObj1)->isStaticOrKinematicObject())))
{
- getSimulationIslandManager()->getUnionFind().unite((colObj0)->getIslandTag(),(colObj1)->getIslandTag());
+ getSimulationIslandManager()->getUnionFind().unite((colObj0)->getIslandTag(), (colObj1)->getIslandTag());
}
}
}
}
//merge islands linked by Featherstone link colliders
- for (int i=0;i<m_multiBodies.size();i++)
+ for (int i = 0; i < m_multiBodies.size(); i++)
{
btMultiBody* body = m_multiBodies[i];
{
btMultiBodyLinkCollider* prev = body->getBaseCollider();
- for (int b=0;b<body->getNumLinks();b++)
+ for (int b = 0; b < body->getNumLinks(); b++)
{
btMultiBodyLinkCollider* cur = body->getLink(b).m_collider;
-
+
if (((cur) && (!(cur)->isStaticOrKinematicObject())) &&
((prev) && (!(prev)->isStaticOrKinematicObject())))
{
@@ -98,36 +96,31 @@ void btMultiBodyDynamicsWorld::calculateSimulationIslands()
}
if (cur && !cur->isStaticOrKinematicObject())
prev = cur;
-
}
}
}
//merge islands linked by multibody constraints
{
- for (int i=0;i<this->m_multiBodyConstraints.size();i++)
+ for (int i = 0; i < this->m_multiBodyConstraints.size(); i++)
{
btMultiBodyConstraint* c = m_multiBodyConstraints[i];
int tagA = c->getIslandIdA();
int tagB = c->getIslandIdB();
- if (tagA>=0 && tagB>=0)
+ if (tagA >= 0 && tagB >= 0)
getSimulationIslandManager()->getUnionFind().unite(tagA, tagB);
}
}
//Store the island id in each body
getSimulationIslandManager()->storeIslandActivationState(getCollisionWorld());
-
}
-
-void btMultiBodyDynamicsWorld::updateActivationState(btScalar timeStep)
+void btMultiBodyDynamicsWorld::updateActivationState(btScalar timeStep)
{
BT_PROFILE("btMultiBodyDynamicsWorld::updateActivationState");
-
-
- for ( int i=0;i<m_multiBodies.size();i++)
+ for (int i = 0; i < m_multiBodies.size(); i++)
{
btMultiBody* body = m_multiBodies[i];
if (body)
@@ -138,119 +131,108 @@ void btMultiBodyDynamicsWorld::updateActivationState(btScalar timeStep)
btMultiBodyLinkCollider* col = body->getBaseCollider();
if (col && col->getActivationState() == ACTIVE_TAG)
{
- col->setActivationState( WANTS_DEACTIVATION);
+ col->setActivationState(WANTS_DEACTIVATION);
col->setDeactivationTime(0.f);
}
- for (int b=0;b<body->getNumLinks();b++)
+ for (int b = 0; b < body->getNumLinks(); b++)
{
btMultiBodyLinkCollider* col = body->getLink(b).m_collider;
if (col && col->getActivationState() == ACTIVE_TAG)
{
- col->setActivationState( WANTS_DEACTIVATION);
+ col->setActivationState(WANTS_DEACTIVATION);
col->setDeactivationTime(0.f);
}
}
- } else
+ }
+ else
{
btMultiBodyLinkCollider* col = body->getBaseCollider();
if (col && col->getActivationState() != DISABLE_DEACTIVATION)
- col->setActivationState( ACTIVE_TAG );
+ col->setActivationState(ACTIVE_TAG);
- for (int b=0;b<body->getNumLinks();b++)
+ for (int b = 0; b < body->getNumLinks(); b++)
{
btMultiBodyLinkCollider* col = body->getLink(b).m_collider;
if (col && col->getActivationState() != DISABLE_DEACTIVATION)
- col->setActivationState( ACTIVE_TAG );
+ col->setActivationState(ACTIVE_TAG);
}
}
-
}
}
btDiscreteDynamicsWorld::updateActivationState(timeStep);
}
-
-SIMD_FORCE_INLINE int btGetConstraintIslandId2(const btTypedConstraint* lhs)
+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();
+ 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;
- }
+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)
+SIMD_FORCE_INLINE int btGetMultiBodyConstraintIslandId(const btMultiBodyConstraint* lhs)
{
int islandId;
-
+
int islandTagA = lhs->getIslandIdA();
int islandTagB = lhs->getIslandIdB();
- islandId= islandTagA>=0?islandTagA:islandTagB;
+ 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;
- }
+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;
-
+ 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<btCollisionObject*> m_bodies;
btAlignedObjectArray<btPersistentManifold*> m_manifolds;
btAlignedObjectArray<btTypedConstraint*> m_constraints;
btAlignedObjectArray<btMultiBodyConstraint*> m_multiBodyConstraints;
-
- MultiBodyInplaceSolverIslandCallback( btMultiBodyConstraintSolver* solver,
- btDispatcher* dispatcher)
- :m_solverInfo(NULL),
- m_solver(solver),
- m_multiBodySortedConstraints(NULL),
- m_numConstraints(0),
- m_debugDrawer(NULL),
- m_dispatcher(dispatcher)
+ 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=(MultiBodyInplaceSolverIslandCallback& other)
@@ -260,7 +242,7 @@ struct MultiBodyInplaceSolverIslandCallback : public btSimulationIslandManager::
return *this;
}
- SIMD_FORCE_INLINE void setup ( btContactSolverInfo* solverInfo, btTypedConstraint** sortedConstraints, int numConstraints, btMultiBodyConstraint** sortedMultiBodyConstraints, int numMultiBodyConstraints, btIDebugDraw* debugDrawer)
+ SIMD_FORCE_INLINE void setup(btContactSolverInfo* solverInfo, btTypedConstraint** sortedConstraints, int numConstraints, btMultiBodyConstraint** sortedMultiBodyConstraints, int numMultiBodyConstraints, btIDebugDraw* debugDrawer)
{
btAssert(solverInfo);
m_solverInfo = solverInfo;
@@ -271,26 +253,27 @@ struct MultiBodyInplaceSolverIslandCallback : public btSimulationIslandManager::
m_numConstraints = numConstraints;
m_debugDrawer = debugDrawer;
- m_bodies.resize (0);
- m_manifolds.resize (0);
- m_constraints.resize (0);
+ 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)
+ void setMultiBodyConstraintSolver(btMultiBodyConstraintSolver* solver)
+ {
+ m_solver = solver;
+ }
+
+ virtual void processIsland(btCollisionObject** bodies, int numBodies, btPersistentManifold** manifolds, int numManifolds, int islandId)
{
- if (islandId<0)
+ 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);
- } else
+ m_solver->solveMultiBodyGroup(bodies, numBodies, manifolds, numManifolds, m_sortedConstraints, m_numConstraints, &m_multiBodySortedConstraints[0], m_numConstraints, *m_solverInfo, m_debugDrawer, m_dispatcher);
+ }
+ else
{
- //also add all non-contact constraints/joints for this island
+ //also add all non-contact constraints/joints for this island
btTypedConstraint** startConstraint = 0;
btMultiBodyConstraint** startMultiBodyConstraint = 0;
@@ -298,10 +281,10 @@ struct MultiBodyInplaceSolverIslandCallback : public btSimulationIslandManager::
int numCurMultiBodyConstraints = 0;
int i;
-
+
//find the first constraint for this island
- for (i=0;i<m_numConstraints;i++)
+ for (i = 0; i < m_numConstraints; i++)
{
if (btGetConstraintIslandId2(m_sortedConstraints[i]) == islandId)
{
@@ -310,7 +293,7 @@ struct MultiBodyInplaceSolverIslandCallback : public btSimulationIslandManager::
}
}
//count the number of constraints in this island
- for (;i<m_numConstraints;i++)
+ for (; i < m_numConstraints; i++)
{
if (btGetConstraintIslandId2(m_sortedConstraints[i]) == islandId)
{
@@ -318,17 +301,16 @@ struct MultiBodyInplaceSolverIslandCallback : public btSimulationIslandManager::
}
}
- for (i=0;i<m_numMultiBodyConstraints;i++)
+ 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++)
+ for (; i < m_numMultiBodyConstraints; i++)
{
if (btGetMultiBodyConstraintIslandId(m_multiBodySortedConstraints[i]) == islandId)
{
@@ -341,101 +323,94 @@ struct MultiBodyInplaceSolverIslandCallback : public btSimulationIslandManager::
// m_solver->solveGroup( bodies,numBodies,manifolds, numManifolds,startConstraint,numCurConstraints,*m_solverInfo,m_debugDrawer,m_dispatcher);
//} else
{
-
- for (i=0;i<numBodies;i++)
+ for (i = 0; i < numBodies; i++)
m_bodies.push_back(bodies[i]);
- for (i=0;i<numManifolds;i++)
+ for (i = 0; i < numManifolds; i++)
m_manifolds.push_back(manifolds[i]);
- for (i=0;i<numCurConstraints;i++)
+ for (i = 0; i < numCurConstraints; i++)
m_constraints.push_back(startConstraint[i]);
-
- for (i=0;i<numCurMultiBodyConstraints;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)
+
+ if ((m_multiBodyConstraints.size() + m_constraints.size() + m_manifolds.size()) > m_solverInfo->m_minimumSolverBatchSize)
{
processConstraints();
- } else
+ }
+ else
{
//printf("deferred\n");
}
}
}
}
- void processConstraints()
+ void processConstraints()
{
-
- 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;
+ 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);
+
+ 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);
m_bodies.resize(0);
m_manifolds.resize(0);
m_constraints.resize(0);
m_multiBodyConstraints.resize(0);
}
-
};
-
-
-btMultiBodyDynamicsWorld::btMultiBodyDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* pairCache,btMultiBodyConstraintSolver* constraintSolver,btCollisionConfiguration* collisionConfiguration)
- :btDiscreteDynamicsWorld(dispatcher,pairCache,constraintSolver,collisionConfiguration),
- m_multiBodyConstraintSolver(constraintSolver)
+btMultiBodyDynamicsWorld::btMultiBodyDynamicsWorld(btDispatcher* dispatcher, btBroadphaseInterface* pairCache, btMultiBodyConstraintSolver* constraintSolver, btCollisionConfiguration* collisionConfiguration)
+ : btDiscreteDynamicsWorld(dispatcher, pairCache, constraintSolver, collisionConfiguration),
+ m_multiBodyConstraintSolver(constraintSolver)
{
//split impulse is not yet supported for Featherstone hierarchies
-// getSolverInfo().m_splitImpulse = false;
- getSolverInfo().m_solverMode |=SOLVER_USE_2_FRICTION_DIRECTIONS;
- m_solverMultiBodyIslandCallback = new MultiBodyInplaceSolverIslandCallback(constraintSolver,dispatcher);
+ // getSolverInfo().m_splitImpulse = false;
+ getSolverInfo().m_solverMode |= SOLVER_USE_2_FRICTION_DIRECTIONS;
+ m_solverMultiBodyIslandCallback = new MultiBodyInplaceSolverIslandCallback(constraintSolver, dispatcher);
}
-btMultiBodyDynamicsWorld::~btMultiBodyDynamicsWorld ()
+btMultiBodyDynamicsWorld::~btMultiBodyDynamicsWorld()
{
delete m_solverMultiBodyIslandCallback;
}
-void btMultiBodyDynamicsWorld::setMultiBodyConstraintSolver(btMultiBodyConstraintSolver* solver)
+void btMultiBodyDynamicsWorld::setMultiBodyConstraintSolver(btMultiBodyConstraintSolver* solver)
{
- m_multiBodyConstraintSolver = solver;
- m_solverMultiBodyIslandCallback->setMultiBodyConstraintSolver(solver);
- btDiscreteDynamicsWorld::setConstraintSolver(solver);
+ m_multiBodyConstraintSolver = solver;
+ m_solverMultiBodyIslandCallback->setMultiBodyConstraintSolver(solver);
+ btDiscreteDynamicsWorld::setConstraintSolver(solver);
}
-void btMultiBodyDynamicsWorld::setConstraintSolver(btConstraintSolver* solver)
+void btMultiBodyDynamicsWorld::setConstraintSolver(btConstraintSolver* solver)
{
- if (solver->getSolverType()==BT_MULTIBODY_SOLVER)
- {
- m_multiBodyConstraintSolver = (btMultiBodyConstraintSolver*)solver;
- }
- btDiscreteDynamicsWorld::setConstraintSolver(solver);
+ if (solver->getSolverType() == BT_MULTIBODY_SOLVER)
+ {
+ m_multiBodyConstraintSolver = (btMultiBodyConstraintSolver*)solver;
+ }
+ btDiscreteDynamicsWorld::setConstraintSolver(solver);
}
-void btMultiBodyDynamicsWorld::forwardKinematics()
+void btMultiBodyDynamicsWorld::forwardKinematics()
{
-
- for (int b=0;b<m_multiBodies.size();b++)
+ for (int b = 0; b < m_multiBodies.size(); b++)
{
btMultiBody* bod = m_multiBodies[b];
- bod->forwardKinematics(m_scratch_world_to_local,m_scratch_local_origin);
+ bod->forwardKinematics(m_scratch_world_to_local, m_scratch_local_origin);
}
}
-void btMultiBodyDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo)
+void btMultiBodyDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo)
{
forwardKinematics();
-
-
BT_PROFILE("solveConstraints");
-
+
clearMultiBodyConstraintForces();
- m_sortedConstraints.resize( m_constraints.size());
- int i;
- for (i=0;i<getNumConstraints();i++)
+ m_sortedConstraints.resize(m_constraints.size());
+ int i;
+ for (i = 0; i < getNumConstraints(); i++)
{
m_sortedConstraints[i] = m_constraints[i];
}
@@ -443,109 +418,120 @@ void btMultiBodyDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo)
btTypedConstraint** constraintsPtr = getNumConstraints() ? &m_sortedConstraints[0] : 0;
m_sortedMultiBodyConstraints.resize(m_multiBodyConstraints.size());
- for (i=0;i<m_multiBodyConstraints.size();i++)
+ for (i = 0; i < m_multiBodyConstraints.size(); i++)
{
m_sortedMultiBodyConstraints[i] = m_multiBodyConstraints[i];
}
m_sortedMultiBodyConstraints.quickSort(btSortMultiBodyConstraintOnIslandPredicate());
- btMultiBodyConstraint** sortedMultiBodyConstraints = m_sortedMultiBodyConstraints.size() ? &m_sortedMultiBodyConstraints[0] : 0;
-
+ btMultiBodyConstraint** sortedMultiBodyConstraints = m_sortedMultiBodyConstraints.size() ? &m_sortedMultiBodyConstraints[0] : 0;
- m_solverMultiBodyIslandCallback->setup(&solverInfo,constraintsPtr,m_sortedConstraints.size(),sortedMultiBodyConstraints,m_sortedMultiBodyConstraints.size(), getDebugDrawer());
+ m_solverMultiBodyIslandCallback->setup(&solverInfo, constraintsPtr, m_sortedConstraints.size(), sortedMultiBodyConstraints, m_sortedMultiBodyConstraints.size(), getDebugDrawer());
m_constraintSolver->prepareSolve(getCollisionWorld()->getNumCollisionObjects(), getCollisionWorld()->getDispatcher()->getNumManifolds());
-
#ifndef BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY
{
BT_PROFILE("btMultiBody addForce");
- for (int i=0;i<this->m_multiBodies.size();i++)
+ for (int i = 0; i < this->m_multiBodies.size(); i++)
{
btMultiBody* bod = m_multiBodies[i];
bool isSleeping = false;
-
+
if (bod->getBaseCollider() && bod->getBaseCollider()->getActivationState() == ISLAND_SLEEPING)
{
isSleeping = true;
- }
- for (int b=0;b<bod->getNumLinks();b++)
+ }
+ for (int b = 0; b < bod->getNumLinks(); b++)
{
- if (bod->getLink(b).m_collider && bod->getLink(b).m_collider->getActivationState()==ISLAND_SLEEPING)
+ if (bod->getLink(b).m_collider && bod->getLink(b).m_collider->getActivationState() == ISLAND_SLEEPING)
isSleeping = true;
- }
+ }
if (!isSleeping)
{
//useless? they get resized in stepVelocities once again (AND DIFFERENTLY)
- m_scratch_r.resize(bod->getNumLinks()+1); //multidof? ("Y"s use it and it is used to store qdd)
- m_scratch_v.resize(bod->getNumLinks()+1);
- m_scratch_m.resize(bod->getNumLinks()+1);
+ m_scratch_r.resize(bod->getNumLinks() + 1); //multidof? ("Y"s use it and it is used to store qdd)
+ m_scratch_v.resize(bod->getNumLinks() + 1);
+ m_scratch_m.resize(bod->getNumLinks() + 1);
bod->addBaseForce(m_gravity * bod->getBaseMass());
- for (int j = 0; j < bod->getNumLinks(); ++j)
+ for (int j = 0; j < bod->getNumLinks(); ++j)
{
bod->addLinkForce(j, m_gravity * bod->getLinkMass(j));
}
- }//if (!isSleeping)
+ } //if (!isSleeping)
}
}
-#endif //BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY
-
+#endif //BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY
{
BT_PROFILE("btMultiBody stepVelocities");
- for (int i=0;i<this->m_multiBodies.size();i++)
+ for (int i = 0; i < this->m_multiBodies.size(); i++)
{
btMultiBody* bod = m_multiBodies[i];
bool isSleeping = false;
-
+
if (bod->getBaseCollider() && bod->getBaseCollider()->getActivationState() == ISLAND_SLEEPING)
{
isSleeping = true;
- }
- for (int b=0;b<bod->getNumLinks();b++)
+ }
+ for (int b = 0; b < bod->getNumLinks(); b++)
{
- if (bod->getLink(b).m_collider && bod->getLink(b).m_collider->getActivationState()==ISLAND_SLEEPING)
+ if (bod->getLink(b).m_collider && bod->getLink(b).m_collider->getActivationState() == ISLAND_SLEEPING)
isSleeping = true;
- }
+ }
if (!isSleeping)
{
//useless? they get resized in stepVelocities once again (AND DIFFERENTLY)
- m_scratch_r.resize(bod->getNumLinks()+1); //multidof? ("Y"s use it and it is used to store qdd)
- m_scratch_v.resize(bod->getNumLinks()+1);
- m_scratch_m.resize(bod->getNumLinks()+1);
+ m_scratch_r.resize(bod->getNumLinks() + 1); //multidof? ("Y"s use it and it is used to store qdd)
+ m_scratch_v.resize(bod->getNumLinks() + 1);
+ m_scratch_m.resize(bod->getNumLinks() + 1);
bool doNotUpdatePos = false;
-
+ bool isConstraintPass = false;
{
- if(!bod->isUsingRK4Integration())
+ if (!bod->isUsingRK4Integration())
{
- bod->computeAccelerationsArticulatedBodyAlgorithmMultiDof(solverInfo.m_timeStep, m_scratch_r, m_scratch_v, m_scratch_m);
+ bod->computeAccelerationsArticulatedBodyAlgorithmMultiDof(solverInfo.m_timeStep,
+ m_scratch_r, m_scratch_v, m_scratch_m,isConstraintPass,
+ getSolverInfo().m_jointFeedbackInWorldSpace,
+ getSolverInfo().m_jointFeedbackInJointFrame);
}
else
- {
+ {
//
int numDofs = bod->getNumDofs() + 6;
int numPosVars = bod->getNumPosVars() + 7;
- btAlignedObjectArray<btScalar> scratch_r2; scratch_r2.resize(2*numPosVars + 8*numDofs);
+ btAlignedObjectArray<btScalar> scratch_r2;
+ scratch_r2.resize(2 * numPosVars + 8 * numDofs);
//convenience
- btScalar *pMem = &scratch_r2[0];
- btScalar *scratch_q0 = pMem; pMem += numPosVars;
- btScalar *scratch_qx = pMem; pMem += numPosVars;
- btScalar *scratch_qd0 = pMem; pMem += numDofs;
- btScalar *scratch_qd1 = pMem; pMem += numDofs;
- btScalar *scratch_qd2 = pMem; pMem += numDofs;
- btScalar *scratch_qd3 = pMem; pMem += numDofs;
- btScalar *scratch_qdd0 = pMem; pMem += numDofs;
- btScalar *scratch_qdd1 = pMem; pMem += numDofs;
- btScalar *scratch_qdd2 = pMem; pMem += numDofs;
- btScalar *scratch_qdd3 = pMem; pMem += numDofs;
- btAssert((pMem - (2*numPosVars + 8*numDofs)) == &scratch_r2[0]);
-
- /////
+ btScalar* pMem = &scratch_r2[0];
+ btScalar* scratch_q0 = pMem;
+ pMem += numPosVars;
+ btScalar* scratch_qx = pMem;
+ pMem += numPosVars;
+ btScalar* scratch_qd0 = pMem;
+ pMem += numDofs;
+ btScalar* scratch_qd1 = pMem;
+ pMem += numDofs;
+ btScalar* scratch_qd2 = pMem;
+ pMem += numDofs;
+ btScalar* scratch_qd3 = pMem;
+ pMem += numDofs;
+ btScalar* scratch_qdd0 = pMem;
+ pMem += numDofs;
+ btScalar* scratch_qdd1 = pMem;
+ pMem += numDofs;
+ btScalar* scratch_qdd2 = pMem;
+ pMem += numDofs;
+ btScalar* scratch_qdd3 = pMem;
+ pMem += numDofs;
+ btAssert((pMem - (2 * numPosVars + 8 * numDofs)) == &scratch_r2[0]);
+
+ /////
//copy q0 to scratch_q0 and qd0 to scratch_qd0
scratch_q0[0] = bod->getWorldToBaseRot().x();
scratch_q0[1] = bod->getWorldToBaseRot().y();
@@ -555,83 +541,88 @@ void btMultiBodyDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo)
scratch_q0[5] = bod->getBasePos().y();
scratch_q0[6] = bod->getBasePos().z();
//
- for(int link = 0; link < bod->getNumLinks(); ++link)
+ for (int link = 0; link < bod->getNumLinks(); ++link)
{
- for(int dof = 0; dof < bod->getLink(link).m_posVarCount; ++dof)
- scratch_q0[7 + bod->getLink(link).m_cfgOffset + dof] = bod->getLink(link).m_jointPos[dof];
+ for (int dof = 0; dof < bod->getLink(link).m_posVarCount; ++dof)
+ scratch_q0[7 + bod->getLink(link).m_cfgOffset + dof] = bod->getLink(link).m_jointPos[dof];
}
//
- for(int dof = 0; dof < numDofs; ++dof)
+ for (int dof = 0; dof < numDofs; ++dof)
scratch_qd0[dof] = bod->getVelocityVector()[dof];
////
struct
{
- btMultiBody *bod;
- btScalar *scratch_qx, *scratch_q0;
-
- void operator()()
- {
- for(int dof = 0; dof < bod->getNumPosVars() + 7; ++dof)
- scratch_qx[dof] = scratch_q0[dof];
- }
+ btMultiBody* bod;
+ btScalar *scratch_qx, *scratch_q0;
+
+ void operator()()
+ {
+ for (int dof = 0; dof < bod->getNumPosVars() + 7; ++dof)
+ scratch_qx[dof] = scratch_q0[dof];
+ }
} pResetQx = {bod, scratch_qx, scratch_q0};
//
struct
{
- void operator()(btScalar dt, const btScalar *pDer, const btScalar *pCurVal, btScalar *pVal, int size)
- {
- for(int i = 0; i < size; ++i)
- pVal[i] = pCurVal[i] + dt * pDer[i];
- }
+ void operator()(btScalar dt, const btScalar* pDer, const btScalar* pCurVal, btScalar* pVal, int size)
+ {
+ for (int i = 0; i < size; ++i)
+ pVal[i] = pCurVal[i] + dt * pDer[i];
+ }
} pEulerIntegrate;
//
struct
- {
- void operator()(btMultiBody *pBody, const btScalar *pData)
- {
- btScalar *pVel = const_cast<btScalar*>(pBody->getVelocityVector());
-
- for(int i = 0; i < pBody->getNumDofs() + 6; ++i)
- pVel[i] = pData[i];
-
- }
- } pCopyToVelocityVector;
+ {
+ void operator()(btMultiBody* pBody, const btScalar* pData)
+ {
+ btScalar* pVel = const_cast<btScalar*>(pBody->getVelocityVector());
+
+ for (int i = 0; i < pBody->getNumDofs() + 6; ++i)
+ pVel[i] = pData[i];
+ }
+ } pCopyToVelocityVector;
//
- struct
+ struct
{
- void operator()(const btScalar *pSrc, btScalar *pDst, int start, int size)
- {
- for(int i = 0; i < size; ++i)
- pDst[i] = pSrc[start + i];
- }
+ void operator()(const btScalar* pSrc, btScalar* pDst, int start, int size)
+ {
+ for (int i = 0; i < size; ++i)
+ pDst[i] = pSrc[start + i];
+ }
} pCopy;
//
btScalar h = solverInfo.m_timeStep;
- #define output &m_scratch_r[bod->getNumDofs()]
- //calc qdd0 from: q0 & qd0
- bod->computeAccelerationsArticulatedBodyAlgorithmMultiDof(0., m_scratch_r, m_scratch_v, m_scratch_m);
+#define output &m_scratch_r[bod->getNumDofs()]
+ //calc qdd0 from: q0 & qd0
+ bod->computeAccelerationsArticulatedBodyAlgorithmMultiDof(0., m_scratch_r, m_scratch_v, m_scratch_m,
+ isConstraintPass,getSolverInfo().m_jointFeedbackInWorldSpace,
+ getSolverInfo().m_jointFeedbackInJointFrame);
pCopy(output, scratch_qdd0, 0, numDofs);
//calc q1 = q0 + h/2 * qd0
pResetQx();
- bod->stepPositionsMultiDof(btScalar(.5)*h, scratch_qx, scratch_qd0);
+ bod->stepPositionsMultiDof(btScalar(.5) * h, scratch_qx, scratch_qd0);
//calc qd1 = qd0 + h/2 * qdd0
- pEulerIntegrate(btScalar(.5)*h, scratch_qdd0, scratch_qd0, scratch_qd1, numDofs);
+ pEulerIntegrate(btScalar(.5) * h, scratch_qdd0, scratch_qd0, scratch_qd1, numDofs);
//
//calc qdd1 from: q1 & qd1
pCopyToVelocityVector(bod, scratch_qd1);
- bod->computeAccelerationsArticulatedBodyAlgorithmMultiDof(0., m_scratch_r, m_scratch_v, m_scratch_m);
+ bod->computeAccelerationsArticulatedBodyAlgorithmMultiDof(0., m_scratch_r, m_scratch_v, m_scratch_m,
+ isConstraintPass,getSolverInfo().m_jointFeedbackInWorldSpace,
+ getSolverInfo().m_jointFeedbackInJointFrame);
pCopy(output, scratch_qdd1, 0, numDofs);
//calc q2 = q0 + h/2 * qd1
pResetQx();
- bod->stepPositionsMultiDof(btScalar(.5)*h, scratch_qx, scratch_qd1);
+ bod->stepPositionsMultiDof(btScalar(.5) * h, scratch_qx, scratch_qd1);
//calc qd2 = qd0 + h/2 * qdd1
- pEulerIntegrate(btScalar(.5)*h, scratch_qdd1, scratch_qd0, scratch_qd2, numDofs);
+ pEulerIntegrate(btScalar(.5) * h, scratch_qdd1, scratch_qd0, scratch_qd2, numDofs);
//
//calc qdd2 from: q2 & qd2
pCopyToVelocityVector(bod, scratch_qd2);
- bod->computeAccelerationsArticulatedBodyAlgorithmMultiDof(0., m_scratch_r, m_scratch_v, m_scratch_m);
+ bod->computeAccelerationsArticulatedBodyAlgorithmMultiDof(0., m_scratch_r, m_scratch_v, m_scratch_m,
+ isConstraintPass,getSolverInfo().m_jointFeedbackInWorldSpace,
+ getSolverInfo().m_jointFeedbackInJointFrame);
pCopy(output, scratch_qdd2, 0, numDofs);
//calc q3 = q0 + h * qd2
pResetQx();
@@ -641,156 +632,158 @@ void btMultiBodyDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo)
//
//calc qdd3 from: q3 & qd3
pCopyToVelocityVector(bod, scratch_qd3);
- bod->computeAccelerationsArticulatedBodyAlgorithmMultiDof(0., m_scratch_r, m_scratch_v, m_scratch_m);
+ bod->computeAccelerationsArticulatedBodyAlgorithmMultiDof(0., m_scratch_r, m_scratch_v, m_scratch_m,
+ isConstraintPass,getSolverInfo().m_jointFeedbackInWorldSpace,
+ getSolverInfo().m_jointFeedbackInJointFrame);
pCopy(output, scratch_qdd3, 0, numDofs);
//
//calc q = q0 + h/6(qd0 + 2*(qd1 + qd2) + qd3)
- //calc qd = qd0 + h/6(qdd0 + 2*(qdd1 + qdd2) + qdd3)
- btAlignedObjectArray<btScalar> delta_q; delta_q.resize(numDofs);
- btAlignedObjectArray<btScalar> delta_qd; delta_qd.resize(numDofs);
- for(int i = 0; i < numDofs; ++i)
+ //calc qd = qd0 + h/6(qdd0 + 2*(qdd1 + qdd2) + qdd3)
+ btAlignedObjectArray<btScalar> delta_q;
+ delta_q.resize(numDofs);
+ btAlignedObjectArray<btScalar> delta_qd;
+ delta_qd.resize(numDofs);
+ for (int i = 0; i < numDofs; ++i)
{
- delta_q[i] = h/btScalar(6.)*(scratch_qd0[i] + 2*scratch_qd1[i] + 2*scratch_qd2[i] + scratch_qd3[i]);
- delta_qd[i] = h/btScalar(6.)*(scratch_qdd0[i] + 2*scratch_qdd1[i] + 2*scratch_qdd2[i] + scratch_qdd3[i]);
+ delta_q[i] = h / btScalar(6.) * (scratch_qd0[i] + 2 * scratch_qd1[i] + 2 * scratch_qd2[i] + scratch_qd3[i]);
+ delta_qd[i] = h / btScalar(6.) * (scratch_qdd0[i] + 2 * scratch_qdd1[i] + 2 * scratch_qdd2[i] + scratch_qdd3[i]);
//delta_q[i] = h*scratch_qd0[i];
//delta_qd[i] = h*scratch_qdd0[i];
}
//
pCopyToVelocityVector(bod, scratch_qd0);
- bod->applyDeltaVeeMultiDof(&delta_qd[0], 1);
+ bod->applyDeltaVeeMultiDof(&delta_qd[0], 1);
//
- if(!doNotUpdatePos)
+ if (!doNotUpdatePos)
{
- btScalar *pRealBuf = const_cast<btScalar *>(bod->getVelocityVector());
- pRealBuf += 6 + bod->getNumDofs() + bod->getNumDofs()*bod->getNumDofs();
+ btScalar* pRealBuf = const_cast<btScalar*>(bod->getVelocityVector());
+ pRealBuf += 6 + bod->getNumDofs() + bod->getNumDofs() * bod->getNumDofs();
- for(int i = 0; i < numDofs; ++i)
+ for (int i = 0; i < numDofs; ++i)
pRealBuf[i] = delta_q[i];
//bod->stepPositionsMultiDof(1, 0, &delta_q[0]);
- bod->setPosUpdated(true);
+ bod->setPosUpdated(true);
}
//ugly hack which resets the cached data to t0 (needed for constraint solver)
{
- for(int link = 0; link < bod->getNumLinks(); ++link)
+ for (int link = 0; link < bod->getNumLinks(); ++link)
bod->getLink(link).updateCacheMultiDof();
- bod->computeAccelerationsArticulatedBodyAlgorithmMultiDof(0, m_scratch_r, m_scratch_v, m_scratch_m);
+ bod->computeAccelerationsArticulatedBodyAlgorithmMultiDof(0, m_scratch_r, m_scratch_v, m_scratch_m,
+ isConstraintPass,getSolverInfo().m_jointFeedbackInWorldSpace,
+ getSolverInfo().m_jointFeedbackInJointFrame);
}
-
}
}
-
+
#ifndef BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY
bod->clearForcesAndTorques();
-#endif //BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY
- }//if (!isSleeping)
+#endif //BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY
+ } //if (!isSleeping)
}
}
/// solve all the constraints for this island
m_islandManager->buildAndProcessIslands(getCollisionWorld()->getDispatcher(), getCollisionWorld(), m_solverMultiBodyIslandCallback);
-
m_solverMultiBodyIslandCallback->processConstraints();
-
+
m_constraintSolver->allSolved(solverInfo, m_debugDrawer);
{
- BT_PROFILE("btMultiBody stepVelocities");
- for (int i=0;i<this->m_multiBodies.size();i++)
- {
- btMultiBody* bod = m_multiBodies[i];
-
- bool isSleeping = false;
-
- if (bod->getBaseCollider() && bod->getBaseCollider()->getActivationState() == ISLAND_SLEEPING)
- {
- isSleeping = true;
- }
- for (int b=0;b<bod->getNumLinks();b++)
- {
- if (bod->getLink(b).m_collider && bod->getLink(b).m_collider->getActivationState()==ISLAND_SLEEPING)
- isSleeping = true;
- }
-
- if (!isSleeping)
- {
- //useless? they get resized in stepVelocities once again (AND DIFFERENTLY)
- m_scratch_r.resize(bod->getNumLinks()+1); //multidof? ("Y"s use it and it is used to store qdd)
- m_scratch_v.resize(bod->getNumLinks()+1);
- m_scratch_m.resize(bod->getNumLinks()+1);
-
-
- {
- if(!bod->isUsingRK4Integration())
- {
- bool isConstraintPass = true;
- bod->computeAccelerationsArticulatedBodyAlgorithmMultiDof(solverInfo.m_timeStep, m_scratch_r, m_scratch_v, m_scratch_m, isConstraintPass);
- }
+ BT_PROFILE("btMultiBody stepVelocities");
+ for (int i = 0; i < this->m_multiBodies.size(); i++)
+ {
+ btMultiBody* bod = m_multiBodies[i];
+
+ bool isSleeping = false;
+
+ if (bod->getBaseCollider() && bod->getBaseCollider()->getActivationState() == ISLAND_SLEEPING)
+ {
+ isSleeping = true;
+ }
+ for (int b = 0; b < bod->getNumLinks(); b++)
+ {
+ if (bod->getLink(b).m_collider && bod->getLink(b).m_collider->getActivationState() == ISLAND_SLEEPING)
+ isSleeping = true;
+ }
+
+ if (!isSleeping)
+ {
+ //useless? they get resized in stepVelocities once again (AND DIFFERENTLY)
+ m_scratch_r.resize(bod->getNumLinks() + 1); //multidof? ("Y"s use it and it is used to store qdd)
+ m_scratch_v.resize(bod->getNumLinks() + 1);
+ m_scratch_m.resize(bod->getNumLinks() + 1);
+
+ {
+ if (!bod->isUsingRK4Integration())
+ {
+ bool isConstraintPass = true;
+ bod->computeAccelerationsArticulatedBodyAlgorithmMultiDof(solverInfo.m_timeStep, m_scratch_r, m_scratch_v, m_scratch_m, isConstraintPass,
+ getSolverInfo().m_jointFeedbackInWorldSpace,
+ getSolverInfo().m_jointFeedbackInJointFrame);
+ }
}
}
}
}
- for (int i=0;i<this->m_multiBodies.size();i++)
+ for (int i = 0; i < this->m_multiBodies.size(); i++)
{
btMultiBody* bod = m_multiBodies[i];
bod->processDeltaVeeMultiDof2();
}
-
}
-void btMultiBodyDynamicsWorld::integrateTransforms(btScalar timeStep)
+void btMultiBodyDynamicsWorld::integrateTransforms(btScalar timeStep)
{
btDiscreteDynamicsWorld::integrateTransforms(timeStep);
{
BT_PROFILE("btMultiBody stepPositions");
//integrate and update the Featherstone hierarchies
-
- for (int b=0;b<m_multiBodies.size();b++)
+
+ for (int b = 0; b < m_multiBodies.size(); b++)
{
btMultiBody* bod = m_multiBodies[b];
bool isSleeping = false;
if (bod->getBaseCollider() && bod->getBaseCollider()->getActivationState() == ISLAND_SLEEPING)
{
isSleeping = true;
- }
- for (int b=0;b<bod->getNumLinks();b++)
+ }
+ for (int b = 0; b < bod->getNumLinks(); b++)
{
- if (bod->getLink(b).m_collider && bod->getLink(b).m_collider->getActivationState()==ISLAND_SLEEPING)
+ if (bod->getLink(b).m_collider && bod->getLink(b).m_collider->getActivationState() == ISLAND_SLEEPING)
isSleeping = true;
}
-
if (!isSleeping)
{
int nLinks = bod->getNumLinks();
///base + num m_links
-
-
+
{
- if(!bod->isPosUpdated())
+ if (!bod->isPosUpdated())
bod->stepPositionsMultiDof(timeStep);
else
{
- btScalar *pRealBuf = const_cast<btScalar *>(bod->getVelocityVector());
- pRealBuf += 6 + bod->getNumDofs() + bod->getNumDofs()*bod->getNumDofs();
+ btScalar* pRealBuf = const_cast<btScalar*>(bod->getVelocityVector());
+ pRealBuf += 6 + bod->getNumDofs() + bod->getNumDofs() * bod->getNumDofs();
bod->stepPositionsMultiDof(1, 0, pRealBuf);
bod->setPosUpdated(false);
}
}
-
- m_scratch_world_to_local.resize(nLinks+1);
- m_scratch_local_origin.resize(nLinks+1);
- bod->updateCollisionObjectWorldTransforms(m_scratch_world_to_local,m_scratch_local_origin);
-
- } else
+ m_scratch_world_to_local.resize(nLinks + 1);
+ m_scratch_local_origin.resize(nLinks + 1);
+
+ bod->updateCollisionObjectWorldTransforms(m_scratch_world_to_local, m_scratch_local_origin);
+ }
+ else
{
bod->clearVelocities();
}
@@ -798,14 +791,12 @@ void btMultiBodyDynamicsWorld::integrateTransforms(btScalar timeStep)
}
}
-
-
-void btMultiBodyDynamicsWorld::addMultiBodyConstraint( btMultiBodyConstraint* constraint)
+void btMultiBodyDynamicsWorld::addMultiBodyConstraint(btMultiBodyConstraint* constraint)
{
m_multiBodyConstraints.push_back(constraint);
}
-void btMultiBodyDynamicsWorld::removeMultiBodyConstraint( btMultiBodyConstraint* constraint)
+void btMultiBodyDynamicsWorld::removeMultiBodyConstraint(btMultiBodyConstraint* constraint)
{
m_multiBodyConstraints.remove(constraint);
}
@@ -815,8 +806,7 @@ void btMultiBodyDynamicsWorld::debugDrawMultiBodyConstraint(btMultiBodyConstrain
constraint->debugDraw(getDebugDrawer());
}
-
-void btMultiBodyDynamicsWorld::debugDrawWorld()
+void btMultiBodyDynamicsWorld::debugDrawWorld()
{
BT_PROFILE("btMultiBodyDynamicsWorld debugDrawWorld");
@@ -826,7 +816,7 @@ void btMultiBodyDynamicsWorld::debugDrawWorld()
if (getDebugDrawer())
{
int mode = getDebugDrawer()->getDebugMode();
- if (mode & (btIDebugDraw::DBG_DrawConstraints | btIDebugDraw::DBG_DrawConstraintLimits))
+ if (mode & (btIDebugDraw::DBG_DrawConstraints | btIDebugDraw::DBG_DrawConstraintLimits))
{
drawConstraints = true;
}
@@ -834,160 +824,148 @@ void btMultiBodyDynamicsWorld::debugDrawWorld()
if (drawConstraints)
{
BT_PROFILE("btMultiBody debugDrawWorld");
-
- for (int c=0;c<m_multiBodyConstraints.size();c++)
+ for (int c = 0; c < m_multiBodyConstraints.size(); c++)
{
btMultiBodyConstraint* constraint = m_multiBodyConstraints[c];
debugDrawMultiBodyConstraint(constraint);
}
- for (int b = 0; b<m_multiBodies.size(); b++)
+ for (int b = 0; b < m_multiBodies.size(); b++)
{
btMultiBody* bod = m_multiBodies[b];
- bod->forwardKinematics(m_scratch_world_to_local1,m_scratch_local_origin1);
-
- if (mode & btIDebugDraw::DBG_DrawFrames)
+ bod->forwardKinematics(m_scratch_world_to_local1, m_scratch_local_origin1);
+
+ if (mode & btIDebugDraw::DBG_DrawFrames)
{
getDebugDrawer()->drawTransform(bod->getBaseWorldTransform(), 0.1);
}
- for (int m = 0; m<bod->getNumLinks(); m++)
+ for (int m = 0; m < bod->getNumLinks(); m++)
{
-
const btTransform& tr = bod->getLink(m).m_cachedWorldTransform;
- if (mode & btIDebugDraw::DBG_DrawFrames)
+ if (mode & btIDebugDraw::DBG_DrawFrames)
{
getDebugDrawer()->drawTransform(tr, 0.1);
}
- //draw the joint axis
- if (bod->getLink(m).m_jointType==btMultibodyLink::eRevolute)
+ //draw the joint axis
+ if (bod->getLink(m).m_jointType == btMultibodyLink::eRevolute)
{
- btVector3 vec = quatRotate(tr.getRotation(),bod->getLink(m).m_axes[0].m_topVec)*0.1;
-
- btVector4 color(0,0,0,1);//1,1,1);
- btVector3 from = vec+tr.getOrigin()-quatRotate(tr.getRotation(),bod->getLink(m).m_dVector);
- btVector3 to = tr.getOrigin()-quatRotate(tr.getRotation(),bod->getLink(m).m_dVector);
- getDebugDrawer()->drawLine(from,to,color);
+ btVector3 vec = quatRotate(tr.getRotation(), bod->getLink(m).m_axes[0].m_topVec) * 0.1;
+
+ btVector4 color(0, 0, 0, 1); //1,1,1);
+ btVector3 from = vec + tr.getOrigin() - quatRotate(tr.getRotation(), bod->getLink(m).m_dVector);
+ btVector3 to = tr.getOrigin() - quatRotate(tr.getRotation(), bod->getLink(m).m_dVector);
+ getDebugDrawer()->drawLine(from, to, color);
}
- if (bod->getLink(m).m_jointType==btMultibodyLink::eFixed)
+ if (bod->getLink(m).m_jointType == btMultibodyLink::eFixed)
{
- btVector3 vec = quatRotate(tr.getRotation(),bod->getLink(m).m_axes[0].m_bottomVec)*0.1;
-
- btVector4 color(0,0,0,1);//1,1,1);
- btVector3 from = vec+tr.getOrigin()-quatRotate(tr.getRotation(),bod->getLink(m).m_dVector);
- btVector3 to = tr.getOrigin()-quatRotate(tr.getRotation(),bod->getLink(m).m_dVector);
- getDebugDrawer()->drawLine(from,to,color);
+ btVector3 vec = quatRotate(tr.getRotation(), bod->getLink(m).m_axes[0].m_bottomVec) * 0.1;
+
+ btVector4 color(0, 0, 0, 1); //1,1,1);
+ btVector3 from = vec + tr.getOrigin() - quatRotate(tr.getRotation(), bod->getLink(m).m_dVector);
+ btVector3 to = tr.getOrigin() - quatRotate(tr.getRotation(), bod->getLink(m).m_dVector);
+ getDebugDrawer()->drawLine(from, to, color);
}
- if (bod->getLink(m).m_jointType==btMultibodyLink::ePrismatic)
+ if (bod->getLink(m).m_jointType == btMultibodyLink::ePrismatic)
{
- btVector3 vec = quatRotate(tr.getRotation(),bod->getLink(m).m_axes[0].m_bottomVec)*0.1;
-
- btVector4 color(0,0,0,1);//1,1,1);
- btVector3 from = vec+tr.getOrigin()-quatRotate(tr.getRotation(),bod->getLink(m).m_dVector);
- btVector3 to = tr.getOrigin()-quatRotate(tr.getRotation(),bod->getLink(m).m_dVector);
- getDebugDrawer()->drawLine(from,to,color);
+ btVector3 vec = quatRotate(tr.getRotation(), bod->getLink(m).m_axes[0].m_bottomVec) * 0.1;
+
+ btVector4 color(0, 0, 0, 1); //1,1,1);
+ btVector3 from = vec + tr.getOrigin() - quatRotate(tr.getRotation(), bod->getLink(m).m_dVector);
+ btVector3 to = tr.getOrigin() - quatRotate(tr.getRotation(), bod->getLink(m).m_dVector);
+ getDebugDrawer()->drawLine(from, to, color);
}
-
}
}
}
}
-
-
}
-
-
void btMultiBodyDynamicsWorld::applyGravity()
{
- btDiscreteDynamicsWorld::applyGravity();
+ btDiscreteDynamicsWorld::applyGravity();
#ifdef BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY
- BT_PROFILE("btMultiBody addGravity");
- for (int i=0;i<this->m_multiBodies.size();i++)
- {
- btMultiBody* bod = m_multiBodies[i];
-
- bool isSleeping = false;
-
- if (bod->getBaseCollider() && bod->getBaseCollider()->getActivationState() == ISLAND_SLEEPING)
- {
- isSleeping = true;
- }
- for (int b=0;b<bod->getNumLinks();b++)
- {
- if (bod->getLink(b).m_collider && bod->getLink(b).m_collider->getActivationState()==ISLAND_SLEEPING)
- isSleeping = true;
- }
-
- if (!isSleeping)
- {
- bod->addBaseForce(m_gravity * bod->getBaseMass());
-
- for (int j = 0; j < bod->getNumLinks(); ++j)
- {
- bod->addLinkForce(j, m_gravity * bod->getLinkMass(j));
- }
- }//if (!isSleeping)
- }
-#endif //BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY
+ BT_PROFILE("btMultiBody addGravity");
+ for (int i = 0; i < this->m_multiBodies.size(); i++)
+ {
+ btMultiBody* bod = m_multiBodies[i];
+
+ bool isSleeping = false;
+
+ if (bod->getBaseCollider() && bod->getBaseCollider()->getActivationState() == ISLAND_SLEEPING)
+ {
+ isSleeping = true;
+ }
+ for (int b = 0; b < bod->getNumLinks(); b++)
+ {
+ if (bod->getLink(b).m_collider && bod->getLink(b).m_collider->getActivationState() == ISLAND_SLEEPING)
+ isSleeping = true;
+ }
+
+ if (!isSleeping)
+ {
+ bod->addBaseForce(m_gravity * bod->getBaseMass());
+
+ for (int j = 0; j < bod->getNumLinks(); ++j)
+ {
+ bod->addLinkForce(j, m_gravity * bod->getLinkMass(j));
+ }
+ } //if (!isSleeping)
+ }
+#endif //BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY
}
void btMultiBodyDynamicsWorld::clearMultiBodyConstraintForces()
-{
- for (int i=0;i<this->m_multiBodies.size();i++)
- {
- btMultiBody* bod = m_multiBodies[i];
- bod->clearConstraintForces();
- }
+{
+ for (int i = 0; i < this->m_multiBodies.size(); i++)
+ {
+ btMultiBody* bod = m_multiBodies[i];
+ bod->clearConstraintForces();
+ }
}
void btMultiBodyDynamicsWorld::clearMultiBodyForces()
{
- {
- // BT_PROFILE("clearMultiBodyForces");
- for (int i=0;i<this->m_multiBodies.size();i++)
- {
- btMultiBody* bod = m_multiBodies[i];
-
- bool isSleeping = false;
-
- if (bod->getBaseCollider() && bod->getBaseCollider()->getActivationState() == ISLAND_SLEEPING)
- {
- isSleeping = true;
- }
- for (int b=0;b<bod->getNumLinks();b++)
- {
- if (bod->getLink(b).m_collider && bod->getLink(b).m_collider->getActivationState()==ISLAND_SLEEPING)
- isSleeping = true;
- }
-
- if (!isSleeping)
- {
- btMultiBody* bod = m_multiBodies[i];
- bod->clearForcesAndTorques();
- }
+ {
+ // BT_PROFILE("clearMultiBodyForces");
+ for (int i = 0; i < this->m_multiBodies.size(); i++)
+ {
+ btMultiBody* bod = m_multiBodies[i];
+
+ bool isSleeping = false;
+
+ if (bod->getBaseCollider() && bod->getBaseCollider()->getActivationState() == ISLAND_SLEEPING)
+ {
+ isSleeping = true;
+ }
+ for (int b = 0; b < bod->getNumLinks(); b++)
+ {
+ if (bod->getLink(b).m_collider && bod->getLink(b).m_collider->getActivationState() == ISLAND_SLEEPING)
+ isSleeping = true;
+ }
+
+ if (!isSleeping)
+ {
+ btMultiBody* bod = m_multiBodies[i];
+ bod->clearForcesAndTorques();
+ }
}
}
-
}
void btMultiBodyDynamicsWorld::clearForces()
{
- btDiscreteDynamicsWorld::clearForces();
+ btDiscreteDynamicsWorld::clearForces();
#ifdef BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY
clearMultiBodyForces();
#endif
}
-
-
-
-void btMultiBodyDynamicsWorld::serialize(btSerializer* serializer)
+void btMultiBodyDynamicsWorld::serialize(btSerializer* serializer)
{
-
serializer->startSerialization();
- serializeDynamicsWorldInfo( serializer);
+ serializeDynamicsWorldInfo(serializer);
serializeMultiBodies(serializer);
@@ -1000,32 +978,31 @@ void btMultiBodyDynamicsWorld::serialize(btSerializer* serializer)
serializer->finishSerialization();
}
-void btMultiBodyDynamicsWorld::serializeMultiBodies(btSerializer* serializer)
+void btMultiBodyDynamicsWorld::serializeMultiBodies(btSerializer* serializer)
{
int i;
//serialize all collision objects
- for (i=0;i<m_multiBodies.size();i++)
+ for (i = 0; i < m_multiBodies.size(); i++)
{
btMultiBody* mb = m_multiBodies[i];
{
int len = mb->calculateSerializeBufferSize();
- btChunk* chunk = serializer->allocate(len,1);
+ btChunk* chunk = serializer->allocate(len, 1);
const char* structType = mb->serialize(chunk->m_oldPtr, serializer);
- serializer->finalizeChunk(chunk,structType,BT_MULTIBODY_CODE,mb);
+ serializer->finalizeChunk(chunk, structType, BT_MULTIBODY_CODE, mb);
}
}
//serialize all multibody links (collision objects)
- for (i=0;i<m_collisionObjects.size();i++)
+ for (i = 0; i < m_collisionObjects.size(); i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
if (colObj->getInternalType() == btCollisionObject::CO_FEATHERSTONE_LINK)
{
int len = colObj->calculateSerializeBufferSize();
- btChunk* chunk = serializer->allocate(len,1);
+ btChunk* chunk = serializer->allocate(len, 1);
const char* structType = colObj->serialize(chunk->m_oldPtr, serializer);
- serializer->finalizeChunk(chunk,structType,BT_MB_LINKCOLLIDER_CODE,colObj);
+ serializer->finalizeChunk(chunk, structType, BT_MB_LINKCOLLIDER_CODE, colObj);
}
}
-
}
diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyDynamicsWorld.h b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyDynamicsWorld.h
index 2fbf089d81..641238f3bb 100644
--- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyDynamicsWorld.h
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyDynamicsWorld.h
@@ -33,8 +33,8 @@ protected:
btAlignedObjectArray<btMultiBody*> m_multiBodies;
btAlignedObjectArray<btMultiBodyConstraint*> m_multiBodyConstraints;
btAlignedObjectArray<btMultiBodyConstraint*> m_sortedMultiBodyConstraints;
- btMultiBodyConstraintSolver* m_multiBodyConstraintSolver;
- MultiBodyInplaceSolverIslandCallback* m_solverMultiBodyIslandCallback;
+ btMultiBodyConstraintSolver* m_multiBodyConstraintSolver;
+ MultiBodyInplaceSolverIslandCallback* m_solverMultiBodyIslandCallback;
//cached data to avoid memory allocations
btAlignedObjectArray<btQuaternion> m_scratch_world_to_local;
@@ -45,72 +45,69 @@ protected:
btAlignedObjectArray<btVector3> m_scratch_v;
btAlignedObjectArray<btMatrix3x3> m_scratch_m;
-
- virtual void calculateSimulationIslands();
- virtual void updateActivationState(btScalar timeStep);
- virtual void solveConstraints(btContactSolverInfo& solverInfo);
-
- virtual void serializeMultiBodies(btSerializer* serializer);
+ virtual void calculateSimulationIslands();
+ virtual void updateActivationState(btScalar timeStep);
+ virtual void solveConstraints(btContactSolverInfo& solverInfo);
-public:
+ virtual void serializeMultiBodies(btSerializer* serializer);
- btMultiBodyDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* pairCache,btMultiBodyConstraintSolver* constraintSolver,btCollisionConfiguration* collisionConfiguration);
+public:
+ btMultiBodyDynamicsWorld(btDispatcher* dispatcher, btBroadphaseInterface* pairCache, btMultiBodyConstraintSolver* constraintSolver, btCollisionConfiguration* collisionConfiguration);
- virtual ~btMultiBodyDynamicsWorld ();
+ virtual ~btMultiBodyDynamicsWorld();
- virtual void addMultiBody(btMultiBody* body, int group= btBroadphaseProxy::DefaultFilter, int mask=btBroadphaseProxy::AllFilter);
+ virtual void addMultiBody(btMultiBody* body, int group = btBroadphaseProxy::DefaultFilter, int mask = btBroadphaseProxy::AllFilter);
- virtual void removeMultiBody(btMultiBody* body);
+ virtual void removeMultiBody(btMultiBody* body);
- virtual int getNumMultibodies() const
+ virtual int getNumMultibodies() const
{
return m_multiBodies.size();
}
- btMultiBody* getMultiBody(int mbIndex)
+ btMultiBody* getMultiBody(int mbIndex)
{
return m_multiBodies[mbIndex];
}
- const btMultiBody* getMultiBody(int mbIndex) const
+ const btMultiBody* getMultiBody(int mbIndex) const
{
return m_multiBodies[mbIndex];
}
- virtual void addMultiBodyConstraint( btMultiBodyConstraint* constraint);
+ virtual void addMultiBodyConstraint(btMultiBodyConstraint* constraint);
- virtual int getNumMultiBodyConstraints() const
+ virtual int getNumMultiBodyConstraints() const
{
- return m_multiBodyConstraints.size();
+ return m_multiBodyConstraints.size();
}
- virtual btMultiBodyConstraint* getMultiBodyConstraint( int constraintIndex)
+ virtual btMultiBodyConstraint* getMultiBodyConstraint(int constraintIndex)
{
- return m_multiBodyConstraints[constraintIndex];
+ return m_multiBodyConstraints[constraintIndex];
}
- virtual const btMultiBodyConstraint* getMultiBodyConstraint( int constraintIndex) const
+ virtual const btMultiBodyConstraint* getMultiBodyConstraint(int constraintIndex) const
{
- return m_multiBodyConstraints[constraintIndex];
+ return m_multiBodyConstraints[constraintIndex];
}
- virtual void removeMultiBodyConstraint( btMultiBodyConstraint* constraint);
+ virtual void removeMultiBodyConstraint(btMultiBodyConstraint* constraint);
+
+ virtual void integrateTransforms(btScalar timeStep);
- virtual void integrateTransforms(btScalar timeStep);
+ virtual void debugDrawWorld();
- virtual void debugDrawWorld();
+ virtual void debugDrawMultiBodyConstraint(btMultiBodyConstraint* constraint);
- virtual void debugDrawMultiBodyConstraint(btMultiBodyConstraint* constraint);
-
- void forwardKinematics();
+ 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 serialize(btSerializer* serializer);
+ virtual void setMultiBodyConstraintSolver(btMultiBodyConstraintSolver* solver);
+ virtual void setConstraintSolver(btConstraintSolver* solver);
};
-#endif //BT_MULTIBODY_DYNAMICS_WORLD_H
+#endif //BT_MULTIBODY_DYNAMICS_WORLD_H
diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyFixedConstraint.cpp b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyFixedConstraint.cpp
index af48e94a83..5ef9444c2f 100644
--- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyFixedConstraint.cpp
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyFixedConstraint.cpp
@@ -24,27 +24,27 @@ subject to the following restrictions:
#define BTMBFIXEDCONSTRAINT_DIM 6
btMultiBodyFixedConstraint::btMultiBodyFixedConstraint(btMultiBody* body, int link, btRigidBody* bodyB, const btVector3& pivotInA, const btVector3& pivotInB, const btMatrix3x3& frameInA, const btMatrix3x3& frameInB)
- :btMultiBodyConstraint(body,0,link,-1,BTMBFIXEDCONSTRAINT_DIM,false),
- m_rigidBodyA(0),
- m_rigidBodyB(bodyB),
- m_pivotInA(pivotInA),
- m_pivotInB(pivotInB),
- m_frameInA(frameInA),
- m_frameInB(frameInB)
+ : btMultiBodyConstraint(body, 0, link, -1, BTMBFIXEDCONSTRAINT_DIM, false),
+ m_rigidBodyA(0),
+ m_rigidBodyB(bodyB),
+ m_pivotInA(pivotInA),
+ m_pivotInB(pivotInB),
+ m_frameInA(frameInA),
+ m_frameInB(frameInB)
{
- m_data.resize(BTMBFIXEDCONSTRAINT_DIM);//at least store the applied impulses
+ m_data.resize(BTMBFIXEDCONSTRAINT_DIM); //at least store the applied impulses
}
btMultiBodyFixedConstraint::btMultiBodyFixedConstraint(btMultiBody* bodyA, int linkA, btMultiBody* bodyB, int linkB, const btVector3& pivotInA, const btVector3& pivotInB, const btMatrix3x3& frameInA, const btMatrix3x3& frameInB)
- :btMultiBodyConstraint(bodyA,bodyB,linkA,linkB,BTMBFIXEDCONSTRAINT_DIM,false),
- m_rigidBodyA(0),
- m_rigidBodyB(0),
- m_pivotInA(pivotInA),
- m_pivotInB(pivotInB),
- m_frameInA(frameInA),
- m_frameInB(frameInB)
+ : btMultiBodyConstraint(bodyA, bodyB, linkA, linkB, BTMBFIXEDCONSTRAINT_DIM, false),
+ m_rigidBodyA(0),
+ m_rigidBodyB(0),
+ m_pivotInA(pivotInA),
+ m_pivotInB(pivotInB),
+ m_frameInA(frameInA),
+ m_frameInB(frameInB)
{
- m_data.resize(BTMBFIXEDCONSTRAINT_DIM);//at least store the applied impulses
+ m_data.resize(BTMBFIXEDCONSTRAINT_DIM); //at least store the applied impulses
}
void btMultiBodyFixedConstraint::finalizeMultiDof()
@@ -57,7 +57,6 @@ btMultiBodyFixedConstraint::~btMultiBodyFixedConstraint()
{
}
-
int btMultiBodyFixedConstraint::getIslandIdA() const
{
if (m_rigidBodyA)
@@ -103,82 +102,83 @@ int btMultiBodyFixedConstraint::getIslandIdB() const
void btMultiBodyFixedConstraint::createConstraintRows(btMultiBodyConstraintArray& constraintRows, btMultiBodyJacobianData& data, const btContactSolverInfo& infoGlobal)
{
- int numDim = BTMBFIXEDCONSTRAINT_DIM;
- for (int i=0;i<numDim;i++)
+ int numDim = BTMBFIXEDCONSTRAINT_DIM;
+ for (int i = 0; i < numDim; i++)
{
- btMultiBodySolverConstraint& constraintRow = constraintRows.expandNonInitializing();
- constraintRow.m_orgConstraint = this;
- constraintRow.m_orgDofIndex = i;
- constraintRow.m_relpos1CrossNormal.setValue(0,0,0);
- constraintRow.m_contactNormal1.setValue(0,0,0);
- constraintRow.m_relpos2CrossNormal.setValue(0,0,0);
- constraintRow.m_contactNormal2.setValue(0,0,0);
- constraintRow.m_angularComponentA.setValue(0,0,0);
- constraintRow.m_angularComponentB.setValue(0,0,0);
-
- constraintRow.m_solverBodyIdA = data.m_fixedBodyId;
- constraintRow.m_solverBodyIdB = data.m_fixedBodyId;
-
- // Convert local points back to world
- btVector3 pivotAworld = m_pivotInA;
- btMatrix3x3 frameAworld = m_frameInA;
- if (m_rigidBodyA)
- {
-
- constraintRow.m_solverBodyIdA = m_rigidBodyA->getCompanionId();
- pivotAworld = m_rigidBodyA->getCenterOfMassTransform()*m_pivotInA;
- frameAworld = frameAworld.transpose()*btMatrix3x3(m_rigidBodyA->getOrientation());
-
- } else
- {
- if (m_bodyA) {
- pivotAworld = m_bodyA->localPosToWorld(m_linkA, m_pivotInA);
- frameAworld = m_bodyA->localFrameToWorld(m_linkA, frameAworld);
- }
- }
- btVector3 pivotBworld = m_pivotInB;
- btMatrix3x3 frameBworld = m_frameInB;
- if (m_rigidBodyB)
- {
- constraintRow.m_solverBodyIdB = m_rigidBodyB->getCompanionId();
- pivotBworld = m_rigidBodyB->getCenterOfMassTransform()*m_pivotInB;
- frameBworld = frameBworld.transpose()*btMatrix3x3(m_rigidBodyB->getOrientation());
-
- } else
- {
- if (m_bodyB) {
- pivotBworld = m_bodyB->localPosToWorld(m_linkB, m_pivotInB);
- frameBworld = m_bodyB->localFrameToWorld(m_linkB, frameBworld);
- }
- }
-
- btMatrix3x3 relRot = frameAworld.inverse()*frameBworld;
- btVector3 angleDiff;
- btGeneric6DofSpring2Constraint::matrixToEulerXYZ(relRot,angleDiff);
-
- btVector3 constraintNormalLin(0,0,0);
- btVector3 constraintNormalAng(0,0,0);
- btScalar posError = 0.0;
- if (i < 3) {
- constraintNormalLin[i] = 1;
- posError = (pivotAworld-pivotBworld).dot(constraintNormalLin);
- fillMultiBodyConstraint(constraintRow, data, 0, 0, constraintNormalAng,
- constraintNormalLin, pivotAworld, pivotBworld,
- posError,
- infoGlobal,
- -m_maxAppliedImpulse, m_maxAppliedImpulse
- );
- }
- else { //i>=3
- constraintNormalAng = frameAworld.getColumn(i%3);
- posError = angleDiff[i%3];
- fillMultiBodyConstraint(constraintRow, data, 0, 0, constraintNormalAng,
- constraintNormalLin, pivotAworld, pivotBworld,
- posError,
- infoGlobal,
- -m_maxAppliedImpulse, m_maxAppliedImpulse, true
- );
- }
+ btMultiBodySolverConstraint& constraintRow = constraintRows.expandNonInitializing();
+ constraintRow.m_orgConstraint = this;
+ constraintRow.m_orgDofIndex = i;
+ constraintRow.m_relpos1CrossNormal.setValue(0, 0, 0);
+ constraintRow.m_contactNormal1.setValue(0, 0, 0);
+ constraintRow.m_relpos2CrossNormal.setValue(0, 0, 0);
+ constraintRow.m_contactNormal2.setValue(0, 0, 0);
+ constraintRow.m_angularComponentA.setValue(0, 0, 0);
+ constraintRow.m_angularComponentB.setValue(0, 0, 0);
+
+ constraintRow.m_solverBodyIdA = data.m_fixedBodyId;
+ constraintRow.m_solverBodyIdB = data.m_fixedBodyId;
+
+ // Convert local points back to world
+ btVector3 pivotAworld = m_pivotInA;
+ btMatrix3x3 frameAworld = m_frameInA;
+ if (m_rigidBodyA)
+ {
+ constraintRow.m_solverBodyIdA = m_rigidBodyA->getCompanionId();
+ pivotAworld = m_rigidBodyA->getCenterOfMassTransform() * m_pivotInA;
+ frameAworld = frameAworld.transpose() * btMatrix3x3(m_rigidBodyA->getOrientation());
+ }
+ else
+ {
+ if (m_bodyA)
+ {
+ pivotAworld = m_bodyA->localPosToWorld(m_linkA, m_pivotInA);
+ frameAworld = m_bodyA->localFrameToWorld(m_linkA, frameAworld);
+ }
+ }
+ btVector3 pivotBworld = m_pivotInB;
+ btMatrix3x3 frameBworld = m_frameInB;
+ if (m_rigidBodyB)
+ {
+ constraintRow.m_solverBodyIdB = m_rigidBodyB->getCompanionId();
+ pivotBworld = m_rigidBodyB->getCenterOfMassTransform() * m_pivotInB;
+ frameBworld = frameBworld.transpose() * btMatrix3x3(m_rigidBodyB->getOrientation());
+ }
+ else
+ {
+ if (m_bodyB)
+ {
+ pivotBworld = m_bodyB->localPosToWorld(m_linkB, m_pivotInB);
+ frameBworld = m_bodyB->localFrameToWorld(m_linkB, frameBworld);
+ }
+ }
+
+ btMatrix3x3 relRot = frameAworld.inverse() * frameBworld;
+ btVector3 angleDiff;
+ btGeneric6DofSpring2Constraint::matrixToEulerXYZ(relRot, angleDiff);
+
+ btVector3 constraintNormalLin(0, 0, 0);
+ btVector3 constraintNormalAng(0, 0, 0);
+ btScalar posError = 0.0;
+ if (i < 3)
+ {
+ constraintNormalLin[i] = 1;
+ posError = (pivotAworld - pivotBworld).dot(constraintNormalLin);
+ fillMultiBodyConstraint(constraintRow, data, 0, 0, constraintNormalAng,
+ constraintNormalLin, pivotAworld, pivotBworld,
+ posError,
+ infoGlobal,
+ -m_maxAppliedImpulse, m_maxAppliedImpulse);
+ }
+ else
+ { //i>=3
+ constraintNormalAng = frameAworld.getColumn(i % 3);
+ posError = angleDiff[i % 3];
+ fillMultiBodyConstraint(constraintRow, data, 0, 0, constraintNormalAng,
+ constraintNormalLin, pivotAworld, pivotBworld,
+ posError,
+ infoGlobal,
+ -m_maxAppliedImpulse, m_maxAppliedImpulse, true);
+ }
}
}
diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyFixedConstraint.h b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyFixedConstraint.h
index 036025136e..adb1cb47da 100644
--- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyFixedConstraint.h
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyFixedConstraint.h
@@ -23,16 +23,14 @@ subject to the following restrictions:
class btMultiBodyFixedConstraint : public btMultiBodyConstraint
{
protected:
-
- btRigidBody* m_rigidBodyA;
- btRigidBody* m_rigidBodyB;
- btVector3 m_pivotInA;
- btVector3 m_pivotInB;
- btMatrix3x3 m_frameInA;
- btMatrix3x3 m_frameInB;
+ 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);
@@ -44,18 +42,18 @@ public:
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;
- }
+ btMultiBodyJacobianData& data,
+ const btContactSolverInfo& infoGlobal);
+
+ const btVector3& getPivotInA() const
+ {
+ return m_pivotInA;
+ }
+
+ void setPivotInA(const btVector3& pivotInA)
+ {
+ m_pivotInA = pivotInA;
+ }
const btVector3& getPivotInB() const
{
@@ -66,29 +64,28 @@ public:
{
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);
+ 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
+#endif //BT_MULTIBODY_FIXED_CONSTRAINT_H
diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyGearConstraint.cpp b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyGearConstraint.cpp
index 09ddd65cd8..bf6b811d26 100644
--- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyGearConstraint.cpp
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyGearConstraint.cpp
@@ -21,20 +21,18 @@ subject to the following restrictions:
#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
btMultiBodyGearConstraint::btMultiBodyGearConstraint(btMultiBody* bodyA, int linkA, btMultiBody* bodyB, int linkB, const btVector3& pivotInA, const btVector3& pivotInB, const btMatrix3x3& frameInA, const btMatrix3x3& frameInB)
- :btMultiBodyConstraint(bodyA,bodyB,linkA,linkB,1,false),
- m_gearRatio(1),
- m_gearAuxLink(-1),
- m_erp(0),
- m_relativePositionTarget(0)
+ : btMultiBodyConstraint(bodyA, bodyB, linkA, linkB, 1, false),
+ m_gearRatio(1),
+ m_gearAuxLink(-1),
+ m_erp(0),
+ m_relativePositionTarget(0)
{
-
}
void btMultiBodyGearConstraint::finalizeMultiDof()
{
-
allocateJacobiansMultiDof();
-
+
m_numDofsFinalized = m_jacSizeBoth;
}
@@ -42,7 +40,6 @@ btMultiBodyGearConstraint::~btMultiBodyGearConstraint()
{
}
-
int btMultiBodyGearConstraint::getIslandIdA() const
{
if (m_bodyA)
@@ -81,27 +78,25 @@ int btMultiBodyGearConstraint::getIslandIdB() const
return -1;
}
-
void btMultiBodyGearConstraint::createConstraintRows(btMultiBodyConstraintArray& constraintRows,
- btMultiBodyJacobianData& data,
- const btContactSolverInfo& infoGlobal)
+ btMultiBodyJacobianData& data,
+ const btContactSolverInfo& infoGlobal)
{
- // only positions need to be updated -- data.m_jacobians and force
- // directions were set in the ctor and never change.
-
+ // only positions need to be updated -- data.m_jacobians and force
+ // directions were set in the ctor and never change.
+
if (m_numDofsFinalized != m_jacSizeBoth)
{
- finalizeMultiDof();
+ finalizeMultiDof();
}
//don't crash
if (m_numDofsFinalized != m_jacSizeBoth)
return;
-
- if (m_maxAppliedImpulse==0.f)
+ if (m_maxAppliedImpulse == 0.f)
return;
-
+
// note: we rely on the fact that data.m_jacobians are
// always initialized to zero by the Constraint ctor
int linkDoF = 0;
@@ -114,67 +109,66 @@ void btMultiBodyGearConstraint::createConstraintRows(btMultiBodyConstraintArray&
btScalar posError = 0;
const btVector3 dummy(0, 0, 0);
-
+
btScalar kp = 1;
btScalar kd = 1;
int numRows = getNumRows();
- for (int row=0;row<numRows;row++)
+ for (int row = 0; row < numRows; row++)
{
btMultiBodySolverConstraint& constraintRow = constraintRows.expandNonInitializing();
-
- int dof = 0;
- btScalar currentPosition = m_bodyA->getJointPosMultiDof(m_linkA)[dof];
- btScalar currentVelocity = m_bodyA->getJointVelMultiDof(m_linkA)[dof];
+ int dof = 0;
+ btScalar currentPosition = m_bodyA->getJointPosMultiDof(m_linkA)[dof];
+ btScalar currentVelocity = m_bodyA->getJointVelMultiDof(m_linkA)[dof];
btScalar auxVel = 0;
-
- if (m_gearAuxLink>=0)
+
+ if (m_gearAuxLink >= 0)
{
auxVel = m_bodyA->getJointVelMultiDof(m_gearAuxLink)[dof];
}
currentVelocity += auxVel;
- if (m_erp!=0)
+ if (m_erp != 0)
{
btScalar currentPositionA = m_bodyA->getJointPosMultiDof(m_linkA)[dof];
if (m_gearAuxLink >= 0)
{
currentPositionA -= m_bodyA->getJointPosMultiDof(m_gearAuxLink)[dof];
}
- btScalar currentPositionB = m_gearRatio*m_bodyA->getJointPosMultiDof(m_linkB)[dof];
- btScalar diff = currentPositionB+currentPositionA;
+ btScalar currentPositionB = m_gearRatio * m_bodyA->getJointPosMultiDof(m_linkB)[dof];
+ btScalar diff = currentPositionB + currentPositionA;
btScalar desiredPositionDiff = this->m_relativePositionTarget;
- posError = -m_erp*(desiredPositionDiff - diff);
+ posError = -m_erp * (desiredPositionDiff - diff);
}
-
- btScalar desiredRelativeVelocity = auxVel;
-
- fillMultiBodyConstraint(constraintRow,data,jacobianA(row),jacobianB(row),dummy,dummy,dummy,dummy,posError,infoGlobal,-m_maxAppliedImpulse,m_maxAppliedImpulse,false,1,false,desiredRelativeVelocity);
+
+ btScalar desiredRelativeVelocity = auxVel;
+
+ fillMultiBodyConstraint(constraintRow, data, jacobianA(row), jacobianB(row), dummy, dummy, dummy, dummy, posError, infoGlobal, -m_maxAppliedImpulse, m_maxAppliedImpulse, false, 1, false, desiredRelativeVelocity);
constraintRow.m_orgConstraint = this;
constraintRow.m_orgDofIndex = row;
{
//expect either prismatic or revolute joint type for now
- btAssert((m_bodyA->getLink(m_linkA).m_jointType == btMultibodyLink::eRevolute)||(m_bodyA->getLink(m_linkA).m_jointType == btMultibodyLink::ePrismatic));
+ btAssert((m_bodyA->getLink(m_linkA).m_jointType == btMultibodyLink::eRevolute) || (m_bodyA->getLink(m_linkA).m_jointType == btMultibodyLink::ePrismatic));
switch (m_bodyA->getLink(m_linkA).m_jointType)
{
case btMultibodyLink::eRevolute:
{
constraintRow.m_contactNormal1.setZero();
constraintRow.m_contactNormal2.setZero();
- btVector3 revoluteAxisInWorld = quatRotate(m_bodyA->getLink(m_linkA).m_cachedWorldTransform.getRotation(),m_bodyA->getLink(m_linkA).m_axes[0].m_topVec);
- constraintRow.m_relpos1CrossNormal=revoluteAxisInWorld;
- constraintRow.m_relpos2CrossNormal=-revoluteAxisInWorld;
-
+ btVector3 revoluteAxisInWorld = quatRotate(m_bodyA->getLink(m_linkA).m_cachedWorldTransform.getRotation(), m_bodyA->getLink(m_linkA).m_axes[0].m_topVec);
+ constraintRow.m_relpos1CrossNormal = revoluteAxisInWorld;
+ constraintRow.m_relpos2CrossNormal = -revoluteAxisInWorld;
+
break;
}
case btMultibodyLink::ePrismatic:
{
- btVector3 prismaticAxisInWorld = quatRotate(m_bodyA->getLink(m_linkA).m_cachedWorldTransform.getRotation(),m_bodyA->getLink(m_linkA).m_axes[0].m_bottomVec);
- constraintRow.m_contactNormal1=prismaticAxisInWorld;
- constraintRow.m_contactNormal2=-prismaticAxisInWorld;
+ btVector3 prismaticAxisInWorld = quatRotate(m_bodyA->getLink(m_linkA).m_cachedWorldTransform.getRotation(), m_bodyA->getLink(m_linkA).m_axes[0].m_bottomVec);
+ constraintRow.m_contactNormal1 = prismaticAxisInWorld;
+ constraintRow.m_contactNormal2 = -prismaticAxisInWorld;
constraintRow.m_relpos1CrossNormal.setZero();
- constraintRow.m_relpos2CrossNormal.setZero();
+ constraintRow.m_relpos2CrossNormal.setZero();
break;
}
default:
@@ -182,10 +176,6 @@ void btMultiBodyGearConstraint::createConstraintRows(btMultiBodyConstraintArray&
btAssert(0);
}
};
-
}
-
}
-
}
-
diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyGearConstraint.h b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyGearConstraint.h
index 0115de6241..31888fbc68 100644
--- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyGearConstraint.h
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyGearConstraint.h
@@ -23,20 +23,18 @@ subject to the following restrictions:
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;
- 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);
@@ -48,18 +46,18 @@ public:
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;
- }
+ btMultiBodyJacobianData& data,
+ const btContactSolverInfo& infoGlobal);
+
+ const btVector3& getPivotInA() const
+ {
+ return m_pivotInA;
+ }
+
+ void setPivotInA(const btVector3& pivotInA)
+ {
+ m_pivotInA = pivotInA;
+ }
const btVector3& getPivotInB() const
{
@@ -70,32 +68,32 @@ public:
{
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 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;
@@ -114,4 +112,4 @@ public:
}
};
-#endif //BT_MULTIBODY_GEAR_CONSTRAINT_H
+#endif //BT_MULTIBODY_GEAR_CONSTRAINT_H
diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyJointFeedback.h b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyJointFeedback.h
index 5c2fa8ed5b..d943019e71 100644
--- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyJointFeedback.h
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyJointFeedback.h
@@ -12,8 +12,6 @@ subject to the following restrictions:
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
@@ -21,7 +19,7 @@ subject to the following restrictions:
struct btMultiBodyJointFeedback
{
- btSpatialForceVector m_reactionForces;
+ btSpatialForceVector m_reactionForces;
};
-#endif //BT_MULTIBODY_JOINT_FEEDBACK_H
+#endif //BT_MULTIBODY_JOINT_FEEDBACK_H
diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyJointLimitConstraint.cpp b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyJointLimitConstraint.cpp
index 35c929f7ce..8791ad2868 100644
--- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyJointLimitConstraint.cpp
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyJointLimitConstraint.cpp
@@ -20,21 +20,18 @@ subject to the following restrictions:
#include "btMultiBodyLinkCollider.h"
#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
-
-
btMultiBodyJointLimitConstraint::btMultiBodyJointLimitConstraint(btMultiBody* body, int link, btScalar lower, btScalar upper)
//:btMultiBodyConstraint(body,0,link,-1,2,true),
- :btMultiBodyConstraint(body,body,link,body->getLink(link).m_parent,2,true),
- m_lowerBound(lower),
- m_upperBound(upper)
+ : btMultiBodyConstraint(body, body, link, body->getLink(link).m_parent, 2, true),
+ m_lowerBound(lower),
+ m_upperBound(upper)
{
-
}
void btMultiBodyJointLimitConstraint::finalizeMultiDof()
{
// the data.m_jacobians never change, so may as well
- // initialize them here
+ // initialize them here
allocateJacobiansMultiDof();
@@ -53,10 +50,8 @@ btMultiBodyJointLimitConstraint::~btMultiBodyJointLimitConstraint()
{
}
-
int btMultiBodyJointLimitConstraint::getIslandIdA() const
{
-
if (m_bodyA)
{
if (m_linkA < 0)
@@ -93,72 +88,69 @@ int btMultiBodyJointLimitConstraint::getIslandIdB() const
return -1;
}
-
void btMultiBodyJointLimitConstraint::createConstraintRows(btMultiBodyConstraintArray& constraintRows,
- btMultiBodyJacobianData& data,
- const btContactSolverInfo& infoGlobal)
+ btMultiBodyJacobianData& data,
+ const btContactSolverInfo& infoGlobal)
{
-
- // only positions need to be updated -- data.m_jacobians and force
- // directions were set in the ctor and never change.
+ // only positions need to be updated -- data.m_jacobians and force
+ // directions were set in the ctor and never change.
if (m_numDofsFinalized != m_jacSizeBoth)
{
- finalizeMultiDof();
+ finalizeMultiDof();
}
+ // row 0: the lower bound
+ setPosition(0, m_bodyA->getJointPos(m_linkA) - m_lowerBound); //multidof: this is joint-type dependent
- // row 0: the lower bound
- setPosition(0, m_bodyA->getJointPos(m_linkA) - m_lowerBound); //multidof: this is joint-type dependent
+ // row 1: the upper bound
+ setPosition(1, m_upperBound - m_bodyA->getJointPos(m_linkA));
- // row 1: the upper bound
- setPosition(1, m_upperBound - m_bodyA->getJointPos(m_linkA));
-
- for (int row=0;row<getNumRows();row++)
+ for (int row = 0; row < getNumRows(); row++)
{
btScalar penetration = getPosition(row);
//todo: consider adding some safety threshold here
- if (penetration>0)
+ if (penetration > 0)
{
continue;
}
- btScalar direction = row? -1 : 1;
+ btScalar direction = row ? -1 : 1;
btMultiBodySolverConstraint& constraintRow = constraintRows.expandNonInitializing();
- constraintRow.m_orgConstraint = this;
- constraintRow.m_orgDofIndex = row;
-
+ constraintRow.m_orgConstraint = this;
+ constraintRow.m_orgDofIndex = row;
+
constraintRow.m_multiBodyA = m_bodyA;
constraintRow.m_multiBodyB = m_bodyB;
- const btScalar posError = 0; //why assume it's zero?
+ const btScalar posError = 0; //why assume it's zero?
const btVector3 dummy(0, 0, 0);
- btScalar rel_vel = fillMultiBodyConstraint(constraintRow,data,jacobianA(row),jacobianB(row),dummy,dummy,dummy,dummy,posError,infoGlobal,0,m_maxAppliedImpulse);
+ btScalar rel_vel = fillMultiBodyConstraint(constraintRow, data, jacobianA(row), jacobianB(row), dummy, dummy, dummy, dummy, posError, infoGlobal, 0, m_maxAppliedImpulse);
{
//expect either prismatic or revolute joint type for now
- btAssert((m_bodyA->getLink(m_linkA).m_jointType == btMultibodyLink::eRevolute)||(m_bodyA->getLink(m_linkA).m_jointType == btMultibodyLink::ePrismatic));
+ btAssert((m_bodyA->getLink(m_linkA).m_jointType == btMultibodyLink::eRevolute) || (m_bodyA->getLink(m_linkA).m_jointType == btMultibodyLink::ePrismatic));
switch (m_bodyA->getLink(m_linkA).m_jointType)
{
case btMultibodyLink::eRevolute:
{
constraintRow.m_contactNormal1.setZero();
constraintRow.m_contactNormal2.setZero();
- btVector3 revoluteAxisInWorld = direction*quatRotate(m_bodyA->getLink(m_linkA).m_cachedWorldTransform.getRotation(),m_bodyA->getLink(m_linkA).m_axes[0].m_topVec);
- constraintRow.m_relpos1CrossNormal=revoluteAxisInWorld;
- constraintRow.m_relpos2CrossNormal=-revoluteAxisInWorld;
-
+ btVector3 revoluteAxisInWorld = direction * quatRotate(m_bodyA->getLink(m_linkA).m_cachedWorldTransform.getRotation(), m_bodyA->getLink(m_linkA).m_axes[0].m_topVec);
+ constraintRow.m_relpos1CrossNormal = revoluteAxisInWorld;
+ constraintRow.m_relpos2CrossNormal = -revoluteAxisInWorld;
+
break;
}
case btMultibodyLink::ePrismatic:
{
- btVector3 prismaticAxisInWorld = direction* quatRotate(m_bodyA->getLink(m_linkA).m_cachedWorldTransform.getRotation(),m_bodyA->getLink(m_linkA).m_axes[0].m_bottomVec);
- constraintRow.m_contactNormal1=prismaticAxisInWorld;
- constraintRow.m_contactNormal2=-prismaticAxisInWorld;
+ btVector3 prismaticAxisInWorld = direction * quatRotate(m_bodyA->getLink(m_linkA).m_cachedWorldTransform.getRotation(), m_bodyA->getLink(m_linkA).m_axes[0].m_bottomVec);
+ constraintRow.m_contactNormal1 = prismaticAxisInWorld;
+ constraintRow.m_contactNormal2 = -prismaticAxisInWorld;
constraintRow.m_relpos1CrossNormal.setZero();
constraintRow.m_relpos2CrossNormal.setZero();
-
+
break;
}
default:
@@ -166,36 +158,35 @@ void btMultiBodyJointLimitConstraint::createConstraintRows(btMultiBodyConstraint
btAssert(0);
}
};
-
}
{
-
btScalar positionalError = 0.f;
- btScalar velocityError = - rel_vel;// * damping;
+ btScalar velocityError = -rel_vel; // * damping;
btScalar erp = infoGlobal.m_erp2;
if (!infoGlobal.m_splitImpulse || (penetration > infoGlobal.m_splitImpulsePenetrationThreshold))
{
erp = infoGlobal.m_erp;
}
- if (penetration>0)
+ if (penetration > 0)
{
positionalError = 0;
velocityError = -penetration / infoGlobal.m_timeStep;
- } else
+ }
+ else
{
- positionalError = -penetration * erp/infoGlobal.m_timeStep;
+ positionalError = -penetration * erp / infoGlobal.m_timeStep;
}
- btScalar penetrationImpulse = positionalError*constraintRow.m_jacDiagABInv;
- btScalar velocityImpulse = velocityError *constraintRow.m_jacDiagABInv;
+ btScalar penetrationImpulse = positionalError * constraintRow.m_jacDiagABInv;
+ btScalar velocityImpulse = velocityError * constraintRow.m_jacDiagABInv;
if (!infoGlobal.m_splitImpulse || (penetration > infoGlobal.m_splitImpulsePenetrationThreshold))
{
//combine position and velocity into rhs
- constraintRow.m_rhs = penetrationImpulse+velocityImpulse;
+ constraintRow.m_rhs = penetrationImpulse + velocityImpulse;
constraintRow.m_rhsPenetration = 0.f;
-
- } else
+ }
+ else
{
//split position and velocity into rhs and m_rhsPenetration
constraintRow.m_rhs = velocityImpulse;
@@ -203,9 +194,4 @@ void btMultiBodyJointLimitConstraint::createConstraintRows(btMultiBodyConstraint
}
}
}
-
}
-
-
-
-
diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyJointLimitConstraint.h b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyJointLimitConstraint.h
index 55b8d122b9..6716ba490f 100644
--- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyJointLimitConstraint.h
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyJointLimitConstraint.h
@@ -22,11 +22,10 @@ struct btSolverInfo;
class btMultiBodyJointLimitConstraint : public btMultiBodyConstraint
{
protected:
+ btScalar m_lowerBound;
+ btScalar m_upperBound;
- btScalar m_lowerBound;
- btScalar m_upperBound;
public:
-
btMultiBodyJointLimitConstraint(btMultiBody* body, int link, btScalar lower, btScalar upper);
virtual ~btMultiBodyJointLimitConstraint();
@@ -36,15 +35,13 @@ public:
virtual int getIslandIdB() const;
virtual void createConstraintRows(btMultiBodyConstraintArray& constraintRows,
- btMultiBodyJacobianData& data,
- const btContactSolverInfo& infoGlobal);
+ btMultiBodyJacobianData& data,
+ const btContactSolverInfo& infoGlobal);
virtual void debugDraw(class btIDebugDraw* drawer)
{
//todo(erwincoumans)
}
-
};
-#endif //BT_MULTIBODY_JOINT_LIMIT_CONSTRAINT_H
-
+#endif //BT_MULTIBODY_JOINT_LIMIT_CONSTRAINT_H
diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyJointMotor.cpp b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyJointMotor.cpp
index 2a70ea97e5..5c816c4987 100644
--- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyJointMotor.cpp
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyJointMotor.cpp
@@ -20,22 +20,18 @@ subject to the following restrictions:
#include "btMultiBodyLinkCollider.h"
#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
-
btMultiBodyJointMotor::btMultiBodyJointMotor(btMultiBody* body, int link, btScalar desiredVelocity, btScalar maxMotorImpulse)
- :btMultiBodyConstraint(body,body,link,body->getLink(link).m_parent,1,true),
- m_desiredVelocity(desiredVelocity),
- m_desiredPosition(0),
- m_kd(1.),
- m_kp(0),
- m_erp(1),
- m_rhsClamp(SIMD_INFINITY)
+ : btMultiBodyConstraint(body, body, link, body->getLink(link).m_parent, 1, true),
+ m_desiredVelocity(desiredVelocity),
+ m_desiredPosition(0),
+ m_kd(1.),
+ m_kp(0),
+ m_erp(1),
+ m_rhsClamp(SIMD_INFINITY)
{
-
m_maxAppliedImpulse = maxMotorImpulse;
// the data.m_jacobians never change, so may as well
- // initialize them here
-
-
+ // initialize them here
}
void btMultiBodyJointMotor::finalizeMultiDof()
@@ -55,18 +51,17 @@ void btMultiBodyJointMotor::finalizeMultiDof()
btMultiBodyJointMotor::btMultiBodyJointMotor(btMultiBody* body, int link, int linkDoF, btScalar desiredVelocity, btScalar maxMotorImpulse)
//:btMultiBodyConstraint(body,0,link,-1,1,true),
- :btMultiBodyConstraint(body,body,link,body->getLink(link).m_parent,1,true),
- m_desiredVelocity(desiredVelocity),
- m_desiredPosition(0),
- m_kd(1.),
- m_kp(0),
- m_erp(1),
- m_rhsClamp(SIMD_INFINITY)
+ : btMultiBodyConstraint(body, body, link, body->getLink(link).m_parent, 1, true),
+ m_desiredVelocity(desiredVelocity),
+ m_desiredPosition(0),
+ m_kd(1.),
+ m_kp(0),
+ m_erp(1),
+ m_rhsClamp(SIMD_INFINITY)
{
btAssert(linkDoF < body->getLink(link).m_dofCount);
m_maxAppliedImpulse = maxMotorImpulse;
-
}
btMultiBodyJointMotor::~btMultiBodyJointMotor()
{
@@ -108,76 +103,74 @@ int btMultiBodyJointMotor::getIslandIdB() const
return -1;
}
-
void btMultiBodyJointMotor::createConstraintRows(btMultiBodyConstraintArray& constraintRows,
- btMultiBodyJacobianData& data,
- const btContactSolverInfo& infoGlobal)
+ btMultiBodyJacobianData& data,
+ const btContactSolverInfo& infoGlobal)
{
- // only positions need to be updated -- data.m_jacobians and force
- // directions were set in the ctor and never change.
-
+ // only positions need to be updated -- data.m_jacobians and force
+ // directions were set in the ctor and never change.
+
if (m_numDofsFinalized != m_jacSizeBoth)
{
- finalizeMultiDof();
+ finalizeMultiDof();
}
//don't crash
if (m_numDofsFinalized != m_jacSizeBoth)
return;
- if (m_maxAppliedImpulse==0.f)
+ if (m_maxAppliedImpulse == 0.f)
return;
const btScalar posError = 0;
const btVector3 dummy(0, 0, 0);
- for (int row=0;row<getNumRows();row++)
+ for (int row = 0; row < getNumRows(); row++)
{
btMultiBodySolverConstraint& constraintRow = constraintRows.expandNonInitializing();
- int dof = 0;
- btScalar currentPosition = m_bodyA->getJointPosMultiDof(m_linkA)[dof];
- btScalar currentVelocity = m_bodyA->getJointVelMultiDof(m_linkA)[dof];
- btScalar positionStabiliationTerm = m_erp*(m_desiredPosition-currentPosition)/infoGlobal.m_timeStep;
-
- btScalar velocityError = (m_desiredVelocity - currentVelocity);
- btScalar rhs = m_kp * positionStabiliationTerm + currentVelocity+m_kd * velocityError;
- if (rhs>m_rhsClamp)
+ int dof = 0;
+ btScalar currentPosition = m_bodyA->getJointPosMultiDof(m_linkA)[dof];
+ btScalar currentVelocity = m_bodyA->getJointVelMultiDof(m_linkA)[dof];
+ btScalar positionStabiliationTerm = m_erp * (m_desiredPosition - currentPosition) / infoGlobal.m_timeStep;
+
+ btScalar velocityError = (m_desiredVelocity - currentVelocity);
+ btScalar rhs = m_kp * positionStabiliationTerm + currentVelocity + m_kd * velocityError;
+ if (rhs > m_rhsClamp)
{
- rhs=m_rhsClamp;
+ rhs = m_rhsClamp;
}
- if (rhs<-m_rhsClamp)
+ if (rhs < -m_rhsClamp)
{
- rhs=-m_rhsClamp;
+ rhs = -m_rhsClamp;
}
-
-
- fillMultiBodyConstraint(constraintRow,data,jacobianA(row),jacobianB(row),dummy,dummy,dummy,dummy,posError,infoGlobal,-m_maxAppliedImpulse,m_maxAppliedImpulse,false,1,false,rhs);
+
+ fillMultiBodyConstraint(constraintRow, data, jacobianA(row), jacobianB(row), dummy, dummy, dummy, dummy, posError, infoGlobal, -m_maxAppliedImpulse, m_maxAppliedImpulse, false, 1, false, rhs);
constraintRow.m_orgConstraint = this;
constraintRow.m_orgDofIndex = row;
{
//expect either prismatic or revolute joint type for now
- btAssert((m_bodyA->getLink(m_linkA).m_jointType == btMultibodyLink::eRevolute)||(m_bodyA->getLink(m_linkA).m_jointType == btMultibodyLink::ePrismatic));
+ btAssert((m_bodyA->getLink(m_linkA).m_jointType == btMultibodyLink::eRevolute) || (m_bodyA->getLink(m_linkA).m_jointType == btMultibodyLink::ePrismatic));
switch (m_bodyA->getLink(m_linkA).m_jointType)
{
case btMultibodyLink::eRevolute:
{
constraintRow.m_contactNormal1.setZero();
constraintRow.m_contactNormal2.setZero();
- btVector3 revoluteAxisInWorld = quatRotate(m_bodyA->getLink(m_linkA).m_cachedWorldTransform.getRotation(),m_bodyA->getLink(m_linkA).m_axes[0].m_topVec);
- constraintRow.m_relpos1CrossNormal=revoluteAxisInWorld;
- constraintRow.m_relpos2CrossNormal=-revoluteAxisInWorld;
-
+ btVector3 revoluteAxisInWorld = quatRotate(m_bodyA->getLink(m_linkA).m_cachedWorldTransform.getRotation(), m_bodyA->getLink(m_linkA).m_axes[0].m_topVec);
+ constraintRow.m_relpos1CrossNormal = revoluteAxisInWorld;
+ constraintRow.m_relpos2CrossNormal = -revoluteAxisInWorld;
+
break;
}
case btMultibodyLink::ePrismatic:
{
- btVector3 prismaticAxisInWorld = quatRotate(m_bodyA->getLink(m_linkA).m_cachedWorldTransform.getRotation(),m_bodyA->getLink(m_linkA).m_axes[0].m_bottomVec);
- constraintRow.m_contactNormal1=prismaticAxisInWorld;
- constraintRow.m_contactNormal2=-prismaticAxisInWorld;
+ btVector3 prismaticAxisInWorld = quatRotate(m_bodyA->getLink(m_linkA).m_cachedWorldTransform.getRotation(), m_bodyA->getLink(m_linkA).m_axes[0].m_bottomVec);
+ constraintRow.m_contactNormal1 = prismaticAxisInWorld;
+ constraintRow.m_contactNormal2 = -prismaticAxisInWorld;
constraintRow.m_relpos1CrossNormal.setZero();
constraintRow.m_relpos2CrossNormal.setZero();
-
+
break;
}
default:
@@ -185,10 +178,6 @@ void btMultiBodyJointMotor::createConstraintRows(btMultiBodyConstraintArray& con
btAssert(0);
}
};
-
}
-
}
-
}
-
diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyJointMotor.h b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyJointMotor.h
index 4063bed79a..1aca36352e 100644
--- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyJointMotor.h
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyJointMotor.h
@@ -24,41 +24,38 @@ 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
-
+ 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 void finalizeMultiDof();
virtual int getIslandIdA() const;
virtual int getIslandIdB() const;
virtual void createConstraintRows(btMultiBodyConstraintArray& constraintRows,
- btMultiBodyJacobianData& data,
- const btContactSolverInfo& infoGlobal);
+ btMultiBodyJacobianData& data,
+ const btContactSolverInfo& infoGlobal);
+
+ virtual void setVelocityTarget(btScalar velTarget, btScalar kd = 1.f)
+ {
+ m_desiredVelocity = velTarget;
+ m_kd = kd;
+ }
- 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 setPositionTarget(btScalar posTarget, btScalar kp = 1.f)
- {
- m_desiredPosition = posTarget;
- m_kp = kp;
- }
-
virtual void setErp(btScalar erp)
{
m_erp = erp;
@@ -77,5 +74,4 @@ public:
}
};
-#endif //BT_MULTIBODY_JOINT_MOTOR_H
-
+#endif //BT_MULTIBODY_JOINT_MOTOR_H
diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyLink.h b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyLink.h
index 21c9e7a557..92d41dfac2 100644
--- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyLink.h
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyLink.h
@@ -20,7 +20,7 @@ subject to the following restrictions:
#include "LinearMath/btVector3.h"
#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
-enum btMultiBodyLinkFlags
+enum btMultiBodyLinkFlags
{
BT_MULTIBODYLINKFLAGS_DISABLE_PARENT_COLLISION = 1,
BT_MULTIBODYLINKFLAGS_DISABLE_ALL_PARENT_COLLISION = 2,
@@ -36,7 +36,6 @@ enum btMultiBodyLinkFlags
//namespace {
-
#include "LinearMath/btSpatialAlgebra.h"
//}
@@ -45,27 +44,26 @@ enum btMultiBodyLinkFlags
// Link struct
//
-struct btMultibodyLink
+struct btMultibodyLink
{
-
BT_DECLARE_ALIGNED_ALLOCATOR();
- btScalar m_mass; // mass of link
- btVector3 m_inertiaLocal; // inertia of link (local frame; diagonal)
+ 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.
- 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.
- 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)
- 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.
+ // 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;
+
+ btVector3 m_eVector;
btSpatialMotionVector m_absFrameTotVelocity, m_absFrameLocVelocity;
@@ -79,13 +77,11 @@ struct btMultibodyLink
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 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)
@@ -93,143 +89,141 @@ struct btMultibodyLink
// 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
+ // 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 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)
+ void setAxisTop(int dof, const btScalar &x, const btScalar &y, const btScalar &z)
{
- m_axes[dof].m_topVec.setValue(x, y, 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);
+ 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; }
+ 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.
+ 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.
- btVector3 m_appliedForce; // In WORLD frame
- btVector3 m_appliedTorque; // In WORLD 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
+ btVector3 m_appliedConstraintForce; // In WORLD frame
+ btVector3 m_appliedConstraintTorque; // In WORLD frame
btScalar m_jointPos[7];
-
- //m_jointTorque is the joint torque applied by the user using 'addJointTorque'.
- //It gets set to zero after each internal stepSimulation call
+
+ //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;
+
+ class btMultiBodyLinkCollider *m_collider;
int m_flags;
-
-
- int m_dofCount, m_posVarCount; //redundant but handy
-
+
+ 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.
-
+
+ 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_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_mass(1),
+ m_parent(-1),
+ m_zeroRotParentToThis(0, 0, 0, 1),
+ m_cachedRotParentToThis(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_appliedForce.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_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_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
+ // routine to update m_cachedRotParentToThis and m_cachedRVector
void updateCacheMultiDof(btScalar *pq = 0)
{
btScalar *pJointPos = (pq ? pq : &m_jointPos[0]);
- switch(m_jointType)
+ switch (m_jointType)
{
case eRevolute:
{
- m_cachedRotParentToThis = btQuaternion(getAxisTop(0),-pJointPos[0]) * m_zeroRotParentToThis;
- m_cachedRVector = m_dVector + quatRotate(m_cachedRotParentToThis,m_eVector);
+ m_cachedRotParentToThis = btQuaternion(getAxisTop(0), -pJointPos[0]) * m_zeroRotParentToThis;
+ m_cachedRVector = m_dVector + quatRotate(m_cachedRotParentToThis, m_eVector);
break;
}
case ePrismatic:
{
// m_cachedRotParentToThis never changes, so no need to update
- m_cachedRVector = m_dVector + quatRotate(m_cachedRotParentToThis,m_eVector) + pJointPos[0] * getAxisBottom(0);
+ m_cachedRVector = m_dVector + quatRotate(m_cachedRotParentToThis, m_eVector) + pJointPos[0] * getAxisBottom(0);
break;
}
case eSpherical:
{
m_cachedRotParentToThis = btQuaternion(pJointPos[0], pJointPos[1], pJointPos[2], -pJointPos[3]) * m_zeroRotParentToThis;
- m_cachedRVector = m_dVector + quatRotate(m_cachedRotParentToThis,m_eVector);
+ m_cachedRVector = m_dVector + quatRotate(m_cachedRotParentToThis, m_eVector);
break;
}
case ePlanar:
{
- m_cachedRotParentToThis = btQuaternion(getAxisTop(0),-pJointPos[0]) * m_zeroRotParentToThis;
- m_cachedRVector = quatRotate(btQuaternion(getAxisTop(0),-pJointPos[0]), pJointPos[1] * getAxisBottom(1) + pJointPos[2] * getAxisBottom(2)) + quatRotate(m_cachedRotParentToThis,m_eVector);
+ m_cachedRotParentToThis = btQuaternion(getAxisTop(0), -pJointPos[0]) * m_zeroRotParentToThis;
+ m_cachedRVector = quatRotate(btQuaternion(getAxisTop(0), -pJointPos[0]), pJointPos[1] * getAxisBottom(1) + pJointPos[2] * getAxisBottom(2)) + quatRotate(m_cachedRotParentToThis, m_eVector);
break;
}
case eFixed:
{
m_cachedRotParentToThis = m_zeroRotParentToThis;
- m_cachedRVector = m_dVector + quatRotate(m_cachedRotParentToThis,m_eVector);
+ m_cachedRVector = m_dVector + quatRotate(m_cachedRotParentToThis, m_eVector);
break;
}
@@ -242,5 +236,4 @@ btVector3 m_appliedConstraintForce; // In WORLD frame
}
};
-
-#endif //BT_MULTIBODY_LINK_H
+#endif //BT_MULTIBODY_LINK_H
diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyLinkCollider.h b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyLinkCollider.h
index 7092e62b5a..f91c001f12 100644
--- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyLinkCollider.h
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyLinkCollider.h
@@ -29,21 +29,18 @@ subject to the following restrictions:
#define btMultiBodyLinkColliderDataName "btMultiBodyLinkColliderFloatData"
#endif
-
class btMultiBodyLinkCollider : public btCollisionObject
{
-//protected:
+ //protected:
public:
-
btMultiBody* m_multiBody;
int m_link;
-
- btMultiBodyLinkCollider (btMultiBody* multiBody,int link)
- :m_multiBody(multiBody),
- m_link(link)
+ btMultiBodyLinkCollider(btMultiBody* multiBody, int link)
+ : m_multiBody(multiBody),
+ m_link(link)
{
- m_checkCollideWith = true;
+ 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()))
@@ -59,18 +56,18 @@ public:
}
static btMultiBodyLinkCollider* upcast(btCollisionObject* colObj)
{
- if (colObj->getInternalType()&btCollisionObject::CO_FEATHERSTONE_LINK)
+ 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)
+ if (colObj->getInternalType() & btCollisionObject::CO_FEATHERSTONE_LINK)
return (btMultiBodyLinkCollider*)colObj;
return 0;
}
- virtual bool checkCollideWithOverride(const btCollisionObject* co) const
+ virtual bool checkCollideWithOverride(const btCollisionObject* co) const
{
const btMultiBodyLinkCollider* other = btMultiBodyLinkCollider::upcast(co);
if (!other)
@@ -81,47 +78,46 @@ public:
return false;
//check if 'link' has collision disabled
- if (m_link>=0)
+ if (m_link >= 0)
{
const btMultibodyLink& link = m_multiBody->getLink(this->m_link);
- if (link.m_flags&BT_MULTIBODYLINKFLAGS_DISABLE_ALL_PARENT_COLLISION)
+ if (link.m_flags & BT_MULTIBODYLINKFLAGS_DISABLE_ALL_PARENT_COLLISION)
{
int parent_of_this = m_link;
while (1)
{
- if (parent_of_this==-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)
+ if (parent_of_this == other->m_link)
{
return false;
}
}
}
- else if (link.m_flags&BT_MULTIBODYLINKFLAGS_DISABLE_PARENT_COLLISION)
+ else if (link.m_flags & BT_MULTIBODYLINKFLAGS_DISABLE_PARENT_COLLISION)
{
- if ( link.m_parent == other->m_link)
+ if (link.m_parent == other->m_link)
return false;
}
-
}
- if (other->m_link>=0)
+ 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)
+ if (otherLink.m_flags & BT_MULTIBODYLINKFLAGS_DISABLE_ALL_PARENT_COLLISION)
{
int parent_of_other = other->m_link;
while (1)
{
- if (parent_of_other==-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)
+ if (parent_of_other == this->m_link)
return false;
}
}
- else if (otherLink.m_flags& BT_MULTIBODYLINKFLAGS_DISABLE_PARENT_COLLISION)
+ else if (otherLink.m_flags & BT_MULTIBODYLINKFLAGS_DISABLE_PARENT_COLLISION)
{
if (otherLink.m_parent == this->m_link)
return false;
@@ -130,13 +126,13 @@ public:
return true;
}
- virtual int calculateSerializeBufferSize() 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 const char* serialize(void* dataBuffer, class btSerializer* serializer) const;
};
+// clang-format off
struct btMultiBodyLinkColliderFloatData
{
@@ -154,16 +150,18 @@ struct btMultiBodyLinkColliderDoubleData
char m_padding[4];
};
-SIMD_FORCE_INLINE int btMultiBodyLinkCollider::calculateSerializeBufferSize() const
+// 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
+SIMD_FORCE_INLINE const char* btMultiBodyLinkCollider::serialize(void* dataBuffer, class btSerializer* serializer) const
{
btMultiBodyLinkColliderData* dataOut = (btMultiBodyLinkColliderData*)dataBuffer;
- btCollisionObject::serialize(&dataOut->m_colObjData,serializer);
-
+ btCollisionObject::serialize(&dataOut->m_colObjData, serializer);
+
dataOut->m_link = this->m_link;
dataOut->m_multiBody = (btMultiBodyData*)serializer->getUniquePointer(m_multiBody);
@@ -173,5 +171,4 @@ SIMD_FORCE_INLINE const char* btMultiBodyLinkCollider::serialize(void* dataBuffe
return btMultiBodyLinkColliderDataName;
}
-#endif //BT_FEATHERSTONE_LINK_COLLIDER_H
-
+#endif //BT_FEATHERSTONE_LINK_COLLIDER_H
diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyPoint2Point.cpp b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyPoint2Point.cpp
index 2b59f0b7a6..37d3aede37 100644
--- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyPoint2Point.cpp
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyPoint2Point.cpp
@@ -21,29 +21,29 @@ subject to the following restrictions:
#include "LinearMath/btIDebugDraw.h"
#ifndef BTMBP2PCONSTRAINT_BLOCK_ANGULAR_MOTION_TEST
- #define BTMBP2PCONSTRAINT_DIM 3
+#define BTMBP2PCONSTRAINT_DIM 3
#else
- #define BTMBP2PCONSTRAINT_DIM 6
+#define BTMBP2PCONSTRAINT_DIM 6
#endif
btMultiBodyPoint2Point::btMultiBodyPoint2Point(btMultiBody* body, int link, btRigidBody* bodyB, const btVector3& pivotInA, const btVector3& pivotInB)
- :btMultiBodyConstraint(body,0,link,-1,BTMBP2PCONSTRAINT_DIM,false),
- m_rigidBodyA(0),
- m_rigidBodyB(bodyB),
- m_pivotInA(pivotInA),
- m_pivotInB(pivotInB)
+ : btMultiBodyConstraint(body, 0, link, -1, BTMBP2PCONSTRAINT_DIM, false),
+ m_rigidBodyA(0),
+ m_rigidBodyB(bodyB),
+ m_pivotInA(pivotInA),
+ m_pivotInB(pivotInB)
{
- m_data.resize(BTMBP2PCONSTRAINT_DIM);//at least store the applied impulses
+ m_data.resize(BTMBP2PCONSTRAINT_DIM); //at least store the applied impulses
}
btMultiBodyPoint2Point::btMultiBodyPoint2Point(btMultiBody* bodyA, int linkA, btMultiBody* bodyB, int linkB, const btVector3& pivotInA, const btVector3& pivotInB)
- :btMultiBodyConstraint(bodyA,bodyB,linkA,linkB,BTMBP2PCONSTRAINT_DIM,false),
- m_rigidBodyA(0),
- m_rigidBodyB(0),
- m_pivotInA(pivotInA),
- m_pivotInB(pivotInB)
+ : btMultiBodyConstraint(bodyA, bodyB, linkA, linkB, BTMBP2PCONSTRAINT_DIM, false),
+ m_rigidBodyA(0),
+ m_rigidBodyB(0),
+ m_pivotInA(pivotInA),
+ m_pivotInB(pivotInB)
{
- m_data.resize(BTMBP2PCONSTRAINT_DIM);//at least store the applied impulses
+ m_data.resize(BTMBP2PCONSTRAINT_DIM); //at least store the applied impulses
}
void btMultiBodyPoint2Point::finalizeMultiDof()
@@ -56,7 +56,6 @@ btMultiBodyPoint2Point::~btMultiBodyPoint2Point()
{
}
-
int btMultiBodyPoint2Point::getIslandIdA() const
{
if (m_rigidBodyA)
@@ -73,7 +72,7 @@ int btMultiBodyPoint2Point::getIslandIdA() const
else
{
if (m_bodyA->getLink(m_linkA).m_collider)
- return m_bodyA->getLink(m_linkA).m_collider->getIslandTag();
+ return m_bodyA->getLink(m_linkA).m_collider->getIslandTag();
}
}
return -1;
@@ -100,48 +99,43 @@ int btMultiBodyPoint2Point::getIslandIdB() const
return -1;
}
-
-
void btMultiBodyPoint2Point::createConstraintRows(btMultiBodyConstraintArray& constraintRows,
- btMultiBodyJacobianData& data,
- const btContactSolverInfo& infoGlobal)
+ btMultiBodyJacobianData& data,
+ const btContactSolverInfo& infoGlobal)
{
-
-// int i=1;
-int numDim = BTMBP2PCONSTRAINT_DIM;
- for (int i=0;i<numDim;i++)
+ // int i=1;
+ int numDim = BTMBP2PCONSTRAINT_DIM;
+ for (int i = 0; i < numDim; i++)
{
-
btMultiBodySolverConstraint& constraintRow = constraintRows.expandNonInitializing();
- //memset(&constraintRow,0xffffffff,sizeof(btMultiBodySolverConstraint));
- constraintRow.m_orgConstraint = this;
- constraintRow.m_orgDofIndex = i;
- constraintRow.m_relpos1CrossNormal.setValue(0,0,0);
- constraintRow.m_contactNormal1.setValue(0,0,0);
- constraintRow.m_relpos2CrossNormal.setValue(0,0,0);
- constraintRow.m_contactNormal2.setValue(0,0,0);
- constraintRow.m_angularComponentA.setValue(0,0,0);
- constraintRow.m_angularComponentB.setValue(0,0,0);
+ //memset(&constraintRow,0xffffffff,sizeof(btMultiBodySolverConstraint));
+ constraintRow.m_orgConstraint = this;
+ constraintRow.m_orgDofIndex = i;
+ constraintRow.m_relpos1CrossNormal.setValue(0, 0, 0);
+ constraintRow.m_contactNormal1.setValue(0, 0, 0);
+ constraintRow.m_relpos2CrossNormal.setValue(0, 0, 0);
+ constraintRow.m_contactNormal2.setValue(0, 0, 0);
+ constraintRow.m_angularComponentA.setValue(0, 0, 0);
+ constraintRow.m_angularComponentB.setValue(0, 0, 0);
constraintRow.m_solverBodyIdA = data.m_fixedBodyId;
constraintRow.m_solverBodyIdB = data.m_fixedBodyId;
- btVector3 contactNormalOnB(0,0,0);
+ btVector3 contactNormalOnB(0, 0, 0);
#ifndef BTMBP2PCONSTRAINT_BLOCK_ANGULAR_MOTION_TEST
contactNormalOnB[i] = -1;
#else
- contactNormalOnB[i%3] = -1;
+ contactNormalOnB[i % 3] = -1;
#endif
-
- // Convert local points back to world
+ // Convert local points back to world
btVector3 pivotAworld = m_pivotInA;
if (m_rigidBodyA)
{
-
constraintRow.m_solverBodyIdA = m_rigidBodyA->getCompanionId();
- pivotAworld = m_rigidBodyA->getCenterOfMassTransform()*m_pivotInA;
- } else
+ pivotAworld = m_rigidBodyA->getCenterOfMassTransform() * m_pivotInA;
+ }
+ else
{
if (m_bodyA)
pivotAworld = m_bodyA->localPosToWorld(m_linkA, m_pivotInA);
@@ -150,44 +144,41 @@ int numDim = BTMBP2PCONSTRAINT_DIM;
if (m_rigidBodyB)
{
constraintRow.m_solverBodyIdB = m_rigidBodyB->getCompanionId();
- pivotBworld = m_rigidBodyB->getCenterOfMassTransform()*m_pivotInB;
- } else
+ pivotBworld = m_rigidBodyB->getCenterOfMassTransform() * m_pivotInB;
+ }
+ else
{
if (m_bodyB)
pivotBworld = m_bodyB->localPosToWorld(m_linkB, m_pivotInB);
-
}
- btScalar posError = i < 3 ? (pivotAworld-pivotBworld).dot(contactNormalOnB) : 0;
+ btScalar posError = i < 3 ? (pivotAworld - pivotBworld).dot(contactNormalOnB) : 0;
#ifndef BTMBP2PCONSTRAINT_BLOCK_ANGULAR_MOTION_TEST
-
- fillMultiBodyConstraint(constraintRow, data, 0, 0, btVector3(0,0,0),
- contactNormalOnB, pivotAworld, pivotBworld, //sucks but let it be this way "for the time being"
- posError,
- infoGlobal,
- -m_maxAppliedImpulse, m_maxAppliedImpulse
- );
- //@todo: support the case of btMultiBody versus btRigidBody,
- //see btPoint2PointConstraint::getInfo2NonVirtual
+ fillMultiBodyConstraint(constraintRow, data, 0, 0, btVector3(0, 0, 0),
+ contactNormalOnB, pivotAworld, pivotBworld, //sucks but let it be this way "for the time being"
+ posError,
+ infoGlobal,
+ -m_maxAppliedImpulse, m_maxAppliedImpulse);
+ //@todo: support the case of btMultiBody versus btRigidBody,
+ //see btPoint2PointConstraint::getInfo2NonVirtual
#else
const btVector3 dummy(0, 0, 0);
btAssert(m_bodyA->isMultiDof());
btScalar* jac1 = jacobianA(i);
- const btVector3 &normalAng = i >= 3 ? contactNormalOnB : dummy;
- const btVector3 &normalLin = i < 3 ? contactNormalOnB : dummy;
+ const btVector3& normalAng = i >= 3 ? contactNormalOnB : dummy;
+ const btVector3& normalLin = i < 3 ? contactNormalOnB : dummy;
m_bodyA->filConstraintJacobianMultiDof(m_linkA, pivotAworld, normalAng, normalLin, jac1, data.scratch_r, data.scratch_v, data.scratch_m);
fillMultiBodyConstraint(constraintRow, data, jac1, 0,
- dummy, dummy, dummy, //sucks but let it be this way "for the time being"
- posError,
- infoGlobal,
- -m_maxAppliedImpulse, m_maxAppliedImpulse
- );
+ dummy, dummy, dummy, //sucks but let it be this way "for the time being"
+ posError,
+ infoGlobal,
+ -m_maxAppliedImpulse, m_maxAppliedImpulse);
#endif
}
}
diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyPoint2Point.h b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyPoint2Point.h
index bf39acc5b9..ef03a557ec 100644
--- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyPoint2Point.h
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodyPoint2Point.h
@@ -22,22 +22,20 @@ subject to the following restrictions:
//#define BTMBP2PCONSTRAINT_BLOCK_ANGULAR_MOTION_TEST
-ATTRIBUTE_ALIGNED16(class) btMultiBodyPoint2Point : public btMultiBodyConstraint
+ATTRIBUTE_ALIGNED16(class)
+btMultiBodyPoint2Point : public btMultiBodyConstraint
{
protected:
-
- btRigidBody* m_rigidBodyA;
- btRigidBody* m_rigidBodyB;
- btVector3 m_pivotInA;
- btVector3 m_pivotInB;
-
+ 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);
+ 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();
@@ -46,9 +44,9 @@ public:
virtual int getIslandIdA() const;
virtual int getIslandIdB() const;
- virtual void createConstraintRows(btMultiBodyConstraintArray& constraintRows,
- btMultiBodyJacobianData& data,
- const btContactSolverInfo& infoGlobal);
+ virtual void createConstraintRows(btMultiBodyConstraintArray & constraintRows,
+ btMultiBodyJacobianData & data,
+ const btContactSolverInfo& infoGlobal);
const btVector3& getPivotInB() const
{
@@ -60,9 +58,7 @@ public:
m_pivotInB = pivotInB;
}
-
- virtual void debugDraw(class btIDebugDraw* drawer);
-
+ virtual void debugDraw(class btIDebugDraw * drawer);
};
-#endif //BT_MULTIBODY_POINT2POINT_H
+#endif //BT_MULTIBODY_POINT2POINT_H
diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodySliderConstraint.cpp b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodySliderConstraint.cpp
index 43f26f9833..e025302ce6 100644
--- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodySliderConstraint.cpp
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodySliderConstraint.cpp
@@ -25,29 +25,29 @@ subject to the following restrictions:
#define EPSILON 0.000001
btMultiBodySliderConstraint::btMultiBodySliderConstraint(btMultiBody* body, int link, btRigidBody* bodyB, const btVector3& pivotInA, const btVector3& pivotInB, const btMatrix3x3& frameInA, const btMatrix3x3& frameInB, const btVector3& jointAxis)
- :btMultiBodyConstraint(body,0,link,-1,BTMBSLIDERCONSTRAINT_DIM,false),
- m_rigidBodyA(0),
- m_rigidBodyB(bodyB),
- m_pivotInA(pivotInA),
- m_pivotInB(pivotInB),
- m_frameInA(frameInA),
- m_frameInB(frameInB),
- m_jointAxis(jointAxis)
+ : btMultiBodyConstraint(body, 0, link, -1, BTMBSLIDERCONSTRAINT_DIM, false),
+ m_rigidBodyA(0),
+ m_rigidBodyB(bodyB),
+ m_pivotInA(pivotInA),
+ m_pivotInB(pivotInB),
+ m_frameInA(frameInA),
+ m_frameInB(frameInB),
+ m_jointAxis(jointAxis)
{
- m_data.resize(BTMBSLIDERCONSTRAINT_DIM);//at least store the applied impulses
+ m_data.resize(BTMBSLIDERCONSTRAINT_DIM); //at least store the applied impulses
}
btMultiBodySliderConstraint::btMultiBodySliderConstraint(btMultiBody* bodyA, int linkA, btMultiBody* bodyB, int linkB, const btVector3& pivotInA, const btVector3& pivotInB, const btMatrix3x3& frameInA, const btMatrix3x3& frameInB, const btVector3& jointAxis)
- :btMultiBodyConstraint(bodyA,bodyB,linkA,linkB,BTMBSLIDERCONSTRAINT_DIM,false),
- m_rigidBodyA(0),
- m_rigidBodyB(0),
- m_pivotInA(pivotInA),
- m_pivotInB(pivotInB),
- m_frameInA(frameInA),
- m_frameInB(frameInB),
- m_jointAxis(jointAxis)
+ : btMultiBodyConstraint(bodyA, bodyB, linkA, linkB, BTMBSLIDERCONSTRAINT_DIM, false),
+ m_rigidBodyA(0),
+ m_rigidBodyB(0),
+ m_pivotInA(pivotInA),
+ m_pivotInB(pivotInB),
+ m_frameInA(frameInA),
+ m_frameInB(frameInB),
+ m_jointAxis(jointAxis)
{
- m_data.resize(BTMBSLIDERCONSTRAINT_DIM);//at least store the applied impulses
+ m_data.resize(BTMBSLIDERCONSTRAINT_DIM); //at least store the applied impulses
}
void btMultiBodySliderConstraint::finalizeMultiDof()
@@ -60,7 +60,6 @@ btMultiBodySliderConstraint::~btMultiBodySliderConstraint()
{
}
-
int btMultiBodySliderConstraint::getIslandIdA() const
{
if (m_rigidBodyA)
@@ -105,98 +104,100 @@ int btMultiBodySliderConstraint::getIslandIdB() const
}
void btMultiBodySliderConstraint::createConstraintRows(btMultiBodyConstraintArray& constraintRows, btMultiBodyJacobianData& data, const btContactSolverInfo& infoGlobal)
{
- // Convert local points back to world
- btVector3 pivotAworld = m_pivotInA;
- btMatrix3x3 frameAworld = m_frameInA;
- btVector3 jointAxis = m_jointAxis;
- if (m_rigidBodyA)
- {
- pivotAworld = m_rigidBodyA->getCenterOfMassTransform()*m_pivotInA;
- frameAworld = m_frameInA.transpose()*btMatrix3x3(m_rigidBodyA->getOrientation());
- jointAxis = quatRotate(m_rigidBodyA->getOrientation(),m_jointAxis);
-
- } else if (m_bodyA) {
- pivotAworld = m_bodyA->localPosToWorld(m_linkA, m_pivotInA);
- frameAworld = m_bodyA->localFrameToWorld(m_linkA, m_frameInA);
- jointAxis = m_bodyA->localDirToWorld(m_linkA, m_jointAxis);
- }
- btVector3 pivotBworld = m_pivotInB;
- btMatrix3x3 frameBworld = m_frameInB;
- if (m_rigidBodyB)
- {
- pivotBworld = m_rigidBodyB->getCenterOfMassTransform()*m_pivotInB;
- frameBworld = m_frameInB.transpose()*btMatrix3x3(m_rigidBodyB->getOrientation());
-
- } else if (m_bodyB) {
- pivotBworld = m_bodyB->localPosToWorld(m_linkB, m_pivotInB);
- frameBworld = m_bodyB->localFrameToWorld(m_linkB, m_frameInB);
- }
-
- btVector3 constraintAxis[2];
- for (int i = 0; i < 3; ++i)
- {
- constraintAxis[0] = frameAworld.getColumn(i).cross(jointAxis);
- if (constraintAxis[0].safeNorm() > EPSILON)
- {
- constraintAxis[0] = constraintAxis[0].normalized();
- constraintAxis[1] = jointAxis.cross(constraintAxis[0]);
- constraintAxis[1] = constraintAxis[1].normalized();
- break;
- }
- }
-
- btMatrix3x3 relRot = frameAworld.inverse()*frameBworld;
- btVector3 angleDiff;
- btGeneric6DofSpring2Constraint::matrixToEulerXYZ(relRot,angleDiff);
-
- int numDim = BTMBSLIDERCONSTRAINT_DIM;
- for (int i=0;i<numDim;i++)
+ // Convert local points back to world
+ btVector3 pivotAworld = m_pivotInA;
+ btMatrix3x3 frameAworld = m_frameInA;
+ btVector3 jointAxis = m_jointAxis;
+ if (m_rigidBodyA)
+ {
+ pivotAworld = m_rigidBodyA->getCenterOfMassTransform() * m_pivotInA;
+ frameAworld = m_frameInA.transpose() * btMatrix3x3(m_rigidBodyA->getOrientation());
+ jointAxis = quatRotate(m_rigidBodyA->getOrientation(), m_jointAxis);
+ }
+ else if (m_bodyA)
{
- btMultiBodySolverConstraint& constraintRow = constraintRows.expandNonInitializing();
- constraintRow.m_orgConstraint = this;
- constraintRow.m_orgDofIndex = i;
- constraintRow.m_relpos1CrossNormal.setValue(0,0,0);
- constraintRow.m_contactNormal1.setValue(0,0,0);
- constraintRow.m_relpos2CrossNormal.setValue(0,0,0);
- constraintRow.m_contactNormal2.setValue(0,0,0);
- constraintRow.m_angularComponentA.setValue(0,0,0);
- constraintRow.m_angularComponentB.setValue(0,0,0);
-
- constraintRow.m_solverBodyIdA = data.m_fixedBodyId;
- constraintRow.m_solverBodyIdB = data.m_fixedBodyId;
-
- if (m_rigidBodyA)
- {
- constraintRow.m_solverBodyIdA = m_rigidBodyA->getCompanionId();
- }
- if (m_rigidBodyB)
- {
- constraintRow.m_solverBodyIdB = m_rigidBodyB->getCompanionId();
- }
-
- btVector3 constraintNormalLin(0,0,0);
- btVector3 constraintNormalAng(0,0,0);
- btScalar posError = 0.0;
- if (i < 2) {
- constraintNormalLin = constraintAxis[i];
- posError = (pivotAworld-pivotBworld).dot(constraintNormalLin);
- fillMultiBodyConstraint(constraintRow, data, 0, 0, constraintNormalAng,
- constraintNormalLin, pivotAworld, pivotBworld,
- posError,
- infoGlobal,
- -m_maxAppliedImpulse, m_maxAppliedImpulse
- );
- }
- else { //i>=2
- constraintNormalAng = frameAworld.getColumn(i%3);
- posError = angleDiff[i%3];
- fillMultiBodyConstraint(constraintRow, data, 0, 0, constraintNormalAng,
- constraintNormalLin, pivotAworld, pivotBworld,
- posError,
- infoGlobal,
- -m_maxAppliedImpulse, m_maxAppliedImpulse, true
- );
- }
+ pivotAworld = m_bodyA->localPosToWorld(m_linkA, m_pivotInA);
+ frameAworld = m_bodyA->localFrameToWorld(m_linkA, m_frameInA);
+ jointAxis = m_bodyA->localDirToWorld(m_linkA, m_jointAxis);
+ }
+ btVector3 pivotBworld = m_pivotInB;
+ btMatrix3x3 frameBworld = m_frameInB;
+ if (m_rigidBodyB)
+ {
+ pivotBworld = m_rigidBodyB->getCenterOfMassTransform() * m_pivotInB;
+ frameBworld = m_frameInB.transpose() * btMatrix3x3(m_rigidBodyB->getOrientation());
+ }
+ else if (m_bodyB)
+ {
+ pivotBworld = m_bodyB->localPosToWorld(m_linkB, m_pivotInB);
+ frameBworld = m_bodyB->localFrameToWorld(m_linkB, m_frameInB);
+ }
+
+ btVector3 constraintAxis[2];
+ for (int i = 0; i < 3; ++i)
+ {
+ constraintAxis[0] = frameAworld.getColumn(i).cross(jointAxis);
+ if (constraintAxis[0].safeNorm() > EPSILON)
+ {
+ constraintAxis[0] = constraintAxis[0].normalized();
+ constraintAxis[1] = jointAxis.cross(constraintAxis[0]);
+ constraintAxis[1] = constraintAxis[1].normalized();
+ break;
+ }
+ }
+
+ btMatrix3x3 relRot = frameAworld.inverse() * frameBworld;
+ btVector3 angleDiff;
+ btGeneric6DofSpring2Constraint::matrixToEulerXYZ(relRot, angleDiff);
+
+ int numDim = BTMBSLIDERCONSTRAINT_DIM;
+ for (int i = 0; i < numDim; i++)
+ {
+ btMultiBodySolverConstraint& constraintRow = constraintRows.expandNonInitializing();
+ constraintRow.m_orgConstraint = this;
+ constraintRow.m_orgDofIndex = i;
+ constraintRow.m_relpos1CrossNormal.setValue(0, 0, 0);
+ constraintRow.m_contactNormal1.setValue(0, 0, 0);
+ constraintRow.m_relpos2CrossNormal.setValue(0, 0, 0);
+ constraintRow.m_contactNormal2.setValue(0, 0, 0);
+ constraintRow.m_angularComponentA.setValue(0, 0, 0);
+ constraintRow.m_angularComponentB.setValue(0, 0, 0);
+
+ constraintRow.m_solverBodyIdA = data.m_fixedBodyId;
+ constraintRow.m_solverBodyIdB = data.m_fixedBodyId;
+
+ if (m_rigidBodyA)
+ {
+ constraintRow.m_solverBodyIdA = m_rigidBodyA->getCompanionId();
+ }
+ if (m_rigidBodyB)
+ {
+ constraintRow.m_solverBodyIdB = m_rigidBodyB->getCompanionId();
+ }
+
+ btVector3 constraintNormalLin(0, 0, 0);
+ btVector3 constraintNormalAng(0, 0, 0);
+ btScalar posError = 0.0;
+ if (i < 2)
+ {
+ constraintNormalLin = constraintAxis[i];
+ posError = (pivotAworld - pivotBworld).dot(constraintNormalLin);
+ fillMultiBodyConstraint(constraintRow, data, 0, 0, constraintNormalAng,
+ constraintNormalLin, pivotAworld, pivotBworld,
+ posError,
+ infoGlobal,
+ -m_maxAppliedImpulse, m_maxAppliedImpulse);
+ }
+ else
+ { //i>=2
+ constraintNormalAng = frameAworld.getColumn(i % 3);
+ posError = angleDiff[i % 3];
+ fillMultiBodyConstraint(constraintRow, data, 0, 0, constraintNormalAng,
+ constraintNormalLin, pivotAworld, pivotBworld,
+ posError,
+ infoGlobal,
+ -m_maxAppliedImpulse, m_maxAppliedImpulse, true);
+ }
}
}
diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodySliderConstraint.h b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodySliderConstraint.h
index 0a6cf3df12..b192b6f8f3 100644
--- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodySliderConstraint.h
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodySliderConstraint.h
@@ -23,17 +23,15 @@ subject to the following restrictions:
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;
+ 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);
@@ -45,18 +43,18 @@ public:
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;
- }
+ btMultiBodyJacobianData& data,
+ const btContactSolverInfo& infoGlobal);
+
+ const btVector3& getPivotInA() const
+ {
+ return m_pivotInA;
+ }
+
+ void setPivotInA(const btVector3& pivotInA)
+ {
+ m_pivotInA = pivotInA;
+ }
const btVector3& getPivotInB() const
{
@@ -67,39 +65,38 @@ public:
{
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);
+ 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
+#endif //BT_MULTIBODY_SLIDER_CONSTRAINT_H
diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodySolverConstraint.h b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodySolverConstraint.h
index 6fa1550e9e..deed3e2a12 100644
--- a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodySolverConstraint.h
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodySolverConstraint.h
@@ -25,66 +25,66 @@ class btMultiBodyConstraint;
#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
+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
+ 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)
{
- void* m_originalContactPoint;
- btScalar m_unusedPadding4;
+ }
+
+ 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_overrideNumSolverIterations;
+ int m_frictionIndex;
int m_solverBodyIdA;
btMultiBody* m_multiBodyA;
- int m_linkA;
-
+ int m_linkA;
+
int m_solverBodyIdB;
btMultiBody* m_multiBodyB;
- int m_linkB;
+ int m_linkB;
//for writing back applied impulses
- btMultiBodyConstraint* m_orgConstraint;
+ btMultiBodyConstraint* m_orgConstraint;
int m_orgDofIndex;
- enum btSolverConstraintType
+ enum btSolverConstraintType
{
BT_SOLVER_CONTACT_1D = 0,
BT_SOLVER_FRICTION_1D
};
};
-typedef btAlignedObjectArray<btMultiBodySolverConstraint> btMultiBodyConstraintArray;
+typedef btAlignedObjectArray<btMultiBodySolverConstraint> btMultiBodyConstraintArray;
-#endif //BT_MULTIBODY_SOLVER_CONSTRAINT_H
+#endif //BT_MULTIBODY_SOLVER_CONSTRAINT_H
diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodySphericalJointMotor.cpp b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodySphericalJointMotor.cpp
new file mode 100644
index 0000000000..3e5aa30f28
--- /dev/null
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodySphericalJointMotor.cpp
@@ -0,0 +1,172 @@
+/*
+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
+
+#include "btMultiBodySphericalJointMotor.h"
+#include "btMultiBody.h"
+#include "btMultiBodyLinkCollider.h"
+#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
+#include "LinearMath/btTransformUtil.h"
+#include "BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.h"
+
+btMultiBodySphericalJointMotor::btMultiBodySphericalJointMotor(btMultiBody* body, int link, btScalar maxMotorImpulse)
+ : btMultiBodyConstraint(body, body, link, body->getLink(link).m_parent, 3, true),
+ m_desiredVelocity(0, 0, 0),
+ m_desiredPosition(0,0,0,1),
+ m_kd(1.),
+ m_kp(0.2),
+ m_erp(1),
+ m_rhsClamp(SIMD_INFINITY)
+{
+
+ m_maxAppliedImpulse = maxMotorImpulse;
+}
+
+
+void btMultiBodySphericalJointMotor::finalizeMultiDof()
+{
+ allocateJacobiansMultiDof();
+ // note: we rely on the fact that data.m_jacobians are
+ // always initialized to zero by the Constraint ctor
+ int linkDoF = 0;
+ unsigned int offset = 6 + (m_bodyA->getLink(m_linkA).m_dofOffset + linkDoF);
+
+ // row 0: the lower bound
+ // row 0: the lower bound
+ jacobianA(0)[offset] = 1;
+
+ m_numDofsFinalized = m_jacSizeBoth;
+}
+
+
+btMultiBodySphericalJointMotor::~btMultiBodySphericalJointMotor()
+{
+}
+
+int btMultiBodySphericalJointMotor::getIslandIdA() const
+{
+ if (this->m_linkA < 0)
+ {
+ btMultiBodyLinkCollider* col = m_bodyA->getBaseCollider();
+ if (col)
+ return col->getIslandTag();
+ }
+ else
+ {
+ if (m_bodyA->getLink(m_linkA).m_collider)
+ {
+ return m_bodyA->getLink(m_linkA).m_collider->getIslandTag();
+ }
+ }
+ return -1;
+}
+
+int btMultiBodySphericalJointMotor::getIslandIdB() const
+{
+ if (m_linkB < 0)
+ {
+ btMultiBodyLinkCollider* col = m_bodyB->getBaseCollider();
+ if (col)
+ return col->getIslandTag();
+ }
+ else
+ {
+ if (m_bodyB->getLink(m_linkB).m_collider)
+ {
+ return m_bodyB->getLink(m_linkB).m_collider->getIslandTag();
+ }
+ }
+ return -1;
+}
+
+void btMultiBodySphericalJointMotor::createConstraintRows(btMultiBodyConstraintArray& constraintRows,
+ btMultiBodyJacobianData& data,
+ const btContactSolverInfo& infoGlobal)
+{
+ // only positions need to be updated -- data.m_jacobians and force
+ // directions were set in the ctor and never change.
+
+ if (m_numDofsFinalized != m_jacSizeBoth)
+ {
+ finalizeMultiDof();
+ }
+
+ //don't crash
+ if (m_numDofsFinalized != m_jacSizeBoth)
+ return;
+
+
+ if (m_maxAppliedImpulse == 0.f)
+ return;
+
+ const btScalar posError = 0;
+ const btVector3 dummy(0, 0, 0);
+
+
+ btVector3 axis[3] = { btVector3(1, 0, 0), btVector3(0, 1, 0), btVector3(0, 0, 1) };
+
+ btQuaternion desiredQuat = m_desiredPosition;
+ btQuaternion currentQuat(m_bodyA->getJointPosMultiDof(m_linkA)[0],
+ m_bodyA->getJointPosMultiDof(m_linkA)[1],
+ m_bodyA->getJointPosMultiDof(m_linkA)[2],
+ m_bodyA->getJointPosMultiDof(m_linkA)[3]);
+
+btQuaternion relRot = currentQuat.inverse() * desiredQuat;
+ btVector3 angleDiff;
+ btGeneric6DofSpring2Constraint::matrixToEulerXYZ(btMatrix3x3(relRot), angleDiff);
+
+
+
+ for (int row = 0; row < getNumRows(); row++)
+ {
+ btMultiBodySolverConstraint& constraintRow = constraintRows.expandNonInitializing();
+
+ int dof = row;
+
+ btScalar currentVelocity = m_bodyA->getJointVelMultiDof(m_linkA)[dof];
+ btScalar desiredVelocity = this->m_desiredVelocity[row];
+
+ btScalar velocityError = desiredVelocity - currentVelocity;
+
+ btMatrix3x3 frameAworld;
+ frameAworld.setIdentity();
+ frameAworld = m_bodyA->localFrameToWorld(m_linkA, frameAworld);
+ btScalar posError = 0;
+ {
+ btAssert(m_bodyA->getLink(m_linkA).m_jointType == btMultibodyLink::eSpherical);
+ switch (m_bodyA->getLink(m_linkA).m_jointType)
+ {
+ case btMultibodyLink::eSpherical:
+ {
+ btVector3 constraintNormalAng = frameAworld.getColumn(row % 3);
+ posError = m_kp*angleDiff[row % 3];
+ fillMultiBodyConstraint(constraintRow, data, 0, 0, constraintNormalAng,
+ btVector3(0,0,0), dummy, dummy,
+ posError,
+ infoGlobal,
+ -m_maxAppliedImpulse, m_maxAppliedImpulse, true);
+ constraintRow.m_orgConstraint = this;
+ constraintRow.m_orgDofIndex = row;
+ break;
+ }
+ default:
+ {
+ btAssert(0);
+ }
+ };
+ }
+ }
+}
diff --git a/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodySphericalJointMotor.h b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodySphericalJointMotor.h
new file mode 100644
index 0000000000..621beab5a4
--- /dev/null
+++ b/thirdparty/bullet/BulletDynamics/Featherstone/btMultiBodySphericalJointMotor.h
@@ -0,0 +1,77 @@
+/*
+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/thirdparty/bullet/BulletDynamics/MLCPSolvers/btDantzigLCP.cpp b/thirdparty/bullet/BulletDynamics/MLCPSolvers/btDantzigLCP.cpp
index 986f214870..98ecdc0794 100644
--- a/thirdparty/bullet/BulletDynamics/MLCPSolvers/btDantzigLCP.cpp
+++ b/thirdparty/bullet/BulletDynamics/MLCPSolvers/btDantzigLCP.cpp
@@ -108,18 +108,16 @@ rows/columns and manipulate C.
*/
-
#include "btDantzigLCP.h"
-#include <string.h>//memcpy
+#include <string.h> //memcpy
bool s_error = false;
//***************************************************************************
// code generation parameters
-
-#define btLCP_FAST // use fast btLCP object
+#define btLCP_FAST // use fast btLCP object
// option 1 : matrix row pointers (less data copying)
#define BTROWPTRS
@@ -133,8 +131,6 @@ bool s_error = false;
#define BTNUB_OPTIMIZATIONS
-
-
/* solve L*X=B, with B containing 1 right hand sides.
* L is an n*n lower triangular matrix with ones on the diagonal.
* L is stored by rows and its leading dimension is lskip.
@@ -145,66 +141,69 @@ bool s_error = false;
* if this is in the factorizer source file, n must be a multiple of 2.
*/
-static void btSolveL1_1 (const btScalar *L, btScalar *B, int n, int lskip1)
-{
- /* declare variables - Z matrix, p and q vectors, etc */
- btScalar Z11,m11,Z21,m21,p1,q1,p2,*ex;
- const btScalar *ell;
- int i,j;
- /* compute all 2 x 1 blocks of X */
- for (i=0; i < n; i+=2) {
- /* compute all 2 x 1 block of X, from rows i..i+2-1 */
- /* set the Z matrix to 0 */
- Z11=0;
- Z21=0;
- ell = L + i*lskip1;
- ex = B;
- /* the inner loop that computes outer products and adds them to Z */
- for (j=i-2; j >= 0; j -= 2) {
- /* compute outer product and add it to the Z matrix */
- p1=ell[0];
- q1=ex[0];
- m11 = p1 * q1;
- p2=ell[lskip1];
- m21 = p2 * q1;
- Z11 += m11;
- Z21 += m21;
- /* compute outer product and add it to the Z matrix */
- p1=ell[1];
- q1=ex[1];
- m11 = p1 * q1;
- p2=ell[1+lskip1];
- m21 = p2 * q1;
- /* advance pointers */
- ell += 2;
- ex += 2;
- Z11 += m11;
- Z21 += m21;
- /* end of inner loop */
- }
- /* compute left-over iterations */
- j += 2;
- for (; j > 0; j--) {
- /* compute outer product and add it to the Z matrix */
- p1=ell[0];
- q1=ex[0];
- m11 = p1 * q1;
- p2=ell[lskip1];
- m21 = p2 * q1;
- /* advance pointers */
- ell += 1;
- ex += 1;
- Z11 += m11;
- Z21 += m21;
- }
- /* finish computing the X(i) block */
- Z11 = ex[0] - Z11;
- ex[0] = Z11;
- p1 = ell[lskip1];
- Z21 = ex[1] - Z21 - p1*Z11;
- ex[1] = Z21;
- /* end of outer loop */
- }
+static void btSolveL1_1(const btScalar *L, btScalar *B, int n, int lskip1)
+{
+ /* declare variables - Z matrix, p and q vectors, etc */
+ btScalar Z11, m11, Z21, m21, p1, q1, p2, *ex;
+ const btScalar *ell;
+ int i, j;
+ /* compute all 2 x 1 blocks of X */
+ for (i = 0; i < n; i += 2)
+ {
+ /* compute all 2 x 1 block of X, from rows i..i+2-1 */
+ /* set the Z matrix to 0 */
+ Z11 = 0;
+ Z21 = 0;
+ ell = L + i * lskip1;
+ ex = B;
+ /* the inner loop that computes outer products and adds them to Z */
+ for (j = i - 2; j >= 0; j -= 2)
+ {
+ /* compute outer product and add it to the Z matrix */
+ p1 = ell[0];
+ q1 = ex[0];
+ m11 = p1 * q1;
+ p2 = ell[lskip1];
+ m21 = p2 * q1;
+ Z11 += m11;
+ Z21 += m21;
+ /* compute outer product and add it to the Z matrix */
+ p1 = ell[1];
+ q1 = ex[1];
+ m11 = p1 * q1;
+ p2 = ell[1 + lskip1];
+ m21 = p2 * q1;
+ /* advance pointers */
+ ell += 2;
+ ex += 2;
+ Z11 += m11;
+ Z21 += m21;
+ /* end of inner loop */
+ }
+ /* compute left-over iterations */
+ j += 2;
+ for (; j > 0; j--)
+ {
+ /* compute outer product and add it to the Z matrix */
+ p1 = ell[0];
+ q1 = ex[0];
+ m11 = p1 * q1;
+ p2 = ell[lskip1];
+ m21 = p2 * q1;
+ /* advance pointers */
+ ell += 1;
+ ex += 1;
+ Z11 += m11;
+ Z21 += m21;
+ }
+ /* finish computing the X(i) block */
+ Z11 = ex[0] - Z11;
+ ex[0] = Z11;
+ p1 = ell[lskip1];
+ Z21 = ex[1] - Z21 - p1 * Z11;
+ ex[1] = Z21;
+ /* end of outer loop */
+ }
}
/* solve L*X=B, with B containing 2 right hand sides.
@@ -217,300 +216,308 @@ static void btSolveL1_1 (const btScalar *L, btScalar *B, int n, int lskip1)
* if this is in the factorizer source file, n must be a multiple of 2.
*/
-static void btSolveL1_2 (const btScalar *L, btScalar *B, int n, int lskip1)
-{
- /* declare variables - Z matrix, p and q vectors, etc */
- btScalar Z11,m11,Z12,m12,Z21,m21,Z22,m22,p1,q1,p2,q2,*ex;
- const btScalar *ell;
- int i,j;
- /* compute all 2 x 2 blocks of X */
- for (i=0; i < n; i+=2) {
- /* compute all 2 x 2 block of X, from rows i..i+2-1 */
- /* set the Z matrix to 0 */
- Z11=0;
- Z12=0;
- Z21=0;
- Z22=0;
- ell = L + i*lskip1;
- ex = B;
- /* the inner loop that computes outer products and adds them to Z */
- for (j=i-2; j >= 0; j -= 2) {
- /* compute outer product and add it to the Z matrix */
- p1=ell[0];
- q1=ex[0];
- m11 = p1 * q1;
- q2=ex[lskip1];
- m12 = p1 * q2;
- p2=ell[lskip1];
- m21 = p2 * q1;
- m22 = p2 * q2;
- Z11 += m11;
- Z12 += m12;
- Z21 += m21;
- Z22 += m22;
- /* compute outer product and add it to the Z matrix */
- p1=ell[1];
- q1=ex[1];
- m11 = p1 * q1;
- q2=ex[1+lskip1];
- m12 = p1 * q2;
- p2=ell[1+lskip1];
- m21 = p2 * q1;
- m22 = p2 * q2;
- /* advance pointers */
- ell += 2;
- ex += 2;
- Z11 += m11;
- Z12 += m12;
- Z21 += m21;
- Z22 += m22;
- /* end of inner loop */
- }
- /* compute left-over iterations */
- j += 2;
- for (; j > 0; j--) {
- /* compute outer product and add it to the Z matrix */
- p1=ell[0];
- q1=ex[0];
- m11 = p1 * q1;
- q2=ex[lskip1];
- m12 = p1 * q2;
- p2=ell[lskip1];
- m21 = p2 * q1;
- m22 = p2 * q2;
- /* advance pointers */
- ell += 1;
- ex += 1;
- Z11 += m11;
- Z12 += m12;
- Z21 += m21;
- Z22 += m22;
- }
- /* finish computing the X(i) block */
- Z11 = ex[0] - Z11;
- ex[0] = Z11;
- Z12 = ex[lskip1] - Z12;
- ex[lskip1] = Z12;
- p1 = ell[lskip1];
- Z21 = ex[1] - Z21 - p1*Z11;
- ex[1] = Z21;
- Z22 = ex[1+lskip1] - Z22 - p1*Z12;
- ex[1+lskip1] = Z22;
- /* end of outer loop */
- }
+static void btSolveL1_2(const btScalar *L, btScalar *B, int n, int lskip1)
+{
+ /* declare variables - Z matrix, p and q vectors, etc */
+ btScalar Z11, m11, Z12, m12, Z21, m21, Z22, m22, p1, q1, p2, q2, *ex;
+ const btScalar *ell;
+ int i, j;
+ /* compute all 2 x 2 blocks of X */
+ for (i = 0; i < n; i += 2)
+ {
+ /* compute all 2 x 2 block of X, from rows i..i+2-1 */
+ /* set the Z matrix to 0 */
+ Z11 = 0;
+ Z12 = 0;
+ Z21 = 0;
+ Z22 = 0;
+ ell = L + i * lskip1;
+ ex = B;
+ /* the inner loop that computes outer products and adds them to Z */
+ for (j = i - 2; j >= 0; j -= 2)
+ {
+ /* compute outer product and add it to the Z matrix */
+ p1 = ell[0];
+ q1 = ex[0];
+ m11 = p1 * q1;
+ q2 = ex[lskip1];
+ m12 = p1 * q2;
+ p2 = ell[lskip1];
+ m21 = p2 * q1;
+ m22 = p2 * q2;
+ Z11 += m11;
+ Z12 += m12;
+ Z21 += m21;
+ Z22 += m22;
+ /* compute outer product and add it to the Z matrix */
+ p1 = ell[1];
+ q1 = ex[1];
+ m11 = p1 * q1;
+ q2 = ex[1 + lskip1];
+ m12 = p1 * q2;
+ p2 = ell[1 + lskip1];
+ m21 = p2 * q1;
+ m22 = p2 * q2;
+ /* advance pointers */
+ ell += 2;
+ ex += 2;
+ Z11 += m11;
+ Z12 += m12;
+ Z21 += m21;
+ Z22 += m22;
+ /* end of inner loop */
+ }
+ /* compute left-over iterations */
+ j += 2;
+ for (; j > 0; j--)
+ {
+ /* compute outer product and add it to the Z matrix */
+ p1 = ell[0];
+ q1 = ex[0];
+ m11 = p1 * q1;
+ q2 = ex[lskip1];
+ m12 = p1 * q2;
+ p2 = ell[lskip1];
+ m21 = p2 * q1;
+ m22 = p2 * q2;
+ /* advance pointers */
+ ell += 1;
+ ex += 1;
+ Z11 += m11;
+ Z12 += m12;
+ Z21 += m21;
+ Z22 += m22;
+ }
+ /* finish computing the X(i) block */
+ Z11 = ex[0] - Z11;
+ ex[0] = Z11;
+ Z12 = ex[lskip1] - Z12;
+ ex[lskip1] = Z12;
+ p1 = ell[lskip1];
+ Z21 = ex[1] - Z21 - p1 * Z11;
+ ex[1] = Z21;
+ Z22 = ex[1 + lskip1] - Z22 - p1 * Z12;
+ ex[1 + lskip1] = Z22;
+ /* end of outer loop */
+ }
}
+void btFactorLDLT(btScalar *A, btScalar *d, int n, int nskip1)
+{
+ int i, j;
+ btScalar sum, *ell, *dee, dd, p1, p2, q1, q2, Z11, m11, Z21, m21, Z22, m22;
+ if (n < 1) return;
-void btFactorLDLT (btScalar *A, btScalar *d, int n, int nskip1)
-{
- int i,j;
- btScalar sum,*ell,*dee,dd,p1,p2,q1,q2,Z11,m11,Z21,m21,Z22,m22;
- if (n < 1) return;
-
- for (i=0; i<=n-2; i += 2) {
- /* solve L*(D*l)=a, l is scaled elements in 2 x i block at A(i,0) */
- btSolveL1_2 (A,A+i*nskip1,i,nskip1);
- /* scale the elements in a 2 x i block at A(i,0), and also */
- /* compute Z = the outer product matrix that we'll need. */
- Z11 = 0;
- Z21 = 0;
- Z22 = 0;
- ell = A+i*nskip1;
- dee = d;
- for (j=i-6; j >= 0; j -= 6) {
- p1 = ell[0];
- p2 = ell[nskip1];
- dd = dee[0];
- q1 = p1*dd;
- q2 = p2*dd;
- ell[0] = q1;
- ell[nskip1] = q2;
- m11 = p1*q1;
- m21 = p2*q1;
- m22 = p2*q2;
- Z11 += m11;
- Z21 += m21;
- Z22 += m22;
- p1 = ell[1];
- p2 = ell[1+nskip1];
- dd = dee[1];
- q1 = p1*dd;
- q2 = p2*dd;
- ell[1] = q1;
- ell[1+nskip1] = q2;
- m11 = p1*q1;
- m21 = p2*q1;
- m22 = p2*q2;
- Z11 += m11;
- Z21 += m21;
- Z22 += m22;
- p1 = ell[2];
- p2 = ell[2+nskip1];
- dd = dee[2];
- q1 = p1*dd;
- q2 = p2*dd;
- ell[2] = q1;
- ell[2+nskip1] = q2;
- m11 = p1*q1;
- m21 = p2*q1;
- m22 = p2*q2;
- Z11 += m11;
- Z21 += m21;
- Z22 += m22;
- p1 = ell[3];
- p2 = ell[3+nskip1];
- dd = dee[3];
- q1 = p1*dd;
- q2 = p2*dd;
- ell[3] = q1;
- ell[3+nskip1] = q2;
- m11 = p1*q1;
- m21 = p2*q1;
- m22 = p2*q2;
- Z11 += m11;
- Z21 += m21;
- Z22 += m22;
- p1 = ell[4];
- p2 = ell[4+nskip1];
- dd = dee[4];
- q1 = p1*dd;
- q2 = p2*dd;
- ell[4] = q1;
- ell[4+nskip1] = q2;
- m11 = p1*q1;
- m21 = p2*q1;
- m22 = p2*q2;
- Z11 += m11;
- Z21 += m21;
- Z22 += m22;
- p1 = ell[5];
- p2 = ell[5+nskip1];
- dd = dee[5];
- q1 = p1*dd;
- q2 = p2*dd;
- ell[5] = q1;
- ell[5+nskip1] = q2;
- m11 = p1*q1;
- m21 = p2*q1;
- m22 = p2*q2;
- Z11 += m11;
- Z21 += m21;
- Z22 += m22;
- ell += 6;
- dee += 6;
- }
- /* compute left-over iterations */
- j += 6;
- for (; j > 0; j--) {
- p1 = ell[0];
- p2 = ell[nskip1];
- dd = dee[0];
- q1 = p1*dd;
- q2 = p2*dd;
- ell[0] = q1;
- ell[nskip1] = q2;
- m11 = p1*q1;
- m21 = p2*q1;
- m22 = p2*q2;
- Z11 += m11;
- Z21 += m21;
- Z22 += m22;
- ell++;
- dee++;
- }
- /* solve for diagonal 2 x 2 block at A(i,i) */
- Z11 = ell[0] - Z11;
- Z21 = ell[nskip1] - Z21;
- Z22 = ell[1+nskip1] - Z22;
- dee = d + i;
- /* factorize 2 x 2 block Z,dee */
- /* factorize row 1 */
- dee[0] = btRecip(Z11);
- /* factorize row 2 */
- sum = 0;
- q1 = Z21;
- q2 = q1 * dee[0];
- Z21 = q2;
- sum += q1*q2;
- dee[1] = btRecip(Z22 - sum);
- /* done factorizing 2 x 2 block */
- ell[nskip1] = Z21;
- }
- /* compute the (less than 2) rows at the bottom */
- switch (n-i) {
- case 0:
- break;
-
- case 1:
- btSolveL1_1 (A,A+i*nskip1,i,nskip1);
- /* scale the elements in a 1 x i block at A(i,0), and also */
- /* compute Z = the outer product matrix that we'll need. */
- Z11 = 0;
- ell = A+i*nskip1;
- dee = d;
- for (j=i-6; j >= 0; j -= 6) {
- p1 = ell[0];
- dd = dee[0];
- q1 = p1*dd;
- ell[0] = q1;
- m11 = p1*q1;
- Z11 += m11;
- p1 = ell[1];
- dd = dee[1];
- q1 = p1*dd;
- ell[1] = q1;
- m11 = p1*q1;
- Z11 += m11;
- p1 = ell[2];
- dd = dee[2];
- q1 = p1*dd;
- ell[2] = q1;
- m11 = p1*q1;
- Z11 += m11;
- p1 = ell[3];
- dd = dee[3];
- q1 = p1*dd;
- ell[3] = q1;
- m11 = p1*q1;
- Z11 += m11;
- p1 = ell[4];
- dd = dee[4];
- q1 = p1*dd;
- ell[4] = q1;
- m11 = p1*q1;
- Z11 += m11;
- p1 = ell[5];
- dd = dee[5];
- q1 = p1*dd;
- ell[5] = q1;
- m11 = p1*q1;
- Z11 += m11;
- ell += 6;
- dee += 6;
- }
- /* compute left-over iterations */
- j += 6;
- for (; j > 0; j--) {
- p1 = ell[0];
- dd = dee[0];
- q1 = p1*dd;
- ell[0] = q1;
- m11 = p1*q1;
- Z11 += m11;
- ell++;
- dee++;
- }
- /* solve for diagonal 1 x 1 block at A(i,i) */
- Z11 = ell[0] - Z11;
- dee = d + i;
- /* factorize 1 x 1 block Z,dee */
- /* factorize row 1 */
- dee[0] = btRecip(Z11);
- /* done factorizing 1 x 1 block */
- break;
-
- //default: *((char*)0)=0; /* this should never happen! */
- }
+ for (i = 0; i <= n - 2; i += 2)
+ {
+ /* solve L*(D*l)=a, l is scaled elements in 2 x i block at A(i,0) */
+ btSolveL1_2(A, A + i * nskip1, i, nskip1);
+ /* scale the elements in a 2 x i block at A(i,0), and also */
+ /* compute Z = the outer product matrix that we'll need. */
+ Z11 = 0;
+ Z21 = 0;
+ Z22 = 0;
+ ell = A + i * nskip1;
+ dee = d;
+ for (j = i - 6; j >= 0; j -= 6)
+ {
+ p1 = ell[0];
+ p2 = ell[nskip1];
+ dd = dee[0];
+ q1 = p1 * dd;
+ q2 = p2 * dd;
+ ell[0] = q1;
+ ell[nskip1] = q2;
+ m11 = p1 * q1;
+ m21 = p2 * q1;
+ m22 = p2 * q2;
+ Z11 += m11;
+ Z21 += m21;
+ Z22 += m22;
+ p1 = ell[1];
+ p2 = ell[1 + nskip1];
+ dd = dee[1];
+ q1 = p1 * dd;
+ q2 = p2 * dd;
+ ell[1] = q1;
+ ell[1 + nskip1] = q2;
+ m11 = p1 * q1;
+ m21 = p2 * q1;
+ m22 = p2 * q2;
+ Z11 += m11;
+ Z21 += m21;
+ Z22 += m22;
+ p1 = ell[2];
+ p2 = ell[2 + nskip1];
+ dd = dee[2];
+ q1 = p1 * dd;
+ q2 = p2 * dd;
+ ell[2] = q1;
+ ell[2 + nskip1] = q2;
+ m11 = p1 * q1;
+ m21 = p2 * q1;
+ m22 = p2 * q2;
+ Z11 += m11;
+ Z21 += m21;
+ Z22 += m22;
+ p1 = ell[3];
+ p2 = ell[3 + nskip1];
+ dd = dee[3];
+ q1 = p1 * dd;
+ q2 = p2 * dd;
+ ell[3] = q1;
+ ell[3 + nskip1] = q2;
+ m11 = p1 * q1;
+ m21 = p2 * q1;
+ m22 = p2 * q2;
+ Z11 += m11;
+ Z21 += m21;
+ Z22 += m22;
+ p1 = ell[4];
+ p2 = ell[4 + nskip1];
+ dd = dee[4];
+ q1 = p1 * dd;
+ q2 = p2 * dd;
+ ell[4] = q1;
+ ell[4 + nskip1] = q2;
+ m11 = p1 * q1;
+ m21 = p2 * q1;
+ m22 = p2 * q2;
+ Z11 += m11;
+ Z21 += m21;
+ Z22 += m22;
+ p1 = ell[5];
+ p2 = ell[5 + nskip1];
+ dd = dee[5];
+ q1 = p1 * dd;
+ q2 = p2 * dd;
+ ell[5] = q1;
+ ell[5 + nskip1] = q2;
+ m11 = p1 * q1;
+ m21 = p2 * q1;
+ m22 = p2 * q2;
+ Z11 += m11;
+ Z21 += m21;
+ Z22 += m22;
+ ell += 6;
+ dee += 6;
+ }
+ /* compute left-over iterations */
+ j += 6;
+ for (; j > 0; j--)
+ {
+ p1 = ell[0];
+ p2 = ell[nskip1];
+ dd = dee[0];
+ q1 = p1 * dd;
+ q2 = p2 * dd;
+ ell[0] = q1;
+ ell[nskip1] = q2;
+ m11 = p1 * q1;
+ m21 = p2 * q1;
+ m22 = p2 * q2;
+ Z11 += m11;
+ Z21 += m21;
+ Z22 += m22;
+ ell++;
+ dee++;
+ }
+ /* solve for diagonal 2 x 2 block at A(i,i) */
+ Z11 = ell[0] - Z11;
+ Z21 = ell[nskip1] - Z21;
+ Z22 = ell[1 + nskip1] - Z22;
+ dee = d + i;
+ /* factorize 2 x 2 block Z,dee */
+ /* factorize row 1 */
+ dee[0] = btRecip(Z11);
+ /* factorize row 2 */
+ sum = 0;
+ q1 = Z21;
+ q2 = q1 * dee[0];
+ Z21 = q2;
+ sum += q1 * q2;
+ dee[1] = btRecip(Z22 - sum);
+ /* done factorizing 2 x 2 block */
+ ell[nskip1] = Z21;
+ }
+ /* compute the (less than 2) rows at the bottom */
+ switch (n - i)
+ {
+ case 0:
+ break;
+
+ case 1:
+ btSolveL1_1(A, A + i * nskip1, i, nskip1);
+ /* scale the elements in a 1 x i block at A(i,0), and also */
+ /* compute Z = the outer product matrix that we'll need. */
+ Z11 = 0;
+ ell = A + i * nskip1;
+ dee = d;
+ for (j = i - 6; j >= 0; j -= 6)
+ {
+ p1 = ell[0];
+ dd = dee[0];
+ q1 = p1 * dd;
+ ell[0] = q1;
+ m11 = p1 * q1;
+ Z11 += m11;
+ p1 = ell[1];
+ dd = dee[1];
+ q1 = p1 * dd;
+ ell[1] = q1;
+ m11 = p1 * q1;
+ Z11 += m11;
+ p1 = ell[2];
+ dd = dee[2];
+ q1 = p1 * dd;
+ ell[2] = q1;
+ m11 = p1 * q1;
+ Z11 += m11;
+ p1 = ell[3];
+ dd = dee[3];
+ q1 = p1 * dd;
+ ell[3] = q1;
+ m11 = p1 * q1;
+ Z11 += m11;
+ p1 = ell[4];
+ dd = dee[4];
+ q1 = p1 * dd;
+ ell[4] = q1;
+ m11 = p1 * q1;
+ Z11 += m11;
+ p1 = ell[5];
+ dd = dee[5];
+ q1 = p1 * dd;
+ ell[5] = q1;
+ m11 = p1 * q1;
+ Z11 += m11;
+ ell += 6;
+ dee += 6;
+ }
+ /* compute left-over iterations */
+ j += 6;
+ for (; j > 0; j--)
+ {
+ p1 = ell[0];
+ dd = dee[0];
+ q1 = p1 * dd;
+ ell[0] = q1;
+ m11 = p1 * q1;
+ Z11 += m11;
+ ell++;
+ dee++;
+ }
+ /* solve for diagonal 1 x 1 block at A(i,i) */
+ Z11 = ell[0] - Z11;
+ dee = d + i;
+ /* factorize 1 x 1 block Z,dee */
+ /* factorize row 1 */
+ dee[0] = btRecip(Z11);
+ /* done factorizing 1 x 1 block */
+ break;
+
+ //default: *((char*)0)=0; /* this should never happen! */
+ }
}
/* solve L*X=B, with B containing 1 right hand sides.
@@ -523,289 +530,295 @@ void btFactorLDLT (btScalar *A, btScalar *d, int n, int nskip1)
* if this is in the factorizer source file, n must be a multiple of 4.
*/
-void btSolveL1 (const btScalar *L, btScalar *B, int n, int lskip1)
-{
- /* declare variables - Z matrix, p and q vectors, etc */
- btScalar Z11,Z21,Z31,Z41,p1,q1,p2,p3,p4,*ex;
- const btScalar *ell;
- int lskip2,lskip3,i,j;
- /* compute lskip values */
- lskip2 = 2*lskip1;
- lskip3 = 3*lskip1;
- /* compute all 4 x 1 blocks of X */
- for (i=0; i <= n-4; i+=4) {
- /* compute all 4 x 1 block of X, from rows i..i+4-1 */
- /* set the Z matrix to 0 */
- Z11=0;
- Z21=0;
- Z31=0;
- Z41=0;
- ell = L + i*lskip1;
- ex = B;
- /* the inner loop that computes outer products and adds them to Z */
- for (j=i-12; j >= 0; j -= 12) {
- /* load p and q values */
- p1=ell[0];
- q1=ex[0];
- p2=ell[lskip1];
- p3=ell[lskip2];
- p4=ell[lskip3];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- Z21 += p2 * q1;
- Z31 += p3 * q1;
- Z41 += p4 * q1;
- /* load p and q values */
- p1=ell[1];
- q1=ex[1];
- p2=ell[1+lskip1];
- p3=ell[1+lskip2];
- p4=ell[1+lskip3];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- Z21 += p2 * q1;
- Z31 += p3 * q1;
- Z41 += p4 * q1;
- /* load p and q values */
- p1=ell[2];
- q1=ex[2];
- p2=ell[2+lskip1];
- p3=ell[2+lskip2];
- p4=ell[2+lskip3];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- Z21 += p2 * q1;
- Z31 += p3 * q1;
- Z41 += p4 * q1;
- /* load p and q values */
- p1=ell[3];
- q1=ex[3];
- p2=ell[3+lskip1];
- p3=ell[3+lskip2];
- p4=ell[3+lskip3];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- Z21 += p2 * q1;
- Z31 += p3 * q1;
- Z41 += p4 * q1;
- /* load p and q values */
- p1=ell[4];
- q1=ex[4];
- p2=ell[4+lskip1];
- p3=ell[4+lskip2];
- p4=ell[4+lskip3];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- Z21 += p2 * q1;
- Z31 += p3 * q1;
- Z41 += p4 * q1;
- /* load p and q values */
- p1=ell[5];
- q1=ex[5];
- p2=ell[5+lskip1];
- p3=ell[5+lskip2];
- p4=ell[5+lskip3];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- Z21 += p2 * q1;
- Z31 += p3 * q1;
- Z41 += p4 * q1;
- /* load p and q values */
- p1=ell[6];
- q1=ex[6];
- p2=ell[6+lskip1];
- p3=ell[6+lskip2];
- p4=ell[6+lskip3];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- Z21 += p2 * q1;
- Z31 += p3 * q1;
- Z41 += p4 * q1;
- /* load p and q values */
- p1=ell[7];
- q1=ex[7];
- p2=ell[7+lskip1];
- p3=ell[7+lskip2];
- p4=ell[7+lskip3];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- Z21 += p2 * q1;
- Z31 += p3 * q1;
- Z41 += p4 * q1;
- /* load p and q values */
- p1=ell[8];
- q1=ex[8];
- p2=ell[8+lskip1];
- p3=ell[8+lskip2];
- p4=ell[8+lskip3];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- Z21 += p2 * q1;
- Z31 += p3 * q1;
- Z41 += p4 * q1;
- /* load p and q values */
- p1=ell[9];
- q1=ex[9];
- p2=ell[9+lskip1];
- p3=ell[9+lskip2];
- p4=ell[9+lskip3];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- Z21 += p2 * q1;
- Z31 += p3 * q1;
- Z41 += p4 * q1;
- /* load p and q values */
- p1=ell[10];
- q1=ex[10];
- p2=ell[10+lskip1];
- p3=ell[10+lskip2];
- p4=ell[10+lskip3];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- Z21 += p2 * q1;
- Z31 += p3 * q1;
- Z41 += p4 * q1;
- /* load p and q values */
- p1=ell[11];
- q1=ex[11];
- p2=ell[11+lskip1];
- p3=ell[11+lskip2];
- p4=ell[11+lskip3];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- Z21 += p2 * q1;
- Z31 += p3 * q1;
- Z41 += p4 * q1;
- /* advance pointers */
- ell += 12;
- ex += 12;
- /* end of inner loop */
- }
- /* compute left-over iterations */
- j += 12;
- for (; j > 0; j--) {
- /* load p and q values */
- p1=ell[0];
- q1=ex[0];
- p2=ell[lskip1];
- p3=ell[lskip2];
- p4=ell[lskip3];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- Z21 += p2 * q1;
- Z31 += p3 * q1;
- Z41 += p4 * q1;
- /* advance pointers */
- ell += 1;
- ex += 1;
- }
- /* finish computing the X(i) block */
- Z11 = ex[0] - Z11;
- ex[0] = Z11;
- p1 = ell[lskip1];
- Z21 = ex[1] - Z21 - p1*Z11;
- ex[1] = Z21;
- p1 = ell[lskip2];
- p2 = ell[1+lskip2];
- Z31 = ex[2] - Z31 - p1*Z11 - p2*Z21;
- ex[2] = Z31;
- p1 = ell[lskip3];
- p2 = ell[1+lskip3];
- p3 = ell[2+lskip3];
- Z41 = ex[3] - Z41 - p1*Z11 - p2*Z21 - p3*Z31;
- ex[3] = Z41;
- /* end of outer loop */
- }
- /* compute rows at end that are not a multiple of block size */
- for (; i < n; i++) {
- /* compute all 1 x 1 block of X, from rows i..i+1-1 */
- /* set the Z matrix to 0 */
- Z11=0;
- ell = L + i*lskip1;
- ex = B;
- /* the inner loop that computes outer products and adds them to Z */
- for (j=i-12; j >= 0; j -= 12) {
- /* load p and q values */
- p1=ell[0];
- q1=ex[0];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- /* load p and q values */
- p1=ell[1];
- q1=ex[1];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- /* load p and q values */
- p1=ell[2];
- q1=ex[2];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- /* load p and q values */
- p1=ell[3];
- q1=ex[3];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- /* load p and q values */
- p1=ell[4];
- q1=ex[4];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- /* load p and q values */
- p1=ell[5];
- q1=ex[5];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- /* load p and q values */
- p1=ell[6];
- q1=ex[6];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- /* load p and q values */
- p1=ell[7];
- q1=ex[7];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- /* load p and q values */
- p1=ell[8];
- q1=ex[8];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- /* load p and q values */
- p1=ell[9];
- q1=ex[9];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- /* load p and q values */
- p1=ell[10];
- q1=ex[10];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- /* load p and q values */
- p1=ell[11];
- q1=ex[11];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- /* advance pointers */
- ell += 12;
- ex += 12;
- /* end of inner loop */
- }
- /* compute left-over iterations */
- j += 12;
- for (; j > 0; j--) {
- /* load p and q values */
- p1=ell[0];
- q1=ex[0];
- /* compute outer product and add it to the Z matrix */
- Z11 += p1 * q1;
- /* advance pointers */
- ell += 1;
- ex += 1;
- }
- /* finish computing the X(i) block */
- Z11 = ex[0] - Z11;
- ex[0] = Z11;
- }
+void btSolveL1(const btScalar *L, btScalar *B, int n, int lskip1)
+{
+ /* declare variables - Z matrix, p and q vectors, etc */
+ btScalar Z11, Z21, Z31, Z41, p1, q1, p2, p3, p4, *ex;
+ const btScalar *ell;
+ int lskip2, lskip3, i, j;
+ /* compute lskip values */
+ lskip2 = 2 * lskip1;
+ lskip3 = 3 * lskip1;
+ /* compute all 4 x 1 blocks of X */
+ for (i = 0; i <= n - 4; i += 4)
+ {
+ /* compute all 4 x 1 block of X, from rows i..i+4-1 */
+ /* set the Z matrix to 0 */
+ Z11 = 0;
+ Z21 = 0;
+ Z31 = 0;
+ Z41 = 0;
+ ell = L + i * lskip1;
+ ex = B;
+ /* the inner loop that computes outer products and adds them to Z */
+ for (j = i - 12; j >= 0; j -= 12)
+ {
+ /* load p and q values */
+ p1 = ell[0];
+ q1 = ex[0];
+ p2 = ell[lskip1];
+ p3 = ell[lskip2];
+ p4 = ell[lskip3];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ Z21 += p2 * q1;
+ Z31 += p3 * q1;
+ Z41 += p4 * q1;
+ /* load p and q values */
+ p1 = ell[1];
+ q1 = ex[1];
+ p2 = ell[1 + lskip1];
+ p3 = ell[1 + lskip2];
+ p4 = ell[1 + lskip3];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ Z21 += p2 * q1;
+ Z31 += p3 * q1;
+ Z41 += p4 * q1;
+ /* load p and q values */
+ p1 = ell[2];
+ q1 = ex[2];
+ p2 = ell[2 + lskip1];
+ p3 = ell[2 + lskip2];
+ p4 = ell[2 + lskip3];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ Z21 += p2 * q1;
+ Z31 += p3 * q1;
+ Z41 += p4 * q1;
+ /* load p and q values */
+ p1 = ell[3];
+ q1 = ex[3];
+ p2 = ell[3 + lskip1];
+ p3 = ell[3 + lskip2];
+ p4 = ell[3 + lskip3];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ Z21 += p2 * q1;
+ Z31 += p3 * q1;
+ Z41 += p4 * q1;
+ /* load p and q values */
+ p1 = ell[4];
+ q1 = ex[4];
+ p2 = ell[4 + lskip1];
+ p3 = ell[4 + lskip2];
+ p4 = ell[4 + lskip3];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ Z21 += p2 * q1;
+ Z31 += p3 * q1;
+ Z41 += p4 * q1;
+ /* load p and q values */
+ p1 = ell[5];
+ q1 = ex[5];
+ p2 = ell[5 + lskip1];
+ p3 = ell[5 + lskip2];
+ p4 = ell[5 + lskip3];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ Z21 += p2 * q1;
+ Z31 += p3 * q1;
+ Z41 += p4 * q1;
+ /* load p and q values */
+ p1 = ell[6];
+ q1 = ex[6];
+ p2 = ell[6 + lskip1];
+ p3 = ell[6 + lskip2];
+ p4 = ell[6 + lskip3];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ Z21 += p2 * q1;
+ Z31 += p3 * q1;
+ Z41 += p4 * q1;
+ /* load p and q values */
+ p1 = ell[7];
+ q1 = ex[7];
+ p2 = ell[7 + lskip1];
+ p3 = ell[7 + lskip2];
+ p4 = ell[7 + lskip3];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ Z21 += p2 * q1;
+ Z31 += p3 * q1;
+ Z41 += p4 * q1;
+ /* load p and q values */
+ p1 = ell[8];
+ q1 = ex[8];
+ p2 = ell[8 + lskip1];
+ p3 = ell[8 + lskip2];
+ p4 = ell[8 + lskip3];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ Z21 += p2 * q1;
+ Z31 += p3 * q1;
+ Z41 += p4 * q1;
+ /* load p and q values */
+ p1 = ell[9];
+ q1 = ex[9];
+ p2 = ell[9 + lskip1];
+ p3 = ell[9 + lskip2];
+ p4 = ell[9 + lskip3];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ Z21 += p2 * q1;
+ Z31 += p3 * q1;
+ Z41 += p4 * q1;
+ /* load p and q values */
+ p1 = ell[10];
+ q1 = ex[10];
+ p2 = ell[10 + lskip1];
+ p3 = ell[10 + lskip2];
+ p4 = ell[10 + lskip3];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ Z21 += p2 * q1;
+ Z31 += p3 * q1;
+ Z41 += p4 * q1;
+ /* load p and q values */
+ p1 = ell[11];
+ q1 = ex[11];
+ p2 = ell[11 + lskip1];
+ p3 = ell[11 + lskip2];
+ p4 = ell[11 + lskip3];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ Z21 += p2 * q1;
+ Z31 += p3 * q1;
+ Z41 += p4 * q1;
+ /* advance pointers */
+ ell += 12;
+ ex += 12;
+ /* end of inner loop */
+ }
+ /* compute left-over iterations */
+ j += 12;
+ for (; j > 0; j--)
+ {
+ /* load p and q values */
+ p1 = ell[0];
+ q1 = ex[0];
+ p2 = ell[lskip1];
+ p3 = ell[lskip2];
+ p4 = ell[lskip3];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ Z21 += p2 * q1;
+ Z31 += p3 * q1;
+ Z41 += p4 * q1;
+ /* advance pointers */
+ ell += 1;
+ ex += 1;
+ }
+ /* finish computing the X(i) block */
+ Z11 = ex[0] - Z11;
+ ex[0] = Z11;
+ p1 = ell[lskip1];
+ Z21 = ex[1] - Z21 - p1 * Z11;
+ ex[1] = Z21;
+ p1 = ell[lskip2];
+ p2 = ell[1 + lskip2];
+ Z31 = ex[2] - Z31 - p1 * Z11 - p2 * Z21;
+ ex[2] = Z31;
+ p1 = ell[lskip3];
+ p2 = ell[1 + lskip3];
+ p3 = ell[2 + lskip3];
+ Z41 = ex[3] - Z41 - p1 * Z11 - p2 * Z21 - p3 * Z31;
+ ex[3] = Z41;
+ /* end of outer loop */
+ }
+ /* compute rows at end that are not a multiple of block size */
+ for (; i < n; i++)
+ {
+ /* compute all 1 x 1 block of X, from rows i..i+1-1 */
+ /* set the Z matrix to 0 */
+ Z11 = 0;
+ ell = L + i * lskip1;
+ ex = B;
+ /* the inner loop that computes outer products and adds them to Z */
+ for (j = i - 12; j >= 0; j -= 12)
+ {
+ /* load p and q values */
+ p1 = ell[0];
+ q1 = ex[0];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ /* load p and q values */
+ p1 = ell[1];
+ q1 = ex[1];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ /* load p and q values */
+ p1 = ell[2];
+ q1 = ex[2];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ /* load p and q values */
+ p1 = ell[3];
+ q1 = ex[3];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ /* load p and q values */
+ p1 = ell[4];
+ q1 = ex[4];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ /* load p and q values */
+ p1 = ell[5];
+ q1 = ex[5];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ /* load p and q values */
+ p1 = ell[6];
+ q1 = ex[6];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ /* load p and q values */
+ p1 = ell[7];
+ q1 = ex[7];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ /* load p and q values */
+ p1 = ell[8];
+ q1 = ex[8];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ /* load p and q values */
+ p1 = ell[9];
+ q1 = ex[9];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ /* load p and q values */
+ p1 = ell[10];
+ q1 = ex[10];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ /* load p and q values */
+ p1 = ell[11];
+ q1 = ex[11];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ /* advance pointers */
+ ell += 12;
+ ex += 12;
+ /* end of inner loop */
+ }
+ /* compute left-over iterations */
+ j += 12;
+ for (; j > 0; j--)
+ {
+ /* load p and q values */
+ p1 = ell[0];
+ q1 = ex[0];
+ /* compute outer product and add it to the Z matrix */
+ Z11 += p1 * q1;
+ /* advance pointers */
+ ell += 1;
+ ex += 1;
+ }
+ /* finish computing the X(i) block */
+ Z11 = ex[0] - Z11;
+ ex[0] = Z11;
+ }
}
/* solve L^T * x=b, with b containing 1 right hand side.
@@ -816,215 +829,218 @@ void btSolveL1 (const btScalar *L, btScalar *B, int n, int lskip1)
* this processes blocks of 4.
*/
-void btSolveL1T (const btScalar *L, btScalar *B, int n, int lskip1)
-{
- /* declare variables - Z matrix, p and q vectors, etc */
- btScalar Z11,m11,Z21,m21,Z31,m31,Z41,m41,p1,q1,p2,p3,p4,*ex;
- const btScalar *ell;
- int lskip2,i,j;
-// int lskip3;
- /* special handling for L and B because we're solving L1 *transpose* */
- L = L + (n-1)*(lskip1+1);
- B = B + n-1;
- lskip1 = -lskip1;
- /* compute lskip values */
- lskip2 = 2*lskip1;
- //lskip3 = 3*lskip1;
- /* compute all 4 x 1 blocks of X */
- for (i=0; i <= n-4; i+=4) {
- /* compute all 4 x 1 block of X, from rows i..i+4-1 */
- /* set the Z matrix to 0 */
- Z11=0;
- Z21=0;
- Z31=0;
- Z41=0;
- ell = L - i;
- ex = B;
- /* the inner loop that computes outer products and adds them to Z */
- for (j=i-4; j >= 0; j -= 4) {
- /* load p and q values */
- p1=ell[0];
- q1=ex[0];
- p2=ell[-1];
- p3=ell[-2];
- p4=ell[-3];
- /* compute outer product and add it to the Z matrix */
- m11 = p1 * q1;
- m21 = p2 * q1;
- m31 = p3 * q1;
- m41 = p4 * q1;
- ell += lskip1;
- Z11 += m11;
- Z21 += m21;
- Z31 += m31;
- Z41 += m41;
- /* load p and q values */
- p1=ell[0];
- q1=ex[-1];
- p2=ell[-1];
- p3=ell[-2];
- p4=ell[-3];
- /* compute outer product and add it to the Z matrix */
- m11 = p1 * q1;
- m21 = p2 * q1;
- m31 = p3 * q1;
- m41 = p4 * q1;
- ell += lskip1;
- Z11 += m11;
- Z21 += m21;
- Z31 += m31;
- Z41 += m41;
- /* load p and q values */
- p1=ell[0];
- q1=ex[-2];
- p2=ell[-1];
- p3=ell[-2];
- p4=ell[-3];
- /* compute outer product and add it to the Z matrix */
- m11 = p1 * q1;
- m21 = p2 * q1;
- m31 = p3 * q1;
- m41 = p4 * q1;
- ell += lskip1;
- Z11 += m11;
- Z21 += m21;
- Z31 += m31;
- Z41 += m41;
- /* load p and q values */
- p1=ell[0];
- q1=ex[-3];
- p2=ell[-1];
- p3=ell[-2];
- p4=ell[-3];
- /* compute outer product and add it to the Z matrix */
- m11 = p1 * q1;
- m21 = p2 * q1;
- m31 = p3 * q1;
- m41 = p4 * q1;
- ell += lskip1;
- ex -= 4;
- Z11 += m11;
- Z21 += m21;
- Z31 += m31;
- Z41 += m41;
- /* end of inner loop */
- }
- /* compute left-over iterations */
- j += 4;
- for (; j > 0; j--) {
- /* load p and q values */
- p1=ell[0];
- q1=ex[0];
- p2=ell[-1];
- p3=ell[-2];
- p4=ell[-3];
- /* compute outer product and add it to the Z matrix */
- m11 = p1 * q1;
- m21 = p2 * q1;
- m31 = p3 * q1;
- m41 = p4 * q1;
- ell += lskip1;
- ex -= 1;
- Z11 += m11;
- Z21 += m21;
- Z31 += m31;
- Z41 += m41;
- }
- /* finish computing the X(i) block */
- Z11 = ex[0] - Z11;
- ex[0] = Z11;
- p1 = ell[-1];
- Z21 = ex[-1] - Z21 - p1*Z11;
- ex[-1] = Z21;
- p1 = ell[-2];
- p2 = ell[-2+lskip1];
- Z31 = ex[-2] - Z31 - p1*Z11 - p2*Z21;
- ex[-2] = Z31;
- p1 = ell[-3];
- p2 = ell[-3+lskip1];
- p3 = ell[-3+lskip2];
- Z41 = ex[-3] - Z41 - p1*Z11 - p2*Z21 - p3*Z31;
- ex[-3] = Z41;
- /* end of outer loop */
- }
- /* compute rows at end that are not a multiple of block size */
- for (; i < n; i++) {
- /* compute all 1 x 1 block of X, from rows i..i+1-1 */
- /* set the Z matrix to 0 */
- Z11=0;
- ell = L - i;
- ex = B;
- /* the inner loop that computes outer products and adds them to Z */
- for (j=i-4; j >= 0; j -= 4) {
- /* load p and q values */
- p1=ell[0];
- q1=ex[0];
- /* compute outer product and add it to the Z matrix */
- m11 = p1 * q1;
- ell += lskip1;
- Z11 += m11;
- /* load p and q values */
- p1=ell[0];
- q1=ex[-1];
- /* compute outer product and add it to the Z matrix */
- m11 = p1 * q1;
- ell += lskip1;
- Z11 += m11;
- /* load p and q values */
- p1=ell[0];
- q1=ex[-2];
- /* compute outer product and add it to the Z matrix */
- m11 = p1 * q1;
- ell += lskip1;
- Z11 += m11;
- /* load p and q values */
- p1=ell[0];
- q1=ex[-3];
- /* compute outer product and add it to the Z matrix */
- m11 = p1 * q1;
- ell += lskip1;
- ex -= 4;
- Z11 += m11;
- /* end of inner loop */
- }
- /* compute left-over iterations */
- j += 4;
- for (; j > 0; j--) {
- /* load p and q values */
- p1=ell[0];
- q1=ex[0];
- /* compute outer product and add it to the Z matrix */
- m11 = p1 * q1;
- ell += lskip1;
- ex -= 1;
- Z11 += m11;
- }
- /* finish computing the X(i) block */
- Z11 = ex[0] - Z11;
- ex[0] = Z11;
- }
+void btSolveL1T(const btScalar *L, btScalar *B, int n, int lskip1)
+{
+ /* declare variables - Z matrix, p and q vectors, etc */
+ btScalar Z11, m11, Z21, m21, Z31, m31, Z41, m41, p1, q1, p2, p3, p4, *ex;
+ const btScalar *ell;
+ int lskip2, i, j;
+ // int lskip3;
+ /* special handling for L and B because we're solving L1 *transpose* */
+ L = L + (n - 1) * (lskip1 + 1);
+ B = B + n - 1;
+ lskip1 = -lskip1;
+ /* compute lskip values */
+ lskip2 = 2 * lskip1;
+ //lskip3 = 3*lskip1;
+ /* compute all 4 x 1 blocks of X */
+ for (i = 0; i <= n - 4; i += 4)
+ {
+ /* compute all 4 x 1 block of X, from rows i..i+4-1 */
+ /* set the Z matrix to 0 */
+ Z11 = 0;
+ Z21 = 0;
+ Z31 = 0;
+ Z41 = 0;
+ ell = L - i;
+ ex = B;
+ /* the inner loop that computes outer products and adds them to Z */
+ for (j = i - 4; j >= 0; j -= 4)
+ {
+ /* load p and q values */
+ p1 = ell[0];
+ q1 = ex[0];
+ p2 = ell[-1];
+ p3 = ell[-2];
+ p4 = ell[-3];
+ /* compute outer product and add it to the Z matrix */
+ m11 = p1 * q1;
+ m21 = p2 * q1;
+ m31 = p3 * q1;
+ m41 = p4 * q1;
+ ell += lskip1;
+ Z11 += m11;
+ Z21 += m21;
+ Z31 += m31;
+ Z41 += m41;
+ /* load p and q values */
+ p1 = ell[0];
+ q1 = ex[-1];
+ p2 = ell[-1];
+ p3 = ell[-2];
+ p4 = ell[-3];
+ /* compute outer product and add it to the Z matrix */
+ m11 = p1 * q1;
+ m21 = p2 * q1;
+ m31 = p3 * q1;
+ m41 = p4 * q1;
+ ell += lskip1;
+ Z11 += m11;
+ Z21 += m21;
+ Z31 += m31;
+ Z41 += m41;
+ /* load p and q values */
+ p1 = ell[0];
+ q1 = ex[-2];
+ p2 = ell[-1];
+ p3 = ell[-2];
+ p4 = ell[-3];
+ /* compute outer product and add it to the Z matrix */
+ m11 = p1 * q1;
+ m21 = p2 * q1;
+ m31 = p3 * q1;
+ m41 = p4 * q1;
+ ell += lskip1;
+ Z11 += m11;
+ Z21 += m21;
+ Z31 += m31;
+ Z41 += m41;
+ /* load p and q values */
+ p1 = ell[0];
+ q1 = ex[-3];
+ p2 = ell[-1];
+ p3 = ell[-2];
+ p4 = ell[-3];
+ /* compute outer product and add it to the Z matrix */
+ m11 = p1 * q1;
+ m21 = p2 * q1;
+ m31 = p3 * q1;
+ m41 = p4 * q1;
+ ell += lskip1;
+ ex -= 4;
+ Z11 += m11;
+ Z21 += m21;
+ Z31 += m31;
+ Z41 += m41;
+ /* end of inner loop */
+ }
+ /* compute left-over iterations */
+ j += 4;
+ for (; j > 0; j--)
+ {
+ /* load p and q values */
+ p1 = ell[0];
+ q1 = ex[0];
+ p2 = ell[-1];
+ p3 = ell[-2];
+ p4 = ell[-3];
+ /* compute outer product and add it to the Z matrix */
+ m11 = p1 * q1;
+ m21 = p2 * q1;
+ m31 = p3 * q1;
+ m41 = p4 * q1;
+ ell += lskip1;
+ ex -= 1;
+ Z11 += m11;
+ Z21 += m21;
+ Z31 += m31;
+ Z41 += m41;
+ }
+ /* finish computing the X(i) block */
+ Z11 = ex[0] - Z11;
+ ex[0] = Z11;
+ p1 = ell[-1];
+ Z21 = ex[-1] - Z21 - p1 * Z11;
+ ex[-1] = Z21;
+ p1 = ell[-2];
+ p2 = ell[-2 + lskip1];
+ Z31 = ex[-2] - Z31 - p1 * Z11 - p2 * Z21;
+ ex[-2] = Z31;
+ p1 = ell[-3];
+ p2 = ell[-3 + lskip1];
+ p3 = ell[-3 + lskip2];
+ Z41 = ex[-3] - Z41 - p1 * Z11 - p2 * Z21 - p3 * Z31;
+ ex[-3] = Z41;
+ /* end of outer loop */
+ }
+ /* compute rows at end that are not a multiple of block size */
+ for (; i < n; i++)
+ {
+ /* compute all 1 x 1 block of X, from rows i..i+1-1 */
+ /* set the Z matrix to 0 */
+ Z11 = 0;
+ ell = L - i;
+ ex = B;
+ /* the inner loop that computes outer products and adds them to Z */
+ for (j = i - 4; j >= 0; j -= 4)
+ {
+ /* load p and q values */
+ p1 = ell[0];
+ q1 = ex[0];
+ /* compute outer product and add it to the Z matrix */
+ m11 = p1 * q1;
+ ell += lskip1;
+ Z11 += m11;
+ /* load p and q values */
+ p1 = ell[0];
+ q1 = ex[-1];
+ /* compute outer product and add it to the Z matrix */
+ m11 = p1 * q1;
+ ell += lskip1;
+ Z11 += m11;
+ /* load p and q values */
+ p1 = ell[0];
+ q1 = ex[-2];
+ /* compute outer product and add it to the Z matrix */
+ m11 = p1 * q1;
+ ell += lskip1;
+ Z11 += m11;
+ /* load p and q values */
+ p1 = ell[0];
+ q1 = ex[-3];
+ /* compute outer product and add it to the Z matrix */
+ m11 = p1 * q1;
+ ell += lskip1;
+ ex -= 4;
+ Z11 += m11;
+ /* end of inner loop */
+ }
+ /* compute left-over iterations */
+ j += 4;
+ for (; j > 0; j--)
+ {
+ /* load p and q values */
+ p1 = ell[0];
+ q1 = ex[0];
+ /* compute outer product and add it to the Z matrix */
+ m11 = p1 * q1;
+ ell += lskip1;
+ ex -= 1;
+ Z11 += m11;
+ }
+ /* finish computing the X(i) block */
+ Z11 = ex[0] - Z11;
+ ex[0] = Z11;
+ }
}
-
-
-void btVectorScale (btScalar *a, const btScalar *d, int n)
+void btVectorScale(btScalar *a, const btScalar *d, int n)
{
- btAssert (a && d && n >= 0);
- for (int i=0; i<n; i++) {
- a[i] *= d[i];
- }
+ btAssert(a && d && n >= 0);
+ for (int i = 0; i < n; i++)
+ {
+ a[i] *= d[i];
+ }
}
-void btSolveLDLT (const btScalar *L, const btScalar *d, btScalar *b, int n, int nskip)
+void btSolveLDLT(const btScalar *L, const btScalar *d, btScalar *b, int n, int nskip)
{
- btAssert (L && d && b && n > 0 && nskip >= n);
- btSolveL1 (L,b,n,nskip);
- btVectorScale (b,d,n);
- btSolveL1T (L,b,n,nskip);
+ btAssert(L && d && b && n > 0 && nskip >= n);
+ btSolveL1(L, b, n, nskip);
+ btVectorScale(b, d, n);
+ btSolveL1T(L, b, n, nskip);
}
-
-
//***************************************************************************
// swap row/column i1 with i2 in the n*n matrix A. the leading dimension of
@@ -1033,124 +1049,129 @@ void btSolveLDLT (const btScalar *L, const btScalar *d, btScalar *b, int n, int
// rows will be swapped by exchanging row pointers. otherwise the data will
// be copied.
-static void btSwapRowsAndCols (BTATYPE A, int n, int i1, int i2, int nskip,
- int do_fast_row_swaps)
+static void btSwapRowsAndCols(BTATYPE A, int n, int i1, int i2, int nskip,
+ int do_fast_row_swaps)
{
- btAssert (A && n > 0 && i1 >= 0 && i2 >= 0 && i1 < n && i2 < n &&
- nskip >= n && i1 < i2);
-
-# ifdef BTROWPTRS
- btScalar *A_i1 = A[i1];
- btScalar *A_i2 = A[i2];
- for (int i=i1+1; i<i2; ++i) {
- btScalar *A_i_i1 = A[i] + i1;
- A_i1[i] = *A_i_i1;
- *A_i_i1 = A_i2[i];
- }
- A_i1[i2] = A_i1[i1];
- A_i1[i1] = A_i2[i1];
- A_i2[i1] = A_i2[i2];
- // swap rows, by swapping row pointers
- if (do_fast_row_swaps) {
- A[i1] = A_i2;
- A[i2] = A_i1;
- }
- else {
- // Only swap till i2 column to match A plain storage variant.
- for (int k = 0; k <= i2; ++k) {
- btScalar tmp = A_i1[k];
- A_i1[k] = A_i2[k];
- A_i2[k] = tmp;
- }
- }
- // swap columns the hard way
- for (int j=i2+1; j<n; ++j) {
- btScalar *A_j = A[j];
- btScalar tmp = A_j[i1];
- A_j[i1] = A_j[i2];
- A_j[i2] = tmp;
- }
-# else
- btScalar *A_i1 = A+i1*nskip;
- btScalar *A_i2 = A+i2*nskip;
- for (int k = 0; k < i1; ++k) {
- btScalar tmp = A_i1[k];
- A_i1[k] = A_i2[k];
- A_i2[k] = tmp;
- }
- btScalar *A_i = A_i1 + nskip;
- for (int i=i1+1; i<i2; A_i+=nskip, ++i) {
- btScalar tmp = A_i2[i];
- A_i2[i] = A_i[i1];
- A_i[i1] = tmp;
- }
- {
- btScalar tmp = A_i1[i1];
- A_i1[i1] = A_i2[i2];
- A_i2[i2] = tmp;
- }
- btScalar *A_j = A_i2 + nskip;
- for (int j=i2+1; j<n; A_j+=nskip, ++j) {
- btScalar tmp = A_j[i1];
- A_j[i1] = A_j[i2];
- A_j[i2] = tmp;
- }
-# endif
-}
+ btAssert(A && n > 0 && i1 >= 0 && i2 >= 0 && i1 < n && i2 < n &&
+ nskip >= n && i1 < i2);
+#ifdef BTROWPTRS
+ btScalar *A_i1 = A[i1];
+ btScalar *A_i2 = A[i2];
+ for (int i = i1 + 1; i < i2; ++i)
+ {
+ btScalar *A_i_i1 = A[i] + i1;
+ A_i1[i] = *A_i_i1;
+ *A_i_i1 = A_i2[i];
+ }
+ A_i1[i2] = A_i1[i1];
+ A_i1[i1] = A_i2[i1];
+ A_i2[i1] = A_i2[i2];
+ // swap rows, by swapping row pointers
+ if (do_fast_row_swaps)
+ {
+ A[i1] = A_i2;
+ A[i2] = A_i1;
+ }
+ else
+ {
+ // Only swap till i2 column to match A plain storage variant.
+ for (int k = 0; k <= i2; ++k)
+ {
+ btScalar tmp = A_i1[k];
+ A_i1[k] = A_i2[k];
+ A_i2[k] = tmp;
+ }
+ }
+ // swap columns the hard way
+ for (int j = i2 + 1; j < n; ++j)
+ {
+ btScalar *A_j = A[j];
+ btScalar tmp = A_j[i1];
+ A_j[i1] = A_j[i2];
+ A_j[i2] = tmp;
+ }
+#else
+ btScalar *A_i1 = A + i1 * nskip;
+ btScalar *A_i2 = A + i2 * nskip;
+ for (int k = 0; k < i1; ++k)
+ {
+ btScalar tmp = A_i1[k];
+ A_i1[k] = A_i2[k];
+ A_i2[k] = tmp;
+ }
+ btScalar *A_i = A_i1 + nskip;
+ for (int i = i1 + 1; i < i2; A_i += nskip, ++i)
+ {
+ btScalar tmp = A_i2[i];
+ A_i2[i] = A_i[i1];
+ A_i[i1] = tmp;
+ }
+ {
+ btScalar tmp = A_i1[i1];
+ A_i1[i1] = A_i2[i2];
+ A_i2[i2] = tmp;
+ }
+ btScalar *A_j = A_i2 + nskip;
+ for (int j = i2 + 1; j < n; A_j += nskip, ++j)
+ {
+ btScalar tmp = A_j[i1];
+ A_j[i1] = A_j[i2];
+ A_j[i2] = tmp;
+ }
+#endif
+}
// swap two indexes in the n*n LCP problem. i1 must be <= i2.
-static void btSwapProblem (BTATYPE A, btScalar *x, btScalar *b, btScalar *w, btScalar *lo,
- btScalar *hi, int *p, bool *state, int *findex,
- int n, int i1, int i2, int nskip,
- int do_fast_row_swaps)
+static void btSwapProblem(BTATYPE A, btScalar *x, btScalar *b, btScalar *w, btScalar *lo,
+ btScalar *hi, int *p, bool *state, int *findex,
+ int n, int i1, int i2, int nskip,
+ int do_fast_row_swaps)
{
- btScalar tmpr;
- int tmpi;
- bool tmpb;
- btAssert (n>0 && i1 >=0 && i2 >= 0 && i1 < n && i2 < n && nskip >= n && i1 <= i2);
- if (i1==i2) return;
-
- btSwapRowsAndCols (A,n,i1,i2,nskip,do_fast_row_swaps);
-
- tmpr = x[i1];
- x[i1] = x[i2];
- x[i2] = tmpr;
-
- tmpr = b[i1];
- b[i1] = b[i2];
- b[i2] = tmpr;
-
- tmpr = w[i1];
- w[i1] = w[i2];
- w[i2] = tmpr;
-
- tmpr = lo[i1];
- lo[i1] = lo[i2];
- lo[i2] = tmpr;
-
- tmpr = hi[i1];
- hi[i1] = hi[i2];
- hi[i2] = tmpr;
-
- tmpi = p[i1];
- p[i1] = p[i2];
- p[i2] = tmpi;
-
- tmpb = state[i1];
- state[i1] = state[i2];
- state[i2] = tmpb;
-
- if (findex) {
- tmpi = findex[i1];
- findex[i1] = findex[i2];
- findex[i2] = tmpi;
- }
-}
+ btScalar tmpr;
+ int tmpi;
+ bool tmpb;
+ btAssert(n > 0 && i1 >= 0 && i2 >= 0 && i1 < n && i2 < n && nskip >= n && i1 <= i2);
+ if (i1 == i2) return;
+
+ btSwapRowsAndCols(A, n, i1, i2, nskip, do_fast_row_swaps);
+
+ tmpr = x[i1];
+ x[i1] = x[i2];
+ x[i2] = tmpr;
+ tmpr = b[i1];
+ b[i1] = b[i2];
+ b[i2] = tmpr;
+ tmpr = w[i1];
+ w[i1] = w[i2];
+ w[i2] = tmpr;
+ tmpr = lo[i1];
+ lo[i1] = lo[i2];
+ lo[i2] = tmpr;
+
+ tmpr = hi[i1];
+ hi[i1] = hi[i2];
+ hi[i2] = tmpr;
+
+ tmpi = p[i1];
+ p[i1] = p[i2];
+ p[i2] = tmpi;
+
+ tmpb = state[i1];
+ state[i1] = state[i2];
+ state[i2] = tmpb;
+
+ if (findex)
+ {
+ tmpi = findex[i1];
+ findex[i1] = findex[i2];
+ findex[i2] = tmpi;
+ }
+}
//***************************************************************************
// btLCP manipulator object. this represents an n*n LCP problem.
@@ -1186,79 +1207,88 @@ static void btSwapProblem (BTATYPE A, btScalar *x, btScalar *b, btScalar *w, btS
#ifdef btLCP_FAST
-struct btLCP
+struct btLCP
{
const int m_n;
const int m_nskip;
int m_nub;
- int m_nC, m_nN; // size of each index set
- BTATYPE const m_A; // A rows
- btScalar *const m_x, * const m_b, *const m_w, *const m_lo,* const m_hi; // permuted LCP problem data
- btScalar *const m_L, *const m_d; // L*D*L' factorization of set C
+ int m_nC, m_nN; // size of each index set
+ BTATYPE const m_A; // A rows
+ btScalar *const m_x, *const m_b, *const m_w, *const m_lo, *const m_hi; // permuted LCP problem data
+ btScalar *const m_L, *const m_d; // L*D*L' factorization of set C
btScalar *const m_Dell, *const m_ell, *const m_tmp;
bool *const m_state;
int *const m_findex, *const m_p, *const m_C;
- btLCP (int _n, int _nskip, int _nub, btScalar *_Adata, btScalar *_x, btScalar *_b, btScalar *_w,
- btScalar *_lo, btScalar *_hi, btScalar *l, btScalar *_d,
- btScalar *_Dell, btScalar *_ell, btScalar *_tmp,
- bool *_state, int *_findex, int *p, int *c, btScalar **Arows);
+ btLCP(int _n, int _nskip, int _nub, btScalar *_Adata, btScalar *_x, btScalar *_b, btScalar *_w,
+ btScalar *_lo, btScalar *_hi, btScalar *l, btScalar *_d,
+ btScalar *_Dell, btScalar *_ell, btScalar *_tmp,
+ bool *_state, int *_findex, int *p, int *c, btScalar **Arows);
int getNub() const { return m_nub; }
- void transfer_i_to_C (int i);
- void transfer_i_to_N (int i) { m_nN++; } // because we can assume C and N span 1:i-1
- void transfer_i_from_N_to_C (int i);
- void transfer_i_from_C_to_N (int i, btAlignedObjectArray<btScalar>& scratch);
+ void transfer_i_to_C(int i);
+ void transfer_i_to_N(int i) { m_nN++; } // because we can assume C and N span 1:i-1
+ void transfer_i_from_N_to_C(int i);
+ void transfer_i_from_C_to_N(int i, btAlignedObjectArray<btScalar> &scratch);
int numC() const { return m_nC; }
int numN() const { return m_nN; }
- int indexC (int i) const { return i; }
- int indexN (int i) const { return i+m_nC; }
- btScalar Aii (int i) const { return BTAROW(i)[i]; }
- btScalar AiC_times_qC (int i, btScalar *q) const { return btLargeDot (BTAROW(i), q, m_nC); }
- btScalar AiN_times_qN (int i, btScalar *q) const { return btLargeDot (BTAROW(i)+m_nC, q+m_nC, m_nN); }
- void pN_equals_ANC_times_qC (btScalar *p, btScalar *q);
- void pN_plusequals_ANi (btScalar *p, int i, int sign=1);
- void pC_plusequals_s_times_qC (btScalar *p, btScalar s, btScalar *q);
- void pN_plusequals_s_times_qN (btScalar *p, btScalar s, btScalar *q);
- void solve1 (btScalar *a, int i, int dir=1, int only_transfer=0);
+ int indexC(int i) const { return i; }
+ int indexN(int i) const { return i + m_nC; }
+ btScalar Aii(int i) const { return BTAROW(i)[i]; }
+ btScalar AiC_times_qC(int i, btScalar *q) const { return btLargeDot(BTAROW(i), q, m_nC); }
+ btScalar AiN_times_qN(int i, btScalar *q) const { return btLargeDot(BTAROW(i) + m_nC, q + m_nC, m_nN); }
+ void pN_equals_ANC_times_qC(btScalar *p, btScalar *q);
+ void pN_plusequals_ANi(btScalar *p, int i, int sign = 1);
+ void pC_plusequals_s_times_qC(btScalar *p, btScalar s, btScalar *q);
+ void pN_plusequals_s_times_qN(btScalar *p, btScalar s, btScalar *q);
+ void solve1(btScalar *a, int i, int dir = 1, int only_transfer = 0);
void unpermute();
};
-
-btLCP::btLCP (int _n, int _nskip, int _nub, btScalar *_Adata, btScalar *_x, btScalar *_b, btScalar *_w,
- btScalar *_lo, btScalar *_hi, btScalar *l, btScalar *_d,
- btScalar *_Dell, btScalar *_ell, btScalar *_tmp,
- bool *_state, int *_findex, int *p, int *c, btScalar **Arows):
- m_n(_n), m_nskip(_nskip), m_nub(_nub), m_nC(0), m_nN(0),
-# ifdef BTROWPTRS
- m_A(Arows),
+btLCP::btLCP(int _n, int _nskip, int _nub, btScalar *_Adata, btScalar *_x, btScalar *_b, btScalar *_w,
+ btScalar *_lo, btScalar *_hi, btScalar *l, btScalar *_d,
+ btScalar *_Dell, btScalar *_ell, btScalar *_tmp,
+ bool *_state, int *_findex, int *p, int *c, btScalar **Arows) : m_n(_n), m_nskip(_nskip), m_nub(_nub), m_nC(0), m_nN(0),
+#ifdef BTROWPTRS
+ m_A(Arows),
#else
- m_A(_Adata),
+ m_A(_Adata),
#endif
- m_x(_x), m_b(_b), m_w(_w), m_lo(_lo), m_hi(_hi),
- m_L(l), m_d(_d), m_Dell(_Dell), m_ell(_ell), m_tmp(_tmp),
- m_state(_state), m_findex(_findex), m_p(p), m_C(c)
+ m_x(_x),
+ m_b(_b),
+ m_w(_w),
+ m_lo(_lo),
+ m_hi(_hi),
+ m_L(l),
+ m_d(_d),
+ m_Dell(_Dell),
+ m_ell(_ell),
+ m_tmp(_tmp),
+ m_state(_state),
+ m_findex(_findex),
+ m_p(p),
+ m_C(c)
{
- {
- btSetZero (m_x,m_n);
- }
+ {
+ btSetZero(m_x, m_n);
+ }
- {
-# ifdef BTROWPTRS
- // make matrix row pointers
- btScalar *aptr = _Adata;
- BTATYPE A = m_A;
- const int n = m_n, nskip = m_nskip;
- for (int k=0; k<n; aptr+=nskip, ++k) A[k] = aptr;
-# endif
- }
+ {
+#ifdef BTROWPTRS
+ // make matrix row pointers
+ btScalar *aptr = _Adata;
+ BTATYPE A = m_A;
+ const int n = m_n, nskip = m_nskip;
+ for (int k = 0; k < n; aptr += nskip, ++k) A[k] = aptr;
+#endif
+ }
- {
- int *p = m_p;
- const int n = m_n;
- for (int k=0; k<n; ++k) p[k]=k; // initially unpermuted
- }
+ {
+ int *p = m_p;
+ const int n = m_n;
+ for (int k = 0; k < n; ++k) p[k] = k; // initially unpermuted
+ }
- /*
+ /*
// for testing, we can do some random swaps in the area i > nub
{
const int n = m_n;
@@ -1277,63 +1307,69 @@ btLCP::btLCP (int _n, int _nskip, int _nub, btScalar *_Adata, btScalar *_x, btSc
}
*/
- // permute the problem so that *all* the unbounded variables are at the
- // start, i.e. look for unbounded variables not included in `nub'. we can
- // potentially push up `nub' this way and get a bigger initial factorization.
- // note that when we swap rows/cols here we must not just swap row pointers,
- // as the initial factorization relies on the data being all in one chunk.
- // variables that have findex >= 0 are *not* considered to be unbounded even
- // if lo=-inf and hi=inf - this is because these limits may change during the
- // solution process.
-
- {
- int *findex = m_findex;
- btScalar *lo = m_lo, *hi = m_hi;
- const int n = m_n;
- for (int k = m_nub; k<n; ++k) {
- if (findex && findex[k] >= 0) continue;
- if (lo[k]==-BT_INFINITY && hi[k]==BT_INFINITY) {
- btSwapProblem (m_A,m_x,m_b,m_w,lo,hi,m_p,m_state,findex,n,m_nub,k,m_nskip,0);
- m_nub++;
- }
- }
- }
-
- // if there are unbounded variables at the start, factorize A up to that
- // point and solve for x. this puts all indexes 0..nub-1 into C.
- if (m_nub > 0) {
- const int nub = m_nub;
- {
- btScalar *Lrow = m_L;
- const int nskip = m_nskip;
- for (int j=0; j<nub; Lrow+=nskip, ++j) memcpy(Lrow,BTAROW(j),(j+1)*sizeof(btScalar));
- }
- btFactorLDLT (m_L,m_d,nub,m_nskip);
- memcpy (m_x,m_b,nub*sizeof(btScalar));
- btSolveLDLT (m_L,m_d,m_x,nub,m_nskip);
- btSetZero (m_w,nub);
- {
- int *C = m_C;
- for (int k=0; k<nub; ++k) C[k] = k;
- }
- m_nC = nub;
- }
-
- // permute the indexes > nub such that all findex variables are at the end
- if (m_findex) {
- const int nub = m_nub;
- int *findex = m_findex;
- int num_at_end = 0;
- for (int k=m_n-1; k >= nub; k--) {
- if (findex[k] >= 0) {
- btSwapProblem (m_A,m_x,m_b,m_w,m_lo,m_hi,m_p,m_state,findex,m_n,k,m_n-1-num_at_end,m_nskip,1);
- num_at_end++;
- }
- }
- }
+ // permute the problem so that *all* the unbounded variables are at the
+ // start, i.e. look for unbounded variables not included in `nub'. we can
+ // potentially push up `nub' this way and get a bigger initial factorization.
+ // note that when we swap rows/cols here we must not just swap row pointers,
+ // as the initial factorization relies on the data being all in one chunk.
+ // variables that have findex >= 0 are *not* considered to be unbounded even
+ // if lo=-inf and hi=inf - this is because these limits may change during the
+ // solution process.
- // print info about indexes
- /*
+ {
+ int *findex = m_findex;
+ btScalar *lo = m_lo, *hi = m_hi;
+ const int n = m_n;
+ for (int k = m_nub; k < n; ++k)
+ {
+ if (findex && findex[k] >= 0) continue;
+ if (lo[k] == -BT_INFINITY && hi[k] == BT_INFINITY)
+ {
+ btSwapProblem(m_A, m_x, m_b, m_w, lo, hi, m_p, m_state, findex, n, m_nub, k, m_nskip, 0);
+ m_nub++;
+ }
+ }
+ }
+
+ // if there are unbounded variables at the start, factorize A up to that
+ // point and solve for x. this puts all indexes 0..nub-1 into C.
+ if (m_nub > 0)
+ {
+ const int nub = m_nub;
+ {
+ btScalar *Lrow = m_L;
+ const int nskip = m_nskip;
+ for (int j = 0; j < nub; Lrow += nskip, ++j) memcpy(Lrow, BTAROW(j), (j + 1) * sizeof(btScalar));
+ }
+ btFactorLDLT(m_L, m_d, nub, m_nskip);
+ memcpy(m_x, m_b, nub * sizeof(btScalar));
+ btSolveLDLT(m_L, m_d, m_x, nub, m_nskip);
+ btSetZero(m_w, nub);
+ {
+ int *C = m_C;
+ for (int k = 0; k < nub; ++k) C[k] = k;
+ }
+ m_nC = nub;
+ }
+
+ // permute the indexes > nub such that all findex variables are at the end
+ if (m_findex)
+ {
+ const int nub = m_nub;
+ int *findex = m_findex;
+ int num_at_end = 0;
+ for (int k = m_n - 1; k >= nub; k--)
+ {
+ if (findex[k] >= 0)
+ {
+ btSwapProblem(m_A, m_x, m_b, m_w, m_lo, m_hi, m_p, m_state, findex, m_n, k, m_n - 1 - num_at_end, m_nskip, 1);
+ num_at_end++;
+ }
+ }
+ }
+
+ // print info about indexes
+ /*
{
const int n = m_n;
const int nub = m_nub;
@@ -1347,734 +1383,776 @@ btLCP::btLCP (int _n, int _nskip, int _nub, btScalar *_Adata, btScalar *_x, btSc
*/
}
-
-void btLCP::transfer_i_to_C (int i)
+void btLCP::transfer_i_to_C(int i)
{
- {
- if (m_nC > 0) {
- // ell,Dell were computed by solve1(). note, ell = D \ L1solve (L,A(i,C))
- {
- const int nC = m_nC;
- btScalar *const Ltgt = m_L + nC*m_nskip, *ell = m_ell;
- for (int j=0; j<nC; ++j) Ltgt[j] = ell[j];
- }
- const int nC = m_nC;
- m_d[nC] = btRecip (BTAROW(i)[i] - btLargeDot(m_ell,m_Dell,nC));
- }
- else {
- m_d[0] = btRecip (BTAROW(i)[i]);
- }
-
- btSwapProblem (m_A,m_x,m_b,m_w,m_lo,m_hi,m_p,m_state,m_findex,m_n,m_nC,i,m_nskip,1);
+ {
+ if (m_nC > 0)
+ {
+ // ell,Dell were computed by solve1(). note, ell = D \ L1solve (L,A(i,C))
+ {
+ const int nC = m_nC;
+ btScalar *const Ltgt = m_L + nC * m_nskip, *ell = m_ell;
+ for (int j = 0; j < nC; ++j) Ltgt[j] = ell[j];
+ }
+ const int nC = m_nC;
+ m_d[nC] = btRecip(BTAROW(i)[i] - btLargeDot(m_ell, m_Dell, nC));
+ }
+ else
+ {
+ m_d[0] = btRecip(BTAROW(i)[i]);
+ }
- const int nC = m_nC;
- m_C[nC] = nC;
- m_nC = nC + 1; // nC value is outdated after this line
- }
+ btSwapProblem(m_A, m_x, m_b, m_w, m_lo, m_hi, m_p, m_state, m_findex, m_n, m_nC, i, m_nskip, 1);
+ const int nC = m_nC;
+ m_C[nC] = nC;
+ m_nC = nC + 1; // nC value is outdated after this line
+ }
}
-
-void btLCP::transfer_i_from_N_to_C (int i)
+void btLCP::transfer_i_from_N_to_C(int i)
{
- {
- if (m_nC > 0) {
- {
- btScalar *const aptr = BTAROW(i);
- btScalar *Dell = m_Dell;
- const int *C = m_C;
-# ifdef BTNUB_OPTIMIZATIONS
- // if nub>0, initial part of aptr unpermuted
- const int nub = m_nub;
- int j=0;
- for ( ; j<nub; ++j) Dell[j] = aptr[j];
- const int nC = m_nC;
- for ( ; j<nC; ++j) Dell[j] = aptr[C[j]];
-# else
- const int nC = m_nC;
- for (int j=0; j<nC; ++j) Dell[j] = aptr[C[j]];
-# endif
- }
- btSolveL1 (m_L,m_Dell,m_nC,m_nskip);
- {
- const int nC = m_nC;
- btScalar *const Ltgt = m_L + nC*m_nskip;
- btScalar *ell = m_ell, *Dell = m_Dell, *d = m_d;
- for (int j=0; j<nC; ++j) Ltgt[j] = ell[j] = Dell[j] * d[j];
- }
- const int nC = m_nC;
- m_d[nC] = btRecip (BTAROW(i)[i] - btLargeDot(m_ell,m_Dell,nC));
- }
- else {
- m_d[0] = btRecip (BTAROW(i)[i]);
- }
-
- btSwapProblem (m_A,m_x,m_b,m_w,m_lo,m_hi,m_p,m_state,m_findex,m_n,m_nC,i,m_nskip,1);
-
- const int nC = m_nC;
- m_C[nC] = nC;
- m_nN--;
- m_nC = nC + 1; // nC value is outdated after this line
- }
-
- // @@@ TO DO LATER
- // if we just finish here then we'll go back and re-solve for
- // delta_x. but actually we can be more efficient and incrementally
- // update delta_x here. but if we do this, we wont have ell and Dell
- // to use in updating the factorization later.
-
+ {
+ if (m_nC > 0)
+ {
+ {
+ btScalar *const aptr = BTAROW(i);
+ btScalar *Dell = m_Dell;
+ const int *C = m_C;
+#ifdef BTNUB_OPTIMIZATIONS
+ // if nub>0, initial part of aptr unpermuted
+ const int nub = m_nub;
+ int j = 0;
+ for (; j < nub; ++j) Dell[j] = aptr[j];
+ const int nC = m_nC;
+ for (; j < nC; ++j) Dell[j] = aptr[C[j]];
+#else
+ const int nC = m_nC;
+ for (int j = 0; j < nC; ++j) Dell[j] = aptr[C[j]];
+#endif
+ }
+ btSolveL1(m_L, m_Dell, m_nC, m_nskip);
+ {
+ const int nC = m_nC;
+ btScalar *const Ltgt = m_L + nC * m_nskip;
+ btScalar *ell = m_ell, *Dell = m_Dell, *d = m_d;
+ for (int j = 0; j < nC; ++j) Ltgt[j] = ell[j] = Dell[j] * d[j];
+ }
+ const int nC = m_nC;
+ m_d[nC] = btRecip(BTAROW(i)[i] - btLargeDot(m_ell, m_Dell, nC));
+ }
+ else
+ {
+ m_d[0] = btRecip(BTAROW(i)[i]);
+ }
+
+ btSwapProblem(m_A, m_x, m_b, m_w, m_lo, m_hi, m_p, m_state, m_findex, m_n, m_nC, i, m_nskip, 1);
+
+ const int nC = m_nC;
+ m_C[nC] = nC;
+ m_nN--;
+ m_nC = nC + 1; // nC value is outdated after this line
+ }
+
+ // @@@ TO DO LATER
+ // if we just finish here then we'll go back and re-solve for
+ // delta_x. but actually we can be more efficient and incrementally
+ // update delta_x here. but if we do this, we wont have ell and Dell
+ // to use in updating the factorization later.
}
-void btRemoveRowCol (btScalar *A, int n, int nskip, int r)
+void btRemoveRowCol(btScalar *A, int n, int nskip, int r)
{
- btAssert(A && n > 0 && nskip >= n && r >= 0 && r < n);
- if (r >= n-1) return;
- if (r > 0) {
- {
- const size_t move_size = (n-r-1)*sizeof(btScalar);
- btScalar *Adst = A + r;
- for (int i=0; i<r; Adst+=nskip,++i) {
- btScalar *Asrc = Adst + 1;
- memmove (Adst,Asrc,move_size);
- }
- }
- {
- const size_t cpy_size = r*sizeof(btScalar);
- btScalar *Adst = A + r * nskip;
- for (int i=r; i<(n-1); ++i) {
- btScalar *Asrc = Adst + nskip;
- memcpy (Adst,Asrc,cpy_size);
- Adst = Asrc;
- }
- }
- }
- {
- const size_t cpy_size = (n-r-1)*sizeof(btScalar);
- btScalar *Adst = A + r * (nskip + 1);
- for (int i=r; i<(n-1); ++i) {
- btScalar *Asrc = Adst + (nskip + 1);
- memcpy (Adst,Asrc,cpy_size);
- Adst = Asrc - 1;
- }
- }
+ btAssert(A && n > 0 && nskip >= n && r >= 0 && r < n);
+ if (r >= n - 1) return;
+ if (r > 0)
+ {
+ {
+ const size_t move_size = (n - r - 1) * sizeof(btScalar);
+ btScalar *Adst = A + r;
+ for (int i = 0; i < r; Adst += nskip, ++i)
+ {
+ btScalar *Asrc = Adst + 1;
+ memmove(Adst, Asrc, move_size);
+ }
+ }
+ {
+ const size_t cpy_size = r * sizeof(btScalar);
+ btScalar *Adst = A + r * nskip;
+ for (int i = r; i < (n - 1); ++i)
+ {
+ btScalar *Asrc = Adst + nskip;
+ memcpy(Adst, Asrc, cpy_size);
+ Adst = Asrc;
+ }
+ }
+ }
+ {
+ const size_t cpy_size = (n - r - 1) * sizeof(btScalar);
+ btScalar *Adst = A + r * (nskip + 1);
+ for (int i = r; i < (n - 1); ++i)
+ {
+ btScalar *Asrc = Adst + (nskip + 1);
+ memcpy(Adst, Asrc, cpy_size);
+ Adst = Asrc - 1;
+ }
+ }
}
+void btLDLTAddTL(btScalar *L, btScalar *d, const btScalar *a, int n, int nskip, btAlignedObjectArray<btScalar> &scratch)
+{
+ btAssert(L && d && a && n > 0 && nskip >= n);
+ if (n < 2) return;
+ scratch.resize(2 * nskip);
+ btScalar *W1 = &scratch[0];
+ btScalar *W2 = W1 + nskip;
-void btLDLTAddTL (btScalar *L, btScalar *d, const btScalar *a, int n, int nskip, btAlignedObjectArray<btScalar>& scratch)
-{
- btAssert (L && d && a && n > 0 && nskip >= n);
-
- if (n < 2) return;
- scratch.resize(2*nskip);
- btScalar *W1 = &scratch[0];
-
- btScalar *W2 = W1 + nskip;
-
- W1[0] = btScalar(0.0);
- W2[0] = btScalar(0.0);
- for (int j=1; j<n; ++j) {
- W1[j] = W2[j] = (btScalar) (a[j] * SIMDSQRT12);
- }
- btScalar W11 = (btScalar) ((btScalar(0.5)*a[0]+1)*SIMDSQRT12);
- btScalar W21 = (btScalar) ((btScalar(0.5)*a[0]-1)*SIMDSQRT12);
-
- btScalar alpha1 = btScalar(1.0);
- btScalar alpha2 = btScalar(1.0);
+ W1[0] = btScalar(0.0);
+ W2[0] = btScalar(0.0);
+ for (int j = 1; j < n; ++j)
+ {
+ W1[j] = W2[j] = (btScalar)(a[j] * SIMDSQRT12);
+ }
+ btScalar W11 = (btScalar)((btScalar(0.5) * a[0] + 1) * SIMDSQRT12);
+ btScalar W21 = (btScalar)((btScalar(0.5) * a[0] - 1) * SIMDSQRT12);
- {
- btScalar dee = d[0];
- btScalar alphanew = alpha1 + (W11*W11)*dee;
- btAssert(alphanew != btScalar(0.0));
- dee /= alphanew;
- btScalar gamma1 = W11 * dee;
- dee *= alpha1;
- alpha1 = alphanew;
- alphanew = alpha2 - (W21*W21)*dee;
- dee /= alphanew;
- //btScalar gamma2 = W21 * dee;
- alpha2 = alphanew;
- btScalar k1 = btScalar(1.0) - W21*gamma1;
- btScalar k2 = W21*gamma1*W11 - W21;
- btScalar *ll = L + nskip;
- for (int p=1; p<n; ll+=nskip, ++p) {
- btScalar Wp = W1[p];
- btScalar ell = *ll;
- W1[p] = Wp - W11*ell;
- W2[p] = k1*Wp + k2*ell;
- }
- }
+ btScalar alpha1 = btScalar(1.0);
+ btScalar alpha2 = btScalar(1.0);
- btScalar *ll = L + (nskip + 1);
- for (int j=1; j<n; ll+=nskip+1, ++j) {
- btScalar k1 = W1[j];
- btScalar k2 = W2[j];
-
- btScalar dee = d[j];
- btScalar alphanew = alpha1 + (k1*k1)*dee;
- btAssert(alphanew != btScalar(0.0));
- dee /= alphanew;
- btScalar gamma1 = k1 * dee;
- dee *= alpha1;
- alpha1 = alphanew;
- alphanew = alpha2 - (k2*k2)*dee;
- dee /= alphanew;
- btScalar gamma2 = k2 * dee;
- dee *= alpha2;
- d[j] = dee;
- alpha2 = alphanew;
-
- btScalar *l = ll + nskip;
- for (int p=j+1; p<n; l+=nskip, ++p) {
- btScalar ell = *l;
- btScalar Wp = W1[p] - k1 * ell;
- ell += gamma1 * Wp;
- W1[p] = Wp;
- Wp = W2[p] - k2 * ell;
- ell -= gamma2 * Wp;
- W2[p] = Wp;
- *l = ell;
- }
- }
+ {
+ btScalar dee = d[0];
+ btScalar alphanew = alpha1 + (W11 * W11) * dee;
+ btAssert(alphanew != btScalar(0.0));
+ dee /= alphanew;
+ btScalar gamma1 = W11 * dee;
+ dee *= alpha1;
+ alpha1 = alphanew;
+ alphanew = alpha2 - (W21 * W21) * dee;
+ dee /= alphanew;
+ //btScalar gamma2 = W21 * dee;
+ alpha2 = alphanew;
+ btScalar k1 = btScalar(1.0) - W21 * gamma1;
+ btScalar k2 = W21 * gamma1 * W11 - W21;
+ btScalar *ll = L + nskip;
+ for (int p = 1; p < n; ll += nskip, ++p)
+ {
+ btScalar Wp = W1[p];
+ btScalar ell = *ll;
+ W1[p] = Wp - W11 * ell;
+ W2[p] = k1 * Wp + k2 * ell;
+ }
+ }
+
+ btScalar *ll = L + (nskip + 1);
+ for (int j = 1; j < n; ll += nskip + 1, ++j)
+ {
+ btScalar k1 = W1[j];
+ btScalar k2 = W2[j];
+
+ btScalar dee = d[j];
+ btScalar alphanew = alpha1 + (k1 * k1) * dee;
+ btAssert(alphanew != btScalar(0.0));
+ dee /= alphanew;
+ btScalar gamma1 = k1 * dee;
+ dee *= alpha1;
+ alpha1 = alphanew;
+ alphanew = alpha2 - (k2 * k2) * dee;
+ dee /= alphanew;
+ btScalar gamma2 = k2 * dee;
+ dee *= alpha2;
+ d[j] = dee;
+ alpha2 = alphanew;
+
+ btScalar *l = ll + nskip;
+ for (int p = j + 1; p < n; l += nskip, ++p)
+ {
+ btScalar ell = *l;
+ btScalar Wp = W1[p] - k1 * ell;
+ ell += gamma1 * Wp;
+ W1[p] = Wp;
+ Wp = W2[p] - k2 * ell;
+ ell -= gamma2 * Wp;
+ W2[p] = Wp;
+ *l = ell;
+ }
+ }
}
-
-#define _BTGETA(i,j) (A[i][j])
+#define _BTGETA(i, j) (A[i][j])
//#define _GETA(i,j) (A[(i)*nskip+(j)])
-#define BTGETA(i,j) ((i > j) ? _BTGETA(i,j) : _BTGETA(j,i))
+#define BTGETA(i, j) ((i > j) ? _BTGETA(i, j) : _BTGETA(j, i))
inline size_t btEstimateLDLTAddTLTmpbufSize(int nskip)
{
- return nskip * 2 * sizeof(btScalar);
+ return nskip * 2 * sizeof(btScalar);
}
-
-void btLDLTRemove (btScalar **A, const int *p, btScalar *L, btScalar *d,
- int n1, int n2, int r, int nskip, btAlignedObjectArray<btScalar>& scratch)
+void btLDLTRemove(btScalar **A, const int *p, btScalar *L, btScalar *d,
+ int n1, int n2, int r, int nskip, btAlignedObjectArray<btScalar> &scratch)
{
- btAssert(A && p && L && d && n1 > 0 && n2 > 0 && r >= 0 && r < n2 &&
- n1 >= n2 && nskip >= n1);
- #ifdef BT_DEBUG
- for (int i=0; i<n2; ++i)
+ btAssert(A && p && L && d && n1 > 0 && n2 > 0 && r >= 0 && r < n2 &&
+ n1 >= n2 && nskip >= n1);
+#ifdef BT_DEBUG
+ for (int i = 0; i < n2; ++i)
btAssert(p[i] >= 0 && p[i] < n1);
- #endif
-
- if (r==n2-1) {
- return; // deleting last row/col is easy
- }
- else {
- size_t LDLTAddTL_size = btEstimateLDLTAddTLTmpbufSize(nskip);
- btAssert(LDLTAddTL_size % sizeof(btScalar) == 0);
- scratch.resize(nskip * 2+n2);
- btScalar *tmp = &scratch[0];
- if (r==0) {
- btScalar *a = (btScalar *)((char *)tmp + LDLTAddTL_size);
- const int p_0 = p[0];
- for (int i=0; i<n2; ++i) {
- a[i] = -BTGETA(p[i],p_0);
- }
- a[0] += btScalar(1.0);
- btLDLTAddTL (L,d,a,n2,nskip,scratch);
- }
- else {
- btScalar *t = (btScalar *)((char *)tmp + LDLTAddTL_size);
- {
- btScalar *Lcurr = L + r*nskip;
- for (int i=0; i<r; ++Lcurr, ++i) {
- btAssert(d[i] != btScalar(0.0));
- t[i] = *Lcurr / d[i];
- }
- }
- btScalar *a = t + r;
- {
- btScalar *Lcurr = L + r*nskip;
- const int *pp_r = p + r, p_r = *pp_r;
- const int n2_minus_r = n2-r;
- for (int i=0; i<n2_minus_r; Lcurr+=nskip,++i) {
- a[i] = btLargeDot(Lcurr,t,r) - BTGETA(pp_r[i],p_r);
- }
- }
- a[0] += btScalar(1.0);
- btLDLTAddTL (L + r*nskip+r, d+r, a, n2-r, nskip, scratch);
- }
- }
+#endif
- // snip out row/column r from L and d
- btRemoveRowCol (L,n2,nskip,r);
- if (r < (n2-1)) memmove (d+r,d+r+1,(n2-r-1)*sizeof(btScalar));
+ if (r == n2 - 1)
+ {
+ return; // deleting last row/col is easy
+ }
+ else
+ {
+ size_t LDLTAddTL_size = btEstimateLDLTAddTLTmpbufSize(nskip);
+ btAssert(LDLTAddTL_size % sizeof(btScalar) == 0);
+ scratch.resize(nskip * 2 + n2);
+ btScalar *tmp = &scratch[0];
+ if (r == 0)
+ {
+ btScalar *a = (btScalar *)((char *)tmp + LDLTAddTL_size);
+ const int p_0 = p[0];
+ for (int i = 0; i < n2; ++i)
+ {
+ a[i] = -BTGETA(p[i], p_0);
+ }
+ a[0] += btScalar(1.0);
+ btLDLTAddTL(L, d, a, n2, nskip, scratch);
+ }
+ else
+ {
+ btScalar *t = (btScalar *)((char *)tmp + LDLTAddTL_size);
+ {
+ btScalar *Lcurr = L + r * nskip;
+ for (int i = 0; i < r; ++Lcurr, ++i)
+ {
+ btAssert(d[i] != btScalar(0.0));
+ t[i] = *Lcurr / d[i];
+ }
+ }
+ btScalar *a = t + r;
+ {
+ btScalar *Lcurr = L + r * nskip;
+ const int *pp_r = p + r, p_r = *pp_r;
+ const int n2_minus_r = n2 - r;
+ for (int i = 0; i < n2_minus_r; Lcurr += nskip, ++i)
+ {
+ a[i] = btLargeDot(Lcurr, t, r) - BTGETA(pp_r[i], p_r);
+ }
+ }
+ a[0] += btScalar(1.0);
+ btLDLTAddTL(L + r * nskip + r, d + r, a, n2 - r, nskip, scratch);
+ }
+ }
+
+ // snip out row/column r from L and d
+ btRemoveRowCol(L, n2, nskip, r);
+ if (r < (n2 - 1)) memmove(d + r, d + r + 1, (n2 - r - 1) * sizeof(btScalar));
}
-
-void btLCP::transfer_i_from_C_to_N (int i, btAlignedObjectArray<btScalar>& scratch)
+void btLCP::transfer_i_from_C_to_N(int i, btAlignedObjectArray<btScalar> &scratch)
{
- {
- int *C = m_C;
- // remove a row/column from the factorization, and adjust the
- // indexes (black magic!)
- int last_idx = -1;
- const int nC = m_nC;
- int j = 0;
- for ( ; j<nC; ++j) {
- if (C[j]==nC-1) {
- last_idx = j;
- }
- if (C[j]==i) {
- btLDLTRemove (m_A,C,m_L,m_d,m_n,nC,j,m_nskip,scratch);
- int k;
- if (last_idx == -1) {
- for (k=j+1 ; k<nC; ++k) {
- if (C[k]==nC-1) {
- break;
- }
- }
- btAssert (k < nC);
- }
- else {
- k = last_idx;
- }
- C[k] = C[j];
- if (j < (nC-1)) memmove (C+j,C+j+1,(nC-j-1)*sizeof(int));
- break;
- }
- }
- btAssert (j < nC);
-
- btSwapProblem (m_A,m_x,m_b,m_w,m_lo,m_hi,m_p,m_state,m_findex,m_n,i,nC-1,m_nskip,1);
-
- m_nN++;
- m_nC = nC - 1; // nC value is outdated after this line
- }
-
+ {
+ int *C = m_C;
+ // remove a row/column from the factorization, and adjust the
+ // indexes (black magic!)
+ int last_idx = -1;
+ const int nC = m_nC;
+ int j = 0;
+ for (; j < nC; ++j)
+ {
+ if (C[j] == nC - 1)
+ {
+ last_idx = j;
+ }
+ if (C[j] == i)
+ {
+ btLDLTRemove(m_A, C, m_L, m_d, m_n, nC, j, m_nskip, scratch);
+ int k;
+ if (last_idx == -1)
+ {
+ for (k = j + 1; k < nC; ++k)
+ {
+ if (C[k] == nC - 1)
+ {
+ break;
+ }
+ }
+ btAssert(k < nC);
+ }
+ else
+ {
+ k = last_idx;
+ }
+ C[k] = C[j];
+ if (j < (nC - 1)) memmove(C + j, C + j + 1, (nC - j - 1) * sizeof(int));
+ break;
+ }
+ }
+ btAssert(j < nC);
+
+ btSwapProblem(m_A, m_x, m_b, m_w, m_lo, m_hi, m_p, m_state, m_findex, m_n, i, nC - 1, m_nskip, 1);
+
+ m_nN++;
+ m_nC = nC - 1; // nC value is outdated after this line
+ }
}
-
-void btLCP::pN_equals_ANC_times_qC (btScalar *p, btScalar *q)
+void btLCP::pN_equals_ANC_times_qC(btScalar *p, btScalar *q)
{
- // we could try to make this matrix-vector multiplication faster using
- // outer product matrix tricks, e.g. with the dMultidotX() functions.
- // but i tried it and it actually made things slower on random 100x100
- // problems because of the overhead involved. so we'll stick with the
- // simple method for now.
- const int nC = m_nC;
- btScalar *ptgt = p + nC;
- const int nN = m_nN;
- for (int i=0; i<nN; ++i) {
- ptgt[i] = btLargeDot (BTAROW(i+nC),q,nC);
- }
+ // we could try to make this matrix-vector multiplication faster using
+ // outer product matrix tricks, e.g. with the dMultidotX() functions.
+ // but i tried it and it actually made things slower on random 100x100
+ // problems because of the overhead involved. so we'll stick with the
+ // simple method for now.
+ const int nC = m_nC;
+ btScalar *ptgt = p + nC;
+ const int nN = m_nN;
+ for (int i = 0; i < nN; ++i)
+ {
+ ptgt[i] = btLargeDot(BTAROW(i + nC), q, nC);
+ }
}
-
-void btLCP::pN_plusequals_ANi (btScalar *p, int i, int sign)
+void btLCP::pN_plusequals_ANi(btScalar *p, int i, int sign)
{
- const int nC = m_nC;
- btScalar *aptr = BTAROW(i) + nC;
- btScalar *ptgt = p + nC;
- if (sign > 0) {
- const int nN = m_nN;
- for (int j=0; j<nN; ++j) ptgt[j] += aptr[j];
- }
- else {
- const int nN = m_nN;
- for (int j=0; j<nN; ++j) ptgt[j] -= aptr[j];
- }
+ const int nC = m_nC;
+ btScalar *aptr = BTAROW(i) + nC;
+ btScalar *ptgt = p + nC;
+ if (sign > 0)
+ {
+ const int nN = m_nN;
+ for (int j = 0; j < nN; ++j) ptgt[j] += aptr[j];
+ }
+ else
+ {
+ const int nN = m_nN;
+ for (int j = 0; j < nN; ++j) ptgt[j] -= aptr[j];
+ }
}
-void btLCP::pC_plusequals_s_times_qC (btScalar *p, btScalar s, btScalar *q)
+void btLCP::pC_plusequals_s_times_qC(btScalar *p, btScalar s, btScalar *q)
{
- const int nC = m_nC;
- for (int i=0; i<nC; ++i) {
- p[i] += s*q[i];
- }
+ const int nC = m_nC;
+ for (int i = 0; i < nC; ++i)
+ {
+ p[i] += s * q[i];
+ }
}
-void btLCP::pN_plusequals_s_times_qN (btScalar *p, btScalar s, btScalar *q)
+void btLCP::pN_plusequals_s_times_qN(btScalar *p, btScalar s, btScalar *q)
{
- const int nC = m_nC;
- btScalar *ptgt = p + nC, *qsrc = q + nC;
- const int nN = m_nN;
- for (int i=0; i<nN; ++i) {
- ptgt[i] += s*qsrc[i];
- }
+ const int nC = m_nC;
+ btScalar *ptgt = p + nC, *qsrc = q + nC;
+ const int nN = m_nN;
+ for (int i = 0; i < nN; ++i)
+ {
+ ptgt[i] += s * qsrc[i];
+ }
}
-void btLCP::solve1 (btScalar *a, int i, int dir, int only_transfer)
+void btLCP::solve1(btScalar *a, int i, int dir, int only_transfer)
{
- // the `Dell' and `ell' that are computed here are saved. if index i is
- // later added to the factorization then they can be reused.
- //
- // @@@ question: do we need to solve for entire delta_x??? yes, but
- // only if an x goes below 0 during the step.
-
- if (m_nC > 0) {
- {
- btScalar *Dell = m_Dell;
- int *C = m_C;
- btScalar *aptr = BTAROW(i);
-# ifdef BTNUB_OPTIMIZATIONS
- // if nub>0, initial part of aptr[] is guaranteed unpermuted
- const int nub = m_nub;
- int j=0;
- for ( ; j<nub; ++j) Dell[j] = aptr[j];
- const int nC = m_nC;
- for ( ; j<nC; ++j) Dell[j] = aptr[C[j]];
-# else
- const int nC = m_nC;
- for (int j=0; j<nC; ++j) Dell[j] = aptr[C[j]];
-# endif
- }
- btSolveL1 (m_L,m_Dell,m_nC,m_nskip);
- {
- btScalar *ell = m_ell, *Dell = m_Dell, *d = m_d;
- const int nC = m_nC;
- for (int j=0; j<nC; ++j) ell[j] = Dell[j] * d[j];
- }
+ // the `Dell' and `ell' that are computed here are saved. if index i is
+ // later added to the factorization then they can be reused.
+ //
+ // @@@ question: do we need to solve for entire delta_x??? yes, but
+ // only if an x goes below 0 during the step.
- if (!only_transfer) {
- btScalar *tmp = m_tmp, *ell = m_ell;
- {
- const int nC = m_nC;
- for (int j=0; j<nC; ++j) tmp[j] = ell[j];
- }
- btSolveL1T (m_L,tmp,m_nC,m_nskip);
- if (dir > 0) {
- int *C = m_C;
- btScalar *tmp = m_tmp;
- const int nC = m_nC;
- for (int j=0; j<nC; ++j) a[C[j]] = -tmp[j];
- } else {
- int *C = m_C;
- btScalar *tmp = m_tmp;
- const int nC = m_nC;
- for (int j=0; j<nC; ++j) a[C[j]] = tmp[j];
- }
- }
- }
-}
+ if (m_nC > 0)
+ {
+ {
+ btScalar *Dell = m_Dell;
+ int *C = m_C;
+ btScalar *aptr = BTAROW(i);
+#ifdef BTNUB_OPTIMIZATIONS
+ // if nub>0, initial part of aptr[] is guaranteed unpermuted
+ const int nub = m_nub;
+ int j = 0;
+ for (; j < nub; ++j) Dell[j] = aptr[j];
+ const int nC = m_nC;
+ for (; j < nC; ++j) Dell[j] = aptr[C[j]];
+#else
+ const int nC = m_nC;
+ for (int j = 0; j < nC; ++j) Dell[j] = aptr[C[j]];
+#endif
+ }
+ btSolveL1(m_L, m_Dell, m_nC, m_nskip);
+ {
+ btScalar *ell = m_ell, *Dell = m_Dell, *d = m_d;
+ const int nC = m_nC;
+ for (int j = 0; j < nC; ++j) ell[j] = Dell[j] * d[j];
+ }
+ if (!only_transfer)
+ {
+ btScalar *tmp = m_tmp, *ell = m_ell;
+ {
+ const int nC = m_nC;
+ for (int j = 0; j < nC; ++j) tmp[j] = ell[j];
+ }
+ btSolveL1T(m_L, tmp, m_nC, m_nskip);
+ if (dir > 0)
+ {
+ int *C = m_C;
+ btScalar *tmp = m_tmp;
+ const int nC = m_nC;
+ for (int j = 0; j < nC; ++j) a[C[j]] = -tmp[j];
+ }
+ else
+ {
+ int *C = m_C;
+ btScalar *tmp = m_tmp;
+ const int nC = m_nC;
+ for (int j = 0; j < nC; ++j) a[C[j]] = tmp[j];
+ }
+ }
+ }
+}
void btLCP::unpermute()
{
- // now we have to un-permute x and w
- {
- memcpy (m_tmp,m_x,m_n*sizeof(btScalar));
- btScalar *x = m_x, *tmp = m_tmp;
- const int *p = m_p;
- const int n = m_n;
- for (int j=0; j<n; ++j) x[p[j]] = tmp[j];
- }
- {
- memcpy (m_tmp,m_w,m_n*sizeof(btScalar));
- btScalar *w = m_w, *tmp = m_tmp;
- const int *p = m_p;
- const int n = m_n;
- for (int j=0; j<n; ++j) w[p[j]] = tmp[j];
- }
+ // now we have to un-permute x and w
+ {
+ memcpy(m_tmp, m_x, m_n * sizeof(btScalar));
+ btScalar *x = m_x, *tmp = m_tmp;
+ const int *p = m_p;
+ const int n = m_n;
+ for (int j = 0; j < n; ++j) x[p[j]] = tmp[j];
+ }
+ {
+ memcpy(m_tmp, m_w, m_n * sizeof(btScalar));
+ btScalar *w = m_w, *tmp = m_tmp;
+ const int *p = m_p;
+ const int n = m_n;
+ for (int j = 0; j < n; ++j) w[p[j]] = tmp[j];
+ }
}
-#endif // btLCP_FAST
-
+#endif // btLCP_FAST
//***************************************************************************
// an optimized Dantzig LCP driver routine for the lo-hi LCP problem.
-bool btSolveDantzigLCP (int n, btScalar *A, btScalar *x, btScalar *b,
- btScalar* outer_w, int nub, btScalar *lo, btScalar *hi, int *findex, btDantzigScratchMemory& scratchMem)
+bool btSolveDantzigLCP(int n, btScalar *A, btScalar *x, btScalar *b,
+ btScalar *outer_w, int nub, btScalar *lo, btScalar *hi, int *findex, btDantzigScratchMemory &scratchMem)
{
s_error = false;
-// printf("btSolveDantzigLCP n=%d\n",n);
- btAssert (n>0 && A && x && b && lo && hi && nub >= 0 && nub <= n);
- btAssert(outer_w);
+ // printf("btSolveDantzigLCP n=%d\n",n);
+ btAssert(n > 0 && A && x && b && lo && hi && nub >= 0 && nub <= n);
+ btAssert(outer_w);
#ifdef BT_DEBUG
- {
- // check restrictions on lo and hi
- for (int k=0; k<n; ++k)
- btAssert (lo[k] <= 0 && hi[k] >= 0);
- }
-# endif
-
-
- // if all the variables are unbounded then we can just factor, solve,
- // and return
- if (nub >= n)
- {
-
-
- int nskip = (n);
- btFactorLDLT (A, outer_w, n, nskip);
- btSolveLDLT (A, outer_w, b, n, nskip);
- memcpy (x, b, n*sizeof(btScalar));
-
- return !s_error;
- }
-
- const int nskip = (n);
- scratchMem.L.resize(n*nskip);
-
- scratchMem.d.resize(n);
-
- btScalar *w = outer_w;
- scratchMem.delta_w.resize(n);
- scratchMem.delta_x.resize(n);
- scratchMem.Dell.resize(n);
- scratchMem.ell.resize(n);
- scratchMem.Arows.resize(n);
- scratchMem.p.resize(n);
- scratchMem.C.resize(n);
-
- // for i in N, state[i] is 0 if x(i)==lo(i) or 1 if x(i)==hi(i)
- scratchMem.state.resize(n);
-
-
- // create LCP object. note that tmp is set to delta_w to save space, this
- // optimization relies on knowledge of how tmp is used, so be careful!
- btLCP lcp(n,nskip,nub,A,x,b,w,lo,hi,&scratchMem.L[0],&scratchMem.d[0],&scratchMem.Dell[0],&scratchMem.ell[0],&scratchMem.delta_w[0],&scratchMem.state[0],findex,&scratchMem.p[0],&scratchMem.C[0],&scratchMem.Arows[0]);
- int adj_nub = lcp.getNub();
-
- // loop over all indexes adj_nub..n-1. for index i, if x(i),w(i) satisfy the
- // LCP conditions then i is added to the appropriate index set. otherwise
- // x(i),w(i) is driven either +ve or -ve to force it to the valid region.
- // as we drive x(i), x(C) is also adjusted to keep w(C) at zero.
- // while driving x(i) we maintain the LCP conditions on the other variables
- // 0..i-1. we do this by watching out for other x(i),w(i) values going
- // outside the valid region, and then switching them between index sets
- // when that happens.
-
- bool hit_first_friction_index = false;
- for (int i=adj_nub; i<n; ++i)
- {
- s_error = false;
- // the index i is the driving index and indexes i+1..n-1 are "dont care",
- // i.e. when we make changes to the system those x's will be zero and we
- // don't care what happens to those w's. in other words, we only consider
- // an (i+1)*(i+1) sub-problem of A*x=b+w.
-
- // if we've hit the first friction index, we have to compute the lo and
- // hi values based on the values of x already computed. we have been
- // permuting the indexes, so the values stored in the findex vector are
- // no longer valid. thus we have to temporarily unpermute the x vector.
- // for the purposes of this computation, 0*infinity = 0 ... so if the
- // contact constraint's normal force is 0, there should be no tangential
- // force applied.
-
- if (!hit_first_friction_index && findex && findex[i] >= 0) {
- // un-permute x into delta_w, which is not being used at the moment
- for (int j=0; j<n; ++j) scratchMem.delta_w[scratchMem.p[j]] = x[j];
-
- // set lo and hi values
- for (int k=i; k<n; ++k) {
- btScalar wfk = scratchMem.delta_w[findex[k]];
- if (wfk == 0) {
- hi[k] = 0;
- lo[k] = 0;
- }
- else {
- hi[k] = btFabs (hi[k] * wfk);
- lo[k] = -hi[k];
- }
- }
- hit_first_friction_index = true;
- }
-
- // thus far we have not even been computing the w values for indexes
- // greater than i, so compute w[i] now.
- w[i] = lcp.AiC_times_qC (i,x) + lcp.AiN_times_qN (i,x) - b[i];
-
- // if lo=hi=0 (which can happen for tangential friction when normals are
- // 0) then the index will be assigned to set N with some state. however,
- // set C's line has zero size, so the index will always remain in set N.
- // with the "normal" switching logic, if w changed sign then the index
- // would have to switch to set C and then back to set N with an inverted
- // state. this is pointless, and also computationally expensive. to
- // prevent this from happening, we use the rule that indexes with lo=hi=0
- // will never be checked for set changes. this means that the state for
- // these indexes may be incorrect, but that doesn't matter.
-
- // see if x(i),w(i) is in a valid region
- if (lo[i]==0 && w[i] >= 0) {
- lcp.transfer_i_to_N (i);
- scratchMem.state[i] = false;
- }
- else if (hi[i]==0 && w[i] <= 0) {
- lcp.transfer_i_to_N (i);
- scratchMem.state[i] = true;
- }
- else if (w[i]==0) {
- // this is a degenerate case. by the time we get to this test we know
- // that lo != 0, which means that lo < 0 as lo is not allowed to be +ve,
- // and similarly that hi > 0. this means that the line segment
- // corresponding to set C is at least finite in extent, and we are on it.
- // NOTE: we must call lcp.solve1() before lcp.transfer_i_to_C()
- lcp.solve1 (&scratchMem.delta_x[0],i,0,1);
-
- lcp.transfer_i_to_C (i);
- }
- else {
- // we must push x(i) and w(i)
- for (;;) {
- int dir;
- btScalar dirf;
- // find direction to push on x(i)
- if (w[i] <= 0) {
- dir = 1;
- dirf = btScalar(1.0);
- }
- else {
- dir = -1;
- dirf = btScalar(-1.0);
- }
-
- // compute: delta_x(C) = -dir*A(C,C)\A(C,i)
- lcp.solve1 (&scratchMem.delta_x[0],i,dir);
-
- // note that delta_x[i] = dirf, but we wont bother to set it
-
- // compute: delta_w = A*delta_x ... note we only care about
- // delta_w(N) and delta_w(i), the rest is ignored
- lcp.pN_equals_ANC_times_qC (&scratchMem.delta_w[0],&scratchMem.delta_x[0]);
- lcp.pN_plusequals_ANi (&scratchMem.delta_w[0],i,dir);
- scratchMem.delta_w[i] = lcp.AiC_times_qC (i,&scratchMem.delta_x[0]) + lcp.Aii(i)*dirf;
-
- // find largest step we can take (size=s), either to drive x(i),w(i)
- // to the valid LCP region or to drive an already-valid variable
- // outside the valid region.
-
- int cmd = 1; // index switching command
- int si = 0; // si = index to switch if cmd>3
- btScalar s = -w[i]/scratchMem.delta_w[i];
- if (dir > 0) {
- if (hi[i] < BT_INFINITY) {
- btScalar s2 = (hi[i]-x[i])*dirf; // was (hi[i]-x[i])/dirf // step to x(i)=hi(i)
- if (s2 < s) {
- s = s2;
- cmd = 3;
- }
- }
- }
- else {
- if (lo[i] > -BT_INFINITY) {
- btScalar s2 = (lo[i]-x[i])*dirf; // was (lo[i]-x[i])/dirf // step to x(i)=lo(i)
- if (s2 < s) {
- s = s2;
- cmd = 2;
- }
- }
- }
-
- {
- const int numN = lcp.numN();
- for (int k=0; k < numN; ++k) {
- const int indexN_k = lcp.indexN(k);
- if (!scratchMem.state[indexN_k] ? scratchMem.delta_w[indexN_k] < 0 : scratchMem.delta_w[indexN_k] > 0) {
- // don't bother checking if lo=hi=0
- if (lo[indexN_k] == 0 && hi[indexN_k] == 0) continue;
- btScalar s2 = -w[indexN_k] / scratchMem.delta_w[indexN_k];
- if (s2 < s) {
- s = s2;
- cmd = 4;
- si = indexN_k;
- }
- }
- }
- }
-
- {
- const int numC = lcp.numC();
- for (int k=adj_nub; k < numC; ++k) {
- const int indexC_k = lcp.indexC(k);
- if (scratchMem.delta_x[indexC_k] < 0 && lo[indexC_k] > -BT_INFINITY) {
- btScalar s2 = (lo[indexC_k]-x[indexC_k]) / scratchMem.delta_x[indexC_k];
- if (s2 < s) {
- s = s2;
- cmd = 5;
- si = indexC_k;
- }
- }
- if (scratchMem.delta_x[indexC_k] > 0 && hi[indexC_k] < BT_INFINITY) {
- btScalar s2 = (hi[indexC_k]-x[indexC_k]) / scratchMem.delta_x[indexC_k];
- if (s2 < s) {
- s = s2;
- cmd = 6;
- si = indexC_k;
- }
- }
- }
- }
-
- //static char* cmdstring[8] = {0,"->C","->NL","->NH","N->C",
- // "C->NL","C->NH"};
- //printf ("cmd=%d (%s), si=%d\n",cmd,cmdstring[cmd],(cmd>3) ? si : i);
-
- // if s <= 0 then we've got a problem. if we just keep going then
- // we're going to get stuck in an infinite loop. instead, just cross
- // our fingers and exit with the current solution.
- if (s <= btScalar(0.0))
- {
-// printf("LCP internal error, s <= 0 (s=%.4e)",(double)s);
- if (i < n) {
- btSetZero (x+i,n-i);
- btSetZero (w+i,n-i);
- }
- s_error = true;
- break;
- }
-
- // apply x = x + s * delta_x
- lcp.pC_plusequals_s_times_qC (x, s, &scratchMem.delta_x[0]);
- x[i] += s * dirf;
-
- // apply w = w + s * delta_w
- lcp.pN_plusequals_s_times_qN (w, s, &scratchMem.delta_w[0]);
- w[i] += s * scratchMem.delta_w[i];
-
-// void *tmpbuf;
- // switch indexes between sets if necessary
- switch (cmd) {
- case 1: // done
- w[i] = 0;
- lcp.transfer_i_to_C (i);
- break;
- case 2: // done
- x[i] = lo[i];
- scratchMem.state[i] = false;
- lcp.transfer_i_to_N (i);
- break;
- case 3: // done
- x[i] = hi[i];
- scratchMem.state[i] = true;
- lcp.transfer_i_to_N (i);
- break;
- case 4: // keep going
- w[si] = 0;
- lcp.transfer_i_from_N_to_C (si);
- break;
- case 5: // keep going
- x[si] = lo[si];
- scratchMem.state[si] = false;
- lcp.transfer_i_from_C_to_N (si, scratchMem.m_scratch);
- break;
- case 6: // keep going
- x[si] = hi[si];
- scratchMem.state[si] = true;
- lcp.transfer_i_from_C_to_N (si, scratchMem.m_scratch);
- break;
- }
-
- if (cmd <= 3) break;
- } // for (;;)
- } // else
-
- if (s_error)
{
- break;
- }
- } // for (int i=adj_nub; i<n; ++i)
+ // check restrictions on lo and hi
+ for (int k = 0; k < n; ++k)
+ btAssert(lo[k] <= 0 && hi[k] >= 0);
+ }
+#endif
- lcp.unpermute();
+ // if all the variables are unbounded then we can just factor, solve,
+ // and return
+ if (nub >= n)
+ {
+ int nskip = (n);
+ btFactorLDLT(A, outer_w, n, nskip);
+ btSolveLDLT(A, outer_w, b, n, nskip);
+ memcpy(x, b, n * sizeof(btScalar));
+
+ return !s_error;
+ }
+
+ const int nskip = (n);
+ scratchMem.L.resize(n * nskip);
+
+ scratchMem.d.resize(n);
+
+ btScalar *w = outer_w;
+ scratchMem.delta_w.resize(n);
+ scratchMem.delta_x.resize(n);
+ scratchMem.Dell.resize(n);
+ scratchMem.ell.resize(n);
+ scratchMem.Arows.resize(n);
+ scratchMem.p.resize(n);
+ scratchMem.C.resize(n);
+
+ // for i in N, state[i] is 0 if x(i)==lo(i) or 1 if x(i)==hi(i)
+ scratchMem.state.resize(n);
+
+ // create LCP object. note that tmp is set to delta_w to save space, this
+ // optimization relies on knowledge of how tmp is used, so be careful!
+ btLCP lcp(n, nskip, nub, A, x, b, w, lo, hi, &scratchMem.L[0], &scratchMem.d[0], &scratchMem.Dell[0], &scratchMem.ell[0], &scratchMem.delta_w[0], &scratchMem.state[0], findex, &scratchMem.p[0], &scratchMem.C[0], &scratchMem.Arows[0]);
+ int adj_nub = lcp.getNub();
+
+ // loop over all indexes adj_nub..n-1. for index i, if x(i),w(i) satisfy the
+ // LCP conditions then i is added to the appropriate index set. otherwise
+ // x(i),w(i) is driven either +ve or -ve to force it to the valid region.
+ // as we drive x(i), x(C) is also adjusted to keep w(C) at zero.
+ // while driving x(i) we maintain the LCP conditions on the other variables
+ // 0..i-1. we do this by watching out for other x(i),w(i) values going
+ // outside the valid region, and then switching them between index sets
+ // when that happens.
+
+ bool hit_first_friction_index = false;
+ for (int i = adj_nub; i < n; ++i)
+ {
+ s_error = false;
+ // the index i is the driving index and indexes i+1..n-1 are "dont care",
+ // i.e. when we make changes to the system those x's will be zero and we
+ // don't care what happens to those w's. in other words, we only consider
+ // an (i+1)*(i+1) sub-problem of A*x=b+w.
+
+ // if we've hit the first friction index, we have to compute the lo and
+ // hi values based on the values of x already computed. we have been
+ // permuting the indexes, so the values stored in the findex vector are
+ // no longer valid. thus we have to temporarily unpermute the x vector.
+ // for the purposes of this computation, 0*infinity = 0 ... so if the
+ // contact constraint's normal force is 0, there should be no tangential
+ // force applied.
+
+ if (!hit_first_friction_index && findex && findex[i] >= 0)
+ {
+ // un-permute x into delta_w, which is not being used at the moment
+ for (int j = 0; j < n; ++j) scratchMem.delta_w[scratchMem.p[j]] = x[j];
+
+ // set lo and hi values
+ for (int k = i; k < n; ++k)
+ {
+ btScalar wfk = scratchMem.delta_w[findex[k]];
+ if (wfk == 0)
+ {
+ hi[k] = 0;
+ lo[k] = 0;
+ }
+ else
+ {
+ hi[k] = btFabs(hi[k] * wfk);
+ lo[k] = -hi[k];
+ }
+ }
+ hit_first_friction_index = true;
+ }
+
+ // thus far we have not even been computing the w values for indexes
+ // greater than i, so compute w[i] now.
+ w[i] = lcp.AiC_times_qC(i, x) + lcp.AiN_times_qN(i, x) - b[i];
+
+ // if lo=hi=0 (which can happen for tangential friction when normals are
+ // 0) then the index will be assigned to set N with some state. however,
+ // set C's line has zero size, so the index will always remain in set N.
+ // with the "normal" switching logic, if w changed sign then the index
+ // would have to switch to set C and then back to set N with an inverted
+ // state. this is pointless, and also computationally expensive. to
+ // prevent this from happening, we use the rule that indexes with lo=hi=0
+ // will never be checked for set changes. this means that the state for
+ // these indexes may be incorrect, but that doesn't matter.
+
+ // see if x(i),w(i) is in a valid region
+ if (lo[i] == 0 && w[i] >= 0)
+ {
+ lcp.transfer_i_to_N(i);
+ scratchMem.state[i] = false;
+ }
+ else if (hi[i] == 0 && w[i] <= 0)
+ {
+ lcp.transfer_i_to_N(i);
+ scratchMem.state[i] = true;
+ }
+ else if (w[i] == 0)
+ {
+ // this is a degenerate case. by the time we get to this test we know
+ // that lo != 0, which means that lo < 0 as lo is not allowed to be +ve,
+ // and similarly that hi > 0. this means that the line segment
+ // corresponding to set C is at least finite in extent, and we are on it.
+ // NOTE: we must call lcp.solve1() before lcp.transfer_i_to_C()
+ lcp.solve1(&scratchMem.delta_x[0], i, 0, 1);
+
+ lcp.transfer_i_to_C(i);
+ }
+ else
+ {
+ // we must push x(i) and w(i)
+ for (;;)
+ {
+ int dir;
+ btScalar dirf;
+ // find direction to push on x(i)
+ if (w[i] <= 0)
+ {
+ dir = 1;
+ dirf = btScalar(1.0);
+ }
+ else
+ {
+ dir = -1;
+ dirf = btScalar(-1.0);
+ }
+
+ // compute: delta_x(C) = -dir*A(C,C)\A(C,i)
+ lcp.solve1(&scratchMem.delta_x[0], i, dir);
+
+ // note that delta_x[i] = dirf, but we wont bother to set it
+
+ // compute: delta_w = A*delta_x ... note we only care about
+ // delta_w(N) and delta_w(i), the rest is ignored
+ lcp.pN_equals_ANC_times_qC(&scratchMem.delta_w[0], &scratchMem.delta_x[0]);
+ lcp.pN_plusequals_ANi(&scratchMem.delta_w[0], i, dir);
+ scratchMem.delta_w[i] = lcp.AiC_times_qC(i, &scratchMem.delta_x[0]) + lcp.Aii(i) * dirf;
+
+ // find largest step we can take (size=s), either to drive x(i),w(i)
+ // to the valid LCP region or to drive an already-valid variable
+ // outside the valid region.
+
+ int cmd = 1; // index switching command
+ int si = 0; // si = index to switch if cmd>3
+ btScalar s = -w[i] / scratchMem.delta_w[i];
+ if (dir > 0)
+ {
+ if (hi[i] < BT_INFINITY)
+ {
+ btScalar s2 = (hi[i] - x[i]) * dirf; // was (hi[i]-x[i])/dirf // step to x(i)=hi(i)
+ if (s2 < s)
+ {
+ s = s2;
+ cmd = 3;
+ }
+ }
+ }
+ else
+ {
+ if (lo[i] > -BT_INFINITY)
+ {
+ btScalar s2 = (lo[i] - x[i]) * dirf; // was (lo[i]-x[i])/dirf // step to x(i)=lo(i)
+ if (s2 < s)
+ {
+ s = s2;
+ cmd = 2;
+ }
+ }
+ }
+
+ {
+ const int numN = lcp.numN();
+ for (int k = 0; k < numN; ++k)
+ {
+ const int indexN_k = lcp.indexN(k);
+ if (!scratchMem.state[indexN_k] ? scratchMem.delta_w[indexN_k] < 0 : scratchMem.delta_w[indexN_k] > 0)
+ {
+ // don't bother checking if lo=hi=0
+ if (lo[indexN_k] == 0 && hi[indexN_k] == 0) continue;
+ btScalar s2 = -w[indexN_k] / scratchMem.delta_w[indexN_k];
+ if (s2 < s)
+ {
+ s = s2;
+ cmd = 4;
+ si = indexN_k;
+ }
+ }
+ }
+ }
+
+ {
+ const int numC = lcp.numC();
+ for (int k = adj_nub; k < numC; ++k)
+ {
+ const int indexC_k = lcp.indexC(k);
+ if (scratchMem.delta_x[indexC_k] < 0 && lo[indexC_k] > -BT_INFINITY)
+ {
+ btScalar s2 = (lo[indexC_k] - x[indexC_k]) / scratchMem.delta_x[indexC_k];
+ if (s2 < s)
+ {
+ s = s2;
+ cmd = 5;
+ si = indexC_k;
+ }
+ }
+ if (scratchMem.delta_x[indexC_k] > 0 && hi[indexC_k] < BT_INFINITY)
+ {
+ btScalar s2 = (hi[indexC_k] - x[indexC_k]) / scratchMem.delta_x[indexC_k];
+ if (s2 < s)
+ {
+ s = s2;
+ cmd = 6;
+ si = indexC_k;
+ }
+ }
+ }
+ }
+
+ //static char* cmdstring[8] = {0,"->C","->NL","->NH","N->C",
+ // "C->NL","C->NH"};
+ //printf ("cmd=%d (%s), si=%d\n",cmd,cmdstring[cmd],(cmd>3) ? si : i);
+
+ // if s <= 0 then we've got a problem. if we just keep going then
+ // we're going to get stuck in an infinite loop. instead, just cross
+ // our fingers and exit with the current solution.
+ if (s <= btScalar(0.0))
+ {
+ // printf("LCP internal error, s <= 0 (s=%.4e)",(double)s);
+ if (i < n)
+ {
+ btSetZero(x + i, n - i);
+ btSetZero(w + i, n - i);
+ }
+ s_error = true;
+ break;
+ }
+
+ // apply x = x + s * delta_x
+ lcp.pC_plusequals_s_times_qC(x, s, &scratchMem.delta_x[0]);
+ x[i] += s * dirf;
+
+ // apply w = w + s * delta_w
+ lcp.pN_plusequals_s_times_qN(w, s, &scratchMem.delta_w[0]);
+ w[i] += s * scratchMem.delta_w[i];
+
+ // void *tmpbuf;
+ // switch indexes between sets if necessary
+ switch (cmd)
+ {
+ case 1: // done
+ w[i] = 0;
+ lcp.transfer_i_to_C(i);
+ break;
+ case 2: // done
+ x[i] = lo[i];
+ scratchMem.state[i] = false;
+ lcp.transfer_i_to_N(i);
+ break;
+ case 3: // done
+ x[i] = hi[i];
+ scratchMem.state[i] = true;
+ lcp.transfer_i_to_N(i);
+ break;
+ case 4: // keep going
+ w[si] = 0;
+ lcp.transfer_i_from_N_to_C(si);
+ break;
+ case 5: // keep going
+ x[si] = lo[si];
+ scratchMem.state[si] = false;
+ lcp.transfer_i_from_C_to_N(si, scratchMem.m_scratch);
+ break;
+ case 6: // keep going
+ x[si] = hi[si];
+ scratchMem.state[si] = true;
+ lcp.transfer_i_from_C_to_N(si, scratchMem.m_scratch);
+ break;
+ }
+
+ if (cmd <= 3) break;
+ } // for (;;)
+ } // else
+
+ if (s_error)
+ {
+ break;
+ }
+ } // for (int i=adj_nub; i<n; ++i)
+ lcp.unpermute();
- return !s_error;
+ return !s_error;
}
-
diff --git a/thirdparty/bullet/BulletDynamics/MLCPSolvers/btDantzigLCP.h b/thirdparty/bullet/BulletDynamics/MLCPSolvers/btDantzigLCP.h
index 903832770a..8d9b2a13e9 100644
--- a/thirdparty/bullet/BulletDynamics/MLCPSolvers/btDantzigLCP.h
+++ b/thirdparty/bullet/BulletDynamics/MLCPSolvers/btDantzigLCP.h
@@ -41,7 +41,6 @@ to be implemented. the first `nub' variables are assumed to have findex < 0.
*/
-
#ifndef _BT_LCP_H_
#define _BT_LCP_H_
@@ -49,7 +48,6 @@ to be implemented. the first `nub' variables are assumed to have findex < 0.
#include <stdio.h>
#include <assert.h>
-
#include "LinearMath/btScalar.h"
#include "LinearMath/btAlignedObjectArray.h"
@@ -62,16 +60,14 @@ struct btDantzigScratchMemory
btAlignedObjectArray<btScalar> delta_x;
btAlignedObjectArray<btScalar> Dell;
btAlignedObjectArray<btScalar> ell;
- btAlignedObjectArray<btScalar*> Arows;
+ btAlignedObjectArray<btScalar *> Arows;
btAlignedObjectArray<int> p;
btAlignedObjectArray<int> C;
btAlignedObjectArray<bool> 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);
-
-
+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_
+#endif //_BT_LCP_H_
diff --git a/thirdparty/bullet/BulletDynamics/MLCPSolvers/btDantzigSolver.h b/thirdparty/bullet/BulletDynamics/MLCPSolvers/btDantzigSolver.h
index 2a2f2d3d32..1f669751ce 100644
--- a/thirdparty/bullet/BulletDynamics/MLCPSolvers/btDantzigSolver.h
+++ b/thirdparty/bullet/BulletDynamics/MLCPSolvers/btDantzigSolver.h
@@ -20,30 +20,28 @@ subject to the following restrictions:
#include "btMLCPSolverInterface.h"
#include "btDantzigLCP.h"
-
class btDantzigSolver : public btMLCPSolverInterface
{
protected:
-
btScalar m_acceptableUpperLimitSolution;
- btAlignedObjectArray<char> m_tempBuffer;
+ btAlignedObjectArray<char> m_tempBuffer;
btAlignedObjectArray<btScalar> m_A;
btAlignedObjectArray<btScalar> m_b;
btAlignedObjectArray<btScalar> m_x;
btAlignedObjectArray<btScalar> m_lo;
btAlignedObjectArray<btScalar> m_hi;
- btAlignedObjectArray<int> m_dependencies;
+ btAlignedObjectArray<int> m_dependencies;
btDantzigScratchMemory m_scratchMemory;
-public:
+public:
btDantzigSolver()
- :m_acceptableUpperLimitSolution(btScalar(1000))
+ : m_acceptableUpperLimitSolution(btScalar(1000))
{
}
- virtual bool solveMLCP(const btMatrixXu & A, const btVectorXu & b, btVectorXu& x, const btVectorXu & lo,const btVectorXu & hi,const btAlignedObjectArray<int>& limitDependency, int numIterations, bool useSparsity = true)
+ virtual bool solveMLCP(const btMatrixXu& A, const btVectorXu& b, btVectorXu& x, const btVectorXu& lo, const btVectorXu& hi, const btAlignedObjectArray<int>& limitDependency, int numIterations, bool useSparsity = true)
{
bool result = true;
int n = b.rows();
@@ -52,14 +50,12 @@ public:
int nub = 0;
btAlignedObjectArray<btScalar> ww;
ww.resize(n);
-
const btScalar* Aptr = A.getBufferPointer();
- m_A.resize(n*n);
- for (int i=0;i<n*n;i++)
+ m_A.resize(n * n);
+ for (int i = 0; i < n * n; i++)
{
m_A[i] = Aptr[i];
-
}
m_b.resize(n);
@@ -67,7 +63,7 @@ public:
m_lo.resize(n);
m_hi.resize(n);
m_dependencies.resize(n);
- for (int i=0;i<n;i++)
+ for (int i = 0; i < n; i++)
{
m_lo[i] = lo[i];
m_hi[i] = hi[i];
@@ -76,13 +72,12 @@ public:
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);
+ 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++)
+ // printf("numAllocas = %d\n",numAllocas);
+ for (int i = 0; i < n; i++)
{
volatile btScalar xx = m_x[i];
if (xx != m_x[i])
@@ -98,15 +93,14 @@ public:
}
}
- for (int i=0;i<n;i++)
+ for (int i = 0; i < n; i++)
{
x[i] = m_x[i];
}
-
}
return result;
}
};
-#endif //BT_DANTZIG_SOLVER_H
+#endif //BT_DANTZIG_SOLVER_H
diff --git a/thirdparty/bullet/BulletDynamics/MLCPSolvers/btLemkeAlgorithm.cpp b/thirdparty/bullet/BulletDynamics/MLCPSolvers/btLemkeAlgorithm.cpp
index 1f4015c7c7..954ffaed75 100644
--- a/thirdparty/bullet/BulletDynamics/MLCPSolvers/btLemkeAlgorithm.cpp
+++ b/thirdparty/bullet/BulletDynamics/MLCPSolvers/btLemkeAlgorithm.cpp
@@ -19,64 +19,60 @@ subject to the following restrictions:
//Math library was replaced from fmatvec to a the file src/LinearMath/btMatrixX.h
//STL/std::vector replaced by btAlignedObjectArray
-
-
#include "btLemkeAlgorithm.h"
#undef BT_DEBUG_OSTREAM
#ifdef BT_DEBUG_OSTREAM
using namespace std;
-#endif //BT_DEBUG_OSTREAM
+#endif //BT_DEBUG_OSTREAM
btScalar btMachEps()
{
- static bool calculated=false;
+ static bool calculated = false;
static btScalar machEps = btScalar(1.);
if (!calculated)
{
- do {
+ do
+ {
machEps /= btScalar(2.0);
// If next epsilon yields 1, then break, because current
// epsilon is the machine epsilon.
- }
- while ((btScalar)(1.0 + (machEps/btScalar(2.0))) != btScalar(1.0));
-// printf( "\nCalculated Machine epsilon: %G\n", machEps );
- calculated=true;
+ } while ((btScalar)(1.0 + (machEps / btScalar(2.0))) != btScalar(1.0));
+ // printf( "\nCalculated Machine epsilon: %G\n", machEps );
+ calculated = true;
}
return machEps;
}
-btScalar btEpsRoot() {
-
+btScalar btEpsRoot()
+{
static btScalar epsroot = 0.;
static bool alreadyCalculated = false;
-
- if (!alreadyCalculated) {
+
+ if (!alreadyCalculated)
+ {
epsroot = btSqrt(btMachEps());
alreadyCalculated = true;
}
return epsroot;
}
-
-
- btVectorXu btLemkeAlgorithm::solve(unsigned int maxloops /* = 0*/)
+btVectorXu btLemkeAlgorithm::solve(unsigned int maxloops /* = 0*/)
{
-
-
- steps = 0;
+ steps = 0;
- int dim = m_q.size();
+ int dim = m_q.size();
#ifdef BT_DEBUG_OSTREAM
- if(DEBUGLEVEL >= 1) {
- cout << "Dimension = " << dim << endl;
- }
-#endif //BT_DEBUG_OSTREAM
+ if (DEBUGLEVEL >= 1)
+ {
+ cout << "Dimension = " << dim << endl;
+ }
+#endif //BT_DEBUG_OSTREAM
btVectorXu solutionVector(2 * dim);
solutionVector.setZero();
-
- //, INIT, 0.);
+
+ //, INIT, 0.);
btMatrixXu ident(dim, dim);
ident.setIdentity();
@@ -85,287 +81,289 @@ btScalar btEpsRoot() {
#endif
btMatrixXu mNeg = m_M.negative();
-
- btMatrixXu A(dim, 2 * dim + 2);
+
+ btMatrixXu A(dim, 2 * dim + 2);
//
- A.setSubMatrix(0, 0, dim - 1, dim - 1,ident);
- A.setSubMatrix(0, dim, dim - 1, 2 * dim - 1,mNeg);
+ A.setSubMatrix(0, 0, dim - 1, dim - 1, ident);
+ A.setSubMatrix(0, dim, dim - 1, 2 * dim - 1, mNeg);
A.setSubMatrix(0, 2 * dim, dim - 1, 2 * dim, -1.f);
- A.setSubMatrix(0, 2 * dim + 1, dim - 1, 2 * dim + 1,m_q);
+ A.setSubMatrix(0, 2 * dim + 1, dim - 1, 2 * dim + 1, m_q);
#ifdef BT_DEBUG_OSTREAM
cout << A << std::endl;
-#endif //BT_DEBUG_OSTREAM
+#endif //BT_DEBUG_OSTREAM
+ // btVectorXu q_;
+ // q_ >> A(0, 2 * dim + 1, dim - 1, 2 * dim + 1);
- // btVectorXu q_;
- // q_ >> A(0, 2 * dim + 1, dim - 1, 2 * dim + 1);
-
- btAlignedObjectArray<int> basis;
- //At first, all w-values are in the basis
- for (int i = 0; i < dim; i++)
- basis.push_back(i);
+ btAlignedObjectArray<int> basis;
+ //At first, all w-values are in the basis
+ for (int i = 0; i < dim; i++)
+ basis.push_back(i);
int pivotRowIndex = -1;
btScalar minValue = 1e30f;
bool greaterZero = true;
- for (int i=0;i<dim;i++)
+ for (int i = 0; i < dim; i++)
{
- btScalar v =A(i,2*dim+1);
- if (v<minValue)
+ btScalar v = A(i, 2 * dim + 1);
+ if (v < minValue)
{
- minValue=v;
+ minValue = v;
pivotRowIndex = i;
}
- if (v<0)
+ if (v < 0)
greaterZero = false;
}
-
-
- // int pivotRowIndex = q_.minIndex();//minIndex(q_); // first row is that with lowest q-value
- int z0Row = pivotRowIndex; // remember the col of z0 for ending algorithm afterwards
- int pivotColIndex = 2 * dim; // first col is that of z0
+ // int pivotRowIndex = q_.minIndex();//minIndex(q_); // first row is that with lowest q-value
+ int z0Row = pivotRowIndex; // remember the col of z0 for ending algorithm afterwards
+ int pivotColIndex = 2 * dim; // first col is that of z0
#ifdef BT_DEBUG_OSTREAM
- if (DEBUGLEVEL >= 3)
+ if (DEBUGLEVEL >= 3)
{
- // cout << "A: " << A << endl;
- cout << "pivotRowIndex " << pivotRowIndex << endl;
- cout << "pivotColIndex " << pivotColIndex << endl;
- cout << "Basis: ";
- for (int i = 0; i < basis.size(); i++)
- cout << basis[i] << " ";
- cout << endl;
- }
-#endif //BT_DEBUG_OSTREAM
+ // cout << "A: " << A << endl;
+ cout << "pivotRowIndex " << pivotRowIndex << endl;
+ cout << "pivotColIndex " << pivotColIndex << endl;
+ cout << "Basis: ";
+ for (int i = 0; i < basis.size(); i++)
+ cout << basis[i] << " ";
+ cout << endl;
+ }
+#endif //BT_DEBUG_OSTREAM
if (!greaterZero)
{
+ if (maxloops == 0)
+ {
+ maxloops = 100;
+ // maxloops = UINT_MAX; //TODO: not a really nice way, problem is: maxloops should be 2^dim (=1<<dim), but this could exceed UINT_MAX and thus the result would be 0 and therefore the lemke algorithm wouldn't start but probably would find a solution within less then UINT_MAX steps. Therefore this constant is used as a upper border right now...
+ }
- if (maxloops == 0) {
- maxloops = 100;
-// maxloops = UINT_MAX; //TODO: not a really nice way, problem is: maxloops should be 2^dim (=1<<dim), but this could exceed UINT_MAX and thus the result would be 0 and therefore the lemke algorithm wouldn't start but probably would find a solution within less then UINT_MAX steps. Therefore this constant is used as a upper border right now...
- }
-
- /*start looping*/
- for(steps = 0; steps < maxloops; steps++) {
-
- GaussJordanEliminationStep(A, pivotRowIndex, pivotColIndex, basis);
-#ifdef BT_DEBUG_OSTREAM
- if (DEBUGLEVEL >= 3) {
- // cout << "A: " << A << endl;
- cout << "pivotRowIndex " << pivotRowIndex << endl;
- cout << "pivotColIndex " << pivotColIndex << endl;
- cout << "Basis: ";
- for (int i = 0; i < basis.size(); i++)
- cout << basis[i] << " ";
- cout << endl;
- }
-#endif //BT_DEBUG_OSTREAM
-
- int pivotColIndexOld = pivotColIndex;
-
- /*find new column index */
- if (basis[pivotRowIndex] < dim) //if a w-value left the basis get in the correspondent z-value
- pivotColIndex = basis[pivotRowIndex] + dim;
- else
- //else do it the other way round and get in the corresponding w-value
- pivotColIndex = basis[pivotRowIndex] - dim;
-
- /*the column becomes part of the basis*/
- basis[pivotRowIndex] = pivotColIndexOld;
-
- pivotRowIndex = findLexicographicMinimum(A, pivotColIndex);
-
- if(z0Row == pivotRowIndex) { //if z0 leaves the basis the solution is found --> one last elimination step is necessary
- GaussJordanEliminationStep(A, pivotRowIndex, pivotColIndex, basis);
- basis[pivotRowIndex] = pivotColIndex; //update basis
- break;
- }
-
- }
+ /*start looping*/
+ for (steps = 0; steps < maxloops; steps++)
+ {
+ GaussJordanEliminationStep(A, pivotRowIndex, pivotColIndex, basis);
#ifdef BT_DEBUG_OSTREAM
- if(DEBUGLEVEL >= 1) {
- cout << "Number of loops: " << steps << endl;
- cout << "Number of maximal loops: " << maxloops << endl;
- }
-#endif //BT_DEBUG_OSTREAM
-
- if(!validBasis(basis)) {
- info = -1;
+ if (DEBUGLEVEL >= 3)
+ {
+ // cout << "A: " << A << endl;
+ cout << "pivotRowIndex " << pivotRowIndex << endl;
+ cout << "pivotColIndex " << pivotColIndex << endl;
+ cout << "Basis: ";
+ for (int i = 0; i < basis.size(); i++)
+ cout << basis[i] << " ";
+ cout << endl;
+ }
+#endif //BT_DEBUG_OSTREAM
+
+ int pivotColIndexOld = pivotColIndex;
+
+ /*find new column index */
+ if (basis[pivotRowIndex] < dim) //if a w-value left the basis get in the correspondent z-value
+ pivotColIndex = basis[pivotRowIndex] + dim;
+ else
+ //else do it the other way round and get in the corresponding w-value
+ pivotColIndex = basis[pivotRowIndex] - dim;
+
+ /*the column becomes part of the basis*/
+ basis[pivotRowIndex] = pivotColIndexOld;
+
+ pivotRowIndex = findLexicographicMinimum(A, pivotColIndex);
+
+ if (z0Row == pivotRowIndex)
+ { //if z0 leaves the basis the solution is found --> one last elimination step is necessary
+ GaussJordanEliminationStep(A, pivotRowIndex, pivotColIndex, basis);
+ basis[pivotRowIndex] = pivotColIndex; //update basis
+ break;
+ }
+ }
#ifdef BT_DEBUG_OSTREAM
- if(DEBUGLEVEL >= 1)
- cerr << "Lemke-Algorithm ended with Ray-Termination (no valid solution)." << endl;
-#endif //BT_DEBUG_OSTREAM
+ if (DEBUGLEVEL >= 1)
+ {
+ cout << "Number of loops: " << steps << endl;
+ cout << "Number of maximal loops: " << maxloops << endl;
+ }
+#endif //BT_DEBUG_OSTREAM
- return solutionVector;
- }
+ if (!validBasis(basis))
+ {
+ info = -1;
+#ifdef BT_DEBUG_OSTREAM
+ if (DEBUGLEVEL >= 1)
+ cerr << "Lemke-Algorithm ended with Ray-Termination (no valid solution)." << endl;
+#endif //BT_DEBUG_OSTREAM
- }
+ return solutionVector;
+ }
+ }
#ifdef BT_DEBUG_OSTREAM
- if (DEBUGLEVEL >= 2) {
- // cout << "A: " << A << endl;
- cout << "pivotRowIndex " << pivotRowIndex << endl;
- cout << "pivotColIndex " << pivotColIndex << endl;
- }
-#endif //BT_DEBUG_OSTREAM
-
- for (int i = 0; i < basis.size(); i++)
+ if (DEBUGLEVEL >= 2)
{
- solutionVector[basis[i]] = A(i,2*dim+1);//q_[i];
+ // cout << "A: " << A << endl;
+ cout << "pivotRowIndex " << pivotRowIndex << endl;
+ cout << "pivotColIndex " << pivotColIndex << endl;
}
+#endif //BT_DEBUG_OSTREAM
- info = 0;
+ for (int i = 0; i < basis.size(); i++)
+ {
+ solutionVector[basis[i]] = A(i, 2 * dim + 1); //q_[i];
+ }
- return solutionVector;
- }
+ info = 0;
- int btLemkeAlgorithm::findLexicographicMinimum(const btMatrixXu& A, const int & pivotColIndex) {
- int RowIndex = 0;
- int dim = A.rows();
- btAlignedObjectArray<btVectorXu> Rows;
- for (int row = 0; row < dim; row++)
- {
+ return solutionVector;
+}
- btVectorXu vec(dim + 1);
- vec.setZero();//, INIT, 0.)
- Rows.push_back(vec);
- btScalar a = A(row, pivotColIndex);
- if (a > 0) {
- Rows[row][0] = A(row, 2 * dim + 1) / a;
- Rows[row][1] = A(row, 2 * dim) / a;
- for (int j = 2; j < dim + 1; j++)
- Rows[row][j] = A(row, j - 1) / a;
+int btLemkeAlgorithm::findLexicographicMinimum(const btMatrixXu& A, const int& pivotColIndex)
+{
+ int RowIndex = 0;
+ int dim = A.rows();
+ btAlignedObjectArray<btVectorXu> Rows;
+ for (int row = 0; row < dim; row++)
+ {
+ btVectorXu vec(dim + 1);
+ vec.setZero(); //, INIT, 0.)
+ Rows.push_back(vec);
+ btScalar a = A(row, pivotColIndex);
+ if (a > 0)
+ {
+ Rows[row][0] = A(row, 2 * dim + 1) / a;
+ Rows[row][1] = A(row, 2 * dim) / a;
+ for (int j = 2; j < dim + 1; j++)
+ Rows[row][j] = A(row, j - 1) / a;
#ifdef BT_DEBUG_OSTREAM
- // if (DEBUGLEVEL) {
- // cout << "Rows(" << row << ") = " << Rows[row] << endl;
+ // if (DEBUGLEVEL) {
+ // cout << "Rows(" << row << ") = " << Rows[row] << endl;
// }
-#endif
- }
- }
-
- for (int i = 0; i < Rows.size(); i++)
- {
- if (Rows[i].nrm2() > 0.) {
-
- int j = 0;
- for (; j < Rows.size(); j++)
- {
- if(i != j)
- {
- if(Rows[j].nrm2() > 0.)
- {
- btVectorXu test(dim + 1);
- for (int ii=0;ii<dim+1;ii++)
- {
- test[ii] = Rows[j][ii] - Rows[i][ii];
- }
-
- //=Rows[j] - Rows[i]
- if (! LexicographicPositive(test))
- break;
- }
- }
- }
-
- if (j == Rows.size())
- {
- RowIndex += i;
- break;
- }
- }
- }
-
- return RowIndex;
- }
-
- bool btLemkeAlgorithm::LexicographicPositive(const btVectorXu & v)
-{
- int i = 0;
- // if (DEBUGLEVEL)
- // cout << "v " << v << endl;
+#endif
+ }
+ }
- while(i < v.size()-1 && fabs(v[i]) < btMachEps())
- i++;
- if (v[i] > 0)
- return true;
+ for (int i = 0; i < Rows.size(); i++)
+ {
+ if (Rows[i].nrm2() > 0.)
+ {
+ int j = 0;
+ for (; j < Rows.size(); j++)
+ {
+ if (i != j)
+ {
+ if (Rows[j].nrm2() > 0.)
+ {
+ btVectorXu test(dim + 1);
+ for (int ii = 0; ii < dim + 1; ii++)
+ {
+ test[ii] = Rows[j][ii] - Rows[i][ii];
+ }
+
+ //=Rows[j] - Rows[i]
+ if (!LexicographicPositive(test))
+ break;
+ }
+ }
+ }
+
+ if (j == Rows.size())
+ {
+ RowIndex += i;
+ break;
+ }
+ }
+ }
- return false;
- }
+ return RowIndex;
+}
-void btLemkeAlgorithm::GaussJordanEliminationStep(btMatrixXu& A, int pivotRowIndex, int pivotColumnIndex, const btAlignedObjectArray<int>& basis)
+bool btLemkeAlgorithm::LexicographicPositive(const btVectorXu& v)
{
+ int i = 0;
+ // if (DEBUGLEVEL)
+ // cout << "v " << v << endl;
+
+ while (i < v.size() - 1 && fabs(v[i]) < btMachEps())
+ i++;
+ if (v[i] > 0)
+ return true;
+ return false;
+}
+
+void btLemkeAlgorithm::GaussJordanEliminationStep(btMatrixXu& A, int pivotRowIndex, int pivotColumnIndex, const btAlignedObjectArray<int>& basis)
+{
btScalar a = -1 / A(pivotRowIndex, pivotColumnIndex);
#ifdef BT_DEBUG_OSTREAM
cout << A << std::endl;
#endif
- for (int i = 0; i < A.rows(); i++)
+ for (int i = 0; i < A.rows(); i++)
{
- if (i != pivotRowIndex)
- {
- for (int j = 0; j < A.cols(); j++)
+ if (i != pivotRowIndex)
{
- if (j != pivotColumnIndex)
- {
- btScalar v = A(i, j);
- v += A(pivotRowIndex, j) * A(i, pivotColumnIndex) * a;
- A.setElem(i, j, v);
- }
+ for (int j = 0; j < A.cols(); j++)
+ {
+ if (j != pivotColumnIndex)
+ {
+ btScalar v = A(i, j);
+ v += A(pivotRowIndex, j) * A(i, pivotColumnIndex) * a;
+ A.setElem(i, j, v);
+ }
+ }
}
- }
}
#ifdef BT_DEBUG_OSTREAM
cout << A << std::endl;
-#endif //BT_DEBUG_OSTREAM
- for (int i = 0; i < A.cols(); i++)
+#endif //BT_DEBUG_OSTREAM
+ for (int i = 0; i < A.cols(); i++)
{
- A.mulElem(pivotRowIndex, i,-a);
- }
+ A.mulElem(pivotRowIndex, i, -a);
+ }
#ifdef BT_DEBUG_OSTREAM
cout << A << std::endl;
-#endif //#ifdef BT_DEBUG_OSTREAM
+#endif //#ifdef BT_DEBUG_OSTREAM
- for (int i = 0; i < A.rows(); i++)
+ for (int i = 0; i < A.rows(); i++)
{
- if (i != pivotRowIndex)
- {
- A.setElem(i, pivotColumnIndex,0);
- }
+ if (i != pivotRowIndex)
+ {
+ A.setElem(i, pivotColumnIndex, 0);
+ }
}
#ifdef BT_DEBUG_OSTREAM
cout << A << std::endl;
-#endif //#ifdef BT_DEBUG_OSTREAM
- }
+#endif //#ifdef BT_DEBUG_OSTREAM
+}
- bool btLemkeAlgorithm::greaterZero(const btVectorXu & vector)
+bool btLemkeAlgorithm::greaterZero(const btVectorXu& vector)
{
- bool isGreater = true;
- for (int i = 0; i < vector.size(); i++) {
- if (vector[i] < 0) {
- isGreater = false;
- break;
- }
- }
-
- return isGreater;
- }
-
- bool btLemkeAlgorithm::validBasis(const btAlignedObjectArray<int>& basis)
- {
- bool isValid = true;
- for (int i = 0; i < basis.size(); i++) {
- if (basis[i] >= basis.size() * 2) { //then z0 is in the base
- isValid = false;
- break;
- }
- }
-
- return isValid;
- }
+ bool isGreater = true;
+ for (int i = 0; i < vector.size(); i++)
+ {
+ if (vector[i] < 0)
+ {
+ isGreater = false;
+ break;
+ }
+ }
+ return isGreater;
+}
+bool btLemkeAlgorithm::validBasis(const btAlignedObjectArray<int>& basis)
+{
+ bool isValid = true;
+ for (int i = 0; i < basis.size(); i++)
+ {
+ if (basis[i] >= basis.size() * 2)
+ { //then z0 is in the base
+ isValid = false;
+ break;
+ }
+ }
+
+ return isValid;
+}
diff --git a/thirdparty/bullet/BulletDynamics/MLCPSolvers/btLemkeAlgorithm.h b/thirdparty/bullet/BulletDynamics/MLCPSolvers/btLemkeAlgorithm.h
index 7555cd9d20..3c6bf72a23 100644
--- a/thirdparty/bullet/BulletDynamics/MLCPSolvers/btLemkeAlgorithm.h
+++ b/thirdparty/bullet/BulletDynamics/MLCPSolvers/btLemkeAlgorithm.h
@@ -19,90 +19,84 @@ subject to the following restrictions:
//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 <vector> //todo: replace by btAlignedObjectArray
+#include <vector> //todo: replace by btAlignedObjectArray
class btLemkeAlgorithm
{
public:
-
-
- btLemkeAlgorithm(const btMatrixXu& M_, const btVectorXu& q_, const int & DEBUGLEVEL_ = 0) :
- DEBUGLEVEL(DEBUGLEVEL_)
- {
- setSystem(M_, q_);
- }
+ btLemkeAlgorithm(const btMatrixXu& M_, const btVectorXu& q_, const int& DEBUGLEVEL_ = 0) : DEBUGLEVEL(DEBUGLEVEL_)
+ {
+ setSystem(M_, q_);
+ }
- /* GETTER / SETTER */
- /**
+ /* GETTER / SETTER */
+ /**
* \brief return info of solution process
*/
- int getInfo() {
- return info;
- }
+ int getInfo()
+ {
+ return info;
+ }
- /**
+ /**
* \brief get the number of steps until the solution was found
*/
- int getSteps(void) {
- return steps;
- }
-
-
+ int getSteps(void)
+ {
+ return steps;
+ }
- /**
+ /**
* \brief set system with Matrix M and vector q
*/
- void setSystem(const btMatrixXu & M_, const btVectorXu & 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);
+ btVectorXu solve(unsigned int maxloops = 0);
- virtual ~btLemkeAlgorithm() {
- }
+ 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<int>& basis);
- bool greaterZero(const btVectorXu & vector);
- bool validBasis(const btAlignedObjectArray<int>& basis);
+ int findLexicographicMinimum(const btMatrixXu& A, const int& pivotColIndex);
+ bool LexicographicPositive(const btVectorXu& v);
+ void GaussJordanEliminationStep(btMatrixXu& A, int pivotRowIndex, int pivotColumnIndex, const btAlignedObjectArray<int>& basis);
+ bool greaterZero(const btVectorXu& vector);
+ bool validBasis(const btAlignedObjectArray<int>& basis);
- btMatrixXu m_M;
- btVectorXu m_q;
+ btMatrixXu m_M;
+ btVectorXu m_q;
- /**
+ /**
* \brief number of steps until the Lemke algorithm found a solution
*/
- unsigned int steps;
+ unsigned int steps;
- /**
+ /**
* \brief define level of debug output
*/
- int DEBUGLEVEL;
+ int DEBUGLEVEL;
- /**
+ /**
* \brief did the algorithm find a solution
*
* -1 : not successful
* 0 : successful
*/
- int info;
+ int info;
};
-
#endif /* BT_NUMERICS_LEMKE_ALGORITHM_H_ */
diff --git a/thirdparty/bullet/BulletDynamics/MLCPSolvers/btLemkeSolver.h b/thirdparty/bullet/BulletDynamics/MLCPSolvers/btLemkeSolver.h
index 98484c3796..3f215e56bb 100644
--- a/thirdparty/bullet/BulletDynamics/MLCPSolvers/btLemkeSolver.h
+++ b/thirdparty/bullet/BulletDynamics/MLCPSolvers/btLemkeSolver.h
@@ -17,334 +17,322 @@ subject to the following restrictions:
#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;
-
-
+ 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)
+ : 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<int>& limitDependency, int numIterations, bool useSparsity = true)
+ virtual bool solveMLCP(const btMatrixXu& A, const btVectorXu& b, btVectorXu& x, const btVectorXu& lo, const btVectorXu& hi, const btAlignedObjectArray<int>& limitDependency, int numIterations, bool useSparsity = true)
{
-
if (m_useLoHighBounds)
{
+ BT_PROFILE("btLemkeSolver::solveMLCP");
+ int n = A.rows();
+ if (0 == n)
+ return true;
- 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];
- }
+ 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;
+ // cout << "A" << endl;
+ // cout << A << endl;
/////////////////////////////////////
//slow matrix inversion, replace with LU decomposition
btMatrixXu A1;
- btMatrixXu B(n,n);
+ btMatrixXu B(n, n);
{
BT_PROFILE("inverse(slow)");
- A1.resize(A.rows(),A.cols());
- for (int row=0;row<A.rows();row++)
+ A1.resize(A.rows(), A.cols());
+ for (int row = 0; row < A.rows(); row++)
{
- for (int col=0;col<A.cols();col++)
+ for (int col = 0; col < A.cols(); col++)
{
- A1.setElem(row,col,A(row,col));
+ A1.setElem(row, col, A(row, col));
}
}
btMatrixXu matrix;
- matrix.resize(n,2*n);
- for (int row=0;row<n;row++)
+ matrix.resize(n, 2 * n);
+ for (int row = 0; row < n; row++)
{
- for (int col=0;col<n;col++)
+ for (int col = 0; col < n; col++)
{
- matrix.setElem(row,col,A1(row,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);
+ 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)
+ for (i = 0; i < n; i++)
+ {
+ for (j = 0; j < n; j++)
{
- btScalar v = matrix(i,i);
- if (btFuzzyZero(v))
+ if (i != j)
{
- 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));
+ 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))
+ for (i = 0; i < n; i++)
{
- a = 0.000001f;
- }
- btScalar invA = 1.f/a;
- for(j = 0; j < 2*n; j++){
- matrix.mulElem(i,j,invA);
+ 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 row = 0; row < n; row++)
{
- for (int col=0;col<n;col++)
+ for (int col = 0; col < n; col++)
{
- B.setElem(row,col,matrix(row,n+col));
+ B.setElem(row, col, matrix(row, n + col));
}
}
}
- btMatrixXu b1(n,1);
+ 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++)
+ btMatrixXu M(n * 2, n * 2);
+ for (int row = 0; row < n; row++)
{
- 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);
-
+ 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)' ]'
+ 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 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;
+ 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 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;
+ btMatrixXu x1;
- x1 = B*(y1_b1);
-
- for (int row=0;row<n;row++)
- {
- solution[row] = x1(row,0);//n];
- }
+ x1 = B * (y1_b1);
- 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)
+ for (int row = 0; row < n; row++)
{
- //printf("Lemke result is #NAN\n");
- x.setZero();
- return false;
+ solution[row] = x1(row, 0); //n];
}
-
- //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)
+
+ int errorIndexMax = -1;
+ int errorIndexMin = -1;
+ float errorValueMax = -1e30;
+ float errorValueMin = 1e30;
+
+ for (int i = 0; i < n; i++)
{
- if (x[i]> errorValueMax)
+ 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)
{
- fail = true;
- errorIndexMax = i;
- errorValueMax = x[i];
+ if (x[i] < errorValueMin)
+ {
+ errorIndexMin = i;
+ errorValueMin = x[i];
+ fail = true;
+ //printf("x[i] = %f,",x[i]);
+ }
}
- ////printf("x[i] = %f,",x[i]);
}
- if (x[i]<-m_maxValue)
+ if (fail)
{
- if (x[i]<errorValueMin)
+ 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++)
{
- errorIndexMin = i;
- errorValueMin = x[i];
- fail = true;
- //printf("x[i] = %f,",x[i]);
+ x[i] = 0.f;
}
}
+ return !fail;
}
- if (fail)
+ else
+
{
- 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)
+ if (0 == dimension)
+ return true;
+
+ // printf("================ solving using Lemke/Newton/Fixpoint\n");
+
+ btVectorXu q;
+ q.resize(dimension);
+ for (int row = 0; row < dimension; row++)
{
- x.setZero();
- return false;
+ q[row] = -b[row];
}
-
- //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)
+
+ 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++)
{
- if (x[i]> errorValueMax)
+ x[i] = solution[i + dimension];
+ volatile btScalar check = x[i];
+ if (x[i] != check)
{
- fail = true;
- errorIndexMax = i;
- errorValueMax = x[i];
+ x.setZero();
+ return false;
}
- ////printf("x[i] = %f,",x[i]);
- }
- if (x[i]<-m_maxValue)
- {
- if (x[i]<errorValueMin)
+
+ //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)
{
- errorIndexMin = i;
- errorValueMin = x[i];
- fail = true;
- //printf("x[i] = %f,",x[i]);
+ 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++)
+ if (fail)
{
- x[i]=0.f;
+ 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;
+ return !fail;
+ }
+ return true;
}
-
};
-#endif //BT_LEMKE_SOLVER_H
+#endif //BT_LEMKE_SOLVER_H
diff --git a/thirdparty/bullet/BulletDynamics/MLCPSolvers/btMLCPSolver.cpp b/thirdparty/bullet/BulletDynamics/MLCPSolvers/btMLCPSolver.cpp
index 8f54c52626..5d864f2757 100644
--- a/thirdparty/bullet/BulletDynamics/MLCPSolvers/btMLCPSolver.cpp
+++ b/thirdparty/bullet/BulletDynamics/MLCPSolvers/btMLCPSolver.cpp
@@ -19,10 +19,9 @@ subject to the following restrictions:
#include "LinearMath/btQuickprof.h"
#include "btSolveProjectedGaussSeidel.h"
-
-btMLCPSolver::btMLCPSolver( btMLCPSolverInterface* solver)
-:m_solver(solver),
-m_fallback(0)
+btMLCPSolver::btMLCPSolver(btMLCPSolverInterface* solver)
+ : m_solver(solver),
+ m_fallback(0)
{
}
@@ -33,67 +32,65 @@ btMLCPSolver::~btMLCPSolver()
bool gUseMatrixMultiply = false;
bool interleaveContactAndFriction = false;
-btScalar btMLCPSolver::solveGroupCacheFriendlySetup(btCollisionObject** bodies, int numBodiesUnUsed, btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer)
+btScalar btMLCPSolver::solveGroupCacheFriendlySetup(btCollisionObject** bodies, int numBodiesUnUsed, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer)
{
- btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup( bodies, numBodiesUnUsed, manifoldPtr, numManifolds,constraints,numConstraints,infoGlobal,debugDrawer);
+ btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(bodies, numBodiesUnUsed, manifoldPtr, numManifolds, constraints, numConstraints, infoGlobal, debugDrawer);
{
BT_PROFILE("gather constraint data");
- int numFrictionPerContact = m_tmpSolverContactConstraintPool.size()==m_tmpSolverContactFrictionConstraintPool.size()? 1 : 2;
-
+ int numFrictionPerContact = m_tmpSolverContactConstraintPool.size() == m_tmpSolverContactFrictionConstraintPool.size() ? 1 : 2;
- // int numBodies = m_tmpSolverBodyPool.size();
+ // int numBodies = m_tmpSolverBodyPool.size();
m_allConstraintPtrArray.resize(0);
- m_limitDependencies.resize(m_tmpSolverNonContactConstraintPool.size()+m_tmpSolverContactConstraintPool.size()+m_tmpSolverContactFrictionConstraintPool.size());
- btAssert(m_limitDependencies.size() == m_tmpSolverNonContactConstraintPool.size()+m_tmpSolverContactConstraintPool.size()+m_tmpSolverContactFrictionConstraintPool.size());
- // printf("m_limitDependencies.size() = %d\n",m_limitDependencies.size());
+ m_limitDependencies.resize(m_tmpSolverNonContactConstraintPool.size() + m_tmpSolverContactConstraintPool.size() + m_tmpSolverContactFrictionConstraintPool.size());
+ btAssert(m_limitDependencies.size() == m_tmpSolverNonContactConstraintPool.size() + m_tmpSolverContactConstraintPool.size() + m_tmpSolverContactFrictionConstraintPool.size());
+ // printf("m_limitDependencies.size() = %d\n",m_limitDependencies.size());
int dindex = 0;
- for (int i=0;i<m_tmpSolverNonContactConstraintPool.size();i++)
+ for (int i = 0; i < m_tmpSolverNonContactConstraintPool.size(); i++)
{
m_allConstraintPtrArray.push_back(&m_tmpSolverNonContactConstraintPool[i]);
m_limitDependencies[dindex++] = -1;
}
-
+
///The btSequentialImpulseConstraintSolver moves all friction constraints at the very end, we can also interleave them instead
-
- int firstContactConstraintOffset=dindex;
+
+ int firstContactConstraintOffset = dindex;
if (interleaveContactAndFriction)
{
- for (int i=0;i<m_tmpSolverContactConstraintPool.size();i++)
+ for (int i = 0; i < m_tmpSolverContactConstraintPool.size(); i++)
{
m_allConstraintPtrArray.push_back(&m_tmpSolverContactConstraintPool[i]);
m_limitDependencies[dindex++] = -1;
- m_allConstraintPtrArray.push_back(&m_tmpSolverContactFrictionConstraintPool[i*numFrictionPerContact]);
- int findex = (m_tmpSolverContactFrictionConstraintPool[i*numFrictionPerContact].m_frictionIndex*(1+numFrictionPerContact));
- m_limitDependencies[dindex++] = findex +firstContactConstraintOffset;
- if (numFrictionPerContact==2)
+ m_allConstraintPtrArray.push_back(&m_tmpSolverContactFrictionConstraintPool[i * numFrictionPerContact]);
+ int findex = (m_tmpSolverContactFrictionConstraintPool[i * numFrictionPerContact].m_frictionIndex * (1 + numFrictionPerContact));
+ m_limitDependencies[dindex++] = findex + firstContactConstraintOffset;
+ if (numFrictionPerContact == 2)
{
- m_allConstraintPtrArray.push_back(&m_tmpSolverContactFrictionConstraintPool[i*numFrictionPerContact+1]);
- m_limitDependencies[dindex++] = findex+firstContactConstraintOffset;
+ m_allConstraintPtrArray.push_back(&m_tmpSolverContactFrictionConstraintPool[i * numFrictionPerContact + 1]);
+ m_limitDependencies[dindex++] = findex + firstContactConstraintOffset;
}
}
- } else
+ }
+ else
{
- for (int i=0;i<m_tmpSolverContactConstraintPool.size();i++)
+ for (int i = 0; i < m_tmpSolverContactConstraintPool.size(); i++)
{
m_allConstraintPtrArray.push_back(&m_tmpSolverContactConstraintPool[i]);
m_limitDependencies[dindex++] = -1;
}
- for (int i=0;i<m_tmpSolverContactFrictionConstraintPool.size();i++)
+ for (int i = 0; i < m_tmpSolverContactFrictionConstraintPool.size(); i++)
{
m_allConstraintPtrArray.push_back(&m_tmpSolverContactFrictionConstraintPool[i]);
- m_limitDependencies[dindex++] = m_tmpSolverContactFrictionConstraintPool[i].m_frictionIndex+firstContactConstraintOffset;
+ m_limitDependencies[dindex++] = m_tmpSolverContactFrictionConstraintPool[i].m_frictionIndex + firstContactConstraintOffset;
}
-
}
-
if (!m_allConstraintPtrArray.size())
{
- m_A.resize(0,0);
+ m_A.resize(0, 0);
m_b.resize(0);
m_x.resize(0);
m_lo.resize(0);
@@ -102,7 +99,6 @@ btScalar btMLCPSolver::solveGroupCacheFriendlySetup(btCollisionObject** bodies,
}
}
-
if (gUseMatrixMultiply)
{
BT_PROFILE("createMLCP");
@@ -121,7 +117,7 @@ bool btMLCPSolver::solveMLCP(const btContactSolverInfo& infoGlobal)
{
bool result = true;
- if (m_A.rows()==0)
+ if (m_A.rows() == 0)
return true;
//if using split impulse, we solve 2 separate (M)LCPs
@@ -129,28 +125,26 @@ bool btMLCPSolver::solveMLCP(const btContactSolverInfo& infoGlobal)
{
btMatrixXu Acopy = m_A;
btAlignedObjectArray<int> limitDependenciesCopy = m_limitDependencies;
-// printf("solve first LCP\n");
- result = m_solver->solveMLCP(m_A, m_b, m_x, m_lo,m_hi, m_limitDependencies,infoGlobal.m_numIterations );
+ // printf("solve first LCP\n");
+ result = m_solver->solveMLCP(m_A, m_b, m_x, m_lo, m_hi, m_limitDependencies, infoGlobal.m_numIterations);
if (result)
- result = m_solver->solveMLCP(Acopy, m_bSplit, m_xSplit, m_lo,m_hi, limitDependenciesCopy,infoGlobal.m_numIterations );
-
- } else
+ result = m_solver->solveMLCP(Acopy, m_bSplit, m_xSplit, m_lo, m_hi, limitDependenciesCopy, infoGlobal.m_numIterations);
+ }
+ else
{
- result = m_solver->solveMLCP(m_A, m_b, m_x, m_lo,m_hi, m_limitDependencies,infoGlobal.m_numIterations );
+ result = m_solver->solveMLCP(m_A, m_b, m_x, m_lo, m_hi, m_limitDependencies, infoGlobal.m_numIterations);
}
return result;
}
struct btJointNode
{
- int jointIndex; // pointer to enclosing dxJoint object
- int otherBodyIndex; // *other* body this joint is connected to
- int nextJointNodeIndex;//-1 for null
+ int jointIndex; // pointer to enclosing dxJoint object
+ int otherBodyIndex; // *other* body this joint is connected to
+ int nextJointNodeIndex; //-1 for null
int constraintRowIndex;
};
-
-
void btMLCPSolver::createMLCPFast(const btContactSolverInfo& infoGlobal)
{
int numContactRows = interleaveContactAndFriction ? 3 : 1;
@@ -163,36 +157,36 @@ void btMLCPSolver::createMLCPFast(const btContactSolverInfo& infoGlobal)
m_bSplit.resize(numConstraintRows);
m_b.setZero();
m_bSplit.setZero();
- for (int i=0;i<numConstraintRows ;i++)
+ for (int i = 0; i < numConstraintRows; i++)
{
btScalar jacDiag = m_allConstraintPtrArray[i]->m_jacDiagABInv;
if (!btFuzzyZero(jacDiag))
{
btScalar rhs = m_allConstraintPtrArray[i]->m_rhs;
btScalar rhsPenetration = m_allConstraintPtrArray[i]->m_rhsPenetration;
- m_b[i]=rhs/jacDiag;
- m_bSplit[i] = rhsPenetration/jacDiag;
+ m_b[i] = rhs / jacDiag;
+ m_bSplit[i] = rhsPenetration / jacDiag;
}
-
}
}
-// btScalar* w = 0;
-// int nub = 0;
+ // btScalar* w = 0;
+ // int nub = 0;
m_lo.resize(numConstraintRows);
m_hi.resize(numConstraintRows);
-
+
{
BT_PROFILE("init lo/ho");
- for (int i=0;i<numConstraintRows;i++)
+ for (int i = 0; i < numConstraintRows; i++)
{
- if (0)//m_limitDependencies[i]>=0)
+ if (0) //m_limitDependencies[i]>=0)
{
m_lo[i] = -BT_INFINITY;
m_hi[i] = BT_INFINITY;
- } else
+ }
+ else
{
m_lo[i] = m_allConstraintPtrArray[i]->m_lowerLimit;
m_hi[i] = m_allConstraintPtrArray[i]->m_upperLimit;
@@ -201,48 +195,48 @@ void btMLCPSolver::createMLCPFast(const btContactSolverInfo& infoGlobal)
}
//
- int m=m_allConstraintPtrArray.size();
+ int m = m_allConstraintPtrArray.size();
int numBodies = m_tmpSolverBodyPool.size();
btAlignedObjectArray<int> bodyJointNodeArray;
{
BT_PROFILE("bodyJointNodeArray.resize");
- bodyJointNodeArray.resize(numBodies,-1);
+ bodyJointNodeArray.resize(numBodies, -1);
}
btAlignedObjectArray<btJointNode> jointNodeArray;
{
BT_PROFILE("jointNodeArray.reserve");
- jointNodeArray.reserve(2*m_allConstraintPtrArray.size());
+ jointNodeArray.reserve(2 * m_allConstraintPtrArray.size());
}
- btMatrixXu& J3 = m_scratchJ3;
+ btMatrixXu& J3 = m_scratchJ3;
{
BT_PROFILE("J3.resize");
- J3.resize(2*m,8);
+ J3.resize(2 * m, 8);
}
- btMatrixXu& JinvM3 = m_scratchJInvM3;
+ btMatrixXu& JinvM3 = m_scratchJInvM3;
{
BT_PROFILE("JinvM3.resize/setZero");
- JinvM3.resize(2*m,8);
+ JinvM3.resize(2 * m, 8);
JinvM3.setZero();
J3.setZero();
}
- int cur=0;
+ int cur = 0;
int rowOffset = 0;
- btAlignedObjectArray<int>& ofs = m_scratchOfs;
+ btAlignedObjectArray<int>& ofs = m_scratchOfs;
{
BT_PROFILE("ofs resize");
ofs.resize(0);
ofs.resizeNoInitialize(m_allConstraintPtrArray.size());
- }
+ }
{
BT_PROFILE("Compute J and JinvM");
- int c=0;
+ int c = 0;
int numRows = 0;
- for (int i=0;i<m_allConstraintPtrArray.size();i+=numRows,c++)
+ for (int i = 0; i < m_allConstraintPtrArray.size(); i += numRows, c++)
{
ofs[c] = rowOffset;
int sbA = m_allConstraintPtrArray[i]->m_solverBodyIdA;
@@ -250,14 +244,14 @@ void btMLCPSolver::createMLCPFast(const btContactSolverInfo& infoGlobal)
btRigidBody* orgBodyA = m_tmpSolverBodyPool[sbA].m_originalBody;
btRigidBody* orgBodyB = m_tmpSolverBodyPool[sbB].m_originalBody;
- numRows = i<m_tmpSolverNonContactConstraintPool.size() ? m_tmpConstraintSizesPool[c].m_numConstraintRows : numContactRows ;
+ numRows = i < m_tmpSolverNonContactConstraintPool.size() ? m_tmpConstraintSizesPool[c].m_numConstraintRows : numContactRows;
if (orgBodyA)
{
{
- int slotA=-1;
+ int slotA = -1;
//find free jointNode slot for sbA
- slotA =jointNodeArray.size();
- jointNodeArray.expand();//NonInitializing();
+ slotA = jointNodeArray.size();
+ jointNodeArray.expand(); //NonInitializing();
int prevSlot = bodyJointNodeArray[sbA];
bodyJointNodeArray[sbA] = slotA;
jointNodeArray[slotA].nextJointNodeIndex = prevSlot;
@@ -265,35 +259,35 @@ void btMLCPSolver::createMLCPFast(const btContactSolverInfo& infoGlobal)
jointNodeArray[slotA].constraintRowIndex = i;
jointNodeArray[slotA].otherBodyIndex = orgBodyB ? sbB : -1;
}
- for (int row=0;row<numRows;row++,cur++)
+ for (int row = 0; row < numRows; row++, cur++)
{
- btVector3 normalInvMass = m_allConstraintPtrArray[i+row]->m_contactNormal1 * orgBodyA->getInvMass();
- btVector3 relPosCrossNormalInvInertia = m_allConstraintPtrArray[i+row]->m_relpos1CrossNormal * orgBodyA->getInvInertiaTensorWorld();
+ btVector3 normalInvMass = m_allConstraintPtrArray[i + row]->m_contactNormal1 * orgBodyA->getInvMass();
+ btVector3 relPosCrossNormalInvInertia = m_allConstraintPtrArray[i + row]->m_relpos1CrossNormal * orgBodyA->getInvInertiaTensorWorld();
- for (int r=0;r<3;r++)
+ for (int r = 0; r < 3; r++)
{
- J3.setElem(cur,r,m_allConstraintPtrArray[i+row]->m_contactNormal1[r]);
- J3.setElem(cur,r+4,m_allConstraintPtrArray[i+row]->m_relpos1CrossNormal[r]);
- JinvM3.setElem(cur,r,normalInvMass[r]);
- JinvM3.setElem(cur,r+4,relPosCrossNormalInvInertia[r]);
+ J3.setElem(cur, r, m_allConstraintPtrArray[i + row]->m_contactNormal1[r]);
+ J3.setElem(cur, r + 4, m_allConstraintPtrArray[i + row]->m_relpos1CrossNormal[r]);
+ JinvM3.setElem(cur, r, normalInvMass[r]);
+ JinvM3.setElem(cur, r + 4, relPosCrossNormalInvInertia[r]);
}
- J3.setElem(cur,3,0);
- JinvM3.setElem(cur,3,0);
- J3.setElem(cur,7,0);
- JinvM3.setElem(cur,7,0);
+ J3.setElem(cur, 3, 0);
+ JinvM3.setElem(cur, 3, 0);
+ J3.setElem(cur, 7, 0);
+ JinvM3.setElem(cur, 7, 0);
}
- } else
+ }
+ else
{
cur += numRows;
}
if (orgBodyB)
{
-
{
- int slotB=-1;
+ int slotB = -1;
//find free jointNode slot for sbA
- slotB =jointNodeArray.size();
- jointNodeArray.expand();//NonInitializing();
+ slotB = jointNodeArray.size();
+ jointNodeArray.expand(); //NonInitializing();
int prevSlot = bodyJointNodeArray[sbB];
bodyJointNodeArray[sbB] = slotB;
jointNodeArray[slotB].nextJointNodeIndex = prevSlot;
@@ -302,78 +296,74 @@ void btMLCPSolver::createMLCPFast(const btContactSolverInfo& infoGlobal)
jointNodeArray[slotB].constraintRowIndex = i;
}
- for (int row=0;row<numRows;row++,cur++)
+ for (int row = 0; row < numRows; row++, cur++)
{
- btVector3 normalInvMassB = m_allConstraintPtrArray[i+row]->m_contactNormal2*orgBodyB->getInvMass();
- btVector3 relPosInvInertiaB = m_allConstraintPtrArray[i+row]->m_relpos2CrossNormal * orgBodyB->getInvInertiaTensorWorld();
+ btVector3 normalInvMassB = m_allConstraintPtrArray[i + row]->m_contactNormal2 * orgBodyB->getInvMass();
+ btVector3 relPosInvInertiaB = m_allConstraintPtrArray[i + row]->m_relpos2CrossNormal * orgBodyB->getInvInertiaTensorWorld();
- for (int r=0;r<3;r++)
+ for (int r = 0; r < 3; r++)
{
- J3.setElem(cur,r,m_allConstraintPtrArray[i+row]->m_contactNormal2[r]);
- J3.setElem(cur,r+4,m_allConstraintPtrArray[i+row]->m_relpos2CrossNormal[r]);
- JinvM3.setElem(cur,r,normalInvMassB[r]);
- JinvM3.setElem(cur,r+4,relPosInvInertiaB[r]);
+ J3.setElem(cur, r, m_allConstraintPtrArray[i + row]->m_contactNormal2[r]);
+ J3.setElem(cur, r + 4, m_allConstraintPtrArray[i + row]->m_relpos2CrossNormal[r]);
+ JinvM3.setElem(cur, r, normalInvMassB[r]);
+ JinvM3.setElem(cur, r + 4, relPosInvInertiaB[r]);
}
- J3.setElem(cur,3,0);
- JinvM3.setElem(cur,3,0);
- J3.setElem(cur,7,0);
- JinvM3.setElem(cur,7,0);
+ J3.setElem(cur, 3, 0);
+ JinvM3.setElem(cur, 3, 0);
+ J3.setElem(cur, 7, 0);
+ JinvM3.setElem(cur, 7, 0);
}
}
else
{
cur += numRows;
}
- rowOffset+=numRows;
-
+ rowOffset += numRows;
}
-
}
-
//compute JinvM = J*invM.
const btScalar* JinvM = JinvM3.getBufferPointer();
const btScalar* Jptr = J3.getBufferPointer();
{
BT_PROFILE("m_A.resize");
- m_A.resize(n,n);
+ m_A.resize(n, n);
}
-
+
{
BT_PROFILE("m_A.setZero");
m_A.setZero();
}
- int c=0;
+ int c = 0;
{
int numRows = 0;
BT_PROFILE("Compute A");
- for (int i=0;i<m_allConstraintPtrArray.size();i+= numRows,c++)
+ for (int i = 0; i < m_allConstraintPtrArray.size(); i += numRows, c++)
{
int row__ = ofs[c];
int sbA = m_allConstraintPtrArray[i]->m_solverBodyIdA;
int sbB = m_allConstraintPtrArray[i]->m_solverBodyIdB;
- // btRigidBody* orgBodyA = m_tmpSolverBodyPool[sbA].m_originalBody;
- // btRigidBody* orgBodyB = m_tmpSolverBodyPool[sbB].m_originalBody;
+ // btRigidBody* orgBodyA = m_tmpSolverBodyPool[sbA].m_originalBody;
+ // btRigidBody* orgBodyB = m_tmpSolverBodyPool[sbB].m_originalBody;
+
+ numRows = i < m_tmpSolverNonContactConstraintPool.size() ? m_tmpConstraintSizesPool[c].m_numConstraintRows : numContactRows;
- numRows = i<m_tmpSolverNonContactConstraintPool.size() ? m_tmpConstraintSizesPool[c].m_numConstraintRows : numContactRows ;
-
- const btScalar *JinvMrow = JinvM + 2*8*(size_t)row__;
+ const btScalar* JinvMrow = JinvM + 2 * 8 * (size_t)row__;
{
int startJointNodeA = bodyJointNodeArray[sbA];
- while (startJointNodeA>=0)
+ while (startJointNodeA >= 0)
{
int j0 = jointNodeArray[startJointNodeA].jointIndex;
int cr0 = jointNodeArray[startJointNodeA].constraintRowIndex;
- if (j0<c)
+ if (j0 < c)
{
-
int numRowsOther = cr0 < m_tmpSolverNonContactConstraintPool.size() ? m_tmpConstraintSizesPool[j0].m_numConstraintRows : numContactRows;
- size_t ofsother = (m_allConstraintPtrArray[cr0]->m_solverBodyIdB == sbA) ? 8*numRowsOther : 0;
+ size_t ofsother = (m_allConstraintPtrArray[cr0]->m_solverBodyIdB == sbA) ? 8 * numRowsOther : 0;
//printf("%d joint i %d and j0: %d: ",count++,i,j0);
- m_A.multiplyAdd2_p8r ( JinvMrow,
- Jptr + 2*8*(size_t)ofs[j0] + ofsother, numRows, numRowsOther, row__,ofs[j0]);
+ m_A.multiplyAdd2_p8r(JinvMrow,
+ Jptr + 2 * 8 * (size_t)ofs[j0] + ofsother, numRows, numRowsOther, row__, ofs[j0]);
}
startJointNodeA = jointNodeArray[startJointNodeA].nextJointNodeIndex;
}
@@ -381,17 +371,17 @@ void btMLCPSolver::createMLCPFast(const btContactSolverInfo& infoGlobal)
{
int startJointNodeB = bodyJointNodeArray[sbB];
- while (startJointNodeB>=0)
+ while (startJointNodeB >= 0)
{
int j1 = jointNodeArray[startJointNodeB].jointIndex;
int cj1 = jointNodeArray[startJointNodeB].constraintRowIndex;
- if (j1<c)
+ if (j1 < c)
{
- int numRowsOther = cj1 < m_tmpSolverNonContactConstraintPool.size() ? m_tmpConstraintSizesPool[j1].m_numConstraintRows : numContactRows;
- size_t ofsother = (m_allConstraintPtrArray[cj1]->m_solverBodyIdB == sbB) ? 8*numRowsOther : 0;
- m_A.multiplyAdd2_p8r ( JinvMrow + 8*(size_t)numRows,
- Jptr + 2*8*(size_t)ofs[j1] + ofsother, numRows, numRowsOther, row__,ofs[j1]);
+ int numRowsOther = cj1 < m_tmpSolverNonContactConstraintPool.size() ? m_tmpConstraintSizesPool[j1].m_numConstraintRows : numContactRows;
+ size_t ofsother = (m_allConstraintPtrArray[cj1]->m_solverBodyIdB == sbB) ? 8 * numRowsOther : 0;
+ m_A.multiplyAdd2_p8r(JinvMrow + 8 * (size_t)numRows,
+ Jptr + 2 * 8 * (size_t)ofs[j1] + ofsother, numRows, numRowsOther, row__, ofs[j1]);
}
startJointNodeB = jointNodeArray[startJointNodeB].nextJointNodeIndex;
}
@@ -402,27 +392,25 @@ void btMLCPSolver::createMLCPFast(const btContactSolverInfo& infoGlobal)
BT_PROFILE("compute diagonal");
// compute diagonal blocks of m_A
- int row__ = 0;
+ int row__ = 0;
int numJointRows = m_allConstraintPtrArray.size();
- int jj=0;
- for (;row__<numJointRows;)
+ int jj = 0;
+ for (; row__ < numJointRows;)
{
-
//int sbA = m_allConstraintPtrArray[row__]->m_solverBodyIdA;
int sbB = m_allConstraintPtrArray[row__]->m_solverBodyIdB;
- // btRigidBody* orgBodyA = m_tmpSolverBodyPool[sbA].m_originalBody;
+ // btRigidBody* orgBodyA = m_tmpSolverBodyPool[sbA].m_originalBody;
btRigidBody* orgBodyB = m_tmpSolverBodyPool[sbB].m_originalBody;
+ const unsigned int infom = row__ < m_tmpSolverNonContactConstraintPool.size() ? m_tmpConstraintSizesPool[jj].m_numConstraintRows : numContactRows;
- const unsigned int infom = row__ < m_tmpSolverNonContactConstraintPool.size() ? m_tmpConstraintSizesPool[jj].m_numConstraintRows : numContactRows;
-
- const btScalar *JinvMrow = JinvM + 2*8*(size_t)row__;
- const btScalar *Jrow = Jptr + 2*8*(size_t)row__;
- m_A.multiply2_p8r (JinvMrow, Jrow, infom, infom, row__,row__);
- if (orgBodyB)
+ const btScalar* JinvMrow = JinvM + 2 * 8 * (size_t)row__;
+ const btScalar* Jrow = Jptr + 2 * 8 * (size_t)row__;
+ m_A.multiply2_p8r(JinvMrow, Jrow, infom, infom, row__, row__);
+ if (orgBodyB)
{
- m_A.multiplyAdd2_p8r (JinvMrow + 8*(size_t)infom, Jrow + 8*(size_t)infom, infom, infom, row__,row__);
+ m_A.multiplyAdd2_p8r(JinvMrow + 8 * (size_t)infom, Jrow + 8 * (size_t)infom, infom, infom, row__, row__);
}
row__ += infom;
jj++;
@@ -433,12 +421,12 @@ void btMLCPSolver::createMLCPFast(const btContactSolverInfo& infoGlobal)
if (1)
{
// add cfm to the diagonal of m_A
- for ( int i=0; i<m_A.rows(); ++i)
+ for (int i = 0; i < m_A.rows(); ++i)
{
- m_A.setElem(i,i,m_A(i,i)+ infoGlobal.m_globalCfm/ infoGlobal.m_timeStep);
+ m_A.setElem(i, i, m_A(i, i) + infoGlobal.m_globalCfm / infoGlobal.m_timeStep);
}
}
-
+
///fill the upper triangle of the matrix, to make it symmetric
{
BT_PROFILE("fill the upper triangle ");
@@ -450,21 +438,21 @@ void btMLCPSolver::createMLCPFast(const btContactSolverInfo& infoGlobal)
m_x.resize(numConstraintRows);
m_xSplit.resize(numConstraintRows);
- if (infoGlobal.m_solverMode&SOLVER_USE_WARMSTARTING)
+ if (infoGlobal.m_solverMode & SOLVER_USE_WARMSTARTING)
{
- for (int i=0;i<m_allConstraintPtrArray.size();i++)
+ for (int i = 0; i < m_allConstraintPtrArray.size(); i++)
{
const btSolverConstraint& c = *m_allConstraintPtrArray[i];
- m_x[i]=c.m_appliedImpulse;
+ m_x[i] = c.m_appliedImpulse;
m_xSplit[i] = c.m_appliedPushImpulse;
}
- } else
+ }
+ else
{
m_x.setZero();
m_xSplit.setZero();
}
}
-
}
void btMLCPSolver::createMLCP(const btContactSolverInfo& infoGlobal)
@@ -475,120 +463,116 @@ void btMLCPSolver::createMLCP(const btContactSolverInfo& infoGlobal)
m_b.resize(numConstraintRows);
if (infoGlobal.m_splitImpulse)
m_bSplit.resize(numConstraintRows);
-
+
m_bSplit.setZero();
m_b.setZero();
- for (int i=0;i<numConstraintRows ;i++)
+ for (int i = 0; i < numConstraintRows; i++)
{
if (m_allConstraintPtrArray[i]->m_jacDiagABInv)
{
- m_b[i]=m_allConstraintPtrArray[i]->m_rhs/m_allConstraintPtrArray[i]->m_jacDiagABInv;
+ m_b[i] = m_allConstraintPtrArray[i]->m_rhs / m_allConstraintPtrArray[i]->m_jacDiagABInv;
if (infoGlobal.m_splitImpulse)
- m_bSplit[i] = m_allConstraintPtrArray[i]->m_rhsPenetration/m_allConstraintPtrArray[i]->m_jacDiagABInv;
+ m_bSplit[i] = m_allConstraintPtrArray[i]->m_rhsPenetration / m_allConstraintPtrArray[i]->m_jacDiagABInv;
}
}
-
- btMatrixXu& Minv = m_scratchMInv;
- Minv.resize(6*numBodies,6*numBodies);
+
+ btMatrixXu& Minv = m_scratchMInv;
+ Minv.resize(6 * numBodies, 6 * numBodies);
Minv.setZero();
- for (int i=0;i<numBodies;i++)
+ for (int i = 0; i < numBodies; i++)
{
const btSolverBody& rb = m_tmpSolverBodyPool[i];
const btVector3& invMass = rb.m_invMass;
- setElem(Minv,i*6+0,i*6+0,invMass[0]);
- setElem(Minv,i*6+1,i*6+1,invMass[1]);
- setElem(Minv,i*6+2,i*6+2,invMass[2]);
+ setElem(Minv, i * 6 + 0, i * 6 + 0, invMass[0]);
+ setElem(Minv, i * 6 + 1, i * 6 + 1, invMass[1]);
+ setElem(Minv, i * 6 + 2, i * 6 + 2, invMass[2]);
btRigidBody* orgBody = m_tmpSolverBodyPool[i].m_originalBody;
-
- for (int r=0;r<3;r++)
- for (int c=0;c<3;c++)
- setElem(Minv,i*6+3+r,i*6+3+c,orgBody? orgBody->getInvInertiaTensorWorld()[r][c] : 0);
+
+ for (int r = 0; r < 3; r++)
+ for (int c = 0; c < 3; c++)
+ setElem(Minv, i * 6 + 3 + r, i * 6 + 3 + c, orgBody ? orgBody->getInvInertiaTensorWorld()[r][c] : 0);
}
-
- btMatrixXu& J = m_scratchJ;
- J.resize(numConstraintRows,6*numBodies);
+
+ btMatrixXu& J = m_scratchJ;
+ J.resize(numConstraintRows, 6 * numBodies);
J.setZero();
-
+
m_lo.resize(numConstraintRows);
m_hi.resize(numConstraintRows);
-
- for (int i=0;i<numConstraintRows;i++)
- {
+ for (int i = 0; i < numConstraintRows; i++)
+ {
m_lo[i] = m_allConstraintPtrArray[i]->m_lowerLimit;
m_hi[i] = m_allConstraintPtrArray[i]->m_upperLimit;
-
+
int bodyIndex0 = m_allConstraintPtrArray[i]->m_solverBodyIdA;
int bodyIndex1 = m_allConstraintPtrArray[i]->m_solverBodyIdB;
if (m_tmpSolverBodyPool[bodyIndex0].m_originalBody)
{
- setElem(J,i,6*bodyIndex0+0,m_allConstraintPtrArray[i]->m_contactNormal1[0]);
- setElem(J,i,6*bodyIndex0+1,m_allConstraintPtrArray[i]->m_contactNormal1[1]);
- setElem(J,i,6*bodyIndex0+2,m_allConstraintPtrArray[i]->m_contactNormal1[2]);
- setElem(J,i,6*bodyIndex0+3,m_allConstraintPtrArray[i]->m_relpos1CrossNormal[0]);
- setElem(J,i,6*bodyIndex0+4,m_allConstraintPtrArray[i]->m_relpos1CrossNormal[1]);
- setElem(J,i,6*bodyIndex0+5,m_allConstraintPtrArray[i]->m_relpos1CrossNormal[2]);
+ setElem(J, i, 6 * bodyIndex0 + 0, m_allConstraintPtrArray[i]->m_contactNormal1[0]);
+ setElem(J, i, 6 * bodyIndex0 + 1, m_allConstraintPtrArray[i]->m_contactNormal1[1]);
+ setElem(J, i, 6 * bodyIndex0 + 2, m_allConstraintPtrArray[i]->m_contactNormal1[2]);
+ setElem(J, i, 6 * bodyIndex0 + 3, m_allConstraintPtrArray[i]->m_relpos1CrossNormal[0]);
+ setElem(J, i, 6 * bodyIndex0 + 4, m_allConstraintPtrArray[i]->m_relpos1CrossNormal[1]);
+ setElem(J, i, 6 * bodyIndex0 + 5, m_allConstraintPtrArray[i]->m_relpos1CrossNormal[2]);
}
if (m_tmpSolverBodyPool[bodyIndex1].m_originalBody)
{
- setElem(J,i,6*bodyIndex1+0,m_allConstraintPtrArray[i]->m_contactNormal2[0]);
- setElem(J,i,6*bodyIndex1+1,m_allConstraintPtrArray[i]->m_contactNormal2[1]);
- setElem(J,i,6*bodyIndex1+2,m_allConstraintPtrArray[i]->m_contactNormal2[2]);
- setElem(J,i,6*bodyIndex1+3,m_allConstraintPtrArray[i]->m_relpos2CrossNormal[0]);
- setElem(J,i,6*bodyIndex1+4,m_allConstraintPtrArray[i]->m_relpos2CrossNormal[1]);
- setElem(J,i,6*bodyIndex1+5,m_allConstraintPtrArray[i]->m_relpos2CrossNormal[2]);
+ setElem(J, i, 6 * bodyIndex1 + 0, m_allConstraintPtrArray[i]->m_contactNormal2[0]);
+ setElem(J, i, 6 * bodyIndex1 + 1, m_allConstraintPtrArray[i]->m_contactNormal2[1]);
+ setElem(J, i, 6 * bodyIndex1 + 2, m_allConstraintPtrArray[i]->m_contactNormal2[2]);
+ setElem(J, i, 6 * bodyIndex1 + 3, m_allConstraintPtrArray[i]->m_relpos2CrossNormal[0]);
+ setElem(J, i, 6 * bodyIndex1 + 4, m_allConstraintPtrArray[i]->m_relpos2CrossNormal[1]);
+ setElem(J, i, 6 * bodyIndex1 + 5, m_allConstraintPtrArray[i]->m_relpos2CrossNormal[2]);
}
}
-
- btMatrixXu& J_transpose = m_scratchJTranspose;
- J_transpose= J.transpose();
- btMatrixXu& tmp = m_scratchTmp;
+ btMatrixXu& J_transpose = m_scratchJTranspose;
+ J_transpose = J.transpose();
+
+ btMatrixXu& tmp = m_scratchTmp;
{
{
BT_PROFILE("J*Minv");
- tmp = J*Minv;
-
+ tmp = J * Minv;
}
{
BT_PROFILE("J*tmp");
- m_A = tmp*J_transpose;
+ m_A = tmp * J_transpose;
}
}
if (1)
{
// add cfm to the diagonal of m_A
- for ( int i=0; i<m_A.rows(); ++i)
+ for (int i = 0; i < m_A.rows(); ++i)
{
- m_A.setElem(i,i,m_A(i,i)+ infoGlobal.m_globalCfm / infoGlobal.m_timeStep);
+ m_A.setElem(i, i, m_A(i, i) + infoGlobal.m_globalCfm / infoGlobal.m_timeStep);
}
}
m_x.resize(numConstraintRows);
if (infoGlobal.m_splitImpulse)
m_xSplit.resize(numConstraintRows);
-// m_x.setZero();
+ // m_x.setZero();
- for (int i=0;i<m_allConstraintPtrArray.size();i++)
+ for (int i = 0; i < m_allConstraintPtrArray.size(); i++)
{
const btSolverConstraint& c = *m_allConstraintPtrArray[i];
- m_x[i]=c.m_appliedImpulse;
+ m_x[i] = c.m_appliedImpulse;
if (infoGlobal.m_splitImpulse)
m_xSplit[i] = c.m_appliedPushImpulse;
}
-
}
-
-btScalar btMLCPSolver::solveGroupCacheFriendlyIterations(btCollisionObject** bodies ,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer)
+btScalar btMLCPSolver::solveGroupCacheFriendlyIterations(btCollisionObject** bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds, btTypedConstraint** constraints, int numConstraints, const btContactSolverInfo& infoGlobal, btIDebugDraw* debugDrawer)
{
bool result = true;
{
BT_PROFILE("solveMLCP");
-// printf("m_A(%d,%d)\n", m_A.rows(),m_A.cols());
+ // printf("m_A(%d,%d)\n", m_A.rows(),m_A.cols());
result = solveMLCP(infoGlobal);
}
@@ -596,44 +580,41 @@ btScalar btMLCPSolver::solveGroupCacheFriendlyIterations(btCollisionObject** bod
if (result)
{
BT_PROFILE("process MLCP results");
- for (int i=0;i<m_allConstraintPtrArray.size();i++)
+ for (int i = 0; i < m_allConstraintPtrArray.size(); i++)
{
{
btSolverConstraint& c = *m_allConstraintPtrArray[i];
int sbA = c.m_solverBodyIdA;
int sbB = c.m_solverBodyIdB;
//btRigidBody* orgBodyA = m_tmpSolverBodyPool[sbA].m_originalBody;
- // btRigidBody* orgBodyB = m_tmpSolverBodyPool[sbB].m_originalBody;
+ // btRigidBody* orgBodyB = m_tmpSolverBodyPool[sbB].m_originalBody;
btSolverBody& solverBodyA = m_tmpSolverBodyPool[sbA];
btSolverBody& solverBodyB = m_tmpSolverBodyPool[sbB];
-
+
{
- btScalar deltaImpulse = m_x[i]-c.m_appliedImpulse;
+ btScalar deltaImpulse = m_x[i] - c.m_appliedImpulse;
c.m_appliedImpulse = m_x[i];
- solverBodyA.internalApplyImpulse(c.m_contactNormal1*solverBodyA.internalGetInvMass(),c.m_angularComponentA,deltaImpulse);
- solverBodyB.internalApplyImpulse(c.m_contactNormal2*solverBodyB.internalGetInvMass(),c.m_angularComponentB,deltaImpulse);
+ solverBodyA.internalApplyImpulse(c.m_contactNormal1 * solverBodyA.internalGetInvMass(), c.m_angularComponentA, deltaImpulse);
+ solverBodyB.internalApplyImpulse(c.m_contactNormal2 * solverBodyB.internalGetInvMass(), c.m_angularComponentB, deltaImpulse);
}
if (infoGlobal.m_splitImpulse)
{
btScalar deltaImpulse = m_xSplit[i] - c.m_appliedPushImpulse;
- solverBodyA.internalApplyPushImpulse(c.m_contactNormal1*solverBodyA.internalGetInvMass(),c.m_angularComponentA,deltaImpulse);
- solverBodyB.internalApplyPushImpulse(c.m_contactNormal2*solverBodyB.internalGetInvMass(),c.m_angularComponentB,deltaImpulse);
+ solverBodyA.internalApplyPushImpulse(c.m_contactNormal1 * solverBodyA.internalGetInvMass(), c.m_angularComponentA, deltaImpulse);
+ solverBodyB.internalApplyPushImpulse(c.m_contactNormal2 * solverBodyB.internalGetInvMass(), c.m_angularComponentB, deltaImpulse);
c.m_appliedPushImpulse = m_xSplit[i];
}
-
}
}
}
else
{
- // printf("m_fallback = %d\n",m_fallback);
+ // printf("m_fallback = %d\n",m_fallback);
m_fallback++;
- btSequentialImpulseConstraintSolver::solveGroupCacheFriendlyIterations(bodies ,numBodies,manifoldPtr, numManifolds,constraints,numConstraints,infoGlobal,debugDrawer);
+ btSequentialImpulseConstraintSolver::solveGroupCacheFriendlyIterations(bodies, numBodies, manifoldPtr, numManifolds, constraints, numConstraints, infoGlobal, debugDrawer);
}
return 0.f;
}
-
-
diff --git a/thirdparty/bullet/BulletDynamics/MLCPSolvers/btMLCPSolver.h b/thirdparty/bullet/BulletDynamics/MLCPSolvers/btMLCPSolver.h
index 26b482ddc1..510ae59e58 100644
--- a/thirdparty/bullet/BulletDynamics/MLCPSolvers/btMLCPSolver.h
+++ b/thirdparty/bullet/BulletDynamics/MLCPSolvers/btMLCPSolver.h
@@ -23,15 +23,13 @@ subject to the following restrictions:
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;
@@ -39,24 +37,23 @@ protected:
btVectorXu m_xSplit2;
btAlignedObjectArray<int> m_limitDependencies;
- btAlignedObjectArray<btSolverConstraint*> m_allConstraintPtrArray;
+ btAlignedObjectArray<btSolverConstraint*> 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<int> 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);
+ /// 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<int> 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);
@@ -65,8 +62,7 @@ protected:
virtual bool solveMLCP(const btContactSolverInfo& infoGlobal);
public:
-
- btMLCPSolver( btMLCPSolverInterface* solver);
+ btMLCPSolver(btMLCPSolverInterface* solver);
virtual ~btMLCPSolver();
void setMLCPSolver(btMLCPSolverInterface* solver)
@@ -83,12 +79,10 @@ public:
m_fallback = num;
}
- virtual btConstraintSolverType getSolverType() const
+ virtual btConstraintSolverType getSolverType() const
{
return BT_MLCP_SOLVER;
}
-
};
-
-#endif //BT_MLCP_SOLVER_H
+#endif //BT_MLCP_SOLVER_H
diff --git a/thirdparty/bullet/BulletDynamics/MLCPSolvers/btMLCPSolverInterface.h b/thirdparty/bullet/BulletDynamics/MLCPSolvers/btMLCPSolverInterface.h
index 25bb3f6d32..6b0465b88d 100644
--- a/thirdparty/bullet/BulletDynamics/MLCPSolvers/btMLCPSolverInterface.h
+++ b/thirdparty/bullet/BulletDynamics/MLCPSolvers/btMLCPSolverInterface.h
@@ -27,7 +27,7 @@ public:
}
//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<int>& limitDependency, int numIterations, bool useSparsity = true)=0;
+ virtual bool solveMLCP(const btMatrixXu& A, const btVectorXu& b, btVectorXu& x, const btVectorXu& lo, const btVectorXu& hi, const btAlignedObjectArray<int>& limitDependency, int numIterations, bool useSparsity = true) = 0;
};
-#endif //BT_MLCP_SOLVER_INTERFACE_H
+#endif //BT_MLCP_SOLVER_INTERFACE_H
diff --git a/thirdparty/bullet/BulletDynamics/MLCPSolvers/btPATHSolver.h b/thirdparty/bullet/BulletDynamics/MLCPSolvers/btPATHSolver.h
index 9ec31a6d4e..7f8eec3f6e 100644
--- a/thirdparty/bullet/BulletDynamics/MLCPSolvers/btPATHSolver.h
+++ b/thirdparty/bullet/BulletDynamics/MLCPSolvers/btPATHSolver.h
@@ -14,38 +14,35 @@ subject to the following restrictions:
*/
///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" {
+extern "C"
+{
#include "PATH/SimpleLCP.h"
#include "PATH/License.h"
#include "PATH/Error_Interface.h"
};
- void __stdcall MyError(Void *data, Char *msg)
+void __stdcall MyError(Void *data, Char *msg)
{
- printf("Path Error: %s\n",msg);
+ printf("Path Error: %s\n", msg);
}
- void __stdcall MyWarning(Void *data, Char *msg)
+void __stdcall MyWarning(Void *data, Char *msg)
{
- printf("Path Warning: %s\n",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");
@@ -55,17 +52,15 @@ public:
Error_SetInterface(&e);
}
-
- virtual bool solveMLCP(const btMatrixXu & A, const btVectorXu & b, btVectorXu& x, const btVectorXu & lo,const btVectorXu & hi,const btAlignedObjectArray<int>& limitDependency, int numIterations, bool useSparsity = true)
+ virtual bool solveMLCP(const btMatrixXu &A, const btVectorXu &b, btVectorXu &x, const btVectorXu &lo, const btVectorXu &hi, const btAlignedObjectArray<int> &limitDependency, int numIterations, bool useSparsity = true)
{
MCP_Termination status;
-
int numVariables = b.rows();
- if (0==numVariables)
+ if (0 == numVariables)
return true;
- /* - variables - the number of variables in the problem
+ /* - 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
@@ -78,16 +73,16 @@ public:
btAlignedObjectArray<int> rowIndices;
btAlignedObjectArray<int> colIndices;
- for (int i=0;i<A.rows();i++)
+ for (int i = 0; i < A.rows(); i++)
{
- for (int j=0;j<A.cols();j++)
+ for (int j = 0; j < A.cols(); j++)
{
- if (A(i,j)!=0.f)
+ 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));
+ rowIndices.push_back(i + 1);
+ colIndices.push_back(j + 1);
+ values.push_back(A(i, j));
}
}
}
@@ -97,19 +92,18 @@ public:
btAlignedObjectArray<double> rhs;
btAlignedObjectArray<double> upperBounds;
btAlignedObjectArray<double> lowerBounds;
- for (int i=0;i<numVariables;i++)
+ 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]);
+ 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[] = {
+ static const char *gReturnMsgs[] = {
"Invalid return",
"MCP_Solved: The problem was solved",
"MCP_NoProgress: A stationary point was found",
@@ -122,16 +116,16 @@ public:
"MCP_Infeasible: Problem has no solution",
"MCP_Error: An error occurred within the code",
"MCP_LicenseError: License could not be found",
- "MCP_OK"
- };
+ "MCP_OK"};
- printf("ERROR: The PATH MCP solver failed: %s\n", gReturnMsgs[(unsigned int)status]);// << std::endl;
+ 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
+ }
+ else
{
- for (int i=0;i<numVariables;i++)
+ for (int i = 0; i < numVariables; i++)
{
x[i] = zResult[i];
//check for #NAN
@@ -139,13 +133,10 @@ public:
return false;
}
return true;
-
}
-
}
};
-#endif //BT_USE_PATH
-
+#endif //BT_USE_PATH
-#endif //BT_PATH_SOLVER_H
+#endif //BT_PATH_SOLVER_H
diff --git a/thirdparty/bullet/BulletDynamics/MLCPSolvers/btSolveProjectedGaussSeidel.h b/thirdparty/bullet/BulletDynamics/MLCPSolvers/btSolveProjectedGaussSeidel.h
index c0b40ffd9f..c3f4ec3997 100644
--- a/thirdparty/bullet/BulletDynamics/MLCPSolvers/btSolveProjectedGaussSeidel.h
+++ b/thirdparty/bullet/BulletDynamics/MLCPSolvers/btSolveProjectedGaussSeidel.h
@@ -17,25 +17,22 @@ subject to the following restrictions:
#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)
+ : 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<int>& limitDependency, int numIterations, bool useSparsity = true)
+ virtual bool solveMLCP(const btMatrixXu& A, const btVectorXu& b, btVectorXu& x, const btVectorXu& lo, const btVectorXu& hi, const btAlignedObjectArray<int>& limitDependency, int numIterations, bool useSparsity = true)
{
if (!A.rows())
return true;
@@ -46,65 +43,65 @@ public:
btAssert(A.rows() == b.rows());
int i, j, numRows = A.rows();
-
+
btScalar delta;
- for (int k = 0; k <numIterations; k++)
+ for (int k = 0; k < numIterations; k++)
{
m_leastSquaresResidual = 0.f;
- for (i = 0; i <numRows; i++)
+ for (i = 0; i < numRows; i++)
{
delta = 0.0f;
if (useSparsity)
{
- for (int h=0;h<A.m_rowNonZeroElements1[i].size();h++)
+ for (int h = 0; h < A.m_rowNonZeroElements1[i].size(); h++)
{
- int j = A.m_rowNonZeroElements1[i][h];
- if (j != i)//skip main diagonal
+ j = A.m_rowNonZeroElements1[i][h];
+ if (j != i) //skip main diagonal
{
- delta += A(i,j) * x[j];
+ delta += A(i, j) * x[j];
}
}
- } else
+ }
+ 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];
+ 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 aDiag = A(i, i);
btScalar xOld = x[i];
- x [i] = (b [i] - delta) / aDiag;
+ x[i] = (b[i] - delta) / aDiag;
btScalar s = 1.f;
- if (limitDependency[i]>=0)
+ if (limitDependency[i] >= 0)
{
s = x[limitDependency[i]];
- if (s<0)
- s=1;
+ 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;
+
+ 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;
+ m_leastSquaresResidual += diff * diff;
}
- btScalar eps = m_leastSquaresResidualThreshold;
- if ((m_leastSquaresResidual < eps) || (k >=(numIterations-1)))
+ 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);
+ printf("totalLenSqr = %f at iteration #%d\n", m_leastSquaresResidual, k);
#endif
break;
}
}
return true;
}
-
};
-#endif //BT_SOLVE_PROJECTED_GAUSS_SEIDEL_H
+#endif //BT_SOLVE_PROJECTED_GAUSS_SEIDEL_H
diff --git a/thirdparty/bullet/BulletDynamics/Vehicle/btRaycastVehicle.cpp b/thirdparty/bullet/BulletDynamics/Vehicle/btRaycastVehicle.cpp
index f299aa34e8..fc70d8e637 100644
--- a/thirdparty/bullet/BulletDynamics/Vehicle/btRaycastVehicle.cpp
+++ b/thirdparty/bullet/BulletDynamics/Vehicle/btRaycastVehicle.cpp
@@ -24,17 +24,16 @@
#define ROLLING_INFLUENCE_FIX
-
btRigidBody& btActionInterface::getFixedBody()
{
- static btRigidBody s_fixed(0, 0,0);
- s_fixed.setMassProps(btScalar(0.),btVector3(btScalar(0.),btScalar(0.),btScalar(0.)));
+ static btRigidBody s_fixed(0, 0, 0);
+ s_fixed.setMassProps(btScalar(0.), btVector3(btScalar(0.), btScalar(0.), btScalar(0.)));
return s_fixed;
}
-btRaycastVehicle::btRaycastVehicle(const btVehicleTuning& tuning,btRigidBody* chassis, btVehicleRaycaster* raycaster )
-:m_vehicleRaycaster(raycaster),
-m_pitchControl(btScalar(0.))
+btRaycastVehicle::btRaycastVehicle(const btVehicleTuning& tuning, btRigidBody* chassis, btVehicleRaycaster* raycaster)
+ : m_vehicleRaycaster(raycaster),
+ m_pitchControl(btScalar(0.))
{
m_chassisBody = chassis;
m_indexRightAxis = 0;
@@ -43,28 +42,22 @@ m_pitchControl(btScalar(0.))
defaultInit(tuning);
}
-
void btRaycastVehicle::defaultInit(const btVehicleTuning& tuning)
{
(void)tuning;
m_currentVehicleSpeedKmHour = btScalar(0.);
m_steeringValue = btScalar(0.);
-
}
-
-
btRaycastVehicle::~btRaycastVehicle()
{
}
-
//
// basically most of the code is general for 2 or 4 wheel vehicles, but some of it needs to be reviewed
//
-btWheelInfo& btRaycastVehicle::addWheel( const btVector3& connectionPointCS, const btVector3& wheelDirectionCS0,const btVector3& wheelAxleCS, btScalar suspensionRestLength, btScalar wheelRadius,const btVehicleTuning& tuning, bool isFrontWheel)
+btWheelInfo& btRaycastVehicle::addWheel(const btVector3& connectionPointCS, const btVector3& wheelDirectionCS0, const btVector3& wheelAxleCS, btScalar suspensionRestLength, btScalar wheelRadius, const btVehicleTuning& tuning, bool isFrontWheel)
{
-
btWheelInfoConstructionInfo ci;
ci.m_chassisConnectionCS = connectionPointCS;
@@ -80,83 +73,76 @@ btWheelInfo& btRaycastVehicle::addWheel( const btVector3& connectionPointCS, con
ci.m_maxSuspensionTravelCm = tuning.m_maxSuspensionTravelCm;
ci.m_maxSuspensionForce = tuning.m_maxSuspensionForce;
- m_wheelInfo.push_back( btWheelInfo(ci));
-
- btWheelInfo& wheel = m_wheelInfo[getNumWheels()-1];
-
- updateWheelTransformsWS( wheel , false );
- updateWheelTransform(getNumWheels()-1,false);
- return wheel;
-}
-
+ m_wheelInfo.push_back(btWheelInfo(ci));
+ btWheelInfo& wheel = m_wheelInfo[getNumWheels() - 1];
+ updateWheelTransformsWS(wheel, false);
+ updateWheelTransform(getNumWheels() - 1, false);
+ return wheel;
+}
-const btTransform& btRaycastVehicle::getWheelTransformWS( int wheelIndex ) const
+const btTransform& btRaycastVehicle::getWheelTransformWS(int wheelIndex) const
{
btAssert(wheelIndex < getNumWheels());
const btWheelInfo& wheel = m_wheelInfo[wheelIndex];
return wheel.m_worldTransform;
-
}
-void btRaycastVehicle::updateWheelTransform( int wheelIndex , bool interpolatedTransform)
+void btRaycastVehicle::updateWheelTransform(int wheelIndex, bool interpolatedTransform)
{
-
- btWheelInfo& wheel = m_wheelInfo[ wheelIndex ];
- updateWheelTransformsWS(wheel,interpolatedTransform);
+ btWheelInfo& wheel = m_wheelInfo[wheelIndex];
+ updateWheelTransformsWS(wheel, interpolatedTransform);
btVector3 up = -wheel.m_raycastInfo.m_wheelDirectionWS;
const btVector3& right = wheel.m_raycastInfo.m_wheelAxleWS;
btVector3 fwd = up.cross(right);
fwd = fwd.normalize();
-// up = right.cross(fwd);
-// up.normalize();
+ // up = right.cross(fwd);
+ // up.normalize();
//rotate around steering over de wheelAxleWS
btScalar steering = wheel.m_steering;
-
- btQuaternion steeringOrn(up,steering);//wheel.m_steering);
+
+ btQuaternion steeringOrn(up, steering); //wheel.m_steering);
btMatrix3x3 steeringMat(steeringOrn);
- btQuaternion rotatingOrn(right,-wheel.m_rotation);
+ btQuaternion rotatingOrn(right, -wheel.m_rotation);
btMatrix3x3 rotatingMat(rotatingOrn);
- btMatrix3x3 basis2;
- basis2[0][m_indexRightAxis] = -right[0];
- basis2[1][m_indexRightAxis] = -right[1];
- basis2[2][m_indexRightAxis] = -right[2];
+ btMatrix3x3 basis2;
+ basis2[0][m_indexRightAxis] = -right[0];
+ basis2[1][m_indexRightAxis] = -right[1];
+ basis2[2][m_indexRightAxis] = -right[2];
- basis2[0][m_indexUpAxis] = up[0];
- basis2[1][m_indexUpAxis] = up[1];
- basis2[2][m_indexUpAxis] = up[2];
+ basis2[0][m_indexUpAxis] = up[0];
+ basis2[1][m_indexUpAxis] = up[1];
+ basis2[2][m_indexUpAxis] = up[2];
- basis2[0][m_indexForwardAxis] = fwd[0];
- basis2[1][m_indexForwardAxis] = fwd[1];
- basis2[2][m_indexForwardAxis] = fwd[2];
+ basis2[0][m_indexForwardAxis] = fwd[0];
+ basis2[1][m_indexForwardAxis] = fwd[1];
+ basis2[2][m_indexForwardAxis] = fwd[2];
wheel.m_worldTransform.setBasis(steeringMat * rotatingMat * basis2);
wheel.m_worldTransform.setOrigin(
- wheel.m_raycastInfo.m_hardPointWS + wheel.m_raycastInfo.m_wheelDirectionWS * wheel.m_raycastInfo.m_suspensionLength
- );
+ wheel.m_raycastInfo.m_hardPointWS + wheel.m_raycastInfo.m_wheelDirectionWS * wheel.m_raycastInfo.m_suspensionLength);
}
void btRaycastVehicle::resetSuspension()
{
-
int i;
- for (i=0;i<m_wheelInfo.size(); i++)
+ for (i = 0; i < m_wheelInfo.size(); i++)
{
- btWheelInfo& wheel = m_wheelInfo[i];
- wheel.m_raycastInfo.m_suspensionLength = wheel.getSuspensionRestLength();
- wheel.m_suspensionRelativeVelocity = btScalar(0.0);
-
- wheel.m_raycastInfo.m_contactNormalWS = - wheel.m_raycastInfo.m_wheelDirectionWS;
- //wheel_info.setContactFriction(btScalar(0.0));
- wheel.m_clippedInvContactDotSuspension = btScalar(1.0);
+ btWheelInfo& wheel = m_wheelInfo[i];
+ wheel.m_raycastInfo.m_suspensionLength = wheel.getSuspensionRestLength();
+ wheel.m_suspensionRelativeVelocity = btScalar(0.0);
+
+ wheel.m_raycastInfo.m_contactNormalWS = -wheel.m_raycastInfo.m_wheelDirectionWS;
+ //wheel_info.setContactFriction(btScalar(0.0));
+ wheel.m_clippedInvContactDotSuspension = btScalar(1.0);
}
}
-void btRaycastVehicle::updateWheelTransformsWS(btWheelInfo& wheel , bool interpolatedTransform)
+void btRaycastVehicle::updateWheelTransformsWS(btWheelInfo& wheel, bool interpolatedTransform)
{
wheel.m_raycastInfo.m_isInContact = false;
@@ -166,19 +152,18 @@ void btRaycastVehicle::updateWheelTransformsWS(btWheelInfo& wheel , bool interpo
getRigidBody()->getMotionState()->getWorldTransform(chassisTrans);
}
- wheel.m_raycastInfo.m_hardPointWS = chassisTrans( wheel.m_chassisConnectionPointCS );
- wheel.m_raycastInfo.m_wheelDirectionWS = chassisTrans.getBasis() * wheel.m_wheelDirectionCS ;
+ wheel.m_raycastInfo.m_hardPointWS = chassisTrans(wheel.m_chassisConnectionPointCS);
+ wheel.m_raycastInfo.m_wheelDirectionWS = chassisTrans.getBasis() * wheel.m_wheelDirectionCS;
wheel.m_raycastInfo.m_wheelAxleWS = chassisTrans.getBasis() * wheel.m_wheelAxleCS;
}
btScalar btRaycastVehicle::rayCast(btWheelInfo& wheel)
{
- updateWheelTransformsWS( wheel,false);
+ updateWheelTransformsWS(wheel, false);
-
btScalar depth = -1;
-
- btScalar raylen = wheel.getSuspensionRestLength()+wheel.m_wheelsRadius;
+
+ btScalar raylen = wheel.getSuspensionRestLength() + wheel.m_wheelsRadius;
btVector3 rayvector = wheel.m_raycastInfo.m_wheelDirectionWS * (raylen);
const btVector3& source = wheel.m_raycastInfo.m_hardPointWS;
@@ -186,12 +171,12 @@ btScalar btRaycastVehicle::rayCast(btWheelInfo& wheel)
const btVector3& target = wheel.m_raycastInfo.m_contactPointWS;
btScalar param = btScalar(0.);
-
- btVehicleRaycaster::btVehicleRaycasterResult rayResults;
+
+ btVehicleRaycaster::btVehicleRaycasterResult rayResults;
btAssert(m_vehicleRaycaster);
- void* object = m_vehicleRaycaster->castRay(source,target,rayResults);
+ void* object = m_vehicleRaycaster->castRay(source, target, rayResults);
wheel.m_raycastInfo.m_groundObject = 0;
@@ -199,19 +184,18 @@ btScalar btRaycastVehicle::rayCast(btWheelInfo& wheel)
{
param = rayResults.m_distFraction;
depth = raylen * rayResults.m_distFraction;
- wheel.m_raycastInfo.m_contactNormalWS = rayResults.m_hitNormalInWorld;
+ wheel.m_raycastInfo.m_contactNormalWS = rayResults.m_hitNormalInWorld;
wheel.m_raycastInfo.m_isInContact = true;
-
- wheel.m_raycastInfo.m_groundObject = &getFixedBody();///@todo for driving on dynamic/movable objects!;
- //wheel.m_raycastInfo.m_groundObject = object;
+ wheel.m_raycastInfo.m_groundObject = &getFixedBody(); ///@todo for driving on dynamic/movable objects!;
+ //wheel.m_raycastInfo.m_groundObject = object;
- btScalar hitDistance = param*raylen;
+ btScalar hitDistance = param * raylen;
wheel.m_raycastInfo.m_suspensionLength = hitDistance - wheel.m_wheelsRadius;
//clamp on max suspension travel
- btScalar minSuspensionLength = wheel.getSuspensionRestLength() - wheel.m_maxSuspensionTravelCm*btScalar(0.01);
- btScalar maxSuspensionLength = wheel.getSuspensionRestLength()+ wheel.m_maxSuspensionTravelCm*btScalar(0.01);
+ btScalar minSuspensionLength = wheel.getSuspensionRestLength() - wheel.m_maxSuspensionTravelCm * btScalar(0.01);
+ btScalar maxSuspensionLength = wheel.getSuspensionRestLength() + wheel.m_maxSuspensionTravelCm * btScalar(0.01);
if (wheel.m_raycastInfo.m_suspensionLength < minSuspensionLength)
{
wheel.m_raycastInfo.m_suspensionLength = minSuspensionLength;
@@ -223,16 +207,16 @@ btScalar btRaycastVehicle::rayCast(btWheelInfo& wheel)
wheel.m_raycastInfo.m_contactPointWS = rayResults.m_hitPointInWorld;
- btScalar denominator= wheel.m_raycastInfo.m_contactNormalWS.dot( wheel.m_raycastInfo.m_wheelDirectionWS );
+ btScalar denominator = wheel.m_raycastInfo.m_contactNormalWS.dot(wheel.m_raycastInfo.m_wheelDirectionWS);
btVector3 chassis_velocity_at_contactPoint;
- btVector3 relpos = wheel.m_raycastInfo.m_contactPointWS-getRigidBody()->getCenterOfMassPosition();
+ btVector3 relpos = wheel.m_raycastInfo.m_contactPointWS - getRigidBody()->getCenterOfMassPosition();
chassis_velocity_at_contactPoint = getRigidBody()->getVelocityInLocalPoint(relpos);
- btScalar projVel = wheel.m_raycastInfo.m_contactNormalWS.dot( chassis_velocity_at_contactPoint );
+ btScalar projVel = wheel.m_raycastInfo.m_contactNormalWS.dot(chassis_velocity_at_contactPoint);
- if ( denominator >= btScalar(-0.1))
+ if (denominator >= btScalar(-0.1))
{
wheel.m_suspensionRelativeVelocity = btScalar(0.0);
wheel.m_clippedInvContactDotSuspension = btScalar(1.0) / btScalar(0.1);
@@ -243,20 +227,19 @@ btScalar btRaycastVehicle::rayCast(btWheelInfo& wheel)
wheel.m_suspensionRelativeVelocity = projVel * inv;
wheel.m_clippedInvContactDotSuspension = inv;
}
-
- } else
+ }
+ else
{
//put wheel info as in rest position
wheel.m_raycastInfo.m_suspensionLength = wheel.getSuspensionRestLength();
wheel.m_suspensionRelativeVelocity = btScalar(0.0);
- wheel.m_raycastInfo.m_contactNormalWS = - wheel.m_raycastInfo.m_wheelDirectionWS;
+ wheel.m_raycastInfo.m_contactNormalWS = -wheel.m_raycastInfo.m_wheelDirectionWS;
wheel.m_clippedInvContactDotSuspension = btScalar(1.0);
}
return depth;
}
-
const btTransform& btRaycastVehicle::getChassisWorldTransform() const
{
/*if (getRigidBody()->getMotionState())
@@ -267,26 +250,23 @@ const btTransform& btRaycastVehicle::getChassisWorldTransform() const
}
*/
-
return getRigidBody()->getCenterOfMassTransform();
}
-
-void btRaycastVehicle::updateVehicle( btScalar step )
+void btRaycastVehicle::updateVehicle(btScalar step)
{
{
- for (int i=0;i<getNumWheels();i++)
+ for (int i = 0; i < getNumWheels(); i++)
{
- updateWheelTransform(i,false);
+ updateWheelTransform(i, false);
}
}
-
m_currentVehicleSpeedKmHour = btScalar(3.6) * getRigidBody()->getLinearVelocity().length();
-
+
const btTransform& chassisTrans = getChassisWorldTransform();
- btVector3 forwardW (
+ btVector3 forwardW(
chassisTrans.getBasis()[0][m_indexForwardAxis],
chassisTrans.getBasis()[1][m_indexForwardAxis],
chassisTrans.getBasis()[2][m_indexForwardAxis]);
@@ -299,52 +279,47 @@ void btRaycastVehicle::updateVehicle( btScalar step )
//
// simulate suspension
//
-
- int i=0;
- for (i=0;i<m_wheelInfo.size();i++)
+
+ int i = 0;
+ for (i = 0; i < m_wheelInfo.size(); i++)
{
- //btScalar depth;
- //depth =
- rayCast( m_wheelInfo[i]);
+ //btScalar depth;
+ //depth =
+ rayCast(m_wheelInfo[i]);
}
updateSuspension(step);
-
- for (i=0;i<m_wheelInfo.size();i++)
+ for (i = 0; i < m_wheelInfo.size(); i++)
{
//apply suspension force
btWheelInfo& wheel = m_wheelInfo[i];
-
+
btScalar suspensionForce = wheel.m_wheelsSuspensionForce;
-
+
if (suspensionForce > wheel.m_maxSuspensionForce)
{
suspensionForce = wheel.m_maxSuspensionForce;
}
btVector3 impulse = wheel.m_raycastInfo.m_contactNormalWS * suspensionForce * step;
btVector3 relpos = wheel.m_raycastInfo.m_contactPointWS - getRigidBody()->getCenterOfMassPosition();
-
+
getRigidBody()->applyImpulse(impulse, relpos);
-
}
-
-
- updateFriction( step);
+ updateFriction(step);
-
- for (i=0;i<m_wheelInfo.size();i++)
+ for (i = 0; i < m_wheelInfo.size(); i++)
{
btWheelInfo& wheel = m_wheelInfo[i];
btVector3 relpos = wheel.m_raycastInfo.m_hardPointWS - getRigidBody()->getCenterOfMassPosition();
- btVector3 vel = getRigidBody()->getVelocityInLocalPoint( relpos );
+ btVector3 vel = getRigidBody()->getVelocityInLocalPoint(relpos);
if (wheel.m_raycastInfo.m_isInContact)
{
- const btTransform& chassisWorldTransform = getChassisWorldTransform();
+ const btTransform& chassisWorldTransform = getChassisWorldTransform();
- btVector3 fwd (
+ btVector3 fwd(
chassisWorldTransform.getBasis()[0][m_indexForwardAxis],
chassisWorldTransform.getBasis()[1][m_indexForwardAxis],
chassisWorldTransform.getBasis()[2][m_indexForwardAxis]);
@@ -353,99 +328,88 @@ void btRaycastVehicle::updateVehicle( btScalar step )
fwd -= wheel.m_raycastInfo.m_contactNormalWS * proj;
btScalar proj2 = fwd.dot(vel);
-
+
wheel.m_deltaRotation = (proj2 * step) / (wheel.m_wheelsRadius);
wheel.m_rotation += wheel.m_deltaRotation;
-
- } else
+ }
+ else
{
wheel.m_rotation += wheel.m_deltaRotation;
}
-
- wheel.m_deltaRotation *= btScalar(0.99);//damping of rotation when not in contact
+ wheel.m_deltaRotation *= btScalar(0.99); //damping of rotation when not in contact
}
-
-
-
}
-
-void btRaycastVehicle::setSteeringValue(btScalar steering,int wheel)
+void btRaycastVehicle::setSteeringValue(btScalar steering, int wheel)
{
- btAssert(wheel>=0 && wheel < getNumWheels());
+ btAssert(wheel >= 0 && wheel < getNumWheels());
btWheelInfo& wheelInfo = getWheelInfo(wheel);
wheelInfo.m_steering = steering;
}
-
-
-btScalar btRaycastVehicle::getSteeringValue(int wheel) const
+btScalar btRaycastVehicle::getSteeringValue(int wheel) const
{
return getWheelInfo(wheel).m_steering;
}
-
-void btRaycastVehicle::applyEngineForce(btScalar force, int wheel)
+void btRaycastVehicle::applyEngineForce(btScalar force, int wheel)
{
- btAssert(wheel>=0 && wheel < getNumWheels());
+ btAssert(wheel >= 0 && wheel < getNumWheels());
btWheelInfo& wheelInfo = getWheelInfo(wheel);
wheelInfo.m_engineForce = force;
}
-
-const btWheelInfo& btRaycastVehicle::getWheelInfo(int index) const
+const btWheelInfo& btRaycastVehicle::getWheelInfo(int index) const
{
- btAssert((index >= 0) && (index < getNumWheels()));
-
+ btAssert((index >= 0) && (index < getNumWheels()));
+
return m_wheelInfo[index];
}
-btWheelInfo& btRaycastVehicle::getWheelInfo(int index)
+btWheelInfo& btRaycastVehicle::getWheelInfo(int index)
{
- btAssert((index >= 0) && (index < getNumWheels()));
-
+ btAssert((index >= 0) && (index < getNumWheels()));
+
return m_wheelInfo[index];
}
-void btRaycastVehicle::setBrake(btScalar brake,int wheelIndex)
+void btRaycastVehicle::setBrake(btScalar brake, int wheelIndex)
{
- btAssert((wheelIndex >= 0) && (wheelIndex < getNumWheels()));
+ btAssert((wheelIndex >= 0) && (wheelIndex < getNumWheels()));
getWheelInfo(wheelIndex).m_brake = brake;
}
-
-void btRaycastVehicle::updateSuspension(btScalar deltaTime)
+void btRaycastVehicle::updateSuspension(btScalar deltaTime)
{
(void)deltaTime;
btScalar chassisMass = btScalar(1.) / m_chassisBody->getInvMass();
-
- for (int w_it=0; w_it<getNumWheels(); w_it++)
+
+ for (int w_it = 0; w_it < getNumWheels(); w_it++)
{
- btWheelInfo &wheel_info = m_wheelInfo[w_it];
-
- if ( wheel_info.m_raycastInfo.m_isInContact )
+ btWheelInfo& wheel_info = m_wheelInfo[w_it];
+
+ if (wheel_info.m_raycastInfo.m_isInContact)
{
btScalar force;
// Spring
{
- btScalar susp_length = wheel_info.getSuspensionRestLength();
- btScalar current_length = wheel_info.m_raycastInfo.m_suspensionLength;
+ btScalar susp_length = wheel_info.getSuspensionRestLength();
+ btScalar current_length = wheel_info.m_raycastInfo.m_suspensionLength;
btScalar length_diff = (susp_length - current_length);
- force = wheel_info.m_suspensionStiffness
- * length_diff * wheel_info.m_clippedInvContactDotSuspension;
+ force = wheel_info.m_suspensionStiffness * length_diff * wheel_info.m_clippedInvContactDotSuspension;
}
-
+
// Damper
{
btScalar projected_rel_vel = wheel_info.m_suspensionRelativeVelocity;
{
- btScalar susp_damping;
- if ( projected_rel_vel < btScalar(0.0) )
+ btScalar susp_damping;
+ if (projected_rel_vel < btScalar(0.0))
{
susp_damping = wheel_info.m_wheelsDampingCompression;
}
@@ -469,50 +433,43 @@ void btRaycastVehicle::updateSuspension(btScalar deltaTime)
wheel_info.m_wheelsSuspensionForce = btScalar(0.0);
}
}
-
}
-
struct btWheelContactPoint
{
btRigidBody* m_body0;
btRigidBody* m_body1;
- btVector3 m_frictionPositionWorld;
- btVector3 m_frictionDirectionWorld;
- btScalar m_jacDiagABInv;
- btScalar m_maxImpulse;
-
-
- btWheelContactPoint(btRigidBody* body0,btRigidBody* body1,const btVector3& frictionPosWorld,const btVector3& frictionDirectionWorld, btScalar maxImpulse)
- :m_body0(body0),
- m_body1(body1),
- m_frictionPositionWorld(frictionPosWorld),
- m_frictionDirectionWorld(frictionDirectionWorld),
- m_maxImpulse(maxImpulse)
+ btVector3 m_frictionPositionWorld;
+ btVector3 m_frictionDirectionWorld;
+ btScalar m_jacDiagABInv;
+ btScalar m_maxImpulse;
+
+ btWheelContactPoint(btRigidBody* body0, btRigidBody* body1, const btVector3& frictionPosWorld, const btVector3& frictionDirectionWorld, btScalar maxImpulse)
+ : m_body0(body0),
+ m_body1(body1),
+ m_frictionPositionWorld(frictionPosWorld),
+ m_frictionDirectionWorld(frictionDirectionWorld),
+ m_maxImpulse(maxImpulse)
{
- btScalar denom0 = body0->computeImpulseDenominator(frictionPosWorld,frictionDirectionWorld);
- btScalar denom1 = body1->computeImpulseDenominator(frictionPosWorld,frictionDirectionWorld);
- btScalar relaxation = 1.f;
- m_jacDiagABInv = relaxation/(denom0+denom1);
+ btScalar denom0 = body0->computeImpulseDenominator(frictionPosWorld, frictionDirectionWorld);
+ btScalar denom1 = body1->computeImpulseDenominator(frictionPosWorld, frictionDirectionWorld);
+ btScalar relaxation = 1.f;
+ m_jacDiagABInv = relaxation / (denom0 + denom1);
}
-
-
-
};
btScalar calcRollingFriction(btWheelContactPoint& contactPoint, int numWheelsOnGround);
btScalar calcRollingFriction(btWheelContactPoint& contactPoint, int numWheelsOnGround)
{
-
- btScalar j1=0.f;
+ btScalar j1 = 0.f;
const btVector3& contactPosWorld = contactPoint.m_frictionPositionWorld;
- btVector3 rel_pos1 = contactPosWorld - contactPoint.m_body0->getCenterOfMassPosition();
+ btVector3 rel_pos1 = contactPosWorld - contactPoint.m_body0->getCenterOfMassPosition();
btVector3 rel_pos2 = contactPosWorld - contactPoint.m_body1->getCenterOfMassPosition();
-
- btScalar maxImpulse = contactPoint.m_maxImpulse;
-
+
+ btScalar maxImpulse = contactPoint.m_maxImpulse;
+
btVector3 vel1 = contactPoint.m_body0->getVelocityInLocalPoint(rel_pos1);
btVector3 vel2 = contactPoint.m_body1->getVelocityInLocalPoint(rel_pos2);
btVector3 vel = vel1 - vel2;
@@ -520,253 +477,225 @@ btScalar calcRollingFriction(btWheelContactPoint& contactPoint, int numWheelsOnG
btScalar vrel = contactPoint.m_frictionDirectionWorld.dot(vel);
// calculate j that moves us to zero relative velocity
- j1 = -vrel * contactPoint.m_jacDiagABInv/btScalar(numWheelsOnGround);
+ j1 = -vrel * contactPoint.m_jacDiagABInv / btScalar(numWheelsOnGround);
btSetMin(j1, maxImpulse);
btSetMax(j1, -maxImpulse);
return j1;
}
+btScalar sideFrictionStiffness2 = btScalar(1.0);
+void btRaycastVehicle::updateFriction(btScalar timeStep)
+{
+ //calculate the impulse, so that the wheels don't move sidewards
+ int numWheel = getNumWheels();
+ if (!numWheel)
+ return;
+ m_forwardWS.resize(numWheel);
+ m_axle.resize(numWheel);
+ m_forwardImpulse.resize(numWheel);
+ m_sideImpulse.resize(numWheel);
+ int numWheelsOnGround = 0;
-btScalar sideFrictionStiffness2 = btScalar(1.0);
-void btRaycastVehicle::updateFriction(btScalar timeStep)
-{
+ //collapse all those loops into one!
+ for (int i = 0; i < getNumWheels(); i++)
+ {
+ btWheelInfo& wheelInfo = m_wheelInfo[i];
+ class btRigidBody* groundObject = (class btRigidBody*)wheelInfo.m_raycastInfo.m_groundObject;
+ if (groundObject)
+ numWheelsOnGround++;
+ m_sideImpulse[i] = btScalar(0.);
+ m_forwardImpulse[i] = btScalar(0.);
+ }
- //calculate the impulse, so that the wheels don't move sidewards
- int numWheel = getNumWheels();
- if (!numWheel)
- return;
-
- m_forwardWS.resize(numWheel);
- m_axle.resize(numWheel);
- m_forwardImpulse.resize(numWheel);
- m_sideImpulse.resize(numWheel);
-
- int numWheelsOnGround = 0;
-
-
- //collapse all those loops into one!
- for (int i=0;i<getNumWheels();i++)
+ {
+ for (int i = 0; i < getNumWheels(); i++)
{
btWheelInfo& wheelInfo = m_wheelInfo[i];
- class btRigidBody* groundObject = (class btRigidBody*) wheelInfo.m_raycastInfo.m_groundObject;
- if (groundObject)
- numWheelsOnGround++;
- m_sideImpulse[i] = btScalar(0.);
- m_forwardImpulse[i] = btScalar(0.);
- }
-
- {
-
- for (int i=0;i<getNumWheels();i++)
+ class btRigidBody* groundObject = (class btRigidBody*)wheelInfo.m_raycastInfo.m_groundObject;
+
+ if (groundObject)
{
+ const btTransform& wheelTrans = getWheelTransformWS(i);
- btWheelInfo& wheelInfo = m_wheelInfo[i];
-
- class btRigidBody* groundObject = (class btRigidBody*) wheelInfo.m_raycastInfo.m_groundObject;
+ btMatrix3x3 wheelBasis0 = wheelTrans.getBasis();
+ m_axle[i] = -btVector3(
+ wheelBasis0[0][m_indexRightAxis],
+ wheelBasis0[1][m_indexRightAxis],
+ wheelBasis0[2][m_indexRightAxis]);
- if (groundObject)
- {
+ const btVector3& surfNormalWS = wheelInfo.m_raycastInfo.m_contactNormalWS;
+ btScalar proj = m_axle[i].dot(surfNormalWS);
+ m_axle[i] -= surfNormalWS * proj;
+ m_axle[i] = m_axle[i].normalize();
- const btTransform& wheelTrans = getWheelTransformWS( i );
-
- btMatrix3x3 wheelBasis0 = wheelTrans.getBasis();
- m_axle[i] = -btVector3(
- wheelBasis0[0][m_indexRightAxis],
- wheelBasis0[1][m_indexRightAxis],
- wheelBasis0[2][m_indexRightAxis]);
-
- const btVector3& surfNormalWS = wheelInfo.m_raycastInfo.m_contactNormalWS;
- btScalar proj = m_axle[i].dot(surfNormalWS);
- m_axle[i] -= surfNormalWS * proj;
- m_axle[i] = m_axle[i].normalize();
-
- m_forwardWS[i] = surfNormalWS.cross(m_axle[i]);
- m_forwardWS[i].normalize();
-
-
- resolveSingleBilateral(*m_chassisBody, wheelInfo.m_raycastInfo.m_contactPointWS,
- *groundObject, wheelInfo.m_raycastInfo.m_contactPointWS,
- btScalar(0.), m_axle[i],m_sideImpulse[i],timeStep);
-
- m_sideImpulse[i] *= sideFrictionStiffness2;
-
- }
-
+ m_forwardWS[i] = surfNormalWS.cross(m_axle[i]);
+ m_forwardWS[i].normalize();
+ resolveSingleBilateral(*m_chassisBody, wheelInfo.m_raycastInfo.m_contactPointWS,
+ *groundObject, wheelInfo.m_raycastInfo.m_contactPointWS,
+ btScalar(0.), m_axle[i], m_sideImpulse[i], timeStep);
+
+ m_sideImpulse[i] *= sideFrictionStiffness2;
}
}
+ }
btScalar sideFactor = btScalar(1.);
btScalar fwdFactor = 0.5;
bool sliding = false;
{
- for (int wheel =0;wheel <getNumWheels();wheel++)
+ for (int wheel = 0; wheel < getNumWheels(); wheel++)
{
btWheelInfo& wheelInfo = m_wheelInfo[wheel];
- class btRigidBody* groundObject = (class btRigidBody*) wheelInfo.m_raycastInfo.m_groundObject;
+ class btRigidBody* groundObject = (class btRigidBody*)wheelInfo.m_raycastInfo.m_groundObject;
- btScalar rollingFriction = 0.f;
+ btScalar rollingFriction = 0.f;
if (groundObject)
{
if (wheelInfo.m_engineForce != 0.f)
{
- rollingFriction = wheelInfo.m_engineForce* timeStep;
- } else
+ rollingFriction = wheelInfo.m_engineForce * timeStep;
+ }
+ else
{
btScalar defaultRollingFrictionImpulse = 0.f;
btScalar maxImpulse = wheelInfo.m_brake ? wheelInfo.m_brake : defaultRollingFrictionImpulse;
- btWheelContactPoint contactPt(m_chassisBody,groundObject,wheelInfo.m_raycastInfo.m_contactPointWS,m_forwardWS[wheel],maxImpulse);
+ btWheelContactPoint contactPt(m_chassisBody, groundObject, wheelInfo.m_raycastInfo.m_contactPointWS, m_forwardWS[wheel], maxImpulse);
btAssert(numWheelsOnGround > 0);
rollingFriction = calcRollingFriction(contactPt, numWheelsOnGround);
}
}
//switch between active rolling (throttle), braking and non-active rolling friction (no throttle/break)
-
-
-
m_forwardImpulse[wheel] = btScalar(0.);
- m_wheelInfo[wheel].m_skidInfo= btScalar(1.);
+ m_wheelInfo[wheel].m_skidInfo = btScalar(1.);
if (groundObject)
{
- m_wheelInfo[wheel].m_skidInfo= btScalar(1.);
-
+ m_wheelInfo[wheel].m_skidInfo = btScalar(1.);
+
btScalar maximp = wheelInfo.m_wheelsSuspensionForce * timeStep * wheelInfo.m_frictionSlip;
btScalar maximpSide = maximp;
btScalar maximpSquared = maximp * maximpSide;
-
- m_forwardImpulse[wheel] = rollingFriction;//wheelInfo.m_engineForce* timeStep;
+ m_forwardImpulse[wheel] = rollingFriction; //wheelInfo.m_engineForce* timeStep;
+
+ btScalar x = (m_forwardImpulse[wheel]) * fwdFactor;
+ btScalar y = (m_sideImpulse[wheel]) * sideFactor;
- btScalar x = (m_forwardImpulse[wheel] ) * fwdFactor;
- btScalar y = (m_sideImpulse[wheel] ) * sideFactor;
-
- btScalar impulseSquared = (x*x + y*y);
+ btScalar impulseSquared = (x * x + y * y);
if (impulseSquared > maximpSquared)
{
sliding = true;
-
+
btScalar factor = maximp / btSqrt(impulseSquared);
-
+
m_wheelInfo[wheel].m_skidInfo *= factor;
}
- }
-
+ }
}
}
-
-
-
- if (sliding)
+ if (sliding)
+ {
+ for (int wheel = 0; wheel < getNumWheels(); wheel++)
{
- for (int wheel = 0;wheel < getNumWheels(); wheel++)
+ if (m_sideImpulse[wheel] != btScalar(0.))
{
- if (m_sideImpulse[wheel] != btScalar(0.))
+ if (m_wheelInfo[wheel].m_skidInfo < btScalar(1.))
{
- if (m_wheelInfo[wheel].m_skidInfo< btScalar(1.))
- {
- m_forwardImpulse[wheel] *= m_wheelInfo[wheel].m_skidInfo;
- m_sideImpulse[wheel] *= m_wheelInfo[wheel].m_skidInfo;
- }
+ m_forwardImpulse[wheel] *= m_wheelInfo[wheel].m_skidInfo;
+ m_sideImpulse[wheel] *= m_wheelInfo[wheel].m_skidInfo;
}
}
}
+ }
- // apply the impulses
+ // apply the impulses
+ {
+ for (int wheel = 0; wheel < getNumWheels(); wheel++)
{
- for (int wheel = 0;wheel<getNumWheels() ; wheel++)
- {
- btWheelInfo& wheelInfo = m_wheelInfo[wheel];
+ btWheelInfo& wheelInfo = m_wheelInfo[wheel];
- btVector3 rel_pos = wheelInfo.m_raycastInfo.m_contactPointWS -
- m_chassisBody->getCenterOfMassPosition();
+ btVector3 rel_pos = wheelInfo.m_raycastInfo.m_contactPointWS -
+ m_chassisBody->getCenterOfMassPosition();
- if (m_forwardImpulse[wheel] != btScalar(0.))
- {
- m_chassisBody->applyImpulse(m_forwardWS[wheel]*(m_forwardImpulse[wheel]),rel_pos);
- }
- if (m_sideImpulse[wheel] != btScalar(0.))
- {
- class btRigidBody* groundObject = (class btRigidBody*) m_wheelInfo[wheel].m_raycastInfo.m_groundObject;
+ if (m_forwardImpulse[wheel] != btScalar(0.))
+ {
+ m_chassisBody->applyImpulse(m_forwardWS[wheel] * (m_forwardImpulse[wheel]), rel_pos);
+ }
+ if (m_sideImpulse[wheel] != btScalar(0.))
+ {
+ class btRigidBody* groundObject = (class btRigidBody*)m_wheelInfo[wheel].m_raycastInfo.m_groundObject;
- btVector3 rel_pos2 = wheelInfo.m_raycastInfo.m_contactPointWS -
- groundObject->getCenterOfMassPosition();
+ btVector3 rel_pos2 = wheelInfo.m_raycastInfo.m_contactPointWS -
+ groundObject->getCenterOfMassPosition();
-
- btVector3 sideImp = m_axle[wheel] * m_sideImpulse[wheel];
+ btVector3 sideImp = m_axle[wheel] * m_sideImpulse[wheel];
-#if defined ROLLING_INFLUENCE_FIX // fix. It only worked if car's up was along Y - VT.
- btVector3 vChassisWorldUp = getRigidBody()->getCenterOfMassTransform().getBasis().getColumn(m_indexUpAxis);
- rel_pos -= vChassisWorldUp * (vChassisWorldUp.dot(rel_pos) * (1.f-wheelInfo.m_rollInfluence));
+#if defined ROLLING_INFLUENCE_FIX // fix. It only worked if car's up was along Y - VT.
+ btVector3 vChassisWorldUp = getRigidBody()->getCenterOfMassTransform().getBasis().getColumn(m_indexUpAxis);
+ rel_pos -= vChassisWorldUp * (vChassisWorldUp.dot(rel_pos) * (1.f - wheelInfo.m_rollInfluence));
#else
- rel_pos[m_indexUpAxis] *= wheelInfo.m_rollInfluence;
+ rel_pos[m_indexUpAxis] *= wheelInfo.m_rollInfluence;
#endif
- m_chassisBody->applyImpulse(sideImp,rel_pos);
+ m_chassisBody->applyImpulse(sideImp, rel_pos);
- //apply friction impulse on the ground
- groundObject->applyImpulse(-sideImp,rel_pos2);
- }
+ //apply friction impulse on the ground
+ groundObject->applyImpulse(-sideImp, rel_pos2);
}
}
-
-
+ }
}
-
-
-void btRaycastVehicle::debugDraw(btIDebugDraw* debugDrawer)
+void btRaycastVehicle::debugDraw(btIDebugDraw* debugDrawer)
{
-
- for (int v=0;v<this->getNumWheels();v++)
+ for (int v = 0; v < this->getNumWheels(); v++)
{
- btVector3 wheelColor(0,1,1);
+ btVector3 wheelColor(0, 1, 1);
if (getWheelInfo(v).m_raycastInfo.m_isInContact)
{
- wheelColor.setValue(0,0,1);
- } else
+ wheelColor.setValue(0, 0, 1);
+ }
+ else
{
- wheelColor.setValue(1,0,1);
+ wheelColor.setValue(1, 0, 1);
}
btVector3 wheelPosWS = getWheelInfo(v).m_worldTransform.getOrigin();
- btVector3 axle = btVector3(
+ btVector3 axle = btVector3(
getWheelInfo(v).m_worldTransform.getBasis()[0][getRightAxis()],
getWheelInfo(v).m_worldTransform.getBasis()[1][getRightAxis()],
getWheelInfo(v).m_worldTransform.getBasis()[2][getRightAxis()]);
//debug wheels (cylinders)
- debugDrawer->drawLine(wheelPosWS,wheelPosWS+axle,wheelColor);
- debugDrawer->drawLine(wheelPosWS,getWheelInfo(v).m_raycastInfo.m_contactPointWS,wheelColor);
-
+ debugDrawer->drawLine(wheelPosWS, wheelPosWS + axle, wheelColor);
+ debugDrawer->drawLine(wheelPosWS, getWheelInfo(v).m_raycastInfo.m_contactPointWS, wheelColor);
}
}
-
-void* btDefaultVehicleRaycaster::castRay(const btVector3& from,const btVector3& to, btVehicleRaycasterResult& result)
+void* btDefaultVehicleRaycaster::castRay(const btVector3& from, const btVector3& to, btVehicleRaycasterResult& result)
{
-// RayResultCallback& resultCallback;
+ // RayResultCallback& resultCallback;
- btCollisionWorld::ClosestRayResultCallback rayCallback(from,to);
+ btCollisionWorld::ClosestRayResultCallback rayCallback(from, to);
m_dynamicsWorld->rayTest(from, to, rayCallback);
if (rayCallback.hasHit())
{
-
const btRigidBody* body = btRigidBody::upcast(rayCallback.m_collisionObject);
- if (body && body->hasContactResponse())
+ if (body && body->hasContactResponse())
{
result.m_hitPointInWorld = rayCallback.m_hitPointWorld;
result.m_hitNormalInWorld = rayCallback.m_hitNormalWorld;
@@ -777,4 +706,3 @@ void* btDefaultVehicleRaycaster::castRay(const btVector3& from,const btVector3&
}
return 0;
}
-
diff --git a/thirdparty/bullet/BulletDynamics/Vehicle/btRaycastVehicle.h b/thirdparty/bullet/BulletDynamics/Vehicle/btRaycastVehicle.h
index 04656b912c..99d6894e56 100644
--- a/thirdparty/bullet/BulletDynamics/Vehicle/btRaycastVehicle.h
+++ b/thirdparty/bullet/BulletDynamics/Vehicle/btRaycastVehicle.h
@@ -24,122 +24,111 @@ class btDynamicsWorld;
///rayCast vehicle, very special constraint that turn a rigidbody into a vehicle.
class btRaycastVehicle : public btActionInterface
{
+ btAlignedObjectArray<btVector3> m_forwardWS;
+ btAlignedObjectArray<btVector3> m_axle;
+ btAlignedObjectArray<btScalar> m_forwardImpulse;
+ btAlignedObjectArray<btScalar> m_sideImpulse;
- btAlignedObjectArray<btVector3> m_forwardWS;
- btAlignedObjectArray<btVector3> m_axle;
- btAlignedObjectArray<btScalar> m_forwardImpulse;
- btAlignedObjectArray<btScalar> m_sideImpulse;
-
- ///backwards compatibility
- int m_userConstraintType;
- int m_userConstraintId;
+ ///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.))
{
- 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:
+ }
+ btScalar m_suspensionStiffness;
+ btScalar m_suspensionCompression;
+ btScalar m_suspensionDamping;
+ btScalar m_maxSuspensionTravelCm;
+ btScalar m_frictionSlip;
+ btScalar m_maxSuspensionForce;
+ };
- btVehicleRaycaster* m_vehicleRaycaster;
- btScalar m_pitchControl;
- btScalar m_steeringValue;
+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;
+ 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() ;
+ btRaycastVehicle(const btVehicleTuning& tuning, btRigidBody* chassis, btVehicleRaycaster* raycaster);
+ virtual ~btRaycastVehicle();
///btActionInterface interface
- virtual void updateAction( btCollisionWorld* collisionWorld, btScalar step)
+ virtual void updateAction(btCollisionWorld* collisionWorld, btScalar step)
{
- (void) collisionWorld;
+ (void)collisionWorld;
updateVehicle(step);
}
-
///btActionInterface interface
- void debugDraw(btIDebugDraw* debugDrawer);
-
+ void debugDraw(btIDebugDraw* debugDrawer);
+
const btTransform& getChassisWorldTransform() const;
-
+
btScalar rayCast(btWheelInfo& wheel);
virtual void updateVehicle(btScalar step);
-
-
+
void resetSuspension();
- btScalar getSteeringValue(int wheel) const;
+ btScalar getSteeringValue(int wheel) const;
- void setSteeringValue(btScalar steering,int wheel);
+ void setSteeringValue(btScalar steering, int wheel);
+ void applyEngineForce(btScalar force, int wheel);
- void applyEngineForce(btScalar force, int wheel);
+ const btTransform& getWheelTransformWS(int wheelIndex) const;
- const btTransform& getWheelTransformWS( int wheelIndex ) const;
+ void updateWheelTransform(int wheelIndex, bool interpolatedTransform = true);
- void updateWheelTransform( int wheelIndex, bool interpolatedTransform = true );
-
-// void setRaycastWheelInfo( int wheelIndex , bool isInContact, const btVector3& hitPoint, const btVector3& hitNormal,btScalar depth);
+ // 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);
+ 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());
+ inline int getNumWheels() const
+ {
+ return int(m_wheelInfo.size());
}
-
- btAlignedObjectArray<btWheelInfo> m_wheelInfo;
+ btAlignedObjectArray<btWheelInfo> m_wheelInfo;
- const btWheelInfo& getWheelInfo(int index) const;
+ const btWheelInfo& getWheelInfo(int index) const;
- btWheelInfo& getWheelInfo(int index);
+ btWheelInfo& getWheelInfo(int index);
- void updateWheelTransformsWS(btWheelInfo& wheel , bool interpolatedTransform = true);
+ void updateWheelTransformsWS(btWheelInfo& wheel, bool interpolatedTransform = true);
-
- void setBrake(btScalar brake,int wheelIndex);
+ void setBrake(btScalar brake, int wheelIndex);
- void setPitchControl(btScalar pitch)
+ void setPitchControl(btScalar pitch)
{
m_pitchControl = pitch;
}
-
- void updateSuspension(btScalar deltaTime);
-
- virtual void updateFriction(btScalar timeStep);
+ void updateSuspension(btScalar deltaTime);
+ virtual void updateFriction(btScalar timeStep);
inline btRigidBody* getRigidBody()
{
@@ -151,7 +140,7 @@ public:
return m_chassisBody;
}
- inline int getRightAxis() const
+ inline int getRightAxis() const
{
return m_indexRightAxis;
}
@@ -165,46 +154,44 @@ public:
return m_indexForwardAxis;
}
-
///Worldspace forward vector
btVector3 getForwardVector() const
{
- const btTransform& chassisTrans = getChassisWorldTransform();
+ const btTransform& chassisTrans = getChassisWorldTransform();
- btVector3 forwardW (
- chassisTrans.getBasis()[0][m_indexForwardAxis],
- chassisTrans.getBasis()[1][m_indexForwardAxis],
- chassisTrans.getBasis()[2][m_indexForwardAxis]);
+ 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
+ btScalar getCurrentSpeedKmHour() const
{
return m_currentVehicleSpeedKmHour;
}
- virtual void setCoordinateSystem(int rightIndex,int upIndex,int forwardIndex)
+ 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 ;
+ return m_userConstraintType;
}
- void setUserConstraintType(int userConstraintType)
+ void setUserConstraintType(int userConstraintType)
{
m_userConstraintType = userConstraintType;
};
- void setUserConstraintId(int uid)
+ void setUserConstraintId(int uid)
{
m_userConstraintId = uid;
}
@@ -213,22 +200,19 @@ public:
{
return m_userConstraintId;
}
-
};
class btDefaultVehicleRaycaster : public btVehicleRaycaster
{
- btDynamicsWorld* m_dynamicsWorld;
+ btDynamicsWorld* m_dynamicsWorld;
+
public:
btDefaultVehicleRaycaster(btDynamicsWorld* world)
- :m_dynamicsWorld(world)
+ : m_dynamicsWorld(world)
{
}
- virtual void* castRay(const btVector3& from,const btVector3& to, btVehicleRaycasterResult& result);
-
+ virtual void* castRay(const btVector3& from, const btVector3& to, btVehicleRaycasterResult& result);
};
-
-#endif //BT_RAYCASTVEHICLE_H
-
+#endif //BT_RAYCASTVEHICLE_H
diff --git a/thirdparty/bullet/BulletDynamics/Vehicle/btVehicleRaycaster.h b/thirdparty/bullet/BulletDynamics/Vehicle/btVehicleRaycaster.h
index 3cc909c653..2c44ce546c 100644
--- a/thirdparty/bullet/BulletDynamics/Vehicle/btVehicleRaycaster.h
+++ b/thirdparty/bullet/BulletDynamics/Vehicle/btVehicleRaycaster.h
@@ -16,20 +16,18 @@
/// btVehicleRaycaster is provides interface for between vehicle simulation and raycasting
struct btVehicleRaycaster
{
-virtual ~btVehicleRaycaster()
-{
-}
+ virtual ~btVehicleRaycaster()
+ {
+ }
struct btVehicleRaycasterResult
{
- btVehicleRaycasterResult() :m_distFraction(btScalar(-1.)){};
- btVector3 m_hitPointInWorld;
- btVector3 m_hitNormalInWorld;
- btScalar m_distFraction;
+ 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;
-
+ virtual void* castRay(const btVector3& from, const btVector3& to, btVehicleRaycasterResult& result) = 0;
};
-#endif //BT_VEHICLE_RAYCASTER_H
-
+#endif //BT_VEHICLE_RAYCASTER_H
diff --git a/thirdparty/bullet/BulletDynamics/Vehicle/btWheelInfo.cpp b/thirdparty/bullet/BulletDynamics/Vehicle/btWheelInfo.cpp
index ef93c16fff..d5c12f223b 100644
--- a/thirdparty/bullet/BulletDynamics/Vehicle/btWheelInfo.cpp
+++ b/thirdparty/bullet/BulletDynamics/Vehicle/btWheelInfo.cpp
@@ -9,30 +9,26 @@
* It is provided "as is" without express or implied warranty.
*/
#include "btWheelInfo.h"
-#include "BulletDynamics/Dynamics/btRigidBody.h" // for pointvelocity
-
+#include "BulletDynamics/Dynamics/btRigidBody.h" // for pointvelocity
btScalar btWheelInfo::getSuspensionRestLength() const
{
-
return m_suspensionRestLength1;
-
}
-void btWheelInfo::updateWheel(const btRigidBody& chassis,RaycastInfo& raycastInfo)
+void btWheelInfo::updateWheel(const btRigidBody& chassis, RaycastInfo& raycastInfo)
{
(void)raycastInfo;
-
if (m_raycastInfo.m_isInContact)
{
- btScalar project= m_raycastInfo.m_contactNormalWS.dot( m_raycastInfo.m_wheelDirectionWS );
- btVector3 chassis_velocity_at_contactPoint;
+ btScalar project = m_raycastInfo.m_contactNormalWS.dot(m_raycastInfo.m_wheelDirectionWS);
+ btVector3 chassis_velocity_at_contactPoint;
btVector3 relpos = m_raycastInfo.m_contactPointWS - chassis.getCenterOfMassPosition();
- chassis_velocity_at_contactPoint = chassis.getVelocityInLocalPoint( relpos );
- btScalar projVel = m_raycastInfo.m_contactNormalWS.dot( chassis_velocity_at_contactPoint );
- if ( project >= btScalar(-0.1))
+ chassis_velocity_at_contactPoint = chassis.getVelocityInLocalPoint(relpos);
+ btScalar projVel = m_raycastInfo.m_contactNormalWS.dot(chassis_velocity_at_contactPoint);
+ if (project >= btScalar(-0.1))
{
m_suspensionRelativeVelocity = btScalar(0.0);
m_clippedInvContactDotSuspension = btScalar(1.0) / btScalar(0.1);
@@ -43,10 +39,9 @@ void btWheelInfo::updateWheel(const btRigidBody& chassis,RaycastInfo& raycastInf
m_suspensionRelativeVelocity = projVel * inv;
m_clippedInvContactDotSuspension = inv;
}
-
}
- else // Not in contact : position wheel in a nice (rest length) position
+ else // Not in contact : position wheel in a nice (rest length) position
{
m_raycastInfo.m_suspensionLength = this->getSuspensionRestLength();
m_suspensionRelativeVelocity = btScalar(0.0);
diff --git a/thirdparty/bullet/BulletDynamics/Vehicle/btWheelInfo.h b/thirdparty/bullet/BulletDynamics/Vehicle/btWheelInfo.h
index f991a57b69..af88b8ff83 100644
--- a/thirdparty/bullet/BulletDynamics/Vehicle/btWheelInfo.h
+++ b/thirdparty/bullet/BulletDynamics/Vehicle/btWheelInfo.h
@@ -18,20 +18,19 @@ 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;
+ 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.
@@ -40,51 +39,50 @@ 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
+ 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;
+ 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;
+ 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;
-
+ 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...
+
+ 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;
@@ -104,18 +102,15 @@ struct btWheelInfo
m_rollInfluence = btScalar(0.1);
m_bIsFrontWheel = ci.m_bIsFrontWheel;
m_maxSuspensionForce = ci.m_maxSuspensionForce;
-
}
- void updateWheel(const btRigidBody& chassis,RaycastInfo& raycastInfo);
+ void updateWheel(const btRigidBody& chassis, RaycastInfo& raycastInfo);
- btScalar m_clippedInvContactDotSuspension;
- btScalar m_suspensionRelativeVelocity;
+ btScalar m_clippedInvContactDotSuspension;
+ btScalar m_suspensionRelativeVelocity;
//calculated by suspension
- btScalar m_wheelsSuspensionForce;
- btScalar m_skidInfo;
-
+ btScalar m_wheelsSuspensionForce;
+ btScalar m_skidInfo;
};
-#endif //BT_WHEEL_INFO_H
-
+#endif //BT_WHEEL_INFO_H
diff --git a/thirdparty/bullet/BulletInverseDynamics/IDConfig.hpp b/thirdparty/bullet/BulletInverseDynamics/IDConfig.hpp
index ebb10e7a16..b662b80152 100644
--- a/thirdparty/bullet/BulletInverseDynamics/IDConfig.hpp
+++ b/thirdparty/bullet/BulletInverseDynamics/IDConfig.hpp
@@ -32,10 +32,10 @@
#define BT_ID_POW(x, y) btPow(x, y)
#define BT_ID_PI SIMD_PI
#ifdef _WIN32
- #define BT_ID_SNPRINTF _snprintf
+#define BT_ID_SNPRINTF _snprintf
#else
- #define BT_ID_SNPRINTF snprintf
-#endif //
+#define BT_ID_SNPRINTF snprintf
+#endif //
#endif
// error messages
#include "IDErrorMessages.hpp"
@@ -52,8 +52,8 @@
#error "custom inverse dynamics config, but no custom namespace defined"
#endif
-#define BT_ID_MAX(a,b) std::max(a,b)
-#define BT_ID_MIN(a,b) std::min(a,b)
+#define BT_ID_MAX(a, b) std::max(a, b)
+#define BT_ID_MIN(a, b) std::min(a, b)
#else
#define btInverseDynamics btInverseDynamicsBullet3
@@ -62,8 +62,8 @@
#include "LinearMath/btScalar.h"
typedef btScalar idScalar;
#include "LinearMath/btMinMax.h"
-#define BT_ID_MAX(a,b) btMax(a,b)
-#define BT_ID_MIN(a,b) btMin(a,b)
+#define BT_ID_MAX(a, b) btMax(a, b)
+#define BT_ID_MIN(a, b) btMin(a, b)
#ifdef BT_USE_DOUBLE_PRECISION
#define BT_ID_USE_DOUBLE_PRECISION
@@ -71,31 +71,31 @@ typedef btScalar idScalar;
#ifndef BT_USE_INVERSE_DYNAMICS_WITH_BULLET2
-
// use bullet types for arrays and array indices
#include "Bullet3Common/b3AlignedObjectArray.h"
// this is to make it work with C++2003, otherwise we could do this:
// template <typename T>
// using idArray = b3AlignedObjectArray<T>;
template <typename T>
-struct idArray {
+struct idArray
+{
typedef b3AlignedObjectArray<T> type;
};
typedef int idArrayIdx;
#define ID_DECLARE_ALIGNED_ALLOCATOR() B3_DECLARE_ALIGNED_ALLOCATOR()
-#else // BT_USE_INVERSE_DYNAMICS_WITH_BULLET2
+#else // BT_USE_INVERSE_DYNAMICS_WITH_BULLET2
#include "LinearMath/btAlignedObjectArray.h"
template <typename T>
-struct idArray {
+struct idArray
+{
typedef btAlignedObjectArray<T> type;
};
typedef int idArrayIdx;
#define ID_DECLARE_ALIGNED_ALLOCATOR() BT_DECLARE_ALIGNED_ALLOCATOR()
-#endif // BT_USE_INVERSE_DYNAMICS_WITH_BULLET2
-
+#endif // BT_USE_INVERSE_DYNAMICS_WITH_BULLET2
// use bullet's allocator functions
#define idMalloc btAllocFunc
diff --git a/thirdparty/bullet/BulletInverseDynamics/IDConfigBuiltin.hpp b/thirdparty/bullet/BulletInverseDynamics/IDConfigBuiltin.hpp
index 130c19c6d6..6392367924 100644
--- a/thirdparty/bullet/BulletInverseDynamics/IDConfigBuiltin.hpp
+++ b/thirdparty/bullet/BulletInverseDynamics/IDConfigBuiltin.hpp
@@ -14,7 +14,8 @@ typedef float idScalar;
// template <typename T>
// using idArray = std::vector<T>;
template <typename T>
-struct idArray {
+struct idArray
+{
typedef std::vector<T> type;
};
typedef std::vector<int>::size_type idArrayIdx;
@@ -23,14 +24,14 @@ typedef std::vector<int>::size_type idArrayIdx;
#define idMalloc ::malloc
#define idFree ::free
// currently not aligned at all...
-#define ID_DECLARE_ALIGNED_ALLOCATOR() \
- inline void* operator new(std::size_t sizeInBytes) { return idMalloc(sizeInBytes); } \
- inline void operator delete(void* ptr) { idFree(ptr); } \
- inline void* operator new(std::size_t, void* ptr) { return ptr; } \
- inline void operator delete(void*, void*) {} \
- inline void* operator new[](std::size_t sizeInBytes) { return idMalloc(sizeInBytes); } \
- inline void operator delete[](void* ptr) { idFree(ptr); } \
- inline void* operator new[](std::size_t, void* ptr) { return ptr; } \
+#define ID_DECLARE_ALIGNED_ALLOCATOR() \
+ inline void* operator new(std::size_t sizeInBytes) { return idMalloc(sizeInBytes); } \
+ inline void operator delete(void* ptr) { idFree(ptr); } \
+ inline void* operator new(std::size_t, void* ptr) { return ptr; } \
+ inline void operator delete(void*, void*) {} \
+ inline void* operator new[](std::size_t sizeInBytes) { return idMalloc(sizeInBytes); } \
+ inline void operator delete[](void* ptr) { idFree(ptr); } \
+ inline void* operator new[](std::size_t, void* ptr) { return ptr; } \
inline void operator delete[](void*, void*) {}
#include "details/IDMatVec.hpp"
diff --git a/thirdparty/bullet/BulletInverseDynamics/IDConfigEigen.hpp b/thirdparty/bullet/BulletInverseDynamics/IDConfigEigen.hpp
index cbd7e8a9c4..cfb308ee55 100644
--- a/thirdparty/bullet/BulletInverseDynamics/IDConfigEigen.hpp
+++ b/thirdparty/bullet/BulletInverseDynamics/IDConfigEigen.hpp
@@ -15,7 +15,8 @@ typedef float idScalar;
// template <typename T>
// using idArray = std::vector<T>;
template <typename T>
-struct idArray {
+struct idArray
+{
typedef std::vector<T> type;
};
typedef std::vector<int>::size_type idArrayIdx;
diff --git a/thirdparty/bullet/BulletInverseDynamics/IDErrorMessages.hpp b/thirdparty/bullet/BulletInverseDynamics/IDErrorMessages.hpp
index 1b3fd268a0..5a98f01498 100644
--- a/thirdparty/bullet/BulletInverseDynamics/IDErrorMessages.hpp
+++ b/thirdparty/bullet/BulletInverseDynamics/IDErrorMessages.hpp
@@ -13,16 +13,18 @@
#else // BT_ID_WO_BULLET
#include <cstdio>
/// print error message with file/line information
-#define bt_id_error_message(...) \
- do { \
- fprintf(stderr, "[Error:%s:%d] ", __INVDYN_FILE_WO_DIR__, __LINE__); \
- fprintf(stderr, __VA_ARGS__); \
+#define bt_id_error_message(...) \
+ do \
+ { \
+ fprintf(stderr, "[Error:%s:%d] ", __INVDYN_FILE_WO_DIR__, __LINE__); \
+ fprintf(stderr, __VA_ARGS__); \
} while (0)
/// print warning message with file/line information
-#define bt_id_warning_message(...) \
- do { \
- fprintf(stderr, "[Warning:%s:%d] ", __INVDYN_FILE_WO_DIR__, __LINE__); \
- fprintf(stderr, __VA_ARGS__); \
+#define bt_id_warning_message(...) \
+ do \
+ { \
+ fprintf(stderr, "[Warning:%s:%d] ", __INVDYN_FILE_WO_DIR__, __LINE__); \
+ fprintf(stderr, __VA_ARGS__); \
} while (0)
#define id_printf(...) printf(__VA_ARGS__)
#endif // BT_ID_WO_BULLET
diff --git a/thirdparty/bullet/BulletInverseDynamics/IDMath.cpp b/thirdparty/bullet/BulletInverseDynamics/IDMath.cpp
index d279d3435c..2f120ed489 100644
--- a/thirdparty/bullet/BulletInverseDynamics/IDMath.cpp
+++ b/thirdparty/bullet/BulletInverseDynamics/IDMath.cpp
@@ -3,25 +3,30 @@
#include <cmath>
#include <limits>
-namespace btInverseDynamics {
+namespace btInverseDynamics
+{
static const idScalar kIsZero = 5 * std::numeric_limits<idScalar>::epsilon();
// requirements for axis length deviation from 1.0
// experimentally set from random euler angle rotation matrices
static const idScalar kAxisLengthEpsilon = 10 * kIsZero;
-void setZero(vec3 &v) {
+void setZero(vec3 &v)
+{
v(0) = 0;
v(1) = 0;
v(2) = 0;
}
-void setZero(vecx &v) {
- for (int i = 0; i < v.size(); i++) {
+void setZero(vecx &v)
+{
+ for (int i = 0; i < v.size(); i++)
+ {
v(i) = 0;
}
}
-void setZero(mat33 &m) {
+void setZero(mat33 &m)
+{
m(0, 0) = 0;
m(0, 1) = 0;
m(0, 2) = 0;
@@ -33,7 +38,8 @@ void setZero(mat33 &m) {
m(2, 2) = 0;
}
-void skew(vec3& v, mat33* result) {
+void skew(vec3 &v, mat33 *result)
+{
(*result)(0, 0) = 0.0;
(*result)(0, 1) = -v(2);
(*result)(0, 2) = v(1);
@@ -45,22 +51,28 @@ void skew(vec3& v, mat33* result) {
(*result)(2, 2) = 0.0;
}
-idScalar maxAbs(const vecx &v) {
+idScalar maxAbs(const vecx &v)
+{
idScalar result = 0.0;
- for (int i = 0; i < v.size(); i++) {
+ for (int i = 0; i < v.size(); i++)
+ {
const idScalar tmp = BT_ID_FABS(v(i));
- if (tmp > result) {
+ if (tmp > result)
+ {
result = tmp;
}
}
return result;
}
-idScalar maxAbs(const vec3 &v) {
+idScalar maxAbs(const vec3 &v)
+{
idScalar result = 0.0;
- for (int i = 0; i < 3; i++) {
+ for (int i = 0; i < 3; i++)
+ {
const idScalar tmp = BT_ID_FABS(v(i));
- if (tmp > result) {
+ if (tmp > result)
+ {
result = tmp;
}
}
@@ -68,60 +80,75 @@ idScalar maxAbs(const vec3 &v) {
}
#if (defined BT_ID_HAVE_MAT3X)
-idScalar maxAbsMat3x(const mat3x &m) {
- // only used for tests -- so just loop here for portability
- idScalar result = 0.0;
- for (idArrayIdx col = 0; col < m.cols(); col++) {
- for (idArrayIdx row = 0; row < 3; row++) {
- result = BT_ID_MAX(result, std::fabs(m(row, col)));
- }
- }
- return result;
+idScalar maxAbsMat3x(const mat3x &m)
+{
+ // only used for tests -- so just loop here for portability
+ idScalar result = 0.0;
+ for (idArrayIdx col = 0; col < m.cols(); col++)
+ {
+ for (idArrayIdx row = 0; row < 3; row++)
+ {
+ result = BT_ID_MAX(result, std::fabs(m(row, col)));
+ }
+ }
+ return result;
}
-void mul(const mat33 &a, const mat3x &b, mat3x *result) {
- if (b.cols() != result->cols()) {
- bt_id_error_message("size missmatch. b.cols()= %d, result->cols()= %d\n",
- static_cast<int>(b.cols()), static_cast<int>(result->cols()));
- abort();
- }
-
- for (idArrayIdx col = 0; col < b.cols(); col++) {
- const idScalar x = a(0,0)*b(0,col)+a(0,1)*b(1,col)+a(0,2)*b(2,col);
- const idScalar y = a(1,0)*b(0,col)+a(1,1)*b(1,col)+a(1,2)*b(2,col);
- const idScalar z = a(2,0)*b(0,col)+a(2,1)*b(1,col)+a(2,2)*b(2,col);
- setMat3xElem(0, col, x, result);
- setMat3xElem(1, col, y, result);
- setMat3xElem(2, col, z, result);
- }
+void mul(const mat33 &a, const mat3x &b, mat3x *result)
+{
+ if (b.cols() != result->cols())
+ {
+ bt_id_error_message("size missmatch. b.cols()= %d, result->cols()= %d\n",
+ static_cast<int>(b.cols()), static_cast<int>(result->cols()));
+ abort();
+ }
+
+ for (idArrayIdx col = 0; col < b.cols(); col++)
+ {
+ const idScalar x = a(0, 0) * b(0, col) + a(0, 1) * b(1, col) + a(0, 2) * b(2, col);
+ const idScalar y = a(1, 0) * b(0, col) + a(1, 1) * b(1, col) + a(1, 2) * b(2, col);
+ const idScalar z = a(2, 0) * b(0, col) + a(2, 1) * b(1, col) + a(2, 2) * b(2, col);
+ setMat3xElem(0, col, x, result);
+ setMat3xElem(1, col, y, result);
+ setMat3xElem(2, col, z, result);
+ }
}
-void add(const mat3x &a, const mat3x &b, mat3x *result) {
- if (a.cols() != b.cols()) {
- bt_id_error_message("size missmatch. a.cols()= %d, b.cols()= %d\n",
- static_cast<int>(a.cols()), static_cast<int>(b.cols()));
- abort();
- }
- for (idArrayIdx col = 0; col < b.cols(); col++) {
- for (idArrayIdx row = 0; row < 3; row++) {
- setMat3xElem(row, col, a(row, col) + b(row, col), result);
- }
- }
+void add(const mat3x &a, const mat3x &b, mat3x *result)
+{
+ if (a.cols() != b.cols())
+ {
+ bt_id_error_message("size missmatch. a.cols()= %d, b.cols()= %d\n",
+ static_cast<int>(a.cols()), static_cast<int>(b.cols()));
+ abort();
+ }
+ for (idArrayIdx col = 0; col < b.cols(); col++)
+ {
+ for (idArrayIdx row = 0; row < 3; row++)
+ {
+ setMat3xElem(row, col, a(row, col) + b(row, col), result);
+ }
+ }
}
-void sub(const mat3x &a, const mat3x &b, mat3x *result) {
- if (a.cols() != b.cols()) {
- bt_id_error_message("size missmatch. a.cols()= %d, b.cols()= %d\n",
- static_cast<int>(a.cols()), static_cast<int>(b.cols()));
- abort();
- }
- for (idArrayIdx col = 0; col < b.cols(); col++) {
- for (idArrayIdx row = 0; row < 3; row++) {
- setMat3xElem(row, col, a(row, col) - b(row, col), result);
- }
- }
+void sub(const mat3x &a, const mat3x &b, mat3x *result)
+{
+ if (a.cols() != b.cols())
+ {
+ bt_id_error_message("size missmatch. a.cols()= %d, b.cols()= %d\n",
+ static_cast<int>(a.cols()), static_cast<int>(b.cols()));
+ abort();
+ }
+ for (idArrayIdx col = 0; col < b.cols(); col++)
+ {
+ for (idArrayIdx row = 0; row < 3; row++)
+ {
+ setMat3xElem(row, col, a(row, col) - b(row, col), result);
+ }
+ }
}
#endif
-mat33 transformX(const idScalar &alpha) {
+mat33 transformX(const idScalar &alpha)
+{
mat33 T;
const idScalar cos_alpha = BT_ID_COS(alpha);
const idScalar sin_alpha = BT_ID_SIN(alpha);
@@ -143,7 +170,8 @@ mat33 transformX(const idScalar &alpha) {
return T;
}
-mat33 transformY(const idScalar &beta) {
+mat33 transformY(const idScalar &beta)
+{
mat33 T;
const idScalar cos_beta = BT_ID_COS(beta);
const idScalar sin_beta = BT_ID_SIN(beta);
@@ -165,7 +193,8 @@ mat33 transformY(const idScalar &beta) {
return T;
}
-mat33 transformZ(const idScalar &gamma) {
+mat33 transformZ(const idScalar &gamma)
+{
mat33 T;
const idScalar cos_gamma = BT_ID_COS(gamma);
const idScalar sin_gamma = BT_ID_SIN(gamma);
@@ -187,7 +216,8 @@ mat33 transformZ(const idScalar &gamma) {
return T;
}
-mat33 tildeOperator(const vec3 &v) {
+mat33 tildeOperator(const vec3 &v)
+{
mat33 m;
m(0, 0) = 0.0;
m(0, 1) = -v(2);
@@ -201,7 +231,8 @@ mat33 tildeOperator(const vec3 &v) {
return m;
}
-void getVecMatFromDH(idScalar theta, idScalar d, idScalar a, idScalar alpha, vec3 *r, mat33 *T) {
+void getVecMatFromDH(idScalar theta, idScalar d, idScalar a, idScalar alpha, vec3 *r, mat33 *T)
+{
const idScalar sa = BT_ID_SIN(alpha);
const idScalar ca = BT_ID_COS(alpha);
const idScalar st = BT_ID_SIN(theta);
@@ -224,7 +255,8 @@ void getVecMatFromDH(idScalar theta, idScalar d, idScalar a, idScalar alpha, vec
(*T)(2, 2) = ca;
}
-void bodyTParentFromAxisAngle(const vec3 &axis, const idScalar &angle, mat33 *T) {
+void bodyTParentFromAxisAngle(const vec3 &axis, const idScalar &angle, mat33 *T)
+{
const idScalar c = BT_ID_COS(angle);
const idScalar s = -BT_ID_SIN(angle);
const idScalar one_m_c = 1.0 - c;
@@ -246,175 +278,214 @@ void bodyTParentFromAxisAngle(const vec3 &axis, const idScalar &angle, mat33 *T)
(*T)(2, 2) = z * z * one_m_c + c;
}
-bool isPositiveDefinite(const mat33 &m) {
+bool isPositiveDefinite(const mat33 &m)
+{
// test if all upper left determinants are positive
- if (m(0, 0) <= 0) { // upper 1x1
+ if (m(0, 0) <= 0)
+ { // upper 1x1
return false;
}
- if (m(0, 0) * m(1, 1) - m(0, 1) * m(1, 0) <= 0) { // upper 2x2
+ if (m(0, 0) * m(1, 1) - m(0, 1) * m(1, 0) <= 0)
+ { // upper 2x2
return false;
}
if ((m(0, 0) * (m(1, 1) * m(2, 2) - m(1, 2) * m(2, 1)) -
m(0, 1) * (m(1, 0) * m(2, 2) - m(1, 2) * m(2, 0)) +
- m(0, 2) * (m(1, 0) * m(2, 1) - m(1, 1) * m(2, 0))) < 0) {
+ m(0, 2) * (m(1, 0) * m(2, 1) - m(1, 1) * m(2, 0))) < 0)
+ {
return false;
}
return true;
}
-bool isPositiveSemiDefinite(const mat33 &m) {
+bool isPositiveSemiDefinite(const mat33 &m)
+{
// test if all upper left determinants are positive
- if (m(0, 0) < 0) { // upper 1x1
+ if (m(0, 0) < 0)
+ { // upper 1x1
return false;
}
- if (m(0, 0) * m(1, 1) - m(0, 1) * m(1, 0) < 0) { // upper 2x2
+ if (m(0, 0) * m(1, 1) - m(0, 1) * m(1, 0) < 0)
+ { // upper 2x2
return false;
}
if ((m(0, 0) * (m(1, 1) * m(2, 2) - m(1, 2) * m(2, 1)) -
m(0, 1) * (m(1, 0) * m(2, 2) - m(1, 2) * m(2, 0)) +
- m(0, 2) * (m(1, 0) * m(2, 1) - m(1, 1) * m(2, 0))) < 0) {
+ m(0, 2) * (m(1, 0) * m(2, 1) - m(1, 1) * m(2, 0))) < 0)
+ {
return false;
}
return true;
}
-bool isPositiveSemiDefiniteFuzzy(const mat33 &m) {
+bool isPositiveSemiDefiniteFuzzy(const mat33 &m)
+{
// test if all upper left determinants are positive
- if (m(0, 0) < -kIsZero) { // upper 1x1
+ if (m(0, 0) < -kIsZero)
+ { // upper 1x1
return false;
}
- if (m(0, 0) * m(1, 1) - m(0, 1) * m(1, 0) < -kIsZero) { // upper 2x2
+ if (m(0, 0) * m(1, 1) - m(0, 1) * m(1, 0) < -kIsZero)
+ { // upper 2x2
return false;
}
if ((m(0, 0) * (m(1, 1) * m(2, 2) - m(1, 2) * m(2, 1)) -
m(0, 1) * (m(1, 0) * m(2, 2) - m(1, 2) * m(2, 0)) +
- m(0, 2) * (m(1, 0) * m(2, 1) - m(1, 1) * m(2, 0))) < -kIsZero) {
+ m(0, 2) * (m(1, 0) * m(2, 1) - m(1, 1) * m(2, 0))) < -kIsZero)
+ {
return false;
}
return true;
}
-idScalar determinant(const mat33 &m) {
+idScalar determinant(const mat33 &m)
+{
return m(0, 0) * m(1, 1) * m(2, 2) + m(0, 1) * m(1, 2) * m(2, 0) + m(0, 2) * m(1, 0) * m(2, 1) -
m(0, 2) * m(1, 1) * m(2, 0) - m(0, 0) * m(1, 2) * m(2, 1) - m(0, 1) * m(1, 0) * m(2, 2);
}
-bool isValidInertiaMatrix(const mat33 &I, const int index, bool has_fixed_joint) {
+bool isValidInertiaMatrix(const mat33 &I, const int index, bool has_fixed_joint)
+{
// TODO(Thomas) do we really want this?
// in cases where the inertia tensor about the center of mass is zero,
// the determinant of the inertia tensor about the joint axis is almost
// zero and can have a very small negative value.
- if (!isPositiveSemiDefiniteFuzzy(I)) {
- bt_id_error_message("invalid inertia matrix for body %d, not positive definite "
- "(fixed joint)\n",
- index);
- bt_id_error_message("matrix is:\n"
- "[%.20e %.20e %.20e;\n"
- "%.20e %.20e %.20e;\n"
- "%.20e %.20e %.20e]\n",
- I(0, 0), I(0, 1), I(0, 2), I(1, 0), I(1, 1), I(1, 2), I(2, 0), I(2, 1),
- I(2, 2));
+ if (!isPositiveSemiDefiniteFuzzy(I))
+ {
+ bt_id_error_message(
+ "invalid inertia matrix for body %d, not positive definite "
+ "(fixed joint)\n",
+ index);
+ bt_id_error_message(
+ "matrix is:\n"
+ "[%.20e %.20e %.20e;\n"
+ "%.20e %.20e %.20e;\n"
+ "%.20e %.20e %.20e]\n",
+ I(0, 0), I(0, 1), I(0, 2), I(1, 0), I(1, 1), I(1, 2), I(2, 0), I(2, 1),
+ I(2, 2));
return false;
}
// check triangle inequality, must have I(i,i)+I(j,j)>=I(k,k)
- if (!has_fixed_joint) {
- if (I(0, 0) + I(1, 1) < I(2, 2)) {
+ if (!has_fixed_joint)
+ {
+ if (I(0, 0) + I(1, 1) < I(2, 2))
+ {
bt_id_error_message("invalid inertia tensor for body %d, I(0,0) + I(1,1) < I(2,2)\n", index);
- bt_id_error_message("matrix is:\n"
- "[%.20e %.20e %.20e;\n"
- "%.20e %.20e %.20e;\n"
- "%.20e %.20e %.20e]\n",
- I(0, 0), I(0, 1), I(0, 2), I(1, 0), I(1, 1), I(1, 2), I(2, 0), I(2, 1),
- I(2, 2));
+ bt_id_error_message(
+ "matrix is:\n"
+ "[%.20e %.20e %.20e;\n"
+ "%.20e %.20e %.20e;\n"
+ "%.20e %.20e %.20e]\n",
+ I(0, 0), I(0, 1), I(0, 2), I(1, 0), I(1, 1), I(1, 2), I(2, 0), I(2, 1),
+ I(2, 2));
return false;
}
- if (I(0, 0) + I(1, 1) < I(2, 2)) {
+ if (I(0, 0) + I(1, 1) < I(2, 2))
+ {
bt_id_error_message("invalid inertia tensor for body %d, I(0,0) + I(1,1) < I(2,2)\n", index);
- bt_id_error_message("matrix is:\n"
- "[%.20e %.20e %.20e;\n"
- "%.20e %.20e %.20e;\n"
- "%.20e %.20e %.20e]\n",
- I(0, 0), I(0, 1), I(0, 2), I(1, 0), I(1, 1), I(1, 2), I(2, 0), I(2, 1),
- I(2, 2));
+ bt_id_error_message(
+ "matrix is:\n"
+ "[%.20e %.20e %.20e;\n"
+ "%.20e %.20e %.20e;\n"
+ "%.20e %.20e %.20e]\n",
+ I(0, 0), I(0, 1), I(0, 2), I(1, 0), I(1, 1), I(1, 2), I(2, 0), I(2, 1),
+ I(2, 2));
return false;
}
- if (I(1, 1) + I(2, 2) < I(0, 0)) {
+ if (I(1, 1) + I(2, 2) < I(0, 0))
+ {
bt_id_error_message("invalid inertia tensor for body %d, I(1,1) + I(2,2) < I(0,0)\n", index);
- bt_id_error_message("matrix is:\n"
- "[%.20e %.20e %.20e;\n"
- "%.20e %.20e %.20e;\n"
- "%.20e %.20e %.20e]\n",
- I(0, 0), I(0, 1), I(0, 2), I(1, 0), I(1, 1), I(1, 2), I(2, 0), I(2, 1),
- I(2, 2));
+ bt_id_error_message(
+ "matrix is:\n"
+ "[%.20e %.20e %.20e;\n"
+ "%.20e %.20e %.20e;\n"
+ "%.20e %.20e %.20e]\n",
+ I(0, 0), I(0, 1), I(0, 2), I(1, 0), I(1, 1), I(1, 2), I(2, 0), I(2, 1),
+ I(2, 2));
return false;
}
}
// check positive/zero diagonal elements
- for (int i = 0; i < 3; i++) {
- if (I(i, i) < 0) { // accept zero
+ for (int i = 0; i < 3; i++)
+ {
+ if (I(i, i) < 0)
+ { // accept zero
bt_id_error_message("invalid inertia tensor, I(%d,%d)= %e <0\n", i, i, I(i, i));
return false;
}
}
// check symmetry
- if (BT_ID_FABS(I(1, 0) - I(0, 1)) > kIsZero) {
- bt_id_error_message("invalid inertia tensor for body %d I(1,0)!=I(0,1). I(1,0)-I(0,1)= "
- "%e\n",
- index, I(1, 0) - I(0, 1));
+ if (BT_ID_FABS(I(1, 0) - I(0, 1)) > kIsZero)
+ {
+ bt_id_error_message(
+ "invalid inertia tensor for body %d I(1,0)!=I(0,1). I(1,0)-I(0,1)= "
+ "%e\n",
+ index, I(1, 0) - I(0, 1));
return false;
}
- if (BT_ID_FABS(I(2, 0) - I(0, 2)) > kIsZero) {
- bt_id_error_message("invalid inertia tensor for body %d I(2,0)!=I(0,2). I(2,0)-I(0,2)= "
- "%e\n",
- index, I(2, 0) - I(0, 2));
+ if (BT_ID_FABS(I(2, 0) - I(0, 2)) > kIsZero)
+ {
+ bt_id_error_message(
+ "invalid inertia tensor for body %d I(2,0)!=I(0,2). I(2,0)-I(0,2)= "
+ "%e\n",
+ index, I(2, 0) - I(0, 2));
return false;
}
- if (BT_ID_FABS(I(1, 2) - I(2, 1)) > kIsZero) {
+ if (BT_ID_FABS(I(1, 2) - I(2, 1)) > kIsZero)
+ {
bt_id_error_message("invalid inertia tensor body %d I(1,2)!=I(2,1). I(1,2)-I(2,1)= %e\n", index,
- I(1, 2) - I(2, 1));
+ I(1, 2) - I(2, 1));
return false;
}
return true;
}
-bool isValidTransformMatrix(const mat33 &m) {
-#define print_mat(x) \
- bt_id_error_message("matrix is [%e, %e, %e; %e, %e, %e; %e, %e, %e]\n", x(0, 0), x(0, 1), x(0, 2), \
- x(1, 0), x(1, 1), x(1, 2), x(2, 0), x(2, 1), x(2, 2))
+bool isValidTransformMatrix(const mat33 &m)
+{
+#define print_mat(x) \
+ bt_id_error_message("matrix is [%e, %e, %e; %e, %e, %e; %e, %e, %e]\n", x(0, 0), x(0, 1), x(0, 2), \
+ x(1, 0), x(1, 1), x(1, 2), x(2, 0), x(2, 1), x(2, 2))
// check for unit length column vectors
- for (int i = 0; i < 3; i++) {
+ for (int i = 0; i < 3; i++)
+ {
const idScalar length_minus_1 =
BT_ID_FABS(m(0, i) * m(0, i) + m(1, i) * m(1, i) + m(2, i) * m(2, i) - 1.0);
- if (length_minus_1 > kAxisLengthEpsilon) {
- bt_id_error_message("Not a valid rotation matrix (column %d not unit length)\n"
- "column = [%.18e %.18e %.18e]\n"
- "length-1.0= %.18e\n",
- i, m(0, i), m(1, i), m(2, i), length_minus_1);
+ if (length_minus_1 > kAxisLengthEpsilon)
+ {
+ bt_id_error_message(
+ "Not a valid rotation matrix (column %d not unit length)\n"
+ "column = [%.18e %.18e %.18e]\n"
+ "length-1.0= %.18e\n",
+ i, m(0, i), m(1, i), m(2, i), length_minus_1);
print_mat(m);
return false;
}
}
// check for orthogonal column vectors
- if (BT_ID_FABS(m(0, 0) * m(0, 1) + m(1, 0) * m(1, 1) + m(2, 0) * m(2, 1)) > kAxisLengthEpsilon) {
+ if (BT_ID_FABS(m(0, 0) * m(0, 1) + m(1, 0) * m(1, 1) + m(2, 0) * m(2, 1)) > kAxisLengthEpsilon)
+ {
bt_id_error_message("Not a valid rotation matrix (columns 0 and 1 not orthogonal)\n");
print_mat(m);
return false;
}
- if (BT_ID_FABS(m(0, 0) * m(0, 2) + m(1, 0) * m(1, 2) + m(2, 0) * m(2, 2)) > kAxisLengthEpsilon) {
+ if (BT_ID_FABS(m(0, 0) * m(0, 2) + m(1, 0) * m(1, 2) + m(2, 0) * m(2, 2)) > kAxisLengthEpsilon)
+ {
bt_id_error_message("Not a valid rotation matrix (columns 0 and 2 not orthogonal)\n");
print_mat(m);
return false;
}
- if (BT_ID_FABS(m(0, 1) * m(0, 2) + m(1, 1) * m(1, 2) + m(2, 1) * m(2, 2)) > kAxisLengthEpsilon) {
+ if (BT_ID_FABS(m(0, 1) * m(0, 2) + m(1, 1) * m(1, 2) + m(2, 1) * m(2, 2)) > kAxisLengthEpsilon)
+ {
bt_id_error_message("Not a valid rotation matrix (columns 0 and 2 not orthogonal)\n");
print_mat(m);
return false;
}
// check determinant (rotation not reflection)
- if (determinant(m) <= 0) {
+ if (determinant(m) <= 0)
+ {
bt_id_error_message("Not a valid rotation matrix (determinant <=0)\n");
print_mat(m);
return false;
@@ -422,16 +493,18 @@ bool isValidTransformMatrix(const mat33 &m) {
return true;
}
-bool isUnitVector(const vec3 &vector) {
+bool isUnitVector(const vec3 &vector)
+{
return BT_ID_FABS(vector(0) * vector(0) + vector(1) * vector(1) + vector(2) * vector(2) - 1.0) <
kIsZero;
}
-vec3 rpyFromMatrix(const mat33 &rot) {
+vec3 rpyFromMatrix(const mat33 &rot)
+{
vec3 rpy;
rpy(2) = BT_ID_ATAN2(-rot(1, 0), rot(0, 0));
rpy(1) = BT_ID_ATAN2(rot(2, 0), BT_ID_COS(rpy(2)) * rot(0, 0) - BT_ID_SIN(rpy(0)) * rot(1, 0));
rpy(0) = BT_ID_ATAN2(-rot(2, 0), rot(2, 2));
return rpy;
}
-}
+} // namespace btInverseDynamics
diff --git a/thirdparty/bullet/BulletInverseDynamics/IDMath.hpp b/thirdparty/bullet/BulletInverseDynamics/IDMath.hpp
index b355474d44..40bee5302b 100644
--- a/thirdparty/bullet/BulletInverseDynamics/IDMath.hpp
+++ b/thirdparty/bullet/BulletInverseDynamics/IDMath.hpp
@@ -5,7 +5,8 @@
#define IDMATH_HPP_
#include "IDConfig.hpp"
-namespace btInverseDynamics {
+namespace btInverseDynamics
+{
/// set all elements to zero
void setZero(vec3& v);
/// set all elements to zero
@@ -23,11 +24,11 @@ idScalar maxAbs(const vec3& v);
#if (defined BT_ID_HAVE_MAT3X)
idScalar maxAbsMat3x(const mat3x& m);
-void setZero(mat3x&m);
+void setZero(mat3x& m);
// define math functions on mat3x here to avoid allocations in operators.
-void mul(const mat33&a, const mat3x&b, mat3x* result);
-void add(const mat3x&a, const mat3x&b, mat3x* result);
-void sub(const mat3x&a, const mat3x&b, mat3x* result);
+void mul(const mat33& a, const mat3x& b, mat3x* result);
+void add(const mat3x& a, const mat3x& b, mat3x* result);
+void sub(const mat3x& a, const mat3x& b, mat3x* result);
#endif
/// get offset vector & transform matrix from DH parameters
@@ -94,6 +95,6 @@ mat33 transformZ(const idScalar& gamma);
///calculate rpy angles (x-y-z Euler angles) from a given rotation matrix
/// @param rot rotation matrix
/// @returns x-y-z Euler angles
-vec3 rpyFromMatrix(const mat33&rot);
-}
+vec3 rpyFromMatrix(const mat33& rot);
+} // namespace btInverseDynamics
#endif // IDMATH_HPP_
diff --git a/thirdparty/bullet/BulletInverseDynamics/MultiBodyTree.cpp b/thirdparty/bullet/BulletInverseDynamics/MultiBodyTree.cpp
index becfe0f4a2..f150b5ae4c 100644
--- a/thirdparty/bullet/BulletInverseDynamics/MultiBodyTree.cpp
+++ b/thirdparty/bullet/BulletInverseDynamics/MultiBodyTree.cpp
@@ -8,69 +8,84 @@
#include "details/MultiBodyTreeImpl.hpp"
#include "details/MultiBodyTreeInitCache.hpp"
-namespace btInverseDynamics {
-
+namespace btInverseDynamics
+{
MultiBodyTree::MultiBodyTree()
: m_is_finalized(false),
m_mass_parameters_are_valid(true),
m_accept_invalid_mass_parameters(false),
m_impl(0x0),
- m_init_cache(0x0) {
+ m_init_cache(0x0)
+{
m_init_cache = new InitCache();
}
-MultiBodyTree::~MultiBodyTree() {
+MultiBodyTree::~MultiBodyTree()
+{
delete m_impl;
delete m_init_cache;
}
-void MultiBodyTree::setAcceptInvalidMassParameters(bool flag) {
+void MultiBodyTree::setAcceptInvalidMassParameters(bool flag)
+{
m_accept_invalid_mass_parameters = flag;
}
-bool MultiBodyTree::getAcceptInvalidMassProperties() const {
+bool MultiBodyTree::getAcceptInvalidMassProperties() const
+{
return m_accept_invalid_mass_parameters;
}
-int MultiBodyTree::getBodyOrigin(const int body_index, vec3 *world_origin) const {
+int MultiBodyTree::getBodyOrigin(const int body_index, vec3 *world_origin) const
+{
return m_impl->getBodyOrigin(body_index, world_origin);
}
-int MultiBodyTree::getBodyCoM(const int body_index, vec3 *world_com) const {
+int MultiBodyTree::getBodyCoM(const int body_index, vec3 *world_com) const
+{
return m_impl->getBodyCoM(body_index, world_com);
}
-int MultiBodyTree::getBodyTransform(const int body_index, mat33 *world_T_body) const {
+int MultiBodyTree::getBodyTransform(const int body_index, mat33 *world_T_body) const
+{
return m_impl->getBodyTransform(body_index, world_T_body);
}
-int MultiBodyTree::getBodyAngularVelocity(const int body_index, vec3 *world_omega) const {
+int MultiBodyTree::getBodyAngularVelocity(const int body_index, vec3 *world_omega) const
+{
return m_impl->getBodyAngularVelocity(body_index, world_omega);
}
-int MultiBodyTree::getBodyLinearVelocity(const int body_index, vec3 *world_velocity) const {
+int MultiBodyTree::getBodyLinearVelocity(const int body_index, vec3 *world_velocity) const
+{
return m_impl->getBodyLinearVelocity(body_index, world_velocity);
}
-int MultiBodyTree::getBodyLinearVelocityCoM(const int body_index, vec3 *world_velocity) const {
+int MultiBodyTree::getBodyLinearVelocityCoM(const int body_index, vec3 *world_velocity) const
+{
return m_impl->getBodyLinearVelocityCoM(body_index, world_velocity);
}
-int MultiBodyTree::getBodyAngularAcceleration(const int body_index, vec3 *world_dot_omega) const {
+int MultiBodyTree::getBodyAngularAcceleration(const int body_index, vec3 *world_dot_omega) const
+{
return m_impl->getBodyAngularAcceleration(body_index, world_dot_omega);
}
-int MultiBodyTree::getBodyLinearAcceleration(const int body_index, vec3 *world_acceleration) const {
+int MultiBodyTree::getBodyLinearAcceleration(const int body_index, vec3 *world_acceleration) const
+{
return m_impl->getBodyLinearAcceleration(body_index, world_acceleration);
}
-int MultiBodyTree::getParentRParentBodyRef(const int body_index, vec3* r) const {
- return m_impl->getParentRParentBodyRef(body_index, r);
+int MultiBodyTree::getParentRParentBodyRef(const int body_index, vec3 *r) const
+{
+ return m_impl->getParentRParentBodyRef(body_index, r);
}
-int MultiBodyTree::getBodyTParentRef(const int body_index, mat33* T) const {
- return m_impl->getBodyTParentRef(body_index, T);
+int MultiBodyTree::getBodyTParentRef(const int body_index, mat33 *T) const
+{
+ return m_impl->getBodyTParentRef(body_index, T);
}
-int MultiBodyTree::getBodyAxisOfMotion(const int body_index, vec3* axis) const {
- return m_impl->getBodyAxisOfMotion(body_index, axis);
+int MultiBodyTree::getBodyAxisOfMotion(const int body_index, vec3 *axis) const
+{
+ return m_impl->getBodyAxisOfMotion(body_index, axis);
}
void MultiBodyTree::printTree() { m_impl->printTree(); }
@@ -81,12 +96,15 @@ int MultiBodyTree::numBodies() const { return m_impl->m_num_bodies; }
int MultiBodyTree::numDoFs() const { return m_impl->m_num_dofs; }
int MultiBodyTree::calculateInverseDynamics(const vecx &q, const vecx &u, const vecx &dot_u,
- vecx *joint_forces) {
- if (false == m_is_finalized) {
+ vecx *joint_forces)
+{
+ if (false == m_is_finalized)
+ {
bt_id_error_message("system has not been initialized\n");
return -1;
}
- if (-1 == m_impl->calculateInverseDynamics(q, u, dot_u, joint_forces)) {
+ if (-1 == m_impl->calculateInverseDynamics(q, u, dot_u, joint_forces))
+ {
bt_id_error_message("error in inverse dynamics calculation\n");
return -1;
}
@@ -95,141 +113,164 @@ int MultiBodyTree::calculateInverseDynamics(const vecx &q, const vecx &u, const
int MultiBodyTree::calculateMassMatrix(const vecx &q, const bool update_kinematics,
const bool initialize_matrix,
- const bool set_lower_triangular_matrix, matxx *mass_matrix) {
- if (false == m_is_finalized) {
+ const bool set_lower_triangular_matrix, matxx *mass_matrix)
+{
+ if (false == m_is_finalized)
+ {
bt_id_error_message("system has not been initialized\n");
return -1;
}
if (-1 ==
m_impl->calculateMassMatrix(q, update_kinematics, initialize_matrix,
- set_lower_triangular_matrix, mass_matrix)) {
+ set_lower_triangular_matrix, mass_matrix))
+ {
bt_id_error_message("error in mass matrix calculation\n");
return -1;
}
return 0;
}
-int MultiBodyTree::calculateMassMatrix(const vecx &q, matxx *mass_matrix) {
+int MultiBodyTree::calculateMassMatrix(const vecx &q, matxx *mass_matrix)
+{
return calculateMassMatrix(q, true, true, true, mass_matrix);
}
+int MultiBodyTree::calculateKinematics(const vecx &q, const vecx &u, const vecx &dot_u)
+{
+ vec3 world_gravity(m_impl->m_world_gravity);
+ // temporarily set gravity to zero, to ensure we get the actual accelerations
+ setZero(m_impl->m_world_gravity);
+ if (false == m_is_finalized)
+ {
+ bt_id_error_message("system has not been initialized\n");
+ return -1;
+ }
+ if (-1 == m_impl->calculateKinematics(q, u, dot_u,
+ MultiBodyTree::MultiBodyImpl::POSITION_VELOCITY_ACCELERATION))
+ {
+ bt_id_error_message("error in kinematics calculation\n");
+ return -1;
+ }
-int MultiBodyTree::calculateKinematics(const vecx& q, const vecx& u, const vecx& dot_u) {
- vec3 world_gravity(m_impl->m_world_gravity);
- // temporarily set gravity to zero, to ensure we get the actual accelerations
- setZero(m_impl->m_world_gravity);
-
- if (false == m_is_finalized) {
- bt_id_error_message("system has not been initialized\n");
- return -1;
- }
- if (-1 == m_impl->calculateKinematics(q, u, dot_u,
- MultiBodyTree::MultiBodyImpl::POSITION_VELOCITY_ACCELERATION)) {
- bt_id_error_message("error in kinematics calculation\n");
- return -1;
- }
-
- m_impl->m_world_gravity=world_gravity;
- return 0;
+ m_impl->m_world_gravity = world_gravity;
+ return 0;
}
-
-int MultiBodyTree::calculatePositionKinematics(const vecx& q) {
- if (false == m_is_finalized) {
+int MultiBodyTree::calculatePositionKinematics(const vecx &q)
+{
+ if (false == m_is_finalized)
+ {
bt_id_error_message("system has not been initialized\n");
return -1;
}
if (-1 == m_impl->calculateKinematics(q, q, q,
- MultiBodyTree::MultiBodyImpl::POSITION_VELOCITY)) {
+ MultiBodyTree::MultiBodyImpl::POSITION_VELOCITY))
+ {
bt_id_error_message("error in kinematics calculation\n");
return -1;
}
return 0;
}
-int MultiBodyTree::calculatePositionAndVelocityKinematics(const vecx& q, const vecx& u) {
- if (false == m_is_finalized) {
+int MultiBodyTree::calculatePositionAndVelocityKinematics(const vecx &q, const vecx &u)
+{
+ if (false == m_is_finalized)
+ {
bt_id_error_message("system has not been initialized\n");
return -1;
}
if (-1 == m_impl->calculateKinematics(q, u, u,
- MultiBodyTree::MultiBodyImpl::POSITION_VELOCITY)) {
+ MultiBodyTree::MultiBodyImpl::POSITION_VELOCITY))
+ {
bt_id_error_message("error in kinematics calculation\n");
return -1;
}
return 0;
}
-
#if (defined BT_ID_HAVE_MAT3X) && (defined BT_ID_WITH_JACOBIANS)
-int MultiBodyTree::calculateJacobians(const vecx& q, const vecx& u) {
- if (false == m_is_finalized) {
- bt_id_error_message("system has not been initialized\n");
- return -1;
- }
- if (-1 == m_impl->calculateJacobians(q, u,
- MultiBodyTree::MultiBodyImpl::POSITION_VELOCITY)) {
- bt_id_error_message("error in jacobian calculation\n");
- return -1;
- }
- return 0;
+int MultiBodyTree::calculateJacobians(const vecx &q, const vecx &u)
+{
+ if (false == m_is_finalized)
+ {
+ bt_id_error_message("system has not been initialized\n");
+ return -1;
+ }
+ if (-1 == m_impl->calculateJacobians(q, u,
+ MultiBodyTree::MultiBodyImpl::POSITION_VELOCITY))
+ {
+ bt_id_error_message("error in jacobian calculation\n");
+ return -1;
+ }
+ return 0;
}
-int MultiBodyTree::calculateJacobians(const vecx& q){
- if (false == m_is_finalized) {
- bt_id_error_message("system has not been initialized\n");
- return -1;
- }
- if (-1 == m_impl->calculateJacobians(q, q,
- MultiBodyTree::MultiBodyImpl::POSITION_ONLY)) {
- bt_id_error_message("error in jacobian calculation\n");
- return -1;
- }
- return 0;
+int MultiBodyTree::calculateJacobians(const vecx &q)
+{
+ if (false == m_is_finalized)
+ {
+ bt_id_error_message("system has not been initialized\n");
+ return -1;
+ }
+ if (-1 == m_impl->calculateJacobians(q, q,
+ MultiBodyTree::MultiBodyImpl::POSITION_ONLY))
+ {
+ bt_id_error_message("error in jacobian calculation\n");
+ return -1;
+ }
+ return 0;
}
-int MultiBodyTree::getBodyDotJacobianTransU(const int body_index, vec3* world_dot_jac_trans_u) const {
- return m_impl->getBodyDotJacobianTransU(body_index,world_dot_jac_trans_u);
+int MultiBodyTree::getBodyDotJacobianTransU(const int body_index, vec3 *world_dot_jac_trans_u) const
+{
+ return m_impl->getBodyDotJacobianTransU(body_index, world_dot_jac_trans_u);
}
-int MultiBodyTree::getBodyDotJacobianRotU(const int body_index, vec3* world_dot_jac_rot_u) const {
- return m_impl->getBodyDotJacobianRotU(body_index,world_dot_jac_rot_u);
+int MultiBodyTree::getBodyDotJacobianRotU(const int body_index, vec3 *world_dot_jac_rot_u) const
+{
+ return m_impl->getBodyDotJacobianRotU(body_index, world_dot_jac_rot_u);
}
-int MultiBodyTree::getBodyJacobianTrans(const int body_index, mat3x* world_jac_trans) const {
- return m_impl->getBodyJacobianTrans(body_index,world_jac_trans);
+int MultiBodyTree::getBodyJacobianTrans(const int body_index, mat3x *world_jac_trans) const
+{
+ return m_impl->getBodyJacobianTrans(body_index, world_jac_trans);
}
-int MultiBodyTree::getBodyJacobianRot(const int body_index, mat3x* world_jac_rot) const {
- return m_impl->getBodyJacobianRot(body_index,world_jac_rot);
+int MultiBodyTree::getBodyJacobianRot(const int body_index, mat3x *world_jac_rot) const
+{
+ return m_impl->getBodyJacobianRot(body_index, world_jac_rot);
}
-
#endif
int MultiBodyTree::addBody(int body_index, int parent_index, JointType joint_type,
const vec3 &parent_r_parent_body_ref, const mat33 &body_T_parent_ref,
const vec3 &body_axis_of_motion_, idScalar mass,
const vec3 &body_r_body_com, const mat33 &body_I_body,
- const int user_int, void *user_ptr) {
- if (body_index < 0) {
+ const int user_int, void *user_ptr)
+{
+ if (body_index < 0)
+ {
bt_id_error_message("body index must be positive (got %d)\n", body_index);
return -1;
}
vec3 body_axis_of_motion(body_axis_of_motion_);
- switch (joint_type) {
+ switch (joint_type)
+ {
case REVOLUTE:
case PRISMATIC:
// check if axis is unit vector
- if (!isUnitVector(body_axis_of_motion)) {
+ if (!isUnitVector(body_axis_of_motion))
+ {
bt_id_warning_message(
"axis of motion not a unit axis ([%f %f %f]), will use normalized vector\n",
body_axis_of_motion(0), body_axis_of_motion(1), body_axis_of_motion(2));
idScalar length = BT_ID_SQRT(BT_ID_POW(body_axis_of_motion(0), 2) +
- BT_ID_POW(body_axis_of_motion(1), 2) +
- BT_ID_POW(body_axis_of_motion(2), 2));
- if (length < BT_ID_SQRT(std::numeric_limits<idScalar>::min())) {
+ BT_ID_POW(body_axis_of_motion(1), 2) +
+ BT_ID_POW(body_axis_of_motion(2), 2));
+ if (length < BT_ID_SQRT(std::numeric_limits<idScalar>::min()))
+ {
bt_id_error_message("axis of motion vector too short (%e)\n", length);
return -1;
}
@@ -240,29 +281,36 @@ int MultiBodyTree::addBody(int body_index, int parent_index, JointType joint_typ
break;
case FLOATING:
break;
+ case SPHERICAL:
+ break;
default:
bt_id_error_message("unknown joint type %d\n", joint_type);
return -1;
}
// sanity check for mass properties. Zero mass is OK.
- if (mass < 0) {
+ if (mass < 0)
+ {
m_mass_parameters_are_valid = false;
bt_id_error_message("Body %d has invalid mass %e\n", body_index, mass);
- if (!m_accept_invalid_mass_parameters) {
+ if (!m_accept_invalid_mass_parameters)
+ {
return -1;
}
}
- if (!isValidInertiaMatrix(body_I_body, body_index, FIXED == joint_type)) {
+ if (!isValidInertiaMatrix(body_I_body, body_index, FIXED == joint_type))
+ {
m_mass_parameters_are_valid = false;
// error message printed in function call
- if (!m_accept_invalid_mass_parameters) {
+ if (!m_accept_invalid_mass_parameters)
+ {
return -1;
}
}
- if (!isValidTransformMatrix(body_T_parent_ref)) {
+ if (!isValidTransformMatrix(body_T_parent_ref))
+ {
return -1;
}
@@ -271,52 +319,63 @@ int MultiBodyTree::addBody(int body_index, int parent_index, JointType joint_typ
body_I_body, user_int, user_ptr);
}
-int MultiBodyTree::getParentIndex(const int body_index, int *parent_index) const {
+int MultiBodyTree::getParentIndex(const int body_index, int *parent_index) const
+{
return m_impl->getParentIndex(body_index, parent_index);
}
-int MultiBodyTree::getUserInt(const int body_index, int *user_int) const {
+int MultiBodyTree::getUserInt(const int body_index, int *user_int) const
+{
return m_impl->getUserInt(body_index, user_int);
}
-int MultiBodyTree::getUserPtr(const int body_index, void **user_ptr) const {
+int MultiBodyTree::getUserPtr(const int body_index, void **user_ptr) const
+{
return m_impl->getUserPtr(body_index, user_ptr);
}
-int MultiBodyTree::setUserInt(const int body_index, const int user_int) {
+int MultiBodyTree::setUserInt(const int body_index, const int user_int)
+{
return m_impl->setUserInt(body_index, user_int);
}
-int MultiBodyTree::setUserPtr(const int body_index, void *const user_ptr) {
+int MultiBodyTree::setUserPtr(const int body_index, void *const user_ptr)
+{
return m_impl->setUserPtr(body_index, user_ptr);
}
-int MultiBodyTree::finalize() {
+int MultiBodyTree::finalize()
+{
const int &num_bodies = m_init_cache->numBodies();
const int &num_dofs = m_init_cache->numDoFs();
- if(num_dofs<=0) {
- bt_id_error_message("Need num_dofs>=1, but num_dofs= %d\n", num_dofs);
- //return -1;
- }
+ if (num_dofs <= 0)
+ {
+ bt_id_error_message("Need num_dofs>=1, but num_dofs= %d\n", num_dofs);
+ //return -1;
+ }
// 1 allocate internal MultiBody structure
m_impl = new MultiBodyImpl(num_bodies, num_dofs);
// 2 build new index set assuring index(parent) < index(child)
- if (-1 == m_init_cache->buildIndexSets()) {
+ if (-1 == m_init_cache->buildIndexSets())
+ {
return -1;
}
m_init_cache->getParentIndexArray(&m_impl->m_parent_index);
// 3 setup internal kinematic and dynamic data
- for (int index = 0; index < num_bodies; index++) {
+ for (int index = 0; index < num_bodies; index++)
+ {
InertiaData inertia;
JointData joint;
- if (-1 == m_init_cache->getInertiaData(index, &inertia)) {
+ if (-1 == m_init_cache->getInertiaData(index, &inertia))
+ {
return -1;
}
- if (-1 == m_init_cache->getJointData(index, &joint)) {
+ if (-1 == m_init_cache->getJointData(index, &joint))
+ {
return -1;
}
@@ -332,24 +391,29 @@ int MultiBodyTree::finalize() {
rigid_body.m_joint_type = joint.m_type;
int user_int;
- if (-1 == m_init_cache->getUserInt(index, &user_int)) {
+ if (-1 == m_init_cache->getUserInt(index, &user_int))
+ {
return -1;
}
- if (-1 == m_impl->setUserInt(index, user_int)) {
+ if (-1 == m_impl->setUserInt(index, user_int))
+ {
return -1;
}
- void* user_ptr;
- if (-1 == m_init_cache->getUserPtr(index, &user_ptr)) {
+ void *user_ptr;
+ if (-1 == m_init_cache->getUserPtr(index, &user_ptr))
+ {
return -1;
}
- if (-1 == m_impl->setUserPtr(index, user_ptr)) {
+ if (-1 == m_impl->setUserPtr(index, user_ptr))
+ {
return -1;
}
// Set joint Jacobians. Note that the dimension is always 3x1 here to avoid variable sized
// matrices.
- switch (rigid_body.m_joint_type) {
+ switch (rigid_body.m_joint_type)
+ {
case REVOLUTE:
rigid_body.m_Jac_JR(0) = joint.m_child_axis_of_motion(0);
rigid_body.m_Jac_JR(1) = joint.m_child_axis_of_motion(1);
@@ -375,6 +439,16 @@ int MultiBodyTree::finalize() {
rigid_body.m_Jac_JT(1) = 0.0;
rigid_body.m_Jac_JT(2) = 0.0;
break;
+ case SPHERICAL:
+ // NOTE/TODO: this is not really correct.
+ // the Jacobians should be 3x3 matrices here !
+ rigid_body.m_Jac_JR(0) = 0.0;
+ rigid_body.m_Jac_JR(1) = 0.0;
+ rigid_body.m_Jac_JR(2) = 0.0;
+ rigid_body.m_Jac_JT(0) = 0.0;
+ rigid_body.m_Jac_JT(1) = 0.0;
+ rigid_body.m_Jac_JT(2) = 0.0;
+ break;
case FLOATING:
// NOTE/TODO: this is not really correct.
// the Jacobians should be 3x3 matrices here !
@@ -392,7 +466,8 @@ int MultiBodyTree::finalize() {
}
// 4 assign degree of freedom indices & build per-joint-type index arrays
- if (-1 == m_impl->generateIndexSets()) {
+ if (-1 == m_impl->generateIndexSets())
+ {
bt_id_error_message("generating index sets\n");
return -1;
}
@@ -408,54 +483,66 @@ int MultiBodyTree::finalize() {
return 0;
}
-int MultiBodyTree::setGravityInWorldFrame(const vec3 &gravity) {
+int MultiBodyTree::setGravityInWorldFrame(const vec3 &gravity)
+{
return m_impl->setGravityInWorldFrame(gravity);
}
-int MultiBodyTree::getJointType(const int body_index, JointType *joint_type) const {
+int MultiBodyTree::getJointType(const int body_index, JointType *joint_type) const
+{
return m_impl->getJointType(body_index, joint_type);
}
-int MultiBodyTree::getJointTypeStr(const int body_index, const char **joint_type) const {
+int MultiBodyTree::getJointTypeStr(const int body_index, const char **joint_type) const
+{
return m_impl->getJointTypeStr(body_index, joint_type);
}
-int MultiBodyTree::getDoFOffset(const int body_index, int *q_offset) const {
+int MultiBodyTree::getDoFOffset(const int body_index, int *q_offset) const
+{
return m_impl->getDoFOffset(body_index, q_offset);
}
-int MultiBodyTree::setBodyMass(const int body_index, idScalar mass) {
+int MultiBodyTree::setBodyMass(const int body_index, idScalar mass)
+{
return m_impl->setBodyMass(body_index, mass);
}
-int MultiBodyTree::setBodyFirstMassMoment(const int body_index, const vec3& first_mass_moment) {
+int MultiBodyTree::setBodyFirstMassMoment(const int body_index, const vec3 &first_mass_moment)
+{
return m_impl->setBodyFirstMassMoment(body_index, first_mass_moment);
}
-int MultiBodyTree::setBodySecondMassMoment(const int body_index, const mat33& second_mass_moment) {
+int MultiBodyTree::setBodySecondMassMoment(const int body_index, const mat33 &second_mass_moment)
+{
return m_impl->setBodySecondMassMoment(body_index, second_mass_moment);
}
-int MultiBodyTree::getBodyMass(const int body_index, idScalar *mass) const {
+int MultiBodyTree::getBodyMass(const int body_index, idScalar *mass) const
+{
return m_impl->getBodyMass(body_index, mass);
}
-int MultiBodyTree::getBodyFirstMassMoment(const int body_index, vec3 *first_mass_moment) const {
+int MultiBodyTree::getBodyFirstMassMoment(const int body_index, vec3 *first_mass_moment) const
+{
return m_impl->getBodyFirstMassMoment(body_index, first_mass_moment);
}
-int MultiBodyTree::getBodySecondMassMoment(const int body_index, mat33 *second_mass_moment) const {
+int MultiBodyTree::getBodySecondMassMoment(const int body_index, mat33 *second_mass_moment) const
+{
return m_impl->getBodySecondMassMoment(body_index, second_mass_moment);
}
void MultiBodyTree::clearAllUserForcesAndMoments() { m_impl->clearAllUserForcesAndMoments(); }
-int MultiBodyTree::addUserForce(const int body_index, const vec3 &body_force) {
+int MultiBodyTree::addUserForce(const int body_index, const vec3 &body_force)
+{
return m_impl->addUserForce(body_index, body_force);
}
-int MultiBodyTree::addUserMoment(const int body_index, const vec3 &body_moment) {
+int MultiBodyTree::addUserMoment(const int body_index, const vec3 &body_moment)
+{
return m_impl->addUserMoment(body_index, body_moment);
}
-}
+} // namespace btInverseDynamics
diff --git a/thirdparty/bullet/BulletInverseDynamics/MultiBodyTree.hpp b/thirdparty/bullet/BulletInverseDynamics/MultiBodyTree.hpp
index d235aa6e76..7b852f976c 100644
--- a/thirdparty/bullet/BulletInverseDynamics/MultiBodyTree.hpp
+++ b/thirdparty/bullet/BulletInverseDynamics/MultiBodyTree.hpp
@@ -4,10 +4,11 @@
#include "IDConfig.hpp"
#include "IDMath.hpp"
-namespace btInverseDynamics {
-
+namespace btInverseDynamics
+{
/// Enumeration of supported joint types
-enum JointType {
+enum JointType
+{
/// no degree of freedom, moves with parent
FIXED = 0,
/// one rotational degree of freedom relative to parent
@@ -15,7 +16,9 @@ enum JointType {
/// one translational degree of freedom relative to parent
PRISMATIC,
/// six degrees of freedom relative to parent
- FLOATING
+ FLOATING,
+ /// three degrees of freedom, relative to parent
+ SPHERICAL
};
/// Interface class for calculating inverse dynamics for tree structured
@@ -30,12 +33,14 @@ enum JointType {
/// - PRISMATIC: displacement [m]
/// - FLOATING: Euler x-y-z angles [rad] and displacement in body-fixed frame of parent [m]
/// (in that order)
+/// - SPHERICAL: Euler x-y-z angles [rad]
/// The u vector contains the generalized speeds, which are
/// - FIXED: none
/// - REVOLUTE: time derivative of angle of rotation [rad/s]
/// - PRISMATIC: time derivative of displacement [m/s]
/// - FLOATING: angular velocity [rad/s] (*not* time derivative of rpy angles)
/// and time derivative of displacement in parent frame [m/s]
+// - SPHERICAL: angular velocity [rad/s]
///
/// The q and u vectors are obtained by stacking contributions of all bodies in one
/// vector in the order of body indices.
@@ -46,12 +51,13 @@ enum JointType {
/// - PRISMATIC: force [N], along joint axis
/// - FLOATING: moment vector [Nm] and force vector [N], both in body-fixed frame
/// (in that order)
-///
+/// - SPHERICAL: moment vector [Nm]
/// TODO - force element interface (friction, springs, dampers, etc)
/// - gears and motor inertia
-class MultiBodyTree {
+class MultiBodyTree
+{
public:
- ID_DECLARE_ALIGNED_ALLOCATOR();
+ ID_DECLARE_ALIGNED_ALLOCATOR();
/// The contructor.
/// Initialization & allocation is via addBody and buildSystem calls.
MultiBodyTree();
@@ -119,9 +125,9 @@ public:
/// print tree data to stdout
void printTreeData();
/// Calculate joint forces for given generalized state & derivatives.
- /// This also updates kinematic terms computed in calculateKinematics.
- /// If gravity is not set to zero, acceleration terms will contain
- /// gravitational acceleration.
+ /// This also updates kinematic terms computed in calculateKinematics.
+ /// If gravity is not set to zero, acceleration terms will contain
+ /// gravitational acceleration.
/// @param q generalized coordinates
/// @param u generalized velocities. In the general case, u=T(q)*dot(q) and dim(q)>=dim(u)
/// @param dot_u time derivative of u
@@ -152,30 +158,28 @@ public:
/// @return -1 on error, 0 on success
int calculateMassMatrix(const vecx& q, matxx* mass_matrix);
-
- /// Calculates kinematics also calculated in calculateInverseDynamics,
- /// but not dynamics.
- /// This function ensures that correct accelerations are computed that do not
- /// contain gravitational acceleration terms.
- /// Does not calculate Jacobians, but only vector quantities (positions, velocities & accelerations)
- int calculateKinematics(const vecx& q, const vecx& u, const vecx& dot_u);
- /// Calculate position kinematics
- int calculatePositionKinematics(const vecx& q);
- /// Calculate position and velocity kinematics
- int calculatePositionAndVelocityKinematics(const vecx& q, const vecx& u);
+ /// Calculates kinematics also calculated in calculateInverseDynamics,
+ /// but not dynamics.
+ /// This function ensures that correct accelerations are computed that do not
+ /// contain gravitational acceleration terms.
+ /// Does not calculate Jacobians, but only vector quantities (positions, velocities & accelerations)
+ int calculateKinematics(const vecx& q, const vecx& u, const vecx& dot_u);
+ /// Calculate position kinematics
+ int calculatePositionKinematics(const vecx& q);
+ /// Calculate position and velocity kinematics
+ int calculatePositionAndVelocityKinematics(const vecx& q, const vecx& u);
#if (defined BT_ID_HAVE_MAT3X) && (defined BT_ID_WITH_JACOBIANS)
- /// Calculate Jacobians (dvel/du), as well as velocity-dependent accelearation components
- /// d(Jacobian)/dt*u
- /// This function assumes that calculateInverseDynamics was called, or calculateKinematics,
- /// or calculatePositionAndVelocityKinematics
- int calculateJacobians(const vecx& q, const vecx& u);
- /// Calculate Jacobians (dvel/du)
- /// This function assumes that calculateInverseDynamics was called, or
- /// one of the calculateKineamtics functions
- int calculateJacobians(const vecx& q);
-#endif // BT_ID_HAVE_MAT3X
-
+ /// Calculate Jacobians (dvel/du), as well as velocity-dependent accelearation components
+ /// d(Jacobian)/dt*u
+ /// This function assumes that calculateInverseDynamics was called, or calculateKinematics,
+ /// or calculatePositionAndVelocityKinematics
+ int calculateJacobians(const vecx& q, const vecx& u);
+ /// Calculate Jacobians (dvel/du)
+ /// This function assumes that calculateInverseDynamics was called, or
+ /// one of the calculateKineamtics functions
+ int calculateJacobians(const vecx& q);
+#endif // BT_ID_HAVE_MAT3X
/// set gravitational acceleration
/// the default is [0;0;-9.8] in the world frame
@@ -231,15 +235,15 @@ public:
int getBodyLinearAcceleration(const int body_index, vec3* world_acceleration) const;
#if (defined BT_ID_HAVE_MAT3X) && (defined BT_ID_WITH_JACOBIANS)
- // get translational jacobian, in world frame (dworld_velocity/du)
- int getBodyJacobianTrans(const int body_index, mat3x* world_jac_trans) const;
- // get rotational jacobian, in world frame (dworld_omega/du)
- int getBodyJacobianRot(const int body_index, mat3x* world_jac_rot) const;
- // get product of translational jacobian derivative * generatlized velocities
- int getBodyDotJacobianTransU(const int body_index, vec3* world_dot_jac_trans_u) const;
- // get product of rotational jacobian derivative * generatlized velocities
- int getBodyDotJacobianRotU(const int body_index, vec3* world_dot_jac_rot_u) const;
-#endif // BT_ID_HAVE_MAT3X
+ // get translational jacobian, in world frame (dworld_velocity/du)
+ int getBodyJacobianTrans(const int body_index, mat3x* world_jac_trans) const;
+ // get rotational jacobian, in world frame (dworld_omega/du)
+ int getBodyJacobianRot(const int body_index, mat3x* world_jac_rot) const;
+ // get product of translational jacobian derivative * generatlized velocities
+ int getBodyDotJacobianTransU(const int body_index, vec3* world_dot_jac_trans_u) const;
+ // get product of rotational jacobian derivative * generatlized velocities
+ int getBodyDotJacobianRotU(const int body_index, vec3* world_dot_jac_rot_u) const;
+#endif // BT_ID_HAVE_MAT3X
/// returns the (internal) index of body
/// @param body_index is the index of a body
@@ -256,21 +260,21 @@ public:
/// @param joint_type string naming the corresponding joint type
/// @return 0 on success, -1 on failure
int getJointTypeStr(const int body_index, const char** joint_type) const;
- /// get offset translation to parent body (see addBody)
+ /// get offset translation to parent body (see addBody)
/// @param body_index index of the body
/// @param r the offset translation (see above)
/// @return 0 on success, -1 on failure
- int getParentRParentBodyRef(const int body_index, vec3* r) const;
+ int getParentRParentBodyRef(const int body_index, vec3* r) const;
/// get offset rotation to parent body (see addBody)
/// @param body_index index of the body
/// @param T the transform (see above)
/// @return 0 on success, -1 on failure
- int getBodyTParentRef(const int body_index, mat33* T) const;
+ int getBodyTParentRef(const int body_index, mat33* T) const;
/// get axis of motion (see addBody)
/// @param body_index index of the body
/// @param axis the axis (see above)
/// @return 0 on success, -1 on failure
- int getBodyAxisOfMotion(const int body_index, vec3* axis) const;
+ int getBodyAxisOfMotion(const int body_index, vec3* axis) const;
/// get offset for degrees of freedom of this body into the q-vector
/// @param body_index index of the body
/// @param q_offset offset the q vector
diff --git a/thirdparty/bullet/BulletInverseDynamics/details/IDEigenInterface.hpp b/thirdparty/bullet/BulletInverseDynamics/details/IDEigenInterface.hpp
index 836395cea2..fe4f102513 100644
--- a/thirdparty/bullet/BulletInverseDynamics/details/IDEigenInterface.hpp
+++ b/thirdparty/bullet/BulletInverseDynamics/details/IDEigenInterface.hpp
@@ -1,8 +1,8 @@
#ifndef INVDYNEIGENINTERFACE_HPP_
#define INVDYNEIGENINTERFACE_HPP_
#include "../IDConfig.hpp"
-namespace btInverseDynamics {
-
+namespace btInverseDynamics
+{
#define BT_ID_HAVE_MAT3X
#ifdef BT_USE_DOUBLE_PRECISION
@@ -19,18 +19,21 @@ typedef Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::DontAlign> m
typedef Eigen::Matrix<float, 3, Eigen::Dynamic, Eigen::DontAlign> mat3x;
#endif
-inline void resize(mat3x &m, Eigen::Index size) {
- m.resize(3, size);
- m.setZero();
+inline void resize(mat3x &m, Eigen::Index size)
+{
+ m.resize(3, size);
+ m.setZero();
}
-inline void setMatxxElem(const idArrayIdx row, const idArrayIdx col, const idScalar val, matxx*m){
- (*m)(row, col) = val;
+inline void setMatxxElem(const idArrayIdx row, const idArrayIdx col, const idScalar val, matxx *m)
+{
+ (*m)(row, col) = val;
}
-inline void setMat3xElem(const idArrayIdx row, const idArrayIdx col, const idScalar val, mat3x*m){
- (*m)(row, col) = val;
+inline void setMat3xElem(const idArrayIdx row, const idArrayIdx col, const idScalar val, mat3x *m)
+{
+ (*m)(row, col) = val;
}
-}
+} // namespace btInverseDynamics
#endif // INVDYNEIGENINTERFACE_HPP_
diff --git a/thirdparty/bullet/BulletInverseDynamics/details/IDLinearMathInterface.hpp b/thirdparty/bullet/BulletInverseDynamics/details/IDLinearMathInterface.hpp
index c179daeec6..0c398a3727 100644
--- a/thirdparty/bullet/BulletInverseDynamics/details/IDLinearMathInterface.hpp
+++ b/thirdparty/bullet/BulletInverseDynamics/details/IDLinearMathInterface.hpp
@@ -10,32 +10,37 @@
#include "../../LinearMath/btMatrixX.h"
#define BT_ID_HAVE_MAT3X
-namespace btInverseDynamics {
+namespace btInverseDynamics
+{
class vec3;
class vecx;
class mat33;
typedef btMatrixX<idScalar> matxx;
-class vec3 : public btVector3 {
+class vec3 : public btVector3
+{
public:
vec3() : btVector3() {}
vec3(const btVector3& btv) { *this = btv; }
idScalar& operator()(int i) { return (*this)[i]; }
const idScalar& operator()(int i) const { return (*this)[i]; }
int size() const { return 3; }
- const vec3& operator=(const btVector3& rhs) {
+ const vec3& operator=(const btVector3& rhs)
+ {
*static_cast<btVector3*>(this) = rhs;
return *this;
}
};
-class mat33 : public btMatrix3x3 {
+class mat33 : public btMatrix3x3
+{
public:
mat33() : btMatrix3x3() {}
mat33(const btMatrix3x3& btm) { *this = btm; }
idScalar& operator()(int i, int j) { return (*this)[i][j]; }
const idScalar& operator()(int i, int j) const { return (*this)[i][j]; }
- const mat33& operator=(const btMatrix3x3& rhs) {
+ const mat33& operator=(const btMatrix3x3& rhs)
+ {
*static_cast<btMatrix3x3*>(this) = rhs;
return *this;
}
@@ -47,10 +52,12 @@ inline mat33 operator/(const mat33& a, const idScalar& s) { return a * (1.0 / s)
inline mat33 operator*(const idScalar& s, const mat33& a) { return a * s; }
-class vecx : public btVectorX<idScalar> {
+class vecx : public btVectorX<idScalar>
+{
public:
vecx(int size) : btVectorX<idScalar>(size) {}
- const vecx& operator=(const btVectorX<idScalar>& rhs) {
+ const vecx& operator=(const btVectorX<idScalar>& rhs)
+ {
*static_cast<btVectorX<idScalar>*>(this) = rhs;
return *this;
}
@@ -66,43 +73,53 @@ public:
friend vecx operator/(const vecx& a, const idScalar& s);
};
-inline vecx operator*(const vecx& a, const idScalar& s) {
+inline vecx operator*(const vecx& a, const idScalar& s)
+{
vecx result(a.size());
- for (int i = 0; i < result.size(); i++) {
+ for (int i = 0; i < result.size(); i++)
+ {
result(i) = a(i) * s;
}
return result;
}
inline vecx operator*(const idScalar& s, const vecx& a) { return a * s; }
-inline vecx operator+(const vecx& a, const vecx& b) {
+inline vecx operator+(const vecx& a, const vecx& b)
+{
vecx result(a.size());
// TODO: error handling for a.size() != b.size()??
- if (a.size() != b.size()) {
+ if (a.size() != b.size())
+ {
bt_id_error_message("size missmatch. a.size()= %d, b.size()= %d\n", a.size(), b.size());
abort();
}
- for (int i = 0; i < a.size(); i++) {
+ for (int i = 0; i < a.size(); i++)
+ {
result(i) = a(i) + b(i);
}
return result;
}
-inline vecx operator-(const vecx& a, const vecx& b) {
+inline vecx operator-(const vecx& a, const vecx& b)
+{
vecx result(a.size());
// TODO: error handling for a.size() != b.size()??
- if (a.size() != b.size()) {
+ if (a.size() != b.size())
+ {
bt_id_error_message("size missmatch. a.size()= %d, b.size()= %d\n", a.size(), b.size());
abort();
}
- for (int i = 0; i < a.size(); i++) {
+ for (int i = 0; i < a.size(); i++)
+ {
result(i) = a(i) - b(i);
}
return result;
}
-inline vecx operator/(const vecx& a, const idScalar& s) {
+inline vecx operator/(const vecx& a, const idScalar& s)
+{
vecx result(a.size());
- for (int i = 0; i < result.size(); i++) {
+ for (int i = 0; i < result.size(); i++)
+ {
result(i) = a(i) / s;
}
@@ -110,63 +127,76 @@ inline vecx operator/(const vecx& a, const idScalar& s) {
}
// use btMatrixX to implement 3xX matrix
-class mat3x : public matxx {
+class mat3x : public matxx
+{
public:
- mat3x(){}
- mat3x(const mat3x&rhs) {
- matxx::resize(rhs.rows(), rhs.cols());
- *this = rhs;
- }
- mat3x(int rows, int cols): matxx(3,cols) {
- }
- void operator=(const mat3x& rhs) {
- if (m_cols != rhs.m_cols) {
- bt_id_error_message("size missmatch, cols= %d but rhs.cols= %d\n", cols(), rhs.cols());
- abort();
+ mat3x() {}
+ mat3x(const mat3x& rhs)
+ {
+ matxx::resize(rhs.rows(), rhs.cols());
+ *this = rhs;
+ }
+ mat3x(int rows, int cols) : matxx(3, cols)
+ {
+ }
+ void operator=(const mat3x& rhs)
+ {
+ if (m_cols != rhs.m_cols)
+ {
+ bt_id_error_message("size missmatch, cols= %d but rhs.cols= %d\n", cols(), rhs.cols());
+ abort();
+ }
+ for (int i = 0; i < rows(); i++)
+ {
+ for (int k = 0; k < cols(); k++)
+ {
+ setElem(i, k, rhs(i, k));
+ }
+ }
+ }
+ void setZero()
+ {
+ matxx::setZero();
}
- for(int i=0;i<rows();i++) {
- for(int k=0;k<cols();k++) {
- setElem(i,k,rhs(i,k));
- }
- }
- }
- void setZero() {
- matxx::setZero();
- }
};
-
-inline vec3 operator*(const mat3x& a, const vecx& b) {
- vec3 result;
- if (a.cols() != b.size()) {
- bt_id_error_message("size missmatch. a.cols()= %d, b.size()= %d\n", a.cols(), b.size());
- abort();
- }
- result(0)=0.0;
- result(1)=0.0;
- result(2)=0.0;
- for(int i=0;i<b.size();i++) {
- for(int k=0;k<3;k++) {
- result(k)+=a(k,i)*b(i);
- }
- }
- return result;
+inline vec3 operator*(const mat3x& a, const vecx& b)
+{
+ vec3 result;
+ if (a.cols() != b.size())
+ {
+ bt_id_error_message("size missmatch. a.cols()= %d, b.size()= %d\n", a.cols(), b.size());
+ abort();
+ }
+ result(0) = 0.0;
+ result(1) = 0.0;
+ result(2) = 0.0;
+ for (int i = 0; i < b.size(); i++)
+ {
+ for (int k = 0; k < 3; k++)
+ {
+ result(k) += a(k, i) * b(i);
+ }
+ }
+ return result;
}
-
-inline void resize(mat3x &m, idArrayIdx size) {
- m.resize(3, size);
- m.setZero();
+inline void resize(mat3x& m, idArrayIdx size)
+{
+ m.resize(3, size);
+ m.setZero();
}
-inline void setMatxxElem(const idArrayIdx row, const idArrayIdx col, const idScalar val, matxx*m){
- m->setElem(row, col, val);
+inline void setMatxxElem(const idArrayIdx row, const idArrayIdx col, const idScalar val, matxx* m)
+{
+ m->setElem(row, col, val);
}
-inline void setMat3xElem(const idArrayIdx row, const idArrayIdx col, const idScalar val, mat3x*m){
- m->setElem(row, col, val);
+inline void setMat3xElem(const idArrayIdx row, const idArrayIdx col, const idScalar val, mat3x* m)
+{
+ m->setElem(row, col, val);
}
-}
+} // namespace btInverseDynamics
#endif // IDLINEARMATHINTERFACE_HPP_
diff --git a/thirdparty/bullet/BulletInverseDynamics/details/IDMatVec.hpp b/thirdparty/bullet/BulletInverseDynamics/details/IDMatVec.hpp
index c89db5e123..1c786095e7 100644
--- a/thirdparty/bullet/BulletInverseDynamics/details/IDMatVec.hpp
+++ b/thirdparty/bullet/BulletInverseDynamics/details/IDMatVec.hpp
@@ -7,7 +7,8 @@
#include "../IDConfig.hpp"
#define BT_ID_HAVE_MAT3X
-namespace btInverseDynamics {
+namespace btInverseDynamics
+{
class vec3;
class vecx;
class mat33;
@@ -17,7 +18,8 @@ class mat3x;
/// This is a very basic implementation to enable stand-alone use of the library.
/// The implementation is not really optimized and misses many features that you would
/// want from a "fully featured" linear math library.
-class vec3 {
+class vec3
+{
public:
idScalar& operator()(int i) { return m_data[i]; }
const idScalar& operator()(int i) const { return m_data[i]; }
@@ -40,7 +42,8 @@ private:
idScalar m_data[3];
};
-class mat33 {
+class mat33
+{
public:
idScalar& operator()(int i, int j) { return m_data[3 * i + j]; }
const idScalar& operator()(int i, int j) const { return m_data[3 * i + j]; }
@@ -62,9 +65,11 @@ private:
idScalar m_data[9];
};
-class vecx {
+class vecx
+{
public:
- vecx(int size) : m_size(size) {
+ vecx(int size) : m_size(size)
+ {
m_data = static_cast<idScalar*>(idMalloc(sizeof(idScalar) * size));
}
~vecx() { idFree(m_data); }
@@ -85,14 +90,17 @@ private:
idScalar* m_data;
};
-class matxx {
+class matxx
+{
public:
- matxx() {
- m_data = 0x0;
- m_cols=0;
- m_rows=0;
- }
- matxx(int rows, int cols) : m_rows(rows), m_cols(cols) {
+ matxx()
+ {
+ m_data = 0x0;
+ m_cols = 0;
+ m_rows = 0;
+ }
+ matxx(int rows, int cols) : m_rows(rows), m_cols(cols)
+ {
m_data = static_cast<idScalar*>(idMalloc(sizeof(idScalar) * rows * cols));
}
~matxx() { idFree(m_data); }
@@ -107,69 +115,86 @@ private:
idScalar* m_data;
};
-class mat3x {
+class mat3x
+{
public:
- mat3x() {
- m_data = 0x0;
- m_cols=0;
- }
- mat3x(const mat3x&rhs) {
- m_cols=rhs.m_cols;
- allocate();
- *this = rhs;
- }
- mat3x(int rows, int cols): m_cols(cols) {
- allocate();
- };
- void operator=(const mat3x& rhs) {
- if (m_cols != rhs.m_cols) {
- bt_id_error_message("size missmatch, cols= %d but rhs.cols= %d\n", cols(), rhs.cols());
- abort();
- }
- for(int i=0;i<3*m_cols;i++) {
- m_data[i] = rhs.m_data[i];
- }
- }
-
- ~mat3x() {
- free();
- }
- idScalar& operator()(int row, int col) { return m_data[row * m_cols + col]; }
- const idScalar& operator()(int row, int col) const { return m_data[row * m_cols + col]; }
- int rows() const { return m_rows; }
- const int& cols() const { return m_cols; }
- void resize(int rows, int cols) {
- m_cols=cols;
- free();
- allocate();
- }
- void setZero() {
- memset(m_data,0x0,sizeof(idScalar)*m_rows*m_cols);
- }
- // avoid operators that would allocate -- use functions sub/add/mul in IDMath.hpp instead
+ mat3x()
+ {
+ m_data = 0x0;
+ m_cols = 0;
+ }
+ mat3x(const mat3x& rhs)
+ {
+ m_cols = rhs.m_cols;
+ allocate();
+ *this = rhs;
+ }
+ mat3x(int rows, int cols) : m_cols(cols)
+ {
+ allocate();
+ };
+ void operator=(const mat3x& rhs)
+ {
+ if (m_cols != rhs.m_cols)
+ {
+ bt_id_error_message("size missmatch, cols= %d but rhs.cols= %d\n", cols(), rhs.cols());
+ abort();
+ }
+ for (int i = 0; i < 3 * m_cols; i++)
+ {
+ m_data[i] = rhs.m_data[i];
+ }
+ }
+
+ ~mat3x()
+ {
+ free();
+ }
+ idScalar& operator()(int row, int col) { return m_data[row * m_cols + col]; }
+ const idScalar& operator()(int row, int col) const { return m_data[row * m_cols + col]; }
+ int rows() const { return m_rows; }
+ const int& cols() const { return m_cols; }
+ void resize(int rows, int cols)
+ {
+ m_cols = cols;
+ free();
+ allocate();
+ }
+ void setZero()
+ {
+ memset(m_data, 0x0, sizeof(idScalar) * m_rows * m_cols);
+ }
+ // avoid operators that would allocate -- use functions sub/add/mul in IDMath.hpp instead
private:
- void allocate(){m_data = static_cast<idScalar*>(idMalloc(sizeof(idScalar) * m_rows * m_cols));}
- void free() { idFree(m_data);}
- enum {m_rows=3};
- int m_cols;
- idScalar* m_data;
+ void allocate() { m_data = static_cast<idScalar*>(idMalloc(sizeof(idScalar) * m_rows * m_cols)); }
+ void free() { idFree(m_data); }
+ enum
+ {
+ m_rows = 3
+ };
+ int m_cols;
+ idScalar* m_data;
};
-inline void resize(mat3x &m, idArrayIdx size) {
- m.resize(3, size);
- m.setZero();
+inline void resize(mat3x& m, idArrayIdx size)
+{
+ m.resize(3, size);
+ m.setZero();
}
//////////////////////////////////////////////////
// Implementations
-inline const vec3& vec3::operator=(const vec3& rhs) {
- if (&rhs != this) {
+inline const vec3& vec3::operator=(const vec3& rhs)
+{
+ if (&rhs != this)
+ {
memcpy(m_data, rhs.m_data, 3 * sizeof(idScalar));
}
return *this;
}
-inline vec3 vec3::cross(const vec3& b) const {
+inline vec3 vec3::cross(const vec3& b) const
+{
vec3 result;
result.m_data[0] = m_data[1] * b.m_data[2] - m_data[2] * b.m_data[1];
result.m_data[1] = m_data[2] * b.m_data[0] - m_data[0] * b.m_data[2];
@@ -178,17 +203,21 @@ inline vec3 vec3::cross(const vec3& b) const {
return result;
}
-inline idScalar vec3::dot(const vec3& b) const {
+inline idScalar vec3::dot(const vec3& b) const
+{
return m_data[0] * b.m_data[0] + m_data[1] * b.m_data[1] + m_data[2] * b.m_data[2];
}
-inline const mat33& mat33::operator=(const mat33& rhs) {
- if (&rhs != this) {
+inline const mat33& mat33::operator=(const mat33& rhs)
+{
+ if (&rhs != this)
+ {
memcpy(m_data, rhs.m_data, 9 * sizeof(idScalar));
}
return *this;
}
-inline mat33 mat33::transpose() const {
+inline mat33 mat33::transpose() const
+{
mat33 result;
result.m_data[0] = m_data[0];
result.m_data[1] = m_data[3];
@@ -203,7 +232,8 @@ inline mat33 mat33::transpose() const {
return result;
}
-inline mat33 operator*(const mat33& a, const mat33& b) {
+inline mat33 operator*(const mat33& a, const mat33& b)
+{
mat33 result;
result.m_data[0] =
a.m_data[0] * b.m_data[0] + a.m_data[1] * b.m_data[3] + a.m_data[2] * b.m_data[6];
@@ -227,22 +257,27 @@ inline mat33 operator*(const mat33& a, const mat33& b) {
return result;
}
-inline const mat33& mat33::operator+=(const mat33& b) {
- for (int i = 0; i < 9; i++) {
+inline const mat33& mat33::operator+=(const mat33& b)
+{
+ for (int i = 0; i < 9; i++)
+ {
m_data[i] += b.m_data[i];
}
return *this;
}
-inline const mat33& mat33::operator-=(const mat33& b) {
- for (int i = 0; i < 9; i++) {
+inline const mat33& mat33::operator-=(const mat33& b)
+{
+ for (int i = 0; i < 9; i++)
+ {
m_data[i] -= b.m_data[i];
}
return *this;
}
-inline vec3 operator*(const mat33& a, const vec3& b) {
+inline vec3 operator*(const mat33& a, const vec3& b)
+{
vec3 result;
result.m_data[0] =
@@ -255,23 +290,29 @@ inline vec3 operator*(const mat33& a, const vec3& b) {
return result;
}
-inline const vec3& vec3::operator+=(const vec3& b) {
- for (int i = 0; i < 3; i++) {
+inline const vec3& vec3::operator+=(const vec3& b)
+{
+ for (int i = 0; i < 3; i++)
+ {
m_data[i] += b.m_data[i];
}
return *this;
}
-inline const vec3& vec3::operator-=(const vec3& b) {
- for (int i = 0; i < 3; i++) {
+inline const vec3& vec3::operator-=(const vec3& b)
+{
+ for (int i = 0; i < 3; i++)
+ {
m_data[i] -= b.m_data[i];
}
return *this;
}
-inline mat33 operator*(const mat33& a, const idScalar& s) {
+inline mat33 operator*(const mat33& a, const idScalar& s)
+{
mat33 result;
- for (int i = 0; i < 9; i++) {
+ for (int i = 0; i < 9; i++)
+ {
result.m_data[i] = a.m_data[i] * s;
}
return result;
@@ -279,137 +320,170 @@ inline mat33 operator*(const mat33& a, const idScalar& s) {
inline mat33 operator*(const idScalar& s, const mat33& a) { return a * s; }
-inline vec3 operator*(const vec3& a, const idScalar& s) {
+inline vec3 operator*(const vec3& a, const idScalar& s)
+{
vec3 result;
- for (int i = 0; i < 3; i++) {
+ for (int i = 0; i < 3; i++)
+ {
result.m_data[i] = a.m_data[i] * s;
}
return result;
}
inline vec3 operator*(const idScalar& s, const vec3& a) { return a * s; }
-inline mat33 operator+(const mat33& a, const mat33& b) {
+inline mat33 operator+(const mat33& a, const mat33& b)
+{
mat33 result;
- for (int i = 0; i < 9; i++) {
+ for (int i = 0; i < 9; i++)
+ {
result.m_data[i] = a.m_data[i] + b.m_data[i];
}
return result;
}
-inline vec3 operator+(const vec3& a, const vec3& b) {
+inline vec3 operator+(const vec3& a, const vec3& b)
+{
vec3 result;
- for (int i = 0; i < 3; i++) {
+ for (int i = 0; i < 3; i++)
+ {
result.m_data[i] = a.m_data[i] + b.m_data[i];
}
return result;
}
-inline mat33 operator-(const mat33& a, const mat33& b) {
+inline mat33 operator-(const mat33& a, const mat33& b)
+{
mat33 result;
- for (int i = 0; i < 9; i++) {
+ for (int i = 0; i < 9; i++)
+ {
result.m_data[i] = a.m_data[i] - b.m_data[i];
}
return result;
}
-inline vec3 operator-(const vec3& a, const vec3& b) {
+inline vec3 operator-(const vec3& a, const vec3& b)
+{
vec3 result;
- for (int i = 0; i < 3; i++) {
+ for (int i = 0; i < 3; i++)
+ {
result.m_data[i] = a.m_data[i] - b.m_data[i];
}
return result;
}
-inline mat33 operator/(const mat33& a, const idScalar& s) {
+inline mat33 operator/(const mat33& a, const idScalar& s)
+{
mat33 result;
- for (int i = 0; i < 9; i++) {
+ for (int i = 0; i < 9; i++)
+ {
result.m_data[i] = a.m_data[i] / s;
}
return result;
}
-inline vec3 operator/(const vec3& a, const idScalar& s) {
+inline vec3 operator/(const vec3& a, const idScalar& s)
+{
vec3 result;
- for (int i = 0; i < 3; i++) {
+ for (int i = 0; i < 3; i++)
+ {
result.m_data[i] = a.m_data[i] / s;
}
return result;
}
-inline const vecx& vecx::operator=(const vecx& rhs) {
- if (size() != rhs.size()) {
+inline const vecx& vecx::operator=(const vecx& rhs)
+{
+ if (size() != rhs.size())
+ {
bt_id_error_message("size missmatch, size()= %d but rhs.size()= %d\n", size(), rhs.size());
abort();
}
- if (&rhs != this) {
+ if (&rhs != this)
+ {
memcpy(m_data, rhs.m_data, rhs.size() * sizeof(idScalar));
}
return *this;
}
-inline vecx operator*(const vecx& a, const idScalar& s) {
+inline vecx operator*(const vecx& a, const idScalar& s)
+{
vecx result(a.size());
- for (int i = 0; i < result.size(); i++) {
+ for (int i = 0; i < result.size(); i++)
+ {
result.m_data[i] = a.m_data[i] * s;
}
return result;
}
inline vecx operator*(const idScalar& s, const vecx& a) { return a * s; }
-inline vecx operator+(const vecx& a, const vecx& b) {
+inline vecx operator+(const vecx& a, const vecx& b)
+{
vecx result(a.size());
// TODO: error handling for a.size() != b.size()??
- if (a.size() != b.size()) {
+ if (a.size() != b.size())
+ {
bt_id_error_message("size missmatch. a.size()= %d, b.size()= %d\n", a.size(), b.size());
abort();
}
- for (int i = 0; i < a.size(); i++) {
+ for (int i = 0; i < a.size(); i++)
+ {
result.m_data[i] = a.m_data[i] + b.m_data[i];
}
return result;
}
-inline vecx operator-(const vecx& a, const vecx& b) {
+inline vecx operator-(const vecx& a, const vecx& b)
+{
vecx result(a.size());
// TODO: error handling for a.size() != b.size()??
- if (a.size() != b.size()) {
+ if (a.size() != b.size())
+ {
bt_id_error_message("size missmatch. a.size()= %d, b.size()= %d\n", a.size(), b.size());
abort();
}
- for (int i = 0; i < a.size(); i++) {
+ for (int i = 0; i < a.size(); i++)
+ {
result.m_data[i] = a.m_data[i] - b.m_data[i];
}
return result;
}
-inline vecx operator/(const vecx& a, const idScalar& s) {
+inline vecx operator/(const vecx& a, const idScalar& s)
+{
vecx result(a.size());
- for (int i = 0; i < result.size(); i++) {
+ for (int i = 0; i < result.size(); i++)
+ {
result.m_data[i] = a.m_data[i] / s;
}
return result;
}
-inline vec3 operator*(const mat3x& a, const vecx& b) {
- vec3 result;
- if (a.cols() != b.size()) {
- bt_id_error_message("size missmatch. a.cols()= %d, b.size()= %d\n", a.cols(), b.size());
- abort();
- }
- result(0)=0.0;
- result(1)=0.0;
- result(2)=0.0;
- for(int i=0;i<b.size();i++) {
- for(int k=0;k<3;k++) {
- result(k)+=a(k,i)*b(i);
- }
- }
- return result;
+inline vec3 operator*(const mat3x& a, const vecx& b)
+{
+ vec3 result;
+ if (a.cols() != b.size())
+ {
+ bt_id_error_message("size missmatch. a.cols()= %d, b.size()= %d\n", a.cols(), b.size());
+ abort();
+ }
+ result(0) = 0.0;
+ result(1) = 0.0;
+ result(2) = 0.0;
+ for (int i = 0; i < b.size(); i++)
+ {
+ for (int k = 0; k < 3; k++)
+ {
+ result(k) += a(k, i) * b(i);
+ }
+ }
+ return result;
}
-inline void setMatxxElem(const idArrayIdx row, const idArrayIdx col, const idScalar val, matxx*m){
- (*m)(row, col) = val;
+inline void setMatxxElem(const idArrayIdx row, const idArrayIdx col, const idScalar val, matxx* m)
+{
+ (*m)(row, col) = val;
}
-inline void setMat3xElem(const idArrayIdx row, const idArrayIdx col, const idScalar val, mat3x*m){
- (*m)(row, col) = val;
+inline void setMat3xElem(const idArrayIdx row, const idArrayIdx col, const idScalar val, mat3x* m)
+{
+ (*m)(row, col) = val;
}
-} // namespace btInverseDynamcis
+} // namespace btInverseDynamics
#endif
diff --git a/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeImpl.cpp b/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeImpl.cpp
index e8563238c3..befbc2e2a4 100644
--- a/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeImpl.cpp
+++ b/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeImpl.cpp
@@ -1,16 +1,16 @@
#include "MultiBodyTreeImpl.hpp"
-namespace btInverseDynamics {
-
+namespace btInverseDynamics
+{
MultiBodyTree::MultiBodyImpl::MultiBodyImpl(int num_bodies_, int num_dofs_)
: m_num_bodies(num_bodies_), m_num_dofs(num_dofs_)
#if (defined BT_ID_HAVE_MAT3X) && (defined BT_ID_WITH_JACOBIANS)
- ,m_m3x(3,m_num_dofs)
+ ,
+ m_m3x(3, m_num_dofs)
#endif
{
-
#if (defined BT_ID_HAVE_MAT3X) && (defined BT_ID_WITH_JACOBIANS)
- resize(m_m3x,m_num_dofs);
+ resize(m_m3x, m_num_dofs);
#endif
m_body_list.resize(num_bodies_);
m_parent_index.resize(num_bodies_);
@@ -23,8 +23,10 @@ MultiBodyTree::MultiBodyImpl::MultiBodyImpl(int num_bodies_, int num_dofs_)
m_world_gravity(2) = -9.8;
}
-const char *MultiBodyTree::MultiBodyImpl::jointTypeToString(const JointType &type) const {
- switch (type) {
+const char *MultiBodyTree::MultiBodyImpl::jointTypeToString(const JointType &type) const
+{
+ switch (type)
+ {
case FIXED:
return "fixed";
case REVOLUTE:
@@ -33,22 +35,28 @@ const char *MultiBodyTree::MultiBodyImpl::jointTypeToString(const JointType &typ
return "prismatic";
case FLOATING:
return "floating";
+ case SPHERICAL:
+ return "spherical";
}
return "error: invalid";
}
-inline void indent(const int &level) {
+inline void indent(const int &level)
+{
for (int j = 0; j < level; j++)
id_printf(" "); // indent
}
-void MultiBodyTree::MultiBodyImpl::printTree() {
+void MultiBodyTree::MultiBodyImpl::printTree()
+{
id_printf("body %.2d[%s]: root\n", 0, jointTypeToString(m_body_list[0].m_joint_type));
printTree(0, 0);
}
-void MultiBodyTree::MultiBodyImpl::printTreeData() {
- for (idArrayIdx i = 0; i < m_body_list.size(); i++) {
+void MultiBodyTree::MultiBodyImpl::printTreeData()
+{
+ for (idArrayIdx i = 0; i < m_body_list.size(); i++)
+ {
RigidBody &body = m_body_list[i];
id_printf("body: %d\n", static_cast<int>(i));
id_printf("type: %s\n", jointTypeToString(body.m_joint_type));
@@ -59,19 +67,22 @@ void MultiBodyTree::MultiBodyImpl::printTreeData() {
id_printf("mass = %f\n", body.m_mass);
id_printf("mass * com = [%f %f %f]\n", body.m_body_mass_com(0), body.m_body_mass_com(1),
body.m_body_mass_com(2));
- id_printf("I_o= [%f %f %f;\n"
- " %f %f %f;\n"
- " %f %f %f]\n",
- body.m_body_I_body(0, 0), body.m_body_I_body(0, 1), body.m_body_I_body(0, 2),
- body.m_body_I_body(1, 0), body.m_body_I_body(1, 1), body.m_body_I_body(1, 2),
- body.m_body_I_body(2, 0), body.m_body_I_body(2, 1), body.m_body_I_body(2, 2));
+ id_printf(
+ "I_o= [%f %f %f;\n"
+ " %f %f %f;\n"
+ " %f %f %f]\n",
+ body.m_body_I_body(0, 0), body.m_body_I_body(0, 1), body.m_body_I_body(0, 2),
+ body.m_body_I_body(1, 0), body.m_body_I_body(1, 1), body.m_body_I_body(1, 2),
+ body.m_body_I_body(2, 0), body.m_body_I_body(2, 1), body.m_body_I_body(2, 2));
id_printf("parent_pos_parent_body_ref= [%f %f %f]\n", body.m_parent_pos_parent_body_ref(0),
body.m_parent_pos_parent_body_ref(1), body.m_parent_pos_parent_body_ref(2));
}
}
-int MultiBodyTree::MultiBodyImpl::bodyNumDoFs(const JointType &type) const {
- switch (type) {
+int MultiBodyTree::MultiBodyImpl::bodyNumDoFs(const JointType &type) const
+{
+ switch (type)
+ {
case FIXED:
return 0;
case REVOLUTE:
@@ -79,12 +90,15 @@ int MultiBodyTree::MultiBodyImpl::bodyNumDoFs(const JointType &type) const {
return 1;
case FLOATING:
return 6;
+ case SPHERICAL:
+ return 3;
}
bt_id_error_message("unknown joint type %d\n", type);
return 0;
}
-void MultiBodyTree::MultiBodyImpl::printTree(int index, int indentation) {
+void MultiBodyTree::MultiBodyImpl::printTree(int index, int indentation)
+{
// this is adapted from URDF2Bullet.
// TODO: fix this and print proper graph (similar to git --log --graph)
int num_children = m_child_indices[index].size();
@@ -92,7 +106,8 @@ void MultiBodyTree::MultiBodyImpl::printTree(int index, int indentation) {
indentation += 2;
int count = 0;
- for (int i = 0; i < num_children; i++) {
+ for (int i = 0; i < num_children; i++)
+ {
int child_index = m_child_indices[index][i];
indent(indentation);
id_printf("body %.2d[%s]: %.2d is child no. %d (qi= %d .. %d) \n", index,
@@ -104,19 +119,23 @@ void MultiBodyTree::MultiBodyImpl::printTree(int index, int indentation) {
}
}
-int MultiBodyTree::MultiBodyImpl::setGravityInWorldFrame(const vec3 &gravity) {
+int MultiBodyTree::MultiBodyImpl::setGravityInWorldFrame(const vec3 &gravity)
+{
m_world_gravity = gravity;
return 0;
}
-int MultiBodyTree::MultiBodyImpl::generateIndexSets() {
+int MultiBodyTree::MultiBodyImpl::generateIndexSets()
+{
m_body_revolute_list.resize(0);
m_body_prismatic_list.resize(0);
int q_index = 0;
- for (idArrayIdx i = 0; i < m_body_list.size(); i++) {
+ for (idArrayIdx i = 0; i < m_body_list.size(); i++)
+ {
RigidBody &body = m_body_list[i];
body.m_q_index = -1;
- switch (body.m_joint_type) {
+ switch (body.m_joint_type)
+ {
case REVOLUTE:
m_body_revolute_list.push_back(i);
body.m_q_index = q_index;
@@ -135,28 +154,41 @@ int MultiBodyTree::MultiBodyImpl::generateIndexSets() {
body.m_q_index = q_index;
q_index += 6;
break;
+ case SPHERICAL:
+ m_body_spherical_list.push_back(i);
+ body.m_q_index = q_index;
+ q_index += 3;
+ break;
default:
bt_id_error_message("unsupported joint type %d\n", body.m_joint_type);
return -1;
}
}
// sanity check
- if (q_index != m_num_dofs) {
+ if (q_index != m_num_dofs)
+ {
bt_id_error_message("internal error, q_index= %d but num_dofs %d\n", q_index, m_num_dofs);
return -1;
}
m_child_indices.resize(m_body_list.size());
- for (idArrayIdx child = 1; child < m_parent_index.size(); child++) {
+ for (idArrayIdx child = 1; child < m_parent_index.size(); child++)
+ {
const int &parent = m_parent_index[child];
- if (parent >= 0 && parent < (static_cast<int>(m_parent_index.size()) - 1)) {
+ if (parent >= 0 && parent < (static_cast<int>(m_parent_index.size()) - 1))
+ {
m_child_indices[parent].push_back(child);
- } else {
- if (-1 == parent) {
+ }
+ else
+ {
+ if (-1 == parent)
+ {
// multiple bodies are directly linked to the environment, ie, not a single root
bt_id_error_message("building index sets parent(%zu)= -1 (multiple roots)\n", child);
- } else {
+ }
+ else
+ {
// should never happen
bt_id_error_message(
"building index sets. parent_index[%zu]= %d, but m_parent_index.size()= %d\n",
@@ -169,11 +201,14 @@ int MultiBodyTree::MultiBodyImpl::generateIndexSets() {
return 0;
}
-void MultiBodyTree::MultiBodyImpl::calculateStaticData() {
+void MultiBodyTree::MultiBodyImpl::calculateStaticData()
+{
// relative kinematics that are not a function of q, u, dot_u
- for (idArrayIdx i = 0; i < m_body_list.size(); i++) {
+ for (idArrayIdx i = 0; i < m_body_list.size(); i++)
+ {
RigidBody &body = m_body_list[i];
- switch (body.m_joint_type) {
+ switch (body.m_joint_type)
+ {
case REVOLUTE:
body.m_parent_vel_rel(0) = 0;
body.m_parent_vel_rel(1) = 0;
@@ -212,41 +247,56 @@ void MultiBodyTree::MultiBodyImpl::calculateStaticData() {
case FLOATING:
// no static data
break;
+ case SPHERICAL:
+ //todo: review
+ body.m_parent_pos_parent_body = body.m_parent_pos_parent_body_ref;
+ body.m_parent_vel_rel(0) = 0;
+ body.m_parent_vel_rel(1) = 0;
+ body.m_parent_vel_rel(2) = 0;
+ body.m_parent_acc_rel(0) = 0;
+ body.m_parent_acc_rel(1) = 0;
+ body.m_parent_acc_rel(2) = 0;
+ break;
}
- // resize & initialize jacobians to zero.
+ // resize & initialize jacobians to zero.
#if (defined BT_ID_HAVE_MAT3X) && (defined BT_ID_WITH_JACOBIANS)
- body.m_body_dot_Jac_T_u(0) = 0.0;
- body.m_body_dot_Jac_T_u(1) = 0.0;
- body.m_body_dot_Jac_T_u(2) = 0.0;
- body.m_body_dot_Jac_R_u(0) = 0.0;
- body.m_body_dot_Jac_R_u(1) = 0.0;
- body.m_body_dot_Jac_R_u(2) = 0.0;
- resize(body.m_body_Jac_T,m_num_dofs);
- resize(body.m_body_Jac_R,m_num_dofs);
- body.m_body_Jac_T.setZero();
- body.m_body_Jac_R.setZero();
-#endif //
+ body.m_body_dot_Jac_T_u(0) = 0.0;
+ body.m_body_dot_Jac_T_u(1) = 0.0;
+ body.m_body_dot_Jac_T_u(2) = 0.0;
+ body.m_body_dot_Jac_R_u(0) = 0.0;
+ body.m_body_dot_Jac_R_u(1) = 0.0;
+ body.m_body_dot_Jac_R_u(2) = 0.0;
+ resize(body.m_body_Jac_T, m_num_dofs);
+ resize(body.m_body_Jac_R, m_num_dofs);
+ body.m_body_Jac_T.setZero();
+ body.m_body_Jac_R.setZero();
+#endif //
}
}
int MultiBodyTree::MultiBodyImpl::calculateInverseDynamics(const vecx &q, const vecx &u,
- const vecx &dot_u, vecx *joint_forces) {
+ const vecx &dot_u, vecx *joint_forces)
+{
if (q.size() != m_num_dofs || u.size() != m_num_dofs || dot_u.size() != m_num_dofs ||
- joint_forces->size() != m_num_dofs) {
- bt_id_error_message("wrong vector dimension. system has %d DOFs,\n"
- "but dim(q)= %d, dim(u)= %d, dim(dot_u)= %d, dim(joint_forces)= %d\n",
- m_num_dofs, static_cast<int>(q.size()), static_cast<int>(u.size()),
- static_cast<int>(dot_u.size()), static_cast<int>(joint_forces->size()));
+ joint_forces->size() != m_num_dofs)
+ {
+ bt_id_error_message(
+ "wrong vector dimension. system has %d DOFs,\n"
+ "but dim(q)= %d, dim(u)= %d, dim(dot_u)= %d, dim(joint_forces)= %d\n",
+ m_num_dofs, static_cast<int>(q.size()), static_cast<int>(u.size()),
+ static_cast<int>(dot_u.size()), static_cast<int>(joint_forces->size()));
return -1;
}
// 1. relative kinematics
- if(-1 == calculateKinematics(q,u,dot_u, POSITION_VELOCITY_ACCELERATION)) {
- bt_id_error_message("error in calculateKinematics\n");
- return -1;
- }
- // 2. update contributions to equations of motion for every body.
- for (idArrayIdx i = 0; i < m_body_list.size(); i++) {
+ if (-1 == calculateKinematics(q, u, dot_u, POSITION_VELOCITY_ACCELERATION))
+ {
+ bt_id_error_message("error in calculateKinematics\n");
+ return -1;
+ }
+ // 2. update contributions to equations of motion for every body.
+ for (idArrayIdx i = 0; i < m_body_list.size(); i++)
+ {
RigidBody &body = m_body_list[i];
// 3.4 update dynamic terms (rate of change of angular & linear momentum)
body.m_eom_lhs_rotational =
@@ -268,14 +318,16 @@ int MultiBodyTree::MultiBodyImpl::calculateInverseDynamics(const vecx &q, const
// Also, this enables adding zero weight bodies as a way to calculate frame poses
// for force elements, etc.
- for (int body_idx = m_body_list.size() - 1; body_idx >= 0; body_idx--) {
+ for (int body_idx = m_body_list.size() - 1; body_idx >= 0; body_idx--)
+ {
// sum of forces and moments acting on this body from its children
vec3 sum_f_children;
vec3 sum_m_children;
setZero(sum_f_children);
setZero(sum_m_children);
for (idArrayIdx child_list_idx = 0; child_list_idx < m_child_indices[body_idx].size();
- child_list_idx++) {
+ child_list_idx++)
+ {
const RigidBody &child = m_body_list[m_child_indices[body_idx][child_list_idx]];
vec3 child_joint_force_in_this_frame =
child.m_body_T_parent.transpose() * child.m_force_at_joint;
@@ -293,19 +345,22 @@ int MultiBodyTree::MultiBodyImpl::calculateInverseDynamics(const vecx &q, const
// These are the components of force_at_joint/moment_at_joint
// in the free directions given by Jac_JT/Jac_JR
// 4.1 revolute joints
- for (idArrayIdx i = 0; i < m_body_revolute_list.size(); i++) {
+ for (idArrayIdx i = 0; i < m_body_revolute_list.size(); i++)
+ {
RigidBody &body = m_body_list[m_body_revolute_list[i]];
// (*joint_forces)(body.m_q_index) = body.m_Jac_JR.transpose() * body.m_moment_at_joint;
(*joint_forces)(body.m_q_index) = body.m_Jac_JR.dot(body.m_moment_at_joint);
}
// 4.2 for prismatic joints
- for (idArrayIdx i = 0; i < m_body_prismatic_list.size(); i++) {
+ for (idArrayIdx i = 0; i < m_body_prismatic_list.size(); i++)
+ {
RigidBody &body = m_body_list[m_body_prismatic_list[i]];
// (*joint_forces)(body.m_q_index) = body.m_Jac_JT.transpose() * body.m_force_at_joint;
(*joint_forces)(body.m_q_index) = body.m_Jac_JT.dot(body.m_force_at_joint);
}
// 4.3 floating bodies (6-DoF joints)
- for (idArrayIdx i = 0; i < m_body_floating_list.size(); i++) {
+ for (idArrayIdx i = 0; i < m_body_floating_list.size(); i++)
+ {
RigidBody &body = m_body_list[m_body_floating_list[i]];
(*joint_forces)(body.m_q_index + 0) = body.m_moment_at_joint(0);
(*joint_forces)(body.m_q_index + 1) = body.m_moment_at_joint(1);
@@ -316,84 +371,133 @@ int MultiBodyTree::MultiBodyImpl::calculateInverseDynamics(const vecx &q, const
(*joint_forces)(body.m_q_index + 5) = body.m_force_at_joint(2);
}
+ // 4.4 spherical bodies (3-DoF joints)
+ for (idArrayIdx i = 0; i < m_body_spherical_list.size(); i++)
+ {
+ //todo: review
+ RigidBody &body = m_body_list[m_body_spherical_list[i]];
+ (*joint_forces)(body.m_q_index + 0) = body.m_moment_at_joint(0);
+ (*joint_forces)(body.m_q_index + 1) = body.m_moment_at_joint(1);
+ (*joint_forces)(body.m_q_index + 2) = body.m_moment_at_joint(2);
+ }
return 0;
}
-int MultiBodyTree::MultiBodyImpl::calculateKinematics(const vecx &q, const vecx &u, const vecx& dot_u,
- const KinUpdateType type) {
- if (q.size() != m_num_dofs || u.size() != m_num_dofs || dot_u.size() != m_num_dofs ) {
- bt_id_error_message("wrong vector dimension. system has %d DOFs,\n"
- "but dim(q)= %d, dim(u)= %d, dim(dot_u)= %d\n",
- m_num_dofs, static_cast<int>(q.size()), static_cast<int>(u.size()),
- static_cast<int>(dot_u.size()));
+int MultiBodyTree::MultiBodyImpl::calculateKinematics(const vecx &q, const vecx &u, const vecx &dot_u,
+ const KinUpdateType type)
+{
+ if (q.size() != m_num_dofs || u.size() != m_num_dofs || dot_u.size() != m_num_dofs)
+ {
+ bt_id_error_message(
+ "wrong vector dimension. system has %d DOFs,\n"
+ "but dim(q)= %d, dim(u)= %d, dim(dot_u)= %d\n",
+ m_num_dofs, static_cast<int>(q.size()), static_cast<int>(u.size()),
+ static_cast<int>(dot_u.size()));
+ return -1;
+ }
+ if (type != POSITION_ONLY && type != POSITION_VELOCITY && type != POSITION_VELOCITY_ACCELERATION)
+ {
+ bt_id_error_message("invalid type %d\n", type);
return -1;
}
- if(type != POSITION_ONLY && type != POSITION_VELOCITY && type != POSITION_VELOCITY_ACCELERATION) {
- bt_id_error_message("invalid type %d\n", type);
- return -1;
- }
// 1. update relative kinematics
// 1.1 for revolute
- for (idArrayIdx i = 0; i < m_body_revolute_list.size(); i++) {
+ for (idArrayIdx i = 0; i < m_body_revolute_list.size(); i++)
+ {
RigidBody &body = m_body_list[m_body_revolute_list[i]];
mat33 T;
bodyTParentFromAxisAngle(body.m_Jac_JR, q(body.m_q_index), &T);
body.m_body_T_parent = T * body.m_body_T_parent_ref;
- if(type >= POSITION_VELOCITY) {
- body.m_body_ang_vel_rel = body.m_Jac_JR * u(body.m_q_index);
- }
- if(type >= POSITION_VELOCITY_ACCELERATION) {
- body.m_body_ang_acc_rel = body.m_Jac_JR * dot_u(body.m_q_index);
- }
+ if (type >= POSITION_VELOCITY)
+ {
+ body.m_body_ang_vel_rel = body.m_Jac_JR * u(body.m_q_index);
+ }
+ if (type >= POSITION_VELOCITY_ACCELERATION)
+ {
+ body.m_body_ang_acc_rel = body.m_Jac_JR * dot_u(body.m_q_index);
+ }
}
// 1.2 for prismatic
- for (idArrayIdx i = 0; i < m_body_prismatic_list.size(); i++) {
+ for (idArrayIdx i = 0; i < m_body_prismatic_list.size(); i++)
+ {
RigidBody &body = m_body_list[m_body_prismatic_list[i]];
body.m_parent_pos_parent_body =
body.m_parent_pos_parent_body_ref + body.m_parent_Jac_JT * q(body.m_q_index);
- if(type >= POSITION_VELOCITY) {
- body.m_parent_vel_rel =
- body.m_body_T_parent_ref.transpose() * body.m_Jac_JT * u(body.m_q_index);
- }
- if(type >= POSITION_VELOCITY_ACCELERATION) {
- body.m_parent_acc_rel = body.m_parent_Jac_JT * dot_u(body.m_q_index);
- }
+ if (type >= POSITION_VELOCITY)
+ {
+ body.m_parent_vel_rel =
+ body.m_body_T_parent_ref.transpose() * body.m_Jac_JT * u(body.m_q_index);
+ }
+ if (type >= POSITION_VELOCITY_ACCELERATION)
+ {
+ body.m_parent_acc_rel = body.m_parent_Jac_JT * dot_u(body.m_q_index);
+ }
}
// 1.3 fixed joints: nothing to do
// 1.4 6dof joints:
- for (idArrayIdx i = 0; i < m_body_floating_list.size(); i++) {
+ for (idArrayIdx i = 0; i < m_body_floating_list.size(); i++)
+ {
RigidBody &body = m_body_list[m_body_floating_list[i]];
body.m_body_T_parent = transformZ(q(body.m_q_index + 2)) *
- transformY(q(body.m_q_index + 1)) * transformX(q(body.m_q_index));
+ transformY(q(body.m_q_index + 1)) *
+ transformX(q(body.m_q_index));
body.m_parent_pos_parent_body(0) = q(body.m_q_index + 3);
body.m_parent_pos_parent_body(1) = q(body.m_q_index + 4);
body.m_parent_pos_parent_body(2) = q(body.m_q_index + 5);
body.m_parent_pos_parent_body = body.m_body_T_parent * body.m_parent_pos_parent_body;
- if(type >= POSITION_VELOCITY) {
- body.m_body_ang_vel_rel(0) = u(body.m_q_index + 0);
- body.m_body_ang_vel_rel(1) = u(body.m_q_index + 1);
- body.m_body_ang_vel_rel(2) = u(body.m_q_index + 2);
+ if (type >= POSITION_VELOCITY)
+ {
+ body.m_body_ang_vel_rel(0) = u(body.m_q_index + 0);
+ body.m_body_ang_vel_rel(1) = u(body.m_q_index + 1);
+ body.m_body_ang_vel_rel(2) = u(body.m_q_index + 2);
- body.m_parent_vel_rel(0) = u(body.m_q_index + 3);
- body.m_parent_vel_rel(1) = u(body.m_q_index + 4);
- body.m_parent_vel_rel(2) = u(body.m_q_index + 5);
+ body.m_parent_vel_rel(0) = u(body.m_q_index + 3);
+ body.m_parent_vel_rel(1) = u(body.m_q_index + 4);
+ body.m_parent_vel_rel(2) = u(body.m_q_index + 5);
- body.m_parent_vel_rel = body.m_body_T_parent.transpose() * body.m_parent_vel_rel;
- }
- if(type >= POSITION_VELOCITY_ACCELERATION) {
- body.m_body_ang_acc_rel(0) = dot_u(body.m_q_index + 0);
- body.m_body_ang_acc_rel(1) = dot_u(body.m_q_index + 1);
- body.m_body_ang_acc_rel(2) = dot_u(body.m_q_index + 2);
+ body.m_parent_vel_rel = body.m_body_T_parent.transpose() * body.m_parent_vel_rel;
+ }
+ if (type >= POSITION_VELOCITY_ACCELERATION)
+ {
+ body.m_body_ang_acc_rel(0) = dot_u(body.m_q_index + 0);
+ body.m_body_ang_acc_rel(1) = dot_u(body.m_q_index + 1);
+ body.m_body_ang_acc_rel(2) = dot_u(body.m_q_index + 2);
- body.m_parent_acc_rel(0) = dot_u(body.m_q_index + 3);
- body.m_parent_acc_rel(1) = dot_u(body.m_q_index + 4);
- body.m_parent_acc_rel(2) = dot_u(body.m_q_index + 5);
+ body.m_parent_acc_rel(0) = dot_u(body.m_q_index + 3);
+ body.m_parent_acc_rel(1) = dot_u(body.m_q_index + 4);
+ body.m_parent_acc_rel(2) = dot_u(body.m_q_index + 5);
- body.m_parent_acc_rel = body.m_body_T_parent.transpose() * body.m_parent_acc_rel;
- }
+ body.m_parent_acc_rel = body.m_body_T_parent.transpose() * body.m_parent_acc_rel;
+ }
+ }
+
+ for (idArrayIdx i = 0; i < m_body_spherical_list.size(); i++)
+ {
+ //todo: review
+ RigidBody &body = m_body_list[m_body_spherical_list[i]];
+
+ body.m_body_T_parent = transformZ(q(body.m_q_index + 2)) *
+ transformY(q(body.m_q_index + 1)) *
+ transformX(q(body.m_q_index));
+ body.m_parent_pos_parent_body = body.m_body_T_parent * body.m_parent_pos_parent_body;
+
+ if (type >= POSITION_VELOCITY)
+ {
+ body.m_body_ang_vel_rel(0) = u(body.m_q_index + 0);
+ body.m_body_ang_vel_rel(1) = u(body.m_q_index + 1);
+ body.m_body_ang_vel_rel(2) = u(body.m_q_index + 2);
+ body.m_parent_vel_rel = body.m_body_T_parent.transpose() * body.m_parent_vel_rel;
+ }
+ if (type >= POSITION_VELOCITY_ACCELERATION)
+ {
+ body.m_body_ang_acc_rel(0) = dot_u(body.m_q_index + 0);
+ body.m_body_ang_acc_rel(1) = dot_u(body.m_q_index + 1);
+ body.m_body_ang_acc_rel(2) = dot_u(body.m_q_index + 2);
+ body.m_parent_acc_rel = body.m_body_T_parent.transpose() * body.m_parent_acc_rel;
+ }
}
// 2. absolute kinematic quantities (vector valued)
@@ -410,26 +514,29 @@ int MultiBodyTree::MultiBodyImpl::calculateKinematics(const vecx &q, const vecx
body.m_body_pos = body.m_body_T_parent * body.m_parent_pos_parent_body;
body.m_body_T_world = body.m_body_T_parent;
- if(type >= POSITION_VELOCITY) {
- // 3.2 update absolute velocities
- body.m_body_ang_vel = body.m_body_ang_vel_rel;
- body.m_body_vel = body.m_parent_vel_rel;
- }
- if(type >= POSITION_VELOCITY_ACCELERATION) {
- // 3.3 update absolute accelerations
- // NOTE: assumption: dot(J_JR) = 0; true here, but not for general joints
- body.m_body_ang_acc = body.m_body_ang_acc_rel;
- body.m_body_acc = body.m_body_T_parent * body.m_parent_acc_rel;
- // add gravitational acceleration to root body
- // this is an efficient way to add gravitational terms,
- // but it does mean that the kinematics are no longer
- // correct at the acceleration level
- // NOTE: To get correct acceleration kinematics, just set world_gravity to zero
- body.m_body_acc = body.m_body_acc - body.m_body_T_parent * m_world_gravity;
- }
+ if (type >= POSITION_VELOCITY)
+ {
+ // 3.2 update absolute velocities
+ body.m_body_ang_vel = body.m_body_ang_vel_rel;
+ body.m_body_vel = body.m_parent_vel_rel;
+ }
+ if (type >= POSITION_VELOCITY_ACCELERATION)
+ {
+ // 3.3 update absolute accelerations
+ // NOTE: assumption: dot(J_JR) = 0; true here, but not for general joints
+ body.m_body_ang_acc = body.m_body_ang_acc_rel;
+ body.m_body_acc = body.m_body_T_parent * body.m_parent_acc_rel;
+ // add gravitational acceleration to root body
+ // this is an efficient way to add gravitational terms,
+ // but it does mean that the kinematics are no longer
+ // correct at the acceleration level
+ // NOTE: To get correct acceleration kinematics, just set world_gravity to zero
+ body.m_body_acc = body.m_body_acc - body.m_body_T_parent * m_world_gravity;
+ }
}
- for (idArrayIdx i = 1; i < m_body_list.size(); i++) {
+ for (idArrayIdx i = 1; i < m_body_list.size(); i++)
+ {
RigidBody &body = m_body_list[i];
RigidBody &parent = m_body_list[m_parent_index[i]];
// 2.1 update absolute positions and orientations:
@@ -439,121 +546,159 @@ int MultiBodyTree::MultiBodyImpl::calculateKinematics(const vecx &q, const vecx
body.m_body_T_parent * (parent.m_body_pos + body.m_parent_pos_parent_body);
body.m_body_T_world = body.m_body_T_parent * parent.m_body_T_world;
- if(type >= POSITION_VELOCITY) {
- // 2.2 update absolute velocities
- body.m_body_ang_vel =
- body.m_body_T_parent * parent.m_body_ang_vel + body.m_body_ang_vel_rel;
-
- body.m_body_vel =
- body.m_body_T_parent *
- (parent.m_body_vel + parent.m_body_ang_vel.cross(body.m_parent_pos_parent_body) +
- body.m_parent_vel_rel);
- }
- if(type >= POSITION_VELOCITY_ACCELERATION) {
- // 2.3 update absolute accelerations
- // NOTE: assumption: dot(J_JR) = 0; true here, but not for general joints
- body.m_body_ang_acc =
- body.m_body_T_parent * parent.m_body_ang_acc -
- body.m_body_ang_vel_rel.cross(body.m_body_T_parent * parent.m_body_ang_vel) +
- body.m_body_ang_acc_rel;
- body.m_body_acc =
- body.m_body_T_parent *
- (parent.m_body_acc + parent.m_body_ang_acc.cross(body.m_parent_pos_parent_body) +
- parent.m_body_ang_vel.cross(parent.m_body_ang_vel.cross(body.m_parent_pos_parent_body)) +
- 2.0 * parent.m_body_ang_vel.cross(body.m_parent_vel_rel) + body.m_parent_acc_rel);
- }
+ if (type >= POSITION_VELOCITY)
+ {
+ // 2.2 update absolute velocities
+ body.m_body_ang_vel =
+ body.m_body_T_parent * parent.m_body_ang_vel + body.m_body_ang_vel_rel;
+
+ body.m_body_vel =
+ body.m_body_T_parent *
+ (parent.m_body_vel + parent.m_body_ang_vel.cross(body.m_parent_pos_parent_body) +
+ body.m_parent_vel_rel);
+ }
+ if (type >= POSITION_VELOCITY_ACCELERATION)
+ {
+ // 2.3 update absolute accelerations
+ // NOTE: assumption: dot(J_JR) = 0; true here, but not for general joints
+ body.m_body_ang_acc =
+ body.m_body_T_parent * parent.m_body_ang_acc -
+ body.m_body_ang_vel_rel.cross(body.m_body_T_parent * parent.m_body_ang_vel) +
+ body.m_body_ang_acc_rel;
+ body.m_body_acc =
+ body.m_body_T_parent *
+ (parent.m_body_acc + parent.m_body_ang_acc.cross(body.m_parent_pos_parent_body) +
+ parent.m_body_ang_vel.cross(parent.m_body_ang_vel.cross(body.m_parent_pos_parent_body)) +
+ 2.0 * parent.m_body_ang_vel.cross(body.m_parent_vel_rel) + body.m_parent_acc_rel);
+ }
}
- return 0;
+ return 0;
}
#if (defined BT_ID_HAVE_MAT3X) && (defined BT_ID_WITH_JACOBIANS)
-void MultiBodyTree::MultiBodyImpl::addRelativeJacobianComponent(RigidBody&body) {
- const int& idx=body.m_q_index;
- switch(body.m_joint_type) {
- case FIXED:
- break;
- case REVOLUTE:
- setMat3xElem(0,idx, body.m_Jac_JR(0), &body.m_body_Jac_R);
- setMat3xElem(1,idx, body.m_Jac_JR(1), &body.m_body_Jac_R);
- setMat3xElem(2,idx, body.m_Jac_JR(2), &body.m_body_Jac_R);
- break;
- case PRISMATIC:
- setMat3xElem(0,idx, body.m_body_T_parent_ref(0,0)*body.m_Jac_JT(0)
- +body.m_body_T_parent_ref(1,0)*body.m_Jac_JT(1)
- +body.m_body_T_parent_ref(2,0)*body.m_Jac_JT(2),
- &body.m_body_Jac_T);
- setMat3xElem(1,idx,body.m_body_T_parent_ref(0,1)*body.m_Jac_JT(0)
- +body.m_body_T_parent_ref(1,1)*body.m_Jac_JT(1)
- +body.m_body_T_parent_ref(2,1)*body.m_Jac_JT(2),
- &body.m_body_Jac_T);
- setMat3xElem(2,idx, body.m_body_T_parent_ref(0,2)*body.m_Jac_JT(0)
- +body.m_body_T_parent_ref(1,2)*body.m_Jac_JT(1)
- +body.m_body_T_parent_ref(2,2)*body.m_Jac_JT(2),
- &body.m_body_Jac_T);
- break;
- case FLOATING:
- setMat3xElem(0,idx+0, 1.0, &body.m_body_Jac_R);
- setMat3xElem(1,idx+1, 1.0, &body.m_body_Jac_R);
- setMat3xElem(2,idx+2, 1.0, &body.m_body_Jac_R);
- // body_Jac_T = body_T_parent.transpose();
- setMat3xElem(0,idx+3, body.m_body_T_parent(0,0), &body.m_body_Jac_T);
- setMat3xElem(0,idx+4, body.m_body_T_parent(1,0), &body.m_body_Jac_T);
- setMat3xElem(0,idx+5, body.m_body_T_parent(2,0), &body.m_body_Jac_T);
-
- setMat3xElem(1,idx+3, body.m_body_T_parent(0,1), &body.m_body_Jac_T);
- setMat3xElem(1,idx+4, body.m_body_T_parent(1,1), &body.m_body_Jac_T);
- setMat3xElem(1,idx+5, body.m_body_T_parent(2,1), &body.m_body_Jac_T);
-
- setMat3xElem(2,idx+3, body.m_body_T_parent(0,2), &body.m_body_Jac_T);
- setMat3xElem(2,idx+4, body.m_body_T_parent(1,2), &body.m_body_Jac_T);
- setMat3xElem(2,idx+5, body.m_body_T_parent(2,2), &body.m_body_Jac_T);
-
- break;
- }
+void MultiBodyTree::MultiBodyImpl::addRelativeJacobianComponent(RigidBody &body)
+{
+ const int &idx = body.m_q_index;
+ switch (body.m_joint_type)
+ {
+ case FIXED:
+ break;
+ case REVOLUTE:
+ setMat3xElem(0, idx, body.m_Jac_JR(0), &body.m_body_Jac_R);
+ setMat3xElem(1, idx, body.m_Jac_JR(1), &body.m_body_Jac_R);
+ setMat3xElem(2, idx, body.m_Jac_JR(2), &body.m_body_Jac_R);
+ break;
+ case PRISMATIC:
+ setMat3xElem(0, idx, body.m_body_T_parent_ref(0, 0) * body.m_Jac_JT(0) + body.m_body_T_parent_ref(1, 0) * body.m_Jac_JT(1) + body.m_body_T_parent_ref(2, 0) * body.m_Jac_JT(2),
+ &body.m_body_Jac_T);
+ setMat3xElem(1, idx, body.m_body_T_parent_ref(0, 1) * body.m_Jac_JT(0) + body.m_body_T_parent_ref(1, 1) * body.m_Jac_JT(1) + body.m_body_T_parent_ref(2, 1) * body.m_Jac_JT(2),
+ &body.m_body_Jac_T);
+ setMat3xElem(2, idx, body.m_body_T_parent_ref(0, 2) * body.m_Jac_JT(0) + body.m_body_T_parent_ref(1, 2) * body.m_Jac_JT(1) + body.m_body_T_parent_ref(2, 2) * body.m_Jac_JT(2),
+ &body.m_body_Jac_T);
+ break;
+ case FLOATING:
+ setMat3xElem(0, idx + 0, 1.0, &body.m_body_Jac_R);
+ setMat3xElem(1, idx + 1, 1.0, &body.m_body_Jac_R);
+ setMat3xElem(2, idx + 2, 1.0, &body.m_body_Jac_R);
+ // body_Jac_T = body_T_parent.transpose();
+ setMat3xElem(0, idx + 3, body.m_body_T_parent(0, 0), &body.m_body_Jac_T);
+ setMat3xElem(0, idx + 4, body.m_body_T_parent(1, 0), &body.m_body_Jac_T);
+ setMat3xElem(0, idx + 5, body.m_body_T_parent(2, 0), &body.m_body_Jac_T);
+
+ setMat3xElem(1, idx + 3, body.m_body_T_parent(0, 1), &body.m_body_Jac_T);
+ setMat3xElem(1, idx + 4, body.m_body_T_parent(1, 1), &body.m_body_Jac_T);
+ setMat3xElem(1, idx + 5, body.m_body_T_parent(2, 1), &body.m_body_Jac_T);
+
+ setMat3xElem(2, idx + 3, body.m_body_T_parent(0, 2), &body.m_body_Jac_T);
+ setMat3xElem(2, idx + 4, body.m_body_T_parent(1, 2), &body.m_body_Jac_T);
+ setMat3xElem(2, idx + 5, body.m_body_T_parent(2, 2), &body.m_body_Jac_T);
+
+ break;
+ case SPHERICAL:
+ //todo: review
+ setMat3xElem(0, idx + 0, 1.0, &body.m_body_Jac_R);
+ setMat3xElem(1, idx + 1, 1.0, &body.m_body_Jac_R);
+ setMat3xElem(2, idx + 2, 1.0, &body.m_body_Jac_R);
+ break;
+ }
}
-int MultiBodyTree::MultiBodyImpl::calculateJacobians(const vecx& q, const vecx& u, const KinUpdateType type) {
- if (q.size() != m_num_dofs || u.size() != m_num_dofs) {
- bt_id_error_message("wrong vector dimension. system has %d DOFs,\n"
- "but dim(q)= %d, dim(u)= %d\n",
- m_num_dofs, static_cast<int>(q.size()), static_cast<int>(u.size()));
- return -1;
- }
- if(type != POSITION_ONLY && type != POSITION_VELOCITY) {
- bt_id_error_message("invalid type %d\n", type);
- return -1;
- }
-
- addRelativeJacobianComponent(m_body_list[0]);
- for (idArrayIdx i = 1; i < m_body_list.size(); i++) {
- RigidBody &body = m_body_list[i];
- RigidBody &parent = m_body_list[m_parent_index[i]];
-
- mul(body.m_body_T_parent, parent.m_body_Jac_R,& body.m_body_Jac_R);
- body.m_body_Jac_T = parent.m_body_Jac_T;
- mul(tildeOperator(body.m_parent_pos_parent_body),parent.m_body_Jac_R,&m_m3x);
- sub(body.m_body_Jac_T,m_m3x, &body.m_body_Jac_T);
-
- addRelativeJacobianComponent(body);
- mul(body.m_body_T_parent, body.m_body_Jac_T,&body.m_body_Jac_T);
-
- if(type >= POSITION_VELOCITY) {
- body.m_body_dot_Jac_R_u = body.m_body_T_parent * parent.m_body_dot_Jac_R_u -
- body.m_body_ang_vel_rel.cross(body.m_body_T_parent * parent.m_body_ang_vel);
- body.m_body_dot_Jac_T_u = body.m_body_T_parent *
- (parent.m_body_dot_Jac_T_u + parent.m_body_dot_Jac_R_u.cross(body.m_parent_pos_parent_body) +
- parent.m_body_ang_vel.cross(parent.m_body_ang_vel.cross(body.m_parent_pos_parent_body)) +
- 2.0 * parent.m_body_ang_vel.cross(body.m_parent_vel_rel));
- }
- }
- return 0;
+int MultiBodyTree::MultiBodyImpl::calculateJacobians(const vecx &q, const vecx &u, const KinUpdateType type)
+{
+ if (q.size() != m_num_dofs || u.size() != m_num_dofs)
+ {
+ bt_id_error_message(
+ "wrong vector dimension. system has %d DOFs,\n"
+ "but dim(q)= %d, dim(u)= %d\n",
+ m_num_dofs, static_cast<int>(q.size()), static_cast<int>(u.size()));
+ return -1;
+ }
+ if (type != POSITION_ONLY && type != POSITION_VELOCITY)
+ {
+ bt_id_error_message("invalid type %d\n", type);
+ return -1;
+ }
+
+ addRelativeJacobianComponent(m_body_list[0]);
+ for (idArrayIdx i = 1; i < m_body_list.size(); i++)
+ {
+ RigidBody &body = m_body_list[i];
+ RigidBody &parent = m_body_list[m_parent_index[i]];
+
+ mul(body.m_body_T_parent, parent.m_body_Jac_R, &body.m_body_Jac_R);
+ body.m_body_Jac_T = parent.m_body_Jac_T;
+ mul(tildeOperator(body.m_parent_pos_parent_body), parent.m_body_Jac_R, &m_m3x);
+ sub(body.m_body_Jac_T, m_m3x, &body.m_body_Jac_T);
+
+ addRelativeJacobianComponent(body);
+ mul(body.m_body_T_parent, body.m_body_Jac_T, &body.m_body_Jac_T);
+
+ if (type >= POSITION_VELOCITY)
+ {
+ body.m_body_dot_Jac_R_u = body.m_body_T_parent * parent.m_body_dot_Jac_R_u -
+ body.m_body_ang_vel_rel.cross(body.m_body_T_parent * parent.m_body_ang_vel);
+ body.m_body_dot_Jac_T_u = body.m_body_T_parent *
+ (parent.m_body_dot_Jac_T_u + parent.m_body_dot_Jac_R_u.cross(body.m_parent_pos_parent_body) +
+ parent.m_body_ang_vel.cross(parent.m_body_ang_vel.cross(body.m_parent_pos_parent_body)) +
+ 2.0 * parent.m_body_ang_vel.cross(body.m_parent_vel_rel));
+ }
+ }
+ return 0;
}
#endif
-static inline void setSixDoFJacobians(const int dof, vec3 &Jac_JR, vec3 &Jac_JT) {
- switch (dof) {
+static inline void setThreeDoFJacobians(const int dof, vec3 &Jac_JR, vec3 &Jac_JT)
+{
+ switch (dof)
+ {
+ // rotational part
+ case 0:
+ Jac_JR(0) = 1;
+ Jac_JR(1) = 0;
+ Jac_JR(2) = 0;
+ setZero(Jac_JT);
+ break;
+ case 1:
+ Jac_JR(0) = 0;
+ Jac_JR(1) = 1;
+ Jac_JR(2) = 0;
+ setZero(Jac_JT);
+ break;
+ case 2:
+ Jac_JR(0) = 0;
+ Jac_JR(1) = 0;
+ Jac_JR(2) = 1;
+ setZero(Jac_JT);
+ break;
+ }
+}
+
+static inline void setSixDoFJacobians(const int dof, vec3 &Jac_JR, vec3 &Jac_JT)
+{
+ switch (dof)
+ {
// rotational part
case 0:
Jac_JR(0) = 1;
@@ -595,8 +740,10 @@ static inline void setSixDoFJacobians(const int dof, vec3 &Jac_JR, vec3 &Jac_JT)
}
}
-static inline int jointNumDoFs(const JointType &type) {
- switch (type) {
+static inline int jointNumDoFs(const JointType &type)
+{
+ switch (type)
+ {
case FIXED:
return 0;
case REVOLUTE:
@@ -604,6 +751,8 @@ static inline int jointNumDoFs(const JointType &type) {
return 1;
case FLOATING:
return 6;
+ case SPHERICAL:
+ return 3;
}
// this should never happen
bt_id_error_message("invalid joint type\n");
@@ -615,37 +764,45 @@ static inline int jointNumDoFs(const JointType &type) {
int MultiBodyTree::MultiBodyImpl::calculateMassMatrix(const vecx &q, const bool update_kinematics,
const bool initialize_matrix,
const bool set_lower_triangular_matrix,
- matxx *mass_matrix) {
-// This calculates the joint space mass matrix for the multibody system.
-// The algorithm is essentially an implementation of "method 3"
-// in "Efficient Dynamic Simulation of Robotic Mechanisms" (Walker and Orin, 1982)
-// (Later named "Composite Rigid Body Algorithm" by Featherstone).
-//
-// This implementation, however, handles branched systems and uses a formulation centered
-// on the origin of the body-fixed frame to avoid re-computing various quantities at the com.
+ matxx *mass_matrix)
+{
+ // This calculates the joint space mass matrix for the multibody system.
+ // The algorithm is essentially an implementation of "method 3"
+ // in "Efficient Dynamic Simulation of Robotic Mechanisms" (Walker and Orin, 1982)
+ // (Later named "Composite Rigid Body Algorithm" by Featherstone).
+ //
+ // This implementation, however, handles branched systems and uses a formulation centered
+ // on the origin of the body-fixed frame to avoid re-computing various quantities at the com.
if (q.size() != m_num_dofs || mass_matrix->rows() != m_num_dofs ||
- mass_matrix->cols() != m_num_dofs) {
- bt_id_error_message("Dimension error. System has %d DOFs,\n"
- "but dim(q)= %d, dim(mass_matrix)= %d x %d\n",
- m_num_dofs, static_cast<int>(q.size()), static_cast<int>(mass_matrix->rows()),
- static_cast<int>(mass_matrix->cols()));
+ mass_matrix->cols() != m_num_dofs)
+ {
+ bt_id_error_message(
+ "Dimension error. System has %d DOFs,\n"
+ "but dim(q)= %d, dim(mass_matrix)= %d x %d\n",
+ m_num_dofs, static_cast<int>(q.size()), static_cast<int>(mass_matrix->rows()),
+ static_cast<int>(mass_matrix->cols()));
return -1;
}
// TODO add optimized zeroing function?
- if (initialize_matrix) {
- for (int i = 0; i < m_num_dofs; i++) {
- for (int j = 0; j < m_num_dofs; j++) {
- setMatxxElem(i, j, 0.0, mass_matrix);
+ if (initialize_matrix)
+ {
+ for (int i = 0; i < m_num_dofs; i++)
+ {
+ for (int j = 0; j < m_num_dofs; j++)
+ {
+ setMatxxElem(i, j, 0.0, mass_matrix);
}
}
}
- if (update_kinematics) {
+ if (update_kinematics)
+ {
// 1. update relative kinematics
// 1.1 for revolute joints
- for (idArrayIdx i = 0; i < m_body_revolute_list.size(); i++) {
+ for (idArrayIdx i = 0; i < m_body_revolute_list.size(); i++)
+ {
RigidBody &body = m_body_list[m_body_revolute_list[i]];
// from reference orientation (q=0) of body-fixed frame to current orientation
mat33 body_T_body_ref;
@@ -653,7 +810,8 @@ int MultiBodyTree::MultiBodyImpl::calculateMassMatrix(const vecx &q, const bool
body.m_body_T_parent = body_T_body_ref * body.m_body_T_parent_ref;
}
// 1.2 for prismatic joints
- for (idArrayIdx i = 0; i < m_body_prismatic_list.size(); i++) {
+ for (idArrayIdx i = 0; i < m_body_prismatic_list.size(); i++)
+ {
RigidBody &body = m_body_list[m_body_prismatic_list[i]];
// body.m_body_T_parent= fixed
body.m_parent_pos_parent_body =
@@ -661,7 +819,8 @@ int MultiBodyTree::MultiBodyImpl::calculateMassMatrix(const vecx &q, const bool
}
// 1.3 fixed joints: nothing to do
// 1.4 6dof joints:
- for (idArrayIdx i = 0; i < m_body_floating_list.size(); i++) {
+ for (idArrayIdx i = 0; i < m_body_floating_list.size(); i++)
+ {
RigidBody &body = m_body_list[m_body_floating_list[i]];
body.m_body_T_parent = transformZ(q(body.m_q_index + 2)) *
@@ -674,7 +833,8 @@ int MultiBodyTree::MultiBodyImpl::calculateMassMatrix(const vecx &q, const bool
body.m_parent_pos_parent_body = body.m_body_T_parent * body.m_parent_pos_parent_body;
}
}
- for (int i = m_body_list.size() - 1; i >= 0; i--) {
+ for (int i = m_body_list.size() - 1; i >= 0; i--)
+ {
RigidBody &body = m_body_list[i];
// calculate mass, center of mass and inertia of "composite rigid body",
// ie, sub-tree starting at current body
@@ -682,7 +842,8 @@ int MultiBodyTree::MultiBodyImpl::calculateMassMatrix(const vecx &q, const bool
body.m_body_subtree_mass_com = body.m_body_mass_com;
body.m_body_subtree_I_body = body.m_body_I_body;
- for (idArrayIdx c = 0; c < m_child_indices[i].size(); c++) {
+ for (idArrayIdx c = 0; c < m_child_indices[i].size(); c++)
+ {
RigidBody &child = m_body_list[m_child_indices[i][c]];
mat33 body_T_child = child.m_body_T_parent.transpose();
@@ -692,7 +853,8 @@ int MultiBodyTree::MultiBodyImpl::calculateMassMatrix(const vecx &q, const bool
body.m_body_subtree_I_body +=
body_T_child * child.m_body_subtree_I_body * child.m_body_T_parent;
- if (child.m_subtree_mass > 0) {
+ if (child.m_subtree_mass > 0)
+ {
// Shift the reference point for the child subtree inertia using the
// Huygens-Steiner ("parallel axis") theorem.
// (First shift from child origin to child com, then from there to this body's
@@ -707,7 +869,8 @@ int MultiBodyTree::MultiBodyImpl::calculateMassMatrix(const vecx &q, const bool
}
}
- for (int i = m_body_list.size() - 1; i >= 0; i--) {
+ for (int i = m_body_list.size() - 1; i >= 0; i--)
+ {
const RigidBody &body = m_body_list[i];
// determine DoF-range for body
@@ -717,11 +880,18 @@ int MultiBodyTree::MultiBodyImpl::calculateMassMatrix(const vecx &q, const bool
// local joint jacobians (ok as is for 1-DoF joints)
vec3 Jac_JR = body.m_Jac_JR;
vec3 Jac_JT = body.m_Jac_JT;
- for (int col = q_index_max; col >= q_index_min; col--) {
+ for (int col = q_index_max; col >= q_index_min; col--)
+ {
// set jacobians for 6-DoF joints
- if (FLOATING == body.m_joint_type) {
+ if (FLOATING == body.m_joint_type)
+ {
setSixDoFJacobians(col - q_index_min, Jac_JR, Jac_JT);
}
+ if (SPHERICAL == body.m_joint_type)
+ {
+ //todo: review
+ setThreeDoFJacobians(col - q_index_min, Jac_JR, Jac_JT);
+ }
vec3 body_eom_rot =
body.m_body_subtree_I_body * Jac_JR + body.m_body_subtree_mass_com.cross(Jac_JT);
@@ -732,19 +902,27 @@ int MultiBodyTree::MultiBodyImpl::calculateMassMatrix(const vecx &q, const bool
// rest of the mass matrix column upwards
{
// 1. for multi-dof joints, rest of the dofs of this body
- for (int row = col - 1; row >= q_index_min; row--) {
- if (FLOATING != body.m_joint_type) {
- bt_id_error_message("??\n");
- return -1;
+ for (int row = col - 1; row >= q_index_min; row--)
+ {
+ if (SPHERICAL == body.m_joint_type)
+ {
+ //todo: review
+ setThreeDoFJacobians(row - q_index_min, Jac_JR, Jac_JT);
+ const double Mrc = Jac_JR.dot(body_eom_rot) + Jac_JT.dot(body_eom_trans);
+ setMatxxElem(col, row, Mrc, mass_matrix);
+ }
+ if (FLOATING == body.m_joint_type)
+ {
+ setSixDoFJacobians(row - q_index_min, Jac_JR, Jac_JT);
+ const double Mrc = Jac_JR.dot(body_eom_rot) + Jac_JT.dot(body_eom_trans);
+ setMatxxElem(col, row, Mrc, mass_matrix);
}
- setSixDoFJacobians(row - q_index_min, Jac_JR, Jac_JT);
- const double Mrc = Jac_JR.dot(body_eom_rot) + Jac_JT.dot(body_eom_trans);
- setMatxxElem(col, row, Mrc, mass_matrix);
}
// 2. ancestor dofs
int child_idx = i;
int parent_idx = m_parent_index[i];
- while (parent_idx >= 0) {
+ while (parent_idx >= 0)
+ {
const RigidBody &child_body = m_body_list[child_idx];
const RigidBody &parent_body = m_body_list[parent_idx];
@@ -758,9 +936,16 @@ int MultiBodyTree::MultiBodyImpl::calculateMassMatrix(const vecx &q, const bool
parent_body_q_index_min + jointNumDoFs(parent_body.m_joint_type) - 1;
vec3 Jac_JR = parent_body.m_Jac_JR;
vec3 Jac_JT = parent_body.m_Jac_JT;
- for (int row = parent_body_q_index_max; row >= parent_body_q_index_min; row--) {
+ for (int row = parent_body_q_index_max; row >= parent_body_q_index_min; row--)
+ {
+ if (SPHERICAL == parent_body.m_joint_type)
+ {
+ //todo: review
+ setThreeDoFJacobians(row - parent_body_q_index_min, Jac_JR, Jac_JT);
+ }
// set jacobians for 6-DoF joints
- if (FLOATING == parent_body.m_joint_type) {
+ if (FLOATING == parent_body.m_joint_type)
+ {
setSixDoFJacobians(row - parent_body_q_index_min, Jac_JR, Jac_JT);
}
const double Mrc = Jac_JR.dot(body_eom_rot) + Jac_JT.dot(body_eom_trans);
@@ -774,10 +959,13 @@ int MultiBodyTree::MultiBodyImpl::calculateMassMatrix(const vecx &q, const bool
}
}
- if (set_lower_triangular_matrix) {
- for (int col = 0; col < m_num_dofs; col++) {
- for (int row = 0; row < col; row++) {
- setMatxxElem(row, col, (*mass_matrix)(col, row), mass_matrix);
+ if (set_lower_triangular_matrix)
+ {
+ for (int col = 0; col < m_num_dofs; col++)
+ {
+ for (int row = 0; row < col; row++)
+ {
+ setMatxxElem(row, col, (*mass_matrix)(col, row), mass_matrix);
}
}
}
@@ -785,76 +973,91 @@ int MultiBodyTree::MultiBodyImpl::calculateMassMatrix(const vecx &q, const bool
}
// utility macro
-#define CHECK_IF_BODY_INDEX_IS_VALID(index) \
- do { \
- if (index < 0 || index >= m_num_bodies) { \
- bt_id_error_message("invalid index %d (num_bodies= %d)\n", index, m_num_bodies); \
- return -1; \
- } \
+#define CHECK_IF_BODY_INDEX_IS_VALID(index) \
+ do \
+ { \
+ if (index < 0 || index >= m_num_bodies) \
+ { \
+ bt_id_error_message("invalid index %d (num_bodies= %d)\n", index, m_num_bodies); \
+ return -1; \
+ } \
} while (0)
-int MultiBodyTree::MultiBodyImpl::getParentIndex(const int body_index, int *p) {
+int MultiBodyTree::MultiBodyImpl::getParentIndex(const int body_index, int *p)
+{
CHECK_IF_BODY_INDEX_IS_VALID(body_index);
*p = m_parent_index[body_index];
return 0;
}
-int MultiBodyTree::MultiBodyImpl::getUserInt(const int body_index, int *user_int) const {
+int MultiBodyTree::MultiBodyImpl::getUserInt(const int body_index, int *user_int) const
+{
CHECK_IF_BODY_INDEX_IS_VALID(body_index);
*user_int = m_user_int[body_index];
return 0;
}
-int MultiBodyTree::MultiBodyImpl::getUserPtr(const int body_index, void **user_ptr) const {
+int MultiBodyTree::MultiBodyImpl::getUserPtr(const int body_index, void **user_ptr) const
+{
CHECK_IF_BODY_INDEX_IS_VALID(body_index);
*user_ptr = m_user_ptr[body_index];
return 0;
}
-int MultiBodyTree::MultiBodyImpl::setUserInt(const int body_index, const int user_int) {
+int MultiBodyTree::MultiBodyImpl::setUserInt(const int body_index, const int user_int)
+{
CHECK_IF_BODY_INDEX_IS_VALID(body_index);
m_user_int[body_index] = user_int;
return 0;
}
-int MultiBodyTree::MultiBodyImpl::setUserPtr(const int body_index, void *const user_ptr) {
+int MultiBodyTree::MultiBodyImpl::setUserPtr(const int body_index, void *const user_ptr)
+{
CHECK_IF_BODY_INDEX_IS_VALID(body_index);
m_user_ptr[body_index] = user_ptr;
return 0;
}
-int MultiBodyTree::MultiBodyImpl::getBodyOrigin(int body_index, vec3 *world_origin) const {
+int MultiBodyTree::MultiBodyImpl::getBodyOrigin(int body_index, vec3 *world_origin) const
+{
CHECK_IF_BODY_INDEX_IS_VALID(body_index);
const RigidBody &body = m_body_list[body_index];
*world_origin = body.m_body_T_world.transpose() * body.m_body_pos;
return 0;
}
-int MultiBodyTree::MultiBodyImpl::getBodyCoM(int body_index, vec3 *world_com) const {
+int MultiBodyTree::MultiBodyImpl::getBodyCoM(int body_index, vec3 *world_com) const
+{
CHECK_IF_BODY_INDEX_IS_VALID(body_index);
const RigidBody &body = m_body_list[body_index];
- if (body.m_mass > 0) {
+ if (body.m_mass > 0)
+ {
*world_com = body.m_body_T_world.transpose() *
(body.m_body_pos + body.m_body_mass_com / body.m_mass);
- } else {
+ }
+ else
+ {
*world_com = body.m_body_T_world.transpose() * (body.m_body_pos);
}
return 0;
}
-int MultiBodyTree::MultiBodyImpl::getBodyTransform(int body_index, mat33 *world_T_body) const {
+int MultiBodyTree::MultiBodyImpl::getBodyTransform(int body_index, mat33 *world_T_body) const
+{
CHECK_IF_BODY_INDEX_IS_VALID(body_index);
const RigidBody &body = m_body_list[body_index];
*world_T_body = body.m_body_T_world.transpose();
return 0;
}
-int MultiBodyTree::MultiBodyImpl::getBodyAngularVelocity(int body_index, vec3 *world_omega) const {
+int MultiBodyTree::MultiBodyImpl::getBodyAngularVelocity(int body_index, vec3 *world_omega) const
+{
CHECK_IF_BODY_INDEX_IS_VALID(body_index);
const RigidBody &body = m_body_list[body_index];
*world_omega = body.m_body_T_world.transpose() * body.m_body_ang_vel;
return 0;
}
int MultiBodyTree::MultiBodyImpl::getBodyLinearVelocity(int body_index,
- vec3 *world_velocity) const {
+ vec3 *world_velocity) const
+{
CHECK_IF_BODY_INDEX_IS_VALID(body_index);
const RigidBody &body = m_body_list[body_index];
*world_velocity = body.m_body_T_world.transpose() * body.m_body_vel;
@@ -862,13 +1065,17 @@ int MultiBodyTree::MultiBodyImpl::getBodyLinearVelocity(int body_index,
}
int MultiBodyTree::MultiBodyImpl::getBodyLinearVelocityCoM(int body_index,
- vec3 *world_velocity) const {
+ vec3 *world_velocity) const
+{
CHECK_IF_BODY_INDEX_IS_VALID(body_index);
const RigidBody &body = m_body_list[body_index];
vec3 com;
- if (body.m_mass > 0) {
+ if (body.m_mass > 0)
+ {
com = body.m_body_mass_com / body.m_mass;
- } else {
+ }
+ else
+ {
com(0) = 0;
com(1) = 0;
com(2) = 0;
@@ -880,149 +1087,173 @@ int MultiBodyTree::MultiBodyImpl::getBodyLinearVelocityCoM(int body_index,
}
int MultiBodyTree::MultiBodyImpl::getBodyAngularAcceleration(int body_index,
- vec3 *world_dot_omega) const {
+ vec3 *world_dot_omega) const
+{
CHECK_IF_BODY_INDEX_IS_VALID(body_index);
const RigidBody &body = m_body_list[body_index];
*world_dot_omega = body.m_body_T_world.transpose() * body.m_body_ang_acc;
return 0;
}
int MultiBodyTree::MultiBodyImpl::getBodyLinearAcceleration(int body_index,
- vec3 *world_acceleration) const {
+ vec3 *world_acceleration) const
+{
CHECK_IF_BODY_INDEX_IS_VALID(body_index);
const RigidBody &body = m_body_list[body_index];
*world_acceleration = body.m_body_T_world.transpose() * body.m_body_acc;
return 0;
}
-int MultiBodyTree::MultiBodyImpl::getJointType(const int body_index, JointType *joint_type) const {
+int MultiBodyTree::MultiBodyImpl::getJointType(const int body_index, JointType *joint_type) const
+{
CHECK_IF_BODY_INDEX_IS_VALID(body_index);
*joint_type = m_body_list[body_index].m_joint_type;
return 0;
}
int MultiBodyTree::MultiBodyImpl::getJointTypeStr(const int body_index,
- const char **joint_type) const {
+ const char **joint_type) const
+{
CHECK_IF_BODY_INDEX_IS_VALID(body_index);
*joint_type = jointTypeToString(m_body_list[body_index].m_joint_type);
return 0;
}
-int MultiBodyTree::MultiBodyImpl::getParentRParentBodyRef(const int body_index, vec3* r) const{
- CHECK_IF_BODY_INDEX_IS_VALID(body_index);
- *r=m_body_list[body_index].m_parent_pos_parent_body_ref;
- return 0;
+int MultiBodyTree::MultiBodyImpl::getParentRParentBodyRef(const int body_index, vec3 *r) const
+{
+ CHECK_IF_BODY_INDEX_IS_VALID(body_index);
+ *r = m_body_list[body_index].m_parent_pos_parent_body_ref;
+ return 0;
}
-int MultiBodyTree::MultiBodyImpl::getBodyTParentRef(const int body_index, mat33* T) const{
- CHECK_IF_BODY_INDEX_IS_VALID(body_index);
- *T=m_body_list[body_index].m_body_T_parent_ref;
- return 0;
+int MultiBodyTree::MultiBodyImpl::getBodyTParentRef(const int body_index, mat33 *T) const
+{
+ CHECK_IF_BODY_INDEX_IS_VALID(body_index);
+ *T = m_body_list[body_index].m_body_T_parent_ref;
+ return 0;
}
-int MultiBodyTree::MultiBodyImpl::getBodyAxisOfMotion(const int body_index, vec3* axis) const{
- CHECK_IF_BODY_INDEX_IS_VALID(body_index);
- if(m_body_list[body_index].m_joint_type == REVOLUTE) {
- *axis = m_body_list[body_index].m_Jac_JR;
- return 0;
- }
- if(m_body_list[body_index].m_joint_type == PRISMATIC) {
- *axis = m_body_list[body_index].m_Jac_JT;
- return 0;
- }
- setZero(*axis);
- return 0;
+int MultiBodyTree::MultiBodyImpl::getBodyAxisOfMotion(const int body_index, vec3 *axis) const
+{
+ CHECK_IF_BODY_INDEX_IS_VALID(body_index);
+ if (m_body_list[body_index].m_joint_type == REVOLUTE)
+ {
+ *axis = m_body_list[body_index].m_Jac_JR;
+ return 0;
+ }
+ if (m_body_list[body_index].m_joint_type == PRISMATIC)
+ {
+ *axis = m_body_list[body_index].m_Jac_JT;
+ return 0;
+ }
+ setZero(*axis);
+ return 0;
}
-int MultiBodyTree::MultiBodyImpl::getDoFOffset(const int body_index, int *q_index) const {
+int MultiBodyTree::MultiBodyImpl::getDoFOffset(const int body_index, int *q_index) const
+{
CHECK_IF_BODY_INDEX_IS_VALID(body_index);
*q_index = m_body_list[body_index].m_q_index;
return 0;
}
-int MultiBodyTree::MultiBodyImpl::setBodyMass(const int body_index, const idScalar mass) {
+int MultiBodyTree::MultiBodyImpl::setBodyMass(const int body_index, const idScalar mass)
+{
CHECK_IF_BODY_INDEX_IS_VALID(body_index);
m_body_list[body_index].m_mass = mass;
return 0;
}
int MultiBodyTree::MultiBodyImpl::setBodyFirstMassMoment(const int body_index,
- const vec3& first_mass_moment) {
+ const vec3 &first_mass_moment)
+{
CHECK_IF_BODY_INDEX_IS_VALID(body_index);
m_body_list[body_index].m_body_mass_com = first_mass_moment;
return 0;
}
int MultiBodyTree::MultiBodyImpl::setBodySecondMassMoment(const int body_index,
- const mat33& second_mass_moment) {
+ const mat33 &second_mass_moment)
+{
CHECK_IF_BODY_INDEX_IS_VALID(body_index);
m_body_list[body_index].m_body_I_body = second_mass_moment;
return 0;
}
-int MultiBodyTree::MultiBodyImpl::getBodyMass(const int body_index, idScalar *mass) const {
+int MultiBodyTree::MultiBodyImpl::getBodyMass(const int body_index, idScalar *mass) const
+{
CHECK_IF_BODY_INDEX_IS_VALID(body_index);
*mass = m_body_list[body_index].m_mass;
return 0;
}
int MultiBodyTree::MultiBodyImpl::getBodyFirstMassMoment(const int body_index,
- vec3 *first_mass_moment) const {
+ vec3 *first_mass_moment) const
+{
CHECK_IF_BODY_INDEX_IS_VALID(body_index);
*first_mass_moment = m_body_list[body_index].m_body_mass_com;
return 0;
}
int MultiBodyTree::MultiBodyImpl::getBodySecondMassMoment(const int body_index,
- mat33 *second_mass_moment) const {
+ mat33 *second_mass_moment) const
+{
CHECK_IF_BODY_INDEX_IS_VALID(body_index);
*second_mass_moment = m_body_list[body_index].m_body_I_body;
return 0;
}
-void MultiBodyTree::MultiBodyImpl::clearAllUserForcesAndMoments() {
- for (int index = 0; index < m_num_bodies; index++) {
+void MultiBodyTree::MultiBodyImpl::clearAllUserForcesAndMoments()
+{
+ for (int index = 0; index < m_num_bodies; index++)
+ {
RigidBody &body = m_body_list[index];
setZero(body.m_body_force_user);
setZero(body.m_body_moment_user);
}
}
-int MultiBodyTree::MultiBodyImpl::addUserForce(const int body_index, const vec3 &body_force) {
+int MultiBodyTree::MultiBodyImpl::addUserForce(const int body_index, const vec3 &body_force)
+{
CHECK_IF_BODY_INDEX_IS_VALID(body_index);
m_body_list[body_index].m_body_force_user += body_force;
return 0;
}
-int MultiBodyTree::MultiBodyImpl::addUserMoment(const int body_index, const vec3 &body_moment) {
+int MultiBodyTree::MultiBodyImpl::addUserMoment(const int body_index, const vec3 &body_moment)
+{
CHECK_IF_BODY_INDEX_IS_VALID(body_index);
m_body_list[body_index].m_body_moment_user += body_moment;
return 0;
}
#if (defined BT_ID_HAVE_MAT3X) && (defined BT_ID_WITH_JACOBIANS)
-int MultiBodyTree::MultiBodyImpl::getBodyDotJacobianTransU(const int body_index, vec3* world_dot_jac_trans_u) const {
- CHECK_IF_BODY_INDEX_IS_VALID(body_index);
- const RigidBody &body = m_body_list[body_index];
- *world_dot_jac_trans_u = body.m_body_T_world.transpose() * body.m_body_dot_Jac_T_u;
- return 0;
+int MultiBodyTree::MultiBodyImpl::getBodyDotJacobianTransU(const int body_index, vec3 *world_dot_jac_trans_u) const
+{
+ CHECK_IF_BODY_INDEX_IS_VALID(body_index);
+ const RigidBody &body = m_body_list[body_index];
+ *world_dot_jac_trans_u = body.m_body_T_world.transpose() * body.m_body_dot_Jac_T_u;
+ return 0;
}
-int MultiBodyTree::MultiBodyImpl::getBodyDotJacobianRotU(const int body_index, vec3* world_dot_jac_rot_u) const{
- CHECK_IF_BODY_INDEX_IS_VALID(body_index);
- const RigidBody &body = m_body_list[body_index];
- *world_dot_jac_rot_u = body.m_body_T_world.transpose() * body.m_body_dot_Jac_R_u;
- return 0;
+int MultiBodyTree::MultiBodyImpl::getBodyDotJacobianRotU(const int body_index, vec3 *world_dot_jac_rot_u) const
+{
+ CHECK_IF_BODY_INDEX_IS_VALID(body_index);
+ const RigidBody &body = m_body_list[body_index];
+ *world_dot_jac_rot_u = body.m_body_T_world.transpose() * body.m_body_dot_Jac_R_u;
+ return 0;
}
-int MultiBodyTree::MultiBodyImpl::getBodyJacobianTrans(const int body_index, mat3x* world_jac_trans) const{
- CHECK_IF_BODY_INDEX_IS_VALID(body_index);
- const RigidBody &body = m_body_list[body_index];
- mul(body.m_body_T_world.transpose(), body.m_body_Jac_T, world_jac_trans);
- return 0;
+int MultiBodyTree::MultiBodyImpl::getBodyJacobianTrans(const int body_index, mat3x *world_jac_trans) const
+{
+ CHECK_IF_BODY_INDEX_IS_VALID(body_index);
+ const RigidBody &body = m_body_list[body_index];
+ mul(body.m_body_T_world.transpose(), body.m_body_Jac_T, world_jac_trans);
+ return 0;
}
-int MultiBodyTree::MultiBodyImpl::getBodyJacobianRot(const int body_index, mat3x* world_jac_rot) const{
- CHECK_IF_BODY_INDEX_IS_VALID(body_index);
- const RigidBody &body = m_body_list[body_index];
- mul(body.m_body_T_world.transpose(), body.m_body_Jac_R,world_jac_rot);
- return 0;
+int MultiBodyTree::MultiBodyImpl::getBodyJacobianRot(const int body_index, mat3x *world_jac_rot) const
+{
+ CHECK_IF_BODY_INDEX_IS_VALID(body_index);
+ const RigidBody &body = m_body_list[body_index];
+ mul(body.m_body_T_world.transpose(), body.m_body_Jac_R, world_jac_rot);
+ return 0;
}
#endif
-}
+} // namespace btInverseDynamics
diff --git a/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeImpl.hpp b/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeImpl.hpp
index 3efe9d0492..eabdbe161b 100644
--- a/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeImpl.hpp
+++ b/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeImpl.hpp
@@ -8,12 +8,13 @@
#include "../IDConfig.hpp"
#include "../MultiBodyTree.hpp"
-namespace btInverseDynamics {
-
+namespace btInverseDynamics
+{
/// Structure for for rigid body mass properties, connectivity and kinematic state
/// all vectors and matrices are in body-fixed frame, if not indicated otherwise.
/// The body-fixed frame is located in the joint connecting the body to its parent.
-struct RigidBody {
+struct RigidBody
+{
ID_DECLARE_ALIGNED_ALLOCATOR();
// 1 Inertial properties
/// Mass
@@ -112,31 +113,33 @@ struct RigidBody {
mat33 m_body_subtree_I_body;
#if (defined BT_ID_HAVE_MAT3X) && (defined BT_ID_WITH_JACOBIANS)
- /// translational jacobian in body-fixed frame d(m_body_vel)/du
- mat3x m_body_Jac_T;
- /// rotationsl jacobian in body-fixed frame d(m_body_ang_vel)/du
- mat3x m_body_Jac_R;
- /// components of linear acceleration depending on u
- /// (same as is d(m_Jac_T)/dt*u)
- vec3 m_body_dot_Jac_T_u;
- /// components of angular acceleration depending on u
- /// (same as is d(m_Jac_T)/dt*u)
- vec3 m_body_dot_Jac_R_u;
+ /// translational jacobian in body-fixed frame d(m_body_vel)/du
+ mat3x m_body_Jac_T;
+ /// rotationsl jacobian in body-fixed frame d(m_body_ang_vel)/du
+ mat3x m_body_Jac_R;
+ /// components of linear acceleration depending on u
+ /// (same as is d(m_Jac_T)/dt*u)
+ vec3 m_body_dot_Jac_T_u;
+ /// components of angular acceleration depending on u
+ /// (same as is d(m_Jac_T)/dt*u)
+ vec3 m_body_dot_Jac_R_u;
#endif
};
/// The MBS implements a tree structured multibody system
-class MultiBodyTree::MultiBodyImpl {
+class MultiBodyTree::MultiBodyImpl
+{
friend class MultiBodyTree;
public:
ID_DECLARE_ALIGNED_ALLOCATOR();
- enum KinUpdateType {
- POSITION_ONLY,
- POSITION_VELOCITY,
- POSITION_VELOCITY_ACCELERATION
- };
+ enum KinUpdateType
+ {
+ POSITION_ONLY,
+ POSITION_VELOCITY,
+ POSITION_VELOCITY_ACCELERATION
+ };
/// constructor
/// @param num_bodies the number of bodies in the system
@@ -150,24 +153,24 @@ public:
int calculateMassMatrix(const vecx& q, const bool update_kinematics,
const bool initialize_matrix, const bool set_lower_triangular_matrix,
matxx* mass_matrix);
- /// calculate kinematics (vector quantities)
- /// Depending on type, update positions only, positions & velocities, or positions, velocities
- /// and accelerations.
- int calculateKinematics(const vecx& q, const vecx& u, const vecx& dot_u, const KinUpdateType type);
+ /// calculate kinematics (vector quantities)
+ /// Depending on type, update positions only, positions & velocities, or positions, velocities
+ /// and accelerations.
+ int calculateKinematics(const vecx& q, const vecx& u, const vecx& dot_u, const KinUpdateType type);
#if (defined BT_ID_HAVE_MAT3X) && (defined BT_ID_WITH_JACOBIANS)
- /// calculate jacobians and (if type == POSITION_VELOCITY), also velocity-dependent accelration terms.
- int calculateJacobians(const vecx& q, const vecx& u, const KinUpdateType type);
- /// \copydoc MultiBodyTree::getBodyDotJacobianTransU
- int getBodyDotJacobianTransU(const int body_index, vec3* world_dot_jac_trans_u) const ;
- /// \copydoc MultiBodyTree::getBodyDotJacobianRotU
- int getBodyDotJacobianRotU(const int body_index, vec3* world_dot_jac_rot_u) const;
- /// \copydoc MultiBodyTree::getBodyJacobianTrans
- int getBodyJacobianTrans(const int body_index, mat3x* world_jac_trans) const ;
- /// \copydoc MultiBodyTree::getBodyJacobianRot
- int getBodyJacobianRot(const int body_index, mat3x* world_jac_rot) const;
- /// Add relative Jacobian component from motion relative to parent body
- /// @param body the body to add the Jacobian component for
- void addRelativeJacobianComponent(RigidBody&body);
+ /// calculate jacobians and (if type == POSITION_VELOCITY), also velocity-dependent accelration terms.
+ int calculateJacobians(const vecx& q, const vecx& u, const KinUpdateType type);
+ /// \copydoc MultiBodyTree::getBodyDotJacobianTransU
+ int getBodyDotJacobianTransU(const int body_index, vec3* world_dot_jac_trans_u) const;
+ /// \copydoc MultiBodyTree::getBodyDotJacobianRotU
+ int getBodyDotJacobianRotU(const int body_index, vec3* world_dot_jac_rot_u) const;
+ /// \copydoc MultiBodyTree::getBodyJacobianTrans
+ int getBodyJacobianTrans(const int body_index, mat3x* world_jac_trans) const;
+ /// \copydoc MultiBodyTree::getBodyJacobianRot
+ int getBodyJacobianRot(const int body_index, mat3x* world_jac_rot) const;
+ /// Add relative Jacobian component from motion relative to parent body
+ /// @param body the body to add the Jacobian component for
+ void addRelativeJacobianComponent(RigidBody& body);
#endif
/// generate additional index sets from the parent_index array
/// @return -1 on error, 0 on success
@@ -190,12 +193,12 @@ public:
int getJointType(const int body_index, JointType* joint_type) const;
/// \copydoc MultiBodyTree::getJointTypeStr
int getJointTypeStr(const int body_index, const char** joint_type) const;
- /// \copydoc MultiBodyTree::getParentRParentBodyRef
- int getParentRParentBodyRef(const int body_index, vec3* r) const;
- /// \copydoc MultiBodyTree::getBodyTParentRef
- int getBodyTParentRef(const int body_index, mat33* T) const;
- /// \copydoc MultiBodyTree::getBodyAxisOfMotion
- int getBodyAxisOfMotion(const int body_index, vec3* axis) const;
+ /// \copydoc MultiBodyTree::getParentRParentBodyRef
+ int getParentRParentBodyRef(const int body_index, vec3* r) const;
+ /// \copydoc MultiBodyTree::getBodyTParentRef
+ int getBodyTParentRef(const int body_index, mat33* T) const;
+ /// \copydoc MultiBodyTree::getBodyAxisOfMotion
+ int getBodyAxisOfMotion(const int body_index, vec3* axis) const;
/// \copydoc MultiBodyTree:getDoFOffset
int getDoFOffset(const int body_index, int* q_index) const;
/// \copydoc MultiBodyTree::getBodyOrigin
@@ -271,13 +274,15 @@ private:
idArray<int>::type m_body_prismatic_list;
// Indices of floating joints
idArray<int>::type m_body_floating_list;
+ // Indices of spherical joints
+ idArray<int>::type m_body_spherical_list;
// a user-provided integer
idArray<int>::type m_user_int;
// a user-provided pointer
idArray<void*>::type m_user_ptr;
#if (defined BT_ID_HAVE_MAT3X) && (defined BT_ID_WITH_JACOBIANS)
- mat3x m_m3x;
+ mat3x m_m3x;
#endif
};
-}
+} // namespace btInverseDynamics
#endif
diff --git a/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeInitCache.cpp b/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeInitCache.cpp
index e9511b7076..a718db051e 100644
--- a/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeInitCache.cpp
+++ b/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeInitCache.cpp
@@ -1,12 +1,13 @@
#include "MultiBodyTreeInitCache.hpp"
-namespace btInverseDynamics {
-
-MultiBodyTree::InitCache::InitCache() {
+namespace btInverseDynamics
+{
+MultiBodyTree::InitCache::InitCache()
+{
m_inertias.resize(0);
m_joints.resize(0);
m_num_dofs = 0;
- m_root_index=-1;
+ m_root_index = -1;
}
int MultiBodyTree::InitCache::addBody(const int body_index, const int parent_index,
@@ -15,8 +16,10 @@ int MultiBodyTree::InitCache::addBody(const int body_index, const int parent_ind
const mat33& body_T_parent_ref,
const vec3& body_axis_of_motion, const idScalar mass,
const vec3& body_r_body_com, const mat33& body_I_body,
- const int user_int, void* user_ptr) {
- switch (joint_type) {
+ const int user_int, void* user_ptr)
+{
+ switch (joint_type)
+ {
case REVOLUTE:
case PRISMATIC:
m_num_dofs += 1;
@@ -25,6 +28,9 @@ int MultiBodyTree::InitCache::addBody(const int body_index, const int parent_ind
// does not add a degree of freedom
// m_num_dofs+=0;
break;
+ case SPHERICAL:
+ m_num_dofs += 3;
+ break;
case FLOATING:
m_num_dofs += 6;
break;
@@ -33,13 +39,15 @@ int MultiBodyTree::InitCache::addBody(const int body_index, const int parent_ind
return -1;
}
- if(-1 == parent_index) {
- if(m_root_index>=0) {
+ if (-1 == parent_index)
+ {
+ if (m_root_index >= 0)
+ {
bt_id_error_message("trying to add body %d as root, but already added %d as root body\n",
- body_index, m_root_index);
+ body_index, m_root_index);
return -1;
}
- m_root_index=body_index;
+ m_root_index = body_index;
}
JointData joint;
@@ -61,8 +69,10 @@ int MultiBodyTree::InitCache::addBody(const int body_index, const int parent_ind
m_user_ptr.push_back(user_ptr);
return 0;
}
-int MultiBodyTree::InitCache::getInertiaData(const int index, InertiaData* inertia) const {
- if (index < 0 || index > static_cast<int>(m_inertias.size())) {
+int MultiBodyTree::InitCache::getInertiaData(const int index, InertiaData* inertia) const
+{
+ if (index < 0 || index > static_cast<int>(m_inertias.size()))
+ {
bt_id_error_message("index out of range\n");
return -1;
}
@@ -71,8 +81,10 @@ int MultiBodyTree::InitCache::getInertiaData(const int index, InertiaData* inert
return 0;
}
-int MultiBodyTree::InitCache::getUserInt(const int index, int* user_int) const {
- if (index < 0 || index > static_cast<int>(m_user_int.size())) {
+int MultiBodyTree::InitCache::getUserInt(const int index, int* user_int) const
+{
+ if (index < 0 || index > static_cast<int>(m_user_int.size()))
+ {
bt_id_error_message("index out of range\n");
return -1;
}
@@ -80,8 +92,10 @@ int MultiBodyTree::InitCache::getUserInt(const int index, int* user_int) const {
return 0;
}
-int MultiBodyTree::InitCache::getUserPtr(const int index, void** user_ptr) const {
- if (index < 0 || index > static_cast<int>(m_user_ptr.size())) {
+int MultiBodyTree::InitCache::getUserPtr(const int index, void** user_ptr) const
+{
+ if (index < 0 || index > static_cast<int>(m_user_ptr.size()))
+ {
bt_id_error_message("index out of range\n");
return -1;
}
@@ -89,8 +103,10 @@ int MultiBodyTree::InitCache::getUserPtr(const int index, void** user_ptr) const
return 0;
}
-int MultiBodyTree::InitCache::getJointData(const int index, JointData* joint) const {
- if (index < 0 || index > static_cast<int>(m_joints.size())) {
+int MultiBodyTree::InitCache::getJointData(const int index, JointData* joint) const
+{
+ if (index < 0 || index > static_cast<int>(m_joints.size()))
+ {
bt_id_error_message("index out of range\n");
return -1;
}
@@ -98,16 +114,18 @@ int MultiBodyTree::InitCache::getJointData(const int index, JointData* joint) co
return 0;
}
-int MultiBodyTree::InitCache::buildIndexSets() {
+int MultiBodyTree::InitCache::buildIndexSets()
+{
// NOTE: This function assumes that proper indices were provided
// User2InternalIndex from utils can be used to facilitate this.
m_parent_index.resize(numBodies());
- for (idArrayIdx j = 0; j < m_joints.size(); j++) {
+ for (idArrayIdx j = 0; j < m_joints.size(); j++)
+ {
const JointData& joint = m_joints[j];
m_parent_index[joint.m_child] = joint.m_parent;
}
return 0;
}
-}
+} // namespace btInverseDynamics
diff --git a/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeInitCache.hpp b/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeInitCache.hpp
index 0d2aa4a071..dbdb3ff604 100644
--- a/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeInitCache.hpp
+++ b/thirdparty/bullet/BulletInverseDynamics/details/MultiBodyTreeInitCache.hpp
@@ -5,9 +5,11 @@
#include "../IDMath.hpp"
#include "../MultiBodyTree.hpp"
-namespace btInverseDynamics {
+namespace btInverseDynamics
+{
/// Mass properties of a rigid body
-struct InertiaData {
+struct InertiaData
+{
ID_DECLARE_ALIGNED_ALLOCATOR();
/// mass
@@ -21,7 +23,8 @@ struct InertiaData {
};
/// Joint properties
-struct JointData {
+struct JointData
+{
ID_DECLARE_ALIGNED_ALLOCATOR();
/// type of joint
@@ -48,7 +51,8 @@ struct JointData {
/// Data structure to store data passed by the user.
/// This is used in MultiBodyTree::finalize to build internal data structures.
-class MultiBodyTree::InitCache {
+class MultiBodyTree::InitCache
+{
public:
ID_DECLARE_ALIGNED_ALLOCATOR();
/// constructor
@@ -105,5 +109,5 @@ private:
// index of root body (or -1 if not set)
int m_root_index;
};
-}
+} // namespace btInverseDynamics
#endif // MULTIBODYTREEINITCACHE_HPP_
diff --git a/thirdparty/bullet/BulletSoftBody/btDefaultSoftBodySolver.cpp b/thirdparty/bullet/BulletSoftBody/btDefaultSoftBodySolver.cpp
index 9c20403074..8b7ff9abcd 100644
--- a/thirdparty/bullet/BulletSoftBody/btDefaultSoftBodySolver.cpp
+++ b/thirdparty/bullet/BulletSoftBody/btDefaultSoftBodySolver.cpp
@@ -21,11 +21,10 @@ subject to the following restrictions:
#include "BulletCollision/CollisionShapes/btCapsuleShape.h"
#include "BulletSoftBody/btSoftBody.h"
-
btDefaultSoftBodySolver::btDefaultSoftBodySolver()
{
// Initial we will clearly need to update solver constants
- // For now this is global for the cloths linked with this solver - we should probably make this body specific
+ // For now this is global for the cloths linked with this solver - we should probably make this body specific
// for performance in future once we understand more clearly when constants need to be updated
m_updateSolverConstants = true;
}
@@ -37,67 +36,65 @@ btDefaultSoftBodySolver::~btDefaultSoftBodySolver()
// In this case the data is already in the soft bodies so there is no need for us to do anything
void btDefaultSoftBodySolver::copyBackToSoftBodies(bool bMove)
{
-
}
-void btDefaultSoftBodySolver::optimize( btAlignedObjectArray< btSoftBody * > &softBodies , bool forceUpdate)
+void btDefaultSoftBodySolver::optimize(btAlignedObjectArray<btSoftBody *> &softBodies, bool forceUpdate)
{
- m_softBodySet.copyFromArray( softBodies );
+ m_softBodySet.copyFromArray(softBodies);
}
-void btDefaultSoftBodySolver::updateSoftBodies( )
+void btDefaultSoftBodySolver::updateSoftBodies()
{
- for ( int i=0; i < m_softBodySet.size(); i++)
+ for (int i = 0; i < m_softBodySet.size(); i++)
{
- btSoftBody* psb=(btSoftBody*)m_softBodySet[i];
+ btSoftBody *psb = (btSoftBody *)m_softBodySet[i];
if (psb->isActive())
{
- psb->integrateMotion();
+ psb->integrateMotion();
}
}
-} // updateSoftBodies
+} // updateSoftBodies
bool btDefaultSoftBodySolver::checkInitialized()
{
return true;
}
-void btDefaultSoftBodySolver::solveConstraints( float solverdt )
+void btDefaultSoftBodySolver::solveConstraints(float solverdt)
{
// Solve constraints for non-solver softbodies
- for(int i=0; i < m_softBodySet.size(); ++i)
+ for (int i = 0; i < m_softBodySet.size(); ++i)
{
- btSoftBody* psb = static_cast<btSoftBody*>(m_softBodySet[i]);
+ btSoftBody *psb = static_cast<btSoftBody *>(m_softBodySet[i]);
if (psb->isActive())
{
psb->solveConstraints();
}
- }
-} // btDefaultSoftBodySolver::solveConstraints
-
+ }
+} // btDefaultSoftBodySolver::solveConstraints
-void btDefaultSoftBodySolver::copySoftBodyToVertexBuffer( const btSoftBody *const softBody, btVertexBufferDescriptor *vertexBuffer )
+void btDefaultSoftBodySolver::copySoftBodyToVertexBuffer(const btSoftBody *const softBody, btVertexBufferDescriptor *vertexBuffer)
{
// Currently only support CPU output buffers
// TODO: check for DX11 buffers. Take all offsets into the same DX11 buffer
// and use them together on a single kernel call if possible by setting up a
// per-cloth target buffer array for the copy kernel.
- if( vertexBuffer->getBufferType() == btVertexBufferDescriptor::CPU_BUFFER )
+ if (vertexBuffer->getBufferType() == btVertexBufferDescriptor::CPU_BUFFER)
{
- const btAlignedObjectArray<btSoftBody::Node> &clothVertices( softBody->m_nodes );
+ const btAlignedObjectArray<btSoftBody::Node> &clothVertices(softBody->m_nodes);
int numVertices = clothVertices.size();
- const btCPUVertexBufferDescriptor *cpuVertexBuffer = static_cast< btCPUVertexBufferDescriptor* >(vertexBuffer);
- float *basePointer = cpuVertexBuffer->getBasePointer();
+ const btCPUVertexBufferDescriptor *cpuVertexBuffer = static_cast<btCPUVertexBufferDescriptor *>(vertexBuffer);
+ float *basePointer = cpuVertexBuffer->getBasePointer();
- if( vertexBuffer->hasVertexPositions() )
+ if (vertexBuffer->hasVertexPositions())
{
const int vertexOffset = cpuVertexBuffer->getVertexOffset();
const int vertexStride = cpuVertexBuffer->getVertexStride();
float *vertexPointer = basePointer + vertexOffset;
- for( int vertexIndex = 0; vertexIndex < numVertices; ++vertexIndex )
+ for (int vertexIndex = 0; vertexIndex < numVertices; ++vertexIndex)
{
btVector3 position = clothVertices[vertexIndex].m_x;
*(vertexPointer + 0) = (float)position.getX();
@@ -106,13 +103,13 @@ void btDefaultSoftBodySolver::copySoftBodyToVertexBuffer( const btSoftBody *cons
vertexPointer += vertexStride;
}
}
- if( vertexBuffer->hasNormals() )
+ if (vertexBuffer->hasNormals())
{
const int normalOffset = cpuVertexBuffer->getNormalOffset();
const int normalStride = cpuVertexBuffer->getNormalStride();
float *normalPointer = basePointer + normalOffset;
- for( int vertexIndex = 0; vertexIndex < numVertices; ++vertexIndex )
+ for (int vertexIndex = 0; vertexIndex < numVertices; ++vertexIndex)
{
btVector3 normal = clothVertices[vertexIndex].m_n;
*(normalPointer + 0) = (float)normal.getX();
@@ -122,30 +119,28 @@ void btDefaultSoftBodySolver::copySoftBodyToVertexBuffer( const btSoftBody *cons
}
}
}
-} // btDefaultSoftBodySolver::copySoftBodyToVertexBuffer
+} // btDefaultSoftBodySolver::copySoftBodyToVertexBuffer
-void btDefaultSoftBodySolver::processCollision( btSoftBody* softBody, btSoftBody* otherSoftBody)
+void btDefaultSoftBodySolver::processCollision(btSoftBody *softBody, btSoftBody *otherSoftBody)
{
- softBody->defaultCollisionHandler( otherSoftBody);
+ softBody->defaultCollisionHandler(otherSoftBody);
}
// For the default solver just leave the soft body to do its collision processing
-void btDefaultSoftBodySolver::processCollision( btSoftBody *softBody, const btCollisionObjectWrapper* collisionObjectWrap )
+void btDefaultSoftBodySolver::processCollision(btSoftBody *softBody, const btCollisionObjectWrapper *collisionObjectWrap)
{
- softBody->defaultCollisionHandler( collisionObjectWrap );
-} // btDefaultSoftBodySolver::processCollision
-
+ softBody->defaultCollisionHandler(collisionObjectWrap);
+} // btDefaultSoftBodySolver::processCollision
-void btDefaultSoftBodySolver::predictMotion( float timeStep )
+void btDefaultSoftBodySolver::predictMotion(float timeStep)
{
- for ( int i=0; i < m_softBodySet.size(); ++i)
+ for (int i = 0; i < m_softBodySet.size(); ++i)
{
- btSoftBody* psb = m_softBodySet[i];
+ btSoftBody *psb = m_softBodySet[i];
if (psb->isActive())
{
- psb->predictMotion(timeStep);
+ psb->predictMotion(timeStep);
}
}
}
-
diff --git a/thirdparty/bullet/BulletSoftBody/btDefaultSoftBodySolver.h b/thirdparty/bullet/BulletSoftBody/btDefaultSoftBodySolver.h
index 1c17ffcbb2..50bd735165 100644
--- a/thirdparty/bullet/BulletSoftBody/btDefaultSoftBodySolver.h
+++ b/thirdparty/bullet/BulletSoftBody/btDefaultSoftBodySolver.h
@@ -16,25 +16,23 @@ subject to the following restrictions:
#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:
+protected:
/** Variable to define whether we need to update solver constants on the next iteration */
bool m_updateSolverConstants;
- btAlignedObjectArray< btSoftBody * > m_softBodySet;
-
+ btAlignedObjectArray<btSoftBody *> m_softBodySet;
public:
btDefaultSoftBodySolver();
-
+
virtual ~btDefaultSoftBodySolver();
-
+
virtual SolverTypes getSolverType() const
{
return DEFAULT_SOLVER;
@@ -42,22 +40,21 @@ public:
virtual bool checkInitialized();
- virtual void updateSoftBodies( );
+ virtual void updateSoftBodies();
- virtual void optimize( btAlignedObjectArray< btSoftBody * > &softBodies,bool forceUpdate=false );
+ virtual void optimize(btAlignedObjectArray<btSoftBody *> &softBodies, bool forceUpdate = false);
virtual void copyBackToSoftBodies(bool bMove = true);
- virtual void solveConstraints( float solverdt );
-
- virtual void predictMotion( float solverdt );
+ virtual void solveConstraints(float solverdt);
- virtual void copySoftBodyToVertexBuffer( const btSoftBody *const softBody, btVertexBufferDescriptor *vertexBuffer );
+ virtual void predictMotion(float solverdt);
- virtual void processCollision( btSoftBody *, const btCollisionObjectWrapper* );
+ virtual void copySoftBodyToVertexBuffer(const btSoftBody *const softBody, btVertexBufferDescriptor *vertexBuffer);
- virtual void processCollision( btSoftBody*, btSoftBody* );
+ virtual void processCollision(btSoftBody *, const btCollisionObjectWrapper *);
+ virtual void processCollision(btSoftBody *, btSoftBody *);
};
-#endif // #ifndef BT_ACCELERATED_SOFT_BODY_CPU_SOLVER_H
+#endif // #ifndef BT_ACCELERATED_SOFT_BODY_CPU_SOLVER_H
diff --git a/thirdparty/bullet/BulletSoftBody/btSoftBody.cpp b/thirdparty/bullet/BulletSoftBody/btSoftBody.cpp
index 48efb0d8d4..58796a88d0 100644
--- a/thirdparty/bullet/BulletSoftBody/btSoftBody.cpp
+++ b/thirdparty/bullet/BulletSoftBody/btSoftBody.cpp
@@ -21,97 +21,94 @@ subject to the following restrictions:
#include "BulletDynamics/Featherstone/btMultiBodyLinkCollider.h"
#include "BulletDynamics/Featherstone/btMultiBodyConstraint.h"
-
//
-btSoftBody::btSoftBody(btSoftBodyWorldInfo* worldInfo,int node_count, const btVector3* x, const btScalar* m)
-:m_softBodySolver(0),m_worldInfo(worldInfo)
-{
- /* Init */
+btSoftBody::btSoftBody(btSoftBodyWorldInfo* worldInfo, int node_count, const btVector3* x, const btScalar* m)
+ : m_softBodySolver(0), m_worldInfo(worldInfo)
+{
+ /* Init */
initDefaults();
- /* Default material */
- Material* pm=appendMaterial();
- pm->m_kLST = 1;
- pm->m_kAST = 1;
- pm->m_kVST = 1;
- pm->m_flags = fMaterial::Default;
+ /* Default material */
+ Material* pm = appendMaterial();
+ pm->m_kLST = 1;
+ pm->m_kAST = 1;
+ pm->m_kVST = 1;
+ pm->m_flags = fMaterial::Default;
- /* Nodes */
- const btScalar margin=getCollisionShape()->getMargin();
+ /* Nodes */
+ const btScalar margin = getCollisionShape()->getMargin();
m_nodes.resize(node_count);
- for(int i=0,ni=node_count;i<ni;++i)
- {
- Node& n=m_nodes[i];
+ for (int i = 0, ni = node_count; i < ni; ++i)
+ {
+ Node& n = m_nodes[i];
ZeroInitialize(n);
- n.m_x = x?*x++:btVector3(0,0,0);
- n.m_q = n.m_x;
- n.m_im = m?*m++:1;
- n.m_im = n.m_im>0?1/n.m_im:0;
- n.m_leaf = m_ndbvt.insert(btDbvtVolume::FromCR(n.m_x,margin),&n);
- n.m_material= pm;
+ n.m_x = x ? *x++ : btVector3(0, 0, 0);
+ n.m_q = n.m_x;
+ n.m_im = m ? *m++ : 1;
+ n.m_im = n.m_im > 0 ? 1 / n.m_im : 0;
+ n.m_leaf = m_ndbvt.insert(btDbvtVolume::FromCR(n.m_x, margin), &n);
+ n.m_material = pm;
}
- updateBounds();
-
+ updateBounds();
}
-btSoftBody::btSoftBody(btSoftBodyWorldInfo* worldInfo)
-:m_worldInfo(worldInfo)
+btSoftBody::btSoftBody(btSoftBodyWorldInfo* worldInfo)
+ : m_worldInfo(worldInfo)
{
initDefaults();
}
-
-void btSoftBody::initDefaults()
-{
- m_internalType = CO_SOFT_BODY;
- m_cfg.aeromodel = eAeroModel::V_Point;
- m_cfg.kVCF = 1;
- m_cfg.kDG = 0;
- m_cfg.kLF = 0;
- m_cfg.kDP = 0;
- m_cfg.kPR = 0;
- m_cfg.kVC = 0;
- m_cfg.kDF = (btScalar)0.2;
- m_cfg.kMT = 0;
- m_cfg.kCHR = (btScalar)1.0;
- m_cfg.kKHR = (btScalar)0.1;
- m_cfg.kSHR = (btScalar)1.0;
- m_cfg.kAHR = (btScalar)0.7;
- m_cfg.kSRHR_CL = (btScalar)0.1;
- m_cfg.kSKHR_CL = (btScalar)1;
- m_cfg.kSSHR_CL = (btScalar)0.5;
- m_cfg.kSR_SPLT_CL = (btScalar)0.5;
- m_cfg.kSK_SPLT_CL = (btScalar)0.5;
- m_cfg.kSS_SPLT_CL = (btScalar)0.5;
- m_cfg.maxvolume = (btScalar)1;
- m_cfg.timescale = 1;
- m_cfg.viterations = 0;
- m_cfg.piterations = 1;
- m_cfg.diterations = 0;
- m_cfg.citerations = 4;
- m_cfg.collisions = fCollision::Default;
- m_pose.m_bvolume = false;
- m_pose.m_bframe = false;
- m_pose.m_volume = 0;
- m_pose.m_com = btVector3(0,0,0);
+void btSoftBody::initDefaults()
+{
+ m_internalType = CO_SOFT_BODY;
+ m_cfg.aeromodel = eAeroModel::V_Point;
+ m_cfg.kVCF = 1;
+ m_cfg.kDG = 0;
+ m_cfg.kLF = 0;
+ m_cfg.kDP = 0;
+ m_cfg.kPR = 0;
+ m_cfg.kVC = 0;
+ m_cfg.kDF = (btScalar)0.2;
+ m_cfg.kMT = 0;
+ m_cfg.kCHR = (btScalar)1.0;
+ m_cfg.kKHR = (btScalar)0.1;
+ m_cfg.kSHR = (btScalar)1.0;
+ m_cfg.kAHR = (btScalar)0.7;
+ m_cfg.kSRHR_CL = (btScalar)0.1;
+ m_cfg.kSKHR_CL = (btScalar)1;
+ m_cfg.kSSHR_CL = (btScalar)0.5;
+ m_cfg.kSR_SPLT_CL = (btScalar)0.5;
+ m_cfg.kSK_SPLT_CL = (btScalar)0.5;
+ m_cfg.kSS_SPLT_CL = (btScalar)0.5;
+ m_cfg.maxvolume = (btScalar)1;
+ m_cfg.timescale = 1;
+ m_cfg.viterations = 0;
+ m_cfg.piterations = 1;
+ m_cfg.diterations = 0;
+ m_cfg.citerations = 4;
+ m_cfg.collisions = fCollision::Default;
+ m_pose.m_bvolume = false;
+ m_pose.m_bframe = false;
+ m_pose.m_volume = 0;
+ m_pose.m_com = btVector3(0, 0, 0);
m_pose.m_rot.setIdentity();
m_pose.m_scl.setIdentity();
- m_tag = 0;
- m_timeacc = 0;
- m_bUpdateRtCst = true;
- m_bounds[0] = btVector3(0,0,0);
- m_bounds[1] = btVector3(0,0,0);
+ m_tag = 0;
+ m_timeacc = 0;
+ m_bUpdateRtCst = true;
+ m_bounds[0] = btVector3(0, 0, 0);
+ m_bounds[1] = btVector3(0, 0, 0);
m_worldTransform.setIdentity();
setSolver(eSolverPresets::Positions);
-
- /* Collision shape */
+
+ /* Collision shape */
///for now, create a collision shape internally
m_collisionShape = new btSoftBodyCollisionShape(this);
m_collisionShape->setMargin(0.25f);
-
+
m_initialWorldTransform.setIdentity();
- m_windVelocity = btVector3(0,0,0);
+ m_windVelocity = btVector3(0, 0, 0);
m_restLengthScale = btScalar(1.0);
}
@@ -119,343 +116,361 @@ void btSoftBody::initDefaults()
btSoftBody::~btSoftBody()
{
//for now, delete the internal shape
- delete m_collisionShape;
+ delete m_collisionShape;
int i;
releaseClusters();
- for(i=0;i<m_materials.size();++i)
+ for (i = 0; i < m_materials.size(); ++i)
btAlignedFree(m_materials[i]);
- for(i=0;i<m_joints.size();++i)
+ for (i = 0; i < m_joints.size(); ++i)
btAlignedFree(m_joints[i]);
}
//
-bool btSoftBody::checkLink(int node0,int node1) const
+bool btSoftBody::checkLink(int node0, int node1) const
{
- return(checkLink(&m_nodes[node0],&m_nodes[node1]));
+ return (checkLink(&m_nodes[node0], &m_nodes[node1]));
}
//
-bool btSoftBody::checkLink(const Node* node0,const Node* node1) const
+bool btSoftBody::checkLink(const Node* node0, const Node* node1) const
{
- const Node* n[]={node0,node1};
- for(int i=0,ni=m_links.size();i<ni;++i)
+ const Node* n[] = {node0, node1};
+ for (int i = 0, ni = m_links.size(); i < ni; ++i)
{
- const Link& l=m_links[i];
- if( (l.m_n[0]==n[0]&&l.m_n[1]==n[1])||
- (l.m_n[0]==n[1]&&l.m_n[1]==n[0]))
+ const Link& l = m_links[i];
+ if ((l.m_n[0] == n[0] && l.m_n[1] == n[1]) ||
+ (l.m_n[0] == n[1] && l.m_n[1] == n[0]))
{
- return(true);
+ return (true);
}
}
- return(false);
+ return (false);
}
//
-bool btSoftBody::checkFace(int node0,int node1,int node2) const
+bool btSoftBody::checkFace(int node0, int node1, int node2) const
{
- const Node* n[]={ &m_nodes[node0],
- &m_nodes[node1],
- &m_nodes[node2]};
- for(int i=0,ni=m_faces.size();i<ni;++i)
+ const Node* n[] = {&m_nodes[node0],
+ &m_nodes[node1],
+ &m_nodes[node2]};
+ for (int i = 0, ni = m_faces.size(); i < ni; ++i)
{
- const Face& f=m_faces[i];
- int c=0;
- for(int j=0;j<3;++j)
+ const Face& f = m_faces[i];
+ int c = 0;
+ for (int j = 0; j < 3; ++j)
{
- if( (f.m_n[j]==n[0])||
- (f.m_n[j]==n[1])||
- (f.m_n[j]==n[2])) c|=1<<j; else break;
+ if ((f.m_n[j] == n[0]) ||
+ (f.m_n[j] == n[1]) ||
+ (f.m_n[j] == n[2]))
+ c |= 1 << j;
+ else
+ break;
}
- if(c==7) return(true);
+ if (c == 7) return (true);
}
- return(false);
+ return (false);
}
//
-btSoftBody::Material* btSoftBody::appendMaterial()
+btSoftBody::Material* btSoftBody::appendMaterial()
{
- Material* pm=new(btAlignedAlloc(sizeof(Material),16)) Material();
- if(m_materials.size()>0)
- *pm=*m_materials[0];
+ Material* pm = new (btAlignedAlloc(sizeof(Material), 16)) Material();
+ if (m_materials.size() > 0)
+ *pm = *m_materials[0];
else
ZeroInitialize(*pm);
m_materials.push_back(pm);
- return(pm);
+ return (pm);
}
//
-void btSoftBody::appendNote( const char* text,
- const btVector3& o,
- const btVector4& c,
- Node* n0,
- Node* n1,
- Node* n2,
- Node* n3)
+void btSoftBody::appendNote(const char* text,
+ const btVector3& o,
+ const btVector4& c,
+ Node* n0,
+ Node* n1,
+ Node* n2,
+ Node* n3)
{
- Note n;
+ Note n;
ZeroInitialize(n);
- n.m_rank = 0;
- n.m_text = text;
- n.m_offset = o;
- n.m_coords[0] = c.x();
- n.m_coords[1] = c.y();
- n.m_coords[2] = c.z();
- n.m_coords[3] = c.w();
- n.m_nodes[0] = n0;n.m_rank+=n0?1:0;
- n.m_nodes[1] = n1;n.m_rank+=n1?1:0;
- n.m_nodes[2] = n2;n.m_rank+=n2?1:0;
- n.m_nodes[3] = n3;n.m_rank+=n3?1:0;
+ n.m_rank = 0;
+ n.m_text = text;
+ n.m_offset = o;
+ n.m_coords[0] = c.x();
+ n.m_coords[1] = c.y();
+ n.m_coords[2] = c.z();
+ n.m_coords[3] = c.w();
+ n.m_nodes[0] = n0;
+ n.m_rank += n0 ? 1 : 0;
+ n.m_nodes[1] = n1;
+ n.m_rank += n1 ? 1 : 0;
+ n.m_nodes[2] = n2;
+ n.m_rank += n2 ? 1 : 0;
+ n.m_nodes[3] = n3;
+ n.m_rank += n3 ? 1 : 0;
m_notes.push_back(n);
}
//
-void btSoftBody::appendNote( const char* text,
- const btVector3& o,
- Node* feature)
+void btSoftBody::appendNote(const char* text,
+ const btVector3& o,
+ Node* feature)
{
- appendNote(text,o,btVector4(1,0,0,0),feature);
+ appendNote(text, o, btVector4(1, 0, 0, 0), feature);
}
//
-void btSoftBody::appendNote( const char* text,
- const btVector3& o,
- Link* feature)
+void btSoftBody::appendNote(const char* text,
+ const btVector3& o,
+ Link* feature)
{
- static const btScalar w=1/(btScalar)2;
- appendNote(text,o,btVector4(w,w,0,0), feature->m_n[0],
- feature->m_n[1]);
+ static const btScalar w = 1 / (btScalar)2;
+ appendNote(text, o, btVector4(w, w, 0, 0), feature->m_n[0],
+ feature->m_n[1]);
}
//
-void btSoftBody::appendNote( const char* text,
- const btVector3& o,
- Face* feature)
+void btSoftBody::appendNote(const char* text,
+ const btVector3& o,
+ Face* feature)
{
- static const btScalar w=1/(btScalar)3;
- appendNote(text,o,btVector4(w,w,w,0), feature->m_n[0],
- feature->m_n[1],
- feature->m_n[2]);
+ static const btScalar w = 1 / (btScalar)3;
+ appendNote(text, o, btVector4(w, w, w, 0), feature->m_n[0],
+ feature->m_n[1],
+ feature->m_n[2]);
}
//
-void btSoftBody::appendNode( const btVector3& x,btScalar m)
+void btSoftBody::appendNode(const btVector3& x, btScalar m)
{
- if(m_nodes.capacity()==m_nodes.size())
+ if (m_nodes.capacity() == m_nodes.size())
{
pointersToIndices();
- m_nodes.reserve(m_nodes.size()*2+1);
+ m_nodes.reserve(m_nodes.size() * 2 + 1);
indicesToPointers();
}
- const btScalar margin=getCollisionShape()->getMargin();
+ const btScalar margin = getCollisionShape()->getMargin();
m_nodes.push_back(Node());
- Node& n=m_nodes[m_nodes.size()-1];
+ Node& n = m_nodes[m_nodes.size() - 1];
ZeroInitialize(n);
- n.m_x = x;
- n.m_q = n.m_x;
- n.m_im = m>0?1/m:0;
- n.m_material = m_materials[0];
- n.m_leaf = m_ndbvt.insert(btDbvtVolume::FromCR(n.m_x,margin),&n);
+ n.m_x = x;
+ n.m_q = n.m_x;
+ n.m_im = m > 0 ? 1 / m : 0;
+ n.m_material = m_materials[0];
+ n.m_leaf = m_ndbvt.insert(btDbvtVolume::FromCR(n.m_x, margin), &n);
}
//
-void btSoftBody::appendLink(int model,Material* mat)
+void btSoftBody::appendLink(int model, Material* mat)
{
- Link l;
- if(model>=0)
- l=m_links[model];
+ Link l;
+ if (model >= 0)
+ l = m_links[model];
else
- { ZeroInitialize(l);l.m_material=mat?mat:m_materials[0]; }
+ {
+ ZeroInitialize(l);
+ l.m_material = mat ? mat : m_materials[0];
+ }
m_links.push_back(l);
}
//
-void btSoftBody::appendLink( int node0,
- int node1,
- Material* mat,
- bool bcheckexist)
+void btSoftBody::appendLink(int node0,
+ int node1,
+ Material* mat,
+ bool bcheckexist)
{
- appendLink(&m_nodes[node0],&m_nodes[node1],mat,bcheckexist);
+ appendLink(&m_nodes[node0], &m_nodes[node1], mat, bcheckexist);
}
//
-void btSoftBody::appendLink( Node* node0,
- Node* node1,
- Material* mat,
- bool bcheckexist)
+void btSoftBody::appendLink(Node* node0,
+ Node* node1,
+ Material* mat,
+ bool bcheckexist)
{
- if((!bcheckexist)||(!checkLink(node0,node1)))
+ if ((!bcheckexist) || (!checkLink(node0, node1)))
{
- appendLink(-1,mat);
- Link& l=m_links[m_links.size()-1];
- l.m_n[0] = node0;
- l.m_n[1] = node1;
- l.m_rl = (l.m_n[0]->m_x-l.m_n[1]->m_x).length();
- m_bUpdateRtCst=true;
+ appendLink(-1, mat);
+ Link& l = m_links[m_links.size() - 1];
+ l.m_n[0] = node0;
+ l.m_n[1] = node1;
+ l.m_rl = (l.m_n[0]->m_x - l.m_n[1]->m_x).length();
+ m_bUpdateRtCst = true;
}
}
//
-void btSoftBody::appendFace(int model,Material* mat)
+void btSoftBody::appendFace(int model, Material* mat)
{
- Face f;
- if(model>=0)
- { f=m_faces[model]; }
+ Face f;
+ if (model >= 0)
+ {
+ f = m_faces[model];
+ }
else
- { ZeroInitialize(f);f.m_material=mat?mat:m_materials[0]; }
+ {
+ ZeroInitialize(f);
+ f.m_material = mat ? mat : m_materials[0];
+ }
m_faces.push_back(f);
}
//
-void btSoftBody::appendFace(int node0,int node1,int node2,Material* mat)
+void btSoftBody::appendFace(int node0, int node1, int node2, Material* mat)
{
- if (node0==node1)
+ if (node0 == node1)
return;
- if (node1==node2)
+ if (node1 == node2)
return;
- if (node2==node0)
+ if (node2 == node0)
return;
- appendFace(-1,mat);
- Face& f=m_faces[m_faces.size()-1];
- btAssert(node0!=node1);
- btAssert(node1!=node2);
- btAssert(node2!=node0);
- f.m_n[0] = &m_nodes[node0];
- f.m_n[1] = &m_nodes[node1];
- f.m_n[2] = &m_nodes[node2];
- f.m_ra = AreaOf( f.m_n[0]->m_x,
- f.m_n[1]->m_x,
- f.m_n[2]->m_x);
- m_bUpdateRtCst=true;
+ appendFace(-1, mat);
+ Face& f = m_faces[m_faces.size() - 1];
+ btAssert(node0 != node1);
+ btAssert(node1 != node2);
+ btAssert(node2 != node0);
+ f.m_n[0] = &m_nodes[node0];
+ f.m_n[1] = &m_nodes[node1];
+ f.m_n[2] = &m_nodes[node2];
+ f.m_ra = AreaOf(f.m_n[0]->m_x,
+ f.m_n[1]->m_x,
+ f.m_n[2]->m_x);
+ m_bUpdateRtCst = true;
}
//
-void btSoftBody::appendTetra(int model,Material* mat)
+void btSoftBody::appendTetra(int model, Material* mat)
{
-Tetra t;
-if(model>=0)
- t=m_tetras[model];
+ Tetra t;
+ if (model >= 0)
+ t = m_tetras[model];
else
- { ZeroInitialize(t);t.m_material=mat?mat:m_materials[0]; }
-m_tetras.push_back(t);
+ {
+ ZeroInitialize(t);
+ t.m_material = mat ? mat : m_materials[0];
+ }
+ m_tetras.push_back(t);
}
//
-void btSoftBody::appendTetra(int node0,
- int node1,
- int node2,
- int node3,
- Material* mat)
+void btSoftBody::appendTetra(int node0,
+ int node1,
+ int node2,
+ int node3,
+ Material* mat)
{
- appendTetra(-1,mat);
- Tetra& t=m_tetras[m_tetras.size()-1];
- t.m_n[0] = &m_nodes[node0];
- t.m_n[1] = &m_nodes[node1];
- t.m_n[2] = &m_nodes[node2];
- t.m_n[3] = &m_nodes[node3];
- t.m_rv = VolumeOf(t.m_n[0]->m_x,t.m_n[1]->m_x,t.m_n[2]->m_x,t.m_n[3]->m_x);
- m_bUpdateRtCst=true;
+ appendTetra(-1, mat);
+ Tetra& t = m_tetras[m_tetras.size() - 1];
+ t.m_n[0] = &m_nodes[node0];
+ t.m_n[1] = &m_nodes[node1];
+ t.m_n[2] = &m_nodes[node2];
+ t.m_n[3] = &m_nodes[node3];
+ t.m_rv = VolumeOf(t.m_n[0]->m_x, t.m_n[1]->m_x, t.m_n[2]->m_x, t.m_n[3]->m_x);
+ m_bUpdateRtCst = true;
}
//
-void btSoftBody::appendAnchor(int node,btRigidBody* body, bool disableCollisionBetweenLinkedBodies,btScalar influence)
+void btSoftBody::appendAnchor(int node, btRigidBody* body, bool disableCollisionBetweenLinkedBodies, btScalar influence)
{
- btVector3 local = body->getWorldTransform().inverse()*m_nodes[node].m_x;
- appendAnchor(node,body,local,disableCollisionBetweenLinkedBodies,influence);
+ btVector3 local = body->getWorldTransform().inverse() * m_nodes[node].m_x;
+ appendAnchor(node, body, local, disableCollisionBetweenLinkedBodies, influence);
}
//
-void btSoftBody::appendAnchor(int node,btRigidBody* body, const btVector3& localPivot,bool disableCollisionBetweenLinkedBodies,btScalar influence)
+void btSoftBody::appendAnchor(int node, btRigidBody* body, const btVector3& localPivot, bool disableCollisionBetweenLinkedBodies, btScalar influence)
{
if (disableCollisionBetweenLinkedBodies)
{
- if (m_collisionDisabledObjects.findLinearSearch(body)==m_collisionDisabledObjects.size())
+ if (m_collisionDisabledObjects.findLinearSearch(body) == m_collisionDisabledObjects.size())
{
m_collisionDisabledObjects.push_back(body);
}
}
- Anchor a;
- a.m_node = &m_nodes[node];
- a.m_body = body;
- a.m_local = localPivot;
- a.m_node->m_battach = 1;
+ Anchor a;
+ a.m_node = &m_nodes[node];
+ a.m_body = body;
+ a.m_local = localPivot;
+ a.m_node->m_battach = 1;
a.m_influence = influence;
m_anchors.push_back(a);
}
//
-void btSoftBody::appendLinearJoint(const LJoint::Specs& specs,Cluster* body0,Body body1)
+void btSoftBody::appendLinearJoint(const LJoint::Specs& specs, Cluster* body0, Body body1)
{
- LJoint* pj = new(btAlignedAlloc(sizeof(LJoint),16)) LJoint();
- pj->m_bodies[0] = body0;
- pj->m_bodies[1] = body1;
- pj->m_refs[0] = pj->m_bodies[0].xform().inverse()*specs.position;
- pj->m_refs[1] = pj->m_bodies[1].xform().inverse()*specs.position;
- pj->m_cfm = specs.cfm;
- pj->m_erp = specs.erp;
- pj->m_split = specs.split;
+ LJoint* pj = new (btAlignedAlloc(sizeof(LJoint), 16)) LJoint();
+ pj->m_bodies[0] = body0;
+ pj->m_bodies[1] = body1;
+ pj->m_refs[0] = pj->m_bodies[0].xform().inverse() * specs.position;
+ pj->m_refs[1] = pj->m_bodies[1].xform().inverse() * specs.position;
+ pj->m_cfm = specs.cfm;
+ pj->m_erp = specs.erp;
+ pj->m_split = specs.split;
m_joints.push_back(pj);
}
//
-void btSoftBody::appendLinearJoint(const LJoint::Specs& specs,Body body)
+void btSoftBody::appendLinearJoint(const LJoint::Specs& specs, Body body)
{
- appendLinearJoint(specs,m_clusters[0],body);
+ appendLinearJoint(specs, m_clusters[0], body);
}
//
-void btSoftBody::appendLinearJoint(const LJoint::Specs& specs,btSoftBody* body)
+void btSoftBody::appendLinearJoint(const LJoint::Specs& specs, btSoftBody* body)
{
- appendLinearJoint(specs,m_clusters[0],body->m_clusters[0]);
+ appendLinearJoint(specs, m_clusters[0], body->m_clusters[0]);
}
//
-void btSoftBody::appendAngularJoint(const AJoint::Specs& specs,Cluster* body0,Body body1)
+void btSoftBody::appendAngularJoint(const AJoint::Specs& specs, Cluster* body0, Body body1)
{
- AJoint* pj = new(btAlignedAlloc(sizeof(AJoint),16)) AJoint();
- pj->m_bodies[0] = body0;
- pj->m_bodies[1] = body1;
- pj->m_refs[0] = pj->m_bodies[0].xform().inverse().getBasis()*specs.axis;
- pj->m_refs[1] = pj->m_bodies[1].xform().inverse().getBasis()*specs.axis;
- pj->m_cfm = specs.cfm;
- pj->m_erp = specs.erp;
- pj->m_split = specs.split;
- pj->m_icontrol = specs.icontrol;
+ AJoint* pj = new (btAlignedAlloc(sizeof(AJoint), 16)) AJoint();
+ pj->m_bodies[0] = body0;
+ pj->m_bodies[1] = body1;
+ pj->m_refs[0] = pj->m_bodies[0].xform().inverse().getBasis() * specs.axis;
+ pj->m_refs[1] = pj->m_bodies[1].xform().inverse().getBasis() * specs.axis;
+ pj->m_cfm = specs.cfm;
+ pj->m_erp = specs.erp;
+ pj->m_split = specs.split;
+ pj->m_icontrol = specs.icontrol;
m_joints.push_back(pj);
}
//
-void btSoftBody::appendAngularJoint(const AJoint::Specs& specs,Body body)
+void btSoftBody::appendAngularJoint(const AJoint::Specs& specs, Body body)
{
- appendAngularJoint(specs,m_clusters[0],body);
+ appendAngularJoint(specs, m_clusters[0], body);
}
//
-void btSoftBody::appendAngularJoint(const AJoint::Specs& specs,btSoftBody* body)
+void btSoftBody::appendAngularJoint(const AJoint::Specs& specs, btSoftBody* body)
{
- appendAngularJoint(specs,m_clusters[0],body->m_clusters[0]);
+ appendAngularJoint(specs, m_clusters[0], body->m_clusters[0]);
}
//
-void btSoftBody::addForce(const btVector3& force)
+void btSoftBody::addForce(const btVector3& force)
{
- for(int i=0,ni=m_nodes.size();i<ni;++i) addForce(force,i);
+ for (int i = 0, ni = m_nodes.size(); i < ni; ++i) addForce(force, i);
}
//
-void btSoftBody::addForce(const btVector3& force,int node)
+void btSoftBody::addForce(const btVector3& force, int node)
{
- Node& n=m_nodes[node];
- if(n.m_im>0)
+ Node& n = m_nodes[node];
+ if (n.m_im > 0)
{
- n.m_f += force;
+ n.m_f += force;
}
}
-void btSoftBody::addAeroForceToNode(const btVector3& windVelocity,int nodeIndex)
+void btSoftBody::addAeroForceToNode(const btVector3& windVelocity, int nodeIndex)
{
btAssert(nodeIndex >= 0 && nodeIndex < m_nodes.size());
@@ -464,51 +479,51 @@ void btSoftBody::addAeroForceToNode(const btVector3& windVelocity,int nodeInde
const btScalar kDG = m_cfg.kDG;
//const btScalar kPR = m_cfg.kPR;
//const btScalar kVC = m_cfg.kVC;
- const bool as_lift = kLF>0;
- const bool as_drag = kDG>0;
+ const bool as_lift = kLF > 0;
+ const bool as_drag = kDG > 0;
const bool as_aero = as_lift || as_drag;
const bool as_vaero = as_aero && (m_cfg.aeromodel < btSoftBody::eAeroModel::F_TwoSided);
Node& n = m_nodes[nodeIndex];
- if( n.m_im>0 )
+ if (n.m_im > 0)
{
- btSoftBody::sMedium medium;
+ btSoftBody::sMedium medium;
EvaluateMedium(m_worldInfo, n.m_x, medium);
medium.m_velocity = windVelocity;
medium.m_density = m_worldInfo->air_density;
- /* Aerodynamics */
- if(as_vaero)
- {
- const btVector3 rel_v = n.m_v - medium.m_velocity;
+ /* Aerodynamics */
+ if (as_vaero)
+ {
+ const btVector3 rel_v = n.m_v - medium.m_velocity;
const btScalar rel_v_len = rel_v.length();
- const btScalar rel_v2 = rel_v.length2();
+ const btScalar rel_v2 = rel_v.length2();
- if(rel_v2>SIMD_EPSILON)
+ if (rel_v2 > SIMD_EPSILON)
{
const btVector3 rel_v_nrm = rel_v.normalized();
- btVector3 nrm = n.m_n;
+ btVector3 nrm = n.m_n;
if (m_cfg.aeromodel == btSoftBody::eAeroModel::V_TwoSidedLiftDrag)
{
- nrm *= (btScalar)( (btDot(nrm,rel_v) < 0) ? -1 : +1);
+ nrm *= (btScalar)((btDot(nrm, rel_v) < 0) ? -1 : +1);
btVector3 fDrag(0, 0, 0);
btVector3 fLift(0, 0, 0);
btScalar n_dot_v = nrm.dot(rel_v_nrm);
btScalar tri_area = 0.5f * n.m_area;
-
+
fDrag = 0.5f * kDG * medium.m_density * rel_v2 * tri_area * n_dot_v * (-rel_v_nrm);
-
+
// Check angle of attack
// cos(10º) = 0.98480
- if ( 0 < n_dot_v && n_dot_v < 0.98480f)
- fLift = 0.5f * kLF * medium.m_density * rel_v_len * tri_area * btSqrt(1.0f-n_dot_v*n_dot_v) * (nrm.cross(rel_v_nrm).cross(rel_v_nrm));
+ if (0 < n_dot_v && n_dot_v < 0.98480f)
+ fLift = 0.5f * kLF * medium.m_density * rel_v_len * tri_area * btSqrt(1.0f - n_dot_v * n_dot_v) * (nrm.cross(rel_v_nrm).cross(rel_v_nrm));
// Check if the velocity change resulted by aero drag force exceeds the current velocity of the node.
- btVector3 del_v_by_fDrag = fDrag*n.m_im*m_sst.sdt;
+ btVector3 del_v_by_fDrag = fDrag * n.m_im * m_sst.sdt;
btScalar del_v_by_fDrag_len2 = del_v_by_fDrag.length2();
btScalar v_len2 = n.m_v.length2();
@@ -516,7 +531,7 @@ void btSoftBody::addAeroForceToNode(const btVector3& windVelocity,int nodeInde
{
btScalar del_v_by_fDrag_len = del_v_by_fDrag.length();
btScalar v_len = n.m_v.length();
- fDrag *= btScalar(0.8)*(v_len / del_v_by_fDrag_len);
+ fDrag *= btScalar(0.8) * (v_len / del_v_by_fDrag_len);
}
n.m_f += fDrag;
@@ -525,83 +540,83 @@ void btSoftBody::addAeroForceToNode(const btVector3& windVelocity,int nodeInde
else if (m_cfg.aeromodel == btSoftBody::eAeroModel::V_Point || m_cfg.aeromodel == btSoftBody::eAeroModel::V_OneSided || m_cfg.aeromodel == btSoftBody::eAeroModel::V_TwoSided)
{
if (m_cfg.aeromodel == btSoftBody::eAeroModel::V_TwoSided)
- nrm *= (btScalar)( (btDot(nrm,rel_v) < 0) ? -1 : +1);
+ nrm *= (btScalar)((btDot(nrm, rel_v) < 0) ? -1 : +1);
- const btScalar dvn = btDot(rel_v,nrm);
- /* Compute forces */
- if(dvn>0)
+ const btScalar dvn = btDot(rel_v, nrm);
+ /* Compute forces */
+ if (dvn > 0)
{
- btVector3 force(0,0,0);
- const btScalar c0 = n.m_area * dvn * rel_v2/2;
- const btScalar c1 = c0 * medium.m_density;
- force += nrm*(-c1*kLF);
- force += rel_v.normalized() * (-c1 * kDG);
+ btVector3 force(0, 0, 0);
+ const btScalar c0 = n.m_area * dvn * rel_v2 / 2;
+ const btScalar c1 = c0 * medium.m_density;
+ force += nrm * (-c1 * kLF);
+ force += rel_v.normalized() * (-c1 * kDG);
ApplyClampedForce(n, force, dt);
}
- }
+ }
}
}
}
}
-void btSoftBody::addAeroForceToFace(const btVector3& windVelocity,int faceIndex)
+void btSoftBody::addAeroForceToFace(const btVector3& windVelocity, int faceIndex)
{
const btScalar dt = m_sst.sdt;
const btScalar kLF = m_cfg.kLF;
const btScalar kDG = m_cfg.kDG;
-// const btScalar kPR = m_cfg.kPR;
-// const btScalar kVC = m_cfg.kVC;
- const bool as_lift = kLF>0;
- const bool as_drag = kDG>0;
+ // const btScalar kPR = m_cfg.kPR;
+ // const btScalar kVC = m_cfg.kVC;
+ const bool as_lift = kLF > 0;
+ const bool as_drag = kDG > 0;
const bool as_aero = as_lift || as_drag;
const bool as_faero = as_aero && (m_cfg.aeromodel >= btSoftBody::eAeroModel::F_TwoSided);
- if(as_faero)
+ if (as_faero)
{
- btSoftBody::Face& f=m_faces[faceIndex];
+ btSoftBody::Face& f = m_faces[faceIndex];
- btSoftBody::sMedium medium;
-
- const btVector3 v=(f.m_n[0]->m_v+f.m_n[1]->m_v+f.m_n[2]->m_v)/3;
- const btVector3 x=(f.m_n[0]->m_x+f.m_n[1]->m_x+f.m_n[2]->m_x)/3;
- EvaluateMedium(m_worldInfo,x,medium);
+ btSoftBody::sMedium medium;
+
+ const btVector3 v = (f.m_n[0]->m_v + f.m_n[1]->m_v + f.m_n[2]->m_v) / 3;
+ const btVector3 x = (f.m_n[0]->m_x + f.m_n[1]->m_x + f.m_n[2]->m_x) / 3;
+ EvaluateMedium(m_worldInfo, x, medium);
medium.m_velocity = windVelocity;
medium.m_density = m_worldInfo->air_density;
- const btVector3 rel_v=v-medium.m_velocity;
+ const btVector3 rel_v = v - medium.m_velocity;
const btScalar rel_v_len = rel_v.length();
- const btScalar rel_v2=rel_v.length2();
+ const btScalar rel_v2 = rel_v.length2();
- if(rel_v2>SIMD_EPSILON)
+ if (rel_v2 > SIMD_EPSILON)
{
const btVector3 rel_v_nrm = rel_v.normalized();
- btVector3 nrm = f.m_normal;
+ btVector3 nrm = f.m_normal;
if (m_cfg.aeromodel == btSoftBody::eAeroModel::F_TwoSidedLiftDrag)
{
- nrm *= (btScalar)( (btDot(nrm,rel_v) < 0) ? -1 : +1);
+ nrm *= (btScalar)((btDot(nrm, rel_v) < 0) ? -1 : +1);
btVector3 fDrag(0, 0, 0);
btVector3 fLift(0, 0, 0);
btScalar n_dot_v = nrm.dot(rel_v_nrm);
btScalar tri_area = 0.5f * f.m_ra;
-
+
fDrag = 0.5f * kDG * medium.m_density * rel_v2 * tri_area * n_dot_v * (-rel_v_nrm);
// Check angle of attack
// cos(10º) = 0.98480
- if ( 0 < n_dot_v && n_dot_v < 0.98480f)
- fLift = 0.5f * kLF * medium.m_density * rel_v_len * tri_area * btSqrt(1.0f-n_dot_v*n_dot_v) * (nrm.cross(rel_v_nrm).cross(rel_v_nrm));
+ if (0 < n_dot_v && n_dot_v < 0.98480f)
+ fLift = 0.5f * kLF * medium.m_density * rel_v_len * tri_area * btSqrt(1.0f - n_dot_v * n_dot_v) * (nrm.cross(rel_v_nrm).cross(rel_v_nrm));
fDrag /= 3;
fLift /= 3;
- for(int j=0;j<3;++j)
+ for (int j = 0; j < 3; ++j)
{
- if (f.m_n[j]->m_im>0)
+ if (f.m_n[j]->m_im > 0)
{
// Check if the velocity change resulted by aero drag force exceeds the current velocity of the node.
- btVector3 del_v_by_fDrag = fDrag*f.m_n[j]->m_im*m_sst.sdt;
+ btVector3 del_v_by_fDrag = fDrag * f.m_n[j]->m_im * m_sst.sdt;
btScalar del_v_by_fDrag_len2 = del_v_by_fDrag.length2();
btScalar v_len2 = f.m_n[j]->m_v.length2();
@@ -609,10 +624,10 @@ void btSoftBody::addAeroForceToFace(const btVector3& windVelocity,int faceInde
{
btScalar del_v_by_fDrag_len = del_v_by_fDrag.length();
btScalar v_len = f.m_n[j]->m_v.length();
- fDrag *= btScalar(0.8)*(v_len / del_v_by_fDrag_len);
+ fDrag *= btScalar(0.8) * (v_len / del_v_by_fDrag_len);
}
- f.m_n[j]->m_f += fDrag;
+ f.m_n[j]->m_f += fDrag;
f.m_n[j]->m_f += fLift;
}
}
@@ -620,183 +635,181 @@ void btSoftBody::addAeroForceToFace(const btVector3& windVelocity,int faceInde
else if (m_cfg.aeromodel == btSoftBody::eAeroModel::F_OneSided || m_cfg.aeromodel == btSoftBody::eAeroModel::F_TwoSided)
{
if (m_cfg.aeromodel == btSoftBody::eAeroModel::F_TwoSided)
- nrm *= (btScalar)( (btDot(nrm,rel_v) < 0) ? -1 : +1);
+ nrm *= (btScalar)((btDot(nrm, rel_v) < 0) ? -1 : +1);
- const btScalar dvn=btDot(rel_v,nrm);
- /* Compute forces */
- if(dvn>0)
+ const btScalar dvn = btDot(rel_v, nrm);
+ /* Compute forces */
+ if (dvn > 0)
{
- btVector3 force(0,0,0);
- const btScalar c0 = f.m_ra*dvn*rel_v2;
- const btScalar c1 = c0*medium.m_density;
- force += nrm*(-c1*kLF);
- force += rel_v.normalized()*(-c1*kDG);
- force /= 3;
- for(int j=0;j<3;++j) ApplyClampedForce(*f.m_n[j],force,dt);
+ btVector3 force(0, 0, 0);
+ const btScalar c0 = f.m_ra * dvn * rel_v2;
+ const btScalar c1 = c0 * medium.m_density;
+ force += nrm * (-c1 * kLF);
+ force += rel_v.normalized() * (-c1 * kDG);
+ force /= 3;
+ for (int j = 0; j < 3; ++j) ApplyClampedForce(*f.m_n[j], force, dt);
}
}
}
}
-
}
//
-void btSoftBody::addVelocity(const btVector3& velocity)
+void btSoftBody::addVelocity(const btVector3& velocity)
{
- for(int i=0,ni=m_nodes.size();i<ni;++i) addVelocity(velocity,i);
+ for (int i = 0, ni = m_nodes.size(); i < ni; ++i) addVelocity(velocity, i);
}
-/* Set velocity for the entire body */
-void btSoftBody::setVelocity( const btVector3& velocity)
+/* Set velocity for the entire body */
+void btSoftBody::setVelocity(const btVector3& velocity)
{
- for(int i=0,ni=m_nodes.size();i<ni;++i)
+ for (int i = 0, ni = m_nodes.size(); i < ni; ++i)
{
- Node& n=m_nodes[i];
- if(n.m_im>0)
+ Node& n = m_nodes[i];
+ if (n.m_im > 0)
{
- n.m_v = velocity;
+ n.m_v = velocity;
}
}
}
-
//
-void btSoftBody::addVelocity(const btVector3& velocity,int node)
+void btSoftBody::addVelocity(const btVector3& velocity, int node)
{
- Node& n=m_nodes[node];
- if(n.m_im>0)
+ Node& n = m_nodes[node];
+ if (n.m_im > 0)
{
- n.m_v += velocity;
+ n.m_v += velocity;
}
}
//
-void btSoftBody::setMass(int node,btScalar mass)
+void btSoftBody::setMass(int node, btScalar mass)
{
- m_nodes[node].m_im=mass>0?1/mass:0;
- m_bUpdateRtCst=true;
+ m_nodes[node].m_im = mass > 0 ? 1 / mass : 0;
+ m_bUpdateRtCst = true;
}
//
-btScalar btSoftBody::getMass(int node) const
+btScalar btSoftBody::getMass(int node) const
{
- return(m_nodes[node].m_im>0?1/m_nodes[node].m_im:0);
+ return (m_nodes[node].m_im > 0 ? 1 / m_nodes[node].m_im : 0);
}
//
-btScalar btSoftBody::getTotalMass() const
+btScalar btSoftBody::getTotalMass() const
{
- btScalar mass=0;
- for(int i=0;i<m_nodes.size();++i)
+ btScalar mass = 0;
+ for (int i = 0; i < m_nodes.size(); ++i)
{
- mass+=getMass(i);
+ mass += getMass(i);
}
- return(mass);
+ return (mass);
}
//
-void btSoftBody::setTotalMass(btScalar mass,bool fromfaces)
+void btSoftBody::setTotalMass(btScalar mass, bool fromfaces)
{
int i;
- if(fromfaces)
+ if (fromfaces)
{
-
- for(i=0;i<m_nodes.size();++i)
+ for (i = 0; i < m_nodes.size(); ++i)
{
- m_nodes[i].m_im=0;
+ m_nodes[i].m_im = 0;
}
- for(i=0;i<m_faces.size();++i)
+ for (i = 0; i < m_faces.size(); ++i)
{
- const Face& f=m_faces[i];
- const btScalar twicearea=AreaOf( f.m_n[0]->m_x,
- f.m_n[1]->m_x,
- f.m_n[2]->m_x);
- for(int j=0;j<3;++j)
+ const Face& f = m_faces[i];
+ const btScalar twicearea = AreaOf(f.m_n[0]->m_x,
+ f.m_n[1]->m_x,
+ f.m_n[2]->m_x);
+ for (int j = 0; j < 3; ++j)
{
- f.m_n[j]->m_im+=twicearea;
+ f.m_n[j]->m_im += twicearea;
}
}
- for( i=0;i<m_nodes.size();++i)
+ for (i = 0; i < m_nodes.size(); ++i)
{
- m_nodes[i].m_im=1/m_nodes[i].m_im;
+ m_nodes[i].m_im = 1 / m_nodes[i].m_im;
}
}
- const btScalar tm=getTotalMass();
- const btScalar itm=1/tm;
- for( i=0;i<m_nodes.size();++i)
+ const btScalar tm = getTotalMass();
+ const btScalar itm = 1 / tm;
+ for (i = 0; i < m_nodes.size(); ++i)
{
- m_nodes[i].m_im/=itm*mass;
+ m_nodes[i].m_im /= itm * mass;
}
- m_bUpdateRtCst=true;
+ m_bUpdateRtCst = true;
}
//
-void btSoftBody::setTotalDensity(btScalar density)
+void btSoftBody::setTotalDensity(btScalar density)
{
- setTotalMass(getVolume()*density,true);
+ setTotalMass(getVolume() * density, true);
}
//
-void btSoftBody::setVolumeMass(btScalar mass)
+void btSoftBody::setVolumeMass(btScalar mass)
{
-btAlignedObjectArray<btScalar> ranks;
-ranks.resize(m_nodes.size(),0);
-int i;
+ btAlignedObjectArray<btScalar> ranks;
+ ranks.resize(m_nodes.size(), 0);
+ int i;
-for(i=0;i<m_nodes.size();++i)
+ for (i = 0; i < m_nodes.size(); ++i)
{
- m_nodes[i].m_im=0;
+ m_nodes[i].m_im = 0;
}
-for(i=0;i<m_tetras.size();++i)
+ for (i = 0; i < m_tetras.size(); ++i)
{
- const Tetra& t=m_tetras[i];
- for(int j=0;j<4;++j)
+ const Tetra& t = m_tetras[i];
+ for (int j = 0; j < 4; ++j)
{
- t.m_n[j]->m_im+=btFabs(t.m_rv);
- ranks[int(t.m_n[j]-&m_nodes[0])]+=1;
+ t.m_n[j]->m_im += btFabs(t.m_rv);
+ ranks[int(t.m_n[j] - &m_nodes[0])] += 1;
}
}
-for( i=0;i<m_nodes.size();++i)
+ for (i = 0; i < m_nodes.size(); ++i)
{
- if(m_nodes[i].m_im>0)
+ if (m_nodes[i].m_im > 0)
{
- m_nodes[i].m_im=ranks[i]/m_nodes[i].m_im;
+ m_nodes[i].m_im = ranks[i] / m_nodes[i].m_im;
}
}
-setTotalMass(mass,false);
+ setTotalMass(mass, false);
}
//
-void btSoftBody::setVolumeDensity(btScalar density)
+void btSoftBody::setVolumeDensity(btScalar density)
{
-btScalar volume=0;
-for(int i=0;i<m_tetras.size();++i)
+ btScalar volume = 0;
+ for (int i = 0; i < m_tetras.size(); ++i)
{
- const Tetra& t=m_tetras[i];
- for(int j=0;j<4;++j)
+ const Tetra& t = m_tetras[i];
+ for (int j = 0; j < 4; ++j)
{
- volume+=btFabs(t.m_rv);
+ volume += btFabs(t.m_rv);
}
}
-setVolumeMass(volume*density/6);
+ setVolumeMass(volume * density / 6);
}
//
-void btSoftBody::transform(const btTransform& trs)
+void btSoftBody::transform(const btTransform& trs)
{
- const btScalar margin=getCollisionShape()->getMargin();
- ATTRIBUTE_ALIGNED16(btDbvtVolume) vol;
-
- for(int i=0,ni=m_nodes.size();i<ni;++i)
+ const btScalar margin = getCollisionShape()->getMargin();
+ ATTRIBUTE_ALIGNED16(btDbvtVolume)
+ vol;
+
+ for (int i = 0, ni = m_nodes.size(); i < ni; ++i)
{
- Node& n=m_nodes[i];
- n.m_x=trs*n.m_x;
- n.m_q=trs*n.m_q;
- n.m_n=trs.getBasis()*n.m_n;
- vol = btDbvtVolume::FromCR(n.m_x,margin);
-
- m_ndbvt.update(n.m_leaf,vol);
+ Node& n = m_nodes[i];
+ n.m_x = trs * n.m_x;
+ n.m_q = trs * n.m_q;
+ n.m_n = trs.getBasis() * n.m_n;
+ vol = btDbvtVolume::FromCR(n.m_x, margin);
+
+ m_ndbvt.update(n.m_leaf, vol);
}
updateNormals();
updateBounds();
@@ -805,37 +818,37 @@ void btSoftBody::transform(const btTransform& trs)
}
//
-void btSoftBody::translate(const btVector3& trs)
+void btSoftBody::translate(const btVector3& trs)
{
- btTransform t;
+ btTransform t;
t.setIdentity();
t.setOrigin(trs);
transform(t);
}
//
-void btSoftBody::rotate( const btQuaternion& rot)
+void btSoftBody::rotate(const btQuaternion& rot)
{
- btTransform t;
+ btTransform t;
t.setIdentity();
t.setRotation(rot);
transform(t);
}
//
-void btSoftBody::scale(const btVector3& scl)
+void btSoftBody::scale(const btVector3& scl)
{
+ const btScalar margin = getCollisionShape()->getMargin();
+ ATTRIBUTE_ALIGNED16(btDbvtVolume)
+ vol;
- const btScalar margin=getCollisionShape()->getMargin();
- ATTRIBUTE_ALIGNED16(btDbvtVolume) vol;
-
- for(int i=0,ni=m_nodes.size();i<ni;++i)
+ for (int i = 0, ni = m_nodes.size(); i < ni; ++i)
{
- Node& n=m_nodes[i];
- n.m_x*=scl;
- n.m_q*=scl;
- vol = btDbvtVolume::FromCR(n.m_x,margin);
- m_ndbvt.update(n.m_leaf,vol);
+ Node& n = m_nodes[i];
+ n.m_x *= scl;
+ n.m_q *= scl;
+ vol = btDbvtVolume::FromCR(n.m_x, margin);
+ m_ndbvt.update(n.m_leaf, vol);
}
updateNormals();
updateBounds();
@@ -851,437 +864,432 @@ btScalar btSoftBody::getRestLengthScale()
//
void btSoftBody::setRestLengthScale(btScalar restLengthScale)
{
- for(int i=0, ni=m_links.size(); i<ni; ++i)
+ for (int i = 0, ni = m_links.size(); i < ni; ++i)
{
- Link& l=m_links[i];
- l.m_rl = l.m_rl / m_restLengthScale * restLengthScale;
- l.m_c1 = l.m_rl*l.m_rl;
+ Link& l = m_links[i];
+ l.m_rl = l.m_rl / m_restLengthScale * restLengthScale;
+ l.m_c1 = l.m_rl * l.m_rl;
}
m_restLengthScale = restLengthScale;
-
+
if (getActivationState() == ISLAND_SLEEPING)
activate();
}
//
-void btSoftBody::setPose(bool bvolume,bool bframe)
+void btSoftBody::setPose(bool bvolume, bool bframe)
{
- m_pose.m_bvolume = bvolume;
- m_pose.m_bframe = bframe;
- int i,ni;
+ m_pose.m_bvolume = bvolume;
+ m_pose.m_bframe = bframe;
+ int i, ni;
- /* Weights */
- const btScalar omass=getTotalMass();
- const btScalar kmass=omass*m_nodes.size()*1000;
- btScalar tmass=omass;
+ /* Weights */
+ const btScalar omass = getTotalMass();
+ const btScalar kmass = omass * m_nodes.size() * 1000;
+ btScalar tmass = omass;
m_pose.m_wgh.resize(m_nodes.size());
- for(i=0,ni=m_nodes.size();i<ni;++i)
+ for (i = 0, ni = m_nodes.size(); i < ni; ++i)
{
- if(m_nodes[i].m_im<=0) tmass+=kmass;
+ if (m_nodes[i].m_im <= 0) tmass += kmass;
}
- for( i=0,ni=m_nodes.size();i<ni;++i)
+ for (i = 0, ni = m_nodes.size(); i < ni; ++i)
{
- Node& n=m_nodes[i];
- m_pose.m_wgh[i]= n.m_im>0 ?
- 1/(m_nodes[i].m_im*tmass) :
- kmass/tmass;
+ Node& n = m_nodes[i];
+ m_pose.m_wgh[i] = n.m_im > 0 ? 1 / (m_nodes[i].m_im * tmass) : kmass / tmass;
}
- /* Pos */
- const btVector3 com=evaluateCom();
+ /* Pos */
+ const btVector3 com = evaluateCom();
m_pose.m_pos.resize(m_nodes.size());
- for( i=0,ni=m_nodes.size();i<ni;++i)
+ for (i = 0, ni = m_nodes.size(); i < ni; ++i)
{
- m_pose.m_pos[i]=m_nodes[i].m_x-com;
+ m_pose.m_pos[i] = m_nodes[i].m_x - com;
}
- m_pose.m_volume = bvolume?getVolume():0;
- m_pose.m_com = com;
+ m_pose.m_volume = bvolume ? getVolume() : 0;
+ m_pose.m_com = com;
m_pose.m_rot.setIdentity();
m_pose.m_scl.setIdentity();
- /* Aqq */
- m_pose.m_aqq[0] =
- m_pose.m_aqq[1] =
- m_pose.m_aqq[2] = btVector3(0,0,0);
- for( i=0,ni=m_nodes.size();i<ni;++i)
- {
- const btVector3& q=m_pose.m_pos[i];
- const btVector3 mq=m_pose.m_wgh[i]*q;
- m_pose.m_aqq[0]+=mq.x()*q;
- m_pose.m_aqq[1]+=mq.y()*q;
- m_pose.m_aqq[2]+=mq.z()*q;
- }
- m_pose.m_aqq=m_pose.m_aqq.inverse();
-
+ /* Aqq */
+ m_pose.m_aqq[0] =
+ m_pose.m_aqq[1] =
+ m_pose.m_aqq[2] = btVector3(0, 0, 0);
+ for (i = 0, ni = m_nodes.size(); i < ni; ++i)
+ {
+ const btVector3& q = m_pose.m_pos[i];
+ const btVector3 mq = m_pose.m_wgh[i] * q;
+ m_pose.m_aqq[0] += mq.x() * q;
+ m_pose.m_aqq[1] += mq.y() * q;
+ m_pose.m_aqq[2] += mq.z() * q;
+ }
+ m_pose.m_aqq = m_pose.m_aqq.inverse();
+
updateConstants();
}
-void btSoftBody::resetLinkRestLengths()
+void btSoftBody::resetLinkRestLengths()
{
- for(int i=0, ni=m_links.size();i<ni;++i)
+ for (int i = 0, ni = m_links.size(); i < ni; ++i)
{
- Link& l = m_links[i];
- l.m_rl = (l.m_n[0]->m_x-l.m_n[1]->m_x).length();
- l.m_c1 = l.m_rl*l.m_rl;
+ Link& l = m_links[i];
+ l.m_rl = (l.m_n[0]->m_x - l.m_n[1]->m_x).length();
+ l.m_c1 = l.m_rl * l.m_rl;
}
}
//
-btScalar btSoftBody::getVolume() const
+btScalar btSoftBody::getVolume() const
{
- btScalar vol=0;
- if(m_nodes.size()>0)
+ btScalar vol = 0;
+ if (m_nodes.size() > 0)
{
- int i,ni;
+ int i, ni;
- const btVector3 org=m_nodes[0].m_x;
- for(i=0,ni=m_faces.size();i<ni;++i)
+ const btVector3 org = m_nodes[0].m_x;
+ for (i = 0, ni = m_faces.size(); i < ni; ++i)
{
- const Face& f=m_faces[i];
- vol+=btDot(f.m_n[0]->m_x-org,btCross(f.m_n[1]->m_x-org,f.m_n[2]->m_x-org));
+ const Face& f = m_faces[i];
+ vol += btDot(f.m_n[0]->m_x - org, btCross(f.m_n[1]->m_x - org, f.m_n[2]->m_x - org));
}
- vol/=(btScalar)6;
+ vol /= (btScalar)6;
}
- return(vol);
+ return (vol);
}
//
-int btSoftBody::clusterCount() const
+int btSoftBody::clusterCount() const
{
- return(m_clusters.size());
+ return (m_clusters.size());
}
//
-btVector3 btSoftBody::clusterCom(const Cluster* cluster)
+btVector3 btSoftBody::clusterCom(const Cluster* cluster)
{
- btVector3 com(0,0,0);
- for(int i=0,ni=cluster->m_nodes.size();i<ni;++i)
+ btVector3 com(0, 0, 0);
+ for (int i = 0, ni = cluster->m_nodes.size(); i < ni; ++i)
{
- com+=cluster->m_nodes[i]->m_x*cluster->m_masses[i];
+ com += cluster->m_nodes[i]->m_x * cluster->m_masses[i];
}
- return(com*cluster->m_imass);
+ return (com * cluster->m_imass);
}
//
-btVector3 btSoftBody::clusterCom(int cluster) const
+btVector3 btSoftBody::clusterCom(int cluster) const
{
- return(clusterCom(m_clusters[cluster]));
+ return (clusterCom(m_clusters[cluster]));
}
//
-btVector3 btSoftBody::clusterVelocity(const Cluster* cluster,const btVector3& rpos)
+btVector3 btSoftBody::clusterVelocity(const Cluster* cluster, const btVector3& rpos)
{
- return(cluster->m_lv+btCross(cluster->m_av,rpos));
+ return (cluster->m_lv + btCross(cluster->m_av, rpos));
}
//
-void btSoftBody::clusterVImpulse(Cluster* cluster,const btVector3& rpos,const btVector3& impulse)
+void btSoftBody::clusterVImpulse(Cluster* cluster, const btVector3& rpos, const btVector3& impulse)
{
- const btVector3 li=cluster->m_imass*impulse;
- const btVector3 ai=cluster->m_invwi*btCross(rpos,impulse);
- cluster->m_vimpulses[0]+=li;cluster->m_lv+=li;
- cluster->m_vimpulses[1]+=ai;cluster->m_av+=ai;
+ const btVector3 li = cluster->m_imass * impulse;
+ const btVector3 ai = cluster->m_invwi * btCross(rpos, impulse);
+ cluster->m_vimpulses[0] += li;
+ cluster->m_lv += li;
+ cluster->m_vimpulses[1] += ai;
+ cluster->m_av += ai;
cluster->m_nvimpulses++;
}
//
-void btSoftBody::clusterDImpulse(Cluster* cluster,const btVector3& rpos,const btVector3& impulse)
+void btSoftBody::clusterDImpulse(Cluster* cluster, const btVector3& rpos, const btVector3& impulse)
{
- const btVector3 li=cluster->m_imass*impulse;
- const btVector3 ai=cluster->m_invwi*btCross(rpos,impulse);
- cluster->m_dimpulses[0]+=li;
- cluster->m_dimpulses[1]+=ai;
+ const btVector3 li = cluster->m_imass * impulse;
+ const btVector3 ai = cluster->m_invwi * btCross(rpos, impulse);
+ cluster->m_dimpulses[0] += li;
+ cluster->m_dimpulses[1] += ai;
cluster->m_ndimpulses++;
}
//
-void btSoftBody::clusterImpulse(Cluster* cluster,const btVector3& rpos,const Impulse& impulse)
+void btSoftBody::clusterImpulse(Cluster* cluster, const btVector3& rpos, const Impulse& impulse)
{
- if(impulse.m_asVelocity) clusterVImpulse(cluster,rpos,impulse.m_velocity);
- if(impulse.m_asDrift) clusterDImpulse(cluster,rpos,impulse.m_drift);
+ if (impulse.m_asVelocity) clusterVImpulse(cluster, rpos, impulse.m_velocity);
+ if (impulse.m_asDrift) clusterDImpulse(cluster, rpos, impulse.m_drift);
}
//
-void btSoftBody::clusterVAImpulse(Cluster* cluster,const btVector3& impulse)
+void btSoftBody::clusterVAImpulse(Cluster* cluster, const btVector3& impulse)
{
- const btVector3 ai=cluster->m_invwi*impulse;
- cluster->m_vimpulses[1]+=ai;cluster->m_av+=ai;
+ const btVector3 ai = cluster->m_invwi * impulse;
+ cluster->m_vimpulses[1] += ai;
+ cluster->m_av += ai;
cluster->m_nvimpulses++;
}
//
-void btSoftBody::clusterDAImpulse(Cluster* cluster,const btVector3& impulse)
+void btSoftBody::clusterDAImpulse(Cluster* cluster, const btVector3& impulse)
{
- const btVector3 ai=cluster->m_invwi*impulse;
- cluster->m_dimpulses[1]+=ai;
+ const btVector3 ai = cluster->m_invwi * impulse;
+ cluster->m_dimpulses[1] += ai;
cluster->m_ndimpulses++;
}
//
-void btSoftBody::clusterAImpulse(Cluster* cluster,const Impulse& impulse)
+void btSoftBody::clusterAImpulse(Cluster* cluster, const Impulse& impulse)
{
- if(impulse.m_asVelocity) clusterVAImpulse(cluster,impulse.m_velocity);
- if(impulse.m_asDrift) clusterDAImpulse(cluster,impulse.m_drift);
+ if (impulse.m_asVelocity) clusterVAImpulse(cluster, impulse.m_velocity);
+ if (impulse.m_asDrift) clusterDAImpulse(cluster, impulse.m_drift);
}
//
-void btSoftBody::clusterDCImpulse(Cluster* cluster,const btVector3& impulse)
+void btSoftBody::clusterDCImpulse(Cluster* cluster, const btVector3& impulse)
{
- cluster->m_dimpulses[0]+=impulse*cluster->m_imass;
+ cluster->m_dimpulses[0] += impulse * cluster->m_imass;
cluster->m_ndimpulses++;
}
struct NodeLinks
{
- btAlignedObjectArray<int> m_links;
+ btAlignedObjectArray<int> m_links;
};
-
-
//
-int btSoftBody::generateBendingConstraints(int distance,Material* mat)
+int btSoftBody::generateBendingConstraints(int distance, Material* mat)
{
- int i,j;
+ int i, j;
- if(distance>1)
+ if (distance > 1)
{
- /* Build graph */
- const int n=m_nodes.size();
- const unsigned inf=(~(unsigned)0)>>1;
- unsigned* adj=new unsigned[n*n];
-
+ /* Build graph */
+ const int n = m_nodes.size();
+ const unsigned inf = (~(unsigned)0) >> 1;
+ unsigned* adj = new unsigned[n * n];
-#define IDX(_x_,_y_) ((_y_)*n+(_x_))
- for(j=0;j<n;++j)
+#define IDX(_x_, _y_) ((_y_)*n + (_x_))
+ for (j = 0; j < n; ++j)
{
- for(i=0;i<n;++i)
+ for (i = 0; i < n; ++i)
{
- if(i!=j)
+ if (i != j)
{
- adj[IDX(i,j)]=adj[IDX(j,i)]=inf;
+ adj[IDX(i, j)] = adj[IDX(j, i)] = inf;
}
else
{
- adj[IDX(i,j)]=adj[IDX(j,i)]=0;
+ adj[IDX(i, j)] = adj[IDX(j, i)] = 0;
}
}
}
- for( i=0;i<m_links.size();++i)
+ for (i = 0; i < m_links.size(); ++i)
{
- const int ia=(int)(m_links[i].m_n[0]-&m_nodes[0]);
- const int ib=(int)(m_links[i].m_n[1]-&m_nodes[0]);
- adj[IDX(ia,ib)]=1;
- adj[IDX(ib,ia)]=1;
+ const int ia = (int)(m_links[i].m_n[0] - &m_nodes[0]);
+ const int ib = (int)(m_links[i].m_n[1] - &m_nodes[0]);
+ adj[IDX(ia, ib)] = 1;
+ adj[IDX(ib, ia)] = 1;
}
-
//special optimized case for distance == 2
if (distance == 2)
{
-
btAlignedObjectArray<NodeLinks> nodeLinks;
-
/* Build node links */
nodeLinks.resize(m_nodes.size());
- for( i=0;i<m_links.size();++i)
+ for (i = 0; i < m_links.size(); ++i)
{
- const int ia=(int)(m_links[i].m_n[0]-&m_nodes[0]);
- const int ib=(int)(m_links[i].m_n[1]-&m_nodes[0]);
- if (nodeLinks[ia].m_links.findLinearSearch(ib)==nodeLinks[ia].m_links.size())
+ const int ia = (int)(m_links[i].m_n[0] - &m_nodes[0]);
+ const int ib = (int)(m_links[i].m_n[1] - &m_nodes[0]);
+ if (nodeLinks[ia].m_links.findLinearSearch(ib) == nodeLinks[ia].m_links.size())
nodeLinks[ia].m_links.push_back(ib);
- if (nodeLinks[ib].m_links.findLinearSearch(ia)==nodeLinks[ib].m_links.size())
+ if (nodeLinks[ib].m_links.findLinearSearch(ia) == nodeLinks[ib].m_links.size())
nodeLinks[ib].m_links.push_back(ia);
}
- for (int ii=0;ii<nodeLinks.size();ii++)
+ for (int ii = 0; ii < nodeLinks.size(); ii++)
{
- int i=ii;
+ int i = ii;
- for (int jj=0;jj<nodeLinks[ii].m_links.size();jj++)
+ for (int jj = 0; jj < nodeLinks[ii].m_links.size(); jj++)
{
int k = nodeLinks[ii].m_links[jj];
- for (int kk=0;kk<nodeLinks[k].m_links.size();kk++)
+ for (int kk = 0; kk < nodeLinks[k].m_links.size(); kk++)
{
int j = nodeLinks[k].m_links[kk];
- if (i!=j)
+ if (i != j)
{
- const unsigned sum=adj[IDX(i,k)]+adj[IDX(k,j)];
- btAssert(sum==2);
- if(adj[IDX(i,j)]>sum)
+ const unsigned sum = adj[IDX(i, k)] + adj[IDX(k, j)];
+ btAssert(sum == 2);
+ if (adj[IDX(i, j)] > sum)
{
- adj[IDX(i,j)]=adj[IDX(j,i)]=sum;
+ adj[IDX(i, j)] = adj[IDX(j, i)] = sum;
}
}
-
}
}
}
- } else
+ }
+ else
{
///generic Floyd's algorithm
- for(int k=0;k<n;++k)
+ for (int k = 0; k < n; ++k)
{
- for(j=0;j<n;++j)
+ for (j = 0; j < n; ++j)
{
- for(i=j+1;i<n;++i)
+ for (i = j + 1; i < n; ++i)
{
- const unsigned sum=adj[IDX(i,k)]+adj[IDX(k,j)];
- if(adj[IDX(i,j)]>sum)
+ const unsigned sum = adj[IDX(i, k)] + adj[IDX(k, j)];
+ if (adj[IDX(i, j)] > sum)
{
- adj[IDX(i,j)]=adj[IDX(j,i)]=sum;
+ adj[IDX(i, j)] = adj[IDX(j, i)] = sum;
}
}
}
}
}
-
- /* Build links */
- int nlinks=0;
- for(j=0;j<n;++j)
+ /* Build links */
+ int nlinks = 0;
+ for (j = 0; j < n; ++j)
{
- for(i=j+1;i<n;++i)
+ for (i = j + 1; i < n; ++i)
{
- if(adj[IDX(i,j)]==(unsigned)distance)
+ if (adj[IDX(i, j)] == (unsigned)distance)
{
- appendLink(i,j,mat);
- m_links[m_links.size()-1].m_bbending=1;
+ appendLink(i, j, mat);
+ m_links[m_links.size() - 1].m_bbending = 1;
++nlinks;
}
}
}
- delete[] adj;
- return(nlinks);
+ delete[] adj;
+ return (nlinks);
}
- return(0);
+ return (0);
}
//
-void btSoftBody::randomizeConstraints()
+void btSoftBody::randomizeConstraints()
{
- unsigned long seed=243703;
-#define NEXTRAND (seed=(1664525L*seed+1013904223L)&0xffffffff)
- int i,ni;
+ unsigned long seed = 243703;
+#define NEXTRAND (seed = (1664525L * seed + 1013904223L) & 0xffffffff)
+ int i, ni;
- for(i=0,ni=m_links.size();i<ni;++i)
+ for (i = 0, ni = m_links.size(); i < ni; ++i)
{
- btSwap(m_links[i],m_links[NEXTRAND%ni]);
+ btSwap(m_links[i], m_links[NEXTRAND % ni]);
}
- for(i=0,ni=m_faces.size();i<ni;++i)
+ for (i = 0, ni = m_faces.size(); i < ni; ++i)
{
- btSwap(m_faces[i],m_faces[NEXTRAND%ni]);
+ btSwap(m_faces[i], m_faces[NEXTRAND % ni]);
}
#undef NEXTRAND
}
//
-void btSoftBody::releaseCluster(int index)
+void btSoftBody::releaseCluster(int index)
{
- Cluster* c=m_clusters[index];
- if(c->m_leaf) m_cdbvt.remove(c->m_leaf);
+ Cluster* c = m_clusters[index];
+ if (c->m_leaf) m_cdbvt.remove(c->m_leaf);
c->~Cluster();
btAlignedFree(c);
m_clusters.remove(c);
}
//
-void btSoftBody::releaseClusters()
+void btSoftBody::releaseClusters()
{
- while(m_clusters.size()>0) releaseCluster(0);
+ while (m_clusters.size() > 0) releaseCluster(0);
}
//
-int btSoftBody::generateClusters(int k,int maxiterations)
+int btSoftBody::generateClusters(int k, int maxiterations)
{
int i;
releaseClusters();
- m_clusters.resize(btMin(k,m_nodes.size()));
- for(i=0;i<m_clusters.size();++i)
- {
- m_clusters[i] = new(btAlignedAlloc(sizeof(Cluster),16)) Cluster();
- m_clusters[i]->m_collide= true;
- }
- k=m_clusters.size();
- if(k>0)
- {
- /* Initialize */
- btAlignedObjectArray<btVector3> centers;
- btVector3 cog(0,0,0);
- int i;
- for(i=0;i<m_nodes.size();++i)
- {
- cog+=m_nodes[i].m_x;
- m_clusters[(i*29873)%m_clusters.size()]->m_nodes.push_back(&m_nodes[i]);
- }
- cog/=(btScalar)m_nodes.size();
- centers.resize(k,cog);
- /* Iterate */
- const btScalar slope=16;
- bool changed;
- int iterations=0;
- do {
- const btScalar w=2-btMin<btScalar>(1,iterations/slope);
- changed=false;
- iterations++;
+ m_clusters.resize(btMin(k, m_nodes.size()));
+ for (i = 0; i < m_clusters.size(); ++i)
+ {
+ m_clusters[i] = new (btAlignedAlloc(sizeof(Cluster), 16)) Cluster();
+ m_clusters[i]->m_collide = true;
+ }
+ k = m_clusters.size();
+ if (k > 0)
+ {
+ /* Initialize */
+ btAlignedObjectArray<btVector3> centers;
+ btVector3 cog(0, 0, 0);
+ int i;
+ for (i = 0; i < m_nodes.size(); ++i)
+ {
+ cog += m_nodes[i].m_x;
+ m_clusters[(i * 29873) % m_clusters.size()]->m_nodes.push_back(&m_nodes[i]);
+ }
+ cog /= (btScalar)m_nodes.size();
+ centers.resize(k, cog);
+ /* Iterate */
+ const btScalar slope = 16;
+ bool changed;
+ int iterations = 0;
+ do
+ {
+ const btScalar w = 2 - btMin<btScalar>(1, iterations / slope);
+ changed = false;
+ iterations++;
int i;
- for(i=0;i<k;++i)
+ for (i = 0; i < k; ++i)
{
- btVector3 c(0,0,0);
- for(int j=0;j<m_clusters[i]->m_nodes.size();++j)
+ btVector3 c(0, 0, 0);
+ for (int j = 0; j < m_clusters[i]->m_nodes.size(); ++j)
{
- c+=m_clusters[i]->m_nodes[j]->m_x;
+ c += m_clusters[i]->m_nodes[j]->m_x;
}
- if(m_clusters[i]->m_nodes.size())
+ if (m_clusters[i]->m_nodes.size())
{
- c /= (btScalar)m_clusters[i]->m_nodes.size();
- c = centers[i]+(c-centers[i])*w;
- changed |= ((c-centers[i]).length2()>SIMD_EPSILON);
- centers[i] = c;
+ c /= (btScalar)m_clusters[i]->m_nodes.size();
+ c = centers[i] + (c - centers[i]) * w;
+ changed |= ((c - centers[i]).length2() > SIMD_EPSILON);
+ centers[i] = c;
m_clusters[i]->m_nodes.resize(0);
- }
+ }
}
- for(i=0;i<m_nodes.size();++i)
+ for (i = 0; i < m_nodes.size(); ++i)
{
- const btVector3 nx=m_nodes[i].m_x;
- int kbest=0;
- btScalar kdist=ClusterMetric(centers[0],nx);
- for(int j=1;j<k;++j)
+ const btVector3 nx = m_nodes[i].m_x;
+ int kbest = 0;
+ btScalar kdist = ClusterMetric(centers[0], nx);
+ for (int j = 1; j < k; ++j)
{
- const btScalar d=ClusterMetric(centers[j],nx);
- if(d<kdist)
+ const btScalar d = ClusterMetric(centers[j], nx);
+ if (d < kdist)
{
- kbest=j;
- kdist=d;
+ kbest = j;
+ kdist = d;
}
}
m_clusters[kbest]->m_nodes.push_back(&m_nodes[i]);
- }
- } while(changed&&(iterations<maxiterations));
- /* Merge */
- btAlignedObjectArray<int> cids;
- cids.resize(m_nodes.size(),-1);
- for(i=0;i<m_clusters.size();++i)
+ }
+ } while (changed && (iterations < maxiterations));
+ /* Merge */
+ btAlignedObjectArray<int> cids;
+ cids.resize(m_nodes.size(), -1);
+ for (i = 0; i < m_clusters.size(); ++i)
{
- for(int j=0;j<m_clusters[i]->m_nodes.size();++j)
+ for (int j = 0; j < m_clusters[i]->m_nodes.size(); ++j)
{
- cids[int(m_clusters[i]->m_nodes[j]-&m_nodes[0])]=i;
+ cids[int(m_clusters[i]->m_nodes[j] - &m_nodes[0])] = i;
}
}
- for(i=0;i<m_faces.size();++i)
+ for (i = 0; i < m_faces.size(); ++i)
{
- const int idx[]={ int(m_faces[i].m_n[0]-&m_nodes[0]),
- int(m_faces[i].m_n[1]-&m_nodes[0]),
- int(m_faces[i].m_n[2]-&m_nodes[0])};
- for(int j=0;j<3;++j)
+ const int idx[] = {int(m_faces[i].m_n[0] - &m_nodes[0]),
+ int(m_faces[i].m_n[1] - &m_nodes[0]),
+ int(m_faces[i].m_n[2] - &m_nodes[0])};
+ for (int j = 0; j < 3; ++j)
{
- const int cid=cids[idx[j]];
- for(int q=1;q<3;++q)
+ const int cid = cids[idx[j]];
+ for (int q = 1; q < 3; ++q)
{
- const int kid=idx[(j+q)%3];
- if(cids[kid]!=cid)
+ const int kid = idx[(j + q) % 3];
+ if (cids[kid] != cid)
{
- if(m_clusters[cid]->m_nodes.findLinearSearch(&m_nodes[kid])==m_clusters[cid]->m_nodes.size())
+ if (m_clusters[cid]->m_nodes.findLinearSearch(&m_nodes[kid]) == m_clusters[cid]->m_nodes.size())
{
m_clusters[cid]->m_nodes.push_back(&m_nodes[kid]);
}
@@ -1289,55 +1297,56 @@ int btSoftBody::generateClusters(int k,int maxiterations)
}
}
}
- /* Master */
- if(m_clusters.size()>1)
+ /* Master */
+ if (m_clusters.size() > 1)
{
- Cluster* pmaster=new(btAlignedAlloc(sizeof(Cluster),16)) Cluster();
- pmaster->m_collide = false;
+ Cluster* pmaster = new (btAlignedAlloc(sizeof(Cluster), 16)) Cluster();
+ pmaster->m_collide = false;
pmaster->m_nodes.reserve(m_nodes.size());
- for(int i=0;i<m_nodes.size();++i) pmaster->m_nodes.push_back(&m_nodes[i]);
+ for (int i = 0; i < m_nodes.size(); ++i) pmaster->m_nodes.push_back(&m_nodes[i]);
m_clusters.push_back(pmaster);
- btSwap(m_clusters[0],m_clusters[m_clusters.size()-1]);
+ btSwap(m_clusters[0], m_clusters[m_clusters.size() - 1]);
}
- /* Terminate */
- for(i=0;i<m_clusters.size();++i)
+ /* Terminate */
+ for (i = 0; i < m_clusters.size(); ++i)
{
- if(m_clusters[i]->m_nodes.size()==0)
+ if (m_clusters[i]->m_nodes.size() == 0)
{
releaseCluster(i--);
}
}
- } else
+ }
+ else
{
//create a cluster for each tetrahedron (if tetrahedra exist) or each face
if (m_tetras.size())
{
m_clusters.resize(m_tetras.size());
- for(i=0;i<m_clusters.size();++i)
+ for (i = 0; i < m_clusters.size(); ++i)
{
- m_clusters[i] = new(btAlignedAlloc(sizeof(Cluster),16)) Cluster();
- m_clusters[i]->m_collide= true;
+ m_clusters[i] = new (btAlignedAlloc(sizeof(Cluster), 16)) Cluster();
+ m_clusters[i]->m_collide = true;
}
- for (i=0;i<m_tetras.size();i++)
+ for (i = 0; i < m_tetras.size(); i++)
{
- for (int j=0;j<4;j++)
+ for (int j = 0; j < 4; j++)
{
m_clusters[i]->m_nodes.push_back(m_tetras[i].m_n[j]);
}
}
-
- } else
+ }
+ else
{
m_clusters.resize(m_faces.size());
- for(i=0;i<m_clusters.size();++i)
+ for (i = 0; i < m_clusters.size(); ++i)
{
- m_clusters[i] = new(btAlignedAlloc(sizeof(Cluster),16)) Cluster();
- m_clusters[i]->m_collide= true;
+ m_clusters[i] = new (btAlignedAlloc(sizeof(Cluster), 16)) Cluster();
+ m_clusters[i]->m_collide = true;
}
- for(i=0;i<m_faces.size();++i)
+ for (i = 0; i < m_faces.size(); ++i)
{
- for(int j=0;j<3;++j)
+ for (int j = 0; j < 3; ++j)
{
m_clusters[i]->m_nodes.push_back(m_faces[i].m_n[j]);
}
@@ -1350,261 +1359,272 @@ int btSoftBody::generateClusters(int k,int maxiterations)
initializeClusters();
updateClusters();
-
//for self-collision
- m_clusterConnectivity.resize(m_clusters.size()*m_clusters.size());
+ m_clusterConnectivity.resize(m_clusters.size() * m_clusters.size());
{
- for (int c0=0;c0<m_clusters.size();c0++)
+ for (int c0 = 0; c0 < m_clusters.size(); c0++)
{
- m_clusters[c0]->m_clusterIndex=c0;
- for (int c1=0;c1<m_clusters.size();c1++)
+ m_clusters[c0]->m_clusterIndex = c0;
+ for (int c1 = 0; c1 < m_clusters.size(); c1++)
{
-
- bool connected=false;
+ bool connected = false;
Cluster* cla = m_clusters[c0];
Cluster* clb = m_clusters[c1];
- for (int i=0;!connected&&i<cla->m_nodes.size();i++)
+ for (int i = 0; !connected && i < cla->m_nodes.size(); i++)
{
- for (int j=0;j<clb->m_nodes.size();j++)
+ for (int j = 0; j < clb->m_nodes.size(); j++)
{
if (cla->m_nodes[i] == clb->m_nodes[j])
{
- connected=true;
+ connected = true;
break;
}
}
}
- m_clusterConnectivity[c0+c1*m_clusters.size()]=connected;
+ m_clusterConnectivity[c0 + c1 * m_clusters.size()] = connected;
}
}
}
}
- return(m_clusters.size());
+ return (m_clusters.size());
}
//
-void btSoftBody::refine(ImplicitFn* ifn,btScalar accurary,bool cut)
+void btSoftBody::refine(ImplicitFn* ifn, btScalar accurary, bool cut)
{
- const Node* nbase = &m_nodes[0];
- int ncount = m_nodes.size();
- btSymMatrix<int> edges(ncount,-2);
- int newnodes=0;
- int i,j,k,ni;
+ const Node* nbase = &m_nodes[0];
+ int ncount = m_nodes.size();
+ btSymMatrix<int> edges(ncount, -2);
+ int newnodes = 0;
+ int i, j, k, ni;
- /* Filter out */
- for(i=0;i<m_links.size();++i)
+ /* Filter out */
+ for (i = 0; i < m_links.size(); ++i)
{
- Link& l=m_links[i];
- if(l.m_bbending)
+ Link& l = m_links[i];
+ if (l.m_bbending)
{
- if(!SameSign(ifn->Eval(l.m_n[0]->m_x),ifn->Eval(l.m_n[1]->m_x)))
+ if (!SameSign(ifn->Eval(l.m_n[0]->m_x), ifn->Eval(l.m_n[1]->m_x)))
{
- btSwap(m_links[i],m_links[m_links.size()-1]);
- m_links.pop_back();--i;
+ btSwap(m_links[i], m_links[m_links.size() - 1]);
+ m_links.pop_back();
+ --i;
}
- }
+ }
}
- /* Fill edges */
- for(i=0;i<m_links.size();++i)
+ /* Fill edges */
+ for (i = 0; i < m_links.size(); ++i)
{
- Link& l=m_links[i];
- edges(int(l.m_n[0]-nbase),int(l.m_n[1]-nbase))=-1;
+ Link& l = m_links[i];
+ edges(int(l.m_n[0] - nbase), int(l.m_n[1] - nbase)) = -1;
}
- for(i=0;i<m_faces.size();++i)
- {
- Face& f=m_faces[i];
- edges(int(f.m_n[0]-nbase),int(f.m_n[1]-nbase))=-1;
- edges(int(f.m_n[1]-nbase),int(f.m_n[2]-nbase))=-1;
- edges(int(f.m_n[2]-nbase),int(f.m_n[0]-nbase))=-1;
+ for (i = 0; i < m_faces.size(); ++i)
+ {
+ Face& f = m_faces[i];
+ edges(int(f.m_n[0] - nbase), int(f.m_n[1] - nbase)) = -1;
+ edges(int(f.m_n[1] - nbase), int(f.m_n[2] - nbase)) = -1;
+ edges(int(f.m_n[2] - nbase), int(f.m_n[0] - nbase)) = -1;
}
- /* Intersect */
- for(i=0;i<ncount;++i)
+ /* Intersect */
+ for (i = 0; i < ncount; ++i)
{
- for(j=i+1;j<ncount;++j)
+ for (j = i + 1; j < ncount; ++j)
{
- if(edges(i,j)==-1)
+ if (edges(i, j) == -1)
{
- Node& a=m_nodes[i];
- Node& b=m_nodes[j];
- const btScalar t=ImplicitSolve(ifn,a.m_x,b.m_x,accurary);
- if(t>0)
+ Node& a = m_nodes[i];
+ Node& b = m_nodes[j];
+ const btScalar t = ImplicitSolve(ifn, a.m_x, b.m_x, accurary);
+ if (t > 0)
{
- const btVector3 x=Lerp(a.m_x,b.m_x,t);
- const btVector3 v=Lerp(a.m_v,b.m_v,t);
- btScalar m=0;
- if(a.m_im>0)
+ const btVector3 x = Lerp(a.m_x, b.m_x, t);
+ const btVector3 v = Lerp(a.m_v, b.m_v, t);
+ btScalar m = 0;
+ if (a.m_im > 0)
{
- if(b.m_im>0)
+ if (b.m_im > 0)
{
- const btScalar ma=1/a.m_im;
- const btScalar mb=1/b.m_im;
- const btScalar mc=Lerp(ma,mb,t);
- const btScalar f=(ma+mb)/(ma+mb+mc);
- a.m_im=1/(ma*f);
- b.m_im=1/(mb*f);
- m=mc*f;
+ const btScalar ma = 1 / a.m_im;
+ const btScalar mb = 1 / b.m_im;
+ const btScalar mc = Lerp(ma, mb, t);
+ const btScalar f = (ma + mb) / (ma + mb + mc);
+ a.m_im = 1 / (ma * f);
+ b.m_im = 1 / (mb * f);
+ m = mc * f;
}
else
- { a.m_im/=0.5f;m=1/a.m_im; }
+ {
+ a.m_im /= 0.5f;
+ m = 1 / a.m_im;
+ }
}
else
{
- if(b.m_im>0)
- { b.m_im/=0.5f;m=1/b.m_im; }
+ if (b.m_im > 0)
+ {
+ b.m_im /= 0.5f;
+ m = 1 / b.m_im;
+ }
else
- m=0;
+ m = 0;
}
- appendNode(x,m);
- edges(i,j)=m_nodes.size()-1;
- m_nodes[edges(i,j)].m_v=v;
+ appendNode(x, m);
+ edges(i, j) = m_nodes.size() - 1;
+ m_nodes[edges(i, j)].m_v = v;
++newnodes;
}
}
}
}
- nbase=&m_nodes[0];
- /* Refine links */
- for(i=0,ni=m_links.size();i<ni;++i)
+ nbase = &m_nodes[0];
+ /* Refine links */
+ for (i = 0, ni = m_links.size(); i < ni; ++i)
{
- Link& feat=m_links[i];
- const int idx[]={ int(feat.m_n[0]-nbase),
- int(feat.m_n[1]-nbase)};
- if((idx[0]<ncount)&&(idx[1]<ncount))
+ Link& feat = m_links[i];
+ const int idx[] = {int(feat.m_n[0] - nbase),
+ int(feat.m_n[1] - nbase)};
+ if ((idx[0] < ncount) && (idx[1] < ncount))
{
- const int ni=edges(idx[0],idx[1]);
- if(ni>0)
+ const int ni = edges(idx[0], idx[1]);
+ if (ni > 0)
{
appendLink(i);
- Link* pft[]={ &m_links[i],
- &m_links[m_links.size()-1]};
- pft[0]->m_n[0]=&m_nodes[idx[0]];
- pft[0]->m_n[1]=&m_nodes[ni];
- pft[1]->m_n[0]=&m_nodes[ni];
- pft[1]->m_n[1]=&m_nodes[idx[1]];
+ Link* pft[] = {&m_links[i],
+ &m_links[m_links.size() - 1]};
+ pft[0]->m_n[0] = &m_nodes[idx[0]];
+ pft[0]->m_n[1] = &m_nodes[ni];
+ pft[1]->m_n[0] = &m_nodes[ni];
+ pft[1]->m_n[1] = &m_nodes[idx[1]];
}
}
}
- /* Refine faces */
- for(i=0;i<m_faces.size();++i)
+ /* Refine faces */
+ for (i = 0; i < m_faces.size(); ++i)
{
- const Face& feat=m_faces[i];
- const int idx[]={ int(feat.m_n[0]-nbase),
- int(feat.m_n[1]-nbase),
- int(feat.m_n[2]-nbase)};
- for(j=2,k=0;k<3;j=k++)
+ const Face& feat = m_faces[i];
+ const int idx[] = {int(feat.m_n[0] - nbase),
+ int(feat.m_n[1] - nbase),
+ int(feat.m_n[2] - nbase)};
+ for (j = 2, k = 0; k < 3; j = k++)
{
- if((idx[j]<ncount)&&(idx[k]<ncount))
+ if ((idx[j] < ncount) && (idx[k] < ncount))
{
- const int ni=edges(idx[j],idx[k]);
- if(ni>0)
+ const int ni = edges(idx[j], idx[k]);
+ if (ni > 0)
{
appendFace(i);
- const int l=(k+1)%3;
- Face* pft[]={ &m_faces[i],
- &m_faces[m_faces.size()-1]};
- pft[0]->m_n[0]=&m_nodes[idx[l]];
- pft[0]->m_n[1]=&m_nodes[idx[j]];
- pft[0]->m_n[2]=&m_nodes[ni];
- pft[1]->m_n[0]=&m_nodes[ni];
- pft[1]->m_n[1]=&m_nodes[idx[k]];
- pft[1]->m_n[2]=&m_nodes[idx[l]];
- appendLink(ni,idx[l],pft[0]->m_material);
- --i;break;
+ const int l = (k + 1) % 3;
+ Face* pft[] = {&m_faces[i],
+ &m_faces[m_faces.size() - 1]};
+ pft[0]->m_n[0] = &m_nodes[idx[l]];
+ pft[0]->m_n[1] = &m_nodes[idx[j]];
+ pft[0]->m_n[2] = &m_nodes[ni];
+ pft[1]->m_n[0] = &m_nodes[ni];
+ pft[1]->m_n[1] = &m_nodes[idx[k]];
+ pft[1]->m_n[2] = &m_nodes[idx[l]];
+ appendLink(ni, idx[l], pft[0]->m_material);
+ --i;
+ break;
}
}
}
}
- /* Cut */
- if(cut)
- {
- btAlignedObjectArray<int> cnodes;
- const int pcount=ncount;
- int i;
- ncount=m_nodes.size();
- cnodes.resize(ncount,0);
- /* Nodes */
- for(i=0;i<ncount;++i)
+ /* Cut */
+ if (cut)
+ {
+ btAlignedObjectArray<int> cnodes;
+ const int pcount = ncount;
+ int i;
+ ncount = m_nodes.size();
+ cnodes.resize(ncount, 0);
+ /* Nodes */
+ for (i = 0; i < ncount; ++i)
{
- const btVector3 x=m_nodes[i].m_x;
- if((i>=pcount)||(btFabs(ifn->Eval(x))<accurary))
+ const btVector3 x = m_nodes[i].m_x;
+ if ((i >= pcount) || (btFabs(ifn->Eval(x)) < accurary))
{
- const btVector3 v=m_nodes[i].m_v;
- btScalar m=getMass(i);
- if(m>0) { m*=0.5f;m_nodes[i].m_im/=0.5f; }
- appendNode(x,m);
- cnodes[i]=m_nodes.size()-1;
- m_nodes[cnodes[i]].m_v=v;
+ const btVector3 v = m_nodes[i].m_v;
+ btScalar m = getMass(i);
+ if (m > 0)
+ {
+ m *= 0.5f;
+ m_nodes[i].m_im /= 0.5f;
+ }
+ appendNode(x, m);
+ cnodes[i] = m_nodes.size() - 1;
+ m_nodes[cnodes[i]].m_v = v;
}
}
- nbase=&m_nodes[0];
- /* Links */
- for(i=0,ni=m_links.size();i<ni;++i)
+ nbase = &m_nodes[0];
+ /* Links */
+ for (i = 0, ni = m_links.size(); i < ni; ++i)
{
- const int id[]={ int(m_links[i].m_n[0]-nbase),
- int(m_links[i].m_n[1]-nbase)};
- int todetach=0;
- if(cnodes[id[0]]&&cnodes[id[1]])
+ const int id[] = {int(m_links[i].m_n[0] - nbase),
+ int(m_links[i].m_n[1] - nbase)};
+ int todetach = 0;
+ if (cnodes[id[0]] && cnodes[id[1]])
{
appendLink(i);
- todetach=m_links.size()-1;
+ todetach = m_links.size() - 1;
}
else
{
- if(( (ifn->Eval(m_nodes[id[0]].m_x)<accurary)&&
- (ifn->Eval(m_nodes[id[1]].m_x)<accurary)))
- todetach=i;
+ if (((ifn->Eval(m_nodes[id[0]].m_x) < accurary) &&
+ (ifn->Eval(m_nodes[id[1]].m_x) < accurary)))
+ todetach = i;
}
- if(todetach)
+ if (todetach)
{
- Link& l=m_links[todetach];
- for(int j=0;j<2;++j)
+ Link& l = m_links[todetach];
+ for (int j = 0; j < 2; ++j)
{
- int cn=cnodes[int(l.m_n[j]-nbase)];
- if(cn) l.m_n[j]=&m_nodes[cn];
- }
+ int cn = cnodes[int(l.m_n[j] - nbase)];
+ if (cn) l.m_n[j] = &m_nodes[cn];
+ }
}
}
- /* Faces */
- for(i=0,ni=m_faces.size();i<ni;++i)
+ /* Faces */
+ for (i = 0, ni = m_faces.size(); i < ni; ++i)
{
- Node** n= m_faces[i].m_n;
- if( (ifn->Eval(n[0]->m_x)<accurary)&&
- (ifn->Eval(n[1]->m_x)<accurary)&&
- (ifn->Eval(n[2]->m_x)<accurary))
+ Node** n = m_faces[i].m_n;
+ if ((ifn->Eval(n[0]->m_x) < accurary) &&
+ (ifn->Eval(n[1]->m_x) < accurary) &&
+ (ifn->Eval(n[2]->m_x) < accurary))
{
- for(int j=0;j<3;++j)
+ for (int j = 0; j < 3; ++j)
{
- int cn=cnodes[int(n[j]-nbase)];
- if(cn) n[j]=&m_nodes[cn];
+ int cn = cnodes[int(n[j] - nbase)];
+ if (cn) n[j] = &m_nodes[cn];
}
}
}
- /* Clean orphans */
- int nnodes=m_nodes.size();
- btAlignedObjectArray<int> ranks;
- btAlignedObjectArray<int> todelete;
- ranks.resize(nnodes,0);
- for(i=0,ni=m_links.size();i<ni;++i)
+ /* Clean orphans */
+ int nnodes = m_nodes.size();
+ btAlignedObjectArray<int> ranks;
+ btAlignedObjectArray<int> todelete;
+ ranks.resize(nnodes, 0);
+ for (i = 0, ni = m_links.size(); i < ni; ++i)
{
- for(int j=0;j<2;++j) ranks[int(m_links[i].m_n[j]-nbase)]++;
+ for (int j = 0; j < 2; ++j) ranks[int(m_links[i].m_n[j] - nbase)]++;
}
- for(i=0,ni=m_faces.size();i<ni;++i)
+ for (i = 0, ni = m_faces.size(); i < ni; ++i)
{
- for(int j=0;j<3;++j) ranks[int(m_faces[i].m_n[j]-nbase)]++;
+ for (int j = 0; j < 3; ++j) ranks[int(m_faces[i].m_n[j] - nbase)]++;
}
- for(i=0;i<m_links.size();++i)
+ for (i = 0; i < m_links.size(); ++i)
{
- const int id[]={ int(m_links[i].m_n[0]-nbase),
- int(m_links[i].m_n[1]-nbase)};
- const bool sg[]={ ranks[id[0]]==1,
- ranks[id[1]]==1};
- if(sg[0]||sg[1])
+ const int id[] = {int(m_links[i].m_n[0] - nbase),
+ int(m_links[i].m_n[1] - nbase)};
+ const bool sg[] = {ranks[id[0]] == 1,
+ ranks[id[1]] == 1};
+ if (sg[0] || sg[1])
{
--ranks[id[0]];
--ranks[id[1]];
- btSwap(m_links[i],m_links[m_links.size()-1]);
- m_links.pop_back();--i;
+ btSwap(m_links[i], m_links[m_links.size() - 1]);
+ m_links.pop_back();
+ --i;
}
}
#if 0
@@ -1631,679 +1651,675 @@ void btSoftBody::refine(ImplicitFn* ifn,btScalar accurary,bool cut)
}
#endif
}
- m_bUpdateRtCst=true;
+ m_bUpdateRtCst = true;
}
//
-bool btSoftBody::cutLink(const Node* node0,const Node* node1,btScalar position)
+bool btSoftBody::cutLink(const Node* node0, const Node* node1, btScalar position)
{
- return(cutLink(int(node0-&m_nodes[0]),int(node1-&m_nodes[0]),position));
+ return (cutLink(int(node0 - &m_nodes[0]), int(node1 - &m_nodes[0]), position));
}
//
-bool btSoftBody::cutLink(int node0,int node1,btScalar position)
+bool btSoftBody::cutLink(int node0, int node1, btScalar position)
{
- bool done=false;
- int i,ni;
-// const btVector3 d=m_nodes[node0].m_x-m_nodes[node1].m_x;
- const btVector3 x=Lerp(m_nodes[node0].m_x,m_nodes[node1].m_x,position);
- const btVector3 v=Lerp(m_nodes[node0].m_v,m_nodes[node1].m_v,position);
- const btScalar m=1;
- appendNode(x,m);
- appendNode(x,m);
- Node* pa=&m_nodes[node0];
- Node* pb=&m_nodes[node1];
- Node* pn[2]={ &m_nodes[m_nodes.size()-2],
- &m_nodes[m_nodes.size()-1]};
- pn[0]->m_v=v;
- pn[1]->m_v=v;
- for(i=0,ni=m_links.size();i<ni;++i)
+ bool done = false;
+ int i, ni;
+ // const btVector3 d=m_nodes[node0].m_x-m_nodes[node1].m_x;
+ const btVector3 x = Lerp(m_nodes[node0].m_x, m_nodes[node1].m_x, position);
+ const btVector3 v = Lerp(m_nodes[node0].m_v, m_nodes[node1].m_v, position);
+ const btScalar m = 1;
+ appendNode(x, m);
+ appendNode(x, m);
+ Node* pa = &m_nodes[node0];
+ Node* pb = &m_nodes[node1];
+ Node* pn[2] = {&m_nodes[m_nodes.size() - 2],
+ &m_nodes[m_nodes.size() - 1]};
+ pn[0]->m_v = v;
+ pn[1]->m_v = v;
+ for (i = 0, ni = m_links.size(); i < ni; ++i)
{
- const int mtch=MatchEdge(m_links[i].m_n[0],m_links[i].m_n[1],pa,pb);
- if(mtch!=-1)
+ const int mtch = MatchEdge(m_links[i].m_n[0], m_links[i].m_n[1], pa, pb);
+ if (mtch != -1)
{
appendLink(i);
- Link* pft[]={&m_links[i],&m_links[m_links.size()-1]};
- pft[0]->m_n[1]=pn[mtch];
- pft[1]->m_n[0]=pn[1-mtch];
- done=true;
+ Link* pft[] = {&m_links[i], &m_links[m_links.size() - 1]};
+ pft[0]->m_n[1] = pn[mtch];
+ pft[1]->m_n[0] = pn[1 - mtch];
+ done = true;
}
}
- for(i=0,ni=m_faces.size();i<ni;++i)
+ for (i = 0, ni = m_faces.size(); i < ni; ++i)
{
- for(int k=2,l=0;l<3;k=l++)
+ for (int k = 2, l = 0; l < 3; k = l++)
{
- const int mtch=MatchEdge(m_faces[i].m_n[k],m_faces[i].m_n[l],pa,pb);
- if(mtch!=-1)
+ const int mtch = MatchEdge(m_faces[i].m_n[k], m_faces[i].m_n[l], pa, pb);
+ if (mtch != -1)
{
appendFace(i);
- Face* pft[]={&m_faces[i],&m_faces[m_faces.size()-1]};
- pft[0]->m_n[l]=pn[mtch];
- pft[1]->m_n[k]=pn[1-mtch];
- appendLink(pn[0],pft[0]->m_n[(l+1)%3],pft[0]->m_material,true);
- appendLink(pn[1],pft[0]->m_n[(l+1)%3],pft[0]->m_material,true);
+ Face* pft[] = {&m_faces[i], &m_faces[m_faces.size() - 1]};
+ pft[0]->m_n[l] = pn[mtch];
+ pft[1]->m_n[k] = pn[1 - mtch];
+ appendLink(pn[0], pft[0]->m_n[(l + 1) % 3], pft[0]->m_material, true);
+ appendLink(pn[1], pft[0]->m_n[(l + 1) % 3], pft[0]->m_material, true);
}
}
}
- if(!done)
+ if (!done)
{
m_ndbvt.remove(pn[0]->m_leaf);
m_ndbvt.remove(pn[1]->m_leaf);
m_nodes.pop_back();
m_nodes.pop_back();
}
- return(done);
+ return (done);
}
//
-bool btSoftBody::rayTest(const btVector3& rayFrom,
- const btVector3& rayTo,
- sRayCast& results)
+bool btSoftBody::rayTest(const btVector3& rayFrom,
+ const btVector3& rayTo,
+ sRayCast& results)
{
- if(m_faces.size()&&m_fdbvt.empty())
+ if (m_faces.size() && m_fdbvt.empty())
initializeFaceTree();
- results.body = this;
+ results.body = this;
results.fraction = 1.f;
- results.feature = eFeature::None;
- results.index = -1;
+ results.feature = eFeature::None;
+ results.index = -1;
- return(rayTest(rayFrom,rayTo,results.fraction,results.feature,results.index,false)!=0);
+ return (rayTest(rayFrom, rayTo, results.fraction, results.feature, results.index, false) != 0);
}
//
-void btSoftBody::setSolver(eSolverPresets::_ preset)
+void btSoftBody::setSolver(eSolverPresets::_ preset)
{
m_cfg.m_vsequence.clear();
m_cfg.m_psequence.clear();
m_cfg.m_dsequence.clear();
- switch(preset)
- {
- case eSolverPresets::Positions:
- m_cfg.m_psequence.push_back(ePSolver::Anchors);
- m_cfg.m_psequence.push_back(ePSolver::RContacts);
- m_cfg.m_psequence.push_back(ePSolver::SContacts);
- m_cfg.m_psequence.push_back(ePSolver::Linear);
- break;
- case eSolverPresets::Velocities:
- m_cfg.m_vsequence.push_back(eVSolver::Linear);
-
- m_cfg.m_psequence.push_back(ePSolver::Anchors);
- m_cfg.m_psequence.push_back(ePSolver::RContacts);
- m_cfg.m_psequence.push_back(ePSolver::SContacts);
-
- m_cfg.m_dsequence.push_back(ePSolver::Linear);
- break;
+ switch (preset)
+ {
+ case eSolverPresets::Positions:
+ m_cfg.m_psequence.push_back(ePSolver::Anchors);
+ m_cfg.m_psequence.push_back(ePSolver::RContacts);
+ m_cfg.m_psequence.push_back(ePSolver::SContacts);
+ m_cfg.m_psequence.push_back(ePSolver::Linear);
+ break;
+ case eSolverPresets::Velocities:
+ m_cfg.m_vsequence.push_back(eVSolver::Linear);
+
+ m_cfg.m_psequence.push_back(ePSolver::Anchors);
+ m_cfg.m_psequence.push_back(ePSolver::RContacts);
+ m_cfg.m_psequence.push_back(ePSolver::SContacts);
+
+ m_cfg.m_dsequence.push_back(ePSolver::Linear);
+ break;
}
}
//
-void btSoftBody::predictMotion(btScalar dt)
+void btSoftBody::predictMotion(btScalar dt)
{
+ int i, ni;
- int i,ni;
-
- /* Update */
- if(m_bUpdateRtCst)
+ /* Update */
+ if (m_bUpdateRtCst)
{
- m_bUpdateRtCst=false;
+ m_bUpdateRtCst = false;
updateConstants();
m_fdbvt.clear();
- if(m_cfg.collisions&fCollision::VF_SS)
+ if (m_cfg.collisions & fCollision::VF_SS)
{
- initializeFaceTree();
+ initializeFaceTree();
}
}
- /* Prepare */
- m_sst.sdt = dt*m_cfg.timescale;
- m_sst.isdt = 1/m_sst.sdt;
- m_sst.velmrg = m_sst.sdt*3;
- m_sst.radmrg = getCollisionShape()->getMargin();
- m_sst.updmrg = m_sst.radmrg*(btScalar)0.25;
- /* Forces */
- addVelocity(m_worldInfo->m_gravity*m_sst.sdt);
+ /* Prepare */
+ m_sst.sdt = dt * m_cfg.timescale;
+ m_sst.isdt = 1 / m_sst.sdt;
+ m_sst.velmrg = m_sst.sdt * 3;
+ m_sst.radmrg = getCollisionShape()->getMargin();
+ m_sst.updmrg = m_sst.radmrg * (btScalar)0.25;
+ /* Forces */
+ addVelocity(m_worldInfo->m_gravity * m_sst.sdt);
applyForces();
- /* Integrate */
- for(i=0,ni=m_nodes.size();i<ni;++i)
+ /* Integrate */
+ for (i = 0, ni = m_nodes.size(); i < ni; ++i)
{
- Node& n=m_nodes[i];
- n.m_q = n.m_x;
- btVector3 deltaV = n.m_f*n.m_im*m_sst.sdt;
+ Node& n = m_nodes[i];
+ n.m_q = n.m_x;
+ btVector3 deltaV = n.m_f * n.m_im * m_sst.sdt;
{
btScalar maxDisplacement = m_worldInfo->m_maxDisplacement;
- btScalar clampDeltaV = maxDisplacement/m_sst.sdt;
- for (int c=0;c<3;c++)
+ btScalar clampDeltaV = maxDisplacement / m_sst.sdt;
+ for (int c = 0; c < 3; c++)
{
- if (deltaV[c]>clampDeltaV)
+ if (deltaV[c] > clampDeltaV)
{
deltaV[c] = clampDeltaV;
}
- if (deltaV[c]<-clampDeltaV)
+ if (deltaV[c] < -clampDeltaV)
{
- deltaV[c]=-clampDeltaV;
+ deltaV[c] = -clampDeltaV;
}
}
}
- n.m_v += deltaV;
- n.m_x += n.m_v*m_sst.sdt;
- n.m_f = btVector3(0,0,0);
+ n.m_v += deltaV;
+ n.m_x += n.m_v * m_sst.sdt;
+ n.m_f = btVector3(0, 0, 0);
}
- /* Clusters */
+ /* Clusters */
updateClusters();
- /* Bounds */
- updateBounds();
- /* Nodes */
- ATTRIBUTE_ALIGNED16(btDbvtVolume) vol;
- for(i=0,ni=m_nodes.size();i<ni;++i)
- {
- Node& n=m_nodes[i];
- vol = btDbvtVolume::FromCR(n.m_x,m_sst.radmrg);
- m_ndbvt.update( n.m_leaf,
- vol,
- n.m_v*m_sst.velmrg,
- m_sst.updmrg);
- }
- /* Faces */
- if(!m_fdbvt.empty())
- {
- for(int i=0;i<m_faces.size();++i)
- {
- Face& f=m_faces[i];
- const btVector3 v=( f.m_n[0]->m_v+
- f.m_n[1]->m_v+
- f.m_n[2]->m_v)/3;
- vol = VolumeOf(f,m_sst.radmrg);
- m_fdbvt.update( f.m_leaf,
- vol,
- v*m_sst.velmrg,
- m_sst.updmrg);
- }
- }
- /* Pose */
+ /* Bounds */
+ updateBounds();
+ /* Nodes */
+ ATTRIBUTE_ALIGNED16(btDbvtVolume)
+ vol;
+ for (i = 0, ni = m_nodes.size(); i < ni; ++i)
+ {
+ Node& n = m_nodes[i];
+ vol = btDbvtVolume::FromCR(n.m_x, m_sst.radmrg);
+ m_ndbvt.update(n.m_leaf,
+ vol,
+ n.m_v * m_sst.velmrg,
+ m_sst.updmrg);
+ }
+ /* Faces */
+ if (!m_fdbvt.empty())
+ {
+ for (int i = 0; i < m_faces.size(); ++i)
+ {
+ Face& f = m_faces[i];
+ const btVector3 v = (f.m_n[0]->m_v +
+ f.m_n[1]->m_v +
+ f.m_n[2]->m_v) /
+ 3;
+ vol = VolumeOf(f, m_sst.radmrg);
+ m_fdbvt.update(f.m_leaf,
+ vol,
+ v * m_sst.velmrg,
+ m_sst.updmrg);
+ }
+ }
+ /* Pose */
updatePose();
- /* Match */
- if(m_pose.m_bframe&&(m_cfg.kMT>0))
+ /* Match */
+ if (m_pose.m_bframe && (m_cfg.kMT > 0))
{
- const btMatrix3x3 posetrs=m_pose.m_rot;
- for(int i=0,ni=m_nodes.size();i<ni;++i)
+ const btMatrix3x3 posetrs = m_pose.m_rot;
+ for (int i = 0, ni = m_nodes.size(); i < ni; ++i)
{
- Node& n=m_nodes[i];
- if(n.m_im>0)
+ Node& n = m_nodes[i];
+ if (n.m_im > 0)
{
- const btVector3 x=posetrs*m_pose.m_pos[i]+m_pose.m_com;
- n.m_x=Lerp(n.m_x,x,m_cfg.kMT);
+ const btVector3 x = posetrs * m_pose.m_pos[i] + m_pose.m_com;
+ n.m_x = Lerp(n.m_x, x, m_cfg.kMT);
}
}
}
- /* Clear contacts */
+ /* Clear contacts */
m_rcontacts.resize(0);
m_scontacts.resize(0);
- /* Optimize dbvt's */
+ /* Optimize dbvt's */
m_ndbvt.optimizeIncremental(1);
m_fdbvt.optimizeIncremental(1);
m_cdbvt.optimizeIncremental(1);
}
//
-void btSoftBody::solveConstraints()
+void btSoftBody::solveConstraints()
{
-
- /* Apply clusters */
+ /* Apply clusters */
applyClusters(false);
- /* Prepare links */
+ /* Prepare links */
- int i,ni;
+ int i, ni;
- for(i=0,ni=m_links.size();i<ni;++i)
+ for (i = 0, ni = m_links.size(); i < ni; ++i)
{
- Link& l=m_links[i];
- l.m_c3 = l.m_n[1]->m_q-l.m_n[0]->m_q;
- l.m_c2 = 1/(l.m_c3.length2()*l.m_c0);
+ Link& l = m_links[i];
+ l.m_c3 = l.m_n[1]->m_q - l.m_n[0]->m_q;
+ l.m_c2 = 1 / (l.m_c3.length2() * l.m_c0);
}
- /* Prepare anchors */
- for(i=0,ni=m_anchors.size();i<ni;++i)
+ /* Prepare anchors */
+ for (i = 0, ni = m_anchors.size(); i < ni; ++i)
{
- Anchor& a=m_anchors[i];
- const btVector3 ra=a.m_body->getWorldTransform().getBasis()*a.m_local;
- a.m_c0 = ImpulseMatrix( m_sst.sdt,
- a.m_node->m_im,
- a.m_body->getInvMass(),
- a.m_body->getInvInertiaTensorWorld(),
- ra);
- a.m_c1 = ra;
- a.m_c2 = m_sst.sdt*a.m_node->m_im;
+ Anchor& a = m_anchors[i];
+ const btVector3 ra = a.m_body->getWorldTransform().getBasis() * a.m_local;
+ a.m_c0 = ImpulseMatrix(m_sst.sdt,
+ a.m_node->m_im,
+ a.m_body->getInvMass(),
+ a.m_body->getInvInertiaTensorWorld(),
+ ra);
+ a.m_c1 = ra;
+ a.m_c2 = m_sst.sdt * a.m_node->m_im;
a.m_body->activate();
}
- /* Solve velocities */
- if(m_cfg.viterations>0)
+ /* Solve velocities */
+ if (m_cfg.viterations > 0)
{
- /* Solve */
- for(int isolve=0;isolve<m_cfg.viterations;++isolve)
+ /* Solve */
+ for (int isolve = 0; isolve < m_cfg.viterations; ++isolve)
{
- for(int iseq=0;iseq<m_cfg.m_vsequence.size();++iseq)
+ for (int iseq = 0; iseq < m_cfg.m_vsequence.size(); ++iseq)
{
- getSolver(m_cfg.m_vsequence[iseq])(this,1);
+ getSolver(m_cfg.m_vsequence[iseq])(this, 1);
}
}
- /* Update */
- for(i=0,ni=m_nodes.size();i<ni;++i)
+ /* Update */
+ for (i = 0, ni = m_nodes.size(); i < ni; ++i)
{
- Node& n=m_nodes[i];
- n.m_x = n.m_q+n.m_v*m_sst.sdt;
+ Node& n = m_nodes[i];
+ n.m_x = n.m_q + n.m_v * m_sst.sdt;
}
}
- /* Solve positions */
- if(m_cfg.piterations>0)
+ /* Solve positions */
+ if (m_cfg.piterations > 0)
{
- for(int isolve=0;isolve<m_cfg.piterations;++isolve)
+ for (int isolve = 0; isolve < m_cfg.piterations; ++isolve)
{
- const btScalar ti=isolve/(btScalar)m_cfg.piterations;
- for(int iseq=0;iseq<m_cfg.m_psequence.size();++iseq)
+ const btScalar ti = isolve / (btScalar)m_cfg.piterations;
+ for (int iseq = 0; iseq < m_cfg.m_psequence.size(); ++iseq)
{
- getSolver(m_cfg.m_psequence[iseq])(this,1,ti);
+ getSolver(m_cfg.m_psequence[iseq])(this, 1, ti);
}
}
- const btScalar vc=m_sst.isdt*(1-m_cfg.kDP);
- for(i=0,ni=m_nodes.size();i<ni;++i)
+ const btScalar vc = m_sst.isdt * (1 - m_cfg.kDP);
+ for (i = 0, ni = m_nodes.size(); i < ni; ++i)
{
- Node& n=m_nodes[i];
- n.m_v = (n.m_x-n.m_q)*vc;
- n.m_f = btVector3(0,0,0);
+ Node& n = m_nodes[i];
+ n.m_v = (n.m_x - n.m_q) * vc;
+ n.m_f = btVector3(0, 0, 0);
}
}
- /* Solve drift */
- if(m_cfg.diterations>0)
+ /* Solve drift */
+ if (m_cfg.diterations > 0)
{
- const btScalar vcf=m_cfg.kVCF*m_sst.isdt;
- for(i=0,ni=m_nodes.size();i<ni;++i)
+ const btScalar vcf = m_cfg.kVCF * m_sst.isdt;
+ for (i = 0, ni = m_nodes.size(); i < ni; ++i)
{
- Node& n=m_nodes[i];
- n.m_q = n.m_x;
+ Node& n = m_nodes[i];
+ n.m_q = n.m_x;
}
- for(int idrift=0;idrift<m_cfg.diterations;++idrift)
+ for (int idrift = 0; idrift < m_cfg.diterations; ++idrift)
{
- for(int iseq=0;iseq<m_cfg.m_dsequence.size();++iseq)
+ for (int iseq = 0; iseq < m_cfg.m_dsequence.size(); ++iseq)
{
- getSolver(m_cfg.m_dsequence[iseq])(this,1,0);
+ getSolver(m_cfg.m_dsequence[iseq])(this, 1, 0);
}
}
- for(int i=0,ni=m_nodes.size();i<ni;++i)
+ for (int i = 0, ni = m_nodes.size(); i < ni; ++i)
{
- Node& n=m_nodes[i];
- n.m_v += (n.m_x-n.m_q)*vcf;
+ Node& n = m_nodes[i];
+ n.m_v += (n.m_x - n.m_q) * vcf;
}
}
- /* Apply clusters */
+ /* Apply clusters */
dampClusters();
applyClusters(true);
}
//
-void btSoftBody::staticSolve(int iterations)
+void btSoftBody::staticSolve(int iterations)
{
- for(int isolve=0;isolve<iterations;++isolve)
+ for (int isolve = 0; isolve < iterations; ++isolve)
{
- for(int iseq=0;iseq<m_cfg.m_psequence.size();++iseq)
+ for (int iseq = 0; iseq < m_cfg.m_psequence.size(); ++iseq)
{
- getSolver(m_cfg.m_psequence[iseq])(this,1,0);
+ getSolver(m_cfg.m_psequence[iseq])(this, 1, 0);
}
}
}
//
-void btSoftBody::solveCommonConstraints(btSoftBody** /*bodies*/,int /*count*/,int /*iterations*/)
+void btSoftBody::solveCommonConstraints(btSoftBody** /*bodies*/, int /*count*/, int /*iterations*/)
{
/// placeholder
}
//
-void btSoftBody::solveClusters(const btAlignedObjectArray<btSoftBody*>& bodies)
+void btSoftBody::solveClusters(const btAlignedObjectArray<btSoftBody*>& bodies)
{
- const int nb=bodies.size();
- int iterations=0;
+ const int nb = bodies.size();
+ int iterations = 0;
int i;
- for(i=0;i<nb;++i)
+ for (i = 0; i < nb; ++i)
{
- iterations=btMax(iterations,bodies[i]->m_cfg.citerations);
+ iterations = btMax(iterations, bodies[i]->m_cfg.citerations);
}
- for(i=0;i<nb;++i)
+ for (i = 0; i < nb; ++i)
{
bodies[i]->prepareClusters(iterations);
}
- for(i=0;i<iterations;++i)
+ for (i = 0; i < iterations; ++i)
{
- const btScalar sor=1;
- for(int j=0;j<nb;++j)
+ const btScalar sor = 1;
+ for (int j = 0; j < nb; ++j)
{
bodies[j]->solveClusters(sor);
}
}
- for(i=0;i<nb;++i)
+ for (i = 0; i < nb; ++i)
{
bodies[i]->cleanupClusters();
}
}
//
-void btSoftBody::integrateMotion()
+void btSoftBody::integrateMotion()
{
- /* Update */
+ /* Update */
updateNormals();
}
//
-btSoftBody::RayFromToCaster::RayFromToCaster(const btVector3& rayFrom,const btVector3& rayTo,btScalar mxt)
+btSoftBody::RayFromToCaster::RayFromToCaster(const btVector3& rayFrom, const btVector3& rayTo, btScalar mxt)
{
m_rayFrom = rayFrom;
- m_rayNormalizedDirection = (rayTo-rayFrom);
+ m_rayNormalizedDirection = (rayTo - rayFrom);
m_rayTo = rayTo;
- m_mint = mxt;
- m_face = 0;
- m_tests = 0;
+ m_mint = mxt;
+ m_face = 0;
+ m_tests = 0;
}
//
-void btSoftBody::RayFromToCaster::Process(const btDbvtNode* leaf)
+void btSoftBody::RayFromToCaster::Process(const btDbvtNode* leaf)
{
- btSoftBody::Face& f=*(btSoftBody::Face*)leaf->data;
- const btScalar t=rayFromToTriangle( m_rayFrom,m_rayTo,m_rayNormalizedDirection,
- f.m_n[0]->m_x,
- f.m_n[1]->m_x,
- f.m_n[2]->m_x,
- m_mint);
- if((t>0)&&(t<m_mint))
- {
- m_mint=t;m_face=&f;
+ btSoftBody::Face& f = *(btSoftBody::Face*)leaf->data;
+ const btScalar t = rayFromToTriangle(m_rayFrom, m_rayTo, m_rayNormalizedDirection,
+ f.m_n[0]->m_x,
+ f.m_n[1]->m_x,
+ f.m_n[2]->m_x,
+ m_mint);
+ if ((t > 0) && (t < m_mint))
+ {
+ m_mint = t;
+ m_face = &f;
}
++m_tests;
}
//
-btScalar btSoftBody::RayFromToCaster::rayFromToTriangle( const btVector3& rayFrom,
- const btVector3& rayTo,
- const btVector3& rayNormalizedDirection,
- const btVector3& a,
- const btVector3& b,
- const btVector3& c,
- btScalar maxt)
+btScalar btSoftBody::RayFromToCaster::rayFromToTriangle(const btVector3& rayFrom,
+ const btVector3& rayTo,
+ const btVector3& rayNormalizedDirection,
+ const btVector3& a,
+ const btVector3& b,
+ const btVector3& c,
+ btScalar maxt)
{
- static const btScalar ceps=-SIMD_EPSILON*10;
- static const btScalar teps=SIMD_EPSILON*10;
+ static const btScalar ceps = -SIMD_EPSILON * 10;
+ static const btScalar teps = SIMD_EPSILON * 10;
- const btVector3 n=btCross(b-a,c-a);
- const btScalar d=btDot(a,n);
- const btScalar den=btDot(rayNormalizedDirection,n);
- if(!btFuzzyZero(den))
+ const btVector3 n = btCross(b - a, c - a);
+ const btScalar d = btDot(a, n);
+ const btScalar den = btDot(rayNormalizedDirection, n);
+ if (!btFuzzyZero(den))
{
- const btScalar num=btDot(rayFrom,n)-d;
- const btScalar t=-num/den;
- if((t>teps)&&(t<maxt))
+ const btScalar num = btDot(rayFrom, n) - d;
+ const btScalar t = -num / den;
+ if ((t > teps) && (t < maxt))
{
- const btVector3 hit=rayFrom+rayNormalizedDirection*t;
- if( (btDot(n,btCross(a-hit,b-hit))>ceps) &&
- (btDot(n,btCross(b-hit,c-hit))>ceps) &&
- (btDot(n,btCross(c-hit,a-hit))>ceps))
+ const btVector3 hit = rayFrom + rayNormalizedDirection * t;
+ if ((btDot(n, btCross(a - hit, b - hit)) > ceps) &&
+ (btDot(n, btCross(b - hit, c - hit)) > ceps) &&
+ (btDot(n, btCross(c - hit, a - hit)) > ceps))
{
- return(t);
+ return (t);
}
}
}
- return(-1);
+ return (-1);
}
//
-void btSoftBody::pointersToIndices()
+void btSoftBody::pointersToIndices()
{
-#define PTR2IDX(_p_,_b_) reinterpret_cast<btSoftBody::Node*>((_p_)-(_b_))
- btSoftBody::Node* base=m_nodes.size() ? &m_nodes[0] : 0;
- int i,ni;
+#define PTR2IDX(_p_, _b_) reinterpret_cast<btSoftBody::Node*>((_p_) - (_b_))
+ btSoftBody::Node* base = m_nodes.size() ? &m_nodes[0] : 0;
+ int i, ni;
- for(i=0,ni=m_nodes.size();i<ni;++i)
+ for (i = 0, ni = m_nodes.size(); i < ni; ++i)
{
- if(m_nodes[i].m_leaf)
+ if (m_nodes[i].m_leaf)
{
- m_nodes[i].m_leaf->data=*(void**)&i;
+ m_nodes[i].m_leaf->data = *(void**)&i;
}
}
- for(i=0,ni=m_links.size();i<ni;++i)
+ for (i = 0, ni = m_links.size(); i < ni; ++i)
{
- m_links[i].m_n[0]=PTR2IDX(m_links[i].m_n[0],base);
- m_links[i].m_n[1]=PTR2IDX(m_links[i].m_n[1],base);
+ m_links[i].m_n[0] = PTR2IDX(m_links[i].m_n[0], base);
+ m_links[i].m_n[1] = PTR2IDX(m_links[i].m_n[1], base);
}
- for(i=0,ni=m_faces.size();i<ni;++i)
+ for (i = 0, ni = m_faces.size(); i < ni; ++i)
{
- m_faces[i].m_n[0]=PTR2IDX(m_faces[i].m_n[0],base);
- m_faces[i].m_n[1]=PTR2IDX(m_faces[i].m_n[1],base);
- m_faces[i].m_n[2]=PTR2IDX(m_faces[i].m_n[2],base);
- if(m_faces[i].m_leaf)
+ m_faces[i].m_n[0] = PTR2IDX(m_faces[i].m_n[0], base);
+ m_faces[i].m_n[1] = PTR2IDX(m_faces[i].m_n[1], base);
+ m_faces[i].m_n[2] = PTR2IDX(m_faces[i].m_n[2], base);
+ if (m_faces[i].m_leaf)
{
- m_faces[i].m_leaf->data=*(void**)&i;
+ m_faces[i].m_leaf->data = *(void**)&i;
}
}
- for(i=0,ni=m_anchors.size();i<ni;++i)
+ for (i = 0, ni = m_anchors.size(); i < ni; ++i)
{
- m_anchors[i].m_node=PTR2IDX(m_anchors[i].m_node,base);
+ m_anchors[i].m_node = PTR2IDX(m_anchors[i].m_node, base);
}
- for(i=0,ni=m_notes.size();i<ni;++i)
+ for (i = 0, ni = m_notes.size(); i < ni; ++i)
{
- for(int j=0;j<m_notes[i].m_rank;++j)
+ for (int j = 0; j < m_notes[i].m_rank; ++j)
{
- m_notes[i].m_nodes[j]=PTR2IDX(m_notes[i].m_nodes[j],base);
+ m_notes[i].m_nodes[j] = PTR2IDX(m_notes[i].m_nodes[j], base);
}
}
-#undef PTR2IDX
+#undef PTR2IDX
}
//
-void btSoftBody::indicesToPointers(const int* map)
+void btSoftBody::indicesToPointers(const int* map)
{
-#define IDX2PTR(_p_,_b_) map?(&(_b_)[map[(((char*)_p_)-(char*)0)]]): \
- (&(_b_)[(((char*)_p_)-(char*)0)])
- btSoftBody::Node* base=m_nodes.size() ? &m_nodes[0]:0;
- int i,ni;
+#define IDX2PTR(_p_, _b_) map ? (&(_b_)[map[(((char*)_p_) - (char*)0)]]) : (&(_b_)[(((char*)_p_) - (char*)0)])
+ btSoftBody::Node* base = m_nodes.size() ? &m_nodes[0] : 0;
+ int i, ni;
- for(i=0,ni=m_nodes.size();i<ni;++i)
+ for (i = 0, ni = m_nodes.size(); i < ni; ++i)
{
- if(m_nodes[i].m_leaf)
+ if (m_nodes[i].m_leaf)
{
- m_nodes[i].m_leaf->data=&m_nodes[i];
+ m_nodes[i].m_leaf->data = &m_nodes[i];
}
}
- for(i=0,ni=m_links.size();i<ni;++i)
+ for (i = 0, ni = m_links.size(); i < ni; ++i)
{
- m_links[i].m_n[0]=IDX2PTR(m_links[i].m_n[0],base);
- m_links[i].m_n[1]=IDX2PTR(m_links[i].m_n[1],base);
+ m_links[i].m_n[0] = IDX2PTR(m_links[i].m_n[0], base);
+ m_links[i].m_n[1] = IDX2PTR(m_links[i].m_n[1], base);
}
- for(i=0,ni=m_faces.size();i<ni;++i)
+ for (i = 0, ni = m_faces.size(); i < ni; ++i)
{
- m_faces[i].m_n[0]=IDX2PTR(m_faces[i].m_n[0],base);
- m_faces[i].m_n[1]=IDX2PTR(m_faces[i].m_n[1],base);
- m_faces[i].m_n[2]=IDX2PTR(m_faces[i].m_n[2],base);
- if(m_faces[i].m_leaf)
+ m_faces[i].m_n[0] = IDX2PTR(m_faces[i].m_n[0], base);
+ m_faces[i].m_n[1] = IDX2PTR(m_faces[i].m_n[1], base);
+ m_faces[i].m_n[2] = IDX2PTR(m_faces[i].m_n[2], base);
+ if (m_faces[i].m_leaf)
{
- m_faces[i].m_leaf->data=&m_faces[i];
+ m_faces[i].m_leaf->data = &m_faces[i];
}
}
- for(i=0,ni=m_anchors.size();i<ni;++i)
+ for (i = 0, ni = m_anchors.size(); i < ni; ++i)
{
- m_anchors[i].m_node=IDX2PTR(m_anchors[i].m_node,base);
+ m_anchors[i].m_node = IDX2PTR(m_anchors[i].m_node, base);
}
- for(i=0,ni=m_notes.size();i<ni;++i)
+ for (i = 0, ni = m_notes.size(); i < ni; ++i)
{
- for(int j=0;j<m_notes[i].m_rank;++j)
+ for (int j = 0; j < m_notes[i].m_rank; ++j)
{
- m_notes[i].m_nodes[j]=IDX2PTR(m_notes[i].m_nodes[j],base);
+ m_notes[i].m_nodes[j] = IDX2PTR(m_notes[i].m_nodes[j], base);
}
}
-#undef IDX2PTR
+#undef IDX2PTR
}
//
-int btSoftBody::rayTest(const btVector3& rayFrom,const btVector3& rayTo,
- btScalar& mint,eFeature::_& feature,int& index,bool bcountonly) const
+int btSoftBody::rayTest(const btVector3& rayFrom, const btVector3& rayTo,
+ btScalar& mint, eFeature::_& feature, int& index, bool bcountonly) const
{
- int cnt=0;
- btVector3 dir = rayTo-rayFrom;
-
+ int cnt = 0;
+ btVector3 dir = rayTo - rayFrom;
+
+ if (bcountonly || m_fdbvt.empty())
+ { /* Full search */
- if(bcountonly||m_fdbvt.empty())
- {/* Full search */
-
- for(int i=0,ni=m_faces.size();i<ni;++i)
+ for (int i = 0, ni = m_faces.size(); i < ni; ++i)
{
- const btSoftBody::Face& f=m_faces[i];
+ const btSoftBody::Face& f = m_faces[i];
- const btScalar t=RayFromToCaster::rayFromToTriangle( rayFrom,rayTo,dir,
- f.m_n[0]->m_x,
- f.m_n[1]->m_x,
- f.m_n[2]->m_x,
- mint);
- if(t>0)
+ const btScalar t = RayFromToCaster::rayFromToTriangle(rayFrom, rayTo, dir,
+ f.m_n[0]->m_x,
+ f.m_n[1]->m_x,
+ f.m_n[2]->m_x,
+ mint);
+ if (t > 0)
{
++cnt;
- if(!bcountonly)
+ if (!bcountonly)
{
- feature=btSoftBody::eFeature::Face;
- index=i;
- mint=t;
+ feature = btSoftBody::eFeature::Face;
+ index = i;
+ mint = t;
}
}
}
}
else
- {/* Use dbvt */
- RayFromToCaster collider(rayFrom,rayTo,mint);
+ { /* Use dbvt */
+ RayFromToCaster collider(rayFrom, rayTo, mint);
- btDbvt::rayTest(m_fdbvt.m_root,rayFrom,rayTo,collider);
- if(collider.m_face)
+ btDbvt::rayTest(m_fdbvt.m_root, rayFrom, rayTo, collider);
+ if (collider.m_face)
{
- mint=collider.m_mint;
- feature=btSoftBody::eFeature::Face;
- index=(int)(collider.m_face-&m_faces[0]);
- cnt=1;
+ mint = collider.m_mint;
+ feature = btSoftBody::eFeature::Face;
+ index = (int)(collider.m_face - &m_faces[0]);
+ cnt = 1;
}
}
- for (int i=0;i<m_tetras.size();i++)
+ for (int i = 0; i < m_tetras.size(); i++)
{
const btSoftBody::Tetra& tet = m_tetras[i];
- int tetfaces[4][3] = {{0,1,2},{0,1,3},{1,2,3},{0,2,3}};
- for (int f=0;f<4;f++)
+ int tetfaces[4][3] = {{0, 1, 2}, {0, 1, 3}, {1, 2, 3}, {0, 2, 3}};
+ for (int f = 0; f < 4; f++)
{
+ int index0 = tetfaces[f][0];
+ int index1 = tetfaces[f][1];
+ int index2 = tetfaces[f][2];
+ btVector3 v0 = tet.m_n[index0]->m_x;
+ btVector3 v1 = tet.m_n[index1]->m_x;
+ btVector3 v2 = tet.m_n[index2]->m_x;
- int index0=tetfaces[f][0];
- int index1=tetfaces[f][1];
- int index2=tetfaces[f][2];
- btVector3 v0=tet.m_n[index0]->m_x;
- btVector3 v1=tet.m_n[index1]->m_x;
- btVector3 v2=tet.m_n[index2]->m_x;
-
-
- const btScalar t=RayFromToCaster::rayFromToTriangle( rayFrom,rayTo,dir,
- v0,v1,v2,
- mint);
- if(t>0)
+ const btScalar t = RayFromToCaster::rayFromToTriangle(rayFrom, rayTo, dir,
+ v0, v1, v2,
+ mint);
+ if (t > 0)
{
++cnt;
- if(!bcountonly)
+ if (!bcountonly)
{
- feature=btSoftBody::eFeature::Tetra;
- index=i;
- mint=t;
+ feature = btSoftBody::eFeature::Tetra;
+ index = i;
+ mint = t;
}
}
}
}
- return(cnt);
+ return (cnt);
}
//
-void btSoftBody::initializeFaceTree()
+void btSoftBody::initializeFaceTree()
{
m_fdbvt.clear();
- for(int i=0;i<m_faces.size();++i)
+ for (int i = 0; i < m_faces.size(); ++i)
{
- Face& f=m_faces[i];
- f.m_leaf=m_fdbvt.insert(VolumeOf(f,0),&f);
+ Face& f = m_faces[i];
+ f.m_leaf = m_fdbvt.insert(VolumeOf(f, 0), &f);
}
}
//
-btVector3 btSoftBody::evaluateCom() const
+btVector3 btSoftBody::evaluateCom() const
{
- btVector3 com(0,0,0);
- if(m_pose.m_bframe)
+ btVector3 com(0, 0, 0);
+ if (m_pose.m_bframe)
{
- for(int i=0,ni=m_nodes.size();i<ni;++i)
+ for (int i = 0, ni = m_nodes.size(); i < ni; ++i)
{
- com+=m_nodes[i].m_x*m_pose.m_wgh[i];
+ com += m_nodes[i].m_x * m_pose.m_wgh[i];
}
}
- return(com);
+ return (com);
}
//
-bool btSoftBody::checkContact( const btCollisionObjectWrapper* colObjWrap,
- const btVector3& x,
- btScalar margin,
- btSoftBody::sCti& cti) const
+bool btSoftBody::checkContact(const btCollisionObjectWrapper* colObjWrap,
+ const btVector3& x,
+ btScalar margin,
+ btSoftBody::sCti& cti) const
{
btVector3 nrm;
- const btCollisionShape *shp = colObjWrap->getCollisionShape();
-// const btRigidBody *tmpRigid = btRigidBody::upcast(colObjWrap->getCollisionObject());
+ const btCollisionShape* shp = colObjWrap->getCollisionShape();
+ // const btRigidBody *tmpRigid = btRigidBody::upcast(colObjWrap->getCollisionObject());
//const btTransform &wtr = tmpRigid ? tmpRigid->getWorldTransform() : colObjWrap->getWorldTransform();
- const btTransform &wtr = colObjWrap->getWorldTransform();
+ const btTransform& wtr = colObjWrap->getWorldTransform();
//todo: check which transform is needed here
- btScalar dst =
- m_worldInfo->m_sparsesdf.Evaluate(
+ btScalar dst =
+ m_worldInfo->m_sparsesdf.Evaluate(
wtr.invXform(x),
shp,
nrm,
margin);
- if(dst<0)
+ if (dst < 0)
{
cti.m_colObj = colObjWrap->getCollisionObject();
- cti.m_normal = wtr.getBasis()*nrm;
- cti.m_offset = -btDot( cti.m_normal, x - cti.m_normal * dst );
- return(true);
+ cti.m_normal = wtr.getBasis() * nrm;
+ cti.m_offset = -btDot(cti.m_normal, x - cti.m_normal * dst);
+ return (true);
}
- return(false);
+ return (false);
}
//
-void btSoftBody::updateNormals()
+void btSoftBody::updateNormals()
{
+ const btVector3 zv(0, 0, 0);
+ int i, ni;
- const btVector3 zv(0,0,0);
- int i,ni;
-
- for(i=0,ni=m_nodes.size();i<ni;++i)
+ for (i = 0, ni = m_nodes.size(); i < ni; ++i)
{
- m_nodes[i].m_n=zv;
+ m_nodes[i].m_n = zv;
}
- for(i=0,ni=m_faces.size();i<ni;++i)
+ for (i = 0, ni = m_faces.size(); i < ni; ++i)
{
- btSoftBody::Face& f=m_faces[i];
- const btVector3 n=btCross(f.m_n[1]->m_x-f.m_n[0]->m_x,
- f.m_n[2]->m_x-f.m_n[0]->m_x);
- f.m_normal=n.normalized();
- f.m_n[0]->m_n+=n;
- f.m_n[1]->m_n+=n;
- f.m_n[2]->m_n+=n;
+ btSoftBody::Face& f = m_faces[i];
+ const btVector3 n = btCross(f.m_n[1]->m_x - f.m_n[0]->m_x,
+ f.m_n[2]->m_x - f.m_n[0]->m_x);
+ f.m_normal = n.normalized();
+ f.m_n[0]->m_n += n;
+ f.m_n[1]->m_n += n;
+ f.m_n[2]->m_n += n;
}
- for(i=0,ni=m_nodes.size();i<ni;++i)
+ for (i = 0, ni = m_nodes.size(); i < ni; ++i)
{
btScalar len = m_nodes[i].m_n.length();
- if (len>SIMD_EPSILON)
+ if (len > SIMD_EPSILON)
m_nodes[i].m_n /= len;
}
}
//
-void btSoftBody::updateBounds()
+void btSoftBody::updateBounds()
{
/*if( m_acceleratedSoftBody )
{
@@ -2317,258 +2333,259 @@ void btSoftBody::updateBounds()
m_bounds[1] = btVector3(1000, 1000, 1000);
} else {*/
- if(m_ndbvt.m_root)
- {
- const btVector3& mins=m_ndbvt.m_root->volume.Mins();
- const btVector3& maxs=m_ndbvt.m_root->volume.Maxs();
- const btScalar csm=getCollisionShape()->getMargin();
- const btVector3 mrg=btVector3( csm,
- csm,
- csm)*1; // ??? to investigate...
- m_bounds[0]=mins-mrg;
- m_bounds[1]=maxs+mrg;
- if(0!=getBroadphaseHandle())
- {
- m_worldInfo->m_broadphase->setAabb( getBroadphaseHandle(),
- m_bounds[0],
- m_bounds[1],
- m_worldInfo->m_dispatcher);
- }
- }
- else
+ if (m_ndbvt.m_root)
+ {
+ const btVector3& mins = m_ndbvt.m_root->volume.Mins();
+ const btVector3& maxs = m_ndbvt.m_root->volume.Maxs();
+ const btScalar csm = getCollisionShape()->getMargin();
+ const btVector3 mrg = btVector3(csm,
+ csm,
+ csm) *
+ 1; // ??? to investigate...
+ m_bounds[0] = mins - mrg;
+ m_bounds[1] = maxs + mrg;
+ if (0 != getBroadphaseHandle())
{
- m_bounds[0]=
- m_bounds[1]=btVector3(0,0,0);
- }
+ m_worldInfo->m_broadphase->setAabb(getBroadphaseHandle(),
+ m_bounds[0],
+ m_bounds[1],
+ m_worldInfo->m_dispatcher);
+ }
+ }
+ else
+ {
+ m_bounds[0] =
+ m_bounds[1] = btVector3(0, 0, 0);
+ }
//}
}
-
//
-void btSoftBody::updatePose()
+void btSoftBody::updatePose()
{
- if(m_pose.m_bframe)
+ if (m_pose.m_bframe)
{
- btSoftBody::Pose& pose=m_pose;
- const btVector3 com=evaluateCom();
- /* Com */
- pose.m_com = com;
- /* Rotation */
- btMatrix3x3 Apq;
- const btScalar eps=SIMD_EPSILON;
- Apq[0]=Apq[1]=Apq[2]=btVector3(0,0,0);
- Apq[0].setX(eps);Apq[1].setY(eps*2);Apq[2].setZ(eps*3);
- for(int i=0,ni=m_nodes.size();i<ni;++i)
+ btSoftBody::Pose& pose = m_pose;
+ const btVector3 com = evaluateCom();
+ /* Com */
+ pose.m_com = com;
+ /* Rotation */
+ btMatrix3x3 Apq;
+ const btScalar eps = SIMD_EPSILON;
+ Apq[0] = Apq[1] = Apq[2] = btVector3(0, 0, 0);
+ Apq[0].setX(eps);
+ Apq[1].setY(eps * 2);
+ Apq[2].setZ(eps * 3);
+ for (int i = 0, ni = m_nodes.size(); i < ni; ++i)
{
- const btVector3 a=pose.m_wgh[i]*(m_nodes[i].m_x-com);
- const btVector3& b=pose.m_pos[i];
- Apq[0]+=a.x()*b;
- Apq[1]+=a.y()*b;
- Apq[2]+=a.z()*b;
+ const btVector3 a = pose.m_wgh[i] * (m_nodes[i].m_x - com);
+ const btVector3& b = pose.m_pos[i];
+ Apq[0] += a.x() * b;
+ Apq[1] += a.y() * b;
+ Apq[2] += a.z() * b;
}
- btMatrix3x3 r,s;
- PolarDecompose(Apq,r,s);
- pose.m_rot=r;
- pose.m_scl=pose.m_aqq*r.transpose()*Apq;
- if(m_cfg.maxvolume>1)
+ btMatrix3x3 r, s;
+ PolarDecompose(Apq, r, s);
+ pose.m_rot = r;
+ pose.m_scl = pose.m_aqq * r.transpose() * Apq;
+ if (m_cfg.maxvolume > 1)
{
- const btScalar idet=Clamp<btScalar>( 1/pose.m_scl.determinant(),
- 1,m_cfg.maxvolume);
- pose.m_scl=Mul(pose.m_scl,idet);
+ const btScalar idet = Clamp<btScalar>(1 / pose.m_scl.determinant(),
+ 1, m_cfg.maxvolume);
+ pose.m_scl = Mul(pose.m_scl, idet);
}
-
}
}
//
-void btSoftBody::updateArea(bool averageArea)
+void btSoftBody::updateArea(bool averageArea)
{
- int i,ni;
+ int i, ni;
- /* Face area */
- for(i=0,ni=m_faces.size();i<ni;++i)
+ /* Face area */
+ for (i = 0, ni = m_faces.size(); i < ni; ++i)
{
- Face& f=m_faces[i];
- f.m_ra = AreaOf(f.m_n[0]->m_x,f.m_n[1]->m_x,f.m_n[2]->m_x);
+ Face& f = m_faces[i];
+ f.m_ra = AreaOf(f.m_n[0]->m_x, f.m_n[1]->m_x, f.m_n[2]->m_x);
}
-
- /* Node area */
+
+ /* Node area */
if (averageArea)
{
- btAlignedObjectArray<int> counts;
- counts.resize(m_nodes.size(),0);
- for(i=0,ni=m_nodes.size();i<ni;++i)
+ btAlignedObjectArray<int> counts;
+ counts.resize(m_nodes.size(), 0);
+ for (i = 0, ni = m_nodes.size(); i < ni; ++i)
{
- m_nodes[i].m_area = 0;
+ m_nodes[i].m_area = 0;
}
- for(i=0,ni=m_faces.size();i<ni;++i)
+ for (i = 0, ni = m_faces.size(); i < ni; ++i)
{
- btSoftBody::Face& f=m_faces[i];
- for(int j=0;j<3;++j)
+ btSoftBody::Face& f = m_faces[i];
+ for (int j = 0; j < 3; ++j)
{
- const int index=(int)(f.m_n[j]-&m_nodes[0]);
+ const int index = (int)(f.m_n[j] - &m_nodes[0]);
counts[index]++;
- f.m_n[j]->m_area+=btFabs(f.m_ra);
+ f.m_n[j]->m_area += btFabs(f.m_ra);
}
}
- for(i=0,ni=m_nodes.size();i<ni;++i)
+ for (i = 0, ni = m_nodes.size(); i < ni; ++i)
{
- if(counts[i]>0)
- m_nodes[i].m_area/=(btScalar)counts[i];
+ if (counts[i] > 0)
+ m_nodes[i].m_area /= (btScalar)counts[i];
else
- m_nodes[i].m_area=0;
+ m_nodes[i].m_area = 0;
}
}
else
{
// initialize node area as zero
- for(i=0,ni=m_nodes.size();i<ni;++i)
+ for (i = 0, ni = m_nodes.size(); i < ni; ++i)
{
- m_nodes[i].m_area=0;
+ m_nodes[i].m_area = 0;
}
- for(i=0,ni=m_faces.size();i<ni;++i)
+ for (i = 0, ni = m_faces.size(); i < ni; ++i)
{
- btSoftBody::Face& f=m_faces[i];
+ btSoftBody::Face& f = m_faces[i];
- for(int j=0;j<3;++j)
+ for (int j = 0; j < 3; ++j)
{
f.m_n[j]->m_area += f.m_ra;
}
}
- for(i=0,ni=m_nodes.size();i<ni;++i)
+ for (i = 0, ni = m_nodes.size(); i < ni; ++i)
{
m_nodes[i].m_area *= 0.3333333f;
}
}
}
+void btSoftBody::updateLinkConstants()
+{
+ int i, ni;
-void btSoftBody::updateLinkConstants()
-{
- int i,ni;
-
- /* Links */
- for(i=0,ni=m_links.size();i<ni;++i)
+ /* Links */
+ for (i = 0, ni = m_links.size(); i < ni; ++i)
{
- Link& l=m_links[i];
- Material& m=*l.m_material;
- l.m_c0 = (l.m_n[0]->m_im+l.m_n[1]->m_im)/m.m_kLST;
+ Link& l = m_links[i];
+ Material& m = *l.m_material;
+ l.m_c0 = (l.m_n[0]->m_im + l.m_n[1]->m_im) / m.m_kLST;
}
}
-void btSoftBody::updateConstants()
+void btSoftBody::updateConstants()
{
resetLinkRestLengths();
updateLinkConstants();
updateArea();
}
-
-
//
-void btSoftBody::initializeClusters()
+void btSoftBody::initializeClusters()
{
int i;
- for( i=0;i<m_clusters.size();++i)
+ for (i = 0; i < m_clusters.size(); ++i)
{
- Cluster& c=*m_clusters[i];
- c.m_imass=0;
+ Cluster& c = *m_clusters[i];
+ c.m_imass = 0;
c.m_masses.resize(c.m_nodes.size());
- for(int j=0;j<c.m_nodes.size();++j)
+ for (int j = 0; j < c.m_nodes.size(); ++j)
{
- if (c.m_nodes[j]->m_im==0)
+ if (c.m_nodes[j]->m_im == 0)
{
c.m_containsAnchor = true;
- c.m_masses[j] = BT_LARGE_FLOAT;
- } else
+ c.m_masses[j] = BT_LARGE_FLOAT;
+ }
+ else
{
- c.m_masses[j] = btScalar(1.)/c.m_nodes[j]->m_im;
+ c.m_masses[j] = btScalar(1.) / c.m_nodes[j]->m_im;
}
- c.m_imass += c.m_masses[j];
+ c.m_imass += c.m_masses[j];
}
- c.m_imass = btScalar(1.)/c.m_imass;
- c.m_com = btSoftBody::clusterCom(&c);
- c.m_lv = btVector3(0,0,0);
- c.m_av = btVector3(0,0,0);
- c.m_leaf = 0;
- /* Inertia */
- btMatrix3x3& ii=c.m_locii;
- ii[0]=ii[1]=ii[2]=btVector3(0,0,0);
+ c.m_imass = btScalar(1.) / c.m_imass;
+ c.m_com = btSoftBody::clusterCom(&c);
+ c.m_lv = btVector3(0, 0, 0);
+ c.m_av = btVector3(0, 0, 0);
+ c.m_leaf = 0;
+ /* Inertia */
+ btMatrix3x3& ii = c.m_locii;
+ ii[0] = ii[1] = ii[2] = btVector3(0, 0, 0);
{
- int i,ni;
+ int i, ni;
- for(i=0,ni=c.m_nodes.size();i<ni;++i)
+ for (i = 0, ni = c.m_nodes.size(); i < ni; ++i)
{
- const btVector3 k=c.m_nodes[i]->m_x-c.m_com;
- const btVector3 q=k*k;
- const btScalar m=c.m_masses[i];
- ii[0][0] += m*(q[1]+q[2]);
- ii[1][1] += m*(q[0]+q[2]);
- ii[2][2] += m*(q[0]+q[1]);
- ii[0][1] -= m*k[0]*k[1];
- ii[0][2] -= m*k[0]*k[2];
- ii[1][2] -= m*k[1]*k[2];
+ const btVector3 k = c.m_nodes[i]->m_x - c.m_com;
+ const btVector3 q = k * k;
+ const btScalar m = c.m_masses[i];
+ ii[0][0] += m * (q[1] + q[2]);
+ ii[1][1] += m * (q[0] + q[2]);
+ ii[2][2] += m * (q[0] + q[1]);
+ ii[0][1] -= m * k[0] * k[1];
+ ii[0][2] -= m * k[0] * k[2];
+ ii[1][2] -= m * k[1] * k[2];
}
}
- ii[1][0]=ii[0][1];
- ii[2][0]=ii[0][2];
- ii[2][1]=ii[1][2];
-
+ ii[1][0] = ii[0][1];
+ ii[2][0] = ii[0][2];
+ ii[2][1] = ii[1][2];
+
ii = ii.inverse();
- /* Frame */
+ /* Frame */
c.m_framexform.setIdentity();
c.m_framexform.setOrigin(c.m_com);
c.m_framerefs.resize(c.m_nodes.size());
{
int i;
- for(i=0;i<c.m_framerefs.size();++i)
+ for (i = 0; i < c.m_framerefs.size(); ++i)
{
- c.m_framerefs[i]=c.m_nodes[i]->m_x-c.m_com;
+ c.m_framerefs[i] = c.m_nodes[i]->m_x - c.m_com;
}
}
}
}
//
-void btSoftBody::updateClusters()
+void btSoftBody::updateClusters()
{
BT_PROFILE("UpdateClusters");
int i;
- for(i=0;i<m_clusters.size();++i)
+ for (i = 0; i < m_clusters.size(); ++i)
{
- btSoftBody::Cluster& c=*m_clusters[i];
- const int n=c.m_nodes.size();
+ btSoftBody::Cluster& c = *m_clusters[i];
+ const int n = c.m_nodes.size();
//const btScalar invn=1/(btScalar)n;
- if(n)
- {
- /* Frame */
- const btScalar eps=btScalar(0.0001);
- btMatrix3x3 m,r,s;
- m[0]=m[1]=m[2]=btVector3(0,0,0);
- m[0][0]=eps*1;
- m[1][1]=eps*2;
- m[2][2]=eps*3;
- c.m_com=clusterCom(&c);
- for(int i=0;i<c.m_nodes.size();++i)
- {
- const btVector3 a=c.m_nodes[i]->m_x-c.m_com;
- const btVector3& b=c.m_framerefs[i];
- m[0]+=a[0]*b;m[1]+=a[1]*b;m[2]+=a[2]*b;
- }
- PolarDecompose(m,r,s);
+ if (n)
+ {
+ /* Frame */
+ const btScalar eps = btScalar(0.0001);
+ btMatrix3x3 m, r, s;
+ m[0] = m[1] = m[2] = btVector3(0, 0, 0);
+ m[0][0] = eps * 1;
+ m[1][1] = eps * 2;
+ m[2][2] = eps * 3;
+ c.m_com = clusterCom(&c);
+ for (int i = 0; i < c.m_nodes.size(); ++i)
+ {
+ const btVector3 a = c.m_nodes[i]->m_x - c.m_com;
+ const btVector3& b = c.m_framerefs[i];
+ m[0] += a[0] * b;
+ m[1] += a[1] * b;
+ m[2] += a[2] * b;
+ }
+ PolarDecompose(m, r, s);
c.m_framexform.setOrigin(c.m_com);
- c.m_framexform.setBasis(r);
- /* Inertia */
-#if 1/* Constant */
- c.m_invwi=c.m_framexform.getBasis()*c.m_locii*c.m_framexform.getBasis().transpose();
+ c.m_framexform.setBasis(r);
+ /* Inertia */
+#if 1 /* Constant */
+ c.m_invwi = c.m_framexform.getBasis() * c.m_locii * c.m_framexform.getBasis().transpose();
#else
-#if 0/* Sphere */
+#if 0 /* Sphere */
const btScalar rk=(2*c.m_extents.length2())/(5*c.m_imass);
const btVector3 inertia(rk,rk,rk);
const btVector3 iin(btFabs(inertia[0])>SIMD_EPSILON?1/inertia[0]:0,
@@ -2576,186 +2593,181 @@ void btSoftBody::updateClusters()
btFabs(inertia[2])>SIMD_EPSILON?1/inertia[2]:0);
c.m_invwi=c.m_xform.getBasis().scaled(iin)*c.m_xform.getBasis().transpose();
-#else/* Actual */
- c.m_invwi[0]=c.m_invwi[1]=c.m_invwi[2]=btVector3(0,0,0);
- for(int i=0;i<n;++i)
- {
- const btVector3 k=c.m_nodes[i]->m_x-c.m_com;
- const btVector3 q=k*k;
- const btScalar m=1/c.m_nodes[i]->m_im;
- c.m_invwi[0][0] += m*(q[1]+q[2]);
- c.m_invwi[1][1] += m*(q[0]+q[2]);
- c.m_invwi[2][2] += m*(q[0]+q[1]);
- c.m_invwi[0][1] -= m*k[0]*k[1];
- c.m_invwi[0][2] -= m*k[0]*k[2];
- c.m_invwi[1][2] -= m*k[1]*k[2];
- }
- c.m_invwi[1][0]=c.m_invwi[0][1];
- c.m_invwi[2][0]=c.m_invwi[0][2];
- c.m_invwi[2][1]=c.m_invwi[1][2];
- c.m_invwi=c.m_invwi.inverse();
+#else /* Actual */
+ c.m_invwi[0] = c.m_invwi[1] = c.m_invwi[2] = btVector3(0, 0, 0);
+ for (int i = 0; i < n; ++i)
+ {
+ const btVector3 k = c.m_nodes[i]->m_x - c.m_com;
+ const btVector3 q = k * k;
+ const btScalar m = 1 / c.m_nodes[i]->m_im;
+ c.m_invwi[0][0] += m * (q[1] + q[2]);
+ c.m_invwi[1][1] += m * (q[0] + q[2]);
+ c.m_invwi[2][2] += m * (q[0] + q[1]);
+ c.m_invwi[0][1] -= m * k[0] * k[1];
+ c.m_invwi[0][2] -= m * k[0] * k[2];
+ c.m_invwi[1][2] -= m * k[1] * k[2];
+ }
+ c.m_invwi[1][0] = c.m_invwi[0][1];
+ c.m_invwi[2][0] = c.m_invwi[0][2];
+ c.m_invwi[2][1] = c.m_invwi[1][2];
+ c.m_invwi = c.m_invwi.inverse();
#endif
#endif
- /* Velocities */
- c.m_lv=btVector3(0,0,0);
- c.m_av=btVector3(0,0,0);
+ /* Velocities */
+ c.m_lv = btVector3(0, 0, 0);
+ c.m_av = btVector3(0, 0, 0);
{
int i;
- for(i=0;i<n;++i)
+ for (i = 0; i < n; ++i)
{
- const btVector3 v=c.m_nodes[i]->m_v*c.m_masses[i];
- c.m_lv += v;
- c.m_av += btCross(c.m_nodes[i]->m_x-c.m_com,v);
+ const btVector3 v = c.m_nodes[i]->m_v * c.m_masses[i];
+ c.m_lv += v;
+ c.m_av += btCross(c.m_nodes[i]->m_x - c.m_com, v);
}
}
- c.m_lv=c.m_imass*c.m_lv*(1-c.m_ldamping);
- c.m_av=c.m_invwi*c.m_av*(1-c.m_adamping);
- c.m_vimpulses[0] =
- c.m_vimpulses[1] = btVector3(0,0,0);
- c.m_dimpulses[0] =
- c.m_dimpulses[1] = btVector3(0,0,0);
- c.m_nvimpulses = 0;
- c.m_ndimpulses = 0;
- /* Matching */
- if(c.m_matching>0)
- {
- for(int j=0;j<c.m_nodes.size();++j)
+ c.m_lv = c.m_imass * c.m_lv * (1 - c.m_ldamping);
+ c.m_av = c.m_invwi * c.m_av * (1 - c.m_adamping);
+ c.m_vimpulses[0] =
+ c.m_vimpulses[1] = btVector3(0, 0, 0);
+ c.m_dimpulses[0] =
+ c.m_dimpulses[1] = btVector3(0, 0, 0);
+ c.m_nvimpulses = 0;
+ c.m_ndimpulses = 0;
+ /* Matching */
+ if (c.m_matching > 0)
+ {
+ for (int j = 0; j < c.m_nodes.size(); ++j)
{
- Node& n=*c.m_nodes[j];
- const btVector3 x=c.m_framexform*c.m_framerefs[j];
- n.m_x=Lerp(n.m_x,x,c.m_matching);
+ Node& n = *c.m_nodes[j];
+ const btVector3 x = c.m_framexform * c.m_framerefs[j];
+ n.m_x = Lerp(n.m_x, x, c.m_matching);
}
- }
- /* Dbvt */
- if(c.m_collide)
+ }
+ /* Dbvt */
+ if (c.m_collide)
{
- btVector3 mi=c.m_nodes[0]->m_x;
- btVector3 mx=mi;
- for(int j=1;j<n;++j)
+ btVector3 mi = c.m_nodes[0]->m_x;
+ btVector3 mx = mi;
+ for (int j = 1; j < n; ++j)
{
mi.setMin(c.m_nodes[j]->m_x);
mx.setMax(c.m_nodes[j]->m_x);
- }
- ATTRIBUTE_ALIGNED16(btDbvtVolume) bounds=btDbvtVolume::FromMM(mi,mx);
- if(c.m_leaf)
- m_cdbvt.update(c.m_leaf,bounds,c.m_lv*m_sst.sdt*3,m_sst.radmrg);
+ }
+ ATTRIBUTE_ALIGNED16(btDbvtVolume)
+ bounds = btDbvtVolume::FromMM(mi, mx);
+ if (c.m_leaf)
+ m_cdbvt.update(c.m_leaf, bounds, c.m_lv * m_sst.sdt * 3, m_sst.radmrg);
else
- c.m_leaf=m_cdbvt.insert(bounds,&c);
+ c.m_leaf = m_cdbvt.insert(bounds, &c);
}
}
}
-
-
}
-
-
-
//
-void btSoftBody::cleanupClusters()
+void btSoftBody::cleanupClusters()
{
- for(int i=0;i<m_joints.size();++i)
+ for (int i = 0; i < m_joints.size(); ++i)
{
m_joints[i]->Terminate(m_sst.sdt);
- if(m_joints[i]->m_delete)
+ if (m_joints[i]->m_delete)
{
btAlignedFree(m_joints[i]);
m_joints.remove(m_joints[i--]);
- }
+ }
}
}
//
-void btSoftBody::prepareClusters(int iterations)
+void btSoftBody::prepareClusters(int iterations)
{
- for(int i=0;i<m_joints.size();++i)
+ for (int i = 0; i < m_joints.size(); ++i)
{
- m_joints[i]->Prepare(m_sst.sdt,iterations);
+ m_joints[i]->Prepare(m_sst.sdt, iterations);
}
}
-
//
-void btSoftBody::solveClusters(btScalar sor)
+void btSoftBody::solveClusters(btScalar sor)
{
- for(int i=0,ni=m_joints.size();i<ni;++i)
+ for (int i = 0, ni = m_joints.size(); i < ni; ++i)
{
- m_joints[i]->Solve(m_sst.sdt,sor);
+ m_joints[i]->Solve(m_sst.sdt, sor);
}
}
//
-void btSoftBody::applyClusters(bool drift)
+void btSoftBody::applyClusters(bool drift)
{
BT_PROFILE("ApplyClusters");
-// const btScalar f0=m_sst.sdt;
+ // const btScalar f0=m_sst.sdt;
//const btScalar f1=f0/2;
btAlignedObjectArray<btVector3> deltas;
btAlignedObjectArray<btScalar> weights;
- deltas.resize(m_nodes.size(),btVector3(0,0,0));
- weights.resize(m_nodes.size(),0);
+ deltas.resize(m_nodes.size(), btVector3(0, 0, 0));
+ weights.resize(m_nodes.size(), 0);
int i;
- if(drift)
+ if (drift)
{
- for(i=0;i<m_clusters.size();++i)
+ for (i = 0; i < m_clusters.size(); ++i)
{
- Cluster& c=*m_clusters[i];
- if(c.m_ndimpulses)
+ Cluster& c = *m_clusters[i];
+ if (c.m_ndimpulses)
{
- c.m_dimpulses[0]/=(btScalar)c.m_ndimpulses;
- c.m_dimpulses[1]/=(btScalar)c.m_ndimpulses;
+ c.m_dimpulses[0] /= (btScalar)c.m_ndimpulses;
+ c.m_dimpulses[1] /= (btScalar)c.m_ndimpulses;
}
}
}
-
- for(i=0;i<m_clusters.size();++i)
+
+ for (i = 0; i < m_clusters.size(); ++i)
{
- Cluster& c=*m_clusters[i];
- if(0<(drift?c.m_ndimpulses:c.m_nvimpulses))
+ Cluster& c = *m_clusters[i];
+ if (0 < (drift ? c.m_ndimpulses : c.m_nvimpulses))
{
- const btVector3 v=(drift?c.m_dimpulses[0]:c.m_vimpulses[0])*m_sst.sdt;
- const btVector3 w=(drift?c.m_dimpulses[1]:c.m_vimpulses[1])*m_sst.sdt;
- for(int j=0;j<c.m_nodes.size();++j)
+ const btVector3 v = (drift ? c.m_dimpulses[0] : c.m_vimpulses[0]) * m_sst.sdt;
+ const btVector3 w = (drift ? c.m_dimpulses[1] : c.m_vimpulses[1]) * m_sst.sdt;
+ for (int j = 0; j < c.m_nodes.size(); ++j)
{
- const int idx=int(c.m_nodes[j]-&m_nodes[0]);
- const btVector3& x=c.m_nodes[j]->m_x;
- const btScalar q=c.m_masses[j];
- deltas[idx] += (v+btCross(w,x-c.m_com))*q;
- weights[idx] += q;
+ const int idx = int(c.m_nodes[j] - &m_nodes[0]);
+ const btVector3& x = c.m_nodes[j]->m_x;
+ const btScalar q = c.m_masses[j];
+ deltas[idx] += (v + btCross(w, x - c.m_com)) * q;
+ weights[idx] += q;
}
}
}
- for(i=0;i<deltas.size();++i)
+ for (i = 0; i < deltas.size(); ++i)
{
- if(weights[i]>0)
+ if (weights[i] > 0)
{
- m_nodes[i].m_x+=deltas[i]/weights[i];
+ m_nodes[i].m_x += deltas[i] / weights[i];
}
}
}
//
-void btSoftBody::dampClusters()
+void btSoftBody::dampClusters()
{
int i;
- for(i=0;i<m_clusters.size();++i)
+ for (i = 0; i < m_clusters.size(); ++i)
{
- Cluster& c=*m_clusters[i];
- if(c.m_ndamping>0)
+ Cluster& c = *m_clusters[i];
+ if (c.m_ndamping > 0)
{
- for(int j=0;j<c.m_nodes.size();++j)
+ for (int j = 0; j < c.m_nodes.size(); ++j)
{
- Node& n=*c.m_nodes[j];
- if(n.m_im>0)
+ Node& n = *c.m_nodes[j];
+ if (n.m_im > 0)
{
- const btVector3 vx=c.m_lv+btCross(c.m_av,c.m_nodes[j]->m_q-c.m_com);
- if(vx.length2()<=n.m_v.length2())
- {
- n.m_v += c.m_ndamping*(vx-n.m_v);
- }
+ const btVector3 vx = c.m_lv + btCross(c.m_av, c.m_nodes[j]->m_q - c.m_com);
+ if (vx.length2() <= n.m_v.length2())
+ {
+ n.m_v += c.m_ndamping * (vx - n.m_v);
+ }
}
}
}
@@ -2763,710 +2775,696 @@ void btSoftBody::dampClusters()
}
//
-void btSoftBody::Joint::Prepare(btScalar dt,int)
+void btSoftBody::Joint::Prepare(btScalar dt, int)
{
m_bodies[0].activate();
m_bodies[1].activate();
}
//
-void btSoftBody::LJoint::Prepare(btScalar dt,int iterations)
+void btSoftBody::LJoint::Prepare(btScalar dt, int iterations)
{
- static const btScalar maxdrift=4;
- Joint::Prepare(dt,iterations);
- m_rpos[0] = m_bodies[0].xform()*m_refs[0];
- m_rpos[1] = m_bodies[1].xform()*m_refs[1];
- m_drift = Clamp(m_rpos[0]-m_rpos[1],maxdrift)*m_erp/dt;
- m_rpos[0] -= m_bodies[0].xform().getOrigin();
- m_rpos[1] -= m_bodies[1].xform().getOrigin();
- m_massmatrix = ImpulseMatrix( m_bodies[0].invMass(),m_bodies[0].invWorldInertia(),m_rpos[0],
- m_bodies[1].invMass(),m_bodies[1].invWorldInertia(),m_rpos[1]);
- if(m_split>0)
+ static const btScalar maxdrift = 4;
+ Joint::Prepare(dt, iterations);
+ m_rpos[0] = m_bodies[0].xform() * m_refs[0];
+ m_rpos[1] = m_bodies[1].xform() * m_refs[1];
+ m_drift = Clamp(m_rpos[0] - m_rpos[1], maxdrift) * m_erp / dt;
+ m_rpos[0] -= m_bodies[0].xform().getOrigin();
+ m_rpos[1] -= m_bodies[1].xform().getOrigin();
+ m_massmatrix = ImpulseMatrix(m_bodies[0].invMass(), m_bodies[0].invWorldInertia(), m_rpos[0],
+ m_bodies[1].invMass(), m_bodies[1].invWorldInertia(), m_rpos[1]);
+ if (m_split > 0)
{
- m_sdrift = m_massmatrix*(m_drift*m_split);
- m_drift *= 1-m_split;
+ m_sdrift = m_massmatrix * (m_drift * m_split);
+ m_drift *= 1 - m_split;
}
- m_drift /=(btScalar)iterations;
+ m_drift /= (btScalar)iterations;
}
//
-void btSoftBody::LJoint::Solve(btScalar dt,btScalar sor)
+void btSoftBody::LJoint::Solve(btScalar dt, btScalar sor)
{
- const btVector3 va=m_bodies[0].velocity(m_rpos[0]);
- const btVector3 vb=m_bodies[1].velocity(m_rpos[1]);
- const btVector3 vr=va-vb;
- btSoftBody::Impulse impulse;
- impulse.m_asVelocity = 1;
- impulse.m_velocity = m_massmatrix*(m_drift+vr*m_cfm)*sor;
- m_bodies[0].applyImpulse(-impulse,m_rpos[0]);
- m_bodies[1].applyImpulse( impulse,m_rpos[1]);
+ const btVector3 va = m_bodies[0].velocity(m_rpos[0]);
+ const btVector3 vb = m_bodies[1].velocity(m_rpos[1]);
+ const btVector3 vr = va - vb;
+ btSoftBody::Impulse impulse;
+ impulse.m_asVelocity = 1;
+ impulse.m_velocity = m_massmatrix * (m_drift + vr * m_cfm) * sor;
+ m_bodies[0].applyImpulse(-impulse, m_rpos[0]);
+ m_bodies[1].applyImpulse(impulse, m_rpos[1]);
}
//
-void btSoftBody::LJoint::Terminate(btScalar dt)
+void btSoftBody::LJoint::Terminate(btScalar dt)
{
- if(m_split>0)
+ if (m_split > 0)
{
- m_bodies[0].applyDImpulse(-m_sdrift,m_rpos[0]);
- m_bodies[1].applyDImpulse( m_sdrift,m_rpos[1]);
+ m_bodies[0].applyDImpulse(-m_sdrift, m_rpos[0]);
+ m_bodies[1].applyDImpulse(m_sdrift, m_rpos[1]);
}
}
//
-void btSoftBody::AJoint::Prepare(btScalar dt,int iterations)
+void btSoftBody::AJoint::Prepare(btScalar dt, int iterations)
{
- static const btScalar maxdrift=SIMD_PI/16;
+ static const btScalar maxdrift = SIMD_PI / 16;
m_icontrol->Prepare(this);
- Joint::Prepare(dt,iterations);
- m_axis[0] = m_bodies[0].xform().getBasis()*m_refs[0];
- m_axis[1] = m_bodies[1].xform().getBasis()*m_refs[1];
- m_drift = NormalizeAny(btCross(m_axis[1],m_axis[0]));
- m_drift *= btMin(maxdrift,btAcos(Clamp<btScalar>(btDot(m_axis[0],m_axis[1]),-1,+1)));
- m_drift *= m_erp/dt;
- m_massmatrix= AngularImpulseMatrix(m_bodies[0].invWorldInertia(),m_bodies[1].invWorldInertia());
- if(m_split>0)
+ Joint::Prepare(dt, iterations);
+ m_axis[0] = m_bodies[0].xform().getBasis() * m_refs[0];
+ m_axis[1] = m_bodies[1].xform().getBasis() * m_refs[1];
+ m_drift = NormalizeAny(btCross(m_axis[1], m_axis[0]));
+ m_drift *= btMin(maxdrift, btAcos(Clamp<btScalar>(btDot(m_axis[0], m_axis[1]), -1, +1)));
+ m_drift *= m_erp / dt;
+ m_massmatrix = AngularImpulseMatrix(m_bodies[0].invWorldInertia(), m_bodies[1].invWorldInertia());
+ if (m_split > 0)
{
- m_sdrift = m_massmatrix*(m_drift*m_split);
- m_drift *= 1-m_split;
+ m_sdrift = m_massmatrix * (m_drift * m_split);
+ m_drift *= 1 - m_split;
}
- m_drift /=(btScalar)iterations;
+ m_drift /= (btScalar)iterations;
}
//
-void btSoftBody::AJoint::Solve(btScalar dt,btScalar sor)
+void btSoftBody::AJoint::Solve(btScalar dt, btScalar sor)
{
- const btVector3 va=m_bodies[0].angularVelocity();
- const btVector3 vb=m_bodies[1].angularVelocity();
- const btVector3 vr=va-vb;
- const btScalar sp=btDot(vr,m_axis[0]);
- const btVector3 vc=vr-m_axis[0]*m_icontrol->Speed(this,sp);
- btSoftBody::Impulse impulse;
- impulse.m_asVelocity = 1;
- impulse.m_velocity = m_massmatrix*(m_drift+vc*m_cfm)*sor;
+ const btVector3 va = m_bodies[0].angularVelocity();
+ const btVector3 vb = m_bodies[1].angularVelocity();
+ const btVector3 vr = va - vb;
+ const btScalar sp = btDot(vr, m_axis[0]);
+ const btVector3 vc = vr - m_axis[0] * m_icontrol->Speed(this, sp);
+ btSoftBody::Impulse impulse;
+ impulse.m_asVelocity = 1;
+ impulse.m_velocity = m_massmatrix * (m_drift + vc * m_cfm) * sor;
m_bodies[0].applyAImpulse(-impulse);
- m_bodies[1].applyAImpulse( impulse);
+ m_bodies[1].applyAImpulse(impulse);
}
//
-void btSoftBody::AJoint::Terminate(btScalar dt)
+void btSoftBody::AJoint::Terminate(btScalar dt)
{
- if(m_split>0)
+ if (m_split > 0)
{
m_bodies[0].applyDAImpulse(-m_sdrift);
- m_bodies[1].applyDAImpulse( m_sdrift);
+ m_bodies[1].applyDAImpulse(m_sdrift);
}
}
//
-void btSoftBody::CJoint::Prepare(btScalar dt,int iterations)
+void btSoftBody::CJoint::Prepare(btScalar dt, int iterations)
{
- Joint::Prepare(dt,iterations);
- const bool dodrift=(m_life==0);
- m_delete=(++m_life)>m_maxlife;
- if(dodrift)
+ Joint::Prepare(dt, iterations);
+ const bool dodrift = (m_life == 0);
+ m_delete = (++m_life) > m_maxlife;
+ if (dodrift)
{
- m_drift=m_drift*m_erp/dt;
- if(m_split>0)
+ m_drift = m_drift * m_erp / dt;
+ if (m_split > 0)
{
- m_sdrift = m_massmatrix*(m_drift*m_split);
- m_drift *= 1-m_split;
+ m_sdrift = m_massmatrix * (m_drift * m_split);
+ m_drift *= 1 - m_split;
}
- m_drift/=(btScalar)iterations;
+ m_drift /= (btScalar)iterations;
}
else
{
- m_drift=m_sdrift=btVector3(0,0,0);
+ m_drift = m_sdrift = btVector3(0, 0, 0);
}
}
//
-void btSoftBody::CJoint::Solve(btScalar dt,btScalar sor)
+void btSoftBody::CJoint::Solve(btScalar dt, btScalar sor)
{
- const btVector3 va=m_bodies[0].velocity(m_rpos[0]);
- const btVector3 vb=m_bodies[1].velocity(m_rpos[1]);
- const btVector3 vrel=va-vb;
- const btScalar rvac=btDot(vrel,m_normal);
- btSoftBody::Impulse impulse;
- impulse.m_asVelocity = 1;
- impulse.m_velocity = m_drift;
- if(rvac<0)
+ const btVector3 va = m_bodies[0].velocity(m_rpos[0]);
+ const btVector3 vb = m_bodies[1].velocity(m_rpos[1]);
+ const btVector3 vrel = va - vb;
+ const btScalar rvac = btDot(vrel, m_normal);
+ btSoftBody::Impulse impulse;
+ impulse.m_asVelocity = 1;
+ impulse.m_velocity = m_drift;
+ if (rvac < 0)
{
- const btVector3 iv=m_normal*rvac;
- const btVector3 fv=vrel-iv;
- impulse.m_velocity += iv+fv*m_friction;
+ const btVector3 iv = m_normal * rvac;
+ const btVector3 fv = vrel - iv;
+ impulse.m_velocity += iv + fv * m_friction;
}
- impulse.m_velocity=m_massmatrix*impulse.m_velocity*sor;
-
- if (m_bodies[0].m_soft==m_bodies[1].m_soft)
+ impulse.m_velocity = m_massmatrix * impulse.m_velocity * sor;
+
+ if (m_bodies[0].m_soft == m_bodies[1].m_soft)
{
- if ((impulse.m_velocity.getX() ==impulse.m_velocity.getX())&&(impulse.m_velocity.getY() ==impulse.m_velocity.getY())&&
- (impulse.m_velocity.getZ() ==impulse.m_velocity.getZ()))
+ if ((impulse.m_velocity.getX() == impulse.m_velocity.getX()) && (impulse.m_velocity.getY() == impulse.m_velocity.getY()) &&
+ (impulse.m_velocity.getZ() == impulse.m_velocity.getZ()))
{
if (impulse.m_asVelocity)
{
- if (impulse.m_velocity.length() <m_bodies[0].m_soft->m_maxSelfCollisionImpulse)
+ if (impulse.m_velocity.length() < m_bodies[0].m_soft->m_maxSelfCollisionImpulse)
{
-
- } else
+ }
+ else
{
- m_bodies[0].applyImpulse(-impulse*m_bodies[0].m_soft->m_selfCollisionImpulseFactor,m_rpos[0]);
- m_bodies[1].applyImpulse( impulse*m_bodies[0].m_soft->m_selfCollisionImpulseFactor,m_rpos[1]);
+ m_bodies[0].applyImpulse(-impulse * m_bodies[0].m_soft->m_selfCollisionImpulseFactor, m_rpos[0]);
+ m_bodies[1].applyImpulse(impulse * m_bodies[0].m_soft->m_selfCollisionImpulseFactor, m_rpos[1]);
}
}
}
- } else
+ }
+ else
{
- m_bodies[0].applyImpulse(-impulse,m_rpos[0]);
- m_bodies[1].applyImpulse( impulse,m_rpos[1]);
+ m_bodies[0].applyImpulse(-impulse, m_rpos[0]);
+ m_bodies[1].applyImpulse(impulse, m_rpos[1]);
}
}
//
-void btSoftBody::CJoint::Terminate(btScalar dt)
+void btSoftBody::CJoint::Terminate(btScalar dt)
{
- if(m_split>0)
+ if (m_split > 0)
{
- m_bodies[0].applyDImpulse(-m_sdrift,m_rpos[0]);
- m_bodies[1].applyDImpulse( m_sdrift,m_rpos[1]);
+ m_bodies[0].applyDImpulse(-m_sdrift, m_rpos[0]);
+ m_bodies[1].applyDImpulse(m_sdrift, m_rpos[1]);
}
}
//
-void btSoftBody::applyForces()
+void btSoftBody::applyForces()
{
-
BT_PROFILE("SoftBody applyForces");
-// const btScalar dt = m_sst.sdt;
- const btScalar kLF = m_cfg.kLF;
- const btScalar kDG = m_cfg.kDG;
- const btScalar kPR = m_cfg.kPR;
- const btScalar kVC = m_cfg.kVC;
- const bool as_lift = kLF>0;
- const bool as_drag = kDG>0;
- const bool as_pressure = kPR!=0;
- const bool as_volume = kVC>0;
- const bool as_aero = as_lift ||
- as_drag ;
+ // const btScalar dt = m_sst.sdt;
+ const btScalar kLF = m_cfg.kLF;
+ const btScalar kDG = m_cfg.kDG;
+ const btScalar kPR = m_cfg.kPR;
+ const btScalar kVC = m_cfg.kVC;
+ const bool as_lift = kLF > 0;
+ const bool as_drag = kDG > 0;
+ const bool as_pressure = kPR != 0;
+ const bool as_volume = kVC > 0;
+ const bool as_aero = as_lift ||
+ as_drag;
//const bool as_vaero = as_aero &&
// (m_cfg.aeromodel < btSoftBody::eAeroModel::F_TwoSided);
//const bool as_faero = as_aero &&
// (m_cfg.aeromodel >= btSoftBody::eAeroModel::F_TwoSided);
- const bool use_medium = as_aero;
- const bool use_volume = as_pressure ||
- as_volume ;
- btScalar volume = 0;
- btScalar ivolumetp = 0;
- btScalar dvolumetv = 0;
- btSoftBody::sMedium medium;
- if(use_volume)
+ const bool use_medium = as_aero;
+ const bool use_volume = as_pressure ||
+ as_volume;
+ btScalar volume = 0;
+ btScalar ivolumetp = 0;
+ btScalar dvolumetv = 0;
+ btSoftBody::sMedium medium;
+ if (use_volume)
{
- volume = getVolume();
- ivolumetp = 1/btFabs(volume)*kPR;
- dvolumetv = (m_pose.m_volume-volume)*kVC;
+ volume = getVolume();
+ ivolumetp = 1 / btFabs(volume) * kPR;
+ dvolumetv = (m_pose.m_volume - volume) * kVC;
}
- /* Per vertex forces */
- int i,ni;
+ /* Per vertex forces */
+ int i, ni;
- for(i=0,ni=m_nodes.size();i<ni;++i)
+ for (i = 0, ni = m_nodes.size(); i < ni; ++i)
{
- btSoftBody::Node& n=m_nodes[i];
- if(n.m_im>0)
+ btSoftBody::Node& n = m_nodes[i];
+ if (n.m_im > 0)
{
- if(use_medium)
+ if (use_medium)
{
- /* Aerodynamics */
+ /* Aerodynamics */
addAeroForceToNode(m_windVelocity, i);
}
- /* Pressure */
- if(as_pressure)
+ /* Pressure */
+ if (as_pressure)
{
- n.m_f += n.m_n*(n.m_area*ivolumetp);
+ n.m_f += n.m_n * (n.m_area * ivolumetp);
}
- /* Volume */
- if(as_volume)
+ /* Volume */
+ if (as_volume)
{
- n.m_f += n.m_n*(n.m_area*dvolumetv);
+ n.m_f += n.m_n * (n.m_area * dvolumetv);
}
}
}
- /* Per face forces */
- for(i=0,ni=m_faces.size();i<ni;++i)
+ /* Per face forces */
+ for (i = 0, ni = m_faces.size(); i < ni; ++i)
{
- // btSoftBody::Face& f=m_faces[i];
+ // btSoftBody::Face& f=m_faces[i];
- /* Aerodynamics */
- addAeroForceToFace(m_windVelocity, i);
+ /* Aerodynamics */
+ addAeroForceToFace(m_windVelocity, i);
}
}
//
-void btSoftBody::PSolve_Anchors(btSoftBody* psb,btScalar kst,btScalar ti)
+void btSoftBody::PSolve_Anchors(btSoftBody* psb, btScalar kst, btScalar ti)
{
BT_PROFILE("PSolve_Anchors");
- const btScalar kAHR=psb->m_cfg.kAHR*kst;
- const btScalar dt=psb->m_sst.sdt;
- for(int i=0,ni=psb->m_anchors.size();i<ni;++i)
+ const btScalar kAHR = psb->m_cfg.kAHR * kst;
+ const btScalar dt = psb->m_sst.sdt;
+ for (int i = 0, ni = psb->m_anchors.size(); i < ni; ++i)
{
- const Anchor& a=psb->m_anchors[i];
- const btTransform& t=a.m_body->getWorldTransform();
- Node& n=*a.m_node;
- const btVector3 wa=t*a.m_local;
- const btVector3 va=a.m_body->getVelocityInLocalPoint(a.m_c1)*dt;
- const btVector3 vb=n.m_x-n.m_q;
- const btVector3 vr=(va-vb)+(wa-n.m_x)*kAHR;
- const btVector3 impulse=a.m_c0*vr*a.m_influence;
- n.m_x+=impulse*a.m_c2;
- a.m_body->applyImpulse(-impulse,a.m_c1);
+ const Anchor& a = psb->m_anchors[i];
+ const btTransform& t = a.m_body->getWorldTransform();
+ Node& n = *a.m_node;
+ const btVector3 wa = t * a.m_local;
+ const btVector3 va = a.m_body->getVelocityInLocalPoint(a.m_c1) * dt;
+ const btVector3 vb = n.m_x - n.m_q;
+ const btVector3 vr = (va - vb) + (wa - n.m_x) * kAHR;
+ const btVector3 impulse = a.m_c0 * vr * a.m_influence;
+ n.m_x += impulse * a.m_c2;
+ a.m_body->applyImpulse(-impulse, a.m_c1);
}
}
-
//
void btSoftBody::PSolve_RContacts(btSoftBody* psb, btScalar kst, btScalar ti)
{
BT_PROFILE("PSolve_RContacts");
- const btScalar dt = psb->m_sst.sdt;
- const btScalar mrg = psb->getCollisionShape()->getMargin();
+ const btScalar dt = psb->m_sst.sdt;
+ const btScalar mrg = psb->getCollisionShape()->getMargin();
btMultiBodyJacobianData jacobianData;
- for(int i=0,ni=psb->m_rcontacts.size();i<ni;++i)
- {
- const RContact& c = psb->m_rcontacts[i];
- const sCti& cti = c.m_cti;
- if (cti.m_colObj->hasContactResponse())
- {
- btVector3 va(0,0,0);
- btRigidBody* rigidCol=0;
- btMultiBodyLinkCollider* multibodyLinkCol=0;
- btScalar* deltaV;
-
- if (cti.m_colObj->getInternalType() == btCollisionObject::CO_RIGID_BODY)
- {
- rigidCol = (btRigidBody*)btRigidBody::upcast(cti.m_colObj);
- va = rigidCol ? rigidCol->getVelocityInLocalPoint(c.m_c1)*dt : btVector3(0,0,0);
- }
+ for (int i = 0, ni = psb->m_rcontacts.size(); i < ni; ++i)
+ {
+ const RContact& c = psb->m_rcontacts[i];
+ const sCti& cti = c.m_cti;
+ if (cti.m_colObj->hasContactResponse())
+ {
+ btVector3 va(0, 0, 0);
+ btRigidBody* rigidCol = 0;
+ btMultiBodyLinkCollider* multibodyLinkCol = 0;
+ btScalar* deltaV;
+
+ if (cti.m_colObj->getInternalType() == btCollisionObject::CO_RIGID_BODY)
+ {
+ rigidCol = (btRigidBody*)btRigidBody::upcast(cti.m_colObj);
+ va = rigidCol ? rigidCol->getVelocityInLocalPoint(c.m_c1) * dt : btVector3(0, 0, 0);
+ }
else if (cti.m_colObj->getInternalType() == btCollisionObject::CO_FEATHERSTONE_LINK)
- {
- multibodyLinkCol = (btMultiBodyLinkCollider*)btMultiBodyLinkCollider::upcast(cti.m_colObj);
- if (multibodyLinkCol)
- {
- 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, c.m_node->m_x, cti.m_normal, jac, jacobianData.scratch_r, jacobianData.scratch_v, jacobianData.scratch_m);
- deltaV = &jacobianData.m_deltaVelocitiesUnitImpulse[0];
- multibodyLinkCol->m_multiBody->calcAccelerationDeltasMultiDof(&jacobianData.m_jacobians[0],deltaV,jacobianData.scratch_r, jacobianData.scratch_v);
-
- btScalar vel = 0.0;
- for (int j = 0; j < ndof ; ++j) {
- vel += multibodyLinkCol->m_multiBody->getVelocityVector()[j] * jac[j];
- }
- va = cti.m_normal*vel*dt;
- }
- }
-
- const btVector3 vb = c.m_node->m_x-c.m_node->m_q;
- const btVector3 vr = vb-va;
- const btScalar dn = btDot(vr, cti.m_normal);
- if(dn<=SIMD_EPSILON)
- {
- const btScalar dp = btMin( (btDot(c.m_node->m_x, cti.m_normal) + cti.m_offset), mrg );
- const btVector3 fv = vr - (cti.m_normal * dn);
+ {
+ multibodyLinkCol = (btMultiBodyLinkCollider*)btMultiBodyLinkCollider::upcast(cti.m_colObj);
+ if (multibodyLinkCol)
+ {
+ 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, c.m_node->m_x, cti.m_normal, jac, jacobianData.scratch_r, jacobianData.scratch_v, jacobianData.scratch_m);
+ deltaV = &jacobianData.m_deltaVelocitiesUnitImpulse[0];
+ multibodyLinkCol->m_multiBody->calcAccelerationDeltasMultiDof(&jacobianData.m_jacobians[0], deltaV, jacobianData.scratch_r, jacobianData.scratch_v);
+
+ btScalar vel = 0.0;
+ for (int j = 0; j < ndof; ++j)
+ {
+ vel += multibodyLinkCol->m_multiBody->getVelocityVector()[j] * jac[j];
+ }
+ va = cti.m_normal * vel * dt;
+ }
+ }
+
+ const btVector3 vb = c.m_node->m_x - c.m_node->m_q;
+ const btVector3 vr = vb - va;
+ const btScalar dn = btDot(vr, cti.m_normal);
+ if (dn <= SIMD_EPSILON)
+ {
+ const btScalar dp = btMin((btDot(c.m_node->m_x, cti.m_normal) + cti.m_offset), mrg);
+ const btVector3 fv = vr - (cti.m_normal * dn);
// c0 is the impulse matrix, c3 is 1 - the friction coefficient or 0, c4 is the contact hardness coefficient
- const btVector3 impulse = c.m_c0 * ( (vr - (fv * c.m_c3) + (cti.m_normal * (dp * c.m_c4))) * kst );
+ const btVector3 impulse = c.m_c0 * ((vr - (fv * c.m_c3) + (cti.m_normal * (dp * c.m_c4))) * kst);
c.m_node->m_x -= impulse * c.m_c2;
-
- if (cti.m_colObj->getInternalType() == btCollisionObject::CO_RIGID_BODY)
- {
- if (rigidCol)
- rigidCol->applyImpulse(impulse,c.m_c1);
- }
- else if (cti.m_colObj->getInternalType() == btCollisionObject::CO_FEATHERSTONE_LINK)
- {
- if (multibodyLinkCol)
- {
- double multiplier = 0.5;
- multibodyLinkCol->m_multiBody->applyDeltaVeeMultiDof(deltaV,-impulse.length()*multiplier);
- }
- }
+
+ if (cti.m_colObj->getInternalType() == btCollisionObject::CO_RIGID_BODY)
+ {
+ if (rigidCol)
+ rigidCol->applyImpulse(impulse, c.m_c1);
+ }
+ else if (cti.m_colObj->getInternalType() == btCollisionObject::CO_FEATHERSTONE_LINK)
+ {
+ if (multibodyLinkCol)
+ {
+ double multiplier = 0.5;
+ multibodyLinkCol->m_multiBody->applyDeltaVeeMultiDof(deltaV, -impulse.length() * multiplier);
+ }
+ }
}
}
}
}
//
-void btSoftBody::PSolve_SContacts(btSoftBody* psb,btScalar,btScalar ti)
+void btSoftBody::PSolve_SContacts(btSoftBody* psb, btScalar, btScalar ti)
{
BT_PROFILE("PSolve_SContacts");
-
- for(int i=0,ni=psb->m_scontacts.size();i<ni;++i)
+
+ for (int i = 0, ni = psb->m_scontacts.size(); i < ni; ++i)
{
- const SContact& c=psb->m_scontacts[i];
- const btVector3& nr=c.m_normal;
- Node& n=*c.m_node;
- Face& f=*c.m_face;
- const btVector3 p=BaryEval( f.m_n[0]->m_x,
- f.m_n[1]->m_x,
- f.m_n[2]->m_x,
- c.m_weights);
- const btVector3 q=BaryEval( f.m_n[0]->m_q,
- f.m_n[1]->m_q,
- f.m_n[2]->m_q,
- c.m_weights);
- const btVector3 vr=(n.m_x-n.m_q)-(p-q);
- btVector3 corr(0,0,0);
- btScalar dot = btDot(vr,nr);
- if(dot<0)
+ const SContact& c = psb->m_scontacts[i];
+ const btVector3& nr = c.m_normal;
+ Node& n = *c.m_node;
+ Face& f = *c.m_face;
+ const btVector3 p = BaryEval(f.m_n[0]->m_x,
+ f.m_n[1]->m_x,
+ f.m_n[2]->m_x,
+ c.m_weights);
+ const btVector3 q = BaryEval(f.m_n[0]->m_q,
+ f.m_n[1]->m_q,
+ f.m_n[2]->m_q,
+ c.m_weights);
+ const btVector3 vr = (n.m_x - n.m_q) - (p - q);
+ btVector3 corr(0, 0, 0);
+ btScalar dot = btDot(vr, nr);
+ if (dot < 0)
{
- const btScalar j=c.m_margin-(btDot(nr,n.m_x)-btDot(nr,p));
- corr+=c.m_normal*j;
+ const btScalar j = c.m_margin - (btDot(nr, n.m_x) - btDot(nr, p));
+ corr += c.m_normal * j;
}
- corr -= ProjectOnPlane(vr,nr)*c.m_friction;
- n.m_x += corr*c.m_cfm[0];
- f.m_n[0]->m_x -= corr*(c.m_cfm[1]*c.m_weights.x());
- f.m_n[1]->m_x -= corr*(c.m_cfm[1]*c.m_weights.y());
- f.m_n[2]->m_x -= corr*(c.m_cfm[1]*c.m_weights.z());
+ corr -= ProjectOnPlane(vr, nr) * c.m_friction;
+ n.m_x += corr * c.m_cfm[0];
+ f.m_n[0]->m_x -= corr * (c.m_cfm[1] * c.m_weights.x());
+ f.m_n[1]->m_x -= corr * (c.m_cfm[1] * c.m_weights.y());
+ f.m_n[2]->m_x -= corr * (c.m_cfm[1] * c.m_weights.z());
}
}
//
-void btSoftBody::PSolve_Links(btSoftBody* psb,btScalar kst,btScalar ti)
+void btSoftBody::PSolve_Links(btSoftBody* psb, btScalar kst, btScalar ti)
{
-BT_PROFILE("PSolve_Links");
- for(int i=0,ni=psb->m_links.size();i<ni;++i)
- {
- Link& l=psb->m_links[i];
- if(l.m_c0>0)
+ BT_PROFILE("PSolve_Links");
+ for (int i = 0, ni = psb->m_links.size(); i < ni; ++i)
+ {
+ Link& l = psb->m_links[i];
+ if (l.m_c0 > 0)
{
- Node& a=*l.m_n[0];
- Node& b=*l.m_n[1];
- const btVector3 del=b.m_x-a.m_x;
- const btScalar len=del.length2();
- if (l.m_c1+len > SIMD_EPSILON)
+ Node& a = *l.m_n[0];
+ Node& b = *l.m_n[1];
+ const btVector3 del = b.m_x - a.m_x;
+ const btScalar len = del.length2();
+ if (l.m_c1 + len > SIMD_EPSILON)
{
- const btScalar k=((l.m_c1-len)/(l.m_c0*(l.m_c1+len)))*kst;
- a.m_x-=del*(k*a.m_im);
- b.m_x+=del*(k*b.m_im);
+ const btScalar k = ((l.m_c1 - len) / (l.m_c0 * (l.m_c1 + len))) * kst;
+ a.m_x -= del * (k * a.m_im);
+ b.m_x += del * (k * b.m_im);
}
}
}
}
//
-void btSoftBody::VSolve_Links(btSoftBody* psb,btScalar kst)
+void btSoftBody::VSolve_Links(btSoftBody* psb, btScalar kst)
{
BT_PROFILE("VSolve_Links");
- for(int i=0,ni=psb->m_links.size();i<ni;++i)
- {
- Link& l=psb->m_links[i];
- Node** n=l.m_n;
- const btScalar j=-btDot(l.m_c3,n[0]->m_v-n[1]->m_v)*l.m_c2*kst;
- n[0]->m_v+= l.m_c3*(j*n[0]->m_im);
- n[1]->m_v-= l.m_c3*(j*n[1]->m_im);
+ for (int i = 0, ni = psb->m_links.size(); i < ni; ++i)
+ {
+ Link& l = psb->m_links[i];
+ Node** n = l.m_n;
+ const btScalar j = -btDot(l.m_c3, n[0]->m_v - n[1]->m_v) * l.m_c2 * kst;
+ n[0]->m_v += l.m_c3 * (j * n[0]->m_im);
+ n[1]->m_v -= l.m_c3 * (j * n[1]->m_im);
}
}
//
-btSoftBody::psolver_t btSoftBody::getSolver(ePSolver::_ solver)
+btSoftBody::psolver_t btSoftBody::getSolver(ePSolver::_ solver)
{
- switch(solver)
+ switch (solver)
{
- case ePSolver::Anchors:
- return(&btSoftBody::PSolve_Anchors);
- case ePSolver::Linear:
- return(&btSoftBody::PSolve_Links);
- case ePSolver::RContacts:
- return(&btSoftBody::PSolve_RContacts);
- case ePSolver::SContacts:
- return(&btSoftBody::PSolve_SContacts);
+ case ePSolver::Anchors:
+ return (&btSoftBody::PSolve_Anchors);
+ case ePSolver::Linear:
+ return (&btSoftBody::PSolve_Links);
+ case ePSolver::RContacts:
+ return (&btSoftBody::PSolve_RContacts);
+ case ePSolver::SContacts:
+ return (&btSoftBody::PSolve_SContacts);
default:
{
}
}
- return(0);
+ return (0);
}
//
-btSoftBody::vsolver_t btSoftBody::getSolver(eVSolver::_ solver)
+btSoftBody::vsolver_t btSoftBody::getSolver(eVSolver::_ solver)
{
- switch(solver)
+ switch (solver)
{
- case eVSolver::Linear: return(&btSoftBody::VSolve_Links);
+ case eVSolver::Linear:
+ return (&btSoftBody::VSolve_Links);
default:
{
}
}
- return(0);
+ return (0);
}
//
-void btSoftBody::defaultCollisionHandler(const btCollisionObjectWrapper* pcoWrap)
+void btSoftBody::defaultCollisionHandler(const btCollisionObjectWrapper* pcoWrap)
{
-
- switch(m_cfg.collisions&fCollision::RVSmask)
+ switch (m_cfg.collisions & fCollision::RVSmask)
{
- case fCollision::SDF_RS:
+ case fCollision::SDF_RS:
{
- btSoftColliders::CollideSDF_RS docollide;
- btRigidBody* prb1=(btRigidBody*) btRigidBody::upcast(pcoWrap->getCollisionObject());
- btTransform wtr=pcoWrap->getWorldTransform();
+ btSoftColliders::CollideSDF_RS docollide;
+ btRigidBody* prb1 = (btRigidBody*)btRigidBody::upcast(pcoWrap->getCollisionObject());
+ btTransform wtr = pcoWrap->getWorldTransform();
- const btTransform ctr=pcoWrap->getWorldTransform();
- const btScalar timemargin=(wtr.getOrigin()-ctr.getOrigin()).length();
- const btScalar basemargin=getCollisionShape()->getMargin();
- btVector3 mins;
- btVector3 maxs;
- ATTRIBUTE_ALIGNED16(btDbvtVolume) volume;
- pcoWrap->getCollisionShape()->getAabb( pcoWrap->getWorldTransform(),
- mins,
- maxs);
- volume=btDbvtVolume::FromMM(mins,maxs);
- volume.Expand(btVector3(basemargin,basemargin,basemargin));
- docollide.psb = this;
+ const btTransform ctr = pcoWrap->getWorldTransform();
+ const btScalar timemargin = (wtr.getOrigin() - ctr.getOrigin()).length();
+ const btScalar basemargin = getCollisionShape()->getMargin();
+ btVector3 mins;
+ btVector3 maxs;
+ ATTRIBUTE_ALIGNED16(btDbvtVolume)
+ volume;
+ pcoWrap->getCollisionShape()->getAabb(pcoWrap->getWorldTransform(),
+ mins,
+ maxs);
+ volume = btDbvtVolume::FromMM(mins, maxs);
+ volume.Expand(btVector3(basemargin, basemargin, basemargin));
+ docollide.psb = this;
docollide.m_colObj1Wrap = pcoWrap;
docollide.m_rigidBody = prb1;
- docollide.dynmargin = basemargin+timemargin;
- docollide.stamargin = basemargin;
- m_ndbvt.collideTV(m_ndbvt.m_root,volume,docollide);
+ docollide.dynmargin = basemargin + timemargin;
+ docollide.stamargin = basemargin;
+ m_ndbvt.collideTV(m_ndbvt.m_root, volume, docollide);
}
break;
- case fCollision::CL_RS:
+ case fCollision::CL_RS:
{
- btSoftColliders::CollideCL_RS collider;
- collider.ProcessColObj(this,pcoWrap);
+ btSoftColliders::CollideCL_RS collider;
+ collider.ProcessColObj(this, pcoWrap);
}
break;
}
}
//
-void btSoftBody::defaultCollisionHandler(btSoftBody* psb)
+void btSoftBody::defaultCollisionHandler(btSoftBody* psb)
{
- const int cf=m_cfg.collisions&psb->m_cfg.collisions;
- switch(cf&fCollision::SVSmask)
+ const int cf = m_cfg.collisions & psb->m_cfg.collisions;
+ switch (cf & fCollision::SVSmask)
{
- case fCollision::CL_SS:
+ case fCollision::CL_SS:
{
-
//support self-collision if CL_SELF flag set
- if (this!=psb || psb->m_cfg.collisions&fCollision::CL_SELF)
+ if (this != psb || psb->m_cfg.collisions & fCollision::CL_SELF)
{
- btSoftColliders::CollideCL_SS docollide;
- docollide.ProcessSoftSoft(this,psb);
+ btSoftColliders::CollideCL_SS docollide;
+ docollide.ProcessSoftSoft(this, psb);
}
-
}
break;
- case fCollision::VF_SS:
+ case fCollision::VF_SS:
{
//only self-collision for Cluster, not Vertex-Face yet
- if (this!=psb)
- {
- btSoftColliders::CollideVF_SS docollide;
- /* common */
- docollide.mrg= getCollisionShape()->getMargin()+
- psb->getCollisionShape()->getMargin();
- /* psb0 nodes vs psb1 faces */
- docollide.psb[0]=this;
- docollide.psb[1]=psb;
- docollide.psb[0]->m_ndbvt.collideTT( docollide.psb[0]->m_ndbvt.m_root,
- docollide.psb[1]->m_fdbvt.m_root,
- docollide);
- /* psb1 nodes vs psb0 faces */
- docollide.psb[0]=psb;
- docollide.psb[1]=this;
- docollide.psb[0]->m_ndbvt.collideTT( docollide.psb[0]->m_ndbvt.m_root,
- docollide.psb[1]->m_fdbvt.m_root,
- docollide);
+ if (this != psb)
+ {
+ btSoftColliders::CollideVF_SS docollide;
+ /* common */
+ docollide.mrg = getCollisionShape()->getMargin() +
+ psb->getCollisionShape()->getMargin();
+ /* psb0 nodes vs psb1 faces */
+ docollide.psb[0] = this;
+ docollide.psb[1] = psb;
+ docollide.psb[0]->m_ndbvt.collideTT(docollide.psb[0]->m_ndbvt.m_root,
+ docollide.psb[1]->m_fdbvt.m_root,
+ docollide);
+ /* psb1 nodes vs psb0 faces */
+ docollide.psb[0] = psb;
+ docollide.psb[1] = this;
+ docollide.psb[0]->m_ndbvt.collideTT(docollide.psb[0]->m_ndbvt.m_root,
+ docollide.psb[1]->m_fdbvt.m_root,
+ docollide);
}
}
break;
- default:
+ default:
{
-
}
}
}
-
-
-void btSoftBody::setWindVelocity( const btVector3 &velocity )
+void btSoftBody::setWindVelocity(const btVector3& velocity)
{
m_windVelocity = velocity;
}
-
const btVector3& btSoftBody::getWindVelocity()
{
return m_windVelocity;
}
-
-
-int btSoftBody::calculateSerializeBufferSize() const
+int btSoftBody::calculateSerializeBufferSize() const
{
int sz = sizeof(btSoftBodyData);
return sz;
}
- ///fills the dataBuffer and returns the struct name (and 0 on failure)
-const char* btSoftBody::serialize(void* dataBuffer, class btSerializer* serializer) const
+///fills the dataBuffer and returns the struct name (and 0 on failure)
+const char* btSoftBody::serialize(void* dataBuffer, class btSerializer* serializer) const
{
- btSoftBodyData* sbd = (btSoftBodyData*) dataBuffer;
+ btSoftBodyData* sbd = (btSoftBodyData*)dataBuffer;
btCollisionObject::serialize(&sbd->m_collisionObjectData, serializer);
- btHashMap<btHashPtr,int> m_nodeIndexMap;
+ btHashMap<btHashPtr, int> m_nodeIndexMap;
sbd->m_numMaterials = m_materials.size();
- sbd->m_materials = sbd->m_numMaterials? (SoftBodyMaterialData**) serializer->getUniquePointer((void*)&m_materials): 0;
+ sbd->m_materials = sbd->m_numMaterials ? (SoftBodyMaterialData**)serializer->getUniquePointer((void*)&m_materials) : 0;
if (sbd->m_materials)
{
int sz = sizeof(SoftBodyMaterialData*);
int numElem = sbd->m_numMaterials;
- btChunk* chunk = serializer->allocate(sz,numElem);
+ btChunk* chunk = serializer->allocate(sz, numElem);
//SoftBodyMaterialData** memPtr = chunk->m_oldPtr;
SoftBodyMaterialData** memPtr = (SoftBodyMaterialData**)chunk->m_oldPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
btSoftBody::Material* mat = m_materials[i];
*memPtr = mat ? (SoftBodyMaterialData*)serializer->getUniquePointer((void*)mat) : 0;
if (!serializer->findPointer(mat))
{
//serialize it here
- btChunk* chunk = serializer->allocate(sizeof(SoftBodyMaterialData),1);
+ btChunk* chunk = serializer->allocate(sizeof(SoftBodyMaterialData), 1);
SoftBodyMaterialData* memPtr = (SoftBodyMaterialData*)chunk->m_oldPtr;
memPtr->m_flags = mat->m_flags;
memPtr->m_angularStiffness = mat->m_kAST;
memPtr->m_linearStiffness = mat->m_kLST;
memPtr->m_volumeStiffness = mat->m_kVST;
- serializer->finalizeChunk(chunk,"SoftBodyMaterialData",BT_SBMATERIAL_CODE,mat);
+ serializer->finalizeChunk(chunk, "SoftBodyMaterialData", BT_SBMATERIAL_CODE, mat);
}
}
- serializer->finalizeChunk(chunk,"SoftBodyMaterialData",BT_ARRAY_CODE,(void*) &m_materials);
+ serializer->finalizeChunk(chunk, "SoftBodyMaterialData", BT_ARRAY_CODE, (void*)&m_materials);
}
-
-
-
sbd->m_numNodes = m_nodes.size();
- sbd->m_nodes = sbd->m_numNodes ? (SoftBodyNodeData*)serializer->getUniquePointer((void*)&m_nodes): 0;
+ sbd->m_nodes = sbd->m_numNodes ? (SoftBodyNodeData*)serializer->getUniquePointer((void*)&m_nodes) : 0;
if (sbd->m_nodes)
{
int sz = sizeof(SoftBodyNodeData);
int numElem = sbd->m_numNodes;
- btChunk* chunk = serializer->allocate(sz,numElem);
+ btChunk* chunk = serializer->allocate(sz, numElem);
SoftBodyNodeData* memPtr = (SoftBodyNodeData*)chunk->m_oldPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
- m_nodes[i].m_f.serializeFloat( memPtr->m_accumulatedForce);
+ m_nodes[i].m_f.serializeFloat(memPtr->m_accumulatedForce);
memPtr->m_area = m_nodes[i].m_area;
memPtr->m_attach = m_nodes[i].m_battach;
memPtr->m_inverseMass = m_nodes[i].m_im;
- memPtr->m_material = m_nodes[i].m_material? (SoftBodyMaterialData*)serializer->getUniquePointer((void*) m_nodes[i].m_material):0;
+ memPtr->m_material = m_nodes[i].m_material ? (SoftBodyMaterialData*)serializer->getUniquePointer((void*)m_nodes[i].m_material) : 0;
m_nodes[i].m_n.serializeFloat(memPtr->m_normal);
m_nodes[i].m_x.serializeFloat(memPtr->m_position);
m_nodes[i].m_q.serializeFloat(memPtr->m_previousPosition);
m_nodes[i].m_v.serializeFloat(memPtr->m_velocity);
- m_nodeIndexMap.insert(&m_nodes[i],i);
+ m_nodeIndexMap.insert(&m_nodes[i], i);
}
- serializer->finalizeChunk(chunk,"SoftBodyNodeData",BT_SBNODE_CODE,(void*) &m_nodes);
+ serializer->finalizeChunk(chunk, "SoftBodyNodeData", BT_SBNODE_CODE, (void*)&m_nodes);
}
sbd->m_numLinks = m_links.size();
- sbd->m_links = sbd->m_numLinks? (SoftBodyLinkData*) serializer->getUniquePointer((void*)&m_links[0]):0;
+ sbd->m_links = sbd->m_numLinks ? (SoftBodyLinkData*)serializer->getUniquePointer((void*)&m_links[0]) : 0;
if (sbd->m_links)
{
int sz = sizeof(SoftBodyLinkData);
int numElem = sbd->m_numLinks;
- btChunk* chunk = serializer->allocate(sz,numElem);
+ btChunk* chunk = serializer->allocate(sz, numElem);
SoftBodyLinkData* memPtr = (SoftBodyLinkData*)chunk->m_oldPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
memPtr->m_bbending = m_links[i].m_bbending;
- memPtr->m_material = m_links[i].m_material? (SoftBodyMaterialData*)serializer->getUniquePointer((void*) m_links[i].m_material):0;
- memPtr->m_nodeIndices[0] = m_links[i].m_n[0] ? m_links[i].m_n[0] - &m_nodes[0]: -1;
- memPtr->m_nodeIndices[1] = m_links[i].m_n[1] ? m_links[i].m_n[1] - &m_nodes[0]: -1;
- btAssert(memPtr->m_nodeIndices[0]<m_nodes.size());
- btAssert(memPtr->m_nodeIndices[1]<m_nodes.size());
+ memPtr->m_material = m_links[i].m_material ? (SoftBodyMaterialData*)serializer->getUniquePointer((void*)m_links[i].m_material) : 0;
+ memPtr->m_nodeIndices[0] = m_links[i].m_n[0] ? m_links[i].m_n[0] - &m_nodes[0] : -1;
+ memPtr->m_nodeIndices[1] = m_links[i].m_n[1] ? m_links[i].m_n[1] - &m_nodes[0] : -1;
+ btAssert(memPtr->m_nodeIndices[0] < m_nodes.size());
+ btAssert(memPtr->m_nodeIndices[1] < m_nodes.size());
memPtr->m_restLength = m_links[i].m_rl;
}
- serializer->finalizeChunk(chunk,"SoftBodyLinkData",BT_ARRAY_CODE,(void*) &m_links[0]);
-
+ serializer->finalizeChunk(chunk, "SoftBodyLinkData", BT_ARRAY_CODE, (void*)&m_links[0]);
}
-
sbd->m_numFaces = m_faces.size();
- sbd->m_faces = sbd->m_numFaces? (SoftBodyFaceData*) serializer->getUniquePointer((void*)&m_faces[0]):0;
+ sbd->m_faces = sbd->m_numFaces ? (SoftBodyFaceData*)serializer->getUniquePointer((void*)&m_faces[0]) : 0;
if (sbd->m_faces)
{
int sz = sizeof(SoftBodyFaceData);
int numElem = sbd->m_numFaces;
- btChunk* chunk = serializer->allocate(sz,numElem);
+ btChunk* chunk = serializer->allocate(sz, numElem);
SoftBodyFaceData* memPtr = (SoftBodyFaceData*)chunk->m_oldPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
- memPtr->m_material = m_faces[i].m_material ? (SoftBodyMaterialData*) serializer->getUniquePointer((void*)m_faces[i].m_material): 0;
- m_faces[i].m_normal.serializeFloat( memPtr->m_normal);
- for (int j=0;j<3;j++)
+ memPtr->m_material = m_faces[i].m_material ? (SoftBodyMaterialData*)serializer->getUniquePointer((void*)m_faces[i].m_material) : 0;
+ m_faces[i].m_normal.serializeFloat(memPtr->m_normal);
+ for (int j = 0; j < 3; j++)
{
- memPtr->m_nodeIndices[j] = m_faces[i].m_n[j]? m_faces[i].m_n[j] - &m_nodes[0]: -1;
+ memPtr->m_nodeIndices[j] = m_faces[i].m_n[j] ? m_faces[i].m_n[j] - &m_nodes[0] : -1;
}
memPtr->m_restArea = m_faces[i].m_ra;
}
- serializer->finalizeChunk(chunk,"SoftBodyFaceData",BT_ARRAY_CODE,(void*) &m_faces[0]);
+ serializer->finalizeChunk(chunk, "SoftBodyFaceData", BT_ARRAY_CODE, (void*)&m_faces[0]);
}
-
sbd->m_numTetrahedra = m_tetras.size();
- sbd->m_tetrahedra = sbd->m_numTetrahedra ? (SoftBodyTetraData*) serializer->getUniquePointer((void*)&m_tetras[0]):0;
+ sbd->m_tetrahedra = sbd->m_numTetrahedra ? (SoftBodyTetraData*)serializer->getUniquePointer((void*)&m_tetras[0]) : 0;
if (sbd->m_tetrahedra)
{
int sz = sizeof(SoftBodyTetraData);
int numElem = sbd->m_numTetrahedra;
- btChunk* chunk = serializer->allocate(sz,numElem);
+ btChunk* chunk = serializer->allocate(sz, numElem);
SoftBodyTetraData* memPtr = (SoftBodyTetraData*)chunk->m_oldPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
- for (int j=0;j<4;j++)
+ for (int j = 0; j < 4; j++)
{
- m_tetras[i].m_c0[j].serializeFloat( memPtr->m_c0[j] );
- memPtr->m_nodeIndices[j] = m_tetras[j].m_n[j]? m_tetras[j].m_n[j]-&m_nodes[0] : -1;
+ m_tetras[i].m_c0[j].serializeFloat(memPtr->m_c0[j]);
+ memPtr->m_nodeIndices[j] = m_tetras[j].m_n[j] ? m_tetras[j].m_n[j] - &m_nodes[0] : -1;
}
memPtr->m_c1 = m_tetras[i].m_c1;
memPtr->m_c2 = m_tetras[i].m_c2;
- memPtr->m_material = m_tetras[i].m_material ? (SoftBodyMaterialData*)serializer->getUniquePointer((void*) m_tetras[i].m_material): 0;
+ memPtr->m_material = m_tetras[i].m_material ? (SoftBodyMaterialData*)serializer->getUniquePointer((void*)m_tetras[i].m_material) : 0;
memPtr->m_restVolume = m_tetras[i].m_rv;
}
- serializer->finalizeChunk(chunk,"SoftBodyTetraData",BT_ARRAY_CODE,(void*) &m_tetras[0]);
+ serializer->finalizeChunk(chunk, "SoftBodyTetraData", BT_ARRAY_CODE, (void*)&m_tetras[0]);
}
sbd->m_numAnchors = m_anchors.size();
- sbd->m_anchors = sbd->m_numAnchors ? (SoftRigidAnchorData*) serializer->getUniquePointer((void*)&m_anchors[0]):0;
+ sbd->m_anchors = sbd->m_numAnchors ? (SoftRigidAnchorData*)serializer->getUniquePointer((void*)&m_anchors[0]) : 0;
if (sbd->m_anchors)
{
int sz = sizeof(SoftRigidAnchorData);
int numElem = sbd->m_numAnchors;
- btChunk* chunk = serializer->allocate(sz,numElem);
+ btChunk* chunk = serializer->allocate(sz, numElem);
SoftRigidAnchorData* memPtr = (SoftRigidAnchorData*)chunk->m_oldPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
m_anchors[i].m_c0.serializeFloat(memPtr->m_c0);
m_anchors[i].m_c1.serializeFloat(memPtr->m_c1);
memPtr->m_c2 = m_anchors[i].m_c2;
m_anchors[i].m_local.serializeFloat(memPtr->m_localFrame);
- memPtr->m_nodeIndex = m_anchors[i].m_node? m_anchors[i].m_node-&m_nodes[0]: -1;
-
- memPtr->m_rigidBody = m_anchors[i].m_body? (btRigidBodyData*) serializer->getUniquePointer((void*)m_anchors[i].m_body): 0;
+ memPtr->m_nodeIndex = m_anchors[i].m_node ? m_anchors[i].m_node - &m_nodes[0] : -1;
+
+ memPtr->m_rigidBody = m_anchors[i].m_body ? (btRigidBodyData*)serializer->getUniquePointer((void*)m_anchors[i].m_body) : 0;
btAssert(memPtr->m_nodeIndex < m_nodes.size());
}
- serializer->finalizeChunk(chunk,"SoftRigidAnchorData",BT_ARRAY_CODE,(void*) &m_anchors[0]);
+ serializer->finalizeChunk(chunk, "SoftRigidAnchorData", BT_ARRAY_CODE, (void*)&m_anchors[0]);
}
-
sbd->m_config.m_dynamicFriction = m_cfg.kDF;
sbd->m_config.m_baumgarte = m_cfg.kVCF;
@@ -3501,64 +3499,63 @@ const char* btSoftBody::serialize(void* dataBuffer, class btSerializer* serializ
sbd->m_pose = (SoftBodyPoseData*)serializer->getUniquePointer((void*)&m_pose);
int sz = sizeof(SoftBodyPoseData);
- btChunk* chunk = serializer->allocate(sz,1);
+ btChunk* chunk = serializer->allocate(sz, 1);
SoftBodyPoseData* memPtr = (SoftBodyPoseData*)chunk->m_oldPtr;
-
+
m_pose.m_aqq.serializeFloat(memPtr->m_aqq);
memPtr->m_bframe = m_pose.m_bframe;
memPtr->m_bvolume = m_pose.m_bvolume;
m_pose.m_com.serializeFloat(memPtr->m_com);
-
+
memPtr->m_numPositions = m_pose.m_pos.size();
- memPtr->m_positions = memPtr->m_numPositions ? (btVector3FloatData*)serializer->getUniquePointer((void*)&m_pose.m_pos[0]): 0;
+ memPtr->m_positions = memPtr->m_numPositions ? (btVector3FloatData*)serializer->getUniquePointer((void*)&m_pose.m_pos[0]) : 0;
if (memPtr->m_numPositions)
{
int numElem = memPtr->m_numPositions;
int sz = sizeof(btVector3Data);
- btChunk* chunk = serializer->allocate(sz,numElem);
+ btChunk* chunk = serializer->allocate(sz, numElem);
btVector3FloatData* memPtr = (btVector3FloatData*)chunk->m_oldPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
m_pose.m_pos[i].serializeFloat(*memPtr);
}
- serializer->finalizeChunk(chunk,"btVector3FloatData",BT_ARRAY_CODE,(void*)&m_pose.m_pos[0]);
+ serializer->finalizeChunk(chunk, "btVector3FloatData", BT_ARRAY_CODE, (void*)&m_pose.m_pos[0]);
}
memPtr->m_restVolume = m_pose.m_volume;
m_pose.m_rot.serializeFloat(memPtr->m_rot);
m_pose.m_scl.serializeFloat(memPtr->m_scale);
memPtr->m_numWeigts = m_pose.m_wgh.size();
- memPtr->m_weights = memPtr->m_numWeigts? (float*) serializer->getUniquePointer((void*) &m_pose.m_wgh[0]) : 0;
+ memPtr->m_weights = memPtr->m_numWeigts ? (float*)serializer->getUniquePointer((void*)&m_pose.m_wgh[0]) : 0;
if (memPtr->m_numWeigts)
{
-
int numElem = memPtr->m_numWeigts;
int sz = sizeof(float);
- btChunk* chunk = serializer->allocate(sz,numElem);
- float* memPtr = (float*) chunk->m_oldPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ btChunk* chunk = serializer->allocate(sz, numElem);
+ float* memPtr = (float*)chunk->m_oldPtr;
+ for (int i = 0; i < numElem; i++, memPtr++)
{
*memPtr = m_pose.m_wgh[i];
}
- serializer->finalizeChunk(chunk,"float",BT_ARRAY_CODE,(void*)&m_pose.m_wgh[0]);
+ serializer->finalizeChunk(chunk, "float", BT_ARRAY_CODE, (void*)&m_pose.m_wgh[0]);
}
- serializer->finalizeChunk(chunk,"SoftBodyPoseData",BT_ARRAY_CODE,(void*)&m_pose);
+ serializer->finalizeChunk(chunk, "SoftBodyPoseData", BT_ARRAY_CODE, (void*)&m_pose);
}
//clusters for convex-cluster collision detection
sbd->m_numClusters = m_clusters.size();
- sbd->m_clusters = sbd->m_numClusters? (SoftBodyClusterData*) serializer->getUniquePointer((void*)m_clusters[0]) : 0;
+ sbd->m_clusters = sbd->m_numClusters ? (SoftBodyClusterData*)serializer->getUniquePointer((void*)m_clusters[0]) : 0;
if (sbd->m_numClusters)
{
int numElem = sbd->m_numClusters;
int sz = sizeof(SoftBodyClusterData);
- btChunk* chunk = serializer->allocate(sz,numElem);
- SoftBodyClusterData* memPtr = (SoftBodyClusterData*) chunk->m_oldPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ btChunk* chunk = serializer->allocate(sz, numElem);
+ SoftBodyClusterData* memPtr = (SoftBodyClusterData*)chunk->m_oldPtr;
+ for (int i = 0; i < numElem; i++, memPtr++)
{
- memPtr->m_adamping= m_clusters[i]->m_adamping;
+ memPtr->m_adamping = m_clusters[i]->m_adamping;
m_clusters[i]->m_av.serializeFloat(memPtr->m_av);
memPtr->m_clusterIndex = m_clusters[i]->m_clusterIndex;
memPtr->m_collide = m_clusters[i]->m_collide;
@@ -3589,69 +3586,64 @@ const char* btSoftBody::serialize(void* dataBuffer, class btSerializer* serializ
m_clusters[i]->m_vimpulses[1].serializeFloat(memPtr->m_vimpulses[1]);
memPtr->m_ndimpulses = m_clusters[i]->m_ndimpulses;
-
-
- memPtr->m_framerefs = memPtr->m_numFrameRefs? (btVector3FloatData*)serializer->getUniquePointer((void*)&m_clusters[i]->m_framerefs[0]) : 0;
+ memPtr->m_framerefs = memPtr->m_numFrameRefs ? (btVector3FloatData*)serializer->getUniquePointer((void*)&m_clusters[i]->m_framerefs[0]) : 0;
if (memPtr->m_framerefs)
{
int numElem = memPtr->m_numFrameRefs;
int sz = sizeof(btVector3FloatData);
- btChunk* chunk = serializer->allocate(sz,numElem);
- btVector3FloatData* memPtr = (btVector3FloatData*) chunk->m_oldPtr;
- for (int j=0;j<numElem;j++,memPtr++)
+ btChunk* chunk = serializer->allocate(sz, numElem);
+ btVector3FloatData* memPtr = (btVector3FloatData*)chunk->m_oldPtr;
+ for (int j = 0; j < numElem; j++, memPtr++)
{
m_clusters[i]->m_framerefs[j].serializeFloat(*memPtr);
}
- serializer->finalizeChunk(chunk,"btVector3FloatData",BT_ARRAY_CODE,(void*)&m_clusters[i]->m_framerefs[0]);
+ serializer->finalizeChunk(chunk, "btVector3FloatData", BT_ARRAY_CODE, (void*)&m_clusters[i]->m_framerefs[0]);
}
-
- memPtr->m_masses = memPtr->m_numMasses ? (float*) serializer->getUniquePointer((void*)&m_clusters[i]->m_masses[0]): 0;
+
+ memPtr->m_masses = memPtr->m_numMasses ? (float*)serializer->getUniquePointer((void*)&m_clusters[i]->m_masses[0]) : 0;
if (memPtr->m_masses)
{
int numElem = memPtr->m_numMasses;
int sz = sizeof(float);
- btChunk* chunk = serializer->allocate(sz,numElem);
- float* memPtr = (float*) chunk->m_oldPtr;
- for (int j=0;j<numElem;j++,memPtr++)
+ btChunk* chunk = serializer->allocate(sz, numElem);
+ float* memPtr = (float*)chunk->m_oldPtr;
+ for (int j = 0; j < numElem; j++, memPtr++)
{
*memPtr = m_clusters[i]->m_masses[j];
}
- serializer->finalizeChunk(chunk,"float",BT_ARRAY_CODE,(void*)&m_clusters[i]->m_masses[0]);
+ serializer->finalizeChunk(chunk, "float", BT_ARRAY_CODE, (void*)&m_clusters[i]->m_masses[0]);
}
- memPtr->m_nodeIndices = memPtr->m_numNodes ? (int*) serializer->getUniquePointer((void*) &m_clusters[i]->m_nodes) : 0;
- if (memPtr->m_nodeIndices )
+ memPtr->m_nodeIndices = memPtr->m_numNodes ? (int*)serializer->getUniquePointer((void*)&m_clusters[i]->m_nodes) : 0;
+ if (memPtr->m_nodeIndices)
{
int numElem = memPtr->m_numMasses;
int sz = sizeof(int);
- btChunk* chunk = serializer->allocate(sz,numElem);
- int* memPtr = (int*) chunk->m_oldPtr;
- for (int j=0;j<numElem;j++,memPtr++)
+ btChunk* chunk = serializer->allocate(sz, numElem);
+ int* memPtr = (int*)chunk->m_oldPtr;
+ for (int j = 0; j < numElem; j++, memPtr++)
{
int* indexPtr = m_nodeIndexMap.find(m_clusters[i]->m_nodes[j]);
btAssert(indexPtr);
*memPtr = *indexPtr;
}
- serializer->finalizeChunk(chunk,"int",BT_ARRAY_CODE,(void*)&m_clusters[i]->m_nodes);
+ serializer->finalizeChunk(chunk, "int", BT_ARRAY_CODE, (void*)&m_clusters[i]->m_nodes);
}
}
- serializer->finalizeChunk(chunk,"SoftBodyClusterData",BT_ARRAY_CODE,(void*)m_clusters[0]);
-
+ serializer->finalizeChunk(chunk, "SoftBodyClusterData", BT_ARRAY_CODE, (void*)m_clusters[0]);
}
-
-
sbd->m_numJoints = m_joints.size();
- sbd->m_joints = m_joints.size()? (btSoftBodyJointData*) serializer->getUniquePointer((void*)&m_joints[0]) : 0;
+ sbd->m_joints = m_joints.size() ? (btSoftBodyJointData*)serializer->getUniquePointer((void*)&m_joints[0]) : 0;
if (sbd->m_joints)
{
int sz = sizeof(btSoftBodyJointData);
int numElem = m_joints.size();
- btChunk* chunk = serializer->allocate(sz,numElem);
+ btChunk* chunk = serializer->allocate(sz, numElem);
btSoftBodyJointData* memPtr = (btSoftBodyJointData*)chunk->m_oldPtr;
- for (int i=0;i<numElem;i++,memPtr++)
+ for (int i = 0; i < numElem; i++, memPtr++)
{
memPtr->m_jointType = (int)m_joints[i]->Type();
m_joints[i]->m_refs[0].serializeFloat(memPtr->m_refs[0]);
@@ -3660,8 +3652,8 @@ const char* btSoftBody::serialize(void* dataBuffer, class btSerializer* serializ
memPtr->m_erp = float(m_joints[i]->m_erp);
memPtr->m_split = float(m_joints[i]->m_split);
memPtr->m_delete = m_joints[i]->m_delete;
-
- for (int j=0;j<4;j++)
+
+ for (int j = 0; j < 4; j++)
{
memPtr->m_relPosition[0].m_floats[j] = 0.f;
memPtr->m_relPosition[1].m_floats[j] = 0.f;
@@ -3700,10 +3692,8 @@ const char* btSoftBody::serialize(void* dataBuffer, class btSerializer* serializ
memPtr->m_bodyB = serializer->getUniquePointer((void*)m_joints[i]->m_bodies[1].m_rigid);
}
}
- serializer->finalizeChunk(chunk,"btSoftBodyJointData",BT_ARRAY_CODE,(void*) &m_joints[0]);
+ serializer->finalizeChunk(chunk, "btSoftBodyJointData", BT_ARRAY_CODE, (void*)&m_joints[0]);
}
-
return btSoftBodyDataName;
}
-
diff --git a/thirdparty/bullet/BulletSoftBody/btSoftBody.h b/thirdparty/bullet/BulletSoftBody/btSoftBody.h
index ada0dfd1a5..9b35b799d8 100644
--- a/thirdparty/bullet/BulletSoftBody/btSoftBody.h
+++ b/thirdparty/bullet/BulletSoftBody/btSoftBody.h
@@ -31,862 +31,890 @@ subject to the following restrictions:
//#define btRigidBodyData btRigidBodyDoubleData
//#define btRigidBodyDataName "btRigidBodyDoubleData"
//#else
-#define btSoftBodyData btSoftBodyFloatData
-#define btSoftBodyDataName "btSoftBodyFloatData"
+#define btSoftBodyData btSoftBodyFloatData
+#define btSoftBodyDataName "btSoftBodyFloatData"
//#endif //BT_USE_DOUBLE_PRECISION
class btBroadphaseInterface;
class btDispatcher;
class btSoftBodySolver;
-/* btSoftBodyWorldInfo */
-struct btSoftBodyWorldInfo
+/* 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;
+ 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)
+ : 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.
+///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
+class btSoftBody : public btCollisionObject
{
public:
btAlignedObjectArray<const class btCollisionObject*> m_collisionDisabledObjects;
// The solver object that handles this soft body
- btSoftBodySolver *m_softBodySolver;
+ 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
- };};
+ ///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
- };};
+ 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
- };};
+ 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
- };};
+ struct eSolverPresets
+ {
+ enum _
+ {
+ Positions,
+ Velocities,
+ Default = Positions,
+ END
+ };
+ };
///eFeature
- struct eFeature { enum _ {
- None,
- Node,
- Link,
- Face,
- Tetra,
- END
- };};
-
- typedef btAlignedObjectArray<eVSolver::_> tVSolverArray;
- typedef btAlignedObjectArray<ePSolver::_> tPSolverArray;
+ struct eFeature
+ {
+ enum _
+ {
+ None,
+ Node,
+ Link,
+ Face,
+ Tetra,
+ END
+ };
+ };
+
+ typedef btAlignedObjectArray<eVSolver::_> tVSolverArray;
+ typedef btAlignedObjectArray<ePSolver::_> 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
-
- SVSmask = 0x0030, ///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
- /* presets */
- Default = SDF_RS,
- END
- };};
+ 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
+
+ SVSmask = 0x0030, ///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
+ /* presets */
+ Default = SDF_RS,
+ END
+ };
+ };
///fMaterial
- struct fMaterial { enum _ {
- DebugDraw = 0x0001, /// Enable debug draw
- /* presets */
- Default = DebugDraw,
- END
- };};
+ struct fMaterial
+ {
+ enum _
+ {
+ DebugDraw = 0x0001, /// Enable debug draw
+ /* presets */
+ Default = DebugDraw,
+ END
+ };
+ };
//
// API Types
//
- /* sRayCast */
+ /* 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)
+ 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
+ /* ImplicitFn */
+ struct ImplicitFn
{
virtual ~ImplicitFn() {}
- virtual btScalar Eval(const btVector3& x)=0;
+ virtual btScalar Eval(const btVector3& x) = 0;
};
//
// Internal types
//
- typedef btAlignedObjectArray<btScalar> tScalarArray;
- typedef btAlignedObjectArray<btVector3> tVector3Array;
+ typedef btAlignedObjectArray<btScalar> tScalarArray;
+ typedef btAlignedObjectArray<btVector3> tVector3Array;
- /* sCti is Softbody contact info */
- struct sCti
+ /* sCti is Softbody contact info */
+ struct sCti
{
- const btCollisionObject* m_colObj; /* Rigid body */
- btVector3 m_normal; /* Outward normal */
- btScalar m_offset; /* Offset from origin */
- };
+ const btCollisionObject* m_colObj; /* Rigid body */
+ btVector3 m_normal; /* Outward normal */
+ btScalar m_offset; /* Offset from origin */
+ };
- /* sMedium */
- struct sMedium
+ /* sMedium */
+ struct sMedium
{
- btVector3 m_velocity; /* Velocity */
- btScalar m_pressure; /* Pressure */
- btScalar m_density; /* Density */
+ btVector3 m_velocity; /* Velocity */
+ btScalar m_pressure; /* Pressure */
+ btScalar m_density; /* Density */
};
- /* Base type */
- struct Element
+ /* Base type */
+ struct Element
{
- void* m_tag; // User data
+ void* m_tag; // User data
Element() : m_tag(0) {}
};
- /* Material */
- struct Material : Element
+ /* 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
+ 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
+ /* Feature */
+ struct Feature : Element
{
- Material* m_material; // Material
+ Material* m_material; // Material
};
- /* Node */
- struct Node : Feature
+ /* Node */
+ struct Node : Feature
{
- btVector3 m_x; // Position
- btVector3 m_q; // Previous step position
- btVector3 m_v; // 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_battach:1; // Attached
+ btVector3 m_x; // Position
+ btVector3 m_q; // Previous step position
+ btVector3 m_v; // 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_battach : 1; // Attached
};
- /* Link */
- ATTRIBUTE_ALIGNED16(struct) Link : Feature
+ /* 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();
+ 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();
+ };
+ /* Face */
+ struct Face : Feature
+ {
+ Node* m_n[3]; // Node pointers
+ btVector3 m_normal; // Normal
+ btScalar m_ra; // Rest area
+ btDbvtNode* m_leaf; // Leaf data
+ };
+ /* 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)
+ };
+ /* 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
+ };
+ /* 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
};
- /* Face */
- struct Face : Feature
- {
- Node* m_n[3]; // Node pointers
- btVector3 m_normal; // Normal
- btScalar m_ra; // Rest area
- btDbvtNode* m_leaf; // Leaf data
- };
- /* 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)
- };
- /* 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
- };
- /* 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<Node*> 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
+ /* 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<Node*> 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 i = *this;
+ i.m_velocity = -i.m_velocity;
+ i.m_drift = -i.m_drift;
+ return (i);
}
- Impulse operator*(btScalar x) const
+ Impulse operator*(btScalar x) const
{
- Impulse i=*this;
- i.m_velocity*=x;
- i.m_drift*=x;
- return(i);
+ Impulse i = *this;
+ i.m_velocity *= x;
+ i.m_drift *= x;
+ return (i);
}
};
- /* Body */
- struct Body
+ /* Body */
+ struct Body
{
- Cluster* m_soft;
- btRigidBody* m_rigid;
- const btCollisionObject* m_collisionObject;
+ 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)
+ 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
+ void activate() const
{
- if(m_rigid)
+ if (m_rigid)
m_rigid->activate();
if (m_collisionObject)
m_collisionObject->activate();
-
}
- const btMatrix3x3& invWorldInertia() const
+ 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);
+ 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
+ btScalar invMass() const
{
- if(m_rigid) return(m_rigid->getInvMass());
- if(m_soft) return(m_soft->m_imass);
- return(0);
+ if (m_rigid) return (m_rigid->getInvMass());
+ if (m_soft) return (m_soft->m_imass);
+ return (0);
}
- const btTransform& xform() const
+ 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);
+ 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
+ btVector3 linearVelocity() const
{
- if(m_rigid) return(m_rigid->getLinearVelocity());
- if(m_soft) return(m_soft->m_lv);
- return(btVector3(0,0,0));
+ 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 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 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
+ btVector3 velocity(const btVector3& rpos) const
{
- return(linearVelocity()+angularVelocity(rpos));
+ return (linearVelocity() + angularVelocity(rpos));
}
- void applyVImpulse(const btVector3& impulse,const btVector3& rpos) const
+ 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);
+ 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
+ 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 (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)
+ 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);
+ // 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)
+ 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);
+ // 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
+ void applyVAImpulse(const btVector3& impulse) const
{
- if(m_rigid) m_rigid->applyTorqueImpulse(impulse);
- if(m_soft) btSoftBody::clusterVAImpulse(m_soft,impulse);
+ if (m_rigid) m_rigid->applyTorqueImpulse(impulse);
+ if (m_soft) btSoftBody::clusterVAImpulse(m_soft, impulse);
}
- void applyDAImpulse(const btVector3& impulse) const
+ void applyDAImpulse(const btVector3& impulse) const
{
- if(m_rigid) m_rigid->applyTorqueImpulse(impulse);
- if(m_soft) btSoftBody::clusterDAImpulse(m_soft,impulse);
+ if (m_rigid) m_rigid->applyTorqueImpulse(impulse);
+ if (m_soft) btSoftBody::clusterDAImpulse(m_soft, impulse);
}
- void applyAImpulse(const Impulse& impulse) const
+ void applyAImpulse(const Impulse& impulse) const
{
- if(impulse.m_asVelocity) applyVAImpulse(impulse.m_velocity);
- if(impulse.m_asDrift) applyDAImpulse(impulse.m_drift);
+ if (impulse.m_asVelocity) applyVAImpulse(impulse.m_velocity);
+ if (impulse.m_asDrift) applyDAImpulse(impulse.m_drift);
}
- void applyDCImpulse(const btVector3& impulse) const
+ void applyDCImpulse(const btVector3& impulse) const
{
- if(m_rigid) m_rigid->applyCentralImpulse(impulse);
- if(m_soft) btSoftBody::clusterDCImpulse(m_soft,impulse);
+ if (m_rigid) m_rigid->applyCentralImpulse(impulse);
+ if (m_soft) btSoftBody::clusterDCImpulse(m_soft, impulse);
}
};
- /* Joint */
- struct Joint
+ /* Joint */
+ struct Joint
{
- struct eType { enum _ {
- Linear=0,
- Angular,
- Contact
- };};
+ struct eType
+ {
+ enum _
+ {
+ Linear = 0,
+ Angular,
+ Contact
+ };
+ };
struct Specs
{
- Specs() : erp(1),cfm(1),split(1) {}
- btScalar erp;
- btScalar cfm;
- btScalar split;
+ 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() {}
+ 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;
+ 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
+ /* 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); }
+ 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
+ /* 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); }
+ 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
- };
- /* SolverState */
- struct SolverState
- {
- btScalar sdt; // dt*timescale
- btScalar isdt; // 1/sdt
- btScalar velmrg; // velocity margin
- btScalar radmrg; // radial margin
- btScalar updmrg; // Update margin
- };
+ 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
+ };
+ /* SolverState */
+ struct SolverState
+ {
+ 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);
+ 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<Cluster*> tClusterArray;
- typedef btAlignedObjectArray<Note> tNoteArray;
- typedef btAlignedObjectArray<Node> tNodeArray;
- typedef btAlignedObjectArray<btDbvtNode*> tLeafArray;
- typedef btAlignedObjectArray<Link> tLinkArray;
- typedef btAlignedObjectArray<Face> tFaceArray;
- typedef btAlignedObjectArray<Tetra> tTetraArray;
- typedef btAlignedObjectArray<Anchor> tAnchorArray;
- typedef btAlignedObjectArray<RContact> tRContactArray;
- typedef btAlignedObjectArray<SContact> tSContactArray;
- typedef btAlignedObjectArray<Material*> tMaterialArray;
- typedef btAlignedObjectArray<Joint*> tJointArray;
- typedef btAlignedObjectArray<btSoftBody*> tSoftBodyArray;
+ typedef void (*psolver_t)(btSoftBody*, btScalar, btScalar);
+ typedef void (*vsolver_t)(btSoftBody*, btScalar);
+ typedef btAlignedObjectArray<Cluster*> tClusterArray;
+ typedef btAlignedObjectArray<Note> tNoteArray;
+ typedef btAlignedObjectArray<Node> tNodeArray;
+ typedef btAlignedObjectArray<btDbvtNode*> tLeafArray;
+ typedef btAlignedObjectArray<Link> tLinkArray;
+ typedef btAlignedObjectArray<Face> tFaceArray;
+ typedef btAlignedObjectArray<Tetra> tTetraArray;
+ typedef btAlignedObjectArray<Anchor> tAnchorArray;
+ typedef btAlignedObjectArray<RContact> tRContactArray;
+ typedef btAlignedObjectArray<SContact> tSContactArray;
+ typedef btAlignedObjectArray<Material*> tMaterialArray;
+ typedef btAlignedObjectArray<Joint*> tJointArray;
+ typedef btAlignedObjectArray<btSoftBody*> 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
- tLinkArray m_links; // Links
- tFaceArray m_faces; // Faces
- tTetraArray m_tetras; // Tetras
- tAnchorArray m_anchors; // Anchors
- tRContactArray m_rcontacts; // Rigid contacts
- 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
- btDbvt m_cdbvt; // Clusters tree
- tClusterArray m_clusters; // Clusters
-
- btAlignedObjectArray<bool>m_clusterConnectivity;//cluster connectivity, for self-collision
-
- btTransform m_initialWorldTransform;
-
- btVector3 m_windVelocity;
-
- btScalar m_restLengthScale;
-
+ 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
+ tLinkArray m_links; // Links
+ tFaceArray m_faces; // Faces
+ tTetraArray m_tetras; // Tetras
+ tAnchorArray m_anchors; // Anchors
+ tRContactArray m_rcontacts; // Rigid contacts
+ 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
+ btDbvt m_cdbvt; // Clusters tree
+ tClusterArray m_clusters; // Clusters
+
+ btAlignedObjectArray<bool> m_clusterConnectivity; //cluster connectivity, for self-collision
+
+ btTransform m_initialWorldTransform;
+
+ btVector3 m_windVelocity;
+
+ btScalar m_restLengthScale;
+
//
// Api
//
- /* ctor */
- btSoftBody( btSoftBodyWorldInfo* worldInfo,int node_count, const btVector3* x, const btScalar* m);
+ /* ctor */
+ btSoftBody(btSoftBodyWorldInfo* worldInfo, int node_count, const btVector3* x, const btScalar* m);
- /* ctor */
- btSoftBody( btSoftBodyWorldInfo* worldInfo);
+ /* ctor */
+ btSoftBody(btSoftBodyWorldInfo* worldInfo);
- void initDefaults();
+ void initDefaults();
- /* dtor */
+ /* dtor */
virtual ~btSoftBody();
- /* Check for existing link */
+ /* Check for existing link */
- btAlignedObjectArray<int> m_userIndexMapping;
+ btAlignedObjectArray<int> m_userIndexMapping;
- btSoftBodyWorldInfo* getWorldInfo()
+ btSoftBodyWorldInfo* getWorldInfo()
{
return m_worldInfo;
}
///@todo: avoid internal softbody shape hack and move collision code to collision library
- virtual void setCollisionShape(btCollisionShape* collisionShape)
+ 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);
+ 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 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);
- /* 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);
+ void appendTetra(int node0,
+ int node1,
+ int node2,
+ int node3,
+ Material* mat = 0);
+
+ /* Append anchor */
+ 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);
+ /* 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);
+ 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);
+ 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);
+ void setVolumeMass(btScalar mass);
/* Set volume density (using tetrahedrons) */
- void setVolumeDensity( btScalar density);
- /* Transform */
- void transform( const btTransform& trs);
- /* Translate */
- void translate( const btVector3& trs);
- /* Rotate */
- void rotate( const btQuaternion& rot);
- /* Scale */
- void scale( const btVector3& scl);
+ void setVolumeDensity(btScalar density);
+ /* 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();
+ 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 */
- 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) */
+ 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 */
+ 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);
+ 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);
- /* 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<btSoftBody*>& bodies);
- /* integrateMotion */
- void integrateMotion();
- /* defaultCollisionHandlers */
- void defaultCollisionHandler(const btCollisionObjectWrapper* pcoWrap);
- void defaultCollisionHandler(btSoftBody* psb);
-
-
+ bool rayTest(const btVector3& rayFrom,
+ const btVector3& rayTo,
+ sRayCast& results);
+ /* 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<btSoftBody*>& bodies);
+ /* integrateMotion */
+ void integrateMotion();
+ /* defaultCollisionHandlers */
+ void defaultCollisionHandler(const btCollisionObjectWrapper* pcoWrap);
+ void defaultCollisionHandler(btSoftBody* psb);
//
// Functionality to deal with new accelerated solvers.
@@ -895,8 +923,7 @@ public:
/**
* Set a wind velocity for interaction with the air.
*/
- void setWindVelocity( const btVector3 &velocity );
-
+ void setWindVelocity(const btVector3& velocity);
/**
* Return the wind velocity for interaction with the air.
@@ -907,41 +934,40 @@ public:
// 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 )
+ void setSoftBodySolver(btSoftBodySolver* softBodySolver)
{
m_softBodySolver = softBodySolver;
}
//
// Return the solver that handles this soft body
- //
- btSoftBodySolver *getSoftBodySolver()
+ //
+ btSoftBodySolver* getSoftBodySolver()
{
return m_softBodySolver;
}
//
// Return the solver that handles this soft body
- //
- btSoftBodySolver *getSoftBodySolver() const
+ //
+ btSoftBodySolver* getSoftBodySolver() const
{
return m_softBodySolver;
}
-
//
// Cast
//
- static const btSoftBody* upcast(const btCollisionObject* colObj)
+ static const btSoftBody* upcast(const btCollisionObject* colObj)
{
- if (colObj->getInternalType()==CO_SOFT_BODY)
+ if (colObj->getInternalType() == CO_SOFT_BODY)
return (const btSoftBody*)colObj;
return 0;
}
- static btSoftBody* upcast(btCollisionObject* colObj)
+ static btSoftBody* upcast(btCollisionObject* colObj)
{
- if (colObj->getInternalType()==CO_SOFT_BODY)
+ if (colObj->getInternalType() == CO_SOFT_BODY)
return (btSoftBody*)colObj;
return 0;
}
@@ -950,7 +976,7 @@ public:
// ::btCollisionObject
//
- virtual void getAabb(btVector3& aabbMin,btVector3& aabbMax) const
+ virtual void getAabb(btVector3& aabbMin, btVector3& aabbMax) const
{
aabbMin = m_bounds[0];
aabbMax = m_bounds[1];
@@ -958,48 +984,42 @@ public:
//
// 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();
- btVector3 evaluateCom() 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 applyForces();
- 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);
-
-
- virtual int calculateSerializeBufferSize() const;
+ 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();
+ btVector3 evaluateCom() 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 applyForces();
+ 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);
+
+ 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 const char* serialize(void* dataBuffer, class btSerializer* serializer) const;
//virtual void serializeSingleObject(class btSerializer* serializer) const;
-
-
};
-
-
-
-#endif //_BT_SOFT_BODY_H
+#endif //_BT_SOFT_BODY_H
diff --git a/thirdparty/bullet/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.cpp b/thirdparty/bullet/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.cpp
index ab84bddf2a..750718f57f 100644
--- a/thirdparty/bullet/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.cpp
+++ b/thirdparty/bullet/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.cpp
@@ -13,7 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btSoftBodyConcaveCollisionAlgorithm.h"
#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
#include "BulletCollision/CollisionShapes/btMultiSphereShape.h"
@@ -27,34 +26,28 @@ subject to the following restrictions:
#include "BulletCollision/CollisionShapes/btConvexHullShape.h"
#include "BulletCollision/CollisionDispatch/btCollisionObjectWrapper.h"
-
#include "LinearMath/btIDebugDraw.h"
#include "BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h"
#include "BulletSoftBody/btSoftBody.h"
-#define BT_SOFTBODY_TRIANGLE_EXTRUSION btScalar(0.06)//make this configurable
+#define BT_SOFTBODY_TRIANGLE_EXTRUSION btScalar(0.06) //make this configurable
-btSoftBodyConcaveCollisionAlgorithm::btSoftBodyConcaveCollisionAlgorithm( const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,bool isSwapped)
-: btCollisionAlgorithm(ci),
-m_isSwapped(isSwapped),
-m_btSoftBodyTriangleCallback(ci.m_dispatcher1,body0Wrap,body1Wrap,isSwapped)
+btSoftBodyConcaveCollisionAlgorithm::btSoftBodyConcaveCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, bool isSwapped)
+ : btCollisionAlgorithm(ci),
+ m_isSwapped(isSwapped),
+ m_btSoftBodyTriangleCallback(ci.m_dispatcher1, body0Wrap, body1Wrap, isSwapped)
{
}
-
-
btSoftBodyConcaveCollisionAlgorithm::~btSoftBodyConcaveCollisionAlgorithm()
{
}
-
-
-btSoftBodyTriangleCallback::btSoftBodyTriangleCallback(btDispatcher* dispatcher,const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,bool isSwapped):
-m_dispatcher(dispatcher),
-m_dispatchInfoPtr(0)
+btSoftBodyTriangleCallback::btSoftBodyTriangleCallback(btDispatcher* dispatcher, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, bool isSwapped) : m_dispatcher(dispatcher),
+ m_dispatchInfoPtr(0)
{
- m_softBody = (isSwapped? (btSoftBody*)body1Wrap->getCollisionObject():(btSoftBody*)body0Wrap->getCollisionObject());
- m_triBody = isSwapped? body0Wrap->getCollisionObject():body1Wrap->getCollisionObject();
+ m_softBody = (isSwapped ? (btSoftBody*)body1Wrap->getCollisionObject() : (btSoftBody*)body0Wrap->getCollisionObject());
+ m_triBody = isSwapped ? body0Wrap->getCollisionObject() : body1Wrap->getCollisionObject();
//
// create the manifold from the dispatcher 'manifold pool'
@@ -68,46 +61,42 @@ btSoftBodyTriangleCallback::~btSoftBodyTriangleCallback()
{
clearCache();
// m_dispatcher->releaseManifold( m_manifoldPtr );
-
}
-
-void btSoftBodyTriangleCallback::clearCache()
+void btSoftBodyTriangleCallback::clearCache()
{
- for (int i=0;i<m_shapeCache.size();i++)
+ for (int i = 0; i < m_shapeCache.size(); i++)
{
btTriIndex* tmp = m_shapeCache.getAtIndex(i);
btAssert(tmp);
btAssert(tmp->m_childShape);
- m_softBody->getWorldInfo()->m_sparsesdf.RemoveReferences(tmp->m_childShape);//necessary?
+ m_softBody->getWorldInfo()->m_sparsesdf.RemoveReferences(tmp->m_childShape); //necessary?
delete tmp->m_childShape;
}
m_shapeCache.clear();
}
-
-void btSoftBodyTriangleCallback::processTriangle(btVector3* triangle,int partId, int triangleIndex)
+void btSoftBodyTriangleCallback::processTriangle(btVector3* triangle, int partId, int triangleIndex)
{
//just for debugging purposes
//printf("triangle %d",m_triangleCount++);
-
+
btCollisionAlgorithmConstructionInfo ci;
ci.m_dispatcher1 = m_dispatcher;
///debug drawing of the overlapping triangles
- if (m_dispatchInfoPtr && m_dispatchInfoPtr->m_debugDraw && (m_dispatchInfoPtr->m_debugDraw->getDebugMode() &btIDebugDraw::DBG_DrawWireframe))
+ if (m_dispatchInfoPtr && m_dispatchInfoPtr->m_debugDraw && (m_dispatchInfoPtr->m_debugDraw->getDebugMode() & btIDebugDraw::DBG_DrawWireframe))
{
- btVector3 color(1,1,0);
+ btVector3 color(1, 1, 0);
const btTransform& tr = m_triBody->getWorldTransform();
- m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[0]),tr(triangle[1]),color);
- m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[1]),tr(triangle[2]),color);
- m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[2]),tr(triangle[0]),color);
+ m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[0]), tr(triangle[1]), color);
+ m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[1]), tr(triangle[2]), color);
+ m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[2]), tr(triangle[0]), color);
}
- btTriIndex triIndex(partId,triangleIndex,0);
+ btTriIndex triIndex(partId, triangleIndex, 0);
btHashKey<btTriIndex> triKey(triIndex.getUid());
-
btTriIndex* shapeIndex = m_shapeCache[triKey];
if (shapeIndex)
{
@@ -117,82 +106,73 @@ void btSoftBodyTriangleCallback::processTriangle(btVector3* triangle,int partId,
//copy over user pointers to temporary shape
tm->setUserPointer(m_triBody->getCollisionShape()->getUserPointer());
- btCollisionObjectWrapper softBody(0,m_softBody->getCollisionShape(),m_softBody,m_softBody->getWorldTransform(),-1,-1);
+ btCollisionObjectWrapper softBody(0, m_softBody->getCollisionShape(), m_softBody, m_softBody->getWorldTransform(), -1, -1);
//btCollisionObjectWrapper triBody(0,tm, ob, btTransform::getIdentity());//ob->getWorldTransform());//??
- btCollisionObjectWrapper triBody(0,tm, m_triBody, m_triBody->getWorldTransform(),partId, triangleIndex);
+ btCollisionObjectWrapper triBody(0, tm, m_triBody, m_triBody->getWorldTransform(), partId, triangleIndex);
ebtDispatcherQueryType algoType = m_resultOut->m_closestPointDistanceThreshold > 0 ? BT_CLOSEST_POINT_ALGORITHMS : BT_CONTACT_POINT_ALGORITHMS;
- btCollisionAlgorithm* colAlgo = ci.m_dispatcher1->findAlgorithm(&softBody,&triBody,0, algoType);//m_manifoldPtr);
+ btCollisionAlgorithm* colAlgo = ci.m_dispatcher1->findAlgorithm(&softBody, &triBody, 0, algoType); //m_manifoldPtr);
- colAlgo->processCollision(&softBody,&triBody,*m_dispatchInfoPtr,m_resultOut);
+ colAlgo->processCollision(&softBody, &triBody, *m_dispatchInfoPtr, m_resultOut);
colAlgo->~btCollisionAlgorithm();
ci.m_dispatcher1->freeCollisionAlgorithm(colAlgo);
-
+
return;
}
- //aabb filter is already applied!
+ //aabb filter is already applied!
//btCollisionObject* colObj = static_cast<btCollisionObject*>(m_convexProxy->m_clientObject);
// if (m_softBody->getCollisionShape()->getShapeType()==
{
// btVector3 other;
- btVector3 normal = (triangle[1]-triangle[0]).cross(triangle[2]-triangle[0]);
+ btVector3 normal = (triangle[1] - triangle[0]).cross(triangle[2] - triangle[0]);
normal.normalize();
- normal*= BT_SOFTBODY_TRIANGLE_EXTRUSION;
+ normal *= BT_SOFTBODY_TRIANGLE_EXTRUSION;
// other=(triangle[0]+triangle[1]+triangle[2])*0.333333f;
// other+=normal*22.f;
- btVector3 pts[6] = {triangle[0]+normal,
- triangle[1]+normal,
- triangle[2]+normal,
- triangle[0]-normal,
- triangle[1]-normal,
- triangle[2]-normal};
-
- btConvexHullShape* tm = new btConvexHullShape(&pts[0].getX(),6);
+ btVector3 pts[6] = {triangle[0] + normal,
+ triangle[1] + normal,
+ triangle[2] + normal,
+ triangle[0] - normal,
+ triangle[1] - normal,
+ triangle[2] - normal};
+ btConvexHullShape* tm = new btConvexHullShape(&pts[0].getX(), 6);
// btBU_Simplex1to4 tm(triangle[0],triangle[1],triangle[2],other);
- //btTriangleShape tm(triangle[0],triangle[1],triangle[2]);
+ //btTriangleShape tm(triangle[0],triangle[1],triangle[2]);
// tm.setMargin(m_collisionMarginTriangle);
//copy over user pointers to temporary shape
tm->setUserPointer(m_triBody->getCollisionShape()->getUserPointer());
-
- btCollisionObjectWrapper softBody(0,m_softBody->getCollisionShape(),m_softBody,m_softBody->getWorldTransform(),-1,-1);
- btCollisionObjectWrapper triBody(0,tm, m_triBody, m_triBody->getWorldTransform(),partId, triangleIndex);//btTransform::getIdentity());//??
+ btCollisionObjectWrapper softBody(0, m_softBody->getCollisionShape(), m_softBody, m_softBody->getWorldTransform(), -1, -1);
+ btCollisionObjectWrapper triBody(0, tm, m_triBody, m_triBody->getWorldTransform(), partId, triangleIndex); //btTransform::getIdentity());//??
ebtDispatcherQueryType algoType = m_resultOut->m_closestPointDistanceThreshold > 0 ? BT_CLOSEST_POINT_ALGORITHMS : BT_CONTACT_POINT_ALGORITHMS;
- btCollisionAlgorithm* colAlgo = ci.m_dispatcher1->findAlgorithm(&softBody,&triBody,0, algoType);//m_manifoldPtr);
+ btCollisionAlgorithm* colAlgo = ci.m_dispatcher1->findAlgorithm(&softBody, &triBody, 0, algoType); //m_manifoldPtr);
- colAlgo->processCollision(&softBody,&triBody,*m_dispatchInfoPtr,m_resultOut);
+ colAlgo->processCollision(&softBody, &triBody, *m_dispatchInfoPtr, m_resultOut);
colAlgo->~btCollisionAlgorithm();
ci.m_dispatcher1->freeCollisionAlgorithm(colAlgo);
triIndex.m_childShape = tm;
- m_shapeCache.insert(triKey,triIndex);
-
+ m_shapeCache.insert(triKey, triIndex);
}
-
-
-
}
-
-
-void btSoftBodyTriangleCallback::setTimeStepAndCounters(btScalar collisionMarginTriangle,const btCollisionObjectWrapper* triBodyWrap, const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+void btSoftBodyTriangleCallback::setTimeStepAndCounters(btScalar collisionMarginTriangle, const btCollisionObjectWrapper* triBodyWrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
m_dispatchInfoPtr = &dispatchInfo;
- m_collisionMarginTriangle = collisionMarginTriangle+btScalar(BT_SOFTBODY_TRIANGLE_EXTRUSION);
+ m_collisionMarginTriangle = collisionMarginTriangle + btScalar(BT_SOFTBODY_TRIANGLE_EXTRUSION);
m_resultOut = resultOut;
-
- btVector3 aabbWorldSpaceMin,aabbWorldSpaceMax;
- m_softBody->getAabb(aabbWorldSpaceMin,aabbWorldSpaceMax);
- btVector3 halfExtents = (aabbWorldSpaceMax-aabbWorldSpaceMin)*btScalar(0.5);
- btVector3 softBodyCenter = (aabbWorldSpaceMax+aabbWorldSpaceMin)*btScalar(0.5);
+ btVector3 aabbWorldSpaceMin, aabbWorldSpaceMax;
+ m_softBody->getAabb(aabbWorldSpaceMin, aabbWorldSpaceMax);
+ btVector3 halfExtents = (aabbWorldSpaceMax - aabbWorldSpaceMin) * btScalar(0.5);
+ btVector3 softBodyCenter = (aabbWorldSpaceMax + aabbWorldSpaceMin) * btScalar(0.5);
btTransform softTransform;
softTransform.setIdentity();
@@ -200,56 +180,45 @@ void btSoftBodyTriangleCallback::setTimeStepAndCounters(btScalar collisionMargin
btTransform convexInTriangleSpace;
convexInTriangleSpace = triBodyWrap->getWorldTransform().inverse() * softTransform;
- btTransformAabb(halfExtents,m_collisionMarginTriangle,convexInTriangleSpace,m_aabbMin,m_aabbMax);
+ btTransformAabb(halfExtents, m_collisionMarginTriangle, convexInTriangleSpace, m_aabbMin, m_aabbMax);
}
void btSoftBodyConcaveCollisionAlgorithm::clearCache()
{
m_btSoftBodyTriangleCallback.clearCache();
-
}
-void btSoftBodyConcaveCollisionAlgorithm::processCollision (const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+void btSoftBodyConcaveCollisionAlgorithm::processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
-
-
//btCollisionObject* convexBody = m_isSwapped ? body1 : body0;
const btCollisionObjectWrapper* triBody = m_isSwapped ? body0Wrap : body1Wrap;
if (triBody->getCollisionShape()->isConcave())
{
-
-
- const btCollisionObject* triOb = triBody->getCollisionObject();
- const btConcaveShape* concaveShape = static_cast<const btConcaveShape*>( triOb->getCollisionShape());
+ const btCollisionObject* triOb = triBody->getCollisionObject();
+ const btConcaveShape* concaveShape = static_cast<const btConcaveShape*>(triOb->getCollisionShape());
// if (convexBody->getCollisionShape()->isConvex())
{
btScalar collisionMarginTriangle = concaveShape->getMargin();
// resultOut->setPersistentManifold(m_btSoftBodyTriangleCallback.m_manifoldPtr);
- m_btSoftBodyTriangleCallback.setTimeStepAndCounters(collisionMarginTriangle,triBody,dispatchInfo,resultOut);
+ m_btSoftBodyTriangleCallback.setTimeStepAndCounters(collisionMarginTriangle, triBody, dispatchInfo, resultOut);
-
- concaveShape->processAllTriangles( &m_btSoftBodyTriangleCallback,m_btSoftBodyTriangleCallback.getAabbMin(),m_btSoftBodyTriangleCallback.getAabbMax());
+ concaveShape->processAllTriangles(&m_btSoftBodyTriangleCallback, m_btSoftBodyTriangleCallback.getAabbMin(), m_btSoftBodyTriangleCallback.getAabbMax());
// resultOut->refreshContactPoints();
-
}
-
}
-
}
-
-btScalar btSoftBodyConcaveCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+btScalar btSoftBodyConcaveCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
(void)resultOut;
(void)dispatchInfo;
btCollisionObject* convexbody = m_isSwapped ? body1 : body0;
btCollisionObject* triBody = m_isSwapped ? body0 : body1;
-
//quick approximation using raycast, todo: hook up to the continuous collision detection (one of the btConvexCast)
//only perform CCD above a certain threshold, this prevents blocking on the long run
@@ -268,25 +237,23 @@ btScalar btSoftBodyConcaveCollisionAlgorithm::calculateTimeOfImpact(btCollisionO
btTransform convexFromLocal = triInv * convexbody->getWorldTransform();
btTransform convexToLocal = triInv * convexbody->getInterpolationWorldTransform();
- struct LocalTriangleSphereCastCallback : public btTriangleCallback
+ struct LocalTriangleSphereCastCallback : public btTriangleCallback
{
btTransform m_ccdSphereFromTrans;
btTransform m_ccdSphereToTrans;
- btTransform m_meshTransform;
+ btTransform m_meshTransform;
- btScalar m_ccdSphereRadius;
- btScalar m_hitFraction;
+ btScalar m_ccdSphereRadius;
+ btScalar m_hitFraction;
-
- LocalTriangleSphereCastCallback(const btTransform& from,const btTransform& to,btScalar ccdSphereRadius,btScalar hitFraction)
- :m_ccdSphereFromTrans(from),
- m_ccdSphereToTrans(to),
- m_ccdSphereRadius(ccdSphereRadius),
- m_hitFraction(hitFraction)
- {
+ LocalTriangleSphereCastCallback(const btTransform& from, const btTransform& to, btScalar ccdSphereRadius, btScalar hitFraction)
+ : m_ccdSphereFromTrans(from),
+ m_ccdSphereToTrans(to),
+ m_ccdSphereRadius(ccdSphereRadius),
+ m_hitFraction(hitFraction)
+ {
}
-
virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex)
{
(void)partId;
@@ -296,29 +263,23 @@ btScalar btSoftBodyConcaveCollisionAlgorithm::calculateTimeOfImpact(btCollisionO
ident.setIdentity();
btConvexCast::CastResult castResult;
castResult.m_fraction = m_hitFraction;
- btSphereShape pointShape(m_ccdSphereRadius);
- btTriangleShape triShape(triangle[0],triangle[1],triangle[2]);
- btVoronoiSimplexSolver simplexSolver;
- btSubsimplexConvexCast convexCaster(&pointShape,&triShape,&simplexSolver);
+ btSphereShape pointShape(m_ccdSphereRadius);
+ btTriangleShape triShape(triangle[0], triangle[1], triangle[2]);
+ btVoronoiSimplexSolver simplexSolver;
+ btSubsimplexConvexCast convexCaster(&pointShape, &triShape, &simplexSolver);
//GjkConvexCast convexCaster(&pointShape,convexShape,&simplexSolver);
//ContinuousConvexCollision convexCaster(&pointShape,convexShape,&simplexSolver,0);
//local space?
- if (convexCaster.calcTimeOfImpact(m_ccdSphereFromTrans,m_ccdSphereToTrans,
- ident,ident,castResult))
+ if (convexCaster.calcTimeOfImpact(m_ccdSphereFromTrans, m_ccdSphereToTrans,
+ ident, ident, castResult))
{
if (m_hitFraction > castResult.m_fraction)
m_hitFraction = castResult.m_fraction;
}
-
}
-
};
-
-
-
-
if (triBody->getCollisionShape()->isConcave())
{
btVector3 rayAabbMin = convexFromLocal.getOrigin();
@@ -326,33 +287,30 @@ btScalar btSoftBodyConcaveCollisionAlgorithm::calculateTimeOfImpact(btCollisionO
btVector3 rayAabbMax = convexFromLocal.getOrigin();
rayAabbMax.setMax(convexToLocal.getOrigin());
btScalar ccdRadius0 = convexbody->getCcdSweptSphereRadius();
- rayAabbMin -= btVector3(ccdRadius0,ccdRadius0,ccdRadius0);
- rayAabbMax += btVector3(ccdRadius0,ccdRadius0,ccdRadius0);
+ rayAabbMin -= btVector3(ccdRadius0, ccdRadius0, ccdRadius0);
+ rayAabbMax += btVector3(ccdRadius0, ccdRadius0, ccdRadius0);
- btScalar curHitFraction = btScalar(1.); //is this available?
- LocalTriangleSphereCastCallback raycastCallback(convexFromLocal,convexToLocal,
- convexbody->getCcdSweptSphereRadius(),curHitFraction);
+ btScalar curHitFraction = btScalar(1.); //is this available?
+ LocalTriangleSphereCastCallback raycastCallback(convexFromLocal, convexToLocal,
+ convexbody->getCcdSweptSphereRadius(), curHitFraction);
raycastCallback.m_hitFraction = convexbody->getHitFraction();
btCollisionObject* concavebody = triBody;
- btConcaveShape* triangleMesh = (btConcaveShape*) concavebody->getCollisionShape();
+ btConcaveShape* triangleMesh = (btConcaveShape*)concavebody->getCollisionShape();
if (triangleMesh)
{
- triangleMesh->processAllTriangles(&raycastCallback,rayAabbMin,rayAabbMax);
+ triangleMesh->processAllTriangles(&raycastCallback, rayAabbMin, rayAabbMax);
}
-
-
if (raycastCallback.m_hitFraction < convexbody->getHitFraction())
{
- convexbody->setHitFraction( raycastCallback.m_hitFraction);
+ convexbody->setHitFraction(raycastCallback.m_hitFraction);
return raycastCallback.m_hitFraction;
}
}
return btScalar(1.);
-
}
diff --git a/thirdparty/bullet/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.h b/thirdparty/bullet/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.h
index 11c7b88f98..3adedbd805 100644
--- a/thirdparty/bullet/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.h
+++ b/thirdparty/bullet/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.h
@@ -29,63 +29,62 @@ class btCollisionShape;
#include "LinearMath/btHashMap.h"
-#include "BulletCollision/BroadphaseCollision/btQuantizedBvh.h" //for definition of MAX_NUM_PARTS_IN_BITS
+#include "BulletCollision/BroadphaseCollision/btQuantizedBvh.h" //for definition of MAX_NUM_PARTS_IN_BITS
struct btTriIndex
{
int m_PartIdTriangleIndex;
- class btCollisionShape* m_childShape;
+ class btCollisionShape* m_childShape;
- btTriIndex(int partId,int triangleIndex,btCollisionShape* shape)
+ btTriIndex(int partId, int triangleIndex, btCollisionShape* shape)
{
- m_PartIdTriangleIndex = (partId<<(31-MAX_NUM_PARTS_IN_BITS)) | triangleIndex;
+ m_PartIdTriangleIndex = (partId << (31 - MAX_NUM_PARTS_IN_BITS)) | triangleIndex;
m_childShape = shape;
}
- int getTriangleIndex() const
+ 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));
+ unsigned int y = (~(x & 0)) << (31 - MAX_NUM_PARTS_IN_BITS);
+ return (m_PartIdTriangleIndex & ~(y));
}
- int getPartId() const
+ int getPartId() const
{
// Get only the highest bits where the part index is stored
- return (m_PartIdTriangleIndex>>(31-MAX_NUM_PARTS_IN_BITS));
+ return (m_PartIdTriangleIndex >> (31 - MAX_NUM_PARTS_IN_BITS));
}
- int getUid() const
+ 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 ;
+ btVector3 m_aabbMin;
+ btVector3 m_aabbMax;
btManifoldResult* m_resultOut;
- btDispatcher* m_dispatcher;
+ btDispatcher* m_dispatcher;
const btDispatcherInfo* m_dispatchInfoPtr;
btScalar m_collisionMarginTriangle;
- btHashMap<btHashKey<btTriIndex>,btTriIndex> m_shapeCache;
+ btHashMap<btHashKey<btTriIndex>, btTriIndex> m_shapeCache;
public:
- int m_triangleCount;
+ int m_triangleCount;
// btPersistentManifold* m_manifoldPtr;
- btSoftBodyTriangleCallback(btDispatcher* dispatcher,const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,bool isSwapped);
+ btSoftBodyTriangleCallback(btDispatcher* dispatcher, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, bool isSwapped);
- void setTimeStepAndCounters(btScalar collisionMarginTriangle,const btCollisionObjectWrapper* triObjWrap,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
+ void setTimeStepAndCounters(btScalar collisionMarginTriangle, const btCollisionObjectWrapper* triObjWrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut);
virtual ~btSoftBodyTriangleCallback();
@@ -101,55 +100,48 @@ public:
{
return m_aabbMax;
}
-
};
-
-
-
/// btSoftBodyConcaveCollisionAlgorithm supports collision between soft body shapes and (concave) trianges meshes.
-class btSoftBodyConcaveCollisionAlgorithm : public btCollisionAlgorithm
+class btSoftBodyConcaveCollisionAlgorithm : public btCollisionAlgorithm
{
-
- bool m_isSwapped;
+ bool m_isSwapped;
btSoftBodyTriangleCallback m_btSoftBodyTriangleCallback;
public:
-
- btSoftBodyConcaveCollisionAlgorithm( const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,bool isSwapped);
+ 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);
+ 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);
+ btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut);
- virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
+ virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
{
//we don't add any manifolds
}
- void clearCache();
+ void clearCache();
- struct CreateFunc :public btCollisionAlgorithmCreateFunc
+ struct CreateFunc : public btCollisionAlgorithmCreateFunc
{
- virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap)
+ 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);
+ return new (mem) btSoftBodyConcaveCollisionAlgorithm(ci, body0Wrap, body1Wrap, false);
}
};
- struct SwappedCreateFunc :public btCollisionAlgorithmCreateFunc
+ struct SwappedCreateFunc : public btCollisionAlgorithmCreateFunc
{
- virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap)
+ 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);
+ return new (mem) btSoftBodyConcaveCollisionAlgorithm(ci, body0Wrap, body1Wrap, true);
}
};
-
};
-#endif //BT_SOFT_BODY_CONCAVE_COLLISION_ALGORITHM_H
+#endif //BT_SOFT_BODY_CONCAVE_COLLISION_ALGORITHM_H
diff --git a/thirdparty/bullet/BulletSoftBody/btSoftBodyData.h b/thirdparty/bullet/BulletSoftBody/btSoftBodyData.h
index 87d8841cfa..cec6f401ec 100644
--- a/thirdparty/bullet/BulletSoftBody/btSoftBodyData.h
+++ b/thirdparty/bullet/BulletSoftBody/btSoftBodyData.h
@@ -19,199 +19,194 @@ subject to the following restrictions:
#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
#include "BulletDynamics/Dynamics/btRigidBody.h"
-
-struct SoftBodyMaterialData
+struct SoftBodyMaterialData
{
- float m_linearStiffness;
- float m_angularStiffness;
- float m_volumeStiffness;
- int m_flags;
+ float m_linearStiffness;
+ float m_angularStiffness;
+ float m_volumeStiffness;
+ int m_flags;
};
-struct SoftBodyNodeData
+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;
+ 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
+struct SoftBodyLinkData
{
- SoftBodyMaterialData *m_material;
- int m_nodeIndices[2]; // Node pointers
- float m_restLength; // Rest length
- int m_bbending; // Bending link
+ SoftBodyMaterialData *m_material;
+ int m_nodeIndices[2]; // Node pointers
+ float m_restLength; // Rest length
+ int m_bbending; // Bending link
};
-struct SoftBodyFaceData
+struct SoftBodyFaceData
{
- btVector3FloatData m_normal; // Normal
- SoftBodyMaterialData *m_material;
- int m_nodeIndices[3]; // Node pointers
- float m_restArea; // Rest area
-};
+ btVector3FloatData m_normal; // Normal
+ SoftBodyMaterialData *m_material;
+ int m_nodeIndices[3]; // Node pointers
+ float m_restArea; // Rest area
+};
-struct SoftBodyTetraData
+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;
+ 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
+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
+ 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
+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
+ 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
+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;
+ 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
+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;
+ 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
+enum btSoftJointBodyType
{
- BT_JOINT_SOFT_BODY_CLUSTER=1,
+ BT_JOINT_SOFT_BODY_CLUSTER = 1,
BT_JOINT_RIGID_BODY,
BT_JOINT_COLLISION_OBJECT
};
-struct btSoftBodyJointData
+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;
+ 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
+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;
+ 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
-
+#endif //BT_SOFTBODY_FLOAT_DATA
diff --git a/thirdparty/bullet/BulletSoftBody/btSoftBodyHelpers.cpp b/thirdparty/bullet/BulletSoftBody/btSoftBodyHelpers.cpp
index 51fcd16da4..d0a9921d89 100644
--- a/thirdparty/bullet/BulletSoftBody/btSoftBodyHelpers.cpp
+++ b/thirdparty/bullet/BulletSoftBody/btSoftBodyHelpers.cpp
@@ -21,106 +21,111 @@ subject to the following restrictions:
#include "LinearMath/btConvexHull.h"
#include "LinearMath/btConvexHullComputer.h"
-
//
-static void drawVertex( btIDebugDraw* idraw,
- const btVector3& x,btScalar s,const btVector3& c)
+static void drawVertex(btIDebugDraw* idraw,
+ const btVector3& x, btScalar s, const btVector3& c)
{
- idraw->drawLine(x-btVector3(s,0,0),x+btVector3(s,0,0),c);
- idraw->drawLine(x-btVector3(0,s,0),x+btVector3(0,s,0),c);
- idraw->drawLine(x-btVector3(0,0,s),x+btVector3(0,0,s),c);
+ idraw->drawLine(x - btVector3(s, 0, 0), x + btVector3(s, 0, 0), c);
+ idraw->drawLine(x - btVector3(0, s, 0), x + btVector3(0, s, 0), c);
+ idraw->drawLine(x - btVector3(0, 0, s), x + btVector3(0, 0, s), c);
}
//
-static void drawBox( btIDebugDraw* idraw,
- const btVector3& mins,
- const btVector3& maxs,
- const btVector3& color)
+static void drawBox(btIDebugDraw* idraw,
+ const btVector3& mins,
+ const btVector3& maxs,
+ const btVector3& color)
{
- const btVector3 c[]={ btVector3(mins.x(),mins.y(),mins.z()),
- btVector3(maxs.x(),mins.y(),mins.z()),
- btVector3(maxs.x(),maxs.y(),mins.z()),
- btVector3(mins.x(),maxs.y(),mins.z()),
- btVector3(mins.x(),mins.y(),maxs.z()),
- btVector3(maxs.x(),mins.y(),maxs.z()),
- btVector3(maxs.x(),maxs.y(),maxs.z()),
- btVector3(mins.x(),maxs.y(),maxs.z())};
- idraw->drawLine(c[0],c[1],color);idraw->drawLine(c[1],c[2],color);
- idraw->drawLine(c[2],c[3],color);idraw->drawLine(c[3],c[0],color);
- idraw->drawLine(c[4],c[5],color);idraw->drawLine(c[5],c[6],color);
- idraw->drawLine(c[6],c[7],color);idraw->drawLine(c[7],c[4],color);
- idraw->drawLine(c[0],c[4],color);idraw->drawLine(c[1],c[5],color);
- idraw->drawLine(c[2],c[6],color);idraw->drawLine(c[3],c[7],color);
+ const btVector3 c[] = {btVector3(mins.x(), mins.y(), mins.z()),
+ btVector3(maxs.x(), mins.y(), mins.z()),
+ btVector3(maxs.x(), maxs.y(), mins.z()),
+ btVector3(mins.x(), maxs.y(), mins.z()),
+ btVector3(mins.x(), mins.y(), maxs.z()),
+ btVector3(maxs.x(), mins.y(), maxs.z()),
+ btVector3(maxs.x(), maxs.y(), maxs.z()),
+ btVector3(mins.x(), maxs.y(), maxs.z())};
+ idraw->drawLine(c[0], c[1], color);
+ idraw->drawLine(c[1], c[2], color);
+ idraw->drawLine(c[2], c[3], color);
+ idraw->drawLine(c[3], c[0], color);
+ idraw->drawLine(c[4], c[5], color);
+ idraw->drawLine(c[5], c[6], color);
+ idraw->drawLine(c[6], c[7], color);
+ idraw->drawLine(c[7], c[4], color);
+ idraw->drawLine(c[0], c[4], color);
+ idraw->drawLine(c[1], c[5], color);
+ idraw->drawLine(c[2], c[6], color);
+ idraw->drawLine(c[3], c[7], color);
}
//
-static void drawTree( btIDebugDraw* idraw,
- const btDbvtNode* node,
- int depth,
- const btVector3& ncolor,
- const btVector3& lcolor,
- int mindepth,
- int maxdepth)
+static void drawTree(btIDebugDraw* idraw,
+ const btDbvtNode* node,
+ int depth,
+ const btVector3& ncolor,
+ const btVector3& lcolor,
+ int mindepth,
+ int maxdepth)
{
- if(node)
+ if (node)
{
- if(node->isinternal()&&((depth<maxdepth)||(maxdepth<0)))
+ if (node->isinternal() && ((depth < maxdepth) || (maxdepth < 0)))
{
- drawTree(idraw,node->childs[0],depth+1,ncolor,lcolor,mindepth,maxdepth);
- drawTree(idraw,node->childs[1],depth+1,ncolor,lcolor,mindepth,maxdepth);
+ drawTree(idraw, node->childs[0], depth + 1, ncolor, lcolor, mindepth, maxdepth);
+ drawTree(idraw, node->childs[1], depth + 1, ncolor, lcolor, mindepth, maxdepth);
}
- if(depth>=mindepth)
+ if (depth >= mindepth)
{
- const btScalar scl=(btScalar)(node->isinternal()?1:1);
- const btVector3 mi=node->volume.Center()-node->volume.Extents()*scl;
- const btVector3 mx=node->volume.Center()+node->volume.Extents()*scl;
- drawBox(idraw,mi,mx,node->isleaf()?lcolor:ncolor);
+ const btScalar scl = (btScalar)(node->isinternal() ? 1 : 1);
+ const btVector3 mi = node->volume.Center() - node->volume.Extents() * scl;
+ const btVector3 mx = node->volume.Center() + node->volume.Extents() * scl;
+ drawBox(idraw, mi, mx, node->isleaf() ? lcolor : ncolor);
}
}
}
//
template <typename T>
-static inline T sum(const btAlignedObjectArray<T>& items)
+static inline T sum(const btAlignedObjectArray<T>& items)
{
- T v;
- if(items.size())
+ T v;
+ if (items.size())
{
- v=items[0];
- for(int i=1,ni=items.size();i<ni;++i)
+ v = items[0];
+ for (int i = 1, ni = items.size(); i < ni; ++i)
{
- v+=items[i];
+ v += items[i];
}
}
- return(v);
+ return (v);
}
//
-template <typename T,typename Q>
-static inline void add(btAlignedObjectArray<T>& items,const Q& value)
+template <typename T, typename Q>
+static inline void add(btAlignedObjectArray<T>& items, const Q& value)
{
- for(int i=0,ni=items.size();i<ni;++i)
+ for (int i = 0, ni = items.size(); i < ni; ++i)
{
- items[i]+=value;
+ items[i] += value;
}
}
//
-template <typename T,typename Q>
-static inline void mul(btAlignedObjectArray<T>& items,const Q& value)
+template <typename T, typename Q>
+static inline void mul(btAlignedObjectArray<T>& items, const Q& value)
{
- for(int i=0,ni=items.size();i<ni;++i)
+ for (int i = 0, ni = items.size(); i < ni; ++i)
{
- items[i]*=value;
+ items[i] *= value;
}
}
//
template <typename T>
-static inline T average(const btAlignedObjectArray<T>& items)
+static inline T average(const btAlignedObjectArray<T>& items)
{
- const btScalar n=(btScalar)(items.size()>0?items.size():1);
- return(sum(items)/n);
+ const btScalar n = (btScalar)(items.size() > 0 ? items.size() : 1);
+ return (sum(items) / n);
}
#if 0
@@ -158,86 +163,84 @@ static btVector3 stresscolor(btScalar stress)
#endif
//
-void btSoftBodyHelpers::Draw( btSoftBody* psb,
- btIDebugDraw* idraw,
- int drawflags)
+void btSoftBodyHelpers::Draw(btSoftBody* psb,
+ btIDebugDraw* idraw,
+ int drawflags)
{
- const btScalar scl=(btScalar)0.1;
- const btScalar nscl=scl*5;
- const btVector3 lcolor=btVector3(0,0,0);
- const btVector3 ncolor=btVector3(1,1,1);
- const btVector3 ccolor=btVector3(1,0,0);
- int i,j,nj;
-
- /* Clusters */
- if(0!=(drawflags&fDrawFlags::Clusters))
+ const btScalar scl = (btScalar)0.1;
+ const btScalar nscl = scl * 5;
+ const btVector3 lcolor = btVector3(0, 0, 0);
+ const btVector3 ncolor = btVector3(1, 1, 1);
+ const btVector3 ccolor = btVector3(1, 0, 0);
+ int i, j, nj;
+
+ /* Clusters */
+ if (0 != (drawflags & fDrawFlags::Clusters))
{
srand(1806);
- for(i=0;i<psb->m_clusters.size();++i)
+ for (i = 0; i < psb->m_clusters.size(); ++i)
{
- if(psb->m_clusters[i]->m_collide)
+ if (psb->m_clusters[i]->m_collide)
{
- btVector3 color( rand()/(btScalar)RAND_MAX,
- rand()/(btScalar)RAND_MAX,
- rand()/(btScalar)RAND_MAX);
- color=color.normalized()*0.75;
- btAlignedObjectArray<btVector3> vertices;
+ btVector3 color(rand() / (btScalar)RAND_MAX,
+ rand() / (btScalar)RAND_MAX,
+ rand() / (btScalar)RAND_MAX);
+ color = color.normalized() * 0.75;
+ btAlignedObjectArray<btVector3> vertices;
vertices.resize(psb->m_clusters[i]->m_nodes.size());
- for(j=0,nj=vertices.size();j<nj;++j)
- {
- vertices[j]=psb->m_clusters[i]->m_nodes[j]->m_x;
+ for (j = 0, nj = vertices.size(); j < nj; ++j)
+ {
+ vertices[j] = psb->m_clusters[i]->m_nodes[j]->m_x;
}
#define USE_NEW_CONVEX_HULL_COMPUTER
#ifdef USE_NEW_CONVEX_HULL_COMPUTER
- btConvexHullComputer computer;
+ btConvexHullComputer computer;
int stride = sizeof(btVector3);
int count = vertices.size();
- btScalar shrink=0.f;
- btScalar shrinkClamp=0.f;
- computer.compute(&vertices[0].getX(),stride,count,shrink,shrinkClamp);
- for (int i=0;i<computer.faces.size();i++)
+ btScalar shrink = 0.f;
+ btScalar shrinkClamp = 0.f;
+ computer.compute(&vertices[0].getX(), stride, count, shrink, shrinkClamp);
+ for (int i = 0; i < computer.faces.size(); i++)
{
-
int face = computer.faces[i];
//printf("face=%d\n",face);
- const btConvexHullComputer::Edge* firstEdge = &computer.edges[face];
- const btConvexHullComputer::Edge* edge = firstEdge->getNextEdgeOfFace();
+ const btConvexHullComputer::Edge* firstEdge = &computer.edges[face];
+ const btConvexHullComputer::Edge* edge = firstEdge->getNextEdgeOfFace();
int v0 = firstEdge->getSourceVertex();
int v1 = firstEdge->getTargetVertex();
- while (edge!=firstEdge)
+ while (edge != firstEdge)
{
int v2 = edge->getTargetVertex();
- idraw->drawTriangle(computer.vertices[v0],computer.vertices[v1],computer.vertices[v2],color,1);
+ idraw->drawTriangle(computer.vertices[v0], computer.vertices[v1], computer.vertices[v2], color, 1);
edge = edge->getNextEdgeOfFace();
- v0=v1;
- v1=v2;
+ v0 = v1;
+ v1 = v2;
};
}
#else
- HullDesc hdsc(QF_TRIANGLES,vertices.size(),&vertices[0]);
- HullResult hres;
- HullLibrary hlib;
- hdsc.mMaxVertices=vertices.size();
- hlib.CreateConvexHull(hdsc,hres);
- const btVector3 center=average(hres.m_OutputVertices);
- add(hres.m_OutputVertices,-center);
- mul(hres.m_OutputVertices,(btScalar)1);
- add(hres.m_OutputVertices,center);
- for(j=0;j<(int)hres.mNumFaces;++j)
+ HullDesc hdsc(QF_TRIANGLES, vertices.size(), &vertices[0]);
+ HullResult hres;
+ HullLibrary hlib;
+ hdsc.mMaxVertices = vertices.size();
+ hlib.CreateConvexHull(hdsc, hres);
+ const btVector3 center = average(hres.m_OutputVertices);
+ add(hres.m_OutputVertices, -center);
+ mul(hres.m_OutputVertices, (btScalar)1);
+ add(hres.m_OutputVertices, center);
+ for (j = 0; j < (int)hres.mNumFaces; ++j)
{
- const int idx[]={hres.m_Indices[j*3+0],hres.m_Indices[j*3+1],hres.m_Indices[j*3+2]};
+ const int idx[] = {hres.m_Indices[j * 3 + 0], hres.m_Indices[j * 3 + 1], hres.m_Indices[j * 3 + 2]};
idraw->drawTriangle(hres.m_OutputVertices[idx[0]],
- hres.m_OutputVertices[idx[1]],
- hres.m_OutputVertices[idx[2]],
- color,1);
+ hres.m_OutputVertices[idx[1]],
+ hres.m_OutputVertices[idx[2]],
+ color, 1);
}
hlib.ReleaseResult(hres);
#endif
-
}
- /* Velocities */
+ /* Velocities */
#if 0
for(int j=0;j<psb->m_clusters[i].m_nodes.size();++j)
{
@@ -247,273 +250,269 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
idraw->drawLine(c.m_nodes[j]->m_x,c.m_nodes[j]->m_x+v,btVector3(1,0,0));
}
#endif
- /* Frame */
- // btSoftBody::Cluster& c=*psb->m_clusters[i];
- // idraw->drawLine(c.m_com,c.m_framexform*btVector3(10,0,0),btVector3(1,0,0));
- // idraw->drawLine(c.m_com,c.m_framexform*btVector3(0,10,0),btVector3(0,1,0));
- // idraw->drawLine(c.m_com,c.m_framexform*btVector3(0,0,10),btVector3(0,0,1));
+ /* Frame */
+ // btSoftBody::Cluster& c=*psb->m_clusters[i];
+ // idraw->drawLine(c.m_com,c.m_framexform*btVector3(10,0,0),btVector3(1,0,0));
+ // idraw->drawLine(c.m_com,c.m_framexform*btVector3(0,10,0),btVector3(0,1,0));
+ // idraw->drawLine(c.m_com,c.m_framexform*btVector3(0,0,10),btVector3(0,0,1));
}
}
else
{
- /* Nodes */
- if(0!=(drawflags&fDrawFlags::Nodes))
+ /* Nodes */
+ if (0 != (drawflags & fDrawFlags::Nodes))
{
- for(i=0;i<psb->m_nodes.size();++i)
+ for (i = 0; i < psb->m_nodes.size(); ++i)
{
- const btSoftBody::Node& n=psb->m_nodes[i];
- if(0==(n.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
- idraw->drawLine(n.m_x-btVector3(scl,0,0),n.m_x+btVector3(scl,0,0),btVector3(1,0,0));
- idraw->drawLine(n.m_x-btVector3(0,scl,0),n.m_x+btVector3(0,scl,0),btVector3(0,1,0));
- idraw->drawLine(n.m_x-btVector3(0,0,scl),n.m_x+btVector3(0,0,scl),btVector3(0,0,1));
+ const btSoftBody::Node& n = psb->m_nodes[i];
+ if (0 == (n.m_material->m_flags & btSoftBody::fMaterial::DebugDraw)) continue;
+ idraw->drawLine(n.m_x - btVector3(scl, 0, 0), n.m_x + btVector3(scl, 0, 0), btVector3(1, 0, 0));
+ idraw->drawLine(n.m_x - btVector3(0, scl, 0), n.m_x + btVector3(0, scl, 0), btVector3(0, 1, 0));
+ idraw->drawLine(n.m_x - btVector3(0, 0, scl), n.m_x + btVector3(0, 0, scl), btVector3(0, 0, 1));
}
}
- /* Links */
- if(0!=(drawflags&fDrawFlags::Links))
+ /* Links */
+ if (0 != (drawflags & fDrawFlags::Links))
{
- for(i=0;i<psb->m_links.size();++i)
+ for (i = 0; i < psb->m_links.size(); ++i)
{
- const btSoftBody::Link& l=psb->m_links[i];
- if(0==(l.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
- idraw->drawLine(l.m_n[0]->m_x,l.m_n[1]->m_x,lcolor);
+ const btSoftBody::Link& l = psb->m_links[i];
+ if (0 == (l.m_material->m_flags & btSoftBody::fMaterial::DebugDraw)) continue;
+ idraw->drawLine(l.m_n[0]->m_x, l.m_n[1]->m_x, lcolor);
}
}
- /* Normals */
- if(0!=(drawflags&fDrawFlags::Normals))
+ /* Normals */
+ if (0 != (drawflags & fDrawFlags::Normals))
{
- for(i=0;i<psb->m_nodes.size();++i)
+ for (i = 0; i < psb->m_nodes.size(); ++i)
{
- const btSoftBody::Node& n=psb->m_nodes[i];
- if(0==(n.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
- const btVector3 d=n.m_n*nscl;
- idraw->drawLine(n.m_x,n.m_x+d,ncolor);
- idraw->drawLine(n.m_x,n.m_x-d,ncolor*0.5);
+ const btSoftBody::Node& n = psb->m_nodes[i];
+ if (0 == (n.m_material->m_flags & btSoftBody::fMaterial::DebugDraw)) continue;
+ const btVector3 d = n.m_n * nscl;
+ idraw->drawLine(n.m_x, n.m_x + d, ncolor);
+ idraw->drawLine(n.m_x, n.m_x - d, ncolor * 0.5);
}
}
- /* Contacts */
- if(0!=(drawflags&fDrawFlags::Contacts))
+ /* Contacts */
+ if (0 != (drawflags & fDrawFlags::Contacts))
{
- static const btVector3 axis[]={btVector3(1,0,0),
- btVector3(0,1,0),
- btVector3(0,0,1)};
- for(i=0;i<psb->m_rcontacts.size();++i)
- {
- const btSoftBody::RContact& c=psb->m_rcontacts[i];
- const btVector3 o= c.m_node->m_x-c.m_cti.m_normal*
- (btDot(c.m_node->m_x,c.m_cti.m_normal)+c.m_cti.m_offset);
- const btVector3 x=btCross(c.m_cti.m_normal,axis[c.m_cti.m_normal.minAxis()]).normalized();
- const btVector3 y=btCross(x,c.m_cti.m_normal).normalized();
- idraw->drawLine(o-x*nscl,o+x*nscl,ccolor);
- idraw->drawLine(o-y*nscl,o+y*nscl,ccolor);
- idraw->drawLine(o,o+c.m_cti.m_normal*nscl*3,btVector3(1,1,0));
+ static const btVector3 axis[] = {btVector3(1, 0, 0),
+ btVector3(0, 1, 0),
+ btVector3(0, 0, 1)};
+ for (i = 0; i < psb->m_rcontacts.size(); ++i)
+ {
+ const btSoftBody::RContact& c = psb->m_rcontacts[i];
+ const btVector3 o = c.m_node->m_x - c.m_cti.m_normal *
+ (btDot(c.m_node->m_x, c.m_cti.m_normal) + c.m_cti.m_offset);
+ const btVector3 x = btCross(c.m_cti.m_normal, axis[c.m_cti.m_normal.minAxis()]).normalized();
+ const btVector3 y = btCross(x, c.m_cti.m_normal).normalized();
+ idraw->drawLine(o - x * nscl, o + x * nscl, ccolor);
+ idraw->drawLine(o - y * nscl, o + y * nscl, ccolor);
+ idraw->drawLine(o, o + c.m_cti.m_normal * nscl * 3, btVector3(1, 1, 0));
}
}
- /* Faces */
- if(0!=(drawflags&fDrawFlags::Faces))
- {
- const btScalar scl=(btScalar)0.8;
- const btScalar alp=(btScalar)1;
- const btVector3 col(0,(btScalar)0.7,0);
- for(i=0;i<psb->m_faces.size();++i)
+ /* Faces */
+ if (0 != (drawflags & fDrawFlags::Faces))
{
- const btSoftBody::Face& f=psb->m_faces[i];
- if(0==(f.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
- const btVector3 x[]={f.m_n[0]->m_x,f.m_n[1]->m_x,f.m_n[2]->m_x};
- const btVector3 c=(x[0]+x[1]+x[2])/3;
- idraw->drawTriangle((x[0]-c)*scl+c,
- (x[1]-c)*scl+c,
- (x[2]-c)*scl+c,
- col,alp);
- }
- }
- /* Tetras */
- if(0!=(drawflags&fDrawFlags::Tetras))
- {
- const btScalar scl=(btScalar)0.8;
- const btScalar alp=(btScalar)1;
- const btVector3 col((btScalar)0.3,(btScalar)0.3,(btScalar)0.7);
- for(int i=0;i<psb->m_tetras.size();++i)
+ const btScalar scl = (btScalar)0.8;
+ const btScalar alp = (btScalar)1;
+ const btVector3 col(0, (btScalar)0.7, 0);
+ for (i = 0; i < psb->m_faces.size(); ++i)
+ {
+ const btSoftBody::Face& f = psb->m_faces[i];
+ if (0 == (f.m_material->m_flags & btSoftBody::fMaterial::DebugDraw)) continue;
+ const btVector3 x[] = {f.m_n[0]->m_x, f.m_n[1]->m_x, f.m_n[2]->m_x};
+ const btVector3 c = (x[0] + x[1] + x[2]) / 3;
+ idraw->drawTriangle((x[0] - c) * scl + c,
+ (x[1] - c) * scl + c,
+ (x[2] - c) * scl + c,
+ col, alp);
+ }
+ }
+ /* Tetras */
+ if (0 != (drawflags & fDrawFlags::Tetras))
{
- const btSoftBody::Tetra& t=psb->m_tetras[i];
- if(0==(t.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
- const btVector3 x[]={t.m_n[0]->m_x,t.m_n[1]->m_x,t.m_n[2]->m_x,t.m_n[3]->m_x};
- const btVector3 c=(x[0]+x[1]+x[2]+x[3])/4;
- idraw->drawTriangle((x[0]-c)*scl+c,(x[1]-c)*scl+c,(x[2]-c)*scl+c,col,alp);
- idraw->drawTriangle((x[0]-c)*scl+c,(x[1]-c)*scl+c,(x[3]-c)*scl+c,col,alp);
- idraw->drawTriangle((x[1]-c)*scl+c,(x[2]-c)*scl+c,(x[3]-c)*scl+c,col,alp);
- idraw->drawTriangle((x[2]-c)*scl+c,(x[0]-c)*scl+c,(x[3]-c)*scl+c,col,alp);
- }
- }
+ const btScalar scl = (btScalar)0.8;
+ const btScalar alp = (btScalar)1;
+ const btVector3 col((btScalar)0.3, (btScalar)0.3, (btScalar)0.7);
+ for (int i = 0; i < psb->m_tetras.size(); ++i)
+ {
+ const btSoftBody::Tetra& t = psb->m_tetras[i];
+ if (0 == (t.m_material->m_flags & btSoftBody::fMaterial::DebugDraw)) continue;
+ const btVector3 x[] = {t.m_n[0]->m_x, t.m_n[1]->m_x, t.m_n[2]->m_x, t.m_n[3]->m_x};
+ const btVector3 c = (x[0] + x[1] + x[2] + x[3]) / 4;
+ idraw->drawTriangle((x[0] - c) * scl + c, (x[1] - c) * scl + c, (x[2] - c) * scl + c, col, alp);
+ idraw->drawTriangle((x[0] - c) * scl + c, (x[1] - c) * scl + c, (x[3] - c) * scl + c, col, alp);
+ idraw->drawTriangle((x[1] - c) * scl + c, (x[2] - c) * scl + c, (x[3] - c) * scl + c, col, alp);
+ idraw->drawTriangle((x[2] - c) * scl + c, (x[0] - c) * scl + c, (x[3] - c) * scl + c, col, alp);
+ }
+ }
}
- /* Anchors */
- if(0!=(drawflags&fDrawFlags::Anchors))
+ /* Anchors */
+ if (0 != (drawflags & fDrawFlags::Anchors))
{
- for(i=0;i<psb->m_anchors.size();++i)
+ for (i = 0; i < psb->m_anchors.size(); ++i)
{
- const btSoftBody::Anchor& a=psb->m_anchors[i];
- const btVector3 q=a.m_body->getWorldTransform()*a.m_local;
- drawVertex(idraw,a.m_node->m_x,0.25,btVector3(1,0,0));
- drawVertex(idraw,q,0.25,btVector3(0,1,0));
- idraw->drawLine(a.m_node->m_x,q,btVector3(1,1,1));
+ const btSoftBody::Anchor& a = psb->m_anchors[i];
+ const btVector3 q = a.m_body->getWorldTransform() * a.m_local;
+ drawVertex(idraw, a.m_node->m_x, 0.25, btVector3(1, 0, 0));
+ drawVertex(idraw, q, 0.25, btVector3(0, 1, 0));
+ idraw->drawLine(a.m_node->m_x, q, btVector3(1, 1, 1));
}
- for(i=0;i<psb->m_nodes.size();++i)
+ for (i = 0; i < psb->m_nodes.size(); ++i)
{
- const btSoftBody::Node& n=psb->m_nodes[i];
- if(0==(n.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
- if(n.m_im<=0)
+ const btSoftBody::Node& n = psb->m_nodes[i];
+ if (0 == (n.m_material->m_flags & btSoftBody::fMaterial::DebugDraw)) continue;
+ if (n.m_im <= 0)
{
- drawVertex(idraw,n.m_x,0.25,btVector3(1,0,0));
+ drawVertex(idraw, n.m_x, 0.25, btVector3(1, 0, 0));
}
}
}
-
- /* Notes */
- if(0!=(drawflags&fDrawFlags::Notes))
+ /* Notes */
+ if (0 != (drawflags & fDrawFlags::Notes))
{
- for(i=0;i<psb->m_notes.size();++i)
+ for (i = 0; i < psb->m_notes.size(); ++i)
{
- const btSoftBody::Note& n=psb->m_notes[i];
- btVector3 p=n.m_offset;
- for(int j=0;j<n.m_rank;++j)
+ const btSoftBody::Note& n = psb->m_notes[i];
+ btVector3 p = n.m_offset;
+ for (int j = 0; j < n.m_rank; ++j)
{
- p+=n.m_nodes[j]->m_x*n.m_coords[j];
+ p += n.m_nodes[j]->m_x * n.m_coords[j];
}
- idraw->draw3dText(p,n.m_text);
+ idraw->draw3dText(p, n.m_text);
}
}
- /* Node tree */
- if(0!=(drawflags&fDrawFlags::NodeTree)) DrawNodeTree(psb,idraw);
- /* Face tree */
- if(0!=(drawflags&fDrawFlags::FaceTree)) DrawFaceTree(psb,idraw);
- /* Cluster tree */
- if(0!=(drawflags&fDrawFlags::ClusterTree)) DrawClusterTree(psb,idraw);
- /* Joints */
- if(0!=(drawflags&fDrawFlags::Joints))
+ /* Node tree */
+ if (0 != (drawflags & fDrawFlags::NodeTree)) DrawNodeTree(psb, idraw);
+ /* Face tree */
+ if (0 != (drawflags & fDrawFlags::FaceTree)) DrawFaceTree(psb, idraw);
+ /* Cluster tree */
+ if (0 != (drawflags & fDrawFlags::ClusterTree)) DrawClusterTree(psb, idraw);
+ /* Joints */
+ if (0 != (drawflags & fDrawFlags::Joints))
{
- for(i=0;i<psb->m_joints.size();++i)
+ for (i = 0; i < psb->m_joints.size(); ++i)
{
- const btSoftBody::Joint* pj=psb->m_joints[i];
- switch(pj->Type())
+ const btSoftBody::Joint* pj = psb->m_joints[i];
+ switch (pj->Type())
{
- case btSoftBody::Joint::eType::Linear:
+ case btSoftBody::Joint::eType::Linear:
{
- const btSoftBody::LJoint* pjl=(const btSoftBody::LJoint*)pj;
- const btVector3 a0=pj->m_bodies[0].xform()*pjl->m_refs[0];
- const btVector3 a1=pj->m_bodies[1].xform()*pjl->m_refs[1];
- idraw->drawLine(pj->m_bodies[0].xform().getOrigin(),a0,btVector3(1,1,0));
- idraw->drawLine(pj->m_bodies[1].xform().getOrigin(),a1,btVector3(0,1,1));
- drawVertex(idraw,a0,0.25,btVector3(1,1,0));
- drawVertex(idraw,a1,0.25,btVector3(0,1,1));
+ const btSoftBody::LJoint* pjl = (const btSoftBody::LJoint*)pj;
+ const btVector3 a0 = pj->m_bodies[0].xform() * pjl->m_refs[0];
+ const btVector3 a1 = pj->m_bodies[1].xform() * pjl->m_refs[1];
+ idraw->drawLine(pj->m_bodies[0].xform().getOrigin(), a0, btVector3(1, 1, 0));
+ idraw->drawLine(pj->m_bodies[1].xform().getOrigin(), a1, btVector3(0, 1, 1));
+ drawVertex(idraw, a0, 0.25, btVector3(1, 1, 0));
+ drawVertex(idraw, a1, 0.25, btVector3(0, 1, 1));
}
break;
- case btSoftBody::Joint::eType::Angular:
+ case btSoftBody::Joint::eType::Angular:
{
//const btSoftBody::AJoint* pja=(const btSoftBody::AJoint*)pj;
- const btVector3 o0=pj->m_bodies[0].xform().getOrigin();
- const btVector3 o1=pj->m_bodies[1].xform().getOrigin();
- const btVector3 a0=pj->m_bodies[0].xform().getBasis()*pj->m_refs[0];
- const btVector3 a1=pj->m_bodies[1].xform().getBasis()*pj->m_refs[1];
- idraw->drawLine(o0,o0+a0*10,btVector3(1,1,0));
- idraw->drawLine(o0,o0+a1*10,btVector3(1,1,0));
- idraw->drawLine(o1,o1+a0*10,btVector3(0,1,1));
- idraw->drawLine(o1,o1+a1*10,btVector3(0,1,1));
+ const btVector3 o0 = pj->m_bodies[0].xform().getOrigin();
+ const btVector3 o1 = pj->m_bodies[1].xform().getOrigin();
+ const btVector3 a0 = pj->m_bodies[0].xform().getBasis() * pj->m_refs[0];
+ const btVector3 a1 = pj->m_bodies[1].xform().getBasis() * pj->m_refs[1];
+ idraw->drawLine(o0, o0 + a0 * 10, btVector3(1, 1, 0));
+ idraw->drawLine(o0, o0 + a1 * 10, btVector3(1, 1, 0));
+ idraw->drawLine(o1, o1 + a0 * 10, btVector3(0, 1, 1));
+ idraw->drawLine(o1, o1 + a1 * 10, btVector3(0, 1, 1));
break;
}
default:
{
}
-
- }
+ }
}
}
}
//
-void btSoftBodyHelpers::DrawInfos( btSoftBody* psb,
- btIDebugDraw* idraw,
- bool masses,
- bool areas,
- bool /*stress*/)
+void btSoftBodyHelpers::DrawInfos(btSoftBody* psb,
+ btIDebugDraw* idraw,
+ bool masses,
+ bool areas,
+ bool /*stress*/)
{
- for(int i=0;i<psb->m_nodes.size();++i)
+ for (int i = 0; i < psb->m_nodes.size(); ++i)
{
- const btSoftBody::Node& n=psb->m_nodes[i];
- char text[2048]={0};
- char buff[1024];
- if(masses)
+ const btSoftBody::Node& n = psb->m_nodes[i];
+ char text[2048] = {0};
+ char buff[1024];
+ if (masses)
{
- sprintf(buff," M(%.2f)",1/n.m_im);
- strcat(text,buff);
+ sprintf(buff, " M(%.2f)", 1 / n.m_im);
+ strcat(text, buff);
}
- if(areas)
+ if (areas)
{
- sprintf(buff," A(%.2f)",n.m_area);
- strcat(text,buff);
+ sprintf(buff, " A(%.2f)", n.m_area);
+ strcat(text, buff);
}
- if(text[0]) idraw->draw3dText(n.m_x,text);
+ if (text[0]) idraw->draw3dText(n.m_x, text);
}
}
//
-void btSoftBodyHelpers::DrawNodeTree( btSoftBody* psb,
- btIDebugDraw* idraw,
- int mindepth,
- int maxdepth)
+void btSoftBodyHelpers::DrawNodeTree(btSoftBody* psb,
+ btIDebugDraw* idraw,
+ int mindepth,
+ int maxdepth)
{
- drawTree(idraw,psb->m_ndbvt.m_root,0,btVector3(1,0,1),btVector3(1,1,1),mindepth,maxdepth);
+ drawTree(idraw, psb->m_ndbvt.m_root, 0, btVector3(1, 0, 1), btVector3(1, 1, 1), mindepth, maxdepth);
}
//
-void btSoftBodyHelpers::DrawFaceTree( btSoftBody* psb,
- btIDebugDraw* idraw,
- int mindepth,
- int maxdepth)
+void btSoftBodyHelpers::DrawFaceTree(btSoftBody* psb,
+ btIDebugDraw* idraw,
+ int mindepth,
+ int maxdepth)
{
- drawTree(idraw,psb->m_fdbvt.m_root,0,btVector3(0,1,0),btVector3(1,0,0),mindepth,maxdepth);
+ drawTree(idraw, psb->m_fdbvt.m_root, 0, btVector3(0, 1, 0), btVector3(1, 0, 0), mindepth, maxdepth);
}
//
-void btSoftBodyHelpers::DrawClusterTree( btSoftBody* psb,
- btIDebugDraw* idraw,
- int mindepth,
- int maxdepth)
+void btSoftBodyHelpers::DrawClusterTree(btSoftBody* psb,
+ btIDebugDraw* idraw,
+ int mindepth,
+ int maxdepth)
{
- drawTree(idraw,psb->m_cdbvt.m_root,0,btVector3(0,1,1),btVector3(1,0,0),mindepth,maxdepth);
+ drawTree(idraw, psb->m_cdbvt.m_root, 0, btVector3(0, 1, 1), btVector3(1, 0, 0), mindepth, maxdepth);
}
-
//The btSoftBody object from the BulletSDK includes an array of Nodes and Links. These links appear
-// to be first set up to connect a node to between 5 and 6 of its neighbors [480 links],
-//and then to the rest of the nodes after the execution of the Floyd-Warshall graph algorithm
-//[another 930 links].
+// to be first set up to connect a node to between 5 and 6 of its neighbors [480 links],
+//and then to the rest of the nodes after the execution of the Floyd-Warshall graph algorithm
+//[another 930 links].
//The way the links are stored by default, we have a number of cases where adjacent links share a node in common
-// - this leads to the creation of a data dependency through memory.
-//The PSolve_Links() function reads and writes nodes as it iterates over each link.
-//So, we now have the possibility of a data dependency between iteration X
-//that processes link L with iteration X+1 that processes link L+1
-//because L and L+1 have one node in common, and iteration X updates the positions of that node,
+// - this leads to the creation of a data dependency through memory.
+//The PSolve_Links() function reads and writes nodes as it iterates over each link.
+//So, we now have the possibility of a data dependency between iteration X
+//that processes link L with iteration X+1 that processes link L+1
+//because L and L+1 have one node in common, and iteration X updates the positions of that node,
//and iteration X+1 reads in the position of that shared node.
//
-//Such a memory dependency limits the ability of a modern CPU to speculate beyond
-//a certain point because it has to respect a possible dependency
-//- this prevents the CPU from making full use of its out-of-order resources.
-//If we re-order the links such that we minimize the cases where a link L and L+1 share a common node,
-//we create a temporal gap between when the node position is written,
-//and when it is subsequently read. This in turn allows the CPU to continue execution without
-//risking a dependency violation. Such a reordering would result in significant speedups on
-//modern CPUs with lots of execution resources.
-//In our testing, we see it have a tremendous impact not only on the A7,
-//but also on all x86 cores that ship with modern Macs.
-//The attached source file includes a single function (ReoptimizeLinkOrder) which can be called on a
-//btSoftBody object in the solveConstraints() function before the actual solver is invoked,
+//Such a memory dependency limits the ability of a modern CPU to speculate beyond
+//a certain point because it has to respect a possible dependency
+//- this prevents the CPU from making full use of its out-of-order resources.
+//If we re-order the links such that we minimize the cases where a link L and L+1 share a common node,
+//we create a temporal gap between when the node position is written,
+//and when it is subsequently read. This in turn allows the CPU to continue execution without
+//risking a dependency violation. Such a reordering would result in significant speedups on
+//modern CPUs with lots of execution resources.
+//In our testing, we see it have a tremendous impact not only on the A7,
+//but also on all x86 cores that ship with modern Macs.
+//The attached source file includes a single function (ReoptimizeLinkOrder) which can be called on a
+//btSoftBody object in the solveConstraints() function before the actual solver is invoked,
//or right after generateBendingConstraints() once we have all 1410 links.
-
//===================================================================
//
//
-// This function takes in a list of interdependent Links and tries
+// This function takes in a list of interdependent Links and tries
// to maximize the distance between calculation
// of dependent links. This increases the amount of parallelism that can
// be exploited by out-of-order instruction processors with large but
@@ -522,93 +521,103 @@ void btSoftBodyHelpers::DrawClusterTree( btSoftBody* psb,
//===================================================================
// A small structure to track lists of dependent link calculations
-class LinkDeps_t {
- public:
- int value; // A link calculation that is dependent on this one
- // Positive values = "input A" while negative values = "input B"
- LinkDeps_t *next; // Next dependence in the list
+class LinkDeps_t
+{
+public:
+ int value; // A link calculation that is dependent on this one
+ // Positive values = "input A" while negative values = "input B"
+ LinkDeps_t* next; // Next dependence in the list
};
-typedef LinkDeps_t *LinkDepsPtr_t;
+typedef LinkDeps_t* LinkDepsPtr_t;
// Dependency list constants
-#define REOP_NOT_DEPENDENT -1
-#define REOP_NODE_COMPLETE -2 // Must be less than REOP_NOT_DEPENDENT
-
+#define REOP_NOT_DEPENDENT -1
+#define REOP_NODE_COMPLETE -2 // Must be less than REOP_NOT_DEPENDENT
-void btSoftBodyHelpers::ReoptimizeLinkOrder(btSoftBody *psb /* This can be replaced by a btSoftBody pointer */)
+void btSoftBodyHelpers::ReoptimizeLinkOrder(btSoftBody* psb /* This can be replaced by a btSoftBody pointer */)
{
- int i, nLinks=psb->m_links.size(), nNodes=psb->m_nodes.size();
- btSoftBody::Link *lr;
+ int i, nLinks = psb->m_links.size(), nNodes = psb->m_nodes.size();
+ btSoftBody::Link* lr;
int ar, br;
- btSoftBody::Node *node0 = &(psb->m_nodes[0]);
- btSoftBody::Node *node1 = &(psb->m_nodes[1]);
+ btSoftBody::Node* node0 = &(psb->m_nodes[0]);
+ btSoftBody::Node* node1 = &(psb->m_nodes[1]);
LinkDepsPtr_t linkDep;
int readyListHead, readyListTail, linkNum, linkDepFrees, depLink;
-
+
// Allocate temporary buffers
- int *nodeWrittenAt = new int[nNodes+1]; // What link calculation produced this node's current values?
- int *linkDepA = new int[nLinks]; // Link calculation input is dependent upon prior calculation #N
- int *linkDepB = new int[nLinks];
- int *readyList = new int[nLinks]; // List of ready-to-process link calculations (# of links, maximum)
- LinkDeps_t *linkDepFreeList = new LinkDeps_t[2*nLinks]; // Dependent-on-me list elements (2x# of links, maximum)
- LinkDepsPtr_t *linkDepListStarts = new LinkDepsPtr_t[nLinks]; // Start nodes of dependent-on-me lists, one for each link
-
+ int* nodeWrittenAt = new int[nNodes + 1]; // What link calculation produced this node's current values?
+ int* linkDepA = new int[nLinks]; // Link calculation input is dependent upon prior calculation #N
+ int* linkDepB = new int[nLinks];
+ int* readyList = new int[nLinks]; // List of ready-to-process link calculations (# of links, maximum)
+ LinkDeps_t* linkDepFreeList = new LinkDeps_t[2 * nLinks]; // Dependent-on-me list elements (2x# of links, maximum)
+ LinkDepsPtr_t* linkDepListStarts = new LinkDepsPtr_t[nLinks]; // Start nodes of dependent-on-me lists, one for each link
+
// Copy the original, unsorted links to a side buffer
- btSoftBody::Link *linkBuffer = new btSoftBody::Link[nLinks];
- memcpy(linkBuffer, &(psb->m_links[0]), sizeof(btSoftBody::Link)*nLinks);
+ btSoftBody::Link* linkBuffer = new btSoftBody::Link[nLinks];
+ memcpy(linkBuffer, &(psb->m_links[0]), sizeof(btSoftBody::Link) * nLinks);
// Clear out the node setup and ready list
- for (i=0; i < nNodes+1; i++) {
+ for (i = 0; i < nNodes + 1; i++)
+ {
nodeWrittenAt[i] = REOP_NOT_DEPENDENT;
}
- for (i=0; i < nLinks; i++) {
+ for (i = 0; i < nLinks; i++)
+ {
linkDepListStarts[i] = NULL;
}
readyListHead = readyListTail = linkDepFrees = 0;
// Initial link analysis to set up data structures
- for (i=0; i < nLinks; i++) {
-
+ for (i = 0; i < nLinks; i++)
+ {
// Note which prior link calculations we are dependent upon & build up dependence lists
lr = &(psb->m_links[i]);
- ar = (lr->m_n[0] - node0)/(node1 - node0);
- br = (lr->m_n[1] - node0)/(node1 - node0);
- if (nodeWrittenAt[ar] > REOP_NOT_DEPENDENT) {
+ ar = (lr->m_n[0] - node0) / (node1 - node0);
+ br = (lr->m_n[1] - node0) / (node1 - node0);
+ if (nodeWrittenAt[ar] > REOP_NOT_DEPENDENT)
+ {
linkDepA[i] = nodeWrittenAt[ar];
linkDep = &linkDepFreeList[linkDepFrees++];
linkDep->value = i;
linkDep->next = linkDepListStarts[nodeWrittenAt[ar]];
linkDepListStarts[nodeWrittenAt[ar]] = linkDep;
- } else {
+ }
+ else
+ {
linkDepA[i] = REOP_NOT_DEPENDENT;
}
- if (nodeWrittenAt[br] > REOP_NOT_DEPENDENT) {
+ if (nodeWrittenAt[br] > REOP_NOT_DEPENDENT)
+ {
linkDepB[i] = nodeWrittenAt[br];
linkDep = &linkDepFreeList[linkDepFrees++];
- linkDep->value = -(i+1);
+ linkDep->value = -(i + 1);
linkDep->next = linkDepListStarts[nodeWrittenAt[br]];
linkDepListStarts[nodeWrittenAt[br]] = linkDep;
- } else {
+ }
+ else
+ {
linkDepB[i] = REOP_NOT_DEPENDENT;
}
-
+
// Add this link to the initial ready list, if it is not dependent on any other links
- if ((linkDepA[i] == REOP_NOT_DEPENDENT) && (linkDepB[i] == REOP_NOT_DEPENDENT)) {
+ if ((linkDepA[i] == REOP_NOT_DEPENDENT) && (linkDepB[i] == REOP_NOT_DEPENDENT))
+ {
readyList[readyListTail++] = i;
- linkDepA[i] = linkDepB[i] = REOP_NODE_COMPLETE; // Probably not needed now
+ linkDepA[i] = linkDepB[i] = REOP_NODE_COMPLETE; // Probably not needed now
}
-
+
// Update the nodes to mark which ones are calculated by this link
nodeWrittenAt[ar] = nodeWrittenAt[br] = i;
}
-
+
// Process the ready list and create the sorted list of links
// -- By treating the ready list as a queue, we maximize the distance between any
// inter-dependent node calculations
// -- All other (non-related) nodes in the ready list will automatically be inserted
// in between each set of inter-dependent link calculations by this loop
i = 0;
- while (readyListHead != readyListTail) {
+ while (readyListHead != readyListTail)
+ {
// Use ready list to select the next link to process
linkNum = readyList[readyListHead++];
// Copy the next-to-calculate link back into the original link array
@@ -616,180 +625,183 @@ void btSoftBodyHelpers::ReoptimizeLinkOrder(btSoftBody *psb /* This can be repla
// Free up any link inputs that are dependent on this one
linkDep = linkDepListStarts[linkNum];
- while (linkDep) {
+ while (linkDep)
+ {
depLink = linkDep->value;
- if (depLink >= 0) {
+ if (depLink >= 0)
+ {
linkDepA[depLink] = REOP_NOT_DEPENDENT;
- } else {
+ }
+ else
+ {
depLink = -depLink - 1;
linkDepB[depLink] = REOP_NOT_DEPENDENT;
}
// Add this dependent link calculation to the ready list if *both* inputs are clear
- if ((linkDepA[depLink] == REOP_NOT_DEPENDENT) && (linkDepB[depLink] == REOP_NOT_DEPENDENT)) {
+ if ((linkDepA[depLink] == REOP_NOT_DEPENDENT) && (linkDepB[depLink] == REOP_NOT_DEPENDENT))
+ {
readyList[readyListTail++] = depLink;
- linkDepA[depLink] = linkDepB[depLink] = REOP_NODE_COMPLETE; // Probably not needed now
+ linkDepA[depLink] = linkDepB[depLink] = REOP_NODE_COMPLETE; // Probably not needed now
}
linkDep = linkDep->next;
}
}
// Delete the temporary buffers
- delete [] nodeWrittenAt;
- delete [] linkDepA;
- delete [] linkDepB;
- delete [] readyList;
- delete [] linkDepFreeList;
- delete [] linkDepListStarts;
- delete [] linkBuffer;
+ delete[] nodeWrittenAt;
+ delete[] linkDepA;
+ delete[] linkDepB;
+ delete[] readyList;
+ delete[] linkDepFreeList;
+ delete[] linkDepListStarts;
+ delete[] linkBuffer;
}
-
//
-void btSoftBodyHelpers::DrawFrame( btSoftBody* psb,
- btIDebugDraw* idraw)
+void btSoftBodyHelpers::DrawFrame(btSoftBody* psb,
+ btIDebugDraw* idraw)
{
- if(psb->m_pose.m_bframe)
+ if (psb->m_pose.m_bframe)
{
- static const btScalar ascl=10;
- static const btScalar nscl=(btScalar)0.1;
- const btVector3 com=psb->m_pose.m_com;
- const btMatrix3x3 trs=psb->m_pose.m_rot*psb->m_pose.m_scl;
- const btVector3 Xaxis=(trs*btVector3(1,0,0)).normalized();
- const btVector3 Yaxis=(trs*btVector3(0,1,0)).normalized();
- const btVector3 Zaxis=(trs*btVector3(0,0,1)).normalized();
- idraw->drawLine(com,com+Xaxis*ascl,btVector3(1,0,0));
- idraw->drawLine(com,com+Yaxis*ascl,btVector3(0,1,0));
- idraw->drawLine(com,com+Zaxis*ascl,btVector3(0,0,1));
- for(int i=0;i<psb->m_pose.m_pos.size();++i)
+ static const btScalar ascl = 10;
+ static const btScalar nscl = (btScalar)0.1;
+ const btVector3 com = psb->m_pose.m_com;
+ const btMatrix3x3 trs = psb->m_pose.m_rot * psb->m_pose.m_scl;
+ const btVector3 Xaxis = (trs * btVector3(1, 0, 0)).normalized();
+ const btVector3 Yaxis = (trs * btVector3(0, 1, 0)).normalized();
+ const btVector3 Zaxis = (trs * btVector3(0, 0, 1)).normalized();
+ idraw->drawLine(com, com + Xaxis * ascl, btVector3(1, 0, 0));
+ idraw->drawLine(com, com + Yaxis * ascl, btVector3(0, 1, 0));
+ idraw->drawLine(com, com + Zaxis * ascl, btVector3(0, 0, 1));
+ for (int i = 0; i < psb->m_pose.m_pos.size(); ++i)
{
- const btVector3 x=com+trs*psb->m_pose.m_pos[i];
- drawVertex(idraw,x,nscl,btVector3(1,0,1));
+ const btVector3 x = com + trs * psb->m_pose.m_pos[i];
+ drawVertex(idraw, x, nscl, btVector3(1, 0, 1));
}
}
}
//
-btSoftBody* btSoftBodyHelpers::CreateRope( btSoftBodyWorldInfo& worldInfo, const btVector3& from,
- const btVector3& to,
- int res,
- int fixeds)
+btSoftBody* btSoftBodyHelpers::CreateRope(btSoftBodyWorldInfo& worldInfo, const btVector3& from,
+ const btVector3& to,
+ int res,
+ int fixeds)
{
- /* Create nodes */
- const int r=res+2;
- btVector3* x=new btVector3[r];
- btScalar* m=new btScalar[r];
+ /* Create nodes */
+ const int r = res + 2;
+ btVector3* x = new btVector3[r];
+ btScalar* m = new btScalar[r];
int i;
- for(i=0;i<r;++i)
+ for (i = 0; i < r; ++i)
{
- const btScalar t=i/(btScalar)(r-1);
- x[i]=lerp(from,to,t);
- m[i]=1;
+ const btScalar t = i / (btScalar)(r - 1);
+ x[i] = lerp(from, to, t);
+ m[i] = 1;
}
- btSoftBody* psb= new btSoftBody(&worldInfo,r,x,m);
- if(fixeds&1) psb->setMass(0,0);
- if(fixeds&2) psb->setMass(r-1,0);
+ btSoftBody* psb = new btSoftBody(&worldInfo, r, x, m);
+ if (fixeds & 1) psb->setMass(0, 0);
+ if (fixeds & 2) psb->setMass(r - 1, 0);
delete[] x;
delete[] m;
- /* Create links */
- for(i=1;i<r;++i)
+ /* Create links */
+ for (i = 1; i < r; ++i)
{
- psb->appendLink(i-1,i);
+ psb->appendLink(i - 1, i);
}
- /* Finished */
- return(psb);
+ /* Finished */
+ return (psb);
}
//
-btSoftBody* btSoftBodyHelpers::CreatePatch(btSoftBodyWorldInfo& worldInfo,const btVector3& corner00,
- const btVector3& corner10,
- const btVector3& corner01,
- const btVector3& corner11,
- int resx,
- int resy,
- int fixeds,
- bool gendiags)
+btSoftBody* btSoftBodyHelpers::CreatePatch(btSoftBodyWorldInfo& worldInfo, const btVector3& corner00,
+ const btVector3& corner10,
+ const btVector3& corner01,
+ const btVector3& corner11,
+ int resx,
+ int resy,
+ int fixeds,
+ bool gendiags)
{
-#define IDX(_x_,_y_) ((_y_)*rx+(_x_))
- /* Create nodes */
- if((resx<2)||(resy<2)) return(0);
- const int rx=resx;
- const int ry=resy;
- const int tot=rx*ry;
- btVector3* x=new btVector3[tot];
- btScalar* m=new btScalar[tot];
+#define IDX(_x_, _y_) ((_y_)*rx + (_x_))
+ /* Create nodes */
+ if ((resx < 2) || (resy < 2)) return (0);
+ const int rx = resx;
+ const int ry = resy;
+ const int tot = rx * ry;
+ btVector3* x = new btVector3[tot];
+ btScalar* m = new btScalar[tot];
int iy;
- for(iy=0;iy<ry;++iy)
+ for (iy = 0; iy < ry; ++iy)
{
- const btScalar ty=iy/(btScalar)(ry-1);
- const btVector3 py0=lerp(corner00,corner01,ty);
- const btVector3 py1=lerp(corner10,corner11,ty);
- for(int ix=0;ix<rx;++ix)
+ const btScalar ty = iy / (btScalar)(ry - 1);
+ const btVector3 py0 = lerp(corner00, corner01, ty);
+ const btVector3 py1 = lerp(corner10, corner11, ty);
+ for (int ix = 0; ix < rx; ++ix)
{
- const btScalar tx=ix/(btScalar)(rx-1);
- x[IDX(ix,iy)]=lerp(py0,py1,tx);
- m[IDX(ix,iy)]=1;
+ const btScalar tx = ix / (btScalar)(rx - 1);
+ x[IDX(ix, iy)] = lerp(py0, py1, tx);
+ m[IDX(ix, iy)] = 1;
}
}
- btSoftBody* psb=new btSoftBody(&worldInfo,tot,x,m);
- if(fixeds&1) psb->setMass(IDX(0,0),0);
- if(fixeds&2) psb->setMass(IDX(rx-1,0),0);
- if(fixeds&4) psb->setMass(IDX(0,ry-1),0);
- if(fixeds&8) psb->setMass(IDX(rx-1,ry-1),0);
+ btSoftBody* psb = new btSoftBody(&worldInfo, tot, x, m);
+ if (fixeds & 1) psb->setMass(IDX(0, 0), 0);
+ if (fixeds & 2) psb->setMass(IDX(rx - 1, 0), 0);
+ if (fixeds & 4) psb->setMass(IDX(0, ry - 1), 0);
+ if (fixeds & 8) psb->setMass(IDX(rx - 1, ry - 1), 0);
delete[] x;
delete[] m;
- /* Create links and faces */
- for(iy=0;iy<ry;++iy)
+ /* Create links and faces */
+ for (iy = 0; iy < ry; ++iy)
{
- for(int ix=0;ix<rx;++ix)
+ for (int ix = 0; ix < rx; ++ix)
{
- const int idx=IDX(ix,iy);
- const bool mdx=(ix+1)<rx;
- const bool mdy=(iy+1)<ry;
- if(mdx) psb->appendLink(idx,IDX(ix+1,iy));
- if(mdy) psb->appendLink(idx,IDX(ix,iy+1));
- if(mdx&&mdy)
+ const int idx = IDX(ix, iy);
+ const bool mdx = (ix + 1) < rx;
+ const bool mdy = (iy + 1) < ry;
+ if (mdx) psb->appendLink(idx, IDX(ix + 1, iy));
+ if (mdy) psb->appendLink(idx, IDX(ix, iy + 1));
+ if (mdx && mdy)
{
- if((ix+iy)&1)
+ if ((ix + iy) & 1)
{
- psb->appendFace(IDX(ix,iy),IDX(ix+1,iy),IDX(ix+1,iy+1));
- psb->appendFace(IDX(ix,iy),IDX(ix+1,iy+1),IDX(ix,iy+1));
- if(gendiags)
+ psb->appendFace(IDX(ix, iy), IDX(ix + 1, iy), IDX(ix + 1, iy + 1));
+ psb->appendFace(IDX(ix, iy), IDX(ix + 1, iy + 1), IDX(ix, iy + 1));
+ if (gendiags)
{
- psb->appendLink(IDX(ix,iy),IDX(ix+1,iy+1));
+ psb->appendLink(IDX(ix, iy), IDX(ix + 1, iy + 1));
}
}
else
{
- psb->appendFace(IDX(ix,iy+1),IDX(ix,iy),IDX(ix+1,iy));
- psb->appendFace(IDX(ix,iy+1),IDX(ix+1,iy),IDX(ix+1,iy+1));
- if(gendiags)
+ psb->appendFace(IDX(ix, iy + 1), IDX(ix, iy), IDX(ix + 1, iy));
+ psb->appendFace(IDX(ix, iy + 1), IDX(ix + 1, iy), IDX(ix + 1, iy + 1));
+ if (gendiags)
{
- psb->appendLink(IDX(ix+1,iy),IDX(ix,iy+1));
+ psb->appendLink(IDX(ix + 1, iy), IDX(ix, iy + 1));
}
}
}
}
}
- /* Finished */
+ /* Finished */
#undef IDX
- return(psb);
+ return (psb);
}
//
-btSoftBody* btSoftBodyHelpers::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)
+btSoftBody* btSoftBodyHelpers::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)
{
-
/*
*
* corners:
@@ -857,92 +869,92 @@ btSoftBody* btSoftBodyHelpers::CreatePatchUV(btSoftBodyWorldInfo& worldInfo,
*
*/
-#define IDX(_x_,_y_) ((_y_)*rx+(_x_))
- /* Create nodes */
- if((resx<2)||(resy<2)) return(0);
- const int rx=resx;
- const int ry=resy;
- const int tot=rx*ry;
- btVector3* x=new btVector3[tot];
- btScalar* m=new btScalar[tot];
+#define IDX(_x_, _y_) ((_y_)*rx + (_x_))
+ /* Create nodes */
+ if ((resx < 2) || (resy < 2)) return (0);
+ const int rx = resx;
+ const int ry = resy;
+ const int tot = rx * ry;
+ btVector3* x = new btVector3[tot];
+ btScalar* m = new btScalar[tot];
int iy;
- for(iy=0;iy<ry;++iy)
+ for (iy = 0; iy < ry; ++iy)
{
- const btScalar ty=iy/(btScalar)(ry-1);
- const btVector3 py0=lerp(corner00,corner01,ty);
- const btVector3 py1=lerp(corner10,corner11,ty);
- for(int ix=0;ix<rx;++ix)
+ const btScalar ty = iy / (btScalar)(ry - 1);
+ const btVector3 py0 = lerp(corner00, corner01, ty);
+ const btVector3 py1 = lerp(corner10, corner11, ty);
+ for (int ix = 0; ix < rx; ++ix)
{
- const btScalar tx=ix/(btScalar)(rx-1);
- x[IDX(ix,iy)]=lerp(py0,py1,tx);
- m[IDX(ix,iy)]=1;
+ const btScalar tx = ix / (btScalar)(rx - 1);
+ x[IDX(ix, iy)] = lerp(py0, py1, tx);
+ m[IDX(ix, iy)] = 1;
}
}
- btSoftBody* psb=new btSoftBody(&worldInfo,tot,x,m);
- if(fixeds&1) psb->setMass(IDX(0,0),0);
- if(fixeds&2) psb->setMass(IDX(rx-1,0),0);
- if(fixeds&4) psb->setMass(IDX(0,ry-1),0);
- if(fixeds&8) psb->setMass(IDX(rx-1,ry-1),0);
- if(fixeds&16) psb->setMass(IDX((rx-1)/2,0),0);
- if(fixeds&32) psb->setMass(IDX(0,(ry-1)/2),0);
- if(fixeds&64) psb->setMass(IDX(rx-1,(ry-1)/2),0);
- if(fixeds&128) psb->setMass(IDX((rx-1)/2,ry-1),0);
- if(fixeds&256) psb->setMass(IDX((rx-1)/2,(ry-1)/2),0);
+ btSoftBody* psb = new btSoftBody(&worldInfo, tot, x, m);
+ if (fixeds & 1) psb->setMass(IDX(0, 0), 0);
+ if (fixeds & 2) psb->setMass(IDX(rx - 1, 0), 0);
+ if (fixeds & 4) psb->setMass(IDX(0, ry - 1), 0);
+ if (fixeds & 8) psb->setMass(IDX(rx - 1, ry - 1), 0);
+ if (fixeds & 16) psb->setMass(IDX((rx - 1) / 2, 0), 0);
+ if (fixeds & 32) psb->setMass(IDX(0, (ry - 1) / 2), 0);
+ if (fixeds & 64) psb->setMass(IDX(rx - 1, (ry - 1) / 2), 0);
+ if (fixeds & 128) psb->setMass(IDX((rx - 1) / 2, ry - 1), 0);
+ if (fixeds & 256) psb->setMass(IDX((rx - 1) / 2, (ry - 1) / 2), 0);
delete[] x;
delete[] m;
-
int z = 0;
- /* Create links and faces */
- for(iy=0;iy<ry;++iy)
+ /* Create links and faces */
+ for (iy = 0; iy < ry; ++iy)
{
- for(int ix=0;ix<rx;++ix)
+ for (int ix = 0; ix < rx; ++ix)
{
- const bool mdx=(ix+1)<rx;
- const bool mdy=(iy+1)<ry;
+ const bool mdx = (ix + 1) < rx;
+ const bool mdy = (iy + 1) < ry;
- int node00=IDX(ix,iy);
- int node01=IDX(ix+1,iy);
- int node10=IDX(ix,iy+1);
- int node11=IDX(ix+1,iy+1);
+ int node00 = IDX(ix, iy);
+ int node01 = IDX(ix + 1, iy);
+ int node10 = IDX(ix, iy + 1);
+ int node11 = IDX(ix + 1, iy + 1);
- if(mdx) psb->appendLink(node00,node01);
- if(mdy) psb->appendLink(node00,node10);
- if(mdx&&mdy)
+ if (mdx) psb->appendLink(node00, node01);
+ if (mdy) psb->appendLink(node00, node10);
+ if (mdx && mdy)
{
- psb->appendFace(node00,node10,node11);
- if (tex_coords) {
- tex_coords[z+0]=CalculateUV(resx,resy,ix,iy,0);
- tex_coords[z+1]=CalculateUV(resx,resy,ix,iy,1);
- tex_coords[z+2]=CalculateUV(resx,resy,ix,iy,0);
- tex_coords[z+3]=CalculateUV(resx,resy,ix,iy,2);
- tex_coords[z+4]=CalculateUV(resx,resy,ix,iy,3);
- tex_coords[z+5]=CalculateUV(resx,resy,ix,iy,2);
+ psb->appendFace(node00, node10, node11);
+ if (tex_coords)
+ {
+ tex_coords[z + 0] = CalculateUV(resx, resy, ix, iy, 0);
+ tex_coords[z + 1] = CalculateUV(resx, resy, ix, iy, 1);
+ tex_coords[z + 2] = CalculateUV(resx, resy, ix, iy, 0);
+ tex_coords[z + 3] = CalculateUV(resx, resy, ix, iy, 2);
+ tex_coords[z + 4] = CalculateUV(resx, resy, ix, iy, 3);
+ tex_coords[z + 5] = CalculateUV(resx, resy, ix, iy, 2);
}
- psb->appendFace(node11,node01,node00);
- if (tex_coords) {
- tex_coords[z+6 ]=CalculateUV(resx,resy,ix,iy,3);
- tex_coords[z+7 ]=CalculateUV(resx,resy,ix,iy,2);
- tex_coords[z+8 ]=CalculateUV(resx,resy,ix,iy,3);
- tex_coords[z+9 ]=CalculateUV(resx,resy,ix,iy,1);
- tex_coords[z+10]=CalculateUV(resx,resy,ix,iy,0);
- tex_coords[z+11]=CalculateUV(resx,resy,ix,iy,1);
+ psb->appendFace(node11, node01, node00);
+ if (tex_coords)
+ {
+ tex_coords[z + 6] = CalculateUV(resx, resy, ix, iy, 3);
+ tex_coords[z + 7] = CalculateUV(resx, resy, ix, iy, 2);
+ tex_coords[z + 8] = CalculateUV(resx, resy, ix, iy, 3);
+ tex_coords[z + 9] = CalculateUV(resx, resy, ix, iy, 1);
+ tex_coords[z + 10] = CalculateUV(resx, resy, ix, iy, 0);
+ tex_coords[z + 11] = CalculateUV(resx, resy, ix, iy, 1);
}
- if (gendiags) psb->appendLink(node00,node11);
+ if (gendiags) psb->appendLink(node00, node11);
z += 12;
}
}
}
- /* Finished */
+ /* Finished */
#undef IDX
- return(psb);
+ return (psb);
}
-float btSoftBodyHelpers::CalculateUV(int resx,int resy,int ix,int iy,int id)
+float btSoftBodyHelpers::CalculateUV(int resx, int resy, int ix, int iy, int id)
{
-
/*
*
*
@@ -968,90 +980,93 @@ float btSoftBodyHelpers::CalculateUV(int resx,int resy,int ix,int iy,int id)
*
*/
- float tc=0.0f;
- if (id == 0) {
- tc = (1.0f/((resx-1))*ix);
+ float tc = 0.0f;
+ if (id == 0)
+ {
+ tc = (1.0f / ((resx - 1)) * ix);
}
- else if (id==1) {
- tc = (1.0f/((resy-1))*(resy-1-iy));
+ else if (id == 1)
+ {
+ tc = (1.0f / ((resy - 1)) * (resy - 1 - iy));
}
- else if (id==2) {
- tc = (1.0f/((resy-1))*(resy-1-iy-1));
+ else if (id == 2)
+ {
+ tc = (1.0f / ((resy - 1)) * (resy - 1 - iy - 1));
}
- else if (id==3) {
- tc = (1.0f/((resx-1))*(ix+1));
+ else if (id == 3)
+ {
+ tc = (1.0f / ((resx - 1)) * (ix + 1));
}
return tc;
}
//
-btSoftBody* btSoftBodyHelpers::CreateEllipsoid(btSoftBodyWorldInfo& worldInfo,const btVector3& center,
- const btVector3& radius,
- int res)
+btSoftBody* btSoftBodyHelpers::CreateEllipsoid(btSoftBodyWorldInfo& worldInfo, const btVector3& center,
+ const btVector3& radius,
+ int res)
{
- struct Hammersley
+ struct Hammersley
{
- static void Generate(btVector3* x,int n)
+ static void Generate(btVector3* x, int n)
{
- for(int i=0;i<n;i++)
+ for (int i = 0; i < n; i++)
{
- btScalar p=0.5,t=0;
- for(int j=i;j;p*=0.5,j>>=1) if(j&1) t+=p;
- btScalar w=2*t-1;
- btScalar a=(SIMD_PI+2*i*SIMD_PI)/n;
- btScalar s=btSqrt(1-w*w);
- *x++=btVector3(s*btCos(a),s*btSin(a),w);
+ btScalar p = 0.5, t = 0;
+ for (int j = i; j; p *= 0.5, j >>= 1)
+ if (j & 1) t += p;
+ btScalar w = 2 * t - 1;
+ btScalar a = (SIMD_PI + 2 * i * SIMD_PI) / n;
+ btScalar s = btSqrt(1 - w * w);
+ *x++ = btVector3(s * btCos(a), s * btSin(a), w);
}
}
};
- btAlignedObjectArray<btVector3> vtx;
- vtx.resize(3+res);
- Hammersley::Generate(&vtx[0],vtx.size());
- for(int i=0;i<vtx.size();++i)
+ btAlignedObjectArray<btVector3> vtx;
+ vtx.resize(3 + res);
+ Hammersley::Generate(&vtx[0], vtx.size());
+ for (int i = 0; i < vtx.size(); ++i)
{
- vtx[i]=vtx[i]*radius+center;
+ vtx[i] = vtx[i] * radius + center;
}
- return(CreateFromConvexHull(worldInfo,&vtx[0],vtx.size()));
+ return (CreateFromConvexHull(worldInfo, &vtx[0], vtx.size()));
}
-
-
//
-btSoftBody* btSoftBodyHelpers::CreateFromTriMesh(btSoftBodyWorldInfo& worldInfo,const btScalar* vertices,
- const int* triangles,
- int ntriangles, bool randomizeConstraints)
+btSoftBody* btSoftBodyHelpers::CreateFromTriMesh(btSoftBodyWorldInfo& worldInfo, const btScalar* vertices,
+ const int* triangles,
+ int ntriangles, bool randomizeConstraints)
{
- int maxidx=0;
- int i,j,ni;
+ int maxidx = 0;
+ int i, j, ni;
- for(i=0,ni=ntriangles*3;i<ni;++i)
+ for (i = 0, ni = ntriangles * 3; i < ni; ++i)
{
- maxidx=btMax(triangles[i],maxidx);
+ maxidx = btMax(triangles[i], maxidx);
}
++maxidx;
- btAlignedObjectArray<bool> chks;
- btAlignedObjectArray<btVector3> vtx;
- chks.resize(maxidx*maxidx,false);
+ btAlignedObjectArray<bool> chks;
+ btAlignedObjectArray<btVector3> vtx;
+ chks.resize(maxidx * maxidx, false);
vtx.resize(maxidx);
- for(i=0,j=0,ni=maxidx*3;i<ni;++j,i+=3)
+ for (i = 0, j = 0, ni = maxidx * 3; i < ni; ++j, i += 3)
{
- vtx[j]=btVector3(vertices[i],vertices[i+1],vertices[i+2]);
+ vtx[j] = btVector3(vertices[i], vertices[i + 1], vertices[i + 2]);
}
- btSoftBody* psb=new btSoftBody(&worldInfo,vtx.size(),&vtx[0],0);
- for( i=0,ni=ntriangles*3;i<ni;i+=3)
+ btSoftBody* psb = new btSoftBody(&worldInfo, vtx.size(), &vtx[0], 0);
+ for (i = 0, ni = ntriangles * 3; i < ni; i += 3)
{
- const int idx[]={triangles[i],triangles[i+1],triangles[i+2]};
-#define IDX(_x_,_y_) ((_y_)*maxidx+(_x_))
- for(int j=2,k=0;k<3;j=k++)
+ const int idx[] = {triangles[i], triangles[i + 1], triangles[i + 2]};
+#define IDX(_x_, _y_) ((_y_)*maxidx + (_x_))
+ for (int j = 2, k = 0; k < 3; j = k++)
{
- if(!chks[IDX(idx[j],idx[k])])
+ if (!chks[IDX(idx[j], idx[k])])
{
- chks[IDX(idx[j],idx[k])]=true;
- chks[IDX(idx[k],idx[j])]=true;
- psb->appendLink(idx[j],idx[k]);
+ chks[IDX(idx[j], idx[k])] = true;
+ chks[IDX(idx[k], idx[j])] = true;
+ psb->appendLink(idx[j], idx[k]);
}
}
#undef IDX
- psb->appendFace(idx[0],idx[1],idx[2]);
+ psb->appendFace(idx[0], idx[1], idx[2]);
}
if (randomizeConstraints)
@@ -1059,44 +1074,41 @@ btSoftBody* btSoftBodyHelpers::CreateFromTriMesh(btSoftBodyWorldInfo& worldInfo
psb->randomizeConstraints();
}
- return(psb);
+ return (psb);
}
//
-btSoftBody* btSoftBodyHelpers::CreateFromConvexHull(btSoftBodyWorldInfo& worldInfo, const btVector3* vertices,
- int nvertices, bool randomizeConstraints)
+btSoftBody* btSoftBodyHelpers::CreateFromConvexHull(btSoftBodyWorldInfo& worldInfo, const btVector3* vertices,
+ int nvertices, bool randomizeConstraints)
{
- HullDesc hdsc(QF_TRIANGLES,nvertices,vertices);
- HullResult hres;
- HullLibrary hlib;/*??*/
- hdsc.mMaxVertices=nvertices;
- hlib.CreateConvexHull(hdsc,hres);
- btSoftBody* psb=new btSoftBody(&worldInfo,(int)hres.mNumOutputVertices,
- &hres.m_OutputVertices[0],0);
- for(int i=0;i<(int)hres.mNumFaces;++i)
+ HullDesc hdsc(QF_TRIANGLES, nvertices, vertices);
+ HullResult hres;
+ HullLibrary hlib; /*??*/
+ hdsc.mMaxVertices = nvertices;
+ hlib.CreateConvexHull(hdsc, hres);
+ btSoftBody* psb = new btSoftBody(&worldInfo, (int)hres.mNumOutputVertices,
+ &hres.m_OutputVertices[0], 0);
+ for (int i = 0; i < (int)hres.mNumFaces; ++i)
{
- const int idx[]={ static_cast<int>(hres.m_Indices[i*3+0]),
- static_cast<int>(hres.m_Indices[i*3+1]),
- static_cast<int>(hres.m_Indices[i*3+2])};
- if(idx[0]<idx[1]) psb->appendLink( idx[0],idx[1]);
- if(idx[1]<idx[2]) psb->appendLink( idx[1],idx[2]);
- if(idx[2]<idx[0]) psb->appendLink( idx[2],idx[0]);
- psb->appendFace(idx[0],idx[1],idx[2]);
+ const int idx[] = {static_cast<int>(hres.m_Indices[i * 3 + 0]),
+ static_cast<int>(hres.m_Indices[i * 3 + 1]),
+ static_cast<int>(hres.m_Indices[i * 3 + 2])};
+ if (idx[0] < idx[1]) psb->appendLink(idx[0], idx[1]);
+ if (idx[1] < idx[2]) psb->appendLink(idx[1], idx[2]);
+ if (idx[2] < idx[0]) psb->appendLink(idx[2], idx[0]);
+ psb->appendFace(idx[0], idx[1], idx[2]);
}
hlib.ReleaseResult(hres);
if (randomizeConstraints)
{
psb->randomizeConstraints();
}
- return(psb);
+ return (psb);
}
-
-
-
static int nextLine(const char* buffer)
{
- int numBytesRead=0;
+ int numBytesRead = 0;
while (*buffer != '\n')
{
@@ -1104,8 +1116,7 @@ static int nextLine(const char* buffer)
numBytesRead++;
}
-
- if (buffer[0]==0x0a)
+ if (buffer[0] == 0x0a)
{
buffer++;
numBytesRead++;
@@ -1113,8 +1124,8 @@ static int nextLine(const char* buffer)
return numBytesRead;
}
-/* Create from TetGen .ele, .face, .node data */
-btSoftBody* btSoftBodyHelpers::CreateFromTetGenData(btSoftBodyWorldInfo& worldInfo,
+/* Create from TetGen .ele, .face, .node data */
+btSoftBody* btSoftBodyHelpers::CreateFromTetGenData(btSoftBodyWorldInfo& worldInfo,
const char* ele,
const char* face,
const char* node,
@@ -1122,38 +1133,38 @@ btSoftBody* btSoftBodyHelpers::CreateFromTetGenData(btSoftBodyWorldInfo& worldIn
bool btetralinks,
bool bfacesfromtetras)
{
-btAlignedObjectArray<btVector3> pos;
-int nnode=0;
-int ndims=0;
-int nattrb=0;
-int hasbounds=0;
-int result = sscanf(node,"%d %d %d %d",&nnode,&ndims,&nattrb,&hasbounds);
-result = sscanf(node,"%d %d %d %d",&nnode,&ndims,&nattrb,&hasbounds);
-node += nextLine(node);
-
-pos.resize(nnode);
-for(int i=0;i<pos.size();++i)
+ btAlignedObjectArray<btVector3> pos;
+ int nnode = 0;
+ int ndims = 0;
+ int nattrb = 0;
+ int hasbounds = 0;
+ int result = sscanf(node, "%d %d %d %d", &nnode, &ndims, &nattrb, &hasbounds);
+ result = sscanf(node, "%d %d %d %d", &nnode, &ndims, &nattrb, &hasbounds);
+ node += nextLine(node);
+
+ pos.resize(nnode);
+ for (int i = 0; i < pos.size(); ++i)
{
- int index=0;
- //int bound=0;
- float x,y,z;
- sscanf(node,"%d %f %f %f",&index,&x,&y,&z);
+ int index = 0;
+ //int bound=0;
+ float x, y, z;
+ sscanf(node, "%d %f %f %f", &index, &x, &y, &z);
-// sn>>index;
-// sn>>x;sn>>y;sn>>z;
- node += nextLine(node);
+ // sn>>index;
+ // sn>>x;sn>>y;sn>>z;
+ node += nextLine(node);
- //for(int j=0;j<nattrb;++j)
- // sn>>a;
+ //for(int j=0;j<nattrb;++j)
+ // sn>>a;
- //if(hasbounds)
- // sn>>bound;
+ //if(hasbounds)
+ // sn>>bound;
- pos[index].setX(btScalar(x));
- pos[index].setY(btScalar(y));
- pos[index].setZ(btScalar(z));
+ pos[index].setX(btScalar(x));
+ pos[index].setY(btScalar(y));
+ pos[index].setZ(btScalar(z));
}
-btSoftBody* psb=new btSoftBody(&worldInfo,nnode,&pos[0],0);
+ btSoftBody* psb = new btSoftBody(&worldInfo, nnode, &pos[0], 0);
#if 0
if(face&&face[0])
{
@@ -1178,42 +1189,41 @@ if(face&&face[0])
}
#endif
-if(ele&&ele[0])
+ if (ele && ele[0])
{
- int ntetra=0;
- int ncorner=0;
- int neattrb=0;
- sscanf(ele,"%d %d %d",&ntetra,&ncorner,&neattrb);
- ele += nextLine(ele);
-
- //se>>ntetra;se>>ncorner;se>>neattrb;
- for(int i=0;i<ntetra;++i)
+ int ntetra = 0;
+ int ncorner = 0;
+ int neattrb = 0;
+ sscanf(ele, "%d %d %d", &ntetra, &ncorner, &neattrb);
+ ele += nextLine(ele);
+
+ //se>>ntetra;se>>ncorner;se>>neattrb;
+ for (int i = 0; i < ntetra; ++i)
{
- int index=0;
- int ni[4];
-
- //se>>index;
- //se>>ni[0];se>>ni[1];se>>ni[2];se>>ni[3];
- sscanf(ele,"%d %d %d %d %d",&index,&ni[0],&ni[1],&ni[2],&ni[3]);
- ele+=nextLine(ele);
- //for(int j=0;j<neattrb;++j)
- // se>>a;
- psb->appendTetra(ni[0],ni[1],ni[2],ni[3]);
- if(btetralinks)
+ int index = 0;
+ int ni[4];
+
+ //se>>index;
+ //se>>ni[0];se>>ni[1];se>>ni[2];se>>ni[3];
+ sscanf(ele, "%d %d %d %d %d", &index, &ni[0], &ni[1], &ni[2], &ni[3]);
+ ele += nextLine(ele);
+ //for(int j=0;j<neattrb;++j)
+ // se>>a;
+ psb->appendTetra(ni[0], ni[1], ni[2], ni[3]);
+ if (btetralinks)
{
- psb->appendLink(ni[0],ni[1],0,true);
- psb->appendLink(ni[1],ni[2],0,true);
- psb->appendLink(ni[2],ni[0],0,true);
- psb->appendLink(ni[0],ni[3],0,true);
- psb->appendLink(ni[1],ni[3],0,true);
- psb->appendLink(ni[2],ni[3],0,true);
+ psb->appendLink(ni[0], ni[1], 0, true);
+ psb->appendLink(ni[1], ni[2], 0, true);
+ psb->appendLink(ni[2], ni[0], 0, true);
+ psb->appendLink(ni[0], ni[3], 0, true);
+ psb->appendLink(ni[1], ni[3], 0, true);
+ psb->appendLink(ni[2], ni[3], 0, true);
}
}
}
-printf("Nodes: %u\r\n",psb->m_nodes.size());
-printf("Links: %u\r\n",psb->m_links.size());
-printf("Faces: %u\r\n",psb->m_faces.size());
-printf("Tetras: %u\r\n",psb->m_tetras.size());
-return(psb);
+ printf("Nodes: %u\r\n", psb->m_nodes.size());
+ printf("Links: %u\r\n", psb->m_links.size());
+ printf("Faces: %u\r\n", psb->m_faces.size());
+ printf("Tetras: %u\r\n", psb->m_tetras.size());
+ return (psb);
}
-
diff --git a/thirdparty/bullet/BulletSoftBody/btSoftBodyHelpers.h b/thirdparty/bullet/BulletSoftBody/btSoftBodyHelpers.h
index 7271530109..e433558c18 100644
--- a/thirdparty/bullet/BulletSoftBody/btSoftBodyHelpers.h
+++ b/thirdparty/bullet/BulletSoftBody/btSoftBodyHelpers.h
@@ -22,127 +22,130 @@ subject to the following restrictions:
// 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
+/* fDrawFlags */
+struct fDrawFlags
{
- /* 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);
- /* 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);
+ 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);
+ /* 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);
+ /* 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);
/// 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 );
+ static void ReoptimizeLinkOrder(btSoftBody* psb);
};
-#endif //BT_SOFT_BODY_HELPERS_H
+#endif //BT_SOFT_BODY_HELPERS_H
diff --git a/thirdparty/bullet/BulletSoftBody/btSoftBodyInternals.h b/thirdparty/bullet/BulletSoftBody/btSoftBodyInternals.h
index 1ad82616ea..7efe514f38 100644
--- a/thirdparty/bullet/BulletSoftBody/btSoftBodyInternals.h
+++ b/thirdparty/bullet/BulletSoftBody/btSoftBodyInternals.h
@@ -19,29 +19,37 @@ subject to the following restrictions:
#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 <string.h> //for memset
+#include <string.h> //for memset
//
// btSymMatrix
//
template <typename T>
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<T> store;
- int dim;
-};
+ 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<T> store;
+ int dim;
+};
//
// btSoftBodyCollisionShape
@@ -49,67 +57,64 @@ struct btSymMatrix
class btSoftBodyCollisionShape : public btConcaveShape
{
public:
- btSoftBody* m_body;
+ btSoftBody* m_body;
btSoftBodyCollisionShape(btSoftBody* backptr)
{
m_shapeType = SOFTBODY_SHAPE_PROXYTYPE;
- m_body=backptr;
+ m_body = backptr;
}
virtual ~btSoftBodyCollisionShape()
{
-
}
- void processAllTriangles(btTriangleCallback* /*callback*/,const btVector3& /*aabbMin*/,const btVector3& /*aabbMax*/) const
+ 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
+ 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)
+ 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*/)
- {
+ virtual void setLocalScaling(const btVector3& /*scaling*/)
+ {
///na
}
virtual const btVector3& getLocalScaling() const
{
- static const btVector3 dummy(1,1,1);
+ static const btVector3 dummy(1, 1, 1);
return dummy;
}
- virtual void calculateLocalInertia(btScalar /*mass*/,btVector3& /*inertia*/) const
+ virtual void calculateLocalInertia(btScalar /*mass*/, btVector3& /*inertia*/) const
{
///not yet
btAssert(0);
}
- virtual const char* getName()const
+ virtual const char* getName() const
{
return "SoftBody";
}
-
};
//
@@ -118,48 +123,53 @@ public:
class btSoftClusterCollisionShape : public btConvexInternalShape
{
public:
- const btSoftBody::Cluster* m_cluster;
+ const btSoftBody::Cluster* m_cluster;
- btSoftClusterCollisionShape (const btSoftBody::Cluster* cluster) : m_cluster(cluster) { setMargin(0); }
+ btSoftClusterCollisionShape(const btSoftBody::Cluster* cluster) : m_cluster(cluster) { setMargin(0); }
-
- virtual btVector3 localGetSupportingVertex(const btVector3& vec) const
+ 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)
+ 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; }
+ const btScalar k = btDot(vec, n[i]->m_x);
+ if (k > d)
+ {
+ d = k;
+ j = i;
+ }
}
- return(n[j]->m_x);
+ return (n[j]->m_x);
}
- virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const
+ virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const
{
- return(localGetSupportingVertex(vec));
+ return (localGetSupportingVertex(vec));
}
//notice that the vectors should be unit length
- virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const
- {}
-
+ virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors, btVector3* supportVerticesOut, int numVectors) const
+ {
+ }
- virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const
- {}
+ virtual void calculateLocalInertia(btScalar mass, btVector3& inertia) const
+ {
+ }
- virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
- {}
+ virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
+ {
+ }
- virtual int getShapeType() const { return SOFTBODY_SHAPE_PROXYTYPE; }
+ virtual int getShapeType() const { return SOFTBODY_SHAPE_PROXYTYPE; }
//debugging
- virtual const char* getName()const {return "SOFTCLUSTER";}
+ virtual const char* getName() const { return "SOFTCLUSTER"; }
- virtual void setMargin(btScalar margin)
+ virtual void setMargin(btScalar margin)
{
btConvexInternalShape::setMargin(margin);
}
- virtual btScalar getMargin() const
+ virtual btScalar getMargin() const
{
return btConvexInternalShape::getMargin();
}
@@ -171,229 +181,247 @@ public:
//
template <typename T>
-static inline void ZeroInitialize(T& value)
+static inline void ZeroInitialize(T& value)
{
- memset(&value,0,sizeof(T));
+ memset(&value, 0, sizeof(T));
}
//
template <typename T>
-static inline bool CompLess(const T& a,const T& b)
-{ return(a<b); }
+static inline bool CompLess(const T& a, const T& b)
+{
+ return (a < b);
+}
//
template <typename T>
-static inline bool CompGreater(const T& a,const T& b)
-{ return(a>b); }
+static inline bool CompGreater(const T& a, const T& b)
+{
+ return (a > b);
+}
//
template <typename T>
-static inline T Lerp(const T& a,const T& b,btScalar t)
-{ return(a+(b-a)*t); }
+static inline T Lerp(const T& a, const T& b, btScalar t)
+{
+ return (a + (b - a) * t);
+}
//
template <typename T>
-static inline T InvLerp(const T& a,const T& b,btScalar t)
-{ return((b+a*t-b*t)/(a*b)); }
+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)
+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);
+ 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)
+static inline btVector3 Clamp(const btVector3& v, btScalar maxlength)
{
- const btScalar sql=v.length2();
- if(sql>(maxlength*maxlength))
- return((v*maxlength)/btSqrt(sql));
+ const btScalar sql = v.length2();
+ if (sql > (maxlength * maxlength))
+ return ((v * maxlength) / btSqrt(sql));
else
- return(v);
+ return (v);
}
//
template <typename T>
-static inline T Clamp(const T& x,const T& l,const T& h)
-{ return(x<l?l:x>h?h:x); }
+static inline T Clamp(const T& x, const T& l, const T& h)
+{
+ return (x < l ? l : x > h ? h : x);
+}
//
template <typename T>
-static inline T Sq(const T& x)
-{ return(x*x); }
+static inline T Sq(const T& x)
+{
+ return (x * x);
+}
//
template <typename T>
-static inline T Cube(const T& x)
-{ return(x*x*x); }
+static inline T Cube(const T& x)
+{
+ return (x * x * x);
+}
//
template <typename T>
-static inline T Sign(const T& x)
-{ return((T)(x<0?-1:+1)); }
+static inline T Sign(const T& x)
+{
+ return ((T)(x < 0 ? -1 : +1));
+}
//
template <typename T>
-static inline bool SameSign(const T& x,const T& y)
-{ return((x*y)>0); }
-//
-static inline btScalar ClusterMetric(const btVector3& x,const btVector3& y)
+static inline bool SameSign(const T& x, const T& y)
{
- const btVector3 d=x-y;
- return(btFabs(d[0])+btFabs(d[1])+btFabs(d[2]));
+ return ((x * y) > 0);
}
//
-static inline btMatrix3x3 ScaleAlongAxis(const btVector3& a,btScalar s)
+static inline btScalar ClusterMetric(const btVector3& x, const btVector3& y)
{
- 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);
+ 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)
+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);
+ 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)
+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);
+ 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 Add(const btMatrix3x3& a,
- const btMatrix3x3& b)
+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);
+ 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)
+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);
+ 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)
+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);
+ btMatrix3x3 r;
+ for (int i = 0; i < 3; ++i) r[i] = a[i] * b;
+ return (r);
}
//
-static inline void Orthogonalize(btMatrix3x3& m)
+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();
+ 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)
+static inline btMatrix3x3 MassMatrix(btScalar im, const btMatrix3x3& iwi, const btVector3& r)
{
- const btMatrix3x3 cr=Cross(r);
- return(Sub(Diagonal(im),cr*iwi*cr));
+ 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)
+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());
+ return (Diagonal(1 / dt) * Add(Diagonal(ima), MassMatrix(imb, iwi, r)).inverse());
}
//
-static inline btMatrix3x3 ImpulseMatrix( btScalar ima,const btMatrix3x3& iia,const btVector3& ra,
- btScalar imb,const btMatrix3x3& iib,const btVector3& rb)
+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());
+ return (Add(MassMatrix(ima, iia, ra), MassMatrix(imb, iib, rb)).inverse());
}
//
-static inline btMatrix3x3 AngularImpulseMatrix( const btMatrix3x3& iia,
- const btMatrix3x3& iib)
+static inline btMatrix3x3 AngularImpulseMatrix(const btMatrix3x3& iia,
+ const btMatrix3x3& iib)
{
- return(Add(iia,iib).inverse());
+ return (Add(iia, iib).inverse());
}
//
-static inline btVector3 ProjectOnAxis( const btVector3& v,
- const btVector3& a)
+static inline btVector3 ProjectOnAxis(const btVector3& v,
+ const btVector3& a)
{
- return(a*btDot(v,a));
+ return (a * btDot(v, a));
}
//
-static inline btVector3 ProjectOnPlane( const btVector3& v,
- const btVector3& a)
+static inline btVector3 ProjectOnPlane(const btVector3& v,
+ const btVector3& a)
{
- return(v-ProjectOnAxis(v,a));
+ return (v - ProjectOnAxis(v, a));
}
//
-static inline void ProjectOrigin( const btVector3& a,
- const btVector3& b,
- btVector3& prj,
- btScalar& sqd)
+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<btScalar>(-btDot(a,d)/m2,0,1);
- const btVector3 p=a+d*t;
- const btScalar l2=p.length2();
- if(l2<sqd)
+ const btVector3 d = b - a;
+ const btScalar m2 = d.length2();
+ if (m2 > SIMD_EPSILON)
+ {
+ const btScalar t = Clamp<btScalar>(-btDot(a, d) / m2, 0, 1);
+ const btVector3 p = a + d * t;
+ const btScalar l2 = p.length2();
+ if (l2 < sqd)
{
- prj=p;
- sqd=l2;
+ prj = p;
+ sqd = l2;
}
}
}
//
-static inline void ProjectOrigin( const btVector3& a,
- const btVector3& b,
- const btVector3& c,
- btVector3& prj,
- btScalar& sqd)
+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& 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 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;
+ 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);
+ ProjectOrigin(a, b, prj, sqd);
+ ProjectOrigin(b, c, prj, sqd);
+ ProjectOrigin(c, a, prj, sqd);
}
}
}
@@ -401,155 +429,159 @@ static inline void ProjectOrigin( const btVector3& a,
//
template <typename T>
-static inline T BaryEval( const T& a,
- const T& b,
- const T& c,
- const btVector3& coord)
+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());
+ 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)
+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));
+ 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)
+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])
+ 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]);
+ 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)
+ 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; }
+ 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; }
+ {
+ span[1] = t;
+ values[1] = v;
+ }
}
- return(-1);
+ return (-1);
}
-inline static void EvaluateMedium( const btSoftBodyWorldInfo* wfi,
- const btVector3& x,
- btSoftBody::sMedium& medium)
+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)
+ 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)
+ 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();
+ medium.m_density = wfi->water_density;
+ medium.m_pressure = depth * wfi->water_density * wfi->m_gravity.length();
}
}
}
-
//
-static inline btVector3 NormalizeAny(const btVector3& v)
+static inline btVector3 NormalizeAny(const btVector3& v)
{
- const btScalar l=v.length();
- if(l>SIMD_EPSILON)
- return(v/l);
+ const btScalar l = v.length();
+ if (l > SIMD_EPSILON)
+ return (v / l);
else
- return(btVector3(0,0,0));
+ return (btVector3(0, 0, 0));
}
//
-static inline btDbvtVolume VolumeOf( const btSoftBody::Face& f,
- btScalar margin)
+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);
+ 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)
+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);
+ 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)
+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);
+ 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)
+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)));
+ 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)
+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;
+ 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;
+ { /* 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)
+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);
+ if ((a == ma) && (b == mb)) return (0);
+ if ((a == mb) && (b == ma)) return (1);
+ return (-1);
}
//
@@ -557,58 +589,72 @@ static inline int MatchEdge( const btSoftBody::Node* a,
// straitforward implementation of http://math.fullerton.edu/mathews/n2003/JacobiMethodMod.html
// outputs are NOT sorted.
//
-struct btEigen
+struct btEigen
{
- static int system(btMatrix3x3& a,btMatrix3x3* vectors,btVector3* values=0)
+ 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;
+ 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)
+ do
+ {
+ int p = 0, q = 1;
+ if (btFabs(a[p][q]) < btFabs(a[0][2]))
{
- 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... */
+ 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)
+ 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]);
+ *values = btVector3(a[0][0], a[1][1], a[2][2]);
}
- return(iterations);
+ return (iterations);
}
+
private:
- static inline void mulTPQ(btMatrix3x3& a,btScalar c,btScalar s,int p,int q)
+ 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]}};
+ 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];
+ 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)
+ 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]}};
+ 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];
+ 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];
}
};
@@ -616,9 +662,9 @@ private:
// Polar decomposition,
// "Computing the Polar Decomposition with Applications", Nicholas J. Higham, 1986.
//
-static inline int PolarDecompose( const btMatrix3x3& m,btMatrix3x3& q,btMatrix3x3& s)
+static inline int PolarDecompose(const btMatrix3x3& m, btMatrix3x3& q, btMatrix3x3& s)
{
- static const btPolarDecomposition polar;
+ static const btPolarDecomposition polar;
return polar.decompose(m, q, s);
}
@@ -630,282 +676,284 @@ struct btSoftColliders
//
// ClusterBase
//
- struct ClusterBase : btDbvt::ICollide
+ struct ClusterBase : btDbvt::ICollide
{
- btScalar erp;
- btScalar idt;
- btScalar m_margin;
- btScalar friction;
- btScalar threshold;
+ 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;
+ 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)
+ bool SolveContact(const btGjkEpaSolver2::sResults& res,
+ btSoftBody::Body ba, const btSoftBody::Body bb,
+ btSoftBody::CJoint& joint)
{
- if(res.distance<m_margin)
+ 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);
+ 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);
+ return (false);
}
};
//
// CollideCL_RS
//
- struct CollideCL_RS : ClusterBase
+ struct CollideCL_RS : ClusterBase
{
- btSoftBody* psb;
- const btCollisionObjectWrapper* m_colObjWrap;
+ btSoftBody* psb;
+ const btCollisionObjectWrapper* m_colObjWrap;
- void Process(const btDbvtNode* leaf)
+ void Process(const btDbvtNode* leaf)
{
- btSoftBody::Cluster* cluster=(btSoftBody::Cluster*)leaf->data;
- btSoftClusterCollisionShape cshape(cluster);
-
- const btConvexShape* rshape=(const btConvexShape*)m_colObjWrap->getCollisionShape();
+ 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)
+ 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))
+ 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 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())
+ 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;
+ 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;
+ pj->m_erp *= psb->m_cfg.kSRHR_CL;
+ pj->m_split *= psb->m_cfg.kSR_SPLT_CL;
}
}
}
}
- void ProcessColObj(btSoftBody* ps,const btCollisionObjectWrapper* colObWrap)
+ 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();
+ 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);
- }
+ 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
+ struct CollideCL_SS : ClusterBase
{
- btSoftBody* bodies[2];
- void Process(const btDbvtNode* la,const btDbvtNode* lb)
+ 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;
+ 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()))
+ 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];
+ 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))
+ 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 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;
+ 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
+ }
+ else
{
- static int count=0;
+ static int count = 0;
count++;
//printf("count=%d\n",count);
-
}
}
- void ProcessSoftSoft(btSoftBody* psa,btSoftBody* psb)
+ void ProcessSoftSoft(btSoftBody* psa, btSoftBody* psb)
{
- idt = psa->m_sst.isdt;
+ 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);
- }
+ 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
+ struct CollideSDF_RS : btDbvt::ICollide
{
- void Process(const btDbvtNode* leaf)
+ void Process(const btDbvtNode* leaf)
{
- btSoftBody::Node* node=(btSoftBody::Node*)leaf->data;
+ btSoftBody::Node* node = (btSoftBody::Node*)leaf->data;
DoNode(*node);
}
- void DoNode(btSoftBody::Node& n) const
+ void DoNode(btSoftBody::Node& n) const
{
- const btScalar m=n.m_im>0?dynmargin:stamargin;
- btSoftBody::RContact c;
+ 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))
+ 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 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;
+ 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;
+ btSoftBody* psb;
+ const btCollisionObjectWrapper* m_colObj1Wrap;
+ btRigidBody* m_rigidBody;
+ btScalar dynmargin;
+ btScalar stamargin;
};
//
// CollideVF_SS
//
- struct CollideVF_SS : btDbvt::ICollide
+ struct CollideVF_SS : btDbvt::ICollide
{
- void Process(const btDbvtNode* lnode,
- const btDbvtNode* lface)
+ void Process(const btDbvtNode* lnode,
+ const btDbvtNode* lface)
{
- btSoftBody::Node* node=(btSoftBody::Node*)lnode->data;
- btSoftBody::Face* face=(btSoftBody::Face*)lface->data;
- 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))
+ btSoftBody::Node* node = (btSoftBody::Node*)lnode->data;
+ btSoftBody::Face* face = (btSoftBody::Face*)lface->data;
+ 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))
+ 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;
+ mb = 0;
}
- const btScalar ms=ma+mb;
- if(ms>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;
+ 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;
+ btSoftBody* psb[2];
+ btScalar mrg;
};
};
-#endif //_BT_SOFT_BODY_INTERNALS_H
+#endif //_BT_SOFT_BODY_INTERNALS_H
diff --git a/thirdparty/bullet/BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.cpp b/thirdparty/bullet/BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.cpp
index f5a67f6d89..3127369ccd 100644
--- a/thirdparty/bullet/BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.cpp
+++ b/thirdparty/bullet/BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.cpp
@@ -23,27 +23,27 @@ subject to the following restrictions:
#define ENABLE_SOFTBODY_CONCAVE_COLLISIONS 1
btSoftBodyRigidBodyCollisionConfiguration::btSoftBodyRigidBodyCollisionConfiguration(const btDefaultCollisionConstructionInfo& constructionInfo)
-:btDefaultCollisionConfiguration(constructionInfo)
+ : btDefaultCollisionConfiguration(constructionInfo)
{
void* mem;
- mem = btAlignedAlloc(sizeof(btSoftSoftCollisionAlgorithm::CreateFunc),16);
- m_softSoftCreateFunc = new(mem) btSoftSoftCollisionAlgorithm::CreateFunc;
+ mem = btAlignedAlloc(sizeof(btSoftSoftCollisionAlgorithm::CreateFunc), 16);
+ m_softSoftCreateFunc = new (mem) btSoftSoftCollisionAlgorithm::CreateFunc;
- mem = btAlignedAlloc(sizeof(btSoftRigidCollisionAlgorithm::CreateFunc),16);
- m_softRigidConvexCreateFunc = new(mem) btSoftRigidCollisionAlgorithm::CreateFunc;
+ mem = btAlignedAlloc(sizeof(btSoftRigidCollisionAlgorithm::CreateFunc), 16);
+ m_softRigidConvexCreateFunc = new (mem) btSoftRigidCollisionAlgorithm::CreateFunc;
- mem = btAlignedAlloc(sizeof(btSoftRigidCollisionAlgorithm::CreateFunc),16);
- m_swappedSoftRigidConvexCreateFunc = new(mem) btSoftRigidCollisionAlgorithm::CreateFunc;
- m_swappedSoftRigidConvexCreateFunc->m_swapped=true;
+ mem = btAlignedAlloc(sizeof(btSoftRigidCollisionAlgorithm::CreateFunc), 16);
+ m_swappedSoftRigidConvexCreateFunc = new (mem) btSoftRigidCollisionAlgorithm::CreateFunc;
+ m_swappedSoftRigidConvexCreateFunc->m_swapped = true;
#ifdef ENABLE_SOFTBODY_CONCAVE_COLLISIONS
- mem = btAlignedAlloc(sizeof(btSoftBodyConcaveCollisionAlgorithm::CreateFunc),16);
- m_softRigidConcaveCreateFunc = new(mem) btSoftBodyConcaveCollisionAlgorithm::CreateFunc;
+ mem = btAlignedAlloc(sizeof(btSoftBodyConcaveCollisionAlgorithm::CreateFunc), 16);
+ m_softRigidConcaveCreateFunc = new (mem) btSoftBodyConcaveCollisionAlgorithm::CreateFunc;
- mem = btAlignedAlloc(sizeof(btSoftBodyConcaveCollisionAlgorithm::CreateFunc),16);
- m_swappedSoftRigidConcaveCreateFunc = new(mem) btSoftBodyConcaveCollisionAlgorithm::SwappedCreateFunc;
- m_swappedSoftRigidConcaveCreateFunc->m_swapped=true;
+ mem = btAlignedAlloc(sizeof(btSoftBodyConcaveCollisionAlgorithm::CreateFunc), 16);
+ m_swappedSoftRigidConcaveCreateFunc = new (mem) btSoftBodyConcaveCollisionAlgorithm::SwappedCreateFunc;
+ m_swappedSoftRigidConcaveCreateFunc->m_swapped = true;
#endif
//replace pool by a new one, with potential larger size
@@ -53,82 +53,79 @@ btSoftBodyRigidBodyCollisionConfiguration::btSoftBodyRigidBodyCollisionConfigura
int curElemSize = m_collisionAlgorithmPool->getElementSize();
///calculate maximum element size, big enough to fit any collision algorithm in the memory pool
-
int maxSize0 = sizeof(btSoftSoftCollisionAlgorithm);
int maxSize1 = sizeof(btSoftRigidCollisionAlgorithm);
int maxSize2 = sizeof(btSoftBodyConcaveCollisionAlgorithm);
- int collisionAlgorithmMaxElementSize = btMax(maxSize0,maxSize1);
- collisionAlgorithmMaxElementSize = btMax(collisionAlgorithmMaxElementSize,maxSize2);
-
+ int collisionAlgorithmMaxElementSize = btMax(maxSize0, maxSize1);
+ collisionAlgorithmMaxElementSize = btMax(collisionAlgorithmMaxElementSize, maxSize2);
+
if (collisionAlgorithmMaxElementSize > curElemSize)
{
m_collisionAlgorithmPool->~btPoolAllocator();
btAlignedFree(m_collisionAlgorithmPool);
- void* mem = btAlignedAlloc(sizeof(btPoolAllocator),16);
- m_collisionAlgorithmPool = new(mem) btPoolAllocator(collisionAlgorithmMaxElementSize,constructionInfo.m_defaultMaxCollisionAlgorithmPoolSize);
+ void* mem = btAlignedAlloc(sizeof(btPoolAllocator), 16);
+ m_collisionAlgorithmPool = new (mem) btPoolAllocator(collisionAlgorithmMaxElementSize, constructionInfo.m_defaultMaxCollisionAlgorithmPoolSize);
}
}
-
}
btSoftBodyRigidBodyCollisionConfiguration::~btSoftBodyRigidBodyCollisionConfiguration()
{
m_softSoftCreateFunc->~btCollisionAlgorithmCreateFunc();
- btAlignedFree( m_softSoftCreateFunc);
+ btAlignedFree(m_softSoftCreateFunc);
m_softRigidConvexCreateFunc->~btCollisionAlgorithmCreateFunc();
- btAlignedFree( m_softRigidConvexCreateFunc);
+ btAlignedFree(m_softRigidConvexCreateFunc);
m_swappedSoftRigidConvexCreateFunc->~btCollisionAlgorithmCreateFunc();
- btAlignedFree( m_swappedSoftRigidConvexCreateFunc);
+ btAlignedFree(m_swappedSoftRigidConvexCreateFunc);
#ifdef ENABLE_SOFTBODY_CONCAVE_COLLISIONS
m_softRigidConcaveCreateFunc->~btCollisionAlgorithmCreateFunc();
- btAlignedFree( m_softRigidConcaveCreateFunc);
+ btAlignedFree(m_softRigidConcaveCreateFunc);
m_swappedSoftRigidConcaveCreateFunc->~btCollisionAlgorithmCreateFunc();
- btAlignedFree( m_swappedSoftRigidConcaveCreateFunc);
+ btAlignedFree(m_swappedSoftRigidConcaveCreateFunc);
#endif
}
///creation of soft-soft and soft-rigid, and otherwise fallback to base class implementation
-btCollisionAlgorithmCreateFunc* btSoftBodyRigidBodyCollisionConfiguration::getCollisionAlgorithmCreateFunc(int proxyType0,int proxyType1)
+btCollisionAlgorithmCreateFunc* btSoftBodyRigidBodyCollisionConfiguration::getCollisionAlgorithmCreateFunc(int proxyType0, int proxyType1)
{
-
///try to handle the softbody interactions first
- if ((proxyType0 == SOFTBODY_SHAPE_PROXYTYPE ) && (proxyType1==SOFTBODY_SHAPE_PROXYTYPE))
+ if ((proxyType0 == SOFTBODY_SHAPE_PROXYTYPE) && (proxyType1 == SOFTBODY_SHAPE_PROXYTYPE))
{
- return m_softSoftCreateFunc;
+ return m_softSoftCreateFunc;
}
///softbody versus convex
- if (proxyType0 == SOFTBODY_SHAPE_PROXYTYPE && btBroadphaseProxy::isConvex(proxyType1))
+ if (proxyType0 == SOFTBODY_SHAPE_PROXYTYPE && btBroadphaseProxy::isConvex(proxyType1))
{
- return m_softRigidConvexCreateFunc;
+ return m_softRigidConvexCreateFunc;
}
///convex versus soft body
- if (btBroadphaseProxy::isConvex(proxyType0) && proxyType1 == SOFTBODY_SHAPE_PROXYTYPE )
+ if (btBroadphaseProxy::isConvex(proxyType0) && proxyType1 == SOFTBODY_SHAPE_PROXYTYPE)
{
- return m_swappedSoftRigidConvexCreateFunc;
+ return m_swappedSoftRigidConvexCreateFunc;
}
#ifdef ENABLE_SOFTBODY_CONCAVE_COLLISIONS
///softbody versus convex
- if (proxyType0 == SOFTBODY_SHAPE_PROXYTYPE && btBroadphaseProxy::isConcave(proxyType1))
+ if (proxyType0 == SOFTBODY_SHAPE_PROXYTYPE && btBroadphaseProxy::isConcave(proxyType1))
{
- return m_softRigidConcaveCreateFunc;
+ return m_softRigidConcaveCreateFunc;
}
///convex versus soft body
- if (btBroadphaseProxy::isConcave(proxyType0) && proxyType1 == SOFTBODY_SHAPE_PROXYTYPE )
+ if (btBroadphaseProxy::isConcave(proxyType0) && proxyType1 == SOFTBODY_SHAPE_PROXYTYPE)
{
- return m_swappedSoftRigidConcaveCreateFunc;
+ return m_swappedSoftRigidConcaveCreateFunc;
}
#endif
///fallback to the regular rigid collision shape
- return btDefaultCollisionConfiguration::getCollisionAlgorithmCreateFunc(proxyType0,proxyType1);
+ return btDefaultCollisionConfiguration::getCollisionAlgorithmCreateFunc(proxyType0, proxyType1);
}
diff --git a/thirdparty/bullet/BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.h b/thirdparty/bullet/BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.h
index 21addcfe2e..0396a52dac 100644
--- a/thirdparty/bullet/BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.h
+++ b/thirdparty/bullet/BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.h
@@ -21,28 +21,23 @@ subject to the following restrictions:
class btVoronoiSimplexSolver;
class btGjkEpaPenetrationDepthSolver;
-
///btSoftBodyRigidBodyCollisionConfiguration add softbody interaction on top of btDefaultCollisionConfiguration
-class btSoftBodyRigidBodyCollisionConfiguration : public 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;
+ 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);
-
+ virtual btCollisionAlgorithmCreateFunc* getCollisionAlgorithmCreateFunc(int proxyType0, int proxyType1);
};
-#endif //BT_SOFTBODY_RIGIDBODY_COLLISION_CONFIGURATION
-
+#endif //BT_SOFTBODY_RIGIDBODY_COLLISION_CONFIGURATION
diff --git a/thirdparty/bullet/BulletSoftBody/btSoftBodySolverVertexBuffer.h b/thirdparty/bullet/BulletSoftBody/btSoftBodySolverVertexBuffer.h
index c4733d6400..bc538db4a2 100644
--- a/thirdparty/bullet/BulletSoftBody/btSoftBodySolverVertexBuffer.h
+++ b/thirdparty/bullet/BulletSoftBody/btSoftBodySolverVertexBuffer.h
@@ -16,7 +16,6 @@ subject to the following restrictions:
#ifndef BT_SOFT_BODY_SOLVER_VERTEX_BUFFER_H
#define BT_SOFT_BODY_SOLVER_VERTEX_BUFFER_H
-
class btVertexBufferDescriptor
{
public:
@@ -27,8 +26,7 @@ public:
OPENGL_BUFFER
};
-protected:
-
+protected:
bool m_hasVertexPositions;
bool m_hasNormals;
@@ -51,7 +49,6 @@ public:
virtual ~btVertexBufferDescriptor()
{
-
}
virtual bool hasVertexPositions() const
@@ -102,7 +99,6 @@ public:
}
};
-
class btCPUVertexBufferDescriptor : public btVertexBufferDescriptor
{
protected:
@@ -114,7 +110,7 @@ public:
* 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 )
+ btCPUVertexBufferDescriptor(float *basePointer, int vertexOffset, int vertexStride)
{
m_basePointer = basePointer;
m_vertexOffset = vertexOffset;
@@ -127,7 +123,7 @@ public:
* 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 )
+ btCPUVertexBufferDescriptor(float *basePointer, int vertexOffset, int vertexStride, int normalOffset, int normalStride)
{
m_basePointer = basePointer;
@@ -142,7 +138,6 @@ public:
virtual ~btCPUVertexBufferDescriptor()
{
-
}
/**
@@ -162,4 +157,4 @@ public:
}
};
-#endif // #ifndef BT_SOFT_BODY_SOLVER_VERTEX_BUFFER_H
+#endif // #ifndef BT_SOFT_BODY_SOLVER_VERTEX_BUFFER_H
diff --git a/thirdparty/bullet/BulletSoftBody/btSoftBodySolvers.h b/thirdparty/bullet/BulletSoftBody/btSoftBodySolvers.h
index 6947bc27d2..dcf5082650 100644
--- a/thirdparty/bullet/BulletSoftBody/btSoftBodySolvers.h
+++ b/thirdparty/bullet/BulletSoftBody/btSoftBodySolvers.h
@@ -18,7 +18,6 @@ subject to the following restrictions:
#include "BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h"
-
class btSoftBodyTriangleData;
class btSoftBodyLinkData;
class btSoftBodyVertexData;
@@ -26,7 +25,6 @@ class btVertexBufferDescriptor;
class btCollisionObject;
class btSoftBody;
-
class btSoftBodySolver
{
public:
@@ -40,17 +38,15 @@ public:
DX_SIMD_SOLVER
};
-
protected:
int m_numberOfPositionIterations;
int m_numberOfVelocityIterations;
// Simulation timescale
float m_timeScale;
-
+
public:
- btSoftBodySolver() :
- m_numberOfPositionIterations( 10 ),
- m_timeScale( 1 )
+ btSoftBodySolver() : m_numberOfPositionIterations(10),
+ m_timeScale(1)
{
m_numberOfVelocityIterations = 0;
m_numberOfPositionIterations = 5;
@@ -59,39 +55,38 @@ public:
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< btSoftBody * > &softBodies , bool forceUpdate=false) = 0;
+ virtual void optimize(btAlignedObjectArray<btSoftBody *> &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( float solverdt ) = 0;
+ virtual void predictMotion(float solverdt) = 0;
/** Solve constraints for a set of soft bodies */
- virtual void solveConstraints( float solverdt ) = 0;
+ virtual void solveConstraints(float 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;
+ virtual void processCollision(btSoftBody *, const struct btCollisionObjectWrapper *) = 0;
/** Process a collision between two soft bodies */
- virtual void processCollision( btSoftBody*, btSoftBody* ) = 0;
+ virtual void processCollision(btSoftBody *, btSoftBody *) = 0;
/** Set the number of velocity constraint solver iterations this solver uses. */
- virtual void setNumberOfPositionIterations( int iterations )
+ virtual void setNumberOfPositionIterations(int iterations)
{
m_numberOfPositionIterations = iterations;
}
@@ -103,7 +98,7 @@ public:
}
/** Set the number of velocity constraint solver iterations this solver uses. */
- virtual void setNumberOfVelocityIterations( int iterations )
+ virtual void setNumberOfVelocityIterations(int iterations)
{
m_numberOfVelocityIterations = iterations;
}
@@ -135,7 +130,6 @@ public:
class btSoftBodySolverOutput
{
protected:
-
public:
btSoftBodySolverOutput()
{
@@ -145,10 +139,8 @@ public:
{
}
-
/** 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;
+ virtual void copySoftBodyToVertexBuffer(const btSoftBody *const softBody, btVertexBufferDescriptor *vertexBuffer) = 0;
};
-
-#endif // #ifndef BT_SOFT_BODY_SOLVERS_H
+#endif // #ifndef BT_SOFT_BODY_SOLVERS_H
diff --git a/thirdparty/bullet/BulletSoftBody/btSoftMultiBodyDynamicsWorld.cpp b/thirdparty/bullet/BulletSoftBody/btSoftMultiBodyDynamicsWorld.cpp
index 6facce4e86..282dbf75f0 100644
--- a/thirdparty/bullet/BulletSoftBody/btSoftMultiBodyDynamicsWorld.cpp
+++ b/thirdparty/bullet/BulletSoftBody/btSoftMultiBodyDynamicsWorld.cpp
@@ -13,7 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btSoftMultiBodyDynamicsWorld.h"
#include "LinearMath/btQuickprof.h"
@@ -24,42 +23,38 @@ subject to the following restrictions:
#include "BulletSoftBody/btDefaultSoftBodySolver.h"
#include "LinearMath/btSerializer.h"
-
btSoftMultiBodyDynamicsWorld::btSoftMultiBodyDynamicsWorld(
btDispatcher* dispatcher,
btBroadphaseInterface* pairCache,
btMultiBodyConstraintSolver* constraintSolver,
btCollisionConfiguration* collisionConfiguration,
- btSoftBodySolver *softBodySolver ) :
- btMultiBodyDynamicsWorld(dispatcher,pairCache,constraintSolver,collisionConfiguration),
- m_softBodySolver( softBodySolver ),
- m_ownsSolver(false)
+ btSoftBodySolver* softBodySolver) : btMultiBodyDynamicsWorld(dispatcher, pairCache, constraintSolver, collisionConfiguration),
+ m_softBodySolver(softBodySolver),
+ m_ownsSolver(false)
{
- if( !m_softBodySolver )
+ if (!m_softBodySolver)
{
- void* ptr = btAlignedAlloc(sizeof(btDefaultSoftBodySolver),16);
- m_softBodySolver = new(ptr) btDefaultSoftBodySolver();
+ void* ptr = btAlignedAlloc(sizeof(btDefaultSoftBodySolver), 16);
+ m_softBodySolver = new (ptr) btDefaultSoftBodySolver();
m_ownsSolver = true;
}
- m_drawFlags = fDrawFlags::Std;
- m_drawNodeTree = true;
- m_drawFaceTree = false;
- m_drawClusterTree = false;
+ m_drawFlags = fDrawFlags::Std;
+ m_drawNodeTree = true;
+ m_drawFaceTree = false;
+ m_drawClusterTree = false;
m_sbi.m_broadphase = pairCache;
m_sbi.m_dispatcher = dispatcher;
m_sbi.m_sparsesdf.Initialize();
m_sbi.m_sparsesdf.Reset();
- m_sbi.air_density = (btScalar)1.2;
- m_sbi.water_density = 0;
- m_sbi.water_offset = 0;
- m_sbi.water_normal = btVector3(0,0,0);
- m_sbi.m_gravity.setValue(0,-10,0);
+ m_sbi.air_density = (btScalar)1.2;
+ m_sbi.water_density = 0;
+ m_sbi.water_offset = 0;
+ m_sbi.water_normal = btVector3(0, 0, 0);
+ m_sbi.m_gravity.setValue(0, -10, 0);
m_sbi.m_sparsesdf.Initialize();
-
-
}
btSoftMultiBodyDynamicsWorld::~btSoftMultiBodyDynamicsWorld()
@@ -71,82 +66,78 @@ btSoftMultiBodyDynamicsWorld::~btSoftMultiBodyDynamicsWorld()
}
}
-void btSoftMultiBodyDynamicsWorld::predictUnconstraintMotion(btScalar timeStep)
+void btSoftMultiBodyDynamicsWorld::predictUnconstraintMotion(btScalar timeStep)
{
- btDiscreteDynamicsWorld::predictUnconstraintMotion( timeStep );
+ btDiscreteDynamicsWorld::predictUnconstraintMotion(timeStep);
{
BT_PROFILE("predictUnconstraintMotionSoftBody");
- m_softBodySolver->predictMotion( float(timeStep) );
+ m_softBodySolver->predictMotion(float(timeStep));
}
}
-void btSoftMultiBodyDynamicsWorld::internalSingleStepSimulation( btScalar timeStep )
+void btSoftMultiBodyDynamicsWorld::internalSingleStepSimulation(btScalar timeStep)
{
-
// Let the solver grab the soft bodies and if necessary optimize for it
- m_softBodySolver->optimize( getSoftBodyArray() );
+ m_softBodySolver->optimize(getSoftBodyArray());
- if( !m_softBodySolver->checkInitialized() )
+ if (!m_softBodySolver->checkInitialized())
{
- btAssert( "Solver initialization failed\n" );
+ btAssert("Solver initialization failed\n");
}
- btDiscreteDynamicsWorld::internalSingleStepSimulation( timeStep );
+ btDiscreteDynamicsWorld::internalSingleStepSimulation(timeStep);
///solve soft bodies constraints
- solveSoftBodiesConstraints( timeStep );
+ solveSoftBodiesConstraints(timeStep);
//self collisions
- for ( int i=0;i<m_softBodies.size();i++)
+ for (int i = 0; i < m_softBodies.size(); i++)
{
- btSoftBody* psb=(btSoftBody*)m_softBodies[i];
+ btSoftBody* psb = (btSoftBody*)m_softBodies[i];
psb->defaultCollisionHandler(psb);
}
///update soft bodies
- m_softBodySolver->updateSoftBodies( );
-
+ m_softBodySolver->updateSoftBodies();
+
// End solver-wise simulation step
// ///////////////////////////////
-
}
-void btSoftMultiBodyDynamicsWorld::solveSoftBodiesConstraints( btScalar timeStep )
+void btSoftMultiBodyDynamicsWorld::solveSoftBodiesConstraints(btScalar timeStep)
{
BT_PROFILE("solveSoftConstraints");
- if(m_softBodies.size())
+ if (m_softBodies.size())
{
btSoftBody::solveClusters(m_softBodies);
}
// Solve constraints solver-wise
- m_softBodySolver->solveConstraints( timeStep * m_softBodySolver->getTimeScale() );
-
+ m_softBodySolver->solveConstraints(timeStep * m_softBodySolver->getTimeScale());
}
-void btSoftMultiBodyDynamicsWorld::addSoftBody(btSoftBody* body, int collisionFilterGroup, int collisionFilterMask)
+void btSoftMultiBodyDynamicsWorld::addSoftBody(btSoftBody* body, int collisionFilterGroup, int collisionFilterMask)
{
m_softBodies.push_back(body);
// Set the soft body solver that will deal with this body
// to be the world's solver
- body->setSoftBodySolver( m_softBodySolver );
+ body->setSoftBodySolver(m_softBodySolver);
btCollisionWorld::addCollisionObject(body,
- collisionFilterGroup,
- collisionFilterMask);
-
+ collisionFilterGroup,
+ collisionFilterMask);
}
-void btSoftMultiBodyDynamicsWorld::removeSoftBody(btSoftBody* body)
+void btSoftMultiBodyDynamicsWorld::removeSoftBody(btSoftBody* body)
{
m_softBodies.remove(body);
btCollisionWorld::removeCollisionObject(body);
}
-void btSoftMultiBodyDynamicsWorld::removeCollisionObject(btCollisionObject* collisionObject)
+void btSoftMultiBodyDynamicsWorld::removeCollisionObject(btCollisionObject* collisionObject)
{
btSoftBody* body = btSoftBody::upcast(collisionObject);
if (body)
@@ -155,60 +146,57 @@ void btSoftMultiBodyDynamicsWorld::removeCollisionObject(btCollisionObject* coll
btDiscreteDynamicsWorld::removeCollisionObject(collisionObject);
}
-void btSoftMultiBodyDynamicsWorld::debugDrawWorld()
+void btSoftMultiBodyDynamicsWorld::debugDrawWorld()
{
btMultiBodyDynamicsWorld::debugDrawWorld();
if (getDebugDrawer())
{
int i;
- for ( i=0;i<this->m_softBodies.size();i++)
+ for (i = 0; i < this->m_softBodies.size(); i++)
{
- btSoftBody* psb=(btSoftBody*)this->m_softBodies[i];
+ btSoftBody* psb = (btSoftBody*)this->m_softBodies[i];
if (getDebugDrawer() && (getDebugDrawer()->getDebugMode() & (btIDebugDraw::DBG_DrawWireframe)))
{
- btSoftBodyHelpers::DrawFrame(psb,m_debugDrawer);
- btSoftBodyHelpers::Draw(psb,m_debugDrawer,m_drawFlags);
+ btSoftBodyHelpers::DrawFrame(psb, m_debugDrawer);
+ btSoftBodyHelpers::Draw(psb, m_debugDrawer, m_drawFlags);
}
-
+
if (m_debugDrawer && (m_debugDrawer->getDebugMode() & btIDebugDraw::DBG_DrawAabb))
{
- if(m_drawNodeTree) btSoftBodyHelpers::DrawNodeTree(psb,m_debugDrawer);
- if(m_drawFaceTree) btSoftBodyHelpers::DrawFaceTree(psb,m_debugDrawer);
- if(m_drawClusterTree) btSoftBodyHelpers::DrawClusterTree(psb,m_debugDrawer);
+ if (m_drawNodeTree) btSoftBodyHelpers::DrawNodeTree(psb, m_debugDrawer);
+ if (m_drawFaceTree) btSoftBodyHelpers::DrawFaceTree(psb, m_debugDrawer);
+ if (m_drawClusterTree) btSoftBodyHelpers::DrawClusterTree(psb, m_debugDrawer);
}
- }
- }
+ }
+ }
}
-
-
-
struct btSoftSingleRayCallback : public btBroadphaseRayCallback
{
- btVector3 m_rayFromWorld;
- btVector3 m_rayToWorld;
- btTransform m_rayFromTrans;
- btTransform m_rayToTrans;
- btVector3 m_hitNormal;
-
- const btSoftMultiBodyDynamicsWorld* m_world;
- btCollisionWorld::RayResultCallback& m_resultCallback;
-
- btSoftSingleRayCallback(const btVector3& rayFromWorld,const btVector3& rayToWorld,const btSoftMultiBodyDynamicsWorld* world,btCollisionWorld::RayResultCallback& resultCallback)
- :m_rayFromWorld(rayFromWorld),
- m_rayToWorld(rayToWorld),
- m_world(world),
- m_resultCallback(resultCallback)
+ btVector3 m_rayFromWorld;
+ btVector3 m_rayToWorld;
+ btTransform m_rayFromTrans;
+ btTransform m_rayToTrans;
+ btVector3 m_hitNormal;
+
+ const btSoftMultiBodyDynamicsWorld* m_world;
+ btCollisionWorld::RayResultCallback& m_resultCallback;
+
+ btSoftSingleRayCallback(const btVector3& rayFromWorld, const btVector3& rayToWorld, const btSoftMultiBodyDynamicsWorld* 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);
+ btVector3 rayDir = (rayToWorld - rayFromWorld);
- rayDir.normalize ();
+ 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];
@@ -217,22 +205,19 @@ struct btSoftSingleRayCallback : public btBroadphaseRayCallback
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);
-
+ m_lambda_max = rayDir.dot(m_rayToWorld - m_rayFromWorld);
}
-
-
- virtual bool process(const btBroadphaseProxy* proxy)
+ 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;
+ btCollisionObject* collisionObject = (btCollisionObject*)proxy->m_clientObject;
//only perform raycast if filterMask matches
- if(m_resultCallback.needsCollision(collisionObject->getBroadphaseHandle()))
+ if (m_resultCallback.needsCollision(collisionObject->getBroadphaseHandle()))
{
//RigidcollisionObject* collisionObject = ctrl->GetRigidcollisionObject();
//btVector3 collisionObjectAabbMin,collisionObjectAabbMax;
@@ -250,110 +235,106 @@ struct btSoftSingleRayCallback : public btBroadphaseRayCallback
//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);
+ m_world->rayTestSingle(m_rayFromTrans, m_rayToTrans,
+ collisionObject,
+ collisionObject->getCollisionShape(),
+ collisionObject->getWorldTransform(),
+ m_resultCallback);
}
}
return true;
}
};
-void btSoftMultiBodyDynamicsWorld::rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback) const
+void btSoftMultiBodyDynamicsWorld::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
- btSoftSingleRayCallback rayCB(rayFromWorld,rayToWorld,this,resultCallback);
+ btSoftSingleRayCallback rayCB(rayFromWorld, rayToWorld, this, resultCallback);
#ifndef USE_BRUTEFORCE_RAYBROADPHASE
- m_broadphasePairCache->rayTest(rayFromWorld,rayToWorld,rayCB);
+ m_broadphasePairCache->rayTest(rayFromWorld, rayToWorld, rayCB);
#else
- for (int i=0;i<this->getNumCollisionObjects();i++)
+ for (int i = 0; i < this->getNumCollisionObjects(); i++)
{
rayCB.process(m_collisionObjects[i]->getBroadphaseHandle());
- }
-#endif //USE_BRUTEFORCE_RAYBROADPHASE
-
+ }
+#endif //USE_BRUTEFORCE_RAYBROADPHASE
}
-
-void btSoftMultiBodyDynamicsWorld::rayTestSingle(const btTransform& rayFromTrans,const btTransform& rayToTrans,
- btCollisionObject* collisionObject,
- const btCollisionShape* collisionShape,
- const btTransform& colObjWorldTransform,
- RayResultCallback& resultCallback)
+void btSoftMultiBodyDynamicsWorld::rayTestSingle(const btTransform& rayFromTrans, const btTransform& rayToTrans,
+ btCollisionObject* collisionObject,
+ const btCollisionShape* collisionShape,
+ const btTransform& colObjWorldTransform,
+ RayResultCallback& resultCallback)
{
- if (collisionShape->isSoftBody()) {
+ if (collisionShape->isSoftBody())
+ {
btSoftBody* softBody = btSoftBody::upcast(collisionObject);
- if (softBody) {
+ if (softBody)
+ {
btSoftBody::sRayCast softResult;
- if (softBody->rayTest(rayFromTrans.getOrigin(), rayToTrans.getOrigin(), softResult))
+ if (softBody->rayTest(rayFromTrans.getOrigin(), rayToTrans.getOrigin(), softResult))
{
-
- if (softResult.fraction<= resultCallback.m_closestHitFraction)
+ 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;
+ btVector3 normal = -rayDir;
normal.normalize();
if (softResult.feature == btSoftBody::eFeature::Face)
{
normal = softBody->m_faces[softResult.index].m_normal;
- if (normal.dot(rayDir) > 0) {
+ 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);
+
+ btCollisionWorld::LocalRayResult rayResult(collisionObject,
+ &shapeInfo,
+ normal,
+ softResult.fraction);
+ bool normalInWorldSpace = true;
+ resultCallback.addSingleResult(rayResult, normalInWorldSpace);
}
}
}
- }
- else {
- btCollisionWorld::rayTestSingle(rayFromTrans,rayToTrans,collisionObject,collisionShape,colObjWorldTransform,resultCallback);
+ }
+ else
+ {
+ btCollisionWorld::rayTestSingle(rayFromTrans, rayToTrans, collisionObject, collisionShape, colObjWorldTransform, resultCallback);
}
}
-
-void btSoftMultiBodyDynamicsWorld::serializeSoftBodies(btSerializer* serializer)
+void btSoftMultiBodyDynamicsWorld::serializeSoftBodies(btSerializer* serializer)
{
int i;
//serialize all collision objects
- for (i=0;i<m_collisionObjects.size();i++)
+ for (i = 0; i < m_collisionObjects.size(); i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
if (colObj->getInternalType() & btCollisionObject::CO_SOFT_BODY)
{
int len = colObj->calculateSerializeBufferSize();
- btChunk* chunk = serializer->allocate(len,1);
+ btChunk* chunk = serializer->allocate(len, 1);
const char* structType = colObj->serialize(chunk->m_oldPtr, serializer);
- serializer->finalizeChunk(chunk,structType,BT_SOFTBODY_CODE,colObj);
+ serializer->finalizeChunk(chunk, structType, BT_SOFTBODY_CODE, colObj);
}
}
-
}
-void btSoftMultiBodyDynamicsWorld::serialize(btSerializer* serializer)
+void btSoftMultiBodyDynamicsWorld::serialize(btSerializer* serializer)
{
-
serializer->startSerialization();
- serializeDynamicsWorldInfo( serializer);
+ serializeDynamicsWorldInfo(serializer);
serializeSoftBodies(serializer);
@@ -367,5 +348,3 @@ void btSoftMultiBodyDynamicsWorld::serialize(btSerializer* serializer)
serializer->finishSerialization();
}
-
-
diff --git a/thirdparty/bullet/BulletSoftBody/btSoftMultiBodyDynamicsWorld.h b/thirdparty/bullet/BulletSoftBody/btSoftMultiBodyDynamicsWorld.h
index 6d46a21db5..f295945a6d 100644
--- a/thirdparty/bullet/BulletSoftBody/btSoftMultiBodyDynamicsWorld.h
+++ b/thirdparty/bullet/BulletSoftBody/btSoftMultiBodyDynamicsWorld.h
@@ -21,64 +21,61 @@ subject to the following restrictions:
#include "BulletSoftBody/btSoftBody.h"
#ifndef BT_SOFT_RIGID_DYNAMICS_WORLD_H
-typedef btAlignedObjectArray<btSoftBody*> btSoftBodyArray;
+typedef btAlignedObjectArray<btSoftBody*> btSoftBodyArray;
#endif
class btSoftBodySolver;
class btSoftMultiBodyDynamicsWorld : public btMultiBodyDynamicsWorld
{
-
- btSoftBodyArray m_softBodies;
- int m_drawFlags;
- bool m_drawNodeTree;
- bool m_drawFaceTree;
- bool m_drawClusterTree;
+ 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;
+ btSoftBodySolver* m_softBodySolver;
+ bool m_ownsSolver;
protected:
+ virtual void predictUnconstraintMotion(btScalar timeStep);
- virtual void predictUnconstraintMotion(btScalar timeStep);
-
- virtual void internalSingleStepSimulation( btScalar timeStep);
+ virtual void internalSingleStepSimulation(btScalar timeStep);
- void solveSoftBodiesConstraints( btScalar timeStep );
+ void solveSoftBodiesConstraints(btScalar timeStep);
- void serializeSoftBodies(btSerializer* serializer);
+ void serializeSoftBodies(btSerializer* serializer);
public:
-
- btSoftMultiBodyDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* pairCache,btMultiBodyConstraintSolver* constraintSolver, btCollisionConfiguration* collisionConfiguration, btSoftBodySolver *softBodySolver = 0 );
+ btSoftMultiBodyDynamicsWorld(btDispatcher* dispatcher, btBroadphaseInterface* pairCache, btMultiBodyConstraintSolver* constraintSolver, btCollisionConfiguration* collisionConfiguration, btSoftBodySolver* softBodySolver = 0);
virtual ~btSoftMultiBodyDynamicsWorld();
- virtual void debugDrawWorld();
+ virtual void debugDrawWorld();
- void addSoftBody(btSoftBody* body, int collisionFilterGroup=btBroadphaseProxy::DefaultFilter, int collisionFilterMask=btBroadphaseProxy::AllFilter);
+ void addSoftBody(btSoftBody* body, int collisionFilterGroup = btBroadphaseProxy::DefaultFilter, int collisionFilterMask = btBroadphaseProxy::AllFilter);
- void removeSoftBody(btSoftBody* body);
+ 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);
+ virtual void removeCollisionObject(btCollisionObject* collisionObject);
- int getDrawFlags() const { return(m_drawFlags); }
- void setDrawFlags(int f) { m_drawFlags=f; }
+ int getDrawFlags() const { return (m_drawFlags); }
+ void setDrawFlags(int f) { m_drawFlags = f; }
- btSoftBodyWorldInfo& getWorldInfo()
+ btSoftBodyWorldInfo& getWorldInfo()
{
return m_sbi;
}
- const btSoftBodyWorldInfo& getWorldInfo() const
+ const btSoftBodyWorldInfo& getWorldInfo() const
{
return m_sbi;
}
- virtual btDynamicsWorldType getWorldType() const
+ virtual btDynamicsWorldType getWorldType() const
{
- return BT_SOFT_MULTIBODY_DYNAMICS_WORLD;
+ return BT_SOFT_MULTIBODY_DYNAMICS_WORLD;
}
btSoftBodyArray& getSoftBodyArray()
@@ -91,20 +88,18 @@ public:
return m_softBodies;
}
-
- virtual void rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback) const;
+ 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);
+ 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
+#endif //BT_SOFT_MULTIBODY_DYNAMICS_WORLD_H
diff --git a/thirdparty/bullet/BulletSoftBody/btSoftRigidCollisionAlgorithm.cpp b/thirdparty/bullet/BulletSoftBody/btSoftRigidCollisionAlgorithm.cpp
index 01c148a2ca..56d8083f22 100644
--- a/thirdparty/bullet/BulletSoftBody/btSoftRigidCollisionAlgorithm.cpp
+++ b/thirdparty/bullet/BulletSoftBody/btSoftRigidCollisionAlgorithm.cpp
@@ -27,18 +27,16 @@ subject to the following restrictions:
//#include <stdio.h>
-btSoftRigidCollisionAlgorithm::btSoftRigidCollisionAlgorithm(btPersistentManifold* /*mf*/,const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* ,const btCollisionObjectWrapper* , bool isSwapped)
-: btCollisionAlgorithm(ci),
-//m_ownManifold(false),
-//m_manifoldPtr(mf),
-m_isSwapped(isSwapped)
+btSoftRigidCollisionAlgorithm::btSoftRigidCollisionAlgorithm(btPersistentManifold* /*mf*/, const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper*, const btCollisionObjectWrapper*, bool isSwapped)
+ : btCollisionAlgorithm(ci),
+ //m_ownManifold(false),
+ //m_manifoldPtr(mf),
+ m_isSwapped(isSwapped)
{
}
-
btSoftRigidCollisionAlgorithm::~btSoftRigidCollisionAlgorithm()
{
-
//m_softBody->m_overlappingRigidBodies.remove(m_rigidCollisionObject);
/*if (m_ownManifold)
@@ -47,31 +45,27 @@ btSoftRigidCollisionAlgorithm::~btSoftRigidCollisionAlgorithm()
m_dispatcher->releaseManifold(m_manifoldPtr);
}
*/
-
}
-
#include <stdio.h>
-void btSoftRigidCollisionAlgorithm::processCollision (const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+void btSoftRigidCollisionAlgorithm::processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
(void)dispatchInfo;
(void)resultOut;
//printf("btSoftRigidCollisionAlgorithm\n");
-// const btCollisionObjectWrapper* softWrap = m_isSwapped?body1Wrap:body0Wrap;
-// const btCollisionObjectWrapper* rigidWrap = m_isSwapped?body0Wrap:body1Wrap;
- btSoftBody* softBody = m_isSwapped? (btSoftBody*)body1Wrap->getCollisionObject() : (btSoftBody*)body0Wrap->getCollisionObject();
- const btCollisionObjectWrapper* rigidCollisionObjectWrap = m_isSwapped? body0Wrap : body1Wrap;
-
- if (softBody->m_collisionDisabledObjects.findLinearSearch(rigidCollisionObjectWrap->getCollisionObject())==softBody->m_collisionDisabledObjects.size())
+ // const btCollisionObjectWrapper* softWrap = m_isSwapped?body1Wrap:body0Wrap;
+ // const btCollisionObjectWrapper* rigidWrap = m_isSwapped?body0Wrap:body1Wrap;
+ btSoftBody* softBody = m_isSwapped ? (btSoftBody*)body1Wrap->getCollisionObject() : (btSoftBody*)body0Wrap->getCollisionObject();
+ const btCollisionObjectWrapper* rigidCollisionObjectWrap = m_isSwapped ? body0Wrap : body1Wrap;
+
+ if (softBody->m_collisionDisabledObjects.findLinearSearch(rigidCollisionObjectWrap->getCollisionObject()) == softBody->m_collisionDisabledObjects.size())
{
softBody->getSoftBodySolver()->processCollision(softBody, rigidCollisionObjectWrap);
}
-
-
}
-btScalar btSoftRigidCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* col0,btCollisionObject* col1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+btScalar btSoftRigidCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* col0, btCollisionObject* col1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut)
{
(void)resultOut;
(void)dispatchInfo;
@@ -81,6 +75,3 @@ btScalar btSoftRigidCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject*
//not yet
return btScalar(1.);
}
-
-
-
diff --git a/thirdparty/bullet/BulletSoftBody/btSoftRigidCollisionAlgorithm.h b/thirdparty/bullet/BulletSoftBody/btSoftRigidCollisionAlgorithm.h
index 93fcc6065b..9773af19a0 100644
--- a/thirdparty/bullet/BulletSoftBody/btSoftRigidCollisionAlgorithm.h
+++ b/thirdparty/bullet/BulletSoftBody/btSoftRigidCollisionAlgorithm.h
@@ -35,41 +35,37 @@ class btSoftRigidCollisionAlgorithm : public btCollisionAlgorithm
//btCollisionObject* m_rigidCollisionObject;
///for rigid versus soft (instead of soft versus rigid), we use this swapped boolean
- bool m_isSwapped;
+ bool m_isSwapped;
public:
-
- btSoftRigidCollisionAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* col0,const btCollisionObjectWrapper* col1Wrap, bool isSwapped);
+ 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 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 btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut);
- virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
+ virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
{
//we don't add any manifolds
}
-
- struct CreateFunc :public btCollisionAlgorithmCreateFunc
+ struct CreateFunc : public btCollisionAlgorithmCreateFunc
{
- virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap)
+ 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, false);
+ }
+ else
{
- return new(mem) btSoftRigidCollisionAlgorithm(0,ci,body0Wrap,body1Wrap,true);
+ return new (mem) btSoftRigidCollisionAlgorithm(0, ci, body0Wrap, body1Wrap, true);
}
}
};
-
};
-#endif //BT_SOFT_RIGID_COLLISION_ALGORITHM_H
-
-
+#endif //BT_SOFT_RIGID_COLLISION_ALGORITHM_H
diff --git a/thirdparty/bullet/BulletSoftBody/btSoftRigidDynamicsWorld.cpp b/thirdparty/bullet/BulletSoftBody/btSoftRigidDynamicsWorld.cpp
index 204b4f576d..510b731fc1 100644
--- a/thirdparty/bullet/BulletSoftBody/btSoftRigidDynamicsWorld.cpp
+++ b/thirdparty/bullet/BulletSoftBody/btSoftRigidDynamicsWorld.cpp
@@ -13,7 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btSoftRigidDynamicsWorld.h"
#include "LinearMath/btQuickprof.h"
@@ -24,42 +23,38 @@ subject to the following restrictions:
#include "btDefaultSoftBodySolver.h"
#include "LinearMath/btSerializer.h"
-
btSoftRigidDynamicsWorld::btSoftRigidDynamicsWorld(
btDispatcher* dispatcher,
btBroadphaseInterface* pairCache,
btConstraintSolver* constraintSolver,
btCollisionConfiguration* collisionConfiguration,
- btSoftBodySolver *softBodySolver ) :
- btDiscreteDynamicsWorld(dispatcher,pairCache,constraintSolver,collisionConfiguration),
- m_softBodySolver( softBodySolver ),
- m_ownsSolver(false)
+ btSoftBodySolver* softBodySolver) : btDiscreteDynamicsWorld(dispatcher, pairCache, constraintSolver, collisionConfiguration),
+ m_softBodySolver(softBodySolver),
+ m_ownsSolver(false)
{
- if( !m_softBodySolver )
+ if (!m_softBodySolver)
{
- void* ptr = btAlignedAlloc(sizeof(btDefaultSoftBodySolver),16);
- m_softBodySolver = new(ptr) btDefaultSoftBodySolver();
+ void* ptr = btAlignedAlloc(sizeof(btDefaultSoftBodySolver), 16);
+ m_softBodySolver = new (ptr) btDefaultSoftBodySolver();
m_ownsSolver = true;
}
- m_drawFlags = fDrawFlags::Std;
- m_drawNodeTree = true;
- m_drawFaceTree = false;
- m_drawClusterTree = false;
+ m_drawFlags = fDrawFlags::Std;
+ m_drawNodeTree = true;
+ m_drawFaceTree = false;
+ m_drawClusterTree = false;
m_sbi.m_broadphase = pairCache;
m_sbi.m_dispatcher = dispatcher;
m_sbi.m_sparsesdf.Initialize();
m_sbi.m_sparsesdf.Reset();
- m_sbi.air_density = (btScalar)1.2;
- m_sbi.water_density = 0;
- m_sbi.water_offset = 0;
- m_sbi.water_normal = btVector3(0,0,0);
- m_sbi.m_gravity.setValue(0,-10,0);
+ m_sbi.air_density = (btScalar)1.2;
+ m_sbi.water_density = 0;
+ m_sbi.water_offset = 0;
+ m_sbi.water_normal = btVector3(0, 0, 0);
+ m_sbi.m_gravity.setValue(0, -10, 0);
m_sbi.m_sparsesdf.Initialize();
-
-
}
btSoftRigidDynamicsWorld::~btSoftRigidDynamicsWorld()
@@ -71,82 +66,78 @@ btSoftRigidDynamicsWorld::~btSoftRigidDynamicsWorld()
}
}
-void btSoftRigidDynamicsWorld::predictUnconstraintMotion(btScalar timeStep)
+void btSoftRigidDynamicsWorld::predictUnconstraintMotion(btScalar timeStep)
{
- btDiscreteDynamicsWorld::predictUnconstraintMotion( timeStep );
+ btDiscreteDynamicsWorld::predictUnconstraintMotion(timeStep);
{
BT_PROFILE("predictUnconstraintMotionSoftBody");
- m_softBodySolver->predictMotion( float(timeStep) );
+ m_softBodySolver->predictMotion(float(timeStep));
}
}
-void btSoftRigidDynamicsWorld::internalSingleStepSimulation( btScalar timeStep )
+void btSoftRigidDynamicsWorld::internalSingleStepSimulation(btScalar timeStep)
{
-
// Let the solver grab the soft bodies and if necessary optimize for it
- m_softBodySolver->optimize( getSoftBodyArray() );
+ m_softBodySolver->optimize(getSoftBodyArray());
- if( !m_softBodySolver->checkInitialized() )
+ if (!m_softBodySolver->checkInitialized())
{
- btAssert( "Solver initialization failed\n" );
+ btAssert("Solver initialization failed\n");
}
- btDiscreteDynamicsWorld::internalSingleStepSimulation( timeStep );
+ btDiscreteDynamicsWorld::internalSingleStepSimulation(timeStep);
///solve soft bodies constraints
- solveSoftBodiesConstraints( timeStep );
+ solveSoftBodiesConstraints(timeStep);
//self collisions
- for ( int i=0;i<m_softBodies.size();i++)
+ for (int i = 0; i < m_softBodies.size(); i++)
{
- btSoftBody* psb=(btSoftBody*)m_softBodies[i];
+ btSoftBody* psb = (btSoftBody*)m_softBodies[i];
psb->defaultCollisionHandler(psb);
}
///update soft bodies
- m_softBodySolver->updateSoftBodies( );
-
+ m_softBodySolver->updateSoftBodies();
+
// End solver-wise simulation step
// ///////////////////////////////
-
}
-void btSoftRigidDynamicsWorld::solveSoftBodiesConstraints( btScalar timeStep )
+void btSoftRigidDynamicsWorld::solveSoftBodiesConstraints(btScalar timeStep)
{
BT_PROFILE("solveSoftConstraints");
- if(m_softBodies.size())
+ if (m_softBodies.size())
{
btSoftBody::solveClusters(m_softBodies);
}
// Solve constraints solver-wise
- m_softBodySolver->solveConstraints( timeStep * m_softBodySolver->getTimeScale() );
-
+ m_softBodySolver->solveConstraints(timeStep * m_softBodySolver->getTimeScale());
}
-void btSoftRigidDynamicsWorld::addSoftBody(btSoftBody* body, int collisionFilterGroup, int collisionFilterMask)
+void btSoftRigidDynamicsWorld::addSoftBody(btSoftBody* body, int collisionFilterGroup, int collisionFilterMask)
{
m_softBodies.push_back(body);
// Set the soft body solver that will deal with this body
// to be the world's solver
- body->setSoftBodySolver( m_softBodySolver );
+ body->setSoftBodySolver(m_softBodySolver);
btCollisionWorld::addCollisionObject(body,
- collisionFilterGroup,
- collisionFilterMask);
-
+ collisionFilterGroup,
+ collisionFilterMask);
}
-void btSoftRigidDynamicsWorld::removeSoftBody(btSoftBody* body)
+void btSoftRigidDynamicsWorld::removeSoftBody(btSoftBody* body)
{
m_softBodies.remove(body);
btCollisionWorld::removeCollisionObject(body);
}
-void btSoftRigidDynamicsWorld::removeCollisionObject(btCollisionObject* collisionObject)
+void btSoftRigidDynamicsWorld::removeCollisionObject(btCollisionObject* collisionObject)
{
btSoftBody* body = btSoftBody::upcast(collisionObject);
if (body)
@@ -155,60 +146,57 @@ void btSoftRigidDynamicsWorld::removeCollisionObject(btCollisionObject* collisio
btDiscreteDynamicsWorld::removeCollisionObject(collisionObject);
}
-void btSoftRigidDynamicsWorld::debugDrawWorld()
+void btSoftRigidDynamicsWorld::debugDrawWorld()
{
btDiscreteDynamicsWorld::debugDrawWorld();
if (getDebugDrawer())
{
int i;
- for ( i=0;i<this->m_softBodies.size();i++)
+ for (i = 0; i < this->m_softBodies.size(); i++)
{
- btSoftBody* psb=(btSoftBody*)this->m_softBodies[i];
+ btSoftBody* psb = (btSoftBody*)this->m_softBodies[i];
if (getDebugDrawer() && (getDebugDrawer()->getDebugMode() & (btIDebugDraw::DBG_DrawWireframe)))
{
- btSoftBodyHelpers::DrawFrame(psb,m_debugDrawer);
- btSoftBodyHelpers::Draw(psb,m_debugDrawer,m_drawFlags);
+ btSoftBodyHelpers::DrawFrame(psb, m_debugDrawer);
+ btSoftBodyHelpers::Draw(psb, m_debugDrawer, m_drawFlags);
}
-
+
if (m_debugDrawer && (m_debugDrawer->getDebugMode() & btIDebugDraw::DBG_DrawAabb))
{
- if(m_drawNodeTree) btSoftBodyHelpers::DrawNodeTree(psb,m_debugDrawer);
- if(m_drawFaceTree) btSoftBodyHelpers::DrawFaceTree(psb,m_debugDrawer);
- if(m_drawClusterTree) btSoftBodyHelpers::DrawClusterTree(psb,m_debugDrawer);
+ if (m_drawNodeTree) btSoftBodyHelpers::DrawNodeTree(psb, m_debugDrawer);
+ if (m_drawFaceTree) btSoftBodyHelpers::DrawFaceTree(psb, m_debugDrawer);
+ if (m_drawClusterTree) btSoftBodyHelpers::DrawClusterTree(psb, m_debugDrawer);
}
- }
- }
+ }
+ }
}
-
-
-
struct btSoftSingleRayCallback : public btBroadphaseRayCallback
{
- btVector3 m_rayFromWorld;
- btVector3 m_rayToWorld;
- btTransform m_rayFromTrans;
- btTransform m_rayToTrans;
- btVector3 m_hitNormal;
-
- const btSoftRigidDynamicsWorld* m_world;
- btCollisionWorld::RayResultCallback& m_resultCallback;
-
- btSoftSingleRayCallback(const btVector3& rayFromWorld,const btVector3& rayToWorld,const btSoftRigidDynamicsWorld* world,btCollisionWorld::RayResultCallback& resultCallback)
- :m_rayFromWorld(rayFromWorld),
- m_rayToWorld(rayToWorld),
- m_world(world),
- m_resultCallback(resultCallback)
+ btVector3 m_rayFromWorld;
+ btVector3 m_rayToWorld;
+ btTransform m_rayFromTrans;
+ btTransform m_rayToTrans;
+ btVector3 m_hitNormal;
+
+ const btSoftRigidDynamicsWorld* m_world;
+ btCollisionWorld::RayResultCallback& m_resultCallback;
+
+ btSoftSingleRayCallback(const btVector3& rayFromWorld, const btVector3& rayToWorld, const btSoftRigidDynamicsWorld* 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);
+ btVector3 rayDir = (rayToWorld - rayFromWorld);
- rayDir.normalize ();
+ 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];
@@ -217,22 +205,19 @@ struct btSoftSingleRayCallback : public btBroadphaseRayCallback
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);
-
+ m_lambda_max = rayDir.dot(m_rayToWorld - m_rayFromWorld);
}
-
-
- virtual bool process(const btBroadphaseProxy* proxy)
+ 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;
+ btCollisionObject* collisionObject = (btCollisionObject*)proxy->m_clientObject;
//only perform raycast if filterMask matches
- if(m_resultCallback.needsCollision(collisionObject->getBroadphaseHandle()))
+ if (m_resultCallback.needsCollision(collisionObject->getBroadphaseHandle()))
{
//RigidcollisionObject* collisionObject = ctrl->GetRigidcollisionObject();
//btVector3 collisionObjectAabbMin,collisionObjectAabbMax;
@@ -250,110 +235,106 @@ struct btSoftSingleRayCallback : public btBroadphaseRayCallback
//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);
+ m_world->rayTestSingle(m_rayFromTrans, m_rayToTrans,
+ collisionObject,
+ collisionObject->getCollisionShape(),
+ collisionObject->getWorldTransform(),
+ m_resultCallback);
}
}
return true;
}
};
-void btSoftRigidDynamicsWorld::rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback) const
+void btSoftRigidDynamicsWorld::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
- btSoftSingleRayCallback rayCB(rayFromWorld,rayToWorld,this,resultCallback);
+ btSoftSingleRayCallback rayCB(rayFromWorld, rayToWorld, this, resultCallback);
#ifndef USE_BRUTEFORCE_RAYBROADPHASE
- m_broadphasePairCache->rayTest(rayFromWorld,rayToWorld,rayCB);
+ m_broadphasePairCache->rayTest(rayFromWorld, rayToWorld, rayCB);
#else
- for (int i=0;i<this->getNumCollisionObjects();i++)
+ for (int i = 0; i < this->getNumCollisionObjects(); i++)
{
rayCB.process(m_collisionObjects[i]->getBroadphaseHandle());
- }
-#endif //USE_BRUTEFORCE_RAYBROADPHASE
-
+ }
+#endif //USE_BRUTEFORCE_RAYBROADPHASE
}
-
-void btSoftRigidDynamicsWorld::rayTestSingle(const btTransform& rayFromTrans,const btTransform& rayToTrans,
- btCollisionObject* collisionObject,
- const btCollisionShape* collisionShape,
- const btTransform& colObjWorldTransform,
- RayResultCallback& resultCallback)
+void btSoftRigidDynamicsWorld::rayTestSingle(const btTransform& rayFromTrans, const btTransform& rayToTrans,
+ btCollisionObject* collisionObject,
+ const btCollisionShape* collisionShape,
+ const btTransform& colObjWorldTransform,
+ RayResultCallback& resultCallback)
{
- if (collisionShape->isSoftBody()) {
+ if (collisionShape->isSoftBody())
+ {
btSoftBody* softBody = btSoftBody::upcast(collisionObject);
- if (softBody) {
+ if (softBody)
+ {
btSoftBody::sRayCast softResult;
- if (softBody->rayTest(rayFromTrans.getOrigin(), rayToTrans.getOrigin(), softResult))
+ if (softBody->rayTest(rayFromTrans.getOrigin(), rayToTrans.getOrigin(), softResult))
{
-
- if (softResult.fraction<= resultCallback.m_closestHitFraction)
+ 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;
+ btVector3 normal = -rayDir;
normal.normalize();
if (softResult.feature == btSoftBody::eFeature::Face)
{
normal = softBody->m_faces[softResult.index].m_normal;
- if (normal.dot(rayDir) > 0) {
+ 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);
+
+ btCollisionWorld::LocalRayResult rayResult(collisionObject,
+ &shapeInfo,
+ normal,
+ softResult.fraction);
+ bool normalInWorldSpace = true;
+ resultCallback.addSingleResult(rayResult, normalInWorldSpace);
}
}
}
- }
- else {
- btCollisionWorld::rayTestSingle(rayFromTrans,rayToTrans,collisionObject,collisionShape,colObjWorldTransform,resultCallback);
+ }
+ else
+ {
+ btCollisionWorld::rayTestSingle(rayFromTrans, rayToTrans, collisionObject, collisionShape, colObjWorldTransform, resultCallback);
}
}
-
-void btSoftRigidDynamicsWorld::serializeSoftBodies(btSerializer* serializer)
+void btSoftRigidDynamicsWorld::serializeSoftBodies(btSerializer* serializer)
{
int i;
//serialize all collision objects
- for (i=0;i<m_collisionObjects.size();i++)
+ for (i = 0; i < m_collisionObjects.size(); i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
if (colObj->getInternalType() & btCollisionObject::CO_SOFT_BODY)
{
int len = colObj->calculateSerializeBufferSize();
- btChunk* chunk = serializer->allocate(len,1);
+ btChunk* chunk = serializer->allocate(len, 1);
const char* structType = colObj->serialize(chunk->m_oldPtr, serializer);
- serializer->finalizeChunk(chunk,structType,BT_SOFTBODY_CODE,colObj);
+ serializer->finalizeChunk(chunk, structType, BT_SOFTBODY_CODE, colObj);
}
}
-
}
-void btSoftRigidDynamicsWorld::serialize(btSerializer* serializer)
+void btSoftRigidDynamicsWorld::serialize(btSerializer* serializer)
{
-
serializer->startSerialization();
- serializeDynamicsWorldInfo( serializer);
+ serializeDynamicsWorldInfo(serializer);
serializeSoftBodies(serializer);
@@ -363,5 +344,3 @@ void btSoftRigidDynamicsWorld::serialize(btSerializer* serializer)
serializer->finishSerialization();
}
-
-
diff --git a/thirdparty/bullet/BulletSoftBody/btSoftRigidDynamicsWorld.h b/thirdparty/bullet/BulletSoftBody/btSoftRigidDynamicsWorld.h
index d921a6488d..be49c444d7 100644
--- a/thirdparty/bullet/BulletSoftBody/btSoftRigidDynamicsWorld.h
+++ b/thirdparty/bullet/BulletSoftBody/btSoftRigidDynamicsWorld.h
@@ -19,63 +19,60 @@ subject to the following restrictions:
#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h"
#include "btSoftBody.h"
-typedef btAlignedObjectArray<btSoftBody*> btSoftBodyArray;
+typedef btAlignedObjectArray<btSoftBody*> btSoftBodyArray;
class btSoftBodySolver;
class btSoftRigidDynamicsWorld : public btDiscreteDynamicsWorld
{
-
- btSoftBodyArray m_softBodies;
- int m_drawFlags;
- bool m_drawNodeTree;
- bool m_drawFaceTree;
- bool m_drawClusterTree;
+ 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;
+ btSoftBodySolver* m_softBodySolver;
+ bool m_ownsSolver;
protected:
+ virtual void predictUnconstraintMotion(btScalar timeStep);
- virtual void predictUnconstraintMotion(btScalar timeStep);
-
- virtual void internalSingleStepSimulation( btScalar timeStep);
+ virtual void internalSingleStepSimulation(btScalar timeStep);
- void solveSoftBodiesConstraints( btScalar timeStep );
+ void solveSoftBodiesConstraints(btScalar timeStep);
- void serializeSoftBodies(btSerializer* serializer);
+ void serializeSoftBodies(btSerializer* serializer);
public:
-
- btSoftRigidDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* pairCache,btConstraintSolver* constraintSolver, btCollisionConfiguration* collisionConfiguration, btSoftBodySolver *softBodySolver = 0 );
+ btSoftRigidDynamicsWorld(btDispatcher* dispatcher, btBroadphaseInterface* pairCache, btConstraintSolver* constraintSolver, btCollisionConfiguration* collisionConfiguration, btSoftBodySolver* softBodySolver = 0);
virtual ~btSoftRigidDynamicsWorld();
- virtual void debugDrawWorld();
+ virtual void debugDrawWorld();
- void addSoftBody(btSoftBody* body, int collisionFilterGroup=btBroadphaseProxy::DefaultFilter, int collisionFilterMask=btBroadphaseProxy::AllFilter);
+ void addSoftBody(btSoftBody* body, int collisionFilterGroup = btBroadphaseProxy::DefaultFilter, int collisionFilterMask = btBroadphaseProxy::AllFilter);
- void removeSoftBody(btSoftBody* body);
+ 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);
+ virtual void removeCollisionObject(btCollisionObject* collisionObject);
- int getDrawFlags() const { return(m_drawFlags); }
- void setDrawFlags(int f) { m_drawFlags=f; }
+ int getDrawFlags() const { return (m_drawFlags); }
+ void setDrawFlags(int f) { m_drawFlags = f; }
- btSoftBodyWorldInfo& getWorldInfo()
+ btSoftBodyWorldInfo& getWorldInfo()
{
return m_sbi;
}
- const btSoftBodyWorldInfo& getWorldInfo() const
+ const btSoftBodyWorldInfo& getWorldInfo() const
{
return m_sbi;
}
- virtual btDynamicsWorldType getWorldType() const
+ virtual btDynamicsWorldType getWorldType() const
{
- return BT_SOFT_RIGID_DYNAMICS_WORLD;
+ return BT_SOFT_RIGID_DYNAMICS_WORLD;
}
btSoftBodyArray& getSoftBodyArray()
@@ -88,20 +85,18 @@ public:
return m_softBodies;
}
-
- virtual void rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback) const;
+ 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);
+ 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
+#endif //BT_SOFT_RIGID_DYNAMICS_WORLD_H
diff --git a/thirdparty/bullet/BulletSoftBody/btSoftSoftCollisionAlgorithm.cpp b/thirdparty/bullet/BulletSoftBody/btSoftSoftCollisionAlgorithm.cpp
index 72043e69e2..9c3e904f64 100644
--- a/thirdparty/bullet/BulletSoftBody/btSoftSoftCollisionAlgorithm.cpp
+++ b/thirdparty/bullet/BulletSoftBody/btSoftSoftCollisionAlgorithm.cpp
@@ -23,8 +23,8 @@ subject to the following restrictions:
#define USE_PERSISTENT_CONTACTS 1
-btSoftSoftCollisionAlgorithm::btSoftSoftCollisionAlgorithm(btPersistentManifold* /*mf*/,const btCollisionAlgorithmConstructionInfo& ci,const btCollisionObjectWrapper* /*obj0*/,const btCollisionObjectWrapper* /*obj1*/)
-: btCollisionAlgorithm(ci)
+btSoftSoftCollisionAlgorithm::btSoftSoftCollisionAlgorithm(btPersistentManifold* /*mf*/, const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* /*obj0*/, const btCollisionObjectWrapper* /*obj1*/)
+ : btCollisionAlgorithm(ci)
//m_ownManifold(false),
//m_manifoldPtr(mf)
{
@@ -34,14 +34,14 @@ btSoftSoftCollisionAlgorithm::~btSoftSoftCollisionAlgorithm()
{
}
-void btSoftSoftCollisionAlgorithm::processCollision (const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap,const btDispatcherInfo& /*dispatchInfo*/,btManifoldResult* /*resultOut*/)
+void btSoftSoftCollisionAlgorithm::processCollision(const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap, const btDispatcherInfo& /*dispatchInfo*/, btManifoldResult* /*resultOut*/)
{
- btSoftBody* soft0 = (btSoftBody*)body0Wrap->getCollisionObject();
- btSoftBody* soft1 = (btSoftBody*)body1Wrap->getCollisionObject();
+ btSoftBody* soft0 = (btSoftBody*)body0Wrap->getCollisionObject();
+ btSoftBody* soft1 = (btSoftBody*)body1Wrap->getCollisionObject();
soft0->getSoftBodySolver()->processCollision(soft0, soft1);
}
-btScalar btSoftSoftCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* /*body0*/,btCollisionObject* /*body1*/,const btDispatcherInfo& /*dispatchInfo*/,btManifoldResult* /*resultOut*/)
+btScalar btSoftSoftCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* /*body0*/, btCollisionObject* /*body1*/, const btDispatcherInfo& /*dispatchInfo*/, btManifoldResult* /*resultOut*/)
{
//not yet
return 1.f;
diff --git a/thirdparty/bullet/BulletSoftBody/btSoftSoftCollisionAlgorithm.h b/thirdparty/bullet/BulletSoftBody/btSoftSoftCollisionAlgorithm.h
index 4eab7aea2f..6f871f5b85 100644
--- a/thirdparty/bullet/BulletSoftBody/btSoftSoftCollisionAlgorithm.h
+++ b/thirdparty/bullet/BulletSoftBody/btSoftSoftCollisionAlgorithm.h
@@ -27,43 +27,39 @@ class btSoftBody;
///collision detection between two btSoftBody shapes
class btSoftSoftCollisionAlgorithm : public btCollisionAlgorithm
{
- bool m_ownManifold;
- btPersistentManifold* m_manifoldPtr;
-
-// btSoftBody* m_softBody0;
-// btSoftBody* m_softBody1;
+ 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 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 btScalar calculateTimeOfImpact(btCollisionObject* body0, btCollisionObject* body1, const btDispatcherInfo& dispatchInfo, btManifoldResult* resultOut);
- virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
+ 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);
+ btSoftSoftCollisionAlgorithm(btPersistentManifold* mf, const btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap, const btCollisionObjectWrapper* body1Wrap);
virtual ~btSoftSoftCollisionAlgorithm();
- struct CreateFunc :public btCollisionAlgorithmCreateFunc
+ struct CreateFunc : public btCollisionAlgorithmCreateFunc
{
- virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, const btCollisionObjectWrapper* body0Wrap,const btCollisionObjectWrapper* body1Wrap)
+ 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);
+ return new (ptr) btSoftSoftCollisionAlgorithm(0, ci, body0Wrap, body1Wrap);
}
};
-
};
-#endif //BT_SOFT_SOFT_COLLISION_ALGORITHM_H
-
-
+#endif //BT_SOFT_SOFT_COLLISION_ALGORITHM_H
diff --git a/thirdparty/bullet/BulletSoftBody/btSparseSDF.h b/thirdparty/bullet/BulletSoftBody/btSparseSDF.h
index ba437c28ef..a52b2cb1cc 100644
--- a/thirdparty/bullet/BulletSoftBody/btSparseSDF.h
+++ b/thirdparty/bullet/BulletSoftBody/btSparseSDF.h
@@ -24,296 +24,320 @@ subject to the following restrictions:
template <const int DWORDLEN>
unsigned int HsiehHash(const void* pdata)
{
- const unsigned short* data=(const unsigned short*)pdata;
- unsigned hash=DWORDLEN<<2,tmp;
- for(int i=0;i<DWORDLEN;++i)
+ const unsigned short* data = (const unsigned short*)pdata;
+ unsigned hash = DWORDLEN << 2, tmp;
+ for (int i = 0; i < DWORDLEN; ++i)
{
- hash += data[0];
- tmp = (data[1]<<11)^hash;
- hash = (hash<<16)^tmp;
- data += 2;
- hash += hash>>11;
+ hash += data[0];
+ tmp = (data[1] << 11) ^ hash;
+ hash = (hash << 16) ^ tmp;
+ data += 2;
+ hash += hash >> 11;
}
- hash^=hash<<3;hash+=hash>>5;
- hash^=hash<<4;hash+=hash>>17;
- hash^=hash<<25;hash+=hash>>6;
- return(hash);
+ hash ^= hash << 3;
+ hash += hash >> 5;
+ hash ^= hash << 4;
+ hash += hash >> 17;
+ hash ^= hash << 25;
+ hash += hash >> 6;
+ return (hash);
}
template <const int CELLSIZE>
-struct btSparseSdf
+struct btSparseSdf
{
//
// Inner types
//
struct IntFrac
{
- int b;
- int i;
- btScalar f;
+ int b;
+ int i;
+ btScalar f;
};
- struct Cell
+ struct Cell
{
- btScalar d[CELLSIZE+1][CELLSIZE+1][CELLSIZE+1];
- int c[3];
- int puid;
- unsigned hash;
- const btCollisionShape* pclient;
- Cell* next;
+ btScalar d[CELLSIZE + 1][CELLSIZE + 1][CELLSIZE + 1];
+ int c[3];
+ int puid;
+ unsigned hash;
+ const btCollisionShape* pclient;
+ Cell* next;
};
//
// Fields
//
- btAlignedObjectArray<Cell*> cells;
- btScalar voxelsz;
- int puid;
- int ncells;
- int m_clampCells;
- int nprobes;
- int nqueries;
+ btAlignedObjectArray<Cell*> cells;
+ btScalar voxelsz;
+ int puid;
+ int ncells;
+ int m_clampCells;
+ int nprobes;
+ int nqueries;
//
// Methods
//
//
- void Initialize(int hashsize=2383, int clampCells = 256*1024)
+ 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);
+ cells.resize(hashsize, 0);
Reset();
}
//
- void Reset()
+ void Reset()
{
- for(int i=0,ni=cells.size();i<ni;++i)
+ for (int i = 0, ni = cells.size(); i < ni; ++i)
{
- Cell* pc=cells[i];
- cells[i]=0;
- while(pc)
+ Cell* pc = cells[i];
+ cells[i] = 0;
+ while (pc)
{
- Cell* pn=pc->next;
+ Cell* pn = pc->next;
delete pc;
- pc=pn;
+ pc = pn;
}
}
- voxelsz =0.25;
- puid =0;
- ncells =0;
- nprobes =1;
- nqueries =1;
+ voxelsz = 0.25;
+ puid = 0;
+ ncells = 0;
+ nprobes = 1;
+ nqueries = 1;
}
//
- void GarbageCollect(int lifetime=256)
+ void GarbageCollect(int lifetime = 256)
{
- const int life=puid-lifetime;
- for(int i=0;i<cells.size();++i)
+ 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*& root = cells[i];
+ Cell* pp = 0;
+ Cell* pc = root;
+ while (pc)
{
- Cell* pn=pc->next;
- if(pc->puid<life)
+ Cell* pn = pc->next;
+ if (pc->puid < life)
{
- if(pp) pp->next=pn; else root=pn;
- delete pc;pc=pp;--ncells;
+ if (pp)
+ pp->next = pn;
+ else
+ root = pn;
+ delete pc;
+ pc = pp;
+ --ncells;
}
- pp=pc;pc=pn;
+ 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... */
+ 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 RemoveReferences(btCollisionShape* pcs)
{
- int refcount=0;
- for(int i=0;i<cells.size();++i)
+ int refcount = 0;
+ for (int i = 0; i < cells.size(); ++i)
{
- Cell*& root=cells[i];
- Cell* pp=0;
- Cell* pc=root;
- while(pc)
+ Cell*& root = cells[i];
+ Cell* pp = 0;
+ Cell* pc = root;
+ while (pc)
{
- Cell* pn=pc->next;
- if(pc->pclient==pcs)
+ Cell* pn = pc->next;
+ if (pc->pclient == pcs)
{
- if(pp) pp->next=pn; else root=pn;
- delete pc;pc=pp;++refcount;
+ if (pp)
+ pp->next = pn;
+ else
+ root = pn;
+ delete pc;
+ pc = pp;
+ ++refcount;
}
- pp=pc;pc=pn;
+ pp = pc;
+ pc = pn;
}
}
- return(refcount);
+ return (refcount);
}
//
- btScalar Evaluate( const btVector3& x,
- const btCollisionShape* shape,
- btVector3& normal,
- btScalar margin)
+ 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<int>(h%cells.size())];
- Cell* c=root;
+ /* 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<int>(h % cells.size())];
+ Cell* c = root;
++nqueries;
- while(c)
+ 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; }
+ if ((c->hash == h) &&
+ (c->c[0] == ix.b) &&
+ (c->c[1] == iy.b) &&
+ (c->c[2] == iz.b) &&
+ (c->pclient == shape))
+ {
+ break;
+ }
else
- { c=c->next; }
+ {
+ c = c->next;
+ }
}
- if(!c)
+ if (!c)
{
- ++nprobes;
+ ++nprobes;
++ncells;
//int sz = sizeof(Cell);
- if (ncells>m_clampCells)
+ if (ncells > m_clampCells)
{
- static int numResets=0;
+ static int numResets = 0;
numResets++;
-// printf("numResets=%d\n",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;
+ 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 */
+ 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 = normal.normalized();
+ 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 = normal.normalized();
#else
- normal = btVector3(d[1]-d[0],d[3]-d[0],d[4]-d[0]).normalized();
+ 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);
+ /* 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)
+ 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 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 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 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);
+ 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)
+ static inline btScalar DistanceToShape(const btVector3& x,
+ const btCollisionShape* shape)
{
- btTransform unit;
+ btTransform unit;
unit.setIdentity();
- if(shape->isConvex())
+ if (shape->isConvex())
{
- btGjkEpaSolver2::sResults res;
- const btConvexShape* csh=static_cast<const btConvexShape*>(shape);
- return(btGjkEpaSolver2::SignedDistance(x,0,csh,unit,res));
+ btGjkEpaSolver2::sResults res;
+ const btConvexShape* csh = static_cast<const btConvexShape*>(shape);
+ return (btGjkEpaSolver2::SignedDistance(x, 0, csh, unit, res));
}
- return(0);
+ return (0);
}
//
- static inline IntFrac Decompose(btScalar x)
+ 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);
+ /* 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)
+ static inline btScalar Lerp(btScalar a, btScalar b, btScalar t)
{
- return(a+(b-a)*t);
+ return (a + (b - a) * t);
}
-
-
//
- static inline unsigned int Hash(int x,int y,int z,const btCollisionShape* shape)
+ static inline unsigned int Hash(int x, int y, int z, const btCollisionShape* shape)
{
struct btS
- {
- int x,y,z;
+ {
+ int x, y, z;
void* p;
};
btS myset;
- myset.x=x;myset.y=y;myset.z=z;myset.p=(void*)shape;
+ myset.x = x;
+ myset.y = y;
+ myset.z = z;
+ myset.p = (void*)shape;
const void* ptr = &myset;
- unsigned int result = HsiehHash<sizeof(btS)/4> (ptr);
-
+ unsigned int result = HsiehHash<sizeof(btS) / 4>(ptr);
return result;
}
};
-
-#endif //BT_SPARSE_SDF_H
+#endif //BT_SPARSE_SDF_H
diff --git a/thirdparty/bullet/LinearMath/TaskScheduler/btTaskScheduler.cpp b/thirdparty/bullet/LinearMath/TaskScheduler/btTaskScheduler.cpp
index 49510d1660..5f1115c402 100644
--- a/thirdparty/bullet/LinearMath/TaskScheduler/btTaskScheduler.cpp
+++ b/thirdparty/bullet/LinearMath/TaskScheduler/btTaskScheduler.cpp
@@ -6,13 +6,11 @@
#include <stdio.h>
#include <algorithm>
-
-
#if BT_THREADSAFE
#include "btThreadSupportInterface.h"
-#if defined( _WIN32 )
+#if defined(_WIN32)
#define WIN32_LEAN_AND_MEAN
@@ -20,404 +18,399 @@
#endif
-
typedef unsigned long long btU64;
static const int kCacheLineSize = 64;
void btSpinPause()
{
-#if defined( _WIN32 )
- YieldProcessor();
+#if defined(_WIN32)
+ YieldProcessor();
#endif
}
-
struct WorkerThreadStatus
{
- enum Type
- {
- kInvalid,
- kWaitingForWork,
- kWorking,
- kSleeping,
- };
+ enum Type
+ {
+ kInvalid,
+ kWaitingForWork,
+ kWorking,
+ kSleeping,
+ };
};
-
-ATTRIBUTE_ALIGNED64(class) WorkerThreadDirectives
+ATTRIBUTE_ALIGNED64(class)
+WorkerThreadDirectives
{
- static const int kMaxThreadCount = BT_MAX_THREAD_COUNT;
- // directives for all worker threads packed into a single cacheline
- char m_threadDirs[kMaxThreadCount];
+ static const int kMaxThreadCount = BT_MAX_THREAD_COUNT;
+ // directives for all worker threads packed into a single cacheline
+ char m_threadDirs[kMaxThreadCount];
public:
- enum Type
- {
- kInvalid,
- kGoToSleep, // go to sleep
- kStayAwakeButIdle, // wait for not checking job queue
- kScanForJobs, // actively scan job queue for jobs
- };
- WorkerThreadDirectives()
- {
- for ( int i = 0; i < kMaxThreadCount; ++i )
- {
- m_threadDirs[ i ] = 0;
- }
- }
-
- Type getDirective(int threadId)
- {
- btAssert(threadId < kMaxThreadCount);
- return static_cast<Type>(m_threadDirs[threadId]);
- }
-
- void setDirectiveByRange(int threadBegin, int threadEnd, Type dir)
- {
- btAssert( threadBegin < threadEnd );
- btAssert( threadEnd <= kMaxThreadCount );
- char dirChar = static_cast<char>(dir);
- for ( int i = threadBegin; i < threadEnd; ++i )
- {
- m_threadDirs[ i ] = dirChar;
- }
- }
+ enum Type
+ {
+ kInvalid,
+ kGoToSleep, // go to sleep
+ kStayAwakeButIdle, // wait for not checking job queue
+ kScanForJobs, // actively scan job queue for jobs
+ };
+ WorkerThreadDirectives()
+ {
+ for (int i = 0; i < kMaxThreadCount; ++i)
+ {
+ m_threadDirs[i] = 0;
+ }
+ }
+
+ Type getDirective(int threadId)
+ {
+ btAssert(threadId < kMaxThreadCount);
+ return static_cast<Type>(m_threadDirs[threadId]);
+ }
+
+ void setDirectiveByRange(int threadBegin, int threadEnd, Type dir)
+ {
+ btAssert(threadBegin < threadEnd);
+ btAssert(threadEnd <= kMaxThreadCount);
+ char dirChar = static_cast<char>(dir);
+ for (int i = threadBegin; i < threadEnd; ++i)
+ {
+ m_threadDirs[i] = dirChar;
+ }
+ }
};
class JobQueue;
-ATTRIBUTE_ALIGNED64(struct) ThreadLocalStorage
+ATTRIBUTE_ALIGNED64(struct)
+ThreadLocalStorage
{
- int m_threadId;
- WorkerThreadStatus::Type m_status;
- int m_numJobsFinished;
- btSpinMutex m_mutex;
- btScalar m_sumResult;
- WorkerThreadDirectives * m_directive;
- JobQueue* m_queue;
- btClock* m_clock;
- unsigned int m_cooldownTime;
+ int m_threadId;
+ WorkerThreadStatus::Type m_status;
+ int m_numJobsFinished;
+ btSpinMutex m_mutex;
+ btScalar m_sumResult;
+ WorkerThreadDirectives* m_directive;
+ JobQueue* m_queue;
+ btClock* m_clock;
+ unsigned int m_cooldownTime;
};
-
struct IJob
{
- virtual void executeJob(int threadId) = 0;
+ virtual void executeJob(int threadId) = 0;
};
class ParallelForJob : public IJob
{
- const btIParallelForBody* m_body;
- int m_begin;
- int m_end;
+ const btIParallelForBody* m_body;
+ int m_begin;
+ int m_end;
public:
- ParallelForJob( int iBegin, int iEnd, const btIParallelForBody& body )
- {
- m_body = &body;
- m_begin = iBegin;
- m_end = iEnd;
- }
- virtual void executeJob(int threadId) BT_OVERRIDE
- {
- BT_PROFILE( "executeJob" );
-
- // call the functor body to do the work
- m_body->forLoop( m_begin, m_end );
- }
-};
+ ParallelForJob(int iBegin, int iEnd, const btIParallelForBody& body)
+ {
+ m_body = &body;
+ m_begin = iBegin;
+ m_end = iEnd;
+ }
+ virtual void executeJob(int threadId) BT_OVERRIDE
+ {
+ BT_PROFILE("executeJob");
+ // call the functor body to do the work
+ m_body->forLoop(m_begin, m_end);
+ }
+};
class ParallelSumJob : public IJob
{
- const btIParallelSumBody* m_body;
- ThreadLocalStorage* m_threadLocalStoreArray;
- int m_begin;
- int m_end;
+ const btIParallelSumBody* m_body;
+ ThreadLocalStorage* m_threadLocalStoreArray;
+ int m_begin;
+ int m_end;
public:
- ParallelSumJob( int iBegin, int iEnd, const btIParallelSumBody& body, ThreadLocalStorage* tls )
- {
- m_body = &body;
- m_threadLocalStoreArray = tls;
- m_begin = iBegin;
- m_end = iEnd;
- }
- virtual void executeJob( int threadId ) BT_OVERRIDE
- {
- BT_PROFILE( "executeJob" );
-
- // call the functor body to do the work
- btScalar val = m_body->sumLoop( m_begin, m_end );
+ ParallelSumJob(int iBegin, int iEnd, const btIParallelSumBody& body, ThreadLocalStorage* tls)
+ {
+ m_body = &body;
+ m_threadLocalStoreArray = tls;
+ m_begin = iBegin;
+ m_end = iEnd;
+ }
+ virtual void executeJob(int threadId) BT_OVERRIDE
+ {
+ BT_PROFILE("executeJob");
+
+ // call the functor body to do the work
+ btScalar val = m_body->sumLoop(m_begin, m_end);
#if BT_PARALLEL_SUM_DETERMINISTISM
- // by truncating bits of the result, we can make the parallelSum deterministic (at the expense of precision)
- const float TRUNC_SCALE = float(1<<19);
- val = floor(val*TRUNC_SCALE+0.5f)/TRUNC_SCALE; // truncate some bits
+ // by truncating bits of the result, we can make the parallelSum deterministic (at the expense of precision)
+ const float TRUNC_SCALE = float(1 << 19);
+ val = floor(val * TRUNC_SCALE + 0.5f) / TRUNC_SCALE; // truncate some bits
#endif
- m_threadLocalStoreArray[threadId].m_sumResult += val;
- }
+ m_threadLocalStoreArray[threadId].m_sumResult += val;
+ }
};
-
-ATTRIBUTE_ALIGNED64(class) JobQueue
+ATTRIBUTE_ALIGNED64(class)
+JobQueue
{
- btThreadSupportInterface* m_threadSupport;
- btCriticalSection* m_queueLock;
- btSpinMutex m_mutex;
-
- btAlignedObjectArray<IJob*> m_jobQueue;
- char* m_jobMem;
- int m_jobMemSize;
- bool m_queueIsEmpty;
- int m_tailIndex;
- int m_headIndex;
- int m_allocSize;
- bool m_useSpinMutex;
- btAlignedObjectArray<JobQueue*> m_neighborContexts;
- char m_cachePadding[kCacheLineSize]; // prevent false sharing
-
- void freeJobMem()
- {
- if ( m_jobMem )
- {
- // free old
- btAlignedFree(m_jobMem);
- m_jobMem = NULL;
- }
- }
- void resizeJobMem(int newSize)
- {
- if (newSize > m_jobMemSize)
- {
- freeJobMem();
- m_jobMem = static_cast<char*>(btAlignedAlloc(newSize, kCacheLineSize));
- m_jobMemSize = newSize;
- }
- }
+ btThreadSupportInterface* m_threadSupport;
+ btCriticalSection* m_queueLock;
+ btSpinMutex m_mutex;
+
+ btAlignedObjectArray<IJob*> m_jobQueue;
+ char* m_jobMem;
+ int m_jobMemSize;
+ bool m_queueIsEmpty;
+ int m_tailIndex;
+ int m_headIndex;
+ int m_allocSize;
+ bool m_useSpinMutex;
+ btAlignedObjectArray<JobQueue*> m_neighborContexts;
+ char m_cachePadding[kCacheLineSize]; // prevent false sharing
+
+ void freeJobMem()
+ {
+ if (m_jobMem)
+ {
+ // free old
+ btAlignedFree(m_jobMem);
+ m_jobMem = NULL;
+ }
+ }
+ void resizeJobMem(int newSize)
+ {
+ if (newSize > m_jobMemSize)
+ {
+ freeJobMem();
+ m_jobMem = static_cast<char*>(btAlignedAlloc(newSize, kCacheLineSize));
+ m_jobMemSize = newSize;
+ }
+ }
public:
-
- JobQueue()
- {
- m_jobMem = NULL;
- m_jobMemSize = 0;
- m_threadSupport = NULL;
- m_queueLock = NULL;
- m_headIndex = 0;
- m_tailIndex = 0;
- m_useSpinMutex = false;
- }
- ~JobQueue()
- {
+ JobQueue()
+ {
+ m_jobMem = NULL;
+ m_jobMemSize = 0;
+ m_threadSupport = NULL;
+ m_queueLock = NULL;
+ m_headIndex = 0;
+ m_tailIndex = 0;
+ m_useSpinMutex = false;
+ }
+ ~JobQueue()
+ {
exit();
- }
+ }
void exit()
- {
+ {
freeJobMem();
- if (m_queueLock && m_threadSupport)
- {
- m_threadSupport->deleteCriticalSection(m_queueLock);
- m_queueLock = NULL;
+ if (m_queueLock && m_threadSupport)
+ {
+ m_threadSupport->deleteCriticalSection(m_queueLock);
+ m_queueLock = NULL;
m_threadSupport = 0;
- }
- }
-
- void init(btThreadSupportInterface* threadSup, btAlignedObjectArray<JobQueue>* contextArray)
- {
- m_threadSupport = threadSup;
- if (threadSup)
- {
- m_queueLock = m_threadSupport->createCriticalSection();
- }
- setupJobStealing(contextArray, contextArray->size());
- }
- void setupJobStealing(btAlignedObjectArray<JobQueue>* contextArray, int numActiveContexts)
- {
- btAlignedObjectArray<JobQueue>& contexts = *contextArray;
- int selfIndex = 0;
- for (int i = 0; i < contexts.size(); ++i)
- {
- if ( this == &contexts[ i ] )
- {
- selfIndex = i;
- break;
- }
- }
- int numNeighbors = btMin(2, contexts.size() - 1);
- int neighborOffsets[ ] = {-1, 1, -2, 2, -3, 3};
- int numOffsets = sizeof(neighborOffsets)/sizeof(neighborOffsets[0]);
- m_neighborContexts.reserve( numNeighbors );
- m_neighborContexts.resizeNoInitialize(0);
- for (int i = 0; i < numOffsets && m_neighborContexts.size() < numNeighbors; i++)
- {
- int neighborIndex = selfIndex + neighborOffsets[i];
- if ( neighborIndex >= 0 && neighborIndex < numActiveContexts)
- {
- m_neighborContexts.push_back( &contexts[ neighborIndex ] );
- }
- }
- }
-
- bool isQueueEmpty() const {return m_queueIsEmpty;}
- void lockQueue()
- {
- if ( m_useSpinMutex )
- {
- m_mutex.lock();
- }
- else
- {
- m_queueLock->lock();
- }
- }
- void unlockQueue()
- {
- if ( m_useSpinMutex )
- {
- m_mutex.unlock();
- }
- else
- {
- m_queueLock->unlock();
- }
- }
- void clearQueue(int jobCount, int jobSize)
- {
- lockQueue();
- m_headIndex = 0;
- m_tailIndex = 0;
- m_allocSize = 0;
- m_queueIsEmpty = true;
- int jobBufSize = jobSize * jobCount;
- // make sure we have enough memory allocated to store jobs
- if ( jobBufSize > m_jobMemSize )
- {
- resizeJobMem( jobBufSize );
- }
- // make sure job queue is big enough
- if ( jobCount > m_jobQueue.capacity() )
- {
- m_jobQueue.reserve( jobCount );
- }
- unlockQueue();
- m_jobQueue.resizeNoInitialize( 0 );
- }
- void* allocJobMem(int jobSize)
- {
- btAssert(m_jobMemSize >= (m_allocSize + jobSize));
- void* jobMem = &m_jobMem[m_allocSize];
- m_allocSize += jobSize;
- return jobMem;
- }
- void submitJob( IJob* job )
- {
- btAssert( reinterpret_cast<char*>( job ) >= &m_jobMem[ 0 ] && reinterpret_cast<char*>( job ) < &m_jobMem[ 0 ] + m_allocSize );
- m_jobQueue.push_back( job );
- lockQueue();
- m_tailIndex++;
- m_queueIsEmpty = false;
- unlockQueue();
- }
- IJob* consumeJobFromOwnQueue()
- {
- if ( m_queueIsEmpty )
- {
- // lock free path. even if this is taken erroneously it isn't harmful
- return NULL;
- }
- IJob* job = NULL;
- lockQueue();
- if ( !m_queueIsEmpty )
- {
- job = m_jobQueue[ m_headIndex++ ];
- btAssert( reinterpret_cast<char*>( job ) >= &m_jobMem[ 0 ] && reinterpret_cast<char*>( job ) < &m_jobMem[ 0 ] + m_allocSize );
- if ( m_headIndex == m_tailIndex )
- {
- m_queueIsEmpty = true;
- }
- }
- unlockQueue();
- return job;
- }
- IJob* consumeJob()
- {
- if (IJob* job = consumeJobFromOwnQueue())
- {
- return job;
- }
- // own queue is empty, try to steal from neighbor
- for (int i = 0; i < m_neighborContexts.size(); ++i)
- {
- JobQueue* otherContext = m_neighborContexts[ i ];
- if ( IJob* job = otherContext->consumeJobFromOwnQueue() )
- {
- return job;
- }
- }
- return NULL;
- }
-};
+ }
+ }
+ void init(btThreadSupportInterface * threadSup, btAlignedObjectArray<JobQueue> * contextArray)
+ {
+ m_threadSupport = threadSup;
+ if (threadSup)
+ {
+ m_queueLock = m_threadSupport->createCriticalSection();
+ }
+ setupJobStealing(contextArray, contextArray->size());
+ }
+ void setupJobStealing(btAlignedObjectArray<JobQueue> * contextArray, int numActiveContexts)
+ {
+ btAlignedObjectArray<JobQueue>& contexts = *contextArray;
+ int selfIndex = 0;
+ for (int i = 0; i < contexts.size(); ++i)
+ {
+ if (this == &contexts[i])
+ {
+ selfIndex = i;
+ break;
+ }
+ }
+ int numNeighbors = btMin(2, contexts.size() - 1);
+ int neighborOffsets[] = {-1, 1, -2, 2, -3, 3};
+ int numOffsets = sizeof(neighborOffsets) / sizeof(neighborOffsets[0]);
+ m_neighborContexts.reserve(numNeighbors);
+ m_neighborContexts.resizeNoInitialize(0);
+ for (int i = 0; i < numOffsets && m_neighborContexts.size() < numNeighbors; i++)
+ {
+ int neighborIndex = selfIndex + neighborOffsets[i];
+ if (neighborIndex >= 0 && neighborIndex < numActiveContexts)
+ {
+ m_neighborContexts.push_back(&contexts[neighborIndex]);
+ }
+ }
+ }
+
+ bool isQueueEmpty() const { return m_queueIsEmpty; }
+ void lockQueue()
+ {
+ if (m_useSpinMutex)
+ {
+ m_mutex.lock();
+ }
+ else
+ {
+ m_queueLock->lock();
+ }
+ }
+ void unlockQueue()
+ {
+ if (m_useSpinMutex)
+ {
+ m_mutex.unlock();
+ }
+ else
+ {
+ m_queueLock->unlock();
+ }
+ }
+ void clearQueue(int jobCount, int jobSize)
+ {
+ lockQueue();
+ m_headIndex = 0;
+ m_tailIndex = 0;
+ m_allocSize = 0;
+ m_queueIsEmpty = true;
+ int jobBufSize = jobSize * jobCount;
+ // make sure we have enough memory allocated to store jobs
+ if (jobBufSize > m_jobMemSize)
+ {
+ resizeJobMem(jobBufSize);
+ }
+ // make sure job queue is big enough
+ if (jobCount > m_jobQueue.capacity())
+ {
+ m_jobQueue.reserve(jobCount);
+ }
+ unlockQueue();
+ m_jobQueue.resizeNoInitialize(0);
+ }
+ void* allocJobMem(int jobSize)
+ {
+ btAssert(m_jobMemSize >= (m_allocSize + jobSize));
+ void* jobMem = &m_jobMem[m_allocSize];
+ m_allocSize += jobSize;
+ return jobMem;
+ }
+ void submitJob(IJob * job)
+ {
+ btAssert(reinterpret_cast<char*>(job) >= &m_jobMem[0] && reinterpret_cast<char*>(job) < &m_jobMem[0] + m_allocSize);
+ m_jobQueue.push_back(job);
+ lockQueue();
+ m_tailIndex++;
+ m_queueIsEmpty = false;
+ unlockQueue();
+ }
+ IJob* consumeJobFromOwnQueue()
+ {
+ if (m_queueIsEmpty)
+ {
+ // lock free path. even if this is taken erroneously it isn't harmful
+ return NULL;
+ }
+ IJob* job = NULL;
+ lockQueue();
+ if (!m_queueIsEmpty)
+ {
+ job = m_jobQueue[m_headIndex++];
+ btAssert(reinterpret_cast<char*>(job) >= &m_jobMem[0] && reinterpret_cast<char*>(job) < &m_jobMem[0] + m_allocSize);
+ if (m_headIndex == m_tailIndex)
+ {
+ m_queueIsEmpty = true;
+ }
+ }
+ unlockQueue();
+ return job;
+ }
+ IJob* consumeJob()
+ {
+ if (IJob* job = consumeJobFromOwnQueue())
+ {
+ return job;
+ }
+ // own queue is empty, try to steal from neighbor
+ for (int i = 0; i < m_neighborContexts.size(); ++i)
+ {
+ JobQueue* otherContext = m_neighborContexts[i];
+ if (IJob* job = otherContext->consumeJobFromOwnQueue())
+ {
+ return job;
+ }
+ }
+ return NULL;
+ }
+};
-static void WorkerThreadFunc( void* userPtr )
+static void WorkerThreadFunc(void* userPtr)
{
- BT_PROFILE( "WorkerThreadFunc" );
- ThreadLocalStorage* localStorage = (ThreadLocalStorage*) userPtr;
- JobQueue* jobQueue = localStorage->m_queue;
-
- bool shouldSleep = false;
- int threadId = localStorage->m_threadId;
- while (! shouldSleep)
- {
- // do work
- localStorage->m_mutex.lock();
- while ( IJob* job = jobQueue->consumeJob() )
- {
- localStorage->m_status = WorkerThreadStatus::kWorking;
- job->executeJob( threadId );
- localStorage->m_numJobsFinished++;
- }
- localStorage->m_status = WorkerThreadStatus::kWaitingForWork;
- localStorage->m_mutex.unlock();
- btU64 clockStart = localStorage->m_clock->getTimeMicroseconds();
- // while queue is empty,
- while (jobQueue->isQueueEmpty())
- {
- // todo: spin wait a bit to avoid hammering the empty queue
- btSpinPause();
- if ( localStorage->m_directive->getDirective(threadId) == WorkerThreadDirectives::kGoToSleep )
- {
- shouldSleep = true;
- break;
- }
- // if jobs are incoming,
- if ( localStorage->m_directive->getDirective( threadId ) == WorkerThreadDirectives::kScanForJobs )
- {
- clockStart = localStorage->m_clock->getTimeMicroseconds(); // reset clock
- }
- else
- {
- for ( int i = 0; i < 50; ++i )
- {
- btSpinPause();
- btSpinPause();
- btSpinPause();
- btSpinPause();
- if (localStorage->m_directive->getDirective( threadId ) == WorkerThreadDirectives::kScanForJobs || !jobQueue->isQueueEmpty())
- {
- break;
- }
- }
- // if no jobs incoming and queue has been empty for the cooldown time, sleep
- btU64 timeElapsed = localStorage->m_clock->getTimeMicroseconds() - clockStart;
- if (timeElapsed > localStorage->m_cooldownTime)
- {
- shouldSleep = true;
- break;
- }
- }
- }
- }
+ BT_PROFILE("WorkerThreadFunc");
+ ThreadLocalStorage* localStorage = (ThreadLocalStorage*)userPtr;
+ JobQueue* jobQueue = localStorage->m_queue;
+
+ bool shouldSleep = false;
+ int threadId = localStorage->m_threadId;
+ while (!shouldSleep)
+ {
+ // do work
+ localStorage->m_mutex.lock();
+ while (IJob* job = jobQueue->consumeJob())
+ {
+ localStorage->m_status = WorkerThreadStatus::kWorking;
+ job->executeJob(threadId);
+ localStorage->m_numJobsFinished++;
+ }
+ localStorage->m_status = WorkerThreadStatus::kWaitingForWork;
+ localStorage->m_mutex.unlock();
+ btU64 clockStart = localStorage->m_clock->getTimeMicroseconds();
+ // while queue is empty,
+ while (jobQueue->isQueueEmpty())
+ {
+ // todo: spin wait a bit to avoid hammering the empty queue
+ btSpinPause();
+ if (localStorage->m_directive->getDirective(threadId) == WorkerThreadDirectives::kGoToSleep)
+ {
+ shouldSleep = true;
+ break;
+ }
+ // if jobs are incoming,
+ if (localStorage->m_directive->getDirective(threadId) == WorkerThreadDirectives::kScanForJobs)
+ {
+ clockStart = localStorage->m_clock->getTimeMicroseconds(); // reset clock
+ }
+ else
+ {
+ for (int i = 0; i < 50; ++i)
+ {
+ btSpinPause();
+ btSpinPause();
+ btSpinPause();
+ btSpinPause();
+ if (localStorage->m_directive->getDirective(threadId) == WorkerThreadDirectives::kScanForJobs || !jobQueue->isQueueEmpty())
+ {
+ break;
+ }
+ }
+ // if no jobs incoming and queue has been empty for the cooldown time, sleep
+ btU64 timeElapsed = localStorage->m_clock->getTimeMicroseconds() - clockStart;
+ if (timeElapsed > localStorage->m_cooldownTime)
+ {
+ shouldSleep = true;
+ break;
+ }
+ }
+ }
+ }
{
BT_PROFILE("sleep");
// go sleep
@@ -427,376 +420,373 @@ static void WorkerThreadFunc( void* userPtr )
}
}
-
class btTaskSchedulerDefault : public btITaskScheduler
{
- btThreadSupportInterface* m_threadSupport;
- WorkerThreadDirectives* m_workerDirective;
- btAlignedObjectArray<JobQueue> m_jobQueues;
- btAlignedObjectArray<JobQueue*> m_perThreadJobQueues;
- btAlignedObjectArray<ThreadLocalStorage> m_threadLocalStorage;
- btSpinMutex m_antiNestingLock; // prevent nested parallel-for
- btClock m_clock;
- int m_numThreads;
- int m_numWorkerThreads;
- int m_numActiveJobQueues;
- int m_maxNumThreads;
- int m_numJobs;
- static const int kFirstWorkerThreadId = 1;
+ btThreadSupportInterface* m_threadSupport;
+ WorkerThreadDirectives* m_workerDirective;
+ btAlignedObjectArray<JobQueue> m_jobQueues;
+ btAlignedObjectArray<JobQueue*> m_perThreadJobQueues;
+ btAlignedObjectArray<ThreadLocalStorage> m_threadLocalStorage;
+ btSpinMutex m_antiNestingLock; // prevent nested parallel-for
+ btClock m_clock;
+ int m_numThreads;
+ int m_numWorkerThreads;
+ int m_numActiveJobQueues;
+ int m_maxNumThreads;
+ int m_numJobs;
+ static const int kFirstWorkerThreadId = 1;
+
public:
+ btTaskSchedulerDefault() : btITaskScheduler("ThreadSupport")
+ {
+ m_threadSupport = NULL;
+ m_workerDirective = NULL;
+ }
- btTaskSchedulerDefault() : btITaskScheduler("ThreadSupport")
- {
- m_threadSupport = NULL;
- m_workerDirective = NULL;
- }
-
- virtual ~btTaskSchedulerDefault()
- {
- waitForWorkersToSleep();
-
- for ( int i = 0; i < m_jobQueues.size(); ++i )
- {
- m_jobQueues[i].exit();
- }
-
- if (m_threadSupport)
- {
- delete m_threadSupport;
- m_threadSupport = NULL;
- }
- if (m_workerDirective)
- {
- btAlignedFree(m_workerDirective);
- m_workerDirective = NULL;
- }
- }
-
- void init()
- {
- btThreadSupportInterface::ConstructionInfo constructionInfo( "TaskScheduler", WorkerThreadFunc );
- m_threadSupport = btThreadSupportInterface::create( constructionInfo );
- m_workerDirective = static_cast<WorkerThreadDirectives*>(btAlignedAlloc(sizeof(*m_workerDirective), 64));
-
- m_numWorkerThreads = m_threadSupport->getNumWorkerThreads();
- m_maxNumThreads = m_threadSupport->getNumWorkerThreads() + 1;
- m_numThreads = m_maxNumThreads;
- // ideal to have one job queue for each physical processor (except for the main thread which needs no queue)
- int numThreadsPerQueue = m_threadSupport->getLogicalToPhysicalCoreRatio();
- int numJobQueues = (numThreadsPerQueue == 1) ? (m_maxNumThreads-1) : (m_maxNumThreads / numThreadsPerQueue);
- m_jobQueues.resize(numJobQueues);
- m_numActiveJobQueues = numJobQueues;
- for ( int i = 0; i < m_jobQueues.size(); ++i )
- {
- m_jobQueues[i].init( m_threadSupport, &m_jobQueues );
- }
- m_perThreadJobQueues.resize(m_numThreads);
- for ( int i = 0; i < m_numThreads; i++ )
- {
- JobQueue* jq = NULL;
- // only worker threads get a job queue
- if (i > 0)
- {
- if (numThreadsPerQueue == 1)
- {
- // one queue per worker thread
- jq = &m_jobQueues[ i - kFirstWorkerThreadId ];
- }
- else
- {
- // 2 threads share each queue
- jq = &m_jobQueues[ i / numThreadsPerQueue ];
- }
- }
- m_perThreadJobQueues[i] = jq;
- }
- m_threadLocalStorage.resize(m_numThreads);
- for ( int i = 0; i < m_numThreads; i++ )
- {
- ThreadLocalStorage& storage = m_threadLocalStorage[i];
- storage.m_threadId = i;
- storage.m_directive = m_workerDirective;
- storage.m_status = WorkerThreadStatus::kSleeping;
- storage.m_cooldownTime = 100; // 100 microseconds, threads go to sleep after this long if they have nothing to do
- storage.m_clock = &m_clock;
- storage.m_queue = m_perThreadJobQueues[i];
- }
- setWorkerDirectives( WorkerThreadDirectives::kGoToSleep ); // no work for them yet
- setNumThreads( m_threadSupport->getCacheFriendlyNumThreads() );
- }
-
- void setWorkerDirectives(WorkerThreadDirectives::Type dir)
- {
- m_workerDirective->setDirectiveByRange(kFirstWorkerThreadId, m_numThreads, dir);
- }
-
- virtual int getMaxNumThreads() const BT_OVERRIDE
- {
- return m_maxNumThreads;
- }
-
- virtual int getNumThreads() const BT_OVERRIDE
- {
- return m_numThreads;
- }
-
- virtual void setNumThreads( int numThreads ) BT_OVERRIDE
- {
- m_numThreads = btMax( btMin(numThreads, int(m_maxNumThreads)), 1 );
- m_numWorkerThreads = m_numThreads - 1;
- m_numActiveJobQueues = 0;
- // if there is at least 1 worker,
- if ( m_numWorkerThreads > 0 )
- {
- // re-setup job stealing between queues to avoid attempting to steal from an inactive job queue
- JobQueue* lastActiveContext = m_perThreadJobQueues[ m_numThreads - 1 ];
- int iLastActiveContext = lastActiveContext - &m_jobQueues[0];
- m_numActiveJobQueues = iLastActiveContext + 1;
- for ( int i = 0; i < m_jobQueues.size(); ++i )
- {
- m_jobQueues[ i ].setupJobStealing( &m_jobQueues, m_numActiveJobQueues );
- }
- }
- m_workerDirective->setDirectiveByRange(m_numThreads, BT_MAX_THREAD_COUNT, WorkerThreadDirectives::kGoToSleep);
- }
-
- void waitJobs()
- {
- BT_PROFILE( "waitJobs" );
- // have the main thread work until the job queues are empty
- int numMainThreadJobsFinished = 0;
- for ( int i = 0; i < m_numActiveJobQueues; ++i )
- {
- while ( IJob* job = m_jobQueues[i].consumeJob() )
- {
- job->executeJob( 0 );
- numMainThreadJobsFinished++;
- }
- }
-
- // done with jobs for now, tell workers to rest (but not sleep)
- setWorkerDirectives( WorkerThreadDirectives::kStayAwakeButIdle );
-
- btU64 clockStart = m_clock.getTimeMicroseconds();
- // wait for workers to finish any jobs in progress
- while ( true )
- {
- int numWorkerJobsFinished = 0;
- for ( int iThread = kFirstWorkerThreadId; iThread < m_numThreads; ++iThread )
- {
- ThreadLocalStorage* storage = &m_threadLocalStorage[iThread];
- storage->m_mutex.lock();
- numWorkerJobsFinished += storage->m_numJobsFinished;
- storage->m_mutex.unlock();
- }
- if (numWorkerJobsFinished + numMainThreadJobsFinished == m_numJobs)
- {
- break;
- }
- btU64 timeElapsed = m_clock.getTimeMicroseconds() - clockStart;
- btAssert(timeElapsed < 1000);
- if (timeElapsed > 100000)
- {
- break;
- }
- btSpinPause();
- }
- }
-
- void wakeWorkers(int numWorkersToWake)
- {
- BT_PROFILE( "wakeWorkers" );
- btAssert( m_workerDirective->getDirective(1) == WorkerThreadDirectives::kScanForJobs );
- int numDesiredWorkers = btMin(numWorkersToWake, m_numWorkerThreads);
- int numActiveWorkers = 0;
- for ( int iWorker = 0; iWorker < m_numWorkerThreads; ++iWorker )
- {
- // note this count of active workers is not necessarily totally reliable, because a worker thread could be
- // just about to put itself to sleep. So we may on occasion fail to wake up all the workers. It should be rare.
- ThreadLocalStorage& storage = m_threadLocalStorage[ kFirstWorkerThreadId + iWorker ];
- if (storage.m_status != WorkerThreadStatus::kSleeping)
- {
- numActiveWorkers++;
- }
- }
- for ( int iWorker = 0; iWorker < m_numWorkerThreads && numActiveWorkers < numDesiredWorkers; ++iWorker )
- {
- ThreadLocalStorage& storage = m_threadLocalStorage[ kFirstWorkerThreadId + iWorker ];
- if (storage.m_status == WorkerThreadStatus::kSleeping)
- {
- m_threadSupport->runTask( iWorker, &storage );
- numActiveWorkers++;
- }
- }
- }
-
- void waitForWorkersToSleep()
- {
- BT_PROFILE( "waitForWorkersToSleep" );
- setWorkerDirectives( WorkerThreadDirectives::kGoToSleep );
- m_threadSupport->waitForAllTasks();
- for ( int i = kFirstWorkerThreadId; i < m_numThreads; i++ )
- {
- ThreadLocalStorage& storage = m_threadLocalStorage[i];
- btAssert( storage.m_status == WorkerThreadStatus::kSleeping );
- }
- }
-
- virtual void sleepWorkerThreadsHint() BT_OVERRIDE
- {
- BT_PROFILE( "sleepWorkerThreadsHint" );
- // hint the task scheduler that we may not be using these threads for a little while
- setWorkerDirectives( WorkerThreadDirectives::kGoToSleep );
- }
-
- void prepareWorkerThreads()
- {
- for ( int i = kFirstWorkerThreadId; i < m_numThreads; ++i )
- {
- ThreadLocalStorage& storage = m_threadLocalStorage[i];
- storage.m_mutex.lock();
- storage.m_numJobsFinished = 0;
- storage.m_mutex.unlock();
- }
- setWorkerDirectives( WorkerThreadDirectives::kScanForJobs );
- }
-
- virtual void parallelFor( int iBegin, int iEnd, int grainSize, const btIParallelForBody& body ) BT_OVERRIDE
- {
- BT_PROFILE( "parallelFor_ThreadSupport" );
- btAssert( iEnd >= iBegin );
- btAssert( grainSize >= 1 );
- int iterationCount = iEnd - iBegin;
- if ( iterationCount > grainSize && m_numWorkerThreads > 0 && m_antiNestingLock.tryLock() )
- {
- typedef ParallelForJob JobType;
- int jobCount = ( iterationCount + grainSize - 1 ) / grainSize;
- m_numJobs = jobCount;
- btAssert( jobCount >= 2 ); // need more than one job for multithreading
- int jobSize = sizeof( JobType );
-
- for (int i = 0; i < m_numActiveJobQueues; ++i)
- {
- m_jobQueues[i].clearQueue( jobCount, jobSize );
- }
- // prepare worker threads for incoming work
- prepareWorkerThreads();
- // submit all of the jobs
- int iJob = 0;
- int iThread = kFirstWorkerThreadId; // first worker thread
- for ( int i = iBegin; i < iEnd; i += grainSize )
- {
- btAssert( iJob < jobCount );
- int iE = btMin( i + grainSize, iEnd );
- JobQueue* jq = m_perThreadJobQueues[ iThread ];
- btAssert(jq);
- btAssert((jq - &m_jobQueues[0]) < m_numActiveJobQueues);
- void* jobMem = jq->allocJobMem(jobSize);
- JobType* job = new ( jobMem ) ParallelForJob( i, iE, body ); // placement new
- jq->submitJob( job );
- iJob++;
- iThread++;
- if ( iThread >= m_numThreads )
- {
- iThread = kFirstWorkerThreadId; // first worker thread
- }
- }
- wakeWorkers( jobCount - 1 );
-
- // put the main thread to work on emptying the job queue and then wait for all workers to finish
- waitJobs();
- m_antiNestingLock.unlock();
- }
- else
- {
- BT_PROFILE( "parallelFor_mainThread" );
- // just run on main thread
- body.forLoop( iBegin, iEnd );
- }
- }
- virtual btScalar parallelSum( int iBegin, int iEnd, int grainSize, const btIParallelSumBody& body ) BT_OVERRIDE
- {
- BT_PROFILE( "parallelSum_ThreadSupport" );
- btAssert( iEnd >= iBegin );
- btAssert( grainSize >= 1 );
- int iterationCount = iEnd - iBegin;
- if ( iterationCount > grainSize && m_numWorkerThreads > 0 && m_antiNestingLock.tryLock() )
- {
- typedef ParallelSumJob JobType;
- int jobCount = ( iterationCount + grainSize - 1 ) / grainSize;
- m_numJobs = jobCount;
- btAssert( jobCount >= 2 ); // need more than one job for multithreading
- int jobSize = sizeof( JobType );
- for (int i = 0; i < m_numActiveJobQueues; ++i)
- {
- m_jobQueues[i].clearQueue( jobCount, jobSize );
- }
-
- // initialize summation
- for ( int iThread = 0; iThread < m_numThreads; ++iThread )
- {
- m_threadLocalStorage[iThread].m_sumResult = btScalar(0);
- }
-
- // prepare worker threads for incoming work
- prepareWorkerThreads();
- // submit all of the jobs
- int iJob = 0;
- int iThread = kFirstWorkerThreadId; // first worker thread
- for ( int i = iBegin; i < iEnd; i += grainSize )
- {
- btAssert( iJob < jobCount );
- int iE = btMin( i + grainSize, iEnd );
- JobQueue* jq = m_perThreadJobQueues[ iThread ];
- btAssert(jq);
- btAssert((jq - &m_jobQueues[0]) < m_numActiveJobQueues);
- void* jobMem = jq->allocJobMem(jobSize);
- JobType* job = new ( jobMem ) ParallelSumJob( i, iE, body, &m_threadLocalStorage[0] ); // placement new
- jq->submitJob( job );
- iJob++;
- iThread++;
- if ( iThread >= m_numThreads )
- {
- iThread = kFirstWorkerThreadId; // first worker thread
- }
- }
- wakeWorkers( jobCount - 1 );
-
- // put the main thread to work on emptying the job queue and then wait for all workers to finish
- waitJobs();
-
- // add up all the thread sums
- btScalar sum = btScalar(0);
- for ( int iThread = 0; iThread < m_numThreads; ++iThread )
- {
- sum += m_threadLocalStorage[ iThread ].m_sumResult;
- }
- m_antiNestingLock.unlock();
- return sum;
- }
- else
- {
- BT_PROFILE( "parallelSum_mainThread" );
- // just run on main thread
- return body.sumLoop( iBegin, iEnd );
- }
- }
-};
+ virtual ~btTaskSchedulerDefault()
+ {
+ waitForWorkersToSleep();
+
+ for (int i = 0; i < m_jobQueues.size(); ++i)
+ {
+ m_jobQueues[i].exit();
+ }
+
+ if (m_threadSupport)
+ {
+ delete m_threadSupport;
+ m_threadSupport = NULL;
+ }
+ if (m_workerDirective)
+ {
+ btAlignedFree(m_workerDirective);
+ m_workerDirective = NULL;
+ }
+ }
+ void init()
+ {
+ btThreadSupportInterface::ConstructionInfo constructionInfo("TaskScheduler", WorkerThreadFunc);
+ m_threadSupport = btThreadSupportInterface::create(constructionInfo);
+ m_workerDirective = static_cast<WorkerThreadDirectives*>(btAlignedAlloc(sizeof(*m_workerDirective), 64));
+
+ m_numWorkerThreads = m_threadSupport->getNumWorkerThreads();
+ m_maxNumThreads = m_threadSupport->getNumWorkerThreads() + 1;
+ m_numThreads = m_maxNumThreads;
+ // ideal to have one job queue for each physical processor (except for the main thread which needs no queue)
+ int numThreadsPerQueue = m_threadSupport->getLogicalToPhysicalCoreRatio();
+ int numJobQueues = (numThreadsPerQueue == 1) ? (m_maxNumThreads - 1) : (m_maxNumThreads / numThreadsPerQueue);
+ m_jobQueues.resize(numJobQueues);
+ m_numActiveJobQueues = numJobQueues;
+ for (int i = 0; i < m_jobQueues.size(); ++i)
+ {
+ m_jobQueues[i].init(m_threadSupport, &m_jobQueues);
+ }
+ m_perThreadJobQueues.resize(m_numThreads);
+ for (int i = 0; i < m_numThreads; i++)
+ {
+ JobQueue* jq = NULL;
+ // only worker threads get a job queue
+ if (i > 0)
+ {
+ if (numThreadsPerQueue == 1)
+ {
+ // one queue per worker thread
+ jq = &m_jobQueues[i - kFirstWorkerThreadId];
+ }
+ else
+ {
+ // 2 threads share each queue
+ jq = &m_jobQueues[i / numThreadsPerQueue];
+ }
+ }
+ m_perThreadJobQueues[i] = jq;
+ }
+ m_threadLocalStorage.resize(m_numThreads);
+ for (int i = 0; i < m_numThreads; i++)
+ {
+ ThreadLocalStorage& storage = m_threadLocalStorage[i];
+ storage.m_threadId = i;
+ storage.m_directive = m_workerDirective;
+ storage.m_status = WorkerThreadStatus::kSleeping;
+ storage.m_cooldownTime = 100; // 100 microseconds, threads go to sleep after this long if they have nothing to do
+ storage.m_clock = &m_clock;
+ storage.m_queue = m_perThreadJobQueues[i];
+ }
+ setWorkerDirectives(WorkerThreadDirectives::kGoToSleep); // no work for them yet
+ setNumThreads(m_threadSupport->getCacheFriendlyNumThreads());
+ }
+
+ void setWorkerDirectives(WorkerThreadDirectives::Type dir)
+ {
+ m_workerDirective->setDirectiveByRange(kFirstWorkerThreadId, m_numThreads, dir);
+ }
+
+ virtual int getMaxNumThreads() const BT_OVERRIDE
+ {
+ return m_maxNumThreads;
+ }
+ virtual int getNumThreads() const BT_OVERRIDE
+ {
+ return m_numThreads;
+ }
+
+ virtual void setNumThreads(int numThreads) BT_OVERRIDE
+ {
+ m_numThreads = btMax(btMin(numThreads, int(m_maxNumThreads)), 1);
+ m_numWorkerThreads = m_numThreads - 1;
+ m_numActiveJobQueues = 0;
+ // if there is at least 1 worker,
+ if (m_numWorkerThreads > 0)
+ {
+ // re-setup job stealing between queues to avoid attempting to steal from an inactive job queue
+ JobQueue* lastActiveContext = m_perThreadJobQueues[m_numThreads - 1];
+ int iLastActiveContext = lastActiveContext - &m_jobQueues[0];
+ m_numActiveJobQueues = iLastActiveContext + 1;
+ for (int i = 0; i < m_jobQueues.size(); ++i)
+ {
+ m_jobQueues[i].setupJobStealing(&m_jobQueues, m_numActiveJobQueues);
+ }
+ }
+ m_workerDirective->setDirectiveByRange(m_numThreads, BT_MAX_THREAD_COUNT, WorkerThreadDirectives::kGoToSleep);
+ }
+
+ void waitJobs()
+ {
+ BT_PROFILE("waitJobs");
+ // have the main thread work until the job queues are empty
+ int numMainThreadJobsFinished = 0;
+ for (int i = 0; i < m_numActiveJobQueues; ++i)
+ {
+ while (IJob* job = m_jobQueues[i].consumeJob())
+ {
+ job->executeJob(0);
+ numMainThreadJobsFinished++;
+ }
+ }
+
+ // done with jobs for now, tell workers to rest (but not sleep)
+ setWorkerDirectives(WorkerThreadDirectives::kStayAwakeButIdle);
+
+ btU64 clockStart = m_clock.getTimeMicroseconds();
+ // wait for workers to finish any jobs in progress
+ while (true)
+ {
+ int numWorkerJobsFinished = 0;
+ for (int iThread = kFirstWorkerThreadId; iThread < m_numThreads; ++iThread)
+ {
+ ThreadLocalStorage* storage = &m_threadLocalStorage[iThread];
+ storage->m_mutex.lock();
+ numWorkerJobsFinished += storage->m_numJobsFinished;
+ storage->m_mutex.unlock();
+ }
+ if (numWorkerJobsFinished + numMainThreadJobsFinished == m_numJobs)
+ {
+ break;
+ }
+ btU64 timeElapsed = m_clock.getTimeMicroseconds() - clockStart;
+ btAssert(timeElapsed < 1000);
+ if (timeElapsed > 100000)
+ {
+ break;
+ }
+ btSpinPause();
+ }
+ }
+
+ void wakeWorkers(int numWorkersToWake)
+ {
+ BT_PROFILE("wakeWorkers");
+ btAssert(m_workerDirective->getDirective(1) == WorkerThreadDirectives::kScanForJobs);
+ int numDesiredWorkers = btMin(numWorkersToWake, m_numWorkerThreads);
+ int numActiveWorkers = 0;
+ for (int iWorker = 0; iWorker < m_numWorkerThreads; ++iWorker)
+ {
+ // note this count of active workers is not necessarily totally reliable, because a worker thread could be
+ // just about to put itself to sleep. So we may on occasion fail to wake up all the workers. It should be rare.
+ ThreadLocalStorage& storage = m_threadLocalStorage[kFirstWorkerThreadId + iWorker];
+ if (storage.m_status != WorkerThreadStatus::kSleeping)
+ {
+ numActiveWorkers++;
+ }
+ }
+ for (int iWorker = 0; iWorker < m_numWorkerThreads && numActiveWorkers < numDesiredWorkers; ++iWorker)
+ {
+ ThreadLocalStorage& storage = m_threadLocalStorage[kFirstWorkerThreadId + iWorker];
+ if (storage.m_status == WorkerThreadStatus::kSleeping)
+ {
+ m_threadSupport->runTask(iWorker, &storage);
+ numActiveWorkers++;
+ }
+ }
+ }
+
+ void waitForWorkersToSleep()
+ {
+ BT_PROFILE("waitForWorkersToSleep");
+ setWorkerDirectives(WorkerThreadDirectives::kGoToSleep);
+ m_threadSupport->waitForAllTasks();
+ for (int i = kFirstWorkerThreadId; i < m_numThreads; i++)
+ {
+ ThreadLocalStorage& storage = m_threadLocalStorage[i];
+ btAssert(storage.m_status == WorkerThreadStatus::kSleeping);
+ }
+ }
+
+ virtual void sleepWorkerThreadsHint() BT_OVERRIDE
+ {
+ BT_PROFILE("sleepWorkerThreadsHint");
+ // hint the task scheduler that we may not be using these threads for a little while
+ setWorkerDirectives(WorkerThreadDirectives::kGoToSleep);
+ }
+
+ void prepareWorkerThreads()
+ {
+ for (int i = kFirstWorkerThreadId; i < m_numThreads; ++i)
+ {
+ ThreadLocalStorage& storage = m_threadLocalStorage[i];
+ storage.m_mutex.lock();
+ storage.m_numJobsFinished = 0;
+ storage.m_mutex.unlock();
+ }
+ setWorkerDirectives(WorkerThreadDirectives::kScanForJobs);
+ }
+
+ virtual void parallelFor(int iBegin, int iEnd, int grainSize, const btIParallelForBody& body) BT_OVERRIDE
+ {
+ BT_PROFILE("parallelFor_ThreadSupport");
+ btAssert(iEnd >= iBegin);
+ btAssert(grainSize >= 1);
+ int iterationCount = iEnd - iBegin;
+ if (iterationCount > grainSize && m_numWorkerThreads > 0 && m_antiNestingLock.tryLock())
+ {
+ typedef ParallelForJob JobType;
+ int jobCount = (iterationCount + grainSize - 1) / grainSize;
+ m_numJobs = jobCount;
+ btAssert(jobCount >= 2); // need more than one job for multithreading
+ int jobSize = sizeof(JobType);
+
+ for (int i = 0; i < m_numActiveJobQueues; ++i)
+ {
+ m_jobQueues[i].clearQueue(jobCount, jobSize);
+ }
+ // prepare worker threads for incoming work
+ prepareWorkerThreads();
+ // submit all of the jobs
+ int iJob = 0;
+ int iThread = kFirstWorkerThreadId; // first worker thread
+ for (int i = iBegin; i < iEnd; i += grainSize)
+ {
+ btAssert(iJob < jobCount);
+ int iE = btMin(i + grainSize, iEnd);
+ JobQueue* jq = m_perThreadJobQueues[iThread];
+ btAssert(jq);
+ btAssert((jq - &m_jobQueues[0]) < m_numActiveJobQueues);
+ void* jobMem = jq->allocJobMem(jobSize);
+ JobType* job = new (jobMem) ParallelForJob(i, iE, body); // placement new
+ jq->submitJob(job);
+ iJob++;
+ iThread++;
+ if (iThread >= m_numThreads)
+ {
+ iThread = kFirstWorkerThreadId; // first worker thread
+ }
+ }
+ wakeWorkers(jobCount - 1);
+
+ // put the main thread to work on emptying the job queue and then wait for all workers to finish
+ waitJobs();
+ m_antiNestingLock.unlock();
+ }
+ else
+ {
+ BT_PROFILE("parallelFor_mainThread");
+ // just run on main thread
+ body.forLoop(iBegin, iEnd);
+ }
+ }
+ virtual btScalar parallelSum(int iBegin, int iEnd, int grainSize, const btIParallelSumBody& body) BT_OVERRIDE
+ {
+ BT_PROFILE("parallelSum_ThreadSupport");
+ btAssert(iEnd >= iBegin);
+ btAssert(grainSize >= 1);
+ int iterationCount = iEnd - iBegin;
+ if (iterationCount > grainSize && m_numWorkerThreads > 0 && m_antiNestingLock.tryLock())
+ {
+ typedef ParallelSumJob JobType;
+ int jobCount = (iterationCount + grainSize - 1) / grainSize;
+ m_numJobs = jobCount;
+ btAssert(jobCount >= 2); // need more than one job for multithreading
+ int jobSize = sizeof(JobType);
+ for (int i = 0; i < m_numActiveJobQueues; ++i)
+ {
+ m_jobQueues[i].clearQueue(jobCount, jobSize);
+ }
+
+ // initialize summation
+ for (int iThread = 0; iThread < m_numThreads; ++iThread)
+ {
+ m_threadLocalStorage[iThread].m_sumResult = btScalar(0);
+ }
+
+ // prepare worker threads for incoming work
+ prepareWorkerThreads();
+ // submit all of the jobs
+ int iJob = 0;
+ int iThread = kFirstWorkerThreadId; // first worker thread
+ for (int i = iBegin; i < iEnd; i += grainSize)
+ {
+ btAssert(iJob < jobCount);
+ int iE = btMin(i + grainSize, iEnd);
+ JobQueue* jq = m_perThreadJobQueues[iThread];
+ btAssert(jq);
+ btAssert((jq - &m_jobQueues[0]) < m_numActiveJobQueues);
+ void* jobMem = jq->allocJobMem(jobSize);
+ JobType* job = new (jobMem) ParallelSumJob(i, iE, body, &m_threadLocalStorage[0]); // placement new
+ jq->submitJob(job);
+ iJob++;
+ iThread++;
+ if (iThread >= m_numThreads)
+ {
+ iThread = kFirstWorkerThreadId; // first worker thread
+ }
+ }
+ wakeWorkers(jobCount - 1);
+
+ // put the main thread to work on emptying the job queue and then wait for all workers to finish
+ waitJobs();
+
+ // add up all the thread sums
+ btScalar sum = btScalar(0);
+ for (int iThread = 0; iThread < m_numThreads; ++iThread)
+ {
+ sum += m_threadLocalStorage[iThread].m_sumResult;
+ }
+ m_antiNestingLock.unlock();
+ return sum;
+ }
+ else
+ {
+ BT_PROFILE("parallelSum_mainThread");
+ // just run on main thread
+ return body.sumLoop(iBegin, iEnd);
+ }
+ }
+};
btITaskScheduler* btCreateDefaultTaskScheduler()
{
- btTaskSchedulerDefault* ts = new btTaskSchedulerDefault();
- ts->init();
- return ts;
+ btTaskSchedulerDefault* ts = new btTaskSchedulerDefault();
+ ts->init();
+ return ts;
}
-#else // #if BT_THREADSAFE
+#else // #if BT_THREADSAFE
btITaskScheduler* btCreateDefaultTaskScheduler()
{
- return NULL;
+ return NULL;
}
-#endif // #else // #if BT_THREADSAFE
+#endif // #else // #if BT_THREADSAFE
diff --git a/thirdparty/bullet/LinearMath/TaskScheduler/btThreadSupportInterface.h b/thirdparty/bullet/LinearMath/TaskScheduler/btThreadSupportInterface.h
index a0ad802b1e..1fe49335a1 100644
--- a/thirdparty/bullet/LinearMath/TaskScheduler/btThreadSupportInterface.h
+++ b/thirdparty/bullet/LinearMath/TaskScheduler/btThreadSupportInterface.h
@@ -16,55 +16,49 @@ subject to the following restrictions:
#ifndef BT_THREAD_SUPPORT_INTERFACE_H
#define BT_THREAD_SUPPORT_INTERFACE_H
-
-
class btCriticalSection
{
public:
- btCriticalSection() {}
- virtual ~btCriticalSection() {}
+ btCriticalSection() {}
+ virtual ~btCriticalSection() {}
- virtual void lock() = 0;
- virtual void unlock() = 0;
+ 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 );
+ 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
-
+#endif //BT_THREAD_SUPPORT_INTERFACE_H
diff --git a/thirdparty/bullet/LinearMath/TaskScheduler/btThreadSupportPosix.cpp b/thirdparty/bullet/LinearMath/TaskScheduler/btThreadSupportPosix.cpp
index 50ca060dfe..02f4ed1631 100644
--- a/thirdparty/bullet/LinearMath/TaskScheduler/btThreadSupportPosix.cpp
+++ b/thirdparty/bullet/LinearMath/TaskScheduler/btThreadSupportPosix.cpp
@@ -1,3 +1,4 @@
+
/*
Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2018 Erwin Coumans http://bulletphysics.com
@@ -13,9 +14,7 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
-#if BT_THREADSAFE && !defined( _WIN32 )
-
+#if BT_THREADSAFE && !defined(_WIN32)
#include "LinearMath/btScalar.h"
#include "LinearMath/btAlignedObjectArray.h"
@@ -27,14 +26,12 @@ subject to the following restrictions:
#include <errno.h>
#include <unistd.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
+#define _XOPEN_SOURCE 600 //for definition of pthread_barrier_t, see http://pages.cs.wisc.edu/~travitch/pthreads_primer.html
+#endif //_XOPEN_SOURCE
#include <pthread.h>
#include <semaphore.h>
-#include <unistd.h> //for sysconf
-
+#include <unistd.h> //for sysconf
///
/// getNumHardwareThreads()
@@ -48,318 +45,309 @@ subject to the following restrictions:
int btGetNumHardwareThreads()
{
- return btMin<int>(BT_MAX_THREAD_COUNT, std::thread::hardware_concurrency());
+ return btMin<int>(BT_MAX_THREAD_COUNT, std::thread::hardware_concurrency());
}
#else
int btGetNumHardwareThreads()
{
- return btMin<int>(BT_MAX_THREAD_COUNT, sysconf( _SC_NPROCESSORS_ONLN ));
+ return btMin<int>(BT_MAX_THREAD_COUNT, sysconf(_SC_NPROCESSORS_ONLN));
}
#endif
-
// btThreadSupportPosix helps to initialize/shutdown libspe2, start/stop SPU tasks and communication
class btThreadSupportPosix : public btThreadSupportInterface
{
public:
- struct btThreadStatus
- {
- int m_taskId;
- int m_commandId;
- int m_status;
-
- ThreadFunc m_userThreadFunc;
- void* m_userPtr; //for taskDesc etc
-
- 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:
- typedef unsigned long long UINT64;
-
- btAlignedObjectArray<btThreadStatus> m_activeThreadStatus;
- // m_mainSemaphoresemaphore will signal, if and how many threads are finished with their work
- sem_t* m_mainSemaphore;
- int m_numThreads;
- UINT64 m_startedThreadsMask;
- void startThreads( const ConstructionInfo& threadInfo );
- void stopThreads();
- int waitForResponse();
+ struct btThreadStatus
+ {
+ int m_taskId;
+ int m_commandId;
+ int m_status;
+
+ ThreadFunc m_userThreadFunc;
+ void* m_userPtr; //for taskDesc etc
+
+ pthread_t thread;
+ //each tread will wait until this signal to start its work
+ sem_t* startSemaphore;
+ btCriticalSection* m_cs;
+ // 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:
+ typedef unsigned long long UINT64;
+
+ btAlignedObjectArray<btThreadStatus> m_activeThreadStatus;
+ // m_mainSemaphoresemaphore will signal, if and how many threads are finished with their work
+ sem_t* m_mainSemaphore;
+ int m_numThreads;
+ UINT64 m_startedThreadsMask;
+ void startThreads(const ConstructionInfo& threadInfo);
+ void stopThreads();
+ int waitForResponse();
+ btCriticalSection* m_cs;
public:
- btThreadSupportPosix( const ConstructionInfo& threadConstructionInfo );
- virtual ~btThreadSupportPosix();
+ btThreadSupportPosix(const ConstructionInfo& threadConstructionInfo);
+ virtual ~btThreadSupportPosix();
- virtual int getNumWorkerThreads() const BT_OVERRIDE { return m_numThreads; }
- // TODO: return the number of logical processors sharing the first L3 cache
- virtual int getCacheFriendlyNumThreads() const BT_OVERRIDE { return m_numThreads + 1; }
- // TODO: detect if CPU has hyperthreading enabled
- virtual int getLogicalToPhysicalCoreRatio() const BT_OVERRIDE { return 1; }
+ virtual int getNumWorkerThreads() const BT_OVERRIDE { return m_numThreads; }
+ // TODO: return the number of logical processors sharing the first L3 cache
+ virtual int getCacheFriendlyNumThreads() const BT_OVERRIDE { return m_numThreads + 1; }
+ // TODO: detect if CPU has hyperthreading enabled
+ virtual int getLogicalToPhysicalCoreRatio() const BT_OVERRIDE { return 1; }
- virtual void runTask( int threadIndex, void* userData ) BT_OVERRIDE;
- virtual void waitForAllTasks() BT_OVERRIDE;
+ virtual void runTask(int threadIndex, void* userData) BT_OVERRIDE;
+ virtual void waitForAllTasks() BT_OVERRIDE;
- virtual btCriticalSection* createCriticalSection() BT_OVERRIDE;
- virtual void deleteCriticalSection( btCriticalSection* criticalSection ) BT_OVERRIDE;
+ virtual btCriticalSection* createCriticalSection() BT_OVERRIDE;
+ virtual void deleteCriticalSection(btCriticalSection* criticalSection) BT_OVERRIDE;
};
-
-#define checkPThreadFunction(returnValue) \
- if(0 != returnValue) { \
- printf("PThread problem at line %i in file %s: %i %d\n", __LINE__, __FILE__, returnValue, errno); \
- }
+#define checkPThreadFunction(returnValue) \
+ if (0 != returnValue) \
+ { \
+ printf("PThread problem at line %i in file %s: %i %d\n", __LINE__, __FILE__, returnValue, errno); \
+ }
// The number of threads should be equal to the number of available cores
// Todo: each worker should be linked to a single core, using SetThreadIdealProcessor.
-
-btThreadSupportPosix::btThreadSupportPosix( const ConstructionInfo& threadConstructionInfo )
+btThreadSupportPosix::btThreadSupportPosix(const ConstructionInfo& threadConstructionInfo)
{
- startThreads( threadConstructionInfo );
+ m_cs = createCriticalSection();
+ startThreads(threadConstructionInfo);
}
// cleanup/shutdown Libspe2
btThreadSupportPosix::~btThreadSupportPosix()
{
- stopThreads();
+ stopThreads();
+ deleteCriticalSection(m_cs);
+ m_cs=0;
}
-#if (defined (__APPLE__))
+#if (defined(__APPLE__))
#define NAMED_SEMAPHORES
#endif
-
-static sem_t* createSem( const char* baseName )
+static sem_t* createSem(const char* baseName)
{
- static int semCount = 0;
+ static int semCount = 0;
#ifdef NAMED_SEMAPHORES
- /// Named semaphore begin
- char name[ 32 ];
- snprintf( name, 32, "/%8.s-%4.d-%4.4d", baseName, getpid(), semCount++ );
- sem_t* tempSem = sem_open( name, O_CREAT, 0600, 0 );
-
- if ( tempSem != reinterpret_cast<sem_t *>( SEM_FAILED ) )
- {
- // printf("Created \"%s\" Semaphore %p\n", name, tempSem);
- }
- else
- {
- //printf("Error creating Semaphore %d\n", errno);
- exit( -1 );
- }
- /// Named semaphore end
+ /// Named semaphore begin
+ char name[32];
+ snprintf(name, 32, "/%8.s-%4.d-%4.4d", baseName, getpid(), semCount++);
+ sem_t* tempSem = sem_open(name, O_CREAT, 0600, 0);
+
+ if (tempSem != reinterpret_cast<sem_t*>(SEM_FAILED))
+ {
+ // printf("Created \"%s\" Semaphore %p\n", name, tempSem);
+ }
+ else
+ {
+ //printf("Error creating Semaphore %d\n", errno);
+ exit(-1);
+ }
+ /// Named semaphore end
#else
- sem_t* tempSem = new sem_t;
- checkPThreadFunction( sem_init( tempSem, 0, 0 ) );
+ sem_t* tempSem = new sem_t;
+ checkPThreadFunction(sem_init(tempSem, 0, 0));
#endif
- return tempSem;
+ return tempSem;
}
-static void destroySem( sem_t* semaphore )
+static void destroySem(sem_t* semaphore)
{
#ifdef NAMED_SEMAPHORES
- checkPThreadFunction( sem_close( semaphore ) );
+ checkPThreadFunction(sem_close(semaphore));
#else
- checkPThreadFunction( sem_destroy( semaphore ) );
- delete semaphore;
+ checkPThreadFunction(sem_destroy(semaphore));
+ delete semaphore;
#endif
}
-static void *threadFunction( void *argument )
+static void* threadFunction(void* argument)
{
- btThreadSupportPosix::btThreadStatus* status = ( btThreadSupportPosix::btThreadStatus* )argument;
-
- while ( 1 )
- {
- checkPThreadFunction( sem_wait( status->startSemaphore ) );
- void* userPtr = status->m_userPtr;
-
- if ( userPtr )
- {
- btAssert( status->m_status );
- status->m_userThreadFunc( userPtr );
- status->m_status = 2;
- checkPThreadFunction( sem_post( status->m_mainSemaphore ) );
- status->threadUsed++;
- }
- else
- {
- //exit Thread
- status->m_status = 3;
- checkPThreadFunction( sem_post( status->m_mainSemaphore ) );
- printf( "Thread with taskId %i exiting\n", status->m_taskId );
- break;
- }
- }
-
- printf( "Thread TERMINATED\n" );
- return 0;
+ btThreadSupportPosix::btThreadStatus* status = (btThreadSupportPosix::btThreadStatus*)argument;
+
+ while (1)
+ {
+ checkPThreadFunction(sem_wait(status->startSemaphore));
+ void* userPtr = status->m_userPtr;
+
+ if (userPtr)
+ {
+ btAssert(status->m_status);
+ status->m_userThreadFunc(userPtr);
+ status->m_cs->lock();
+ status->m_status = 2;
+ status->m_cs->unlock();
+ checkPThreadFunction(sem_post(status->m_mainSemaphore));
+ status->threadUsed++;
+ }
+ else
+ {
+ //exit Thread
+ status->m_cs->lock();
+ status->m_status = 3;
+ status->m_cs->unlock();
+ checkPThreadFunction(sem_post(status->m_mainSemaphore));
+ break;
+ }
+ }
+
+ return 0;
}
///send messages to SPUs
-void btThreadSupportPosix::runTask( int threadIndex, void* userData )
+void btThreadSupportPosix::runTask(int threadIndex, void* userData)
{
- ///we should spawn an SPU task here, and in 'waitForResponse' it should wait for response of the (one of) the first tasks that finished
- btThreadStatus& threadStatus = m_activeThreadStatus[ threadIndex ];
- btAssert( threadIndex >= 0 );
- btAssert( threadIndex < m_activeThreadStatus.size() );
-
- threadStatus.m_commandId = 1;
- threadStatus.m_status = 1;
- threadStatus.m_userPtr = userData;
- m_startedThreadsMask |= UINT64( 1 ) << threadIndex;
-
- // fire event to start new task
- checkPThreadFunction( sem_post( threadStatus.startSemaphore ) );
+ ///we should spawn an SPU task here, and in 'waitForResponse' it should wait for response of the (one of) the first tasks that finished
+ btThreadStatus& threadStatus = m_activeThreadStatus[threadIndex];
+ btAssert(threadIndex >= 0);
+ btAssert(threadIndex < m_activeThreadStatus.size());
+ threadStatus.m_cs = m_cs;
+ threadStatus.m_commandId = 1;
+ threadStatus.m_status = 1;
+ threadStatus.m_userPtr = userData;
+ m_startedThreadsMask |= UINT64(1) << threadIndex;
+
+ // fire event to start new task
+ checkPThreadFunction(sem_post(threadStatus.startSemaphore));
}
-
///check for messages from SPUs
int btThreadSupportPosix::waitForResponse()
{
- ///We should wait for (one of) the first tasks to finish (or other SPU messages), and report its response
- ///A possible response can be 'yes, SPU handled it', or 'no, please do a PPU fallback'
-
- btAssert( m_activeThreadStatus.size() );
-
- // wait for any of the threads to finish
- checkPThreadFunction( sem_wait( m_mainSemaphore ) );
- // get at least one thread which has finished
- size_t last = -1;
-
- for ( size_t t = 0; t < size_t( m_activeThreadStatus.size() ); ++t )
- {
- if ( 2 == m_activeThreadStatus[ t ].m_status )
- {
- last = t;
- break;
- }
- }
-
- btThreadStatus& threadStatus = m_activeThreadStatus[ last ];
-
- btAssert( threadStatus.m_status > 1 );
- threadStatus.m_status = 0;
-
- // need to find an active spu
- btAssert( last >= 0 );
- m_startedThreadsMask &= ~( UINT64( 1 ) << last );
-
- return last;
+ ///We should wait for (one of) the first tasks to finish (or other SPU messages), and report its response
+ ///A possible response can be 'yes, SPU handled it', or 'no, please do a PPU fallback'
+
+ btAssert(m_activeThreadStatus.size());
+
+ // wait for any of the threads to finish
+ checkPThreadFunction(sem_wait(m_mainSemaphore));
+ // get at least one thread which has finished
+ size_t last = -1;
+
+ for (size_t t = 0; t < size_t(m_activeThreadStatus.size()); ++t)
+ {
+ m_cs->lock();
+ bool hasFinished = (2 == m_activeThreadStatus[t].m_status);
+ m_cs->unlock();
+ if (hasFinished)
+ {
+ last = t;
+ break;
+ }
+ }
+
+ btThreadStatus& threadStatus = m_activeThreadStatus[last];
+
+ btAssert(threadStatus.m_status > 1);
+ threadStatus.m_status = 0;
+
+ // need to find an active spu
+ btAssert(last >= 0);
+ m_startedThreadsMask &= ~(UINT64(1) << last);
+
+ return last;
}
-
void btThreadSupportPosix::waitForAllTasks()
{
- while ( m_startedThreadsMask )
- {
- waitForResponse();
- }
+ while (m_startedThreadsMask)
+ {
+ waitForResponse();
+ }
}
-
-void btThreadSupportPosix::startThreads( const ConstructionInfo& threadConstructionInfo )
+void btThreadSupportPosix::startThreads(const ConstructionInfo& threadConstructionInfo)
{
- m_numThreads = btGetNumHardwareThreads() - 1; // main thread exists already
- printf( "%s creating %i threads.\n", __FUNCTION__, m_numThreads );
- m_activeThreadStatus.resize( m_numThreads );
- m_startedThreadsMask = 0;
-
- m_mainSemaphore = createSem( "main" );
- //checkPThreadFunction(sem_wait(mainSemaphore));
-
- for ( int i = 0; i < m_numThreads; i++ )
- {
- printf( "starting thread %d\n", i );
- btThreadStatus& threadStatus = m_activeThreadStatus[ i ];
- threadStatus.startSemaphore = createSem( "threadLocal" );
- checkPThreadFunction( pthread_create( &threadStatus.thread, NULL, &threadFunction, (void*) &threadStatus ) );
-
- threadStatus.m_userPtr = 0;
- threadStatus.m_taskId = i;
- threadStatus.m_commandId = 0;
- threadStatus.m_status = 0;
- threadStatus.m_mainSemaphore = m_mainSemaphore;
- threadStatus.m_userThreadFunc = threadConstructionInfo.m_userThreadFunc;
- threadStatus.threadUsed = 0;
-
- printf( "started thread %d \n", i );
- }
+ m_numThreads = btGetNumHardwareThreads() - 1; // main thread exists already
+ m_activeThreadStatus.resize(m_numThreads);
+ m_startedThreadsMask = 0;
+
+ m_mainSemaphore = createSem("main");
+ //checkPThreadFunction(sem_wait(mainSemaphore));
+
+ for (int i = 0; i < m_numThreads; i++)
+ {
+ btThreadStatus& threadStatus = m_activeThreadStatus[i];
+ threadStatus.startSemaphore = createSem("threadLocal");
+ threadStatus.m_userPtr = 0;
+ threadStatus.m_cs = m_cs;
+ threadStatus.m_taskId = i;
+ threadStatus.m_commandId = 0;
+ threadStatus.m_status = 0;
+ threadStatus.m_mainSemaphore = m_mainSemaphore;
+ threadStatus.m_userThreadFunc = threadConstructionInfo.m_userThreadFunc;
+ threadStatus.threadUsed = 0;
+ checkPThreadFunction(pthread_create(&threadStatus.thread, NULL, &threadFunction, (void*)&threadStatus));
+
+ }
}
///tell the task scheduler we are done with the SPU tasks
void btThreadSupportPosix::stopThreads()
{
- for ( size_t t = 0; t < size_t( m_activeThreadStatus.size() ); ++t )
- {
- btThreadStatus& threadStatus = m_activeThreadStatus[ t ];
- printf( "%s: Thread %i used: %ld\n", __FUNCTION__, int( t ), threadStatus.threadUsed );
-
- threadStatus.m_userPtr = 0;
- checkPThreadFunction( sem_post( threadStatus.startSemaphore ) );
- checkPThreadFunction( sem_wait( m_mainSemaphore ) );
-
- printf( "destroy semaphore\n" );
- destroySem( threadStatus.startSemaphore );
- printf( "semaphore destroyed\n" );
- checkPThreadFunction( pthread_join( threadStatus.thread, 0 ) );
-
- }
- printf( "destroy main semaphore\n" );
- destroySem( m_mainSemaphore );
- printf( "main semaphore destroyed\n" );
- m_activeThreadStatus.clear();
+ for (size_t t = 0; t < size_t(m_activeThreadStatus.size()); ++t)
+ {
+ btThreadStatus& threadStatus = m_activeThreadStatus[t];
+
+ threadStatus.m_userPtr = 0;
+ checkPThreadFunction(sem_post(threadStatus.startSemaphore));
+ checkPThreadFunction(sem_wait(m_mainSemaphore));
+
+ destroySem(threadStatus.startSemaphore);
+ checkPThreadFunction(pthread_join(threadStatus.thread, 0));
+ }
+ destroySem(m_mainSemaphore);
+ m_activeThreadStatus.clear();
}
class btCriticalSectionPosix : public btCriticalSection
{
- pthread_mutex_t m_mutex;
+ pthread_mutex_t m_mutex;
public:
- btCriticalSectionPosix()
- {
- pthread_mutex_init( &m_mutex, NULL );
- }
- virtual ~btCriticalSectionPosix()
- {
- pthread_mutex_destroy( &m_mutex );
- }
-
- virtual void lock()
- {
- pthread_mutex_lock( &m_mutex );
- }
- virtual void unlock()
- {
- pthread_mutex_unlock( &m_mutex );
- }
+ btCriticalSectionPosix()
+ {
+ pthread_mutex_init(&m_mutex, NULL);
+ }
+ virtual ~btCriticalSectionPosix()
+ {
+ pthread_mutex_destroy(&m_mutex);
+ }
+
+ virtual void lock()
+ {
+ pthread_mutex_lock(&m_mutex);
+ }
+ virtual void unlock()
+ {
+ pthread_mutex_unlock(&m_mutex);
+ }
};
-
btCriticalSection* btThreadSupportPosix::createCriticalSection()
{
- return new btCriticalSectionPosix();
+ return new btCriticalSectionPosix();
}
-void btThreadSupportPosix::deleteCriticalSection( btCriticalSection* cs )
+void btThreadSupportPosix::deleteCriticalSection(btCriticalSection* cs)
{
- delete cs;
+ delete cs;
}
-
-btThreadSupportInterface* btThreadSupportInterface::create( const ConstructionInfo& info )
+btThreadSupportInterface* btThreadSupportInterface::create(const ConstructionInfo& info)
{
- return new btThreadSupportPosix( info );
+ return new btThreadSupportPosix(info);
}
-#endif // BT_THREADSAFE && !defined( _WIN32 )
-
+#endif // BT_THREADSAFE && !defined( _WIN32 )
diff --git a/thirdparty/bullet/LinearMath/TaskScheduler/btThreadSupportWin32.cpp b/thirdparty/bullet/LinearMath/TaskScheduler/btThreadSupportWin32.cpp
index 00edac650b..922e449cce 100644
--- a/thirdparty/bullet/LinearMath/TaskScheduler/btThreadSupportWin32.cpp
+++ b/thirdparty/bullet/LinearMath/TaskScheduler/btThreadSupportWin32.cpp
@@ -13,7 +13,7 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-#if defined( _WIN32 ) && BT_THREADSAFE
+#if defined(_WIN32) && BT_THREADSAFE
#include "LinearMath/btScalar.h"
#include "LinearMath/btMinMax.h"
@@ -23,450 +23,430 @@ subject to the following restrictions:
#include <windows.h>
#include <stdio.h>
-
struct btProcessorInfo
{
- int numLogicalProcessors;
- int numCores;
- int numNumaNodes;
- int numL1Cache;
- int numL2Cache;
- int numL3Cache;
- int numPhysicalPackages;
- static const int maxNumTeamMasks = 32;
- int numTeamMasks;
- UINT64 processorTeamMasks[ maxNumTeamMasks ];
+ int numLogicalProcessors;
+ int numCores;
+ int numNumaNodes;
+ int numL1Cache;
+ int numL2Cache;
+ int numL3Cache;
+ int numPhysicalPackages;
+ static const int maxNumTeamMasks = 32;
+ int numTeamMasks;
+ UINT64 processorTeamMasks[maxNumTeamMasks];
};
-UINT64 getProcessorTeamMask( const btProcessorInfo& procInfo, int procId )
+UINT64 getProcessorTeamMask(const btProcessorInfo& procInfo, int procId)
{
- UINT64 procMask = UINT64( 1 ) << procId;
- for ( int i = 0; i < procInfo.numTeamMasks; ++i )
- {
- if ( procMask & procInfo.processorTeamMasks[ i ] )
- {
- return procInfo.processorTeamMasks[ i ];
- }
- }
- return 0;
+ UINT64 procMask = UINT64(1) << procId;
+ for (int i = 0; i < procInfo.numTeamMasks; ++i)
+ {
+ if (procMask & procInfo.processorTeamMasks[i])
+ {
+ return procInfo.processorTeamMasks[i];
+ }
+ }
+ return 0;
}
-int getProcessorTeamIndex( const btProcessorInfo& procInfo, int procId )
+int getProcessorTeamIndex(const btProcessorInfo& procInfo, int procId)
{
- UINT64 procMask = UINT64( 1 ) << procId;
- for ( int i = 0; i < procInfo.numTeamMasks; ++i )
- {
- if ( procMask & procInfo.processorTeamMasks[ i ] )
- {
- return i;
- }
- }
- return -1;
+ UINT64 procMask = UINT64(1) << procId;
+ for (int i = 0; i < procInfo.numTeamMasks; ++i)
+ {
+ if (procMask & procInfo.processorTeamMasks[i])
+ {
+ return i;
+ }
+ }
+ return -1;
}
-int countSetBits( ULONG64 bits )
+int countSetBits(ULONG64 bits)
{
- int count = 0;
- while ( bits )
- {
- if ( bits & 1 )
- {
- count++;
- }
- bits >>= 1;
- }
- return count;
+ int count = 0;
+ while (bits)
+ {
+ if (bits & 1)
+ {
+ count++;
+ }
+ bits >>= 1;
+ }
+ return count;
}
+typedef BOOL(WINAPI* Pfn_GetLogicalProcessorInformation)(PSYSTEM_LOGICAL_PROCESSOR_INFORMATION, PDWORD);
-typedef BOOL( WINAPI *Pfn_GetLogicalProcessorInformation )( PSYSTEM_LOGICAL_PROCESSOR_INFORMATION, PDWORD );
-
-
-void getProcessorInformation( btProcessorInfo* procInfo )
+void getProcessorInformation(btProcessorInfo* procInfo)
{
- memset( procInfo, 0, sizeof( *procInfo ) );
- Pfn_GetLogicalProcessorInformation getLogicalProcInfo =
- (Pfn_GetLogicalProcessorInformation) GetProcAddress( GetModuleHandle( TEXT( "kernel32" ) ), "GetLogicalProcessorInformation" );
- if ( getLogicalProcInfo == NULL )
- {
- // no info
- return;
- }
- PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buf = NULL;
- DWORD bufSize = 0;
- while ( true )
- {
- if ( getLogicalProcInfo( buf, &bufSize ) )
- {
- break;
- }
- else
- {
- if ( GetLastError() == ERROR_INSUFFICIENT_BUFFER )
- {
- if ( buf )
- {
- free( buf );
- }
- buf = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION) malloc( bufSize );
- }
- }
- }
-
- int len = bufSize / sizeof( *buf );
- for ( int i = 0; i < len; ++i )
- {
- PSYSTEM_LOGICAL_PROCESSOR_INFORMATION info = buf + i;
- switch ( info->Relationship )
- {
- case RelationNumaNode:
- procInfo->numNumaNodes++;
- break;
-
- case RelationProcessorCore:
- procInfo->numCores++;
- procInfo->numLogicalProcessors += countSetBits( info->ProcessorMask );
- break;
-
- case RelationCache:
- if ( info->Cache.Level == 1 )
- {
- procInfo->numL1Cache++;
- }
- else if ( info->Cache.Level == 2 )
- {
- procInfo->numL2Cache++;
- }
- else if ( info->Cache.Level == 3 )
- {
- procInfo->numL3Cache++;
- // processors that share L3 cache are considered to be on the same team
- // because they can more easily work together on the same data.
- // Large performance penalties will occur if 2 or more threads from different
- // teams attempt to frequently read and modify the same cache lines.
- //
- // On the AMD Ryzen 7 CPU for example, the 8 cores on the CPU are split into
- // 2 CCX units of 4 cores each. Each CCX has a separate L3 cache, so if both
- // CCXs are operating on the same data, many cycles will be spent keeping the
- // two caches coherent.
- if ( procInfo->numTeamMasks < btProcessorInfo::maxNumTeamMasks )
- {
- procInfo->processorTeamMasks[ procInfo->numTeamMasks ] = info->ProcessorMask;
- procInfo->numTeamMasks++;
- }
- }
- break;
-
- case RelationProcessorPackage:
- procInfo->numPhysicalPackages++;
- break;
- }
- }
- free( buf );
+ memset(procInfo, 0, sizeof(*procInfo));
+ Pfn_GetLogicalProcessorInformation getLogicalProcInfo =
+ (Pfn_GetLogicalProcessorInformation)GetProcAddress(GetModuleHandle(TEXT("kernel32")), "GetLogicalProcessorInformation");
+ if (getLogicalProcInfo == NULL)
+ {
+ // no info
+ return;
+ }
+ PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buf = NULL;
+ DWORD bufSize = 0;
+ while (true)
+ {
+ if (getLogicalProcInfo(buf, &bufSize))
+ {
+ break;
+ }
+ else
+ {
+ if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
+ {
+ if (buf)
+ {
+ free(buf);
+ }
+ buf = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)malloc(bufSize);
+ }
+ }
+ }
+
+ int len = bufSize / sizeof(*buf);
+ for (int i = 0; i < len; ++i)
+ {
+ PSYSTEM_LOGICAL_PROCESSOR_INFORMATION info = buf + i;
+ switch (info->Relationship)
+ {
+ case RelationNumaNode:
+ procInfo->numNumaNodes++;
+ break;
+
+ case RelationProcessorCore:
+ procInfo->numCores++;
+ procInfo->numLogicalProcessors += countSetBits(info->ProcessorMask);
+ break;
+
+ case RelationCache:
+ if (info->Cache.Level == 1)
+ {
+ procInfo->numL1Cache++;
+ }
+ else if (info->Cache.Level == 2)
+ {
+ procInfo->numL2Cache++;
+ }
+ else if (info->Cache.Level == 3)
+ {
+ procInfo->numL3Cache++;
+ // processors that share L3 cache are considered to be on the same team
+ // because they can more easily work together on the same data.
+ // Large performance penalties will occur if 2 or more threads from different
+ // teams attempt to frequently read and modify the same cache lines.
+ //
+ // On the AMD Ryzen 7 CPU for example, the 8 cores on the CPU are split into
+ // 2 CCX units of 4 cores each. Each CCX has a separate L3 cache, so if both
+ // CCXs are operating on the same data, many cycles will be spent keeping the
+ // two caches coherent.
+ if (procInfo->numTeamMasks < btProcessorInfo::maxNumTeamMasks)
+ {
+ procInfo->processorTeamMasks[procInfo->numTeamMasks] = info->ProcessorMask;
+ procInfo->numTeamMasks++;
+ }
+ }
+ break;
+
+ case RelationProcessorPackage:
+ procInfo->numPhysicalPackages++;
+ break;
+ }
+ }
+ free(buf);
}
-
-
///btThreadSupportWin32 helps to initialize/shutdown libspe2, start/stop SPU tasks and communication
class btThreadSupportWin32 : public btThreadSupportInterface
{
public:
- struct btThreadStatus
- {
- int m_taskId;
- int m_commandId;
- int m_status;
+ struct btThreadStatus
+ {
+ int m_taskId;
+ int m_commandId;
+ int m_status;
- ThreadFunc m_userThreadFunc;
- void* m_userPtr; //for taskDesc etc
+ ThreadFunc m_userThreadFunc;
+ void* m_userPtr; //for taskDesc etc
- void* m_threadHandle; //this one is calling 'Win32ThreadFunc'
+ void* m_threadHandle; //this one is calling 'Win32ThreadFunc'
- void* m_eventStartHandle;
- char m_eventStartHandleName[ 32 ];
+ void* m_eventStartHandle;
+ char m_eventStartHandleName[32];
- void* m_eventCompleteHandle;
- char m_eventCompleteHandleName[ 32 ];
- };
+ void* m_eventCompleteHandle;
+ char m_eventCompleteHandleName[32];
+ };
private:
- btAlignedObjectArray<btThreadStatus> m_activeThreadStatus;
- btAlignedObjectArray<void*> m_completeHandles;
- int m_numThreads;
- DWORD_PTR m_startedThreadMask;
- btProcessorInfo m_processorInfo;
+ btAlignedObjectArray<btThreadStatus> m_activeThreadStatus;
+ btAlignedObjectArray<void*> m_completeHandles;
+ int m_numThreads;
+ DWORD_PTR m_startedThreadMask;
+ btProcessorInfo m_processorInfo;
- void startThreads( const ConstructionInfo& threadInfo );
- void stopThreads();
- int waitForResponse();
+ void startThreads(const ConstructionInfo& threadInfo);
+ void stopThreads();
+ int waitForResponse();
public:
+ btThreadSupportWin32(const ConstructionInfo& threadConstructionInfo);
+ virtual ~btThreadSupportWin32();
- btThreadSupportWin32( const ConstructionInfo& threadConstructionInfo );
- virtual ~btThreadSupportWin32();
+ virtual int getNumWorkerThreads() const BT_OVERRIDE { return m_numThreads; }
+ virtual int getCacheFriendlyNumThreads() const BT_OVERRIDE { return countSetBits(m_processorInfo.processorTeamMasks[0]); }
+ virtual int getLogicalToPhysicalCoreRatio() const BT_OVERRIDE { return m_processorInfo.numLogicalProcessors / m_processorInfo.numCores; }
- virtual int getNumWorkerThreads() const BT_OVERRIDE { return m_numThreads; }
- virtual int getCacheFriendlyNumThreads() const BT_OVERRIDE { return countSetBits(m_processorInfo.processorTeamMasks[0]); }
- virtual int getLogicalToPhysicalCoreRatio() const BT_OVERRIDE { return m_processorInfo.numLogicalProcessors / m_processorInfo.numCores; }
+ virtual void runTask(int threadIndex, void* userData) BT_OVERRIDE;
+ virtual void waitForAllTasks() BT_OVERRIDE;
- virtual void runTask( int threadIndex, void* userData ) BT_OVERRIDE;
- virtual void waitForAllTasks() BT_OVERRIDE;
-
- virtual btCriticalSection* createCriticalSection() BT_OVERRIDE;
- virtual void deleteCriticalSection( btCriticalSection* criticalSection ) BT_OVERRIDE;
+ virtual btCriticalSection* createCriticalSection() BT_OVERRIDE;
+ virtual void deleteCriticalSection(btCriticalSection* criticalSection) BT_OVERRIDE;
};
-
-btThreadSupportWin32::btThreadSupportWin32( const ConstructionInfo & threadConstructionInfo )
+btThreadSupportWin32::btThreadSupportWin32(const ConstructionInfo& threadConstructionInfo)
{
- startThreads( threadConstructionInfo );
+ startThreads(threadConstructionInfo);
}
-
btThreadSupportWin32::~btThreadSupportWin32()
{
- stopThreads();
+ stopThreads();
}
-
-DWORD WINAPI win32threadStartFunc( LPVOID lpParam )
+DWORD WINAPI win32threadStartFunc(LPVOID lpParam)
{
- btThreadSupportWin32::btThreadStatus* status = ( btThreadSupportWin32::btThreadStatus* )lpParam;
-
- while ( 1 )
- {
- WaitForSingleObject( status->m_eventStartHandle, INFINITE );
- void* userPtr = status->m_userPtr;
-
- if ( userPtr )
- {
- btAssert( status->m_status );
- status->m_userThreadFunc( userPtr );
- status->m_status = 2;
- SetEvent( status->m_eventCompleteHandle );
- }
- else
- {
- //exit Thread
- status->m_status = 3;
- printf( "Thread with taskId %i with handle %p exiting\n", status->m_taskId, status->m_threadHandle );
- SetEvent( status->m_eventCompleteHandle );
- break;
- }
- }
- printf( "Thread TERMINATED\n" );
- return 0;
+ btThreadSupportWin32::btThreadStatus* status = (btThreadSupportWin32::btThreadStatus*)lpParam;
+
+ while (1)
+ {
+ WaitForSingleObject(status->m_eventStartHandle, INFINITE);
+ void* userPtr = status->m_userPtr;
+
+ if (userPtr)
+ {
+ btAssert(status->m_status);
+ status->m_userThreadFunc(userPtr);
+ status->m_status = 2;
+ SetEvent(status->m_eventCompleteHandle);
+ }
+ else
+ {
+ //exit Thread
+ status->m_status = 3;
+ printf("Thread with taskId %i with handle %p exiting\n", status->m_taskId, status->m_threadHandle);
+ SetEvent(status->m_eventCompleteHandle);
+ break;
+ }
+ }
+ printf("Thread TERMINATED\n");
+ return 0;
}
-
-void btThreadSupportWin32::runTask( int threadIndex, void* userData )
+void btThreadSupportWin32::runTask(int threadIndex, void* userData)
{
- btThreadStatus& threadStatus = m_activeThreadStatus[ threadIndex ];
- btAssert( threadIndex >= 0 );
- btAssert( int( threadIndex ) < m_activeThreadStatus.size() );
+ btThreadStatus& threadStatus = m_activeThreadStatus[threadIndex];
+ btAssert(threadIndex >= 0);
+ btAssert(int(threadIndex) < m_activeThreadStatus.size());
- threadStatus.m_commandId = 1;
- threadStatus.m_status = 1;
- threadStatus.m_userPtr = userData;
- m_startedThreadMask |= DWORD_PTR( 1 ) << threadIndex;
+ threadStatus.m_commandId = 1;
+ threadStatus.m_status = 1;
+ threadStatus.m_userPtr = userData;
+ m_startedThreadMask |= DWORD_PTR(1) << threadIndex;
- ///fire event to start new task
- SetEvent( threadStatus.m_eventStartHandle );
+ ///fire event to start new task
+ SetEvent(threadStatus.m_eventStartHandle);
}
-
int btThreadSupportWin32::waitForResponse()
{
- btAssert( m_activeThreadStatus.size() );
+ btAssert(m_activeThreadStatus.size());
- int last = -1;
- DWORD res = WaitForMultipleObjects( m_completeHandles.size(), &m_completeHandles[ 0 ], FALSE, INFINITE );
- btAssert( res != WAIT_FAILED );
- last = res - WAIT_OBJECT_0;
+ int last = -1;
+ DWORD res = WaitForMultipleObjects(m_completeHandles.size(), &m_completeHandles[0], FALSE, INFINITE);
+ btAssert(res != WAIT_FAILED);
+ last = res - WAIT_OBJECT_0;
- btThreadStatus& threadStatus = m_activeThreadStatus[ last ];
- btAssert( threadStatus.m_threadHandle );
- btAssert( threadStatus.m_eventCompleteHandle );
+ btThreadStatus& threadStatus = m_activeThreadStatus[last];
+ btAssert(threadStatus.m_threadHandle);
+ btAssert(threadStatus.m_eventCompleteHandle);
- //WaitForSingleObject(threadStatus.m_eventCompleteHandle, INFINITE);
- btAssert( threadStatus.m_status > 1 );
- threadStatus.m_status = 0;
+ //WaitForSingleObject(threadStatus.m_eventCompleteHandle, INFINITE);
+ btAssert(threadStatus.m_status > 1);
+ threadStatus.m_status = 0;
- ///need to find an active spu
- btAssert( last >= 0 );
- m_startedThreadMask &= ~( DWORD_PTR( 1 ) << last );
+ ///need to find an active spu
+ btAssert(last >= 0);
+ m_startedThreadMask &= ~(DWORD_PTR(1) << last);
- return last;
+ return last;
}
-
void btThreadSupportWin32::waitForAllTasks()
{
- while ( m_startedThreadMask )
- {
- waitForResponse();
- }
+ while (m_startedThreadMask)
+ {
+ waitForResponse();
+ }
}
-
-void btThreadSupportWin32::startThreads( const ConstructionInfo& threadConstructionInfo )
+void btThreadSupportWin32::startThreads(const ConstructionInfo& threadConstructionInfo)
{
- static int uniqueId = 0;
- uniqueId++;
- btProcessorInfo& procInfo = m_processorInfo;
- getProcessorInformation( &procInfo );
- DWORD_PTR dwProcessAffinityMask = 0;
- DWORD_PTR dwSystemAffinityMask = 0;
- if ( !GetProcessAffinityMask( GetCurrentProcess(), &dwProcessAffinityMask, &dwSystemAffinityMask ) )
- {
- dwProcessAffinityMask = 0;
- }
- ///The number of threads should be equal to the number of available cores - 1
- m_numThreads = btMin(procInfo.numLogicalProcessors, int(BT_MAX_THREAD_COUNT)) - 1; // cap to max thread count (-1 because main thread already exists)
-
- m_activeThreadStatus.resize( m_numThreads );
- m_completeHandles.resize( m_numThreads );
- m_startedThreadMask = 0;
-
- // set main thread affinity
- if ( DWORD_PTR mask = dwProcessAffinityMask & getProcessorTeamMask( procInfo, 0 ))
- {
- SetThreadAffinityMask( GetCurrentThread(), mask );
- SetThreadIdealProcessor( GetCurrentThread(), 0 );
- }
-
- for ( int i = 0; i < m_numThreads; i++ )
- {
- printf( "starting thread %d\n", i );
-
- btThreadStatus& threadStatus = m_activeThreadStatus[ i ];
-
- LPSECURITY_ATTRIBUTES lpThreadAttributes = NULL;
- SIZE_T dwStackSize = threadConstructionInfo.m_threadStackSize;
- LPTHREAD_START_ROUTINE lpStartAddress = &win32threadStartFunc;
- LPVOID lpParameter = &threadStatus;
- DWORD dwCreationFlags = 0;
- LPDWORD lpThreadId = 0;
-
- threadStatus.m_userPtr = 0;
-
- sprintf( threadStatus.m_eventStartHandleName, "es%.8s%d%d", threadConstructionInfo.m_uniqueName, uniqueId, i );
- threadStatus.m_eventStartHandle = CreateEventA( 0, false, false, threadStatus.m_eventStartHandleName );
-
- sprintf( threadStatus.m_eventCompleteHandleName, "ec%.8s%d%d", threadConstructionInfo.m_uniqueName, uniqueId, i );
- threadStatus.m_eventCompleteHandle = CreateEventA( 0, false, false, threadStatus.m_eventCompleteHandleName );
-
- m_completeHandles[ i ] = threadStatus.m_eventCompleteHandle;
-
- HANDLE handle = CreateThread( lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpThreadId );
- //SetThreadPriority( handle, THREAD_PRIORITY_HIGHEST );
- // highest priority -- can cause erratic performance when numThreads > numCores
- // we don't want worker threads to be higher priority than the main thread or the main thread could get
- // totally shut out and unable to tell the workers to stop
- //SetThreadPriority( handle, THREAD_PRIORITY_BELOW_NORMAL );
-
- {
- int processorId = i + 1; // leave processor 0 for main thread
- DWORD_PTR teamMask = getProcessorTeamMask( procInfo, processorId );
- if ( teamMask )
- {
- // bind each thread to only execute on processors of it's assigned team
- // - for single-socket Intel x86 CPUs this has no effect (only a single, shared L3 cache so there is only 1 team)
- // - for multi-socket Intel this will keep threads from migrating from one socket to another
- // - for AMD Ryzen this will keep threads from migrating from one CCX to another
- DWORD_PTR mask = teamMask & dwProcessAffinityMask;
- if ( mask )
- {
- SetThreadAffinityMask( handle, mask );
- }
- }
- SetThreadIdealProcessor( handle, processorId );
- }
-
- threadStatus.m_taskId = i;
- threadStatus.m_commandId = 0;
- threadStatus.m_status = 0;
- threadStatus.m_threadHandle = handle;
- threadStatus.m_userThreadFunc = threadConstructionInfo.m_userThreadFunc;
-
- printf( "started %s thread %d with threadHandle %p\n", threadConstructionInfo.m_uniqueName, i, handle );
- }
+ static int uniqueId = 0;
+ uniqueId++;
+ btProcessorInfo& procInfo = m_processorInfo;
+ getProcessorInformation(&procInfo);
+ DWORD_PTR dwProcessAffinityMask = 0;
+ DWORD_PTR dwSystemAffinityMask = 0;
+ if (!GetProcessAffinityMask(GetCurrentProcess(), &dwProcessAffinityMask, &dwSystemAffinityMask))
+ {
+ dwProcessAffinityMask = 0;
+ }
+ ///The number of threads should be equal to the number of available cores - 1
+ m_numThreads = btMin(procInfo.numLogicalProcessors, int(BT_MAX_THREAD_COUNT)) - 1; // cap to max thread count (-1 because main thread already exists)
+
+ m_activeThreadStatus.resize(m_numThreads);
+ m_completeHandles.resize(m_numThreads);
+ m_startedThreadMask = 0;
+
+ // set main thread affinity
+ if (DWORD_PTR mask = dwProcessAffinityMask & getProcessorTeamMask(procInfo, 0))
+ {
+ SetThreadAffinityMask(GetCurrentThread(), mask);
+ SetThreadIdealProcessor(GetCurrentThread(), 0);
+ }
+
+ for (int i = 0; i < m_numThreads; i++)
+ {
+ printf("starting thread %d\n", i);
+
+ btThreadStatus& threadStatus = m_activeThreadStatus[i];
+
+ LPSECURITY_ATTRIBUTES lpThreadAttributes = NULL;
+ SIZE_T dwStackSize = threadConstructionInfo.m_threadStackSize;
+ LPTHREAD_START_ROUTINE lpStartAddress = &win32threadStartFunc;
+ LPVOID lpParameter = &threadStatus;
+ DWORD dwCreationFlags = 0;
+ LPDWORD lpThreadId = 0;
+
+ threadStatus.m_userPtr = 0;
+
+ sprintf(threadStatus.m_eventStartHandleName, "es%.8s%d%d", threadConstructionInfo.m_uniqueName, uniqueId, i);
+ threadStatus.m_eventStartHandle = CreateEventA(0, false, false, threadStatus.m_eventStartHandleName);
+
+ sprintf(threadStatus.m_eventCompleteHandleName, "ec%.8s%d%d", threadConstructionInfo.m_uniqueName, uniqueId, i);
+ threadStatus.m_eventCompleteHandle = CreateEventA(0, false, false, threadStatus.m_eventCompleteHandleName);
+
+ m_completeHandles[i] = threadStatus.m_eventCompleteHandle;
+
+ HANDLE handle = CreateThread(lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpThreadId);
+ //SetThreadPriority( handle, THREAD_PRIORITY_HIGHEST );
+ // highest priority -- can cause erratic performance when numThreads > numCores
+ // we don't want worker threads to be higher priority than the main thread or the main thread could get
+ // totally shut out and unable to tell the workers to stop
+ //SetThreadPriority( handle, THREAD_PRIORITY_BELOW_NORMAL );
+
+ {
+ int processorId = i + 1; // leave processor 0 for main thread
+ DWORD_PTR teamMask = getProcessorTeamMask(procInfo, processorId);
+ if (teamMask)
+ {
+ // bind each thread to only execute on processors of it's assigned team
+ // - for single-socket Intel x86 CPUs this has no effect (only a single, shared L3 cache so there is only 1 team)
+ // - for multi-socket Intel this will keep threads from migrating from one socket to another
+ // - for AMD Ryzen this will keep threads from migrating from one CCX to another
+ DWORD_PTR mask = teamMask & dwProcessAffinityMask;
+ if (mask)
+ {
+ SetThreadAffinityMask(handle, mask);
+ }
+ }
+ SetThreadIdealProcessor(handle, processorId);
+ }
+
+ threadStatus.m_taskId = i;
+ threadStatus.m_commandId = 0;
+ threadStatus.m_status = 0;
+ threadStatus.m_threadHandle = handle;
+ threadStatus.m_userThreadFunc = threadConstructionInfo.m_userThreadFunc;
+
+ printf("started %s thread %d with threadHandle %p\n", threadConstructionInfo.m_uniqueName, i, handle);
+ }
}
///tell the task scheduler we are done with the SPU tasks
void btThreadSupportWin32::stopThreads()
{
- for ( int i = 0; i < m_activeThreadStatus.size(); i++ )
- {
- btThreadStatus& threadStatus = m_activeThreadStatus[ i ];
- if ( threadStatus.m_status > 0 )
- {
- WaitForSingleObject( threadStatus.m_eventCompleteHandle, INFINITE );
- }
-
- threadStatus.m_userPtr = NULL;
- SetEvent( threadStatus.m_eventStartHandle );
- WaitForSingleObject( threadStatus.m_eventCompleteHandle, INFINITE );
-
- CloseHandle( threadStatus.m_eventCompleteHandle );
- CloseHandle( threadStatus.m_eventStartHandle );
- CloseHandle( threadStatus.m_threadHandle );
-
- }
-
- m_activeThreadStatus.clear();
- m_completeHandles.clear();
+ for (int i = 0; i < m_activeThreadStatus.size(); i++)
+ {
+ btThreadStatus& threadStatus = m_activeThreadStatus[i];
+ if (threadStatus.m_status > 0)
+ {
+ WaitForSingleObject(threadStatus.m_eventCompleteHandle, INFINITE);
+ }
+
+ threadStatus.m_userPtr = NULL;
+ SetEvent(threadStatus.m_eventStartHandle);
+ WaitForSingleObject(threadStatus.m_eventCompleteHandle, INFINITE);
+
+ CloseHandle(threadStatus.m_eventCompleteHandle);
+ CloseHandle(threadStatus.m_eventStartHandle);
+ CloseHandle(threadStatus.m_threadHandle);
+ }
+
+ m_activeThreadStatus.clear();
+ m_completeHandles.clear();
}
-
class btWin32CriticalSection : public btCriticalSection
{
private:
- CRITICAL_SECTION mCriticalSection;
+ CRITICAL_SECTION mCriticalSection;
public:
- btWin32CriticalSection()
- {
- InitializeCriticalSection( &mCriticalSection );
- }
-
- ~btWin32CriticalSection()
- {
- DeleteCriticalSection( &mCriticalSection );
- }
-
- void lock()
- {
- EnterCriticalSection( &mCriticalSection );
- }
-
- void unlock()
- {
- LeaveCriticalSection( &mCriticalSection );
- }
+ btWin32CriticalSection()
+ {
+ InitializeCriticalSection(&mCriticalSection);
+ }
+
+ ~btWin32CriticalSection()
+ {
+ DeleteCriticalSection(&mCriticalSection);
+ }
+
+ void lock()
+ {
+ EnterCriticalSection(&mCriticalSection);
+ }
+
+ void unlock()
+ {
+ LeaveCriticalSection(&mCriticalSection);
+ }
};
-
btCriticalSection* btThreadSupportWin32::createCriticalSection()
{
- unsigned char* mem = (unsigned char*) btAlignedAlloc( sizeof( btWin32CriticalSection ), 16 );
- btWin32CriticalSection* cs = new( mem ) btWin32CriticalSection();
- return cs;
+ unsigned char* mem = (unsigned char*)btAlignedAlloc(sizeof(btWin32CriticalSection), 16);
+ btWin32CriticalSection* cs = new (mem) btWin32CriticalSection();
+ return cs;
}
-void btThreadSupportWin32::deleteCriticalSection( btCriticalSection* criticalSection )
+void btThreadSupportWin32::deleteCriticalSection(btCriticalSection* criticalSection)
{
- criticalSection->~btCriticalSection();
- btAlignedFree( criticalSection );
+ criticalSection->~btCriticalSection();
+ btAlignedFree(criticalSection);
}
-
-btThreadSupportInterface* btThreadSupportInterface::create( const ConstructionInfo& info )
+btThreadSupportInterface* btThreadSupportInterface::create(const ConstructionInfo& info)
{
- return new btThreadSupportWin32( info );
+ return new btThreadSupportWin32(info);
}
-
-
-#endif //defined(_WIN32) && BT_THREADSAFE
-
+#endif //defined(_WIN32) && BT_THREADSAFE
diff --git a/thirdparty/bullet/LinearMath/btAabbUtil2.h b/thirdparty/bullet/LinearMath/btAabbUtil2.h
index d2997b4e65..eea49dd33f 100644
--- a/thirdparty/bullet/LinearMath/btAabbUtil2.h
+++ b/thirdparty/bullet/LinearMath/btAabbUtil2.h
@@ -12,8 +12,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
-
#ifndef BT_AABB_UTIL2
#define BT_AABB_UTIL2
@@ -21,20 +19,18 @@ subject to the following restrictions:
#include "btVector3.h"
#include "btMinMax.h"
-
-
-SIMD_FORCE_INLINE void AabbExpand (btVector3& aabbMin,
- btVector3& aabbMax,
- const btVector3& expansionMin,
- const btVector3& expansionMax)
+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)
+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;
@@ -43,10 +39,9 @@ SIMD_FORCE_INLINE bool TestPointAgainstAabb2(const btVector3 &aabbMin1, const bt
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)
+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;
@@ -56,37 +51,34 @@ SIMD_FORCE_INLINE bool TestAabbAgainstAabb2(const btVector3 &aabbMin1, const btV
}
/// conservative test for overlap between triangle and aabb
-SIMD_FORCE_INLINE bool TestTriangleAgainstAabb2(const btVector3 *vertices,
- const btVector3 &aabbMin, const btVector3 &aabbMax)
+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];
+ 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)
+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);
+ 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],
@@ -97,11 +89,11 @@ SIMD_FORCE_INLINE bool btRayAabb2(const btVector3& rayFrom,
{
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();
+ 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();
+ tymax = (bounds[1 - raySign[1]].getY() - rayFrom.getY()) * rayInvDirection.getY();
- if ( (tmin > tymax) || (tymin > tmax) )
+ if ((tmin > tymax) || (tymin > tmax))
return false;
if (tymin > tmin)
@@ -111,59 +103,59 @@ SIMD_FORCE_INLINE bool btRayAabb2(const btVector3& rayFrom,
tmax = tymax;
tzmin = (bounds[raySign[2]].getZ() - rayFrom.getZ()) * rayInvDirection.getZ();
- tzmax = (bounds[1-raySign[2]].getZ() - rayFrom.getZ()) * rayInvDirection.getZ();
+ tzmax = (bounds[1 - raySign[2]].getZ() - rayFrom.getZ()) * rayInvDirection.getZ();
- if ( (tmin > tzmax) || (tzmin > tmax) )
+ if ((tmin > tzmax) || (tzmin > tmax))
return false;
if (tzmin > tmin)
tmin = tzmin;
if (tzmax < tmax)
tmax = tzmax;
- return ( (tmin < lambda_max) && (tmax > lambda_min) );
+ return ((tmin < lambda_max) && (tmax > lambda_min));
}
-SIMD_FORCE_INLINE bool btRayAabb(const btVector3& rayFrom,
- const btVector3& rayTo,
- const btVector3& aabbMin,
+SIMD_FORCE_INLINE bool btRayAabb(const btVector3& rayFrom,
+ const btVector3& rayTo,
+ const btVector3& aabbMin,
const btVector3& aabbMax,
- btScalar& param, btVector3& normal)
+ 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);
+ 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;
+ btScalar lambda_exit = param;
btVector3 r = target - source;
int i;
- btScalar normSign = 1;
- btVector3 hitNormal(0,0,0);
- int bit=1;
+ btScalar normSign = 1;
+ btVector3 hitNormal(0, 0, 0);
+ int bit = 1;
- for (int j=0;j<2;j++)
+ 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];
+ btScalar lambda = (-source[i] - aabbHalfExtent[i] * normSign) / r[i];
if (lambda_enter <= lambda)
{
lambda_enter = lambda;
- hitNormal.setValue(0,0,0);
+ hitNormal.setValue(0, 0, 0);
hitNormal[i] = normSign;
}
}
- else if (targetOutcode & bit)
+ else if (targetOutcode & bit)
{
- btScalar lambda = (-source[i] - aabbHalfExtent[i]*normSign) / r[i];
+ btScalar lambda = (-source[i] - aabbHalfExtent[i] * normSign) / r[i];
btSetMin(lambda_exit, lambda);
}
- bit<<=1;
+ bit <<= 1;
}
normSign = btScalar(-1.);
}
@@ -177,56 +169,49 @@ SIMD_FORCE_INLINE bool btRayAabb(const btVector3& rayFrom,
return false;
}
-
-
-SIMD_FORCE_INLINE void btTransformAabb(const btVector3& halfExtents, btScalar margin,const btTransform& t,btVector3& aabbMinOut,btVector3& aabbMaxOut)
+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 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] );
+ 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)
+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;
+ 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<unsigned int>(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));
- }
+//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<unsigned int>(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
-
+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/thirdparty/bullet/LinearMath/btAlignedAllocator.cpp b/thirdparty/bullet/LinearMath/btAlignedAllocator.cpp
index 0526a42283..39b302b600 100644
--- a/thirdparty/bullet/LinearMath/btAlignedAllocator.cpp
+++ b/thirdparty/bullet/LinearMath/btAlignedAllocator.cpp
@@ -18,8 +18,8 @@ subject to the following restrictions:
#ifdef BT_DEBUG_MEMORY_ALLOCATIONS
int gNumAlignedAllocs = 0;
int gNumAlignedFree = 0;
-int gTotalBytesAlignedAllocs = 0;//detect memory leaks
-#endif //BT_DEBUG_MEMORY_ALLOCATIONST_DEBUG_ALLOCATIONS
+int gTotalBytesAlignedAllocs = 0; //detect memory leaks
+#endif //BT_DEBUG_MEMORY_ALLOCATIONST_DEBUG_ALLOCATIONS
static void *btAllocDefault(size_t size)
{
@@ -34,9 +34,7 @@ static void btFreeDefault(void *ptr)
static btAllocFunc *sAllocFunc = btAllocDefault;
static btFreeFunc *sFreeFunc = btFreeDefault;
-
-
-#if defined (BT_HAS_ALIGNED_ALLOCATOR)
+#if defined(BT_HAS_ALIGNED_ALLOCATOR)
#include <malloc.h>
static void *btAlignedAllocDefault(size_t size, int alignment)
{
@@ -61,49 +59,48 @@ static inline void btAlignedFreeDefault(void *ptr)
}
#else
-
-
-
-
static inline void *btAlignedAllocDefault(size_t size, int alignment)
{
- void *ret;
- char *real;
- real = (char *)sAllocFunc(size + sizeof(void *) + (alignment-1));
- if (real) {
- ret = btAlignPointer(real + sizeof(void *),alignment);
- *((void **)(ret)-1) = (void *)(real);
- } else {
- ret = (void *)(real);
- }
- return (ret);
+ void *ret;
+ char *real;
+ real = (char *)sAllocFunc(size + sizeof(void *) + (alignment - 1));
+ if (real)
+ {
+ ret = btAlignPointer(real + sizeof(void *), alignment);
+ *((void **)(ret)-1) = (void *)(real);
+ }
+ else
+ {
+ ret = (void *)(real);
+ }
+ return (ret);
}
static inline void btAlignedFreeDefault(void *ptr)
{
- void* real;
+ void *real;
- if (ptr) {
- real = *((void **)(ptr)-1);
- sFreeFunc(real);
- }
+ if (ptr)
+ {
+ real = *((void **)(ptr)-1);
+ sFreeFunc(real);
+ }
}
#endif
-
static btAlignedAllocFunc *sAlignedAllocFunc = btAlignedAllocDefault;
static btAlignedFreeFunc *sAlignedFreeFunc = btAlignedFreeDefault;
void btAlignedAllocSetCustomAligned(btAlignedAllocFunc *allocFunc, btAlignedFreeFunc *freeFunc)
{
- sAlignedAllocFunc = allocFunc ? allocFunc : btAlignedAllocDefault;
- sAlignedFreeFunc = freeFunc ? freeFunc : btAlignedFreeDefault;
+ sAlignedAllocFunc = allocFunc ? allocFunc : btAlignedAllocDefault;
+ sAlignedFreeFunc = freeFunc ? freeFunc : btAlignedFreeDefault;
}
void btAlignedAllocSetCustom(btAllocFunc *allocFunc, btFreeFunc *freeFunc)
{
- sAllocFunc = allocFunc ? allocFunc : btAllocDefault;
- sFreeFunc = freeFunc ? freeFunc : btFreeDefault;
+ sAllocFunc = allocFunc ? allocFunc : btAllocDefault;
+ sFreeFunc = freeFunc ? freeFunc : btFreeDefault;
}
#ifdef BT_DEBUG_MEMORY_ALLOCATIONS
@@ -116,15 +113,15 @@ static int mynumallocs = 0;
int btDumpMemoryLeaks()
{
int totalLeak = 0;
-
- for (int i=0;i<mynumallocs;i++)
+
+ for (int i = 0; i < mynumallocs; i++)
{
printf("Error: leaked memory of allocation #%d (%d bytes)\n", allocations_id[i], allocations_bytes[i]);
- totalLeak+=allocations_bytes[i];
+ totalLeak += allocations_bytes[i];
}
if (totalLeak)
{
- printf("Error: memory leaks: %d allocations were not freed and leaked together %d bytes\n",mynumallocs,totalLeak);
+ printf("Error: memory leaks: %d allocations were not freed and leaked together %d bytes\n", mynumallocs, totalLeak);
}
return totalLeak;
}
@@ -133,137 +130,134 @@ int btDumpMemoryLeaks()
struct btDebugPtrMagic
{
- union
- {
- void** vptrptr;
- void* vptr;
- int* iptr;
- char* cptr;
+ union {
+ void **vptrptr;
+ void *vptr;
+ int *iptr;
+ char *cptr;
};
};
-
-void* btAlignedAllocInternal (size_t size, int alignment,int line,char* filename)
+void *btAlignedAllocInternal(size_t size, int alignment, int line, char *filename)
{
- if (size==0)
+ if (size == 0)
{
printf("Whaat? size==0");
return 0;
}
static int allocId = 0;
-
- void *ret;
- char *real;
-
-// to find some particular memory leak, you could do something like this:
-// if (allocId==172)
-// {
-// printf("catch me!\n");
-// }
-// if (size>1024*1024)
-// {
-// printf("big alloc!%d\n", size);
-// }
-
- gTotalBytesAlignedAllocs += size;
- gNumAlignedAllocs++;
-
-
-int sz4prt = 4*sizeof(void *);
-
- real = (char *)sAllocFunc(size + sz4prt + (alignment-1));
- if (real) {
-
- ret = (void*) btAlignPointer(real + sz4prt, alignment);
- btDebugPtrMagic p;
- p.vptr = ret;
- p.cptr-=sizeof(void*);
- *p.vptrptr = (void*)real;
- p.cptr-=sizeof(void*);
- *p.iptr = size;
- p.cptr-=sizeof(void*);
- *p.iptr = allocId;
-
- allocations_id[mynumallocs] = allocId;
- allocations_bytes[mynumallocs] = size;
- mynumallocs++;
-
- } else {
- ret = (void *)(real);//??
- }
-
- printf("allocation %d at address %x, from %s,line %d, size %d (total allocated = %d)\n",allocId,real, filename,line,size,gTotalBytesAlignedAllocs);
+
+ void *ret;
+ char *real;
+
+ // to find some particular memory leak, you could do something like this:
+ // if (allocId==172)
+ // {
+ // printf("catch me!\n");
+ // }
+ // if (size>1024*1024)
+ // {
+ // printf("big alloc!%d\n", size);
+ // }
+
+ gTotalBytesAlignedAllocs += size;
+ gNumAlignedAllocs++;
+
+ int sz4prt = 4 * sizeof(void *);
+
+ real = (char *)sAllocFunc(size + sz4prt + (alignment - 1));
+ if (real)
+ {
+ ret = (void *)btAlignPointer(real + sz4prt, alignment);
+ btDebugPtrMagic p;
+ p.vptr = ret;
+ p.cptr -= sizeof(void *);
+ *p.vptrptr = (void *)real;
+ p.cptr -= sizeof(void *);
+ *p.iptr = size;
+ p.cptr -= sizeof(void *);
+ *p.iptr = allocId;
+
+ allocations_id[mynumallocs] = allocId;
+ allocations_bytes[mynumallocs] = size;
+ mynumallocs++;
+ }
+ else
+ {
+ ret = (void *)(real); //??
+ }
+
+ printf("allocation %d at address %x, from %s,line %d, size %d (total allocated = %d)\n", allocId, real, filename, line, size, gTotalBytesAlignedAllocs);
allocId++;
-
- int* ptr = (int*)ret;
- *ptr = 12;
- return (ret);
+
+ int *ptr = (int *)ret;
+ *ptr = 12;
+ return (ret);
}
-void btAlignedFreeInternal (void* ptr,int line,char* filename)
+void btAlignedFreeInternal(void *ptr, int line, char *filename)
{
+ void *real;
- void* real;
-
- if (ptr) {
- gNumAlignedFree++;
-
- btDebugPtrMagic p;
- p.vptr = ptr;
- p.cptr-=sizeof(void*);
- real = *p.vptrptr;
- p.cptr-=sizeof(void*);
- int size = *p.iptr;
- p.cptr-=sizeof(void*);
- int allocId = *p.iptr;
-
- bool found = false;
-
- for (int i=0;i<mynumallocs;i++)
- {
- if ( allocations_id[i] == allocId)
- {
- allocations_id[i] = allocations_id[mynumallocs-1];
- allocations_bytes[i] = allocations_bytes[mynumallocs-1];
- mynumallocs--;
- found = true;
- break;
- }
- }
-
-
- gTotalBytesAlignedAllocs -= size;
-
- int diff = gNumAlignedAllocs-gNumAlignedFree;
- printf("free %d at address %x, from %s,line %d, size %d (total remain = %d in %d non-freed allocations)\n",allocId,real, filename,line,size, gTotalBytesAlignedAllocs, diff);
-
- sFreeFunc(real);
- } else
- {
- //printf("deleting a NULL ptr, no effect\n");
- }
+ if (ptr)
+ {
+ gNumAlignedFree++;
+
+ btDebugPtrMagic p;
+ p.vptr = ptr;
+ p.cptr -= sizeof(void *);
+ real = *p.vptrptr;
+ p.cptr -= sizeof(void *);
+ int size = *p.iptr;
+ p.cptr -= sizeof(void *);
+ int allocId = *p.iptr;
+
+ bool found = false;
+
+ for (int i = 0; i < mynumallocs; i++)
+ {
+ if (allocations_id[i] == allocId)
+ {
+ allocations_id[i] = allocations_id[mynumallocs - 1];
+ allocations_bytes[i] = allocations_bytes[mynumallocs - 1];
+ mynumallocs--;
+ found = true;
+ break;
+ }
+ }
+
+ gTotalBytesAlignedAllocs -= size;
+
+ int diff = gNumAlignedAllocs - gNumAlignedFree;
+ printf("free %d at address %x, from %s,line %d, size %d (total remain = %d in %d non-freed allocations)\n", allocId, real, filename, line, size, gTotalBytesAlignedAllocs, diff);
+
+ sFreeFunc(real);
+ }
+ else
+ {
+ //printf("deleting a NULL ptr, no effect\n");
+ }
}
-#else //BT_DEBUG_MEMORY_ALLOCATIONS
+#else //BT_DEBUG_MEMORY_ALLOCATIONS
-void* btAlignedAllocInternal (size_t size, int alignment)
+void *btAlignedAllocInternal(size_t size, int alignment)
{
- void* ptr;
+ void *ptr;
ptr = sAlignedAllocFunc(size, alignment);
-// printf("btAlignedAllocInternal %d, %x\n",size,ptr);
+ // printf("btAlignedAllocInternal %d, %x\n",size,ptr);
return ptr;
}
-void btAlignedFreeInternal (void* ptr)
+void btAlignedFreeInternal(void *ptr)
{
if (!ptr)
{
return;
}
-// printf("btAlignedFreeInternal %x\n",ptr);
+ // printf("btAlignedFreeInternal %x\n",ptr);
sAlignedFreeFunc(ptr);
}
-#endif //BT_DEBUG_MEMORY_ALLOCATIONS
-
+#endif //BT_DEBUG_MEMORY_ALLOCATIONS
diff --git a/thirdparty/bullet/LinearMath/btAlignedAllocator.h b/thirdparty/bullet/LinearMath/btAlignedAllocator.h
index 9873b338d9..ce4d3585f1 100644
--- a/thirdparty/bullet/LinearMath/btAlignedAllocator.h
+++ b/thirdparty/bullet/LinearMath/btAlignedAllocator.h
@@ -22,7 +22,6 @@ subject to the following restrictions:
#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
@@ -30,84 +29,87 @@ subject to the following restrictions:
int btDumpMemoryLeaks();
-#define btAlignedAlloc(a,b) \
- btAlignedAllocInternal(a,b,__LINE__,__FILE__)
+#define btAlignedAlloc(a, b) \
+ btAlignedAllocInternal(a, b, __LINE__, __FILE__)
#define btAlignedFree(ptr) \
- btAlignedFreeInternal(ptr,__LINE__,__FILE__)
+ btAlignedFreeInternal(ptr, __LINE__, __FILE__)
-void* btAlignedAllocInternal (size_t size, int alignment,int line,char* filename);
+void* btAlignedAllocInternal(size_t size, int alignment, int line, char* filename);
-void btAlignedFreeInternal (void* ptr,int line,char* filename);
+void btAlignedFreeInternal(void* ptr, int line, char* filename);
#else
- void* btAlignedAllocInternal (size_t size, int alignment);
- void btAlignedFreeInternal (void* ptr);
+void* btAlignedAllocInternal(size_t size, int alignment);
+void btAlignedFreeInternal(void* ptr);
- #define btAlignedAlloc(size,alignment) btAlignedAllocInternal(size,alignment)
- #define btAlignedFree(ptr) btAlignedFreeInternal(ptr)
+#define btAlignedAlloc(size, alignment) btAlignedAllocInternal(size, alignment)
+#define btAlignedFree(ptr) btAlignedFreeInternal(ptr)
#endif
-typedef int size_type;
+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);
+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);
+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);
-
+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 < typename T , unsigned Alignment >
-class btAlignedAllocator {
-
- typedef btAlignedAllocator< T , Alignment > self_type;
-
-public:
+template <typename T, unsigned Alignment>
+class btAlignedAllocator
+{
+ typedef btAlignedAllocator<T, Alignment> self_type;
+public:
//just going down a list:
btAlignedAllocator() {}
/*
btAlignedAllocator( const self_type & ) {}
*/
- template < typename Other >
- btAlignedAllocator( const btAlignedAllocator< Other , Alignment > & ) {}
+ template <typename Other>
+ btAlignedAllocator(const btAlignedAllocator<Other, Alignment>&)
+ {
+ }
- typedef const T* const_pointer;
- typedef const T& const_reference;
- typedef T* pointer;
- typedef T& reference;
- typedef T value_type;
+ 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 ) {
+ 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< pointer >(btAlignedAlloc( sizeof(value_type) * n , Alignment ));
+ return reinterpret_cast<pointer>(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< void * >( ptr ) );
+ void construct(pointer ptr, const value_type& value) { new (ptr) value_type(value); }
+ void deallocate(pointer ptr)
+ {
+ btAlignedFree(reinterpret_cast<void*>(ptr));
}
- void destroy ( pointer ptr ) { ptr->~value_type(); }
-
+ void destroy(pointer ptr) { ptr->~value_type(); }
- template < typename O > struct rebind {
- typedef btAlignedAllocator< O , Alignment > other;
+ template <typename O>
+ struct rebind
+ {
+ typedef btAlignedAllocator<O, Alignment> other;
};
- template < typename O >
- self_type & operator=( const btAlignedAllocator< O , Alignment > & ) { return *this; }
+ template <typename O>
+ self_type& operator=(const btAlignedAllocator<O, Alignment>&)
+ {
+ return *this;
+ }
- friend bool operator==( const self_type & , const self_type & ) { return true; }
+ friend bool operator==(const self_type&, const self_type&) { return true; }
};
-
-
-#endif //BT_ALIGNED_ALLOCATOR
-
+#endif //BT_ALIGNED_ALLOCATOR
diff --git a/thirdparty/bullet/LinearMath/btAlignedObjectArray.h b/thirdparty/bullet/LinearMath/btAlignedObjectArray.h
index f0b646529a..b4671bc19f 100644
--- a/thirdparty/bullet/LinearMath/btAlignedObjectArray.h
+++ b/thirdparty/bullet/LinearMath/btAlignedObjectArray.h
@@ -13,11 +13,10 @@ subject to the following restrictions:
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 "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
@@ -28,16 +27,16 @@ subject to the following restrictions:
#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 <memory.h> or <string.h> or otherwise...
-#define BT_ALLOW_ARRAY_COPY_OPERATOR // enabling this can accidently perform deep copies of data if you are not careful
+#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 <memory.h>
#include <string.h>
-#endif //BT_USE_MEMCPY
+#endif //BT_USE_MEMCPY
#ifdef BT_USE_PLACEMENT_NEW
-#include <new> //for placement new
-#endif //BT_USE_PLACEMENT_NEW
+#include <new> //for placement new
+#endif //BT_USE_PLACEMENT_NEW
// The register keyword is deprecated in C++11 so don't use it.
#if __cplusplus > 199711L
@@ -48,374 +47,358 @@ subject to the following restrictions:
///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 <typename T>
-//template <class T>
+template <typename T>
+//template <class T>
class btAlignedObjectArray
{
- btAlignedAllocator<T , 16> m_allocator;
+ btAlignedAllocator<T, 16> m_allocator;
- int m_size;
- int m_capacity;
- T* m_data;
+ int m_size;
+ int m_capacity;
+ T* m_data;
//PCK: added this line
- bool m_ownsMemory;
+ bool m_ownsMemory;
#ifdef BT_ALLOW_ARRAY_COPY_OPERATOR
public:
- SIMD_FORCE_INLINE btAlignedObjectArray<T>& operator=(const btAlignedObjectArray<T> &other)
+ SIMD_FORCE_INLINE btAlignedObjectArray<T>& operator=(const btAlignedObjectArray<T>& other)
{
copyFromArray(other);
return *this;
}
-#else//BT_ALLOW_ARRAY_COPY_OPERATOR
+#else //BT_ALLOW_ARRAY_COPY_OPERATOR
private:
- SIMD_FORCE_INLINE btAlignedObjectArray<T>& operator=(const btAlignedObjectArray<T> &other);
-#endif//BT_ALLOW_ARRAY_COPY_OPERATOR
+ SIMD_FORCE_INLINE btAlignedObjectArray<T>& operator=(const btAlignedObjectArray<T>& 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)
+ 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]);
+ new (&dest[i]) T(m_data[i]);
#else
- dest[i] = m_data[i];
-#endif //BT_USE_PLACEMENT_NEW
- }
+ dest[i] = m_data[i];
+#endif //BT_USE_PLACEMENT_NEW
+ }
- SIMD_FORCE_INLINE void init()
+ 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++)
{
- //PCK: added this line
- m_ownsMemory = true;
- m_data = 0;
- m_size = 0;
- m_capacity = 0;
+ m_data[i].~T();
}
- SIMD_FORCE_INLINE void destroy(int first,int last)
+ }
+
+ SIMD_FORCE_INLINE void* allocate(int size)
+ {
+ if (size)
+ return m_allocator.allocate(size);
+ return 0;
+ }
+
+ SIMD_FORCE_INLINE void deallocate()
+ {
+ if (m_data)
{
- int i;
- for (i=first; i<last;i++)
+ //PCK: enclosed the deallocation in this block
+ if (m_ownsMemory)
{
- m_data[i].~T();
+ m_allocator.deallocate(m_data);
}
+ m_data = 0;
}
+ }
- SIMD_FORCE_INLINE void* allocate(int size)
- {
- if (size)
- return m_allocator.allocate(size);
- return 0;
- }
+public:
+ btAlignedObjectArray()
+ {
+ init();
+ }
- 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;
- }
- }
+ ~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);
+ }
- public:
-
- btAlignedObjectArray()
- {
- init();
- }
+ /// return the number of elements in the array
+ SIMD_FORCE_INLINE int size() const
+ {
+ return m_size;
+ }
- ~btAlignedObjectArray()
- {
- clear();
- }
+ SIMD_FORCE_INLINE const T& at(int n) const
+ {
+ btAssert(n >= 0);
+ btAssert(n < size());
+ return m_data[n];
+ }
- ///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();
+ SIMD_FORCE_INLINE T& at(int n)
+ {
+ btAssert(n >= 0);
+ btAssert(n < size());
+ return m_data[n];
+ }
- int otherSize = otherArray.size();
- resize (otherSize);
- otherArray.copy(0, otherSize, m_data);
- }
+ SIMD_FORCE_INLINE const T& operator[](int n) const
+ {
+ btAssert(n >= 0);
+ btAssert(n < size());
+ return m_data[n];
+ }
-
-
- /// 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& operator[](int n)
+ {
+ 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];
- }
+ ///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());
- SIMD_FORCE_INLINE const T& operator[](int n) const
- {
- btAssert(n>=0);
- btAssert(n<size());
- return m_data[n];
- }
+ deallocate();
- SIMD_FORCE_INLINE T& operator[](int n)
- {
- btAssert(n>=0);
- btAssert(n<size());
- return m_data[n];
- }
-
+ init();
+ }
- ///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();
+ }
- SIMD_FORCE_INLINE void pop_back()
+ ///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())
{
- btAssert(m_size>0);
- m_size--;
- m_data[m_size].~T();
+ reserve(newsize);
}
+ m_size = newsize;
+ }
+ SIMD_FORCE_INLINE void resize(int newsize, const T& fillData = T())
+ {
+ const BT_REGISTER int curSize = size();
- ///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 < curSize)
{
- if (newsize > size())
+ for (int i = newsize; i < curSize; i++)
{
- reserve(newsize);
+ m_data[i].~T();
}
- m_size = newsize;
}
-
- SIMD_FORCE_INLINE void resize(int newsize, const T& fillData=T())
+ else
{
- const BT_REGISTER int curSize = size();
-
- if (newsize < curSize)
+ 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
-
+ reserve(newsize);
}
-
- m_size = newsize;
- }
- SIMD_FORCE_INLINE T& expandNonInitializing( )
- {
- const BT_REGISTER int sz = size();
- if( sz == capacity() )
+#ifdef BT_USE_PLACEMENT_NEW
+ for (int i = curSize; i < newsize; i++)
{
- reserve( allocSize(size()) );
+ new (&m_data[i]) T(fillData);
}
- m_size++;
+#endif //BT_USE_PLACEMENT_NEW
+ }
- return m_data[sz];
+ m_size = newsize;
+ }
+ SIMD_FORCE_INLINE T& expandNonInitializing()
+ {
+ const BT_REGISTER 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 BT_REGISTER int sz = size();
- if( sz == capacity() )
- {
- reserve( allocSize(size()) );
- }
- m_size++;
+ SIMD_FORCE_INLINE T& expand(const T& fillValue = T())
+ {
+ const BT_REGISTER 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)
+ new (&m_data[sz]) T(fillValue); //use the in-place new (not really allocating heap memory)
#endif
- return m_data[sz];
- }
+ return m_data[sz];
+ }
+ SIMD_FORCE_INLINE void push_back(const T& _Val)
+ {
+ const BT_REGISTER int sz = size();
+ if (sz == capacity())
+ {
+ reserve(allocSize(size()));
+ }
- SIMD_FORCE_INLINE void push_back(const T& _Val)
- {
- const BT_REGISTER int sz = size();
- if( sz == capacity() )
- {
- reserve( allocSize(size()) );
- }
-
#ifdef BT_USE_PLACEMENT_NEW
- new ( &m_data[m_size] ) T(_Val);
+ new (&m_data[m_size]) T(_Val);
#else
- m_data[size()] = _Val;
-#endif //BT_USE_PLACEMENT_NEW
-
- m_size++;
- }
+ m_data[size()] = _Val;
+#endif //BT_USE_PLACEMENT_NEW
-
- /// 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);
+ m_size++;
+ }
- copy(0, size(), s);
+ /// 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;
+ }
- destroy(0,size());
+ 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);
- deallocate();
-
- //PCK: added this line
- m_ownsMemory = true;
+ copy(0, size(), s);
- m_data = s;
-
- m_capacity = _Count;
+ destroy(0, size());
- }
- }
+ deallocate();
+ //PCK: added this line
+ m_ownsMemory = true;
- class less
- {
- public:
+ m_data = s;
- bool operator() ( const T& a, const T& b ) const
- {
- return ( a < b );
- }
- };
-
+ m_capacity = _Count;
+ }
+ }
- template <typename L>
- void quickSortInternal(const L& CompareFunc,int lo, int hi)
+ class less
+ {
+ public:
+ bool operator()(const T& a, const T& b) const
{
- // 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);
+ return (a < b);
}
+ };
+ template <typename L>
+ 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];
- template <typename L>
- void quickSort(const L& CompareFunc)
+ // partition
+ do
{
- //don't sort 0 or 1 elements
- if (size()>1)
+ while (CompareFunc(m_data[i], x))
+ i++;
+ while (CompareFunc(x, m_data[j]))
+ j--;
+ if (i <= j)
{
- quickSortInternal(CompareFunc,0,size()-1);
+ swap(i, j);
+ i++;
+ j--;
}
+ } while (i <= j);
+
+ // recursion
+ if (lo < j)
+ quickSortInternal(CompareFunc, lo, j);
+ if (i < hi)
+ quickSortInternal(CompareFunc, i, hi);
+ }
+
+ template <typename L>
+ 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 <typename L>
+ 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 */
- ///heap sort from http://www.csse.monash.edu.au/~lloyd/tildeAlgDS/Sort/Heap/
- template <typename L>
- void downHeap(T *pArr, int k, int n, const L& CompareFunc)
+ T temp = pArr[k - 1];
+ /* k has child(s) */
+ while (k <= n / 2)
{
- /* 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]))
{
- 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;
- }
+ /* move child up */
+ pArr[k - 1] = pArr[child - 1];
+ k = child;
}
- pArr[k - 1] = temp;
- } /*downHeap*/
+ else
+ {
+ break;
+ }
+ }
+ pArr[k - 1] = temp;
+ } /*downHeap*/
- void swap(int index0,int index1)
- {
+ 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));
+ 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
-
- }
+ T temp = m_data[index0];
+ m_data[index0] = m_data[index1];
+ m_data[index1] = temp;
+#endif //BT_USE_PLACEMENT_NEW
+ }
template <typename L>
void heapSort(const L& CompareFunc)
@@ -423,49 +406,66 @@ protected:
/* sort a[0..N-1], N.B. 0 to N-1 */
int k;
int n = m_size;
- for (k = n/2; k > 0; k--)
+ for (k = n / 2; k > 0; k--)
{
downHeap(m_data, k, n, CompareFunc);
}
/* a[1..N] is now a heap */
- while ( n>=1 )
+ while (n >= 1)
{
- swap(0,n-1); /* largest of a[0..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 findBinarySearch(const T& key) const
{
int first = 0;
- int last = size()-1;
+ int last = size() - 1;
//assume sorted array
- while (first <= last) {
+ while (first <= last)
+ {
int mid = (first + last) / 2; // compute mid point.
- if (key > m_data[mid])
+ 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 if (key < m_data[mid])
+ last = mid - 1; // repeat search in bottom half.
else
- return mid; // found it. return position /////
+ return mid; // found it. return position /////
}
- return size(); // failed to find key
+ return size(); // failed to find key
}
+ int findLinearSearch(const T& key) const
+ {
+ int index = size();
+ int i;
- int findLinearSearch(const T& key) const
+ 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=size();
+ int index = -1;
int i;
- for (i=0;i<size();i++)
+ for (i = 0; i < size(); i++)
{
if (m_data[i] == key)
{
@@ -475,41 +475,23 @@ protected:
}
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)
+
+ void removeAtIndex(int index)
+ {
+ if (index < size())
+ {
+ swap(index, size() - 1);
+ pop_back();
+ }
+ }
+ void remove(const T& key)
{
int findIndex = findLinearSearch(key);
- removeAtIndex(findIndex);
+ removeAtIndex(findIndex);
}
//PCK: whole function
- void initializeFromBuffer(void *buffer, int size, int capacity)
+ void initializeFromBuffer(void* buffer, int size, int capacity)
{
clear();
m_ownsMemory = false;
@@ -521,10 +503,9 @@ protected:
void copyFromArray(const btAlignedObjectArray& otherArray)
{
int otherSize = otherArray.size();
- resize (otherSize);
+ resize(otherSize);
otherArray.copy(0, otherSize, m_data);
}
-
};
-#endif //BT_OBJECT_ARRAY__
+#endif //BT_OBJECT_ARRAY__
diff --git a/thirdparty/bullet/LinearMath/btConvexHull.cpp b/thirdparty/bullet/LinearMath/btConvexHull.cpp
index f8b79a1aba..e7de2a3694 100644
--- a/thirdparty/bullet/LinearMath/btConvexHull.cpp
+++ b/thirdparty/bullet/LinearMath/btConvexHull.cpp
@@ -20,51 +20,52 @@ subject to the following restrictions:
#include "btMinMax.h"
#include "btVector3.h"
-
-
-
-
//----------------------------------
-class int3
+class int3
{
public:
- int x,y,z;
+ int x, y, z;
int3(){};
- int3(int _x,int _y, int _z){x=_x;y=_y;z=_z;}
- const int& operator[](int i) const {return (&x)[i];}
- int& operator[](int i) {return (&x)[i];}
+ int3(int _x, int _y, int _z)
+ {
+ x = _x;
+ y = _y;
+ z = _z;
+ }
+ const int &operator[](int i) const { return (&x)[i]; }
+ int &operator[](int i) { return (&x)[i]; }
};
-
//------- btPlane ----------
-
-inline btPlane PlaneFlip(const btPlane &plane){return btPlane(-plane.normal,-plane.dist);}
-inline int operator==( const btPlane &a, const btPlane &b ) { return (a.normal==b.normal && a.dist==b.dist); }
-inline int coplanar( const btPlane &a, const btPlane &b ) { return (a==b || a==PlaneFlip(b)); }
-
+inline btPlane PlaneFlip(const btPlane &plane) { return btPlane(-plane.normal, -plane.dist); }
+inline int operator==(const btPlane &a, const btPlane &b) { return (a.normal == b.normal && a.dist == b.dist); }
+inline int coplanar(const btPlane &a, const btPlane &b) { return (a == b || a == PlaneFlip(b)); }
//--------- Utility Functions ------
-btVector3 PlaneLineIntersection(const btPlane &plane, const btVector3 &p0, const btVector3 &p1);
-btVector3 PlaneProject(const btPlane &plane, const btVector3 &point);
+btVector3 PlaneLineIntersection(const btPlane &plane, const btVector3 &p0, const btVector3 &p1);
+btVector3 PlaneProject(const btPlane &plane, const btVector3 &point);
-btVector3 ThreePlaneIntersection(const btPlane &p0,const btPlane &p1, const btPlane &p2);
-btVector3 ThreePlaneIntersection(const btPlane &p0,const btPlane &p1, const btPlane &p2)
+btVector3 ThreePlaneIntersection(const btPlane &p0, const btPlane &p1, const btPlane &p2);
+btVector3 ThreePlaneIntersection(const btPlane &p0, const btPlane &p1, const btPlane &p2)
{
btVector3 N1 = p0.normal;
btVector3 N2 = p1.normal;
btVector3 N3 = p2.normal;
- btVector3 n2n3; n2n3 = N2.cross(N3);
- btVector3 n3n1; n3n1 = N3.cross(N1);
- btVector3 n1n2; n1n2 = N1.cross(N2);
+ btVector3 n2n3;
+ n2n3 = N2.cross(N3);
+ btVector3 n3n1;
+ n3n1 = N3.cross(N1);
+ btVector3 n1n2;
+ n1n2 = N1.cross(N2);
btScalar quotient = (N1.dot(n2n3));
btAssert(btFabs(quotient) > btScalar(0.000001));
-
+
quotient = btScalar(-1.) / quotient;
n2n3 *= p0.dist;
n3n1 *= p1.dist;
@@ -74,105 +75,96 @@ btVector3 ThreePlaneIntersection(const btPlane &p0,const btPlane &p1, const btP
potentialVertex += n1n2;
potentialVertex *= quotient;
- btVector3 result(potentialVertex.getX(),potentialVertex.getY(),potentialVertex.getZ());
+ btVector3 result(potentialVertex.getX(), potentialVertex.getY(), potentialVertex.getZ());
return result;
-
}
-btScalar DistanceBetweenLines(const btVector3 &ustart, const btVector3 &udir, const btVector3 &vstart, const btVector3 &vdir, btVector3 *upoint=NULL, btVector3 *vpoint=NULL);
-btVector3 TriNormal(const btVector3 &v0, const btVector3 &v1, const btVector3 &v2);
-btVector3 NormalOf(const btVector3 *vert, const int n);
-
+btScalar DistanceBetweenLines(const btVector3 &ustart, const btVector3 &udir, const btVector3 &vstart, const btVector3 &vdir, btVector3 *upoint = NULL, btVector3 *vpoint = NULL);
+btVector3 TriNormal(const btVector3 &v0, const btVector3 &v1, const btVector3 &v2);
+btVector3 NormalOf(const btVector3 *vert, const int n);
btVector3 PlaneLineIntersection(const btPlane &plane, const btVector3 &p0, const btVector3 &p1)
{
// returns the point where the line p0-p1 intersects the plane n&d
- btVector3 dif;
- dif = p1-p0;
- btScalar dn= btDot(plane.normal,dif);
- btScalar t = -(plane.dist+btDot(plane.normal,p0) )/dn;
- return p0 + (dif*t);
+ btVector3 dif;
+ dif = p1 - p0;
+ btScalar dn = btDot(plane.normal, dif);
+ btScalar t = -(plane.dist + btDot(plane.normal, p0)) / dn;
+ return p0 + (dif * t);
}
btVector3 PlaneProject(const btPlane &plane, const btVector3 &point)
{
- return point - plane.normal * (btDot(point,plane.normal)+plane.dist);
+ return point - plane.normal * (btDot(point, plane.normal) + plane.dist);
}
btVector3 TriNormal(const btVector3 &v0, const btVector3 &v1, const btVector3 &v2)
{
// return the normal of the triangle
// inscribed by v0, v1, and v2
- btVector3 cp=btCross(v1-v0,v2-v1);
- btScalar m=cp.length();
- if(m==0) return btVector3(1,0,0);
- return cp*(btScalar(1.0)/m);
+ btVector3 cp = btCross(v1 - v0, v2 - v1);
+ btScalar m = cp.length();
+ if (m == 0) return btVector3(1, 0, 0);
+ return cp * (btScalar(1.0) / m);
}
-
btScalar DistanceBetweenLines(const btVector3 &ustart, const btVector3 &udir, const btVector3 &vstart, const btVector3 &vdir, btVector3 *upoint, btVector3 *vpoint)
{
btVector3 cp;
- cp = btCross(udir,vdir).normalized();
+ cp = btCross(udir, vdir).normalized();
- btScalar distu = -btDot(cp,ustart);
- btScalar distv = -btDot(cp,vstart);
- btScalar dist = (btScalar)fabs(distu-distv);
- if(upoint)
- {
+ btScalar distu = -btDot(cp, ustart);
+ btScalar distv = -btDot(cp, vstart);
+ btScalar dist = (btScalar)fabs(distu - distv);
+ if (upoint)
+ {
btPlane plane;
- plane.normal = btCross(vdir,cp).normalized();
- plane.dist = -btDot(plane.normal,vstart);
- *upoint = PlaneLineIntersection(plane,ustart,ustart+udir);
+ plane.normal = btCross(vdir, cp).normalized();
+ plane.dist = -btDot(plane.normal, vstart);
+ *upoint = PlaneLineIntersection(plane, ustart, ustart + udir);
}
- if(vpoint)
- {
+ if (vpoint)
+ {
btPlane plane;
- plane.normal = btCross(udir,cp).normalized();
- plane.dist = -btDot(plane.normal,ustart);
- *vpoint = PlaneLineIntersection(plane,vstart,vstart+vdir);
+ plane.normal = btCross(udir, cp).normalized();
+ plane.dist = -btDot(plane.normal, ustart);
+ *vpoint = PlaneLineIntersection(plane, vstart, vstart + vdir);
}
return dist;
}
-
-
-
-
-
-
-#define COPLANAR (0)
-#define UNDER (1)
-#define OVER (2)
-#define SPLIT (OVER|UNDER)
+#define COPLANAR (0)
+#define UNDER (1)
+#define OVER (2)
+#define SPLIT (OVER | UNDER)
#define PAPERWIDTH (btScalar(0.001))
btScalar planetestepsilon = PAPERWIDTH;
-
-
typedef ConvexH::HalfEdge HalfEdge;
-ConvexH::ConvexH(int vertices_size,int edges_size,int facets_size)
+ConvexH::ConvexH(int vertices_size, int edges_size, int facets_size)
{
vertices.resize(vertices_size);
edges.resize(edges_size);
facets.resize(facets_size);
}
-
int PlaneTest(const btPlane &p, const btVector3 &v);
-int PlaneTest(const btPlane &p, const btVector3 &v) {
- btScalar a = btDot(v,p.normal)+p.dist;
- int flag = (a>planetestepsilon)?OVER:((a<-planetestepsilon)?UNDER:COPLANAR);
+int PlaneTest(const btPlane &p, const btVector3 &v)
+{
+ btScalar a = btDot(v, p.normal) + p.dist;
+ int flag = (a > planetestepsilon) ? OVER : ((a < -planetestepsilon) ? UNDER : COPLANAR);
return flag;
}
-int SplitTest(ConvexH &convex,const btPlane &plane);
-int SplitTest(ConvexH &convex,const btPlane &plane) {
- int flag=0;
- for(int i=0;i<convex.vertices.size();i++) {
- flag |= PlaneTest(plane,convex.vertices[i]);
+int SplitTest(ConvexH &convex, const btPlane &plane);
+int SplitTest(ConvexH &convex, const btPlane &plane)
+{
+ int flag = 0;
+ for (int i = 0; i < convex.vertices.size(); i++)
+ {
+ flag |= PlaneTest(plane, convex.vertices[i]);
}
return flag;
}
@@ -185,7 +177,7 @@ public:
unsigned char undermap;
unsigned char overmap;
};
-class EdgeFlag
+class EdgeFlag
{
public:
unsigned char planetest;
@@ -199,146 +191,135 @@ public:
unsigned char undermap;
unsigned char overmap;
};
-class Coplanar{
+class Coplanar
+{
public:
unsigned short ea;
unsigned char v0;
unsigned char v1;
};
-
-
-
-
-
-
-
-template<class T>
-int maxdirfiltered(const T *p,int count,const T &dir,btAlignedObjectArray<int> &allow)
+template <class T>
+int maxdirfiltered(const T *p, int count, const T &dir, btAlignedObjectArray<int> &allow)
{
btAssert(count);
- int m=-1;
- for(int i=0;i<count;i++)
- if(allow[i])
+ int m = -1;
+ for (int i = 0; i < count; i++)
+ if (allow[i])
{
- if(m==-1 || btDot(p[i],dir)>btDot(p[m],dir))
- m=i;
+ if (m == -1 || btDot(p[i], dir) > btDot(p[m], dir))
+ m = i;
}
- btAssert(m!=-1);
+ btAssert(m != -1);
return m;
-}
+}
btVector3 orth(const btVector3 &v);
btVector3 orth(const btVector3 &v)
{
- btVector3 a=btCross(v,btVector3(0,0,1));
- btVector3 b=btCross(v,btVector3(0,1,0));
+ btVector3 a = btCross(v, btVector3(0, 0, 1));
+ btVector3 b = btCross(v, btVector3(0, 1, 0));
if (a.length() > b.length())
{
return a.normalized();
- } else {
+ }
+ else
+ {
return b.normalized();
}
}
-
-template<class T>
-int maxdirsterid(const T *p,int count,const T &dir,btAlignedObjectArray<int> &allow)
+template <class T>
+int maxdirsterid(const T *p, int count, const T &dir, btAlignedObjectArray<int> &allow)
{
- int m=-1;
- while(m==-1)
+ int m = -1;
+ while (m == -1)
{
- m = maxdirfiltered(p,count,dir,allow);
- if(allow[m]==3) return m;
+ m = maxdirfiltered(p, count, dir, allow);
+ if (allow[m] == 3) return m;
T u = orth(dir);
- T v = btCross(u,dir);
- int ma=-1;
- for(btScalar x = btScalar(0.0) ; x<= btScalar(360.0) ; x+= btScalar(45.0))
+ T v = btCross(u, dir);
+ int ma = -1;
+ for (btScalar x = btScalar(0.0); x <= btScalar(360.0); x += btScalar(45.0))
{
- btScalar s = btSin(SIMD_RADS_PER_DEG*(x));
- btScalar c = btCos(SIMD_RADS_PER_DEG*(x));
- int mb = maxdirfiltered(p,count,dir+(u*s+v*c)*btScalar(0.025),allow);
- if(ma==m && mb==m)
+ btScalar s = btSin(SIMD_RADS_PER_DEG * (x));
+ btScalar c = btCos(SIMD_RADS_PER_DEG * (x));
+ int mb = maxdirfiltered(p, count, dir + (u * s + v * c) * btScalar(0.025), allow);
+ if (ma == m && mb == m)
{
- allow[m]=3;
+ allow[m] = 3;
return m;
}
- if(ma!=-1 && ma!=mb) // Yuck - this is really ugly
+ if (ma != -1 && ma != mb) // Yuck - this is really ugly
{
int mc = ma;
- for(btScalar xx = x-btScalar(40.0) ; xx <= x ; xx+= btScalar(5.0))
+ for (btScalar xx = x - btScalar(40.0); xx <= x; xx += btScalar(5.0))
{
- btScalar s = btSin(SIMD_RADS_PER_DEG*(xx));
- btScalar c = btCos(SIMD_RADS_PER_DEG*(xx));
- int md = maxdirfiltered(p,count,dir+(u*s+v*c)*btScalar(0.025),allow);
- if(mc==m && md==m)
+ btScalar s = btSin(SIMD_RADS_PER_DEG * (xx));
+ btScalar c = btCos(SIMD_RADS_PER_DEG * (xx));
+ int md = maxdirfiltered(p, count, dir + (u * s + v * c) * btScalar(0.025), allow);
+ if (mc == m && md == m)
{
- allow[m]=3;
+ allow[m] = 3;
return m;
}
- mc=md;
+ mc = md;
}
}
- ma=mb;
+ ma = mb;
}
- allow[m]=0;
- m=-1;
+ allow[m] = 0;
+ m = -1;
}
btAssert(0);
return m;
-}
-
-
-
+}
-int operator ==(const int3 &a,const int3 &b);
-int operator ==(const int3 &a,const int3 &b)
+int operator==(const int3 &a, const int3 &b);
+int operator==(const int3 &a, const int3 &b)
{
- for(int i=0;i<3;i++)
+ for (int i = 0; i < 3; i++)
{
- if(a[i]!=b[i]) return 0;
+ if (a[i] != b[i]) return 0;
}
return 1;
}
-
-int above(btVector3* vertices,const int3& t, const btVector3 &p, btScalar epsilon);
-int above(btVector3* vertices,const int3& t, const btVector3 &p, btScalar epsilon)
+int above(btVector3 *vertices, const int3 &t, const btVector3 &p, btScalar epsilon);
+int above(btVector3 *vertices, const int3 &t, const btVector3 &p, btScalar epsilon)
{
- btVector3 n=TriNormal(vertices[t[0]],vertices[t[1]],vertices[t[2]]);
- return (btDot(n,p-vertices[t[0]]) > epsilon); // EPSILON???
+ btVector3 n = TriNormal(vertices[t[0]], vertices[t[1]], vertices[t[2]]);
+ return (btDot(n, p - vertices[t[0]]) > epsilon); // EPSILON???
}
-int hasedge(const int3 &t, int a,int b);
-int hasedge(const int3 &t, int a,int b)
+int hasedge(const int3 &t, int a, int b);
+int hasedge(const int3 &t, int a, int b)
{
- for(int i=0;i<3;i++)
+ for (int i = 0; i < 3; i++)
{
- int i1= (i+1)%3;
- if(t[i]==a && t[i1]==b) return 1;
+ int i1 = (i + 1) % 3;
+ if (t[i] == a && t[i1] == b) return 1;
}
return 0;
}
int hasvert(const int3 &t, int v);
int hasvert(const int3 &t, int v)
{
- return (t[0]==v || t[1]==v || t[2]==v) ;
+ return (t[0] == v || t[1] == v || t[2] == v);
}
-int shareedge(const int3 &a,const int3 &b);
-int shareedge(const int3 &a,const int3 &b)
+int shareedge(const int3 &a, const int3 &b);
+int shareedge(const int3 &a, const int3 &b)
{
int i;
- for(i=0;i<3;i++)
+ for (i = 0; i < 3; i++)
{
- int i1= (i+1)%3;
- if(hasedge(a,b[i1],b[i])) return 1;
+ int i1 = (i + 1) % 3;
+ if (hasedge(a, b[i1], b[i])) return 1;
}
return 0;
}
class btHullTriangle;
-
-
class btHullTriangle : public int3
{
public:
@@ -346,51 +327,50 @@ public:
int id;
int vmax;
btScalar rise;
- btHullTriangle(int a,int b,int c):int3(a,b,c),n(-1,-1,-1)
+ btHullTriangle(int a, int b, int c) : int3(a, b, c), n(-1, -1, -1)
{
- vmax=-1;
+ vmax = -1;
rise = btScalar(0.0);
}
~btHullTriangle()
{
}
- int &neib(int a,int b);
+ int &neib(int a, int b);
};
-
-int &btHullTriangle::neib(int a,int b)
+int &btHullTriangle::neib(int a, int b)
{
- static int er=-1;
+ static int er = -1;
int i;
- for(i=0;i<3;i++)
+ for (i = 0; i < 3; i++)
{
- int i1=(i+1)%3;
- int i2=(i+2)%3;
- if((*this)[i]==a && (*this)[i1]==b) return n[i2];
- if((*this)[i]==b && (*this)[i1]==a) return n[i2];
+ int i1 = (i + 1) % 3;
+ int i2 = (i + 2) % 3;
+ if ((*this)[i] == a && (*this)[i1] == b) return n[i2];
+ if ((*this)[i] == b && (*this)[i1] == a) return n[i2];
}
btAssert(0);
return er;
}
-void HullLibrary::b2bfix(btHullTriangle* s,btHullTriangle*t)
+void HullLibrary::b2bfix(btHullTriangle *s, btHullTriangle *t)
{
int i;
- for(i=0;i<3;i++)
+ for (i = 0; i < 3; i++)
{
- int i1=(i+1)%3;
- int i2=(i+2)%3;
+ int i1 = (i + 1) % 3;
+ int i2 = (i + 2) % 3;
int a = (*s)[i1];
int b = (*s)[i2];
- btAssert(m_tris[s->neib(a,b)]->neib(b,a) == s->id);
- btAssert(m_tris[t->neib(a,b)]->neib(b,a) == t->id);
- m_tris[s->neib(a,b)]->neib(b,a) = t->neib(b,a);
- m_tris[t->neib(b,a)]->neib(a,b) = s->neib(a,b);
+ btAssert(m_tris[s->neib(a, b)]->neib(b, a) == s->id);
+ btAssert(m_tris[t->neib(a, b)]->neib(b, a) == t->id);
+ m_tris[s->neib(a, b)]->neib(b, a) = t->neib(b, a);
+ m_tris[t->neib(b, a)]->neib(a, b) = s->neib(a, b);
}
}
-void HullLibrary::removeb2b(btHullTriangle* s,btHullTriangle*t)
+void HullLibrary::removeb2b(btHullTriangle *s, btHullTriangle *t)
{
- b2bfix(s,t);
+ b2bfix(s, t);
deAllocateTriangle(s);
deAllocateTriangle(t);
@@ -401,11 +381,11 @@ void HullLibrary::checkit(btHullTriangle *t)
(void)t;
int i;
- btAssert(m_tris[t->id]==t);
- for(i=0;i<3;i++)
+ btAssert(m_tris[t->id] == t);
+ for (i = 0; i < 3; i++)
{
- int i1=(i+1)%3;
- int i2=(i+2)%3;
+ int i1 = (i + 1) % 3;
+ int i2 = (i + 2) % 3;
int a = (*t)[i1];
int b = (*t)[i2];
@@ -415,226 +395,233 @@ void HullLibrary::checkit(btHullTriangle *t)
(void)a;
(void)b;
- btAssert(a!=b);
- btAssert( m_tris[t->n[i]]->neib(b,a) == t->id);
+ btAssert(a != b);
+ btAssert(m_tris[t->n[i]]->neib(b, a) == t->id);
}
}
-btHullTriangle* HullLibrary::allocateTriangle(int a,int b,int c)
+btHullTriangle *HullLibrary::allocateTriangle(int a, int b, int c)
{
- void* mem = btAlignedAlloc(sizeof(btHullTriangle),16);
- btHullTriangle* tr = new (mem)btHullTriangle(a,b,c);
+ void *mem = btAlignedAlloc(sizeof(btHullTriangle), 16);
+ btHullTriangle *tr = new (mem) btHullTriangle(a, b, c);
tr->id = m_tris.size();
m_tris.push_back(tr);
return tr;
}
-void HullLibrary::deAllocateTriangle(btHullTriangle* tri)
+void HullLibrary::deAllocateTriangle(btHullTriangle *tri)
{
- btAssert(m_tris[tri->id]==tri);
- m_tris[tri->id]=NULL;
+ btAssert(m_tris[tri->id] == tri);
+ m_tris[tri->id] = NULL;
tri->~btHullTriangle();
btAlignedFree(tri);
}
-
-void HullLibrary::extrude(btHullTriangle *t0,int v)
+void HullLibrary::extrude(btHullTriangle *t0, int v)
{
- int3 t= *t0;
+ int3 t = *t0;
int n = m_tris.size();
- btHullTriangle* ta = allocateTriangle(v,t[1],t[2]);
- ta->n = int3(t0->n[0],n+1,n+2);
- m_tris[t0->n[0]]->neib(t[1],t[2]) = n+0;
- btHullTriangle* tb = allocateTriangle(v,t[2],t[0]);
- tb->n = int3(t0->n[1],n+2,n+0);
- m_tris[t0->n[1]]->neib(t[2],t[0]) = n+1;
- btHullTriangle* tc = allocateTriangle(v,t[0],t[1]);
- tc->n = int3(t0->n[2],n+0,n+1);
- m_tris[t0->n[2]]->neib(t[0],t[1]) = n+2;
+ btHullTriangle *ta = allocateTriangle(v, t[1], t[2]);
+ ta->n = int3(t0->n[0], n + 1, n + 2);
+ m_tris[t0->n[0]]->neib(t[1], t[2]) = n + 0;
+ btHullTriangle *tb = allocateTriangle(v, t[2], t[0]);
+ tb->n = int3(t0->n[1], n + 2, n + 0);
+ m_tris[t0->n[1]]->neib(t[2], t[0]) = n + 1;
+ btHullTriangle *tc = allocateTriangle(v, t[0], t[1]);
+ tc->n = int3(t0->n[2], n + 0, n + 1);
+ m_tris[t0->n[2]]->neib(t[0], t[1]) = n + 2;
checkit(ta);
checkit(tb);
checkit(tc);
- if(hasvert(*m_tris[ta->n[0]],v)) removeb2b(ta,m_tris[ta->n[0]]);
- if(hasvert(*m_tris[tb->n[0]],v)) removeb2b(tb,m_tris[tb->n[0]]);
- if(hasvert(*m_tris[tc->n[0]],v)) removeb2b(tc,m_tris[tc->n[0]]);
+ if (hasvert(*m_tris[ta->n[0]], v)) removeb2b(ta, m_tris[ta->n[0]]);
+ if (hasvert(*m_tris[tb->n[0]], v)) removeb2b(tb, m_tris[tb->n[0]]);
+ if (hasvert(*m_tris[tc->n[0]], v)) removeb2b(tc, m_tris[tc->n[0]]);
deAllocateTriangle(t0);
-
}
-btHullTriangle* HullLibrary::extrudable(btScalar epsilon)
+btHullTriangle *HullLibrary::extrudable(btScalar epsilon)
{
int i;
- btHullTriangle *t=NULL;
- for(i=0;i<m_tris.size();i++)
+ btHullTriangle *t = NULL;
+ for (i = 0; i < m_tris.size(); i++)
{
- if(!t || (m_tris[i] && t->rise<m_tris[i]->rise))
+ if (!t || (m_tris[i] && t->rise < m_tris[i]->rise))
{
t = m_tris[i];
}
}
- return (t->rise >epsilon)?t:NULL ;
+ return (t->rise > epsilon) ? t : NULL;
}
-
-
-
-int4 HullLibrary::FindSimplex(btVector3 *verts,int verts_count,btAlignedObjectArray<int> &allow)
+int4 HullLibrary::FindSimplex(btVector3 *verts, int verts_count, btAlignedObjectArray<int> &allow)
{
btVector3 basis[3];
- basis[0] = btVector3( btScalar(0.01), btScalar(0.02), btScalar(1.0) );
- int p0 = maxdirsterid(verts,verts_count, basis[0],allow);
- int p1 = maxdirsterid(verts,verts_count,-basis[0],allow);
- basis[0] = verts[p0]-verts[p1];
- if(p0==p1 || basis[0]==btVector3(0,0,0))
- return int4(-1,-1,-1,-1);
- basis[1] = btCross(btVector3( btScalar(1),btScalar(0.02), btScalar(0)),basis[0]);
- basis[2] = btCross(btVector3(btScalar(-0.02), btScalar(1), btScalar(0)),basis[0]);
+ basis[0] = btVector3(btScalar(0.01), btScalar(0.02), btScalar(1.0));
+ int p0 = maxdirsterid(verts, verts_count, basis[0], allow);
+ int p1 = maxdirsterid(verts, verts_count, -basis[0], allow);
+ basis[0] = verts[p0] - verts[p1];
+ if (p0 == p1 || basis[0] == btVector3(0, 0, 0))
+ return int4(-1, -1, -1, -1);
+ basis[1] = btCross(btVector3(btScalar(1), btScalar(0.02), btScalar(0)), basis[0]);
+ basis[2] = btCross(btVector3(btScalar(-0.02), btScalar(1), btScalar(0)), basis[0]);
if (basis[1].length() > basis[2].length())
{
basis[1].normalize();
- } else {
+ }
+ else
+ {
basis[1] = basis[2];
- basis[1].normalize ();
+ basis[1].normalize();
}
- int p2 = maxdirsterid(verts,verts_count,basis[1],allow);
- if(p2 == p0 || p2 == p1)
+ int p2 = maxdirsterid(verts, verts_count, basis[1], allow);
+ if (p2 == p0 || p2 == p1)
{
- p2 = maxdirsterid(verts,verts_count,-basis[1],allow);
+ p2 = maxdirsterid(verts, verts_count, -basis[1], allow);
}
- if(p2 == p0 || p2 == p1)
- return int4(-1,-1,-1,-1);
+ if (p2 == p0 || p2 == p1)
+ return int4(-1, -1, -1, -1);
basis[1] = verts[p2] - verts[p0];
- basis[2] = btCross(basis[1],basis[0]).normalized();
- int p3 = maxdirsterid(verts,verts_count,basis[2],allow);
- if(p3==p0||p3==p1||p3==p2) p3 = maxdirsterid(verts,verts_count,-basis[2],allow);
- if(p3==p0||p3==p1||p3==p2)
- return int4(-1,-1,-1,-1);
- btAssert(!(p0==p1||p0==p2||p0==p3||p1==p2||p1==p3||p2==p3));
- if(btDot(verts[p3]-verts[p0],btCross(verts[p1]-verts[p0],verts[p2]-verts[p0])) <0) {btSwap(p2,p3);}
- return int4(p0,p1,p2,p3);
+ basis[2] = btCross(basis[1], basis[0]).normalized();
+ int p3 = maxdirsterid(verts, verts_count, basis[2], allow);
+ if (p3 == p0 || p3 == p1 || p3 == p2) p3 = maxdirsterid(verts, verts_count, -basis[2], allow);
+ if (p3 == p0 || p3 == p1 || p3 == p2)
+ return int4(-1, -1, -1, -1);
+ btAssert(!(p0 == p1 || p0 == p2 || p0 == p3 || p1 == p2 || p1 == p3 || p2 == p3));
+ if (btDot(verts[p3] - verts[p0], btCross(verts[p1] - verts[p0], verts[p2] - verts[p0])) < 0)
+ {
+ btSwap(p2, p3);
+ }
+ return int4(p0, p1, p2, p3);
}
-int HullLibrary::calchullgen(btVector3 *verts,int verts_count, int vlimit)
+int HullLibrary::calchullgen(btVector3 *verts, int verts_count, int vlimit)
{
- if(verts_count <4) return 0;
- if(vlimit==0) vlimit=1000000000;
+ if (verts_count < 4) return 0;
+ if (vlimit == 0) vlimit = 1000000000;
int j;
- btVector3 bmin(*verts),bmax(*verts);
+ btVector3 bmin(*verts), bmax(*verts);
btAlignedObjectArray<int> isextreme;
isextreme.reserve(verts_count);
btAlignedObjectArray<int> allow;
allow.reserve(verts_count);
- for(j=0;j<verts_count;j++)
+ for (j = 0; j < verts_count; j++)
{
allow.push_back(1);
isextreme.push_back(0);
- bmin.setMin (verts[j]);
- bmax.setMax (verts[j]);
+ bmin.setMin(verts[j]);
+ bmax.setMax(verts[j]);
}
- btScalar epsilon = (bmax-bmin).length() * btScalar(0.001);
- btAssert (epsilon != 0.0);
-
-
- int4 p = FindSimplex(verts,verts_count,allow);
- if(p.x==-1) return 0; // simplex failed
-
-
-
- btVector3 center = (verts[p[0]]+verts[p[1]]+verts[p[2]]+verts[p[3]]) / btScalar(4.0); // a valid interior point
- btHullTriangle *t0 = allocateTriangle(p[2],p[3],p[1]); t0->n=int3(2,3,1);
- btHullTriangle *t1 = allocateTriangle(p[3],p[2],p[0]); t1->n=int3(3,2,0);
- btHullTriangle *t2 = allocateTriangle(p[0],p[1],p[3]); t2->n=int3(0,1,3);
- btHullTriangle *t3 = allocateTriangle(p[1],p[0],p[2]); t3->n=int3(1,0,2);
- isextreme[p[0]]=isextreme[p[1]]=isextreme[p[2]]=isextreme[p[3]]=1;
- checkit(t0);checkit(t1);checkit(t2);checkit(t3);
-
- for(j=0;j<m_tris.size();j++)
+ btScalar epsilon = (bmax - bmin).length() * btScalar(0.001);
+ btAssert(epsilon != 0.0);
+
+ int4 p = FindSimplex(verts, verts_count, allow);
+ if (p.x == -1) return 0; // simplex failed
+
+ btVector3 center = (verts[p[0]] + verts[p[1]] + verts[p[2]] + verts[p[3]]) / btScalar(4.0); // a valid interior point
+ btHullTriangle *t0 = allocateTriangle(p[2], p[3], p[1]);
+ t0->n = int3(2, 3, 1);
+ btHullTriangle *t1 = allocateTriangle(p[3], p[2], p[0]);
+ t1->n = int3(3, 2, 0);
+ btHullTriangle *t2 = allocateTriangle(p[0], p[1], p[3]);
+ t2->n = int3(0, 1, 3);
+ btHullTriangle *t3 = allocateTriangle(p[1], p[0], p[2]);
+ t3->n = int3(1, 0, 2);
+ isextreme[p[0]] = isextreme[p[1]] = isextreme[p[2]] = isextreme[p[3]] = 1;
+ checkit(t0);
+ checkit(t1);
+ checkit(t2);
+ checkit(t3);
+
+ for (j = 0; j < m_tris.size(); j++)
{
- btHullTriangle *t=m_tris[j];
+ btHullTriangle *t = m_tris[j];
btAssert(t);
- btAssert(t->vmax<0);
- btVector3 n=TriNormal(verts[(*t)[0]],verts[(*t)[1]],verts[(*t)[2]]);
- t->vmax = maxdirsterid(verts,verts_count,n,allow);
- t->rise = btDot(n,verts[t->vmax]-verts[(*t)[0]]);
+ btAssert(t->vmax < 0);
+ btVector3 n = TriNormal(verts[(*t)[0]], verts[(*t)[1]], verts[(*t)[2]]);
+ t->vmax = maxdirsterid(verts, verts_count, n, allow);
+ t->rise = btDot(n, verts[t->vmax] - verts[(*t)[0]]);
}
btHullTriangle *te;
- vlimit-=4;
- while(vlimit >0 && ((te=extrudable(epsilon)) != 0))
+ vlimit -= 4;
+ while (vlimit > 0 && ((te = extrudable(epsilon)) != 0))
{
//int3 ti=*te;
- int v=te->vmax;
+ int v = te->vmax;
btAssert(v != -1);
btAssert(!isextreme[v]); // wtf we've already done this vertex
- isextreme[v]=1;
+ isextreme[v] = 1;
//if(v==p0 || v==p1 || v==p2 || v==p3) continue; // done these already
- j=m_tris.size();
- while(j--) {
- if(!m_tris[j]) continue;
- int3 t=*m_tris[j];
- if(above(verts,t,verts[v],btScalar(0.01)*epsilon))
+ j = m_tris.size();
+ while (j--)
+ {
+ if (!m_tris[j]) continue;
+ int3 t = *m_tris[j];
+ if (above(verts, t, verts[v], btScalar(0.01) * epsilon))
{
- extrude(m_tris[j],v);
+ extrude(m_tris[j], v);
}
}
// now check for those degenerate cases where we have a flipped triangle or a really skinny triangle
- j=m_tris.size();
- while(j--)
+ j = m_tris.size();
+ while (j--)
{
- if(!m_tris[j]) continue;
- if(!hasvert(*m_tris[j],v)) break;
- int3 nt=*m_tris[j];
- if(above(verts,nt,center,btScalar(0.01)*epsilon) || btCross(verts[nt[1]]-verts[nt[0]],verts[nt[2]]-verts[nt[1]]).length()< epsilon*epsilon*btScalar(0.1) )
+ if (!m_tris[j]) continue;
+ if (!hasvert(*m_tris[j], v)) break;
+ int3 nt = *m_tris[j];
+ if (above(verts, nt, center, btScalar(0.01) * epsilon) || btCross(verts[nt[1]] - verts[nt[0]], verts[nt[2]] - verts[nt[1]]).length() < epsilon * epsilon * btScalar(0.1))
{
btHullTriangle *nb = m_tris[m_tris[j]->n[0]];
- btAssert(nb);btAssert(!hasvert(*nb,v));btAssert(nb->id<j);
- extrude(nb,v);
- j=m_tris.size();
+ btAssert(nb);
+ btAssert(!hasvert(*nb, v));
+ btAssert(nb->id < j);
+ extrude(nb, v);
+ j = m_tris.size();
}
- }
- j=m_tris.size();
- while(j--)
+ }
+ j = m_tris.size();
+ while (j--)
{
- btHullTriangle *t=m_tris[j];
- if(!t) continue;
- if(t->vmax>=0) break;
- btVector3 n=TriNormal(verts[(*t)[0]],verts[(*t)[1]],verts[(*t)[2]]);
- t->vmax = maxdirsterid(verts,verts_count,n,allow);
- if(isextreme[t->vmax])
+ btHullTriangle *t = m_tris[j];
+ if (!t) continue;
+ if (t->vmax >= 0) break;
+ btVector3 n = TriNormal(verts[(*t)[0]], verts[(*t)[1]], verts[(*t)[2]]);
+ t->vmax = maxdirsterid(verts, verts_count, n, allow);
+ if (isextreme[t->vmax])
{
- t->vmax=-1; // already done that vertex - algorithm needs to be able to terminate.
+ t->vmax = -1; // already done that vertex - algorithm needs to be able to terminate.
}
else
{
- t->rise = btDot(n,verts[t->vmax]-verts[(*t)[0]]);
+ t->rise = btDot(n, verts[t->vmax] - verts[(*t)[0]]);
}
}
- vlimit --;
+ vlimit--;
}
return 1;
}
-int HullLibrary::calchull(btVector3 *verts,int verts_count, TUIntArray& tris_out, int &tris_count,int vlimit)
+int HullLibrary::calchull(btVector3 *verts, int verts_count, TUIntArray &tris_out, int &tris_count, int vlimit)
{
- int rc=calchullgen(verts,verts_count, vlimit) ;
- if(!rc) return 0;
+ int rc = calchullgen(verts, verts_count, vlimit);
+ if (!rc) return 0;
btAlignedObjectArray<int> ts;
int i;
- for(i=0;i<m_tris.size();i++)
+ for (i = 0; i < m_tris.size(); i++)
{
- if(m_tris[i])
+ if (m_tris[i])
{
- for(int j=0;j<3;j++)
+ for (int j = 0; j < 3; j++)
ts.push_back((*m_tris[i])[j]);
deAllocateTriangle(m_tris[i]);
}
}
- tris_count = ts.size()/3;
+ tris_count = ts.size() / 3;
tris_out.resize(ts.size());
-
- for (i=0;i<ts.size();i++)
+
+ for (i = 0; i < ts.size(); i++)
{
tris_out[i] = static_cast<unsigned int>(ts[i]);
}
@@ -643,29 +630,22 @@ int HullLibrary::calchull(btVector3 *verts,int verts_count, TUIntArray& tris_out
return 1;
}
-
-
-
-
-bool HullLibrary::ComputeHull(unsigned int vcount,const btVector3 *vertices,PHullResult &result,unsigned int vlimit)
+bool HullLibrary::ComputeHull(unsigned int vcount, const btVector3 *vertices, PHullResult &result, unsigned int vlimit)
{
-
- int tris_count;
- int ret = calchull( (btVector3 *) vertices, (int) vcount, result.m_Indices, tris_count, static_cast<int>(vlimit) );
- if(!ret) return false;
- result.mIndexCount = (unsigned int) (tris_count*3);
- result.mFaceCount = (unsigned int) tris_count;
- result.mVertices = (btVector3*) vertices;
- result.mVcount = (unsigned int) vcount;
+ int tris_count;
+ int ret = calchull((btVector3 *)vertices, (int)vcount, result.m_Indices, tris_count, static_cast<int>(vlimit));
+ if (!ret) return false;
+ result.mIndexCount = (unsigned int)(tris_count * 3);
+ result.mFaceCount = (unsigned int)tris_count;
+ result.mVertices = (btVector3 *)vertices;
+ result.mVcount = (unsigned int)vcount;
return true;
-
}
-
void ReleaseHull(PHullResult &result);
void ReleaseHull(PHullResult &result)
{
- if ( result.m_Indices.size() )
+ if (result.m_Indices.size())
{
result.m_Indices.clear();
}
@@ -675,7 +655,6 @@ void ReleaseHull(PHullResult &result)
result.mVertices = 0;
}
-
//*********************************************************************
//*********************************************************************
//******** HullLib header
@@ -688,16 +667,15 @@ void ReleaseHull(PHullResult &result)
//*********************************************************************
//*********************************************************************
-HullError HullLibrary::CreateConvexHull(const HullDesc &desc, // describes the input request
- HullResult &result) // contains the resulst
+HullError HullLibrary::CreateConvexHull(const HullDesc &desc, // describes the input request
+ HullResult &result) // contains the resulst
{
HullError ret = QE_FAIL;
-
PHullResult hr;
unsigned int vcount = desc.mVcount;
- if ( vcount < 8 ) vcount = 8;
+ if (vcount < 8) vcount = 8;
btAlignedObjectArray<btVector3> vertexSource;
vertexSource.resize(static_cast<int>(vcount));
@@ -706,87 +684,82 @@ HullError HullLibrary::CreateConvexHull(const HullDesc &desc, //
unsigned int ovcount;
- bool ok = CleanupVertices(desc.mVcount,desc.mVertices, desc.mVertexStride, ovcount, &vertexSource[0], desc.mNormalEpsilon, scale ); // normalize point cloud, remove duplicates!
+ bool ok = CleanupVertices(desc.mVcount, desc.mVertices, desc.mVertexStride, ovcount, &vertexSource[0], desc.mNormalEpsilon, scale); // normalize point cloud, remove duplicates!
- if ( ok )
+ if (ok)
{
-
-
-// if ( 1 ) // scale vertices back to their original size.
+ // if ( 1 ) // scale vertices back to their original size.
{
- for (unsigned int i=0; i<ovcount; i++)
+ for (unsigned int i = 0; i < ovcount; i++)
{
- btVector3& v = vertexSource[static_cast<int>(i)];
- v[0]*=scale[0];
- v[1]*=scale[1];
- v[2]*=scale[2];
+ btVector3 &v = vertexSource[static_cast<int>(i)];
+ v[0] *= scale[0];
+ v[1] *= scale[1];
+ v[2] *= scale[2];
}
}
- ok = ComputeHull(ovcount,&vertexSource[0],hr,desc.mMaxVertices);
+ ok = ComputeHull(ovcount, &vertexSource[0], hr, desc.mMaxVertices);
- if ( ok )
+ if (ok)
{
-
// re-index triangle mesh so it refers to only used vertices, rebuild a new vertex table.
- btAlignedObjectArray<btVector3> vertexScratch;
+ btAlignedObjectArray<btVector3> vertexScratch;
vertexScratch.resize(static_cast<int>(hr.mVcount));
- BringOutYourDead(hr.mVertices,hr.mVcount, &vertexScratch[0], ovcount, &hr.m_Indices[0], hr.mIndexCount );
+ BringOutYourDead(hr.mVertices, hr.mVcount, &vertexScratch[0], ovcount, &hr.m_Indices[0], hr.mIndexCount);
ret = QE_OK;
- if ( desc.HasHullFlag(QF_TRIANGLES) ) // if he wants the results as triangle!
+ if (desc.HasHullFlag(QF_TRIANGLES)) // if he wants the results as triangle!
{
- result.mPolygons = false;
+ result.mPolygons = false;
result.mNumOutputVertices = ovcount;
result.m_OutputVertices.resize(static_cast<int>(ovcount));
- result.mNumFaces = hr.mFaceCount;
- result.mNumIndices = hr.mIndexCount;
+ result.mNumFaces = hr.mFaceCount;
+ result.mNumIndices = hr.mIndexCount;
result.m_Indices.resize(static_cast<int>(hr.mIndexCount));
- memcpy(&result.m_OutputVertices[0], &vertexScratch[0], sizeof(btVector3)*ovcount );
+ memcpy(&result.m_OutputVertices[0], &vertexScratch[0], sizeof(btVector3) * ovcount);
- if ( desc.HasHullFlag(QF_REVERSE_ORDER) )
+ if (desc.HasHullFlag(QF_REVERSE_ORDER))
{
-
const unsigned int *source = &hr.m_Indices[0];
- unsigned int *dest = &result.m_Indices[0];
+ unsigned int *dest = &result.m_Indices[0];
- for (unsigned int i=0; i<hr.mFaceCount; i++)
+ for (unsigned int i = 0; i < hr.mFaceCount; i++)
{
dest[0] = source[2];
dest[1] = source[1];
dest[2] = source[0];
- dest+=3;
- source+=3;
+ dest += 3;
+ source += 3;
}
-
}
else
{
- memcpy(&result.m_Indices[0], &hr.m_Indices[0], sizeof(unsigned int)*hr.mIndexCount);
+ memcpy(&result.m_Indices[0], &hr.m_Indices[0], sizeof(unsigned int) * hr.mIndexCount);
}
}
else
{
- result.mPolygons = true;
+ result.mPolygons = true;
result.mNumOutputVertices = ovcount;
result.m_OutputVertices.resize(static_cast<int>(ovcount));
- result.mNumFaces = hr.mFaceCount;
- result.mNumIndices = hr.mIndexCount+hr.mFaceCount;
+ result.mNumFaces = hr.mFaceCount;
+ result.mNumIndices = hr.mIndexCount + hr.mFaceCount;
result.m_Indices.resize(static_cast<int>(result.mNumIndices));
- memcpy(&result.m_OutputVertices[0], &vertexScratch[0], sizeof(btVector3)*ovcount );
+ memcpy(&result.m_OutputVertices[0], &vertexScratch[0], sizeof(btVector3) * ovcount);
-// if ( 1 )
+ // if ( 1 )
{
const unsigned int *source = &hr.m_Indices[0];
- unsigned int *dest = &result.m_Indices[0];
- for (unsigned int i=0; i<hr.mFaceCount; i++)
+ unsigned int *dest = &result.m_Indices[0];
+ for (unsigned int i = 0; i < hr.mFaceCount; i++)
{
dest[0] = 3;
- if ( desc.HasHullFlag(QF_REVERSE_ORDER) )
+ if (desc.HasHullFlag(QF_REVERSE_ORDER))
{
dest[1] = source[2];
dest[2] = source[1];
@@ -799,8 +772,8 @@ HullError HullLibrary::CreateConvexHull(const HullDesc &desc, //
dest[3] = source[2];
}
- dest+=4;
- source+=3;
+ dest += 4;
+ source += 3;
}
}
}
@@ -811,90 +784,83 @@ HullError HullLibrary::CreateConvexHull(const HullDesc &desc, //
return ret;
}
-
-
-HullError HullLibrary::ReleaseResult(HullResult &result) // release memory allocated for this result, we are done with it.
+HullError HullLibrary::ReleaseResult(HullResult &result) // release memory allocated for this result, we are done with it.
{
- if ( result.m_OutputVertices.size())
+ if (result.m_OutputVertices.size())
{
- result.mNumOutputVertices=0;
+ result.mNumOutputVertices = 0;
result.m_OutputVertices.clear();
}
- if ( result.m_Indices.size() )
+ if (result.m_Indices.size())
{
- result.mNumIndices=0;
+ result.mNumIndices = 0;
result.m_Indices.clear();
}
return QE_OK;
}
-
-static void addPoint(unsigned int &vcount,btVector3 *p,btScalar x,btScalar y,btScalar z)
+static void addPoint(unsigned int &vcount, btVector3 *p, btScalar x, btScalar y, btScalar z)
{
// XXX, might be broken
- btVector3& dest = p[vcount];
+ btVector3 &dest = p[vcount];
dest[0] = x;
dest[1] = y;
dest[2] = z;
vcount++;
}
-btScalar GetDist(btScalar px,btScalar py,btScalar pz,const btScalar *p2);
-btScalar GetDist(btScalar px,btScalar py,btScalar pz,const btScalar *p2)
+btScalar GetDist(btScalar px, btScalar py, btScalar pz, const btScalar *p2);
+btScalar GetDist(btScalar px, btScalar py, btScalar pz, const btScalar *p2)
{
-
btScalar dx = px - p2[0];
btScalar dy = py - p2[1];
btScalar dz = pz - p2[2];
- return dx*dx+dy*dy+dz*dz;
+ return dx * dx + dy * dy + dz * dz;
}
-
-
-bool HullLibrary::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)
+bool HullLibrary::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)
{
- if ( svcount == 0 ) return false;
+ if (svcount == 0) return false;
m_vertexIndexMapping.resize(0);
-
#define EPSILON btScalar(0.000001) /* close enough to consider two btScalaring point numbers to be 'the same'. */
vcount = 0;
- btScalar recip[3]={0.f,0.f,0.f};
+ btScalar recip[3] = {0.f, 0.f, 0.f};
- if ( scale )
+ if (scale)
{
scale[0] = 1;
scale[1] = 1;
scale[2] = 1;
}
- btScalar bmin[3] = { FLT_MAX, FLT_MAX, FLT_MAX };
- btScalar bmax[3] = { -FLT_MAX, -FLT_MAX, -FLT_MAX };
+ btScalar bmin[3] = {FLT_MAX, FLT_MAX, FLT_MAX};
+ btScalar bmax[3] = {-FLT_MAX, -FLT_MAX, -FLT_MAX};
- const char *vtx = (const char *) svertices;
+ const char *vtx = (const char *)svertices;
-// if ( 1 )
+ // if ( 1 )
{
- for (unsigned int i=0; i<svcount; i++)
+ for (unsigned int i = 0; i < svcount; i++)
{
- const btScalar *p = (const btScalar *) vtx;
+ const btScalar *p = (const btScalar *)vtx;
- vtx+=stride;
+ vtx += stride;
- for (int j=0; j<3; j++)
+ for (int j = 0; j < 3; j++)
{
- if ( p[j] < bmin[j] ) bmin[j] = p[j];
- if ( p[j] > bmax[j] ) bmax[j] = p[j];
+ if (p[j] < bmin[j]) bmin[j] = p[j];
+ if (p[j] > bmax[j]) bmax[j] = p[j];
}
}
}
@@ -905,28 +871,27 @@ bool HullLibrary::CleanupVertices(unsigned int svcount,
btVector3 center;
- center[0] = dx*btScalar(0.5) + bmin[0];
- center[1] = dy*btScalar(0.5) + bmin[1];
- center[2] = dz*btScalar(0.5) + bmin[2];
+ center[0] = dx * btScalar(0.5) + bmin[0];
+ center[1] = dy * btScalar(0.5) + bmin[1];
+ center[2] = dz * btScalar(0.5) + bmin[2];
- if ( dx < EPSILON || dy < EPSILON || dz < EPSILON || svcount < 3 )
+ if (dx < EPSILON || dy < EPSILON || dz < EPSILON || svcount < 3)
{
-
btScalar len = FLT_MAX;
- if ( dx > EPSILON && dx < len ) len = dx;
- if ( dy > EPSILON && dy < len ) len = dy;
- if ( dz > EPSILON && dz < len ) len = dz;
+ if (dx > EPSILON && dx < len) len = dx;
+ if (dy > EPSILON && dy < len) len = dy;
+ if (dz > EPSILON && dz < len) len = dz;
- if ( len == FLT_MAX )
+ if (len == FLT_MAX)
{
- dx = dy = dz = btScalar(0.01); // one centimeter
+ dx = dy = dz = btScalar(0.01); // one centimeter
}
else
{
- if ( dx < EPSILON ) dx = len * btScalar(0.05); // 1/5th the shortest non-zero edge.
- if ( dy < EPSILON ) dy = len * btScalar(0.05);
- if ( dz < EPSILON ) dz = len * btScalar(0.05);
+ if (dx < EPSILON) dx = len * btScalar(0.05); // 1/5th the shortest non-zero edge.
+ if (dy < EPSILON) dy = len * btScalar(0.05);
+ if (dz < EPSILON) dz = len * btScalar(0.05);
}
btScalar x1 = center[0] - dx;
@@ -938,22 +903,20 @@ bool HullLibrary::CleanupVertices(unsigned int svcount,
btScalar z1 = center[2] - dz;
btScalar z2 = center[2] + dz;
- addPoint(vcount,vertices,x1,y1,z1);
- addPoint(vcount,vertices,x2,y1,z1);
- addPoint(vcount,vertices,x2,y2,z1);
- addPoint(vcount,vertices,x1,y2,z1);
- addPoint(vcount,vertices,x1,y1,z2);
- addPoint(vcount,vertices,x2,y1,z2);
- addPoint(vcount,vertices,x2,y2,z2);
- addPoint(vcount,vertices,x1,y2,z2);
-
- return true; // return cube
-
+ addPoint(vcount, vertices, x1, y1, z1);
+ addPoint(vcount, vertices, x2, y1, z1);
+ addPoint(vcount, vertices, x2, y2, z1);
+ addPoint(vcount, vertices, x1, y2, z1);
+ addPoint(vcount, vertices, x1, y1, z2);
+ addPoint(vcount, vertices, x2, y1, z2);
+ addPoint(vcount, vertices, x2, y2, z2);
+ addPoint(vcount, vertices, x1, y2, z2);
+ return true; // return cube
}
else
{
- if ( scale )
+ if (scale)
{
scale[0] = dx;
scale[1] = dy;
@@ -963,75 +926,70 @@ bool HullLibrary::CleanupVertices(unsigned int svcount,
recip[1] = 1 / dy;
recip[2] = 1 / dz;
- center[0]*=recip[0];
- center[1]*=recip[1];
- center[2]*=recip[2];
-
+ center[0] *= recip[0];
+ center[1] *= recip[1];
+ center[2] *= recip[2];
}
-
}
+ vtx = (const char *)svertices;
-
- vtx = (const char *) svertices;
-
- for (unsigned int i=0; i<svcount; i++)
+ for (unsigned int i = 0; i < svcount; i++)
{
const btVector3 *p = (const btVector3 *)vtx;
- vtx+=stride;
+ vtx += stride;
btScalar px = p->getX();
btScalar py = p->getY();
btScalar pz = p->getZ();
- if ( scale )
+ if (scale)
{
- px = px*recip[0]; // normalize
- py = py*recip[1]; // normalize
- pz = pz*recip[2]; // normalize
+ px = px * recip[0]; // normalize
+ py = py * recip[1]; // normalize
+ pz = pz * recip[2]; // normalize
}
-// if ( 1 )
+ // if ( 1 )
{
unsigned int j;
- for (j=0; j<vcount; j++)
+ for (j = 0; j < vcount; j++)
{
/// XXX might be broken
- btVector3& v = vertices[j];
+ btVector3 &v = vertices[j];
btScalar x = v[0];
btScalar y = v[1];
btScalar z = v[2];
- btScalar dx = btFabs(x - px );
- btScalar dy = btFabs(y - py );
- btScalar dz = btFabs(z - pz );
+ btScalar dx = btFabs(x - px);
+ btScalar dy = btFabs(y - py);
+ btScalar dz = btFabs(z - pz);
- if ( dx < normalepsilon && dy < normalepsilon && dz < normalepsilon )
+ if (dx < normalepsilon && dy < normalepsilon && dz < normalepsilon)
{
// ok, it is close enough to the old one
// now let us see if it is further from the center of the point cloud than the one we already recorded.
// in which case we keep this one instead.
- btScalar dist1 = GetDist(px,py,pz,center);
- btScalar dist2 = GetDist(v[0],v[1],v[2],center);
+ btScalar dist1 = GetDist(px, py, pz, center);
+ btScalar dist2 = GetDist(v[0], v[1], v[2], center);
- if ( dist1 > dist2 )
+ if (dist1 > dist2)
{
v[0] = px;
v[1] = py;
v[2] = pz;
-
}
break;
}
}
- if ( j == vcount )
+ if (j == vcount)
{
- btVector3& dest = vertices[vcount];
+ btVector3 &dest = vertices[vcount];
dest[0] = px;
dest[1] = py;
dest[2] = pz;
@@ -1042,18 +1000,18 @@ bool HullLibrary::CleanupVertices(unsigned int svcount,
}
// ok..now make sure we didn't prune so many vertices it is now invalid.
-// if ( 1 )
+ // if ( 1 )
{
- btScalar bmin[3] = { FLT_MAX, FLT_MAX, FLT_MAX };
- btScalar bmax[3] = { -FLT_MAX, -FLT_MAX, -FLT_MAX };
+ btScalar bmin[3] = {FLT_MAX, FLT_MAX, FLT_MAX};
+ btScalar bmax[3] = {-FLT_MAX, -FLT_MAX, -FLT_MAX};
- for (unsigned int i=0; i<vcount; i++)
+ for (unsigned int i = 0; i < vcount; i++)
{
- const btVector3& p = vertices[i];
- for (int j=0; j<3; j++)
+ const btVector3 &p = vertices[i];
+ for (int j = 0; j < 3; j++)
{
- if ( p[j] < bmin[j] ) bmin[j] = p[j];
- if ( p[j] > bmax[j] ) bmax[j] = p[j];
+ if (p[j] < bmin[j]) bmin[j] = p[j];
+ if (p[j] > bmax[j]) bmax[j] = p[j];
}
}
@@ -1061,27 +1019,27 @@ bool HullLibrary::CleanupVertices(unsigned int svcount,
btScalar dy = bmax[1] - bmin[1];
btScalar dz = bmax[2] - bmin[2];
- if ( dx < EPSILON || dy < EPSILON || dz < EPSILON || vcount < 3)
+ if (dx < EPSILON || dy < EPSILON || dz < EPSILON || vcount < 3)
{
- btScalar cx = dx*btScalar(0.5) + bmin[0];
- btScalar cy = dy*btScalar(0.5) + bmin[1];
- btScalar cz = dz*btScalar(0.5) + bmin[2];
+ btScalar cx = dx * btScalar(0.5) + bmin[0];
+ btScalar cy = dy * btScalar(0.5) + bmin[1];
+ btScalar cz = dz * btScalar(0.5) + bmin[2];
btScalar len = FLT_MAX;
- if ( dx >= EPSILON && dx < len ) len = dx;
- if ( dy >= EPSILON && dy < len ) len = dy;
- if ( dz >= EPSILON && dz < len ) len = dz;
+ if (dx >= EPSILON && dx < len) len = dx;
+ if (dy >= EPSILON && dy < len) len = dy;
+ if (dz >= EPSILON && dz < len) len = dz;
- if ( len == FLT_MAX )
+ if (len == FLT_MAX)
{
- dx = dy = dz = btScalar(0.01); // one centimeter
+ dx = dy = dz = btScalar(0.01); // one centimeter
}
else
{
- if ( dx < EPSILON ) dx = len * btScalar(0.05); // 1/5th the shortest non-zero edge.
- if ( dy < EPSILON ) dy = len * btScalar(0.05);
- if ( dz < EPSILON ) dz = len * btScalar(0.05);
+ if (dx < EPSILON) dx = len * btScalar(0.05); // 1/5th the shortest non-zero edge.
+ if (dy < EPSILON) dy = len * btScalar(0.05);
+ if (dz < EPSILON) dz = len * btScalar(0.05);
}
btScalar x1 = cx - dx;
@@ -1093,16 +1051,16 @@ bool HullLibrary::CleanupVertices(unsigned int svcount,
btScalar z1 = cz - dz;
btScalar z2 = cz + dz;
- vcount = 0; // add box
+ vcount = 0; // add box
- addPoint(vcount,vertices,x1,y1,z1);
- addPoint(vcount,vertices,x2,y1,z1);
- addPoint(vcount,vertices,x2,y2,z1);
- addPoint(vcount,vertices,x1,y2,z1);
- addPoint(vcount,vertices,x1,y1,z2);
- addPoint(vcount,vertices,x2,y1,z2);
- addPoint(vcount,vertices,x2,y2,z2);
- addPoint(vcount,vertices,x1,y2,z2);
+ addPoint(vcount, vertices, x1, y1, z1);
+ addPoint(vcount, vertices, x2, y1, z1);
+ addPoint(vcount, vertices, x2, y2, z1);
+ addPoint(vcount, vertices, x1, y2, z1);
+ addPoint(vcount, vertices, x1, y1, z2);
+ addPoint(vcount, vertices, x2, y1, z2);
+ addPoint(vcount, vertices, x2, y2, z2);
+ addPoint(vcount, vertices, x1, y2, z2);
return true;
}
@@ -1111,57 +1069,52 @@ bool HullLibrary::CleanupVertices(unsigned int svcount,
return true;
}
-void HullLibrary::BringOutYourDead(const btVector3* verts,unsigned int vcount, btVector3* overts,unsigned int &ocount,unsigned int *indices,unsigned indexcount)
+void HullLibrary::BringOutYourDead(const btVector3 *verts, unsigned int vcount, btVector3 *overts, unsigned int &ocount, unsigned int *indices, unsigned indexcount)
{
- btAlignedObjectArray<int>tmpIndices;
+ btAlignedObjectArray<int> tmpIndices;
tmpIndices.resize(m_vertexIndexMapping.size());
int i;
- for (i=0;i<m_vertexIndexMapping.size();i++)
+ for (i = 0; i < m_vertexIndexMapping.size(); i++)
{
tmpIndices[i] = m_vertexIndexMapping[i];
}
TUIntArray usedIndices;
usedIndices.resize(static_cast<int>(vcount));
- memset(&usedIndices[0],0,sizeof(unsigned int)*vcount);
+ memset(&usedIndices[0], 0, sizeof(unsigned int) * vcount);
ocount = 0;
- for (i=0; i<int (indexcount); i++)
+ for (i = 0; i < int(indexcount); i++)
{
- unsigned int v = indices[i]; // original array index
+ unsigned int v = indices[i]; // original array index
- btAssert( v >= 0 && v < vcount );
+ btAssert(v >= 0 && v < vcount);
- if ( usedIndices[static_cast<int>(v)] ) // if already remapped
+ if (usedIndices[static_cast<int>(v)]) // if already remapped
{
- indices[i] = usedIndices[static_cast<int>(v)]-1; // index to new array
+ indices[i] = usedIndices[static_cast<int>(v)] - 1; // index to new array
}
else
{
+ indices[i] = ocount; // new index mapping
- indices[i] = ocount; // new index mapping
-
- overts[ocount][0] = verts[v][0]; // copy old vert to new vert array
+ overts[ocount][0] = verts[v][0]; // copy old vert to new vert array
overts[ocount][1] = verts[v][1];
overts[ocount][2] = verts[v][2];
- for (int k=0;k<m_vertexIndexMapping.size();k++)
+ for (int k = 0; k < m_vertexIndexMapping.size(); k++)
{
- if (tmpIndices[k]==int(v))
- m_vertexIndexMapping[k]=ocount;
+ if (tmpIndices[k] == int(v))
+ m_vertexIndexMapping[k] = ocount;
}
- ocount++; // increment output vert count
-
- btAssert( ocount >=0 && ocount <= vcount );
+ ocount++; // increment output vert count
- usedIndices[static_cast<int>(v)] = ocount; // assign new index remapping
+ btAssert(ocount >= 0 && ocount <= vcount);
-
+ usedIndices[static_cast<int>(v)] = ocount; // assign new index remapping
}
}
-
-
}
diff --git a/thirdparty/bullet/LinearMath/btConvexHull.h b/thirdparty/bullet/LinearMath/btConvexHull.h
index 69c52bc6f8..f890d75ea1 100644
--- a/thirdparty/bullet/LinearMath/btConvexHull.h
+++ b/thirdparty/bullet/LinearMath/btConvexHull.h
@@ -34,106 +34,102 @@ public:
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<btVector3> m_OutputVertices; // array of vertices
- unsigned int mNumFaces; // the number of faces produced
- unsigned int mNumIndices; // the total number of indices
- btAlignedObjectArray<unsigned int> 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..
+ bool mPolygons; // true if indices represents polygons, false indices are triangles
+ unsigned int mNumOutputVertices; // number of vertices in the output hull
+ btAlignedObjectArray<btVector3> m_OutputVertices; // array of vertices
+ unsigned int mNumFaces; // the number of faces produced
+ unsigned int mNumIndices; // the total number of indices
+ btAlignedObjectArray<unsigned int> 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
+ 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;
+ 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))
+ 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;
+ mFlags = flag;
+ mVcount = vcount;
+ mVertices = vertices;
+ mVertexStride = stride;
+ mNormalEpsilon = btScalar(0.001);
+ mMaxVertices = 4096;
}
bool HasHullFlag(HullFlag flag) const
{
- if ( mFlags & flag ) return true;
+ if (mFlags & flag) return true;
return false;
}
void SetHullFlag(HullFlag flag)
{
- mFlags|=flag;
+ mFlags |= flag;
}
void ClearHullFlag(HullFlag flag)
{
- mFlags&=~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;
+ 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.
+ 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){}
-
+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
+class ConvexH
{
- public:
+public:
class HalfEdge
{
- public:
+ 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){}
+ HalfEdge() {}
+ HalfEdge(short _ea, unsigned char _v, unsigned char _p) : ea(_ea), v(_v), p(_p) {}
};
ConvexH()
{
@@ -143,25 +139,29 @@ class ConvexH
}
btAlignedObjectArray<btVector3> vertices;
btAlignedObjectArray<HalfEdge> edges;
- btAlignedObjectArray<btPlane> facets;
- ConvexH(int vertices_size,int edges_size,int facets_size);
+ btAlignedObjectArray<btPlane> facets;
+ ConvexH(int vertices_size, int edges_size, int facets_size);
};
-
class int4
{
public:
- int x,y,z,w;
+ int x, y, z, w;
int4(){};
- int4(int _x,int _y, int _z,int _w){x=_x;y=_y;z=_z;w=_w;}
- const int& operator[](int i) const {return (&x)[i];}
- int& operator[](int i) {return (&x)[i];}
+ int4(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;
@@ -173,69 +173,61 @@ public:
unsigned int mVcount;
unsigned int mIndexCount;
unsigned int mFaceCount;
- btVector3* mVertices;
+ 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<class btHullTriangle*> m_tris;
public:
-
btAlignedObjectArray<int> 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.
+ 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);
- 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);
+ 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 removeb2b(btHullTriangle* s, btHullTriangle* t);
- void checkit(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 calchull(btVector3* verts, int verts_count, TUIntArray& tris_out, int& tris_count, int vlimit);
- int calchullgen(btVector3 *verts,int verts_count, int vlimit);
+ int calchullgen(btVector3* verts, int verts_count, int vlimit);
- int4 FindSimplex(btVector3 *verts,int verts_count,btAlignedObjectArray<int> &allow);
+ int4 FindSimplex(btVector3* verts, int verts_count, btAlignedObjectArray<int>& allow);
- class ConvexH* ConvexHCrop(ConvexH& convex,const btPlane& slice);
+ class ConvexH* ConvexHCrop(ConvexH& convex, const btPlane& slice);
- void extrude(class btHullTriangle* t0,int v);
+ 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'.
+ //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);
+ 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);
+ 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
-
+#endif //BT_CD_HULL_H
diff --git a/thirdparty/bullet/LinearMath/btConvexHullComputer.cpp b/thirdparty/bullet/LinearMath/btConvexHullComputer.cpp
index 2ea22cbe3b..8bbfdc5f25 100644
--- a/thirdparty/bullet/LinearMath/btConvexHullComputer.cpp
+++ b/thirdparty/bullet/LinearMath/btConvexHullComputer.cpp
@@ -20,846 +20,847 @@ subject to the following restrictions:
#include "btVector3.h"
#ifdef __GNUC__
- #include <stdint.h>
+#include <stdint.h>
#elif defined(_MSC_VER)
- typedef __int32 int32_t;
- typedef __int64 int64_t;
- typedef unsigned __int32 uint32_t;
- typedef unsigned __int64 uint64_t;
+typedef __int32 int32_t;
+typedef __int64 int64_t;
+typedef unsigned __int32 uint32_t;
+typedef unsigned __int64 uint64_t;
#else
- typedef int int32_t;
- typedef long long int int64_t;
- typedef unsigned int uint32_t;
- typedef unsigned long long int uint64_t;
+typedef int int32_t;
+typedef long long int int64_t;
+typedef unsigned int uint32_t;
+typedef unsigned long long int uint64_t;
#endif
-
//The definition of USE_X86_64_ASM is moved into the build system. You can enable it manually by commenting out the following lines
//#if (defined(__GNUC__) && defined(__x86_64__) && !defined(__ICL)) // || (defined(__ICL) && defined(_M_X64)) bug in Intel compiler, disable inline assembly
// #define USE_X86_64_ASM
//#endif
-
//#define DEBUG_CONVEX_HULL
//#define SHOW_ITERATIONS
#if defined(DEBUG_CONVEX_HULL) || defined(SHOW_ITERATIONS)
- #include <stdio.h>
+#include <stdio.h>
#endif
// Convex hull implementation based on Preparata and Hong
// Ole Kniemeyer, MAXON Computer GmbH
class btConvexHullInternal
{
+public:
+ class Point64
+ {
public:
-
- class Point64
- {
- public:
- int64_t x;
- int64_t y;
- int64_t z;
-
- Point64(int64_t x, int64_t y, int64_t z): x(x), y(y), z(z)
- {
- }
+ int64_t x;
+ int64_t y;
+ int64_t z;
- bool isZero()
- {
- return (x == 0) && (y == 0) && (z == 0);
- }
+ Point64(int64_t x, int64_t y, int64_t z) : x(x), y(y), z(z)
+ {
+ }
- int64_t dot(const Point64& b) const
- {
- return x * b.x + y * b.y + z * b.z;
- }
- };
-
- class Point32
- {
- public:
- int32_t x;
- int32_t y;
- int32_t z;
- int index;
-
- Point32()
- {
- }
-
- Point32(int32_t x, int32_t y, int32_t z): x(x), y(y), z(z), index(-1)
- {
- }
-
- bool operator==(const Point32& b) const
- {
- return (x == b.x) && (y == b.y) && (z == b.z);
- }
+ bool isZero()
+ {
+ return (x == 0) && (y == 0) && (z == 0);
+ }
- bool operator!=(const Point32& b) const
- {
- return (x != b.x) || (y != b.y) || (z != b.z);
- }
+ int64_t dot(const Point64& b) const
+ {
+ return x * b.x + y * b.y + z * b.z;
+ }
+ };
- bool isZero()
- {
- return (x == 0) && (y == 0) && (z == 0);
- }
+ class Point32
+ {
+ public:
+ int32_t x;
+ int32_t y;
+ int32_t z;
+ int index;
- Point64 cross(const Point32& b) const
- {
- return Point64(y * b.z - z * b.y, z * b.x - x * b.z, x * b.y - y * b.x);
- }
+ Point32()
+ {
+ }
- Point64 cross(const Point64& b) const
- {
- return Point64(y * b.z - z * b.y, z * b.x - x * b.z, x * b.y - y * b.x);
- }
+ Point32(int32_t x, int32_t y, int32_t z) : x(x), y(y), z(z), index(-1)
+ {
+ }
- int64_t dot(const Point32& b) const
- {
- return x * b.x + y * b.y + z * b.z;
- }
+ bool operator==(const Point32& b) const
+ {
+ return (x == b.x) && (y == b.y) && (z == b.z);
+ }
- int64_t dot(const Point64& b) const
- {
- return x * b.x + y * b.y + z * b.z;
- }
+ bool operator!=(const Point32& b) const
+ {
+ return (x != b.x) || (y != b.y) || (z != b.z);
+ }
- Point32 operator+(const Point32& b) const
- {
- return Point32(x + b.x, y + b.y, z + b.z);
- }
+ bool isZero()
+ {
+ return (x == 0) && (y == 0) && (z == 0);
+ }
- Point32 operator-(const Point32& b) const
- {
- return Point32(x - b.x, y - b.y, z - b.z);
- }
- };
+ Point64 cross(const Point32& b) const
+ {
+ return Point64(y * b.z - z * b.y, z * b.x - x * b.z, x * b.y - y * b.x);
+ }
- class Int128
+ Point64 cross(const Point64& b) const
{
- public:
- uint64_t low;
- uint64_t high;
+ return Point64(y * b.z - z * b.y, z * b.x - x * b.z, x * b.y - y * b.x);
+ }
- Int128()
- {
- }
+ int64_t dot(const Point32& b) const
+ {
+ return x * b.x + y * b.y + z * b.z;
+ }
- Int128(uint64_t low, uint64_t high): low(low), high(high)
- {
- }
+ int64_t dot(const Point64& b) const
+ {
+ return x * b.x + y * b.y + z * b.z;
+ }
- Int128(uint64_t low): low(low), high(0)
- {
- }
+ Point32 operator+(const Point32& b) const
+ {
+ return Point32(x + b.x, y + b.y, z + b.z);
+ }
- Int128(int64_t value): low(value), high((value >= 0) ? 0 : (uint64_t) -1LL)
- {
- }
+ Point32 operator-(const Point32& b) const
+ {
+ return Point32(x - b.x, y - b.y, z - b.z);
+ }
+ };
- static Int128 mul(int64_t a, int64_t b);
+ class Int128
+ {
+ public:
+ uint64_t low;
+ uint64_t high;
- static Int128 mul(uint64_t a, uint64_t b);
+ Int128()
+ {
+ }
- Int128 operator-() const
- {
- return Int128((uint64_t) -(int64_t)low, ~high + (low == 0));
- }
+ Int128(uint64_t low, uint64_t high) : low(low), high(high)
+ {
+ }
- Int128 operator+(const Int128& b) const
- {
+ Int128(uint64_t low) : low(low), high(0)
+ {
+ }
+
+ Int128(int64_t value) : low(value), high((value >= 0) ? 0 : (uint64_t)-1LL)
+ {
+ }
+
+ static Int128 mul(int64_t a, int64_t b);
+
+ static Int128 mul(uint64_t a, uint64_t b);
+
+ Int128 operator-() const
+ {
+ return Int128((uint64_t) - (int64_t)low, ~high + (low == 0));
+ }
+
+ Int128 operator+(const Int128& b) const
+ {
#ifdef USE_X86_64_ASM
- Int128 result;
- __asm__ ("addq %[bl], %[rl]\n\t"
- "adcq %[bh], %[rh]\n\t"
- : [rl] "=r" (result.low), [rh] "=r" (result.high)
- : "0"(low), "1"(high), [bl] "g"(b.low), [bh] "g"(b.high)
- : "cc" );
- return result;
+ Int128 result;
+ __asm__(
+ "addq %[bl], %[rl]\n\t"
+ "adcq %[bh], %[rh]\n\t"
+ : [rl] "=r"(result.low), [rh] "=r"(result.high)
+ : "0"(low), "1"(high), [bl] "g"(b.low), [bh] "g"(b.high)
+ : "cc");
+ return result;
#else
- uint64_t lo = low + b.low;
- return Int128(lo, high + b.high + (lo < low));
+ uint64_t lo = low + b.low;
+ return Int128(lo, high + b.high + (lo < low));
#endif
- }
+ }
- Int128 operator-(const Int128& b) const
- {
+ Int128 operator-(const Int128& b) const
+ {
#ifdef USE_X86_64_ASM
- Int128 result;
- __asm__ ("subq %[bl], %[rl]\n\t"
- "sbbq %[bh], %[rh]\n\t"
- : [rl] "=r" (result.low), [rh] "=r" (result.high)
- : "0"(low), "1"(high), [bl] "g"(b.low), [bh] "g"(b.high)
- : "cc" );
- return result;
+ Int128 result;
+ __asm__(
+ "subq %[bl], %[rl]\n\t"
+ "sbbq %[bh], %[rh]\n\t"
+ : [rl] "=r"(result.low), [rh] "=r"(result.high)
+ : "0"(low), "1"(high), [bl] "g"(b.low), [bh] "g"(b.high)
+ : "cc");
+ return result;
#else
- return *this + -b;
+ return *this + -b;
#endif
- }
+ }
- Int128& operator+=(const Int128& b)
- {
+ Int128& operator+=(const Int128& b)
+ {
#ifdef USE_X86_64_ASM
- __asm__ ("addq %[bl], %[rl]\n\t"
- "adcq %[bh], %[rh]\n\t"
- : [rl] "=r" (low), [rh] "=r" (high)
- : "0"(low), "1"(high), [bl] "g"(b.low), [bh] "g"(b.high)
- : "cc" );
+ __asm__(
+ "addq %[bl], %[rl]\n\t"
+ "adcq %[bh], %[rh]\n\t"
+ : [rl] "=r"(low), [rh] "=r"(high)
+ : "0"(low), "1"(high), [bl] "g"(b.low), [bh] "g"(b.high)
+ : "cc");
#else
- uint64_t lo = low + b.low;
- if (lo < low)
- {
- ++high;
- }
- low = lo;
- high += b.high;
+ uint64_t lo = low + b.low;
+ if (lo < low)
+ {
+ ++high;
+ }
+ low = lo;
+ high += b.high;
#endif
- return *this;
- }
+ return *this;
+ }
- Int128& operator++()
- {
- if (++low == 0)
- {
- ++high;
- }
- return *this;
- }
+ Int128& operator++()
+ {
+ if (++low == 0)
+ {
+ ++high;
+ }
+ return *this;
+ }
- Int128 operator*(int64_t b) const;
+ Int128 operator*(int64_t b) const;
- btScalar toScalar() const
- {
- return ((int64_t) high >= 0) ? btScalar(high) * (btScalar(0x100000000LL) * btScalar(0x100000000LL)) + btScalar(low)
- : -(-*this).toScalar();
- }
+ btScalar toScalar() const
+ {
+ return ((int64_t)high >= 0) ? btScalar(high) * (btScalar(0x100000000LL) * btScalar(0x100000000LL)) + btScalar(low)
+ : -(-*this).toScalar();
+ }
- int getSign() const
- {
- return ((int64_t) high < 0) ? -1 : (high || low) ? 1 : 0;
- }
+ int getSign() const
+ {
+ return ((int64_t)high < 0) ? -1 : (high || low) ? 1 : 0;
+ }
- bool operator<(const Int128& b) const
- {
- return (high < b.high) || ((high == b.high) && (low < b.low));
- }
+ bool operator<(const Int128& b) const
+ {
+ return (high < b.high) || ((high == b.high) && (low < b.low));
+ }
- int ucmp(const Int128&b) const
- {
- if (high < b.high)
- {
- return -1;
- }
- if (high > b.high)
- {
- return 1;
- }
- if (low < b.low)
- {
- return -1;
- }
- if (low > b.low)
- {
- return 1;
- }
- return 0;
- }
- };
+ int ucmp(const Int128& b) const
+ {
+ if (high < b.high)
+ {
+ return -1;
+ }
+ if (high > b.high)
+ {
+ return 1;
+ }
+ if (low < b.low)
+ {
+ return -1;
+ }
+ if (low > b.low)
+ {
+ return 1;
+ }
+ return 0;
+ }
+ };
+ class Rational64
+ {
+ private:
+ uint64_t m_numerator;
+ uint64_t m_denominator;
+ int sign;
- class Rational64
+ public:
+ Rational64(int64_t numerator, int64_t denominator)
{
- private:
- uint64_t m_numerator;
- uint64_t m_denominator;
- int sign;
-
- public:
- Rational64(int64_t numerator, int64_t denominator)
- {
- if (numerator > 0)
- {
- sign = 1;
- m_numerator = (uint64_t) numerator;
- }
- else if (numerator < 0)
- {
- sign = -1;
- m_numerator = (uint64_t) -numerator;
- }
- else
- {
- sign = 0;
- m_numerator = 0;
- }
- if (denominator > 0)
- {
- m_denominator = (uint64_t) denominator;
- }
- else if (denominator < 0)
- {
- sign = -sign;
- m_denominator = (uint64_t) -denominator;
- }
- else
- {
- m_denominator = 0;
- }
- }
-
- bool isNegativeInfinity() const
- {
- return (sign < 0) && (m_denominator == 0);
- }
-
- bool isNaN() const
- {
- return (sign == 0) && (m_denominator == 0);
- }
-
- int compare(const Rational64& b) const;
-
- btScalar toScalar() const
- {
- return sign * ((m_denominator == 0) ? SIMD_INFINITY : (btScalar) m_numerator / m_denominator);
- }
- };
-
+ if (numerator > 0)
+ {
+ sign = 1;
+ m_numerator = (uint64_t)numerator;
+ }
+ else if (numerator < 0)
+ {
+ sign = -1;
+ m_numerator = (uint64_t)-numerator;
+ }
+ else
+ {
+ sign = 0;
+ m_numerator = 0;
+ }
+ if (denominator > 0)
+ {
+ m_denominator = (uint64_t)denominator;
+ }
+ else if (denominator < 0)
+ {
+ sign = -sign;
+ m_denominator = (uint64_t)-denominator;
+ }
+ else
+ {
+ m_denominator = 0;
+ }
+ }
- class Rational128
+ bool isNegativeInfinity() const
{
- private:
- Int128 numerator;
- Int128 denominator;
- int sign;
- bool isInt64;
+ return (sign < 0) && (m_denominator == 0);
+ }
- public:
- Rational128(int64_t value)
- {
- if (value > 0)
- {
- sign = 1;
- this->numerator = value;
- }
- else if (value < 0)
- {
- sign = -1;
- this->numerator = -value;
- }
- else
- {
- sign = 0;
- this->numerator = (uint64_t) 0;
- }
- this->denominator = (uint64_t) 1;
- isInt64 = true;
- }
+ bool isNaN() const
+ {
+ return (sign == 0) && (m_denominator == 0);
+ }
- Rational128(const Int128& numerator, const Int128& denominator)
- {
- sign = numerator.getSign();
- if (sign >= 0)
- {
- this->numerator = numerator;
- }
- else
- {
- this->numerator = -numerator;
- }
- int dsign = denominator.getSign();
- if (dsign >= 0)
- {
- this->denominator = denominator;
- }
- else
- {
- sign = -sign;
- this->denominator = -denominator;
- }
- isInt64 = false;
- }
+ int compare(const Rational64& b) const;
- int compare(const Rational128& b) const;
+ btScalar toScalar() const
+ {
+ return sign * ((m_denominator == 0) ? SIMD_INFINITY : (btScalar)m_numerator / m_denominator);
+ }
+ };
- int compare(int64_t b) const;
+ class Rational128
+ {
+ private:
+ Int128 numerator;
+ Int128 denominator;
+ int sign;
+ bool isInt64;
- btScalar toScalar() const
- {
- return sign * ((denominator.getSign() == 0) ? SIMD_INFINITY : numerator.toScalar() / denominator.toScalar());
- }
- };
+ public:
+ Rational128(int64_t value)
+ {
+ if (value > 0)
+ {
+ sign = 1;
+ this->numerator = value;
+ }
+ else if (value < 0)
+ {
+ sign = -1;
+ this->numerator = -value;
+ }
+ else
+ {
+ sign = 0;
+ this->numerator = (uint64_t)0;
+ }
+ this->denominator = (uint64_t)1;
+ isInt64 = true;
+ }
- class PointR128
+ Rational128(const Int128& numerator, const Int128& denominator)
{
- public:
- Int128 x;
- Int128 y;
- Int128 z;
- Int128 denominator;
+ sign = numerator.getSign();
+ if (sign >= 0)
+ {
+ this->numerator = numerator;
+ }
+ else
+ {
+ this->numerator = -numerator;
+ }
+ int dsign = denominator.getSign();
+ if (dsign >= 0)
+ {
+ this->denominator = denominator;
+ }
+ else
+ {
+ sign = -sign;
+ this->denominator = -denominator;
+ }
+ isInt64 = false;
+ }
- PointR128()
- {
- }
+ int compare(const Rational128& b) const;
- PointR128(Int128 x, Int128 y, Int128 z, Int128 denominator): x(x), y(y), z(z), denominator(denominator)
- {
- }
+ int compare(int64_t b) const;
- btScalar xvalue() const
- {
- return x.toScalar() / denominator.toScalar();
- }
+ btScalar toScalar() const
+ {
+ return sign * ((denominator.getSign() == 0) ? SIMD_INFINITY : numerator.toScalar() / denominator.toScalar());
+ }
+ };
- btScalar yvalue() const
- {
- return y.toScalar() / denominator.toScalar();
- }
+ class PointR128
+ {
+ public:
+ Int128 x;
+ Int128 y;
+ Int128 z;
+ Int128 denominator;
- btScalar zvalue() const
- {
- return z.toScalar() / denominator.toScalar();
- }
- };
+ PointR128()
+ {
+ }
+ PointR128(Int128 x, Int128 y, Int128 z, Int128 denominator) : x(x), y(y), z(z), denominator(denominator)
+ {
+ }
- class Edge;
- class Face;
+ btScalar xvalue() const
+ {
+ return x.toScalar() / denominator.toScalar();
+ }
- class Vertex
+ btScalar yvalue() const
{
- public:
- Vertex* next;
- Vertex* prev;
- Edge* edges;
- Face* firstNearbyFace;
- Face* lastNearbyFace;
- PointR128 point128;
- Point32 point;
- int copy;
-
- Vertex(): next(NULL), prev(NULL), edges(NULL), firstNearbyFace(NULL), lastNearbyFace(NULL), copy(-1)
- {
- }
+ return y.toScalar() / denominator.toScalar();
+ }
-#ifdef DEBUG_CONVEX_HULL
- void print()
- {
- printf("V%d (%d, %d, %d)", point.index, point.x, point.y, point.z);
- }
+ btScalar zvalue() const
+ {
+ return z.toScalar() / denominator.toScalar();
+ }
+ };
- void printGraph();
-#endif
+ class Edge;
+ class Face;
- Point32 operator-(const Vertex& b) const
- {
- return point - b.point;
- }
+ class Vertex
+ {
+ public:
+ Vertex* next;
+ Vertex* prev;
+ Edge* edges;
+ Face* firstNearbyFace;
+ Face* lastNearbyFace;
+ PointR128 point128;
+ Point32 point;
+ int copy;
- Rational128 dot(const Point64& b) const
- {
- return (point.index >= 0) ? Rational128(point.dot(b))
- : Rational128(point128.x * b.x + point128.y * b.y + point128.z * b.z, point128.denominator);
- }
+ Vertex() : next(NULL), prev(NULL), edges(NULL), firstNearbyFace(NULL), lastNearbyFace(NULL), copy(-1)
+ {
+ }
- btScalar xvalue() const
- {
- return (point.index >= 0) ? btScalar(point.x) : point128.xvalue();
- }
+#ifdef DEBUG_CONVEX_HULL
+ void print()
+ {
+ printf("V%d (%d, %d, %d)", point.index, point.x, point.y, point.z);
+ }
- btScalar yvalue() const
- {
- return (point.index >= 0) ? btScalar(point.y) : point128.yvalue();
- }
+ void printGraph();
+#endif
- btScalar zvalue() const
- {
- return (point.index >= 0) ? btScalar(point.z) : point128.zvalue();
- }
+ Point32 operator-(const Vertex& b) const
+ {
+ return point - b.point;
+ }
- void receiveNearbyFaces(Vertex* src)
- {
- if (lastNearbyFace)
- {
- lastNearbyFace->nextWithSameNearbyVertex = src->firstNearbyFace;
- }
- else
- {
- firstNearbyFace = src->firstNearbyFace;
- }
- if (src->lastNearbyFace)
- {
- lastNearbyFace = src->lastNearbyFace;
- }
- for (Face* f = src->firstNearbyFace; f; f = f->nextWithSameNearbyVertex)
- {
- btAssert(f->nearbyVertex == src);
- f->nearbyVertex = this;
- }
- src->firstNearbyFace = NULL;
- src->lastNearbyFace = NULL;
- }
- };
+ Rational128 dot(const Point64& b) const
+ {
+ return (point.index >= 0) ? Rational128(point.dot(b))
+ : Rational128(point128.x * b.x + point128.y * b.y + point128.z * b.z, point128.denominator);
+ }
+ btScalar xvalue() const
+ {
+ return (point.index >= 0) ? btScalar(point.x) : point128.xvalue();
+ }
- class Edge
+ btScalar yvalue() const
{
- public:
- Edge* next;
- Edge* prev;
- Edge* reverse;
- Vertex* target;
- Face* face;
- int copy;
+ return (point.index >= 0) ? btScalar(point.y) : point128.yvalue();
+ }
- ~Edge()
- {
- next = NULL;
- prev = NULL;
- reverse = NULL;
- target = NULL;
- face = NULL;
- }
+ btScalar zvalue() const
+ {
+ return (point.index >= 0) ? btScalar(point.z) : point128.zvalue();
+ }
- void link(Edge* n)
- {
- btAssert(reverse->target == n->reverse->target);
- next = n;
- n->prev = this;
- }
+ void receiveNearbyFaces(Vertex* src)
+ {
+ if (lastNearbyFace)
+ {
+ lastNearbyFace->nextWithSameNearbyVertex = src->firstNearbyFace;
+ }
+ else
+ {
+ firstNearbyFace = src->firstNearbyFace;
+ }
+ if (src->lastNearbyFace)
+ {
+ lastNearbyFace = src->lastNearbyFace;
+ }
+ for (Face* f = src->firstNearbyFace; f; f = f->nextWithSameNearbyVertex)
+ {
+ btAssert(f->nearbyVertex == src);
+ f->nearbyVertex = this;
+ }
+ src->firstNearbyFace = NULL;
+ src->lastNearbyFace = NULL;
+ }
+ };
-#ifdef DEBUG_CONVEX_HULL
- void print()
- {
- printf("E%p : %d -> %d, n=%p p=%p (0 %d\t%d\t%d) -> (%d %d %d)", this, reverse->target->point.index, target->point.index, next, prev,
- reverse->target->point.x, reverse->target->point.y, reverse->target->point.z, target->point.x, target->point.y, target->point.z);
- }
-#endif
- };
+ class Edge
+ {
+ public:
+ Edge* next;
+ Edge* prev;
+ Edge* reverse;
+ Vertex* target;
+ Face* face;
+ int copy;
+
+ ~Edge()
+ {
+ next = NULL;
+ prev = NULL;
+ reverse = NULL;
+ target = NULL;
+ face = NULL;
+ }
- class Face
+ void link(Edge* n)
{
- public:
- Face* next;
- Vertex* nearbyVertex;
- Face* nextWithSameNearbyVertex;
- Point32 origin;
- Point32 dir0;
- Point32 dir1;
+ btAssert(reverse->target == n->reverse->target);
+ next = n;
+ n->prev = this;
+ }
- Face(): next(NULL), nearbyVertex(NULL), nextWithSameNearbyVertex(NULL)
- {
- }
+#ifdef DEBUG_CONVEX_HULL
+ void print()
+ {
+ printf("E%p : %d -> %d, n=%p p=%p (0 %d\t%d\t%d) -> (%d %d %d)", this, reverse->target->point.index, target->point.index, next, prev,
+ reverse->target->point.x, reverse->target->point.y, reverse->target->point.z, target->point.x, target->point.y, target->point.z);
+ }
+#endif
+ };
- void init(Vertex* a, Vertex* b, Vertex* c)
- {
- nearbyVertex = a;
- origin = a->point;
- dir0 = *b - *a;
- dir1 = *c - *a;
- if (a->lastNearbyFace)
- {
- a->lastNearbyFace->nextWithSameNearbyVertex = this;
- }
- else
- {
- a->firstNearbyFace = this;
- }
- a->lastNearbyFace = this;
- }
+ class Face
+ {
+ public:
+ Face* next;
+ Vertex* nearbyVertex;
+ Face* nextWithSameNearbyVertex;
+ Point32 origin;
+ Point32 dir0;
+ Point32 dir1;
- Point64 getNormal()
- {
- return dir0.cross(dir1);
- }
- };
+ Face() : next(NULL), nearbyVertex(NULL), nextWithSameNearbyVertex(NULL)
+ {
+ }
- template<typename UWord, typename UHWord> class DMul
+ void init(Vertex* a, Vertex* b, Vertex* c)
{
- private:
- static uint32_t high(uint64_t value)
- {
- return (uint32_t) (value >> 32);
- }
-
- static uint32_t low(uint64_t value)
- {
- return (uint32_t) value;
- }
-
- static uint64_t mul(uint32_t a, uint32_t b)
- {
- return (uint64_t) a * (uint64_t) b;
- }
-
- static void shlHalf(uint64_t& value)
- {
- value <<= 32;
- }
-
- static uint64_t high(Int128 value)
- {
- return value.high;
- }
-
- static uint64_t low(Int128 value)
- {
- return value.low;
- }
-
- static Int128 mul(uint64_t a, uint64_t b)
- {
- return Int128::mul(a, b);
- }
-
- static void shlHalf(Int128& value)
- {
- value.high = value.low;
- value.low = 0;
- }
-
- public:
-
- static void mul(UWord a, UWord b, UWord& resLow, UWord& resHigh)
- {
- UWord p00 = mul(low(a), low(b));
- UWord p01 = mul(low(a), high(b));
- UWord p10 = mul(high(a), low(b));
- UWord p11 = mul(high(a), high(b));
- UWord p0110 = UWord(low(p01)) + UWord(low(p10));
- p11 += high(p01);
- p11 += high(p10);
- p11 += high(p0110);
- shlHalf(p0110);
- p00 += p0110;
- if (p00 < p0110)
- {
- ++p11;
- }
- resLow = p00;
- resHigh = p11;
- }
- };
-
- private:
+ nearbyVertex = a;
+ origin = a->point;
+ dir0 = *b - *a;
+ dir1 = *c - *a;
+ if (a->lastNearbyFace)
+ {
+ a->lastNearbyFace->nextWithSameNearbyVertex = this;
+ }
+ else
+ {
+ a->firstNearbyFace = this;
+ }
+ a->lastNearbyFace = this;
+ }
- class IntermediateHull
+ Point64 getNormal()
{
- public:
- Vertex* minXy;
- Vertex* maxXy;
- Vertex* minYx;
- Vertex* maxYx;
-
- IntermediateHull(): minXy(NULL), maxXy(NULL), minYx(NULL), maxYx(NULL)
- {
- }
-
- void print();
- };
-
- enum Orientation {NONE, CLOCKWISE, COUNTER_CLOCKWISE};
+ return dir0.cross(dir1);
+ }
+ };
- template <typename T> class PoolArray
+ template <typename UWord, typename UHWord>
+ class DMul
+ {
+ private:
+ static uint32_t high(uint64_t value)
{
- private:
- T* array;
- int size;
+ return (uint32_t)(value >> 32);
+ }
- public:
- PoolArray<T>* next;
+ static uint32_t low(uint64_t value)
+ {
+ return (uint32_t)value;
+ }
- PoolArray(int size): size(size), next(NULL)
- {
- array = (T*) btAlignedAlloc(sizeof(T) * size, 16);
- }
+ static uint64_t mul(uint32_t a, uint32_t b)
+ {
+ return (uint64_t)a * (uint64_t)b;
+ }
- ~PoolArray()
- {
- btAlignedFree(array);
- }
+ static void shlHalf(uint64_t& value)
+ {
+ value <<= 32;
+ }
- T* init()
- {
- T* o = array;
- for (int i = 0; i < size; i++, o++)
- {
- o->next = (i+1 < size) ? o + 1 : NULL;
- }
- return array;
- }
- };
+ static uint64_t high(Int128 value)
+ {
+ return value.high;
+ }
- template <typename T> class Pool
+ static uint64_t low(Int128 value)
{
- private:
- PoolArray<T>* arrays;
- PoolArray<T>* nextArray;
- T* freeObjects;
- int arraySize;
+ return value.low;
+ }
- public:
- Pool(): arrays(NULL), nextArray(NULL), freeObjects(NULL), arraySize(256)
- {
- }
+ static Int128 mul(uint64_t a, uint64_t b)
+ {
+ return Int128::mul(a, b);
+ }
- ~Pool()
- {
- while (arrays)
- {
- PoolArray<T>* p = arrays;
- arrays = p->next;
- p->~PoolArray<T>();
- btAlignedFree(p);
- }
- }
+ static void shlHalf(Int128& value)
+ {
+ value.high = value.low;
+ value.low = 0;
+ }
- void reset()
- {
- nextArray = arrays;
- freeObjects = NULL;
- }
+ public:
+ static void mul(UWord a, UWord b, UWord& resLow, UWord& resHigh)
+ {
+ UWord p00 = mul(low(a), low(b));
+ UWord p01 = mul(low(a), high(b));
+ UWord p10 = mul(high(a), low(b));
+ UWord p11 = mul(high(a), high(b));
+ UWord p0110 = UWord(low(p01)) + UWord(low(p10));
+ p11 += high(p01);
+ p11 += high(p10);
+ p11 += high(p0110);
+ shlHalf(p0110);
+ p00 += p0110;
+ if (p00 < p0110)
+ {
+ ++p11;
+ }
+ resLow = p00;
+ resHigh = p11;
+ }
+ };
- void setArraySize(int arraySize)
- {
- this->arraySize = arraySize;
- }
+private:
+ class IntermediateHull
+ {
+ public:
+ Vertex* minXy;
+ Vertex* maxXy;
+ Vertex* minYx;
+ Vertex* maxYx;
- T* newObject()
- {
- T* o = freeObjects;
- if (!o)
- {
- PoolArray<T>* p = nextArray;
- if (p)
- {
- nextArray = p->next;
- }
- else
- {
- p = new(btAlignedAlloc(sizeof(PoolArray<T>), 16)) PoolArray<T>(arraySize);
- p->next = arrays;
- arrays = p;
- }
- o = p->init();
- }
- freeObjects = o->next;
- return new(o) T();
- };
+ IntermediateHull() : minXy(NULL), maxXy(NULL), minYx(NULL), maxYx(NULL)
+ {
+ }
- void freeObject(T* object)
- {
- object->~T();
- object->next = freeObjects;
- freeObjects = object;
- }
- };
+ void print();
+ };
- btVector3 scaling;
- btVector3 center;
- Pool<Vertex> vertexPool;
- Pool<Edge> edgePool;
- Pool<Face> facePool;
- btAlignedObjectArray<Vertex*> originalVertices;
- int mergeStamp;
- int minAxis;
- int medAxis;
- int maxAxis;
- int usedEdgePairs;
- int maxUsedEdgePairs;
+ enum Orientation
+ {
+ NONE,
+ CLOCKWISE,
+ COUNTER_CLOCKWISE
+ };
- static Orientation getOrientation(const Edge* prev, const Edge* next, const Point32& s, const Point32& t);
- Edge* findMaxAngle(bool ccw, const Vertex* start, const Point32& s, const Point64& rxs, const Point64& sxrxs, Rational64& minCot);
- void findEdgeForCoplanarFaces(Vertex* c0, Vertex* c1, Edge*& e0, Edge*& e1, Vertex* stop0, Vertex* stop1);
+ template <typename T>
+ class PoolArray
+ {
+ private:
+ T* array;
+ int size;
- Edge* newEdgePair(Vertex* from, Vertex* to);
+ public:
+ PoolArray<T>* next;
- void removeEdgePair(Edge* edge)
+ PoolArray(int size) : size(size), next(NULL)
{
- Edge* n = edge->next;
- Edge* r = edge->reverse;
+ array = (T*)btAlignedAlloc(sizeof(T) * size, 16);
+ }
- btAssert(edge->target && r->target);
+ ~PoolArray()
+ {
+ btAlignedFree(array);
+ }
- if (n != edge)
- {
- n->prev = edge->prev;
- edge->prev->next = n;
- r->target->edges = n;
- }
- else
+ T* init()
+ {
+ T* o = array;
+ for (int i = 0; i < size; i++, o++)
{
- r->target->edges = NULL;
+ o->next = (i + 1 < size) ? o + 1 : NULL;
}
-
- n = r->next;
-
- if (n != r)
+ return array;
+ }
+ };
+
+ template <typename T>
+ class Pool
+ {
+ private:
+ PoolArray<T>* arrays;
+ PoolArray<T>* nextArray;
+ T* freeObjects;
+ int arraySize;
+
+ public:
+ Pool() : arrays(NULL), nextArray(NULL), freeObjects(NULL), arraySize(256)
+ {
+ }
+
+ ~Pool()
+ {
+ while (arrays)
{
- n->prev = r->prev;
- r->prev->next = n;
- edge->target->edges = n;
+ PoolArray<T>* p = arrays;
+ arrays = p->next;
+ p->~PoolArray<T>();
+ btAlignedFree(p);
}
- else
+ }
+
+ void reset()
+ {
+ nextArray = arrays;
+ freeObjects = NULL;
+ }
+
+ void setArraySize(int arraySize)
+ {
+ this->arraySize = arraySize;
+ }
+
+ T* newObject()
+ {
+ T* o = freeObjects;
+ if (!o)
{
- edge->target->edges = NULL;
+ PoolArray<T>* p = nextArray;
+ if (p)
+ {
+ nextArray = p->next;
+ }
+ else
+ {
+ p = new (btAlignedAlloc(sizeof(PoolArray<T>), 16)) PoolArray<T>(arraySize);
+ p->next = arrays;
+ arrays = p;
+ }
+ o = p->init();
}
+ freeObjects = o->next;
+ return new (o) T();
+ };
+
+ void freeObject(T* object)
+ {
+ object->~T();
+ object->next = freeObjects;
+ freeObjects = object;
+ }
+ };
+
+ btVector3 scaling;
+ btVector3 center;
+ Pool<Vertex> vertexPool;
+ Pool<Edge> edgePool;
+ Pool<Face> facePool;
+ btAlignedObjectArray<Vertex*> originalVertices;
+ int mergeStamp;
+ int minAxis;
+ int medAxis;
+ int maxAxis;
+ int usedEdgePairs;
+ int maxUsedEdgePairs;
+
+ static Orientation getOrientation(const Edge* prev, const Edge* next, const Point32& s, const Point32& t);
+ Edge* findMaxAngle(bool ccw, const Vertex* start, const Point32& s, const Point64& rxs, const Point64& sxrxs, Rational64& minCot);
+ void findEdgeForCoplanarFaces(Vertex* c0, Vertex* c1, Edge*& e0, Edge*& e1, Vertex* stop0, Vertex* stop1);
+
+ Edge* newEdgePair(Vertex* from, Vertex* to);
- edgePool.freeObject(edge);
- edgePool.freeObject(r);
- usedEdgePairs--;
+ void removeEdgePair(Edge* edge)
+ {
+ Edge* n = edge->next;
+ Edge* r = edge->reverse;
+
+ btAssert(edge->target && r->target);
+
+ if (n != edge)
+ {
+ n->prev = edge->prev;
+ edge->prev->next = n;
+ r->target->edges = n;
+ }
+ else
+ {
+ r->target->edges = NULL;
+ }
+
+ n = r->next;
+
+ if (n != r)
+ {
+ n->prev = r->prev;
+ r->prev->next = n;
+ edge->target->edges = n;
+ }
+ else
+ {
+ edge->target->edges = NULL;
}
-
- void computeInternal(int start, int end, IntermediateHull& result);
-
- bool mergeProjection(IntermediateHull& h0, IntermediateHull& h1, Vertex*& c0, Vertex*& c1);
-
- void merge(IntermediateHull& h0, IntermediateHull& h1);
- btVector3 toBtVector(const Point32& v);
+ edgePool.freeObject(edge);
+ edgePool.freeObject(r);
+ usedEdgePairs--;
+ }
- btVector3 getBtNormal(Face* face);
+ void computeInternal(int start, int end, IntermediateHull& result);
- bool shiftFace(Face* face, btScalar amount, btAlignedObjectArray<Vertex*> stack);
+ bool mergeProjection(IntermediateHull& h0, IntermediateHull& h1, Vertex*& c0, Vertex*& c1);
- public:
- Vertex* vertexList;
+ void merge(IntermediateHull& h0, IntermediateHull& h1);
- void compute(const void* coords, bool doubleCoords, int stride, int count);
+ btVector3 toBtVector(const Point32& v);
- btVector3 getCoordinates(const Vertex* v);
+ btVector3 getBtNormal(Face* face);
- btScalar shrink(btScalar amount, btScalar clampAmount);
-};
+ bool shiftFace(Face* face, btScalar amount, btAlignedObjectArray<Vertex*> stack);
+public:
+ Vertex* vertexList;
+
+ void compute(const void* coords, bool doubleCoords, int stride, int count);
+
+ btVector3 getCoordinates(const Vertex* v);
+
+ btScalar shrink(btScalar amount, btScalar clampAmount);
+};
btConvexHullInternal::Int128 btConvexHullInternal::Int128::operator*(int64_t b) const
{
- bool negative = (int64_t) high < 0;
+ bool negative = (int64_t)high < 0;
Int128 a = negative ? -*this : *this;
if (b < 0)
{
negative = !negative;
b = -b;
}
- Int128 result = mul(a.low, (uint64_t) b);
- result.high += a.high * (uint64_t) b;
+ Int128 result = mul(a.low, (uint64_t)b);
+ result.high += a.high * (uint64_t)b;
return negative ? -result : result;
}
btConvexHullInternal::Int128 btConvexHullInternal::Int128::mul(int64_t a, int64_t b)
{
Int128 result;
-
+
#ifdef USE_X86_64_ASM
- __asm__ ("imulq %[b]"
- : "=a" (result.low), "=d" (result.high)
- : "0"(a), [b] "r"(b)
- : "cc" );
+ __asm__("imulq %[b]"
+ : "=a"(result.low), "=d"(result.high)
+ : "0"(a), [b] "r"(b)
+ : "cc");
return result;
-
+
#else
bool negative = a < 0;
if (negative)
@@ -871,7 +872,7 @@ btConvexHullInternal::Int128 btConvexHullInternal::Int128::mul(int64_t a, int64_
negative = !negative;
b = -b;
}
- DMul<uint64_t, uint32_t>::mul((uint64_t) a, (uint64_t) b, result.low, result.high);
+ DMul<uint64_t, uint32_t>::mul((uint64_t)a, (uint64_t)b, result.low, result.high);
return negative ? -result : result;
#endif
}
@@ -881,10 +882,10 @@ btConvexHullInternal::Int128 btConvexHullInternal::Int128::mul(uint64_t a, uint6
Int128 result;
#ifdef USE_X86_64_ASM
- __asm__ ("mulq %[b]"
- : "=a" (result.low), "=d" (result.high)
- : "0"(a), [b] "r"(b)
- : "cc" );
+ __asm__("mulq %[b]"
+ : "=a"(result.low), "=d"(result.high)
+ : "0"(a), [b] "r"(b)
+ : "cc");
#else
DMul<uint64_t, uint32_t>::mul(a, b, result.low, result.high);
@@ -911,24 +912,25 @@ int btConvexHullInternal::Rational64::compare(const Rational64& b) const
int result;
int64_t tmp;
int64_t dummy;
- __asm__ ("mulq %[bn]\n\t"
- "movq %%rax, %[tmp]\n\t"
- "movq %%rdx, %%rbx\n\t"
- "movq %[tn], %%rax\n\t"
- "mulq %[bd]\n\t"
- "subq %[tmp], %%rax\n\t"
- "sbbq %%rbx, %%rdx\n\t" // rdx:rax contains 128-bit-difference "numerator*b.denominator - b.numerator*denominator"
- "setnsb %%bh\n\t" // bh=1 if difference is non-negative, bh=0 otherwise
- "orq %%rdx, %%rax\n\t"
- "setnzb %%bl\n\t" // bl=1 if difference if non-zero, bl=0 if it is zero
- "decb %%bh\n\t" // now bx=0x0000 if difference is zero, 0xff01 if it is negative, 0x0001 if it is positive (i.e., same sign as difference)
- "shll $16, %%ebx\n\t" // ebx has same sign as difference
- : "=&b"(result), [tmp] "=&r"(tmp), "=a"(dummy)
- : "a"(denominator), [bn] "g"(b.numerator), [tn] "g"(numerator), [bd] "g"(b.denominator)
- : "%rdx", "cc" );
- return result ? result ^ sign // if sign is +1, only bit 0 of result is inverted, which does not change the sign of result (and cannot result in zero)
- // if sign is -1, all bits of result are inverted, which changes the sign of result (and again cannot result in zero)
- : 0;
+ __asm__(
+ "mulq %[bn]\n\t"
+ "movq %%rax, %[tmp]\n\t"
+ "movq %%rdx, %%rbx\n\t"
+ "movq %[tn], %%rax\n\t"
+ "mulq %[bd]\n\t"
+ "subq %[tmp], %%rax\n\t"
+ "sbbq %%rbx, %%rdx\n\t" // rdx:rax contains 128-bit-difference "numerator*b.denominator - b.numerator*denominator"
+ "setnsb %%bh\n\t" // bh=1 if difference is non-negative, bh=0 otherwise
+ "orq %%rdx, %%rax\n\t"
+ "setnzb %%bl\n\t" // bl=1 if difference if non-zero, bl=0 if it is zero
+ "decb %%bh\n\t" // now bx=0x0000 if difference is zero, 0xff01 if it is negative, 0x0001 if it is positive (i.e., same sign as difference)
+ "shll $16, %%ebx\n\t" // ebx has same sign as difference
+ : "=&b"(result), [tmp] "=&r"(tmp), "=a"(dummy)
+ : "a"(m_denominator), [bn] "g"(b.m_numerator), [tn] "g"(m_numerator), [bd] "g"(b.m_denominator)
+ : "%rdx", "cc");
+ return result ? result ^ sign // if sign is +1, only bit 0 of result is inverted, which does not change the sign of result (and cannot result in zero)
+ // if sign is -1, all bits of result are inverted, which changes the sign of result (and again cannot result in zero)
+ : 0;
#else
@@ -949,7 +951,7 @@ int btConvexHullInternal::Rational128::compare(const Rational128& b) const
}
if (isInt64)
{
- return -b.compare(sign * (int64_t) numerator.low);
+ return -b.compare(sign * (int64_t)numerator.low);
}
Int128 nbdLow, nbdHigh, dbnLow, dbnHigh;
@@ -968,7 +970,7 @@ int btConvexHullInternal::Rational128::compare(int64_t b) const
{
if (isInt64)
{
- int64_t a = sign * (int64_t) numerator.low;
+ int64_t a = sign * (int64_t)numerator.low;
return (a > b) ? 1 : (a < b) ? -1 : 0;
}
if (b > 0)
@@ -994,7 +996,6 @@ int btConvexHullInternal::Rational128::compare(int64_t b) const
return numerator.ucmp(denominator * b) * sign;
}
-
btConvexHullInternal::Edge* btConvexHullInternal::newEdgePair(Vertex* from, Vertex* to)
{
btAssert(from && to);
@@ -1062,7 +1063,7 @@ bool btConvexHullInternal::mergeProjection(IntermediateHull& h0, IntermediateHul
}
}
}
-
+
v0 = h0.maxXy;
v1 = h1.maxXy;
Vertex* v00 = NULL;
@@ -1070,7 +1071,7 @@ bool btConvexHullInternal::mergeProjection(IntermediateHull& h0, IntermediateHul
int32_t sign = 1;
for (int side = 0; side <= 1; side++)
- {
+ {
int32_t dx = (v1->point.x - v0->point.x) * sign;
if (dx > 0)
{
@@ -1113,7 +1114,7 @@ bool btConvexHullInternal::mergeProjection(IntermediateHull& h0, IntermediateHul
while (true)
{
int32_t dy = v1->point.y - v0->point.y;
-
+
Vertex* w1 = side ? v1->prev : v1->next;
if (w1 != v1)
{
@@ -1126,7 +1127,7 @@ bool btConvexHullInternal::mergeProjection(IntermediateHull& h0, IntermediateHul
continue;
}
}
-
+
Vertex* w0 = side ? v0->prev : v0->next;
if (w0 != v0)
{
@@ -1140,7 +1141,7 @@ bool btConvexHullInternal::mergeProjection(IntermediateHull& h0, IntermediateHul
continue;
}
}
-
+
break;
}
}
@@ -1166,7 +1167,7 @@ bool btConvexHullInternal::mergeProjection(IntermediateHull& h0, IntermediateHul
}
v1 = w1;
}
-
+
if (side == 0)
{
v00 = v0;
@@ -1192,7 +1193,7 @@ bool btConvexHullInternal::mergeProjection(IntermediateHull& h0, IntermediateHul
{
h0.maxXy = h1.maxXy;
}
-
+
h0.maxYx = h1.maxYx;
c0 = v00;
@@ -1279,19 +1280,19 @@ void btConvexHullInternal::computeInternal(int start, int end, IntermediateHull&
}
{
Vertex* v = originalVertices[start];
- v->edges = NULL;
- v->next = v;
- v->prev = v;
-
- result.minXy = v;
- result.maxXy = v;
- result.minYx = v;
- result.maxYx = v;
+ v->edges = NULL;
+ v->next = v;
+ v->prev = v;
+
+ result.minXy = v;
+ result.maxXy = v;
+ result.minYx = v;
+ result.maxYx = v;
}
-
+
return;
}
-
+
case 1:
{
Vertex* v = originalVertices[start];
@@ -1309,7 +1310,7 @@ void btConvexHullInternal::computeInternal(int start, int end, IntermediateHull&
}
int split0 = start + n / 2;
- Point32 p = originalVertices[split0-1]->point;
+ Point32 p = originalVertices[split0 - 1]->point;
int split1 = split0;
while ((split1 < end) && (originalVertices[split1]->point == p))
{
@@ -1334,7 +1335,7 @@ void btConvexHullInternal::computeInternal(int start, int end, IntermediateHull&
void btConvexHullInternal::IntermediateHull::print()
{
printf(" Hull\n");
- for (Vertex* v = minXy; v; )
+ for (Vertex* v = minXy; v;)
{
printf(" ");
v->print();
@@ -1362,7 +1363,7 @@ void btConvexHullInternal::IntermediateHull::print()
}
}
if (minXy)
- {
+ {
minXy->copy = (minXy->copy == -1) ? -2 : -1;
minXy->printGraph();
}
@@ -1438,7 +1439,7 @@ btConvexHullInternal::Edge* btConvexHullInternal::findMaxAngle(bool ccw, const V
Point32 t = *e->target - *start;
Rational64 cot(t.dot(sxrxs), t.dot(rxs));
#ifdef DEBUG_CONVEX_HULL
- printf(" Angle is %f (%d) for ", (float) btAtan(cot.toScalar()), (int) cot.isNaN());
+ printf(" Angle is %f (%d) for ", (float)btAtan(cot.toScalar()), (int)cot.isNaN());
e->print();
#endif
if (cot.isNaN())
@@ -1485,7 +1486,7 @@ void btConvexHullInternal::findEdgeForCoplanarFaces(Vertex* c0, Vertex* c1, Edge
btAssert(!start1 || (start1->target->point.dot(normal) == dist));
Point64 perp = s.cross(normal);
btAssert(!perp.isZero());
-
+
#ifdef DEBUG_CONVEX_HULL
printf(" Advancing %d %d (%p %p, %d %d)\n", c0->point.index, c1->point.index, start0, start1, start0 ? start0->target->point.index : -1, start1 ? start1->target->point.index : -1);
#endif
@@ -1515,7 +1516,7 @@ void btConvexHullInternal::findEdgeForCoplanarFaces(Vertex* c0, Vertex* c1, Edge
et0 = e->target->point;
}
}
-
+
int64_t maxDot1 = et1.dot(perp);
if (e1)
{
@@ -1552,7 +1553,7 @@ void btConvexHullInternal::findEdgeForCoplanarFaces(Vertex* c0, Vertex* c1, Edge
while (true)
{
int64_t dy = (et1 - et0).dot(s);
-
+
if (e0 && (e0->target != stop0))
{
Edge* f0 = e0->next->reverse;
@@ -1569,7 +1570,7 @@ void btConvexHullInternal::findEdgeForCoplanarFaces(Vertex* c0, Vertex* c1, Edge
}
}
}
-
+
if (e1 && (e1->target != stop1))
{
Edge* f1 = e1->reverse->next;
@@ -1604,7 +1605,7 @@ void btConvexHullInternal::findEdgeForCoplanarFaces(Vertex* c0, Vertex* c1, Edge
while (true)
{
int64_t dy = (et1 - et0).dot(s);
-
+
if (e1 && (e1->target != stop1))
{
Edge* f1 = e1->prev->reverse;
@@ -1621,7 +1622,7 @@ void btConvexHullInternal::findEdgeForCoplanarFaces(Vertex* c0, Vertex* c1, Edge
}
}
}
-
+
if (e0 && (e0->target != stop0))
{
Edge* f0 = e0->reverse->prev;
@@ -1656,7 +1657,6 @@ void btConvexHullInternal::findEdgeForCoplanarFaces(Vertex* c0, Vertex* c1, Edge
#endif
}
-
void btConvexHullInternal::merge(IntermediateHull& h0, IntermediateHull& h1)
{
if (!h1.maxXy)
@@ -1668,7 +1668,7 @@ void btConvexHullInternal::merge(IntermediateHull& h0, IntermediateHull& h1)
h0 = h1;
return;
}
-
+
mergeStamp--;
Vertex* c0 = NULL;
@@ -1708,7 +1708,7 @@ void btConvexHullInternal::merge(IntermediateHull& h0, IntermediateHull& h1)
e = e->next;
} while (e != c0->edges);
}
-
+
e = c1->edges;
Edge* start1 = NULL;
if (e)
@@ -1760,7 +1760,7 @@ void btConvexHullInternal::merge(IntermediateHull& h0, IntermediateHull& h1)
Point32 r = prevPoint - c0->point;
Point64 rxs = r.cross(s);
Point64 sxrxs = s.cross(rxs);
-
+
#ifdef DEBUG_CONVEX_HULL
printf("\n Checking %d %d\n", c0->point.index, c1->point.index);
#endif
@@ -1811,7 +1811,7 @@ void btConvexHullInternal::merge(IntermediateHull& h0, IntermediateHull& h1)
e->prev = pendingTail1;
pendingTail1 = e;
}
-
+
Edge* e0 = min0;
Edge* e1 = min1;
@@ -1828,7 +1828,7 @@ void btConvexHullInternal::merge(IntermediateHull& h0, IntermediateHull& h1)
{
if (toPrev1)
{
- for (Edge* e = toPrev1->next, *n = NULL; e != min1; e = n)
+ for (Edge *e = toPrev1->next, *n = NULL; e != min1; e = n)
{
n = e->next;
removeEdgePair(e);
@@ -1864,7 +1864,7 @@ void btConvexHullInternal::merge(IntermediateHull& h0, IntermediateHull& h1)
{
if (toPrev0)
{
- for (Edge* e = toPrev0->prev, *n = NULL; e != min0; e = n)
+ for (Edge *e = toPrev0->prev, *n = NULL; e != min0; e = n)
{
n = e->prev;
removeEdgePair(e);
@@ -1906,7 +1906,7 @@ void btConvexHullInternal::merge(IntermediateHull& h0, IntermediateHull& h1)
}
else
{
- for (Edge* e = toPrev0->prev, *n = NULL; e != firstNew0; e = n)
+ for (Edge *e = toPrev0->prev, *n = NULL; e != firstNew0; e = n)
{
n = e->prev;
removeEdgePair(e);
@@ -1925,7 +1925,7 @@ void btConvexHullInternal::merge(IntermediateHull& h0, IntermediateHull& h1)
}
else
{
- for (Edge* e = toPrev1->next, *n = NULL; e != firstNew1; e = n)
+ for (Edge *e = toPrev1->next, *n = NULL; e != firstNew1; e = n)
{
n = e->next;
removeEdgePair(e);
@@ -1936,7 +1936,7 @@ void btConvexHullInternal::merge(IntermediateHull& h0, IntermediateHull& h1)
pendingTail1->link(firstNew1);
}
}
-
+
return;
}
@@ -1946,24 +1946,23 @@ void btConvexHullInternal::merge(IntermediateHull& h0, IntermediateHull& h1)
class pointCmp
{
- public:
-
- bool operator() ( const btConvexHullInternal::Point32& p, const btConvexHullInternal::Point32& q ) const
- {
- return (p.y < q.y) || ((p.y == q.y) && ((p.x < q.x) || ((p.x == q.x) && (p.z < q.z))));
- }
+public:
+ bool operator()(const btConvexHullInternal::Point32& p, const btConvexHullInternal::Point32& q) const
+ {
+ return (p.y < q.y) || ((p.y == q.y) && ((p.x < q.x) || ((p.x == q.x) && (p.z < q.z))));
+ }
};
void btConvexHullInternal::compute(const void* coords, bool doubleCoords, int stride, int count)
{
btVector3 min(btScalar(1e30), btScalar(1e30), btScalar(1e30)), max(btScalar(-1e30), btScalar(-1e30), btScalar(-1e30));
- const char* ptr = (const char*) coords;
+ const char* ptr = (const char*)coords;
if (doubleCoords)
{
for (int i = 0; i < count; i++)
{
- const double* v = (const double*) ptr;
- btVector3 p((btScalar) v[0], (btScalar) v[1], (btScalar) v[2]);
+ const double* v = (const double*)ptr;
+ btVector3 p((btScalar)v[0], (btScalar)v[1], (btScalar)v[2]);
ptr += stride;
min.setMin(p);
max.setMax(p);
@@ -1973,7 +1972,7 @@ void btConvexHullInternal::compute(const void* coords, bool doubleCoords, int st
{
for (int i = 0; i < count; i++)
{
- const float* v = (const float*) ptr;
+ const float* v = (const float*)ptr;
btVector3 p(v[0], v[1], v[2]);
ptr += stride;
min.setMin(p);
@@ -2014,18 +2013,18 @@ void btConvexHullInternal::compute(const void* coords, bool doubleCoords, int st
btAlignedObjectArray<Point32> points;
points.resize(count);
- ptr = (const char*) coords;
+ ptr = (const char*)coords;
if (doubleCoords)
{
for (int i = 0; i < count; i++)
{
- const double* v = (const double*) ptr;
- btVector3 p((btScalar) v[0], (btScalar) v[1], (btScalar) v[2]);
+ const double* v = (const double*)ptr;
+ btVector3 p((btScalar)v[0], (btScalar)v[1], (btScalar)v[2]);
ptr += stride;
p = (p - center) * s;
- points[i].x = (int32_t) p[medAxis];
- points[i].y = (int32_t) p[maxAxis];
- points[i].z = (int32_t) p[minAxis];
+ points[i].x = (int32_t)p[medAxis];
+ points[i].y = (int32_t)p[maxAxis];
+ points[i].z = (int32_t)p[minAxis];
points[i].index = i;
}
}
@@ -2033,13 +2032,13 @@ void btConvexHullInternal::compute(const void* coords, bool doubleCoords, int st
{
for (int i = 0; i < count; i++)
{
- const float* v = (const float*) ptr;
+ const float* v = (const float*)ptr;
btVector3 p(v[0], v[1], v[2]);
ptr += stride;
p = (p - center) * s;
- points[i].x = (int32_t) p[medAxis];
- points[i].y = (int32_t) p[maxAxis];
- points[i].z = (int32_t) p[minAxis];
+ points[i].x = (int32_t)p[medAxis];
+ points[i].y = (int32_t)p[maxAxis];
+ points[i].z = (int32_t)p[minAxis];
points[i].index = i;
}
}
@@ -2193,7 +2192,7 @@ btScalar btConvexHullInternal::shrink(btScalar amount, btScalar clampAmount)
minDist = dist;
}
}
-
+
if (minDist <= 0)
{
return 0;
@@ -2234,7 +2233,7 @@ bool btConvexHullInternal::shiftFace(Face* face, btScalar amount, btAlignedObjec
{
origShift[2] /= scaling[2];
}
- Point32 shift((int32_t) origShift[medAxis], (int32_t) origShift[maxAxis], (int32_t) origShift[minAxis]);
+ Point32 shift((int32_t)origShift[medAxis], (int32_t)origShift[maxAxis], (int32_t)origShift[minAxis]);
if (shift.isZero())
{
return true;
@@ -2242,7 +2241,7 @@ bool btConvexHullInternal::shiftFace(Face* face, btScalar amount, btAlignedObjec
Point64 normal = face->getNormal();
#ifdef DEBUG_CONVEX_HULL
printf("\nShrinking face (%d %d %d) (%d %d %d) (%d %d %d) by (%d %d %d)\n",
- face->origin.x, face->origin.y, face->origin.z, face->dir0.x, face->dir0.y, face->dir0.z, face->dir1.x, face->dir1.y, face->dir1.z, shift.x, shift.y, shift.z);
+ face->origin.x, face->origin.y, face->origin.z, face->dir0.x, face->dir0.y, face->dir0.z, face->dir1.x, face->dir1.y, face->dir1.z, shift.x, shift.y, shift.z);
#endif
int64_t origDot = face->origin.dot(normal);
Point32 shiftedOrigin = face->origin + shift;
@@ -2279,7 +2278,7 @@ bool btConvexHullInternal::shiftFace(Face* face, btScalar amount, btAlignedObjec
#ifdef DEBUG_CONVEX_HULL
printf("Moving downwards, edge is ");
e->print();
- printf(", dot is %f (%f %lld)\n", (float) dot.toScalar(), (float) optDot.toScalar(), shiftedDot);
+ printf(", dot is %f (%f %lld)\n", (float)dot.toScalar(), (float)optDot.toScalar(), shiftedDot);
#endif
if (dot.compare(optDot) < 0)
{
@@ -2315,7 +2314,7 @@ bool btConvexHullInternal::shiftFace(Face* face, btScalar amount, btAlignedObjec
#ifdef DEBUG_CONVEX_HULL
printf("Moving upwards, edge is ");
e->print();
- printf(", dot is %f (%f %lld)\n", (float) dot.toScalar(), (float) optDot.toScalar(), shiftedDot);
+ printf(", dot is %f (%f %lld)\n", (float)dot.toScalar(), (float)optDot.toScalar(), shiftedDot);
#endif
if (dot.compare(optDot) > 0)
{
@@ -2331,7 +2330,7 @@ bool btConvexHullInternal::shiftFace(Face* face, btScalar amount, btAlignedObjec
}
e = e->prev;
} while (e != startEdge);
-
+
if (!intersection)
{
return true;
@@ -2368,7 +2367,7 @@ bool btConvexHullInternal::shiftFace(Face* face, btScalar amount, btAlignedObjec
printf("Needed %d iterations to check for complete containment\n", n);
#endif
}
-
+
Edge* firstIntersection = NULL;
Edge* faceEdge = NULL;
Edge* firstFaceEdge = NULL;
@@ -2477,7 +2476,7 @@ bool btConvexHullInternal::shiftFace(Face* face, btScalar amount, btAlignedObjec
#ifdef DEBUG_CONVEX_HULL
printf("1: Removed part contains (%d %d %d)\n", removed->point.x, removed->point.y, removed->point.z);
#endif
-
+
Point64 n0 = intersection->face->getNormal();
Point64 n1 = intersection->reverse->face->getNormal();
int64_t m00 = face->dir0.dot(n0);
@@ -2491,16 +2490,13 @@ bool btConvexHullInternal::shiftFace(Face* face, btScalar amount, btAlignedObjec
Vertex* v = vertexPool.newObject();
v->point.index = -1;
v->copy = -1;
- v->point128 = PointR128(Int128::mul(face->dir0.x * r0, m11) - Int128::mul(face->dir0.x * r1, m01)
- + Int128::mul(face->dir1.x * r1, m00) - Int128::mul(face->dir1.x * r0, m10) + det * shiftedOrigin.x,
- Int128::mul(face->dir0.y * r0, m11) - Int128::mul(face->dir0.y * r1, m01)
- + Int128::mul(face->dir1.y * r1, m00) - Int128::mul(face->dir1.y * r0, m10) + det * shiftedOrigin.y,
- Int128::mul(face->dir0.z * r0, m11) - Int128::mul(face->dir0.z * r1, m01)
- + Int128::mul(face->dir1.z * r1, m00) - Int128::mul(face->dir1.z * r0, m10) + det * shiftedOrigin.z,
- det);
- v->point.x = (int32_t) v->point128.xvalue();
- v->point.y = (int32_t) v->point128.yvalue();
- v->point.z = (int32_t) v->point128.zvalue();
+ v->point128 = PointR128(Int128::mul(face->dir0.x * r0, m11) - Int128::mul(face->dir0.x * r1, m01) + Int128::mul(face->dir1.x * r1, m00) - Int128::mul(face->dir1.x * r0, m10) + det * shiftedOrigin.x,
+ Int128::mul(face->dir0.y * r0, m11) - Int128::mul(face->dir0.y * r1, m01) + Int128::mul(face->dir1.y * r1, m00) - Int128::mul(face->dir1.y * r0, m10) + det * shiftedOrigin.y,
+ Int128::mul(face->dir0.z * r0, m11) - Int128::mul(face->dir0.z * r1, m01) + Int128::mul(face->dir1.z * r1, m00) - Int128::mul(face->dir1.z * r0, m10) + det * shiftedOrigin.z,
+ det);
+ v->point.x = (int32_t)v->point128.xvalue();
+ v->point.y = (int32_t)v->point128.yvalue();
+ v->point.z = (int32_t)v->point128.zvalue();
intersection->target = v;
v->edges = e;
@@ -2639,7 +2635,6 @@ bool btConvexHullInternal::shiftFace(Face* face, btScalar amount, btAlignedObjec
return true;
}
-
static int getVertexCopy(btConvexHullInternal::Vertex* vertex, btAlignedObjectArray<btConvexHullInternal::Vertex*>& vertices)
{
int index = vertex->copy;
@@ -2761,8 +2756,3 @@ btScalar btConvexHullComputer::compute(const void* coords, bool doubleCoords, in
return shift;
}
-
-
-
-
-
diff --git a/thirdparty/bullet/LinearMath/btConvexHullComputer.h b/thirdparty/bullet/LinearMath/btConvexHullComputer.h
index 7240ac4fb5..cba684f2dc 100644
--- a/thirdparty/bullet/LinearMath/btConvexHullComputer.h
+++ b/thirdparty/bullet/LinearMath/btConvexHullComputer.h
@@ -23,58 +23,56 @@ subject to the following restrictions:
/// 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:
- btScalar compute(const void* coords, bool doubleCoords, int stride, int count, btScalar shrink, btScalar shrinkClamp);
+ int next;
+ int reverse;
+ int targetVertex;
- public:
+ friend class btConvexHullComputer;
- class Edge
+ public:
+ int getSourceVertex() const
{
- private:
- int next;
- int reverse;
- int targetVertex;
-
- friend class btConvexHullComputer;
-
- public:
- int getSourceVertex() const
- {
- return (this + reverse)->targetVertex;
- }
-
- int getTargetVertex() const
- {
- return targetVertex;
- }
+ return (this + reverse)->targetVertex;
+ }
- const Edge* getNextEdgeOfVertex() const // clockwise list of all edges of a vertex
- {
- return this + next;
- }
+ int getTargetVertex() const
+ {
+ return targetVertex;
+ }
- const Edge* getNextEdgeOfFace() const // counter-clockwise list of all edges of a face
- {
- return (this + reverse)->getNextEdgeOfVertex();
- }
+ const Edge* getNextEdgeOfVertex() const // clockwise list of all edges of a vertex
+ {
+ return this + next;
+ }
- const Edge* getReverseEdge() const
- {
- return this + reverse;
- }
- };
+ 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<btVector3> vertices;
+ // Vertices of the output hull
+ btAlignedObjectArray<btVector3> vertices;
- // Edges of the output hull
- btAlignedObjectArray<Edge> edges;
+ // Edges of the output hull
+ btAlignedObjectArray<Edge> 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<int> faces;
+ // 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<int> 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).
@@ -86,18 +84,16 @@ class btConvexHullComputer
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);
- }
+ 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
-
+#endif //BT_CONVEX_HULL_COMPUTER_H
diff --git a/thirdparty/bullet/LinearMath/btCpuFeatureUtility.h b/thirdparty/bullet/LinearMath/btCpuFeatureUtility.h
index d2cab52d48..5e4b9a313c 100644
--- a/thirdparty/bullet/LinearMath/btCpuFeatureUtility.h
+++ b/thirdparty/bullet/LinearMath/btCpuFeatureUtility.h
@@ -4,20 +4,20 @@
#include "LinearMath/btScalar.h"
-#include <string.h>//memset
-#ifdef USE_SIMD
+#include <string.h> //memset
+#ifdef USE_SIMD
#include <emmintrin.h>
#ifdef BT_ALLOW_SSE4
#include <intrin.h>
-#endif //BT_ALLOW_SSE4
-#endif //USE_SIMD
+#endif //BT_ALLOW_SSE4
+#endif //USE_SIMD
#if defined BT_USE_NEON
-#define ARM_NEON_GCC_COMPATIBILITY 1
+#define ARM_NEON_GCC_COMPATIBILITY 1
#include <arm_neon.h>
#include <sys/types.h>
-#include <sys/sysctl.h> //for sysctlbyname
-#endif //BT_USE_NEON
+#include <sys/sysctl.h> //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
@@ -26,14 +26,13 @@ class btCpuFeatureUtility
public:
enum btCpuFeature
{
- CPU_FEATURE_FMA3=1,
- CPU_FEATURE_SSE4_1=2,
- CPU_FEATURE_NEON_HPFP=4
+ 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)
@@ -49,15 +48,15 @@ public:
if (0 == err && hasFeature)
capabilities |= CPU_FEATURE_NEON_HPFP;
}
-#endif //BT_USE_NEON
+#endif //BT_USE_NEON
-#ifdef BT_ALLOW_SSE4
+#ifdef BT_ALLOW_SSE4
{
- int cpuInfo[4];
+ int cpuInfo[4];
memset(cpuInfo, 0, sizeof(cpuInfo));
- unsigned long long sseExt = 0;
+ unsigned long long sseExt = 0;
__cpuid(cpuInfo, 1);
-
+
bool osUsesXSAVE_XRSTORE = cpuInfo[2] & (1 << 27) || false;
bool cpuAVXSuport = cpuInfo[2] & (1 << 28) || false;
@@ -79,14 +78,11 @@ public:
capabilities |= btCpuFeatureUtility::CPU_FEATURE_SSE4_1;
}
}
-#endif//BT_ALLOW_SSE4
+#endif //BT_ALLOW_SSE4
testedCapabilities = true;
return capabilities;
}
-
-
};
-
-#endif //BT_CPU_UTILITY_H
+#endif //BT_CPU_UTILITY_H
diff --git a/thirdparty/bullet/LinearMath/btDefaultMotionState.h b/thirdparty/bullet/LinearMath/btDefaultMotionState.h
index 01c5f8d932..14c40d36b0 100644
--- a/thirdparty/bullet/LinearMath/btDefaultMotionState.h
+++ b/thirdparty/bullet/LinearMath/btDefaultMotionState.h
@@ -4,39 +4,37 @@
#include "btMotionState.h"
///The btDefaultMotionState provides a common implementation to synchronize world transforms with offsets.
-ATTRIBUTE_ALIGNED16(struct) btDefaultMotionState : public btMotionState
+ATTRIBUTE_ALIGNED16(struct)
+btDefaultMotionState : public btMotionState
{
btTransform m_graphicsWorldTrans;
- btTransform m_centerOfMassOffset;
+ btTransform m_centerOfMassOffset;
btTransform m_startWorldTrans;
- void* m_userPointer;
+ void* m_userPointer;
BT_DECLARE_ALIGNED_ALLOCATOR();
- btDefaultMotionState(const btTransform& startTrans = btTransform::getIdentity(),const btTransform& centerOfMassOffset = btTransform::getIdentity())
+ btDefaultMotionState(const btTransform& startTrans = btTransform::getIdentity(), const btTransform& centerOfMassOffset = btTransform::getIdentity())
: m_graphicsWorldTrans(startTrans),
- m_centerOfMassOffset(centerOfMassOffset),
- m_startWorldTrans(startTrans),
- m_userPointer(0)
+ m_centerOfMassOffset(centerOfMassOffset),
+ m_startWorldTrans(startTrans),
+ m_userPointer(0)
{
}
///synchronizes world transform from user to physics
- virtual void getWorldTransform(btTransform& centerOfMassWorldTrans ) const
+ virtual void getWorldTransform(btTransform & centerOfMassWorldTrans) const
{
- centerOfMassWorldTrans = m_graphicsWorldTrans * m_centerOfMassOffset.inverse() ;
+ 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)
+ virtual void setWorldTransform(const btTransform& centerOfMassWorldTrans)
{
- m_graphicsWorldTrans = centerOfMassWorldTrans * m_centerOfMassOffset;
+ m_graphicsWorldTrans = centerOfMassWorldTrans * m_centerOfMassOffset;
}
-
-
-
};
-#endif //BT_DEFAULT_MOTION_STATE_H
+#endif //BT_DEFAULT_MOTION_STATE_H
diff --git a/thirdparty/bullet/LinearMath/btGeometryUtil.cpp b/thirdparty/bullet/LinearMath/btGeometryUtil.cpp
index 5ac230f712..115e3eab81 100644
--- a/thirdparty/bullet/LinearMath/btGeometryUtil.cpp
+++ b/thirdparty/bullet/LinearMath/btGeometryUtil.cpp
@@ -12,49 +12,43 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
-
#include "btGeometryUtil.h"
-
/*
Make sure this dummy function never changes so that it
can be used by probes that are checking whether the
library is actually installed.
*/
extern "C"
-{
- void btBulletMathProbe ();
+{
+ void btBulletMathProbe();
- void btBulletMathProbe () {}
+ void btBulletMathProbe() {}
}
-
-bool btGeometryUtil::isPointInsidePlanes(const btAlignedObjectArray<btVector3>& planeEquations, const btVector3& point, btScalar margin)
+bool btGeometryUtil::isPointInsidePlanes(const btAlignedObjectArray<btVector3>& planeEquations, const btVector3& point, btScalar margin)
{
int numbrushes = planeEquations.size();
- for (int i=0;i<numbrushes;i++)
+ for (int i = 0; i < numbrushes; i++)
{
const btVector3& N1 = planeEquations[i];
- btScalar dist = btScalar(N1.dot(point))+btScalar(N1[3])-margin;
- if (dist>btScalar(0.))
+ btScalar dist = btScalar(N1.dot(point)) + btScalar(N1[3]) - margin;
+ if (dist > btScalar(0.))
{
return false;
}
}
return true;
-
}
-
-bool btGeometryUtil::areVerticesBehindPlane(const btVector3& planeNormal, const btAlignedObjectArray<btVector3>& vertices, btScalar margin)
+bool btGeometryUtil::areVerticesBehindPlane(const btVector3& planeNormal, const btAlignedObjectArray<btVector3>& vertices, btScalar margin)
{
int numvertices = vertices.size();
- for (int i=0;i<numvertices;i++)
+ for (int i = 0; i < numvertices; i++)
{
const btVector3& N1 = vertices[i];
- btScalar dist = btScalar(planeNormal.dot(N1))+btScalar(planeNormal[3])-margin;
- if (dist>btScalar(0.))
+ btScalar dist = btScalar(planeNormal.dot(N1)) + btScalar(planeNormal[3]) - margin;
+ if (dist > btScalar(0.))
{
return false;
}
@@ -62,102 +56,98 @@ bool btGeometryUtil::areVerticesBehindPlane(const btVector3& planeNormal, const
return true;
}
-bool notExist(const btVector3& planeEquation,const btAlignedObjectArray<btVector3>& planeEquations);
+bool notExist(const btVector3& planeEquation, const btAlignedObjectArray<btVector3>& planeEquations);
-bool notExist(const btVector3& planeEquation,const btAlignedObjectArray<btVector3>& planeEquations)
+bool notExist(const btVector3& planeEquation, const btAlignedObjectArray<btVector3>& planeEquations)
{
int numbrushes = planeEquations.size();
- for (int i=0;i<numbrushes;i++)
+ for (int i = 0; i < numbrushes; i++)
{
const btVector3& N1 = planeEquations[i];
if (planeEquation.dot(N1) > btScalar(0.999))
{
return false;
- }
+ }
}
return true;
}
-void btGeometryUtil::getPlaneEquationsFromVertices(btAlignedObjectArray<btVector3>& vertices, btAlignedObjectArray<btVector3>& planeEquationsOut )
+void btGeometryUtil::getPlaneEquationsFromVertices(btAlignedObjectArray<btVector3>& vertices, btAlignedObjectArray<btVector3>& planeEquationsOut)
{
- const int numvertices = vertices.size();
+ const int numvertices = vertices.size();
// brute force:
- for (int i=0;i<numvertices;i++)
+ for (int i = 0; i < numvertices; i++)
{
const btVector3& N1 = vertices[i];
-
- for (int j=i+1;j<numvertices;j++)
+ for (int j = i + 1; j < numvertices; j++)
{
const btVector3& N2 = vertices[j];
-
- for (int k=j+1;k<numvertices;k++)
- {
+ for (int k = j + 1; k < numvertices; k++)
+ {
const btVector3& N3 = vertices[k];
- btVector3 planeEquation,edge0,edge1;
- edge0 = N2-N1;
- edge1 = N3-N1;
+ btVector3 planeEquation, edge0, edge1;
+ edge0 = N2 - N1;
+ edge1 = N3 - N1;
btScalar normalSign = btScalar(1.);
- for (int ww=0;ww<2;ww++)
+ for (int ww = 0; ww < 2; ww++)
{
planeEquation = normalSign * edge0.cross(edge1);
if (planeEquation.length2() > btScalar(0.0001))
{
planeEquation.normalize();
- if (notExist(planeEquation,planeEquationsOut))
+ if (notExist(planeEquation, planeEquationsOut))
{
planeEquation[3] = -planeEquation.dot(N1);
-
- //check if inside, and replace supportingVertexOut if needed
- if (areVerticesBehindPlane(planeEquation,vertices,btScalar(0.01)))
- {
- planeEquationsOut.push_back(planeEquation);
- }
+
+ //check if inside, and replace supportingVertexOut if needed
+ if (areVerticesBehindPlane(planeEquation, vertices, btScalar(0.01)))
+ {
+ planeEquationsOut.push_back(planeEquation);
+ }
}
}
normalSign = btScalar(-1.);
}
-
}
}
}
-
}
-void btGeometryUtil::getVerticesFromPlaneEquations(const btAlignedObjectArray<btVector3>& planeEquations , btAlignedObjectArray<btVector3>& verticesOut )
+void btGeometryUtil::getVerticesFromPlaneEquations(const btAlignedObjectArray<btVector3>& planeEquations, btAlignedObjectArray<btVector3>& verticesOut)
{
const int numbrushes = planeEquations.size();
// brute force:
- for (int i=0;i<numbrushes;i++)
+ for (int i = 0; i < numbrushes; i++)
{
const btVector3& N1 = planeEquations[i];
-
- for (int j=i+1;j<numbrushes;j++)
+ for (int j = i + 1; j < numbrushes; j++)
{
const btVector3& N2 = planeEquations[j];
-
- for (int k=j+1;k<numbrushes;k++)
- {
+ for (int k = j + 1; k < numbrushes; k++)
+ {
const btVector3& N3 = planeEquations[k];
- btVector3 n2n3; n2n3 = N2.cross(N3);
- btVector3 n3n1; n3n1 = N3.cross(N1);
- btVector3 n1n2; n1n2 = N1.cross(N2);
-
- if ( ( n2n3.length2() > btScalar(0.0001) ) &&
- ( n3n1.length2() > btScalar(0.0001) ) &&
- ( n1n2.length2() > btScalar(0.0001) ) )
+ btVector3 n2n3;
+ n2n3 = N2.cross(N3);
+ btVector3 n3n1;
+ n3n1 = N3.cross(N1);
+ btVector3 n1n2;
+ n1n2 = N1.cross(N2);
+
+ if ((n2n3.length2() > btScalar(0.0001)) &&
+ (n3n1.length2() > btScalar(0.0001)) &&
+ (n1n2.length2() > btScalar(0.0001)))
{
//point P out of 3 plane equations:
- // d1 ( N2 * N3 ) + d2 ( N3 * N1 ) + d3 ( N1 * N2 )
- //P = -------------------------------------------------------------------------
- // N1 . ( N2 * N3 )
-
+ // d1 ( N2 * N3 ) + d2 ( N3 * N1 ) + d3 ( N1 * N2 )
+ //P = -------------------------------------------------------------------------
+ // N1 . ( N2 * N3 )
btScalar quotient = (N1.dot(n2n3));
if (btFabs(quotient) > btScalar(0.000001))
@@ -172,7 +162,7 @@ void btGeometryUtil::getVerticesFromPlaneEquations(const btAlignedObjectArray<bt
potentialVertex *= quotient;
//check if inside, and replace supportingVertexOut if needed
- if (isPointInsidePlanes(planeEquations,potentialVertex,btScalar(0.01)))
+ if (isPointInsidePlanes(planeEquations, potentialVertex, btScalar(0.01)))
{
verticesOut.push_back(potentialVertex);
}
@@ -182,4 +172,3 @@ void btGeometryUtil::getVerticesFromPlaneEquations(const btAlignedObjectArray<bt
}
}
}
-
diff --git a/thirdparty/bullet/LinearMath/btGeometryUtil.h b/thirdparty/bullet/LinearMath/btGeometryUtil.h
index a4b13b4560..0ce5b76d92 100644
--- a/thirdparty/bullet/LinearMath/btGeometryUtil.h
+++ b/thirdparty/bullet/LinearMath/btGeometryUtil.h
@@ -12,7 +12,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#ifndef BT_GEOMETRY_UTIL_H
#define BT_GEOMETRY_UTIL_H
@@ -22,21 +21,16 @@ subject to the following restrictions:
///The btGeometryUtil helper class provides a few methods to convert between plane equations and vertices.
class btGeometryUtil
{
- public:
-
-
- static void getPlaneEquationsFromVertices(btAlignedObjectArray<btVector3>& vertices, btAlignedObjectArray<btVector3>& planeEquationsOut );
-
- static void getVerticesFromPlaneEquations(const btAlignedObjectArray<btVector3>& planeEquations , btAlignedObjectArray<btVector3>& verticesOut );
-
- static bool isInside(const btAlignedObjectArray<btVector3>& vertices, const btVector3& planeNormal, btScalar margin);
-
- static bool isPointInsidePlanes(const btAlignedObjectArray<btVector3>& planeEquations, const btVector3& point, btScalar margin);
+public:
+ static void getPlaneEquationsFromVertices(btAlignedObjectArray<btVector3>& vertices, btAlignedObjectArray<btVector3>& planeEquationsOut);
- static bool areVerticesBehindPlane(const btVector3& planeNormal, const btAlignedObjectArray<btVector3>& vertices, btScalar margin);
+ static void getVerticesFromPlaneEquations(const btAlignedObjectArray<btVector3>& planeEquations, btAlignedObjectArray<btVector3>& verticesOut);
-};
+ static bool isInside(const btAlignedObjectArray<btVector3>& vertices, const btVector3& planeNormal, btScalar margin);
+ static bool isPointInsidePlanes(const btAlignedObjectArray<btVector3>& planeEquations, const btVector3& point, btScalar margin);
-#endif //BT_GEOMETRY_UTIL_H
+ static bool areVerticesBehindPlane(const btVector3& planeNormal, const btAlignedObjectArray<btVector3>& vertices, btScalar margin);
+};
+#endif //BT_GEOMETRY_UTIL_H
diff --git a/thirdparty/bullet/LinearMath/btGrahamScan2dConvexHull.h b/thirdparty/bullet/LinearMath/btGrahamScan2dConvexHull.h
index 13a79aa585..0fcb285971 100644
--- a/thirdparty/bullet/LinearMath/btGrahamScan2dConvexHull.h
+++ b/thirdparty/bullet/LinearMath/btGrahamScan2dConvexHull.h
@@ -13,41 +13,40 @@ subject to the following restrictions:
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)
+ : btVector3(org),
+ m_orgIndex(orgIndex)
{
}
- btScalar m_angle;
+ btScalar m_angle;
int m_orgIndex;
};
-
-struct btAngleCompareFunc {
+struct btAngleCompareFunc
+{
btVector3 m_anchor;
btAngleCompareFunc(const btVector3& anchor)
- : m_anchor(anchor)
+ : m_anchor(anchor)
{
}
- bool operator()(const GrahamVector3& a, const GrahamVector3& b) const {
+ 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();
+ btScalar al = (a - m_anchor).length2();
+ btScalar bl = (b - m_anchor).length2();
if (al != bl)
- return al < bl;
+ return al < bl;
else
{
return a.m_orgIndex < b.m_orgIndex;
@@ -58,73 +57,73 @@ struct btAngleCompareFunc {
inline void GrahamScanConvexHull2D(btAlignedObjectArray<GrahamVector3>& originalPoints, btAlignedObjectArray<GrahamVector3>& hull, const btVector3& normalAxis)
{
- btVector3 axis0,axis1;
- btPlaneSpace1(normalAxis,axis0,axis1);
-
+ btVector3 axis0, axis1;
+ btPlaneSpace1(normalAxis, axis0, axis1);
- if (originalPoints.size()<=1)
+ if (originalPoints.size() <= 1)
{
- for (int i=0;i<originalPoints.size();i++)
+ 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++)
+ for (int i = 0; i < originalPoints.size(); i++)
{
-// const btVector3& left = originalPoints[i];
-// const btVector3& right = originalPoints[0];
+ // 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);
+ originalPoints.swap(0, i);
}
}
//also precompute angles
originalPoints[0].m_angle = -1e30f;
- for (int i=1;i<originalPoints.size();i++)
+ 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);
- }
+ 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);
+ originalPoints.quickSortInternal(comp, 1, originalPoints.size() - 1);
int i;
- for (i = 0; i<2; 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++)
+ 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;
+ 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
+ else
hull.push_back(originalPoints[i]);
}
- if( hull.size() == 1 )
- {
- hull.push_back( originalPoints[i] );
- }
+ if (hull.size() == 1)
+ {
+ hull.push_back(originalPoints[i]);
+ }
}
}
-#endif //GRAHAM_SCAN_2D_CONVEX_HULL_H
+#endif //GRAHAM_SCAN_2D_CONVEX_HULL_H
diff --git a/thirdparty/bullet/LinearMath/btHashMap.h b/thirdparty/bullet/LinearMath/btHashMap.h
index 180e7b44af..1fca0fb73a 100644
--- a/thirdparty/bullet/LinearMath/btHashMap.h
+++ b/thirdparty/bullet/LinearMath/btHashMap.h
@@ -13,7 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#ifndef BT_HASH_MAP_H
#define BT_HASH_MAP_H
@@ -24,32 +23,32 @@ subject to the following restrictions:
struct btHashString
{
std::string m_string1;
- unsigned int m_hash;
+ unsigned int m_hash;
- SIMD_FORCE_INLINE unsigned int getHash()const
+ SIMD_FORCE_INLINE unsigned int getHash() const
{
return m_hash;
}
btHashString()
{
- m_string1="";
- m_hash=0;
+ m_string1 = "";
+ m_hash = 0;
}
btHashString(const char* name)
- :m_string1(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 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++)
+
+ 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 */
+ hash = hash ^ (m_string1.c_str()[i]); /* xor the low 8 bits */
+ hash = hash * FNVMultiple; /* multiply by the magic number */
}
m_hash = hash;
}
@@ -60,28 +59,27 @@ struct btHashString
}
};
-const int BT_HASH_NULL=0xffffffff;
-
+const int BT_HASH_NULL = 0xffffffff;
class btHashInt
{
- int m_uid;
-public:
+ int m_uid;
+public:
btHashInt()
{
}
- btHashInt(int uid) :m_uid(uid)
+ btHashInt(int uid) : m_uid(uid)
{
}
- int getUid1() const
+ int getUid1() const
{
return m_uid;
}
- void setUid1(int uid)
+ void setUid1(int uid)
{
m_uid = uid;
}
@@ -91,35 +89,35 @@ public:
return getUid1() == other.getUid1();
}
//to our success
- SIMD_FORCE_INLINE unsigned int getHash()const
+ 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);
-
+ 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];
+ union {
+ const void* m_pointer;
+ unsigned int m_hashValues[2];
};
public:
-
btHashPtr(const void* ptr)
- :m_pointer(ptr)
+ : m_pointer(ptr)
{
}
- const void* getPointer() const
+ const void* getPointer() const
{
return m_pointer;
}
@@ -130,64 +128,68 @@ public:
}
//to our success
- SIMD_FORCE_INLINE unsigned int getHash()const
+ 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];
+ 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);
+ key += ~(key << 15);
+ key ^= (key >> 10);
+ key += (key << 3);
+ key ^= (key >> 6);
+ key += ~(key << 11);
+ key ^= (key >> 16);
return key;
}
-
-
};
-
template <class Value>
class btHashKeyPtr
{
- int m_uid;
+ int m_uid;
+
public:
+ btHashKeyPtr(int uid) : m_uid(uid)
+ {
+ }
- btHashKeyPtr(int uid) :m_uid(uid)
- {
- }
-
- int getUid1() const
- {
- return m_uid;
- }
-
- bool equals(const btHashKeyPtr<Value>& 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;
- }
-
-
-};
+ int getUid1() const
+ {
+ return m_uid;
+ }
+
+ bool equals(const btHashKeyPtr<Value>& 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 Value>
class btHashKey
{
- int m_uid;
-public:
+ int m_uid;
- btHashKey(int uid) :m_uid(uid)
+public:
+ btHashKey(int uid) : m_uid(uid)
{
}
- int getUid1() const
+ int getUid1() const
{
return m_uid;
}
@@ -197,30 +199,33 @@ public:
return getUid1() == other.getUid1();
}
//to our success
- SIMD_FORCE_INLINE unsigned int getHash()const
+ 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);
+ 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 Key, class Value>
class btHashMap
{
-
protected:
- btAlignedObjectArray<int> m_hashTable;
- btAlignedObjectArray<int> m_next;
-
- btAlignedObjectArray<Value> m_valueArray;
- btAlignedObjectArray<Key> m_keyArray;
+ btAlignedObjectArray<int> m_hashTable;
+ btAlignedObjectArray<int> m_next;
+
+ btAlignedObjectArray<Value> m_valueArray;
+ btAlignedObjectArray<Key> m_keyArray;
- void growTables(const Key& /*key*/)
+ void growTables(const Key& /*key*/)
{
int newCapacity = m_valueArray.capacity();
@@ -234,7 +239,7 @@ protected:
int i;
- for (i= 0; i < newCapacity; ++i)
+ for (i = 0; i < newCapacity; ++i)
{
m_hashTable[i] = BT_HASH_NULL;
}
@@ -243,30 +248,28 @@ protected:
m_next[i] = BT_HASH_NULL;
}
- for(i=0;i<curHashtableSize;i++)
+ 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
+ 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);
+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;
+ m_valueArray[index] = value;
return;
}
@@ -280,19 +283,19 @@ protected:
{
growTables(key);
//hash with new capacity
- hash = key.getHash() & (m_valueArray.capacity()-1);
+ 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);
+ void remove(const Key& key)
+ {
+ int hash = key.getHash() & (m_valueArray.capacity() - 1);
int pairIndex = findIndex(key);
-
- if (pairIndex ==BT_HASH_NULL)
+
+ if (pairIndex == BT_HASH_NULL)
{
return;
}
@@ -333,7 +336,7 @@ protected:
}
// Remove the last pair from the hash table.
- int lastHash = m_keyArray[lastPairIndex].getHash() & (m_valueArray.capacity()-1);
+ int lastHash = m_keyArray[lastPairIndex].getHash() & (m_valueArray.capacity() - 1);
index = m_hashTable[lastHash];
btAssert(index != BT_HASH_NULL);
@@ -365,10 +368,8 @@ protected:
m_valueArray.pop_back();
m_keyArray.pop_back();
-
}
-
int size() const
{
return m_valueArray.size();
@@ -377,8 +378,8 @@ protected:
const Value* getAtIndex(int index) const
{
btAssert(index < m_valueArray.size());
- btAssert(index>=0);
- if (index>=0 && index < m_valueArray.size())
+ btAssert(index >= 0);
+ if (index >= 0 && index < m_valueArray.size())
{
return &m_valueArray[index];
}
@@ -388,38 +389,39 @@ protected:
Value* getAtIndex(int index)
{
btAssert(index < m_valueArray.size());
- btAssert(index>=0);
- if (index>=0 && 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);
+ 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) {
+ Value* operator[](const Key& key)
+ {
return find(key);
}
- const Value* operator[](const Key& key) const {
+ const Value* operator[](const Key& key) const
+ {
return find(key);
}
- const Value* find(const Key& key) const
+ const Value* find(const Key& key) const
{
int index = findIndex(key);
if (index == BT_HASH_NULL)
@@ -429,7 +431,7 @@ protected:
return &m_valueArray[index];
}
- Value* find(const Key& key)
+ Value* find(const Key& key)
{
int index = findIndex(key);
if (index == BT_HASH_NULL)
@@ -439,10 +441,9 @@ protected:
return &m_valueArray[index];
}
-
- int findIndex(const Key& key) const
+ int findIndex(const Key& key) const
{
- unsigned int hash = key.getHash() & (m_valueArray.capacity()-1);
+ unsigned int hash = key.getHash() & (m_valueArray.capacity() - 1);
if (hash >= (unsigned int)m_hashTable.size())
{
@@ -457,14 +458,13 @@ protected:
return index;
}
- void clear()
+ void clear()
{
m_hashTable.clear();
m_next.clear();
m_valueArray.clear();
m_keyArray.clear();
}
-
};
-#endif //BT_HASH_MAP_H
+#endif //BT_HASH_MAP_H
diff --git a/thirdparty/bullet/LinearMath/btIDebugDraw.h b/thirdparty/bullet/LinearMath/btIDebugDraw.h
index b57282717d..82ec19a69b 100644
--- a/thirdparty/bullet/LinearMath/btIDebugDraw.h
+++ b/thirdparty/bullet/LinearMath/btIDebugDraw.h
@@ -13,86 +13,84 @@ subject to the following restrictions:
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
+class btIDebugDraw
{
- public:
-
- ATTRIBUTE_ALIGNED16(struct) DefaultColors
+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_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)
+ : 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
+ enum DebugDrawModes
{
- DBG_NoDebug=0,
+ DBG_NoDebug = 0,
DBG_DrawWireframe = 1,
- DBG_DrawAabb=2,
- DBG_DrawFeaturesText=4,
- DBG_DrawContactPoints=8,
- DBG_NoDeactivation=16,
+ DBG_DrawAabb = 2,
+ DBG_DrawFeaturesText = 4,
+ DBG_DrawContactPoints = 8,
+ DBG_NoDeactivation = 16,
DBG_NoHelpText = 32,
- DBG_DrawText=64,
+ 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_FastWireframe = (1 << 13),
+ DBG_DrawNormals = (1 << 14),
+ DBG_DrawFrames = (1 << 15),
DBG_MAX_DEBUG_DRAW_MODE
};
- virtual ~btIDebugDraw() {};
+ virtual ~btIDebugDraw(){};
-
- virtual DefaultColors getDefaultColors() const { DefaultColors colors; return colors; }
+ 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)
+
+ 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);
+ (void)toColor;
+ drawLine(from, to, fromColor);
}
- virtual void drawSphere(btScalar radius, const btTransform& transform, const btVector3& color)
+ 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);
@@ -101,103 +99,102 @@ class btIDebugDraw
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 );
+ 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)
+
+ virtual void drawSphere(const btVector3& p, btScalar radius, const btVector3& color)
{
btTransform tr;
tr.setIdentity();
tr.setOrigin(p);
- drawSphere(radius,tr,color);
+ 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)
+
+ 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);
+ drawTriangle(v0, v1, v2, color, alpha);
}
- virtual void drawTriangle(const btVector3& v0,const btVector3& v1,const btVector3& v2,const btVector3& color, btScalar /*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);
+ 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 drawContactPoint(const btVector3& PointOnB, const btVector3& normalOnB, btScalar distance, int lifeTime, const btVector3& color) = 0;
- virtual void reportErrorWarning(const char* warningString) = 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 draw3dText(const btVector3& location, const char* textString) = 0;
- virtual void drawAabb(const btVector3& from,const btVector3& to,const btVector3& color)
- {
+ virtual void setDebugMode(int debugMode) = 0;
+
+ virtual int getDebugMode() const = 0;
- btVector3 halfExtents = (to-from)* 0.5f;
- btVector3 center = (to+from) *0.5f;
- int i,j;
+ 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++)
+ btVector3 edgecoord(1.f, 1.f, 1.f), pa, pb;
+ for (i = 0; i < 4; i++)
{
- for (j=0;j<3;j++)
+ for (j = 0; j < 3; j++)
{
- pa = btVector3(edgecoord[0]*halfExtents[0], edgecoord[1]*halfExtents[1],
- edgecoord[2]*halfExtents[2]);
- pa+=center;
+ 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;
+ 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);
+ drawLine(pa, pb, color);
}
- edgecoord = btVector3(-1.f,-1.f,-1.f);
- if (i<3)
- edgecoord[i]*=-1.f;
+ 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.)));
+ 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))
+ 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;
+ if (!nSteps) nSteps = 1;
btVector3 prev = center + radiusA * vx * btCos(minAngle) + radiusB * vy * btSin(minAngle);
- if(drawSect)
+ if (drawSect)
{
drawLine(center, prev, color);
}
- for(int i = 1; i <= nSteps; i++)
+ 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)
+ 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)
+ 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];
@@ -211,33 +208,33 @@ class btIDebugDraw
btVector3 jv = kv.cross(iv);
bool drawN = false;
bool drawS = false;
- if(minTh <= -SIMD_HALF_PI)
+ if (minTh <= -SIMD_HALF_PI)
{
minTh = -SIMD_HALF_PI + step;
drawN = true;
}
- if(maxTh >= SIMD_HALF_PI)
+ if (maxTh >= SIMD_HALF_PI)
{
maxTh = SIMD_HALF_PI - step;
drawS = true;
}
- if(minTh > maxTh)
+ if (minTh > maxTh)
{
minTh = -SIMD_HALF_PI + step;
- maxTh = 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;
+ if (n_hor < 2) n_hor = 2;
btScalar step_h = (maxTh - minTh) / btScalar(n_hor - 1);
bool isClosed = false;
- if(minPs > maxPs)
+ if (minPs > maxPs)
{
minPs = -SIMD_PI + step;
- maxPs = SIMD_PI;
+ maxPs = SIMD_PI;
isClosed = true;
}
- else if((maxPs - minPs) >= SIMD_PI * btScalar(2.f))
+ else if ((maxPs - minPs) >= SIMD_PI * btScalar(2.f))
{
isClosed = true;
}
@@ -246,63 +243,64 @@ class btIDebugDraw
isClosed = false;
}
int n_vert = (int)((maxPs - minPs) / step) + 1;
- if(n_vert < 2) n_vert = 2;
+ if (n_vert < 2) n_vert = 2;
btScalar step_v = (maxPs - minPs) / btScalar(n_vert - 1);
- for(int i = 0; i < n_hor; i++)
+ 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++)
+ 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)
+ if (i)
{
drawLine(pvA[j], pvB[j], color);
}
- else if(drawS)
+ else if (drawS)
{
drawLine(spole, pvB[j], color);
}
- if(j)
+ if (j)
{
- drawLine(pvB[j-1], pvB[j], color);
+ drawLine(pvB[j - 1], pvB[j], color);
}
else
{
arcStart = pvB[j];
}
- if((i == (n_hor - 1)) && drawN)
+ if ((i == (n_hor - 1)) && drawN)
{
drawLine(npole, pvB[j], color);
}
-
+
if (drawCenter)
{
- if(isClosed)
+ if (isClosed)
{
- if(j == (n_vert-1))
+ if (j == (n_vert - 1))
{
drawLine(arcStart, pvB[j], color);
}
}
else
{
- if(((!i) || (i == (n_hor-1))) && ((!j) || (j == (n_vert-1))))
+ if (((!i) || (i == (n_hor - 1))) && ((!j) || (j == (n_vert - 1))))
{
drawLine(center, pvB[j], color);
}
}
}
}
- pT = pvA; pvA = pvB; pvB = pT;
+ 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);
@@ -338,31 +336,27 @@ class btIDebugDraw
{
int stepDegrees = 30;
- btVector3 capStart(0.f,0.f,0.f);
+ btVector3 capStart(0.f, 0.f, 0.f);
capStart[upAxis] = -halfHeight;
- btVector3 capEnd(0.f,0.f,0.f);
+ 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 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);
- }
-
-
+ drawSpherePatch(center, up, axis, radius, minTh, maxTh, minPs, maxPs, color, btScalar(stepDegrees), false);
+ }
}
{
@@ -370,52 +364,51 @@ class btIDebugDraw
childTransform.getOrigin() = transform * capEnd;
{
btVector3 center = childTransform.getOrigin();
- btVector3 up = childTransform.getBasis().getColumn((upAxis+1)%3);
+ 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);
+ 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)
+ 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);
+ 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);
+ btVector3 offsetHeight(0, 0, 0);
offsetHeight[upAxis] = halfHeight;
- int stepDegrees=30;
- btVector3 capStart(0.f,0.f,0.f);
+ int stepDegrees = 30;
+ btVector3 capStart(0.f, 0.f, 0.f);
capStart[upAxis] = -halfHeight;
- btVector3 capEnd(0.f,0.f,0.f);
+ btVector3 capEnd(0.f, 0.f, 0.f);
capEnd[upAxis] = halfHeight;
- for (int i=0;i<360;i+=stepDegrees)
+ 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);
+ 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);
+ 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));
+ 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)
@@ -423,50 +416,49 @@ class btIDebugDraw
int stepDegrees = 30;
btVector3 start = transform.getOrigin();
- btVector3 offsetHeight(0,0,0);
+ 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 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);
+ btVector3 capEnd(0.f, 0.f, 0.f);
capEnd[upAxis] = -halfHeight;
- for (int i=0;i<360;i+=stepDegrees)
+ 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);
+ 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);
+ 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);
+ 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);
+ 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);
+ 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);
+ 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()
@@ -478,6 +470,4 @@ class btIDebugDraw
}
};
-
-#endif //BT_IDEBUG_DRAW__H
-
+#endif //BT_IDEBUG_DRAW__H
diff --git a/thirdparty/bullet/LinearMath/btList.h b/thirdparty/bullet/LinearMath/btList.h
index eec80a7064..b255938c30 100644
--- a/thirdparty/bullet/LinearMath/btList.h
+++ b/thirdparty/bullet/LinearMath/btList.h
@@ -12,62 +12,62 @@ subject to the following restrictions:
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 {
+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;
- }
+ 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;
+private:
+ btGEN_Link *m_next;
+ btGEN_Link *m_prev;
};
-class btGEN_List {
+class btGEN_List
+{
public:
- btGEN_List() : m_head(&m_tail, 0), m_tail(0, &m_head) {}
+ 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(); }
- 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); }
- 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;
+ btGEN_Link m_head;
+ btGEN_Link m_tail;
};
-#endif //BT_GEN_LIST_H
-
-
-
+#endif //BT_GEN_LIST_H
diff --git a/thirdparty/bullet/LinearMath/btMatrix3x3.h b/thirdparty/bullet/LinearMath/btMatrix3x3.h
index 6cc4993da5..0a08ae409a 100644
--- a/thirdparty/bullet/LinearMath/btMatrix3x3.h
+++ b/thirdparty/bullet/LinearMath/btMatrix3x3.h
@@ -12,8 +12,7 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
-#ifndef BT_MATRIX3x3_H
+#ifndef BT_MATRIX3x3_H
#define BT_MATRIX3x3_H
#include "btVector3.h"
@@ -23,13 +22,13 @@ subject to the following restrictions:
#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))
+#define vMPPP (_mm_set_ps(+0.0f, +0.0f, +0.0f, -0.0f))
#endif
#if defined(BT_USE_SSE)
-#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))
+#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(v1000) = {1.0f, 0.0f, 0.0f, 0.0f};
const btSimdFloat4 ATTRIBUTE_ALIGNED16(v0100) = {0.0f, 1.0f, 0.0f, 0.0f};
@@ -37,22 +36,22 @@ const btSimdFloat4 ATTRIBUTE_ALIGNED16(v0010) = {0.0f, 0.0f, 1.0f, 0.0f};
#endif
#ifdef BT_USE_DOUBLE_PRECISION
-#define btMatrix3x3Data btMatrix3x3DoubleData
+#define btMatrix3x3Data btMatrix3x3DoubleData
#else
-#define btMatrix3x3Data btMatrix3x3FloatData
-#endif //BT_USE_DOUBLE_PRECISION
-
+#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 {
-
+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 () {}
+ btMatrix3x3() {}
// explicit btMatrix3x3(const btScalar *m) { setFromOpenGLSubMatrix(m); }
@@ -67,27 +66,27 @@ public:
*/
/** @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);
+ 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 )
+#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;
+ 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 )
+ 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;
+ m_el[0] = v0;
+ m_el[1] = v1;
+ m_el[2] = v2;
}
// Copy constructor
@@ -99,25 +98,25 @@ public:
}
// Assignment Operator
- SIMD_FORCE_INLINE btMatrix3x3& operator=(const btMatrix3x3& m)
+ 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)
+ 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)
{
@@ -133,10 +132,9 @@ public:
* @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]);
+ 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
@@ -147,10 +145,10 @@ public:
/** @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)
- {
+ SIMD_FORCE_INLINE btVector3& operator[](int i)
+ {
btFullAssert(0 <= i && i < 3);
- return m_el[i];
+ return m_el[i];
}
/** @brief Get a const reference to a row of the matrix as a vector
@@ -158,32 +156,31 @@ public:
SIMD_FORCE_INLINE const btVector3& operator[](int i) const
{
btFullAssert(0 <= i && i < 3);
- return m_el[i];
+ 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);
+ 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);
+ 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);
+ 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)
+ 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]);
-
+ 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
@@ -195,93 +192,92 @@ public:
* @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)
+ 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);
+ 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)
+ * @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();
+
+#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);
+ __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
+
+ 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;
+ 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,
+ 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
- }
-
+#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)
+ void setEulerYPR(const btScalar& yaw, const btScalar& pitch, const btScalar& roll)
{
setEulerZYX(roll, pitch, yaw);
}
@@ -295,182 +291,197 @@ public:
* 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) {
+ 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 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);
+ 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;
+ {
+#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));
+ 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
}
- static const btMatrix3x3& getIdentity()
+ 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);
+#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));
+ 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
+ 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;
+#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<uint32_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;
+ // 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<uint32_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] = 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[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);
+ 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
+ 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
+#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))
+ if (trace > btScalar(0.0))
{
btScalar s = btSqrt(trace + btScalar(1.0));
- temp[3]=(s * btScalar(0.5));
+ 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
+ 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 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));
@@ -481,44 +492,42 @@ public:
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]);
+ 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
+ * @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 (btFabs(pitch) == SIMD_HALF_PI)
{
- if (yaw>0)
- yaw-=SIMD_PI;
+ if (yaw > 0)
+ yaw -= SIMD_PI;
else
- yaw+=SIMD_PI;
+ yaw += SIMD_PI;
- if (roll>0)
- roll-=SIMD_PI;
+ if (roll > 0)
+ roll -= SIMD_PI;
else
- roll+=SIMD_PI;
+ 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
+ * @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
{
@@ -528,7 +537,7 @@ public:
};
Euler euler_out;
- Euler euler_out2; //second solution
+ Euler euler_out2; //second solution
//get the pointer to the raw data
// Check that pitch is not at a singularity
@@ -538,7 +547,7 @@ public:
euler_out2.yaw = 0;
// From difference of angles formula
- btScalar delta = btAtan2(m_el[0].x(),m_el[0].z());
+ 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);
@@ -546,7 +555,7 @@ public:
euler_out.roll = euler_out.pitch + delta;
euler_out2.roll = euler_out.pitch + delta;
}
- else // gimbal locked down
+ else // gimbal locked down
{
euler_out.pitch = -SIMD_PI / btScalar(2.0);
euler_out2.pitch = -SIMD_PI / btScalar(2.0);
@@ -556,29 +565,29 @@ public:
}
else
{
- euler_out.pitch = - btAsin(m_el[2].x());
+ 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.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));
+ 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;
+ {
+ yaw = euler_out.yaw;
pitch = euler_out.pitch;
roll = euler_out.roll;
}
else
- {
- yaw = euler_out2.yaw;
+ {
+ yaw = euler_out2.yaw;
pitch = euler_out2.pitch;
roll = euler_out2.roll;
}
@@ -589,18 +598,18 @@ public:
btMatrix3x3 scaled(const btVector3& s) const
{
-#if (defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE))|| defined (BT_USE_NEON)
+#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
+#else
return btMatrix3x3(
- m_el[0].x() * s.x(), m_el[0].y() * s.y(), m_el[0].z() * s.z(),
+ 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;
+ btScalar determinant() const;
/**@brief Return the adjoint of the matrix */
btMatrix3x3 adjoint() const;
/**@brief Return the matrix with all values non negative */
@@ -608,7 +617,7 @@ public:
/**@brief Return the transpose of the matrix */
btMatrix3x3 transpose() const;
/**@brief Return the inverse of the matrix */
- btMatrix3x3 inverse() const;
+ 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.
@@ -618,9 +627,9 @@ public:
btVector3 col1 = getColumn(0);
btVector3 col2 = getColumn(1);
btVector3 col3 = getColumn(2);
-
+
btScalar det = btDot(col1, btCross(col2, col3));
- if (btFabs(det)>SIMD_EPSILON)
+ if (btFabs(det) > SIMD_EPSILON)
{
det = 1.0f / det;
}
@@ -634,15 +643,15 @@ public:
btMatrix3x3 transposeTimes(const btMatrix3x3& m) const;
btMatrix3x3 timesTranspose(const btMatrix3x3& m) const;
- SIMD_FORCE_INLINE btScalar tdotx(const btVector3& v) 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
+ 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
+ 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();
}
@@ -653,31 +662,25 @@ public:
///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)
+ SIMD_FORCE_INLINE void extractRotation(btQuaternion & q, btScalar tolerance = 1.0e-9, int maxIter = 100)
{
- int iter =0;
+ int iter = 0;
btScalar w;
- const btMatrix3x3& A=*this;
- for(iter = 0; iter < maxIter; iter++)
+ 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);
+ 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)
+ if (w < tolerance)
break;
- q = btQuaternion(btVector3((btScalar(1.0) / w) * omega),w) *
+ 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.
@@ -687,7 +690,7 @@ public:
*
* Note that this matrix is assumed to be symmetric.
*/
- void diagonalize(btMatrix3x3& rot, btScalar threshold, int maxSteps)
+ void diagonalize(btMatrix3x3 & rot, btScalar threshold, int maxSteps)
{
rot.setIdentity();
for (int step = maxSteps; step > 0; step--)
@@ -723,7 +726,7 @@ public:
step = 1;
}
- // compute Jacobi rotation J which leads to a zero for element [p][q]
+ // 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;
@@ -732,7 +735,7 @@ public:
if (theta2 * theta2 < btScalar(10 / SIMD_EPSILON))
{
t = (theta >= 0) ? 1 / (theta + btSqrt(1 + theta2))
- : 1 / (theta - btSqrt(1 + theta2));
+ : 1 / (theta - btSqrt(1 + theta2));
cos = 1 / btSqrt(1 + t * t);
sin = cos * t;
}
@@ -765,8 +768,6 @@ public:
}
}
-
-
/**@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
@@ -774,304 +775,298 @@ public:
* @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
+ 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 serialize(struct btMatrix3x3Data & dataOut) const;
- void serializeFloat(struct btMatrix3x3FloatData& dataOut) const;
+ void serializeFloat(struct btMatrix3x3FloatData & dataOut) const;
- void deSerialize(const struct btMatrix3x3Data& dataIn);
+ void deSerialize(const struct btMatrix3x3Data& dataIn);
- void deSerializeFloat(const struct btMatrix3x3FloatData& dataIn);
-
- void deSerializeDouble(const struct btMatrix3x3DoubleData& dataIn);
+ void deSerializeFloat(const struct btMatrix3x3FloatData& dataIn);
+ void deSerializeDouble(const struct btMatrix3x3DoubleData& dataIn);
};
-
-SIMD_FORCE_INLINE btMatrix3x3&
+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);
+#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
+ 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[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&
+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;
+#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]);
+ 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)
+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));
+#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));
+ 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);
+ 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
+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)
+#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);
+ 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
+ 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
+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)
+#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);
+ 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]);
+ 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&
+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;
+#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]);
+ 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
+SIMD_FORCE_INLINE btScalar
btMatrix3x3::determinant() const
-{
+{
return btTriple((*this)[0], (*this)[1], (*this)[2]);
}
-
-SIMD_FORCE_INLINE btMatrix3x3
+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));
+#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()));
+ (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
+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 );
+#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<uint32_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 btMatrix3x3( v0, v1, v2 );
+ // 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<uint32_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 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());
+ 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
+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));
+ 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
+SIMD_FORCE_INLINE btMatrix3x3
btMatrix3x3::inverse() const
{
btVector3 co(cofac(1, 1, 2, 2), cofac(1, 2, 2, 0), cofac(1, 0, 2, 1));
@@ -1080,54 +1075,54 @@ btMatrix3x3::inverse() const
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);
+ 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
+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 );
+#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<uint32_t>(-1), static_cast<uint32_t>(-1), static_cast<uint32_t>(-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 );
+ // zeros w
+ static const uint32x4_t xyzMask = (const uint32x4_t){static_cast<uint32_t>(-1), static_cast<uint32_t>(-1), static_cast<uint32_t>(-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(
+ 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(),
@@ -1140,51 +1135,51 @@ btMatrix3x3::transposeTimes(const btMatrix3x3& m) const
#endif
}
-SIMD_FORCE_INLINE btMatrix3x3
+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);
-
+#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 );
-
+ 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]),
@@ -1193,139 +1188,138 @@ btMatrix3x3::timesTranspose(const btMatrix3x3& m) const
#endif
}
-SIMD_FORCE_INLINE btVector3
-operator*(const btMatrix3x3& m, const btVector3& v)
+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]);
+#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))
+#if defined BT_USE_SIMD_VECTOR3 && (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE))
+
+ const __m128 vv = v.mVec128;
- 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);
- __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));
- 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));
+ 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);
+ 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
+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);
+#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);
+ 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
+
+#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]));
+ 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
}
@@ -1348,73 +1342,67 @@ m1[0][2] * m2[0][2] + m1[1][2] * m2[1][2] + m1[2][2] * m2[2][2]);
* 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))
+#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE))
+
+ __m128 c0, c1, c2;
- __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_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);
+ 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] );
+
+#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
+struct btMatrix3x3FloatData
{
btVector3FloatData m_el[3];
};
///for serialization
-struct btMatrix3x3DoubleData
+struct btMatrix3x3DoubleData
{
btVector3DoubleData m_el[3];
};
-
-
-
-SIMD_FORCE_INLINE void btMatrix3x3::serialize(struct btMatrix3x3Data& dataOut) const
+SIMD_FORCE_INLINE void btMatrix3x3::serialize(struct btMatrix3x3Data& dataOut) const
{
- for (int i=0;i<3;i++)
+ 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
+SIMD_FORCE_INLINE void btMatrix3x3::serializeFloat(struct btMatrix3x3FloatData& dataOut) const
{
- for (int i=0;i<3;i++)
+ 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)
+SIMD_FORCE_INLINE void btMatrix3x3::deSerialize(const struct btMatrix3x3Data& dataIn)
{
- for (int i=0;i<3;i++)
+ 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)
+SIMD_FORCE_INLINE void btMatrix3x3::deSerializeFloat(const struct btMatrix3x3FloatData& dataIn)
{
- for (int i=0;i<3;i++)
+ 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)
+SIMD_FORCE_INLINE void btMatrix3x3::deSerializeDouble(const struct btMatrix3x3DoubleData& dataIn)
{
- for (int i=0;i<3;i++)
+ for (int i = 0; i < 3; i++)
m_el[i].deSerializeDouble(dataIn.m_el[i]);
}
-#endif //BT_MATRIX3x3_H
-
+#endif //BT_MATRIX3x3_H
diff --git a/thirdparty/bullet/LinearMath/btMatrixX.h b/thirdparty/bullet/LinearMath/btMatrixX.h
index 42caed42ef..9df9e49469 100644
--- a/thirdparty/bullet/LinearMath/btMatrixX.h
+++ b/thirdparty/bullet/LinearMath/btMatrixX.h
@@ -24,24 +24,23 @@ subject to the following restrictions:
//#define BT_DEBUG_OSTREAM
#ifdef BT_DEBUG_OSTREAM
#include <iostream>
-#include <iomanip> // std::setw
-#endif //BT_DEBUG_OSTREAM
+#include <iomanip> // std::setw
+#endif //BT_DEBUG_OSTREAM
class btIntSortPredicate
{
- public:
- bool operator() ( const int& a, const int& b ) const
- {
- return a < b;
- }
+public:
+ bool operator()(const int& a, const int& b) const
+ {
+ return a < b;
+ }
};
-
template <typename T>
struct btVectorX
{
- btAlignedObjectArray<T> m_storage;
-
+ btAlignedObjectArray<T> m_storage;
+
btVectorX()
{
}
@@ -49,7 +48,7 @@ struct btVectorX
{
m_storage.resize(numRows);
}
-
+
void resize(int rows)
{
m_storage.resize(rows);
@@ -66,13 +65,13 @@ struct btVectorX
{
return rows();
}
-
+
T nrm2() const
{
T norm = T(0);
-
+
int nn = rows();
-
+
{
if (nn == 1)
{
@@ -82,11 +81,11 @@ struct btVectorX
{
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++)
+
+ for (int ix = 0; ix < nn; ix++)
{
if ((*this)[ix] != 0.0)
{
@@ -110,38 +109,36 @@ struct btVectorX
}
}
return norm;
-
}
- void setZero()
+ void setZero()
{
if (m_storage.size())
{
// for (int i=0;i<m_storage.size();i++)
// m_storage[i]=0;
//memset(&m_storage[0],0,sizeof(T)*m_storage.size());
- btSetZero(&m_storage[0],m_storage.size());
+ btSetZero(&m_storage[0], m_storage.size());
}
}
- const T& operator[] (int index) const
+ const T& operator[](int index) const
{
return m_storage[index];
}
-
- T& operator[] (int index)
+
+ T& operator[](int index)
{
return m_storage[index];
}
-
+
T* getBufferPointerWritable()
{
return m_storage.size() ? &m_storage[0] : 0;
}
-
+
const T* getBufferPointer() const
{
return m_storage.size() ? &m_storage[0] : 0;
}
-
};
/*
template <typename T>
@@ -151,8 +148,7 @@ struct btVectorX
}
*/
-
-template <typename T>
+template <typename T>
struct btMatrixX
{
int m_rows;
@@ -161,10 +157,10 @@ struct btMatrixX
int m_resizeOperations;
int m_setElemOperations;
- btAlignedObjectArray<T> m_storage;
- mutable btAlignedObjectArray< btAlignedObjectArray<int> > m_rowNonZeroElements1;
+ btAlignedObjectArray<T> m_storage;
+ mutable btAlignedObjectArray<btAlignedObjectArray<int> > m_rowNonZeroElements1;
- T* getBufferPointerWritable()
+ T* getBufferPointerWritable()
{
return m_storage.size() ? &m_storage[0] : 0;
}
@@ -174,21 +170,21 @@ struct btMatrixX
return m_storage.size() ? &m_storage[0] : 0;
}
btMatrixX()
- :m_rows(0),
- m_cols(0),
- m_operations(0),
- m_resizeOperations(0),
- m_setElemOperations(0)
+ : 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)
+ btMatrixX(int rows, int cols)
+ : m_rows(rows),
+ m_cols(cols),
+ m_operations(0),
+ m_resizeOperations(0),
+ m_setElemOperations(0)
{
- resize(rows,cols);
+ resize(rows, cols);
}
void resize(int rows, int cols)
{
@@ -197,7 +193,7 @@ struct btMatrixX
m_cols = cols;
{
BT_PROFILE("m_storage.resize");
- m_storage.resize(rows*cols);
+ m_storage.resize(rows * cols);
}
}
int cols() const
@@ -215,108 +211,99 @@ struct btMatrixX
}
*/
- void addElem(int row,int col, T val)
+ void addElem(int row, int col, T val)
{
if (val)
{
- if (m_storage[col+row*m_cols]==0.f)
+ if (m_storage[col + row * m_cols] == 0.f)
{
- setElem(row,col,val);
- } else
+ setElem(row, col, val);
+ }
+ else
{
- m_storage[row*m_cols+col] += val;
+ m_storage[row * m_cols + col] += val;
}
}
}
-
-
- void setElem(int row,int col, T val)
+
+ void setElem(int row, int col, T val)
{
m_setElemOperations++;
- m_storage[row*m_cols+col] = val;
+ m_storage[row * m_cols + col] = val;
}
-
- void mulElem(int row,int col, T val)
+
+ void mulElem(int row, int col, T val)
{
m_setElemOperations++;
//mul doesn't change sparsity info
- m_storage[row*m_cols+col] *= val;
+ m_storage[row * m_cols + col] *= val;
}
-
-
-
-
+
void copyLowerToUpperTriangle()
{
- int count=0;
- for (int row=0;row<rows();row++)
+ int count = 0;
+ for (int row = 0; row < rows(); row++)
{
- for (int col=0;col<row;col++)
+ for (int col = 0; col < row; col++)
{
- setElem(col,row, (*this)(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
+
+ const T& operator()(int row, int col) const
{
- return m_storage[col+row*m_cols];
+ return m_storage[col + row * m_cols];
}
-
void setZero()
{
{
BT_PROFILE("storage=0");
- btSetZero(&m_storage[0],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<m_storage.size();i++)
- // m_storage[i]=0;
+ // m_storage[i]=0;
}
}
-
+
void setIdentity()
{
btAssert(rows() == cols());
-
+
setZero();
- for (int row=0;row<rows();row++)
+ for (int row = 0; row < rows(); row++)
{
- setElem(row,row,1);
+ setElem(row, row, 1);
}
}
-
-
- void printMatrix(const char* msg)
+ void printMatrix(const char* msg)
{
- printf("%s ---------------------\n",msg);
- for (int i=0;i<rows();i++)
+ printf("%s ---------------------\n", msg);
+ for (int i = 0; i < rows(); i++)
{
printf("\n");
- for (int j=0;j<cols();j++)
+ for (int j = 0; j < cols(); j++)
{
- printf("%2.1f\t",(*this)(i,j));
+ printf("%2.1f\t", (*this)(i, j));
}
}
printf("\n---------------------\n");
-
}
-
void rowComputeNonZeroElements() const
{
m_rowNonZeroElements1.resize(rows());
- for (int i=0;i<rows();i++)
+ for (int i = 0; i < rows(); i++)
{
m_rowNonZeroElements1[i].resize(0);
- for (int j=0;j<cols();j++)
+ for (int j = 0; j < cols(); j++)
{
- if ((*this)(i,j)!=0.f)
+ if ((*this)(i, j) != 0.f)
{
m_rowNonZeroElements1[i].push_back(j);
}
@@ -326,54 +313,52 @@ struct btMatrixX
btMatrixX transpose() const
{
//transpose is optimized for sparse matrices
- btMatrixX tr(m_cols,m_rows);
+ btMatrixX tr(m_cols, m_rows);
tr.setZero();
- for (int i=0;i<m_cols;i++)
- for (int j=0;j<m_rows;j++)
+ for (int i = 0; i < m_cols; i++)
+ for (int j = 0; j < m_rows; j++)
{
- T v = (*this)(j,i);
+ T v = (*this)(j, i);
if (v)
{
- tr.setElem(i,j,v);
+ tr.setElem(i, j, v);
}
}
return tr;
}
-
btMatrixX operator*(const btMatrixX& other)
{
//btMatrixX*btMatrixX implementation, brute force
btAssert(cols() == other.rows());
- btMatrixX res(rows(),other.cols());
+ btMatrixX res(rows(), other.cols());
res.setZero();
-// BT_PROFILE("btMatrixX mul");
- for (int j=0; j < res.cols(); ++j)
+ // BT_PROFILE("btMatrixX mul");
+ for (int j = 0; j < res.cols(); ++j)
{
{
- for (int i=0; i < res.rows(); ++i)
+ for (int i = 0; i < res.rows(); ++i)
{
- T dotProd=0;
-// T dotProd2=0;
+ T dotProd = 0;
+ // T dotProd2=0;
//int waste=0,waste2=0;
{
-// bool useOtherCol = true;
+ // bool useOtherCol = true;
{
- for (int v=0;v<rows();v++)
+ for (int v = 0; v < rows(); v++)
{
- T w = (*this)(i,v);
- if (other(v,j)!=0.f)
+ T w = (*this)(i, v);
+ if (other(v, j) != 0.f)
{
- dotProd+=w*other(v,j);
+ dotProd += w * other(v, j);
}
-
}
}
}
if (dotProd)
- res.setElem(i,j,dotProd);
+ res.setElem(i, j, dotProd);
}
}
}
@@ -381,174 +366,166 @@ struct btMatrixX
}
// this assumes the 4th and 8th rows of B and C are zero.
- void multiplyAdd2_p8r (const btScalar *B, const btScalar *C, int numRows, int numRowsOther ,int row, int col)
+ void multiplyAdd2_p8r(const btScalar* B, const btScalar* C, int numRows, int numRowsOther, int row, int col)
{
- const btScalar *bb = B;
- for ( int i = 0;i<numRows;i++)
+ const btScalar* bb = B;
+ for (int i = 0; i < numRows; i++)
{
- const btScalar *cc = C;
- for ( int j = 0;j<numRowsOther;j++)
+ 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];
- addElem(row+i,col+j,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];
+ addElem(row + i, col + j, sum);
cc += 8;
}
bb += 8;
}
}
- void multiply2_p8r (const btScalar *B, const btScalar *C, int numRows, int numRowsOther, int row, int col)
+ void multiply2_p8r(const btScalar* B, const btScalar* C, int numRows, int numRowsOther, int row, int col)
{
- btAssert (numRows>0 && numRowsOther>0 && B && C);
- const btScalar *bb = B;
- for ( int i = 0;i<numRows;i++)
+ btAssert(numRows > 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++)
+ 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);
+ 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)
+
+ 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++)
+ int numRows = rowend + 1 - rowstart;
+ int numCols = colend + 1 - colstart;
+
+ for (int row = 0; row < numRows; row++)
{
- for (int col=0;col<numCols;col++)
+ for (int col = 0; col < numCols; col++)
{
- setElem(rowstart+row,colstart+col,value);
+ setElem(rowstart + row, colstart + col, value);
}
}
}
-
- void setSubMatrix(int rowstart,int colstart,int rowend,int colend,const btMatrixX& block)
+
+ 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++)
+ 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++)
+ for (int col = 0; col < block.cols(); col++)
{
- setElem(rowstart+row,colstart+col,block(row,col));
+ setElem(rowstart + row, colstart + col, block(row, col));
}
}
}
- void setSubMatrix(int rowstart,int colstart,int rowend,int colend,const btVectorX<T>& block)
+ void setSubMatrix(int rowstart, int colstart, int rowend, int colend, const btVectorX<T>& block)
{
- btAssert(rowend+1-rowstart == block.rows());
- btAssert(colend+1-colstart == block.cols());
- for (int row=0;row<block.rows();row++)
+ 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++)
+ for (int col = 0; col < block.cols(); col++)
{
- setElem(rowstart+row,colstart+col,block[row]);
+ 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++)
+ 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);
+ T v = (*this)(i, j);
+ neg.setElem(i, j, -v);
}
return neg;
}
-
};
-
-
typedef btMatrixX<float> btMatrixXf;
typedef btVectorX<float> btVectorXf;
typedef btMatrixX<double> btMatrixXd;
typedef btVectorX<double> btVectorXd;
-
#ifdef BT_DEBUG_OSTREAM
-template <typename T>
-std::ostream& operator<< (std::ostream& os, const btMatrixX<T>& mat)
+template <typename T>
+std::ostream& operator<<(std::ostream& os, const btMatrixX<T>& mat)
+{
+ os << " [";
+ //printf("%s ---------------------\n",msg);
+ for (int i = 0; i < mat.rows(); i++)
{
-
- os << " [";
- //printf("%s ---------------------\n",msg);
- for (int i=0;i<mat.rows();i++)
+ for (int j = 0; j < mat.cols(); j++)
{
- for (int j=0;j<mat.cols();j++)
- {
- os << std::setw(12) << mat(i,j);
- }
- if (i!=mat.rows()-1)
- os << std::endl << " ";
+ os << std::setw(12) << mat(i, j);
}
- os << " ]";
- //printf("\n---------------------\n");
-
- return os;
+ if (i != mat.rows() - 1)
+ os << std::endl
+ << " ";
}
-template <typename T>
-std::ostream& operator<< (std::ostream& os, const btVectorX<T>& 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");
+ os << " ]";
+ //printf("\n---------------------\n");
- return os;
+ return os;
+}
+template <typename T>
+std::ostream& operator<<(std::ostream& os, const btVectorX<T>& 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");
-#endif //BT_DEBUG_OSTREAM
+ return os;
+}
+#endif //BT_DEBUG_OSTREAM
inline void setElem(btMatrixXd& mat, int row, int col, double val)
{
- mat.setElem(row,col,val);
+ mat.setElem(row, col, val);
}
inline void setElem(btMatrixXf& mat, int row, int col, float val)
{
- mat.setElem(row,col,val);
+ mat.setElem(row, col, val);
}
#ifdef BT_USE_DOUBLE_PRECISION
- #define btVectorXu btVectorXd
- #define btMatrixXu btMatrixXd
+#define btVectorXu btVectorXd
+#define btMatrixXu btMatrixXd
#else
- #define btVectorXu btVectorXf
- #define btMatrixXu btMatrixXf
-#endif //BT_USE_DOUBLE_PRECISION
-
-
+#define btVectorXu btVectorXf
+#define btMatrixXu btMatrixXf
+#endif //BT_USE_DOUBLE_PRECISION
-#endif//BT_MATRIX_H_H
+#endif //BT_MATRIX_H_H
diff --git a/thirdparty/bullet/LinearMath/btMinMax.h b/thirdparty/bullet/LinearMath/btMinMax.h
index 5b436e9ba4..92fea0275a 100644
--- a/thirdparty/bullet/LinearMath/btMinMax.h
+++ b/thirdparty/bullet/LinearMath/btMinMax.h
@@ -12,60 +12,58 @@ subject to the following restrictions:
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 <class T>
-SIMD_FORCE_INLINE const T& btMin(const T& a, const T& b)
+SIMD_FORCE_INLINE const T& btMin(const T& a, const T& b)
{
- return a < b ? a : b ;
+ return a < b ? a : b;
}
template <class T>
-SIMD_FORCE_INLINE const T& btMax(const T& a, const T& b)
+SIMD_FORCE_INLINE const T& btMax(const T& a, const T& b)
{
- return a > b ? a : b;
+ return a > b ? a : b;
}
template <class T>
-SIMD_FORCE_INLINE const T& btClamped(const T& a, const T& lb, const T& ub)
+SIMD_FORCE_INLINE const T& btClamped(const T& a, const T& lb, const T& ub)
{
- return a < lb ? lb : (ub < a ? ub : a);
+ return a < lb ? lb : (ub < a ? ub : a);
}
template <class T>
-SIMD_FORCE_INLINE void btSetMin(T& a, const T& b)
+SIMD_FORCE_INLINE void btSetMin(T& a, const T& b)
{
- if (b < a)
+ if (b < a)
{
a = b;
}
}
template <class T>
-SIMD_FORCE_INLINE void btSetMax(T& a, const T& b)
+SIMD_FORCE_INLINE void btSetMax(T& a, const T& b)
{
- if (a < b)
+ if (a < b)
{
a = b;
}
}
template <class T>
-SIMD_FORCE_INLINE void btClamp(T& a, const T& lb, const T& ub)
+SIMD_FORCE_INLINE void btClamp(T& a, const T& lb, const T& ub)
{
- if (a < lb)
+ if (a < lb)
{
- a = lb;
+ a = lb;
}
- else if (ub < a)
+ else if (ub < a)
{
a = ub;
}
}
-#endif //BT_GEN_MINMAX_H
+#endif //BT_GEN_MINMAX_H
diff --git a/thirdparty/bullet/LinearMath/btMotionState.h b/thirdparty/bullet/LinearMath/btMotionState.h
index 9431814090..ae6a51611d 100644
--- a/thirdparty/bullet/LinearMath/btMotionState.h
+++ b/thirdparty/bullet/LinearMath/btMotionState.h
@@ -20,21 +20,17 @@ subject to the following restrictions:
///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
+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;
-
-
+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
+#endif //BT_MOTIONSTATE_H
diff --git a/thirdparty/bullet/LinearMath/btPolarDecomposition.cpp b/thirdparty/bullet/LinearMath/btPolarDecomposition.cpp
index b3664faa4e..d9c72a8014 100644
--- a/thirdparty/bullet/LinearMath/btPolarDecomposition.cpp
+++ b/thirdparty/bullet/LinearMath/btPolarDecomposition.cpp
@@ -3,96 +3,92 @@
namespace
{
- btScalar abs_column_sum(const btMatrix3x3& a, int i)
- {
- return btFabs(a[0][i]) + btFabs(a[1][i]) + btFabs(a[2][i]);
- }
-
- btScalar abs_row_sum(const btMatrix3x3& a, int i)
- {
- return btFabs(a[i][0]) + btFabs(a[i][1]) + btFabs(a[i][2]);
- }
-
- btScalar p1_norm(const btMatrix3x3& a)
- {
- const btScalar sum0 = abs_column_sum(a,0);
- const btScalar sum1 = abs_column_sum(a,1);
- const btScalar sum2 = abs_column_sum(a,2);
- return btMax(btMax(sum0, sum1), sum2);
- }
-
- btScalar pinf_norm(const btMatrix3x3& a)
- {
- const btScalar sum0 = abs_row_sum(a,0);
- const btScalar sum1 = abs_row_sum(a,1);
- const btScalar sum2 = abs_row_sum(a,2);
- return btMax(btMax(sum0, sum1), sum2);
- }
+btScalar abs_column_sum(const btMatrix3x3& a, int i)
+{
+ return btFabs(a[0][i]) + btFabs(a[1][i]) + btFabs(a[2][i]);
}
+btScalar abs_row_sum(const btMatrix3x3& a, int i)
+{
+ return btFabs(a[i][0]) + btFabs(a[i][1]) + btFabs(a[i][2]);
+}
+btScalar p1_norm(const btMatrix3x3& a)
+{
+ const btScalar sum0 = abs_column_sum(a, 0);
+ const btScalar sum1 = abs_column_sum(a, 1);
+ const btScalar sum2 = abs_column_sum(a, 2);
+ return btMax(btMax(sum0, sum1), sum2);
+}
+
+btScalar pinf_norm(const btMatrix3x3& a)
+{
+ const btScalar sum0 = abs_row_sum(a, 0);
+ const btScalar sum1 = abs_row_sum(a, 1);
+ const btScalar sum2 = abs_row_sum(a, 2);
+ return btMax(btMax(sum0, sum1), sum2);
+}
+} // namespace
btPolarDecomposition::btPolarDecomposition(btScalar tolerance, unsigned int maxIterations)
-: m_tolerance(tolerance)
-, m_maxIterations(maxIterations)
+ : m_tolerance(tolerance), m_maxIterations(maxIterations)
{
}
unsigned int btPolarDecomposition::decompose(const btMatrix3x3& a, btMatrix3x3& u, btMatrix3x3& h) const
{
- // Use the 'u' and 'h' matrices for intermediate calculations
- u = a;
- h = a.inverse();
-
- for (unsigned int i = 0; i < m_maxIterations; ++i)
- {
- const btScalar h_1 = p1_norm(h);
- const btScalar h_inf = pinf_norm(h);
- const btScalar u_1 = p1_norm(u);
- const btScalar u_inf = pinf_norm(u);
-
- const btScalar h_norm = h_1 * h_inf;
- const btScalar u_norm = u_1 * u_inf;
-
- // The matrix is effectively singular so we cannot invert it
- if (btFuzzyZero(h_norm) || btFuzzyZero(u_norm))
- break;
-
- const btScalar gamma = btPow(h_norm / u_norm, 0.25f);
- const btScalar inv_gamma = btScalar(1.0) / gamma;
-
- // Determine the delta to 'u'
- const btMatrix3x3 delta = (u * (gamma - btScalar(2.0)) + h.transpose() * inv_gamma) * btScalar(0.5);
-
- // Update the matrices
- u += delta;
- h = u.inverse();
-
- // Check for convergence
- if (p1_norm(delta) <= m_tolerance * u_1)
- {
- h = u.transpose() * a;
- h = (h + h.transpose()) * 0.5;
- return i;
- }
- }
-
- // The algorithm has failed to converge to the specified tolerance, but we
- // want to make sure that the matrices returned are in the right form.
- h = u.transpose() * a;
- h = (h + h.transpose()) * 0.5;
-
- return m_maxIterations;
+ // Use the 'u' and 'h' matrices for intermediate calculations
+ u = a;
+ h = a.inverse();
+
+ for (unsigned int i = 0; i < m_maxIterations; ++i)
+ {
+ const btScalar h_1 = p1_norm(h);
+ const btScalar h_inf = pinf_norm(h);
+ const btScalar u_1 = p1_norm(u);
+ const btScalar u_inf = pinf_norm(u);
+
+ const btScalar h_norm = h_1 * h_inf;
+ const btScalar u_norm = u_1 * u_inf;
+
+ // The matrix is effectively singular so we cannot invert it
+ if (btFuzzyZero(h_norm) || btFuzzyZero(u_norm))
+ break;
+
+ const btScalar gamma = btPow(h_norm / u_norm, 0.25f);
+ const btScalar inv_gamma = btScalar(1.0) / gamma;
+
+ // Determine the delta to 'u'
+ const btMatrix3x3 delta = (u * (gamma - btScalar(2.0)) + h.transpose() * inv_gamma) * btScalar(0.5);
+
+ // Update the matrices
+ u += delta;
+ h = u.inverse();
+
+ // Check for convergence
+ if (p1_norm(delta) <= m_tolerance * u_1)
+ {
+ h = u.transpose() * a;
+ h = (h + h.transpose()) * 0.5;
+ return i;
+ }
+ }
+
+ // The algorithm has failed to converge to the specified tolerance, but we
+ // want to make sure that the matrices returned are in the right form.
+ h = u.transpose() * a;
+ h = (h + h.transpose()) * 0.5;
+
+ return m_maxIterations;
}
unsigned int btPolarDecomposition::maxIterations() const
{
- return m_maxIterations;
+ return m_maxIterations;
}
unsigned int polarDecompose(const btMatrix3x3& a, btMatrix3x3& u, btMatrix3x3& h)
{
- static btPolarDecomposition polar;
- return polar.decompose(a, u, h);
+ static btPolarDecomposition polar;
+ return polar.decompose(a, u, h);
}
-
diff --git a/thirdparty/bullet/LinearMath/btPolarDecomposition.h b/thirdparty/bullet/LinearMath/btPolarDecomposition.h
index 1feea0f78e..bf29140a14 100644
--- a/thirdparty/bullet/LinearMath/btPolarDecomposition.h
+++ b/thirdparty/bullet/LinearMath/btPolarDecomposition.h
@@ -13,10 +13,8 @@
*/
class btPolarDecomposition
{
- public:
-
-
- /**
+public:
+ /**
* Creates an instance with optional parameters.
*
* @param tolerance - the tolerance used to determine convergence of the
@@ -24,10 +22,10 @@ class btPolarDecomposition
* @param maxIterations - the maximum number of iterations used to achieve
* convergence
*/
- btPolarDecomposition(btScalar tolerance = btScalar(0.0001),
- unsigned int maxIterations = 16);
+ 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.
@@ -38,19 +36,19 @@ class btPolarDecomposition
*
* @return the number of iterations performed by the algorithm.
*/
- unsigned int decompose(const btMatrix3x3& a, btMatrix3x3& u, btMatrix3x3& h) const;
+ 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;
+ unsigned int maxIterations() const;
- private:
- btScalar m_tolerance;
- unsigned int m_maxIterations;
+private:
+ btScalar m_tolerance;
+ unsigned int m_maxIterations;
};
/**
@@ -66,7 +64,6 @@ class btPolarDecomposition
*
* @return the number of iterations performed by the algorithm.
*/
-unsigned int polarDecompose(const btMatrix3x3& a, btMatrix3x3& u, btMatrix3x3& h);
-
-#endif // POLARDECOMPOSITION_H
+unsigned int polarDecompose(const btMatrix3x3& a, btMatrix3x3& u, btMatrix3x3& h);
+#endif // POLARDECOMPOSITION_H
diff --git a/thirdparty/bullet/LinearMath/btPoolAllocator.h b/thirdparty/bullet/LinearMath/btPoolAllocator.h
index efdeda8ffc..4e7b49660a 100644
--- a/thirdparty/bullet/LinearMath/btPoolAllocator.h
+++ b/thirdparty/bullet/LinearMath/btPoolAllocator.h
@@ -12,7 +12,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#ifndef _BT_POOL_ALLOCATOR_H
#define _BT_POOL_ALLOCATOR_H
@@ -23,38 +22,38 @@ subject to the following restrictions:
///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
+ 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_elemSize(elemSize),
+ m_maxElements(maxElements)
{
- m_pool = (unsigned char*) btAlignedAlloc( static_cast<unsigned int>(m_elemSize*m_maxElements),16);
+ m_pool = (unsigned char*)btAlignedAlloc(static_cast<unsigned int>(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;
- }
+ 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);
+ btAlignedFree(m_pool);
}
- int getFreeCount() const
+ int getFreeCount() const
{
return m_freeCount;
}
@@ -69,26 +68,27 @@ public:
return m_maxElements;
}
- void* allocate(int size)
+ void* allocate(int size)
{
// release mode fix
(void)size;
- btMutexLock(&m_mutex);
- btAssert(!size || size<=m_elemSize);
+ 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;
+ 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 (ptr)
+ {
if (((unsigned char*)ptr >= m_pool && (unsigned char*)ptr < m_pool + m_maxElements * m_elemSize))
{
return true;
@@ -97,34 +97,34 @@ public:
return false;
}
- void freeMemory(void* ptr)
+ 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);
- }
+ 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
+ int getElementSize() const
{
return m_elemSize;
}
- unsigned char* getPoolAddress()
+ unsigned char* getPoolAddress()
{
return m_pool;
}
- const unsigned char* getPoolAddress() const
+ const unsigned char* getPoolAddress() const
{
return m_pool;
}
-
};
-#endif //_BT_POOL_ALLOCATOR_H
+#endif //_BT_POOL_ALLOCATOR_H
diff --git a/thirdparty/bullet/LinearMath/btQuadWord.h b/thirdparty/bullet/LinearMath/btQuadWord.h
index fcfb3be444..ab2d3175ad 100644
--- a/thirdparty/bullet/LinearMath/btQuadWord.h
+++ b/thirdparty/bullet/LinearMath/btQuadWord.h
@@ -12,18 +12,13 @@ subject to the following restrictions:
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__)
+#if defined(__CELLOS_LV2) && defined(__SPU__)
#include <altivec.h>
#endif
@@ -31,51 +26,53 @@ subject to the following restrictions:
* Some issues under PS3 Linux with IBM 2.1 SDK, gcc compiler prevent from using aligned quadword.
*/
#ifndef USE_LIBSPE2
-ATTRIBUTE_ALIGNED16(class) btQuadWord
+ATTRIBUTE_ALIGNED16(class)
+btQuadWord
#else
class btQuadWord
#endif
{
protected:
-
-#if defined (__SPU__) && defined (__CELLOS_LV2__)
+#if defined(__SPU__) && defined(__CELLOS_LV2__)
union {
vec_float4 mVec128;
- btScalar m_floats[4];
+ btScalar m_floats[4];
};
+
public:
- vec_float4 get128() const
+ vec_float4 get128() const
{
return mVec128;
}
+
protected:
-#else //__CELLOS_LV2__ __SPU__
+#else //__CELLOS_LV2__ __SPU__
-#if defined(BT_USE_SSE) || defined(BT_USE_NEON)
+#if defined(BT_USE_SSE) || defined(BT_USE_NEON)
union {
btSimdFloat4 mVec128;
- btScalar m_floats[4];
+ btScalar m_floats[4];
};
+
public:
- SIMD_FORCE_INLINE btSimdFloat4 get128() const
+ SIMD_FORCE_INLINE btSimdFloat4 get128() const
{
return mVec128;
}
- SIMD_FORCE_INLINE void set128(btSimdFloat4 v128)
+ SIMD_FORCE_INLINE void set128(btSimdFloat4 v128)
{
mVec128 = v128;
}
#else
- btScalar m_floats[4];
-#endif // BT_USE_SSE
+ btScalar m_floats[4];
+#endif // BT_USE_SSE
-#endif //__CELLOS_LV2__ __SPU__
+#endif //__CELLOS_LV2__ __SPU__
- public:
-
+public:
#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) || defined(BT_USE_NEON)
- // Set Vector
+ // Set Vector
SIMD_FORCE_INLINE btQuadWord(const btSimdFloat4 vec)
{
mVec128 = vec;
@@ -88,157 +85,154 @@ public:
}
// Assignment Operator
- SIMD_FORCE_INLINE btQuadWord&
- operator=(const btQuadWord& v)
+ 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]; }
+ /**@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 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
+ 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]));
+ 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
+ SIMD_FORCE_INLINE bool operator!=(const btQuadWord& other) const
{
return !(*this == other);
}
- /**@brief Set x,y,z and zero w
+ /**@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;
- }
+ 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
+ /* void getValue(btScalar *m) const
{
m[0] = m_floats[0];
m[1] = m_floats[1];
m[2] = m_floats[2];
}
*/
-/**@brief Set the values
+ /**@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)
+ 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;
- }
+ 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
+ /**@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;
- }
+ 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
+ /**@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
+ 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
- }
-
-
-
+ 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
+#endif //BT_SIMD_QUADWORD_H
diff --git a/thirdparty/bullet/LinearMath/btQuaternion.h b/thirdparty/bullet/LinearMath/btQuaternion.h
index a98fec7bc4..53e8169b80 100644
--- a/thirdparty/bullet/LinearMath/btQuaternion.h
+++ b/thirdparty/bullet/LinearMath/btQuaternion.h
@@ -12,25 +12,19 @@ subject to the following restrictions:
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
-
-
+#endif //BT_USE_DOUBLE_PRECISION
#ifdef BT_USE_SSE
@@ -39,7 +33,7 @@ subject to the following restrictions:
#endif
-#if defined(BT_USE_SSE)
+#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))
@@ -52,13 +46,14 @@ 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 {
+class btQuaternion : public btQuadWord
+{
public:
- /**@brief No initialization constructor */
+ /**@brief No initialization constructor */
btQuaternion() {}
-#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE))|| defined(BT_USE_NEON)
- // Set Vector
+#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;
@@ -71,42 +66,43 @@ public:
}
// Assignment Operator
- SIMD_FORCE_INLINE btQuaternion&
- operator=(const btQuaternion& v)
+ SIMD_FORCE_INLINE btQuaternion&
+ operator=(const btQuaternion& v)
{
mVec128 = v.mVec128;
-
+
return *this;
}
-
+
#endif
// template <typename btScalar>
// explicit Quaternion(const btScalar *v) : Tuple4<btScalar>(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
+ /**@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);
+ btQuaternion(const btVector3& _axis, const btScalar& _angle)
+ {
+ setRotation(_axis, _angle);
}
- /**@brief Constructor from Euler angles
+ /**@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);
+ setEuler(yaw, pitch, roll);
#else
- setEulerZYX(yaw, pitch, roll);
-#endif
+ setEulerZYX(yaw, pitch, roll);
+#endif
}
- /**@brief Set the rotation using axis angle notation
+ /**@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)
@@ -114,18 +110,18 @@ public:
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)));
+ setValue(axis.x() * s, axis.y() * s, axis.z() * s,
+ btCos(_angle * btScalar(0.5)));
}
- /**@brief Set the quaternion using Euler angles
+ /**@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 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);
@@ -133,32 +129,32 @@ public:
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);
+ 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
+ /**@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 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
+ 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
+ /**@brief Get the euler angles from this quaternion
* @param yaw Angle around Z
* @param pitch Angle around Y
* @param roll Angle around X */
@@ -173,23 +169,25 @@ public:
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]);
-
+ 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 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 = 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);
@@ -197,178 +195,178 @@ public:
}
}
- /**@brief Add two quaternions
+ /**@brief Add two quaternions
* @param q The quaternion to add to this one */
- SIMD_FORCE_INLINE btQuaternion& operator+=(const btQuaternion& q)
+ SIMD_FORCE_INLINE btQuaternion& operator+=(const btQuaternion& q)
{
-#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
+#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];
+#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
+ /**@brief Subtract out a quaternion
* @param q The quaternion to subtract from this one */
- btQuaternion& operator-=(const btQuaternion& q)
+ btQuaternion& operator-=(const btQuaternion& q)
{
-#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
+#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];
+#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;
+ return *this;
}
- /**@brief Scale this quaternion
+ /**@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)
+#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;
+ 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
+ /**@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)
+#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));
-
+
+ __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));
-
+
+ __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;
+
+ 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.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
+ /**@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;
-
+#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);
+
+ __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);
+
+ 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));
+ 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];
+#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 */
+ /**@brief Return the length squared of the quaternion */
btScalar length2() const
{
return dot(*this);
}
- /**@brief Return the length of the quaternion */
+ /**@brief Return the length of the quaternion */
btScalar length() const
{
return btSqrt(length2());
@@ -376,46 +374,46 @@ public:
btQuaternion& safeNormalize()
{
btScalar l2 = length2();
- if (l2>SIMD_EPSILON)
+ if (l2 > SIMD_EPSILON)
{
normalize();
}
return *this;
}
- /**@brief Normalize the quaternion
+ /**@brief Normalize the quaternion
* Such that x^2 + y^2 + z^2 +w^2 = 1 */
- btQuaternion& normalize()
+ btQuaternion& normalize()
{
-#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
- __m128 vd;
-
+#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);
+
+ __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
+ vd = bt_pshufd_ps(vd, 0); // splat
mVec128 = _mm_mul_ps(mVec128, vd);
-
+
return *this;
-#else
+#else
return *this /= length();
#endif
}
- /**@brief Return a scaled version of this quaternion
+ /**@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)
-
+#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));
@@ -424,7 +422,7 @@ public:
#endif
}
- /**@brief Return an inversely scaled versionof this quaternion
+ /**@brief Return an inversely scaled versionof this quaternion
* @param s The inverse scale factor */
btQuaternion operator/(const btScalar& s) const
{
@@ -432,49 +430,49 @@ public:
return *this * (btScalar(1.0) / s);
}
- /**@brief Inversely scale this quaternion
+ /**@brief Inversely scale this quaternion
* @param s The scale factor */
- btQuaternion& operator/=(const btScalar& s)
+ 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
+ /**@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 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 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
+ 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
+ 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 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 getAngleShortestPath() const
{
btScalar s;
if (m_floats[3] >= 0)
@@ -484,120 +482,117 @@ public:
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);
+ 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)
+#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((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
+ /**@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)
+#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
+ 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
+ /**@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)
+#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
+ 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
+ /**@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)
+#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
+ 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]);
+ 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
+ /**@todo document this and it's use */
+ SIMD_FORCE_INLINE btQuaternion farthest(const btQuaternion& qd) const
{
- btQuaternion diff,sum;
+ btQuaternion diff, sum;
diff = *this - qd;
sum = *this + qd;
- if( diff.dot(diff) > sum.dot(sum) )
+ 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
+ SIMD_FORCE_INLINE btQuaternion nearest(const btQuaternion& qd) const
{
- btQuaternion diff,sum;
+ btQuaternion diff, sum;
diff = *this - qd;
sum = *this + qd;
- if( diff.dot(diff) < sum.dot(sum) )
+ 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
+ /**@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))
+
+ 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),
@@ -610,314 +605,308 @@ public:
}
}
- static const btQuaternion& getIdentity()
+ static const btQuaternion& getIdentity()
{
- static const btQuaternion identityQuat(btScalar(0.),btScalar(0.),btScalar(0.),btScalar(1.));
+ 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 serialize(struct btQuaternionData& dataOut) const;
- SIMD_FORCE_INLINE void deSerialize(const struct btQuaternionDoubleData& dataIn);
+ SIMD_FORCE_INLINE void deSerialize(const struct btQuaternionFloatData& dataIn);
- SIMD_FORCE_INLINE void serializeFloat(struct btQuaternionFloatData& dataOut) const;
+ SIMD_FORCE_INLINE void deSerialize(const struct btQuaternionDoubleData& dataIn);
- SIMD_FORCE_INLINE void deSerializeFloat(const struct btQuaternionFloatData& dataIn);
+ SIMD_FORCE_INLINE void serializeFloat(struct btQuaternionFloatData& dataOut) const;
- SIMD_FORCE_INLINE void serializeDouble(struct btQuaternionDoubleData& dataOut) const;
+ SIMD_FORCE_INLINE void deSerializeFloat(const struct btQuaternionFloatData& dataIn);
- SIMD_FORCE_INLINE void deSerializeDouble(const struct btQuaternionDoubleData& 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)
+operator*(const btQuaternion& q1, const btQuaternion& q2)
{
-#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
+#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 = 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 = 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
+ 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
+ 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
- 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)
+#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];
+ 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);
+ 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);
+ 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);
+ 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
+ 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));
+ 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
+ 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
-
+ 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.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());
+ 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)
+#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 = 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 = 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
+ 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
- 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)
+
+#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;
+ float32x2_t vQ1wx, vQ2zx, vQ1yz, vQ2yz, vQ1zx, vQ2xz;
- tmp = vtrn_f32( vget_high_f32(vQ2), vget_low_f32(vQ2) ); // {z x}, {w y}
- vQ2zx = tmp.val[0];
+ vQ1wx = vext_f32(vget_high_f32(vQ1), vget_low_f32(vQ1), 1);
+ {
+ 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];
- vQ1yz = vext_f32(vget_low_f32(vQ1), vget_high_f32(vQ1), 1);
+ tmp = vtrn_f32(vget_high_f32(vQ1), vget_low_f32(vQ1)); // {z x}, {w y}
+ vQ1zx = tmp.val[0];
+ }
- vQ2yz = vext_f32(vget_low_f32(vQ2), vget_high_f32(vQ2), 1);
- vQ2xz = vext_f32(vQ2zx, vQ2zx, 1);
+ vQ1yz = vext_f32(vget_low_f32(vQ1), vget_high_f32(vQ1), 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
+ 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));
+ 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
+ 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
-
+ 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());
+ 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)
+#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 = 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;
+ A2 = bt_pshufd_ps(vQ1, BT_SHUFFLE(1, 2, 0, 1));
+ B2 = bt_pshufd_ps(vQ2, BT_SHUFFLE(2, 0, 1, 1));
- 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
+ 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
- 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)
+#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];
+ 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(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);
+ 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);
+ 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);
- vQ2yz = vext_f32(vget_low_f32(vQ2), vget_high_f32(vQ2), 1);
- vQ2xz = vext_f32(vQ2zx, vQ2zx, 1);
+ vQ1yz = vext_f32(vget_low_f32(vQ1), vget_high_f32(vQ1), 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
+ 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));
+ 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
+ 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
-
+ 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(),
+ 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());
+ -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);
+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();
+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);
+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)
+inverse(const btQuaternion& q)
{
return q.inverse();
}
@@ -928,115 +917,105 @@ inverse(const btQuaternion& q)
* @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)
+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)
+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)
+#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());
+ 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
+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);
+ 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
+ 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 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);
+ return btQuaternion(c.getX() * rs, c.getY() * rs, c.getZ() * rs, s * 0.5f);
}
-SIMD_FORCE_INLINE btQuaternion
-shortestArcQuatNormalize2(btVector3& v0,btVector3& v1)
+SIMD_FORCE_INLINE btQuaternion
+shortestArcQuatNormalize2(btVector3& v0, btVector3& v1)
{
v0.normalize();
v1.normalize();
- return shortestArcQuat(v0,v1);
+ return shortestArcQuat(v0, v1);
}
-
-
-
-struct btQuaternionFloatData
+struct btQuaternionFloatData
{
- float m_floats[4];
+ float m_floats[4];
};
-struct btQuaternionDoubleData
+struct btQuaternionDoubleData
{
- double m_floats[4];
-
+ double m_floats[4];
};
-SIMD_FORCE_INLINE void btQuaternion::serializeFloat(struct btQuaternionFloatData& dataOut) const
+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++)
+ 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)
+SIMD_FORCE_INLINE void btQuaternion::deSerializeFloat(const struct btQuaternionFloatData& dataIn)
{
- for (int i=0;i<4;i++)
+ 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
+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++)
+ 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)
+SIMD_FORCE_INLINE void btQuaternion::deSerializeDouble(const struct btQuaternionDoubleData& dataIn)
{
- for (int i=0;i<4;i++)
+ 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
+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++)
+ for (int i = 0; i < 4; i++)
dataOut.m_floats[i] = m_floats[i];
}
-SIMD_FORCE_INLINE void btQuaternion::deSerialize(const struct btQuaternionFloatData& dataIn)
+SIMD_FORCE_INLINE void btQuaternion::deSerialize(const struct btQuaternionFloatData& dataIn)
{
- for (int i = 0; i<4; i++)
+ 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)
+SIMD_FORCE_INLINE void btQuaternion::deSerialize(const struct btQuaternionDoubleData& dataIn)
{
- for (int i=0;i<4;i++)
+ for (int i = 0; i < 4; i++)
m_floats[i] = (btScalar)dataIn.m_floats[i];
}
-
-#endif //BT_SIMD__QUATERNION_H_
-
-
-
+#endif //BT_SIMD__QUATERNION_H_
diff --git a/thirdparty/bullet/LinearMath/btQuickprof.cpp b/thirdparty/bullet/LinearMath/btQuickprof.cpp
index 1572b96262..86fd1d7812 100644
--- a/thirdparty/bullet/LinearMath/btQuickprof.cpp
+++ b/thirdparty/bullet/LinearMath/btQuickprof.cpp
@@ -16,16 +16,13 @@
#include "btQuickprof.h"
#include "btThreads.h"
-
-
-
#ifdef __CELLOS_LV2__
#include <sys/sys_time.h>
#include <sys/time_util.h>
#include <stdio.h>
#endif
-#if defined (SUNOS) || defined (__SUNOS__)
+#if defined(SUNOS) || defined(__SUNOS__)
#include <stdio.h>
#endif
#ifdef __APPLE__
@@ -42,49 +39,46 @@
#define NOIME
#ifdef _XBOX
- #include <Xtl.h>
-#else //_XBOX
- #include <windows.h>
+#include <Xtl.h>
+#else //_XBOX
+#include <windows.h>
-#if WINVER <0x0602
+#if WINVER < 0x0602
#define GetTickCount64 GetTickCount
#endif
-#endif //_XBOX
+#endif //_XBOX
#include <time.h>
-
-#else //_WIN32
+#else //_WIN32
#include <sys/time.h>
#ifdef BT_LINUX_REALTIME
//required linking against rt (librt)
#include <time.h>
-#endif //BT_LINUX_REALTIME
+#endif //BT_LINUX_REALTIME
-#endif //_WIN32
+#endif //_WIN32
-#define mymin(a,b) (a > b ? a : b)
+#define mymin(a, b) (a > b ? a : b)
struct btClockData
{
-
#ifdef BT_USE_WINDOWS_TIMERS
LARGE_INTEGER mClockFrequency;
LONGLONG mStartTick;
LARGE_INTEGER mStartTime;
#else
#ifdef __CELLOS_LV2__
- uint64_t mStartTime;
+ uint64_t mStartTime;
#else
#ifdef __APPLE__
- uint64_t mStartTimeNano;
+ uint64_t mStartTimeNano;
#endif
struct timeval mStartTime;
#endif
-#endif //__CELLOS_LV2__
-
+#endif //__CELLOS_LV2__
};
///The btClock is a portable basic clock that measures accurate time in seconds, use for profiling.
@@ -114,8 +108,7 @@ btClock& btClock::operator=(const btClock& other)
return *this;
}
-
- /// Resets the initial reference time.
+/// Resets the initial reference time.
void btClock::reset()
{
#ifdef BT_USE_WINDOWS_TIMERS
@@ -124,14 +117,14 @@ void btClock::reset()
#else
#ifdef __CELLOS_LV2__
- typedef uint64_t ClockSize;
+ typedef uint64_t ClockSize;
ClockSize newTime;
//__asm __volatile__( "mftb %0" : "=r" (newTime) : : "memory");
- SYS_TIMEBASE_GET( newTime );
+ SYS_TIMEBASE_GET(newTime);
m_data->mStartTime = newTime;
#else
#ifdef __APPLE__
- m_data->mStartTimeNano = mach_absolute_time();
+ m_data->mStartTimeNano = mach_absolute_time();
#endif
gettimeofday(&m_data->mStartTime, 0);
#endif
@@ -146,66 +139,66 @@ unsigned long long int btClock::getTimeMilliseconds()
LARGE_INTEGER currentTime;
QueryPerformanceCounter(&currentTime);
LONGLONG elapsedTime = currentTime.QuadPart -
- m_data->mStartTime.QuadPart;
- // Compute the number of millisecond ticks elapsed.
+ m_data->mStartTime.QuadPart;
+ // Compute the number of millisecond ticks elapsed.
unsigned long msecTicks = (unsigned long)(1000 * elapsedTime /
- m_data->mClockFrequency.QuadPart);
+ m_data->mClockFrequency.QuadPart);
- return msecTicks;
+ return msecTicks;
#else
#ifdef __CELLOS_LV2__
- uint64_t freq=sys_time_get_timebase_frequency();
- double dFreq=((double) freq) / 1000.0;
- typedef uint64_t ClockSize;
- ClockSize newTime;
- SYS_TIMEBASE_GET( newTime );
- //__asm __volatile__( "mftb %0" : "=r" (newTime) : : "memory");
-
- return (unsigned long int)((double(newTime-m_data->mStartTime)) / dFreq);
+ uint64_t freq = sys_time_get_timebase_frequency();
+ double dFreq = ((double)freq) / 1000.0;
+ typedef uint64_t ClockSize;
+ ClockSize newTime;
+ SYS_TIMEBASE_GET(newTime);
+ //__asm __volatile__( "mftb %0" : "=r" (newTime) : : "memory");
+
+ return (unsigned long int)((double(newTime - m_data->mStartTime)) / dFreq);
#else
- struct timeval currentTime;
- gettimeofday(&currentTime, 0);
- return (currentTime.tv_sec - m_data->mStartTime.tv_sec) * 1000 +
- (currentTime.tv_usec - m_data->mStartTime.tv_usec) / 1000;
-#endif //__CELLOS_LV2__
+ struct timeval currentTime;
+ gettimeofday(&currentTime, 0);
+ return (currentTime.tv_sec - m_data->mStartTime.tv_sec) * 1000 +
+ (currentTime.tv_usec - m_data->mStartTime.tv_usec) / 1000;
+#endif //__CELLOS_LV2__
#endif
}
- /// Returns the time in us since the last call to reset or since
- /// the Clock was created.
+/// Returns the time in us since the last call to reset or since
+/// the Clock was created.
unsigned long long int btClock::getTimeMicroseconds()
{
#ifdef BT_USE_WINDOWS_TIMERS
- //see https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx
- LARGE_INTEGER currentTime, elapsedTime;
-
- QueryPerformanceCounter(&currentTime);
- elapsedTime.QuadPart = currentTime.QuadPart -
- m_data->mStartTime.QuadPart;
- elapsedTime.QuadPart *= 1000000;
- elapsedTime.QuadPart /= m_data->mClockFrequency.QuadPart;
-
- return (unsigned long long) elapsedTime.QuadPart;
+ //see https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx
+ LARGE_INTEGER currentTime, elapsedTime;
+
+ QueryPerformanceCounter(&currentTime);
+ elapsedTime.QuadPart = currentTime.QuadPart -
+ m_data->mStartTime.QuadPart;
+ elapsedTime.QuadPart *= 1000000;
+ elapsedTime.QuadPart /= m_data->mClockFrequency.QuadPart;
+
+ return (unsigned long long)elapsedTime.QuadPart;
#else
#ifdef __CELLOS_LV2__
- uint64_t freq=sys_time_get_timebase_frequency();
- double dFreq=((double) freq)/ 1000000.0;
- typedef uint64_t ClockSize;
- ClockSize newTime;
- //__asm __volatile__( "mftb %0" : "=r" (newTime) : : "memory");
- SYS_TIMEBASE_GET( newTime );
-
- return (unsigned long int)((double(newTime-m_data->mStartTime)) / dFreq);
+ uint64_t freq = sys_time_get_timebase_frequency();
+ double dFreq = ((double)freq) / 1000000.0;
+ typedef uint64_t ClockSize;
+ ClockSize newTime;
+ //__asm __volatile__( "mftb %0" : "=r" (newTime) : : "memory");
+ SYS_TIMEBASE_GET(newTime);
+
+ return (unsigned long int)((double(newTime - m_data->mStartTime)) / dFreq);
#else
- struct timeval currentTime;
- gettimeofday(&currentTime, 0);
- return (currentTime.tv_sec - m_data->mStartTime.tv_sec) * 1000000 +
- (currentTime.tv_usec - m_data->mStartTime.tv_usec);
-#endif//__CELLOS_LV2__
+ struct timeval currentTime;
+ gettimeofday(&currentTime, 0);
+ return (currentTime.tv_sec - m_data->mStartTime.tv_sec) * 1000000 +
+ (currentTime.tv_usec - m_data->mStartTime.tv_usec);
+#endif //__CELLOS_LV2__
#endif
}
@@ -213,65 +206,63 @@ unsigned long long int btClock::getTimeNanoseconds()
{
#ifdef BT_USE_WINDOWS_TIMERS
//see https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx
- LARGE_INTEGER currentTime, elapsedTime;
-
- QueryPerformanceCounter(&currentTime);
- elapsedTime.QuadPart = currentTime.QuadPart -
- m_data->mStartTime.QuadPart;
- elapsedTime.QuadPart *= 1000000000;
- elapsedTime.QuadPart /= m_data->mClockFrequency.QuadPart;
-
- return (unsigned long long) elapsedTime.QuadPart;
+ LARGE_INTEGER currentTime, elapsedTime;
+
+ QueryPerformanceCounter(&currentTime);
+ elapsedTime.QuadPart = currentTime.QuadPart -
+ m_data->mStartTime.QuadPart;
+ elapsedTime.QuadPart *= 1000000000;
+ elapsedTime.QuadPart /= m_data->mClockFrequency.QuadPart;
+
+ return (unsigned long long)elapsedTime.QuadPart;
#else
#ifdef __CELLOS_LV2__
- uint64_t freq=sys_time_get_timebase_frequency();
- double dFreq=((double) freq)/ 1e9;
- typedef uint64_t ClockSize;
- ClockSize newTime;
- //__asm __volatile__( "mftb %0" : "=r" (newTime) : : "memory");
- SYS_TIMEBASE_GET( newTime );
-
- return (unsigned long int)((double(newTime-m_data->mStartTime)) / dFreq);
+ uint64_t freq = sys_time_get_timebase_frequency();
+ double dFreq = ((double)freq) / 1e9;
+ typedef uint64_t ClockSize;
+ ClockSize newTime;
+ //__asm __volatile__( "mftb %0" : "=r" (newTime) : : "memory");
+ SYS_TIMEBASE_GET(newTime);
+
+ return (unsigned long int)((double(newTime - m_data->mStartTime)) / dFreq);
#else
#ifdef __APPLE__
- uint64_t ticks = mach_absolute_time() - m_data->mStartTimeNano;
- static long double conversion = 0.0L;
- if( 0.0L == conversion )
- {
- // attempt to get conversion to nanoseconds
- mach_timebase_info_data_t info;
- int err = mach_timebase_info( &info );
- if( err )
- {
- btAssert(0);
- conversion = 1.;
- }
- conversion = info.numer / info.denom;
- }
- return (ticks * conversion);
-
-
-#else//__APPLE__
-
+ uint64_t ticks = mach_absolute_time() - m_data->mStartTimeNano;
+ static long double conversion = 0.0L;
+ if (0.0L == conversion)
+ {
+ // attempt to get conversion to nanoseconds
+ mach_timebase_info_data_t info;
+ int err = mach_timebase_info(&info);
+ if (err)
+ {
+ btAssert(0);
+ conversion = 1.;
+ }
+ conversion = info.numer / info.denom;
+ }
+ return (ticks * conversion);
+
+#else //__APPLE__
+
#ifdef BT_LINUX_REALTIME
- timespec ts;
- clock_gettime(CLOCK_REALTIME,&ts);
- return 1000000000*ts.tv_sec + ts.tv_nsec;
+ timespec ts;
+ clock_gettime(CLOCK_REALTIME, &ts);
+ return 1000000000 * ts.tv_sec + ts.tv_nsec;
#else
- struct timeval currentTime;
- gettimeofday(&currentTime, 0);
- return (currentTime.tv_sec - m_data->mStartTime.tv_sec) * 1e9 +
- (currentTime.tv_usec - m_data->mStartTime.tv_usec)*1000;
-#endif //BT_LINUX_REALTIME
-
-#endif//__APPLE__
-#endif//__CELLOS_LV2__
-#endif
+ struct timeval currentTime;
+ gettimeofday(&currentTime, 0);
+ return (currentTime.tv_sec - m_data->mStartTime.tv_sec) * 1e9 +
+ (currentTime.tv_usec - m_data->mStartTime.tv_usec) * 1000;
+#endif //BT_LINUX_REALTIME
+
+#endif //__APPLE__
+#endif //__CELLOS_LV2__
+#endif
}
-
-/// Returns the time in s since the last call to reset or since
+/// Returns the time in s since the last call to reset or since
/// the Clock was created.
btScalar btClock::getTimeSeconds()
{
@@ -281,23 +272,19 @@ btScalar btClock::getTimeSeconds()
#ifndef BT_NO_PROFILE
-
static btClock gProfileClock;
-
-inline void Profile_Get_Ticks(unsigned long int * ticks)
+inline void Profile_Get_Ticks(unsigned long int* ticks)
{
*ticks = (unsigned long int)gProfileClock.getTimeMicroseconds();
}
inline float Profile_Get_Tick_Rate(void)
{
-// return 1000000.f;
+ // return 1000000.f;
return 1000.f;
-
}
-
/***************************************************************************************************
**
** CProfileNode
@@ -313,35 +300,32 @@ inline float Profile_Get_Tick_Rate(void)
* The name is assumed to be a static pointer, only the pointer is stored and compared for *
* efficiency reasons. *
*=============================================================================================*/
-CProfileNode::CProfileNode( const char * name, CProfileNode * parent ) :
- Name( name ),
- TotalCalls( 0 ),
- TotalTime( 0 ),
- StartTime( 0 ),
- RecursionCounter( 0 ),
- Parent( parent ),
- Child( NULL ),
- Sibling( NULL ),
- m_userPtr(0)
+CProfileNode::CProfileNode(const char* name, CProfileNode* parent) : Name(name),
+ TotalCalls(0),
+ TotalTime(0),
+ StartTime(0),
+ RecursionCounter(0),
+ Parent(parent),
+ Child(NULL),
+ Sibling(NULL),
+ m_userPtr(0)
{
Reset();
}
-
-void CProfileNode::CleanupMemory()
+void CProfileNode::CleanupMemory()
{
- delete ( Child);
+ delete (Child);
Child = NULL;
- delete ( Sibling);
+ delete (Sibling);
Sibling = NULL;
}
-CProfileNode::~CProfileNode( void )
+CProfileNode::~CProfileNode(void)
{
CleanupMemory();
}
-
/***********************************************************************************************
* INPUT: *
* name - static string pointer to the name of the node we are searching for *
@@ -350,12 +334,14 @@ CProfileNode::~CProfileNode( void )
* All profile names are assumed to be static strings so this function uses pointer compares *
* to find the named node. *
*=============================================================================================*/
-CProfileNode * CProfileNode::Get_Sub_Node( const char * name )
+CProfileNode* CProfileNode::Get_Sub_Node(const char* name)
{
// Try to find this sub node
- CProfileNode * child = Child;
- while ( child ) {
- if ( child->Name == name ) {
+ CProfileNode* child = Child;
+ while (child)
+ {
+ if (child->Name == name)
+ {
return child;
}
child = child->Sibling;
@@ -363,176 +349,212 @@ CProfileNode * CProfileNode::Get_Sub_Node( const char * name )
// We didn't find it, so add it
- CProfileNode * node = new CProfileNode( name, this );
+ CProfileNode* node = new CProfileNode(name, this);
node->Sibling = Child;
Child = node;
return node;
}
-
-void CProfileNode::Reset( void )
+void CProfileNode::Reset(void)
{
TotalCalls = 0;
TotalTime = 0.0f;
-
- if ( Child ) {
+ if (Child)
+ {
Child->Reset();
}
- if ( Sibling ) {
+ if (Sibling)
+ {
Sibling->Reset();
}
}
-
-void CProfileNode::Call( void )
+void CProfileNode::Call(void)
{
TotalCalls++;
- if (RecursionCounter++ == 0) {
+ if (RecursionCounter++ == 0)
+ {
Profile_Get_Ticks(&StartTime);
}
}
-
-bool CProfileNode::Return( void )
+bool CProfileNode::Return(void)
{
- if ( --RecursionCounter == 0 && TotalCalls != 0 ) {
+ if (--RecursionCounter == 0 && TotalCalls != 0)
+ {
unsigned long int time;
Profile_Get_Ticks(&time);
- time-=StartTime;
+ time -= StartTime;
TotalTime += (float)time / Profile_Get_Tick_Rate();
}
- return ( RecursionCounter == 0 );
+ return (RecursionCounter == 0);
}
-
/***************************************************************************************************
**
** CProfileIterator
**
***************************************************************************************************/
-CProfileIterator::CProfileIterator( CProfileNode * start )
+CProfileIterator::CProfileIterator(CProfileNode* start)
{
CurrentParent = start;
CurrentChild = CurrentParent->Get_Child();
}
-
-void CProfileIterator::First(void)
+void CProfileIterator::First(void)
{
CurrentChild = CurrentParent->Get_Child();
}
-
-void CProfileIterator::Next(void)
+void CProfileIterator::Next(void)
{
CurrentChild = CurrentChild->Get_Sibling();
}
-
-bool CProfileIterator::Is_Done(void)
+bool CProfileIterator::Is_Done(void)
{
return CurrentChild == NULL;
}
-
-void CProfileIterator::Enter_Child( int index )
+void CProfileIterator::Enter_Child(int index)
{
CurrentChild = CurrentParent->Get_Child();
- while ( (CurrentChild != NULL) && (index != 0) ) {
+ while ((CurrentChild != NULL) && (index != 0))
+ {
index--;
CurrentChild = CurrentChild->Get_Sibling();
}
- if ( CurrentChild != NULL ) {
+ if (CurrentChild != NULL)
+ {
CurrentParent = CurrentChild;
CurrentChild = CurrentParent->Get_Child();
}
}
-
-void CProfileIterator::Enter_Parent( void )
+void CProfileIterator::Enter_Parent(void)
{
- if ( CurrentParent->Get_Parent() != NULL ) {
+ if (CurrentParent->Get_Parent() != NULL)
+ {
CurrentParent = CurrentParent->Get_Parent();
}
CurrentChild = CurrentParent->Get_Child();
}
-
/***************************************************************************************************
**
** CProfileManager
**
***************************************************************************************************/
-
-
-
-CProfileNode gRoots[BT_QUICKPROF_MAX_THREAD_COUNT]={
- CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),
- CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),
- CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),
- CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),
- CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),
- CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),
- CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),
- CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),
- CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),
- CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),
- CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),
- CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),
- CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),
- CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),
- CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),
- CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL),CProfileNode("Root",NULL)
-};
-
-
-CProfileNode* gCurrentNodes[BT_QUICKPROF_MAX_THREAD_COUNT]=
-{
- &gRoots[ 0], &gRoots[ 1], &gRoots[ 2], &gRoots[ 3],
- &gRoots[ 4], &gRoots[ 5], &gRoots[ 6], &gRoots[ 7],
- &gRoots[ 8], &gRoots[ 9], &gRoots[10], &gRoots[11],
- &gRoots[12], &gRoots[13], &gRoots[14], &gRoots[15],
- &gRoots[16], &gRoots[17], &gRoots[18], &gRoots[19],
- &gRoots[20], &gRoots[21], &gRoots[22], &gRoots[23],
- &gRoots[24], &gRoots[25], &gRoots[26], &gRoots[27],
- &gRoots[28], &gRoots[29], &gRoots[30], &gRoots[31],
- &gRoots[32], &gRoots[33], &gRoots[34], &gRoots[35],
- &gRoots[36], &gRoots[37], &gRoots[38], &gRoots[39],
- &gRoots[40], &gRoots[41], &gRoots[42], &gRoots[43],
- &gRoots[44], &gRoots[45], &gRoots[46], &gRoots[47],
- &gRoots[48], &gRoots[49], &gRoots[50], &gRoots[51],
- &gRoots[52], &gRoots[53], &gRoots[54], &gRoots[55],
- &gRoots[56], &gRoots[57], &gRoots[58], &gRoots[59],
- &gRoots[60], &gRoots[61], &gRoots[62], &gRoots[63],
+CProfileNode gRoots[BT_QUICKPROF_MAX_THREAD_COUNT] = {
+ CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL),
+ CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL),
+ CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL),
+ CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL),
+ CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL),
+ CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL),
+ CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL),
+ CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL),
+ CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL),
+ CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL),
+ CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL),
+ CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL),
+ CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL),
+ CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL),
+ CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL),
+ CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL), CProfileNode("Root", NULL)};
+
+CProfileNode* gCurrentNodes[BT_QUICKPROF_MAX_THREAD_COUNT] =
+ {
+ &gRoots[0],
+ &gRoots[1],
+ &gRoots[2],
+ &gRoots[3],
+ &gRoots[4],
+ &gRoots[5],
+ &gRoots[6],
+ &gRoots[7],
+ &gRoots[8],
+ &gRoots[9],
+ &gRoots[10],
+ &gRoots[11],
+ &gRoots[12],
+ &gRoots[13],
+ &gRoots[14],
+ &gRoots[15],
+ &gRoots[16],
+ &gRoots[17],
+ &gRoots[18],
+ &gRoots[19],
+ &gRoots[20],
+ &gRoots[21],
+ &gRoots[22],
+ &gRoots[23],
+ &gRoots[24],
+ &gRoots[25],
+ &gRoots[26],
+ &gRoots[27],
+ &gRoots[28],
+ &gRoots[29],
+ &gRoots[30],
+ &gRoots[31],
+ &gRoots[32],
+ &gRoots[33],
+ &gRoots[34],
+ &gRoots[35],
+ &gRoots[36],
+ &gRoots[37],
+ &gRoots[38],
+ &gRoots[39],
+ &gRoots[40],
+ &gRoots[41],
+ &gRoots[42],
+ &gRoots[43],
+ &gRoots[44],
+ &gRoots[45],
+ &gRoots[46],
+ &gRoots[47],
+ &gRoots[48],
+ &gRoots[49],
+ &gRoots[50],
+ &gRoots[51],
+ &gRoots[52],
+ &gRoots[53],
+ &gRoots[54],
+ &gRoots[55],
+ &gRoots[56],
+ &gRoots[57],
+ &gRoots[58],
+ &gRoots[59],
+ &gRoots[60],
+ &gRoots[61],
+ &gRoots[62],
+ &gRoots[63],
};
+int CProfileManager::FrameCounter = 0;
+unsigned long int CProfileManager::ResetTime = 0;
-int CProfileManager::FrameCounter = 0;
-unsigned long int CProfileManager::ResetTime = 0;
-
-CProfileIterator * CProfileManager::Get_Iterator( void )
-{
-
- int threadIndex = btQuickprofGetCurrentThreadIndex2();
- if ((threadIndex<0) || threadIndex >= BT_QUICKPROF_MAX_THREAD_COUNT)
- return 0;
+CProfileIterator* CProfileManager::Get_Iterator(void)
+{
+ int threadIndex = btQuickprofGetCurrentThreadIndex2();
+ if ((threadIndex < 0) || threadIndex >= BT_QUICKPROF_MAX_THREAD_COUNT)
+ return 0;
- return new CProfileIterator( &gRoots[threadIndex]);
+ return new CProfileIterator(&gRoots[threadIndex]);
}
-void CProfileManager::CleanupMemory(void)
+void CProfileManager::CleanupMemory(void)
{
- for (int i=0;i<BT_QUICKPROF_MAX_THREAD_COUNT;i++)
+ for (int i = 0; i < BT_QUICKPROF_MAX_THREAD_COUNT; i++)
{
gRoots[i].CleanupMemory();
}
}
-
/***********************************************************************************************
* CProfileManager::Start_Profile -- Begin a named profile *
* *
@@ -546,51 +568,47 @@ void CProfileManager::CleanupMemory(void)
* The string used is assumed to be a static string; pointer compares are used throughout *
* the profiling code for efficiency. *
*=============================================================================================*/
-void CProfileManager::Start_Profile( const char * name )
+void CProfileManager::Start_Profile(const char* name)
{
int threadIndex = btQuickprofGetCurrentThreadIndex2();
- if ((threadIndex<0) || threadIndex >= BT_QUICKPROF_MAX_THREAD_COUNT)
+ if ((threadIndex < 0) || threadIndex >= BT_QUICKPROF_MAX_THREAD_COUNT)
return;
- if (name != gCurrentNodes[threadIndex]->Get_Name()) {
- gCurrentNodes[threadIndex] = gCurrentNodes[threadIndex]->Get_Sub_Node( name );
+ if (name != gCurrentNodes[threadIndex]->Get_Name())
+ {
+ gCurrentNodes[threadIndex] = gCurrentNodes[threadIndex]->Get_Sub_Node(name);
}
gCurrentNodes[threadIndex]->Call();
}
-
/***********************************************************************************************
* CProfileManager::Stop_Profile -- Stop timing and record the results. *
*=============================================================================================*/
-void CProfileManager::Stop_Profile( void )
+void CProfileManager::Stop_Profile(void)
{
int threadIndex = btQuickprofGetCurrentThreadIndex2();
- if ((threadIndex<0) || threadIndex >= BT_QUICKPROF_MAX_THREAD_COUNT)
+ if ((threadIndex < 0) || threadIndex >= BT_QUICKPROF_MAX_THREAD_COUNT)
return;
// Return will indicate whether we should back up to our parent (we may
// be profiling a recursive function)
- if (gCurrentNodes[threadIndex]->Return()) {
+ if (gCurrentNodes[threadIndex]->Return())
+ {
gCurrentNodes[threadIndex] = gCurrentNodes[threadIndex]->Get_Parent();
}
}
-
-
-
-
-
/***********************************************************************************************
* CProfileManager::Reset -- Reset the contents of the profiling system *
* *
* This resets everything except for the tree structure. All of the timing data is reset. *
*=============================================================================================*/
-void CProfileManager::Reset( void )
+void CProfileManager::Reset(void)
{
gProfileClock.reset();
int threadIndex = btQuickprofGetCurrentThreadIndex2();
- if ((threadIndex<0) || threadIndex >= BT_QUICKPROF_MAX_THREAD_COUNT)
+ if ((threadIndex < 0) || threadIndex >= BT_QUICKPROF_MAX_THREAD_COUNT)
return;
gRoots[threadIndex].Reset();
gRoots[threadIndex].Call();
@@ -598,20 +616,18 @@ void CProfileManager::Reset( void )
Profile_Get_Ticks(&ResetTime);
}
-
/***********************************************************************************************
* CProfileManager::Increment_Frame_Counter -- Increment the frame counter *
*=============================================================================================*/
-void CProfileManager::Increment_Frame_Counter( void )
+void CProfileManager::Increment_Frame_Counter(void)
{
FrameCounter++;
}
-
/***********************************************************************************************
* CProfileManager::Get_Time_Since_Reset -- returns the elapsed time since last reset *
*=============================================================================================*/
-float CProfileManager::Get_Time_Since_Reset( void )
+float CProfileManager::Get_Time_Since_Reset(void)
{
unsigned long int time;
Profile_Get_Ticks(&time);
@@ -621,34 +637,34 @@ float CProfileManager::Get_Time_Since_Reset( void )
#include <stdio.h>
-void CProfileManager::dumpRecursive(CProfileIterator* profileIterator, int spacing)
+void CProfileManager::dumpRecursive(CProfileIterator* profileIterator, int spacing)
{
profileIterator->First();
if (profileIterator->Is_Done())
return;
- float accumulated_time=0,parent_time = profileIterator->Is_Root() ? CProfileManager::Get_Time_Since_Reset() : profileIterator->Get_Current_Parent_Total_Time();
+ float accumulated_time = 0, parent_time = profileIterator->Is_Root() ? CProfileManager::Get_Time_Since_Reset() : profileIterator->Get_Current_Parent_Total_Time();
int i;
int frames_since_reset = CProfileManager::Get_Frame_Count_Since_Reset();
- for (i=0;i<spacing;i++) printf(".");
+ for (i = 0; i < spacing; i++) printf(".");
printf("----------------------------------\n");
- for (i=0;i<spacing;i++) printf(".");
- printf("Profiling: %s (total running time: %.3f ms) ---\n", profileIterator->Get_Current_Parent_Name(), parent_time );
+ for (i = 0; i < spacing; i++) printf(".");
+ printf("Profiling: %s (total running time: %.3f ms) ---\n", profileIterator->Get_Current_Parent_Name(), parent_time);
float totalTime = 0.f;
-
int numChildren = 0;
- for (i = 0; !profileIterator->Is_Done(); i++,profileIterator->Next())
+ for (i = 0; !profileIterator->Is_Done(); i++, profileIterator->Next())
{
numChildren++;
float current_total_time = profileIterator->Get_Current_Total_Time();
accumulated_time += current_total_time;
float fraction = parent_time > SIMD_EPSILON ? (current_total_time / parent_time) * 100 : 0.f;
{
- int i; for (i=0;i<spacing;i++) printf(".");
+ int i;
+ for (i = 0; i < spacing; i++) printf(".");
}
- printf("%d -- %s (%.2f %%) :: %.3f ms / frame (%d calls)\n",i, profileIterator->Get_Current_Name(), fraction,(current_total_time / (double)frames_since_reset),profileIterator->Get_Current_Total_Calls());
+ printf("%d -- %s (%.2f %%) :: %.3f ms / frame (%d calls)\n", i, profileIterator->Get_Current_Name(), fraction, (current_total_time / (double)frames_since_reset), profileIterator->Get_Current_Total_Calls());
totalTime += current_total_time;
//recurse into children
}
@@ -657,29 +673,45 @@ void CProfileManager::dumpRecursive(CProfileIterator* profileIterator, int spaci
{
//printf("what's wrong\n");
}
- for (i=0;i<spacing;i++) printf(".");
- printf("%s (%.3f %%) :: %.3f ms\n", "Unaccounted:",parent_time > SIMD_EPSILON ? ((parent_time - accumulated_time) / parent_time) * 100 : 0.f, parent_time - accumulated_time);
+ for (i = 0; i < spacing; i++) printf(".");
+ printf("%s (%.3f %%) :: %.3f ms\n", "Unaccounted:", parent_time > SIMD_EPSILON ? ((parent_time - accumulated_time) / parent_time) * 100 : 0.f, parent_time - accumulated_time);
- for (i=0;i<numChildren;i++)
+ for (i = 0; i < numChildren; i++)
{
profileIterator->Enter_Child(i);
- dumpRecursive(profileIterator,spacing+3);
+ dumpRecursive(profileIterator, spacing + 3);
profileIterator->Enter_Parent();
}
}
-
-
-void CProfileManager::dumpAll()
+void CProfileManager::dumpAll()
{
CProfileIterator* profileIterator = 0;
profileIterator = CProfileManager::Get_Iterator();
- dumpRecursive(profileIterator,0);
+ dumpRecursive(profileIterator, 0);
CProfileManager::Release_Iterator(profileIterator);
}
+
+void btEnterProfileZoneDefault(const char* name)
+{
+}
+void btLeaveProfileZoneDefault()
+{
+}
+
+#else
+void btEnterProfileZoneDefault(const char* name)
+{
+}
+void btLeaveProfileZoneDefault()
+{
+}
+#endif //BT_NO_PROFILE
+
+
// clang-format off
#if defined(_WIN32) && (defined(__MINGW32__) || defined(__MINGW64__))
#define BT_HAVE_TLS 1
@@ -703,50 +735,31 @@ void CProfileManager::dumpAll()
#endif // defined(__ANDROID__) && defined(__clang__)
// clang-format on
-unsigned int btQuickprofGetCurrentThreadIndex2() {
- const unsigned int kNullIndex = ~0U;
+unsigned int btQuickprofGetCurrentThreadIndex2()
+{
+ const unsigned int kNullIndex = ~0U;
#if BT_THREADSAFE
- return btGetCurrentThreadIndex();
+ return btGetCurrentThreadIndex();
#else
#if defined(BT_HAVE_TLS)
- static __thread unsigned int sThreadIndex = kNullIndex;
+ static __thread unsigned int sThreadIndex = kNullIndex;
#elif defined(_WIN32)
- __declspec(thread) static unsigned int sThreadIndex = kNullIndex;
+ __declspec(thread) static unsigned int sThreadIndex = kNullIndex;
#else
- unsigned int sThreadIndex = 0;
- return -1;
+ unsigned int sThreadIndex = 0;
+ return -1;
#endif
- static int gThreadCounter = 0;
-
- if (sThreadIndex == kNullIndex) {
- sThreadIndex = gThreadCounter++;
- }
- return sThreadIndex;
-#endif //BT_THREADSAFE
-}
-
-void btEnterProfileZoneDefault(const char* name)
-{
-}
-void btLeaveProfileZoneDefault()
-{
-}
-
+ static int gThreadCounter = 0;
-#else
-void btEnterProfileZoneDefault(const char* name)
-{
-}
-void btLeaveProfileZoneDefault()
-{
+ if (sThreadIndex == kNullIndex)
+ {
+ sThreadIndex = gThreadCounter++;
+ }
+ return sThreadIndex;
+#endif //BT_THREADSAFE
}
-#endif //BT_NO_PROFILE
-
-
-
-
static btEnterProfileZoneFunc* bts_enterFunc = btEnterProfileZoneDefault;
static btLeaveProfileZoneFunc* bts_leaveFunc = btLeaveProfileZoneDefault;
@@ -762,14 +775,13 @@ void btLeaveProfileZone()
btEnterProfileZoneFunc* btGetCurrentEnterProfileZoneFunc()
{
- return bts_enterFunc ;
+ return bts_enterFunc;
}
btLeaveProfileZoneFunc* btGetCurrentLeaveProfileZoneFunc()
{
return bts_leaveFunc;
}
-
void btSetCustomEnterProfileZoneFunc(btEnterProfileZoneFunc* enterFunc)
{
bts_enterFunc = enterFunc;
@@ -779,13 +791,12 @@ void btSetCustomLeaveProfileZoneFunc(btLeaveProfileZoneFunc* leaveFunc)
bts_leaveFunc = leaveFunc;
}
-CProfileSample::CProfileSample( const char * name )
-{
+CProfileSample::CProfileSample(const char* name)
+{
btEnterProfileZone(name);
}
-CProfileSample::~CProfileSample( void )
-{
+CProfileSample::~CProfileSample(void)
+{
btLeaveProfileZone();
}
-
diff --git a/thirdparty/bullet/LinearMath/btQuickprof.h b/thirdparty/bullet/LinearMath/btQuickprof.h
index 98a2675771..990d401d50 100644
--- a/thirdparty/bullet/LinearMath/btQuickprof.h
+++ b/thirdparty/bullet/LinearMath/btQuickprof.h
@@ -7,11 +7,9 @@
**
***************************************************************************************************/
-// Credits: The Clock class was inspired by the Timer classes in
+// 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
@@ -34,97 +32,88 @@ public:
/// Resets the initial reference time.
void reset();
- /// Returns the time in ms since the last call to reset or since
+ /// 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
+ /// 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
+ /// 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
+#endif //USE_BT_CLOCK
-typedef void (btEnterProfileZoneFunc)(const char* msg);
-typedef void (btLeaveProfileZoneFunc)();
+typedef void(btEnterProfileZoneFunc)(const char* msg);
+typedef void(btLeaveProfileZoneFunc)();
btEnterProfileZoneFunc* btGetCurrentEnterProfileZoneFunc();
btLeaveProfileZoneFunc* btGetCurrentLeaveProfileZoneFunc();
-
-
void btSetCustomEnterProfileZoneFunc(btEnterProfileZoneFunc* enterFunc);
void btSetCustomLeaveProfileZoneFunc(btLeaveProfileZoneFunc* leaveFunc);
-#ifndef BT_NO_PROFILE // FIX redefinition
-//To disable built-in profiling, please comment out next line
-//#define BT_NO_PROFILE 1
-#endif //BT_NO_PROFILE
+#ifndef BT_ENABLE_PROFILE
+#define BT_NO_PROFILE 1
+#endif //BT_NO_PROFILE
const unsigned int BT_QUICKPROF_MAX_THREAD_COUNT = 64;
-#ifndef BT_NO_PROFILE
-//btQuickprofGetCurrentThreadIndex will return -1 if thread index cannot be determined,
+//btQuickprofGetCurrentThreadIndex will return -1 if thread index cannot be determined,
//otherwise returns thread index in range [0..maxThreads]
unsigned int btQuickprofGetCurrentThreadIndex2();
-#include <stdio.h>//@todo remove this, backwards compatibility
-
-#include "btAlignedAllocator.h"
-#include <new>
-
-
-
-
-
+#ifndef BT_NO_PROFILE
+#include <stdio.h> //@todo remove this, backwards compatibility
+#include "btAlignedAllocator.h"
+#include <new>
///A node in the Profile Hierarchy Tree
-class CProfileNode {
-
+class CProfileNode
+{
public:
- CProfileNode( const char * name, CProfileNode * parent );
- ~CProfileNode( void );
+ CProfileNode(const char* name, CProfileNode* parent);
+ ~CProfileNode(void);
- CProfileNode * Get_Sub_Node( const char * name );
+ 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; }
+ 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 );
+ 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* 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; }
- const char * Name;
- int TotalCalls;
- float TotalTime;
- unsigned long int StartTime;
- int RecursionCounter;
-
- CProfileNode * Parent;
- CProfileNode * Child;
- CProfileNode * Sibling;
- void* m_userPtr;
+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
@@ -132,91 +121,80 @@ 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 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
+ 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(); }
+ 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);}
+ 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(); }
-
-
+ 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;
- CProfileNode * CurrentParent;
- CProfileNode * CurrentChild;
-
-
- CProfileIterator( CProfileNode * start );
- friend class CProfileManager;
+ CProfileIterator(CProfileNode* start);
+ friend class CProfileManager;
};
-
///The Manager for the Profile system
-class CProfileManager {
+class CProfileManager
+{
public:
- static void Start_Profile( const char * name );
- static void Stop_Profile( void );
+ static void Start_Profile(const char* name);
+ static void Stop_Profile(void);
- static void CleanupMemory(void);
-// {
-// Root.CleanupMemory();
-// }
+ 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 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 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 dumpRecursive(CProfileIterator* profileIterator, int spacing);
- static void dumpAll();
+ static void dumpAll();
private:
-
- static int FrameCounter;
- static unsigned long int ResetTime;
+ static int FrameCounter;
+ static unsigned long int ResetTime;
};
-
-
-
-#endif //#ifndef BT_NO_PROFILE
+#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 {
+class CProfileSample
+{
public:
- CProfileSample( const char * name );
+ CProfileSample(const char* name);
- ~CProfileSample( void );
+ ~CProfileSample(void);
};
-#define BT_PROFILE( name ) CProfileSample __profile( name )
-
-
-
-#endif //BT_QUICK_PROF_H
-
+#define BT_PROFILE(name) CProfileSample __profile(name)
+#endif //BT_QUICK_PROF_H
diff --git a/thirdparty/bullet/LinearMath/btRandom.h b/thirdparty/bullet/LinearMath/btRandom.h
index 4cbfc6bfe9..e659af8605 100644
--- a/thirdparty/bullet/LinearMath/btRandom.h
+++ b/thirdparty/bullet/LinearMath/btRandom.h
@@ -12,8 +12,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
-
#ifndef BT_GEN_RANDOM_H
#define BT_GEN_RANDOM_H
@@ -24,8 +22,8 @@ subject to the following restrictions:
#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(); }
+SIMD_FORCE_INLINE void GEN_srand(unsigned int seed) { init_genrand(seed); }
+SIMD_FORCE_INLINE unsigned int GEN_rand() { return genrand_int32(); }
#else
@@ -33,10 +31,9 @@ SIMD_FORCE_INLINE unsigned int GEN_rand() { return genrand_int
#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(); }
+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
-
+#endif //BT_GEN_RANDOM_H
diff --git a/thirdparty/bullet/LinearMath/btScalar.h b/thirdparty/bullet/LinearMath/btScalar.h
index 24e8454c1f..c198bd4b35 100644
--- a/thirdparty/bullet/LinearMath/btScalar.h
+++ b/thirdparty/bullet/LinearMath/btScalar.h
@@ -32,7 +32,6 @@ inline int btGetVersion()
return BT_BULLET_VERSION;
}
-
// The following macro "BT_NOT_EMPTY_FILE" can be put into a file
// in order suppress the MS Visual C++ Linker warning 4221
//
@@ -44,16 +43,19 @@ inline int btGetVersion()
//
// 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__); }
+#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
+#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)
diff --git a/thirdparty/bullet/LinearMath/btSerializer.cpp b/thirdparty/bullet/LinearMath/btSerializer.cpp
index 4faa8f536b..18683c8fa7 100644
--- a/thirdparty/bullet/LinearMath/btSerializer.cpp
+++ b/thirdparty/bullet/LinearMath/btSerializer.cpp
@@ -1,3 +1,4 @@
+// clang-format off
char sBulletDNAstr[]= {
char(83),char(68),char(78),char(65),char(78),char(65),char(77),char(69),char(-76),char(1),char(0),char(0),char(109),char(95),char(115),char(105),char(122),char(101),char(0),char(109),
char(95),char(99),char(97),char(112),char(97),char(99),char(105),char(116),char(121),char(0),char(42),char(109),char(95),char(100),char(97),char(116),char(97),char(0),char(109),char(95),
@@ -687,3 +688,5 @@ char(97),char(0),char(4),char(0),char(50),char(0),char(-79),char(1),char(96),cha
char(98),char(0),char(4),char(0),char(48),char(0),char(-79),char(1),char(95),char(0),char(-78),char(1),char(4),char(0),char(-77),char(1),char(0),char(0),char(37),char(0),
};
int sBulletDNAlen= sizeof(sBulletDNAstr);
+
+// clang-format on
diff --git a/thirdparty/bullet/LinearMath/btSerializer.h b/thirdparty/bullet/LinearMath/btSerializer.h
index 39be3f810e..ba34441615 100644
--- a/thirdparty/bullet/LinearMath/btSerializer.h
+++ b/thirdparty/bullet/LinearMath/btSerializer.h
@@ -16,49 +16,45 @@ subject to the following restrictions:
#ifndef BT_SERIALIZER_H
#define BT_SERIALIZER_H
-#include "btScalar.h" // has definitions like SIMD_FORCE_INLINE
+#include "btScalar.h" // has definitions like SIMD_FORCE_INLINE
#include "btHashMap.h"
-#if !defined( __CELLOS_LV2__) && !defined(__MWERKS__)
+#if !defined(__CELLOS_LV2__) && !defined(__MWERKS__)
#include <memory.h>
#endif
#include <string.h>
-
-
-
extern char sBulletDNAstr[];
extern int sBulletDNAlen;
extern char sBulletDNAstr64[];
extern int sBulletDNAlen64;
-SIMD_FORCE_INLINE int btStrLen(const char* str)
+SIMD_FORCE_INLINE int btStrLen(const char* str)
{
- if (!str)
- return(0);
+ if (!str)
+ return (0);
int len = 0;
while (*str != 0)
{
- str++;
- len++;
- }
+ str++;
+ len++;
+ }
- return len;
+ return len;
}
-
class btChunk
{
public:
- int m_chunkCode;
- int m_length;
- void *m_oldPtr;
- int m_dna_nr;
- int m_number;
+ int m_chunkCode;
+ int m_length;
+ void* m_oldPtr;
+ int m_dna_nr;
+ int m_number;
};
-enum btSerializationFlags
+enum btSerializationFlags
{
BT_SERIALIZE_NO_BVH = 1,
BT_SERIALIZE_NO_TRIANGLEINFOMAP = 2,
@@ -66,78 +62,71 @@ enum btSerializationFlags
BT_SERIALIZE_CONTACT_MANIFOLDS = 8,
};
-class btSerializer
+class btSerializer
{
-
public:
-
virtual ~btSerializer() {}
- virtual const unsigned char* getBufferPointer() const = 0;
+ virtual const unsigned char* getBufferPointer() const = 0;
- virtual int getCurrentBufferSize() const = 0;
+ virtual int getCurrentBufferSize() const = 0;
- virtual btChunk* allocate(size_t size, int numElements) = 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 finalizeChunk(btChunk* chunk, const char* structType, int chunkCode, void* oldPtr) = 0;
- virtual void* findPointer(void* oldPtr) = 0;
+ virtual void* findPointer(void* oldPtr) = 0;
- virtual void* getUniquePointer(void*oldPtr) = 0;
+ virtual void* getUniquePointer(void* oldPtr) = 0;
- virtual void startSerialization() = 0;
+ virtual void startSerialization() = 0;
- virtual void finishSerialization() = 0;
+ virtual void finishSerialization() = 0;
- virtual const char* findNameForPointer(const void* ptr) const = 0;
+ virtual const char* findNameForPointer(const void* ptr) const = 0;
- virtual void registerNameForPointer(const void* ptr, const char* name) = 0;
+ virtual void registerNameForPointer(const void* ptr, const char* name) = 0;
- virtual void serializeName(const char* ptr) = 0;
+ virtual void serializeName(const char* ptr) = 0;
- virtual int getSerializationFlags() const = 0;
+ virtual int getSerializationFlags() const = 0;
- virtual void setSerializationFlags(int flags) = 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) )
+#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) )
+#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
+#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];
+ union {
+ void* m_ptr;
+ int m_uniqueIds[2];
};
};
@@ -146,8 +135,8 @@ struct btBulletSerializedArrays
btBulletSerializedArrays()
{
}
- btAlignedObjectArray<struct btQuantizedBvhDoubleData*> m_bvhsDouble;
- btAlignedObjectArray<struct btQuantizedBvhFloatData*> m_bvhsFloat;
+ btAlignedObjectArray<struct btQuantizedBvhDoubleData*> m_bvhsDouble;
+ btAlignedObjectArray<struct btQuantizedBvhFloatData*> m_bvhsFloat;
btAlignedObjectArray<struct btCollisionShapeData*> m_colShapeData;
btAlignedObjectArray<struct btDynamicsWorldDoubleData*> m_dynamicWorldInfoDataDouble;
btAlignedObjectArray<struct btDynamicsWorldFloatData*> m_dynamicWorldInfoDataFloat;
@@ -157,51 +146,42 @@ struct btBulletSerializedArrays
btAlignedObjectArray<struct btCollisionObjectFloatData*> m_collisionObjectDataFloat;
btAlignedObjectArray<struct btTypedConstraintFloatData*> m_constraintDataFloat;
btAlignedObjectArray<struct btTypedConstraintDoubleData*> m_constraintDataDouble;
- btAlignedObjectArray<struct btTypedConstraintData*> m_constraintData;//for backwards compatibility
+ btAlignedObjectArray<struct btTypedConstraintData*> m_constraintData; //for backwards compatibility
btAlignedObjectArray<struct btSoftBodyFloatData*> m_softBodyFloatData;
btAlignedObjectArray<struct btSoftBodyDoubleData*> 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
+class btDefaultSerializer : public btSerializer
{
-
protected:
+ btAlignedObjectArray<char*> mTypes;
+ btAlignedObjectArray<short*> mStructs;
+ btAlignedObjectArray<short> mTlens;
+ btHashMap<btHashInt, int> mStructReverse;
+ btHashMap<btHashString, int> mTypeLookup;
- btAlignedObjectArray<char*> mTypes;
- btAlignedObjectArray<short*> mStructs;
- btAlignedObjectArray<short> mTlens;
- btHashMap<btHashInt, int> mStructReverse;
- btHashMap<btHashString,int> mTypeLookup;
-
+ btHashMap<btHashPtr, void*> m_chunkP;
+ btHashMap<btHashPtr, const char*> m_nameMap;
- btHashMap<btHashPtr,void*> m_chunkP;
+ btHashMap<btHashPtr, btPointerUid> m_uniquePointers;
+ int m_uniqueIdGenerator;
- btHashMap<btHashPtr,const char*> m_nameMap;
+ int m_totalSize;
+ unsigned char* m_buffer;
+ bool m_ownsBuffer;
+ int m_currentSize;
+ void* m_dna;
+ int m_dnaLength;
- btHashMap<btHashPtr,btPointerUid> m_uniquePointers;
- int m_uniqueIdGenerator;
+ int m_serializationFlags;
- int m_totalSize;
- unsigned char* m_buffer;
- bool m_ownsBuffer;
- int m_currentSize;
- void* m_dna;
- int m_dnaLength;
-
- int m_serializationFlags;
-
-
- btAlignedObjectArray<btChunk*> m_chunkPtrs;
+ btAlignedObjectArray<btChunk*> m_chunkPtrs;
protected:
-
-
- virtual void* findPointer(void* oldPtr)
+ virtual void* findPointer(void* oldPtr)
{
void** ptr = m_chunkP.find(oldPtr);
if (ptr && *ptr)
@@ -209,48 +189,43 @@ protected:
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;
- 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];
-
+ int littleEndian = 1;
+ littleEndian = ((char*)&littleEndian)[0];
- m_dna = btAlignedAlloc(dnalen,16);
- memcpy(m_dna,bdnaOrg,dnalen);
- m_dnaLength = dnalen;
+ 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;
+ int* intPtr = 0;
+ short* shtPtr = 0;
+ char* cp = 0;
+ int dataLen = 0;
+ intPtr = (int*)m_dna;
- /*
+ /*
SDNA (4 bytes) (magic number)
NAME (4 bytes)
<nr> (4 bytes) amount of names (int)
@@ -258,81 +233,81 @@ protected:
<string>
*/
- if (strncmp((const char*)m_dna, "SDNA", 4)==0)
- {
- // skip ++ NAME
- intPtr++; intPtr++;
- }
-
- // Parse names
- if (!littleEndian)
- *intPtr = btSwapEndian(*intPtr);
+ if (strncmp((const char*)m_dna, "SDNA", 4) == 0)
+ {
+ // skip ++ NAME
+ intPtr++;
+ intPtr++;
+ }
- dataLen = *intPtr;
+ // Parse names
+ if (!littleEndian)
+ *intPtr = btSwapEndian(*intPtr);
- intPtr++;
+ dataLen = *intPtr;
- cp = (char*)intPtr;
- int i;
- for ( i=0; i<dataLen; i++)
- {
+ intPtr++;
- while (*cp)cp++;
- cp++;
- }
- cp = btAlignPointer(cp,4);
+ cp = (char*)intPtr;
+ int i;
+ for (i = 0; i < dataLen; i++)
+ {
+ while (*cp) cp++;
+ cp++;
+ }
+ cp = btAlignPointer(cp, 4);
- /*
+ /*
TYPE (4 bytes)
<nr> amount of types (int)
<string>
<string>
*/
- intPtr = (int*)cp;
- btAssert(strncmp(cp, "TYPE", 4)==0); intPtr++;
+ intPtr = (int*)cp;
+ btAssert(strncmp(cp, "TYPE", 4) == 0);
+ intPtr++;
- if (!littleEndian)
- *intPtr = btSwapEndian(*intPtr);
+ if (!littleEndian)
+ *intPtr = btSwapEndian(*intPtr);
- dataLen = *intPtr;
- intPtr++;
+ dataLen = *intPtr;
+ intPtr++;
+ cp = (char*)intPtr;
+ for (i = 0; i < dataLen; i++)
+ {
+ mTypes.push_back(cp);
+ while (*cp) cp++;
+ cp++;
+ }
- cp = (char*)intPtr;
- for (i=0; i<dataLen; i++)
- {
- mTypes.push_back(cp);
- while (*cp)cp++;
- cp++;
- }
-
- cp = btAlignPointer(cp,4);
-
+ cp = btAlignPointer(cp, 4);
- /*
+ /*
TLEN (4 bytes)
<len> (short) the lengths of types
<len>
*/
- // Parse type lens
- intPtr = (int*)cp;
- btAssert(strncmp(cp, "TLEN", 4)==0); intPtr++;
+ // Parse type lens
+ intPtr = (int*)cp;
+ btAssert(strncmp(cp, "TLEN", 4) == 0);
+ intPtr++;
- dataLen = (int)mTypes.size();
+ 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]);
- }
+ 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++;
+ if (dataLen & 1) shtPtr++;
- /*
+ /*
STRC (4 bytes)
<nr> amount of structs (int)
<typenr>
@@ -343,384 +318,372 @@ protected:
<namenr>
*/
- intPtr = (int*)shtPtr;
- cp = (char*)intPtr;
- btAssert(strncmp(cp, "STRC", 4)==0); intPtr++;
+ intPtr = (int*)shtPtr;
+ cp = (char*)intPtr;
+ btAssert(strncmp(cp, "STRC", 4) == 0);
+ intPtr++;
- if (!littleEndian)
- *intPtr = btSwapEndian(*intPtr);
- dataLen = *intPtr ;
- intPtr++;
+ if (!littleEndian)
+ *intPtr = btSwapEndian(*intPtr);
+ dataLen = *intPtr;
+ intPtr++;
+ shtPtr = (short*)intPtr;
+ for (i = 0; i < dataLen; i++)
+ {
+ mStructs.push_back(shtPtr);
- shtPtr = (short*)intPtr;
- for (i=0; i<dataLen; i++)
+ if (!littleEndian)
{
- mStructs.push_back (shtPtr);
+ shtPtr[0] = btSwapEndian(shtPtr[0]);
+ shtPtr[1] = btSwapEndian(shtPtr[1]);
- 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]);
- }
+ int len = shtPtr[1];
+ shtPtr += 2;
- } else
+ for (int a = 0; a < len; a++, shtPtr += 2)
{
- shtPtr+= (2*shtPtr[1])+2;
+ shtPtr[0] = btSwapEndian(shtPtr[0]);
+ shtPtr[1] = btSwapEndian(shtPtr[1]);
}
}
-
- // build reverse lookups
- for (i=0; i<(int)mStructs.size(); i++)
+ else
{
- short *strc = mStructs.at(i);
- mStructReverse.insert(strc[0], i);
- mTypeLookup.insert(btHashString(mTypes[strc[0]]),i);
+ shtPtr += (2 * shtPtr[1]) + 2;
}
}
-public:
-
- btHashMap<btHashPtr,void*> m_skipPointers;
-
+ // 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);
+ }
+ }
- 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)
+public:
+ btHashMap<btHashPtr, void*> 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
{
- 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));
+ 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 (VOID_IS_8)
+ {
#if _WIN64
- initDNA((const char*)sBulletDNAstr64,sBulletDNAlen64);
+ initDNA((const char*)sBulletDNAstr64, sBulletDNAlen64);
#else
- btAssert(0);
+ btAssert(0);
#endif
- } else
- {
+ }
+ else
+ {
#ifndef _WIN64
- initDNA((const char*)sBulletDNAstr,sBulletDNAlen);
+ initDNA((const char*)sBulletDNAstr, sBulletDNAlen);
#else
- btAssert(0);
+ 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()
+#else //BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
+ if (VOID_IS_8)
{
- 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;
+ initDNA((const char*)sBulletDNAstr64, sBulletDNAlen64);
}
- static const char* getMemoryDna()
+ else
{
- const bool VOID_IS_8 = ((sizeof(void*) == 8));
- if (VOID_IS_8)
- {
- return (const char*)sBulletDNAstr64;
- }
- return (const char*)sBulletDNAstr;
+ initDNA((const char*)sBulletDNAstr, sBulletDNAlen);
}
+#endif //BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
+ }
- void insertHeader()
+ 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)
{
- writeHeader(m_buffer);
- m_currentSize += BT_HEADER_LENGTH;
+ return sBulletDNAlen64;
}
-
- void writeHeader(unsigned char* buffer) const
+ 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;
+ }
-#ifdef BT_USE_DOUBLE_PRECISION
- memcpy(buffer, "BULLETd", 7);
+ 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];
+ memcpy(buffer, "BULLETf", 7);
+#endif //BT_USE_DOUBLE_PRECISION
- 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] = '8';
+ int littleEndian = 1;
+ littleEndian = ((char*)&littleEndian)[0];
+ if (sizeof(void*) == 8)
+ {
+ buffer[7] = '-';
}
-
- virtual void startSerialization()
+ else
{
- m_uniqueIdGenerator= 1;
- if (m_totalSize)
- {
- unsigned char* buffer = internalAlloc(BT_HEADER_LENGTH);
- writeHeader(buffer);
- }
-
+ buffer[7] = '_';
}
- virtual void finishSerialization()
+ if (littleEndian)
{
- 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);
+ buffer[8] = 'v';
+ }
+ else
+ {
+ buffer[8] = 'V';
+ }
- 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;
- }
- }
+ buffer[9] = '2';
+ buffer[10] = '8';
+ buffer[11] = '8';
+ }
- 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 startSerialization()
+ {
+ m_uniqueIdGenerator = 1;
+ if (m_totalSize)
+ {
+ unsigned char* buffer = internalAlloc(BT_HEADER_LENGTH);
+ writeHeader(buffer);
}
+ }
- virtual void* getUniquePointer(void*oldPtr)
+ 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)
{
- btAssert(m_uniqueIdGenerator >= 0);
- if (!oldPtr)
- return 0;
+ if (m_buffer)
+ btAlignedFree(m_buffer);
- btPointerUid* uptr = (btPointerUid*)m_uniquePointers.find(oldPtr);
- if (uptr)
- {
- return uptr->m_ptr;
- }
+ m_currentSize += BT_HEADER_LENGTH;
+ m_buffer = (unsigned char*)btAlignedAlloc(m_currentSize, 16);
- void** ptr2 = m_skipPointers[oldPtr];
- if (ptr2)
+ 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++)
{
- return 0;
+ int curLength = sizeof(btChunk) + m_chunkPtrs[i]->m_length;
+ memcpy(currentPtr, m_chunkPtrs[i], curLength);
+ btAlignedFree(m_chunkPtrs[i]);
+ currentPtr += curLength;
+ mysize += curLength;
}
+ }
- 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;
+ 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;
- virtual const unsigned char* getBufferPointer() const
+ btPointerUid* uptr = (btPointerUid*)m_uniquePointers.find(oldPtr);
+ if (uptr)
{
- return m_buffer;
+ return uptr->m_ptr;
}
- virtual int getCurrentBufferSize() const
+ void** ptr2 = m_skipPointers[oldPtr];
+ if (ptr2)
{
- return m_currentSize;
+ return 0;
}
- virtual void finalizeChunk(btChunk* chunk, const char* structType, int chunkCode,void* oldPtr)
- {
- if (!(m_serializationFlags&BT_SERIALIZE_NO_DUPLICATE_ASSERT))
- {
- btAssert(!findPointer(oldPtr));
- }
+ m_uniqueIdGenerator++;
- chunk->m_dna_nr = getReverseType(structType);
-
- chunk->m_chunkCode = chunkCode;
+ btPointerUid uid;
+ uid.m_uniqueIds[0] = m_uniqueIdGenerator;
+ uid.m_uniqueIds[1] = m_uniqueIdGenerator;
+ m_uniquePointers.insert(oldPtr, uid);
+ return uid.m_ptr;
+ }
- void* uniquePtr = getUniquePointer(oldPtr);
+ virtual const unsigned char* getBufferPointer() const
+ {
+ return m_buffer;
+ }
- m_chunkP.insert(oldPtr,uniquePtr);//chunk->m_oldPtr);
- chunk->m_oldPtr = uniquePtr;//oldPtr;
+ 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);
- virtual unsigned char* internalAlloc(size_t size)
- {
- unsigned char* ptr = 0;
+ chunk->m_chunkCode = chunkCode;
- 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;
- }
+ 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;
- virtual btChunk* allocate(size_t size, int numElements)
+ 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;
+ }
- unsigned char* ptr = internalAlloc(int(size)*numElements+sizeof(btChunk));
-
- unsigned char* data = ptr + sizeof(btChunk);
+ virtual btChunk* allocate(size_t size, int numElements)
+ {
+ unsigned char* ptr = internalAlloc(int(size) * numElements + sizeof(btChunk));
- btChunk* chunk = (btChunk*)ptr;
- chunk->m_chunkCode = 0;
- chunk->m_oldPtr = data;
- chunk->m_length = int(size)*numElements;
- chunk->m_number = numElements;
+ unsigned char* data = ptr + sizeof(btChunk);
- m_chunkPtrs.push_back(chunk);
+ 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;
- }
+ 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 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 registerNameForPointer(const void* ptr, const char* name)
+ virtual void serializeName(const char* name)
+ {
+ if (name)
{
- m_nameMap.insert(ptr,name);
- }
+ //don't serialize name twice
+ if (findPointer((void*)name))
+ return;
- virtual void serializeName(const char* name)
- {
- if (name)
+ int len = btStrLen(name);
+ if (len)
{
- //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++)
{
-
- 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);
+ destinationName[i] = name[i];
}
+ destinationName[len] = 0;
+ finalizeChunk(chunk, "char", BT_ARRAY_CODE, (void*)name);
}
}
+ }
- virtual int getSerializationFlags() const
- {
- return m_serializationFlags;
- }
+ virtual int getSerializationFlags() const
+ {
+ return m_serializationFlags;
+ }
- virtual void setSerializationFlags(int flags)
- {
- m_serializationFlags = flags;
- }
- int getNumChunks() const
- {
- return m_chunkPtrs.size();
- }
+ 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];
- }
+ 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.
@@ -730,181 +693,177 @@ public:
struct btInMemorySerializer : public btDefaultSerializer
{
- btHashMap<btHashPtr,btChunk*> m_uid2ChunkPtr;
- btHashMap<btHashPtr,void*> m_orgPtr2UniqueDataPtr;
- btHashMap<btHashString,const void*> 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;
- }
+ btHashMap<btHashPtr, btChunk*> m_uid2ChunkPtr;
+ btHashMap<btHashPtr, void*> m_orgPtr2UniqueDataPtr;
+ btHashMap<btHashString, const void*> 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();
+ }
- virtual void finalizeChunk(btChunk* chunk, const char* structType, int chunkCode,void* oldPtr)
- {
- if (!(m_serializationFlags&BT_SERIALIZE_NO_DUPLICATE_ASSERT))
- {
- btAssert(!findPointer(oldPtr));
- }
+ btChunk* findChunkFromUniquePointer(void* uniquePointer)
+ {
+ btChunk** chkPtr = m_uid2ChunkPtr[uniquePointer];
+ if (chkPtr)
+ {
+ return *chkPtr;
+ }
+ return 0;
+ }
- 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;
+ virtual void registerNameForPointer(const void* ptr, const char* name)
+ {
+ btDefaultSerializer::registerNameForPointer(ptr, name);
+ m_names2Ptr.insert(name, ptr);
+ }
- void* uid = findPointer(oldPtr);
- m_uid2ChunkPtr.insert(uid,chunk);
+ virtual void finishSerialization()
+ {
+ }
- switch (chunk->m_chunkCode)
+ 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)
{
- case BT_SOFTBODY_CODE:
+ return oldPtr;
+ }
+ else
{
- #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;
+ void** ptr2 = m_skipPointers[oldPtr];
+ if (ptr2)
+ {
+ return 0;
}
- case BT_COLLISIONOBJECT_CODE:
+ else
{
- #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;
+ //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;
- };
+ {
+#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;
- }
+ {
+#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;
- }
+ {
+#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;
- }
+ {
+ 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;
- }
+ {
+ break;
+ }
default:
- {
- }
- };
- }
-
- int getNumChunks() const
- {
- return m_uid2ChunkPtr.size();
- }
+ {
+ }
+ };
+ }
- const btChunk* getChunk(int chunkIndex) const
- {
- return *m_uid2ChunkPtr.getAtIndex(chunkIndex);
- }
+ 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
+#endif //ENABLE_INMEMORY_SERIALIZER
+#endif //BT_SERIALIZER_H
diff --git a/thirdparty/bullet/LinearMath/btSerializer64.cpp b/thirdparty/bullet/LinearMath/btSerializer64.cpp
index 0aa5cbf30e..cf281cdb36 100644
--- a/thirdparty/bullet/LinearMath/btSerializer64.cpp
+++ b/thirdparty/bullet/LinearMath/btSerializer64.cpp
@@ -1,3 +1,4 @@
+// clang-format off
char sBulletDNAstr64[]= {
char(83),char(68),char(78),char(65),char(78),char(65),char(77),char(69),char(-76),char(1),char(0),char(0),char(109),char(95),char(115),char(105),char(122),char(101),char(0),char(109),
char(95),char(99),char(97),char(112),char(97),char(99),char(105),char(116),char(121),char(0),char(42),char(109),char(95),char(100),char(97),char(116),char(97),char(0),char(109),char(95),
@@ -687,3 +688,4 @@ char(97),char(0),char(4),char(0),char(50),char(0),char(-79),char(1),char(96),cha
char(98),char(0),char(4),char(0),char(48),char(0),char(-79),char(1),char(95),char(0),char(-78),char(1),char(4),char(0),char(-77),char(1),char(0),char(0),char(37),char(0),
};
int sBulletDNAlen64= sizeof(sBulletDNAstr64);
+// clang-format on
diff --git a/thirdparty/bullet/LinearMath/btSpatialAlgebra.h b/thirdparty/bullet/LinearMath/btSpatialAlgebra.h
index 8e59658bca..6ad67a1081 100644
--- a/thirdparty/bullet/LinearMath/btSpatialAlgebra.h
+++ b/thirdparty/bullet/LinearMath/btSpatialAlgebra.h
@@ -12,18 +12,17 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-///These spatial algebra classes are used for btMultiBody,
+///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;
+{
+ btVector3 m_topVec, m_bottomVec;
//
btSpatialForceVector() { setZero(); }
btSpatialForceVector(const btVector3 &angular, const btVector3 &linear) : m_topVec(linear), m_bottomVec(angular) {}
@@ -32,21 +31,34 @@ struct btSpatialForceVector
setValue(ax, ay, az, lx, ly, lz);
}
//
- void setVector(const btVector3 &angular, const btVector3 &linear) { m_topVec = linear; m_bottomVec = angular; }
+ 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);
+ 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 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;
+ 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; }
+ 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; }
@@ -54,14 +66,28 @@ struct btSpatialForceVector
void addAngular(const btVector3 &angular) { m_bottomVec += angular; }
void addLinear(const btVector3 &linear) { m_topVec += linear; }
//
- void setZero() { m_topVec.setZero(); m_bottomVec.setZero(); }
+ 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;
+ }
+ 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; }
};
@@ -70,23 +96,36 @@ struct btSpatialMotionVector
btVector3 m_topVec, m_bottomVec;
//
btSpatialMotionVector() { setZero(); }
- btSpatialMotionVector(const btVector3 &angular, const btVector3 &linear) : m_topVec(angular), m_bottomVec(linear) {}
+ 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 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);
+ 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 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;
+ 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; }
+ //
+ 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; }
@@ -94,20 +133,24 @@ struct btSpatialMotionVector
void addAngular(const btVector3 &angular) { m_topVec += angular; }
void addLinear(const btVector3 &linear) { m_bottomVec += linear; }
//
- void setZero() { m_topVec.setZero(); m_bottomVec.setZero(); }
+ 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<typename SpatialVectorType>
+ template <typename SpatialVectorType>
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<typename SpatialVectorType>
+ template <typename SpatialVectorType>
SpatialVectorType cross(const SpatialVectorType &b) const
{
SpatialVectorType out;
@@ -116,21 +159,36 @@ struct btSpatialMotionVector
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); }
+ 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); }
+ 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)
{
@@ -146,17 +204,22 @@ struct btSymmetricSpatialDyad
m_bottomLeftMat += bottomLeftMat;
}
//
- void setIdentity() { m_topLeftMat.setIdentity(); m_topRightMat.setIdentity(); m_bottomLeftMat.setIdentity(); }
+ void setIdentity()
+ {
+ m_topLeftMat.setIdentity();
+ m_topRightMat.setIdentity();
+ m_bottomLeftMat.setIdentity();
+ }
//
- btSymmetricSpatialDyad & operator -= (const btSymmetricSpatialDyad &mat)
+ btSymmetricSpatialDyad &operator-=(const btSymmetricSpatialDyad &mat)
{
m_topLeftMat -= mat.m_topLeftMat;
m_topRightMat -= mat.m_topRightMat;
m_bottomLeftMat -= mat.m_bottomLeftMat;
- return *this;
+ return *this;
}
//
- btSpatialForceVector operator * (const btSpatialMotionVector &vec)
+ 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);
}
@@ -164,7 +227,7 @@ struct btSymmetricSpatialDyad
struct btSpatialTransformationMatrix
{
- btMatrix3x3 m_rotMat; //btMatrix3x3 m_trnCrossMat;
+ btMatrix3x3 m_rotMat; //btMatrix3x3 m_trnCrossMat;
btVector3 m_trnVec;
//
enum eOutputOperation
@@ -174,128 +237,124 @@ struct btSpatialTransformationMatrix
Subtract = 2
};
//
- template<typename SpatialVectorType>
- void transform( const SpatialVectorType &inVec,
- SpatialVectorType &outVec,
- eOutputOperation outOp = None)
+ template <typename SpatialVectorType>
+ void transform(const SpatialVectorType &inVec,
+ SpatialVectorType &outVec,
+ eOutputOperation outOp = None)
{
- if(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)
+ 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)
+ 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<typename SpatialVectorType>
- void transformRotationOnly( const SpatialVectorType &inVec,
- SpatialVectorType &outVec,
- eOutputOperation outOp = None)
+ template <typename SpatialVectorType>
+ void transformRotationOnly(const SpatialVectorType &inVec,
+ SpatialVectorType &outVec,
+ eOutputOperation outOp = None)
{
- if(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)
+ else if (outOp == Add)
{
outVec.m_topVec += m_rotMat * inVec.m_topVec;
outVec.m_bottomVec += m_rotMat * inVec.m_bottomVec;
}
- else if(outOp == Subtract)
+ else if (outOp == Subtract)
{
outVec.m_topVec -= m_rotMat * inVec.m_topVec;
outVec.m_bottomVec -= m_rotMat * inVec.m_bottomVec;
}
-
}
- template<typename SpatialVectorType>
- void transformInverse( const SpatialVectorType &inVec,
- SpatialVectorType &outVec,
- eOutputOperation outOp = None)
+ template <typename SpatialVectorType>
+ void transformInverse(const SpatialVectorType &inVec,
+ SpatialVectorType &outVec,
+ eOutputOperation outOp = None)
{
- if(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)
+ 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)
+ 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<typename SpatialVectorType>
- void transformInverseRotationOnly( const SpatialVectorType &inVec,
- SpatialVectorType &outVec,
- eOutputOperation outOp = None)
+ template <typename SpatialVectorType>
+ void transformInverseRotationOnly(const SpatialVectorType &inVec,
+ SpatialVectorType &outVec,
+ eOutputOperation outOp = None)
{
- if(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)
+ 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)
+ 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)
+ 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);
+ 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)
+ if (outOp == None)
{
- outMat.m_topLeftMat = m_rotMat.transpose() * ( inMat.m_topLeftMat - inMat.m_topRightMat * r_cross ) * m_rotMat;
+ 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)
+ else if (outOp == Add)
{
- outMat.m_topLeftMat += m_rotMat.transpose() * ( inMat.m_topLeftMat - inMat.m_topRightMat * r_cross ) * m_rotMat;
+ 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)
+ else if (outOp == Subtract)
{
- outMat.m_topLeftMat -= m_rotMat.transpose() * ( inMat.m_topLeftMat - inMat.m_topRightMat * r_cross ) * m_rotMat;
+ 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<typename SpatialVectorType>
- SpatialVectorType operator * (const SpatialVectorType &vec)
+ template <typename SpatialVectorType>
+ SpatialVectorType operator*(const SpatialVectorType &vec)
{
SpatialVectorType out;
transform(vec, out);
@@ -303,7 +362,7 @@ struct btSpatialTransformationMatrix
}
};
-template<typename SpatialVectorType>
+template <typename SpatialVectorType>
void symmetricSpatialOuterProduct(const SpatialVectorType &a, const SpatialVectorType &b, btSymmetricSpatialDyad &out)
{
//output op maybe?
@@ -314,7 +373,7 @@ void symmetricSpatialOuterProduct(const SpatialVectorType &a, const SpatialVecto
//maybe simple a*spatTranspose(a) would be nicer?
}
-template<typename SpatialVectorType>
+template <typename SpatialVectorType>
btSymmetricSpatialDyad symmetricSpatialOuterProduct(const SpatialVectorType &a, const SpatialVectorType &b)
{
btSymmetricSpatialDyad out;
@@ -327,5 +386,4 @@ btSymmetricSpatialDyad symmetricSpatialOuterProduct(const SpatialVectorType &a,
//maybe simple a*spatTranspose(a) would be nicer?
}
-#endif //BT_SPATIAL_ALGEBRA_H
-
+#endif //BT_SPATIAL_ALGEBRA_H
diff --git a/thirdparty/bullet/LinearMath/btStackAlloc.h b/thirdparty/bullet/LinearMath/btStackAlloc.h
index 397b084877..3fc2084976 100644
--- a/thirdparty/bullet/LinearMath/btStackAlloc.h
+++ b/thirdparty/bullet/LinearMath/btStackAlloc.h
@@ -20,97 +20,99 @@ Nov.2006
#ifndef BT_STACK_ALLOC
#define BT_STACK_ALLOC
-#include "btScalar.h" //for btAssert
+#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;
+ 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(); }
- btStackAlloc(unsigned int size) { ctor();create(size); }
- ~btStackAlloc() { destroy(); }
-
- inline void create(unsigned int size)
+ inline void create(unsigned int size)
{
destroy();
- data = (unsigned char*) btAlignedAlloc(size,16);
- totalsize = size;
+ data = (unsigned char*)btAlignedAlloc(size, 16);
+ totalsize = size;
}
- inline void destroy()
+ inline void destroy()
{
- btAssert(usedsize==0);
+ btAssert(usedsize == 0);
//Raise(L"StackAlloc is still in use");
- if(usedsize==0)
+ if (usedsize == 0)
{
- if(!ischild && data)
+ if (!ischild && data)
btAlignedFree(data);
- data = 0;
- usedsize = 0;
+ data = 0;
+ usedsize = 0;
}
-
}
- int getAvailableMemory() const
+ int getAvailableMemory() const
{
return static_cast<int>(totalsize - usedsize);
}
- unsigned char* allocate(unsigned int size)
+ unsigned char* allocate(unsigned int size)
{
- const unsigned int nus(usedsize+size);
- if(nus<totalsize)
+ const unsigned int nus(usedsize + size);
+ if (nus < totalsize)
{
- usedsize=nus;
- return(data+(usedsize-size));
+ usedsize = nus;
+ return (data + (usedsize - size));
}
btAssert(0);
//&& (L"Not enough memory"));
-
- return(0);
+
+ return (0);
}
- SIMD_FORCE_INLINE btBlock* beginBlock()
+ SIMD_FORCE_INLINE btBlock* beginBlock()
{
- btBlock* pb = (btBlock*)allocate(sizeof(btBlock));
- pb->previous = current;
- pb->address = data+usedsize;
- current = pb;
- return(pb);
+ btBlock* pb = (btBlock*)allocate(sizeof(btBlock));
+ pb->previous = current;
+ pb->address = data + usedsize;
+ current = pb;
+ return (pb);
}
- SIMD_FORCE_INLINE void endBlock(btBlock* block)
+ SIMD_FORCE_INLINE void endBlock(btBlock* block)
{
- btAssert(block==current);
+ btAssert(block == current);
//Raise(L"Unmatched blocks");
- if(block==current)
+ if (block == current)
{
- current = block->previous;
- usedsize = (unsigned int)((block->address-data)-sizeof(btBlock));
+ current = block->previous;
+ usedsize = (unsigned int)((block->address - data) - sizeof(btBlock));
}
}
private:
- void ctor()
+ void ctor()
{
- data = 0;
- totalsize = 0;
- usedsize = 0;
- current = 0;
- ischild = false;
+ data = 0;
+ totalsize = 0;
+ usedsize = 0;
+ current = 0;
+ ischild = false;
}
- unsigned char* data;
- unsigned int totalsize;
- unsigned int usedsize;
- btBlock* current;
- bool ischild;
+ unsigned char* data;
+ unsigned int totalsize;
+ unsigned int usedsize;
+ btBlock* current;
+ bool ischild;
};
-#endif //BT_STACK_ALLOC
+#endif //BT_STACK_ALLOC
diff --git a/thirdparty/bullet/LinearMath/btThreads.cpp b/thirdparty/bullet/LinearMath/btThreads.cpp
index c037626ffb..69a86799fa 100644
--- a/thirdparty/bullet/LinearMath/btThreads.cpp
+++ b/thirdparty/bullet/LinearMath/btThreads.cpp
@@ -12,18 +12,15 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btThreads.h"
#include "btQuickprof.h"
#include <algorithm> // for min and max
-
#if BT_USE_OPENMP && BT_THREADSAFE
#include <omp.h>
-#endif // #if BT_USE_OPENMP && BT_THREADSAFE
-
+#endif // #if BT_USE_OPENMP && BT_THREADSAFE
#if BT_USE_PPL && BT_THREADSAFE
@@ -32,8 +29,7 @@ subject to the following restrictions:
// Visual Studio 2010 and later should come with it
#include <concrtrm.h> // for GetProcessorCount()
-#endif // #if BT_USE_PPL && BT_THREADSAFE
-
+#endif // #if BT_USE_PPL && BT_THREADSAFE
#if BT_USE_TBB && BT_THREADSAFE
@@ -44,8 +40,7 @@ subject to the following restrictions:
#include <tbb/parallel_for.h>
#include <tbb/blocked_range.h>
-#endif // #if BT_USE_TBB && BT_THREADSAFE
-
+#endif // #if BT_USE_TBB && BT_THREADSAFE
#if BT_THREADSAFE
//
@@ -53,7 +48,7 @@ subject to the following restrictions:
// Using ordinary system-provided mutexes like Windows critical sections was noticeably slower
// presumably because when it fails to lock at first it would sleep the thread and trigger costly
// context switching.
-//
+//
#if __cplusplus >= 201103L
@@ -61,25 +56,24 @@ subject to the following restrictions:
// on GCC or Clang you need to compile with -std=c++11
#define USE_CPP11_ATOMICS 1
-#elif defined( _MSC_VER )
+#elif defined(_MSC_VER)
// on MSVC, use intrinsics instead
#define USE_MSVC_INTRINSICS 1
-#elif defined( __GNUC__ ) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))
+#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))
// available since GCC 4.7 and some versions of clang
// todo: check for clang
#define USE_GCC_BUILTIN_ATOMICS 1
-#elif defined( __GNUC__ ) && (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)
+#elif defined(__GNUC__) && (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)
// available since GCC 4.1
#define USE_GCC_BUILTIN_ATOMICS_OLD 1
#endif
-
#if USE_CPP11_ATOMICS
#include <atomic>
@@ -89,27 +83,26 @@ subject to the following restrictions:
bool btSpinMutex::tryLock()
{
- std::atomic<int>* aDest = reinterpret_cast<std::atomic<int>*>(&mLock);
- int expected = 0;
- return std::atomic_compare_exchange_weak_explicit( aDest, &expected, int(1), std::memory_order_acq_rel, std::memory_order_acquire );
+ std::atomic<int>* aDest = reinterpret_cast<std::atomic<int>*>(&mLock);
+ int expected = 0;
+ return std::atomic_compare_exchange_weak_explicit(aDest, &expected, int(1), std::memory_order_acq_rel, std::memory_order_acquire);
}
void btSpinMutex::lock()
{
- // note: this lock does not sleep the thread.
- while (! tryLock())
- {
- // spin
- }
+ // note: this lock does not sleep the thread.
+ while (!tryLock())
+ {
+ // spin
+ }
}
void btSpinMutex::unlock()
{
- std::atomic<int>* aDest = reinterpret_cast<std::atomic<int>*>(&mLock);
- std::atomic_store_explicit( aDest, int(0), std::memory_order_release );
+ std::atomic<int>* aDest = reinterpret_cast<std::atomic<int>*>(&mLock);
+ std::atomic_store_explicit(aDest, int(0), std::memory_order_release);
}
-
#elif USE_MSVC_INTRINSICS
#define WIN32_LEAN_AND_MEAN
@@ -117,148 +110,142 @@ void btSpinMutex::unlock()
#include <windows.h>
#include <intrin.h>
-#define THREAD_LOCAL_STATIC __declspec( thread ) static
-
+#define THREAD_LOCAL_STATIC __declspec(thread) static
bool btSpinMutex::tryLock()
{
- volatile long* aDest = reinterpret_cast<long*>(&mLock);
- return ( 0 == _InterlockedCompareExchange( aDest, 1, 0) );
+ volatile long* aDest = reinterpret_cast<long*>(&mLock);
+ return (0 == _InterlockedCompareExchange(aDest, 1, 0));
}
void btSpinMutex::lock()
{
- // note: this lock does not sleep the thread
- while (! tryLock())
- {
- // spin
- }
+ // note: this lock does not sleep the thread
+ while (!tryLock())
+ {
+ // spin
+ }
}
void btSpinMutex::unlock()
{
- volatile long* aDest = reinterpret_cast<long*>( &mLock );
- _InterlockedExchange( aDest, 0 );
+ volatile long* aDest = reinterpret_cast<long*>(&mLock);
+ _InterlockedExchange(aDest, 0);
}
#elif USE_GCC_BUILTIN_ATOMICS
#define THREAD_LOCAL_STATIC static __thread
-
bool btSpinMutex::tryLock()
{
- int expected = 0;
- bool weak = false;
- const int memOrderSuccess = __ATOMIC_ACQ_REL;
- const int memOrderFail = __ATOMIC_ACQUIRE;
- return __atomic_compare_exchange_n(&mLock, &expected, int(1), weak, memOrderSuccess, memOrderFail);
+ int expected = 0;
+ bool weak = false;
+ const int memOrderSuccess = __ATOMIC_ACQ_REL;
+ const int memOrderFail = __ATOMIC_ACQUIRE;
+ return __atomic_compare_exchange_n(&mLock, &expected, int(1), weak, memOrderSuccess, memOrderFail);
}
void btSpinMutex::lock()
{
- // note: this lock does not sleep the thread
- while (! tryLock())
- {
- // spin
- }
+ // note: this lock does not sleep the thread
+ while (!tryLock())
+ {
+ // spin
+ }
}
void btSpinMutex::unlock()
{
- __atomic_store_n(&mLock, int(0), __ATOMIC_RELEASE);
+ __atomic_store_n(&mLock, int(0), __ATOMIC_RELEASE);
}
#elif USE_GCC_BUILTIN_ATOMICS_OLD
-
#define THREAD_LOCAL_STATIC static __thread
bool btSpinMutex::tryLock()
{
- return __sync_bool_compare_and_swap(&mLock, int(0), int(1));
+ return __sync_bool_compare_and_swap(&mLock, int(0), int(1));
}
void btSpinMutex::lock()
{
- // note: this lock does not sleep the thread
- while (! tryLock())
- {
- // spin
- }
+ // note: this lock does not sleep the thread
+ while (!tryLock())
+ {
+ // spin
+ }
}
void btSpinMutex::unlock()
{
- // write 0
- __sync_fetch_and_and(&mLock, int(0));
+ // write 0
+ __sync_fetch_and_and(&mLock, int(0));
}
-#else //#elif USE_MSVC_INTRINSICS
+#else //#elif USE_MSVC_INTRINSICS
#error "no threading primitives defined -- unknown platform"
#endif //#else //#elif USE_MSVC_INTRINSICS
-#else //#if BT_THREADSAFE
+#else //#if BT_THREADSAFE
// These should not be called ever
void btSpinMutex::lock()
{
- btAssert( !"unimplemented btSpinMutex::lock() called" );
+ btAssert(!"unimplemented btSpinMutex::lock() called");
}
void btSpinMutex::unlock()
{
- btAssert( !"unimplemented btSpinMutex::unlock() called" );
+ btAssert(!"unimplemented btSpinMutex::unlock() called");
}
bool btSpinMutex::tryLock()
{
- btAssert( !"unimplemented btSpinMutex::tryLock() called" );
- return true;
+ btAssert(!"unimplemented btSpinMutex::tryLock() called");
+ return true;
}
#define THREAD_LOCAL_STATIC static
-#endif // #else //#if BT_THREADSAFE
-
+#endif // #else //#if BT_THREADSAFE
struct ThreadsafeCounter
{
- unsigned int mCounter;
- btSpinMutex mMutex;
-
- ThreadsafeCounter()
- {
- mCounter = 0;
- --mCounter; // first count should come back 0
- }
-
- unsigned int getNext()
- {
- // no need to optimize this with atomics, it is only called ONCE per thread!
- mMutex.lock();
- mCounter++;
- if ( mCounter >= BT_MAX_THREAD_COUNT )
- {
- btAssert( !"thread counter exceeded" );
- // wrap back to the first worker index
- mCounter = 1;
- }
- unsigned int val = mCounter;
- mMutex.unlock();
- return val;
- }
+ unsigned int mCounter;
+ btSpinMutex mMutex;
+
+ ThreadsafeCounter()
+ {
+ mCounter = 0;
+ --mCounter; // first count should come back 0
+ }
+
+ unsigned int getNext()
+ {
+ // no need to optimize this with atomics, it is only called ONCE per thread!
+ mMutex.lock();
+ mCounter++;
+ if (mCounter >= BT_MAX_THREAD_COUNT)
+ {
+ btAssert(!"thread counter exceeded");
+ // wrap back to the first worker index
+ mCounter = 1;
+ }
+ unsigned int val = mCounter;
+ mMutex.unlock();
+ return val;
+ }
};
-
-static btITaskScheduler* gBtTaskScheduler;
+static btITaskScheduler* gBtTaskScheduler=0;
static int gThreadsRunningCounter = 0; // useful for detecting if we are trying to do nested parallel-for calls
static btSpinMutex gThreadsRunningCounterMutex;
static ThreadsafeCounter gThreadCounter;
-
//
// BT_DETECT_BAD_THREAD_INDEX tries to detect when there are multiple threads assigned the same thread index.
//
@@ -276,7 +263,7 @@ static ThreadsafeCounter gThreadCounter;
// We allocate thread-indexes as needed with a sequential global thread counter.
//
// Our simple thread-counting scheme falls apart if the task scheduler destroys some threads but
-// continues to re-use other threads and the application repeatedly resizes the thread pool of the
+// continues to re-use other threads and the application repeatedly resizes the thread pool of the
// task scheduler.
// In order to prevent the thread-counter from exceeding the global max (BT_MAX_THREAD_COUNT), we
// wrap the thread counter back to 1. This should only happen if the worker threads have all been
@@ -290,197 +277,192 @@ static ThreadsafeCounter gThreadCounter;
typedef DWORD ThreadId_t;
const static ThreadId_t kInvalidThreadId = 0;
-ThreadId_t gDebugThreadIds[ BT_MAX_THREAD_COUNT ];
+ThreadId_t gDebugThreadIds[BT_MAX_THREAD_COUNT];
static ThreadId_t getDebugThreadId()
{
- return GetCurrentThreadId();
+ return GetCurrentThreadId();
}
-#endif // #if BT_DETECT_BAD_THREAD_INDEX
-
+#endif // #if BT_DETECT_BAD_THREAD_INDEX
// return a unique index per thread, main thread is 0, worker threads are in [1, BT_MAX_THREAD_COUNT)
unsigned int btGetCurrentThreadIndex()
{
- const unsigned int kNullIndex = ~0U;
- THREAD_LOCAL_STATIC unsigned int sThreadIndex = kNullIndex;
- if ( sThreadIndex == kNullIndex )
- {
- sThreadIndex = gThreadCounter.getNext();
- btAssert( sThreadIndex < BT_MAX_THREAD_COUNT );
- }
+ const unsigned int kNullIndex = ~0U;
+ THREAD_LOCAL_STATIC unsigned int sThreadIndex = kNullIndex;
+ if (sThreadIndex == kNullIndex)
+ {
+ sThreadIndex = gThreadCounter.getNext();
+ btAssert(sThreadIndex < BT_MAX_THREAD_COUNT);
+ }
#if BT_DETECT_BAD_THREAD_INDEX
- if ( gBtTaskScheduler && sThreadIndex > 0 )
- {
- ThreadId_t tid = getDebugThreadId();
- // if not set
- if ( gDebugThreadIds[ sThreadIndex ] == kInvalidThreadId )
- {
- // set it
- gDebugThreadIds[ sThreadIndex ] = tid;
- }
- else
- {
- if ( gDebugThreadIds[ sThreadIndex ] != tid )
- {
- // this could indicate the task scheduler is breaking our assumptions about
- // how threads are managed when threadpool is resized
- btAssert( !"there are 2 or more threads with the same thread-index!" );
- __debugbreak();
- }
- }
- }
-#endif // #if BT_DETECT_BAD_THREAD_INDEX
- return sThreadIndex;
+ if (gBtTaskScheduler && sThreadIndex > 0)
+ {
+ ThreadId_t tid = getDebugThreadId();
+ // if not set
+ if (gDebugThreadIds[sThreadIndex] == kInvalidThreadId)
+ {
+ // set it
+ gDebugThreadIds[sThreadIndex] = tid;
+ }
+ else
+ {
+ if (gDebugThreadIds[sThreadIndex] != tid)
+ {
+ // this could indicate the task scheduler is breaking our assumptions about
+ // how threads are managed when threadpool is resized
+ btAssert(!"there are 2 or more threads with the same thread-index!");
+ __debugbreak();
+ }
+ }
+ }
+#endif // #if BT_DETECT_BAD_THREAD_INDEX
+ return sThreadIndex;
}
bool btIsMainThread()
{
- return btGetCurrentThreadIndex() == 0;
+ return btGetCurrentThreadIndex() == 0;
}
void btResetThreadIndexCounter()
{
- // for when all current worker threads are destroyed
- btAssert( btIsMainThread() );
- gThreadCounter.mCounter = 0;
+ // for when all current worker threads are destroyed
+ btAssert(btIsMainThread());
+ gThreadCounter.mCounter = 0;
}
-btITaskScheduler::btITaskScheduler( const char* name )
+btITaskScheduler::btITaskScheduler(const char* name)
{
- m_name = name;
- m_savedThreadCounter = 0;
- m_isActive = false;
+ m_name = name;
+ m_savedThreadCounter = 0;
+ m_isActive = false;
}
void btITaskScheduler::activate()
{
- // gThreadCounter is used to assign a thread-index to each worker thread in a task scheduler.
- // The main thread is always thread-index 0, and worker threads are numbered from 1 to 63 (BT_MAX_THREAD_COUNT-1)
- // The thread-indexes need to be unique amongst the threads that can be running simultaneously.
- // Since only one task scheduler can be used at a time, it is OK for a pair of threads that belong to different
- // task schedulers to share the same thread index because they can't be running at the same time.
- // So each task scheduler needs to keep its own thread counter value
- if ( !m_isActive )
- {
- gThreadCounter.mCounter = m_savedThreadCounter; // restore saved thread counter
- m_isActive = true;
- }
+ // gThreadCounter is used to assign a thread-index to each worker thread in a task scheduler.
+ // The main thread is always thread-index 0, and worker threads are numbered from 1 to 63 (BT_MAX_THREAD_COUNT-1)
+ // The thread-indexes need to be unique amongst the threads that can be running simultaneously.
+ // Since only one task scheduler can be used at a time, it is OK for a pair of threads that belong to different
+ // task schedulers to share the same thread index because they can't be running at the same time.
+ // So each task scheduler needs to keep its own thread counter value
+ if (!m_isActive)
+ {
+ gThreadCounter.mCounter = m_savedThreadCounter; // restore saved thread counter
+ m_isActive = true;
+ }
}
void btITaskScheduler::deactivate()
{
- if ( m_isActive )
- {
- m_savedThreadCounter = gThreadCounter.mCounter; // save thread counter
- m_isActive = false;
- }
+ if (m_isActive)
+ {
+ m_savedThreadCounter = gThreadCounter.mCounter; // save thread counter
+ m_isActive = false;
+ }
}
void btPushThreadsAreRunning()
{
- gThreadsRunningCounterMutex.lock();
- gThreadsRunningCounter++;
- gThreadsRunningCounterMutex.unlock();
+ gThreadsRunningCounterMutex.lock();
+ gThreadsRunningCounter++;
+ gThreadsRunningCounterMutex.unlock();
}
void btPopThreadsAreRunning()
{
- gThreadsRunningCounterMutex.lock();
- gThreadsRunningCounter--;
- gThreadsRunningCounterMutex.unlock();
+ gThreadsRunningCounterMutex.lock();
+ gThreadsRunningCounter--;
+ gThreadsRunningCounterMutex.unlock();
}
bool btThreadsAreRunning()
{
- return gThreadsRunningCounter != 0;
+ return gThreadsRunningCounter != 0;
}
-
-void btSetTaskScheduler( btITaskScheduler* ts )
+void btSetTaskScheduler(btITaskScheduler* ts)
{
- int threadId = btGetCurrentThreadIndex(); // make sure we call this on main thread at least once before any workers run
- if ( threadId != 0 )
- {
- btAssert( !"btSetTaskScheduler must be called from the main thread!" );
- return;
- }
- if ( gBtTaskScheduler )
- {
- // deactivate old task scheduler
- gBtTaskScheduler->deactivate();
- }
- gBtTaskScheduler = ts;
- if ( ts )
- {
- // activate new task scheduler
- ts->activate();
- }
+ int threadId = btGetCurrentThreadIndex(); // make sure we call this on main thread at least once before any workers run
+ if (threadId != 0)
+ {
+ btAssert(!"btSetTaskScheduler must be called from the main thread!");
+ return;
+ }
+ if (gBtTaskScheduler)
+ {
+ // deactivate old task scheduler
+ gBtTaskScheduler->deactivate();
+ }
+ gBtTaskScheduler = ts;
+ if (ts)
+ {
+ // activate new task scheduler
+ ts->activate();
+ }
}
-
btITaskScheduler* btGetTaskScheduler()
{
- return gBtTaskScheduler;
+ return gBtTaskScheduler;
}
-
-void btParallelFor( int iBegin, int iEnd, int grainSize, const btIParallelForBody& body )
+void btParallelFor(int iBegin, int iEnd, int grainSize, const btIParallelForBody& body)
{
#if BT_THREADSAFE
#if BT_DETECT_BAD_THREAD_INDEX
- if ( !btThreadsAreRunning() )
- {
- // clear out thread ids
- for ( int i = 0; i < BT_MAX_THREAD_COUNT; ++i )
- {
- gDebugThreadIds[ i ] = kInvalidThreadId;
- }
- }
-#endif // #if BT_DETECT_BAD_THREAD_INDEX
+ if (!btThreadsAreRunning())
+ {
+ // clear out thread ids
+ for (int i = 0; i < BT_MAX_THREAD_COUNT; ++i)
+ {
+ gDebugThreadIds[i] = kInvalidThreadId;
+ }
+ }
+#endif // #if BT_DETECT_BAD_THREAD_INDEX
- btAssert( gBtTaskScheduler != NULL ); // call btSetTaskScheduler() with a valid task scheduler first!
- gBtTaskScheduler->parallelFor( iBegin, iEnd, grainSize, body );
+ btAssert(gBtTaskScheduler != NULL); // call btSetTaskScheduler() with a valid task scheduler first!
+ gBtTaskScheduler->parallelFor(iBegin, iEnd, grainSize, body);
-#else // #if BT_THREADSAFE
+#else // #if BT_THREADSAFE
- // non-parallel version of btParallelFor
- btAssert( !"called btParallelFor in non-threadsafe build. enable BT_THREADSAFE" );
- body.forLoop( iBegin, iEnd );
+ // non-parallel version of btParallelFor
+ btAssert(!"called btParallelFor in non-threadsafe build. enable BT_THREADSAFE");
+ body.forLoop(iBegin, iEnd);
-#endif// #if BT_THREADSAFE
+#endif // #if BT_THREADSAFE
}
-btScalar btParallelSum( int iBegin, int iEnd, int grainSize, const btIParallelSumBody& body )
+btScalar btParallelSum(int iBegin, int iEnd, int grainSize, const btIParallelSumBody& body)
{
#if BT_THREADSAFE
#if BT_DETECT_BAD_THREAD_INDEX
- if ( !btThreadsAreRunning() )
- {
- // clear out thread ids
- for ( int i = 0; i < BT_MAX_THREAD_COUNT; ++i )
- {
- gDebugThreadIds[ i ] = kInvalidThreadId;
- }
- }
-#endif // #if BT_DETECT_BAD_THREAD_INDEX
+ if (!btThreadsAreRunning())
+ {
+ // clear out thread ids
+ for (int i = 0; i < BT_MAX_THREAD_COUNT; ++i)
+ {
+ gDebugThreadIds[i] = kInvalidThreadId;
+ }
+ }
+#endif // #if BT_DETECT_BAD_THREAD_INDEX
- btAssert( gBtTaskScheduler != NULL ); // call btSetTaskScheduler() with a valid task scheduler first!
- return gBtTaskScheduler->parallelSum( iBegin, iEnd, grainSize, body );
+ btAssert(gBtTaskScheduler != NULL); // call btSetTaskScheduler() with a valid task scheduler first!
+ return gBtTaskScheduler->parallelSum(iBegin, iEnd, grainSize, body);
-#else // #if BT_THREADSAFE
+#else // #if BT_THREADSAFE
- // non-parallel version of btParallelSum
- btAssert( !"called btParallelFor in non-threadsafe build. enable BT_THREADSAFE" );
- return body.sumLoop( iBegin, iEnd );
+ // non-parallel version of btParallelSum
+ btAssert(!"called btParallelFor in non-threadsafe build. enable BT_THREADSAFE");
+ return body.sumLoop(iBegin, iEnd);
-#endif //#else // #if BT_THREADSAFE
+#endif //#else // #if BT_THREADSAFE
}
-
///
/// btTaskSchedulerSequential -- non-threaded implementation of task scheduler
/// (really just useful for testing performance of single threaded vs multi)
@@ -488,86 +470,86 @@ btScalar btParallelSum( int iBegin, int iEnd, int grainSize, const btIParallelSu
class btTaskSchedulerSequential : public btITaskScheduler
{
public:
- btTaskSchedulerSequential() : btITaskScheduler( "Sequential" ) {}
- virtual int getMaxNumThreads() const BT_OVERRIDE { return 1; }
- virtual int getNumThreads() const BT_OVERRIDE { return 1; }
- virtual void setNumThreads( int numThreads ) BT_OVERRIDE {}
- virtual void parallelFor( int iBegin, int iEnd, int grainSize, const btIParallelForBody& body ) BT_OVERRIDE
- {
- BT_PROFILE( "parallelFor_sequential" );
- body.forLoop( iBegin, iEnd );
- }
- virtual btScalar parallelSum( int iBegin, int iEnd, int grainSize, const btIParallelSumBody& body ) BT_OVERRIDE
- {
- BT_PROFILE( "parallelSum_sequential" );
- return body.sumLoop( iBegin, iEnd );
- }
+ btTaskSchedulerSequential() : btITaskScheduler("Sequential") {}
+ virtual int getMaxNumThreads() const BT_OVERRIDE { return 1; }
+ virtual int getNumThreads() const BT_OVERRIDE { return 1; }
+ virtual void setNumThreads(int numThreads) BT_OVERRIDE {}
+ virtual void parallelFor(int iBegin, int iEnd, int grainSize, const btIParallelForBody& body) BT_OVERRIDE
+ {
+ BT_PROFILE("parallelFor_sequential");
+ body.forLoop(iBegin, iEnd);
+ }
+ virtual btScalar parallelSum(int iBegin, int iEnd, int grainSize, const btIParallelSumBody& body) BT_OVERRIDE
+ {
+ BT_PROFILE("parallelSum_sequential");
+ return body.sumLoop(iBegin, iEnd);
+ }
};
-
#if BT_USE_OPENMP && BT_THREADSAFE
///
/// btTaskSchedulerOpenMP -- wrapper around OpenMP task scheduler
///
class btTaskSchedulerOpenMP : public btITaskScheduler
{
- int m_numThreads;
+ int m_numThreads;
+
public:
- btTaskSchedulerOpenMP() : btITaskScheduler( "OpenMP" )
- {
- m_numThreads = 0;
- }
- virtual int getMaxNumThreads() const BT_OVERRIDE
- {
- return omp_get_max_threads();
- }
- virtual int getNumThreads() const BT_OVERRIDE
- {
- return m_numThreads;
- }
- virtual void setNumThreads( int numThreads ) BT_OVERRIDE
- {
- // With OpenMP, because it is a standard with various implementations, we can't
- // know for sure if every implementation has the same behavior of destroying all
- // previous threads when resizing the threadpool
- m_numThreads = ( std::max )( 1, ( std::min )( int( BT_MAX_THREAD_COUNT ), numThreads ) );
- omp_set_num_threads( 1 ); // hopefully, all previous threads get destroyed here
- omp_set_num_threads( m_numThreads );
- m_savedThreadCounter = 0;
- if ( m_isActive )
- {
- btResetThreadIndexCounter();
- }
- }
- virtual void parallelFor( int iBegin, int iEnd, int grainSize, const btIParallelForBody& body ) BT_OVERRIDE
- {
- BT_PROFILE( "parallelFor_OpenMP" );
- btPushThreadsAreRunning();
-#pragma omp parallel for schedule( static, 1 )
- for ( int i = iBegin; i < iEnd; i += grainSize )
- {
- BT_PROFILE( "OpenMP_forJob" );
- body.forLoop( i, ( std::min )( i + grainSize, iEnd ) );
- }
- btPopThreadsAreRunning();
- }
- virtual btScalar parallelSum( int iBegin, int iEnd, int grainSize, const btIParallelSumBody& body ) BT_OVERRIDE
- {
- BT_PROFILE( "parallelFor_OpenMP" );
- btPushThreadsAreRunning();
- btScalar sum = btScalar( 0 );
-#pragma omp parallel for schedule( static, 1 ) reduction(+:sum)
- for ( int i = iBegin; i < iEnd; i += grainSize )
- {
- BT_PROFILE( "OpenMP_sumJob" );
- sum += body.sumLoop( i, ( std::min )( i + grainSize, iEnd ) );
- }
- btPopThreadsAreRunning();
- return sum;
- }
+ btTaskSchedulerOpenMP() : btITaskScheduler("OpenMP")
+ {
+ m_numThreads = 0;
+ }
+ virtual int getMaxNumThreads() const BT_OVERRIDE
+ {
+ return omp_get_max_threads();
+ }
+ virtual int getNumThreads() const BT_OVERRIDE
+ {
+ return m_numThreads;
+ }
+ virtual void setNumThreads(int numThreads) BT_OVERRIDE
+ {
+ // With OpenMP, because it is a standard with various implementations, we can't
+ // know for sure if every implementation has the same behavior of destroying all
+ // previous threads when resizing the threadpool
+ m_numThreads = (std::max)(1, (std::min)(int(BT_MAX_THREAD_COUNT), numThreads));
+ omp_set_num_threads(1); // hopefully, all previous threads get destroyed here
+ omp_set_num_threads(m_numThreads);
+ m_savedThreadCounter = 0;
+ if (m_isActive)
+ {
+ btResetThreadIndexCounter();
+ }
+ }
+ virtual void parallelFor(int iBegin, int iEnd, int grainSize, const btIParallelForBody& body) BT_OVERRIDE
+ {
+ BT_PROFILE("parallelFor_OpenMP");
+ btPushThreadsAreRunning();
+#pragma omp parallel for schedule(static, 1)
+ for (int i = iBegin; i < iEnd; i += grainSize)
+ {
+ BT_PROFILE("OpenMP_forJob");
+ body.forLoop(i, (std::min)(i + grainSize, iEnd));
+ }
+ btPopThreadsAreRunning();
+ }
+ virtual btScalar parallelSum(int iBegin, int iEnd, int grainSize, const btIParallelSumBody& body) BT_OVERRIDE
+ {
+ BT_PROFILE("parallelFor_OpenMP");
+ btPushThreadsAreRunning();
+ btScalar sum = btScalar(0);
+#pragma omp parallel for schedule(static, 1) reduction(+ \
+ : sum)
+ for (int i = iBegin; i < iEnd; i += grainSize)
+ {
+ BT_PROFILE("OpenMP_sumJob");
+ sum += body.sumLoop(i, (std::min)(i + grainSize, iEnd));
+ }
+ btPopThreadsAreRunning();
+ return sum;
+ }
};
-#endif // #if BT_USE_OPENMP && BT_THREADSAFE
-
+#endif // #if BT_USE_OPENMP && BT_THREADSAFE
#if BT_USE_TBB && BT_THREADSAFE
///
@@ -575,96 +557,94 @@ public:
///
class btTaskSchedulerTBB : public btITaskScheduler
{
- int m_numThreads;
- tbb::task_scheduler_init* m_tbbSchedulerInit;
+ int m_numThreads;
+ tbb::task_scheduler_init* m_tbbSchedulerInit;
public:
- btTaskSchedulerTBB() : btITaskScheduler( "IntelTBB" )
- {
- m_numThreads = 0;
- m_tbbSchedulerInit = NULL;
- }
- ~btTaskSchedulerTBB()
- {
- if ( m_tbbSchedulerInit )
- {
- delete m_tbbSchedulerInit;
- m_tbbSchedulerInit = NULL;
- }
- }
-
- virtual int getMaxNumThreads() const BT_OVERRIDE
- {
- return tbb::task_scheduler_init::default_num_threads();
- }
- virtual int getNumThreads() const BT_OVERRIDE
- {
- return m_numThreads;
- }
- virtual void setNumThreads( int numThreads ) BT_OVERRIDE
- {
- m_numThreads = ( std::max )( 1, ( std::min )( int(BT_MAX_THREAD_COUNT), numThreads ) );
- if ( m_tbbSchedulerInit )
- {
- // destroys all previous threads
- delete m_tbbSchedulerInit;
- m_tbbSchedulerInit = NULL;
- }
- m_tbbSchedulerInit = new tbb::task_scheduler_init( m_numThreads );
- m_savedThreadCounter = 0;
- if ( m_isActive )
- {
- btResetThreadIndexCounter();
- }
- }
- struct ForBodyAdapter
- {
- const btIParallelForBody* mBody;
-
- ForBodyAdapter( const btIParallelForBody* body ) : mBody( body ) {}
- void operator()( const tbb::blocked_range<int>& range ) const
- {
- BT_PROFILE( "TBB_forJob" );
- mBody->forLoop( range.begin(), range.end() );
- }
- };
- virtual void parallelFor( int iBegin, int iEnd, int grainSize, const btIParallelForBody& body ) BT_OVERRIDE
- {
- BT_PROFILE( "parallelFor_TBB" );
- ForBodyAdapter tbbBody( &body );
- btPushThreadsAreRunning();
- tbb::parallel_for( tbb::blocked_range<int>( iBegin, iEnd, grainSize ),
- tbbBody,
- tbb::simple_partitioner()
- );
- btPopThreadsAreRunning();
- }
- struct SumBodyAdapter
- {
- const btIParallelSumBody* mBody;
- btScalar mSum;
-
- SumBodyAdapter( const btIParallelSumBody* body ) : mBody( body ), mSum( btScalar( 0 ) ) {}
- SumBodyAdapter( const SumBodyAdapter& src, tbb::split ) : mBody( src.mBody ), mSum( btScalar( 0 ) ) {}
- void join( const SumBodyAdapter& src ) { mSum += src.mSum; }
- void operator()( const tbb::blocked_range<int>& range )
- {
- BT_PROFILE( "TBB_sumJob" );
- mSum += mBody->sumLoop( range.begin(), range.end() );
- }
- };
- virtual btScalar parallelSum( int iBegin, int iEnd, int grainSize, const btIParallelSumBody& body ) BT_OVERRIDE
- {
- BT_PROFILE( "parallelSum_TBB" );
- SumBodyAdapter tbbBody( &body );
- btPushThreadsAreRunning();
- tbb::parallel_deterministic_reduce( tbb::blocked_range<int>( iBegin, iEnd, grainSize ), tbbBody );
- btPopThreadsAreRunning();
- return tbbBody.mSum;
- }
+ btTaskSchedulerTBB() : btITaskScheduler("IntelTBB")
+ {
+ m_numThreads = 0;
+ m_tbbSchedulerInit = NULL;
+ }
+ ~btTaskSchedulerTBB()
+ {
+ if (m_tbbSchedulerInit)
+ {
+ delete m_tbbSchedulerInit;
+ m_tbbSchedulerInit = NULL;
+ }
+ }
+
+ virtual int getMaxNumThreads() const BT_OVERRIDE
+ {
+ return tbb::task_scheduler_init::default_num_threads();
+ }
+ virtual int getNumThreads() const BT_OVERRIDE
+ {
+ return m_numThreads;
+ }
+ virtual void setNumThreads(int numThreads) BT_OVERRIDE
+ {
+ m_numThreads = (std::max)(1, (std::min)(int(BT_MAX_THREAD_COUNT), numThreads));
+ if (m_tbbSchedulerInit)
+ {
+ // destroys all previous threads
+ delete m_tbbSchedulerInit;
+ m_tbbSchedulerInit = NULL;
+ }
+ m_tbbSchedulerInit = new tbb::task_scheduler_init(m_numThreads);
+ m_savedThreadCounter = 0;
+ if (m_isActive)
+ {
+ btResetThreadIndexCounter();
+ }
+ }
+ struct ForBodyAdapter
+ {
+ const btIParallelForBody* mBody;
+
+ ForBodyAdapter(const btIParallelForBody* body) : mBody(body) {}
+ void operator()(const tbb::blocked_range<int>& range) const
+ {
+ BT_PROFILE("TBB_forJob");
+ mBody->forLoop(range.begin(), range.end());
+ }
+ };
+ virtual void parallelFor(int iBegin, int iEnd, int grainSize, const btIParallelForBody& body) BT_OVERRIDE
+ {
+ BT_PROFILE("parallelFor_TBB");
+ ForBodyAdapter tbbBody(&body);
+ btPushThreadsAreRunning();
+ tbb::parallel_for(tbb::blocked_range<int>(iBegin, iEnd, grainSize),
+ tbbBody,
+ tbb::simple_partitioner());
+ btPopThreadsAreRunning();
+ }
+ struct SumBodyAdapter
+ {
+ const btIParallelSumBody* mBody;
+ btScalar mSum;
+
+ SumBodyAdapter(const btIParallelSumBody* body) : mBody(body), mSum(btScalar(0)) {}
+ SumBodyAdapter(const SumBodyAdapter& src, tbb::split) : mBody(src.mBody), mSum(btScalar(0)) {}
+ void join(const SumBodyAdapter& src) { mSum += src.mSum; }
+ void operator()(const tbb::blocked_range<int>& range)
+ {
+ BT_PROFILE("TBB_sumJob");
+ mSum += mBody->sumLoop(range.begin(), range.end());
+ }
+ };
+ virtual btScalar parallelSum(int iBegin, int iEnd, int grainSize, const btIParallelSumBody& body) BT_OVERRIDE
+ {
+ BT_PROFILE("parallelSum_TBB");
+ SumBodyAdapter tbbBody(&body);
+ btPushThreadsAreRunning();
+ tbb::parallel_deterministic_reduce(tbb::blocked_range<int>(iBegin, iEnd, grainSize), tbbBody);
+ btPopThreadsAreRunning();
+ return tbbBody.mSum;
+ }
};
-#endif // #if BT_USE_TBB && BT_THREADSAFE
-
+#endif // #if BT_USE_TBB && BT_THREADSAFE
#if BT_USE_PPL && BT_THREADSAFE
///
@@ -672,148 +652,141 @@ public:
///
class btTaskSchedulerPPL : public btITaskScheduler
{
- int m_numThreads;
- concurrency::combinable<btScalar> m_sum; // for parallelSum
+ int m_numThreads;
+ concurrency::combinable<btScalar> m_sum; // for parallelSum
public:
- btTaskSchedulerPPL() : btITaskScheduler( "PPL" )
- {
- m_numThreads = 0;
- }
- virtual int getMaxNumThreads() const BT_OVERRIDE
- {
- return concurrency::GetProcessorCount();
- }
- virtual int getNumThreads() const BT_OVERRIDE
- {
- return m_numThreads;
- }
- virtual void setNumThreads( int numThreads ) BT_OVERRIDE
- {
- // capping the thread count for PPL due to a thread-index issue
- const int maxThreadCount = (std::min)(int(BT_MAX_THREAD_COUNT), 31);
- m_numThreads = ( std::max )( 1, ( std::min )( maxThreadCount, numThreads ) );
- using namespace concurrency;
- if ( CurrentScheduler::Id() != -1 )
- {
- CurrentScheduler::Detach();
- }
- SchedulerPolicy policy;
- {
- // PPL seems to destroy threads when threadpool is shrunk, but keeps reusing old threads
- // force it to destroy old threads
- policy.SetConcurrencyLimits( 1, 1 );
- CurrentScheduler::Create( policy );
- CurrentScheduler::Detach();
- }
- policy.SetConcurrencyLimits( m_numThreads, m_numThreads );
- CurrentScheduler::Create( policy );
- m_savedThreadCounter = 0;
- if ( m_isActive )
- {
- btResetThreadIndexCounter();
- }
- }
- struct ForBodyAdapter
- {
- const btIParallelForBody* mBody;
- int mGrainSize;
- int mIndexEnd;
-
- ForBodyAdapter( const btIParallelForBody* body, int grainSize, int end ) : mBody( body ), mGrainSize( grainSize ), mIndexEnd( end ) {}
- void operator()( int i ) const
- {
- BT_PROFILE( "PPL_forJob" );
- mBody->forLoop( i, ( std::min )( i + mGrainSize, mIndexEnd ) );
- }
- };
- virtual void parallelFor( int iBegin, int iEnd, int grainSize, const btIParallelForBody& body ) BT_OVERRIDE
- {
- BT_PROFILE( "parallelFor_PPL" );
- // PPL dispatch
- ForBodyAdapter pplBody( &body, grainSize, iEnd );
- btPushThreadsAreRunning();
- // note: MSVC 2010 doesn't support partitioner args, so avoid them
- concurrency::parallel_for( iBegin,
- iEnd,
- grainSize,
- pplBody
- );
- btPopThreadsAreRunning();
- }
- struct SumBodyAdapter
- {
- const btIParallelSumBody* mBody;
- concurrency::combinable<btScalar>* mSum;
- int mGrainSize;
- int mIndexEnd;
-
- SumBodyAdapter( const btIParallelSumBody* body, concurrency::combinable<btScalar>* sum, int grainSize, int end ) : mBody( body ), mSum(sum), mGrainSize( grainSize ), mIndexEnd( end ) {}
- void operator()( int i ) const
- {
- BT_PROFILE( "PPL_sumJob" );
- mSum->local() += mBody->sumLoop( i, ( std::min )( i + mGrainSize, mIndexEnd ) );
- }
- };
- static btScalar sumFunc( btScalar a, btScalar b ) { return a + b; }
- virtual btScalar parallelSum( int iBegin, int iEnd, int grainSize, const btIParallelSumBody& body ) BT_OVERRIDE
- {
- BT_PROFILE( "parallelSum_PPL" );
- m_sum.clear();
- SumBodyAdapter pplBody( &body, &m_sum, grainSize, iEnd );
- btPushThreadsAreRunning();
- // note: MSVC 2010 doesn't support partitioner args, so avoid them
- concurrency::parallel_for( iBegin,
- iEnd,
- grainSize,
- pplBody
- );
- btPopThreadsAreRunning();
- return m_sum.combine( sumFunc );
- }
+ btTaskSchedulerPPL() : btITaskScheduler("PPL")
+ {
+ m_numThreads = 0;
+ }
+ virtual int getMaxNumThreads() const BT_OVERRIDE
+ {
+ return concurrency::GetProcessorCount();
+ }
+ virtual int getNumThreads() const BT_OVERRIDE
+ {
+ return m_numThreads;
+ }
+ virtual void setNumThreads(int numThreads) BT_OVERRIDE
+ {
+ // capping the thread count for PPL due to a thread-index issue
+ const int maxThreadCount = (std::min)(int(BT_MAX_THREAD_COUNT), 31);
+ m_numThreads = (std::max)(1, (std::min)(maxThreadCount, numThreads));
+ using namespace concurrency;
+ if (CurrentScheduler::Id() != -1)
+ {
+ CurrentScheduler::Detach();
+ }
+ SchedulerPolicy policy;
+ {
+ // PPL seems to destroy threads when threadpool is shrunk, but keeps reusing old threads
+ // force it to destroy old threads
+ policy.SetConcurrencyLimits(1, 1);
+ CurrentScheduler::Create(policy);
+ CurrentScheduler::Detach();
+ }
+ policy.SetConcurrencyLimits(m_numThreads, m_numThreads);
+ CurrentScheduler::Create(policy);
+ m_savedThreadCounter = 0;
+ if (m_isActive)
+ {
+ btResetThreadIndexCounter();
+ }
+ }
+ struct ForBodyAdapter
+ {
+ const btIParallelForBody* mBody;
+ int mGrainSize;
+ int mIndexEnd;
+
+ ForBodyAdapter(const btIParallelForBody* body, int grainSize, int end) : mBody(body), mGrainSize(grainSize), mIndexEnd(end) {}
+ void operator()(int i) const
+ {
+ BT_PROFILE("PPL_forJob");
+ mBody->forLoop(i, (std::min)(i + mGrainSize, mIndexEnd));
+ }
+ };
+ virtual void parallelFor(int iBegin, int iEnd, int grainSize, const btIParallelForBody& body) BT_OVERRIDE
+ {
+ BT_PROFILE("parallelFor_PPL");
+ // PPL dispatch
+ ForBodyAdapter pplBody(&body, grainSize, iEnd);
+ btPushThreadsAreRunning();
+ // note: MSVC 2010 doesn't support partitioner args, so avoid them
+ concurrency::parallel_for(iBegin,
+ iEnd,
+ grainSize,
+ pplBody);
+ btPopThreadsAreRunning();
+ }
+ struct SumBodyAdapter
+ {
+ const btIParallelSumBody* mBody;
+ concurrency::combinable<btScalar>* mSum;
+ int mGrainSize;
+ int mIndexEnd;
+
+ SumBodyAdapter(const btIParallelSumBody* body, concurrency::combinable<btScalar>* sum, int grainSize, int end) : mBody(body), mSum(sum), mGrainSize(grainSize), mIndexEnd(end) {}
+ void operator()(int i) const
+ {
+ BT_PROFILE("PPL_sumJob");
+ mSum->local() += mBody->sumLoop(i, (std::min)(i + mGrainSize, mIndexEnd));
+ }
+ };
+ static btScalar sumFunc(btScalar a, btScalar b) { return a + b; }
+ virtual btScalar parallelSum(int iBegin, int iEnd, int grainSize, const btIParallelSumBody& body) BT_OVERRIDE
+ {
+ BT_PROFILE("parallelSum_PPL");
+ m_sum.clear();
+ SumBodyAdapter pplBody(&body, &m_sum, grainSize, iEnd);
+ btPushThreadsAreRunning();
+ // note: MSVC 2010 doesn't support partitioner args, so avoid them
+ concurrency::parallel_for(iBegin,
+ iEnd,
+ grainSize,
+ pplBody);
+ btPopThreadsAreRunning();
+ return m_sum.combine(sumFunc);
+ }
};
-#endif // #if BT_USE_PPL && BT_THREADSAFE
-
+#endif // #if BT_USE_PPL && BT_THREADSAFE
// create a non-threaded task scheduler (always available)
btITaskScheduler* btGetSequentialTaskScheduler()
{
- static btTaskSchedulerSequential sTaskScheduler;
- return &sTaskScheduler;
+ static btTaskSchedulerSequential sTaskScheduler;
+ return &sTaskScheduler;
}
-
// create an OpenMP task scheduler (if available, otherwise returns null)
btITaskScheduler* btGetOpenMPTaskScheduler()
{
#if BT_USE_OPENMP && BT_THREADSAFE
- static btTaskSchedulerOpenMP sTaskScheduler;
- return &sTaskScheduler;
+ static btTaskSchedulerOpenMP sTaskScheduler;
+ return &sTaskScheduler;
#else
- return NULL;
+ return NULL;
#endif
}
-
// create an Intel TBB task scheduler (if available, otherwise returns null)
btITaskScheduler* btGetTBBTaskScheduler()
{
#if BT_USE_TBB && BT_THREADSAFE
- static btTaskSchedulerTBB sTaskScheduler;
- return &sTaskScheduler;
+ static btTaskSchedulerTBB sTaskScheduler;
+ return &sTaskScheduler;
#else
- return NULL;
+ return NULL;
#endif
}
-
// create a PPL task scheduler (if available, otherwise returns null)
btITaskScheduler* btGetPPLTaskScheduler()
{
#if BT_USE_PPL && BT_THREADSAFE
- static btTaskSchedulerPPL sTaskScheduler;
- return &sTaskScheduler;
+ static btTaskSchedulerPPL sTaskScheduler;
+ return &sTaskScheduler;
#else
- return NULL;
+ return NULL;
#endif
}
-
diff --git a/thirdparty/bullet/LinearMath/btThreads.h b/thirdparty/bullet/LinearMath/btThreads.h
index 921fd088c0..b2227e1724 100644
--- a/thirdparty/bullet/LinearMath/btThreads.h
+++ b/thirdparty/bullet/LinearMath/btThreads.h
@@ -12,14 +12,12 @@ subject to the following restrictions:
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
+#include "btScalar.h" // has definitions like SIMD_FORCE_INLINE
-#if defined (_MSC_VER) && _MSC_VER >= 1600
+#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
@@ -36,7 +34,7 @@ const unsigned int BT_MAX_THREAD_COUNT = 64; // only if BT_THREADSAFE is 1
bool btIsMainThread();
bool btThreadsAreRunning();
unsigned int btGetCurrentThreadIndex();
-void btResetThreadIndexCounter(); // notify that all worker threads have been destroyed
+void btResetThreadIndexCounter(); // notify that all worker threads have been destroyed
///
/// btSpinMutex -- lightweight spin-mutex implemented with atomic ops, never puts
@@ -46,19 +44,18 @@ void btResetThreadIndexCounter(); // notify that all worker threads have been de
///
class btSpinMutex
{
- int mLock;
+ int mLock;
public:
- btSpinMutex()
- {
- mLock = 0;
- }
- void lock();
- void unlock();
- bool tryLock();
+ btSpinMutex()
+ {
+ mLock = 0;
+ }
+ void lock();
+ void unlock();
+ bool tryLock();
};
-
//
// NOTE: btMutex* is for internal Bullet use only
//
@@ -70,43 +67,42 @@ public:
// 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 )
+SIMD_FORCE_INLINE void btMutexLock(btSpinMutex* mutex)
{
#if BT_THREADSAFE
- mutex->lock();
+ mutex->lock();
#else
- (void)mutex;
-#endif // #if BT_THREADSAFE
+ (void)mutex;
+#endif // #if BT_THREADSAFE
}
-SIMD_FORCE_INLINE void btMutexUnlock( btSpinMutex* mutex )
+SIMD_FORCE_INLINE void btMutexUnlock(btSpinMutex* mutex)
{
#if BT_THREADSAFE
- mutex->unlock();
+ mutex->unlock();
#else
- (void)mutex;
-#endif // #if BT_THREADSAFE
+ (void)mutex;
+#endif // #if BT_THREADSAFE
}
-SIMD_FORCE_INLINE bool btMutexTryLock( btSpinMutex* mutex )
+SIMD_FORCE_INLINE bool btMutexTryLock(btSpinMutex* mutex)
{
#if BT_THREADSAFE
- return mutex->tryLock();
+ return mutex->tryLock();
#else
- (void)mutex;
- return true;
-#endif // #if BT_THREADSAFE
+ (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;
+ virtual ~btIParallelForBody() {}
+ virtual void forLoop(int iBegin, int iEnd) const = 0;
};
//
@@ -116,8 +112,8 @@ public:
class btIParallelSumBody
{
public:
- virtual ~btIParallelSumBody() {}
- virtual btScalar sumLoop( int iBegin, int iEnd ) const = 0;
+ virtual ~btIParallelSumBody() {}
+ virtual btScalar sumLoop(int iBegin, int iEnd) const = 0;
};
//
@@ -127,30 +123,30 @@ public:
class btITaskScheduler
{
public:
- btITaskScheduler( const char* name );
- virtual ~btITaskScheduler() {}
- const char* getName() const { return m_name; }
+ 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
+ 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();
+ // internal use only
+ virtual void activate();
+ virtual void deactivate();
protected:
- const char* m_name;
- unsigned int m_savedThreadCounter;
- bool m_isActive;
+ 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 );
+void btSetTaskScheduler(btITaskScheduler* ts);
// get the current task scheduler
btITaskScheduler* btGetTaskScheduler();
@@ -172,11 +168,10 @@ 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 );
+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 );
-
+btScalar btParallelSum(int iBegin, int iEnd, int grainSize, const btIParallelSumBody& body);
#endif
diff --git a/thirdparty/bullet/LinearMath/btTransform.h b/thirdparty/bullet/LinearMath/btTransform.h
index d4f939a5d9..6f2f99818c 100644
--- a/thirdparty/bullet/LinearMath/btTransform.h
+++ b/thirdparty/bullet/LinearMath/btTransform.h
@@ -12,12 +12,9 @@ subject to the following restrictions:
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
@@ -26,46 +23,45 @@ subject to the following restrictions:
#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
+ATTRIBUTE_ALIGNED16(class)
+btTransform
+{
+ ///Storage for the rotation
btMatrix3x3 m_basis;
- ///Storage for the translation
- btVector3 m_origin;
+ ///Storage for the translation
+ btVector3 m_origin;
public:
-
- /**@brief No initialization constructor */
+ /**@brief No initialization constructor */
btTransform() {}
- /**@brief Constructor from btQuaternion (optional btVector3 )
+ /**@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)))
+ explicit SIMD_FORCE_INLINE btTransform(const btQuaternion& q,
+ const btVector3& c = btVector3(btScalar(0), btScalar(0), btScalar(0)))
: m_basis(q),
- m_origin(c)
- {}
+ m_origin(c)
+ {
+ }
- /**@brief Constructor from btMatrix3x3 (optional btVector3)
+ /**@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)))
+ 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_origin(c)
+ {
+ }
+ /**@brief Copy constructor */
+ SIMD_FORCE_INLINE btTransform(const btTransform& other)
: m_basis(other.m_basis),
- m_origin(other.m_origin)
+ m_origin(other.m_origin)
{
}
- /**@brief Assignment Operator */
+ /**@brief Assignment Operator */
SIMD_FORCE_INLINE btTransform& operator=(const btTransform& other)
{
m_basis = other.m_basis;
@@ -73,70 +69,70 @@ public:
return *this;
}
-
- /**@brief Set the current transform as the value of the product of two transforms
+ /**@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);
- }
+ 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) {
+ /* 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 */
+ /**@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;
+ return x.dot3(m_basis[0], m_basis[1], m_basis[2]) + m_origin;
}
- /**@brief Return the transform of the vector */
+ /**@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 */
+ /**@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 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 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 {
+ /**@brief Return a quaternion representing the rotation */
+ btQuaternion getRotation() const
+ {
btQuaternion q;
m_basis.getRotation(q);
return q;
}
-
-
- /**@brief Set from an array
+
+ /**@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)
+ void setFromOpenGLMatrix(const btScalar* m)
{
m_basis.setFromOpenGLSubMatrix(m);
- m_origin.setValue(m[12],m[13],m[14]);
+ m_origin.setValue(m[12], m[13], m[14]);
}
- /**@brief Fill an array representation
+ /**@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
+ void getOpenGLMatrix(btScalar * m) const
{
m_basis.getOpenGLSubMatrix(m);
m[12] = m_origin.x();
@@ -145,80 +141,76 @@ public:
m[15] = btScalar(1.0);
}
- /**@brief Set the translational element
+ /**@brief Set the translational element
* @param origin The vector to set the translation to */
- SIMD_FORCE_INLINE void setOrigin(const btVector3& origin)
- {
+ 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 */
+ /**@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 */
+ /**@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 */
+ /**@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)
+ /**@brief Multiply this Transform by another(this = this * another)
* @param t The other transform */
- btTransform& operator*=(const btTransform& t)
+ 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 */
+ /**@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
+ /**@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;
+ btTransform inverseTimes(const btTransform& t) const;
- /**@brief Return the product of this transform and the other */
+ /**@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()
+ /**@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 serialize(struct btTransformData & dataOut) const;
- void deSerialize(const struct btTransformData& dataIn);
+ void serializeFloat(struct btTransformFloatData & dataOut) const;
- void deSerializeDouble(const struct btTransformDoubleData& dataIn);
+ void deSerialize(const struct btTransformData& dataIn);
- void deSerializeFloat(const struct btTransformFloatData& dataIn);
+ void deSerializeDouble(const struct btTransformDoubleData& dataIn);
+ void deSerializeFloat(const struct btTransformFloatData& dataIn);
};
-
SIMD_FORCE_INLINE btVector3
btTransform::invXform(const btVector3& inVec) const
{
@@ -226,80 +218,69 @@ btTransform::invXform(const btVector3& inVec) const
return (m_basis.transpose() * v);
}
-SIMD_FORCE_INLINE btTransform
-btTransform::inverseTimes(const btTransform& t) const
+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);
+ return btTransform(m_basis.transposeTimes(t.m_basis),
+ v * m_basis);
}
-SIMD_FORCE_INLINE btTransform
-btTransform::operator*(const btTransform& t) const
+SIMD_FORCE_INLINE btTransform
+ btTransform::operator*(const btTransform& t) const
{
- return btTransform(m_basis * t.m_basis,
- (*this)(t.m_origin));
+ 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() );
+ return (t1.getBasis() == t2.getBasis() &&
+ t1.getOrigin() == t2.getOrigin());
}
-
///for serialization
-struct btTransformFloatData
+struct btTransformFloatData
{
- btMatrix3x3FloatData m_basis;
- btVector3FloatData m_origin;
+ btMatrix3x3FloatData m_basis;
+ btVector3FloatData m_origin;
};
-struct btTransformDoubleData
+struct btTransformDoubleData
{
- btMatrix3x3DoubleData m_basis;
- btVector3DoubleData m_origin;
+ btMatrix3x3DoubleData m_basis;
+ btVector3DoubleData m_origin;
};
-
-
-SIMD_FORCE_INLINE void btTransform::serialize(btTransformData& dataOut) const
+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
+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)
+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)
+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)
+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
-
-
-
-
-
-
+#endif //BT_TRANSFORM_H
diff --git a/thirdparty/bullet/LinearMath/btTransformUtil.h b/thirdparty/bullet/LinearMath/btTransformUtil.h
index 182cc43fab..b874dd6807 100644
--- a/thirdparty/bullet/LinearMath/btTransformUtil.h
+++ b/thirdparty/bullet/LinearMath/btTransformUtil.h
@@ -12,77 +12,66 @@ subject to the following restrictions:
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
-
-
-
+#define ANGULAR_MOTION_THRESHOLD btScalar(0.5) * SIMD_HALF_PI
-SIMD_FORCE_INLINE btVector3 btAabbSupport(const btVector3& halfExtents,const btVector3& supportDir)
+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());
+ 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)
+ 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
+ // #define QUATERNION_DERIVATIVE
+#ifdef QUATERNION_DERIVATIVE
btQuaternion predictedOrn = curTrans.getRotation();
predictedOrn += (angvel * predictedOrn) * (timeStep * btScalar(0.5));
predictedOrn.safeNormalize();
- #else
+#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);
- }
+ btScalar fAngle2 = angvel.length2();
+ btScalar fAngle = 0;
+ if (fAngle2 > SIMD_EPSILON)
+ {
+ fAngle = btSqrt(fAngle2);
+ }
//limit the angular motion
- if (fAngle*timeStep > ANGULAR_MOTION_THRESHOLD)
+ if (fAngle * timeStep > ANGULAR_MOTION_THRESHOLD)
{
fAngle = ANGULAR_MOTION_THRESHOLD / timeStep;
}
- if ( fAngle < btScalar(0.001) )
+ 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 );
+ 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 );
+ axis = angvel * (btSin(btScalar(0.5) * fAngle * timeStep) / fAngle);
}
- btQuaternion dorn (axis.x(),axis.y(),axis.z(),btCos( fAngle*timeStep*btScalar(0.5) ));
+ 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)
+#endif
+ if (predictedOrn.length2() > SIMD_EPSILON)
{
predictedTransform.setRotation(predictedOrn);
}
@@ -92,137 +81,133 @@ public:
}
}
- static void calculateVelocityQuaternion(const btVector3& pos0,const btVector3& pos1,const btQuaternion& orn0,const btQuaternion& orn1,btScalar timeStep,btVector3& linVel,btVector3& angVel)
+ 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;
+ btScalar angle;
if (orn0 != orn1)
{
- calculateDiffAxisAngleQuaternion(orn0,orn1,axis,angle);
+ calculateDiffAxisAngleQuaternion(orn0, orn1, axis, angle);
angVel = axis * angle / timeStep;
- } else
+ }
+ else
{
- angVel.setValue(0,0,0);
+ angVel.setValue(0, 0, 0);
}
}
- static void calculateDiffAxisAngleQuaternion(const btQuaternion& orn0,const btQuaternion& orn1a,btVector3& axis,btScalar& angle)
+ 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 = 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.));
+ 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)
+ 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);
+ btScalar angle;
+ calculateDiffAxisAngle(transform0, transform1, axis, angle);
angVel = axis * angle / timeStep;
}
- static void calculateDiffAxisAngle(const btTransform& transform0,const btTransform& transform1,btVector3& axis,btScalar& angle)
+ 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
+ ///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 = 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.));
+ 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
+///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
+class btConvexSeparatingDistanceUtil
{
- btQuaternion m_ornA;
- btQuaternion m_ornB;
- btVector3 m_posA;
- btVector3 m_posB;
-
- btVector3 m_separatingNormal;
+ btQuaternion m_ornA;
+ btQuaternion m_ornB;
+ btVector3 m_posA;
+ btVector3 m_posB;
- btScalar m_boundingRadiusA;
- btScalar m_boundingRadiusB;
- btScalar m_separatingDistance;
+ btVector3 m_separatingNormal;
-public:
+ btScalar m_boundingRadiusA;
+ btScalar m_boundingRadiusB;
+ btScalar m_separatingDistance;
- btConvexSeparatingDistanceUtil(btScalar boundingRadiusA,btScalar boundingRadiusB)
- :m_boundingRadiusA(boundingRadiusA),
- m_boundingRadiusB(boundingRadiusB),
- m_separatingDistance(0.f)
+public:
+ btConvexSeparatingDistanceUtil(btScalar boundingRadiusA, btScalar boundingRadiusB)
+ : m_boundingRadiusA(boundingRadiusA),
+ m_boundingRadiusB(boundingRadiusB),
+ m_separatingDistance(0.f)
{
}
- btScalar getConservativeSeparatingDistance()
+ btScalar getConservativeSeparatingDistance()
{
return m_separatingDistance;
}
- void updateSeparatingDistance(const btTransform& transA,const btTransform& transB)
+ 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)
+ 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);
+ 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);
+ btVector3 relLinVel = (linVelB - linVelA);
btScalar relLinVelocLength = relLinVel.dot(m_separatingNormal);
- if (relLinVelocLength<0.f)
+ if (relLinVelocLength < 0.f)
{
relLinVelocLength = 0.f;
}
-
- btScalar projectedMotion = maxAngularProjectedVelocity +relLinVelocLength;
+
+ 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)
+ void initSeparatingDistance(const btVector3& separatingVector, btScalar separatingDistance, const btTransform& transA, const btTransform& transB)
{
m_separatingDistance = separatingDistance;
- if (m_separatingDistance>0.f)
+ if (m_separatingDistance > 0.f)
{
m_separatingNormal = separatingVector;
-
+
const btVector3& toPosA = transA.getOrigin();
const btVector3& toPosB = transB.getOrigin();
btQuaternion toOrnA = transA.getRotation();
@@ -233,9 +218,6 @@ public:
m_ornB = toOrnB;
}
}
-
};
-
-#endif //BT_TRANSFORM_UTIL_H
-
+#endif //BT_TRANSFORM_UTIL_H
diff --git a/thirdparty/bullet/LinearMath/btVector3.cpp b/thirdparty/bullet/LinearMath/btVector3.cpp
index e05bdccd67..13111157af 100644
--- a/thirdparty/bullet/LinearMath/btVector3.cpp
+++ b/thirdparty/bullet/LinearMath/btVector3.cpp
@@ -15,282 +15,285 @@
This source version has been altered.
*/
-#if defined (_WIN32) || defined (__i386__)
+#if defined(_WIN32) || defined(__i386__)
#define BT_USE_SSE_IN_API
#endif
-
#include "btVector3.h"
-
-
#if defined BT_USE_SIMD_VECTOR3
#if DEBUG
-#include <string.h>//for memset
+#include <string.h> //for memset
#endif
-
#ifdef __APPLE__
#include <stdint.h>
-typedef float float4 __attribute__ ((vector_size(16)));
+typedef float float4 __attribute__((vector_size(16)));
#else
#define float4 __m128
#endif
//typedef uint32_t uint4 __attribute__ ((vector_size(16)));
-
#if defined BT_USE_SSE || defined _WIN32
-#define LOG2_ARRAY_SIZE 6
-#define STACK_ARRAY_COUNT (1UL << LOG2_ARRAY_SIZE)
+#define LOG2_ARRAY_SIZE 6
+#define STACK_ARRAY_COUNT (1UL << LOG2_ARRAY_SIZE)
#include <emmintrin.h>
-long _maxdot_large( const float *vv, const float *vec, unsigned long count, float *dotResult );
-long _maxdot_large( const float *vv, const float *vec, unsigned long count, float *dotResult )
+long _maxdot_large(const float *vv, const float *vec, unsigned long count, float *dotResult);
+long _maxdot_large(const float *vv, const float *vec, unsigned long count, float *dotResult)
{
- const float4 *vertices = (const float4*) vv;
- static const unsigned char indexTable[16] = {(unsigned char)-1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 };
- float4 dotMax = btAssign128( -BT_INFINITY, -BT_INFINITY, -BT_INFINITY, -BT_INFINITY );
- float4 vvec = _mm_loadu_ps( vec );
- float4 vHi = btCastiTo128f(_mm_shuffle_epi32( btCastfTo128i( vvec), 0xaa )); /// zzzz
- float4 vLo = _mm_movelh_ps( vvec, vvec ); /// xyxy
-
- long maxIndex = -1L;
-
- size_t segment = 0;
- float4 stack_array[ STACK_ARRAY_COUNT ];
-
+ const float4 *vertices = (const float4 *)vv;
+ static const unsigned char indexTable[16] = {(unsigned char)-1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0};
+ float4 dotMax = btAssign128(-BT_INFINITY, -BT_INFINITY, -BT_INFINITY, -BT_INFINITY);
+ float4 vvec = _mm_loadu_ps(vec);
+ float4 vHi = btCastiTo128f(_mm_shuffle_epi32(btCastfTo128i(vvec), 0xaa)); /// zzzz
+ float4 vLo = _mm_movelh_ps(vvec, vvec); /// xyxy
+
+ long maxIndex = -1L;
+
+ size_t segment = 0;
+ float4 stack_array[STACK_ARRAY_COUNT];
+
#if DEBUG
- //memset( stack_array, -1, STACK_ARRAY_COUNT * sizeof(stack_array[0]) );
+ //memset( stack_array, -1, STACK_ARRAY_COUNT * sizeof(stack_array[0]) );
#endif
-
- size_t index;
- float4 max;
- // Faster loop without cleanup code for full tiles
- for ( segment = 0; segment + STACK_ARRAY_COUNT*4 <= count; segment += STACK_ARRAY_COUNT*4 )
- {
- max = dotMax;
-
- for( index = 0; index < STACK_ARRAY_COUNT; index+= 4 )
- { // do four dot products at a time. Carefully avoid touching the w element.
- float4 v0 = vertices[0];
- float4 v1 = vertices[1];
- float4 v2 = vertices[2];
- float4 v3 = vertices[3]; vertices += 4;
-
- float4 lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- float4 hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- float4 lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- float4 hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- float4 z = _mm_shuffle_ps(hi0, hi1, 0x88);
- float4 x = _mm_shuffle_ps(lo0, lo1, 0x88);
- float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index] = x;
- max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan
-
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
- v3 = vertices[3]; vertices += 4;
-
- lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- z = _mm_shuffle_ps(hi0, hi1, 0x88);
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index+1] = x;
- max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan
-
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
- v3 = vertices[3]; vertices += 4;
-
- lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- z = _mm_shuffle_ps(hi0, hi1, 0x88);
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index+2] = x;
- max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan
-
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
- v3 = vertices[3]; vertices += 4;
-
- lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- z = _mm_shuffle_ps(hi0, hi1, 0x88);
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index+3] = x;
- max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan
-
- // It is too costly to keep the index of the max here. We will look for it again later. We save a lot of work this way.
- }
-
- // If we found a new max
- if( 0xf != _mm_movemask_ps( (float4) _mm_cmpeq_ps(max, dotMax)))
- {
- // copy the new max across all lanes of our max accumulator
- max = _mm_max_ps(max, (float4) _mm_shuffle_ps( max, max, 0x4e));
- max = _mm_max_ps(max, (float4) _mm_shuffle_ps( max, max, 0xb1));
-
- dotMax = max;
-
- // find first occurrence of that max
- size_t test;
- for( index = 0; 0 == (test=_mm_movemask_ps( _mm_cmpeq_ps( stack_array[index], max))); index++ ) // local_count must be a multiple of 4
- {}
- // record where it is.
- maxIndex = 4*index + segment + indexTable[test];
- }
- }
-
- // account for work we've already done
- count -= segment;
-
- // Deal with the last < STACK_ARRAY_COUNT vectors
- max = dotMax;
- index = 0;
-
-
- if( btUnlikely( count > 16) )
- {
- for( ; index + 4 <= count / 4; index+=4 )
- { // do four dot products at a time. Carefully avoid touching the w element.
- float4 v0 = vertices[0];
- float4 v1 = vertices[1];
- float4 v2 = vertices[2];
- float4 v3 = vertices[3]; vertices += 4;
-
- float4 lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- float4 hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- float4 lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- float4 hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- float4 z = _mm_shuffle_ps(hi0, hi1, 0x88);
- float4 x = _mm_shuffle_ps(lo0, lo1, 0x88);
- float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index] = x;
- max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan
-
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
- v3 = vertices[3]; vertices += 4;
-
- lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- z = _mm_shuffle_ps(hi0, hi1, 0x88);
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index+1] = x;
- max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan
-
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
- v3 = vertices[3]; vertices += 4;
-
- lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- z = _mm_shuffle_ps(hi0, hi1, 0x88);
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index+2] = x;
- max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan
-
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
- v3 = vertices[3]; vertices += 4;
-
- lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- z = _mm_shuffle_ps(hi0, hi1, 0x88);
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index+3] = x;
- max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan
-
- // It is too costly to keep the index of the max here. We will look for it again later. We save a lot of work this way.
- }
- }
-
- size_t localCount = (count & -4L) - 4*index;
- if( localCount )
- {
+
+ size_t index;
+ float4 max;
+ // Faster loop without cleanup code for full tiles
+ for (segment = 0; segment + STACK_ARRAY_COUNT * 4 <= count; segment += STACK_ARRAY_COUNT * 4)
+ {
+ max = dotMax;
+
+ for (index = 0; index < STACK_ARRAY_COUNT; index += 4)
+ { // do four dot products at a time. Carefully avoid touching the w element.
+ float4 v0 = vertices[0];
+ float4 v1 = vertices[1];
+ float4 v2 = vertices[2];
+ float4 v3 = vertices[3];
+ vertices += 4;
+
+ float4 lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ float4 hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ float4 lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ float4 hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ float4 z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ float4 x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index] = x;
+ max = _mm_max_ps(x, max); // control the order here so that max is never NaN even if x is nan
+
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+ v3 = vertices[3];
+ vertices += 4;
+
+ lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index + 1] = x;
+ max = _mm_max_ps(x, max); // control the order here so that max is never NaN even if x is nan
+
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+ v3 = vertices[3];
+ vertices += 4;
+
+ lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index + 2] = x;
+ max = _mm_max_ps(x, max); // control the order here so that max is never NaN even if x is nan
+
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+ v3 = vertices[3];
+ vertices += 4;
+
+ lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index + 3] = x;
+ max = _mm_max_ps(x, max); // control the order here so that max is never NaN even if x is nan
+
+ // It is too costly to keep the index of the max here. We will look for it again later. We save a lot of work this way.
+ }
+
+ // If we found a new max
+ if (0xf != _mm_movemask_ps((float4)_mm_cmpeq_ps(max, dotMax)))
+ {
+ // copy the new max across all lanes of our max accumulator
+ max = _mm_max_ps(max, (float4)_mm_shuffle_ps(max, max, 0x4e));
+ max = _mm_max_ps(max, (float4)_mm_shuffle_ps(max, max, 0xb1));
+
+ dotMax = max;
+
+ // find first occurrence of that max
+ size_t test;
+ for (index = 0; 0 == (test = _mm_movemask_ps(_mm_cmpeq_ps(stack_array[index], max))); index++) // local_count must be a multiple of 4
+ {
+ }
+ // record where it is.
+ maxIndex = 4 * index + segment + indexTable[test];
+ }
+ }
+
+ // account for work we've already done
+ count -= segment;
+
+ // Deal with the last < STACK_ARRAY_COUNT vectors
+ max = dotMax;
+ index = 0;
+
+ if (btUnlikely(count > 16))
+ {
+ for (; index + 4 <= count / 4; index += 4)
+ { // do four dot products at a time. Carefully avoid touching the w element.
+ float4 v0 = vertices[0];
+ float4 v1 = vertices[1];
+ float4 v2 = vertices[2];
+ float4 v3 = vertices[3];
+ vertices += 4;
+
+ float4 lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ float4 hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ float4 lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ float4 hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ float4 z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ float4 x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index] = x;
+ max = _mm_max_ps(x, max); // control the order here so that max is never NaN even if x is nan
+
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+ v3 = vertices[3];
+ vertices += 4;
+
+ lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index + 1] = x;
+ max = _mm_max_ps(x, max); // control the order here so that max is never NaN even if x is nan
+
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+ v3 = vertices[3];
+ vertices += 4;
+
+ lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index + 2] = x;
+ max = _mm_max_ps(x, max); // control the order here so that max is never NaN even if x is nan
+
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+ v3 = vertices[3];
+ vertices += 4;
+
+ lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index + 3] = x;
+ max = _mm_max_ps(x, max); // control the order here so that max is never NaN even if x is nan
+
+ // It is too costly to keep the index of the max here. We will look for it again later. We save a lot of work this way.
+ }
+ }
+
+ size_t localCount = (count & -4L) - 4 * index;
+ if (localCount)
+ {
#ifdef __APPLE__
- float4 t0, t1, t2, t3, t4;
- float4 * sap = &stack_array[index + localCount / 4];
- vertices += localCount; // counter the offset
- size_t byteIndex = -(localCount) * sizeof(float);
- //AT&T Code style assembly
- asm volatile
- ( ".align 4 \n\
+ float4 t0, t1, t2, t3, t4;
+ float4 *sap = &stack_array[index + localCount / 4];
+ vertices += localCount; // counter the offset
+ size_t byteIndex = -(localCount) * sizeof(float);
+ //AT&T Code style assembly
+ asm volatile(
+ ".align 4 \n\
0: movaps %[max], %[t2] // move max out of the way to avoid propagating NaNs in max \n\
movaps (%[vertices], %[byteIndex], 4), %[t0] // vertices[0] \n\
movaps 16(%[vertices], %[byteIndex], 4), %[t1] // vertices[1] \n\
@@ -316,368 +319,374 @@ long _maxdot_large( const float *vv, const float *vec, unsigned long count, floa
add $16, %[byteIndex] // advance loop counter\n\
jnz 0b \n\
"
- : [max] "+x" (max), [t0] "=&x" (t0), [t1] "=&x" (t1), [t2] "=&x" (t2), [t3] "=&x" (t3), [t4] "=&x" (t4), [byteIndex] "+r" (byteIndex)
- : [vLo] "x" (vLo), [vHi] "x" (vHi), [vertices] "r" (vertices), [sap] "r" (sap)
- : "memory", "cc"
- );
- index += localCount/4;
+ : [max] "+x"(max), [t0] "=&x"(t0), [t1] "=&x"(t1), [t2] "=&x"(t2), [t3] "=&x"(t3), [t4] "=&x"(t4), [byteIndex] "+r"(byteIndex)
+ : [vLo] "x"(vLo), [vHi] "x"(vHi), [vertices] "r"(vertices), [sap] "r"(sap)
+ : "memory", "cc");
+ index += localCount / 4;
#else
- {
- for( unsigned int i=0; i<localCount/4; i++,index++)
- { // do four dot products at a time. Carefully avoid touching the w element.
- float4 v0 = vertices[0];
- float4 v1 = vertices[1];
- float4 v2 = vertices[2];
- float4 v3 = vertices[3];
- vertices += 4;
-
- float4 lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- float4 hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- float4 lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- float4 hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- float4 z = _mm_shuffle_ps(hi0, hi1, 0x88);
- float4 x = _mm_shuffle_ps(lo0, lo1, 0x88);
- float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index] = x;
- max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan
- }
- }
-#endif //__APPLE__
- }
-
- // process the last few points
- if( count & 3 )
- {
- float4 v0, v1, v2, x, y, z;
- switch( count & 3 )
- {
- case 3:
- {
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
-
- // Calculate 3 dot products, transpose, duplicate v2
- float4 lo0 = _mm_movelh_ps( v0, v1); // xyxy.lo
- float4 hi0 = _mm_movehl_ps( v1, v0); // z?z?.lo
- lo0 = lo0*vLo;
- z = _mm_shuffle_ps(hi0, v2, 0xa8 ); // z0z1z2z2
- z = z*vHi;
- float4 lo1 = _mm_movelh_ps(v2, v2); // xyxy
- lo1 = lo1*vLo;
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- }
- break;
- case 2:
- {
- v0 = vertices[0];
- v1 = vertices[1];
- float4 xy = _mm_movelh_ps(v0, v1);
- z = _mm_movehl_ps(v1, v0);
- xy = xy*vLo;
- z = _mm_shuffle_ps( z, z, 0xa8);
- x = _mm_shuffle_ps( xy, xy, 0xa8);
- y = _mm_shuffle_ps( xy, xy, 0xfd);
- z = z*vHi;
- }
- break;
- case 1:
- {
- float4 xy = vertices[0];
- z = _mm_shuffle_ps( xy, xy, 0xaa);
- xy = xy*vLo;
- z = z*vHi;
- x = _mm_shuffle_ps(xy, xy, 0);
- y = _mm_shuffle_ps(xy, xy, 0x55);
- }
- break;
- }
- x = x+y;
- x = x+z;
- stack_array[index] = x;
- max = _mm_max_ps( x, max ); // control the order here so that max is never NaN even if x is nan
- index++;
- }
-
- // if we found a new max.
- if( 0 == segment || 0xf != _mm_movemask_ps( (float4) _mm_cmpeq_ps(max, dotMax)))
- { // we found a new max. Search for it
- // find max across the max vector, place in all elements of max -- big latency hit here
- max = _mm_max_ps(max, (float4) _mm_shuffle_ps( max, max, 0x4e));
- max = _mm_max_ps(max, (float4) _mm_shuffle_ps( max, max, 0xb1));
-
- // It is slightly faster to do this part in scalar code when count < 8. However, the common case for
- // this where it actually makes a difference is handled in the early out at the top of the function,
- // so it is less than a 1% difference here. I opted for improved code size, fewer branches and reduced
- // complexity, and removed it.
-
- dotMax = max;
-
- // scan for the first occurence of max in the array
- size_t test;
- for( index = 0; 0 == (test=_mm_movemask_ps( _mm_cmpeq_ps( stack_array[index], max))); index++ ) // local_count must be a multiple of 4
- {}
- maxIndex = 4*index + segment + indexTable[test];
- }
-
- _mm_store_ss( dotResult, dotMax);
- return maxIndex;
+ {
+ for (unsigned int i = 0; i < localCount / 4; i++, index++)
+ { // do four dot products at a time. Carefully avoid touching the w element.
+ float4 v0 = vertices[0];
+ float4 v1 = vertices[1];
+ float4 v2 = vertices[2];
+ float4 v3 = vertices[3];
+ vertices += 4;
+
+ float4 lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ float4 hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ float4 lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ float4 hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ float4 z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ float4 x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index] = x;
+ max = _mm_max_ps(x, max); // control the order here so that max is never NaN even if x is nan
+ }
+ }
+#endif //__APPLE__
+ }
+
+ // process the last few points
+ if (count & 3)
+ {
+ float4 v0, v1, v2, x, y, z;
+ switch (count & 3)
+ {
+ case 3:
+ {
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+
+ // Calculate 3 dot products, transpose, duplicate v2
+ float4 lo0 = _mm_movelh_ps(v0, v1); // xyxy.lo
+ float4 hi0 = _mm_movehl_ps(v1, v0); // z?z?.lo
+ lo0 = lo0 * vLo;
+ z = _mm_shuffle_ps(hi0, v2, 0xa8); // z0z1z2z2
+ z = z * vHi;
+ float4 lo1 = _mm_movelh_ps(v2, v2); // xyxy
+ lo1 = lo1 * vLo;
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ }
+ break;
+ case 2:
+ {
+ v0 = vertices[0];
+ v1 = vertices[1];
+ float4 xy = _mm_movelh_ps(v0, v1);
+ z = _mm_movehl_ps(v1, v0);
+ xy = xy * vLo;
+ z = _mm_shuffle_ps(z, z, 0xa8);
+ x = _mm_shuffle_ps(xy, xy, 0xa8);
+ y = _mm_shuffle_ps(xy, xy, 0xfd);
+ z = z * vHi;
+ }
+ break;
+ case 1:
+ {
+ float4 xy = vertices[0];
+ z = _mm_shuffle_ps(xy, xy, 0xaa);
+ xy = xy * vLo;
+ z = z * vHi;
+ x = _mm_shuffle_ps(xy, xy, 0);
+ y = _mm_shuffle_ps(xy, xy, 0x55);
+ }
+ break;
+ }
+ x = x + y;
+ x = x + z;
+ stack_array[index] = x;
+ max = _mm_max_ps(x, max); // control the order here so that max is never NaN even if x is nan
+ index++;
+ }
+
+ // if we found a new max.
+ if (0 == segment || 0xf != _mm_movemask_ps((float4)_mm_cmpeq_ps(max, dotMax)))
+ { // we found a new max. Search for it
+ // find max across the max vector, place in all elements of max -- big latency hit here
+ max = _mm_max_ps(max, (float4)_mm_shuffle_ps(max, max, 0x4e));
+ max = _mm_max_ps(max, (float4)_mm_shuffle_ps(max, max, 0xb1));
+
+ // It is slightly faster to do this part in scalar code when count < 8. However, the common case for
+ // this where it actually makes a difference is handled in the early out at the top of the function,
+ // so it is less than a 1% difference here. I opted for improved code size, fewer branches and reduced
+ // complexity, and removed it.
+
+ dotMax = max;
+
+ // scan for the first occurence of max in the array
+ size_t test;
+ for (index = 0; 0 == (test = _mm_movemask_ps(_mm_cmpeq_ps(stack_array[index], max))); index++) // local_count must be a multiple of 4
+ {
+ }
+ maxIndex = 4 * index + segment + indexTable[test];
+ }
+
+ _mm_store_ss(dotResult, dotMax);
+ return maxIndex;
}
-long _mindot_large( const float *vv, const float *vec, unsigned long count, float *dotResult );
+long _mindot_large(const float *vv, const float *vec, unsigned long count, float *dotResult);
-long _mindot_large( const float *vv, const float *vec, unsigned long count, float *dotResult )
+long _mindot_large(const float *vv, const float *vec, unsigned long count, float *dotResult)
{
- const float4 *vertices = (const float4*) vv;
- static const unsigned char indexTable[16] = {(unsigned char)-1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 };
- float4 dotmin = btAssign128( BT_INFINITY, BT_INFINITY, BT_INFINITY, BT_INFINITY );
- float4 vvec = _mm_loadu_ps( vec );
- float4 vHi = btCastiTo128f(_mm_shuffle_epi32( btCastfTo128i( vvec), 0xaa )); /// zzzz
- float4 vLo = _mm_movelh_ps( vvec, vvec ); /// xyxy
-
- long minIndex = -1L;
-
- size_t segment = 0;
- float4 stack_array[ STACK_ARRAY_COUNT ];
-
+ const float4 *vertices = (const float4 *)vv;
+ static const unsigned char indexTable[16] = {(unsigned char)-1, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0};
+ float4 dotmin = btAssign128(BT_INFINITY, BT_INFINITY, BT_INFINITY, BT_INFINITY);
+ float4 vvec = _mm_loadu_ps(vec);
+ float4 vHi = btCastiTo128f(_mm_shuffle_epi32(btCastfTo128i(vvec), 0xaa)); /// zzzz
+ float4 vLo = _mm_movelh_ps(vvec, vvec); /// xyxy
+
+ long minIndex = -1L;
+
+ size_t segment = 0;
+ float4 stack_array[STACK_ARRAY_COUNT];
+
#if DEBUG
- //memset( stack_array, -1, STACK_ARRAY_COUNT * sizeof(stack_array[0]) );
+ //memset( stack_array, -1, STACK_ARRAY_COUNT * sizeof(stack_array[0]) );
#endif
-
- size_t index;
- float4 min;
- // Faster loop without cleanup code for full tiles
- for ( segment = 0; segment + STACK_ARRAY_COUNT*4 <= count; segment += STACK_ARRAY_COUNT*4 )
- {
- min = dotmin;
-
- for( index = 0; index < STACK_ARRAY_COUNT; index+= 4 )
- { // do four dot products at a time. Carefully avoid touching the w element.
- float4 v0 = vertices[0];
- float4 v1 = vertices[1];
- float4 v2 = vertices[2];
- float4 v3 = vertices[3]; vertices += 4;
-
- float4 lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- float4 hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- float4 lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- float4 hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- float4 z = _mm_shuffle_ps(hi0, hi1, 0x88);
- float4 x = _mm_shuffle_ps(lo0, lo1, 0x88);
- float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index] = x;
- min = _mm_min_ps( x, min ); // control the order here so that min is never NaN even if x is nan
-
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
- v3 = vertices[3]; vertices += 4;
-
- lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- z = _mm_shuffle_ps(hi0, hi1, 0x88);
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index+1] = x;
- min = _mm_min_ps( x, min ); // control the order here so that min is never NaN even if x is nan
-
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
- v3 = vertices[3]; vertices += 4;
-
- lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- z = _mm_shuffle_ps(hi0, hi1, 0x88);
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index+2] = x;
- min = _mm_min_ps( x, min ); // control the order here so that min is never NaN even if x is nan
-
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
- v3 = vertices[3]; vertices += 4;
-
- lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- z = _mm_shuffle_ps(hi0, hi1, 0x88);
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index+3] = x;
- min = _mm_min_ps( x, min ); // control the order here so that min is never NaN even if x is nan
-
- // It is too costly to keep the index of the min here. We will look for it again later. We save a lot of work this way.
- }
-
- // If we found a new min
- if( 0xf != _mm_movemask_ps( (float4) _mm_cmpeq_ps(min, dotmin)))
- {
- // copy the new min across all lanes of our min accumulator
- min = _mm_min_ps(min, (float4) _mm_shuffle_ps( min, min, 0x4e));
- min = _mm_min_ps(min, (float4) _mm_shuffle_ps( min, min, 0xb1));
-
- dotmin = min;
-
- // find first occurrence of that min
- size_t test;
- for( index = 0; 0 == (test=_mm_movemask_ps( _mm_cmpeq_ps( stack_array[index], min))); index++ ) // local_count must be a multiple of 4
- {}
- // record where it is.
- minIndex = 4*index + segment + indexTable[test];
- }
- }
-
- // account for work we've already done
- count -= segment;
-
- // Deal with the last < STACK_ARRAY_COUNT vectors
- min = dotmin;
- index = 0;
-
-
- if(btUnlikely( count > 16) )
- {
- for( ; index + 4 <= count / 4; index+=4 )
- { // do four dot products at a time. Carefully avoid touching the w element.
- float4 v0 = vertices[0];
- float4 v1 = vertices[1];
- float4 v2 = vertices[2];
- float4 v3 = vertices[3]; vertices += 4;
-
- float4 lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- float4 hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- float4 lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- float4 hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- float4 z = _mm_shuffle_ps(hi0, hi1, 0x88);
- float4 x = _mm_shuffle_ps(lo0, lo1, 0x88);
- float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index] = x;
- min = _mm_min_ps( x, min ); // control the order here so that min is never NaN even if x is nan
-
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
- v3 = vertices[3]; vertices += 4;
-
- lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- z = _mm_shuffle_ps(hi0, hi1, 0x88);
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index+1] = x;
- min = _mm_min_ps( x, min ); // control the order here so that min is never NaN even if x is nan
-
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
- v3 = vertices[3]; vertices += 4;
-
- lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- z = _mm_shuffle_ps(hi0, hi1, 0x88);
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index+2] = x;
- min = _mm_min_ps( x, min ); // control the order here so that min is never NaN even if x is nan
-
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
- v3 = vertices[3]; vertices += 4;
-
- lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- z = _mm_shuffle_ps(hi0, hi1, 0x88);
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index+3] = x;
- min = _mm_min_ps( x, min ); // control the order here so that min is never NaN even if x is nan
-
- // It is too costly to keep the index of the min here. We will look for it again later. We save a lot of work this way.
- }
- }
-
- size_t localCount = (count & -4L) - 4*index;
- if( localCount )
- {
-
-
+
+ size_t index;
+ float4 min;
+ // Faster loop without cleanup code for full tiles
+ for (segment = 0; segment + STACK_ARRAY_COUNT * 4 <= count; segment += STACK_ARRAY_COUNT * 4)
+ {
+ min = dotmin;
+
+ for (index = 0; index < STACK_ARRAY_COUNT; index += 4)
+ { // do four dot products at a time. Carefully avoid touching the w element.
+ float4 v0 = vertices[0];
+ float4 v1 = vertices[1];
+ float4 v2 = vertices[2];
+ float4 v3 = vertices[3];
+ vertices += 4;
+
+ float4 lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ float4 hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ float4 lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ float4 hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ float4 z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ float4 x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index] = x;
+ min = _mm_min_ps(x, min); // control the order here so that min is never NaN even if x is nan
+
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+ v3 = vertices[3];
+ vertices += 4;
+
+ lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index + 1] = x;
+ min = _mm_min_ps(x, min); // control the order here so that min is never NaN even if x is nan
+
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+ v3 = vertices[3];
+ vertices += 4;
+
+ lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index + 2] = x;
+ min = _mm_min_ps(x, min); // control the order here so that min is never NaN even if x is nan
+
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+ v3 = vertices[3];
+ vertices += 4;
+
+ lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index + 3] = x;
+ min = _mm_min_ps(x, min); // control the order here so that min is never NaN even if x is nan
+
+ // It is too costly to keep the index of the min here. We will look for it again later. We save a lot of work this way.
+ }
+
+ // If we found a new min
+ if (0xf != _mm_movemask_ps((float4)_mm_cmpeq_ps(min, dotmin)))
+ {
+ // copy the new min across all lanes of our min accumulator
+ min = _mm_min_ps(min, (float4)_mm_shuffle_ps(min, min, 0x4e));
+ min = _mm_min_ps(min, (float4)_mm_shuffle_ps(min, min, 0xb1));
+
+ dotmin = min;
+
+ // find first occurrence of that min
+ size_t test;
+ for (index = 0; 0 == (test = _mm_movemask_ps(_mm_cmpeq_ps(stack_array[index], min))); index++) // local_count must be a multiple of 4
+ {
+ }
+ // record where it is.
+ minIndex = 4 * index + segment + indexTable[test];
+ }
+ }
+
+ // account for work we've already done
+ count -= segment;
+
+ // Deal with the last < STACK_ARRAY_COUNT vectors
+ min = dotmin;
+ index = 0;
+
+ if (btUnlikely(count > 16))
+ {
+ for (; index + 4 <= count / 4; index += 4)
+ { // do four dot products at a time. Carefully avoid touching the w element.
+ float4 v0 = vertices[0];
+ float4 v1 = vertices[1];
+ float4 v2 = vertices[2];
+ float4 v3 = vertices[3];
+ vertices += 4;
+
+ float4 lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ float4 hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ float4 lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ float4 hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ float4 z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ float4 x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index] = x;
+ min = _mm_min_ps(x, min); // control the order here so that min is never NaN even if x is nan
+
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+ v3 = vertices[3];
+ vertices += 4;
+
+ lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index + 1] = x;
+ min = _mm_min_ps(x, min); // control the order here so that min is never NaN even if x is nan
+
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+ v3 = vertices[3];
+ vertices += 4;
+
+ lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index + 2] = x;
+ min = _mm_min_ps(x, min); // control the order here so that min is never NaN even if x is nan
+
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+ v3 = vertices[3];
+ vertices += 4;
+
+ lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index + 3] = x;
+ min = _mm_min_ps(x, min); // control the order here so that min is never NaN even if x is nan
+
+ // It is too costly to keep the index of the min here. We will look for it again later. We save a lot of work this way.
+ }
+ }
+
+ size_t localCount = (count & -4L) - 4 * index;
+ if (localCount)
+ {
#ifdef __APPLE__
- vertices += localCount; // counter the offset
- float4 t0, t1, t2, t3, t4;
- size_t byteIndex = -(localCount) * sizeof(float);
- float4 * sap = &stack_array[index + localCount / 4];
-
- asm volatile
- ( ".align 4 \n\
+ vertices += localCount; // counter the offset
+ float4 t0, t1, t2, t3, t4;
+ size_t byteIndex = -(localCount) * sizeof(float);
+ float4 *sap = &stack_array[index + localCount / 4];
+
+ asm volatile(
+ ".align 4 \n\
0: movaps %[min], %[t2] // move min out of the way to avoid propagating NaNs in min \n\
movaps (%[vertices], %[byteIndex], 4), %[t0] // vertices[0] \n\
movaps 16(%[vertices], %[byteIndex], 4), %[t1] // vertices[1] \n\
@@ -703,968 +712,953 @@ long _mindot_large( const float *vv, const float *vec, unsigned long count, floa
add $16, %[byteIndex] // advance loop counter\n\
jnz 0b \n\
"
- : [min] "+x" (min), [t0] "=&x" (t0), [t1] "=&x" (t1), [t2] "=&x" (t2), [t3] "=&x" (t3), [t4] "=&x" (t4), [byteIndex] "+r" (byteIndex)
- : [vLo] "x" (vLo), [vHi] "x" (vHi), [vertices] "r" (vertices), [sap] "r" (sap)
- : "memory", "cc"
- );
- index += localCount/4;
+ : [min] "+x"(min), [t0] "=&x"(t0), [t1] "=&x"(t1), [t2] "=&x"(t2), [t3] "=&x"(t3), [t4] "=&x"(t4), [byteIndex] "+r"(byteIndex)
+ : [vLo] "x"(vLo), [vHi] "x"(vHi), [vertices] "r"(vertices), [sap] "r"(sap)
+ : "memory", "cc");
+ index += localCount / 4;
#else
- {
- for( unsigned int i=0; i<localCount/4; i++,index++)
- { // do four dot products at a time. Carefully avoid touching the w element.
- float4 v0 = vertices[0];
- float4 v1 = vertices[1];
- float4 v2 = vertices[2];
- float4 v3 = vertices[3];
- vertices += 4;
-
- float4 lo0 = _mm_movelh_ps( v0, v1); // x0y0x1y1
- float4 hi0 = _mm_movehl_ps( v1, v0); // z0?0z1?1
- float4 lo1 = _mm_movelh_ps( v2, v3); // x2y2x3y3
- float4 hi1 = _mm_movehl_ps( v3, v2); // z2?2z3?3
-
- lo0 = lo0*vLo;
- lo1 = lo1*vLo;
- float4 z = _mm_shuffle_ps(hi0, hi1, 0x88);
- float4 x = _mm_shuffle_ps(lo0, lo1, 0x88);
- float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- z = z*vHi;
- x = x+y;
- x = x+z;
- stack_array[index] = x;
- min = _mm_min_ps( x, min ); // control the order here so that max is never NaN even if x is nan
- }
- }
+ {
+ for (unsigned int i = 0; i < localCount / 4; i++, index++)
+ { // do four dot products at a time. Carefully avoid touching the w element.
+ float4 v0 = vertices[0];
+ float4 v1 = vertices[1];
+ float4 v2 = vertices[2];
+ float4 v3 = vertices[3];
+ vertices += 4;
+
+ float4 lo0 = _mm_movelh_ps(v0, v1); // x0y0x1y1
+ float4 hi0 = _mm_movehl_ps(v1, v0); // z0?0z1?1
+ float4 lo1 = _mm_movelh_ps(v2, v3); // x2y2x3y3
+ float4 hi1 = _mm_movehl_ps(v3, v2); // z2?2z3?3
+
+ lo0 = lo0 * vLo;
+ lo1 = lo1 * vLo;
+ float4 z = _mm_shuffle_ps(hi0, hi1, 0x88);
+ float4 x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ float4 y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ z = z * vHi;
+ x = x + y;
+ x = x + z;
+ stack_array[index] = x;
+ min = _mm_min_ps(x, min); // control the order here so that max is never NaN even if x is nan
+ }
+ }
#endif
- }
-
- // process the last few points
- if( count & 3 )
- {
- float4 v0, v1, v2, x, y, z;
- switch( count & 3 )
- {
- case 3:
- {
- v0 = vertices[0];
- v1 = vertices[1];
- v2 = vertices[2];
-
- // Calculate 3 dot products, transpose, duplicate v2
- float4 lo0 = _mm_movelh_ps( v0, v1); // xyxy.lo
- float4 hi0 = _mm_movehl_ps( v1, v0); // z?z?.lo
- lo0 = lo0*vLo;
- z = _mm_shuffle_ps(hi0, v2, 0xa8 ); // z0z1z2z2
- z = z*vHi;
- float4 lo1 = _mm_movelh_ps(v2, v2); // xyxy
- lo1 = lo1*vLo;
- x = _mm_shuffle_ps(lo0, lo1, 0x88);
- y = _mm_shuffle_ps(lo0, lo1, 0xdd);
- }
- break;
- case 2:
- {
- v0 = vertices[0];
- v1 = vertices[1];
- float4 xy = _mm_movelh_ps(v0, v1);
- z = _mm_movehl_ps(v1, v0);
- xy = xy*vLo;
- z = _mm_shuffle_ps( z, z, 0xa8);
- x = _mm_shuffle_ps( xy, xy, 0xa8);
- y = _mm_shuffle_ps( xy, xy, 0xfd);
- z = z*vHi;
- }
- break;
- case 1:
- {
- float4 xy = vertices[0];
- z = _mm_shuffle_ps( xy, xy, 0xaa);
- xy = xy*vLo;
- z = z*vHi;
- x = _mm_shuffle_ps(xy, xy, 0);
- y = _mm_shuffle_ps(xy, xy, 0x55);
- }
- break;
- }
- x = x+y;
- x = x+z;
- stack_array[index] = x;
- min = _mm_min_ps( x, min ); // control the order here so that min is never NaN even if x is nan
- index++;
- }
-
- // if we found a new min.
- if( 0 == segment || 0xf != _mm_movemask_ps( (float4) _mm_cmpeq_ps(min, dotmin)))
- { // we found a new min. Search for it
- // find min across the min vector, place in all elements of min -- big latency hit here
- min = _mm_min_ps(min, (float4) _mm_shuffle_ps( min, min, 0x4e));
- min = _mm_min_ps(min, (float4) _mm_shuffle_ps( min, min, 0xb1));
-
- // It is slightly faster to do this part in scalar code when count < 8. However, the common case for
- // this where it actually makes a difference is handled in the early out at the top of the function,
- // so it is less than a 1% difference here. I opted for improved code size, fewer branches and reduced
- // complexity, and removed it.
-
- dotmin = min;
-
- // scan for the first occurence of min in the array
- size_t test;
- for( index = 0; 0 == (test=_mm_movemask_ps( _mm_cmpeq_ps( stack_array[index], min))); index++ ) // local_count must be a multiple of 4
- {}
- minIndex = 4*index + segment + indexTable[test];
- }
-
- _mm_store_ss( dotResult, dotmin);
- return minIndex;
-}
+ }
+
+ // process the last few points
+ if (count & 3)
+ {
+ float4 v0, v1, v2, x, y, z;
+ switch (count & 3)
+ {
+ case 3:
+ {
+ v0 = vertices[0];
+ v1 = vertices[1];
+ v2 = vertices[2];
+
+ // Calculate 3 dot products, transpose, duplicate v2
+ float4 lo0 = _mm_movelh_ps(v0, v1); // xyxy.lo
+ float4 hi0 = _mm_movehl_ps(v1, v0); // z?z?.lo
+ lo0 = lo0 * vLo;
+ z = _mm_shuffle_ps(hi0, v2, 0xa8); // z0z1z2z2
+ z = z * vHi;
+ float4 lo1 = _mm_movelh_ps(v2, v2); // xyxy
+ lo1 = lo1 * vLo;
+ x = _mm_shuffle_ps(lo0, lo1, 0x88);
+ y = _mm_shuffle_ps(lo0, lo1, 0xdd);
+ }
+ break;
+ case 2:
+ {
+ v0 = vertices[0];
+ v1 = vertices[1];
+ float4 xy = _mm_movelh_ps(v0, v1);
+ z = _mm_movehl_ps(v1, v0);
+ xy = xy * vLo;
+ z = _mm_shuffle_ps(z, z, 0xa8);
+ x = _mm_shuffle_ps(xy, xy, 0xa8);
+ y = _mm_shuffle_ps(xy, xy, 0xfd);
+ z = z * vHi;
+ }
+ break;
+ case 1:
+ {
+ float4 xy = vertices[0];
+ z = _mm_shuffle_ps(xy, xy, 0xaa);
+ xy = xy * vLo;
+ z = z * vHi;
+ x = _mm_shuffle_ps(xy, xy, 0);
+ y = _mm_shuffle_ps(xy, xy, 0x55);
+ }
+ break;
+ }
+ x = x + y;
+ x = x + z;
+ stack_array[index] = x;
+ min = _mm_min_ps(x, min); // control the order here so that min is never NaN even if x is nan
+ index++;
+ }
+
+ // if we found a new min.
+ if (0 == segment || 0xf != _mm_movemask_ps((float4)_mm_cmpeq_ps(min, dotmin)))
+ { // we found a new min. Search for it
+ // find min across the min vector, place in all elements of min -- big latency hit here
+ min = _mm_min_ps(min, (float4)_mm_shuffle_ps(min, min, 0x4e));
+ min = _mm_min_ps(min, (float4)_mm_shuffle_ps(min, min, 0xb1));
+
+ // It is slightly faster to do this part in scalar code when count < 8. However, the common case for
+ // this where it actually makes a difference is handled in the early out at the top of the function,
+ // so it is less than a 1% difference here. I opted for improved code size, fewer branches and reduced
+ // complexity, and removed it.
+
+ dotmin = min;
+ // scan for the first occurence of min in the array
+ size_t test;
+ for (index = 0; 0 == (test = _mm_movemask_ps(_mm_cmpeq_ps(stack_array[index], min))); index++) // local_count must be a multiple of 4
+ {
+ }
+ minIndex = 4 * index + segment + indexTable[test];
+ }
+
+ _mm_store_ss(dotResult, dotmin);
+ return minIndex;
+}
#elif defined BT_USE_NEON
-#define ARM_NEON_GCC_COMPATIBILITY 1
+#define ARM_NEON_GCC_COMPATIBILITY 1
#include <arm_neon.h>
#include <sys/types.h>
-#include <sys/sysctl.h> //for sysctlbyname
+#include <sys/sysctl.h> //for sysctlbyname
-static long _maxdot_large_v0( const float *vv, const float *vec, unsigned long count, float *dotResult );
-static long _maxdot_large_v1( const float *vv, const float *vec, unsigned long count, float *dotResult );
-static long _maxdot_large_sel( const float *vv, const float *vec, unsigned long count, float *dotResult );
-static long _mindot_large_v0( const float *vv, const float *vec, unsigned long count, float *dotResult );
-static long _mindot_large_v1( const float *vv, const float *vec, unsigned long count, float *dotResult );
-static long _mindot_large_sel( const float *vv, const float *vec, unsigned long count, float *dotResult );
+static long _maxdot_large_v0(const float *vv, const float *vec, unsigned long count, float *dotResult);
+static long _maxdot_large_v1(const float *vv, const float *vec, unsigned long count, float *dotResult);
+static long _maxdot_large_sel(const float *vv, const float *vec, unsigned long count, float *dotResult);
+static long _mindot_large_v0(const float *vv, const float *vec, unsigned long count, float *dotResult);
+static long _mindot_large_v1(const float *vv, const float *vec, unsigned long count, float *dotResult);
+static long _mindot_large_sel(const float *vv, const float *vec, unsigned long count, float *dotResult);
-long (*_maxdot_large)( const float *vv, const float *vec, unsigned long count, float *dotResult ) = _maxdot_large_sel;
-long (*_mindot_large)( const float *vv, const float *vec, unsigned long count, float *dotResult ) = _mindot_large_sel;
+long (*_maxdot_large)(const float *vv, const float *vec, unsigned long count, float *dotResult) = _maxdot_large_sel;
+long (*_mindot_large)(const float *vv, const float *vec, unsigned long count, float *dotResult) = _mindot_large_sel;
-
-static inline uint32_t btGetCpuCapabilities( void )
+static inline uint32_t btGetCpuCapabilities(void)
{
- static uint32_t capabilities = 0;
- static bool testedCapabilities = false;
+ static uint32_t capabilities = 0;
+ static bool testedCapabilities = false;
- if( 0 == testedCapabilities)
- {
- uint32_t hasFeature = 0;
- size_t featureSize = sizeof( hasFeature );
- int err = sysctlbyname( "hw.optional.neon_hpfp", &hasFeature, &featureSize, NULL, 0 );
+ if (0 == testedCapabilities)
+ {
+ 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 |= 0x2000;
+ if (0 == err && hasFeature)
+ capabilities |= 0x2000;
testedCapabilities = true;
- }
-
- return capabilities;
-}
-
-
+ }
+ return capabilities;
+}
-static long _maxdot_large_sel( const float *vv, const float *vec, unsigned long count, float *dotResult )
+static long _maxdot_large_sel(const float *vv, const float *vec, unsigned long count, float *dotResult)
{
+ if (btGetCpuCapabilities() & 0x2000)
+ _maxdot_large = _maxdot_large_v1;
+ else
+ _maxdot_large = _maxdot_large_v0;
- if( btGetCpuCapabilities() & 0x2000 )
- _maxdot_large = _maxdot_large_v1;
- else
- _maxdot_large = _maxdot_large_v0;
-
- return _maxdot_large(vv, vec, count, dotResult);
+ return _maxdot_large(vv, vec, count, dotResult);
}
-static long _mindot_large_sel( const float *vv, const float *vec, unsigned long count, float *dotResult )
+static long _mindot_large_sel(const float *vv, const float *vec, unsigned long count, float *dotResult)
{
+ if (btGetCpuCapabilities() & 0x2000)
+ _mindot_large = _mindot_large_v1;
+ else
+ _mindot_large = _mindot_large_v0;
- if( btGetCpuCapabilities() & 0x2000 )
- _mindot_large = _mindot_large_v1;
- else
- _mindot_large = _mindot_large_v0;
-
- return _mindot_large(vv, vec, count, dotResult);
+ return _mindot_large(vv, vec, count, dotResult);
}
-
-
#if defined __arm__
-# define vld1q_f32_aligned_postincrement( _ptr ) ({ float32x4_t _r; asm( "vld1.f32 {%0}, [%1, :128]!\n" : "=w" (_r), "+r" (_ptr) ); /*return*/ _r; })
+#define vld1q_f32_aligned_postincrement(_ptr) ({ float32x4_t _r; asm( "vld1.f32 {%0}, [%1, :128]!\n" : "=w" (_r), "+r" (_ptr) ); /*return*/ _r; })
#else
//support 64bit arm
-# define vld1q_f32_aligned_postincrement( _ptr) ({ float32x4_t _r = ((float32x4_t*)(_ptr))[0]; (_ptr) = (const float*) ((const char*)(_ptr) + 16L); /*return*/ _r; })
+#define vld1q_f32_aligned_postincrement(_ptr) ({ float32x4_t _r = ((float32x4_t*)(_ptr))[0]; (_ptr) = (const float*) ((const char*)(_ptr) + 16L); /*return*/ _r; })
#endif
-
-long _maxdot_large_v0( const float *vv, const float *vec, unsigned long count, float *dotResult )
+long _maxdot_large_v0(const float *vv, const float *vec, unsigned long count, float *dotResult)
{
- unsigned long i = 0;
- float32x4_t vvec = vld1q_f32_aligned_postincrement( vec );
- float32x2_t vLo = vget_low_f32(vvec);
- float32x2_t vHi = vdup_lane_f32(vget_high_f32(vvec), 0);
- float32x2_t dotMaxLo = (float32x2_t) { -BT_INFINITY, -BT_INFINITY };
- float32x2_t dotMaxHi = (float32x2_t) { -BT_INFINITY, -BT_INFINITY };
- uint32x2_t indexLo = (uint32x2_t) {0, 1};
- uint32x2_t indexHi = (uint32x2_t) {2, 3};
- uint32x2_t iLo = (uint32x2_t) {static_cast<uint32_t>(-1), static_cast<uint32_t>(-1)};
- uint32x2_t iHi = (uint32x2_t) {static_cast<uint32_t>(-1), static_cast<uint32_t>(-1)};
- const uint32x2_t four = (uint32x2_t) {4,4};
-
- for( ; i+8 <= count; i+= 8 )
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v2 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v3 = vld1q_f32_aligned_postincrement( vv );
-
- float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo);
- float32x2_t xy1 = vmul_f32( vget_low_f32(v1), vLo);
- float32x2_t xy2 = vmul_f32( vget_low_f32(v2), vLo);
- float32x2_t xy3 = vmul_f32( vget_low_f32(v3), vLo);
-
- float32x2x2_t z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x2x2_t z1 = vtrn_f32( vget_high_f32(v2), vget_high_f32(v3));
- float32x2_t zLo = vmul_f32( z0.val[0], vHi);
- float32x2_t zHi = vmul_f32( z1.val[0], vHi);
-
- float32x2_t rLo = vpadd_f32( xy0, xy1);
- float32x2_t rHi = vpadd_f32( xy2, xy3);
- rLo = vadd_f32(rLo, zLo);
- rHi = vadd_f32(rHi, zHi);
-
- uint32x2_t maskLo = vcgt_f32( rLo, dotMaxLo );
- uint32x2_t maskHi = vcgt_f32( rHi, dotMaxHi );
- dotMaxLo = vbsl_f32( maskLo, rLo, dotMaxLo);
- dotMaxHi = vbsl_f32( maskHi, rHi, dotMaxHi);
- iLo = vbsl_u32(maskLo, indexLo, iLo);
- iHi = vbsl_u32(maskHi, indexHi, iHi);
- indexLo = vadd_u32(indexLo, four);
- indexHi = vadd_u32(indexHi, four);
-
- v0 = vld1q_f32_aligned_postincrement( vv );
- v1 = vld1q_f32_aligned_postincrement( vv );
- v2 = vld1q_f32_aligned_postincrement( vv );
- v3 = vld1q_f32_aligned_postincrement( vv );
-
- xy0 = vmul_f32( vget_low_f32(v0), vLo);
- xy1 = vmul_f32( vget_low_f32(v1), vLo);
- xy2 = vmul_f32( vget_low_f32(v2), vLo);
- xy3 = vmul_f32( vget_low_f32(v3), vLo);
-
- z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1));
- z1 = vtrn_f32( vget_high_f32(v2), vget_high_f32(v3));
- zLo = vmul_f32( z0.val[0], vHi);
- zHi = vmul_f32( z1.val[0], vHi);
-
- rLo = vpadd_f32( xy0, xy1);
- rHi = vpadd_f32( xy2, xy3);
- rLo = vadd_f32(rLo, zLo);
- rHi = vadd_f32(rHi, zHi);
-
- maskLo = vcgt_f32( rLo, dotMaxLo );
- maskHi = vcgt_f32( rHi, dotMaxHi );
- dotMaxLo = vbsl_f32( maskLo, rLo, dotMaxLo);
- dotMaxHi = vbsl_f32( maskHi, rHi, dotMaxHi);
- iLo = vbsl_u32(maskLo, indexLo, iLo);
- iHi = vbsl_u32(maskHi, indexHi, iHi);
- indexLo = vadd_u32(indexLo, four);
- indexHi = vadd_u32(indexHi, four);
- }
-
- for( ; i+4 <= count; i+= 4 )
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v2 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v3 = vld1q_f32_aligned_postincrement( vv );
-
- float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo);
- float32x2_t xy1 = vmul_f32( vget_low_f32(v1), vLo);
- float32x2_t xy2 = vmul_f32( vget_low_f32(v2), vLo);
- float32x2_t xy3 = vmul_f32( vget_low_f32(v3), vLo);
-
- float32x2x2_t z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x2x2_t z1 = vtrn_f32( vget_high_f32(v2), vget_high_f32(v3));
- float32x2_t zLo = vmul_f32( z0.val[0], vHi);
- float32x2_t zHi = vmul_f32( z1.val[0], vHi);
-
- float32x2_t rLo = vpadd_f32( xy0, xy1);
- float32x2_t rHi = vpadd_f32( xy2, xy3);
- rLo = vadd_f32(rLo, zLo);
- rHi = vadd_f32(rHi, zHi);
-
- uint32x2_t maskLo = vcgt_f32( rLo, dotMaxLo );
- uint32x2_t maskHi = vcgt_f32( rHi, dotMaxHi );
- dotMaxLo = vbsl_f32( maskLo, rLo, dotMaxLo);
- dotMaxHi = vbsl_f32( maskHi, rHi, dotMaxHi);
- iLo = vbsl_u32(maskLo, indexLo, iLo);
- iHi = vbsl_u32(maskHi, indexHi, iHi);
- indexLo = vadd_u32(indexLo, four);
- indexHi = vadd_u32(indexHi, four);
- }
-
- switch( count & 3 )
- {
- case 3:
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v2 = vld1q_f32_aligned_postincrement( vv );
-
- float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo);
- float32x2_t xy1 = vmul_f32( vget_low_f32(v1), vLo);
- float32x2_t xy2 = vmul_f32( vget_low_f32(v2), vLo);
-
- float32x2x2_t z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x2_t zLo = vmul_f32( z0.val[0], vHi);
- float32x2_t zHi = vmul_f32( vdup_lane_f32(vget_high_f32(v2), 0), vHi);
-
- float32x2_t rLo = vpadd_f32( xy0, xy1);
- float32x2_t rHi = vpadd_f32( xy2, xy2);
- rLo = vadd_f32(rLo, zLo);
- rHi = vadd_f32(rHi, zHi);
-
- uint32x2_t maskLo = vcgt_f32( rLo, dotMaxLo );
- uint32x2_t maskHi = vcgt_f32( rHi, dotMaxHi );
- dotMaxLo = vbsl_f32( maskLo, rLo, dotMaxLo);
- dotMaxHi = vbsl_f32( maskHi, rHi, dotMaxHi);
- iLo = vbsl_u32(maskLo, indexLo, iLo);
- iHi = vbsl_u32(maskHi, indexHi, iHi);
- }
- break;
- case 2:
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
-
- float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo);
- float32x2_t xy1 = vmul_f32( vget_low_f32(v1), vLo);
-
- float32x2x2_t z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x2_t zLo = vmul_f32( z0.val[0], vHi);
-
- float32x2_t rLo = vpadd_f32( xy0, xy1);
- rLo = vadd_f32(rLo, zLo);
-
- uint32x2_t maskLo = vcgt_f32( rLo, dotMaxLo );
- dotMaxLo = vbsl_f32( maskLo, rLo, dotMaxLo);
- iLo = vbsl_u32(maskLo, indexLo, iLo);
- }
- break;
- case 1:
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo);
- float32x2_t z0 = vdup_lane_f32(vget_high_f32(v0), 0);
- float32x2_t zLo = vmul_f32( z0, vHi);
- float32x2_t rLo = vpadd_f32( xy0, xy0);
- rLo = vadd_f32(rLo, zLo);
- uint32x2_t maskLo = vcgt_f32( rLo, dotMaxLo );
- dotMaxLo = vbsl_f32( maskLo, rLo, dotMaxLo);
- iLo = vbsl_u32(maskLo, indexLo, iLo);
- }
- break;
-
- default:
- break;
- }
-
- // select best answer between hi and lo results
- uint32x2_t mask = vcgt_f32( dotMaxHi, dotMaxLo );
- dotMaxLo = vbsl_f32(mask, dotMaxHi, dotMaxLo);
- iLo = vbsl_u32(mask, iHi, iLo);
-
- // select best answer between even and odd results
- dotMaxHi = vdup_lane_f32(dotMaxLo, 1);
- iHi = vdup_lane_u32(iLo, 1);
- mask = vcgt_f32( dotMaxHi, dotMaxLo );
- dotMaxLo = vbsl_f32(mask, dotMaxHi, dotMaxLo);
- iLo = vbsl_u32(mask, iHi, iLo);
-
- *dotResult = vget_lane_f32( dotMaxLo, 0);
- return vget_lane_u32(iLo, 0);
-}
+ unsigned long i = 0;
+ float32x4_t vvec = vld1q_f32_aligned_postincrement(vec);
+ float32x2_t vLo = vget_low_f32(vvec);
+ float32x2_t vHi = vdup_lane_f32(vget_high_f32(vvec), 0);
+ float32x2_t dotMaxLo = (float32x2_t){-BT_INFINITY, -BT_INFINITY};
+ float32x2_t dotMaxHi = (float32x2_t){-BT_INFINITY, -BT_INFINITY};
+ uint32x2_t indexLo = (uint32x2_t){0, 1};
+ uint32x2_t indexHi = (uint32x2_t){2, 3};
+ uint32x2_t iLo = (uint32x2_t){static_cast<uint32_t>(-1), static_cast<uint32_t>(-1)};
+ uint32x2_t iHi = (uint32x2_t){static_cast<uint32_t>(-1), static_cast<uint32_t>(-1)};
+ const uint32x2_t four = (uint32x2_t){4, 4};
+
+ for (; i + 8 <= count; i += 8)
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v2 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v3 = vld1q_f32_aligned_postincrement(vv);
+
+ float32x2_t xy0 = vmul_f32(vget_low_f32(v0), vLo);
+ float32x2_t xy1 = vmul_f32(vget_low_f32(v1), vLo);
+ float32x2_t xy2 = vmul_f32(vget_low_f32(v2), vLo);
+ float32x2_t xy3 = vmul_f32(vget_low_f32(v3), vLo);
+
+ float32x2x2_t z0 = vtrn_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x2x2_t z1 = vtrn_f32(vget_high_f32(v2), vget_high_f32(v3));
+ float32x2_t zLo = vmul_f32(z0.val[0], vHi);
+ float32x2_t zHi = vmul_f32(z1.val[0], vHi);
+
+ float32x2_t rLo = vpadd_f32(xy0, xy1);
+ float32x2_t rHi = vpadd_f32(xy2, xy3);
+ rLo = vadd_f32(rLo, zLo);
+ rHi = vadd_f32(rHi, zHi);
+
+ uint32x2_t maskLo = vcgt_f32(rLo, dotMaxLo);
+ uint32x2_t maskHi = vcgt_f32(rHi, dotMaxHi);
+ dotMaxLo = vbsl_f32(maskLo, rLo, dotMaxLo);
+ dotMaxHi = vbsl_f32(maskHi, rHi, dotMaxHi);
+ iLo = vbsl_u32(maskLo, indexLo, iLo);
+ iHi = vbsl_u32(maskHi, indexHi, iHi);
+ indexLo = vadd_u32(indexLo, four);
+ indexHi = vadd_u32(indexHi, four);
+
+ v0 = vld1q_f32_aligned_postincrement(vv);
+ v1 = vld1q_f32_aligned_postincrement(vv);
+ v2 = vld1q_f32_aligned_postincrement(vv);
+ v3 = vld1q_f32_aligned_postincrement(vv);
+
+ xy0 = vmul_f32(vget_low_f32(v0), vLo);
+ xy1 = vmul_f32(vget_low_f32(v1), vLo);
+ xy2 = vmul_f32(vget_low_f32(v2), vLo);
+ xy3 = vmul_f32(vget_low_f32(v3), vLo);
+
+ z0 = vtrn_f32(vget_high_f32(v0), vget_high_f32(v1));
+ z1 = vtrn_f32(vget_high_f32(v2), vget_high_f32(v3));
+ zLo = vmul_f32(z0.val[0], vHi);
+ zHi = vmul_f32(z1.val[0], vHi);
+
+ rLo = vpadd_f32(xy0, xy1);
+ rHi = vpadd_f32(xy2, xy3);
+ rLo = vadd_f32(rLo, zLo);
+ rHi = vadd_f32(rHi, zHi);
+
+ maskLo = vcgt_f32(rLo, dotMaxLo);
+ maskHi = vcgt_f32(rHi, dotMaxHi);
+ dotMaxLo = vbsl_f32(maskLo, rLo, dotMaxLo);
+ dotMaxHi = vbsl_f32(maskHi, rHi, dotMaxHi);
+ iLo = vbsl_u32(maskLo, indexLo, iLo);
+ iHi = vbsl_u32(maskHi, indexHi, iHi);
+ indexLo = vadd_u32(indexLo, four);
+ indexHi = vadd_u32(indexHi, four);
+ }
+ for (; i + 4 <= count; i += 4)
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v2 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v3 = vld1q_f32_aligned_postincrement(vv);
-long _maxdot_large_v1( const float *vv, const float *vec, unsigned long count, float *dotResult )
+ float32x2_t xy0 = vmul_f32(vget_low_f32(v0), vLo);
+ float32x2_t xy1 = vmul_f32(vget_low_f32(v1), vLo);
+ float32x2_t xy2 = vmul_f32(vget_low_f32(v2), vLo);
+ float32x2_t xy3 = vmul_f32(vget_low_f32(v3), vLo);
+
+ float32x2x2_t z0 = vtrn_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x2x2_t z1 = vtrn_f32(vget_high_f32(v2), vget_high_f32(v3));
+ float32x2_t zLo = vmul_f32(z0.val[0], vHi);
+ float32x2_t zHi = vmul_f32(z1.val[0], vHi);
+
+ float32x2_t rLo = vpadd_f32(xy0, xy1);
+ float32x2_t rHi = vpadd_f32(xy2, xy3);
+ rLo = vadd_f32(rLo, zLo);
+ rHi = vadd_f32(rHi, zHi);
+
+ uint32x2_t maskLo = vcgt_f32(rLo, dotMaxLo);
+ uint32x2_t maskHi = vcgt_f32(rHi, dotMaxHi);
+ dotMaxLo = vbsl_f32(maskLo, rLo, dotMaxLo);
+ dotMaxHi = vbsl_f32(maskHi, rHi, dotMaxHi);
+ iLo = vbsl_u32(maskLo, indexLo, iLo);
+ iHi = vbsl_u32(maskHi, indexHi, iHi);
+ indexLo = vadd_u32(indexLo, four);
+ indexHi = vadd_u32(indexHi, four);
+ }
+
+ switch (count & 3)
+ {
+ case 3:
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v2 = vld1q_f32_aligned_postincrement(vv);
+
+ float32x2_t xy0 = vmul_f32(vget_low_f32(v0), vLo);
+ float32x2_t xy1 = vmul_f32(vget_low_f32(v1), vLo);
+ float32x2_t xy2 = vmul_f32(vget_low_f32(v2), vLo);
+
+ float32x2x2_t z0 = vtrn_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x2_t zLo = vmul_f32(z0.val[0], vHi);
+ float32x2_t zHi = vmul_f32(vdup_lane_f32(vget_high_f32(v2), 0), vHi);
+
+ float32x2_t rLo = vpadd_f32(xy0, xy1);
+ float32x2_t rHi = vpadd_f32(xy2, xy2);
+ rLo = vadd_f32(rLo, zLo);
+ rHi = vadd_f32(rHi, zHi);
+
+ uint32x2_t maskLo = vcgt_f32(rLo, dotMaxLo);
+ uint32x2_t maskHi = vcgt_f32(rHi, dotMaxHi);
+ dotMaxLo = vbsl_f32(maskLo, rLo, dotMaxLo);
+ dotMaxHi = vbsl_f32(maskHi, rHi, dotMaxHi);
+ iLo = vbsl_u32(maskLo, indexLo, iLo);
+ iHi = vbsl_u32(maskHi, indexHi, iHi);
+ }
+ break;
+ case 2:
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+
+ float32x2_t xy0 = vmul_f32(vget_low_f32(v0), vLo);
+ float32x2_t xy1 = vmul_f32(vget_low_f32(v1), vLo);
+
+ float32x2x2_t z0 = vtrn_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x2_t zLo = vmul_f32(z0.val[0], vHi);
+
+ float32x2_t rLo = vpadd_f32(xy0, xy1);
+ rLo = vadd_f32(rLo, zLo);
+
+ uint32x2_t maskLo = vcgt_f32(rLo, dotMaxLo);
+ dotMaxLo = vbsl_f32(maskLo, rLo, dotMaxLo);
+ iLo = vbsl_u32(maskLo, indexLo, iLo);
+ }
+ break;
+ case 1:
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x2_t xy0 = vmul_f32(vget_low_f32(v0), vLo);
+ float32x2_t z0 = vdup_lane_f32(vget_high_f32(v0), 0);
+ float32x2_t zLo = vmul_f32(z0, vHi);
+ float32x2_t rLo = vpadd_f32(xy0, xy0);
+ rLo = vadd_f32(rLo, zLo);
+ uint32x2_t maskLo = vcgt_f32(rLo, dotMaxLo);
+ dotMaxLo = vbsl_f32(maskLo, rLo, dotMaxLo);
+ iLo = vbsl_u32(maskLo, indexLo, iLo);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ // select best answer between hi and lo results
+ uint32x2_t mask = vcgt_f32(dotMaxHi, dotMaxLo);
+ dotMaxLo = vbsl_f32(mask, dotMaxHi, dotMaxLo);
+ iLo = vbsl_u32(mask, iHi, iLo);
+
+ // select best answer between even and odd results
+ dotMaxHi = vdup_lane_f32(dotMaxLo, 1);
+ iHi = vdup_lane_u32(iLo, 1);
+ mask = vcgt_f32(dotMaxHi, dotMaxLo);
+ dotMaxLo = vbsl_f32(mask, dotMaxHi, dotMaxLo);
+ iLo = vbsl_u32(mask, iHi, iLo);
+
+ *dotResult = vget_lane_f32(dotMaxLo, 0);
+ return vget_lane_u32(iLo, 0);
+}
+
+long _maxdot_large_v1(const float *vv, const float *vec, unsigned long count, float *dotResult)
{
- float32x4_t vvec = vld1q_f32_aligned_postincrement( vec );
- float32x4_t vLo = vcombine_f32(vget_low_f32(vvec), vget_low_f32(vvec));
- float32x4_t vHi = vdupq_lane_f32(vget_high_f32(vvec), 0);
- const uint32x4_t four = (uint32x4_t){ 4, 4, 4, 4 };
- uint32x4_t local_index = (uint32x4_t) {0, 1, 2, 3};
- uint32x4_t index = (uint32x4_t) { static_cast<uint32_t>(-1), static_cast<uint32_t>(-1), static_cast<uint32_t>(-1), static_cast<uint32_t>(-1) };
- float32x4_t maxDot = (float32x4_t) { -BT_INFINITY, -BT_INFINITY, -BT_INFINITY, -BT_INFINITY };
-
- unsigned long i = 0;
- for( ; i + 8 <= count; i += 8 )
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v2 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v3 = vld1q_f32_aligned_postincrement( vv );
-
- // the next two lines should resolve to a single vswp d, d
- float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1));
- float32x4_t xy1 = vcombine_f32( vget_low_f32(v2), vget_low_f32(v3));
- // the next two lines should resolve to a single vswp d, d
- float32x4_t z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x4_t z1 = vcombine_f32( vget_high_f32(v2), vget_high_f32(v3));
-
- xy0 = vmulq_f32(xy0, vLo);
- xy1 = vmulq_f32(xy1, vLo);
-
- float32x4x2_t zb = vuzpq_f32( z0, z1);
- float32x4_t z = vmulq_f32( zb.val[0], vHi);
- float32x4x2_t xy = vuzpq_f32( xy0, xy1);
- float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
- x = vaddq_f32(x, z);
-
- uint32x4_t mask = vcgtq_f32(x, maxDot);
- maxDot = vbslq_f32( mask, x, maxDot);
- index = vbslq_u32(mask, local_index, index);
- local_index = vaddq_u32(local_index, four);
-
- v0 = vld1q_f32_aligned_postincrement( vv );
- v1 = vld1q_f32_aligned_postincrement( vv );
- v2 = vld1q_f32_aligned_postincrement( vv );
- v3 = vld1q_f32_aligned_postincrement( vv );
-
- // the next two lines should resolve to a single vswp d, d
- xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1));
- xy1 = vcombine_f32( vget_low_f32(v2), vget_low_f32(v3));
- // the next two lines should resolve to a single vswp d, d
- z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1));
- z1 = vcombine_f32( vget_high_f32(v2), vget_high_f32(v3));
-
- xy0 = vmulq_f32(xy0, vLo);
- xy1 = vmulq_f32(xy1, vLo);
-
- zb = vuzpq_f32( z0, z1);
- z = vmulq_f32( zb.val[0], vHi);
- xy = vuzpq_f32( xy0, xy1);
- x = vaddq_f32(xy.val[0], xy.val[1]);
- x = vaddq_f32(x, z);
-
- mask = vcgtq_f32(x, maxDot);
- maxDot = vbslq_f32( mask, x, maxDot);
- index = vbslq_u32(mask, local_index, index);
- local_index = vaddq_u32(local_index, four);
- }
-
- for( ; i + 4 <= count; i += 4 )
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v2 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v3 = vld1q_f32_aligned_postincrement( vv );
-
- // the next two lines should resolve to a single vswp d, d
- float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1));
- float32x4_t xy1 = vcombine_f32( vget_low_f32(v2), vget_low_f32(v3));
- // the next two lines should resolve to a single vswp d, d
- float32x4_t z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x4_t z1 = vcombine_f32( vget_high_f32(v2), vget_high_f32(v3));
-
- xy0 = vmulq_f32(xy0, vLo);
- xy1 = vmulq_f32(xy1, vLo);
-
- float32x4x2_t zb = vuzpq_f32( z0, z1);
- float32x4_t z = vmulq_f32( zb.val[0], vHi);
- float32x4x2_t xy = vuzpq_f32( xy0, xy1);
- float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
- x = vaddq_f32(x, z);
-
- uint32x4_t mask = vcgtq_f32(x, maxDot);
- maxDot = vbslq_f32( mask, x, maxDot);
- index = vbslq_u32(mask, local_index, index);
- local_index = vaddq_u32(local_index, four);
- }
-
- switch (count & 3) {
- case 3:
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v2 = vld1q_f32_aligned_postincrement( vv );
-
- // the next two lines should resolve to a single vswp d, d
- float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1));
- float32x4_t xy1 = vcombine_f32( vget_low_f32(v2), vget_low_f32(v2));
- // the next two lines should resolve to a single vswp d, d
- float32x4_t z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x4_t z1 = vcombine_f32( vget_high_f32(v2), vget_high_f32(v2));
-
- xy0 = vmulq_f32(xy0, vLo);
- xy1 = vmulq_f32(xy1, vLo);
-
- float32x4x2_t zb = vuzpq_f32( z0, z1);
- float32x4_t z = vmulq_f32( zb.val[0], vHi);
- float32x4x2_t xy = vuzpq_f32( xy0, xy1);
- float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
- x = vaddq_f32(x, z);
-
- uint32x4_t mask = vcgtq_f32(x, maxDot);
- maxDot = vbslq_f32( mask, x, maxDot);
- index = vbslq_u32(mask, local_index, index);
- local_index = vaddq_u32(local_index, four);
- }
- break;
-
- case 2:
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
-
- // the next two lines should resolve to a single vswp d, d
- float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1));
- // the next two lines should resolve to a single vswp d, d
- float32x4_t z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1));
-
- xy0 = vmulq_f32(xy0, vLo);
-
- float32x4x2_t zb = vuzpq_f32( z0, z0);
- float32x4_t z = vmulq_f32( zb.val[0], vHi);
- float32x4x2_t xy = vuzpq_f32( xy0, xy0);
- float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
- x = vaddq_f32(x, z);
-
- uint32x4_t mask = vcgtq_f32(x, maxDot);
- maxDot = vbslq_f32( mask, x, maxDot);
- index = vbslq_u32(mask, local_index, index);
- local_index = vaddq_u32(local_index, four);
- }
- break;
-
- case 1:
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
-
- // the next two lines should resolve to a single vswp d, d
- float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v0));
- // the next two lines should resolve to a single vswp d, d
- float32x4_t z = vdupq_lane_f32(vget_high_f32(v0), 0);
-
- xy0 = vmulq_f32(xy0, vLo);
-
- z = vmulq_f32( z, vHi);
- float32x4x2_t xy = vuzpq_f32( xy0, xy0);
- float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
- x = vaddq_f32(x, z);
-
- uint32x4_t mask = vcgtq_f32(x, maxDot);
- maxDot = vbslq_f32( mask, x, maxDot);
- index = vbslq_u32(mask, local_index, index);
- local_index = vaddq_u32(local_index, four);
- }
- break;
-
- default:
- break;
- }
-
-
- // select best answer between hi and lo results
- uint32x2_t mask = vcgt_f32( vget_high_f32(maxDot), vget_low_f32(maxDot));
- float32x2_t maxDot2 = vbsl_f32(mask, vget_high_f32(maxDot), vget_low_f32(maxDot));
- uint32x2_t index2 = vbsl_u32(mask, vget_high_u32(index), vget_low_u32(index));
-
- // select best answer between even and odd results
- float32x2_t maxDotO = vdup_lane_f32(maxDot2, 1);
- uint32x2_t indexHi = vdup_lane_u32(index2, 1);
- mask = vcgt_f32( maxDotO, maxDot2 );
- maxDot2 = vbsl_f32(mask, maxDotO, maxDot2);
- index2 = vbsl_u32(mask, indexHi, index2);
-
- *dotResult = vget_lane_f32( maxDot2, 0);
- return vget_lane_u32(index2, 0);
-
+ float32x4_t vvec = vld1q_f32_aligned_postincrement(vec);
+ float32x4_t vLo = vcombine_f32(vget_low_f32(vvec), vget_low_f32(vvec));
+ float32x4_t vHi = vdupq_lane_f32(vget_high_f32(vvec), 0);
+ const uint32x4_t four = (uint32x4_t){4, 4, 4, 4};
+ uint32x4_t local_index = (uint32x4_t){0, 1, 2, 3};
+ uint32x4_t index = (uint32x4_t){static_cast<uint32_t>(-1), static_cast<uint32_t>(-1), static_cast<uint32_t>(-1), static_cast<uint32_t>(-1)};
+ float32x4_t maxDot = (float32x4_t){-BT_INFINITY, -BT_INFINITY, -BT_INFINITY, -BT_INFINITY};
+
+ unsigned long i = 0;
+ for (; i + 8 <= count; i += 8)
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v2 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v3 = vld1q_f32_aligned_postincrement(vv);
+
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t xy0 = vcombine_f32(vget_low_f32(v0), vget_low_f32(v1));
+ float32x4_t xy1 = vcombine_f32(vget_low_f32(v2), vget_low_f32(v3));
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t z0 = vcombine_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x4_t z1 = vcombine_f32(vget_high_f32(v2), vget_high_f32(v3));
+
+ xy0 = vmulq_f32(xy0, vLo);
+ xy1 = vmulq_f32(xy1, vLo);
+
+ float32x4x2_t zb = vuzpq_f32(z0, z1);
+ float32x4_t z = vmulq_f32(zb.val[0], vHi);
+ float32x4x2_t xy = vuzpq_f32(xy0, xy1);
+ float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
+ x = vaddq_f32(x, z);
+
+ uint32x4_t mask = vcgtq_f32(x, maxDot);
+ maxDot = vbslq_f32(mask, x, maxDot);
+ index = vbslq_u32(mask, local_index, index);
+ local_index = vaddq_u32(local_index, four);
+
+ v0 = vld1q_f32_aligned_postincrement(vv);
+ v1 = vld1q_f32_aligned_postincrement(vv);
+ v2 = vld1q_f32_aligned_postincrement(vv);
+ v3 = vld1q_f32_aligned_postincrement(vv);
+
+ // the next two lines should resolve to a single vswp d, d
+ xy0 = vcombine_f32(vget_low_f32(v0), vget_low_f32(v1));
+ xy1 = vcombine_f32(vget_low_f32(v2), vget_low_f32(v3));
+ // the next two lines should resolve to a single vswp d, d
+ z0 = vcombine_f32(vget_high_f32(v0), vget_high_f32(v1));
+ z1 = vcombine_f32(vget_high_f32(v2), vget_high_f32(v3));
+
+ xy0 = vmulq_f32(xy0, vLo);
+ xy1 = vmulq_f32(xy1, vLo);
+
+ zb = vuzpq_f32(z0, z1);
+ z = vmulq_f32(zb.val[0], vHi);
+ xy = vuzpq_f32(xy0, xy1);
+ x = vaddq_f32(xy.val[0], xy.val[1]);
+ x = vaddq_f32(x, z);
+
+ mask = vcgtq_f32(x, maxDot);
+ maxDot = vbslq_f32(mask, x, maxDot);
+ index = vbslq_u32(mask, local_index, index);
+ local_index = vaddq_u32(local_index, four);
+ }
+
+ for (; i + 4 <= count; i += 4)
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v2 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v3 = vld1q_f32_aligned_postincrement(vv);
+
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t xy0 = vcombine_f32(vget_low_f32(v0), vget_low_f32(v1));
+ float32x4_t xy1 = vcombine_f32(vget_low_f32(v2), vget_low_f32(v3));
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t z0 = vcombine_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x4_t z1 = vcombine_f32(vget_high_f32(v2), vget_high_f32(v3));
+
+ xy0 = vmulq_f32(xy0, vLo);
+ xy1 = vmulq_f32(xy1, vLo);
+
+ float32x4x2_t zb = vuzpq_f32(z0, z1);
+ float32x4_t z = vmulq_f32(zb.val[0], vHi);
+ float32x4x2_t xy = vuzpq_f32(xy0, xy1);
+ float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
+ x = vaddq_f32(x, z);
+
+ uint32x4_t mask = vcgtq_f32(x, maxDot);
+ maxDot = vbslq_f32(mask, x, maxDot);
+ index = vbslq_u32(mask, local_index, index);
+ local_index = vaddq_u32(local_index, four);
+ }
+
+ switch (count & 3)
+ {
+ case 3:
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v2 = vld1q_f32_aligned_postincrement(vv);
+
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t xy0 = vcombine_f32(vget_low_f32(v0), vget_low_f32(v1));
+ float32x4_t xy1 = vcombine_f32(vget_low_f32(v2), vget_low_f32(v2));
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t z0 = vcombine_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x4_t z1 = vcombine_f32(vget_high_f32(v2), vget_high_f32(v2));
+
+ xy0 = vmulq_f32(xy0, vLo);
+ xy1 = vmulq_f32(xy1, vLo);
+
+ float32x4x2_t zb = vuzpq_f32(z0, z1);
+ float32x4_t z = vmulq_f32(zb.val[0], vHi);
+ float32x4x2_t xy = vuzpq_f32(xy0, xy1);
+ float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
+ x = vaddq_f32(x, z);
+
+ uint32x4_t mask = vcgtq_f32(x, maxDot);
+ maxDot = vbslq_f32(mask, x, maxDot);
+ index = vbslq_u32(mask, local_index, index);
+ local_index = vaddq_u32(local_index, four);
+ }
+ break;
+
+ case 2:
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t xy0 = vcombine_f32(vget_low_f32(v0), vget_low_f32(v1));
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t z0 = vcombine_f32(vget_high_f32(v0), vget_high_f32(v1));
+
+ xy0 = vmulq_f32(xy0, vLo);
+
+ float32x4x2_t zb = vuzpq_f32(z0, z0);
+ float32x4_t z = vmulq_f32(zb.val[0], vHi);
+ float32x4x2_t xy = vuzpq_f32(xy0, xy0);
+ float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
+ x = vaddq_f32(x, z);
+
+ uint32x4_t mask = vcgtq_f32(x, maxDot);
+ maxDot = vbslq_f32(mask, x, maxDot);
+ index = vbslq_u32(mask, local_index, index);
+ local_index = vaddq_u32(local_index, four);
+ }
+ break;
+
+ case 1:
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t xy0 = vcombine_f32(vget_low_f32(v0), vget_low_f32(v0));
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t z = vdupq_lane_f32(vget_high_f32(v0), 0);
+
+ xy0 = vmulq_f32(xy0, vLo);
+
+ z = vmulq_f32(z, vHi);
+ float32x4x2_t xy = vuzpq_f32(xy0, xy0);
+ float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
+ x = vaddq_f32(x, z);
+
+ uint32x4_t mask = vcgtq_f32(x, maxDot);
+ maxDot = vbslq_f32(mask, x, maxDot);
+ index = vbslq_u32(mask, local_index, index);
+ local_index = vaddq_u32(local_index, four);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ // select best answer between hi and lo results
+ uint32x2_t mask = vcgt_f32(vget_high_f32(maxDot), vget_low_f32(maxDot));
+ float32x2_t maxDot2 = vbsl_f32(mask, vget_high_f32(maxDot), vget_low_f32(maxDot));
+ uint32x2_t index2 = vbsl_u32(mask, vget_high_u32(index), vget_low_u32(index));
+
+ // select best answer between even and odd results
+ float32x2_t maxDotO = vdup_lane_f32(maxDot2, 1);
+ uint32x2_t indexHi = vdup_lane_u32(index2, 1);
+ mask = vcgt_f32(maxDotO, maxDot2);
+ maxDot2 = vbsl_f32(mask, maxDotO, maxDot2);
+ index2 = vbsl_u32(mask, indexHi, index2);
+
+ *dotResult = vget_lane_f32(maxDot2, 0);
+ return vget_lane_u32(index2, 0);
}
-long _mindot_large_v0( const float *vv, const float *vec, unsigned long count, float *dotResult )
+long _mindot_large_v0(const float *vv, const float *vec, unsigned long count, float *dotResult)
{
- unsigned long i = 0;
- float32x4_t vvec = vld1q_f32_aligned_postincrement( vec );
- float32x2_t vLo = vget_low_f32(vvec);
- float32x2_t vHi = vdup_lane_f32(vget_high_f32(vvec), 0);
- float32x2_t dotMinLo = (float32x2_t) { BT_INFINITY, BT_INFINITY };
- float32x2_t dotMinHi = (float32x2_t) { BT_INFINITY, BT_INFINITY };
- uint32x2_t indexLo = (uint32x2_t) {0, 1};
- uint32x2_t indexHi = (uint32x2_t) {2, 3};
- uint32x2_t iLo = (uint32x2_t) {static_cast<uint32_t>(-1), static_cast<uint32_t>(-1)};
- uint32x2_t iHi = (uint32x2_t) {static_cast<uint32_t>(-1), static_cast<uint32_t>(-1)};
- const uint32x2_t four = (uint32x2_t) {4,4};
-
- for( ; i+8 <= count; i+= 8 )
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v2 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v3 = vld1q_f32_aligned_postincrement( vv );
-
- float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo);
- float32x2_t xy1 = vmul_f32( vget_low_f32(v1), vLo);
- float32x2_t xy2 = vmul_f32( vget_low_f32(v2), vLo);
- float32x2_t xy3 = vmul_f32( vget_low_f32(v3), vLo);
-
- float32x2x2_t z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x2x2_t z1 = vtrn_f32( vget_high_f32(v2), vget_high_f32(v3));
- float32x2_t zLo = vmul_f32( z0.val[0], vHi);
- float32x2_t zHi = vmul_f32( z1.val[0], vHi);
-
- float32x2_t rLo = vpadd_f32( xy0, xy1);
- float32x2_t rHi = vpadd_f32( xy2, xy3);
- rLo = vadd_f32(rLo, zLo);
- rHi = vadd_f32(rHi, zHi);
-
- uint32x2_t maskLo = vclt_f32( rLo, dotMinLo );
- uint32x2_t maskHi = vclt_f32( rHi, dotMinHi );
- dotMinLo = vbsl_f32( maskLo, rLo, dotMinLo);
- dotMinHi = vbsl_f32( maskHi, rHi, dotMinHi);
- iLo = vbsl_u32(maskLo, indexLo, iLo);
- iHi = vbsl_u32(maskHi, indexHi, iHi);
- indexLo = vadd_u32(indexLo, four);
- indexHi = vadd_u32(indexHi, four);
-
- v0 = vld1q_f32_aligned_postincrement( vv );
- v1 = vld1q_f32_aligned_postincrement( vv );
- v2 = vld1q_f32_aligned_postincrement( vv );
- v3 = vld1q_f32_aligned_postincrement( vv );
-
- xy0 = vmul_f32( vget_low_f32(v0), vLo);
- xy1 = vmul_f32( vget_low_f32(v1), vLo);
- xy2 = vmul_f32( vget_low_f32(v2), vLo);
- xy3 = vmul_f32( vget_low_f32(v3), vLo);
-
- z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1));
- z1 = vtrn_f32( vget_high_f32(v2), vget_high_f32(v3));
- zLo = vmul_f32( z0.val[0], vHi);
- zHi = vmul_f32( z1.val[0], vHi);
-
- rLo = vpadd_f32( xy0, xy1);
- rHi = vpadd_f32( xy2, xy3);
- rLo = vadd_f32(rLo, zLo);
- rHi = vadd_f32(rHi, zHi);
-
- maskLo = vclt_f32( rLo, dotMinLo );
- maskHi = vclt_f32( rHi, dotMinHi );
- dotMinLo = vbsl_f32( maskLo, rLo, dotMinLo);
- dotMinHi = vbsl_f32( maskHi, rHi, dotMinHi);
- iLo = vbsl_u32(maskLo, indexLo, iLo);
- iHi = vbsl_u32(maskHi, indexHi, iHi);
- indexLo = vadd_u32(indexLo, four);
- indexHi = vadd_u32(indexHi, four);
- }
-
- for( ; i+4 <= count; i+= 4 )
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v2 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v3 = vld1q_f32_aligned_postincrement( vv );
-
- float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo);
- float32x2_t xy1 = vmul_f32( vget_low_f32(v1), vLo);
- float32x2_t xy2 = vmul_f32( vget_low_f32(v2), vLo);
- float32x2_t xy3 = vmul_f32( vget_low_f32(v3), vLo);
-
- float32x2x2_t z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x2x2_t z1 = vtrn_f32( vget_high_f32(v2), vget_high_f32(v3));
- float32x2_t zLo = vmul_f32( z0.val[0], vHi);
- float32x2_t zHi = vmul_f32( z1.val[0], vHi);
-
- float32x2_t rLo = vpadd_f32( xy0, xy1);
- float32x2_t rHi = vpadd_f32( xy2, xy3);
- rLo = vadd_f32(rLo, zLo);
- rHi = vadd_f32(rHi, zHi);
-
- uint32x2_t maskLo = vclt_f32( rLo, dotMinLo );
- uint32x2_t maskHi = vclt_f32( rHi, dotMinHi );
- dotMinLo = vbsl_f32( maskLo, rLo, dotMinLo);
- dotMinHi = vbsl_f32( maskHi, rHi, dotMinHi);
- iLo = vbsl_u32(maskLo, indexLo, iLo);
- iHi = vbsl_u32(maskHi, indexHi, iHi);
- indexLo = vadd_u32(indexLo, four);
- indexHi = vadd_u32(indexHi, four);
- }
- switch( count & 3 )
- {
- case 3:
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v2 = vld1q_f32_aligned_postincrement( vv );
-
- float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo);
- float32x2_t xy1 = vmul_f32( vget_low_f32(v1), vLo);
- float32x2_t xy2 = vmul_f32( vget_low_f32(v2), vLo);
-
- float32x2x2_t z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x2_t zLo = vmul_f32( z0.val[0], vHi);
- float32x2_t zHi = vmul_f32( vdup_lane_f32(vget_high_f32(v2), 0), vHi);
-
- float32x2_t rLo = vpadd_f32( xy0, xy1);
- float32x2_t rHi = vpadd_f32( xy2, xy2);
- rLo = vadd_f32(rLo, zLo);
- rHi = vadd_f32(rHi, zHi);
-
- uint32x2_t maskLo = vclt_f32( rLo, dotMinLo );
- uint32x2_t maskHi = vclt_f32( rHi, dotMinHi );
- dotMinLo = vbsl_f32( maskLo, rLo, dotMinLo);
- dotMinHi = vbsl_f32( maskHi, rHi, dotMinHi);
- iLo = vbsl_u32(maskLo, indexLo, iLo);
- iHi = vbsl_u32(maskHi, indexHi, iHi);
- }
- break;
- case 2:
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
-
- float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo);
- float32x2_t xy1 = vmul_f32( vget_low_f32(v1), vLo);
-
- float32x2x2_t z0 = vtrn_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x2_t zLo = vmul_f32( z0.val[0], vHi);
-
- float32x2_t rLo = vpadd_f32( xy0, xy1);
- rLo = vadd_f32(rLo, zLo);
-
- uint32x2_t maskLo = vclt_f32( rLo, dotMinLo );
- dotMinLo = vbsl_f32( maskLo, rLo, dotMinLo);
- iLo = vbsl_u32(maskLo, indexLo, iLo);
- }
- break;
- case 1:
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x2_t xy0 = vmul_f32( vget_low_f32(v0), vLo);
- float32x2_t z0 = vdup_lane_f32(vget_high_f32(v0), 0);
- float32x2_t zLo = vmul_f32( z0, vHi);
- float32x2_t rLo = vpadd_f32( xy0, xy0);
- rLo = vadd_f32(rLo, zLo);
- uint32x2_t maskLo = vclt_f32( rLo, dotMinLo );
- dotMinLo = vbsl_f32( maskLo, rLo, dotMinLo);
- iLo = vbsl_u32(maskLo, indexLo, iLo);
- }
- break;
-
- default:
- break;
- }
-
- // select best answer between hi and lo results
- uint32x2_t mask = vclt_f32( dotMinHi, dotMinLo );
- dotMinLo = vbsl_f32(mask, dotMinHi, dotMinLo);
- iLo = vbsl_u32(mask, iHi, iLo);
-
- // select best answer between even and odd results
- dotMinHi = vdup_lane_f32(dotMinLo, 1);
- iHi = vdup_lane_u32(iLo, 1);
- mask = vclt_f32( dotMinHi, dotMinLo );
- dotMinLo = vbsl_f32(mask, dotMinHi, dotMinLo);
- iLo = vbsl_u32(mask, iHi, iLo);
-
- *dotResult = vget_lane_f32( dotMinLo, 0);
- return vget_lane_u32(iLo, 0);
+ unsigned long i = 0;
+ float32x4_t vvec = vld1q_f32_aligned_postincrement(vec);
+ float32x2_t vLo = vget_low_f32(vvec);
+ float32x2_t vHi = vdup_lane_f32(vget_high_f32(vvec), 0);
+ float32x2_t dotMinLo = (float32x2_t){BT_INFINITY, BT_INFINITY};
+ float32x2_t dotMinHi = (float32x2_t){BT_INFINITY, BT_INFINITY};
+ uint32x2_t indexLo = (uint32x2_t){0, 1};
+ uint32x2_t indexHi = (uint32x2_t){2, 3};
+ uint32x2_t iLo = (uint32x2_t){static_cast<uint32_t>(-1), static_cast<uint32_t>(-1)};
+ uint32x2_t iHi = (uint32x2_t){static_cast<uint32_t>(-1), static_cast<uint32_t>(-1)};
+ const uint32x2_t four = (uint32x2_t){4, 4};
+
+ for (; i + 8 <= count; i += 8)
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v2 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v3 = vld1q_f32_aligned_postincrement(vv);
+
+ float32x2_t xy0 = vmul_f32(vget_low_f32(v0), vLo);
+ float32x2_t xy1 = vmul_f32(vget_low_f32(v1), vLo);
+ float32x2_t xy2 = vmul_f32(vget_low_f32(v2), vLo);
+ float32x2_t xy3 = vmul_f32(vget_low_f32(v3), vLo);
+
+ float32x2x2_t z0 = vtrn_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x2x2_t z1 = vtrn_f32(vget_high_f32(v2), vget_high_f32(v3));
+ float32x2_t zLo = vmul_f32(z0.val[0], vHi);
+ float32x2_t zHi = vmul_f32(z1.val[0], vHi);
+
+ float32x2_t rLo = vpadd_f32(xy0, xy1);
+ float32x2_t rHi = vpadd_f32(xy2, xy3);
+ rLo = vadd_f32(rLo, zLo);
+ rHi = vadd_f32(rHi, zHi);
+
+ uint32x2_t maskLo = vclt_f32(rLo, dotMinLo);
+ uint32x2_t maskHi = vclt_f32(rHi, dotMinHi);
+ dotMinLo = vbsl_f32(maskLo, rLo, dotMinLo);
+ dotMinHi = vbsl_f32(maskHi, rHi, dotMinHi);
+ iLo = vbsl_u32(maskLo, indexLo, iLo);
+ iHi = vbsl_u32(maskHi, indexHi, iHi);
+ indexLo = vadd_u32(indexLo, four);
+ indexHi = vadd_u32(indexHi, four);
+
+ v0 = vld1q_f32_aligned_postincrement(vv);
+ v1 = vld1q_f32_aligned_postincrement(vv);
+ v2 = vld1q_f32_aligned_postincrement(vv);
+ v3 = vld1q_f32_aligned_postincrement(vv);
+
+ xy0 = vmul_f32(vget_low_f32(v0), vLo);
+ xy1 = vmul_f32(vget_low_f32(v1), vLo);
+ xy2 = vmul_f32(vget_low_f32(v2), vLo);
+ xy3 = vmul_f32(vget_low_f32(v3), vLo);
+
+ z0 = vtrn_f32(vget_high_f32(v0), vget_high_f32(v1));
+ z1 = vtrn_f32(vget_high_f32(v2), vget_high_f32(v3));
+ zLo = vmul_f32(z0.val[0], vHi);
+ zHi = vmul_f32(z1.val[0], vHi);
+
+ rLo = vpadd_f32(xy0, xy1);
+ rHi = vpadd_f32(xy2, xy3);
+ rLo = vadd_f32(rLo, zLo);
+ rHi = vadd_f32(rHi, zHi);
+
+ maskLo = vclt_f32(rLo, dotMinLo);
+ maskHi = vclt_f32(rHi, dotMinHi);
+ dotMinLo = vbsl_f32(maskLo, rLo, dotMinLo);
+ dotMinHi = vbsl_f32(maskHi, rHi, dotMinHi);
+ iLo = vbsl_u32(maskLo, indexLo, iLo);
+ iHi = vbsl_u32(maskHi, indexHi, iHi);
+ indexLo = vadd_u32(indexLo, four);
+ indexHi = vadd_u32(indexHi, four);
+ }
+
+ for (; i + 4 <= count; i += 4)
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v2 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v3 = vld1q_f32_aligned_postincrement(vv);
+
+ float32x2_t xy0 = vmul_f32(vget_low_f32(v0), vLo);
+ float32x2_t xy1 = vmul_f32(vget_low_f32(v1), vLo);
+ float32x2_t xy2 = vmul_f32(vget_low_f32(v2), vLo);
+ float32x2_t xy3 = vmul_f32(vget_low_f32(v3), vLo);
+
+ float32x2x2_t z0 = vtrn_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x2x2_t z1 = vtrn_f32(vget_high_f32(v2), vget_high_f32(v3));
+ float32x2_t zLo = vmul_f32(z0.val[0], vHi);
+ float32x2_t zHi = vmul_f32(z1.val[0], vHi);
+
+ float32x2_t rLo = vpadd_f32(xy0, xy1);
+ float32x2_t rHi = vpadd_f32(xy2, xy3);
+ rLo = vadd_f32(rLo, zLo);
+ rHi = vadd_f32(rHi, zHi);
+
+ uint32x2_t maskLo = vclt_f32(rLo, dotMinLo);
+ uint32x2_t maskHi = vclt_f32(rHi, dotMinHi);
+ dotMinLo = vbsl_f32(maskLo, rLo, dotMinLo);
+ dotMinHi = vbsl_f32(maskHi, rHi, dotMinHi);
+ iLo = vbsl_u32(maskLo, indexLo, iLo);
+ iHi = vbsl_u32(maskHi, indexHi, iHi);
+ indexLo = vadd_u32(indexLo, four);
+ indexHi = vadd_u32(indexHi, four);
+ }
+ switch (count & 3)
+ {
+ case 3:
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v2 = vld1q_f32_aligned_postincrement(vv);
+
+ float32x2_t xy0 = vmul_f32(vget_low_f32(v0), vLo);
+ float32x2_t xy1 = vmul_f32(vget_low_f32(v1), vLo);
+ float32x2_t xy2 = vmul_f32(vget_low_f32(v2), vLo);
+
+ float32x2x2_t z0 = vtrn_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x2_t zLo = vmul_f32(z0.val[0], vHi);
+ float32x2_t zHi = vmul_f32(vdup_lane_f32(vget_high_f32(v2), 0), vHi);
+
+ float32x2_t rLo = vpadd_f32(xy0, xy1);
+ float32x2_t rHi = vpadd_f32(xy2, xy2);
+ rLo = vadd_f32(rLo, zLo);
+ rHi = vadd_f32(rHi, zHi);
+
+ uint32x2_t maskLo = vclt_f32(rLo, dotMinLo);
+ uint32x2_t maskHi = vclt_f32(rHi, dotMinHi);
+ dotMinLo = vbsl_f32(maskLo, rLo, dotMinLo);
+ dotMinHi = vbsl_f32(maskHi, rHi, dotMinHi);
+ iLo = vbsl_u32(maskLo, indexLo, iLo);
+ iHi = vbsl_u32(maskHi, indexHi, iHi);
+ }
+ break;
+ case 2:
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+
+ float32x2_t xy0 = vmul_f32(vget_low_f32(v0), vLo);
+ float32x2_t xy1 = vmul_f32(vget_low_f32(v1), vLo);
+
+ float32x2x2_t z0 = vtrn_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x2_t zLo = vmul_f32(z0.val[0], vHi);
+
+ float32x2_t rLo = vpadd_f32(xy0, xy1);
+ rLo = vadd_f32(rLo, zLo);
+
+ uint32x2_t maskLo = vclt_f32(rLo, dotMinLo);
+ dotMinLo = vbsl_f32(maskLo, rLo, dotMinLo);
+ iLo = vbsl_u32(maskLo, indexLo, iLo);
+ }
+ break;
+ case 1:
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x2_t xy0 = vmul_f32(vget_low_f32(v0), vLo);
+ float32x2_t z0 = vdup_lane_f32(vget_high_f32(v0), 0);
+ float32x2_t zLo = vmul_f32(z0, vHi);
+ float32x2_t rLo = vpadd_f32(xy0, xy0);
+ rLo = vadd_f32(rLo, zLo);
+ uint32x2_t maskLo = vclt_f32(rLo, dotMinLo);
+ dotMinLo = vbsl_f32(maskLo, rLo, dotMinLo);
+ iLo = vbsl_u32(maskLo, indexLo, iLo);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ // select best answer between hi and lo results
+ uint32x2_t mask = vclt_f32(dotMinHi, dotMinLo);
+ dotMinLo = vbsl_f32(mask, dotMinHi, dotMinLo);
+ iLo = vbsl_u32(mask, iHi, iLo);
+
+ // select best answer between even and odd results
+ dotMinHi = vdup_lane_f32(dotMinLo, 1);
+ iHi = vdup_lane_u32(iLo, 1);
+ mask = vclt_f32(dotMinHi, dotMinLo);
+ dotMinLo = vbsl_f32(mask, dotMinHi, dotMinLo);
+ iLo = vbsl_u32(mask, iHi, iLo);
+
+ *dotResult = vget_lane_f32(dotMinLo, 0);
+ return vget_lane_u32(iLo, 0);
}
-long _mindot_large_v1( const float *vv, const float *vec, unsigned long count, float *dotResult )
+long _mindot_large_v1(const float *vv, const float *vec, unsigned long count, float *dotResult)
{
- float32x4_t vvec = vld1q_f32_aligned_postincrement( vec );
- float32x4_t vLo = vcombine_f32(vget_low_f32(vvec), vget_low_f32(vvec));
- float32x4_t vHi = vdupq_lane_f32(vget_high_f32(vvec), 0);
- const uint32x4_t four = (uint32x4_t){ 4, 4, 4, 4 };
- uint32x4_t local_index = (uint32x4_t) {0, 1, 2, 3};
- uint32x4_t index = (uint32x4_t) { static_cast<uint32_t>(-1), static_cast<uint32_t>(-1), static_cast<uint32_t>(-1), static_cast<uint32_t>(-1) };
- float32x4_t minDot = (float32x4_t) { BT_INFINITY, BT_INFINITY, BT_INFINITY, BT_INFINITY };
-
- unsigned long i = 0;
- for( ; i + 8 <= count; i += 8 )
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v2 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v3 = vld1q_f32_aligned_postincrement( vv );
-
- // the next two lines should resolve to a single vswp d, d
- float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1));
- float32x4_t xy1 = vcombine_f32( vget_low_f32(v2), vget_low_f32(v3));
- // the next two lines should resolve to a single vswp d, d
- float32x4_t z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x4_t z1 = vcombine_f32( vget_high_f32(v2), vget_high_f32(v3));
-
- xy0 = vmulq_f32(xy0, vLo);
- xy1 = vmulq_f32(xy1, vLo);
-
- float32x4x2_t zb = vuzpq_f32( z0, z1);
- float32x4_t z = vmulq_f32( zb.val[0], vHi);
- float32x4x2_t xy = vuzpq_f32( xy0, xy1);
- float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
- x = vaddq_f32(x, z);
-
- uint32x4_t mask = vcltq_f32(x, minDot);
- minDot = vbslq_f32( mask, x, minDot);
- index = vbslq_u32(mask, local_index, index);
- local_index = vaddq_u32(local_index, four);
-
- v0 = vld1q_f32_aligned_postincrement( vv );
- v1 = vld1q_f32_aligned_postincrement( vv );
- v2 = vld1q_f32_aligned_postincrement( vv );
- v3 = vld1q_f32_aligned_postincrement( vv );
-
- // the next two lines should resolve to a single vswp d, d
- xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1));
- xy1 = vcombine_f32( vget_low_f32(v2), vget_low_f32(v3));
- // the next two lines should resolve to a single vswp d, d
- z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1));
- z1 = vcombine_f32( vget_high_f32(v2), vget_high_f32(v3));
-
- xy0 = vmulq_f32(xy0, vLo);
- xy1 = vmulq_f32(xy1, vLo);
-
- zb = vuzpq_f32( z0, z1);
- z = vmulq_f32( zb.val[0], vHi);
- xy = vuzpq_f32( xy0, xy1);
- x = vaddq_f32(xy.val[0], xy.val[1]);
- x = vaddq_f32(x, z);
-
- mask = vcltq_f32(x, minDot);
- minDot = vbslq_f32( mask, x, minDot);
- index = vbslq_u32(mask, local_index, index);
- local_index = vaddq_u32(local_index, four);
- }
-
- for( ; i + 4 <= count; i += 4 )
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v2 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v3 = vld1q_f32_aligned_postincrement( vv );
-
- // the next two lines should resolve to a single vswp d, d
- float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1));
- float32x4_t xy1 = vcombine_f32( vget_low_f32(v2), vget_low_f32(v3));
- // the next two lines should resolve to a single vswp d, d
- float32x4_t z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x4_t z1 = vcombine_f32( vget_high_f32(v2), vget_high_f32(v3));
-
- xy0 = vmulq_f32(xy0, vLo);
- xy1 = vmulq_f32(xy1, vLo);
-
- float32x4x2_t zb = vuzpq_f32( z0, z1);
- float32x4_t z = vmulq_f32( zb.val[0], vHi);
- float32x4x2_t xy = vuzpq_f32( xy0, xy1);
- float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
- x = vaddq_f32(x, z);
-
- uint32x4_t mask = vcltq_f32(x, minDot);
- minDot = vbslq_f32( mask, x, minDot);
- index = vbslq_u32(mask, local_index, index);
- local_index = vaddq_u32(local_index, four);
- }
-
- switch (count & 3) {
- case 3:
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v2 = vld1q_f32_aligned_postincrement( vv );
-
- // the next two lines should resolve to a single vswp d, d
- float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1));
- float32x4_t xy1 = vcombine_f32( vget_low_f32(v2), vget_low_f32(v2));
- // the next two lines should resolve to a single vswp d, d
- float32x4_t z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1));
- float32x4_t z1 = vcombine_f32( vget_high_f32(v2), vget_high_f32(v2));
-
- xy0 = vmulq_f32(xy0, vLo);
- xy1 = vmulq_f32(xy1, vLo);
-
- float32x4x2_t zb = vuzpq_f32( z0, z1);
- float32x4_t z = vmulq_f32( zb.val[0], vHi);
- float32x4x2_t xy = vuzpq_f32( xy0, xy1);
- float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
- x = vaddq_f32(x, z);
-
- uint32x4_t mask = vcltq_f32(x, minDot);
- minDot = vbslq_f32( mask, x, minDot);
- index = vbslq_u32(mask, local_index, index);
- local_index = vaddq_u32(local_index, four);
- }
- break;
-
- case 2:
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
- float32x4_t v1 = vld1q_f32_aligned_postincrement( vv );
-
- // the next two lines should resolve to a single vswp d, d
- float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v1));
- // the next two lines should resolve to a single vswp d, d
- float32x4_t z0 = vcombine_f32( vget_high_f32(v0), vget_high_f32(v1));
-
- xy0 = vmulq_f32(xy0, vLo);
-
- float32x4x2_t zb = vuzpq_f32( z0, z0);
- float32x4_t z = vmulq_f32( zb.val[0], vHi);
- float32x4x2_t xy = vuzpq_f32( xy0, xy0);
- float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
- x = vaddq_f32(x, z);
-
- uint32x4_t mask = vcltq_f32(x, minDot);
- minDot = vbslq_f32( mask, x, minDot);
- index = vbslq_u32(mask, local_index, index);
- local_index = vaddq_u32(local_index, four);
- }
- break;
-
- case 1:
- {
- float32x4_t v0 = vld1q_f32_aligned_postincrement( vv );
-
- // the next two lines should resolve to a single vswp d, d
- float32x4_t xy0 = vcombine_f32( vget_low_f32(v0), vget_low_f32(v0));
- // the next two lines should resolve to a single vswp d, d
- float32x4_t z = vdupq_lane_f32(vget_high_f32(v0), 0);
-
- xy0 = vmulq_f32(xy0, vLo);
-
- z = vmulq_f32( z, vHi);
- float32x4x2_t xy = vuzpq_f32( xy0, xy0);
- float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
- x = vaddq_f32(x, z);
-
- uint32x4_t mask = vcltq_f32(x, minDot);
- minDot = vbslq_f32( mask, x, minDot);
- index = vbslq_u32(mask, local_index, index);
- local_index = vaddq_u32(local_index, four);
- }
- break;
-
- default:
- break;
- }
-
-
- // select best answer between hi and lo results
- uint32x2_t mask = vclt_f32( vget_high_f32(minDot), vget_low_f32(minDot));
- float32x2_t minDot2 = vbsl_f32(mask, vget_high_f32(minDot), vget_low_f32(minDot));
- uint32x2_t index2 = vbsl_u32(mask, vget_high_u32(index), vget_low_u32(index));
-
- // select best answer between even and odd results
- float32x2_t minDotO = vdup_lane_f32(minDot2, 1);
- uint32x2_t indexHi = vdup_lane_u32(index2, 1);
- mask = vclt_f32( minDotO, minDot2 );
- minDot2 = vbsl_f32(mask, minDotO, minDot2);
- index2 = vbsl_u32(mask, indexHi, index2);
-
- *dotResult = vget_lane_f32( minDot2, 0);
- return vget_lane_u32(index2, 0);
-
+ float32x4_t vvec = vld1q_f32_aligned_postincrement(vec);
+ float32x4_t vLo = vcombine_f32(vget_low_f32(vvec), vget_low_f32(vvec));
+ float32x4_t vHi = vdupq_lane_f32(vget_high_f32(vvec), 0);
+ const uint32x4_t four = (uint32x4_t){4, 4, 4, 4};
+ uint32x4_t local_index = (uint32x4_t){0, 1, 2, 3};
+ uint32x4_t index = (uint32x4_t){static_cast<uint32_t>(-1), static_cast<uint32_t>(-1), static_cast<uint32_t>(-1), static_cast<uint32_t>(-1)};
+ float32x4_t minDot = (float32x4_t){BT_INFINITY, BT_INFINITY, BT_INFINITY, BT_INFINITY};
+
+ unsigned long i = 0;
+ for (; i + 8 <= count; i += 8)
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v2 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v3 = vld1q_f32_aligned_postincrement(vv);
+
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t xy0 = vcombine_f32(vget_low_f32(v0), vget_low_f32(v1));
+ float32x4_t xy1 = vcombine_f32(vget_low_f32(v2), vget_low_f32(v3));
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t z0 = vcombine_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x4_t z1 = vcombine_f32(vget_high_f32(v2), vget_high_f32(v3));
+
+ xy0 = vmulq_f32(xy0, vLo);
+ xy1 = vmulq_f32(xy1, vLo);
+
+ float32x4x2_t zb = vuzpq_f32(z0, z1);
+ float32x4_t z = vmulq_f32(zb.val[0], vHi);
+ float32x4x2_t xy = vuzpq_f32(xy0, xy1);
+ float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
+ x = vaddq_f32(x, z);
+
+ uint32x4_t mask = vcltq_f32(x, minDot);
+ minDot = vbslq_f32(mask, x, minDot);
+ index = vbslq_u32(mask, local_index, index);
+ local_index = vaddq_u32(local_index, four);
+
+ v0 = vld1q_f32_aligned_postincrement(vv);
+ v1 = vld1q_f32_aligned_postincrement(vv);
+ v2 = vld1q_f32_aligned_postincrement(vv);
+ v3 = vld1q_f32_aligned_postincrement(vv);
+
+ // the next two lines should resolve to a single vswp d, d
+ xy0 = vcombine_f32(vget_low_f32(v0), vget_low_f32(v1));
+ xy1 = vcombine_f32(vget_low_f32(v2), vget_low_f32(v3));
+ // the next two lines should resolve to a single vswp d, d
+ z0 = vcombine_f32(vget_high_f32(v0), vget_high_f32(v1));
+ z1 = vcombine_f32(vget_high_f32(v2), vget_high_f32(v3));
+
+ xy0 = vmulq_f32(xy0, vLo);
+ xy1 = vmulq_f32(xy1, vLo);
+
+ zb = vuzpq_f32(z0, z1);
+ z = vmulq_f32(zb.val[0], vHi);
+ xy = vuzpq_f32(xy0, xy1);
+ x = vaddq_f32(xy.val[0], xy.val[1]);
+ x = vaddq_f32(x, z);
+
+ mask = vcltq_f32(x, minDot);
+ minDot = vbslq_f32(mask, x, minDot);
+ index = vbslq_u32(mask, local_index, index);
+ local_index = vaddq_u32(local_index, four);
+ }
+
+ for (; i + 4 <= count; i += 4)
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v2 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v3 = vld1q_f32_aligned_postincrement(vv);
+
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t xy0 = vcombine_f32(vget_low_f32(v0), vget_low_f32(v1));
+ float32x4_t xy1 = vcombine_f32(vget_low_f32(v2), vget_low_f32(v3));
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t z0 = vcombine_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x4_t z1 = vcombine_f32(vget_high_f32(v2), vget_high_f32(v3));
+
+ xy0 = vmulq_f32(xy0, vLo);
+ xy1 = vmulq_f32(xy1, vLo);
+
+ float32x4x2_t zb = vuzpq_f32(z0, z1);
+ float32x4_t z = vmulq_f32(zb.val[0], vHi);
+ float32x4x2_t xy = vuzpq_f32(xy0, xy1);
+ float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
+ x = vaddq_f32(x, z);
+
+ uint32x4_t mask = vcltq_f32(x, minDot);
+ minDot = vbslq_f32(mask, x, minDot);
+ index = vbslq_u32(mask, local_index, index);
+ local_index = vaddq_u32(local_index, four);
+ }
+
+ switch (count & 3)
+ {
+ case 3:
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v2 = vld1q_f32_aligned_postincrement(vv);
+
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t xy0 = vcombine_f32(vget_low_f32(v0), vget_low_f32(v1));
+ float32x4_t xy1 = vcombine_f32(vget_low_f32(v2), vget_low_f32(v2));
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t z0 = vcombine_f32(vget_high_f32(v0), vget_high_f32(v1));
+ float32x4_t z1 = vcombine_f32(vget_high_f32(v2), vget_high_f32(v2));
+
+ xy0 = vmulq_f32(xy0, vLo);
+ xy1 = vmulq_f32(xy1, vLo);
+
+ float32x4x2_t zb = vuzpq_f32(z0, z1);
+ float32x4_t z = vmulq_f32(zb.val[0], vHi);
+ float32x4x2_t xy = vuzpq_f32(xy0, xy1);
+ float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
+ x = vaddq_f32(x, z);
+
+ uint32x4_t mask = vcltq_f32(x, minDot);
+ minDot = vbslq_f32(mask, x, minDot);
+ index = vbslq_u32(mask, local_index, index);
+ local_index = vaddq_u32(local_index, four);
+ }
+ break;
+
+ case 2:
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+ float32x4_t v1 = vld1q_f32_aligned_postincrement(vv);
+
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t xy0 = vcombine_f32(vget_low_f32(v0), vget_low_f32(v1));
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t z0 = vcombine_f32(vget_high_f32(v0), vget_high_f32(v1));
+
+ xy0 = vmulq_f32(xy0, vLo);
+
+ float32x4x2_t zb = vuzpq_f32(z0, z0);
+ float32x4_t z = vmulq_f32(zb.val[0], vHi);
+ float32x4x2_t xy = vuzpq_f32(xy0, xy0);
+ float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
+ x = vaddq_f32(x, z);
+
+ uint32x4_t mask = vcltq_f32(x, minDot);
+ minDot = vbslq_f32(mask, x, minDot);
+ index = vbslq_u32(mask, local_index, index);
+ local_index = vaddq_u32(local_index, four);
+ }
+ break;
+
+ case 1:
+ {
+ float32x4_t v0 = vld1q_f32_aligned_postincrement(vv);
+
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t xy0 = vcombine_f32(vget_low_f32(v0), vget_low_f32(v0));
+ // the next two lines should resolve to a single vswp d, d
+ float32x4_t z = vdupq_lane_f32(vget_high_f32(v0), 0);
+
+ xy0 = vmulq_f32(xy0, vLo);
+
+ z = vmulq_f32(z, vHi);
+ float32x4x2_t xy = vuzpq_f32(xy0, xy0);
+ float32x4_t x = vaddq_f32(xy.val[0], xy.val[1]);
+ x = vaddq_f32(x, z);
+
+ uint32x4_t mask = vcltq_f32(x, minDot);
+ minDot = vbslq_f32(mask, x, minDot);
+ index = vbslq_u32(mask, local_index, index);
+ local_index = vaddq_u32(local_index, four);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ // select best answer between hi and lo results
+ uint32x2_t mask = vclt_f32(vget_high_f32(minDot), vget_low_f32(minDot));
+ float32x2_t minDot2 = vbsl_f32(mask, vget_high_f32(minDot), vget_low_f32(minDot));
+ uint32x2_t index2 = vbsl_u32(mask, vget_high_u32(index), vget_low_u32(index));
+
+ // select best answer between even and odd results
+ float32x2_t minDotO = vdup_lane_f32(minDot2, 1);
+ uint32x2_t indexHi = vdup_lane_u32(index2, 1);
+ mask = vclt_f32(minDotO, minDot2);
+ minDot2 = vbsl_f32(mask, minDotO, minDot2);
+ index2 = vbsl_u32(mask, indexHi, index2);
+
+ *dotResult = vget_lane_f32(minDot2, 0);
+ return vget_lane_u32(index2, 0);
}
#else
- #error Unhandled __APPLE__ arch
+#error Unhandled __APPLE__ arch
#endif
-#endif /* __APPLE__ */
-
-
+#endif /* __APPLE__ */
diff --git a/thirdparty/bullet/LinearMath/btVector3.h b/thirdparty/bullet/LinearMath/btVector3.h
index 76024f1236..61fd8d1e46 100644
--- a/thirdparty/bullet/LinearMath/btVector3.h
+++ b/thirdparty/bullet/LinearMath/btVector3.h
@@ -12,8 +12,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
-
#ifndef BT_VECTOR3_H
#define BT_VECTOR3_H
@@ -28,25 +26,24 @@ subject to the following restrictions:
#else
#define btVector3Data btVector3FloatData
#define btVector3DataName "btVector3FloatData"
-#endif //BT_USE_DOUBLE_PRECISION
+#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'
+#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))
+#define BT_SHUFFLE(x, y, z, w) ((w) << 6 | (z) << 4 | (y) << 2 | (x))
//#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 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 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)
@@ -55,9 +52,9 @@ subject to the following restrictions:
//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))
+#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};
@@ -70,7 +67,7 @@ subject to the following restrictions:
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<int32_t>(0xFFFFFFFF),
- static_cast<int32_t>(0xFFFFFFFF), static_cast<int32_t>(0xFFFFFFFF), 0x0};
+ static_cast<int32_t>(0xFFFFFFFF), static_cast<int32_t>(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};
@@ -80,50 +77,48 @@ const int32x4_t ATTRIBUTE_ALIGNED16(btv3AbsMask) = (int32x4_t){0x7FFFFFFF, 0x7FF
* 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
+ATTRIBUTE_ALIGNED16(class)
+btVector3
{
public:
-
BT_DECLARE_ALIGNED_ALLOCATOR();
-#if defined (__SPU__) && defined (__CELLOS_LV2__)
- btScalar m_floats[4];
+#if defined(__SPU__) && defined(__CELLOS_LV2__)
+ btScalar m_floats[4];
+
public:
- SIMD_FORCE_INLINE const vec_float4& get128() const
+ 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()
+#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
+ /**@brief Constructor from scalars
* @param x X value
* @param y Y value
* @param z Z value
@@ -136,9 +131,9 @@ public:
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)
+#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;
}
@@ -150,73 +145,72 @@ public:
}
// Assignment Operator
- SIMD_FORCE_INLINE btVector3&
- operator=(const btVector3& v)
+ 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
+#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)
+#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[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
+ /**@brief Subtract a vector from this one
* @param The vector to subtract */
- SIMD_FORCE_INLINE btVector3& operator-=(const btVector3& v)
+ SIMD_FORCE_INLINE btVector3& operator-=(const btVector3& v)
{
-#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
+#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[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
+
+ /**@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)
+#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[0] *= s;
m_floats[1] *= s;
m_floats[2] *= s;
#endif
return *this;
}
- /**@brief Inversely scale the vector
+ /**@brief Inversely scale the vector
* @param s Scale factor to divide by */
- SIMD_FORCE_INLINE btVector3& operator/=(const btScalar& s)
+ SIMD_FORCE_INLINE btVector3& operator/=(const btScalar& s)
{
btFullAssert(s != btScalar(0.0));
-#if 0 //defined(BT_USE_SSE_IN_API)
+#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);
@@ -230,11 +224,11 @@ public:
#endif
}
- /**@brief Return the dot product
+ /**@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)
+#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);
@@ -243,23 +237,23 @@ public:
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));
+ 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];
+#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 */
+ /**@brief Return the length of the vector squared */
SIMD_FORCE_INLINE btScalar length2() const
{
return dot(*this);
}
- /**@brief Return the length of the vector */
+ /**@brief Return the length of the vector */
SIMD_FORCE_INLINE btScalar length() const
{
return btSqrt(length2());
@@ -267,7 +261,7 @@ public:
/**@brief Return the norm (length) of the vector */
SIMD_FORCE_INLINE btScalar norm() const
- {
+ {
return length();
}
@@ -276,24 +270,24 @@ public:
{
btScalar d = length2();
//workaround for some clang/gcc issue of sqrtf(tiny number) = -INF
- if (d>SIMD_EPSILON)
+ if (d > SIMD_EPSILON)
return btSqrt(d);
return btScalar(0);
}
- /**@brief Return the distance squared between the ends of this and another vector
+ /**@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
+ /**@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()
+ SIMD_FORCE_INLINE btVector3& safeNormalize()
{
btScalar l2 = length2();
//triNormal.normalize();
- if (l2 >= SIMD_EPSILON*SIMD_EPSILON)
+ if (l2 >= SIMD_EPSILON * SIMD_EPSILON)
{
(*this) /= btSqrt(l2);
}
@@ -304,100 +298,97 @@ public:
return *this;
}
- /**@brief Normalize this vector
+ /**@brief Normalize this vector
* x^2 + y^2 + z^2 = 1 */
- SIMD_FORCE_INLINE btVector3& normalize()
+ SIMD_FORCE_INLINE btVector3& normalize()
{
-
btAssert(!fuzzyZero());
-#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
- // dot product first
+#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
+
+#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)
+#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
+#endif
-
return *this;
-#else
+#else
return *this /= length();
#endif
}
- /**@brief Return a normalized version of this vector */
+ /**@brief Return a normalized version of this vector */
SIMD_FORCE_INLINE btVector3 normalized() const;
- /**@brief Return a rotated version of this vector
+ /**@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;
+ SIMD_FORCE_INLINE btVector3 rotate(const btVector3& wAxis, const btScalar angle) const;
- /**@brief Return the angle between this and another vector
+ /**@brief Return the angle between this and another vector
* @param v The other vector */
- SIMD_FORCE_INLINE btScalar angle(const btVector3& v) const
+ 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)
+ /**@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
+#else
return btVector3(
- btFabs(m_floats[0]),
- btFabs(m_floats[1]),
+ btFabs(m_floats[0]),
+ btFabs(m_floats[1]),
btFabs(m_floats[2]));
#endif
}
-
- /**@brief Return the cross product between this and another vector
+
+ /**@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)
-
+#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)
@@ -407,7 +398,7 @@ public:
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);
@@ -415,7 +406,7 @@ public:
// 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(
@@ -427,18 +418,18 @@ public:
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)
+#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)
-
+ __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:
+ // dot:
V = _mm_mul_ps(V, mVec128);
__m128 z = _mm_movehl_ps(V, V);
__m128 y = _mm_shuffle_ps(V, V, 0x55);
@@ -454,7 +445,7 @@ public:
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);
@@ -462,31 +453,30 @@ public:
// form (Y, Z, X, _);
V = vcombine_f32(vext_f32(Vlow, vget_high_f32(V), 1), Vlow);
- // dot:
+ // dot:
V = vmulq_f32(mVec128, V);
- float32x2_t x = vpadd_f32(vget_low_f32(V), vget_low_f32(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]);
+ 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
+ /**@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);
+ 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
+ /**@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
+ 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);
+ 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
@@ -494,23 +484,22 @@ public:
return absolute().minAxis();
}
- SIMD_FORCE_INLINE int closestAxis() const
+ 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)
+#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 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)
+ 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);
+ __m128 tmp3 = _mm_add_ps(r0, r1);
mVec128 = tmp3;
#elif defined(BT_USE_NEON)
float32x4_t vl = vsubq_f32(v1.mVec128, v0.mVec128);
@@ -526,101 +515,100 @@ public:
#endif
}
- /**@brief Return the linear interpolation between this and another vector
+ /**@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
+ 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)
+#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);
+#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
+ /**@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)
+#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];
+#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]; }
+ /**@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 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
+ 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]));
+#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
+ 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
+ /**@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)
+ SIMD_FORCE_INLINE void setMax(const btVector3& other)
{
-#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
+#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);
@@ -632,12 +620,12 @@ public:
#endif
}
- /**@brief Set each element to the min of the current values and the values of another btVector3
+ /**@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)
+ SIMD_FORCE_INLINE void setMin(const btVector3& other)
{
-#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
+#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);
@@ -649,156 +637,155 @@ public:
#endif
}
- SIMD_FORCE_INLINE void setValue(const btScalar& _x, const btScalar& _y, const btScalar& _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[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
+ 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);
+#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);
+
+ 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.);
+ 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)
+#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);
+ int32x4_t vi = vdupq_n_s32(0);
mVec128 = vreinterpretq_f32_s32(vi);
-#else
- setValue(btScalar(0.),btScalar(0.),btScalar(0.));
+#else
+ setValue(btScalar(0.), btScalar(0.), btScalar(0.));
#endif
}
- SIMD_FORCE_INLINE bool isZero() const
+ 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
+ SIMD_FORCE_INLINE bool fuzzyZero() const
{
- return length2() < SIMD_EPSILON*SIMD_EPSILON;
+ return length2() < SIMD_EPSILON * SIMD_EPSILON;
}
- SIMD_FORCE_INLINE void serialize(struct btVector3Data& dataOut) const;
+ 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 btVector3DoubleData& dataIn);
+ SIMD_FORCE_INLINE void deSerialize(const struct btVector3FloatData& dataIn);
- SIMD_FORCE_INLINE void deSerialize(const struct btVector3FloatData& dataIn);
+ SIMD_FORCE_INLINE void serializeFloat(struct btVector3FloatData & dataOut) const;
- SIMD_FORCE_INLINE void serializeFloat(struct btVector3FloatData& dataOut) const;
+ SIMD_FORCE_INLINE void deSerializeFloat(const struct btVector3FloatData& dataIn);
- SIMD_FORCE_INLINE void deSerializeFloat(const struct btVector3FloatData& dataIn);
+ SIMD_FORCE_INLINE void serializeDouble(struct btVector3DoubleData & dataOut) const;
- SIMD_FORCE_INLINE void serializeDouble(struct btVector3DoubleData& dataOut) const;
+ SIMD_FORCE_INLINE void deSerializeDouble(const struct btVector3DoubleData& dataIn);
- SIMD_FORCE_INLINE void deSerializeDouble(const struct btVector3DoubleData& dataIn);
-
- /**@brief returns index of maximum dot product between this and vectors in array[]
+ /**@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;
+ 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[]
+ /**@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);
-
+ * @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<uint32_t>(-1), static_cast<uint32_t>(-1), static_cast<uint32_t>(-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));
+ static const uint32x4_t xyzMask = (const uint32x4_t){static_cast<uint32_t>(-1), static_cast<uint32_t>(-1), static_cast<uint32_t>(-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)
+SIMD_FORCE_INLINE btVector3
+operator+(const btVector3& v1, const btVector3& v2)
{
-#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
+#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]);
+ 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)
+SIMD_FORCE_INLINE btVector3
+operator*(const btVector3& v1, const btVector3& v2)
{
-#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
+#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]);
+ 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
+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))
+#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);
@@ -808,33 +795,33 @@ operator-(const btVector3& v1, const btVector3& v2)
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]);
+ 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
+SIMD_FORCE_INLINE btVector3
operator-(const btVector3& v)
{
-#if defined BT_USE_SIMD_VECTOR3 && (defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE))
+#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));
+ 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
+#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
+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)
+#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);
@@ -845,10 +832,10 @@ operator*(const btVector3& v, const btScalar& s)
}
/**@brief Return the vector scaled by s */
-SIMD_FORCE_INLINE btVector3
+SIMD_FORCE_INLINE btVector3
operator*(const btScalar& s, const btVector3& v)
-{
- return v * s;
+{
+ return v * s;
}
/**@brief Return the vector inversely scaled by s */
@@ -856,7 +843,7 @@ SIMD_FORCE_INLINE btVector3
operator/(const btVector3& v, const btScalar& s)
{
btFullAssert(s != btScalar(0.0));
-#if 0 //defined(BT_USE_SSE_IN_API)
+#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);
@@ -872,67 +859,65 @@ operator/(const btVector3& v, const btScalar& 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))
+#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);
+ 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
+
+ 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]);
+ 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);
+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);
+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);
+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);
+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 btVector3
+btCross(const btVector3& v1, const btVector3& v2)
+{
+ return v1.cross(v2);
}
SIMD_FORCE_INLINE btScalar
@@ -945,14 +930,12 @@ btTriple(const btVector3& v1, const btVector3& v2, const btVector3& v3)
* @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
+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();
@@ -968,140 +951,137 @@ 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
+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)
+#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;
+ __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)
+ 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)
+ 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 = 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;
-
+ O = O + vcos;
+
return btVector3(O);
#else
- btVector3 o = wAxis * wAxis.dot( *this );
+ btVector3 o = wAxis * wAxis.dot(*this);
btVector3 _x = *this - o;
btVector3 _y;
- _y = wAxis.cross( *this );
+ _y = wAxis.cross(*this);
- return ( o + _x * btCos( _angle ) + _y * btSin( _angle ) );
+ return (o + _x * btCos(_angle) + _y * btSin(_angle));
#endif
}
-SIMD_FORCE_INLINE long btVector3::maxDot( const btVector3 *array, long array_count, btScalar &dotOut ) const
+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 )
+#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
- {
- 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 );
+ 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
+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 )
+#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
- {
- 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
-}
+ 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)
+ 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)
+#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) || defined(BT_USE_NEON)
SIMD_FORCE_INLINE btVector4(const btSimdFloat4 vec)
{
mVec128 = vec;
@@ -1112,34 +1092,32 @@ public:
mVec128 = rhs.mVec128;
}
- SIMD_FORCE_INLINE btVector4&
- operator=(const btVector4& v)
+ 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)
+#endif // #if defined (BT_USE_SSE_IN_API) || defined (BT_USE_NEON)
- SIMD_FORCE_INLINE btVector4 absolute4() const
+ SIMD_FORCE_INLINE btVector4 absolute4() const
{
-#if defined BT_USE_SIMD_VECTOR3 && defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
+#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
+#else
return btVector4(
- btFabs(m_floats[0]),
- btFabs(m_floats[1]),
+ btFabs(m_floats[0]),
+ btFabs(m_floats[1]),
btFabs(m_floats[2]),
btFabs(m_floats[3]));
#endif
}
+ btScalar getW() const { return m_floats[3]; }
- btScalar getW() const { return m_floats[3];}
-
-
- SIMD_FORCE_INLINE int maxAxis4() const
+ SIMD_FORCE_INLINE int maxAxis4() const
{
int maxIndex = -1;
btScalar maxVal = btScalar(-BT_LARGE_FLOAT);
@@ -1156,7 +1134,7 @@ public:
if (m_floats[2] > maxVal)
{
maxIndex = 2;
- maxVal =m_floats[2];
+ maxVal = m_floats[2];
}
if (m_floats[3] > maxVal)
{
@@ -1166,7 +1144,6 @@ public:
return maxIndex;
}
-
SIMD_FORCE_INLINE int minAxis4() const
{
int minIndex = -1;
@@ -1184,190 +1161,176 @@ public:
if (m_floats[2] < minVal)
{
minIndex = 2;
- minVal =m_floats[2];
+ minVal = m_floats[2];
}
if (m_floats[3] < minVal)
{
minIndex = 3;
}
-
+
return minIndex;
}
-
- SIMD_FORCE_INLINE int closestAxis4() const
+ SIMD_FORCE_INLINE int closestAxis4() const
{
return absolute4().maxAxis4();
}
-
-
-
- /**@brief Set x,y,z and zero w
+ /**@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
+ /* void getValue(btScalar *m) const
{
m[0] = m_floats[0];
m[1] = m_floats[1];
m[2] =m_floats[2];
}
*/
-/**@brief Set the values
+ /**@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;
- }
-
-
+ 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)
+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;
+ 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];
+ 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;
+ 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
+ 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)
+SIMD_FORCE_INLINE void btSwapVector3Endian(const btVector3& sourceVec, btVector3& destVec)
{
- for (int i=0;i<4;i++)
+ for (int i = 0; i < 4; i++)
{
- btSwapScalarEndian(sourceVec[i],destVec[i]);
+ btSwapScalarEndian(sourceVec[i], destVec[i]);
}
-
}
///btUnSwapVector3Endian swaps vector endianness, useful for network and cross-platform serialization
-SIMD_FORCE_INLINE void btUnSwapVector3Endian(btVector3& vector)
+SIMD_FORCE_INLINE void btUnSwapVector3Endian(btVector3& vector)
{
-
- btVector3 swappedVec;
- for (int i=0;i<4;i++)
+ btVector3 swappedVec;
+ for (int i = 0; i < 4; i++)
{
- btSwapScalarEndian(vector[i],swappedVec[i]);
+ btSwapScalarEndian(vector[i], swappedVec[i]);
}
vector = swappedVec;
}
template <class T>
-SIMD_FORCE_INLINE void btPlaneSpace1 (const T& n, T& p, T& q)
+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;
- }
+ 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
+struct btVector3FloatData
{
- float m_floats[4];
+ float m_floats[4];
};
-struct btVector3DoubleData
+struct btVector3DoubleData
{
- double m_floats[4];
-
+ double m_floats[4];
};
-SIMD_FORCE_INLINE void btVector3::serializeFloat(struct btVector3FloatData& dataOut) const
+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++)
+ 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)
+SIMD_FORCE_INLINE void btVector3::deSerializeFloat(const struct btVector3FloatData& dataIn)
{
- for (int i=0;i<4;i++)
+ 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
+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++)
+ 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)
+SIMD_FORCE_INLINE void btVector3::deSerializeDouble(const struct btVector3DoubleData& dataIn)
{
- for (int i=0;i<4;i++)
+ 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
+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++)
+ for (int i = 0; i < 4; i++)
dataOut.m_floats[i] = m_floats[i];
}
-
-SIMD_FORCE_INLINE void btVector3::deSerialize(const struct btVector3FloatData& dataIn)
+SIMD_FORCE_INLINE void btVector3::deSerialize(const struct btVector3FloatData& dataIn)
{
- for (int i = 0; i<4; i++)
+ 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)
+SIMD_FORCE_INLINE void btVector3::deSerialize(const struct btVector3DoubleData& dataIn)
{
- for (int i=0;i<4;i++)
+ for (int i = 0; i < 4; i++)
m_floats[i] = (btScalar)dataIn.m_floats[i];
}
-#endif //BT_VECTOR3_H
+#endif //BT_VECTOR3_H
diff --git a/thirdparty/bullet/btBulletCollisionCommon.h b/thirdparty/bullet/btBulletCollisionCommon.h
index 948e02eb4c..4f523756a7 100644
--- a/thirdparty/bullet/btBulletCollisionCommon.h
+++ b/thirdparty/bullet/btBulletCollisionCommon.h
@@ -62,6 +62,4 @@ subject to the following restrictions:
#include "LinearMath/btIDebugDraw.h"
#include "LinearMath/btSerializer.h"
-
-#endif //BULLET_COLLISION_COMMON_H
-
+#endif //BULLET_COLLISION_COMMON_H
diff --git a/thirdparty/bullet/btBulletDynamicsCommon.h b/thirdparty/bullet/btBulletDynamicsCommon.h
index 50282bf210..a421fa4461 100644
--- a/thirdparty/bullet/btBulletDynamicsCommon.h
+++ b/thirdparty/bullet/btBulletDynamicsCommon.h
@@ -35,17 +35,9 @@ subject to the following restrictions:
#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
-
+#endif //BULLET_DYNAMICS_COMMON_H
diff --git a/thirdparty/bullet/clew/clew.c b/thirdparty/bullet/clew/clew.c
index 5afc42a485..90caced535 100644
--- a/thirdparty/bullet/clew/clew.c
+++ b/thirdparty/bullet/clew/clew.c
@@ -9,23 +9,23 @@
#include "clew.h"
#ifdef _WIN32
- #define WIN32_LEAN_AND_MEAN
- #define VC_EXTRALEAN
- #include <windows.h>
+#define WIN32_LEAN_AND_MEAN
+#define VC_EXTRALEAN
+#include <windows.h>
- typedef HMODULE CLEW_DYNLIB_HANDLE;
+typedef HMODULE CLEW_DYNLIB_HANDLE;
- #define CLEW_DYNLIB_OPEN LoadLibraryA
- #define CLEW_DYNLIB_CLOSE FreeLibrary
- #define CLEW_DYNLIB_IMPORT GetProcAddress
+#define CLEW_DYNLIB_OPEN LoadLibraryA
+#define CLEW_DYNLIB_CLOSE FreeLibrary
+#define CLEW_DYNLIB_IMPORT GetProcAddress
#else
- #include <dlfcn.h>
-
- typedef void* CLEW_DYNLIB_HANDLE;
+#include <dlfcn.h>
- #define CLEW_DYNLIB_OPEN(path) dlopen(path, RTLD_NOW | RTLD_GLOBAL)
- #define CLEW_DYNLIB_CLOSE dlclose
- #define CLEW_DYNLIB_IMPORT dlsym
+typedef void* CLEW_DYNLIB_HANDLE;
+
+#define CLEW_DYNLIB_OPEN(path) dlopen(path, RTLD_NOW | RTLD_GLOBAL)
+#define CLEW_DYNLIB_CLOSE dlclose
+#define CLEW_DYNLIB_IMPORT dlsym
#endif
#include <stdlib.h>
@@ -34,279 +34,341 @@
static CLEW_DYNLIB_HANDLE module = NULL;
// Variables holding function entry points
-PFNCLGETPLATFORMIDS __clewGetPlatformIDs = NULL;
-PFNCLGETPLATFORMINFO __clewGetPlatformInfo = NULL;
-PFNCLGETDEVICEIDS __clewGetDeviceIDs = NULL;
-PFNCLGETDEVICEINFO __clewGetDeviceInfo = NULL;
-PFNCLCREATECONTEXT __clewCreateContext = NULL;
-PFNCLCREATECONTEXTFROMTYPE __clewCreateContextFromType = NULL;
-PFNCLRETAINCONTEXT __clewRetainContext = NULL;
-PFNCLRELEASECONTEXT __clewReleaseContext = NULL;
-PFNCLGETCONTEXTINFO __clewGetContextInfo = NULL;
-PFNCLCREATECOMMANDQUEUE __clewCreateCommandQueue = NULL;
-PFNCLRETAINCOMMANDQUEUE __clewRetainCommandQueue = NULL;
-PFNCLRELEASECOMMANDQUEUE __clewReleaseCommandQueue = NULL;
-PFNCLGETCOMMANDQUEUEINFO __clewGetCommandQueueInfo = NULL;
+PFNCLGETPLATFORMIDS __clewGetPlatformIDs = NULL;
+PFNCLGETPLATFORMINFO __clewGetPlatformInfo = NULL;
+PFNCLGETDEVICEIDS __clewGetDeviceIDs = NULL;
+PFNCLGETDEVICEINFO __clewGetDeviceInfo = NULL;
+PFNCLCREATECONTEXT __clewCreateContext = NULL;
+PFNCLCREATECONTEXTFROMTYPE __clewCreateContextFromType = NULL;
+PFNCLRETAINCONTEXT __clewRetainContext = NULL;
+PFNCLRELEASECONTEXT __clewReleaseContext = NULL;
+PFNCLGETCONTEXTINFO __clewGetContextInfo = NULL;
+PFNCLCREATECOMMANDQUEUE __clewCreateCommandQueue = NULL;
+PFNCLRETAINCOMMANDQUEUE __clewRetainCommandQueue = NULL;
+PFNCLRELEASECOMMANDQUEUE __clewReleaseCommandQueue = NULL;
+PFNCLGETCOMMANDQUEUEINFO __clewGetCommandQueueInfo = NULL;
#ifdef CL_USE_DEPRECATED_OPENCL_1_0_APIS
-PFNCLSETCOMMANDQUEUEPROPERTY __clewSetCommandQueueProperty = NULL;
+PFNCLSETCOMMANDQUEUEPROPERTY __clewSetCommandQueueProperty = NULL;
#endif
-PFNCLCREATEBUFFER __clewCreateBuffer = NULL;
-PFNCLCREATESUBBUFFER __clewCreateSubBuffer = NULL;
-PFNCLCREATEIMAGE2D __clewCreateImage2D = NULL;
-PFNCLCREATEIMAGE3D __clewCreateImage3D = NULL;
-PFNCLRETAINMEMOBJECT __clewRetainMemObject = NULL;
-PFNCLRELEASEMEMOBJECT __clewReleaseMemObject = NULL;
-PFNCLGETSUPPORTEDIMAGEFORMATS __clewGetSupportedImageFormats = NULL;
-PFNCLGETMEMOBJECTINFO __clewGetMemObjectInfo = NULL;
-PFNCLGETIMAGEINFO __clewGetImageInfo = NULL;
+PFNCLCREATEBUFFER __clewCreateBuffer = NULL;
+PFNCLCREATESUBBUFFER __clewCreateSubBuffer = NULL;
+PFNCLCREATEIMAGE2D __clewCreateImage2D = NULL;
+PFNCLCREATEIMAGE3D __clewCreateImage3D = NULL;
+PFNCLRETAINMEMOBJECT __clewRetainMemObject = NULL;
+PFNCLRELEASEMEMOBJECT __clewReleaseMemObject = NULL;
+PFNCLGETSUPPORTEDIMAGEFORMATS __clewGetSupportedImageFormats = NULL;
+PFNCLGETMEMOBJECTINFO __clewGetMemObjectInfo = NULL;
+PFNCLGETIMAGEINFO __clewGetImageInfo = NULL;
PFNCLSETMEMOBJECTDESTRUCTORCALLBACK __clewSetMemObjectDestructorCallback = NULL;
-PFNCLCREATESAMPLER __clewCreateSampler = NULL;
-PFNCLRETAINSAMPLER __clewRetainSampler = NULL;
-PFNCLRELEASESAMPLER __clewReleaseSampler = NULL;
-PFNCLGETSAMPLERINFO __clewGetSamplerInfo = NULL;
-PFNCLCREATEPROGRAMWITHSOURCE __clewCreateProgramWithSource = NULL;
-PFNCLCREATEPROGRAMWITHBINARY __clewCreateProgramWithBinary = NULL;
-PFNCLRETAINPROGRAM __clewRetainProgram = NULL;
-PFNCLRELEASEPROGRAM __clewReleaseProgram = NULL;
-PFNCLBUILDPROGRAM __clewBuildProgram = NULL;
-PFNCLUNLOADCOMPILER __clewUnloadCompiler = NULL;
-PFNCLGETPROGRAMINFO __clewGetProgramInfo = NULL;
-PFNCLGETPROGRAMBUILDINFO __clewGetProgramBuildInfo = NULL;
-PFNCLCREATEKERNEL __clewCreateKernel = NULL;
-PFNCLCREATEKERNELSINPROGRAM __clewCreateKernelsInProgram = NULL;
-PFNCLRETAINKERNEL __clewRetainKernel = NULL;
-PFNCLRELEASEKERNEL __clewReleaseKernel = NULL;
-PFNCLSETKERNELARG __clewSetKernelArg = NULL;
-PFNCLGETKERNELINFO __clewGetKernelInfo = NULL;
-PFNCLGETKERNELWORKGROUPINFO __clewGetKernelWorkGroupInfo = NULL;
-PFNCLWAITFOREVENTS __clewWaitForEvents = NULL;
-PFNCLGETEVENTINFO __clewGetEventInfo = NULL;
-PFNCLCREATEUSEREVENT __clewCreateUserEvent = NULL;
-PFNCLRETAINEVENT __clewRetainEvent = NULL;
-PFNCLRELEASEEVENT __clewReleaseEvent = NULL;
-PFNCLSETUSEREVENTSTATUS __clewSetUserEventStatus = NULL;
-PFNCLSETEVENTCALLBACK __clewSetEventCallback = NULL;
-PFNCLGETEVENTPROFILINGINFO __clewGetEventProfilingInfo = NULL;
-PFNCLFLUSH __clewFlush = NULL;
-PFNCLFINISH __clewFinish = NULL;
-PFNCLENQUEUEREADBUFFER __clewEnqueueReadBuffer = NULL;
-PFNCLENQUEUEREADBUFFERRECT __clewEnqueueReadBufferRect = NULL;
-PFNCLENQUEUEWRITEBUFFER __clewEnqueueWriteBuffer = NULL;
-PFNCLENQUEUEWRITEBUFFERRECT __clewEnqueueWriteBufferRect = NULL;
-PFNCLENQUEUECOPYBUFFER __clewEnqueueCopyBuffer = NULL;
-PFNCLENQUEUEREADIMAGE __clewEnqueueReadImage = NULL;
-PFNCLENQUEUEWRITEIMAGE __clewEnqueueWriteImage = NULL;
-PFNCLENQUEUECOPYIMAGE __clewEnqueueCopyImage = NULL;
-PFNCLENQUEUECOPYBUFFERRECT __clewEnqueueCopyBufferRect = NULL;
-PFNCLENQUEUECOPYIMAGETOBUFFER __clewEnqueueCopyImageToBuffer = NULL;
-PFNCLENQUEUECOPYBUFFERTOIMAGE __clewEnqueueCopyBufferToImage = NULL;
-PFNCLENQUEUEMAPBUFFER __clewEnqueueMapBuffer = NULL;
-PFNCLENQUEUEMAPIMAGE __clewEnqueueMapImage = NULL;
-PFNCLENQUEUEUNMAPMEMOBJECT __clewEnqueueUnmapMemObject = NULL;
-PFNCLENQUEUENDRANGEKERNEL __clewEnqueueNDRangeKernel = NULL;
-PFNCLENQUEUETASK __clewEnqueueTask = NULL;
-PFNCLENQUEUENATIVEKERNEL __clewEnqueueNativeKernel = NULL;
-PFNCLENQUEUEMARKER __clewEnqueueMarker = NULL;
-PFNCLENQUEUEWAITFOREVENTS __clewEnqueueWaitForEvents = NULL;
-PFNCLENQUEUEBARRIER __clewEnqueueBarrier = NULL;
-PFNCLGETEXTENSIONFUNCTIONADDRESS __clewGetExtensionFunctionAddress = NULL;
-
+PFNCLCREATESAMPLER __clewCreateSampler = NULL;
+PFNCLRETAINSAMPLER __clewRetainSampler = NULL;
+PFNCLRELEASESAMPLER __clewReleaseSampler = NULL;
+PFNCLGETSAMPLERINFO __clewGetSamplerInfo = NULL;
+PFNCLCREATEPROGRAMWITHSOURCE __clewCreateProgramWithSource = NULL;
+PFNCLCREATEPROGRAMWITHBINARY __clewCreateProgramWithBinary = NULL;
+PFNCLRETAINPROGRAM __clewRetainProgram = NULL;
+PFNCLRELEASEPROGRAM __clewReleaseProgram = NULL;
+PFNCLBUILDPROGRAM __clewBuildProgram = NULL;
+PFNCLUNLOADCOMPILER __clewUnloadCompiler = NULL;
+PFNCLGETPROGRAMINFO __clewGetProgramInfo = NULL;
+PFNCLGETPROGRAMBUILDINFO __clewGetProgramBuildInfo = NULL;
+PFNCLCREATEKERNEL __clewCreateKernel = NULL;
+PFNCLCREATEKERNELSINPROGRAM __clewCreateKernelsInProgram = NULL;
+PFNCLRETAINKERNEL __clewRetainKernel = NULL;
+PFNCLRELEASEKERNEL __clewReleaseKernel = NULL;
+PFNCLSETKERNELARG __clewSetKernelArg = NULL;
+PFNCLGETKERNELINFO __clewGetKernelInfo = NULL;
+PFNCLGETKERNELWORKGROUPINFO __clewGetKernelWorkGroupInfo = NULL;
+PFNCLWAITFOREVENTS __clewWaitForEvents = NULL;
+PFNCLGETEVENTINFO __clewGetEventInfo = NULL;
+PFNCLCREATEUSEREVENT __clewCreateUserEvent = NULL;
+PFNCLRETAINEVENT __clewRetainEvent = NULL;
+PFNCLRELEASEEVENT __clewReleaseEvent = NULL;
+PFNCLSETUSEREVENTSTATUS __clewSetUserEventStatus = NULL;
+PFNCLSETEVENTCALLBACK __clewSetEventCallback = NULL;
+PFNCLGETEVENTPROFILINGINFO __clewGetEventProfilingInfo = NULL;
+PFNCLFLUSH __clewFlush = NULL;
+PFNCLFINISH __clewFinish = NULL;
+PFNCLENQUEUEREADBUFFER __clewEnqueueReadBuffer = NULL;
+PFNCLENQUEUEREADBUFFERRECT __clewEnqueueReadBufferRect = NULL;
+PFNCLENQUEUEWRITEBUFFER __clewEnqueueWriteBuffer = NULL;
+PFNCLENQUEUEWRITEBUFFERRECT __clewEnqueueWriteBufferRect = NULL;
+PFNCLENQUEUECOPYBUFFER __clewEnqueueCopyBuffer = NULL;
+PFNCLENQUEUEREADIMAGE __clewEnqueueReadImage = NULL;
+PFNCLENQUEUEWRITEIMAGE __clewEnqueueWriteImage = NULL;
+PFNCLENQUEUECOPYIMAGE __clewEnqueueCopyImage = NULL;
+PFNCLENQUEUECOPYBUFFERRECT __clewEnqueueCopyBufferRect = NULL;
+PFNCLENQUEUECOPYIMAGETOBUFFER __clewEnqueueCopyImageToBuffer = NULL;
+PFNCLENQUEUECOPYBUFFERTOIMAGE __clewEnqueueCopyBufferToImage = NULL;
+PFNCLENQUEUEMAPBUFFER __clewEnqueueMapBuffer = NULL;
+PFNCLENQUEUEMAPIMAGE __clewEnqueueMapImage = NULL;
+PFNCLENQUEUEUNMAPMEMOBJECT __clewEnqueueUnmapMemObject = NULL;
+PFNCLENQUEUENDRANGEKERNEL __clewEnqueueNDRangeKernel = NULL;
+PFNCLENQUEUETASK __clewEnqueueTask = NULL;
+PFNCLENQUEUENATIVEKERNEL __clewEnqueueNativeKernel = NULL;
+PFNCLENQUEUEMARKER __clewEnqueueMarker = NULL;
+PFNCLENQUEUEWAITFOREVENTS __clewEnqueueWaitForEvents = NULL;
+PFNCLENQUEUEBARRIER __clewEnqueueBarrier = NULL;
+PFNCLGETEXTENSIONFUNCTIONADDRESS __clewGetExtensionFunctionAddress = NULL;
void clewExit(void)
{
- if (module != NULL)
- {
- // Ignore errors
- CLEW_DYNLIB_CLOSE(module);
- module = NULL;
- }
+ if (module != NULL)
+ {
+ // Ignore errors
+ CLEW_DYNLIB_CLOSE(module);
+ module = NULL;
+ }
}
int clewInit(const char* path)
{
- int error = 0;
+ int error = 0;
- // Check if already initialized
- if (module != NULL)
- {
- return CLEW_SUCCESS;
- }
+ // Check if already initialized
+ if (module != NULL)
+ {
+ return CLEW_SUCCESS;
+ }
- // Load library
- module = CLEW_DYNLIB_OPEN(path);
+ // Load library
+ module = CLEW_DYNLIB_OPEN(path);
- // Check for errors
- if (module == NULL)
- {
- return CLEW_ERROR_OPEN_FAILED;
- }
+ // Check for errors
+ if (module == NULL)
+ {
+ return CLEW_ERROR_OPEN_FAILED;
+ }
- // Set unloading
- error = atexit(clewExit);
+ // Set unloading
+ error = atexit(clewExit);
- if (error)
- {
- // Failure queuing atexit, shutdown with error
- CLEW_DYNLIB_CLOSE(module);
- module = NULL;
+ if (error)
+ {
+ // Failure queuing atexit, shutdown with error
+ CLEW_DYNLIB_CLOSE(module);
+ module = NULL;
- return CLEW_ERROR_ATEXIT_FAILED;
- }
+ return CLEW_ERROR_ATEXIT_FAILED;
+ }
- // Determine function entry-points
- __clewGetPlatformIDs = (PFNCLGETPLATFORMIDS )CLEW_DYNLIB_IMPORT(module, "clGetPlatformIDs");
- __clewGetPlatformInfo = (PFNCLGETPLATFORMINFO )CLEW_DYNLIB_IMPORT(module, "clGetPlatformInfo");
- __clewGetDeviceIDs = (PFNCLGETDEVICEIDS )CLEW_DYNLIB_IMPORT(module, "clGetDeviceIDs");
- __clewGetDeviceInfo = (PFNCLGETDEVICEINFO )CLEW_DYNLIB_IMPORT(module, "clGetDeviceInfo");
- __clewCreateContext = (PFNCLCREATECONTEXT )CLEW_DYNLIB_IMPORT(module, "clCreateContext");
- __clewCreateContextFromType = (PFNCLCREATECONTEXTFROMTYPE )CLEW_DYNLIB_IMPORT(module, "clCreateContextFromType");
- __clewRetainContext = (PFNCLRETAINCONTEXT )CLEW_DYNLIB_IMPORT(module, "clRetainContext");
- __clewReleaseContext = (PFNCLRELEASECONTEXT )CLEW_DYNLIB_IMPORT(module, "clReleaseContext");
- __clewGetContextInfo = (PFNCLGETCONTEXTINFO )CLEW_DYNLIB_IMPORT(module, "clGetContextInfo");
- __clewCreateCommandQueue = (PFNCLCREATECOMMANDQUEUE )CLEW_DYNLIB_IMPORT(module, "clCreateCommandQueue");
- __clewRetainCommandQueue = (PFNCLRETAINCOMMANDQUEUE )CLEW_DYNLIB_IMPORT(module, "clRetainCommandQueue");
- __clewReleaseCommandQueue = (PFNCLRELEASECOMMANDQUEUE )CLEW_DYNLIB_IMPORT(module, "clReleaseCommandQueue");
- __clewGetCommandQueueInfo = (PFNCLGETCOMMANDQUEUEINFO )CLEW_DYNLIB_IMPORT(module, "clGetCommandQueueInfo");
+ // Determine function entry-points
+ __clewGetPlatformIDs = (PFNCLGETPLATFORMIDS)CLEW_DYNLIB_IMPORT(module, "clGetPlatformIDs");
+ __clewGetPlatformInfo = (PFNCLGETPLATFORMINFO)CLEW_DYNLIB_IMPORT(module, "clGetPlatformInfo");
+ __clewGetDeviceIDs = (PFNCLGETDEVICEIDS)CLEW_DYNLIB_IMPORT(module, "clGetDeviceIDs");
+ __clewGetDeviceInfo = (PFNCLGETDEVICEINFO)CLEW_DYNLIB_IMPORT(module, "clGetDeviceInfo");
+ __clewCreateContext = (PFNCLCREATECONTEXT)CLEW_DYNLIB_IMPORT(module, "clCreateContext");
+ __clewCreateContextFromType = (PFNCLCREATECONTEXTFROMTYPE)CLEW_DYNLIB_IMPORT(module, "clCreateContextFromType");
+ __clewRetainContext = (PFNCLRETAINCONTEXT)CLEW_DYNLIB_IMPORT(module, "clRetainContext");
+ __clewReleaseContext = (PFNCLRELEASECONTEXT)CLEW_DYNLIB_IMPORT(module, "clReleaseContext");
+ __clewGetContextInfo = (PFNCLGETCONTEXTINFO)CLEW_DYNLIB_IMPORT(module, "clGetContextInfo");
+ __clewCreateCommandQueue = (PFNCLCREATECOMMANDQUEUE)CLEW_DYNLIB_IMPORT(module, "clCreateCommandQueue");
+ __clewRetainCommandQueue = (PFNCLRETAINCOMMANDQUEUE)CLEW_DYNLIB_IMPORT(module, "clRetainCommandQueue");
+ __clewReleaseCommandQueue = (PFNCLRELEASECOMMANDQUEUE)CLEW_DYNLIB_IMPORT(module, "clReleaseCommandQueue");
+ __clewGetCommandQueueInfo = (PFNCLGETCOMMANDQUEUEINFO)CLEW_DYNLIB_IMPORT(module, "clGetCommandQueueInfo");
#ifdef CL_USE_DEPRECATED_OPENCL_1_0_APIS
- __clewSetCommandQueueProperty = (PFNCLSETCOMMANDQUEUEPROPERTY )CLEW_DYNLIB_IMPORT(module, "clSetCommandQueueProperty");
+ __clewSetCommandQueueProperty = (PFNCLSETCOMMANDQUEUEPROPERTY)CLEW_DYNLIB_IMPORT(module, "clSetCommandQueueProperty");
#endif
- __clewCreateBuffer = (PFNCLCREATEBUFFER )CLEW_DYNLIB_IMPORT(module, "clCreateBuffer");
- __clewCreateSubBuffer = (PFNCLCREATESUBBUFFER )CLEW_DYNLIB_IMPORT(module, "clCreateBuffer");
- __clewCreateImage2D = (PFNCLCREATEIMAGE2D )CLEW_DYNLIB_IMPORT(module, "clCreateImage2D");
- __clewCreateImage3D = (PFNCLCREATEIMAGE3D )CLEW_DYNLIB_IMPORT(module, "clCreateImage3D");
- __clewRetainMemObject = (PFNCLRETAINMEMOBJECT )CLEW_DYNLIB_IMPORT(module, "clRetainMemObject");
- __clewReleaseMemObject = (PFNCLRELEASEMEMOBJECT )CLEW_DYNLIB_IMPORT(module, "clReleaseMemObject");
- __clewGetSupportedImageFormats = (PFNCLGETSUPPORTEDIMAGEFORMATS )CLEW_DYNLIB_IMPORT(module, "clGetSupportedImageFormats");
- __clewGetMemObjectInfo = (PFNCLGETMEMOBJECTINFO )CLEW_DYNLIB_IMPORT(module, "clGetMemObjectInfo");
- __clewGetImageInfo = (PFNCLGETIMAGEINFO )CLEW_DYNLIB_IMPORT(module, "clGetImageInfo");
- __clewSetMemObjectDestructorCallback = (PFNCLSETMEMOBJECTDESTRUCTORCALLBACK)CLEW_DYNLIB_IMPORT(module, "clSetMemObjectDestructorCallback");
- __clewCreateSampler = (PFNCLCREATESAMPLER )CLEW_DYNLIB_IMPORT(module, "clCreateSampler");
- __clewRetainSampler = (PFNCLRETAINSAMPLER )CLEW_DYNLIB_IMPORT(module, "clRetainSampler");
- __clewReleaseSampler = (PFNCLRELEASESAMPLER )CLEW_DYNLIB_IMPORT(module, "clReleaseSampler");
- __clewGetSamplerInfo = (PFNCLGETSAMPLERINFO )CLEW_DYNLIB_IMPORT(module, "clGetSamplerInfo");
- __clewCreateProgramWithSource = (PFNCLCREATEPROGRAMWITHSOURCE )CLEW_DYNLIB_IMPORT(module, "clCreateProgramWithSource");
- __clewCreateProgramWithBinary = (PFNCLCREATEPROGRAMWITHBINARY )CLEW_DYNLIB_IMPORT(module, "clCreateProgramWithBinary");
- __clewRetainProgram = (PFNCLRETAINPROGRAM )CLEW_DYNLIB_IMPORT(module, "clRetainProgram");
- __clewReleaseProgram = (PFNCLRELEASEPROGRAM )CLEW_DYNLIB_IMPORT(module, "clReleaseProgram");
- __clewBuildProgram = (PFNCLBUILDPROGRAM )CLEW_DYNLIB_IMPORT(module, "clBuildProgram");
- __clewUnloadCompiler = (PFNCLUNLOADCOMPILER )CLEW_DYNLIB_IMPORT(module, "clUnloadCompiler");
- __clewGetProgramInfo = (PFNCLGETPROGRAMINFO )CLEW_DYNLIB_IMPORT(module, "clGetProgramInfo");
- __clewGetProgramBuildInfo = (PFNCLGETPROGRAMBUILDINFO )CLEW_DYNLIB_IMPORT(module, "clGetProgramBuildInfo");
- __clewCreateKernel = (PFNCLCREATEKERNEL )CLEW_DYNLIB_IMPORT(module, "clCreateKernel");
- __clewCreateKernelsInProgram = (PFNCLCREATEKERNELSINPROGRAM )CLEW_DYNLIB_IMPORT(module, "clCreateKernelsInProgram");
- __clewRetainKernel = (PFNCLRETAINKERNEL )CLEW_DYNLIB_IMPORT(module, "clRetainKernel");
- __clewReleaseKernel = (PFNCLRELEASEKERNEL )CLEW_DYNLIB_IMPORT(module, "clReleaseKernel");
- __clewSetKernelArg = (PFNCLSETKERNELARG )CLEW_DYNLIB_IMPORT(module, "clSetKernelArg");
- __clewGetKernelInfo = (PFNCLGETKERNELINFO )CLEW_DYNLIB_IMPORT(module, "clGetKernelInfo");
- __clewGetKernelWorkGroupInfo = (PFNCLGETKERNELWORKGROUPINFO )CLEW_DYNLIB_IMPORT(module, "clGetKernelWorkGroupInfo");
- __clewWaitForEvents = (PFNCLWAITFOREVENTS )CLEW_DYNLIB_IMPORT(module, "clWaitForEvents");
- __clewGetEventInfo = (PFNCLGETEVENTINFO )CLEW_DYNLIB_IMPORT(module, "clGetEventInfo");
- __clewCreateUserEvent = (PFNCLCREATEUSEREVENT )CLEW_DYNLIB_IMPORT(module, "clCreateUserEvent");
- __clewRetainEvent = (PFNCLRETAINEVENT )CLEW_DYNLIB_IMPORT(module, "clRetainEvent");
- __clewReleaseEvent = (PFNCLRELEASEEVENT )CLEW_DYNLIB_IMPORT(module, "clReleaseEvent");
- __clewSetUserEventStatus = (PFNCLSETUSEREVENTSTATUS )CLEW_DYNLIB_IMPORT(module, "clSetUserEventStatus");
- __clewSetEventCallback = (PFNCLSETEVENTCALLBACK )CLEW_DYNLIB_IMPORT(module, "clSetEventCallback");
- __clewGetEventProfilingInfo = (PFNCLGETEVENTPROFILINGINFO )CLEW_DYNLIB_IMPORT(module, "clGetEventProfilingInfo");
- __clewFlush = (PFNCLFLUSH )CLEW_DYNLIB_IMPORT(module, "clFlush");
- __clewFinish = (PFNCLFINISH )CLEW_DYNLIB_IMPORT(module, "clFinish");
- __clewEnqueueReadBuffer = (PFNCLENQUEUEREADBUFFER )CLEW_DYNLIB_IMPORT(module, "clEnqueueReadBuffer");
- __clewEnqueueReadBufferRect = (PFNCLENQUEUEREADBUFFERRECT )CLEW_DYNLIB_IMPORT(module, "clEnqueueReadBufferRect");
- __clewEnqueueWriteBuffer = (PFNCLENQUEUEWRITEBUFFER )CLEW_DYNLIB_IMPORT(module, "clEnqueueWriteBuffer");
- __clewEnqueueWriteBufferRect = (PFNCLENQUEUEWRITEBUFFERRECT )CLEW_DYNLIB_IMPORT(module, "clEnqueueWriteBufferRect");
- __clewEnqueueCopyBuffer = (PFNCLENQUEUECOPYBUFFER )CLEW_DYNLIB_IMPORT(module, "clEnqueueCopyBuffer");
- __clewEnqueueCopyBufferRect = (PFNCLENQUEUECOPYBUFFERRECT )CLEW_DYNLIB_IMPORT(module, "clEnqueueCopyBufferRect");
- __clewEnqueueReadImage = (PFNCLENQUEUEREADIMAGE )CLEW_DYNLIB_IMPORT(module, "clEnqueueReadImage");
- __clewEnqueueWriteImage = (PFNCLENQUEUEWRITEIMAGE )CLEW_DYNLIB_IMPORT(module, "clEnqueueWriteImage");
- __clewEnqueueCopyImage = (PFNCLENQUEUECOPYIMAGE )CLEW_DYNLIB_IMPORT(module, "clEnqueueCopyImage");
- __clewEnqueueCopyImageToBuffer = (PFNCLENQUEUECOPYIMAGETOBUFFER )CLEW_DYNLIB_IMPORT(module, "clEnqueueCopyImageToBuffer");
- __clewEnqueueCopyBufferToImage = (PFNCLENQUEUECOPYBUFFERTOIMAGE )CLEW_DYNLIB_IMPORT(module, "clEnqueueCopyBufferToImage");
- __clewEnqueueMapBuffer = (PFNCLENQUEUEMAPBUFFER )CLEW_DYNLIB_IMPORT(module, "clEnqueueMapBuffer");
- __clewEnqueueMapImage = (PFNCLENQUEUEMAPIMAGE )CLEW_DYNLIB_IMPORT(module, "clEnqueueMapImage");
- __clewEnqueueUnmapMemObject = (PFNCLENQUEUEUNMAPMEMOBJECT )CLEW_DYNLIB_IMPORT(module, "clEnqueueUnmapMemObject");
- __clewEnqueueNDRangeKernel = (PFNCLENQUEUENDRANGEKERNEL )CLEW_DYNLIB_IMPORT(module, "clEnqueueNDRangeKernel");
- __clewEnqueueTask = (PFNCLENQUEUETASK )CLEW_DYNLIB_IMPORT(module, "clEnqueueTask");
- __clewEnqueueNativeKernel = (PFNCLENQUEUENATIVEKERNEL )CLEW_DYNLIB_IMPORT(module, "clEnqueueNativeKernel");
- __clewEnqueueMarker = (PFNCLENQUEUEMARKER )CLEW_DYNLIB_IMPORT(module, "clEnqueueMarker");
- __clewEnqueueWaitForEvents = (PFNCLENQUEUEWAITFOREVENTS )CLEW_DYNLIB_IMPORT(module, "clEnqueueWaitForEvents");
- __clewEnqueueBarrier = (PFNCLENQUEUEBARRIER )CLEW_DYNLIB_IMPORT(module, "clEnqueueBarrier");
- __clewGetExtensionFunctionAddress = (PFNCLGETEXTENSIONFUNCTIONADDRESS )CLEW_DYNLIB_IMPORT(module, "clGetExtensionFunctionAddress");
+ __clewCreateBuffer = (PFNCLCREATEBUFFER)CLEW_DYNLIB_IMPORT(module, "clCreateBuffer");
+ __clewCreateSubBuffer = (PFNCLCREATESUBBUFFER)CLEW_DYNLIB_IMPORT(module, "clCreateBuffer");
+ __clewCreateImage2D = (PFNCLCREATEIMAGE2D)CLEW_DYNLIB_IMPORT(module, "clCreateImage2D");
+ __clewCreateImage3D = (PFNCLCREATEIMAGE3D)CLEW_DYNLIB_IMPORT(module, "clCreateImage3D");
+ __clewRetainMemObject = (PFNCLRETAINMEMOBJECT)CLEW_DYNLIB_IMPORT(module, "clRetainMemObject");
+ __clewReleaseMemObject = (PFNCLRELEASEMEMOBJECT)CLEW_DYNLIB_IMPORT(module, "clReleaseMemObject");
+ __clewGetSupportedImageFormats = (PFNCLGETSUPPORTEDIMAGEFORMATS)CLEW_DYNLIB_IMPORT(module, "clGetSupportedImageFormats");
+ __clewGetMemObjectInfo = (PFNCLGETMEMOBJECTINFO)CLEW_DYNLIB_IMPORT(module, "clGetMemObjectInfo");
+ __clewGetImageInfo = (PFNCLGETIMAGEINFO)CLEW_DYNLIB_IMPORT(module, "clGetImageInfo");
+ __clewSetMemObjectDestructorCallback = (PFNCLSETMEMOBJECTDESTRUCTORCALLBACK)CLEW_DYNLIB_IMPORT(module, "clSetMemObjectDestructorCallback");
+ __clewCreateSampler = (PFNCLCREATESAMPLER)CLEW_DYNLIB_IMPORT(module, "clCreateSampler");
+ __clewRetainSampler = (PFNCLRETAINSAMPLER)CLEW_DYNLIB_IMPORT(module, "clRetainSampler");
+ __clewReleaseSampler = (PFNCLRELEASESAMPLER)CLEW_DYNLIB_IMPORT(module, "clReleaseSampler");
+ __clewGetSamplerInfo = (PFNCLGETSAMPLERINFO)CLEW_DYNLIB_IMPORT(module, "clGetSamplerInfo");
+ __clewCreateProgramWithSource = (PFNCLCREATEPROGRAMWITHSOURCE)CLEW_DYNLIB_IMPORT(module, "clCreateProgramWithSource");
+ __clewCreateProgramWithBinary = (PFNCLCREATEPROGRAMWITHBINARY)CLEW_DYNLIB_IMPORT(module, "clCreateProgramWithBinary");
+ __clewRetainProgram = (PFNCLRETAINPROGRAM)CLEW_DYNLIB_IMPORT(module, "clRetainProgram");
+ __clewReleaseProgram = (PFNCLRELEASEPROGRAM)CLEW_DYNLIB_IMPORT(module, "clReleaseProgram");
+ __clewBuildProgram = (PFNCLBUILDPROGRAM)CLEW_DYNLIB_IMPORT(module, "clBuildProgram");
+ __clewUnloadCompiler = (PFNCLUNLOADCOMPILER)CLEW_DYNLIB_IMPORT(module, "clUnloadCompiler");
+ __clewGetProgramInfo = (PFNCLGETPROGRAMINFO)CLEW_DYNLIB_IMPORT(module, "clGetProgramInfo");
+ __clewGetProgramBuildInfo = (PFNCLGETPROGRAMBUILDINFO)CLEW_DYNLIB_IMPORT(module, "clGetProgramBuildInfo");
+ __clewCreateKernel = (PFNCLCREATEKERNEL)CLEW_DYNLIB_IMPORT(module, "clCreateKernel");
+ __clewCreateKernelsInProgram = (PFNCLCREATEKERNELSINPROGRAM)CLEW_DYNLIB_IMPORT(module, "clCreateKernelsInProgram");
+ __clewRetainKernel = (PFNCLRETAINKERNEL)CLEW_DYNLIB_IMPORT(module, "clRetainKernel");
+ __clewReleaseKernel = (PFNCLRELEASEKERNEL)CLEW_DYNLIB_IMPORT(module, "clReleaseKernel");
+ __clewSetKernelArg = (PFNCLSETKERNELARG)CLEW_DYNLIB_IMPORT(module, "clSetKernelArg");
+ __clewGetKernelInfo = (PFNCLGETKERNELINFO)CLEW_DYNLIB_IMPORT(module, "clGetKernelInfo");
+ __clewGetKernelWorkGroupInfo = (PFNCLGETKERNELWORKGROUPINFO)CLEW_DYNLIB_IMPORT(module, "clGetKernelWorkGroupInfo");
+ __clewWaitForEvents = (PFNCLWAITFOREVENTS)CLEW_DYNLIB_IMPORT(module, "clWaitForEvents");
+ __clewGetEventInfo = (PFNCLGETEVENTINFO)CLEW_DYNLIB_IMPORT(module, "clGetEventInfo");
+ __clewCreateUserEvent = (PFNCLCREATEUSEREVENT)CLEW_DYNLIB_IMPORT(module, "clCreateUserEvent");
+ __clewRetainEvent = (PFNCLRETAINEVENT)CLEW_DYNLIB_IMPORT(module, "clRetainEvent");
+ __clewReleaseEvent = (PFNCLRELEASEEVENT)CLEW_DYNLIB_IMPORT(module, "clReleaseEvent");
+ __clewSetUserEventStatus = (PFNCLSETUSEREVENTSTATUS)CLEW_DYNLIB_IMPORT(module, "clSetUserEventStatus");
+ __clewSetEventCallback = (PFNCLSETEVENTCALLBACK)CLEW_DYNLIB_IMPORT(module, "clSetEventCallback");
+ __clewGetEventProfilingInfo = (PFNCLGETEVENTPROFILINGINFO)CLEW_DYNLIB_IMPORT(module, "clGetEventProfilingInfo");
+ __clewFlush = (PFNCLFLUSH)CLEW_DYNLIB_IMPORT(module, "clFlush");
+ __clewFinish = (PFNCLFINISH)CLEW_DYNLIB_IMPORT(module, "clFinish");
+ __clewEnqueueReadBuffer = (PFNCLENQUEUEREADBUFFER)CLEW_DYNLIB_IMPORT(module, "clEnqueueReadBuffer");
+ __clewEnqueueReadBufferRect = (PFNCLENQUEUEREADBUFFERRECT)CLEW_DYNLIB_IMPORT(module, "clEnqueueReadBufferRect");
+ __clewEnqueueWriteBuffer = (PFNCLENQUEUEWRITEBUFFER)CLEW_DYNLIB_IMPORT(module, "clEnqueueWriteBuffer");
+ __clewEnqueueWriteBufferRect = (PFNCLENQUEUEWRITEBUFFERRECT)CLEW_DYNLIB_IMPORT(module, "clEnqueueWriteBufferRect");
+ __clewEnqueueCopyBuffer = (PFNCLENQUEUECOPYBUFFER)CLEW_DYNLIB_IMPORT(module, "clEnqueueCopyBuffer");
+ __clewEnqueueCopyBufferRect = (PFNCLENQUEUECOPYBUFFERRECT)CLEW_DYNLIB_IMPORT(module, "clEnqueueCopyBufferRect");
+ __clewEnqueueReadImage = (PFNCLENQUEUEREADIMAGE)CLEW_DYNLIB_IMPORT(module, "clEnqueueReadImage");
+ __clewEnqueueWriteImage = (PFNCLENQUEUEWRITEIMAGE)CLEW_DYNLIB_IMPORT(module, "clEnqueueWriteImage");
+ __clewEnqueueCopyImage = (PFNCLENQUEUECOPYIMAGE)CLEW_DYNLIB_IMPORT(module, "clEnqueueCopyImage");
+ __clewEnqueueCopyImageToBuffer = (PFNCLENQUEUECOPYIMAGETOBUFFER)CLEW_DYNLIB_IMPORT(module, "clEnqueueCopyImageToBuffer");
+ __clewEnqueueCopyBufferToImage = (PFNCLENQUEUECOPYBUFFERTOIMAGE)CLEW_DYNLIB_IMPORT(module, "clEnqueueCopyBufferToImage");
+ __clewEnqueueMapBuffer = (PFNCLENQUEUEMAPBUFFER)CLEW_DYNLIB_IMPORT(module, "clEnqueueMapBuffer");
+ __clewEnqueueMapImage = (PFNCLENQUEUEMAPIMAGE)CLEW_DYNLIB_IMPORT(module, "clEnqueueMapImage");
+ __clewEnqueueUnmapMemObject = (PFNCLENQUEUEUNMAPMEMOBJECT)CLEW_DYNLIB_IMPORT(module, "clEnqueueUnmapMemObject");
+ __clewEnqueueNDRangeKernel = (PFNCLENQUEUENDRANGEKERNEL)CLEW_DYNLIB_IMPORT(module, "clEnqueueNDRangeKernel");
+ __clewEnqueueTask = (PFNCLENQUEUETASK)CLEW_DYNLIB_IMPORT(module, "clEnqueueTask");
+ __clewEnqueueNativeKernel = (PFNCLENQUEUENATIVEKERNEL)CLEW_DYNLIB_IMPORT(module, "clEnqueueNativeKernel");
+ __clewEnqueueMarker = (PFNCLENQUEUEMARKER)CLEW_DYNLIB_IMPORT(module, "clEnqueueMarker");
+ __clewEnqueueWaitForEvents = (PFNCLENQUEUEWAITFOREVENTS)CLEW_DYNLIB_IMPORT(module, "clEnqueueWaitForEvents");
+ __clewEnqueueBarrier = (PFNCLENQUEUEBARRIER)CLEW_DYNLIB_IMPORT(module, "clEnqueueBarrier");
+ __clewGetExtensionFunctionAddress = (PFNCLGETEXTENSIONFUNCTIONADDRESS)CLEW_DYNLIB_IMPORT(module, "clGetExtensionFunctionAddress");
- return CLEW_SUCCESS;
+ return CLEW_SUCCESS;
}
const char* clewErrorString(cl_int error)
{
- static const char* strings[] =
- {
- // Error Codes
- "CL_SUCCESS" // 0
- , "CL_DEVICE_NOT_FOUND" // -1
- , "CL_DEVICE_NOT_AVAILABLE" // -2
- , "CL_COMPILER_NOT_AVAILABLE" // -3
- , "CL_MEM_OBJECT_ALLOCATION_FAILURE" // -4
- , "CL_OUT_OF_RESOURCES" // -5
- , "CL_OUT_OF_HOST_MEMORY" // -6
- , "CL_PROFILING_INFO_NOT_AVAILABLE" // -7
- , "CL_MEM_COPY_OVERLAP" // -8
- , "CL_IMAGE_FORMAT_MISMATCH" // -9
- , "CL_IMAGE_FORMAT_NOT_SUPPORTED" // -10
- , "CL_BUILD_PROGRAM_FAILURE" // -11
- , "CL_MAP_FAILURE" // -12
+ static const char* strings[] =
+ {
+ // Error Codes
+ "CL_SUCCESS" // 0
+ ,
+ "CL_DEVICE_NOT_FOUND" // -1
+ ,
+ "CL_DEVICE_NOT_AVAILABLE" // -2
+ ,
+ "CL_COMPILER_NOT_AVAILABLE" // -3
+ ,
+ "CL_MEM_OBJECT_ALLOCATION_FAILURE" // -4
+ ,
+ "CL_OUT_OF_RESOURCES" // -5
+ ,
+ "CL_OUT_OF_HOST_MEMORY" // -6
+ ,
+ "CL_PROFILING_INFO_NOT_AVAILABLE" // -7
+ ,
+ "CL_MEM_COPY_OVERLAP" // -8
+ ,
+ "CL_IMAGE_FORMAT_MISMATCH" // -9
+ ,
+ "CL_IMAGE_FORMAT_NOT_SUPPORTED" // -10
+ ,
+ "CL_BUILD_PROGRAM_FAILURE" // -11
+ ,
+ "CL_MAP_FAILURE" // -12
- , "" // -13
- , "" // -14
- , "" // -15
- , "" // -16
- , "" // -17
- , "" // -18
- , "" // -19
+ ,
+ "" // -13
+ ,
+ "" // -14
+ ,
+ "" // -15
+ ,
+ "" // -16
+ ,
+ "" // -17
+ ,
+ "" // -18
+ ,
+ "" // -19
- , "" // -20
- , "" // -21
- , "" // -22
- , "" // -23
- , "" // -24
- , "" // -25
- , "" // -26
- , "" // -27
- , "" // -28
- , "" // -29
+ ,
+ "" // -20
+ ,
+ "" // -21
+ ,
+ "" // -22
+ ,
+ "" // -23
+ ,
+ "" // -24
+ ,
+ "" // -25
+ ,
+ "" // -26
+ ,
+ "" // -27
+ ,
+ "" // -28
+ ,
+ "" // -29
- , "CL_INVALID_VALUE" // -30
- , "CL_INVALID_DEVICE_TYPE" // -31
- , "CL_INVALID_PLATFORM" // -32
- , "CL_INVALID_DEVICE" // -33
- , "CL_INVALID_CONTEXT" // -34
- , "CL_INVALID_QUEUE_PROPERTIES" // -35
- , "CL_INVALID_COMMAND_QUEUE" // -36
- , "CL_INVALID_HOST_PTR" // -37
- , "CL_INVALID_MEM_OBJECT" // -38
- , "CL_INVALID_IMAGE_FORMAT_DESCRIPTOR" // -39
- , "CL_INVALID_IMAGE_SIZE" // -40
- , "CL_INVALID_SAMPLER" // -41
- , "CL_INVALID_BINARY" // -42
- , "CL_INVALID_BUILD_OPTIONS" // -43
- , "CL_INVALID_PROGRAM" // -44
- , "CL_INVALID_PROGRAM_EXECUTABLE" // -45
- , "CL_INVALID_KERNEL_NAME" // -46
- , "CL_INVALID_KERNEL_DEFINITION" // -47
- , "CL_INVALID_KERNEL" // -48
- , "CL_INVALID_ARG_INDEX" // -49
- , "CL_INVALID_ARG_VALUE" // -50
- , "CL_INVALID_ARG_SIZE" // -51
- , "CL_INVALID_KERNEL_ARGS" // -52
- , "CL_INVALID_WORK_DIMENSION" // -53
- , "CL_INVALID_WORK_GROUP_SIZE" // -54
- , "CL_INVALID_WORK_ITEM_SIZE" // -55
- , "CL_INVALID_GLOBAL_OFFSET" // -56
- , "CL_INVALID_EVENT_WAIT_LIST" // -57
- , "CL_INVALID_EVENT" // -58
- , "CL_INVALID_OPERATION" // -59
- , "CL_INVALID_GL_OBJECT" // -60
- , "CL_INVALID_BUFFER_SIZE" // -61
- , "CL_INVALID_MIP_LEVEL" // -62
- , "CL_INVALID_GLOBAL_WORK_SIZE" // -63
- };
+ ,
+ "CL_INVALID_VALUE" // -30
+ ,
+ "CL_INVALID_DEVICE_TYPE" // -31
+ ,
+ "CL_INVALID_PLATFORM" // -32
+ ,
+ "CL_INVALID_DEVICE" // -33
+ ,
+ "CL_INVALID_CONTEXT" // -34
+ ,
+ "CL_INVALID_QUEUE_PROPERTIES" // -35
+ ,
+ "CL_INVALID_COMMAND_QUEUE" // -36
+ ,
+ "CL_INVALID_HOST_PTR" // -37
+ ,
+ "CL_INVALID_MEM_OBJECT" // -38
+ ,
+ "CL_INVALID_IMAGE_FORMAT_DESCRIPTOR" // -39
+ ,
+ "CL_INVALID_IMAGE_SIZE" // -40
+ ,
+ "CL_INVALID_SAMPLER" // -41
+ ,
+ "CL_INVALID_BINARY" // -42
+ ,
+ "CL_INVALID_BUILD_OPTIONS" // -43
+ ,
+ "CL_INVALID_PROGRAM" // -44
+ ,
+ "CL_INVALID_PROGRAM_EXECUTABLE" // -45
+ ,
+ "CL_INVALID_KERNEL_NAME" // -46
+ ,
+ "CL_INVALID_KERNEL_DEFINITION" // -47
+ ,
+ "CL_INVALID_KERNEL" // -48
+ ,
+ "CL_INVALID_ARG_INDEX" // -49
+ ,
+ "CL_INVALID_ARG_VALUE" // -50
+ ,
+ "CL_INVALID_ARG_SIZE" // -51
+ ,
+ "CL_INVALID_KERNEL_ARGS" // -52
+ ,
+ "CL_INVALID_WORK_DIMENSION" // -53
+ ,
+ "CL_INVALID_WORK_GROUP_SIZE" // -54
+ ,
+ "CL_INVALID_WORK_ITEM_SIZE" // -55
+ ,
+ "CL_INVALID_GLOBAL_OFFSET" // -56
+ ,
+ "CL_INVALID_EVENT_WAIT_LIST" // -57
+ ,
+ "CL_INVALID_EVENT" // -58
+ ,
+ "CL_INVALID_OPERATION" // -59
+ ,
+ "CL_INVALID_GL_OBJECT" // -60
+ ,
+ "CL_INVALID_BUFFER_SIZE" // -61
+ ,
+ "CL_INVALID_MIP_LEVEL" // -62
+ ,
+ "CL_INVALID_GLOBAL_WORK_SIZE" // -63
+ };
- return strings[-error];
+ return strings[-error];
}
diff --git a/thirdparty/bullet/clew/clew.h b/thirdparty/bullet/clew/clew.h
index ee0fef18b4..cba8585233 100644
--- a/thirdparty/bullet/clew/clew.h
+++ b/thirdparty/bullet/clew/clew.h
@@ -11,7 +11,7 @@
//! \file clew.h
//! \brief OpenCL run-time loader header
//!
-//! This file contains a copy of the contents of CL.H and CL_PLATFORM.H from the
+//! This file contains a copy of the contents of CL.H and CL_PLATFORM.H from the
//! official OpenCL spec. The purpose of this code is to load the OpenCL dynamic
//! library at run-time and thus allow the executable to function on many
//! platforms regardless of the vendor of the OpenCL driver actually installed.
@@ -19,11 +19,11 @@
//! library (http://glew.sourceforge.net/)
// Run-time dynamic linking functionality based on concepts used in GLEW
-#ifdef __OPENCL_CL_H
+#ifdef __OPENCL_CL_H
#error cl.h included before clew.h
#endif
-#ifdef __OPENCL_CL_PLATFORM_H
+#ifdef __OPENCL_CL_PLATFORM_H
#error cl_platform.h included before clew.h
#endif
@@ -55,238 +55,239 @@
* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
******************************************************************************/
#ifdef __APPLE__
- /* Contains #defines for AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER below */
- #include <AvailabilityMacros.h>
+/* Contains #defines for AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER below */
+#include <AvailabilityMacros.h>
#endif
#ifdef __cplusplus
-extern "C" {
+extern "C"
+{
#endif
#if defined(_WIN32)
- #define CL_API_ENTRY
- #define CL_API_CALL __stdcall
- #define CL_CALLBACK __stdcall
+#define CL_API_ENTRY
+#define CL_API_CALL __stdcall
+#define CL_CALLBACK __stdcall
#else
- #define CL_API_ENTRY
- #define CL_API_CALL
- #define CL_CALLBACK
+#define CL_API_ENTRY
+#define CL_API_CALL
+#define CL_CALLBACK
#endif
-//disabled the APPLE thing, don't know why it is there, is just causes tons of warnings
+ //disabled the APPLE thing, don't know why it is there, is just causes tons of warnings
#ifdef __APPLE1__
- #define CL_EXTENSION_WEAK_LINK __attribute__((weak_import))
- #define CL_API_SUFFIX__VERSION_1_0 AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER
- #define CL_EXT_SUFFIX__VERSION_1_0 CL_EXTENSION_WEAK_LINK AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER
- #define CL_API_SUFFIX__VERSION_1_1 CL_EXTENSION_WEAK_LINK
- #define CL_EXT_SUFFIX__VERSION_1_1 CL_EXTENSION_WEAK_LINK
- #define CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED CL_EXTENSION_WEAK_LINK AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER
+#define CL_EXTENSION_WEAK_LINK __attribute__((weak_import))
+#define CL_API_SUFFIX__VERSION_1_0 AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER
+#define CL_EXT_SUFFIX__VERSION_1_0 CL_EXTENSION_WEAK_LINK AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER
+#define CL_API_SUFFIX__VERSION_1_1 CL_EXTENSION_WEAK_LINK
+#define CL_EXT_SUFFIX__VERSION_1_1 CL_EXTENSION_WEAK_LINK
+#define CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED CL_EXTENSION_WEAK_LINK AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER
#else
- #define CL_EXTENSION_WEAK_LINK
- #define CL_API_SUFFIX__VERSION_1_0
- #define CL_EXT_SUFFIX__VERSION_1_0
- #define CL_API_SUFFIX__VERSION_1_1
- #define CL_EXT_SUFFIX__VERSION_1_1
- #define CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED
-#endif
-
-#if (defined (_WIN32) && defined(_MSC_VER))
-
-/* scalar types */
-typedef signed __int8 cl_char;
-typedef unsigned __int8 cl_uchar;
-typedef signed __int16 cl_short;
-typedef unsigned __int16 cl_ushort;
-typedef signed __int32 cl_int;
-typedef unsigned __int32 cl_uint;
-typedef signed __int64 cl_long;
-typedef unsigned __int64 cl_ulong;
-
-typedef unsigned __int16 cl_half;
-typedef float cl_float;
-typedef double cl_double;
+#define CL_EXTENSION_WEAK_LINK
+#define CL_API_SUFFIX__VERSION_1_0
+#define CL_EXT_SUFFIX__VERSION_1_0
+#define CL_API_SUFFIX__VERSION_1_1
+#define CL_EXT_SUFFIX__VERSION_1_1
+#define CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED
+#endif
+
+#if (defined(_WIN32) && defined(_MSC_VER))
+
+ /* scalar types */
+ typedef signed __int8 cl_char;
+ typedef unsigned __int8 cl_uchar;
+ typedef signed __int16 cl_short;
+ typedef unsigned __int16 cl_ushort;
+ typedef signed __int32 cl_int;
+ typedef unsigned __int32 cl_uint;
+ typedef signed __int64 cl_long;
+ typedef unsigned __int64 cl_ulong;
+
+ typedef unsigned __int16 cl_half;
+ typedef float cl_float;
+ typedef double cl_double;
/* Macro names and corresponding values defined by OpenCL */
-#define CL_CHAR_BIT 8
-#define CL_SCHAR_MAX 127
-#define CL_SCHAR_MIN (-127-1)
-#define CL_CHAR_MAX CL_SCHAR_MAX
-#define CL_CHAR_MIN CL_SCHAR_MIN
-#define CL_UCHAR_MAX 255
-#define CL_SHRT_MAX 32767
-#define CL_SHRT_MIN (-32767-1)
-#define CL_USHRT_MAX 65535
-#define CL_INT_MAX 2147483647
-#define CL_INT_MIN (-2147483647-1)
-#define CL_UINT_MAX 0xffffffffU
-#define CL_LONG_MAX ((cl_long) 0x7FFFFFFFFFFFFFFFLL)
-#define CL_LONG_MIN ((cl_long) -0x7FFFFFFFFFFFFFFFLL - 1LL)
-#define CL_ULONG_MAX ((cl_ulong) 0xFFFFFFFFFFFFFFFFULL)
-
-#define CL_FLT_DIG 6
-#define CL_FLT_MANT_DIG 24
-#define CL_FLT_MAX_10_EXP +38
-#define CL_FLT_MAX_EXP +128
-#define CL_FLT_MIN_10_EXP -37
-#define CL_FLT_MIN_EXP -125
-#define CL_FLT_RADIX 2
-#define CL_FLT_MAX 340282346638528859811704183484516925440.0f
-#define CL_FLT_MIN 1.175494350822287507969e-38f
-#define CL_FLT_EPSILON 0x1.0p-23f
-
-#define CL_DBL_DIG 15
-#define CL_DBL_MANT_DIG 53
-#define CL_DBL_MAX_10_EXP +308
-#define CL_DBL_MAX_EXP +1024
-#define CL_DBL_MIN_10_EXP -307
-#define CL_DBL_MIN_EXP -1021
-#define CL_DBL_RADIX 2
-#define CL_DBL_MAX 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0
-#define CL_DBL_MIN 2.225073858507201383090e-308
-#define CL_DBL_EPSILON 2.220446049250313080847e-16
-
-#define CL_M_E 2.718281828459045090796
-#define CL_M_LOG2E 1.442695040888963387005
-#define CL_M_LOG10E 0.434294481903251816668
-#define CL_M_LN2 0.693147180559945286227
-#define CL_M_LN10 2.302585092994045901094
-#define CL_M_PI 3.141592653589793115998
-#define CL_M_PI_2 1.570796326794896557999
-#define CL_M_PI_4 0.785398163397448278999
-#define CL_M_1_PI 0.318309886183790691216
-#define CL_M_2_PI 0.636619772367581382433
-#define CL_M_2_SQRTPI 1.128379167095512558561
-#define CL_M_SQRT2 1.414213562373095145475
-#define CL_M_SQRT1_2 0.707106781186547572737
-
-#define CL_M_E_F 2.71828174591064f
-#define CL_M_LOG2E_F 1.44269502162933f
-#define CL_M_LOG10E_F 0.43429449200630f
-#define CL_M_LN2_F 0.69314718246460f
-#define CL_M_LN10_F 2.30258512496948f
-#define CL_M_PI_F 3.14159274101257f
-#define CL_M_PI_2_F 1.57079637050629f
-#define CL_M_PI_4_F 0.78539818525314f
-#define CL_M_1_PI_F 0.31830987334251f
-#define CL_M_2_PI_F 0.63661974668503f
-#define CL_M_2_SQRTPI_F 1.12837922573090f
-#define CL_M_SQRT2_F 1.41421353816986f
-#define CL_M_SQRT1_2_F 0.70710676908493f
-
-#define CL_NAN (CL_INFINITY - CL_INFINITY)
-#define CL_HUGE_VALF ((cl_float) 1e50)
-#define CL_HUGE_VAL ((cl_double) 1e500)
-#define CL_MAXFLOAT CL_FLT_MAX
-#define CL_INFINITY CL_HUGE_VALF
+#define CL_CHAR_BIT 8
+#define CL_SCHAR_MAX 127
+#define CL_SCHAR_MIN (-127 - 1)
+#define CL_CHAR_MAX CL_SCHAR_MAX
+#define CL_CHAR_MIN CL_SCHAR_MIN
+#define CL_UCHAR_MAX 255
+#define CL_SHRT_MAX 32767
+#define CL_SHRT_MIN (-32767 - 1)
+#define CL_USHRT_MAX 65535
+#define CL_INT_MAX 2147483647
+#define CL_INT_MIN (-2147483647 - 1)
+#define CL_UINT_MAX 0xffffffffU
+#define CL_LONG_MAX ((cl_long)0x7FFFFFFFFFFFFFFFLL)
+#define CL_LONG_MIN ((cl_long)-0x7FFFFFFFFFFFFFFFLL - 1LL)
+#define CL_ULONG_MAX ((cl_ulong)0xFFFFFFFFFFFFFFFFULL)
+
+#define CL_FLT_DIG 6
+#define CL_FLT_MANT_DIG 24
+#define CL_FLT_MAX_10_EXP +38
+#define CL_FLT_MAX_EXP +128
+#define CL_FLT_MIN_10_EXP -37
+#define CL_FLT_MIN_EXP -125
+#define CL_FLT_RADIX 2
+#define CL_FLT_MAX 340282346638528859811704183484516925440.0f
+#define CL_FLT_MIN 1.175494350822287507969e-38f
+#define CL_FLT_EPSILON 0x1.0p-23f
+
+#define CL_DBL_DIG 15
+#define CL_DBL_MANT_DIG 53
+#define CL_DBL_MAX_10_EXP +308
+#define CL_DBL_MAX_EXP +1024
+#define CL_DBL_MIN_10_EXP -307
+#define CL_DBL_MIN_EXP -1021
+#define CL_DBL_RADIX 2
+#define CL_DBL_MAX 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0
+#define CL_DBL_MIN 2.225073858507201383090e-308
+#define CL_DBL_EPSILON 2.220446049250313080847e-16
+
+#define CL_M_E 2.718281828459045090796
+#define CL_M_LOG2E 1.442695040888963387005
+#define CL_M_LOG10E 0.434294481903251816668
+#define CL_M_LN2 0.693147180559945286227
+#define CL_M_LN10 2.302585092994045901094
+#define CL_M_PI 3.141592653589793115998
+#define CL_M_PI_2 1.570796326794896557999
+#define CL_M_PI_4 0.785398163397448278999
+#define CL_M_1_PI 0.318309886183790691216
+#define CL_M_2_PI 0.636619772367581382433
+#define CL_M_2_SQRTPI 1.128379167095512558561
+#define CL_M_SQRT2 1.414213562373095145475
+#define CL_M_SQRT1_2 0.707106781186547572737
+
+#define CL_M_E_F 2.71828174591064f
+#define CL_M_LOG2E_F 1.44269502162933f
+#define CL_M_LOG10E_F 0.43429449200630f
+#define CL_M_LN2_F 0.69314718246460f
+#define CL_M_LN10_F 2.30258512496948f
+#define CL_M_PI_F 3.14159274101257f
+#define CL_M_PI_2_F 1.57079637050629f
+#define CL_M_PI_4_F 0.78539818525314f
+#define CL_M_1_PI_F 0.31830987334251f
+#define CL_M_2_PI_F 0.63661974668503f
+#define CL_M_2_SQRTPI_F 1.12837922573090f
+#define CL_M_SQRT2_F 1.41421353816986f
+#define CL_M_SQRT1_2_F 0.70710676908493f
+
+#define CL_NAN (CL_INFINITY - CL_INFINITY)
+#define CL_HUGE_VALF ((cl_float)1e50)
+#define CL_HUGE_VAL ((cl_double)1e500)
+#define CL_MAXFLOAT CL_FLT_MAX
+#define CL_INFINITY CL_HUGE_VALF
#else
#include <stdint.h>
/* scalar types */
-typedef int8_t cl_char;
-typedef uint8_t cl_uchar;
-typedef int16_t cl_short __attribute__((aligned(2)));
-typedef uint16_t cl_ushort __attribute__((aligned(2)));
-typedef int32_t cl_int __attribute__((aligned(4)));
-typedef uint32_t cl_uint __attribute__((aligned(4)));
-typedef int64_t cl_long __attribute__((aligned(8)));
-typedef uint64_t cl_ulong __attribute__((aligned(8)));
-
-typedef uint16_t cl_half __attribute__((aligned(2)));
-typedef float cl_float __attribute__((aligned(4)));
-typedef double cl_double __attribute__((aligned(8)));
+typedef int8_t cl_char;
+typedef uint8_t cl_uchar;
+typedef int16_t cl_short __attribute__((aligned(2)));
+typedef uint16_t cl_ushort __attribute__((aligned(2)));
+typedef int32_t cl_int __attribute__((aligned(4)));
+typedef uint32_t cl_uint __attribute__((aligned(4)));
+typedef int64_t cl_long __attribute__((aligned(8)));
+typedef uint64_t cl_ulong __attribute__((aligned(8)));
+
+typedef uint16_t cl_half __attribute__((aligned(2)));
+typedef float cl_float __attribute__((aligned(4)));
+typedef double cl_double __attribute__((aligned(8)));
/* Macro names and corresponding values defined by OpenCL */
-#define CL_CHAR_BIT 8
-#define CL_SCHAR_MAX 127
-#define CL_SCHAR_MIN (-127-1)
-#define CL_CHAR_MAX CL_SCHAR_MAX
-#define CL_CHAR_MIN CL_SCHAR_MIN
-#define CL_UCHAR_MAX 255
-#define CL_SHRT_MAX 32767
-#define CL_SHRT_MIN (-32767-1)
-#define CL_USHRT_MAX 65535
-#define CL_INT_MAX 2147483647
-#define CL_INT_MIN (-2147483647-1)
-#define CL_UINT_MAX 0xffffffffU
-#define CL_LONG_MAX ((cl_long) 0x7FFFFFFFFFFFFFFFLL)
-#define CL_LONG_MIN ((cl_long) -0x7FFFFFFFFFFFFFFFLL - 1LL)
-#define CL_ULONG_MAX ((cl_ulong) 0xFFFFFFFFFFFFFFFFULL)
-
-#define CL_FLT_DIG 6
-#define CL_FLT_MANT_DIG 24
-#define CL_FLT_MAX_10_EXP +38
-#define CL_FLT_MAX_EXP +128
-#define CL_FLT_MIN_10_EXP -37
-#define CL_FLT_MIN_EXP -125
-#define CL_FLT_RADIX 2
-#define CL_FLT_MAX 0x1.fffffep127f
-#define CL_FLT_MIN 0x1.0p-126f
-#define CL_FLT_EPSILON 0x1.0p-23f
-
-#define CL_DBL_DIG 15
-#define CL_DBL_MANT_DIG 53
-#define CL_DBL_MAX_10_EXP +308
-#define CL_DBL_MAX_EXP +1024
-#define CL_DBL_MIN_10_EXP -307
-#define CL_DBL_MIN_EXP -1021
-#define CL_DBL_RADIX 2
-#define CL_DBL_MAX 0x1.fffffffffffffp1023
-#define CL_DBL_MIN 0x1.0p-1022
-#define CL_DBL_EPSILON 0x1.0p-52
-
-#define CL_M_E 2.718281828459045090796
-#define CL_M_LOG2E 1.442695040888963387005
-#define CL_M_LOG10E 0.434294481903251816668
-#define CL_M_LN2 0.693147180559945286227
-#define CL_M_LN10 2.302585092994045901094
-#define CL_M_PI 3.141592653589793115998
-#define CL_M_PI_2 1.570796326794896557999
-#define CL_M_PI_4 0.785398163397448278999
-#define CL_M_1_PI 0.318309886183790691216
-#define CL_M_2_PI 0.636619772367581382433
-#define CL_M_2_SQRTPI 1.128379167095512558561
-#define CL_M_SQRT2 1.414213562373095145475
-#define CL_M_SQRT1_2 0.707106781186547572737
-
-#define CL_M_E_F 2.71828174591064f
-#define CL_M_LOG2E_F 1.44269502162933f
-#define CL_M_LOG10E_F 0.43429449200630f
-#define CL_M_LN2_F 0.69314718246460f
-#define CL_M_LN10_F 2.30258512496948f
-#define CL_M_PI_F 3.14159274101257f
-#define CL_M_PI_2_F 1.57079637050629f
-#define CL_M_PI_4_F 0.78539818525314f
-#define CL_M_1_PI_F 0.31830987334251f
-#define CL_M_2_PI_F 0.63661974668503f
-#define CL_M_2_SQRTPI_F 1.12837922573090f
-#define CL_M_SQRT2_F 1.41421353816986f
-#define CL_M_SQRT1_2_F 0.70710676908493f
-
-#if defined( __GNUC__ )
- #define CL_HUGE_VALF __builtin_huge_valf()
- #define CL_HUGE_VAL __builtin_huge_val()
- #define CL_NAN __builtin_nanf( "" )
+#define CL_CHAR_BIT 8
+#define CL_SCHAR_MAX 127
+#define CL_SCHAR_MIN (-127 - 1)
+#define CL_CHAR_MAX CL_SCHAR_MAX
+#define CL_CHAR_MIN CL_SCHAR_MIN
+#define CL_UCHAR_MAX 255
+#define CL_SHRT_MAX 32767
+#define CL_SHRT_MIN (-32767 - 1)
+#define CL_USHRT_MAX 65535
+#define CL_INT_MAX 2147483647
+#define CL_INT_MIN (-2147483647 - 1)
+#define CL_UINT_MAX 0xffffffffU
+#define CL_LONG_MAX ((cl_long)0x7FFFFFFFFFFFFFFFLL)
+#define CL_LONG_MIN ((cl_long)-0x7FFFFFFFFFFFFFFFLL - 1LL)
+#define CL_ULONG_MAX ((cl_ulong)0xFFFFFFFFFFFFFFFFULL)
+
+#define CL_FLT_DIG 6
+#define CL_FLT_MANT_DIG 24
+#define CL_FLT_MAX_10_EXP +38
+#define CL_FLT_MAX_EXP +128
+#define CL_FLT_MIN_10_EXP -37
+#define CL_FLT_MIN_EXP -125
+#define CL_FLT_RADIX 2
+#define CL_FLT_MAX 0x1.fffffep127f
+#define CL_FLT_MIN 0x1.0p-126f
+#define CL_FLT_EPSILON 0x1.0p-23f
+
+#define CL_DBL_DIG 15
+#define CL_DBL_MANT_DIG 53
+#define CL_DBL_MAX_10_EXP +308
+#define CL_DBL_MAX_EXP +1024
+#define CL_DBL_MIN_10_EXP -307
+#define CL_DBL_MIN_EXP -1021
+#define CL_DBL_RADIX 2
+#define CL_DBL_MAX 0x1.fffffffffffffp1023
+#define CL_DBL_MIN 0x1.0p-1022
+#define CL_DBL_EPSILON 0x1.0p-52
+
+#define CL_M_E 2.718281828459045090796
+#define CL_M_LOG2E 1.442695040888963387005
+#define CL_M_LOG10E 0.434294481903251816668
+#define CL_M_LN2 0.693147180559945286227
+#define CL_M_LN10 2.302585092994045901094
+#define CL_M_PI 3.141592653589793115998
+#define CL_M_PI_2 1.570796326794896557999
+#define CL_M_PI_4 0.785398163397448278999
+#define CL_M_1_PI 0.318309886183790691216
+#define CL_M_2_PI 0.636619772367581382433
+#define CL_M_2_SQRTPI 1.128379167095512558561
+#define CL_M_SQRT2 1.414213562373095145475
+#define CL_M_SQRT1_2 0.707106781186547572737
+
+#define CL_M_E_F 2.71828174591064f
+#define CL_M_LOG2E_F 1.44269502162933f
+#define CL_M_LOG10E_F 0.43429449200630f
+#define CL_M_LN2_F 0.69314718246460f
+#define CL_M_LN10_F 2.30258512496948f
+#define CL_M_PI_F 3.14159274101257f
+#define CL_M_PI_2_F 1.57079637050629f
+#define CL_M_PI_4_F 0.78539818525314f
+#define CL_M_1_PI_F 0.31830987334251f
+#define CL_M_2_PI_F 0.63661974668503f
+#define CL_M_2_SQRTPI_F 1.12837922573090f
+#define CL_M_SQRT2_F 1.41421353816986f
+#define CL_M_SQRT1_2_F 0.70710676908493f
+
+#if defined(__GNUC__)
+#define CL_HUGE_VALF __builtin_huge_valf()
+#define CL_HUGE_VAL __builtin_huge_val()
+#define CL_NAN __builtin_nanf("")
#else
- #define CL_HUGE_VALF ((cl_float) 1e50)
- #define CL_HUGE_VAL ((cl_double) 1e500)
- float nanf( const char * );
- #define CL_NAN nanf( "" )
+#define CL_HUGE_VALF ((cl_float)1e50)
+#define CL_HUGE_VAL ((cl_double)1e500)
+float nanf(const char *);
+#define CL_NAN nanf("")
#endif
-#define CL_MAXFLOAT CL_FLT_MAX
-#define CL_INFINITY CL_HUGE_VALF
+#define CL_MAXFLOAT CL_FLT_MAX
+#define CL_INFINITY CL_HUGE_VALF
#endif
#include <stddef.h>
-/* Mirror types to GL types. Mirror types allow us to avoid deciding which headers to load based on whether we are using GL or GLES here. */
-typedef unsigned int cl_GLuint;
-typedef int cl_GLint;
-typedef unsigned int cl_GLenum;
+ /* Mirror types to GL types. Mirror types allow us to avoid deciding which headers to load based on whether we are using GL or GLES here. */
+ typedef unsigned int cl_GLuint;
+ typedef int cl_GLint;
+ typedef unsigned int cl_GLenum;
-/*
+ /*
* Vector types
*
* Note: OpenCL requires that all types be naturally aligned.
@@ -302,7 +303,6 @@ typedef unsigned int cl_GLenum;
* Maintaining proper alignment is the user's responsibility.
*/
-
#ifdef _MSC_VER
#if defined(_M_IX86)
#if _M_IX86_FP >= 0
@@ -318,904 +318,1218 @@ typedef unsigned int cl_GLenum;
#endif
/* Define basic vector types */
-#if defined( __VEC__ )
- #include <altivec.h> /* may be omitted depending on compiler. AltiVec spec provides no way to detect whether the header is required. */
- typedef vector unsigned char __cl_uchar16;
- typedef vector signed char __cl_char16;
- typedef vector unsigned short __cl_ushort8;
- typedef vector signed short __cl_short8;
- typedef vector unsigned int __cl_uint4;
- typedef vector signed int __cl_int4;
- typedef vector float __cl_float4;
- #define __CL_UCHAR16__ 1
- #define __CL_CHAR16__ 1
- #define __CL_USHORT8__ 1
- #define __CL_SHORT8__ 1
- #define __CL_UINT4__ 1
- #define __CL_INT4__ 1
- #define __CL_FLOAT4__ 1
-#endif
-
-#if defined( __SSE__ )
- #if defined( __MINGW64__ )
- #include <intrin.h>
- #else
- #include <xmmintrin.h>
- #endif
- #if defined( __GNUC__ ) && !defined( __ICC )
- typedef float __cl_float4 __attribute__((vector_size(16)));
- #else
- typedef __m128 __cl_float4;
- #endif
- #define __CL_FLOAT4__ 1
-#endif
-
-#if defined( __SSE2__ )
- #if defined( __MINGW64__ )
- #include <intrin.h>
- #else
- #include <emmintrin.h>
- #endif
- #if defined( __GNUC__ ) && !defined( __ICC )
- typedef cl_uchar __cl_uchar16 __attribute__((vector_size(16)));
- typedef cl_char __cl_char16 __attribute__((vector_size(16)));
- typedef cl_ushort __cl_ushort8 __attribute__((vector_size(16)));
- typedef cl_short __cl_short8 __attribute__((vector_size(16)));
- typedef cl_uint __cl_uint4 __attribute__((vector_size(16)));
- typedef cl_int __cl_int4 __attribute__((vector_size(16)));
- typedef cl_ulong __cl_ulong2 __attribute__((vector_size(16)));
- typedef cl_long __cl_long2 __attribute__((vector_size(16)));
- typedef cl_double __cl_double2 __attribute__((vector_size(16)));
- #else
- typedef __m128i __cl_uchar16;
- typedef __m128i __cl_char16;
- typedef __m128i __cl_ushort8;
- typedef __m128i __cl_short8;
- typedef __m128i __cl_uint4;
- typedef __m128i __cl_int4;
- typedef __m128i __cl_ulong2;
- typedef __m128i __cl_long2;
- typedef __m128d __cl_double2;
- #endif
- #define __CL_UCHAR16__ 1
- #define __CL_CHAR16__ 1
- #define __CL_USHORT8__ 1
- #define __CL_SHORT8__ 1
- #define __CL_INT4__ 1
- #define __CL_UINT4__ 1
- #define __CL_ULONG2__ 1
- #define __CL_LONG2__ 1
- #define __CL_DOUBLE2__ 1
-#endif
-
-#if defined( __MMX__ )
- #include <mmintrin.h>
- #if defined( __GNUC__ ) && !defined( __ICC )
- typedef cl_uchar __cl_uchar8 __attribute__((vector_size(8)));
- typedef cl_char __cl_char8 __attribute__((vector_size(8)));
- typedef cl_ushort __cl_ushort4 __attribute__((vector_size(8)));
- typedef cl_short __cl_short4 __attribute__((vector_size(8)));
- typedef cl_uint __cl_uint2 __attribute__((vector_size(8)));
- typedef cl_int __cl_int2 __attribute__((vector_size(8)));
- typedef cl_ulong __cl_ulong1 __attribute__((vector_size(8)));
- typedef cl_long __cl_long1 __attribute__((vector_size(8)));
- typedef cl_float __cl_float2 __attribute__((vector_size(8)));
- #else
- typedef __m64 __cl_uchar8;
- typedef __m64 __cl_char8;
- typedef __m64 __cl_ushort4;
- typedef __m64 __cl_short4;
- typedef __m64 __cl_uint2;
- typedef __m64 __cl_int2;
- typedef __m64 __cl_ulong1;
- typedef __m64 __cl_long1;
- typedef __m64 __cl_float2;
- #endif
- #define __CL_UCHAR8__ 1
- #define __CL_CHAR8__ 1
- #define __CL_USHORT4__ 1
- #define __CL_SHORT4__ 1
- #define __CL_INT2__ 1
- #define __CL_UINT2__ 1
- #define __CL_ULONG1__ 1
- #define __CL_LONG1__ 1
- #define __CL_FLOAT2__ 1
-#endif
-
-#if defined( __AVX__ )
- #if defined( __MINGW64__ )
- #include <intrin.h>
- #else
- #include <immintrin.h>
- #endif
- #if defined( __GNUC__ ) && !defined( __ICC )
- typedef cl_float __cl_float8 __attribute__((vector_size(32)));
- typedef cl_double __cl_double4 __attribute__((vector_size(32)));
- #else
- typedef __m256 __cl_float8;
- typedef __m256d __cl_double4;
- #endif
- #define __CL_FLOAT8__ 1
- #define __CL_DOUBLE4__ 1
-#endif
-
-/* Define alignment keys */
-#if defined( __GNUC__ )
- #define CL_ALIGNED(_x) __attribute__ ((aligned(_x)))
-#elif defined( _WIN32) && (_MSC_VER)
- /* Alignment keys neutered on windows because MSVC can't swallow function arguments with alignment requirements */
- /* http://msdn.microsoft.com/en-us/library/373ak2y1%28VS.71%29.aspx */
- /* #include <crtdefs.h> */
- /* #define CL_ALIGNED(_x) _CRT_ALIGN(_x) */
- #define CL_ALIGNED(_x)
+#if defined(__VEC__)
+#include <altivec.h> /* may be omitted depending on compiler. AltiVec spec provides no way to detect whether the header is required. */
+ typedef vector unsigned char __cl_uchar16;
+ typedef vector signed char __cl_char16;
+ typedef vector unsigned short __cl_ushort8;
+ typedef vector signed short __cl_short8;
+ typedef vector unsigned int __cl_uint4;
+ typedef vector signed int __cl_int4;
+ typedef vector float __cl_float4;
+#define __CL_UCHAR16__ 1
+#define __CL_CHAR16__ 1
+#define __CL_USHORT8__ 1
+#define __CL_SHORT8__ 1
+#define __CL_UINT4__ 1
+#define __CL_INT4__ 1
+#define __CL_FLOAT4__ 1
+#endif
+
+#if defined(__SSE__)
+#if defined(__MINGW64__)
+#include <intrin.h>
#else
- #warning Need to implement some method to align data here
- #define CL_ALIGNED(_x)
-#endif
-
-/* Indicate whether .xyzw, .s0123 and .hi.lo are supported */
-#if (defined( __GNUC__) && ! defined( __STRICT_ANSI__ )) || (defined( _MSC_VER ) && ! defined( __STDC__ ))
- /* .xyzw and .s0123...{f|F} are supported */
- #define CL_HAS_NAMED_VECTOR_FIELDS 1
- /* .hi and .lo are supported */
- #define CL_HAS_HI_LO_VECTOR_FIELDS 1
-
- #define CL_NAMED_STRUCT_SUPPORTED
-#endif
-
-#if defined( CL_NAMED_STRUCT_SUPPORTED) && defined( _MSC_VER )
-#define __extension__ __pragma(warning(suppress:4201))
-#endif
-
-/* Define cl_vector types */
-
-/* ---- cl_charn ---- */
-typedef union
-{
- cl_char CL_ALIGNED(2) s[2];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_char x, y; };
- __extension__ struct{ cl_char s0, s1; };
- __extension__ struct{ cl_char lo, hi; };
-#endif
-#if defined( __CL_CHAR2__)
- __cl_char2 v2;
-#endif
-}cl_char2;
-
-typedef union
-{
- cl_char CL_ALIGNED(4) s[4];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_char x, y, z, w; };
- __extension__ struct{ cl_char s0, s1, s2, s3; };
- __extension__ struct{ cl_char2 lo, hi; };
-#endif
-#if defined( __CL_CHAR2__)
- __cl_char2 v2[2];
-#endif
-#if defined( __CL_CHAR4__)
- __cl_char4 v4;
-#endif
-}cl_char4;
-
-/* cl_char3 is identical in size, alignment and behavior to cl_char4. See section 6.1.5. */
-typedef cl_char4 cl_char3;
-
-typedef union
-{
- cl_char CL_ALIGNED(8) s[8];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_char x, y, z, w; };
- __extension__ struct{ cl_char s0, s1, s2, s3, s4, s5, s6, s7; };
- __extension__ struct{ cl_char4 lo, hi; };
-#endif
-#if defined( __CL_CHAR2__)
- __cl_char2 v2[4];
-#endif
-#if defined( __CL_CHAR4__)
- __cl_char4 v4[2];
-#endif
-#if defined( __CL_CHAR8__ )
- __cl_char8 v8;
-#endif
-}cl_char8;
-
-typedef union
-{
- cl_char CL_ALIGNED(16) s[16];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_char x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
- __extension__ struct{ cl_char s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
- __extension__ struct{ cl_char8 lo, hi; };
-#endif
-#if defined( __CL_CHAR2__)
- __cl_char2 v2[8];
-#endif
-#if defined( __CL_CHAR4__)
- __cl_char4 v4[4];
-#endif
-#if defined( __CL_CHAR8__ )
- __cl_char8 v8[2];
-#endif
-#if defined( __CL_CHAR16__ )
- __cl_char16 v16;
-#endif
-}cl_char16;
-
-
-/* ---- cl_ucharn ---- */
-typedef union
-{
- cl_uchar CL_ALIGNED(2) s[2];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_uchar x, y; };
- __extension__ struct{ cl_uchar s0, s1; };
- __extension__ struct{ cl_uchar lo, hi; };
-#endif
-#if defined( __cl_uchar2__)
- __cl_uchar2 v2;
-#endif
-}cl_uchar2;
-
-typedef union
-{
- cl_uchar CL_ALIGNED(4) s[4];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_uchar x, y, z, w; };
- __extension__ struct{ cl_uchar s0, s1, s2, s3; };
- __extension__ struct{ cl_uchar2 lo, hi; };
-#endif
-#if defined( __CL_UCHAR2__)
- __cl_uchar2 v2[2];
-#endif
-#if defined( __CL_UCHAR4__)
- __cl_uchar4 v4;
-#endif
-}cl_uchar4;
-
-/* cl_uchar3 is identical in size, alignment and behavior to cl_uchar4. See section 6.1.5. */
-typedef cl_uchar4 cl_uchar3;
-
-typedef union
-{
- cl_uchar CL_ALIGNED(8) s[8];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_uchar x, y, z, w; };
- __extension__ struct{ cl_uchar s0, s1, s2, s3, s4, s5, s6, s7; };
- __extension__ struct{ cl_uchar4 lo, hi; };
-#endif
-#if defined( __CL_UCHAR2__)
- __cl_uchar2 v2[4];
-#endif
-#if defined( __CL_UCHAR4__)
- __cl_uchar4 v4[2];
-#endif
-#if defined( __CL_UCHAR8__ )
- __cl_uchar8 v8;
-#endif
-}cl_uchar8;
-
-typedef union
-{
- cl_uchar CL_ALIGNED(16) s[16];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_uchar x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
- __extension__ struct{ cl_uchar s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
- __extension__ struct{ cl_uchar8 lo, hi; };
-#endif
-#if defined( __CL_UCHAR2__)
- __cl_uchar2 v2[8];
-#endif
-#if defined( __CL_UCHAR4__)
- __cl_uchar4 v4[4];
-#endif
-#if defined( __CL_UCHAR8__ )
- __cl_uchar8 v8[2];
-#endif
-#if defined( __CL_UCHAR16__ )
- __cl_uchar16 v16;
-#endif
-}cl_uchar16;
-
-
-/* ---- cl_shortn ---- */
-typedef union
-{
- cl_short CL_ALIGNED(4) s[2];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_short x, y; };
- __extension__ struct{ cl_short s0, s1; };
- __extension__ struct{ cl_short lo, hi; };
-#endif
-#if defined( __CL_SHORT2__)
- __cl_short2 v2;
-#endif
-}cl_short2;
-
-typedef union
-{
- cl_short CL_ALIGNED(8) s[4];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_short x, y, z, w; };
- __extension__ struct{ cl_short s0, s1, s2, s3; };
- __extension__ struct{ cl_short2 lo, hi; };
-#endif
-#if defined( __CL_SHORT2__)
- __cl_short2 v2[2];
-#endif
-#if defined( __CL_SHORT4__)
- __cl_short4 v4;
-#endif
-}cl_short4;
-
-/* cl_short3 is identical in size, alignment and behavior to cl_short4. See section 6.1.5. */
-typedef cl_short4 cl_short3;
-
-typedef union
-{
- cl_short CL_ALIGNED(16) s[8];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_short x, y, z, w; };
- __extension__ struct{ cl_short s0, s1, s2, s3, s4, s5, s6, s7; };
- __extension__ struct{ cl_short4 lo, hi; };
-#endif
-#if defined( __CL_SHORT2__)
- __cl_short2 v2[4];
-#endif
-#if defined( __CL_SHORT4__)
- __cl_short4 v4[2];
-#endif
-#if defined( __CL_SHORT8__ )
- __cl_short8 v8;
-#endif
-}cl_short8;
-
-typedef union
-{
- cl_short CL_ALIGNED(32) s[16];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_short x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
- __extension__ struct{ cl_short s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
- __extension__ struct{ cl_short8 lo, hi; };
-#endif
-#if defined( __CL_SHORT2__)
- __cl_short2 v2[8];
-#endif
-#if defined( __CL_SHORT4__)
- __cl_short4 v4[4];
-#endif
-#if defined( __CL_SHORT8__ )
- __cl_short8 v8[2];
-#endif
-#if defined( __CL_SHORT16__ )
- __cl_short16 v16;
-#endif
-}cl_short16;
-
-
-/* ---- cl_ushortn ---- */
-typedef union
-{
- cl_ushort CL_ALIGNED(4) s[2];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_ushort x, y; };
- __extension__ struct{ cl_ushort s0, s1; };
- __extension__ struct{ cl_ushort lo, hi; };
-#endif
-#if defined( __CL_USHORT2__)
- __cl_ushort2 v2;
-#endif
-}cl_ushort2;
-
-typedef union
-{
- cl_ushort CL_ALIGNED(8) s[4];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_ushort x, y, z, w; };
- __extension__ struct{ cl_ushort s0, s1, s2, s3; };
- __extension__ struct{ cl_ushort2 lo, hi; };
-#endif
-#if defined( __CL_USHORT2__)
- __cl_ushort2 v2[2];
-#endif
-#if defined( __CL_USHORT4__)
- __cl_ushort4 v4;
-#endif
-}cl_ushort4;
-
-/* cl_ushort3 is identical in size, alignment and behavior to cl_ushort4. See section 6.1.5. */
-typedef cl_ushort4 cl_ushort3;
-
-typedef union
-{
- cl_ushort CL_ALIGNED(16) s[8];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_ushort x, y, z, w; };
- __extension__ struct{ cl_ushort s0, s1, s2, s3, s4, s5, s6, s7; };
- __extension__ struct{ cl_ushort4 lo, hi; };
-#endif
-#if defined( __CL_USHORT2__)
- __cl_ushort2 v2[4];
-#endif
-#if defined( __CL_USHORT4__)
- __cl_ushort4 v4[2];
-#endif
-#if defined( __CL_USHORT8__ )
- __cl_ushort8 v8;
-#endif
-}cl_ushort8;
-
-typedef union
-{
- cl_ushort CL_ALIGNED(32) s[16];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_ushort x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
- __extension__ struct{ cl_ushort s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
- __extension__ struct{ cl_ushort8 lo, hi; };
-#endif
-#if defined( __CL_USHORT2__)
- __cl_ushort2 v2[8];
-#endif
-#if defined( __CL_USHORT4__)
- __cl_ushort4 v4[4];
-#endif
-#if defined( __CL_USHORT8__ )
- __cl_ushort8 v8[2];
-#endif
-#if defined( __CL_USHORT16__ )
- __cl_ushort16 v16;
-#endif
-}cl_ushort16;
-
-/* ---- cl_intn ---- */
-typedef union
-{
- cl_int CL_ALIGNED(8) s[2];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_int x, y; };
- __extension__ struct{ cl_int s0, s1; };
- __extension__ struct{ cl_int lo, hi; };
-#endif
-#if defined( __CL_INT2__)
- __cl_int2 v2;
-#endif
-}cl_int2;
-
-typedef union
-{
- cl_int CL_ALIGNED(16) s[4];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_int x, y, z, w; };
- __extension__ struct{ cl_int s0, s1, s2, s3; };
- __extension__ struct{ cl_int2 lo, hi; };
-#endif
-#if defined( __CL_INT2__)
- __cl_int2 v2[2];
-#endif
-#if defined( __CL_INT4__)
- __cl_int4 v4;
-#endif
-}cl_int4;
-
-/* cl_int3 is identical in size, alignment and behavior to cl_int4. See section 6.1.5. */
-typedef cl_int4 cl_int3;
-
-typedef union
-{
- cl_int CL_ALIGNED(32) s[8];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_int x, y, z, w; };
- __extension__ struct{ cl_int s0, s1, s2, s3, s4, s5, s6, s7; };
- __extension__ struct{ cl_int4 lo, hi; };
-#endif
-#if defined( __CL_INT2__)
- __cl_int2 v2[4];
-#endif
-#if defined( __CL_INT4__)
- __cl_int4 v4[2];
-#endif
-#if defined( __CL_INT8__ )
- __cl_int8 v8;
-#endif
-}cl_int8;
-
-typedef union
-{
- cl_int CL_ALIGNED(64) s[16];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_int x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
- __extension__ struct{ cl_int s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
- __extension__ struct{ cl_int8 lo, hi; };
-#endif
-#if defined( __CL_INT2__)
- __cl_int2 v2[8];
-#endif
-#if defined( __CL_INT4__)
- __cl_int4 v4[4];
+#include <xmmintrin.h>
#endif
-#if defined( __CL_INT8__ )
- __cl_int8 v8[2];
-#endif
-#if defined( __CL_INT16__ )
- __cl_int16 v16;
-#endif
-}cl_int16;
-
-
-/* ---- cl_uintn ---- */
-typedef union
-{
- cl_uint CL_ALIGNED(8) s[2];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_uint x, y; };
- __extension__ struct{ cl_uint s0, s1; };
- __extension__ struct{ cl_uint lo, hi; };
-#endif
-#if defined( __CL_UINT2__)
- __cl_uint2 v2;
-#endif
-}cl_uint2;
-
-typedef union
-{
- cl_uint CL_ALIGNED(16) s[4];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_uint x, y, z, w; };
- __extension__ struct{ cl_uint s0, s1, s2, s3; };
- __extension__ struct{ cl_uint2 lo, hi; };
-#endif
-#if defined( __CL_UINT2__)
- __cl_uint2 v2[2];
-#endif
-#if defined( __CL_UINT4__)
- __cl_uint4 v4;
-#endif
-}cl_uint4;
-
-/* cl_uint3 is identical in size, alignment and behavior to cl_uint4. See section 6.1.5. */
-typedef cl_uint4 cl_uint3;
-
-typedef union
-{
- cl_uint CL_ALIGNED(32) s[8];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_uint x, y, z, w; };
- __extension__ struct{ cl_uint s0, s1, s2, s3, s4, s5, s6, s7; };
- __extension__ struct{ cl_uint4 lo, hi; };
-#endif
-#if defined( __CL_UINT2__)
- __cl_uint2 v2[4];
-#endif
-#if defined( __CL_UINT4__)
- __cl_uint4 v4[2];
-#endif
-#if defined( __CL_UINT8__ )
- __cl_uint8 v8;
-#endif
-}cl_uint8;
-
-typedef union
-{
- cl_uint CL_ALIGNED(64) s[16];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_uint x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
- __extension__ struct{ cl_uint s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
- __extension__ struct{ cl_uint8 lo, hi; };
-#endif
-#if defined( __CL_UINT2__)
- __cl_uint2 v2[8];
-#endif
-#if defined( __CL_UINT4__)
- __cl_uint4 v4[4];
-#endif
-#if defined( __CL_UINT8__ )
- __cl_uint8 v8[2];
-#endif
-#if defined( __CL_UINT16__ )
- __cl_uint16 v16;
-#endif
-}cl_uint16;
-
-/* ---- cl_longn ---- */
-typedef union
-{
- cl_long CL_ALIGNED(16) s[2];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_long x, y; };
- __extension__ struct{ cl_long s0, s1; };
- __extension__ struct{ cl_long lo, hi; };
-#endif
-#if defined( __CL_LONG2__)
- __cl_long2 v2;
-#endif
-}cl_long2;
-
-typedef union
-{
- cl_long CL_ALIGNED(32) s[4];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_long x, y, z, w; };
- __extension__ struct{ cl_long s0, s1, s2, s3; };
- __extension__ struct{ cl_long2 lo, hi; };
-#endif
-#if defined( __CL_LONG2__)
- __cl_long2 v2[2];
-#endif
-#if defined( __CL_LONG4__)
- __cl_long4 v4;
-#endif
-}cl_long4;
-
-/* cl_long3 is identical in size, alignment and behavior to cl_long4. See section 6.1.5. */
-typedef cl_long4 cl_long3;
-
-typedef union
-{
- cl_long CL_ALIGNED(64) s[8];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_long x, y, z, w; };
- __extension__ struct{ cl_long s0, s1, s2, s3, s4, s5, s6, s7; };
- __extension__ struct{ cl_long4 lo, hi; };
-#endif
-#if defined( __CL_LONG2__)
- __cl_long2 v2[4];
-#endif
-#if defined( __CL_LONG4__)
- __cl_long4 v4[2];
-#endif
-#if defined( __CL_LONG8__ )
- __cl_long8 v8;
-#endif
-}cl_long8;
-
-typedef union
-{
- cl_long CL_ALIGNED(128) s[16];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_long x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
- __extension__ struct{ cl_long s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
- __extension__ struct{ cl_long8 lo, hi; };
-#endif
-#if defined( __CL_LONG2__)
- __cl_long2 v2[8];
-#endif
-#if defined( __CL_LONG4__)
- __cl_long4 v4[4];
-#endif
-#if defined( __CL_LONG8__ )
- __cl_long8 v8[2];
-#endif
-#if defined( __CL_LONG16__ )
- __cl_long16 v16;
-#endif
-}cl_long16;
-
-
-/* ---- cl_ulongn ---- */
-typedef union
-{
- cl_ulong CL_ALIGNED(16) s[2];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_ulong x, y; };
- __extension__ struct{ cl_ulong s0, s1; };
- __extension__ struct{ cl_ulong lo, hi; };
-#endif
-#if defined( __CL_ULONG2__)
- __cl_ulong2 v2;
-#endif
-}cl_ulong2;
-
-typedef union
-{
- cl_ulong CL_ALIGNED(32) s[4];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_ulong x, y, z, w; };
- __extension__ struct{ cl_ulong s0, s1, s2, s3; };
- __extension__ struct{ cl_ulong2 lo, hi; };
-#endif
-#if defined( __CL_ULONG2__)
- __cl_ulong2 v2[2];
-#endif
-#if defined( __CL_ULONG4__)
- __cl_ulong4 v4;
-#endif
-}cl_ulong4;
-
-/* cl_ulong3 is identical in size, alignment and behavior to cl_ulong4. See section 6.1.5. */
-typedef cl_ulong4 cl_ulong3;
-
-typedef union
-{
- cl_ulong CL_ALIGNED(64) s[8];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_ulong x, y, z, w; };
- __extension__ struct{ cl_ulong s0, s1, s2, s3, s4, s5, s6, s7; };
- __extension__ struct{ cl_ulong4 lo, hi; };
-#endif
-#if defined( __CL_ULONG2__)
- __cl_ulong2 v2[4];
-#endif
-#if defined( __CL_ULONG4__)
- __cl_ulong4 v4[2];
-#endif
-#if defined( __CL_ULONG8__ )
- __cl_ulong8 v8;
-#endif
-}cl_ulong8;
-
-typedef union
-{
- cl_ulong CL_ALIGNED(128) s[16];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_ulong x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
- __extension__ struct{ cl_ulong s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
- __extension__ struct{ cl_ulong8 lo, hi; };
-#endif
-#if defined( __CL_ULONG2__)
- __cl_ulong2 v2[8];
-#endif
-#if defined( __CL_ULONG4__)
- __cl_ulong4 v4[4];
-#endif
-#if defined( __CL_ULONG8__ )
- __cl_ulong8 v8[2];
-#endif
-#if defined( __CL_ULONG16__ )
- __cl_ulong16 v16;
-#endif
-}cl_ulong16;
-
-
-/* --- cl_floatn ---- */
-
-typedef union
-{
- cl_float CL_ALIGNED(8) s[2];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_float x, y; };
- __extension__ struct{ cl_float s0, s1; };
- __extension__ struct{ cl_float lo, hi; };
-#endif
-#if defined( __CL_FLOAT2__)
- __cl_float2 v2;
-#endif
-}cl_float2;
-
-typedef union
-{
- cl_float CL_ALIGNED(16) s[4];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_float x, y, z, w; };
- __extension__ struct{ cl_float s0, s1, s2, s3; };
- __extension__ struct{ cl_float2 lo, hi; };
-#endif
-#if defined( __CL_FLOAT2__)
- __cl_float2 v2[2];
-#endif
-#if defined( __CL_FLOAT4__)
- __cl_float4 v4;
-#endif
-}cl_float4;
-
-/* cl_float3 is identical in size, alignment and behavior to cl_float4. See section 6.1.5. */
-typedef cl_float4 cl_float3;
-
-typedef union
-{
- cl_float CL_ALIGNED(32) s[8];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_float x, y, z, w; };
- __extension__ struct{ cl_float s0, s1, s2, s3, s4, s5, s6, s7; };
- __extension__ struct{ cl_float4 lo, hi; };
-#endif
-#if defined( __CL_FLOAT2__)
- __cl_float2 v2[4];
-#endif
-#if defined( __CL_FLOAT4__)
- __cl_float4 v4[2];
-#endif
-#if defined( __CL_FLOAT8__ )
- __cl_float8 v8;
-#endif
-}cl_float8;
-
-typedef union
-{
- cl_float CL_ALIGNED(64) s[16];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_float x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
- __extension__ struct{ cl_float s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
- __extension__ struct{ cl_float8 lo, hi; };
-#endif
-#if defined( __CL_FLOAT2__)
- __cl_float2 v2[8];
-#endif
-#if defined( __CL_FLOAT4__)
- __cl_float4 v4[4];
-#endif
-#if defined( __CL_FLOAT8__ )
- __cl_float8 v8[2];
-#endif
-#if defined( __CL_FLOAT16__ )
- __cl_float16 v16;
-#endif
-}cl_float16;
-
-/* --- cl_doublen ---- */
-
-typedef union
-{
- cl_double CL_ALIGNED(16) s[2];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_double x, y; };
- __extension__ struct{ cl_double s0, s1; };
- __extension__ struct{ cl_double lo, hi; };
+#if defined(__GNUC__) && !defined(__ICC)
+ typedef float __cl_float4 __attribute__((vector_size(16)));
+#else
+ typedef __m128 __cl_float4;
#endif
-#if defined( __CL_DOUBLE2__)
- __cl_double2 v2;
+#define __CL_FLOAT4__ 1
#endif
-}cl_double2;
-typedef union
-{
- cl_double CL_ALIGNED(32) s[4];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_double x, y, z, w; };
- __extension__ struct{ cl_double s0, s1, s2, s3; };
- __extension__ struct{ cl_double2 lo, hi; };
+#if defined(__SSE2__)
+#if defined(__MINGW64__)
+#include <intrin.h>
+#else
+#include <emmintrin.h>
+#endif
+#if defined(__GNUC__) && !defined(__ICC)
+ typedef cl_uchar __cl_uchar16 __attribute__((vector_size(16)));
+ typedef cl_char __cl_char16 __attribute__((vector_size(16)));
+ typedef cl_ushort __cl_ushort8 __attribute__((vector_size(16)));
+ typedef cl_short __cl_short8 __attribute__((vector_size(16)));
+ typedef cl_uint __cl_uint4 __attribute__((vector_size(16)));
+ typedef cl_int __cl_int4 __attribute__((vector_size(16)));
+ typedef cl_ulong __cl_ulong2 __attribute__((vector_size(16)));
+ typedef cl_long __cl_long2 __attribute__((vector_size(16)));
+ typedef cl_double __cl_double2 __attribute__((vector_size(16)));
+#else
+ typedef __m128i __cl_uchar16;
+ typedef __m128i __cl_char16;
+ typedef __m128i __cl_ushort8;
+ typedef __m128i __cl_short8;
+ typedef __m128i __cl_uint4;
+ typedef __m128i __cl_int4;
+ typedef __m128i __cl_ulong2;
+ typedef __m128i __cl_long2;
+ typedef __m128d __cl_double2;
+#endif
+#define __CL_UCHAR16__ 1
+#define __CL_CHAR16__ 1
+#define __CL_USHORT8__ 1
+#define __CL_SHORT8__ 1
+#define __CL_INT4__ 1
+#define __CL_UINT4__ 1
+#define __CL_ULONG2__ 1
+#define __CL_LONG2__ 1
+#define __CL_DOUBLE2__ 1
+#endif
+
+#if defined(__MMX__)
+#include <mmintrin.h>
+#if defined(__GNUC__) && !defined(__ICC)
+ typedef cl_uchar __cl_uchar8 __attribute__((vector_size(8)));
+ typedef cl_char __cl_char8 __attribute__((vector_size(8)));
+ typedef cl_ushort __cl_ushort4 __attribute__((vector_size(8)));
+ typedef cl_short __cl_short4 __attribute__((vector_size(8)));
+ typedef cl_uint __cl_uint2 __attribute__((vector_size(8)));
+ typedef cl_int __cl_int2 __attribute__((vector_size(8)));
+ typedef cl_ulong __cl_ulong1 __attribute__((vector_size(8)));
+ typedef cl_long __cl_long1 __attribute__((vector_size(8)));
+ typedef cl_float __cl_float2 __attribute__((vector_size(8)));
+#else
+ typedef __m64 __cl_uchar8;
+ typedef __m64 __cl_char8;
+ typedef __m64 __cl_ushort4;
+ typedef __m64 __cl_short4;
+ typedef __m64 __cl_uint2;
+ typedef __m64 __cl_int2;
+ typedef __m64 __cl_ulong1;
+ typedef __m64 __cl_long1;
+ typedef __m64 __cl_float2;
+#endif
+#define __CL_UCHAR8__ 1
+#define __CL_CHAR8__ 1
+#define __CL_USHORT4__ 1
+#define __CL_SHORT4__ 1
+#define __CL_INT2__ 1
+#define __CL_UINT2__ 1
+#define __CL_ULONG1__ 1
+#define __CL_LONG1__ 1
+#define __CL_FLOAT2__ 1
+#endif
+
+#if defined(__AVX__)
+#if defined(__MINGW64__)
+#include <intrin.h>
+#else
+#include <immintrin.h>
#endif
-#if defined( __CL_DOUBLE2__)
- __cl_double2 v2[2];
+#if defined(__GNUC__) && !defined(__ICC)
+ typedef cl_float __cl_float8 __attribute__((vector_size(32)));
+ typedef cl_double __cl_double4 __attribute__((vector_size(32)));
+#else
+ typedef __m256 __cl_float8;
+ typedef __m256d __cl_double4;
#endif
-#if defined( __CL_DOUBLE4__)
- __cl_double4 v4;
+#define __CL_FLOAT8__ 1
+#define __CL_DOUBLE4__ 1
#endif
-}cl_double4;
-/* cl_double3 is identical in size, alignment and behavior to cl_double4. See section 6.1.5. */
-typedef cl_double4 cl_double3;
-
-typedef union
-{
- cl_double CL_ALIGNED(64) s[8];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_double x, y, z, w; };
- __extension__ struct{ cl_double s0, s1, s2, s3, s4, s5, s6, s7; };
- __extension__ struct{ cl_double4 lo, hi; };
-#endif
-#if defined( __CL_DOUBLE2__)
- __cl_double2 v2[4];
-#endif
-#if defined( __CL_DOUBLE4__)
- __cl_double4 v4[2];
-#endif
-#if defined( __CL_DOUBLE8__ )
- __cl_double8 v8;
+/* Define alignment keys */
+#if defined(__GNUC__)
+#define CL_ALIGNED(_x) __attribute__((aligned(_x)))
+#elif defined(_WIN32) && (_MSC_VER)
+/* Alignment keys neutered on windows because MSVC can't swallow function arguments with alignment requirements */
+/* http://msdn.microsoft.com/en-us/library/373ak2y1%28VS.71%29.aspx */
+/* #include <crtdefs.h> */
+/* #define CL_ALIGNED(_x) _CRT_ALIGN(_x) */
+#define CL_ALIGNED(_x)
+#else
+#warning Need to implement some method to align data here
+#define CL_ALIGNED(_x)
#endif
-}cl_double8;
-typedef union
-{
- cl_double CL_ALIGNED(128) s[16];
-#if defined( CL_NAMED_STRUCT_SUPPORTED )
- __extension__ struct{ cl_double x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
- __extension__ struct{ cl_double s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
- __extension__ struct{ cl_double8 lo, hi; };
-#endif
-#if defined( __CL_DOUBLE2__)
- __cl_double2 v2[8];
-#endif
-#if defined( __CL_DOUBLE4__)
- __cl_double4 v4[4];
-#endif
-#if defined( __CL_DOUBLE8__ )
- __cl_double8 v8[2];
-#endif
-#if defined( __CL_DOUBLE16__ )
- __cl_double16 v16;
-#endif
-}cl_double16;
+/* Indicate whether .xyzw, .s0123 and .hi.lo are supported */
+#if (defined(__GNUC__) && !defined(__STRICT_ANSI__)) || (defined(_MSC_VER) && !defined(__STDC__))
+/* .xyzw and .s0123...{f|F} are supported */
+#define CL_HAS_NAMED_VECTOR_FIELDS 1
+/* .hi and .lo are supported */
+#define CL_HAS_HI_LO_VECTOR_FIELDS 1
+
+#define CL_NAMED_STRUCT_SUPPORTED
+#endif
+
+#if defined(CL_NAMED_STRUCT_SUPPORTED) && defined(_MSC_VER)
+#define __extension__ __pragma(warning(suppress : 4201))
+#endif
+
+ /* Define cl_vector types */
+
+ /* ---- cl_charn ---- */
+ typedef union {
+ cl_char CL_ALIGNED(2) s[2];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_char x, y;
+ };
+ __extension__ struct
+ {
+ cl_char s0, s1;
+ };
+ __extension__ struct
+ {
+ cl_char lo, hi;
+ };
+#endif
+#if defined(__CL_CHAR2__)
+ __cl_char2 v2;
+#endif
+ } cl_char2;
+
+ typedef union {
+ cl_char CL_ALIGNED(4) s[4];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_char x, y, z, w;
+ };
+ __extension__ struct
+ {
+ cl_char s0, s1, s2, s3;
+ };
+ __extension__ struct
+ {
+ cl_char2 lo, hi;
+ };
+#endif
+#if defined(__CL_CHAR2__)
+ __cl_char2 v2[2];
+#endif
+#if defined(__CL_CHAR4__)
+ __cl_char4 v4;
+#endif
+ } cl_char4;
+
+ /* cl_char3 is identical in size, alignment and behavior to cl_char4. See section 6.1.5. */
+ typedef cl_char4 cl_char3;
+
+ typedef union {
+ cl_char CL_ALIGNED(8) s[8];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_char x, y, z, w;
+ };
+ __extension__ struct
+ {
+ cl_char s0, s1, s2, s3, s4, s5, s6, s7;
+ };
+ __extension__ struct
+ {
+ cl_char4 lo, hi;
+ };
+#endif
+#if defined(__CL_CHAR2__)
+ __cl_char2 v2[4];
+#endif
+#if defined(__CL_CHAR4__)
+ __cl_char4 v4[2];
+#endif
+#if defined(__CL_CHAR8__)
+ __cl_char8 v8;
+#endif
+ } cl_char8;
+
+ typedef union {
+ cl_char CL_ALIGNED(16) s[16];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_char x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf;
+ };
+ __extension__ struct
+ {
+ cl_char s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF;
+ };
+ __extension__ struct
+ {
+ cl_char8 lo, hi;
+ };
+#endif
+#if defined(__CL_CHAR2__)
+ __cl_char2 v2[8];
+#endif
+#if defined(__CL_CHAR4__)
+ __cl_char4 v4[4];
+#endif
+#if defined(__CL_CHAR8__)
+ __cl_char8 v8[2];
+#endif
+#if defined(__CL_CHAR16__)
+ __cl_char16 v16;
+#endif
+ } cl_char16;
+
+ /* ---- cl_ucharn ---- */
+ typedef union {
+ cl_uchar CL_ALIGNED(2) s[2];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_uchar x, y;
+ };
+ __extension__ struct
+ {
+ cl_uchar s0, s1;
+ };
+ __extension__ struct
+ {
+ cl_uchar lo, hi;
+ };
+#endif
+#if defined(__cl_uchar2__)
+ __cl_uchar2 v2;
+#endif
+ } cl_uchar2;
+
+ typedef union {
+ cl_uchar CL_ALIGNED(4) s[4];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_uchar x, y, z, w;
+ };
+ __extension__ struct
+ {
+ cl_uchar s0, s1, s2, s3;
+ };
+ __extension__ struct
+ {
+ cl_uchar2 lo, hi;
+ };
+#endif
+#if defined(__CL_UCHAR2__)
+ __cl_uchar2 v2[2];
+#endif
+#if defined(__CL_UCHAR4__)
+ __cl_uchar4 v4;
+#endif
+ } cl_uchar4;
+
+ /* cl_uchar3 is identical in size, alignment and behavior to cl_uchar4. See section 6.1.5. */
+ typedef cl_uchar4 cl_uchar3;
+
+ typedef union {
+ cl_uchar CL_ALIGNED(8) s[8];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_uchar x, y, z, w;
+ };
+ __extension__ struct
+ {
+ cl_uchar s0, s1, s2, s3, s4, s5, s6, s7;
+ };
+ __extension__ struct
+ {
+ cl_uchar4 lo, hi;
+ };
+#endif
+#if defined(__CL_UCHAR2__)
+ __cl_uchar2 v2[4];
+#endif
+#if defined(__CL_UCHAR4__)
+ __cl_uchar4 v4[2];
+#endif
+#if defined(__CL_UCHAR8__)
+ __cl_uchar8 v8;
+#endif
+ } cl_uchar8;
+
+ typedef union {
+ cl_uchar CL_ALIGNED(16) s[16];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_uchar x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf;
+ };
+ __extension__ struct
+ {
+ cl_uchar s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF;
+ };
+ __extension__ struct
+ {
+ cl_uchar8 lo, hi;
+ };
+#endif
+#if defined(__CL_UCHAR2__)
+ __cl_uchar2 v2[8];
+#endif
+#if defined(__CL_UCHAR4__)
+ __cl_uchar4 v4[4];
+#endif
+#if defined(__CL_UCHAR8__)
+ __cl_uchar8 v8[2];
+#endif
+#if defined(__CL_UCHAR16__)
+ __cl_uchar16 v16;
+#endif
+ } cl_uchar16;
+
+ /* ---- cl_shortn ---- */
+ typedef union {
+ cl_short CL_ALIGNED(4) s[2];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_short x, y;
+ };
+ __extension__ struct
+ {
+ cl_short s0, s1;
+ };
+ __extension__ struct
+ {
+ cl_short lo, hi;
+ };
+#endif
+#if defined(__CL_SHORT2__)
+ __cl_short2 v2;
+#endif
+ } cl_short2;
+
+ typedef union {
+ cl_short CL_ALIGNED(8) s[4];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_short x, y, z, w;
+ };
+ __extension__ struct
+ {
+ cl_short s0, s1, s2, s3;
+ };
+ __extension__ struct
+ {
+ cl_short2 lo, hi;
+ };
+#endif
+#if defined(__CL_SHORT2__)
+ __cl_short2 v2[2];
+#endif
+#if defined(__CL_SHORT4__)
+ __cl_short4 v4;
+#endif
+ } cl_short4;
+
+ /* cl_short3 is identical in size, alignment and behavior to cl_short4. See section 6.1.5. */
+ typedef cl_short4 cl_short3;
+
+ typedef union {
+ cl_short CL_ALIGNED(16) s[8];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_short x, y, z, w;
+ };
+ __extension__ struct
+ {
+ cl_short s0, s1, s2, s3, s4, s5, s6, s7;
+ };
+ __extension__ struct
+ {
+ cl_short4 lo, hi;
+ };
+#endif
+#if defined(__CL_SHORT2__)
+ __cl_short2 v2[4];
+#endif
+#if defined(__CL_SHORT4__)
+ __cl_short4 v4[2];
+#endif
+#if defined(__CL_SHORT8__)
+ __cl_short8 v8;
+#endif
+ } cl_short8;
+
+ typedef union {
+ cl_short CL_ALIGNED(32) s[16];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_short x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf;
+ };
+ __extension__ struct
+ {
+ cl_short s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF;
+ };
+ __extension__ struct
+ {
+ cl_short8 lo, hi;
+ };
+#endif
+#if defined(__CL_SHORT2__)
+ __cl_short2 v2[8];
+#endif
+#if defined(__CL_SHORT4__)
+ __cl_short4 v4[4];
+#endif
+#if defined(__CL_SHORT8__)
+ __cl_short8 v8[2];
+#endif
+#if defined(__CL_SHORT16__)
+ __cl_short16 v16;
+#endif
+ } cl_short16;
+
+ /* ---- cl_ushortn ---- */
+ typedef union {
+ cl_ushort CL_ALIGNED(4) s[2];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_ushort x, y;
+ };
+ __extension__ struct
+ {
+ cl_ushort s0, s1;
+ };
+ __extension__ struct
+ {
+ cl_ushort lo, hi;
+ };
+#endif
+#if defined(__CL_USHORT2__)
+ __cl_ushort2 v2;
+#endif
+ } cl_ushort2;
+
+ typedef union {
+ cl_ushort CL_ALIGNED(8) s[4];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_ushort x, y, z, w;
+ };
+ __extension__ struct
+ {
+ cl_ushort s0, s1, s2, s3;
+ };
+ __extension__ struct
+ {
+ cl_ushort2 lo, hi;
+ };
+#endif
+#if defined(__CL_USHORT2__)
+ __cl_ushort2 v2[2];
+#endif
+#if defined(__CL_USHORT4__)
+ __cl_ushort4 v4;
+#endif
+ } cl_ushort4;
+
+ /* cl_ushort3 is identical in size, alignment and behavior to cl_ushort4. See section 6.1.5. */
+ typedef cl_ushort4 cl_ushort3;
+
+ typedef union {
+ cl_ushort CL_ALIGNED(16) s[8];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_ushort x, y, z, w;
+ };
+ __extension__ struct
+ {
+ cl_ushort s0, s1, s2, s3, s4, s5, s6, s7;
+ };
+ __extension__ struct
+ {
+ cl_ushort4 lo, hi;
+ };
+#endif
+#if defined(__CL_USHORT2__)
+ __cl_ushort2 v2[4];
+#endif
+#if defined(__CL_USHORT4__)
+ __cl_ushort4 v4[2];
+#endif
+#if defined(__CL_USHORT8__)
+ __cl_ushort8 v8;
+#endif
+ } cl_ushort8;
+
+ typedef union {
+ cl_ushort CL_ALIGNED(32) s[16];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_ushort x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf;
+ };
+ __extension__ struct
+ {
+ cl_ushort s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF;
+ };
+ __extension__ struct
+ {
+ cl_ushort8 lo, hi;
+ };
+#endif
+#if defined(__CL_USHORT2__)
+ __cl_ushort2 v2[8];
+#endif
+#if defined(__CL_USHORT4__)
+ __cl_ushort4 v4[4];
+#endif
+#if defined(__CL_USHORT8__)
+ __cl_ushort8 v8[2];
+#endif
+#if defined(__CL_USHORT16__)
+ __cl_ushort16 v16;
+#endif
+ } cl_ushort16;
+
+ /* ---- cl_intn ---- */
+ typedef union {
+ cl_int CL_ALIGNED(8) s[2];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_int x, y;
+ };
+ __extension__ struct
+ {
+ cl_int s0, s1;
+ };
+ __extension__ struct
+ {
+ cl_int lo, hi;
+ };
+#endif
+#if defined(__CL_INT2__)
+ __cl_int2 v2;
+#endif
+ } cl_int2;
+
+ typedef union {
+ cl_int CL_ALIGNED(16) s[4];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_int x, y, z, w;
+ };
+ __extension__ struct
+ {
+ cl_int s0, s1, s2, s3;
+ };
+ __extension__ struct
+ {
+ cl_int2 lo, hi;
+ };
+#endif
+#if defined(__CL_INT2__)
+ __cl_int2 v2[2];
+#endif
+#if defined(__CL_INT4__)
+ __cl_int4 v4;
+#endif
+ } cl_int4;
+
+ /* cl_int3 is identical in size, alignment and behavior to cl_int4. See section 6.1.5. */
+ typedef cl_int4 cl_int3;
+
+ typedef union {
+ cl_int CL_ALIGNED(32) s[8];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_int x, y, z, w;
+ };
+ __extension__ struct
+ {
+ cl_int s0, s1, s2, s3, s4, s5, s6, s7;
+ };
+ __extension__ struct
+ {
+ cl_int4 lo, hi;
+ };
+#endif
+#if defined(__CL_INT2__)
+ __cl_int2 v2[4];
+#endif
+#if defined(__CL_INT4__)
+ __cl_int4 v4[2];
+#endif
+#if defined(__CL_INT8__)
+ __cl_int8 v8;
+#endif
+ } cl_int8;
+
+ typedef union {
+ cl_int CL_ALIGNED(64) s[16];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_int x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf;
+ };
+ __extension__ struct
+ {
+ cl_int s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF;
+ };
+ __extension__ struct
+ {
+ cl_int8 lo, hi;
+ };
+#endif
+#if defined(__CL_INT2__)
+ __cl_int2 v2[8];
+#endif
+#if defined(__CL_INT4__)
+ __cl_int4 v4[4];
+#endif
+#if defined(__CL_INT8__)
+ __cl_int8 v8[2];
+#endif
+#if defined(__CL_INT16__)
+ __cl_int16 v16;
+#endif
+ } cl_int16;
+
+ /* ---- cl_uintn ---- */
+ typedef union {
+ cl_uint CL_ALIGNED(8) s[2];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_uint x, y;
+ };
+ __extension__ struct
+ {
+ cl_uint s0, s1;
+ };
+ __extension__ struct
+ {
+ cl_uint lo, hi;
+ };
+#endif
+#if defined(__CL_UINT2__)
+ __cl_uint2 v2;
+#endif
+ } cl_uint2;
+
+ typedef union {
+ cl_uint CL_ALIGNED(16) s[4];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_uint x, y, z, w;
+ };
+ __extension__ struct
+ {
+ cl_uint s0, s1, s2, s3;
+ };
+ __extension__ struct
+ {
+ cl_uint2 lo, hi;
+ };
+#endif
+#if defined(__CL_UINT2__)
+ __cl_uint2 v2[2];
+#endif
+#if defined(__CL_UINT4__)
+ __cl_uint4 v4;
+#endif
+ } cl_uint4;
+
+ /* cl_uint3 is identical in size, alignment and behavior to cl_uint4. See section 6.1.5. */
+ typedef cl_uint4 cl_uint3;
+
+ typedef union {
+ cl_uint CL_ALIGNED(32) s[8];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_uint x, y, z, w;
+ };
+ __extension__ struct
+ {
+ cl_uint s0, s1, s2, s3, s4, s5, s6, s7;
+ };
+ __extension__ struct
+ {
+ cl_uint4 lo, hi;
+ };
+#endif
+#if defined(__CL_UINT2__)
+ __cl_uint2 v2[4];
+#endif
+#if defined(__CL_UINT4__)
+ __cl_uint4 v4[2];
+#endif
+#if defined(__CL_UINT8__)
+ __cl_uint8 v8;
+#endif
+ } cl_uint8;
+
+ typedef union {
+ cl_uint CL_ALIGNED(64) s[16];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_uint x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf;
+ };
+ __extension__ struct
+ {
+ cl_uint s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF;
+ };
+ __extension__ struct
+ {
+ cl_uint8 lo, hi;
+ };
+#endif
+#if defined(__CL_UINT2__)
+ __cl_uint2 v2[8];
+#endif
+#if defined(__CL_UINT4__)
+ __cl_uint4 v4[4];
+#endif
+#if defined(__CL_UINT8__)
+ __cl_uint8 v8[2];
+#endif
+#if defined(__CL_UINT16__)
+ __cl_uint16 v16;
+#endif
+ } cl_uint16;
+
+ /* ---- cl_longn ---- */
+ typedef union {
+ cl_long CL_ALIGNED(16) s[2];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_long x, y;
+ };
+ __extension__ struct
+ {
+ cl_long s0, s1;
+ };
+ __extension__ struct
+ {
+ cl_long lo, hi;
+ };
+#endif
+#if defined(__CL_LONG2__)
+ __cl_long2 v2;
+#endif
+ } cl_long2;
+
+ typedef union {
+ cl_long CL_ALIGNED(32) s[4];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_long x, y, z, w;
+ };
+ __extension__ struct
+ {
+ cl_long s0, s1, s2, s3;
+ };
+ __extension__ struct
+ {
+ cl_long2 lo, hi;
+ };
+#endif
+#if defined(__CL_LONG2__)
+ __cl_long2 v2[2];
+#endif
+#if defined(__CL_LONG4__)
+ __cl_long4 v4;
+#endif
+ } cl_long4;
+
+ /* cl_long3 is identical in size, alignment and behavior to cl_long4. See section 6.1.5. */
+ typedef cl_long4 cl_long3;
+
+ typedef union {
+ cl_long CL_ALIGNED(64) s[8];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_long x, y, z, w;
+ };
+ __extension__ struct
+ {
+ cl_long s0, s1, s2, s3, s4, s5, s6, s7;
+ };
+ __extension__ struct
+ {
+ cl_long4 lo, hi;
+ };
+#endif
+#if defined(__CL_LONG2__)
+ __cl_long2 v2[4];
+#endif
+#if defined(__CL_LONG4__)
+ __cl_long4 v4[2];
+#endif
+#if defined(__CL_LONG8__)
+ __cl_long8 v8;
+#endif
+ } cl_long8;
+
+ typedef union {
+ cl_long CL_ALIGNED(128) s[16];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_long x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf;
+ };
+ __extension__ struct
+ {
+ cl_long s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF;
+ };
+ __extension__ struct
+ {
+ cl_long8 lo, hi;
+ };
+#endif
+#if defined(__CL_LONG2__)
+ __cl_long2 v2[8];
+#endif
+#if defined(__CL_LONG4__)
+ __cl_long4 v4[4];
+#endif
+#if defined(__CL_LONG8__)
+ __cl_long8 v8[2];
+#endif
+#if defined(__CL_LONG16__)
+ __cl_long16 v16;
+#endif
+ } cl_long16;
+
+ /* ---- cl_ulongn ---- */
+ typedef union {
+ cl_ulong CL_ALIGNED(16) s[2];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_ulong x, y;
+ };
+ __extension__ struct
+ {
+ cl_ulong s0, s1;
+ };
+ __extension__ struct
+ {
+ cl_ulong lo, hi;
+ };
+#endif
+#if defined(__CL_ULONG2__)
+ __cl_ulong2 v2;
+#endif
+ } cl_ulong2;
+
+ typedef union {
+ cl_ulong CL_ALIGNED(32) s[4];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_ulong x, y, z, w;
+ };
+ __extension__ struct
+ {
+ cl_ulong s0, s1, s2, s3;
+ };
+ __extension__ struct
+ {
+ cl_ulong2 lo, hi;
+ };
+#endif
+#if defined(__CL_ULONG2__)
+ __cl_ulong2 v2[2];
+#endif
+#if defined(__CL_ULONG4__)
+ __cl_ulong4 v4;
+#endif
+ } cl_ulong4;
+
+ /* cl_ulong3 is identical in size, alignment and behavior to cl_ulong4. See section 6.1.5. */
+ typedef cl_ulong4 cl_ulong3;
+
+ typedef union {
+ cl_ulong CL_ALIGNED(64) s[8];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_ulong x, y, z, w;
+ };
+ __extension__ struct
+ {
+ cl_ulong s0, s1, s2, s3, s4, s5, s6, s7;
+ };
+ __extension__ struct
+ {
+ cl_ulong4 lo, hi;
+ };
+#endif
+#if defined(__CL_ULONG2__)
+ __cl_ulong2 v2[4];
+#endif
+#if defined(__CL_ULONG4__)
+ __cl_ulong4 v4[2];
+#endif
+#if defined(__CL_ULONG8__)
+ __cl_ulong8 v8;
+#endif
+ } cl_ulong8;
+
+ typedef union {
+ cl_ulong CL_ALIGNED(128) s[16];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_ulong x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf;
+ };
+ __extension__ struct
+ {
+ cl_ulong s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF;
+ };
+ __extension__ struct
+ {
+ cl_ulong8 lo, hi;
+ };
+#endif
+#if defined(__CL_ULONG2__)
+ __cl_ulong2 v2[8];
+#endif
+#if defined(__CL_ULONG4__)
+ __cl_ulong4 v4[4];
+#endif
+#if defined(__CL_ULONG8__)
+ __cl_ulong8 v8[2];
+#endif
+#if defined(__CL_ULONG16__)
+ __cl_ulong16 v16;
+#endif
+ } cl_ulong16;
+
+ /* --- cl_floatn ---- */
+
+ typedef union {
+ cl_float CL_ALIGNED(8) s[2];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_float x, y;
+ };
+ __extension__ struct
+ {
+ cl_float s0, s1;
+ };
+ __extension__ struct
+ {
+ cl_float lo, hi;
+ };
+#endif
+#if defined(__CL_FLOAT2__)
+ __cl_float2 v2;
+#endif
+ } cl_float2;
+
+ typedef union {
+ cl_float CL_ALIGNED(16) s[4];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_float x, y, z, w;
+ };
+ __extension__ struct
+ {
+ cl_float s0, s1, s2, s3;
+ };
+ __extension__ struct
+ {
+ cl_float2 lo, hi;
+ };
+#endif
+#if defined(__CL_FLOAT2__)
+ __cl_float2 v2[2];
+#endif
+#if defined(__CL_FLOAT4__)
+ __cl_float4 v4;
+#endif
+ } cl_float4;
+
+ /* cl_float3 is identical in size, alignment and behavior to cl_float4. See section 6.1.5. */
+ typedef cl_float4 cl_float3;
+
+ typedef union {
+ cl_float CL_ALIGNED(32) s[8];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_float x, y, z, w;
+ };
+ __extension__ struct
+ {
+ cl_float s0, s1, s2, s3, s4, s5, s6, s7;
+ };
+ __extension__ struct
+ {
+ cl_float4 lo, hi;
+ };
+#endif
+#if defined(__CL_FLOAT2__)
+ __cl_float2 v2[4];
+#endif
+#if defined(__CL_FLOAT4__)
+ __cl_float4 v4[2];
+#endif
+#if defined(__CL_FLOAT8__)
+ __cl_float8 v8;
+#endif
+ } cl_float8;
+
+ typedef union {
+ cl_float CL_ALIGNED(64) s[16];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_float x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf;
+ };
+ __extension__ struct
+ {
+ cl_float s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF;
+ };
+ __extension__ struct
+ {
+ cl_float8 lo, hi;
+ };
+#endif
+#if defined(__CL_FLOAT2__)
+ __cl_float2 v2[8];
+#endif
+#if defined(__CL_FLOAT4__)
+ __cl_float4 v4[4];
+#endif
+#if defined(__CL_FLOAT8__)
+ __cl_float8 v8[2];
+#endif
+#if defined(__CL_FLOAT16__)
+ __cl_float16 v16;
+#endif
+ } cl_float16;
+
+ /* --- cl_doublen ---- */
+
+ typedef union {
+ cl_double CL_ALIGNED(16) s[2];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_double x, y;
+ };
+ __extension__ struct
+ {
+ cl_double s0, s1;
+ };
+ __extension__ struct
+ {
+ cl_double lo, hi;
+ };
+#endif
+#if defined(__CL_DOUBLE2__)
+ __cl_double2 v2;
+#endif
+ } cl_double2;
+
+ typedef union {
+ cl_double CL_ALIGNED(32) s[4];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_double x, y, z, w;
+ };
+ __extension__ struct
+ {
+ cl_double s0, s1, s2, s3;
+ };
+ __extension__ struct
+ {
+ cl_double2 lo, hi;
+ };
+#endif
+#if defined(__CL_DOUBLE2__)
+ __cl_double2 v2[2];
+#endif
+#if defined(__CL_DOUBLE4__)
+ __cl_double4 v4;
+#endif
+ } cl_double4;
+
+ /* cl_double3 is identical in size, alignment and behavior to cl_double4. See section 6.1.5. */
+ typedef cl_double4 cl_double3;
+
+ typedef union {
+ cl_double CL_ALIGNED(64) s[8];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_double x, y, z, w;
+ };
+ __extension__ struct
+ {
+ cl_double s0, s1, s2, s3, s4, s5, s6, s7;
+ };
+ __extension__ struct
+ {
+ cl_double4 lo, hi;
+ };
+#endif
+#if defined(__CL_DOUBLE2__)
+ __cl_double2 v2[4];
+#endif
+#if defined(__CL_DOUBLE4__)
+ __cl_double4 v4[2];
+#endif
+#if defined(__CL_DOUBLE8__)
+ __cl_double8 v8;
+#endif
+ } cl_double8;
+
+ typedef union {
+ cl_double CL_ALIGNED(128) s[16];
+#if defined(CL_NAMED_STRUCT_SUPPORTED)
+ __extension__ struct
+ {
+ cl_double x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf;
+ };
+ __extension__ struct
+ {
+ cl_double s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF;
+ };
+ __extension__ struct
+ {
+ cl_double8 lo, hi;
+ };
+#endif
+#if defined(__CL_DOUBLE2__)
+ __cl_double2 v2[8];
+#endif
+#if defined(__CL_DOUBLE4__)
+ __cl_double4 v4[4];
+#endif
+#if defined(__CL_DOUBLE8__)
+ __cl_double8 v8[2];
+#endif
+#if defined(__CL_DOUBLE16__)
+ __cl_double16 v16;
+#endif
+ } cl_double16;
/* Macro to facilitate debugging
* Usage:
@@ -1237,967 +1551,967 @@ typedef union
* This should correctly set up the line, (column) and file information for your source
* string so you can do source level debugging.
*/
-#define __CL_STRINGIFY( _x ) # _x
-#define _CL_STRINGIFY( _x ) __CL_STRINGIFY( _x )
-#define CL_PROGRAM_STRING_DEBUG_INFO "#line " _CL_STRINGIFY(__LINE__) " \"" __FILE__ "\" \n\n"
-
-// CL.h contents
-/******************************************************************************/
-
-typedef struct _cl_platform_id * cl_platform_id;
-typedef struct _cl_device_id * cl_device_id;
-typedef struct _cl_context * cl_context;
-typedef struct _cl_command_queue * cl_command_queue;
-typedef struct _cl_mem * cl_mem;
-typedef struct _cl_program * cl_program;
-typedef struct _cl_kernel * cl_kernel;
-typedef struct _cl_event * cl_event;
-typedef struct _cl_sampler * cl_sampler;
-
-typedef cl_uint cl_bool; /* WARNING! Unlike cl_ types in cl_platform.h, cl_bool is not guaranteed to be the same size as the bool in kernels. */
-typedef cl_ulong cl_bitfield;
-typedef cl_bitfield cl_device_type;
-typedef cl_uint cl_platform_info;
-typedef cl_uint cl_device_info;
-typedef cl_bitfield cl_device_fp_config;
-typedef cl_uint cl_device_mem_cache_type;
-typedef cl_uint cl_device_local_mem_type;
-typedef cl_bitfield cl_device_exec_capabilities;
-typedef cl_bitfield cl_command_queue_properties;
-
-typedef intptr_t cl_context_properties;
-typedef cl_uint cl_context_info;
-typedef cl_uint cl_command_queue_info;
-typedef cl_uint cl_channel_order;
-typedef cl_uint cl_channel_type;
-typedef cl_bitfield cl_mem_flags;
-typedef cl_uint cl_mem_object_type;
-typedef cl_uint cl_mem_info;
-typedef cl_uint cl_image_info;
-typedef cl_uint cl_buffer_create_type;
-typedef cl_uint cl_addressing_mode;
-typedef cl_uint cl_filter_mode;
-typedef cl_uint cl_sampler_info;
-typedef cl_bitfield cl_map_flags;
-typedef cl_uint cl_program_info;
-typedef cl_uint cl_program_build_info;
-typedef cl_int cl_build_status;
-typedef cl_uint cl_kernel_info;
-typedef cl_uint cl_kernel_work_group_info;
-typedef cl_uint cl_event_info;
-typedef cl_uint cl_command_type;
-typedef cl_uint cl_profiling_info;
-
-typedef struct _cl_image_format {
- cl_channel_order image_channel_order;
- cl_channel_type image_channel_data_type;
-} cl_image_format;
-
-
-typedef struct _cl_buffer_region {
- size_t origin;
- size_t size;
-} cl_buffer_region;
+#define __CL_STRINGIFY(_x) #_x
+#define _CL_STRINGIFY(_x) __CL_STRINGIFY(_x)
+#define CL_PROGRAM_STRING_DEBUG_INFO "#line " _CL_STRINGIFY(__LINE__) " \"" __FILE__ "\" \n\n"
+
+ // CL.h contents
+ /******************************************************************************/
+
+ typedef struct _cl_platform_id *cl_platform_id;
+ typedef struct _cl_device_id *cl_device_id;
+ typedef struct _cl_context *cl_context;
+ typedef struct _cl_command_queue *cl_command_queue;
+ typedef struct _cl_mem *cl_mem;
+ typedef struct _cl_program *cl_program;
+ typedef struct _cl_kernel *cl_kernel;
+ typedef struct _cl_event *cl_event;
+ typedef struct _cl_sampler *cl_sampler;
+
+ typedef cl_uint cl_bool; /* WARNING! Unlike cl_ types in cl_platform.h, cl_bool is not guaranteed to be the same size as the bool in kernels. */
+ typedef cl_ulong cl_bitfield;
+ typedef cl_bitfield cl_device_type;
+ typedef cl_uint cl_platform_info;
+ typedef cl_uint cl_device_info;
+ typedef cl_bitfield cl_device_fp_config;
+ typedef cl_uint cl_device_mem_cache_type;
+ typedef cl_uint cl_device_local_mem_type;
+ typedef cl_bitfield cl_device_exec_capabilities;
+ typedef cl_bitfield cl_command_queue_properties;
+
+ typedef intptr_t cl_context_properties;
+ typedef cl_uint cl_context_info;
+ typedef cl_uint cl_command_queue_info;
+ typedef cl_uint cl_channel_order;
+ typedef cl_uint cl_channel_type;
+ typedef cl_bitfield cl_mem_flags;
+ typedef cl_uint cl_mem_object_type;
+ typedef cl_uint cl_mem_info;
+ typedef cl_uint cl_image_info;
+ typedef cl_uint cl_buffer_create_type;
+ typedef cl_uint cl_addressing_mode;
+ typedef cl_uint cl_filter_mode;
+ typedef cl_uint cl_sampler_info;
+ typedef cl_bitfield cl_map_flags;
+ typedef cl_uint cl_program_info;
+ typedef cl_uint cl_program_build_info;
+ typedef cl_int cl_build_status;
+ typedef cl_uint cl_kernel_info;
+ typedef cl_uint cl_kernel_work_group_info;
+ typedef cl_uint cl_event_info;
+ typedef cl_uint cl_command_type;
+ typedef cl_uint cl_profiling_info;
+
+ typedef struct _cl_image_format
+ {
+ cl_channel_order image_channel_order;
+ cl_channel_type image_channel_data_type;
+ } cl_image_format;
+
+ typedef struct _cl_buffer_region
+ {
+ size_t origin;
+ size_t size;
+ } cl_buffer_region;
/******************************************************************************/
/* Error Codes */
-#define CL_SUCCESS 0
-#define CL_DEVICE_NOT_FOUND -1
-#define CL_DEVICE_NOT_AVAILABLE -2
-#define CL_COMPILER_NOT_AVAILABLE -3
-#define CL_MEM_OBJECT_ALLOCATION_FAILURE -4
-#define CL_OUT_OF_RESOURCES -5
-#define CL_OUT_OF_HOST_MEMORY -6
-#define CL_PROFILING_INFO_NOT_AVAILABLE -7
-#define CL_MEM_COPY_OVERLAP -8
-#define CL_IMAGE_FORMAT_MISMATCH -9
-#define CL_IMAGE_FORMAT_NOT_SUPPORTED -10
-#define CL_BUILD_PROGRAM_FAILURE -11
-#define CL_MAP_FAILURE -12
-#define CL_MISALIGNED_SUB_BUFFER_OFFSET -13
+#define CL_SUCCESS 0
+#define CL_DEVICE_NOT_FOUND -1
+#define CL_DEVICE_NOT_AVAILABLE -2
+#define CL_COMPILER_NOT_AVAILABLE -3
+#define CL_MEM_OBJECT_ALLOCATION_FAILURE -4
+#define CL_OUT_OF_RESOURCES -5
+#define CL_OUT_OF_HOST_MEMORY -6
+#define CL_PROFILING_INFO_NOT_AVAILABLE -7
+#define CL_MEM_COPY_OVERLAP -8
+#define CL_IMAGE_FORMAT_MISMATCH -9
+#define CL_IMAGE_FORMAT_NOT_SUPPORTED -10
+#define CL_BUILD_PROGRAM_FAILURE -11
+#define CL_MAP_FAILURE -12
+#define CL_MISALIGNED_SUB_BUFFER_OFFSET -13
#define CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST -14
-#define CL_INVALID_VALUE -30
-#define CL_INVALID_DEVICE_TYPE -31
-#define CL_INVALID_PLATFORM -32
-#define CL_INVALID_DEVICE -33
-#define CL_INVALID_CONTEXT -34
-#define CL_INVALID_QUEUE_PROPERTIES -35
-#define CL_INVALID_COMMAND_QUEUE -36
-#define CL_INVALID_HOST_PTR -37
-#define CL_INVALID_MEM_OBJECT -38
-#define CL_INVALID_IMAGE_FORMAT_DESCRIPTOR -39
-#define CL_INVALID_IMAGE_SIZE -40
-#define CL_INVALID_SAMPLER -41
-#define CL_INVALID_BINARY -42
-#define CL_INVALID_BUILD_OPTIONS -43
-#define CL_INVALID_PROGRAM -44
-#define CL_INVALID_PROGRAM_EXECUTABLE -45
-#define CL_INVALID_KERNEL_NAME -46
-#define CL_INVALID_KERNEL_DEFINITION -47
-#define CL_INVALID_KERNEL -48
-#define CL_INVALID_ARG_INDEX -49
-#define CL_INVALID_ARG_VALUE -50
-#define CL_INVALID_ARG_SIZE -51
-#define CL_INVALID_KERNEL_ARGS -52
-#define CL_INVALID_WORK_DIMENSION -53
-#define CL_INVALID_WORK_GROUP_SIZE -54
-#define CL_INVALID_WORK_ITEM_SIZE -55
-#define CL_INVALID_GLOBAL_OFFSET -56
-#define CL_INVALID_EVENT_WAIT_LIST -57
-#define CL_INVALID_EVENT -58
-#define CL_INVALID_OPERATION -59
-#define CL_INVALID_GL_OBJECT -60
-#define CL_INVALID_BUFFER_SIZE -61
-#define CL_INVALID_MIP_LEVEL -62
-#define CL_INVALID_GLOBAL_WORK_SIZE -63
-#define CL_INVALID_PROPERTY -64
+#define CL_INVALID_VALUE -30
+#define CL_INVALID_DEVICE_TYPE -31
+#define CL_INVALID_PLATFORM -32
+#define CL_INVALID_DEVICE -33
+#define CL_INVALID_CONTEXT -34
+#define CL_INVALID_QUEUE_PROPERTIES -35
+#define CL_INVALID_COMMAND_QUEUE -36
+#define CL_INVALID_HOST_PTR -37
+#define CL_INVALID_MEM_OBJECT -38
+#define CL_INVALID_IMAGE_FORMAT_DESCRIPTOR -39
+#define CL_INVALID_IMAGE_SIZE -40
+#define CL_INVALID_SAMPLER -41
+#define CL_INVALID_BINARY -42
+#define CL_INVALID_BUILD_OPTIONS -43
+#define CL_INVALID_PROGRAM -44
+#define CL_INVALID_PROGRAM_EXECUTABLE -45
+#define CL_INVALID_KERNEL_NAME -46
+#define CL_INVALID_KERNEL_DEFINITION -47
+#define CL_INVALID_KERNEL -48
+#define CL_INVALID_ARG_INDEX -49
+#define CL_INVALID_ARG_VALUE -50
+#define CL_INVALID_ARG_SIZE -51
+#define CL_INVALID_KERNEL_ARGS -52
+#define CL_INVALID_WORK_DIMENSION -53
+#define CL_INVALID_WORK_GROUP_SIZE -54
+#define CL_INVALID_WORK_ITEM_SIZE -55
+#define CL_INVALID_GLOBAL_OFFSET -56
+#define CL_INVALID_EVENT_WAIT_LIST -57
+#define CL_INVALID_EVENT -58
+#define CL_INVALID_OPERATION -59
+#define CL_INVALID_GL_OBJECT -60
+#define CL_INVALID_BUFFER_SIZE -61
+#define CL_INVALID_MIP_LEVEL -62
+#define CL_INVALID_GLOBAL_WORK_SIZE -63
+#define CL_INVALID_PROPERTY -64
/* OpenCL Version */
-#define CL_VERSION_1_0 1
-#define CL_VERSION_1_1 1
+#define CL_VERSION_1_0 1
+#define CL_VERSION_1_1 1
/* cl_bool */
-#define CL_FALSE 0
-#define CL_TRUE 1
+#define CL_FALSE 0
+#define CL_TRUE 1
/* cl_platform_info */
-#define CL_PLATFORM_PROFILE 0x0900
-#define CL_PLATFORM_VERSION 0x0901
-#define CL_PLATFORM_NAME 0x0902
-#define CL_PLATFORM_VENDOR 0x0903
-#define CL_PLATFORM_EXTENSIONS 0x0904
+#define CL_PLATFORM_PROFILE 0x0900
+#define CL_PLATFORM_VERSION 0x0901
+#define CL_PLATFORM_NAME 0x0902
+#define CL_PLATFORM_VENDOR 0x0903
+#define CL_PLATFORM_EXTENSIONS 0x0904
/* cl_device_type - bitfield */
-#define CL_DEVICE_TYPE_DEFAULT (1 << 0)
-#define CL_DEVICE_TYPE_CPU (1 << 1)
-#define CL_DEVICE_TYPE_GPU (1 << 2)
-#define CL_DEVICE_TYPE_ACCELERATOR (1 << 3)
-#define CL_DEVICE_TYPE_ALL 0xFFFFFFFF
+#define CL_DEVICE_TYPE_DEFAULT (1 << 0)
+#define CL_DEVICE_TYPE_CPU (1 << 1)
+#define CL_DEVICE_TYPE_GPU (1 << 2)
+#define CL_DEVICE_TYPE_ACCELERATOR (1 << 3)
+#define CL_DEVICE_TYPE_ALL 0xFFFFFFFF
/* cl_device_info */
-#define CL_DEVICE_TYPE 0x1000
-#define CL_DEVICE_VENDOR_ID 0x1001
-#define CL_DEVICE_MAX_COMPUTE_UNITS 0x1002
-#define CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS 0x1003
-#define CL_DEVICE_MAX_WORK_GROUP_SIZE 0x1004
-#define CL_DEVICE_MAX_WORK_ITEM_SIZES 0x1005
-#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR 0x1006
-#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT 0x1007
-#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT 0x1008
-#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG 0x1009
-#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT 0x100A
-#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE 0x100B
-#define CL_DEVICE_MAX_CLOCK_FREQUENCY 0x100C
-#define CL_DEVICE_ADDRESS_BITS 0x100D
-#define CL_DEVICE_MAX_READ_IMAGE_ARGS 0x100E
-#define CL_DEVICE_MAX_WRITE_IMAGE_ARGS 0x100F
-#define CL_DEVICE_MAX_MEM_ALLOC_SIZE 0x1010
-#define CL_DEVICE_IMAGE2D_MAX_WIDTH 0x1011
-#define CL_DEVICE_IMAGE2D_MAX_HEIGHT 0x1012
-#define CL_DEVICE_IMAGE3D_MAX_WIDTH 0x1013
-#define CL_DEVICE_IMAGE3D_MAX_HEIGHT 0x1014
-#define CL_DEVICE_IMAGE3D_MAX_DEPTH 0x1015
-#define CL_DEVICE_IMAGE_SUPPORT 0x1016
-#define CL_DEVICE_MAX_PARAMETER_SIZE 0x1017
-#define CL_DEVICE_MAX_SAMPLERS 0x1018
-#define CL_DEVICE_MEM_BASE_ADDR_ALIGN 0x1019
-#define CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE 0x101A
-#define CL_DEVICE_SINGLE_FP_CONFIG 0x101B
-#define CL_DEVICE_GLOBAL_MEM_CACHE_TYPE 0x101C
-#define CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE 0x101D
-#define CL_DEVICE_GLOBAL_MEM_CACHE_SIZE 0x101E
-#define CL_DEVICE_GLOBAL_MEM_SIZE 0x101F
-#define CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE 0x1020
-#define CL_DEVICE_MAX_CONSTANT_ARGS 0x1021
-#define CL_DEVICE_LOCAL_MEM_TYPE 0x1022
-#define CL_DEVICE_LOCAL_MEM_SIZE 0x1023
-#define CL_DEVICE_ERROR_CORRECTION_SUPPORT 0x1024
-#define CL_DEVICE_PROFILING_TIMER_RESOLUTION 0x1025
-#define CL_DEVICE_ENDIAN_LITTLE 0x1026
-#define CL_DEVICE_AVAILABLE 0x1027
-#define CL_DEVICE_COMPILER_AVAILABLE 0x1028
-#define CL_DEVICE_EXECUTION_CAPABILITIES 0x1029
-#define CL_DEVICE_QUEUE_PROPERTIES 0x102A
-#define CL_DEVICE_NAME 0x102B
-#define CL_DEVICE_VENDOR 0x102C
-#define CL_DRIVER_VERSION 0x102D
-#define CL_DEVICE_PROFILE 0x102E
-#define CL_DEVICE_VERSION 0x102F
-#define CL_DEVICE_EXTENSIONS 0x1030
-#define CL_DEVICE_PLATFORM 0x1031
+#define CL_DEVICE_TYPE 0x1000
+#define CL_DEVICE_VENDOR_ID 0x1001
+#define CL_DEVICE_MAX_COMPUTE_UNITS 0x1002
+#define CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS 0x1003
+#define CL_DEVICE_MAX_WORK_GROUP_SIZE 0x1004
+#define CL_DEVICE_MAX_WORK_ITEM_SIZES 0x1005
+#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR 0x1006
+#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT 0x1007
+#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT 0x1008
+#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG 0x1009
+#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT 0x100A
+#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE 0x100B
+#define CL_DEVICE_MAX_CLOCK_FREQUENCY 0x100C
+#define CL_DEVICE_ADDRESS_BITS 0x100D
+#define CL_DEVICE_MAX_READ_IMAGE_ARGS 0x100E
+#define CL_DEVICE_MAX_WRITE_IMAGE_ARGS 0x100F
+#define CL_DEVICE_MAX_MEM_ALLOC_SIZE 0x1010
+#define CL_DEVICE_IMAGE2D_MAX_WIDTH 0x1011
+#define CL_DEVICE_IMAGE2D_MAX_HEIGHT 0x1012
+#define CL_DEVICE_IMAGE3D_MAX_WIDTH 0x1013
+#define CL_DEVICE_IMAGE3D_MAX_HEIGHT 0x1014
+#define CL_DEVICE_IMAGE3D_MAX_DEPTH 0x1015
+#define CL_DEVICE_IMAGE_SUPPORT 0x1016
+#define CL_DEVICE_MAX_PARAMETER_SIZE 0x1017
+#define CL_DEVICE_MAX_SAMPLERS 0x1018
+#define CL_DEVICE_MEM_BASE_ADDR_ALIGN 0x1019
+#define CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE 0x101A
+#define CL_DEVICE_SINGLE_FP_CONFIG 0x101B
+#define CL_DEVICE_GLOBAL_MEM_CACHE_TYPE 0x101C
+#define CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE 0x101D
+#define CL_DEVICE_GLOBAL_MEM_CACHE_SIZE 0x101E
+#define CL_DEVICE_GLOBAL_MEM_SIZE 0x101F
+#define CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE 0x1020
+#define CL_DEVICE_MAX_CONSTANT_ARGS 0x1021
+#define CL_DEVICE_LOCAL_MEM_TYPE 0x1022
+#define CL_DEVICE_LOCAL_MEM_SIZE 0x1023
+#define CL_DEVICE_ERROR_CORRECTION_SUPPORT 0x1024
+#define CL_DEVICE_PROFILING_TIMER_RESOLUTION 0x1025
+#define CL_DEVICE_ENDIAN_LITTLE 0x1026
+#define CL_DEVICE_AVAILABLE 0x1027
+#define CL_DEVICE_COMPILER_AVAILABLE 0x1028
+#define CL_DEVICE_EXECUTION_CAPABILITIES 0x1029
+#define CL_DEVICE_QUEUE_PROPERTIES 0x102A
+#define CL_DEVICE_NAME 0x102B
+#define CL_DEVICE_VENDOR 0x102C
+#define CL_DRIVER_VERSION 0x102D
+#define CL_DEVICE_PROFILE 0x102E
+#define CL_DEVICE_VERSION 0x102F
+#define CL_DEVICE_EXTENSIONS 0x1030
+#define CL_DEVICE_PLATFORM 0x1031
/* 0x1032 reserved for CL_DEVICE_DOUBLE_FP_CONFIG */
/* 0x1033 reserved for CL_DEVICE_HALF_FP_CONFIG */
-#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF 0x1034
-#define CL_DEVICE_HOST_UNIFIED_MEMORY 0x1035
-#define CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR 0x1036
-#define CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT 0x1037
-#define CL_DEVICE_NATIVE_VECTOR_WIDTH_INT 0x1038
-#define CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG 0x1039
-#define CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT 0x103A
-#define CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE 0x103B
-#define CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF 0x103C
-#define CL_DEVICE_OPENCL_C_VERSION 0x103D
+#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF 0x1034
+#define CL_DEVICE_HOST_UNIFIED_MEMORY 0x1035
+#define CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR 0x1036
+#define CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT 0x1037
+#define CL_DEVICE_NATIVE_VECTOR_WIDTH_INT 0x1038
+#define CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG 0x1039
+#define CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT 0x103A
+#define CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE 0x103B
+#define CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF 0x103C
+#define CL_DEVICE_OPENCL_C_VERSION 0x103D
/* cl_device_fp_config - bitfield */
-#define CL_FP_DENORM (1 << 0)
-#define CL_FP_INF_NAN (1 << 1)
-#define CL_FP_ROUND_TO_NEAREST (1 << 2)
-#define CL_FP_ROUND_TO_ZERO (1 << 3)
-#define CL_FP_ROUND_TO_INF (1 << 4)
-#define CL_FP_FMA (1 << 5)
-#define CL_FP_SOFT_FLOAT (1 << 6)
+#define CL_FP_DENORM (1 << 0)
+#define CL_FP_INF_NAN (1 << 1)
+#define CL_FP_ROUND_TO_NEAREST (1 << 2)
+#define CL_FP_ROUND_TO_ZERO (1 << 3)
+#define CL_FP_ROUND_TO_INF (1 << 4)
+#define CL_FP_FMA (1 << 5)
+#define CL_FP_SOFT_FLOAT (1 << 6)
/* cl_device_mem_cache_type */
-#define CL_NONE 0x0
-#define CL_READ_ONLY_CACHE 0x1
-#define CL_READ_WRITE_CACHE 0x2
+#define CL_NONE 0x0
+#define CL_READ_ONLY_CACHE 0x1
+#define CL_READ_WRITE_CACHE 0x2
/* cl_device_local_mem_type */
-#define CL_LOCAL 0x1
-#define CL_GLOBAL 0x2
+#define CL_LOCAL 0x1
+#define CL_GLOBAL 0x2
/* cl_device_exec_capabilities - bitfield */
-#define CL_EXEC_KERNEL (1 << 0)
-#define CL_EXEC_NATIVE_KERNEL (1 << 1)
+#define CL_EXEC_KERNEL (1 << 0)
+#define CL_EXEC_NATIVE_KERNEL (1 << 1)
/* cl_command_queue_properties - bitfield */
-#define CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE (1 << 0)
-#define CL_QUEUE_PROFILING_ENABLE (1 << 1)
+#define CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE (1 << 0)
+#define CL_QUEUE_PROFILING_ENABLE (1 << 1)
/* cl_context_info */
-#define CL_CONTEXT_REFERENCE_COUNT 0x1080
-#define CL_CONTEXT_DEVICES 0x1081
-#define CL_CONTEXT_PROPERTIES 0x1082
-#define CL_CONTEXT_NUM_DEVICES 0x1083
+#define CL_CONTEXT_REFERENCE_COUNT 0x1080
+#define CL_CONTEXT_DEVICES 0x1081
+#define CL_CONTEXT_PROPERTIES 0x1082
+#define CL_CONTEXT_NUM_DEVICES 0x1083
/* cl_context_info + cl_context_properties */
-#define CL_CONTEXT_PLATFORM 0x1084
+#define CL_CONTEXT_PLATFORM 0x1084
/* cl_command_queue_info */
-#define CL_QUEUE_CONTEXT 0x1090
-#define CL_QUEUE_DEVICE 0x1091
-#define CL_QUEUE_REFERENCE_COUNT 0x1092
-#define CL_QUEUE_PROPERTIES 0x1093
+#define CL_QUEUE_CONTEXT 0x1090
+#define CL_QUEUE_DEVICE 0x1091
+#define CL_QUEUE_REFERENCE_COUNT 0x1092
+#define CL_QUEUE_PROPERTIES 0x1093
/* cl_mem_flags - bitfield */
-#define CL_MEM_READ_WRITE (1 << 0)
-#define CL_MEM_WRITE_ONLY (1 << 1)
-#define CL_MEM_READ_ONLY (1 << 2)
-#define CL_MEM_USE_HOST_PTR (1 << 3)
-#define CL_MEM_ALLOC_HOST_PTR (1 << 4)
-#define CL_MEM_COPY_HOST_PTR (1 << 5)
+#define CL_MEM_READ_WRITE (1 << 0)
+#define CL_MEM_WRITE_ONLY (1 << 1)
+#define CL_MEM_READ_ONLY (1 << 2)
+#define CL_MEM_USE_HOST_PTR (1 << 3)
+#define CL_MEM_ALLOC_HOST_PTR (1 << 4)
+#define CL_MEM_COPY_HOST_PTR (1 << 5)
/* cl_channel_order */
-#define CL_R 0x10B0
-#define CL_A 0x10B1
-#define CL_RG 0x10B2
-#define CL_RA 0x10B3
-#define CL_RGB 0x10B4
-#define CL_RGBA 0x10B5
-#define CL_BGRA 0x10B6
-#define CL_ARGB 0x10B7
-#define CL_INTENSITY 0x10B8
-#define CL_LUMINANCE 0x10B9
-#define CL_Rx 0x10BA
-#define CL_RGx 0x10BB
-#define CL_RGBx 0x10BC
+#define CL_R 0x10B0
+#define CL_A 0x10B1
+#define CL_RG 0x10B2
+#define CL_RA 0x10B3
+#define CL_RGB 0x10B4
+#define CL_RGBA 0x10B5
+#define CL_BGRA 0x10B6
+#define CL_ARGB 0x10B7
+#define CL_INTENSITY 0x10B8
+#define CL_LUMINANCE 0x10B9
+#define CL_Rx 0x10BA
+#define CL_RGx 0x10BB
+#define CL_RGBx 0x10BC
/* cl_channel_type */
-#define CL_SNORM_INT8 0x10D0
-#define CL_SNORM_INT16 0x10D1
-#define CL_UNORM_INT8 0x10D2
-#define CL_UNORM_INT16 0x10D3
-#define CL_UNORM_SHORT_565 0x10D4
-#define CL_UNORM_SHORT_555 0x10D5
-#define CL_UNORM_INT_101010 0x10D6
-#define CL_SIGNED_INT8 0x10D7
-#define CL_SIGNED_INT16 0x10D8
-#define CL_SIGNED_INT32 0x10D9
-#define CL_UNSIGNED_INT8 0x10DA
-#define CL_UNSIGNED_INT16 0x10DB
-#define CL_UNSIGNED_INT32 0x10DC
-#define CL_HALF_FLOAT 0x10DD
-#define CL_FLOAT 0x10DE
+#define CL_SNORM_INT8 0x10D0
+#define CL_SNORM_INT16 0x10D1
+#define CL_UNORM_INT8 0x10D2
+#define CL_UNORM_INT16 0x10D3
+#define CL_UNORM_SHORT_565 0x10D4
+#define CL_UNORM_SHORT_555 0x10D5
+#define CL_UNORM_INT_101010 0x10D6
+#define CL_SIGNED_INT8 0x10D7
+#define CL_SIGNED_INT16 0x10D8
+#define CL_SIGNED_INT32 0x10D9
+#define CL_UNSIGNED_INT8 0x10DA
+#define CL_UNSIGNED_INT16 0x10DB
+#define CL_UNSIGNED_INT32 0x10DC
+#define CL_HALF_FLOAT 0x10DD
+#define CL_FLOAT 0x10DE
/* cl_mem_object_type */
-#define CL_MEM_OBJECT_BUFFER 0x10F0
-#define CL_MEM_OBJECT_IMAGE2D 0x10F1
-#define CL_MEM_OBJECT_IMAGE3D 0x10F2
+#define CL_MEM_OBJECT_BUFFER 0x10F0
+#define CL_MEM_OBJECT_IMAGE2D 0x10F1
+#define CL_MEM_OBJECT_IMAGE3D 0x10F2
/* cl_mem_info */
-#define CL_MEM_TYPE 0x1100
-#define CL_MEM_FLAGS 0x1101
-#define CL_MEM_SIZE 0x1102
-#define CL_MEM_HOST_PTR 0x1103
-#define CL_MEM_MAP_COUNT 0x1104
-#define CL_MEM_REFERENCE_COUNT 0x1105
-#define CL_MEM_CONTEXT 0x1106
-#define CL_MEM_ASSOCIATED_MEMOBJECT 0x1107
-#define CL_MEM_OFFSET 0x1108
+#define CL_MEM_TYPE 0x1100
+#define CL_MEM_FLAGS 0x1101
+#define CL_MEM_SIZE 0x1102
+#define CL_MEM_HOST_PTR 0x1103
+#define CL_MEM_MAP_COUNT 0x1104
+#define CL_MEM_REFERENCE_COUNT 0x1105
+#define CL_MEM_CONTEXT 0x1106
+#define CL_MEM_ASSOCIATED_MEMOBJECT 0x1107
+#define CL_MEM_OFFSET 0x1108
/* cl_image_info */
-#define CL_IMAGE_FORMAT 0x1110
-#define CL_IMAGE_ELEMENT_SIZE 0x1111
-#define CL_IMAGE_ROW_PITCH 0x1112
-#define CL_IMAGE_SLICE_PITCH 0x1113
-#define CL_IMAGE_WIDTH 0x1114
-#define CL_IMAGE_HEIGHT 0x1115
-#define CL_IMAGE_DEPTH 0x1116
+#define CL_IMAGE_FORMAT 0x1110
+#define CL_IMAGE_ELEMENT_SIZE 0x1111
+#define CL_IMAGE_ROW_PITCH 0x1112
+#define CL_IMAGE_SLICE_PITCH 0x1113
+#define CL_IMAGE_WIDTH 0x1114
+#define CL_IMAGE_HEIGHT 0x1115
+#define CL_IMAGE_DEPTH 0x1116
/* cl_addressing_mode */
-#define CL_ADDRESS_NONE 0x1130
-#define CL_ADDRESS_CLAMP_TO_EDGE 0x1131
-#define CL_ADDRESS_CLAMP 0x1132
-#define CL_ADDRESS_REPEAT 0x1133
-#define CL_ADDRESS_MIRRORED_REPEAT 0x1134
+#define CL_ADDRESS_NONE 0x1130
+#define CL_ADDRESS_CLAMP_TO_EDGE 0x1131
+#define CL_ADDRESS_CLAMP 0x1132
+#define CL_ADDRESS_REPEAT 0x1133
+#define CL_ADDRESS_MIRRORED_REPEAT 0x1134
/* cl_filter_mode */
-#define CL_FILTER_NEAREST 0x1140
-#define CL_FILTER_LINEAR 0x1141
+#define CL_FILTER_NEAREST 0x1140
+#define CL_FILTER_LINEAR 0x1141
/* cl_sampler_info */
-#define CL_SAMPLER_REFERENCE_COUNT 0x1150
-#define CL_SAMPLER_CONTEXT 0x1151
-#define CL_SAMPLER_NORMALIZED_COORDS 0x1152
-#define CL_SAMPLER_ADDRESSING_MODE 0x1153
-#define CL_SAMPLER_FILTER_MODE 0x1154
+#define CL_SAMPLER_REFERENCE_COUNT 0x1150
+#define CL_SAMPLER_CONTEXT 0x1151
+#define CL_SAMPLER_NORMALIZED_COORDS 0x1152
+#define CL_SAMPLER_ADDRESSING_MODE 0x1153
+#define CL_SAMPLER_FILTER_MODE 0x1154
/* cl_map_flags - bitfield */
-#define CL_MAP_READ (1 << 0)
-#define CL_MAP_WRITE (1 << 1)
+#define CL_MAP_READ (1 << 0)
+#define CL_MAP_WRITE (1 << 1)
/* cl_program_info */
-#define CL_PROGRAM_REFERENCE_COUNT 0x1160
-#define CL_PROGRAM_CONTEXT 0x1161
-#define CL_PROGRAM_NUM_DEVICES 0x1162
-#define CL_PROGRAM_DEVICES 0x1163
-#define CL_PROGRAM_SOURCE 0x1164
-#define CL_PROGRAM_BINARY_SIZES 0x1165
-#define CL_PROGRAM_BINARIES 0x1166
+#define CL_PROGRAM_REFERENCE_COUNT 0x1160
+#define CL_PROGRAM_CONTEXT 0x1161
+#define CL_PROGRAM_NUM_DEVICES 0x1162
+#define CL_PROGRAM_DEVICES 0x1163
+#define CL_PROGRAM_SOURCE 0x1164
+#define CL_PROGRAM_BINARY_SIZES 0x1165
+#define CL_PROGRAM_BINARIES 0x1166
/* cl_program_build_info */
-#define CL_PROGRAM_BUILD_STATUS 0x1181
-#define CL_PROGRAM_BUILD_OPTIONS 0x1182
-#define CL_PROGRAM_BUILD_LOG 0x1183
+#define CL_PROGRAM_BUILD_STATUS 0x1181
+#define CL_PROGRAM_BUILD_OPTIONS 0x1182
+#define CL_PROGRAM_BUILD_LOG 0x1183
/* cl_build_status */
-#define CL_BUILD_SUCCESS 0
-#define CL_BUILD_NONE -1
-#define CL_BUILD_ERROR -2
-#define CL_BUILD_IN_PROGRESS -3
+#define CL_BUILD_SUCCESS 0
+#define CL_BUILD_NONE -1
+#define CL_BUILD_ERROR -2
+#define CL_BUILD_IN_PROGRESS -3
/* cl_kernel_info */
-#define CL_KERNEL_FUNCTION_NAME 0x1190
-#define CL_KERNEL_NUM_ARGS 0x1191
-#define CL_KERNEL_REFERENCE_COUNT 0x1192
-#define CL_KERNEL_CONTEXT 0x1193
-#define CL_KERNEL_PROGRAM 0x1194
+#define CL_KERNEL_FUNCTION_NAME 0x1190
+#define CL_KERNEL_NUM_ARGS 0x1191
+#define CL_KERNEL_REFERENCE_COUNT 0x1192
+#define CL_KERNEL_CONTEXT 0x1193
+#define CL_KERNEL_PROGRAM 0x1194
/* cl_kernel_work_group_info */
-#define CL_KERNEL_WORK_GROUP_SIZE 0x11B0
-#define CL_KERNEL_COMPILE_WORK_GROUP_SIZE 0x11B1
-#define CL_KERNEL_LOCAL_MEM_SIZE 0x11B2
+#define CL_KERNEL_WORK_GROUP_SIZE 0x11B0
+#define CL_KERNEL_COMPILE_WORK_GROUP_SIZE 0x11B1
+#define CL_KERNEL_LOCAL_MEM_SIZE 0x11B2
#define CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE 0x11B3
-#define CL_KERNEL_PRIVATE_MEM_SIZE 0x11B4
+#define CL_KERNEL_PRIVATE_MEM_SIZE 0x11B4
/* cl_event_info */
-#define CL_EVENT_COMMAND_QUEUE 0x11D0
-#define CL_EVENT_COMMAND_TYPE 0x11D1
-#define CL_EVENT_REFERENCE_COUNT 0x11D2
-#define CL_EVENT_COMMAND_EXECUTION_STATUS 0x11D3
-#define CL_EVENT_CONTEXT 0x11D4
+#define CL_EVENT_COMMAND_QUEUE 0x11D0
+#define CL_EVENT_COMMAND_TYPE 0x11D1
+#define CL_EVENT_REFERENCE_COUNT 0x11D2
+#define CL_EVENT_COMMAND_EXECUTION_STATUS 0x11D3
+#define CL_EVENT_CONTEXT 0x11D4
/* cl_command_type */
-#define CL_COMMAND_NDRANGE_KERNEL 0x11F0
-#define CL_COMMAND_TASK 0x11F1
-#define CL_COMMAND_NATIVE_KERNEL 0x11F2
-#define CL_COMMAND_READ_BUFFER 0x11F3
-#define CL_COMMAND_WRITE_BUFFER 0x11F4
-#define CL_COMMAND_COPY_BUFFER 0x11F5
-#define CL_COMMAND_READ_IMAGE 0x11F6
-#define CL_COMMAND_WRITE_IMAGE 0x11F7
-#define CL_COMMAND_COPY_IMAGE 0x11F8
-#define CL_COMMAND_COPY_IMAGE_TO_BUFFER 0x11F9
-#define CL_COMMAND_COPY_BUFFER_TO_IMAGE 0x11FA
-#define CL_COMMAND_MAP_BUFFER 0x11FB
-#define CL_COMMAND_MAP_IMAGE 0x11FC
-#define CL_COMMAND_UNMAP_MEM_OBJECT 0x11FD
-#define CL_COMMAND_MARKER 0x11FE
-#define CL_COMMAND_ACQUIRE_GL_OBJECTS 0x11FF
-#define CL_COMMAND_RELEASE_GL_OBJECTS 0x1200
-#define CL_COMMAND_READ_BUFFER_RECT 0x1201
-#define CL_COMMAND_WRITE_BUFFER_RECT 0x1202
-#define CL_COMMAND_COPY_BUFFER_RECT 0x1203
-#define CL_COMMAND_USER 0x1204
+#define CL_COMMAND_NDRANGE_KERNEL 0x11F0
+#define CL_COMMAND_TASK 0x11F1
+#define CL_COMMAND_NATIVE_KERNEL 0x11F2
+#define CL_COMMAND_READ_BUFFER 0x11F3
+#define CL_COMMAND_WRITE_BUFFER 0x11F4
+#define CL_COMMAND_COPY_BUFFER 0x11F5
+#define CL_COMMAND_READ_IMAGE 0x11F6
+#define CL_COMMAND_WRITE_IMAGE 0x11F7
+#define CL_COMMAND_COPY_IMAGE 0x11F8
+#define CL_COMMAND_COPY_IMAGE_TO_BUFFER 0x11F9
+#define CL_COMMAND_COPY_BUFFER_TO_IMAGE 0x11FA
+#define CL_COMMAND_MAP_BUFFER 0x11FB
+#define CL_COMMAND_MAP_IMAGE 0x11FC
+#define CL_COMMAND_UNMAP_MEM_OBJECT 0x11FD
+#define CL_COMMAND_MARKER 0x11FE
+#define CL_COMMAND_ACQUIRE_GL_OBJECTS 0x11FF
+#define CL_COMMAND_RELEASE_GL_OBJECTS 0x1200
+#define CL_COMMAND_READ_BUFFER_RECT 0x1201
+#define CL_COMMAND_WRITE_BUFFER_RECT 0x1202
+#define CL_COMMAND_COPY_BUFFER_RECT 0x1203
+#define CL_COMMAND_USER 0x1204
/* command execution status */
-#define CL_COMPLETE 0x0
-#define CL_RUNNING 0x1
-#define CL_SUBMITTED 0x2
-#define CL_QUEUED 0x3
-
+#define CL_COMPLETE 0x0
+#define CL_RUNNING 0x1
+#define CL_SUBMITTED 0x2
+#define CL_QUEUED 0x3
+
/* cl_buffer_create_type */
-#define CL_BUFFER_CREATE_TYPE_REGION 0x1220
+#define CL_BUFFER_CREATE_TYPE_REGION 0x1220
/* cl_profiling_info */
-#define CL_PROFILING_COMMAND_QUEUED 0x1280
-#define CL_PROFILING_COMMAND_SUBMIT 0x1281
-#define CL_PROFILING_COMMAND_START 0x1282
-#define CL_PROFILING_COMMAND_END 0x1283
-
-/********************************************************************************************************/
-
-/********************************************************************************************************/
-
-/* Function signature typedef's */
-
-/* Platform API */
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLGETPLATFORMIDS)(cl_uint /* num_entries */,
- cl_platform_id * /* platforms */,
- cl_uint * /* num_platforms */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLGETPLATFORMINFO)(cl_platform_id /* platform */,
- cl_platform_info /* param_name */,
- size_t /* param_value_size */,
- void * /* param_value */,
- size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-/* Device APIs */
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLGETDEVICEIDS)(cl_platform_id /* platform */,
- cl_device_type /* device_type */,
- cl_uint /* num_entries */,
- cl_device_id * /* devices */,
- cl_uint * /* num_devices */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLGETDEVICEINFO)(cl_device_id /* device */,
- cl_device_info /* param_name */,
- size_t /* param_value_size */,
- void * /* param_value */,
- size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-// Context APIs
-typedef CL_API_ENTRY cl_context (CL_API_CALL *
-PFNCLCREATECONTEXT)(const cl_context_properties * /* properties */,
- cl_uint /* num_devices */,
- const cl_device_id * /* devices */,
- void (CL_CALLBACK * /* pfn_notify */)(const char *, const void *, size_t, void *),
- void * /* user_data */,
- cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_context (CL_API_CALL *
-PFNCLCREATECONTEXTFROMTYPE)(const cl_context_properties * /* properties */,
- cl_device_type /* device_type */,
- void (CL_CALLBACK * /* pfn_notify*/ )(const char *, const void *, size_t, void *),
- void * /* user_data */,
- cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLRETAINCONTEXT)(cl_context /* context */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLRELEASECONTEXT)(cl_context /* context */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLGETCONTEXTINFO)(cl_context /* context */,
- cl_context_info /* param_name */,
- size_t /* param_value_size */,
- void * /* param_value */,
- size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-/* Command Queue APIs */
-typedef CL_API_ENTRY cl_command_queue (CL_API_CALL *
-PFNCLCREATECOMMANDQUEUE)(cl_context /* context */,
- cl_device_id /* device */,
- cl_command_queue_properties /* properties */,
- cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLRETAINCOMMANDQUEUE)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLRELEASECOMMANDQUEUE)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLGETCOMMANDQUEUEINFO)(cl_command_queue /* command_queue */,
- cl_command_queue_info /* param_name */,
- size_t /* param_value_size */,
- void * /* param_value */,
- size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLSETCOMMANDQUEUEPROPERTY)(cl_command_queue /* command_queue */,
- cl_command_queue_properties /* properties */,
- cl_bool /* enable */,
- cl_command_queue_properties * /* old_properties */) CL_API_SUFFIX__VERSION_1_0;
-
-/* Memory Object APIs */
-typedef CL_API_ENTRY cl_mem (CL_API_CALL *
-PFNCLCREATEBUFFER)(cl_context /* context */,
- cl_mem_flags /* flags */,
- size_t /* size */,
- void * /* host_ptr */,
- cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_mem (CL_API_CALL *
-PFNCLCREATESUBBUFFER)(cl_mem /* buffer */,
- cl_mem_flags /* flags */,
- cl_buffer_create_type /* buffer_create_type */,
- const void * /* buffer_create_info */,
- cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_1;
-
-typedef CL_API_ENTRY cl_mem (CL_API_CALL *
-PFNCLCREATEIMAGE2D)(cl_context /* context */,
- cl_mem_flags /* flags */,
- const cl_image_format * /* image_format */,
- size_t /* image_width */,
- size_t /* image_height */,
- size_t /* image_row_pitch */,
- void * /* host_ptr */,
- cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_mem (CL_API_CALL *
-PFNCLCREATEIMAGE3D)(cl_context /* context */,
- cl_mem_flags /* flags */,
- const cl_image_format * /* image_format */,
- size_t /* image_width */,
- size_t /* image_height */,
- size_t /* image_depth */,
- size_t /* image_row_pitch */,
- size_t /* image_slice_pitch */,
- void * /* host_ptr */,
- cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLRETAINMEMOBJECT)(cl_mem /* memobj */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLRELEASEMEMOBJECT)(cl_mem /* memobj */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLGETSUPPORTEDIMAGEFORMATS)(cl_context /* context */,
- cl_mem_flags /* flags */,
- cl_mem_object_type /* image_type */,
- cl_uint /* num_entries */,
- cl_image_format * /* image_formats */,
- cl_uint * /* num_image_formats */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLGETMEMOBJECTINFO)(cl_mem /* memobj */,
- cl_mem_info /* param_name */,
- size_t /* param_value_size */,
- void * /* param_value */,
- size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLGETIMAGEINFO)(cl_mem /* image */,
- cl_image_info /* param_name */,
- size_t /* param_value_size */,
- void * /* param_value */,
- size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLSETMEMOBJECTDESTRUCTORCALLBACK)( cl_mem /* memobj */,
- void (CL_CALLBACK * /*pfn_notify*/)( cl_mem /* memobj */, void* /*user_data*/),
- void * /*user_data */ ) CL_API_SUFFIX__VERSION_1_1;
-
-/* Sampler APIs */
-typedef CL_API_ENTRY cl_sampler (CL_API_CALL *
-PFNCLCREATESAMPLER)(cl_context /* context */,
- cl_bool /* normalized_coords */,
- cl_addressing_mode /* addressing_mode */,
- cl_filter_mode /* filter_mode */,
- cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLRETAINSAMPLER)(cl_sampler /* sampler */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLRELEASESAMPLER)(cl_sampler /* sampler */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLGETSAMPLERINFO)(cl_sampler /* sampler */,
- cl_sampler_info /* param_name */,
- size_t /* param_value_size */,
- void * /* param_value */,
- size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-/* Program Object APIs */
-typedef CL_API_ENTRY cl_program (CL_API_CALL *
-PFNCLCREATEPROGRAMWITHSOURCE)(cl_context /* context */,
- cl_uint /* count */,
- const char ** /* strings */,
- const size_t * /* lengths */,
- cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_program (CL_API_CALL *
-PFNCLCREATEPROGRAMWITHBINARY)(cl_context /* context */,
- cl_uint /* num_devices */,
- const cl_device_id * /* device_list */,
- const size_t * /* lengths */,
- const unsigned char ** /* binaries */,
- cl_int * /* binary_status */,
- cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLRETAINPROGRAM)(cl_program /* program */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLRELEASEPROGRAM)(cl_program /* program */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLBUILDPROGRAM)(cl_program /* program */,
- cl_uint /* num_devices */,
- const cl_device_id * /* device_list */,
- const char * /* options */,
- void (CL_CALLBACK * /* pfn_notify */)(cl_program /* program */, void * /* user_data */),
- void * /* user_data */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLUNLOADCOMPILER)(void) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLGETPROGRAMINFO)(cl_program /* program */,
- cl_program_info /* param_name */,
- size_t /* param_value_size */,
- void * /* param_value */,
- size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLGETPROGRAMBUILDINFO)(cl_program /* program */,
- cl_device_id /* device */,
- cl_program_build_info /* param_name */,
- size_t /* param_value_size */,
- void * /* param_value */,
- size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-/* Kernel Object APIs */
-typedef CL_API_ENTRY cl_kernel (CL_API_CALL *
-PFNCLCREATEKERNEL)(cl_program /* program */,
- const char * /* kernel_name */,
- cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLCREATEKERNELSINPROGRAM)(cl_program /* program */,
- cl_uint /* num_kernels */,
- cl_kernel * /* kernels */,
- cl_uint * /* num_kernels_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLRETAINKERNEL)(cl_kernel /* kernel */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLRELEASEKERNEL)(cl_kernel /* kernel */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLSETKERNELARG)(cl_kernel /* kernel */,
- cl_uint /* arg_index */,
- size_t /* arg_size */,
- const void * /* arg_value */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLGETKERNELINFO)(cl_kernel /* kernel */,
- cl_kernel_info /* param_name */,
- size_t /* param_value_size */,
- void * /* param_value */,
- size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLGETKERNELWORKGROUPINFO)(cl_kernel /* kernel */,
- cl_device_id /* device */,
- cl_kernel_work_group_info /* param_name */,
- size_t /* param_value_size */,
- void * /* param_value */,
- size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-// Event Object APIs
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLWAITFOREVENTS)(cl_uint /* num_events */,
- const cl_event * /* event_list */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLGETEVENTINFO)(cl_event /* event */,
- cl_event_info /* param_name */,
- size_t /* param_value_size */,
- void * /* param_value */,
- size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_event (CL_API_CALL *
-PFNCLCREATEUSEREVENT)(cl_context /* context */,
- cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_1;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLRETAINEVENT)(cl_event /* event */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLRELEASEEVENT)(cl_event /* event */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLSETUSEREVENTSTATUS)(cl_event /* event */,
- cl_int /* execution_status */) CL_API_SUFFIX__VERSION_1_1;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLSETEVENTCALLBACK)( cl_event /* event */,
- cl_int /* command_exec_callback_type */,
- void (CL_CALLBACK * /* pfn_notify */)(cl_event, cl_int, void *),
- void * /* user_data */) CL_API_SUFFIX__VERSION_1_1;
-
-/* Profiling APIs */
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLGETEVENTPROFILINGINFO)(cl_event /* event */,
- cl_profiling_info /* param_name */,
- size_t /* param_value_size */,
- void * /* param_value */,
- size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-// Flush and Finish APIs
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLFLUSH)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLFINISH)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0;
-
-/* Enqueued Commands APIs */
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLENQUEUEREADBUFFER)(cl_command_queue /* command_queue */,
- cl_mem /* buffer */,
- cl_bool /* blocking_read */,
- size_t /* offset */,
- size_t /* cb */,
- void * /* ptr */,
- cl_uint /* num_events_in_wait_list */,
- const cl_event * /* event_wait_list */,
- cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLENQUEUEREADBUFFERRECT)(cl_command_queue /* command_queue */,
- cl_mem /* buffer */,
- cl_bool /* blocking_read */,
- const size_t * /* buffer_origin */,
- const size_t * /* host_origin */,
- const size_t * /* region */,
- size_t /* buffer_row_pitch */,
- size_t /* buffer_slice_pitch */,
- size_t /* host_row_pitch */,
- size_t /* host_slice_pitch */,
- void * /* ptr */,
- cl_uint /* num_events_in_wait_list */,
- const cl_event * /* event_wait_list */,
- cl_event * /* event */) CL_API_SUFFIX__VERSION_1_1;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLENQUEUEWRITEBUFFER)(cl_command_queue /* command_queue */,
- cl_mem /* buffer */,
- cl_bool /* blocking_write */,
- size_t /* offset */,
- size_t /* cb */,
- const void * /* ptr */,
- cl_uint /* num_events_in_wait_list */,
- const cl_event * /* event_wait_list */,
- cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLENQUEUEWRITEBUFFERRECT)(cl_command_queue /* command_queue */,
- cl_mem /* buffer */,
- cl_bool /* blocking_write */,
- const size_t * /* buffer_origin */,
- const size_t * /* host_origin */,
- const size_t * /* region */,
- size_t /* buffer_row_pitch */,
- size_t /* buffer_slice_pitch */,
- size_t /* host_row_pitch */,
- size_t /* host_slice_pitch */,
- const void * /* ptr */,
- cl_uint /* num_events_in_wait_list */,
- const cl_event * /* event_wait_list */,
- cl_event * /* event */) CL_API_SUFFIX__VERSION_1_1;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLENQUEUECOPYBUFFER)(cl_command_queue /* command_queue */,
- cl_mem /* src_buffer */,
- cl_mem /* dst_buffer */,
- size_t /* src_offset */,
- size_t /* dst_offset */,
- size_t /* cb */,
- cl_uint /* num_events_in_wait_list */,
- const cl_event * /* event_wait_list */,
- cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLENQUEUECOPYBUFFERRECT)(cl_command_queue /* command_queue */,
- cl_mem /* src_buffer */,
- cl_mem /* dst_buffer */,
- const size_t * /* src_origin */,
- const size_t * /* dst_origin */,
- const size_t * /* region */,
- size_t /* src_row_pitch */,
- size_t /* src_slice_pitch */,
- size_t /* dst_row_pitch */,
- size_t /* dst_slice_pitch */,
- cl_uint /* num_events_in_wait_list */,
- const cl_event * /* event_wait_list */,
- cl_event * /* event */) CL_API_SUFFIX__VERSION_1_1;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLENQUEUEREADIMAGE)(cl_command_queue /* command_queue */,
- cl_mem /* image */,
- cl_bool /* blocking_read */,
- const size_t * /* origin[3] */,
- const size_t * /* region[3] */,
- size_t /* row_pitch */,
- size_t /* slice_pitch */,
- void * /* ptr */,
- cl_uint /* num_events_in_wait_list */,
- const cl_event * /* event_wait_list */,
- cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLENQUEUEWRITEIMAGE)(cl_command_queue /* command_queue */,
- cl_mem /* image */,
- cl_bool /* blocking_write */,
- const size_t * /* origin[3] */,
- const size_t * /* region[3] */,
- size_t /* input_row_pitch */,
- size_t /* input_slice_pitch */,
- const void * /* ptr */,
- cl_uint /* num_events_in_wait_list */,
- const cl_event * /* event_wait_list */,
- cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLENQUEUECOPYIMAGE)(cl_command_queue /* command_queue */,
- cl_mem /* src_image */,
- cl_mem /* dst_image */,
- const size_t * /* src_origin[3] */,
- const size_t * /* dst_origin[3] */,
- const size_t * /* region[3] */,
- cl_uint /* num_events_in_wait_list */,
- const cl_event * /* event_wait_list */,
- cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLENQUEUECOPYIMAGETOBUFFER)(cl_command_queue /* command_queue */,
- cl_mem /* src_image */,
- cl_mem /* dst_buffer */,
- const size_t * /* src_origin[3] */,
- const size_t * /* region[3] */,
- size_t /* dst_offset */,
- cl_uint /* num_events_in_wait_list */,
- const cl_event * /* event_wait_list */,
- cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLENQUEUECOPYBUFFERTOIMAGE)(cl_command_queue /* command_queue */,
- cl_mem /* src_buffer */,
- cl_mem /* dst_image */,
- size_t /* src_offset */,
- const size_t * /* dst_origin[3] */,
- const size_t * /* region[3] */,
- cl_uint /* num_events_in_wait_list */,
- const cl_event * /* event_wait_list */,
- cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY void * (CL_API_CALL *
-PFNCLENQUEUEMAPBUFFER)(cl_command_queue /* command_queue */,
- cl_mem /* buffer */,
- cl_bool /* blocking_map */,
- cl_map_flags /* map_flags */,
- size_t /* offset */,
- size_t /* cb */,
- cl_uint /* num_events_in_wait_list */,
- const cl_event * /* event_wait_list */,
- cl_event * /* event */,
- cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY void * (CL_API_CALL *
-PFNCLENQUEUEMAPIMAGE)(cl_command_queue /* command_queue */,
- cl_mem /* image */,
- cl_bool /* blocking_map */,
- cl_map_flags /* map_flags */,
- const size_t * /* origin[3] */,
- const size_t * /* region[3] */,
- size_t * /* image_row_pitch */,
- size_t * /* image_slice_pitch */,
- cl_uint /* num_events_in_wait_list */,
- const cl_event * /* event_wait_list */,
- cl_event * /* event */,
- cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLENQUEUEUNMAPMEMOBJECT)(cl_command_queue /* command_queue */,
- cl_mem /* memobj */,
- void * /* mapped_ptr */,
- cl_uint /* num_events_in_wait_list */,
- const cl_event * /* event_wait_list */,
- cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLENQUEUENDRANGEKERNEL)(cl_command_queue /* command_queue */,
- cl_kernel /* kernel */,
- cl_uint /* work_dim */,
- const size_t * /* global_work_offset */,
- const size_t * /* global_work_size */,
- const size_t * /* local_work_size */,
- cl_uint /* num_events_in_wait_list */,
- const cl_event * /* event_wait_list */,
- cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLENQUEUETASK)(cl_command_queue /* command_queue */,
- cl_kernel /* kernel */,
- cl_uint /* num_events_in_wait_list */,
- const cl_event * /* event_wait_list */,
- cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLENQUEUENATIVEKERNEL)(cl_command_queue /* command_queue */,
- void (*user_func)(void *),
- void * /* args */,
- size_t /* cb_args */,
- cl_uint /* num_mem_objects */,
- const cl_mem * /* mem_list */,
- const void ** /* args_mem_loc */,
- cl_uint /* num_events_in_wait_list */,
- const cl_event * /* event_wait_list */,
- cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLENQUEUEMARKER)(cl_command_queue /* command_queue */,
- cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLENQUEUEWAITFOREVENTS)(cl_command_queue /* command_queue */,
- cl_uint /* num_events */,
- const cl_event * /* event_list */) CL_API_SUFFIX__VERSION_1_0;
-
-typedef CL_API_ENTRY cl_int (CL_API_CALL *
-PFNCLENQUEUEBARRIER)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0;
-
-// Extension function access
-//
-// Returns the extension function address for the given function name,
-// or NULL if a valid function can not be found. The client must
-// check to make sure the address is not NULL, before using or
-// calling the returned function address.
-//
-typedef CL_API_ENTRY void * (CL_API_CALL * PFNCLGETEXTENSIONFUNCTIONADDRESS)(const char * /* func_name */) CL_API_SUFFIX__VERSION_1_0;
-
+#define CL_PROFILING_COMMAND_QUEUED 0x1280
+#define CL_PROFILING_COMMAND_SUBMIT 0x1281
+#define CL_PROFILING_COMMAND_START 0x1282
+#define CL_PROFILING_COMMAND_END 0x1283
+
+ /********************************************************************************************************/
+
+ /********************************************************************************************************/
+
+ /* Function signature typedef's */
+
+ /* Platform API */
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLGETPLATFORMIDS)(cl_uint /* num_entries */,
+ cl_platform_id * /* platforms */,
+ cl_uint * /* num_platforms */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLGETPLATFORMINFO)(cl_platform_id /* platform */,
+ cl_platform_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+ /* Device APIs */
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLGETDEVICEIDS)(cl_platform_id /* platform */,
+ cl_device_type /* device_type */,
+ cl_uint /* num_entries */,
+ cl_device_id * /* devices */,
+ cl_uint * /* num_devices */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLGETDEVICEINFO)(cl_device_id /* device */,
+ cl_device_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+ // Context APIs
+ typedef CL_API_ENTRY cl_context(CL_API_CALL *
+ PFNCLCREATECONTEXT)(const cl_context_properties * /* properties */,
+ cl_uint /* num_devices */,
+ const cl_device_id * /* devices */,
+ void(CL_CALLBACK * /* pfn_notify */)(const char *, const void *, size_t, void *),
+ void * /* user_data */,
+ cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_context(CL_API_CALL *
+ PFNCLCREATECONTEXTFROMTYPE)(const cl_context_properties * /* properties */,
+ cl_device_type /* device_type */,
+ void(CL_CALLBACK * /* pfn_notify*/)(const char *, const void *, size_t, void *),
+ void * /* user_data */,
+ cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLRETAINCONTEXT)(cl_context /* context */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLRELEASECONTEXT)(cl_context /* context */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLGETCONTEXTINFO)(cl_context /* context */,
+ cl_context_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+ /* Command Queue APIs */
+ typedef CL_API_ENTRY cl_command_queue(CL_API_CALL *
+ PFNCLCREATECOMMANDQUEUE)(cl_context /* context */,
+ cl_device_id /* device */,
+ cl_command_queue_properties /* properties */,
+ cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLRETAINCOMMANDQUEUE)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLRELEASECOMMANDQUEUE)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLGETCOMMANDQUEUEINFO)(cl_command_queue /* command_queue */,
+ cl_command_queue_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLSETCOMMANDQUEUEPROPERTY)(cl_command_queue /* command_queue */,
+ cl_command_queue_properties /* properties */,
+ cl_bool /* enable */,
+ cl_command_queue_properties * /* old_properties */) CL_API_SUFFIX__VERSION_1_0;
+
+ /* Memory Object APIs */
+ typedef CL_API_ENTRY cl_mem(CL_API_CALL *
+ PFNCLCREATEBUFFER)(cl_context /* context */,
+ cl_mem_flags /* flags */,
+ size_t /* size */,
+ void * /* host_ptr */,
+ cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_mem(CL_API_CALL *
+ PFNCLCREATESUBBUFFER)(cl_mem /* buffer */,
+ cl_mem_flags /* flags */,
+ cl_buffer_create_type /* buffer_create_type */,
+ const void * /* buffer_create_info */,
+ cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_1;
+
+ typedef CL_API_ENTRY cl_mem(CL_API_CALL *
+ PFNCLCREATEIMAGE2D)(cl_context /* context */,
+ cl_mem_flags /* flags */,
+ const cl_image_format * /* image_format */,
+ size_t /* image_width */,
+ size_t /* image_height */,
+ size_t /* image_row_pitch */,
+ void * /* host_ptr */,
+ cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_mem(CL_API_CALL *
+ PFNCLCREATEIMAGE3D)(cl_context /* context */,
+ cl_mem_flags /* flags */,
+ const cl_image_format * /* image_format */,
+ size_t /* image_width */,
+ size_t /* image_height */,
+ size_t /* image_depth */,
+ size_t /* image_row_pitch */,
+ size_t /* image_slice_pitch */,
+ void * /* host_ptr */,
+ cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLRETAINMEMOBJECT)(cl_mem /* memobj */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLRELEASEMEMOBJECT)(cl_mem /* memobj */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLGETSUPPORTEDIMAGEFORMATS)(cl_context /* context */,
+ cl_mem_flags /* flags */,
+ cl_mem_object_type /* image_type */,
+ cl_uint /* num_entries */,
+ cl_image_format * /* image_formats */,
+ cl_uint * /* num_image_formats */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLGETMEMOBJECTINFO)(cl_mem /* memobj */,
+ cl_mem_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLGETIMAGEINFO)(cl_mem /* image */,
+ cl_image_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLSETMEMOBJECTDESTRUCTORCALLBACK)(cl_mem /* memobj */,
+ void(CL_CALLBACK * /*pfn_notify*/)(cl_mem /* memobj */, void * /*user_data*/),
+ void * /*user_data */) CL_API_SUFFIX__VERSION_1_1;
+
+ /* Sampler APIs */
+ typedef CL_API_ENTRY cl_sampler(CL_API_CALL *
+ PFNCLCREATESAMPLER)(cl_context /* context */,
+ cl_bool /* normalized_coords */,
+ cl_addressing_mode /* addressing_mode */,
+ cl_filter_mode /* filter_mode */,
+ cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLRETAINSAMPLER)(cl_sampler /* sampler */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLRELEASESAMPLER)(cl_sampler /* sampler */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLGETSAMPLERINFO)(cl_sampler /* sampler */,
+ cl_sampler_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+ /* Program Object APIs */
+ typedef CL_API_ENTRY cl_program(CL_API_CALL *
+ PFNCLCREATEPROGRAMWITHSOURCE)(cl_context /* context */,
+ cl_uint /* count */,
+ const char ** /* strings */,
+ const size_t * /* lengths */,
+ cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_program(CL_API_CALL *
+ PFNCLCREATEPROGRAMWITHBINARY)(cl_context /* context */,
+ cl_uint /* num_devices */,
+ const cl_device_id * /* device_list */,
+ const size_t * /* lengths */,
+ const unsigned char ** /* binaries */,
+ cl_int * /* binary_status */,
+ cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLRETAINPROGRAM)(cl_program /* program */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLRELEASEPROGRAM)(cl_program /* program */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLBUILDPROGRAM)(cl_program /* program */,
+ cl_uint /* num_devices */,
+ const cl_device_id * /* device_list */,
+ const char * /* options */,
+ void(CL_CALLBACK * /* pfn_notify */)(cl_program /* program */, void * /* user_data */),
+ void * /* user_data */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLUNLOADCOMPILER)(void) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLGETPROGRAMINFO)(cl_program /* program */,
+ cl_program_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLGETPROGRAMBUILDINFO)(cl_program /* program */,
+ cl_device_id /* device */,
+ cl_program_build_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+ /* Kernel Object APIs */
+ typedef CL_API_ENTRY cl_kernel(CL_API_CALL *
+ PFNCLCREATEKERNEL)(cl_program /* program */,
+ const char * /* kernel_name */,
+ cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLCREATEKERNELSINPROGRAM)(cl_program /* program */,
+ cl_uint /* num_kernels */,
+ cl_kernel * /* kernels */,
+ cl_uint * /* num_kernels_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLRETAINKERNEL)(cl_kernel /* kernel */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLRELEASEKERNEL)(cl_kernel /* kernel */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLSETKERNELARG)(cl_kernel /* kernel */,
+ cl_uint /* arg_index */,
+ size_t /* arg_size */,
+ const void * /* arg_value */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLGETKERNELINFO)(cl_kernel /* kernel */,
+ cl_kernel_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLGETKERNELWORKGROUPINFO)(cl_kernel /* kernel */,
+ cl_device_id /* device */,
+ cl_kernel_work_group_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+ // Event Object APIs
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLWAITFOREVENTS)(cl_uint /* num_events */,
+ const cl_event * /* event_list */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLGETEVENTINFO)(cl_event /* event */,
+ cl_event_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_event(CL_API_CALL *
+ PFNCLCREATEUSEREVENT)(cl_context /* context */,
+ cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_1;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLRETAINEVENT)(cl_event /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLRELEASEEVENT)(cl_event /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLSETUSEREVENTSTATUS)(cl_event /* event */,
+ cl_int /* execution_status */) CL_API_SUFFIX__VERSION_1_1;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLSETEVENTCALLBACK)(cl_event /* event */,
+ cl_int /* command_exec_callback_type */,
+ void(CL_CALLBACK * /* pfn_notify */)(cl_event, cl_int, void *),
+ void * /* user_data */) CL_API_SUFFIX__VERSION_1_1;
+
+ /* Profiling APIs */
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLGETEVENTPROFILINGINFO)(cl_event /* event */,
+ cl_profiling_info /* param_name */,
+ size_t /* param_value_size */,
+ void * /* param_value */,
+ size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
+
+ // Flush and Finish APIs
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLFLUSH)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLFINISH)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0;
+
+ /* Enqueued Commands APIs */
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLENQUEUEREADBUFFER)(cl_command_queue /* command_queue */,
+ cl_mem /* buffer */,
+ cl_bool /* blocking_read */,
+ size_t /* offset */,
+ size_t /* cb */,
+ void * /* ptr */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLENQUEUEREADBUFFERRECT)(cl_command_queue /* command_queue */,
+ cl_mem /* buffer */,
+ cl_bool /* blocking_read */,
+ const size_t * /* buffer_origin */,
+ const size_t * /* host_origin */,
+ const size_t * /* region */,
+ size_t /* buffer_row_pitch */,
+ size_t /* buffer_slice_pitch */,
+ size_t /* host_row_pitch */,
+ size_t /* host_slice_pitch */,
+ void * /* ptr */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_1;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLENQUEUEWRITEBUFFER)(cl_command_queue /* command_queue */,
+ cl_mem /* buffer */,
+ cl_bool /* blocking_write */,
+ size_t /* offset */,
+ size_t /* cb */,
+ const void * /* ptr */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLENQUEUEWRITEBUFFERRECT)(cl_command_queue /* command_queue */,
+ cl_mem /* buffer */,
+ cl_bool /* blocking_write */,
+ const size_t * /* buffer_origin */,
+ const size_t * /* host_origin */,
+ const size_t * /* region */,
+ size_t /* buffer_row_pitch */,
+ size_t /* buffer_slice_pitch */,
+ size_t /* host_row_pitch */,
+ size_t /* host_slice_pitch */,
+ const void * /* ptr */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_1;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLENQUEUECOPYBUFFER)(cl_command_queue /* command_queue */,
+ cl_mem /* src_buffer */,
+ cl_mem /* dst_buffer */,
+ size_t /* src_offset */,
+ size_t /* dst_offset */,
+ size_t /* cb */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLENQUEUECOPYBUFFERRECT)(cl_command_queue /* command_queue */,
+ cl_mem /* src_buffer */,
+ cl_mem /* dst_buffer */,
+ const size_t * /* src_origin */,
+ const size_t * /* dst_origin */,
+ const size_t * /* region */,
+ size_t /* src_row_pitch */,
+ size_t /* src_slice_pitch */,
+ size_t /* dst_row_pitch */,
+ size_t /* dst_slice_pitch */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_1;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLENQUEUEREADIMAGE)(cl_command_queue /* command_queue */,
+ cl_mem /* image */,
+ cl_bool /* blocking_read */,
+ const size_t * /* origin[3] */,
+ const size_t * /* region[3] */,
+ size_t /* row_pitch */,
+ size_t /* slice_pitch */,
+ void * /* ptr */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLENQUEUEWRITEIMAGE)(cl_command_queue /* command_queue */,
+ cl_mem /* image */,
+ cl_bool /* blocking_write */,
+ const size_t * /* origin[3] */,
+ const size_t * /* region[3] */,
+ size_t /* input_row_pitch */,
+ size_t /* input_slice_pitch */,
+ const void * /* ptr */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLENQUEUECOPYIMAGE)(cl_command_queue /* command_queue */,
+ cl_mem /* src_image */,
+ cl_mem /* dst_image */,
+ const size_t * /* src_origin[3] */,
+ const size_t * /* dst_origin[3] */,
+ const size_t * /* region[3] */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLENQUEUECOPYIMAGETOBUFFER)(cl_command_queue /* command_queue */,
+ cl_mem /* src_image */,
+ cl_mem /* dst_buffer */,
+ const size_t * /* src_origin[3] */,
+ const size_t * /* region[3] */,
+ size_t /* dst_offset */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLENQUEUECOPYBUFFERTOIMAGE)(cl_command_queue /* command_queue */,
+ cl_mem /* src_buffer */,
+ cl_mem /* dst_image */,
+ size_t /* src_offset */,
+ const size_t * /* dst_origin[3] */,
+ const size_t * /* region[3] */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY void *(CL_API_CALL *
+ PFNCLENQUEUEMAPBUFFER)(cl_command_queue /* command_queue */,
+ cl_mem /* buffer */,
+ cl_bool /* blocking_map */,
+ cl_map_flags /* map_flags */,
+ size_t /* offset */,
+ size_t /* cb */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */,
+ cl_int * /* errcode_ret */)CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY void *(CL_API_CALL *
+ PFNCLENQUEUEMAPIMAGE)(cl_command_queue /* command_queue */,
+ cl_mem /* image */,
+ cl_bool /* blocking_map */,
+ cl_map_flags /* map_flags */,
+ const size_t * /* origin[3] */,
+ const size_t * /* region[3] */,
+ size_t * /* image_row_pitch */,
+ size_t * /* image_slice_pitch */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */,
+ cl_int * /* errcode_ret */)CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLENQUEUEUNMAPMEMOBJECT)(cl_command_queue /* command_queue */,
+ cl_mem /* memobj */,
+ void * /* mapped_ptr */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLENQUEUENDRANGEKERNEL)(cl_command_queue /* command_queue */,
+ cl_kernel /* kernel */,
+ cl_uint /* work_dim */,
+ const size_t * /* global_work_offset */,
+ const size_t * /* global_work_size */,
+ const size_t * /* local_work_size */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLENQUEUETASK)(cl_command_queue /* command_queue */,
+ cl_kernel /* kernel */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLENQUEUENATIVEKERNEL)(cl_command_queue /* command_queue */,
+ void (*user_func)(void *),
+ void * /* args */,
+ size_t /* cb_args */,
+ cl_uint /* num_mem_objects */,
+ const cl_mem * /* mem_list */,
+ const void ** /* args_mem_loc */,
+ cl_uint /* num_events_in_wait_list */,
+ const cl_event * /* event_wait_list */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLENQUEUEMARKER)(cl_command_queue /* command_queue */,
+ cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLENQUEUEWAITFOREVENTS)(cl_command_queue /* command_queue */,
+ cl_uint /* num_events */,
+ const cl_event * /* event_list */) CL_API_SUFFIX__VERSION_1_0;
+
+ typedef CL_API_ENTRY cl_int(CL_API_CALL *
+ PFNCLENQUEUEBARRIER)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0;
+
+ // Extension function access
+ //
+ // Returns the extension function address for the given function name,
+ // or NULL if a valid function can not be found. The client must
+ // check to make sure the address is not NULL, before using or
+ // calling the returned function address.
+ //
+ typedef CL_API_ENTRY void *(CL_API_CALL *PFNCLGETEXTENSIONFUNCTIONADDRESS)(const char * /* func_name */)CL_API_SUFFIX__VERSION_1_0;
#define CLEW_STATIC
#ifdef CLEW_STATIC
-# define CLEWAPI extern
+#define CLEWAPI extern
+#else
+#ifdef CLEW_BUILD
+#define CLEWAPI extern __declspec(dllexport)
#else
-# ifdef CLEW_BUILD
-# define CLEWAPI extern __declspec(dllexport)
-# else
-# define CLEWAPI extern __declspec(dllimport)
-# endif
+#define CLEWAPI extern __declspec(dllimport)
+#endif
#endif
#if defined(_WIN32)
@@ -2208,99 +2522,97 @@ typedef CL_API_ENTRY void * (CL_API_CALL * PFNCLGETEXTENSIONFUNCTIONADDRESS)(con
#define CLEW_GET_FUN(x) x
-
-// Variables holding function entry points
-CLEW_FUN_EXPORT PFNCLGETPLATFORMIDS __clewGetPlatformIDs ;
-CLEW_FUN_EXPORT PFNCLGETPLATFORMINFO __clewGetPlatformInfo ;
-CLEW_FUN_EXPORT PFNCLGETDEVICEIDS __clewGetDeviceIDs ;
-CLEW_FUN_EXPORT PFNCLGETDEVICEINFO __clewGetDeviceInfo ;
-CLEW_FUN_EXPORT PFNCLCREATECONTEXT __clewCreateContext ;
-CLEW_FUN_EXPORT PFNCLCREATECONTEXTFROMTYPE __clewCreateContextFromType ;
-CLEW_FUN_EXPORT PFNCLRETAINCONTEXT __clewRetainContext ;
-CLEW_FUN_EXPORT PFNCLRELEASECONTEXT __clewReleaseContext ;
-CLEW_FUN_EXPORT PFNCLGETCONTEXTINFO __clewGetContextInfo ;
-CLEW_FUN_EXPORT PFNCLCREATECOMMANDQUEUE __clewCreateCommandQueue ;
-CLEW_FUN_EXPORT PFNCLRETAINCOMMANDQUEUE __clewRetainCommandQueue ;
-CLEW_FUN_EXPORT PFNCLRELEASECOMMANDQUEUE __clewReleaseCommandQueue ;
-CLEW_FUN_EXPORT PFNCLGETCOMMANDQUEUEINFO __clewGetCommandQueueInfo ;
+ // Variables holding function entry points
+ CLEW_FUN_EXPORT PFNCLGETPLATFORMIDS __clewGetPlatformIDs;
+ CLEW_FUN_EXPORT PFNCLGETPLATFORMINFO __clewGetPlatformInfo;
+ CLEW_FUN_EXPORT PFNCLGETDEVICEIDS __clewGetDeviceIDs;
+ CLEW_FUN_EXPORT PFNCLGETDEVICEINFO __clewGetDeviceInfo;
+ CLEW_FUN_EXPORT PFNCLCREATECONTEXT __clewCreateContext;
+ CLEW_FUN_EXPORT PFNCLCREATECONTEXTFROMTYPE __clewCreateContextFromType;
+ CLEW_FUN_EXPORT PFNCLRETAINCONTEXT __clewRetainContext;
+ CLEW_FUN_EXPORT PFNCLRELEASECONTEXT __clewReleaseContext;
+ CLEW_FUN_EXPORT PFNCLGETCONTEXTINFO __clewGetContextInfo;
+ CLEW_FUN_EXPORT PFNCLCREATECOMMANDQUEUE __clewCreateCommandQueue;
+ CLEW_FUN_EXPORT PFNCLRETAINCOMMANDQUEUE __clewRetainCommandQueue;
+ CLEW_FUN_EXPORT PFNCLRELEASECOMMANDQUEUE __clewReleaseCommandQueue;
+ CLEW_FUN_EXPORT PFNCLGETCOMMANDQUEUEINFO __clewGetCommandQueueInfo;
#ifdef CL_USE_DEPRECATED_OPENCL_1_0_APIS
-CLEW_FUN_EXPORT PFNCLSETCOMMANDQUEUEPROPERTY __clewSetCommandQueueProperty ;
-#endif
-CLEW_FUN_EXPORT PFNCLCREATEBUFFER __clewCreateBuffer ;
-CLEW_FUN_EXPORT PFNCLCREATESUBBUFFER __clewCreateSubBuffer ;
-CLEW_FUN_EXPORT PFNCLCREATEIMAGE2D __clewCreateImage2D ;
-CLEW_FUN_EXPORT PFNCLCREATEIMAGE3D __clewCreateImage3D ;
-CLEW_FUN_EXPORT PFNCLRETAINMEMOBJECT __clewRetainMemObject ;
-CLEW_FUN_EXPORT PFNCLRELEASEMEMOBJECT __clewReleaseMemObject ;
-CLEW_FUN_EXPORT PFNCLGETSUPPORTEDIMAGEFORMATS __clewGetSupportedImageFormats ;
-CLEW_FUN_EXPORT PFNCLGETMEMOBJECTINFO __clewGetMemObjectInfo ;
-CLEW_FUN_EXPORT PFNCLGETIMAGEINFO __clewGetImageInfo ;
-CLEW_FUN_EXPORT PFNCLSETMEMOBJECTDESTRUCTORCALLBACK __clewSetMemObjectDestructorCallback;
-CLEW_FUN_EXPORT PFNCLCREATESAMPLER __clewCreateSampler ;
-CLEW_FUN_EXPORT PFNCLRETAINSAMPLER __clewRetainSampler ;
-CLEW_FUN_EXPORT PFNCLRELEASESAMPLER __clewReleaseSampler ;
-CLEW_FUN_EXPORT PFNCLGETSAMPLERINFO __clewGetSamplerInfo ;
-CLEW_FUN_EXPORT PFNCLCREATEPROGRAMWITHSOURCE __clewCreateProgramWithSource ;
-CLEW_FUN_EXPORT PFNCLCREATEPROGRAMWITHBINARY __clewCreateProgramWithBinary ;
-CLEW_FUN_EXPORT PFNCLRETAINPROGRAM __clewRetainProgram ;
-CLEW_FUN_EXPORT PFNCLRELEASEPROGRAM __clewReleaseProgram ;
-CLEW_FUN_EXPORT PFNCLBUILDPROGRAM __clewBuildProgram ;
-CLEW_FUN_EXPORT PFNCLUNLOADCOMPILER __clewUnloadCompiler ;
-CLEW_FUN_EXPORT PFNCLGETPROGRAMINFO __clewGetProgramInfo ;
-CLEW_FUN_EXPORT PFNCLGETPROGRAMBUILDINFO __clewGetProgramBuildInfo ;
-CLEW_FUN_EXPORT PFNCLCREATEKERNEL __clewCreateKernel ;
-CLEW_FUN_EXPORT PFNCLCREATEKERNELSINPROGRAM __clewCreateKernelsInProgram ;
-CLEW_FUN_EXPORT PFNCLRETAINKERNEL __clewRetainKernel ;
-CLEW_FUN_EXPORT PFNCLRELEASEKERNEL __clewReleaseKernel ;
-CLEW_FUN_EXPORT PFNCLSETKERNELARG __clewSetKernelArg ;
-CLEW_FUN_EXPORT PFNCLGETKERNELINFO __clewGetKernelInfo ;
-CLEW_FUN_EXPORT PFNCLGETKERNELWORKGROUPINFO __clewGetKernelWorkGroupInfo ;
-CLEW_FUN_EXPORT PFNCLWAITFOREVENTS __clewWaitForEvents ;
-CLEW_FUN_EXPORT PFNCLGETEVENTINFO __clewGetEventInfo ;
-CLEW_FUN_EXPORT PFNCLCREATEUSEREVENT __clewCreateUserEvent ;
-CLEW_FUN_EXPORT PFNCLRETAINEVENT __clewRetainEvent ;
-CLEW_FUN_EXPORT PFNCLRELEASEEVENT __clewReleaseEvent ;
-CLEW_FUN_EXPORT PFNCLSETUSEREVENTSTATUS __clewSetUserEventStatus ;
-CLEW_FUN_EXPORT PFNCLSETEVENTCALLBACK __clewSetEventCallback ;
-CLEW_FUN_EXPORT PFNCLGETEVENTPROFILINGINFO __clewGetEventProfilingInfo ;
-CLEW_FUN_EXPORT PFNCLFLUSH __clewFlush ;
-CLEW_FUN_EXPORT PFNCLFINISH __clewFinish ;
-CLEW_FUN_EXPORT PFNCLENQUEUEREADBUFFER __clewEnqueueReadBuffer ;
-CLEW_FUN_EXPORT PFNCLENQUEUEREADBUFFERRECT __clewEnqueueReadBufferRect ;
-CLEW_FUN_EXPORT PFNCLENQUEUEWRITEBUFFER __clewEnqueueWriteBuffer ;
-CLEW_FUN_EXPORT PFNCLENQUEUEWRITEBUFFERRECT __clewEnqueueWriteBufferRect ;
-CLEW_FUN_EXPORT PFNCLENQUEUECOPYBUFFER __clewEnqueueCopyBuffer ;
-CLEW_FUN_EXPORT PFNCLENQUEUECOPYBUFFERRECT __clewEnqueueCopyBufferRect ;
-CLEW_FUN_EXPORT PFNCLENQUEUEREADIMAGE __clewEnqueueReadImage ;
-CLEW_FUN_EXPORT PFNCLENQUEUEWRITEIMAGE __clewEnqueueWriteImage ;
-CLEW_FUN_EXPORT PFNCLENQUEUECOPYIMAGE __clewEnqueueCopyImage ;
-CLEW_FUN_EXPORT PFNCLENQUEUECOPYIMAGETOBUFFER __clewEnqueueCopyImageToBuffer ;
-CLEW_FUN_EXPORT PFNCLENQUEUECOPYBUFFERTOIMAGE __clewEnqueueCopyBufferToImage ;
-CLEW_FUN_EXPORT PFNCLENQUEUEMAPBUFFER __clewEnqueueMapBuffer ;
-CLEW_FUN_EXPORT PFNCLENQUEUEMAPIMAGE __clewEnqueueMapImage ;
-CLEW_FUN_EXPORT PFNCLENQUEUEUNMAPMEMOBJECT __clewEnqueueUnmapMemObject ;
-CLEW_FUN_EXPORT PFNCLENQUEUENDRANGEKERNEL __clewEnqueueNDRangeKernel ;
-CLEW_FUN_EXPORT PFNCLENQUEUETASK __clewEnqueueTask ;
-CLEW_FUN_EXPORT PFNCLENQUEUENATIVEKERNEL __clewEnqueueNativeKernel ;
-CLEW_FUN_EXPORT PFNCLENQUEUEMARKER __clewEnqueueMarker ;
-CLEW_FUN_EXPORT PFNCLENQUEUEWAITFOREVENTS __clewEnqueueWaitForEvents ;
-CLEW_FUN_EXPORT PFNCLENQUEUEBARRIER __clewEnqueueBarrier ;
-CLEW_FUN_EXPORT PFNCLGETEXTENSIONFUNCTIONADDRESS __clewGetExtensionFunctionAddress ;
-
-
-#define clGetPlatformIDs CLEW_GET_FUN(__clewGetPlatformIDs )
-#define clGetPlatformInfo CLEW_GET_FUN(__clewGetPlatformInfo )
-#define clGetDeviceIDs CLEW_GET_FUN(__clewGetDeviceIDs )
-#define clGetDeviceInfo CLEW_GET_FUN(__clewGetDeviceInfo )
-#define clCreateContext CLEW_GET_FUN(__clewCreateContext )
-#define clCreateContextFromType CLEW_GET_FUN(__clewCreateContextFromType )
-#define clRetainContext CLEW_GET_FUN(__clewRetainContext )
-#define clReleaseContext CLEW_GET_FUN(__clewReleaseContext )
-#define clGetContextInfo CLEW_GET_FUN(__clewGetContextInfo )
-#define clCreateCommandQueue CLEW_GET_FUN(__clewCreateCommandQueue )
-#define clRetainCommandQueue CLEW_GET_FUN(__clewRetainCommandQueue )
-#define clReleaseCommandQueue CLEW_GET_FUN(__clewReleaseCommandQueue )
-#define clGetCommandQueueInfo CLEW_GET_FUN(__clewGetCommandQueueInfo )
+ CLEW_FUN_EXPORT PFNCLSETCOMMANDQUEUEPROPERTY __clewSetCommandQueueProperty;
+#endif
+ CLEW_FUN_EXPORT PFNCLCREATEBUFFER __clewCreateBuffer;
+ CLEW_FUN_EXPORT PFNCLCREATESUBBUFFER __clewCreateSubBuffer;
+ CLEW_FUN_EXPORT PFNCLCREATEIMAGE2D __clewCreateImage2D;
+ CLEW_FUN_EXPORT PFNCLCREATEIMAGE3D __clewCreateImage3D;
+ CLEW_FUN_EXPORT PFNCLRETAINMEMOBJECT __clewRetainMemObject;
+ CLEW_FUN_EXPORT PFNCLRELEASEMEMOBJECT __clewReleaseMemObject;
+ CLEW_FUN_EXPORT PFNCLGETSUPPORTEDIMAGEFORMATS __clewGetSupportedImageFormats;
+ CLEW_FUN_EXPORT PFNCLGETMEMOBJECTINFO __clewGetMemObjectInfo;
+ CLEW_FUN_EXPORT PFNCLGETIMAGEINFO __clewGetImageInfo;
+ CLEW_FUN_EXPORT PFNCLSETMEMOBJECTDESTRUCTORCALLBACK __clewSetMemObjectDestructorCallback;
+ CLEW_FUN_EXPORT PFNCLCREATESAMPLER __clewCreateSampler;
+ CLEW_FUN_EXPORT PFNCLRETAINSAMPLER __clewRetainSampler;
+ CLEW_FUN_EXPORT PFNCLRELEASESAMPLER __clewReleaseSampler;
+ CLEW_FUN_EXPORT PFNCLGETSAMPLERINFO __clewGetSamplerInfo;
+ CLEW_FUN_EXPORT PFNCLCREATEPROGRAMWITHSOURCE __clewCreateProgramWithSource;
+ CLEW_FUN_EXPORT PFNCLCREATEPROGRAMWITHBINARY __clewCreateProgramWithBinary;
+ CLEW_FUN_EXPORT PFNCLRETAINPROGRAM __clewRetainProgram;
+ CLEW_FUN_EXPORT PFNCLRELEASEPROGRAM __clewReleaseProgram;
+ CLEW_FUN_EXPORT PFNCLBUILDPROGRAM __clewBuildProgram;
+ CLEW_FUN_EXPORT PFNCLUNLOADCOMPILER __clewUnloadCompiler;
+ CLEW_FUN_EXPORT PFNCLGETPROGRAMINFO __clewGetProgramInfo;
+ CLEW_FUN_EXPORT PFNCLGETPROGRAMBUILDINFO __clewGetProgramBuildInfo;
+ CLEW_FUN_EXPORT PFNCLCREATEKERNEL __clewCreateKernel;
+ CLEW_FUN_EXPORT PFNCLCREATEKERNELSINPROGRAM __clewCreateKernelsInProgram;
+ CLEW_FUN_EXPORT PFNCLRETAINKERNEL __clewRetainKernel;
+ CLEW_FUN_EXPORT PFNCLRELEASEKERNEL __clewReleaseKernel;
+ CLEW_FUN_EXPORT PFNCLSETKERNELARG __clewSetKernelArg;
+ CLEW_FUN_EXPORT PFNCLGETKERNELINFO __clewGetKernelInfo;
+ CLEW_FUN_EXPORT PFNCLGETKERNELWORKGROUPINFO __clewGetKernelWorkGroupInfo;
+ CLEW_FUN_EXPORT PFNCLWAITFOREVENTS __clewWaitForEvents;
+ CLEW_FUN_EXPORT PFNCLGETEVENTINFO __clewGetEventInfo;
+ CLEW_FUN_EXPORT PFNCLCREATEUSEREVENT __clewCreateUserEvent;
+ CLEW_FUN_EXPORT PFNCLRETAINEVENT __clewRetainEvent;
+ CLEW_FUN_EXPORT PFNCLRELEASEEVENT __clewReleaseEvent;
+ CLEW_FUN_EXPORT PFNCLSETUSEREVENTSTATUS __clewSetUserEventStatus;
+ CLEW_FUN_EXPORT PFNCLSETEVENTCALLBACK __clewSetEventCallback;
+ CLEW_FUN_EXPORT PFNCLGETEVENTPROFILINGINFO __clewGetEventProfilingInfo;
+ CLEW_FUN_EXPORT PFNCLFLUSH __clewFlush;
+ CLEW_FUN_EXPORT PFNCLFINISH __clewFinish;
+ CLEW_FUN_EXPORT PFNCLENQUEUEREADBUFFER __clewEnqueueReadBuffer;
+ CLEW_FUN_EXPORT PFNCLENQUEUEREADBUFFERRECT __clewEnqueueReadBufferRect;
+ CLEW_FUN_EXPORT PFNCLENQUEUEWRITEBUFFER __clewEnqueueWriteBuffer;
+ CLEW_FUN_EXPORT PFNCLENQUEUEWRITEBUFFERRECT __clewEnqueueWriteBufferRect;
+ CLEW_FUN_EXPORT PFNCLENQUEUECOPYBUFFER __clewEnqueueCopyBuffer;
+ CLEW_FUN_EXPORT PFNCLENQUEUECOPYBUFFERRECT __clewEnqueueCopyBufferRect;
+ CLEW_FUN_EXPORT PFNCLENQUEUEREADIMAGE __clewEnqueueReadImage;
+ CLEW_FUN_EXPORT PFNCLENQUEUEWRITEIMAGE __clewEnqueueWriteImage;
+ CLEW_FUN_EXPORT PFNCLENQUEUECOPYIMAGE __clewEnqueueCopyImage;
+ CLEW_FUN_EXPORT PFNCLENQUEUECOPYIMAGETOBUFFER __clewEnqueueCopyImageToBuffer;
+ CLEW_FUN_EXPORT PFNCLENQUEUECOPYBUFFERTOIMAGE __clewEnqueueCopyBufferToImage;
+ CLEW_FUN_EXPORT PFNCLENQUEUEMAPBUFFER __clewEnqueueMapBuffer;
+ CLEW_FUN_EXPORT PFNCLENQUEUEMAPIMAGE __clewEnqueueMapImage;
+ CLEW_FUN_EXPORT PFNCLENQUEUEUNMAPMEMOBJECT __clewEnqueueUnmapMemObject;
+ CLEW_FUN_EXPORT PFNCLENQUEUENDRANGEKERNEL __clewEnqueueNDRangeKernel;
+ CLEW_FUN_EXPORT PFNCLENQUEUETASK __clewEnqueueTask;
+ CLEW_FUN_EXPORT PFNCLENQUEUENATIVEKERNEL __clewEnqueueNativeKernel;
+ CLEW_FUN_EXPORT PFNCLENQUEUEMARKER __clewEnqueueMarker;
+ CLEW_FUN_EXPORT PFNCLENQUEUEWAITFOREVENTS __clewEnqueueWaitForEvents;
+ CLEW_FUN_EXPORT PFNCLENQUEUEBARRIER __clewEnqueueBarrier;
+ CLEW_FUN_EXPORT PFNCLGETEXTENSIONFUNCTIONADDRESS __clewGetExtensionFunctionAddress;
+
+#define clGetPlatformIDs CLEW_GET_FUN(__clewGetPlatformIDs)
+#define clGetPlatformInfo CLEW_GET_FUN(__clewGetPlatformInfo)
+#define clGetDeviceIDs CLEW_GET_FUN(__clewGetDeviceIDs)
+#define clGetDeviceInfo CLEW_GET_FUN(__clewGetDeviceInfo)
+#define clCreateContext CLEW_GET_FUN(__clewCreateContext)
+#define clCreateContextFromType CLEW_GET_FUN(__clewCreateContextFromType)
+#define clRetainContext CLEW_GET_FUN(__clewRetainContext)
+#define clReleaseContext CLEW_GET_FUN(__clewReleaseContext)
+#define clGetContextInfo CLEW_GET_FUN(__clewGetContextInfo)
+#define clCreateCommandQueue CLEW_GET_FUN(__clewCreateCommandQueue)
+#define clRetainCommandQueue CLEW_GET_FUN(__clewRetainCommandQueue)
+#define clReleaseCommandQueue CLEW_GET_FUN(__clewReleaseCommandQueue)
+#define clGetCommandQueueInfo CLEW_GET_FUN(__clewGetCommandQueueInfo)
#ifdef CL_USE_DEPRECATED_OPENCL_1_0_APIS
#warning CL_USE_DEPRECATED_OPENCL_1_0_APIS is defined. These APIs are unsupported and untested in OpenCL 1.1!
/*
@@ -2313,82 +2625,81 @@ CLEW_FUN_EXPORT PFNCLGETEXTENSIONFUNCTIONADDRESS __clewGetExtensionFuncti
* Software developers previously relying on this API are instructed to set the command queue
* properties when creating the queue, instead.
*/
-#define clSetCommandQueueProperty CLEW_GET_FUN(__clewSetCommandQueueProperty )
+#define clSetCommandQueueProperty CLEW_GET_FUN(__clewSetCommandQueueProperty)
#endif /* CL_USE_DEPRECATED_OPENCL_1_0_APIS */
-#define clCreateBuffer CLEW_GET_FUN(__clewCreateBuffer )
-#define clCreateSubBuffer CLEW_GET_FUN(__clewCreateSubBuffer )
-#define clCreateImage2D CLEW_GET_FUN(__clewCreateImage2D )
-#define clCreateImage3D CLEW_GET_FUN(__clewCreateImage3D )
-#define clRetainMemObject CLEW_GET_FUN(__clewRetainMemObject )
-#define clReleaseMemObject CLEW_GET_FUN(__clewReleaseMemObject )
-#define clGetSupportedImageFormats CLEW_GET_FUN(__clewGetSupportedImageFormats )
-#define clGetMemObjectInfo CLEW_GET_FUN(__clewGetMemObjectInfo )
-#define clGetImageInfo CLEW_GET_FUN(__clewGetImageInfo )
-#define clSetMemObjectDestructorCallback CLEW_GET_FUN(__clewSetMemObjectDestructorCallback)
-#define clCreateSampler CLEW_GET_FUN(__clewCreateSampler )
-#define clRetainSampler CLEW_GET_FUN(__clewRetainSampler )
-#define clReleaseSampler CLEW_GET_FUN(__clewReleaseSampler )
-#define clGetSamplerInfo CLEW_GET_FUN(__clewGetSamplerInfo )
-#define clCreateProgramWithSource CLEW_GET_FUN(__clewCreateProgramWithSource )
-#define clCreateProgramWithBinary CLEW_GET_FUN(__clewCreateProgramWithBinary )
-#define clRetainProgram CLEW_GET_FUN(__clewRetainProgram )
-#define clReleaseProgram CLEW_GET_FUN(__clewReleaseProgram )
-#define clBuildProgram CLEW_GET_FUN(__clewBuildProgram )
-#define clUnloadCompiler CLEW_GET_FUN(__clewUnloadCompiler )
-#define clGetProgramInfo CLEW_GET_FUN(__clewGetProgramInfo )
-#define clGetProgramBuildInfo CLEW_GET_FUN(__clewGetProgramBuildInfo )
-#define clCreateKernel CLEW_GET_FUN(__clewCreateKernel )
-#define clCreateKernelsInProgram CLEW_GET_FUN(__clewCreateKernelsInProgram )
-#define clRetainKernel CLEW_GET_FUN(__clewRetainKernel )
-#define clReleaseKernel CLEW_GET_FUN(__clewReleaseKernel )
-#define clSetKernelArg CLEW_GET_FUN(__clewSetKernelArg )
-#define clGetKernelInfo CLEW_GET_FUN(__clewGetKernelInfo )
-#define clGetKernelWorkGroupInfo CLEW_GET_FUN(__clewGetKernelWorkGroupInfo )
-#define clWaitForEvents CLEW_GET_FUN(__clewWaitForEvents )
-#define clGetEventInfo CLEW_GET_FUN(__clewGetEventInfo )
-#define clCreateUserEvent CLEW_GET_FUN(__clewCreateUserEvent )
-#define clRetainEvent CLEW_GET_FUN(__clewRetainEvent )
-#define clReleaseEvent CLEW_GET_FUN(__clewReleaseEvent )
-#define clSetUserEventStatus CLEW_GET_FUN(__clewSetUserEventStatus )
-#define clSetEventCallback CLEW_GET_FUN(__clewSetEventCallback )
-#define clGetEventProfilingInfo CLEW_GET_FUN(__clewGetEventProfilingInfo )
-#define clFlush CLEW_GET_FUN(__clewFlush )
-#define clFinish CLEW_GET_FUN(__clewFinish )
-#define clEnqueueReadBuffer CLEW_GET_FUN(__clewEnqueueReadBuffer )
-#define clEnqueueReadBufferRect CLEW_GET_FUN(__clewEnqueueReadBufferRect )
-#define clEnqueueWriteBuffer CLEW_GET_FUN(__clewEnqueueWriteBuffer )
-#define clEnqueueWriteBufferRect CLEW_GET_FUN(__clewEnqueueWriteBufferRect )
-#define clEnqueueCopyBuffer CLEW_GET_FUN(__clewEnqueueCopyBuffer )
-#define clEnqueueCopyBufferRect CLEW_GET_FUN(__clewEnqueueCopyBufferRect )
-#define clEnqueueReadImage CLEW_GET_FUN(__clewEnqueueReadImage )
-#define clEnqueueWriteImage CLEW_GET_FUN(__clewEnqueueWriteImage )
-#define clEnqueueCopyImage CLEW_GET_FUN(__clewEnqueueCopyImage )
-#define clEnqueueCopyImageToBuffer CLEW_GET_FUN(__clewEnqueueCopyImageToBuffer )
-#define clEnqueueCopyBufferToImage CLEW_GET_FUN(__clewEnqueueCopyBufferToImage )
-#define clEnqueueMapBuffer CLEW_GET_FUN(__clewEnqueueMapBuffer )
-#define clEnqueueMapImage CLEW_GET_FUN(__clewEnqueueMapImage )
-#define clEnqueueUnmapMemObject CLEW_GET_FUN(__clewEnqueueUnmapMemObject )
-#define clEnqueueNDRangeKernel CLEW_GET_FUN(__clewEnqueueNDRangeKernel )
-#define clEnqueueTask CLEW_GET_FUN(__clewEnqueueTask )
-#define clEnqueueNativeKernel CLEW_GET_FUN(__clewEnqueueNativeKernel )
-#define clEnqueueMarker CLEW_GET_FUN(__clewEnqueueMarker )
-#define clEnqueueWaitForEvents CLEW_GET_FUN(__clewEnqueueWaitForEvents )
-#define clEnqueueBarrier CLEW_GET_FUN(__clewEnqueueBarrier )
-#define clGetExtensionFunctionAddress CLEW_GET_FUN(__clewGetExtensionFunctionAddress )
-
-
-#define CLEW_SUCCESS 0 //!< Success error code
-#define CLEW_ERROR_OPEN_FAILED -1 //!< Error code for failing to open the dynamic library
-#define CLEW_ERROR_ATEXIT_FAILED -2 //!< Error code for failing to queue the closing of the dynamic library to atexit()
-
-//! \brief Load OpenCL dynamic library and set function entry points
-int clewInit (const char*);
-
-//! \brief Exit clew and unload OpenCL dynamic library
-void clewExit();
-
-//! \brief Convert an OpenCL error code to its string equivalent
-const char* clewErrorString (cl_int error);
+#define clCreateBuffer CLEW_GET_FUN(__clewCreateBuffer)
+#define clCreateSubBuffer CLEW_GET_FUN(__clewCreateSubBuffer)
+#define clCreateImage2D CLEW_GET_FUN(__clewCreateImage2D)
+#define clCreateImage3D CLEW_GET_FUN(__clewCreateImage3D)
+#define clRetainMemObject CLEW_GET_FUN(__clewRetainMemObject)
+#define clReleaseMemObject CLEW_GET_FUN(__clewReleaseMemObject)
+#define clGetSupportedImageFormats CLEW_GET_FUN(__clewGetSupportedImageFormats)
+#define clGetMemObjectInfo CLEW_GET_FUN(__clewGetMemObjectInfo)
+#define clGetImageInfo CLEW_GET_FUN(__clewGetImageInfo)
+#define clSetMemObjectDestructorCallback CLEW_GET_FUN(__clewSetMemObjectDestructorCallback)
+#define clCreateSampler CLEW_GET_FUN(__clewCreateSampler)
+#define clRetainSampler CLEW_GET_FUN(__clewRetainSampler)
+#define clReleaseSampler CLEW_GET_FUN(__clewReleaseSampler)
+#define clGetSamplerInfo CLEW_GET_FUN(__clewGetSamplerInfo)
+#define clCreateProgramWithSource CLEW_GET_FUN(__clewCreateProgramWithSource)
+#define clCreateProgramWithBinary CLEW_GET_FUN(__clewCreateProgramWithBinary)
+#define clRetainProgram CLEW_GET_FUN(__clewRetainProgram)
+#define clReleaseProgram CLEW_GET_FUN(__clewReleaseProgram)
+#define clBuildProgram CLEW_GET_FUN(__clewBuildProgram)
+#define clUnloadCompiler CLEW_GET_FUN(__clewUnloadCompiler)
+#define clGetProgramInfo CLEW_GET_FUN(__clewGetProgramInfo)
+#define clGetProgramBuildInfo CLEW_GET_FUN(__clewGetProgramBuildInfo)
+#define clCreateKernel CLEW_GET_FUN(__clewCreateKernel)
+#define clCreateKernelsInProgram CLEW_GET_FUN(__clewCreateKernelsInProgram)
+#define clRetainKernel CLEW_GET_FUN(__clewRetainKernel)
+#define clReleaseKernel CLEW_GET_FUN(__clewReleaseKernel)
+#define clSetKernelArg CLEW_GET_FUN(__clewSetKernelArg)
+#define clGetKernelInfo CLEW_GET_FUN(__clewGetKernelInfo)
+#define clGetKernelWorkGroupInfo CLEW_GET_FUN(__clewGetKernelWorkGroupInfo)
+#define clWaitForEvents CLEW_GET_FUN(__clewWaitForEvents)
+#define clGetEventInfo CLEW_GET_FUN(__clewGetEventInfo)
+#define clCreateUserEvent CLEW_GET_FUN(__clewCreateUserEvent)
+#define clRetainEvent CLEW_GET_FUN(__clewRetainEvent)
+#define clReleaseEvent CLEW_GET_FUN(__clewReleaseEvent)
+#define clSetUserEventStatus CLEW_GET_FUN(__clewSetUserEventStatus)
+#define clSetEventCallback CLEW_GET_FUN(__clewSetEventCallback)
+#define clGetEventProfilingInfo CLEW_GET_FUN(__clewGetEventProfilingInfo)
+#define clFlush CLEW_GET_FUN(__clewFlush)
+#define clFinish CLEW_GET_FUN(__clewFinish)
+#define clEnqueueReadBuffer CLEW_GET_FUN(__clewEnqueueReadBuffer)
+#define clEnqueueReadBufferRect CLEW_GET_FUN(__clewEnqueueReadBufferRect)
+#define clEnqueueWriteBuffer CLEW_GET_FUN(__clewEnqueueWriteBuffer)
+#define clEnqueueWriteBufferRect CLEW_GET_FUN(__clewEnqueueWriteBufferRect)
+#define clEnqueueCopyBuffer CLEW_GET_FUN(__clewEnqueueCopyBuffer)
+#define clEnqueueCopyBufferRect CLEW_GET_FUN(__clewEnqueueCopyBufferRect)
+#define clEnqueueReadImage CLEW_GET_FUN(__clewEnqueueReadImage)
+#define clEnqueueWriteImage CLEW_GET_FUN(__clewEnqueueWriteImage)
+#define clEnqueueCopyImage CLEW_GET_FUN(__clewEnqueueCopyImage)
+#define clEnqueueCopyImageToBuffer CLEW_GET_FUN(__clewEnqueueCopyImageToBuffer)
+#define clEnqueueCopyBufferToImage CLEW_GET_FUN(__clewEnqueueCopyBufferToImage)
+#define clEnqueueMapBuffer CLEW_GET_FUN(__clewEnqueueMapBuffer)
+#define clEnqueueMapImage CLEW_GET_FUN(__clewEnqueueMapImage)
+#define clEnqueueUnmapMemObject CLEW_GET_FUN(__clewEnqueueUnmapMemObject)
+#define clEnqueueNDRangeKernel CLEW_GET_FUN(__clewEnqueueNDRangeKernel)
+#define clEnqueueTask CLEW_GET_FUN(__clewEnqueueTask)
+#define clEnqueueNativeKernel CLEW_GET_FUN(__clewEnqueueNativeKernel)
+#define clEnqueueMarker CLEW_GET_FUN(__clewEnqueueMarker)
+#define clEnqueueWaitForEvents CLEW_GET_FUN(__clewEnqueueWaitForEvents)
+#define clEnqueueBarrier CLEW_GET_FUN(__clewEnqueueBarrier)
+#define clGetExtensionFunctionAddress CLEW_GET_FUN(__clewGetExtensionFunctionAddress)
+
+#define CLEW_SUCCESS 0 //!< Success error code
+#define CLEW_ERROR_OPEN_FAILED -1 //!< Error code for failing to open the dynamic library
+#define CLEW_ERROR_ATEXIT_FAILED -2 //!< Error code for failing to queue the closing of the dynamic library to atexit()
+
+ //! \brief Load OpenCL dynamic library and set function entry points
+ int clewInit(const char *);
+
+ //! \brief Exit clew and unload OpenCL dynamic library
+ void clewExit();
+
+ //! \brief Convert an OpenCL error code to its string equivalent
+ const char *clewErrorString(cl_int error);
#ifdef __cplusplus
}
diff --git a/thirdparty/certs/ca-certificates.crt b/thirdparty/certs/ca-certificates.crt
index 01dd29097e..613456b6d3 100644
--- a/thirdparty/certs/ca-certificates.crt
+++ b/thirdparty/certs/ca-certificates.crt
@@ -695,55 +695,6 @@ kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
l7+ijrRU
-----END CERTIFICATE-----
-# Certplus Root CA G1
------BEGIN CERTIFICATE-----
-MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUA
-MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy
-dHBsdXMgUm9vdCBDQSBHMTAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBa
-MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy
-dHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
-ANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHNr49a
-iZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt
-6kuJPKNxQv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP
-0FG7Yn2ksYyy/yARujVjBYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f
-6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTvLRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDE
-EW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2z4QTd28n6v+WZxcIbekN
-1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc4nBvCGrc
-h2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCT
-mehd4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV
-4EJQeIQEQWGw9CEjjy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPO
-WftwenMGE9nTdDckQQoRb5fc5+R+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1Ud
-DwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSowcCbkahDFXxd
-Bie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHYlwuBsTANBgkq
-hkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh
-66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7
-/SMNkPX0XtPGYX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BS
-S7CTKtQ+FjPlnsZlFT5kOwQ/2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j
-2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F6ALEUz65noe8zDUa3qHpimOHZR4R
-Kttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilXCNQ314cnrUlZp5Gr
-RHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWetUNy
-6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEV
-V/xuZDDCVRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5
-g4VCXA9DO2pJNdWY9BW/+mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl
-++O/QmueD6i9a5jc2NvLi6Td11n0bt3+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo=
------END CERTIFICATE-----
-
-# Certplus Root CA G2
------BEGIN CERTIFICATE-----
-MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4x
-CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs
-dXMgUm9vdCBDQSBHMjAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4x
-CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs
-dXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABM0PW1aC3/BFGtat
-93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uNAm8x
-Ik0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0P
-AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwj
-FNiPwyCrKGBZMB8GA1UdIwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqG
-SM49BAMDA2gAMGUCMHD+sAvZ94OX7PNVHdTcswYO/jOYnYs5kGuUIe22113WTNch
-p+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjlvPl5adytRSv3tjFzzAal
-U5ORGpOucGpnutee5WEaXw==
------END CERTIFICATE-----
-
# Certum Trusted Network CA
-----BEGIN CERTIFICATE-----
MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM
@@ -1679,6 +1630,40 @@ Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH
WD9f
-----END CERTIFICATE-----
+# GlobalSign Root CA - R6
+-----BEGIN CERTIFICATE-----
+MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg
+MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh
+bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx
+MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET
+MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ
+KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI
+xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k
+ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD
+aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw
+LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw
+1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX
+k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2
+SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h
+bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n
+WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY
+rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce
+MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD
+AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu
+bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN
+nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt
+Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61
+55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj
+vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf
+cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz
+oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp
+nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs
+pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v
+JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R
+8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4
+5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA=
+-----END CERTIFICATE-----
+
# Global Chambersign Root - 2008
-----BEGIN CERTIFICATE-----
MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD
@@ -2175,88 +2160,21 @@ aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
-----END CERTIFICATE-----
-# OpenTrust Root CA G1
------BEGIN CERTIFICATE-----
-MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUA
-MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w
-ZW5UcnVzdCBSb290IENBIEcxMB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAw
-MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU
-T3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
-AoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7faYp6b
-wiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX
-/uMftk87ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR0
-77F9jAHiOH3BX2pfJLKOYheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGP
-uY4zbGneWK2gDqdkVBFpRGZPTBKnjix9xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLx
-p2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO9z0M+Yo0FMT7MzUj8czx
-Kselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq3ywgsNw2
-TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+W
-G+Oin6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPw
-vFEVVJSmdz7QdFG9URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYY
-EQRVzXR7z2FwefR7LFxckvzluFqrTJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAO
-BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUl0YhVyE1
-2jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/PxN3DlCPaTKbYw
-DQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E
-PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kf
-gLMtMrpkZ2CvuVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbS
-FXJfLkur1J1juONI5f6ELlgKn0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0
-V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLhX4SPgPL0DTatdrOjteFkdjpY3H1P
-XlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80nR14SohWZ25g/4/I
-i+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcmGS3t
-TAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L91
-09S5zvE/bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/Ky
-Pu1svf0OnWZzsD2097+o4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJ
-AwSQiumPv+i2tCqjI40cHLI5kqiPAlxAOXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj
-1oxx
------END CERTIFICATE-----
-
-# OpenTrust Root CA G2
------BEGIN CERTIFICATE-----
-MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUA
-MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w
-ZW5UcnVzdCBSb290IENBIEcyMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAw
-MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU
-T3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
-AoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+Ntmh
-/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78e
-CbY2albz4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/6
-1UWY0jUJ9gNDlP7ZvyCVeYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fE
-FY8ElggGQgT4hNYdvJGmQr5J1WqIP7wtUdGejeBSzFfdNTVY27SPJIjki9/ca1TS
-gSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz3GIZ38i1MH/1PCZ1Eb3X
-G7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj3CzMpSZy
-YhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaH
-vGOz9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4
-t/bQWVyJ98LVtZR00dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/
-gh7PU3+06yzbXfZqfUAkBXKJOAGTy3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAO
-BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUajn6QiL3
-5okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59M4PLuG53hq8w
-DQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz
-Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0
-nXGEL8pZ0keImUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qT
-RmTFAHneIWv2V6CG1wZy7HBGS4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpT
-wm+bREx50B1ws9efAvSyB7DH5fitIw6mVskpEndI2S9G/Tvw/HRwkqWOOAgfZDC2
-t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ6e18CL13zSdkzJTa
-TkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97krgCf2
-o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU
-3jg9CcCoSmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eA
-iN1nE28daCSLT7d0geX0YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14f
-WKGVyasvc0rQLW6aWQ9VGHgtPFGml4vmu7JwqkwR3v98KzfUetF3NI/n+UL3PIEM
-S1IK
------END CERTIFICATE-----
-
-# OpenTrust Root CA G3
------BEGIN CERTIFICATE-----
-MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAx
-CzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5U
-cnVzdCBSb290IENBIEczMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFow
-QDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwUT3Bl
-blRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARK7liuTcpm
-3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5Bta1d
-oYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4G
-A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5
-DMlv4VBN0BBY3JWIbTAfBgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAK
-BggqhkjOPQQDAwNpADBmAjEAj6jcnboMBBf6Fek9LykBl7+BFjNAk2z8+e2AcG+q
-j9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta3U1fJAuwACEl74+nBCZx
-4nxp5V2a+EEfOzmTk51V6s2N8fvB
+# OISTE WISeKey Global Root GC CA
+-----BEGIN CERTIFICATE-----
+MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw
+CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91
+bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg
+Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ
+BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu
+ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS
+b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni
+eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W
+p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T
+rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV
+57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg
+Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9
-----END CERTIFICATE-----
# QuoVadis Root CA
@@ -3302,33 +3220,6 @@ jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN
ZetX2fNXlrtIzYE=
-----END CERTIFICATE-----
-# TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5
------BEGIN CERTIFICATE-----
-MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UE
-BhMCVFIxDzANBgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxn
-aSDEsGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkg
-QS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2Eg
-SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAwODA3MDFaFw0yMzA0
-MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYD
-VQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8
-dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF
-bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIB
-IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApCUZ4WWe60ghUEoI5RHwWrom
-/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537jVJp45wnEFPzpALFp/kR
-Gml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1mep5Fimh3
-4khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z
-5UNP9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0
-hO8EuPbJbKoCPrZV4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QID
-AQABo0IwQDAdBgNVHQ4EFgQUVpkHHtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/
-BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ5FdnsX
-SDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPoBP5yCccLqh0l
-VX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq
-URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nf
-peYVhDfwwvJllpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CF
-Yv4HAqGEVka+lgqaE9chTLd8B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW
-+qtB4Uu2NQvAmxU=
------END CERTIFICATE-----
-
# USERTrust ECC Certification Authority
-----BEGIN CERTIFICATE-----
MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL
diff --git a/thirdparty/enet/enet/godot.h b/thirdparty/enet/enet/godot.h
index 7e2be12b22..9230af428b 100644
--- a/thirdparty/enet/enet/godot.h
+++ b/thirdparty/enet/enet/godot.h
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
diff --git a/thirdparty/enet/godot.cpp b/thirdparty/enet/godot.cpp
index 6ba7cf0000..2e1519b7b2 100644
--- a/thirdparty/enet/godot.cpp
+++ b/thirdparty/enet/godot.cpp
@@ -5,8 +5,8 @@
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
+/* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -33,7 +33,7 @@
*/
#include "core/io/ip.h"
-#include "core/io/packet_peer_udp.h"
+#include "core/io/net_socket.h"
#include "core/os/os.h"
// This must be last for windows to compile (tested with MinGW)
@@ -90,6 +90,16 @@ int enet_address_get_host(const ENetAddress *address, char *name, size_t nameLen
return -1;
}
+ENetSocket enet_socket_create(ENetSocketType type) {
+
+ NetSocket *socket = NetSocket::create();
+ IP::Type ip_type = IP::TYPE_ANY;
+ socket->open(NetSocket::TYPE_UDP, ip_type);
+ socket->set_blocking_enabled(false);
+
+ return socket;
+}
+
int enet_socket_bind(ENetSocket socket, const ENetAddress *address) {
IP_Address ip;
@@ -99,23 +109,15 @@ int enet_socket_bind(ENetSocket socket, const ENetAddress *address) {
ip.set_ipv6(address->host);
}
- PacketPeerUDP *sock = (PacketPeerUDP *)socket;
- if (sock->listen(address->port, ip) != OK) {
+ NetSocket *sock = (NetSocket *)socket;
+ if (sock->bind(ip, address->port) != OK) {
return -1;
}
return 0;
}
-ENetSocket enet_socket_create(ENetSocketType type) {
-
- PacketPeerUDP *socket = memnew(PacketPeerUDP);
- socket->set_blocking_mode(false);
-
- return socket;
-}
-
void enet_socket_destroy(ENetSocket socket) {
- PacketPeerUDP *sock = (PacketPeerUDP *)socket;
+ NetSocket *sock = (NetSocket *)socket;
sock->close();
memdelete(sock);
}
@@ -124,13 +126,12 @@ int enet_socket_send(ENetSocket socket, const ENetAddress *address, const ENetBu
ERR_FAIL_COND_V(address == NULL, -1);
- PacketPeerUDP *sock = (PacketPeerUDP *)socket;
+ NetSocket *sock = (NetSocket *)socket;
IP_Address dest;
Error err;
size_t i = 0;
dest.set_ipv6(address->host);
- sock->set_dest_address(dest, address->port);
// Create a single packet.
PoolVector<uint8_t> out;
@@ -148,7 +149,8 @@ int enet_socket_send(ENetSocket socket, const ENetAddress *address, const ENetBu
pos += buffers[i].dataLength;
}
- err = sock->put_packet((const uint8_t *)&w[0], size);
+ int sent = 0;
+ err = sock->sendto((const uint8_t *)&w[0], size, sent, dest, address->port);
if (err != OK) {
if (err == ERR_BUSY) { // Blocking call
@@ -159,32 +161,36 @@ int enet_socket_send(ENetSocket socket, const ENetAddress *address, const ENetBu
return -1;
}
- return size;
+ return sent;
}
int enet_socket_receive(ENetSocket socket, ENetAddress *address, ENetBuffer *buffers, size_t bufferCount) {
ERR_FAIL_COND_V(bufferCount != 1, -1);
- PacketPeerUDP *sock = (PacketPeerUDP *)socket;
+ NetSocket *sock = (NetSocket *)socket;
- int pc = sock->get_available_packet_count();
- if (pc < 1) {
- return pc;
- }
+ Error ret = sock->poll(NetSocket::POLL_TYPE_IN, 0);
- const uint8_t *buffer;
- int buffer_size;
- Error err = sock->get_packet(&buffer, buffer_size);
- if (err)
+ if (ret == ERR_BUSY)
+ return 0;
+
+ if (ret != OK)
return -1;
- copymem(buffers[0].data, buffer, buffer_size);
+ int read;
+ IP_Address ip;
- enet_address_set_ip(address, sock->get_packet_address().get_ipv6(), 16);
- address->port = sock->get_packet_port();
+ Error err = sock->recvfrom((uint8_t *)buffers[0].data, buffers[0].dataLength, read, ip, address->port);
+ if (err == ERR_BUSY)
+ return 0;
+
+ if (err != OK)
+ return -1;
+
+ enet_address_set_ip(address, ip.get_ipv6(), 16);
- return buffer_size;
+ return read;
}
// Not implemented
diff --git a/thirdparty/freetype/include/freetype/config/ftoption.h b/thirdparty/freetype/include/freetype/config/ftoption.h
index 4bcab2af5c..1fc7295a2c 100644
--- a/thirdparty/freetype/include/freetype/config/ftoption.h
+++ b/thirdparty/freetype/include/freetype/config/ftoption.h
@@ -178,7 +178,7 @@ FT_BEGIN_HEADER
/* */
/* Define this macro if you want to enable this `feature'. */
/* */
-#define FT_CONFIG_OPTION_USE_LZW
+/* #define FT_CONFIG_OPTION_USE_LZW */ // -GODOT-
/*************************************************************************/
@@ -193,7 +193,7 @@ FT_BEGIN_HEADER
/* Define this macro if you want to enable this `feature'. See also */
/* the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below. */
/* */
-#define FT_CONFIG_OPTION_USE_ZLIB
+/* #define FT_CONFIG_OPTION_USE_ZLIB */ // -GODOT-
/*************************************************************************/
diff --git a/thirdparty/glad/glad.c b/thirdparty/glad/glad.c
index 35469e9031..8cc09e46e1 100644
--- a/thirdparty/glad/glad.c
+++ b/thirdparty/glad/glad.c
@@ -1,6 +1,6 @@
/*
- OpenGL loader generated by glad 0.1.25 on Sat Jul 28 10:59:43 2018.
+ OpenGL loader generated by glad 0.1.28 on Thu Nov 22 16:50:04 2018.
Language/Generator: C/C++
Specification: gl
@@ -13,11 +13,12 @@
Loader: True
Local files: False
Omit khrplatform: False
+ Reproducible: False
Commandline:
--profile="compatibility" --api="gl=3.3" --generator="c" --spec="gl" --extensions="GL_ARB_debug_output,GL_ARB_framebuffer_object,GL_EXT_framebuffer_object"
Online:
- http://glad.dav1d.de/#profile=compatibility&language=c&specification=gl&loader=on&api=gl%3D3.3&extensions=GL_ARB_debug_output&extensions=GL_ARB_framebuffer_object&extensions=GL_EXT_framebuffer_object
+ https://glad.dav1d.de/#profile=compatibility&language=c&specification=gl&loader=on&api=gl%3D3.3&extensions=GL_ARB_debug_output&extensions=GL_ARB_framebuffer_object&extensions=GL_EXT_framebuffer_object
*/
#include <stdio.h>
@@ -154,7 +155,7 @@ int gladLoadGL(void) {
return status;
}
-struct gladGLversionStruct GLVersion;
+struct gladGLversionStruct GLVersion = { 0, 0 };
#if defined(GL_ES_VERSION_3_0) || defined(GL_VERSION_3_0)
#define _GLAD_IS_SOME_NEW_VERSION 1
@@ -179,7 +180,11 @@ static int get_exts(void) {
num_exts_i = 0;
glGetIntegerv(GL_NUM_EXTENSIONS, &num_exts_i);
if (num_exts_i > 0) {
- exts_i = (char **)realloc((void *)exts_i, (size_t)num_exts_i * (sizeof *exts_i));
+ char **tmp_exts_i = (char **)realloc((void *)exts_i, (size_t)num_exts_i * (sizeof *exts_i));
+ if (tmp_exts_i == NULL) {
+ return 0;
+ }
+ exts_i = tmp_exts_i;
}
if (exts_i == NULL) {
@@ -253,766 +258,766 @@ static int has_ext(const char *ext) {
return 0;
}
-int GLAD_GL_VERSION_1_0;
-int GLAD_GL_VERSION_1_1;
-int GLAD_GL_VERSION_1_2;
-int GLAD_GL_VERSION_1_3;
-int GLAD_GL_VERSION_1_4;
-int GLAD_GL_VERSION_1_5;
-int GLAD_GL_VERSION_2_0;
-int GLAD_GL_VERSION_2_1;
-int GLAD_GL_VERSION_3_0;
-int GLAD_GL_VERSION_3_1;
-int GLAD_GL_VERSION_3_2;
-int GLAD_GL_VERSION_3_3;
-PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D;
-PFNGLVERTEXATTRIBI3UIPROC glad_glVertexAttribI3ui;
-PFNGLWINDOWPOS2SPROC glad_glWindowPos2s;
-PFNGLWINDOWPOS2IPROC glad_glWindowPos2i;
-PFNGLWINDOWPOS2FPROC glad_glWindowPos2f;
-PFNGLWINDOWPOS2DPROC glad_glWindowPos2d;
-PFNGLVERTEX2FVPROC glad_glVertex2fv;
-PFNGLINDEXIPROC glad_glIndexi;
-PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer;
-PFNGLRECTDVPROC glad_glRectdv;
-PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D;
-PFNGLEVALCOORD2DPROC glad_glEvalCoord2d;
-PFNGLEVALCOORD2FPROC glad_glEvalCoord2f;
-PFNGLINDEXDPROC glad_glIndexd;
-PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv;
-PFNGLINDEXFPROC glad_glIndexf;
-PFNGLBINDSAMPLERPROC glad_glBindSampler;
-PFNGLLINEWIDTHPROC glad_glLineWidth;
-PFNGLCOLORP3UIVPROC glad_glColorP3uiv;
-PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v;
-PFNGLGETMAPFVPROC glad_glGetMapfv;
-PFNGLINDEXSPROC glad_glIndexs;
-PFNGLCOMPILESHADERPROC glad_glCompileShader;
-PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying;
-PFNGLWINDOWPOS2IVPROC glad_glWindowPos2iv;
-PFNGLINDEXFVPROC glad_glIndexfv;
-PFNGLFOGIVPROC glad_glFogiv;
-PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate;
-PFNGLRASTERPOS2FVPROC glad_glRasterPos2fv;
-PFNGLLIGHTMODELIVPROC glad_glLightModeliv;
-PFNGLCOLOR4UIPROC glad_glColor4ui;
-PFNGLSECONDARYCOLOR3FVPROC glad_glSecondaryColor3fv;
-PFNGLMULTITEXCOORDP3UIPROC glad_glMultiTexCoordP3ui;
-PFNGLFOGFVPROC glad_glFogfv;
-PFNGLVERTEXP4UIPROC glad_glVertexP4ui;
-PFNGLENABLEIPROC glad_glEnablei;
-PFNGLVERTEX4IVPROC glad_glVertex4iv;
-PFNGLEVALCOORD1FVPROC glad_glEvalCoord1fv;
-PFNGLWINDOWPOS2SVPROC glad_glWindowPos2sv;
-PFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui;
-PFNGLCREATESHADERPROC glad_glCreateShader;
-PFNGLISBUFFERPROC glad_glIsBuffer;
-PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv;
-PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers;
-PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D;
-PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D;
-PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f;
-PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate;
-PFNGLVERTEX4FVPROC glad_glVertex4fv;
-PFNGLBINDTEXTUREPROC glad_glBindTexture;
-PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s;
-PFNGLTEXCOORD2FVPROC glad_glTexCoord2fv;
-PFNGLSAMPLEMASKIPROC glad_glSampleMaski;
-PFNGLVERTEXP2UIPROC glad_glVertexP2ui;
-PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex;
-PFNGLTEXCOORD4FVPROC glad_glTexCoord4fv;
-PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv;
-PFNGLPOINTSIZEPROC glad_glPointSize;
-PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv;
-PFNGLDELETEPROGRAMPROC glad_glDeleteProgram;
-PFNGLCOLOR4BVPROC glad_glColor4bv;
-PFNGLRASTERPOS2FPROC glad_glRasterPos2f;
-PFNGLRASTERPOS2DPROC glad_glRasterPos2d;
-PFNGLLOADIDENTITYPROC glad_glLoadIdentity;
-PFNGLRASTERPOS2IPROC glad_glRasterPos2i;
-PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage;
-PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv;
-PFNGLCOLOR3BPROC glad_glColor3b;
-PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv;
-PFNGLEDGEFLAGPROC glad_glEdgeFlag;
-PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers;
-PFNGLVERTEX3DPROC glad_glVertex3d;
-PFNGLVERTEX3FPROC glad_glVertex3f;
-PFNGLVERTEX3IPROC glad_glVertex3i;
-PFNGLCOLOR3IPROC glad_glColor3i;
-PFNGLUNIFORM3FPROC glad_glUniform3f;
-PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv;
-PFNGLCOLOR3SPROC glad_glColor3s;
-PFNGLVERTEX3SPROC glad_glVertex3s;
-PFNGLTEXCOORDP2UIPROC glad_glTexCoordP2ui;
-PFNGLCOLORMASKIPROC glad_glColorMaski;
-PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi;
-PFNGLTEXCOORD1IVPROC glad_glTexCoord1iv;
-PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer;
-PFNGLMULTITEXCOORDP2UIPROC glad_glMultiTexCoordP2ui;
-PFNGLGETSAMPLERPARAMETERIIVPROC glad_glGetSamplerParameterIiv;
-PFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex;
-PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f;
-PFNGLVERTEX2IVPROC glad_glVertex2iv;
-PFNGLCOLOR3SVPROC glad_glColor3sv;
-PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv;
-PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv;
-PFNGLNORMALPOINTERPROC glad_glNormalPointer;
-PFNGLTEXCOORDP3UIVPROC glad_glTexCoordP3uiv;
-PFNGLVERTEX4SVPROC glad_glVertex4sv;
-PFNGLPASSTHROUGHPROC glad_glPassThrough;
-PFNGLMULTITEXCOORDP4UIPROC glad_glMultiTexCoordP4ui;
-PFNGLFOGIPROC glad_glFogi;
-PFNGLBEGINPROC glad_glBegin;
-PFNGLEVALCOORD2DVPROC glad_glEvalCoord2dv;
-PFNGLCOLOR3UBVPROC glad_glColor3ubv;
-PFNGLVERTEXPOINTERPROC glad_glVertexPointer;
-PFNGLSECONDARYCOLOR3UIVPROC glad_glSecondaryColor3uiv;
-PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers;
-PFNGLDRAWARRAYSPROC glad_glDrawArrays;
-PFNGLUNIFORM1UIPROC glad_glUniform1ui;
-PFNGLMULTITEXCOORD1DPROC glad_glMultiTexCoord1d;
-PFNGLMULTITEXCOORD1FPROC glad_glMultiTexCoord1f;
-PFNGLLIGHTFVPROC glad_glLightfv;
-PFNGLTEXCOORDP3UIPROC glad_glTexCoordP3ui;
-PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d;
-PFNGLCLEARPROC glad_glClear;
-PFNGLMULTITEXCOORD1IPROC glad_glMultiTexCoord1i;
-PFNGLGETACTIVEUNIFORMNAMEPROC glad_glGetActiveUniformName;
-PFNGLMULTITEXCOORD1SPROC glad_glMultiTexCoord1s;
-PFNGLISENABLEDPROC glad_glIsEnabled;
-PFNGLSTENCILOPPROC glad_glStencilOp;
-PFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv;
-PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D;
-PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv;
-PFNGLTRANSLATEFPROC glad_glTranslatef;
-PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub;
-PFNGLTRANSLATEDPROC glad_glTranslated;
-PFNGLTEXCOORD3SVPROC glad_glTexCoord3sv;
-PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation;
-PFNGLTEXIMAGE1DPROC glad_glTexImage1D;
-PFNGLVERTEXP3UIVPROC glad_glVertexP3uiv;
-PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv;
-PFNGLSECONDARYCOLOR3BVPROC glad_glSecondaryColor3bv;
-PFNGLGETMATERIALFVPROC glad_glGetMaterialfv;
-PFNGLGETTEXIMAGEPROC glad_glGetTexImage;
-PFNGLFOGCOORDFVPROC glad_glFogCoordfv;
-PFNGLPIXELMAPUIVPROC glad_glPixelMapuiv;
-PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog;
-PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v;
-PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers;
-PFNGLINDEXSVPROC glad_glIndexsv;
-PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders;
-PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer;
-PFNGLVERTEX3IVPROC glad_glVertex3iv;
-PFNGLBITMAPPROC glad_glBitmap;
-PFNGLMATERIALIPROC glad_glMateriali;
-PFNGLISVERTEXARRAYPROC glad_glIsVertexArray;
-PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray;
-PFNGLGETQUERYIVPROC glad_glGetQueryiv;
-PFNGLTEXCOORD4FPROC glad_glTexCoord4f;
-PFNGLTEXCOORD4DPROC glad_glTexCoord4d;
-PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv;
-PFNGLTEXCOORD4IPROC glad_glTexCoord4i;
-PFNGLMATERIALFPROC glad_glMaterialf;
-PFNGLTEXCOORD4SPROC glad_glTexCoord4s;
-PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices;
-PFNGLISSHADERPROC glad_glIsShader;
-PFNGLMULTITEXCOORD2SPROC glad_glMultiTexCoord2s;
-PFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv;
-PFNGLVERTEX3DVPROC glad_glVertex3dv;
-PFNGLGETINTEGER64VPROC glad_glGetInteger64v;
-PFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv;
-PFNGLENABLEPROC glad_glEnable;
-PFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv;
-PFNGLCOLOR4FVPROC glad_glColor4fv;
-PFNGLTEXCOORD1FVPROC glad_glTexCoord1fv;
-PFNGLTEXCOORD2SVPROC glad_glTexCoord2sv;
-PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv;
-PFNGLMULTITEXCOORD1DVPROC glad_glMultiTexCoord1dv;
-PFNGLMULTITEXCOORD2IPROC glad_glMultiTexCoord2i;
-PFNGLTEXCOORD3FVPROC glad_glTexCoord3fv;
-PFNGLSECONDARYCOLOR3USVPROC glad_glSecondaryColor3usv;
-PFNGLTEXGENFPROC glad_glTexGenf;
-PFNGLMULTITEXCOORDP3UIVPROC glad_glMultiTexCoordP3uiv;
-PFNGLVERTEXATTRIBP3UIPROC glad_glVertexAttribP3ui;
-PFNGLMULTITEXCOORDP1UIPROC glad_glMultiTexCoordP1ui;
-PFNGLGETPOINTERVPROC glad_glGetPointerv;
-PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset;
-PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv;
-PFNGLNORMAL3FVPROC glad_glNormal3fv;
-PFNGLSECONDARYCOLOR3SPROC glad_glSecondaryColor3s;
-PFNGLDEPTHRANGEPROC glad_glDepthRange;
-PFNGLFRUSTUMPROC glad_glFrustum;
-PFNGLMULTITEXCOORD4SVPROC glad_glMultiTexCoord4sv;
-PFNGLDRAWBUFFERPROC glad_glDrawBuffer;
-PFNGLPUSHMATRIXPROC glad_glPushMatrix;
-PFNGLRASTERPOS3FVPROC glad_glRasterPos3fv;
-PFNGLORTHOPROC glad_glOrtho;
-PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced;
-PFNGLWINDOWPOS3SVPROC glad_glWindowPos3sv;
-PFNGLCLEARINDEXPROC glad_glClearIndex;
-PFNGLMAP1DPROC glad_glMap1d;
-PFNGLMAP1FPROC glad_glMap1f;
-PFNGLFLUSHPROC glad_glFlush;
-PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv;
-PFNGLINDEXIVPROC glad_glIndexiv;
-PFNGLRASTERPOS3SVPROC glad_glRasterPos3sv;
-PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv;
-PFNGLPIXELZOOMPROC glad_glPixelZoom;
-PFNGLFENCESYNCPROC glad_glFenceSync;
-PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays;
-PFNGLCOLORP3UIPROC glad_glColorP3ui;
-PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv;
-PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender;
-PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex;
-PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv;
-PFNGLLIGHTIPROC glad_glLighti;
-PFNGLMULTITEXCOORDP4UIVPROC glad_glMultiTexCoordP4uiv;
-PFNGLLIGHTFPROC glad_glLightf;
-PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation;
-PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate;
-PFNGLGENSAMPLERSPROC glad_glGenSamplers;
-PFNGLCLAMPCOLORPROC glad_glClampColor;
-PFNGLUNIFORM4IVPROC glad_glUniform4iv;
-PFNGLCLEARSTENCILPROC glad_glClearStencil;
-PFNGLTEXCOORDP1UIVPROC glad_glTexCoordP1uiv;
-PFNGLMULTITEXCOORD3FVPROC glad_glMultiTexCoord3fv;
-PFNGLGETPIXELMAPUIVPROC glad_glGetPixelMapuiv;
-PFNGLGENTEXTURESPROC glad_glGenTextures;
-PFNGLTEXCOORD4IVPROC glad_glTexCoord4iv;
-PFNGLGETTEXPARAMETERIUIVPROC glad_glGetTexParameterIuiv;
-PFNGLINDEXPOINTERPROC glad_glIndexPointer;
-PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv;
-PFNGLISSYNCPROC glad_glIsSync;
-PFNGLVERTEX2FPROC glad_glVertex2f;
-PFNGLVERTEX2DPROC glad_glVertex2d;
-PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers;
-PFNGLUNIFORM2IPROC glad_glUniform2i;
-PFNGLMAPGRID2DPROC glad_glMapGrid2d;
-PFNGLMAPGRID2FPROC glad_glMapGrid2f;
-PFNGLTEXCOORDP4UIPROC glad_glTexCoordP4ui;
-PFNGLVERTEX2IPROC glad_glVertex2i;
-PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer;
-PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer;
-PFNGLVERTEX2SPROC glad_glVertex2s;
-PFNGLNORMAL3BVPROC glad_glNormal3bv;
-PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv;
-PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange;
-PFNGLSECONDARYCOLOR3SVPROC glad_glSecondaryColor3sv;
-PFNGLVERTEX3SVPROC glad_glVertex3sv;
-PFNGLGENQUERIESPROC glad_glGenQueries;
-PFNGLGETPIXELMAPFVPROC glad_glGetPixelMapfv;
-PFNGLTEXENVFPROC glad_glTexEnvf;
-PFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui;
-PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D;
-PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v;
-PFNGLFOGCOORDDPROC glad_glFogCoordd;
-PFNGLFOGCOORDFPROC glad_glFogCoordf;
-PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D;
-PFNGLTEXENVIPROC glad_glTexEnvi;
-PFNGLMULTITEXCOORD1IVPROC glad_glMultiTexCoord1iv;
-PFNGLISENABLEDIPROC glad_glIsEnabledi;
-PFNGLSECONDARYCOLORP3UIPROC glad_glSecondaryColorP3ui;
-PFNGLVERTEXATTRIBI2IPROC glad_glVertexAttribI2i;
-PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed;
-PFNGLMULTITEXCOORD2DVPROC glad_glMultiTexCoord2dv;
-PFNGLUNIFORM2IVPROC glad_glUniform2iv;
-PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv;
-PFNGLUNIFORM4UIVPROC glad_glUniform4uiv;
-PFNGLMATRIXMODEPROC glad_glMatrixMode;
-PFNGLFEEDBACKBUFFERPROC glad_glFeedbackBuffer;
-PFNGLGETMAPIVPROC glad_glGetMapiv;
-PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D;
-PFNGLGETSHADERIVPROC glad_glGetShaderiv;
-PFNGLMULTITEXCOORD2DPROC glad_glMultiTexCoord2d;
-PFNGLMULTITEXCOORD2FPROC glad_glMultiTexCoord2f;
-PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation;
-PFNGLPRIORITIZETEXTURESPROC glad_glPrioritizeTextures;
-PFNGLCALLLISTPROC glad_glCallList;
-PFNGLSECONDARYCOLOR3UBVPROC glad_glSecondaryColor3ubv;
-PFNGLGETDOUBLEVPROC glad_glGetDoublev;
-PFNGLMULTITEXCOORD3IVPROC glad_glMultiTexCoord3iv;
-PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d;
-PFNGLLIGHTMODELFPROC glad_glLightModelf;
-PFNGLGETUNIFORMIVPROC glad_glGetUniformiv;
-PFNGLVERTEX2SVPROC glad_glVertex2sv;
-PFNGLLIGHTMODELIPROC glad_glLightModeli;
-PFNGLWINDOWPOS3IVPROC glad_glWindowPos3iv;
-PFNGLMULTITEXCOORDP1UIVPROC glad_glMultiTexCoordP1uiv;
-PFNGLUNIFORM3FVPROC glad_glUniform3fv;
-PFNGLPIXELSTOREIPROC glad_glPixelStorei;
-PFNGLCALLLISTSPROC glad_glCallLists;
-PFNGLMAPBUFFERPROC glad_glMapBuffer;
-PFNGLSECONDARYCOLOR3DPROC glad_glSecondaryColor3d;
-PFNGLTEXCOORD3IPROC glad_glTexCoord3i;
-PFNGLMULTITEXCOORD4FVPROC glad_glMultiTexCoord4fv;
-PFNGLRASTERPOS3IPROC glad_glRasterPos3i;
-PFNGLSECONDARYCOLOR3BPROC glad_glSecondaryColor3b;
-PFNGLRASTERPOS3DPROC glad_glRasterPos3d;
-PFNGLRASTERPOS3FPROC glad_glRasterPos3f;
-PFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D;
-PFNGLTEXCOORD3FPROC glad_glTexCoord3f;
-PFNGLDELETESYNCPROC glad_glDeleteSync;
-PFNGLTEXCOORD3DPROC glad_glTexCoord3d;
-PFNGLTEXIMAGE2DMULTISAMPLEPROC glad_glTexImage2DMultisample;
-PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv;
-PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements;
-PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv;
-PFNGLTEXCOORD3SPROC glad_glTexCoord3s;
-PFNGLUNIFORM3IVPROC glad_glUniform3iv;
-PFNGLRASTERPOS3SPROC glad_glRasterPos3s;
-PFNGLPOLYGONMODEPROC glad_glPolygonMode;
-PFNGLDRAWBUFFERSPROC glad_glDrawBuffers;
-PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv;
-PFNGLARETEXTURESRESIDENTPROC glad_glAreTexturesResident;
-PFNGLISLISTPROC glad_glIsList;
-PFNGLRASTERPOS2SVPROC glad_glRasterPos2sv;
-PFNGLRASTERPOS4SVPROC glad_glRasterPos4sv;
-PFNGLCOLOR4SPROC glad_glColor4s;
-PFNGLUSEPROGRAMPROC glad_glUseProgram;
-PFNGLLINESTIPPLEPROC glad_glLineStipple;
-PFNGLMULTITEXCOORD1SVPROC glad_glMultiTexCoord1sv;
-PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog;
-PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv;
-PFNGLMULTITEXCOORD2IVPROC glad_glMultiTexCoord2iv;
-PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv;
-PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray;
-PFNGLCOLOR4BPROC glad_glColor4b;
-PFNGLSECONDARYCOLOR3FPROC glad_glSecondaryColor3f;
-PFNGLCOLOR4FPROC glad_glColor4f;
-PFNGLCOLOR4DPROC glad_glColor4d;
-PFNGLCOLOR4IPROC glad_glColor4i;
-PFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv;
-PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex;
-PFNGLRASTERPOS3IVPROC glad_glRasterPos3iv;
-PFNGLVERTEX2DVPROC glad_glVertex2dv;
-PFNGLTEXCOORD4SVPROC glad_glTexCoord4sv;
-PFNGLUNIFORM2UIVPROC glad_glUniform2uiv;
-PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D;
-PFNGLFINISHPROC glad_glFinish;
-PFNGLGETBOOLEANVPROC glad_glGetBooleanv;
-PFNGLDELETESHADERPROC glad_glDeleteShader;
-PFNGLDRAWELEMENTSPROC glad_glDrawElements;
-PFNGLRASTERPOS2SPROC glad_glRasterPos2s;
-PFNGLGETMAPDVPROC glad_glGetMapdv;
-PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv;
-PFNGLMATERIALFVPROC glad_glMaterialfv;
-PFNGLVIEWPORTPROC glad_glViewport;
-PFNGLUNIFORM1UIVPROC glad_glUniform1uiv;
-PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings;
-PFNGLINDEXDVPROC glad_glIndexdv;
-PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D;
-PFNGLTEXCOORD3IVPROC glad_glTexCoord3iv;
-PFNGLVERTEXATTRIBI3IPROC glad_glVertexAttribI3i;
-PFNGLCLEARDEPTHPROC glad_glClearDepth;
-PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv;
-PFNGLTEXPARAMETERFPROC glad_glTexParameterf;
-PFNGLTEXPARAMETERIPROC glad_glTexParameteri;
-PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource;
-PFNGLTEXBUFFERPROC glad_glTexBuffer;
-PFNGLPOPNAMEPROC glad_glPopName;
-PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram;
-PFNGLPIXELSTOREFPROC glad_glPixelStoref;
-PFNGLUNIFORM3UIVPROC glad_glUniform3uiv;
-PFNGLRASTERPOS4FVPROC glad_glRasterPos4fv;
-PFNGLEVALCOORD1DVPROC glad_glEvalCoord1dv;
-PFNGLMULTITEXCOORDP2UIVPROC glad_glMultiTexCoordP2uiv;
-PFNGLRECTIPROC glad_glRecti;
-PFNGLCOLOR4UBPROC glad_glColor4ub;
-PFNGLMULTTRANSPOSEMATRIXFPROC glad_glMultTransposeMatrixf;
-PFNGLRECTFPROC glad_glRectf;
-PFNGLRECTDPROC glad_glRectd;
-PFNGLNORMAL3SVPROC glad_glNormal3sv;
-PFNGLNEWLISTPROC glad_glNewList;
-PFNGLCOLOR4USPROC glad_glColor4us;
-PFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv;
-PFNGLLINKPROGRAMPROC glad_glLinkProgram;
-PFNGLHINTPROC glad_glHint;
-PFNGLRECTSPROC glad_glRects;
-PFNGLTEXCOORD2DVPROC glad_glTexCoord2dv;
-PFNGLRASTERPOS4IVPROC glad_glRasterPos4iv;
-PFNGLGETSTRINGPROC glad_glGetString;
-PFNGLVERTEXATTRIBP2UIVPROC glad_glVertexAttribP2uiv;
-PFNGLEDGEFLAGVPROC glad_glEdgeFlagv;
-PFNGLDETACHSHADERPROC glad_glDetachShader;
-PFNGLSCALEFPROC glad_glScalef;
-PFNGLENDQUERYPROC glad_glEndQuery;
-PFNGLSCALEDPROC glad_glScaled;
-PFNGLEDGEFLAGPOINTERPROC glad_glEdgeFlagPointer;
-PFNGLCOPYPIXELSPROC glad_glCopyPixels;
-PFNGLVERTEXATTRIBI2UIPROC glad_glVertexAttribI2ui;
-PFNGLPOPATTRIBPROC glad_glPopAttrib;
-PFNGLDELETETEXTURESPROC glad_glDeleteTextures;
-PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate;
-PFNGLDELETEQUERIESPROC glad_glDeleteQueries;
-PFNGLNORMALP3UIVPROC glad_glNormalP3uiv;
-PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f;
-PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d;
-PFNGLINITNAMESPROC glad_glInitNames;
-PFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v;
-PFNGLCOLOR3DVPROC glad_glColor3dv;
-PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i;
-PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv;
-PFNGLWAITSYNCPROC glad_glWaitSync;
-PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s;
-PFNGLCOLORMATERIALPROC glad_glColorMaterial;
-PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage;
-PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri;
-PFNGLSAMPLERPARAMETERFPROC glad_glSamplerParameterf;
-PFNGLUNIFORM1FPROC glad_glUniform1f;
-PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv;
-PFNGLRENDERMODEPROC glad_glRenderMode;
-PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage;
-PFNGLWINDOWPOS2DVPROC glad_glWindowPos2dv;
-PFNGLUNIFORM1IPROC glad_glUniform1i;
-PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib;
-PFNGLUNIFORM3IPROC glad_glUniform3i;
-PFNGLPIXELTRANSFERIPROC glad_glPixelTransferi;
-PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D;
-PFNGLDISABLEPROC glad_glDisable;
-PFNGLLOGICOPPROC glad_glLogicOp;
-PFNGLEVALPOINT2PROC glad_glEvalPoint2;
-PFNGLPIXELTRANSFERFPROC glad_glPixelTransferf;
-PFNGLSECONDARYCOLOR3IPROC glad_glSecondaryColor3i;
-PFNGLUNIFORM4UIPROC glad_glUniform4ui;
-PFNGLCOLOR3FPROC glad_glColor3f;
-PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer;
-PFNGLGETTEXENVFVPROC glad_glGetTexEnvfv;
-PFNGLRECTFVPROC glad_glRectfv;
-PFNGLCULLFACEPROC glad_glCullFace;
-PFNGLGETLIGHTFVPROC glad_glGetLightfv;
-PFNGLCOLOR3DPROC glad_glColor3d;
-PFNGLTEXGENDPROC glad_glTexGend;
-PFNGLTEXGENIPROC glad_glTexGeni;
-PFNGLMULTITEXCOORD3SPROC glad_glMultiTexCoord3s;
-PFNGLGETSTRINGIPROC glad_glGetStringi;
-PFNGLMULTITEXCOORD3IPROC glad_glMultiTexCoord3i;
-PFNGLMULTITEXCOORD3FPROC glad_glMultiTexCoord3f;
-PFNGLMULTITEXCOORD3DPROC glad_glMultiTexCoord3d;
-PFNGLATTACHSHADERPROC glad_glAttachShader;
-PFNGLFOGCOORDDVPROC glad_glFogCoorddv;
-PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv;
-PFNGLGETTEXGENFVPROC glad_glGetTexGenfv;
-PFNGLQUERYCOUNTERPROC glad_glQueryCounter;
-PFNGLFOGCOORDPOINTERPROC glad_glFogCoordPointer;
-PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex;
-PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D;
-PFNGLTEXGENIVPROC glad_glTexGeniv;
-PFNGLRASTERPOS2DVPROC glad_glRasterPos2dv;
-PFNGLSECONDARYCOLOR3DVPROC glad_glSecondaryColor3dv;
-PFNGLCLIENTACTIVETEXTUREPROC glad_glClientActiveTexture;
-PFNGLVERTEXATTRIBI4SVPROC glad_glVertexAttribI4sv;
-PFNGLSECONDARYCOLOR3USPROC glad_glSecondaryColor3us;
-PFNGLNORMALP3UIPROC glad_glNormalP3ui;
-PFNGLTEXENVFVPROC glad_glTexEnvfv;
-PFNGLREADBUFFERPROC glad_glReadBuffer;
-PFNGLTEXPARAMETERIUIVPROC glad_glTexParameterIuiv;
-PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced;
-PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap;
-PFNGLWINDOWPOS3FVPROC glad_glWindowPos3fv;
-PFNGLLIGHTMODELFVPROC glad_glLightModelfv;
-PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv;
-PFNGLDELETELISTSPROC glad_glDeleteLists;
-PFNGLGETCLIPPLANEPROC glad_glGetClipPlane;
-PFNGLVERTEX4DVPROC glad_glVertex4dv;
-PFNGLTEXCOORD2DPROC glad_glTexCoord2d;
-PFNGLPOPMATRIXPROC glad_glPopMatrix;
-PFNGLTEXCOORD2FPROC glad_glTexCoord2f;
-PFNGLCOLOR4IVPROC glad_glColor4iv;
-PFNGLINDEXUBVPROC glad_glIndexubv;
-PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer;
-PFNGLTEXCOORD2IPROC glad_glTexCoord2i;
-PFNGLRASTERPOS4DPROC glad_glRasterPos4d;
-PFNGLRASTERPOS4FPROC glad_glRasterPos4f;
-PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s;
-PFNGLTEXCOORD2SPROC glad_glTexCoord2s;
-PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer;
-PFNGLVERTEX3FVPROC glad_glVertex3fv;
-PFNGLTEXCOORD4DVPROC glad_glTexCoord4dv;
-PFNGLMATERIALIVPROC glad_glMaterialiv;
-PFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv;
-PFNGLISPROGRAMPROC glad_glIsProgram;
-PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv;
-PFNGLVERTEX4SPROC glad_glVertex4s;
-PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv;
-PFNGLNORMAL3DVPROC glad_glNormal3dv;
-PFNGLUNIFORM4IPROC glad_glUniform4i;
-PFNGLACTIVETEXTUREPROC glad_glActiveTexture;
-PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray;
-PFNGLROTATEDPROC glad_glRotated;
-PFNGLROTATEFPROC glad_glRotatef;
-PFNGLVERTEX4IPROC glad_glVertex4i;
-PFNGLREADPIXELSPROC glad_glReadPixels;
-PFNGLVERTEXATTRIBI3IVPROC glad_glVertexAttribI3iv;
-PFNGLLOADNAMEPROC glad_glLoadName;
-PFNGLUNIFORM4FPROC glad_glUniform4f;
-PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample;
-PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays;
-PFNGLSHADEMODELPROC glad_glShadeModel;
-PFNGLMAPGRID1DPROC glad_glMapGrid1d;
-PFNGLGETUNIFORMFVPROC glad_glGetUniformfv;
-PFNGLMAPGRID1FPROC glad_glMapGrid1f;
-PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv;
-PFNGLDISABLECLIENTSTATEPROC glad_glDisableClientState;
-PFNGLMULTITEXCOORD3SVPROC glad_glMultiTexCoord3sv;
-PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex;
-PFNGLSECONDARYCOLORPOINTERPROC glad_glSecondaryColorPointer;
-PFNGLALPHAFUNCPROC glad_glAlphaFunc;
-PFNGLUNIFORM1IVPROC glad_glUniform1iv;
-PFNGLMULTITEXCOORD4IVPROC glad_glMultiTexCoord4iv;
-PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv;
-PFNGLSTENCILFUNCPROC glad_glStencilFunc;
-PFNGLMULTITEXCOORD1FVPROC glad_glMultiTexCoord1fv;
-PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding;
-PFNGLCOLOR4UIVPROC glad_glColor4uiv;
-PFNGLRECTIVPROC glad_glRectiv;
-PFNGLCOLORP4UIPROC glad_glColorP4ui;
-PFNGLRASTERPOS3DVPROC glad_glRasterPos3dv;
-PFNGLEVALMESH2PROC glad_glEvalMesh2;
-PFNGLEVALMESH1PROC glad_glEvalMesh1;
-PFNGLTEXCOORDPOINTERPROC glad_glTexCoordPointer;
-PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv;
-PFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv;
-PFNGLEVALCOORD2FVPROC glad_glEvalCoord2fv;
-PFNGLCOLOR4UBVPROC glad_glColor4ubv;
-PFNGLLOADTRANSPOSEMATRIXDPROC glad_glLoadTransposeMatrixd;
-PFNGLLOADTRANSPOSEMATRIXFPROC glad_glLoadTransposeMatrixf;
-PFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i;
-PFNGLRASTERPOS2IVPROC glad_glRasterPos2iv;
-PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData;
-PFNGLTEXENVIVPROC glad_glTexEnviv;
-PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate;
-PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui;
-PFNGLGENBUFFERSPROC glad_glGenBuffers;
-PFNGLSELECTBUFFERPROC glad_glSelectBuffer;
-PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv;
-PFNGLPUSHATTRIBPROC glad_glPushAttrib;
-PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer;
-PFNGLBLENDFUNCPROC glad_glBlendFunc;
-PFNGLCREATEPROGRAMPROC glad_glCreateProgram;
-PFNGLTEXIMAGE3DPROC glad_glTexImage3D;
-PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer;
-PFNGLLIGHTIVPROC glad_glLightiv;
-PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex;
-PFNGLTEXGENFVPROC glad_glTexGenfv;
-PFNGLENDPROC glad_glEnd;
-PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers;
-PFNGLSCISSORPROC glad_glScissor;
-PFNGLTEXCOORDP4UIVPROC glad_glTexCoordP4uiv;
-PFNGLCLIPPLANEPROC glad_glClipPlane;
-PFNGLPUSHNAMEPROC glad_glPushName;
-PFNGLTEXGENDVPROC glad_glTexGendv;
-PFNGLINDEXUBPROC glad_glIndexub;
-PFNGLVERTEXP2UIVPROC glad_glVertexP2uiv;
-PFNGLSECONDARYCOLOR3IVPROC glad_glSecondaryColor3iv;
-PFNGLRASTERPOS4IPROC glad_glRasterPos4i;
-PFNGLMULTTRANSPOSEMATRIXDPROC glad_glMultTransposeMatrixd;
-PFNGLCLEARCOLORPROC glad_glClearColor;
-PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv;
-PFNGLNORMAL3SPROC glad_glNormal3s;
-PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv;
-PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv;
-PFNGLPOINTPARAMETERIPROC glad_glPointParameteri;
-PFNGLCOLORP4UIVPROC glad_glColorP4uiv;
-PFNGLBLENDCOLORPROC glad_glBlendColor;
-PFNGLWINDOWPOS3DPROC glad_glWindowPos3d;
-PFNGLVERTEXATTRIBI2UIVPROC glad_glVertexAttribI2uiv;
-PFNGLSAMPLERPARAMETERIUIVPROC glad_glSamplerParameterIuiv;
-PFNGLUNIFORM3UIPROC glad_glUniform3ui;
-PFNGLCOLOR4DVPROC glad_glColor4dv;
-PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv;
-PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv;
-PFNGLUNIFORM2FVPROC glad_glUniform2fv;
-PFNGLSECONDARYCOLOR3UBPROC glad_glSecondaryColor3ub;
-PFNGLSECONDARYCOLOR3UIPROC glad_glSecondaryColor3ui;
-PFNGLTEXCOORD3DVPROC glad_glTexCoord3dv;
-PFNGLGETSAMPLERPARAMETERIUIVPROC glad_glGetSamplerParameterIuiv;
-PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange;
-PFNGLNORMAL3IVPROC glad_glNormal3iv;
-PFNGLWINDOWPOS3SPROC glad_glWindowPos3s;
-PFNGLPOINTPARAMETERFPROC glad_glPointParameterf;
-PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv;
-PFNGLWINDOWPOS3IPROC glad_glWindowPos3i;
-PFNGLMULTITEXCOORD4SPROC glad_glMultiTexCoord4s;
-PFNGLWINDOWPOS3FPROC glad_glWindowPos3f;
-PFNGLCOLOR3USPROC glad_glColor3us;
-PFNGLCOLOR3UIVPROC glad_glColor3uiv;
-PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv;
-PFNGLGETLIGHTIVPROC glad_glGetLightiv;
-PFNGLDEPTHFUNCPROC glad_glDepthFunc;
-PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D;
-PFNGLLISTBASEPROC glad_glListBase;
-PFNGLMULTITEXCOORD4FPROC glad_glMultiTexCoord4f;
-PFNGLCOLOR3UBPROC glad_glColor3ub;
-PFNGLMULTITEXCOORD4DPROC glad_glMultiTexCoord4d;
-PFNGLVERTEXATTRIBI4BVPROC glad_glVertexAttribI4bv;
-PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv;
-PFNGLCOLOR3UIPROC glad_glColor3ui;
-PFNGLMULTITEXCOORD4IPROC glad_glMultiTexCoord4i;
-PFNGLGETPOLYGONSTIPPLEPROC glad_glGetPolygonStipple;
-PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync;
-PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui;
-PFNGLMULTITEXCOORD4DVPROC glad_glMultiTexCoord4dv;
-PFNGLCOLORMASKPROC glad_glColorMask;
-PFNGLTEXPARAMETERIIVPROC glad_glTexParameterIiv;
-PFNGLBLENDEQUATIONPROC glad_glBlendEquation;
-PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation;
-PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv;
-PFNGLRASTERPOS4SPROC glad_glRasterPos4s;
-PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback;
-PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv;
-PFNGLMULTITEXCOORD3DVPROC glad_glMultiTexCoord3dv;
-PFNGLCOLOR4SVPROC glad_glColor4sv;
-PFNGLPOPCLIENTATTRIBPROC glad_glPopClientAttrib;
-PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback;
-PFNGLFOGFPROC glad_glFogf;
-PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv;
-PFNGLISSAMPLERPROC glad_glIsSampler;
-PFNGLVERTEXP3UIPROC glad_glVertexP3ui;
-PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor;
-PFNGLCOLOR3IVPROC glad_glColor3iv;
-PFNGLCOMPRESSEDTEXIMAGE1DPROC glad_glCompressedTexImage1D;
-PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D;
-PFNGLTEXCOORD1IPROC glad_glTexCoord1i;
-PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus;
-PFNGLTEXCOORD1DPROC glad_glTexCoord1d;
-PFNGLTEXCOORD1FPROC glad_glTexCoord1f;
-PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender;
-PFNGLENABLECLIENTSTATEPROC glad_glEnableClientState;
-PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation;
-PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv;
-PFNGLMULTITEXCOORD2SVPROC glad_glMultiTexCoord2sv;
-PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv;
-PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements;
-PFNGLTEXCOORD1SPROC glad_glTexCoord1s;
-PFNGLBINDBUFFERBASEPROC glad_glBindBufferBase;
-PFNGLBUFFERSUBDATAPROC glad_glBufferSubData;
-PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv;
-PFNGLGENLISTSPROC glad_glGenLists;
-PFNGLCOLOR3BVPROC glad_glColor3bv;
-PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange;
-PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture;
-PFNGLGETTEXGENDVPROC glad_glGetTexGendv;
-PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays;
-PFNGLENDLISTPROC glad_glEndList;
-PFNGLVERTEXP4UIVPROC glad_glVertexP4uiv;
-PFNGLUNIFORM2UIPROC glad_glUniform2ui;
-PFNGLVERTEXATTRIBI2IVPROC glad_glVertexAttribI2iv;
-PFNGLCOLOR3USVPROC glad_glColor3usv;
-PFNGLWINDOWPOS2FVPROC glad_glWindowPos2fv;
-PFNGLDISABLEIPROC glad_glDisablei;
-PFNGLINDEXMASKPROC glad_glIndexMask;
-PFNGLPUSHCLIENTATTRIBPROC glad_glPushClientAttrib;
-PFNGLSHADERSOURCEPROC glad_glShaderSource;
-PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName;
-PFNGLVERTEXATTRIBI3UIVPROC glad_glVertexAttribI3uiv;
-PFNGLCLEARACCUMPROC glad_glClearAccum;
-PFNGLGETSYNCIVPROC glad_glGetSynciv;
-PFNGLTEXCOORDP2UIVPROC glad_glTexCoordP2uiv;
-PFNGLUNIFORM2FPROC glad_glUniform2f;
-PFNGLBEGINQUERYPROC glad_glBeginQuery;
-PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex;
-PFNGLBINDBUFFERPROC glad_glBindBuffer;
-PFNGLMAP2DPROC glad_glMap2d;
-PFNGLMAP2FPROC glad_glMap2f;
-PFNGLVERTEX4DPROC glad_glVertex4d;
-PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv;
-PFNGLTEXCOORD1SVPROC glad_glTexCoord1sv;
-PFNGLBUFFERDATAPROC glad_glBufferData;
-PFNGLEVALPOINT1PROC glad_glEvalPoint1;
-PFNGLGETTEXPARAMETERIIVPROC glad_glGetTexParameterIiv;
-PFNGLTEXCOORD1DVPROC glad_glTexCoord1dv;
-PFNGLTEXCOORDP1UIPROC glad_glTexCoordP1ui;
-PFNGLGETERRORPROC glad_glGetError;
-PFNGLGETTEXENVIVPROC glad_glGetTexEnviv;
-PFNGLGETPROGRAMIVPROC glad_glGetProgramiv;
-PFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui;
-PFNGLGETFLOATVPROC glad_glGetFloatv;
-PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D;
-PFNGLMULTITEXCOORD2FVPROC glad_glMultiTexCoord2fv;
-PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv;
-PFNGLEVALCOORD1DPROC glad_glEvalCoord1d;
-PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv;
-PFNGLEVALCOORD1FPROC glad_glEvalCoord1f;
-PFNGLPIXELMAPFVPROC glad_glPixelMapfv;
-PFNGLVERTEXATTRIBP3UIVPROC glad_glVertexAttribP3uiv;
-PFNGLGETPIXELMAPUSVPROC glad_glGetPixelMapusv;
-PFNGLSECONDARYCOLORP3UIVPROC glad_glSecondaryColorP3uiv;
-PFNGLGETINTEGERVPROC glad_glGetIntegerv;
-PFNGLACCUMPROC glad_glAccum;
-PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv;
-PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv;
-PFNGLRASTERPOS4DVPROC glad_glRasterPos4dv;
-PFNGLTEXCOORD2IVPROC glad_glTexCoord2iv;
-PFNGLISQUERYPROC glad_glIsQuery;
-PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv;
-PFNGLWINDOWPOS3DVPROC glad_glWindowPos3dv;
-PFNGLTEXIMAGE2DPROC glad_glTexImage2D;
-PFNGLSTENCILMASKPROC glad_glStencilMask;
-PFNGLDRAWPIXELSPROC glad_glDrawPixels;
-PFNGLMULTMATRIXDPROC glad_glMultMatrixd;
-PFNGLMULTMATRIXFPROC glad_glMultMatrixf;
-PFNGLISTEXTUREPROC glad_glIsTexture;
-PFNGLGETMATERIALIVPROC glad_glGetMaterialiv;
-PFNGLUNIFORM1FVPROC glad_glUniform1fv;
-PFNGLLOADMATRIXFPROC glad_glLoadMatrixf;
-PFNGLLOADMATRIXDPROC glad_glLoadMatrixd;
-PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv;
-PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv;
-PFNGLVERTEX4FPROC glad_glVertex4f;
-PFNGLRECTSVPROC glad_glRectsv;
-PFNGLCOLOR4USVPROC glad_glColor4usv;
-PFNGLPOLYGONSTIPPLEPROC glad_glPolygonStipple;
-PFNGLINTERLEAVEDARRAYSPROC glad_glInterleavedArrays;
-PFNGLNORMAL3IPROC glad_glNormal3i;
-PFNGLNORMAL3FPROC glad_glNormal3f;
-PFNGLNORMAL3DPROC glad_glNormal3d;
-PFNGLNORMAL3BPROC glad_glNormal3b;
-PFNGLPIXELMAPUSVPROC glad_glPixelMapusv;
-PFNGLGETTEXGENIVPROC glad_glGetTexGeniv;
-PFNGLARRAYELEMENTPROC glad_glArrayElement;
-PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData;
-PFNGLVERTEXATTRIBI1UIVPROC glad_glVertexAttribI1uiv;
-PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d;
-PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f;
-PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv;
-PFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v;
-PFNGLDEPTHMASKPROC glad_glDepthMask;
-PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s;
-PFNGLCOLOR3FVPROC glad_glColor3fv;
-PFNGLTEXIMAGE3DMULTISAMPLEPROC glad_glTexImage3DMultisample;
-PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv;
-PFNGLUNIFORM4FVPROC glad_glUniform4fv;
-PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform;
-PFNGLCOLORPOINTERPROC glad_glColorPointer;
-PFNGLFRONTFACEPROC glad_glFrontFace;
-PFNGLGETBOOLEANI_VPROC glad_glGetBooleani_v;
-PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv;
-int GLAD_GL_ARB_framebuffer_object;
-int GLAD_GL_EXT_framebuffer_object;
-int GLAD_GL_ARB_debug_output;
-PFNGLDEBUGMESSAGECONTROLARBPROC glad_glDebugMessageControlARB;
-PFNGLDEBUGMESSAGEINSERTARBPROC glad_glDebugMessageInsertARB;
-PFNGLDEBUGMESSAGECALLBACKARBPROC glad_glDebugMessageCallbackARB;
-PFNGLGETDEBUGMESSAGELOGARBPROC glad_glGetDebugMessageLogARB;
-PFNGLISRENDERBUFFEREXTPROC glad_glIsRenderbufferEXT;
-PFNGLBINDRENDERBUFFEREXTPROC glad_glBindRenderbufferEXT;
-PFNGLDELETERENDERBUFFERSEXTPROC glad_glDeleteRenderbuffersEXT;
-PFNGLGENRENDERBUFFERSEXTPROC glad_glGenRenderbuffersEXT;
-PFNGLRENDERBUFFERSTORAGEEXTPROC glad_glRenderbufferStorageEXT;
-PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glad_glGetRenderbufferParameterivEXT;
-PFNGLISFRAMEBUFFEREXTPROC glad_glIsFramebufferEXT;
-PFNGLBINDFRAMEBUFFEREXTPROC glad_glBindFramebufferEXT;
-PFNGLDELETEFRAMEBUFFERSEXTPROC glad_glDeleteFramebuffersEXT;
-PFNGLGENFRAMEBUFFERSEXTPROC glad_glGenFramebuffersEXT;
-PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glad_glCheckFramebufferStatusEXT;
-PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glad_glFramebufferTexture1DEXT;
-PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glad_glFramebufferTexture2DEXT;
-PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glad_glFramebufferTexture3DEXT;
-PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glad_glFramebufferRenderbufferEXT;
-PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glad_glGetFramebufferAttachmentParameterivEXT;
-PFNGLGENERATEMIPMAPEXTPROC glad_glGenerateMipmapEXT;
+int GLAD_GL_VERSION_1_0 = 0;
+int GLAD_GL_VERSION_1_1 = 0;
+int GLAD_GL_VERSION_1_2 = 0;
+int GLAD_GL_VERSION_1_3 = 0;
+int GLAD_GL_VERSION_1_4 = 0;
+int GLAD_GL_VERSION_1_5 = 0;
+int GLAD_GL_VERSION_2_0 = 0;
+int GLAD_GL_VERSION_2_1 = 0;
+int GLAD_GL_VERSION_3_0 = 0;
+int GLAD_GL_VERSION_3_1 = 0;
+int GLAD_GL_VERSION_3_2 = 0;
+int GLAD_GL_VERSION_3_3 = 0;
+PFNGLACCUMPROC glad_glAccum = NULL;
+PFNGLACTIVETEXTUREPROC glad_glActiveTexture = NULL;
+PFNGLALPHAFUNCPROC glad_glAlphaFunc = NULL;
+PFNGLARETEXTURESRESIDENTPROC glad_glAreTexturesResident = NULL;
+PFNGLARRAYELEMENTPROC glad_glArrayElement = NULL;
+PFNGLATTACHSHADERPROC glad_glAttachShader = NULL;
+PFNGLBEGINPROC glad_glBegin = NULL;
+PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender = NULL;
+PFNGLBEGINQUERYPROC glad_glBeginQuery = NULL;
+PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback = NULL;
+PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation = NULL;
+PFNGLBINDBUFFERPROC glad_glBindBuffer = NULL;
+PFNGLBINDBUFFERBASEPROC glad_glBindBufferBase = NULL;
+PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange = NULL;
+PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation = NULL;
+PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed = NULL;
+PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer = NULL;
+PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer = NULL;
+PFNGLBINDSAMPLERPROC glad_glBindSampler = NULL;
+PFNGLBINDTEXTUREPROC glad_glBindTexture = NULL;
+PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray = NULL;
+PFNGLBITMAPPROC glad_glBitmap = NULL;
+PFNGLBLENDCOLORPROC glad_glBlendColor = NULL;
+PFNGLBLENDEQUATIONPROC glad_glBlendEquation = NULL;
+PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate = NULL;
+PFNGLBLENDFUNCPROC glad_glBlendFunc = NULL;
+PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate = NULL;
+PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer = NULL;
+PFNGLBUFFERDATAPROC glad_glBufferData = NULL;
+PFNGLBUFFERSUBDATAPROC glad_glBufferSubData = NULL;
+PFNGLCALLLISTPROC glad_glCallList = NULL;
+PFNGLCALLLISTSPROC glad_glCallLists = NULL;
+PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus = NULL;
+PFNGLCLAMPCOLORPROC glad_glClampColor = NULL;
+PFNGLCLEARPROC glad_glClear = NULL;
+PFNGLCLEARACCUMPROC glad_glClearAccum = NULL;
+PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi = NULL;
+PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv = NULL;
+PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv = NULL;
+PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv = NULL;
+PFNGLCLEARCOLORPROC glad_glClearColor = NULL;
+PFNGLCLEARDEPTHPROC glad_glClearDepth = NULL;
+PFNGLCLEARINDEXPROC glad_glClearIndex = NULL;
+PFNGLCLEARSTENCILPROC glad_glClearStencil = NULL;
+PFNGLCLIENTACTIVETEXTUREPROC glad_glClientActiveTexture = NULL;
+PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync = NULL;
+PFNGLCLIPPLANEPROC glad_glClipPlane = NULL;
+PFNGLCOLOR3BPROC glad_glColor3b = NULL;
+PFNGLCOLOR3BVPROC glad_glColor3bv = NULL;
+PFNGLCOLOR3DPROC glad_glColor3d = NULL;
+PFNGLCOLOR3DVPROC glad_glColor3dv = NULL;
+PFNGLCOLOR3FPROC glad_glColor3f = NULL;
+PFNGLCOLOR3FVPROC glad_glColor3fv = NULL;
+PFNGLCOLOR3IPROC glad_glColor3i = NULL;
+PFNGLCOLOR3IVPROC glad_glColor3iv = NULL;
+PFNGLCOLOR3SPROC glad_glColor3s = NULL;
+PFNGLCOLOR3SVPROC glad_glColor3sv = NULL;
+PFNGLCOLOR3UBPROC glad_glColor3ub = NULL;
+PFNGLCOLOR3UBVPROC glad_glColor3ubv = NULL;
+PFNGLCOLOR3UIPROC glad_glColor3ui = NULL;
+PFNGLCOLOR3UIVPROC glad_glColor3uiv = NULL;
+PFNGLCOLOR3USPROC glad_glColor3us = NULL;
+PFNGLCOLOR3USVPROC glad_glColor3usv = NULL;
+PFNGLCOLOR4BPROC glad_glColor4b = NULL;
+PFNGLCOLOR4BVPROC glad_glColor4bv = NULL;
+PFNGLCOLOR4DPROC glad_glColor4d = NULL;
+PFNGLCOLOR4DVPROC glad_glColor4dv = NULL;
+PFNGLCOLOR4FPROC glad_glColor4f = NULL;
+PFNGLCOLOR4FVPROC glad_glColor4fv = NULL;
+PFNGLCOLOR4IPROC glad_glColor4i = NULL;
+PFNGLCOLOR4IVPROC glad_glColor4iv = NULL;
+PFNGLCOLOR4SPROC glad_glColor4s = NULL;
+PFNGLCOLOR4SVPROC glad_glColor4sv = NULL;
+PFNGLCOLOR4UBPROC glad_glColor4ub = NULL;
+PFNGLCOLOR4UBVPROC glad_glColor4ubv = NULL;
+PFNGLCOLOR4UIPROC glad_glColor4ui = NULL;
+PFNGLCOLOR4UIVPROC glad_glColor4uiv = NULL;
+PFNGLCOLOR4USPROC glad_glColor4us = NULL;
+PFNGLCOLOR4USVPROC glad_glColor4usv = NULL;
+PFNGLCOLORMASKPROC glad_glColorMask = NULL;
+PFNGLCOLORMASKIPROC glad_glColorMaski = NULL;
+PFNGLCOLORMATERIALPROC glad_glColorMaterial = NULL;
+PFNGLCOLORP3UIPROC glad_glColorP3ui = NULL;
+PFNGLCOLORP3UIVPROC glad_glColorP3uiv = NULL;
+PFNGLCOLORP4UIPROC glad_glColorP4ui = NULL;
+PFNGLCOLORP4UIVPROC glad_glColorP4uiv = NULL;
+PFNGLCOLORPOINTERPROC glad_glColorPointer = NULL;
+PFNGLCOMPILESHADERPROC glad_glCompileShader = NULL;
+PFNGLCOMPRESSEDTEXIMAGE1DPROC glad_glCompressedTexImage1D = NULL;
+PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D = NULL;
+PFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D = NULL;
+PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D = NULL;
+PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D = NULL;
+PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D = NULL;
+PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData = NULL;
+PFNGLCOPYPIXELSPROC glad_glCopyPixels = NULL;
+PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D = NULL;
+PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D = NULL;
+PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D = NULL;
+PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D = NULL;
+PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D = NULL;
+PFNGLCREATEPROGRAMPROC glad_glCreateProgram = NULL;
+PFNGLCREATESHADERPROC glad_glCreateShader = NULL;
+PFNGLCULLFACEPROC glad_glCullFace = NULL;
+PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers = NULL;
+PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers = NULL;
+PFNGLDELETELISTSPROC glad_glDeleteLists = NULL;
+PFNGLDELETEPROGRAMPROC glad_glDeleteProgram = NULL;
+PFNGLDELETEQUERIESPROC glad_glDeleteQueries = NULL;
+PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers = NULL;
+PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers = NULL;
+PFNGLDELETESHADERPROC glad_glDeleteShader = NULL;
+PFNGLDELETESYNCPROC glad_glDeleteSync = NULL;
+PFNGLDELETETEXTURESPROC glad_glDeleteTextures = NULL;
+PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays = NULL;
+PFNGLDEPTHFUNCPROC glad_glDepthFunc = NULL;
+PFNGLDEPTHMASKPROC glad_glDepthMask = NULL;
+PFNGLDEPTHRANGEPROC glad_glDepthRange = NULL;
+PFNGLDETACHSHADERPROC glad_glDetachShader = NULL;
+PFNGLDISABLEPROC glad_glDisable = NULL;
+PFNGLDISABLECLIENTSTATEPROC glad_glDisableClientState = NULL;
+PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray = NULL;
+PFNGLDISABLEIPROC glad_glDisablei = NULL;
+PFNGLDRAWARRAYSPROC glad_glDrawArrays = NULL;
+PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced = NULL;
+PFNGLDRAWBUFFERPROC glad_glDrawBuffer = NULL;
+PFNGLDRAWBUFFERSPROC glad_glDrawBuffers = NULL;
+PFNGLDRAWELEMENTSPROC glad_glDrawElements = NULL;
+PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex = NULL;
+PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced = NULL;
+PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex = NULL;
+PFNGLDRAWPIXELSPROC glad_glDrawPixels = NULL;
+PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements = NULL;
+PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex = NULL;
+PFNGLEDGEFLAGPROC glad_glEdgeFlag = NULL;
+PFNGLEDGEFLAGPOINTERPROC glad_glEdgeFlagPointer = NULL;
+PFNGLEDGEFLAGVPROC glad_glEdgeFlagv = NULL;
+PFNGLENABLEPROC glad_glEnable = NULL;
+PFNGLENABLECLIENTSTATEPROC glad_glEnableClientState = NULL;
+PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray = NULL;
+PFNGLENABLEIPROC glad_glEnablei = NULL;
+PFNGLENDPROC glad_glEnd = NULL;
+PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender = NULL;
+PFNGLENDLISTPROC glad_glEndList = NULL;
+PFNGLENDQUERYPROC glad_glEndQuery = NULL;
+PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback = NULL;
+PFNGLEVALCOORD1DPROC glad_glEvalCoord1d = NULL;
+PFNGLEVALCOORD1DVPROC glad_glEvalCoord1dv = NULL;
+PFNGLEVALCOORD1FPROC glad_glEvalCoord1f = NULL;
+PFNGLEVALCOORD1FVPROC glad_glEvalCoord1fv = NULL;
+PFNGLEVALCOORD2DPROC glad_glEvalCoord2d = NULL;
+PFNGLEVALCOORD2DVPROC glad_glEvalCoord2dv = NULL;
+PFNGLEVALCOORD2FPROC glad_glEvalCoord2f = NULL;
+PFNGLEVALCOORD2FVPROC glad_glEvalCoord2fv = NULL;
+PFNGLEVALMESH1PROC glad_glEvalMesh1 = NULL;
+PFNGLEVALMESH2PROC glad_glEvalMesh2 = NULL;
+PFNGLEVALPOINT1PROC glad_glEvalPoint1 = NULL;
+PFNGLEVALPOINT2PROC glad_glEvalPoint2 = NULL;
+PFNGLFEEDBACKBUFFERPROC glad_glFeedbackBuffer = NULL;
+PFNGLFENCESYNCPROC glad_glFenceSync = NULL;
+PFNGLFINISHPROC glad_glFinish = NULL;
+PFNGLFLUSHPROC glad_glFlush = NULL;
+PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange = NULL;
+PFNGLFOGCOORDPOINTERPROC glad_glFogCoordPointer = NULL;
+PFNGLFOGCOORDDPROC glad_glFogCoordd = NULL;
+PFNGLFOGCOORDDVPROC glad_glFogCoorddv = NULL;
+PFNGLFOGCOORDFPROC glad_glFogCoordf = NULL;
+PFNGLFOGCOORDFVPROC glad_glFogCoordfv = NULL;
+PFNGLFOGFPROC glad_glFogf = NULL;
+PFNGLFOGFVPROC glad_glFogfv = NULL;
+PFNGLFOGIPROC glad_glFogi = NULL;
+PFNGLFOGIVPROC glad_glFogiv = NULL;
+PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer = NULL;
+PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture = NULL;
+PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D = NULL;
+PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D = NULL;
+PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D = NULL;
+PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer = NULL;
+PFNGLFRONTFACEPROC glad_glFrontFace = NULL;
+PFNGLFRUSTUMPROC glad_glFrustum = NULL;
+PFNGLGENBUFFERSPROC glad_glGenBuffers = NULL;
+PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers = NULL;
+PFNGLGENLISTSPROC glad_glGenLists = NULL;
+PFNGLGENQUERIESPROC glad_glGenQueries = NULL;
+PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers = NULL;
+PFNGLGENSAMPLERSPROC glad_glGenSamplers = NULL;
+PFNGLGENTEXTURESPROC glad_glGenTextures = NULL;
+PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays = NULL;
+PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap = NULL;
+PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib = NULL;
+PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform = NULL;
+PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName = NULL;
+PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv = NULL;
+PFNGLGETACTIVEUNIFORMNAMEPROC glad_glGetActiveUniformName = NULL;
+PFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv = NULL;
+PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders = NULL;
+PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation = NULL;
+PFNGLGETBOOLEANI_VPROC glad_glGetBooleani_v = NULL;
+PFNGLGETBOOLEANVPROC glad_glGetBooleanv = NULL;
+PFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v = NULL;
+PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv = NULL;
+PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv = NULL;
+PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData = NULL;
+PFNGLGETCLIPPLANEPROC glad_glGetClipPlane = NULL;
+PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage = NULL;
+PFNGLGETDOUBLEVPROC glad_glGetDoublev = NULL;
+PFNGLGETERRORPROC glad_glGetError = NULL;
+PFNGLGETFLOATVPROC glad_glGetFloatv = NULL;
+PFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex = NULL;
+PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation = NULL;
+PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv = NULL;
+PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v = NULL;
+PFNGLGETINTEGER64VPROC glad_glGetInteger64v = NULL;
+PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v = NULL;
+PFNGLGETINTEGERVPROC glad_glGetIntegerv = NULL;
+PFNGLGETLIGHTFVPROC glad_glGetLightfv = NULL;
+PFNGLGETLIGHTIVPROC glad_glGetLightiv = NULL;
+PFNGLGETMAPDVPROC glad_glGetMapdv = NULL;
+PFNGLGETMAPFVPROC glad_glGetMapfv = NULL;
+PFNGLGETMAPIVPROC glad_glGetMapiv = NULL;
+PFNGLGETMATERIALFVPROC glad_glGetMaterialfv = NULL;
+PFNGLGETMATERIALIVPROC glad_glGetMaterialiv = NULL;
+PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv = NULL;
+PFNGLGETPIXELMAPFVPROC glad_glGetPixelMapfv = NULL;
+PFNGLGETPIXELMAPUIVPROC glad_glGetPixelMapuiv = NULL;
+PFNGLGETPIXELMAPUSVPROC glad_glGetPixelMapusv = NULL;
+PFNGLGETPOINTERVPROC glad_glGetPointerv = NULL;
+PFNGLGETPOLYGONSTIPPLEPROC glad_glGetPolygonStipple = NULL;
+PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog = NULL;
+PFNGLGETPROGRAMIVPROC glad_glGetProgramiv = NULL;
+PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v = NULL;
+PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv = NULL;
+PFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v = NULL;
+PFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv = NULL;
+PFNGLGETQUERYIVPROC glad_glGetQueryiv = NULL;
+PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv = NULL;
+PFNGLGETSAMPLERPARAMETERIIVPROC glad_glGetSamplerParameterIiv = NULL;
+PFNGLGETSAMPLERPARAMETERIUIVPROC glad_glGetSamplerParameterIuiv = NULL;
+PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv = NULL;
+PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv = NULL;
+PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog = NULL;
+PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource = NULL;
+PFNGLGETSHADERIVPROC glad_glGetShaderiv = NULL;
+PFNGLGETSTRINGPROC glad_glGetString = NULL;
+PFNGLGETSTRINGIPROC glad_glGetStringi = NULL;
+PFNGLGETSYNCIVPROC glad_glGetSynciv = NULL;
+PFNGLGETTEXENVFVPROC glad_glGetTexEnvfv = NULL;
+PFNGLGETTEXENVIVPROC glad_glGetTexEnviv = NULL;
+PFNGLGETTEXGENDVPROC glad_glGetTexGendv = NULL;
+PFNGLGETTEXGENFVPROC glad_glGetTexGenfv = NULL;
+PFNGLGETTEXGENIVPROC glad_glGetTexGeniv = NULL;
+PFNGLGETTEXIMAGEPROC glad_glGetTexImage = NULL;
+PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv = NULL;
+PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv = NULL;
+PFNGLGETTEXPARAMETERIIVPROC glad_glGetTexParameterIiv = NULL;
+PFNGLGETTEXPARAMETERIUIVPROC glad_glGetTexParameterIuiv = NULL;
+PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv = NULL;
+PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv = NULL;
+PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying = NULL;
+PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex = NULL;
+PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices = NULL;
+PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation = NULL;
+PFNGLGETUNIFORMFVPROC glad_glGetUniformfv = NULL;
+PFNGLGETUNIFORMIVPROC glad_glGetUniformiv = NULL;
+PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv = NULL;
+PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv = NULL;
+PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv = NULL;
+PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv = NULL;
+PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv = NULL;
+PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv = NULL;
+PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv = NULL;
+PFNGLHINTPROC glad_glHint = NULL;
+PFNGLINDEXMASKPROC glad_glIndexMask = NULL;
+PFNGLINDEXPOINTERPROC glad_glIndexPointer = NULL;
+PFNGLINDEXDPROC glad_glIndexd = NULL;
+PFNGLINDEXDVPROC glad_glIndexdv = NULL;
+PFNGLINDEXFPROC glad_glIndexf = NULL;
+PFNGLINDEXFVPROC glad_glIndexfv = NULL;
+PFNGLINDEXIPROC glad_glIndexi = NULL;
+PFNGLINDEXIVPROC glad_glIndexiv = NULL;
+PFNGLINDEXSPROC glad_glIndexs = NULL;
+PFNGLINDEXSVPROC glad_glIndexsv = NULL;
+PFNGLINDEXUBPROC glad_glIndexub = NULL;
+PFNGLINDEXUBVPROC glad_glIndexubv = NULL;
+PFNGLINITNAMESPROC glad_glInitNames = NULL;
+PFNGLINTERLEAVEDARRAYSPROC glad_glInterleavedArrays = NULL;
+PFNGLISBUFFERPROC glad_glIsBuffer = NULL;
+PFNGLISENABLEDPROC glad_glIsEnabled = NULL;
+PFNGLISENABLEDIPROC glad_glIsEnabledi = NULL;
+PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer = NULL;
+PFNGLISLISTPROC glad_glIsList = NULL;
+PFNGLISPROGRAMPROC glad_glIsProgram = NULL;
+PFNGLISQUERYPROC glad_glIsQuery = NULL;
+PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer = NULL;
+PFNGLISSAMPLERPROC glad_glIsSampler = NULL;
+PFNGLISSHADERPROC glad_glIsShader = NULL;
+PFNGLISSYNCPROC glad_glIsSync = NULL;
+PFNGLISTEXTUREPROC glad_glIsTexture = NULL;
+PFNGLISVERTEXARRAYPROC glad_glIsVertexArray = NULL;
+PFNGLLIGHTMODELFPROC glad_glLightModelf = NULL;
+PFNGLLIGHTMODELFVPROC glad_glLightModelfv = NULL;
+PFNGLLIGHTMODELIPROC glad_glLightModeli = NULL;
+PFNGLLIGHTMODELIVPROC glad_glLightModeliv = NULL;
+PFNGLLIGHTFPROC glad_glLightf = NULL;
+PFNGLLIGHTFVPROC glad_glLightfv = NULL;
+PFNGLLIGHTIPROC glad_glLighti = NULL;
+PFNGLLIGHTIVPROC glad_glLightiv = NULL;
+PFNGLLINESTIPPLEPROC glad_glLineStipple = NULL;
+PFNGLLINEWIDTHPROC glad_glLineWidth = NULL;
+PFNGLLINKPROGRAMPROC glad_glLinkProgram = NULL;
+PFNGLLISTBASEPROC glad_glListBase = NULL;
+PFNGLLOADIDENTITYPROC glad_glLoadIdentity = NULL;
+PFNGLLOADMATRIXDPROC glad_glLoadMatrixd = NULL;
+PFNGLLOADMATRIXFPROC glad_glLoadMatrixf = NULL;
+PFNGLLOADNAMEPROC glad_glLoadName = NULL;
+PFNGLLOADTRANSPOSEMATRIXDPROC glad_glLoadTransposeMatrixd = NULL;
+PFNGLLOADTRANSPOSEMATRIXFPROC glad_glLoadTransposeMatrixf = NULL;
+PFNGLLOGICOPPROC glad_glLogicOp = NULL;
+PFNGLMAP1DPROC glad_glMap1d = NULL;
+PFNGLMAP1FPROC glad_glMap1f = NULL;
+PFNGLMAP2DPROC glad_glMap2d = NULL;
+PFNGLMAP2FPROC glad_glMap2f = NULL;
+PFNGLMAPBUFFERPROC glad_glMapBuffer = NULL;
+PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange = NULL;
+PFNGLMAPGRID1DPROC glad_glMapGrid1d = NULL;
+PFNGLMAPGRID1FPROC glad_glMapGrid1f = NULL;
+PFNGLMAPGRID2DPROC glad_glMapGrid2d = NULL;
+PFNGLMAPGRID2FPROC glad_glMapGrid2f = NULL;
+PFNGLMATERIALFPROC glad_glMaterialf = NULL;
+PFNGLMATERIALFVPROC glad_glMaterialfv = NULL;
+PFNGLMATERIALIPROC glad_glMateriali = NULL;
+PFNGLMATERIALIVPROC glad_glMaterialiv = NULL;
+PFNGLMATRIXMODEPROC glad_glMatrixMode = NULL;
+PFNGLMULTMATRIXDPROC glad_glMultMatrixd = NULL;
+PFNGLMULTMATRIXFPROC glad_glMultMatrixf = NULL;
+PFNGLMULTTRANSPOSEMATRIXDPROC glad_glMultTransposeMatrixd = NULL;
+PFNGLMULTTRANSPOSEMATRIXFPROC glad_glMultTransposeMatrixf = NULL;
+PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays = NULL;
+PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements = NULL;
+PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex = NULL;
+PFNGLMULTITEXCOORD1DPROC glad_glMultiTexCoord1d = NULL;
+PFNGLMULTITEXCOORD1DVPROC glad_glMultiTexCoord1dv = NULL;
+PFNGLMULTITEXCOORD1FPROC glad_glMultiTexCoord1f = NULL;
+PFNGLMULTITEXCOORD1FVPROC glad_glMultiTexCoord1fv = NULL;
+PFNGLMULTITEXCOORD1IPROC glad_glMultiTexCoord1i = NULL;
+PFNGLMULTITEXCOORD1IVPROC glad_glMultiTexCoord1iv = NULL;
+PFNGLMULTITEXCOORD1SPROC glad_glMultiTexCoord1s = NULL;
+PFNGLMULTITEXCOORD1SVPROC glad_glMultiTexCoord1sv = NULL;
+PFNGLMULTITEXCOORD2DPROC glad_glMultiTexCoord2d = NULL;
+PFNGLMULTITEXCOORD2DVPROC glad_glMultiTexCoord2dv = NULL;
+PFNGLMULTITEXCOORD2FPROC glad_glMultiTexCoord2f = NULL;
+PFNGLMULTITEXCOORD2FVPROC glad_glMultiTexCoord2fv = NULL;
+PFNGLMULTITEXCOORD2IPROC glad_glMultiTexCoord2i = NULL;
+PFNGLMULTITEXCOORD2IVPROC glad_glMultiTexCoord2iv = NULL;
+PFNGLMULTITEXCOORD2SPROC glad_glMultiTexCoord2s = NULL;
+PFNGLMULTITEXCOORD2SVPROC glad_glMultiTexCoord2sv = NULL;
+PFNGLMULTITEXCOORD3DPROC glad_glMultiTexCoord3d = NULL;
+PFNGLMULTITEXCOORD3DVPROC glad_glMultiTexCoord3dv = NULL;
+PFNGLMULTITEXCOORD3FPROC glad_glMultiTexCoord3f = NULL;
+PFNGLMULTITEXCOORD3FVPROC glad_glMultiTexCoord3fv = NULL;
+PFNGLMULTITEXCOORD3IPROC glad_glMultiTexCoord3i = NULL;
+PFNGLMULTITEXCOORD3IVPROC glad_glMultiTexCoord3iv = NULL;
+PFNGLMULTITEXCOORD3SPROC glad_glMultiTexCoord3s = NULL;
+PFNGLMULTITEXCOORD3SVPROC glad_glMultiTexCoord3sv = NULL;
+PFNGLMULTITEXCOORD4DPROC glad_glMultiTexCoord4d = NULL;
+PFNGLMULTITEXCOORD4DVPROC glad_glMultiTexCoord4dv = NULL;
+PFNGLMULTITEXCOORD4FPROC glad_glMultiTexCoord4f = NULL;
+PFNGLMULTITEXCOORD4FVPROC glad_glMultiTexCoord4fv = NULL;
+PFNGLMULTITEXCOORD4IPROC glad_glMultiTexCoord4i = NULL;
+PFNGLMULTITEXCOORD4IVPROC glad_glMultiTexCoord4iv = NULL;
+PFNGLMULTITEXCOORD4SPROC glad_glMultiTexCoord4s = NULL;
+PFNGLMULTITEXCOORD4SVPROC glad_glMultiTexCoord4sv = NULL;
+PFNGLMULTITEXCOORDP1UIPROC glad_glMultiTexCoordP1ui = NULL;
+PFNGLMULTITEXCOORDP1UIVPROC glad_glMultiTexCoordP1uiv = NULL;
+PFNGLMULTITEXCOORDP2UIPROC glad_glMultiTexCoordP2ui = NULL;
+PFNGLMULTITEXCOORDP2UIVPROC glad_glMultiTexCoordP2uiv = NULL;
+PFNGLMULTITEXCOORDP3UIPROC glad_glMultiTexCoordP3ui = NULL;
+PFNGLMULTITEXCOORDP3UIVPROC glad_glMultiTexCoordP3uiv = NULL;
+PFNGLMULTITEXCOORDP4UIPROC glad_glMultiTexCoordP4ui = NULL;
+PFNGLMULTITEXCOORDP4UIVPROC glad_glMultiTexCoordP4uiv = NULL;
+PFNGLNEWLISTPROC glad_glNewList = NULL;
+PFNGLNORMAL3BPROC glad_glNormal3b = NULL;
+PFNGLNORMAL3BVPROC glad_glNormal3bv = NULL;
+PFNGLNORMAL3DPROC glad_glNormal3d = NULL;
+PFNGLNORMAL3DVPROC glad_glNormal3dv = NULL;
+PFNGLNORMAL3FPROC glad_glNormal3f = NULL;
+PFNGLNORMAL3FVPROC glad_glNormal3fv = NULL;
+PFNGLNORMAL3IPROC glad_glNormal3i = NULL;
+PFNGLNORMAL3IVPROC glad_glNormal3iv = NULL;
+PFNGLNORMAL3SPROC glad_glNormal3s = NULL;
+PFNGLNORMAL3SVPROC glad_glNormal3sv = NULL;
+PFNGLNORMALP3UIPROC glad_glNormalP3ui = NULL;
+PFNGLNORMALP3UIVPROC glad_glNormalP3uiv = NULL;
+PFNGLNORMALPOINTERPROC glad_glNormalPointer = NULL;
+PFNGLORTHOPROC glad_glOrtho = NULL;
+PFNGLPASSTHROUGHPROC glad_glPassThrough = NULL;
+PFNGLPIXELMAPFVPROC glad_glPixelMapfv = NULL;
+PFNGLPIXELMAPUIVPROC glad_glPixelMapuiv = NULL;
+PFNGLPIXELMAPUSVPROC glad_glPixelMapusv = NULL;
+PFNGLPIXELSTOREFPROC glad_glPixelStoref = NULL;
+PFNGLPIXELSTOREIPROC glad_glPixelStorei = NULL;
+PFNGLPIXELTRANSFERFPROC glad_glPixelTransferf = NULL;
+PFNGLPIXELTRANSFERIPROC glad_glPixelTransferi = NULL;
+PFNGLPIXELZOOMPROC glad_glPixelZoom = NULL;
+PFNGLPOINTPARAMETERFPROC glad_glPointParameterf = NULL;
+PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv = NULL;
+PFNGLPOINTPARAMETERIPROC glad_glPointParameteri = NULL;
+PFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv = NULL;
+PFNGLPOINTSIZEPROC glad_glPointSize = NULL;
+PFNGLPOLYGONMODEPROC glad_glPolygonMode = NULL;
+PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset = NULL;
+PFNGLPOLYGONSTIPPLEPROC glad_glPolygonStipple = NULL;
+PFNGLPOPATTRIBPROC glad_glPopAttrib = NULL;
+PFNGLPOPCLIENTATTRIBPROC glad_glPopClientAttrib = NULL;
+PFNGLPOPMATRIXPROC glad_glPopMatrix = NULL;
+PFNGLPOPNAMEPROC glad_glPopName = NULL;
+PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex = NULL;
+PFNGLPRIORITIZETEXTURESPROC glad_glPrioritizeTextures = NULL;
+PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex = NULL;
+PFNGLPUSHATTRIBPROC glad_glPushAttrib = NULL;
+PFNGLPUSHCLIENTATTRIBPROC glad_glPushClientAttrib = NULL;
+PFNGLPUSHMATRIXPROC glad_glPushMatrix = NULL;
+PFNGLPUSHNAMEPROC glad_glPushName = NULL;
+PFNGLQUERYCOUNTERPROC glad_glQueryCounter = NULL;
+PFNGLRASTERPOS2DPROC glad_glRasterPos2d = NULL;
+PFNGLRASTERPOS2DVPROC glad_glRasterPos2dv = NULL;
+PFNGLRASTERPOS2FPROC glad_glRasterPos2f = NULL;
+PFNGLRASTERPOS2FVPROC glad_glRasterPos2fv = NULL;
+PFNGLRASTERPOS2IPROC glad_glRasterPos2i = NULL;
+PFNGLRASTERPOS2IVPROC glad_glRasterPos2iv = NULL;
+PFNGLRASTERPOS2SPROC glad_glRasterPos2s = NULL;
+PFNGLRASTERPOS2SVPROC glad_glRasterPos2sv = NULL;
+PFNGLRASTERPOS3DPROC glad_glRasterPos3d = NULL;
+PFNGLRASTERPOS3DVPROC glad_glRasterPos3dv = NULL;
+PFNGLRASTERPOS3FPROC glad_glRasterPos3f = NULL;
+PFNGLRASTERPOS3FVPROC glad_glRasterPos3fv = NULL;
+PFNGLRASTERPOS3IPROC glad_glRasterPos3i = NULL;
+PFNGLRASTERPOS3IVPROC glad_glRasterPos3iv = NULL;
+PFNGLRASTERPOS3SPROC glad_glRasterPos3s = NULL;
+PFNGLRASTERPOS3SVPROC glad_glRasterPos3sv = NULL;
+PFNGLRASTERPOS4DPROC glad_glRasterPos4d = NULL;
+PFNGLRASTERPOS4DVPROC glad_glRasterPos4dv = NULL;
+PFNGLRASTERPOS4FPROC glad_glRasterPos4f = NULL;
+PFNGLRASTERPOS4FVPROC glad_glRasterPos4fv = NULL;
+PFNGLRASTERPOS4IPROC glad_glRasterPos4i = NULL;
+PFNGLRASTERPOS4IVPROC glad_glRasterPos4iv = NULL;
+PFNGLRASTERPOS4SPROC glad_glRasterPos4s = NULL;
+PFNGLRASTERPOS4SVPROC glad_glRasterPos4sv = NULL;
+PFNGLREADBUFFERPROC glad_glReadBuffer = NULL;
+PFNGLREADPIXELSPROC glad_glReadPixels = NULL;
+PFNGLRECTDPROC glad_glRectd = NULL;
+PFNGLRECTDVPROC glad_glRectdv = NULL;
+PFNGLRECTFPROC glad_glRectf = NULL;
+PFNGLRECTFVPROC glad_glRectfv = NULL;
+PFNGLRECTIPROC glad_glRecti = NULL;
+PFNGLRECTIVPROC glad_glRectiv = NULL;
+PFNGLRECTSPROC glad_glRects = NULL;
+PFNGLRECTSVPROC glad_glRectsv = NULL;
+PFNGLRENDERMODEPROC glad_glRenderMode = NULL;
+PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage = NULL;
+PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample = NULL;
+PFNGLROTATEDPROC glad_glRotated = NULL;
+PFNGLROTATEFPROC glad_glRotatef = NULL;
+PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage = NULL;
+PFNGLSAMPLEMASKIPROC glad_glSampleMaski = NULL;
+PFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv = NULL;
+PFNGLSAMPLERPARAMETERIUIVPROC glad_glSamplerParameterIuiv = NULL;
+PFNGLSAMPLERPARAMETERFPROC glad_glSamplerParameterf = NULL;
+PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv = NULL;
+PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri = NULL;
+PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv = NULL;
+PFNGLSCALEDPROC glad_glScaled = NULL;
+PFNGLSCALEFPROC glad_glScalef = NULL;
+PFNGLSCISSORPROC glad_glScissor = NULL;
+PFNGLSECONDARYCOLOR3BPROC glad_glSecondaryColor3b = NULL;
+PFNGLSECONDARYCOLOR3BVPROC glad_glSecondaryColor3bv = NULL;
+PFNGLSECONDARYCOLOR3DPROC glad_glSecondaryColor3d = NULL;
+PFNGLSECONDARYCOLOR3DVPROC glad_glSecondaryColor3dv = NULL;
+PFNGLSECONDARYCOLOR3FPROC glad_glSecondaryColor3f = NULL;
+PFNGLSECONDARYCOLOR3FVPROC glad_glSecondaryColor3fv = NULL;
+PFNGLSECONDARYCOLOR3IPROC glad_glSecondaryColor3i = NULL;
+PFNGLSECONDARYCOLOR3IVPROC glad_glSecondaryColor3iv = NULL;
+PFNGLSECONDARYCOLOR3SPROC glad_glSecondaryColor3s = NULL;
+PFNGLSECONDARYCOLOR3SVPROC glad_glSecondaryColor3sv = NULL;
+PFNGLSECONDARYCOLOR3UBPROC glad_glSecondaryColor3ub = NULL;
+PFNGLSECONDARYCOLOR3UBVPROC glad_glSecondaryColor3ubv = NULL;
+PFNGLSECONDARYCOLOR3UIPROC glad_glSecondaryColor3ui = NULL;
+PFNGLSECONDARYCOLOR3UIVPROC glad_glSecondaryColor3uiv = NULL;
+PFNGLSECONDARYCOLOR3USPROC glad_glSecondaryColor3us = NULL;
+PFNGLSECONDARYCOLOR3USVPROC glad_glSecondaryColor3usv = NULL;
+PFNGLSECONDARYCOLORP3UIPROC glad_glSecondaryColorP3ui = NULL;
+PFNGLSECONDARYCOLORP3UIVPROC glad_glSecondaryColorP3uiv = NULL;
+PFNGLSECONDARYCOLORPOINTERPROC glad_glSecondaryColorPointer = NULL;
+PFNGLSELECTBUFFERPROC glad_glSelectBuffer = NULL;
+PFNGLSHADEMODELPROC glad_glShadeModel = NULL;
+PFNGLSHADERSOURCEPROC glad_glShaderSource = NULL;
+PFNGLSTENCILFUNCPROC glad_glStencilFunc = NULL;
+PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate = NULL;
+PFNGLSTENCILMASKPROC glad_glStencilMask = NULL;
+PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate = NULL;
+PFNGLSTENCILOPPROC glad_glStencilOp = NULL;
+PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate = NULL;
+PFNGLTEXBUFFERPROC glad_glTexBuffer = NULL;
+PFNGLTEXCOORD1DPROC glad_glTexCoord1d = NULL;
+PFNGLTEXCOORD1DVPROC glad_glTexCoord1dv = NULL;
+PFNGLTEXCOORD1FPROC glad_glTexCoord1f = NULL;
+PFNGLTEXCOORD1FVPROC glad_glTexCoord1fv = NULL;
+PFNGLTEXCOORD1IPROC glad_glTexCoord1i = NULL;
+PFNGLTEXCOORD1IVPROC glad_glTexCoord1iv = NULL;
+PFNGLTEXCOORD1SPROC glad_glTexCoord1s = NULL;
+PFNGLTEXCOORD1SVPROC glad_glTexCoord1sv = NULL;
+PFNGLTEXCOORD2DPROC glad_glTexCoord2d = NULL;
+PFNGLTEXCOORD2DVPROC glad_glTexCoord2dv = NULL;
+PFNGLTEXCOORD2FPROC glad_glTexCoord2f = NULL;
+PFNGLTEXCOORD2FVPROC glad_glTexCoord2fv = NULL;
+PFNGLTEXCOORD2IPROC glad_glTexCoord2i = NULL;
+PFNGLTEXCOORD2IVPROC glad_glTexCoord2iv = NULL;
+PFNGLTEXCOORD2SPROC glad_glTexCoord2s = NULL;
+PFNGLTEXCOORD2SVPROC glad_glTexCoord2sv = NULL;
+PFNGLTEXCOORD3DPROC glad_glTexCoord3d = NULL;
+PFNGLTEXCOORD3DVPROC glad_glTexCoord3dv = NULL;
+PFNGLTEXCOORD3FPROC glad_glTexCoord3f = NULL;
+PFNGLTEXCOORD3FVPROC glad_glTexCoord3fv = NULL;
+PFNGLTEXCOORD3IPROC glad_glTexCoord3i = NULL;
+PFNGLTEXCOORD3IVPROC glad_glTexCoord3iv = NULL;
+PFNGLTEXCOORD3SPROC glad_glTexCoord3s = NULL;
+PFNGLTEXCOORD3SVPROC glad_glTexCoord3sv = NULL;
+PFNGLTEXCOORD4DPROC glad_glTexCoord4d = NULL;
+PFNGLTEXCOORD4DVPROC glad_glTexCoord4dv = NULL;
+PFNGLTEXCOORD4FPROC glad_glTexCoord4f = NULL;
+PFNGLTEXCOORD4FVPROC glad_glTexCoord4fv = NULL;
+PFNGLTEXCOORD4IPROC glad_glTexCoord4i = NULL;
+PFNGLTEXCOORD4IVPROC glad_glTexCoord4iv = NULL;
+PFNGLTEXCOORD4SPROC glad_glTexCoord4s = NULL;
+PFNGLTEXCOORD4SVPROC glad_glTexCoord4sv = NULL;
+PFNGLTEXCOORDP1UIPROC glad_glTexCoordP1ui = NULL;
+PFNGLTEXCOORDP1UIVPROC glad_glTexCoordP1uiv = NULL;
+PFNGLTEXCOORDP2UIPROC glad_glTexCoordP2ui = NULL;
+PFNGLTEXCOORDP2UIVPROC glad_glTexCoordP2uiv = NULL;
+PFNGLTEXCOORDP3UIPROC glad_glTexCoordP3ui = NULL;
+PFNGLTEXCOORDP3UIVPROC glad_glTexCoordP3uiv = NULL;
+PFNGLTEXCOORDP4UIPROC glad_glTexCoordP4ui = NULL;
+PFNGLTEXCOORDP4UIVPROC glad_glTexCoordP4uiv = NULL;
+PFNGLTEXCOORDPOINTERPROC glad_glTexCoordPointer = NULL;
+PFNGLTEXENVFPROC glad_glTexEnvf = NULL;
+PFNGLTEXENVFVPROC glad_glTexEnvfv = NULL;
+PFNGLTEXENVIPROC glad_glTexEnvi = NULL;
+PFNGLTEXENVIVPROC glad_glTexEnviv = NULL;
+PFNGLTEXGENDPROC glad_glTexGend = NULL;
+PFNGLTEXGENDVPROC glad_glTexGendv = NULL;
+PFNGLTEXGENFPROC glad_glTexGenf = NULL;
+PFNGLTEXGENFVPROC glad_glTexGenfv = NULL;
+PFNGLTEXGENIPROC glad_glTexGeni = NULL;
+PFNGLTEXGENIVPROC glad_glTexGeniv = NULL;
+PFNGLTEXIMAGE1DPROC glad_glTexImage1D = NULL;
+PFNGLTEXIMAGE2DPROC glad_glTexImage2D = NULL;
+PFNGLTEXIMAGE2DMULTISAMPLEPROC glad_glTexImage2DMultisample = NULL;
+PFNGLTEXIMAGE3DPROC glad_glTexImage3D = NULL;
+PFNGLTEXIMAGE3DMULTISAMPLEPROC glad_glTexImage3DMultisample = NULL;
+PFNGLTEXPARAMETERIIVPROC glad_glTexParameterIiv = NULL;
+PFNGLTEXPARAMETERIUIVPROC glad_glTexParameterIuiv = NULL;
+PFNGLTEXPARAMETERFPROC glad_glTexParameterf = NULL;
+PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv = NULL;
+PFNGLTEXPARAMETERIPROC glad_glTexParameteri = NULL;
+PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv = NULL;
+PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D = NULL;
+PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D = NULL;
+PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D = NULL;
+PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings = NULL;
+PFNGLTRANSLATEDPROC glad_glTranslated = NULL;
+PFNGLTRANSLATEFPROC glad_glTranslatef = NULL;
+PFNGLUNIFORM1FPROC glad_glUniform1f = NULL;
+PFNGLUNIFORM1FVPROC glad_glUniform1fv = NULL;
+PFNGLUNIFORM1IPROC glad_glUniform1i = NULL;
+PFNGLUNIFORM1IVPROC glad_glUniform1iv = NULL;
+PFNGLUNIFORM1UIPROC glad_glUniform1ui = NULL;
+PFNGLUNIFORM1UIVPROC glad_glUniform1uiv = NULL;
+PFNGLUNIFORM2FPROC glad_glUniform2f = NULL;
+PFNGLUNIFORM2FVPROC glad_glUniform2fv = NULL;
+PFNGLUNIFORM2IPROC glad_glUniform2i = NULL;
+PFNGLUNIFORM2IVPROC glad_glUniform2iv = NULL;
+PFNGLUNIFORM2UIPROC glad_glUniform2ui = NULL;
+PFNGLUNIFORM2UIVPROC glad_glUniform2uiv = NULL;
+PFNGLUNIFORM3FPROC glad_glUniform3f = NULL;
+PFNGLUNIFORM3FVPROC glad_glUniform3fv = NULL;
+PFNGLUNIFORM3IPROC glad_glUniform3i = NULL;
+PFNGLUNIFORM3IVPROC glad_glUniform3iv = NULL;
+PFNGLUNIFORM3UIPROC glad_glUniform3ui = NULL;
+PFNGLUNIFORM3UIVPROC glad_glUniform3uiv = NULL;
+PFNGLUNIFORM4FPROC glad_glUniform4f = NULL;
+PFNGLUNIFORM4FVPROC glad_glUniform4fv = NULL;
+PFNGLUNIFORM4IPROC glad_glUniform4i = NULL;
+PFNGLUNIFORM4IVPROC glad_glUniform4iv = NULL;
+PFNGLUNIFORM4UIPROC glad_glUniform4ui = NULL;
+PFNGLUNIFORM4UIVPROC glad_glUniform4uiv = NULL;
+PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding = NULL;
+PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv = NULL;
+PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv = NULL;
+PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv = NULL;
+PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv = NULL;
+PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv = NULL;
+PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv = NULL;
+PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv = NULL;
+PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv = NULL;
+PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv = NULL;
+PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer = NULL;
+PFNGLUSEPROGRAMPROC glad_glUseProgram = NULL;
+PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram = NULL;
+PFNGLVERTEX2DPROC glad_glVertex2d = NULL;
+PFNGLVERTEX2DVPROC glad_glVertex2dv = NULL;
+PFNGLVERTEX2FPROC glad_glVertex2f = NULL;
+PFNGLVERTEX2FVPROC glad_glVertex2fv = NULL;
+PFNGLVERTEX2IPROC glad_glVertex2i = NULL;
+PFNGLVERTEX2IVPROC glad_glVertex2iv = NULL;
+PFNGLVERTEX2SPROC glad_glVertex2s = NULL;
+PFNGLVERTEX2SVPROC glad_glVertex2sv = NULL;
+PFNGLVERTEX3DPROC glad_glVertex3d = NULL;
+PFNGLVERTEX3DVPROC glad_glVertex3dv = NULL;
+PFNGLVERTEX3FPROC glad_glVertex3f = NULL;
+PFNGLVERTEX3FVPROC glad_glVertex3fv = NULL;
+PFNGLVERTEX3IPROC glad_glVertex3i = NULL;
+PFNGLVERTEX3IVPROC glad_glVertex3iv = NULL;
+PFNGLVERTEX3SPROC glad_glVertex3s = NULL;
+PFNGLVERTEX3SVPROC glad_glVertex3sv = NULL;
+PFNGLVERTEX4DPROC glad_glVertex4d = NULL;
+PFNGLVERTEX4DVPROC glad_glVertex4dv = NULL;
+PFNGLVERTEX4FPROC glad_glVertex4f = NULL;
+PFNGLVERTEX4FVPROC glad_glVertex4fv = NULL;
+PFNGLVERTEX4IPROC glad_glVertex4i = NULL;
+PFNGLVERTEX4IVPROC glad_glVertex4iv = NULL;
+PFNGLVERTEX4SPROC glad_glVertex4s = NULL;
+PFNGLVERTEX4SVPROC glad_glVertex4sv = NULL;
+PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d = NULL;
+PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv = NULL;
+PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f = NULL;
+PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv = NULL;
+PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s = NULL;
+PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv = NULL;
+PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d = NULL;
+PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv = NULL;
+PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f = NULL;
+PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv = NULL;
+PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s = NULL;
+PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv = NULL;
+PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d = NULL;
+PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv = NULL;
+PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f = NULL;
+PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv = NULL;
+PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s = NULL;
+PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv = NULL;
+PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv = NULL;
+PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv = NULL;
+PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv = NULL;
+PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub = NULL;
+PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv = NULL;
+PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv = NULL;
+PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv = NULL;
+PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv = NULL;
+PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d = NULL;
+PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv = NULL;
+PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f = NULL;
+PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv = NULL;
+PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv = NULL;
+PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s = NULL;
+PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv = NULL;
+PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv = NULL;
+PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv = NULL;
+PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv = NULL;
+PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor = NULL;
+PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i = NULL;
+PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv = NULL;
+PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui = NULL;
+PFNGLVERTEXATTRIBI1UIVPROC glad_glVertexAttribI1uiv = NULL;
+PFNGLVERTEXATTRIBI2IPROC glad_glVertexAttribI2i = NULL;
+PFNGLVERTEXATTRIBI2IVPROC glad_glVertexAttribI2iv = NULL;
+PFNGLVERTEXATTRIBI2UIPROC glad_glVertexAttribI2ui = NULL;
+PFNGLVERTEXATTRIBI2UIVPROC glad_glVertexAttribI2uiv = NULL;
+PFNGLVERTEXATTRIBI3IPROC glad_glVertexAttribI3i = NULL;
+PFNGLVERTEXATTRIBI3IVPROC glad_glVertexAttribI3iv = NULL;
+PFNGLVERTEXATTRIBI3UIPROC glad_glVertexAttribI3ui = NULL;
+PFNGLVERTEXATTRIBI3UIVPROC glad_glVertexAttribI3uiv = NULL;
+PFNGLVERTEXATTRIBI4BVPROC glad_glVertexAttribI4bv = NULL;
+PFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i = NULL;
+PFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv = NULL;
+PFNGLVERTEXATTRIBI4SVPROC glad_glVertexAttribI4sv = NULL;
+PFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv = NULL;
+PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui = NULL;
+PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv = NULL;
+PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv = NULL;
+PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer = NULL;
+PFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui = NULL;
+PFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv = NULL;
+PFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui = NULL;
+PFNGLVERTEXATTRIBP2UIVPROC glad_glVertexAttribP2uiv = NULL;
+PFNGLVERTEXATTRIBP3UIPROC glad_glVertexAttribP3ui = NULL;
+PFNGLVERTEXATTRIBP3UIVPROC glad_glVertexAttribP3uiv = NULL;
+PFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui = NULL;
+PFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv = NULL;
+PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer = NULL;
+PFNGLVERTEXP2UIPROC glad_glVertexP2ui = NULL;
+PFNGLVERTEXP2UIVPROC glad_glVertexP2uiv = NULL;
+PFNGLVERTEXP3UIPROC glad_glVertexP3ui = NULL;
+PFNGLVERTEXP3UIVPROC glad_glVertexP3uiv = NULL;
+PFNGLVERTEXP4UIPROC glad_glVertexP4ui = NULL;
+PFNGLVERTEXP4UIVPROC glad_glVertexP4uiv = NULL;
+PFNGLVERTEXPOINTERPROC glad_glVertexPointer = NULL;
+PFNGLVIEWPORTPROC glad_glViewport = NULL;
+PFNGLWAITSYNCPROC glad_glWaitSync = NULL;
+PFNGLWINDOWPOS2DPROC glad_glWindowPos2d = NULL;
+PFNGLWINDOWPOS2DVPROC glad_glWindowPos2dv = NULL;
+PFNGLWINDOWPOS2FPROC glad_glWindowPos2f = NULL;
+PFNGLWINDOWPOS2FVPROC glad_glWindowPos2fv = NULL;
+PFNGLWINDOWPOS2IPROC glad_glWindowPos2i = NULL;
+PFNGLWINDOWPOS2IVPROC glad_glWindowPos2iv = NULL;
+PFNGLWINDOWPOS2SPROC glad_glWindowPos2s = NULL;
+PFNGLWINDOWPOS2SVPROC glad_glWindowPos2sv = NULL;
+PFNGLWINDOWPOS3DPROC glad_glWindowPos3d = NULL;
+PFNGLWINDOWPOS3DVPROC glad_glWindowPos3dv = NULL;
+PFNGLWINDOWPOS3FPROC glad_glWindowPos3f = NULL;
+PFNGLWINDOWPOS3FVPROC glad_glWindowPos3fv = NULL;
+PFNGLWINDOWPOS3IPROC glad_glWindowPos3i = NULL;
+PFNGLWINDOWPOS3IVPROC glad_glWindowPos3iv = NULL;
+PFNGLWINDOWPOS3SPROC glad_glWindowPos3s = NULL;
+PFNGLWINDOWPOS3SVPROC glad_glWindowPos3sv = NULL;
+int GLAD_GL_ARB_debug_output = 0;
+int GLAD_GL_ARB_framebuffer_object = 0;
+int GLAD_GL_EXT_framebuffer_object = 0;
+PFNGLDEBUGMESSAGECONTROLARBPROC glad_glDebugMessageControlARB = NULL;
+PFNGLDEBUGMESSAGEINSERTARBPROC glad_glDebugMessageInsertARB = NULL;
+PFNGLDEBUGMESSAGECALLBACKARBPROC glad_glDebugMessageCallbackARB = NULL;
+PFNGLGETDEBUGMESSAGELOGARBPROC glad_glGetDebugMessageLogARB = NULL;
+PFNGLISRENDERBUFFEREXTPROC glad_glIsRenderbufferEXT = NULL;
+PFNGLBINDRENDERBUFFEREXTPROC glad_glBindRenderbufferEXT = NULL;
+PFNGLDELETERENDERBUFFERSEXTPROC glad_glDeleteRenderbuffersEXT = NULL;
+PFNGLGENRENDERBUFFERSEXTPROC glad_glGenRenderbuffersEXT = NULL;
+PFNGLRENDERBUFFERSTORAGEEXTPROC glad_glRenderbufferStorageEXT = NULL;
+PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glad_glGetRenderbufferParameterivEXT = NULL;
+PFNGLISFRAMEBUFFEREXTPROC glad_glIsFramebufferEXT = NULL;
+PFNGLBINDFRAMEBUFFEREXTPROC glad_glBindFramebufferEXT = NULL;
+PFNGLDELETEFRAMEBUFFERSEXTPROC glad_glDeleteFramebuffersEXT = NULL;
+PFNGLGENFRAMEBUFFERSEXTPROC glad_glGenFramebuffersEXT = NULL;
+PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glad_glCheckFramebufferStatusEXT = NULL;
+PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glad_glFramebufferTexture1DEXT = NULL;
+PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glad_glFramebufferTexture2DEXT = NULL;
+PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glad_glFramebufferTexture3DEXT = NULL;
+PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glad_glFramebufferRenderbufferEXT = NULL;
+PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glad_glGetFramebufferAttachmentParameterivEXT = NULL;
+PFNGLGENERATEMIPMAPEXTPROC glad_glGenerateMipmapEXT = NULL;
static void load_GL_VERSION_1_0(GLADloadproc load) {
if(!GLAD_GL_VERSION_1_0) return;
glad_glCullFace = (PFNGLCULLFACEPROC)load("glCullFace");
diff --git a/thirdparty/glad/glad/glad.h b/thirdparty/glad/glad/glad.h
index 4d92d33b37..52b05e0ae6 100644
--- a/thirdparty/glad/glad/glad.h
+++ b/thirdparty/glad/glad/glad.h
@@ -1,6 +1,6 @@
/*
- OpenGL loader generated by glad 0.1.25 on Sat Jul 28 10:59:43 2018.
+ OpenGL loader generated by glad 0.1.28 on Thu Nov 22 16:50:04 2018.
Language/Generator: C/C++
Specification: gl
@@ -13,11 +13,12 @@
Loader: True
Local files: False
Omit khrplatform: False
+ Reproducible: False
Commandline:
--profile="compatibility" --api="gl=3.3" --generator="c" --spec="gl" --extensions="GL_ARB_debug_output,GL_ARB_framebuffer_object,GL_EXT_framebuffer_object"
Online:
- http://glad.dav1d.de/#profile=compatibility&language=c&specification=gl&loader=on&api=gl%3D3.3&extensions=GL_ARB_debug_output&extensions=GL_ARB_framebuffer_object&extensions=GL_EXT_framebuffer_object
+ https://glad.dav1d.de/#profile=compatibility&language=c&specification=gl&loader=on&api=gl%3D3.3&extensions=GL_ARB_debug_output&extensions=GL_ARB_framebuffer_object&extensions=GL_EXT_framebuffer_object
*/
@@ -46,6 +47,10 @@
#define APIENTRYP APIENTRY *
#endif
+#ifndef GLAPIENTRY
+#define GLAPIENTRY APIENTRY
+#endif
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -89,59 +94,21 @@ GLAPI int gladLoadGL(void);
GLAPI int gladLoadGLLoader(GLADloadproc);
-#include <stddef.h>
#include <KHR/khrplatform.h>
-#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 <inttypes.h>
-#elif defined(__sun__) || defined(__digital__)
-#include <inttypes.h>
-#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 <inttypes.h>
-#elif defined(__SCO__) || defined(__USLC__)
-#include <stdint.h>
-#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 <stdint.h>
-#elif defined(_WIN32)
-typedef __int32 int32_t;
-typedef __int64 int64_t;
-typedef unsigned __int64 uint64_t;
-#else
-/* Fallback if nothing above works */
-#include <inttypes.h>
-#endif
-#endif
typedef unsigned int GLenum;
typedef unsigned char GLboolean;
typedef unsigned int GLbitfield;
typedef void GLvoid;
-typedef signed char GLbyte;
-typedef short GLshort;
+typedef khronos_int8_t GLbyte;
+typedef khronos_uint8_t GLubyte;
+typedef khronos_int16_t GLshort;
+typedef khronos_uint16_t GLushort;
typedef int GLint;
-typedef int GLclampx;
-typedef unsigned char GLubyte;
-typedef unsigned short GLushort;
typedef unsigned int GLuint;
+typedef khronos_int32_t GLclampx;
typedef int GLsizei;
-typedef float GLfloat;
-typedef float GLclampf;
+typedef khronos_float_t GLfloat;
+typedef khronos_float_t GLclampf;
typedef double GLdouble;
typedef double GLclampd;
typedef void *GLeglClientBufferEXT;
@@ -153,25 +120,17 @@ typedef void *GLhandleARB;
#else
typedef unsigned int GLhandleARB;
#endif
-typedef unsigned short GLhalfARB;
-typedef unsigned short GLhalf;
-typedef GLint GLfixed;
+typedef khronos_uint16_t GLhalf;
+typedef khronos_uint16_t GLhalfARB;
+typedef khronos_int32_t GLfixed;
typedef khronos_intptr_t GLintptr;
+typedef khronos_intptr_t GLintptrARB;
typedef khronos_ssize_t GLsizeiptr;
-typedef int64_t GLint64;
-typedef uint64_t GLuint64;
-#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)
-typedef long GLintptrARB;
-#else
-typedef ptrdiff_t GLintptrARB;
-#endif
-#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060)
-typedef long GLsizeiptrARB;
-#else
-typedef ptrdiff_t GLsizeiptrARB;
-#endif
-typedef int64_t GLint64EXT;
-typedef uint64_t GLuint64EXT;
+typedef khronos_ssize_t GLsizeiptrARB;
+typedef khronos_int64_t GLint64;
+typedef khronos_int64_t GLint64EXT;
+typedef khronos_uint64_t GLuint64;
+typedef khronos_uint64_t GLuint64EXT;
typedef struct __GLsync *GLsync;
struct _cl_context;
struct _cl_event;
diff --git a/platform/android/cpu-features.c b/thirdparty/libvpx/third_party/android/cpu-features.c
index 9cdadd5407..e2bd749b01 100644
--- a/platform/android/cpu-features.c
+++ b/thirdparty/libvpx/third_party/android/cpu-features.c
@@ -28,6 +28,10 @@
/* ChangeLog for this library:
*
+ * NDK r10e?: Add MIPS MSA feature.
+ *
+ * NDK r10: Support for 64-bit CPUs (Intel, ARM & MIPS).
+ *
* NDK r8d: Add android_setCpu().
*
* NDK r8c: Add new ARM CPU features: VFPv2, VFP_D32, VFP_FP16,
@@ -57,20 +61,17 @@
* NDK r4: Initial release
*/
-#if defined(__le32__)
-
-// When users enter this, we should only provide interface and
-// libportable will give the implementations.
-
-#else // !__le32__
+#include "cpu-features.h"
-#include <sys/system_properties.h>
+#include <dlfcn.h>
+#include <errno.h>
+#include <fcntl.h>
#include <pthread.h>
-#include "cpu-features.h"
#include <stdio.h>
#include <stdlib.h>
-#include <fcntl.h>
-#include <errno.h>
+#include <string.h>
+#include <sys/system_properties.h>
+#include <unistd.h>
static pthread_once_t g_once;
static int g_inited;
@@ -82,15 +83,7 @@ static int g_cpuCount;
static uint32_t g_cpuIdArm;
#endif
-static const int android_cpufeatures_debug = 0;
-
-#ifdef __arm__
-# define DEFAULT_CPU_FAMILY ANDROID_CPU_FAMILY_ARM
-#elif defined __i386__
-# define DEFAULT_CPU_FAMILY ANDROID_CPU_FAMILY_X86
-#else
-# define DEFAULT_CPU_FAMILY ANDROID_CPU_FAMILY_UNKNOWN
-#endif
+static const int android_cpufeatures_debug = 0;
#define D(...) \
do { \
@@ -118,6 +111,25 @@ static __inline__ void x86_cpuid(int func, int values[4])
values[2] = c;
values[3] = d;
}
+#elif defined(__x86_64__)
+static __inline__ void x86_cpuid(int func, int values[4])
+{
+ int64_t a, b, c, d;
+ /* We need to preserve ebx since we're compiling PIC code */
+ /* this means we can't use "=b" for the second output register */
+ __asm__ __volatile__ ( \
+ "push %%rbx\n"
+ "cpuid\n" \
+ "mov %%rbx, %1\n"
+ "pop %%rbx\n"
+ : "=a" (a), "=r" (b), "=c" (c), "=d" (d) \
+ : "a" (func) \
+ );
+ values[0] = a;
+ values[1] = b;
+ values[2] = c;
+ values[3] = d;
+}
#endif
/* Get the size of a file by reading it until the end. This is needed
@@ -127,7 +139,8 @@ static __inline__ void x86_cpuid(int func, int values[4])
static int
get_file_size(const char* pathname)
{
- int fd, result = 0;
+
+ int fd, result = 0;
char buffer[256];
fd = open(pathname, O_RDONLY);
@@ -187,6 +200,7 @@ read_file(const char* pathname, char* buffer, size_t buffsize)
return count;
}
+#ifdef __arm__
/* Extract the content of a the first occurence of a given field in
* the content of /proc/cpuinfo and return it as a heap-allocated
* string that must be freed by the caller.
@@ -199,7 +213,7 @@ extract_cpuinfo_field(const char* buffer, int buflen, const char* field)
int fieldlen = strlen(field);
const char* bufend = buffer + buflen;
char* result = NULL;
- int len, ignore;
+ int len;
const char *p, *q;
/* Look for first field occurence, and ensures it starts the line. */
@@ -272,6 +286,7 @@ has_list_item(const char* list, const char* item)
}
return 0;
}
+#endif /* __arm__ */
/* Parse a number starting from 'input', but not going further
* than 'limit'. Return the value into '*result'.
@@ -316,11 +331,13 @@ parse_decimal(const char* input, const char* limit, int* result)
return parse_number(input, limit, 10, result);
}
+#ifdef __arm__
static const char*
parse_hexadecimal(const char* input, const char* limit, int* result)
{
return parse_number(input, limit, 16, result);
}
+#endif /* __arm__ */
/* This small data type is used to represent a CPU list / mask, as read
* from sysfs on Linux. See http://www.kernel.org/doc/Documentation/cputopology.txt
@@ -432,6 +449,18 @@ cpulist_read_from(CpuList* list, const char* filename)
cpulist_parse(list, file, filelen);
}
+#if defined(__aarch64__)
+// see <uapi/asm/hwcap.h> kernel header
+#define HWCAP_FP (1 << 0)
+#define HWCAP_ASIMD (1 << 1)
+#define HWCAP_AES (1 << 3)
+#define HWCAP_PMULL (1 << 4)
+#define HWCAP_SHA1 (1 << 5)
+#define HWCAP_SHA2 (1 << 6)
+#define HWCAP_CRC32 (1 << 7)
+#endif
+
+#if defined(__arm__)
// See <asm/hwcap.h> kernel header.
#define HWCAP_VFP (1 << 6)
@@ -443,27 +472,84 @@ cpulist_read_from(CpuList* list, const char* filename)
#define HWCAP_IDIVA (1 << 17)
#define HWCAP_IDIVT (1 << 18)
+// see <uapi/asm/hwcap.h> kernel header
+#define HWCAP2_AES (1 << 0)
+#define HWCAP2_PMULL (1 << 1)
+#define HWCAP2_SHA1 (1 << 2)
+#define HWCAP2_SHA2 (1 << 3)
+#define HWCAP2_CRC32 (1 << 4)
+
+// This is the list of 32-bit ARMv7 optional features that are _always_
+// supported by ARMv8 CPUs, as mandated by the ARM Architecture Reference
+// Manual.
+#define HWCAP_SET_FOR_ARMV8 \
+ ( HWCAP_VFP | \
+ HWCAP_NEON | \
+ HWCAP_VFPv3 | \
+ HWCAP_VFPv4 | \
+ HWCAP_IDIVA | \
+ HWCAP_IDIVT )
+#endif
+
+#if defined(__mips__)
+// see <uapi/asm/hwcap.h> kernel header
+#define HWCAP_MIPS_R6 (1 << 0)
+#define HWCAP_MIPS_MSA (1 << 1)
+#endif
+
+#if defined(__arm__) || defined(__aarch64__) || defined(__mips__)
+
#define AT_HWCAP 16
+#define AT_HWCAP2 26
+
+// Probe the system's C library for a 'getauxval' function and call it if
+// it exits, or return 0 for failure. This function is available since API
+// level 20.
+//
+// This code does *NOT* check for '__ANDROID_API__ >= 20' to support the
+// edge case where some NDK developers use headers for a platform that is
+// newer than the one really targetted by their application.
+// This is typically done to use newer native APIs only when running on more
+// recent Android versions, and requires careful symbol management.
+//
+// Note that getauxval() can't really be re-implemented here, because
+// its implementation does not parse /proc/self/auxv. Instead it depends
+// on values that are passed by the kernel at process-init time to the
+// C runtime initialization layer.
+static uint32_t
+get_elf_hwcap_from_getauxval(int hwcap_type) {
+ typedef unsigned long getauxval_func_t(unsigned long);
+
+ dlerror();
+ void* libc_handle = dlopen("libc.so", RTLD_NOW);
+ if (!libc_handle) {
+ D("Could not dlopen() C library: %s\n", dlerror());
+ return 0;
+ }
+
+ uint32_t ret = 0;
+ getauxval_func_t* func = (getauxval_func_t*)
+ dlsym(libc_handle, "getauxval");
+ if (!func) {
+ D("Could not find getauxval() in C library\n");
+ } else {
+ // Note: getauxval() returns 0 on failure. Doesn't touch errno.
+ ret = (uint32_t)(*func)(hwcap_type);
+ }
+ dlclose(libc_handle);
+ return ret;
+}
+#endif
#if defined(__arm__)
-/* Compute the ELF HWCAP flags.
- */
+// Parse /proc/self/auxv to extract the ELF HW capabilities bitmap for the
+// current CPU. Note that this file is not accessible from regular
+// application processes on some Android platform releases.
+// On success, return new ELF hwcaps, or 0 on failure.
static uint32_t
-get_elf_hwcap(const char* cpuinfo, int cpuinfo_len)
-{
- /* IMPORTANT:
- * Accessing /proc/self/auxv doesn't work anymore on all
- * platform versions. More specifically, when running inside
- * a regular application process, most of /proc/self/ will be
- * non-readable, including /proc/self/auxv. This doesn't
- * happen however if the application is debuggable, or when
- * running under the "shell" UID, which is why this was not
- * detected appropriately.
- */
-#if 0
- uint32_t result = 0;
+get_elf_hwcap_from_proc_self_auxv(void) {
const char filepath[] = "/proc/self/auxv";
- int fd = open(filepath, O_RDONLY);
+ int fd = TEMP_FAILURE_RETRY(open(filepath, O_RDONLY));
if (fd < 0) {
D("Could not open %s: %s\n", filepath, strerror(errno));
return 0;
@@ -471,11 +557,10 @@ get_elf_hwcap(const char* cpuinfo, int cpuinfo_len)
struct { uint32_t tag; uint32_t value; } entry;
+ uint32_t result = 0;
for (;;) {
- int ret = read(fd, (char*)&entry, sizeof entry);
+ int ret = TEMP_FAILURE_RETRY(read(fd, (char*)&entry, sizeof entry));
if (ret < 0) {
- if (errno == EINTR)
- continue;
D("Error while reading %s: %s\n", filepath, strerror(errno));
break;
}
@@ -489,12 +574,33 @@ get_elf_hwcap(const char* cpuinfo, int cpuinfo_len)
}
close(fd);
return result;
-#else
- // Recreate ELF hwcaps by parsing /proc/cpuinfo Features tag.
+}
+
+/* Compute the ELF HWCAP flags from the content of /proc/cpuinfo.
+ * This works by parsing the 'Features' line, which lists which optional
+ * features the device's CPU supports, on top of its reference
+ * architecture.
+ */
+static uint32_t
+get_elf_hwcap_from_proc_cpuinfo(const char* cpuinfo, int cpuinfo_len) {
uint32_t hwcaps = 0;
+ long architecture = 0;
+ char* cpuArch = extract_cpuinfo_field(cpuinfo, cpuinfo_len, "CPU architecture");
+ if (cpuArch) {
+ architecture = strtol(cpuArch, NULL, 10);
+ free(cpuArch);
+
+ if (architecture >= 8L) {
+ // This is a 32-bit ARM binary running on a 64-bit ARM64 kernel.
+ // The 'Features' line only lists the optional features that the
+ // device's CPU supports, compared to its reference architecture
+ // which are of no use for this process.
+ D("Faking 32-bit ARM HWCaps on ARMv%ld CPU\n", architecture);
+ return HWCAP_SET_FOR_ARMV8;
+ }
+ }
char* cpuFeatures = extract_cpuinfo_field(cpuinfo, cpuinfo_len, "Features");
-
if (cpuFeatures != NULL) {
D("Found cpuFeatures = '%s'\n", cpuFeatures);
@@ -520,7 +626,6 @@ get_elf_hwcap(const char* cpuinfo, int cpuinfo_len)
free(cpuFeatures);
}
return hwcaps;
-#endif
}
#endif /* __arm__ */
@@ -609,9 +714,6 @@ android_cpuInit(void)
#ifdef __arm__
{
- char* features = NULL;
- char* architecture = NULL;
-
/* Extract architecture from the "CPU Architecture" field.
* The list is well-known, unlike the the output of
* the 'Processor' field which can vary greatly.
@@ -632,10 +734,7 @@ android_cpuInit(void)
/* read the initial decimal number, ignore the rest */
archNumber = strtol(cpuArch, &end, 10);
- /* Here we assume that ARMv8 will be upwards compatible with v7
- * in the future. Unfortunately, there is no 'Features' field to
- * indicate that Thumb-2 is supported.
- */
+ /* Note that ARMv8 is upwards compatible with ARMv7. */
if (end > cpuArch && archNumber >= 7) {
hasARMv7 = 1;
}
@@ -676,7 +775,19 @@ android_cpuInit(void)
}
/* Extract the list of CPU features from ELF hwcaps */
- uint32_t hwcaps = get_elf_hwcap(cpuinfo, cpuinfo_len);
+ uint32_t hwcaps = 0;
+ hwcaps = get_elf_hwcap_from_getauxval(AT_HWCAP);
+ if (!hwcaps) {
+ D("Parsing /proc/self/auxv to extract ELF hwcaps!\n");
+ hwcaps = get_elf_hwcap_from_proc_self_auxv();
+ }
+ if (!hwcaps) {
+ // Parsing /proc/self/auxv will fail from regular application
+ // processes on some Android platform versions, when this happens
+ // parse proc/cpuinfo instead.
+ D("Parsing /proc/cpuinfo to extract ELF hwcaps!\n");
+ hwcaps = get_elf_hwcap_from_proc_cpuinfo(cpuinfo, cpuinfo_len);
+ }
if (hwcaps != 0) {
int has_vfp = (hwcaps & HWCAP_VFP);
@@ -737,6 +848,27 @@ android_cpuInit(void)
g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_iWMMXt;
}
+ /* Extract the list of CPU features from ELF hwcaps2 */
+ uint32_t hwcaps2 = 0;
+ hwcaps2 = get_elf_hwcap_from_getauxval(AT_HWCAP2);
+ if (hwcaps2 != 0) {
+ int has_aes = (hwcaps2 & HWCAP2_AES);
+ int has_pmull = (hwcaps2 & HWCAP2_PMULL);
+ int has_sha1 = (hwcaps2 & HWCAP2_SHA1);
+ int has_sha2 = (hwcaps2 & HWCAP2_SHA2);
+ int has_crc32 = (hwcaps2 & HWCAP2_CRC32);
+
+ if (has_aes)
+ g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_AES;
+ if (has_pmull)
+ g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_PMULL;
+ if (has_sha1)
+ g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_SHA1;
+ if (has_sha2)
+ g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_SHA2;
+ if (has_crc32)
+ g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_CRC32;
+ }
/* Extract the cpuid value from various fields */
// The CPUID value is broken up in several entries in /proc/cpuinfo.
// This table is used to rebuild it from the entries.
@@ -806,10 +938,64 @@ android_cpuInit(void)
g_cpuFeatures |= entry->or_flags;
}
+ // Special case: The emulator-specific Android 4.2 kernel fails
+ // to report support for the 32-bit ARM IDIV instruction.
+ // Technically, this is a feature of the virtual CPU implemented
+ // by the emulator. Note that it could also support Thumb IDIV
+ // in the future, and this will have to be slightly updated.
+ char* hardware = extract_cpuinfo_field(cpuinfo,
+ cpuinfo_len,
+ "Hardware");
+ if (hardware) {
+ if (!strcmp(hardware, "Goldfish") &&
+ g_cpuIdArm == 0x4100c080 &&
+ (g_cpuFamily & ANDROID_CPU_ARM_FEATURE_ARMv7) != 0) {
+ g_cpuFeatures |= ANDROID_CPU_ARM_FEATURE_IDIV_ARM;
+ }
+ free(hardware);
+ }
}
#endif /* __arm__ */
+#ifdef __aarch64__
+ {
+ /* Extract the list of CPU features from ELF hwcaps */
+ uint32_t hwcaps = 0;
+ hwcaps = get_elf_hwcap_from_getauxval(AT_HWCAP);
+ if (hwcaps != 0) {
+ int has_fp = (hwcaps & HWCAP_FP);
+ int has_asimd = (hwcaps & HWCAP_ASIMD);
+ int has_aes = (hwcaps & HWCAP_AES);
+ int has_pmull = (hwcaps & HWCAP_PMULL);
+ int has_sha1 = (hwcaps & HWCAP_SHA1);
+ int has_sha2 = (hwcaps & HWCAP_SHA2);
+ int has_crc32 = (hwcaps & HWCAP_CRC32);
+
+ if(has_fp == 0) {
+ D("ERROR: Floating-point unit missing, but is required by Android on AArch64 CPUs\n");
+ }
+ if(has_asimd == 0) {
+ D("ERROR: ASIMD unit missing, but is required by Android on AArch64 CPUs\n");
+ }
-#ifdef __i386__
+ if (has_fp)
+ g_cpuFeatures |= ANDROID_CPU_ARM64_FEATURE_FP;
+ if (has_asimd)
+ g_cpuFeatures |= ANDROID_CPU_ARM64_FEATURE_ASIMD;
+ if (has_aes)
+ g_cpuFeatures |= ANDROID_CPU_ARM64_FEATURE_AES;
+ if (has_pmull)
+ g_cpuFeatures |= ANDROID_CPU_ARM64_FEATURE_PMULL;
+ if (has_sha1)
+ g_cpuFeatures |= ANDROID_CPU_ARM64_FEATURE_SHA1;
+ if (has_sha2)
+ g_cpuFeatures |= ANDROID_CPU_ARM64_FEATURE_SHA2;
+ if (has_crc32)
+ g_cpuFeatures |= ANDROID_CPU_ARM64_FEATURE_CRC32;
+ }
+ }
+#endif /* __aarch64__ */
+
+#if defined(__i386__) || defined(__x86_64__)
int regs[4];
/* According to http://en.wikipedia.org/wiki/CPUID */
@@ -829,10 +1015,50 @@ android_cpuInit(void)
if ((regs[2] & (1 << 23)) != 0) {
g_cpuFeatures |= ANDROID_CPU_X86_FEATURE_POPCNT;
}
+ if ((regs[2] & (1 << 19)) != 0) {
+ g_cpuFeatures |= ANDROID_CPU_X86_FEATURE_SSE4_1;
+ }
+ if ((regs[2] & (1 << 20)) != 0) {
+ g_cpuFeatures |= ANDROID_CPU_X86_FEATURE_SSE4_2;
+ }
if (vendorIsIntel && (regs[2] & (1 << 22)) != 0) {
g_cpuFeatures |= ANDROID_CPU_X86_FEATURE_MOVBE;
}
+ if ((regs[2] & (1 << 25)) != 0) {
+ g_cpuFeatures |= ANDROID_CPU_X86_FEATURE_AES_NI;
+ }
+ if ((regs[2] & (1 << 28)) != 0) {
+ g_cpuFeatures |= ANDROID_CPU_X86_FEATURE_AVX;
+ }
+ if ((regs[2] & (1 << 30)) != 0) {
+ g_cpuFeatures |= ANDROID_CPU_X86_FEATURE_RDRAND;
+ }
+
+ x86_cpuid(7, regs);
+ if ((regs[1] & (1 << 5)) != 0) {
+ g_cpuFeatures |= ANDROID_CPU_X86_FEATURE_AVX2;
+ }
+ if ((regs[1] & (1 << 29)) != 0) {
+ g_cpuFeatures |= ANDROID_CPU_X86_FEATURE_SHA_NI;
+ }
+
+
#endif
+#if defined( __mips__)
+ { /* MIPS and MIPS64 */
+ /* Extract the list of CPU features from ELF hwcaps */
+ uint32_t hwcaps = 0;
+ hwcaps = get_elf_hwcap_from_getauxval(AT_HWCAP);
+ if (hwcaps != 0) {
+ int has_r6 = (hwcaps & HWCAP_MIPS_R6);
+ int has_msa = (hwcaps & HWCAP_MIPS_MSA);
+ if (has_r6)
+ g_cpuFeatures |= ANDROID_CPU_MIPS_FEATURE_R6;
+ if (has_msa)
+ g_cpuFeatures |= ANDROID_CPU_MIPS_FEATURE_MSA;
+ }
+ }
+#endif /* __mips__ */
free(cpuinfo);
}
@@ -1085,5 +1311,3 @@ android_setCpuArm(int cpu_count, uint64_t cpu_features, uint32_t cpu_id)
* ARCH_NEON_FP16 (+EXT_FP16)
*
*/
-
-#endif // defined(__le32__)
diff --git a/platform/android/cpu-features.h b/thirdparty/libvpx/third_party/android/cpu-features.h
index 01b7fe207c..1e9724197a 100644
--- a/platform/android/cpu-features.h
+++ b/thirdparty/libvpx/third_party/android/cpu-features.h
@@ -33,6 +33,9 @@
__BEGIN_DECLS
+/* A list of valid values returned by android_getCpuFamily().
+ * They describe the CPU Architecture of the current process.
+ */
typedef enum {
ANDROID_CPU_FAMILY_UNKNOWN = 0,
ANDROID_CPU_FAMILY_ARM,
@@ -46,11 +49,24 @@ typedef enum {
} AndroidCpuFamily;
-/* Return family of the device's CPU */
-extern AndroidCpuFamily android_getCpuFamily(void);
+/* Return the CPU family of the current process.
+ *
+ * Note that this matches the bitness of the current process. I.e. when
+ * running a 32-bit binary on a 64-bit capable CPU, this will return the
+ * 32-bit CPU family value.
+ */
+extern AndroidCpuFamily android_getCpuFamily(void);
+
+/* Return a bitmap describing a set of optional CPU features that are
+ * supported by the current device's CPU. The exact bit-flags returned
+ * depend on the value returned by android_getCpuFamily(). See the
+ * documentation for the ANDROID_CPU_*_FEATURE_* flags below for details.
+ */
+extern uint64_t android_getCpuFeatures(void);
-/* The list of feature flags for ARM CPUs that can be recognized by the
- * library. Value details are:
+/* The list of feature flags for ANDROID_CPU_FAMILY_ARM that can be
+ * recognized by the library (see note below for 64-bit ARM). Value details
+ * are:
*
* VFPv2:
* CPU supports the VFPv2 instruction set. Many, but not all, ARMv6 CPUs
@@ -106,6 +122,27 @@ extern AndroidCpuFamily android_getCpuFamily(void);
* ARM CPU. This is only available on a few XScale-based CPU designs
* sold by Marvell. Pretty rare in practice.
*
+ * AES:
+ * CPU supports AES instructions. These instructions are only
+ * available for 32-bit applications running on ARMv8 CPU.
+ *
+ * CRC32:
+ * CPU supports CRC32 instructions. These instructions are only
+ * available for 32-bit applications running on ARMv8 CPU.
+ *
+ * SHA2:
+ * CPU supports SHA2 instructions. These instructions are only
+ * available for 32-bit applications running on ARMv8 CPU.
+ *
+ * SHA1:
+ * CPU supports SHA1 instructions. These instructions are only
+ * available for 32-bit applications running on ARMv8 CPU.
+ *
+ * PMULL:
+ * CPU supports 64-bit PMULL and PMULL2 instructions. These
+ * instructions are only available for 32-bit applications
+ * running on ARMv8 CPU.
+ *
* If you want to tell the compiler to generate code that targets one of
* the feature set above, you should probably use one of the following
* flags (for more details, see technical note at the end of this file):
@@ -153,6 +190,13 @@ extern AndroidCpuFamily android_getCpuFamily(void);
*
* -mcpu=iwmmxt
* Allows the use of iWMMXt instrinsics with GCC.
+ *
+ * IMPORTANT NOTE: These flags should only be tested when
+ * android_getCpuFamily() returns ANDROID_CPU_FAMILY_ARM, i.e. this is a
+ * 32-bit process.
+ *
+ * When running a 64-bit ARM process on an ARMv8 CPU,
+ * android_getCpuFeatures() will return a different set of bitflags
*/
enum {
ANDROID_CPU_ARM_FEATURE_ARMv7 = (1 << 0),
@@ -167,19 +211,84 @@ enum {
ANDROID_CPU_ARM_FEATURE_IDIV_ARM = (1 << 9),
ANDROID_CPU_ARM_FEATURE_IDIV_THUMB2 = (1 << 10),
ANDROID_CPU_ARM_FEATURE_iWMMXt = (1 << 11),
+ ANDROID_CPU_ARM_FEATURE_AES = (1 << 12),
+ ANDROID_CPU_ARM_FEATURE_PMULL = (1 << 13),
+ ANDROID_CPU_ARM_FEATURE_SHA1 = (1 << 14),
+ ANDROID_CPU_ARM_FEATURE_SHA2 = (1 << 15),
+ ANDROID_CPU_ARM_FEATURE_CRC32 = (1 << 16),
+};
+
+/* The bit flags corresponding to the output of android_getCpuFeatures()
+ * when android_getCpuFamily() returns ANDROID_CPU_FAMILY_ARM64. Value details
+ * are:
+ *
+ * FP:
+ * CPU has Floating-point unit.
+ *
+ * ASIMD:
+ * CPU has Advanced SIMD unit.
+ *
+ * AES:
+ * CPU supports AES instructions.
+ *
+ * CRC32:
+ * CPU supports CRC32 instructions.
+ *
+ * SHA2:
+ * CPU supports SHA2 instructions.
+ *
+ * SHA1:
+ * CPU supports SHA1 instructions.
+ *
+ * PMULL:
+ * CPU supports 64-bit PMULL and PMULL2 instructions.
+ */
+enum {
+ ANDROID_CPU_ARM64_FEATURE_FP = (1 << 0),
+ ANDROID_CPU_ARM64_FEATURE_ASIMD = (1 << 1),
+ ANDROID_CPU_ARM64_FEATURE_AES = (1 << 2),
+ ANDROID_CPU_ARM64_FEATURE_PMULL = (1 << 3),
+ ANDROID_CPU_ARM64_FEATURE_SHA1 = (1 << 4),
+ ANDROID_CPU_ARM64_FEATURE_SHA2 = (1 << 5),
+ ANDROID_CPU_ARM64_FEATURE_CRC32 = (1 << 6),
};
+/* The bit flags corresponding to the output of android_getCpuFeatures()
+ * when android_getCpuFamily() returns ANDROID_CPU_FAMILY_X86 or
+ * ANDROID_CPU_FAMILY_X86_64.
+ */
enum {
ANDROID_CPU_X86_FEATURE_SSSE3 = (1 << 0),
ANDROID_CPU_X86_FEATURE_POPCNT = (1 << 1),
ANDROID_CPU_X86_FEATURE_MOVBE = (1 << 2),
+ ANDROID_CPU_X86_FEATURE_SSE4_1 = (1 << 3),
+ ANDROID_CPU_X86_FEATURE_SSE4_2 = (1 << 4),
+ ANDROID_CPU_X86_FEATURE_AES_NI = (1 << 5),
+ ANDROID_CPU_X86_FEATURE_AVX = (1 << 6),
+ ANDROID_CPU_X86_FEATURE_RDRAND = (1 << 7),
+ ANDROID_CPU_X86_FEATURE_AVX2 = (1 << 8),
+ ANDROID_CPU_X86_FEATURE_SHA_NI = (1 << 9),
+};
+
+/* The bit flags corresponding to the output of android_getCpuFeatures()
+ * when android_getCpuFamily() returns ANDROID_CPU_FAMILY_MIPS
+ * or ANDROID_CPU_FAMILY_MIPS64. Values are:
+ *
+ * R6:
+ * CPU executes MIPS Release 6 instructions natively, and
+ * supports obsoleted R1..R5 instructions only via kernel traps.
+ *
+ * MSA:
+ * CPU supports Mips SIMD Architecture instructions.
+ */
+enum {
+ ANDROID_CPU_MIPS_FEATURE_R6 = (1 << 0),
+ ANDROID_CPU_MIPS_FEATURE_MSA = (1 << 1),
};
-extern uint64_t android_getCpuFeatures(void);
-#define android_getCpuFeaturesExt android_getCpuFeatures
/* Return the number of CPU cores detected on this device. */
-extern int android_getCpuCount(void);
+extern int android_getCpuCount(void);
/* The following is used to force the CPU count and features
* mask in sandboxed processes. Under 4.1 and higher, these processes
diff --git a/thirdparty/libwebp/src/dec/alphai_dec.h b/thirdparty/libwebp/src/dec/alphai_dec.h
index e0fa281a55..a64104abeb 100644
--- a/thirdparty/libwebp/src/dec/alphai_dec.h
+++ b/thirdparty/libwebp/src/dec/alphai_dec.h
@@ -51,4 +51,4 @@ void WebPDeallocateAlphaMemory(VP8Decoder* const dec);
} // extern "C"
#endif
-#endif /* WEBP_DEC_ALPHAI_DEC_H_ */
+#endif // WEBP_DEC_ALPHAI_DEC_H_
diff --git a/thirdparty/libwebp/src/dec/buffer_dec.c b/thirdparty/libwebp/src/dec/buffer_dec.c
index 75eb3c40b4..3cd94eb4d9 100644
--- a/thirdparty/libwebp/src/dec/buffer_dec.c
+++ b/thirdparty/libwebp/src/dec/buffer_dec.c
@@ -74,7 +74,8 @@ static VP8StatusCode CheckDecBuffer(const WebPDecBuffer* const buffer) {
} else { // RGB checks
const WebPRGBABuffer* const buf = &buffer->u.RGBA;
const int stride = abs(buf->stride);
- const uint64_t size = MIN_BUFFER_SIZE(width, height, stride);
+ const uint64_t size =
+ MIN_BUFFER_SIZE(width * kModeBpp[mode], height, stride);
ok &= (size <= buf->size);
ok &= (stride >= width * kModeBpp[mode]);
ok &= (buf->rgba != NULL);
diff --git a/thirdparty/libwebp/src/dec/common_dec.h b/thirdparty/libwebp/src/dec/common_dec.h
index 9995f1a51a..b158550a80 100644
--- a/thirdparty/libwebp/src/dec/common_dec.h
+++ b/thirdparty/libwebp/src/dec/common_dec.h
@@ -51,4 +51,4 @@ enum { MB_FEATURE_TREE_PROBS = 3,
NUM_PROBAS = 11
};
-#endif // WEBP_DEC_COMMON_DEC_H_
+#endif // WEBP_DEC_COMMON_DEC_H_
diff --git a/thirdparty/libwebp/src/dec/frame_dec.c b/thirdparty/libwebp/src/dec/frame_dec.c
index a9d5430d00..bda9e1a6f6 100644
--- a/thirdparty/libwebp/src/dec/frame_dec.c
+++ b/thirdparty/libwebp/src/dec/frame_dec.c
@@ -338,7 +338,6 @@ void VP8InitDithering(const WebPDecoderOptions* const options,
for (s = 0; s < NUM_MB_SEGMENTS; ++s) {
VP8QuantMatrix* const dqm = &dec->dqm_[s];
if (dqm->uv_quant_ < DITHER_AMP_TAB_SIZE) {
- // TODO(skal): should we specially dither more for uv_quant_ < 0?
const int idx = (dqm->uv_quant_ < 0) ? 0 : dqm->uv_quant_;
dqm->dither_ = (f * kQuantToDitherAmp[idx]) >> 3;
}
@@ -669,15 +668,9 @@ int VP8GetThreadMethod(const WebPDecoderOptions* const options,
(void)height;
assert(headers == NULL || !headers->is_lossless);
#if defined(WEBP_USE_THREAD)
- if (width < MIN_WIDTH_FOR_THREADS) return 0;
- // TODO(skal): tune the heuristic further
-#if 0
- if (height < 2 * width) return 2;
+ if (width >= MIN_WIDTH_FOR_THREADS) return 2;
#endif
- return 2;
-#else // !WEBP_USE_THREAD
return 0;
-#endif
}
#undef MT_CACHE_LINES
diff --git a/thirdparty/libwebp/src/dec/idec_dec.c b/thirdparty/libwebp/src/dec/idec_dec.c
index a371ed7500..9bc9166808 100644
--- a/thirdparty/libwebp/src/dec/idec_dec.c
+++ b/thirdparty/libwebp/src/dec/idec_dec.c
@@ -140,10 +140,9 @@ static void DoRemap(WebPIDecoder* const idec, ptrdiff_t offset) {
if (NeedCompressedAlpha(idec)) {
ALPHDecoder* const alph_dec = dec->alph_dec_;
dec->alpha_data_ += offset;
- if (alph_dec != NULL) {
+ if (alph_dec != NULL && alph_dec->vp8l_dec_ != NULL) {
if (alph_dec->method_ == ALPHA_LOSSLESS_COMPRESSION) {
VP8LDecoder* const alph_vp8l_dec = alph_dec->vp8l_dec_;
- assert(alph_vp8l_dec != NULL);
assert(dec->alpha_data_size_ >= ALPHA_HEADER_LEN);
VP8LBitReaderSetBuffer(&alph_vp8l_dec->br_,
dec->alpha_data_ + ALPHA_HEADER_LEN,
@@ -283,10 +282,8 @@ static void RestoreContext(const MBContext* context, VP8Decoder* const dec,
static VP8StatusCode IDecError(WebPIDecoder* const idec, VP8StatusCode error) {
if (idec->state_ == STATE_VP8_DATA) {
- VP8Io* const io = &idec->io_;
- if (io->teardown != NULL) {
- io->teardown(io);
- }
+ // Synchronize the thread, clean-up and check for errors.
+ VP8ExitCritical((VP8Decoder*)idec->dec_, &idec->io_);
}
idec->state_ = STATE_ERROR;
return error;
@@ -451,7 +448,10 @@ static VP8StatusCode DecodeRemaining(WebPIDecoder* const idec) {
VP8Decoder* const dec = (VP8Decoder*)idec->dec_;
VP8Io* const io = &idec->io_;
- assert(dec->ready_);
+ // Make sure partition #0 has been read before, to set dec to ready_.
+ if (!dec->ready_) {
+ return IDecError(idec, VP8_STATUS_BITSTREAM_ERROR);
+ }
for (; dec->mb_y_ < dec->mb_h_; ++dec->mb_y_) {
if (idec->last_mb_y_ != dec->mb_y_) {
if (!VP8ParseIntraModeRow(&dec->br_, dec)) {
@@ -473,6 +473,12 @@ static VP8StatusCode DecodeRemaining(WebPIDecoder* const idec) {
MemDataSize(&idec->mem_) > MAX_MB_SIZE) {
return IDecError(idec, VP8_STATUS_BITSTREAM_ERROR);
}
+ // Synchronize the threads.
+ if (dec->mt_method_ > 0) {
+ if (!WebPGetWorkerInterface()->Sync(&dec->worker_)) {
+ return IDecError(idec, VP8_STATUS_BITSTREAM_ERROR);
+ }
+ }
RestoreContext(&context, dec, token_br);
return VP8_STATUS_SUSPENDED;
}
@@ -491,6 +497,7 @@ static VP8StatusCode DecodeRemaining(WebPIDecoder* const idec) {
}
// Synchronize the thread and check for errors.
if (!VP8ExitCritical(dec, io)) {
+ idec->state_ = STATE_ERROR; // prevent re-entry in IDecError
return IDecError(idec, VP8_STATUS_USER_ABORT);
}
dec->ready_ = 0;
@@ -571,6 +578,10 @@ static VP8StatusCode IDecode(WebPIDecoder* idec) {
status = DecodePartition0(idec);
}
if (idec->state_ == STATE_VP8_DATA) {
+ const VP8Decoder* const dec = (VP8Decoder*)idec->dec_;
+ if (dec == NULL) {
+ return VP8_STATUS_SUSPENDED; // can't continue if we have no decoder.
+ }
status = DecodeRemaining(idec);
}
if (idec->state_ == STATE_VP8L_HEADER) {
diff --git a/thirdparty/libwebp/src/dec/vp8_dec.h b/thirdparty/libwebp/src/dec/vp8_dec.h
index ca85b340cf..a05405df72 100644
--- a/thirdparty/libwebp/src/dec/vp8_dec.h
+++ b/thirdparty/libwebp/src/dec/vp8_dec.h
@@ -182,4 +182,4 @@ WEBP_EXTERN int VP8LGetInfo(
} // extern "C"
#endif
-#endif /* WEBP_DEC_VP8_DEC_H_ */
+#endif // WEBP_DEC_VP8_DEC_H_
diff --git a/thirdparty/libwebp/src/dec/vp8i_dec.h b/thirdparty/libwebp/src/dec/vp8i_dec.h
index c929933e1c..e5e89df57d 100644
--- a/thirdparty/libwebp/src/dec/vp8i_dec.h
+++ b/thirdparty/libwebp/src/dec/vp8i_dec.h
@@ -32,7 +32,7 @@ extern "C" {
// version numbers
#define DEC_MAJ_VERSION 1
#define DEC_MIN_VERSION 0
-#define DEC_REV_VERSION 0
+#define DEC_REV_VERSION 1
// YUV-cache parameters. Cache is 32-bytes wide (= one cacheline).
// Constraints are: We need to store one 16x16 block of luma samples (y),
@@ -316,4 +316,4 @@ const uint8_t* VP8DecompressAlphaRows(VP8Decoder* const dec,
} // extern "C"
#endif
-#endif /* WEBP_DEC_VP8I_DEC_H_ */
+#endif // WEBP_DEC_VP8I_DEC_H_
diff --git a/thirdparty/libwebp/src/dec/vp8l_dec.c b/thirdparty/libwebp/src/dec/vp8l_dec.c
index 0570f53a77..333bb3e80d 100644
--- a/thirdparty/libwebp/src/dec/vp8l_dec.c
+++ b/thirdparty/libwebp/src/dec/vp8l_dec.c
@@ -362,12 +362,19 @@ static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
VP8LMetadata* const hdr = &dec->hdr_;
uint32_t* huffman_image = NULL;
HTreeGroup* htree_groups = NULL;
+ // When reading htrees, some might be unused, as the format allows it.
+ // We will still read them but put them in this htree_group_bogus.
+ HTreeGroup htree_group_bogus;
HuffmanCode* huffman_tables = NULL;
+ HuffmanCode* huffman_tables_bogus = NULL;
HuffmanCode* next = NULL;
int num_htree_groups = 1;
+ int num_htree_groups_max = 1;
int max_alphabet_size = 0;
int* code_lengths = NULL;
const int table_size = kTableSize[color_cache_bits];
+ int* mapping = NULL;
+ int ok = 0;
if (allow_recursion && VP8LReadBits(br, 1)) {
// use meta Huffman codes.
@@ -384,9 +391,41 @@ static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
// The huffman data is stored in red and green bytes.
const int group = (huffman_image[i] >> 8) & 0xffff;
huffman_image[i] = group;
- if (group >= num_htree_groups) {
- num_htree_groups = group + 1;
+ if (group >= num_htree_groups_max) {
+ num_htree_groups_max = group + 1;
+ }
+ }
+ // Check the validity of num_htree_groups_max. If it seems too big, use a
+ // smaller value for later. This will prevent big memory allocations to end
+ // up with a bad bitstream anyway.
+ // The value of 1000 is totally arbitrary. We know that num_htree_groups_max
+ // is smaller than (1 << 16) and should be smaller than the number of pixels
+ // (though the format allows it to be bigger).
+ if (num_htree_groups_max > 1000 || num_htree_groups_max > xsize * ysize) {
+ // Create a mapping from the used indices to the minimal set of used
+ // values [0, num_htree_groups)
+ mapping = (int*)WebPSafeMalloc(num_htree_groups_max, sizeof(*mapping));
+ if (mapping == NULL) {
+ dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
+ goto Error;
+ }
+ // -1 means a value is unmapped, and therefore unused in the Huffman
+ // image.
+ memset(mapping, 0xff, num_htree_groups_max * sizeof(*mapping));
+ for (num_htree_groups = 0, i = 0; i < huffman_pixs; ++i) {
+ // Get the current mapping for the group and remap the Huffman image.
+ int* const mapped_group = &mapping[huffman_image[i]];
+ if (*mapped_group == -1) *mapped_group = num_htree_groups++;
+ huffman_image[i] = *mapped_group;
+ }
+ huffman_tables_bogus = (HuffmanCode*)WebPSafeMalloc(
+ table_size, sizeof(*huffman_tables_bogus));
+ if (huffman_tables_bogus == NULL) {
+ dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
+ goto Error;
}
+ } else {
+ num_htree_groups = num_htree_groups_max;
}
}
@@ -403,11 +442,11 @@ static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
}
}
+ code_lengths = (int*)WebPSafeCalloc((uint64_t)max_alphabet_size,
+ sizeof(*code_lengths));
huffman_tables = (HuffmanCode*)WebPSafeMalloc(num_htree_groups * table_size,
sizeof(*huffman_tables));
htree_groups = VP8LHtreeGroupsNew(num_htree_groups);
- code_lengths = (int*)WebPSafeCalloc((uint64_t)max_alphabet_size,
- sizeof(*code_lengths));
if (htree_groups == NULL || code_lengths == NULL || huffman_tables == NULL) {
dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
@@ -415,28 +454,35 @@ static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
}
next = huffman_tables;
- for (i = 0; i < num_htree_groups; ++i) {
- HTreeGroup* const htree_group = &htree_groups[i];
+ for (i = 0; i < num_htree_groups_max; ++i) {
+ // If the index "i" is unused in the Huffman image, read the coefficients
+ // but store them to a bogus htree_group.
+ const int is_bogus = (mapping != NULL && mapping[i] == -1);
+ HTreeGroup* const htree_group =
+ is_bogus ? &htree_group_bogus :
+ &htree_groups[(mapping == NULL) ? i : mapping[i]];
HuffmanCode** const htrees = htree_group->htrees;
+ HuffmanCode* huffman_tables_i = is_bogus ? huffman_tables_bogus : next;
int size;
int total_size = 0;
int is_trivial_literal = 1;
int max_bits = 0;
for (j = 0; j < HUFFMAN_CODES_PER_META_CODE; ++j) {
int alphabet_size = kAlphabetSize[j];
- htrees[j] = next;
+ htrees[j] = huffman_tables_i;
if (j == 0 && color_cache_bits > 0) {
alphabet_size += 1 << color_cache_bits;
}
- size = ReadHuffmanCode(alphabet_size, dec, code_lengths, next);
+ size =
+ ReadHuffmanCode(alphabet_size, dec, code_lengths, huffman_tables_i);
if (size == 0) {
goto Error;
}
if (is_trivial_literal && kLiteralMap[j] == 1) {
- is_trivial_literal = (next->bits == 0);
+ is_trivial_literal = (huffman_tables_i->bits == 0);
}
- total_size += next->bits;
- next += size;
+ total_size += huffman_tables_i->bits;
+ huffman_tables_i += size;
if (j <= ALPHA) {
int local_max_bits = code_lengths[0];
int k;
@@ -448,38 +494,41 @@ static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
max_bits += local_max_bits;
}
}
+ if (!is_bogus) next = huffman_tables_i;
htree_group->is_trivial_literal = is_trivial_literal;
htree_group->is_trivial_code = 0;
if (is_trivial_literal) {
const int red = htrees[RED][0].value;
const int blue = htrees[BLUE][0].value;
const int alpha = htrees[ALPHA][0].value;
- htree_group->literal_arb =
- ((uint32_t)alpha << 24) | (red << 16) | blue;
+ htree_group->literal_arb = ((uint32_t)alpha << 24) | (red << 16) | blue;
if (total_size == 0 && htrees[GREEN][0].value < NUM_LITERAL_CODES) {
htree_group->is_trivial_code = 1;
htree_group->literal_arb |= htrees[GREEN][0].value << 8;
}
}
- htree_group->use_packed_table = !htree_group->is_trivial_code &&
- (max_bits < HUFFMAN_PACKED_BITS);
+ htree_group->use_packed_table =
+ !htree_group->is_trivial_code && (max_bits < HUFFMAN_PACKED_BITS);
if (htree_group->use_packed_table) BuildPackedTable(htree_group);
}
- WebPSafeFree(code_lengths);
+ ok = 1;
- // All OK. Finalize pointers and return.
+ // All OK. Finalize pointers.
hdr->huffman_image_ = huffman_image;
hdr->num_htree_groups_ = num_htree_groups;
hdr->htree_groups_ = htree_groups;
hdr->huffman_tables_ = huffman_tables;
- return 1;
Error:
WebPSafeFree(code_lengths);
- WebPSafeFree(huffman_image);
- WebPSafeFree(huffman_tables);
- VP8LHtreeGroupsFree(htree_groups);
- return 0;
+ WebPSafeFree(huffman_tables_bogus);
+ WebPSafeFree(mapping);
+ if (!ok) {
+ WebPSafeFree(huffman_image);
+ WebPSafeFree(huffman_tables);
+ VP8LHtreeGroupsFree(htree_groups);
+ }
+ return ok;
}
//------------------------------------------------------------------------------
@@ -884,7 +933,11 @@ static WEBP_INLINE void CopyBlock8b(uint8_t* const dst, int dist, int length) {
#endif
break;
case 2:
+#if !defined(WORDS_BIGENDIAN)
memcpy(&pattern, src, sizeof(uint16_t));
+#else
+ pattern = ((uint32_t)src[0] << 8) | src[1];
+#endif
#if defined(__arm__) || defined(_M_ARM)
pattern |= pattern << 16;
#elif defined(WEBP_USE_MIPS_DSP_R2)
@@ -1523,7 +1576,6 @@ int VP8LDecodeAlphaHeader(ALPHDecoder* const alph_dec,
if (dec == NULL) return 0;
assert(alph_dec != NULL);
- alph_dec->vp8l_dec_ = dec;
dec->width_ = alph_dec->width_;
dec->height_ = alph_dec->height_;
@@ -1555,11 +1607,12 @@ int VP8LDecodeAlphaHeader(ALPHDecoder* const alph_dec,
if (!ok) goto Err;
+ // Only set here, once we are sure it is valid (to avoid thread races).
+ alph_dec->vp8l_dec_ = dec;
return 1;
Err:
- VP8LDelete(alph_dec->vp8l_dec_);
- alph_dec->vp8l_dec_ = NULL;
+ VP8LDelete(dec);
return 0;
}
diff --git a/thirdparty/libwebp/src/dec/vp8li_dec.h b/thirdparty/libwebp/src/dec/vp8li_dec.h
index 8e500cf9ff..0a4d613f99 100644
--- a/thirdparty/libwebp/src/dec/vp8li_dec.h
+++ b/thirdparty/libwebp/src/dec/vp8li_dec.h
@@ -132,4 +132,4 @@ void VP8LDelete(VP8LDecoder* const dec);
} // extern "C"
#endif
-#endif /* WEBP_DEC_VP8LI_DEC_H_ */
+#endif // WEBP_DEC_VP8LI_DEC_H_
diff --git a/thirdparty/libwebp/src/dec/webpi_dec.h b/thirdparty/libwebp/src/dec/webpi_dec.h
index c378ba6fc3..24baff5d27 100644
--- a/thirdparty/libwebp/src/dec/webpi_dec.h
+++ b/thirdparty/libwebp/src/dec/webpi_dec.h
@@ -130,4 +130,4 @@ int WebPAvoidSlowMemory(const WebPDecBuffer* const output,
} // extern "C"
#endif
-#endif /* WEBP_DEC_WEBPI_DEC_H_ */
+#endif // WEBP_DEC_WEBPI_DEC_H_
diff --git a/thirdparty/libwebp/src/demux/demux.c b/thirdparty/libwebp/src/demux/demux.c
index 684215e3de..a69c65b7cf 100644
--- a/thirdparty/libwebp/src/demux/demux.c
+++ b/thirdparty/libwebp/src/demux/demux.c
@@ -25,7 +25,7 @@
#define DMUX_MAJ_VERSION 1
#define DMUX_MIN_VERSION 0
-#define DMUX_REV_VERSION 0
+#define DMUX_REV_VERSION 1
typedef struct {
size_t start_; // start location of the data
diff --git a/thirdparty/libwebp/src/dsp/dsp.h b/thirdparty/libwebp/src/dsp/dsp.h
index 4ab77a5130..fafc2d05d3 100644
--- a/thirdparty/libwebp/src/dsp/dsp.h
+++ b/thirdparty/libwebp/src/dsp/dsp.h
@@ -76,10 +76,6 @@ extern "C" {
#define WEBP_USE_SSE41
#endif
-#if defined(__AVX2__) || defined(WEBP_HAVE_AVX2)
-#define WEBP_USE_AVX2
-#endif
-
// The intrinsics currently cause compiler errors with arm-nacl-gcc and the
// inline assembly would need to be modified for use with Native Client.
#if (defined(__ARM_NEON__) || \
@@ -679,4 +675,4 @@ void VP8FiltersInit(void);
} // extern "C"
#endif
-#endif /* WEBP_DSP_DSP_H_ */
+#endif // WEBP_DSP_DSP_H_
diff --git a/thirdparty/libwebp/src/dsp/enc.c b/thirdparty/libwebp/src/dsp/enc.c
index fa23b40a30..2fddbc4c52 100644
--- a/thirdparty/libwebp/src/dsp/enc.c
+++ b/thirdparty/libwebp/src/dsp/enc.c
@@ -734,7 +734,6 @@ VP8BlockCopy VP8Copy16x8;
extern void VP8EncDspInitSSE2(void);
extern void VP8EncDspInitSSE41(void);
-extern void VP8EncDspInitAVX2(void);
extern void VP8EncDspInitNEON(void);
extern void VP8EncDspInitMIPS32(void);
extern void VP8EncDspInitMIPSdspR2(void);
@@ -784,11 +783,6 @@ WEBP_DSP_INIT_FUNC(VP8EncDspInit) {
#endif
}
#endif
-#if defined(WEBP_USE_AVX2)
- if (VP8GetCPUInfo(kAVX2)) {
- VP8EncDspInitAVX2();
- }
-#endif
#if defined(WEBP_USE_MIPS32)
if (VP8GetCPUInfo(kMIPS32)) {
VP8EncDspInitMIPS32();
diff --git a/thirdparty/libwebp/src/dsp/enc_avx2.c b/thirdparty/libwebp/src/dsp/enc_avx2.c
deleted file mode 100644
index 8bc5798fee..0000000000
--- a/thirdparty/libwebp/src/dsp/enc_avx2.c
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2014 Google Inc. All Rights Reserved.
-//
-// Use of this source code is governed by a BSD-style license
-// that can be found in the COPYING file in the root of the source
-// tree. An additional intellectual property rights grant can be found
-// in the file PATENTS. All contributing project authors may
-// be found in the AUTHORS file in the root of the source tree.
-// -----------------------------------------------------------------------------
-//
-// AVX2 version of speed-critical encoding functions.
-
-#include "src/dsp/dsp.h"
-
-#if defined(WEBP_USE_AVX2)
-
-#endif // WEBP_USE_AVX2
-
-//------------------------------------------------------------------------------
-// Entry point
-
-WEBP_DSP_INIT_STUB(VP8EncDspInitAVX2)
diff --git a/thirdparty/libwebp/src/dsp/lossless.c b/thirdparty/libwebp/src/dsp/lossless.c
index f9b3c182d3..d21aa6a0a0 100644
--- a/thirdparty/libwebp/src/dsp/lossless.c
+++ b/thirdparty/libwebp/src/dsp/lossless.c
@@ -23,8 +23,6 @@
#include "src/dsp/lossless.h"
#include "src/dsp/lossless_common.h"
-#define MAX_DIFF_COST (1e30f)
-
//------------------------------------------------------------------------------
// Image transforms.
diff --git a/thirdparty/libwebp/src/dsp/lossless.h b/thirdparty/libwebp/src/dsp/lossless.h
index b2bbdfc93c..f709cc86b2 100644
--- a/thirdparty/libwebp/src/dsp/lossless.h
+++ b/thirdparty/libwebp/src/dsp/lossless.h
@@ -163,7 +163,7 @@ extern VP8LCostCombinedFunc VP8LExtraCostCombined;
extern VP8LCombinedShannonEntropyFunc VP8LCombinedShannonEntropy;
typedef struct { // small struct to hold counters
- int counts[2]; // index: 0=zero steak, 1=non-zero streak
+ int counts[2]; // index: 0=zero streak, 1=non-zero streak
int streaks[2][2]; // [zero/non-zero][streak<3 / streak>=3]
} VP8LStreaks;
@@ -194,10 +194,14 @@ extern VP8LGetEntropyUnrefinedFunc VP8LGetEntropyUnrefined;
void VP8LBitsEntropyUnrefined(const uint32_t* const array, int n,
VP8LBitEntropy* const entropy);
-typedef void (*VP8LHistogramAddFunc)(const VP8LHistogram* const a,
- const VP8LHistogram* const b,
- VP8LHistogram* const out);
-extern VP8LHistogramAddFunc VP8LHistogramAdd;
+typedef void (*VP8LAddVectorFunc)(const uint32_t* a, const uint32_t* b,
+ uint32_t* out, int size);
+extern VP8LAddVectorFunc VP8LAddVector;
+typedef void (*VP8LAddVectorEqFunc)(const uint32_t* a, uint32_t* out, int size);
+extern VP8LAddVectorEqFunc VP8LAddVectorEq;
+void VP8LHistogramAdd(const VP8LHistogram* const a,
+ const VP8LHistogram* const b,
+ VP8LHistogram* const out);
// -----------------------------------------------------------------------------
// PrefixEncode()
diff --git a/thirdparty/libwebp/src/dsp/lossless_enc.c b/thirdparty/libwebp/src/dsp/lossless_enc.c
index d608326fef..1408fbf580 100644
--- a/thirdparty/libwebp/src/dsp/lossless_enc.c
+++ b/thirdparty/libwebp/src/dsp/lossless_enc.c
@@ -632,38 +632,67 @@ static double ExtraCostCombined_C(const uint32_t* X, const uint32_t* Y,
//------------------------------------------------------------------------------
-static void HistogramAdd_C(const VP8LHistogram* const a,
- const VP8LHistogram* const b,
- VP8LHistogram* const out) {
+static void AddVector_C(const uint32_t* a, const uint32_t* b, uint32_t* out,
+ int size) {
+ int i;
+ for (i = 0; i < size; ++i) out[i] = a[i] + b[i];
+}
+
+static void AddVectorEq_C(const uint32_t* a, uint32_t* out, int size) {
+ int i;
+ for (i = 0; i < size; ++i) out[i] += a[i];
+}
+
+#define ADD(X, ARG, LEN) do { \
+ if (a->is_used_[X]) { \
+ if (b->is_used_[X]) { \
+ VP8LAddVector(a->ARG, b->ARG, out->ARG, (LEN)); \
+ } else { \
+ memcpy(&out->ARG[0], &a->ARG[0], (LEN) * sizeof(out->ARG[0])); \
+ } \
+ } else if (b->is_used_[X]) { \
+ memcpy(&out->ARG[0], &b->ARG[0], (LEN) * sizeof(out->ARG[0])); \
+ } else { \
+ memset(&out->ARG[0], 0, (LEN) * sizeof(out->ARG[0])); \
+ } \
+} while (0)
+
+#define ADD_EQ(X, ARG, LEN) do { \
+ if (a->is_used_[X]) { \
+ if (out->is_used_[X]) { \
+ VP8LAddVectorEq(a->ARG, out->ARG, (LEN)); \
+ } else { \
+ memcpy(&out->ARG[0], &a->ARG[0], (LEN) * sizeof(out->ARG[0])); \
+ } \
+ } \
+} while (0)
+
+void VP8LHistogramAdd(const VP8LHistogram* const a,
+ const VP8LHistogram* const b, VP8LHistogram* const out) {
int i;
const int literal_size = VP8LHistogramNumCodes(a->palette_code_bits_);
assert(a->palette_code_bits_ == b->palette_code_bits_);
+
if (b != out) {
- for (i = 0; i < literal_size; ++i) {
- out->literal_[i] = a->literal_[i] + b->literal_[i];
- }
- for (i = 0; i < NUM_DISTANCE_CODES; ++i) {
- out->distance_[i] = a->distance_[i] + b->distance_[i];
- }
- for (i = 0; i < NUM_LITERAL_CODES; ++i) {
- out->red_[i] = a->red_[i] + b->red_[i];
- out->blue_[i] = a->blue_[i] + b->blue_[i];
- out->alpha_[i] = a->alpha_[i] + b->alpha_[i];
+ ADD(0, literal_, literal_size);
+ ADD(1, red_, NUM_LITERAL_CODES);
+ ADD(2, blue_, NUM_LITERAL_CODES);
+ ADD(3, alpha_, NUM_LITERAL_CODES);
+ ADD(4, distance_, NUM_DISTANCE_CODES);
+ for (i = 0; i < 5; ++i) {
+ out->is_used_[i] = (a->is_used_[i] | b->is_used_[i]);
}
} else {
- for (i = 0; i < literal_size; ++i) {
- out->literal_[i] += a->literal_[i];
- }
- for (i = 0; i < NUM_DISTANCE_CODES; ++i) {
- out->distance_[i] += a->distance_[i];
- }
- for (i = 0; i < NUM_LITERAL_CODES; ++i) {
- out->red_[i] += a->red_[i];
- out->blue_[i] += a->blue_[i];
- out->alpha_[i] += a->alpha_[i];
- }
+ ADD_EQ(0, literal_, literal_size);
+ ADD_EQ(1, red_, NUM_LITERAL_CODES);
+ ADD_EQ(2, blue_, NUM_LITERAL_CODES);
+ ADD_EQ(3, alpha_, NUM_LITERAL_CODES);
+ ADD_EQ(4, distance_, NUM_DISTANCE_CODES);
+ for (i = 0; i < 5; ++i) out->is_used_[i] |= a->is_used_[i];
}
}
+#undef ADD
+#undef ADD_EQ
//------------------------------------------------------------------------------
// Image transforms.
@@ -848,7 +877,8 @@ VP8LCombinedShannonEntropyFunc VP8LCombinedShannonEntropy;
VP8LGetEntropyUnrefinedFunc VP8LGetEntropyUnrefined;
VP8LGetCombinedEntropyUnrefinedFunc VP8LGetCombinedEntropyUnrefined;
-VP8LHistogramAddFunc VP8LHistogramAdd;
+VP8LAddVectorFunc VP8LAddVector;
+VP8LAddVectorEqFunc VP8LAddVectorEq;
VP8LVectorMismatchFunc VP8LVectorMismatch;
VP8LBundleColorMapFunc VP8LBundleColorMap;
@@ -885,7 +915,8 @@ WEBP_DSP_INIT_FUNC(VP8LEncDspInit) {
VP8LGetEntropyUnrefined = GetEntropyUnrefined_C;
VP8LGetCombinedEntropyUnrefined = GetCombinedEntropyUnrefined_C;
- VP8LHistogramAdd = HistogramAdd_C;
+ VP8LAddVector = AddVector_C;
+ VP8LAddVectorEq = AddVectorEq_C;
VP8LVectorMismatch = VectorMismatch_C;
VP8LBundleColorMap = VP8LBundleColorMap_C;
@@ -971,7 +1002,8 @@ WEBP_DSP_INIT_FUNC(VP8LEncDspInit) {
assert(VP8LCombinedShannonEntropy != NULL);
assert(VP8LGetEntropyUnrefined != NULL);
assert(VP8LGetCombinedEntropyUnrefined != NULL);
- assert(VP8LHistogramAdd != NULL);
+ assert(VP8LAddVector != NULL);
+ assert(VP8LAddVectorEq != NULL);
assert(VP8LVectorMismatch != NULL);
assert(VP8LBundleColorMap != NULL);
assert(VP8LPredictorsSub[0] != NULL);
diff --git a/thirdparty/libwebp/src/dsp/lossless_enc_mips32.c b/thirdparty/libwebp/src/dsp/lossless_enc_mips32.c
index e7b58f4e8c..0412a093cf 100644
--- a/thirdparty/libwebp/src/dsp/lossless_enc_mips32.c
+++ b/thirdparty/libwebp/src/dsp/lossless_enc_mips32.c
@@ -344,65 +344,29 @@ static void GetCombinedEntropyUnrefined_MIPS32(const uint32_t X[],
ASM_END_COMMON_0 \
ASM_END_COMMON_1
-#define ADD_VECTOR(A, B, OUT, SIZE, EXTRA_SIZE) do { \
- const uint32_t* pa = (const uint32_t*)(A); \
- const uint32_t* pb = (const uint32_t*)(B); \
- uint32_t* pout = (uint32_t*)(OUT); \
- const uint32_t* const LoopEnd = pa + (SIZE); \
- assert((SIZE) % 4 == 0); \
- ASM_START \
- ADD_TO_OUT(0, 4, 8, 12, 1, pa, pb, pout) \
- ASM_END_0 \
- if ((EXTRA_SIZE) > 0) { \
- const int last = (EXTRA_SIZE); \
- int i; \
- for (i = 0; i < last; ++i) pout[i] = pa[i] + pb[i]; \
- } \
-} while (0)
-
-#define ADD_VECTOR_EQ(A, OUT, SIZE, EXTRA_SIZE) do { \
- const uint32_t* pa = (const uint32_t*)(A); \
- uint32_t* pout = (uint32_t*)(OUT); \
- const uint32_t* const LoopEnd = pa + (SIZE); \
- assert((SIZE) % 4 == 0); \
- ASM_START \
- ADD_TO_OUT(0, 4, 8, 12, 0, pa, pout, pout) \
- ASM_END_1 \
- if ((EXTRA_SIZE) > 0) { \
- const int last = (EXTRA_SIZE); \
- int i; \
- for (i = 0; i < last; ++i) pout[i] += pa[i]; \
- } \
-} while (0)
-
-static void HistogramAdd_MIPS32(const VP8LHistogram* const a,
- const VP8LHistogram* const b,
- VP8LHistogram* const out) {
+static void AddVector_MIPS32(const uint32_t* pa, const uint32_t* pb,
+ uint32_t* pout, int size) {
uint32_t temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7;
- const int extra_cache_size = VP8LHistogramNumCodes(a->palette_code_bits_)
- - (NUM_LITERAL_CODES + NUM_LENGTH_CODES);
- assert(a->palette_code_bits_ == b->palette_code_bits_);
-
- if (b != out) {
- ADD_VECTOR(a->literal_, b->literal_, out->literal_,
- NUM_LITERAL_CODES + NUM_LENGTH_CODES, extra_cache_size);
- ADD_VECTOR(a->distance_, b->distance_, out->distance_,
- NUM_DISTANCE_CODES, 0);
- ADD_VECTOR(a->red_, b->red_, out->red_, NUM_LITERAL_CODES, 0);
- ADD_VECTOR(a->blue_, b->blue_, out->blue_, NUM_LITERAL_CODES, 0);
- ADD_VECTOR(a->alpha_, b->alpha_, out->alpha_, NUM_LITERAL_CODES, 0);
- } else {
- ADD_VECTOR_EQ(a->literal_, out->literal_,
- NUM_LITERAL_CODES + NUM_LENGTH_CODES, extra_cache_size);
- ADD_VECTOR_EQ(a->distance_, out->distance_, NUM_DISTANCE_CODES, 0);
- ADD_VECTOR_EQ(a->red_, out->red_, NUM_LITERAL_CODES, 0);
- ADD_VECTOR_EQ(a->blue_, out->blue_, NUM_LITERAL_CODES, 0);
- ADD_VECTOR_EQ(a->alpha_, out->alpha_, NUM_LITERAL_CODES, 0);
- }
+ const uint32_t end = ((size) / 4) * 4;
+ const uint32_t* const LoopEnd = pa + end;
+ int i;
+ ASM_START
+ ADD_TO_OUT(0, 4, 8, 12, 1, pa, pb, pout)
+ ASM_END_0
+ for (i = end; i < size; ++i) pout[i] = pa[i] + pb[i];
+}
+
+static void AddVectorEq_MIPS32(const uint32_t* pa, uint32_t* pout, int size) {
+ uint32_t temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7;
+ const uint32_t end = ((size) / 4) * 4;
+ const uint32_t* const LoopEnd = pa + end;
+ int i;
+ ASM_START
+ ADD_TO_OUT(0, 4, 8, 12, 0, pa, pout, pout)
+ ASM_END_1
+ for (i = end; i < size; ++i) pout[i] += pa[i];
}
-#undef ADD_VECTOR_EQ
-#undef ADD_VECTOR
#undef ASM_END_1
#undef ASM_END_0
#undef ASM_END_COMMON_1
@@ -422,7 +386,8 @@ WEBP_TSAN_IGNORE_FUNCTION void VP8LEncDspInitMIPS32(void) {
VP8LExtraCostCombined = ExtraCostCombined_MIPS32;
VP8LGetEntropyUnrefined = GetEntropyUnrefined_MIPS32;
VP8LGetCombinedEntropyUnrefined = GetCombinedEntropyUnrefined_MIPS32;
- VP8LHistogramAdd = HistogramAdd_MIPS32;
+ VP8LAddVector = AddVector_MIPS32;
+ VP8LAddVectorEq = AddVectorEq_MIPS32;
}
#else // !WEBP_USE_MIPS32
diff --git a/thirdparty/libwebp/src/dsp/lossless_enc_sse2.c b/thirdparty/libwebp/src/dsp/lossless_enc_sse2.c
index f84a9909e1..36478c4912 100644
--- a/thirdparty/libwebp/src/dsp/lossless_enc_sse2.c
+++ b/thirdparty/libwebp/src/dsp/lossless_enc_sse2.c
@@ -170,12 +170,13 @@ static void CollectColorRedTransforms_SSE2(const uint32_t* argb, int stride,
//------------------------------------------------------------------------------
+// Note we are adding uint32_t's as *signed* int32's (using _mm_add_epi32). But
+// that's ok since the histogram values are less than 1<<28 (max picture size).
#define LINE_SIZE 16 // 8 or 16
static void AddVector_SSE2(const uint32_t* a, const uint32_t* b, uint32_t* out,
int size) {
int i;
- assert(size % LINE_SIZE == 0);
- for (i = 0; i < size; i += LINE_SIZE) {
+ for (i = 0; i + LINE_SIZE <= size; i += LINE_SIZE) {
const __m128i a0 = _mm_loadu_si128((const __m128i*)&a[i + 0]);
const __m128i a1 = _mm_loadu_si128((const __m128i*)&a[i + 4]);
#if (LINE_SIZE == 16)
@@ -195,12 +196,14 @@ static void AddVector_SSE2(const uint32_t* a, const uint32_t* b, uint32_t* out,
_mm_storeu_si128((__m128i*)&out[i + 12], _mm_add_epi32(a3, b3));
#endif
}
+ for (; i < size; ++i) {
+ out[i] = a[i] + b[i];
+ }
}
static void AddVectorEq_SSE2(const uint32_t* a, uint32_t* out, int size) {
int i;
- assert(size % LINE_SIZE == 0);
- for (i = 0; i < size; i += LINE_SIZE) {
+ for (i = 0; i + LINE_SIZE <= size; i += LINE_SIZE) {
const __m128i a0 = _mm_loadu_si128((const __m128i*)&a[i + 0]);
const __m128i a1 = _mm_loadu_si128((const __m128i*)&a[i + 4]);
#if (LINE_SIZE == 16)
@@ -220,35 +223,11 @@ static void AddVectorEq_SSE2(const uint32_t* a, uint32_t* out, int size) {
_mm_storeu_si128((__m128i*)&out[i + 12], _mm_add_epi32(a3, b3));
#endif
}
-}
-#undef LINE_SIZE
-
-// Note we are adding uint32_t's as *signed* int32's (using _mm_add_epi32). But
-// that's ok since the histogram values are less than 1<<28 (max picture size).
-static void HistogramAdd_SSE2(const VP8LHistogram* const a,
- const VP8LHistogram* const b,
- VP8LHistogram* const out) {
- int i;
- const int literal_size = VP8LHistogramNumCodes(a->palette_code_bits_);
- assert(a->palette_code_bits_ == b->palette_code_bits_);
- if (b != out) {
- AddVector_SSE2(a->literal_, b->literal_, out->literal_, NUM_LITERAL_CODES);
- AddVector_SSE2(a->red_, b->red_, out->red_, NUM_LITERAL_CODES);
- AddVector_SSE2(a->blue_, b->blue_, out->blue_, NUM_LITERAL_CODES);
- AddVector_SSE2(a->alpha_, b->alpha_, out->alpha_, NUM_LITERAL_CODES);
- } else {
- AddVectorEq_SSE2(a->literal_, out->literal_, NUM_LITERAL_CODES);
- AddVectorEq_SSE2(a->red_, out->red_, NUM_LITERAL_CODES);
- AddVectorEq_SSE2(a->blue_, out->blue_, NUM_LITERAL_CODES);
- AddVectorEq_SSE2(a->alpha_, out->alpha_, NUM_LITERAL_CODES);
- }
- for (i = NUM_LITERAL_CODES; i < literal_size; ++i) {
- out->literal_[i] = a->literal_[i] + b->literal_[i];
- }
- for (i = 0; i < NUM_DISTANCE_CODES; ++i) {
- out->distance_[i] = a->distance_[i] + b->distance_[i];
+ for (; i < size; ++i) {
+ out[i] += a[i];
}
}
+#undef LINE_SIZE
//------------------------------------------------------------------------------
// Entropy
@@ -675,7 +654,8 @@ WEBP_TSAN_IGNORE_FUNCTION void VP8LEncDspInitSSE2(void) {
VP8LTransformColor = TransformColor_SSE2;
VP8LCollectColorBlueTransforms = CollectColorBlueTransforms_SSE2;
VP8LCollectColorRedTransforms = CollectColorRedTransforms_SSE2;
- VP8LHistogramAdd = HistogramAdd_SSE2;
+ VP8LAddVector = AddVector_SSE2;
+ VP8LAddVectorEq = AddVectorEq_SSE2;
VP8LCombinedShannonEntropy = CombinedShannonEntropy_SSE2;
VP8LVectorMismatch = VectorMismatch_SSE2;
VP8LBundleColorMap = BundleColorMap_SSE2;
diff --git a/thirdparty/libwebp/src/dsp/msa_macro.h b/thirdparty/libwebp/src/dsp/msa_macro.h
index dfacda6ccd..de026a1d9e 100644
--- a/thirdparty/libwebp/src/dsp/msa_macro.h
+++ b/thirdparty/libwebp/src/dsp/msa_macro.h
@@ -1389,4 +1389,4 @@ static WEBP_INLINE uint32_t func_hadd_uh_u32(v8u16 in) {
} while (0)
#define AVER_UB2_UB(...) AVER_UB2(v16u8, __VA_ARGS__)
-#endif /* WEBP_DSP_MSA_MACRO_H_ */
+#endif // WEBP_DSP_MSA_MACRO_H_
diff --git a/thirdparty/libwebp/src/dsp/rescaler.c b/thirdparty/libwebp/src/dsp/rescaler.c
index f307d35056..753f84fcf4 100644
--- a/thirdparty/libwebp/src/dsp/rescaler.c
+++ b/thirdparty/libwebp/src/dsp/rescaler.c
@@ -21,6 +21,7 @@
#define ROUNDER (WEBP_RESCALER_ONE >> 1)
#define MULT_FIX(x, y) (((uint64_t)(x) * (y) + ROUNDER) >> WEBP_RESCALER_RFIX)
+#define MULT_FIX_FLOOR(x, y) (((uint64_t)(x) * (y)) >> WEBP_RESCALER_RFIX)
//------------------------------------------------------------------------------
// Row import
@@ -138,7 +139,7 @@ void WebPRescalerExportRowShrink_C(WebPRescaler* const wrk) {
if (yscale) {
for (x_out = 0; x_out < x_out_max; ++x_out) {
const uint32_t frac = (uint32_t)MULT_FIX(frow[x_out], yscale);
- const int v = (int)MULT_FIX(irow[x_out] - frac, wrk->fxy_scale);
+ const int v = (int)MULT_FIX_FLOOR(irow[x_out] - frac, wrk->fxy_scale);
assert(v >= 0 && v <= 255);
dst[x_out] = v;
irow[x_out] = frac; // new fractional start
@@ -153,6 +154,7 @@ void WebPRescalerExportRowShrink_C(WebPRescaler* const wrk) {
}
}
+#undef MULT_FIX_FLOOR
#undef MULT_FIX
#undef ROUNDER
diff --git a/thirdparty/libwebp/src/dsp/rescaler_mips32.c b/thirdparty/libwebp/src/dsp/rescaler_mips32.c
index 542f7e5970..61f63c616c 100644
--- a/thirdparty/libwebp/src/dsp/rescaler_mips32.c
+++ b/thirdparty/libwebp/src/dsp/rescaler_mips32.c
@@ -209,6 +209,7 @@ static void ExportRowExpand_MIPS32(WebPRescaler* const wrk) {
}
}
+#if 0 // disabled for now. TODO(skal): make match the C-code
static void ExportRowShrink_MIPS32(WebPRescaler* const wrk) {
const int x_out_max = wrk->dst_width * wrk->num_channels;
uint8_t* dst = wrk->dst;
@@ -273,6 +274,7 @@ static void ExportRowShrink_MIPS32(WebPRescaler* const wrk) {
);
}
}
+#endif // 0
//------------------------------------------------------------------------------
// Entry point
@@ -283,7 +285,7 @@ WEBP_TSAN_IGNORE_FUNCTION void WebPRescalerDspInitMIPS32(void) {
WebPRescalerImportRowExpand = ImportRowExpand_MIPS32;
WebPRescalerImportRowShrink = ImportRowShrink_MIPS32;
WebPRescalerExportRowExpand = ExportRowExpand_MIPS32;
- WebPRescalerExportRowShrink = ExportRowShrink_MIPS32;
+// WebPRescalerExportRowShrink = ExportRowShrink_MIPS32;
}
#else // !WEBP_USE_MIPS32
diff --git a/thirdparty/libwebp/src/dsp/rescaler_mips_dsp_r2.c b/thirdparty/libwebp/src/dsp/rescaler_mips_dsp_r2.c
index b78aac15e6..ce9e64862e 100644
--- a/thirdparty/libwebp/src/dsp/rescaler_mips_dsp_r2.c
+++ b/thirdparty/libwebp/src/dsp/rescaler_mips_dsp_r2.c
@@ -20,10 +20,12 @@
#define ROUNDER (WEBP_RESCALER_ONE >> 1)
#define MULT_FIX(x, y) (((uint64_t)(x) * (y) + ROUNDER) >> WEBP_RESCALER_RFIX)
+#define MULT_FIX_FLOOR(x, y) (((uint64_t)(x) * (y)) >> WEBP_RESCALER_RFIX)
//------------------------------------------------------------------------------
// Row export
+#if 0 // disabled for now. TODO(skal): make match the C-code
static void ExportRowShrink_MIPSdspR2(WebPRescaler* const wrk) {
int i;
const int x_out_max = wrk->dst_width * wrk->num_channels;
@@ -106,7 +108,7 @@ static void ExportRowShrink_MIPSdspR2(WebPRescaler* const wrk) {
}
for (i = 0; i < (x_out_max & 0x3); ++i) {
const uint32_t frac = (uint32_t)MULT_FIX(*frow++, yscale);
- const int v = (int)MULT_FIX(*irow - frac, wrk->fxy_scale);
+ const int v = (int)MULT_FIX_FLOOR(*irow - frac, wrk->fxy_scale);
assert(v >= 0 && v <= 255);
*dst++ = v;
*irow++ = frac; // new fractional start
@@ -154,13 +156,14 @@ static void ExportRowShrink_MIPSdspR2(WebPRescaler* const wrk) {
);
}
for (i = 0; i < (x_out_max & 0x3); ++i) {
- const int v = (int)MULT_FIX(*irow, wrk->fxy_scale);
+ const int v = (int)MULT_FIX_FLOOR(*irow, wrk->fxy_scale);
assert(v >= 0 && v <= 255);
*dst++ = v;
*irow++ = 0;
}
}
}
+#endif // 0
static void ExportRowExpand_MIPSdspR2(WebPRescaler* const wrk) {
int i;
@@ -294,6 +297,7 @@ static void ExportRowExpand_MIPSdspR2(WebPRescaler* const wrk) {
}
}
+#undef MULT_FIX_FLOOR
#undef MULT_FIX
#undef ROUNDER
@@ -304,7 +308,7 @@ extern void WebPRescalerDspInitMIPSdspR2(void);
WEBP_TSAN_IGNORE_FUNCTION void WebPRescalerDspInitMIPSdspR2(void) {
WebPRescalerExportRowExpand = ExportRowExpand_MIPSdspR2;
- WebPRescalerExportRowShrink = ExportRowShrink_MIPSdspR2;
+// WebPRescalerExportRowShrink = ExportRowShrink_MIPSdspR2;
}
#else // !WEBP_USE_MIPS_DSP_R2
diff --git a/thirdparty/libwebp/src/dsp/rescaler_msa.c b/thirdparty/libwebp/src/dsp/rescaler_msa.c
index f3bc99f1cd..c559254836 100644
--- a/thirdparty/libwebp/src/dsp/rescaler_msa.c
+++ b/thirdparty/libwebp/src/dsp/rescaler_msa.c
@@ -22,6 +22,7 @@
#define ROUNDER (WEBP_RESCALER_ONE >> 1)
#define MULT_FIX(x, y) (((uint64_t)(x) * (y) + ROUNDER) >> WEBP_RESCALER_RFIX)
+#define MULT_FIX_FLOOR(x, y) (((uint64_t)(x) * (y)) >> WEBP_RESCALER_RFIX)
#define CALC_MULT_FIX_16(in0, in1, in2, in3, scale, shift, dst) do { \
v4u32 tmp0, tmp1, tmp2, tmp3; \
@@ -262,6 +263,7 @@ static void RescalerExportRowExpand_MIPSdspR2(WebPRescaler* const wrk) {
}
}
+#if 0 // disabled for now. TODO(skal): make match the C-code
static WEBP_INLINE void ExportRowShrink_0(const uint32_t* frow, uint32_t* irow,
uint8_t* dst, int length,
const uint32_t yscale,
@@ -341,7 +343,7 @@ static WEBP_INLINE void ExportRowShrink_0(const uint32_t* frow, uint32_t* irow,
}
for (x_out = 0; x_out < length; ++x_out) {
const uint32_t frac = (uint32_t)MULT_FIX(frow[x_out], yscale);
- const int v = (int)MULT_FIX(irow[x_out] - frac, wrk->fxy_scale);
+ const int v = (int)MULT_FIX_FLOOR(irow[x_out] - frac, wrk->fxy_scale);
assert(v >= 0 && v <= 255);
dst[x_out] = v;
irow[x_out] = frac;
@@ -426,6 +428,7 @@ static void RescalerExportRowShrink_MIPSdspR2(WebPRescaler* const wrk) {
ExportRowShrink_1(irow, dst, x_out_max, wrk);
}
}
+#endif // 0
//------------------------------------------------------------------------------
// Entry point
@@ -434,7 +437,7 @@ extern void WebPRescalerDspInitMSA(void);
WEBP_TSAN_IGNORE_FUNCTION void WebPRescalerDspInitMSA(void) {
WebPRescalerExportRowExpand = RescalerExportRowExpand_MIPSdspR2;
- WebPRescalerExportRowShrink = RescalerExportRowShrink_MIPSdspR2;
+// WebPRescalerExportRowShrink = RescalerExportRowShrink_MIPSdspR2;
}
#else // !WEBP_USE_MSA
diff --git a/thirdparty/libwebp/src/dsp/rescaler_neon.c b/thirdparty/libwebp/src/dsp/rescaler_neon.c
index 3eff9fbaf4..a553f06f79 100644
--- a/thirdparty/libwebp/src/dsp/rescaler_neon.c
+++ b/thirdparty/libwebp/src/dsp/rescaler_neon.c
@@ -22,6 +22,7 @@
#define ROUNDER (WEBP_RESCALER_ONE >> 1)
#define MULT_FIX_C(x, y) (((uint64_t)(x) * (y) + ROUNDER) >> WEBP_RESCALER_RFIX)
+#define MULT_FIX_FLOOR_C(x, y) (((uint64_t)(x) * (y)) >> WEBP_RESCALER_RFIX)
#define LOAD_32x4(SRC, DST) const uint32x4_t DST = vld1q_u32((SRC))
#define LOAD_32x8(SRC, DST0, DST1) \
@@ -35,8 +36,11 @@
#if (WEBP_RESCALER_RFIX == 32)
#define MAKE_HALF_CST(C) vdupq_n_s32((int32_t)((C) >> 1))
-#define MULT_FIX(A, B) /* note: B is actualy scale>>1. See MAKE_HALF_CST */ \
+// note: B is actualy scale>>1. See MAKE_HALF_CST
+#define MULT_FIX(A, B) \
vreinterpretq_u32_s32(vqrdmulhq_s32(vreinterpretq_s32_u32((A)), (B)))
+#define MULT_FIX_FLOOR(A, B) \
+ vreinterpretq_u32_s32(vqdmulhq_s32(vreinterpretq_s32_u32((A)), (B)))
#else
#error "MULT_FIX/WEBP_RESCALER_RFIX need some more work"
#endif
@@ -135,8 +139,8 @@ static void RescalerExportRowShrink_NEON(WebPRescaler* const wrk) {
const uint32x4_t A1 = MULT_FIX(in1, yscale_half);
const uint32x4_t B0 = vqsubq_u32(in2, A0);
const uint32x4_t B1 = vqsubq_u32(in3, A1);
- const uint32x4_t C0 = MULT_FIX(B0, fxy_scale_half);
- const uint32x4_t C1 = MULT_FIX(B1, fxy_scale_half);
+ const uint32x4_t C0 = MULT_FIX_FLOOR(B0, fxy_scale_half);
+ const uint32x4_t C1 = MULT_FIX_FLOOR(B1, fxy_scale_half);
const uint16x4_t D0 = vmovn_u32(C0);
const uint16x4_t D1 = vmovn_u32(C1);
const uint8x8_t E = vmovn_u16(vcombine_u16(D0, D1));
@@ -145,7 +149,7 @@ static void RescalerExportRowShrink_NEON(WebPRescaler* const wrk) {
}
for (; x_out < x_out_max; ++x_out) {
const uint32_t frac = (uint32_t)MULT_FIX_C(frow[x_out], yscale);
- const int v = (int)MULT_FIX_C(irow[x_out] - frac, wrk->fxy_scale);
+ const int v = (int)MULT_FIX_FLOOR_C(irow[x_out] - frac, fxy_scale);
assert(v >= 0 && v <= 255);
dst[x_out] = v;
irow[x_out] = frac; // new fractional start
@@ -170,6 +174,12 @@ static void RescalerExportRowShrink_NEON(WebPRescaler* const wrk) {
}
}
+#undef MULT_FIX_FLOOR_C
+#undef MULT_FIX_C
+#undef MULT_FIX_FLOOR
+#undef MULT_FIX
+#undef ROUNDER
+
//------------------------------------------------------------------------------
extern void WebPRescalerDspInitNEON(void);
diff --git a/thirdparty/libwebp/src/dsp/rescaler_sse2.c b/thirdparty/libwebp/src/dsp/rescaler_sse2.c
index 64c50deab5..f7461a452c 100644
--- a/thirdparty/libwebp/src/dsp/rescaler_sse2.c
+++ b/thirdparty/libwebp/src/dsp/rescaler_sse2.c
@@ -25,6 +25,7 @@
#define ROUNDER (WEBP_RESCALER_ONE >> 1)
#define MULT_FIX(x, y) (((uint64_t)(x) * (y) + ROUNDER) >> WEBP_RESCALER_RFIX)
+#define MULT_FIX_FLOOR(x, y) (((uint64_t)(x) * (y)) >> WEBP_RESCALER_RFIX)
// input: 8 bytes ABCDEFGH -> output: A0E0B0F0C0G0D0H0
static void LoadTwoPixels_SSE2(const uint8_t* const src, __m128i* out) {
@@ -224,6 +225,35 @@ static WEBP_INLINE void ProcessRow_SSE2(const __m128i* const A0,
_mm_storel_epi64((__m128i*)dst, G);
}
+static WEBP_INLINE void ProcessRow_Floor_SSE2(const __m128i* const A0,
+ const __m128i* const A1,
+ const __m128i* const A2,
+ const __m128i* const A3,
+ const __m128i* const mult,
+ uint8_t* const dst) {
+ const __m128i mask = _mm_set_epi32(0xffffffffu, 0, 0xffffffffu, 0);
+ const __m128i B0 = _mm_mul_epu32(*A0, *mult);
+ const __m128i B1 = _mm_mul_epu32(*A1, *mult);
+ const __m128i B2 = _mm_mul_epu32(*A2, *mult);
+ const __m128i B3 = _mm_mul_epu32(*A3, *mult);
+ const __m128i D0 = _mm_srli_epi64(B0, WEBP_RESCALER_RFIX);
+ const __m128i D1 = _mm_srli_epi64(B1, WEBP_RESCALER_RFIX);
+#if (WEBP_RESCALER_RFIX < 32)
+ const __m128i D2 =
+ _mm_and_si128(_mm_slli_epi64(B2, 32 - WEBP_RESCALER_RFIX), mask);
+ const __m128i D3 =
+ _mm_and_si128(_mm_slli_epi64(B3, 32 - WEBP_RESCALER_RFIX), mask);
+#else
+ const __m128i D2 = _mm_and_si128(B2, mask);
+ const __m128i D3 = _mm_and_si128(B3, mask);
+#endif
+ const __m128i E0 = _mm_or_si128(D0, D2);
+ const __m128i E1 = _mm_or_si128(D1, D3);
+ const __m128i F = _mm_packs_epi32(E0, E1);
+ const __m128i G = _mm_packus_epi16(F, F);
+ _mm_storel_epi64((__m128i*)dst, G);
+}
+
static void RescalerExportRowExpand_SSE2(WebPRescaler* const wrk) {
int x_out;
uint8_t* const dst = wrk->dst;
@@ -322,12 +352,12 @@ static void RescalerExportRowShrink_SSE2(WebPRescaler* const wrk) {
const __m128i G1 = _mm_or_si128(D1, F3);
_mm_storeu_si128((__m128i*)(irow + x_out + 0), G0);
_mm_storeu_si128((__m128i*)(irow + x_out + 4), G1);
- ProcessRow_SSE2(&E0, &E1, &E2, &E3, &mult_xy, dst + x_out);
+ ProcessRow_Floor_SSE2(&E0, &E1, &E2, &E3, &mult_xy, dst + x_out);
}
}
for (; x_out < x_out_max; ++x_out) {
const uint32_t frac = (int)MULT_FIX(frow[x_out], yscale);
- const int v = (int)MULT_FIX(irow[x_out] - frac, wrk->fxy_scale);
+ const int v = (int)MULT_FIX_FLOOR(irow[x_out] - frac, wrk->fxy_scale);
assert(v >= 0 && v <= 255);
dst[x_out] = v;
irow[x_out] = frac; // new fractional start
@@ -352,6 +382,7 @@ static void RescalerExportRowShrink_SSE2(WebPRescaler* const wrk) {
}
}
+#undef MULT_FIX_FLOOR
#undef MULT_FIX
#undef ROUNDER
diff --git a/thirdparty/libwebp/src/dsp/yuv.h b/thirdparty/libwebp/src/dsp/yuv.h
index eb787270d2..c12be1d094 100644
--- a/thirdparty/libwebp/src/dsp/yuv.h
+++ b/thirdparty/libwebp/src/dsp/yuv.h
@@ -207,4 +207,4 @@ static WEBP_INLINE int VP8RGBToV(int r, int g, int b, int rounding) {
} // extern "C"
#endif
-#endif /* WEBP_DSP_YUV_H_ */
+#endif // WEBP_DSP_YUV_H_
diff --git a/thirdparty/libwebp/src/enc/analysis_enc.c b/thirdparty/libwebp/src/enc/analysis_enc.c
index a47ff7d4e8..687757ae03 100644
--- a/thirdparty/libwebp/src/enc/analysis_enc.c
+++ b/thirdparty/libwebp/src/enc/analysis_enc.c
@@ -458,7 +458,7 @@ static void MergeJobs(const SegmentJob* const src, SegmentJob* const dst) {
dst->uv_alpha += src->uv_alpha;
}
-// initialize the job struct with some TODOs
+// initialize the job struct with some tasks to perform
static void InitSegmentJob(VP8Encoder* const enc, SegmentJob* const job,
int start_row, int end_row) {
WebPGetWorkerInterface()->Init(&job->worker);
diff --git a/thirdparty/libwebp/src/enc/backward_references_cost_enc.c b/thirdparty/libwebp/src/enc/backward_references_cost_enc.c
index 7175496c7f..516abd73eb 100644
--- a/thirdparty/libwebp/src/enc/backward_references_cost_enc.c
+++ b/thirdparty/libwebp/src/enc/backward_references_cost_enc.c
@@ -67,7 +67,7 @@ static int CostModelBuild(CostModel* const m, int xsize, int cache_bits,
// The following code is similar to VP8LHistogramCreate but converts the
// distance to plane code.
- VP8LHistogramInit(histo, cache_bits);
+ VP8LHistogramInit(histo, cache_bits, /*init_arrays=*/ 1);
while (VP8LRefsCursorOk(&c)) {
VP8LHistogramAddSinglePixOrCopy(histo, c.cur_pos, VP8LDistanceToPlaneCode,
xsize);
diff --git a/thirdparty/libwebp/src/enc/backward_references_enc.c b/thirdparty/libwebp/src/enc/backward_references_enc.c
index 39230188b9..3ab7b0ac7d 100644
--- a/thirdparty/libwebp/src/enc/backward_references_enc.c
+++ b/thirdparty/libwebp/src/enc/backward_references_enc.c
@@ -715,6 +715,7 @@ static int CalculateBestCacheSize(const uint32_t* argb, int quality,
for (i = 0; i <= cache_bits_max; ++i) {
histos[i] = VP8LAllocateHistogram(i);
if (histos[i] == NULL) goto Error;
+ VP8LHistogramInit(histos[i], i, /*init_arrays=*/ 1);
if (i == 0) continue;
cc_init[i] = VP8LColorCacheInit(&hashers[i], i);
if (!cc_init[i]) goto Error;
diff --git a/thirdparty/libwebp/src/enc/cost_enc.h b/thirdparty/libwebp/src/enc/cost_enc.h
index bdce1e6a3b..a4b177b342 100644
--- a/thirdparty/libwebp/src/enc/cost_enc.h
+++ b/thirdparty/libwebp/src/enc/cost_enc.h
@@ -79,4 +79,4 @@ extern const uint16_t VP8FixedCostsI4[NUM_BMODES][NUM_BMODES][NUM_BMODES];
} // extern "C"
#endif
-#endif /* WEBP_ENC_COST_ENC_H_ */
+#endif // WEBP_ENC_COST_ENC_H_
diff --git a/thirdparty/libwebp/src/enc/delta_palettization_enc.c b/thirdparty/libwebp/src/enc/delta_palettization_enc.c
deleted file mode 100644
index a61c8e6c93..0000000000
--- a/thirdparty/libwebp/src/enc/delta_palettization_enc.c
+++ /dev/null
@@ -1,455 +0,0 @@
-// Copyright 2015 Google Inc. All Rights Reserved.
-//
-// Use of this source code is governed by a BSD-style license
-// that can be found in the COPYING file in the root of the source
-// tree. An additional intellectual property rights grant can be found
-// in the file PATENTS. All contributing project authors may
-// be found in the AUTHORS file in the root of the source tree.
-// -----------------------------------------------------------------------------
-//
-// Author: Mislav Bradac (mislavm@google.com)
-//
-
-#include "src/enc/delta_palettization_enc.h"
-
-#ifdef WEBP_EXPERIMENTAL_FEATURES
-#include "src/webp/types.h"
-#include "src/dsp/lossless.h"
-
-#define MK_COL(r, g, b) (((r) << 16) + ((g) << 8) + (b))
-
-// Format allows palette up to 256 entries, but more palette entries produce
-// bigger entropy. In the future it will probably be useful to add more entries
-// that are far from the origin of the palette or choose remaining entries
-// dynamically.
-#define DELTA_PALETTE_SIZE 226
-
-// Palette used for delta_palettization. Entries are roughly sorted by distance
-// of their signed equivalents from the origin.
-static const uint32_t kDeltaPalette[DELTA_PALETTE_SIZE] = {
- MK_COL(0u, 0u, 0u),
- MK_COL(255u, 255u, 255u),
- MK_COL(1u, 1u, 1u),
- MK_COL(254u, 254u, 254u),
- MK_COL(2u, 2u, 2u),
- MK_COL(4u, 4u, 4u),
- MK_COL(252u, 252u, 252u),
- MK_COL(250u, 0u, 0u),
- MK_COL(0u, 250u, 0u),
- MK_COL(0u, 0u, 250u),
- MK_COL(6u, 0u, 0u),
- MK_COL(0u, 6u, 0u),
- MK_COL(0u, 0u, 6u),
- MK_COL(0u, 0u, 248u),
- MK_COL(0u, 0u, 8u),
- MK_COL(0u, 248u, 0u),
- MK_COL(0u, 248u, 248u),
- MK_COL(0u, 248u, 8u),
- MK_COL(0u, 8u, 0u),
- MK_COL(0u, 8u, 248u),
- MK_COL(0u, 8u, 8u),
- MK_COL(8u, 8u, 8u),
- MK_COL(248u, 0u, 0u),
- MK_COL(248u, 0u, 248u),
- MK_COL(248u, 0u, 8u),
- MK_COL(248u, 248u, 0u),
- MK_COL(248u, 8u, 0u),
- MK_COL(8u, 0u, 0u),
- MK_COL(8u, 0u, 248u),
- MK_COL(8u, 0u, 8u),
- MK_COL(8u, 248u, 0u),
- MK_COL(8u, 8u, 0u),
- MK_COL(23u, 23u, 23u),
- MK_COL(13u, 13u, 13u),
- MK_COL(232u, 232u, 232u),
- MK_COL(244u, 244u, 244u),
- MK_COL(245u, 245u, 250u),
- MK_COL(50u, 50u, 50u),
- MK_COL(204u, 204u, 204u),
- MK_COL(236u, 236u, 236u),
- MK_COL(16u, 16u, 16u),
- MK_COL(240u, 16u, 16u),
- MK_COL(16u, 240u, 16u),
- MK_COL(240u, 240u, 16u),
- MK_COL(16u, 16u, 240u),
- MK_COL(240u, 16u, 240u),
- MK_COL(16u, 240u, 240u),
- MK_COL(240u, 240u, 240u),
- MK_COL(0u, 0u, 232u),
- MK_COL(0u, 232u, 0u),
- MK_COL(232u, 0u, 0u),
- MK_COL(0u, 0u, 24u),
- MK_COL(0u, 24u, 0u),
- MK_COL(24u, 0u, 0u),
- MK_COL(32u, 32u, 32u),
- MK_COL(224u, 32u, 32u),
- MK_COL(32u, 224u, 32u),
- MK_COL(224u, 224u, 32u),
- MK_COL(32u, 32u, 224u),
- MK_COL(224u, 32u, 224u),
- MK_COL(32u, 224u, 224u),
- MK_COL(224u, 224u, 224u),
- MK_COL(0u, 0u, 176u),
- MK_COL(0u, 0u, 80u),
- MK_COL(0u, 176u, 0u),
- MK_COL(0u, 176u, 176u),
- MK_COL(0u, 176u, 80u),
- MK_COL(0u, 80u, 0u),
- MK_COL(0u, 80u, 176u),
- MK_COL(0u, 80u, 80u),
- MK_COL(176u, 0u, 0u),
- MK_COL(176u, 0u, 176u),
- MK_COL(176u, 0u, 80u),
- MK_COL(176u, 176u, 0u),
- MK_COL(176u, 80u, 0u),
- MK_COL(80u, 0u, 0u),
- MK_COL(80u, 0u, 176u),
- MK_COL(80u, 0u, 80u),
- MK_COL(80u, 176u, 0u),
- MK_COL(80u, 80u, 0u),
- MK_COL(0u, 0u, 152u),
- MK_COL(0u, 0u, 104u),
- MK_COL(0u, 152u, 0u),
- MK_COL(0u, 152u, 152u),
- MK_COL(0u, 152u, 104u),
- MK_COL(0u, 104u, 0u),
- MK_COL(0u, 104u, 152u),
- MK_COL(0u, 104u, 104u),
- MK_COL(152u, 0u, 0u),
- MK_COL(152u, 0u, 152u),
- MK_COL(152u, 0u, 104u),
- MK_COL(152u, 152u, 0u),
- MK_COL(152u, 104u, 0u),
- MK_COL(104u, 0u, 0u),
- MK_COL(104u, 0u, 152u),
- MK_COL(104u, 0u, 104u),
- MK_COL(104u, 152u, 0u),
- MK_COL(104u, 104u, 0u),
- MK_COL(216u, 216u, 216u),
- MK_COL(216u, 216u, 40u),
- MK_COL(216u, 216u, 176u),
- MK_COL(216u, 216u, 80u),
- MK_COL(216u, 40u, 216u),
- MK_COL(216u, 40u, 40u),
- MK_COL(216u, 40u, 176u),
- MK_COL(216u, 40u, 80u),
- MK_COL(216u, 176u, 216u),
- MK_COL(216u, 176u, 40u),
- MK_COL(216u, 176u, 176u),
- MK_COL(216u, 176u, 80u),
- MK_COL(216u, 80u, 216u),
- MK_COL(216u, 80u, 40u),
- MK_COL(216u, 80u, 176u),
- MK_COL(216u, 80u, 80u),
- MK_COL(40u, 216u, 216u),
- MK_COL(40u, 216u, 40u),
- MK_COL(40u, 216u, 176u),
- MK_COL(40u, 216u, 80u),
- MK_COL(40u, 40u, 216u),
- MK_COL(40u, 40u, 40u),
- MK_COL(40u, 40u, 176u),
- MK_COL(40u, 40u, 80u),
- MK_COL(40u, 176u, 216u),
- MK_COL(40u, 176u, 40u),
- MK_COL(40u, 176u, 176u),
- MK_COL(40u, 176u, 80u),
- MK_COL(40u, 80u, 216u),
- MK_COL(40u, 80u, 40u),
- MK_COL(40u, 80u, 176u),
- MK_COL(40u, 80u, 80u),
- MK_COL(80u, 216u, 216u),
- MK_COL(80u, 216u, 40u),
- MK_COL(80u, 216u, 176u),
- MK_COL(80u, 216u, 80u),
- MK_COL(80u, 40u, 216u),
- MK_COL(80u, 40u, 40u),
- MK_COL(80u, 40u, 176u),
- MK_COL(80u, 40u, 80u),
- MK_COL(80u, 176u, 216u),
- MK_COL(80u, 176u, 40u),
- MK_COL(80u, 176u, 176u),
- MK_COL(80u, 176u, 80u),
- MK_COL(80u, 80u, 216u),
- MK_COL(80u, 80u, 40u),
- MK_COL(80u, 80u, 176u),
- MK_COL(80u, 80u, 80u),
- MK_COL(0u, 0u, 192u),
- MK_COL(0u, 0u, 64u),
- MK_COL(0u, 0u, 128u),
- MK_COL(0u, 192u, 0u),
- MK_COL(0u, 192u, 192u),
- MK_COL(0u, 192u, 64u),
- MK_COL(0u, 192u, 128u),
- MK_COL(0u, 64u, 0u),
- MK_COL(0u, 64u, 192u),
- MK_COL(0u, 64u, 64u),
- MK_COL(0u, 64u, 128u),
- MK_COL(0u, 128u, 0u),
- MK_COL(0u, 128u, 192u),
- MK_COL(0u, 128u, 64u),
- MK_COL(0u, 128u, 128u),
- MK_COL(176u, 216u, 216u),
- MK_COL(176u, 216u, 40u),
- MK_COL(176u, 216u, 176u),
- MK_COL(176u, 216u, 80u),
- MK_COL(176u, 40u, 216u),
- MK_COL(176u, 40u, 40u),
- MK_COL(176u, 40u, 176u),
- MK_COL(176u, 40u, 80u),
- MK_COL(176u, 176u, 216u),
- MK_COL(176u, 176u, 40u),
- MK_COL(176u, 176u, 176u),
- MK_COL(176u, 176u, 80u),
- MK_COL(176u, 80u, 216u),
- MK_COL(176u, 80u, 40u),
- MK_COL(176u, 80u, 176u),
- MK_COL(176u, 80u, 80u),
- MK_COL(192u, 0u, 0u),
- MK_COL(192u, 0u, 192u),
- MK_COL(192u, 0u, 64u),
- MK_COL(192u, 0u, 128u),
- MK_COL(192u, 192u, 0u),
- MK_COL(192u, 192u, 192u),
- MK_COL(192u, 192u, 64u),
- MK_COL(192u, 192u, 128u),
- MK_COL(192u, 64u, 0u),
- MK_COL(192u, 64u, 192u),
- MK_COL(192u, 64u, 64u),
- MK_COL(192u, 64u, 128u),
- MK_COL(192u, 128u, 0u),
- MK_COL(192u, 128u, 192u),
- MK_COL(192u, 128u, 64u),
- MK_COL(192u, 128u, 128u),
- MK_COL(64u, 0u, 0u),
- MK_COL(64u, 0u, 192u),
- MK_COL(64u, 0u, 64u),
- MK_COL(64u, 0u, 128u),
- MK_COL(64u, 192u, 0u),
- MK_COL(64u, 192u, 192u),
- MK_COL(64u, 192u, 64u),
- MK_COL(64u, 192u, 128u),
- MK_COL(64u, 64u, 0u),
- MK_COL(64u, 64u, 192u),
- MK_COL(64u, 64u, 64u),
- MK_COL(64u, 64u, 128u),
- MK_COL(64u, 128u, 0u),
- MK_COL(64u, 128u, 192u),
- MK_COL(64u, 128u, 64u),
- MK_COL(64u, 128u, 128u),
- MK_COL(128u, 0u, 0u),
- MK_COL(128u, 0u, 192u),
- MK_COL(128u, 0u, 64u),
- MK_COL(128u, 0u, 128u),
- MK_COL(128u, 192u, 0u),
- MK_COL(128u, 192u, 192u),
- MK_COL(128u, 192u, 64u),
- MK_COL(128u, 192u, 128u),
- MK_COL(128u, 64u, 0u),
- MK_COL(128u, 64u, 192u),
- MK_COL(128u, 64u, 64u),
- MK_COL(128u, 64u, 128u),
- MK_COL(128u, 128u, 0u),
- MK_COL(128u, 128u, 192u),
- MK_COL(128u, 128u, 64u),
- MK_COL(128u, 128u, 128u),
-};
-
-#undef MK_COL
-
-//------------------------------------------------------------------------------
-// TODO(skal): move the functions to dsp/lossless.c when the correct
-// granularity is found. For now, we'll just copy-paste some useful bits
-// here instead.
-
-// In-place sum of each component with mod 256.
-static WEBP_INLINE void AddPixelsEq(uint32_t* a, uint32_t b) {
- const uint32_t alpha_and_green = (*a & 0xff00ff00u) + (b & 0xff00ff00u);
- const uint32_t red_and_blue = (*a & 0x00ff00ffu) + (b & 0x00ff00ffu);
- *a = (alpha_and_green & 0xff00ff00u) | (red_and_blue & 0x00ff00ffu);
-}
-
-static WEBP_INLINE uint32_t Clip255(uint32_t a) {
- if (a < 256) {
- return a;
- }
- // return 0, when a is a negative integer.
- // return 255, when a is positive.
- return ~a >> 24;
-}
-
-// Delta palettization functions.
-static WEBP_INLINE int Square(int x) {
- return x * x;
-}
-
-static WEBP_INLINE uint32_t Intensity(uint32_t a) {
- return
- 30 * ((a >> 16) & 0xff) +
- 59 * ((a >> 8) & 0xff) +
- 11 * ((a >> 0) & 0xff);
-}
-
-static uint32_t CalcDist(uint32_t predicted_value, uint32_t actual_value,
- uint32_t palette_entry) {
- int i;
- uint32_t distance = 0;
- AddPixelsEq(&predicted_value, palette_entry);
- for (i = 0; i < 32; i += 8) {
- const int32_t av = (actual_value >> i) & 0xff;
- const int32_t pv = (predicted_value >> i) & 0xff;
- distance += Square(pv - av);
- }
- // We sum square of intensity difference with factor 10, but because Intensity
- // returns 100 times real intensity we need to multiply differences of colors
- // by 1000.
- distance *= 1000u;
- distance += Square(Intensity(predicted_value)
- - Intensity(actual_value));
- return distance;
-}
-
-static uint32_t Predict(int x, int y, uint32_t* image) {
- const uint32_t t = (y == 0) ? ARGB_BLACK : image[x];
- const uint32_t l = (x == 0) ? ARGB_BLACK : image[x - 1];
- const uint32_t p =
- (((((t >> 24) & 0xff) + ((l >> 24) & 0xff)) / 2) << 24) +
- (((((t >> 16) & 0xff) + ((l >> 16) & 0xff)) / 2) << 16) +
- (((((t >> 8) & 0xff) + ((l >> 8) & 0xff)) / 2) << 8) +
- (((((t >> 0) & 0xff) + ((l >> 0) & 0xff)) / 2) << 0);
- if (x == 0 && y == 0) return ARGB_BLACK;
- if (x == 0) return t;
- if (y == 0) return l;
- return p;
-}
-
-static WEBP_INLINE int AddSubtractComponentFullWithCoefficient(
- int a, int b, int c) {
- return Clip255(a + ((b - c) >> 2));
-}
-
-static WEBP_INLINE uint32_t ClampedAddSubtractFullWithCoefficient(
- uint32_t c0, uint32_t c1, uint32_t c2) {
- const int a = AddSubtractComponentFullWithCoefficient(
- c0 >> 24, c1 >> 24, c2 >> 24);
- const int r = AddSubtractComponentFullWithCoefficient((c0 >> 16) & 0xff,
- (c1 >> 16) & 0xff,
- (c2 >> 16) & 0xff);
- const int g = AddSubtractComponentFullWithCoefficient((c0 >> 8) & 0xff,
- (c1 >> 8) & 0xff,
- (c2 >> 8) & 0xff);
- const int b = AddSubtractComponentFullWithCoefficient(
- c0 & 0xff, c1 & 0xff, c2 & 0xff);
- return ((uint32_t)a << 24) | (r << 16) | (g << 8) | b;
-}
-
-//------------------------------------------------------------------------------
-
-// Find palette entry with minimum error from difference of actual pixel value
-// and predicted pixel value. Propagate error of pixel to its top and left pixel
-// in src array. Write predicted_value + palette_entry to new_image. Return
-// index of best palette entry.
-static int FindBestPaletteEntry(uint32_t src, uint32_t predicted_value,
- const uint32_t palette[], int palette_size) {
- int i;
- int idx = 0;
- uint32_t best_distance = CalcDist(predicted_value, src, palette[0]);
- for (i = 1; i < palette_size; ++i) {
- const uint32_t distance = CalcDist(predicted_value, src, palette[i]);
- if (distance < best_distance) {
- best_distance = distance;
- idx = i;
- }
- }
- return idx;
-}
-
-static void ApplyBestPaletteEntry(int x, int y,
- uint32_t new_value, uint32_t palette_value,
- uint32_t* src, int src_stride,
- uint32_t* new_image) {
- AddPixelsEq(&new_value, palette_value);
- if (x > 0) {
- src[x - 1] = ClampedAddSubtractFullWithCoefficient(src[x - 1],
- new_value, src[x]);
- }
- if (y > 0) {
- src[x - src_stride] =
- ClampedAddSubtractFullWithCoefficient(src[x - src_stride],
- new_value, src[x]);
- }
- new_image[x] = new_value;
-}
-
-//------------------------------------------------------------------------------
-// Main entry point
-
-static WebPEncodingError ApplyDeltaPalette(uint32_t* src, uint32_t* dst,
- uint32_t src_stride,
- uint32_t dst_stride,
- const uint32_t* palette,
- int palette_size,
- int width, int height,
- int num_passes) {
- int x, y;
- WebPEncodingError err = VP8_ENC_OK;
- uint32_t* new_image = (uint32_t*)WebPSafeMalloc(width, sizeof(*new_image));
- uint8_t* const tmp_row = (uint8_t*)WebPSafeMalloc(width, sizeof(*tmp_row));
- if (new_image == NULL || tmp_row == NULL) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
- goto Error;
- }
-
- while (num_passes--) {
- uint32_t* cur_src = src;
- uint32_t* cur_dst = dst;
- for (y = 0; y < height; ++y) {
- for (x = 0; x < width; ++x) {
- const uint32_t predicted_value = Predict(x, y, new_image);
- tmp_row[x] = FindBestPaletteEntry(cur_src[x], predicted_value,
- palette, palette_size);
- ApplyBestPaletteEntry(x, y, predicted_value, palette[tmp_row[x]],
- cur_src, src_stride, new_image);
- }
- for (x = 0; x < width; ++x) {
- cur_dst[x] = palette[tmp_row[x]];
- }
- cur_src += src_stride;
- cur_dst += dst_stride;
- }
- }
- Error:
- WebPSafeFree(new_image);
- WebPSafeFree(tmp_row);
- return err;
-}
-
-// replaces enc->argb_ by a palettizable approximation of it,
-// and generates optimal enc->palette_[]
-WebPEncodingError WebPSearchOptimalDeltaPalette(VP8LEncoder* const enc) {
- const WebPPicture* const pic = enc->pic_;
- uint32_t* src = pic->argb;
- uint32_t* dst = enc->argb_;
- const int width = pic->width;
- const int height = pic->height;
-
- WebPEncodingError err = VP8_ENC_OK;
- memcpy(enc->palette_, kDeltaPalette, sizeof(kDeltaPalette));
- enc->palette_[DELTA_PALETTE_SIZE - 1] = src[0] - 0xff000000u;
- enc->palette_size_ = DELTA_PALETTE_SIZE;
- err = ApplyDeltaPalette(src, dst, pic->argb_stride, enc->current_width_,
- enc->palette_, enc->palette_size_,
- width, height, 2);
- if (err != VP8_ENC_OK) goto Error;
-
- Error:
- return err;
-}
-
-#else // !WEBP_EXPERIMENTAL_FEATURES
-
-WebPEncodingError WebPSearchOptimalDeltaPalette(VP8LEncoder* const enc) {
- (void)enc;
- return VP8_ENC_ERROR_INVALID_CONFIGURATION;
-}
-
-#endif // WEBP_EXPERIMENTAL_FEATURES
diff --git a/thirdparty/libwebp/src/enc/delta_palettization_enc.h b/thirdparty/libwebp/src/enc/delta_palettization_enc.h
deleted file mode 100644
index b15e2cd487..0000000000
--- a/thirdparty/libwebp/src/enc/delta_palettization_enc.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2015 Google Inc. All Rights Reserved.
-//
-// Use of this source code is governed by a BSD-style license
-// that can be found in the COPYING file in the root of the source
-// tree. An additional intellectual property rights grant can be found
-// in the file PATENTS. All contributing project authors may
-// be found in the AUTHORS file in the root of the source tree.
-// -----------------------------------------------------------------------------
-//
-// Author: Mislav Bradac (mislavm@google.com)
-//
-
-#ifndef WEBP_ENC_DELTA_PALETTIZATION_ENC_H_
-#define WEBP_ENC_DELTA_PALETTIZATION_ENC_H_
-
-#include "src/webp/encode.h"
-#include "src/enc/vp8li_enc.h"
-
-// Replaces enc->argb_[] input by a palettizable approximation of it,
-// and generates optimal enc->palette_[].
-// This function can revert enc->use_palette_ / enc->use_predict_ flag
-// if delta-palettization is not producing expected saving.
-WebPEncodingError WebPSearchOptimalDeltaPalette(VP8LEncoder* const enc);
-
-#endif // WEBP_ENC_DELTA_PALETTIZATION_ENC_H_
diff --git a/thirdparty/libwebp/src/enc/histogram_enc.c b/thirdparty/libwebp/src/enc/histogram_enc.c
index 9fdbc627a1..4e49e0a201 100644
--- a/thirdparty/libwebp/src/enc/histogram_enc.c
+++ b/thirdparty/libwebp/src/enc/histogram_enc.c
@@ -51,10 +51,12 @@ static void HistogramCopy(const VP8LHistogram* const src,
VP8LHistogram* const dst) {
uint32_t* const dst_literal = dst->literal_;
const int dst_cache_bits = dst->palette_code_bits_;
+ const int literal_size = VP8LHistogramNumCodes(dst_cache_bits);
const int histo_size = VP8LGetHistogramSize(dst_cache_bits);
assert(src->palette_code_bits_ == dst_cache_bits);
memcpy(dst, src, histo_size);
dst->literal_ = dst_literal;
+ memcpy(dst->literal_, src->literal_, literal_size * sizeof(*dst->literal_));
}
int VP8LGetHistogramSize(int cache_bits) {
@@ -91,9 +93,19 @@ void VP8LHistogramCreate(VP8LHistogram* const p,
VP8LHistogramStoreRefs(refs, p);
}
-void VP8LHistogramInit(VP8LHistogram* const p, int palette_code_bits) {
+void VP8LHistogramInit(VP8LHistogram* const p, int palette_code_bits,
+ int init_arrays) {
p->palette_code_bits_ = palette_code_bits;
- HistogramClear(p);
+ if (init_arrays) {
+ HistogramClear(p);
+ } else {
+ p->trivial_symbol_ = 0;
+ p->bit_cost_ = 0.;
+ p->literal_cost_ = 0.;
+ p->red_cost_ = 0.;
+ p->blue_cost_ = 0.;
+ memset(p->is_used_, 0, sizeof(p->is_used_));
+ }
}
VP8LHistogram* VP8LAllocateHistogram(int cache_bits) {
@@ -104,37 +116,70 @@ VP8LHistogram* VP8LAllocateHistogram(int cache_bits) {
histo = (VP8LHistogram*)memory;
// literal_ won't necessary be aligned.
histo->literal_ = (uint32_t*)(memory + sizeof(VP8LHistogram));
- VP8LHistogramInit(histo, cache_bits);
+ VP8LHistogramInit(histo, cache_bits, /*init_arrays=*/ 0);
return histo;
}
+// Resets the pointers of the histograms to point to the bit buffer in the set.
+static void HistogramSetResetPointers(VP8LHistogramSet* const set,
+ int cache_bits) {
+ int i;
+ const int histo_size = VP8LGetHistogramSize(cache_bits);
+ uint8_t* memory = (uint8_t*) (set->histograms);
+ memory += set->max_size * sizeof(*set->histograms);
+ for (i = 0; i < set->max_size; ++i) {
+ memory = (uint8_t*) WEBP_ALIGN(memory);
+ set->histograms[i] = (VP8LHistogram*) memory;
+ // literal_ won't necessary be aligned.
+ set->histograms[i]->literal_ = (uint32_t*)(memory + sizeof(VP8LHistogram));
+ memory += histo_size;
+ }
+}
+
+// Returns the total size of the VP8LHistogramSet.
+static size_t HistogramSetTotalSize(int size, int cache_bits) {
+ const int histo_size = VP8LGetHistogramSize(cache_bits);
+ return (sizeof(VP8LHistogramSet) + size * (sizeof(VP8LHistogram*) +
+ histo_size + WEBP_ALIGN_CST));
+}
+
VP8LHistogramSet* VP8LAllocateHistogramSet(int size, int cache_bits) {
int i;
VP8LHistogramSet* set;
- const int histo_size = VP8LGetHistogramSize(cache_bits);
- const size_t total_size =
- sizeof(*set) + size * (sizeof(*set->histograms) +
- histo_size + WEBP_ALIGN_CST);
+ const size_t total_size = HistogramSetTotalSize(size, cache_bits);
uint8_t* memory = (uint8_t*)WebPSafeMalloc(total_size, sizeof(*memory));
if (memory == NULL) return NULL;
set = (VP8LHistogramSet*)memory;
memory += sizeof(*set);
set->histograms = (VP8LHistogram**)memory;
- memory += size * sizeof(*set->histograms);
set->max_size = size;
set->size = size;
+ HistogramSetResetPointers(set, cache_bits);
for (i = 0; i < size; ++i) {
- memory = (uint8_t*)WEBP_ALIGN(memory);
- set->histograms[i] = (VP8LHistogram*)memory;
- // literal_ won't necessary be aligned.
- set->histograms[i]->literal_ = (uint32_t*)(memory + sizeof(VP8LHistogram));
- VP8LHistogramInit(set->histograms[i], cache_bits);
- memory += histo_size;
+ VP8LHistogramInit(set->histograms[i], cache_bits, /*init_arrays=*/ 0);
}
return set;
}
+void VP8LHistogramSetClear(VP8LHistogramSet* const set) {
+ int i;
+ const int cache_bits = set->histograms[0]->palette_code_bits_;
+ const int size = set->size;
+ const size_t total_size = HistogramSetTotalSize(size, cache_bits);
+ uint8_t* memory = (uint8_t*)set;
+
+ memset(memory, 0, total_size);
+ memory += sizeof(*set);
+ set->histograms = (VP8LHistogram**)memory;
+ set->max_size = size;
+ set->size = size;
+ HistogramSetResetPointers(set, cache_bits);
+ for (i = 0; i < size; ++i) {
+ set->histograms[i]->palette_code_bits_ = cache_bits;
+ }
+}
+
// -----------------------------------------------------------------------------
void VP8LHistogramAddSinglePixOrCopy(VP8LHistogram* const histo,
@@ -237,7 +282,8 @@ static double FinalHuffmanCost(const VP8LStreaks* const stats) {
// Get the symbol entropy for the distribution 'population'.
// Set 'trivial_sym', if there's only one symbol present in the distribution.
static double PopulationCost(const uint32_t* const population, int length,
- uint32_t* const trivial_sym) {
+ uint32_t* const trivial_sym,
+ uint8_t* const is_used) {
VP8LBitEntropy bit_entropy;
VP8LStreaks stats;
VP8LGetEntropyUnrefined(population, length, &bit_entropy, &stats);
@@ -245,6 +291,8 @@ static double PopulationCost(const uint32_t* const population, int length,
*trivial_sym = (bit_entropy.nonzeros == 1) ? bit_entropy.nonzero_code
: VP8L_NON_TRIVIAL_SYM;
}
+ // The histogram is used if there is at least one non-zero streak.
+ *is_used = (stats.streaks[1][0] != 0 || stats.streaks[1][1] != 0);
return BitsEntropyRefine(&bit_entropy) + FinalHuffmanCost(&stats);
}
@@ -253,7 +301,9 @@ static double PopulationCost(const uint32_t* const population, int length,
// non-zero: both the zero-th one, or both the last one.
static WEBP_INLINE double GetCombinedEntropy(const uint32_t* const X,
const uint32_t* const Y,
- int length, int trivial_at_end) {
+ int length, int is_X_used,
+ int is_Y_used,
+ int trivial_at_end) {
VP8LStreaks stats;
if (trivial_at_end) {
// This configuration is due to palettization that transforms an indexed
@@ -262,28 +312,43 @@ static WEBP_INLINE double GetCombinedEntropy(const uint32_t* const X,
// Only FinalHuffmanCost needs to be evaluated.
memset(&stats, 0, sizeof(stats));
// Deal with the non-zero value at index 0 or length-1.
- stats.streaks[1][0] += 1;
+ stats.streaks[1][0] = 1;
// Deal with the following/previous zero streak.
- stats.counts[0] += 1;
- stats.streaks[0][1] += length - 1;
+ stats.counts[0] = 1;
+ stats.streaks[0][1] = length - 1;
return FinalHuffmanCost(&stats);
} else {
VP8LBitEntropy bit_entropy;
- VP8LGetCombinedEntropyUnrefined(X, Y, length, &bit_entropy, &stats);
+ if (is_X_used) {
+ if (is_Y_used) {
+ VP8LGetCombinedEntropyUnrefined(X, Y, length, &bit_entropy, &stats);
+ } else {
+ VP8LGetEntropyUnrefined(X, length, &bit_entropy, &stats);
+ }
+ } else {
+ if (is_Y_used) {
+ VP8LGetEntropyUnrefined(Y, length, &bit_entropy, &stats);
+ } else {
+ memset(&stats, 0, sizeof(stats));
+ stats.counts[0] = 1;
+ stats.streaks[0][length > 3] = length;
+ VP8LBitEntropyInit(&bit_entropy);
+ }
+ }
return BitsEntropyRefine(&bit_entropy) + FinalHuffmanCost(&stats);
}
}
// Estimates the Entropy + Huffman + other block overhead size cost.
-double VP8LHistogramEstimateBits(const VP8LHistogram* const p) {
+double VP8LHistogramEstimateBits(VP8LHistogram* const p) {
return
- PopulationCost(
- p->literal_, VP8LHistogramNumCodes(p->palette_code_bits_), NULL)
- + PopulationCost(p->red_, NUM_LITERAL_CODES, NULL)
- + PopulationCost(p->blue_, NUM_LITERAL_CODES, NULL)
- + PopulationCost(p->alpha_, NUM_LITERAL_CODES, NULL)
- + PopulationCost(p->distance_, NUM_DISTANCE_CODES, NULL)
+ PopulationCost(p->literal_, VP8LHistogramNumCodes(p->palette_code_bits_),
+ NULL, &p->is_used_[0])
+ + PopulationCost(p->red_, NUM_LITERAL_CODES, NULL, &p->is_used_[1])
+ + PopulationCost(p->blue_, NUM_LITERAL_CODES, NULL, &p->is_used_[2])
+ + PopulationCost(p->alpha_, NUM_LITERAL_CODES, NULL, &p->is_used_[3])
+ + PopulationCost(p->distance_, NUM_DISTANCE_CODES, NULL, &p->is_used_[4])
+ VP8LExtraCost(p->literal_ + NUM_LITERAL_CODES, NUM_LENGTH_CODES)
+ VP8LExtraCost(p->distance_, NUM_DISTANCE_CODES);
}
@@ -299,7 +364,8 @@ static int GetCombinedHistogramEntropy(const VP8LHistogram* const a,
int trivial_at_end = 0;
assert(a->palette_code_bits_ == b->palette_code_bits_);
*cost += GetCombinedEntropy(a->literal_, b->literal_,
- VP8LHistogramNumCodes(palette_code_bits), 0);
+ VP8LHistogramNumCodes(palette_code_bits),
+ a->is_used_[0], b->is_used_[0], 0);
*cost += VP8LExtraCostCombined(a->literal_ + NUM_LITERAL_CODES,
b->literal_ + NUM_LITERAL_CODES,
NUM_LENGTH_CODES);
@@ -319,19 +385,23 @@ static int GetCombinedHistogramEntropy(const VP8LHistogram* const a,
}
*cost +=
- GetCombinedEntropy(a->red_, b->red_, NUM_LITERAL_CODES, trivial_at_end);
+ GetCombinedEntropy(a->red_, b->red_, NUM_LITERAL_CODES, a->is_used_[1],
+ b->is_used_[1], trivial_at_end);
if (*cost > cost_threshold) return 0;
*cost +=
- GetCombinedEntropy(a->blue_, b->blue_, NUM_LITERAL_CODES, trivial_at_end);
+ GetCombinedEntropy(a->blue_, b->blue_, NUM_LITERAL_CODES, a->is_used_[2],
+ b->is_used_[2], trivial_at_end);
if (*cost > cost_threshold) return 0;
- *cost += GetCombinedEntropy(a->alpha_, b->alpha_, NUM_LITERAL_CODES,
- trivial_at_end);
+ *cost +=
+ GetCombinedEntropy(a->alpha_, b->alpha_, NUM_LITERAL_CODES,
+ a->is_used_[3], b->is_used_[3], trivial_at_end);
if (*cost > cost_threshold) return 0;
*cost +=
- GetCombinedEntropy(a->distance_, b->distance_, NUM_DISTANCE_CODES, 0);
+ GetCombinedEntropy(a->distance_, b->distance_, NUM_DISTANCE_CODES,
+ a->is_used_[4], b->is_used_[4], 0);
*cost +=
VP8LExtraCostCombined(a->distance_, b->distance_, NUM_DISTANCE_CODES);
if (*cost > cost_threshold) return 0;
@@ -419,16 +489,19 @@ static void UpdateDominantCostRange(
static void UpdateHistogramCost(VP8LHistogram* const h) {
uint32_t alpha_sym, red_sym, blue_sym;
const double alpha_cost =
- PopulationCost(h->alpha_, NUM_LITERAL_CODES, &alpha_sym);
+ PopulationCost(h->alpha_, NUM_LITERAL_CODES, &alpha_sym,
+ &h->is_used_[3]);
const double distance_cost =
- PopulationCost(h->distance_, NUM_DISTANCE_CODES, NULL) +
+ PopulationCost(h->distance_, NUM_DISTANCE_CODES, NULL, &h->is_used_[4]) +
VP8LExtraCost(h->distance_, NUM_DISTANCE_CODES);
const int num_codes = VP8LHistogramNumCodes(h->palette_code_bits_);
- h->literal_cost_ = PopulationCost(h->literal_, num_codes, NULL) +
- VP8LExtraCost(h->literal_ + NUM_LITERAL_CODES,
- NUM_LENGTH_CODES);
- h->red_cost_ = PopulationCost(h->red_, NUM_LITERAL_CODES, &red_sym);
- h->blue_cost_ = PopulationCost(h->blue_, NUM_LITERAL_CODES, &blue_sym);
+ h->literal_cost_ =
+ PopulationCost(h->literal_, num_codes, NULL, &h->is_used_[0]) +
+ VP8LExtraCost(h->literal_ + NUM_LITERAL_CODES, NUM_LENGTH_CODES);
+ h->red_cost_ =
+ PopulationCost(h->red_, NUM_LITERAL_CODES, &red_sym, &h->is_used_[1]);
+ h->blue_cost_ =
+ PopulationCost(h->blue_, NUM_LITERAL_CODES, &blue_sym, &h->is_used_[2]);
h->bit_cost_ = h->literal_cost_ + h->red_cost_ + h->blue_cost_ +
alpha_cost + distance_cost;
if ((alpha_sym | red_sym | blue_sym) == VP8L_NON_TRIVIAL_SYM) {
@@ -473,6 +546,7 @@ static void HistogramBuild(
VP8LHistogram** const histograms = image_histo->histograms;
VP8LRefsCursor c = VP8LRefsCursorInit(backward_refs);
assert(histo_bits > 0);
+ VP8LHistogramSetClear(image_histo);
while (VP8LRefsCursorOk(&c)) {
const PixOrCopy* const v = c.cur_pos;
const int ix = (y >> histo_bits) * histo_xsize + (x >> histo_bits);
@@ -493,11 +567,19 @@ static void HistogramCopyAndAnalyze(
const int histo_size = orig_histo->size;
VP8LHistogram** const orig_histograms = orig_histo->histograms;
VP8LHistogram** const histograms = image_histo->histograms;
+ image_histo->size = 0;
for (i = 0; i < histo_size; ++i) {
VP8LHistogram* const histo = orig_histograms[i];
UpdateHistogramCost(histo);
+
+ // Skip the histogram if it is completely empty, which can happen for tiles
+ // with no information (when they are skipped because of LZ77).
+ if (!histo->is_used_[0] && !histo->is_used_[1] && !histo->is_used_[2]
+ && !histo->is_used_[3] && !histo->is_used_[4]) {
+ continue;
+ }
// Copy histograms from orig_histo[] to image_histo[].
- HistogramCopy(histo, histograms[i]);
+ HistogramCopy(histo, histograms[image_histo->size++]);
}
}
@@ -674,6 +756,18 @@ static void HistoQueueUpdateHead(HistoQueue* const histo_queue,
}
}
+// Update the cost diff and combo of a pair of histograms. This needs to be
+// called when the the histograms have been merged with a third one.
+static void HistoQueueUpdatePair(const VP8LHistogram* const h1,
+ const VP8LHistogram* const h2,
+ double threshold,
+ HistogramPair* const pair) {
+ const double sum_cost = h1->bit_cost_ + h2->bit_cost_;
+ pair->cost_combo = 0.;
+ GetCombinedHistogramEntropy(h1, h2, sum_cost + threshold, &pair->cost_combo);
+ pair->cost_diff = pair->cost_combo - sum_cost;
+}
+
// Create a pair from indices "idx1" and "idx2" provided its cost
// is inferior to "threshold", a negative entropy.
// It returns the cost of the pair, or 0. if it superior to threshold.
@@ -683,7 +777,6 @@ static double HistoQueuePush(HistoQueue* const histo_queue,
const VP8LHistogram* h1;
const VP8LHistogram* h2;
HistogramPair pair;
- double sum_cost;
assert(threshold <= 0.);
if (idx1 > idx2) {
@@ -695,10 +788,8 @@ static double HistoQueuePush(HistoQueue* const histo_queue,
pair.idx2 = idx2;
h1 = histograms[idx1];
h2 = histograms[idx2];
- sum_cost = h1->bit_cost_ + h2->bit_cost_;
- pair.cost_combo = 0.;
- GetCombinedHistogramEntropy(h1, h2, sum_cost + threshold, &pair.cost_combo);
- pair.cost_diff = pair.cost_combo - sum_cost;
+
+ HistoQueueUpdatePair(h1, h2, threshold, &pair);
// Do not even consider the pair if it does not improve the entropy.
if (pair.cost_diff >= threshold) return 0.;
@@ -891,8 +982,7 @@ static int HistogramCombineStochastic(VP8LHistogramSet* const image_histo,
}
if (do_eval) {
// Re-evaluate the cost of an updated pair.
- GetCombinedHistogramEntropy(histograms[p->idx1], histograms[p->idx2], 0,
- &p->cost_diff);
+ HistoQueueUpdatePair(histograms[p->idx1], histograms[p->idx2], 0., p);
if (p->cost_diff >= 0.) {
HistoQueuePopPair(&histo_queue, p);
continue;
@@ -987,8 +1077,7 @@ int VP8LGetHistoImageSymbols(int xsize, int ysize,
// histograms of small sizes (as bin_map will be very sparse) and
// maximum quality q==100 (to preserve the compression gains at that level).
const int entropy_combine_num_bins = low_effort ? NUM_PARTITIONS : BIN_SIZE;
- const int entropy_combine =
- (orig_histo->size > entropy_combine_num_bins * 2) && (quality < 100);
+ int entropy_combine;
if (orig_histo == NULL) goto Error;
@@ -996,15 +1085,16 @@ int VP8LGetHistoImageSymbols(int xsize, int ysize,
HistogramBuild(xsize, histo_bits, refs, orig_histo);
// Copies the histograms and computes its bit_cost.
HistogramCopyAndAnalyze(orig_histo, image_histo);
-
+ entropy_combine =
+ (image_histo->size > entropy_combine_num_bins * 2) && (quality < 100);
if (entropy_combine) {
- const int bin_map_size = orig_histo->size;
+ const int bin_map_size = image_histo->size;
// Reuse histogram_symbols storage. By definition, it's guaranteed to be ok.
uint16_t* const bin_map = histogram_symbols;
const double combine_cost_factor =
GetCombineCostFactor(image_histo_raw_size, quality);
- HistogramAnalyzeEntropyBin(orig_histo, bin_map, low_effort);
+ HistogramAnalyzeEntropyBin(image_histo, bin_map, low_effort);
// Collapse histograms with similar entropy.
HistogramCombineEntropyBin(image_histo, tmp_histo, bin_map, bin_map_size,
entropy_combine_num_bins, combine_cost_factor,
diff --git a/thirdparty/libwebp/src/enc/histogram_enc.h b/thirdparty/libwebp/src/enc/histogram_enc.h
index e8c4c83f6f..54c2d21783 100644
--- a/thirdparty/libwebp/src/enc/histogram_enc.h
+++ b/thirdparty/libwebp/src/enc/histogram_enc.h
@@ -44,6 +44,7 @@ typedef struct {
double literal_cost_; // Cached values of dominant entropy costs:
double red_cost_; // literal, red & blue.
double blue_cost_;
+ uint8_t is_used_[5]; // 5 for literal, red, blue, alpha, distance
} VP8LHistogram;
// Collection of histograms with fixed capacity, allocated as one
@@ -67,7 +68,9 @@ void VP8LHistogramCreate(VP8LHistogram* const p,
int VP8LGetHistogramSize(int palette_code_bits);
// Set the palette_code_bits and reset the stats.
-void VP8LHistogramInit(VP8LHistogram* const p, int palette_code_bits);
+// If init_arrays is true, the arrays are also filled with 0's.
+void VP8LHistogramInit(VP8LHistogram* const p, int palette_code_bits,
+ int init_arrays);
// Collect all the references into a histogram (without reset)
void VP8LHistogramStoreRefs(const VP8LBackwardRefs* const refs,
@@ -83,6 +86,9 @@ void VP8LFreeHistogramSet(VP8LHistogramSet* const histo);
// using 'cache_bits'. Return NULL in case of memory error.
VP8LHistogramSet* VP8LAllocateHistogramSet(int size, int cache_bits);
+// Set the histograms in set to 0.
+void VP8LHistogramSetClear(VP8LHistogramSet* const set);
+
// Allocate and initialize histogram object with specified 'cache_bits'.
// Returns NULL in case of memory error.
// Special case of VP8LAllocateHistogramSet, with size equals 1.
@@ -113,7 +119,7 @@ double VP8LBitsEntropy(const uint32_t* const array, int n);
// Estimate how many bits the combined entropy of literals and distance
// approximately maps to.
-double VP8LHistogramEstimateBits(const VP8LHistogram* const p);
+double VP8LHistogramEstimateBits(VP8LHistogram* const p);
#ifdef __cplusplus
}
diff --git a/thirdparty/libwebp/src/enc/iterator_enc.c b/thirdparty/libwebp/src/enc/iterator_enc.c
index 7c47d51272..29f91d8315 100644
--- a/thirdparty/libwebp/src/enc/iterator_enc.c
+++ b/thirdparty/libwebp/src/enc/iterator_enc.c
@@ -128,7 +128,7 @@ static void ImportLine(const uint8_t* src, int src_stride,
for (; i < total_len; ++i) dst[i] = dst[len - 1];
}
-void VP8IteratorImport(VP8EncIterator* const it, uint8_t* tmp_32) {
+void VP8IteratorImport(VP8EncIterator* const it, uint8_t* const tmp_32) {
const VP8Encoder* const enc = it->enc_;
const int x = it->x_, y = it->y_;
const WebPPicture* const pic = enc->pic_;
diff --git a/thirdparty/libwebp/src/enc/picture_tools_enc.c b/thirdparty/libwebp/src/enc/picture_tools_enc.c
index be292d4391..d0e8a495da 100644
--- a/thirdparty/libwebp/src/enc/picture_tools_enc.c
+++ b/thirdparty/libwebp/src/enc/picture_tools_enc.c
@@ -16,10 +16,6 @@
#include "src/enc/vp8i_enc.h"
#include "src/dsp/yuv.h"
-static WEBP_INLINE uint32_t MakeARGB32(int r, int g, int b) {
- return (0xff000000u | (r << 16) | (g << 8) | b);
-}
-
//------------------------------------------------------------------------------
// Helper: clean up fully transparent area to help compressibility.
@@ -195,6 +191,10 @@ void WebPCleanupTransparentAreaLossless(WebPPicture* const pic) {
#define BLEND_10BIT(V0, V1, ALPHA) \
((((V0) * (1020 - (ALPHA)) + (V1) * (ALPHA)) * 0x101 + 1024) >> 18)
+static WEBP_INLINE uint32_t MakeARGB32(int r, int g, int b) {
+ return (0xff000000u | (r << 16) | (g << 8) | b);
+}
+
void WebPBlendAlpha(WebPPicture* pic, uint32_t background_rgb) {
const int red = (background_rgb >> 16) & 0xff;
const int green = (background_rgb >> 8) & 0xff;
@@ -208,39 +208,44 @@ void WebPBlendAlpha(WebPPicture* pic, uint32_t background_rgb) {
const int U0 = VP8RGBToU(4 * red, 4 * green, 4 * blue, 4 * YUV_HALF);
const int V0 = VP8RGBToV(4 * red, 4 * green, 4 * blue, 4 * YUV_HALF);
const int has_alpha = pic->colorspace & WEBP_CSP_ALPHA_BIT;
- if (!has_alpha || pic->a == NULL) return; // nothing to do
+ uint8_t* y_ptr = pic->y;
+ uint8_t* u_ptr = pic->u;
+ uint8_t* v_ptr = pic->v;
+ uint8_t* a_ptr = pic->a;
+ if (!has_alpha || a_ptr == NULL) return; // nothing to do
for (y = 0; y < pic->height; ++y) {
// Luma blending
- uint8_t* const y_ptr = pic->y + y * pic->y_stride;
- uint8_t* const a_ptr = pic->a + y * pic->a_stride;
for (x = 0; x < pic->width; ++x) {
- const int alpha = a_ptr[x];
+ const uint8_t alpha = a_ptr[x];
if (alpha < 0xff) {
- y_ptr[x] = BLEND(Y0, y_ptr[x], a_ptr[x]);
+ y_ptr[x] = BLEND(Y0, y_ptr[x], alpha);
}
}
// Chroma blending every even line
if ((y & 1) == 0) {
- uint8_t* const u = pic->u + (y >> 1) * pic->uv_stride;
- uint8_t* const v = pic->v + (y >> 1) * pic->uv_stride;
uint8_t* const a_ptr2 =
(y + 1 == pic->height) ? a_ptr : a_ptr + pic->a_stride;
for (x = 0; x < uv_width; ++x) {
// Average four alpha values into a single blending weight.
// TODO(skal): might lead to visible contouring. Can we do better?
- const int alpha =
+ const uint32_t alpha =
a_ptr[2 * x + 0] + a_ptr[2 * x + 1] +
a_ptr2[2 * x + 0] + a_ptr2[2 * x + 1];
- u[x] = BLEND_10BIT(U0, u[x], alpha);
- v[x] = BLEND_10BIT(V0, v[x], alpha);
+ u_ptr[x] = BLEND_10BIT(U0, u_ptr[x], alpha);
+ v_ptr[x] = BLEND_10BIT(V0, v_ptr[x], alpha);
}
if (pic->width & 1) { // rightmost pixel
- const int alpha = 2 * (a_ptr[2 * x + 0] + a_ptr2[2 * x + 0]);
- u[x] = BLEND_10BIT(U0, u[x], alpha);
- v[x] = BLEND_10BIT(V0, v[x], alpha);
+ const uint32_t alpha = 2 * (a_ptr[2 * x + 0] + a_ptr2[2 * x + 0]);
+ u_ptr[x] = BLEND_10BIT(U0, u_ptr[x], alpha);
+ v_ptr[x] = BLEND_10BIT(V0, v_ptr[x], alpha);
}
+ } else {
+ u_ptr += pic->uv_stride;
+ v_ptr += pic->uv_stride;
}
- memset(a_ptr, 0xff, pic->width);
+ memset(a_ptr, 0xff, pic->width); // reset alpha value to opaque
+ a_ptr += pic->a_stride;
+ y_ptr += pic->y_stride;
}
} else {
uint32_t* argb = pic->argb;
diff --git a/thirdparty/libwebp/src/enc/vp8i_enc.h b/thirdparty/libwebp/src/enc/vp8i_enc.h
index 624e8f8e66..92439febb8 100644
--- a/thirdparty/libwebp/src/enc/vp8i_enc.h
+++ b/thirdparty/libwebp/src/enc/vp8i_enc.h
@@ -32,7 +32,7 @@ extern "C" {
// version numbers
#define ENC_MAJ_VERSION 1
#define ENC_MIN_VERSION 0
-#define ENC_REV_VERSION 0
+#define ENC_REV_VERSION 1
enum { MAX_LF_LEVELS = 64, // Maximum loop filter level
MAX_VARIABLE_LEVEL = 67, // last (inclusive) level with variable cost
@@ -278,7 +278,7 @@ int VP8IteratorIsDone(const VP8EncIterator* const it);
// Import uncompressed samples from source.
// If tmp_32 is not NULL, import boundary samples too.
// tmp_32 is a 32-bytes scratch buffer that must be aligned in memory.
-void VP8IteratorImport(VP8EncIterator* const it, uint8_t* tmp_32);
+void VP8IteratorImport(VP8EncIterator* const it, uint8_t* const tmp_32);
// export decimated samples
void VP8IteratorExport(const VP8EncIterator* const it);
// go to next macroblock. Returns false if not finished.
@@ -515,4 +515,4 @@ void WebPCleanupTransparentAreaLossless(WebPPicture* const pic);
} // extern "C"
#endif
-#endif /* WEBP_ENC_VP8I_ENC_H_ */
+#endif // WEBP_ENC_VP8I_ENC_H_
diff --git a/thirdparty/libwebp/src/enc/vp8l_enc.c b/thirdparty/libwebp/src/enc/vp8l_enc.c
index a89184eb08..2713edcd95 100644
--- a/thirdparty/libwebp/src/enc/vp8l_enc.c
+++ b/thirdparty/libwebp/src/enc/vp8l_enc.c
@@ -809,6 +809,7 @@ static WebPEncodingError EncodeImageNoHuffman(VP8LBitWriter* const bw,
err = VP8_ENC_ERROR_OUT_OF_MEMORY;
goto Error;
}
+ VP8LHistogramSetClear(histogram_image);
// Build histogram image and symbols from backward references.
VP8LHistogramStoreRefs(refs, histogram_image->histograms[0]);
@@ -1248,14 +1249,20 @@ static WebPEncodingError MakeInputImageCopy(VP8LEncoder* const enc) {
const WebPPicture* const picture = enc->pic_;
const int width = picture->width;
const int height = picture->height;
- int y;
+
err = AllocateTransformBuffer(enc, width, height);
if (err != VP8_ENC_OK) return err;
if (enc->argb_content_ == kEncoderARGB) return VP8_ENC_OK;
- for (y = 0; y < height; ++y) {
- memcpy(enc->argb_ + y * width,
- picture->argb + y * picture->argb_stride,
- width * sizeof(*enc->argb_));
+
+ {
+ uint32_t* dst = enc->argb_;
+ const uint32_t* src = picture->argb;
+ int y;
+ for (y = 0; y < height; ++y) {
+ memcpy(dst, src, width * sizeof(*dst));
+ dst += width;
+ src += picture->argb_stride;
+ }
}
enc->argb_content_ = kEncoderARGB;
assert(enc->current_width_ == width);
diff --git a/thirdparty/libwebp/src/enc/vp8li_enc.h b/thirdparty/libwebp/src/enc/vp8li_enc.h
index 298a4a0014..d2d0fc509c 100644
--- a/thirdparty/libwebp/src/enc/vp8li_enc.h
+++ b/thirdparty/libwebp/src/enc/vp8li_enc.h
@@ -115,4 +115,4 @@ void VP8LColorSpaceTransform(int width, int height, int bits, int quality,
} // extern "C"
#endif
-#endif /* WEBP_ENC_VP8LI_ENC_H_ */
+#endif // WEBP_ENC_VP8LI_ENC_H_
diff --git a/thirdparty/libwebp/src/mux/animi.h b/thirdparty/libwebp/src/mux/animi.h
index 88899532aa..34c45ba4da 100644
--- a/thirdparty/libwebp/src/mux/animi.h
+++ b/thirdparty/libwebp/src/mux/animi.h
@@ -40,4 +40,4 @@ int WebPAnimEncoderRefineRect(
} // extern "C"
#endif
-#endif /* WEBP_MUX_ANIMI_H_ */
+#endif // WEBP_MUX_ANIMI_H_
diff --git a/thirdparty/libwebp/src/mux/muxedit.c b/thirdparty/libwebp/src/mux/muxedit.c
index 7a027b3cb4..ccf14b2a0c 100644
--- a/thirdparty/libwebp/src/mux/muxedit.c
+++ b/thirdparty/libwebp/src/mux/muxedit.c
@@ -69,12 +69,12 @@ void WebPMuxDelete(WebPMux* mux) {
if (idx == (INDEX)) { \
err = ChunkAssignData(&chunk, data, copy_data, tag); \
if (err == WEBP_MUX_OK) { \
- err = ChunkSetNth(&chunk, (LIST), nth); \
+ err = ChunkSetHead(&chunk, (LIST)); \
} \
return err; \
}
-static WebPMuxError MuxSet(WebPMux* const mux, uint32_t tag, uint32_t nth,
+static WebPMuxError MuxSet(WebPMux* const mux, uint32_t tag,
const WebPData* const data, int copy_data) {
WebPChunk chunk;
WebPMuxError err = WEBP_MUX_NOT_FOUND;
@@ -190,7 +190,7 @@ WebPMuxError WebPMuxSetChunk(WebPMux* mux, const char fourcc[4],
if (err != WEBP_MUX_OK && err != WEBP_MUX_NOT_FOUND) return err;
// Add the given chunk.
- return MuxSet(mux, tag, 1, chunk_data, copy_data);
+ return MuxSet(mux, tag, chunk_data, copy_data);
}
// Creates a chunk from given 'data' and sets it as 1st chunk in 'chunk_list'.
@@ -202,7 +202,7 @@ static WebPMuxError AddDataToChunkList(
ChunkInit(&chunk);
err = ChunkAssignData(&chunk, data, copy_data, tag);
if (err != WEBP_MUX_OK) goto Err;
- err = ChunkSetNth(&chunk, chunk_list, 1);
+ err = ChunkSetHead(&chunk, chunk_list);
if (err != WEBP_MUX_OK) goto Err;
return WEBP_MUX_OK;
Err:
@@ -266,14 +266,14 @@ WebPMuxError WebPMuxPushFrame(WebPMux* mux, const WebPMuxFrameInfo* info,
int copy_data) {
WebPMuxImage wpi;
WebPMuxError err;
- const WebPData* const bitstream = &info->bitstream;
// Sanity checks.
if (mux == NULL || info == NULL) return WEBP_MUX_INVALID_ARGUMENT;
if (info->id != WEBP_CHUNK_ANMF) return WEBP_MUX_INVALID_ARGUMENT;
- if (bitstream->bytes == NULL || bitstream->size > MAX_CHUNK_PAYLOAD) {
+ if (info->bitstream.bytes == NULL ||
+ info->bitstream.size > MAX_CHUNK_PAYLOAD) {
return WEBP_MUX_INVALID_ARGUMENT;
}
@@ -287,7 +287,7 @@ WebPMuxError WebPMuxPushFrame(WebPMux* mux, const WebPMuxFrameInfo* info,
}
MuxImageInit(&wpi);
- err = SetAlphaAndImageChunks(bitstream, copy_data, &wpi);
+ err = SetAlphaAndImageChunks(&info->bitstream, copy_data, &wpi);
if (err != WEBP_MUX_OK) goto Err;
assert(wpi.img_ != NULL); // As SetAlphaAndImageChunks() was successful.
@@ -342,7 +342,7 @@ WebPMuxError WebPMuxSetAnimationParams(WebPMux* mux,
// Set the animation parameters.
PutLE32(data, params->bgcolor);
PutLE16(data + 4, params->loop_count);
- return MuxSet(mux, kChunks[IDX_ANIM].tag, 1, &anim, 1);
+ return MuxSet(mux, kChunks[IDX_ANIM].tag, &anim, 1);
}
WebPMuxError WebPMuxSetCanvasSize(WebPMux* mux,
@@ -540,7 +540,7 @@ static WebPMuxError CreateVP8XChunk(WebPMux* const mux) {
PutLE24(data + 4, width - 1); // canvas width.
PutLE24(data + 7, height - 1); // canvas height.
- return MuxSet(mux, kChunks[IDX_VP8X].tag, 1, &vp8x, 1);
+ return MuxSet(mux, kChunks[IDX_VP8X].tag, &vp8x, 1);
}
// Cleans up 'mux' by removing any unnecessary chunks.
diff --git a/thirdparty/libwebp/src/mux/muxi.h b/thirdparty/libwebp/src/mux/muxi.h
index 6b57eea30f..df9f74c63c 100644
--- a/thirdparty/libwebp/src/mux/muxi.h
+++ b/thirdparty/libwebp/src/mux/muxi.h
@@ -14,6 +14,7 @@
#ifndef WEBP_MUX_MUXI_H_
#define WEBP_MUX_MUXI_H_
+#include <assert.h>
#include <stdlib.h>
#include "src/dec/vp8i_dec.h"
#include "src/dec/vp8li_dec.h"
@@ -28,7 +29,7 @@ extern "C" {
#define MUX_MAJ_VERSION 1
#define MUX_MIN_VERSION 0
-#define MUX_REV_VERSION 0
+#define MUX_REV_VERSION 1
// Chunk object.
typedef struct WebPChunk WebPChunk;
@@ -126,11 +127,14 @@ WebPChunk* ChunkSearchList(WebPChunk* first, uint32_t nth, uint32_t tag);
WebPMuxError ChunkAssignData(WebPChunk* chunk, const WebPData* const data,
int copy_data, uint32_t tag);
-// Sets 'chunk' at nth position in the 'chunk_list'.
-// nth = 0 has the special meaning "last of the list".
+// Sets 'chunk' as the only element in 'chunk_list' if it is empty.
// On success ownership is transferred from 'chunk' to the 'chunk_list'.
-WebPMuxError ChunkSetNth(WebPChunk* chunk, WebPChunk** chunk_list,
- uint32_t nth);
+WebPMuxError ChunkSetHead(WebPChunk* const chunk, WebPChunk** const chunk_list);
+// Sets 'chunk' at last position in the 'chunk_list'.
+// On success ownership is transferred from 'chunk' to the 'chunk_list'.
+// *chunk_list also points towards the last valid element of the initial
+// *chunk_list.
+WebPMuxError ChunkAppend(WebPChunk* const chunk, WebPChunk*** const chunk_list);
// Releases chunk and returns chunk->next_.
WebPChunk* ChunkRelease(WebPChunk* const chunk);
@@ -143,13 +147,13 @@ void ChunkListDelete(WebPChunk** const chunk_list);
// Returns size of the chunk including chunk header and padding byte (if any).
static WEBP_INLINE size_t SizeWithPadding(size_t chunk_size) {
+ assert(chunk_size <= MAX_CHUNK_PAYLOAD);
return CHUNK_HEADER_SIZE + ((chunk_size + 1) & ~1U);
}
// Size of a chunk including header and padding.
static WEBP_INLINE size_t ChunkDiskSize(const WebPChunk* chunk) {
const size_t data_size = chunk->data_.size;
- assert(data_size < MAX_CHUNK_PAYLOAD);
return SizeWithPadding(data_size);
}
@@ -227,4 +231,4 @@ WebPMuxError MuxValidate(const WebPMux* const mux);
} // extern "C"
#endif
-#endif /* WEBP_MUX_MUXI_H_ */
+#endif // WEBP_MUX_MUXI_H_
diff --git a/thirdparty/libwebp/src/mux/muxinternal.c b/thirdparty/libwebp/src/mux/muxinternal.c
index 1473f100e5..b9ee6717d3 100644
--- a/thirdparty/libwebp/src/mux/muxinternal.c
+++ b/thirdparty/libwebp/src/mux/muxinternal.c
@@ -111,27 +111,6 @@ WebPChunk* ChunkSearchList(WebPChunk* first, uint32_t nth, uint32_t tag) {
return ((nth > 0) && (iter > 0)) ? NULL : first;
}
-// Outputs a pointer to 'prev_chunk->next_',
-// where 'prev_chunk' is the pointer to the chunk at position (nth - 1).
-// Returns true if nth chunk was found.
-static int ChunkSearchListToSet(WebPChunk** chunk_list, uint32_t nth,
- WebPChunk*** const location) {
- uint32_t count = 0;
- assert(chunk_list != NULL);
- *location = chunk_list;
-
- while (*chunk_list != NULL) {
- WebPChunk* const cur_chunk = *chunk_list;
- ++count;
- if (count == nth) return 1; // Found.
- chunk_list = &cur_chunk->next_;
- *location = chunk_list;
- }
-
- // *chunk_list is ok to be NULL if adding at last location.
- return (nth == 0 || (count == nth - 1)) ? 1 : 0;
-}
-
//------------------------------------------------------------------------------
// Chunk writer methods.
@@ -156,11 +135,12 @@ WebPMuxError ChunkAssignData(WebPChunk* chunk, const WebPData* const data,
return WEBP_MUX_OK;
}
-WebPMuxError ChunkSetNth(WebPChunk* chunk, WebPChunk** chunk_list,
- uint32_t nth) {
+WebPMuxError ChunkSetHead(WebPChunk* const chunk,
+ WebPChunk** const chunk_list) {
WebPChunk* new_chunk;
- if (!ChunkSearchListToSet(chunk_list, nth, &chunk_list)) {
+ assert(chunk_list != NULL);
+ if (*chunk_list != NULL) {
return WEBP_MUX_NOT_FOUND;
}
@@ -168,11 +148,26 @@ WebPMuxError ChunkSetNth(WebPChunk* chunk, WebPChunk** chunk_list,
if (new_chunk == NULL) return WEBP_MUX_MEMORY_ERROR;
*new_chunk = *chunk;
chunk->owner_ = 0;
- new_chunk->next_ = *chunk_list;
+ new_chunk->next_ = NULL;
*chunk_list = new_chunk;
return WEBP_MUX_OK;
}
+WebPMuxError ChunkAppend(WebPChunk* const chunk,
+ WebPChunk*** const chunk_list) {
+ assert(chunk_list != NULL && *chunk_list != NULL);
+
+ if (**chunk_list == NULL) {
+ ChunkSetHead(chunk, *chunk_list);
+ } else {
+ WebPChunk* last_chunk = **chunk_list;
+ while (last_chunk->next_ != NULL) last_chunk = last_chunk->next_;
+ ChunkSetHead(chunk, &last_chunk->next_);
+ *chunk_list = &last_chunk->next_;
+ }
+ return WEBP_MUX_OK;
+}
+
//------------------------------------------------------------------------------
// Chunk deletion method(s).
@@ -232,9 +227,11 @@ void MuxImageInit(WebPMuxImage* const wpi) {
WebPMuxImage* MuxImageRelease(WebPMuxImage* const wpi) {
WebPMuxImage* next;
if (wpi == NULL) return NULL;
- ChunkDelete(wpi->header_);
- ChunkDelete(wpi->alpha_);
- ChunkDelete(wpi->img_);
+ // There should be at most one chunk of header_, alpha_, img_ but we call
+ // ChunkListDelete to be safe
+ ChunkListDelete(&wpi->header_);
+ ChunkListDelete(&wpi->alpha_);
+ ChunkListDelete(&wpi->img_);
ChunkListDelete(&wpi->unknown_);
next = wpi->next_;
diff --git a/thirdparty/libwebp/src/mux/muxread.c b/thirdparty/libwebp/src/mux/muxread.c
index 0b55286862..268f6acb53 100644
--- a/thirdparty/libwebp/src/mux/muxread.c
+++ b/thirdparty/libwebp/src/mux/muxread.c
@@ -59,6 +59,7 @@ static WebPMuxError ChunkVerifyAndAssign(WebPChunk* chunk,
// Sanity checks.
if (data_size < CHUNK_HEADER_SIZE) return WEBP_MUX_NOT_ENOUGH_DATA;
chunk_size = GetLE32(data + TAG_SIZE);
+ if (chunk_size > MAX_CHUNK_PAYLOAD) return WEBP_MUX_BAD_DATA;
{
const size_t chunk_disk_size = SizeWithPadding(chunk_size);
@@ -102,6 +103,7 @@ static int MuxImageParse(const WebPChunk* const chunk, int copy_data,
const uint8_t* const last = bytes + size;
WebPChunk subchunk;
size_t subchunk_size;
+ WebPChunk** unknown_chunk_list = &wpi->unknown_;
ChunkInit(&subchunk);
assert(chunk->tag_ == kChunks[IDX_ANMF].tag);
@@ -116,7 +118,7 @@ static int MuxImageParse(const WebPChunk* const chunk, int copy_data,
if (size < hdr_size) goto Fail;
ChunkAssignData(&subchunk, &temp, copy_data, chunk->tag_);
}
- ChunkSetNth(&subchunk, &wpi->header_, 1);
+ ChunkSetHead(&subchunk, &wpi->header_);
wpi->is_partial_ = 1; // Waiting for ALPH and/or VP8/VP8L chunks.
// Rest of the chunks.
@@ -133,18 +135,23 @@ static int MuxImageParse(const WebPChunk* const chunk, int copy_data,
switch (ChunkGetIdFromTag(subchunk.tag_)) {
case WEBP_CHUNK_ALPHA:
if (wpi->alpha_ != NULL) goto Fail; // Consecutive ALPH chunks.
- if (ChunkSetNth(&subchunk, &wpi->alpha_, 1) != WEBP_MUX_OK) goto Fail;
+ if (ChunkSetHead(&subchunk, &wpi->alpha_) != WEBP_MUX_OK) goto Fail;
wpi->is_partial_ = 1; // Waiting for a VP8 chunk.
break;
case WEBP_CHUNK_IMAGE:
- if (ChunkSetNth(&subchunk, &wpi->img_, 1) != WEBP_MUX_OK) goto Fail;
+ if (wpi->img_ != NULL) goto Fail; // Only 1 image chunk allowed.
+ if (ChunkSetHead(&subchunk, &wpi->img_) != WEBP_MUX_OK) goto Fail;
if (!MuxImageFinalize(wpi)) goto Fail;
wpi->is_partial_ = 0; // wpi is completely filled.
break;
case WEBP_CHUNK_UNKNOWN:
- if (wpi->is_partial_) goto Fail; // Encountered an unknown chunk
- // before some image chunks.
- if (ChunkSetNth(&subchunk, &wpi->unknown_, 0) != WEBP_MUX_OK) goto Fail;
+ if (wpi->is_partial_) {
+ goto Fail; // Encountered an unknown chunk
+ // before some image chunks.
+ }
+ if (ChunkAppend(&subchunk, &unknown_chunk_list) != WEBP_MUX_OK) {
+ goto Fail;
+ }
break;
default:
goto Fail;
@@ -175,6 +182,9 @@ WebPMux* WebPMuxCreateInternal(const WebPData* bitstream, int copy_data,
const uint8_t* data;
size_t size;
WebPChunk chunk;
+ // Stores the end of the chunk lists so that it is faster to append data to
+ // their ends.
+ WebPChunk** chunk_list_ends[WEBP_CHUNK_NIL + 1] = { NULL };
ChunkInit(&chunk);
// Sanity checks.
@@ -187,7 +197,7 @@ WebPMux* WebPMuxCreateInternal(const WebPData* bitstream, int copy_data,
size = bitstream->size;
if (data == NULL) return NULL;
- if (size < RIFF_HEADER_SIZE) return NULL;
+ if (size < RIFF_HEADER_SIZE + CHUNK_HEADER_SIZE) return NULL;
if (GetLE32(data + 0) != MKFOURCC('R', 'I', 'F', 'F') ||
GetLE32(data + CHUNK_HEADER_SIZE) != MKFOURCC('W', 'E', 'B', 'P')) {
return NULL;
@@ -196,8 +206,6 @@ WebPMux* WebPMuxCreateInternal(const WebPData* bitstream, int copy_data,
mux = WebPMuxNew();
if (mux == NULL) return NULL;
- if (size < RIFF_HEADER_SIZE + TAG_SIZE) goto Err;
-
tag = GetLE32(data + RIFF_HEADER_SIZE);
if (tag != kChunks[IDX_VP8].tag &&
tag != kChunks[IDX_VP8L].tag &&
@@ -205,13 +213,17 @@ WebPMux* WebPMuxCreateInternal(const WebPData* bitstream, int copy_data,
goto Err; // First chunk should be VP8, VP8L or VP8X.
}
- riff_size = SizeWithPadding(GetLE32(data + TAG_SIZE));
- if (riff_size > MAX_CHUNK_PAYLOAD || riff_size > size) {
- goto Err;
- } else {
- if (riff_size < size) { // Redundant data after last chunk.
- size = riff_size; // To make sure we don't read any data beyond mux_size.
- }
+ riff_size = GetLE32(data + TAG_SIZE);
+ if (riff_size > MAX_CHUNK_PAYLOAD) goto Err;
+
+ // Note this padding is historical and differs from demux.c which does not
+ // pad the file size.
+ riff_size = SizeWithPadding(riff_size);
+ if (riff_size < CHUNK_HEADER_SIZE) goto Err;
+ if (riff_size > size) goto Err;
+ // There's no point in reading past the end of the RIFF chunk.
+ if (size > riff_size + CHUNK_HEADER_SIZE) {
+ size = riff_size + CHUNK_HEADER_SIZE;
}
end = data + size;
@@ -226,7 +238,6 @@ WebPMux* WebPMuxCreateInternal(const WebPData* bitstream, int copy_data,
while (data != end) {
size_t data_size;
WebPChunkId id;
- WebPChunk** chunk_list;
if (ChunkVerifyAndAssign(&chunk, data, size, riff_size,
copy_data) != WEBP_MUX_OK) {
goto Err;
@@ -236,11 +247,11 @@ WebPMux* WebPMuxCreateInternal(const WebPData* bitstream, int copy_data,
switch (id) {
case WEBP_CHUNK_ALPHA:
if (wpi->alpha_ != NULL) goto Err; // Consecutive ALPH chunks.
- if (ChunkSetNth(&chunk, &wpi->alpha_, 1) != WEBP_MUX_OK) goto Err;
+ if (ChunkSetHead(&chunk, &wpi->alpha_) != WEBP_MUX_OK) goto Err;
wpi->is_partial_ = 1; // Waiting for a VP8 chunk.
break;
case WEBP_CHUNK_IMAGE:
- if (ChunkSetNth(&chunk, &wpi->img_, 1) != WEBP_MUX_OK) goto Err;
+ if (ChunkSetHead(&chunk, &wpi->img_) != WEBP_MUX_OK) goto Err;
if (!MuxImageFinalize(wpi)) goto Err;
wpi->is_partial_ = 0; // wpi is completely filled.
PushImage:
@@ -257,9 +268,13 @@ WebPMux* WebPMuxCreateInternal(const WebPData* bitstream, int copy_data,
default: // A non-image chunk.
if (wpi->is_partial_) goto Err; // Encountered a non-image chunk before
// getting all chunks of an image.
- chunk_list = MuxGetChunkListFromId(mux, id); // List to add this chunk.
- if (ChunkSetNth(&chunk, chunk_list, 0) != WEBP_MUX_OK) goto Err;
+ if (chunk_list_ends[id] == NULL) {
+ chunk_list_ends[id] =
+ MuxGetChunkListFromId(mux, id); // List to add this chunk.
+ }
+ if (ChunkAppend(&chunk, &chunk_list_ends[id]) != WEBP_MUX_OK) goto Err;
if (id == WEBP_CHUNK_VP8X) { // grab global specs
+ if (data_size < CHUNK_HEADER_SIZE + VP8X_CHUNK_SIZE) goto Err;
mux->canvas_width_ = GetLE24(data + 12) + 1;
mux->canvas_height_ = GetLE24(data + 15) + 1;
}
@@ -385,6 +400,10 @@ static WebPMuxError SynthesizeBitstream(const WebPMuxImage* const wpi,
uint8_t* const data = (uint8_t*)WebPSafeMalloc(1ULL, size);
if (data == NULL) return WEBP_MUX_MEMORY_ERROR;
+ // There should be at most one alpha_ chunk and exactly one img_ chunk.
+ assert(wpi->alpha_ == NULL || wpi->alpha_->next_ == NULL);
+ assert(wpi->img_ != NULL && wpi->img_->next_ == NULL);
+
// Main RIFF header.
dst = MuxEmitRiffHeader(data, size);
diff --git a/thirdparty/libwebp/src/utils/bit_reader_inl_utils.h b/thirdparty/libwebp/src/utils/bit_reader_inl_utils.h
index 2ccc6ed326..7e607f370a 100644
--- a/thirdparty/libwebp/src/utils/bit_reader_inl_utils.h
+++ b/thirdparty/libwebp/src/utils/bit_reader_inl_utils.h
@@ -187,4 +187,4 @@ static WEBP_INLINE int VP8GetBitAlt(VP8BitReader* const br, int prob) {
} // extern "C"
#endif
-#endif // WEBP_UTILS_BIT_READER_INL_UTILS_H_
+#endif // WEBP_UTILS_BIT_READER_INL_UTILS_H_
diff --git a/thirdparty/libwebp/src/utils/bit_reader_utils.h b/thirdparty/libwebp/src/utils/bit_reader_utils.h
index 04f9804409..de810d402a 100644
--- a/thirdparty/libwebp/src/utils/bit_reader_utils.h
+++ b/thirdparty/libwebp/src/utils/bit_reader_utils.h
@@ -182,4 +182,4 @@ static WEBP_INLINE void VP8LFillBitWindow(VP8LBitReader* const br) {
} // extern "C"
#endif
-#endif /* WEBP_UTILS_BIT_READER_UTILS_H_ */
+#endif // WEBP_UTILS_BIT_READER_UTILS_H_
diff --git a/thirdparty/libwebp/src/utils/bit_writer_utils.h b/thirdparty/libwebp/src/utils/bit_writer_utils.h
index 2cf5976fe3..b9d5102a5a 100644
--- a/thirdparty/libwebp/src/utils/bit_writer_utils.h
+++ b/thirdparty/libwebp/src/utils/bit_writer_utils.h
@@ -151,4 +151,4 @@ static WEBP_INLINE void VP8LPutBits(VP8LBitWriter* const bw,
} // extern "C"
#endif
-#endif /* WEBP_UTILS_BIT_WRITER_UTILS_H_ */
+#endif // WEBP_UTILS_BIT_WRITER_UTILS_H_
diff --git a/thirdparty/libwebp/src/utils/filters_utils.h b/thirdparty/libwebp/src/utils/filters_utils.h
index 410f2fcdf2..61da66e212 100644
--- a/thirdparty/libwebp/src/utils/filters_utils.h
+++ b/thirdparty/libwebp/src/utils/filters_utils.h
@@ -29,4 +29,4 @@ WEBP_FILTER_TYPE WebPEstimateBestFilter(const uint8_t* data,
} // extern "C"
#endif
-#endif /* WEBP_UTILS_FILTERS_UTILS_H_ */
+#endif // WEBP_UTILS_FILTERS_UTILS_H_
diff --git a/thirdparty/libwebp/src/utils/quant_levels_dec_utils.c b/thirdparty/libwebp/src/utils/quant_levels_dec_utils.c
index 3818a78b93..f65b6cdbb6 100644
--- a/thirdparty/libwebp/src/utils/quant_levels_dec_utils.c
+++ b/thirdparty/libwebp/src/utils/quant_levels_dec_utils.c
@@ -261,9 +261,15 @@ static void CleanupParams(SmoothParams* const p) {
int WebPDequantizeLevels(uint8_t* const data, int width, int height, int stride,
int strength) {
- const int radius = 4 * strength / 100;
+ int radius = 4 * strength / 100;
+
if (strength < 0 || strength > 100) return 0;
if (data == NULL || width <= 0 || height <= 0) return 0; // bad params
+
+ // limit the filter size to not exceed the image dimensions
+ if (2 * radius + 1 > width) radius = (width - 1) >> 1;
+ if (2 * radius + 1 > height) radius = (height - 1) >> 1;
+
if (radius > 0) {
SmoothParams p;
memset(&p, 0, sizeof(p));
diff --git a/thirdparty/libwebp/src/utils/quant_levels_dec_utils.h b/thirdparty/libwebp/src/utils/quant_levels_dec_utils.h
index f822107a72..327f19f336 100644
--- a/thirdparty/libwebp/src/utils/quant_levels_dec_utils.h
+++ b/thirdparty/libwebp/src/utils/quant_levels_dec_utils.h
@@ -32,4 +32,4 @@ int WebPDequantizeLevels(uint8_t* const data, int width, int height, int stride,
} // extern "C"
#endif
-#endif /* WEBP_UTILS_QUANT_LEVELS_DEC_UTILS_H_ */
+#endif // WEBP_UTILS_QUANT_LEVELS_DEC_UTILS_H_
diff --git a/thirdparty/libwebp/src/utils/quant_levels_utils.h b/thirdparty/libwebp/src/utils/quant_levels_utils.h
index 75df2ba6a4..9ee3ea0075 100644
--- a/thirdparty/libwebp/src/utils/quant_levels_utils.h
+++ b/thirdparty/libwebp/src/utils/quant_levels_utils.h
@@ -33,4 +33,4 @@ int QuantizeLevels(uint8_t* const data, int width, int height, int num_levels,
} // extern "C"
#endif
-#endif /* WEBP_UTILS_QUANT_LEVELS_UTILS_H_ */
+#endif // WEBP_UTILS_QUANT_LEVELS_UTILS_H_
diff --git a/thirdparty/libwebp/src/utils/random_utils.h b/thirdparty/libwebp/src/utils/random_utils.h
index 6d36c667e7..a5006f84f7 100644
--- a/thirdparty/libwebp/src/utils/random_utils.h
+++ b/thirdparty/libwebp/src/utils/random_utils.h
@@ -60,4 +60,4 @@ static WEBP_INLINE int VP8RandomBits(VP8Random* const rg, int num_bits) {
} // extern "C"
#endif
-#endif /* WEBP_UTILS_RANDOM_UTILS_H_ */
+#endif // WEBP_UTILS_RANDOM_UTILS_H_
diff --git a/thirdparty/libwebp/src/utils/rescaler_utils.h b/thirdparty/libwebp/src/utils/rescaler_utils.h
index 8890e6fa13..ca41e42c4a 100644
--- a/thirdparty/libwebp/src/utils/rescaler_utils.h
+++ b/thirdparty/libwebp/src/utils/rescaler_utils.h
@@ -98,4 +98,4 @@ int WebPRescalerHasPendingOutput(const WebPRescaler* const rescaler) {
} // extern "C"
#endif
-#endif /* WEBP_UTILS_RESCALER_UTILS_H_ */
+#endif // WEBP_UTILS_RESCALER_UTILS_H_
diff --git a/thirdparty/libwebp/src/utils/thread_utils.h b/thirdparty/libwebp/src/utils/thread_utils.h
index c8ae6c9033..29ad49f74b 100644
--- a/thirdparty/libwebp/src/utils/thread_utils.h
+++ b/thirdparty/libwebp/src/utils/thread_utils.h
@@ -87,4 +87,4 @@ WEBP_EXTERN const WebPWorkerInterface* WebPGetWorkerInterface(void);
} // extern "C"
#endif
-#endif /* WEBP_UTILS_THREAD_UTILS_H_ */
+#endif // WEBP_UTILS_THREAD_UTILS_H_
diff --git a/thirdparty/libwebp/src/utils/utils.h b/thirdparty/libwebp/src/utils/utils.h
index 52921bf24e..da97b5d38f 100644
--- a/thirdparty/libwebp/src/utils/utils.h
+++ b/thirdparty/libwebp/src/utils/utils.h
@@ -175,4 +175,4 @@ WEBP_EXTERN int WebPGetColorPalette(const struct WebPPicture* const pic,
} // extern "C"
#endif
-#endif /* WEBP_UTILS_UTILS_H_ */
+#endif // WEBP_UTILS_UTILS_H_
diff --git a/thirdparty/libwebp/src/webp/decode.h b/thirdparty/libwebp/src/webp/decode.h
index 2165e96c95..95d31e7619 100644
--- a/thirdparty/libwebp/src/webp/decode.h
+++ b/thirdparty/libwebp/src/webp/decode.h
@@ -491,4 +491,4 @@ WEBP_EXTERN VP8StatusCode WebPDecode(const uint8_t* data, size_t data_size,
} // extern "C"
#endif
-#endif /* WEBP_WEBP_DECODE_H_ */
+#endif // WEBP_WEBP_DECODE_H_
diff --git a/thirdparty/libwebp/src/webp/demux.h b/thirdparty/libwebp/src/webp/demux.h
index 555d641338..846eeb15a9 100644
--- a/thirdparty/libwebp/src/webp/demux.h
+++ b/thirdparty/libwebp/src/webp/demux.h
@@ -360,4 +360,4 @@ WEBP_EXTERN void WebPAnimDecoderDelete(WebPAnimDecoder* dec);
} // extern "C"
#endif
-#endif /* WEBP_WEBP_DEMUX_H_ */
+#endif // WEBP_WEBP_DEMUX_H_
diff --git a/thirdparty/libwebp/src/webp/encode.h b/thirdparty/libwebp/src/webp/encode.h
index 7ec3543dc2..549cf07730 100644
--- a/thirdparty/libwebp/src/webp/encode.h
+++ b/thirdparty/libwebp/src/webp/encode.h
@@ -542,4 +542,4 @@ WEBP_EXTERN int WebPEncode(const WebPConfig* config, WebPPicture* picture);
} // extern "C"
#endif
-#endif /* WEBP_WEBP_ENCODE_H_ */
+#endif // WEBP_WEBP_ENCODE_H_
diff --git a/thirdparty/libwebp/src/webp/format_constants.h b/thirdparty/libwebp/src/webp/format_constants.h
index 329fc8a3b0..eca6981a47 100644
--- a/thirdparty/libwebp/src/webp/format_constants.h
+++ b/thirdparty/libwebp/src/webp/format_constants.h
@@ -84,4 +84,4 @@ typedef enum {
// overflow a uint32_t.
#define MAX_CHUNK_PAYLOAD (~0U - CHUNK_HEADER_SIZE - 1)
-#endif /* WEBP_WEBP_FORMAT_CONSTANTS_H_ */
+#endif // WEBP_WEBP_FORMAT_CONSTANTS_H_
diff --git a/thirdparty/libwebp/src/webp/mux.h b/thirdparty/libwebp/src/webp/mux.h
index 28bb4a41c9..66096a92e0 100644
--- a/thirdparty/libwebp/src/webp/mux.h
+++ b/thirdparty/libwebp/src/webp/mux.h
@@ -527,4 +527,4 @@ WEBP_EXTERN void WebPAnimEncoderDelete(WebPAnimEncoder* enc);
} // extern "C"
#endif
-#endif /* WEBP_WEBP_MUX_H_ */
+#endif // WEBP_WEBP_MUX_H_
diff --git a/thirdparty/libwebp/src/webp/mux_types.h b/thirdparty/libwebp/src/webp/mux_types.h
index b37e2c67aa..ceea77dfc6 100644
--- a/thirdparty/libwebp/src/webp/mux_types.h
+++ b/thirdparty/libwebp/src/webp/mux_types.h
@@ -95,4 +95,4 @@ static WEBP_INLINE int WebPDataCopy(const WebPData* src, WebPData* dst) {
} // extern "C"
#endif
-#endif /* WEBP_WEBP_MUX_TYPES_H_ */
+#endif // WEBP_WEBP_MUX_TYPES_H_
diff --git a/thirdparty/libwebp/src/webp/types.h b/thirdparty/libwebp/src/webp/types.h
index 989a763f0d..0ce2622e41 100644
--- a/thirdparty/libwebp/src/webp/types.h
+++ b/thirdparty/libwebp/src/webp/types.h
@@ -49,4 +49,4 @@ typedef long long int int64_t;
// Macro to check ABI compatibility (same major revision number)
#define WEBP_ABI_IS_INCOMPATIBLE(a, b) (((a) >> 8) != ((b) >> 8))
-#endif /* WEBP_WEBP_TYPES_H_ */
+#endif // WEBP_WEBP_TYPES_H_
diff --git a/thirdparty/mbedtls/include/mbedtls/config.h b/thirdparty/mbedtls/include/mbedtls/config.h
index 70820be56f..6daa8d103b 100644
--- a/thirdparty/mbedtls/include/mbedtls/config.h
+++ b/thirdparty/mbedtls/include/mbedtls/config.h
@@ -2389,20 +2389,6 @@
#define MBEDTLS_OID_C
/**
- * \def MBEDTLS_PADLOCK_C
- *
- * Enable VIA Padlock support on x86.
- *
- * Module: library/padlock.c
- * Caller: library/aes.c
- *
- * Requires: MBEDTLS_HAVE_ASM
- *
- * This modules adds support for the VIA PadLock on x86.
- */
-#define MBEDTLS_PADLOCK_C
-
-/**
* \def MBEDTLS_PEM_PARSE_C
*
* Enable PEM decoding / parsing.
diff --git a/thirdparty/misc/ifaddrs-android.cc b/thirdparty/misc/ifaddrs-android.cc
new file mode 100644
index 0000000000..1f8835b829
--- /dev/null
+++ b/thirdparty/misc/ifaddrs-android.cc
@@ -0,0 +1,221 @@
+/*
+ * libjingle
+ * Copyright 2012, Google Inc.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "ifaddrs-android.h"
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/utsname.h>
+#include <sys/ioctl.h>
+#include <netinet/in.h>
+#include <net/if.h>
+#include <unistd.h>
+#include <errno.h>
+#include <linux/netlink.h>
+#include <linux/rtnetlink.h>
+struct netlinkrequest {
+ nlmsghdr header;
+ ifaddrmsg msg;
+};
+namespace {
+const int kMaxReadSize = 4096;
+};
+int set_ifname(struct ifaddrs* ifaddr, int interface) {
+ char buf[IFNAMSIZ] = {0};
+ char* name = if_indextoname(interface, buf);
+ if (name == NULL) {
+ return -1;
+ }
+ ifaddr->ifa_name = new char[strlen(name) + 1];
+ strncpy(ifaddr->ifa_name, name, strlen(name) + 1);
+ return 0;
+}
+int set_flags(struct ifaddrs* ifaddr) {
+ int fd = socket(AF_INET, SOCK_DGRAM, 0);
+ if (fd == -1) {
+ return -1;
+ }
+ ifreq ifr;
+ memset(&ifr, 0, sizeof(ifr));
+ strncpy(ifr.ifr_name, ifaddr->ifa_name, IFNAMSIZ - 1);
+ int rc = ioctl(fd, SIOCGIFFLAGS, &ifr);
+ close(fd);
+ if (rc == -1) {
+ return -1;
+ }
+ ifaddr->ifa_flags = ifr.ifr_flags;
+ return 0;
+}
+int set_addresses(struct ifaddrs* ifaddr, ifaddrmsg* msg, void* data,
+ size_t len) {
+ if (msg->ifa_family == AF_INET) {
+ sockaddr_in* sa = new sockaddr_in;
+ sa->sin_family = AF_INET;
+ memcpy(&sa->sin_addr, data, len);
+ ifaddr->ifa_addr = reinterpret_cast<sockaddr*>(sa);
+ } else if (msg->ifa_family == AF_INET6) {
+ sockaddr_in6* sa = new sockaddr_in6;
+ sa->sin6_family = AF_INET6;
+ sa->sin6_scope_id = msg->ifa_index;
+ memcpy(&sa->sin6_addr, data, len);
+ ifaddr->ifa_addr = reinterpret_cast<sockaddr*>(sa);
+ } else {
+ return -1;
+ }
+ return 0;
+}
+int make_prefixes(struct ifaddrs* ifaddr, int family, int prefixlen) {
+ char* prefix = NULL;
+ if (family == AF_INET) {
+ sockaddr_in* mask = new sockaddr_in;
+ mask->sin_family = AF_INET;
+ memset(&mask->sin_addr, 0, sizeof(in_addr));
+ ifaddr->ifa_netmask = reinterpret_cast<sockaddr*>(mask);
+ if (prefixlen > 32) {
+ prefixlen = 32;
+ }
+ prefix = reinterpret_cast<char*>(&mask->sin_addr);
+ } else if (family == AF_INET6) {
+ sockaddr_in6* mask = new sockaddr_in6;
+ mask->sin6_family = AF_INET6;
+ memset(&mask->sin6_addr, 0, sizeof(in6_addr));
+ ifaddr->ifa_netmask = reinterpret_cast<sockaddr*>(mask);
+ if (prefixlen > 128) {
+ prefixlen = 128;
+ }
+ prefix = reinterpret_cast<char*>(&mask->sin6_addr);
+ } else {
+ return -1;
+ }
+ for (int i = 0; i < (prefixlen / 8); i++) {
+ *prefix++ = 0xFF;
+ }
+ char remainder = 0xff;
+ remainder <<= (8 - prefixlen % 8);
+ *prefix = remainder;
+ return 0;
+}
+int populate_ifaddrs(struct ifaddrs* ifaddr, ifaddrmsg* msg, void* bytes,
+ size_t len) {
+ if (set_ifname(ifaddr, msg->ifa_index) != 0) {
+ return -1;
+ }
+ if (set_flags(ifaddr) != 0) {
+ return -1;
+ }
+ if (set_addresses(ifaddr, msg, bytes, len) != 0) {
+ return -1;
+ }
+ if (make_prefixes(ifaddr, msg->ifa_family, msg->ifa_prefixlen) != 0) {
+ return -1;
+ }
+ return 0;
+}
+int getifaddrs(struct ifaddrs** result) {
+ int fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
+ if (fd < 0) {
+ return -1;
+ }
+ netlinkrequest ifaddr_request;
+ memset(&ifaddr_request, 0, sizeof(ifaddr_request));
+ ifaddr_request.header.nlmsg_flags = NLM_F_ROOT | NLM_F_REQUEST;
+ ifaddr_request.header.nlmsg_type = RTM_GETADDR;
+ ifaddr_request.header.nlmsg_len = NLMSG_LENGTH(sizeof(ifaddrmsg));
+ ssize_t count = send(fd, &ifaddr_request, ifaddr_request.header.nlmsg_len, 0);
+ if (static_cast<size_t>(count) != ifaddr_request.header.nlmsg_len) {
+ close(fd);
+ return -1;
+ }
+ struct ifaddrs* start = NULL;
+ struct ifaddrs* current = NULL;
+ char buf[kMaxReadSize];
+ ssize_t amount_read = recv(fd, &buf, kMaxReadSize, 0);
+ while (amount_read > 0) {
+ nlmsghdr* header = reinterpret_cast<nlmsghdr*>(&buf[0]);
+ size_t header_size = static_cast<size_t>(amount_read);
+ for ( ; NLMSG_OK(header, header_size);
+ header = NLMSG_NEXT(header, header_size)) {
+ switch (header->nlmsg_type) {
+ case NLMSG_DONE:
+ // Success. Return.
+ *result = start;
+ close(fd);
+ return 0;
+ case NLMSG_ERROR:
+ close(fd);
+ freeifaddrs(start);
+ return -1;
+ case RTM_NEWADDR: {
+ ifaddrmsg* address_msg =
+ reinterpret_cast<ifaddrmsg*>(NLMSG_DATA(header));
+ rtattr* rta = IFA_RTA(address_msg);
+ ssize_t payload_len = IFA_PAYLOAD(header);
+ while (RTA_OK(rta, payload_len)) {
+ if (rta->rta_type == IFA_ADDRESS) {
+ int family = address_msg->ifa_family;
+ if (family == AF_INET || family == AF_INET6) {
+ ifaddrs* newest = new ifaddrs;
+ memset(newest, 0, sizeof(ifaddrs));
+ if (current) {
+ current->ifa_next = newest;
+ } else {
+ start = newest;
+ }
+ if (populate_ifaddrs(newest, address_msg, RTA_DATA(rta),
+ RTA_PAYLOAD(rta)) != 0) {
+ freeifaddrs(start);
+ *result = NULL;
+ return -1;
+ }
+ current = newest;
+ }
+ }
+ rta = RTA_NEXT(rta, payload_len);
+ }
+ break;
+ }
+ }
+ }
+ amount_read = recv(fd, &buf, kMaxReadSize, 0);
+ }
+ close(fd);
+ freeifaddrs(start);
+ return -1;
+}
+void freeifaddrs(struct ifaddrs* addrs) {
+ struct ifaddrs* last = NULL;
+ struct ifaddrs* cursor = addrs;
+ while (cursor) {
+ delete[] cursor->ifa_name;
+ delete cursor->ifa_addr;
+ delete cursor->ifa_netmask;
+ last = cursor;
+ cursor = cursor->ifa_next;
+ delete last;
+ }
+}
diff --git a/platform/android/ifaddrs_android.h b/thirdparty/misc/ifaddrs-android.h
index 539fa40455..6e204af26f 100644
--- a/platform/android/ifaddrs_android.h
+++ b/thirdparty/misc/ifaddrs-android.h
@@ -33,13 +33,13 @@
// about every network interface available on the host.
// See 'man getifaddrs' on Linux or OS X (nb: it is not a POSIX function).
struct ifaddrs {
- struct ifaddrs* ifa_next;
- char* ifa_name;
- unsigned int ifa_flags;
- struct sockaddr* ifa_addr;
- struct sockaddr* ifa_netmask;
- // Real ifaddrs has broadcast, point to point and data members.
- // We don't need them (yet?).
+ struct ifaddrs* ifa_next;
+ char* ifa_name;
+ unsigned int ifa_flags;
+ struct sockaddr* ifa_addr;
+ struct sockaddr* ifa_netmask;
+ // Real ifaddrs has broadcast, point to point and data members.
+ // We don't need them (yet?).
};
int getifaddrs(struct ifaddrs** result);
void freeifaddrs(struct ifaddrs* addrs);
diff --git a/thirdparty/squish/Add-Decompress-Bc5-to-Squish.patch b/thirdparty/squish/Add-Decompress-Bc5-to-Squish.patch
deleted file mode 100644
index 1e06a8d318..0000000000
--- a/thirdparty/squish/Add-Decompress-Bc5-to-Squish.patch
+++ /dev/null
@@ -1,143 +0,0 @@
-From 7b64cc4c8b0be0443741483bf65909f5140179c0 Mon Sep 17 00:00:00 2001
-From: Orkun <orkuntezerm@gmail.com>
-Date: Sun, 19 Nov 2017 02:24:31 +0300
-Subject: [PATCH] Fix #12220: Add Decompress Bc5 to Squish
-
-This Commit fixes the corrupted file preview described in #12220.
-Added DecompressColourBc5 function to squish.
----
- thirdparty/squish/colourblock.cpp | 85 +++++++++++++++++++++++++++++++++++++++
- thirdparty/squish/colourblock.h | 3 ++
- thirdparty/squish/squish.cpp | 8 +++-
- 3 files changed, 95 insertions(+), 1 deletion(-)
-
-diff --git a/thirdparty/squish/colourblock.cpp b/thirdparty/squish/colourblock.cpp
-index af8b98036..3de46382c 100644
---- a/thirdparty/squish/colourblock.cpp
-+++ b/thirdparty/squish/colourblock.cpp
-@@ -211,4 +211,89 @@ void DecompressColour( u8* rgba, void const* block, bool isDxt1 )
- }
- }
-
-+// -- Godot start --
-+void DecompressColourBc5( u8* rgba, void const* block)
-+{
-+ // get the block bytes
-+ u8 const* bytes = reinterpret_cast< u8 const* >( block );
-+
-+ // unpack the endpoints
-+ u8 codes[16];
-+ int red_0 = bytes[0];
-+ int red_1 = bytes[1];
-+
-+ codes[0] = red_0;
-+ codes[1] = red_1;
-+ codes[6] = 0.0f;
-+ codes[7] = 1.0f;
-+ // generate the midpoints
-+ if(red_0 > red_1)
-+ {
-+ for( int i = 2; i < 8; ++i )
-+ {
-+ codes[i] = ((8-i)*red_0 + (i-1)*red_1)/7;
-+ }
-+ }
-+ else
-+ {
-+ for( int i = 2; i < 6; ++i )
-+ {
-+ codes[i] = ((6-i)*red_0 + (i-1)*red_1)/5;
-+ }
-+ }
-+
-+ int green_0 = bytes[8];
-+ int green_1 = bytes[9];
-+
-+ codes[0 + 8] = green_0;
-+ codes[1 + 8] = green_1;
-+ codes[6 + 8] = 0.0f;
-+ codes[7 + 8] = 1.0f;
-+ // generate the midpoints
-+ if(green_0 > green_1)
-+ {
-+ for( int i = 2; i < 8; ++i )
-+ {
-+ codes[i + 8] = ((8-i)*green_0 + (i-1)*green_1)/7;
-+ }
-+ }
-+ else
-+ {
-+ for( int i = 2; i < 6; ++i )
-+ {
-+ codes[i + 8] = ((6-i)*green_0 + (i-1)*green_1)/5;
-+ }
-+ }
-+
-+ u8 indices[32];
-+ for( int i = 0; i < 4; ++i )
-+ {
-+ u8 packed = bytes[2 + i];
-+ u8* red_ind = indices + 4*i;
-+
-+ red_ind[0] = packed & 0x3;
-+ red_ind[1] = ( packed >> 2 ) & 0x3;
-+ red_ind[2] = ( packed >> 4 ) & 0x3;
-+ red_ind[3] = ( packed >> 6 ) & 0x3;
-+
-+ packed = bytes[8 + i];
-+ u8* green_ind = indices + 4*i + 16;
-+ green_ind[0] = packed & 0x3;
-+ green_ind[1] = ( packed >> 2 ) & 0x3;
-+ green_ind[2] = ( packed >> 4 ) & 0x3;
-+ green_ind[3] = ( packed >> 6 ) & 0x3;
-+ }
-+
-+ // store out the colours
-+ for( int i = 0; i < 16; ++i )
-+ {
-+ rgba[4*i] = codes[indices[i]];
-+ rgba[4*i +1] = codes[indices[i + 16] + 8];
-+ rgba[4*i +2] = 0;
-+ rgba[4*i +3] = 255;
-+ }
-+}
-+// -- GODOT end --
-+
-+
- } // namespace squish
-diff --git a/thirdparty/squish/colourblock.h b/thirdparty/squish/colourblock.h
-index fee2cd7c5..3cb9b7e3b 100644
---- a/thirdparty/squish/colourblock.h
-+++ b/thirdparty/squish/colourblock.h
-@@ -35,6 +35,9 @@ void WriteColourBlock3( Vec3::Arg start, Vec3::Arg end, u8 const* indices, void*
- void WriteColourBlock4( Vec3::Arg start, Vec3::Arg end, u8 const* indices, void* block );
-
- void DecompressColour( u8* rgba, void const* block, bool isDxt1 );
-+// -- GODOT start --
-+void DecompressColourBc5( u8* rgba, void const* block );
-+// -- GODOT end --
-
- } // namespace squish
-
-diff --git a/thirdparty/squish/squish.cpp b/thirdparty/squish/squish.cpp
-index 1d22a64ad..fd11a147d 100644
---- a/thirdparty/squish/squish.cpp
-+++ b/thirdparty/squish/squish.cpp
-@@ -135,7 +135,13 @@ void Decompress( u8* rgba, void const* block, int flags )
- colourBlock = reinterpret_cast< u8 const* >( block ) + 8;
-
- // decompress colour
-- DecompressColour( rgba, colourBlock, ( flags & kDxt1 ) != 0 );
-+ // -- GODOT start --
-+ //DecompressColour( rgba, colourBlock, ( flags & kDxt1 ) != 0 );
-+ if(( flags & ( kBc5 ) ) != 0)
-+ DecompressColourBc5( rgba, colourBlock);
-+ else
-+ DecompressColour( rgba, colourBlock, ( flags & kDxt1 ) != 0 );
-+ // -- GODOT end --
-
- // decompress alpha separately if necessary
- if( ( flags & kDxt3 ) != 0 )
---
-2.13.6
-
diff --git a/thirdparty/squish/colourblock.cpp b/thirdparty/squish/colourblock.cpp
index 3de46382c0..3d87adaa77 100644
--- a/thirdparty/squish/colourblock.cpp
+++ b/thirdparty/squish/colourblock.cpp
@@ -24,6 +24,9 @@
-------------------------------------------------------------------------- */
#include "colourblock.h"
+// -- Godot start --
+#include "alpha.h"
+// -- Godot end --
namespace squish {
@@ -214,83 +217,17 @@ void DecompressColour( u8* rgba, void const* block, bool isDxt1 )
// -- Godot start --
void DecompressColourBc5( u8* rgba, void const* block)
{
- // get the block bytes
- u8 const* bytes = reinterpret_cast< u8 const* >( block );
-
- // unpack the endpoints
- u8 codes[16];
- int red_0 = bytes[0];
- int red_1 = bytes[1];
-
- codes[0] = red_0;
- codes[1] = red_1;
- codes[6] = 0.0f;
- codes[7] = 1.0f;
- // generate the midpoints
- if(red_0 > red_1)
- {
- for( int i = 2; i < 8; ++i )
- {
- codes[i] = ((8-i)*red_0 + (i-1)*red_1)/7;
- }
- }
- else
- {
- for( int i = 2; i < 6; ++i )
- {
- codes[i] = ((6-i)*red_0 + (i-1)*red_1)/5;
- }
- }
-
- int green_0 = bytes[8];
- int green_1 = bytes[9];
-
- codes[0 + 8] = green_0;
- codes[1 + 8] = green_1;
- codes[6 + 8] = 0.0f;
- codes[7 + 8] = 1.0f;
- // generate the midpoints
- if(green_0 > green_1)
- {
- for( int i = 2; i < 8; ++i )
- {
- codes[i + 8] = ((8-i)*green_0 + (i-1)*green_1)/7;
- }
- }
- else
- {
- for( int i = 2; i < 6; ++i )
- {
- codes[i + 8] = ((6-i)*green_0 + (i-1)*green_1)/5;
- }
- }
-
- u8 indices[32];
- for( int i = 0; i < 4; ++i )
- {
- u8 packed = bytes[2 + i];
- u8* red_ind = indices + 4*i;
-
- red_ind[0] = packed & 0x3;
- red_ind[1] = ( packed >> 2 ) & 0x3;
- red_ind[2] = ( packed >> 4 ) & 0x3;
- red_ind[3] = ( packed >> 6 ) & 0x3;
-
- packed = bytes[8 + i];
- u8* green_ind = indices + 4*i + 16;
- green_ind[0] = packed & 0x3;
- green_ind[1] = ( packed >> 2 ) & 0x3;
- green_ind[2] = ( packed >> 4 ) & 0x3;
- green_ind[3] = ( packed >> 6 ) & 0x3;
+ void const* rblock = block;
+ void const* gblock = reinterpret_cast< u8 const* >( block ) + 8;
+ DecompressAlphaDxt5(rgba,rblock);
+ for ( int i = 0; i < 16; ++i ) {
+ rgba[i*4] = rgba[i*4 + 3];
}
-
- // store out the colours
- for( int i = 0; i < 16; ++i )
- {
- rgba[4*i] = codes[indices[i]];
- rgba[4*i +1] = codes[indices[i + 16] + 8];
- rgba[4*i +2] = 0;
- rgba[4*i +3] = 255;
+ DecompressAlphaDxt5(rgba,gblock);
+ for ( int i = 0; i < 16; ++i ) {
+ rgba[i*4+1] = rgba[i*4 + 3];
+ rgba[i*4 + 2] = 0;
+ rgba[i*4 + 3] = 255;
}
}
// -- GODOT end --
diff --git a/thirdparty/squish/godot-changes.patch b/thirdparty/squish/godot-changes.patch
new file mode 100644
index 0000000000..ef7bafb4b4
--- /dev/null
+++ b/thirdparty/squish/godot-changes.patch
@@ -0,0 +1,102 @@
+diff --git a/thirdparty/squish/colourblock.cpp b/thirdparty/squish/colourblock.cpp
+index af8b98036..3d87adaa7 100644
+--- a/thirdparty/squish/colourblock.cpp
++++ b/thirdparty/squish/colourblock.cpp
+@@ -24,6 +24,9 @@
+ -------------------------------------------------------------------------- */
+
+ #include "colourblock.h"
++// -- Godot start --
++#include "alpha.h"
++// -- Godot end --
+
+ namespace squish {
+
+@@ -211,4 +214,23 @@ void DecompressColour( u8* rgba, void const* block, bool isDxt1 )
+ }
+ }
+
++// -- Godot start --
++void DecompressColourBc5( u8* rgba, void const* block)
++{
++ void const* rblock = block;
++ void const* gblock = reinterpret_cast< u8 const* >( block ) + 8;
++ DecompressAlphaDxt5(rgba,rblock);
++ for ( int i = 0; i < 16; ++i ) {
++ rgba[i*4] = rgba[i*4 + 3];
++ }
++ DecompressAlphaDxt5(rgba,gblock);
++ for ( int i = 0; i < 16; ++i ) {
++ rgba[i*4+1] = rgba[i*4 + 3];
++ rgba[i*4 + 2] = 0;
++ rgba[i*4 + 3] = 255;
++ }
++}
++// -- GODOT end --
++
++
+ } // namespace squish
+diff --git a/thirdparty/squish/colourblock.h b/thirdparty/squish/colourblock.h
+index fee2cd7c5..3cb9b7e3b 100644
+--- a/thirdparty/squish/colourblock.h
++++ b/thirdparty/squish/colourblock.h
+@@ -35,6 +35,9 @@ void WriteColourBlock3( Vec3::Arg start, Vec3::Arg end, u8 const* indices, void*
+ void WriteColourBlock4( Vec3::Arg start, Vec3::Arg end, u8 const* indices, void* block );
+
+ void DecompressColour( u8* rgba, void const* block, bool isDxt1 );
++// -- GODOT start --
++void DecompressColourBc5( u8* rgba, void const* block );
++// -- GODOT end --
+
+ } // namespace squish
+
+diff --git a/thirdparty/squish/config.h b/thirdparty/squish/config.h
+index 92edefe96..05f8d7259 100644
+--- a/thirdparty/squish/config.h
++++ b/thirdparty/squish/config.h
+@@ -32,6 +32,26 @@
+ #endif
+
+ // Set to 1 or 2 when building squish to use SSE or SSE2 instructions.
++// -- GODOT start --
++#ifdef _MSC_VER
++ #if defined(_M_IX86_FP)
++ #if _M_IX86_FP >= 2
++ #define SQUISH_USE_SSE 2
++ #elif _M_IX86_FP >= 1
++ #define SQUISH_USE_SSE 1
++ #endif
++ #elif defined(_M_X64)
++ #define SQUISH_USE_SSE 2
++ #endif
++#else
++ #if defined(__SSE2__)
++ #define SQUISH_USE_SSE 2
++ #elif defined(__SSE__)
++ #define SQUISH_USE_SSE 1
++ #endif
++#endif
++// -- GODOT end --
++
+ #ifndef SQUISH_USE_SSE
+ #define SQUISH_USE_SSE 0
+ #endif
+diff --git a/thirdparty/squish/squish.cpp b/thirdparty/squish/squish.cpp
+index 1d22a64ad..fd11a147d 100644
+--- a/thirdparty/squish/squish.cpp
++++ b/thirdparty/squish/squish.cpp
+@@ -135,7 +135,13 @@ void Decompress( u8* rgba, void const* block, int flags )
+ colourBlock = reinterpret_cast< u8 const* >( block ) + 8;
+
+ // decompress colour
+- DecompressColour( rgba, colourBlock, ( flags & kDxt1 ) != 0 );
++ // -- GODOT start --
++ //DecompressColour( rgba, colourBlock, ( flags & kDxt1 ) != 0 );
++ if(( flags & ( kBc5 ) ) != 0)
++ DecompressColourBc5( rgba, colourBlock);
++ else
++ DecompressColour( rgba, colourBlock, ( flags & kDxt1 ) != 0 );
++ // -- GODOT end --
+
+ // decompress alpha separately if necessary
+ if( ( flags & kDxt3 ) != 0 )
diff --git a/thirdparty/tinyexr/tinyexr.h b/thirdparty/tinyexr/tinyexr.h
index 990c8ee142..b3a7ee00c2 100644
--- a/thirdparty/tinyexr/tinyexr.h
+++ b/thirdparty/tinyexr/tinyexr.h
@@ -116,6 +116,8 @@ extern "C" {
#define TINYEXR_ERROR_UNSUPPORTED_FORMAT (-7)
#define TINYEXR_ERROR_INVALID_HEADER (-8)
#define TINYEXR_ERROR_UNSUPPORTED_FEATURE (-9)
+#define TINYEXR_ERROR_CANT_WRITE_FILE (-10)
+#define TINYEXR_ERROR_SERIALZATION_FAILED (-11)
// @note { OpenEXR file format: http://www.openexr.com/openexrfilelayout.pdf }
@@ -279,9 +281,12 @@ extern int LoadEXR(float **out_rgba, int *width, int *height,
// Save image as fp16(HALF) format when `save_as_fp16` is positive non-zero
// value.
// Save image as fp32(FLOAT) format when `save_as_fp16` is 0.
+// Use ZIP compression by default.
+// Returns negative value and may set error string in `err` when there's an
+// error
extern int SaveEXR(const float *data, const int width, const int height,
const int components, const int save_as_fp16,
- const char *filename);
+ const char *filename, const char **err);
// Initialize EXRHeader struct
extern void InitEXRHeader(EXRHeader *exr_header);
@@ -400,9 +405,9 @@ extern int SaveEXRImageToFile(const EXRImage *image,
// Saves multi-channel, single-frame OpenEXR image to a memory.
// Image is compressed using EXRImage.compression value.
-// Return the number of bytes if succes.
-// Returns negative value and may set error string in `err` when there's an
-// error
+// Return the number of bytes if success.
+// Return zero and will set error string in `err` when there's an
+// error.
// When there was an error message, Application must free `err` with
// FreeEXRErrorMessage()
extern size_t SaveEXRImageToMemory(const EXRImage *image,
@@ -524,15 +529,23 @@ namespace miniz {
#if __has_warning("-Wcomma")
#pragma clang diagnostic ignored "-Wcomma"
#endif
+
#if __has_warning("-Wmacro-redefined")
#pragma clang diagnostic ignored "-Wmacro-redefined"
#endif
+
#if __has_warning("-Wcast-qual")
#pragma clang diagnostic ignored "-Wcast-qual"
#endif
+
#if __has_warning("-Wzero-as-null-pointer-constant")
#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
#endif
+
+#if __has_warning("-Wtautological-constant-compare")
+#pragma clang diagnostic ignored "-Wtautological-constant-compare"
+#endif
+
#endif
/* miniz.c v1.15 - public domain deflate/inflate, zlib-subset, ZIP
@@ -2518,10 +2531,10 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r,
tinfl_status status = TINFL_STATUS_FAILED;
mz_uint32 num_bits, dist, counter, num_extra;
tinfl_bit_buf_t bit_buf;
- const mz_uint8 *pIn_buf_cur = pIn_buf_next, *const pIn_buf_end =
- pIn_buf_next + *pIn_buf_size;
- mz_uint8 *pOut_buf_cur = pOut_buf_next, *const pOut_buf_end =
- pOut_buf_next + *pOut_buf_size;
+ const mz_uint8 *pIn_buf_cur = pIn_buf_next,
+ *const pIn_buf_end = pIn_buf_next + *pIn_buf_size;
+ mz_uint8 *pOut_buf_cur = pOut_buf_next,
+ *const pOut_buf_end = pOut_buf_next + *pOut_buf_size;
size_t out_buf_size_mask =
(decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)
? (size_t)-1
@@ -2938,9 +2951,8 @@ void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len,
tinfl_status status = tinfl_decompress(
&decomp, (const mz_uint8 *)pSrc_buf + src_buf_ofs, &src_buf_size,
(mz_uint8 *)pBuf, pBuf ? (mz_uint8 *)pBuf + *pOut_len : NULL,
- &dst_buf_size,
- (flags & ~TINFL_FLAG_HAS_MORE_INPUT) |
- TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF);
+ &dst_buf_size, (flags & ~TINFL_FLAG_HAS_MORE_INPUT) |
+ TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF);
if ((status < 0) || (status == TINFL_STATUS_NEEDS_MORE_INPUT)) {
MZ_FREE(pBuf);
*pOut_len = 0;
@@ -2993,8 +3005,9 @@ int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size,
tinfl_status status =
tinfl_decompress(&decomp, (const mz_uint8 *)pIn_buf + in_buf_ofs,
&in_buf_size, pDict, pDict + dict_ofs, &dst_buf_size,
- (flags & ~(TINFL_FLAG_HAS_MORE_INPUT |
- TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)));
+ (flags &
+ ~(TINFL_FLAG_HAS_MORE_INPUT |
+ TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)));
in_buf_ofs += in_buf_size;
if ((dst_buf_size) &&
(!(*pPut_buf_func)(pDict + dict_ofs, (int)dst_buf_size, pPut_buf_user)))
@@ -3119,9 +3132,7 @@ static const mz_uint8 s_tdefl_large_dist_extra[128] = {
// Radix sorts tdefl_sym_freq[] array by 16-bit key m_key. Returns ptr to sorted
// values.
-typedef struct {
- mz_uint16 m_key, m_sym_index;
-} tdefl_sym_freq;
+typedef struct { mz_uint16 m_key, m_sym_index; } tdefl_sym_freq;
static tdefl_sym_freq *tdefl_radix_sort_syms(mz_uint num_syms,
tdefl_sym_freq *pSyms0,
tdefl_sym_freq *pSyms1) {
@@ -5265,10 +5276,9 @@ mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index,
n = MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS);
n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE - 1);
pStat->m_comment_size = n;
- memcpy(pStat->m_comment,
- p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE +
- MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) +
- MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS),
+ memcpy(pStat->m_comment, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE +
+ MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) +
+ MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS),
n);
pStat->m_comment[n] = '\0';
@@ -10087,9 +10097,10 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
unsigned short *outLine =
reinterpret_cast<unsigned short *>(out_images[c]);
if (line_order == 0) {
- outLine += (y + v) * x_stride;
+ outLine += (size_t(y) + v) * size_t(x_stride);
} else {
- outLine += (height - 1 - (y + v)) * x_stride;
+ outLine +=
+ (size_t(height) - 1 - (size_t(y) + v)) * size_t(x_stride);
}
for (int u = 0; u < width; u++) {
@@ -10105,9 +10116,10 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
} else if (requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT) {
float *outLine = reinterpret_cast<float *>(out_images[c]);
if (line_order == 0) {
- outLine += (y + v) * x_stride;
+ outLine += (size_t(y) + v) * size_t(x_stride);
} else {
- outLine += (height - 1 - (y + v)) * x_stride;
+ outLine +=
+ (size_t(height) - 1 - (size_t(y) + v)) * size_t(x_stride);
}
if (reinterpret_cast<const unsigned char *>(line_ptr + width) >
@@ -10140,9 +10152,10 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
float *outLine = reinterpret_cast<float *>(out_images[c]);
if (line_order == 0) {
- outLine += (y + v) * x_stride;
+ outLine += (size_t(y) + v) * size_t(x_stride);
} else {
- outLine += (height - 1 - (y + v)) * x_stride;
+ outLine +=
+ (size_t(height) - 1 - (size_t(y) + v)) * size_t(x_stride);
}
if (reinterpret_cast<const unsigned char *>(line_ptr + width) >
@@ -10167,9 +10180,10 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
unsigned int *outLine =
reinterpret_cast<unsigned int *>(out_images[c]);
if (line_order == 0) {
- outLine += (y + v) * x_stride;
+ outLine += (size_t(y) + v) * size_t(x_stride);
} else {
- outLine += (height - 1 - (y + v)) * x_stride;
+ outLine +=
+ (size_t(height) - 1 - (size_t(y) + v)) * size_t(x_stride);
}
for (int u = 0; u < width; u++) {
@@ -11133,21 +11147,53 @@ int LoadEXR(float **out_rgba, int *width, int *height, const char *filename,
}
}
- if ((idxA == 0) && (idxR == -1) && (idxG == -1) && (idxB == -1)) {
- // Alpha channel only.
+ if (exr_header.num_channels == 1) {
+ // Grayscale channel only.
- if (exr_header.tiled) {
- // todo.implement this
- }
(*out_rgba) = reinterpret_cast<float *>(
malloc(4 * sizeof(float) * static_cast<size_t>(exr_image.width) *
static_cast<size_t>(exr_image.height)));
- for (int i = 0; i < exr_image.width * exr_image.height; i++) {
- const float val = reinterpret_cast<float **>(exr_image.images)[0][i];
- (*out_rgba)[4 * i + 0] = val;
- (*out_rgba)[4 * i + 1] = val;
- (*out_rgba)[4 * i + 2] = val;
- (*out_rgba)[4 * i + 3] = val;
+
+ if (exr_header.tiled) {
+ // todo.implement this
+
+ for (int it = 0; it < exr_image.num_tiles; it++) {
+ for (int j = 0; j < exr_header.tile_size_y; j++) {
+ for (int i = 0; i < exr_header.tile_size_x; i++) {
+ const int ii =
+ exr_image.tiles[it].offset_x * exr_header.tile_size_x + i;
+ const int jj =
+ exr_image.tiles[it].offset_y * exr_header.tile_size_y + j;
+ const int idx = ii + jj * exr_image.width;
+
+ // out of region check.
+ if (ii >= exr_image.width) {
+ continue;
+ }
+ if (jj >= exr_image.height) {
+ continue;
+ }
+ const int srcIdx = i + j * exr_header.tile_size_x;
+ unsigned char **src = exr_image.tiles[it].images;
+ (*out_rgba)[4 * idx + 0] =
+ reinterpret_cast<float **>(src)[0][srcIdx];
+ (*out_rgba)[4 * idx + 1] =
+ reinterpret_cast<float **>(src)[0][srcIdx];
+ (*out_rgba)[4 * idx + 2] =
+ reinterpret_cast<float **>(src)[0][srcIdx];
+ (*out_rgba)[4 * idx + 3] =
+ reinterpret_cast<float **>(src)[0][srcIdx];
+ }
+ }
+ }
+ } else {
+ for (int i = 0; i < exr_image.width * exr_image.height; i++) {
+ const float val = reinterpret_cast<float **>(exr_image.images)[0][i];
+ (*out_rgba)[4 * i + 0] = val;
+ (*out_rgba)[4 * i + 1] = val;
+ (*out_rgba)[4 * i + 2] = val;
+ (*out_rgba)[4 * i + 3] = val;
+ }
}
} else {
// Assume RGB(A)
@@ -11179,7 +11225,7 @@ int LoadEXR(float **out_rgba, int *width, int *height, const char *filename,
static_cast<size_t>(exr_image.height)));
if (exr_header.tiled) {
for (int it = 0; it < exr_image.num_tiles; it++) {
- for (int j = 0; j < exr_header.tile_size_y; j++)
+ for (int j = 0; j < exr_header.tile_size_y; j++) {
for (int i = 0; i < exr_header.tile_size_x; i++) {
const int ii =
exr_image.tiles[it].offset_x * exr_header.tile_size_x + i;
@@ -11209,6 +11255,7 @@ int LoadEXR(float **out_rgba, int *width, int *height, const char *filename,
(*out_rgba)[4 * idx + 3] = 1.0;
}
}
+ }
}
} else {
for (int i = 0; i < exr_image.width * exr_image.height; i++) {
@@ -11356,18 +11403,53 @@ int LoadEXRFromMemory(float **out_rgba, int *width, int *height,
malloc(4 * sizeof(float) * static_cast<size_t>(exr_image.width) *
static_cast<size_t>(exr_image.height)));
- for (int i = 0; i < exr_image.width * exr_image.height; i++) {
- (*out_rgba)[4 * i + 0] =
- reinterpret_cast<float **>(exr_image.images)[idxR][i];
- (*out_rgba)[4 * i + 1] =
- reinterpret_cast<float **>(exr_image.images)[idxG][i];
- (*out_rgba)[4 * i + 2] =
- reinterpret_cast<float **>(exr_image.images)[idxB][i];
- if (idxA != -1) {
- (*out_rgba)[4 * i + 3] =
- reinterpret_cast<float **>(exr_image.images)[idxA][i];
- } else {
- (*out_rgba)[4 * i + 3] = 1.0;
+ if (exr_header.tiled) {
+ for (int it = 0; it < exr_image.num_tiles; it++) {
+ for (int j = 0; j < exr_header.tile_size_y; j++)
+ for (int i = 0; i < exr_header.tile_size_x; i++) {
+ const int ii =
+ exr_image.tiles[it].offset_x * exr_header.tile_size_x + i;
+ const int jj =
+ exr_image.tiles[it].offset_y * exr_header.tile_size_y + j;
+ const int idx = ii + jj * exr_image.width;
+
+ // out of region check.
+ if (ii >= exr_image.width) {
+ continue;
+ }
+ if (jj >= exr_image.height) {
+ continue;
+ }
+ const int srcIdx = i + j * exr_header.tile_size_x;
+ unsigned char **src = exr_image.tiles[it].images;
+ (*out_rgba)[4 * idx + 0] =
+ reinterpret_cast<float **>(src)[idxR][srcIdx];
+ (*out_rgba)[4 * idx + 1] =
+ reinterpret_cast<float **>(src)[idxG][srcIdx];
+ (*out_rgba)[4 * idx + 2] =
+ reinterpret_cast<float **>(src)[idxB][srcIdx];
+ if (idxA != -1) {
+ (*out_rgba)[4 * idx + 3] =
+ reinterpret_cast<float **>(src)[idxA][srcIdx];
+ } else {
+ (*out_rgba)[4 * idx + 3] = 1.0;
+ }
+ }
+ }
+ } else {
+ for (int i = 0; i < exr_image.width * exr_image.height; i++) {
+ (*out_rgba)[4 * i + 0] =
+ reinterpret_cast<float **>(exr_image.images)[idxR][i];
+ (*out_rgba)[4 * i + 1] =
+ reinterpret_cast<float **>(exr_image.images)[idxG][i];
+ (*out_rgba)[4 * i + 2] =
+ reinterpret_cast<float **>(exr_image.images)[idxB][i];
+ if (idxA != -1) {
+ (*out_rgba)[4 * i + 3] =
+ reinterpret_cast<float **>(exr_image.images)[idxA][i];
+ } else {
+ (*out_rgba)[4 * i + 3] = 1.0;
+ }
}
}
@@ -11452,7 +11534,7 @@ size_t SaveEXRImageToMemory(const EXRImage *exr_image,
if (exr_image == NULL || memory_out == NULL ||
exr_header->compression_type < 0) {
tinyexr::SetErrorMessage("Invalid argument for SaveEXRImageToMemory", err);
- return 0; // @fixme
+ return 0;
}
#if !TINYEXR_USE_PIZ
@@ -11623,8 +11705,6 @@ size_t SaveEXRImageToMemory(const EXRImage *exr_image,
sizeof(
tinyexr::tinyexr_int64); // sizeof(header) + sizeof(offsetTable)
- std::vector<unsigned char> data;
-
std::vector<std::vector<unsigned char> > data_list(
static_cast<size_t>(num_blocks));
std::vector<size_t> channel_offset_list(
@@ -11863,9 +11943,9 @@ size_t SaveEXRImageToMemory(const EXRImage *exr_image,
} else if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_PIZ) {
#if TINYEXR_USE_PIZ
unsigned int bufLen =
- 1024 + static_cast<unsigned int>(
- 1.2 * static_cast<unsigned int>(
- buf.size())); // @fixme { compute good bound. }
+ 8192 + static_cast<unsigned int>(
+ 2 * static_cast<unsigned int>(
+ buf.size())); // @fixme { compute good bound. }
std::vector<unsigned char> block(bufLen);
unsigned int outSize = static_cast<unsigned int>(block.size());
@@ -11924,13 +12004,12 @@ size_t SaveEXRImageToMemory(const EXRImage *exr_image,
} // omp parallel
for (size_t i = 0; i < static_cast<size_t>(num_blocks); i++) {
- data.insert(data.end(), data_list[i].begin(), data_list[i].end());
-
offsets[i] = offset;
tinyexr::swap8(reinterpret_cast<tinyexr::tinyexr_uint64 *>(&offsets[i]));
offset += data_list[i].size();
}
+ size_t totalSize = static_cast<size_t>(offset);
{
memory.insert(
memory.end(), reinterpret_cast<unsigned char *>(&offsets.at(0)),
@@ -11938,14 +12017,21 @@ size_t SaveEXRImageToMemory(const EXRImage *exr_image,
sizeof(tinyexr::tinyexr_uint64) * static_cast<size_t>(num_blocks));
}
- { memory.insert(memory.end(), data.begin(), data.end()); }
-
- assert(memory.size() > 0);
+ if ( memory.size() == 0 ) {
+ tinyexr::SetErrorMessage("Output memory size is zero", err);
+ return 0;
+ }
- (*memory_out) = static_cast<unsigned char *>(malloc(memory.size()));
+ (*memory_out) = static_cast<unsigned char *>(malloc(totalSize));
memcpy((*memory_out), &memory.at(0), memory.size());
+ unsigned char *memory_ptr = *memory_out + memory.size();
- return memory.size(); // OK
+ for (size_t i = 0; i < static_cast<size_t>(num_blocks); i++) {
+ memcpy(memory_ptr, &data_list[i].at(0), data_list[i].size());
+ memory_ptr += data_list[i].size();
+ }
+
+ return totalSize; // OK
}
int SaveEXRImageToFile(const EXRImage *exr_image, const EXRHeader *exr_header,
@@ -11960,7 +12046,7 @@ int SaveEXRImageToFile(const EXRImage *exr_image, const EXRHeader *exr_header,
if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_PIZ) {
tinyexr::SetErrorMessage("PIZ compression is not supported in this build",
err);
- return 0;
+ return TINYEXR_ERROR_UNSUPPORTED_FEATURE;
}
#endif
@@ -11968,7 +12054,7 @@ int SaveEXRImageToFile(const EXRImage *exr_image, const EXRHeader *exr_header,
if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZFP) {
tinyexr::SetErrorMessage("ZFP compression is not supported in this build",
err);
- return 0;
+ return TINYEXR_ERROR_UNSUPPORTED_FEATURE;
}
#endif
@@ -11980,19 +12066,28 @@ int SaveEXRImageToFile(const EXRImage *exr_image, const EXRHeader *exr_header,
#endif
if (!fp) {
tinyexr::SetErrorMessage("Cannot write a file", err);
- return TINYEXR_ERROR_CANT_OPEN_FILE;
+ return TINYEXR_ERROR_CANT_WRITE_FILE;
}
unsigned char *mem = NULL;
size_t mem_size = SaveEXRImageToMemory(exr_image, exr_header, &mem, err);
+ if (mem_size == 0) {
+ return TINYEXR_ERROR_SERIALZATION_FAILED;
+ }
+ size_t written_size = 0;
if ((mem_size > 0) && mem) {
- fwrite(mem, 1, mem_size, fp);
+ written_size = fwrite(mem, 1, mem_size, fp);
}
free(mem);
fclose(fp);
+ if (written_size != mem_size) {
+ tinyexr::SetErrorMessage("Cannot write a file", err);
+ return TINYEXR_ERROR_CANT_WRITE_FILE;
+ }
+
return TINYEXR_SUCCESS;
}
@@ -12861,20 +12956,27 @@ int LoadEXRMultipartImageFromFile(EXRImage *exr_images,
}
int SaveEXR(const float *data, int width, int height, int components,
- const int save_as_fp16, const char *outfilename) {
+ const int save_as_fp16, const char *outfilename, const char **err) {
if ((components == 1) || components == 3 || components == 4) {
// OK
} else {
+ std::stringstream ss;
+ ss << "Unsupported component value : " << components << std::endl;
+
+ tinyexr::SetErrorMessage(ss.str(), err);
return TINYEXR_ERROR_INVALID_ARGUMENT;
}
- // Assume at least 16x16 pixels.
- if (width < 16) return TINYEXR_ERROR_INVALID_ARGUMENT;
- if (height < 16) return TINYEXR_ERROR_INVALID_ARGUMENT;
-
EXRHeader header;
InitEXRHeader(&header);
+ if ((width < 16) && (height < 16)) {
+ // No compression for small image.
+ header.compression_type = TINYEXR_COMPRESSIONTYPE_NONE;
+ } else {
+ header.compression_type = TINYEXR_COMPRESSIONTYPE_ZIP;
+ }
+
EXRImage image;
InitEXRImage(&image);
@@ -12980,8 +13082,7 @@ int SaveEXR(const float *data, int width, int height, int components,
}
}
- const char *err;
- int ret = SaveEXRImageToFile(&image, &header, outfilename, &err);
+ int ret = SaveEXRImageToFile(&image, &header, outfilename, err);
if (ret != TINYEXR_SUCCESS) {
return ret;
}
diff --git a/thirdparty/zstd/1314.diff b/thirdparty/zstd/1314.diff
deleted file mode 100644
index c9f4efadbf..0000000000
--- a/thirdparty/zstd/1314.diff
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/common/cpu.h b/common/cpu.h
-index 88e0ebf44..eeb428ad5 100644
---- a/common/cpu.h
-+++ b/common/cpu.h
-@@ -36,7 +36,7 @@ MEM_STATIC ZSTD_cpuid_t ZSTD_cpuid(void) {
- U32 f1d = 0;
- U32 f7b = 0;
- U32 f7c = 0;
--#ifdef _MSC_VER
-+#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86))
- int reg[4];
- __cpuid((int*)reg, 0);
- {
diff --git a/thirdparty/zstd/common/bitstream.h b/thirdparty/zstd/common/bitstream.h
index f7f389fe0f..d955bd677b 100644
--- a/thirdparty/zstd/common/bitstream.h
+++ b/thirdparty/zstd/common/bitstream.h
@@ -1,8 +1,7 @@
/* ******************************************************************
bitstream
Part of FSE library
- header file (to include)
- Copyright (C) 2013-2017, Yann Collet.
+ Copyright (C) 2013-present, Yann Collet.
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
@@ -49,21 +48,10 @@ extern "C" {
* Dependencies
******************************************/
#include "mem.h" /* unaligned access routines */
+#include "debug.h" /* assert(), DEBUGLOG(), RAWLOG() */
#include "error_private.h" /* error codes and messages */
-/*-*************************************
-* Debug
-***************************************/
-#if defined(BIT_DEBUG) && (BIT_DEBUG>=1)
-# include <assert.h>
-#else
-# ifndef assert
-# define assert(condition) ((void)0)
-# endif
-#endif
-
-
/*=========================================
* Target specific
=========================================*/
@@ -83,8 +71,7 @@ extern "C" {
* A critical property of these streams is that they encode and decode in **reverse** direction.
* So the first bit sequence you add will be the last to be read, like a LIFO stack.
*/
-typedef struct
-{
+typedef struct {
size_t bitContainer;
unsigned bitPos;
char* startPtr;
@@ -118,8 +105,7 @@ MEM_STATIC size_t BIT_closeCStream(BIT_CStream_t* bitC);
/*-********************************************
* bitStream decoding API (read backward)
**********************************************/
-typedef struct
-{
+typedef struct {
size_t bitContainer;
unsigned bitsConsumed;
const char* ptr;
@@ -236,7 +222,8 @@ MEM_STATIC void BIT_addBits(BIT_CStream_t* bitC,
}
/*! BIT_addBitsFast() :
- * works only if `value` is _clean_, meaning all high bits above nbBits are 0 */
+ * works only if `value` is _clean_,
+ * meaning all high bits above nbBits are 0 */
MEM_STATIC void BIT_addBitsFast(BIT_CStream_t* bitC,
size_t value, unsigned nbBits)
{
@@ -352,17 +339,10 @@ MEM_STATIC size_t BIT_getUpperBits(size_t bitContainer, U32 const start)
MEM_STATIC size_t BIT_getMiddleBits(size_t bitContainer, U32 const start, U32 const nbBits)
{
-#if defined(__BMI__) && defined(__GNUC__) && __GNUC__*1000+__GNUC_MINOR__ >= 4008 /* experimental */
-# if defined(__x86_64__)
- if (sizeof(bitContainer)==8)
- return _bextr_u64(bitContainer, start, nbBits);
- else
-# endif
- return _bextr_u32(bitContainer, start, nbBits);
-#else
+ U32 const regMask = sizeof(bitContainer)*8 - 1;
+ /* if start > regMask, bitstream is corrupted, and result is undefined */
assert(nbBits < BIT_MASK_SIZE);
- return (bitContainer >> start) & BIT_mask[nbBits];
-#endif
+ return (bitContainer >> (start & regMask)) & BIT_mask[nbBits];
}
MEM_STATIC size_t BIT_getLowerBits(size_t bitContainer, U32 const nbBits)
@@ -379,9 +359,13 @@ MEM_STATIC size_t BIT_getLowerBits(size_t bitContainer, U32 const nbBits)
* @return : value extracted */
MEM_STATIC size_t BIT_lookBits(const BIT_DStream_t* bitD, U32 nbBits)
{
-#if defined(__BMI__) && defined(__GNUC__) /* experimental; fails if bitD->bitsConsumed + nbBits > sizeof(bitD->bitContainer)*8 */
+ /* arbitrate between double-shift and shift+mask */
+#if 1
+ /* if bitD->bitsConsumed + nbBits > sizeof(bitD->bitContainer)*8,
+ * bitstream is likely corrupted, and result is undefined */
return BIT_getMiddleBits(bitD->bitContainer, (sizeof(bitD->bitContainer)*8) - bitD->bitsConsumed - nbBits, nbBits);
#else
+ /* this code path is slower on my os-x laptop */
U32 const regMask = sizeof(bitD->bitContainer)*8 - 1;
return ((bitD->bitContainer << (bitD->bitsConsumed & regMask)) >> 1) >> ((regMask-nbBits) & regMask);
#endif
@@ -405,7 +389,7 @@ MEM_STATIC void BIT_skipBits(BIT_DStream_t* bitD, U32 nbBits)
* Read (consume) next n bits from local register and update.
* Pay attention to not read more than nbBits contained into local register.
* @return : extracted value. */
-MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits)
+MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, unsigned nbBits)
{
size_t const value = BIT_lookBits(bitD, nbBits);
BIT_skipBits(bitD, nbBits);
@@ -414,7 +398,7 @@ MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits)
/*! BIT_readBitsFast() :
* unsafe version; only works only if nbBits >= 1 */
-MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, U32 nbBits)
+MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits)
{
size_t const value = BIT_lookBitsFast(bitD, nbBits);
assert(nbBits >= 1);
diff --git a/thirdparty/zstd/common/compiler.h b/thirdparty/zstd/common/compiler.h
index e90a3bcde3..7f561282ca 100644
--- a/thirdparty/zstd/common/compiler.h
+++ b/thirdparty/zstd/common/compiler.h
@@ -15,6 +15,8 @@
* Compiler specifics
*********************************************************/
/* force inlining */
+
+#if !defined(ZSTD_NO_INLINE)
#if defined (__GNUC__) || defined(__cplusplus) || defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */
# define INLINE_KEYWORD inline
#else
@@ -29,6 +31,13 @@
# define FORCE_INLINE_ATTR
#endif
+#else
+
+#define INLINE_KEYWORD
+#define FORCE_INLINE_ATTR
+
+#endif
+
/**
* FORCE_INLINE_TEMPLATE is used to define C "templates", which take constant
* parameters. They must be inlined for the compiler to elimininate the constant
@@ -77,9 +86,9 @@
* Enabled for clang & gcc >=4.8 on x86 when BMI2 isn't enabled by default.
*/
#ifndef DYNAMIC_BMI2
- #if (defined(__clang__) && __has_attribute(__target__)) \
+ #if ((defined(__clang__) && __has_attribute(__target__)) \
|| (defined(__GNUC__) \
- && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))) \
+ && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)))) \
&& (defined(__x86_64__) || defined(_M_X86)) \
&& !defined(__BMI2__)
# define DYNAMIC_BMI2 1
@@ -88,15 +97,35 @@
#endif
#endif
-/* prefetch */
-#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_I86)) /* _mm_prefetch() is not defined outside of x86/x64 */
-# include <mmintrin.h> /* https://msdn.microsoft.com/fr-fr/library/84szxsww(v=vs.90).aspx */
-# define PREFETCH(ptr) _mm_prefetch((const char*)ptr, _MM_HINT_T0)
-#elif defined(__GNUC__)
-# define PREFETCH(ptr) __builtin_prefetch(ptr, 0, 0)
+/* prefetch
+ * can be disabled, by declaring NO_PREFETCH build macro */
+#if defined(NO_PREFETCH)
+# define PREFETCH_L1(ptr) (void)(ptr) /* disabled */
+# define PREFETCH_L2(ptr) (void)(ptr) /* disabled */
#else
-# define PREFETCH(ptr) /* disabled */
-#endif
+# if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_I86)) /* _mm_prefetch() is not defined outside of x86/x64 */
+# include <mmintrin.h> /* https://msdn.microsoft.com/fr-fr/library/84szxsww(v=vs.90).aspx */
+# define PREFETCH_L1(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T0)
+# define PREFETCH_L2(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T1)
+# elif defined(__GNUC__) && ( (__GNUC__ >= 4) || ( (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1) ) )
+# define PREFETCH_L1(ptr) __builtin_prefetch((ptr), 0 /* rw==read */, 3 /* locality */)
+# define PREFETCH_L2(ptr) __builtin_prefetch((ptr), 0 /* rw==read */, 2 /* locality */)
+# else
+# define PREFETCH_L1(ptr) (void)(ptr) /* disabled */
+# define PREFETCH_L2(ptr) (void)(ptr) /* disabled */
+# endif
+#endif /* NO_PREFETCH */
+
+#define CACHELINE_SIZE 64
+
+#define PREFETCH_AREA(p, s) { \
+ const char* const _ptr = (const char*)(p); \
+ size_t const _size = (size_t)(s); \
+ size_t _pos; \
+ for (_pos=0; _pos<_size; _pos+=CACHELINE_SIZE) { \
+ PREFETCH_L2(_ptr + _pos); \
+ } \
+}
/* disable warnings */
#ifdef _MSC_VER /* Visual Studio */
diff --git a/thirdparty/zstd/common/cpu.h b/thirdparty/zstd/common/cpu.h
index a109520a33..5f0923fc92 100644
--- a/thirdparty/zstd/common/cpu.h
+++ b/thirdparty/zstd/common/cpu.h
@@ -72,14 +72,13 @@ MEM_STATIC ZSTD_cpuid_t ZSTD_cpuid(void) {
"cpuid\n\t"
"popl %%ebx\n\t"
: "=a"(f1a), "=c"(f1c), "=d"(f1d)
- : "a"(1)
- :);
+ : "a"(1));
}
if (n >= 7) {
__asm__(
"pushl %%ebx\n\t"
"cpuid\n\t"
- "movl %%ebx, %%eax\n\r"
+ "movl %%ebx, %%eax\n\t"
"popl %%ebx"
: "=a"(f7b), "=c"(f7c)
: "a"(7), "c"(0)
diff --git a/thirdparty/zstd/common/debug.c b/thirdparty/zstd/common/debug.c
new file mode 100644
index 0000000000..3ebdd1cb15
--- /dev/null
+++ b/thirdparty/zstd/common/debug.c
@@ -0,0 +1,44 @@
+/* ******************************************************************
+ debug
+ Part of FSE library
+ Copyright (C) 2013-present, Yann Collet.
+
+ BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
+
+ 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.
+
+ 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.
+
+ You can contact the author at :
+ - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
+****************************************************************** */
+
+
+/*
+ * This module only hosts one global variable
+ * which can be used to dynamically influence the verbosity of traces,
+ * such as DEBUGLOG and RAWLOG
+ */
+
+#include "debug.h"
+
+int g_debuglevel = DEBUGLEVEL;
diff --git a/thirdparty/zstd/common/debug.h b/thirdparty/zstd/common/debug.h
new file mode 100644
index 0000000000..b4fc89d497
--- /dev/null
+++ b/thirdparty/zstd/common/debug.h
@@ -0,0 +1,134 @@
+/* ******************************************************************
+ debug
+ Part of FSE library
+ Copyright (C) 2013-present, Yann Collet.
+
+ BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
+
+ 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.
+
+ 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.
+
+ You can contact the author at :
+ - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
+****************************************************************** */
+
+
+/*
+ * The purpose of this header is to enable debug functions.
+ * They regroup assert(), DEBUGLOG() and RAWLOG() for run-time,
+ * and DEBUG_STATIC_ASSERT() for compile-time.
+ *
+ * By default, DEBUGLEVEL==0, which means run-time debug is disabled.
+ *
+ * Level 1 enables assert() only.
+ * Starting level 2, traces can be generated and pushed to stderr.
+ * The higher the level, the more verbose the traces.
+ *
+ * It's possible to dynamically adjust level using variable g_debug_level,
+ * which is only declared if DEBUGLEVEL>=2,
+ * and is a global variable, not multi-thread protected (use with care)
+ */
+
+#ifndef DEBUG_H_12987983217
+#define DEBUG_H_12987983217
+
+#if defined (__cplusplus)
+extern "C" {
+#endif
+
+
+/* static assert is triggered at compile time, leaving no runtime artefact.
+ * static assert only works with compile-time constants.
+ * Also, this variant can only be used inside a function. */
+#define DEBUG_STATIC_ASSERT(c) (void)sizeof(char[(c) ? 1 : -1])
+
+
+/* DEBUGLEVEL is expected to be defined externally,
+ * typically through compiler command line.
+ * Value must be a number. */
+#ifndef DEBUGLEVEL
+# define DEBUGLEVEL 0
+#endif
+
+
+/* DEBUGFILE can be defined externally,
+ * typically through compiler command line.
+ * note : currently useless.
+ * Value must be stderr or stdout */
+#ifndef DEBUGFILE
+# define DEBUGFILE stderr
+#endif
+
+
+/* recommended values for DEBUGLEVEL :
+ * 0 : release mode, no debug, all run-time checks disabled
+ * 1 : enables assert() only, no display
+ * 2 : reserved, for currently active debug path
+ * 3 : events once per object lifetime (CCtx, CDict, etc.)
+ * 4 : events once per frame
+ * 5 : events once per block
+ * 6 : events once per sequence (verbose)
+ * 7+: events at every position (*very* verbose)
+ *
+ * It's generally inconvenient to output traces > 5.
+ * In which case, it's possible to selectively trigger high verbosity levels
+ * by modifying g_debug_level.
+ */
+
+#if (DEBUGLEVEL>=1)
+# include <assert.h>
+#else
+# ifndef assert /* assert may be already defined, due to prior #include <assert.h> */
+# define assert(condition) ((void)0) /* disable assert (default) */
+# endif
+#endif
+
+#if (DEBUGLEVEL>=2)
+# include <stdio.h>
+extern int g_debuglevel; /* the variable is only declared,
+ it actually lives in debug.c,
+ and is shared by the whole process.
+ It's not thread-safe.
+ It's useful when enabling very verbose levels
+ on selective conditions (such as position in src) */
+
+# define RAWLOG(l, ...) { \
+ if (l<=g_debuglevel) { \
+ fprintf(stderr, __VA_ARGS__); \
+ } }
+# define DEBUGLOG(l, ...) { \
+ if (l<=g_debuglevel) { \
+ fprintf(stderr, __FILE__ ": " __VA_ARGS__); \
+ fprintf(stderr, " \n"); \
+ } }
+#else
+# define RAWLOG(l, ...) {} /* disabled */
+# define DEBUGLOG(l, ...) {} /* disabled */
+#endif
+
+
+#if defined (__cplusplus)
+}
+#endif
+
+#endif /* DEBUG_H_12987983217 */
diff --git a/thirdparty/zstd/common/entropy_common.c b/thirdparty/zstd/common/entropy_common.c
index b37a082fee..b12944e1de 100644
--- a/thirdparty/zstd/common/entropy_common.c
+++ b/thirdparty/zstd/common/entropy_common.c
@@ -72,7 +72,21 @@ size_t FSE_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsigned* t
unsigned charnum = 0;
int previous0 = 0;
- if (hbSize < 4) return ERROR(srcSize_wrong);
+ if (hbSize < 4) {
+ /* This function only works when hbSize >= 4 */
+ char buffer[4];
+ memset(buffer, 0, sizeof(buffer));
+ memcpy(buffer, headerBuffer, hbSize);
+ { size_t const countSize = FSE_readNCount(normalizedCounter, maxSVPtr, tableLogPtr,
+ buffer, sizeof(buffer));
+ if (FSE_isError(countSize)) return countSize;
+ if (countSize > hbSize) return ERROR(corruption_detected);
+ return countSize;
+ } }
+ assert(hbSize >= 4);
+
+ /* init */
+ memset(normalizedCounter, 0, (*maxSVPtr+1) * sizeof(normalizedCounter[0])); /* all symbols not present in NCount have a frequency of 0 */
bitStream = MEM_readLE32(ip);
nbBits = (bitStream & 0xF) + FSE_MIN_TABLELOG; /* extract tableLog */
if (nbBits > FSE_TABLELOG_ABSOLUTE_MAX) return ERROR(tableLog_tooLarge);
@@ -105,6 +119,7 @@ size_t FSE_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsigned* t
if (n0 > *maxSVPtr) return ERROR(maxSymbolValue_tooSmall);
while (charnum < n0) normalizedCounter[charnum++] = 0;
if ((ip <= iend-7) || (ip + (bitCount>>3) <= iend-4)) {
+ assert((bitCount >> 3) <= 3); /* For first condition to work */
ip += bitCount>>3;
bitCount &= 7;
bitStream = MEM_readLE32(ip) >> bitCount;
diff --git a/thirdparty/zstd/common/error_private.c b/thirdparty/zstd/common/error_private.c
index d004ee636c..7c1bb67a23 100644
--- a/thirdparty/zstd/common/error_private.c
+++ b/thirdparty/zstd/common/error_private.c
@@ -14,6 +14,10 @@
const char* ERR_getErrorString(ERR_enum code)
{
+#ifdef ZSTD_STRIP_ERROR_STRINGS
+ (void)code;
+ return "Error strings stripped";
+#else
static const char* const notErrorCode = "Unspecified error code";
switch( code )
{
@@ -39,10 +43,12 @@ const char* ERR_getErrorString(ERR_enum code)
case PREFIX(dictionaryCreation_failed): return "Cannot create Dictionary from provided samples";
case PREFIX(dstSize_tooSmall): return "Destination buffer is too small";
case PREFIX(srcSize_wrong): return "Src size is incorrect";
+ case PREFIX(dstBuffer_null): return "Operation on NULL destination buffer";
/* following error codes are not stable and may be removed or changed in a future version */
case PREFIX(frameIndex_tooLarge): return "Frame index is too large";
case PREFIX(seekableIO): return "An I/O error occurred when reading/seeking";
case PREFIX(maxCode):
default: return notErrorCode;
}
+#endif
}
diff --git a/thirdparty/zstd/common/fse.h b/thirdparty/zstd/common/fse.h
index 6a1d272be5..f72c519b25 100644
--- a/thirdparty/zstd/common/fse.h
+++ b/thirdparty/zstd/common/fse.h
@@ -72,6 +72,7 @@ extern "C" {
#define FSE_VERSION_NUMBER (FSE_VERSION_MAJOR *100*100 + FSE_VERSION_MINOR *100 + FSE_VERSION_RELEASE)
FSE_PUBLIC_API unsigned FSE_versionNumber(void); /**< library version number; to be used when checking dll version */
+
/*-****************************************
* FSE simple functions
******************************************/
@@ -129,7 +130,7 @@ FSE_PUBLIC_API size_t FSE_compress2 (void* dst, size_t dstSize, const void* src,
******************************************/
/*!
FSE_compress() does the following:
-1. count symbol occurrence from source[] into table count[]
+1. count symbol occurrence from source[] into table count[] (see hist.h)
2. normalize counters so that sum(count[]) == Power_of_2 (2^tableLog)
3. save normalized counters to memory buffer using writeNCount()
4. build encoding table 'CTable' from normalized counters
@@ -147,15 +148,6 @@ or to save and provide normalized distribution using external method.
/* *** COMPRESSION *** */
-/*! FSE_count():
- Provides the precise count of each byte within a table 'count'.
- 'count' is a table of unsigned int, of minimum size (*maxSymbolValuePtr+1).
- *maxSymbolValuePtr will be updated if detected smaller than initial value.
- @return : the count of the most frequent symbol (which is not identified).
- if return == srcSize, there is only one symbol.
- Can also return an error code, which can be tested with FSE_isError(). */
-FSE_PUBLIC_API size_t FSE_count(unsigned* count, unsigned* maxSymbolValuePtr, const void* src, size_t srcSize);
-
/*! FSE_optimalTableLog():
dynamically downsize 'tableLog' when conditions are met.
It saves CPU time, by using smaller tables, while preserving or even improving compression ratio.
@@ -167,7 +159,8 @@ FSE_PUBLIC_API unsigned FSE_optimalTableLog(unsigned maxTableLog, size_t srcSize
'normalizedCounter' is a table of short, of minimum size (maxSymbolValue+1).
@return : tableLog,
or an errorCode, which can be tested using FSE_isError() */
-FSE_PUBLIC_API size_t FSE_normalizeCount(short* normalizedCounter, unsigned tableLog, const unsigned* count, size_t srcSize, unsigned maxSymbolValue);
+FSE_PUBLIC_API size_t FSE_normalizeCount(short* normalizedCounter, unsigned tableLog,
+ const unsigned* count, size_t srcSize, unsigned maxSymbolValue);
/*! FSE_NCountWriteBound():
Provides the maximum possible size of an FSE normalized table, given 'maxSymbolValue' and 'tableLog'.
@@ -178,8 +171,9 @@ FSE_PUBLIC_API size_t FSE_NCountWriteBound(unsigned maxSymbolValue, unsigned tab
Compactly save 'normalizedCounter' into 'buffer'.
@return : size of the compressed table,
or an errorCode, which can be tested using FSE_isError(). */
-FSE_PUBLIC_API size_t FSE_writeNCount (void* buffer, size_t bufferSize, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog);
-
+FSE_PUBLIC_API size_t FSE_writeNCount (void* buffer, size_t bufferSize,
+ const short* normalizedCounter,
+ unsigned maxSymbolValue, unsigned tableLog);
/*! Constructor and Destructor of FSE_CTable.
Note that FSE_CTable size depends on 'tableLog' and 'maxSymbolValue' */
@@ -250,7 +244,9 @@ If there is an error, the function will return an ErrorCode (which can be tested
@return : size read from 'rBuffer',
or an errorCode, which can be tested using FSE_isError().
maxSymbolValuePtr[0] and tableLogPtr[0] will also be updated with their respective values */
-FSE_PUBLIC_API size_t FSE_readNCount (short* normalizedCounter, unsigned* maxSymbolValuePtr, unsigned* tableLogPtr, const void* rBuffer, size_t rBuffSize);
+FSE_PUBLIC_API size_t FSE_readNCount (short* normalizedCounter,
+ unsigned* maxSymbolValuePtr, unsigned* tableLogPtr,
+ const void* rBuffer, size_t rBuffSize);
/*! Constructor and Destructor of FSE_DTable.
Note that its size depends on 'tableLog' */
@@ -325,33 +321,8 @@ If there is an error, the function will return an error code, which can be teste
/* *****************************************
-* FSE advanced API
-*******************************************/
-/* FSE_count_wksp() :
- * Same as FSE_count(), but using an externally provided scratch buffer.
- * `workSpace` size must be table of >= `1024` unsigned
- */
-size_t FSE_count_wksp(unsigned* count, unsigned* maxSymbolValuePtr,
- const void* source, size_t sourceSize, unsigned* workSpace);
-
-/** FSE_countFast() :
- * same as FSE_count(), but blindly trusts that all byte values within src are <= *maxSymbolValuePtr
- */
-size_t FSE_countFast(unsigned* count, unsigned* maxSymbolValuePtr, const void* src, size_t srcSize);
-
-/* FSE_countFast_wksp() :
- * Same as FSE_countFast(), but using an externally provided scratch buffer.
- * `workSpace` must be a table of minimum `1024` unsigned
- */
-size_t FSE_countFast_wksp(unsigned* count, unsigned* maxSymbolValuePtr, const void* src, size_t srcSize, unsigned* workSpace);
-
-/*! FSE_count_simple() :
- * Same as FSE_countFast(), but does not use any additional memory (not even on stack).
- * This function is unsafe, and will segfault if any value within `src` is `> *maxSymbolValuePtr` (presuming it's also the size of `count`).
-*/
-size_t FSE_count_simple(unsigned* count, unsigned* maxSymbolValuePtr, const void* src, size_t srcSize);
-
-
+ * FSE advanced API
+ ***************************************** */
unsigned FSE_optimalTableLog_internal(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue, unsigned minus);
/**< same as FSE_optimalTableLog(), which used `minus==2` */
@@ -541,7 +512,7 @@ MEM_STATIC void FSE_initCState(FSE_CState_t* statePtr, const FSE_CTable* ct)
const U32 tableLog = MEM_read16(ptr);
statePtr->value = (ptrdiff_t)1<<tableLog;
statePtr->stateTable = u16ptr+2;
- statePtr->symbolTT = ((const U32*)ct + 1 + (tableLog ? (1<<(tableLog-1)) : 1));
+ statePtr->symbolTT = ct + 1 + (tableLog ? (1<<(tableLog-1)) : 1);
statePtr->stateLog = tableLog;
}
@@ -560,7 +531,7 @@ MEM_STATIC void FSE_initCState2(FSE_CState_t* statePtr, const FSE_CTable* ct, U3
}
}
-MEM_STATIC void FSE_encodeSymbol(BIT_CStream_t* bitC, FSE_CState_t* statePtr, U32 symbol)
+MEM_STATIC void FSE_encodeSymbol(BIT_CStream_t* bitC, FSE_CState_t* statePtr, unsigned symbol)
{
FSE_symbolCompressionTransform const symbolTT = ((const FSE_symbolCompressionTransform*)(statePtr->symbolTT))[symbol];
const U16* const stateTable = (const U16*)(statePtr->stateTable);
@@ -576,6 +547,39 @@ MEM_STATIC void FSE_flushCState(BIT_CStream_t* bitC, const FSE_CState_t* statePt
}
+/* FSE_getMaxNbBits() :
+ * Approximate maximum cost of a symbol, in bits.
+ * Fractional get rounded up (i.e : a symbol with a normalized frequency of 3 gives the same result as a frequency of 2)
+ * note 1 : assume symbolValue is valid (<= maxSymbolValue)
+ * note 2 : if freq[symbolValue]==0, @return a fake cost of tableLog+1 bits */
+MEM_STATIC U32 FSE_getMaxNbBits(const void* symbolTTPtr, U32 symbolValue)
+{
+ const FSE_symbolCompressionTransform* symbolTT = (const FSE_symbolCompressionTransform*) symbolTTPtr;
+ return (symbolTT[symbolValue].deltaNbBits + ((1<<16)-1)) >> 16;
+}
+
+/* FSE_bitCost() :
+ * Approximate symbol cost, as fractional value, using fixed-point format (accuracyLog fractional bits)
+ * note 1 : assume symbolValue is valid (<= maxSymbolValue)
+ * note 2 : if freq[symbolValue]==0, @return a fake cost of tableLog+1 bits */
+MEM_STATIC U32 FSE_bitCost(const void* symbolTTPtr, U32 tableLog, U32 symbolValue, U32 accuracyLog)
+{
+ const FSE_symbolCompressionTransform* symbolTT = (const FSE_symbolCompressionTransform*) symbolTTPtr;
+ U32 const minNbBits = symbolTT[symbolValue].deltaNbBits >> 16;
+ U32 const threshold = (minNbBits+1) << 16;
+ assert(tableLog < 16);
+ assert(accuracyLog < 31-tableLog); /* ensure enough room for renormalization double shift */
+ { U32 const tableSize = 1 << tableLog;
+ U32 const deltaFromThreshold = threshold - (symbolTT[symbolValue].deltaNbBits + tableSize);
+ U32 const normalizedDeltaFromThreshold = (deltaFromThreshold << accuracyLog) >> tableLog; /* linear interpolation (very approximate) */
+ U32 const bitMultiplier = 1 << accuracyLog;
+ assert(symbolTT[symbolValue].deltaNbBits + tableSize <= threshold);
+ assert(normalizedDeltaFromThreshold <= bitMultiplier);
+ return (minNbBits+1)*bitMultiplier - normalizedDeltaFromThreshold;
+ }
+}
+
+
/* ====== Decompression ====== */
typedef struct {
diff --git a/thirdparty/zstd/common/fse_decompress.c b/thirdparty/zstd/common/fse_decompress.c
index 4c66c3b774..72bbead5be 100644
--- a/thirdparty/zstd/common/fse_decompress.c
+++ b/thirdparty/zstd/common/fse_decompress.c
@@ -49,7 +49,7 @@
* Error Management
****************************************************************/
#define FSE_isError ERR_isError
-#define FSE_STATIC_ASSERT(c) { enum { FSE_static_assert = 1/(int)(!!(c)) }; } /* use only *after* variable declarations */
+#define FSE_STATIC_ASSERT(c) DEBUG_STATIC_ASSERT(c) /* use only *after* variable declarations */
/* check and forward error code */
#define CHECK_F(f) { size_t const e = f; if (FSE_isError(e)) return e; }
diff --git a/thirdparty/zstd/common/huf.h b/thirdparty/zstd/common/huf.h
index b4645b4e51..6b572c448d 100644
--- a/thirdparty/zstd/common/huf.h
+++ b/thirdparty/zstd/common/huf.h
@@ -1,7 +1,7 @@
/* ******************************************************************
- Huffman coder, part of New Generation Entropy library
- header file
- Copyright (C) 2013-2016, Yann Collet.
+ huff0 huffman codec,
+ part of Finite State Entropy library
+ Copyright (C) 2013-present, Yann Collet.
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
@@ -163,25 +163,29 @@ HUF_PUBLIC_API size_t HUF_compress4X_wksp (void* dst, size_t dstCapacity,
/* static allocation of HUF's DTable */
typedef U32 HUF_DTable;
#define HUF_DTABLE_SIZE(maxTableLog) (1 + (1<<(maxTableLog)))
-#define HUF_CREATE_STATIC_DTABLEX2(DTable, maxTableLog) \
+#define HUF_CREATE_STATIC_DTABLEX1(DTable, maxTableLog) \
HUF_DTable DTable[HUF_DTABLE_SIZE((maxTableLog)-1)] = { ((U32)((maxTableLog)-1) * 0x01000001) }
-#define HUF_CREATE_STATIC_DTABLEX4(DTable, maxTableLog) \
+#define HUF_CREATE_STATIC_DTABLEX2(DTable, maxTableLog) \
HUF_DTable DTable[HUF_DTABLE_SIZE(maxTableLog)] = { ((U32)(maxTableLog) * 0x01000001) }
/* ****************************************
* Advanced decompression functions
******************************************/
-size_t HUF_decompress4X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< single-symbol decoder */
-size_t HUF_decompress4X4 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< double-symbols decoder */
+size_t HUF_decompress4X1 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< single-symbol decoder */
+#ifndef HUF_FORCE_DECOMPRESS_X1
+size_t HUF_decompress4X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< double-symbols decoder */
+#endif
size_t HUF_decompress4X_DCtx (HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< decodes RLE and uncompressed */
size_t HUF_decompress4X_hufOnly(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< considers RLE and uncompressed as errors */
size_t HUF_decompress4X_hufOnly_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize); /**< considers RLE and uncompressed as errors */
-size_t HUF_decompress4X2_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< single-symbol decoder */
-size_t HUF_decompress4X2_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize); /**< single-symbol decoder */
-size_t HUF_decompress4X4_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< double-symbols decoder */
-size_t HUF_decompress4X4_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize); /**< double-symbols decoder */
+size_t HUF_decompress4X1_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< single-symbol decoder */
+size_t HUF_decompress4X1_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize); /**< single-symbol decoder */
+#ifndef HUF_FORCE_DECOMPRESS_X1
+size_t HUF_decompress4X2_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< double-symbols decoder */
+size_t HUF_decompress4X2_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize); /**< double-symbols decoder */
+#endif
/* ****************************************
@@ -208,7 +212,7 @@ size_t HUF_compress4X_usingCTable(void* dst, size_t dstSize, const void* src, si
typedef enum {
HUF_repeat_none, /**< Cannot use the previous table */
HUF_repeat_check, /**< Can use the previous table but it must be checked. Note : The previous table must have been constructed by HUF_compress{1, 4}X_repeat */
- HUF_repeat_valid /**< Can use the previous table and it is asumed to be valid */
+ HUF_repeat_valid /**< Can use the previous table and it is assumed to be valid */
} HUF_repeat;
/** HUF_compress4X_repeat() :
* Same as HUF_compress4X_wksp(), but considers using hufTable if *repeat != HUF_repeat_none.
@@ -227,7 +231,9 @@ size_t HUF_compress4X_repeat(void* dst, size_t dstSize,
*/
#define HUF_CTABLE_WORKSPACE_SIZE_U32 (2*HUF_SYMBOLVALUE_MAX +1 +1)
#define HUF_CTABLE_WORKSPACE_SIZE (HUF_CTABLE_WORKSPACE_SIZE_U32 * sizeof(unsigned))
-size_t HUF_buildCTable_wksp (HUF_CElt* tree, const U32* count, U32 maxSymbolValue, U32 maxNbBits, void* workSpace, size_t wkspSize);
+size_t HUF_buildCTable_wksp (HUF_CElt* tree,
+ const unsigned* count, U32 maxSymbolValue, U32 maxNbBits,
+ void* workSpace, size_t wkspSize);
/*! HUF_readStats() :
* Read compact Huffman tree, saved by HUF_writeCTable().
@@ -242,10 +248,15 @@ size_t HUF_readStats(BYTE* huffWeight, size_t hwSize,
* Loading a CTable saved with HUF_writeCTable() */
size_t HUF_readCTable (HUF_CElt* CTable, unsigned* maxSymbolValuePtr, const void* src, size_t srcSize);
+/** HUF_getNbBits() :
+ * Read nbBits from CTable symbolTable, for symbol `symbolValue` presumed <= HUF_SYMBOLVALUE_MAX
+ * Note 1 : is not inlined, as HUF_CElt definition is private
+ * Note 2 : const void* used, so that it can provide a statically allocated table as argument (which uses type U32) */
+U32 HUF_getNbBits(const void* symbolTable, U32 symbolValue);
/*
* HUF_decompress() does the following:
- * 1. select the decompression algorithm (X2, X4) based on pre-computed heuristics
+ * 1. select the decompression algorithm (X1, X2) based on pre-computed heuristics
* 2. build Huffman table from save, using HUF_readDTableX?()
* 3. decode 1 or 4 segments in parallel using HUF_decompress?X?_usingDTable()
*/
@@ -253,13 +264,13 @@ size_t HUF_readCTable (HUF_CElt* CTable, unsigned* maxSymbolValuePtr, const void
/** HUF_selectDecoder() :
* Tells which decoder is likely to decode faster,
* based on a set of pre-computed metrics.
- * @return : 0==HUF_decompress4X2, 1==HUF_decompress4X4 .
+ * @return : 0==HUF_decompress4X1, 1==HUF_decompress4X2 .
* Assumption : 0 < dstSize <= 128 KB */
U32 HUF_selectDecoder (size_t dstSize, size_t cSrcSize);
/**
* The minimum workspace size for the `workSpace` used in
- * HUF_readDTableX2_wksp() and HUF_readDTableX4_wksp().
+ * HUF_readDTableX1_wksp() and HUF_readDTableX2_wksp().
*
* The space used depends on HUF_TABLELOG_MAX, ranging from ~1500 bytes when
* HUF_TABLE_LOG_MAX=12 to ~1850 bytes when HUF_TABLE_LOG_MAX=15.
@@ -270,14 +281,22 @@ U32 HUF_selectDecoder (size_t dstSize, size_t cSrcSize);
#define HUF_DECOMPRESS_WORKSPACE_SIZE (2 << 10)
#define HUF_DECOMPRESS_WORKSPACE_SIZE_U32 (HUF_DECOMPRESS_WORKSPACE_SIZE / sizeof(U32))
+#ifndef HUF_FORCE_DECOMPRESS_X2
+size_t HUF_readDTableX1 (HUF_DTable* DTable, const void* src, size_t srcSize);
+size_t HUF_readDTableX1_wksp (HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize);
+#endif
+#ifndef HUF_FORCE_DECOMPRESS_X1
size_t HUF_readDTableX2 (HUF_DTable* DTable, const void* src, size_t srcSize);
size_t HUF_readDTableX2_wksp (HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize);
-size_t HUF_readDTableX4 (HUF_DTable* DTable, const void* src, size_t srcSize);
-size_t HUF_readDTableX4_wksp (HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize);
+#endif
size_t HUF_decompress4X_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable);
+#ifndef HUF_FORCE_DECOMPRESS_X2
+size_t HUF_decompress4X1_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable);
+#endif
+#ifndef HUF_FORCE_DECOMPRESS_X1
size_t HUF_decompress4X2_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable);
-size_t HUF_decompress4X4_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable);
+#endif
/* ====================== */
@@ -298,25 +317,37 @@ size_t HUF_compress1X_repeat(void* dst, size_t dstSize,
void* workSpace, size_t wkspSize, /**< `workSpace` must be aligned on 4-bytes boundaries, `wkspSize` must be >= HUF_WORKSPACE_SIZE */
HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2);
-size_t HUF_decompress1X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /* single-symbol decoder */
-size_t HUF_decompress1X4 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /* double-symbol decoder */
+size_t HUF_decompress1X1 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /* single-symbol decoder */
+#ifndef HUF_FORCE_DECOMPRESS_X1
+size_t HUF_decompress1X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /* double-symbol decoder */
+#endif
size_t HUF_decompress1X_DCtx (HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);
size_t HUF_decompress1X_DCtx_wksp (HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize);
-size_t HUF_decompress1X2_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< single-symbol decoder */
-size_t HUF_decompress1X2_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize); /**< single-symbol decoder */
-size_t HUF_decompress1X4_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< double-symbols decoder */
-size_t HUF_decompress1X4_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize); /**< double-symbols decoder */
+#ifndef HUF_FORCE_DECOMPRESS_X2
+size_t HUF_decompress1X1_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< single-symbol decoder */
+size_t HUF_decompress1X1_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize); /**< single-symbol decoder */
+#endif
+#ifndef HUF_FORCE_DECOMPRESS_X1
+size_t HUF_decompress1X2_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /**< double-symbols decoder */
+size_t HUF_decompress1X2_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize); /**< double-symbols decoder */
+#endif
size_t HUF_decompress1X_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable); /**< automatic selection of sing or double symbol decoder, based on DTable */
+#ifndef HUF_FORCE_DECOMPRESS_X2
+size_t HUF_decompress1X1_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable);
+#endif
+#ifndef HUF_FORCE_DECOMPRESS_X1
size_t HUF_decompress1X2_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable);
-size_t HUF_decompress1X4_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable);
+#endif
/* BMI2 variants.
* If the CPU has BMI2 support, pass bmi2=1, otherwise pass bmi2=0.
*/
size_t HUF_decompress1X_usingDTable_bmi2(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int bmi2);
-size_t HUF_decompress1X2_DCtx_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int bmi2);
+#ifndef HUF_FORCE_DECOMPRESS_X2
+size_t HUF_decompress1X1_DCtx_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int bmi2);
+#endif
size_t HUF_decompress4X_usingDTable_bmi2(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int bmi2);
size_t HUF_decompress4X_hufOnly_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int bmi2);
diff --git a/thirdparty/zstd/common/mem.h b/thirdparty/zstd/common/mem.h
index 47d2300177..5da248756f 100644
--- a/thirdparty/zstd/common/mem.h
+++ b/thirdparty/zstd/common/mem.h
@@ -39,6 +39,10 @@ extern "C" {
# define MEM_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */
#endif
+#ifndef __has_builtin
+# define __has_builtin(x) 0 /* compat. with non-clang compilers */
+#endif
+
/* code only tested on 32 and 64 bits systems */
#define MEM_STATIC_ASSERT(c) { enum { MEM_static_assert = 1/(int)(!!(c)) }; }
MEM_STATIC void MEM_check(void) { MEM_STATIC_ASSERT((sizeof(size_t)==4) || (sizeof(size_t)==8)); }
@@ -57,11 +61,23 @@ MEM_STATIC void MEM_check(void) { MEM_STATIC_ASSERT((sizeof(size_t)==4) || (size
typedef uint64_t U64;
typedef int64_t S64;
#else
+# include <limits.h>
+#if CHAR_BIT != 8
+# error "this implementation requires char to be exactly 8-bit type"
+#endif
typedef unsigned char BYTE;
+#if USHRT_MAX != 65535
+# error "this implementation requires short to be exactly 16-bit type"
+#endif
typedef unsigned short U16;
typedef signed short S16;
+#if UINT_MAX != 4294967295
+# error "this implementation requires int to be exactly 32-bit type"
+#endif
typedef unsigned int U32;
typedef signed int S32;
+/* note : there are no limits defined for long long type in C90.
+ * limits exist in C99, however, in such case, <stdint.h> is preferred */
typedef unsigned long long U64;
typedef signed long long S64;
#endif
@@ -186,7 +202,8 @@ MEM_STATIC U32 MEM_swap32(U32 in)
{
#if defined(_MSC_VER) /* Visual Studio */
return _byteswap_ulong(in);
-#elif defined (__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 403)
+#elif (defined (__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 403)) \
+ || (defined(__clang__) && __has_builtin(__builtin_bswap32))
return __builtin_bswap32(in);
#else
return ((in << 24) & 0xff000000 ) |
@@ -200,7 +217,8 @@ MEM_STATIC U64 MEM_swap64(U64 in)
{
#if defined(_MSC_VER) /* Visual Studio */
return _byteswap_uint64(in);
-#elif defined (__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 403)
+#elif (defined (__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 403)) \
+ || (defined(__clang__) && __has_builtin(__builtin_bswap64))
return __builtin_bswap64(in);
#else
return ((in << 56) & 0xff00000000000000ULL) |
diff --git a/thirdparty/zstd/common/pool.c b/thirdparty/zstd/common/pool.c
index 773488b072..7a82945432 100644
--- a/thirdparty/zstd/common/pool.c
+++ b/thirdparty/zstd/common/pool.c
@@ -10,9 +10,10 @@
/* ====== Dependencies ======= */
-#include <stddef.h> /* size_t */
-#include "pool.h"
+#include <stddef.h> /* size_t */
+#include "debug.h" /* assert */
#include "zstd_internal.h" /* ZSTD_malloc, ZSTD_free */
+#include "pool.h"
/* ====== Compiler specifics ====== */
#if defined(_MSC_VER)
@@ -33,8 +34,9 @@ typedef struct POOL_job_s {
struct POOL_ctx_s {
ZSTD_customMem customMem;
/* Keep track of the threads */
- ZSTD_pthread_t *threads;
- size_t numThreads;
+ ZSTD_pthread_t* threads;
+ size_t threadCapacity;
+ size_t threadLimit;
/* The queue is a circular buffer */
POOL_job *queue;
@@ -58,10 +60,10 @@ struct POOL_ctx_s {
};
/* POOL_thread() :
- Work thread for the thread pool.
- Waits for jobs and executes them.
- @returns : NULL on failure else non-null.
-*/
+ * Work thread for the thread pool.
+ * Waits for jobs and executes them.
+ * @returns : NULL on failure else non-null.
+ */
static void* POOL_thread(void* opaque) {
POOL_ctx* const ctx = (POOL_ctx*)opaque;
if (!ctx) { return NULL; }
@@ -69,50 +71,55 @@ static void* POOL_thread(void* opaque) {
/* Lock the mutex and wait for a non-empty queue or until shutdown */
ZSTD_pthread_mutex_lock(&ctx->queueMutex);
- while (ctx->queueEmpty && !ctx->shutdown) {
+ while ( ctx->queueEmpty
+ || (ctx->numThreadsBusy >= ctx->threadLimit) ) {
+ if (ctx->shutdown) {
+ /* even if !queueEmpty, (possible if numThreadsBusy >= threadLimit),
+ * a few threads will be shutdown while !queueEmpty,
+ * but enough threads will remain active to finish the queue */
+ ZSTD_pthread_mutex_unlock(&ctx->queueMutex);
+ return opaque;
+ }
ZSTD_pthread_cond_wait(&ctx->queuePopCond, &ctx->queueMutex);
}
- /* empty => shutting down: so stop */
- if (ctx->queueEmpty) {
- ZSTD_pthread_mutex_unlock(&ctx->queueMutex);
- return opaque;
- }
/* Pop a job off the queue */
{ POOL_job const job = ctx->queue[ctx->queueHead];
ctx->queueHead = (ctx->queueHead + 1) % ctx->queueSize;
ctx->numThreadsBusy++;
ctx->queueEmpty = ctx->queueHead == ctx->queueTail;
/* Unlock the mutex, signal a pusher, and run the job */
- ZSTD_pthread_mutex_unlock(&ctx->queueMutex);
ZSTD_pthread_cond_signal(&ctx->queuePushCond);
+ ZSTD_pthread_mutex_unlock(&ctx->queueMutex);
job.function(job.opaque);
/* If the intended queue size was 0, signal after finishing job */
+ ZSTD_pthread_mutex_lock(&ctx->queueMutex);
+ ctx->numThreadsBusy--;
if (ctx->queueSize == 1) {
- ZSTD_pthread_mutex_lock(&ctx->queueMutex);
- ctx->numThreadsBusy--;
- ZSTD_pthread_mutex_unlock(&ctx->queueMutex);
ZSTD_pthread_cond_signal(&ctx->queuePushCond);
- } }
+ }
+ ZSTD_pthread_mutex_unlock(&ctx->queueMutex);
+ }
} /* for (;;) */
- /* Unreachable */
+ assert(0); /* Unreachable */
}
POOL_ctx* POOL_create(size_t numThreads, size_t queueSize) {
return POOL_create_advanced(numThreads, queueSize, ZSTD_defaultCMem);
}
-POOL_ctx* POOL_create_advanced(size_t numThreads, size_t queueSize, ZSTD_customMem customMem) {
+POOL_ctx* POOL_create_advanced(size_t numThreads, size_t queueSize,
+ ZSTD_customMem customMem) {
POOL_ctx* ctx;
- /* Check the parameters */
+ /* Check parameters */
if (!numThreads) { return NULL; }
/* Allocate the context and zero initialize */
ctx = (POOL_ctx*)ZSTD_calloc(sizeof(POOL_ctx), customMem);
if (!ctx) { return NULL; }
/* Initialize the job queue.
- * It needs one extra space since one space is wasted to differentiate empty
- * and full queues.
+ * It needs one extra space since one space is wasted to differentiate
+ * empty and full queues.
*/
ctx->queueSize = queueSize + 1;
ctx->queue = (POOL_job*)ZSTD_malloc(ctx->queueSize * sizeof(POOL_job), customMem);
@@ -126,7 +133,7 @@ POOL_ctx* POOL_create_advanced(size_t numThreads, size_t queueSize, ZSTD_customM
ctx->shutdown = 0;
/* Allocate space for the thread handles */
ctx->threads = (ZSTD_pthread_t*)ZSTD_malloc(numThreads * sizeof(ZSTD_pthread_t), customMem);
- ctx->numThreads = 0;
+ ctx->threadCapacity = 0;
ctx->customMem = customMem;
/* Check for errors */
if (!ctx->threads || !ctx->queue) { POOL_free(ctx); return NULL; }
@@ -134,11 +141,12 @@ POOL_ctx* POOL_create_advanced(size_t numThreads, size_t queueSize, ZSTD_customM
{ size_t i;
for (i = 0; i < numThreads; ++i) {
if (ZSTD_pthread_create(&ctx->threads[i], NULL, &POOL_thread, ctx)) {
- ctx->numThreads = i;
+ ctx->threadCapacity = i;
POOL_free(ctx);
return NULL;
} }
- ctx->numThreads = numThreads;
+ ctx->threadCapacity = numThreads;
+ ctx->threadLimit = numThreads;
}
return ctx;
}
@@ -156,8 +164,8 @@ static void POOL_join(POOL_ctx* ctx) {
ZSTD_pthread_cond_broadcast(&ctx->queuePopCond);
/* Join all of the threads */
{ size_t i;
- for (i = 0; i < ctx->numThreads; ++i) {
- ZSTD_pthread_join(ctx->threads[i], NULL);
+ for (i = 0; i < ctx->threadCapacity; ++i) {
+ ZSTD_pthread_join(ctx->threads[i], NULL); /* note : could fail */
} }
}
@@ -172,24 +180,68 @@ void POOL_free(POOL_ctx *ctx) {
ZSTD_free(ctx, ctx->customMem);
}
+
+
size_t POOL_sizeof(POOL_ctx *ctx) {
if (ctx==NULL) return 0; /* supports sizeof NULL */
return sizeof(*ctx)
+ ctx->queueSize * sizeof(POOL_job)
- + ctx->numThreads * sizeof(ZSTD_pthread_t);
+ + ctx->threadCapacity * sizeof(ZSTD_pthread_t);
+}
+
+
+/* @return : 0 on success, 1 on error */
+static int POOL_resize_internal(POOL_ctx* ctx, size_t numThreads)
+{
+ if (numThreads <= ctx->threadCapacity) {
+ if (!numThreads) return 1;
+ ctx->threadLimit = numThreads;
+ return 0;
+ }
+ /* numThreads > threadCapacity */
+ { ZSTD_pthread_t* const threadPool = (ZSTD_pthread_t*)ZSTD_malloc(numThreads * sizeof(ZSTD_pthread_t), ctx->customMem);
+ if (!threadPool) return 1;
+ /* replace existing thread pool */
+ memcpy(threadPool, ctx->threads, ctx->threadCapacity * sizeof(*threadPool));
+ ZSTD_free(ctx->threads, ctx->customMem);
+ ctx->threads = threadPool;
+ /* Initialize additional threads */
+ { size_t threadId;
+ for (threadId = ctx->threadCapacity; threadId < numThreads; ++threadId) {
+ if (ZSTD_pthread_create(&threadPool[threadId], NULL, &POOL_thread, ctx)) {
+ ctx->threadCapacity = threadId;
+ return 1;
+ } }
+ } }
+ /* successfully expanded */
+ ctx->threadCapacity = numThreads;
+ ctx->threadLimit = numThreads;
+ return 0;
+}
+
+/* @return : 0 on success, 1 on error */
+int POOL_resize(POOL_ctx* ctx, size_t numThreads)
+{
+ int result;
+ if (ctx==NULL) return 1;
+ ZSTD_pthread_mutex_lock(&ctx->queueMutex);
+ result = POOL_resize_internal(ctx, numThreads);
+ ZSTD_pthread_cond_broadcast(&ctx->queuePopCond);
+ ZSTD_pthread_mutex_unlock(&ctx->queueMutex);
+ return result;
}
/**
* Returns 1 if the queue is full and 0 otherwise.
*
- * If the queueSize is 1 (the pool was created with an intended queueSize of 0),
- * then a queue is empty if there is a thread free and no job is waiting.
+ * When queueSize is 1 (pool was created with an intended queueSize of 0),
+ * then a queue is empty if there is a thread free _and_ no job is waiting.
*/
static int isQueueFull(POOL_ctx const* ctx) {
if (ctx->queueSize > 1) {
return ctx->queueHead == ((ctx->queueTail + 1) % ctx->queueSize);
} else {
- return ctx->numThreadsBusy == ctx->numThreads ||
+ return (ctx->numThreadsBusy == ctx->threadLimit) ||
!ctx->queueEmpty;
}
}
@@ -263,6 +315,11 @@ void POOL_free(POOL_ctx* ctx) {
(void)ctx;
}
+int POOL_resize(POOL_ctx* ctx, size_t numThreads) {
+ (void)ctx; (void)numThreads;
+ return 0;
+}
+
void POOL_add(POOL_ctx* ctx, POOL_function function, void* opaque) {
(void)ctx;
function(opaque);
diff --git a/thirdparty/zstd/common/pool.h b/thirdparty/zstd/common/pool.h
index a57e9b4fab..458d37f13c 100644
--- a/thirdparty/zstd/common/pool.h
+++ b/thirdparty/zstd/common/pool.h
@@ -30,40 +30,50 @@ typedef struct POOL_ctx_s POOL_ctx;
*/
POOL_ctx* POOL_create(size_t numThreads, size_t queueSize);
-POOL_ctx* POOL_create_advanced(size_t numThreads, size_t queueSize, ZSTD_customMem customMem);
+POOL_ctx* POOL_create_advanced(size_t numThreads, size_t queueSize,
+ ZSTD_customMem customMem);
/*! POOL_free() :
- Free a thread pool returned by POOL_create().
-*/
+ * Free a thread pool returned by POOL_create().
+ */
void POOL_free(POOL_ctx* ctx);
+/*! POOL_resize() :
+ * Expands or shrinks pool's number of threads.
+ * This is more efficient than releasing + creating a new context,
+ * since it tries to preserve and re-use existing threads.
+ * `numThreads` must be at least 1.
+ * @return : 0 when resize was successful,
+ * !0 (typically 1) if there is an error.
+ * note : only numThreads can be resized, queueSize remains unchanged.
+ */
+int POOL_resize(POOL_ctx* ctx, size_t numThreads);
+
/*! POOL_sizeof() :
- return memory usage of pool returned by POOL_create().
-*/
+ * @return threadpool memory usage
+ * note : compatible with NULL (returns 0 in this case)
+ */
size_t POOL_sizeof(POOL_ctx* ctx);
/*! POOL_function :
- The function type that can be added to a thread pool.
-*/
+ * The function type that can be added to a thread pool.
+ */
typedef void (*POOL_function)(void*);
-/*! POOL_add_function :
- The function type for a generic thread pool add function.
-*/
-typedef void (*POOL_add_function)(void*, POOL_function, void*);
/*! POOL_add() :
- Add the job `function(opaque)` to the thread pool. `ctx` must be valid.
- Possibly blocks until there is room in the queue.
- Note : The function may be executed asynchronously, so `opaque` must live until the function has been completed.
-*/
+ * Add the job `function(opaque)` to the thread pool. `ctx` must be valid.
+ * Possibly blocks until there is room in the queue.
+ * Note : The function may be executed asynchronously,
+ * therefore, `opaque` must live until function has been completed.
+ */
void POOL_add(POOL_ctx* ctx, POOL_function function, void* opaque);
/*! POOL_tryAdd() :
- Add the job `function(opaque)` to the thread pool if a worker is available.
- return immediately otherwise.
- @return : 1 if successful, 0 if not.
-*/
+ * Add the job `function(opaque)` to thread pool _if_ a worker is available.
+ * Returns immediately even if not (does not block).
+ * @return : 1 if successful, 0 if not.
+ */
int POOL_tryAdd(POOL_ctx* ctx, POOL_function function, void* opaque);
diff --git a/thirdparty/zstd/common/xxhash.c b/thirdparty/zstd/common/xxhash.c
index 9d9c0e963c..532b816192 100644
--- a/thirdparty/zstd/common/xxhash.c
+++ b/thirdparty/zstd/common/xxhash.c
@@ -98,6 +98,7 @@
/* Modify the local functions below should you wish to use some other memory routines */
/* for malloc(), free() */
#include <stdlib.h>
+#include <stddef.h> /* size_t */
static void* XXH_malloc(size_t s) { return malloc(s); }
static void XXH_free (void* p) { free(p); }
/* for memcpy() */
diff --git a/thirdparty/zstd/common/zstd_common.c b/thirdparty/zstd/common/zstd_common.c
index bccc948892..667f4a27fc 100644
--- a/thirdparty/zstd/common/zstd_common.c
+++ b/thirdparty/zstd/common/zstd_common.c
@@ -30,8 +30,10 @@ const char* ZSTD_versionString(void) { return ZSTD_VERSION_STRING; }
/*-****************************************
* ZSTD Error Management
******************************************/
+#undef ZSTD_isError /* defined within zstd_internal.h */
/*! ZSTD_isError() :
- * tells if a return value is an error code */
+ * tells if a return value is an error code
+ * symbol is required for external callers */
unsigned ZSTD_isError(size_t code) { return ERR_isError(code); }
/*! ZSTD_getErrorName() :
@@ -46,11 +48,6 @@ ZSTD_ErrorCode ZSTD_getErrorCode(size_t code) { return ERR_getErrorCode(code); }
* provides error code string from enum */
const char* ZSTD_getErrorString(ZSTD_ErrorCode code) { return ERR_getErrorString(code); }
-/*! g_debuglog_enable :
- * turn on/off debug traces (global switch) */
-#if defined(ZSTD_DEBUG) && (ZSTD_DEBUG >= 2)
-int g_debuglog_enable = 1;
-#endif
/*=**************************************************************
diff --git a/thirdparty/zstd/common/zstd_errors.h b/thirdparty/zstd/common/zstd_errors.h
index 57533f2869..92a3433896 100644
--- a/thirdparty/zstd/common/zstd_errors.h
+++ b/thirdparty/zstd/common/zstd_errors.h
@@ -72,6 +72,7 @@ typedef enum {
ZSTD_error_workSpace_tooSmall= 66,
ZSTD_error_dstSize_tooSmall = 70,
ZSTD_error_srcSize_wrong = 72,
+ ZSTD_error_dstBuffer_null = 74,
/* following error codes are __NOT STABLE__, they can be removed or changed in future versions */
ZSTD_error_frameIndex_tooLarge = 100,
ZSTD_error_seekableIO = 102,
diff --git a/thirdparty/zstd/common/zstd_internal.h b/thirdparty/zstd/common/zstd_internal.h
index 65c08a8257..edeb74b9c3 100644
--- a/thirdparty/zstd/common/zstd_internal.h
+++ b/thirdparty/zstd/common/zstd_internal.h
@@ -21,6 +21,7 @@
***************************************/
#include "compiler.h"
#include "mem.h"
+#include "debug.h" /* assert, DEBUGLOG, RAWLOG, g_debuglevel */
#include "error_private.h"
#define ZSTD_STATIC_LINKING_ONLY
#include "zstd.h"
@@ -38,43 +39,11 @@
extern "C" {
#endif
-
-/*-*************************************
-* Debug
-***************************************/
-#if defined(ZSTD_DEBUG) && (ZSTD_DEBUG>=1)
-# include <assert.h>
-#else
-# ifndef assert
-# define assert(condition) ((void)0)
-# endif
-#endif
-
-#define ZSTD_STATIC_ASSERT(c) { enum { ZSTD_static_assert = 1/(int)(!!(c)) }; }
-
-#if defined(ZSTD_DEBUG) && (ZSTD_DEBUG>=2)
-# include <stdio.h>
-extern int g_debuglog_enable;
-/* recommended values for ZSTD_DEBUG display levels :
- * 1 : no display, enables assert() only
- * 2 : reserved for currently active debug path
- * 3 : events once per object lifetime (CCtx, CDict, etc.)
- * 4 : events once per frame
- * 5 : events once per block
- * 6 : events once per sequence (*very* verbose) */
-# define RAWLOG(l, ...) { \
- if ((g_debuglog_enable) & (l<=ZSTD_DEBUG)) { \
- fprintf(stderr, __VA_ARGS__); \
- } }
-# define DEBUGLOG(l, ...) { \
- if ((g_debuglog_enable) & (l<=ZSTD_DEBUG)) { \
- fprintf(stderr, __FILE__ ": " __VA_ARGS__); \
- fprintf(stderr, " \n"); \
- } }
-#else
-# define RAWLOG(l, ...) {} /* disabled */
-# define DEBUGLOG(l, ...) {} /* disabled */
-#endif
+/* ---- static assert (debug) --- */
+#define ZSTD_STATIC_ASSERT(c) DEBUG_STATIC_ASSERT(c)
+#define ZSTD_isError ERR_isError /* for inlining */
+#define FSE_isError ERR_isError
+#define HUF_isError ERR_isError
/*-*************************************
@@ -109,12 +78,10 @@ static const U32 repStartValue[ZSTD_REP_NUM] = { 1, 4, 8 };
#define BIT0 1
#define ZSTD_WINDOWLOG_ABSOLUTEMIN 10
-#define ZSTD_WINDOWLOG_DEFAULTMAX 27 /* Default maximum allowed window log */
static const size_t ZSTD_fcs_fieldSize[4] = { 0, 2, 4, 8 };
static const size_t ZSTD_did_fieldSize[4] = { 0, 1, 2, 4 };
-#define ZSTD_FRAMEIDSIZE 4
-static const size_t ZSTD_frameIdSize = ZSTD_FRAMEIDSIZE; /* magic number size */
+#define ZSTD_FRAMEIDSIZE 4 /* magic number size */
#define ZSTD_BLOCKHEADERSIZE 3 /* C standard doesn't allow `static const` variable to be init using another `static const` variable */
static const size_t ZSTD_blockHeaderSize = ZSTD_BLOCKHEADERSIZE;
@@ -227,6 +194,8 @@ typedef struct {
BYTE* llCode;
BYTE* mlCode;
BYTE* ofCode;
+ size_t maxNbSeq;
+ size_t maxNbLit;
U32 longLengthID; /* 0 == no longLength; 1 == Lit.longLength; 2 == Match.longLength; */
U32 longLengthPos;
} seqStore_t;
@@ -275,7 +244,7 @@ typedef struct {
blockType_e blockType;
U32 lastBlock;
U32 origSize;
-} blockProperties_t;
+} blockProperties_t; /* declared here for decompress and fullbench */
/*! ZSTD_getcBlockSize() :
* Provides the size of compressed block from block header `src` */
@@ -283,6 +252,13 @@ typedef struct {
size_t ZSTD_getcBlockSize(const void* src, size_t srcSize,
blockProperties_t* bpPtr);
+/*! ZSTD_decodeSeqHeaders() :
+ * decode sequence header from src */
+/* Used by: decompress, fullbench (does not get its definition from here) */
+size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr,
+ const void* src, size_t srcSize);
+
+
#if defined (__cplusplus)
}
#endif
diff --git a/thirdparty/zstd/compress/fse_compress.c b/thirdparty/zstd/compress/fse_compress.c
index cb8f1fa323..60f357bbd2 100644
--- a/thirdparty/zstd/compress/fse_compress.c
+++ b/thirdparty/zstd/compress/fse_compress.c
@@ -1,6 +1,6 @@
/* ******************************************************************
FSE : Finite State Entropy encoder
- Copyright (C) 2013-2015, Yann Collet.
+ Copyright (C) 2013-present, Yann Collet.
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
@@ -37,9 +37,11 @@
****************************************************************/
#include <stdlib.h> /* malloc, free, qsort */
#include <string.h> /* memcpy, memset */
-#include <stdio.h> /* printf (debug) */
-#include "bitstream.h"
#include "compiler.h"
+#include "mem.h" /* U32, U16, etc. */
+#include "debug.h" /* assert, DEBUGLOG */
+#include "hist.h" /* HIST_count_wksp */
+#include "bitstream.h"
#define FSE_STATIC_LINKING_ONLY
#include "fse.h"
#include "error_private.h"
@@ -49,7 +51,6 @@
* Error Management
****************************************************************/
#define FSE_isError ERR_isError
-#define FSE_STATIC_ASSERT(c) { enum { FSE_static_assert = 1/(int)(!!(c)) }; } /* use only *after* variable declarations */
/* **************************************************************
@@ -82,7 +83,9 @@
* wkspSize should be sized to handle worst case situation, which is `1<<max_tableLog * sizeof(FSE_FUNCTION_TYPE)`
* workSpace must also be properly aligned with FSE_FUNCTION_TYPE requirements
*/
-size_t FSE_buildCTable_wksp(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize)
+size_t FSE_buildCTable_wksp(FSE_CTable* ct,
+ const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog,
+ void* workSpace, size_t wkspSize)
{
U32 const tableSize = 1 << tableLog;
U32 const tableMask = tableSize - 1;
@@ -100,14 +103,19 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, const short* normalizedCounter, unsi
if (((size_t)1 << tableLog) * sizeof(FSE_FUNCTION_TYPE) > wkspSize) return ERROR(tableLog_tooLarge);
tableU16[-2] = (U16) tableLog;
tableU16[-1] = (U16) maxSymbolValue;
+ assert(tableLog < 16); /* required for threshold strategy to work */
/* For explanations on how to distribute symbol values over the table :
- * http://fastcompression.blogspot.fr/2014/02/fse-distributing-symbol-values.html */
+ * http://fastcompression.blogspot.fr/2014/02/fse-distributing-symbol-values.html */
+
+ #ifdef __clang_analyzer__
+ memset(tableSymbol, 0, sizeof(*tableSymbol) * tableSize); /* useless initialization, just to keep scan-build happy */
+ #endif
/* symbol start positions */
{ U32 u;
cumul[0] = 0;
- for (u=1; u<=maxSymbolValue+1; u++) {
+ for (u=1; u <= maxSymbolValue+1; u++) {
if (normalizedCounter[u-1]==-1) { /* Low proba symbol */
cumul[u] = cumul[u-1] + 1;
tableSymbol[highThreshold--] = (FSE_FUNCTION_TYPE)(u-1);
@@ -122,13 +130,15 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, const short* normalizedCounter, unsi
U32 symbol;
for (symbol=0; symbol<=maxSymbolValue; symbol++) {
int nbOccurences;
- for (nbOccurences=0; nbOccurences<normalizedCounter[symbol]; nbOccurences++) {
+ int const freq = normalizedCounter[symbol];
+ for (nbOccurences=0; nbOccurences<freq; nbOccurences++) {
tableSymbol[position] = (FSE_FUNCTION_TYPE)symbol;
position = (position + step) & tableMask;
- while (position > highThreshold) position = (position + step) & tableMask; /* Low proba area */
+ while (position > highThreshold)
+ position = (position + step) & tableMask; /* Low proba area */
} }
- if (position!=0) return ERROR(GENERIC); /* Must have gone through all positions */
+ assert(position==0); /* Must have initialized all positions */
}
/* Build table */
@@ -143,7 +153,10 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, const short* normalizedCounter, unsi
for (s=0; s<=maxSymbolValue; s++) {
switch (normalizedCounter[s])
{
- case 0: break;
+ case 0:
+ /* filling nonetheless, for compatibility with FSE_getMaxNbBits() */
+ symbolTT[s].deltaNbBits = ((tableLog+1) << 16) - (1<<tableLog);
+ break;
case -1:
case 1:
@@ -160,6 +173,18 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, const short* normalizedCounter, unsi
total += normalizedCounter[s];
} } } }
+#if 0 /* debug : symbol costs */
+ DEBUGLOG(5, "\n --- table statistics : ");
+ { U32 symbol;
+ for (symbol=0; symbol<=maxSymbolValue; symbol++) {
+ DEBUGLOG(5, "%3u: w=%3i, maxBits=%u, fracBits=%.2f",
+ symbol, normalizedCounter[symbol],
+ FSE_getMaxNbBits(symbolTT, symbol),
+ (double)FSE_bitCost(symbolTT, tableLog, symbol, 8) / 256);
+ }
+ }
+#endif
+
return 0;
}
@@ -174,8 +199,9 @@ size_t FSE_buildCTable(FSE_CTable* ct, const short* normalizedCounter, unsigned
#ifndef FSE_COMMONDEFS_ONLY
+
/*-**************************************************************
-* FSE NCount encoding-decoding
+* FSE NCount encoding
****************************************************************/
size_t FSE_NCountWriteBound(unsigned maxSymbolValue, unsigned tableLog)
{
@@ -183,9 +209,10 @@ size_t FSE_NCountWriteBound(unsigned maxSymbolValue, unsigned tableLog)
return maxSymbolValue ? maxHeaderSize : FSE_NCOUNTBOUND; /* maxSymbolValue==0 ? use default */
}
-static size_t FSE_writeNCount_generic (void* header, size_t headerBufferSize,
- const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog,
- unsigned writeIsSafe)
+static size_t
+FSE_writeNCount_generic (void* header, size_t headerBufferSize,
+ const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog,
+ unsigned writeIsSafe)
{
BYTE* const ostart = (BYTE*) header;
BYTE* out = ostart;
@@ -194,13 +221,12 @@ static size_t FSE_writeNCount_generic (void* header, size_t headerBufferSize,
const int tableSize = 1 << tableLog;
int remaining;
int threshold;
- U32 bitStream;
- int bitCount;
- unsigned charnum = 0;
- int previous0 = 0;
+ U32 bitStream = 0;
+ int bitCount = 0;
+ unsigned symbol = 0;
+ unsigned const alphabetSize = maxSymbolValue + 1;
+ int previousIs0 = 0;
- bitStream = 0;
- bitCount = 0;
/* Table Size */
bitStream += (tableLog-FSE_MIN_TABLELOG) << bitCount;
bitCount += 4;
@@ -210,48 +236,53 @@ static size_t FSE_writeNCount_generic (void* header, size_t headerBufferSize,
threshold = tableSize;
nbBits = tableLog+1;
- while (remaining>1) { /* stops at 1 */
- if (previous0) {
- unsigned start = charnum;
- while (!normalizedCounter[charnum]) charnum++;
- while (charnum >= start+24) {
+ while ((symbol < alphabetSize) && (remaining>1)) { /* stops at 1 */
+ if (previousIs0) {
+ unsigned start = symbol;
+ while ((symbol < alphabetSize) && !normalizedCounter[symbol]) symbol++;
+ if (symbol == alphabetSize) break; /* incorrect distribution */
+ while (symbol >= start+24) {
start+=24;
bitStream += 0xFFFFU << bitCount;
- if ((!writeIsSafe) && (out > oend-2)) return ERROR(dstSize_tooSmall); /* Buffer overflow */
+ if ((!writeIsSafe) && (out > oend-2))
+ return ERROR(dstSize_tooSmall); /* Buffer overflow */
out[0] = (BYTE) bitStream;
out[1] = (BYTE)(bitStream>>8);
out+=2;
bitStream>>=16;
}
- while (charnum >= start+3) {
+ while (symbol >= start+3) {
start+=3;
bitStream += 3 << bitCount;
bitCount += 2;
}
- bitStream += (charnum-start) << bitCount;
+ bitStream += (symbol-start) << bitCount;
bitCount += 2;
if (bitCount>16) {
- if ((!writeIsSafe) && (out > oend - 2)) return ERROR(dstSize_tooSmall); /* Buffer overflow */
+ if ((!writeIsSafe) && (out > oend - 2))
+ return ERROR(dstSize_tooSmall); /* Buffer overflow */
out[0] = (BYTE)bitStream;
out[1] = (BYTE)(bitStream>>8);
out += 2;
bitStream >>= 16;
bitCount -= 16;
} }
- { int count = normalizedCounter[charnum++];
- int const max = (2*threshold-1)-remaining;
+ { int count = normalizedCounter[symbol++];
+ int const max = (2*threshold-1) - remaining;
remaining -= count < 0 ? -count : count;
count++; /* +1 for extra accuracy */
- if (count>=threshold) count += max; /* [0..max[ [max..threshold[ (...) [threshold+max 2*threshold[ */
+ if (count>=threshold)
+ count += max; /* [0..max[ [max..threshold[ (...) [threshold+max 2*threshold[ */
bitStream += count << bitCount;
bitCount += nbBits;
bitCount -= (count<max);
- previous0 = (count==1);
+ previousIs0 = (count==1);
if (remaining<1) return ERROR(GENERIC);
while (remaining<threshold) { nbBits--; threshold>>=1; }
}
if (bitCount>16) {
- if ((!writeIsSafe) && (out > oend - 2)) return ERROR(dstSize_tooSmall); /* Buffer overflow */
+ if ((!writeIsSafe) && (out > oend - 2))
+ return ERROR(dstSize_tooSmall); /* Buffer overflow */
out[0] = (BYTE)bitStream;
out[1] = (BYTE)(bitStream>>8);
out += 2;
@@ -259,19 +290,23 @@ static size_t FSE_writeNCount_generic (void* header, size_t headerBufferSize,
bitCount -= 16;
} }
+ if (remaining != 1)
+ return ERROR(GENERIC); /* incorrect normalized distribution */
+ assert(symbol <= alphabetSize);
+
/* flush remaining bitStream */
- if ((!writeIsSafe) && (out > oend - 2)) return ERROR(dstSize_tooSmall); /* Buffer overflow */
+ if ((!writeIsSafe) && (out > oend - 2))
+ return ERROR(dstSize_tooSmall); /* Buffer overflow */
out[0] = (BYTE)bitStream;
out[1] = (BYTE)(bitStream>>8);
out+= (bitCount+7) /8;
- if (charnum > maxSymbolValue + 1) return ERROR(GENERIC);
-
return (out-ostart);
}
-size_t FSE_writeNCount (void* buffer, size_t bufferSize, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog)
+size_t FSE_writeNCount (void* buffer, size_t bufferSize,
+ const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog)
{
if (tableLog > FSE_MAX_TABLELOG) return ERROR(tableLog_tooLarge); /* Unsupported */
if (tableLog < FSE_MIN_TABLELOG) return ERROR(GENERIC); /* Unsupported */
@@ -279,179 +314,13 @@ size_t FSE_writeNCount (void* buffer, size_t bufferSize, const short* normalized
if (bufferSize < FSE_NCountWriteBound(maxSymbolValue, tableLog))
return FSE_writeNCount_generic(buffer, bufferSize, normalizedCounter, maxSymbolValue, tableLog, 0);
- return FSE_writeNCount_generic(buffer, bufferSize, normalizedCounter, maxSymbolValue, tableLog, 1);
-}
-
-
-
-/*-**************************************************************
-* Counting histogram
-****************************************************************/
-/*! FSE_count_simple
- This function counts byte values within `src`, and store the histogram into table `count`.
- It doesn't use any additional memory.
- But this function is unsafe : it doesn't check that all values within `src` can fit into `count`.
- For this reason, prefer using a table `count` with 256 elements.
- @return : count of most numerous element.
-*/
-size_t FSE_count_simple(unsigned* count, unsigned* maxSymbolValuePtr,
- const void* src, size_t srcSize)
-{
- const BYTE* ip = (const BYTE*)src;
- const BYTE* const end = ip + srcSize;
- unsigned maxSymbolValue = *maxSymbolValuePtr;
- unsigned max=0;
-
- memset(count, 0, (maxSymbolValue+1)*sizeof(*count));
- if (srcSize==0) { *maxSymbolValuePtr = 0; return 0; }
-
- while (ip<end) {
- assert(*ip <= maxSymbolValue);
- count[*ip++]++;
- }
-
- while (!count[maxSymbolValue]) maxSymbolValue--;
- *maxSymbolValuePtr = maxSymbolValue;
-
- { U32 s; for (s=0; s<=maxSymbolValue; s++) if (count[s] > max) max = count[s]; }
-
- return (size_t)max;
-}
-
-
-/* FSE_count_parallel_wksp() :
- * Same as FSE_count_parallel(), but using an externally provided scratch buffer.
- * `workSpace` size must be a minimum of `1024 * sizeof(unsigned)`.
- * @return : largest histogram frequency, or an error code (notably when histogram would be larger than *maxSymbolValuePtr). */
-static size_t FSE_count_parallel_wksp(
- unsigned* count, unsigned* maxSymbolValuePtr,
- const void* source, size_t sourceSize,
- unsigned checkMax, unsigned* const workSpace)
-{
- const BYTE* ip = (const BYTE*)source;
- const BYTE* const iend = ip+sourceSize;
- unsigned maxSymbolValue = *maxSymbolValuePtr;
- unsigned max=0;
- U32* const Counting1 = workSpace;
- U32* const Counting2 = Counting1 + 256;
- U32* const Counting3 = Counting2 + 256;
- U32* const Counting4 = Counting3 + 256;
-
- memset(workSpace, 0, 4*256*sizeof(unsigned));
-
- /* safety checks */
- if (!sourceSize) {
- memset(count, 0, maxSymbolValue + 1);
- *maxSymbolValuePtr = 0;
- return 0;
- }
- if (!maxSymbolValue) maxSymbolValue = 255; /* 0 == default */
-
- /* by stripes of 16 bytes */
- { U32 cached = MEM_read32(ip); ip += 4;
- while (ip < iend-15) {
- U32 c = cached; cached = MEM_read32(ip); ip += 4;
- Counting1[(BYTE) c ]++;
- Counting2[(BYTE)(c>>8) ]++;
- Counting3[(BYTE)(c>>16)]++;
- Counting4[ c>>24 ]++;
- c = cached; cached = MEM_read32(ip); ip += 4;
- Counting1[(BYTE) c ]++;
- Counting2[(BYTE)(c>>8) ]++;
- Counting3[(BYTE)(c>>16)]++;
- Counting4[ c>>24 ]++;
- c = cached; cached = MEM_read32(ip); ip += 4;
- Counting1[(BYTE) c ]++;
- Counting2[(BYTE)(c>>8) ]++;
- Counting3[(BYTE)(c>>16)]++;
- Counting4[ c>>24 ]++;
- c = cached; cached = MEM_read32(ip); ip += 4;
- Counting1[(BYTE) c ]++;
- Counting2[(BYTE)(c>>8) ]++;
- Counting3[(BYTE)(c>>16)]++;
- Counting4[ c>>24 ]++;
- }
- ip-=4;
- }
-
- /* finish last symbols */
- while (ip<iend) Counting1[*ip++]++;
-
- if (checkMax) { /* verify stats will fit into destination table */
- U32 s; for (s=255; s>maxSymbolValue; s--) {
- Counting1[s] += Counting2[s] + Counting3[s] + Counting4[s];
- if (Counting1[s]) return ERROR(maxSymbolValue_tooSmall);
- } }
-
- { U32 s;
- if (maxSymbolValue > 255) maxSymbolValue = 255;
- for (s=0; s<=maxSymbolValue; s++) {
- count[s] = Counting1[s] + Counting2[s] + Counting3[s] + Counting4[s];
- if (count[s] > max) max = count[s];
- } }
-
- while (!count[maxSymbolValue]) maxSymbolValue--;
- *maxSymbolValuePtr = maxSymbolValue;
- return (size_t)max;
-}
-
-/* FSE_countFast_wksp() :
- * Same as FSE_countFast(), but using an externally provided scratch buffer.
- * `workSpace` size must be table of >= `1024` unsigned */
-size_t FSE_countFast_wksp(unsigned* count, unsigned* maxSymbolValuePtr,
- const void* source, size_t sourceSize,
- unsigned* workSpace)
-{
- if (sourceSize < 1500) /* heuristic threshold */
- return FSE_count_simple(count, maxSymbolValuePtr, source, sourceSize);
- return FSE_count_parallel_wksp(count, maxSymbolValuePtr, source, sourceSize, 0, workSpace);
-}
-
-/* fast variant (unsafe : won't check if src contains values beyond count[] limit) */
-size_t FSE_countFast(unsigned* count, unsigned* maxSymbolValuePtr,
- const void* source, size_t sourceSize)
-{
- unsigned tmpCounters[1024];
- return FSE_countFast_wksp(count, maxSymbolValuePtr, source, sourceSize, tmpCounters);
-}
-
-/* FSE_count_wksp() :
- * Same as FSE_count(), but using an externally provided scratch buffer.
- * `workSpace` size must be table of >= `1024` unsigned */
-size_t FSE_count_wksp(unsigned* count, unsigned* maxSymbolValuePtr,
- const void* source, size_t sourceSize, unsigned* workSpace)
-{
- if (*maxSymbolValuePtr < 255)
- return FSE_count_parallel_wksp(count, maxSymbolValuePtr, source, sourceSize, 1, workSpace);
- *maxSymbolValuePtr = 255;
- return FSE_countFast_wksp(count, maxSymbolValuePtr, source, sourceSize, workSpace);
-}
-
-size_t FSE_count(unsigned* count, unsigned* maxSymbolValuePtr,
- const void* src, size_t srcSize)
-{
- unsigned tmpCounters[1024];
- return FSE_count_wksp(count, maxSymbolValuePtr, src, srcSize, tmpCounters);
+ return FSE_writeNCount_generic(buffer, bufferSize, normalizedCounter, maxSymbolValue, tableLog, 1 /* write in buffer is safe */);
}
-
/*-**************************************************************
* FSE Compression Code
****************************************************************/
-/*! FSE_sizeof_CTable() :
- FSE_CTable is a variable size structure which contains :
- `U16 tableLog;`
- `U16 maxSymbolValue;`
- `U16 nextStateNumber[1 << tableLog];` // This size is variable
- `FSE_symbolCompressionTransform symbolTT[maxSymbolValue+1];` // This size is variable
-Allocation is manual (C standard does not support variable-size structures).
-*/
-size_t FSE_sizeof_CTable (unsigned maxSymbolValue, unsigned tableLog)
-{
- if (tableLog > FSE_MAX_TABLELOG) return ERROR(tableLog_tooLarge);
- return FSE_CTABLE_SIZE_U32 (tableLog, maxSymbolValue) * sizeof(U32);
-}
FSE_CTable* FSE_createCTable (unsigned maxSymbolValue, unsigned tableLog)
{
@@ -466,7 +335,7 @@ void FSE_freeCTable (FSE_CTable* ct) { free(ct); }
/* provides the minimum logSize to safely represent a distribution */
static unsigned FSE_minTableLog(size_t srcSize, unsigned maxSymbolValue)
{
- U32 minBitsSrc = BIT_highbit32((U32)(srcSize - 1)) + 1;
+ U32 minBitsSrc = BIT_highbit32((U32)(srcSize)) + 1;
U32 minBitsSymbols = BIT_highbit32(maxSymbolValue) + 2;
U32 minBits = minBitsSrc < minBitsSymbols ? minBitsSrc : minBitsSymbols;
assert(srcSize > 1); /* Not supported, RLE should be used instead */
@@ -529,6 +398,9 @@ static size_t FSE_normalizeM2(short* norm, U32 tableLog, const unsigned* count,
}
ToDistribute = (1 << tableLog) - distributed;
+ if (ToDistribute == 0)
+ return 0;
+
if ((total / ToDistribute) > lowOne) {
/* risk of rounding to zero */
lowOne = (U32)((total * 3) / (ToDistribute * 2));
@@ -629,11 +501,11 @@ size_t FSE_normalizeCount (short* normalizedCounter, unsigned tableLog,
U32 s;
U32 nTotal = 0;
for (s=0; s<=maxSymbolValue; s++)
- printf("%3i: %4i \n", s, normalizedCounter[s]);
+ RAWLOG(2, "%3i: %4i \n", s, normalizedCounter[s]);
for (s=0; s<=maxSymbolValue; s++)
nTotal += abs(normalizedCounter[s]);
if (nTotal != (1U<<tableLog))
- printf("Warning !!! Total == %u != %u !!!", nTotal, 1U<<tableLog);
+ RAWLOG(2, "Warning !!! Total == %u != %u !!!", nTotal, 1U<<tableLog);
getchar();
}
#endif
@@ -786,7 +658,7 @@ size_t FSE_compress_wksp (void* dst, size_t dstSize, const void* src, size_t src
BYTE* op = ostart;
BYTE* const oend = ostart + dstSize;
- U32 count[FSE_MAX_SYMBOL_VALUE+1];
+ unsigned count[FSE_MAX_SYMBOL_VALUE+1];
S16 norm[FSE_MAX_SYMBOL_VALUE+1];
FSE_CTable* CTable = (FSE_CTable*)workSpace;
size_t const CTableSize = FSE_CTABLE_SIZE_U32(tableLog, maxSymbolValue);
@@ -800,7 +672,7 @@ size_t FSE_compress_wksp (void* dst, size_t dstSize, const void* src, size_t src
if (!tableLog) tableLog = FSE_DEFAULT_TABLELOG;
/* Scan input and build symbol stats */
- { CHECK_V_F(maxCount, FSE_count_wksp(count, &maxSymbolValue, src, srcSize, (unsigned*)scratchBuffer) );
+ { CHECK_V_F(maxCount, HIST_count_wksp(count, &maxSymbolValue, src, srcSize, scratchBuffer, scratchBufferSize) );
if (maxCount == srcSize) return 1; /* only a single symbol in src : rle */
if (maxCount == 1) return 0; /* each symbol present maximum once => not compressible */
if (maxCount < (srcSize >> 7)) return 0; /* Heuristic : not compressible enough */
@@ -835,7 +707,7 @@ typedef struct {
size_t FSE_compress2 (void* dst, size_t dstCapacity, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog)
{
fseWkspMax_t scratchBuffer;
- FSE_STATIC_ASSERT(sizeof(scratchBuffer) >= FSE_WKSP_SIZE_U32(FSE_MAX_TABLELOG, FSE_MAX_SYMBOL_VALUE)); /* compilation failures here means scratchBuffer is not large enough */
+ DEBUG_STATIC_ASSERT(sizeof(scratchBuffer) >= FSE_WKSP_SIZE_U32(FSE_MAX_TABLELOG, FSE_MAX_SYMBOL_VALUE)); /* compilation failures here means scratchBuffer is not large enough */
if (tableLog > FSE_MAX_TABLELOG) return ERROR(tableLog_tooLarge);
return FSE_compress_wksp(dst, dstCapacity, src, srcSize, maxSymbolValue, tableLog, &scratchBuffer, sizeof(scratchBuffer));
}
diff --git a/thirdparty/zstd/compress/hist.c b/thirdparty/zstd/compress/hist.c
new file mode 100644
index 0000000000..45b7babc1e
--- /dev/null
+++ b/thirdparty/zstd/compress/hist.c
@@ -0,0 +1,203 @@
+/* ******************************************************************
+ hist : Histogram functions
+ part of Finite State Entropy project
+ Copyright (C) 2013-present, Yann Collet.
+
+ BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
+
+ 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.
+
+ 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.
+
+ You can contact the author at :
+ - FSE source repository : https://github.com/Cyan4973/FiniteStateEntropy
+ - Public forum : https://groups.google.com/forum/#!forum/lz4c
+****************************************************************** */
+
+/* --- dependencies --- */
+#include "mem.h" /* U32, BYTE, etc. */
+#include "debug.h" /* assert, DEBUGLOG */
+#include "error_private.h" /* ERROR */
+#include "hist.h"
+
+
+/* --- Error management --- */
+unsigned HIST_isError(size_t code) { return ERR_isError(code); }
+
+/*-**************************************************************
+ * Histogram functions
+ ****************************************************************/
+unsigned HIST_count_simple(unsigned* count, unsigned* maxSymbolValuePtr,
+ const void* src, size_t srcSize)
+{
+ const BYTE* ip = (const BYTE*)src;
+ const BYTE* const end = ip + srcSize;
+ unsigned maxSymbolValue = *maxSymbolValuePtr;
+ unsigned largestCount=0;
+
+ memset(count, 0, (maxSymbolValue+1) * sizeof(*count));
+ if (srcSize==0) { *maxSymbolValuePtr = 0; return 0; }
+
+ while (ip<end) {
+ assert(*ip <= maxSymbolValue);
+ count[*ip++]++;
+ }
+
+ while (!count[maxSymbolValue]) maxSymbolValue--;
+ *maxSymbolValuePtr = maxSymbolValue;
+
+ { U32 s;
+ for (s=0; s<=maxSymbolValue; s++)
+ if (count[s] > largestCount) largestCount = count[s];
+ }
+
+ return largestCount;
+}
+
+typedef enum { trustInput, checkMaxSymbolValue } HIST_checkInput_e;
+
+/* HIST_count_parallel_wksp() :
+ * store histogram into 4 intermediate tables, recombined at the end.
+ * this design makes better use of OoO cpus,
+ * and is noticeably faster when some values are heavily repeated.
+ * But it needs some additional workspace for intermediate tables.
+ * `workSpace` size must be a table of size >= HIST_WKSP_SIZE_U32.
+ * @return : largest histogram frequency,
+ * or an error code (notably when histogram would be larger than *maxSymbolValuePtr). */
+static size_t HIST_count_parallel_wksp(
+ unsigned* count, unsigned* maxSymbolValuePtr,
+ const void* source, size_t sourceSize,
+ HIST_checkInput_e check,
+ U32* const workSpace)
+{
+ const BYTE* ip = (const BYTE*)source;
+ const BYTE* const iend = ip+sourceSize;
+ unsigned maxSymbolValue = *maxSymbolValuePtr;
+ unsigned max=0;
+ U32* const Counting1 = workSpace;
+ U32* const Counting2 = Counting1 + 256;
+ U32* const Counting3 = Counting2 + 256;
+ U32* const Counting4 = Counting3 + 256;
+
+ memset(workSpace, 0, 4*256*sizeof(unsigned));
+
+ /* safety checks */
+ if (!sourceSize) {
+ memset(count, 0, maxSymbolValue + 1);
+ *maxSymbolValuePtr = 0;
+ return 0;
+ }
+ if (!maxSymbolValue) maxSymbolValue = 255; /* 0 == default */
+
+ /* by stripes of 16 bytes */
+ { U32 cached = MEM_read32(ip); ip += 4;
+ while (ip < iend-15) {
+ U32 c = cached; cached = MEM_read32(ip); ip += 4;
+ Counting1[(BYTE) c ]++;
+ Counting2[(BYTE)(c>>8) ]++;
+ Counting3[(BYTE)(c>>16)]++;
+ Counting4[ c>>24 ]++;
+ c = cached; cached = MEM_read32(ip); ip += 4;
+ Counting1[(BYTE) c ]++;
+ Counting2[(BYTE)(c>>8) ]++;
+ Counting3[(BYTE)(c>>16)]++;
+ Counting4[ c>>24 ]++;
+ c = cached; cached = MEM_read32(ip); ip += 4;
+ Counting1[(BYTE) c ]++;
+ Counting2[(BYTE)(c>>8) ]++;
+ Counting3[(BYTE)(c>>16)]++;
+ Counting4[ c>>24 ]++;
+ c = cached; cached = MEM_read32(ip); ip += 4;
+ Counting1[(BYTE) c ]++;
+ Counting2[(BYTE)(c>>8) ]++;
+ Counting3[(BYTE)(c>>16)]++;
+ Counting4[ c>>24 ]++;
+ }
+ ip-=4;
+ }
+
+ /* finish last symbols */
+ while (ip<iend) Counting1[*ip++]++;
+
+ if (check) { /* verify stats will fit into destination table */
+ U32 s; for (s=255; s>maxSymbolValue; s--) {
+ Counting1[s] += Counting2[s] + Counting3[s] + Counting4[s];
+ if (Counting1[s]) return ERROR(maxSymbolValue_tooSmall);
+ } }
+
+ { U32 s;
+ if (maxSymbolValue > 255) maxSymbolValue = 255;
+ for (s=0; s<=maxSymbolValue; s++) {
+ count[s] = Counting1[s] + Counting2[s] + Counting3[s] + Counting4[s];
+ if (count[s] > max) max = count[s];
+ } }
+
+ while (!count[maxSymbolValue]) maxSymbolValue--;
+ *maxSymbolValuePtr = maxSymbolValue;
+ return (size_t)max;
+}
+
+/* HIST_countFast_wksp() :
+ * Same as HIST_countFast(), but using an externally provided scratch buffer.
+ * `workSpace` is a writable buffer which must be 4-bytes aligned,
+ * `workSpaceSize` must be >= HIST_WKSP_SIZE
+ */
+size_t HIST_countFast_wksp(unsigned* count, unsigned* maxSymbolValuePtr,
+ const void* source, size_t sourceSize,
+ void* workSpace, size_t workSpaceSize)
+{
+ if (sourceSize < 1500) /* heuristic threshold */
+ return HIST_count_simple(count, maxSymbolValuePtr, source, sourceSize);
+ if ((size_t)workSpace & 3) return ERROR(GENERIC); /* must be aligned on 4-bytes boundaries */
+ if (workSpaceSize < HIST_WKSP_SIZE) return ERROR(workSpace_tooSmall);
+ return HIST_count_parallel_wksp(count, maxSymbolValuePtr, source, sourceSize, trustInput, (U32*)workSpace);
+}
+
+/* fast variant (unsafe : won't check if src contains values beyond count[] limit) */
+size_t HIST_countFast(unsigned* count, unsigned* maxSymbolValuePtr,
+ const void* source, size_t sourceSize)
+{
+ unsigned tmpCounters[HIST_WKSP_SIZE_U32];
+ return HIST_countFast_wksp(count, maxSymbolValuePtr, source, sourceSize, tmpCounters, sizeof(tmpCounters));
+}
+
+/* HIST_count_wksp() :
+ * Same as HIST_count(), but using an externally provided scratch buffer.
+ * `workSpace` size must be table of >= HIST_WKSP_SIZE_U32 unsigned */
+size_t HIST_count_wksp(unsigned* count, unsigned* maxSymbolValuePtr,
+ const void* source, size_t sourceSize,
+ void* workSpace, size_t workSpaceSize)
+{
+ if ((size_t)workSpace & 3) return ERROR(GENERIC); /* must be aligned on 4-bytes boundaries */
+ if (workSpaceSize < HIST_WKSP_SIZE) return ERROR(workSpace_tooSmall);
+ if (*maxSymbolValuePtr < 255)
+ return HIST_count_parallel_wksp(count, maxSymbolValuePtr, source, sourceSize, checkMaxSymbolValue, (U32*)workSpace);
+ *maxSymbolValuePtr = 255;
+ return HIST_countFast_wksp(count, maxSymbolValuePtr, source, sourceSize, workSpace, workSpaceSize);
+}
+
+size_t HIST_count(unsigned* count, unsigned* maxSymbolValuePtr,
+ const void* src, size_t srcSize)
+{
+ unsigned tmpCounters[HIST_WKSP_SIZE_U32];
+ return HIST_count_wksp(count, maxSymbolValuePtr, src, srcSize, tmpCounters, sizeof(tmpCounters));
+}
diff --git a/thirdparty/zstd/compress/hist.h b/thirdparty/zstd/compress/hist.h
new file mode 100644
index 0000000000..8b389358dc
--- /dev/null
+++ b/thirdparty/zstd/compress/hist.h
@@ -0,0 +1,95 @@
+/* ******************************************************************
+ hist : Histogram functions
+ part of Finite State Entropy project
+ Copyright (C) 2013-present, Yann Collet.
+
+ BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
+
+ 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.
+
+ 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.
+
+ You can contact the author at :
+ - FSE source repository : https://github.com/Cyan4973/FiniteStateEntropy
+ - Public forum : https://groups.google.com/forum/#!forum/lz4c
+****************************************************************** */
+
+/* --- dependencies --- */
+#include <stddef.h> /* size_t */
+
+
+/* --- simple histogram functions --- */
+
+/*! HIST_count():
+ * Provides the precise count of each byte within a table 'count'.
+ * 'count' is a table of unsigned int, of minimum size (*maxSymbolValuePtr+1).
+ * Updates *maxSymbolValuePtr with actual largest symbol value detected.
+ * @return : count of the most frequent symbol (which isn't identified).
+ * or an error code, which can be tested using HIST_isError().
+ * note : if return == srcSize, there is only one symbol.
+ */
+size_t HIST_count(unsigned* count, unsigned* maxSymbolValuePtr,
+ const void* src, size_t srcSize);
+
+unsigned HIST_isError(size_t code); /**< tells if a return value is an error code */
+
+
+/* --- advanced histogram functions --- */
+
+#define HIST_WKSP_SIZE_U32 1024
+#define HIST_WKSP_SIZE (HIST_WKSP_SIZE_U32 * sizeof(unsigned))
+/** HIST_count_wksp() :
+ * Same as HIST_count(), but using an externally provided scratch buffer.
+ * Benefit is this function will use very little stack space.
+ * `workSpace` is a writable buffer which must be 4-bytes aligned,
+ * `workSpaceSize` must be >= HIST_WKSP_SIZE
+ */
+size_t HIST_count_wksp(unsigned* count, unsigned* maxSymbolValuePtr,
+ const void* src, size_t srcSize,
+ void* workSpace, size_t workSpaceSize);
+
+/** HIST_countFast() :
+ * same as HIST_count(), but blindly trusts that all byte values within src are <= *maxSymbolValuePtr.
+ * This function is unsafe, and will segfault if any value within `src` is `> *maxSymbolValuePtr`
+ */
+size_t HIST_countFast(unsigned* count, unsigned* maxSymbolValuePtr,
+ const void* src, size_t srcSize);
+
+/** HIST_countFast_wksp() :
+ * Same as HIST_countFast(), but using an externally provided scratch buffer.
+ * `workSpace` is a writable buffer which must be 4-bytes aligned,
+ * `workSpaceSize` must be >= HIST_WKSP_SIZE
+ */
+size_t HIST_countFast_wksp(unsigned* count, unsigned* maxSymbolValuePtr,
+ const void* src, size_t srcSize,
+ void* workSpace, size_t workSpaceSize);
+
+/*! HIST_count_simple() :
+ * Same as HIST_countFast(), this function is unsafe,
+ * and will segfault if any value within `src` is `> *maxSymbolValuePtr`.
+ * It is also a bit slower for large inputs.
+ * However, it does not need any additional memory (not even on stack).
+ * @return : count of the most frequent symbol.
+ * Note this function doesn't produce any error (i.e. it must succeed).
+ */
+unsigned HIST_count_simple(unsigned* count, unsigned* maxSymbolValuePtr,
+ const void* src, size_t srcSize);
diff --git a/thirdparty/zstd/compress/huf_compress.c b/thirdparty/zstd/compress/huf_compress.c
index 83230b415f..f074f1e0a9 100644
--- a/thirdparty/zstd/compress/huf_compress.c
+++ b/thirdparty/zstd/compress/huf_compress.c
@@ -45,8 +45,9 @@
****************************************************************/
#include <string.h> /* memcpy, memset */
#include <stdio.h> /* printf (debug) */
-#include "bitstream.h"
#include "compiler.h"
+#include "bitstream.h"
+#include "hist.h"
#define FSE_STATIC_LINKING_ONLY /* FSE_optimalTableLog_internal */
#include "fse.h" /* header compression */
#define HUF_STATIC_LINKING_ONLY
@@ -58,7 +59,7 @@
* Error Management
****************************************************************/
#define HUF_isError ERR_isError
-#define HUF_STATIC_ASSERT(c) { enum { HUF_static_assert = 1/(int)(!!(c)) }; } /* use only *after* variable declarations */
+#define HUF_STATIC_ASSERT(c) DEBUG_STATIC_ASSERT(c) /* use only *after* variable declarations */
#define CHECK_V_F(e, f) size_t const e = f; if (ERR_isError(e)) return e
#define CHECK_F(f) { CHECK_V_F(_var_err__, f); }
@@ -81,28 +82,28 @@ unsigned HUF_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxS
* Note : all elements within weightTable are supposed to be <= HUF_TABLELOG_MAX.
*/
#define MAX_FSE_TABLELOG_FOR_HUFF_HEADER 6
-size_t HUF_compressWeights (void* dst, size_t dstSize, const void* weightTable, size_t wtSize)
+static size_t HUF_compressWeights (void* dst, size_t dstSize, const void* weightTable, size_t wtSize)
{
BYTE* const ostart = (BYTE*) dst;
BYTE* op = ostart;
BYTE* const oend = ostart + dstSize;
- U32 maxSymbolValue = HUF_TABLELOG_MAX;
+ unsigned maxSymbolValue = HUF_TABLELOG_MAX;
U32 tableLog = MAX_FSE_TABLELOG_FOR_HUFF_HEADER;
FSE_CTable CTable[FSE_CTABLE_SIZE_U32(MAX_FSE_TABLELOG_FOR_HUFF_HEADER, HUF_TABLELOG_MAX)];
BYTE scratchBuffer[1<<MAX_FSE_TABLELOG_FOR_HUFF_HEADER];
- U32 count[HUF_TABLELOG_MAX+1];
+ unsigned count[HUF_TABLELOG_MAX+1];
S16 norm[HUF_TABLELOG_MAX+1];
/* init conditions */
if (wtSize <= 1) return 0; /* Not compressible */
/* Scan input and build symbol stats */
- { CHECK_V_F(maxCount, FSE_count_simple(count, &maxSymbolValue, weightTable, wtSize) );
+ { unsigned const maxCount = HIST_count_simple(count, &maxSymbolValue, weightTable, wtSize); /* never fails */
if (maxCount == wtSize) return 1; /* only a single symbol in src : rle */
- if (maxCount == 1) return 0; /* each symbol present maximum once => not compressible */
+ if (maxCount == 1) return 0; /* each symbol present maximum once => not compressible */
}
tableLog = FSE_optimalTableLog(tableLog, wtSize, maxSymbolValue);
@@ -133,7 +134,7 @@ struct HUF_CElt_s {
`CTable` : Huffman tree to save, using huf representation.
@return : size of saved CTable */
size_t HUF_writeCTable (void* dst, size_t maxDstSize,
- const HUF_CElt* CTable, U32 maxSymbolValue, U32 huffLog)
+ const HUF_CElt* CTable, unsigned maxSymbolValue, unsigned huffLog)
{
BYTE bitsToWeight[HUF_TABLELOG_MAX + 1]; /* precomputed conversion table */
BYTE huffWeight[HUF_SYMBOLVALUE_MAX];
@@ -168,7 +169,7 @@ size_t HUF_writeCTable (void* dst, size_t maxDstSize,
}
-size_t HUF_readCTable (HUF_CElt* CTable, U32* maxSymbolValuePtr, const void* src, size_t srcSize)
+size_t HUF_readCTable (HUF_CElt* CTable, unsigned* maxSymbolValuePtr, const void* src, size_t srcSize)
{
BYTE huffWeight[HUF_SYMBOLVALUE_MAX + 1]; /* init not required, even though some static analyzer may complain */
U32 rankVal[HUF_TABLELOG_ABSOLUTEMAX + 1]; /* large enough for values from 0 to 16 */
@@ -216,6 +217,13 @@ size_t HUF_readCTable (HUF_CElt* CTable, U32* maxSymbolValuePtr, const void* src
return readSize;
}
+U32 HUF_getNbBits(const void* symbolTable, U32 symbolValue)
+{
+ const HUF_CElt* table = (const HUF_CElt*)symbolTable;
+ assert(symbolValue <= HUF_SYMBOLVALUE_MAX);
+ return table[symbolValue].nbBits;
+}
+
typedef struct nodeElt_s {
U32 count;
@@ -307,7 +315,7 @@ typedef struct {
U32 current;
} rankPos;
-static void HUF_sort(nodeElt* huffNode, const U32* count, U32 maxSymbolValue)
+static void HUF_sort(nodeElt* huffNode, const unsigned* count, U32 maxSymbolValue)
{
rankPos rank[32];
U32 n;
@@ -339,7 +347,7 @@ static void HUF_sort(nodeElt* huffNode, const U32* count, U32 maxSymbolValue)
*/
#define STARTNODE (HUF_SYMBOLVALUE_MAX+1)
typedef nodeElt huffNodeTable[HUF_CTABLE_WORKSPACE_SIZE_U32];
-size_t HUF_buildCTable_wksp (HUF_CElt* tree, const U32* count, U32 maxSymbolValue, U32 maxNbBits, void* workSpace, size_t wkspSize)
+size_t HUF_buildCTable_wksp (HUF_CElt* tree, const unsigned* count, U32 maxSymbolValue, U32 maxNbBits, void* workSpace, size_t wkspSize)
{
nodeElt* const huffNode0 = (nodeElt*)workSpace;
nodeElt* const huffNode = huffNode0+1;
@@ -413,7 +421,7 @@ size_t HUF_buildCTable_wksp (HUF_CElt* tree, const U32* count, U32 maxSymbolValu
* @return : maxNbBits
* Note : count is used before tree is written, so they can safely overlap
*/
-size_t HUF_buildCTable (HUF_CElt* tree, const U32* count, U32 maxSymbolValue, U32 maxNbBits)
+size_t HUF_buildCTable (HUF_CElt* tree, const unsigned* count, unsigned maxSymbolValue, unsigned maxNbBits)
{
huffNodeTable nodeTable;
return HUF_buildCTable_wksp(tree, count, maxSymbolValue, maxNbBits, nodeTable, sizeof(nodeTable));
@@ -602,13 +610,14 @@ size_t HUF_compress4X_usingCTable(void* dst, size_t dstSize, const void* src, si
return HUF_compress4X_usingCTable_internal(dst, dstSize, src, srcSize, CTable, /* bmi2 */ 0);
}
+typedef enum { HUF_singleStream, HUF_fourStreams } HUF_nbStreams_e;
static size_t HUF_compressCTable_internal(
BYTE* const ostart, BYTE* op, BYTE* const oend,
const void* src, size_t srcSize,
- unsigned singleStream, const HUF_CElt* CTable, const int bmi2)
+ HUF_nbStreams_e nbStreams, const HUF_CElt* CTable, const int bmi2)
{
- size_t const cSize = singleStream ?
+ size_t const cSize = (nbStreams==HUF_singleStream) ?
HUF_compress1X_usingCTable_internal(op, oend - op, src, srcSize, CTable, bmi2) :
HUF_compress4X_usingCTable_internal(op, oend - op, src, srcSize, CTable, bmi2);
if (HUF_isError(cSize)) { return cSize; }
@@ -620,21 +629,21 @@ static size_t HUF_compressCTable_internal(
}
typedef struct {
- U32 count[HUF_SYMBOLVALUE_MAX + 1];
+ unsigned count[HUF_SYMBOLVALUE_MAX + 1];
HUF_CElt CTable[HUF_SYMBOLVALUE_MAX + 1];
huffNodeTable nodeTable;
} HUF_compress_tables_t;
/* HUF_compress_internal() :
* `workSpace` must a table of at least HUF_WORKSPACE_SIZE_U32 unsigned */
-static size_t HUF_compress_internal (
- void* dst, size_t dstSize,
- const void* src, size_t srcSize,
- unsigned maxSymbolValue, unsigned huffLog,
- unsigned singleStream,
- void* workSpace, size_t wkspSize,
- HUF_CElt* oldHufTable, HUF_repeat* repeat, int preferRepeat,
- const int bmi2)
+static size_t
+HUF_compress_internal (void* dst, size_t dstSize,
+ const void* src, size_t srcSize,
+ unsigned maxSymbolValue, unsigned huffLog,
+ HUF_nbStreams_e nbStreams,
+ void* workSpace, size_t wkspSize,
+ HUF_CElt* oldHufTable, HUF_repeat* repeat, int preferRepeat,
+ const int bmi2)
{
HUF_compress_tables_t* const table = (HUF_compress_tables_t*)workSpace;
BYTE* const ostart = (BYTE*)dst;
@@ -643,7 +652,7 @@ static size_t HUF_compress_internal (
/* checks & inits */
if (((size_t)workSpace & 3) != 0) return ERROR(GENERIC); /* must be aligned on 4-bytes boundaries */
- if (wkspSize < sizeof(*table)) return ERROR(workSpace_tooSmall);
+ if (wkspSize < HUF_WORKSPACE_SIZE) return ERROR(workSpace_tooSmall);
if (!srcSize) return 0; /* Uncompressed */
if (!dstSize) return 0; /* cannot fit anything within dst budget */
if (srcSize > HUF_BLOCKSIZE_MAX) return ERROR(srcSize_wrong); /* current block size limit */
@@ -656,13 +665,13 @@ static size_t HUF_compress_internal (
if (preferRepeat && repeat && *repeat == HUF_repeat_valid) {
return HUF_compressCTable_internal(ostart, op, oend,
src, srcSize,
- singleStream, oldHufTable, bmi2);
+ nbStreams, oldHufTable, bmi2);
}
/* Scan input and build symbol stats */
- { CHECK_V_F(largest, FSE_count_wksp (table->count, &maxSymbolValue, (const BYTE*)src, srcSize, table->count) );
+ { CHECK_V_F(largest, HIST_count_wksp (table->count, &maxSymbolValue, (const BYTE*)src, srcSize, workSpace, wkspSize) );
if (largest == srcSize) { *ostart = ((const BYTE*)src)[0]; return 1; } /* single symbol, rle */
- if (largest <= (srcSize >> 7)+1) return 0; /* heuristic : probably not compressible enough */
+ if (largest <= (srcSize >> 7)+4) return 0; /* heuristic : probably not compressible enough */
}
/* Check validity of previous table */
@@ -675,14 +684,15 @@ static size_t HUF_compress_internal (
if (preferRepeat && repeat && *repeat != HUF_repeat_none) {
return HUF_compressCTable_internal(ostart, op, oend,
src, srcSize,
- singleStream, oldHufTable, bmi2);
+ nbStreams, oldHufTable, bmi2);
}
/* Build Huffman Tree */
huffLog = HUF_optimalTableLog(huffLog, srcSize, maxSymbolValue);
- { CHECK_V_F(maxBits, HUF_buildCTable_wksp(table->CTable, table->count,
- maxSymbolValue, huffLog,
- table->nodeTable, sizeof(table->nodeTable)) );
+ { size_t const maxBits = HUF_buildCTable_wksp(table->CTable, table->count,
+ maxSymbolValue, huffLog,
+ table->nodeTable, sizeof(table->nodeTable));
+ CHECK_F(maxBits);
huffLog = (U32)maxBits;
/* Zero unused symbols in CTable, so we can check it for validity */
memset(table->CTable + (maxSymbolValue + 1), 0,
@@ -698,7 +708,7 @@ static size_t HUF_compress_internal (
if (oldSize <= hSize + newSize || hSize + 12 >= srcSize) {
return HUF_compressCTable_internal(ostart, op, oend,
src, srcSize,
- singleStream, oldHufTable, bmi2);
+ nbStreams, oldHufTable, bmi2);
} }
/* Use the new huffman table */
@@ -710,7 +720,7 @@ static size_t HUF_compress_internal (
}
return HUF_compressCTable_internal(ostart, op, oend,
src, srcSize,
- singleStream, table->CTable, bmi2);
+ nbStreams, table->CTable, bmi2);
}
@@ -720,7 +730,7 @@ size_t HUF_compress1X_wksp (void* dst, size_t dstSize,
void* workSpace, size_t wkspSize)
{
return HUF_compress_internal(dst, dstSize, src, srcSize,
- maxSymbolValue, huffLog, 1 /*single stream*/,
+ maxSymbolValue, huffLog, HUF_singleStream,
workSpace, wkspSize,
NULL, NULL, 0, 0 /*bmi2*/);
}
@@ -732,7 +742,7 @@ size_t HUF_compress1X_repeat (void* dst, size_t dstSize,
HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2)
{
return HUF_compress_internal(dst, dstSize, src, srcSize,
- maxSymbolValue, huffLog, 1 /*single stream*/,
+ maxSymbolValue, huffLog, HUF_singleStream,
workSpace, wkspSize, hufTable,
repeat, preferRepeat, bmi2);
}
@@ -754,7 +764,7 @@ size_t HUF_compress4X_wksp (void* dst, size_t dstSize,
void* workSpace, size_t wkspSize)
{
return HUF_compress_internal(dst, dstSize, src, srcSize,
- maxSymbolValue, huffLog, 0 /*4 streams*/,
+ maxSymbolValue, huffLog, HUF_fourStreams,
workSpace, wkspSize,
NULL, NULL, 0, 0 /*bmi2*/);
}
@@ -769,7 +779,7 @@ size_t HUF_compress4X_repeat (void* dst, size_t dstSize,
HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2)
{
return HUF_compress_internal(dst, dstSize, src, srcSize,
- maxSymbolValue, huffLog, 0 /* 4 streams */,
+ maxSymbolValue, huffLog, HUF_fourStreams,
workSpace, wkspSize,
hufTable, repeat, preferRepeat, bmi2);
}
diff --git a/thirdparty/zstd/compress/zstd_compress.c b/thirdparty/zstd/compress/zstd_compress.c
index 2aa26da4cd..c2c9d3bc55 100644
--- a/thirdparty/zstd/compress/zstd_compress.c
+++ b/thirdparty/zstd/compress/zstd_compress.c
@@ -8,21 +8,14 @@
* You may select, at your option, one of the above-listed licenses.
*/
-
-/*-*************************************
-* Tuning parameters
-***************************************/
-#ifndef ZSTD_CLEVEL_DEFAULT
-# define ZSTD_CLEVEL_DEFAULT 3
-#endif
-
-
/*-*************************************
* Dependencies
***************************************/
+#include <limits.h> /* INT_MAX */
#include <string.h> /* memset */
#include "cpu.h"
#include "mem.h"
+#include "hist.h" /* HIST_countFast_wksp */
#define FSE_STATIC_LINKING_ONLY /* FSE_encodeSymbol */
#include "fse.h"
#define HUF_STATIC_LINKING_ONLY
@@ -54,7 +47,6 @@ struct ZSTD_CDict_s {
size_t workspaceSize;
ZSTD_matchState_t matchState;
ZSTD_compressedBlockState_t cBlockState;
- ZSTD_compressionParameters cParams;
ZSTD_customMem customMem;
U32 dictID;
}; /* typedef'd to ZSTD_CDict within "zstd.h" */
@@ -64,17 +56,26 @@ ZSTD_CCtx* ZSTD_createCCtx(void)
return ZSTD_createCCtx_advanced(ZSTD_defaultCMem);
}
+static void ZSTD_initCCtx(ZSTD_CCtx* cctx, ZSTD_customMem memManager)
+{
+ assert(cctx != NULL);
+ memset(cctx, 0, sizeof(*cctx));
+ cctx->customMem = memManager;
+ cctx->bmi2 = ZSTD_cpuid_bmi2(ZSTD_cpuid());
+ { size_t const err = ZSTD_CCtx_reset(cctx, ZSTD_reset_parameters);
+ assert(!ZSTD_isError(err));
+ (void)err;
+ }
+}
+
ZSTD_CCtx* ZSTD_createCCtx_advanced(ZSTD_customMem customMem)
{
ZSTD_STATIC_ASSERT(zcss_init==0);
ZSTD_STATIC_ASSERT(ZSTD_CONTENTSIZE_UNKNOWN==(0ULL - 1));
if (!customMem.customAlloc ^ !customMem.customFree) return NULL;
- { ZSTD_CCtx* const cctx = (ZSTD_CCtx*)ZSTD_calloc(sizeof(ZSTD_CCtx), customMem);
+ { ZSTD_CCtx* const cctx = (ZSTD_CCtx*)ZSTD_malloc(sizeof(ZSTD_CCtx), customMem);
if (!cctx) return NULL;
- cctx->customMem = customMem;
- cctx->requestedParams.compressionLevel = ZSTD_CLEVEL_DEFAULT;
- cctx->requestedParams.fParams.contentSizeFlag = 1;
- cctx->bmi2 = ZSTD_cpuid_bmi2(ZSTD_cpuid());
+ ZSTD_initCCtx(cctx, customMem);
return cctx;
}
}
@@ -102,17 +103,24 @@ ZSTD_CCtx* ZSTD_initStaticCCtx(void *workspace, size_t workspaceSize)
return cctx;
}
-size_t ZSTD_freeCCtx(ZSTD_CCtx* cctx)
+static void ZSTD_freeCCtxContent(ZSTD_CCtx* cctx)
{
- if (cctx==NULL) return 0; /* support free on NULL */
- if (cctx->staticSize) return ERROR(memory_allocation); /* not compatible with static CCtx */
+ assert(cctx != NULL);
+ assert(cctx->staticSize == 0);
ZSTD_free(cctx->workSpace, cctx->customMem); cctx->workSpace = NULL;
ZSTD_freeCDict(cctx->cdictLocal); cctx->cdictLocal = NULL;
#ifdef ZSTD_MULTITHREAD
ZSTDMT_freeCCtx(cctx->mtctx); cctx->mtctx = NULL;
#endif
+}
+
+size_t ZSTD_freeCCtx(ZSTD_CCtx* cctx)
+{
+ if (cctx==NULL) return 0; /* support free on NULL */
+ if (cctx->staticSize) return ERROR(memory_allocation); /* not compatible with static CCtx */
+ ZSTD_freeCCtxContent(cctx);
ZSTD_free(cctx, cctx->customMem);
- return 0; /* reserved as a potential error code in the future */
+ return 0;
}
@@ -121,7 +129,7 @@ static size_t ZSTD_sizeof_mtctx(const ZSTD_CCtx* cctx)
#ifdef ZSTD_MULTITHREAD
return ZSTDMT_sizeof_CCtx(cctx->mtctx);
#else
- (void) cctx;
+ (void)cctx;
return 0;
#endif
}
@@ -143,21 +151,6 @@ size_t ZSTD_sizeof_CStream(const ZSTD_CStream* zcs)
/* private API call, for dictBuilder only */
const seqStore_t* ZSTD_getSeqStore(const ZSTD_CCtx* ctx) { return &(ctx->seqStore); }
-ZSTD_compressionParameters ZSTD_getCParamsFromCCtxParams(
- const ZSTD_CCtx_params* CCtxParams, U64 srcSizeHint, size_t dictSize)
-{
- ZSTD_compressionParameters cParams = ZSTD_getCParams(CCtxParams->compressionLevel, srcSizeHint, dictSize);
- if (CCtxParams->ldmParams.enableLdm) cParams.windowLog = ZSTD_LDM_DEFAULT_WINDOW_LOG;
- if (CCtxParams->cParams.windowLog) cParams.windowLog = CCtxParams->cParams.windowLog;
- if (CCtxParams->cParams.hashLog) cParams.hashLog = CCtxParams->cParams.hashLog;
- if (CCtxParams->cParams.chainLog) cParams.chainLog = CCtxParams->cParams.chainLog;
- if (CCtxParams->cParams.searchLog) cParams.searchLog = CCtxParams->cParams.searchLog;
- if (CCtxParams->cParams.searchLength) cParams.searchLength = CCtxParams->cParams.searchLength;
- if (CCtxParams->cParams.targetLength) cParams.targetLength = CCtxParams->cParams.targetLength;
- if (CCtxParams->cParams.strategy) cParams.strategy = CCtxParams->cParams.strategy;
- return cParams;
-}
-
static ZSTD_CCtx_params ZSTD_makeCCtxParamsFromCParams(
ZSTD_compressionParameters cParams)
{
@@ -234,9 +227,160 @@ static ZSTD_CCtx_params ZSTD_assignParamsToCCtxParams(
return ret;
}
-#define CLAMPCHECK(val,min,max) { \
- if (((val)<(min)) | ((val)>(max))) { \
- return ERROR(parameter_outOfBound); \
+ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter param)
+{
+ ZSTD_bounds bounds = { 0, 0, 0 };
+
+ switch(param)
+ {
+ case ZSTD_c_compressionLevel:
+ bounds.lowerBound = ZSTD_minCLevel();
+ bounds.upperBound = ZSTD_maxCLevel();
+ return bounds;
+
+ case ZSTD_c_windowLog:
+ bounds.lowerBound = ZSTD_WINDOWLOG_MIN;
+ bounds.upperBound = ZSTD_WINDOWLOG_MAX;
+ return bounds;
+
+ case ZSTD_c_hashLog:
+ bounds.lowerBound = ZSTD_HASHLOG_MIN;
+ bounds.upperBound = ZSTD_HASHLOG_MAX;
+ return bounds;
+
+ case ZSTD_c_chainLog:
+ bounds.lowerBound = ZSTD_CHAINLOG_MIN;
+ bounds.upperBound = ZSTD_CHAINLOG_MAX;
+ return bounds;
+
+ case ZSTD_c_searchLog:
+ bounds.lowerBound = ZSTD_SEARCHLOG_MIN;
+ bounds.upperBound = ZSTD_SEARCHLOG_MAX;
+ return bounds;
+
+ case ZSTD_c_minMatch:
+ bounds.lowerBound = ZSTD_MINMATCH_MIN;
+ bounds.upperBound = ZSTD_MINMATCH_MAX;
+ return bounds;
+
+ case ZSTD_c_targetLength:
+ bounds.lowerBound = ZSTD_TARGETLENGTH_MIN;
+ bounds.upperBound = ZSTD_TARGETLENGTH_MAX;
+ return bounds;
+
+ case ZSTD_c_strategy:
+ bounds.lowerBound = ZSTD_STRATEGY_MIN;
+ bounds.upperBound = ZSTD_STRATEGY_MAX;
+ return bounds;
+
+ case ZSTD_c_contentSizeFlag:
+ bounds.lowerBound = 0;
+ bounds.upperBound = 1;
+ return bounds;
+
+ case ZSTD_c_checksumFlag:
+ bounds.lowerBound = 0;
+ bounds.upperBound = 1;
+ return bounds;
+
+ case ZSTD_c_dictIDFlag:
+ bounds.lowerBound = 0;
+ bounds.upperBound = 1;
+ return bounds;
+
+ case ZSTD_c_nbWorkers:
+ bounds.lowerBound = 0;
+#ifdef ZSTD_MULTITHREAD
+ bounds.upperBound = ZSTDMT_NBWORKERS_MAX;
+#else
+ bounds.upperBound = 0;
+#endif
+ return bounds;
+
+ case ZSTD_c_jobSize:
+ bounds.lowerBound = 0;
+#ifdef ZSTD_MULTITHREAD
+ bounds.upperBound = ZSTDMT_JOBSIZE_MAX;
+#else
+ bounds.upperBound = 0;
+#endif
+ return bounds;
+
+ case ZSTD_c_overlapLog:
+ bounds.lowerBound = ZSTD_OVERLAPLOG_MIN;
+ bounds.upperBound = ZSTD_OVERLAPLOG_MAX;
+ return bounds;
+
+ case ZSTD_c_enableLongDistanceMatching:
+ bounds.lowerBound = 0;
+ bounds.upperBound = 1;
+ return bounds;
+
+ case ZSTD_c_ldmHashLog:
+ bounds.lowerBound = ZSTD_LDM_HASHLOG_MIN;
+ bounds.upperBound = ZSTD_LDM_HASHLOG_MAX;
+ return bounds;
+
+ case ZSTD_c_ldmMinMatch:
+ bounds.lowerBound = ZSTD_LDM_MINMATCH_MIN;
+ bounds.upperBound = ZSTD_LDM_MINMATCH_MAX;
+ return bounds;
+
+ case ZSTD_c_ldmBucketSizeLog:
+ bounds.lowerBound = ZSTD_LDM_BUCKETSIZELOG_MIN;
+ bounds.upperBound = ZSTD_LDM_BUCKETSIZELOG_MAX;
+ return bounds;
+
+ case ZSTD_c_ldmHashRateLog:
+ bounds.lowerBound = ZSTD_LDM_HASHRATELOG_MIN;
+ bounds.upperBound = ZSTD_LDM_HASHRATELOG_MAX;
+ return bounds;
+
+ /* experimental parameters */
+ case ZSTD_c_rsyncable:
+ bounds.lowerBound = 0;
+ bounds.upperBound = 1;
+ return bounds;
+
+ case ZSTD_c_forceMaxWindow :
+ bounds.lowerBound = 0;
+ bounds.upperBound = 1;
+ return bounds;
+
+ case ZSTD_c_format:
+ ZSTD_STATIC_ASSERT(ZSTD_f_zstd1 < ZSTD_f_zstd1_magicless);
+ bounds.lowerBound = ZSTD_f_zstd1;
+ bounds.upperBound = ZSTD_f_zstd1_magicless; /* note : how to ensure at compile time that this is the highest value enum ? */
+ return bounds;
+
+ case ZSTD_c_forceAttachDict:
+ ZSTD_STATIC_ASSERT(ZSTD_dictDefaultAttach < ZSTD_dictForceCopy);
+ bounds.lowerBound = ZSTD_dictDefaultAttach;
+ bounds.upperBound = ZSTD_dictForceCopy; /* note : how to ensure at compile time that this is the highest value enum ? */
+ return bounds;
+
+ default:
+ { ZSTD_bounds const boundError = { ERROR(parameter_unsupported), 0, 0 };
+ return boundError;
+ }
+ }
+}
+
+/* ZSTD_cParam_withinBounds:
+ * @return 1 if value is within cParam bounds,
+ * 0 otherwise */
+static int ZSTD_cParam_withinBounds(ZSTD_cParameter cParam, int value)
+{
+ ZSTD_bounds const bounds = ZSTD_cParam_getBounds(cParam);
+ if (ZSTD_isError(bounds.error)) return 0;
+ if (value < bounds.lowerBound) return 0;
+ if (value > bounds.upperBound) return 0;
+ return 1;
+}
+
+#define BOUNDCHECK(cParam, val) { \
+ if (!ZSTD_cParam_withinBounds(cParam,val)) { \
+ return ERROR(parameter_outOfBound); \
} }
@@ -244,38 +388,39 @@ static int ZSTD_isUpdateAuthorized(ZSTD_cParameter param)
{
switch(param)
{
- case ZSTD_p_compressionLevel:
- case ZSTD_p_hashLog:
- case ZSTD_p_chainLog:
- case ZSTD_p_searchLog:
- case ZSTD_p_minMatch:
- case ZSTD_p_targetLength:
- case ZSTD_p_compressionStrategy:
- case ZSTD_p_compressLiterals:
+ case ZSTD_c_compressionLevel:
+ case ZSTD_c_hashLog:
+ case ZSTD_c_chainLog:
+ case ZSTD_c_searchLog:
+ case ZSTD_c_minMatch:
+ case ZSTD_c_targetLength:
+ case ZSTD_c_strategy:
return 1;
- case ZSTD_p_format:
- case ZSTD_p_windowLog:
- case ZSTD_p_contentSizeFlag:
- case ZSTD_p_checksumFlag:
- case ZSTD_p_dictIDFlag:
- case ZSTD_p_forceMaxWindow :
- case ZSTD_p_nbWorkers:
- case ZSTD_p_jobSize:
- case ZSTD_p_overlapSizeLog:
- case ZSTD_p_enableLongDistanceMatching:
- case ZSTD_p_ldmHashLog:
- case ZSTD_p_ldmMinMatch:
- case ZSTD_p_ldmBucketSizeLog:
- case ZSTD_p_ldmHashEveryLog:
+ case ZSTD_c_format:
+ case ZSTD_c_windowLog:
+ case ZSTD_c_contentSizeFlag:
+ case ZSTD_c_checksumFlag:
+ case ZSTD_c_dictIDFlag:
+ case ZSTD_c_forceMaxWindow :
+ case ZSTD_c_nbWorkers:
+ case ZSTD_c_jobSize:
+ case ZSTD_c_overlapLog:
+ case ZSTD_c_rsyncable:
+ case ZSTD_c_enableLongDistanceMatching:
+ case ZSTD_c_ldmHashLog:
+ case ZSTD_c_ldmMinMatch:
+ case ZSTD_c_ldmBucketSizeLog:
+ case ZSTD_c_ldmHashRateLog:
+ case ZSTD_c_forceAttachDict:
default:
return 0;
}
}
-size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, unsigned value)
+size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value)
{
- DEBUGLOG(4, "ZSTD_CCtx_setParameter (%u, %u)", (U32)param, value);
+ DEBUGLOG(4, "ZSTD_CCtx_setParameter (%i, %i)", (int)param, value);
if (cctx->streamStage != zcss_init) {
if (ZSTD_isUpdateAuthorized(param)) {
cctx->cParamsChanged = 1;
@@ -285,49 +430,52 @@ size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, unsigned v
switch(param)
{
- case ZSTD_p_format :
+ case ZSTD_c_format :
return ZSTD_CCtxParam_setParameter(&cctx->requestedParams, param, value);
- case ZSTD_p_compressionLevel:
+ case ZSTD_c_compressionLevel:
if (cctx->cdict) return ERROR(stage_wrong);
return ZSTD_CCtxParam_setParameter(&cctx->requestedParams, param, value);
- case ZSTD_p_windowLog:
- case ZSTD_p_hashLog:
- case ZSTD_p_chainLog:
- case ZSTD_p_searchLog:
- case ZSTD_p_minMatch:
- case ZSTD_p_targetLength:
- case ZSTD_p_compressionStrategy:
+ case ZSTD_c_windowLog:
+ case ZSTD_c_hashLog:
+ case ZSTD_c_chainLog:
+ case ZSTD_c_searchLog:
+ case ZSTD_c_minMatch:
+ case ZSTD_c_targetLength:
+ case ZSTD_c_strategy:
if (cctx->cdict) return ERROR(stage_wrong);
return ZSTD_CCtxParam_setParameter(&cctx->requestedParams, param, value);
- case ZSTD_p_compressLiterals:
- case ZSTD_p_contentSizeFlag:
- case ZSTD_p_checksumFlag:
- case ZSTD_p_dictIDFlag:
+ case ZSTD_c_contentSizeFlag:
+ case ZSTD_c_checksumFlag:
+ case ZSTD_c_dictIDFlag:
return ZSTD_CCtxParam_setParameter(&cctx->requestedParams, param, value);
- case ZSTD_p_forceMaxWindow : /* Force back-references to remain < windowSize,
+ case ZSTD_c_forceMaxWindow : /* Force back-references to remain < windowSize,
* even when referencing into Dictionary content.
* default : 0 when using a CDict, 1 when using a Prefix */
return ZSTD_CCtxParam_setParameter(&cctx->requestedParams, param, value);
- case ZSTD_p_nbWorkers:
- if ((value>0) && cctx->staticSize) {
+ case ZSTD_c_forceAttachDict:
+ return ZSTD_CCtxParam_setParameter(&cctx->requestedParams, param, value);
+
+ case ZSTD_c_nbWorkers:
+ if ((value!=0) && cctx->staticSize) {
return ERROR(parameter_unsupported); /* MT not compatible with static alloc */
}
return ZSTD_CCtxParam_setParameter(&cctx->requestedParams, param, value);
- case ZSTD_p_jobSize:
- case ZSTD_p_overlapSizeLog:
+ case ZSTD_c_jobSize:
+ case ZSTD_c_overlapLog:
+ case ZSTD_c_rsyncable:
return ZSTD_CCtxParam_setParameter(&cctx->requestedParams, param, value);
- case ZSTD_p_enableLongDistanceMatching:
- case ZSTD_p_ldmHashLog:
- case ZSTD_p_ldmMinMatch:
- case ZSTD_p_ldmBucketSizeLog:
- case ZSTD_p_ldmHashEveryLog:
+ case ZSTD_c_enableLongDistanceMatching:
+ case ZSTD_c_ldmHashLog:
+ case ZSTD_c_ldmMinMatch:
+ case ZSTD_c_ldmBucketSizeLog:
+ case ZSTD_c_ldmHashRateLog:
if (cctx->cdict) return ERROR(stage_wrong);
return ZSTD_CCtxParam_setParameter(&cctx->requestedParams, param, value);
@@ -335,148 +483,257 @@ size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, unsigned v
}
}
-size_t ZSTD_CCtxParam_setParameter(
- ZSTD_CCtx_params* CCtxParams, ZSTD_cParameter param, unsigned value)
+size_t ZSTD_CCtxParam_setParameter(ZSTD_CCtx_params* CCtxParams,
+ ZSTD_cParameter param, int value)
{
- DEBUGLOG(4, "ZSTD_CCtxParam_setParameter (%u, %u)", (U32)param, value);
+ DEBUGLOG(4, "ZSTD_CCtxParam_setParameter (%i, %i)", (int)param, value);
switch(param)
{
- case ZSTD_p_format :
- if (value > (unsigned)ZSTD_f_zstd1_magicless)
- return ERROR(parameter_unsupported);
+ case ZSTD_c_format :
+ BOUNDCHECK(ZSTD_c_format, value);
CCtxParams->format = (ZSTD_format_e)value;
return (size_t)CCtxParams->format;
- case ZSTD_p_compressionLevel : {
- int cLevel = (int)value; /* cast expected to restore negative sign */
+ case ZSTD_c_compressionLevel : {
+ int cLevel = value;
if (cLevel > ZSTD_maxCLevel()) cLevel = ZSTD_maxCLevel();
+ if (cLevel < ZSTD_minCLevel()) cLevel = ZSTD_minCLevel();
if (cLevel) { /* 0 : does not change current level */
- CCtxParams->disableLiteralCompression = (cLevel<0); /* negative levels disable huffman */
CCtxParams->compressionLevel = cLevel;
}
if (CCtxParams->compressionLevel >= 0) return CCtxParams->compressionLevel;
return 0; /* return type (size_t) cannot represent negative values */
}
- case ZSTD_p_windowLog :
- if (value>0) /* 0 => use default */
- CLAMPCHECK(value, ZSTD_WINDOWLOG_MIN, ZSTD_WINDOWLOG_MAX);
+ case ZSTD_c_windowLog :
+ if (value!=0) /* 0 => use default */
+ BOUNDCHECK(ZSTD_c_windowLog, value);
CCtxParams->cParams.windowLog = value;
return CCtxParams->cParams.windowLog;
- case ZSTD_p_hashLog :
- if (value>0) /* 0 => use default */
- CLAMPCHECK(value, ZSTD_HASHLOG_MIN, ZSTD_HASHLOG_MAX);
+ case ZSTD_c_hashLog :
+ if (value!=0) /* 0 => use default */
+ BOUNDCHECK(ZSTD_c_hashLog, value);
CCtxParams->cParams.hashLog = value;
return CCtxParams->cParams.hashLog;
- case ZSTD_p_chainLog :
- if (value>0) /* 0 => use default */
- CLAMPCHECK(value, ZSTD_CHAINLOG_MIN, ZSTD_CHAINLOG_MAX);
+ case ZSTD_c_chainLog :
+ if (value!=0) /* 0 => use default */
+ BOUNDCHECK(ZSTD_c_chainLog, value);
CCtxParams->cParams.chainLog = value;
return CCtxParams->cParams.chainLog;
- case ZSTD_p_searchLog :
- if (value>0) /* 0 => use default */
- CLAMPCHECK(value, ZSTD_SEARCHLOG_MIN, ZSTD_SEARCHLOG_MAX);
+ case ZSTD_c_searchLog :
+ if (value!=0) /* 0 => use default */
+ BOUNDCHECK(ZSTD_c_searchLog, value);
CCtxParams->cParams.searchLog = value;
return value;
- case ZSTD_p_minMatch :
- if (value>0) /* 0 => use default */
- CLAMPCHECK(value, ZSTD_SEARCHLENGTH_MIN, ZSTD_SEARCHLENGTH_MAX);
- CCtxParams->cParams.searchLength = value;
- return CCtxParams->cParams.searchLength;
+ case ZSTD_c_minMatch :
+ if (value!=0) /* 0 => use default */
+ BOUNDCHECK(ZSTD_c_minMatch, value);
+ CCtxParams->cParams.minMatch = value;
+ return CCtxParams->cParams.minMatch;
- case ZSTD_p_targetLength :
- /* all values are valid. 0 => use default */
+ case ZSTD_c_targetLength :
+ BOUNDCHECK(ZSTD_c_targetLength, value);
CCtxParams->cParams.targetLength = value;
return CCtxParams->cParams.targetLength;
- case ZSTD_p_compressionStrategy :
- if (value>0) /* 0 => use default */
- CLAMPCHECK(value, (unsigned)ZSTD_fast, (unsigned)ZSTD_btultra);
+ case ZSTD_c_strategy :
+ if (value!=0) /* 0 => use default */
+ BOUNDCHECK(ZSTD_c_strategy, value);
CCtxParams->cParams.strategy = (ZSTD_strategy)value;
return (size_t)CCtxParams->cParams.strategy;
- case ZSTD_p_compressLiterals:
- CCtxParams->disableLiteralCompression = !value;
- return !CCtxParams->disableLiteralCompression;
-
- case ZSTD_p_contentSizeFlag :
+ case ZSTD_c_contentSizeFlag :
/* Content size written in frame header _when known_ (default:1) */
- DEBUGLOG(4, "set content size flag = %u", (value>0));
- CCtxParams->fParams.contentSizeFlag = value > 0;
+ DEBUGLOG(4, "set content size flag = %u", (value!=0));
+ CCtxParams->fParams.contentSizeFlag = value != 0;
return CCtxParams->fParams.contentSizeFlag;
- case ZSTD_p_checksumFlag :
+ case ZSTD_c_checksumFlag :
/* A 32-bits content checksum will be calculated and written at end of frame (default:0) */
- CCtxParams->fParams.checksumFlag = value > 0;
+ CCtxParams->fParams.checksumFlag = value != 0;
return CCtxParams->fParams.checksumFlag;
- case ZSTD_p_dictIDFlag : /* When applicable, dictionary's dictID is provided in frame header (default:1) */
- DEBUGLOG(4, "set dictIDFlag = %u", (value>0));
+ case ZSTD_c_dictIDFlag : /* When applicable, dictionary's dictID is provided in frame header (default:1) */
+ DEBUGLOG(4, "set dictIDFlag = %u", (value!=0));
CCtxParams->fParams.noDictIDFlag = !value;
return !CCtxParams->fParams.noDictIDFlag;
- case ZSTD_p_forceMaxWindow :
- CCtxParams->forceWindow = (value > 0);
+ case ZSTD_c_forceMaxWindow :
+ CCtxParams->forceWindow = (value != 0);
return CCtxParams->forceWindow;
- case ZSTD_p_nbWorkers :
+ case ZSTD_c_forceAttachDict : {
+ const ZSTD_dictAttachPref_e pref = (ZSTD_dictAttachPref_e)value;
+ BOUNDCHECK(ZSTD_c_forceAttachDict, pref);
+ CCtxParams->attachDictPref = pref;
+ return CCtxParams->attachDictPref;
+ }
+
+ case ZSTD_c_nbWorkers :
#ifndef ZSTD_MULTITHREAD
- if (value>0) return ERROR(parameter_unsupported);
+ if (value!=0) return ERROR(parameter_unsupported);
return 0;
#else
return ZSTDMT_CCtxParam_setNbWorkers(CCtxParams, value);
#endif
- case ZSTD_p_jobSize :
+ case ZSTD_c_jobSize :
#ifndef ZSTD_MULTITHREAD
return ERROR(parameter_unsupported);
#else
return ZSTDMT_CCtxParam_setMTCtxParameter(CCtxParams, ZSTDMT_p_jobSize, value);
#endif
- case ZSTD_p_overlapSizeLog :
+ case ZSTD_c_overlapLog :
#ifndef ZSTD_MULTITHREAD
return ERROR(parameter_unsupported);
#else
- return ZSTDMT_CCtxParam_setMTCtxParameter(CCtxParams, ZSTDMT_p_overlapSectionLog, value);
+ return ZSTDMT_CCtxParam_setMTCtxParameter(CCtxParams, ZSTDMT_p_overlapLog, value);
#endif
- case ZSTD_p_enableLongDistanceMatching :
- CCtxParams->ldmParams.enableLdm = (value>0);
+ case ZSTD_c_rsyncable :
+#ifndef ZSTD_MULTITHREAD
+ return ERROR(parameter_unsupported);
+#else
+ return ZSTDMT_CCtxParam_setMTCtxParameter(CCtxParams, ZSTDMT_p_rsyncable, value);
+#endif
+
+ case ZSTD_c_enableLongDistanceMatching :
+ CCtxParams->ldmParams.enableLdm = (value!=0);
return CCtxParams->ldmParams.enableLdm;
- case ZSTD_p_ldmHashLog :
- if (value>0) /* 0 ==> auto */
- CLAMPCHECK(value, ZSTD_HASHLOG_MIN, ZSTD_HASHLOG_MAX);
+ case ZSTD_c_ldmHashLog :
+ if (value!=0) /* 0 ==> auto */
+ BOUNDCHECK(ZSTD_c_ldmHashLog, value);
CCtxParams->ldmParams.hashLog = value;
return CCtxParams->ldmParams.hashLog;
- case ZSTD_p_ldmMinMatch :
- if (value>0) /* 0 ==> default */
- CLAMPCHECK(value, ZSTD_LDM_MINMATCH_MIN, ZSTD_LDM_MINMATCH_MAX);
+ case ZSTD_c_ldmMinMatch :
+ if (value!=0) /* 0 ==> default */
+ BOUNDCHECK(ZSTD_c_ldmMinMatch, value);
CCtxParams->ldmParams.minMatchLength = value;
return CCtxParams->ldmParams.minMatchLength;
- case ZSTD_p_ldmBucketSizeLog :
- if (value > ZSTD_LDM_BUCKETSIZELOG_MAX)
- return ERROR(parameter_outOfBound);
+ case ZSTD_c_ldmBucketSizeLog :
+ if (value!=0) /* 0 ==> default */
+ BOUNDCHECK(ZSTD_c_ldmBucketSizeLog, value);
CCtxParams->ldmParams.bucketSizeLog = value;
return CCtxParams->ldmParams.bucketSizeLog;
- case ZSTD_p_ldmHashEveryLog :
+ case ZSTD_c_ldmHashRateLog :
if (value > ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN)
return ERROR(parameter_outOfBound);
- CCtxParams->ldmParams.hashEveryLog = value;
- return CCtxParams->ldmParams.hashEveryLog;
+ CCtxParams->ldmParams.hashRateLog = value;
+ return CCtxParams->ldmParams.hashRateLog;
default: return ERROR(parameter_unsupported);
}
}
+size_t ZSTD_CCtx_getParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int* value)
+{
+ return ZSTD_CCtxParam_getParameter(&cctx->requestedParams, param, value);
+}
+
+size_t ZSTD_CCtxParam_getParameter(
+ ZSTD_CCtx_params* CCtxParams, ZSTD_cParameter param, int* value)
+{
+ switch(param)
+ {
+ case ZSTD_c_format :
+ *value = CCtxParams->format;
+ break;
+ case ZSTD_c_compressionLevel :
+ *value = CCtxParams->compressionLevel;
+ break;
+ case ZSTD_c_windowLog :
+ *value = CCtxParams->cParams.windowLog;
+ break;
+ case ZSTD_c_hashLog :
+ *value = CCtxParams->cParams.hashLog;
+ break;
+ case ZSTD_c_chainLog :
+ *value = CCtxParams->cParams.chainLog;
+ break;
+ case ZSTD_c_searchLog :
+ *value = CCtxParams->cParams.searchLog;
+ break;
+ case ZSTD_c_minMatch :
+ *value = CCtxParams->cParams.minMatch;
+ break;
+ case ZSTD_c_targetLength :
+ *value = CCtxParams->cParams.targetLength;
+ break;
+ case ZSTD_c_strategy :
+ *value = (unsigned)CCtxParams->cParams.strategy;
+ break;
+ case ZSTD_c_contentSizeFlag :
+ *value = CCtxParams->fParams.contentSizeFlag;
+ break;
+ case ZSTD_c_checksumFlag :
+ *value = CCtxParams->fParams.checksumFlag;
+ break;
+ case ZSTD_c_dictIDFlag :
+ *value = !CCtxParams->fParams.noDictIDFlag;
+ break;
+ case ZSTD_c_forceMaxWindow :
+ *value = CCtxParams->forceWindow;
+ break;
+ case ZSTD_c_forceAttachDict :
+ *value = CCtxParams->attachDictPref;
+ break;
+ case ZSTD_c_nbWorkers :
+#ifndef ZSTD_MULTITHREAD
+ assert(CCtxParams->nbWorkers == 0);
+#endif
+ *value = CCtxParams->nbWorkers;
+ break;
+ case ZSTD_c_jobSize :
+#ifndef ZSTD_MULTITHREAD
+ return ERROR(parameter_unsupported);
+#else
+ assert(CCtxParams->jobSize <= INT_MAX);
+ *value = (int)CCtxParams->jobSize;
+ break;
+#endif
+ case ZSTD_c_overlapLog :
+#ifndef ZSTD_MULTITHREAD
+ return ERROR(parameter_unsupported);
+#else
+ *value = CCtxParams->overlapLog;
+ break;
+#endif
+ case ZSTD_c_rsyncable :
+#ifndef ZSTD_MULTITHREAD
+ return ERROR(parameter_unsupported);
+#else
+ *value = CCtxParams->rsyncable;
+ break;
+#endif
+ case ZSTD_c_enableLongDistanceMatching :
+ *value = CCtxParams->ldmParams.enableLdm;
+ break;
+ case ZSTD_c_ldmHashLog :
+ *value = CCtxParams->ldmParams.hashLog;
+ break;
+ case ZSTD_c_ldmMinMatch :
+ *value = CCtxParams->ldmParams.minMatchLength;
+ break;
+ case ZSTD_c_ldmBucketSizeLog :
+ *value = CCtxParams->ldmParams.bucketSizeLog;
+ break;
+ case ZSTD_c_ldmHashRateLog :
+ *value = CCtxParams->ldmParams.hashRateLog;
+ break;
+ default: return ERROR(parameter_unsupported);
+ }
+ return 0;
+}
+
/** ZSTD_CCtx_setParametersUsingCCtxParams() :
* just applies `params` into `cctx`
* no action is performed, parameters are merely stored.
@@ -487,6 +744,7 @@ size_t ZSTD_CCtxParam_setParameter(
size_t ZSTD_CCtx_setParametersUsingCCtxParams(
ZSTD_CCtx* cctx, const ZSTD_CCtx_params* params)
{
+ DEBUGLOG(4, "ZSTD_CCtx_setParametersUsingCCtxParams");
if (cctx->streamStage != zcss_init) return ERROR(stage_wrong);
if (cctx->cdict) return ERROR(stage_wrong);
@@ -565,53 +823,59 @@ size_t ZSTD_CCtx_refPrefix_advanced(
return 0;
}
-static void ZSTD_startNewCompression(ZSTD_CCtx* cctx)
-{
- cctx->streamStage = zcss_init;
- cctx->pledgedSrcSizePlusOne = 0;
-}
-
/*! ZSTD_CCtx_reset() :
* Also dumps dictionary */
-void ZSTD_CCtx_reset(ZSTD_CCtx* cctx)
+size_t ZSTD_CCtx_reset(ZSTD_CCtx* cctx, ZSTD_ResetDirective reset)
{
- ZSTD_startNewCompression(cctx);
- cctx->cdict = NULL;
+ if ( (reset == ZSTD_reset_session_only)
+ || (reset == ZSTD_reset_session_and_parameters) ) {
+ cctx->streamStage = zcss_init;
+ cctx->pledgedSrcSizePlusOne = 0;
+ }
+ if ( (reset == ZSTD_reset_parameters)
+ || (reset == ZSTD_reset_session_and_parameters) ) {
+ if (cctx->streamStage != zcss_init) return ERROR(stage_wrong);
+ cctx->cdict = NULL;
+ return ZSTD_CCtxParams_reset(&cctx->requestedParams);
+ }
+ return 0;
}
+
/** ZSTD_checkCParams() :
control CParam values remain within authorized range.
@return : 0, or an error code if one value is beyond authorized range */
size_t ZSTD_checkCParams(ZSTD_compressionParameters cParams)
{
- CLAMPCHECK(cParams.windowLog, ZSTD_WINDOWLOG_MIN, ZSTD_WINDOWLOG_MAX);
- CLAMPCHECK(cParams.chainLog, ZSTD_CHAINLOG_MIN, ZSTD_CHAINLOG_MAX);
- CLAMPCHECK(cParams.hashLog, ZSTD_HASHLOG_MIN, ZSTD_HASHLOG_MAX);
- CLAMPCHECK(cParams.searchLog, ZSTD_SEARCHLOG_MIN, ZSTD_SEARCHLOG_MAX);
- CLAMPCHECK(cParams.searchLength, ZSTD_SEARCHLENGTH_MIN, ZSTD_SEARCHLENGTH_MAX);
- if ((U32)(cParams.targetLength) < ZSTD_TARGETLENGTH_MIN)
- return ERROR(parameter_unsupported);
- if ((U32)(cParams.strategy) > (U32)ZSTD_btultra)
- return ERROR(parameter_unsupported);
+ BOUNDCHECK(ZSTD_c_windowLog, cParams.windowLog);
+ BOUNDCHECK(ZSTD_c_chainLog, cParams.chainLog);
+ BOUNDCHECK(ZSTD_c_hashLog, cParams.hashLog);
+ BOUNDCHECK(ZSTD_c_searchLog, cParams.searchLog);
+ BOUNDCHECK(ZSTD_c_minMatch, cParams.minMatch);
+ BOUNDCHECK(ZSTD_c_targetLength,cParams.targetLength);
+ BOUNDCHECK(ZSTD_c_strategy, cParams.strategy);
return 0;
}
/** ZSTD_clampCParams() :
* make CParam values within valid range.
* @return : valid CParams */
-static ZSTD_compressionParameters ZSTD_clampCParams(ZSTD_compressionParameters cParams)
-{
-# define CLAMP(val,min,max) { \
- if (val<min) val=min; \
- else if (val>max) val=max; \
- }
- CLAMP(cParams.windowLog, ZSTD_WINDOWLOG_MIN, ZSTD_WINDOWLOG_MAX);
- CLAMP(cParams.chainLog, ZSTD_CHAINLOG_MIN, ZSTD_CHAINLOG_MAX);
- CLAMP(cParams.hashLog, ZSTD_HASHLOG_MIN, ZSTD_HASHLOG_MAX);
- CLAMP(cParams.searchLog, ZSTD_SEARCHLOG_MIN, ZSTD_SEARCHLOG_MAX);
- CLAMP(cParams.searchLength, ZSTD_SEARCHLENGTH_MIN, ZSTD_SEARCHLENGTH_MAX);
- if ((U32)(cParams.targetLength) < ZSTD_TARGETLENGTH_MIN) cParams.targetLength = ZSTD_TARGETLENGTH_MIN;
- if ((U32)(cParams.strategy) > (U32)ZSTD_btultra) cParams.strategy = ZSTD_btultra;
+static ZSTD_compressionParameters
+ZSTD_clampCParams(ZSTD_compressionParameters cParams)
+{
+# define CLAMP_TYPE(cParam, val, type) { \
+ ZSTD_bounds const bounds = ZSTD_cParam_getBounds(cParam); \
+ if ((int)val<bounds.lowerBound) val=(type)bounds.lowerBound; \
+ else if ((int)val>bounds.upperBound) val=(type)bounds.upperBound; \
+ }
+# define CLAMP(cParam, val) CLAMP_TYPE(cParam, val, int)
+ CLAMP(ZSTD_c_windowLog, cParams.windowLog);
+ CLAMP(ZSTD_c_chainLog, cParams.chainLog);
+ CLAMP(ZSTD_c_hashLog, cParams.hashLog);
+ CLAMP(ZSTD_c_searchLog, cParams.searchLog);
+ CLAMP(ZSTD_c_minMatch, cParams.minMatch);
+ CLAMP(ZSTD_c_targetLength,cParams.targetLength);
+ CLAMP_TYPE(ZSTD_c_strategy,cParams.strategy, ZSTD_strategy);
return cParams;
}
@@ -627,8 +891,11 @@ static U32 ZSTD_cycleLog(U32 hashLog, ZSTD_strategy strat)
optimize `cPar` for a given input (`srcSize` and `dictSize`).
mostly downsizing to reduce memory consumption and initialization latency.
Both `srcSize` and `dictSize` are optional (use 0 if unknown).
- Note : cPar is considered validated at this stage. Use ZSTD_checkCParams() to ensure that condition. */
-ZSTD_compressionParameters ZSTD_adjustCParams_internal(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize)
+ Note : cPar is assumed validated. Use ZSTD_checkCParams() to ensure this condition. */
+static ZSTD_compressionParameters
+ZSTD_adjustCParams_internal(ZSTD_compressionParameters cPar,
+ unsigned long long srcSize,
+ size_t dictSize)
{
static const U64 minSrcSize = 513; /* (1<<9) + 1 */
static const U64 maxWindowResize = 1ULL << (ZSTD_WINDOWLOG_MAX-1);
@@ -648,7 +915,7 @@ ZSTD_compressionParameters ZSTD_adjustCParams_internal(ZSTD_compressionParameter
ZSTD_highbit32(tSize-1) + 1;
if (cPar.windowLog > srcLog) cPar.windowLog = srcLog;
}
- if (cPar.hashLog > cPar.windowLog) cPar.hashLog = cPar.windowLog;
+ if (cPar.hashLog > cPar.windowLog+1) cPar.hashLog = cPar.windowLog+1;
{ U32 const cycleLog = ZSTD_cycleLog(cPar.chainLog, cPar.strategy);
if (cycleLog > cPar.windowLog)
cPar.chainLog -= (cycleLog - cPar.windowLog);
@@ -660,23 +927,43 @@ ZSTD_compressionParameters ZSTD_adjustCParams_internal(ZSTD_compressionParameter
return cPar;
}
-ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize)
+ZSTD_compressionParameters
+ZSTD_adjustCParams(ZSTD_compressionParameters cPar,
+ unsigned long long srcSize,
+ size_t dictSize)
{
cPar = ZSTD_clampCParams(cPar);
return ZSTD_adjustCParams_internal(cPar, srcSize, dictSize);
}
-static size_t ZSTD_sizeof_matchState(ZSTD_compressionParameters const* cParams, const U32 forCCtx)
+ZSTD_compressionParameters ZSTD_getCParamsFromCCtxParams(
+ const ZSTD_CCtx_params* CCtxParams, U64 srcSizeHint, size_t dictSize)
+{
+ ZSTD_compressionParameters cParams = ZSTD_getCParams(CCtxParams->compressionLevel, srcSizeHint, dictSize);
+ if (CCtxParams->ldmParams.enableLdm) cParams.windowLog = ZSTD_LDM_DEFAULT_WINDOW_LOG;
+ if (CCtxParams->cParams.windowLog) cParams.windowLog = CCtxParams->cParams.windowLog;
+ if (CCtxParams->cParams.hashLog) cParams.hashLog = CCtxParams->cParams.hashLog;
+ if (CCtxParams->cParams.chainLog) cParams.chainLog = CCtxParams->cParams.chainLog;
+ if (CCtxParams->cParams.searchLog) cParams.searchLog = CCtxParams->cParams.searchLog;
+ if (CCtxParams->cParams.minMatch) cParams.minMatch = CCtxParams->cParams.minMatch;
+ if (CCtxParams->cParams.targetLength) cParams.targetLength = CCtxParams->cParams.targetLength;
+ if (CCtxParams->cParams.strategy) cParams.strategy = CCtxParams->cParams.strategy;
+ assert(!ZSTD_checkCParams(cParams));
+ return ZSTD_adjustCParams_internal(cParams, srcSizeHint, dictSize);
+}
+
+static size_t
+ZSTD_sizeof_matchState(const ZSTD_compressionParameters* const cParams,
+ const U32 forCCtx)
{
size_t const chainSize = (cParams->strategy == ZSTD_fast) ? 0 : ((size_t)1 << cParams->chainLog);
size_t const hSize = ((size_t)1) << cParams->hashLog;
- U32 const hashLog3 = (forCCtx && cParams->searchLength==3) ? MIN(ZSTD_HASHLOG3_MAX, cParams->windowLog) : 0;
+ U32 const hashLog3 = (forCCtx && cParams->minMatch==3) ? MIN(ZSTD_HASHLOG3_MAX, cParams->windowLog) : 0;
size_t const h3Size = ((size_t)1) << hashLog3;
size_t const tableSpace = (chainSize + hSize + h3Size) * sizeof(U32);
size_t const optPotentialSpace = ((MaxML+1) + (MaxLL+1) + (MaxOff+1) + (1<<Litbits)) * sizeof(U32)
+ (ZSTD_OPT_NUM+1) * (sizeof(ZSTD_match_t)+sizeof(ZSTD_optimal_t));
- size_t const optSpace = (forCCtx && ((cParams->strategy == ZSTD_btopt) ||
- (cParams->strategy == ZSTD_btultra)))
+ size_t const optSpace = (forCCtx && (cParams->strategy >= ZSTD_btopt))
? optPotentialSpace
: 0;
DEBUGLOG(4, "chainSize: %u - hSize: %u - h3Size: %u",
@@ -691,9 +978,9 @@ size_t ZSTD_estimateCCtxSize_usingCCtxParams(const ZSTD_CCtx_params* params)
{ ZSTD_compressionParameters const cParams =
ZSTD_getCParamsFromCCtxParams(params, 0, 0);
size_t const blockSize = MIN(ZSTD_BLOCKSIZE_MAX, (size_t)1 << cParams.windowLog);
- U32 const divider = (cParams.searchLength==3) ? 3 : 4;
+ U32 const divider = (cParams.minMatch==3) ? 3 : 4;
size_t const maxNbSeq = blockSize / divider;
- size_t const tokenSpace = blockSize + 11*maxNbSeq;
+ size_t const tokenSpace = WILDCOPY_OVERLENGTH + blockSize + 11*maxNbSeq;
size_t const entropySpace = HUF_WORKSPACE_SIZE;
size_t const blockStateSpace = 2 * sizeof(ZSTD_compressedBlockState_t);
size_t const matchStateSize = ZSTD_sizeof_matchState(&cParams, /* forCCtx */ 1);
@@ -726,7 +1013,7 @@ size_t ZSTD_estimateCCtxSize(int compressionLevel)
{
int level;
size_t memBudget = 0;
- for (level=1; level<=compressionLevel; level++) {
+ for (level=MIN(compressionLevel, 1); level<=compressionLevel; level++) {
size_t const newMB = ZSTD_estimateCCtxSize_internal(level);
if (newMB > memBudget) memBudget = newMB;
}
@@ -752,15 +1039,17 @@ size_t ZSTD_estimateCStreamSize_usingCParams(ZSTD_compressionParameters cParams)
return ZSTD_estimateCStreamSize_usingCCtxParams(&params);
}
-static size_t ZSTD_estimateCStreamSize_internal(int compressionLevel) {
+static size_t ZSTD_estimateCStreamSize_internal(int compressionLevel)
+{
ZSTD_compressionParameters const cParams = ZSTD_getCParams(compressionLevel, 0, 0);
return ZSTD_estimateCStreamSize_usingCParams(cParams);
}
-size_t ZSTD_estimateCStreamSize(int compressionLevel) {
+size_t ZSTD_estimateCStreamSize(int compressionLevel)
+{
int level;
size_t memBudget = 0;
- for (level=1; level<=compressionLevel; level++) {
+ for (level=MIN(compressionLevel, 1); level<=compressionLevel; level++) {
size_t const newMB = ZSTD_estimateCStreamSize_internal(level);
if (newMB > memBudget) memBudget = newMB;
}
@@ -786,9 +1075,27 @@ ZSTD_frameProgression ZSTD_getFrameProgression(const ZSTD_CCtx* cctx)
fp.ingested = cctx->consumedSrcSize + buffered;
fp.consumed = cctx->consumedSrcSize;
fp.produced = cctx->producedCSize;
+ fp.flushed = cctx->producedCSize; /* simplified; some data might still be left within streaming output buffer */
+ fp.currentJobID = 0;
+ fp.nbActiveWorkers = 0;
return fp;
} }
+/*! ZSTD_toFlushNow()
+ * Only useful for multithreading scenarios currently (nbWorkers >= 1).
+ */
+size_t ZSTD_toFlushNow(ZSTD_CCtx* cctx)
+{
+#ifdef ZSTD_MULTITHREAD
+ if (cctx->appliedParams.nbWorkers > 0) {
+ return ZSTDMT_toFlushNow(cctx->mtctx);
+ }
+#endif
+ (void)cctx;
+ return 0; /* over-simplification; could also check if context is currently running in streaming mode, and in which case, report how many bytes are left to be flushed within output buffer */
+}
+
+
static U32 ZSTD_equivalentCParams(ZSTD_compressionParameters cParams1,
ZSTD_compressionParameters cParams2)
@@ -796,7 +1103,21 @@ static U32 ZSTD_equivalentCParams(ZSTD_compressionParameters cParams1,
return (cParams1.hashLog == cParams2.hashLog)
& (cParams1.chainLog == cParams2.chainLog)
& (cParams1.strategy == cParams2.strategy) /* opt parser space */
- & ((cParams1.searchLength==3) == (cParams2.searchLength==3)); /* hashlog3 space */
+ & ((cParams1.minMatch==3) == (cParams2.minMatch==3)); /* hashlog3 space */
+}
+
+static void ZSTD_assertEqualCParams(ZSTD_compressionParameters cParams1,
+ ZSTD_compressionParameters cParams2)
+{
+ (void)cParams1;
+ (void)cParams2;
+ assert(cParams1.windowLog == cParams2.windowLog);
+ assert(cParams1.chainLog == cParams2.chainLog);
+ assert(cParams1.hashLog == cParams2.hashLog);
+ assert(cParams1.searchLog == cParams2.searchLog);
+ assert(cParams1.minMatch == cParams2.minMatch);
+ assert(cParams1.targetLength == cParams2.targetLength);
+ assert(cParams1.strategy == cParams2.strategy);
}
/** The parameters are equivalent if ldm is not enabled in both sets or
@@ -809,7 +1130,7 @@ static U32 ZSTD_equivalentLdmParams(ldmParams_t ldmParams1,
ldmParams1.hashLog == ldmParams2.hashLog &&
ldmParams1.bucketSizeLog == ldmParams2.bucketSizeLog &&
ldmParams1.minMatchLength == ldmParams2.minMatchLength &&
- ldmParams1.hashEveryLog == ldmParams2.hashEveryLog);
+ ldmParams1.hashRateLog == ldmParams2.hashRateLog);
}
typedef enum { ZSTDb_not_buffered, ZSTDb_buffered } ZSTD_buffered_policy_e;
@@ -817,33 +1138,51 @@ typedef enum { ZSTDb_not_buffered, ZSTDb_buffered } ZSTD_buffered_policy_e;
/* ZSTD_sufficientBuff() :
* check internal buffers exist for streaming if buffPol == ZSTDb_buffered .
* Note : they are assumed to be correctly sized if ZSTD_equivalentCParams()==1 */
-static U32 ZSTD_sufficientBuff(size_t bufferSize1, size_t blockSize1,
+static U32 ZSTD_sufficientBuff(size_t bufferSize1, size_t maxNbSeq1,
+ size_t maxNbLit1,
ZSTD_buffered_policy_e buffPol2,
ZSTD_compressionParameters cParams2,
U64 pledgedSrcSize)
{
size_t const windowSize2 = MAX(1, (size_t)MIN(((U64)1 << cParams2.windowLog), pledgedSrcSize));
size_t const blockSize2 = MIN(ZSTD_BLOCKSIZE_MAX, windowSize2);
+ size_t const maxNbSeq2 = blockSize2 / ((cParams2.minMatch == 3) ? 3 : 4);
+ size_t const maxNbLit2 = blockSize2;
size_t const neededBufferSize2 = (buffPol2==ZSTDb_buffered) ? windowSize2 + blockSize2 : 0;
- DEBUGLOG(4, "ZSTD_sufficientBuff: is windowSize2=%u <= wlog1=%u",
- (U32)windowSize2, cParams2.windowLog);
- DEBUGLOG(4, "ZSTD_sufficientBuff: is blockSize2=%u <= blockSize1=%u",
- (U32)blockSize2, (U32)blockSize1);
- return (blockSize2 <= blockSize1) /* seqStore space depends on blockSize */
+ DEBUGLOG(4, "ZSTD_sufficientBuff: is neededBufferSize2=%u <= bufferSize1=%u",
+ (U32)neededBufferSize2, (U32)bufferSize1);
+ DEBUGLOG(4, "ZSTD_sufficientBuff: is maxNbSeq2=%u <= maxNbSeq1=%u",
+ (U32)maxNbSeq2, (U32)maxNbSeq1);
+ DEBUGLOG(4, "ZSTD_sufficientBuff: is maxNbLit2=%u <= maxNbLit1=%u",
+ (U32)maxNbLit2, (U32)maxNbLit1);
+ return (maxNbLit2 <= maxNbLit1)
+ & (maxNbSeq2 <= maxNbSeq1)
& (neededBufferSize2 <= bufferSize1);
}
/** Equivalence for resetCCtx purposes */
static U32 ZSTD_equivalentParams(ZSTD_CCtx_params params1,
ZSTD_CCtx_params params2,
- size_t buffSize1, size_t blockSize1,
+ size_t buffSize1,
+ size_t maxNbSeq1, size_t maxNbLit1,
ZSTD_buffered_policy_e buffPol2,
U64 pledgedSrcSize)
{
DEBUGLOG(4, "ZSTD_equivalentParams: pledgedSrcSize=%u", (U32)pledgedSrcSize);
- return ZSTD_equivalentCParams(params1.cParams, params2.cParams) &&
- ZSTD_equivalentLdmParams(params1.ldmParams, params2.ldmParams) &&
- ZSTD_sufficientBuff(buffSize1, blockSize1, buffPol2, params2.cParams, pledgedSrcSize);
+ if (!ZSTD_equivalentCParams(params1.cParams, params2.cParams)) {
+ DEBUGLOG(4, "ZSTD_equivalentCParams() == 0");
+ return 0;
+ }
+ if (!ZSTD_equivalentLdmParams(params1.ldmParams, params2.ldmParams)) {
+ DEBUGLOG(4, "ZSTD_equivalentLdmParams() == 0");
+ return 0;
+ }
+ if (!ZSTD_sufficientBuff(buffSize1, maxNbSeq1, maxNbLit1, buffPol2,
+ params2.cParams, pledgedSrcSize)) {
+ DEBUGLOG(4, "ZSTD_sufficientBuff() == 0");
+ return 0;
+ }
+ return 1;
}
static void ZSTD_reset_compressedBlockState(ZSTD_compressedBlockState_t* bs)
@@ -851,10 +1190,10 @@ static void ZSTD_reset_compressedBlockState(ZSTD_compressedBlockState_t* bs)
int i;
for (i = 0; i < ZSTD_REP_NUM; ++i)
bs->rep[i] = repStartValue[i];
- bs->entropy.hufCTable_repeatMode = HUF_repeat_none;
- bs->entropy.offcode_repeatMode = FSE_repeat_none;
- bs->entropy.matchlength_repeatMode = FSE_repeat_none;
- bs->entropy.litlength_repeatMode = FSE_repeat_none;
+ bs->entropy.huf.repeatMode = HUF_repeat_none;
+ bs->entropy.fse.offcode_repeatMode = FSE_repeat_none;
+ bs->entropy.fse.matchlength_repeatMode = FSE_repeat_none;
+ bs->entropy.fse.litlength_repeatMode = FSE_repeat_none;
}
/*! ZSTD_invalidateMatchState()
@@ -865,9 +1204,11 @@ static void ZSTD_invalidateMatchState(ZSTD_matchState_t* ms)
{
ZSTD_window_clear(&ms->window);
- ms->nextToUpdate = ms->window.dictLimit + 1;
+ ms->nextToUpdate = ms->window.dictLimit;
+ ms->nextToUpdate3 = ms->window.dictLimit;
ms->loadedDictEnd = 0;
ms->opt.litLengthSum = 0; /* force reset of btopt stats */
+ ms->dictMatchState = NULL;
}
/*! ZSTD_continueCCtx() :
@@ -880,6 +1221,7 @@ static size_t ZSTD_continueCCtx(ZSTD_CCtx* cctx, ZSTD_CCtx_params params, U64 pl
cctx->blockSize = blockSize; /* previous block size could be different even for same windowLog, due to pledgedSrcSize */
cctx->appliedParams = params;
+ cctx->blockState.matchState.cParams = params.cParams;
cctx->pledgedSrcSizePlusOne = pledgedSrcSize+1;
cctx->consumedSrcSize = 0;
cctx->producedCSize = 0;
@@ -900,11 +1242,15 @@ static size_t ZSTD_continueCCtx(ZSTD_CCtx* cctx, ZSTD_CCtx_params params, U64 pl
typedef enum { ZSTDcrp_continue, ZSTDcrp_noMemset } ZSTD_compResetPolicy_e;
-static void* ZSTD_reset_matchState(ZSTD_matchState_t* ms, void* ptr, ZSTD_compressionParameters const* cParams, ZSTD_compResetPolicy_e const crp, U32 const forCCtx)
+static void*
+ZSTD_reset_matchState(ZSTD_matchState_t* ms,
+ void* ptr,
+ const ZSTD_compressionParameters* cParams,
+ ZSTD_compResetPolicy_e const crp, U32 const forCCtx)
{
size_t const chainSize = (cParams->strategy == ZSTD_fast) ? 0 : ((size_t)1 << cParams->chainLog);
size_t const hSize = ((size_t)1) << cParams->hashLog;
- U32 const hashLog3 = (forCCtx && cParams->searchLength==3) ? MIN(ZSTD_HASHLOG3_MAX, cParams->windowLog) : 0;
+ U32 const hashLog3 = (forCCtx && cParams->minMatch==3) ? MIN(ZSTD_HASHLOG3_MAX, cParams->windowLog) : 0;
size_t const h3Size = ((size_t)1) << hashLog3;
size_t const tableSpace = (chainSize + hSize + h3Size) * sizeof(U32);
@@ -912,12 +1258,15 @@ static void* ZSTD_reset_matchState(ZSTD_matchState_t* ms, void* ptr, ZSTD_compre
ms->hashLog3 = hashLog3;
memset(&ms->window, 0, sizeof(ms->window));
+ ms->window.dictLimit = 1; /* start from 1, so that 1st position is valid */
+ ms->window.lowLimit = 1; /* it ensures first and later CCtx usages compress the same */
+ ms->window.nextSrc = ms->window.base + 1; /* see issue #1241 */
ZSTD_invalidateMatchState(ms);
/* opt parser space */
- if (forCCtx && ((cParams->strategy == ZSTD_btopt) | (cParams->strategy == ZSTD_btultra))) {
+ if (forCCtx && (cParams->strategy >= ZSTD_btopt)) {
DEBUGLOG(4, "reserving optimal parser space");
- ms->opt.litFreq = (U32*)ptr;
+ ms->opt.litFreq = (unsigned*)ptr;
ms->opt.litLengthFreq = ms->opt.litFreq + (1<<Litbits);
ms->opt.matchLengthFreq = ms->opt.litLengthFreq + (MaxLL+1);
ms->opt.offCodeFreq = ms->opt.matchLengthFreq + (MaxML+1);
@@ -937,14 +1286,24 @@ static void* ZSTD_reset_matchState(ZSTD_matchState_t* ms, void* ptr, ZSTD_compre
ms->hashTable3 = ms->chainTable + chainSize;
ptr = ms->hashTable3 + h3Size;
+ ms->cParams = *cParams;
+
assert(((size_t)ptr & 3) == 0);
return ptr;
}
+#define ZSTD_WORKSPACETOOLARGE_FACTOR 3 /* define "workspace is too large" as this number of times larger than needed */
+#define ZSTD_WORKSPACETOOLARGE_MAXDURATION 128 /* when workspace is continuously too large
+ * during at least this number of times,
+ * context's memory usage is considered wasteful,
+ * because it's sized to handle a worst case scenario which rarely happens.
+ * In which case, resize it down to free some memory */
+
/*! ZSTD_resetCCtx_internal() :
note : `params` are assumed fully validated at this stage */
static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc,
- ZSTD_CCtx_params params, U64 pledgedSrcSize,
+ ZSTD_CCtx_params params,
+ U64 pledgedSrcSize,
ZSTD_compResetPolicy_e const crp,
ZSTD_buffered_policy_e const zbuff)
{
@@ -954,34 +1313,35 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc,
if (crp == ZSTDcrp_continue) {
if (ZSTD_equivalentParams(zc->appliedParams, params,
- zc->inBuffSize, zc->blockSize,
- zbuff, pledgedSrcSize)) {
- DEBUGLOG(4, "ZSTD_equivalentParams()==1 -> continue mode (wLog1=%u, blockSize1=%u)",
- zc->appliedParams.cParams.windowLog, (U32)zc->blockSize);
- return ZSTD_continueCCtx(zc, params, pledgedSrcSize);
+ zc->inBuffSize,
+ zc->seqStore.maxNbSeq, zc->seqStore.maxNbLit,
+ zbuff, pledgedSrcSize)) {
+ DEBUGLOG(4, "ZSTD_equivalentParams()==1 -> continue mode (wLog1=%u, blockSize1=%zu)",
+ zc->appliedParams.cParams.windowLog, zc->blockSize);
+ zc->workSpaceOversizedDuration += (zc->workSpaceOversizedDuration > 0); /* if it was too large, it still is */
+ if (zc->workSpaceOversizedDuration <= ZSTD_WORKSPACETOOLARGE_MAXDURATION)
+ return ZSTD_continueCCtx(zc, params, pledgedSrcSize);
} }
DEBUGLOG(4, "ZSTD_equivalentParams()==0 -> reset CCtx");
if (params.ldmParams.enableLdm) {
/* Adjust long distance matching parameters */
- params.ldmParams.windowLog = params.cParams.windowLog;
ZSTD_ldm_adjustParameters(&params.ldmParams, &params.cParams);
assert(params.ldmParams.hashLog >= params.ldmParams.bucketSizeLog);
- assert(params.ldmParams.hashEveryLog < 32);
- zc->ldmState.hashPower =
- ZSTD_ldm_getHashPower(params.ldmParams.minMatchLength);
+ assert(params.ldmParams.hashRateLog < 32);
+ zc->ldmState.hashPower = ZSTD_rollingHash_primePower(params.ldmParams.minMatchLength);
}
{ size_t const windowSize = MAX(1, (size_t)MIN(((U64)1 << params.cParams.windowLog), pledgedSrcSize));
size_t const blockSize = MIN(ZSTD_BLOCKSIZE_MAX, windowSize);
- U32 const divider = (params.cParams.searchLength==3) ? 3 : 4;
+ U32 const divider = (params.cParams.minMatch==3) ? 3 : 4;
size_t const maxNbSeq = blockSize / divider;
- size_t const tokenSpace = blockSize + 11*maxNbSeq;
+ size_t const tokenSpace = WILDCOPY_OVERLENGTH + blockSize + 11*maxNbSeq;
size_t const buffOutSize = (zbuff==ZSTDb_buffered) ? ZSTD_compressBound(blockSize)+1 : 0;
size_t const buffInSize = (zbuff==ZSTDb_buffered) ? windowSize + blockSize : 0;
size_t const matchStateSize = ZSTD_sizeof_matchState(&params.cParams, /* forCCtx */ 1);
size_t const maxNbLdmSeq = ZSTD_ldm_getMaxNbSeq(params.ldmParams, blockSize);
- void* ptr;
+ void* ptr; /* used to partition workSpace */
/* Check if workSpace is large enough, alloc a new one if needed */
{ size_t const entropySpace = HUF_WORKSPACE_SIZE;
@@ -993,14 +1353,20 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc,
size_t const neededSpace = entropySpace + blockStateSpace + ldmSpace +
ldmSeqSpace + matchStateSize + tokenSpace +
bufferSpace;
- DEBUGLOG(4, "Need %uKB workspace, including %uKB for match state, and %uKB for buffers",
- (U32)(neededSpace>>10), (U32)(matchStateSize>>10), (U32)(bufferSpace>>10));
- DEBUGLOG(4, "windowSize: %u - blockSize: %u", (U32)windowSize, (U32)blockSize);
-
- if (zc->workSpaceSize < neededSpace) { /* too small : resize */
- DEBUGLOG(4, "Need to update workSpaceSize from %uK to %uK",
- (unsigned)(zc->workSpaceSize>>10),
- (unsigned)(neededSpace>>10));
+
+ int const workSpaceTooSmall = zc->workSpaceSize < neededSpace;
+ int const workSpaceTooLarge = zc->workSpaceSize > ZSTD_WORKSPACETOOLARGE_FACTOR * neededSpace;
+ int const workSpaceWasteful = workSpaceTooLarge && (zc->workSpaceOversizedDuration > ZSTD_WORKSPACETOOLARGE_MAXDURATION);
+ zc->workSpaceOversizedDuration = workSpaceTooLarge ? zc->workSpaceOversizedDuration+1 : 0;
+
+ DEBUGLOG(4, "Need %zuKB workspace, including %zuKB for match state, and %zuKB for buffers",
+ neededSpace>>10, matchStateSize>>10, bufferSpace>>10);
+ DEBUGLOG(4, "windowSize: %zu - blockSize: %zu", windowSize, blockSize);
+
+ if (workSpaceTooSmall || workSpaceWasteful) {
+ DEBUGLOG(4, "Need to resize workSpaceSize from %zuKB to %zuKB",
+ zc->workSpaceSize >> 10,
+ neededSpace >> 10);
/* static cctx : no resize, error out */
if (zc->staticSize) return ERROR(memory_allocation);
@@ -1009,9 +1375,11 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc,
zc->workSpace = ZSTD_malloc(neededSpace, zc->customMem);
if (zc->workSpace == NULL) return ERROR(memory_allocation);
zc->workSpaceSize = neededSpace;
- ptr = zc->workSpace;
+ zc->workSpaceOversizedDuration = 0;
- /* Statically sized space. entropyWorkspace never moves (but prev/next block swap places) */
+ /* Statically sized space.
+ * entropyWorkspace never moves,
+ * though prev/next block swap places */
assert(((size_t)zc->workSpace & 3) == 0); /* ensure correct alignment */
assert(zc->workSpaceSize >= 2 * sizeof(ZSTD_compressedBlockState_t));
zc->blockState.prevCBlock = (ZSTD_compressedBlockState_t*)zc->workSpace;
@@ -1022,13 +1390,14 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc,
/* init params */
zc->appliedParams = params;
+ zc->blockState.matchState.cParams = params.cParams;
zc->pledgedSrcSizePlusOne = pledgedSrcSize+1;
zc->consumedSrcSize = 0;
zc->producedCSize = 0;
if (pledgedSrcSize == ZSTD_CONTENTSIZE_UNKNOWN)
zc->appliedParams.fParams.contentSizeFlag = 0;
DEBUGLOG(4, "pledged content size : %u ; flag : %u",
- (U32)pledgedSrcSize, zc->appliedParams.fParams.contentSizeFlag);
+ (unsigned)pledgedSrcSize, zc->appliedParams.fParams.contentSizeFlag);
zc->blockSize = blockSize;
XXH64_reset(&zc->xxhState, 0);
@@ -1058,13 +1427,18 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc,
ptr = ZSTD_reset_matchState(&zc->blockState.matchState, ptr, &params.cParams, crp, /* forCCtx */ 1);
/* sequences storage */
+ zc->seqStore.maxNbSeq = maxNbSeq;
zc->seqStore.sequencesStart = (seqDef*)ptr;
ptr = zc->seqStore.sequencesStart + maxNbSeq;
zc->seqStore.llCode = (BYTE*) ptr;
zc->seqStore.mlCode = zc->seqStore.llCode + maxNbSeq;
zc->seqStore.ofCode = zc->seqStore.mlCode + maxNbSeq;
zc->seqStore.litStart = zc->seqStore.ofCode + maxNbSeq;
- ptr = zc->seqStore.litStart + blockSize;
+ /* ZSTD_wildcopy() is used to copy into the literals buffer,
+ * so we have to oversize the buffer by WILDCOPY_OVERLENGTH bytes.
+ */
+ zc->seqStore.maxNbLit = blockSize;
+ ptr = zc->seqStore.litStart + blockSize + WILDCOPY_OVERLENGTH;
/* ldm bucketOffsets table */
if (params.ldmParams.enableLdm) {
@@ -1098,28 +1472,111 @@ void ZSTD_invalidateRepCodes(ZSTD_CCtx* cctx) {
assert(!ZSTD_window_hasExtDict(cctx->blockState.matchState.window));
}
-static size_t ZSTD_resetCCtx_usingCDict(ZSTD_CCtx* cctx,
+/* These are the approximate sizes for each strategy past which copying the
+ * dictionary tables into the working context is faster than using them
+ * in-place.
+ */
+static const size_t attachDictSizeCutoffs[ZSTD_STRATEGY_MAX+1] = {
+ 8 KB, /* unused */
+ 8 KB, /* ZSTD_fast */
+ 16 KB, /* ZSTD_dfast */
+ 32 KB, /* ZSTD_greedy */
+ 32 KB, /* ZSTD_lazy */
+ 32 KB, /* ZSTD_lazy2 */
+ 32 KB, /* ZSTD_btlazy2 */
+ 32 KB, /* ZSTD_btopt */
+ 8 KB, /* ZSTD_btultra */
+ 8 KB /* ZSTD_btultra2 */
+};
+
+static int ZSTD_shouldAttachDict(const ZSTD_CDict* cdict,
+ ZSTD_CCtx_params params,
+ U64 pledgedSrcSize)
+{
+ size_t cutoff = attachDictSizeCutoffs[cdict->matchState.cParams.strategy];
+ return ( pledgedSrcSize <= cutoff
+ || pledgedSrcSize == ZSTD_CONTENTSIZE_UNKNOWN
+ || params.attachDictPref == ZSTD_dictForceAttach )
+ && params.attachDictPref != ZSTD_dictForceCopy
+ && !params.forceWindow; /* dictMatchState isn't correctly
+ * handled in _enforceMaxDist */
+}
+
+static size_t ZSTD_resetCCtx_byAttachingCDict(
+ ZSTD_CCtx* cctx,
+ const ZSTD_CDict* cdict,
+ ZSTD_CCtx_params params,
+ U64 pledgedSrcSize,
+ ZSTD_buffered_policy_e zbuff)
+{
+ {
+ const ZSTD_compressionParameters *cdict_cParams = &cdict->matchState.cParams;
+ unsigned const windowLog = params.cParams.windowLog;
+ assert(windowLog != 0);
+ /* Resize working context table params for input only, since the dict
+ * has its own tables. */
+ params.cParams = ZSTD_adjustCParams_internal(*cdict_cParams, pledgedSrcSize, 0);
+ params.cParams.windowLog = windowLog;
+ ZSTD_resetCCtx_internal(cctx, params, pledgedSrcSize,
+ ZSTDcrp_continue, zbuff);
+ assert(cctx->appliedParams.cParams.strategy == cdict_cParams->strategy);
+ }
+
+ {
+ const U32 cdictEnd = (U32)( cdict->matchState.window.nextSrc
+ - cdict->matchState.window.base);
+ const U32 cdictLen = cdictEnd - cdict->matchState.window.dictLimit;
+ if (cdictLen == 0) {
+ /* don't even attach dictionaries with no contents */
+ DEBUGLOG(4, "skipping attaching empty dictionary");
+ } else {
+ DEBUGLOG(4, "attaching dictionary into context");
+ cctx->blockState.matchState.dictMatchState = &cdict->matchState;
+
+ /* prep working match state so dict matches never have negative indices
+ * when they are translated to the working context's index space. */
+ if (cctx->blockState.matchState.window.dictLimit < cdictEnd) {
+ cctx->blockState.matchState.window.nextSrc =
+ cctx->blockState.matchState.window.base + cdictEnd;
+ ZSTD_window_clear(&cctx->blockState.matchState.window);
+ }
+ cctx->blockState.matchState.loadedDictEnd = cctx->blockState.matchState.window.dictLimit;
+ }
+ }
+
+ cctx->dictID = cdict->dictID;
+
+ /* copy block state */
+ memcpy(cctx->blockState.prevCBlock, &cdict->cBlockState, sizeof(cdict->cBlockState));
+
+ return 0;
+}
+
+static size_t ZSTD_resetCCtx_byCopyingCDict(ZSTD_CCtx* cctx,
const ZSTD_CDict* cdict,
- unsigned windowLog,
- ZSTD_frameParameters fParams,
+ ZSTD_CCtx_params params,
U64 pledgedSrcSize,
ZSTD_buffered_policy_e zbuff)
{
- { ZSTD_CCtx_params params = cctx->requestedParams;
+ const ZSTD_compressionParameters *cdict_cParams = &cdict->matchState.cParams;
+
+ DEBUGLOG(4, "copying dictionary into context");
+
+ { unsigned const windowLog = params.cParams.windowLog;
+ assert(windowLog != 0);
/* Copy only compression parameters related to tables. */
- params.cParams = cdict->cParams;
- if (windowLog) params.cParams.windowLog = windowLog;
- params.fParams = fParams;
+ params.cParams = *cdict_cParams;
+ params.cParams.windowLog = windowLog;
ZSTD_resetCCtx_internal(cctx, params, pledgedSrcSize,
ZSTDcrp_noMemset, zbuff);
- assert(cctx->appliedParams.cParams.strategy == cdict->cParams.strategy);
- assert(cctx->appliedParams.cParams.hashLog == cdict->cParams.hashLog);
- assert(cctx->appliedParams.cParams.chainLog == cdict->cParams.chainLog);
+ assert(cctx->appliedParams.cParams.strategy == cdict_cParams->strategy);
+ assert(cctx->appliedParams.cParams.hashLog == cdict_cParams->hashLog);
+ assert(cctx->appliedParams.cParams.chainLog == cdict_cParams->chainLog);
}
/* copy tables */
- { size_t const chainSize = (cdict->cParams.strategy == ZSTD_fast) ? 0 : ((size_t)1 << cdict->cParams.chainLog);
- size_t const hSize = (size_t)1 << cdict->cParams.hashLog;
+ { size_t const chainSize = (cdict_cParams->strategy == ZSTD_fast) ? 0 : ((size_t)1 << cdict_cParams->chainLog);
+ size_t const hSize = (size_t)1 << cdict_cParams->hashLog;
size_t const tableSpace = (chainSize + hSize) * sizeof(U32);
assert((U32*)cctx->blockState.matchState.chainTable == (U32*)cctx->blockState.matchState.hashTable + hSize); /* chainTable must follow hashTable */
assert((U32*)cctx->blockState.matchState.hashTable3 == (U32*)cctx->blockState.matchState.chainTable + chainSize);
@@ -1127,6 +1584,7 @@ static size_t ZSTD_resetCCtx_usingCDict(ZSTD_CCtx* cctx,
assert((U32*)cdict->matchState.hashTable3 == (U32*)cdict->matchState.chainTable + chainSize);
memcpy(cctx->blockState.matchState.hashTable, cdict->matchState.hashTable, tableSpace); /* presumes all tables follow each other */
}
+
/* Zero the hashTable3, since the cdict never fills it */
{ size_t const h3Size = (size_t)1 << cctx->blockState.matchState.hashLog3;
assert(cdict->matchState.hashLog3 == 0);
@@ -1134,14 +1592,14 @@ static size_t ZSTD_resetCCtx_usingCDict(ZSTD_CCtx* cctx,
}
/* copy dictionary offsets */
- {
- ZSTD_matchState_t const* srcMatchState = &cdict->matchState;
+ { ZSTD_matchState_t const* srcMatchState = &cdict->matchState;
ZSTD_matchState_t* dstMatchState = &cctx->blockState.matchState;
dstMatchState->window = srcMatchState->window;
dstMatchState->nextToUpdate = srcMatchState->nextToUpdate;
dstMatchState->nextToUpdate3= srcMatchState->nextToUpdate3;
dstMatchState->loadedDictEnd= srcMatchState->loadedDictEnd;
}
+
cctx->dictID = cdict->dictID;
/* copy block state */
@@ -1150,6 +1608,28 @@ static size_t ZSTD_resetCCtx_usingCDict(ZSTD_CCtx* cctx,
return 0;
}
+/* We have a choice between copying the dictionary context into the working
+ * context, or referencing the dictionary context from the working context
+ * in-place. We decide here which strategy to use. */
+static size_t ZSTD_resetCCtx_usingCDict(ZSTD_CCtx* cctx,
+ const ZSTD_CDict* cdict,
+ ZSTD_CCtx_params params,
+ U64 pledgedSrcSize,
+ ZSTD_buffered_policy_e zbuff)
+{
+
+ DEBUGLOG(4, "ZSTD_resetCCtx_usingCDict (pledgedSrcSize=%u)",
+ (unsigned)pledgedSrcSize);
+
+ if (ZSTD_shouldAttachDict(cdict, params, pledgedSrcSize)) {
+ return ZSTD_resetCCtx_byAttachingCDict(
+ cctx, cdict, params, pledgedSrcSize, zbuff);
+ } else {
+ return ZSTD_resetCCtx_byCopyingCDict(
+ cctx, cdict, params, pledgedSrcSize, zbuff);
+ }
+}
+
/*! ZSTD_copyCCtx_internal() :
* Duplicate an existing context `srcCCtx` into another one `dstCCtx`.
* Only works during stage ZSTDcs_init (i.e. after creation, but before first call to ZSTD_compressContinue()).
@@ -1192,7 +1672,7 @@ static size_t ZSTD_copyCCtx_internal(ZSTD_CCtx* dstCCtx,
/* copy dictionary offsets */
{
- ZSTD_matchState_t const* srcMatchState = &srcCCtx->blockState.matchState;
+ const ZSTD_matchState_t* srcMatchState = &srcCCtx->blockState.matchState;
ZSTD_matchState_t* dstMatchState = &dstCCtx->blockState.matchState;
dstMatchState->window = srcMatchState->window;
dstMatchState->nextToUpdate = srcMatchState->nextToUpdate;
@@ -1294,15 +1774,15 @@ static void ZSTD_reduceIndex (ZSTD_CCtx* zc, const U32 reducerValue)
/* See doc/zstd_compression_format.md for detailed format description */
-size_t ZSTD_noCompressBlock (void* dst, size_t dstCapacity, const void* src, size_t srcSize)
+static size_t ZSTD_noCompressBlock (void* dst, size_t dstCapacity, const void* src, size_t srcSize, U32 lastBlock)
{
+ U32 const cBlockHeader24 = lastBlock + (((U32)bt_raw)<<1) + (U32)(srcSize << 3);
if (srcSize + ZSTD_blockHeaderSize > dstCapacity) return ERROR(dstSize_tooSmall);
+ MEM_writeLE24(dst, cBlockHeader24);
memcpy((BYTE*)dst + ZSTD_blockHeaderSize, src, srcSize);
- MEM_writeLE24(dst, (U32)(srcSize << 2) + (U32)bt_raw);
- return ZSTD_blockHeaderSize+srcSize;
+ return ZSTD_blockHeaderSize + srcSize;
}
-
static size_t ZSTD_noCompressLiterals (void* dst, size_t dstCapacity, const void* src, size_t srcSize)
{
BYTE* const ostart = (BYTE* const)dst;
@@ -1356,16 +1836,27 @@ static size_t ZSTD_compressRleLiteralsBlock (void* dst, size_t dstCapacity, cons
}
-static size_t ZSTD_minGain(size_t srcSize) { return (srcSize >> 6) + 2; }
+/* ZSTD_minGain() :
+ * minimum compression required
+ * to generate a compress block or a compressed literals section.
+ * note : use same formula for both situations */
+static size_t ZSTD_minGain(size_t srcSize, ZSTD_strategy strat)
+{
+ U32 const minlog = (strat>=ZSTD_btultra) ? (U32)(strat) - 1 : 6;
+ ZSTD_STATIC_ASSERT(ZSTD_btultra == 8);
+ assert(ZSTD_cParam_withinBounds(ZSTD_c_strategy, strat));
+ return (srcSize >> minlog) + 2;
+}
-static size_t ZSTD_compressLiterals (ZSTD_entropyCTables_t const* prevEntropy,
- ZSTD_entropyCTables_t* nextEntropy,
+static size_t ZSTD_compressLiterals (ZSTD_hufCTables_t const* prevHuf,
+ ZSTD_hufCTables_t* nextHuf,
ZSTD_strategy strategy, int disableLiteralCompression,
void* dst, size_t dstCapacity,
const void* src, size_t srcSize,
- U32* workspace, const int bmi2)
+ void* workspace, size_t wkspSize,
+ const int bmi2)
{
- size_t const minGain = ZSTD_minGain(srcSize);
+ size_t const minGain = ZSTD_minGain(srcSize, strategy);
size_t const lhSize = 3 + (srcSize >= 1 KB) + (srcSize >= 16 KB);
BYTE* const ostart = (BYTE*)dst;
U32 singleStream = srcSize < 256;
@@ -1376,27 +1867,25 @@ static size_t ZSTD_compressLiterals (ZSTD_entropyCTables_t const* prevEntropy,
disableLiteralCompression);
/* Prepare nextEntropy assuming reusing the existing table */
- nextEntropy->hufCTable_repeatMode = prevEntropy->hufCTable_repeatMode;
- memcpy(nextEntropy->hufCTable, prevEntropy->hufCTable,
- sizeof(prevEntropy->hufCTable));
+ memcpy(nextHuf, prevHuf, sizeof(*prevHuf));
if (disableLiteralCompression)
return ZSTD_noCompressLiterals(dst, dstCapacity, src, srcSize);
/* small ? don't even attempt compression (speed opt) */
# define COMPRESS_LITERALS_SIZE_MIN 63
- { size_t const minLitSize = (prevEntropy->hufCTable_repeatMode == HUF_repeat_valid) ? 6 : COMPRESS_LITERALS_SIZE_MIN;
+ { size_t const minLitSize = (prevHuf->repeatMode == HUF_repeat_valid) ? 6 : COMPRESS_LITERALS_SIZE_MIN;
if (srcSize <= minLitSize) return ZSTD_noCompressLiterals(dst, dstCapacity, src, srcSize);
}
if (dstCapacity < lhSize+1) return ERROR(dstSize_tooSmall); /* not enough space for compression */
- { HUF_repeat repeat = prevEntropy->hufCTable_repeatMode;
+ { HUF_repeat repeat = prevHuf->repeatMode;
int const preferRepeat = strategy < ZSTD_lazy ? srcSize <= 1024 : 0;
if (repeat == HUF_repeat_valid && lhSize == 3) singleStream = 1;
cLitSize = singleStream ? HUF_compress1X_repeat(ostart+lhSize, dstCapacity-lhSize, src, srcSize, 255, 11,
- workspace, HUF_WORKSPACE_SIZE, (HUF_CElt*)nextEntropy->hufCTable, &repeat, preferRepeat, bmi2)
+ workspace, wkspSize, (HUF_CElt*)nextHuf->CTable, &repeat, preferRepeat, bmi2)
: HUF_compress4X_repeat(ostart+lhSize, dstCapacity-lhSize, src, srcSize, 255, 11,
- workspace, HUF_WORKSPACE_SIZE, (HUF_CElt*)nextEntropy->hufCTable, &repeat, preferRepeat, bmi2);
+ workspace, wkspSize, (HUF_CElt*)nextHuf->CTable, &repeat, preferRepeat, bmi2);
if (repeat != HUF_repeat_none) {
/* reused the existing table */
hType = set_repeat;
@@ -1404,17 +1893,17 @@ static size_t ZSTD_compressLiterals (ZSTD_entropyCTables_t const* prevEntropy,
}
if ((cLitSize==0) | (cLitSize >= srcSize - minGain) | ERR_isError(cLitSize)) {
- memcpy(nextEntropy->hufCTable, prevEntropy->hufCTable, sizeof(prevEntropy->hufCTable));
+ memcpy(nextHuf, prevHuf, sizeof(*prevHuf));
return ZSTD_noCompressLiterals(dst, dstCapacity, src, srcSize);
}
if (cLitSize==1) {
- memcpy(nextEntropy->hufCTable, prevEntropy->hufCTable, sizeof(prevEntropy->hufCTable));
+ memcpy(nextHuf, prevHuf, sizeof(*prevHuf));
return ZSTD_compressRleLiteralsBlock(dst, dstCapacity, src, srcSize);
}
if (hType == set_compressed) {
/* using a newly constructed table */
- nextEntropy->hufCTable_repeatMode = HUF_repeat_check;
+ nextHuf->repeatMode = HUF_repeat_check;
}
/* Build header */
@@ -1451,6 +1940,7 @@ void ZSTD_seqToCodes(const seqStore_t* seqStorePtr)
BYTE* const mlCodeTable = seqStorePtr->mlCode;
U32 const nbSeq = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart);
U32 u;
+ assert(nbSeq <= seqStorePtr->maxNbSeq);
for (u=0; u<nbSeq; u++) {
U32 const llv = sequences[u].litLength;
U32 const mlv = sequences[u].matchLength;
@@ -1464,66 +1954,241 @@ void ZSTD_seqToCodes(const seqStore_t* seqStorePtr)
mlCodeTable[seqStorePtr->longLengthPos] = MaxML;
}
+
+/**
+ * -log2(x / 256) lookup table for x in [0, 256).
+ * If x == 0: Return 0
+ * Else: Return floor(-log2(x / 256) * 256)
+ */
+static unsigned const kInverseProbabiltyLog256[256] = {
+ 0, 2048, 1792, 1642, 1536, 1453, 1386, 1329, 1280, 1236, 1197, 1162,
+ 1130, 1100, 1073, 1047, 1024, 1001, 980, 960, 941, 923, 906, 889,
+ 874, 859, 844, 830, 817, 804, 791, 779, 768, 756, 745, 734,
+ 724, 714, 704, 694, 685, 676, 667, 658, 650, 642, 633, 626,
+ 618, 610, 603, 595, 588, 581, 574, 567, 561, 554, 548, 542,
+ 535, 529, 523, 517, 512, 506, 500, 495, 489, 484, 478, 473,
+ 468, 463, 458, 453, 448, 443, 438, 434, 429, 424, 420, 415,
+ 411, 407, 402, 398, 394, 390, 386, 382, 377, 373, 370, 366,
+ 362, 358, 354, 350, 347, 343, 339, 336, 332, 329, 325, 322,
+ 318, 315, 311, 308, 305, 302, 298, 295, 292, 289, 286, 282,
+ 279, 276, 273, 270, 267, 264, 261, 258, 256, 253, 250, 247,
+ 244, 241, 239, 236, 233, 230, 228, 225, 222, 220, 217, 215,
+ 212, 209, 207, 204, 202, 199, 197, 194, 192, 190, 187, 185,
+ 182, 180, 178, 175, 173, 171, 168, 166, 164, 162, 159, 157,
+ 155, 153, 151, 149, 146, 144, 142, 140, 138, 136, 134, 132,
+ 130, 128, 126, 123, 121, 119, 117, 115, 114, 112, 110, 108,
+ 106, 104, 102, 100, 98, 96, 94, 93, 91, 89, 87, 85,
+ 83, 82, 80, 78, 76, 74, 73, 71, 69, 67, 66, 64,
+ 62, 61, 59, 57, 55, 54, 52, 50, 49, 47, 46, 44,
+ 42, 41, 39, 37, 36, 34, 33, 31, 30, 28, 26, 25,
+ 23, 22, 20, 19, 17, 16, 14, 13, 11, 10, 8, 7,
+ 5, 4, 2, 1,
+};
+
+
+/**
+ * Returns the cost in bits of encoding the distribution described by count
+ * using the entropy bound.
+ */
+static size_t ZSTD_entropyCost(unsigned const* count, unsigned const max, size_t const total)
+{
+ unsigned cost = 0;
+ unsigned s;
+ for (s = 0; s <= max; ++s) {
+ unsigned norm = (unsigned)((256 * count[s]) / total);
+ if (count[s] != 0 && norm == 0)
+ norm = 1;
+ assert(count[s] < total);
+ cost += count[s] * kInverseProbabiltyLog256[norm];
+ }
+ return cost >> 8;
+}
+
+
+/**
+ * Returns the cost in bits of encoding the distribution in count using the
+ * table described by norm. The max symbol support by norm is assumed >= max.
+ * norm must be valid for every symbol with non-zero probability in count.
+ */
+static size_t ZSTD_crossEntropyCost(short const* norm, unsigned accuracyLog,
+ unsigned const* count, unsigned const max)
+{
+ unsigned const shift = 8 - accuracyLog;
+ size_t cost = 0;
+ unsigned s;
+ assert(accuracyLog <= 8);
+ for (s = 0; s <= max; ++s) {
+ unsigned const normAcc = norm[s] != -1 ? norm[s] : 1;
+ unsigned const norm256 = normAcc << shift;
+ assert(norm256 > 0);
+ assert(norm256 < 256);
+ cost += count[s] * kInverseProbabiltyLog256[norm256];
+ }
+ return cost >> 8;
+}
+
+
+static unsigned ZSTD_getFSEMaxSymbolValue(FSE_CTable const* ctable) {
+ void const* ptr = ctable;
+ U16 const* u16ptr = (U16 const*)ptr;
+ U32 const maxSymbolValue = MEM_read16(u16ptr + 1);
+ return maxSymbolValue;
+}
+
+
+/**
+ * Returns the cost in bits of encoding the distribution in count using ctable.
+ * Returns an error if ctable cannot represent all the symbols in count.
+ */
+static size_t ZSTD_fseBitCost(
+ FSE_CTable const* ctable,
+ unsigned const* count,
+ unsigned const max)
+{
+ unsigned const kAccuracyLog = 8;
+ size_t cost = 0;
+ unsigned s;
+ FSE_CState_t cstate;
+ FSE_initCState(&cstate, ctable);
+ if (ZSTD_getFSEMaxSymbolValue(ctable) < max) {
+ DEBUGLOG(5, "Repeat FSE_CTable has maxSymbolValue %u < %u",
+ ZSTD_getFSEMaxSymbolValue(ctable), max);
+ return ERROR(GENERIC);
+ }
+ for (s = 0; s <= max; ++s) {
+ unsigned const tableLog = cstate.stateLog;
+ unsigned const badCost = (tableLog + 1) << kAccuracyLog;
+ unsigned const bitCost = FSE_bitCost(cstate.symbolTT, tableLog, s, kAccuracyLog);
+ if (count[s] == 0)
+ continue;
+ if (bitCost >= badCost) {
+ DEBUGLOG(5, "Repeat FSE_CTable has Prob[%u] == 0", s);
+ return ERROR(GENERIC);
+ }
+ cost += count[s] * bitCost;
+ }
+ return cost >> kAccuracyLog;
+}
+
+/**
+ * Returns the cost in bytes of encoding the normalized count header.
+ * Returns an error if any of the helper functions return an error.
+ */
+static size_t ZSTD_NCountCost(unsigned const* count, unsigned const max,
+ size_t const nbSeq, unsigned const FSELog)
+{
+ BYTE wksp[FSE_NCOUNTBOUND];
+ S16 norm[MaxSeq + 1];
+ const U32 tableLog = FSE_optimalTableLog(FSELog, nbSeq, max);
+ CHECK_F(FSE_normalizeCount(norm, tableLog, count, nbSeq, max));
+ return FSE_writeNCount(wksp, sizeof(wksp), norm, max, tableLog);
+}
+
+
typedef enum {
ZSTD_defaultDisallowed = 0,
ZSTD_defaultAllowed = 1
} ZSTD_defaultPolicy_e;
-MEM_STATIC
-symbolEncodingType_e ZSTD_selectEncodingType(
- FSE_repeat* repeatMode, size_t const mostFrequent, size_t nbSeq,
- U32 defaultNormLog, ZSTD_defaultPolicy_e const isDefaultAllowed)
+MEM_STATIC symbolEncodingType_e
+ZSTD_selectEncodingType(
+ FSE_repeat* repeatMode, unsigned const* count, unsigned const max,
+ size_t const mostFrequent, size_t nbSeq, unsigned const FSELog,
+ FSE_CTable const* prevCTable,
+ short const* defaultNorm, U32 defaultNormLog,
+ ZSTD_defaultPolicy_e const isDefaultAllowed,
+ ZSTD_strategy const strategy)
{
-#define MIN_SEQ_FOR_DYNAMIC_FSE 64
-#define MAX_SEQ_FOR_STATIC_FSE 1000
ZSTD_STATIC_ASSERT(ZSTD_defaultDisallowed == 0 && ZSTD_defaultAllowed != 0);
- if ((mostFrequent == nbSeq) && (!isDefaultAllowed || nbSeq > 2)) {
+ if (mostFrequent == nbSeq) {
+ *repeatMode = FSE_repeat_none;
+ if (isDefaultAllowed && nbSeq <= 2) {
+ /* Prefer set_basic over set_rle when there are 2 or less symbols,
+ * since RLE uses 1 byte, but set_basic uses 5-6 bits per symbol.
+ * If basic encoding isn't possible, always choose RLE.
+ */
+ DEBUGLOG(5, "Selected set_basic");
+ return set_basic;
+ }
DEBUGLOG(5, "Selected set_rle");
- /* Prefer set_basic over set_rle when there are 2 or less symbols,
- * since RLE uses 1 byte, but set_basic uses 5-6 bits per symbol.
- * If basic encoding isn't possible, always choose RLE.
- */
- *repeatMode = FSE_repeat_check;
return set_rle;
}
- if ( isDefaultAllowed
- && (*repeatMode == FSE_repeat_valid) && (nbSeq < MAX_SEQ_FOR_STATIC_FSE)) {
- DEBUGLOG(5, "Selected set_repeat");
- return set_repeat;
- }
- if ( isDefaultAllowed
- && ((nbSeq < MIN_SEQ_FOR_DYNAMIC_FSE) || (mostFrequent < (nbSeq >> (defaultNormLog-1)))) ) {
- DEBUGLOG(5, "Selected set_basic");
- /* The format allows default tables to be repeated, but it isn't useful.
- * When using simple heuristics to select encoding type, we don't want
- * to confuse these tables with dictionaries. When running more careful
- * analysis, we don't need to waste time checking both repeating tables
- * and default tables.
- */
- *repeatMode = FSE_repeat_none;
- return set_basic;
+ if (strategy < ZSTD_lazy) {
+ if (isDefaultAllowed) {
+ size_t const staticFse_nbSeq_max = 1000;
+ size_t const mult = 10 - strategy;
+ size_t const baseLog = 3;
+ size_t const dynamicFse_nbSeq_min = (((size_t)1 << defaultNormLog) * mult) >> baseLog; /* 28-36 for offset, 56-72 for lengths */
+ assert(defaultNormLog >= 5 && defaultNormLog <= 6); /* xx_DEFAULTNORMLOG */
+ assert(mult <= 9 && mult >= 7);
+ if ( (*repeatMode == FSE_repeat_valid)
+ && (nbSeq < staticFse_nbSeq_max) ) {
+ DEBUGLOG(5, "Selected set_repeat");
+ return set_repeat;
+ }
+ if ( (nbSeq < dynamicFse_nbSeq_min)
+ || (mostFrequent < (nbSeq >> (defaultNormLog-1))) ) {
+ DEBUGLOG(5, "Selected set_basic");
+ /* The format allows default tables to be repeated, but it isn't useful.
+ * When using simple heuristics to select encoding type, we don't want
+ * to confuse these tables with dictionaries. When running more careful
+ * analysis, we don't need to waste time checking both repeating tables
+ * and default tables.
+ */
+ *repeatMode = FSE_repeat_none;
+ return set_basic;
+ }
+ }
+ } else {
+ size_t const basicCost = isDefaultAllowed ? ZSTD_crossEntropyCost(defaultNorm, defaultNormLog, count, max) : ERROR(GENERIC);
+ size_t const repeatCost = *repeatMode != FSE_repeat_none ? ZSTD_fseBitCost(prevCTable, count, max) : ERROR(GENERIC);
+ size_t const NCountCost = ZSTD_NCountCost(count, max, nbSeq, FSELog);
+ size_t const compressedCost = (NCountCost << 3) + ZSTD_entropyCost(count, max, nbSeq);
+
+ if (isDefaultAllowed) {
+ assert(!ZSTD_isError(basicCost));
+ assert(!(*repeatMode == FSE_repeat_valid && ZSTD_isError(repeatCost)));
+ }
+ assert(!ZSTD_isError(NCountCost));
+ assert(compressedCost < ERROR(maxCode));
+ DEBUGLOG(5, "Estimated bit costs: basic=%u\trepeat=%u\tcompressed=%u",
+ (unsigned)basicCost, (unsigned)repeatCost, (unsigned)compressedCost);
+ if (basicCost <= repeatCost && basicCost <= compressedCost) {
+ DEBUGLOG(5, "Selected set_basic");
+ assert(isDefaultAllowed);
+ *repeatMode = FSE_repeat_none;
+ return set_basic;
+ }
+ if (repeatCost <= compressedCost) {
+ DEBUGLOG(5, "Selected set_repeat");
+ assert(!ZSTD_isError(repeatCost));
+ return set_repeat;
+ }
+ assert(compressedCost < basicCost && compressedCost < repeatCost);
}
DEBUGLOG(5, "Selected set_compressed");
*repeatMode = FSE_repeat_check;
return set_compressed;
}
-MEM_STATIC
-size_t ZSTD_buildCTable(void* dst, size_t dstCapacity,
- FSE_CTable* nextCTable, U32 FSELog, symbolEncodingType_e type,
- U32* count, U32 max,
- BYTE const* codeTable, size_t nbSeq,
- S16 const* defaultNorm, U32 defaultNormLog, U32 defaultMax,
- FSE_CTable const* prevCTable, size_t prevCTableSize,
- void* workspace, size_t workspaceSize)
+MEM_STATIC size_t
+ZSTD_buildCTable(void* dst, size_t dstCapacity,
+ FSE_CTable* nextCTable, U32 FSELog, symbolEncodingType_e type,
+ unsigned* count, U32 max,
+ const BYTE* codeTable, size_t nbSeq,
+ const S16* defaultNorm, U32 defaultNormLog, U32 defaultMax,
+ const FSE_CTable* prevCTable, size_t prevCTableSize,
+ void* workspace, size_t workspaceSize)
{
BYTE* op = (BYTE*)dst;
- BYTE const* const oend = op + dstCapacity;
+ const BYTE* const oend = op + dstCapacity;
+ DEBUGLOG(6, "ZSTD_buildCTable (dstCapacity=%u)", (unsigned)dstCapacity);
switch (type) {
case set_rle:
- *op = codeTable[0];
CHECK_F(FSE_buildCTable_rle(nextCTable, (BYTE)max));
+ if (dstCapacity==0) return ERROR(dstSize_tooSmall);
+ *op = codeTable[0];
return 1;
case set_repeat:
memcpy(nextCTable, prevCTable, prevCTableSize);
@@ -1565,6 +2230,9 @@ ZSTD_encodeSequences_body(
FSE_CState_t stateLitLength;
CHECK_E(BIT_initCStream(&blockStream, dst, dstCapacity), dstSize_tooSmall); /* not enough space remaining */
+ DEBUGLOG(6, "available space for bitstream : %i (dstCapacity=%u)",
+ (int)(blockStream.endPtr - blockStream.startPtr),
+ (unsigned)dstCapacity);
/* first symbols */
FSE_initCState2(&stateMatchLength, CTable_MatchLength, mlCodeTable[nbSeq-1]);
@@ -1597,9 +2265,9 @@ ZSTD_encodeSequences_body(
U32 const ofBits = ofCode;
U32 const mlBits = ML_bits[mlCode];
DEBUGLOG(6, "encoding: litlen:%2u - matchlen:%2u - offCode:%7u",
- sequences[n].litLength,
- sequences[n].matchLength + MINMATCH,
- sequences[n].offset);
+ (unsigned)sequences[n].litLength,
+ (unsigned)sequences[n].matchLength + MINMATCH,
+ (unsigned)sequences[n].offset);
/* 32b*/ /* 64b*/
/* (7)*/ /* (7)*/
FSE_encodeSymbol(&blockStream, &stateOffsetBits, ofCode); /* 15 */ /* 15 */
@@ -1624,6 +2292,7 @@ ZSTD_encodeSequences_body(
BIT_addBits(&blockStream, sequences[n].offset, ofBits); /* 31 */
}
BIT_flushBits(&blockStream); /* (7)*/
+ DEBUGLOG(7, "remaining space : %i", (int)(blockStream.endPtr - blockStream.ptr));
} }
DEBUGLOG(6, "ZSTD_encodeSequences: flushing ML state with %u bits", stateMatchLength.stateLog);
@@ -1674,13 +2343,14 @@ ZSTD_encodeSequences_bmi2(
#endif
-size_t ZSTD_encodeSequences(
+static size_t ZSTD_encodeSequences(
void* dst, size_t dstCapacity,
FSE_CTable const* CTable_MatchLength, BYTE const* mlCodeTable,
FSE_CTable const* CTable_OffsetBits, BYTE const* ofCodeTable,
FSE_CTable const* CTable_LitLength, BYTE const* llCodeTable,
seqDef const* sequences, size_t nbSeq, int longOffsets, int bmi2)
{
+ DEBUGLOG(5, "ZSTD_encodeSequences: dstCapacity = %u", (unsigned)dstCapacity);
#if DYNAMIC_BMI2
if (bmi2) {
return ZSTD_encodeSequences_bmi2(dst, dstCapacity,
@@ -1698,18 +2368,23 @@ size_t ZSTD_encodeSequences(
sequences, nbSeq, longOffsets);
}
-MEM_STATIC size_t ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
- ZSTD_entropyCTables_t const* prevEntropy,
- ZSTD_entropyCTables_t* nextEntropy,
- ZSTD_CCtx_params const* cctxParams,
- void* dst, size_t dstCapacity, U32* workspace,
- const int bmi2)
+/* ZSTD_compressSequences_internal():
+ * actually compresses both literals and sequences */
+MEM_STATIC size_t
+ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
+ const ZSTD_entropyCTables_t* prevEntropy,
+ ZSTD_entropyCTables_t* nextEntropy,
+ const ZSTD_CCtx_params* cctxParams,
+ void* dst, size_t dstCapacity,
+ void* workspace, size_t wkspSize,
+ const int bmi2)
{
const int longOffsets = cctxParams->cParams.windowLog > STREAM_ACCUMULATOR_MIN;
- U32 count[MaxSeq+1];
- FSE_CTable* CTable_LitLength = nextEntropy->litlengthCTable;
- FSE_CTable* CTable_OffsetBits = nextEntropy->offcodeCTable;
- FSE_CTable* CTable_MatchLength = nextEntropy->matchlengthCTable;
+ ZSTD_strategy const strategy = cctxParams->cParams.strategy;
+ unsigned count[MaxSeq+1];
+ FSE_CTable* CTable_LitLength = nextEntropy->fse.litlengthCTable;
+ FSE_CTable* CTable_OffsetBits = nextEntropy->fse.offcodeCTable;
+ FSE_CTable* CTable_MatchLength = nextEntropy->fse.matchlengthCTable;
U32 LLtype, Offtype, MLtype; /* compressed, raw or rle */
const seqDef* const sequences = seqStorePtr->sequencesStart;
const BYTE* const ofCodeTable = seqStorePtr->ofCode;
@@ -1720,18 +2395,22 @@ MEM_STATIC size_t ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
BYTE* op = ostart;
size_t const nbSeq = seqStorePtr->sequences - seqStorePtr->sequencesStart;
BYTE* seqHead;
+ BYTE* lastNCount = NULL;
ZSTD_STATIC_ASSERT(HUF_WORKSPACE_SIZE >= (1<<MAX(MLFSELog,LLFSELog)));
+ DEBUGLOG(5, "ZSTD_compressSequences_internal");
/* Compress literals */
{ const BYTE* const literals = seqStorePtr->litStart;
size_t const litSize = seqStorePtr->lit - literals;
+ int const disableLiteralCompression = (cctxParams->cParams.strategy == ZSTD_fast) && (cctxParams->cParams.targetLength > 0);
size_t const cSize = ZSTD_compressLiterals(
- prevEntropy, nextEntropy,
- cctxParams->cParams.strategy, cctxParams->disableLiteralCompression,
+ &prevEntropy->huf, &nextEntropy->huf,
+ cctxParams->cParams.strategy, disableLiteralCompression,
op, dstCapacity,
literals, litSize,
- workspace, bmi2);
+ workspace, wkspSize,
+ bmi2);
if (ZSTD_isError(cSize))
return cSize;
assert(cSize <= dstCapacity);
@@ -1747,13 +2426,9 @@ MEM_STATIC size_t ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
else
op[0]=0xFF, MEM_writeLE16(op+1, (U16)(nbSeq - LONGNBSEQ)), op+=3;
if (nbSeq==0) {
- memcpy(nextEntropy->litlengthCTable, prevEntropy->litlengthCTable, sizeof(prevEntropy->litlengthCTable));
- nextEntropy->litlength_repeatMode = prevEntropy->litlength_repeatMode;
- memcpy(nextEntropy->offcodeCTable, prevEntropy->offcodeCTable, sizeof(prevEntropy->offcodeCTable));
- nextEntropy->offcode_repeatMode = prevEntropy->offcode_repeatMode;
- memcpy(nextEntropy->matchlengthCTable, prevEntropy->matchlengthCTable, sizeof(prevEntropy->matchlengthCTable));
- nextEntropy->matchlength_repeatMode = prevEntropy->matchlength_repeatMode;
- return op - ostart;
+ /* Copy the old tables over as if we repeated them */
+ memcpy(&nextEntropy->fse, &prevEntropy->fse, sizeof(prevEntropy->fse));
+ return op - ostart;
}
/* seqHead : flags for FSE encoding type */
@@ -1762,44 +2437,66 @@ MEM_STATIC size_t ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
/* convert length/distances into codes */
ZSTD_seqToCodes(seqStorePtr);
/* build CTable for Literal Lengths */
- { U32 max = MaxLL;
- size_t const mostFrequent = FSE_countFast_wksp(count, &max, llCodeTable, nbSeq, workspace);
+ { unsigned max = MaxLL;
+ size_t const mostFrequent = HIST_countFast_wksp(count, &max, llCodeTable, nbSeq, workspace, wkspSize); /* can't fail */
DEBUGLOG(5, "Building LL table");
- nextEntropy->litlength_repeatMode = prevEntropy->litlength_repeatMode;
- LLtype = ZSTD_selectEncodingType(&nextEntropy->litlength_repeatMode, mostFrequent, nbSeq, LL_defaultNormLog, ZSTD_defaultAllowed);
+ nextEntropy->fse.litlength_repeatMode = prevEntropy->fse.litlength_repeatMode;
+ LLtype = ZSTD_selectEncodingType(&nextEntropy->fse.litlength_repeatMode,
+ count, max, mostFrequent, nbSeq,
+ LLFSELog, prevEntropy->fse.litlengthCTable,
+ LL_defaultNorm, LL_defaultNormLog,
+ ZSTD_defaultAllowed, strategy);
+ assert(set_basic < set_compressed && set_rle < set_compressed);
+ assert(!(LLtype < set_compressed && nextEntropy->fse.litlength_repeatMode != FSE_repeat_none)); /* We don't copy tables */
{ size_t const countSize = ZSTD_buildCTable(op, oend - op, CTable_LitLength, LLFSELog, (symbolEncodingType_e)LLtype,
- count, max, llCodeTable, nbSeq, LL_defaultNorm, LL_defaultNormLog, MaxLL,
- prevEntropy->litlengthCTable, sizeof(prevEntropy->litlengthCTable),
- workspace, HUF_WORKSPACE_SIZE);
+ count, max, llCodeTable, nbSeq, LL_defaultNorm, LL_defaultNormLog, MaxLL,
+ prevEntropy->fse.litlengthCTable, sizeof(prevEntropy->fse.litlengthCTable),
+ workspace, wkspSize);
if (ZSTD_isError(countSize)) return countSize;
+ if (LLtype == set_compressed)
+ lastNCount = op;
op += countSize;
} }
/* build CTable for Offsets */
- { U32 max = MaxOff;
- size_t const mostFrequent = FSE_countFast_wksp(count, &max, ofCodeTable, nbSeq, workspace);
+ { unsigned max = MaxOff;
+ size_t const mostFrequent = HIST_countFast_wksp(count, &max, ofCodeTable, nbSeq, workspace, wkspSize); /* can't fail */
/* We can only use the basic table if max <= DefaultMaxOff, otherwise the offsets are too large */
ZSTD_defaultPolicy_e const defaultPolicy = (max <= DefaultMaxOff) ? ZSTD_defaultAllowed : ZSTD_defaultDisallowed;
DEBUGLOG(5, "Building OF table");
- nextEntropy->offcode_repeatMode = prevEntropy->offcode_repeatMode;
- Offtype = ZSTD_selectEncodingType(&nextEntropy->offcode_repeatMode, mostFrequent, nbSeq, OF_defaultNormLog, defaultPolicy);
+ nextEntropy->fse.offcode_repeatMode = prevEntropy->fse.offcode_repeatMode;
+ Offtype = ZSTD_selectEncodingType(&nextEntropy->fse.offcode_repeatMode,
+ count, max, mostFrequent, nbSeq,
+ OffFSELog, prevEntropy->fse.offcodeCTable,
+ OF_defaultNorm, OF_defaultNormLog,
+ defaultPolicy, strategy);
+ assert(!(Offtype < set_compressed && nextEntropy->fse.offcode_repeatMode != FSE_repeat_none)); /* We don't copy tables */
{ size_t const countSize = ZSTD_buildCTable(op, oend - op, CTable_OffsetBits, OffFSELog, (symbolEncodingType_e)Offtype,
- count, max, ofCodeTable, nbSeq, OF_defaultNorm, OF_defaultNormLog, DefaultMaxOff,
- prevEntropy->offcodeCTable, sizeof(prevEntropy->offcodeCTable),
- workspace, HUF_WORKSPACE_SIZE);
+ count, max, ofCodeTable, nbSeq, OF_defaultNorm, OF_defaultNormLog, DefaultMaxOff,
+ prevEntropy->fse.offcodeCTable, sizeof(prevEntropy->fse.offcodeCTable),
+ workspace, wkspSize);
if (ZSTD_isError(countSize)) return countSize;
+ if (Offtype == set_compressed)
+ lastNCount = op;
op += countSize;
} }
/* build CTable for MatchLengths */
- { U32 max = MaxML;
- size_t const mostFrequent = FSE_countFast_wksp(count, &max, mlCodeTable, nbSeq, workspace);
- DEBUGLOG(5, "Building ML table");
- nextEntropy->matchlength_repeatMode = prevEntropy->matchlength_repeatMode;
- MLtype = ZSTD_selectEncodingType(&nextEntropy->matchlength_repeatMode, mostFrequent, nbSeq, ML_defaultNormLog, ZSTD_defaultAllowed);
+ { unsigned max = MaxML;
+ size_t const mostFrequent = HIST_countFast_wksp(count, &max, mlCodeTable, nbSeq, workspace, wkspSize); /* can't fail */
+ DEBUGLOG(5, "Building ML table (remaining space : %i)", (int)(oend-op));
+ nextEntropy->fse.matchlength_repeatMode = prevEntropy->fse.matchlength_repeatMode;
+ MLtype = ZSTD_selectEncodingType(&nextEntropy->fse.matchlength_repeatMode,
+ count, max, mostFrequent, nbSeq,
+ MLFSELog, prevEntropy->fse.matchlengthCTable,
+ ML_defaultNorm, ML_defaultNormLog,
+ ZSTD_defaultAllowed, strategy);
+ assert(!(MLtype < set_compressed && nextEntropy->fse.matchlength_repeatMode != FSE_repeat_none)); /* We don't copy tables */
{ size_t const countSize = ZSTD_buildCTable(op, oend - op, CTable_MatchLength, MLFSELog, (symbolEncodingType_e)MLtype,
- count, max, mlCodeTable, nbSeq, ML_defaultNorm, ML_defaultNormLog, MaxML,
- prevEntropy->matchlengthCTable, sizeof(prevEntropy->matchlengthCTable),
- workspace, HUF_WORKSPACE_SIZE);
+ count, max, mlCodeTable, nbSeq, ML_defaultNorm, ML_defaultNormLog, MaxML,
+ prevEntropy->fse.matchlengthCTable, sizeof(prevEntropy->fse.matchlengthCTable),
+ workspace, wkspSize);
if (ZSTD_isError(countSize)) return countSize;
+ if (MLtype == set_compressed)
+ lastNCount = op;
op += countSize;
} }
@@ -1814,21 +2511,42 @@ MEM_STATIC size_t ZSTD_compressSequences_internal(seqStore_t* seqStorePtr,
longOffsets, bmi2);
if (ZSTD_isError(bitstreamSize)) return bitstreamSize;
op += bitstreamSize;
+ /* zstd versions <= 1.3.4 mistakenly report corruption when
+ * FSE_readNCount() recieves a buffer < 4 bytes.
+ * Fixed by https://github.com/facebook/zstd/pull/1146.
+ * This can happen when the last set_compressed table present is 2
+ * bytes and the bitstream is only one byte.
+ * In this exceedingly rare case, we will simply emit an uncompressed
+ * block, since it isn't worth optimizing.
+ */
+ if (lastNCount && (op - lastNCount) < 4) {
+ /* NCountSize >= 2 && bitstreamSize > 0 ==> lastCountSize == 3 */
+ assert(op - lastNCount == 3);
+ DEBUGLOG(5, "Avoiding bug in zstd decoder in versions <= 1.3.4 by "
+ "emitting an uncompressed block.");
+ return 0;
+ }
}
+ DEBUGLOG(5, "compressed block size : %u", (unsigned)(op - ostart));
return op - ostart;
}
-MEM_STATIC size_t ZSTD_compressSequences(seqStore_t* seqStorePtr,
- ZSTD_entropyCTables_t const* prevEntropy,
- ZSTD_entropyCTables_t* nextEntropy,
- ZSTD_CCtx_params const* cctxParams,
- void* dst, size_t dstCapacity,
- size_t srcSize, U32* workspace, int bmi2)
+MEM_STATIC size_t
+ZSTD_compressSequences(seqStore_t* seqStorePtr,
+ const ZSTD_entropyCTables_t* prevEntropy,
+ ZSTD_entropyCTables_t* nextEntropy,
+ const ZSTD_CCtx_params* cctxParams,
+ void* dst, size_t dstCapacity,
+ size_t srcSize,
+ void* workspace, size_t wkspSize,
+ int bmi2)
{
size_t const cSize = ZSTD_compressSequences_internal(
- seqStorePtr, prevEntropy, nextEntropy, cctxParams, dst, dstCapacity,
- workspace, bmi2);
+ seqStorePtr, prevEntropy, nextEntropy, cctxParams,
+ dst, dstCapacity,
+ workspace, wkspSize, bmi2);
+ if (cSize == 0) return 0;
/* When srcSize <= dstCapacity, there is enough space to write a raw uncompressed block.
* Since we ran out of space, block must be not compressible, so fall back to raw uncompressed block.
*/
@@ -1837,40 +2555,57 @@ MEM_STATIC size_t ZSTD_compressSequences(seqStore_t* seqStorePtr,
if (ZSTD_isError(cSize)) return cSize;
/* Check compressibility */
- { size_t const maxCSize = srcSize - ZSTD_minGain(srcSize); /* note : fixed formula, maybe should depend on compression level, or strategy */
+ { size_t const maxCSize = srcSize - ZSTD_minGain(srcSize, cctxParams->cParams.strategy);
if (cSize >= maxCSize) return 0; /* block not compressed */
}
- /* We check that dictionaries have offset codes available for the first
- * block. After the first block, the offcode table might not have large
- * enough codes to represent the offsets in the data.
- */
- if (nextEntropy->offcode_repeatMode == FSE_repeat_valid)
- nextEntropy->offcode_repeatMode = FSE_repeat_check;
-
return cSize;
}
/* ZSTD_selectBlockCompressor() :
* Not static, but internal use only (used by long distance matcher)
* assumption : strat is a valid strategy */
-ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, int extDict)
+ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, ZSTD_dictMode_e dictMode)
{
- static const ZSTD_blockCompressor blockCompressor[2][(unsigned)ZSTD_btultra+1] = {
+ static const ZSTD_blockCompressor blockCompressor[3][ZSTD_STRATEGY_MAX+1] = {
{ ZSTD_compressBlock_fast /* default for 0 */,
- ZSTD_compressBlock_fast, ZSTD_compressBlock_doubleFast, ZSTD_compressBlock_greedy,
- ZSTD_compressBlock_lazy, ZSTD_compressBlock_lazy2, ZSTD_compressBlock_btlazy2,
- ZSTD_compressBlock_btopt, ZSTD_compressBlock_btultra },
+ ZSTD_compressBlock_fast,
+ ZSTD_compressBlock_doubleFast,
+ ZSTD_compressBlock_greedy,
+ ZSTD_compressBlock_lazy,
+ ZSTD_compressBlock_lazy2,
+ ZSTD_compressBlock_btlazy2,
+ ZSTD_compressBlock_btopt,
+ ZSTD_compressBlock_btultra,
+ ZSTD_compressBlock_btultra2 },
{ ZSTD_compressBlock_fast_extDict /* default for 0 */,
- ZSTD_compressBlock_fast_extDict, ZSTD_compressBlock_doubleFast_extDict, ZSTD_compressBlock_greedy_extDict,
- ZSTD_compressBlock_lazy_extDict,ZSTD_compressBlock_lazy2_extDict, ZSTD_compressBlock_btlazy2_extDict,
- ZSTD_compressBlock_btopt_extDict, ZSTD_compressBlock_btultra_extDict }
+ ZSTD_compressBlock_fast_extDict,
+ ZSTD_compressBlock_doubleFast_extDict,
+ ZSTD_compressBlock_greedy_extDict,
+ ZSTD_compressBlock_lazy_extDict,
+ ZSTD_compressBlock_lazy2_extDict,
+ ZSTD_compressBlock_btlazy2_extDict,
+ ZSTD_compressBlock_btopt_extDict,
+ ZSTD_compressBlock_btultra_extDict,
+ ZSTD_compressBlock_btultra_extDict },
+ { ZSTD_compressBlock_fast_dictMatchState /* default for 0 */,
+ ZSTD_compressBlock_fast_dictMatchState,
+ ZSTD_compressBlock_doubleFast_dictMatchState,
+ ZSTD_compressBlock_greedy_dictMatchState,
+ ZSTD_compressBlock_lazy_dictMatchState,
+ ZSTD_compressBlock_lazy2_dictMatchState,
+ ZSTD_compressBlock_btlazy2_dictMatchState,
+ ZSTD_compressBlock_btopt_dictMatchState,
+ ZSTD_compressBlock_btultra_dictMatchState,
+ ZSTD_compressBlock_btultra_dictMatchState }
};
+ ZSTD_blockCompressor selectedCompressor;
ZSTD_STATIC_ASSERT((unsigned)ZSTD_fast == 1);
- assert((U32)strat >= (U32)ZSTD_fast);
- assert((U32)strat <= (U32)ZSTD_btultra);
- return blockCompressor[extDict!=0][(U32)strat];
+ assert(ZSTD_cParam_withinBounds(ZSTD_c_strategy, strat));
+ selectedCompressor = blockCompressor[(int)dictMode][(int)strat];
+ assert(selectedCompressor != NULL);
+ return selectedCompressor;
}
static void ZSTD_storeLastLiterals(seqStore_t* seqStorePtr,
@@ -1880,7 +2615,7 @@ static void ZSTD_storeLastLiterals(seqStore_t* seqStorePtr,
seqStorePtr->lit += lastLLSize;
}
-static void ZSTD_resetSeqStore(seqStore_t* ssPtr)
+void ZSTD_resetSeqStore(seqStore_t* ssPtr)
{
ssPtr->lit = ssPtr->litStart;
ssPtr->sequences = ssPtr->sequencesStart;
@@ -1892,24 +2627,38 @@ static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc,
const void* src, size_t srcSize)
{
ZSTD_matchState_t* const ms = &zc->blockState.matchState;
+ size_t cSize;
DEBUGLOG(5, "ZSTD_compressBlock_internal (dstCapacity=%u, dictLimit=%u, nextToUpdate=%u)",
- (U32)dstCapacity, ms->window.dictLimit, ms->nextToUpdate);
+ (unsigned)dstCapacity, (unsigned)ms->window.dictLimit, (unsigned)ms->nextToUpdate);
+ assert(srcSize <= ZSTD_BLOCKSIZE_MAX);
+
+ /* Assert that we have correctly flushed the ctx params into the ms's copy */
+ ZSTD_assertEqualCParams(zc->appliedParams.cParams, ms->cParams);
+
if (srcSize < MIN_CBLOCK_SIZE+ZSTD_blockHeaderSize+1) {
- ZSTD_ldm_skipSequences(&zc->externSeqStore, srcSize, zc->appliedParams.cParams.searchLength);
- return 0; /* don't even attempt compression below a certain srcSize */
+ ZSTD_ldm_skipSequences(&zc->externSeqStore, srcSize, zc->appliedParams.cParams.minMatch);
+ cSize = 0;
+ goto out; /* don't even attempt compression below a certain srcSize */
}
ZSTD_resetSeqStore(&(zc->seqStore));
+ ms->opt.symbolCosts = &zc->blockState.prevCBlock->entropy; /* required for optimal parser to read stats from dictionary */
+
+ /* a gap between an attached dict and the current window is not safe,
+ * they must remain adjacent,
+ * and when that stops being the case, the dict must be unset */
+ assert(ms->dictMatchState == NULL || ms->loadedDictEnd == ms->window.dictLimit);
/* limited update after a very long match */
{ const BYTE* const base = ms->window.base;
const BYTE* const istart = (const BYTE*)src;
const U32 current = (U32)(istart-base);
+ if (sizeof(ptrdiff_t)==8) assert(istart - base < (ptrdiff_t)(U32)(-1)); /* ensure no overflow */
if (current > ms->nextToUpdate + 384)
ms->nextToUpdate = current - MIN(192, (U32)(current - ms->nextToUpdate - 384));
}
/* select and store sequences */
- { U32 const extDict = ZSTD_window_hasExtDict(ms->window);
+ { ZSTD_dictMode_e const dictMode = ZSTD_matchState_dictMode(ms);
size_t lastLLSize;
{ int i;
for (i = 0; i < ZSTD_REP_NUM; ++i)
@@ -1922,8 +2671,7 @@ static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc,
ZSTD_ldm_blockCompress(&zc->externSeqStore,
ms, &zc->seqStore,
zc->blockState.nextCBlock->rep,
- &zc->appliedParams.cParams,
- src, srcSize, extDict);
+ src, srcSize);
assert(zc->externSeqStore.pos <= zc->externSeqStore.size);
} else if (zc->appliedParams.ldmParams.enableLdm) {
rawSeqStore_t ldmSeqStore = {NULL, 0, 0, 0};
@@ -1939,31 +2687,40 @@ static size_t ZSTD_compressBlock_internal(ZSTD_CCtx* zc,
ZSTD_ldm_blockCompress(&ldmSeqStore,
ms, &zc->seqStore,
zc->blockState.nextCBlock->rep,
- &zc->appliedParams.cParams,
- src, srcSize, extDict);
+ src, srcSize);
assert(ldmSeqStore.pos == ldmSeqStore.size);
} else { /* not long range mode */
- ZSTD_blockCompressor const blockCompressor = ZSTD_selectBlockCompressor(zc->appliedParams.cParams.strategy, extDict);
- lastLLSize = blockCompressor(ms, &zc->seqStore, zc->blockState.nextCBlock->rep, &zc->appliedParams.cParams, src, srcSize);
+ ZSTD_blockCompressor const blockCompressor = ZSTD_selectBlockCompressor(zc->appliedParams.cParams.strategy, dictMode);
+ lastLLSize = blockCompressor(ms, &zc->seqStore, zc->blockState.nextCBlock->rep, src, srcSize);
}
{ const BYTE* const lastLiterals = (const BYTE*)src + srcSize - lastLLSize;
ZSTD_storeLastLiterals(&zc->seqStore, lastLiterals, lastLLSize);
} }
/* encode sequences and literals */
- { size_t const cSize = ZSTD_compressSequences(&zc->seqStore,
- &zc->blockState.prevCBlock->entropy, &zc->blockState.nextCBlock->entropy,
- &zc->appliedParams,
- dst, dstCapacity,
- srcSize, zc->entropyWorkspace, zc->bmi2);
- if (ZSTD_isError(cSize) || cSize == 0) return cSize;
- /* confirm repcodes and entropy tables */
- { ZSTD_compressedBlockState_t* const tmp = zc->blockState.prevCBlock;
- zc->blockState.prevCBlock = zc->blockState.nextCBlock;
- zc->blockState.nextCBlock = tmp;
- }
- return cSize;
+ cSize = ZSTD_compressSequences(&zc->seqStore,
+ &zc->blockState.prevCBlock->entropy, &zc->blockState.nextCBlock->entropy,
+ &zc->appliedParams,
+ dst, dstCapacity,
+ srcSize,
+ zc->entropyWorkspace, HUF_WORKSPACE_SIZE /* statically allocated in resetCCtx */,
+ zc->bmi2);
+
+out:
+ if (!ZSTD_isError(cSize) && cSize != 0) {
+ /* confirm repcodes and entropy tables when emitting a compressed block */
+ ZSTD_compressedBlockState_t* const tmp = zc->blockState.prevCBlock;
+ zc->blockState.prevCBlock = zc->blockState.nextCBlock;
+ zc->blockState.nextCBlock = tmp;
}
+ /* We check that dictionaries have offset codes available for the first
+ * block. After the first block, the offcode table might not have large
+ * enough codes to represent the offsets in the data.
+ */
+ if (zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode == FSE_repeat_valid)
+ zc->blockState.prevCBlock->entropy.fse.offcode_repeatMode = FSE_repeat_check;
+
+ return cSize;
}
@@ -1987,7 +2744,7 @@ static size_t ZSTD_compress_frameChunk (ZSTD_CCtx* cctx,
U32 const maxDist = (U32)1 << cctx->appliedParams.cParams.windowLog;
assert(cctx->appliedParams.cParams.windowLog <= 31);
- DEBUGLOG(5, "ZSTD_compress_frameChunk (blockSize=%u)", (U32)blockSize);
+ DEBUGLOG(5, "ZSTD_compress_frameChunk (blockSize=%u)", (unsigned)blockSize);
if (cctx->appliedParams.fParams.checksumFlag && srcSize)
XXH64_update(&cctx->xxhState, src, srcSize);
@@ -2005,13 +2762,13 @@ static size_t ZSTD_compress_frameChunk (ZSTD_CCtx* cctx,
ZSTD_STATIC_ASSERT(ZSTD_CHAINLOG_MAX <= 30);
ZSTD_STATIC_ASSERT(ZSTD_WINDOWLOG_MAX_32 <= 30);
ZSTD_STATIC_ASSERT(ZSTD_WINDOWLOG_MAX <= 31);
-
ZSTD_reduceIndex(cctx, correction);
if (ms->nextToUpdate < correction) ms->nextToUpdate = 0;
else ms->nextToUpdate -= correction;
ms->loadedDictEnd = 0;
+ ms->dictMatchState = NULL;
}
- ZSTD_window_enforceMaxDist(&ms->window, ip + blockSize, maxDist, &ms->loadedDictEnd);
+ ZSTD_window_enforceMaxDist(&ms->window, ip + blockSize, maxDist, &ms->loadedDictEnd, &ms->dictMatchState);
if (ms->nextToUpdate < ms->window.lowLimit) ms->nextToUpdate = ms->window.lowLimit;
{ size_t cSize = ZSTD_compressBlock_internal(cctx,
@@ -2020,11 +2777,8 @@ static size_t ZSTD_compress_frameChunk (ZSTD_CCtx* cctx,
if (ZSTD_isError(cSize)) return cSize;
if (cSize == 0) { /* block is not compressible */
- U32 const cBlockHeader24 = lastBlock + (((U32)bt_raw)<<1) + (U32)(blockSize << 3);
- if (blockSize + ZSTD_blockHeaderSize > dstCapacity) return ERROR(dstSize_tooSmall);
- MEM_writeLE32(op, cBlockHeader24); /* 4th byte will be overwritten */
- memcpy(op + ZSTD_blockHeaderSize, ip, blockSize);
- cSize = ZSTD_blockHeaderSize + blockSize;
+ cSize = ZSTD_noCompressBlock(op, dstCapacity, ip, blockSize, lastBlock);
+ if (ZSTD_isError(cSize)) return cSize;
} else {
U32 const cBlockHeader24 = lastBlock + (((U32)bt_compressed)<<1) + (U32)(cSize << 3);
MEM_writeLE24(op, cBlockHeader24);
@@ -2038,7 +2792,7 @@ static size_t ZSTD_compress_frameChunk (ZSTD_CCtx* cctx,
assert(dstCapacity >= cSize);
dstCapacity -= cSize;
DEBUGLOG(5, "ZSTD_compress_frameChunk: adding a block of size %u",
- (U32)cSize);
+ (unsigned)cSize);
} }
if (lastFrameChunk && (op>ostart)) cctx->stage = ZSTDcs_ending;
@@ -2060,9 +2814,10 @@ static size_t ZSTD_writeFrameHeader(void* dst, size_t dstCapacity,
BYTE const frameHeaderDecriptionByte = (BYTE)(dictIDSizeCode + (checksumFlag<<2) + (singleSegment<<5) + (fcsCode<<6) );
size_t pos=0;
- if (dstCapacity < ZSTD_frameHeaderSize_max) return ERROR(dstSize_tooSmall);
+ assert(!(params.fParams.contentSizeFlag && pledgedSrcSize == ZSTD_CONTENTSIZE_UNKNOWN));
+ if (dstCapacity < ZSTD_FRAMEHEADERSIZE_MAX) return ERROR(dstSize_tooSmall);
DEBUGLOG(4, "ZSTD_writeFrameHeader : dictIDFlag : %u ; dictID : %u ; dictIDSizeCode : %u",
- !params.fParams.noDictIDFlag, dictID, dictIDSizeCode);
+ !params.fParams.noDictIDFlag, (unsigned)dictID, (unsigned)dictIDSizeCode);
if (params.format == ZSTD_f_zstd1) {
MEM_writeLE32(dst, ZSTD_MAGICNUMBER);
@@ -2122,11 +2877,11 @@ static size_t ZSTD_compressContinue_internal (ZSTD_CCtx* cctx,
const void* src, size_t srcSize,
U32 frame, U32 lastFrameChunk)
{
- ZSTD_matchState_t* ms = &cctx->blockState.matchState;
+ ZSTD_matchState_t* const ms = &cctx->blockState.matchState;
size_t fhSize = 0;
DEBUGLOG(5, "ZSTD_compressContinue_internal, stage: %u, srcSize: %u",
- cctx->stage, (U32)srcSize);
+ cctx->stage, (unsigned)srcSize);
if (cctx->stage==ZSTDcs_created) return ERROR(stage_wrong); /* missing init (ZSTD_compressBegin) */
if (frame && (cctx->stage==ZSTDcs_init)) {
@@ -2143,20 +2898,39 @@ static size_t ZSTD_compressContinue_internal (ZSTD_CCtx* cctx,
if (!ZSTD_window_update(&ms->window, src, srcSize)) {
ms->nextToUpdate = ms->window.dictLimit;
}
- if (cctx->appliedParams.ldmParams.enableLdm)
+ if (cctx->appliedParams.ldmParams.enableLdm) {
ZSTD_window_update(&cctx->ldmState.window, src, srcSize);
+ }
+
+ if (!frame) {
+ /* overflow check and correction for block mode */
+ if (ZSTD_window_needOverflowCorrection(ms->window, (const char*)src + srcSize)) {
+ U32 const cycleLog = ZSTD_cycleLog(cctx->appliedParams.cParams.chainLog, cctx->appliedParams.cParams.strategy);
+ U32 const correction = ZSTD_window_correctOverflow(&ms->window, cycleLog, 1 << cctx->appliedParams.cParams.windowLog, src);
+ ZSTD_STATIC_ASSERT(ZSTD_CHAINLOG_MAX <= 30);
+ ZSTD_STATIC_ASSERT(ZSTD_WINDOWLOG_MAX_32 <= 30);
+ ZSTD_STATIC_ASSERT(ZSTD_WINDOWLOG_MAX <= 31);
+ ZSTD_reduceIndex(cctx, correction);
+ if (ms->nextToUpdate < correction) ms->nextToUpdate = 0;
+ else ms->nextToUpdate -= correction;
+ ms->loadedDictEnd = 0;
+ ms->dictMatchState = NULL;
+ }
+ }
- DEBUGLOG(5, "ZSTD_compressContinue_internal (blockSize=%u)", (U32)cctx->blockSize);
+ DEBUGLOG(5, "ZSTD_compressContinue_internal (blockSize=%u)", (unsigned)cctx->blockSize);
{ size_t const cSize = frame ?
ZSTD_compress_frameChunk (cctx, dst, dstCapacity, src, srcSize, lastFrameChunk) :
ZSTD_compressBlock_internal (cctx, dst, dstCapacity, src, srcSize);
if (ZSTD_isError(cSize)) return cSize;
cctx->consumedSrcSize += srcSize;
cctx->producedCSize += (cSize + fhSize);
- if (cctx->appliedParams.fParams.contentSizeFlag) { /* control src size */
+ assert(!(cctx->appliedParams.fParams.contentSizeFlag && cctx->pledgedSrcSizePlusOne == 0));
+ if (cctx->pledgedSrcSizePlusOne != 0) { /* control src size */
+ ZSTD_STATIC_ASSERT(ZSTD_CONTENTSIZE_UNKNOWN == (unsigned long long)-1);
if (cctx->consumedSrcSize+1 > cctx->pledgedSrcSizePlusOne) {
DEBUGLOG(4, "error : pledgedSrcSize = %u, while realSrcSize >= %u",
- (U32)cctx->pledgedSrcSizePlusOne-1, (U32)cctx->consumedSrcSize);
+ (unsigned)cctx->pledgedSrcSizePlusOne-1, (unsigned)cctx->consumedSrcSize);
return ERROR(srcSize_wrong);
}
}
@@ -2168,7 +2942,7 @@ size_t ZSTD_compressContinue (ZSTD_CCtx* cctx,
void* dst, size_t dstCapacity,
const void* src, size_t srcSize)
{
- DEBUGLOG(5, "ZSTD_compressContinue (srcSize=%u)", (U32)srcSize);
+ DEBUGLOG(5, "ZSTD_compressContinue (srcSize=%u)", (unsigned)srcSize);
return ZSTD_compressContinue_internal(cctx, dst, dstCapacity, src, srcSize, 1 /* frame mode */, 0 /* last chunk */);
}
@@ -2184,44 +2958,51 @@ size_t ZSTD_compressBlock(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const
{
size_t const blockSizeMax = ZSTD_getBlockSize(cctx);
if (srcSize > blockSizeMax) return ERROR(srcSize_wrong);
+
return ZSTD_compressContinue_internal(cctx, dst, dstCapacity, src, srcSize, 0 /* frame mode */, 0 /* last chunk */);
}
/*! ZSTD_loadDictionaryContent() :
* @return : 0, or an error code
*/
-static size_t ZSTD_loadDictionaryContent(ZSTD_matchState_t* ms, ZSTD_CCtx_params const* params, const void* src, size_t srcSize)
+static size_t ZSTD_loadDictionaryContent(ZSTD_matchState_t* ms,
+ ZSTD_CCtx_params const* params,
+ const void* src, size_t srcSize,
+ ZSTD_dictTableLoadMethod_e dtlm)
{
const BYTE* const ip = (const BYTE*) src;
const BYTE* const iend = ip + srcSize;
- ZSTD_compressionParameters const* cParams = &params->cParams;
ZSTD_window_update(&ms->window, src, srcSize);
ms->loadedDictEnd = params->forceWindow ? 0 : (U32)(iend - ms->window.base);
+ /* Assert that we the ms params match the params we're being given */
+ ZSTD_assertEqualCParams(params->cParams, ms->cParams);
+
if (srcSize <= HASH_READ_SIZE) return 0;
switch(params->cParams.strategy)
{
case ZSTD_fast:
- ZSTD_fillHashTable(ms, cParams, iend);
+ ZSTD_fillHashTable(ms, iend, dtlm);
break;
case ZSTD_dfast:
- ZSTD_fillDoubleHashTable(ms, cParams, iend);
+ ZSTD_fillDoubleHashTable(ms, iend, dtlm);
break;
case ZSTD_greedy:
case ZSTD_lazy:
case ZSTD_lazy2:
if (srcSize >= HASH_READ_SIZE)
- ZSTD_insertAndFindFirstIndex(ms, cParams, iend-HASH_READ_SIZE);
+ ZSTD_insertAndFindFirstIndex(ms, iend-HASH_READ_SIZE);
break;
case ZSTD_btlazy2: /* we want the dictionary table fully sorted */
case ZSTD_btopt:
case ZSTD_btultra:
+ case ZSTD_btultra2:
if (srcSize >= HASH_READ_SIZE)
- ZSTD_updateTree(ms, cParams, iend-HASH_READ_SIZE, iend);
+ ZSTD_updateTree(ms, iend-HASH_READ_SIZE, iend);
break;
default:
@@ -2256,7 +3037,12 @@ static size_t ZSTD_checkDictNCount(short* normalizedCounter, unsigned dictMaxSym
* assumptions : magic number supposed already checked
* dictSize supposed > 8
*/
-static size_t ZSTD_loadZstdDictionary(ZSTD_compressedBlockState_t* bs, ZSTD_matchState_t* ms, ZSTD_CCtx_params const* params, const void* dict, size_t dictSize, void* workspace)
+static size_t ZSTD_loadZstdDictionary(ZSTD_compressedBlockState_t* bs,
+ ZSTD_matchState_t* ms,
+ ZSTD_CCtx_params const* params,
+ const void* dict, size_t dictSize,
+ ZSTD_dictTableLoadMethod_e dtlm,
+ void* workspace)
{
const BYTE* dictPtr = (const BYTE*)dict;
const BYTE* const dictEnd = dictPtr + dictSize;
@@ -2265,13 +3051,15 @@ static size_t ZSTD_loadZstdDictionary(ZSTD_compressedBlockState_t* bs, ZSTD_matc
size_t dictID;
ZSTD_STATIC_ASSERT(HUF_WORKSPACE_SIZE >= (1<<MAX(MLFSELog,LLFSELog)));
+ assert(dictSize > 8);
+ assert(MEM_readLE32(dictPtr) == ZSTD_MAGIC_DICTIONARY);
dictPtr += 4; /* skip magic number */
dictID = params->fParams.noDictIDFlag ? 0 : MEM_readLE32(dictPtr);
dictPtr += 4;
{ unsigned maxSymbolValue = 255;
- size_t const hufHeaderSize = HUF_readCTable((HUF_CElt*)bs->entropy.hufCTable, &maxSymbolValue, dictPtr, dictEnd-dictPtr);
+ size_t const hufHeaderSize = HUF_readCTable((HUF_CElt*)bs->entropy.huf.CTable, &maxSymbolValue, dictPtr, dictEnd-dictPtr);
if (HUF_isError(hufHeaderSize)) return ERROR(dictionary_corrupted);
if (maxSymbolValue < 255) return ERROR(dictionary_corrupted);
dictPtr += hufHeaderSize;
@@ -2282,7 +3070,10 @@ static size_t ZSTD_loadZstdDictionary(ZSTD_compressedBlockState_t* bs, ZSTD_matc
if (FSE_isError(offcodeHeaderSize)) return ERROR(dictionary_corrupted);
if (offcodeLog > OffFSELog) return ERROR(dictionary_corrupted);
/* Defer checking offcodeMaxValue because we need to know the size of the dictionary content */
- CHECK_E( FSE_buildCTable_wksp(bs->entropy.offcodeCTable, offcodeNCount, offcodeMaxValue, offcodeLog, workspace, HUF_WORKSPACE_SIZE),
+ /* fill all offset symbols to avoid garbage at end of table */
+ CHECK_E( FSE_buildCTable_wksp(bs->entropy.fse.offcodeCTable,
+ offcodeNCount, MaxOff, offcodeLog,
+ workspace, HUF_WORKSPACE_SIZE),
dictionary_corrupted);
dictPtr += offcodeHeaderSize;
}
@@ -2294,7 +3085,9 @@ static size_t ZSTD_loadZstdDictionary(ZSTD_compressedBlockState_t* bs, ZSTD_matc
if (matchlengthLog > MLFSELog) return ERROR(dictionary_corrupted);
/* Every match length code must have non-zero probability */
CHECK_F( ZSTD_checkDictNCount(matchlengthNCount, matchlengthMaxValue, MaxML));
- CHECK_E( FSE_buildCTable_wksp(bs->entropy.matchlengthCTable, matchlengthNCount, matchlengthMaxValue, matchlengthLog, workspace, HUF_WORKSPACE_SIZE),
+ CHECK_E( FSE_buildCTable_wksp(bs->entropy.fse.matchlengthCTable,
+ matchlengthNCount, matchlengthMaxValue, matchlengthLog,
+ workspace, HUF_WORKSPACE_SIZE),
dictionary_corrupted);
dictPtr += matchlengthHeaderSize;
}
@@ -2306,7 +3099,9 @@ static size_t ZSTD_loadZstdDictionary(ZSTD_compressedBlockState_t* bs, ZSTD_matc
if (litlengthLog > LLFSELog) return ERROR(dictionary_corrupted);
/* Every literal length code must have non-zero probability */
CHECK_F( ZSTD_checkDictNCount(litlengthNCount, litlengthMaxValue, MaxLL));
- CHECK_E( FSE_buildCTable_wksp(bs->entropy.litlengthCTable, litlengthNCount, litlengthMaxValue, litlengthLog, workspace, HUF_WORKSPACE_SIZE),
+ CHECK_E( FSE_buildCTable_wksp(bs->entropy.fse.litlengthCTable,
+ litlengthNCount, litlengthMaxValue, litlengthLog,
+ workspace, HUF_WORKSPACE_SIZE),
dictionary_corrupted);
dictPtr += litlengthHeaderSize;
}
@@ -2332,22 +3127,25 @@ static size_t ZSTD_loadZstdDictionary(ZSTD_compressedBlockState_t* bs, ZSTD_matc
if (bs->rep[u] > dictContentSize) return ERROR(dictionary_corrupted);
} }
- bs->entropy.hufCTable_repeatMode = HUF_repeat_valid;
- bs->entropy.offcode_repeatMode = FSE_repeat_valid;
- bs->entropy.matchlength_repeatMode = FSE_repeat_valid;
- bs->entropy.litlength_repeatMode = FSE_repeat_valid;
- CHECK_F(ZSTD_loadDictionaryContent(ms, params, dictPtr, dictContentSize));
+ bs->entropy.huf.repeatMode = HUF_repeat_valid;
+ bs->entropy.fse.offcode_repeatMode = FSE_repeat_valid;
+ bs->entropy.fse.matchlength_repeatMode = FSE_repeat_valid;
+ bs->entropy.fse.litlength_repeatMode = FSE_repeat_valid;
+ CHECK_F(ZSTD_loadDictionaryContent(ms, params, dictPtr, dictContentSize, dtlm));
return dictID;
}
}
/** ZSTD_compress_insertDictionary() :
* @return : dictID, or an error code */
-static size_t ZSTD_compress_insertDictionary(ZSTD_compressedBlockState_t* bs, ZSTD_matchState_t* ms,
- ZSTD_CCtx_params const* params,
- const void* dict, size_t dictSize,
- ZSTD_dictContentType_e dictContentType,
- void* workspace)
+static size_t
+ZSTD_compress_insertDictionary(ZSTD_compressedBlockState_t* bs,
+ ZSTD_matchState_t* ms,
+ const ZSTD_CCtx_params* params,
+ const void* dict, size_t dictSize,
+ ZSTD_dictContentType_e dictContentType,
+ ZSTD_dictTableLoadMethod_e dtlm,
+ void* workspace)
{
DEBUGLOG(4, "ZSTD_compress_insertDictionary (dictSize=%u)", (U32)dictSize);
if ((dict==NULL) || (dictSize<=8)) return 0;
@@ -2356,12 +3154,12 @@ static size_t ZSTD_compress_insertDictionary(ZSTD_compressedBlockState_t* bs, ZS
/* dict restricted modes */
if (dictContentType == ZSTD_dct_rawContent)
- return ZSTD_loadDictionaryContent(ms, params, dict, dictSize);
+ return ZSTD_loadDictionaryContent(ms, params, dict, dictSize, dtlm);
if (MEM_readLE32(dict) != ZSTD_MAGIC_DICTIONARY) {
if (dictContentType == ZSTD_dct_auto) {
DEBUGLOG(4, "raw content dictionary detected");
- return ZSTD_loadDictionaryContent(ms, params, dict, dictSize);
+ return ZSTD_loadDictionaryContent(ms, params, dict, dictSize, dtlm);
}
if (dictContentType == ZSTD_dct_fullDict)
return ERROR(dictionary_wrong);
@@ -2369,17 +3167,18 @@ static size_t ZSTD_compress_insertDictionary(ZSTD_compressedBlockState_t* bs, ZS
}
/* dict as full zstd dictionary */
- return ZSTD_loadZstdDictionary(bs, ms, params, dict, dictSize, workspace);
+ return ZSTD_loadZstdDictionary(bs, ms, params, dict, dictSize, dtlm, workspace);
}
/*! ZSTD_compressBegin_internal() :
* @return : 0, or an error code */
-size_t ZSTD_compressBegin_internal(ZSTD_CCtx* cctx,
- const void* dict, size_t dictSize,
- ZSTD_dictContentType_e dictContentType,
- const ZSTD_CDict* cdict,
- ZSTD_CCtx_params params, U64 pledgedSrcSize,
- ZSTD_buffered_policy_e zbuff)
+static size_t ZSTD_compressBegin_internal(ZSTD_CCtx* cctx,
+ const void* dict, size_t dictSize,
+ ZSTD_dictContentType_e dictContentType,
+ ZSTD_dictTableLoadMethod_e dtlm,
+ const ZSTD_CDict* cdict,
+ ZSTD_CCtx_params params, U64 pledgedSrcSize,
+ ZSTD_buffered_policy_e zbuff)
{
DEBUGLOG(4, "ZSTD_compressBegin_internal: wlog=%u", params.cParams.windowLog);
/* params are supposed to be fully validated at this point */
@@ -2387,9 +3186,7 @@ size_t ZSTD_compressBegin_internal(ZSTD_CCtx* cctx,
assert(!((dict) && (cdict))); /* either dict or cdict, not both */
if (cdict && cdict->dictContentSize>0) {
- cctx->requestedParams = params;
- return ZSTD_resetCCtx_usingCDict(cctx, cdict, params.cParams.windowLog,
- params.fParams, pledgedSrcSize, zbuff);
+ return ZSTD_resetCCtx_usingCDict(cctx, cdict, params, pledgedSrcSize, zbuff);
}
CHECK_F( ZSTD_resetCCtx_internal(cctx, params, pledgedSrcSize,
@@ -2397,7 +3194,7 @@ size_t ZSTD_compressBegin_internal(ZSTD_CCtx* cctx,
{
size_t const dictID = ZSTD_compress_insertDictionary(
cctx->blockState.prevCBlock, &cctx->blockState.matchState,
- &params, dict, dictSize, dictContentType, cctx->entropyWorkspace);
+ &params, dict, dictSize, dictContentType, dtlm, cctx->entropyWorkspace);
if (ZSTD_isError(dictID)) return dictID;
assert(dictID <= (size_t)(U32)-1);
cctx->dictID = (U32)dictID;
@@ -2408,6 +3205,7 @@ size_t ZSTD_compressBegin_internal(ZSTD_CCtx* cctx,
size_t ZSTD_compressBegin_advanced_internal(ZSTD_CCtx* cctx,
const void* dict, size_t dictSize,
ZSTD_dictContentType_e dictContentType,
+ ZSTD_dictTableLoadMethod_e dtlm,
const ZSTD_CDict* cdict,
ZSTD_CCtx_params params,
unsigned long long pledgedSrcSize)
@@ -2416,7 +3214,7 @@ size_t ZSTD_compressBegin_advanced_internal(ZSTD_CCtx* cctx,
/* compression parameters verification and optimization */
CHECK_F( ZSTD_checkCParams(params.cParams) );
return ZSTD_compressBegin_internal(cctx,
- dict, dictSize, dictContentType,
+ dict, dictSize, dictContentType, dtlm,
cdict,
params, pledgedSrcSize,
ZSTDb_not_buffered);
@@ -2431,7 +3229,7 @@ size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* cctx,
ZSTD_CCtx_params const cctxParams =
ZSTD_assignParamsToCCtxParams(cctx->requestedParams, params);
return ZSTD_compressBegin_advanced_internal(cctx,
- dict, dictSize, ZSTD_dct_auto,
+ dict, dictSize, ZSTD_dct_auto, ZSTD_dtlm_fast,
NULL /*cdict*/,
cctxParams, pledgedSrcSize);
}
@@ -2441,8 +3239,8 @@ size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t di
ZSTD_parameters const params = ZSTD_getParams(compressionLevel, ZSTD_CONTENTSIZE_UNKNOWN, dictSize);
ZSTD_CCtx_params const cctxParams =
ZSTD_assignParamsToCCtxParams(cctx->requestedParams, params);
- DEBUGLOG(4, "ZSTD_compressBegin_usingDict (dictSize=%u)", (U32)dictSize);
- return ZSTD_compressBegin_internal(cctx, dict, dictSize, ZSTD_dct_auto, NULL,
+ DEBUGLOG(4, "ZSTD_compressBegin_usingDict (dictSize=%u)", (unsigned)dictSize);
+ return ZSTD_compressBegin_internal(cctx, dict, dictSize, ZSTD_dct_auto, ZSTD_dtlm_fast, NULL,
cctxParams, ZSTD_CONTENTSIZE_UNKNOWN, ZSTDb_not_buffered);
}
@@ -2485,7 +3283,7 @@ static size_t ZSTD_writeEpilogue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity)
if (cctx->appliedParams.fParams.checksumFlag) {
U32 const checksum = (U32) XXH64_digest(&cctx->xxhState);
if (dstCapacity<4) return ERROR(dstSize_tooSmall);
- DEBUGLOG(4, "ZSTD_writeEpilogue: write checksum : %08X", checksum);
+ DEBUGLOG(4, "ZSTD_writeEpilogue: write checksum : %08X", (unsigned)checksum);
MEM_writeLE32(op, checksum);
op += 4;
}
@@ -2505,11 +3303,13 @@ size_t ZSTD_compressEnd (ZSTD_CCtx* cctx,
if (ZSTD_isError(cSize)) return cSize;
endResult = ZSTD_writeEpilogue(cctx, (char*)dst + cSize, dstCapacity-cSize);
if (ZSTD_isError(endResult)) return endResult;
- if (cctx->appliedParams.fParams.contentSizeFlag) { /* control src size */
+ assert(!(cctx->appliedParams.fParams.contentSizeFlag && cctx->pledgedSrcSizePlusOne == 0));
+ if (cctx->pledgedSrcSizePlusOne != 0) { /* control src size */
+ ZSTD_STATIC_ASSERT(ZSTD_CONTENTSIZE_UNKNOWN == (unsigned long long)-1);
DEBUGLOG(4, "end of frame : controlling src size");
if (cctx->pledgedSrcSizePlusOne != cctx->consumedSrcSize+1) {
DEBUGLOG(4, "error : pledgedSrcSize = %u, while realSrcSize = %u",
- (U32)cctx->pledgedSrcSizePlusOne-1, (U32)cctx->consumedSrcSize);
+ (unsigned)cctx->pledgedSrcSizePlusOne-1, (unsigned)cctx->consumedSrcSize);
return ERROR(srcSize_wrong);
} }
return cSize + endResult;
@@ -2517,22 +3317,22 @@ size_t ZSTD_compressEnd (ZSTD_CCtx* cctx,
static size_t ZSTD_compress_internal (ZSTD_CCtx* cctx,
- void* dst, size_t dstCapacity,
- const void* src, size_t srcSize,
- const void* dict,size_t dictSize,
- ZSTD_parameters params)
+ void* dst, size_t dstCapacity,
+ const void* src, size_t srcSize,
+ const void* dict,size_t dictSize,
+ ZSTD_parameters params)
{
ZSTD_CCtx_params const cctxParams =
ZSTD_assignParamsToCCtxParams(cctx->requestedParams, params);
DEBUGLOG(4, "ZSTD_compress_internal");
return ZSTD_compress_advanced_internal(cctx,
- dst, dstCapacity,
- src, srcSize,
- dict, dictSize,
- cctxParams);
+ dst, dstCapacity,
+ src, srcSize,
+ dict, dictSize,
+ cctxParams);
}
-size_t ZSTD_compress_advanced (ZSTD_CCtx* ctx,
+size_t ZSTD_compress_advanced (ZSTD_CCtx* cctx,
void* dst, size_t dstCapacity,
const void* src, size_t srcSize,
const void* dict,size_t dictSize,
@@ -2540,7 +3340,11 @@ size_t ZSTD_compress_advanced (ZSTD_CCtx* ctx,
{
DEBUGLOG(4, "ZSTD_compress_advanced");
CHECK_F(ZSTD_checkCParams(params.cParams));
- return ZSTD_compress_internal(ctx, dst, dstCapacity, src, srcSize, dict, dictSize, params);
+ return ZSTD_compress_internal(cctx,
+ dst, dstCapacity,
+ src, srcSize,
+ dict, dictSize,
+ params);
}
/* Internal */
@@ -2551,37 +3355,44 @@ size_t ZSTD_compress_advanced_internal(
const void* dict,size_t dictSize,
ZSTD_CCtx_params params)
{
- DEBUGLOG(4, "ZSTD_compress_advanced_internal (srcSize:%u)",
- (U32)srcSize);
- CHECK_F( ZSTD_compressBegin_internal(cctx, dict, dictSize, ZSTD_dct_auto, NULL,
- params, srcSize, ZSTDb_not_buffered) );
+ DEBUGLOG(4, "ZSTD_compress_advanced_internal (srcSize:%u)", (unsigned)srcSize);
+ CHECK_F( ZSTD_compressBegin_internal(cctx,
+ dict, dictSize, ZSTD_dct_auto, ZSTD_dtlm_fast, NULL,
+ params, srcSize, ZSTDb_not_buffered) );
return ZSTD_compressEnd(cctx, dst, dstCapacity, src, srcSize);
}
-size_t ZSTD_compress_usingDict(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize,
- const void* dict, size_t dictSize, int compressionLevel)
+size_t ZSTD_compress_usingDict(ZSTD_CCtx* cctx,
+ void* dst, size_t dstCapacity,
+ const void* src, size_t srcSize,
+ const void* dict, size_t dictSize,
+ int compressionLevel)
{
- ZSTD_parameters const params = ZSTD_getParams(compressionLevel, srcSize ? srcSize : 1, dict ? dictSize : 0);
+ ZSTD_parameters const params = ZSTD_getParams(compressionLevel, srcSize + (!srcSize), dict ? dictSize : 0);
ZSTD_CCtx_params cctxParams = ZSTD_assignParamsToCCtxParams(cctx->requestedParams, params);
assert(params.fParams.contentSizeFlag == 1);
- ZSTD_CCtxParam_setParameter(&cctxParams, ZSTD_p_compressLiterals, compressionLevel>=0);
return ZSTD_compress_advanced_internal(cctx, dst, dstCapacity, src, srcSize, dict, dictSize, cctxParams);
}
-size_t ZSTD_compressCCtx (ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize, int compressionLevel)
+size_t ZSTD_compressCCtx(ZSTD_CCtx* cctx,
+ void* dst, size_t dstCapacity,
+ const void* src, size_t srcSize,
+ int compressionLevel)
{
- DEBUGLOG(4, "ZSTD_compressCCtx (srcSize=%u)", (U32)srcSize);
+ DEBUGLOG(4, "ZSTD_compressCCtx (srcSize=%u)", (unsigned)srcSize);
+ assert(cctx != NULL);
return ZSTD_compress_usingDict(cctx, dst, dstCapacity, src, srcSize, NULL, 0, compressionLevel);
}
-size_t ZSTD_compress(void* dst, size_t dstCapacity, const void* src, size_t srcSize, int compressionLevel)
+size_t ZSTD_compress(void* dst, size_t dstCapacity,
+ const void* src, size_t srcSize,
+ int compressionLevel)
{
size_t result;
ZSTD_CCtx ctxBody;
- memset(&ctxBody, 0, sizeof(ctxBody));
- ctxBody.customMem = ZSTD_defaultCMem;
+ ZSTD_initCCtx(&ctxBody, ZSTD_defaultCMem);
result = ZSTD_compressCCtx(&ctxBody, dst, dstCapacity, src, srcSize, compressionLevel);
- ZSTD_free(ctxBody.workSpace, ZSTD_defaultCMem); /* can't free ctxBody itself, as it's on stack; free only heap content */
+ ZSTD_freeCCtxContent(&ctxBody); /* can't free ctxBody itself, as it's on stack; free only heap content */
return result;
}
@@ -2594,7 +3405,7 @@ size_t ZSTD_estimateCDictSize_advanced(
size_t dictSize, ZSTD_compressionParameters cParams,
ZSTD_dictLoadMethod_e dictLoadMethod)
{
- DEBUGLOG(5, "sizeof(ZSTD_CDict) : %u", (U32)sizeof(ZSTD_CDict));
+ DEBUGLOG(5, "sizeof(ZSTD_CDict) : %u", (unsigned)sizeof(ZSTD_CDict));
return sizeof(ZSTD_CDict) + HUF_WORKSPACE_SIZE + ZSTD_sizeof_matchState(&cParams, /* forCCtx */ 0)
+ (dictLoadMethod == ZSTD_dlm_byRef ? 0 : dictSize);
}
@@ -2608,7 +3419,7 @@ size_t ZSTD_estimateCDictSize(size_t dictSize, int compressionLevel)
size_t ZSTD_sizeof_CDict(const ZSTD_CDict* cdict)
{
if (cdict==NULL) return 0; /* support sizeof on NULL */
- DEBUGLOG(5, "sizeof(*cdict) : %u", (U32)sizeof(*cdict));
+ DEBUGLOG(5, "sizeof(*cdict) : %u", (unsigned)sizeof(*cdict));
return cdict->workspaceSize + (cdict->dictBuffer ? cdict->dictContentSize : 0) + sizeof(*cdict);
}
@@ -2619,9 +3430,9 @@ static size_t ZSTD_initCDict_internal(
ZSTD_dictContentType_e dictContentType,
ZSTD_compressionParameters cParams)
{
- DEBUGLOG(3, "ZSTD_initCDict_internal, dictContentType %u", (U32)dictContentType);
+ DEBUGLOG(3, "ZSTD_initCDict_internal (dictContentType:%u)", (unsigned)dictContentType);
assert(!ZSTD_checkCParams(cParams));
- cdict->cParams = cParams;
+ cdict->matchState.cParams = cParams;
if ((dictLoadMethod == ZSTD_dlm_byRef) || (!dictBuffer) || (!dictSize)) {
cdict->dictBuffer = NULL;
cdict->dictContent = dictBuffer;
@@ -2654,7 +3465,7 @@ static size_t ZSTD_initCDict_internal(
{ size_t const dictID = ZSTD_compress_insertDictionary(
&cdict->cBlockState, &cdict->matchState, &params,
cdict->dictContent, cdict->dictContentSize,
- dictContentType, cdict->workspace);
+ dictContentType, ZSTD_dtlm_full, cdict->workspace);
if (ZSTD_isError(dictID)) return dictID;
assert(dictID <= (size_t)(U32)-1);
cdict->dictID = (U32)dictID;
@@ -2669,7 +3480,7 @@ ZSTD_CDict* ZSTD_createCDict_advanced(const void* dictBuffer, size_t dictSize,
ZSTD_dictContentType_e dictContentType,
ZSTD_compressionParameters cParams, ZSTD_customMem customMem)
{
- DEBUGLOG(3, "ZSTD_createCDict_advanced, mode %u", (U32)dictContentType);
+ DEBUGLOG(3, "ZSTD_createCDict_advanced, mode %u", (unsigned)dictContentType);
if (!customMem.customAlloc ^ !customMem.customFree) return NULL;
{ ZSTD_CDict* const cdict = (ZSTD_CDict*)ZSTD_malloc(sizeof(ZSTD_CDict), customMem);
@@ -2750,7 +3561,7 @@ const ZSTD_CDict* ZSTD_initStaticCDict(
void* ptr;
if ((size_t)workspace & 7) return NULL; /* 8-aligned */
DEBUGLOG(4, "(workspaceSize < neededSize) : (%u < %u) => %u",
- (U32)workspaceSize, (U32)neededSize, (U32)(workspaceSize < neededSize));
+ (unsigned)workspaceSize, (unsigned)neededSize, (unsigned)(workspaceSize < neededSize));
if (workspaceSize < neededSize) return NULL;
if (dictLoadMethod == ZSTD_dlm_byCopy) {
@@ -2775,7 +3586,7 @@ const ZSTD_CDict* ZSTD_initStaticCDict(
ZSTD_compressionParameters ZSTD_getCParamsFromCDict(const ZSTD_CDict* cdict)
{
assert(cdict != NULL);
- return cdict->cParams;
+ return cdict->matchState.cParams;
}
/* ZSTD_compressBegin_usingCDict_advanced() :
@@ -2799,7 +3610,7 @@ size_t ZSTD_compressBegin_usingCDict_advanced(
}
params.fParams = fParams;
return ZSTD_compressBegin_internal(cctx,
- NULL, 0, ZSTD_dct_auto,
+ NULL, 0, ZSTD_dct_auto, ZSTD_dtlm_fast,
cdict,
params, pledgedSrcSize,
ZSTDb_not_buffered);
@@ -2813,7 +3624,7 @@ size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict)
{
ZSTD_frameParameters const fParams = { 0 /*content*/, 0 /*checksum*/, 0 /*noDictID*/ };
DEBUGLOG(4, "ZSTD_compressBegin_usingCDict : dictIDFlag == %u", !fParams.noDictIDFlag);
- return ZSTD_compressBegin_usingCDict_advanced(cctx, cdict, fParams, 0);
+ return ZSTD_compressBegin_usingCDict_advanced(cctx, cdict, fParams, ZSTD_CONTENTSIZE_UNKNOWN);
}
size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx,
@@ -2880,16 +3691,17 @@ size_t ZSTD_CStreamOutSize(void)
static size_t ZSTD_resetCStream_internal(ZSTD_CStream* cctx,
const void* const dict, size_t const dictSize, ZSTD_dictContentType_e const dictContentType,
const ZSTD_CDict* const cdict,
- ZSTD_CCtx_params const params, unsigned long long const pledgedSrcSize)
+ ZSTD_CCtx_params params, unsigned long long const pledgedSrcSize)
{
- DEBUGLOG(4, "ZSTD_resetCStream_internal (disableLiteralCompression=%i)",
- params.disableLiteralCompression);
+ DEBUGLOG(4, "ZSTD_resetCStream_internal");
+ /* Finalize the compression parameters */
+ params.cParams = ZSTD_getCParamsFromCCtxParams(&params, pledgedSrcSize, dictSize);
/* params are supposed to be fully validated at this point */
assert(!ZSTD_isError(ZSTD_checkCParams(params.cParams)));
assert(!((dict) && (cdict))); /* either dict or cdict, not both */
CHECK_F( ZSTD_compressBegin_internal(cctx,
- dict, dictSize, dictContentType,
+ dict, dictSize, dictContentType, ZSTD_dtlm_fast,
cdict,
params, pledgedSrcSize,
ZSTDb_buffered) );
@@ -2909,10 +3721,9 @@ static size_t ZSTD_resetCStream_internal(ZSTD_CStream* cctx,
size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize)
{
ZSTD_CCtx_params params = zcs->requestedParams;
- DEBUGLOG(4, "ZSTD_resetCStream: pledgedSrcSize = %u", (U32)pledgedSrcSize);
+ DEBUGLOG(4, "ZSTD_resetCStream: pledgedSrcSize = %u", (unsigned)pledgedSrcSize);
if (pledgedSrcSize==0) pledgedSrcSize = ZSTD_CONTENTSIZE_UNKNOWN;
params.fParams.contentSizeFlag = 1;
- params.cParams = ZSTD_getCParamsFromCCtxParams(&params, pledgedSrcSize, 0);
return ZSTD_resetCStream_internal(zcs, NULL, 0, ZSTD_dct_auto, zcs->cdict, params, pledgedSrcSize);
}
@@ -2925,11 +3736,12 @@ size_t ZSTD_initCStream_internal(ZSTD_CStream* zcs,
ZSTD_CCtx_params params, unsigned long long pledgedSrcSize)
{
DEBUGLOG(4, "ZSTD_initCStream_internal");
+ params.cParams = ZSTD_getCParamsFromCCtxParams(&params, pledgedSrcSize, dictSize);
assert(!ZSTD_isError(ZSTD_checkCParams(params.cParams)));
assert(!((dict) && (cdict))); /* either dict or cdict, not both */
if (dict && dictSize >= 8) {
- DEBUGLOG(4, "loading dictionary of size %u", (U32)dictSize);
+ DEBUGLOG(4, "loading dictionary of size %u", (unsigned)dictSize);
if (zcs->staticSize) { /* static CCtx : never uses malloc */
/* incompatible with internal cdict creation */
return ERROR(memory_allocation);
@@ -2988,28 +3800,24 @@ size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs,
ZSTD_parameters params, unsigned long long pledgedSrcSize)
{
DEBUGLOG(4, "ZSTD_initCStream_advanced: pledgedSrcSize=%u, flag=%u",
- (U32)pledgedSrcSize, params.fParams.contentSizeFlag);
+ (unsigned)pledgedSrcSize, params.fParams.contentSizeFlag);
CHECK_F( ZSTD_checkCParams(params.cParams) );
if ((pledgedSrcSize==0) && (params.fParams.contentSizeFlag==0)) pledgedSrcSize = ZSTD_CONTENTSIZE_UNKNOWN; /* for compatibility with older programs relying on this behavior. Users should now specify ZSTD_CONTENTSIZE_UNKNOWN. This line will be removed in the future. */
- { ZSTD_CCtx_params const cctxParams = ZSTD_assignParamsToCCtxParams(zcs->requestedParams, params);
- return ZSTD_initCStream_internal(zcs, dict, dictSize, NULL /*cdict*/, cctxParams, pledgedSrcSize);
- }
+ zcs->requestedParams = ZSTD_assignParamsToCCtxParams(zcs->requestedParams, params);
+ return ZSTD_initCStream_internal(zcs, dict, dictSize, NULL /*cdict*/, zcs->requestedParams, pledgedSrcSize);
}
size_t ZSTD_initCStream_usingDict(ZSTD_CStream* zcs, const void* dict, size_t dictSize, int compressionLevel)
{
- ZSTD_parameters const params = ZSTD_getParams(compressionLevel, 0, dictSize);
- ZSTD_CCtx_params const cctxParams =
- ZSTD_assignParamsToCCtxParams(zcs->requestedParams, params);
- return ZSTD_initCStream_internal(zcs, dict, dictSize, NULL, cctxParams, ZSTD_CONTENTSIZE_UNKNOWN);
+ ZSTD_CCtxParams_init(&zcs->requestedParams, compressionLevel);
+ return ZSTD_initCStream_internal(zcs, dict, dictSize, NULL, zcs->requestedParams, ZSTD_CONTENTSIZE_UNKNOWN);
}
size_t ZSTD_initCStream_srcSize(ZSTD_CStream* zcs, int compressionLevel, unsigned long long pss)
{
U64 const pledgedSrcSize = (pss==0) ? ZSTD_CONTENTSIZE_UNKNOWN : pss; /* temporary : 0 interpreted as "unknown" during transition period. Users willing to specify "unknown" **must** use ZSTD_CONTENTSIZE_UNKNOWN. `0` will be interpreted as "empty" in the future */
- ZSTD_parameters const params = ZSTD_getParams(compressionLevel, pledgedSrcSize, 0);
- ZSTD_CCtx_params const cctxParams = ZSTD_assignParamsToCCtxParams(zcs->requestedParams, params);
- return ZSTD_initCStream_internal(zcs, NULL, 0, NULL, cctxParams, pledgedSrcSize);
+ ZSTD_CCtxParams_init(&zcs->requestedParams, compressionLevel);
+ return ZSTD_initCStream_internal(zcs, NULL, 0, NULL, zcs->requestedParams, pledgedSrcSize);
}
size_t ZSTD_initCStream(ZSTD_CStream* zcs, int compressionLevel)
@@ -3020,8 +3828,15 @@ size_t ZSTD_initCStream(ZSTD_CStream* zcs, int compressionLevel)
/*====== Compression ======*/
-MEM_STATIC size_t ZSTD_limitCopy(void* dst, size_t dstCapacity,
- const void* src, size_t srcSize)
+static size_t ZSTD_nextInputSizeHint(const ZSTD_CCtx* cctx)
+{
+ size_t hintInSize = cctx->inBuffTarget - cctx->inBuffPos;
+ if (hintInSize==0) hintInSize = cctx->blockSize;
+ return hintInSize;
+}
+
+static size_t ZSTD_limitCopy(void* dst, size_t dstCapacity,
+ const void* src, size_t srcSize)
{
size_t const length = MIN(dstCapacity, srcSize);
if (length) memcpy(dst, src, length);
@@ -3029,7 +3844,7 @@ MEM_STATIC size_t ZSTD_limitCopy(void* dst, size_t dstCapacity,
}
/** ZSTD_compressStream_generic():
- * internal function for all *compressStream*() variants and *compress_generic()
+ * internal function for all *compressStream*() variants
* non-static, because can be called from zstdmt_compress.c
* @return : hint size for next input */
size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
@@ -3046,7 +3861,7 @@ size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
U32 someMoreWork = 1;
/* check expectations */
- DEBUGLOG(5, "ZSTD_compressStream_generic, flush=%u", (U32)flushMode);
+ DEBUGLOG(5, "ZSTD_compressStream_generic, flush=%u", (unsigned)flushMode);
assert(zcs->inBuff != NULL);
assert(zcs->inBuffSize > 0);
assert(zcs->outBuff != NULL);
@@ -3068,12 +3883,12 @@ size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
/* shortcut to compression pass directly into output buffer */
size_t const cSize = ZSTD_compressEnd(zcs,
op, oend-op, ip, iend-ip);
- DEBUGLOG(4, "ZSTD_compressEnd : %u", (U32)cSize);
+ DEBUGLOG(4, "ZSTD_compressEnd : cSize=%u", (unsigned)cSize);
if (ZSTD_isError(cSize)) return cSize;
ip = iend;
op += cSize;
zcs->frameEnded = 1;
- ZSTD_startNewCompression(zcs);
+ ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);
someMoreWork = 0; break;
}
/* complete loading into inBuffer */
@@ -3117,7 +3932,7 @@ size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
if (zcs->inBuffTarget > zcs->inBuffSize)
zcs->inBuffPos = 0, zcs->inBuffTarget = zcs->blockSize;
DEBUGLOG(5, "inBuffTarget:%u / inBuffSize:%u",
- (U32)zcs->inBuffTarget, (U32)zcs->inBuffSize);
+ (unsigned)zcs->inBuffTarget, (unsigned)zcs->inBuffSize);
if (!lastBlock)
assert(zcs->inBuffTarget <= zcs->inBuffSize);
zcs->inToCompress = zcs->inBuffPos;
@@ -3126,7 +3941,7 @@ size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
if (zcs->frameEnded) {
DEBUGLOG(5, "Frame completed directly in outBuffer");
someMoreWork = 0;
- ZSTD_startNewCompression(zcs);
+ ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);
}
break;
}
@@ -3141,7 +3956,7 @@ size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
size_t const flushed = ZSTD_limitCopy(op, oend-op,
zcs->outBuff + zcs->outBuffFlushedSize, toFlush);
DEBUGLOG(5, "toFlush: %u into %u ==> flushed: %u",
- (U32)toFlush, (U32)(oend-op), (U32)flushed);
+ (unsigned)toFlush, (unsigned)(oend-op), (unsigned)flushed);
op += flushed;
zcs->outBuffFlushedSize += flushed;
if (toFlush!=flushed) {
@@ -3154,7 +3969,7 @@ size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
if (zcs->frameEnded) {
DEBUGLOG(5, "Frame completed on flush");
someMoreWork = 0;
- ZSTD_startNewCompression(zcs);
+ ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);
break;
}
zcs->streamStage = zcss_load;
@@ -3169,28 +3984,34 @@ size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
input->pos = ip - istart;
output->pos = op - ostart;
if (zcs->frameEnded) return 0;
- { size_t hintInSize = zcs->inBuffTarget - zcs->inBuffPos;
- if (hintInSize==0) hintInSize = zcs->blockSize;
- return hintInSize;
+ return ZSTD_nextInputSizeHint(zcs);
+}
+
+static size_t ZSTD_nextInputSizeHint_MTorST(const ZSTD_CCtx* cctx)
+{
+#ifdef ZSTD_MULTITHREAD
+ if (cctx->appliedParams.nbWorkers >= 1) {
+ assert(cctx->mtctx != NULL);
+ return ZSTDMT_nextInputSizeHint(cctx->mtctx);
}
+#endif
+ return ZSTD_nextInputSizeHint(cctx);
+
}
size_t ZSTD_compressStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuffer* input)
{
- /* check conditions */
- if (output->pos > output->size) return ERROR(GENERIC);
- if (input->pos > input->size) return ERROR(GENERIC);
-
- return ZSTD_compressStream_generic(zcs, output, input, ZSTD_e_continue);
+ CHECK_F( ZSTD_compressStream2(zcs, output, input, ZSTD_e_continue) );
+ return ZSTD_nextInputSizeHint_MTorST(zcs);
}
-size_t ZSTD_compress_generic (ZSTD_CCtx* cctx,
- ZSTD_outBuffer* output,
- ZSTD_inBuffer* input,
- ZSTD_EndDirective endOp)
+size_t ZSTD_compressStream2( ZSTD_CCtx* cctx,
+ ZSTD_outBuffer* output,
+ ZSTD_inBuffer* input,
+ ZSTD_EndDirective endOp)
{
- DEBUGLOG(5, "ZSTD_compress_generic, endOp=%u ", (U32)endOp);
+ DEBUGLOG(5, "ZSTD_compressStream2, endOp=%u ", (unsigned)endOp);
/* check conditions */
if (output->pos > output->size) return ERROR(GENERIC);
if (input->pos > input->size) return ERROR(GENERIC);
@@ -3200,26 +4021,23 @@ size_t ZSTD_compress_generic (ZSTD_CCtx* cctx,
if (cctx->streamStage == zcss_init) {
ZSTD_CCtx_params params = cctx->requestedParams;
ZSTD_prefixDict const prefixDict = cctx->prefixDict;
- memset(&cctx->prefixDict, 0, sizeof(cctx->prefixDict)); /* single usage */
- assert(prefixDict.dict==NULL || cctx->cdict==NULL); /* only one can be set */
- DEBUGLOG(4, "ZSTD_compress_generic : transparent init stage");
+ memset(&cctx->prefixDict, 0, sizeof(cctx->prefixDict)); /* single usage */
+ assert(prefixDict.dict==NULL || cctx->cdict==NULL); /* only one can be set */
+ DEBUGLOG(4, "ZSTD_compressStream2 : transparent init stage");
if (endOp == ZSTD_e_end) cctx->pledgedSrcSizePlusOne = input->size + 1; /* auto-fix pledgedSrcSize */
params.cParams = ZSTD_getCParamsFromCCtxParams(
&cctx->requestedParams, cctx->pledgedSrcSizePlusOne-1, 0 /*dictSize*/);
+
#ifdef ZSTD_MULTITHREAD
if ((cctx->pledgedSrcSizePlusOne-1) <= ZSTDMT_JOBSIZE_MIN) {
params.nbWorkers = 0; /* do not invoke multi-threading when src size is too small */
}
if (params.nbWorkers > 0) {
/* mt context creation */
- if (cctx->mtctx == NULL || (params.nbWorkers != ZSTDMT_getNbWorkers(cctx->mtctx))) {
- DEBUGLOG(4, "ZSTD_compress_generic: creating new mtctx for nbWorkers=%u",
+ if (cctx->mtctx == NULL) {
+ DEBUGLOG(4, "ZSTD_compressStream2: creating new mtctx for nbWorkers=%u",
params.nbWorkers);
- if (cctx->mtctx != NULL)
- DEBUGLOG(4, "ZSTD_compress_generic: previous nbWorkers was %u",
- ZSTDMT_getNbWorkers(cctx->mtctx));
- ZSTDMT_freeCCtx(cctx->mtctx);
cctx->mtctx = ZSTDMT_createCCtx_advanced(params.nbWorkers, cctx->customMem);
if (cctx->mtctx == NULL) return ERROR(memory_allocation);
}
@@ -3240,6 +4058,7 @@ size_t ZSTD_compress_generic (ZSTD_CCtx* cctx,
assert(cctx->streamStage == zcss_load);
assert(cctx->appliedParams.nbWorkers == 0);
} }
+ /* end of transparent initialization stage */
/* compression stage */
#ifdef ZSTD_MULTITHREAD
@@ -3251,17 +4070,18 @@ size_t ZSTD_compress_generic (ZSTD_CCtx* cctx,
{ size_t const flushMin = ZSTDMT_compressStream_generic(cctx->mtctx, output, input, endOp);
if ( ZSTD_isError(flushMin)
|| (endOp == ZSTD_e_end && flushMin == 0) ) { /* compression completed */
- ZSTD_startNewCompression(cctx);
+ ZSTD_CCtx_reset(cctx, ZSTD_reset_session_only);
}
+ DEBUGLOG(5, "completed ZSTD_compressStream2 delegating to ZSTDMT_compressStream_generic");
return flushMin;
} }
#endif
CHECK_F( ZSTD_compressStream_generic(cctx, output, input, endOp) );
- DEBUGLOG(5, "completed ZSTD_compress_generic");
+ DEBUGLOG(5, "completed ZSTD_compressStream2");
return cctx->outBuffContentSize - cctx->outBuffFlushedSize; /* remaining to flush */
}
-size_t ZSTD_compress_generic_simpleArgs (
+size_t ZSTD_compressStream2_simpleArgs (
ZSTD_CCtx* cctx,
void* dst, size_t dstCapacity, size_t* dstPos,
const void* src, size_t srcSize, size_t* srcPos,
@@ -3269,13 +4089,33 @@ size_t ZSTD_compress_generic_simpleArgs (
{
ZSTD_outBuffer output = { dst, dstCapacity, *dstPos };
ZSTD_inBuffer input = { src, srcSize, *srcPos };
- /* ZSTD_compress_generic() will check validity of dstPos and srcPos */
- size_t const cErr = ZSTD_compress_generic(cctx, &output, &input, endOp);
+ /* ZSTD_compressStream2() will check validity of dstPos and srcPos */
+ size_t const cErr = ZSTD_compressStream2(cctx, &output, &input, endOp);
*dstPos = output.pos;
*srcPos = input.pos;
return cErr;
}
+size_t ZSTD_compress2(ZSTD_CCtx* cctx,
+ void* dst, size_t dstCapacity,
+ const void* src, size_t srcSize)
+{
+ ZSTD_CCtx_reset(cctx, ZSTD_reset_session_only);
+ { size_t oPos = 0;
+ size_t iPos = 0;
+ size_t const result = ZSTD_compressStream2_simpleArgs(cctx,
+ dst, dstCapacity, &oPos,
+ src, srcSize, &iPos,
+ ZSTD_e_end);
+ if (ZSTD_isError(result)) return result;
+ if (result != 0) { /* compression not completed, due to lack of output space */
+ assert(oPos == dstCapacity);
+ return ERROR(dstSize_tooSmall);
+ }
+ assert(iPos == srcSize); /* all input is expected consumed */
+ return oPos;
+ }
+}
/*====== Finalize ======*/
@@ -3284,21 +4124,21 @@ size_t ZSTD_compress_generic_simpleArgs (
size_t ZSTD_flushStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output)
{
ZSTD_inBuffer input = { NULL, 0, 0 };
- if (output->pos > output->size) return ERROR(GENERIC);
- CHECK_F( ZSTD_compressStream_generic(zcs, output, &input, ZSTD_e_flush) );
- return zcs->outBuffContentSize - zcs->outBuffFlushedSize; /* remaining to flush */
+ return ZSTD_compressStream2(zcs, output, &input, ZSTD_e_flush);
}
size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output)
{
ZSTD_inBuffer input = { NULL, 0, 0 };
- if (output->pos > output->size) return ERROR(GENERIC);
- CHECK_F( ZSTD_compressStream_generic(zcs, output, &input, ZSTD_e_end) );
+ size_t const remainingToFlush = ZSTD_compressStream2(zcs, output, &input, ZSTD_e_end);
+ CHECK_F( remainingToFlush );
+ if (zcs->appliedParams.nbWorkers > 0) return remainingToFlush; /* minimal estimation */
+ /* single thread mode : attempt to calculate remaining to flush more precisely */
{ size_t const lastBlockSize = zcs->frameEnded ? 0 : ZSTD_BLOCKHEADERSIZE;
size_t const checksumSize = zcs->frameEnded ? 0 : zcs->appliedParams.fParams.checksumFlag * 4;
- size_t const toFlush = zcs->outBuffContentSize - zcs->outBuffFlushedSize + lastBlockSize + checksumSize;
- DEBUGLOG(4, "ZSTD_endStream : remaining to flush : %u", (U32)toFlush);
+ size_t const toFlush = remainingToFlush + lastBlockSize + checksumSize;
+ DEBUGLOG(4, "ZSTD_endStream : remaining to flush : %u", (unsigned)toFlush);
return toFlush;
}
}
@@ -3308,111 +4148,112 @@ size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output)
#define ZSTD_MAX_CLEVEL 22
int ZSTD_maxCLevel(void) { return ZSTD_MAX_CLEVEL; }
+int ZSTD_minCLevel(void) { return (int)-ZSTD_TARGETLENGTH_MAX; }
static const ZSTD_compressionParameters ZSTD_defaultCParameters[4][ZSTD_MAX_CLEVEL+1] = {
{ /* "default" - guarantees a monotonically increasing memory budget */
/* W, C, H, S, L, TL, strat */
{ 19, 12, 13, 1, 6, 1, ZSTD_fast }, /* base for negative levels */
- { 19, 13, 14, 1, 7, 1, ZSTD_fast }, /* level 1 */
- { 19, 15, 16, 1, 6, 1, ZSTD_fast }, /* level 2 */
- { 20, 16, 17, 1, 5, 8, ZSTD_dfast }, /* level 3 */
- { 20, 17, 18, 1, 5, 8, ZSTD_dfast }, /* level 4 */
- { 20, 17, 18, 2, 5, 16, ZSTD_greedy }, /* level 5 */
- { 21, 17, 19, 2, 5, 16, ZSTD_lazy }, /* level 6 */
- { 21, 18, 19, 3, 5, 16, ZSTD_lazy }, /* level 7 */
- { 21, 18, 20, 3, 5, 16, ZSTD_lazy2 }, /* level 8 */
- { 21, 19, 20, 3, 5, 16, ZSTD_lazy2 }, /* level 9 */
- { 21, 19, 21, 4, 5, 16, ZSTD_lazy2 }, /* level 10 */
- { 22, 20, 22, 4, 5, 16, ZSTD_lazy2 }, /* level 11 */
- { 22, 20, 22, 5, 5, 16, ZSTD_lazy2 }, /* level 12 */
- { 22, 21, 22, 4, 5, 32, ZSTD_btlazy2 }, /* level 13 */
- { 22, 21, 22, 5, 5, 32, ZSTD_btlazy2 }, /* level 14 */
- { 22, 22, 22, 6, 5, 32, ZSTD_btlazy2 }, /* level 15 */
- { 22, 21, 22, 4, 5, 48, ZSTD_btopt }, /* level 16 */
- { 23, 22, 22, 4, 4, 48, ZSTD_btopt }, /* level 17 */
- { 23, 22, 22, 5, 3, 64, ZSTD_btopt }, /* level 18 */
- { 23, 23, 22, 7, 3,128, ZSTD_btopt }, /* level 19 */
- { 25, 25, 23, 7, 3,128, ZSTD_btultra }, /* level 20 */
- { 26, 26, 24, 7, 3,256, ZSTD_btultra }, /* level 21 */
- { 27, 27, 25, 9, 3,512, ZSTD_btultra }, /* level 22 */
+ { 19, 13, 14, 1, 7, 0, ZSTD_fast }, /* level 1 */
+ { 20, 15, 16, 1, 6, 0, ZSTD_fast }, /* level 2 */
+ { 21, 16, 17, 1, 5, 1, ZSTD_dfast }, /* level 3 */
+ { 21, 18, 18, 1, 5, 1, ZSTD_dfast }, /* level 4 */
+ { 21, 18, 19, 2, 5, 2, ZSTD_greedy }, /* level 5 */
+ { 21, 19, 19, 3, 5, 4, ZSTD_greedy }, /* level 6 */
+ { 21, 19, 19, 3, 5, 8, ZSTD_lazy }, /* level 7 */
+ { 21, 19, 19, 3, 5, 16, ZSTD_lazy2 }, /* level 8 */
+ { 21, 19, 20, 4, 5, 16, ZSTD_lazy2 }, /* level 9 */
+ { 22, 20, 21, 4, 5, 16, ZSTD_lazy2 }, /* level 10 */
+ { 22, 21, 22, 4, 5, 16, ZSTD_lazy2 }, /* level 11 */
+ { 22, 21, 22, 5, 5, 16, ZSTD_lazy2 }, /* level 12 */
+ { 22, 21, 22, 5, 5, 32, ZSTD_btlazy2 }, /* level 13 */
+ { 22, 22, 23, 5, 5, 32, ZSTD_btlazy2 }, /* level 14 */
+ { 22, 23, 23, 6, 5, 32, ZSTD_btlazy2 }, /* level 15 */
+ { 22, 22, 22, 5, 5, 48, ZSTD_btopt }, /* level 16 */
+ { 23, 23, 22, 5, 4, 64, ZSTD_btopt }, /* level 17 */
+ { 23, 23, 22, 6, 3, 64, ZSTD_btultra }, /* level 18 */
+ { 23, 24, 22, 7, 3,256, ZSTD_btultra2}, /* level 19 */
+ { 25, 25, 23, 7, 3,256, ZSTD_btultra2}, /* level 20 */
+ { 26, 26, 24, 7, 3,512, ZSTD_btultra2}, /* level 21 */
+ { 27, 27, 25, 9, 3,999, ZSTD_btultra2}, /* level 22 */
},
{ /* for srcSize <= 256 KB */
/* W, C, H, S, L, T, strat */
{ 18, 12, 13, 1, 5, 1, ZSTD_fast }, /* base for negative levels */
- { 18, 13, 14, 1, 6, 1, ZSTD_fast }, /* level 1 */
- { 18, 14, 13, 1, 5, 8, ZSTD_dfast }, /* level 2 */
- { 18, 16, 15, 1, 5, 8, ZSTD_dfast }, /* level 3 */
- { 18, 15, 17, 1, 5, 8, ZSTD_greedy }, /* level 4.*/
- { 18, 16, 17, 4, 5, 8, ZSTD_greedy }, /* level 5.*/
- { 18, 16, 17, 3, 5, 8, ZSTD_lazy }, /* level 6.*/
- { 18, 17, 17, 4, 4, 8, ZSTD_lazy }, /* level 7 */
- { 18, 17, 17, 4, 4, 8, ZSTD_lazy2 }, /* level 8 */
- { 18, 17, 17, 5, 4, 8, ZSTD_lazy2 }, /* level 9 */
- { 18, 17, 17, 6, 4, 8, ZSTD_lazy2 }, /* level 10 */
- { 18, 18, 17, 6, 4, 8, ZSTD_lazy2 }, /* level 11.*/
- { 18, 18, 17, 5, 4, 8, ZSTD_btlazy2 }, /* level 12.*/
- { 18, 19, 17, 7, 4, 8, ZSTD_btlazy2 }, /* level 13 */
- { 18, 18, 18, 4, 4, 16, ZSTD_btopt }, /* level 14.*/
- { 18, 18, 18, 4, 3, 16, ZSTD_btopt }, /* level 15.*/
- { 18, 19, 18, 6, 3, 32, ZSTD_btopt }, /* level 16.*/
- { 18, 19, 18, 8, 3, 64, ZSTD_btopt }, /* level 17.*/
- { 18, 19, 18, 9, 3,128, ZSTD_btopt }, /* level 18.*/
- { 18, 19, 18, 10, 3,256, ZSTD_btopt }, /* level 19.*/
- { 18, 19, 18, 11, 3,512, ZSTD_btultra }, /* level 20.*/
- { 18, 19, 18, 12, 3,512, ZSTD_btultra }, /* level 21.*/
- { 18, 19, 18, 13, 3,512, ZSTD_btultra }, /* level 22.*/
+ { 18, 13, 14, 1, 6, 0, ZSTD_fast }, /* level 1 */
+ { 18, 14, 14, 1, 5, 1, ZSTD_dfast }, /* level 2 */
+ { 18, 16, 16, 1, 4, 1, ZSTD_dfast }, /* level 3 */
+ { 18, 16, 17, 2, 5, 2, ZSTD_greedy }, /* level 4.*/
+ { 18, 18, 18, 3, 5, 2, ZSTD_greedy }, /* level 5.*/
+ { 18, 18, 19, 3, 5, 4, ZSTD_lazy }, /* level 6.*/
+ { 18, 18, 19, 4, 4, 4, ZSTD_lazy }, /* level 7 */
+ { 18, 18, 19, 4, 4, 8, ZSTD_lazy2 }, /* level 8 */
+ { 18, 18, 19, 5, 4, 8, ZSTD_lazy2 }, /* level 9 */
+ { 18, 18, 19, 6, 4, 8, ZSTD_lazy2 }, /* level 10 */
+ { 18, 18, 19, 5, 4, 12, ZSTD_btlazy2 }, /* level 11.*/
+ { 18, 19, 19, 7, 4, 12, ZSTD_btlazy2 }, /* level 12.*/
+ { 18, 18, 19, 4, 4, 16, ZSTD_btopt }, /* level 13 */
+ { 18, 18, 19, 4, 3, 32, ZSTD_btopt }, /* level 14.*/
+ { 18, 18, 19, 6, 3,128, ZSTD_btopt }, /* level 15.*/
+ { 18, 19, 19, 6, 3,128, ZSTD_btultra }, /* level 16.*/
+ { 18, 19, 19, 8, 3,256, ZSTD_btultra }, /* level 17.*/
+ { 18, 19, 19, 6, 3,128, ZSTD_btultra2}, /* level 18.*/
+ { 18, 19, 19, 8, 3,256, ZSTD_btultra2}, /* level 19.*/
+ { 18, 19, 19, 10, 3,512, ZSTD_btultra2}, /* level 20.*/
+ { 18, 19, 19, 12, 3,512, ZSTD_btultra2}, /* level 21.*/
+ { 18, 19, 19, 13, 3,999, ZSTD_btultra2}, /* level 22.*/
},
{ /* for srcSize <= 128 KB */
/* W, C, H, S, L, T, strat */
- { 17, 12, 12, 1, 5, 1, ZSTD_fast }, /* level 0 - not used */
- { 17, 12, 13, 1, 6, 1, ZSTD_fast }, /* level 1 */
- { 17, 13, 16, 1, 5, 1, ZSTD_fast }, /* level 2 */
- { 17, 16, 16, 2, 5, 8, ZSTD_dfast }, /* level 3 */
- { 17, 13, 15, 3, 4, 8, ZSTD_greedy }, /* level 4 */
- { 17, 15, 17, 4, 4, 8, ZSTD_greedy }, /* level 5 */
- { 17, 16, 17, 3, 4, 8, ZSTD_lazy }, /* level 6 */
- { 17, 15, 17, 4, 4, 8, ZSTD_lazy2 }, /* level 7 */
+ { 17, 12, 12, 1, 5, 1, ZSTD_fast }, /* base for negative levels */
+ { 17, 12, 13, 1, 6, 0, ZSTD_fast }, /* level 1 */
+ { 17, 13, 15, 1, 5, 0, ZSTD_fast }, /* level 2 */
+ { 17, 15, 16, 2, 5, 1, ZSTD_dfast }, /* level 3 */
+ { 17, 17, 17, 2, 4, 1, ZSTD_dfast }, /* level 4 */
+ { 17, 16, 17, 3, 4, 2, ZSTD_greedy }, /* level 5 */
+ { 17, 17, 17, 3, 4, 4, ZSTD_lazy }, /* level 6 */
+ { 17, 17, 17, 3, 4, 8, ZSTD_lazy2 }, /* level 7 */
{ 17, 17, 17, 4, 4, 8, ZSTD_lazy2 }, /* level 8 */
{ 17, 17, 17, 5, 4, 8, ZSTD_lazy2 }, /* level 9 */
{ 17, 17, 17, 6, 4, 8, ZSTD_lazy2 }, /* level 10 */
- { 17, 17, 17, 7, 4, 8, ZSTD_lazy2 }, /* level 11 */
- { 17, 17, 17, 8, 4, 8, ZSTD_lazy2 }, /* level 12 */
- { 17, 18, 17, 6, 4, 8, ZSTD_btlazy2 }, /* level 13.*/
- { 17, 17, 17, 7, 3, 8, ZSTD_btopt }, /* level 14.*/
- { 17, 17, 17, 7, 3, 16, ZSTD_btopt }, /* level 15.*/
- { 17, 18, 17, 7, 3, 32, ZSTD_btopt }, /* level 16.*/
- { 17, 18, 17, 7, 3, 64, ZSTD_btopt }, /* level 17.*/
- { 17, 18, 17, 7, 3,256, ZSTD_btopt }, /* level 18.*/
- { 17, 18, 17, 8, 3,256, ZSTD_btopt }, /* level 19.*/
- { 17, 18, 17, 9, 3,256, ZSTD_btultra }, /* level 20.*/
- { 17, 18, 17, 10, 3,256, ZSTD_btultra }, /* level 21.*/
- { 17, 18, 17, 11, 3,512, ZSTD_btultra }, /* level 22.*/
+ { 17, 17, 17, 5, 4, 8, ZSTD_btlazy2 }, /* level 11 */
+ { 17, 18, 17, 7, 4, 12, ZSTD_btlazy2 }, /* level 12 */
+ { 17, 18, 17, 3, 4, 12, ZSTD_btopt }, /* level 13.*/
+ { 17, 18, 17, 4, 3, 32, ZSTD_btopt }, /* level 14.*/
+ { 17, 18, 17, 6, 3,256, ZSTD_btopt }, /* level 15.*/
+ { 17, 18, 17, 6, 3,128, ZSTD_btultra }, /* level 16.*/
+ { 17, 18, 17, 8, 3,256, ZSTD_btultra }, /* level 17.*/
+ { 17, 18, 17, 10, 3,512, ZSTD_btultra }, /* level 18.*/
+ { 17, 18, 17, 5, 3,256, ZSTD_btultra2}, /* level 19.*/
+ { 17, 18, 17, 7, 3,512, ZSTD_btultra2}, /* level 20.*/
+ { 17, 18, 17, 9, 3,512, ZSTD_btultra2}, /* level 21.*/
+ { 17, 18, 17, 11, 3,999, ZSTD_btultra2}, /* level 22.*/
},
{ /* for srcSize <= 16 KB */
/* W, C, H, S, L, T, strat */
{ 14, 12, 13, 1, 5, 1, ZSTD_fast }, /* base for negative levels */
- { 14, 14, 14, 1, 6, 1, ZSTD_fast }, /* level 1 */
- { 14, 14, 14, 1, 4, 1, ZSTD_fast }, /* level 2 */
- { 14, 14, 14, 1, 4, 6, ZSTD_dfast }, /* level 3.*/
- { 14, 14, 14, 4, 4, 6, ZSTD_greedy }, /* level 4.*/
- { 14, 14, 14, 3, 4, 6, ZSTD_lazy }, /* level 5.*/
- { 14, 14, 14, 4, 4, 6, ZSTD_lazy2 }, /* level 6 */
- { 14, 14, 14, 5, 4, 6, ZSTD_lazy2 }, /* level 7 */
- { 14, 14, 14, 6, 4, 6, ZSTD_lazy2 }, /* level 8.*/
- { 14, 15, 14, 6, 4, 6, ZSTD_btlazy2 }, /* level 9.*/
- { 14, 15, 14, 3, 3, 6, ZSTD_btopt }, /* level 10.*/
- { 14, 15, 14, 6, 3, 8, ZSTD_btopt }, /* level 11.*/
- { 14, 15, 14, 6, 3, 16, ZSTD_btopt }, /* level 12.*/
- { 14, 15, 14, 6, 3, 24, ZSTD_btopt }, /* level 13.*/
- { 14, 15, 15, 6, 3, 48, ZSTD_btopt }, /* level 14.*/
- { 14, 15, 15, 6, 3, 64, ZSTD_btopt }, /* level 15.*/
- { 14, 15, 15, 6, 3, 96, ZSTD_btopt }, /* level 16.*/
- { 14, 15, 15, 6, 3,128, ZSTD_btopt }, /* level 17.*/
- { 14, 15, 15, 6, 3,256, ZSTD_btopt }, /* level 18.*/
- { 14, 15, 15, 7, 3,256, ZSTD_btopt }, /* level 19.*/
- { 14, 15, 15, 8, 3,256, ZSTD_btultra }, /* level 20.*/
- { 14, 15, 15, 9, 3,256, ZSTD_btultra }, /* level 21.*/
- { 14, 15, 15, 10, 3,256, ZSTD_btultra }, /* level 22.*/
+ { 14, 14, 15, 1, 5, 0, ZSTD_fast }, /* level 1 */
+ { 14, 14, 15, 1, 4, 0, ZSTD_fast }, /* level 2 */
+ { 14, 14, 15, 2, 4, 1, ZSTD_dfast }, /* level 3 */
+ { 14, 14, 14, 4, 4, 2, ZSTD_greedy }, /* level 4 */
+ { 14, 14, 14, 3, 4, 4, ZSTD_lazy }, /* level 5.*/
+ { 14, 14, 14, 4, 4, 8, ZSTD_lazy2 }, /* level 6 */
+ { 14, 14, 14, 6, 4, 8, ZSTD_lazy2 }, /* level 7 */
+ { 14, 14, 14, 8, 4, 8, ZSTD_lazy2 }, /* level 8.*/
+ { 14, 15, 14, 5, 4, 8, ZSTD_btlazy2 }, /* level 9.*/
+ { 14, 15, 14, 9, 4, 8, ZSTD_btlazy2 }, /* level 10.*/
+ { 14, 15, 14, 3, 4, 12, ZSTD_btopt }, /* level 11.*/
+ { 14, 15, 14, 4, 3, 24, ZSTD_btopt }, /* level 12.*/
+ { 14, 15, 14, 5, 3, 32, ZSTD_btultra }, /* level 13.*/
+ { 14, 15, 15, 6, 3, 64, ZSTD_btultra }, /* level 14.*/
+ { 14, 15, 15, 7, 3,256, ZSTD_btultra }, /* level 15.*/
+ { 14, 15, 15, 5, 3, 48, ZSTD_btultra2}, /* level 16.*/
+ { 14, 15, 15, 6, 3,128, ZSTD_btultra2}, /* level 17.*/
+ { 14, 15, 15, 7, 3,256, ZSTD_btultra2}, /* level 18.*/
+ { 14, 15, 15, 8, 3,256, ZSTD_btultra2}, /* level 19.*/
+ { 14, 15, 15, 8, 3,512, ZSTD_btultra2}, /* level 20.*/
+ { 14, 15, 15, 9, 3,512, ZSTD_btultra2}, /* level 21.*/
+ { 14, 15, 15, 10, 3,999, ZSTD_btultra2}, /* level 22.*/
},
};
@@ -3431,8 +4272,8 @@ ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long l
if (compressionLevel > ZSTD_MAX_CLEVEL) row = ZSTD_MAX_CLEVEL;
{ ZSTD_compressionParameters cp = ZSTD_defaultCParameters[tableID][row];
if (compressionLevel < 0) cp.targetLength = (unsigned)(-compressionLevel); /* acceleration factor */
- return ZSTD_adjustCParams_internal(cp, srcSizeHint, dictSize); }
-
+ return ZSTD_adjustCParams_internal(cp, srcSizeHint, dictSize);
+ }
}
/*! ZSTD_getParams() :
diff --git a/thirdparty/zstd/compress/zstd_compress_internal.h b/thirdparty/zstd/compress/zstd_compress_internal.h
index 81f12ca6df..29bca59859 100644
--- a/thirdparty/zstd/compress/zstd_compress_internal.h
+++ b/thirdparty/zstd/compress/zstd_compress_internal.h
@@ -27,6 +27,7 @@
extern "C" {
#endif
+
/*-*************************************
* Constants
***************************************/
@@ -37,7 +38,8 @@ extern "C" {
It's not a big deal though : candidate will just be sorted again.
Additionnally, candidate position 1 will be lost.
But candidate 1 cannot hide a large tree of candidates, so it's a minimal loss.
- The benefit is that ZSTD_DUBT_UNSORTED_MARK cannot be misdhandled after table re-use with a different strategy */
+ The benefit is that ZSTD_DUBT_UNSORTED_MARK cannot be misdhandled after table re-use with a different strategy
+ Constant required by ZSTD_compressBlock_btlazy2() and ZSTD_reduceTable_internal() */
/*-*************************************
@@ -53,14 +55,22 @@ typedef struct ZSTD_prefixDict_s {
} ZSTD_prefixDict;
typedef struct {
- U32 hufCTable[HUF_CTABLE_SIZE_U32(255)];
+ U32 CTable[HUF_CTABLE_SIZE_U32(255)];
+ HUF_repeat repeatMode;
+} ZSTD_hufCTables_t;
+
+typedef struct {
FSE_CTable offcodeCTable[FSE_CTABLE_SIZE_U32(OffFSELog, MaxOff)];
FSE_CTable matchlengthCTable[FSE_CTABLE_SIZE_U32(MLFSELog, MaxML)];
FSE_CTable litlengthCTable[FSE_CTABLE_SIZE_U32(LLFSELog, MaxLL)];
- HUF_repeat hufCTable_repeatMode;
FSE_repeat offcode_repeatMode;
FSE_repeat matchlength_repeatMode;
FSE_repeat litlength_repeatMode;
+} ZSTD_fseCTables_t;
+
+typedef struct {
+ ZSTD_hufCTables_t huf;
+ ZSTD_fseCTables_t fse;
} ZSTD_entropyCTables_t;
typedef struct {
@@ -76,26 +86,27 @@ typedef struct {
U32 rep[ZSTD_REP_NUM];
} ZSTD_optimal_t;
+typedef enum { zop_dynamic=0, zop_predef } ZSTD_OptPrice_e;
+
typedef struct {
/* All tables are allocated inside cctx->workspace by ZSTD_resetCCtx_internal() */
- U32* litFreq; /* table of literals statistics, of size 256 */
- U32* litLengthFreq; /* table of litLength statistics, of size (MaxLL+1) */
- U32* matchLengthFreq; /* table of matchLength statistics, of size (MaxML+1) */
- U32* offCodeFreq; /* table of offCode statistics, of size (MaxOff+1) */
- ZSTD_match_t* matchTable; /* list of found matches, of size ZSTD_OPT_NUM+1 */
- ZSTD_optimal_t* priceTable; /* All positions tracked by optimal parser, of size ZSTD_OPT_NUM+1 */
+ unsigned* litFreq; /* table of literals statistics, of size 256 */
+ unsigned* litLengthFreq; /* table of litLength statistics, of size (MaxLL+1) */
+ unsigned* matchLengthFreq; /* table of matchLength statistics, of size (MaxML+1) */
+ unsigned* offCodeFreq; /* table of offCode statistics, of size (MaxOff+1) */
+ ZSTD_match_t* matchTable; /* list of found matches, of size ZSTD_OPT_NUM+1 */
+ ZSTD_optimal_t* priceTable; /* All positions tracked by optimal parser, of size ZSTD_OPT_NUM+1 */
U32 litSum; /* nb of literals */
U32 litLengthSum; /* nb of litLength codes */
U32 matchLengthSum; /* nb of matchLength codes */
U32 offCodeSum; /* nb of offset codes */
- /* begin updated by ZSTD_setLog2Prices */
- U32 log2litSum; /* pow2 to compare log2(litfreq) to */
- U32 log2litLengthSum; /* pow2 to compare log2(llfreq) to */
- U32 log2matchLengthSum; /* pow2 to compare log2(mlfreq) to */
- U32 log2offCodeSum; /* pow2 to compare log2(offreq) to */
- /* end : updated by ZSTD_setLog2Prices */
- U32 staticPrices; /* prices follow a pre-defined cost structure, statistics are irrelevant */
+ U32 litSumBasePrice; /* to compare to log2(litfreq) */
+ U32 litLengthSumBasePrice; /* to compare to log2(llfreq) */
+ U32 matchLengthSumBasePrice;/* to compare to log2(mlfreq) */
+ U32 offCodeSumBasePrice; /* to compare to log2(offreq) */
+ ZSTD_OptPrice_e priceType; /* prices can be determined dynamically, or follow a pre-defined cost structure */
+ const ZSTD_entropyCTables_t* symbolCosts; /* pre-calculated dictionary statistics */
} optState_t;
typedef struct {
@@ -111,17 +122,20 @@ typedef struct {
U32 lowLimit; /* below that point, no more data */
} ZSTD_window_t;
-typedef struct {
- ZSTD_window_t window; /* State for window round buffer management */
- U32 loadedDictEnd; /* index of end of dictionary */
- U32 nextToUpdate; /* index from which to continue table update */
- U32 nextToUpdate3; /* index from which to continue table update */
- U32 hashLog3; /* dispatch table : larger == faster, more memory */
+typedef struct ZSTD_matchState_t ZSTD_matchState_t;
+struct ZSTD_matchState_t {
+ ZSTD_window_t window; /* State for window round buffer management */
+ U32 loadedDictEnd; /* index of end of dictionary */
+ U32 nextToUpdate; /* index from which to continue table update */
+ U32 nextToUpdate3; /* index from which to continue table update */
+ U32 hashLog3; /* dispatch table : larger == faster, more memory */
U32* hashTable;
U32* hashTable3;
U32* chainTable;
optState_t opt; /* optimal parser state */
-} ZSTD_matchState_t;
+ const ZSTD_matchState_t * dictMatchState;
+ ZSTD_compressionParameters cParams;
+};
typedef struct {
ZSTD_compressedBlockState_t* prevCBlock;
@@ -147,7 +161,7 @@ typedef struct {
U32 hashLog; /* Log size of hashTable */
U32 bucketSizeLog; /* Log bucket size for collision resolution, at most 8 */
U32 minMatchLength; /* Minimum match length */
- U32 hashEveryLog; /* Log number of entries to skip */
+ U32 hashRateLog; /* Log number of entries to skip */
U32 windowLog; /* Window log for the LDM */
} ldmParams_t;
@@ -161,7 +175,7 @@ typedef struct {
rawSeq* seq; /* The start of the sequences */
size_t pos; /* The position where reading stopped. <= size. */
size_t size; /* The number of sequences. <= capacity. */
- size_t capacity; /* The capacity of the `seq` pointer */
+ size_t capacity; /* The capacity starting from `seq` pointer */
} rawSeqStore_t;
struct ZSTD_CCtx_params_s {
@@ -170,14 +184,16 @@ struct ZSTD_CCtx_params_s {
ZSTD_frameParameters fParams;
int compressionLevel;
- int disableLiteralCompression;
int forceWindow; /* force back-references to respect limit of
* 1<<wLog, even for dictionary */
+ ZSTD_dictAttachPref_e attachDictPref;
+
/* Multithreading: used to pass parameters to mtctx */
- unsigned nbWorkers;
- unsigned jobSize;
- unsigned overlapSizeLog;
+ int nbWorkers;
+ size_t jobSize;
+ int overlapLog;
+ int rsyncable;
/* Long distance matching parameters */
ldmParams_t ldmParams;
@@ -193,6 +209,8 @@ struct ZSTD_CCtx_s {
ZSTD_CCtx_params requestedParams;
ZSTD_CCtx_params appliedParams;
U32 dictID;
+
+ int workSpaceOversizedDuration;
void* workSpace;
size_t workSpaceSize;
size_t blockSize;
@@ -235,11 +253,15 @@ struct ZSTD_CCtx_s {
#endif
};
+typedef enum { ZSTD_dtlm_fast, ZSTD_dtlm_full } ZSTD_dictTableLoadMethod_e;
+
+typedef enum { ZSTD_noDict = 0, ZSTD_extDict = 1, ZSTD_dictMatchState = 2 } ZSTD_dictMode_e;
+
typedef size_t (*ZSTD_blockCompressor) (
ZSTD_matchState_t* bs, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize);
-ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, int extDict);
+ void const* src, size_t srcSize);
+ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, ZSTD_dictMode_e dictMode);
MEM_STATIC U32 ZSTD_LLcode(U32 litLength)
@@ -280,16 +302,18 @@ MEM_STATIC U32 ZSTD_MLcode(U32 mlBase)
*/
MEM_STATIC void ZSTD_storeSeq(seqStore_t* seqStorePtr, size_t litLength, const void* literals, U32 offsetCode, size_t mlBase)
{
-#if defined(ZSTD_DEBUG) && (ZSTD_DEBUG >= 6)
+#if defined(DEBUGLEVEL) && (DEBUGLEVEL >= 6)
static const BYTE* g_start = NULL;
if (g_start==NULL) g_start = (const BYTE*)literals; /* note : index only works for compression within a single segment */
{ U32 const pos = (U32)((const BYTE*)literals - g_start);
- DEBUGLOG(6, "Cpos%7u :%3u literals, match%3u bytes at dist.code%7u",
+ DEBUGLOG(6, "Cpos%7u :%3u literals, match%4u bytes at offCode%7u",
pos, (U32)litLength, (U32)mlBase+MINMATCH, (U32)offsetCode);
}
#endif
+ assert((size_t)(seqStorePtr->sequences - seqStorePtr->sequencesStart) < seqStorePtr->maxNbSeq);
/* copy Literals */
- assert(seqStorePtr->lit + litLength <= seqStorePtr->litStart + 128 KB);
+ assert(seqStorePtr->maxNbLit <= 128 KB);
+ assert(seqStorePtr->lit + litLength <= seqStorePtr->litStart + seqStorePtr->maxNbLit);
ZSTD_wildcopy(seqStorePtr->lit, literals, litLength);
seqStorePtr->lit += litLength;
@@ -420,6 +444,11 @@ ZSTD_count_2segments(const BYTE* ip, const BYTE* match,
const BYTE* const vEnd = MIN( ip + (mEnd - match), iEnd);
size_t const matchLength = ZSTD_count(ip, match, vEnd);
if (match + matchLength != mEnd) return matchLength;
+ DEBUGLOG(7, "ZSTD_count_2segments: found a 2-parts match (current length==%zu)", matchLength);
+ DEBUGLOG(7, "distance from match beginning to end dictionary = %zi", mEnd - match);
+ DEBUGLOG(7, "distance from current pos to end buffer = %zi", iEnd - ip);
+ DEBUGLOG(7, "next byte : ip==%02X, istart==%02X", ip[matchLength], *iStart);
+ DEBUGLOG(7, "final match length = %zu", matchLength + ZSTD_count(ip+matchLength, iStart, iEnd));
return matchLength + ZSTD_count(ip+matchLength, iStart, iEnd);
}
@@ -464,6 +493,64 @@ MEM_STATIC size_t ZSTD_hashPtr(const void* p, U32 hBits, U32 mls)
}
}
+/** ZSTD_ipow() :
+ * Return base^exponent.
+ */
+static U64 ZSTD_ipow(U64 base, U64 exponent)
+{
+ U64 power = 1;
+ while (exponent) {
+ if (exponent & 1) power *= base;
+ exponent >>= 1;
+ base *= base;
+ }
+ return power;
+}
+
+#define ZSTD_ROLL_HASH_CHAR_OFFSET 10
+
+/** ZSTD_rollingHash_append() :
+ * Add the buffer to the hash value.
+ */
+static U64 ZSTD_rollingHash_append(U64 hash, void const* buf, size_t size)
+{
+ BYTE const* istart = (BYTE const*)buf;
+ size_t pos;
+ for (pos = 0; pos < size; ++pos) {
+ hash *= prime8bytes;
+ hash += istart[pos] + ZSTD_ROLL_HASH_CHAR_OFFSET;
+ }
+ return hash;
+}
+
+/** ZSTD_rollingHash_compute() :
+ * Compute the rolling hash value of the buffer.
+ */
+MEM_STATIC U64 ZSTD_rollingHash_compute(void const* buf, size_t size)
+{
+ return ZSTD_rollingHash_append(0, buf, size);
+}
+
+/** ZSTD_rollingHash_primePower() :
+ * Compute the primePower to be passed to ZSTD_rollingHash_rotate() for a hash
+ * over a window of length bytes.
+ */
+MEM_STATIC U64 ZSTD_rollingHash_primePower(U32 length)
+{
+ return ZSTD_ipow(prime8bytes, length - 1);
+}
+
+/** ZSTD_rollingHash_rotate() :
+ * Rotate the rolling hash by one byte.
+ */
+MEM_STATIC U64 ZSTD_rollingHash_rotate(U64 hash, BYTE toRemove, BYTE toAdd, U64 primePower)
+{
+ hash -= (toRemove + ZSTD_ROLL_HASH_CHAR_OFFSET) * primePower;
+ hash *= prime8bytes;
+ hash += toAdd + ZSTD_ROLL_HASH_CHAR_OFFSET;
+ return hash;
+}
+
/*-*************************************
* Round buffer management
***************************************/
@@ -497,6 +584,20 @@ MEM_STATIC U32 ZSTD_window_hasExtDict(ZSTD_window_t const window)
}
/**
+ * ZSTD_matchState_dictMode():
+ * Inspects the provided matchState and figures out what dictMode should be
+ * passed to the compressor.
+ */
+MEM_STATIC ZSTD_dictMode_e ZSTD_matchState_dictMode(const ZSTD_matchState_t *ms)
+{
+ return ZSTD_window_hasExtDict(ms->window) ?
+ ZSTD_extDict :
+ ms->dictMatchState != NULL ?
+ ZSTD_dictMatchState :
+ ZSTD_noDict;
+}
+
+/**
* ZSTD_window_needOverflowCorrection():
* Returns non-zero if the indices are getting too large and need overflow
* protection.
@@ -563,31 +664,44 @@ MEM_STATIC U32 ZSTD_window_correctOverflow(ZSTD_window_t* window, U32 cycleLog,
* ZSTD_window_enforceMaxDist():
* Updates lowLimit so that:
* (srcEnd - base) - lowLimit == maxDist + loadedDictEnd
+ *
* This allows a simple check that index >= lowLimit to see if index is valid.
* This must be called before a block compression call, with srcEnd as the block
* source end.
+ *
* If loadedDictEndPtr is not NULL, we set it to zero once we update lowLimit.
* This is because dictionaries are allowed to be referenced as long as the last
* byte of the dictionary is in the window, but once they are out of range,
* they cannot be referenced. If loadedDictEndPtr is NULL, we use
* loadedDictEnd == 0.
+ *
+ * In normal dict mode, the dict is between lowLimit and dictLimit. In
+ * dictMatchState mode, lowLimit and dictLimit are the same, and the dictionary
+ * is below them. forceWindow and dictMatchState are therefore incompatible.
*/
-MEM_STATIC void ZSTD_window_enforceMaxDist(ZSTD_window_t* window,
- void const* srcEnd, U32 maxDist,
- U32* loadedDictEndPtr)
+MEM_STATIC void
+ZSTD_window_enforceMaxDist(ZSTD_window_t* window,
+ void const* srcEnd,
+ U32 maxDist,
+ U32* loadedDictEndPtr,
+ const ZSTD_matchState_t** dictMatchStatePtr)
{
- U32 const current = (U32)((BYTE const*)srcEnd - window->base);
- U32 loadedDictEnd = loadedDictEndPtr != NULL ? *loadedDictEndPtr : 0;
- if (current > maxDist + loadedDictEnd) {
- U32 const newLowLimit = current - maxDist;
+ U32 const blockEndIdx = (U32)((BYTE const*)srcEnd - window->base);
+ U32 loadedDictEnd = (loadedDictEndPtr != NULL) ? *loadedDictEndPtr : 0;
+ DEBUGLOG(5, "ZSTD_window_enforceMaxDist: blockEndIdx=%u, maxDist=%u",
+ (unsigned)blockEndIdx, (unsigned)maxDist);
+ if (blockEndIdx > maxDist + loadedDictEnd) {
+ U32 const newLowLimit = blockEndIdx - maxDist;
if (window->lowLimit < newLowLimit) window->lowLimit = newLowLimit;
if (window->dictLimit < window->lowLimit) {
- DEBUGLOG(5, "Update dictLimit from %u to %u", window->dictLimit,
- window->lowLimit);
+ DEBUGLOG(5, "Update dictLimit to match lowLimit, from %u to %u",
+ (unsigned)window->dictLimit, (unsigned)window->lowLimit);
window->dictLimit = window->lowLimit;
}
if (loadedDictEndPtr)
*loadedDictEndPtr = 0;
+ if (dictMatchStatePtr)
+ *dictMatchStatePtr = NULL;
}
}
@@ -603,12 +717,12 @@ MEM_STATIC U32 ZSTD_window_update(ZSTD_window_t* window,
{
BYTE const* const ip = (BYTE const*)src;
U32 contiguous = 1;
+ DEBUGLOG(5, "ZSTD_window_update");
/* Check if blocks follow each other */
if (src != window->nextSrc) {
/* not contiguous */
size_t const distanceFromBase = (size_t)(window->nextSrc - window->base);
- DEBUGLOG(5, "Non contiguous blocks, new segment starts at %u",
- window->dictLimit);
+ DEBUGLOG(5, "Non contiguous blocks, new segment starts at %u", window->dictLimit);
window->lowLimit = window->dictLimit;
assert(distanceFromBase == (size_t)(U32)distanceFromBase); /* should never overflow */
window->dictLimit = (U32)distanceFromBase;
@@ -625,10 +739,44 @@ MEM_STATIC U32 ZSTD_window_update(ZSTD_window_t* window,
ptrdiff_t const highInputIdx = (ip + srcSize) - window->dictBase;
U32 const lowLimitMax = (highInputIdx > (ptrdiff_t)window->dictLimit) ? window->dictLimit : (U32)highInputIdx;
window->lowLimit = lowLimitMax;
+ DEBUGLOG(5, "Overlapping extDict and input : new lowLimit = %u", window->lowLimit);
}
return contiguous;
}
+
+/* debug functions */
+#if (DEBUGLEVEL>=2)
+
+MEM_STATIC double ZSTD_fWeight(U32 rawStat)
+{
+ U32 const fp_accuracy = 8;
+ U32 const fp_multiplier = (1 << fp_accuracy);
+ U32 const newStat = rawStat + 1;
+ U32 const hb = ZSTD_highbit32(newStat);
+ U32 const BWeight = hb * fp_multiplier;
+ U32 const FWeight = (newStat << fp_accuracy) >> hb;
+ U32 const weight = BWeight + FWeight;
+ assert(hb + fp_accuracy < 31);
+ return (double)weight / fp_multiplier;
+}
+
+/* display a table content,
+ * listing each element, its frequency, and its predicted bit cost */
+MEM_STATIC void ZSTD_debugTable(const U32* table, U32 max)
+{
+ unsigned u, sum;
+ for (u=0, sum=0; u<=max; u++) sum += table[u];
+ DEBUGLOG(2, "total nb elts: %u", sum);
+ for (u=0; u<=max; u++) {
+ DEBUGLOG(2, "%2u: %5u (%.2f)",
+ u, table[u], ZSTD_fWeight(sum) - ZSTD_fWeight(table[u]) );
+ }
+}
+
+#endif
+
+
#if defined (__cplusplus)
}
#endif
@@ -640,7 +788,7 @@ MEM_STATIC U32 ZSTD_window_update(ZSTD_window_t* window,
* ============================================================== */
/* ZSTD_getCParamsFromCCtxParams() :
- * cParams are built depending on compressionLevel, src size hints,
+ * cParams are built depending on compressionLevel, src size hints,
* LDM and manually set compression parameters.
*/
ZSTD_compressionParameters ZSTD_getCParamsFromCCtxParams(
@@ -656,6 +804,8 @@ size_t ZSTD_initCStream_internal(ZSTD_CStream* zcs,
const ZSTD_CDict* cdict,
ZSTD_CCtx_params params, unsigned long long pledgedSrcSize);
+void ZSTD_resetSeqStore(seqStore_t* ssPtr);
+
/*! ZSTD_compressStream_generic() :
* Private use only. To be called from zstdmt_compress.c in single-thread mode. */
size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
@@ -672,6 +822,7 @@ ZSTD_compressionParameters ZSTD_getCParamsFromCDict(const ZSTD_CDict* cdict);
size_t ZSTD_compressBegin_advanced_internal(ZSTD_CCtx* cctx,
const void* dict, size_t dictSize,
ZSTD_dictContentType_e dictContentType,
+ ZSTD_dictTableLoadMethod_e dtlm,
const ZSTD_CDict* cdict,
ZSTD_CCtx_params params,
unsigned long long pledgedSrcSize);
diff --git a/thirdparty/zstd/compress/zstd_double_fast.c b/thirdparty/zstd/compress/zstd_double_fast.c
index 86e6b39621..47faf6d641 100644
--- a/thirdparty/zstd/compress/zstd_double_fast.c
+++ b/thirdparty/zstd/compress/zstd_double_fast.c
@@ -13,12 +13,12 @@
void ZSTD_fillDoubleHashTable(ZSTD_matchState_t* ms,
- ZSTD_compressionParameters const* cParams,
- void const* end)
+ void const* end, ZSTD_dictTableLoadMethod_e dtlm)
{
+ const ZSTD_compressionParameters* const cParams = &ms->cParams;
U32* const hashLarge = ms->hashTable;
U32 const hBitsL = cParams->hashLog;
- U32 const mls = cParams->searchLength;
+ U32 const mls = cParams->minMatch;
U32* const hashSmall = ms->chainTable;
U32 const hBitsS = cParams->chainLog;
const BYTE* const base = ms->window.base;
@@ -40,6 +40,9 @@ void ZSTD_fillDoubleHashTable(ZSTD_matchState_t* ms,
hashSmall[smHash] = current + i;
if (i == 0 || hashLarge[lgHash] == 0)
hashLarge[lgHash] = current + i;
+ /* Only load extra positions for ZSTD_dtlm_full */
+ if (dtlm == ZSTD_dtlm_fast)
+ break;
}
}
}
@@ -48,9 +51,10 @@ void ZSTD_fillDoubleHashTable(ZSTD_matchState_t* ms,
FORCE_INLINE_TEMPLATE
size_t ZSTD_compressBlock_doubleFast_generic(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize,
- U32 const mls /* template */)
+ void const* src, size_t srcSize,
+ U32 const mls /* template */, ZSTD_dictMode_e const dictMode)
{
+ ZSTD_compressionParameters const* cParams = &ms->cParams;
U32* const hashLong = ms->hashTable;
const U32 hBitsL = cParams->hashLog;
U32* const hashSmall = ms->chainTable;
@@ -59,70 +63,188 @@ size_t ZSTD_compressBlock_doubleFast_generic(
const BYTE* const istart = (const BYTE*)src;
const BYTE* ip = istart;
const BYTE* anchor = istart;
- const U32 lowestIndex = ms->window.dictLimit;
- const BYTE* const lowest = base + lowestIndex;
+ const U32 prefixLowestIndex = ms->window.dictLimit;
+ const BYTE* const prefixLowest = base + prefixLowestIndex;
const BYTE* const iend = istart + srcSize;
const BYTE* const ilimit = iend - HASH_READ_SIZE;
U32 offset_1=rep[0], offset_2=rep[1];
U32 offsetSaved = 0;
+ const ZSTD_matchState_t* const dms = ms->dictMatchState;
+ const ZSTD_compressionParameters* const dictCParams =
+ dictMode == ZSTD_dictMatchState ?
+ &dms->cParams : NULL;
+ const U32* const dictHashLong = dictMode == ZSTD_dictMatchState ?
+ dms->hashTable : NULL;
+ const U32* const dictHashSmall = dictMode == ZSTD_dictMatchState ?
+ dms->chainTable : NULL;
+ const U32 dictStartIndex = dictMode == ZSTD_dictMatchState ?
+ dms->window.dictLimit : 0;
+ const BYTE* const dictBase = dictMode == ZSTD_dictMatchState ?
+ dms->window.base : NULL;
+ const BYTE* const dictStart = dictMode == ZSTD_dictMatchState ?
+ dictBase + dictStartIndex : NULL;
+ const BYTE* const dictEnd = dictMode == ZSTD_dictMatchState ?
+ dms->window.nextSrc : NULL;
+ const U32 dictIndexDelta = dictMode == ZSTD_dictMatchState ?
+ prefixLowestIndex - (U32)(dictEnd - dictBase) :
+ 0;
+ const U32 dictHBitsL = dictMode == ZSTD_dictMatchState ?
+ dictCParams->hashLog : hBitsL;
+ const U32 dictHBitsS = dictMode == ZSTD_dictMatchState ?
+ dictCParams->chainLog : hBitsS;
+ const U32 dictAndPrefixLength = (U32)(ip - prefixLowest + dictEnd - dictStart);
+
+ assert(dictMode == ZSTD_noDict || dictMode == ZSTD_dictMatchState);
+
/* init */
- ip += (ip==lowest);
- { U32 const maxRep = (U32)(ip-lowest);
+ ip += (dictAndPrefixLength == 0);
+ if (dictMode == ZSTD_noDict) {
+ U32 const maxRep = (U32)(ip - prefixLowest);
if (offset_2 > maxRep) offsetSaved = offset_2, offset_2 = 0;
if (offset_1 > maxRep) offsetSaved = offset_1, offset_1 = 0;
}
+ if (dictMode == ZSTD_dictMatchState) {
+ /* dictMatchState repCode checks don't currently handle repCode == 0
+ * disabling. */
+ assert(offset_1 <= dictAndPrefixLength);
+ assert(offset_2 <= dictAndPrefixLength);
+ }
/* Main Search Loop */
while (ip < ilimit) { /* < instead of <=, because repcode check at (ip+1) */
size_t mLength;
+ U32 offset;
size_t const h2 = ZSTD_hashPtr(ip, hBitsL, 8);
size_t const h = ZSTD_hashPtr(ip, hBitsS, mls);
+ size_t const dictHL = ZSTD_hashPtr(ip, dictHBitsL, 8);
+ size_t const dictHS = ZSTD_hashPtr(ip, dictHBitsS, mls);
U32 const current = (U32)(ip-base);
U32 const matchIndexL = hashLong[h2];
- U32 const matchIndexS = hashSmall[h];
+ U32 matchIndexS = hashSmall[h];
const BYTE* matchLong = base + matchIndexL;
const BYTE* match = base + matchIndexS;
+ const U32 repIndex = current + 1 - offset_1;
+ const BYTE* repMatch = (dictMode == ZSTD_dictMatchState
+ && repIndex < prefixLowestIndex) ?
+ dictBase + (repIndex - dictIndexDelta) :
+ base + repIndex;
hashLong[h2] = hashSmall[h] = current; /* update hash tables */
- assert(offset_1 <= current); /* supposed guaranteed by construction */
- if ((offset_1 > 0) & (MEM_read32(ip+1-offset_1) == MEM_read32(ip+1))) {
- /* favor repcode */
+ /* check dictMatchState repcode */
+ if (dictMode == ZSTD_dictMatchState
+ && ((U32)((prefixLowestIndex-1) - repIndex) >= 3 /* intentional underflow */)
+ && (MEM_read32(repMatch) == MEM_read32(ip+1)) ) {
+ const BYTE* repMatchEnd = repIndex < prefixLowestIndex ? dictEnd : iend;
+ mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixLowest) + 4;
+ ip++;
+ ZSTD_storeSeq(seqStore, ip-anchor, anchor, 0, mLength-MINMATCH);
+ goto _match_stored;
+ }
+
+ /* check noDict repcode */
+ if ( dictMode == ZSTD_noDict
+ && ((offset_1 > 0) & (MEM_read32(ip+1-offset_1) == MEM_read32(ip+1)))) {
mLength = ZSTD_count(ip+1+4, ip+1+4-offset_1, iend) + 4;
ip++;
ZSTD_storeSeq(seqStore, ip-anchor, anchor, 0, mLength-MINMATCH);
- } else {
- U32 offset;
- if ( (matchIndexL > lowestIndex) && (MEM_read64(matchLong) == MEM_read64(ip)) ) {
+ goto _match_stored;
+ }
+
+ if (matchIndexL > prefixLowestIndex) {
+ /* check prefix long match */
+ if (MEM_read64(matchLong) == MEM_read64(ip)) {
mLength = ZSTD_count(ip+8, matchLong+8, iend) + 8;
offset = (U32)(ip-matchLong);
- while (((ip>anchor) & (matchLong>lowest)) && (ip[-1] == matchLong[-1])) { ip--; matchLong--; mLength++; } /* catch up */
- } else if ( (matchIndexS > lowestIndex) && (MEM_read32(match) == MEM_read32(ip)) ) {
- size_t const hl3 = ZSTD_hashPtr(ip+1, hBitsL, 8);
- U32 const matchIndexL3 = hashLong[hl3];
- const BYTE* matchL3 = base + matchIndexL3;
- hashLong[hl3] = current + 1;
- if ( (matchIndexL3 > lowestIndex) && (MEM_read64(matchL3) == MEM_read64(ip+1)) ) {
+ while (((ip>anchor) & (matchLong>prefixLowest)) && (ip[-1] == matchLong[-1])) { ip--; matchLong--; mLength++; } /* catch up */
+ goto _match_found;
+ }
+ } else if (dictMode == ZSTD_dictMatchState) {
+ /* check dictMatchState long match */
+ U32 const dictMatchIndexL = dictHashLong[dictHL];
+ const BYTE* dictMatchL = dictBase + dictMatchIndexL;
+ assert(dictMatchL < dictEnd);
+
+ if (dictMatchL > dictStart && MEM_read64(dictMatchL) == MEM_read64(ip)) {
+ mLength = ZSTD_count_2segments(ip+8, dictMatchL+8, iend, dictEnd, prefixLowest) + 8;
+ offset = (U32)(current - dictMatchIndexL - dictIndexDelta);
+ while (((ip>anchor) & (dictMatchL>dictStart)) && (ip[-1] == dictMatchL[-1])) { ip--; dictMatchL--; mLength++; } /* catch up */
+ goto _match_found;
+ }
+ }
+
+ if (matchIndexS > prefixLowestIndex) {
+ /* check prefix short match */
+ if (MEM_read32(match) == MEM_read32(ip)) {
+ goto _search_next_long;
+ }
+ } else if (dictMode == ZSTD_dictMatchState) {
+ /* check dictMatchState short match */
+ U32 const dictMatchIndexS = dictHashSmall[dictHS];
+ match = dictBase + dictMatchIndexS;
+ matchIndexS = dictMatchIndexS + dictIndexDelta;
+
+ if (match > dictStart && MEM_read32(match) == MEM_read32(ip)) {
+ goto _search_next_long;
+ }
+ }
+
+ ip += ((ip-anchor) >> kSearchStrength) + 1;
+ continue;
+
+_search_next_long:
+
+ {
+ size_t const hl3 = ZSTD_hashPtr(ip+1, hBitsL, 8);
+ size_t const dictHLNext = ZSTD_hashPtr(ip+1, dictHBitsL, 8);
+ U32 const matchIndexL3 = hashLong[hl3];
+ const BYTE* matchL3 = base + matchIndexL3;
+ hashLong[hl3] = current + 1;
+
+ /* check prefix long +1 match */
+ if (matchIndexL3 > prefixLowestIndex) {
+ if (MEM_read64(matchL3) == MEM_read64(ip+1)) {
mLength = ZSTD_count(ip+9, matchL3+8, iend) + 8;
ip++;
offset = (U32)(ip-matchL3);
- while (((ip>anchor) & (matchL3>lowest)) && (ip[-1] == matchL3[-1])) { ip--; matchL3--; mLength++; } /* catch up */
- } else {
- mLength = ZSTD_count(ip+4, match+4, iend) + 4;
- offset = (U32)(ip-match);
- while (((ip>anchor) & (match>lowest)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */
+ while (((ip>anchor) & (matchL3>prefixLowest)) && (ip[-1] == matchL3[-1])) { ip--; matchL3--; mLength++; } /* catch up */
+ goto _match_found;
+ }
+ } else if (dictMode == ZSTD_dictMatchState) {
+ /* check dict long +1 match */
+ U32 const dictMatchIndexL3 = dictHashLong[dictHLNext];
+ const BYTE* dictMatchL3 = dictBase + dictMatchIndexL3;
+ assert(dictMatchL3 < dictEnd);
+ if (dictMatchL3 > dictStart && MEM_read64(dictMatchL3) == MEM_read64(ip+1)) {
+ mLength = ZSTD_count_2segments(ip+1+8, dictMatchL3+8, iend, dictEnd, prefixLowest) + 8;
+ ip++;
+ offset = (U32)(current + 1 - dictMatchIndexL3 - dictIndexDelta);
+ while (((ip>anchor) & (dictMatchL3>dictStart)) && (ip[-1] == dictMatchL3[-1])) { ip--; dictMatchL3--; mLength++; } /* catch up */
+ goto _match_found;
}
- } else {
- ip += ((ip-anchor) >> kSearchStrength) + 1;
- continue;
}
+ }
- offset_2 = offset_1;
- offset_1 = offset;
-
- ZSTD_storeSeq(seqStore, ip-anchor, anchor, offset + ZSTD_REP_MOVE, mLength-MINMATCH);
+ /* if no long +1 match, explore the short match we found */
+ if (dictMode == ZSTD_dictMatchState && matchIndexS < prefixLowestIndex) {
+ mLength = ZSTD_count_2segments(ip+4, match+4, iend, dictEnd, prefixLowest) + 4;
+ offset = (U32)(current - matchIndexS);
+ while (((ip>anchor) & (match>dictStart)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */
+ } else {
+ mLength = ZSTD_count(ip+4, match+4, iend) + 4;
+ offset = (U32)(ip - match);
+ while (((ip>anchor) & (match>prefixLowest)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */
}
+ /* fall-through */
+
+_match_found:
+ offset_2 = offset_1;
+ offset_1 = offset;
+
+ ZSTD_storeSeq(seqStore, ip-anchor, anchor, offset + ZSTD_REP_MOVE, mLength-MINMATCH);
+
+_match_stored:
/* match found */
ip += mLength;
anchor = ip;
@@ -135,19 +257,44 @@ size_t ZSTD_compressBlock_doubleFast_generic(
hashSmall[ZSTD_hashPtr(ip-2, hBitsS, mls)] = (U32)(ip-2-base);
/* check immediate repcode */
- while ( (ip <= ilimit)
- && ( (offset_2>0)
- & (MEM_read32(ip) == MEM_read32(ip - offset_2)) )) {
- /* store sequence */
- size_t const rLength = ZSTD_count(ip+4, ip+4-offset_2, iend) + 4;
- { U32 const tmpOff = offset_2; offset_2 = offset_1; offset_1 = tmpOff; } /* swap offset_2 <=> offset_1 */
- hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = (U32)(ip-base);
- hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = (U32)(ip-base);
- ZSTD_storeSeq(seqStore, 0, anchor, 0, rLength-MINMATCH);
- ip += rLength;
- anchor = ip;
- continue; /* faster when present ... (?) */
- } } }
+ if (dictMode == ZSTD_dictMatchState) {
+ while (ip <= ilimit) {
+ U32 const current2 = (U32)(ip-base);
+ U32 const repIndex2 = current2 - offset_2;
+ const BYTE* repMatch2 = dictMode == ZSTD_dictMatchState
+ && repIndex2 < prefixLowestIndex ?
+ dictBase - dictIndexDelta + repIndex2 :
+ base + repIndex2;
+ if ( ((U32)((prefixLowestIndex-1) - (U32)repIndex2) >= 3 /* intentional overflow */)
+ && (MEM_read32(repMatch2) == MEM_read32(ip)) ) {
+ const BYTE* const repEnd2 = repIndex2 < prefixLowestIndex ? dictEnd : iend;
+ size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, prefixLowest) + 4;
+ U32 tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; /* swap offset_2 <=> offset_1 */
+ ZSTD_storeSeq(seqStore, 0, anchor, 0, repLength2-MINMATCH);
+ hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = current2;
+ hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = current2;
+ ip += repLength2;
+ anchor = ip;
+ continue;
+ }
+ break;
+ }
+ }
+
+ if (dictMode == ZSTD_noDict) {
+ while ( (ip <= ilimit)
+ && ( (offset_2>0)
+ & (MEM_read32(ip) == MEM_read32(ip - offset_2)) )) {
+ /* store sequence */
+ size_t const rLength = ZSTD_count(ip+4, ip+4-offset_2, iend) + 4;
+ U32 const tmpOff = offset_2; offset_2 = offset_1; offset_1 = tmpOff; /* swap offset_2 <=> offset_1 */
+ hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = (U32)(ip-base);
+ hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = (U32)(ip-base);
+ ZSTD_storeSeq(seqStore, 0, anchor, 0, rLength-MINMATCH);
+ ip += rLength;
+ anchor = ip;
+ continue; /* faster when present ... (?) */
+ } } } }
/* save reps for next block */
rep[0] = offset_1 ? offset_1 : offsetSaved;
@@ -160,102 +307,126 @@ size_t ZSTD_compressBlock_doubleFast_generic(
size_t ZSTD_compressBlock_doubleFast(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize)
+ void const* src, size_t srcSize)
+{
+ const U32 mls = ms->cParams.minMatch;
+ switch(mls)
+ {
+ default: /* includes case 3 */
+ case 4 :
+ return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 4, ZSTD_noDict);
+ case 5 :
+ return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 5, ZSTD_noDict);
+ case 6 :
+ return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 6, ZSTD_noDict);
+ case 7 :
+ return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 7, ZSTD_noDict);
+ }
+}
+
+
+size_t ZSTD_compressBlock_doubleFast_dictMatchState(
+ ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
+ void const* src, size_t srcSize)
{
- const U32 mls = cParams->searchLength;
+ const U32 mls = ms->cParams.minMatch;
switch(mls)
{
default: /* includes case 3 */
case 4 :
- return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, cParams, src, srcSize, 4);
+ return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 4, ZSTD_dictMatchState);
case 5 :
- return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, cParams, src, srcSize, 5);
+ return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 5, ZSTD_dictMatchState);
case 6 :
- return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, cParams, src, srcSize, 6);
+ return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 6, ZSTD_dictMatchState);
case 7 :
- return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, cParams, src, srcSize, 7);
+ return ZSTD_compressBlock_doubleFast_generic(ms, seqStore, rep, src, srcSize, 7, ZSTD_dictMatchState);
}
}
static size_t ZSTD_compressBlock_doubleFast_extDict_generic(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize,
+ void const* src, size_t srcSize,
U32 const mls /* template */)
{
+ ZSTD_compressionParameters const* cParams = &ms->cParams;
U32* const hashLong = ms->hashTable;
U32 const hBitsL = cParams->hashLog;
U32* const hashSmall = ms->chainTable;
U32 const hBitsS = cParams->chainLog;
- const BYTE* const base = ms->window.base;
- const BYTE* const dictBase = ms->window.dictBase;
const BYTE* const istart = (const BYTE*)src;
const BYTE* ip = istart;
const BYTE* anchor = istart;
- const U32 lowestIndex = ms->window.lowLimit;
- const BYTE* const dictStart = dictBase + lowestIndex;
- const U32 dictLimit = ms->window.dictLimit;
- const BYTE* const lowPrefixPtr = base + dictLimit;
- const BYTE* const dictEnd = dictBase + dictLimit;
const BYTE* const iend = istart + srcSize;
const BYTE* const ilimit = iend - 8;
+ const U32 prefixStartIndex = ms->window.dictLimit;
+ const BYTE* const base = ms->window.base;
+ const BYTE* const prefixStart = base + prefixStartIndex;
+ const U32 dictStartIndex = ms->window.lowLimit;
+ const BYTE* const dictBase = ms->window.dictBase;
+ const BYTE* const dictStart = dictBase + dictStartIndex;
+ const BYTE* const dictEnd = dictBase + prefixStartIndex;
U32 offset_1=rep[0], offset_2=rep[1];
+ DEBUGLOG(5, "ZSTD_compressBlock_doubleFast_extDict_generic (srcSize=%zu)", srcSize);
+
/* Search Loop */
while (ip < ilimit) { /* < instead of <=, because (ip+1) */
const size_t hSmall = ZSTD_hashPtr(ip, hBitsS, mls);
const U32 matchIndex = hashSmall[hSmall];
- const BYTE* matchBase = matchIndex < dictLimit ? dictBase : base;
+ const BYTE* const matchBase = matchIndex < prefixStartIndex ? dictBase : base;
const BYTE* match = matchBase + matchIndex;
const size_t hLong = ZSTD_hashPtr(ip, hBitsL, 8);
const U32 matchLongIndex = hashLong[hLong];
- const BYTE* matchLongBase = matchLongIndex < dictLimit ? dictBase : base;
+ const BYTE* const matchLongBase = matchLongIndex < prefixStartIndex ? dictBase : base;
const BYTE* matchLong = matchLongBase + matchLongIndex;
const U32 current = (U32)(ip-base);
const U32 repIndex = current + 1 - offset_1; /* offset_1 expected <= current +1 */
- const BYTE* repBase = repIndex < dictLimit ? dictBase : base;
- const BYTE* repMatch = repBase + repIndex;
+ const BYTE* const repBase = repIndex < prefixStartIndex ? dictBase : base;
+ const BYTE* const repMatch = repBase + repIndex;
size_t mLength;
hashSmall[hSmall] = hashLong[hLong] = current; /* update hash table */
- if ( (((U32)((dictLimit-1) - repIndex) >= 3) /* intentional underflow */ & (repIndex > lowestIndex))
- && (MEM_read32(repMatch) == MEM_read32(ip+1)) ) {
- const BYTE* repMatchEnd = repIndex < dictLimit ? dictEnd : iend;
- mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, lowPrefixPtr) + 4;
+ if ((((U32)((prefixStartIndex-1) - repIndex) >= 3) /* intentional underflow : ensure repIndex doesn't overlap dict + prefix */
+ & (repIndex > dictStartIndex))
+ && (MEM_read32(repMatch) == MEM_read32(ip+1)) ) {
+ const BYTE* repMatchEnd = repIndex < prefixStartIndex ? dictEnd : iend;
+ mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixStart) + 4;
ip++;
ZSTD_storeSeq(seqStore, ip-anchor, anchor, 0, mLength-MINMATCH);
} else {
- if ((matchLongIndex > lowestIndex) && (MEM_read64(matchLong) == MEM_read64(ip))) {
- const BYTE* matchEnd = matchLongIndex < dictLimit ? dictEnd : iend;
- const BYTE* lowMatchPtr = matchLongIndex < dictLimit ? dictStart : lowPrefixPtr;
+ if ((matchLongIndex > dictStartIndex) && (MEM_read64(matchLong) == MEM_read64(ip))) {
+ const BYTE* const matchEnd = matchLongIndex < prefixStartIndex ? dictEnd : iend;
+ const BYTE* const lowMatchPtr = matchLongIndex < prefixStartIndex ? dictStart : prefixStart;
U32 offset;
- mLength = ZSTD_count_2segments(ip+8, matchLong+8, iend, matchEnd, lowPrefixPtr) + 8;
+ mLength = ZSTD_count_2segments(ip+8, matchLong+8, iend, matchEnd, prefixStart) + 8;
offset = current - matchLongIndex;
while (((ip>anchor) & (matchLong>lowMatchPtr)) && (ip[-1] == matchLong[-1])) { ip--; matchLong--; mLength++; } /* catch up */
offset_2 = offset_1;
offset_1 = offset;
ZSTD_storeSeq(seqStore, ip-anchor, anchor, offset + ZSTD_REP_MOVE, mLength-MINMATCH);
- } else if ((matchIndex > lowestIndex) && (MEM_read32(match) == MEM_read32(ip))) {
+ } else if ((matchIndex > dictStartIndex) && (MEM_read32(match) == MEM_read32(ip))) {
size_t const h3 = ZSTD_hashPtr(ip+1, hBitsL, 8);
U32 const matchIndex3 = hashLong[h3];
- const BYTE* const match3Base = matchIndex3 < dictLimit ? dictBase : base;
+ const BYTE* const match3Base = matchIndex3 < prefixStartIndex ? dictBase : base;
const BYTE* match3 = match3Base + matchIndex3;
U32 offset;
hashLong[h3] = current + 1;
- if ( (matchIndex3 > lowestIndex) && (MEM_read64(match3) == MEM_read64(ip+1)) ) {
- const BYTE* matchEnd = matchIndex3 < dictLimit ? dictEnd : iend;
- const BYTE* lowMatchPtr = matchIndex3 < dictLimit ? dictStart : lowPrefixPtr;
- mLength = ZSTD_count_2segments(ip+9, match3+8, iend, matchEnd, lowPrefixPtr) + 8;
+ if ( (matchIndex3 > dictStartIndex) && (MEM_read64(match3) == MEM_read64(ip+1)) ) {
+ const BYTE* const matchEnd = matchIndex3 < prefixStartIndex ? dictEnd : iend;
+ const BYTE* const lowMatchPtr = matchIndex3 < prefixStartIndex ? dictStart : prefixStart;
+ mLength = ZSTD_count_2segments(ip+9, match3+8, iend, matchEnd, prefixStart) + 8;
ip++;
offset = current+1 - matchIndex3;
while (((ip>anchor) & (match3>lowMatchPtr)) && (ip[-1] == match3[-1])) { ip--; match3--; mLength++; } /* catch up */
} else {
- const BYTE* matchEnd = matchIndex < dictLimit ? dictEnd : iend;
- const BYTE* lowMatchPtr = matchIndex < dictLimit ? dictStart : lowPrefixPtr;
- mLength = ZSTD_count_2segments(ip+4, match+4, iend, matchEnd, lowPrefixPtr) + 4;
+ const BYTE* const matchEnd = matchIndex < prefixStartIndex ? dictEnd : iend;
+ const BYTE* const lowMatchPtr = matchIndex < prefixStartIndex ? dictStart : prefixStart;
+ mLength = ZSTD_count_2segments(ip+4, match+4, iend, matchEnd, prefixStart) + 4;
offset = current - matchIndex;
while (((ip>anchor) & (match>lowMatchPtr)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */
}
@@ -282,12 +453,13 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic(
while (ip <= ilimit) {
U32 const current2 = (U32)(ip-base);
U32 const repIndex2 = current2 - offset_2;
- const BYTE* repMatch2 = repIndex2 < dictLimit ? dictBase + repIndex2 : base + repIndex2;
- if ( (((U32)((dictLimit-1) - repIndex2) >= 3) & (repIndex2 > lowestIndex)) /* intentional overflow */
- && (MEM_read32(repMatch2) == MEM_read32(ip)) ) {
- const BYTE* const repEnd2 = repIndex2 < dictLimit ? dictEnd : iend;
- size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, lowPrefixPtr) + 4;
- U32 tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; /* swap offset_2 <=> offset_1 */
+ const BYTE* repMatch2 = repIndex2 < prefixStartIndex ? dictBase + repIndex2 : base + repIndex2;
+ if ( (((U32)((prefixStartIndex-1) - repIndex2) >= 3) /* intentional overflow : ensure repIndex2 doesn't overlap dict + prefix */
+ & (repIndex2 > dictStartIndex))
+ && (MEM_read32(repMatch2) == MEM_read32(ip)) ) {
+ const BYTE* const repEnd2 = repIndex2 < prefixStartIndex ? dictEnd : iend;
+ size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, prefixStart) + 4;
+ U32 const tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; /* swap offset_2 <=> offset_1 */
ZSTD_storeSeq(seqStore, 0, anchor, 0, repLength2-MINMATCH);
hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = current2;
hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = current2;
@@ -309,19 +481,19 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic(
size_t ZSTD_compressBlock_doubleFast_extDict(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize)
+ void const* src, size_t srcSize)
{
- U32 const mls = cParams->searchLength;
+ U32 const mls = ms->cParams.minMatch;
switch(mls)
{
default: /* includes case 3 */
case 4 :
- return ZSTD_compressBlock_doubleFast_extDict_generic(ms, seqStore, rep, cParams, src, srcSize, 4);
+ return ZSTD_compressBlock_doubleFast_extDict_generic(ms, seqStore, rep, src, srcSize, 4);
case 5 :
- return ZSTD_compressBlock_doubleFast_extDict_generic(ms, seqStore, rep, cParams, src, srcSize, 5);
+ return ZSTD_compressBlock_doubleFast_extDict_generic(ms, seqStore, rep, src, srcSize, 5);
case 6 :
- return ZSTD_compressBlock_doubleFast_extDict_generic(ms, seqStore, rep, cParams, src, srcSize, 6);
+ return ZSTD_compressBlock_doubleFast_extDict_generic(ms, seqStore, rep, src, srcSize, 6);
case 7 :
- return ZSTD_compressBlock_doubleFast_extDict_generic(ms, seqStore, rep, cParams, src, srcSize, 7);
+ return ZSTD_compressBlock_doubleFast_extDict_generic(ms, seqStore, rep, src, srcSize, 7);
}
}
diff --git a/thirdparty/zstd/compress/zstd_double_fast.h b/thirdparty/zstd/compress/zstd_double_fast.h
index 6d80b2774c..4fa31acfc0 100644
--- a/thirdparty/zstd/compress/zstd_double_fast.h
+++ b/thirdparty/zstd/compress/zstd_double_fast.h
@@ -19,14 +19,16 @@ extern "C" {
#include "zstd_compress_internal.h" /* ZSTD_CCtx, size_t */
void ZSTD_fillDoubleHashTable(ZSTD_matchState_t* ms,
- ZSTD_compressionParameters const* cParams,
- void const* end);
+ void const* end, ZSTD_dictTableLoadMethod_e dtlm);
size_t ZSTD_compressBlock_doubleFast(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize);
+ void const* src, size_t srcSize);
+size_t ZSTD_compressBlock_doubleFast_dictMatchState(
+ ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
+ void const* src, size_t srcSize);
size_t ZSTD_compressBlock_doubleFast_extDict(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize);
+ void const* src, size_t srcSize);
#if defined (__cplusplus)
diff --git a/thirdparty/zstd/compress/zstd_fast.c b/thirdparty/zstd/compress/zstd_fast.c
index df4d28b340..40ba0f73e6 100644
--- a/thirdparty/zstd/compress/zstd_fast.c
+++ b/thirdparty/zstd/compress/zstd_fast.c
@@ -13,12 +13,12 @@
void ZSTD_fillHashTable(ZSTD_matchState_t* ms,
- ZSTD_compressionParameters const* cParams,
- void const* end)
+ void const* end, ZSTD_dictTableLoadMethod_e dtlm)
{
+ const ZSTD_compressionParameters* const cParams = &ms->cParams;
U32* const hashTable = ms->hashTable;
U32 const hBits = cParams->hashLog;
- U32 const mls = cParams->searchLength;
+ U32 const mls = cParams->minMatch;
const BYTE* const base = ms->window.base;
const BYTE* ip = base + ms->nextToUpdate;
const BYTE* const iend = ((const BYTE*)end) - HASH_READ_SIZE;
@@ -27,41 +27,83 @@ void ZSTD_fillHashTable(ZSTD_matchState_t* ms,
/* Always insert every fastHashFillStep position into the hash table.
* Insert the other positions if their hash entry is empty.
*/
- for (; ip + fastHashFillStep - 1 <= iend; ip += fastHashFillStep) {
+ for ( ; ip + fastHashFillStep < iend + 2; ip += fastHashFillStep) {
U32 const current = (U32)(ip - base);
- U32 i;
- for (i = 0; i < fastHashFillStep; ++i) {
- size_t const hash = ZSTD_hashPtr(ip + i, hBits, mls);
- if (i == 0 || hashTable[hash] == 0)
- hashTable[hash] = current + i;
- }
- }
+ size_t const hash0 = ZSTD_hashPtr(ip, hBits, mls);
+ hashTable[hash0] = current;
+ if (dtlm == ZSTD_dtlm_fast) continue;
+ /* Only load extra positions for ZSTD_dtlm_full */
+ { U32 p;
+ for (p = 1; p < fastHashFillStep; ++p) {
+ size_t const hash = ZSTD_hashPtr(ip + p, hBits, mls);
+ if (hashTable[hash] == 0) { /* not yet filled */
+ hashTable[hash] = current + p;
+ } } } }
}
FORCE_INLINE_TEMPLATE
size_t ZSTD_compressBlock_fast_generic(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
void const* src, size_t srcSize,
- U32 const hlog, U32 const stepSize, U32 const mls)
+ U32 const mls, ZSTD_dictMode_e const dictMode)
{
+ const ZSTD_compressionParameters* const cParams = &ms->cParams;
U32* const hashTable = ms->hashTable;
+ U32 const hlog = cParams->hashLog;
+ /* support stepSize of 0 */
+ U32 const stepSize = cParams->targetLength + !(cParams->targetLength);
const BYTE* const base = ms->window.base;
const BYTE* const istart = (const BYTE*)src;
const BYTE* ip = istart;
const BYTE* anchor = istart;
- const U32 lowestIndex = ms->window.dictLimit;
- const BYTE* const lowest = base + lowestIndex;
+ const U32 prefixStartIndex = ms->window.dictLimit;
+ const BYTE* const prefixStart = base + prefixStartIndex;
const BYTE* const iend = istart + srcSize;
const BYTE* const ilimit = iend - HASH_READ_SIZE;
U32 offset_1=rep[0], offset_2=rep[1];
U32 offsetSaved = 0;
+ const ZSTD_matchState_t* const dms = ms->dictMatchState;
+ const ZSTD_compressionParameters* const dictCParams =
+ dictMode == ZSTD_dictMatchState ?
+ &dms->cParams : NULL;
+ const U32* const dictHashTable = dictMode == ZSTD_dictMatchState ?
+ dms->hashTable : NULL;
+ const U32 dictStartIndex = dictMode == ZSTD_dictMatchState ?
+ dms->window.dictLimit : 0;
+ const BYTE* const dictBase = dictMode == ZSTD_dictMatchState ?
+ dms->window.base : NULL;
+ const BYTE* const dictStart = dictMode == ZSTD_dictMatchState ?
+ dictBase + dictStartIndex : NULL;
+ const BYTE* const dictEnd = dictMode == ZSTD_dictMatchState ?
+ dms->window.nextSrc : NULL;
+ const U32 dictIndexDelta = dictMode == ZSTD_dictMatchState ?
+ prefixStartIndex - (U32)(dictEnd - dictBase) :
+ 0;
+ const U32 dictAndPrefixLength = (U32)(ip - prefixStart + dictEnd - dictStart);
+ const U32 dictHLog = dictMode == ZSTD_dictMatchState ?
+ dictCParams->hashLog : hlog;
+
+ assert(dictMode == ZSTD_noDict || dictMode == ZSTD_dictMatchState);
+
+ /* otherwise, we would get index underflow when translating a dict index
+ * into a local index */
+ assert(dictMode != ZSTD_dictMatchState
+ || prefixStartIndex >= (U32)(dictEnd - dictBase));
+
/* init */
- ip += (ip==lowest);
- { U32 const maxRep = (U32)(ip-lowest);
+ ip += (dictAndPrefixLength == 0);
+ if (dictMode == ZSTD_noDict) {
+ U32 const maxRep = (U32)(ip - prefixStart);
if (offset_2 > maxRep) offsetSaved = offset_2, offset_2 = 0;
if (offset_1 > maxRep) offsetSaved = offset_1, offset_1 = 0;
}
+ if (dictMode == ZSTD_dictMatchState) {
+ /* dictMatchState repCode checks don't currently handle repCode == 0
+ * disabling. */
+ assert(offset_1 <= dictAndPrefixLength);
+ assert(offset_2 <= dictAndPrefixLength);
+ }
/* Main Search Loop */
while (ip < ilimit) { /* < instead of <=, because repcode check at (ip+1) */
@@ -70,26 +112,67 @@ size_t ZSTD_compressBlock_fast_generic(
U32 const current = (U32)(ip-base);
U32 const matchIndex = hashTable[h];
const BYTE* match = base + matchIndex;
+ const U32 repIndex = current + 1 - offset_1;
+ const BYTE* repMatch = (dictMode == ZSTD_dictMatchState
+ && repIndex < prefixStartIndex) ?
+ dictBase + (repIndex - dictIndexDelta) :
+ base + repIndex;
hashTable[h] = current; /* update hash table */
- if ((offset_1 > 0) & (MEM_read32(ip+1-offset_1) == MEM_read32(ip+1))) {
+ if ( (dictMode == ZSTD_dictMatchState)
+ && ((U32)((prefixStartIndex-1) - repIndex) >= 3) /* intentional underflow : ensure repIndex isn't overlapping dict + prefix */
+ && (MEM_read32(repMatch) == MEM_read32(ip+1)) ) {
+ const BYTE* const repMatchEnd = repIndex < prefixStartIndex ? dictEnd : iend;
+ mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixStart) + 4;
+ ip++;
+ ZSTD_storeSeq(seqStore, ip-anchor, anchor, 0, mLength-MINMATCH);
+ } else if ( dictMode == ZSTD_noDict
+ && ((offset_1 > 0) & (MEM_read32(ip+1-offset_1) == MEM_read32(ip+1)))) {
mLength = ZSTD_count(ip+1+4, ip+1+4-offset_1, iend) + 4;
ip++;
ZSTD_storeSeq(seqStore, ip-anchor, anchor, 0, mLength-MINMATCH);
- } else {
- if ( (matchIndex <= lowestIndex)
- || (MEM_read32(match) != MEM_read32(ip)) ) {
+ } else if ( (matchIndex <= prefixStartIndex) ) {
+ if (dictMode == ZSTD_dictMatchState) {
+ size_t const dictHash = ZSTD_hashPtr(ip, dictHLog, mls);
+ U32 const dictMatchIndex = dictHashTable[dictHash];
+ const BYTE* dictMatch = dictBase + dictMatchIndex;
+ if (dictMatchIndex <= dictStartIndex ||
+ MEM_read32(dictMatch) != MEM_read32(ip)) {
+ assert(stepSize >= 1);
+ ip += ((ip-anchor) >> kSearchStrength) + stepSize;
+ continue;
+ } else {
+ /* found a dict match */
+ U32 const offset = (U32)(current-dictMatchIndex-dictIndexDelta);
+ mLength = ZSTD_count_2segments(ip+4, dictMatch+4, iend, dictEnd, prefixStart) + 4;
+ while (((ip>anchor) & (dictMatch>dictStart))
+ && (ip[-1] == dictMatch[-1])) {
+ ip--; dictMatch--; mLength++;
+ } /* catch up */
+ offset_2 = offset_1;
+ offset_1 = offset;
+ ZSTD_storeSeq(seqStore, ip-anchor, anchor, offset + ZSTD_REP_MOVE, mLength-MINMATCH);
+ }
+ } else {
assert(stepSize >= 1);
ip += ((ip-anchor) >> kSearchStrength) + stepSize;
continue;
}
+ } else if (MEM_read32(match) != MEM_read32(ip)) {
+ /* it's not a match, and we're not going to check the dictionary */
+ assert(stepSize >= 1);
+ ip += ((ip-anchor) >> kSearchStrength) + stepSize;
+ continue;
+ } else {
+ /* found a regular match */
+ U32 const offset = (U32)(ip-match);
mLength = ZSTD_count(ip+4, match+4, iend) + 4;
- { U32 const offset = (U32)(ip-match);
- while (((ip>anchor) & (match>lowest)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */
- offset_2 = offset_1;
- offset_1 = offset;
- ZSTD_storeSeq(seqStore, ip-anchor, anchor, offset + ZSTD_REP_MOVE, mLength-MINMATCH);
- } }
+ while (((ip>anchor) & (match>prefixStart))
+ && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */
+ offset_2 = offset_1;
+ offset_1 = offset;
+ ZSTD_storeSeq(seqStore, ip-anchor, anchor, offset + ZSTD_REP_MOVE, mLength-MINMATCH);
+ }
/* match found */
ip += mLength;
@@ -97,21 +180,46 @@ size_t ZSTD_compressBlock_fast_generic(
if (ip <= ilimit) {
/* Fill Table */
+ assert(base+current+2 > istart); /* check base overflow */
hashTable[ZSTD_hashPtr(base+current+2, hlog, mls)] = current+2; /* here because current+2 could be > iend-8 */
hashTable[ZSTD_hashPtr(ip-2, hlog, mls)] = (U32)(ip-2-base);
+
/* check immediate repcode */
- while ( (ip <= ilimit)
- && ( (offset_2>0)
- & (MEM_read32(ip) == MEM_read32(ip - offset_2)) )) {
- /* store sequence */
- size_t const rLength = ZSTD_count(ip+4, ip+4-offset_2, iend) + 4;
- { U32 const tmpOff = offset_2; offset_2 = offset_1; offset_1 = tmpOff; } /* swap offset_2 <=> offset_1 */
- hashTable[ZSTD_hashPtr(ip, hlog, mls)] = (U32)(ip-base);
- ZSTD_storeSeq(seqStore, 0, anchor, 0, rLength-MINMATCH);
- ip += rLength;
- anchor = ip;
- continue; /* faster when present ... (?) */
- } } }
+ if (dictMode == ZSTD_dictMatchState) {
+ while (ip <= ilimit) {
+ U32 const current2 = (U32)(ip-base);
+ U32 const repIndex2 = current2 - offset_2;
+ const BYTE* repMatch2 = repIndex2 < prefixStartIndex ?
+ dictBase - dictIndexDelta + repIndex2 :
+ base + repIndex2;
+ if ( ((U32)((prefixStartIndex-1) - (U32)repIndex2) >= 3 /* intentional overflow */)
+ && (MEM_read32(repMatch2) == MEM_read32(ip)) ) {
+ const BYTE* const repEnd2 = repIndex2 < prefixStartIndex ? dictEnd : iend;
+ size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, prefixStart) + 4;
+ U32 tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; /* swap offset_2 <=> offset_1 */
+ ZSTD_storeSeq(seqStore, 0, anchor, 0, repLength2-MINMATCH);
+ hashTable[ZSTD_hashPtr(ip, hlog, mls)] = current2;
+ ip += repLength2;
+ anchor = ip;
+ continue;
+ }
+ break;
+ }
+ }
+
+ if (dictMode == ZSTD_noDict) {
+ while ( (ip <= ilimit)
+ && ( (offset_2>0)
+ & (MEM_read32(ip) == MEM_read32(ip - offset_2)) )) {
+ /* store sequence */
+ size_t const rLength = ZSTD_count(ip+4, ip+4-offset_2, iend) + 4;
+ U32 const tmpOff = offset_2; offset_2 = offset_1; offset_1 = tmpOff; /* swap offset_2 <=> offset_1 */
+ hashTable[ZSTD_hashPtr(ip, hlog, mls)] = (U32)(ip-base);
+ ZSTD_storeSeq(seqStore, 0, anchor, 0, rLength-MINMATCH);
+ ip += rLength;
+ anchor = ip;
+ continue; /* faster when present ... (?) */
+ } } } }
/* save reps for next block */
rep[0] = offset_1 ? offset_1 : offsetSaved;
@@ -124,42 +232,66 @@ size_t ZSTD_compressBlock_fast_generic(
size_t ZSTD_compressBlock_fast(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize)
+ void const* src, size_t srcSize)
{
- U32 const hlog = cParams->hashLog;
- U32 const mls = cParams->searchLength;
- U32 const stepSize = cParams->targetLength;
+ ZSTD_compressionParameters const* cParams = &ms->cParams;
+ U32 const mls = cParams->minMatch;
+ assert(ms->dictMatchState == NULL);
+ switch(mls)
+ {
+ default: /* includes case 3 */
+ case 4 :
+ return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, 4, ZSTD_noDict);
+ case 5 :
+ return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, 5, ZSTD_noDict);
+ case 6 :
+ return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, 6, ZSTD_noDict);
+ case 7 :
+ return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, 7, ZSTD_noDict);
+ }
+}
+
+size_t ZSTD_compressBlock_fast_dictMatchState(
+ ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
+ void const* src, size_t srcSize)
+{
+ ZSTD_compressionParameters const* cParams = &ms->cParams;
+ U32 const mls = cParams->minMatch;
+ assert(ms->dictMatchState != NULL);
switch(mls)
{
default: /* includes case 3 */
case 4 :
- return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 4);
+ return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, 4, ZSTD_dictMatchState);
case 5 :
- return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 5);
+ return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, 5, ZSTD_dictMatchState);
case 6 :
- return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 6);
+ return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, 6, ZSTD_dictMatchState);
case 7 :
- return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 7);
+ return ZSTD_compressBlock_fast_generic(ms, seqStore, rep, src, srcSize, 7, ZSTD_dictMatchState);
}
}
static size_t ZSTD_compressBlock_fast_extDict_generic(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- void const* src, size_t srcSize,
- U32 const hlog, U32 const stepSize, U32 const mls)
+ void const* src, size_t srcSize, U32 const mls)
{
- U32* hashTable = ms->hashTable;
+ const ZSTD_compressionParameters* const cParams = &ms->cParams;
+ U32* const hashTable = ms->hashTable;
+ U32 const hlog = cParams->hashLog;
+ /* support stepSize of 0 */
+ U32 const stepSize = cParams->targetLength + !(cParams->targetLength);
const BYTE* const base = ms->window.base;
const BYTE* const dictBase = ms->window.dictBase;
const BYTE* const istart = (const BYTE*)src;
const BYTE* ip = istart;
const BYTE* anchor = istart;
- const U32 lowestIndex = ms->window.lowLimit;
- const BYTE* const dictStart = dictBase + lowestIndex;
- const U32 dictLimit = ms->window.dictLimit;
- const BYTE* const lowPrefixPtr = base + dictLimit;
- const BYTE* const dictEnd = dictBase + dictLimit;
+ const U32 dictStartIndex = ms->window.lowLimit;
+ const BYTE* const dictStart = dictBase + dictStartIndex;
+ const U32 prefixStartIndex = ms->window.dictLimit;
+ const BYTE* const prefixStart = base + prefixStartIndex;
+ const BYTE* const dictEnd = dictBase + prefixStartIndex;
const BYTE* const iend = istart + srcSize;
const BYTE* const ilimit = iend - 8;
U32 offset_1=rep[0], offset_2=rep[1];
@@ -167,33 +299,34 @@ static size_t ZSTD_compressBlock_fast_extDict_generic(
/* Search Loop */
while (ip < ilimit) { /* < instead of <=, because (ip+1) */
const size_t h = ZSTD_hashPtr(ip, hlog, mls);
- const U32 matchIndex = hashTable[h];
- const BYTE* matchBase = matchIndex < dictLimit ? dictBase : base;
- const BYTE* match = matchBase + matchIndex;
- const U32 current = (U32)(ip-base);
- const U32 repIndex = current + 1 - offset_1; /* offset_1 expected <= current +1 */
- const BYTE* repBase = repIndex < dictLimit ? dictBase : base;
- const BYTE* repMatch = repBase + repIndex;
+ const U32 matchIndex = hashTable[h];
+ const BYTE* const matchBase = matchIndex < prefixStartIndex ? dictBase : base;
+ const BYTE* match = matchBase + matchIndex;
+ const U32 current = (U32)(ip-base);
+ const U32 repIndex = current + 1 - offset_1;
+ const BYTE* const repBase = repIndex < prefixStartIndex ? dictBase : base;
+ const BYTE* const repMatch = repBase + repIndex;
size_t mLength;
hashTable[h] = current; /* update hash table */
+ assert(offset_1 <= current +1); /* check repIndex */
- if ( (((U32)((dictLimit-1) - repIndex) >= 3) /* intentional underflow */ & (repIndex > lowestIndex))
+ if ( (((U32)((prefixStartIndex-1) - repIndex) >= 3) /* intentional underflow */ & (repIndex > dictStartIndex))
&& (MEM_read32(repMatch) == MEM_read32(ip+1)) ) {
- const BYTE* repMatchEnd = repIndex < dictLimit ? dictEnd : iend;
- mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, lowPrefixPtr) + 4;
+ const BYTE* repMatchEnd = repIndex < prefixStartIndex ? dictEnd : iend;
+ mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixStart) + 4;
ip++;
ZSTD_storeSeq(seqStore, ip-anchor, anchor, 0, mLength-MINMATCH);
} else {
- if ( (matchIndex < lowestIndex) ||
+ if ( (matchIndex < dictStartIndex) ||
(MEM_read32(match) != MEM_read32(ip)) ) {
assert(stepSize >= 1);
ip += ((ip-anchor) >> kSearchStrength) + stepSize;
continue;
}
- { const BYTE* matchEnd = matchIndex < dictLimit ? dictEnd : iend;
- const BYTE* lowMatchPtr = matchIndex < dictLimit ? dictStart : lowPrefixPtr;
+ { const BYTE* matchEnd = matchIndex < prefixStartIndex ? dictEnd : iend;
+ const BYTE* lowMatchPtr = matchIndex < prefixStartIndex ? dictStart : prefixStart;
U32 offset;
- mLength = ZSTD_count_2segments(ip+4, match+4, iend, matchEnd, lowPrefixPtr) + 4;
+ mLength = ZSTD_count_2segments(ip+4, match+4, iend, matchEnd, prefixStart) + 4;
while (((ip>anchor) & (match>lowMatchPtr)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */
offset = current - matchIndex;
offset_2 = offset_1;
@@ -213,11 +346,11 @@ static size_t ZSTD_compressBlock_fast_extDict_generic(
while (ip <= ilimit) {
U32 const current2 = (U32)(ip-base);
U32 const repIndex2 = current2 - offset_2;
- const BYTE* repMatch2 = repIndex2 < dictLimit ? dictBase + repIndex2 : base + repIndex2;
- if ( (((U32)((dictLimit-1) - repIndex2) >= 3) & (repIndex2 > lowestIndex)) /* intentional overflow */
+ const BYTE* repMatch2 = repIndex2 < prefixStartIndex ? dictBase + repIndex2 : base + repIndex2;
+ if ( (((U32)((prefixStartIndex-1) - repIndex2) >= 3) & (repIndex2 > dictStartIndex)) /* intentional overflow */
&& (MEM_read32(repMatch2) == MEM_read32(ip)) ) {
- const BYTE* const repEnd2 = repIndex2 < dictLimit ? dictEnd : iend;
- size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, lowPrefixPtr) + 4;
+ const BYTE* const repEnd2 = repIndex2 < prefixStartIndex ? dictEnd : iend;
+ size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, prefixStart) + 4;
U32 tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; /* swap offset_2 <=> offset_1 */
ZSTD_storeSeq(seqStore, 0, anchor, 0, repLength2-MINMATCH);
hashTable[ZSTD_hashPtr(ip, hlog, mls)] = current2;
@@ -239,21 +372,20 @@ static size_t ZSTD_compressBlock_fast_extDict_generic(
size_t ZSTD_compressBlock_fast_extDict(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize)
+ void const* src, size_t srcSize)
{
- U32 const hlog = cParams->hashLog;
- U32 const mls = cParams->searchLength;
- U32 const stepSize = cParams->targetLength;
+ ZSTD_compressionParameters const* cParams = &ms->cParams;
+ U32 const mls = cParams->minMatch;
switch(mls)
{
default: /* includes case 3 */
case 4 :
- return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 4);
+ return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, 4);
case 5 :
- return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 5);
+ return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, 5);
case 6 :
- return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 6);
+ return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, 6);
case 7 :
- return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, hlog, stepSize, 7);
+ return ZSTD_compressBlock_fast_extDict_generic(ms, seqStore, rep, src, srcSize, 7);
}
}
diff --git a/thirdparty/zstd/compress/zstd_fast.h b/thirdparty/zstd/compress/zstd_fast.h
index f0438ad5b4..b74a88c57c 100644
--- a/thirdparty/zstd/compress/zstd_fast.h
+++ b/thirdparty/zstd/compress/zstd_fast.h
@@ -19,14 +19,16 @@ extern "C" {
#include "zstd_compress_internal.h"
void ZSTD_fillHashTable(ZSTD_matchState_t* ms,
- ZSTD_compressionParameters const* cParams,
- void const* end);
+ void const* end, ZSTD_dictTableLoadMethod_e dtlm);
size_t ZSTD_compressBlock_fast(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize);
+ void const* src, size_t srcSize);
+size_t ZSTD_compressBlock_fast_dictMatchState(
+ ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
+ void const* src, size_t srcSize);
size_t ZSTD_compressBlock_fast_extDict(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize);
+ void const* src, size_t srcSize);
#if defined (__cplusplus)
}
diff --git a/thirdparty/zstd/compress/zstd_lazy.c b/thirdparty/zstd/compress/zstd_lazy.c
index 9f158123f0..53f998a437 100644
--- a/thirdparty/zstd/compress/zstd_lazy.c
+++ b/thirdparty/zstd/compress/zstd_lazy.c
@@ -16,11 +16,12 @@
* Binary Tree search
***************************************/
-void ZSTD_updateDUBT(
- ZSTD_matchState_t* ms, ZSTD_compressionParameters const* cParams,
+static void
+ZSTD_updateDUBT(ZSTD_matchState_t* ms,
const BYTE* ip, const BYTE* iend,
U32 mls)
{
+ const ZSTD_compressionParameters* const cParams = &ms->cParams;
U32* const hashTable = ms->hashTable;
U32 const hashLog = cParams->hashLog;
@@ -59,14 +60,16 @@ void ZSTD_updateDUBT(
* sort one already inserted but unsorted position
* assumption : current >= btlow == (current - btmask)
* doesn't fail */
-static void ZSTD_insertDUBT1(
- ZSTD_matchState_t* ms, ZSTD_compressionParameters const* cParams,
+static void
+ZSTD_insertDUBT1(ZSTD_matchState_t* ms,
U32 current, const BYTE* inputEnd,
- U32 nbCompares, U32 btLow, int extDict)
+ U32 nbCompares, U32 btLow,
+ const ZSTD_dictMode_e dictMode)
{
- U32* const bt = ms->chainTable;
- U32 const btLog = cParams->chainLog - 1;
- U32 const btMask = (1 << btLog) - 1;
+ const ZSTD_compressionParameters* const cParams = &ms->cParams;
+ U32* const bt = ms->chainTable;
+ U32 const btLog = cParams->chainLog - 1;
+ U32 const btMask = (1 << btLog) - 1;
size_t commonLengthSmaller=0, commonLengthLarger=0;
const BYTE* const base = ms->window.base;
const BYTE* const dictBase = ms->window.dictBase;
@@ -78,7 +81,7 @@ static void ZSTD_insertDUBT1(
const BYTE* match;
U32* smallerPtr = bt + 2*(current&btMask);
U32* largerPtr = smallerPtr + 1;
- U32 matchIndex = *smallerPtr;
+ U32 matchIndex = *smallerPtr; /* this candidate is unsorted : next sorted candidate is reached through *smallerPtr, while *largerPtr contains previous unsorted candidate (which is already saved and can be overwritten) */
U32 dummy32; /* to be nullified at the end */
U32 const windowLow = ms->window.lowLimit;
@@ -91,11 +94,16 @@ static void ZSTD_insertDUBT1(
U32* const nextPtr = bt + 2*(matchIndex & btMask);
size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */
assert(matchIndex < current);
+ /* note : all candidates are now supposed sorted,
+ * but it's still possible to have nextPtr[1] == ZSTD_DUBT_UNSORTED_MARK
+ * when a real index has the same value as ZSTD_DUBT_UNSORTED_MARK */
- if ( (!extDict)
+ if ( (dictMode != ZSTD_extDict)
|| (matchIndex+matchLength >= dictLimit) /* both in current segment*/
|| (current < dictLimit) /* both in extDict */) {
- const BYTE* const mBase = !extDict || ((matchIndex+matchLength) >= dictLimit) ? base : dictBase;
+ const BYTE* const mBase = ( (dictMode != ZSTD_extDict)
+ || (matchIndex+matchLength >= dictLimit)) ?
+ base : dictBase;
assert( (matchIndex+matchLength >= dictLimit) /* might be wrong if extDict is incorrectly set to 0 */
|| (current < dictLimit) );
match = mBase + matchIndex;
@@ -104,7 +112,7 @@ static void ZSTD_insertDUBT1(
match = dictBase + matchIndex;
matchLength += ZSTD_count_2segments(ip+matchLength, match+matchLength, iend, dictEnd, prefixStart);
if (matchIndex+matchLength >= dictLimit)
- match = base + matchIndex; /* to prepare for next usage of match[matchLength] */
+ match = base + matchIndex; /* preparation for next read of match[matchLength] */
}
DEBUGLOG(8, "ZSTD_insertDUBT1: comparing %u with %u : found %u common bytes ",
@@ -138,13 +146,92 @@ static void ZSTD_insertDUBT1(
}
-static size_t ZSTD_DUBT_findBestMatch (
- ZSTD_matchState_t* ms, ZSTD_compressionParameters const* cParams,
- const BYTE* const ip, const BYTE* const iend,
- size_t* offsetPtr,
- U32 const mls,
- U32 const extDict)
+static size_t
+ZSTD_DUBT_findBetterDictMatch (
+ ZSTD_matchState_t* ms,
+ const BYTE* const ip, const BYTE* const iend,
+ size_t* offsetPtr,
+ size_t bestLength,
+ U32 nbCompares,
+ U32 const mls,
+ const ZSTD_dictMode_e dictMode)
+{
+ const ZSTD_matchState_t * const dms = ms->dictMatchState;
+ const ZSTD_compressionParameters* const dmsCParams = &dms->cParams;
+ const U32 * const dictHashTable = dms->hashTable;
+ U32 const hashLog = dmsCParams->hashLog;
+ size_t const h = ZSTD_hashPtr(ip, hashLog, mls);
+ U32 dictMatchIndex = dictHashTable[h];
+
+ const BYTE* const base = ms->window.base;
+ const BYTE* const prefixStart = base + ms->window.dictLimit;
+ U32 const current = (U32)(ip-base);
+ const BYTE* const dictBase = dms->window.base;
+ const BYTE* const dictEnd = dms->window.nextSrc;
+ U32 const dictHighLimit = (U32)(dms->window.nextSrc - dms->window.base);
+ U32 const dictLowLimit = dms->window.lowLimit;
+ U32 const dictIndexDelta = ms->window.lowLimit - dictHighLimit;
+
+ U32* const dictBt = dms->chainTable;
+ U32 const btLog = dmsCParams->chainLog - 1;
+ U32 const btMask = (1 << btLog) - 1;
+ U32 const btLow = (btMask >= dictHighLimit - dictLowLimit) ? dictLowLimit : dictHighLimit - btMask;
+
+ size_t commonLengthSmaller=0, commonLengthLarger=0;
+
+ (void)dictMode;
+ assert(dictMode == ZSTD_dictMatchState);
+
+ while (nbCompares-- && (dictMatchIndex > dictLowLimit)) {
+ U32* const nextPtr = dictBt + 2*(dictMatchIndex & btMask);
+ size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */
+ const BYTE* match = dictBase + dictMatchIndex;
+ matchLength += ZSTD_count_2segments(ip+matchLength, match+matchLength, iend, dictEnd, prefixStart);
+ if (dictMatchIndex+matchLength >= dictHighLimit)
+ match = base + dictMatchIndex + dictIndexDelta; /* to prepare for next usage of match[matchLength] */
+
+ if (matchLength > bestLength) {
+ U32 matchIndex = dictMatchIndex + dictIndexDelta;
+ if ( (4*(int)(matchLength-bestLength)) > (int)(ZSTD_highbit32(current-matchIndex+1) - ZSTD_highbit32((U32)offsetPtr[0]+1)) ) {
+ DEBUGLOG(9, "ZSTD_DUBT_findBetterDictMatch(%u) : found better match length %u -> %u and offsetCode %u -> %u (dictMatchIndex %u, matchIndex %u)",
+ current, (U32)bestLength, (U32)matchLength, (U32)*offsetPtr, ZSTD_REP_MOVE + current - matchIndex, dictMatchIndex, matchIndex);
+ bestLength = matchLength, *offsetPtr = ZSTD_REP_MOVE + current - matchIndex;
+ }
+ if (ip+matchLength == iend) { /* reached end of input : ip[matchLength] is not valid, no way to know if it's larger or smaller than match */
+ break; /* drop, to guarantee consistency (miss a little bit of compression) */
+ }
+ }
+
+ if (match[matchLength] < ip[matchLength]) {
+ if (dictMatchIndex <= btLow) { break; } /* beyond tree size, stop the search */
+ commonLengthSmaller = matchLength; /* all smaller will now have at least this guaranteed common length */
+ dictMatchIndex = nextPtr[1]; /* new matchIndex larger than previous (closer to current) */
+ } else {
+ /* match is larger than current */
+ if (dictMatchIndex <= btLow) { break; } /* beyond tree size, stop the search */
+ commonLengthLarger = matchLength;
+ dictMatchIndex = nextPtr[0];
+ }
+ }
+
+ if (bestLength >= MINMATCH) {
+ U32 const mIndex = current - ((U32)*offsetPtr - ZSTD_REP_MOVE); (void)mIndex;
+ DEBUGLOG(8, "ZSTD_DUBT_findBetterDictMatch(%u) : found match of length %u and offsetCode %u (pos %u)",
+ current, (U32)bestLength, (U32)*offsetPtr, mIndex);
+ }
+ return bestLength;
+
+}
+
+
+static size_t
+ZSTD_DUBT_findBestMatch(ZSTD_matchState_t* ms,
+ const BYTE* const ip, const BYTE* const iend,
+ size_t* offsetPtr,
+ U32 const mls,
+ const ZSTD_dictMode_e dictMode)
{
+ const ZSTD_compressionParameters* const cParams = &ms->cParams;
U32* const hashTable = ms->hashTable;
U32 const hashLog = cParams->hashLog;
size_t const h = ZSTD_hashPtr(ip, hashLog, mls);
@@ -175,7 +262,7 @@ static size_t ZSTD_DUBT_findBestMatch (
&& (nbCandidates > 1) ) {
DEBUGLOG(8, "ZSTD_DUBT_findBestMatch: candidate %u is unsorted",
matchIndex);
- *unsortedMark = previousCandidate;
+ *unsortedMark = previousCandidate; /* the unsortedMark becomes a reversed chain, to move up back to original position */
previousCandidate = matchIndex;
matchIndex = *nextCandidate;
nextCandidate = bt + 2*(matchIndex&btMask);
@@ -183,11 +270,13 @@ static size_t ZSTD_DUBT_findBestMatch (
nbCandidates --;
}
+ /* nullify last candidate if it's still unsorted
+ * simplification, detrimental to compression ratio, beneficial for speed */
if ( (matchIndex > unsortLimit)
&& (*unsortedMark==ZSTD_DUBT_UNSORTED_MARK) ) {
DEBUGLOG(7, "ZSTD_DUBT_findBestMatch: nullify last unsorted candidate %u",
matchIndex);
- *nextCandidate = *unsortedMark = 0; /* nullify next candidate if it's still unsorted (note : simplification, detrimental to compression ratio, beneficial for speed) */
+ *nextCandidate = *unsortedMark = 0;
}
/* batch sort stacked candidates */
@@ -195,21 +284,21 @@ static size_t ZSTD_DUBT_findBestMatch (
while (matchIndex) { /* will end on matchIndex == 0 */
U32* const nextCandidateIdxPtr = bt + 2*(matchIndex&btMask) + 1;
U32 const nextCandidateIdx = *nextCandidateIdxPtr;
- ZSTD_insertDUBT1(ms, cParams, matchIndex, iend,
- nbCandidates, unsortLimit, extDict);
+ ZSTD_insertDUBT1(ms, matchIndex, iend,
+ nbCandidates, unsortLimit, dictMode);
matchIndex = nextCandidateIdx;
nbCandidates++;
}
/* find longest match */
- { size_t commonLengthSmaller=0, commonLengthLarger=0;
+ { size_t commonLengthSmaller = 0, commonLengthLarger = 0;
const BYTE* const dictBase = ms->window.dictBase;
const U32 dictLimit = ms->window.dictLimit;
const BYTE* const dictEnd = dictBase + dictLimit;
const BYTE* const prefixStart = base + dictLimit;
U32* smallerPtr = bt + 2*(current&btMask);
U32* largerPtr = bt + 2*(current&btMask) + 1;
- U32 matchEndIdx = current+8+1;
+ U32 matchEndIdx = current + 8 + 1;
U32 dummy32; /* to be nullified at the end */
size_t bestLength = 0;
@@ -221,7 +310,7 @@ static size_t ZSTD_DUBT_findBestMatch (
size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */
const BYTE* match;
- if ((!extDict) || (matchIndex+matchLength >= dictLimit)) {
+ if ((dictMode != ZSTD_extDict) || (matchIndex+matchLength >= dictLimit)) {
match = base + matchIndex;
matchLength += ZSTD_count(ip+matchLength, match+matchLength, iend);
} else {
@@ -237,6 +326,11 @@ static size_t ZSTD_DUBT_findBestMatch (
if ( (4*(int)(matchLength-bestLength)) > (int)(ZSTD_highbit32(current-matchIndex+1) - ZSTD_highbit32((U32)offsetPtr[0]+1)) )
bestLength = matchLength, *offsetPtr = ZSTD_REP_MOVE + current - matchIndex;
if (ip+matchLength == iend) { /* equal : no way to know if inf or sup */
+ if (dictMode == ZSTD_dictMatchState) {
+ nbCompares = 0; /* in addition to avoiding checking any
+ * further in this loop, make sure we
+ * skip checking in the dictionary. */
+ }
break; /* drop, to guarantee consistency (miss a little bit of compression) */
}
}
@@ -259,6 +353,13 @@ static size_t ZSTD_DUBT_findBestMatch (
*smallerPtr = *largerPtr = 0;
+ if (dictMode == ZSTD_dictMatchState && nbCompares) {
+ bestLength = ZSTD_DUBT_findBetterDictMatch(
+ ms, ip, iend,
+ offsetPtr, bestLength, nbCompares,
+ mls, dictMode);
+ }
+
assert(matchEndIdx > current+8); /* ensure nextToUpdate is increased */
ms->nextToUpdate = matchEndIdx - 8; /* skip repetitive patterns */
if (bestLength >= MINMATCH) {
@@ -272,61 +373,64 @@ static size_t ZSTD_DUBT_findBestMatch (
/** ZSTD_BtFindBestMatch() : Tree updater, providing best match */
-static size_t ZSTD_BtFindBestMatch (
- ZSTD_matchState_t* ms, ZSTD_compressionParameters const* cParams,
- const BYTE* const ip, const BYTE* const iLimit,
- size_t* offsetPtr,
- const U32 mls /* template */)
+FORCE_INLINE_TEMPLATE size_t
+ZSTD_BtFindBestMatch( ZSTD_matchState_t* ms,
+ const BYTE* const ip, const BYTE* const iLimit,
+ size_t* offsetPtr,
+ const U32 mls /* template */,
+ const ZSTD_dictMode_e dictMode)
{
DEBUGLOG(7, "ZSTD_BtFindBestMatch");
if (ip < ms->window.base + ms->nextToUpdate) return 0; /* skipped area */
- ZSTD_updateDUBT(ms, cParams, ip, iLimit, mls);
- return ZSTD_DUBT_findBestMatch(ms, cParams, ip, iLimit, offsetPtr, mls, 0);
+ ZSTD_updateDUBT(ms, ip, iLimit, mls);
+ return ZSTD_DUBT_findBestMatch(ms, ip, iLimit, offsetPtr, mls, dictMode);
}
-static size_t ZSTD_BtFindBestMatch_selectMLS (
- ZSTD_matchState_t* ms, ZSTD_compressionParameters const* cParams,
- const BYTE* ip, const BYTE* const iLimit,
- size_t* offsetPtr)
+static size_t
+ZSTD_BtFindBestMatch_selectMLS ( ZSTD_matchState_t* ms,
+ const BYTE* ip, const BYTE* const iLimit,
+ size_t* offsetPtr)
{
- switch(cParams->searchLength)
+ switch(ms->cParams.minMatch)
{
default : /* includes case 3 */
- case 4 : return ZSTD_BtFindBestMatch(ms, cParams, ip, iLimit, offsetPtr, 4);
- case 5 : return ZSTD_BtFindBestMatch(ms, cParams, ip, iLimit, offsetPtr, 5);
+ case 4 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 4, ZSTD_noDict);
+ case 5 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 5, ZSTD_noDict);
case 7 :
- case 6 : return ZSTD_BtFindBestMatch(ms, cParams, ip, iLimit, offsetPtr, 6);
+ case 6 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 6, ZSTD_noDict);
}
}
-/** Tree updater, providing best match */
-static size_t ZSTD_BtFindBestMatch_extDict (
- ZSTD_matchState_t* ms, ZSTD_compressionParameters const* cParams,
- const BYTE* const ip, const BYTE* const iLimit,
- size_t* offsetPtr,
- const U32 mls)
+static size_t ZSTD_BtFindBestMatch_dictMatchState_selectMLS (
+ ZSTD_matchState_t* ms,
+ const BYTE* ip, const BYTE* const iLimit,
+ size_t* offsetPtr)
{
- DEBUGLOG(7, "ZSTD_BtFindBestMatch_extDict");
- if (ip < ms->window.base + ms->nextToUpdate) return 0; /* skipped area */
- ZSTD_updateDUBT(ms, cParams, ip, iLimit, mls);
- return ZSTD_DUBT_findBestMatch(ms, cParams, ip, iLimit, offsetPtr, mls, 1);
+ switch(ms->cParams.minMatch)
+ {
+ default : /* includes case 3 */
+ case 4 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 4, ZSTD_dictMatchState);
+ case 5 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 5, ZSTD_dictMatchState);
+ case 7 :
+ case 6 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 6, ZSTD_dictMatchState);
+ }
}
-static size_t ZSTD_BtFindBestMatch_selectMLS_extDict (
- ZSTD_matchState_t* ms, ZSTD_compressionParameters const* cParams,
+static size_t ZSTD_BtFindBestMatch_extDict_selectMLS (
+ ZSTD_matchState_t* ms,
const BYTE* ip, const BYTE* const iLimit,
size_t* offsetPtr)
{
- switch(cParams->searchLength)
+ switch(ms->cParams.minMatch)
{
default : /* includes case 3 */
- case 4 : return ZSTD_BtFindBestMatch_extDict(ms, cParams, ip, iLimit, offsetPtr, 4);
- case 5 : return ZSTD_BtFindBestMatch_extDict(ms, cParams, ip, iLimit, offsetPtr, 5);
+ case 4 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 4, ZSTD_extDict);
+ case 5 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 5, ZSTD_extDict);
case 7 :
- case 6 : return ZSTD_BtFindBestMatch_extDict(ms, cParams, ip, iLimit, offsetPtr, 6);
+ case 6 : return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, 6, ZSTD_extDict);
}
}
@@ -335,12 +439,13 @@ static size_t ZSTD_BtFindBestMatch_selectMLS_extDict (
/* *********************************
* Hash Chain
***********************************/
-#define NEXT_IN_CHAIN(d, mask) chainTable[(d) & mask]
+#define NEXT_IN_CHAIN(d, mask) chainTable[(d) & (mask)]
/* Update chains up to ip (excluded)
Assumption : always within prefix (i.e. not within extDict) */
static U32 ZSTD_insertAndFindFirstIndex_internal(
- ZSTD_matchState_t* ms, ZSTD_compressionParameters const* cParams,
+ ZSTD_matchState_t* ms,
+ const ZSTD_compressionParameters* const cParams,
const BYTE* ip, U32 const mls)
{
U32* const hashTable = ms->hashTable;
@@ -362,22 +467,21 @@ static U32 ZSTD_insertAndFindFirstIndex_internal(
return hashTable[ZSTD_hashPtr(ip, hashLog, mls)];
}
-U32 ZSTD_insertAndFindFirstIndex(
- ZSTD_matchState_t* ms, ZSTD_compressionParameters const* cParams,
- const BYTE* ip)
-{
- return ZSTD_insertAndFindFirstIndex_internal(ms, cParams, ip, cParams->searchLength);
+U32 ZSTD_insertAndFindFirstIndex(ZSTD_matchState_t* ms, const BYTE* ip) {
+ const ZSTD_compressionParameters* const cParams = &ms->cParams;
+ return ZSTD_insertAndFindFirstIndex_internal(ms, cParams, ip, ms->cParams.minMatch);
}
/* inlining is important to hardwire a hot branch (template emulation) */
FORCE_INLINE_TEMPLATE
size_t ZSTD_HcFindBestMatch_generic (
- ZSTD_matchState_t* ms, ZSTD_compressionParameters const* cParams,
+ ZSTD_matchState_t* ms,
const BYTE* const ip, const BYTE* const iLimit,
size_t* offsetPtr,
- const U32 mls, const U32 extDict)
+ const U32 mls, const ZSTD_dictMode_e dictMode)
{
+ const ZSTD_compressionParameters* const cParams = &ms->cParams;
U32* const chainTable = ms->chainTable;
const U32 chainSize = (1 << cParams->chainLog);
const U32 chainMask = chainSize-1;
@@ -397,8 +501,9 @@ size_t ZSTD_HcFindBestMatch_generic (
for ( ; (matchIndex>lowLimit) & (nbAttempts>0) ; nbAttempts--) {
size_t currentMl=0;
- if ((!extDict) || matchIndex >= dictLimit) {
+ if ((dictMode != ZSTD_extDict) || matchIndex >= dictLimit) {
const BYTE* const match = base + matchIndex;
+ assert(matchIndex >= dictLimit); /* ensures this is true if dictMode != ZSTD_extDict */
if (match[ml] == ip[ml]) /* potentially better */
currentMl = ZSTD_count(ip, match, iLimit);
} else {
@@ -419,38 +524,87 @@ size_t ZSTD_HcFindBestMatch_generic (
matchIndex = NEXT_IN_CHAIN(matchIndex, chainMask);
}
+ if (dictMode == ZSTD_dictMatchState) {
+ const ZSTD_matchState_t* const dms = ms->dictMatchState;
+ const U32* const dmsChainTable = dms->chainTable;
+ const U32 dmsChainSize = (1 << dms->cParams.chainLog);
+ const U32 dmsChainMask = dmsChainSize - 1;
+ const U32 dmsLowestIndex = dms->window.dictLimit;
+ const BYTE* const dmsBase = dms->window.base;
+ const BYTE* const dmsEnd = dms->window.nextSrc;
+ const U32 dmsSize = (U32)(dmsEnd - dmsBase);
+ const U32 dmsIndexDelta = dictLimit - dmsSize;
+ const U32 dmsMinChain = dmsSize > dmsChainSize ? dmsSize - dmsChainSize : 0;
+
+ matchIndex = dms->hashTable[ZSTD_hashPtr(ip, dms->cParams.hashLog, mls)];
+
+ for ( ; (matchIndex>dmsLowestIndex) & (nbAttempts>0) ; nbAttempts--) {
+ size_t currentMl=0;
+ const BYTE* const match = dmsBase + matchIndex;
+ assert(match+4 <= dmsEnd);
+ if (MEM_read32(match) == MEM_read32(ip)) /* assumption : matchIndex <= dictLimit-4 (by table construction) */
+ currentMl = ZSTD_count_2segments(ip+4, match+4, iLimit, dmsEnd, prefixStart) + 4;
+
+ /* save best solution */
+ if (currentMl > ml) {
+ ml = currentMl;
+ *offsetPtr = current - (matchIndex + dmsIndexDelta) + ZSTD_REP_MOVE;
+ if (ip+currentMl == iLimit) break; /* best possible, avoids read overflow on next attempt */
+ }
+
+ if (matchIndex <= dmsMinChain) break;
+ matchIndex = dmsChainTable[matchIndex & dmsChainMask];
+ }
+ }
+
return ml;
}
FORCE_INLINE_TEMPLATE size_t ZSTD_HcFindBestMatch_selectMLS (
- ZSTD_matchState_t* ms, ZSTD_compressionParameters const* cParams,
+ ZSTD_matchState_t* ms,
const BYTE* ip, const BYTE* const iLimit,
size_t* offsetPtr)
{
- switch(cParams->searchLength)
+ switch(ms->cParams.minMatch)
{
default : /* includes case 3 */
- case 4 : return ZSTD_HcFindBestMatch_generic(ms, cParams, ip, iLimit, offsetPtr, 4, 0);
- case 5 : return ZSTD_HcFindBestMatch_generic(ms, cParams, ip, iLimit, offsetPtr, 5, 0);
+ case 4 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 4, ZSTD_noDict);
+ case 5 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 5, ZSTD_noDict);
case 7 :
- case 6 : return ZSTD_HcFindBestMatch_generic(ms, cParams, ip, iLimit, offsetPtr, 6, 0);
+ case 6 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 6, ZSTD_noDict);
+ }
+}
+
+
+static size_t ZSTD_HcFindBestMatch_dictMatchState_selectMLS (
+ ZSTD_matchState_t* ms,
+ const BYTE* ip, const BYTE* const iLimit,
+ size_t* offsetPtr)
+{
+ switch(ms->cParams.minMatch)
+ {
+ default : /* includes case 3 */
+ case 4 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 4, ZSTD_dictMatchState);
+ case 5 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 5, ZSTD_dictMatchState);
+ case 7 :
+ case 6 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 6, ZSTD_dictMatchState);
}
}
FORCE_INLINE_TEMPLATE size_t ZSTD_HcFindBestMatch_extDict_selectMLS (
- ZSTD_matchState_t* ms, ZSTD_compressionParameters const* cParams,
+ ZSTD_matchState_t* ms,
const BYTE* ip, const BYTE* const iLimit,
- size_t* const offsetPtr)
+ size_t* offsetPtr)
{
- switch(cParams->searchLength)
+ switch(ms->cParams.minMatch)
{
default : /* includes case 3 */
- case 4 : return ZSTD_HcFindBestMatch_generic(ms, cParams, ip, iLimit, offsetPtr, 4, 1);
- case 5 : return ZSTD_HcFindBestMatch_generic(ms, cParams, ip, iLimit, offsetPtr, 5, 1);
+ case 4 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 4, ZSTD_extDict);
+ case 5 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 5, ZSTD_extDict);
case 7 :
- case 6 : return ZSTD_HcFindBestMatch_generic(ms, cParams, ip, iLimit, offsetPtr, 6, 1);
+ case 6 : return ZSTD_HcFindBestMatch_generic(ms, ip, iLimit, offsetPtr, 6, ZSTD_extDict);
}
}
@@ -462,30 +616,55 @@ FORCE_INLINE_TEMPLATE
size_t ZSTD_compressBlock_lazy_generic(
ZSTD_matchState_t* ms, seqStore_t* seqStore,
U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams,
const void* src, size_t srcSize,
- const U32 searchMethod, const U32 depth)
+ const U32 searchMethod, const U32 depth,
+ ZSTD_dictMode_e const dictMode)
{
const BYTE* const istart = (const BYTE*)src;
const BYTE* ip = istart;
const BYTE* anchor = istart;
const BYTE* const iend = istart + srcSize;
const BYTE* const ilimit = iend - 8;
- const BYTE* const base = ms->window.base + ms->window.dictLimit;
+ const BYTE* const base = ms->window.base;
+ const U32 prefixLowestIndex = ms->window.dictLimit;
+ const BYTE* const prefixLowest = base + prefixLowestIndex;
typedef size_t (*searchMax_f)(
- ZSTD_matchState_t* ms, ZSTD_compressionParameters const* cParams,
+ ZSTD_matchState_t* ms,
const BYTE* ip, const BYTE* iLimit, size_t* offsetPtr);
- searchMax_f const searchMax = searchMethod ? ZSTD_BtFindBestMatch_selectMLS : ZSTD_HcFindBestMatch_selectMLS;
+ searchMax_f const searchMax = dictMode == ZSTD_dictMatchState ?
+ (searchMethod ? ZSTD_BtFindBestMatch_dictMatchState_selectMLS : ZSTD_HcFindBestMatch_dictMatchState_selectMLS) :
+ (searchMethod ? ZSTD_BtFindBestMatch_selectMLS : ZSTD_HcFindBestMatch_selectMLS);
U32 offset_1 = rep[0], offset_2 = rep[1], savedOffset=0;
+ const ZSTD_matchState_t* const dms = ms->dictMatchState;
+ const U32 dictLowestIndex = dictMode == ZSTD_dictMatchState ?
+ dms->window.dictLimit : 0;
+ const BYTE* const dictBase = dictMode == ZSTD_dictMatchState ?
+ dms->window.base : NULL;
+ const BYTE* const dictLowest = dictMode == ZSTD_dictMatchState ?
+ dictBase + dictLowestIndex : NULL;
+ const BYTE* const dictEnd = dictMode == ZSTD_dictMatchState ?
+ dms->window.nextSrc : NULL;
+ const U32 dictIndexDelta = dictMode == ZSTD_dictMatchState ?
+ prefixLowestIndex - (U32)(dictEnd - dictBase) :
+ 0;
+ const U32 dictAndPrefixLength = (U32)(ip - prefixLowest + dictEnd - dictLowest);
+
/* init */
- ip += (ip==base);
+ ip += (dictAndPrefixLength == 0);
ms->nextToUpdate3 = ms->nextToUpdate;
- { U32 const maxRep = (U32)(ip-base);
+ if (dictMode == ZSTD_noDict) {
+ U32 const maxRep = (U32)(ip - prefixLowest);
if (offset_2 > maxRep) savedOffset = offset_2, offset_2 = 0;
if (offset_1 > maxRep) savedOffset = offset_1, offset_1 = 0;
}
+ if (dictMode == ZSTD_dictMatchState) {
+ /* dictMatchState repCode checks don't currently handle repCode == 0
+ * disabling. */
+ assert(offset_1 <= dictAndPrefixLength);
+ assert(offset_2 <= dictAndPrefixLength);
+ }
/* Match Loop */
while (ip < ilimit) {
@@ -494,15 +673,28 @@ size_t ZSTD_compressBlock_lazy_generic(
const BYTE* start=ip+1;
/* check repCode */
- if ((offset_1>0) & (MEM_read32(ip+1) == MEM_read32(ip+1 - offset_1))) {
- /* repcode : we take it */
+ if (dictMode == ZSTD_dictMatchState) {
+ const U32 repIndex = (U32)(ip - base) + 1 - offset_1;
+ const BYTE* repMatch = (dictMode == ZSTD_dictMatchState
+ && repIndex < prefixLowestIndex) ?
+ dictBase + (repIndex - dictIndexDelta) :
+ base + repIndex;
+ if (((U32)((prefixLowestIndex-1) - repIndex) >= 3 /* intentional underflow */)
+ && (MEM_read32(repMatch) == MEM_read32(ip+1)) ) {
+ const BYTE* repMatchEnd = repIndex < prefixLowestIndex ? dictEnd : iend;
+ matchLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixLowest) + 4;
+ if (depth==0) goto _storeSequence;
+ }
+ }
+ if ( dictMode == ZSTD_noDict
+ && ((offset_1 > 0) & (MEM_read32(ip+1-offset_1) == MEM_read32(ip+1)))) {
matchLength = ZSTD_count(ip+1+4, ip+1+4-offset_1, iend) + 4;
if (depth==0) goto _storeSequence;
}
/* first search (depth 0) */
- { size_t offsetFound = 99999999;
- size_t const ml2 = searchMax(ms, cParams, ip, iend, &offsetFound);
+ { size_t offsetFound = 999999999;
+ size_t const ml2 = searchMax(ms, ip, iend, &offsetFound);
if (ml2 > matchLength)
matchLength = ml2, start = ip, offset=offsetFound;
}
@@ -516,15 +708,31 @@ size_t ZSTD_compressBlock_lazy_generic(
if (depth>=1)
while (ip<ilimit) {
ip ++;
- if ((offset) && ((offset_1>0) & (MEM_read32(ip) == MEM_read32(ip - offset_1)))) {
+ if ( (dictMode == ZSTD_noDict)
+ && (offset) && ((offset_1>0) & (MEM_read32(ip) == MEM_read32(ip - offset_1)))) {
size_t const mlRep = ZSTD_count(ip+4, ip+4-offset_1, iend) + 4;
int const gain2 = (int)(mlRep * 3);
int const gain1 = (int)(matchLength*3 - ZSTD_highbit32((U32)offset+1) + 1);
if ((mlRep >= 4) && (gain2 > gain1))
matchLength = mlRep, offset = 0, start = ip;
}
- { size_t offset2=99999999;
- size_t const ml2 = searchMax(ms, cParams, ip, iend, &offset2);
+ if (dictMode == ZSTD_dictMatchState) {
+ const U32 repIndex = (U32)(ip - base) - offset_1;
+ const BYTE* repMatch = repIndex < prefixLowestIndex ?
+ dictBase + (repIndex - dictIndexDelta) :
+ base + repIndex;
+ if (((U32)((prefixLowestIndex-1) - repIndex) >= 3 /* intentional underflow */)
+ && (MEM_read32(repMatch) == MEM_read32(ip)) ) {
+ const BYTE* repMatchEnd = repIndex < prefixLowestIndex ? dictEnd : iend;
+ size_t const mlRep = ZSTD_count_2segments(ip+4, repMatch+4, iend, repMatchEnd, prefixLowest) + 4;
+ int const gain2 = (int)(mlRep * 3);
+ int const gain1 = (int)(matchLength*3 - ZSTD_highbit32((U32)offset+1) + 1);
+ if ((mlRep >= 4) && (gain2 > gain1))
+ matchLength = mlRep, offset = 0, start = ip;
+ }
+ }
+ { size_t offset2=999999999;
+ size_t const ml2 = searchMax(ms, ip, iend, &offset2);
int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)offset2+1)); /* raw approx */
int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offset+1) + 4);
if ((ml2 >= 4) && (gain2 > gain1)) {
@@ -535,15 +743,31 @@ size_t ZSTD_compressBlock_lazy_generic(
/* let's find an even better one */
if ((depth==2) && (ip<ilimit)) {
ip ++;
- if ((offset) && ((offset_1>0) & (MEM_read32(ip) == MEM_read32(ip - offset_1)))) {
- size_t const ml2 = ZSTD_count(ip+4, ip+4-offset_1, iend) + 4;
- int const gain2 = (int)(ml2 * 4);
+ if ( (dictMode == ZSTD_noDict)
+ && (offset) && ((offset_1>0) & (MEM_read32(ip) == MEM_read32(ip - offset_1)))) {
+ size_t const mlRep = ZSTD_count(ip+4, ip+4-offset_1, iend) + 4;
+ int const gain2 = (int)(mlRep * 4);
int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offset+1) + 1);
- if ((ml2 >= 4) && (gain2 > gain1))
- matchLength = ml2, offset = 0, start = ip;
+ if ((mlRep >= 4) && (gain2 > gain1))
+ matchLength = mlRep, offset = 0, start = ip;
}
- { size_t offset2=99999999;
- size_t const ml2 = searchMax(ms, cParams, ip, iend, &offset2);
+ if (dictMode == ZSTD_dictMatchState) {
+ const U32 repIndex = (U32)(ip - base) - offset_1;
+ const BYTE* repMatch = repIndex < prefixLowestIndex ?
+ dictBase + (repIndex - dictIndexDelta) :
+ base + repIndex;
+ if (((U32)((prefixLowestIndex-1) - repIndex) >= 3 /* intentional underflow */)
+ && (MEM_read32(repMatch) == MEM_read32(ip)) ) {
+ const BYTE* repMatchEnd = repIndex < prefixLowestIndex ? dictEnd : iend;
+ size_t const mlRep = ZSTD_count_2segments(ip+4, repMatch+4, iend, repMatchEnd, prefixLowest) + 4;
+ int const gain2 = (int)(mlRep * 4);
+ int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offset+1) + 1);
+ if ((mlRep >= 4) && (gain2 > gain1))
+ matchLength = mlRep, offset = 0, start = ip;
+ }
+ }
+ { size_t offset2=999999999;
+ size_t const ml2 = searchMax(ms, ip, iend, &offset2);
int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)offset2+1)); /* raw approx */
int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offset+1) + 7);
if ((ml2 >= 4) && (gain2 > gain1)) {
@@ -560,9 +784,17 @@ size_t ZSTD_compressBlock_lazy_generic(
*/
/* catch up */
if (offset) {
- while ( ((start > anchor) & (start - (offset-ZSTD_REP_MOVE) > base))
- && (start[-1] == (start-(offset-ZSTD_REP_MOVE))[-1]) ) /* only search for offset within prefix */
- { start--; matchLength++; }
+ if (dictMode == ZSTD_noDict) {
+ while ( ((start > anchor) & (start - (offset-ZSTD_REP_MOVE) > prefixLowest))
+ && (start[-1] == (start-(offset-ZSTD_REP_MOVE))[-1]) ) /* only search for offset within prefix */
+ { start--; matchLength++; }
+ }
+ if (dictMode == ZSTD_dictMatchState) {
+ U32 const matchIndex = (U32)((start-base) - (offset - ZSTD_REP_MOVE));
+ const BYTE* match = (matchIndex < prefixLowestIndex) ? dictBase + matchIndex - dictIndexDelta : base + matchIndex;
+ const BYTE* const mStart = (matchIndex < prefixLowestIndex) ? dictLowest : prefixLowest;
+ while ((start>anchor) && (match>mStart) && (start[-1] == match[-1])) { start--; match--; matchLength++; } /* catch up */
+ }
offset_2 = offset_1; offset_1 = (U32)(offset - ZSTD_REP_MOVE);
}
/* store sequence */
@@ -573,16 +805,39 @@ _storeSequence:
}
/* check immediate repcode */
- while ( ((ip <= ilimit) & (offset_2>0))
- && (MEM_read32(ip) == MEM_read32(ip - offset_2)) ) {
- /* store sequence */
- matchLength = ZSTD_count(ip+4, ip+4-offset_2, iend) + 4;
- offset = offset_2; offset_2 = offset_1; offset_1 = (U32)offset; /* swap repcodes */
- ZSTD_storeSeq(seqStore, 0, anchor, 0, matchLength-MINMATCH);
- ip += matchLength;
- anchor = ip;
- continue; /* faster when present ... (?) */
- } }
+ if (dictMode == ZSTD_dictMatchState) {
+ while (ip <= ilimit) {
+ U32 const current2 = (U32)(ip-base);
+ U32 const repIndex = current2 - offset_2;
+ const BYTE* repMatch = dictMode == ZSTD_dictMatchState
+ && repIndex < prefixLowestIndex ?
+ dictBase - dictIndexDelta + repIndex :
+ base + repIndex;
+ if ( ((U32)((prefixLowestIndex-1) - (U32)repIndex) >= 3 /* intentional overflow */)
+ && (MEM_read32(repMatch) == MEM_read32(ip)) ) {
+ const BYTE* const repEnd2 = repIndex < prefixLowestIndex ? dictEnd : iend;
+ matchLength = ZSTD_count_2segments(ip+4, repMatch+4, iend, repEnd2, prefixLowest) + 4;
+ offset = offset_2; offset_2 = offset_1; offset_1 = (U32)offset; /* swap offset_2 <=> offset_1 */
+ ZSTD_storeSeq(seqStore, 0, anchor, 0, matchLength-MINMATCH);
+ ip += matchLength;
+ anchor = ip;
+ continue;
+ }
+ break;
+ }
+ }
+
+ if (dictMode == ZSTD_noDict) {
+ while ( ((ip <= ilimit) & (offset_2>0))
+ && (MEM_read32(ip) == MEM_read32(ip - offset_2)) ) {
+ /* store sequence */
+ matchLength = ZSTD_count(ip+4, ip+4-offset_2, iend) + 4;
+ offset = offset_2; offset_2 = offset_1; offset_1 = (U32)offset; /* swap repcodes */
+ ZSTD_storeSeq(seqStore, 0, anchor, 0, matchLength-MINMATCH);
+ ip += matchLength;
+ anchor = ip;
+ continue; /* faster when present ... (?) */
+ } } }
/* Save reps for next block */
rep[0] = offset_1 ? offset_1 : savedOffset;
@@ -595,30 +850,58 @@ _storeSequence:
size_t ZSTD_compressBlock_btlazy2(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize)
+ void const* src, size_t srcSize)
{
- return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, cParams, src, srcSize, 1, 2);
+ return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, 1, 2, ZSTD_noDict);
}
size_t ZSTD_compressBlock_lazy2(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize)
+ void const* src, size_t srcSize)
{
- return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, cParams, src, srcSize, 0, 2);
+ return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, 0, 2, ZSTD_noDict);
}
size_t ZSTD_compressBlock_lazy(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize)
+ void const* src, size_t srcSize)
{
- return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, cParams, src, srcSize, 0, 1);
+ return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, 0, 1, ZSTD_noDict);
}
size_t ZSTD_compressBlock_greedy(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize)
+ void const* src, size_t srcSize)
+{
+ return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, 0, 0, ZSTD_noDict);
+}
+
+size_t ZSTD_compressBlock_btlazy2_dictMatchState(
+ ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
+ void const* src, size_t srcSize)
+{
+ return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, 1, 2, ZSTD_dictMatchState);
+}
+
+size_t ZSTD_compressBlock_lazy2_dictMatchState(
+ ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
+ void const* src, size_t srcSize)
+{
+ return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, 0, 2, ZSTD_dictMatchState);
+}
+
+size_t ZSTD_compressBlock_lazy_dictMatchState(
+ ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
+ void const* src, size_t srcSize)
+{
+ return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, 0, 1, ZSTD_dictMatchState);
+}
+
+size_t ZSTD_compressBlock_greedy_dictMatchState(
+ ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
+ void const* src, size_t srcSize)
{
- return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, cParams, src, srcSize, 0, 0);
+ return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, 0, 0, ZSTD_dictMatchState);
}
@@ -626,7 +909,6 @@ FORCE_INLINE_TEMPLATE
size_t ZSTD_compressBlock_lazy_extDict_generic(
ZSTD_matchState_t* ms, seqStore_t* seqStore,
U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams,
const void* src, size_t srcSize,
const U32 searchMethod, const U32 depth)
{
@@ -644,9 +926,9 @@ size_t ZSTD_compressBlock_lazy_extDict_generic(
const BYTE* const dictStart = dictBase + lowestIndex;
typedef size_t (*searchMax_f)(
- ZSTD_matchState_t* ms, ZSTD_compressionParameters const* cParams,
+ ZSTD_matchState_t* ms,
const BYTE* ip, const BYTE* iLimit, size_t* offsetPtr);
- searchMax_f searchMax = searchMethod ? ZSTD_BtFindBestMatch_selectMLS_extDict : ZSTD_HcFindBestMatch_extDict_selectMLS;
+ searchMax_f searchMax = searchMethod ? ZSTD_BtFindBestMatch_extDict_selectMLS : ZSTD_HcFindBestMatch_extDict_selectMLS;
U32 offset_1 = rep[0], offset_2 = rep[1];
@@ -674,8 +956,8 @@ size_t ZSTD_compressBlock_lazy_extDict_generic(
} }
/* first search (depth 0) */
- { size_t offsetFound = 99999999;
- size_t const ml2 = searchMax(ms, cParams, ip, iend, &offsetFound);
+ { size_t offsetFound = 999999999;
+ size_t const ml2 = searchMax(ms, ip, iend, &offsetFound);
if (ml2 > matchLength)
matchLength = ml2, start = ip, offset=offsetFound;
}
@@ -707,8 +989,8 @@ size_t ZSTD_compressBlock_lazy_extDict_generic(
} }
/* search match, depth 1 */
- { size_t offset2=99999999;
- size_t const ml2 = searchMax(ms, cParams, ip, iend, &offset2);
+ { size_t offset2=999999999;
+ size_t const ml2 = searchMax(ms, ip, iend, &offset2);
int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)offset2+1)); /* raw approx */
int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offset+1) + 4);
if ((ml2 >= 4) && (gain2 > gain1)) {
@@ -737,8 +1019,8 @@ size_t ZSTD_compressBlock_lazy_extDict_generic(
} }
/* search match, depth 2 */
- { size_t offset2=99999999;
- size_t const ml2 = searchMax(ms, cParams, ip, iend, &offset2);
+ { size_t offset2=999999999;
+ size_t const ml2 = searchMax(ms, ip, iend, &offset2);
int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)offset2+1)); /* raw approx */
int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offset+1) + 7);
if ((ml2 >= 4) && (gain2 > gain1)) {
@@ -794,31 +1076,31 @@ _storeSequence:
size_t ZSTD_compressBlock_greedy_extDict(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize)
+ void const* src, size_t srcSize)
{
- return ZSTD_compressBlock_lazy_extDict_generic(ms, seqStore, rep, cParams, src, srcSize, 0, 0);
+ return ZSTD_compressBlock_lazy_extDict_generic(ms, seqStore, rep, src, srcSize, 0, 0);
}
size_t ZSTD_compressBlock_lazy_extDict(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize)
+ void const* src, size_t srcSize)
{
- return ZSTD_compressBlock_lazy_extDict_generic(ms, seqStore, rep, cParams, src, srcSize, 0, 1);
+ return ZSTD_compressBlock_lazy_extDict_generic(ms, seqStore, rep, src, srcSize, 0, 1);
}
size_t ZSTD_compressBlock_lazy2_extDict(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize)
+ void const* src, size_t srcSize)
{
- return ZSTD_compressBlock_lazy_extDict_generic(ms, seqStore, rep, cParams, src, srcSize, 0, 2);
+ return ZSTD_compressBlock_lazy_extDict_generic(ms, seqStore, rep, src, srcSize, 0, 2);
}
size_t ZSTD_compressBlock_btlazy2_extDict(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize)
+ void const* src, size_t srcSize)
{
- return ZSTD_compressBlock_lazy_extDict_generic(ms, seqStore, rep, cParams, src, srcSize, 1, 2);
+ return ZSTD_compressBlock_lazy_extDict_generic(ms, seqStore, rep, src, srcSize, 1, 2);
}
diff --git a/thirdparty/zstd/compress/zstd_lazy.h b/thirdparty/zstd/compress/zstd_lazy.h
index bda064f199..ef85a6df9c 100644
--- a/thirdparty/zstd/compress/zstd_lazy.h
+++ b/thirdparty/zstd/compress/zstd_lazy.h
@@ -17,37 +17,48 @@ extern "C" {
#include "zstd_compress_internal.h"
-U32 ZSTD_insertAndFindFirstIndex(
- ZSTD_matchState_t* ms, ZSTD_compressionParameters const* cParams,
- const BYTE* ip);
+U32 ZSTD_insertAndFindFirstIndex(ZSTD_matchState_t* ms, const BYTE* ip);
void ZSTD_preserveUnsortedMark (U32* const table, U32 const size, U32 const reducerValue); /*! used in ZSTD_reduceIndex(). pre-emptively increase value of ZSTD_DUBT_UNSORTED_MARK */
size_t ZSTD_compressBlock_btlazy2(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize);
+ void const* src, size_t srcSize);
size_t ZSTD_compressBlock_lazy2(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize);
+ void const* src, size_t srcSize);
size_t ZSTD_compressBlock_lazy(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize);
+ void const* src, size_t srcSize);
size_t ZSTD_compressBlock_greedy(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize);
+ void const* src, size_t srcSize);
+
+size_t ZSTD_compressBlock_btlazy2_dictMatchState(
+ ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
+ void const* src, size_t srcSize);
+size_t ZSTD_compressBlock_lazy2_dictMatchState(
+ ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
+ void const* src, size_t srcSize);
+size_t ZSTD_compressBlock_lazy_dictMatchState(
+ ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
+ void const* src, size_t srcSize);
+size_t ZSTD_compressBlock_greedy_dictMatchState(
+ ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
+ void const* src, size_t srcSize);
size_t ZSTD_compressBlock_greedy_extDict(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize);
+ void const* src, size_t srcSize);
size_t ZSTD_compressBlock_lazy_extDict(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize);
+ void const* src, size_t srcSize);
size_t ZSTD_compressBlock_lazy2_extDict(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize);
+ void const* src, size_t srcSize);
size_t ZSTD_compressBlock_btlazy2_extDict(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize);
+ void const* src, size_t srcSize);
#if defined (__cplusplus)
}
diff --git a/thirdparty/zstd/compress/zstd_ldm.c b/thirdparty/zstd/compress/zstd_ldm.c
index bffd8a3dfa..58eb2ffe4d 100644
--- a/thirdparty/zstd/compress/zstd_ldm.c
+++ b/thirdparty/zstd/compress/zstd_ldm.c
@@ -9,6 +9,7 @@
#include "zstd_ldm.h"
+#include "debug.h"
#include "zstd_fast.h" /* ZSTD_fillHashTable() */
#include "zstd_double_fast.h" /* ZSTD_fillDoubleHashTable() */
@@ -20,7 +21,7 @@
void ZSTD_ldm_adjustParameters(ldmParams_t* params,
ZSTD_compressionParameters const* cParams)
{
- U32 const windowLog = cParams->windowLog;
+ params->windowLog = cParams->windowLog;
ZSTD_STATIC_ASSERT(LDM_BUCKET_SIZE_LOG <= ZSTD_LDM_BUCKETSIZELOG_MAX);
DEBUGLOG(4, "ZSTD_ldm_adjustParameters");
if (!params->bucketSizeLog) params->bucketSizeLog = LDM_BUCKET_SIZE_LOG;
@@ -33,12 +34,13 @@ void ZSTD_ldm_adjustParameters(ldmParams_t* params,
params->minMatchLength = minMatch;
}
if (params->hashLog == 0) {
- params->hashLog = MAX(ZSTD_HASHLOG_MIN, windowLog - LDM_HASH_RLOG);
+ params->hashLog = MAX(ZSTD_HASHLOG_MIN, params->windowLog - LDM_HASH_RLOG);
assert(params->hashLog <= ZSTD_HASHLOG_MAX);
}
- if (params->hashEveryLog == 0) {
- params->hashEveryLog =
- windowLog < params->hashLog ? 0 : windowLog - params->hashLog;
+ if (params->hashRateLog == 0) {
+ params->hashRateLog = params->windowLog < params->hashLog
+ ? 0
+ : params->windowLog - params->hashLog;
}
params->bucketSizeLog = MIN(params->bucketSizeLog, params->hashLog);
}
@@ -117,20 +119,20 @@ static void ZSTD_ldm_insertEntry(ldmState_t* ldmState,
*
* Gets the small hash, checksum, and tag from the rollingHash.
*
- * If the tag matches (1 << ldmParams.hashEveryLog)-1, then
+ * If the tag matches (1 << ldmParams.hashRateLog)-1, then
* creates an ldmEntry from the offset, and inserts it into the hash table.
*
* hBits is the length of the small hash, which is the most significant hBits
* of rollingHash. The checksum is the next 32 most significant bits, followed
- * by ldmParams.hashEveryLog bits that make up the tag. */
+ * by ldmParams.hashRateLog bits that make up the tag. */
static void ZSTD_ldm_makeEntryAndInsertByTag(ldmState_t* ldmState,
U64 const rollingHash,
U32 const hBits,
U32 const offset,
ldmParams_t const ldmParams)
{
- U32 const tag = ZSTD_ldm_getTag(rollingHash, hBits, ldmParams.hashEveryLog);
- U32 const tagMask = ((U32)1 << ldmParams.hashEveryLog) - 1;
+ U32 const tag = ZSTD_ldm_getTag(rollingHash, hBits, ldmParams.hashRateLog);
+ U32 const tagMask = ((U32)1 << ldmParams.hashRateLog) - 1;
if (tag == tagMask) {
U32 const hash = ZSTD_ldm_getSmallHash(rollingHash, hBits);
U32 const checksum = ZSTD_ldm_getChecksum(rollingHash, hBits);
@@ -141,56 +143,6 @@ static void ZSTD_ldm_makeEntryAndInsertByTag(ldmState_t* ldmState,
}
}
-/** ZSTD_ldm_getRollingHash() :
- * Get a 64-bit hash using the first len bytes from buf.
- *
- * Giving bytes s = s_1, s_2, ... s_k, the hash is defined to be
- * H(s) = s_1*(a^(k-1)) + s_2*(a^(k-2)) + ... + s_k*(a^0)
- *
- * where the constant a is defined to be prime8bytes.
- *
- * The implementation adds an offset to each byte, so
- * H(s) = (s_1 + HASH_CHAR_OFFSET)*(a^(k-1)) + ... */
-static U64 ZSTD_ldm_getRollingHash(const BYTE* buf, U32 len)
-{
- U64 ret = 0;
- U32 i;
- for (i = 0; i < len; i++) {
- ret *= prime8bytes;
- ret += buf[i] + LDM_HASH_CHAR_OFFSET;
- }
- return ret;
-}
-
-/** ZSTD_ldm_ipow() :
- * Return base^exp. */
-static U64 ZSTD_ldm_ipow(U64 base, U64 exp)
-{
- U64 ret = 1;
- while (exp) {
- if (exp & 1) { ret *= base; }
- exp >>= 1;
- base *= base;
- }
- return ret;
-}
-
-U64 ZSTD_ldm_getHashPower(U32 minMatchLength) {
- DEBUGLOG(4, "ZSTD_ldm_getHashPower: mml=%u", minMatchLength);
- assert(minMatchLength >= ZSTD_LDM_MINMATCH_MIN);
- return ZSTD_ldm_ipow(prime8bytes, minMatchLength - 1);
-}
-
-/** ZSTD_ldm_updateHash() :
- * Updates hash by removing toRemove and adding toAdd. */
-static U64 ZSTD_ldm_updateHash(U64 hash, BYTE toRemove, BYTE toAdd, U64 hashPower)
-{
- hash -= ((toRemove + LDM_HASH_CHAR_OFFSET) * hashPower);
- hash *= prime8bytes;
- hash += toAdd + LDM_HASH_CHAR_OFFSET;
- return hash;
-}
-
/** ZSTD_ldm_countBackwardsMatch() :
* Returns the number of bytes that match backwards before pIn and pMatch.
*
@@ -216,21 +168,18 @@ static size_t ZSTD_ldm_countBackwardsMatch(
* The tables for the other strategies are filled within their
* block compressors. */
static size_t ZSTD_ldm_fillFastTables(ZSTD_matchState_t* ms,
- ZSTD_compressionParameters const* cParams,
void const* end)
{
const BYTE* const iend = (const BYTE*)end;
- switch(cParams->strategy)
+ switch(ms->cParams.strategy)
{
case ZSTD_fast:
- ZSTD_fillHashTable(ms, cParams, iend);
- ms->nextToUpdate = (U32)(iend - ms->window.base);
+ ZSTD_fillHashTable(ms, iend, ZSTD_dtlm_fast);
break;
case ZSTD_dfast:
- ZSTD_fillDoubleHashTable(ms, cParams, iend);
- ms->nextToUpdate = (U32)(iend - ms->window.base);
+ ZSTD_fillDoubleHashTable(ms, iend, ZSTD_dtlm_fast);
break;
case ZSTD_greedy:
@@ -239,6 +188,7 @@ static size_t ZSTD_ldm_fillFastTables(ZSTD_matchState_t* ms,
case ZSTD_btlazy2:
case ZSTD_btopt:
case ZSTD_btultra:
+ case ZSTD_btultra2:
break;
default:
assert(0); /* not possible : not a valid strategy id */
@@ -262,9 +212,9 @@ static U64 ZSTD_ldm_fillLdmHashTable(ldmState_t* state,
const BYTE* cur = lastHashed + 1;
while (cur < iend) {
- rollingHash = ZSTD_ldm_updateHash(rollingHash, cur[-1],
- cur[ldmParams.minMatchLength-1],
- state->hashPower);
+ rollingHash = ZSTD_rollingHash_rotate(rollingHash, cur[-1],
+ cur[ldmParams.minMatchLength-1],
+ state->hashPower);
ZSTD_ldm_makeEntryAndInsertByTag(state,
rollingHash, hBits,
(U32)(cur - base), ldmParams);
@@ -298,8 +248,8 @@ static size_t ZSTD_ldm_generateSequences_internal(
U64 const hashPower = ldmState->hashPower;
U32 const hBits = params->hashLog - params->bucketSizeLog;
U32 const ldmBucketSize = 1U << params->bucketSizeLog;
- U32 const hashEveryLog = params->hashEveryLog;
- U32 const ldmTagMask = (1U << params->hashEveryLog) - 1;
+ U32 const hashRateLog = params->hashRateLog;
+ U32 const ldmTagMask = (1U << params->hashRateLog) - 1;
/* Prefix and extDict parameters */
U32 const dictLimit = ldmState->window.dictLimit;
U32 const lowestIndex = extDict ? ldmState->window.lowLimit : dictLimit;
@@ -325,16 +275,16 @@ static size_t ZSTD_ldm_generateSequences_internal(
size_t forwardMatchLength = 0, backwardMatchLength = 0;
ldmEntry_t* bestEntry = NULL;
if (ip != istart) {
- rollingHash = ZSTD_ldm_updateHash(rollingHash, lastHashed[0],
- lastHashed[minMatchLength],
- hashPower);
+ rollingHash = ZSTD_rollingHash_rotate(rollingHash, lastHashed[0],
+ lastHashed[minMatchLength],
+ hashPower);
} else {
- rollingHash = ZSTD_ldm_getRollingHash(ip, minMatchLength);
+ rollingHash = ZSTD_rollingHash_compute(ip, minMatchLength);
}
lastHashed = ip;
/* Do not insert and do not look for a match */
- if (ZSTD_ldm_getTag(rollingHash, hBits, hashEveryLog) != ldmTagMask) {
+ if (ZSTD_ldm_getTag(rollingHash, hBits, hashRateLog) != ldmTagMask) {
ip++;
continue;
}
@@ -508,7 +458,7 @@ size_t ZSTD_ldm_generateSequences(
* * Try invalidation after the sequence generation and test the
* the offset against maxDist directly.
*/
- ZSTD_window_enforceMaxDist(&ldmState->window, chunkEnd, maxDist, NULL);
+ ZSTD_window_enforceMaxDist(&ldmState->window, chunkEnd, maxDist, NULL, NULL);
/* 3. Generate the sequences for the chunk, and get newLeftoverSize. */
newLeftoverSize = ZSTD_ldm_generateSequences_internal(
ldmState, sequences, params, chunkStart, chunkSize);
@@ -591,19 +541,19 @@ static rawSeq maybeSplitSequence(rawSeqStore_t* rawSeqStore,
size_t ZSTD_ldm_blockCompress(rawSeqStore_t* rawSeqStore,
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize,
- int const extDict)
+ void const* src, size_t srcSize)
{
- unsigned const minMatch = cParams->searchLength;
+ const ZSTD_compressionParameters* const cParams = &ms->cParams;
+ unsigned const minMatch = cParams->minMatch;
ZSTD_blockCompressor const blockCompressor =
- ZSTD_selectBlockCompressor(cParams->strategy, extDict);
- BYTE const* const base = ms->window.base;
+ ZSTD_selectBlockCompressor(cParams->strategy, ZSTD_matchState_dictMode(ms));
/* Input bounds */
BYTE const* const istart = (BYTE const*)src;
BYTE const* const iend = istart + srcSize;
/* Input positions */
BYTE const* ip = istart;
+ DEBUGLOG(5, "ZSTD_ldm_blockCompress: srcSize=%zu", srcSize);
assert(rawSeqStore->pos <= rawSeqStore->size);
assert(rawSeqStore->size <= rawSeqStore->capacity);
/* Loop through each sequence and apply the block compressor to the lits */
@@ -621,14 +571,13 @@ size_t ZSTD_ldm_blockCompress(rawSeqStore_t* rawSeqStore,
/* Fill tables for block compressor */
ZSTD_ldm_limitTableUpdate(ms, ip);
- ZSTD_ldm_fillFastTables(ms, cParams, ip);
+ ZSTD_ldm_fillFastTables(ms, ip);
/* Run the block compressor */
+ DEBUGLOG(5, "calling block compressor on segment of size %u", sequence.litLength);
{
size_t const newLitLength =
- blockCompressor(ms, seqStore, rep, cParams, ip,
- sequence.litLength);
+ blockCompressor(ms, seqStore, rep, ip, sequence.litLength);
ip += sequence.litLength;
- ms->nextToUpdate = (U32)(ip - base);
/* Update the repcodes */
for (i = ZSTD_REP_NUM - 1; i > 0; i--)
rep[i] = rep[i-1];
@@ -642,12 +591,7 @@ size_t ZSTD_ldm_blockCompress(rawSeqStore_t* rawSeqStore,
}
/* Fill the tables for the block compressor */
ZSTD_ldm_limitTableUpdate(ms, ip);
- ZSTD_ldm_fillFastTables(ms, cParams, ip);
+ ZSTD_ldm_fillFastTables(ms, ip);
/* Compress the last literals */
- {
- size_t const lastLiterals = blockCompressor(ms, seqStore, rep, cParams,
- ip, iend - ip);
- ms->nextToUpdate = (U32)(iend - base);
- return lastLiterals;
- }
+ return blockCompressor(ms, seqStore, rep, ip, iend - ip);
}
diff --git a/thirdparty/zstd/compress/zstd_ldm.h b/thirdparty/zstd/compress/zstd_ldm.h
index 0c3789ff13..a47846128b 100644
--- a/thirdparty/zstd/compress/zstd_ldm.h
+++ b/thirdparty/zstd/compress/zstd_ldm.h
@@ -21,7 +21,7 @@ extern "C" {
* Long distance matching
***************************************/
-#define ZSTD_LDM_DEFAULT_WINDOW_LOG ZSTD_WINDOWLOG_DEFAULTMAX
+#define ZSTD_LDM_DEFAULT_WINDOW_LOG ZSTD_WINDOWLOG_LIMIT_DEFAULT
/**
* ZSTD_ldm_generateSequences():
@@ -61,9 +61,7 @@ size_t ZSTD_ldm_generateSequences(
*/
size_t ZSTD_ldm_blockCompress(rawSeqStore_t* rawSeqStore,
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams,
- void const* src, size_t srcSize,
- int const extDict);
+ void const* src, size_t srcSize);
/**
* ZSTD_ldm_skipSequences():
@@ -88,12 +86,8 @@ size_t ZSTD_ldm_getTableSize(ldmParams_t params);
*/
size_t ZSTD_ldm_getMaxNbSeq(ldmParams_t params, size_t maxChunkSize);
-/** ZSTD_ldm_getTableSize() :
- * Return prime8bytes^(minMatchLength-1) */
-U64 ZSTD_ldm_getHashPower(U32 minMatchLength);
-
/** ZSTD_ldm_adjustParameters() :
- * If the params->hashEveryLog is not set, set it to its default value based on
+ * If the params->hashRateLog is not set, set it to its default value based on
* windowLog and params->hashLog.
*
* Ensures that params->bucketSizeLog is <= params->hashLog (setting it to
diff --git a/thirdparty/zstd/compress/zstd_opt.c b/thirdparty/zstd/compress/zstd_opt.c
index f63f0c5852..44de6e97fd 100644
--- a/thirdparty/zstd/compress/zstd_opt.c
+++ b/thirdparty/zstd/compress/zstd_opt.c
@@ -9,139 +9,245 @@
*/
#include "zstd_compress_internal.h"
+#include "hist.h"
#include "zstd_opt.h"
-#define ZSTD_LITFREQ_ADD 2 /* scaling factor for litFreq, so that frequencies adapt faster to new stats. Also used for matchSum (?) */
+#define ZSTD_LITFREQ_ADD 2 /* scaling factor for litFreq, so that frequencies adapt faster to new stats */
#define ZSTD_FREQ_DIV 4 /* log factor when using previous stats to init next stats */
#define ZSTD_MAX_PRICE (1<<30)
+#define ZSTD_PREDEF_THRESHOLD 1024 /* if srcSize < ZSTD_PREDEF_THRESHOLD, symbols' cost is assumed static, directly determined by pre-defined distributions */
+
/*-*************************************
* Price functions for optimal parser
***************************************/
-static void ZSTD_setLog2Prices(optState_t* optPtr)
+
+#if 0 /* approximation at bit level */
+# define BITCOST_ACCURACY 0
+# define BITCOST_MULTIPLIER (1 << BITCOST_ACCURACY)
+# define WEIGHT(stat) ((void)opt, ZSTD_bitWeight(stat))
+#elif 0 /* fractional bit accuracy */
+# define BITCOST_ACCURACY 8
+# define BITCOST_MULTIPLIER (1 << BITCOST_ACCURACY)
+# define WEIGHT(stat,opt) ((void)opt, ZSTD_fracWeight(stat))
+#else /* opt==approx, ultra==accurate */
+# define BITCOST_ACCURACY 8
+# define BITCOST_MULTIPLIER (1 << BITCOST_ACCURACY)
+# define WEIGHT(stat,opt) (opt ? ZSTD_fracWeight(stat) : ZSTD_bitWeight(stat))
+#endif
+
+MEM_STATIC U32 ZSTD_bitWeight(U32 stat)
{
- optPtr->log2litSum = ZSTD_highbit32(optPtr->litSum+1);
- optPtr->log2litLengthSum = ZSTD_highbit32(optPtr->litLengthSum+1);
- optPtr->log2matchLengthSum = ZSTD_highbit32(optPtr->matchLengthSum+1);
- optPtr->log2offCodeSum = ZSTD_highbit32(optPtr->offCodeSum+1);
+ return (ZSTD_highbit32(stat+1) * BITCOST_MULTIPLIER);
}
+MEM_STATIC U32 ZSTD_fracWeight(U32 rawStat)
+{
+ U32 const stat = rawStat + 1;
+ U32 const hb = ZSTD_highbit32(stat);
+ U32 const BWeight = hb * BITCOST_MULTIPLIER;
+ U32 const FWeight = (stat << BITCOST_ACCURACY) >> hb;
+ U32 const weight = BWeight + FWeight;
+ assert(hb + BITCOST_ACCURACY < 31);
+ return weight;
+}
-static void ZSTD_rescaleFreqs(optState_t* const optPtr,
- const BYTE* const src, size_t const srcSize)
+#if (DEBUGLEVEL>=2)
+/* debugging function,
+ * @return price in bytes as fractional value
+ * for debug messages only */
+MEM_STATIC double ZSTD_fCost(U32 price)
{
- optPtr->staticPrices = 0;
+ return (double)price / (BITCOST_MULTIPLIER*8);
+}
+#endif
- if (optPtr->litLengthSum == 0) { /* first init */
- unsigned u;
- if (srcSize <= 1024) optPtr->staticPrices = 1;
+static void ZSTD_setBasePrices(optState_t* optPtr, int optLevel)
+{
+ optPtr->litSumBasePrice = WEIGHT(optPtr->litSum, optLevel);
+ optPtr->litLengthSumBasePrice = WEIGHT(optPtr->litLengthSum, optLevel);
+ optPtr->matchLengthSumBasePrice = WEIGHT(optPtr->matchLengthSum, optLevel);
+ optPtr->offCodeSumBasePrice = WEIGHT(optPtr->offCodeSum, optLevel);
+}
- assert(optPtr->litFreq!=NULL);
- for (u=0; u<=MaxLit; u++)
- optPtr->litFreq[u] = 0;
- for (u=0; u<srcSize; u++)
- optPtr->litFreq[src[u]]++;
- optPtr->litSum = 0;
- for (u=0; u<=MaxLit; u++) {
- optPtr->litFreq[u] = 1 + (optPtr->litFreq[u] >> ZSTD_FREQ_DIV);
- optPtr->litSum += optPtr->litFreq[u];
- }
- for (u=0; u<=MaxLL; u++)
- optPtr->litLengthFreq[u] = 1;
- optPtr->litLengthSum = MaxLL+1;
- for (u=0; u<=MaxML; u++)
- optPtr->matchLengthFreq[u] = 1;
- optPtr->matchLengthSum = MaxML+1;
- for (u=0; u<=MaxOff; u++)
- optPtr->offCodeFreq[u] = 1;
- optPtr->offCodeSum = (MaxOff+1);
-
- } else {
- unsigned u;
-
- optPtr->litSum = 0;
- for (u=0; u<=MaxLit; u++) {
- optPtr->litFreq[u] = 1 + (optPtr->litFreq[u] >> (ZSTD_FREQ_DIV+1));
- optPtr->litSum += optPtr->litFreq[u];
- }
- optPtr->litLengthSum = 0;
- for (u=0; u<=MaxLL; u++) {
- optPtr->litLengthFreq[u] = 1 + (optPtr->litLengthFreq[u]>>(ZSTD_FREQ_DIV+1));
- optPtr->litLengthSum += optPtr->litLengthFreq[u];
- }
- optPtr->matchLengthSum = 0;
- for (u=0; u<=MaxML; u++) {
- optPtr->matchLengthFreq[u] = 1 + (optPtr->matchLengthFreq[u]>>ZSTD_FREQ_DIV);
- optPtr->matchLengthSum += optPtr->matchLengthFreq[u];
+/* ZSTD_downscaleStat() :
+ * reduce all elements in table by a factor 2^(ZSTD_FREQ_DIV+malus)
+ * return the resulting sum of elements */
+static U32 ZSTD_downscaleStat(unsigned* table, U32 lastEltIndex, int malus)
+{
+ U32 s, sum=0;
+ DEBUGLOG(5, "ZSTD_downscaleStat (nbElts=%u)", (unsigned)lastEltIndex+1);
+ assert(ZSTD_FREQ_DIV+malus > 0 && ZSTD_FREQ_DIV+malus < 31);
+ for (s=0; s<lastEltIndex+1; s++) {
+ table[s] = 1 + (table[s] >> (ZSTD_FREQ_DIV+malus));
+ sum += table[s];
+ }
+ return sum;
+}
+
+/* ZSTD_rescaleFreqs() :
+ * if first block (detected by optPtr->litLengthSum == 0) : init statistics
+ * take hints from dictionary if there is one
+ * or init from zero, using src for literals stats, or flat 1 for match symbols
+ * otherwise downscale existing stats, to be used as seed for next block.
+ */
+static void
+ZSTD_rescaleFreqs(optState_t* const optPtr,
+ const BYTE* const src, size_t const srcSize,
+ int const optLevel)
+{
+ DEBUGLOG(5, "ZSTD_rescaleFreqs (srcSize=%u)", (unsigned)srcSize);
+ optPtr->priceType = zop_dynamic;
+
+ if (optPtr->litLengthSum == 0) { /* first block : init */
+ if (srcSize <= ZSTD_PREDEF_THRESHOLD) { /* heuristic */
+ DEBUGLOG(5, "(srcSize <= ZSTD_PREDEF_THRESHOLD) => zop_predef");
+ optPtr->priceType = zop_predef;
}
- optPtr->offCodeSum = 0;
- for (u=0; u<=MaxOff; u++) {
- optPtr->offCodeFreq[u] = 1 + (optPtr->offCodeFreq[u]>>ZSTD_FREQ_DIV);
- optPtr->offCodeSum += optPtr->offCodeFreq[u];
+
+ assert(optPtr->symbolCosts != NULL);
+ if (optPtr->symbolCosts->huf.repeatMode == HUF_repeat_valid) {
+ /* huffman table presumed generated by dictionary */
+ optPtr->priceType = zop_dynamic;
+
+ assert(optPtr->litFreq != NULL);
+ optPtr->litSum = 0;
+ { unsigned lit;
+ for (lit=0; lit<=MaxLit; lit++) {
+ U32 const scaleLog = 11; /* scale to 2K */
+ U32 const bitCost = HUF_getNbBits(optPtr->symbolCosts->huf.CTable, lit);
+ assert(bitCost <= scaleLog);
+ optPtr->litFreq[lit] = bitCost ? 1 << (scaleLog-bitCost) : 1 /*minimum to calculate cost*/;
+ optPtr->litSum += optPtr->litFreq[lit];
+ } }
+
+ { unsigned ll;
+ FSE_CState_t llstate;
+ FSE_initCState(&llstate, optPtr->symbolCosts->fse.litlengthCTable);
+ optPtr->litLengthSum = 0;
+ for (ll=0; ll<=MaxLL; ll++) {
+ U32 const scaleLog = 10; /* scale to 1K */
+ U32 const bitCost = FSE_getMaxNbBits(llstate.symbolTT, ll);
+ assert(bitCost < scaleLog);
+ optPtr->litLengthFreq[ll] = bitCost ? 1 << (scaleLog-bitCost) : 1 /*minimum to calculate cost*/;
+ optPtr->litLengthSum += optPtr->litLengthFreq[ll];
+ } }
+
+ { unsigned ml;
+ FSE_CState_t mlstate;
+ FSE_initCState(&mlstate, optPtr->symbolCosts->fse.matchlengthCTable);
+ optPtr->matchLengthSum = 0;
+ for (ml=0; ml<=MaxML; ml++) {
+ U32 const scaleLog = 10;
+ U32 const bitCost = FSE_getMaxNbBits(mlstate.symbolTT, ml);
+ assert(bitCost < scaleLog);
+ optPtr->matchLengthFreq[ml] = bitCost ? 1 << (scaleLog-bitCost) : 1 /*minimum to calculate cost*/;
+ optPtr->matchLengthSum += optPtr->matchLengthFreq[ml];
+ } }
+
+ { unsigned of;
+ FSE_CState_t ofstate;
+ FSE_initCState(&ofstate, optPtr->symbolCosts->fse.offcodeCTable);
+ optPtr->offCodeSum = 0;
+ for (of=0; of<=MaxOff; of++) {
+ U32 const scaleLog = 10;
+ U32 const bitCost = FSE_getMaxNbBits(ofstate.symbolTT, of);
+ assert(bitCost < scaleLog);
+ optPtr->offCodeFreq[of] = bitCost ? 1 << (scaleLog-bitCost) : 1 /*minimum to calculate cost*/;
+ optPtr->offCodeSum += optPtr->offCodeFreq[of];
+ } }
+
+ } else { /* not a dictionary */
+
+ assert(optPtr->litFreq != NULL);
+ { unsigned lit = MaxLit;
+ HIST_count_simple(optPtr->litFreq, &lit, src, srcSize); /* use raw first block to init statistics */
+ }
+ optPtr->litSum = ZSTD_downscaleStat(optPtr->litFreq, MaxLit, 1);
+
+ { unsigned ll;
+ for (ll=0; ll<=MaxLL; ll++)
+ optPtr->litLengthFreq[ll] = 1;
+ }
+ optPtr->litLengthSum = MaxLL+1;
+
+ { unsigned ml;
+ for (ml=0; ml<=MaxML; ml++)
+ optPtr->matchLengthFreq[ml] = 1;
+ }
+ optPtr->matchLengthSum = MaxML+1;
+
+ { unsigned of;
+ for (of=0; of<=MaxOff; of++)
+ optPtr->offCodeFreq[of] = 1;
+ }
+ optPtr->offCodeSum = MaxOff+1;
+
}
+
+ } else { /* new block : re-use previous statistics, scaled down */
+
+ optPtr->litSum = ZSTD_downscaleStat(optPtr->litFreq, MaxLit, 1);
+ optPtr->litLengthSum = ZSTD_downscaleStat(optPtr->litLengthFreq, MaxLL, 0);
+ optPtr->matchLengthSum = ZSTD_downscaleStat(optPtr->matchLengthFreq, MaxML, 0);
+ optPtr->offCodeSum = ZSTD_downscaleStat(optPtr->offCodeFreq, MaxOff, 0);
}
- ZSTD_setLog2Prices(optPtr);
+ ZSTD_setBasePrices(optPtr, optLevel);
}
-
/* ZSTD_rawLiteralsCost() :
- * cost of literals (only) in given segment (which length can be null)
- * does not include cost of literalLength symbol */
+ * price of literals (only) in specified segment (which length can be 0).
+ * does not include price of literalLength symbol */
static U32 ZSTD_rawLiteralsCost(const BYTE* const literals, U32 const litLength,
- const optState_t* const optPtr)
+ const optState_t* const optPtr,
+ int optLevel)
{
- if (optPtr->staticPrices) return (litLength*6); /* 6 bit per literal - no statistic used */
if (litLength == 0) return 0;
-
- /* literals */
- { U32 u;
- U32 cost = litLength * optPtr->log2litSum;
- for (u=0; u < litLength; u++)
- cost -= ZSTD_highbit32(optPtr->litFreq[literals[u]]+1);
- return cost;
+ if (optPtr->priceType == zop_predef)
+ return (litLength*6) * BITCOST_MULTIPLIER; /* 6 bit per literal - no statistic used */
+
+ /* dynamic statistics */
+ { U32 price = litLength * optPtr->litSumBasePrice;
+ U32 u;
+ for (u=0; u < litLength; u++) {
+ assert(WEIGHT(optPtr->litFreq[literals[u]], optLevel) <= optPtr->litSumBasePrice); /* literal cost should never be negative */
+ price -= WEIGHT(optPtr->litFreq[literals[u]], optLevel);
+ }
+ return price;
}
}
/* ZSTD_litLengthPrice() :
* cost of literalLength symbol */
-static U32 ZSTD_litLengthPrice(U32 const litLength, const optState_t* const optPtr)
+static U32 ZSTD_litLengthPrice(U32 const litLength, const optState_t* const optPtr, int optLevel)
{
- if (optPtr->staticPrices) return ZSTD_highbit32((U32)litLength+1);
+ if (optPtr->priceType == zop_predef) return WEIGHT(litLength, optLevel);
- /* literal Length */
+ /* dynamic statistics */
{ U32 const llCode = ZSTD_LLcode(litLength);
- U32 const price = LL_bits[llCode] + optPtr->log2litLengthSum - ZSTD_highbit32(optPtr->litLengthFreq[llCode]+1);
- return price;
+ return (LL_bits[llCode] * BITCOST_MULTIPLIER)
+ + optPtr->litLengthSumBasePrice
+ - WEIGHT(optPtr->litLengthFreq[llCode], optLevel);
}
}
-/* ZSTD_litLengthPrice() :
- * cost of the literal part of a sequence,
- * including literals themselves, and literalLength symbol */
-static U32 ZSTD_fullLiteralsCost(const BYTE* const literals, U32 const litLength,
- const optState_t* const optPtr)
-{
- return ZSTD_rawLiteralsCost(literals, litLength, optPtr)
- + ZSTD_litLengthPrice(litLength, optPtr);
-}
-
/* ZSTD_litLengthContribution() :
* @return ( cost(litlength) - cost(0) )
* this value can then be added to rawLiteralsCost()
* to provide a cost which is directly comparable to a match ending at same position */
-static int ZSTD_litLengthContribution(U32 const litLength, const optState_t* const optPtr)
+static int ZSTD_litLengthContribution(U32 const litLength, const optState_t* const optPtr, int optLevel)
{
- if (optPtr->staticPrices) return ZSTD_highbit32(litLength+1);
+ if (optPtr->priceType >= zop_predef) return WEIGHT(litLength, optLevel);
- /* literal Length */
+ /* dynamic statistics */
{ U32 const llCode = ZSTD_LLcode(litLength);
- int const contribution = LL_bits[llCode]
- + ZSTD_highbit32(optPtr->litLengthFreq[0]+1)
- - ZSTD_highbit32(optPtr->litLengthFreq[llCode]+1);
+ int const contribution = (LL_bits[llCode] * BITCOST_MULTIPLIER)
+ + WEIGHT(optPtr->litLengthFreq[0], optLevel) /* note: log2litLengthSum cancel out */
+ - WEIGHT(optPtr->litLengthFreq[llCode], optLevel);
#if 1
return contribution;
#else
@@ -155,10 +261,11 @@ static int ZSTD_litLengthContribution(U32 const litLength, const optState_t* con
* which can be compared to the ending cost of a match
* should a new match start at this position */
static int ZSTD_literalsContribution(const BYTE* const literals, U32 const litLength,
- const optState_t* const optPtr)
+ const optState_t* const optPtr,
+ int optLevel)
{
- int const contribution = ZSTD_rawLiteralsCost(literals, litLength, optPtr)
- + ZSTD_litLengthContribution(litLength, optPtr);
+ int const contribution = ZSTD_rawLiteralsCost(literals, litLength, optPtr, optLevel)
+ + ZSTD_litLengthContribution(litLength, optPtr, optLevel);
return contribution;
}
@@ -166,31 +273,38 @@ static int ZSTD_literalsContribution(const BYTE* const literals, U32 const litLe
* Provides the cost of the match part (offset + matchLength) of a sequence
* Must be combined with ZSTD_fullLiteralsCost() to get the full cost of a sequence.
* optLevel: when <2, favors small offset for decompression speed (improved cache efficiency) */
-FORCE_INLINE_TEMPLATE U32 ZSTD_getMatchPrice(
- U32 const offset, U32 const matchLength,
- const optState_t* const optPtr,
- int const optLevel)
+FORCE_INLINE_TEMPLATE U32
+ZSTD_getMatchPrice(U32 const offset,
+ U32 const matchLength,
+ const optState_t* const optPtr,
+ int const optLevel)
{
U32 price;
U32 const offCode = ZSTD_highbit32(offset+1);
U32 const mlBase = matchLength - MINMATCH;
assert(matchLength >= MINMATCH);
- if (optPtr->staticPrices) /* fixed scheme, do not use statistics */
- return ZSTD_highbit32((U32)mlBase+1) + 16 + offCode;
+ if (optPtr->priceType == zop_predef) /* fixed scheme, do not use statistics */
+ return WEIGHT(mlBase, optLevel) + ((16 + offCode) * BITCOST_MULTIPLIER);
- price = offCode + optPtr->log2offCodeSum - ZSTD_highbit32(optPtr->offCodeFreq[offCode]+1);
- if ((optLevel<2) /*static*/ && offCode >= 20) price += (offCode-19)*2; /* handicap for long distance offsets, favor decompression speed */
+ /* dynamic statistics */
+ price = (offCode * BITCOST_MULTIPLIER) + (optPtr->offCodeSumBasePrice - WEIGHT(optPtr->offCodeFreq[offCode], optLevel));
+ if ((optLevel<2) /*static*/ && offCode >= 20)
+ price += (offCode-19)*2 * BITCOST_MULTIPLIER; /* handicap for long distance offsets, favor decompression speed */
/* match Length */
{ U32 const mlCode = ZSTD_MLcode(mlBase);
- price += ML_bits[mlCode] + optPtr->log2matchLengthSum - ZSTD_highbit32(optPtr->matchLengthFreq[mlCode]+1);
+ price += (ML_bits[mlCode] * BITCOST_MULTIPLIER) + (optPtr->matchLengthSumBasePrice - WEIGHT(optPtr->matchLengthFreq[mlCode], optLevel));
}
+ price += BITCOST_MULTIPLIER / 5; /* heuristic : make matches a bit more costly to favor less sequences -> faster decompression speed */
+
DEBUGLOG(8, "ZSTD_getMatchPrice(ml:%u) = %u", matchLength, price);
return price;
}
+/* ZSTD_updateStats() :
+ * assumption : literals + litLengtn <= iend */
static void ZSTD_updateStats(optState_t* const optPtr,
U32 litLength, const BYTE* literals,
U32 offsetCode, U32 matchLength)
@@ -269,10 +383,11 @@ static U32 ZSTD_insertAndFindFirstIndexHash3 (ZSTD_matchState_t* ms, const BYTE*
* ip : assumed <= iend-8 .
* @return : nb of positions added */
static U32 ZSTD_insertBt1(
- ZSTD_matchState_t* ms, ZSTD_compressionParameters const* cParams,
+ ZSTD_matchState_t* ms,
const BYTE* const ip, const BYTE* const iend,
- U32 const mls, U32 const extDict)
+ U32 const mls, const int extDict)
{
+ const ZSTD_compressionParameters* const cParams = &ms->cParams;
U32* const hashTable = ms->hashTable;
U32 const hashLog = cParams->hashLog;
size_t const h = ZSTD_hashPtr(ip, hashLog, mls);
@@ -308,7 +423,8 @@ static U32 ZSTD_insertBt1(
assert(ip <= iend-8); /* required for h calculation */
hashTable[h] = current; /* Update Hash Table */
- while (nbCompares-- && (matchIndex > windowLow)) {
+ assert(windowLow > 0);
+ while (nbCompares-- && (matchIndex >= windowLow)) {
U32* const nextPtr = bt + 2*(matchIndex & btMask);
size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */
assert(matchIndex < current);
@@ -334,8 +450,8 @@ static U32 ZSTD_insertBt1(
}
#endif
- if ((!extDict) || (matchIndex+matchLength >= dictLimit)) {
- assert(matchIndex+matchLength >= dictLimit); /* might be wrong if extDict is incorrectly set to 0 */
+ if (!extDict || (matchIndex+matchLength >= dictLimit)) {
+ assert(matchIndex+matchLength >= dictLimit); /* might be wrong if actually extDict */
match = base + matchIndex;
matchLength += ZSTD_count(ip+matchLength, match+matchLength, iend);
} else {
@@ -379,35 +495,36 @@ static U32 ZSTD_insertBt1(
FORCE_INLINE_TEMPLATE
void ZSTD_updateTree_internal(
- ZSTD_matchState_t* ms, ZSTD_compressionParameters const* cParams,
+ ZSTD_matchState_t* ms,
const BYTE* const ip, const BYTE* const iend,
- const U32 mls, const U32 extDict)
+ const U32 mls, const ZSTD_dictMode_e dictMode)
{
const BYTE* const base = ms->window.base;
U32 const target = (U32)(ip - base);
U32 idx = ms->nextToUpdate;
- DEBUGLOG(7, "ZSTD_updateTree_internal, from %u to %u (extDict:%u)",
- idx, target, extDict);
+ DEBUGLOG(6, "ZSTD_updateTree_internal, from %u to %u (dictMode:%u)",
+ idx, target, dictMode);
while(idx < target)
- idx += ZSTD_insertBt1(ms, cParams, base+idx, iend, mls, extDict);
+ idx += ZSTD_insertBt1(ms, base+idx, iend, mls, dictMode == ZSTD_extDict);
ms->nextToUpdate = target;
}
-void ZSTD_updateTree(
- ZSTD_matchState_t* ms, ZSTD_compressionParameters const* cParams,
- const BYTE* ip, const BYTE* iend)
-{
- ZSTD_updateTree_internal(ms, cParams, ip, iend, cParams->searchLength, 0 /*extDict*/);
+void ZSTD_updateTree(ZSTD_matchState_t* ms, const BYTE* ip, const BYTE* iend) {
+ ZSTD_updateTree_internal(ms, ip, iend, ms->cParams.minMatch, ZSTD_noDict);
}
FORCE_INLINE_TEMPLATE
U32 ZSTD_insertBtAndGetAllMatches (
- ZSTD_matchState_t* ms, ZSTD_compressionParameters const* cParams,
- const BYTE* const ip, const BYTE* const iLimit, int const extDict,
- U32 rep[ZSTD_REP_NUM], U32 const ll0,
- ZSTD_match_t* matches, const U32 lengthToBeat, U32 const mls /* template */)
+ ZSTD_matchState_t* ms,
+ const BYTE* const ip, const BYTE* const iLimit, const ZSTD_dictMode_e dictMode,
+ U32 rep[ZSTD_REP_NUM],
+ U32 const ll0, /* tells if associated literal length is 0 or not. This value must be 0 or 1 */
+ ZSTD_match_t* matches,
+ const U32 lengthToBeat,
+ U32 const mls /* template */)
{
+ const ZSTD_compressionParameters* const cParams = &ms->cParams;
U32 const sufficient_len = MIN(cParams->targetLength, ZSTD_OPT_NUM -1);
const BYTE* const base = ms->window.base;
U32 const current = (U32)(ip-base);
@@ -426,6 +543,7 @@ U32 ZSTD_insertBtAndGetAllMatches (
const BYTE* const prefixStart = base + dictLimit;
U32 const btLow = btMask >= current ? 0 : current - btMask;
U32 const windowLow = ms->window.lowLimit;
+ U32 const matchLow = windowLow ? windowLow : 1;
U32* smallerPtr = bt + 2*(current&btMask);
U32* largerPtr = bt + 2*(current&btMask) + 1;
U32 matchEndIdx = current+8+1; /* farthest referenced position of any match => detects repetitive patterns */
@@ -433,10 +551,24 @@ U32 ZSTD_insertBtAndGetAllMatches (
U32 mnum = 0;
U32 nbCompares = 1U << cParams->searchLog;
+ const ZSTD_matchState_t* dms = dictMode == ZSTD_dictMatchState ? ms->dictMatchState : NULL;
+ const ZSTD_compressionParameters* const dmsCParams =
+ dictMode == ZSTD_dictMatchState ? &dms->cParams : NULL;
+ const BYTE* const dmsBase = dictMode == ZSTD_dictMatchState ? dms->window.base : NULL;
+ const BYTE* const dmsEnd = dictMode == ZSTD_dictMatchState ? dms->window.nextSrc : NULL;
+ U32 const dmsHighLimit = dictMode == ZSTD_dictMatchState ? (U32)(dmsEnd - dmsBase) : 0;
+ U32 const dmsLowLimit = dictMode == ZSTD_dictMatchState ? dms->window.lowLimit : 0;
+ U32 const dmsIndexDelta = dictMode == ZSTD_dictMatchState ? windowLow - dmsHighLimit : 0;
+ U32 const dmsHashLog = dictMode == ZSTD_dictMatchState ? dmsCParams->hashLog : hashLog;
+ U32 const dmsBtLog = dictMode == ZSTD_dictMatchState ? dmsCParams->chainLog - 1 : btLog;
+ U32 const dmsBtMask = dictMode == ZSTD_dictMatchState ? (1U << dmsBtLog) - 1 : 0;
+ U32 const dmsBtLow = dictMode == ZSTD_dictMatchState && dmsBtMask < dmsHighLimit - dmsLowLimit ? dmsHighLimit - dmsBtMask : dmsLowLimit;
+
size_t bestLength = lengthToBeat-1;
- DEBUGLOG(7, "ZSTD_insertBtAndGetAllMatches");
+ DEBUGLOG(8, "ZSTD_insertBtAndGetAllMatches: current=%u", current);
/* check repCode */
+ assert(ll0 <= 1); /* necessarily 1 or 0 */
{ U32 const lastR = ZSTD_REP_NUM + ll0;
U32 repCode;
for (repCode = ll0; repCode < lastR; repCode++) {
@@ -449,18 +581,26 @@ U32 ZSTD_insertBtAndGetAllMatches (
repLen = (U32)ZSTD_count(ip+minMatch, ip+minMatch-repOffset, iLimit) + minMatch;
}
} else { /* repIndex < dictLimit || repIndex >= current */
- const BYTE* const repMatch = dictBase + repIndex;
+ const BYTE* const repMatch = dictMode == ZSTD_dictMatchState ?
+ dmsBase + repIndex - dmsIndexDelta :
+ dictBase + repIndex;
assert(current >= windowLow);
- if ( extDict /* this case only valid in extDict mode */
+ if ( dictMode == ZSTD_extDict
&& ( ((repOffset-1) /*intentional overflow*/ < current - windowLow) /* equivalent to `current > repIndex >= windowLow` */
& (((U32)((dictLimit-1) - repIndex) >= 3) ) /* intentional overflow : do not test positions overlapping 2 memory segments */)
&& (ZSTD_readMINMATCH(ip, minMatch) == ZSTD_readMINMATCH(repMatch, minMatch)) ) {
repLen = (U32)ZSTD_count_2segments(ip+minMatch, repMatch+minMatch, iLimit, dictEnd, prefixStart) + minMatch;
+ }
+ if (dictMode == ZSTD_dictMatchState
+ && ( ((repOffset-1) /*intentional overflow*/ < current - (dmsLowLimit + dmsIndexDelta)) /* equivalent to `current > repIndex >= dmsLowLimit` */
+ & ((U32)((dictLimit-1) - repIndex) >= 3) ) /* intentional overflow : do not test positions overlapping 2 memory segments */
+ && (ZSTD_readMINMATCH(ip, minMatch) == ZSTD_readMINMATCH(repMatch, minMatch)) ) {
+ repLen = (U32)ZSTD_count_2segments(ip+minMatch, repMatch+minMatch, iLimit, dmsEnd, prefixStart) + minMatch;
} }
/* save longer solution */
if (repLen > bestLength) {
- DEBUGLOG(8, "found rep-match %u of length %u",
- repCode - ll0, (U32)repLen);
+ DEBUGLOG(8, "found repCode %u (ll0:%u, offset:%u) of length %u",
+ repCode, ll0, repOffset, repLen);
bestLength = repLen;
matches[mnum].off = repCode - ll0;
matches[mnum].len = (U32)repLen;
@@ -473,10 +613,10 @@ U32 ZSTD_insertBtAndGetAllMatches (
/* HC3 match finder */
if ((mls == 3) /*static*/ && (bestLength < mls)) {
U32 const matchIndex3 = ZSTD_insertAndFindFirstIndexHash3(ms, ip);
- if ((matchIndex3 > windowLow)
+ if ((matchIndex3 >= matchLow)
& (current - matchIndex3 < (1<<18)) /*heuristic : longer distance likely too expensive*/ ) {
size_t mlen;
- if ((!extDict) /*static*/ || (matchIndex3 >= dictLimit)) {
+ if ((dictMode == ZSTD_noDict) /*static*/ || (dictMode == ZSTD_dictMatchState) /*static*/ || (matchIndex3 >= dictLimit)) {
const BYTE* const match = base + matchIndex3;
mlen = ZSTD_count(ip, match, iLimit);
} else {
@@ -498,17 +638,21 @@ U32 ZSTD_insertBtAndGetAllMatches (
(ip+mlen == iLimit) ) { /* best possible length */
ms->nextToUpdate = current+1; /* skip insertion */
return 1;
- } } } }
+ }
+ }
+ }
+ /* no dictMatchState lookup: dicts don't have a populated HC3 table */
+ }
hashTable[h] = current; /* Update Hash Table */
- while (nbCompares-- && (matchIndex > windowLow)) {
+ while (nbCompares-- && (matchIndex >= matchLow)) {
U32* const nextPtr = bt + 2*(matchIndex & btMask);
size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */
const BYTE* match;
assert(current > matchIndex);
- if ((!extDict) || (matchIndex+matchLength >= dictLimit)) {
+ if ((dictMode == ZSTD_noDict) || (dictMode == ZSTD_dictMatchState) || (matchIndex+matchLength >= dictLimit)) {
assert(matchIndex+matchLength >= dictLimit); /* ensure the condition is correct when !extDict */
match = base + matchIndex;
matchLength += ZSTD_count(ip+matchLength, match+matchLength, iLimit);
@@ -520,8 +664,8 @@ U32 ZSTD_insertBtAndGetAllMatches (
}
if (matchLength > bestLength) {
- DEBUGLOG(8, "found match of length %u at distance %u",
- (U32)matchLength, current - matchIndex);
+ DEBUGLOG(8, "found match of length %u at distance %u (offCode=%u)",
+ (U32)matchLength, current - matchIndex, current - matchIndex + ZSTD_REP_MOVE);
assert(matchEndIdx > matchIndex);
if (matchLength > matchEndIdx - matchIndex)
matchEndIdx = matchIndex + (U32)matchLength;
@@ -529,9 +673,10 @@ U32 ZSTD_insertBtAndGetAllMatches (
matches[mnum].off = (current - matchIndex) + ZSTD_REP_MOVE;
matches[mnum].len = (U32)matchLength;
mnum++;
- if (matchLength > ZSTD_OPT_NUM) break;
- if (ip+matchLength == iLimit) { /* equal : no way to know if inf or sup */
- break; /* drop, to preserve bt consistency (miss a little bit of compression) */
+ if ( (matchLength > ZSTD_OPT_NUM)
+ | (ip+matchLength == iLimit) /* equal : no way to know if inf or sup */) {
+ if (dictMode == ZSTD_dictMatchState) nbCompares = 0; /* break should also skip searching dms */
+ break; /* drop, to preserve bt consistency (miss a little bit of compression) */
}
}
@@ -552,6 +697,47 @@ U32 ZSTD_insertBtAndGetAllMatches (
*smallerPtr = *largerPtr = 0;
+ if (dictMode == ZSTD_dictMatchState && nbCompares) {
+ size_t const dmsH = ZSTD_hashPtr(ip, dmsHashLog, mls);
+ U32 dictMatchIndex = dms->hashTable[dmsH];
+ const U32* const dmsBt = dms->chainTable;
+ commonLengthSmaller = commonLengthLarger = 0;
+ while (nbCompares-- && (dictMatchIndex > dmsLowLimit)) {
+ const U32* const nextPtr = dmsBt + 2*(dictMatchIndex & dmsBtMask);
+ size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */
+ const BYTE* match = dmsBase + dictMatchIndex;
+ matchLength += ZSTD_count_2segments(ip+matchLength, match+matchLength, iLimit, dmsEnd, prefixStart);
+ if (dictMatchIndex+matchLength >= dmsHighLimit)
+ match = base + dictMatchIndex + dmsIndexDelta; /* to prepare for next usage of match[matchLength] */
+
+ if (matchLength > bestLength) {
+ matchIndex = dictMatchIndex + dmsIndexDelta;
+ DEBUGLOG(8, "found dms match of length %u at distance %u (offCode=%u)",
+ (U32)matchLength, current - matchIndex, current - matchIndex + ZSTD_REP_MOVE);
+ if (matchLength > matchEndIdx - matchIndex)
+ matchEndIdx = matchIndex + (U32)matchLength;
+ bestLength = matchLength;
+ matches[mnum].off = (current - matchIndex) + ZSTD_REP_MOVE;
+ matches[mnum].len = (U32)matchLength;
+ mnum++;
+ if ( (matchLength > ZSTD_OPT_NUM)
+ | (ip+matchLength == iLimit) /* equal : no way to know if inf or sup */) {
+ break; /* drop, to guarantee consistency (miss a little bit of compression) */
+ }
+ }
+
+ if (dictMatchIndex <= dmsBtLow) { break; } /* beyond tree size, stop the search */
+ if (match[matchLength] < ip[matchLength]) {
+ commonLengthSmaller = matchLength; /* all smaller will now have at least this guaranteed common length */
+ dictMatchIndex = nextPtr[1]; /* new matchIndex larger than previous (closer to current) */
+ } else {
+ /* match is larger than current */
+ commonLengthLarger = matchLength;
+ dictMatchIndex = nextPtr[0];
+ }
+ }
+ }
+
assert(matchEndIdx > current+8);
ms->nextToUpdate = matchEndIdx - 8; /* skip repetitive patterns */
return mnum;
@@ -559,23 +745,24 @@ U32 ZSTD_insertBtAndGetAllMatches (
FORCE_INLINE_TEMPLATE U32 ZSTD_BtGetAllMatches (
- ZSTD_matchState_t* ms, ZSTD_compressionParameters const* cParams,
- const BYTE* ip, const BYTE* const iHighLimit, int const extDict,
+ ZSTD_matchState_t* ms,
+ const BYTE* ip, const BYTE* const iHighLimit, const ZSTD_dictMode_e dictMode,
U32 rep[ZSTD_REP_NUM], U32 const ll0,
ZSTD_match_t* matches, U32 const lengthToBeat)
{
- U32 const matchLengthSearch = cParams->searchLength;
- DEBUGLOG(7, "ZSTD_BtGetAllMatches");
+ const ZSTD_compressionParameters* const cParams = &ms->cParams;
+ U32 const matchLengthSearch = cParams->minMatch;
+ DEBUGLOG(8, "ZSTD_BtGetAllMatches");
if (ip < ms->window.base + ms->nextToUpdate) return 0; /* skipped area */
- ZSTD_updateTree_internal(ms, cParams, ip, iHighLimit, matchLengthSearch, extDict);
+ ZSTD_updateTree_internal(ms, ip, iHighLimit, matchLengthSearch, dictMode);
switch(matchLengthSearch)
{
- case 3 : return ZSTD_insertBtAndGetAllMatches(ms, cParams, ip, iHighLimit, extDict, rep, ll0, matches, lengthToBeat, 3);
+ case 3 : return ZSTD_insertBtAndGetAllMatches(ms, ip, iHighLimit, dictMode, rep, ll0, matches, lengthToBeat, 3);
default :
- case 4 : return ZSTD_insertBtAndGetAllMatches(ms, cParams, ip, iHighLimit, extDict, rep, ll0, matches, lengthToBeat, 4);
- case 5 : return ZSTD_insertBtAndGetAllMatches(ms, cParams, ip, iHighLimit, extDict, rep, ll0, matches, lengthToBeat, 5);
+ case 4 : return ZSTD_insertBtAndGetAllMatches(ms, ip, iHighLimit, dictMode, rep, ll0, matches, lengthToBeat, 4);
+ case 5 : return ZSTD_insertBtAndGetAllMatches(ms, ip, iHighLimit, dictMode, rep, ll0, matches, lengthToBeat, 5);
case 7 :
- case 6 : return ZSTD_insertBtAndGetAllMatches(ms, cParams, ip, iHighLimit, extDict, rep, ll0, matches, lengthToBeat, 6);
+ case 6 : return ZSTD_insertBtAndGetAllMatches(ms, ip, iHighLimit, dictMode, rep, ll0, matches, lengthToBeat, 6);
}
}
@@ -587,7 +774,7 @@ typedef struct repcodes_s {
U32 rep[3];
} repcodes_t;
-repcodes_t ZSTD_updateRep(U32 const rep[3], U32 const offset, U32 const ll0)
+static repcodes_t ZSTD_updateRep(U32 const rep[3], U32 const offset, U32 const ll0)
{
repcodes_t newReps;
if (offset >= ZSTD_REP_NUM) { /* full offset */
@@ -609,65 +796,35 @@ repcodes_t ZSTD_updateRep(U32 const rep[3], U32 const offset, U32 const ll0)
}
-typedef struct {
- const BYTE* anchor;
- U32 litlen;
- U32 rawLitCost;
-} cachedLiteralPrice_t;
-
-static U32 ZSTD_rawLiteralsCost_cached(
- cachedLiteralPrice_t* const cachedLitPrice,
- const BYTE* const anchor, U32 const litlen,
- const optState_t* const optStatePtr)
+static U32 ZSTD_totalLen(ZSTD_optimal_t sol)
{
- U32 startCost;
- U32 remainingLength;
- const BYTE* startPosition;
-
- if (anchor == cachedLitPrice->anchor) {
- startCost = cachedLitPrice->rawLitCost;
- startPosition = anchor + cachedLitPrice->litlen;
- assert(litlen >= cachedLitPrice->litlen);
- remainingLength = litlen - cachedLitPrice->litlen;
- } else {
- startCost = 0;
- startPosition = anchor;
- remainingLength = litlen;
- }
-
- { U32 const rawLitCost = startCost + ZSTD_rawLiteralsCost(startPosition, remainingLength, optStatePtr);
- cachedLitPrice->anchor = anchor;
- cachedLitPrice->litlen = litlen;
- cachedLitPrice->rawLitCost = rawLitCost;
- return rawLitCost;
- }
+ return sol.litlen + sol.mlen;
}
-static U32 ZSTD_fullLiteralsCost_cached(
- cachedLiteralPrice_t* const cachedLitPrice,
- const BYTE* const anchor, U32 const litlen,
- const optState_t* const optStatePtr)
-{
- return ZSTD_rawLiteralsCost_cached(cachedLitPrice, anchor, litlen, optStatePtr)
- + ZSTD_litLengthPrice(litlen, optStatePtr);
-}
+#if 0 /* debug */
-static int ZSTD_literalsContribution_cached(
- cachedLiteralPrice_t* const cachedLitPrice,
- const BYTE* const anchor, U32 const litlen,
- const optState_t* const optStatePtr)
+static void
+listStats(const U32* table, int lastEltID)
{
- int const contribution = ZSTD_rawLiteralsCost_cached(cachedLitPrice, anchor, litlen, optStatePtr)
- + ZSTD_litLengthContribution(litlen, optStatePtr);
- return contribution;
+ int const nbElts = lastEltID + 1;
+ int enb;
+ for (enb=0; enb < nbElts; enb++) {
+ (void)table;
+ //RAWLOG(2, "%3i:%3i, ", enb, table[enb]);
+ RAWLOG(2, "%4i,", table[enb]);
+ }
+ RAWLOG(2, " \n");
}
-FORCE_INLINE_TEMPLATE
-size_t ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms,seqStore_t* seqStore,
- U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams,
- const void* src, size_t srcSize,
- const int optLevel, const int extDict)
+#endif
+
+FORCE_INLINE_TEMPLATE size_t
+ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms,
+ seqStore_t* seqStore,
+ U32 rep[ZSTD_REP_NUM],
+ const void* src, size_t srcSize,
+ const int optLevel,
+ const ZSTD_dictMode_e dictMode)
{
optState_t* const optStatePtr = &ms->opt;
const BYTE* const istart = (const BYTE*)src;
@@ -677,72 +834,77 @@ size_t ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms,seqStore_t* seqStore
const BYTE* const ilimit = iend - 8;
const BYTE* const base = ms->window.base;
const BYTE* const prefixStart = base + ms->window.dictLimit;
+ const ZSTD_compressionParameters* const cParams = &ms->cParams;
U32 const sufficient_len = MIN(cParams->targetLength, ZSTD_OPT_NUM -1);
- U32 const minMatch = (cParams->searchLength == 3) ? 3 : 4;
+ U32 const minMatch = (cParams->minMatch == 3) ? 3 : 4;
ZSTD_optimal_t* const opt = optStatePtr->priceTable;
ZSTD_match_t* const matches = optStatePtr->matchTable;
- cachedLiteralPrice_t cachedLitPrice;
+ ZSTD_optimal_t lastSequence;
/* init */
- DEBUGLOG(5, "ZSTD_compressBlock_opt_generic");
+ DEBUGLOG(5, "ZSTD_compressBlock_opt_generic: current=%u, prefix=%u, nextToUpdate=%u",
+ (U32)(ip - base), ms->window.dictLimit, ms->nextToUpdate);
+ assert(optLevel <= 2);
ms->nextToUpdate3 = ms->nextToUpdate;
- ZSTD_rescaleFreqs(optStatePtr, (const BYTE*)src, srcSize);
+ ZSTD_rescaleFreqs(optStatePtr, (const BYTE*)src, srcSize, optLevel);
ip += (ip==prefixStart);
- memset(&cachedLitPrice, 0, sizeof(cachedLitPrice));
/* Match Loop */
while (ip < ilimit) {
U32 cur, last_pos = 0;
- U32 best_mlen, best_off;
/* find first match */
{ U32 const litlen = (U32)(ip - anchor);
U32 const ll0 = !litlen;
- U32 const nbMatches = ZSTD_BtGetAllMatches(ms, cParams, ip, iend, extDict, rep, ll0, matches, minMatch);
+ U32 const nbMatches = ZSTD_BtGetAllMatches(ms, ip, iend, dictMode, rep, ll0, matches, minMatch);
if (!nbMatches) { ip++; continue; }
/* initialize opt[0] */
{ U32 i ; for (i=0; i<ZSTD_REP_NUM; i++) opt[0].rep[i] = rep[i]; }
- opt[0].mlen = 1;
+ opt[0].mlen = 0; /* means is_a_literal */
opt[0].litlen = litlen;
+ opt[0].price = ZSTD_literalsContribution(anchor, litlen, optStatePtr, optLevel);
/* large match -> immediate encoding */
{ U32 const maxML = matches[nbMatches-1].len;
- DEBUGLOG(7, "found %u matches of maxLength=%u and offset=%u at cPos=%u => start new serie",
- nbMatches, maxML, matches[nbMatches-1].off, (U32)(ip-prefixStart));
+ U32 const maxOffset = matches[nbMatches-1].off;
+ DEBUGLOG(6, "found %u matches of maxLength=%u and maxOffCode=%u at cPos=%u => start new serie",
+ nbMatches, maxML, maxOffset, (U32)(ip-prefixStart));
if (maxML > sufficient_len) {
- best_mlen = maxML;
- best_off = matches[nbMatches-1].off;
- DEBUGLOG(7, "large match (%u>%u), immediate encoding",
- best_mlen, sufficient_len);
+ lastSequence.litlen = litlen;
+ lastSequence.mlen = maxML;
+ lastSequence.off = maxOffset;
+ DEBUGLOG(6, "large match (%u>%u), immediate encoding",
+ maxML, sufficient_len);
cur = 0;
- last_pos = 1;
+ last_pos = ZSTD_totalLen(lastSequence);
goto _shortestPath;
} }
/* set prices for first matches starting position == 0 */
- { U32 const literalsPrice = ZSTD_fullLiteralsCost_cached(&cachedLitPrice, anchor, litlen, optStatePtr);
+ { U32 const literalsPrice = opt[0].price + ZSTD_litLengthPrice(0, optStatePtr, optLevel);
U32 pos;
U32 matchNb;
- for (pos = 0; pos < minMatch; pos++) {
- opt[pos].mlen = 1;
- opt[pos].price = ZSTD_MAX_PRICE;
+ for (pos = 1; pos < minMatch; pos++) {
+ opt[pos].price = ZSTD_MAX_PRICE; /* mlen, litlen and price will be fixed during forward scanning */
}
for (matchNb = 0; matchNb < nbMatches; matchNb++) {
U32 const offset = matches[matchNb].off;
U32 const end = matches[matchNb].len;
repcodes_t const repHistory = ZSTD_updateRep(rep, offset, ll0);
for ( ; pos <= end ; pos++ ) {
- U32 const matchPrice = literalsPrice + ZSTD_getMatchPrice(offset, pos, optStatePtr, optLevel);
- DEBUGLOG(7, "rPos:%u => set initial price : %u",
- pos, matchPrice);
+ U32 const matchPrice = ZSTD_getMatchPrice(offset, pos, optStatePtr, optLevel);
+ U32 const sequencePrice = literalsPrice + matchPrice;
+ DEBUGLOG(7, "rPos:%u => set initial price : %.2f",
+ pos, ZSTD_fCost(sequencePrice));
opt[pos].mlen = pos;
opt[pos].off = offset;
opt[pos].litlen = litlen;
- opt[pos].price = matchPrice;
+ opt[pos].price = sequencePrice;
+ ZSTD_STATIC_ASSERT(sizeof(opt[pos].rep) == sizeof(repHistory));
memcpy(opt[pos].rep, &repHistory, sizeof(repHistory));
} }
last_pos = pos-1;
@@ -753,55 +915,67 @@ size_t ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms,seqStore_t* seqStore
for (cur = 1; cur <= last_pos; cur++) {
const BYTE* const inr = ip + cur;
assert(cur < ZSTD_OPT_NUM);
+ DEBUGLOG(7, "cPos:%zi==rPos:%u", inr-istart, cur)
/* Fix current position with one literal if cheaper */
- { U32 const litlen = (opt[cur-1].mlen == 1) ? opt[cur-1].litlen + 1 : 1;
- int price; /* note : contribution can be negative */
- if (cur > litlen) {
- price = opt[cur - litlen].price + ZSTD_literalsContribution(inr-litlen, litlen, optStatePtr);
- } else {
- price = ZSTD_literalsContribution_cached(&cachedLitPrice, anchor, litlen, optStatePtr);
- }
+ { U32 const litlen = (opt[cur-1].mlen == 0) ? opt[cur-1].litlen + 1 : 1;
+ int const price = opt[cur-1].price
+ + ZSTD_rawLiteralsCost(ip+cur-1, 1, optStatePtr, optLevel)
+ + ZSTD_litLengthPrice(litlen, optStatePtr, optLevel)
+ - ZSTD_litLengthPrice(litlen-1, optStatePtr, optLevel);
assert(price < 1000000000); /* overflow check */
if (price <= opt[cur].price) {
- DEBUGLOG(7, "rPos:%u : better price (%u<%u) using literal",
- cur, price, opt[cur].price);
- opt[cur].mlen = 1;
+ DEBUGLOG(7, "cPos:%zi==rPos:%u : better price (%.2f<=%.2f) using literal (ll==%u) (hist:%u,%u,%u)",
+ inr-istart, cur, ZSTD_fCost(price), ZSTD_fCost(opt[cur].price), litlen,
+ opt[cur-1].rep[0], opt[cur-1].rep[1], opt[cur-1].rep[2]);
+ opt[cur].mlen = 0;
opt[cur].off = 0;
opt[cur].litlen = litlen;
opt[cur].price = price;
memcpy(opt[cur].rep, opt[cur-1].rep, sizeof(opt[cur].rep));
- } }
+ } else {
+ DEBUGLOG(7, "cPos:%zi==rPos:%u : literal would cost more (%.2f>%.2f) (hist:%u,%u,%u)",
+ inr-istart, cur, ZSTD_fCost(price), ZSTD_fCost(opt[cur].price),
+ opt[cur].rep[0], opt[cur].rep[1], opt[cur].rep[2]);
+ }
+ }
/* last match must start at a minimum distance of 8 from oend */
if (inr > ilimit) continue;
if (cur == last_pos) break;
- if ( (optLevel==0) /*static*/
- && (opt[cur+1].price <= opt[cur].price) )
+ if ( (optLevel==0) /*static_test*/
+ && (opt[cur+1].price <= opt[cur].price + (BITCOST_MULTIPLIER/2)) ) {
+ DEBUGLOG(7, "move to next rPos:%u : price is <=", cur+1);
continue; /* skip unpromising positions; about ~+6% speed, -0.01 ratio */
+ }
- { U32 const ll0 = (opt[cur].mlen != 1);
- U32 const litlen = (opt[cur].mlen == 1) ? opt[cur].litlen : 0;
- U32 const previousPrice = (cur > litlen) ? opt[cur-litlen].price : 0;
- U32 const basePrice = previousPrice + ZSTD_fullLiteralsCost(inr-litlen, litlen, optStatePtr);
- U32 const nbMatches = ZSTD_BtGetAllMatches(ms, cParams, inr, iend, extDict, opt[cur].rep, ll0, matches, minMatch);
+ { U32 const ll0 = (opt[cur].mlen != 0);
+ U32 const litlen = (opt[cur].mlen == 0) ? opt[cur].litlen : 0;
+ U32 const previousPrice = opt[cur].price;
+ U32 const basePrice = previousPrice + ZSTD_litLengthPrice(0, optStatePtr, optLevel);
+ U32 const nbMatches = ZSTD_BtGetAllMatches(ms, inr, iend, dictMode, opt[cur].rep, ll0, matches, minMatch);
U32 matchNb;
- if (!nbMatches) continue;
+ if (!nbMatches) {
+ DEBUGLOG(7, "rPos:%u : no match found", cur);
+ continue;
+ }
{ U32 const maxML = matches[nbMatches-1].len;
- DEBUGLOG(7, "rPos:%u, found %u matches, of maxLength=%u",
- cur, nbMatches, maxML);
+ DEBUGLOG(7, "cPos:%zi==rPos:%u, found %u matches, of maxLength=%u",
+ inr-istart, cur, nbMatches, maxML);
if ( (maxML > sufficient_len)
- | (cur + maxML >= ZSTD_OPT_NUM) ) {
- best_mlen = maxML;
- best_off = matches[nbMatches-1].off;
- last_pos = cur + 1;
+ || (cur + maxML >= ZSTD_OPT_NUM) ) {
+ lastSequence.mlen = maxML;
+ lastSequence.off = matches[nbMatches-1].off;
+ lastSequence.litlen = litlen;
+ cur -= (opt[cur].mlen==0) ? opt[cur].litlen : 0; /* last sequence is actually only literals, fix cur to last match - note : may underflow, in which case, it's first sequence, and it's okay */
+ last_pos = cur + ZSTD_totalLen(lastSequence);
+ if (cur > ZSTD_OPT_NUM) cur = 0; /* underflow => first match */
goto _shortestPath;
- }
- }
+ } }
/* set prices using matches found at position == cur */
for (matchNb = 0; matchNb < nbMatches; matchNb++) {
@@ -811,81 +985,97 @@ size_t ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms,seqStore_t* seqStore
U32 const startML = (matchNb>0) ? matches[matchNb-1].len+1 : minMatch;
U32 mlen;
- DEBUGLOG(7, "testing match %u => offCode=%u, mlen=%u, llen=%u",
+ DEBUGLOG(7, "testing match %u => offCode=%4u, mlen=%2u, llen=%2u",
matchNb, matches[matchNb].off, lastML, litlen);
- for (mlen = lastML; mlen >= startML; mlen--) {
+ for (mlen = lastML; mlen >= startML; mlen--) { /* scan downward */
U32 const pos = cur + mlen;
int const price = basePrice + ZSTD_getMatchPrice(offset, mlen, optStatePtr, optLevel);
if ((pos > last_pos) || (price < opt[pos].price)) {
- DEBUGLOG(7, "rPos:%u => new better price (%u<%u)",
- pos, price, opt[pos].price);
- while (last_pos < pos) { opt[last_pos+1].price = ZSTD_MAX_PRICE; last_pos++; }
+ DEBUGLOG(7, "rPos:%u (ml=%2u) => new better price (%.2f<%.2f)",
+ pos, mlen, ZSTD_fCost(price), ZSTD_fCost(opt[pos].price));
+ while (last_pos < pos) { opt[last_pos+1].price = ZSTD_MAX_PRICE; last_pos++; } /* fill empty positions */
opt[pos].mlen = mlen;
opt[pos].off = offset;
opt[pos].litlen = litlen;
opt[pos].price = price;
+ ZSTD_STATIC_ASSERT(sizeof(opt[pos].rep) == sizeof(repHistory));
memcpy(opt[pos].rep, &repHistory, sizeof(repHistory));
} else {
- if (optLevel==0) break; /* gets ~+10% speed for about -0.01 ratio loss */
+ DEBUGLOG(7, "rPos:%u (ml=%2u) => new price is worse (%.2f>=%.2f)",
+ pos, mlen, ZSTD_fCost(price), ZSTD_fCost(opt[pos].price));
+ if (optLevel==0) break; /* early update abort; gets ~+10% speed for about -0.01 ratio loss */
}
} } }
} /* for (cur = 1; cur <= last_pos; cur++) */
- best_mlen = opt[last_pos].mlen;
- best_off = opt[last_pos].off;
- cur = last_pos - best_mlen;
+ lastSequence = opt[last_pos];
+ cur = last_pos > ZSTD_totalLen(lastSequence) ? last_pos - ZSTD_totalLen(lastSequence) : 0; /* single sequence, and it starts before `ip` */
+ assert(cur < ZSTD_OPT_NUM); /* control overflow*/
_shortestPath: /* cur, last_pos, best_mlen, best_off have to be set */
- assert(opt[0].mlen == 1);
-
- /* reverse traversal */
- DEBUGLOG(7, "start reverse traversal (last_pos:%u, cur:%u)",
- last_pos, cur);
- { U32 selectedMatchLength = best_mlen;
- U32 selectedOffset = best_off;
- U32 pos = cur;
- while (1) {
- U32 const mlen = opt[pos].mlen;
- U32 const off = opt[pos].off;
- opt[pos].mlen = selectedMatchLength;
- opt[pos].off = selectedOffset;
- selectedMatchLength = mlen;
- selectedOffset = off;
- if (mlen > pos) break;
- pos -= mlen;
- } }
-
- /* save sequences */
- { U32 pos;
- for (pos=0; pos < last_pos; ) {
- U32 const llen = (U32)(ip - anchor);
- U32 const mlen = opt[pos].mlen;
- U32 const offset = opt[pos].off;
- if (mlen == 1) { ip++; pos++; continue; } /* literal position => move on */
- pos += mlen; ip += mlen;
-
- /* repcodes update : like ZSTD_updateRep(), but update in place */
- if (offset >= ZSTD_REP_NUM) { /* full offset */
- rep[2] = rep[1];
- rep[1] = rep[0];
- rep[0] = offset - ZSTD_REP_MOVE;
- } else { /* repcode */
- U32 const repCode = offset + (llen==0);
- if (repCode) { /* note : if repCode==0, no change */
- U32 const currentOffset = (repCode==ZSTD_REP_NUM) ? (rep[0] - 1) : rep[repCode];
- if (repCode >= 2) rep[2] = rep[1];
- rep[1] = rep[0];
- rep[0] = currentOffset;
+ assert(opt[0].mlen == 0);
+
+ { U32 const storeEnd = cur + 1;
+ U32 storeStart = storeEnd;
+ U32 seqPos = cur;
+
+ DEBUGLOG(6, "start reverse traversal (last_pos:%u, cur:%u)",
+ last_pos, cur); (void)last_pos;
+ assert(storeEnd < ZSTD_OPT_NUM);
+ DEBUGLOG(6, "last sequence copied into pos=%u (llen=%u,mlen=%u,ofc=%u)",
+ storeEnd, lastSequence.litlen, lastSequence.mlen, lastSequence.off);
+ opt[storeEnd] = lastSequence;
+ while (seqPos > 0) {
+ U32 const backDist = ZSTD_totalLen(opt[seqPos]);
+ storeStart--;
+ DEBUGLOG(6, "sequence from rPos=%u copied into pos=%u (llen=%u,mlen=%u,ofc=%u)",
+ seqPos, storeStart, opt[seqPos].litlen, opt[seqPos].mlen, opt[seqPos].off);
+ opt[storeStart] = opt[seqPos];
+ seqPos = (seqPos > backDist) ? seqPos - backDist : 0;
+ }
+
+ /* save sequences */
+ DEBUGLOG(6, "sending selected sequences into seqStore")
+ { U32 storePos;
+ for (storePos=storeStart; storePos <= storeEnd; storePos++) {
+ U32 const llen = opt[storePos].litlen;
+ U32 const mlen = opt[storePos].mlen;
+ U32 const offCode = opt[storePos].off;
+ U32 const advance = llen + mlen;
+ DEBUGLOG(6, "considering seq starting at %zi, llen=%u, mlen=%u",
+ anchor - istart, (unsigned)llen, (unsigned)mlen);
+
+ if (mlen==0) { /* only literals => must be last "sequence", actually starting a new stream of sequences */
+ assert(storePos == storeEnd); /* must be last sequence */
+ ip = anchor + llen; /* last "sequence" is a bunch of literals => don't progress anchor */
+ continue; /* will finish */
}
- }
- ZSTD_updateStats(optStatePtr, llen, anchor, offset, mlen);
- ZSTD_storeSeq(seqStore, llen, anchor, offset, mlen-MINMATCH);
- anchor = ip;
- } }
- ZSTD_setLog2Prices(optStatePtr);
+ /* repcodes update : like ZSTD_updateRep(), but update in place */
+ if (offCode >= ZSTD_REP_NUM) { /* full offset */
+ rep[2] = rep[1];
+ rep[1] = rep[0];
+ rep[0] = offCode - ZSTD_REP_MOVE;
+ } else { /* repcode */
+ U32 const repCode = offCode + (llen==0);
+ if (repCode) { /* note : if repCode==0, no change */
+ U32 const currentOffset = (repCode==ZSTD_REP_NUM) ? (rep[0] - 1) : rep[repCode];
+ if (repCode >= 2) rep[2] = rep[1];
+ rep[1] = rep[0];
+ rep[0] = currentOffset;
+ } }
+
+ assert(anchor + llen <= iend);
+ ZSTD_updateStats(optStatePtr, llen, anchor, offCode, mlen);
+ ZSTD_storeSeq(seqStore, llen, anchor, offCode, mlen-MINMATCH);
+ anchor += advance;
+ ip = anchor;
+ } }
+ ZSTD_setBasePrices(optStatePtr, optLevel);
+ }
+
} /* while (ip < ilimit) */
/* Return the last literals size */
@@ -895,29 +1085,133 @@ _shortestPath: /* cur, last_pos, best_mlen, best_off have to be set */
size_t ZSTD_compressBlock_btopt(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize)
+ const void* src, size_t srcSize)
{
DEBUGLOG(5, "ZSTD_compressBlock_btopt");
- return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, cParams, src, srcSize, 0 /*optLevel*/, 0 /*extDict*/);
+ return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 0 /*optLevel*/, ZSTD_noDict);
+}
+
+
+/* used in 2-pass strategy */
+static U32 ZSTD_upscaleStat(unsigned* table, U32 lastEltIndex, int bonus)
+{
+ U32 s, sum=0;
+ assert(ZSTD_FREQ_DIV+bonus >= 0);
+ for (s=0; s<lastEltIndex+1; s++) {
+ table[s] <<= ZSTD_FREQ_DIV+bonus;
+ table[s]--;
+ sum += table[s];
+ }
+ return sum;
+}
+
+/* used in 2-pass strategy */
+MEM_STATIC void ZSTD_upscaleStats(optState_t* optPtr)
+{
+ optPtr->litSum = ZSTD_upscaleStat(optPtr->litFreq, MaxLit, 0);
+ optPtr->litLengthSum = ZSTD_upscaleStat(optPtr->litLengthFreq, MaxLL, 0);
+ optPtr->matchLengthSum = ZSTD_upscaleStat(optPtr->matchLengthFreq, MaxML, 0);
+ optPtr->offCodeSum = ZSTD_upscaleStat(optPtr->offCodeFreq, MaxOff, 0);
+}
+
+/* ZSTD_initStats_ultra():
+ * make a first compression pass, just to seed stats with more accurate starting values.
+ * only works on first block, with no dictionary and no ldm.
+ * this function cannot error, hence its constract must be respected.
+ */
+static void
+ZSTD_initStats_ultra(ZSTD_matchState_t* ms,
+ seqStore_t* seqStore,
+ U32 rep[ZSTD_REP_NUM],
+ const void* src, size_t srcSize)
+{
+ U32 tmpRep[ZSTD_REP_NUM]; /* updated rep codes will sink here */
+ memcpy(tmpRep, rep, sizeof(tmpRep));
+
+ DEBUGLOG(4, "ZSTD_initStats_ultra (srcSize=%zu)", srcSize);
+ assert(ms->opt.litLengthSum == 0); /* first block */
+ assert(seqStore->sequences == seqStore->sequencesStart); /* no ldm */
+ assert(ms->window.dictLimit == ms->window.lowLimit); /* no dictionary */
+ assert(ms->window.dictLimit - ms->nextToUpdate <= 1); /* no prefix (note: intentional overflow, defined as 2-complement) */
+
+ ZSTD_compressBlock_opt_generic(ms, seqStore, tmpRep, src, srcSize, 2 /*optLevel*/, ZSTD_noDict); /* generate stats into ms->opt*/
+
+ /* invalidate first scan from history */
+ ZSTD_resetSeqStore(seqStore);
+ ms->window.base -= srcSize;
+ ms->window.dictLimit += (U32)srcSize;
+ ms->window.lowLimit = ms->window.dictLimit;
+ ms->nextToUpdate = ms->window.dictLimit;
+ ms->nextToUpdate3 = ms->window.dictLimit;
+
+ /* re-inforce weight of collected statistics */
+ ZSTD_upscaleStats(&ms->opt);
}
size_t ZSTD_compressBlock_btultra(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize)
+ const void* src, size_t srcSize)
+{
+ DEBUGLOG(5, "ZSTD_compressBlock_btultra (srcSize=%zu)", srcSize);
+ return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 2 /*optLevel*/, ZSTD_noDict);
+}
+
+size_t ZSTD_compressBlock_btultra2(
+ ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
+ const void* src, size_t srcSize)
+{
+ U32 const current = (U32)((const BYTE*)src - ms->window.base);
+ DEBUGLOG(5, "ZSTD_compressBlock_btultra2 (srcSize=%zu)", srcSize);
+
+ /* 2-pass strategy:
+ * this strategy makes a first pass over first block to collect statistics
+ * and seed next round's statistics with it.
+ * After 1st pass, function forgets everything, and starts a new block.
+ * Consequently, this can only work if no data has been previously loaded in tables,
+ * aka, no dictionary, no prefix, no ldm preprocessing.
+ * The compression ratio gain is generally small (~0.5% on first block),
+ * the cost is 2x cpu time on first block. */
+ assert(srcSize <= ZSTD_BLOCKSIZE_MAX);
+ if ( (ms->opt.litLengthSum==0) /* first block */
+ && (seqStore->sequences == seqStore->sequencesStart) /* no ldm */
+ && (ms->window.dictLimit == ms->window.lowLimit) /* no dictionary */
+ && (current == ms->window.dictLimit) /* start of frame, nothing already loaded nor skipped */
+ && (srcSize > ZSTD_PREDEF_THRESHOLD)
+ ) {
+ ZSTD_initStats_ultra(ms, seqStore, rep, src, srcSize);
+ }
+
+ return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 2 /*optLevel*/, ZSTD_noDict);
+}
+
+size_t ZSTD_compressBlock_btopt_dictMatchState(
+ ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
+ const void* src, size_t srcSize)
+{
+ return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 0 /*optLevel*/, ZSTD_dictMatchState);
+}
+
+size_t ZSTD_compressBlock_btultra_dictMatchState(
+ ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
+ const void* src, size_t srcSize)
{
- return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, cParams, src, srcSize, 2 /*optLevel*/, 0 /*extDict*/);
+ return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 2 /*optLevel*/, ZSTD_dictMatchState);
}
size_t ZSTD_compressBlock_btopt_extDict(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize)
+ const void* src, size_t srcSize)
{
- return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, cParams, src, srcSize, 0 /*optLevel*/, 1 /*extDict*/);
+ return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 0 /*optLevel*/, ZSTD_extDict);
}
size_t ZSTD_compressBlock_btultra_extDict(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize)
+ const void* src, size_t srcSize)
{
- return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, cParams, src, srcSize, 2 /*optLevel*/, 1 /*extDict*/);
+ return ZSTD_compressBlock_opt_generic(ms, seqStore, rep, src, srcSize, 2 /*optLevel*/, ZSTD_extDict);
}
+
+/* note : no btultra2 variant for extDict nor dictMatchState,
+ * because btultra2 is not meant to work with dictionaries
+ * and is only specific for the first block (no prefix) */
diff --git a/thirdparty/zstd/compress/zstd_opt.h b/thirdparty/zstd/compress/zstd_opt.h
index b8dc389f31..094f747665 100644
--- a/thirdparty/zstd/compress/zstd_opt.h
+++ b/thirdparty/zstd/compress/zstd_opt.h
@@ -17,23 +17,37 @@ extern "C" {
#include "zstd_compress_internal.h"
-void ZSTD_updateTree(
- ZSTD_matchState_t* ms, ZSTD_compressionParameters const* cParams,
- const BYTE* ip, const BYTE* iend); /* used in ZSTD_loadDictionaryContent() */
+/* used in ZSTD_loadDictionaryContent() */
+void ZSTD_updateTree(ZSTD_matchState_t* ms, const BYTE* ip, const BYTE* iend);
size_t ZSTD_compressBlock_btopt(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize);
+ void const* src, size_t srcSize);
size_t ZSTD_compressBlock_btultra(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize);
+ void const* src, size_t srcSize);
+size_t ZSTD_compressBlock_btultra2(
+ ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
+ void const* src, size_t srcSize);
+
+
+size_t ZSTD_compressBlock_btopt_dictMatchState(
+ ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
+ void const* src, size_t srcSize);
+size_t ZSTD_compressBlock_btultra_dictMatchState(
+ ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
+ void const* src, size_t srcSize);
size_t ZSTD_compressBlock_btopt_extDict(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize);
+ void const* src, size_t srcSize);
size_t ZSTD_compressBlock_btultra_extDict(
ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
- ZSTD_compressionParameters const* cParams, void const* src, size_t srcSize);
+ void const* src, size_t srcSize);
+
+ /* note : no btultra2 variant for extDict nor dictMatchState,
+ * because btultra2 is not meant to work with dictionaries
+ * and is only specific for the first block (no prefix) */
#if defined (__cplusplus)
}
diff --git a/thirdparty/zstd/compress/zstdmt_compress.c b/thirdparty/zstd/compress/zstdmt_compress.c
index c7a205d8c7..2cbd6ffade 100644
--- a/thirdparty/zstd/compress/zstdmt_compress.c
+++ b/thirdparty/zstd/compress/zstdmt_compress.c
@@ -9,21 +9,19 @@
*/
-/* ====== Tuning parameters ====== */
-#define ZSTDMT_NBWORKERS_MAX 200
-#define ZSTDMT_JOBSIZE_MAX (MEM_32bits() ? (512 MB) : (2 GB)) /* note : limited by `jobSize` type, which is `unsigned` */
-#define ZSTDMT_OVERLAPLOG_DEFAULT 6
-
-
/* ====== Compiler specifics ====== */
#if defined(_MSC_VER)
# pragma warning(disable : 4204) /* disable: C4204: non-constant aggregate initializer */
#endif
+/* ====== Constants ====== */
+#define ZSTDMT_OVERLAPLOG_DEFAULT 0
+
+
/* ====== Dependencies ====== */
#include <string.h> /* memcpy, memset */
-#include <limits.h> /* INT_MAX */
+#include <limits.h> /* INT_MAX, UINT_MAX */
#include "pool.h" /* threadpool */
#include "threading.h" /* mutex */
#include "zstd_compress_internal.h" /* MIN, ERROR, ZSTD_*, ZSTD_highbit32 */
@@ -37,18 +35,19 @@
#define ZSTD_RESIZE_SEQPOOL 0
/* ====== Debug ====== */
-#if defined(ZSTD_DEBUG) && (ZSTD_DEBUG>=2)
+#if defined(DEBUGLEVEL) && (DEBUGLEVEL>=2) \
+ && !defined(_MSC_VER) \
+ && !defined(__MINGW32__)
# include <stdio.h>
# include <unistd.h>
# include <sys/times.h>
-# define DEBUGLOGRAW(l, ...) if (l<=ZSTD_DEBUG) { fprintf(stderr, __VA_ARGS__); }
# define DEBUG_PRINTHEX(l,p,n) { \
unsigned debug_u; \
for (debug_u=0; debug_u<(n); debug_u++) \
- DEBUGLOGRAW(l, "%02X ", ((const unsigned char*)(p))[debug_u]); \
- DEBUGLOGRAW(l, " \n"); \
+ RAWLOG(l, "%02X ", ((const unsigned char*)(p))[debug_u]); \
+ RAWLOG(l, " \n"); \
}
static unsigned long long GetCurrentClockTimeMicroseconds(void)
@@ -56,13 +55,13 @@ static unsigned long long GetCurrentClockTimeMicroseconds(void)
static clock_t _ticksPerSecond = 0;
if (_ticksPerSecond <= 0) _ticksPerSecond = sysconf(_SC_CLK_TCK);
- { struct tms junk; clock_t newTicks = (clock_t) times(&junk);
- return ((((unsigned long long)newTicks)*(1000000))/_ticksPerSecond); }
-}
+ { struct tms junk; clock_t newTicks = (clock_t) times(&junk);
+ return ((((unsigned long long)newTicks)*(1000000))/_ticksPerSecond);
+} }
#define MUTEX_WAIT_TIME_DLEVEL 6
#define ZSTD_PTHREAD_MUTEX_LOCK(mutex) { \
- if (ZSTD_DEBUG >= MUTEX_WAIT_TIME_DLEVEL) { \
+ if (DEBUGLEVEL >= MUTEX_WAIT_TIME_DLEVEL) { \
unsigned long long const beforeTime = GetCurrentClockTimeMicroseconds(); \
ZSTD_pthread_mutex_lock(mutex); \
{ unsigned long long const afterTime = GetCurrentClockTimeMicroseconds(); \
@@ -160,6 +159,25 @@ static void ZSTDMT_setBufferSize(ZSTDMT_bufferPool* const bufPool, size_t const
ZSTD_pthread_mutex_unlock(&bufPool->poolMutex);
}
+
+static ZSTDMT_bufferPool* ZSTDMT_expandBufferPool(ZSTDMT_bufferPool* srcBufPool, U32 nbWorkers)
+{
+ unsigned const maxNbBuffers = 2*nbWorkers + 3;
+ if (srcBufPool==NULL) return NULL;
+ if (srcBufPool->totalBuffers >= maxNbBuffers) /* good enough */
+ return srcBufPool;
+ /* need a larger buffer pool */
+ { ZSTD_customMem const cMem = srcBufPool->cMem;
+ size_t const bSize = srcBufPool->bufferSize; /* forward parameters */
+ ZSTDMT_bufferPool* newBufPool;
+ ZSTDMT_freeBufferPool(srcBufPool);
+ newBufPool = ZSTDMT_createBufferPool(nbWorkers, cMem);
+ if (newBufPool==NULL) return newBufPool;
+ ZSTDMT_setBufferSize(newBufPool, bSize);
+ return newBufPool;
+ }
+}
+
/** ZSTDMT_getBuffer() :
* assumption : bufPool must be valid
* @return : a buffer, with start pointer and size
@@ -229,8 +247,8 @@ static buffer_t ZSTDMT_resizeBuffer(ZSTDMT_bufferPool* bufPool, buffer_t buffer)
/* store buffer for later re-use, up to pool capacity */
static void ZSTDMT_releaseBuffer(ZSTDMT_bufferPool* bufPool, buffer_t buf)
{
- if (buf.start == NULL) return; /* compatible with release on NULL */
DEBUGLOG(5, "ZSTDMT_releaseBuffer");
+ if (buf.start == NULL) return; /* compatible with release on NULL */
ZSTD_pthread_mutex_lock(&bufPool->poolMutex);
if (bufPool->nbBuffers < bufPool->totalBuffers) {
bufPool->bTable[bufPool->nbBuffers++] = buf; /* stored for later use */
@@ -300,7 +318,8 @@ static void ZSTDMT_setNbSeq(ZSTDMT_seqPool* const seqPool, size_t const nbSeq)
static ZSTDMT_seqPool* ZSTDMT_createSeqPool(unsigned nbWorkers, ZSTD_customMem cMem)
{
- ZSTDMT_seqPool* seqPool = ZSTDMT_createBufferPool(nbWorkers, cMem);
+ ZSTDMT_seqPool* const seqPool = ZSTDMT_createBufferPool(nbWorkers, cMem);
+ if (seqPool == NULL) return NULL;
ZSTDMT_setNbSeq(seqPool, 0);
return seqPool;
}
@@ -310,6 +329,10 @@ static void ZSTDMT_freeSeqPool(ZSTDMT_seqPool* seqPool)
ZSTDMT_freeBufferPool(seqPool);
}
+static ZSTDMT_seqPool* ZSTDMT_expandSeqPool(ZSTDMT_seqPool* pool, U32 nbWorkers)
+{
+ return ZSTDMT_expandBufferPool(pool, nbWorkers);
+}
/* ===== CCtx Pool ===== */
@@ -317,8 +340,8 @@ static void ZSTDMT_freeSeqPool(ZSTDMT_seqPool* seqPool)
typedef struct {
ZSTD_pthread_mutex_t poolMutex;
- unsigned totalCCtx;
- unsigned availCCtx;
+ int totalCCtx;
+ int availCCtx;
ZSTD_customMem cMem;
ZSTD_CCtx* cctx[1]; /* variable size */
} ZSTDMT_CCtxPool;
@@ -326,16 +349,16 @@ typedef struct {
/* note : all CCtx borrowed from the pool should be released back to the pool _before_ freeing the pool */
static void ZSTDMT_freeCCtxPool(ZSTDMT_CCtxPool* pool)
{
- unsigned u;
- for (u=0; u<pool->totalCCtx; u++)
- ZSTD_freeCCtx(pool->cctx[u]); /* note : compatible with free on NULL */
+ int cid;
+ for (cid=0; cid<pool->totalCCtx; cid++)
+ ZSTD_freeCCtx(pool->cctx[cid]); /* note : compatible with free on NULL */
ZSTD_pthread_mutex_destroy(&pool->poolMutex);
ZSTD_free(pool, pool->cMem);
}
/* ZSTDMT_createCCtxPool() :
* implies nbWorkers >= 1 , checked by caller ZSTDMT_createCCtx() */
-static ZSTDMT_CCtxPool* ZSTDMT_createCCtxPool(unsigned nbWorkers,
+static ZSTDMT_CCtxPool* ZSTDMT_createCCtxPool(int nbWorkers,
ZSTD_customMem cMem)
{
ZSTDMT_CCtxPool* const cctxPool = (ZSTDMT_CCtxPool*) ZSTD_calloc(
@@ -355,6 +378,18 @@ static ZSTDMT_CCtxPool* ZSTDMT_createCCtxPool(unsigned nbWorkers,
return cctxPool;
}
+static ZSTDMT_CCtxPool* ZSTDMT_expandCCtxPool(ZSTDMT_CCtxPool* srcPool,
+ int nbWorkers)
+{
+ if (srcPool==NULL) return NULL;
+ if (nbWorkers <= srcPool->totalCCtx) return srcPool; /* good enough */
+ /* need a larger cctx pool */
+ { ZSTD_customMem const cMem = srcPool->cMem;
+ ZSTDMT_freeCCtxPool(srcPool);
+ return ZSTDMT_createCCtxPool(nbWorkers, cMem);
+ }
+}
+
/* only works during initialization phase, not during compression */
static size_t ZSTDMT_sizeof_CCtxPool(ZSTDMT_CCtxPool* cctxPool)
{
@@ -425,17 +460,16 @@ typedef struct {
ZSTD_window_t ldmWindow; /* A thread-safe copy of ldmState.window */
} serialState_t;
-static int ZSTDMT_serialState_reset(serialState_t* serialState, ZSTDMT_seqPool* seqPool, ZSTD_CCtx_params params)
+static int ZSTDMT_serialState_reset(serialState_t* serialState, ZSTDMT_seqPool* seqPool, ZSTD_CCtx_params params, size_t jobSize)
{
/* Adjust parameters */
if (params.ldmParams.enableLdm) {
DEBUGLOG(4, "LDM window size = %u KB", (1U << params.cParams.windowLog) >> 10);
- params.ldmParams.windowLog = params.cParams.windowLog;
ZSTD_ldm_adjustParameters(&params.ldmParams, &params.cParams);
assert(params.ldmParams.hashLog >= params.ldmParams.bucketSizeLog);
- assert(params.ldmParams.hashEveryLog < 32);
+ assert(params.ldmParams.hashRateLog < 32);
serialState->ldmState.hashPower =
- ZSTD_ldm_getHashPower(params.ldmParams.minMatchLength);
+ ZSTD_rollingHash_primePower(params.ldmParams.minMatchLength);
} else {
memset(&params.ldmParams, 0, sizeof(params.ldmParams));
}
@@ -453,7 +487,7 @@ static int ZSTDMT_serialState_reset(serialState_t* serialState, ZSTDMT_seqPool*
serialState->params.ldmParams.hashLog -
serialState->params.ldmParams.bucketSizeLog;
/* Size the seq pool tables */
- ZSTDMT_setNbSeq(seqPool, ZSTD_ldm_getMaxNbSeq(params.ldmParams, params.jobSize));
+ ZSTDMT_setNbSeq(seqPool, ZSTD_ldm_getMaxNbSeq(params.ldmParams, jobSize));
/* Reset the window */
ZSTD_window_clear(&serialState->ldmState.window);
serialState->ldmWindow = serialState->ldmState.window;
@@ -473,6 +507,7 @@ static int ZSTDMT_serialState_reset(serialState_t* serialState, ZSTDMT_seqPool*
memset(serialState->ldmState.bucketOffsets, 0, bucketSize);
}
serialState->params = params;
+ serialState->params.jobSize = (U32)jobSize;
return 0;
}
@@ -505,6 +540,7 @@ static void ZSTDMT_serialState_update(serialState_t* serialState,
/* Wait for our turn */
ZSTD_PTHREAD_MUTEX_LOCK(&serialState->mutex);
while (serialState->nextJobID < jobID) {
+ DEBUGLOG(5, "wait for serialState->cond");
ZSTD_pthread_cond_wait(&serialState->cond, &serialState->mutex);
}
/* A future job may error and skip our job */
@@ -514,6 +550,7 @@ static void ZSTDMT_serialState_update(serialState_t* serialState,
size_t error;
assert(seqStore.seq != NULL && seqStore.pos == 0 &&
seqStore.size == 0 && seqStore.capacity > 0);
+ assert(src.size <= serialState->params.jobSize);
ZSTD_window_update(&serialState->ldmState.window, src.start, src.size);
error = ZSTD_ldm_generateSequences(
&serialState->ldmState, &seqStore,
@@ -593,14 +630,32 @@ typedef struct {
unsigned frameChecksumNeeded; /* used only by mtctx */
} ZSTDMT_jobDescription;
+#define JOB_ERROR(e) { \
+ ZSTD_PTHREAD_MUTEX_LOCK(&job->job_mutex); \
+ job->cSize = e; \
+ ZSTD_pthread_mutex_unlock(&job->job_mutex); \
+ goto _endJob; \
+}
+
/* ZSTDMT_compressionJob() is a POOL_function type */
-void ZSTDMT_compressionJob(void* jobDescription)
+static void ZSTDMT_compressionJob(void* jobDescription)
{
ZSTDMT_jobDescription* const job = (ZSTDMT_jobDescription*)jobDescription;
ZSTD_CCtx_params jobParams = job->params; /* do not modify job->params ! copy it, modify the copy */
ZSTD_CCtx* const cctx = ZSTDMT_getCCtx(job->cctxPool);
rawSeqStore_t rawSeqStore = ZSTDMT_getSeq(job->seqPool);
buffer_t dstBuff = job->dstBuff;
+ size_t lastCBlockSize = 0;
+
+ /* ressources */
+ if (cctx==NULL) JOB_ERROR(ERROR(memory_allocation));
+ if (dstBuff.start == NULL) { /* streaming job : doesn't provide a dstBuffer */
+ dstBuff = ZSTDMT_getBuffer(job->bufPool);
+ if (dstBuff.start==NULL) JOB_ERROR(ERROR(memory_allocation));
+ job->dstBuff = dstBuff; /* this value can be read in ZSTDMT_flush, when it copies the whole job */
+ }
+ if (jobParams.ldmParams.enableLdm && rawSeqStore.seq == NULL)
+ JOB_ERROR(ERROR(memory_allocation));
/* Don't compute the checksum for chunks, since we compute it externally,
* but write it in the header.
@@ -609,47 +664,31 @@ void ZSTDMT_compressionJob(void* jobDescription)
/* Don't run LDM for the chunks, since we handle it externally */
jobParams.ldmParams.enableLdm = 0;
- /* ressources */
- if (cctx==NULL) {
- job->cSize = ERROR(memory_allocation);
- goto _endJob;
- }
- if (dstBuff.start == NULL) { /* streaming job : doesn't provide a dstBuffer */
- dstBuff = ZSTDMT_getBuffer(job->bufPool);
- if (dstBuff.start==NULL) {
- job->cSize = ERROR(memory_allocation);
- goto _endJob;
- }
- job->dstBuff = dstBuff; /* this value can be read in ZSTDMT_flush, when it copies the whole job */
- }
/* init */
if (job->cdict) {
- size_t const initError = ZSTD_compressBegin_advanced_internal(cctx, NULL, 0, ZSTD_dct_auto, job->cdict, jobParams, job->fullFrameSize);
+ size_t const initError = ZSTD_compressBegin_advanced_internal(cctx, NULL, 0, ZSTD_dct_auto, ZSTD_dtlm_fast, job->cdict, jobParams, job->fullFrameSize);
assert(job->firstJob); /* only allowed for first job */
- if (ZSTD_isError(initError)) { job->cSize = initError; goto _endJob; }
+ if (ZSTD_isError(initError)) JOB_ERROR(initError);
} else { /* srcStart points at reloaded section */
U64 const pledgedSrcSize = job->firstJob ? job->fullFrameSize : job->src.size;
- { size_t const forceWindowError = ZSTD_CCtxParam_setParameter(&jobParams, ZSTD_p_forceMaxWindow, !job->firstJob);
- if (ZSTD_isError(forceWindowError)) {
- job->cSize = forceWindowError;
- goto _endJob;
- } }
+ { size_t const forceWindowError = ZSTD_CCtxParam_setParameter(&jobParams, ZSTD_c_forceMaxWindow, !job->firstJob);
+ if (ZSTD_isError(forceWindowError)) JOB_ERROR(forceWindowError);
+ }
{ size_t const initError = ZSTD_compressBegin_advanced_internal(cctx,
job->prefix.start, job->prefix.size, ZSTD_dct_rawContent, /* load dictionary in "content-only" mode (no header analysis) */
+ ZSTD_dtlm_fast,
NULL, /*cdict*/
jobParams, pledgedSrcSize);
- if (ZSTD_isError(initError)) {
- job->cSize = initError;
- goto _endJob;
- } } }
+ if (ZSTD_isError(initError)) JOB_ERROR(initError);
+ } }
/* Perform serial step as early as possible, but after CCtx initialization */
ZSTDMT_serialState_update(job->serial, cctx, rawSeqStore, job->src, job->jobID);
if (!job->firstJob) { /* flush and overwrite frame header when it's not first job */
size_t const hSize = ZSTD_compressContinue(cctx, dstBuff.start, dstBuff.capacity, job->src.start, 0);
- if (ZSTD_isError(hSize)) { job->cSize = hSize; /* save error code */ goto _endJob; }
+ if (ZSTD_isError(hSize)) JOB_ERROR(hSize);
DEBUGLOG(5, "ZSTDMT_compressionJob: flush and overwrite %u bytes of frame header (not first job)", (U32)hSize);
ZSTD_invalidateRepCodes(cctx);
}
@@ -667,7 +706,7 @@ void ZSTDMT_compressionJob(void* jobDescription)
assert(job->cSize == 0);
for (chunkNb = 1; chunkNb < nbChunks; chunkNb++) {
size_t const cSize = ZSTD_compressContinue(cctx, op, oend-op, ip, chunkSize);
- if (ZSTD_isError(cSize)) { job->cSize = cSize; goto _endJob; }
+ if (ZSTD_isError(cSize)) JOB_ERROR(cSize);
ip += chunkSize;
op += cSize; assert(op < oend);
/* stats */
@@ -680,18 +719,16 @@ void ZSTDMT_compressionJob(void* jobDescription)
ZSTD_pthread_mutex_unlock(&job->job_mutex);
}
/* last block */
- assert(chunkSize > 0); assert((chunkSize & (chunkSize - 1)) == 0); /* chunkSize must be power of 2 for mask==(chunkSize-1) to work */
+ assert(chunkSize > 0);
+ assert((chunkSize & (chunkSize - 1)) == 0); /* chunkSize must be power of 2 for mask==(chunkSize-1) to work */
if ((nbChunks > 0) | job->lastJob /*must output a "last block" flag*/ ) {
size_t const lastBlockSize1 = job->src.size & (chunkSize-1);
size_t const lastBlockSize = ((lastBlockSize1==0) & (job->src.size>=chunkSize)) ? chunkSize : lastBlockSize1;
size_t const cSize = (job->lastJob) ?
ZSTD_compressEnd (cctx, op, oend-op, ip, lastBlockSize) :
ZSTD_compressContinue(cctx, op, oend-op, ip, lastBlockSize);
- if (ZSTD_isError(cSize)) { job->cSize = cSize; goto _endJob; }
- /* stats */
- ZSTD_PTHREAD_MUTEX_LOCK(&job->job_mutex);
- job->cSize += cSize;
- ZSTD_pthread_mutex_unlock(&job->job_mutex);
+ if (ZSTD_isError(cSize)) JOB_ERROR(cSize);
+ lastCBlockSize = cSize;
} }
_endJob:
@@ -704,7 +741,9 @@ _endJob:
ZSTDMT_releaseCCtx(job->cctxPool, cctx);
/* report */
ZSTD_PTHREAD_MUTEX_LOCK(&job->job_mutex);
- job->consumed = job->src.size;
+ if (ZSTD_isError(job->cSize)) assert(lastCBlockSize == 0);
+ job->cSize += lastCBlockSize;
+ job->consumed = job->src.size; /* when job->consumed == job->src.size , compression job is presumed completed */
ZSTD_pthread_cond_signal(&job->job_cond);
ZSTD_pthread_mutex_unlock(&job->job_mutex);
}
@@ -736,6 +775,14 @@ typedef struct {
static const roundBuff_t kNullRoundBuff = {NULL, 0, 0};
+#define RSYNC_LENGTH 32
+
+typedef struct {
+ U64 hash;
+ U64 hitMask;
+ U64 primePower;
+} rsyncState_t;
+
struct ZSTDMT_CCtx_s {
POOL_ctx* factory;
ZSTDMT_jobDescription* jobs;
@@ -745,10 +792,11 @@ struct ZSTDMT_CCtx_s {
ZSTD_CCtx_params params;
size_t targetSectionSize;
size_t targetPrefixSize;
- roundBuff_t roundBuff;
+ int jobReady; /* 1 => one job is already prepared, but pool has shortage of workers. Don't create a new job. */
inBuff_t inBuff;
- int jobReady; /* 1 => one job is already prepared, but pool has shortage of workers. Don't create another one. */
+ roundBuff_t roundBuff;
serialState_t serial;
+ rsyncState_t rsync;
unsigned singleBlockingThread;
unsigned jobIDMask;
unsigned doneJobID;
@@ -798,13 +846,27 @@ static ZSTDMT_jobDescription* ZSTDMT_createJobsTable(U32* nbJobsPtr, ZSTD_custom
return jobTable;
}
+static size_t ZSTDMT_expandJobsTable (ZSTDMT_CCtx* mtctx, U32 nbWorkers) {
+ U32 nbJobs = nbWorkers + 2;
+ if (nbJobs > mtctx->jobIDMask+1) { /* need more job capacity */
+ ZSTDMT_freeJobsTable(mtctx->jobs, mtctx->jobIDMask+1, mtctx->cMem);
+ mtctx->jobIDMask = 0;
+ mtctx->jobs = ZSTDMT_createJobsTable(&nbJobs, mtctx->cMem);
+ if (mtctx->jobs==NULL) return ERROR(memory_allocation);
+ assert((nbJobs != 0) && ((nbJobs & (nbJobs - 1)) == 0)); /* ensure nbJobs is a power of 2 */
+ mtctx->jobIDMask = nbJobs - 1;
+ }
+ return 0;
+}
+
+
/* ZSTDMT_CCtxParam_setNbWorkers():
* Internal use only */
size_t ZSTDMT_CCtxParam_setNbWorkers(ZSTD_CCtx_params* params, unsigned nbWorkers)
{
if (nbWorkers > ZSTDMT_NBWORKERS_MAX) nbWorkers = ZSTDMT_NBWORKERS_MAX;
params->nbWorkers = nbWorkers;
- params->overlapSizeLog = ZSTDMT_OVERLAPLOG_DEFAULT;
+ params->overlapLog = ZSTDMT_OVERLAPLOG_DEFAULT;
params->jobSize = 0;
return nbWorkers;
}
@@ -875,7 +937,7 @@ static void ZSTDMT_waitForAllJobsCompleted(ZSTDMT_CCtx* mtctx)
unsigned const jobID = mtctx->doneJobID & mtctx->jobIDMask;
ZSTD_PTHREAD_MUTEX_LOCK(&mtctx->jobs[jobID].job_mutex);
while (mtctx->jobs[jobID].consumed < mtctx->jobs[jobID].src.size) {
- DEBUGLOG(5, "waiting for jobCompleted signal from job %u", mtctx->doneJobID); /* we want to block when waiting for data to flush */
+ DEBUGLOG(4, "waiting for jobCompleted signal from job %u", mtctx->doneJobID); /* we want to block when waiting for data to flush */
ZSTD_pthread_cond_wait(&mtctx->jobs[jobID].job_cond, &mtctx->jobs[jobID].job_mutex);
}
ZSTD_pthread_mutex_unlock(&mtctx->jobs[jobID].job_mutex);
@@ -914,40 +976,64 @@ size_t ZSTDMT_sizeof_CCtx(ZSTDMT_CCtx* mtctx)
}
/* Internal only */
-size_t ZSTDMT_CCtxParam_setMTCtxParameter(ZSTD_CCtx_params* params,
- ZSTDMT_parameter parameter, unsigned value) {
+size_t
+ZSTDMT_CCtxParam_setMTCtxParameter(ZSTD_CCtx_params* params,
+ ZSTDMT_parameter parameter,
+ int value)
+{
DEBUGLOG(4, "ZSTDMT_CCtxParam_setMTCtxParameter");
switch(parameter)
{
case ZSTDMT_p_jobSize :
- DEBUGLOG(4, "ZSTDMT_CCtxParam_setMTCtxParameter : set jobSize to %u", value);
- if ( (value > 0) /* value==0 => automatic job size */
- & (value < ZSTDMT_JOBSIZE_MIN) )
+ DEBUGLOG(4, "ZSTDMT_CCtxParam_setMTCtxParameter : set jobSize to %i", value);
+ if ( value != 0 /* default */
+ && value < ZSTDMT_JOBSIZE_MIN)
value = ZSTDMT_JOBSIZE_MIN;
+ assert(value >= 0);
+ if (value > ZSTDMT_JOBSIZE_MAX) value = ZSTDMT_JOBSIZE_MAX;
params->jobSize = value;
return value;
- case ZSTDMT_p_overlapSectionLog :
- if (value > 9) value = 9;
- DEBUGLOG(4, "ZSTDMT_p_overlapSectionLog : %u", value);
- params->overlapSizeLog = (value >= 9) ? 9 : value;
+
+ case ZSTDMT_p_overlapLog :
+ DEBUGLOG(4, "ZSTDMT_p_overlapLog : %i", value);
+ if (value < ZSTD_OVERLAPLOG_MIN) value = ZSTD_OVERLAPLOG_MIN;
+ if (value > ZSTD_OVERLAPLOG_MAX) value = ZSTD_OVERLAPLOG_MAX;
+ params->overlapLog = value;
+ return value;
+
+ case ZSTDMT_p_rsyncable :
+ value = (value != 0);
+ params->rsyncable = value;
return value;
+
default :
return ERROR(parameter_unsupported);
}
}
-size_t ZSTDMT_setMTCtxParameter(ZSTDMT_CCtx* mtctx, ZSTDMT_parameter parameter, unsigned value)
+size_t ZSTDMT_setMTCtxParameter(ZSTDMT_CCtx* mtctx, ZSTDMT_parameter parameter, int value)
{
DEBUGLOG(4, "ZSTDMT_setMTCtxParameter");
- switch(parameter)
- {
- case ZSTDMT_p_jobSize :
- return ZSTDMT_CCtxParam_setMTCtxParameter(&mtctx->params, parameter, value);
- case ZSTDMT_p_overlapSectionLog :
- return ZSTDMT_CCtxParam_setMTCtxParameter(&mtctx->params, parameter, value);
- default :
+ return ZSTDMT_CCtxParam_setMTCtxParameter(&mtctx->params, parameter, value);
+}
+
+size_t ZSTDMT_getMTCtxParameter(ZSTDMT_CCtx* mtctx, ZSTDMT_parameter parameter, int* value)
+{
+ switch (parameter) {
+ case ZSTDMT_p_jobSize:
+ assert(mtctx->params.jobSize <= INT_MAX);
+ *value = (int)(mtctx->params.jobSize);
+ break;
+ case ZSTDMT_p_overlapLog:
+ *value = mtctx->params.overlapLog;
+ break;
+ case ZSTDMT_p_rsyncable:
+ *value = mtctx->params.rsyncable;
+ break;
+ default:
return ERROR(parameter_unsupported);
}
+ return 0;
}
/* Sets parameters relevant to the compression job,
@@ -960,13 +1046,30 @@ static ZSTD_CCtx_params ZSTDMT_initJobCCtxParams(ZSTD_CCtx_params const params)
jobParams.cParams = params.cParams;
jobParams.fParams = params.fParams;
jobParams.compressionLevel = params.compressionLevel;
- jobParams.disableLiteralCompression = params.disableLiteralCompression;
return jobParams;
}
+
+/* ZSTDMT_resize() :
+ * @return : error code if fails, 0 on success */
+static size_t ZSTDMT_resize(ZSTDMT_CCtx* mtctx, unsigned nbWorkers)
+{
+ if (POOL_resize(mtctx->factory, nbWorkers)) return ERROR(memory_allocation);
+ CHECK_F( ZSTDMT_expandJobsTable(mtctx, nbWorkers) );
+ mtctx->bufPool = ZSTDMT_expandBufferPool(mtctx->bufPool, nbWorkers);
+ if (mtctx->bufPool == NULL) return ERROR(memory_allocation);
+ mtctx->cctxPool = ZSTDMT_expandCCtxPool(mtctx->cctxPool, nbWorkers);
+ if (mtctx->cctxPool == NULL) return ERROR(memory_allocation);
+ mtctx->seqPool = ZSTDMT_expandSeqPool(mtctx->seqPool, nbWorkers);
+ if (mtctx->seqPool == NULL) return ERROR(memory_allocation);
+ ZSTDMT_CCtxParam_setNbWorkers(&mtctx->params, nbWorkers);
+ return 0;
+}
+
+
/*! ZSTDMT_updateCParams_whileCompressing() :
- * Updates only a selected set of compression parameters, to remain compatible with current frame.
+ * Updates a selected set of compression parameters, remaining compatible with currently active frame.
* New parameters will be applied to next compression job. */
void ZSTDMT_updateCParams_whileCompressing(ZSTDMT_CCtx* mtctx, const ZSTD_CCtx_params* cctxParams)
{
@@ -981,38 +1084,36 @@ void ZSTDMT_updateCParams_whileCompressing(ZSTDMT_CCtx* mtctx, const ZSTD_CCtx_p
}
}
-/* ZSTDMT_getNbWorkers():
- * @return nb threads currently active in mtctx.
- * mtctx must be valid */
-unsigned ZSTDMT_getNbWorkers(const ZSTDMT_CCtx* mtctx)
-{
- assert(mtctx != NULL);
- return mtctx->params.nbWorkers;
-}
-
/* ZSTDMT_getFrameProgression():
* tells how much data has been consumed (input) and produced (output) for current frame.
* able to count progression inside worker threads.
- * Note : mutex will be acquired during statistics collection. */
+ * Note : mutex will be acquired during statistics collection inside workers. */
ZSTD_frameProgression ZSTDMT_getFrameProgression(ZSTDMT_CCtx* mtctx)
{
ZSTD_frameProgression fps;
- DEBUGLOG(6, "ZSTDMT_getFrameProgression");
- fps.consumed = mtctx->consumed;
- fps.produced = mtctx->produced;
+ DEBUGLOG(5, "ZSTDMT_getFrameProgression");
fps.ingested = mtctx->consumed + mtctx->inBuff.filled;
+ fps.consumed = mtctx->consumed;
+ fps.produced = fps.flushed = mtctx->produced;
+ fps.currentJobID = mtctx->nextJobID;
+ fps.nbActiveWorkers = 0;
{ unsigned jobNb;
unsigned lastJobNb = mtctx->nextJobID + mtctx->jobReady; assert(mtctx->jobReady <= 1);
DEBUGLOG(6, "ZSTDMT_getFrameProgression: jobs: from %u to <%u (jobReady:%u)",
mtctx->doneJobID, lastJobNb, mtctx->jobReady)
for (jobNb = mtctx->doneJobID ; jobNb < lastJobNb ; jobNb++) {
unsigned const wJobID = jobNb & mtctx->jobIDMask;
- ZSTD_pthread_mutex_lock(&mtctx->jobs[wJobID].job_mutex);
- { size_t const cResult = mtctx->jobs[wJobID].cSize;
+ ZSTDMT_jobDescription* jobPtr = &mtctx->jobs[wJobID];
+ ZSTD_pthread_mutex_lock(&jobPtr->job_mutex);
+ { size_t const cResult = jobPtr->cSize;
size_t const produced = ZSTD_isError(cResult) ? 0 : cResult;
- fps.consumed += mtctx->jobs[wJobID].consumed;
- fps.ingested += mtctx->jobs[wJobID].src.size;
+ size_t const flushed = ZSTD_isError(cResult) ? 0 : jobPtr->dstFlushed;
+ assert(flushed <= produced);
+ fps.ingested += jobPtr->src.size;
+ fps.consumed += jobPtr->consumed;
fps.produced += produced;
+ fps.flushed += flushed;
+ fps.nbActiveWorkers += (jobPtr->consumed < jobPtr->src.size);
}
ZSTD_pthread_mutex_unlock(&mtctx->jobs[wJobID].job_mutex);
}
@@ -1021,26 +1122,98 @@ ZSTD_frameProgression ZSTDMT_getFrameProgression(ZSTDMT_CCtx* mtctx)
}
+size_t ZSTDMT_toFlushNow(ZSTDMT_CCtx* mtctx)
+{
+ size_t toFlush;
+ unsigned const jobID = mtctx->doneJobID;
+ assert(jobID <= mtctx->nextJobID);
+ if (jobID == mtctx->nextJobID) return 0; /* no active job => nothing to flush */
+
+ /* look into oldest non-fully-flushed job */
+ { unsigned const wJobID = jobID & mtctx->jobIDMask;
+ ZSTDMT_jobDescription* const jobPtr = &mtctx->jobs[wJobID];
+ ZSTD_pthread_mutex_lock(&jobPtr->job_mutex);
+ { size_t const cResult = jobPtr->cSize;
+ size_t const produced = ZSTD_isError(cResult) ? 0 : cResult;
+ size_t const flushed = ZSTD_isError(cResult) ? 0 : jobPtr->dstFlushed;
+ assert(flushed <= produced);
+ toFlush = produced - flushed;
+ if (toFlush==0 && (jobPtr->consumed >= jobPtr->src.size)) {
+ /* doneJobID is not-fully-flushed, but toFlush==0 : doneJobID should be compressing some more data */
+ assert(jobPtr->consumed < jobPtr->src.size);
+ }
+ }
+ ZSTD_pthread_mutex_unlock(&mtctx->jobs[wJobID].job_mutex);
+ }
+
+ return toFlush;
+}
+
+
/* ------------------------------------------ */
/* ===== Multi-threaded compression ===== */
/* ------------------------------------------ */
-static size_t ZSTDMT_computeTargetJobLog(ZSTD_CCtx_params const params)
+static unsigned ZSTDMT_computeTargetJobLog(ZSTD_CCtx_params const params)
{
if (params.ldmParams.enableLdm)
+ /* In Long Range Mode, the windowLog is typically oversized.
+ * In which case, it's preferable to determine the jobSize
+ * based on chainLog instead. */
return MAX(21, params.cParams.chainLog + 4);
return MAX(20, params.cParams.windowLog + 2);
}
-static size_t ZSTDMT_computeOverlapLog(ZSTD_CCtx_params const params)
+static int ZSTDMT_overlapLog_default(ZSTD_strategy strat)
{
- unsigned const overlapRLog = (params.overlapSizeLog>9) ? 0 : 9-params.overlapSizeLog;
- if (params.ldmParams.enableLdm)
- return (MIN(params.cParams.windowLog, ZSTDMT_computeTargetJobLog(params) - 2) - overlapRLog);
- return overlapRLog >= 9 ? 0 : (params.cParams.windowLog - overlapRLog);
+ switch(strat)
+ {
+ case ZSTD_btultra2:
+ return 9;
+ case ZSTD_btultra:
+ case ZSTD_btopt:
+ return 8;
+ case ZSTD_btlazy2:
+ case ZSTD_lazy2:
+ return 7;
+ case ZSTD_lazy:
+ case ZSTD_greedy:
+ case ZSTD_dfast:
+ case ZSTD_fast:
+ default:;
+ }
+ return 6;
+}
+
+static int ZSTDMT_overlapLog(int ovlog, ZSTD_strategy strat)
+{
+ assert(0 <= ovlog && ovlog <= 9);
+ if (ovlog == 0) return ZSTDMT_overlapLog_default(strat);
+ return ovlog;
+}
+
+static size_t ZSTDMT_computeOverlapSize(ZSTD_CCtx_params const params)
+{
+ int const overlapRLog = 9 - ZSTDMT_overlapLog(params.overlapLog, params.cParams.strategy);
+ int ovLog = (overlapRLog >= 8) ? 0 : (params.cParams.windowLog - overlapRLog);
+ assert(0 <= overlapRLog && overlapRLog <= 8);
+ if (params.ldmParams.enableLdm) {
+ /* In Long Range Mode, the windowLog is typically oversized.
+ * In which case, it's preferable to determine the jobSize
+ * based on chainLog instead.
+ * Then, ovLog becomes a fraction of the jobSize, rather than windowSize */
+ ovLog = MIN(params.cParams.windowLog, ZSTDMT_computeTargetJobLog(params) - 2)
+ - overlapRLog;
+ }
+ assert(0 <= ovLog && ovLog <= 30);
+ DEBUGLOG(4, "overlapLog : %i", params.overlapLog);
+ DEBUGLOG(4, "overlap size : %i", 1 << ovLog);
+ return (ovLog==0) ? 0 : (size_t)1 << ovLog;
}
-static unsigned ZSTDMT_computeNbJobs(ZSTD_CCtx_params params, size_t srcSize, unsigned nbWorkers) {
+static unsigned
+ZSTDMT_computeNbJobs(ZSTD_CCtx_params params, size_t srcSize, unsigned nbWorkers)
+{
assert(nbWorkers>0);
{ size_t const jobSizeTarget = (size_t)1 << ZSTDMT_computeTargetJobLog(params);
size_t const jobMaxSize = jobSizeTarget << 2;
@@ -1063,7 +1236,7 @@ static size_t ZSTDMT_compress_advanced_internal(
ZSTD_CCtx_params params)
{
ZSTD_CCtx_params const jobParams = ZSTDMT_initJobCCtxParams(params);
- size_t const overlapSize = (size_t)1 << ZSTDMT_computeOverlapLog(params);
+ size_t const overlapSize = ZSTDMT_computeOverlapSize(params);
unsigned const nbJobs = ZSTDMT_computeNbJobs(params, srcSize, params.nbWorkers);
size_t const proposedJobSize = (srcSize + (nbJobs-1)) / nbJobs;
size_t const avgJobSize = (((proposedJobSize-1) & 0x1FFFF) < 0x7FFF) ? proposedJobSize + 0xFFFF : proposedJobSize; /* avoid too small last block */
@@ -1087,18 +1260,10 @@ static size_t ZSTDMT_compress_advanced_internal(
assert(avgJobSize >= 256 KB); /* condition for ZSTD_compressBound(A) + ZSTD_compressBound(B) <= ZSTD_compressBound(A+B), required to compress directly into Dst (no additional buffer) */
ZSTDMT_setBufferSize(mtctx->bufPool, ZSTD_compressBound(avgJobSize) );
- if (ZSTDMT_serialState_reset(&mtctx->serial, mtctx->seqPool, params))
+ if (ZSTDMT_serialState_reset(&mtctx->serial, mtctx->seqPool, params, avgJobSize))
return ERROR(memory_allocation);
- if (nbJobs > mtctx->jobIDMask+1) { /* enlarge job table */
- U32 jobsTableSize = nbJobs;
- ZSTDMT_freeJobsTable(mtctx->jobs, mtctx->jobIDMask+1, mtctx->cMem);
- mtctx->jobIDMask = 0;
- mtctx->jobs = ZSTDMT_createJobsTable(&jobsTableSize, mtctx->cMem);
- if (mtctx->jobs==NULL) return ERROR(memory_allocation);
- assert((jobsTableSize != 0) && ((jobsTableSize & (jobsTableSize - 1)) == 0)); /* ensure jobsTableSize is a power of 2 */
- mtctx->jobIDMask = jobsTableSize - 1;
- }
+ CHECK_F( ZSTDMT_expandJobsTable(mtctx, nbJobs) ); /* only expands if necessary */
{ unsigned u;
for (u=0; u<nbJobs; u++) {
@@ -1182,16 +1347,17 @@ static size_t ZSTDMT_compress_advanced_internal(
}
size_t ZSTDMT_compress_advanced(ZSTDMT_CCtx* mtctx,
- void* dst, size_t dstCapacity,
- const void* src, size_t srcSize,
- const ZSTD_CDict* cdict,
- ZSTD_parameters params,
- unsigned overlapLog)
+ void* dst, size_t dstCapacity,
+ const void* src, size_t srcSize,
+ const ZSTD_CDict* cdict,
+ ZSTD_parameters params,
+ int overlapLog)
{
ZSTD_CCtx_params cctxParams = mtctx->params;
cctxParams.cParams = params.cParams;
cctxParams.fParams = params.fParams;
- cctxParams.overlapSizeLog = overlapLog;
+ assert(ZSTD_OVERLAPLOG_MIN <= overlapLog && overlapLog <= ZSTD_OVERLAPLOG_MAX);
+ cctxParams.overlapLog = overlapLog;
return ZSTDMT_compress_advanced_internal(mtctx,
dst, dstCapacity,
src, srcSize,
@@ -1204,8 +1370,8 @@ size_t ZSTDMT_compressCCtx(ZSTDMT_CCtx* mtctx,
const void* src, size_t srcSize,
int compressionLevel)
{
- U32 const overlapLog = (compressionLevel >= ZSTD_maxCLevel()) ? 9 : ZSTDMT_OVERLAPLOG_DEFAULT;
ZSTD_parameters params = ZSTD_getParams(compressionLevel, srcSize, 0);
+ int const overlapLog = ZSTDMT_overlapLog_default(params.cParams.strategy);
params.fParams.contentSizeFlag = 1;
return ZSTDMT_compress_advanced(mtctx, dst, dstCapacity, src, srcSize, NULL, params, overlapLog);
}
@@ -1221,18 +1387,19 @@ size_t ZSTDMT_initCStream_internal(
const ZSTD_CDict* cdict, ZSTD_CCtx_params params,
unsigned long long pledgedSrcSize)
{
- DEBUGLOG(4, "ZSTDMT_initCStream_internal (pledgedSrcSize=%u, nbWorkers=%u, cctxPool=%u, disableLiteralCompression=%i)",
- (U32)pledgedSrcSize, params.nbWorkers, mtctx->cctxPool->totalCCtx, params.disableLiteralCompression);
- /* params are supposed to be fully validated at this point */
+ DEBUGLOG(4, "ZSTDMT_initCStream_internal (pledgedSrcSize=%u, nbWorkers=%u, cctxPool=%u)",
+ (U32)pledgedSrcSize, params.nbWorkers, mtctx->cctxPool->totalCCtx);
+
+ /* params supposed partially fully validated at this point */
assert(!ZSTD_isError(ZSTD_checkCParams(params.cParams)));
assert(!((dict) && (cdict))); /* either dict or cdict, not both */
- assert(mtctx->cctxPool->totalCCtx == params.nbWorkers);
/* init */
- if (params.jobSize == 0) {
- params.jobSize = 1U << ZSTDMT_computeTargetJobLog(params);
- }
- if (params.jobSize > ZSTDMT_JOBSIZE_MAX) params.jobSize = ZSTDMT_JOBSIZE_MAX;
+ if (params.nbWorkers != mtctx->params.nbWorkers)
+ CHECK_F( ZSTDMT_resize(mtctx, params.nbWorkers) );
+
+ if (params.jobSize != 0 && params.jobSize < ZSTDMT_JOBSIZE_MIN) params.jobSize = ZSTDMT_JOBSIZE_MIN;
+ if (params.jobSize > (size_t)ZSTDMT_JOBSIZE_MAX) params.jobSize = ZSTDMT_JOBSIZE_MAX;
mtctx->singleBlockingThread = (pledgedSrcSize <= ZSTDMT_JOBSIZE_MIN); /* do not trigger multi-threading when srcSize is too small */
if (mtctx->singleBlockingThread) {
@@ -1267,12 +1434,24 @@ size_t ZSTDMT_initCStream_internal(
mtctx->cdict = cdict;
}
- mtctx->targetPrefixSize = (size_t)1 << ZSTDMT_computeOverlapLog(params);
- DEBUGLOG(4, "overlapLog=%u => %u KB", params.overlapSizeLog, (U32)(mtctx->targetPrefixSize>>10));
+ mtctx->targetPrefixSize = ZSTDMT_computeOverlapSize(params);
+ DEBUGLOG(4, "overlapLog=%i => %u KB", params.overlapLog, (U32)(mtctx->targetPrefixSize>>10));
mtctx->targetSectionSize = params.jobSize;
- if (mtctx->targetSectionSize < ZSTDMT_JOBSIZE_MIN) mtctx->targetSectionSize = ZSTDMT_JOBSIZE_MIN;
+ if (mtctx->targetSectionSize == 0) {
+ mtctx->targetSectionSize = 1ULL << ZSTDMT_computeTargetJobLog(params);
+ }
+ if (params.rsyncable) {
+ /* Aim for the targetsectionSize as the average job size. */
+ U32 const jobSizeMB = (U32)(mtctx->targetSectionSize >> 20);
+ U32 const rsyncBits = ZSTD_highbit32(jobSizeMB) + 20;
+ assert(jobSizeMB >= 1);
+ DEBUGLOG(4, "rsyncLog = %u", rsyncBits);
+ mtctx->rsync.hash = 0;
+ mtctx->rsync.hitMask = (1ULL << rsyncBits) - 1;
+ mtctx->rsync.primePower = ZSTD_rollingHash_primePower(RSYNC_LENGTH);
+ }
if (mtctx->targetSectionSize < mtctx->targetPrefixSize) mtctx->targetSectionSize = mtctx->targetPrefixSize; /* job size must be >= overlap size */
- DEBUGLOG(4, "Job Size : %u KB (note : set to %u)", (U32)(mtctx->targetSectionSize>>10), params.jobSize);
+ DEBUGLOG(4, "Job Size : %u KB (note : set to %u)", (U32)(mtctx->targetSectionSize>>10), (U32)params.jobSize);
DEBUGLOG(4, "inBuff Size : %u KB", (U32)(mtctx->targetSectionSize>>10));
ZSTDMT_setBufferSize(mtctx->bufPool, ZSTD_compressBound(mtctx->targetSectionSize));
{
@@ -1312,7 +1491,7 @@ size_t ZSTDMT_initCStream_internal(
mtctx->allJobsCompleted = 0;
mtctx->consumed = 0;
mtctx->produced = 0;
- if (ZSTDMT_serialState_reset(&mtctx->serial, mtctx->seqPool, params))
+ if (ZSTDMT_serialState_reset(&mtctx->serial, mtctx->seqPool, params, mtctx->targetSectionSize))
return ERROR(memory_allocation);
return 0;
}
@@ -1420,7 +1599,7 @@ static size_t ZSTDMT_createCompressionJob(ZSTDMT_CCtx* mtctx, size_t srcSize, ZS
mtctx->jobs[jobID].jobID = mtctx->nextJobID;
mtctx->jobs[jobID].firstJob = (mtctx->nextJobID==0);
mtctx->jobs[jobID].lastJob = endFrame;
- mtctx->jobs[jobID].frameChecksumNeeded = endFrame && (mtctx->nextJobID>0) && mtctx->params.fParams.checksumFlag;
+ mtctx->jobs[jobID].frameChecksumNeeded = mtctx->params.fParams.checksumFlag && endFrame && (mtctx->nextJobID>0);
mtctx->jobs[jobID].dstFlushed = 0;
/* Update the round buffer pos and clear the input buffer to be reset */
@@ -1468,6 +1647,8 @@ static size_t ZSTDMT_createCompressionJob(ZSTDMT_CCtx* mtctx, size_t srcSize, ZS
/*! ZSTDMT_flushProduced() :
+ * flush whatever data has been produced but not yet flushed in current job.
+ * move to next job if current one is fully flushed.
* `output` : `pos` will be updated with amount of data flushed .
* `blockToFlush` : if >0, the function will block and wait if there is no data available to flush .
* @return : amount of data remaining within internal buffer, 0 if no more, 1 if unknown but > 0, or an error code */
@@ -1496,7 +1677,7 @@ static size_t ZSTDMT_flushProduced(ZSTDMT_CCtx* mtctx, ZSTD_outBuffer* output, u
/* try to flush something */
{ size_t cSize = mtctx->jobs[wJobID].cSize; /* shared */
size_t const srcConsumed = mtctx->jobs[wJobID].consumed; /* shared */
- size_t const srcSize = mtctx->jobs[wJobID].src.size; /* read-only, could be done after mutex lock, but no-declaration-after-statement */
+ size_t const srcSize = mtctx->jobs[wJobID].src.size; /* read-only, could be done after mutex lock, but no-declaration-after-statement */
ZSTD_pthread_mutex_unlock(&mtctx->jobs[wJobID].job_mutex);
if (ZSTD_isError(cSize)) {
DEBUGLOG(5, "ZSTDMT_flushProduced: job %u : compression error detected : %s",
@@ -1516,6 +1697,7 @@ static size_t ZSTDMT_flushProduced(ZSTDMT_CCtx* mtctx, ZSTD_outBuffer* output, u
mtctx->jobs[wJobID].cSize += 4; /* can write this shared value, as worker is no longer active */
mtctx->jobs[wJobID].frameChecksumNeeded = 0;
}
+
if (cSize > 0) { /* compression is ongoing or completed */
size_t const toFlush = MIN(cSize - mtctx->jobs[wJobID].dstFlushed, output->size - output->pos);
DEBUGLOG(5, "ZSTDMT_flushProduced: Flushing %u bytes from job %u (completion:%u/%u, generated:%u)",
@@ -1529,11 +1711,12 @@ static size_t ZSTDMT_flushProduced(ZSTDMT_CCtx* mtctx, ZSTD_outBuffer* output, u
output->pos += toFlush;
mtctx->jobs[wJobID].dstFlushed += toFlush; /* can write : this value is only used by mtctx */
- if ( (srcConsumed == srcSize) /* job completed */
+ if ( (srcConsumed == srcSize) /* job is completed */
&& (mtctx->jobs[wJobID].dstFlushed == cSize) ) { /* output buffer fully flushed => free this job position */
DEBUGLOG(5, "Job %u completed (%u bytes), moving to next one",
mtctx->doneJobID, (U32)mtctx->jobs[wJobID].dstFlushed);
ZSTDMT_releaseBuffer(mtctx->bufPool, mtctx->jobs[wJobID].dstBuff);
+ DEBUGLOG(5, "dstBuffer released");
mtctx->jobs[wJobID].dstBuff = g_nullBuffer;
mtctx->jobs[wJobID].cSize = 0; /* ensure this job slot is considered "not started" in future check */
mtctx->consumed += srcSize;
@@ -1610,6 +1793,7 @@ static int ZSTDMT_doesOverlapWindow(buffer_t buffer, ZSTD_window_t window)
range_t extDict;
range_t prefix;
+ DEBUGLOG(5, "ZSTDMT_doesOverlapWindow");
extDict.start = window.dictBase + window.lowLimit;
extDict.size = window.dictLimit - window.lowLimit;
@@ -1630,12 +1814,13 @@ static void ZSTDMT_waitForLdmComplete(ZSTDMT_CCtx* mtctx, buffer_t buffer)
{
if (mtctx->params.ldmParams.enableLdm) {
ZSTD_pthread_mutex_t* mutex = &mtctx->serial.ldmWindowMutex;
+ DEBUGLOG(5, "ZSTDMT_waitForLdmComplete");
DEBUGLOG(5, "source [0x%zx, 0x%zx)",
(size_t)buffer.start,
(size_t)buffer.start + buffer.capacity);
ZSTD_PTHREAD_MUTEX_LOCK(mutex);
while (ZSTDMT_doesOverlapWindow(buffer, mtctx->serial.ldmWindow)) {
- DEBUGLOG(6, "Waiting for LDM to finish...");
+ DEBUGLOG(5, "Waiting for LDM to finish...");
ZSTD_pthread_cond_wait(&mtctx->serial.ldmWindowCond, mutex);
}
DEBUGLOG(6, "Done waiting for LDM to finish");
@@ -1655,6 +1840,7 @@ static int ZSTDMT_tryGetInputRange(ZSTDMT_CCtx* mtctx)
size_t const target = mtctx->targetSectionSize;
buffer_t buffer;
+ DEBUGLOG(5, "ZSTDMT_tryGetInputRange");
assert(mtctx->inBuff.buffer.start == NULL);
assert(mtctx->roundBuff.capacity >= target);
@@ -1668,7 +1854,7 @@ static int ZSTDMT_tryGetInputRange(ZSTDMT_CCtx* mtctx)
buffer.start = start;
buffer.capacity = prefixSize;
if (ZSTDMT_isOverlapped(buffer, inUse)) {
- DEBUGLOG(6, "Waiting for buffer...");
+ DEBUGLOG(5, "Waiting for buffer...");
return 0;
}
ZSTDMT_waitForLdmComplete(mtctx, buffer);
@@ -1680,7 +1866,7 @@ static int ZSTDMT_tryGetInputRange(ZSTDMT_CCtx* mtctx)
buffer.capacity = target;
if (ZSTDMT_isOverlapped(buffer, inUse)) {
- DEBUGLOG(6, "Waiting for buffer...");
+ DEBUGLOG(5, "Waiting for buffer...");
return 0;
}
assert(!ZSTDMT_isOverlapped(buffer, mtctx->inBuff.prefix));
@@ -1701,6 +1887,89 @@ static int ZSTDMT_tryGetInputRange(ZSTDMT_CCtx* mtctx)
return 1;
}
+typedef struct {
+ size_t toLoad; /* The number of bytes to load from the input. */
+ int flush; /* Boolean declaring if we must flush because we found a synchronization point. */
+} syncPoint_t;
+
+/**
+ * Searches through the input for a synchronization point. If one is found, we
+ * will instruct the caller to flush, and return the number of bytes to load.
+ * Otherwise, we will load as many bytes as possible and instruct the caller
+ * to continue as normal.
+ */
+static syncPoint_t
+findSynchronizationPoint(ZSTDMT_CCtx const* mtctx, ZSTD_inBuffer const input)
+{
+ BYTE const* const istart = (BYTE const*)input.src + input.pos;
+ U64 const primePower = mtctx->rsync.primePower;
+ U64 const hitMask = mtctx->rsync.hitMask;
+
+ syncPoint_t syncPoint;
+ U64 hash;
+ BYTE const* prev;
+ size_t pos;
+
+ syncPoint.toLoad = MIN(input.size - input.pos, mtctx->targetSectionSize - mtctx->inBuff.filled);
+ syncPoint.flush = 0;
+ if (!mtctx->params.rsyncable)
+ /* Rsync is disabled. */
+ return syncPoint;
+ if (mtctx->inBuff.filled + syncPoint.toLoad < RSYNC_LENGTH)
+ /* Not enough to compute the hash.
+ * We will miss any synchronization points in this RSYNC_LENGTH byte
+ * window. However, since it depends only in the internal buffers, if the
+ * state is already synchronized, we will remain synchronized.
+ * Additionally, the probability that we miss a synchronization point is
+ * low: RSYNC_LENGTH / targetSectionSize.
+ */
+ return syncPoint;
+ /* Initialize the loop variables. */
+ if (mtctx->inBuff.filled >= RSYNC_LENGTH) {
+ /* We have enough bytes buffered to initialize the hash.
+ * Start scanning at the beginning of the input.
+ */
+ pos = 0;
+ prev = (BYTE const*)mtctx->inBuff.buffer.start + mtctx->inBuff.filled - RSYNC_LENGTH;
+ hash = ZSTD_rollingHash_compute(prev, RSYNC_LENGTH);
+ } else {
+ /* We don't have enough bytes buffered to initialize the hash, but
+ * we know we have at least RSYNC_LENGTH bytes total.
+ * Start scanning after the first RSYNC_LENGTH bytes less the bytes
+ * already buffered.
+ */
+ pos = RSYNC_LENGTH - mtctx->inBuff.filled;
+ prev = (BYTE const*)mtctx->inBuff.buffer.start - pos;
+ hash = ZSTD_rollingHash_compute(mtctx->inBuff.buffer.start, mtctx->inBuff.filled);
+ hash = ZSTD_rollingHash_append(hash, istart, pos);
+ }
+ /* Starting with the hash of the previous RSYNC_LENGTH bytes, roll
+ * through the input. If we hit a synchronization point, then cut the
+ * job off, and tell the compressor to flush the job. Otherwise, load
+ * all the bytes and continue as normal.
+ * If we go too long without a synchronization point (targetSectionSize)
+ * then a block will be emitted anyways, but this is okay, since if we
+ * are already synchronized we will remain synchronized.
+ */
+ for (; pos < syncPoint.toLoad; ++pos) {
+ BYTE const toRemove = pos < RSYNC_LENGTH ? prev[pos] : istart[pos - RSYNC_LENGTH];
+ /* if (pos >= RSYNC_LENGTH) assert(ZSTD_rollingHash_compute(istart + pos - RSYNC_LENGTH, RSYNC_LENGTH) == hash); */
+ hash = ZSTD_rollingHash_rotate(hash, toRemove, istart[pos], primePower);
+ if ((hash & hitMask) == hitMask) {
+ syncPoint.toLoad = pos + 1;
+ syncPoint.flush = 1;
+ break;
+ }
+ }
+ return syncPoint;
+}
+
+size_t ZSTDMT_nextInputSizeHint(const ZSTDMT_CCtx* mtctx)
+{
+ size_t hintInSize = mtctx->targetSectionSize - mtctx->inBuff.filled;
+ if (hintInSize==0) hintInSize = mtctx->targetSectionSize;
+ return hintInSize;
+}
/** ZSTDMT_compressStream_generic() :
* internal use only - exposed to be invoked from zstd_compress.c
@@ -1727,7 +1996,8 @@ size_t ZSTDMT_compressStream_generic(ZSTDMT_CCtx* mtctx,
}
/* single-pass shortcut (note : synchronous-mode) */
- if ( (mtctx->nextJobID == 0) /* just started */
+ if ( (!mtctx->params.rsyncable) /* rsyncable mode is disabled */
+ && (mtctx->nextJobID == 0) /* just started */
&& (mtctx->inBuff.filled == 0) /* nothing buffered */
&& (!mtctx->jobReady) /* no job already created */
&& (endOp == ZSTD_e_end) /* end order */
@@ -1753,18 +2023,23 @@ size_t ZSTDMT_compressStream_generic(ZSTDMT_CCtx* mtctx,
/* It is only possible for this operation to fail if there are
* still compression jobs ongoing.
*/
+ DEBUGLOG(5, "ZSTDMT_tryGetInputRange failed");
assert(mtctx->doneJobID != mtctx->nextJobID);
- }
+ } else
+ DEBUGLOG(5, "ZSTDMT_tryGetInputRange completed successfully : mtctx->inBuff.buffer.start = %p", mtctx->inBuff.buffer.start);
}
if (mtctx->inBuff.buffer.start != NULL) {
- size_t const toLoad = MIN(input->size - input->pos, mtctx->targetSectionSize - mtctx->inBuff.filled);
+ syncPoint_t const syncPoint = findSynchronizationPoint(mtctx, *input);
+ if (syncPoint.flush && endOp == ZSTD_e_continue) {
+ endOp = ZSTD_e_flush;
+ }
assert(mtctx->inBuff.buffer.capacity >= mtctx->targetSectionSize);
DEBUGLOG(5, "ZSTDMT_compressStream_generic: adding %u bytes on top of %u to buffer of size %u",
- (U32)toLoad, (U32)mtctx->inBuff.filled, (U32)mtctx->targetSectionSize);
- memcpy((char*)mtctx->inBuff.buffer.start + mtctx->inBuff.filled, (const char*)input->src + input->pos, toLoad);
- input->pos += toLoad;
- mtctx->inBuff.filled += toLoad;
- forwardInputProgress = toLoad>0;
+ (U32)syncPoint.toLoad, (U32)mtctx->inBuff.filled, (U32)mtctx->targetSectionSize);
+ memcpy((char*)mtctx->inBuff.buffer.start + mtctx->inBuff.filled, (const char*)input->src + input->pos, syncPoint.toLoad);
+ input->pos += syncPoint.toLoad;
+ mtctx->inBuff.filled += syncPoint.toLoad;
+ forwardInputProgress = syncPoint.toLoad>0;
}
if ((input->pos < input->size) && (endOp == ZSTD_e_end))
endOp = ZSTD_e_flush; /* can't end now : not all input consumed */
@@ -1782,6 +2057,7 @@ size_t ZSTDMT_compressStream_generic(ZSTDMT_CCtx* mtctx,
/* check for potential compressed data ready to be flushed */
{ size_t const remainingToFlush = ZSTDMT_flushProduced(mtctx, output, !forwardInputProgress, endOp); /* block if there was no forward input progress */
if (input->pos < input->size) return MAX(remainingToFlush, 1); /* input not consumed : do not end flush yet */
+ DEBUGLOG(5, "end of ZSTDMT_compressStream_generic: remainingToFlush = %u", (U32)remainingToFlush);
return remainingToFlush;
}
}
diff --git a/thirdparty/zstd/compress/zstdmt_compress.h b/thirdparty/zstd/compress/zstdmt_compress.h
index f79e3b4418..ee771681fa 100644
--- a/thirdparty/zstd/compress/zstdmt_compress.h
+++ b/thirdparty/zstd/compress/zstdmt_compress.h
@@ -28,6 +28,16 @@
#include "zstd.h" /* ZSTD_inBuffer, ZSTD_outBuffer, ZSTDLIB_API */
+/* === Constants === */
+#ifndef ZSTDMT_NBWORKERS_MAX
+# define ZSTDMT_NBWORKERS_MAX 200
+#endif
+#ifndef ZSTDMT_JOBSIZE_MIN
+# define ZSTDMT_JOBSIZE_MIN (1 MB)
+#endif
+#define ZSTDMT_JOBSIZE_MAX (MEM_32bits() ? (512 MB) : (1024 MB))
+
+
/* === Memory management === */
typedef struct ZSTDMT_CCtx_s ZSTDMT_CCtx;
ZSTDLIB_API ZSTDMT_CCtx* ZSTDMT_createCCtx(unsigned nbWorkers);
@@ -52,6 +62,7 @@ ZSTDLIB_API size_t ZSTDMT_compressCCtx(ZSTDMT_CCtx* mtctx,
ZSTDLIB_API size_t ZSTDMT_initCStream(ZSTDMT_CCtx* mtctx, int compressionLevel);
ZSTDLIB_API size_t ZSTDMT_resetCStream(ZSTDMT_CCtx* mtctx, unsigned long long pledgedSrcSize); /**< if srcSize is not known at reset time, use ZSTD_CONTENTSIZE_UNKNOWN. Note: for compatibility with older programs, 0 means the same as ZSTD_CONTENTSIZE_UNKNOWN, but it will change in the future to mean "empty" */
+ZSTDLIB_API size_t ZSTDMT_nextInputSizeHint(const ZSTDMT_CCtx* mtctx);
ZSTDLIB_API size_t ZSTDMT_compressStream(ZSTDMT_CCtx* mtctx, ZSTD_outBuffer* output, ZSTD_inBuffer* input);
ZSTDLIB_API size_t ZSTDMT_flushStream(ZSTDMT_CCtx* mtctx, ZSTD_outBuffer* output); /**< @return : 0 == all flushed; >0 : still some data to be flushed; or an error code (ZSTD_isError()) */
@@ -60,16 +71,12 @@ ZSTDLIB_API size_t ZSTDMT_endStream(ZSTDMT_CCtx* mtctx, ZSTD_outBuffer* output);
/* === Advanced functions and parameters === */
-#ifndef ZSTDMT_JOBSIZE_MIN
-# define ZSTDMT_JOBSIZE_MIN (1U << 20) /* 1 MB - Minimum size of each compression job */
-#endif
-
ZSTDLIB_API size_t ZSTDMT_compress_advanced(ZSTDMT_CCtx* mtctx,
void* dst, size_t dstCapacity,
const void* src, size_t srcSize,
const ZSTD_CDict* cdict,
ZSTD_parameters params,
- unsigned overlapLog);
+ int overlapLog);
ZSTDLIB_API size_t ZSTDMT_initCStream_advanced(ZSTDMT_CCtx* mtctx,
const void* dict, size_t dictSize, /* dict can be released after init, a local copy is preserved within zcs */
@@ -84,8 +91,9 @@ ZSTDLIB_API size_t ZSTDMT_initCStream_usingCDict(ZSTDMT_CCtx* mtctx,
/* ZSTDMT_parameter :
* List of parameters that can be set using ZSTDMT_setMTCtxParameter() */
typedef enum {
- ZSTDMT_p_jobSize, /* Each job is compressed in parallel. By default, this value is dynamically determined depending on compression parameters. Can be set explicitly here. */
- ZSTDMT_p_overlapSectionLog /* Each job may reload a part of previous job to enhance compressionr ratio; 0 == no overlap, 6(default) == use 1/8th of window, >=9 == use full window. This is a "sticky" parameter : its value will be re-used on next compression job */
+ ZSTDMT_p_jobSize, /* Each job is compressed in parallel. By default, this value is dynamically determined depending on compression parameters. Can be set explicitly here. */
+ ZSTDMT_p_overlapLog, /* Each job may reload a part of previous job to enhance compressionr ratio; 0 == no overlap, 6(default) == use 1/8th of window, >=9 == use full window. This is a "sticky" parameter : its value will be re-used on next compression job */
+ ZSTDMT_p_rsyncable /* Enables rsyncable mode. */
} ZSTDMT_parameter;
/* ZSTDMT_setMTCtxParameter() :
@@ -93,7 +101,12 @@ typedef enum {
* The function must be called typically after ZSTD_createCCtx() but __before ZSTDMT_init*() !__
* Parameters not explicitly reset by ZSTDMT_init*() remain the same in consecutive compression sessions.
* @return : 0, or an error code (which can be tested using ZSTD_isError()) */
-ZSTDLIB_API size_t ZSTDMT_setMTCtxParameter(ZSTDMT_CCtx* mtctx, ZSTDMT_parameter parameter, unsigned value);
+ZSTDLIB_API size_t ZSTDMT_setMTCtxParameter(ZSTDMT_CCtx* mtctx, ZSTDMT_parameter parameter, int value);
+
+/* ZSTDMT_getMTCtxParameter() :
+ * Query the ZSTDMT_CCtx for a parameter value.
+ * @return : 0, or an error code (which can be tested using ZSTD_isError()) */
+ZSTDLIB_API size_t ZSTDMT_getMTCtxParameter(ZSTDMT_CCtx* mtctx, ZSTDMT_parameter parameter, int* value);
/*! ZSTDMT_compressStream_generic() :
@@ -114,11 +127,21 @@ ZSTDLIB_API size_t ZSTDMT_compressStream_generic(ZSTDMT_CCtx* mtctx,
* === Not exposed in libzstd. Never invoke directly ===
* ======================================================== */
-size_t ZSTDMT_CCtxParam_setMTCtxParameter(ZSTD_CCtx_params* params, ZSTDMT_parameter parameter, unsigned value);
-
-/* ZSTDMT_CCtxParam_setNbWorkers()
- * Set nbWorkers, and clamp it.
- * Also reset jobSize and overlapLog */
+ /*! ZSTDMT_toFlushNow()
+ * Tell how many bytes are ready to be flushed immediately.
+ * Probe the oldest active job (not yet entirely flushed) and check its output buffer.
+ * If return 0, it means there is no active job,
+ * or, it means oldest job is still active, but everything produced has been flushed so far,
+ * therefore flushing is limited by speed of oldest job. */
+size_t ZSTDMT_toFlushNow(ZSTDMT_CCtx* mtctx);
+
+/*! ZSTDMT_CCtxParam_setMTCtxParameter()
+ * like ZSTDMT_setMTCtxParameter(), but into a ZSTD_CCtx_Params */
+size_t ZSTDMT_CCtxParam_setMTCtxParameter(ZSTD_CCtx_params* params, ZSTDMT_parameter parameter, int value);
+
+/*! ZSTDMT_CCtxParam_setNbWorkers()
+ * Set nbWorkers, and clamp it.
+ * Also reset jobSize and overlapLog */
size_t ZSTDMT_CCtxParam_setNbWorkers(ZSTD_CCtx_params* params, unsigned nbWorkers);
/*! ZSTDMT_updateCParams_whileCompressing() :
@@ -126,14 +149,9 @@ size_t ZSTDMT_CCtxParam_setNbWorkers(ZSTD_CCtx_params* params, unsigned nbWorker
* New parameters will be applied to next compression job. */
void ZSTDMT_updateCParams_whileCompressing(ZSTDMT_CCtx* mtctx, const ZSTD_CCtx_params* cctxParams);
-/* ZSTDMT_getNbWorkers():
- * @return nb threads currently active in mtctx.
- * mtctx must be valid */
-unsigned ZSTDMT_getNbWorkers(const ZSTDMT_CCtx* mtctx);
-
-/* ZSTDMT_getFrameProgression():
- * tells how much data has been consumed (input) and produced (output) for current frame.
- * able to count progression inside worker threads.
+/*! ZSTDMT_getFrameProgression():
+ * tells how much data has been consumed (input) and produced (output) for current frame.
+ * able to count progression inside worker threads.
*/
ZSTD_frameProgression ZSTDMT_getFrameProgression(ZSTDMT_CCtx* mtctx);
diff --git a/thirdparty/zstd/decompress/huf_decompress.c b/thirdparty/zstd/decompress/huf_decompress.c
index 73f5c46c06..3f8bd29732 100644
--- a/thirdparty/zstd/decompress/huf_decompress.c
+++ b/thirdparty/zstd/decompress/huf_decompress.c
@@ -1,6 +1,7 @@
/* ******************************************************************
- Huffman decoder, part of New Generation Entropy library
- Copyright (C) 2013-2016, Yann Collet.
+ huff0 huffman decoder,
+ part of Finite State Entropy library
+ Copyright (C) 2013-present, Yann Collet.
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
@@ -29,26 +30,37 @@
You can contact the author at :
- FSE+HUF source repository : https://github.com/Cyan4973/FiniteStateEntropy
- - Public forum : https://groups.google.com/forum/#!forum/lz4c
****************************************************************** */
/* **************************************************************
* Dependencies
****************************************************************/
#include <string.h> /* memcpy, memset */
-#include "bitstream.h" /* BIT_* */
#include "compiler.h"
-#include "fse.h" /* header compression */
+#include "bitstream.h" /* BIT_* */
+#include "fse.h" /* to compress headers */
#define HUF_STATIC_LINKING_ONLY
#include "huf.h"
#include "error_private.h"
+/* **************************************************************
+* Macros
+****************************************************************/
+
+/* These two optional macros force the use one way or another of the two
+ * Huffman decompression implementations. You can't force in both directions
+ * at the same time.
+ */
+#if defined(HUF_FORCE_DECOMPRESS_X1) && \
+ defined(HUF_FORCE_DECOMPRESS_X2)
+#error "Cannot force the use of the X1 and X2 decoders at the same time!"
+#endif
+
/* **************************************************************
* Error Management
****************************************************************/
#define HUF_isError ERR_isError
-#define HUF_STATIC_ASSERT(c) { enum { HUF_static_assert = 1/(int)(!!(c)) }; } /* use only *after* variable declarations */
#define CHECK_F(f) { size_t const err_ = (f); if (HUF_isError(err_)) return err_; }
@@ -59,6 +71,51 @@
#define HUF_ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask))
+/* **************************************************************
+* BMI2 Variant Wrappers
+****************************************************************/
+#if DYNAMIC_BMI2
+
+#define HUF_DGEN(fn) \
+ \
+ static size_t fn##_default( \
+ void* dst, size_t dstSize, \
+ const void* cSrc, size_t cSrcSize, \
+ const HUF_DTable* DTable) \
+ { \
+ return fn##_body(dst, dstSize, cSrc, cSrcSize, DTable); \
+ } \
+ \
+ static TARGET_ATTRIBUTE("bmi2") size_t fn##_bmi2( \
+ void* dst, size_t dstSize, \
+ const void* cSrc, size_t cSrcSize, \
+ const HUF_DTable* DTable) \
+ { \
+ return fn##_body(dst, dstSize, cSrc, cSrcSize, DTable); \
+ } \
+ \
+ static size_t fn(void* dst, size_t dstSize, void const* cSrc, \
+ size_t cSrcSize, HUF_DTable const* DTable, int bmi2) \
+ { \
+ if (bmi2) { \
+ return fn##_bmi2(dst, dstSize, cSrc, cSrcSize, DTable); \
+ } \
+ return fn##_default(dst, dstSize, cSrc, cSrcSize, DTable); \
+ }
+
+#else
+
+#define HUF_DGEN(fn) \
+ static size_t fn(void* dst, size_t dstSize, void const* cSrc, \
+ size_t cSrcSize, HUF_DTable const* DTable, int bmi2) \
+ { \
+ (void)bmi2; \
+ return fn##_body(dst, dstSize, cSrc, cSrcSize, DTable); \
+ }
+
+#endif
+
+
/*-***************************/
/* generic DTableDesc */
/*-***************************/
@@ -72,18 +129,20 @@ static DTableDesc HUF_getDTableDesc(const HUF_DTable* table)
}
+#ifndef HUF_FORCE_DECOMPRESS_X2
+
/*-***************************/
/* single-symbol decoding */
/*-***************************/
-typedef struct { BYTE byte; BYTE nbBits; } HUF_DEltX2; /* single-symbol decoding */
+typedef struct { BYTE byte; BYTE nbBits; } HUF_DEltX1; /* single-symbol decoding */
-size_t HUF_readDTableX2_wksp(HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize)
+size_t HUF_readDTableX1_wksp(HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize)
{
U32 tableLog = 0;
U32 nbSymbols = 0;
size_t iSize;
void* const dtPtr = DTable + 1;
- HUF_DEltX2* const dt = (HUF_DEltX2*)dtPtr;
+ HUF_DEltX1* const dt = (HUF_DEltX1*)dtPtr;
U32* rankVal;
BYTE* huffWeight;
@@ -96,7 +155,7 @@ size_t HUF_readDTableX2_wksp(HUF_DTable* DTable, const void* src, size_t srcSize
if ((spaceUsed32 << 2) > wkspSize) return ERROR(tableLog_tooLarge);
- HUF_STATIC_ASSERT(sizeof(DTableDesc) == sizeof(HUF_DTable));
+ DEBUG_STATIC_ASSERT(sizeof(DTableDesc) == sizeof(HUF_DTable));
/* memset(huffWeight, 0, sizeof(huffWeight)); */ /* is not necessary, even though some analyzer complain ... */
iSize = HUF_readStats(huffWeight, HUF_SYMBOLVALUE_MAX + 1, rankVal, &nbSymbols, &tableLog, src, srcSize);
@@ -124,7 +183,7 @@ size_t HUF_readDTableX2_wksp(HUF_DTable* DTable, const void* src, size_t srcSize
U32 const w = huffWeight[n];
U32 const length = (1 << w) >> 1;
U32 u;
- HUF_DEltX2 D;
+ HUF_DEltX1 D;
D.byte = (BYTE)n; D.nbBits = (BYTE)(tableLog + 1 - w);
for (u = rankVal[w]; u < rankVal[w] + length; u++)
dt[u] = D;
@@ -134,17 +193,15 @@ size_t HUF_readDTableX2_wksp(HUF_DTable* DTable, const void* src, size_t srcSize
return iSize;
}
-size_t HUF_readDTableX2(HUF_DTable* DTable, const void* src, size_t srcSize)
+size_t HUF_readDTableX1(HUF_DTable* DTable, const void* src, size_t srcSize)
{
U32 workSpace[HUF_DECOMPRESS_WORKSPACE_SIZE_U32];
- return HUF_readDTableX2_wksp(DTable, src, srcSize,
+ return HUF_readDTableX1_wksp(DTable, src, srcSize,
workSpace, sizeof(workSpace));
}
-typedef struct { U16 sequence; BYTE nbBits; BYTE length; } HUF_DEltX4; /* double-symbols decoding */
-
FORCE_INLINE_TEMPLATE BYTE
-HUF_decodeSymbolX2(BIT_DStream_t* Dstream, const HUF_DEltX2* dt, const U32 dtLog)
+HUF_decodeSymbolX1(BIT_DStream_t* Dstream, const HUF_DEltX1* dt, const U32 dtLog)
{
size_t const val = BIT_lookBitsFast(Dstream, dtLog); /* note : dtLog >= 1 */
BYTE const c = dt[val].byte;
@@ -152,44 +209,44 @@ HUF_decodeSymbolX2(BIT_DStream_t* Dstream, const HUF_DEltX2* dt, const U32 dtLog
return c;
}
-#define HUF_DECODE_SYMBOLX2_0(ptr, DStreamPtr) \
- *ptr++ = HUF_decodeSymbolX2(DStreamPtr, dt, dtLog)
+#define HUF_DECODE_SYMBOLX1_0(ptr, DStreamPtr) \
+ *ptr++ = HUF_decodeSymbolX1(DStreamPtr, dt, dtLog)
-#define HUF_DECODE_SYMBOLX2_1(ptr, DStreamPtr) \
+#define HUF_DECODE_SYMBOLX1_1(ptr, DStreamPtr) \
if (MEM_64bits() || (HUF_TABLELOG_MAX<=12)) \
- HUF_DECODE_SYMBOLX2_0(ptr, DStreamPtr)
+ HUF_DECODE_SYMBOLX1_0(ptr, DStreamPtr)
-#define HUF_DECODE_SYMBOLX2_2(ptr, DStreamPtr) \
+#define HUF_DECODE_SYMBOLX1_2(ptr, DStreamPtr) \
if (MEM_64bits()) \
- HUF_DECODE_SYMBOLX2_0(ptr, DStreamPtr)
+ HUF_DECODE_SYMBOLX1_0(ptr, DStreamPtr)
HINT_INLINE size_t
-HUF_decodeStreamX2(BYTE* p, BIT_DStream_t* const bitDPtr, BYTE* const pEnd, const HUF_DEltX2* const dt, const U32 dtLog)
+HUF_decodeStreamX1(BYTE* p, BIT_DStream_t* const bitDPtr, BYTE* const pEnd, const HUF_DEltX1* const dt, const U32 dtLog)
{
BYTE* const pStart = p;
/* up to 4 symbols at a time */
while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd-3)) {
- HUF_DECODE_SYMBOLX2_2(p, bitDPtr);
- HUF_DECODE_SYMBOLX2_1(p, bitDPtr);
- HUF_DECODE_SYMBOLX2_2(p, bitDPtr);
- HUF_DECODE_SYMBOLX2_0(p, bitDPtr);
+ HUF_DECODE_SYMBOLX1_2(p, bitDPtr);
+ HUF_DECODE_SYMBOLX1_1(p, bitDPtr);
+ HUF_DECODE_SYMBOLX1_2(p, bitDPtr);
+ HUF_DECODE_SYMBOLX1_0(p, bitDPtr);
}
/* [0-3] symbols remaining */
if (MEM_32bits())
while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd))
- HUF_DECODE_SYMBOLX2_0(p, bitDPtr);
+ HUF_DECODE_SYMBOLX1_0(p, bitDPtr);
/* no more data to retrieve from bitstream, no need to reload */
while (p < pEnd)
- HUF_DECODE_SYMBOLX2_0(p, bitDPtr);
+ HUF_DECODE_SYMBOLX1_0(p, bitDPtr);
return pEnd-pStart;
}
FORCE_INLINE_TEMPLATE size_t
-HUF_decompress1X2_usingDTable_internal_body(
+HUF_decompress1X1_usingDTable_internal_body(
void* dst, size_t dstSize,
const void* cSrc, size_t cSrcSize,
const HUF_DTable* DTable)
@@ -197,14 +254,14 @@ HUF_decompress1X2_usingDTable_internal_body(
BYTE* op = (BYTE*)dst;
BYTE* const oend = op + dstSize;
const void* dtPtr = DTable + 1;
- const HUF_DEltX2* const dt = (const HUF_DEltX2*)dtPtr;
+ const HUF_DEltX1* const dt = (const HUF_DEltX1*)dtPtr;
BIT_DStream_t bitD;
DTableDesc const dtd = HUF_getDTableDesc(DTable);
U32 const dtLog = dtd.tableLog;
CHECK_F( BIT_initDStream(&bitD, cSrc, cSrcSize) );
- HUF_decodeStreamX2(op, &bitD, oend, dt, dtLog);
+ HUF_decodeStreamX1(op, &bitD, oend, dt, dtLog);
if (!BIT_endOfDStream(&bitD)) return ERROR(corruption_detected);
@@ -212,7 +269,7 @@ HUF_decompress1X2_usingDTable_internal_body(
}
FORCE_INLINE_TEMPLATE size_t
-HUF_decompress4X2_usingDTable_internal_body(
+HUF_decompress4X1_usingDTable_internal_body(
void* dst, size_t dstSize,
const void* cSrc, size_t cSrcSize,
const HUF_DTable* DTable)
@@ -224,7 +281,7 @@ HUF_decompress4X2_usingDTable_internal_body(
BYTE* const ostart = (BYTE*) dst;
BYTE* const oend = ostart + dstSize;
const void* const dtPtr = DTable + 1;
- const HUF_DEltX2* const dt = (const HUF_DEltX2*)dtPtr;
+ const HUF_DEltX1* const dt = (const HUF_DEltX1*)dtPtr;
/* Init */
BIT_DStream_t bitD1;
@@ -260,22 +317,22 @@ HUF_decompress4X2_usingDTable_internal_body(
/* up to 16 symbols per loop (4 symbols per stream) in 64-bit mode */
endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
while ( (endSignal==BIT_DStream_unfinished) && (op4<(oend-3)) ) {
- HUF_DECODE_SYMBOLX2_2(op1, &bitD1);
- HUF_DECODE_SYMBOLX2_2(op2, &bitD2);
- HUF_DECODE_SYMBOLX2_2(op3, &bitD3);
- HUF_DECODE_SYMBOLX2_2(op4, &bitD4);
- HUF_DECODE_SYMBOLX2_1(op1, &bitD1);
- HUF_DECODE_SYMBOLX2_1(op2, &bitD2);
- HUF_DECODE_SYMBOLX2_1(op3, &bitD3);
- HUF_DECODE_SYMBOLX2_1(op4, &bitD4);
- HUF_DECODE_SYMBOLX2_2(op1, &bitD1);
- HUF_DECODE_SYMBOLX2_2(op2, &bitD2);
- HUF_DECODE_SYMBOLX2_2(op3, &bitD3);
- HUF_DECODE_SYMBOLX2_2(op4, &bitD4);
- HUF_DECODE_SYMBOLX2_0(op1, &bitD1);
- HUF_DECODE_SYMBOLX2_0(op2, &bitD2);
- HUF_DECODE_SYMBOLX2_0(op3, &bitD3);
- HUF_DECODE_SYMBOLX2_0(op4, &bitD4);
+ HUF_DECODE_SYMBOLX1_2(op1, &bitD1);
+ HUF_DECODE_SYMBOLX1_2(op2, &bitD2);
+ HUF_DECODE_SYMBOLX1_2(op3, &bitD3);
+ HUF_DECODE_SYMBOLX1_2(op4, &bitD4);
+ HUF_DECODE_SYMBOLX1_1(op1, &bitD1);
+ HUF_DECODE_SYMBOLX1_1(op2, &bitD2);
+ HUF_DECODE_SYMBOLX1_1(op3, &bitD3);
+ HUF_DECODE_SYMBOLX1_1(op4, &bitD4);
+ HUF_DECODE_SYMBOLX1_2(op1, &bitD1);
+ HUF_DECODE_SYMBOLX1_2(op2, &bitD2);
+ HUF_DECODE_SYMBOLX1_2(op3, &bitD3);
+ HUF_DECODE_SYMBOLX1_2(op4, &bitD4);
+ HUF_DECODE_SYMBOLX1_0(op1, &bitD1);
+ HUF_DECODE_SYMBOLX1_0(op2, &bitD2);
+ HUF_DECODE_SYMBOLX1_0(op3, &bitD3);
+ HUF_DECODE_SYMBOLX1_0(op4, &bitD4);
BIT_reloadDStream(&bitD1);
BIT_reloadDStream(&bitD2);
BIT_reloadDStream(&bitD3);
@@ -291,191 +348,10 @@ HUF_decompress4X2_usingDTable_internal_body(
/* note : op4 supposed already verified within main loop */
/* finish bitStreams one by one */
- HUF_decodeStreamX2(op1, &bitD1, opStart2, dt, dtLog);
- HUF_decodeStreamX2(op2, &bitD2, opStart3, dt, dtLog);
- HUF_decodeStreamX2(op3, &bitD3, opStart4, dt, dtLog);
- HUF_decodeStreamX2(op4, &bitD4, oend, dt, dtLog);
-
- /* check */
- { U32 const endCheck = BIT_endOfDStream(&bitD1) & BIT_endOfDStream(&bitD2) & BIT_endOfDStream(&bitD3) & BIT_endOfDStream(&bitD4);
- if (!endCheck) return ERROR(corruption_detected); }
-
- /* decoded size */
- return dstSize;
- }
-}
-
-
-FORCE_INLINE_TEMPLATE U32
-HUF_decodeSymbolX4(void* op, BIT_DStream_t* DStream, const HUF_DEltX4* dt, const U32 dtLog)
-{
- size_t const val = BIT_lookBitsFast(DStream, dtLog); /* note : dtLog >= 1 */
- memcpy(op, dt+val, 2);
- BIT_skipBits(DStream, dt[val].nbBits);
- return dt[val].length;
-}
-
-FORCE_INLINE_TEMPLATE U32
-HUF_decodeLastSymbolX4(void* op, BIT_DStream_t* DStream, const HUF_DEltX4* dt, const U32 dtLog)
-{
- size_t const val = BIT_lookBitsFast(DStream, dtLog); /* note : dtLog >= 1 */
- memcpy(op, dt+val, 1);
- if (dt[val].length==1) BIT_skipBits(DStream, dt[val].nbBits);
- else {
- if (DStream->bitsConsumed < (sizeof(DStream->bitContainer)*8)) {
- BIT_skipBits(DStream, dt[val].nbBits);
- if (DStream->bitsConsumed > (sizeof(DStream->bitContainer)*8))
- /* ugly hack; works only because it's the last symbol. Note : can't easily extract nbBits from just this symbol */
- DStream->bitsConsumed = (sizeof(DStream->bitContainer)*8);
- } }
- return 1;
-}
-
-#define HUF_DECODE_SYMBOLX4_0(ptr, DStreamPtr) \
- ptr += HUF_decodeSymbolX4(ptr, DStreamPtr, dt, dtLog)
-
-#define HUF_DECODE_SYMBOLX4_1(ptr, DStreamPtr) \
- if (MEM_64bits() || (HUF_TABLELOG_MAX<=12)) \
- ptr += HUF_decodeSymbolX4(ptr, DStreamPtr, dt, dtLog)
-
-#define HUF_DECODE_SYMBOLX4_2(ptr, DStreamPtr) \
- if (MEM_64bits()) \
- ptr += HUF_decodeSymbolX4(ptr, DStreamPtr, dt, dtLog)
-
-HINT_INLINE size_t
-HUF_decodeStreamX4(BYTE* p, BIT_DStream_t* bitDPtr, BYTE* const pEnd,
- const HUF_DEltX4* const dt, const U32 dtLog)
-{
- BYTE* const pStart = p;
-
- /* up to 8 symbols at a time */
- while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd-(sizeof(bitDPtr->bitContainer)-1))) {
- HUF_DECODE_SYMBOLX4_2(p, bitDPtr);
- HUF_DECODE_SYMBOLX4_1(p, bitDPtr);
- HUF_DECODE_SYMBOLX4_2(p, bitDPtr);
- HUF_DECODE_SYMBOLX4_0(p, bitDPtr);
- }
-
- /* closer to end : up to 2 symbols at a time */
- while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p <= pEnd-2))
- HUF_DECODE_SYMBOLX4_0(p, bitDPtr);
-
- while (p <= pEnd-2)
- HUF_DECODE_SYMBOLX4_0(p, bitDPtr); /* no need to reload : reached the end of DStream */
-
- if (p < pEnd)
- p += HUF_decodeLastSymbolX4(p, bitDPtr, dt, dtLog);
-
- return p-pStart;
-}
-
-FORCE_INLINE_TEMPLATE size_t
-HUF_decompress1X4_usingDTable_internal_body(
- void* dst, size_t dstSize,
- const void* cSrc, size_t cSrcSize,
- const HUF_DTable* DTable)
-{
- BIT_DStream_t bitD;
-
- /* Init */
- CHECK_F( BIT_initDStream(&bitD, cSrc, cSrcSize) );
-
- /* decode */
- { BYTE* const ostart = (BYTE*) dst;
- BYTE* const oend = ostart + dstSize;
- const void* const dtPtr = DTable+1; /* force compiler to not use strict-aliasing */
- const HUF_DEltX4* const dt = (const HUF_DEltX4*)dtPtr;
- DTableDesc const dtd = HUF_getDTableDesc(DTable);
- HUF_decodeStreamX4(ostart, &bitD, oend, dt, dtd.tableLog);
- }
-
- /* check */
- if (!BIT_endOfDStream(&bitD)) return ERROR(corruption_detected);
-
- /* decoded size */
- return dstSize;
-}
-
-
-FORCE_INLINE_TEMPLATE size_t
-HUF_decompress4X4_usingDTable_internal_body(
- void* dst, size_t dstSize,
- const void* cSrc, size_t cSrcSize,
- const HUF_DTable* DTable)
-{
- if (cSrcSize < 10) return ERROR(corruption_detected); /* strict minimum : jump table + 1 byte per stream */
-
- { const BYTE* const istart = (const BYTE*) cSrc;
- BYTE* const ostart = (BYTE*) dst;
- BYTE* const oend = ostart + dstSize;
- const void* const dtPtr = DTable+1;
- const HUF_DEltX4* const dt = (const HUF_DEltX4*)dtPtr;
-
- /* Init */
- BIT_DStream_t bitD1;
- BIT_DStream_t bitD2;
- BIT_DStream_t bitD3;
- BIT_DStream_t bitD4;
- size_t const length1 = MEM_readLE16(istart);
- size_t const length2 = MEM_readLE16(istart+2);
- size_t const length3 = MEM_readLE16(istart+4);
- size_t const length4 = cSrcSize - (length1 + length2 + length3 + 6);
- const BYTE* const istart1 = istart + 6; /* jumpTable */
- const BYTE* const istart2 = istart1 + length1;
- const BYTE* const istart3 = istart2 + length2;
- const BYTE* const istart4 = istart3 + length3;
- size_t const segmentSize = (dstSize+3) / 4;
- BYTE* const opStart2 = ostart + segmentSize;
- BYTE* const opStart3 = opStart2 + segmentSize;
- BYTE* const opStart4 = opStart3 + segmentSize;
- BYTE* op1 = ostart;
- BYTE* op2 = opStart2;
- BYTE* op3 = opStart3;
- BYTE* op4 = opStart4;
- U32 endSignal;
- DTableDesc const dtd = HUF_getDTableDesc(DTable);
- U32 const dtLog = dtd.tableLog;
-
- if (length4 > cSrcSize) return ERROR(corruption_detected); /* overflow */
- CHECK_F( BIT_initDStream(&bitD1, istart1, length1) );
- CHECK_F( BIT_initDStream(&bitD2, istart2, length2) );
- CHECK_F( BIT_initDStream(&bitD3, istart3, length3) );
- CHECK_F( BIT_initDStream(&bitD4, istart4, length4) );
-
- /* 16-32 symbols per loop (4-8 symbols per stream) */
- endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
- for ( ; (endSignal==BIT_DStream_unfinished) & (op4<(oend-(sizeof(bitD4.bitContainer)-1))) ; ) {
- HUF_DECODE_SYMBOLX4_2(op1, &bitD1);
- HUF_DECODE_SYMBOLX4_2(op2, &bitD2);
- HUF_DECODE_SYMBOLX4_2(op3, &bitD3);
- HUF_DECODE_SYMBOLX4_2(op4, &bitD4);
- HUF_DECODE_SYMBOLX4_1(op1, &bitD1);
- HUF_DECODE_SYMBOLX4_1(op2, &bitD2);
- HUF_DECODE_SYMBOLX4_1(op3, &bitD3);
- HUF_DECODE_SYMBOLX4_1(op4, &bitD4);
- HUF_DECODE_SYMBOLX4_2(op1, &bitD1);
- HUF_DECODE_SYMBOLX4_2(op2, &bitD2);
- HUF_DECODE_SYMBOLX4_2(op3, &bitD3);
- HUF_DECODE_SYMBOLX4_2(op4, &bitD4);
- HUF_DECODE_SYMBOLX4_0(op1, &bitD1);
- HUF_DECODE_SYMBOLX4_0(op2, &bitD2);
- HUF_DECODE_SYMBOLX4_0(op3, &bitD3);
- HUF_DECODE_SYMBOLX4_0(op4, &bitD4);
-
- endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
- }
-
- /* check corruption */
- if (op1 > opStart2) return ERROR(corruption_detected);
- if (op2 > opStart3) return ERROR(corruption_detected);
- if (op3 > opStart4) return ERROR(corruption_detected);
- /* note : op4 already verified within main loop */
-
- /* finish bitStreams one by one */
- HUF_decodeStreamX4(op1, &bitD1, opStart2, dt, dtLog);
- HUF_decodeStreamX4(op2, &bitD2, opStart3, dt, dtLog);
- HUF_decodeStreamX4(op3, &bitD3, opStart4, dt, dtLog);
- HUF_decodeStreamX4(op4, &bitD4, oend, dt, dtLog);
+ HUF_decodeStreamX1(op1, &bitD1, opStart2, dt, dtLog);
+ HUF_decodeStreamX1(op2, &bitD2, opStart3, dt, dtLog);
+ HUF_decodeStreamX1(op3, &bitD3, opStart4, dt, dtLog);
+ HUF_decodeStreamX1(op4, &bitD4, oend, dt, dtLog);
/* check */
{ U32 const endCheck = BIT_endOfDStream(&bitD1) & BIT_endOfDStream(&bitD2) & BIT_endOfDStream(&bitD3) & BIT_endOfDStream(&bitD4);
@@ -491,153 +367,119 @@ typedef size_t (*HUF_decompress_usingDTable_t)(void *dst, size_t dstSize,
const void *cSrc,
size_t cSrcSize,
const HUF_DTable *DTable);
-#if DYNAMIC_BMI2
-
-#define X(fn) \
- \
- static size_t fn##_default( \
- void* dst, size_t dstSize, \
- const void* cSrc, size_t cSrcSize, \
- const HUF_DTable* DTable) \
- { \
- return fn##_body(dst, dstSize, cSrc, cSrcSize, DTable); \
- } \
- \
- static TARGET_ATTRIBUTE("bmi2") size_t fn##_bmi2( \
- void* dst, size_t dstSize, \
- const void* cSrc, size_t cSrcSize, \
- const HUF_DTable* DTable) \
- { \
- return fn##_body(dst, dstSize, cSrc, cSrcSize, DTable); \
- } \
- \
- static size_t fn(void* dst, size_t dstSize, void const* cSrc, \
- size_t cSrcSize, HUF_DTable const* DTable, int bmi2) \
- { \
- if (bmi2) { \
- return fn##_bmi2(dst, dstSize, cSrc, cSrcSize, DTable); \
- } \
- return fn##_default(dst, dstSize, cSrc, cSrcSize, DTable); \
- }
-
-#else
-
-#define X(fn) \
- static size_t fn(void* dst, size_t dstSize, void const* cSrc, \
- size_t cSrcSize, HUF_DTable const* DTable, int bmi2) \
- { \
- (void)bmi2; \
- return fn##_body(dst, dstSize, cSrc, cSrcSize, DTable); \
- }
-
-#endif
-X(HUF_decompress1X2_usingDTable_internal)
-X(HUF_decompress4X2_usingDTable_internal)
-X(HUF_decompress1X4_usingDTable_internal)
-X(HUF_decompress4X4_usingDTable_internal)
+HUF_DGEN(HUF_decompress1X1_usingDTable_internal)
+HUF_DGEN(HUF_decompress4X1_usingDTable_internal)
-#undef X
-size_t HUF_decompress1X2_usingDTable(
+size_t HUF_decompress1X1_usingDTable(
void* dst, size_t dstSize,
const void* cSrc, size_t cSrcSize,
const HUF_DTable* DTable)
{
DTableDesc dtd = HUF_getDTableDesc(DTable);
if (dtd.tableType != 0) return ERROR(GENERIC);
- return HUF_decompress1X2_usingDTable_internal(dst, dstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0);
+ return HUF_decompress1X1_usingDTable_internal(dst, dstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0);
}
-size_t HUF_decompress1X2_DCtx_wksp(HUF_DTable* DCtx, void* dst, size_t dstSize,
+size_t HUF_decompress1X1_DCtx_wksp(HUF_DTable* DCtx, void* dst, size_t dstSize,
const void* cSrc, size_t cSrcSize,
void* workSpace, size_t wkspSize)
{
const BYTE* ip = (const BYTE*) cSrc;
- size_t const hSize = HUF_readDTableX2_wksp(DCtx, cSrc, cSrcSize, workSpace, wkspSize);
+ size_t const hSize = HUF_readDTableX1_wksp(DCtx, cSrc, cSrcSize, workSpace, wkspSize);
if (HUF_isError(hSize)) return hSize;
if (hSize >= cSrcSize) return ERROR(srcSize_wrong);
ip += hSize; cSrcSize -= hSize;
- return HUF_decompress1X2_usingDTable_internal(dst, dstSize, ip, cSrcSize, DCtx, /* bmi2 */ 0);
+ return HUF_decompress1X1_usingDTable_internal(dst, dstSize, ip, cSrcSize, DCtx, /* bmi2 */ 0);
}
-size_t HUF_decompress1X2_DCtx(HUF_DTable* DCtx, void* dst, size_t dstSize,
+size_t HUF_decompress1X1_DCtx(HUF_DTable* DCtx, void* dst, size_t dstSize,
const void* cSrc, size_t cSrcSize)
{
U32 workSpace[HUF_DECOMPRESS_WORKSPACE_SIZE_U32];
- return HUF_decompress1X2_DCtx_wksp(DCtx, dst, dstSize, cSrc, cSrcSize,
+ return HUF_decompress1X1_DCtx_wksp(DCtx, dst, dstSize, cSrc, cSrcSize,
workSpace, sizeof(workSpace));
}
-size_t HUF_decompress1X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
+size_t HUF_decompress1X1 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
{
- HUF_CREATE_STATIC_DTABLEX2(DTable, HUF_TABLELOG_MAX);
- return HUF_decompress1X2_DCtx (DTable, dst, dstSize, cSrc, cSrcSize);
+ HUF_CREATE_STATIC_DTABLEX1(DTable, HUF_TABLELOG_MAX);
+ return HUF_decompress1X1_DCtx (DTable, dst, dstSize, cSrc, cSrcSize);
}
-size_t HUF_decompress4X2_usingDTable(
+size_t HUF_decompress4X1_usingDTable(
void* dst, size_t dstSize,
const void* cSrc, size_t cSrcSize,
const HUF_DTable* DTable)
{
DTableDesc dtd = HUF_getDTableDesc(DTable);
if (dtd.tableType != 0) return ERROR(GENERIC);
- return HUF_decompress4X2_usingDTable_internal(dst, dstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0);
+ return HUF_decompress4X1_usingDTable_internal(dst, dstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0);
}
-static size_t HUF_decompress4X2_DCtx_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize,
+static size_t HUF_decompress4X1_DCtx_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize,
const void* cSrc, size_t cSrcSize,
void* workSpace, size_t wkspSize, int bmi2)
{
const BYTE* ip = (const BYTE*) cSrc;
- size_t const hSize = HUF_readDTableX2_wksp (dctx, cSrc, cSrcSize,
+ size_t const hSize = HUF_readDTableX1_wksp (dctx, cSrc, cSrcSize,
workSpace, wkspSize);
if (HUF_isError(hSize)) return hSize;
if (hSize >= cSrcSize) return ERROR(srcSize_wrong);
ip += hSize; cSrcSize -= hSize;
- return HUF_decompress4X2_usingDTable_internal(dst, dstSize, ip, cSrcSize, dctx, bmi2);
+ return HUF_decompress4X1_usingDTable_internal(dst, dstSize, ip, cSrcSize, dctx, bmi2);
}
-size_t HUF_decompress4X2_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize,
+size_t HUF_decompress4X1_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize,
const void* cSrc, size_t cSrcSize,
void* workSpace, size_t wkspSize)
{
- return HUF_decompress4X2_DCtx_wksp_bmi2(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, 0);
+ return HUF_decompress4X1_DCtx_wksp_bmi2(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, 0);
}
-size_t HUF_decompress4X2_DCtx (HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
+size_t HUF_decompress4X1_DCtx (HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
{
U32 workSpace[HUF_DECOMPRESS_WORKSPACE_SIZE_U32];
- return HUF_decompress4X2_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize,
+ return HUF_decompress4X1_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize,
workSpace, sizeof(workSpace));
}
-size_t HUF_decompress4X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
+size_t HUF_decompress4X1 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
{
- HUF_CREATE_STATIC_DTABLEX2(DTable, HUF_TABLELOG_MAX);
- return HUF_decompress4X2_DCtx(DTable, dst, dstSize, cSrc, cSrcSize);
+ HUF_CREATE_STATIC_DTABLEX1(DTable, HUF_TABLELOG_MAX);
+ return HUF_decompress4X1_DCtx(DTable, dst, dstSize, cSrc, cSrcSize);
}
+#endif /* HUF_FORCE_DECOMPRESS_X2 */
+
+
+#ifndef HUF_FORCE_DECOMPRESS_X1
/* *************************/
/* double-symbols decoding */
/* *************************/
+
+typedef struct { U16 sequence; BYTE nbBits; BYTE length; } HUF_DEltX2; /* double-symbols decoding */
typedef struct { BYTE symbol; BYTE weight; } sortedSymbol_t;
+typedef U32 rankValCol_t[HUF_TABLELOG_MAX + 1];
+typedef rankValCol_t rankVal_t[HUF_TABLELOG_MAX];
-/* HUF_fillDTableX4Level2() :
+
+/* HUF_fillDTableX2Level2() :
* `rankValOrigin` must be a table of at least (HUF_TABLELOG_MAX + 1) U32 */
-static void HUF_fillDTableX4Level2(HUF_DEltX4* DTable, U32 sizeLog, const U32 consumed,
+static void HUF_fillDTableX2Level2(HUF_DEltX2* DTable, U32 sizeLog, const U32 consumed,
const U32* rankValOrigin, const int minWeight,
const sortedSymbol_t* sortedSymbols, const U32 sortedListSize,
U32 nbBitsBaseline, U16 baseSeq)
{
- HUF_DEltX4 DElt;
+ HUF_DEltX2 DElt;
U32 rankVal[HUF_TABLELOG_MAX + 1];
/* get pre-calculated rankVal */
@@ -672,10 +514,8 @@ static void HUF_fillDTableX4Level2(HUF_DEltX4* DTable, U32 sizeLog, const U32 co
} }
}
-typedef U32 rankValCol_t[HUF_TABLELOG_MAX + 1];
-typedef rankValCol_t rankVal_t[HUF_TABLELOG_MAX];
-static void HUF_fillDTableX4(HUF_DEltX4* DTable, const U32 targetLog,
+static void HUF_fillDTableX2(HUF_DEltX2* DTable, const U32 targetLog,
const sortedSymbol_t* sortedList, const U32 sortedListSize,
const U32* rankStart, rankVal_t rankValOrigin, const U32 maxWeight,
const U32 nbBitsBaseline)
@@ -700,12 +540,12 @@ static void HUF_fillDTableX4(HUF_DEltX4* DTable, const U32 targetLog,
int minWeight = nbBits + scaleLog;
if (minWeight < 1) minWeight = 1;
sortedRank = rankStart[minWeight];
- HUF_fillDTableX4Level2(DTable+start, targetLog-nbBits, nbBits,
+ HUF_fillDTableX2Level2(DTable+start, targetLog-nbBits, nbBits,
rankValOrigin[nbBits], minWeight,
sortedList+sortedRank, sortedListSize-sortedRank,
nbBitsBaseline, symbol);
} else {
- HUF_DEltX4 DElt;
+ HUF_DEltX2 DElt;
MEM_writeLE16(&(DElt.sequence), symbol);
DElt.nbBits = (BYTE)(nbBits);
DElt.length = 1;
@@ -717,16 +557,16 @@ static void HUF_fillDTableX4(HUF_DEltX4* DTable, const U32 targetLog,
}
}
-size_t HUF_readDTableX4_wksp(HUF_DTable* DTable, const void* src,
- size_t srcSize, void* workSpace,
- size_t wkspSize)
+size_t HUF_readDTableX2_wksp(HUF_DTable* DTable,
+ const void* src, size_t srcSize,
+ void* workSpace, size_t wkspSize)
{
U32 tableLog, maxW, sizeOfSort, nbSymbols;
DTableDesc dtd = HUF_getDTableDesc(DTable);
U32 const maxTableLog = dtd.maxTableLog;
size_t iSize;
void* dtPtr = DTable+1; /* force compiler to avoid strict-aliasing */
- HUF_DEltX4* const dt = (HUF_DEltX4*)dtPtr;
+ HUF_DEltX2* const dt = (HUF_DEltX2*)dtPtr;
U32 *rankStart;
rankValCol_t* rankVal;
@@ -752,7 +592,7 @@ size_t HUF_readDTableX4_wksp(HUF_DTable* DTable, const void* src,
rankStart = rankStart0 + 1;
memset(rankStats, 0, sizeof(U32) * (2 * HUF_TABLELOG_MAX + 2 + 1));
- HUF_STATIC_ASSERT(sizeof(HUF_DEltX4) == sizeof(HUF_DTable)); /* if compiler fails here, assertion is wrong */
+ DEBUG_STATIC_ASSERT(sizeof(HUF_DEltX2) == sizeof(HUF_DTable)); /* if compiler fails here, assertion is wrong */
if (maxTableLog > HUF_TABLELOG_MAX) return ERROR(tableLog_tooLarge);
/* memset(weightList, 0, sizeof(weightList)); */ /* is not necessary, even though some analyzer complain ... */
@@ -806,7 +646,7 @@ size_t HUF_readDTableX4_wksp(HUF_DTable* DTable, const void* src,
rankValPtr[w] = rankVal0[w] >> consumed;
} } } }
- HUF_fillDTableX4(dt, maxTableLog,
+ HUF_fillDTableX2(dt, maxTableLog,
sortedSymbol, sizeOfSort,
rankStart0, rankVal, maxW,
tableLog+1);
@@ -817,112 +657,308 @@ size_t HUF_readDTableX4_wksp(HUF_DTable* DTable, const void* src,
return iSize;
}
-size_t HUF_readDTableX4(HUF_DTable* DTable, const void* src, size_t srcSize)
+size_t HUF_readDTableX2(HUF_DTable* DTable, const void* src, size_t srcSize)
{
U32 workSpace[HUF_DECOMPRESS_WORKSPACE_SIZE_U32];
- return HUF_readDTableX4_wksp(DTable, src, srcSize,
+ return HUF_readDTableX2_wksp(DTable, src, srcSize,
workSpace, sizeof(workSpace));
}
-size_t HUF_decompress1X4_usingDTable(
+
+FORCE_INLINE_TEMPLATE U32
+HUF_decodeSymbolX2(void* op, BIT_DStream_t* DStream, const HUF_DEltX2* dt, const U32 dtLog)
+{
+ size_t const val = BIT_lookBitsFast(DStream, dtLog); /* note : dtLog >= 1 */
+ memcpy(op, dt+val, 2);
+ BIT_skipBits(DStream, dt[val].nbBits);
+ return dt[val].length;
+}
+
+FORCE_INLINE_TEMPLATE U32
+HUF_decodeLastSymbolX2(void* op, BIT_DStream_t* DStream, const HUF_DEltX2* dt, const U32 dtLog)
+{
+ size_t const val = BIT_lookBitsFast(DStream, dtLog); /* note : dtLog >= 1 */
+ memcpy(op, dt+val, 1);
+ if (dt[val].length==1) BIT_skipBits(DStream, dt[val].nbBits);
+ else {
+ if (DStream->bitsConsumed < (sizeof(DStream->bitContainer)*8)) {
+ BIT_skipBits(DStream, dt[val].nbBits);
+ if (DStream->bitsConsumed > (sizeof(DStream->bitContainer)*8))
+ /* ugly hack; works only because it's the last symbol. Note : can't easily extract nbBits from just this symbol */
+ DStream->bitsConsumed = (sizeof(DStream->bitContainer)*8);
+ } }
+ return 1;
+}
+
+#define HUF_DECODE_SYMBOLX2_0(ptr, DStreamPtr) \
+ ptr += HUF_decodeSymbolX2(ptr, DStreamPtr, dt, dtLog)
+
+#define HUF_DECODE_SYMBOLX2_1(ptr, DStreamPtr) \
+ if (MEM_64bits() || (HUF_TABLELOG_MAX<=12)) \
+ ptr += HUF_decodeSymbolX2(ptr, DStreamPtr, dt, dtLog)
+
+#define HUF_DECODE_SYMBOLX2_2(ptr, DStreamPtr) \
+ if (MEM_64bits()) \
+ ptr += HUF_decodeSymbolX2(ptr, DStreamPtr, dt, dtLog)
+
+HINT_INLINE size_t
+HUF_decodeStreamX2(BYTE* p, BIT_DStream_t* bitDPtr, BYTE* const pEnd,
+ const HUF_DEltX2* const dt, const U32 dtLog)
+{
+ BYTE* const pStart = p;
+
+ /* up to 8 symbols at a time */
+ while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p < pEnd-(sizeof(bitDPtr->bitContainer)-1))) {
+ HUF_DECODE_SYMBOLX2_2(p, bitDPtr);
+ HUF_DECODE_SYMBOLX2_1(p, bitDPtr);
+ HUF_DECODE_SYMBOLX2_2(p, bitDPtr);
+ HUF_DECODE_SYMBOLX2_0(p, bitDPtr);
+ }
+
+ /* closer to end : up to 2 symbols at a time */
+ while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) & (p <= pEnd-2))
+ HUF_DECODE_SYMBOLX2_0(p, bitDPtr);
+
+ while (p <= pEnd-2)
+ HUF_DECODE_SYMBOLX2_0(p, bitDPtr); /* no need to reload : reached the end of DStream */
+
+ if (p < pEnd)
+ p += HUF_decodeLastSymbolX2(p, bitDPtr, dt, dtLog);
+
+ return p-pStart;
+}
+
+FORCE_INLINE_TEMPLATE size_t
+HUF_decompress1X2_usingDTable_internal_body(
+ void* dst, size_t dstSize,
+ const void* cSrc, size_t cSrcSize,
+ const HUF_DTable* DTable)
+{
+ BIT_DStream_t bitD;
+
+ /* Init */
+ CHECK_F( BIT_initDStream(&bitD, cSrc, cSrcSize) );
+
+ /* decode */
+ { BYTE* const ostart = (BYTE*) dst;
+ BYTE* const oend = ostart + dstSize;
+ const void* const dtPtr = DTable+1; /* force compiler to not use strict-aliasing */
+ const HUF_DEltX2* const dt = (const HUF_DEltX2*)dtPtr;
+ DTableDesc const dtd = HUF_getDTableDesc(DTable);
+ HUF_decodeStreamX2(ostart, &bitD, oend, dt, dtd.tableLog);
+ }
+
+ /* check */
+ if (!BIT_endOfDStream(&bitD)) return ERROR(corruption_detected);
+
+ /* decoded size */
+ return dstSize;
+}
+
+
+FORCE_INLINE_TEMPLATE size_t
+HUF_decompress4X2_usingDTable_internal_body(
+ void* dst, size_t dstSize,
+ const void* cSrc, size_t cSrcSize,
+ const HUF_DTable* DTable)
+{
+ if (cSrcSize < 10) return ERROR(corruption_detected); /* strict minimum : jump table + 1 byte per stream */
+
+ { const BYTE* const istart = (const BYTE*) cSrc;
+ BYTE* const ostart = (BYTE*) dst;
+ BYTE* const oend = ostart + dstSize;
+ const void* const dtPtr = DTable+1;
+ const HUF_DEltX2* const dt = (const HUF_DEltX2*)dtPtr;
+
+ /* Init */
+ BIT_DStream_t bitD1;
+ BIT_DStream_t bitD2;
+ BIT_DStream_t bitD3;
+ BIT_DStream_t bitD4;
+ size_t const length1 = MEM_readLE16(istart);
+ size_t const length2 = MEM_readLE16(istart+2);
+ size_t const length3 = MEM_readLE16(istart+4);
+ size_t const length4 = cSrcSize - (length1 + length2 + length3 + 6);
+ const BYTE* const istart1 = istart + 6; /* jumpTable */
+ const BYTE* const istart2 = istart1 + length1;
+ const BYTE* const istart3 = istart2 + length2;
+ const BYTE* const istart4 = istart3 + length3;
+ size_t const segmentSize = (dstSize+3) / 4;
+ BYTE* const opStart2 = ostart + segmentSize;
+ BYTE* const opStart3 = opStart2 + segmentSize;
+ BYTE* const opStart4 = opStart3 + segmentSize;
+ BYTE* op1 = ostart;
+ BYTE* op2 = opStart2;
+ BYTE* op3 = opStart3;
+ BYTE* op4 = opStart4;
+ U32 endSignal;
+ DTableDesc const dtd = HUF_getDTableDesc(DTable);
+ U32 const dtLog = dtd.tableLog;
+
+ if (length4 > cSrcSize) return ERROR(corruption_detected); /* overflow */
+ CHECK_F( BIT_initDStream(&bitD1, istart1, length1) );
+ CHECK_F( BIT_initDStream(&bitD2, istart2, length2) );
+ CHECK_F( BIT_initDStream(&bitD3, istart3, length3) );
+ CHECK_F( BIT_initDStream(&bitD4, istart4, length4) );
+
+ /* 16-32 symbols per loop (4-8 symbols per stream) */
+ endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
+ for ( ; (endSignal==BIT_DStream_unfinished) & (op4<(oend-(sizeof(bitD4.bitContainer)-1))) ; ) {
+ HUF_DECODE_SYMBOLX2_2(op1, &bitD1);
+ HUF_DECODE_SYMBOLX2_2(op2, &bitD2);
+ HUF_DECODE_SYMBOLX2_2(op3, &bitD3);
+ HUF_DECODE_SYMBOLX2_2(op4, &bitD4);
+ HUF_DECODE_SYMBOLX2_1(op1, &bitD1);
+ HUF_DECODE_SYMBOLX2_1(op2, &bitD2);
+ HUF_DECODE_SYMBOLX2_1(op3, &bitD3);
+ HUF_DECODE_SYMBOLX2_1(op4, &bitD4);
+ HUF_DECODE_SYMBOLX2_2(op1, &bitD1);
+ HUF_DECODE_SYMBOLX2_2(op2, &bitD2);
+ HUF_DECODE_SYMBOLX2_2(op3, &bitD3);
+ HUF_DECODE_SYMBOLX2_2(op4, &bitD4);
+ HUF_DECODE_SYMBOLX2_0(op1, &bitD1);
+ HUF_DECODE_SYMBOLX2_0(op2, &bitD2);
+ HUF_DECODE_SYMBOLX2_0(op3, &bitD3);
+ HUF_DECODE_SYMBOLX2_0(op4, &bitD4);
+
+ endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
+ }
+
+ /* check corruption */
+ if (op1 > opStart2) return ERROR(corruption_detected);
+ if (op2 > opStart3) return ERROR(corruption_detected);
+ if (op3 > opStart4) return ERROR(corruption_detected);
+ /* note : op4 already verified within main loop */
+
+ /* finish bitStreams one by one */
+ HUF_decodeStreamX2(op1, &bitD1, opStart2, dt, dtLog);
+ HUF_decodeStreamX2(op2, &bitD2, opStart3, dt, dtLog);
+ HUF_decodeStreamX2(op3, &bitD3, opStart4, dt, dtLog);
+ HUF_decodeStreamX2(op4, &bitD4, oend, dt, dtLog);
+
+ /* check */
+ { U32 const endCheck = BIT_endOfDStream(&bitD1) & BIT_endOfDStream(&bitD2) & BIT_endOfDStream(&bitD3) & BIT_endOfDStream(&bitD4);
+ if (!endCheck) return ERROR(corruption_detected); }
+
+ /* decoded size */
+ return dstSize;
+ }
+}
+
+HUF_DGEN(HUF_decompress1X2_usingDTable_internal)
+HUF_DGEN(HUF_decompress4X2_usingDTable_internal)
+
+size_t HUF_decompress1X2_usingDTable(
void* dst, size_t dstSize,
const void* cSrc, size_t cSrcSize,
const HUF_DTable* DTable)
{
DTableDesc dtd = HUF_getDTableDesc(DTable);
if (dtd.tableType != 1) return ERROR(GENERIC);
- return HUF_decompress1X4_usingDTable_internal(dst, dstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0);
+ return HUF_decompress1X2_usingDTable_internal(dst, dstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0);
}
-size_t HUF_decompress1X4_DCtx_wksp(HUF_DTable* DCtx, void* dst, size_t dstSize,
+size_t HUF_decompress1X2_DCtx_wksp(HUF_DTable* DCtx, void* dst, size_t dstSize,
const void* cSrc, size_t cSrcSize,
void* workSpace, size_t wkspSize)
{
const BYTE* ip = (const BYTE*) cSrc;
- size_t const hSize = HUF_readDTableX4_wksp(DCtx, cSrc, cSrcSize,
+ size_t const hSize = HUF_readDTableX2_wksp(DCtx, cSrc, cSrcSize,
workSpace, wkspSize);
if (HUF_isError(hSize)) return hSize;
if (hSize >= cSrcSize) return ERROR(srcSize_wrong);
ip += hSize; cSrcSize -= hSize;
- return HUF_decompress1X4_usingDTable_internal(dst, dstSize, ip, cSrcSize, DCtx, /* bmi2 */ 0);
+ return HUF_decompress1X2_usingDTable_internal(dst, dstSize, ip, cSrcSize, DCtx, /* bmi2 */ 0);
}
-size_t HUF_decompress1X4_DCtx(HUF_DTable* DCtx, void* dst, size_t dstSize,
+size_t HUF_decompress1X2_DCtx(HUF_DTable* DCtx, void* dst, size_t dstSize,
const void* cSrc, size_t cSrcSize)
{
U32 workSpace[HUF_DECOMPRESS_WORKSPACE_SIZE_U32];
- return HUF_decompress1X4_DCtx_wksp(DCtx, dst, dstSize, cSrc, cSrcSize,
+ return HUF_decompress1X2_DCtx_wksp(DCtx, dst, dstSize, cSrc, cSrcSize,
workSpace, sizeof(workSpace));
}
-size_t HUF_decompress1X4 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
+size_t HUF_decompress1X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
{
- HUF_CREATE_STATIC_DTABLEX4(DTable, HUF_TABLELOG_MAX);
- return HUF_decompress1X4_DCtx(DTable, dst, dstSize, cSrc, cSrcSize);
+ HUF_CREATE_STATIC_DTABLEX2(DTable, HUF_TABLELOG_MAX);
+ return HUF_decompress1X2_DCtx(DTable, dst, dstSize, cSrc, cSrcSize);
}
-size_t HUF_decompress4X4_usingDTable(
+size_t HUF_decompress4X2_usingDTable(
void* dst, size_t dstSize,
const void* cSrc, size_t cSrcSize,
const HUF_DTable* DTable)
{
DTableDesc dtd = HUF_getDTableDesc(DTable);
if (dtd.tableType != 1) return ERROR(GENERIC);
- return HUF_decompress4X4_usingDTable_internal(dst, dstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0);
+ return HUF_decompress4X2_usingDTable_internal(dst, dstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0);
}
-static size_t HUF_decompress4X4_DCtx_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize,
+static size_t HUF_decompress4X2_DCtx_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize,
const void* cSrc, size_t cSrcSize,
void* workSpace, size_t wkspSize, int bmi2)
{
const BYTE* ip = (const BYTE*) cSrc;
- size_t hSize = HUF_readDTableX4_wksp(dctx, cSrc, cSrcSize,
+ size_t hSize = HUF_readDTableX2_wksp(dctx, cSrc, cSrcSize,
workSpace, wkspSize);
if (HUF_isError(hSize)) return hSize;
if (hSize >= cSrcSize) return ERROR(srcSize_wrong);
ip += hSize; cSrcSize -= hSize;
- return HUF_decompress4X4_usingDTable_internal(dst, dstSize, ip, cSrcSize, dctx, bmi2);
+ return HUF_decompress4X2_usingDTable_internal(dst, dstSize, ip, cSrcSize, dctx, bmi2);
}
-size_t HUF_decompress4X4_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize,
+size_t HUF_decompress4X2_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize,
const void* cSrc, size_t cSrcSize,
void* workSpace, size_t wkspSize)
{
- return HUF_decompress4X4_DCtx_wksp_bmi2(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, /* bmi2 */ 0);
+ return HUF_decompress4X2_DCtx_wksp_bmi2(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, /* bmi2 */ 0);
}
-size_t HUF_decompress4X4_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize,
+size_t HUF_decompress4X2_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize,
const void* cSrc, size_t cSrcSize)
{
U32 workSpace[HUF_DECOMPRESS_WORKSPACE_SIZE_U32];
- return HUF_decompress4X4_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize,
+ return HUF_decompress4X2_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize,
workSpace, sizeof(workSpace));
}
-size_t HUF_decompress4X4 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
+size_t HUF_decompress4X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
{
- HUF_CREATE_STATIC_DTABLEX4(DTable, HUF_TABLELOG_MAX);
- return HUF_decompress4X4_DCtx(DTable, dst, dstSize, cSrc, cSrcSize);
+ HUF_CREATE_STATIC_DTABLEX2(DTable, HUF_TABLELOG_MAX);
+ return HUF_decompress4X2_DCtx(DTable, dst, dstSize, cSrc, cSrcSize);
}
+#endif /* HUF_FORCE_DECOMPRESS_X1 */
-/* ********************************/
-/* Generic decompression selector */
-/* ********************************/
+
+/* ***********************************/
+/* Universal decompression selectors */
+/* ***********************************/
size_t HUF_decompress1X_usingDTable(void* dst, size_t maxDstSize,
const void* cSrc, size_t cSrcSize,
const HUF_DTable* DTable)
{
DTableDesc const dtd = HUF_getDTableDesc(DTable);
- return dtd.tableType ? HUF_decompress1X4_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0) :
- HUF_decompress1X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0);
+#if defined(HUF_FORCE_DECOMPRESS_X1)
+ (void)dtd;
+ assert(dtd.tableType == 0);
+ return HUF_decompress1X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0);
+#elif defined(HUF_FORCE_DECOMPRESS_X2)
+ (void)dtd;
+ assert(dtd.tableType == 1);
+ return HUF_decompress1X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0);
+#else
+ return dtd.tableType ? HUF_decompress1X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0) :
+ HUF_decompress1X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0);
+#endif
}
size_t HUF_decompress4X_usingDTable(void* dst, size_t maxDstSize,
@@ -930,11 +966,22 @@ size_t HUF_decompress4X_usingDTable(void* dst, size_t maxDstSize,
const HUF_DTable* DTable)
{
DTableDesc const dtd = HUF_getDTableDesc(DTable);
- return dtd.tableType ? HUF_decompress4X4_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0) :
- HUF_decompress4X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0);
+#if defined(HUF_FORCE_DECOMPRESS_X1)
+ (void)dtd;
+ assert(dtd.tableType == 0);
+ return HUF_decompress4X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0);
+#elif defined(HUF_FORCE_DECOMPRESS_X2)
+ (void)dtd;
+ assert(dtd.tableType == 1);
+ return HUF_decompress4X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0);
+#else
+ return dtd.tableType ? HUF_decompress4X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0) :
+ HUF_decompress4X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, /* bmi2 */ 0);
+#endif
}
+#if !defined(HUF_FORCE_DECOMPRESS_X1) && !defined(HUF_FORCE_DECOMPRESS_X2)
typedef struct { U32 tableTime; U32 decode256Time; } algo_time_t;
static const algo_time_t algoTime[16 /* Quantization */][3 /* single, double, quad */] =
{
@@ -956,16 +1003,26 @@ static const algo_time_t algoTime[16 /* Quantization */][3 /* single, double, qu
{{1455,128}, {2422,124}, {4174,124}}, /* Q ==14 : 87-93% */
{{ 722,128}, {1891,145}, {1936,146}}, /* Q ==15 : 93-99% */
};
+#endif
/** HUF_selectDecoder() :
* Tells which decoder is likely to decode faster,
* based on a set of pre-computed metrics.
- * @return : 0==HUF_decompress4X2, 1==HUF_decompress4X4 .
+ * @return : 0==HUF_decompress4X1, 1==HUF_decompress4X2 .
* Assumption : 0 < dstSize <= 128 KB */
U32 HUF_selectDecoder (size_t dstSize, size_t cSrcSize)
{
assert(dstSize > 0);
- assert(dstSize <= 128 KB);
+ assert(dstSize <= 128*1024);
+#if defined(HUF_FORCE_DECOMPRESS_X1)
+ (void)dstSize;
+ (void)cSrcSize;
+ return 0;
+#elif defined(HUF_FORCE_DECOMPRESS_X2)
+ (void)dstSize;
+ (void)cSrcSize;
+ return 1;
+#else
/* decoder timing evaluation */
{ U32 const Q = (cSrcSize >= dstSize) ? 15 : (U32)(cSrcSize * 16 / dstSize); /* Q < 16 */
U32 const D256 = (U32)(dstSize >> 8);
@@ -973,14 +1030,18 @@ U32 HUF_selectDecoder (size_t dstSize, size_t cSrcSize)
U32 DTime1 = algoTime[Q][1].tableTime + (algoTime[Q][1].decode256Time * D256);
DTime1 += DTime1 >> 3; /* advantage to algorithm using less memory, to reduce cache eviction */
return DTime1 < DTime0;
-} }
+ }
+#endif
+}
typedef size_t (*decompressionAlgo)(void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);
size_t HUF_decompress (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
{
- static const decompressionAlgo decompress[2] = { HUF_decompress4X2, HUF_decompress4X4 };
+#if !defined(HUF_FORCE_DECOMPRESS_X1) && !defined(HUF_FORCE_DECOMPRESS_X2)
+ static const decompressionAlgo decompress[2] = { HUF_decompress4X1, HUF_decompress4X2 };
+#endif
/* validation checks */
if (dstSize == 0) return ERROR(dstSize_tooSmall);
@@ -989,7 +1050,17 @@ size_t HUF_decompress (void* dst, size_t dstSize, const void* cSrc, size_t cSrcS
if (cSrcSize == 1) { memset(dst, *(const BYTE*)cSrc, dstSize); return dstSize; } /* RLE */
{ U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize);
+#if defined(HUF_FORCE_DECOMPRESS_X1)
+ (void)algoNb;
+ assert(algoNb == 0);
+ return HUF_decompress4X1(dst, dstSize, cSrc, cSrcSize);
+#elif defined(HUF_FORCE_DECOMPRESS_X2)
+ (void)algoNb;
+ assert(algoNb == 1);
+ return HUF_decompress4X2(dst, dstSize, cSrc, cSrcSize);
+#else
return decompress[algoNb](dst, dstSize, cSrc, cSrcSize);
+#endif
}
}
@@ -1002,8 +1073,18 @@ size_t HUF_decompress4X_DCtx (HUF_DTable* dctx, void* dst, size_t dstSize, const
if (cSrcSize == 1) { memset(dst, *(const BYTE*)cSrc, dstSize); return dstSize; } /* RLE */
{ U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize);
- return algoNb ? HUF_decompress4X4_DCtx(dctx, dst, dstSize, cSrc, cSrcSize) :
- HUF_decompress4X2_DCtx(dctx, dst, dstSize, cSrc, cSrcSize) ;
+#if defined(HUF_FORCE_DECOMPRESS_X1)
+ (void)algoNb;
+ assert(algoNb == 0);
+ return HUF_decompress4X1_DCtx(dctx, dst, dstSize, cSrc, cSrcSize);
+#elif defined(HUF_FORCE_DECOMPRESS_X2)
+ (void)algoNb;
+ assert(algoNb == 1);
+ return HUF_decompress4X2_DCtx(dctx, dst, dstSize, cSrc, cSrcSize);
+#else
+ return algoNb ? HUF_decompress4X2_DCtx(dctx, dst, dstSize, cSrc, cSrcSize) :
+ HUF_decompress4X1_DCtx(dctx, dst, dstSize, cSrc, cSrcSize) ;
+#endif
}
}
@@ -1025,8 +1106,19 @@ size_t HUF_decompress4X_hufOnly_wksp(HUF_DTable* dctx, void* dst,
if (cSrcSize == 0) return ERROR(corruption_detected);
{ U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize);
- return algoNb ? HUF_decompress4X4_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize):
- HUF_decompress4X2_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize);
+#if defined(HUF_FORCE_DECOMPRESS_X1)
+ (void)algoNb;
+ assert(algoNb == 0);
+ return HUF_decompress4X1_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize);
+#elif defined(HUF_FORCE_DECOMPRESS_X2)
+ (void)algoNb;
+ assert(algoNb == 1);
+ return HUF_decompress4X2_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize);
+#else
+ return algoNb ? HUF_decompress4X2_DCtx_wksp(dctx, dst, dstSize, cSrc,
+ cSrcSize, workSpace, wkspSize):
+ HUF_decompress4X1_DCtx_wksp(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize);
+#endif
}
}
@@ -1041,10 +1133,22 @@ size_t HUF_decompress1X_DCtx_wksp(HUF_DTable* dctx, void* dst, size_t dstSize,
if (cSrcSize == 1) { memset(dst, *(const BYTE*)cSrc, dstSize); return dstSize; } /* RLE */
{ U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize);
- return algoNb ? HUF_decompress1X4_DCtx_wksp(dctx, dst, dstSize, cSrc,
+#if defined(HUF_FORCE_DECOMPRESS_X1)
+ (void)algoNb;
+ assert(algoNb == 0);
+ return HUF_decompress1X1_DCtx_wksp(dctx, dst, dstSize, cSrc,
+ cSrcSize, workSpace, wkspSize);
+#elif defined(HUF_FORCE_DECOMPRESS_X2)
+ (void)algoNb;
+ assert(algoNb == 1);
+ return HUF_decompress1X2_DCtx_wksp(dctx, dst, dstSize, cSrc,
+ cSrcSize, workSpace, wkspSize);
+#else
+ return algoNb ? HUF_decompress1X2_DCtx_wksp(dctx, dst, dstSize, cSrc,
cSrcSize, workSpace, wkspSize):
- HUF_decompress1X2_DCtx_wksp(dctx, dst, dstSize, cSrc,
+ HUF_decompress1X1_DCtx_wksp(dctx, dst, dstSize, cSrc,
cSrcSize, workSpace, wkspSize);
+#endif
}
}
@@ -1060,27 +1164,49 @@ size_t HUF_decompress1X_DCtx(HUF_DTable* dctx, void* dst, size_t dstSize,
size_t HUF_decompress1X_usingDTable_bmi2(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int bmi2)
{
DTableDesc const dtd = HUF_getDTableDesc(DTable);
- return dtd.tableType ? HUF_decompress1X4_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2) :
- HUF_decompress1X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2);
+#if defined(HUF_FORCE_DECOMPRESS_X1)
+ (void)dtd;
+ assert(dtd.tableType == 0);
+ return HUF_decompress1X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2);
+#elif defined(HUF_FORCE_DECOMPRESS_X2)
+ (void)dtd;
+ assert(dtd.tableType == 1);
+ return HUF_decompress1X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2);
+#else
+ return dtd.tableType ? HUF_decompress1X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2) :
+ HUF_decompress1X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2);
+#endif
}
-size_t HUF_decompress1X2_DCtx_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int bmi2)
+#ifndef HUF_FORCE_DECOMPRESS_X2
+size_t HUF_decompress1X1_DCtx_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int bmi2)
{
const BYTE* ip = (const BYTE*) cSrc;
- size_t const hSize = HUF_readDTableX2_wksp(dctx, cSrc, cSrcSize, workSpace, wkspSize);
+ size_t const hSize = HUF_readDTableX1_wksp(dctx, cSrc, cSrcSize, workSpace, wkspSize);
if (HUF_isError(hSize)) return hSize;
if (hSize >= cSrcSize) return ERROR(srcSize_wrong);
ip += hSize; cSrcSize -= hSize;
- return HUF_decompress1X2_usingDTable_internal(dst, dstSize, ip, cSrcSize, dctx, bmi2);
+ return HUF_decompress1X1_usingDTable_internal(dst, dstSize, ip, cSrcSize, dctx, bmi2);
}
+#endif
size_t HUF_decompress4X_usingDTable_bmi2(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const HUF_DTable* DTable, int bmi2)
{
DTableDesc const dtd = HUF_getDTableDesc(DTable);
- return dtd.tableType ? HUF_decompress4X4_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2) :
- HUF_decompress4X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2);
+#if defined(HUF_FORCE_DECOMPRESS_X1)
+ (void)dtd;
+ assert(dtd.tableType == 0);
+ return HUF_decompress4X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2);
+#elif defined(HUF_FORCE_DECOMPRESS_X2)
+ (void)dtd;
+ assert(dtd.tableType == 1);
+ return HUF_decompress4X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2);
+#else
+ return dtd.tableType ? HUF_decompress4X2_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2) :
+ HUF_decompress4X1_usingDTable_internal(dst, maxDstSize, cSrc, cSrcSize, DTable, bmi2);
+#endif
}
size_t HUF_decompress4X_hufOnly_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize, void* workSpace, size_t wkspSize, int bmi2)
@@ -1090,7 +1216,17 @@ size_t HUF_decompress4X_hufOnly_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t ds
if (cSrcSize == 0) return ERROR(corruption_detected);
{ U32 const algoNb = HUF_selectDecoder(dstSize, cSrcSize);
- return algoNb ? HUF_decompress4X4_DCtx_wksp_bmi2(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, bmi2) :
- HUF_decompress4X2_DCtx_wksp_bmi2(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, bmi2);
+#if defined(HUF_FORCE_DECOMPRESS_X1)
+ (void)algoNb;
+ assert(algoNb == 0);
+ return HUF_decompress4X1_DCtx_wksp_bmi2(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, bmi2);
+#elif defined(HUF_FORCE_DECOMPRESS_X2)
+ (void)algoNb;
+ assert(algoNb == 1);
+ return HUF_decompress4X2_DCtx_wksp_bmi2(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, bmi2);
+#else
+ return algoNb ? HUF_decompress4X2_DCtx_wksp_bmi2(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, bmi2) :
+ HUF_decompress4X1_DCtx_wksp_bmi2(dctx, dst, dstSize, cSrc, cSrcSize, workSpace, wkspSize, bmi2);
+#endif
}
}
diff --git a/thirdparty/zstd/decompress/zstd_ddict.c b/thirdparty/zstd/decompress/zstd_ddict.c
new file mode 100644
index 0000000000..2ad0440684
--- /dev/null
+++ b/thirdparty/zstd/decompress/zstd_ddict.c
@@ -0,0 +1,240 @@
+/*
+ * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under both the BSD-style license (found in the
+ * LICENSE file in the root directory of this source tree) and the GPLv2 (found
+ * in the COPYING file in the root directory of this source tree).
+ * You may select, at your option, one of the above-listed licenses.
+ */
+
+/* zstd_ddict.c :
+ * concentrates all logic that needs to know the internals of ZSTD_DDict object */
+
+/*-*******************************************************
+* Dependencies
+*********************************************************/
+#include <string.h> /* memcpy, memmove, memset */
+#include "cpu.h" /* bmi2 */
+#include "mem.h" /* low level memory routines */
+#define FSE_STATIC_LINKING_ONLY
+#include "fse.h"
+#define HUF_STATIC_LINKING_ONLY
+#include "huf.h"
+#include "zstd_decompress_internal.h"
+#include "zstd_ddict.h"
+
+#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1)
+# include "zstd_legacy.h"
+#endif
+
+
+
+/*-*******************************************************
+* Types
+*********************************************************/
+struct ZSTD_DDict_s {
+ void* dictBuffer;
+ const void* dictContent;
+ size_t dictSize;
+ ZSTD_entropyDTables_t entropy;
+ U32 dictID;
+ U32 entropyPresent;
+ ZSTD_customMem cMem;
+}; /* typedef'd to ZSTD_DDict within "zstd.h" */
+
+const void* ZSTD_DDict_dictContent(const ZSTD_DDict* ddict)
+{
+ assert(ddict != NULL);
+ return ddict->dictContent;
+}
+
+size_t ZSTD_DDict_dictSize(const ZSTD_DDict* ddict)
+{
+ assert(ddict != NULL);
+ return ddict->dictSize;
+}
+
+void ZSTD_copyDDictParameters(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict)
+{
+ DEBUGLOG(4, "ZSTD_copyDDictParameters");
+ assert(dctx != NULL);
+ assert(ddict != NULL);
+ dctx->dictID = ddict->dictID;
+ dctx->prefixStart = ddict->dictContent;
+ dctx->virtualStart = ddict->dictContent;
+ dctx->dictEnd = (const BYTE*)ddict->dictContent + ddict->dictSize;
+ dctx->previousDstEnd = dctx->dictEnd;
+ if (ddict->entropyPresent) {
+ dctx->litEntropy = 1;
+ dctx->fseEntropy = 1;
+ dctx->LLTptr = ddict->entropy.LLTable;
+ dctx->MLTptr = ddict->entropy.MLTable;
+ dctx->OFTptr = ddict->entropy.OFTable;
+ dctx->HUFptr = ddict->entropy.hufTable;
+ dctx->entropy.rep[0] = ddict->entropy.rep[0];
+ dctx->entropy.rep[1] = ddict->entropy.rep[1];
+ dctx->entropy.rep[2] = ddict->entropy.rep[2];
+ } else {
+ dctx->litEntropy = 0;
+ dctx->fseEntropy = 0;
+ }
+}
+
+
+static size_t
+ZSTD_loadEntropy_intoDDict(ZSTD_DDict* ddict,
+ ZSTD_dictContentType_e dictContentType)
+{
+ ddict->dictID = 0;
+ ddict->entropyPresent = 0;
+ if (dictContentType == ZSTD_dct_rawContent) return 0;
+
+ if (ddict->dictSize < 8) {
+ if (dictContentType == ZSTD_dct_fullDict)
+ return ERROR(dictionary_corrupted); /* only accept specified dictionaries */
+ return 0; /* pure content mode */
+ }
+ { U32 const magic = MEM_readLE32(ddict->dictContent);
+ if (magic != ZSTD_MAGIC_DICTIONARY) {
+ if (dictContentType == ZSTD_dct_fullDict)
+ return ERROR(dictionary_corrupted); /* only accept specified dictionaries */
+ return 0; /* pure content mode */
+ }
+ }
+ ddict->dictID = MEM_readLE32((const char*)ddict->dictContent + ZSTD_FRAMEIDSIZE);
+
+ /* load entropy tables */
+ CHECK_E( ZSTD_loadDEntropy(&ddict->entropy,
+ ddict->dictContent, ddict->dictSize),
+ dictionary_corrupted );
+ ddict->entropyPresent = 1;
+ return 0;
+}
+
+
+static size_t ZSTD_initDDict_internal(ZSTD_DDict* ddict,
+ const void* dict, size_t dictSize,
+ ZSTD_dictLoadMethod_e dictLoadMethod,
+ ZSTD_dictContentType_e dictContentType)
+{
+ if ((dictLoadMethod == ZSTD_dlm_byRef) || (!dict) || (!dictSize)) {
+ ddict->dictBuffer = NULL;
+ ddict->dictContent = dict;
+ if (!dict) dictSize = 0;
+ } else {
+ void* const internalBuffer = ZSTD_malloc(dictSize, ddict->cMem);
+ ddict->dictBuffer = internalBuffer;
+ ddict->dictContent = internalBuffer;
+ if (!internalBuffer) return ERROR(memory_allocation);
+ memcpy(internalBuffer, dict, dictSize);
+ }
+ ddict->dictSize = dictSize;
+ ddict->entropy.hufTable[0] = (HUF_DTable)((HufLog)*0x1000001); /* cover both little and big endian */
+
+ /* parse dictionary content */
+ CHECK_F( ZSTD_loadEntropy_intoDDict(ddict, dictContentType) );
+
+ return 0;
+}
+
+ZSTD_DDict* ZSTD_createDDict_advanced(const void* dict, size_t dictSize,
+ ZSTD_dictLoadMethod_e dictLoadMethod,
+ ZSTD_dictContentType_e dictContentType,
+ ZSTD_customMem customMem)
+{
+ if (!customMem.customAlloc ^ !customMem.customFree) return NULL;
+
+ { ZSTD_DDict* const ddict = (ZSTD_DDict*) ZSTD_malloc(sizeof(ZSTD_DDict), customMem);
+ if (ddict == NULL) return NULL;
+ ddict->cMem = customMem;
+ { size_t const initResult = ZSTD_initDDict_internal(ddict,
+ dict, dictSize,
+ dictLoadMethod, dictContentType);
+ if (ZSTD_isError(initResult)) {
+ ZSTD_freeDDict(ddict);
+ return NULL;
+ } }
+ return ddict;
+ }
+}
+
+/*! ZSTD_createDDict() :
+* Create a digested dictionary, to start decompression without startup delay.
+* `dict` content is copied inside DDict.
+* Consequently, `dict` can be released after `ZSTD_DDict` creation */
+ZSTD_DDict* ZSTD_createDDict(const void* dict, size_t dictSize)
+{
+ ZSTD_customMem const allocator = { NULL, NULL, NULL };
+ return ZSTD_createDDict_advanced(dict, dictSize, ZSTD_dlm_byCopy, ZSTD_dct_auto, allocator);
+}
+
+/*! ZSTD_createDDict_byReference() :
+ * Create a digested dictionary, to start decompression without startup delay.
+ * Dictionary content is simply referenced, it will be accessed during decompression.
+ * Warning : dictBuffer must outlive DDict (DDict must be freed before dictBuffer) */
+ZSTD_DDict* ZSTD_createDDict_byReference(const void* dictBuffer, size_t dictSize)
+{
+ ZSTD_customMem const allocator = { NULL, NULL, NULL };
+ return ZSTD_createDDict_advanced(dictBuffer, dictSize, ZSTD_dlm_byRef, ZSTD_dct_auto, allocator);
+}
+
+
+const ZSTD_DDict* ZSTD_initStaticDDict(
+ void* sBuffer, size_t sBufferSize,
+ const void* dict, size_t dictSize,
+ ZSTD_dictLoadMethod_e dictLoadMethod,
+ ZSTD_dictContentType_e dictContentType)
+{
+ size_t const neededSpace = sizeof(ZSTD_DDict)
+ + (dictLoadMethod == ZSTD_dlm_byRef ? 0 : dictSize);
+ ZSTD_DDict* const ddict = (ZSTD_DDict*)sBuffer;
+ assert(sBuffer != NULL);
+ assert(dict != NULL);
+ if ((size_t)sBuffer & 7) return NULL; /* 8-aligned */
+ if (sBufferSize < neededSpace) return NULL;
+ if (dictLoadMethod == ZSTD_dlm_byCopy) {
+ memcpy(ddict+1, dict, dictSize); /* local copy */
+ dict = ddict+1;
+ }
+ if (ZSTD_isError( ZSTD_initDDict_internal(ddict,
+ dict, dictSize,
+ ZSTD_dlm_byRef, dictContentType) ))
+ return NULL;
+ return ddict;
+}
+
+
+size_t ZSTD_freeDDict(ZSTD_DDict* ddict)
+{
+ if (ddict==NULL) return 0; /* support free on NULL */
+ { ZSTD_customMem const cMem = ddict->cMem;
+ ZSTD_free(ddict->dictBuffer, cMem);
+ ZSTD_free(ddict, cMem);
+ return 0;
+ }
+}
+
+/*! ZSTD_estimateDDictSize() :
+ * Estimate amount of memory that will be needed to create a dictionary for decompression.
+ * Note : dictionary created by reference using ZSTD_dlm_byRef are smaller */
+size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod)
+{
+ return sizeof(ZSTD_DDict) + (dictLoadMethod == ZSTD_dlm_byRef ? 0 : dictSize);
+}
+
+size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict)
+{
+ if (ddict==NULL) return 0; /* support sizeof on NULL */
+ return sizeof(*ddict) + (ddict->dictBuffer ? ddict->dictSize : 0) ;
+}
+
+/*! ZSTD_getDictID_fromDDict() :
+ * Provides the dictID of the dictionary loaded into `ddict`.
+ * If @return == 0, the dictionary is not conformant to Zstandard specification, or empty.
+ * Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */
+unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict)
+{
+ if (ddict==NULL) return 0;
+ return ZSTD_getDictID_fromDict(ddict->dictContent, ddict->dictSize);
+}
diff --git a/thirdparty/zstd/decompress/zstd_ddict.h b/thirdparty/zstd/decompress/zstd_ddict.h
new file mode 100644
index 0000000000..0479d11bb0
--- /dev/null
+++ b/thirdparty/zstd/decompress/zstd_ddict.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under both the BSD-style license (found in the
+ * LICENSE file in the root directory of this source tree) and the GPLv2 (found
+ * in the COPYING file in the root directory of this source tree).
+ * You may select, at your option, one of the above-listed licenses.
+ */
+
+
+#ifndef ZSTD_DDICT_H
+#define ZSTD_DDICT_H
+
+/*-*******************************************************
+ * Dependencies
+ *********************************************************/
+#include <stddef.h> /* size_t */
+#include "zstd.h" /* ZSTD_DDict, and several public functions */
+
+
+/*-*******************************************************
+ * Interface
+ *********************************************************/
+
+/* note: several prototypes are already published in `zstd.h` :
+ * ZSTD_createDDict()
+ * ZSTD_createDDict_byReference()
+ * ZSTD_createDDict_advanced()
+ * ZSTD_freeDDict()
+ * ZSTD_initStaticDDict()
+ * ZSTD_sizeof_DDict()
+ * ZSTD_estimateDDictSize()
+ * ZSTD_getDictID_fromDict()
+ */
+
+const void* ZSTD_DDict_dictContent(const ZSTD_DDict* ddict);
+size_t ZSTD_DDict_dictSize(const ZSTD_DDict* ddict);
+
+void ZSTD_copyDDictParameters(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict);
+
+
+
+#endif /* ZSTD_DDICT_H */
diff --git a/thirdparty/zstd/decompress/zstd_decompress.c b/thirdparty/zstd/decompress/zstd_decompress.c
index 3ec6a1cb32..feef1ef67a 100644
--- a/thirdparty/zstd/decompress/zstd_decompress.c
+++ b/thirdparty/zstd/decompress/zstd_decompress.c
@@ -37,7 +37,18 @@
* It's possible to set a different limit using ZSTD_DCtx_setMaxWindowSize().
*/
#ifndef ZSTD_MAXWINDOWSIZE_DEFAULT
-# define ZSTD_MAXWINDOWSIZE_DEFAULT (((U32)1 << ZSTD_WINDOWLOG_DEFAULTMAX) + 1)
+# define ZSTD_MAXWINDOWSIZE_DEFAULT (((U32)1 << ZSTD_WINDOWLOG_LIMIT_DEFAULT) + 1)
+#endif
+
+/*!
+ * NO_FORWARD_PROGRESS_MAX :
+ * maximum allowed nb of calls to ZSTD_decompressStream()
+ * without any forward progress
+ * (defined as: no byte read from input, and no byte flushed to output)
+ * before triggering an error.
+ */
+#ifndef ZSTD_NO_FORWARD_PROGRESS_MAX
+# define ZSTD_NO_FORWARD_PROGRESS_MAX 16
#endif
@@ -45,120 +56,25 @@
* Dependencies
*********************************************************/
#include <string.h> /* memcpy, memmove, memset */
-#include "cpu.h"
+#include "cpu.h" /* bmi2 */
#include "mem.h" /* low level memory routines */
#define FSE_STATIC_LINKING_ONLY
#include "fse.h"
#define HUF_STATIC_LINKING_ONLY
#include "huf.h"
-#include "zstd_internal.h"
+#include "zstd_internal.h" /* blockProperties_t */
+#include "zstd_decompress_internal.h" /* ZSTD_DCtx */
+#include "zstd_ddict.h" /* ZSTD_DDictDictContent */
+#include "zstd_decompress_block.h" /* ZSTD_decompressBlock_internal */
#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1)
# include "zstd_legacy.h"
#endif
-/*-*************************************
-* Errors
-***************************************/
-#define ZSTD_isError ERR_isError /* for inlining */
-#define FSE_isError ERR_isError
-#define HUF_isError ERR_isError
-
-
-/*_*******************************************************
-* Memory operations
-**********************************************************/
-static void ZSTD_copy4(void* dst, const void* src) { memcpy(dst, src, 4); }
-
-
/*-*************************************************************
* Context management
***************************************************************/
-typedef enum { ZSTDds_getFrameHeaderSize, ZSTDds_decodeFrameHeader,
- ZSTDds_decodeBlockHeader, ZSTDds_decompressBlock,
- ZSTDds_decompressLastBlock, ZSTDds_checkChecksum,
- ZSTDds_decodeSkippableHeader, ZSTDds_skipFrame } ZSTD_dStage;
-
-typedef enum { zdss_init=0, zdss_loadHeader,
- zdss_read, zdss_load, zdss_flush } ZSTD_dStreamStage;
-
-
-typedef struct {
- U32 fastMode;
- U32 tableLog;
-} ZSTD_seqSymbol_header;
-
-typedef struct {
- U16 nextState;
- BYTE nbAdditionalBits;
- BYTE nbBits;
- U32 baseValue;
-} ZSTD_seqSymbol;
-
-#define SEQSYMBOL_TABLE_SIZE(log) (1 + (1 << (log)))
-
-typedef struct {
- ZSTD_seqSymbol LLTable[SEQSYMBOL_TABLE_SIZE(LLFSELog)];
- ZSTD_seqSymbol OFTable[SEQSYMBOL_TABLE_SIZE(OffFSELog)];
- ZSTD_seqSymbol MLTable[SEQSYMBOL_TABLE_SIZE(MLFSELog)];
- HUF_DTable hufTable[HUF_DTABLE_SIZE(HufLog)]; /* can accommodate HUF_decompress4X */
- U32 workspace[HUF_DECOMPRESS_WORKSPACE_SIZE_U32];
- U32 rep[ZSTD_REP_NUM];
-} ZSTD_entropyDTables_t;
-
-struct ZSTD_DCtx_s
-{
- const ZSTD_seqSymbol* LLTptr;
- const ZSTD_seqSymbol* MLTptr;
- const ZSTD_seqSymbol* OFTptr;
- const HUF_DTable* HUFptr;
- ZSTD_entropyDTables_t entropy;
- const void* previousDstEnd; /* detect continuity */
- const void* base; /* start of current segment */
- const void* vBase; /* virtual start of previous segment if it was just before current one */
- const void* dictEnd; /* end of previous segment */
- size_t expected;
- ZSTD_frameHeader fParams;
- U64 decodedSize;
- blockType_e bType; /* used in ZSTD_decompressContinue(), store blockType between block header decoding and block decompression stages */
- ZSTD_dStage stage;
- U32 litEntropy;
- U32 fseEntropy;
- XXH64_state_t xxhState;
- size_t headerSize;
- U32 dictID;
- ZSTD_format_e format;
- const BYTE* litPtr;
- ZSTD_customMem customMem;
- size_t litSize;
- size_t rleSize;
- size_t staticSize;
- int bmi2; /* == 1 if the CPU supports BMI2 and 0 otherwise. CPU support is determined dynamically once per context lifetime. */
-
- /* streaming */
- ZSTD_DDict* ddictLocal;
- const ZSTD_DDict* ddict;
- ZSTD_dStreamStage streamStage;
- char* inBuff;
- size_t inBuffSize;
- size_t inPos;
- size_t maxWindowSize;
- char* outBuff;
- size_t outBuffSize;
- size_t outStart;
- size_t outEnd;
- size_t lhSize;
- void* legacyContext;
- U32 previousLegacyVersion;
- U32 legacyVersion;
- U32 hostageByte;
-
- /* workspace */
- BYTE litBuffer[ZSTD_BLOCKSIZE_MAX + WILDCOPY_OVERLENGTH];
- BYTE headerBuffer[ZSTD_FRAMEHEADERSIZE_MAX];
-}; /* typedef'd to ZSTD_DCtx within "zstd.h" */
-
size_t ZSTD_sizeof_DCtx (const ZSTD_DCtx* dctx)
{
if (dctx==NULL) return 0; /* support sizeof NULL */
@@ -173,8 +89,8 @@ size_t ZSTD_estimateDCtxSize(void) { return sizeof(ZSTD_DCtx); }
static size_t ZSTD_startingInputLength(ZSTD_format_e format)
{
size_t const startingInputLength = (format==ZSTD_f_zstd1_magicless) ?
- ZSTD_frameHeaderSize_prefix - ZSTD_frameIdSize :
- ZSTD_frameHeaderSize_prefix;
+ ZSTD_FRAMEHEADERSIZE_PREFIX - ZSTD_FRAMEIDSIZE :
+ ZSTD_FRAMEHEADERSIZE_PREFIX;
ZSTD_STATIC_ASSERT(ZSTD_FRAMEHEADERSIZE_PREFIX >= ZSTD_FRAMEIDSIZE);
/* only supports formats ZSTD_f_zstd1 and ZSTD_f_zstd1_magicless */
assert( (format == ZSTD_f_zstd1) || (format == ZSTD_f_zstd1_magicless) );
@@ -188,10 +104,15 @@ static void ZSTD_initDCtx_internal(ZSTD_DCtx* dctx)
dctx->maxWindowSize = ZSTD_MAXWINDOWSIZE_DEFAULT;
dctx->ddict = NULL;
dctx->ddictLocal = NULL;
+ dctx->dictEnd = NULL;
+ dctx->ddictIsCold = 0;
dctx->inBuff = NULL;
dctx->inBuffSize = 0;
dctx->outBuffSize = 0;
dctx->streamStage = zdss_init;
+ dctx->legacyContext = NULL;
+ dctx->previousLegacyVersion = 0;
+ dctx->noForwardProgress = 0;
dctx->bmi2 = ZSTD_cpuid_bmi2(ZSTD_cpuid());
}
@@ -215,8 +136,6 @@ ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem)
{ ZSTD_DCtx* const dctx = (ZSTD_DCtx*)ZSTD_malloc(sizeof(*dctx), customMem);
if (!dctx) return NULL;
dctx->customMem = customMem;
- dctx->legacyContext = NULL;
- dctx->previousLegacyVersion = 0;
ZSTD_initDCtx_internal(dctx);
return dctx;
}
@@ -265,10 +184,10 @@ void ZSTD_copyDCtx(ZSTD_DCtx* dstDCtx, const ZSTD_DCtx* srcDCtx)
* Note 3 : Skippable Frame Identifiers are considered valid. */
unsigned ZSTD_isFrame(const void* buffer, size_t size)
{
- if (size < ZSTD_frameIdSize) return 0;
+ if (size < ZSTD_FRAMEIDSIZE) return 0;
{ U32 const magic = MEM_readLE32(buffer);
if (magic == ZSTD_MAGICNUMBER) return 1;
- if ((magic & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) return 1;
+ if ((magic & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) return 1;
}
#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1)
if (ZSTD_isLegacy(buffer, size)) return 1;
@@ -298,34 +217,37 @@ static size_t ZSTD_frameHeaderSize_internal(const void* src, size_t srcSize, ZST
/** ZSTD_frameHeaderSize() :
* srcSize must be >= ZSTD_frameHeaderSize_prefix.
- * @return : size of the Frame Header */
+ * @return : size of the Frame Header,
+ * or an error code (if srcSize is too small) */
size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize)
{
return ZSTD_frameHeaderSize_internal(src, srcSize, ZSTD_f_zstd1);
}
-/** ZSTD_getFrameHeader_internal() :
+/** ZSTD_getFrameHeader_advanced() :
* decode Frame Header, or require larger `srcSize`.
* note : only works for formats ZSTD_f_zstd1 and ZSTD_f_zstd1_magicless
* @return : 0, `zfhPtr` is correctly filled,
* >0, `srcSize` is too small, value is wanted `srcSize` amount,
* or an error code, which can be tested using ZSTD_isError() */
-static size_t ZSTD_getFrameHeader_internal(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format)
+size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format)
{
const BYTE* ip = (const BYTE*)src;
size_t const minInputSize = ZSTD_startingInputLength(format);
+ memset(zfhPtr, 0, sizeof(*zfhPtr)); /* not strictly necessary, but static analyzer do not understand that zfhPtr is only going to be read only if return value is zero, since they are 2 different signals */
if (srcSize < minInputSize) return minInputSize;
+ if (src==NULL) return ERROR(GENERIC); /* invalid parameter */
if ( (format != ZSTD_f_zstd1_magicless)
&& (MEM_readLE32(src) != ZSTD_MAGICNUMBER) ) {
- if ((MEM_readLE32(src) & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) {
+ if ((MEM_readLE32(src) & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) {
/* skippable frame */
- if (srcSize < ZSTD_skippableHeaderSize)
- return ZSTD_skippableHeaderSize; /* magic number + frame length */
+ if (srcSize < ZSTD_SKIPPABLEHEADERSIZE)
+ return ZSTD_SKIPPABLEHEADERSIZE; /* magic number + frame length */
memset(zfhPtr, 0, sizeof(*zfhPtr));
- zfhPtr->frameContentSize = MEM_readLE32((const char *)src + ZSTD_frameIdSize);
+ zfhPtr->frameContentSize = MEM_readLE32((const char *)src + ZSTD_FRAMEIDSIZE);
zfhPtr->frameType = ZSTD_skippableFrame;
return 0;
}
@@ -394,7 +316,7 @@ static size_t ZSTD_getFrameHeader_internal(ZSTD_frameHeader* zfhPtr, const void*
* or an error code, which can be tested using ZSTD_isError() */
size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize)
{
- return ZSTD_getFrameHeader_internal(zfhPtr, src, srcSize, ZSTD_f_zstd1);
+ return ZSTD_getFrameHeader_advanced(zfhPtr, src, srcSize, ZSTD_f_zstd1);
}
@@ -421,6 +343,21 @@ unsigned long long ZSTD_getFrameContentSize(const void *src, size_t srcSize)
} }
}
+static size_t readSkippableFrameSize(void const* src, size_t srcSize)
+{
+ size_t const skippableHeaderSize = ZSTD_SKIPPABLEHEADERSIZE;
+ U32 sizeU32;
+
+ if (srcSize < ZSTD_SKIPPABLEHEADERSIZE)
+ return ERROR(srcSize_wrong);
+
+ sizeU32 = MEM_readLE32((BYTE const*)src + ZSTD_FRAMEIDSIZE);
+ if ((U32)(sizeU32 + ZSTD_SKIPPABLEHEADERSIZE) < sizeU32)
+ return ERROR(frameParameter_unsupported);
+
+ return skippableHeaderSize + sizeU32;
+}
+
/** ZSTD_findDecompressedSize() :
* compatible with legacy mode
* `srcSize` must be the exact length of some number of ZSTD compressed and/or
@@ -430,15 +367,13 @@ unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize)
{
unsigned long long totalDstSize = 0;
- while (srcSize >= ZSTD_frameHeaderSize_prefix) {
+ while (srcSize >= ZSTD_FRAMEHEADERSIZE_PREFIX) {
U32 const magicNumber = MEM_readLE32(src);
- if ((magicNumber & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) {
- size_t skippableSize;
- if (srcSize < ZSTD_skippableHeaderSize)
- return ERROR(srcSize_wrong);
- skippableSize = MEM_readLE32((const BYTE *)src + ZSTD_frameIdSize)
- + ZSTD_skippableHeaderSize;
+ if ((magicNumber & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) {
+ size_t const skippableSize = readSkippableFrameSize(src, srcSize);
+ if (ZSTD_isError(skippableSize))
+ return skippableSize;
if (srcSize < skippableSize) {
return ZSTD_CONTENTSIZE_ERROR;
}
@@ -471,9 +406,9 @@ unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize)
}
/** ZSTD_getDecompressedSize() :
-* compatible with legacy mode
-* @return : decompressed size if known, 0 otherwise
- note : 0 can mean any of the following :
+ * compatible with legacy mode
+ * @return : decompressed size if known, 0 otherwise
+ note : 0 can mean any of the following :
- frame content is empty
- decompressed size field is not present in frame header
- frame header unknown / not supported
@@ -487,11 +422,11 @@ unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize)
/** ZSTD_decodeFrameHeader() :
-* `headerSize` must be the size provided by ZSTD_frameHeaderSize().
-* @return : 0 if success, or an error code, which can be tested using ZSTD_isError() */
+ * `headerSize` must be the size provided by ZSTD_frameHeaderSize().
+ * @return : 0 if success, or an error code, which can be tested using ZSTD_isError() */
static size_t ZSTD_decodeFrameHeader(ZSTD_DCtx* dctx, const void* src, size_t headerSize)
{
- size_t const result = ZSTD_getFrameHeader_internal(&(dctx->fParams), src, headerSize, dctx->format);
+ size_t const result = ZSTD_getFrameHeader_advanced(&(dctx->fParams), src, headerSize, dctx->format);
if (ZSTD_isError(result)) return result; /* invalid header */
if (result>0) return ERROR(srcSize_wrong); /* headerSize too small */
if (dctx->fParams.dictID && (dctx->dictID != dctx->fParams.dictID))
@@ -501,1241 +436,6 @@ static size_t ZSTD_decodeFrameHeader(ZSTD_DCtx* dctx, const void* src, size_t he
}
-/*-*************************************************************
- * Block decoding
- ***************************************************************/
-
-/*! ZSTD_getcBlockSize() :
-* Provides the size of compressed block from block header `src` */
-size_t ZSTD_getcBlockSize(const void* src, size_t srcSize,
- blockProperties_t* bpPtr)
-{
- if (srcSize < ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
- { U32 const cBlockHeader = MEM_readLE24(src);
- U32 const cSize = cBlockHeader >> 3;
- bpPtr->lastBlock = cBlockHeader & 1;
- bpPtr->blockType = (blockType_e)((cBlockHeader >> 1) & 3);
- bpPtr->origSize = cSize; /* only useful for RLE */
- if (bpPtr->blockType == bt_rle) return 1;
- if (bpPtr->blockType == bt_reserved) return ERROR(corruption_detected);
- return cSize;
- }
-}
-
-
-static size_t ZSTD_copyRawBlock(void* dst, size_t dstCapacity,
- const void* src, size_t srcSize)
-{
- if (srcSize > dstCapacity) return ERROR(dstSize_tooSmall);
- memcpy(dst, src, srcSize);
- return srcSize;
-}
-
-
-static size_t ZSTD_setRleBlock(void* dst, size_t dstCapacity,
- const void* src, size_t srcSize,
- size_t regenSize)
-{
- if (srcSize != 1) return ERROR(srcSize_wrong);
- if (regenSize > dstCapacity) return ERROR(dstSize_tooSmall);
- memset(dst, *(const BYTE*)src, regenSize);
- return regenSize;
-}
-
-/*! ZSTD_decodeLiteralsBlock() :
- * @return : nb of bytes read from src (< srcSize )
- * note : symbol not declared but exposed for fullbench */
-size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx,
- const void* src, size_t srcSize) /* note : srcSize < BLOCKSIZE */
-{
- if (srcSize < MIN_CBLOCK_SIZE) return ERROR(corruption_detected);
-
- { const BYTE* const istart = (const BYTE*) src;
- symbolEncodingType_e const litEncType = (symbolEncodingType_e)(istart[0] & 3);
-
- switch(litEncType)
- {
- case set_repeat:
- if (dctx->litEntropy==0) return ERROR(dictionary_corrupted);
- /* fall-through */
- case set_compressed:
- if (srcSize < 5) return ERROR(corruption_detected); /* srcSize >= MIN_CBLOCK_SIZE == 3; here we need up to 5 for case 3 */
- { size_t lhSize, litSize, litCSize;
- U32 singleStream=0;
- U32 const lhlCode = (istart[0] >> 2) & 3;
- U32 const lhc = MEM_readLE32(istart);
- switch(lhlCode)
- {
- case 0: case 1: default: /* note : default is impossible, since lhlCode into [0..3] */
- /* 2 - 2 - 10 - 10 */
- singleStream = !lhlCode;
- lhSize = 3;
- litSize = (lhc >> 4) & 0x3FF;
- litCSize = (lhc >> 14) & 0x3FF;
- break;
- case 2:
- /* 2 - 2 - 14 - 14 */
- lhSize = 4;
- litSize = (lhc >> 4) & 0x3FFF;
- litCSize = lhc >> 18;
- break;
- case 3:
- /* 2 - 2 - 18 - 18 */
- lhSize = 5;
- litSize = (lhc >> 4) & 0x3FFFF;
- litCSize = (lhc >> 22) + (istart[4] << 10);
- break;
- }
- if (litSize > ZSTD_BLOCKSIZE_MAX) return ERROR(corruption_detected);
- if (litCSize + lhSize > srcSize) return ERROR(corruption_detected);
-
- if (HUF_isError((litEncType==set_repeat) ?
- ( singleStream ?
- HUF_decompress1X_usingDTable_bmi2(dctx->litBuffer, litSize, istart+lhSize, litCSize, dctx->HUFptr, dctx->bmi2) :
- HUF_decompress4X_usingDTable_bmi2(dctx->litBuffer, litSize, istart+lhSize, litCSize, dctx->HUFptr, dctx->bmi2) ) :
- ( singleStream ?
- HUF_decompress1X2_DCtx_wksp_bmi2(dctx->entropy.hufTable, dctx->litBuffer, litSize, istart+lhSize, litCSize,
- dctx->entropy.workspace, sizeof(dctx->entropy.workspace), dctx->bmi2) :
- HUF_decompress4X_hufOnly_wksp_bmi2(dctx->entropy.hufTable, dctx->litBuffer, litSize, istart+lhSize, litCSize,
- dctx->entropy.workspace, sizeof(dctx->entropy.workspace), dctx->bmi2))))
- return ERROR(corruption_detected);
-
- dctx->litPtr = dctx->litBuffer;
- dctx->litSize = litSize;
- dctx->litEntropy = 1;
- if (litEncType==set_compressed) dctx->HUFptr = dctx->entropy.hufTable;
- memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
- return litCSize + lhSize;
- }
-
- case set_basic:
- { size_t litSize, lhSize;
- U32 const lhlCode = ((istart[0]) >> 2) & 3;
- switch(lhlCode)
- {
- case 0: case 2: default: /* note : default is impossible, since lhlCode into [0..3] */
- lhSize = 1;
- litSize = istart[0] >> 3;
- break;
- case 1:
- lhSize = 2;
- litSize = MEM_readLE16(istart) >> 4;
- break;
- case 3:
- lhSize = 3;
- litSize = MEM_readLE24(istart) >> 4;
- break;
- }
-
- if (lhSize+litSize+WILDCOPY_OVERLENGTH > srcSize) { /* risk reading beyond src buffer with wildcopy */
- if (litSize+lhSize > srcSize) return ERROR(corruption_detected);
- memcpy(dctx->litBuffer, istart+lhSize, litSize);
- dctx->litPtr = dctx->litBuffer;
- dctx->litSize = litSize;
- memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
- return lhSize+litSize;
- }
- /* direct reference into compressed stream */
- dctx->litPtr = istart+lhSize;
- dctx->litSize = litSize;
- return lhSize+litSize;
- }
-
- case set_rle:
- { U32 const lhlCode = ((istart[0]) >> 2) & 3;
- size_t litSize, lhSize;
- switch(lhlCode)
- {
- case 0: case 2: default: /* note : default is impossible, since lhlCode into [0..3] */
- lhSize = 1;
- litSize = istart[0] >> 3;
- break;
- case 1:
- lhSize = 2;
- litSize = MEM_readLE16(istart) >> 4;
- break;
- case 3:
- lhSize = 3;
- litSize = MEM_readLE24(istart) >> 4;
- if (srcSize<4) return ERROR(corruption_detected); /* srcSize >= MIN_CBLOCK_SIZE == 3; here we need lhSize+1 = 4 */
- break;
- }
- if (litSize > ZSTD_BLOCKSIZE_MAX) return ERROR(corruption_detected);
- memset(dctx->litBuffer, istart[lhSize], litSize + WILDCOPY_OVERLENGTH);
- dctx->litPtr = dctx->litBuffer;
- dctx->litSize = litSize;
- return lhSize+1;
- }
- default:
- return ERROR(corruption_detected); /* impossible */
- }
- }
-}
-
-/* Default FSE distribution tables.
- * These are pre-calculated FSE decoding tables using default distributions as defined in specification :
- * https://github.com/facebook/zstd/blob/master/doc/zstd_compression_format.md#default-distributions
- * They were generated programmatically with following method :
- * - start from default distributions, present in /lib/common/zstd_internal.h
- * - generate tables normally, using ZSTD_buildFSETable()
- * - printout the content of tables
- * - pretify output, report below, test with fuzzer to ensure it's correct */
-
-/* Default FSE distribution table for Literal Lengths */
-static const ZSTD_seqSymbol LL_defaultDTable[(1<<LL_DEFAULTNORMLOG)+1] = {
- { 1, 1, 1, LL_DEFAULTNORMLOG}, /* header : fastMode, tableLog */
- /* nextState, nbAddBits, nbBits, baseVal */
- { 0, 0, 4, 0}, { 16, 0, 4, 0},
- { 32, 0, 5, 1}, { 0, 0, 5, 3},
- { 0, 0, 5, 4}, { 0, 0, 5, 6},
- { 0, 0, 5, 7}, { 0, 0, 5, 9},
- { 0, 0, 5, 10}, { 0, 0, 5, 12},
- { 0, 0, 6, 14}, { 0, 1, 5, 16},
- { 0, 1, 5, 20}, { 0, 1, 5, 22},
- { 0, 2, 5, 28}, { 0, 3, 5, 32},
- { 0, 4, 5, 48}, { 32, 6, 5, 64},
- { 0, 7, 5, 128}, { 0, 8, 6, 256},
- { 0, 10, 6, 1024}, { 0, 12, 6, 4096},
- { 32, 0, 4, 0}, { 0, 0, 4, 1},
- { 0, 0, 5, 2}, { 32, 0, 5, 4},
- { 0, 0, 5, 5}, { 32, 0, 5, 7},
- { 0, 0, 5, 8}, { 32, 0, 5, 10},
- { 0, 0, 5, 11}, { 0, 0, 6, 13},
- { 32, 1, 5, 16}, { 0, 1, 5, 18},
- { 32, 1, 5, 22}, { 0, 2, 5, 24},
- { 32, 3, 5, 32}, { 0, 3, 5, 40},
- { 0, 6, 4, 64}, { 16, 6, 4, 64},
- { 32, 7, 5, 128}, { 0, 9, 6, 512},
- { 0, 11, 6, 2048}, { 48, 0, 4, 0},
- { 16, 0, 4, 1}, { 32, 0, 5, 2},
- { 32, 0, 5, 3}, { 32, 0, 5, 5},
- { 32, 0, 5, 6}, { 32, 0, 5, 8},
- { 32, 0, 5, 9}, { 32, 0, 5, 11},
- { 32, 0, 5, 12}, { 0, 0, 6, 15},
- { 32, 1, 5, 18}, { 32, 1, 5, 20},
- { 32, 2, 5, 24}, { 32, 2, 5, 28},
- { 32, 3, 5, 40}, { 32, 4, 5, 48},
- { 0, 16, 6,65536}, { 0, 15, 6,32768},
- { 0, 14, 6,16384}, { 0, 13, 6, 8192},
-}; /* LL_defaultDTable */
-
-/* Default FSE distribution table for Offset Codes */
-static const ZSTD_seqSymbol OF_defaultDTable[(1<<OF_DEFAULTNORMLOG)+1] = {
- { 1, 1, 1, OF_DEFAULTNORMLOG}, /* header : fastMode, tableLog */
- /* nextState, nbAddBits, nbBits, baseVal */
- { 0, 0, 5, 0}, { 0, 6, 4, 61},
- { 0, 9, 5, 509}, { 0, 15, 5,32765},
- { 0, 21, 5,2097149}, { 0, 3, 5, 5},
- { 0, 7, 4, 125}, { 0, 12, 5, 4093},
- { 0, 18, 5,262141}, { 0, 23, 5,8388605},
- { 0, 5, 5, 29}, { 0, 8, 4, 253},
- { 0, 14, 5,16381}, { 0, 20, 5,1048573},
- { 0, 2, 5, 1}, { 16, 7, 4, 125},
- { 0, 11, 5, 2045}, { 0, 17, 5,131069},
- { 0, 22, 5,4194301}, { 0, 4, 5, 13},
- { 16, 8, 4, 253}, { 0, 13, 5, 8189},
- { 0, 19, 5,524285}, { 0, 1, 5, 1},
- { 16, 6, 4, 61}, { 0, 10, 5, 1021},
- { 0, 16, 5,65533}, { 0, 28, 5,268435453},
- { 0, 27, 5,134217725}, { 0, 26, 5,67108861},
- { 0, 25, 5,33554429}, { 0, 24, 5,16777213},
-}; /* OF_defaultDTable */
-
-
-/* Default FSE distribution table for Match Lengths */
-static const ZSTD_seqSymbol ML_defaultDTable[(1<<ML_DEFAULTNORMLOG)+1] = {
- { 1, 1, 1, ML_DEFAULTNORMLOG}, /* header : fastMode, tableLog */
- /* nextState, nbAddBits, nbBits, baseVal */
- { 0, 0, 6, 3}, { 0, 0, 4, 4},
- { 32, 0, 5, 5}, { 0, 0, 5, 6},
- { 0, 0, 5, 8}, { 0, 0, 5, 9},
- { 0, 0, 5, 11}, { 0, 0, 6, 13},
- { 0, 0, 6, 16}, { 0, 0, 6, 19},
- { 0, 0, 6, 22}, { 0, 0, 6, 25},
- { 0, 0, 6, 28}, { 0, 0, 6, 31},
- { 0, 0, 6, 34}, { 0, 1, 6, 37},
- { 0, 1, 6, 41}, { 0, 2, 6, 47},
- { 0, 3, 6, 59}, { 0, 4, 6, 83},
- { 0, 7, 6, 131}, { 0, 9, 6, 515},
- { 16, 0, 4, 4}, { 0, 0, 4, 5},
- { 32, 0, 5, 6}, { 0, 0, 5, 7},
- { 32, 0, 5, 9}, { 0, 0, 5, 10},
- { 0, 0, 6, 12}, { 0, 0, 6, 15},
- { 0, 0, 6, 18}, { 0, 0, 6, 21},
- { 0, 0, 6, 24}, { 0, 0, 6, 27},
- { 0, 0, 6, 30}, { 0, 0, 6, 33},
- { 0, 1, 6, 35}, { 0, 1, 6, 39},
- { 0, 2, 6, 43}, { 0, 3, 6, 51},
- { 0, 4, 6, 67}, { 0, 5, 6, 99},
- { 0, 8, 6, 259}, { 32, 0, 4, 4},
- { 48, 0, 4, 4}, { 16, 0, 4, 5},
- { 32, 0, 5, 7}, { 32, 0, 5, 8},
- { 32, 0, 5, 10}, { 32, 0, 5, 11},
- { 0, 0, 6, 14}, { 0, 0, 6, 17},
- { 0, 0, 6, 20}, { 0, 0, 6, 23},
- { 0, 0, 6, 26}, { 0, 0, 6, 29},
- { 0, 0, 6, 32}, { 0, 16, 6,65539},
- { 0, 15, 6,32771}, { 0, 14, 6,16387},
- { 0, 13, 6, 8195}, { 0, 12, 6, 4099},
- { 0, 11, 6, 2051}, { 0, 10, 6, 1027},
-}; /* ML_defaultDTable */
-
-
-static void ZSTD_buildSeqTable_rle(ZSTD_seqSymbol* dt, U32 baseValue, U32 nbAddBits)
-{
- void* ptr = dt;
- ZSTD_seqSymbol_header* const DTableH = (ZSTD_seqSymbol_header*)ptr;
- ZSTD_seqSymbol* const cell = dt + 1;
-
- DTableH->tableLog = 0;
- DTableH->fastMode = 0;
-
- cell->nbBits = 0;
- cell->nextState = 0;
- assert(nbAddBits < 255);
- cell->nbAdditionalBits = (BYTE)nbAddBits;
- cell->baseValue = baseValue;
-}
-
-
-/* ZSTD_buildFSETable() :
- * generate FSE decoding table for one symbol (ll, ml or off) */
-static void
-ZSTD_buildFSETable(ZSTD_seqSymbol* dt,
- const short* normalizedCounter, unsigned maxSymbolValue,
- const U32* baseValue, const U32* nbAdditionalBits,
- unsigned tableLog)
-{
- ZSTD_seqSymbol* const tableDecode = dt+1;
- U16 symbolNext[MaxSeq+1];
-
- U32 const maxSV1 = maxSymbolValue + 1;
- U32 const tableSize = 1 << tableLog;
- U32 highThreshold = tableSize-1;
-
- /* Sanity Checks */
- assert(maxSymbolValue <= MaxSeq);
- assert(tableLog <= MaxFSELog);
-
- /* Init, lay down lowprob symbols */
- { ZSTD_seqSymbol_header DTableH;
- DTableH.tableLog = tableLog;
- DTableH.fastMode = 1;
- { S16 const largeLimit= (S16)(1 << (tableLog-1));
- U32 s;
- for (s=0; s<maxSV1; s++) {
- if (normalizedCounter[s]==-1) {
- tableDecode[highThreshold--].baseValue = s;
- symbolNext[s] = 1;
- } else {
- if (normalizedCounter[s] >= largeLimit) DTableH.fastMode=0;
- symbolNext[s] = normalizedCounter[s];
- } } }
- memcpy(dt, &DTableH, sizeof(DTableH));
- }
-
- /* Spread symbols */
- { U32 const tableMask = tableSize-1;
- U32 const step = FSE_TABLESTEP(tableSize);
- U32 s, position = 0;
- for (s=0; s<maxSV1; s++) {
- int i;
- for (i=0; i<normalizedCounter[s]; i++) {
- tableDecode[position].baseValue = s;
- position = (position + step) & tableMask;
- while (position > highThreshold) position = (position + step) & tableMask; /* lowprob area */
- } }
- assert(position == 0); /* position must reach all cells once, otherwise normalizedCounter is incorrect */
- }
-
- /* Build Decoding table */
- { U32 u;
- for (u=0; u<tableSize; u++) {
- U32 const symbol = tableDecode[u].baseValue;
- U32 const nextState = symbolNext[symbol]++;
- tableDecode[u].nbBits = (BYTE) (tableLog - BIT_highbit32(nextState) );
- tableDecode[u].nextState = (U16) ( (nextState << tableDecode[u].nbBits) - tableSize);
- assert(nbAdditionalBits[symbol] < 255);
- tableDecode[u].nbAdditionalBits = (BYTE)nbAdditionalBits[symbol];
- tableDecode[u].baseValue = baseValue[symbol];
- } }
-}
-
-
-/*! ZSTD_buildSeqTable() :
- * @return : nb bytes read from src,
- * or an error code if it fails */
-static size_t ZSTD_buildSeqTable(ZSTD_seqSymbol* DTableSpace, const ZSTD_seqSymbol** DTablePtr,
- symbolEncodingType_e type, U32 max, U32 maxLog,
- const void* src, size_t srcSize,
- const U32* baseValue, const U32* nbAdditionalBits,
- const ZSTD_seqSymbol* defaultTable, U32 flagRepeatTable)
-{
- switch(type)
- {
- case set_rle :
- if (!srcSize) return ERROR(srcSize_wrong);
- if ( (*(const BYTE*)src) > max) return ERROR(corruption_detected);
- { U32 const symbol = *(const BYTE*)src;
- U32 const baseline = baseValue[symbol];
- U32 const nbBits = nbAdditionalBits[symbol];
- ZSTD_buildSeqTable_rle(DTableSpace, baseline, nbBits);
- }
- *DTablePtr = DTableSpace;
- return 1;
- case set_basic :
- *DTablePtr = defaultTable;
- return 0;
- case set_repeat:
- if (!flagRepeatTable) return ERROR(corruption_detected);
- return 0;
- case set_compressed :
- { U32 tableLog;
- S16 norm[MaxSeq+1];
- size_t const headerSize = FSE_readNCount(norm, &max, &tableLog, src, srcSize);
- if (FSE_isError(headerSize)) return ERROR(corruption_detected);
- if (tableLog > maxLog) return ERROR(corruption_detected);
- ZSTD_buildFSETable(DTableSpace, norm, max, baseValue, nbAdditionalBits, tableLog);
- *DTablePtr = DTableSpace;
- return headerSize;
- }
- default : /* impossible */
- assert(0);
- return ERROR(GENERIC);
- }
-}
-
-static const U32 LL_base[MaxLL+1] = {
- 0, 1, 2, 3, 4, 5, 6, 7,
- 8, 9, 10, 11, 12, 13, 14, 15,
- 16, 18, 20, 22, 24, 28, 32, 40,
- 48, 64, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000,
- 0x2000, 0x4000, 0x8000, 0x10000 };
-
-static const U32 OF_base[MaxOff+1] = {
- 0, 1, 1, 5, 0xD, 0x1D, 0x3D, 0x7D,
- 0xFD, 0x1FD, 0x3FD, 0x7FD, 0xFFD, 0x1FFD, 0x3FFD, 0x7FFD,
- 0xFFFD, 0x1FFFD, 0x3FFFD, 0x7FFFD, 0xFFFFD, 0x1FFFFD, 0x3FFFFD, 0x7FFFFD,
- 0xFFFFFD, 0x1FFFFFD, 0x3FFFFFD, 0x7FFFFFD, 0xFFFFFFD, 0x1FFFFFFD, 0x3FFFFFFD, 0x7FFFFFFD };
-
-static const U32 OF_bits[MaxOff+1] = {
- 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 };
-
-static const U32 ML_base[MaxML+1] = {
- 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, 37, 39, 41, 43, 47, 51, 59,
- 67, 83, 99, 0x83, 0x103, 0x203, 0x403, 0x803,
- 0x1003, 0x2003, 0x4003, 0x8003, 0x10003 };
-
-
-size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr,
- const void* src, size_t srcSize)
-{
- const BYTE* const istart = (const BYTE* const)src;
- const BYTE* const iend = istart + srcSize;
- const BYTE* ip = istart;
- DEBUGLOG(5, "ZSTD_decodeSeqHeaders");
-
- /* check */
- if (srcSize < MIN_SEQUENCES_SIZE) return ERROR(srcSize_wrong);
-
- /* SeqHead */
- { int nbSeq = *ip++;
- if (!nbSeq) { *nbSeqPtr=0; return 1; }
- if (nbSeq > 0x7F) {
- if (nbSeq == 0xFF) {
- if (ip+2 > iend) return ERROR(srcSize_wrong);
- nbSeq = MEM_readLE16(ip) + LONGNBSEQ, ip+=2;
- } else {
- if (ip >= iend) return ERROR(srcSize_wrong);
- nbSeq = ((nbSeq-0x80)<<8) + *ip++;
- }
- }
- *nbSeqPtr = nbSeq;
- }
-
- /* FSE table descriptors */
- if (ip+4 > iend) return ERROR(srcSize_wrong); /* minimum possible size */
- { symbolEncodingType_e const LLtype = (symbolEncodingType_e)(*ip >> 6);
- symbolEncodingType_e const OFtype = (symbolEncodingType_e)((*ip >> 4) & 3);
- symbolEncodingType_e const MLtype = (symbolEncodingType_e)((*ip >> 2) & 3);
- ip++;
-
- /* Build DTables */
- { size_t const llhSize = ZSTD_buildSeqTable(dctx->entropy.LLTable, &dctx->LLTptr,
- LLtype, MaxLL, LLFSELog,
- ip, iend-ip,
- LL_base, LL_bits,
- LL_defaultDTable, dctx->fseEntropy);
- if (ZSTD_isError(llhSize)) return ERROR(corruption_detected);
- ip += llhSize;
- }
-
- { size_t const ofhSize = ZSTD_buildSeqTable(dctx->entropy.OFTable, &dctx->OFTptr,
- OFtype, MaxOff, OffFSELog,
- ip, iend-ip,
- OF_base, OF_bits,
- OF_defaultDTable, dctx->fseEntropy);
- if (ZSTD_isError(ofhSize)) return ERROR(corruption_detected);
- ip += ofhSize;
- }
-
- { size_t const mlhSize = ZSTD_buildSeqTable(dctx->entropy.MLTable, &dctx->MLTptr,
- MLtype, MaxML, MLFSELog,
- ip, iend-ip,
- ML_base, ML_bits,
- ML_defaultDTable, dctx->fseEntropy);
- if (ZSTD_isError(mlhSize)) return ERROR(corruption_detected);
- ip += mlhSize;
- }
- }
-
- return ip-istart;
-}
-
-
-typedef struct {
- size_t litLength;
- size_t matchLength;
- size_t offset;
- const BYTE* match;
-} seq_t;
-
-typedef struct {
- size_t state;
- const ZSTD_seqSymbol* table;
-} ZSTD_fseState;
-
-typedef struct {
- BIT_DStream_t DStream;
- ZSTD_fseState stateLL;
- ZSTD_fseState stateOffb;
- ZSTD_fseState stateML;
- size_t prevOffset[ZSTD_REP_NUM];
- const BYTE* prefixStart;
- const BYTE* dictEnd;
- size_t pos;
-} seqState_t;
-
-
-FORCE_NOINLINE
-size_t ZSTD_execSequenceLast7(BYTE* op,
- BYTE* const oend, seq_t sequence,
- const BYTE** litPtr, const BYTE* const litLimit,
- const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd)
-{
- BYTE* const oLitEnd = op + sequence.litLength;
- size_t const sequenceLength = sequence.litLength + sequence.matchLength;
- BYTE* const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */
- BYTE* const oend_w = oend - WILDCOPY_OVERLENGTH;
- const BYTE* const iLitEnd = *litPtr + sequence.litLength;
- const BYTE* match = oLitEnd - sequence.offset;
-
- /* check */
- if (oMatchEnd>oend) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
- if (iLitEnd > litLimit) return ERROR(corruption_detected); /* over-read beyond lit buffer */
- if (oLitEnd <= oend_w) return ERROR(GENERIC); /* Precondition */
-
- /* copy literals */
- if (op < oend_w) {
- ZSTD_wildcopy(op, *litPtr, oend_w - op);
- *litPtr += oend_w - op;
- op = oend_w;
- }
- while (op < oLitEnd) *op++ = *(*litPtr)++;
-
- /* copy Match */
- if (sequence.offset > (size_t)(oLitEnd - base)) {
- /* offset beyond prefix */
- if (sequence.offset > (size_t)(oLitEnd - vBase)) return ERROR(corruption_detected);
- match = dictEnd - (base-match);
- if (match + sequence.matchLength <= dictEnd) {
- memmove(oLitEnd, match, sequence.matchLength);
- return sequenceLength;
- }
- /* span extDict & currentPrefixSegment */
- { size_t const length1 = dictEnd - match;
- memmove(oLitEnd, match, length1);
- op = oLitEnd + length1;
- sequence.matchLength -= length1;
- match = base;
- } }
- while (op < oMatchEnd) *op++ = *match++;
- return sequenceLength;
-}
-
-
-HINT_INLINE
-size_t ZSTD_execSequence(BYTE* op,
- BYTE* const oend, seq_t sequence,
- const BYTE** litPtr, const BYTE* const litLimit,
- const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd)
-{
- BYTE* const oLitEnd = op + sequence.litLength;
- size_t const sequenceLength = sequence.litLength + sequence.matchLength;
- BYTE* const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */
- BYTE* const oend_w = oend - WILDCOPY_OVERLENGTH;
- const BYTE* const iLitEnd = *litPtr + sequence.litLength;
- const BYTE* match = oLitEnd - sequence.offset;
-
- /* check */
- if (oMatchEnd>oend) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
- if (iLitEnd > litLimit) return ERROR(corruption_detected); /* over-read beyond lit buffer */
- if (oLitEnd>oend_w) return ZSTD_execSequenceLast7(op, oend, sequence, litPtr, litLimit, base, vBase, dictEnd);
-
- /* copy Literals */
- ZSTD_copy8(op, *litPtr);
- if (sequence.litLength > 8)
- ZSTD_wildcopy(op+8, (*litPtr)+8, sequence.litLength - 8); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */
- op = oLitEnd;
- *litPtr = iLitEnd; /* update for next sequence */
-
- /* copy Match */
- if (sequence.offset > (size_t)(oLitEnd - base)) {
- /* offset beyond prefix -> go into extDict */
- if (sequence.offset > (size_t)(oLitEnd - vBase))
- return ERROR(corruption_detected);
- match = dictEnd + (match - base);
- if (match + sequence.matchLength <= dictEnd) {
- memmove(oLitEnd, match, sequence.matchLength);
- return sequenceLength;
- }
- /* span extDict & currentPrefixSegment */
- { size_t const length1 = dictEnd - match;
- memmove(oLitEnd, match, length1);
- op = oLitEnd + length1;
- sequence.matchLength -= length1;
- match = base;
- if (op > oend_w || sequence.matchLength < MINMATCH) {
- U32 i;
- for (i = 0; i < sequence.matchLength; ++i) op[i] = match[i];
- return sequenceLength;
- }
- } }
- /* Requirement: op <= oend_w && sequence.matchLength >= MINMATCH */
-
- /* match within prefix */
- if (sequence.offset < 8) {
- /* close range match, overlap */
- static const U32 dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 }; /* added */
- static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /* subtracted */
- int const sub2 = dec64table[sequence.offset];
- op[0] = match[0];
- op[1] = match[1];
- op[2] = match[2];
- op[3] = match[3];
- match += dec32table[sequence.offset];
- ZSTD_copy4(op+4, match);
- match -= sub2;
- } else {
- ZSTD_copy8(op, match);
- }
- op += 8; match += 8;
-
- if (oMatchEnd > oend-(16-MINMATCH)) {
- if (op < oend_w) {
- ZSTD_wildcopy(op, match, oend_w - op);
- match += oend_w - op;
- op = oend_w;
- }
- while (op < oMatchEnd) *op++ = *match++;
- } else {
- ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
- }
- return sequenceLength;
-}
-
-
-HINT_INLINE
-size_t ZSTD_execSequenceLong(BYTE* op,
- BYTE* const oend, seq_t sequence,
- const BYTE** litPtr, const BYTE* const litLimit,
- const BYTE* const prefixStart, const BYTE* const dictStart, const BYTE* const dictEnd)
-{
- BYTE* const oLitEnd = op + sequence.litLength;
- size_t const sequenceLength = sequence.litLength + sequence.matchLength;
- BYTE* const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */
- BYTE* const oend_w = oend - WILDCOPY_OVERLENGTH;
- const BYTE* const iLitEnd = *litPtr + sequence.litLength;
- const BYTE* match = sequence.match;
-
- /* check */
- if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
- if (iLitEnd > litLimit) return ERROR(corruption_detected); /* over-read beyond lit buffer */
- if (oLitEnd > oend_w) return ZSTD_execSequenceLast7(op, oend, sequence, litPtr, litLimit, prefixStart, dictStart, dictEnd);
-
- /* copy Literals */
- ZSTD_copy8(op, *litPtr); /* note : op <= oLitEnd <= oend_w == oend - 8 */
- if (sequence.litLength > 8)
- ZSTD_wildcopy(op+8, (*litPtr)+8, sequence.litLength - 8); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */
- op = oLitEnd;
- *litPtr = iLitEnd; /* update for next sequence */
-
- /* copy Match */
- if (sequence.offset > (size_t)(oLitEnd - prefixStart)) {
- /* offset beyond prefix */
- if (sequence.offset > (size_t)(oLitEnd - dictStart)) return ERROR(corruption_detected);
- if (match + sequence.matchLength <= dictEnd) {
- memmove(oLitEnd, match, sequence.matchLength);
- return sequenceLength;
- }
- /* span extDict & currentPrefixSegment */
- { size_t const length1 = dictEnd - match;
- memmove(oLitEnd, match, length1);
- op = oLitEnd + length1;
- sequence.matchLength -= length1;
- match = prefixStart;
- if (op > oend_w || sequence.matchLength < MINMATCH) {
- U32 i;
- for (i = 0; i < sequence.matchLength; ++i) op[i] = match[i];
- return sequenceLength;
- }
- } }
- assert(op <= oend_w);
- assert(sequence.matchLength >= MINMATCH);
-
- /* match within prefix */
- if (sequence.offset < 8) {
- /* close range match, overlap */
- static const U32 dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 }; /* added */
- static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /* subtracted */
- int const sub2 = dec64table[sequence.offset];
- op[0] = match[0];
- op[1] = match[1];
- op[2] = match[2];
- op[3] = match[3];
- match += dec32table[sequence.offset];
- ZSTD_copy4(op+4, match);
- match -= sub2;
- } else {
- ZSTD_copy8(op, match);
- }
- op += 8; match += 8;
-
- if (oMatchEnd > oend-(16-MINMATCH)) {
- if (op < oend_w) {
- ZSTD_wildcopy(op, match, oend_w - op);
- match += oend_w - op;
- op = oend_w;
- }
- while (op < oMatchEnd) *op++ = *match++;
- } else {
- ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
- }
- return sequenceLength;
-}
-
-static void
-ZSTD_initFseState(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD, const ZSTD_seqSymbol* dt)
-{
- const void* ptr = dt;
- const ZSTD_seqSymbol_header* const DTableH = (const ZSTD_seqSymbol_header*)ptr;
- DStatePtr->state = BIT_readBits(bitD, DTableH->tableLog);
- DEBUGLOG(6, "ZSTD_initFseState : val=%u using %u bits",
- (U32)DStatePtr->state, DTableH->tableLog);
- BIT_reloadDStream(bitD);
- DStatePtr->table = dt + 1;
-}
-
-FORCE_INLINE_TEMPLATE void
-ZSTD_updateFseState(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD)
-{
- ZSTD_seqSymbol const DInfo = DStatePtr->table[DStatePtr->state];
- U32 const nbBits = DInfo.nbBits;
- size_t const lowBits = BIT_readBits(bitD, nbBits);
- DStatePtr->state = DInfo.nextState + lowBits;
-}
-
-/* We need to add at most (ZSTD_WINDOWLOG_MAX_32 - 1) bits to read the maximum
- * offset bits. But we can only read at most (STREAM_ACCUMULATOR_MIN_32 - 1)
- * bits before reloading. This value is the maximum number of bytes we read
- * after reloading when we are decoding long offets.
- */
-#define LONG_OFFSETS_MAX_EXTRA_BITS_32 \
- (ZSTD_WINDOWLOG_MAX_32 > STREAM_ACCUMULATOR_MIN_32 \
- ? ZSTD_WINDOWLOG_MAX_32 - STREAM_ACCUMULATOR_MIN_32 \
- : 0)
-
-typedef enum { ZSTD_lo_isRegularOffset, ZSTD_lo_isLongOffset=1 } ZSTD_longOffset_e;
-
-FORCE_INLINE_TEMPLATE seq_t
-ZSTD_decodeSequence(seqState_t* seqState, const ZSTD_longOffset_e longOffsets)
-{
- seq_t seq;
- U32 const llBits = seqState->stateLL.table[seqState->stateLL.state].nbAdditionalBits;
- U32 const mlBits = seqState->stateML.table[seqState->stateML.state].nbAdditionalBits;
- U32 const ofBits = seqState->stateOffb.table[seqState->stateOffb.state].nbAdditionalBits;
- U32 const totalBits = llBits+mlBits+ofBits;
- U32 const llBase = seqState->stateLL.table[seqState->stateLL.state].baseValue;
- U32 const mlBase = seqState->stateML.table[seqState->stateML.state].baseValue;
- U32 const ofBase = seqState->stateOffb.table[seqState->stateOffb.state].baseValue;
-
- /* sequence */
- { size_t offset;
- if (!ofBits)
- offset = 0;
- else {
- ZSTD_STATIC_ASSERT(ZSTD_lo_isLongOffset == 1);
- ZSTD_STATIC_ASSERT(LONG_OFFSETS_MAX_EXTRA_BITS_32 == 5);
- assert(ofBits <= MaxOff);
- if (MEM_32bits() && longOffsets && (ofBits >= STREAM_ACCUMULATOR_MIN_32)) {
- U32 const extraBits = ofBits - MIN(ofBits, 32 - seqState->DStream.bitsConsumed);
- offset = ofBase + (BIT_readBitsFast(&seqState->DStream, ofBits - extraBits) << extraBits);
- BIT_reloadDStream(&seqState->DStream);
- if (extraBits) offset += BIT_readBitsFast(&seqState->DStream, extraBits);
- assert(extraBits <= LONG_OFFSETS_MAX_EXTRA_BITS_32); /* to avoid another reload */
- } else {
- offset = ofBase + BIT_readBitsFast(&seqState->DStream, ofBits/*>0*/); /* <= (ZSTD_WINDOWLOG_MAX-1) bits */
- if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream);
- }
- }
-
- if (ofBits <= 1) {
- offset += (llBase==0);
- if (offset) {
- size_t temp = (offset==3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset];
- temp += !temp; /* 0 is not valid; input is corrupted; force offset to 1 */
- if (offset != 1) seqState->prevOffset[2] = seqState->prevOffset[1];
- seqState->prevOffset[1] = seqState->prevOffset[0];
- seqState->prevOffset[0] = offset = temp;
- } else { /* offset == 0 */
- offset = seqState->prevOffset[0];
- }
- } else {
- seqState->prevOffset[2] = seqState->prevOffset[1];
- seqState->prevOffset[1] = seqState->prevOffset[0];
- seqState->prevOffset[0] = offset;
- }
- seq.offset = offset;
- }
-
- seq.matchLength = mlBase
- + ((mlBits>0) ? BIT_readBitsFast(&seqState->DStream, mlBits/*>0*/) : 0); /* <= 16 bits */
- if (MEM_32bits() && (mlBits+llBits >= STREAM_ACCUMULATOR_MIN_32-LONG_OFFSETS_MAX_EXTRA_BITS_32))
- BIT_reloadDStream(&seqState->DStream);
- if (MEM_64bits() && (totalBits >= STREAM_ACCUMULATOR_MIN_64-(LLFSELog+MLFSELog+OffFSELog)))
- BIT_reloadDStream(&seqState->DStream);
- /* Ensure there are enough bits to read the rest of data in 64-bit mode. */
- ZSTD_STATIC_ASSERT(16+LLFSELog+MLFSELog+OffFSELog < STREAM_ACCUMULATOR_MIN_64);
-
- seq.litLength = llBase
- + ((llBits>0) ? BIT_readBitsFast(&seqState->DStream, llBits/*>0*/) : 0); /* <= 16 bits */
- if (MEM_32bits())
- BIT_reloadDStream(&seqState->DStream);
-
- DEBUGLOG(6, "seq: litL=%u, matchL=%u, offset=%u",
- (U32)seq.litLength, (U32)seq.matchLength, (U32)seq.offset);
-
- /* ANS state update */
- ZSTD_updateFseState(&seqState->stateLL, &seqState->DStream); /* <= 9 bits */
- ZSTD_updateFseState(&seqState->stateML, &seqState->DStream); /* <= 9 bits */
- if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream); /* <= 18 bits */
- ZSTD_updateFseState(&seqState->stateOffb, &seqState->DStream); /* <= 8 bits */
-
- return seq;
-}
-
-FORCE_INLINE_TEMPLATE size_t
-ZSTD_decompressSequences_body( ZSTD_DCtx* dctx,
- void* dst, size_t maxDstSize,
- const void* seqStart, size_t seqSize, int nbSeq,
- const ZSTD_longOffset_e isLongOffset)
-{
- const BYTE* ip = (const BYTE*)seqStart;
- const BYTE* const iend = ip + seqSize;
- BYTE* const ostart = (BYTE* const)dst;
- BYTE* const oend = ostart + maxDstSize;
- BYTE* op = ostart;
- const BYTE* litPtr = dctx->litPtr;
- const BYTE* const litEnd = litPtr + dctx->litSize;
- const BYTE* const base = (const BYTE*) (dctx->base);
- const BYTE* const vBase = (const BYTE*) (dctx->vBase);
- const BYTE* const dictEnd = (const BYTE*) (dctx->dictEnd);
- DEBUGLOG(5, "ZSTD_decompressSequences");
-
- /* Regen sequences */
- if (nbSeq) {
- seqState_t seqState;
- dctx->fseEntropy = 1;
- { U32 i; for (i=0; i<ZSTD_REP_NUM; i++) seqState.prevOffset[i] = dctx->entropy.rep[i]; }
- CHECK_E(BIT_initDStream(&seqState.DStream, ip, iend-ip), corruption_detected);
- ZSTD_initFseState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr);
- ZSTD_initFseState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr);
- ZSTD_initFseState(&seqState.stateML, &seqState.DStream, dctx->MLTptr);
-
- for ( ; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && nbSeq ; ) {
- nbSeq--;
- { seq_t const sequence = ZSTD_decodeSequence(&seqState, isLongOffset);
- size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litEnd, base, vBase, dictEnd);
- DEBUGLOG(6, "regenerated sequence size : %u", (U32)oneSeqSize);
- if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
- op += oneSeqSize;
- } }
-
- /* check if reached exact end */
- DEBUGLOG(5, "ZSTD_decompressSequences: after decode loop, remaining nbSeq : %i", nbSeq);
- if (nbSeq) return ERROR(corruption_detected);
- /* save reps for next block */
- { U32 i; for (i=0; i<ZSTD_REP_NUM; i++) dctx->entropy.rep[i] = (U32)(seqState.prevOffset[i]); }
- }
-
- /* last literal segment */
- { size_t const lastLLSize = litEnd - litPtr;
- if (lastLLSize > (size_t)(oend-op)) return ERROR(dstSize_tooSmall);
- memcpy(op, litPtr, lastLLSize);
- op += lastLLSize;
- }
-
- return op-ostart;
-}
-
-static size_t
-ZSTD_decompressSequences_default(ZSTD_DCtx* dctx,
- void* dst, size_t maxDstSize,
- const void* seqStart, size_t seqSize, int nbSeq,
- const ZSTD_longOffset_e isLongOffset)
-{
- return ZSTD_decompressSequences_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
-}
-
-
-
-FORCE_INLINE_TEMPLATE seq_t
-ZSTD_decodeSequenceLong(seqState_t* seqState, ZSTD_longOffset_e const longOffsets)
-{
- seq_t seq;
- U32 const llBits = seqState->stateLL.table[seqState->stateLL.state].nbAdditionalBits;
- U32 const mlBits = seqState->stateML.table[seqState->stateML.state].nbAdditionalBits;
- U32 const ofBits = seqState->stateOffb.table[seqState->stateOffb.state].nbAdditionalBits;
- U32 const totalBits = llBits+mlBits+ofBits;
- U32 const llBase = seqState->stateLL.table[seqState->stateLL.state].baseValue;
- U32 const mlBase = seqState->stateML.table[seqState->stateML.state].baseValue;
- U32 const ofBase = seqState->stateOffb.table[seqState->stateOffb.state].baseValue;
-
- /* sequence */
- { size_t offset;
- if (!ofBits)
- offset = 0;
- else {
- ZSTD_STATIC_ASSERT(ZSTD_lo_isLongOffset == 1);
- ZSTD_STATIC_ASSERT(LONG_OFFSETS_MAX_EXTRA_BITS_32 == 5);
- assert(ofBits <= MaxOff);
- if (MEM_32bits() && longOffsets) {
- U32 const extraBits = ofBits - MIN(ofBits, STREAM_ACCUMULATOR_MIN_32-1);
- offset = ofBase + (BIT_readBitsFast(&seqState->DStream, ofBits - extraBits) << extraBits);
- if (MEM_32bits() || extraBits) BIT_reloadDStream(&seqState->DStream);
- if (extraBits) offset += BIT_readBitsFast(&seqState->DStream, extraBits);
- } else {
- offset = ofBase + BIT_readBitsFast(&seqState->DStream, ofBits); /* <= (ZSTD_WINDOWLOG_MAX-1) bits */
- if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream);
- }
- }
-
- if (ofBits <= 1) {
- offset += (llBase==0);
- if (offset) {
- size_t temp = (offset==3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset];
- temp += !temp; /* 0 is not valid; input is corrupted; force offset to 1 */
- if (offset != 1) seqState->prevOffset[2] = seqState->prevOffset[1];
- seqState->prevOffset[1] = seqState->prevOffset[0];
- seqState->prevOffset[0] = offset = temp;
- } else {
- offset = seqState->prevOffset[0];
- }
- } else {
- seqState->prevOffset[2] = seqState->prevOffset[1];
- seqState->prevOffset[1] = seqState->prevOffset[0];
- seqState->prevOffset[0] = offset;
- }
- seq.offset = offset;
- }
-
- seq.matchLength = mlBase + ((mlBits>0) ? BIT_readBitsFast(&seqState->DStream, mlBits) : 0); /* <= 16 bits */
- if (MEM_32bits() && (mlBits+llBits >= STREAM_ACCUMULATOR_MIN_32-LONG_OFFSETS_MAX_EXTRA_BITS_32))
- BIT_reloadDStream(&seqState->DStream);
- if (MEM_64bits() && (totalBits >= STREAM_ACCUMULATOR_MIN_64-(LLFSELog+MLFSELog+OffFSELog)))
- BIT_reloadDStream(&seqState->DStream);
- /* Verify that there is enough bits to read the rest of the data in 64-bit mode. */
- ZSTD_STATIC_ASSERT(16+LLFSELog+MLFSELog+OffFSELog < STREAM_ACCUMULATOR_MIN_64);
-
- seq.litLength = llBase + ((llBits>0) ? BIT_readBitsFast(&seqState->DStream, llBits) : 0); /* <= 16 bits */
- if (MEM_32bits())
- BIT_reloadDStream(&seqState->DStream);
-
- { size_t const pos = seqState->pos + seq.litLength;
- const BYTE* const matchBase = (seq.offset > pos) ? seqState->dictEnd : seqState->prefixStart;
- seq.match = matchBase + pos - seq.offset; /* note : this operation can overflow when seq.offset is really too large, which can only happen when input is corrupted.
- * No consequence though : no memory access will occur, overly large offset will be detected in ZSTD_execSequenceLong() */
- seqState->pos = pos + seq.matchLength;
- }
-
- /* ANS state update */
- ZSTD_updateFseState(&seqState->stateLL, &seqState->DStream); /* <= 9 bits */
- ZSTD_updateFseState(&seqState->stateML, &seqState->DStream); /* <= 9 bits */
- if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream); /* <= 18 bits */
- ZSTD_updateFseState(&seqState->stateOffb, &seqState->DStream); /* <= 8 bits */
-
- return seq;
-}
-
-FORCE_INLINE_TEMPLATE size_t
-ZSTD_decompressSequencesLong_body(
- ZSTD_DCtx* dctx,
- void* dst, size_t maxDstSize,
- const void* seqStart, size_t seqSize, int nbSeq,
- const ZSTD_longOffset_e isLongOffset)
-{
- const BYTE* ip = (const BYTE*)seqStart;
- const BYTE* const iend = ip + seqSize;
- BYTE* const ostart = (BYTE* const)dst;
- BYTE* const oend = ostart + maxDstSize;
- BYTE* op = ostart;
- const BYTE* litPtr = dctx->litPtr;
- const BYTE* const litEnd = litPtr + dctx->litSize;
- const BYTE* const prefixStart = (const BYTE*) (dctx->base);
- const BYTE* const dictStart = (const BYTE*) (dctx->vBase);
- const BYTE* const dictEnd = (const BYTE*) (dctx->dictEnd);
-
- /* Regen sequences */
- if (nbSeq) {
-#define STORED_SEQS 4
-#define STOSEQ_MASK (STORED_SEQS-1)
-#define ADVANCED_SEQS 4
- seq_t sequences[STORED_SEQS];
- int const seqAdvance = MIN(nbSeq, ADVANCED_SEQS);
- seqState_t seqState;
- int seqNb;
- dctx->fseEntropy = 1;
- { U32 i; for (i=0; i<ZSTD_REP_NUM; i++) seqState.prevOffset[i] = dctx->entropy.rep[i]; }
- seqState.prefixStart = prefixStart;
- seqState.pos = (size_t)(op-prefixStart);
- seqState.dictEnd = dictEnd;
- CHECK_E(BIT_initDStream(&seqState.DStream, ip, iend-ip), corruption_detected);
- ZSTD_initFseState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr);
- ZSTD_initFseState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr);
- ZSTD_initFseState(&seqState.stateML, &seqState.DStream, dctx->MLTptr);
-
- /* prepare in advance */
- for (seqNb=0; (BIT_reloadDStream(&seqState.DStream) <= BIT_DStream_completed) && (seqNb<seqAdvance); seqNb++) {
- sequences[seqNb] = ZSTD_decodeSequenceLong(&seqState, isLongOffset);
- }
- if (seqNb<seqAdvance) return ERROR(corruption_detected);
-
- /* decode and decompress */
- for ( ; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && (seqNb<nbSeq) ; seqNb++) {
- seq_t const sequence = ZSTD_decodeSequenceLong(&seqState, isLongOffset);
- size_t const oneSeqSize = ZSTD_execSequenceLong(op, oend, sequences[(seqNb-ADVANCED_SEQS) & STOSEQ_MASK], &litPtr, litEnd, prefixStart, dictStart, dictEnd);
- if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
- PREFETCH(sequence.match); /* note : it's safe to invoke PREFETCH() on any memory address, including invalid ones */
- sequences[seqNb&STOSEQ_MASK] = sequence;
- op += oneSeqSize;
- }
- if (seqNb<nbSeq) return ERROR(corruption_detected);
-
- /* finish queue */
- seqNb -= seqAdvance;
- for ( ; seqNb<nbSeq ; seqNb++) {
- size_t const oneSeqSize = ZSTD_execSequenceLong(op, oend, sequences[seqNb&STOSEQ_MASK], &litPtr, litEnd, prefixStart, dictStart, dictEnd);
- if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
- op += oneSeqSize;
- }
-
- /* save reps for next block */
- { U32 i; for (i=0; i<ZSTD_REP_NUM; i++) dctx->entropy.rep[i] = (U32)(seqState.prevOffset[i]); }
-#undef STORED_SEQS
-#undef STOSEQ_MASK
-#undef ADVANCED_SEQS
- }
-
- /* last literal segment */
- { size_t const lastLLSize = litEnd - litPtr;
- if (lastLLSize > (size_t)(oend-op)) return ERROR(dstSize_tooSmall);
- memcpy(op, litPtr, lastLLSize);
- op += lastLLSize;
- }
-
- return op-ostart;
-}
-
-static size_t
-ZSTD_decompressSequencesLong_default(ZSTD_DCtx* dctx,
- void* dst, size_t maxDstSize,
- const void* seqStart, size_t seqSize, int nbSeq,
- const ZSTD_longOffset_e isLongOffset)
-{
- return ZSTD_decompressSequencesLong_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
-}
-
-
-
-#if DYNAMIC_BMI2
-
-static TARGET_ATTRIBUTE("bmi2") size_t
-ZSTD_decompressSequences_bmi2(ZSTD_DCtx* dctx,
- void* dst, size_t maxDstSize,
- const void* seqStart, size_t seqSize, int nbSeq,
- const ZSTD_longOffset_e isLongOffset)
-{
- return ZSTD_decompressSequences_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
-}
-
-static TARGET_ATTRIBUTE("bmi2") size_t
-ZSTD_decompressSequencesLong_bmi2(ZSTD_DCtx* dctx,
- void* dst, size_t maxDstSize,
- const void* seqStart, size_t seqSize, int nbSeq,
- const ZSTD_longOffset_e isLongOffset)
-{
- return ZSTD_decompressSequencesLong_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
-}
-
-#endif
-
-typedef size_t (*ZSTD_decompressSequences_t)(
- ZSTD_DCtx *dctx, void *dst, size_t maxDstSize,
- const void *seqStart, size_t seqSize, int nbSeq,
- const ZSTD_longOffset_e isLongOffset);
-
-static size_t ZSTD_decompressSequences(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize,
- const void* seqStart, size_t seqSize, int nbSeq,
- const ZSTD_longOffset_e isLongOffset)
-{
- DEBUGLOG(5, "ZSTD_decompressSequences");
-#if DYNAMIC_BMI2
- if (dctx->bmi2) {
- return ZSTD_decompressSequences_bmi2(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
- }
-#endif
- return ZSTD_decompressSequences_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
-}
-
-static size_t ZSTD_decompressSequencesLong(ZSTD_DCtx* dctx,
- void* dst, size_t maxDstSize,
- const void* seqStart, size_t seqSize, int nbSeq,
- const ZSTD_longOffset_e isLongOffset)
-{
- DEBUGLOG(5, "ZSTD_decompressSequencesLong");
-#if DYNAMIC_BMI2
- if (dctx->bmi2) {
- return ZSTD_decompressSequencesLong_bmi2(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
- }
-#endif
- return ZSTD_decompressSequencesLong_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
-}
-
-/* ZSTD_getLongOffsetsShare() :
- * condition : offTable must be valid
- * @return : "share" of long offsets (arbitrarily defined as > (1<<23))
- * compared to maximum possible of (1<<OffFSELog) */
-static unsigned
-ZSTD_getLongOffsetsShare(const ZSTD_seqSymbol* offTable)
-{
- const void* ptr = offTable;
- U32 const tableLog = ((const ZSTD_seqSymbol_header*)ptr)[0].tableLog;
- const ZSTD_seqSymbol* table = offTable + 1;
- U32 const max = 1 << tableLog;
- U32 u, total = 0;
- DEBUGLOG(5, "ZSTD_getLongOffsetsShare: (tableLog=%u)", tableLog);
-
- assert(max <= (1 << OffFSELog)); /* max not too large */
- for (u=0; u<max; u++) {
- if (table[u].nbAdditionalBits > 22) total += 1;
- }
-
- assert(tableLog <= OffFSELog);
- total <<= (OffFSELog - tableLog); /* scale to OffFSELog */
-
- return total;
-}
-
-
-static size_t ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx,
- void* dst, size_t dstCapacity,
- const void* src, size_t srcSize, const int frame)
-{ /* blockType == blockCompressed */
- const BYTE* ip = (const BYTE*)src;
- /* isLongOffset must be true if there are long offsets.
- * Offsets are long if they are larger than 2^STREAM_ACCUMULATOR_MIN.
- * We don't expect that to be the case in 64-bit mode.
- * In block mode, window size is not known, so we have to be conservative. (note: but it could be evaluated from current-lowLimit)
- */
- ZSTD_longOffset_e const isLongOffset = (ZSTD_longOffset_e)(MEM_32bits() && (!frame || dctx->fParams.windowSize > (1ULL << STREAM_ACCUMULATOR_MIN)));
- DEBUGLOG(5, "ZSTD_decompressBlock_internal (size : %u)", (U32)srcSize);
-
- if (srcSize >= ZSTD_BLOCKSIZE_MAX) return ERROR(srcSize_wrong);
-
- /* Decode literals section */
- { size_t const litCSize = ZSTD_decodeLiteralsBlock(dctx, src, srcSize);
- DEBUGLOG(5, "ZSTD_decodeLiteralsBlock : %u", (U32)litCSize);
- if (ZSTD_isError(litCSize)) return litCSize;
- ip += litCSize;
- srcSize -= litCSize;
- }
-
- /* Build Decoding Tables */
- { int nbSeq;
- size_t const seqHSize = ZSTD_decodeSeqHeaders(dctx, &nbSeq, ip, srcSize);
- if (ZSTD_isError(seqHSize)) return seqHSize;
- ip += seqHSize;
- srcSize -= seqHSize;
-
- if ( (!frame || dctx->fParams.windowSize > (1<<24))
- && (nbSeq>0) ) { /* could probably use a larger nbSeq limit */
- U32 const shareLongOffsets = ZSTD_getLongOffsetsShare(dctx->OFTptr);
- U32 const minShare = MEM_64bits() ? 7 : 20; /* heuristic values, correspond to 2.73% and 7.81% */
- if (shareLongOffsets >= minShare)
- return ZSTD_decompressSequencesLong(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset);
- }
-
- return ZSTD_decompressSequences(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset);
- }
-}
-
-
-static void ZSTD_checkContinuity(ZSTD_DCtx* dctx, const void* dst)
-{
- if (dst != dctx->previousDstEnd) { /* not contiguous */
- dctx->dictEnd = dctx->previousDstEnd;
- dctx->vBase = (const char*)dst - ((const char*)(dctx->previousDstEnd) - (const char*)(dctx->base));
- dctx->base = dst;
- dctx->previousDstEnd = dst;
- }
-}
-
-size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx,
- void* dst, size_t dstCapacity,
- const void* src, size_t srcSize)
-{
- size_t dSize;
- ZSTD_checkContinuity(dctx, dst);
- dSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize, /* frame */ 0);
- dctx->previousDstEnd = (char*)dst + dSize;
- return dSize;
-}
-
-
-/** ZSTD_insertBlock() :
- insert `src` block into `dctx` history. Useful to track uncompressed blocks. */
-ZSTDLIB_API size_t ZSTD_insertBlock(ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize)
-{
- ZSTD_checkContinuity(dctx, blockStart);
- dctx->previousDstEnd = (const char*)blockStart + blockSize;
- return blockSize;
-}
-
-
-static size_t ZSTD_generateNxBytes(void* dst, size_t dstCapacity, BYTE byte, size_t length)
-{
- if (length > dstCapacity) return ERROR(dstSize_tooSmall);
- memset(dst, byte, length);
- return length;
-}
-
/** ZSTD_findFrameCompressedSize() :
* compatible with legacy mode
* `src` must point to the start of a ZSTD frame, ZSTD legacy frame, or skippable frame
@@ -1747,9 +447,9 @@ size_t ZSTD_findFrameCompressedSize(const void *src, size_t srcSize)
if (ZSTD_isLegacy(src, srcSize))
return ZSTD_findFrameCompressedSizeLegacy(src, srcSize);
#endif
- if ( (srcSize >= ZSTD_skippableHeaderSize)
- && (MEM_readLE32(src) & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START ) {
- return ZSTD_skippableHeaderSize + MEM_readLE32((const BYTE*)src + ZSTD_frameIdSize);
+ if ( (srcSize >= ZSTD_SKIPPABLEHEADERSIZE)
+ && (MEM_readLE32(src) & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START ) {
+ return readSkippableFrameSize(src, srcSize);
} else {
const BYTE* ip = (const BYTE*)src;
const BYTE* const ipstart = ip;
@@ -1783,15 +483,70 @@ size_t ZSTD_findFrameCompressedSize(const void *src, size_t srcSize)
if (zfh.checksumFlag) { /* Final frame content checksum */
if (remainingSize < 4) return ERROR(srcSize_wrong);
ip += 4;
- remainingSize -= 4;
}
return ip - ipstart;
}
}
+
+
+/*-*************************************************************
+ * Frame decoding
+ ***************************************************************/
+
+
+void ZSTD_checkContinuity(ZSTD_DCtx* dctx, const void* dst)
+{
+ if (dst != dctx->previousDstEnd) { /* not contiguous */
+ dctx->dictEnd = dctx->previousDstEnd;
+ dctx->virtualStart = (const char*)dst - ((const char*)(dctx->previousDstEnd) - (const char*)(dctx->prefixStart));
+ dctx->prefixStart = dst;
+ dctx->previousDstEnd = dst;
+ }
+}
+
+/** ZSTD_insertBlock() :
+ insert `src` block into `dctx` history. Useful to track uncompressed blocks. */
+size_t ZSTD_insertBlock(ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize)
+{
+ ZSTD_checkContinuity(dctx, blockStart);
+ dctx->previousDstEnd = (const char*)blockStart + blockSize;
+ return blockSize;
+}
+
+
+static size_t ZSTD_copyRawBlock(void* dst, size_t dstCapacity,
+ const void* src, size_t srcSize)
+{
+ DEBUGLOG(5, "ZSTD_copyRawBlock");
+ if (dst == NULL) {
+ if (srcSize == 0) return 0;
+ return ERROR(dstBuffer_null);
+ }
+ if (srcSize > dstCapacity) return ERROR(dstSize_tooSmall);
+ memcpy(dst, src, srcSize);
+ return srcSize;
+}
+
+static size_t ZSTD_setRleBlock(void* dst, size_t dstCapacity,
+ BYTE b,
+ size_t regenSize)
+{
+ if (dst == NULL) {
+ if (regenSize == 0) return 0;
+ return ERROR(dstBuffer_null);
+ }
+ if (regenSize > dstCapacity) return ERROR(dstSize_tooSmall);
+ memset(dst, b, regenSize);
+ return regenSize;
+}
+
+
/*! ZSTD_decompressFrame() :
-* @dctx must be properly initialized */
+ * @dctx must be properly initialized
+ * will update *srcPtr and *srcSizePtr,
+ * to make *srcPtr progress by one frame. */
static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx,
void* dst, size_t dstCapacity,
const void** srcPtr, size_t *srcSizePtr)
@@ -1800,31 +555,33 @@ static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx,
BYTE* const ostart = (BYTE* const)dst;
BYTE* const oend = ostart + dstCapacity;
BYTE* op = ostart;
- size_t remainingSize = *srcSizePtr;
+ size_t remainingSrcSize = *srcSizePtr;
+
+ DEBUGLOG(4, "ZSTD_decompressFrame (srcSize:%i)", (int)*srcSizePtr);
/* check */
- if (remainingSize < ZSTD_frameHeaderSize_min+ZSTD_blockHeaderSize)
+ if (remainingSrcSize < ZSTD_FRAMEHEADERSIZE_MIN+ZSTD_blockHeaderSize)
return ERROR(srcSize_wrong);
/* Frame Header */
- { size_t const frameHeaderSize = ZSTD_frameHeaderSize(ip, ZSTD_frameHeaderSize_prefix);
+ { size_t const frameHeaderSize = ZSTD_frameHeaderSize(ip, ZSTD_FRAMEHEADERSIZE_PREFIX);
if (ZSTD_isError(frameHeaderSize)) return frameHeaderSize;
- if (remainingSize < frameHeaderSize+ZSTD_blockHeaderSize)
+ if (remainingSrcSize < frameHeaderSize+ZSTD_blockHeaderSize)
return ERROR(srcSize_wrong);
CHECK_F( ZSTD_decodeFrameHeader(dctx, ip, frameHeaderSize) );
- ip += frameHeaderSize; remainingSize -= frameHeaderSize;
+ ip += frameHeaderSize; remainingSrcSize -= frameHeaderSize;
}
/* Loop on each block */
while (1) {
size_t decodedSize;
blockProperties_t blockProperties;
- size_t const cBlockSize = ZSTD_getcBlockSize(ip, remainingSize, &blockProperties);
+ size_t const cBlockSize = ZSTD_getcBlockSize(ip, remainingSrcSize, &blockProperties);
if (ZSTD_isError(cBlockSize)) return cBlockSize;
ip += ZSTD_blockHeaderSize;
- remainingSize -= ZSTD_blockHeaderSize;
- if (cBlockSize > remainingSize) return ERROR(srcSize_wrong);
+ remainingSrcSize -= ZSTD_blockHeaderSize;
+ if (cBlockSize > remainingSrcSize) return ERROR(srcSize_wrong);
switch(blockProperties.blockType)
{
@@ -1835,7 +592,7 @@ static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx,
decodedSize = ZSTD_copyRawBlock(op, oend-op, ip, cBlockSize);
break;
case bt_rle :
- decodedSize = ZSTD_generateNxBytes(op, oend-op, *ip, blockProperties.origSize);
+ decodedSize = ZSTD_setRleBlock(op, oend-op, *ip, blockProperties.origSize);
break;
case bt_reserved :
default:
@@ -1847,7 +604,7 @@ static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx,
XXH64_update(&dctx->xxhState, op, decodedSize);
op += decodedSize;
ip += cBlockSize;
- remainingSize -= cBlockSize;
+ remainingSrcSize -= cBlockSize;
if (blockProperties.lastBlock) break;
}
@@ -1858,22 +615,19 @@ static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx,
if (dctx->fParams.checksumFlag) { /* Frame content checksum verification */
U32 const checkCalc = (U32)XXH64_digest(&dctx->xxhState);
U32 checkRead;
- if (remainingSize<4) return ERROR(checksum_wrong);
+ if (remainingSrcSize<4) return ERROR(checksum_wrong);
checkRead = MEM_readLE32(ip);
if (checkRead != checkCalc) return ERROR(checksum_wrong);
ip += 4;
- remainingSize -= 4;
+ remainingSrcSize -= 4;
}
/* Allow caller to get size read */
*srcPtr = ip;
- *srcSizePtr = remainingSize;
+ *srcSizePtr = remainingSrcSize;
return op-ostart;
}
-static const void* ZSTD_DDictDictContent(const ZSTD_DDict* ddict);
-static size_t ZSTD_DDictDictSize(const ZSTD_DDict* ddict);
-
static size_t ZSTD_decompressMultiFrame(ZSTD_DCtx* dctx,
void* dst, size_t dstCapacity,
const void* src, size_t srcSize,
@@ -1881,15 +635,17 @@ static size_t ZSTD_decompressMultiFrame(ZSTD_DCtx* dctx,
const ZSTD_DDict* ddict)
{
void* const dststart = dst;
+ int moreThan1Frame = 0;
+
+ DEBUGLOG(5, "ZSTD_decompressMultiFrame");
assert(dict==NULL || ddict==NULL); /* either dict or ddict set, not both */
if (ddict) {
- dict = ZSTD_DDictDictContent(ddict);
- dictSize = ZSTD_DDictDictSize(ddict);
+ dict = ZSTD_DDict_dictContent(ddict);
+ dictSize = ZSTD_DDict_dictSize(ddict);
}
- while (srcSize >= ZSTD_frameHeaderSize_prefix) {
- U32 magicNumber;
+ while (srcSize >= ZSTD_FRAMEHEADERSIZE_PREFIX) {
#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT >= 1)
if (ZSTD_isLegacy(src, srcSize)) {
@@ -1900,7 +656,9 @@ static size_t ZSTD_decompressMultiFrame(ZSTD_DCtx* dctx,
if (dctx->staticSize) return ERROR(memory_allocation);
decodedSize = ZSTD_decompressLegacy(dst, dstCapacity, src, frameSize, dict, dictSize);
+ if (ZSTD_isError(decodedSize)) return decodedSize;
+ assert(decodedSize <=- dstCapacity);
dst = (BYTE*)dst + decodedSize;
dstCapacity -= decodedSize;
@@ -1911,24 +669,19 @@ static size_t ZSTD_decompressMultiFrame(ZSTD_DCtx* dctx,
}
#endif
- magicNumber = MEM_readLE32(src);
- DEBUGLOG(4, "reading magic number %08X (expecting %08X)",
- (U32)magicNumber, (U32)ZSTD_MAGICNUMBER);
- if (magicNumber != ZSTD_MAGICNUMBER) {
- if ((magicNumber & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) {
- size_t skippableSize;
- if (srcSize < ZSTD_skippableHeaderSize)
- return ERROR(srcSize_wrong);
- skippableSize = MEM_readLE32((const BYTE*)src + ZSTD_frameIdSize)
- + ZSTD_skippableHeaderSize;
+ { U32 const magicNumber = MEM_readLE32(src);
+ DEBUGLOG(4, "reading magic number %08X (expecting %08X)",
+ (unsigned)magicNumber, ZSTD_MAGICNUMBER);
+ if ((magicNumber & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) {
+ size_t const skippableSize = readSkippableFrameSize(src, srcSize);
+ if (ZSTD_isError(skippableSize))
+ return skippableSize;
if (srcSize < skippableSize) return ERROR(srcSize_wrong);
src = (const BYTE *)src + skippableSize;
srcSize -= skippableSize;
continue;
- }
- return ERROR(prefix_unknown);
- }
+ } }
if (ddict) {
/* we were called from ZSTD_decompress_usingDDict */
@@ -1942,11 +695,25 @@ static size_t ZSTD_decompressMultiFrame(ZSTD_DCtx* dctx,
{ const size_t res = ZSTD_decompressFrame(dctx, dst, dstCapacity,
&src, &srcSize);
+ if ( (ZSTD_getErrorCode(res) == ZSTD_error_prefix_unknown)
+ && (moreThan1Frame==1) ) {
+ /* at least one frame successfully completed,
+ * but following bytes are garbage :
+ * it's more likely to be a srcSize error,
+ * specifying more bytes than compressed size of frame(s).
+ * This error message replaces ERROR(prefix_unknown),
+ * which would be confusing, as the first header is actually correct.
+ * Note that one could be unlucky, it might be a corruption error instead,
+ * happening right at the place where we expect zstd magic bytes.
+ * But this is _much_ less likely than a srcSize field error. */
+ return ERROR(srcSize_wrong);
+ }
if (ZSTD_isError(res)) return res;
- /* no need to bound check, ZSTD_decompressFrame already has */
+ assert(res <= dstCapacity);
dst = (BYTE*)dst + res;
dstCapacity -= res;
}
+ moreThan1Frame = 1;
} /* while (srcSize >= ZSTD_frameHeaderSize_prefix) */
if (srcSize) return ERROR(srcSize_wrong); /* input not entirely consumed */
@@ -1980,6 +747,7 @@ size_t ZSTD_decompress(void* dst, size_t dstCapacity, const void* src, size_t sr
return regenSize;
#else /* stack mode */
ZSTD_DCtx dctx;
+ ZSTD_initDCtx_internal(&dctx);
return ZSTD_decompressDCtx(&dctx, dst, dstCapacity, src, srcSize);
#endif
}
@@ -2021,9 +789,10 @@ static int ZSTD_isSkipFrame(ZSTD_DCtx* dctx) { return dctx->stage == ZSTDds_skip
* or an error code, which can be tested using ZSTD_isError() */
size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize)
{
- DEBUGLOG(5, "ZSTD_decompressContinue (srcSize:%u)", (U32)srcSize);
+ DEBUGLOG(5, "ZSTD_decompressContinue (srcSize:%u)", (unsigned)srcSize);
/* Sanity check */
- if (srcSize != dctx->expected) return ERROR(srcSize_wrong); /* not allowed */
+ if (srcSize != dctx->expected)
+ return ERROR(srcSize_wrong); /* not allowed */
if (dstCapacity) ZSTD_checkContinuity(dctx, dst);
switch (dctx->stage)
@@ -2031,10 +800,10 @@ size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, c
case ZSTDds_getFrameHeaderSize :
assert(src != NULL);
if (dctx->format == ZSTD_f_zstd1) { /* allows header */
- assert(srcSize >= ZSTD_frameIdSize); /* to read skippable magic number */
- if ((MEM_readLE32(src) & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) { /* skippable frame */
+ assert(srcSize >= ZSTD_FRAMEIDSIZE); /* to read skippable magic number */
+ if ((MEM_readLE32(src) & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) { /* skippable frame */
memcpy(dctx->headerBuffer, src, srcSize);
- dctx->expected = ZSTD_skippableHeaderSize - srcSize; /* remaining to load to get full skippable frame header */
+ dctx->expected = ZSTD_SKIPPABLEHEADERSIZE - srcSize; /* remaining to load to get full skippable frame header */
dctx->stage = ZSTDds_decodeSkippableHeader;
return 0;
} }
@@ -2094,19 +863,19 @@ size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, c
rSize = ZSTD_copyRawBlock(dst, dstCapacity, src, srcSize);
break;
case bt_rle :
- rSize = ZSTD_setRleBlock(dst, dstCapacity, src, srcSize, dctx->rleSize);
+ rSize = ZSTD_setRleBlock(dst, dstCapacity, *(const BYTE*)src, dctx->rleSize);
break;
case bt_reserved : /* should never happen */
default:
return ERROR(corruption_detected);
}
if (ZSTD_isError(rSize)) return rSize;
- DEBUGLOG(5, "ZSTD_decompressContinue: decoded size from block : %u", (U32)rSize);
+ DEBUGLOG(5, "ZSTD_decompressContinue: decoded size from block : %u", (unsigned)rSize);
dctx->decodedSize += rSize;
if (dctx->fParams.checksumFlag) XXH64_update(&dctx->xxhState, dst, rSize);
if (dctx->stage == ZSTDds_decompressLastBlock) { /* end of frame */
- DEBUGLOG(4, "ZSTD_decompressContinue: decoded size from frame : %u", (U32)dctx->decodedSize);
+ DEBUGLOG(4, "ZSTD_decompressContinue: decoded size from frame : %u", (unsigned)dctx->decodedSize);
if (dctx->fParams.frameContentSize != ZSTD_CONTENTSIZE_UNKNOWN) {
if (dctx->decodedSize != dctx->fParams.frameContentSize) {
return ERROR(corruption_detected);
@@ -2130,7 +899,7 @@ size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, c
assert(srcSize == 4); /* guaranteed by dctx->expected */
{ U32 const h32 = (U32)XXH64_digest(&dctx->xxhState);
U32 const check32 = MEM_readLE32(src);
- DEBUGLOG(4, "ZSTD_decompressContinue: checksum : calculated %08X :: %08X read", h32, check32);
+ DEBUGLOG(4, "ZSTD_decompressContinue: checksum : calculated %08X :: %08X read", (unsigned)h32, (unsigned)check32);
if (check32 != h32) return ERROR(checksum_wrong);
dctx->expected = 0;
dctx->stage = ZSTDds_getFrameHeaderSize;
@@ -2139,9 +908,9 @@ size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, c
case ZSTDds_decodeSkippableHeader:
assert(src != NULL);
- assert(srcSize <= ZSTD_skippableHeaderSize);
- memcpy(dctx->headerBuffer + (ZSTD_skippableHeaderSize - srcSize), src, srcSize); /* complete skippable header */
- dctx->expected = MEM_readLE32(dctx->headerBuffer + ZSTD_frameIdSize); /* note : dctx->expected can grow seriously large, beyond local buffer size */
+ assert(srcSize <= ZSTD_SKIPPABLEHEADERSIZE);
+ memcpy(dctx->headerBuffer + (ZSTD_SKIPPABLEHEADERSIZE - srcSize), src, srcSize); /* complete skippable header */
+ dctx->expected = MEM_readLE32(dctx->headerBuffer + ZSTD_FRAMEIDSIZE); /* note : dctx->expected can grow seriously large, beyond local buffer size */
dctx->stage = ZSTDds_skipFrame;
return 0;
@@ -2151,7 +920,8 @@ size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, c
return 0;
default:
- return ERROR(GENERIC); /* impossible */
+ assert(0); /* impossible */
+ return ERROR(GENERIC); /* some compiler require default to do something */
}
}
@@ -2159,38 +929,52 @@ size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, c
static size_t ZSTD_refDictContent(ZSTD_DCtx* dctx, const void* dict, size_t dictSize)
{
dctx->dictEnd = dctx->previousDstEnd;
- dctx->vBase = (const char*)dict - ((const char*)(dctx->previousDstEnd) - (const char*)(dctx->base));
- dctx->base = dict;
+ dctx->virtualStart = (const char*)dict - ((const char*)(dctx->previousDstEnd) - (const char*)(dctx->prefixStart));
+ dctx->prefixStart = dict;
dctx->previousDstEnd = (const char*)dict + dictSize;
return 0;
}
-/* ZSTD_loadEntropy() :
- * dict : must point at beginning of a valid zstd dictionary
+/*! ZSTD_loadDEntropy() :
+ * dict : must point at beginning of a valid zstd dictionary.
* @return : size of entropy tables read */
-static size_t ZSTD_loadEntropy(ZSTD_entropyDTables_t* entropy, const void* const dict, size_t const dictSize)
+size_t
+ZSTD_loadDEntropy(ZSTD_entropyDTables_t* entropy,
+ const void* const dict, size_t const dictSize)
{
const BYTE* dictPtr = (const BYTE*)dict;
const BYTE* const dictEnd = dictPtr + dictSize;
if (dictSize <= 8) return ERROR(dictionary_corrupted);
+ assert(MEM_readLE32(dict) == ZSTD_MAGIC_DICTIONARY); /* dict must be valid */
dictPtr += 8; /* skip header = magic + dictID */
-
- { size_t const hSize = HUF_readDTableX4_wksp(
- entropy->hufTable, dictPtr, dictEnd - dictPtr,
- entropy->workspace, sizeof(entropy->workspace));
+ ZSTD_STATIC_ASSERT(offsetof(ZSTD_entropyDTables_t, OFTable) == offsetof(ZSTD_entropyDTables_t, LLTable) + sizeof(entropy->LLTable));
+ ZSTD_STATIC_ASSERT(offsetof(ZSTD_entropyDTables_t, MLTable) == offsetof(ZSTD_entropyDTables_t, OFTable) + sizeof(entropy->OFTable));
+ ZSTD_STATIC_ASSERT(sizeof(entropy->LLTable) + sizeof(entropy->OFTable) + sizeof(entropy->MLTable) >= HUF_DECOMPRESS_WORKSPACE_SIZE);
+ { void* const workspace = &entropy->LLTable; /* use fse tables as temporary workspace; implies fse tables are grouped together */
+ size_t const workspaceSize = sizeof(entropy->LLTable) + sizeof(entropy->OFTable) + sizeof(entropy->MLTable);
+#ifdef HUF_FORCE_DECOMPRESS_X1
+ /* in minimal huffman, we always use X1 variants */
+ size_t const hSize = HUF_readDTableX1_wksp(entropy->hufTable,
+ dictPtr, dictEnd - dictPtr,
+ workspace, workspaceSize);
+#else
+ size_t const hSize = HUF_readDTableX2_wksp(entropy->hufTable,
+ dictPtr, dictEnd - dictPtr,
+ workspace, workspaceSize);
+#endif
if (HUF_isError(hSize)) return ERROR(dictionary_corrupted);
dictPtr += hSize;
}
{ short offcodeNCount[MaxOff+1];
- U32 offcodeMaxValue = MaxOff, offcodeLog;
+ unsigned offcodeMaxValue = MaxOff, offcodeLog;
size_t const offcodeHeaderSize = FSE_readNCount(offcodeNCount, &offcodeMaxValue, &offcodeLog, dictPtr, dictEnd-dictPtr);
if (FSE_isError(offcodeHeaderSize)) return ERROR(dictionary_corrupted);
if (offcodeMaxValue > MaxOff) return ERROR(dictionary_corrupted);
if (offcodeLog > OffFSELog) return ERROR(dictionary_corrupted);
- ZSTD_buildFSETable(entropy->OFTable,
+ ZSTD_buildFSETable( entropy->OFTable,
offcodeNCount, offcodeMaxValue,
OF_base, OF_bits,
offcodeLog);
@@ -2203,7 +987,7 @@ static size_t ZSTD_loadEntropy(ZSTD_entropyDTables_t* entropy, const void* const
if (FSE_isError(matchlengthHeaderSize)) return ERROR(dictionary_corrupted);
if (matchlengthMaxValue > MaxML) return ERROR(dictionary_corrupted);
if (matchlengthLog > MLFSELog) return ERROR(dictionary_corrupted);
- ZSTD_buildFSETable(entropy->MLTable,
+ ZSTD_buildFSETable( entropy->MLTable,
matchlengthNCount, matchlengthMaxValue,
ML_base, ML_bits,
matchlengthLog);
@@ -2216,7 +1000,7 @@ static size_t ZSTD_loadEntropy(ZSTD_entropyDTables_t* entropy, const void* const
if (FSE_isError(litlengthHeaderSize)) return ERROR(dictionary_corrupted);
if (litlengthMaxValue > MaxLL) return ERROR(dictionary_corrupted);
if (litlengthLog > LLFSELog) return ERROR(dictionary_corrupted);
- ZSTD_buildFSETable(entropy->LLTable,
+ ZSTD_buildFSETable( entropy->LLTable,
litlengthNCount, litlengthMaxValue,
LL_base, LL_bits,
litlengthLog);
@@ -2242,10 +1026,10 @@ static size_t ZSTD_decompress_insertDictionary(ZSTD_DCtx* dctx, const void* dict
if (magic != ZSTD_MAGIC_DICTIONARY) {
return ZSTD_refDictContent(dctx, dict, dictSize); /* pure content mode */
} }
- dctx->dictID = MEM_readLE32((const char*)dict + ZSTD_frameIdSize);
+ dctx->dictID = MEM_readLE32((const char*)dict + ZSTD_FRAMEIDSIZE);
/* load entropy tables */
- { size_t const eSize = ZSTD_loadEntropy(&dctx->entropy, dict, dictSize);
+ { size_t const eSize = ZSTD_loadDEntropy(&dctx->entropy, dict, dictSize);
if (ZSTD_isError(eSize)) return ERROR(dictionary_corrupted);
dict = (const char*)dict + eSize;
dictSize -= eSize;
@@ -2256,7 +1040,6 @@ static size_t ZSTD_decompress_insertDictionary(ZSTD_DCtx* dctx, const void* dict
return ZSTD_refDictContent(dctx, dict, dictSize);
}
-/* Note : this function cannot fail */
size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx)
{
assert(dctx != NULL);
@@ -2264,8 +1047,8 @@ size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx)
dctx->stage = ZSTDds_getFrameHeaderSize;
dctx->decodedSize = 0;
dctx->previousDstEnd = NULL;
- dctx->base = NULL;
- dctx->vBase = NULL;
+ dctx->prefixStart = NULL;
+ dctx->virtualStart = NULL;
dctx->dictEnd = NULL;
dctx->entropy.hufTable[0] = (HUF_DTable)((HufLog)*0x1000001); /* cover both little and big endian */
dctx->litEntropy = dctx->fseEntropy = 0;
@@ -2290,192 +1073,25 @@ size_t ZSTD_decompressBegin_usingDict(ZSTD_DCtx* dctx, const void* dict, size_t
/* ====== ZSTD_DDict ====== */
-struct ZSTD_DDict_s {
- void* dictBuffer;
- const void* dictContent;
- size_t dictSize;
- ZSTD_entropyDTables_t entropy;
- U32 dictID;
- U32 entropyPresent;
- ZSTD_customMem cMem;
-}; /* typedef'd to ZSTD_DDict within "zstd.h" */
-
-static const void* ZSTD_DDictDictContent(const ZSTD_DDict* ddict)
-{
- return ddict->dictContent;
-}
-
-static size_t ZSTD_DDictDictSize(const ZSTD_DDict* ddict)
-{
- return ddict->dictSize;
-}
-
-size_t ZSTD_decompressBegin_usingDDict(ZSTD_DCtx* dstDCtx, const ZSTD_DDict* ddict)
-{
- CHECK_F( ZSTD_decompressBegin(dstDCtx) );
- if (ddict) { /* support begin on NULL */
- dstDCtx->dictID = ddict->dictID;
- dstDCtx->base = ddict->dictContent;
- dstDCtx->vBase = ddict->dictContent;
- dstDCtx->dictEnd = (const BYTE*)ddict->dictContent + ddict->dictSize;
- dstDCtx->previousDstEnd = dstDCtx->dictEnd;
- if (ddict->entropyPresent) {
- dstDCtx->litEntropy = 1;
- dstDCtx->fseEntropy = 1;
- dstDCtx->LLTptr = ddict->entropy.LLTable;
- dstDCtx->MLTptr = ddict->entropy.MLTable;
- dstDCtx->OFTptr = ddict->entropy.OFTable;
- dstDCtx->HUFptr = ddict->entropy.hufTable;
- dstDCtx->entropy.rep[0] = ddict->entropy.rep[0];
- dstDCtx->entropy.rep[1] = ddict->entropy.rep[1];
- dstDCtx->entropy.rep[2] = ddict->entropy.rep[2];
- } else {
- dstDCtx->litEntropy = 0;
- dstDCtx->fseEntropy = 0;
- }
- }
- return 0;
-}
-
-static size_t ZSTD_loadEntropy_inDDict(ZSTD_DDict* ddict, ZSTD_dictContentType_e dictContentType)
+size_t ZSTD_decompressBegin_usingDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict)
{
- ddict->dictID = 0;
- ddict->entropyPresent = 0;
- if (dictContentType == ZSTD_dct_rawContent) return 0;
-
- if (ddict->dictSize < 8) {
- if (dictContentType == ZSTD_dct_fullDict)
- return ERROR(dictionary_corrupted); /* only accept specified dictionaries */
- return 0; /* pure content mode */
+ DEBUGLOG(4, "ZSTD_decompressBegin_usingDDict");
+ assert(dctx != NULL);
+ if (ddict) {
+ const char* const dictStart = (const char*)ZSTD_DDict_dictContent(ddict);
+ size_t const dictSize = ZSTD_DDict_dictSize(ddict);
+ const void* const dictEnd = dictStart + dictSize;
+ dctx->ddictIsCold = (dctx->dictEnd != dictEnd);
+ DEBUGLOG(4, "DDict is %s",
+ dctx->ddictIsCold ? "~cold~" : "hot!");
}
- { U32 const magic = MEM_readLE32(ddict->dictContent);
- if (magic != ZSTD_MAGIC_DICTIONARY) {
- if (dictContentType == ZSTD_dct_fullDict)
- return ERROR(dictionary_corrupted); /* only accept specified dictionaries */
- return 0; /* pure content mode */
- }
+ CHECK_F( ZSTD_decompressBegin(dctx) );
+ if (ddict) { /* NULL ddict is equivalent to no dictionary */
+ ZSTD_copyDDictParameters(dctx, ddict);
}
- ddict->dictID = MEM_readLE32((const char*)ddict->dictContent + ZSTD_frameIdSize);
-
- /* load entropy tables */
- CHECK_E( ZSTD_loadEntropy(&ddict->entropy, ddict->dictContent, ddict->dictSize), dictionary_corrupted );
- ddict->entropyPresent = 1;
return 0;
}
-
-static size_t ZSTD_initDDict_internal(ZSTD_DDict* ddict,
- const void* dict, size_t dictSize,
- ZSTD_dictLoadMethod_e dictLoadMethod,
- ZSTD_dictContentType_e dictContentType)
-{
- if ((dictLoadMethod == ZSTD_dlm_byRef) || (!dict) || (!dictSize)) {
- ddict->dictBuffer = NULL;
- ddict->dictContent = dict;
- } else {
- void* const internalBuffer = ZSTD_malloc(dictSize, ddict->cMem);
- ddict->dictBuffer = internalBuffer;
- ddict->dictContent = internalBuffer;
- if (!internalBuffer) return ERROR(memory_allocation);
- memcpy(internalBuffer, dict, dictSize);
- }
- ddict->dictSize = dictSize;
- ddict->entropy.hufTable[0] = (HUF_DTable)((HufLog)*0x1000001); /* cover both little and big endian */
-
- /* parse dictionary content */
- CHECK_F( ZSTD_loadEntropy_inDDict(ddict, dictContentType) );
-
- return 0;
-}
-
-ZSTD_DDict* ZSTD_createDDict_advanced(const void* dict, size_t dictSize,
- ZSTD_dictLoadMethod_e dictLoadMethod,
- ZSTD_dictContentType_e dictContentType,
- ZSTD_customMem customMem)
-{
- if (!customMem.customAlloc ^ !customMem.customFree) return NULL;
-
- { ZSTD_DDict* const ddict = (ZSTD_DDict*) ZSTD_malloc(sizeof(ZSTD_DDict), customMem);
- if (!ddict) return NULL;
- ddict->cMem = customMem;
-
- if (ZSTD_isError( ZSTD_initDDict_internal(ddict, dict, dictSize, dictLoadMethod, dictContentType) )) {
- ZSTD_freeDDict(ddict);
- return NULL;
- }
-
- return ddict;
- }
-}
-
-/*! ZSTD_createDDict() :
-* Create a digested dictionary, to start decompression without startup delay.
-* `dict` content is copied inside DDict.
-* Consequently, `dict` can be released after `ZSTD_DDict` creation */
-ZSTD_DDict* ZSTD_createDDict(const void* dict, size_t dictSize)
-{
- ZSTD_customMem const allocator = { NULL, NULL, NULL };
- return ZSTD_createDDict_advanced(dict, dictSize, ZSTD_dlm_byCopy, ZSTD_dct_auto, allocator);
-}
-
-/*! ZSTD_createDDict_byReference() :
- * Create a digested dictionary, to start decompression without startup delay.
- * Dictionary content is simply referenced, it will be accessed during decompression.
- * Warning : dictBuffer must outlive DDict (DDict must be freed before dictBuffer) */
-ZSTD_DDict* ZSTD_createDDict_byReference(const void* dictBuffer, size_t dictSize)
-{
- ZSTD_customMem const allocator = { NULL, NULL, NULL };
- return ZSTD_createDDict_advanced(dictBuffer, dictSize, ZSTD_dlm_byRef, ZSTD_dct_auto, allocator);
-}
-
-
-const ZSTD_DDict* ZSTD_initStaticDDict(
- void* workspace, size_t workspaceSize,
- const void* dict, size_t dictSize,
- ZSTD_dictLoadMethod_e dictLoadMethod,
- ZSTD_dictContentType_e dictContentType)
-{
- size_t const neededSpace =
- sizeof(ZSTD_DDict) + (dictLoadMethod == ZSTD_dlm_byRef ? 0 : dictSize);
- ZSTD_DDict* const ddict = (ZSTD_DDict*)workspace;
- assert(workspace != NULL);
- assert(dict != NULL);
- if ((size_t)workspace & 7) return NULL; /* 8-aligned */
- if (workspaceSize < neededSpace) return NULL;
- if (dictLoadMethod == ZSTD_dlm_byCopy) {
- memcpy(ddict+1, dict, dictSize); /* local copy */
- dict = ddict+1;
- }
- if (ZSTD_isError( ZSTD_initDDict_internal(ddict, dict, dictSize, ZSTD_dlm_byRef, dictContentType) ))
- return NULL;
- return ddict;
-}
-
-
-size_t ZSTD_freeDDict(ZSTD_DDict* ddict)
-{
- if (ddict==NULL) return 0; /* support free on NULL */
- { ZSTD_customMem const cMem = ddict->cMem;
- ZSTD_free(ddict->dictBuffer, cMem);
- ZSTD_free(ddict, cMem);
- return 0;
- }
-}
-
-/*! ZSTD_estimateDDictSize() :
- * Estimate amount of memory that will be needed to create a dictionary for decompression.
- * Note : dictionary created by reference using ZSTD_dlm_byRef are smaller */
-size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod)
-{
- return sizeof(ZSTD_DDict) + (dictLoadMethod == ZSTD_dlm_byRef ? 0 : dictSize);
-}
-
-size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict)
-{
- if (ddict==NULL) return 0; /* support sizeof on NULL */
- return sizeof(*ddict) + (ddict->dictBuffer ? ddict->dictSize : 0) ;
-}
-
/*! ZSTD_getDictID_fromDict() :
* Provides the dictID stored within dictionary.
* if @return == 0, the dictionary is not conformant with Zstandard specification.
@@ -2484,17 +1100,7 @@ unsigned ZSTD_getDictID_fromDict(const void* dict, size_t dictSize)
{
if (dictSize < 8) return 0;
if (MEM_readLE32(dict) != ZSTD_MAGIC_DICTIONARY) return 0;
- return MEM_readLE32((const char*)dict + ZSTD_frameIdSize);
-}
-
-/*! ZSTD_getDictID_fromDDict() :
- * Provides the dictID of the dictionary loaded into `ddict`.
- * If @return == 0, the dictionary is not conformant to Zstandard specification, or empty.
- * Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */
-unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict)
-{
- if (ddict==NULL) return 0;
- return ZSTD_getDictID_fromDict(ddict->dictContent, ddict->dictSize);
+ return MEM_readLE32((const char*)dict + ZSTD_FRAMEIDSIZE);
}
/*! ZSTD_getDictID_fromFrame() :
@@ -2560,12 +1166,15 @@ size_t ZSTD_freeDStream(ZSTD_DStream* zds)
}
-/* *** Initialization *** */
+/* *** Initialization *** */
size_t ZSTD_DStreamInSize(void) { return ZSTD_BLOCKSIZE_MAX + ZSTD_blockHeaderSize; }
size_t ZSTD_DStreamOutSize(void) { return ZSTD_BLOCKSIZE_MAX; }
-size_t ZSTD_DCtx_loadDictionary_advanced(ZSTD_DCtx* dctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType)
+size_t ZSTD_DCtx_loadDictionary_advanced(ZSTD_DCtx* dctx,
+ const void* dict, size_t dictSize,
+ ZSTD_dictLoadMethod_e dictLoadMethod,
+ ZSTD_dictContentType_e dictContentType)
{
if (dctx->streamStage != zdss_init) return ERROR(stage_wrong);
ZSTD_freeDDict(dctx->ddictLocal);
@@ -2601,14 +1210,15 @@ size_t ZSTD_DCtx_refPrefix(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSiz
/* ZSTD_initDStream_usingDict() :
- * return : expected size, aka ZSTD_frameHeaderSize_prefix.
+ * return : expected size, aka ZSTD_FRAMEHEADERSIZE_PREFIX.
* this function cannot fail */
size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize)
{
DEBUGLOG(4, "ZSTD_initDStream_usingDict");
zds->streamStage = zdss_init;
+ zds->noForwardProgress = 0;
CHECK_F( ZSTD_DCtx_loadDictionary(zds, dict, dictSize) );
- return ZSTD_frameHeaderSize_prefix;
+ return ZSTD_FRAMEHEADERSIZE_PREFIX;
}
/* note : this variant can't fail */
@@ -2618,13 +1228,6 @@ size_t ZSTD_initDStream(ZSTD_DStream* zds)
return ZSTD_initDStream_usingDict(zds, NULL, 0);
}
-size_t ZSTD_DCtx_refDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict)
-{
- if (dctx->streamStage != zdss_init) return ERROR(stage_wrong);
- dctx->ddict = ddict;
- return 0;
-}
-
/* ZSTD_initDStream_usingDDict() :
* ddict will just be referenced, and must outlive decompression session
* this function cannot fail */
@@ -2636,7 +1239,7 @@ size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* dctx, const ZSTD_DDict* ddict)
}
/* ZSTD_resetDStream() :
- * return : expected size, aka ZSTD_frameHeaderSize_prefix.
+ * return : expected size, aka ZSTD_FRAMEHEADERSIZE_PREFIX.
* this function cannot fail */
size_t ZSTD_resetDStream(ZSTD_DStream* dctx)
{
@@ -2645,36 +1248,103 @@ size_t ZSTD_resetDStream(ZSTD_DStream* dctx)
dctx->lhSize = dctx->inPos = dctx->outStart = dctx->outEnd = 0;
dctx->legacyVersion = 0;
dctx->hostageByte = 0;
- return ZSTD_frameHeaderSize_prefix;
+ return ZSTD_FRAMEHEADERSIZE_PREFIX;
}
-size_t ZSTD_setDStreamParameter(ZSTD_DStream* dctx,
- ZSTD_DStreamParameter_e paramType, unsigned paramValue)
+
+size_t ZSTD_DCtx_refDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict)
{
if (dctx->streamStage != zdss_init) return ERROR(stage_wrong);
- switch(paramType)
- {
- default : return ERROR(parameter_unsupported);
- case DStream_p_maxWindowSize :
- DEBUGLOG(4, "setting maxWindowSize = %u KB", paramValue >> 10);
- dctx->maxWindowSize = paramValue ? paramValue : (U32)(-1);
- break;
- }
+ dctx->ddict = ddict;
return 0;
}
+/* ZSTD_DCtx_setMaxWindowSize() :
+ * note : no direct equivalence in ZSTD_DCtx_setParameter,
+ * since this version sets windowSize, and the other sets windowLog */
size_t ZSTD_DCtx_setMaxWindowSize(ZSTD_DCtx* dctx, size_t maxWindowSize)
{
+ ZSTD_bounds const bounds = ZSTD_dParam_getBounds(ZSTD_d_windowLogMax);
+ size_t const min = (size_t)1 << bounds.lowerBound;
+ size_t const max = (size_t)1 << bounds.upperBound;
if (dctx->streamStage != zdss_init) return ERROR(stage_wrong);
+ if (maxWindowSize < min) return ERROR(parameter_outOfBound);
+ if (maxWindowSize > max) return ERROR(parameter_outOfBound);
dctx->maxWindowSize = maxWindowSize;
return 0;
}
size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format)
{
- DEBUGLOG(4, "ZSTD_DCtx_setFormat : %u", (unsigned)format);
+ return ZSTD_DCtx_setParameter(dctx, ZSTD_d_format, format);
+}
+
+ZSTD_bounds ZSTD_dParam_getBounds(ZSTD_dParameter dParam)
+{
+ ZSTD_bounds bounds = { 0, 0, 0 };
+ switch(dParam) {
+ case ZSTD_d_windowLogMax:
+ bounds.lowerBound = ZSTD_WINDOWLOG_ABSOLUTEMIN;
+ bounds.upperBound = ZSTD_WINDOWLOG_MAX;
+ return bounds;
+ case ZSTD_d_format:
+ bounds.lowerBound = (int)ZSTD_f_zstd1;
+ bounds.upperBound = (int)ZSTD_f_zstd1_magicless;
+ ZSTD_STATIC_ASSERT(ZSTD_f_zstd1 < ZSTD_f_zstd1_magicless);
+ return bounds;
+ default:;
+ }
+ bounds.error = ERROR(parameter_unsupported);
+ return bounds;
+}
+
+/* ZSTD_dParam_withinBounds:
+ * @return 1 if value is within dParam bounds,
+ * 0 otherwise */
+static int ZSTD_dParam_withinBounds(ZSTD_dParameter dParam, int value)
+{
+ ZSTD_bounds const bounds = ZSTD_dParam_getBounds(dParam);
+ if (ZSTD_isError(bounds.error)) return 0;
+ if (value < bounds.lowerBound) return 0;
+ if (value > bounds.upperBound) return 0;
+ return 1;
+}
+
+#define CHECK_DBOUNDS(p,v) { \
+ if (!ZSTD_dParam_withinBounds(p, v)) \
+ return ERROR(parameter_outOfBound); \
+}
+
+size_t ZSTD_DCtx_setParameter(ZSTD_DCtx* dctx, ZSTD_dParameter dParam, int value)
+{
if (dctx->streamStage != zdss_init) return ERROR(stage_wrong);
- dctx->format = format;
+ switch(dParam) {
+ case ZSTD_d_windowLogMax:
+ CHECK_DBOUNDS(ZSTD_d_windowLogMax, value);
+ dctx->maxWindowSize = ((size_t)1) << value;
+ return 0;
+ case ZSTD_d_format:
+ CHECK_DBOUNDS(ZSTD_d_format, value);
+ dctx->format = (ZSTD_format_e)value;
+ return 0;
+ default:;
+ }
+ return ERROR(parameter_unsupported);
+}
+
+size_t ZSTD_DCtx_reset(ZSTD_DCtx* dctx, ZSTD_ResetDirective reset)
+{
+ if ( (reset == ZSTD_reset_session_only)
+ || (reset == ZSTD_reset_session_and_parameters) ) {
+ (void)ZSTD_initDStream(dctx);
+ }
+ if ( (reset == ZSTD_reset_parameters)
+ || (reset == ZSTD_reset_session_and_parameters) ) {
+ if (dctx->streamStage != zdss_init)
+ return ERROR(stage_wrong);
+ dctx->format = ZSTD_f_zstd1;
+ dctx->maxWindowSize = ZSTD_MAXWINDOWSIZE_DEFAULT;
+ }
return 0;
}
@@ -2704,7 +1374,7 @@ size_t ZSTD_estimateDStreamSize(size_t windowSize)
size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, size_t srcSize)
{
- U32 const windowSizeMax = 1U << ZSTD_WINDOWLOG_MAX; /* note : should be user-selectable */
+ U32 const windowSizeMax = 1U << ZSTD_WINDOWLOG_MAX; /* note : should be user-selectable, but requires an additional parameter (or a dctx) */
ZSTD_frameHeader zfh;
size_t const err = ZSTD_getFrameHeader(&zfh, src, srcSize);
if (ZSTD_isError(err)) return err;
@@ -2767,14 +1437,14 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB
return hint;
} }
#endif
- { size_t const hSize = ZSTD_getFrameHeader_internal(&zds->fParams, zds->headerBuffer, zds->lhSize, zds->format);
+ { size_t const hSize = ZSTD_getFrameHeader_advanced(&zds->fParams, zds->headerBuffer, zds->lhSize, zds->format);
DEBUGLOG(5, "header size : %u", (U32)hSize);
if (ZSTD_isError(hSize)) {
#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1)
U32 const legacyVersion = ZSTD_isLegacy(istart, iend-istart);
if (legacyVersion) {
- const void* const dict = zds->ddict ? zds->ddict->dictContent : NULL;
- size_t const dictSize = zds->ddict ? zds->ddict->dictSize : 0;
+ const void* const dict = zds->ddict ? ZSTD_DDict_dictContent(zds->ddict) : NULL;
+ size_t const dictSize = zds->ddict ? ZSTD_DDict_dictSize(zds->ddict) : 0;
DEBUGLOG(5, "ZSTD_decompressStream: detected legacy version v0.%u", legacyVersion);
/* legacy support is incompatible with static dctx */
if (zds->staticSize) return ERROR(memory_allocation);
@@ -2799,7 +1469,7 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB
zds->lhSize += remainingInput;
}
input->pos = input->size;
- return (MAX(ZSTD_frameHeaderSize_min, hSize) - zds->lhSize) + ZSTD_blockHeaderSize; /* remaining header bytes + next block header */
+ return (MAX(ZSTD_FRAMEHEADERSIZE_MIN, hSize) - zds->lhSize) + ZSTD_blockHeaderSize; /* remaining header bytes + next block header */
}
assert(ip != NULL);
memcpy(zds->headerBuffer + zds->lhSize, ip, toLoad); zds->lhSize = hSize; ip += toLoad;
@@ -2827,8 +1497,8 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB
DEBUGLOG(4, "Consume header");
CHECK_F(ZSTD_decompressBegin_usingDDict(zds, zds->ddict));
- if ((MEM_readLE32(zds->headerBuffer) & 0xFFFFFFF0U) == ZSTD_MAGIC_SKIPPABLE_START) { /* skippable frame */
- zds->expected = MEM_readLE32(zds->headerBuffer + ZSTD_frameIdSize);
+ if ((MEM_readLE32(zds->headerBuffer) & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) { /* skippable frame */
+ zds->expected = MEM_readLE32(zds->headerBuffer + ZSTD_FRAMEIDSIZE);
zds->stage = ZSTDds_skipFrame;
} else {
CHECK_F(ZSTD_decodeFrameHeader(zds, zds->headerBuffer, zds->lhSize));
@@ -2943,12 +1613,24 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB
someMoreWork = 0;
break;
- default: return ERROR(GENERIC); /* impossible */
+ default:
+ assert(0); /* impossible */
+ return ERROR(GENERIC); /* some compiler require default to do something */
} }
/* result */
- input->pos += (size_t)(ip-istart);
- output->pos += (size_t)(op-ostart);
+ input->pos = (size_t)(ip - (const char*)(input->src));
+ output->pos = (size_t)(op - (char*)(output->dst));
+ if ((ip==istart) && (op==ostart)) { /* no forward progress */
+ zds->noForwardProgress ++;
+ if (zds->noForwardProgress >= ZSTD_NO_FORWARD_PROGRESS_MAX) {
+ if (op==oend) return ERROR(dstSize_tooSmall);
+ if (ip==iend) return ERROR(srcSize_wrong);
+ assert(0);
+ }
+ } else {
+ zds->noForwardProgress = 0;
+ }
{ size_t nextSrcSizeHint = ZSTD_nextSrcSizeToDecompress(zds);
if (!nextSrcSizeHint) { /* frame fully decoded */
if (zds->outEnd == zds->outStart) { /* output fully flushed */
@@ -2975,13 +1657,7 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB
}
}
-
-size_t ZSTD_decompress_generic(ZSTD_DCtx* dctx, ZSTD_outBuffer* output, ZSTD_inBuffer* input)
-{
- return ZSTD_decompressStream(dctx, output, input);
-}
-
-size_t ZSTD_decompress_generic_simpleArgs (
+size_t ZSTD_decompressStream_simpleArgs (
ZSTD_DCtx* dctx,
void* dst, size_t dstCapacity, size_t* dstPos,
const void* src, size_t srcSize, size_t* srcPos)
@@ -2989,15 +1665,8 @@ size_t ZSTD_decompress_generic_simpleArgs (
ZSTD_outBuffer output = { dst, dstCapacity, *dstPos };
ZSTD_inBuffer input = { src, srcSize, *srcPos };
/* ZSTD_compress_generic() will check validity of dstPos and srcPos */
- size_t const cErr = ZSTD_decompress_generic(dctx, &output, &input);
+ size_t const cErr = ZSTD_decompressStream(dctx, &output, &input);
*dstPos = output.pos;
*srcPos = input.pos;
return cErr;
}
-
-void ZSTD_DCtx_reset(ZSTD_DCtx* dctx)
-{
- (void)ZSTD_initDStream(dctx);
- dctx->format = ZSTD_f_zstd1;
- dctx->maxWindowSize = ZSTD_MAXWINDOWSIZE_DEFAULT;
-}
diff --git a/thirdparty/zstd/decompress/zstd_decompress_block.c b/thirdparty/zstd/decompress/zstd_decompress_block.c
new file mode 100644
index 0000000000..32baad9fbb
--- /dev/null
+++ b/thirdparty/zstd/decompress/zstd_decompress_block.c
@@ -0,0 +1,1307 @@
+/*
+ * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under both the BSD-style license (found in the
+ * LICENSE file in the root directory of this source tree) and the GPLv2 (found
+ * in the COPYING file in the root directory of this source tree).
+ * You may select, at your option, one of the above-listed licenses.
+ */
+
+/* zstd_decompress_block :
+ * this module takes care of decompressing _compressed_ block */
+
+/*-*******************************************************
+* Dependencies
+*********************************************************/
+#include <string.h> /* memcpy, memmove, memset */
+#include "compiler.h" /* prefetch */
+#include "cpu.h" /* bmi2 */
+#include "mem.h" /* low level memory routines */
+#define FSE_STATIC_LINKING_ONLY
+#include "fse.h"
+#define HUF_STATIC_LINKING_ONLY
+#include "huf.h"
+#include "zstd_internal.h"
+#include "zstd_decompress_internal.h" /* ZSTD_DCtx */
+#include "zstd_ddict.h" /* ZSTD_DDictDictContent */
+#include "zstd_decompress_block.h"
+
+/*_*******************************************************
+* Macros
+**********************************************************/
+
+/* These two optional macros force the use one way or another of the two
+ * ZSTD_decompressSequences implementations. You can't force in both directions
+ * at the same time.
+ */
+#if defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \
+ defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG)
+#error "Cannot force the use of the short and the long ZSTD_decompressSequences variants!"
+#endif
+
+
+/*_*******************************************************
+* Memory operations
+**********************************************************/
+static void ZSTD_copy4(void* dst, const void* src) { memcpy(dst, src, 4); }
+
+
+/*-*************************************************************
+ * Block decoding
+ ***************************************************************/
+
+/*! ZSTD_getcBlockSize() :
+ * Provides the size of compressed block from block header `src` */
+size_t ZSTD_getcBlockSize(const void* src, size_t srcSize,
+ blockProperties_t* bpPtr)
+{
+ if (srcSize < ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
+ { U32 const cBlockHeader = MEM_readLE24(src);
+ U32 const cSize = cBlockHeader >> 3;
+ bpPtr->lastBlock = cBlockHeader & 1;
+ bpPtr->blockType = (blockType_e)((cBlockHeader >> 1) & 3);
+ bpPtr->origSize = cSize; /* only useful for RLE */
+ if (bpPtr->blockType == bt_rle) return 1;
+ if (bpPtr->blockType == bt_reserved) return ERROR(corruption_detected);
+ return cSize;
+ }
+}
+
+
+/* Hidden declaration for fullbench */
+size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx,
+ const void* src, size_t srcSize);
+/*! ZSTD_decodeLiteralsBlock() :
+ * @return : nb of bytes read from src (< srcSize )
+ * note : symbol not declared but exposed for fullbench */
+size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx,
+ const void* src, size_t srcSize) /* note : srcSize < BLOCKSIZE */
+{
+ if (srcSize < MIN_CBLOCK_SIZE) return ERROR(corruption_detected);
+
+ { const BYTE* const istart = (const BYTE*) src;
+ symbolEncodingType_e const litEncType = (symbolEncodingType_e)(istart[0] & 3);
+
+ switch(litEncType)
+ {
+ case set_repeat:
+ if (dctx->litEntropy==0) return ERROR(dictionary_corrupted);
+ /* fall-through */
+
+ case set_compressed:
+ if (srcSize < 5) return ERROR(corruption_detected); /* srcSize >= MIN_CBLOCK_SIZE == 3; here we need up to 5 for case 3 */
+ { size_t lhSize, litSize, litCSize;
+ U32 singleStream=0;
+ U32 const lhlCode = (istart[0] >> 2) & 3;
+ U32 const lhc = MEM_readLE32(istart);
+ size_t hufSuccess;
+ switch(lhlCode)
+ {
+ case 0: case 1: default: /* note : default is impossible, since lhlCode into [0..3] */
+ /* 2 - 2 - 10 - 10 */
+ singleStream = !lhlCode;
+ lhSize = 3;
+ litSize = (lhc >> 4) & 0x3FF;
+ litCSize = (lhc >> 14) & 0x3FF;
+ break;
+ case 2:
+ /* 2 - 2 - 14 - 14 */
+ lhSize = 4;
+ litSize = (lhc >> 4) & 0x3FFF;
+ litCSize = lhc >> 18;
+ break;
+ case 3:
+ /* 2 - 2 - 18 - 18 */
+ lhSize = 5;
+ litSize = (lhc >> 4) & 0x3FFFF;
+ litCSize = (lhc >> 22) + (istart[4] << 10);
+ break;
+ }
+ if (litSize > ZSTD_BLOCKSIZE_MAX) return ERROR(corruption_detected);
+ if (litCSize + lhSize > srcSize) return ERROR(corruption_detected);
+
+ /* prefetch huffman table if cold */
+ if (dctx->ddictIsCold && (litSize > 768 /* heuristic */)) {
+ PREFETCH_AREA(dctx->HUFptr, sizeof(dctx->entropy.hufTable));
+ }
+
+ if (litEncType==set_repeat) {
+ if (singleStream) {
+ hufSuccess = HUF_decompress1X_usingDTable_bmi2(
+ dctx->litBuffer, litSize, istart+lhSize, litCSize,
+ dctx->HUFptr, dctx->bmi2);
+ } else {
+ hufSuccess = HUF_decompress4X_usingDTable_bmi2(
+ dctx->litBuffer, litSize, istart+lhSize, litCSize,
+ dctx->HUFptr, dctx->bmi2);
+ }
+ } else {
+ if (singleStream) {
+#if defined(HUF_FORCE_DECOMPRESS_X2)
+ hufSuccess = HUF_decompress1X_DCtx_wksp(
+ dctx->entropy.hufTable, dctx->litBuffer, litSize,
+ istart+lhSize, litCSize, dctx->workspace,
+ sizeof(dctx->workspace));
+#else
+ hufSuccess = HUF_decompress1X1_DCtx_wksp_bmi2(
+ dctx->entropy.hufTable, dctx->litBuffer, litSize,
+ istart+lhSize, litCSize, dctx->workspace,
+ sizeof(dctx->workspace), dctx->bmi2);
+#endif
+ } else {
+ hufSuccess = HUF_decompress4X_hufOnly_wksp_bmi2(
+ dctx->entropy.hufTable, dctx->litBuffer, litSize,
+ istart+lhSize, litCSize, dctx->workspace,
+ sizeof(dctx->workspace), dctx->bmi2);
+ }
+ }
+
+ if (HUF_isError(hufSuccess)) return ERROR(corruption_detected);
+
+ dctx->litPtr = dctx->litBuffer;
+ dctx->litSize = litSize;
+ dctx->litEntropy = 1;
+ if (litEncType==set_compressed) dctx->HUFptr = dctx->entropy.hufTable;
+ memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
+ return litCSize + lhSize;
+ }
+
+ case set_basic:
+ { size_t litSize, lhSize;
+ U32 const lhlCode = ((istart[0]) >> 2) & 3;
+ switch(lhlCode)
+ {
+ case 0: case 2: default: /* note : default is impossible, since lhlCode into [0..3] */
+ lhSize = 1;
+ litSize = istart[0] >> 3;
+ break;
+ case 1:
+ lhSize = 2;
+ litSize = MEM_readLE16(istart) >> 4;
+ break;
+ case 3:
+ lhSize = 3;
+ litSize = MEM_readLE24(istart) >> 4;
+ break;
+ }
+
+ if (lhSize+litSize+WILDCOPY_OVERLENGTH > srcSize) { /* risk reading beyond src buffer with wildcopy */
+ if (litSize+lhSize > srcSize) return ERROR(corruption_detected);
+ memcpy(dctx->litBuffer, istart+lhSize, litSize);
+ dctx->litPtr = dctx->litBuffer;
+ dctx->litSize = litSize;
+ memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
+ return lhSize+litSize;
+ }
+ /* direct reference into compressed stream */
+ dctx->litPtr = istart+lhSize;
+ dctx->litSize = litSize;
+ return lhSize+litSize;
+ }
+
+ case set_rle:
+ { U32 const lhlCode = ((istart[0]) >> 2) & 3;
+ size_t litSize, lhSize;
+ switch(lhlCode)
+ {
+ case 0: case 2: default: /* note : default is impossible, since lhlCode into [0..3] */
+ lhSize = 1;
+ litSize = istart[0] >> 3;
+ break;
+ case 1:
+ lhSize = 2;
+ litSize = MEM_readLE16(istart) >> 4;
+ break;
+ case 3:
+ lhSize = 3;
+ litSize = MEM_readLE24(istart) >> 4;
+ if (srcSize<4) return ERROR(corruption_detected); /* srcSize >= MIN_CBLOCK_SIZE == 3; here we need lhSize+1 = 4 */
+ break;
+ }
+ if (litSize > ZSTD_BLOCKSIZE_MAX) return ERROR(corruption_detected);
+ memset(dctx->litBuffer, istart[lhSize], litSize + WILDCOPY_OVERLENGTH);
+ dctx->litPtr = dctx->litBuffer;
+ dctx->litSize = litSize;
+ return lhSize+1;
+ }
+ default:
+ return ERROR(corruption_detected); /* impossible */
+ }
+ }
+}
+
+/* Default FSE distribution tables.
+ * These are pre-calculated FSE decoding tables using default distributions as defined in specification :
+ * https://github.com/facebook/zstd/blob/master/doc/zstd_compression_format.md#default-distributions
+ * They were generated programmatically with following method :
+ * - start from default distributions, present in /lib/common/zstd_internal.h
+ * - generate tables normally, using ZSTD_buildFSETable()
+ * - printout the content of tables
+ * - pretify output, report below, test with fuzzer to ensure it's correct */
+
+/* Default FSE distribution table for Literal Lengths */
+static const ZSTD_seqSymbol LL_defaultDTable[(1<<LL_DEFAULTNORMLOG)+1] = {
+ { 1, 1, 1, LL_DEFAULTNORMLOG}, /* header : fastMode, tableLog */
+ /* nextState, nbAddBits, nbBits, baseVal */
+ { 0, 0, 4, 0}, { 16, 0, 4, 0},
+ { 32, 0, 5, 1}, { 0, 0, 5, 3},
+ { 0, 0, 5, 4}, { 0, 0, 5, 6},
+ { 0, 0, 5, 7}, { 0, 0, 5, 9},
+ { 0, 0, 5, 10}, { 0, 0, 5, 12},
+ { 0, 0, 6, 14}, { 0, 1, 5, 16},
+ { 0, 1, 5, 20}, { 0, 1, 5, 22},
+ { 0, 2, 5, 28}, { 0, 3, 5, 32},
+ { 0, 4, 5, 48}, { 32, 6, 5, 64},
+ { 0, 7, 5, 128}, { 0, 8, 6, 256},
+ { 0, 10, 6, 1024}, { 0, 12, 6, 4096},
+ { 32, 0, 4, 0}, { 0, 0, 4, 1},
+ { 0, 0, 5, 2}, { 32, 0, 5, 4},
+ { 0, 0, 5, 5}, { 32, 0, 5, 7},
+ { 0, 0, 5, 8}, { 32, 0, 5, 10},
+ { 0, 0, 5, 11}, { 0, 0, 6, 13},
+ { 32, 1, 5, 16}, { 0, 1, 5, 18},
+ { 32, 1, 5, 22}, { 0, 2, 5, 24},
+ { 32, 3, 5, 32}, { 0, 3, 5, 40},
+ { 0, 6, 4, 64}, { 16, 6, 4, 64},
+ { 32, 7, 5, 128}, { 0, 9, 6, 512},
+ { 0, 11, 6, 2048}, { 48, 0, 4, 0},
+ { 16, 0, 4, 1}, { 32, 0, 5, 2},
+ { 32, 0, 5, 3}, { 32, 0, 5, 5},
+ { 32, 0, 5, 6}, { 32, 0, 5, 8},
+ { 32, 0, 5, 9}, { 32, 0, 5, 11},
+ { 32, 0, 5, 12}, { 0, 0, 6, 15},
+ { 32, 1, 5, 18}, { 32, 1, 5, 20},
+ { 32, 2, 5, 24}, { 32, 2, 5, 28},
+ { 32, 3, 5, 40}, { 32, 4, 5, 48},
+ { 0, 16, 6,65536}, { 0, 15, 6,32768},
+ { 0, 14, 6,16384}, { 0, 13, 6, 8192},
+}; /* LL_defaultDTable */
+
+/* Default FSE distribution table for Offset Codes */
+static const ZSTD_seqSymbol OF_defaultDTable[(1<<OF_DEFAULTNORMLOG)+1] = {
+ { 1, 1, 1, OF_DEFAULTNORMLOG}, /* header : fastMode, tableLog */
+ /* nextState, nbAddBits, nbBits, baseVal */
+ { 0, 0, 5, 0}, { 0, 6, 4, 61},
+ { 0, 9, 5, 509}, { 0, 15, 5,32765},
+ { 0, 21, 5,2097149}, { 0, 3, 5, 5},
+ { 0, 7, 4, 125}, { 0, 12, 5, 4093},
+ { 0, 18, 5,262141}, { 0, 23, 5,8388605},
+ { 0, 5, 5, 29}, { 0, 8, 4, 253},
+ { 0, 14, 5,16381}, { 0, 20, 5,1048573},
+ { 0, 2, 5, 1}, { 16, 7, 4, 125},
+ { 0, 11, 5, 2045}, { 0, 17, 5,131069},
+ { 0, 22, 5,4194301}, { 0, 4, 5, 13},
+ { 16, 8, 4, 253}, { 0, 13, 5, 8189},
+ { 0, 19, 5,524285}, { 0, 1, 5, 1},
+ { 16, 6, 4, 61}, { 0, 10, 5, 1021},
+ { 0, 16, 5,65533}, { 0, 28, 5,268435453},
+ { 0, 27, 5,134217725}, { 0, 26, 5,67108861},
+ { 0, 25, 5,33554429}, { 0, 24, 5,16777213},
+}; /* OF_defaultDTable */
+
+
+/* Default FSE distribution table for Match Lengths */
+static const ZSTD_seqSymbol ML_defaultDTable[(1<<ML_DEFAULTNORMLOG)+1] = {
+ { 1, 1, 1, ML_DEFAULTNORMLOG}, /* header : fastMode, tableLog */
+ /* nextState, nbAddBits, nbBits, baseVal */
+ { 0, 0, 6, 3}, { 0, 0, 4, 4},
+ { 32, 0, 5, 5}, { 0, 0, 5, 6},
+ { 0, 0, 5, 8}, { 0, 0, 5, 9},
+ { 0, 0, 5, 11}, { 0, 0, 6, 13},
+ { 0, 0, 6, 16}, { 0, 0, 6, 19},
+ { 0, 0, 6, 22}, { 0, 0, 6, 25},
+ { 0, 0, 6, 28}, { 0, 0, 6, 31},
+ { 0, 0, 6, 34}, { 0, 1, 6, 37},
+ { 0, 1, 6, 41}, { 0, 2, 6, 47},
+ { 0, 3, 6, 59}, { 0, 4, 6, 83},
+ { 0, 7, 6, 131}, { 0, 9, 6, 515},
+ { 16, 0, 4, 4}, { 0, 0, 4, 5},
+ { 32, 0, 5, 6}, { 0, 0, 5, 7},
+ { 32, 0, 5, 9}, { 0, 0, 5, 10},
+ { 0, 0, 6, 12}, { 0, 0, 6, 15},
+ { 0, 0, 6, 18}, { 0, 0, 6, 21},
+ { 0, 0, 6, 24}, { 0, 0, 6, 27},
+ { 0, 0, 6, 30}, { 0, 0, 6, 33},
+ { 0, 1, 6, 35}, { 0, 1, 6, 39},
+ { 0, 2, 6, 43}, { 0, 3, 6, 51},
+ { 0, 4, 6, 67}, { 0, 5, 6, 99},
+ { 0, 8, 6, 259}, { 32, 0, 4, 4},
+ { 48, 0, 4, 4}, { 16, 0, 4, 5},
+ { 32, 0, 5, 7}, { 32, 0, 5, 8},
+ { 32, 0, 5, 10}, { 32, 0, 5, 11},
+ { 0, 0, 6, 14}, { 0, 0, 6, 17},
+ { 0, 0, 6, 20}, { 0, 0, 6, 23},
+ { 0, 0, 6, 26}, { 0, 0, 6, 29},
+ { 0, 0, 6, 32}, { 0, 16, 6,65539},
+ { 0, 15, 6,32771}, { 0, 14, 6,16387},
+ { 0, 13, 6, 8195}, { 0, 12, 6, 4099},
+ { 0, 11, 6, 2051}, { 0, 10, 6, 1027},
+}; /* ML_defaultDTable */
+
+
+static void ZSTD_buildSeqTable_rle(ZSTD_seqSymbol* dt, U32 baseValue, U32 nbAddBits)
+{
+ void* ptr = dt;
+ ZSTD_seqSymbol_header* const DTableH = (ZSTD_seqSymbol_header*)ptr;
+ ZSTD_seqSymbol* const cell = dt + 1;
+
+ DTableH->tableLog = 0;
+ DTableH->fastMode = 0;
+
+ cell->nbBits = 0;
+ cell->nextState = 0;
+ assert(nbAddBits < 255);
+ cell->nbAdditionalBits = (BYTE)nbAddBits;
+ cell->baseValue = baseValue;
+}
+
+
+/* ZSTD_buildFSETable() :
+ * generate FSE decoding table for one symbol (ll, ml or off)
+ * cannot fail if input is valid =>
+ * all inputs are presumed validated at this stage */
+void
+ZSTD_buildFSETable(ZSTD_seqSymbol* dt,
+ const short* normalizedCounter, unsigned maxSymbolValue,
+ const U32* baseValue, const U32* nbAdditionalBits,
+ unsigned tableLog)
+{
+ ZSTD_seqSymbol* const tableDecode = dt+1;
+ U16 symbolNext[MaxSeq+1];
+
+ U32 const maxSV1 = maxSymbolValue + 1;
+ U32 const tableSize = 1 << tableLog;
+ U32 highThreshold = tableSize-1;
+
+ /* Sanity Checks */
+ assert(maxSymbolValue <= MaxSeq);
+ assert(tableLog <= MaxFSELog);
+
+ /* Init, lay down lowprob symbols */
+ { ZSTD_seqSymbol_header DTableH;
+ DTableH.tableLog = tableLog;
+ DTableH.fastMode = 1;
+ { S16 const largeLimit= (S16)(1 << (tableLog-1));
+ U32 s;
+ for (s=0; s<maxSV1; s++) {
+ if (normalizedCounter[s]==-1) {
+ tableDecode[highThreshold--].baseValue = s;
+ symbolNext[s] = 1;
+ } else {
+ if (normalizedCounter[s] >= largeLimit) DTableH.fastMode=0;
+ symbolNext[s] = normalizedCounter[s];
+ } } }
+ memcpy(dt, &DTableH, sizeof(DTableH));
+ }
+
+ /* Spread symbols */
+ { U32 const tableMask = tableSize-1;
+ U32 const step = FSE_TABLESTEP(tableSize);
+ U32 s, position = 0;
+ for (s=0; s<maxSV1; s++) {
+ int i;
+ for (i=0; i<normalizedCounter[s]; i++) {
+ tableDecode[position].baseValue = s;
+ position = (position + step) & tableMask;
+ while (position > highThreshold) position = (position + step) & tableMask; /* lowprob area */
+ } }
+ assert(position == 0); /* position must reach all cells once, otherwise normalizedCounter is incorrect */
+ }
+
+ /* Build Decoding table */
+ { U32 u;
+ for (u=0; u<tableSize; u++) {
+ U32 const symbol = tableDecode[u].baseValue;
+ U32 const nextState = symbolNext[symbol]++;
+ tableDecode[u].nbBits = (BYTE) (tableLog - BIT_highbit32(nextState) );
+ tableDecode[u].nextState = (U16) ( (nextState << tableDecode[u].nbBits) - tableSize);
+ assert(nbAdditionalBits[symbol] < 255);
+ tableDecode[u].nbAdditionalBits = (BYTE)nbAdditionalBits[symbol];
+ tableDecode[u].baseValue = baseValue[symbol];
+ } }
+}
+
+
+/*! ZSTD_buildSeqTable() :
+ * @return : nb bytes read from src,
+ * or an error code if it fails */
+static size_t ZSTD_buildSeqTable(ZSTD_seqSymbol* DTableSpace, const ZSTD_seqSymbol** DTablePtr,
+ symbolEncodingType_e type, unsigned max, U32 maxLog,
+ const void* src, size_t srcSize,
+ const U32* baseValue, const U32* nbAdditionalBits,
+ const ZSTD_seqSymbol* defaultTable, U32 flagRepeatTable,
+ int ddictIsCold, int nbSeq)
+{
+ switch(type)
+ {
+ case set_rle :
+ if (!srcSize) return ERROR(srcSize_wrong);
+ if ( (*(const BYTE*)src) > max) return ERROR(corruption_detected);
+ { U32 const symbol = *(const BYTE*)src;
+ U32 const baseline = baseValue[symbol];
+ U32 const nbBits = nbAdditionalBits[symbol];
+ ZSTD_buildSeqTable_rle(DTableSpace, baseline, nbBits);
+ }
+ *DTablePtr = DTableSpace;
+ return 1;
+ case set_basic :
+ *DTablePtr = defaultTable;
+ return 0;
+ case set_repeat:
+ if (!flagRepeatTable) return ERROR(corruption_detected);
+ /* prefetch FSE table if used */
+ if (ddictIsCold && (nbSeq > 24 /* heuristic */)) {
+ const void* const pStart = *DTablePtr;
+ size_t const pSize = sizeof(ZSTD_seqSymbol) * (SEQSYMBOL_TABLE_SIZE(maxLog));
+ PREFETCH_AREA(pStart, pSize);
+ }
+ return 0;
+ case set_compressed :
+ { unsigned tableLog;
+ S16 norm[MaxSeq+1];
+ size_t const headerSize = FSE_readNCount(norm, &max, &tableLog, src, srcSize);
+ if (FSE_isError(headerSize)) return ERROR(corruption_detected);
+ if (tableLog > maxLog) return ERROR(corruption_detected);
+ ZSTD_buildFSETable(DTableSpace, norm, max, baseValue, nbAdditionalBits, tableLog);
+ *DTablePtr = DTableSpace;
+ return headerSize;
+ }
+ default : /* impossible */
+ assert(0);
+ return ERROR(GENERIC);
+ }
+}
+
+size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr,
+ const void* src, size_t srcSize)
+{
+ const BYTE* const istart = (const BYTE* const)src;
+ const BYTE* const iend = istart + srcSize;
+ const BYTE* ip = istart;
+ int nbSeq;
+ DEBUGLOG(5, "ZSTD_decodeSeqHeaders");
+
+ /* check */
+ if (srcSize < MIN_SEQUENCES_SIZE) return ERROR(srcSize_wrong);
+
+ /* SeqHead */
+ nbSeq = *ip++;
+ if (!nbSeq) {
+ *nbSeqPtr=0;
+ if (srcSize != 1) return ERROR(srcSize_wrong);
+ return 1;
+ }
+ if (nbSeq > 0x7F) {
+ if (nbSeq == 0xFF) {
+ if (ip+2 > iend) return ERROR(srcSize_wrong);
+ nbSeq = MEM_readLE16(ip) + LONGNBSEQ, ip+=2;
+ } else {
+ if (ip >= iend) return ERROR(srcSize_wrong);
+ nbSeq = ((nbSeq-0x80)<<8) + *ip++;
+ }
+ }
+ *nbSeqPtr = nbSeq;
+
+ /* FSE table descriptors */
+ if (ip+4 > iend) return ERROR(srcSize_wrong); /* minimum possible size */
+ { symbolEncodingType_e const LLtype = (symbolEncodingType_e)(*ip >> 6);
+ symbolEncodingType_e const OFtype = (symbolEncodingType_e)((*ip >> 4) & 3);
+ symbolEncodingType_e const MLtype = (symbolEncodingType_e)((*ip >> 2) & 3);
+ ip++;
+
+ /* Build DTables */
+ { size_t const llhSize = ZSTD_buildSeqTable(dctx->entropy.LLTable, &dctx->LLTptr,
+ LLtype, MaxLL, LLFSELog,
+ ip, iend-ip,
+ LL_base, LL_bits,
+ LL_defaultDTable, dctx->fseEntropy,
+ dctx->ddictIsCold, nbSeq);
+ if (ZSTD_isError(llhSize)) return ERROR(corruption_detected);
+ ip += llhSize;
+ }
+
+ { size_t const ofhSize = ZSTD_buildSeqTable(dctx->entropy.OFTable, &dctx->OFTptr,
+ OFtype, MaxOff, OffFSELog,
+ ip, iend-ip,
+ OF_base, OF_bits,
+ OF_defaultDTable, dctx->fseEntropy,
+ dctx->ddictIsCold, nbSeq);
+ if (ZSTD_isError(ofhSize)) return ERROR(corruption_detected);
+ ip += ofhSize;
+ }
+
+ { size_t const mlhSize = ZSTD_buildSeqTable(dctx->entropy.MLTable, &dctx->MLTptr,
+ MLtype, MaxML, MLFSELog,
+ ip, iend-ip,
+ ML_base, ML_bits,
+ ML_defaultDTable, dctx->fseEntropy,
+ dctx->ddictIsCold, nbSeq);
+ if (ZSTD_isError(mlhSize)) return ERROR(corruption_detected);
+ ip += mlhSize;
+ }
+ }
+
+ return ip-istart;
+}
+
+
+typedef struct {
+ size_t litLength;
+ size_t matchLength;
+ size_t offset;
+ const BYTE* match;
+} seq_t;
+
+typedef struct {
+ size_t state;
+ const ZSTD_seqSymbol* table;
+} ZSTD_fseState;
+
+typedef struct {
+ BIT_DStream_t DStream;
+ ZSTD_fseState stateLL;
+ ZSTD_fseState stateOffb;
+ ZSTD_fseState stateML;
+ size_t prevOffset[ZSTD_REP_NUM];
+ const BYTE* prefixStart;
+ const BYTE* dictEnd;
+ size_t pos;
+} seqState_t;
+
+
+/* ZSTD_execSequenceLast7():
+ * exceptional case : decompress a match starting within last 7 bytes of output buffer.
+ * requires more careful checks, to ensure there is no overflow.
+ * performance does not matter though.
+ * note : this case is supposed to be never generated "naturally" by reference encoder,
+ * since in most cases it needs at least 8 bytes to look for a match.
+ * but it's allowed by the specification. */
+FORCE_NOINLINE
+size_t ZSTD_execSequenceLast7(BYTE* op,
+ BYTE* const oend, seq_t sequence,
+ const BYTE** litPtr, const BYTE* const litLimit,
+ const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd)
+{
+ BYTE* const oLitEnd = op + sequence.litLength;
+ size_t const sequenceLength = sequence.litLength + sequence.matchLength;
+ BYTE* const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */
+ const BYTE* const iLitEnd = *litPtr + sequence.litLength;
+ const BYTE* match = oLitEnd - sequence.offset;
+
+ /* check */
+ if (oMatchEnd>oend) return ERROR(dstSize_tooSmall); /* last match must fit within dstBuffer */
+ if (iLitEnd > litLimit) return ERROR(corruption_detected); /* try to read beyond literal buffer */
+
+ /* copy literals */
+ while (op < oLitEnd) *op++ = *(*litPtr)++;
+
+ /* copy Match */
+ if (sequence.offset > (size_t)(oLitEnd - base)) {
+ /* offset beyond prefix */
+ if (sequence.offset > (size_t)(oLitEnd - vBase)) return ERROR(corruption_detected);
+ match = dictEnd - (base-match);
+ if (match + sequence.matchLength <= dictEnd) {
+ memmove(oLitEnd, match, sequence.matchLength);
+ return sequenceLength;
+ }
+ /* span extDict & currentPrefixSegment */
+ { size_t const length1 = dictEnd - match;
+ memmove(oLitEnd, match, length1);
+ op = oLitEnd + length1;
+ sequence.matchLength -= length1;
+ match = base;
+ } }
+ while (op < oMatchEnd) *op++ = *match++;
+ return sequenceLength;
+}
+
+
+HINT_INLINE
+size_t ZSTD_execSequence(BYTE* op,
+ BYTE* const oend, seq_t sequence,
+ const BYTE** litPtr, const BYTE* const litLimit,
+ const BYTE* const prefixStart, const BYTE* const virtualStart, const BYTE* const dictEnd)
+{
+ BYTE* const oLitEnd = op + sequence.litLength;
+ size_t const sequenceLength = sequence.litLength + sequence.matchLength;
+ BYTE* const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */
+ BYTE* const oend_w = oend - WILDCOPY_OVERLENGTH;
+ const BYTE* const iLitEnd = *litPtr + sequence.litLength;
+ const BYTE* match = oLitEnd - sequence.offset;
+
+ /* check */
+ if (oMatchEnd>oend) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
+ if (iLitEnd > litLimit) return ERROR(corruption_detected); /* over-read beyond lit buffer */
+ if (oLitEnd>oend_w) return ZSTD_execSequenceLast7(op, oend, sequence, litPtr, litLimit, prefixStart, virtualStart, dictEnd);
+
+ /* copy Literals */
+ ZSTD_copy8(op, *litPtr);
+ if (sequence.litLength > 8)
+ ZSTD_wildcopy(op+8, (*litPtr)+8, sequence.litLength - 8); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */
+ op = oLitEnd;
+ *litPtr = iLitEnd; /* update for next sequence */
+
+ /* copy Match */
+ if (sequence.offset > (size_t)(oLitEnd - prefixStart)) {
+ /* offset beyond prefix -> go into extDict */
+ if (sequence.offset > (size_t)(oLitEnd - virtualStart))
+ return ERROR(corruption_detected);
+ match = dictEnd + (match - prefixStart);
+ if (match + sequence.matchLength <= dictEnd) {
+ memmove(oLitEnd, match, sequence.matchLength);
+ return sequenceLength;
+ }
+ /* span extDict & currentPrefixSegment */
+ { size_t const length1 = dictEnd - match;
+ memmove(oLitEnd, match, length1);
+ op = oLitEnd + length1;
+ sequence.matchLength -= length1;
+ match = prefixStart;
+ if (op > oend_w || sequence.matchLength < MINMATCH) {
+ U32 i;
+ for (i = 0; i < sequence.matchLength; ++i) op[i] = match[i];
+ return sequenceLength;
+ }
+ } }
+ /* Requirement: op <= oend_w && sequence.matchLength >= MINMATCH */
+
+ /* match within prefix */
+ if (sequence.offset < 8) {
+ /* close range match, overlap */
+ static const U32 dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 }; /* added */
+ static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /* subtracted */
+ int const sub2 = dec64table[sequence.offset];
+ op[0] = match[0];
+ op[1] = match[1];
+ op[2] = match[2];
+ op[3] = match[3];
+ match += dec32table[sequence.offset];
+ ZSTD_copy4(op+4, match);
+ match -= sub2;
+ } else {
+ ZSTD_copy8(op, match);
+ }
+ op += 8; match += 8;
+
+ if (oMatchEnd > oend-(16-MINMATCH)) {
+ if (op < oend_w) {
+ ZSTD_wildcopy(op, match, oend_w - op);
+ match += oend_w - op;
+ op = oend_w;
+ }
+ while (op < oMatchEnd) *op++ = *match++;
+ } else {
+ ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
+ }
+ return sequenceLength;
+}
+
+
+HINT_INLINE
+size_t ZSTD_execSequenceLong(BYTE* op,
+ BYTE* const oend, seq_t sequence,
+ const BYTE** litPtr, const BYTE* const litLimit,
+ const BYTE* const prefixStart, const BYTE* const dictStart, const BYTE* const dictEnd)
+{
+ BYTE* const oLitEnd = op + sequence.litLength;
+ size_t const sequenceLength = sequence.litLength + sequence.matchLength;
+ BYTE* const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */
+ BYTE* const oend_w = oend - WILDCOPY_OVERLENGTH;
+ const BYTE* const iLitEnd = *litPtr + sequence.litLength;
+ const BYTE* match = sequence.match;
+
+ /* check */
+ if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
+ if (iLitEnd > litLimit) return ERROR(corruption_detected); /* over-read beyond lit buffer */
+ if (oLitEnd > oend_w) return ZSTD_execSequenceLast7(op, oend, sequence, litPtr, litLimit, prefixStart, dictStart, dictEnd);
+
+ /* copy Literals */
+ ZSTD_copy8(op, *litPtr); /* note : op <= oLitEnd <= oend_w == oend - 8 */
+ if (sequence.litLength > 8)
+ ZSTD_wildcopy(op+8, (*litPtr)+8, sequence.litLength - 8); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */
+ op = oLitEnd;
+ *litPtr = iLitEnd; /* update for next sequence */
+
+ /* copy Match */
+ if (sequence.offset > (size_t)(oLitEnd - prefixStart)) {
+ /* offset beyond prefix */
+ if (sequence.offset > (size_t)(oLitEnd - dictStart)) return ERROR(corruption_detected);
+ if (match + sequence.matchLength <= dictEnd) {
+ memmove(oLitEnd, match, sequence.matchLength);
+ return sequenceLength;
+ }
+ /* span extDict & currentPrefixSegment */
+ { size_t const length1 = dictEnd - match;
+ memmove(oLitEnd, match, length1);
+ op = oLitEnd + length1;
+ sequence.matchLength -= length1;
+ match = prefixStart;
+ if (op > oend_w || sequence.matchLength < MINMATCH) {
+ U32 i;
+ for (i = 0; i < sequence.matchLength; ++i) op[i] = match[i];
+ return sequenceLength;
+ }
+ } }
+ assert(op <= oend_w);
+ assert(sequence.matchLength >= MINMATCH);
+
+ /* match within prefix */
+ if (sequence.offset < 8) {
+ /* close range match, overlap */
+ static const U32 dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 }; /* added */
+ static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /* subtracted */
+ int const sub2 = dec64table[sequence.offset];
+ op[0] = match[0];
+ op[1] = match[1];
+ op[2] = match[2];
+ op[3] = match[3];
+ match += dec32table[sequence.offset];
+ ZSTD_copy4(op+4, match);
+ match -= sub2;
+ } else {
+ ZSTD_copy8(op, match);
+ }
+ op += 8; match += 8;
+
+ if (oMatchEnd > oend-(16-MINMATCH)) {
+ if (op < oend_w) {
+ ZSTD_wildcopy(op, match, oend_w - op);
+ match += oend_w - op;
+ op = oend_w;
+ }
+ while (op < oMatchEnd) *op++ = *match++;
+ } else {
+ ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
+ }
+ return sequenceLength;
+}
+
+static void
+ZSTD_initFseState(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD, const ZSTD_seqSymbol* dt)
+{
+ const void* ptr = dt;
+ const ZSTD_seqSymbol_header* const DTableH = (const ZSTD_seqSymbol_header*)ptr;
+ DStatePtr->state = BIT_readBits(bitD, DTableH->tableLog);
+ DEBUGLOG(6, "ZSTD_initFseState : val=%u using %u bits",
+ (U32)DStatePtr->state, DTableH->tableLog);
+ BIT_reloadDStream(bitD);
+ DStatePtr->table = dt + 1;
+}
+
+FORCE_INLINE_TEMPLATE void
+ZSTD_updateFseState(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD)
+{
+ ZSTD_seqSymbol const DInfo = DStatePtr->table[DStatePtr->state];
+ U32 const nbBits = DInfo.nbBits;
+ size_t const lowBits = BIT_readBits(bitD, nbBits);
+ DStatePtr->state = DInfo.nextState + lowBits;
+}
+
+/* We need to add at most (ZSTD_WINDOWLOG_MAX_32 - 1) bits to read the maximum
+ * offset bits. But we can only read at most (STREAM_ACCUMULATOR_MIN_32 - 1)
+ * bits before reloading. This value is the maximum number of bytes we read
+ * after reloading when we are decoding long offets.
+ */
+#define LONG_OFFSETS_MAX_EXTRA_BITS_32 \
+ (ZSTD_WINDOWLOG_MAX_32 > STREAM_ACCUMULATOR_MIN_32 \
+ ? ZSTD_WINDOWLOG_MAX_32 - STREAM_ACCUMULATOR_MIN_32 \
+ : 0)
+
+typedef enum { ZSTD_lo_isRegularOffset, ZSTD_lo_isLongOffset=1 } ZSTD_longOffset_e;
+
+#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG
+FORCE_INLINE_TEMPLATE seq_t
+ZSTD_decodeSequence(seqState_t* seqState, const ZSTD_longOffset_e longOffsets)
+{
+ seq_t seq;
+ U32 const llBits = seqState->stateLL.table[seqState->stateLL.state].nbAdditionalBits;
+ U32 const mlBits = seqState->stateML.table[seqState->stateML.state].nbAdditionalBits;
+ U32 const ofBits = seqState->stateOffb.table[seqState->stateOffb.state].nbAdditionalBits;
+ U32 const totalBits = llBits+mlBits+ofBits;
+ U32 const llBase = seqState->stateLL.table[seqState->stateLL.state].baseValue;
+ U32 const mlBase = seqState->stateML.table[seqState->stateML.state].baseValue;
+ U32 const ofBase = seqState->stateOffb.table[seqState->stateOffb.state].baseValue;
+
+ /* sequence */
+ { size_t offset;
+ if (!ofBits)
+ offset = 0;
+ else {
+ ZSTD_STATIC_ASSERT(ZSTD_lo_isLongOffset == 1);
+ ZSTD_STATIC_ASSERT(LONG_OFFSETS_MAX_EXTRA_BITS_32 == 5);
+ assert(ofBits <= MaxOff);
+ if (MEM_32bits() && longOffsets && (ofBits >= STREAM_ACCUMULATOR_MIN_32)) {
+ U32 const extraBits = ofBits - MIN(ofBits, 32 - seqState->DStream.bitsConsumed);
+ offset = ofBase + (BIT_readBitsFast(&seqState->DStream, ofBits - extraBits) << extraBits);
+ BIT_reloadDStream(&seqState->DStream);
+ if (extraBits) offset += BIT_readBitsFast(&seqState->DStream, extraBits);
+ assert(extraBits <= LONG_OFFSETS_MAX_EXTRA_BITS_32); /* to avoid another reload */
+ } else {
+ offset = ofBase + BIT_readBitsFast(&seqState->DStream, ofBits/*>0*/); /* <= (ZSTD_WINDOWLOG_MAX-1) bits */
+ if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream);
+ }
+ }
+
+ if (ofBits <= 1) {
+ offset += (llBase==0);
+ if (offset) {
+ size_t temp = (offset==3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset];
+ temp += !temp; /* 0 is not valid; input is corrupted; force offset to 1 */
+ if (offset != 1) seqState->prevOffset[2] = seqState->prevOffset[1];
+ seqState->prevOffset[1] = seqState->prevOffset[0];
+ seqState->prevOffset[0] = offset = temp;
+ } else { /* offset == 0 */
+ offset = seqState->prevOffset[0];
+ }
+ } else {
+ seqState->prevOffset[2] = seqState->prevOffset[1];
+ seqState->prevOffset[1] = seqState->prevOffset[0];
+ seqState->prevOffset[0] = offset;
+ }
+ seq.offset = offset;
+ }
+
+ seq.matchLength = mlBase
+ + ((mlBits>0) ? BIT_readBitsFast(&seqState->DStream, mlBits/*>0*/) : 0); /* <= 16 bits */
+ if (MEM_32bits() && (mlBits+llBits >= STREAM_ACCUMULATOR_MIN_32-LONG_OFFSETS_MAX_EXTRA_BITS_32))
+ BIT_reloadDStream(&seqState->DStream);
+ if (MEM_64bits() && (totalBits >= STREAM_ACCUMULATOR_MIN_64-(LLFSELog+MLFSELog+OffFSELog)))
+ BIT_reloadDStream(&seqState->DStream);
+ /* Ensure there are enough bits to read the rest of data in 64-bit mode. */
+ ZSTD_STATIC_ASSERT(16+LLFSELog+MLFSELog+OffFSELog < STREAM_ACCUMULATOR_MIN_64);
+
+ seq.litLength = llBase
+ + ((llBits>0) ? BIT_readBitsFast(&seqState->DStream, llBits/*>0*/) : 0); /* <= 16 bits */
+ if (MEM_32bits())
+ BIT_reloadDStream(&seqState->DStream);
+
+ DEBUGLOG(6, "seq: litL=%u, matchL=%u, offset=%u",
+ (U32)seq.litLength, (U32)seq.matchLength, (U32)seq.offset);
+
+ /* ANS state update */
+ ZSTD_updateFseState(&seqState->stateLL, &seqState->DStream); /* <= 9 bits */
+ ZSTD_updateFseState(&seqState->stateML, &seqState->DStream); /* <= 9 bits */
+ if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream); /* <= 18 bits */
+ ZSTD_updateFseState(&seqState->stateOffb, &seqState->DStream); /* <= 8 bits */
+
+ return seq;
+}
+
+FORCE_INLINE_TEMPLATE size_t
+ZSTD_decompressSequences_body( ZSTD_DCtx* dctx,
+ void* dst, size_t maxDstSize,
+ const void* seqStart, size_t seqSize, int nbSeq,
+ const ZSTD_longOffset_e isLongOffset)
+{
+ const BYTE* ip = (const BYTE*)seqStart;
+ const BYTE* const iend = ip + seqSize;
+ BYTE* const ostart = (BYTE* const)dst;
+ BYTE* const oend = ostart + maxDstSize;
+ BYTE* op = ostart;
+ const BYTE* litPtr = dctx->litPtr;
+ const BYTE* const litEnd = litPtr + dctx->litSize;
+ const BYTE* const prefixStart = (const BYTE*) (dctx->prefixStart);
+ const BYTE* const vBase = (const BYTE*) (dctx->virtualStart);
+ const BYTE* const dictEnd = (const BYTE*) (dctx->dictEnd);
+ DEBUGLOG(5, "ZSTD_decompressSequences_body");
+
+ /* Regen sequences */
+ if (nbSeq) {
+ seqState_t seqState;
+ dctx->fseEntropy = 1;
+ { U32 i; for (i=0; i<ZSTD_REP_NUM; i++) seqState.prevOffset[i] = dctx->entropy.rep[i]; }
+ CHECK_E(BIT_initDStream(&seqState.DStream, ip, iend-ip), corruption_detected);
+ ZSTD_initFseState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr);
+ ZSTD_initFseState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr);
+ ZSTD_initFseState(&seqState.stateML, &seqState.DStream, dctx->MLTptr);
+
+ for ( ; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && nbSeq ; ) {
+ nbSeq--;
+ { seq_t const sequence = ZSTD_decodeSequence(&seqState, isLongOffset);
+ size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litEnd, prefixStart, vBase, dictEnd);
+ DEBUGLOG(6, "regenerated sequence size : %u", (U32)oneSeqSize);
+ if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
+ op += oneSeqSize;
+ } }
+
+ /* check if reached exact end */
+ DEBUGLOG(5, "ZSTD_decompressSequences_body: after decode loop, remaining nbSeq : %i", nbSeq);
+ if (nbSeq) return ERROR(corruption_detected);
+ /* save reps for next block */
+ { U32 i; for (i=0; i<ZSTD_REP_NUM; i++) dctx->entropy.rep[i] = (U32)(seqState.prevOffset[i]); }
+ }
+
+ /* last literal segment */
+ { size_t const lastLLSize = litEnd - litPtr;
+ if (lastLLSize > (size_t)(oend-op)) return ERROR(dstSize_tooSmall);
+ memcpy(op, litPtr, lastLLSize);
+ op += lastLLSize;
+ }
+
+ return op-ostart;
+}
+
+static size_t
+ZSTD_decompressSequences_default(ZSTD_DCtx* dctx,
+ void* dst, size_t maxDstSize,
+ const void* seqStart, size_t seqSize, int nbSeq,
+ const ZSTD_longOffset_e isLongOffset)
+{
+ return ZSTD_decompressSequences_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
+}
+#endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG */
+
+
+
+#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT
+FORCE_INLINE_TEMPLATE seq_t
+ZSTD_decodeSequenceLong(seqState_t* seqState, ZSTD_longOffset_e const longOffsets)
+{
+ seq_t seq;
+ U32 const llBits = seqState->stateLL.table[seqState->stateLL.state].nbAdditionalBits;
+ U32 const mlBits = seqState->stateML.table[seqState->stateML.state].nbAdditionalBits;
+ U32 const ofBits = seqState->stateOffb.table[seqState->stateOffb.state].nbAdditionalBits;
+ U32 const totalBits = llBits+mlBits+ofBits;
+ U32 const llBase = seqState->stateLL.table[seqState->stateLL.state].baseValue;
+ U32 const mlBase = seqState->stateML.table[seqState->stateML.state].baseValue;
+ U32 const ofBase = seqState->stateOffb.table[seqState->stateOffb.state].baseValue;
+
+ /* sequence */
+ { size_t offset;
+ if (!ofBits)
+ offset = 0;
+ else {
+ ZSTD_STATIC_ASSERT(ZSTD_lo_isLongOffset == 1);
+ ZSTD_STATIC_ASSERT(LONG_OFFSETS_MAX_EXTRA_BITS_32 == 5);
+ assert(ofBits <= MaxOff);
+ if (MEM_32bits() && longOffsets) {
+ U32 const extraBits = ofBits - MIN(ofBits, STREAM_ACCUMULATOR_MIN_32-1);
+ offset = ofBase + (BIT_readBitsFast(&seqState->DStream, ofBits - extraBits) << extraBits);
+ if (MEM_32bits() || extraBits) BIT_reloadDStream(&seqState->DStream);
+ if (extraBits) offset += BIT_readBitsFast(&seqState->DStream, extraBits);
+ } else {
+ offset = ofBase + BIT_readBitsFast(&seqState->DStream, ofBits); /* <= (ZSTD_WINDOWLOG_MAX-1) bits */
+ if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream);
+ }
+ }
+
+ if (ofBits <= 1) {
+ offset += (llBase==0);
+ if (offset) {
+ size_t temp = (offset==3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset];
+ temp += !temp; /* 0 is not valid; input is corrupted; force offset to 1 */
+ if (offset != 1) seqState->prevOffset[2] = seqState->prevOffset[1];
+ seqState->prevOffset[1] = seqState->prevOffset[0];
+ seqState->prevOffset[0] = offset = temp;
+ } else {
+ offset = seqState->prevOffset[0];
+ }
+ } else {
+ seqState->prevOffset[2] = seqState->prevOffset[1];
+ seqState->prevOffset[1] = seqState->prevOffset[0];
+ seqState->prevOffset[0] = offset;
+ }
+ seq.offset = offset;
+ }
+
+ seq.matchLength = mlBase + ((mlBits>0) ? BIT_readBitsFast(&seqState->DStream, mlBits) : 0); /* <= 16 bits */
+ if (MEM_32bits() && (mlBits+llBits >= STREAM_ACCUMULATOR_MIN_32-LONG_OFFSETS_MAX_EXTRA_BITS_32))
+ BIT_reloadDStream(&seqState->DStream);
+ if (MEM_64bits() && (totalBits >= STREAM_ACCUMULATOR_MIN_64-(LLFSELog+MLFSELog+OffFSELog)))
+ BIT_reloadDStream(&seqState->DStream);
+ /* Verify that there is enough bits to read the rest of the data in 64-bit mode. */
+ ZSTD_STATIC_ASSERT(16+LLFSELog+MLFSELog+OffFSELog < STREAM_ACCUMULATOR_MIN_64);
+
+ seq.litLength = llBase + ((llBits>0) ? BIT_readBitsFast(&seqState->DStream, llBits) : 0); /* <= 16 bits */
+ if (MEM_32bits())
+ BIT_reloadDStream(&seqState->DStream);
+
+ { size_t const pos = seqState->pos + seq.litLength;
+ const BYTE* const matchBase = (seq.offset > pos) ? seqState->dictEnd : seqState->prefixStart;
+ seq.match = matchBase + pos - seq.offset; /* note : this operation can overflow when seq.offset is really too large, which can only happen when input is corrupted.
+ * No consequence though : no memory access will occur, overly large offset will be detected in ZSTD_execSequenceLong() */
+ seqState->pos = pos + seq.matchLength;
+ }
+
+ /* ANS state update */
+ ZSTD_updateFseState(&seqState->stateLL, &seqState->DStream); /* <= 9 bits */
+ ZSTD_updateFseState(&seqState->stateML, &seqState->DStream); /* <= 9 bits */
+ if (MEM_32bits()) BIT_reloadDStream(&seqState->DStream); /* <= 18 bits */
+ ZSTD_updateFseState(&seqState->stateOffb, &seqState->DStream); /* <= 8 bits */
+
+ return seq;
+}
+
+FORCE_INLINE_TEMPLATE size_t
+ZSTD_decompressSequencesLong_body(
+ ZSTD_DCtx* dctx,
+ void* dst, size_t maxDstSize,
+ const void* seqStart, size_t seqSize, int nbSeq,
+ const ZSTD_longOffset_e isLongOffset)
+{
+ const BYTE* ip = (const BYTE*)seqStart;
+ const BYTE* const iend = ip + seqSize;
+ BYTE* const ostart = (BYTE* const)dst;
+ BYTE* const oend = ostart + maxDstSize;
+ BYTE* op = ostart;
+ const BYTE* litPtr = dctx->litPtr;
+ const BYTE* const litEnd = litPtr + dctx->litSize;
+ const BYTE* const prefixStart = (const BYTE*) (dctx->prefixStart);
+ const BYTE* const dictStart = (const BYTE*) (dctx->virtualStart);
+ const BYTE* const dictEnd = (const BYTE*) (dctx->dictEnd);
+
+ /* Regen sequences */
+ if (nbSeq) {
+#define STORED_SEQS 4
+#define STORED_SEQS_MASK (STORED_SEQS-1)
+#define ADVANCED_SEQS 4
+ seq_t sequences[STORED_SEQS];
+ int const seqAdvance = MIN(nbSeq, ADVANCED_SEQS);
+ seqState_t seqState;
+ int seqNb;
+ dctx->fseEntropy = 1;
+ { int i; for (i=0; i<ZSTD_REP_NUM; i++) seqState.prevOffset[i] = dctx->entropy.rep[i]; }
+ seqState.prefixStart = prefixStart;
+ seqState.pos = (size_t)(op-prefixStart);
+ seqState.dictEnd = dictEnd;
+ assert(iend >= ip);
+ CHECK_E(BIT_initDStream(&seqState.DStream, ip, iend-ip), corruption_detected);
+ ZSTD_initFseState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr);
+ ZSTD_initFseState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr);
+ ZSTD_initFseState(&seqState.stateML, &seqState.DStream, dctx->MLTptr);
+
+ /* prepare in advance */
+ for (seqNb=0; (BIT_reloadDStream(&seqState.DStream) <= BIT_DStream_completed) && (seqNb<seqAdvance); seqNb++) {
+ sequences[seqNb] = ZSTD_decodeSequenceLong(&seqState, isLongOffset);
+ PREFETCH_L1(sequences[seqNb].match); PREFETCH_L1(sequences[seqNb].match + sequences[seqNb].matchLength - 1); /* note : it's safe to invoke PREFETCH() on any memory address, including invalid ones */
+ }
+ if (seqNb<seqAdvance) return ERROR(corruption_detected);
+
+ /* decode and decompress */
+ for ( ; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && (seqNb<nbSeq) ; seqNb++) {
+ seq_t const sequence = ZSTD_decodeSequenceLong(&seqState, isLongOffset);
+ size_t const oneSeqSize = ZSTD_execSequenceLong(op, oend, sequences[(seqNb-ADVANCED_SEQS) & STORED_SEQS_MASK], &litPtr, litEnd, prefixStart, dictStart, dictEnd);
+ if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
+ PREFETCH_L1(sequence.match); PREFETCH_L1(sequence.match + sequence.matchLength - 1); /* note : it's safe to invoke PREFETCH() on any memory address, including invalid ones */
+ sequences[seqNb & STORED_SEQS_MASK] = sequence;
+ op += oneSeqSize;
+ }
+ if (seqNb<nbSeq) return ERROR(corruption_detected);
+
+ /* finish queue */
+ seqNb -= seqAdvance;
+ for ( ; seqNb<nbSeq ; seqNb++) {
+ size_t const oneSeqSize = ZSTD_execSequenceLong(op, oend, sequences[seqNb&STORED_SEQS_MASK], &litPtr, litEnd, prefixStart, dictStart, dictEnd);
+ if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
+ op += oneSeqSize;
+ }
+
+ /* save reps for next block */
+ { U32 i; for (i=0; i<ZSTD_REP_NUM; i++) dctx->entropy.rep[i] = (U32)(seqState.prevOffset[i]); }
+ }
+
+ /* last literal segment */
+ { size_t const lastLLSize = litEnd - litPtr;
+ if (lastLLSize > (size_t)(oend-op)) return ERROR(dstSize_tooSmall);
+ memcpy(op, litPtr, lastLLSize);
+ op += lastLLSize;
+ }
+
+ return op-ostart;
+}
+
+static size_t
+ZSTD_decompressSequencesLong_default(ZSTD_DCtx* dctx,
+ void* dst, size_t maxDstSize,
+ const void* seqStart, size_t seqSize, int nbSeq,
+ const ZSTD_longOffset_e isLongOffset)
+{
+ return ZSTD_decompressSequencesLong_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
+}
+#endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT */
+
+
+
+#if DYNAMIC_BMI2
+
+#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG
+static TARGET_ATTRIBUTE("bmi2") size_t
+ZSTD_decompressSequences_bmi2(ZSTD_DCtx* dctx,
+ void* dst, size_t maxDstSize,
+ const void* seqStart, size_t seqSize, int nbSeq,
+ const ZSTD_longOffset_e isLongOffset)
+{
+ return ZSTD_decompressSequences_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
+}
+#endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG */
+
+#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT
+static TARGET_ATTRIBUTE("bmi2") size_t
+ZSTD_decompressSequencesLong_bmi2(ZSTD_DCtx* dctx,
+ void* dst, size_t maxDstSize,
+ const void* seqStart, size_t seqSize, int nbSeq,
+ const ZSTD_longOffset_e isLongOffset)
+{
+ return ZSTD_decompressSequencesLong_body(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
+}
+#endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT */
+
+#endif /* DYNAMIC_BMI2 */
+
+typedef size_t (*ZSTD_decompressSequences_t)(
+ ZSTD_DCtx* dctx,
+ void* dst, size_t maxDstSize,
+ const void* seqStart, size_t seqSize, int nbSeq,
+ const ZSTD_longOffset_e isLongOffset);
+
+#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG
+static size_t
+ZSTD_decompressSequences(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize,
+ const void* seqStart, size_t seqSize, int nbSeq,
+ const ZSTD_longOffset_e isLongOffset)
+{
+ DEBUGLOG(5, "ZSTD_decompressSequences");
+#if DYNAMIC_BMI2
+ if (dctx->bmi2) {
+ return ZSTD_decompressSequences_bmi2(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
+ }
+#endif
+ return ZSTD_decompressSequences_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
+}
+#endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG */
+
+
+#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT
+/* ZSTD_decompressSequencesLong() :
+ * decompression function triggered when a minimum share of offsets is considered "long",
+ * aka out of cache.
+ * note : "long" definition seems overloaded here, sometimes meaning "wider than bitstream register", and sometimes mearning "farther than memory cache distance".
+ * This function will try to mitigate main memory latency through the use of prefetching */
+static size_t
+ZSTD_decompressSequencesLong(ZSTD_DCtx* dctx,
+ void* dst, size_t maxDstSize,
+ const void* seqStart, size_t seqSize, int nbSeq,
+ const ZSTD_longOffset_e isLongOffset)
+{
+ DEBUGLOG(5, "ZSTD_decompressSequencesLong");
+#if DYNAMIC_BMI2
+ if (dctx->bmi2) {
+ return ZSTD_decompressSequencesLong_bmi2(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
+ }
+#endif
+ return ZSTD_decompressSequencesLong_default(dctx, dst, maxDstSize, seqStart, seqSize, nbSeq, isLongOffset);
+}
+#endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT */
+
+
+
+#if !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \
+ !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG)
+/* ZSTD_getLongOffsetsShare() :
+ * condition : offTable must be valid
+ * @return : "share" of long offsets (arbitrarily defined as > (1<<23))
+ * compared to maximum possible of (1<<OffFSELog) */
+static unsigned
+ZSTD_getLongOffsetsShare(const ZSTD_seqSymbol* offTable)
+{
+ const void* ptr = offTable;
+ U32 const tableLog = ((const ZSTD_seqSymbol_header*)ptr)[0].tableLog;
+ const ZSTD_seqSymbol* table = offTable + 1;
+ U32 const max = 1 << tableLog;
+ U32 u, total = 0;
+ DEBUGLOG(5, "ZSTD_getLongOffsetsShare: (tableLog=%u)", tableLog);
+
+ assert(max <= (1 << OffFSELog)); /* max not too large */
+ for (u=0; u<max; u++) {
+ if (table[u].nbAdditionalBits > 22) total += 1;
+ }
+
+ assert(tableLog <= OffFSELog);
+ total <<= (OffFSELog - tableLog); /* scale to OffFSELog */
+
+ return total;
+}
+#endif
+
+
+size_t
+ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx,
+ void* dst, size_t dstCapacity,
+ const void* src, size_t srcSize, const int frame)
+{ /* blockType == blockCompressed */
+ const BYTE* ip = (const BYTE*)src;
+ /* isLongOffset must be true if there are long offsets.
+ * Offsets are long if they are larger than 2^STREAM_ACCUMULATOR_MIN.
+ * We don't expect that to be the case in 64-bit mode.
+ * In block mode, window size is not known, so we have to be conservative.
+ * (note: but it could be evaluated from current-lowLimit)
+ */
+ ZSTD_longOffset_e const isLongOffset = (ZSTD_longOffset_e)(MEM_32bits() && (!frame || (dctx->fParams.windowSize > (1ULL << STREAM_ACCUMULATOR_MIN))));
+ DEBUGLOG(5, "ZSTD_decompressBlock_internal (size : %u)", (U32)srcSize);
+
+ if (srcSize >= ZSTD_BLOCKSIZE_MAX) return ERROR(srcSize_wrong);
+
+ /* Decode literals section */
+ { size_t const litCSize = ZSTD_decodeLiteralsBlock(dctx, src, srcSize);
+ DEBUGLOG(5, "ZSTD_decodeLiteralsBlock : %u", (U32)litCSize);
+ if (ZSTD_isError(litCSize)) return litCSize;
+ ip += litCSize;
+ srcSize -= litCSize;
+ }
+
+ /* Build Decoding Tables */
+ {
+ /* These macros control at build-time which decompressor implementation
+ * we use. If neither is defined, we do some inspection and dispatch at
+ * runtime.
+ */
+#if !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \
+ !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG)
+ int usePrefetchDecoder = dctx->ddictIsCold;
+#endif
+ int nbSeq;
+ size_t const seqHSize = ZSTD_decodeSeqHeaders(dctx, &nbSeq, ip, srcSize);
+ if (ZSTD_isError(seqHSize)) return seqHSize;
+ ip += seqHSize;
+ srcSize -= seqHSize;
+
+#if !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \
+ !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG)
+ if ( !usePrefetchDecoder
+ && (!frame || (dctx->fParams.windowSize > (1<<24)))
+ && (nbSeq>ADVANCED_SEQS) ) { /* could probably use a larger nbSeq limit */
+ U32 const shareLongOffsets = ZSTD_getLongOffsetsShare(dctx->OFTptr);
+ U32 const minShare = MEM_64bits() ? 7 : 20; /* heuristic values, correspond to 2.73% and 7.81% */
+ usePrefetchDecoder = (shareLongOffsets >= minShare);
+ }
+#endif
+
+ dctx->ddictIsCold = 0;
+
+#if !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \
+ !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG)
+ if (usePrefetchDecoder)
+#endif
+#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT
+ return ZSTD_decompressSequencesLong(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset);
+#endif
+
+#ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG
+ /* else */
+ return ZSTD_decompressSequences(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset);
+#endif
+ }
+}
+
+
+size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx,
+ void* dst, size_t dstCapacity,
+ const void* src, size_t srcSize)
+{
+ size_t dSize;
+ ZSTD_checkContinuity(dctx, dst);
+ dSize = ZSTD_decompressBlock_internal(dctx, dst, dstCapacity, src, srcSize, /* frame */ 0);
+ dctx->previousDstEnd = (char*)dst + dSize;
+ return dSize;
+}
diff --git a/thirdparty/zstd/decompress/zstd_decompress_block.h b/thirdparty/zstd/decompress/zstd_decompress_block.h
new file mode 100644
index 0000000000..7e92960410
--- /dev/null
+++ b/thirdparty/zstd/decompress/zstd_decompress_block.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under both the BSD-style license (found in the
+ * LICENSE file in the root directory of this source tree) and the GPLv2 (found
+ * in the COPYING file in the root directory of this source tree).
+ * You may select, at your option, one of the above-listed licenses.
+ */
+
+
+#ifndef ZSTD_DEC_BLOCK_H
+#define ZSTD_DEC_BLOCK_H
+
+/*-*******************************************************
+ * Dependencies
+ *********************************************************/
+#include <stddef.h> /* size_t */
+#include "zstd.h" /* DCtx, and some public functions */
+#include "zstd_internal.h" /* blockProperties_t, and some public functions */
+#include "zstd_decompress_internal.h" /* ZSTD_seqSymbol */
+
+
+/* === Prototypes === */
+
+/* note: prototypes already published within `zstd.h` :
+ * ZSTD_decompressBlock()
+ */
+
+/* note: prototypes already published within `zstd_internal.h` :
+ * ZSTD_getcBlockSize()
+ * ZSTD_decodeSeqHeaders()
+ */
+
+
+/* ZSTD_decompressBlock_internal() :
+ * decompress block, starting at `src`,
+ * into destination buffer `dst`.
+ * @return : decompressed block size,
+ * or an error code (which can be tested using ZSTD_isError())
+ */
+size_t ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx,
+ void* dst, size_t dstCapacity,
+ const void* src, size_t srcSize, const int frame);
+
+/* ZSTD_buildFSETable() :
+ * generate FSE decoding table for one symbol (ll, ml or off)
+ * this function must be called with valid parameters only
+ * (dt is large enough, normalizedCounter distribution total is a power of 2, max is within range, etc.)
+ * in which case it cannot fail.
+ * Internal use only.
+ */
+void ZSTD_buildFSETable(ZSTD_seqSymbol* dt,
+ const short* normalizedCounter, unsigned maxSymbolValue,
+ const U32* baseValue, const U32* nbAdditionalBits,
+ unsigned tableLog);
+
+
+#endif /* ZSTD_DEC_BLOCK_H */
diff --git a/thirdparty/zstd/decompress/zstd_decompress_internal.h b/thirdparty/zstd/decompress/zstd_decompress_internal.h
new file mode 100644
index 0000000000..abd0030519
--- /dev/null
+++ b/thirdparty/zstd/decompress/zstd_decompress_internal.h
@@ -0,0 +1,168 @@
+/*
+ * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under both the BSD-style license (found in the
+ * LICENSE file in the root directory of this source tree) and the GPLv2 (found
+ * in the COPYING file in the root directory of this source tree).
+ * You may select, at your option, one of the above-listed licenses.
+ */
+
+
+/* zstd_decompress_internal:
+ * objects and definitions shared within lib/decompress modules */
+
+ #ifndef ZSTD_DECOMPRESS_INTERNAL_H
+ #define ZSTD_DECOMPRESS_INTERNAL_H
+
+
+/*-*******************************************************
+ * Dependencies
+ *********************************************************/
+#include "mem.h" /* BYTE, U16, U32 */
+#include "zstd_internal.h" /* ZSTD_seqSymbol */
+
+
+
+/*-*******************************************************
+ * Constants
+ *********************************************************/
+static const U32 LL_base[MaxLL+1] = {
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 18, 20, 22, 24, 28, 32, 40,
+ 48, 64, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000,
+ 0x2000, 0x4000, 0x8000, 0x10000 };
+
+static const U32 OF_base[MaxOff+1] = {
+ 0, 1, 1, 5, 0xD, 0x1D, 0x3D, 0x7D,
+ 0xFD, 0x1FD, 0x3FD, 0x7FD, 0xFFD, 0x1FFD, 0x3FFD, 0x7FFD,
+ 0xFFFD, 0x1FFFD, 0x3FFFD, 0x7FFFD, 0xFFFFD, 0x1FFFFD, 0x3FFFFD, 0x7FFFFD,
+ 0xFFFFFD, 0x1FFFFFD, 0x3FFFFFD, 0x7FFFFFD, 0xFFFFFFD, 0x1FFFFFFD, 0x3FFFFFFD, 0x7FFFFFFD };
+
+static const U32 OF_bits[MaxOff+1] = {
+ 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 };
+
+static const U32 ML_base[MaxML+1] = {
+ 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, 37, 39, 41, 43, 47, 51, 59,
+ 67, 83, 99, 0x83, 0x103, 0x203, 0x403, 0x803,
+ 0x1003, 0x2003, 0x4003, 0x8003, 0x10003 };
+
+
+/*-*******************************************************
+ * Decompression types
+ *********************************************************/
+ typedef struct {
+ U32 fastMode;
+ U32 tableLog;
+ } ZSTD_seqSymbol_header;
+
+ typedef struct {
+ U16 nextState;
+ BYTE nbAdditionalBits;
+ BYTE nbBits;
+ U32 baseValue;
+ } ZSTD_seqSymbol;
+
+ #define SEQSYMBOL_TABLE_SIZE(log) (1 + (1 << (log)))
+
+typedef struct {
+ ZSTD_seqSymbol LLTable[SEQSYMBOL_TABLE_SIZE(LLFSELog)]; /* Note : Space reserved for FSE Tables */
+ ZSTD_seqSymbol OFTable[SEQSYMBOL_TABLE_SIZE(OffFSELog)]; /* is also used as temporary workspace while building hufTable during DDict creation */
+ ZSTD_seqSymbol MLTable[SEQSYMBOL_TABLE_SIZE(MLFSELog)]; /* and therefore must be at least HUF_DECOMPRESS_WORKSPACE_SIZE large */
+ HUF_DTable hufTable[HUF_DTABLE_SIZE(HufLog)]; /* can accommodate HUF_decompress4X */
+ U32 rep[ZSTD_REP_NUM];
+} ZSTD_entropyDTables_t;
+
+typedef enum { ZSTDds_getFrameHeaderSize, ZSTDds_decodeFrameHeader,
+ ZSTDds_decodeBlockHeader, ZSTDds_decompressBlock,
+ ZSTDds_decompressLastBlock, ZSTDds_checkChecksum,
+ ZSTDds_decodeSkippableHeader, ZSTDds_skipFrame } ZSTD_dStage;
+
+typedef enum { zdss_init=0, zdss_loadHeader,
+ zdss_read, zdss_load, zdss_flush } ZSTD_dStreamStage;
+
+struct ZSTD_DCtx_s
+{
+ const ZSTD_seqSymbol* LLTptr;
+ const ZSTD_seqSymbol* MLTptr;
+ const ZSTD_seqSymbol* OFTptr;
+ const HUF_DTable* HUFptr;
+ ZSTD_entropyDTables_t entropy;
+ U32 workspace[HUF_DECOMPRESS_WORKSPACE_SIZE_U32]; /* space needed when building huffman tables */
+ const void* previousDstEnd; /* detect continuity */
+ const void* prefixStart; /* start of current segment */
+ const void* virtualStart; /* virtual start of previous segment if it was just before current one */
+ const void* dictEnd; /* end of previous segment */
+ size_t expected;
+ ZSTD_frameHeader fParams;
+ U64 decodedSize;
+ blockType_e bType; /* used in ZSTD_decompressContinue(), store blockType between block header decoding and block decompression stages */
+ ZSTD_dStage stage;
+ U32 litEntropy;
+ U32 fseEntropy;
+ XXH64_state_t xxhState;
+ size_t headerSize;
+ ZSTD_format_e format;
+ const BYTE* litPtr;
+ ZSTD_customMem customMem;
+ size_t litSize;
+ size_t rleSize;
+ size_t staticSize;
+ int bmi2; /* == 1 if the CPU supports BMI2 and 0 otherwise. CPU support is determined dynamically once per context lifetime. */
+
+ /* dictionary */
+ ZSTD_DDict* ddictLocal;
+ const ZSTD_DDict* ddict; /* set by ZSTD_initDStream_usingDDict(), or ZSTD_DCtx_refDDict() */
+ U32 dictID;
+ int ddictIsCold; /* if == 1 : dictionary is "new" for working context, and presumed "cold" (not in cpu cache) */
+
+ /* streaming */
+ ZSTD_dStreamStage streamStage;
+ char* inBuff;
+ size_t inBuffSize;
+ size_t inPos;
+ size_t maxWindowSize;
+ char* outBuff;
+ size_t outBuffSize;
+ size_t outStart;
+ size_t outEnd;
+ size_t lhSize;
+ void* legacyContext;
+ U32 previousLegacyVersion;
+ U32 legacyVersion;
+ U32 hostageByte;
+ int noForwardProgress;
+
+ /* workspace */
+ BYTE litBuffer[ZSTD_BLOCKSIZE_MAX + WILDCOPY_OVERLENGTH];
+ BYTE headerBuffer[ZSTD_FRAMEHEADERSIZE_MAX];
+}; /* typedef'd to ZSTD_DCtx within "zstd.h" */
+
+
+/*-*******************************************************
+ * Shared internal functions
+ *********************************************************/
+
+/*! ZSTD_loadDEntropy() :
+ * dict : must point at beginning of a valid zstd dictionary.
+ * @return : size of entropy tables read */
+size_t ZSTD_loadDEntropy(ZSTD_entropyDTables_t* entropy,
+ const void* const dict, size_t const dictSize);
+
+/*! ZSTD_checkContinuity() :
+ * check if next `dst` follows previous position, where decompression ended.
+ * If yes, do nothing (continue on current segment).
+ * If not, classify previous segment as "external dictionary", and start a new segment.
+ * This function cannot fail. */
+void ZSTD_checkContinuity(ZSTD_DCtx* dctx, const void* dst);
+
+
+#endif /* ZSTD_DECOMPRESS_INTERNAL_H */
diff --git a/thirdparty/zstd/zstd.h b/thirdparty/zstd/zstd.h
index 6405da602e..b18fc8a44b 100644
--- a/thirdparty/zstd/zstd.h
+++ b/thirdparty/zstd/zstd.h
@@ -35,41 +35,59 @@ extern "C" {
#endif
-/*******************************************************************************************************
+/*******************************************************************************
Introduction
- zstd, short for Zstandard, is a fast lossless compression algorithm,
- targeting real-time compression scenarios at zlib-level and better compression ratios.
- The zstd compression library provides in-memory compression and decompression functions.
- The library supports compression levels from 1 up to ZSTD_maxCLevel() which is currently 22.
- Levels >= 20, labeled `--ultra`, should be used with caution, as they require more memory.
+ zstd, short for Zstandard, is a fast lossless compression algorithm, targeting
+ real-time compression scenarios at zlib-level and better compression ratios.
+ The zstd compression library provides in-memory compression and decompression
+ functions.
+
+ The library supports regular compression levels from 1 up to ZSTD_maxCLevel(),
+ which is currently 22. Levels >= 20, labeled `--ultra`, should be used with
+ caution, as they require more memory. The library also offers negative
+ compression levels, which extend the range of speed vs. ratio preferences.
+ The lower the level, the faster the speed (at the cost of compression).
+
Compression can be done in:
- a single step (described as Simple API)
- a single step, reusing a context (described as Explicit context)
- unbounded multiple steps (described as Streaming compression)
- The compression ratio achievable on small data can be highly improved using a dictionary in:
+
+ The compression ratio achievable on small data can be highly improved using
+ a dictionary. Dictionary compression can be performed in:
- a single step (described as Simple dictionary API)
- - a single step, reusing a dictionary (described as Bulk-processing dictionary API)
+ - a single step, reusing a dictionary (described as Bulk-processing
+ dictionary API)
- Advanced experimental functions can be accessed using #define ZSTD_STATIC_LINKING_ONLY before including zstd.h.
- Advanced experimental APIs shall never be used with a dynamic library.
- They are not "stable", their definition may change in the future. Only static linking is allowed.
-*********************************************************************************************************/
+ Advanced experimental functions can be accessed using
+ `#define ZSTD_STATIC_LINKING_ONLY` before including zstd.h.
+
+ Advanced experimental APIs should never be used with a dynamically-linked
+ library. They are not "stable"; their definitions or signatures may change in
+ the future. Only static linking is allowed.
+*******************************************************************************/
/*------ Version ------*/
#define ZSTD_VERSION_MAJOR 1
#define ZSTD_VERSION_MINOR 3
-#define ZSTD_VERSION_RELEASE 4
+#define ZSTD_VERSION_RELEASE 8
#define ZSTD_VERSION_NUMBER (ZSTD_VERSION_MAJOR *100*100 + ZSTD_VERSION_MINOR *100 + ZSTD_VERSION_RELEASE)
-ZSTDLIB_API unsigned ZSTD_versionNumber(void); /**< useful to check dll version */
+ZSTDLIB_API unsigned ZSTD_versionNumber(void); /**< to check runtime library version */
#define ZSTD_LIB_VERSION ZSTD_VERSION_MAJOR.ZSTD_VERSION_MINOR.ZSTD_VERSION_RELEASE
#define ZSTD_QUOTE(str) #str
#define ZSTD_EXPAND_AND_QUOTE(str) ZSTD_QUOTE(str)
#define ZSTD_VERSION_STRING ZSTD_EXPAND_AND_QUOTE(ZSTD_LIB_VERSION)
-ZSTDLIB_API const char* ZSTD_versionString(void); /* added in v1.3.0 */
+ZSTDLIB_API const char* ZSTD_versionString(void); /* requires v1.3.0+ */
+/***************************************
+* Default constant
+***************************************/
+#ifndef ZSTD_CLEVEL_DEFAULT
+# define ZSTD_CLEVEL_DEFAULT 3
+#endif
/***************************************
* Simple API
@@ -92,11 +110,11 @@ ZSTDLIB_API size_t ZSTD_compress( void* dst, size_t dstCapacity,
ZSTDLIB_API size_t ZSTD_decompress( void* dst, size_t dstCapacity,
const void* src, size_t compressedSize);
-/*! ZSTD_getFrameContentSize() : added in v1.3.0
+/*! ZSTD_getFrameContentSize() : requires v1.3.0+
* `src` should point to the start of a ZSTD encoded frame.
* `srcSize` must be at least as large as the frame header.
* hint : any size >= `ZSTD_frameHeaderSize_max` is large enough.
- * @return : - decompressed size of the frame in `src`, if known
+ * @return : - decompressed size of `src` frame content, if known
* - ZSTD_CONTENTSIZE_UNKNOWN if the size cannot be determined
* - ZSTD_CONTENTSIZE_ERROR if an error occurred (e.g. invalid magic number, srcSize too small)
* note 1 : a 0 return value means the frame is valid but "empty".
@@ -106,7 +124,8 @@ ZSTDLIB_API size_t ZSTD_decompress( void* dst, size_t dstCapacity,
* Optionally, application can rely on some implicit limit,
* as ZSTD_decompress() only needs an upper bound of decompressed size.
* (For example, data could be necessarily cut into blocks <= 16 KB).
- * note 3 : decompressed size is always present when compression is done with ZSTD_compress()
+ * note 3 : decompressed size is always present when compression is completed using single-pass functions,
+ * such as ZSTD_compress(), ZSTD_compressCCtx() ZSTD_compress_usingDict() or ZSTD_compress_usingCDict().
* note 4 : decompressed size can be very large (64-bits value),
* potentially larger than what local system can handle as a single memory segment.
* In which case, it's necessary to use streaming mode to decompress data.
@@ -123,8 +142,7 @@ ZSTDLIB_API unsigned long long ZSTD_getFrameContentSize(const void *src, size_t
* Both functions work the same way, but ZSTD_getDecompressedSize() blends
* "empty", "unknown" and "error" results to the same return value (0),
* while ZSTD_getFrameContentSize() gives them separate return values.
- * `src` is the start of a zstd compressed frame.
- * @return : content size to be decompressed, as a 64-bits value _if known and not empty_, 0 otherwise. */
+ * @return : decompressed size of `src` frame content _if known and not empty_, 0 otherwise. */
ZSTDLIB_API unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize);
@@ -149,8 +167,10 @@ ZSTDLIB_API ZSTD_CCtx* ZSTD_createCCtx(void);
ZSTDLIB_API size_t ZSTD_freeCCtx(ZSTD_CCtx* cctx);
/*! ZSTD_compressCCtx() :
- * Same as ZSTD_compress(), requires an allocated ZSTD_CCtx (see ZSTD_createCCtx()). */
-ZSTDLIB_API size_t ZSTD_compressCCtx(ZSTD_CCtx* ctx,
+ * Same as ZSTD_compress(), using an explicit ZSTD_CCtx
+ * The function will compress at requested compression level,
+ * ignoring any other parameter */
+ZSTDLIB_API size_t ZSTD_compressCCtx(ZSTD_CCtx* cctx,
void* dst, size_t dstCapacity,
const void* src, size_t srcSize,
int compressionLevel);
@@ -166,8 +186,11 @@ ZSTDLIB_API ZSTD_DCtx* ZSTD_createDCtx(void);
ZSTDLIB_API size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx);
/*! ZSTD_decompressDCtx() :
- * Same as ZSTD_decompress(), requires an allocated ZSTD_DCtx (see ZSTD_createDCtx()) */
-ZSTDLIB_API size_t ZSTD_decompressDCtx(ZSTD_DCtx* ctx,
+ * Same as ZSTD_decompress(),
+ * requires an allocated ZSTD_DCtx.
+ * Compatible with sticky parameters.
+ */
+ZSTDLIB_API size_t ZSTD_decompressDCtx(ZSTD_DCtx* dctx,
void* dst, size_t dstCapacity,
const void* src, size_t srcSize);
@@ -176,9 +199,12 @@ ZSTDLIB_API size_t ZSTD_decompressDCtx(ZSTD_DCtx* ctx,
* Simple dictionary API
***************************/
/*! ZSTD_compress_usingDict() :
- * Compression using a predefined Dictionary (see dictBuilder/zdict.h).
+ * Compression at an explicit compression level using a Dictionary.
+ * A dictionary can be any arbitrary data segment (also called a prefix),
+ * or a buffer with specified information (see dictBuilder/zdict.h).
* Note : This function loads the dictionary, resulting in significant startup delay.
- * Note : When `dict == NULL || dictSize < 8` no dictionary is used. */
+ * It's intended for a dictionary used only once.
+ * Note 2 : When `dict == NULL || dictSize < 8` no dictionary is used. */
ZSTDLIB_API size_t ZSTD_compress_usingDict(ZSTD_CCtx* ctx,
void* dst, size_t dstCapacity,
const void* src, size_t srcSize,
@@ -186,9 +212,10 @@ ZSTDLIB_API size_t ZSTD_compress_usingDict(ZSTD_CCtx* ctx,
int compressionLevel);
/*! ZSTD_decompress_usingDict() :
- * Decompression using a predefined Dictionary (see dictBuilder/zdict.h).
+ * Decompression using a known Dictionary.
* Dictionary must be identical to the one used during compression.
* Note : This function loads the dictionary, resulting in significant startup delay.
+ * It's intended for a dictionary used only once.
* Note : When `dict == NULL || dictSize < 8` no dictionary is used. */
ZSTDLIB_API size_t ZSTD_decompress_usingDict(ZSTD_DCtx* dctx,
void* dst, size_t dstCapacity,
@@ -196,16 +223,18 @@ ZSTDLIB_API size_t ZSTD_decompress_usingDict(ZSTD_DCtx* dctx,
const void* dict,size_t dictSize);
-/**********************************
+/***********************************
* Bulk processing dictionary API
- *********************************/
+ **********************************/
typedef struct ZSTD_CDict_s ZSTD_CDict;
/*! ZSTD_createCDict() :
- * When compressing multiple messages / blocks with the same dictionary, it's recommended to load it just once.
- * ZSTD_createCDict() will create a digested dictionary, ready to start future compression operations without startup delay.
+ * When compressing multiple messages / blocks using the same dictionary, it's recommended to load it only once.
+ * ZSTD_createCDict() will create a digested dictionary, ready to start future compression operations without startup cost.
* ZSTD_CDict can be created once and shared by multiple threads concurrently, since its usage is read-only.
- * `dictBuffer` can be released after ZSTD_CDict creation, since its content is copied within CDict */
+ * `dictBuffer` can be released after ZSTD_CDict creation, because its content is copied within CDict.
+ * Consider experimental function `ZSTD_createCDict_byReference()` if you prefer to not duplicate `dictBuffer` content.
+ * Note : A ZSTD_CDict can be created from an empty dictBuffer, but it is inefficient when used to compress small data. */
ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict(const void* dictBuffer, size_t dictSize,
int compressionLevel);
@@ -215,9 +244,9 @@ ZSTDLIB_API size_t ZSTD_freeCDict(ZSTD_CDict* CDict);
/*! ZSTD_compress_usingCDict() :
* Compression using a digested Dictionary.
- * Faster startup than ZSTD_compress_usingDict(), recommended when same dictionary is used multiple times.
- * Note that compression level is decided during dictionary creation.
- * Frame parameters are hardcoded (dictID=yes, contentSize=yes, checksum=no) */
+ * Recommended when same dictionary is used multiple times.
+ * Note : compression level is _decided at dictionary creation time_,
+ * and frame parameters are hardcoded (dictID=yes, contentSize=yes, checksum=no) */
ZSTDLIB_API size_t ZSTD_compress_usingCDict(ZSTD_CCtx* cctx,
void* dst, size_t dstCapacity,
const void* src, size_t srcSize,
@@ -228,7 +257,7 @@ typedef struct ZSTD_DDict_s ZSTD_DDict;
/*! ZSTD_createDDict() :
* Create a digested dictionary, ready to start decompression operation without startup delay.
- * dictBuffer can be released after DDict creation, as its content is copied inside DDict */
+ * dictBuffer can be released after DDict creation, as its content is copied inside DDict. */
ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict(const void* dictBuffer, size_t dictSize);
/*! ZSTD_freeDDict() :
@@ -237,7 +266,7 @@ ZSTDLIB_API size_t ZSTD_freeDDict(ZSTD_DDict* ddict);
/*! ZSTD_decompress_usingDDict() :
* Decompression using a digested Dictionary.
- * Faster startup than ZSTD_decompress_usingDict(), recommended when same dictionary is used multiple times. */
+ * Recommended when same dictionary is used multiple times. */
ZSTDLIB_API size_t ZSTD_decompress_usingDDict(ZSTD_DCtx* dctx,
void* dst, size_t dstCapacity,
const void* src, size_t srcSize,
@@ -268,43 +297,51 @@ typedef struct ZSTD_outBuffer_s {
* A ZSTD_CStream object is required to track streaming operation.
* Use ZSTD_createCStream() and ZSTD_freeCStream() to create/release resources.
* ZSTD_CStream objects can be reused multiple times on consecutive compression operations.
-* It is recommended to re-use ZSTD_CStream in situations where many streaming operations will be achieved consecutively,
-* since it will play nicer with system's memory, by re-using already allocated memory.
-* Use one separate ZSTD_CStream per thread for parallel execution.
+* It is recommended to re-use ZSTD_CStream since it will play nicer with system's memory, by re-using already allocated memory.
*
-* Start a new compression by initializing ZSTD_CStream.
-* Use ZSTD_initCStream() to start a new compression operation.
-* Use ZSTD_initCStream_usingDict() or ZSTD_initCStream_usingCDict() for a compression which requires a dictionary (experimental section)
+* For parallel execution, use one separate ZSTD_CStream per thread.
*
-* Use ZSTD_compressStream() repetitively to consume input stream.
-* The function will automatically update both `pos` fields.
-* Note that it may not consume the entire input, in which case `pos < size`,
-* and it's up to the caller to present again remaining data.
-* @return : a size hint, preferred nb of bytes to use as input for next function call
-* or an error code, which can be tested using ZSTD_isError().
-* Note 1 : it's just a hint, to help latency a little, any other value will work fine.
-* Note 2 : size hint is guaranteed to be <= ZSTD_CStreamInSize()
+* note : since v1.3.0, ZSTD_CStream and ZSTD_CCtx are the same thing.
*
-* At any moment, it's possible to flush whatever data remains within internal buffer, using ZSTD_flushStream().
-* `output->pos` will be updated.
-* Note that some content might still be left within internal buffer if `output->size` is too small.
-* @return : nb of bytes still present within internal buffer (0 if it's empty)
+* Parameters are sticky : when starting a new compression on the same context,
+* it will re-use the same sticky parameters as previous compression session.
+* When in doubt, it's recommended to fully initialize the context before usage.
+* Use ZSTD_initCStream() to set the parameter to a selected compression level.
+* Use advanced API (ZSTD_CCtx_setParameter(), etc.) to set more specific parameters.
+*
+* Use ZSTD_compressStream() as many times as necessary to consume input stream.
+* The function will automatically update both `pos` fields within `input` and `output`.
+* Note that the function may not consume the entire input,
+* for example, because the output buffer is already full,
+* in which case `input.pos < input.size`.
+* The caller must check if input has been entirely consumed.
+* If not, the caller must make some room to receive more compressed data,
+* and then present again remaining input data.
+* @return : a size hint, preferred nb of bytes to use as input for next function call
+* or an error code, which can be tested using ZSTD_isError().
+* Note 1 : it's just a hint, to help latency a little, any value will work fine.
+* Note 2 : size hint is guaranteed to be <= ZSTD_CStreamInSize()
+*
+* At any moment, it's possible to flush whatever data might remain stuck within internal buffer,
+* using ZSTD_flushStream(). `output->pos` will be updated.
+* Note that, if `output->size` is too small, a single invocation of ZSTD_flushStream() might not be enough (return code > 0).
+* In which case, make some room to receive more compressed data, and call again ZSTD_flushStream().
+* @return : 0 if internal buffers are entirely flushed,
+* >0 if some data still present within internal buffer (the value is minimal estimation of remaining size),
* or an error code, which can be tested using ZSTD_isError().
*
* ZSTD_endStream() instructs to finish a frame.
* It will perform a flush and write frame epilogue.
* The epilogue is required for decoders to consider a frame completed.
-* ZSTD_endStream() may not be able to flush full data if `output->size` is too small.
-* In which case, call again ZSTD_endStream() to complete the flush.
+* flush() operation is the same, and follows same rules as ZSTD_flushStream().
* @return : 0 if frame fully completed and fully flushed,
- or >0 if some data is still present within internal buffer
- (value is minimum size estimation for remaining data to flush, but it could be more)
+* >0 if some data still present within internal buffer (the value is minimal estimation of remaining size),
* or an error code, which can be tested using ZSTD_isError().
*
* *******************************************************************/
typedef ZSTD_CCtx ZSTD_CStream; /**< CCtx and CStream are now effectively same object (>= v1.3.0) */
- /* Continue to distinguish them for compatibility with versions <= v1.2.0 */
+ /* Continue to distinguish them for compatibility with older versions <= v1.2.0 */
/*===== ZSTD_CStream management functions =====*/
ZSTDLIB_API ZSTD_CStream* ZSTD_createCStream(void);
ZSTDLIB_API size_t ZSTD_freeCStream(ZSTD_CStream* zcs);
@@ -327,23 +364,28 @@ ZSTDLIB_API size_t ZSTD_CStreamOutSize(void); /**< recommended size for output
* Use ZSTD_createDStream() and ZSTD_freeDStream() to create/release resources.
* ZSTD_DStream objects can be re-used multiple times.
*
-* Use ZSTD_initDStream() to start a new decompression operation,
-* or ZSTD_initDStream_usingDict() if decompression requires a dictionary.
-* @return : recommended first input size
+* Use ZSTD_initDStream() to start a new decompression operation.
+* @return : recommended first input size
+* Alternatively, use advanced API to set specific properties.
*
* Use ZSTD_decompressStream() repetitively to consume your input.
* The function will update both `pos` fields.
* If `input.pos < input.size`, some input has not been consumed.
* It's up to the caller to present again remaining data.
+* The function tries to flush all data decoded immediately, respecting output buffer size.
* If `output.pos < output.size`, decoder has flushed everything it could.
-* @return : 0 when a frame is completely decoded and fully flushed,
-* an error code, which can be tested using ZSTD_isError(),
-* any other value > 0, which means there is still some decoding to do to complete current frame.
-* The return value is a suggested next input size (a hint to improve latency) that will never load more than the current frame.
+* But if `output.pos == output.size`, there might be some data left within internal buffers.,
+* In which case, call ZSTD_decompressStream() again to flush whatever remains in the buffer.
+* Note : with no additional input provided, amount of data flushed is necessarily <= ZSTD_BLOCKSIZE_MAX.
+* @return : 0 when a frame is completely decoded and fully flushed,
+* or an error code, which can be tested using ZSTD_isError(),
+* or any other value > 0, which means there is still some decoding or flushing to do to complete current frame :
+* the return value is a suggested next input size (just a hint for better latency)
+* that will never request more than the remaining frame size.
* *******************************************************************************/
typedef ZSTD_DCtx ZSTD_DStream; /**< DCtx and DStream are now effectively same object (>= v1.3.0) */
- /* For compatibility with versions <= v1.2.0, continue to consider them separated. */
+ /* For compatibility with versions <= v1.2.0, prefer differentiating them. */
/*===== ZSTD_DStream management functions =====*/
ZSTDLIB_API ZSTD_DStream* ZSTD_createDStream(void);
ZSTDLIB_API size_t ZSTD_freeDStream(ZSTD_DStream* zds);
@@ -359,69 +401,603 @@ ZSTDLIB_API size_t ZSTD_DStreamOutSize(void); /*!< recommended size for output
+
/****************************************************************************************
- * START OF ADVANCED AND EXPERIMENTAL FUNCTIONS
- * The definitions in this section are considered experimental.
- * They should never be used with a dynamic library, as prototypes may change in the future.
+ * ADVANCED AND EXPERIMENTAL FUNCTIONS
+ ****************************************************************************************
+ * The definitions in the following section are considered experimental.
* They are provided for advanced scenarios.
+ * They should never be used with a dynamic library, as prototypes may change in the future.
* Use them only in association with static linking.
* ***************************************************************************************/
#if defined(ZSTD_STATIC_LINKING_ONLY) && !defined(ZSTD_H_ZSTD_STATIC_LINKING_ONLY)
#define ZSTD_H_ZSTD_STATIC_LINKING_ONLY
-/* --- Constants ---*/
-#define ZSTD_MAGICNUMBER 0xFD2FB528 /* >= v0.8.0 */
-#define ZSTD_MAGIC_SKIPPABLE_START 0x184D2A50U
-#define ZSTD_MAGIC_DICTIONARY 0xEC30A437 /* >= v0.7.0 */
-
-#define ZSTD_WINDOWLOG_MAX_32 30
-#define ZSTD_WINDOWLOG_MAX_64 31
-#define ZSTD_WINDOWLOG_MAX ((unsigned)(sizeof(size_t) == 4 ? ZSTD_WINDOWLOG_MAX_32 : ZSTD_WINDOWLOG_MAX_64))
-#define ZSTD_WINDOWLOG_MIN 10
-#define ZSTD_HASHLOG_MAX ((ZSTD_WINDOWLOG_MAX < 30) ? ZSTD_WINDOWLOG_MAX : 30)
-#define ZSTD_HASHLOG_MIN 6
-#define ZSTD_CHAINLOG_MAX_32 29
-#define ZSTD_CHAINLOG_MAX_64 30
-#define ZSTD_CHAINLOG_MAX ((unsigned)(sizeof(size_t) == 4 ? ZSTD_CHAINLOG_MAX_32 : ZSTD_CHAINLOG_MAX_64))
-#define ZSTD_CHAINLOG_MIN ZSTD_HASHLOG_MIN
-#define ZSTD_HASHLOG3_MAX 17
-#define ZSTD_SEARCHLOG_MAX (ZSTD_WINDOWLOG_MAX-1)
-#define ZSTD_SEARCHLOG_MIN 1
-#define ZSTD_SEARCHLENGTH_MAX 7 /* only for ZSTD_fast, other strategies are limited to 6 */
-#define ZSTD_SEARCHLENGTH_MIN 3 /* only for ZSTD_btopt, other strategies are limited to 4 */
-#define ZSTD_TARGETLENGTH_MIN 1 /* only used by btopt, btultra and btfast */
-#define ZSTD_LDM_MINMATCH_MIN 4
-#define ZSTD_LDM_MINMATCH_MAX 4096
-#define ZSTD_LDM_BUCKETSIZELOG_MAX 8
-
-#define ZSTD_FRAMEHEADERSIZE_PREFIX 5 /* minimum input size to know frame header size */
-#define ZSTD_FRAMEHEADERSIZE_MIN 6
-#define ZSTD_FRAMEHEADERSIZE_MAX 18 /* for static allocation */
-static const size_t ZSTD_frameHeaderSize_prefix = ZSTD_FRAMEHEADERSIZE_PREFIX;
-static const size_t ZSTD_frameHeaderSize_min = ZSTD_FRAMEHEADERSIZE_MIN;
-static const size_t ZSTD_frameHeaderSize_max = ZSTD_FRAMEHEADERSIZE_MAX;
-static const size_t ZSTD_skippableHeaderSize = 8; /* magic number + skippable frame length */
+/****************************************************************************************
+ * Candidate API for promotion to stable status
+ ****************************************************************************************
+ * The following symbols and constants form the "staging area" :
+ * they are considered to join "stable API" by v1.4.0.
+ * The proposal is written so that it can be made stable "as is",
+ * though it's still possible to suggest improvements.
+ * Staging is in fact last chance for changes,
+ * the API is locked once reaching "stable" status.
+ * ***************************************************************************************/
+
+
+/* === Constants === */
+
+/* all magic numbers are supposed read/written to/from files/memory using little-endian convention */
+#define ZSTD_MAGICNUMBER 0xFD2FB528 /* valid since v0.8.0 */
+#define ZSTD_MAGIC_DICTIONARY 0xEC30A437 /* valid since v0.7.0 */
+#define ZSTD_MAGIC_SKIPPABLE_START 0x184D2A50 /* all 16 values, from 0x184D2A50 to 0x184D2A5F, signal the beginning of a skippable frame */
+#define ZSTD_MAGIC_SKIPPABLE_MASK 0xFFFFFFF0
+
+#define ZSTD_BLOCKSIZELOG_MAX 17
+#define ZSTD_BLOCKSIZE_MAX (1<<ZSTD_BLOCKSIZELOG_MAX)
+
+
+/* === query limits === */
+
+ZSTDLIB_API int ZSTD_minCLevel(void); /*!< minimum negative compression level allowed */
+
+
+/* === frame size === */
+
+/*! ZSTD_findFrameCompressedSize() :
+ * `src` should point to the start of a ZSTD frame or skippable frame.
+ * `srcSize` must be >= first frame size
+ * @return : the compressed size of the first frame starting at `src`,
+ * suitable to pass as `srcSize` to `ZSTD_decompress` or similar,
+ * or an error code if input is invalid */
+ZSTDLIB_API size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize);
+
+
+/* === Memory management === */
+
+/*! ZSTD_sizeof_*() :
+ * These functions give the _current_ memory usage of selected object.
+ * Note that object memory usage can evolve (increase or decrease) over time. */
+ZSTDLIB_API size_t ZSTD_sizeof_CCtx(const ZSTD_CCtx* cctx);
+ZSTDLIB_API size_t ZSTD_sizeof_DCtx(const ZSTD_DCtx* dctx);
+ZSTDLIB_API size_t ZSTD_sizeof_CStream(const ZSTD_CStream* zcs);
+ZSTDLIB_API size_t ZSTD_sizeof_DStream(const ZSTD_DStream* zds);
+ZSTDLIB_API size_t ZSTD_sizeof_CDict(const ZSTD_CDict* cdict);
+ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict);
+
+
+/***************************************
+* Advanced compression API
+***************************************/
+
+/* API design :
+ * Parameters are pushed one by one into an existing context,
+ * using ZSTD_CCtx_set*() functions.
+ * Pushed parameters are sticky : they are valid for next compressed frame, and any subsequent frame.
+ * "sticky" parameters are applicable to `ZSTD_compress2()` and `ZSTD_compressStream*()` !
+ * They do not apply to "simple" one-shot variants such as ZSTD_compressCCtx()
+ *
+ * It's possible to reset all parameters to "default" using ZSTD_CCtx_reset().
+ *
+ * This API supercedes all other "advanced" API entry points in the experimental section.
+ * In the future, we expect to remove from experimental API entry points which are redundant with this API.
+ */
+
+
+/* Compression strategies, listed from fastest to strongest */
+typedef enum { ZSTD_fast=1,
+ ZSTD_dfast=2,
+ ZSTD_greedy=3,
+ ZSTD_lazy=4,
+ ZSTD_lazy2=5,
+ ZSTD_btlazy2=6,
+ ZSTD_btopt=7,
+ ZSTD_btultra=8,
+ ZSTD_btultra2=9
+ /* note : new strategies _might_ be added in the future.
+ Only the order (from fast to strong) is guaranteed */
+} ZSTD_strategy;
+
+
+typedef enum {
+
+ /* compression parameters */
+ ZSTD_c_compressionLevel=100, /* Update all compression parameters according to pre-defined cLevel table
+ * Default level is ZSTD_CLEVEL_DEFAULT==3.
+ * Special: value 0 means default, which is controlled by ZSTD_CLEVEL_DEFAULT.
+ * Note 1 : it's possible to pass a negative compression level.
+ * Note 2 : setting a level sets all default values of other compression parameters */
+ ZSTD_c_windowLog=101, /* Maximum allowed back-reference distance, expressed as power of 2.
+ * Must be clamped between ZSTD_WINDOWLOG_MIN and ZSTD_WINDOWLOG_MAX.
+ * Special: value 0 means "use default windowLog".
+ * Note: Using a windowLog greater than ZSTD_WINDOWLOG_LIMIT_DEFAULT
+ * requires explicitly allowing such window size at decompression stage if using streaming. */
+ ZSTD_c_hashLog=102, /* Size of the initial probe table, as a power of 2.
+ * Resulting memory usage is (1 << (hashLog+2)).
+ * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX.
+ * Larger tables improve compression ratio of strategies <= dFast,
+ * and improve speed of strategies > dFast.
+ * Special: value 0 means "use default hashLog". */
+ ZSTD_c_chainLog=103, /* Size of the multi-probe search table, as a power of 2.
+ * Resulting memory usage is (1 << (chainLog+2)).
+ * Must be clamped between ZSTD_CHAINLOG_MIN and ZSTD_CHAINLOG_MAX.
+ * Larger tables result in better and slower compression.
+ * This parameter is useless when using "fast" strategy.
+ * It's still useful when using "dfast" strategy,
+ * in which case it defines a secondary probe table.
+ * Special: value 0 means "use default chainLog". */
+ ZSTD_c_searchLog=104, /* Number of search attempts, as a power of 2.
+ * More attempts result in better and slower compression.
+ * This parameter is useless when using "fast" and "dFast" strategies.
+ * Special: value 0 means "use default searchLog". */
+ ZSTD_c_minMatch=105, /* Minimum size of searched matches.
+ * Note that Zstandard can still find matches of smaller size,
+ * it just tweaks its search algorithm to look for this size and larger.
+ * Larger values increase compression and decompression speed, but decrease ratio.
+ * Must be clamped between ZSTD_MINMATCH_MIN and ZSTD_MINMATCH_MAX.
+ * Note that currently, for all strategies < btopt, effective minimum is 4.
+ * , for all strategies > fast, effective maximum is 6.
+ * Special: value 0 means "use default minMatchLength". */
+ ZSTD_c_targetLength=106, /* Impact of this field depends on strategy.
+ * For strategies btopt, btultra & btultra2:
+ * Length of Match considered "good enough" to stop search.
+ * Larger values make compression stronger, and slower.
+ * For strategy fast:
+ * Distance between match sampling.
+ * Larger values make compression faster, and weaker.
+ * Special: value 0 means "use default targetLength". */
+ ZSTD_c_strategy=107, /* See ZSTD_strategy enum definition.
+ * The higher the value of selected strategy, the more complex it is,
+ * resulting in stronger and slower compression.
+ * Special: value 0 means "use default strategy". */
+
+ /* LDM mode parameters */
+ ZSTD_c_enableLongDistanceMatching=160, /* Enable long distance matching.
+ * This parameter is designed to improve compression ratio
+ * for large inputs, by finding large matches at long distance.
+ * It increases memory usage and window size.
+ * Note: enabling this parameter increases default ZSTD_c_windowLog to 128 MB
+ * except when expressly set to a different value. */
+ ZSTD_c_ldmHashLog=161, /* Size of the table for long distance matching, as a power of 2.
+ * Larger values increase memory usage and compression ratio,
+ * but decrease compression speed.
+ * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX
+ * default: windowlog - 7.
+ * Special: value 0 means "automatically determine hashlog". */
+ ZSTD_c_ldmMinMatch=162, /* Minimum match size for long distance matcher.
+ * Larger/too small values usually decrease compression ratio.
+ * Must be clamped between ZSTD_LDM_MINMATCH_MIN and ZSTD_LDM_MINMATCH_MAX.
+ * Special: value 0 means "use default value" (default: 64). */
+ ZSTD_c_ldmBucketSizeLog=163, /* Log size of each bucket in the LDM hash table for collision resolution.
+ * Larger values improve collision resolution but decrease compression speed.
+ * The maximum value is ZSTD_LDM_BUCKETSIZELOG_MAX.
+ * Special: value 0 means "use default value" (default: 3). */
+ ZSTD_c_ldmHashRateLog=164, /* Frequency of inserting/looking up entries into the LDM hash table.
+ * Must be clamped between 0 and (ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN).
+ * Default is MAX(0, (windowLog - ldmHashLog)), optimizing hash table usage.
+ * Larger values improve compression speed.
+ * Deviating far from default value will likely result in a compression ratio decrease.
+ * Special: value 0 means "automatically determine hashRateLog". */
+
+ /* frame parameters */
+ ZSTD_c_contentSizeFlag=200, /* Content size will be written into frame header _whenever known_ (default:1)
+ * Content size must be known at the beginning of compression.
+ * This is automatically the case when using ZSTD_compress2(),
+ * For streaming variants, content size must be provided with ZSTD_CCtx_setPledgedSrcSize() */
+ ZSTD_c_checksumFlag=201, /* A 32-bits checksum of content is written at end of frame (default:0) */
+ ZSTD_c_dictIDFlag=202, /* When applicable, dictionary's ID is written into frame header (default:1) */
+
+ /* multi-threading parameters */
+ /* These parameters are only useful if multi-threading is enabled (compiled with build macro ZSTD_MULTITHREAD).
+ * They return an error otherwise. */
+ ZSTD_c_nbWorkers=400, /* Select how many threads will be spawned to compress in parallel.
+ * When nbWorkers >= 1, triggers asynchronous mode when used with ZSTD_compressStream*() :
+ * ZSTD_compressStream*() consumes input and flush output if possible, but immediately gives back control to caller,
+ * while compression work is performed in parallel, within worker threads.
+ * (note : a strong exception to this rule is when first invocation of ZSTD_compressStream2() sets ZSTD_e_end :
+ * in which case, ZSTD_compressStream2() delegates to ZSTD_compress2(), which is always a blocking call).
+ * More workers improve speed, but also increase memory usage.
+ * Default value is `0`, aka "single-threaded mode" : no worker is spawned, compression is performed inside Caller's thread, all invocations are blocking */
+ ZSTD_c_jobSize=401, /* Size of a compression job. This value is enforced only when nbWorkers >= 1.
+ * Each compression job is completed in parallel, so this value can indirectly impact the nb of active threads.
+ * 0 means default, which is dynamically determined based on compression parameters.
+ * Job size must be a minimum of overlap size, or 1 MB, whichever is largest.
+ * The minimum size is automatically and transparently enforced */
+ ZSTD_c_overlapLog=402, /* Control the overlap size, as a fraction of window size.
+ * The overlap size is an amount of data reloaded from previous job at the beginning of a new job.
+ * It helps preserve compression ratio, while each job is compressed in parallel.
+ * This value is enforced only when nbWorkers >= 1.
+ * Larger values increase compression ratio, but decrease speed.
+ * Possible values range from 0 to 9 :
+ * - 0 means "default" : value will be determined by the library, depending on strategy
+ * - 1 means "no overlap"
+ * - 9 means "full overlap", using a full window size.
+ * Each intermediate rank increases/decreases load size by a factor 2 :
+ * 9: full window; 8: w/2; 7: w/4; 6: w/8; 5:w/16; 4: w/32; 3:w/64; 2:w/128; 1:no overlap; 0:default
+ * default value varies between 6 and 9, depending on strategy */
+
+ /* note : additional experimental parameters are also available
+ * within the experimental section of the API.
+ * At the time of this writing, they include :
+ * ZSTD_c_rsyncable
+ * ZSTD_c_format
+ * ZSTD_c_forceMaxWindow
+ * ZSTD_c_forceAttachDict
+ * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them.
+ * note : never ever use experimentalParam? names directly;
+ * also, the enums values themselves are unstable and can still change.
+ */
+ ZSTD_c_experimentalParam1=500,
+ ZSTD_c_experimentalParam2=10,
+ ZSTD_c_experimentalParam3=1000,
+ ZSTD_c_experimentalParam4=1001
+} ZSTD_cParameter;
+
+
+typedef struct {
+ size_t error;
+ int lowerBound;
+ int upperBound;
+} ZSTD_bounds;
+
+/*! ZSTD_cParam_getBounds() :
+ * All parameters must belong to an interval with lower and upper bounds,
+ * otherwise they will either trigger an error or be automatically clamped.
+ * @return : a structure, ZSTD_bounds, which contains
+ * - an error status field, which must be tested using ZSTD_isError()
+ * - lower and upper bounds, both inclusive
+ */
+ZSTDLIB_API ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter cParam);
+
+/*! ZSTD_CCtx_setParameter() :
+ * Set one compression parameter, selected by enum ZSTD_cParameter.
+ * All parameters have valid bounds. Bounds can be queried using ZSTD_cParam_getBounds().
+ * Providing a value beyond bound will either clamp it, or trigger an error (depending on parameter).
+ * Setting a parameter is generally only possible during frame initialization (before starting compression).
+ * Exception : when using multi-threading mode (nbWorkers >= 1),
+ * the following parameters can be updated _during_ compression (within same frame):
+ * => compressionLevel, hashLog, chainLog, searchLog, minMatch, targetLength and strategy.
+ * new parameters will be active for next job only (after a flush()).
+ * @return : an error code (which can be tested using ZSTD_isError()).
+ */
+ZSTDLIB_API size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value);
+
+/*! ZSTD_CCtx_setPledgedSrcSize() :
+ * Total input data size to be compressed as a single frame.
+ * Value will be written in frame header, unless if explicitly forbidden using ZSTD_c_contentSizeFlag.
+ * This value will also be controlled at end of frame, and trigger an error if not respected.
+ * @result : 0, or an error code (which can be tested with ZSTD_isError()).
+ * Note 1 : pledgedSrcSize==0 actually means zero, aka an empty frame.
+ * In order to mean "unknown content size", pass constant ZSTD_CONTENTSIZE_UNKNOWN.
+ * ZSTD_CONTENTSIZE_UNKNOWN is default value for any new frame.
+ * Note 2 : pledgedSrcSize is only valid once, for the next frame.
+ * It's discarded at the end of the frame, and replaced by ZSTD_CONTENTSIZE_UNKNOWN.
+ * Note 3 : Whenever all input data is provided and consumed in a single round,
+ * for example with ZSTD_compress2(),
+ * or invoking immediately ZSTD_compressStream2(,,,ZSTD_e_end),
+ * this value is automatically overriden by srcSize instead.
+ */
+ZSTDLIB_API size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize);
+
+/*! ZSTD_CCtx_loadDictionary() :
+ * Create an internal CDict from `dict` buffer.
+ * Decompression will have to use same dictionary.
+ * @result : 0, or an error code (which can be tested with ZSTD_isError()).
+ * Special: Loading a NULL (or 0-size) dictionary invalidates previous dictionary,
+ * meaning "return to no-dictionary mode".
+ * Note 1 : Dictionary is sticky, it will be used for all future compressed frames.
+ * To return to "no-dictionary" situation, load a NULL dictionary (or reset parameters).
+ * Note 2 : Loading a dictionary involves building tables.
+ * It's also a CPU consuming operation, with non-negligible impact on latency.
+ * Tables are dependent on compression parameters, and for this reason,
+ * compression parameters can no longer be changed after loading a dictionary.
+ * Note 3 :`dict` content will be copied internally.
+ * Use experimental ZSTD_CCtx_loadDictionary_byReference() to reference content instead.
+ * In such a case, dictionary buffer must outlive its users.
+ * Note 4 : Use ZSTD_CCtx_loadDictionary_advanced()
+ * to precisely select how dictionary content must be interpreted. */
+ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, size_t dictSize);
+
+/*! ZSTD_CCtx_refCDict() :
+ * Reference a prepared dictionary, to be used for all next compressed frames.
+ * Note that compression parameters are enforced from within CDict,
+ * and supercede any compression parameter previously set within CCtx.
+ * The dictionary will remain valid for future compressed frames using same CCtx.
+ * @result : 0, or an error code (which can be tested with ZSTD_isError()).
+ * Special : Referencing a NULL CDict means "return to no-dictionary mode".
+ * Note 1 : Currently, only one dictionary can be managed.
+ * Referencing a new dictionary effectively "discards" any previous one.
+ * Note 2 : CDict is just referenced, its lifetime must outlive its usage within CCtx. */
+ZSTDLIB_API size_t ZSTD_CCtx_refCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict);
+
+/*! ZSTD_CCtx_refPrefix() :
+ * Reference a prefix (single-usage dictionary) for next compressed frame.
+ * A prefix is **only used once**. Tables are discarded at end of frame (ZSTD_e_end).
+ * Decompression will need same prefix to properly regenerate data.
+ * Compressing with a prefix is similar in outcome as performing a diff and compressing it,
+ * but performs much faster, especially during decompression (compression speed is tunable with compression level).
+ * @result : 0, or an error code (which can be tested with ZSTD_isError()).
+ * Special: Adding any prefix (including NULL) invalidates any previous prefix or dictionary
+ * Note 1 : Prefix buffer is referenced. It **must** outlive compression.
+ * Its content must remain unmodified during compression.
+ * Note 2 : If the intention is to diff some large src data blob with some prior version of itself,
+ * ensure that the window size is large enough to contain the entire source.
+ * See ZSTD_c_windowLog.
+ * Note 3 : Referencing a prefix involves building tables, which are dependent on compression parameters.
+ * It's a CPU consuming operation, with non-negligible impact on latency.
+ * If there is a need to use the same prefix multiple times, consider loadDictionary instead.
+ * Note 4 : By default, the prefix is interpreted as raw content (ZSTD_dm_rawContent).
+ * Use experimental ZSTD_CCtx_refPrefix_advanced() to alter dictionary interpretation. */
+ZSTDLIB_API size_t ZSTD_CCtx_refPrefix(ZSTD_CCtx* cctx,
+ const void* prefix, size_t prefixSize);
+
+
+typedef enum {
+ ZSTD_reset_session_only = 1,
+ ZSTD_reset_parameters = 2,
+ ZSTD_reset_session_and_parameters = 3
+} ZSTD_ResetDirective;
+
+/*! ZSTD_CCtx_reset() :
+ * There are 2 different things that can be reset, independently or jointly :
+ * - The session : will stop compressing current frame, and make CCtx ready to start a new one.
+ * Useful after an error, or to interrupt any ongoing compression.
+ * Any internal data not yet flushed is cancelled.
+ * Compression parameters and dictionary remain unchanged.
+ * They will be used to compress next frame.
+ * Resetting session never fails.
+ * - The parameters : changes all parameters back to "default".
+ * This removes any reference to any dictionary too.
+ * Parameters can only be changed between 2 sessions (i.e. no compression is currently ongoing)
+ * otherwise the reset fails, and function returns an error value (which can be tested using ZSTD_isError())
+ * - Both : similar to resetting the session, followed by resetting parameters.
+ */
+ZSTDLIB_API size_t ZSTD_CCtx_reset(ZSTD_CCtx* cctx, ZSTD_ResetDirective reset);
+
+
+
+/*! ZSTD_compress2() :
+ * Behave the same as ZSTD_compressCCtx(), but compression parameters are set using the advanced API.
+ * ZSTD_compress2() always starts a new frame.
+ * Should cctx hold data from a previously unfinished frame, everything about it is forgotten.
+ * - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*()
+ * - The function is always blocking, returns when compression is completed.
+ * Hint : compression runs faster if `dstCapacity` >= `ZSTD_compressBound(srcSize)`.
+ * @return : compressed size written into `dst` (<= `dstCapacity),
+ * or an error code if it fails (which can be tested using ZSTD_isError()).
+ */
+ZSTDLIB_API size_t ZSTD_compress2( ZSTD_CCtx* cctx,
+ void* dst, size_t dstCapacity,
+ const void* src, size_t srcSize);
+
+typedef enum {
+ ZSTD_e_continue=0, /* collect more data, encoder decides when to output compressed result, for optimal compression ratio */
+ ZSTD_e_flush=1, /* flush any data provided so far,
+ * it creates (at least) one new block, that can be decoded immediately on reception;
+ * frame will continue: any future data can still reference previously compressed data, improving compression. */
+ ZSTD_e_end=2 /* flush any remaining data _and_ close current frame.
+ * note that frame is only closed after compressed data is fully flushed (return value == 0).
+ * After that point, any additional data starts a new frame.
+ * note : each frame is independent (does not reference any content from previous frame). */
+} ZSTD_EndDirective;
+
+/*! ZSTD_compressStream2() :
+ * Behaves about the same as ZSTD_compressStream, with additional control on end directive.
+ * - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*()
+ * - Compression parameters cannot be changed once compression is started (save a list of exceptions in multi-threading mode)
+ * - outpot->pos must be <= dstCapacity, input->pos must be <= srcSize
+ * - outpot->pos and input->pos will be updated. They are guaranteed to remain below their respective limit.
+ * - When nbWorkers==0 (default), function is blocking : it completes its job before returning to caller.
+ * - When nbWorkers>=1, function is non-blocking : it just acquires a copy of input, and distributes jobs to internal worker threads, flush whatever is available,
+ * and then immediately returns, just indicating that there is some data remaining to be flushed.
+ * The function nonetheless guarantees forward progress : it will return only after it reads or write at least 1+ byte.
+ * - Exception : if the first call requests a ZSTD_e_end directive and provides enough dstCapacity, the function delegates to ZSTD_compress2() which is always blocking.
+ * - @return provides a minimum amount of data remaining to be flushed from internal buffers
+ * or an error code, which can be tested using ZSTD_isError().
+ * if @return != 0, flush is not fully completed, there is still some data left within internal buffers.
+ * This is useful for ZSTD_e_flush, since in this case more flushes are necessary to empty all buffers.
+ * For ZSTD_e_end, @return == 0 when internal buffers are fully flushed and frame is completed.
+ * - after a ZSTD_e_end directive, if internal buffer is not fully flushed (@return != 0),
+ * only ZSTD_e_end or ZSTD_e_flush operations are allowed.
+ * Before starting a new compression job, or changing compression parameters,
+ * it is required to fully flush internal buffers.
+ */
+ZSTDLIB_API size_t ZSTD_compressStream2( ZSTD_CCtx* cctx,
+ ZSTD_outBuffer* output,
+ ZSTD_inBuffer* input,
+ ZSTD_EndDirective endOp);
+
+
+
+/* ============================== */
+/* Advanced decompression API */
+/* ============================== */
+
+/* The advanced API pushes parameters one by one into an existing DCtx context.
+ * Parameters are sticky, and remain valid for all following frames
+ * using the same DCtx context.
+ * It's possible to reset parameters to default values using ZSTD_DCtx_reset().
+ * Note : This API is compatible with existing ZSTD_decompressDCtx() and ZSTD_decompressStream().
+ * Therefore, no new decompression function is necessary.
+ */
-/*--- Advanced types ---*/
-typedef enum { ZSTD_fast=1, ZSTD_dfast, ZSTD_greedy, ZSTD_lazy, ZSTD_lazy2,
- ZSTD_btlazy2, ZSTD_btopt, ZSTD_btultra } ZSTD_strategy; /* from faster to stronger */
+
+typedef enum {
+
+ ZSTD_d_windowLogMax=100, /* Select a size limit (in power of 2) beyond which
+ * the streaming API will refuse to allocate memory buffer
+ * in order to protect the host from unreasonable memory requirements.
+ * This parameter is only useful in streaming mode, since no internal buffer is allocated in single-pass mode.
+ * By default, a decompression context accepts window sizes <= (1 << ZSTD_WINDOWLOG_LIMIT_DEFAULT) */
+
+ /* note : additional experimental parameters are also available
+ * within the experimental section of the API.
+ * At the time of this writing, they include :
+ * ZSTD_c_format
+ * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them.
+ * note : never ever use experimentalParam? names directly
+ */
+ ZSTD_d_experimentalParam1=1000
+
+} ZSTD_dParameter;
+
+
+/*! ZSTD_dParam_getBounds() :
+ * All parameters must belong to an interval with lower and upper bounds,
+ * otherwise they will either trigger an error or be automatically clamped.
+ * @return : a structure, ZSTD_bounds, which contains
+ * - an error status field, which must be tested using ZSTD_isError()
+ * - both lower and upper bounds, inclusive
+ */
+ZSTDLIB_API ZSTD_bounds ZSTD_dParam_getBounds(ZSTD_dParameter dParam);
+
+/*! ZSTD_DCtx_setParameter() :
+ * Set one compression parameter, selected by enum ZSTD_dParameter.
+ * All parameters have valid bounds. Bounds can be queried using ZSTD_dParam_getBounds().
+ * Providing a value beyond bound will either clamp it, or trigger an error (depending on parameter).
+ * Setting a parameter is only possible during frame initialization (before starting decompression).
+ * @return : 0, or an error code (which can be tested using ZSTD_isError()).
+ */
+ZSTDLIB_API size_t ZSTD_DCtx_setParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int value);
+
+
+/*! ZSTD_DCtx_loadDictionary() :
+ * Create an internal DDict from dict buffer,
+ * to be used to decompress next frames.
+ * The dictionary remains valid for all future frames, until explicitly invalidated.
+ * @result : 0, or an error code (which can be tested with ZSTD_isError()).
+ * Special : Adding a NULL (or 0-size) dictionary invalidates any previous dictionary,
+ * meaning "return to no-dictionary mode".
+ * Note 1 : Loading a dictionary involves building tables,
+ * which has a non-negligible impact on CPU usage and latency.
+ * It's recommended to "load once, use many times", to amortize the cost
+ * Note 2 :`dict` content will be copied internally, so `dict` can be released after loading.
+ * Use ZSTD_DCtx_loadDictionary_byReference() to reference dictionary content instead.
+ * Note 3 : Use ZSTD_DCtx_loadDictionary_advanced() to take control of
+ * how dictionary content is loaded and interpreted.
+ */
+ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize);
+
+/*! ZSTD_DCtx_refDDict() :
+ * Reference a prepared dictionary, to be used to decompress next frames.
+ * The dictionary remains active for decompression of future frames using same DCtx.
+ * @result : 0, or an error code (which can be tested with ZSTD_isError()).
+ * Note 1 : Currently, only one dictionary can be managed.
+ * Referencing a new dictionary effectively "discards" any previous one.
+ * Special: referencing a NULL DDict means "return to no-dictionary mode".
+ * Note 2 : DDict is just referenced, its lifetime must outlive its usage from DCtx.
+ */
+ZSTDLIB_API size_t ZSTD_DCtx_refDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict);
+
+/*! ZSTD_DCtx_refPrefix() :
+ * Reference a prefix (single-usage dictionary) to decompress next frame.
+ * This is the reverse operation of ZSTD_CCtx_refPrefix(),
+ * and must use the same prefix as the one used during compression.
+ * Prefix is **only used once**. Reference is discarded at end of frame.
+ * End of frame is reached when ZSTD_decompressStream() returns 0.
+ * @result : 0, or an error code (which can be tested with ZSTD_isError()).
+ * Note 1 : Adding any prefix (including NULL) invalidates any previously set prefix or dictionary
+ * Note 2 : Prefix buffer is referenced. It **must** outlive decompression.
+ * Prefix buffer must remain unmodified up to the end of frame,
+ * reached when ZSTD_decompressStream() returns 0.
+ * Note 3 : By default, the prefix is treated as raw content (ZSTD_dm_rawContent).
+ * Use ZSTD_CCtx_refPrefix_advanced() to alter dictMode (Experimental section)
+ * Note 4 : Referencing a raw content prefix has almost no cpu nor memory cost.
+ * A full dictionary is more costly, as it requires building tables.
+ */
+ZSTDLIB_API size_t ZSTD_DCtx_refPrefix(ZSTD_DCtx* dctx,
+ const void* prefix, size_t prefixSize);
+
+/*! ZSTD_DCtx_reset() :
+ * Return a DCtx to clean state.
+ * Session and parameters can be reset jointly or separately.
+ * Parameters can only be reset when no active frame is being decompressed.
+ * @return : 0, or an error code, which can be tested with ZSTD_isError()
+ */
+ZSTDLIB_API size_t ZSTD_DCtx_reset(ZSTD_DCtx* dctx, ZSTD_ResetDirective reset);
+
+
+
+/****************************************************************************************
+ * experimental API (static linking only)
+ ****************************************************************************************
+ * The following symbols and constants
+ * are not planned to join "stable API" status in the near future.
+ * They can still change in future versions.
+ * Some of them are planned to remain in the static_only section indefinitely.
+ * Some of them might be removed in the future (especially when redundant with existing stable functions)
+ * ***************************************************************************************/
+
+#define ZSTD_FRAMEHEADERSIZE_PREFIX 5 /* minimum input size required to query frame header size */
+#define ZSTD_FRAMEHEADERSIZE_MIN 6
+#define ZSTD_FRAMEHEADERSIZE_MAX 18 /* can be useful for static allocation */
+#define ZSTD_SKIPPABLEHEADERSIZE 8
+
+/* compression parameter bounds */
+#define ZSTD_WINDOWLOG_MAX_32 30
+#define ZSTD_WINDOWLOG_MAX_64 31
+#define ZSTD_WINDOWLOG_MAX ((int)(sizeof(size_t) == 4 ? ZSTD_WINDOWLOG_MAX_32 : ZSTD_WINDOWLOG_MAX_64))
+#define ZSTD_WINDOWLOG_MIN 10
+#define ZSTD_HASHLOG_MAX ((ZSTD_WINDOWLOG_MAX < 30) ? ZSTD_WINDOWLOG_MAX : 30)
+#define ZSTD_HASHLOG_MIN 6
+#define ZSTD_CHAINLOG_MAX_32 29
+#define ZSTD_CHAINLOG_MAX_64 30
+#define ZSTD_CHAINLOG_MAX ((int)(sizeof(size_t) == 4 ? ZSTD_CHAINLOG_MAX_32 : ZSTD_CHAINLOG_MAX_64))
+#define ZSTD_CHAINLOG_MIN ZSTD_HASHLOG_MIN
+#define ZSTD_SEARCHLOG_MAX (ZSTD_WINDOWLOG_MAX-1)
+#define ZSTD_SEARCHLOG_MIN 1
+#define ZSTD_MINMATCH_MAX 7 /* only for ZSTD_fast, other strategies are limited to 6 */
+#define ZSTD_MINMATCH_MIN 3 /* only for ZSTD_btopt+, faster strategies are limited to 4 */
+#define ZSTD_TARGETLENGTH_MAX ZSTD_BLOCKSIZE_MAX
+#define ZSTD_TARGETLENGTH_MIN 0 /* note : comparing this constant to an unsigned results in a tautological test */
+#define ZSTD_STRATEGY_MIN ZSTD_fast
+#define ZSTD_STRATEGY_MAX ZSTD_btultra2
+
+
+#define ZSTD_OVERLAPLOG_MIN 0
+#define ZSTD_OVERLAPLOG_MAX 9
+
+#define ZSTD_WINDOWLOG_LIMIT_DEFAULT 27 /* by default, the streaming decoder will refuse any frame
+ * requiring larger than (1<<ZSTD_WINDOWLOG_LIMIT_DEFAULT) window size,
+ * to preserve host's memory from unreasonable requirements.
+ * This limit can be overriden using ZSTD_DCtx_setParameter(,ZSTD_d_windowLogMax,).
+ * The limit does not apply for one-pass decoders (such as ZSTD_decompress()), since no additional memory is allocated */
+
+
+/* LDM parameter bounds */
+#define ZSTD_LDM_HASHLOG_MIN ZSTD_HASHLOG_MIN
+#define ZSTD_LDM_HASHLOG_MAX ZSTD_HASHLOG_MAX
+#define ZSTD_LDM_MINMATCH_MIN 4
+#define ZSTD_LDM_MINMATCH_MAX 4096
+#define ZSTD_LDM_BUCKETSIZELOG_MIN 1
+#define ZSTD_LDM_BUCKETSIZELOG_MAX 8
+#define ZSTD_LDM_HASHRATELOG_MIN 0
+#define ZSTD_LDM_HASHRATELOG_MAX (ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN)
+
+/* internal */
+#define ZSTD_HASHLOG3_MAX 17
+
+
+/* --- Advanced types --- */
+
+typedef struct ZSTD_CCtx_params_s ZSTD_CCtx_params;
typedef struct {
- unsigned windowLog; /**< largest match distance : larger == more compression, more memory needed during decompression */
- unsigned chainLog; /**< fully searched segment : larger == more compression, slower, more memory (useless for fast) */
- unsigned hashLog; /**< dispatch table : larger == faster, more memory */
- unsigned searchLog; /**< nb of searches : larger == more compression, slower */
- unsigned searchLength; /**< match length searched : larger == faster decompression, sometimes less compression */
- unsigned targetLength; /**< acceptable match size for optimal parser (only) : larger == more compression, slower */
- ZSTD_strategy strategy;
+ unsigned windowLog; /**< largest match distance : larger == more compression, more memory needed during decompression */
+ unsigned chainLog; /**< fully searched segment : larger == more compression, slower, more memory (useless for fast) */
+ unsigned hashLog; /**< dispatch table : larger == faster, more memory */
+ unsigned searchLog; /**< nb of searches : larger == more compression, slower */
+ unsigned minMatch; /**< match length searched : larger == faster decompression, sometimes less compression */
+ unsigned targetLength; /**< acceptable match size for optimal parser (only) : larger == more compression, slower */
+ ZSTD_strategy strategy; /**< see ZSTD_strategy definition above */
} ZSTD_compressionParameters;
typedef struct {
- unsigned contentSizeFlag; /**< 1: content size will be in frame header (when known) */
- unsigned checksumFlag; /**< 1: generate a 32-bits checksum at end of frame, for error detection */
- unsigned noDictIDFlag; /**< 1: no dictID will be saved into frame header (if dictionary compression) */
+ int contentSizeFlag; /**< 1: content size will be in frame header (when known) */
+ int checksumFlag; /**< 1: generate a 32-bits checksum using XXH64 algorithm at end of frame, for error detection */
+ int noDictIDFlag; /**< 1: no dictID will be saved into frame header (dictID is only useful for dictionary compression) */
} ZSTD_frameParameters;
typedef struct {
@@ -429,33 +1005,70 @@ typedef struct {
ZSTD_frameParameters fParams;
} ZSTD_parameters;
-typedef struct ZSTD_CCtx_params_s ZSTD_CCtx_params;
-
typedef enum {
- ZSTD_dct_auto=0, /* dictionary is "full" when starting with ZSTD_MAGIC_DICTIONARY, otherwise it is "rawContent" */
- ZSTD_dct_rawContent, /* ensures dictionary is always loaded as rawContent, even if it starts with ZSTD_MAGIC_DICTIONARY */
- ZSTD_dct_fullDict /* refuses to load a dictionary if it does not respect Zstandard's specification */
+ ZSTD_dct_auto = 0, /* dictionary is "full" when starting with ZSTD_MAGIC_DICTIONARY, otherwise it is "rawContent" */
+ ZSTD_dct_rawContent = 1, /* ensures dictionary is always loaded as rawContent, even if it starts with ZSTD_MAGIC_DICTIONARY */
+ ZSTD_dct_fullDict = 2 /* refuses to load a dictionary if it does not respect Zstandard's specification, starting with ZSTD_MAGIC_DICTIONARY */
} ZSTD_dictContentType_e;
typedef enum {
- ZSTD_dlm_byCopy = 0, /**< Copy dictionary content internally */
- ZSTD_dlm_byRef, /**< Reference dictionary content -- the dictionary buffer must outlive its users. */
+ ZSTD_dlm_byCopy = 0, /**< Copy dictionary content internally */
+ ZSTD_dlm_byRef = 1, /**< Reference dictionary content -- the dictionary buffer must outlive its users. */
} ZSTD_dictLoadMethod_e;
+typedef enum {
+ /* Opened question : should we have a format ZSTD_f_auto ?
+ * Today, it would mean exactly the same as ZSTD_f_zstd1.
+ * But, in the future, should several formats become supported,
+ * on the compression side, it would mean "default format".
+ * On the decompression side, it would mean "automatic format detection",
+ * so that ZSTD_f_zstd1 would mean "accept *only* zstd frames".
+ * Since meaning is a little different, another option could be to define different enums for compression and decompression.
+ * This question could be kept for later, when there are actually multiple formats to support,
+ * but there is also the question of pinning enum values, and pinning value `0` is especially important */
+ ZSTD_f_zstd1 = 0, /* zstd frame format, specified in zstd_compression_format.md (default) */
+ ZSTD_f_zstd1_magicless = 1, /* Variant of zstd frame format, without initial 4-bytes magic number.
+ * Useful to save 4 bytes per generated frame.
+ * Decoder cannot recognise automatically this format, requiring this instruction. */
+} ZSTD_format_e;
+
+typedef enum {
+ /* Note: this enum and the behavior it controls are effectively internal
+ * implementation details of the compressor. They are expected to continue
+ * to evolve and should be considered only in the context of extremely
+ * advanced performance tuning.
+ *
+ * Zstd currently supports the use of a CDict in two ways:
+ *
+ * - The contents of the CDict can be copied into the working context. This
+ * means that the compression can search both the dictionary and input
+ * while operating on a single set of internal tables. This makes
+ * the compression faster per-byte of input. However, the initial copy of
+ * the CDict's tables incurs a fixed cost at the beginning of the
+ * compression. For small compressions (< 8 KB), that copy can dominate
+ * the cost of the compression.
+ *
+ * - The CDict's tables can be used in-place. In this model, compression is
+ * slower per input byte, because the compressor has to search two sets of
+ * tables. However, this model incurs no start-up cost (as long as the
+ * working context's tables can be reused). For small inputs, this can be
+ * faster than copying the CDict's tables.
+ *
+ * Zstd has a simple internal heuristic that selects which strategy to use
+ * at the beginning of a compression. However, if experimentation shows that
+ * Zstd is making poor choices, it is possible to override that choice with
+ * this enum.
+ */
+ ZSTD_dictDefaultAttach = 0, /* Use the default heuristic. */
+ ZSTD_dictForceAttach = 1, /* Never copy the dictionary. */
+ ZSTD_dictForceCopy = 2, /* Always copy the dictionary. */
+} ZSTD_dictAttachPref_e;
/***************************************
* Frame size functions
***************************************/
-/*! ZSTD_findFrameCompressedSize() :
- * `src` should point to the start of a ZSTD encoded frame or skippable frame
- * `srcSize` must be >= first frame size
- * @return : the compressed size of the first frame starting at `src`,
- * suitable to pass to `ZSTD_decompress` or similar,
- * or an error code if input is invalid */
-ZSTDLIB_API size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize);
-
/*! ZSTD_findDecompressedSize() :
* `src` should point the start of a series of ZSTD encoded and/or skippable frames
* `srcSize` must be the _exact_ size of this series
@@ -480,9 +1093,9 @@ ZSTDLIB_API size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize)
ZSTDLIB_API unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize);
/*! ZSTD_frameHeaderSize() :
-* `src` should point to the start of a ZSTD frame
-* `srcSize` must be >= ZSTD_frameHeaderSize_prefix.
-* @return : size of the Frame Header */
+ * srcSize must be >= ZSTD_FRAMEHEADERSIZE_PREFIX.
+ * @return : size of the Frame Header,
+ * or an error code (if srcSize is too small) */
ZSTDLIB_API size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize);
@@ -490,16 +1103,6 @@ ZSTDLIB_API size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize);
* Memory management
***************************************/
-/*! ZSTD_sizeof_*() :
- * These functions give the current memory usage of selected object.
- * Object memory usage can evolve when re-used. */
-ZSTDLIB_API size_t ZSTD_sizeof_CCtx(const ZSTD_CCtx* cctx);
-ZSTDLIB_API size_t ZSTD_sizeof_DCtx(const ZSTD_DCtx* dctx);
-ZSTDLIB_API size_t ZSTD_sizeof_CStream(const ZSTD_CStream* zcs);
-ZSTDLIB_API size_t ZSTD_sizeof_DStream(const ZSTD_DStream* zds);
-ZSTDLIB_API size_t ZSTD_sizeof_CDict(const ZSTD_CDict* cdict);
-ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict);
-
/*! ZSTD_estimate*() :
* These functions make it possible to estimate memory usage
* of a future {D,C}Ctx, before its creation.
@@ -507,7 +1110,7 @@ ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict);
* It will also consider src size to be arbitrarily "large", which is worst case.
* If srcSize is known to always be small, ZSTD_estimateCCtxSize_usingCParams() can provide a tighter estimation.
* ZSTD_estimateCCtxSize_usingCParams() can be used in tandem with ZSTD_getCParams() to create cParams from compressionLevel.
- * ZSTD_estimateCCtxSize_usingCCtxParams() can be used in tandem with ZSTD_CCtxParam_setParameter(). Only single-threaded compression is supported. This function will return an error code if ZSTD_p_nbWorkers is >= 1.
+ * ZSTD_estimateCCtxSize_usingCCtxParams() can be used in tandem with ZSTD_CCtxParam_setParameter(). Only single-threaded compression is supported. This function will return an error code if ZSTD_c_nbWorkers is >= 1.
* Note : CCtx size estimation is only correct for single-threaded compression. */
ZSTDLIB_API size_t ZSTD_estimateCCtxSize(int compressionLevel);
ZSTDLIB_API size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams);
@@ -519,7 +1122,7 @@ ZSTDLIB_API size_t ZSTD_estimateDCtxSize(void);
* It will also consider src size to be arbitrarily "large", which is worst case.
* If srcSize is known to always be small, ZSTD_estimateCStreamSize_usingCParams() can provide a tighter estimation.
* ZSTD_estimateCStreamSize_usingCParams() can be used in tandem with ZSTD_getCParams() to create cParams from compressionLevel.
- * ZSTD_estimateCStreamSize_usingCCtxParams() can be used in tandem with ZSTD_CCtxParam_setParameter(). Only single-threaded compression is supported. This function will return an error code if ZSTD_p_nbWorkers is >= 1.
+ * ZSTD_estimateCStreamSize_usingCCtxParams() can be used in tandem with ZSTD_CCtxParam_setParameter(). Only single-threaded compression is supported. This function will return an error code if ZSTD_c_nbWorkers is >= 1.
* Note : CStream size estimation is only correct for single-threaded compression.
* ZSTD_DStream memory budget depends on window Size.
* This information can be passed manually, using ZSTD_estimateDStreamSize,
@@ -582,6 +1185,7 @@ ZSTDLIB_API const ZSTD_DDict* ZSTD_initStaticDDict(
ZSTD_dictLoadMethod_e dictLoadMethod,
ZSTD_dictContentType_e dictContentType);
+
/*! Custom memory allocation :
* These prototypes make it possible to pass your own allocation/free functions.
* ZSTD_customMem is provided at creation time, using ZSTD_create*_advanced() variants listed below.
@@ -616,8 +1220,9 @@ ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict_advanced(const void* dict, size_t dictS
/*! ZSTD_createCDict_byReference() :
* Create a digested dictionary for compression
- * Dictionary content is simply referenced, and therefore stays in dictBuffer.
- * It is important that dictBuffer outlives CDict, it must remain read accessible throughout the lifetime of CDict */
+ * Dictionary content is just referenced, not duplicated.
+ * As a consequence, `dictBuffer` **must** outlive CDict,
+ * and its content must remain unmodified throughout the lifetime of CDict. */
ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict_byReference(const void* dictBuffer, size_t dictSize, int compressionLevel);
/*! ZSTD_getCParams() :
@@ -640,22 +1245,161 @@ ZSTDLIB_API size_t ZSTD_checkCParams(ZSTD_compressionParameters params);
ZSTDLIB_API ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize);
/*! ZSTD_compress_advanced() :
-* Same as ZSTD_compress_usingDict(), with fine-tune control over each compression parameter */
-ZSTDLIB_API size_t ZSTD_compress_advanced (ZSTD_CCtx* cctx,
- void* dst, size_t dstCapacity,
- const void* src, size_t srcSize,
- const void* dict,size_t dictSize,
- ZSTD_parameters params);
+ * Same as ZSTD_compress_usingDict(), with fine-tune control over compression parameters (by structure) */
+ZSTDLIB_API size_t ZSTD_compress_advanced(ZSTD_CCtx* cctx,
+ void* dst, size_t dstCapacity,
+ const void* src, size_t srcSize,
+ const void* dict,size_t dictSize,
+ ZSTD_parameters params);
/*! ZSTD_compress_usingCDict_advanced() :
-* Same as ZSTD_compress_usingCDict(), with fine-tune control over frame parameters */
+ * Same as ZSTD_compress_usingCDict(), with fine-tune control over frame parameters */
ZSTDLIB_API size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx,
- void* dst, size_t dstCapacity,
- const void* src, size_t srcSize,
- const ZSTD_CDict* cdict, ZSTD_frameParameters fParams);
+ void* dst, size_t dstCapacity,
+ const void* src, size_t srcSize,
+ const ZSTD_CDict* cdict,
+ ZSTD_frameParameters fParams);
+
+
+/*! ZSTD_CCtx_loadDictionary_byReference() :
+ * Same as ZSTD_CCtx_loadDictionary(), but dictionary content is referenced, instead of being copied into CCtx.
+ * It saves some memory, but also requires that `dict` outlives its usage within `cctx` */
+ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary_byReference(ZSTD_CCtx* cctx, const void* dict, size_t dictSize);
+
+/*! ZSTD_CCtx_loadDictionary_advanced() :
+ * Same as ZSTD_CCtx_loadDictionary(), but gives finer control over
+ * how to load the dictionary (by copy ? by reference ?)
+ * and how to interpret it (automatic ? force raw mode ? full mode only ?) */
+ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType);
+
+/*! ZSTD_CCtx_refPrefix_advanced() :
+ * Same as ZSTD_CCtx_refPrefix(), but gives finer control over
+ * how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?) */
+ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType);
+
+/* === experimental parameters === */
+/* these parameters can be used with ZSTD_setParameter()
+ * they are not guaranteed to remain supported in the future */
+
+ /* Enables rsyncable mode,
+ * which makes compressed files more rsync friendly
+ * by adding periodic synchronization points to the compressed data.
+ * The target average block size is ZSTD_c_jobSize / 2.
+ * It's possible to modify the job size to increase or decrease
+ * the granularity of the synchronization point.
+ * Once the jobSize is smaller than the window size,
+ * it will result in compression ratio degradation.
+ * NOTE 1: rsyncable mode only works when multithreading is enabled.
+ * NOTE 2: rsyncable performs poorly in combination with long range mode,
+ * since it will decrease the effectiveness of synchronization points,
+ * though mileage may vary.
+ * NOTE 3: Rsyncable mode limits maximum compression speed to ~400 MB/s.
+ * If the selected compression level is already running significantly slower,
+ * the overall speed won't be significantly impacted.
+ */
+ #define ZSTD_c_rsyncable ZSTD_c_experimentalParam1
+
+/* Select a compression format.
+ * The value must be of type ZSTD_format_e.
+ * See ZSTD_format_e enum definition for details */
+#define ZSTD_c_format ZSTD_c_experimentalParam2
+
+/* Force back-reference distances to remain < windowSize,
+ * even when referencing into Dictionary content (default:0) */
+#define ZSTD_c_forceMaxWindow ZSTD_c_experimentalParam3
+
+/* Controls whether the contents of a CDict
+ * are used in place, or copied into the working context.
+ * Accepts values from the ZSTD_dictAttachPref_e enum.
+ * See the comments on that enum for an explanation of the feature. */
+#define ZSTD_c_forceAttachDict ZSTD_c_experimentalParam4
+
+/*! ZSTD_CCtx_getParameter() :
+ * Get the requested compression parameter value, selected by enum ZSTD_cParameter,
+ * and store it into int* value.
+ * @return : 0, or an error code (which can be tested with ZSTD_isError()).
+ */
+ZSTDLIB_API size_t ZSTD_CCtx_getParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int* value);
+
+
+/*! ZSTD_CCtx_params :
+ * Quick howto :
+ * - ZSTD_createCCtxParams() : Create a ZSTD_CCtx_params structure
+ * - ZSTD_CCtxParam_setParameter() : Push parameters one by one into
+ * an existing ZSTD_CCtx_params structure.
+ * This is similar to
+ * ZSTD_CCtx_setParameter().
+ * - ZSTD_CCtx_setParametersUsingCCtxParams() : Apply parameters to
+ * an existing CCtx.
+ * These parameters will be applied to
+ * all subsequent frames.
+ * - ZSTD_compressStream2() : Do compression using the CCtx.
+ * - ZSTD_freeCCtxParams() : Free the memory.
+ *
+ * This can be used with ZSTD_estimateCCtxSize_advanced_usingCCtxParams()
+ * for static allocation of CCtx for single-threaded compression.
+ */
+ZSTDLIB_API ZSTD_CCtx_params* ZSTD_createCCtxParams(void);
+ZSTDLIB_API size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params);
+
+/*! ZSTD_CCtxParams_reset() :
+ * Reset params to default values.
+ */
+ZSTDLIB_API size_t ZSTD_CCtxParams_reset(ZSTD_CCtx_params* params);
+
+/*! ZSTD_CCtxParams_init() :
+ * Initializes the compression parameters of cctxParams according to
+ * compression level. All other parameters are reset to their default values.
+ */
+ZSTDLIB_API size_t ZSTD_CCtxParams_init(ZSTD_CCtx_params* cctxParams, int compressionLevel);
+
+/*! ZSTD_CCtxParams_init_advanced() :
+ * Initializes the compression and frame parameters of cctxParams according to
+ * params. All other parameters are reset to their default values.
+ */
+ZSTDLIB_API size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, ZSTD_parameters params);
+
+/*! ZSTD_CCtxParam_setParameter() :
+ * Similar to ZSTD_CCtx_setParameter.
+ * Set one compression parameter, selected by enum ZSTD_cParameter.
+ * Parameters must be applied to a ZSTD_CCtx using ZSTD_CCtx_setParametersUsingCCtxParams().
+ * @result : 0, or an error code (which can be tested with ZSTD_isError()).
+ */
+ZSTDLIB_API size_t ZSTD_CCtxParam_setParameter(ZSTD_CCtx_params* params, ZSTD_cParameter param, int value);
+
+/*! ZSTD_CCtxParam_getParameter() :
+ * Similar to ZSTD_CCtx_getParameter.
+ * Get the requested value of one compression parameter, selected by enum ZSTD_cParameter.
+ * @result : 0, or an error code (which can be tested with ZSTD_isError()).
+ */
+ZSTDLIB_API size_t ZSTD_CCtxParam_getParameter(ZSTD_CCtx_params* params, ZSTD_cParameter param, int* value);
+
+/*! ZSTD_CCtx_setParametersUsingCCtxParams() :
+ * Apply a set of ZSTD_CCtx_params to the compression context.
+ * This can be done even after compression is started,
+ * if nbWorkers==0, this will have no impact until a new compression is started.
+ * if nbWorkers>=1, new parameters will be picked up at next job,
+ * with a few restrictions (windowLog, pledgedSrcSize, nbWorkers, jobSize, and overlapLog are not updated).
+ */
+ZSTDLIB_API size_t ZSTD_CCtx_setParametersUsingCCtxParams(
+ ZSTD_CCtx* cctx, const ZSTD_CCtx_params* params);
+
+/*! ZSTD_compressStream2_simpleArgs() :
+ * Same as ZSTD_compressStream2(),
+ * but using only integral types as arguments.
+ * This variant might be helpful for binders from dynamic languages
+ * which have troubles handling structures containing memory pointers.
+ */
+ZSTDLIB_API size_t ZSTD_compressStream2_simpleArgs (
+ ZSTD_CCtx* cctx,
+ void* dst, size_t dstCapacity, size_t* dstPos,
+ const void* src, size_t srcSize, size_t* srcPos,
+ ZSTD_EndDirective endOp);
-/*--- Advanced decompression functions ---*/
+/***************************************
+* Advanced decompression functions
+***************************************/
/*! ZSTD_isFrame() :
* Tells if the content of `buffer` starts with a valid Frame Identifier.
@@ -696,9 +1440,64 @@ ZSTDLIB_API unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict);
* When identifying the exact failure cause, it's possible to use ZSTD_getFrameHeader(), which will provide a more precise error code. */
ZSTDLIB_API unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize);
+/*! ZSTD_DCtx_loadDictionary_byReference() :
+ * Same as ZSTD_DCtx_loadDictionary(),
+ * but references `dict` content instead of copying it into `dctx`.
+ * This saves memory if `dict` remains around.,
+ * However, it's imperative that `dict` remains accessible (and unmodified) while being used, so it must outlive decompression. */
+ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary_byReference(ZSTD_DCtx* dctx, const void* dict, size_t dictSize);
+
+/*! ZSTD_DCtx_loadDictionary_advanced() :
+ * Same as ZSTD_DCtx_loadDictionary(),
+ * but gives direct control over
+ * how to load the dictionary (by copy ? by reference ?)
+ * and how to interpret it (automatic ? force raw mode ? full mode only ?). */
+ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary_advanced(ZSTD_DCtx* dctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType);
+
+/*! ZSTD_DCtx_refPrefix_advanced() :
+ * Same as ZSTD_DCtx_refPrefix(), but gives finer control over
+ * how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?) */
+ZSTDLIB_API size_t ZSTD_DCtx_refPrefix_advanced(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType);
+
+/*! ZSTD_DCtx_setMaxWindowSize() :
+ * Refuses allocating internal buffers for frames requiring a window size larger than provided limit.
+ * This protects a decoder context from reserving too much memory for itself (potential attack scenario).
+ * This parameter is only useful in streaming mode, since no internal buffer is allocated in single-pass mode.
+ * By default, a decompression context accepts all window sizes <= (1 << ZSTD_WINDOWLOG_LIMIT_DEFAULT)
+ * @return : 0, or an error code (which can be tested using ZSTD_isError()).
+ */
+ZSTDLIB_API size_t ZSTD_DCtx_setMaxWindowSize(ZSTD_DCtx* dctx, size_t maxWindowSize);
+
+/* ZSTD_d_format
+ * experimental parameter,
+ * allowing selection between ZSTD_format_e input compression formats
+ */
+#define ZSTD_d_format ZSTD_d_experimentalParam1
+
+/*! ZSTD_DCtx_setFormat() :
+ * Instruct the decoder context about what kind of data to decode next.
+ * This instruction is mandatory to decode data without a fully-formed header,
+ * such ZSTD_f_zstd1_magicless for example.
+ * @return : 0, or an error code (which can be tested using ZSTD_isError()). */
+ZSTDLIB_API size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format);
+
+/*! ZSTD_decompressStream_simpleArgs() :
+ * Same as ZSTD_decompressStream(),
+ * but using only integral types as arguments.
+ * This can be helpful for binders from dynamic languages
+ * which have troubles handling structures containing memory pointers.
+ */
+ZSTDLIB_API size_t ZSTD_decompressStream_simpleArgs (
+ ZSTD_DCtx* dctx,
+ void* dst, size_t dstCapacity, size_t* dstPos,
+ const void* src, size_t srcSize, size_t* srcPos);
+
/********************************************************************
* Advanced streaming functions
+* Warning : most of these functions are now redundant with the Advanced API.
+* Once Advanced API reaches "stable" status,
+* redundant functions will be deprecated, and then at some point removed.
********************************************************************/
/*===== Advanced Streaming compression functions =====*/
@@ -710,36 +1509,52 @@ ZSTDLIB_API size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDi
ZSTDLIB_API size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs, const ZSTD_CDict* cdict, ZSTD_frameParameters fParams, unsigned long long pledgedSrcSize); /**< same as ZSTD_initCStream_usingCDict(), with control over frame parameters. pledgedSrcSize must be correct. If srcSize is not known at init time, use value ZSTD_CONTENTSIZE_UNKNOWN. */
/*! ZSTD_resetCStream() :
- * start a new compression job, using same parameters from previous job.
- * This is typically useful to skip dictionary loading stage, since it will re-use it in-place..
+ * start a new frame, using same parameters from previous frame.
+ * This is typically useful to skip dictionary loading stage, since it will re-use it in-place.
* Note that zcs must be init at least once before using ZSTD_resetCStream().
* If pledgedSrcSize is not known at reset time, use macro ZSTD_CONTENTSIZE_UNKNOWN.
* If pledgedSrcSize > 0, its value must be correct, as it will be written in header, and controlled at the end.
* For the time being, pledgedSrcSize==0 is interpreted as "srcSize unknown" for compatibility with older programs,
* but it will change to mean "empty" in future version, so use macro ZSTD_CONTENTSIZE_UNKNOWN instead.
- * @return : 0, or an error code (which can be tested using ZSTD_isError()) */
+ * @return : 0, or an error code (which can be tested using ZSTD_isError())
+ */
ZSTDLIB_API size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize);
typedef struct {
- unsigned long long ingested;
- unsigned long long consumed;
- unsigned long long produced;
+ unsigned long long ingested; /* nb input bytes read and buffered */
+ unsigned long long consumed; /* nb input bytes actually compressed */
+ unsigned long long produced; /* nb of compressed bytes generated and buffered */
+ unsigned long long flushed; /* nb of compressed bytes flushed : not provided; can be tracked from caller side */
+ unsigned currentJobID; /* MT only : latest started job nb */
+ unsigned nbActiveWorkers; /* MT only : nb of workers actively compressing at probe time */
} ZSTD_frameProgression;
-/* ZSTD_getFrameProgression():
+/* ZSTD_getFrameProgression() :
* tells how much data has been ingested (read from input)
* consumed (input actually compressed) and produced (output) for current frame.
- * Therefore, (ingested - consumed) is amount of input data buffered internally, not yet compressed.
- * Can report progression inside worker threads (multi-threading and non-blocking mode).
+ * Note : (ingested - consumed) is amount of input data buffered internally, not yet compressed.
+ * Aggregates progression inside active worker threads.
*/
-ZSTD_frameProgression ZSTD_getFrameProgression(const ZSTD_CCtx* cctx);
-
+ZSTDLIB_API ZSTD_frameProgression ZSTD_getFrameProgression(const ZSTD_CCtx* cctx);
+
+/*! ZSTD_toFlushNow() :
+ * Tell how many bytes are ready to be flushed immediately.
+ * Useful for multithreading scenarios (nbWorkers >= 1).
+ * Probe the oldest active job, defined as oldest job not yet entirely flushed,
+ * and check its output buffer.
+ * @return : amount of data stored in oldest job and ready to be flushed immediately.
+ * if @return == 0, it means either :
+ * + there is no active job (could be checked with ZSTD_frameProgression()), or
+ * + oldest job is still actively compressing data,
+ * but everything it has produced has also been flushed so far,
+ * therefore flush speed is limited by production speed of oldest job
+ * irrespective of the speed of concurrent (and newer) jobs.
+ */
+ZSTDLIB_API size_t ZSTD_toFlushNow(ZSTD_CCtx* cctx);
/*===== Advanced Streaming decompression functions =====*/
-typedef enum { DStream_p_maxWindowSize } ZSTD_DStreamParameter_e;
-ZSTDLIB_API size_t ZSTD_setDStreamParameter(ZSTD_DStream* zds, ZSTD_DStreamParameter_e paramType, unsigned paramValue); /* obsolete : this API will be removed in a future version */
ZSTDLIB_API size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize); /**< note: no dictionary will be used if dict == NULL or dictSize < 8 */
ZSTDLIB_API size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* zds, const ZSTD_DDict* ddict); /**< note : ddict is referenced, it must outlive decompression session */
ZSTDLIB_API size_t ZSTD_resetDStream(ZSTD_DStream* zds); /**< re-use decompression parameters from previous init; saves dictionary loading */
@@ -880,7 +1695,17 @@ typedef struct {
unsigned dictID;
unsigned checksumFlag;
} ZSTD_frameHeader;
+
+/** ZSTD_getFrameHeader() :
+ * decode Frame Header, or requires larger `srcSize`.
+ * @return : 0, `zfhPtr` is correctly filled,
+ * >0, `srcSize` is too small, value is wanted `srcSize` amount,
+ * or an error code, which can be tested using ZSTD_isError() */
ZSTDLIB_API size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize); /**< doesn't consume input */
+/*! ZSTD_getFrameHeader_advanced() :
+ * same as ZSTD_getFrameHeader(),
+ * with added capability to select a format (like ZSTD_f_zstd1_magicless) */
+ZSTDLIB_API size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format);
ZSTDLIB_API size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long long frameContentSize); /**< when frame content size is not known, pass in frameContentSize == ZSTD_CONTENTSIZE_UNKNOWN */
ZSTDLIB_API size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx);
@@ -897,462 +1722,6 @@ ZSTDLIB_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx);
-/* ============================================ */
-/** New advanced API (experimental) */
-/* ============================================ */
-
-/* notes on API design :
- * In this proposal, parameters are pushed one by one into an existing context,
- * and then applied on all subsequent compression jobs.
- * When no parameter is ever provided, CCtx is created with compression level ZSTD_CLEVEL_DEFAULT.
- *
- * This API is intended to replace all others advanced / experimental API entry points.
- * But it stands a reasonable chance to become "stable", after a reasonable testing period.
- */
-
-/* note on naming convention :
- * Initially, the API favored names like ZSTD_setCCtxParameter() .
- * In this proposal, convention is changed towards ZSTD_CCtx_setParameter() .
- * The main driver is that it identifies more clearly the target object type.
- * It feels clearer when considering multiple targets :
- * ZSTD_CDict_setParameter() (rather than ZSTD_setCDictParameter())
- * ZSTD_CCtxParams_setParameter() (rather than ZSTD_setCCtxParamsParameter() )
- * etc...
- */
-
-/* note on enum design :
- * All enum will be pinned to explicit values before reaching "stable API" status */
-
-typedef enum {
- /* Opened question : should we have a format ZSTD_f_auto ?
- * Today, it would mean exactly the same as ZSTD_f_zstd1.
- * But, in the future, should several formats become supported,
- * on the compression side, it would mean "default format".
- * On the decompression side, it would mean "automatic format detection",
- * so that ZSTD_f_zstd1 would mean "accept *only* zstd frames".
- * Since meaning is a little different, another option could be to define different enums for compression and decompression.
- * This question could be kept for later, when there are actually multiple formats to support,
- * but there is also the question of pinning enum values, and pinning value `0` is especially important */
- ZSTD_f_zstd1 = 0, /* zstd frame format, specified in zstd_compression_format.md (default) */
- ZSTD_f_zstd1_magicless, /* Variant of zstd frame format, without initial 4-bytes magic number.
- * Useful to save 4 bytes per generated frame.
- * Decoder cannot recognise automatically this format, requiring instructions. */
-} ZSTD_format_e;
-
-typedef enum {
- /* compression format */
- ZSTD_p_format = 10, /* See ZSTD_format_e enum definition.
- * Cast selected format as unsigned for ZSTD_CCtx_setParameter() compatibility. */
-
- /* compression parameters */
- ZSTD_p_compressionLevel=100, /* Update all compression parameters according to pre-defined cLevel table
- * Default level is ZSTD_CLEVEL_DEFAULT==3.
- * Special: value 0 means "do not change cLevel".
- * Note 1 : it's possible to pass a negative compression level by casting it to unsigned type.
- * Note 2 : setting a level sets all default values of other compression parameters.
- * Note 3 : setting compressionLevel automatically updates ZSTD_p_compressLiterals. */
- ZSTD_p_windowLog, /* Maximum allowed back-reference distance, expressed as power of 2.
- * Must be clamped between ZSTD_WINDOWLOG_MIN and ZSTD_WINDOWLOG_MAX.
- * Special: value 0 means "use default windowLog".
- * Note: Using a window size greater than ZSTD_MAXWINDOWSIZE_DEFAULT (default: 2^27)
- * requires explicitly allowing such window size during decompression stage. */
- ZSTD_p_hashLog, /* Size of the probe table, as a power of 2.
- * Resulting table size is (1 << (hashLog+2)).
- * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX.
- * Larger tables improve compression ratio of strategies <= dFast,
- * and improve speed of strategies > dFast.
- * Special: value 0 means "use default hashLog". */
- ZSTD_p_chainLog, /* Size of the full-search table, as a power of 2.
- * Resulting table size is (1 << (chainLog+2)).
- * Larger tables result in better and slower compression.
- * This parameter is useless when using "fast" strategy.
- * Special: value 0 means "use default chainLog". */
- ZSTD_p_searchLog, /* Number of search attempts, as a power of 2.
- * More attempts result in better and slower compression.
- * This parameter is useless when using "fast" and "dFast" strategies.
- * Special: value 0 means "use default searchLog". */
- ZSTD_p_minMatch, /* Minimum size of searched matches (note : repCode matches can be smaller).
- * Larger values make faster compression and decompression, but decrease ratio.
- * Must be clamped between ZSTD_SEARCHLENGTH_MIN and ZSTD_SEARCHLENGTH_MAX.
- * Note that currently, for all strategies < btopt, effective minimum is 4.
- * , for all strategies > fast, effective maximum is 6.
- * Special: value 0 means "use default minMatchLength". */
- ZSTD_p_targetLength, /* Impact of this field depends on strategy.
- * For strategies btopt & btultra:
- * Length of Match considered "good enough" to stop search.
- * Larger values make compression stronger, and slower.
- * For strategy fast:
- * Distance between match sampling.
- * Larger values make compression faster, and weaker.
- * Special: value 0 means "use default targetLength". */
- ZSTD_p_compressionStrategy, /* See ZSTD_strategy enum definition.
- * Cast selected strategy as unsigned for ZSTD_CCtx_setParameter() compatibility.
- * The higher the value of selected strategy, the more complex it is,
- * resulting in stronger and slower compression.
- * Special: value 0 means "use default strategy". */
-
- ZSTD_p_enableLongDistanceMatching=160, /* Enable long distance matching.
- * This parameter is designed to improve compression ratio
- * for large inputs, by finding large matches at long distance.
- * It increases memory usage and window size.
- * Note: enabling this parameter increases ZSTD_p_windowLog to 128 MB
- * except when expressly set to a different value. */
- ZSTD_p_ldmHashLog, /* Size of the table for long distance matching, as a power of 2.
- * Larger values increase memory usage and compression ratio,
- * but decrease compression speed.
- * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX
- * default: windowlog - 7.
- * Special: value 0 means "automatically determine hashlog". */
- ZSTD_p_ldmMinMatch, /* Minimum match size for long distance matcher.
- * Larger/too small values usually decrease compression ratio.
- * Must be clamped between ZSTD_LDM_MINMATCH_MIN and ZSTD_LDM_MINMATCH_MAX.
- * Special: value 0 means "use default value" (default: 64). */
- ZSTD_p_ldmBucketSizeLog, /* Log size of each bucket in the LDM hash table for collision resolution.
- * Larger values improve collision resolution but decrease compression speed.
- * The maximum value is ZSTD_LDM_BUCKETSIZELOG_MAX .
- * Special: value 0 means "use default value" (default: 3). */
- ZSTD_p_ldmHashEveryLog, /* Frequency of inserting/looking up entries in the LDM hash table.
- * Must be clamped between 0 and (ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN).
- * Default is MAX(0, (windowLog - ldmHashLog)), optimizing hash table usage.
- * Larger values improve compression speed.
- * Deviating far from default value will likely result in a compression ratio decrease.
- * Special: value 0 means "automatically determine hashEveryLog". */
-
- /* frame parameters */
- ZSTD_p_contentSizeFlag=200, /* Content size will be written into frame header _whenever known_ (default:1)
- * Content size must be known at the beginning of compression,
- * it is provided using ZSTD_CCtx_setPledgedSrcSize() */
- ZSTD_p_checksumFlag, /* A 32-bits checksum of content is written at end of frame (default:0) */
- ZSTD_p_dictIDFlag, /* When applicable, dictionary's ID is written into frame header (default:1) */
-
- /* multi-threading parameters */
- /* These parameters are only useful if multi-threading is enabled (ZSTD_MULTITHREAD).
- * They return an error otherwise. */
- ZSTD_p_nbWorkers=400, /* Select how many threads will be spawned to compress in parallel.
- * When nbWorkers >= 1, triggers asynchronous mode :
- * ZSTD_compress_generic() consumes some input, flush some output if possible, and immediately gives back control to caller,
- * while compression work is performed in parallel, within worker threads.
- * (note : a strong exception to this rule is when first invocation sets ZSTD_e_end : it becomes a blocking call).
- * More workers improve speed, but also increase memory usage.
- * Default value is `0`, aka "single-threaded mode" : no worker is spawned, compression is performed inside Caller's thread, all invocations are blocking */
- ZSTD_p_jobSize, /* Size of a compression job. This value is enforced only in non-blocking mode.
- * Each compression job is completed in parallel, so this value indirectly controls the nb of active threads.
- * 0 means default, which is dynamically determined based on compression parameters.
- * Job size must be a minimum of overlapSize, or 1 MB, whichever is largest.
- * The minimum size is automatically and transparently enforced */
- ZSTD_p_overlapSizeLog, /* Size of previous input reloaded at the beginning of each job.
- * 0 => no overlap, 6(default) => use 1/8th of windowSize, >=9 => use full windowSize */
-
- /* =================================================================== */
- /* experimental parameters - no stability guaranteed */
- /* =================================================================== */
-
- ZSTD_p_compressLiterals=1000, /* control huffman compression of literals (enabled) by default.
- * disabling it improves speed and decreases compression ratio by a large amount.
- * note : this setting is automatically updated when changing compression level.
- * positive compression levels set ZSTD_p_compressLiterals to 1.
- * negative compression levels set ZSTD_p_compressLiterals to 0. */
-
- ZSTD_p_forceMaxWindow=1100, /* Force back-reference distances to remain < windowSize,
- * even when referencing into Dictionary content (default:0) */
-
-} ZSTD_cParameter;
-
-
-/*! ZSTD_CCtx_setParameter() :
- * Set one compression parameter, selected by enum ZSTD_cParameter.
- * Setting a parameter is generally only possible during frame initialization (before starting compression),
- * except for a few exceptions which can be updated during compression: compressionLevel, hashLog, chainLog, searchLog, minMatch, targetLength and strategy.
- * Note : when `value` is an enum, cast it to unsigned for proper type checking.
- * @result : informational value (typically, value being set clamped correctly),
- * or an error code (which can be tested with ZSTD_isError()). */
-ZSTDLIB_API size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, unsigned value);
-
-/*! ZSTD_CCtx_setPledgedSrcSize() :
- * Total input data size to be compressed as a single frame.
- * This value will be controlled at the end, and result in error if not respected.
- * @result : 0, or an error code (which can be tested with ZSTD_isError()).
- * Note 1 : 0 means zero, empty.
- * In order to mean "unknown content size", pass constant ZSTD_CONTENTSIZE_UNKNOWN.
- * ZSTD_CONTENTSIZE_UNKNOWN is default value for any new compression job.
- * Note 2 : If all data is provided and consumed in a single round,
- * this value is overriden by srcSize instead. */
-ZSTDLIB_API size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize);
-
-/*! ZSTD_CCtx_loadDictionary() :
- * Create an internal CDict from `dict` buffer.
- * Decompression will have to use same dictionary.
- * @result : 0, or an error code (which can be tested with ZSTD_isError()).
- * Special: Adding a NULL (or 0-size) dictionary invalidates previous dictionary,
- * meaning "return to no-dictionary mode".
- * Note 1 : Dictionary will be used for all future compression jobs.
- * To return to "no-dictionary" situation, load a NULL dictionary
- * Note 2 : Loading a dictionary involves building tables, which are dependent on compression parameters.
- * For this reason, compression parameters cannot be changed anymore after loading a dictionary.
- * It's also a CPU consuming operation, with non-negligible impact on latency.
- * Note 3 :`dict` content will be copied internally.
- * Use ZSTD_CCtx_loadDictionary_byReference() to reference dictionary content instead.
- * In such a case, dictionary buffer must outlive its users.
- * Note 4 : Use ZSTD_CCtx_loadDictionary_advanced()
- * to precisely select how dictionary content must be interpreted. */
-ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, size_t dictSize);
-ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary_byReference(ZSTD_CCtx* cctx, const void* dict, size_t dictSize);
-ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType);
-
-
-/*! ZSTD_CCtx_refCDict() :
- * Reference a prepared dictionary, to be used for all next compression jobs.
- * Note that compression parameters are enforced from within CDict,
- * and supercede any compression parameter previously set within CCtx.
- * The dictionary will remain valid for future compression jobs using same CCtx.
- * @result : 0, or an error code (which can be tested with ZSTD_isError()).
- * Special : adding a NULL CDict means "return to no-dictionary mode".
- * Note 1 : Currently, only one dictionary can be managed.
- * Adding a new dictionary effectively "discards" any previous one.
- * Note 2 : CDict is just referenced, its lifetime must outlive CCtx. */
-ZSTDLIB_API size_t ZSTD_CCtx_refCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict);
-
-/*! ZSTD_CCtx_refPrefix() :
- * Reference a prefix (single-usage dictionary) for next compression job.
- * Decompression need same prefix to properly regenerate data.
- * Prefix is **only used once**. Tables are discarded at end of compression job.
- * Subsequent compression jobs will be done without prefix (if none is explicitly referenced).
- * If there is a need to use same prefix multiple times, consider embedding it into a ZSTD_CDict instead.
- * @result : 0, or an error code (which can be tested with ZSTD_isError()).
- * Special: Adding any prefix (including NULL) invalidates any previous prefix or dictionary
- * Note 1 : Prefix buffer is referenced. It must outlive compression job.
- * Note 2 : Referencing a prefix involves building tables, which are dependent on compression parameters.
- * It's a CPU consuming operation, with non-negligible impact on latency.
- * Note 3 : By default, the prefix is treated as raw content (ZSTD_dm_rawContent).
- * Use ZSTD_CCtx_refPrefix_advanced() to alter dictMode. */
-ZSTDLIB_API size_t ZSTD_CCtx_refPrefix(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize);
-ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType);
-
-/*! ZSTD_CCtx_reset() :
- * Return a CCtx to clean state.
- * Useful after an error, or to interrupt an ongoing compression job and start a new one.
- * Any internal data not yet flushed is cancelled.
- * Dictionary (if any) is dropped.
- * All parameters are back to default values.
- * It's possible to modify compression parameters after a reset.
- */
-ZSTDLIB_API void ZSTD_CCtx_reset(ZSTD_CCtx* cctx);
-
-
-
-typedef enum {
- ZSTD_e_continue=0, /* collect more data, encoder decides when to output compressed result, for optimal conditions */
- ZSTD_e_flush, /* flush any data provided so far - frame will continue, future data can still reference previous data for better compression */
- ZSTD_e_end /* flush any remaining data and close current frame. Any additional data starts a new frame. */
-} ZSTD_EndDirective;
-
-/*! ZSTD_compress_generic() :
- * Behave about the same as ZSTD_compressStream. To note :
- * - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_setParameter()
- * - Compression parameters cannot be changed once compression is started.
- * - outpot->pos must be <= dstCapacity, input->pos must be <= srcSize
- * - outpot->pos and input->pos will be updated. They are guaranteed to remain below their respective limit.
- * - In single-thread mode (default), function is blocking : it completed its job before returning to caller.
- * - In multi-thread mode, function is non-blocking : it just acquires a copy of input, and distribute job to internal worker threads,
- * and then immediately returns, just indicating that there is some data remaining to be flushed.
- * The function nonetheless guarantees forward progress : it will return only after it reads or write at least 1+ byte.
- * - Exception : in multi-threading mode, if the first call requests a ZSTD_e_end directive, it is blocking : it will complete compression before giving back control to caller.
- * - @return provides a minimum amount of data remaining to be flushed from internal buffers
- * or an error code, which can be tested using ZSTD_isError().
- * if @return != 0, flush is not fully completed, there is still some data left within internal buffers.
- * This is useful for ZSTD_e_flush, since in this case more flushes are necessary to empty all buffers.
- * For ZSTD_e_end, @return == 0 when internal buffers are fully flushed and frame is completed.
- * - after a ZSTD_e_end directive, if internal buffer is not fully flushed (@return != 0),
- * only ZSTD_e_end or ZSTD_e_flush operations are allowed.
- * Before starting a new compression job, or changing compression parameters,
- * it is required to fully flush internal buffers.
- */
-ZSTDLIB_API size_t ZSTD_compress_generic (ZSTD_CCtx* cctx,
- ZSTD_outBuffer* output,
- ZSTD_inBuffer* input,
- ZSTD_EndDirective endOp);
-
-
-/*! ZSTD_compress_generic_simpleArgs() :
- * Same as ZSTD_compress_generic(),
- * but using only integral types as arguments.
- * Argument list is larger than ZSTD_{in,out}Buffer,
- * but can be helpful for binders from dynamic languages
- * which have troubles handling structures containing memory pointers.
- */
-ZSTDLIB_API size_t ZSTD_compress_generic_simpleArgs (
- ZSTD_CCtx* cctx,
- void* dst, size_t dstCapacity, size_t* dstPos,
- const void* src, size_t srcSize, size_t* srcPos,
- ZSTD_EndDirective endOp);
-
-
-/*! ZSTD_CCtx_params :
- * Quick howto :
- * - ZSTD_createCCtxParams() : Create a ZSTD_CCtx_params structure
- * - ZSTD_CCtxParam_setParameter() : Push parameters one by one into
- * an existing ZSTD_CCtx_params structure.
- * This is similar to
- * ZSTD_CCtx_setParameter().
- * - ZSTD_CCtx_setParametersUsingCCtxParams() : Apply parameters to
- * an existing CCtx.
- * These parameters will be applied to
- * all subsequent compression jobs.
- * - ZSTD_compress_generic() : Do compression using the CCtx.
- * - ZSTD_freeCCtxParams() : Free the memory.
- *
- * This can be used with ZSTD_estimateCCtxSize_advanced_usingCCtxParams()
- * for static allocation for single-threaded compression.
- */
-ZSTDLIB_API ZSTD_CCtx_params* ZSTD_createCCtxParams(void);
-ZSTDLIB_API size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params);
-
-
-/*! ZSTD_CCtxParams_reset() :
- * Reset params to default values.
- */
-ZSTDLIB_API size_t ZSTD_CCtxParams_reset(ZSTD_CCtx_params* params);
-
-/*! ZSTD_CCtxParams_init() :
- * Initializes the compression parameters of cctxParams according to
- * compression level. All other parameters are reset to their default values.
- */
-ZSTDLIB_API size_t ZSTD_CCtxParams_init(ZSTD_CCtx_params* cctxParams, int compressionLevel);
-
-/*! ZSTD_CCtxParams_init_advanced() :
- * Initializes the compression and frame parameters of cctxParams according to
- * params. All other parameters are reset to their default values.
- */
-ZSTDLIB_API size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, ZSTD_parameters params);
-
-
-/*! ZSTD_CCtxParam_setParameter() :
- * Similar to ZSTD_CCtx_setParameter.
- * Set one compression parameter, selected by enum ZSTD_cParameter.
- * Parameters must be applied to a ZSTD_CCtx using ZSTD_CCtx_setParametersUsingCCtxParams().
- * Note : when `value` is an enum, cast it to unsigned for proper type checking.
- * @result : 0, or an error code (which can be tested with ZSTD_isError()).
- */
-ZSTDLIB_API size_t ZSTD_CCtxParam_setParameter(ZSTD_CCtx_params* params, ZSTD_cParameter param, unsigned value);
-
-/*! ZSTD_CCtx_setParametersUsingCCtxParams() :
- * Apply a set of ZSTD_CCtx_params to the compression context.
- * This can be done even after compression is started,
- * if nbWorkers==0, this will have no impact until a new compression is started.
- * if nbWorkers>=1, new parameters will be picked up at next job,
- * with a few restrictions (windowLog, pledgedSrcSize, nbWorkers, jobSize, and overlapLog are not updated).
- */
-ZSTDLIB_API size_t ZSTD_CCtx_setParametersUsingCCtxParams(
- ZSTD_CCtx* cctx, const ZSTD_CCtx_params* params);
-
-
-/*=== Advanced parameters for decompression API ===*/
-
-/* The following parameters must be set after creating a ZSTD_DCtx* (or ZSTD_DStream*) object,
- * but before starting decompression of a frame.
- */
-
-/*! ZSTD_DCtx_loadDictionary() :
- * Create an internal DDict from dict buffer,
- * to be used to decompress next frames.
- * @result : 0, or an error code (which can be tested with ZSTD_isError()).
- * Special : Adding a NULL (or 0-size) dictionary invalidates any previous dictionary,
- * meaning "return to no-dictionary mode".
- * Note 1 : `dict` content will be copied internally.
- * Use ZSTD_DCtx_loadDictionary_byReference()
- * to reference dictionary content instead.
- * In which case, the dictionary buffer must outlive its users.
- * Note 2 : Loading a dictionary involves building tables,
- * which has a non-negligible impact on CPU usage and latency.
- * Note 3 : Use ZSTD_DCtx_loadDictionary_advanced() to select
- * how dictionary content will be interpreted and loaded.
- */
-ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize);
-ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary_byReference(ZSTD_DCtx* dctx, const void* dict, size_t dictSize);
-ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary_advanced(ZSTD_DCtx* dctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType);
-
-
-/*! ZSTD_DCtx_refDDict() :
- * Reference a prepared dictionary, to be used to decompress next frames.
- * The dictionary remains active for decompression of future frames using same DCtx.
- * @result : 0, or an error code (which can be tested with ZSTD_isError()).
- * Note 1 : Currently, only one dictionary can be managed.
- * Referencing a new dictionary effectively "discards" any previous one.
- * Special : adding a NULL DDict means "return to no-dictionary mode".
- * Note 2 : DDict is just referenced, its lifetime must outlive its usage from DCtx.
- */
-ZSTDLIB_API size_t ZSTD_DCtx_refDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict);
-
-
-/*! ZSTD_DCtx_refPrefix() :
- * Reference a prefix (single-usage dictionary) for next compression job.
- * Prefix is **only used once**. It must be explicitly referenced before each frame.
- * If there is a need to use same prefix multiple times, consider embedding it into a ZSTD_DDict instead.
- * @result : 0, or an error code (which can be tested with ZSTD_isError()).
- * Note 1 : Adding any prefix (including NULL) invalidates any previously set prefix or dictionary
- * Note 2 : Prefix buffer is referenced. It must outlive compression job.
- * Note 3 : By default, the prefix is treated as raw content (ZSTD_dm_rawContent).
- * Use ZSTD_CCtx_refPrefix_advanced() to alter dictMode.
- * Note 4 : Referencing a raw content prefix has almost no cpu nor memory cost.
- */
-ZSTDLIB_API size_t ZSTD_DCtx_refPrefix(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize);
-ZSTDLIB_API size_t ZSTD_DCtx_refPrefix_advanced(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType);
-
-
-/*! ZSTD_DCtx_setMaxWindowSize() :
- * Refuses allocating internal buffers for frames requiring a window size larger than provided limit.
- * This is useful to prevent a decoder context from reserving too much memory for itself (potential attack scenario).
- * This parameter is only useful in streaming mode, since no internal buffer is allocated in direct mode.
- * By default, a decompression context accepts all window sizes <= (1 << ZSTD_WINDOWLOG_MAX)
- * @return : 0, or an error code (which can be tested using ZSTD_isError()).
- */
-ZSTDLIB_API size_t ZSTD_DCtx_setMaxWindowSize(ZSTD_DCtx* dctx, size_t maxWindowSize);
-
-
-/*! ZSTD_DCtx_setFormat() :
- * Instruct the decoder context about what kind of data to decode next.
- * This instruction is mandatory to decode data without a fully-formed header,
- * such ZSTD_f_zstd1_magicless for example.
- * @return : 0, or an error code (which can be tested using ZSTD_isError()).
- */
-ZSTDLIB_API size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format);
-
-
-/*! ZSTD_decompress_generic() :
- * Behave the same as ZSTD_decompressStream.
- * Decompression parameters cannot be changed once decompression is started.
- * @return : an error code, which can be tested using ZSTD_isError()
- * if >0, a hint, nb of expected input bytes for next invocation.
- * `0` means : a frame has just been fully decoded and flushed.
- */
-ZSTDLIB_API size_t ZSTD_decompress_generic(ZSTD_DCtx* dctx,
- ZSTD_outBuffer* output,
- ZSTD_inBuffer* input);
-
-
-/*! ZSTD_decompress_generic_simpleArgs() :
- * Same as ZSTD_decompress_generic(),
- * but using only integral types as arguments.
- * Argument list is larger than ZSTD_{in,out}Buffer,
- * but can be helpful for binders from dynamic languages
- * which have troubles handling structures containing memory pointers.
- */
-ZSTDLIB_API size_t ZSTD_decompress_generic_simpleArgs (
- ZSTD_DCtx* dctx,
- void* dst, size_t dstCapacity, size_t* dstPos,
- const void* src, size_t srcSize, size_t* srcPos);
-
-
-/*! ZSTD_DCtx_reset() :
- * Return a DCtx to clean state.
- * If a decompression was ongoing, any internal data not yet flushed is cancelled.
- * All parameters are back to default values, including sticky ones.
- * Dictionary (if any) is dropped.
- * Parameters can be modified again after a reset.
- */
-ZSTDLIB_API void ZSTD_DCtx_reset(ZSTD_DCtx* dctx);
-
-
/* ============================ */
/** Block level API */
@@ -1372,10 +1741,10 @@ ZSTDLIB_API void ZSTD_DCtx_reset(ZSTD_DCtx* dctx);
+ copyCCtx() and copyDCtx() can be used too
- Block size is limited, it must be <= ZSTD_getBlockSize() <= ZSTD_BLOCKSIZE_MAX == 128 KB
+ If input is larger than a block size, it's necessary to split input data into multiple blocks
- + For inputs larger than a single block size, consider using the regular ZSTD_compress() instead.
+ + For inputs larger than a single block, really consider using regular ZSTD_compress() instead.
Frame metadata is not that costly, and quickly becomes negligible as source size grows larger.
- When a block is considered not compressible enough, ZSTD_compressBlock() result will be zero.
- In which case, nothing is produced into `dst`.
+ In which case, nothing is produced into `dst` !
+ User must test for such outcome and deal directly with uncompressed data
+ ZSTD_decompressBlock() doesn't accept uncompressed data as input !!!
+ In case of multiple successive blocks, should some of them be uncompressed,
@@ -1383,8 +1752,6 @@ ZSTDLIB_API void ZSTD_DCtx_reset(ZSTD_DCtx* dctx);
Use ZSTD_insertBlock() for such a case.
*/
-#define ZSTD_BLOCKSIZELOG_MAX 17
-#define ZSTD_BLOCKSIZE_MAX (1<<ZSTD_BLOCKSIZELOG_MAX) /* define, for static allocation */
/*===== Raw zstd block functions =====*/
ZSTDLIB_API size_t ZSTD_getBlockSize (const ZSTD_CCtx* cctx);
ZSTDLIB_API size_t ZSTD_compressBlock (ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
diff --git a/version.py b/version.py
index 558e2da56c..17be155464 100644
--- a/version.py
+++ b/version.py
@@ -2,5 +2,5 @@ short_name = "godot"
name = "Godot Engine"
major = 3
minor = 1
-status = "alpha"
+status = "beta"
module_config = ""